#!/usr/bin/perl

BEGIN {
    $main::fatpacked{"App/IndonesianBankingUtils.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'APP_INDONESIANBANKINGUTILS';
  package App::IndonesianBankingUtils;
  
  use 5.010001;
  
  our $DATE = '2020-03-18'; # DATE
  our $VERSION = '0.144'; # VERSION
  
  1;
  # ABSTRACT: CLIs related to Indonesian banking
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  App::IndonesianBankingUtils - CLIs related to Indonesian banking
  
  =head1 VERSION
  
  This document describes version 0.144 of App::IndonesianBankingUtils (from Perl distribution App-IndonesianBankingUtils), released on 2020-03-18.
  
  =head1
  
  This distribution contains several CLI's related to Indonesian banking:
  
  =over
  
  =item * L<download-bca>
  
  =item * L<download-mandiri>
  
  =item * L<list-bca-branches>
  
  =item * L<list-id-bank-cards>
  
  =item * L<list-id-banks>
  
  =item * L<list-mandiri-branches>
  
  =item * L<parse-bca-account>
  
  =item * L<parse-bca-statement>
  
  =item * L<parse-bprks-statement>
  
  =item * L<parse-mandiri-account>
  
  =item * L<parse-mandiri-statement>
  
  =back
  
  
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/App-IndonesianBankingUtils>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-App-IndonesianBankingUtils>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=App-IndonesianBankingUtils>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Finance::Bank::ID::BCA>
  
  L<Finance::Bank::ID::BPRKS>
  
  L<Finance::Bank::ID::Mandiri>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
APP_INDONESIANBANKINGUTILS

    $main::fatpacked{"B/Hooks/EndOfScope.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'B_HOOKS_ENDOFSCOPE';
  package B::Hooks::EndOfScope; # git description: 0.23-2-ga391106
  # ABSTRACT: Execute code after a scope finished compilation
  # KEYWORDS: code hooks execution scope
  
  use strict;
  use warnings;
  
  our $VERSION = '0.24';
  
  use 5.006001;
  
  BEGIN {
    use Module::Implementation 0.05;
    Module::Implementation::build_loader_sub(
      implementations => [ 'XS', 'PP' ],
      symbols => [ 'on_scope_end' ],
    )->();
  }
  
  use Sub::Exporter::Progressive 0.001006 -setup => {
    exports => [ 'on_scope_end' ],
    groups  => { default => ['on_scope_end'] },
  };
  
  1;
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  B::Hooks::EndOfScope - Execute code after a scope finished compilation
  
  =head1 VERSION
  
  version 0.24
  
  =head1 SYNOPSIS
  
      on_scope_end { ... };
  
  =head1 DESCRIPTION
  
  This module allows you to execute code when perl finished compiling the
  surrounding scope.
  
  =head1 FUNCTIONS
  
  =head2 on_scope_end
  
      on_scope_end { ... };
  
      on_scope_end $code;
  
  Registers C<$code> to be executed after the surrounding scope has been
  compiled.
  
  This is exported by default. See L<Sub::Exporter> on how to customize it.
  
  =head1 LIMITATIONS
  
  =head2 Pure-perl mode caveat
  
  This caveat applies to B<any> version of perl where L<Variable::Magic>
  is unavailable or otherwise disabled.
  
  While L<Variable::Magic> has access to some very dark sorcery to make it
  possible to throw an exception from within a callback, the pure-perl
  implementation does not have access to these hacks. Therefore, what
  would have been a B<compile-time exception> is instead B<converted to a
  warning>, and your execution will continue as if the exception never
  happened.
  
  To explicitly request an XS (or PP) implementation one has two choices. Either
  to import from the desired implementation explicitly:
  
   use B::Hooks::EndOfScope::XS
     or
   use B::Hooks::EndOfScope::PP
  
  or by setting C<$ENV{B_HOOKS_ENDOFSCOPE_IMPLEMENTATION}> to either C<XS> or
  C<PP>.
  
  =head2 Perl 5.8.0 ~ 5.8.3
  
  Due to a L<core interpreter bug
  |https://rt.perl.org/Public/Bug/Display.html?id=27040#txn-82797> present in
  older perl versions, the implementation of B::Hooks::EndOfScope deliberately
  leaks a single empty hash for every scope being cleaned. This is done to
  avoid the memory corruption associated with the bug mentioned above.
  
  In order to stabilize this workaround use of L<Variable::Magic> is disabled
  on perls prior to version 5.8.4. On such systems loading/requesting
  L<B::Hooks::EndOfScope::XS> explicitly will result in a compile-time
  exception.
  
  =head2 Perl versions 5.6.x
  
  Versions of perl before 5.8.0 lack a feature allowing changing the visibility
  of C<%^H> via setting bit 17 within C<$^H>. As such the only way to achieve
  the effect necessary for this module to work, is to use the C<local> operator
  explicitly on these platforms. This might lead to unexpected interference
  with other scope-driven libraries relying on the same mechanism. On the flip
  side there are no such known incompatibilities at the time this note was
  written.
  
  For further details on the unavailable behavior please refer to the test
  file F<t/02-localise.t> included with the distribution.
  
  =head1 SEE ALSO
  
  L<Sub::Exporter>
  
  L<Variable::Magic>
  
  =head1 SUPPORT
  
  Bugs may be submitted through L<the RT bug tracker|https://rt.cpan.org/Public/Dist/Display.html?Name=B-Hooks-EndOfScope>
  (or L<bug-B-Hooks-EndOfScope@rt.cpan.org|mailto:bug-B-Hooks-EndOfScope@rt.cpan.org>).
  
  =head1 AUTHORS
  
  =over 4
  
  =item *
  
  Florian Ragwitz <rafl@debian.org>
  
  =item *
  
  Peter Rabbitson <ribasushi@leporine.io>
  
  =back
  
  =head1 CONTRIBUTORS
  
  =for stopwords Karen Etheridge Tatsuhiko Miyagawa Christian Walde Tomas Doran Graham Knop Simon Wilper
  
  =over 4
  
  =item *
  
  Karen Etheridge <ether@cpan.org>
  
  =item *
  
  Tatsuhiko Miyagawa <miyagawa@bulknews.net>
  
  =item *
  
  Christian Walde <walde.christian@googlemail.com>
  
  =item *
  
  Tomas Doran <bobtfish@bobtfish.net>
  
  =item *
  
  Graham Knop <haarg@haarg.org>
  
  =item *
  
  Simon Wilper <sxw@chronowerks.de>
  
  =back
  
  =head1 COPYRIGHT AND LICENCE
  
  This software is copyright (c) 2008 by Florian Ragwitz.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
B_HOOKS_ENDOFSCOPE

    $main::fatpacked{"B/Hooks/EndOfScope/PP.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'B_HOOKS_ENDOFSCOPE_PP';
  package B::Hooks::EndOfScope::PP;
  # ABSTRACT: Execute code after a scope finished compilation - PP implementation
  
  use warnings;
  use strict;
  
  our $VERSION = '0.24';
  
  use constant _PERL_VERSION => "$]";
  
  BEGIN {
    if (_PERL_VERSION =~ /^5\.009/) {
      # CBA to figure out where %^H got broken and which H::U::HH is sane enough
      die "By design B::Hooks::EndOfScope does not operate in pure-perl mode on perl 5.9.X\n"
    }
    elsif (_PERL_VERSION < '5.010') {
      require B::Hooks::EndOfScope::PP::HintHash;
      *on_scope_end = \&B::Hooks::EndOfScope::PP::HintHash::on_scope_end;
    }
    else {
      require B::Hooks::EndOfScope::PP::FieldHash;
      *on_scope_end = \&B::Hooks::EndOfScope::PP::FieldHash::on_scope_end;
    }
  }
  
  use Sub::Exporter::Progressive 0.001006 -setup => {
    exports => ['on_scope_end'],
    groups  => { default => ['on_scope_end'] },
  };
  
  sub __invoke_callback {
    local $@;
    eval { $_[0]->(); 1 } or do {
      my $err = $@;
      require Carp;
      Carp::cluck( (join ' ',
        'A scope-end callback raised an exception, which can not be propagated when',
        'B::Hooks::EndOfScope operates in pure-perl mode. Your program will CONTINUE',
        'EXECUTION AS IF NOTHING HAPPENED AFTER THIS WARNING. Below is the complete',
        'exception text, followed by a stack-trace of the callback execution:',
      ) . "\n\n$err\n\r" );
  
      sleep 1 if -t *STDERR;  # maybe a bad idea...?
    };
  }
  
  1;
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  B::Hooks::EndOfScope::PP - Execute code after a scope finished compilation - PP implementation
  
  =head1 VERSION
  
  version 0.24
  
  =head1 DESCRIPTION
  
  This is the pure-perl implementation of L<B::Hooks::EndOfScope> based only on
  modules available as part of the perl core. Its leaner sibling
  L<B::Hooks::EndOfScope::XS> will be automatically preferred if all
  dependencies are available and C<$ENV{B_HOOKS_ENDOFSCOPE_IMPLEMENTATION}> is
  not set to C<'PP'>.
  
  =head1 FUNCTIONS
  
  =head2 on_scope_end
  
      on_scope_end { ... };
  
      on_scope_end $code;
  
  Registers C<$code> to be executed after the surrounding scope has been
  compiled.
  
  This is exported by default. See L<Sub::Exporter> on how to customize it.
  
  =head1 SUPPORT
  
  Bugs may be submitted through L<the RT bug tracker|https://rt.cpan.org/Public/Dist/Display.html?Name=B-Hooks-EndOfScope>
  (or L<bug-B-Hooks-EndOfScope@rt.cpan.org|mailto:bug-B-Hooks-EndOfScope@rt.cpan.org>).
  
  =head1 AUTHORS
  
  =over 4
  
  =item *
  
  Florian Ragwitz <rafl@debian.org>
  
  =item *
  
  Peter Rabbitson <ribasushi@leporine.io>
  
  =back
  
  =head1 COPYRIGHT AND LICENCE
  
  This software is copyright (c) 2008 by Florian Ragwitz.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
B_HOOKS_ENDOFSCOPE_PP

    $main::fatpacked{"B/Hooks/EndOfScope/XS.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'B_HOOKS_ENDOFSCOPE_XS';
  package B::Hooks::EndOfScope::XS;
  # ABSTRACT: Execute code after a scope finished compilation - XS implementation
  
  use strict;
  use warnings;
  
  our $VERSION = '0.24';
  
  # Limit the V::M-based (XS) version to perl 5.8.4+
  #
  # Given the unorthodox stuff we do to work around the hinthash double-free
  # might as well play it safe and only implement it in the PP version
  # and leave it at that
  # https://rt.perl.org/Public/Bug/Display.html?id=27040#txn-82797
  #
  use 5.008004;
  
  use Variable::Magic 0.48 ();
  use Sub::Exporter::Progressive 0.001006 -setup => {
    exports => ['on_scope_end'],
    groups  => { default => ['on_scope_end'] },
  };
  
  my $wiz = Variable::Magic::wizard
    data => sub { [$_[1]] },
    free => sub { $_->() for @{ $_[1] }; () },
    # When someone localise %^H, our magic doesn't want to be copied
    # down. We want it to be around only for the scope we've initially
    # attached ourselves to. Merely having MGf_LOCAL and a noop svt_local
    # callback achieves this. If anything wants to attach more magic of our
    # kind to a localised %^H, things will continue to just work as we'll be
    # attached with a new and empty callback list.
    local => \undef
  ;
  
  sub on_scope_end (&) {
    $^H |= 0x020000;
  
    if (my $stack = Variable::Magic::getdata %^H, $wiz) {
      push @{ $stack }, $_[0];
    }
    else {
      Variable::Magic::cast %^H, $wiz, $_[0];
    }
  }
  
  1;
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  B::Hooks::EndOfScope::XS - Execute code after a scope finished compilation - XS implementation
  
  =head1 VERSION
  
  version 0.24
  
  =head1 DESCRIPTION
  
  This is the implementation of L<B::Hooks::EndOfScope> based on
  L<Variable::Magic>, which is an XS module dependent on a compiler. It will
  always be automatically preferred if L<Variable::Magic> is available.
  
  =head1 FUNCTIONS
  
  =head2 on_scope_end
  
      on_scope_end { ... };
  
      on_scope_end $code;
  
  Registers C<$code> to be executed after the surrounding scope has been
  compiled.
  
  This is exported by default. See L<Sub::Exporter> on how to customize it.
  
  =head1 SUPPORT
  
  Bugs may be submitted through L<the RT bug tracker|https://rt.cpan.org/Public/Dist/Display.html?Name=B-Hooks-EndOfScope>
  (or L<bug-B-Hooks-EndOfScope@rt.cpan.org|mailto:bug-B-Hooks-EndOfScope@rt.cpan.org>).
  
  =head1 AUTHORS
  
  =over 4
  
  =item *
  
  Florian Ragwitz <rafl@debian.org>
  
  =item *
  
  Peter Rabbitson <ribasushi@leporine.io>
  
  =back
  
  =head1 COPYRIGHT AND LICENCE
  
  This software is copyright (c) 2008 by Florian Ragwitz.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
B_HOOKS_ENDOFSCOPE_XS

    $main::fatpacked{"Border/Style.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'BORDER_STYLE';
  package Border::Style;
  
  our $DATE = '2014-12-10'; # DATE
  our $VERSION = '0.01'; # VERSION
  
  1;
  # ABSTRACT: Border style structure
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Border::Style - Border style structure
  
  =head1 VERSION
  
  This document describes version 0.01 of Border::Style (from Perl distribution Border-Style), released on 2014-12-10.
  
  =head1 DESCRIPTION
  
  This module specifies a structure for border styles. The distribution also comes
  with utility routines and roles for managing border styles in applications.
  
  =head1 SPECIFICATION
  
  Border style is a L<DefHash> containing these keys: C<v>, C<name>, C<summary>,
  C<utf8> (bool, set to true to indicate that characters are Unicode characters in
  UTF8), C<chars> (array). Format for the characters in C<chars>:
  
   [
     [A, b, C, D],  # 0
     [E, F, G],     # 1
     [H, i, J, K],  # 2
     [L, M, N],     # 3
     [O, p, Q, R],  # 4
     [S, t, U, V],  # 5
   ]
  
   AbbbCbbbD        #0 Top border characters
   E   F   G        #1 Vertical separators for header row
   HiiiJiiiK        #2 Separator between header row and first data row
   L   M   N        #3 Vertical separators for data row
   OpppQpppR        #4 Separator between data rows
   L   M   N        #3
   StttUtttV        #5 Bottom border characters
  
  A character can also be a coderef that will be called with C<< ($self, %args)
  >>. Arguments in C<%args> contains information such as C<name>, C<y>, C<x>, C<n>
  (how many times should character be repeated), etc.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Border-Style>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Border-Style>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Border-Style>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2014 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
BORDER_STYLE

    $main::fatpacked{"Border/Style/Role.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'BORDER_STYLE_ROLE';
  package Border::Style::Role;
  
  our $DATE = '2014-12-10'; # DATE
  our $VERSION = '0.01'; # VERSION
  
  # currently this is still very Text::ANSITable-ish.
  
  use 5.010001;
  use Moo::Role;
  
  with 'Term::App::Role::Attrs';
  
  has border_style_args  => (is => 'rw', default => sub { {} });
  has _all_border_styles => (is => 'rw');
  
  sub get_border_char {
      my ($self, $y, $x, $n, $args) = @_;
      my $bch = $self->{border_style}{chars};
      $n //= 1;
      if (ref($bch) eq 'CODE') {
          $bch->($self, y=>$y, x=>$x, n=>$n, %{$args // {}});
      } else {
          $bch->[$y][$x] x $n;
      }
  }
  
  sub border_style {
      my $self = shift;
  
      if (!@_) { return $self->{border_style} }
      my $bs = shift;
  
      my $p2 = "";
      if (!ref($bs)) {
          $p2 = " named $bs";
          $bs = $self->get_border_style($bs);
      }
  
      my $err;
      if ($bs->{box_chars} && !$self->use_box_chars) {
          $err = "use_box_chars is set to false";
      } elsif ($bs->{utf8} && !$self->use_utf8) {
          $err = "use_utf8 is set to false";
      }
      die "Can't select border style$p2: $err" if $err;
  
      $self->{border_style} = $bs;
  }
  
  sub get_border_style {
      my ($self, $bs) = @_;
  
      my $prefix = (ref($self) ? ref($self) : $self ) .
          '::BorderStyle'; # XXX allow override
  
      my $bss;
      my $pkg;
      if ($bs =~ s/(.+):://) {
          $pkg = "$prefix\::$1";
          my $pkgp = $pkg; $pkgp =~ s!::!/!g;
          require "$pkgp.pm";
          no strict 'refs';
          $bss = \%{"$pkg\::border_styles"};
      } else {
          #$bss = $self->list_border_styles(1);
          die "Please use SubPackage::name to choose border style, ".
              "use list_border_styles() to list available styles";
      }
      $bss->{$bs} or die "Unknown border style name '$bs'".
          ($pkg ? " in package $prefix\::$pkg" : "");
      $bss->{$bs};
  }
  
  sub list_border_styles {
      require Module::List;
      require Module::Load;
  
      my ($self, $detail) = @_;
  
      my $prefix = (ref($self) ? ref($self) : $self ) .
          '::BorderStyle'; # XXX allow override
      my $all_bs = $self->_all_border_styles;
  
      if (!$all_bs) {
          my $mods = Module::List::list_modules("$prefix\::",
                                                {list_modules=>1, recurse=>1});
          no strict 'refs';
          $all_bs = {};
          for my $mod (sort keys %$mods) {
              #$log->tracef("Loading border style module '%s' ...", $mod);
              Module::Load::load($mod);
              my $bs = \%{"$mod\::border_styles"};
              for (keys %$bs) {
                  my $cutmod = $mod;
                  $cutmod =~ s/^\Q$prefix\E:://;
                  my $name = "$cutmod\::$_";
                  $bs->{$_}{name} = $name;
                  $all_bs->{$name} = $bs->{$_};
              }
          }
          $self->_all_border_styles($all_bs);
      }
  
      if ($detail) {
          return $all_bs;
      } else {
          return sort keys %$all_bs;
      }
  }
  
  1;
  # ABSTRACT: Role for class wanting to support border styles
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Border::Style::Role - Role for class wanting to support border styles
  
  =head1 VERSION
  
  This document describes version 0.01 of Border::Style::Role (from Perl distribution Border-Style), released on 2014-12-10.
  
  =head1 DESCRIPTION
  
  =head1 ATTRIBUTES
  
  =head2 border_style => HASH
  
  =head2 border_style_args => HASH
  
  =head1 METHODS
  
  =head2 $cl->list_border_styles($detail) => ARRAY
  
  =head2 $cl->get_border_style($name) => HASH
  
  =head2 $cl->get_border_char($y, $x, $repeat, \%args) => STR
  
  Pick border character from border style (and optionally repeat it C<$repeat>
  times). C<\%args> is a hashref to be supplied to the coderef if the 'chars'
  value from the style is a coderef.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Border-Style>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Border-Style>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Border-Style>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2014 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
BORDER_STYLE_ROLE

    $main::fatpacked{"Capture/Tiny.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'CAPTURE_TINY';
  use 5.006;
  use strict;
  use warnings;
  package Capture::Tiny;
  # ABSTRACT: Capture STDOUT and STDERR from Perl, XS or external programs
  our $VERSION = '0.48';
  use Carp ();
  use Exporter ();
  use IO::Handle ();
  use File::Spec ();
  use File::Temp qw/tempfile tmpnam/;
  use Scalar::Util qw/reftype blessed/;
  # Get PerlIO or fake it
  BEGIN {
    local $@;
    eval { require PerlIO; PerlIO->can('get_layers') }
      or *PerlIO::get_layers = sub { return () };
  }
  
  #--------------------------------------------------------------------------#
  # create API subroutines and export them
  # [do STDOUT flag, do STDERR flag, do merge flag, do tee flag]
  #--------------------------------------------------------------------------#
  
  my %api = (
    capture         => [1,1,0,0],
    capture_stdout  => [1,0,0,0],
    capture_stderr  => [0,1,0,0],
    capture_merged  => [1,1,1,0],
    tee             => [1,1,0,1],
    tee_stdout      => [1,0,0,1],
    tee_stderr      => [0,1,0,1],
    tee_merged      => [1,1,1,1],
  );
  
  for my $sub ( keys %api ) {
    my $args = join q{, }, @{$api{$sub}};
    eval "sub $sub(&;@) {unshift \@_, $args; goto \\&_capture_tee;}"; ## no critic
  }
  
  our @ISA = qw/Exporter/;
  our @EXPORT_OK = keys %api;
  our %EXPORT_TAGS = ( 'all' => \@EXPORT_OK );
  
  #--------------------------------------------------------------------------#
  # constants and fixtures
  #--------------------------------------------------------------------------#
  
  my $IS_WIN32 = $^O eq 'MSWin32';
  
  ##our $DEBUG = $ENV{PERL_CAPTURE_TINY_DEBUG};
  ##
  ##my $DEBUGFH;
  ##open $DEBUGFH, "> DEBUG" if $DEBUG;
  ##
  ##*_debug = $DEBUG ? sub(@) { print {$DEBUGFH} @_ } : sub(){0};
  
  our $TIMEOUT = 30;
  
  #--------------------------------------------------------------------------#
  # command to tee output -- the argument is a filename that must
  # be opened to signal that the process is ready to receive input.
  # This is annoying, but seems to be the best that can be done
  # as a simple, portable IPC technique
  #--------------------------------------------------------------------------#
  my @cmd = ($^X, '-C0', '-e', <<'HERE');
  use Fcntl;
  $SIG{HUP}=sub{exit};
  if ( my $fn=shift ) {
      sysopen(my $fh, qq{$fn}, O_WRONLY|O_CREAT|O_EXCL) or die $!;
      print {$fh} $$;
      close $fh;
  }
  my $buf; while (sysread(STDIN, $buf, 2048)) {
      syswrite(STDOUT, $buf); syswrite(STDERR, $buf);
  }
  HERE
  
  #--------------------------------------------------------------------------#
  # filehandle manipulation
  #--------------------------------------------------------------------------#
  
  sub _relayer {
    my ($fh, $apply_layers) = @_;
    # _debug("# requested layers (@{$layers}) for @{[fileno $fh]}\n");
  
    # eliminate pseudo-layers
    binmode( $fh, ":raw" );
    # strip off real layers until only :unix is left
    while ( 1 < ( my $layers =()= PerlIO::get_layers( $fh, output => 1 ) ) ) {
        binmode( $fh, ":pop" );
    }
    # apply other layers
    my @to_apply = @$apply_layers;
    shift @to_apply; # eliminate initial :unix
    # _debug("# applying layers  (unix @to_apply) to @{[fileno $fh]}\n");
    binmode($fh, ":" . join(":",@to_apply));
  }
  
  sub _name {
    my $glob = shift;
    no strict 'refs'; ## no critic
    return *{$glob}{NAME};
  }
  
  sub _open {
    open $_[0], $_[1] or Carp::confess "Error from open(" . join(q{, }, @_) . "): $!";
    # _debug( "# open " . join( ", " , map { defined $_ ? _name($_) : 'undef' } @_ ) . " as " . fileno( $_[0] ) . "\n" );
  }
  
  sub _close {
    # _debug( "# closing " . ( defined $_[0] ? _name($_[0]) : 'undef' )  . " on " . fileno( $_[0] ) . "\n" );
    close $_[0] or Carp::confess "Error from close(" . join(q{, }, @_) . "): $!";
  }
  
  my %dup; # cache this so STDIN stays fd0
  my %proxy_count;
  sub _proxy_std {
    my %proxies;
    if ( ! defined fileno STDIN ) {
      $proxy_count{stdin}++;
      if (defined $dup{stdin}) {
        _open \*STDIN, "<&=" . fileno($dup{stdin});
        # _debug( "# restored proxy STDIN as " . (defined fileno STDIN ? fileno STDIN : 'undef' ) . "\n" );
      }
      else {
        _open \*STDIN, "<" . File::Spec->devnull;
        # _debug( "# proxied STDIN as " . (defined fileno STDIN ? fileno STDIN : 'undef' ) . "\n" );
        _open $dup{stdin} = IO::Handle->new, "<&=STDIN";
      }
      $proxies{stdin} = \*STDIN;
      binmode(STDIN, ':utf8') if $] >= 5.008; ## no critic
    }
    if ( ! defined fileno STDOUT ) {
      $proxy_count{stdout}++;
      if (defined $dup{stdout}) {
        _open \*STDOUT, ">&=" . fileno($dup{stdout});
        # _debug( "# restored proxy STDOUT as " . (defined fileno STDOUT ? fileno STDOUT : 'undef' ) . "\n" );
      }
      else {
        _open \*STDOUT, ">" . File::Spec->devnull;
         # _debug( "# proxied STDOUT as " . (defined fileno STDOUT ? fileno STDOUT : 'undef' ) . "\n" );
        _open $dup{stdout} = IO::Handle->new, ">&=STDOUT";
      }
      $proxies{stdout} = \*STDOUT;
      binmode(STDOUT, ':utf8') if $] >= 5.008; ## no critic
    }
    if ( ! defined fileno STDERR ) {
      $proxy_count{stderr}++;
      if (defined $dup{stderr}) {
        _open \*STDERR, ">&=" . fileno($dup{stderr});
         # _debug( "# restored proxy STDERR as " . (defined fileno STDERR ? fileno STDERR : 'undef' ) . "\n" );
      }
      else {
        _open \*STDERR, ">" . File::Spec->devnull;
         # _debug( "# proxied STDERR as " . (defined fileno STDERR ? fileno STDERR : 'undef' ) . "\n" );
        _open $dup{stderr} = IO::Handle->new, ">&=STDERR";
      }
      $proxies{stderr} = \*STDERR;
      binmode(STDERR, ':utf8') if $] >= 5.008; ## no critic
    }
    return %proxies;
  }
  
  sub _unproxy {
    my (%proxies) = @_;
    # _debug( "# unproxying: " . join(" ", keys %proxies) . "\n" );
    for my $p ( keys %proxies ) {
      $proxy_count{$p}--;
      # _debug( "# unproxied " . uc($p) . " ($proxy_count{$p} left)\n" );
      if ( ! $proxy_count{$p} ) {
        _close $proxies{$p};
        _close $dup{$p} unless $] < 5.008; # 5.6 will have already closed this as dup
        delete $dup{$p};
      }
    }
  }
  
  sub _copy_std {
    my %handles;
    for my $h ( qw/stdout stderr stdin/ ) {
      next if $h eq 'stdin' && ! $IS_WIN32; # WIN32 hangs on tee without STDIN copied
      my $redir = $h eq 'stdin' ? "<&" : ">&";
      _open $handles{$h} = IO::Handle->new(), $redir . uc($h); # ">&STDOUT" or "<&STDIN"
    }
    return \%handles;
  }
  
  # In some cases we open all (prior to forking) and in others we only open
  # the output handles (setting up redirection)
  sub _open_std {
    my ($handles) = @_;
    _open \*STDIN, "<&" . fileno $handles->{stdin} if defined $handles->{stdin};
    _open \*STDOUT, ">&" . fileno $handles->{stdout} if defined $handles->{stdout};
    _open \*STDERR, ">&" . fileno $handles->{stderr} if defined $handles->{stderr};
  }
  
  #--------------------------------------------------------------------------#
  # private subs
  #--------------------------------------------------------------------------#
  
  sub _start_tee {
    my ($which, $stash) = @_; # $which is "stdout" or "stderr"
    # setup pipes
    $stash->{$_}{$which} = IO::Handle->new for qw/tee reader/;
    pipe $stash->{reader}{$which}, $stash->{tee}{$which};
    # _debug( "# pipe for $which\: " .  _name($stash->{tee}{$which}) . " " . fileno( $stash->{tee}{$which} ) . " => " . _name($stash->{reader}{$which}) . " " . fileno( $stash->{reader}{$which}) . "\n" );
    select((select($stash->{tee}{$which}), $|=1)[0]); # autoflush
    # setup desired redirection for parent and child
    $stash->{new}{$which} = $stash->{tee}{$which};
    $stash->{child}{$which} = {
      stdin   => $stash->{reader}{$which},
      stdout  => $stash->{old}{$which},
      stderr  => $stash->{capture}{$which},
    };
    # flag file is used to signal the child is ready
    $stash->{flag_files}{$which} = scalar( tmpnam() ) . $$;
    # execute @cmd as a separate process
    if ( $IS_WIN32 ) {
      my $old_eval_err=$@;
      undef $@;
  
      eval "use Win32API::File qw/GetOsFHandle SetHandleInformation fileLastError HANDLE_FLAG_INHERIT INVALID_HANDLE_VALUE/ ";
      # _debug( "# Win32API::File loaded\n") unless $@;
      my $os_fhandle = GetOsFHandle( $stash->{tee}{$which} );
      # _debug( "# Couldn't get OS handle: " . fileLastError() . "\n") if ! defined $os_fhandle || $os_fhandle == INVALID_HANDLE_VALUE();
      my $result = SetHandleInformation( $os_fhandle, HANDLE_FLAG_INHERIT(), 0);
      # _debug( $result ? "# set no-inherit flag on $which tee\n" : ("# can't disable tee handle flag inherit: " . fileLastError() . "\n"));
      _open_std( $stash->{child}{$which} );
      $stash->{pid}{$which} = system(1, @cmd, $stash->{flag_files}{$which});
      # not restoring std here as it all gets redirected again shortly anyway
      $@=$old_eval_err;
    }
    else { # use fork
      _fork_exec( $which, $stash );
    }
  }
  
  sub _fork_exec {
    my ($which, $stash) = @_; # $which is "stdout" or "stderr"
    my $pid = fork;
    if ( not defined $pid ) {
      Carp::confess "Couldn't fork(): $!";
    }
    elsif ($pid == 0) { # child
      # _debug( "# in child process ...\n" );
      untie *STDIN; untie *STDOUT; untie *STDERR;
      _close $stash->{tee}{$which};
      # _debug( "# redirecting handles in child ...\n" );
      _open_std( $stash->{child}{$which} );
      # _debug( "# calling exec on command ...\n" );
      exec @cmd, $stash->{flag_files}{$which};
    }
    $stash->{pid}{$which} = $pid
  }
  
  my $have_usleep = eval "use Time::HiRes 'usleep'; 1";
  sub _files_exist {
    return 1 if @_ == grep { -f } @_;
    Time::HiRes::usleep(1000) if $have_usleep;
    return 0;
  }
  
  sub _wait_for_tees {
    my ($stash) = @_;
    my $start = time;
    my @files = values %{$stash->{flag_files}};
    my $timeout = defined $ENV{PERL_CAPTURE_TINY_TIMEOUT}
                ? $ENV{PERL_CAPTURE_TINY_TIMEOUT} : $TIMEOUT;
    1 until _files_exist(@files) || ($timeout && (time - $start > $timeout));
    Carp::confess "Timed out waiting for subprocesses to start" if ! _files_exist(@files);
    unlink $_ for @files;
  }
  
  sub _kill_tees {
    my ($stash) = @_;
    if ( $IS_WIN32 ) {
      # _debug( "# closing handles\n");
      close($_) for values %{ $stash->{tee} };
      # _debug( "# waiting for subprocesses to finish\n");
      my $start = time;
      1 until wait == -1 || (time - $start > 30);
    }
    else {
      _close $_ for values %{ $stash->{tee} };
      waitpid $_, 0 for values %{ $stash->{pid} };
    }
  }
  
  sub _slurp {
    my ($name, $stash) = @_;
    my ($fh, $pos) = map { $stash->{$_}{$name} } qw/capture pos/;
    # _debug( "# slurping captured $name from " . fileno($fh) . " at pos $pos with layers: @{[PerlIO::get_layers($fh)]}\n");
    seek( $fh, $pos, 0 ) or die "Couldn't seek on capture handle for $name\n";
    my $text = do { local $/; scalar readline $fh };
    return defined($text) ? $text : "";
  }
  
  #--------------------------------------------------------------------------#
  # _capture_tee() -- generic main sub for capturing or teeing
  #--------------------------------------------------------------------------#
  
  sub _capture_tee {
    # _debug( "# starting _capture_tee with (@_)...\n" );
    my ($do_stdout, $do_stderr, $do_merge, $do_tee, $code, @opts) = @_;
    my %do = ($do_stdout ? (stdout => 1) : (),  $do_stderr ? (stderr => 1) : ());
    Carp::confess("Custom capture options must be given as key/value pairs\n")
      unless @opts % 2 == 0;
    my $stash = { capture => { @opts } };
    for ( keys %{$stash->{capture}} ) {
      my $fh = $stash->{capture}{$_};
      Carp::confess "Custom handle for $_ must be seekable\n"
        unless ref($fh) eq 'GLOB' || (blessed($fh) && $fh->isa("IO::Seekable"));
    }
    # save existing filehandles and setup captures
    local *CT_ORIG_STDIN  = *STDIN ;
    local *CT_ORIG_STDOUT = *STDOUT;
    local *CT_ORIG_STDERR = *STDERR;
    # find initial layers
    my %layers = (
      stdin   => [PerlIO::get_layers(\*STDIN) ],
      stdout  => [PerlIO::get_layers(\*STDOUT, output => 1)],
      stderr  => [PerlIO::get_layers(\*STDERR, output => 1)],
    );
    # _debug( "# existing layers for $_\: @{$layers{$_}}\n" ) for qw/stdin stdout stderr/;
    # get layers from underlying glob of tied filehandles if we can
    # (this only works for things that work like Tie::StdHandle)
    $layers{stdout} = [PerlIO::get_layers(tied *STDOUT)]
      if tied(*STDOUT) && (reftype tied *STDOUT eq 'GLOB');
    $layers{stderr} = [PerlIO::get_layers(tied *STDERR)]
      if tied(*STDERR) && (reftype tied *STDERR eq 'GLOB');
    # _debug( "# tied object corrected layers for $_\: @{$layers{$_}}\n" ) for qw/stdin stdout stderr/;
    # bypass scalar filehandles and tied handles
    # localize scalar STDIN to get a proxy to pick up FD0, then restore later to CT_ORIG_STDIN
    my %localize;
    $localize{stdin}++,  local(*STDIN)
      if grep { $_ eq 'scalar' } @{$layers{stdin}};
    $localize{stdout}++, local(*STDOUT)
      if $do_stdout && grep { $_ eq 'scalar' } @{$layers{stdout}};
    $localize{stderr}++, local(*STDERR)
      if ($do_stderr || $do_merge) && grep { $_ eq 'scalar' } @{$layers{stderr}};
    $localize{stdin}++, local(*STDIN), _open( \*STDIN, "<&=0")
      if tied *STDIN && $] >= 5.008;
    $localize{stdout}++, local(*STDOUT), _open( \*STDOUT, ">&=1")
      if $do_stdout && tied *STDOUT && $] >= 5.008;
    $localize{stderr}++, local(*STDERR), _open( \*STDERR, ">&=2")
      if ($do_stderr || $do_merge) && tied *STDERR && $] >= 5.008;
    # _debug( "# localized $_\n" ) for keys %localize;
    # proxy any closed/localized handles so we don't use fds 0, 1 or 2
    my %proxy_std = _proxy_std();
    # _debug( "# proxy std: @{ [%proxy_std] }\n" );
    # update layers after any proxying
    $layers{stdout} = [PerlIO::get_layers(\*STDOUT, output => 1)] if $proxy_std{stdout};
    $layers{stderr} = [PerlIO::get_layers(\*STDERR, output => 1)] if $proxy_std{stderr};
    # _debug( "# post-proxy layers for $_\: @{$layers{$_}}\n" ) for qw/stdin stdout stderr/;
    # store old handles and setup handles for capture
    $stash->{old} = _copy_std();
    $stash->{new} = { %{$stash->{old}} }; # default to originals
    for ( keys %do ) {
      $stash->{new}{$_} = ($stash->{capture}{$_} ||= File::Temp->new);
      seek( $stash->{capture}{$_}, 0, 2 ) or die "Could not seek on capture handle for $_\n";
      $stash->{pos}{$_} = tell $stash->{capture}{$_};
      # _debug("# will capture $_ on " . fileno($stash->{capture}{$_})."\n" );
      _start_tee( $_ => $stash ) if $do_tee; # tees may change $stash->{new}
    }
    _wait_for_tees( $stash ) if $do_tee;
    # finalize redirection
    $stash->{new}{stderr} = $stash->{new}{stdout} if $do_merge;
    # _debug( "# redirecting in parent ...\n" );
    _open_std( $stash->{new} );
    # execute user provided code
    my ($exit_code, $inner_error, $outer_error, $orig_pid, @result);
    {
      $orig_pid = $$;
      local *STDIN = *CT_ORIG_STDIN if $localize{stdin}; # get original, not proxy STDIN
      # _debug( "# finalizing layers ...\n" );
      _relayer(\*STDOUT, $layers{stdout}) if $do_stdout;
      _relayer(\*STDERR, $layers{stderr}) if $do_stderr;
      # _debug( "# running code $code ...\n" );
      my $old_eval_err=$@;
      undef $@;
      eval { @result = $code->(); $inner_error = $@ };
      $exit_code = $?; # save this for later
      $outer_error = $@; # save this for later
      STDOUT->flush if $do_stdout;
      STDERR->flush if $do_stderr;
      $@ = $old_eval_err;
    }
    # restore prior filehandles and shut down tees
    # _debug( "# restoring filehandles ...\n" );
    _open_std( $stash->{old} );
    _close( $_ ) for values %{$stash->{old}}; # don't leak fds
    # shouldn't need relayering originals, but see rt.perl.org #114404
    _relayer(\*STDOUT, $layers{stdout}) if $do_stdout;
    _relayer(\*STDERR, $layers{stderr}) if $do_stderr;
    _unproxy( %proxy_std );
    # _debug( "# killing tee subprocesses ...\n" ) if $do_tee;
    _kill_tees( $stash ) if $do_tee;
    # return captured output, but shortcut in void context
    # unless we have to echo output to tied/scalar handles;
    my %got;
    if ( $orig_pid == $$ and ( defined wantarray or ($do_tee && keys %localize) ) ) {
      for ( keys %do ) {
        _relayer($stash->{capture}{$_}, $layers{$_});
        $got{$_} = _slurp($_, $stash);
        # _debug("# slurped " . length($got{$_}) . " bytes from $_\n");
      }
      print CT_ORIG_STDOUT $got{stdout}
        if $do_stdout && $do_tee && $localize{stdout};
      print CT_ORIG_STDERR $got{stderr}
        if $do_stderr && $do_tee && $localize{stderr};
    }
    $? = $exit_code;
    $@ = $inner_error if $inner_error;
    die $outer_error if $outer_error;
    # _debug( "# ending _capture_tee with (@_)...\n" );
    return unless defined wantarray;
    my @return;
    push @return, $got{stdout} if $do_stdout;
    push @return, $got{stderr} if $do_stderr && ! $do_merge;
    push @return, @result;
    return wantarray ? @return : $return[0];
  }
  
  1;
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Capture::Tiny - Capture STDOUT and STDERR from Perl, XS or external programs
  
  =head1 VERSION
  
  version 0.48
  
  =head1 SYNOPSIS
  
    use Capture::Tiny ':all';
  
    # capture from external command
  
    ($stdout, $stderr, $exit) = capture {
      system( $cmd, @args );
    };
  
    # capture from arbitrary code (Perl or external)
  
    ($stdout, $stderr, @result) = capture {
      # your code here
    };
  
    # capture partial or merged output
  
    $stdout = capture_stdout { ... };
    $stderr = capture_stderr { ... };
    $merged = capture_merged { ... };
  
    # tee output
  
    ($stdout, $stderr) = tee {
      # your code here
    };
  
    $stdout = tee_stdout { ... };
    $stderr = tee_stderr { ... };
    $merged = tee_merged { ... };
  
  =head1 DESCRIPTION
  
  Capture::Tiny provides a simple, portable way to capture almost anything sent
  to STDOUT or STDERR, regardless of whether it comes from Perl, from XS code or
  from an external program.  Optionally, output can be teed so that it is
  captured while being passed through to the original filehandles.  Yes, it even
  works on Windows (usually).  Stop guessing which of a dozen capturing modules
  to use in any particular situation and just use this one.
  
  =head1 USAGE
  
  The following functions are available.  None are exported by default.
  
  =head2 capture
  
    ($stdout, $stderr, @result) = capture \&code;
    $stdout = capture \&code;
  
  The C<capture> function takes a code reference and returns what is sent to
  STDOUT and STDERR as well as any return values from the code reference.  In
  scalar context, it returns only STDOUT.  If no output was received for a
  filehandle, it returns an empty string for that filehandle.  Regardless of calling
  context, all output is captured -- nothing is passed to the existing filehandles.
  
  It is prototyped to take a subroutine reference as an argument. Thus, it
  can be called in block form:
  
    ($stdout, $stderr) = capture {
      # your code here ...
    };
  
  Note that the coderef is evaluated in list context.  If you wish to force
  scalar context on the return value, you must use the C<scalar> keyword.
  
    ($stdout, $stderr, $count) = capture {
      my @list = qw/one two three/;
      return scalar @list; # $count will be 3
    };
  
  Also note that within the coderef, the C<@_> variable will be empty.  So don't
  use arguments from a surrounding subroutine without copying them to an array
  first:
  
    sub wont_work {
      my ($stdout, $stderr) = capture { do_stuff( @_ ) };    # WRONG
      ...
    }
  
    sub will_work {
      my @args = @_;
      my ($stdout, $stderr) = capture { do_stuff( @args ) }; # RIGHT
      ...
    }
  
  Captures are normally done to an anonymous temporary filehandle.  To
  capture via a named file (e.g. to externally monitor a long-running capture),
  provide custom filehandles as a trailing list of option pairs:
  
    my $out_fh = IO::File->new("out.txt", "w+");
    my $err_fh = IO::File->new("out.txt", "w+");
    capture { ... } stdout => $out_fh, stderr => $err_fh;
  
  The filehandles must be read/write and seekable.  Modifying the files or
  filehandles during a capture operation will give unpredictable results.
  Existing IO layers on them may be changed by the capture.
  
  When called in void context, C<capture> saves memory and time by
  not reading back from the capture handles.
  
  =head2 capture_stdout
  
    ($stdout, @result) = capture_stdout \&code;
    $stdout = capture_stdout \&code;
  
  The C<capture_stdout> function works just like C<capture> except only
  STDOUT is captured.  STDERR is not captured.
  
  =head2 capture_stderr
  
    ($stderr, @result) = capture_stderr \&code;
    $stderr = capture_stderr \&code;
  
  The C<capture_stderr> function works just like C<capture> except only
  STDERR is captured.  STDOUT is not captured.
  
  =head2 capture_merged
  
    ($merged, @result) = capture_merged \&code;
    $merged = capture_merged \&code;
  
  The C<capture_merged> function works just like C<capture> except STDOUT and
  STDERR are merged. (Technically, STDERR is redirected to the same capturing
  handle as STDOUT before executing the function.)
  
  Caution: STDOUT and STDERR output in the merged result are not guaranteed to be
  properly ordered due to buffering.
  
  =head2 tee
  
    ($stdout, $stderr, @result) = tee \&code;
    $stdout = tee \&code;
  
  The C<tee> function works just like C<capture>, except that output is captured
  as well as passed on to the original STDOUT and STDERR.
  
  When called in void context, C<tee> saves memory and time by
  not reading back from the capture handles, except when the
  original STDOUT OR STDERR were tied or opened to a scalar
  handle.
  
  =head2 tee_stdout
  
    ($stdout, @result) = tee_stdout \&code;
    $stdout = tee_stdout \&code;
  
  The C<tee_stdout> function works just like C<tee> except only
  STDOUT is teed.  STDERR is not teed (output goes to STDERR as usual).
  
  =head2 tee_stderr
  
    ($stderr, @result) = tee_stderr \&code;
    $stderr = tee_stderr \&code;
  
  The C<tee_stderr> function works just like C<tee> except only
  STDERR is teed.  STDOUT is not teed (output goes to STDOUT as usual).
  
  =head2 tee_merged
  
    ($merged, @result) = tee_merged \&code;
    $merged = tee_merged \&code;
  
  The C<tee_merged> function works just like C<capture_merged> except that output
  is captured as well as passed on to STDOUT.
  
  Caution: STDOUT and STDERR output in the merged result are not guaranteed to be
  properly ordered due to buffering.
  
  =head1 LIMITATIONS
  
  =head2 Portability
  
  Portability is a goal, not a guarantee.  C<tee> requires fork, except on
  Windows where C<system(1, @cmd)> is used instead.  Not tested on any
  particularly esoteric platforms yet.  See the
  L<CPAN Testers Matrix|http://matrix.cpantesters.org/?dist=Capture-Tiny>
  for test result by platform.
  
  =head2 PerlIO layers
  
  Capture::Tiny does its best to preserve PerlIO layers such as ':utf8' or
  ':crlf' when capturing (only for Perl 5.8.1+) .  Layers should be applied to
  STDOUT or STDERR I<before> the call to C<capture> or C<tee>.  This may not work
  for tied filehandles (see below).
  
  =head2 Modifying filehandles before capturing
  
  Generally speaking, you should do little or no manipulation of the standard IO
  filehandles prior to using Capture::Tiny.  In particular, closing, reopening,
  localizing or tying standard filehandles prior to capture may cause a variety of
  unexpected, undesirable and/or unreliable behaviors, as described below.
  Capture::Tiny does its best to compensate for these situations, but the
  results may not be what you desire.
  
  =head3 Closed filehandles
  
  Capture::Tiny will work even if STDIN, STDOUT or STDERR have been previously
  closed.  However, since they will be reopened to capture or tee output, any
  code within the captured block that depends on finding them closed will, of
  course, not find them to be closed.  If they started closed, Capture::Tiny will
  close them again when the capture block finishes.
  
  Note that this reopening will happen even for STDIN or a filehandle not being
  captured to ensure that the filehandle used for capture is not opened to file
  descriptor 0, as this causes problems on various platforms.
  
  Prior to Perl 5.12, closed STDIN combined with PERL_UNICODE=D leaks filehandles
  and also breaks tee() for undiagnosed reasons.  So don't do that.
  
  =head3 Localized filehandles
  
  If code localizes any of Perl's standard filehandles before capturing, the capture
  will affect the localized filehandles and not the original ones.  External system
  calls are not affected by localizing a filehandle in Perl and will continue
  to send output to the original filehandles (which will thus not be captured).
  
  =head3 Scalar filehandles
  
  If STDOUT or STDERR are reopened to scalar filehandles prior to the call to
  C<capture> or C<tee>, then Capture::Tiny will override the output filehandle for
  the duration of the C<capture> or C<tee> call and then, for C<tee>, send captured
  output to the output filehandle after the capture is complete.  (Requires Perl
  5.8)
  
  Capture::Tiny attempts to preserve the semantics of STDIN opened to a scalar
  reference, but note that external processes will not be able to read from such
  a handle.  Capture::Tiny tries to ensure that external processes will read from
  the null device instead, but this is not guaranteed.
  
  =head3 Tied output filehandles
  
  If STDOUT or STDERR are tied prior to the call to C<capture> or C<tee>, then
  Capture::Tiny will attempt to override the tie for the duration of the
  C<capture> or C<tee> call and then send captured output to the tied filehandle after
  the capture is complete.  (Requires Perl 5.8)
  
  Capture::Tiny may not succeed resending UTF-8 encoded data to a tied
  STDOUT or STDERR filehandle.  Characters may appear as bytes.  If the tied filehandle
  is based on L<Tie::StdHandle>, then Capture::Tiny will attempt to determine
  appropriate layers like C<:utf8> from the underlying filehandle and do the right
  thing.
  
  =head3 Tied input filehandle
  
  Capture::Tiny attempts to preserve the semantics of tied STDIN, but this
  requires Perl 5.8 and is not entirely predictable.  External processes
  will not be able to read from such a handle.
  
  Unless having STDIN tied is crucial, it may be safest to localize STDIN when
  capturing:
  
    my ($out, $err) = do { local *STDIN; capture { ... } };
  
  =head2 Modifying filehandles during a capture
  
  Attempting to modify STDIN, STDOUT or STDERR I<during> C<capture> or C<tee> is
  almost certainly going to cause problems.  Don't do that.
  
  =head3 Forking inside a capture
  
  Forks aren't portable.  The behavior of filehandles during a fork is even
  less so.  If Capture::Tiny detects that a fork has occurred within a
  capture, it will shortcut in the child process and return empty strings for
  captures.  Other problems may occur in the child or parent, as well.
  Forking in a capture block is not recommended.
  
  =head3 Using threads
  
  Filehandles are global.  Mixing up I/O and captures in different threads
  without coordination is going to cause problems.  Besides, threads are
  officially discouraged.
  
  =head3 Dropping privileges during a capture
  
  If you drop privileges during a capture, temporary files created to
  facilitate the capture may not be cleaned up afterwards.
  
  =head2 No support for Perl 5.8.0
  
  It's just too buggy when it comes to layers and UTF-8.  Perl 5.8.1 or later
  is recommended.
  
  =head2 Limited support for Perl 5.6
  
  Perl 5.6 predates PerlIO.  UTF-8 data may not be captured correctly.
  
  =head1 ENVIRONMENT
  
  =head2 PERL_CAPTURE_TINY_TIMEOUT
  
  Capture::Tiny uses subprocesses internally for C<tee>.  By default,
  Capture::Tiny will timeout with an error if such subprocesses are not ready to
  receive data within 30 seconds (or whatever is the value of
  C<$Capture::Tiny::TIMEOUT>).  An alternate timeout may be specified by setting
  the C<PERL_CAPTURE_TINY_TIMEOUT> environment variable.  Setting it to zero will
  disable timeouts.  B<NOTE>, this does not timeout the code reference being
  captured -- this only prevents Capture::Tiny itself from hanging your process
  waiting for its child processes to be ready to proceed.
  
  =head1 SEE ALSO
  
  This module was inspired by L<IO::CaptureOutput>, which provides
  similar functionality without the ability to tee output and with more
  complicated code and API.  L<IO::CaptureOutput> does not handle layers
  or most of the unusual cases described in the L</Limitations> section and
  I no longer recommend it.
  
  There are many other CPAN modules that provide some sort of output capture,
  albeit with various limitations that make them appropriate only in particular
  circumstances.  I'm probably missing some.  The long list is provided to show
  why I felt Capture::Tiny was necessary.
  
  =over 4
  
  =item *
  
  L<IO::Capture>
  
  =item *
  
  L<IO::Capture::Extended>
  
  =item *
  
  L<IO::CaptureOutput>
  
  =item *
  
  L<IPC::Capture>
  
  =item *
  
  L<IPC::Cmd>
  
  =item *
  
  L<IPC::Open2>
  
  =item *
  
  L<IPC::Open3>
  
  =item *
  
  L<IPC::Open3::Simple>
  
  =item *
  
  L<IPC::Open3::Utils>
  
  =item *
  
  L<IPC::Run>
  
  =item *
  
  L<IPC::Run::SafeHandles>
  
  =item *
  
  L<IPC::Run::Simple>
  
  =item *
  
  L<IPC::Run3>
  
  =item *
  
  L<IPC::System::Simple>
  
  =item *
  
  L<Tee>
  
  =item *
  
  L<IO::Tee>
  
  =item *
  
  L<File::Tee>
  
  =item *
  
  L<Filter::Handle>
  
  =item *
  
  L<Tie::STDERR>
  
  =item *
  
  L<Tie::STDOUT>
  
  =item *
  
  L<Test::Output>
  
  =back
  
  =for :stopwords cpan testmatrix url annocpan anno bugtracker rt cpants kwalitee diff irc mailto metadata placeholders metacpan
  
  =head1 SUPPORT
  
  =head2 Bugs / Feature Requests
  
  Please report any bugs or feature requests through the issue tracker
  at L<https://github.com/dagolden/Capture-Tiny/issues>.
  You will be notified automatically of any progress on your issue.
  
  =head2 Source Code
  
  This is open source software.  The code repository is available for
  public review and contribution under the terms of the license.
  
  L<https://github.com/dagolden/Capture-Tiny>
  
    git clone https://github.com/dagolden/Capture-Tiny.git
  
  =head1 AUTHOR
  
  David Golden <dagolden@cpan.org>
  
  =head1 CONTRIBUTORS
  
  =for stopwords Dagfinn Ilmari Mannsåker David E. Wheeler fecundf Graham Knop Peter Rabbitson
  
  =over 4
  
  =item *
  
  Dagfinn Ilmari Mannsåker <ilmari@ilmari.org>
  
  =item *
  
  David E. Wheeler <david@justatheory.com>
  
  =item *
  
  fecundf <not.com+github@gmail.com>
  
  =item *
  
  Graham Knop <haarg@haarg.org>
  
  =item *
  
  Peter Rabbitson <ribasushi@cpan.org>
  
  =back
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is Copyright (c) 2009 by David Golden.
  
  This is free software, licensed under:
  
    The Apache License, Version 2.0, January 2004
  
  =cut
CAPTURE_TINY

    $main::fatpacked{"Class/Data/Inheritable.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'CLASS_DATA_INHERITABLE';
  package Class::Data::Inheritable;
  
  use strict qw(vars subs);
  use vars qw($VERSION);
  $VERSION = '0.08';
  
  sub mk_classdata {
      my ($declaredclass, $attribute, $data) = @_;
  
      if( ref $declaredclass ) {
          require Carp;
          Carp::croak("mk_classdata() is a class method, not an object method");
      }
  
      my $accessor = sub {
          my $wantclass = ref($_[0]) || $_[0];
  
          return $wantclass->mk_classdata($attribute)->(@_)
            if @_>1 && $wantclass ne $declaredclass;
  
          $data = $_[1] if @_>1;
          return $data;
      };
  
      my $alias = "_${attribute}_accessor";
      *{$declaredclass.'::'.$attribute} = $accessor;
      *{$declaredclass.'::'.$alias}     = $accessor;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Class::Data::Inheritable - Inheritable, overridable class data
  
  =head1 SYNOPSIS
  
    package Stuff;
    use base qw(Class::Data::Inheritable);
  
    # Set up DataFile as inheritable class data.
    Stuff->mk_classdata('DataFile');
  
    # Declare the location of the data file for this class.
    Stuff->DataFile('/etc/stuff/data');
  
    # Or, all in one shot:
    Stuff->mk_classdata(DataFile => '/etc/stuff/data');
  
  =head1 DESCRIPTION
  
  Class::Data::Inheritable is for creating accessor/mutators to class
  data.  That is, if you want to store something about your class as a
  whole (instead of about a single object).  This data is then inherited
  by your subclasses and can be overriden.
  
  For example:
  
    Pere::Ubu->mk_classdata('Suitcase');
  
  will generate the method Suitcase() in the class Pere::Ubu.
  
  This new method can be used to get and set a piece of class data.
  
    Pere::Ubu->Suitcase('Red');
    $suitcase = Pere::Ubu->Suitcase;
  
  The interesting part happens when a class inherits from Pere::Ubu:
  
    package Raygun;
    use base qw(Pere::Ubu);
    
    # Raygun's suitcase is Red.
    $suitcase = Raygun->Suitcase;
  
  Raygun inherits its Suitcase class data from Pere::Ubu.
  
  Inheritance of class data works analogous to method inheritance.  As
  long as Raygun does not "override" its inherited class data (by using
  Suitcase() to set a new value) it will continue to use whatever is set
  in Pere::Ubu and inherit further changes:
  
    # Both Raygun's and Pere::Ubu's suitcases are now Blue
    Pere::Ubu->Suitcase('Blue');
  
  However, should Raygun decide to set its own Suitcase() it has now
  "overridden" Pere::Ubu and is on its own, just like if it had
  overriden a method:
  
    # Raygun has an orange suitcase, Pere::Ubu's is still Blue.
    Raygun->Suitcase('Orange');
  
  Now that Raygun has overridden Pere::Ubu futher changes by Pere::Ubu
  no longer effect Raygun.
  
    # Raygun still has an orange suitcase, but Pere::Ubu is using Samsonite.
    Pere::Ubu->Suitcase('Samsonite');
  
  =head1 Methods
  
  =head2 mk_classdata
  
    Class->mk_classdata($data_accessor_name);
    Class->mk_classdata($data_accessor_name => $value);
  
  This is a class method used to declare new class data accessors.
  A new accessor will be created in the Class using the name from
  $data_accessor_name, and optionally initially setting it to the given
  value.
  
  To facilitate overriding, mk_classdata creates an alias to the
  accessor, _field_accessor().  So Suitcase() would have an alias
  _Suitcase_accessor() that does the exact same thing as Suitcase().
  This is useful if you want to alter the behavior of a single accessor
  yet still get the benefits of inheritable class data.  For example.
  
    sub Suitcase {
        my($self) = shift;
        warn "Fashion tragedy" if @_ and $_[0] eq 'Plaid';
  
        $self->_Suitcase_accessor(@_);
    }
  
  =head1 AUTHOR
  
  Original code by Damian Conway.
  
  Maintained by Michael G Schwern until September 2005.
  
  Now maintained by Tony Bowden.
  
  =head1 BUGS and QUERIES
  
  Please direct all correspondence regarding this module to:
    bug-Class-Data-Inheritable@rt.cpan.org
  
  =head1 COPYRIGHT and LICENSE
  
  Copyright (c) 2000-2005, Damian Conway and Michael G Schwern. 
  All Rights Reserved.  
  
  This module is free software. It may be used, redistributed and/or
  modified under the same terms as Perl itself.
  
  =head1 SEE ALSO
  
  L<perltooc> has a very elaborate discussion of class data in Perl.
  
CLASS_DATA_INHERITABLE

    $main::fatpacked{"Class/Inspector.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'CLASS_INSPECTOR';
  package Class::Inspector;
  
  use 5.006;
  # We don't want to use strict refs anywhere in this module, since we do a
  # lot of things in here that aren't strict refs friendly.
  use strict qw{vars subs};
  use warnings;
  use File::Spec ();
  
  # ABSTRACT: Get information about a class and its structure
  our $VERSION = '1.36'; # VERSION
  
  
  # If Unicode is available, enable it so that the
  # pattern matches below match unicode method names.
  # We can safely ignore any failure here.
  BEGIN {
    local $@;
    eval {
      require utf8;
      utf8->import;
    };
  }
  
  # Predefine some regexs
  our $RE_IDENTIFIER = qr/\A[^\W\d]\w*\z/s;
  our $RE_CLASS      = qr/\A[^\W\d]\w*(?:(?:\'|::)\w+)*\z/s;
  
  # Are we on something Unix-like?
  our $UNIX  = !! ( $File::Spec::ISA[0] eq 'File::Spec::Unix'  );
  
  
  #####################################################################
  # Basic Methods
  
  
  sub _resolved_inc_handler {
    my $class    = shift;
    my $filename = $class->_inc_filename(shift) or return undef;
  
    foreach my $inc ( @INC ) {
      my $ref = ref $inc;
      if($ref eq 'CODE') {
        my @ret = $inc->($inc, $filename);
        if(@ret == 1 && ! defined $ret[0]) {
          # do nothing.
        } elsif(@ret) {
          return 1;
        }
      }
      elsif($ref eq 'ARRAY' && ref($inc->[0]) eq 'CODE') {
        my @ret = $inc->[0]->($inc, $filename);
        if(@ret) {
          return 1;
        }
      }
      elsif($ref && eval { $inc->can('INC') }) {
        my @ret = $inc->INC($filename);
        if(@ret) {
          return 1;
        }
      }
    }
  
    '';
  }
  
  sub installed {
    my $class = shift;
    !! ($class->loaded_filename($_[0]) or $class->resolved_filename($_[0]) or $class->_resolved_inc_handler($_[0]));
  }
  
  
  sub loaded {
    my $class = shift;
    my $name  = $class->_class(shift) or return undef;
    $class->_loaded($name);
  }
  
  sub _loaded {
    my $class = shift;
    my $name  = shift;
  
    # Handle by far the two most common cases
    # This is very fast and handles 99% of cases.
    return 1 if defined ${"${name}::VERSION"};
    return 1 if @{"${name}::ISA"};
  
    # Are there any symbol table entries other than other namespaces
    foreach ( keys %{"${name}::"} ) {
      next if substr($_, -2, 2) eq '::';
      return 1 if defined &{"${name}::$_"};
    }
  
    # No functions, and it doesn't have a version, and isn't anything.
    # As an absolute last resort, check for an entry in %INC
    my $filename = $class->_inc_filename($name);
    return 1 if defined $INC{$filename};
  
    '';
  }
  
  
  sub filename {
    my $class = shift;
    my $name  = $class->_class(shift) or return undef;
    File::Spec->catfile( split /(?:\'|::)/, $name ) . '.pm';
  }
  
  
  sub resolved_filename {
    my $class     = shift;
    my $filename  = $class->_inc_filename(shift) or return undef;
    my @try_first = @_;
  
    # Look through the @INC path to find the file
    foreach ( @try_first, @INC ) {
      my $full = "$_/$filename";
      next unless -e $full;
      return $UNIX ? $full : $class->_inc_to_local($full);
    }
  
    # File not found
    '';
  }
  
  
  sub loaded_filename {
    my $class    = shift;
    my $filename = $class->_inc_filename(shift);
    $UNIX ? $INC{$filename} : $class->_inc_to_local($INC{$filename});
  }
  
  
  
  
  
  #####################################################################
  # Sub Related Methods
  
  
  sub functions {
    my $class = shift;
    my $name  = $class->_class(shift) or return undef;
    return undef unless $class->loaded( $name );
  
    # Get all the CODE symbol table entries
    my @functions = sort grep { /$RE_IDENTIFIER/o }
      grep { defined &{"${name}::$_"} }
      keys %{"${name}::"};
    \@functions;
  }
  
  
  sub function_refs {
    my $class = shift;
    my $name  = $class->_class(shift) or return undef;
    return undef unless $class->loaded( $name );
  
    # Get all the CODE symbol table entries, but return
    # the actual CODE refs this time.
    my @functions = map { \&{"${name}::$_"} }
      sort grep { /$RE_IDENTIFIER/o }
      grep { defined &{"${name}::$_"} }
      keys %{"${name}::"};
    \@functions;
  }
  
  
  sub function_exists {
    my $class    = shift;
    my $name     = $class->_class( shift ) or return undef;
    my $function = shift or return undef;
  
    # Only works if the class is loaded
    return undef unless $class->loaded( $name );
  
    # Does the GLOB exist and its CODE part exist
    defined &{"${name}::$function"};
  }
  
  
  sub methods {
    my $class     = shift;
    my $name      = $class->_class( shift ) or return undef;
    my @arguments = map { lc $_ } @_;
  
    # Process the arguments to determine the options
    my %options = ();
    foreach ( @arguments ) {
      if ( $_ eq 'public' ) {
        # Only get public methods
        return undef if $options{private};
        $options{public} = 1;
  
      } elsif ( $_ eq 'private' ) {
        # Only get private methods
        return undef if $options{public};
        $options{private} = 1;
  
      } elsif ( $_ eq 'full' ) {
        # Return the full method name
        return undef if $options{expanded};
        $options{full} = 1;
  
      } elsif ( $_ eq 'expanded' ) {
        # Returns class, method and function ref
        return undef if $options{full};
        $options{expanded} = 1;
  
      } else {
        # Unknown or unsupported options
        return undef;
      }
    }
  
    # Only works if the class is loaded
    return undef unless $class->loaded( $name );
  
    # Get the super path ( not including UNIVERSAL )
    # Rather than using Class::ISA, we'll use an inlined version
    # that implements the same basic algorithm.
    my @path  = ();
    my @queue = ( $name );
    my %seen  = ( $name => 1 );
    while ( my $cl = shift @queue ) {
      push @path, $cl;
      unshift @queue, grep { ! $seen{$_}++ }
        map { s/^::/main::/; s/\'/::/g; $_ } ##  no critic
        map { "$_" }
        ( @{"${cl}::ISA"} );
    }
  
    # Find and merge the function names across the entire super path.
    # Sort alphabetically and return.
    my %methods = ();
    foreach my $namespace ( @path ) {
      my @functions = grep { ! $methods{$_} }
        grep { /$RE_IDENTIFIER/o }
        grep { defined &{"${namespace}::$_"} }
        keys %{"${namespace}::"};
      foreach ( @functions ) {
        $methods{$_} = $namespace;
      }
    }
  
    # Filter to public or private methods if needed
    my @methodlist = sort keys %methods;
    @methodlist = grep { ! /^\_/ } @methodlist if $options{public};
    @methodlist = grep {   /^\_/ } @methodlist if $options{private};
  
    # Return in the correct format
    @methodlist = map { "$methods{$_}::$_" } @methodlist if $options{full};
    @methodlist = map {
      [ "$methods{$_}::$_", $methods{$_}, $_, \&{"$methods{$_}::$_"} ]
      } @methodlist if $options{expanded};
  
    \@methodlist;
  }
  
  
  
  
  
  #####################################################################
  # Search Methods
  
  
  sub subclasses {
    my $class = shift;
    my $name  = $class->_class( shift ) or return undef;
  
    # Prepare the search queue
    my @found = ();
    my @queue = grep { $_ ne 'main' } $class->_subnames('');
    while ( @queue ) {
      my $c = shift(@queue); # c for class
      if ( $class->_loaded($c) ) {
        # At least one person has managed to misengineer
        # a situation in which ->isa could die, even if the
        # class is real. Trap these cases and just skip
        # over that (bizarre) class. That would at limit
        # problems with finding subclasses to only the
        # modules that have broken ->isa implementation.
        local $@;
        eval {
          if ( $c->isa($name) ) {
            # Add to the found list, but don't add the class itself
            push @found, $c unless $c eq $name;
          }
        };
      }
  
      # Add any child namespaces to the head of the queue.
      # This keeps the queue length shorted, and allows us
      # not to have to do another sort at the end.
      unshift @queue, map { "${c}::$_" } $class->_subnames($c);
    }
  
    @found ? \@found : '';
  }
  
  sub _subnames {
    my ($class, $name) = @_;
    return sort
      grep {  ## no critic
        substr($_, -2, 2, '') eq '::'
        and
        /$RE_IDENTIFIER/o
      }
      keys %{"${name}::"};
  }
  
  
  
  
  
  #####################################################################
  # Children Related Methods
  
  # These can go undocumented for now, until I decide if its best to
  # just search the children in namespace only, or if I should do it via
  # the file system.
  
  # Find all the loaded classes below us
  sub children {
    my $class = shift;
    my $name  = $class->_class(shift) or return ();
  
    # Find all the Foo:: elements in our symbol table
    no strict 'refs';
    map { "${name}::$_" } sort grep { s/::$// } keys %{"${name}::"};  ## no critic
  }
  
  # As above, but recursively
  sub recursive_children {
    my $class    = shift;
    my $name     = $class->_class(shift) or return ();
    my @children = ( $name );
  
    # Do the search using a nicer, more memory efficient
    # variant of actual recursion.
    my $i = 0;
    no strict 'refs';
    while ( my $namespace = $children[$i++] ) {
      push @children, map { "${namespace}::$_" }
        grep { ! /^::/ } # Ignore things like ::ISA::CACHE::
        grep { s/::$// }  ## no critic
        keys %{"${namespace}::"};
    }
  
    sort @children;
  }
  
  
  
  
  
  #####################################################################
  # Private Methods
  
  # Checks and expands ( if needed ) a class name
  sub _class {
    my $class = shift;
    my $name  = shift or return '';
  
    # Handle main shorthand
    return 'main' if $name eq '::';
    $name =~ s/\A::/main::/;
  
    # Check the class name is valid
    $name =~ /$RE_CLASS/o ? $name : '';
  }
  
  # Create a INC-specific filename, which always uses '/'
  # regardless of platform.
  sub _inc_filename {
    my $class = shift;
    my $name  = $class->_class(shift) or return undef;
    join( '/', split /(?:\'|::)/, $name ) . '.pm';
  }
  
  # Convert INC-specific file name to local file name
  sub _inc_to_local {
    # Shortcut in the Unix case
    return $_[1] if $UNIX;
  
    # On other places, we have to deal with an unusual path that might look
    # like C:/foo/bar.pm which doesn't fit ANY normal pattern.
    # Putting it through splitpath/dir and back again seems to normalise
    # it to a reasonable amount.
    my $class              = shift;
    my $inc_name           = shift or return undef;
    my ($vol, $dir, $file) = File::Spec->splitpath( $inc_name );
    $dir = File::Spec->catdir( File::Spec->splitdir( $dir || "" ) );
    File::Spec->catpath( $vol, $dir, $file || "" );
  }
  
  1;
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Class::Inspector - Get information about a class and its structure
  
  =head1 VERSION
  
  version 1.36
  
  =head1 SYNOPSIS
  
    use Class::Inspector;
    
    # Is a class installed and/or loaded
    Class::Inspector->installed( 'Foo::Class' );
    Class::Inspector->loaded( 'Foo::Class' );
    
    # Filename related information
    Class::Inspector->filename( 'Foo::Class' );
    Class::Inspector->resolved_filename( 'Foo::Class' );
    
    # Get subroutine related information
    Class::Inspector->functions( 'Foo::Class' );
    Class::Inspector->function_refs( 'Foo::Class' );
    Class::Inspector->function_exists( 'Foo::Class', 'bar' );
    Class::Inspector->methods( 'Foo::Class', 'full', 'public' );
    
    # Find all loaded subclasses or something
    Class::Inspector->subclasses( 'Foo::Class' );
  
  =head1 DESCRIPTION
  
  Class::Inspector allows you to get information about a loaded class. Most or
  all of this information can be found in other ways, but they aren't always
  very friendly, and usually involve a relatively high level of Perl wizardry,
  or strange and unusual looking code. Class::Inspector attempts to provide
  an easier, more friendly interface to this information.
  
  =head1 METHODS
  
  =head2 installed
  
   my $bool = Class::Inspector->installed($class);
  
  The C<installed> static method tries to determine if a class is installed
  on the machine, or at least available to Perl. It does this by wrapping
  around C<resolved_filename>.
  
  Returns true if installed/available, false if the class is not installed,
  or C<undef> if the class name is invalid.
  
  =head2 loaded
  
   my $bool = Class::Inspector->loaded($class);
  
  The C<loaded> static method tries to determine if a class is loaded by
  looking for symbol table entries.
  
  This method it uses to determine this will work even if the class does not
  have its own file, but is contained inside a single file with multiple
  classes in it. Even in the case of some sort of run-time loading class
  being used, these typically leave some trace in the symbol table, so an
  L<Autoload> or L<Class::Autouse>-based class should correctly appear
  loaded.
  
  Returns true if the class is loaded, false if not, or C<undef> if the
  class name is invalid.
  
  =head2 filename
  
   my $filename = Class::Inspector->filename($class);
  
  For a given class, returns the base filename for the class. This will NOT
  be a fully resolved filename, just the part of the filename BELOW the
  C<@INC> entry.
  
    print Class->filename( 'Foo::Bar' );
    > Foo/Bar.pm
  
  This filename will be returned with the right separator for the local
  platform, and should work on all platforms.
  
  Returns the filename on success or C<undef> if the class name is invalid.
  
  =head2 resolved_filename
  
   my $filename = Class::Inspector->resolved_filename($class);
   my $filename = Class::Inspector->resolved_filename($class, @try_first);
  
  For a given class, the C<resolved_filename> static method returns the fully
  resolved filename for a class. That is, the file that the class would be
  loaded from.
  
  This is not necessarily the file that the class WAS loaded from, as the
  value returned is determined each time it runs, and the C<@INC> include
  path may change.
  
  To get the actual file for a loaded class, see the C<loaded_filename>
  method.
  
  Returns the filename for the class, or C<undef> if the class name is
  invalid.
  
  =head2 loaded_filename
  
   my $filename = Class::Inspector->loaded_filename($class);
  
  For a given loaded class, the C<loaded_filename> static method determines
  (via the C<%INC> hash) the name of the file that it was originally loaded
  from.
  
  Returns a resolved file path, or false if the class did not have it's own
  file.
  
  =head2 functions
  
   my $arrayref = Class::Inspector->functions($class);
  
  For a loaded class, the C<functions> static method returns a list of the
  names of all the functions in the classes immediate namespace.
  
  Note that this is not the METHODS of the class, just the functions.
  
  Returns a reference to an array of the function names on success, or C<undef>
  if the class name is invalid or the class is not loaded.
  
  =head2 function_refs
  
   my $arrayref = Class::Inspector->function_refs($class);
  
  For a loaded class, the C<function_refs> static method returns references to
  all the functions in the classes immediate namespace.
  
  Note that this is not the METHODS of the class, just the functions.
  
  Returns a reference to an array of C<CODE> refs of the functions on
  success, or C<undef> if the class is not loaded.
  
  =head2 function_exists
  
   my $bool = Class::Inspector->function_exists($class, $functon);
  
  Given a class and function name the C<function_exists> static method will
  check to see if the function exists in the class.
  
  Note that this is as a function, not as a method. To see if a method
  exists for a class, use the C<can> method for any class or object.
  
  Returns true if the function exists, false if not, or C<undef> if the
  class or function name are invalid, or the class is not loaded.
  
  =head2 methods
  
   my $arrayref = Class::Inspector->methods($class, @options);
  
  For a given class name, the C<methods> static method will returns ALL
  the methods available to that class. This includes all methods available
  from every class up the class' C<@ISA> tree.
  
  Returns a reference to an array of the names of all the available methods
  on success, or C<undef> if the class name is invalid or the class is not
  loaded.
  
  A number of options are available to the C<methods> method that will alter
  the results returned. These should be listed after the class name, in any
  order.
  
    # Only get public methods
    my $method = Class::Inspector->methods( 'My::Class', 'public' );
  
  =over 4
  
  =item public
  
  The C<public> option will return only 'public' methods, as defined by the Perl
  convention of prepending an underscore to any 'private' methods. The C<public>
  option will effectively remove any methods that start with an underscore.
  
  =item private
  
  The C<private> options will return only 'private' methods, as defined by the
  Perl convention of prepending an underscore to an private methods. The
  C<private> option will effectively remove an method that do not start with an
  underscore.
  
  B<Note: The C<public> and C<private> options are mutually exclusive>
  
  =item full
  
  C<methods> normally returns just the method name. Supplying the C<full> option
  will cause the methods to be returned as the full names. That is, instead of
  returning C<[ 'method1', 'method2', 'method3' ]>, you would instead get
  C<[ 'Class::method1', 'AnotherClass::method2', 'Class::method3' ]>.
  
  =item expanded
  
  The C<expanded> option will cause a lot more information about method to be
  returned. Instead of just the method name, you will instead get an array
  reference containing the method name as a single combined name, a la C<full>,
  the separate class and method, and a CODE ref to the actual function ( if
  available ). Please note that the function reference is not guaranteed to
  be available. C<Class::Inspector> is intended at some later time, to work
  with modules that have some kind of common run-time loader in place ( e.g
  C<Autoloader> or C<Class::Autouse> for example.
  
  The response from C<methods( 'Class', 'expanded' )> would look something like
  the following.
  
    [
      [ 'Class::method1',   'Class',   'method1', \&Class::method1   ],
      [ 'Another::method2', 'Another', 'method2', \&Another::method2 ],
      [ 'Foo::bar',         'Foo',     'bar',     \&Foo::bar         ],
    ]
  
  =back
  
  =head2 subclasses
  
   my $arrayref = Class::Inspector->subclasses($class);
  
  The C<subclasses> static method will search then entire namespace (and thus
  B<all> currently loaded classes) to find all classes that are subclasses
  of the class provided as a the parameter.
  
  The actual test will be done by calling C<isa> on the class as a static
  method. (i.e. C<My::Class-E<gt>isa($class)>.
  
  Returns a reference to a list of the loaded classes that match the class
  provided, or false is none match, or C<undef> if the class name provided
  is invalid.
  
  =head1 SEE ALSO
  
  L<http://ali.as/>, L<Class::Handle>, L<Class::Inspector::Functions>
  
  =head1 AUTHOR
  
  Original author: Adam Kennedy E<lt>adamk@cpan.orgE<gt>
  
  Current maintainer: Graham Ollis E<lt>plicease@cpan.orgE<gt>
  
  Contributors:
  
  Tom Wyant
  
  Steffen Müller
  
  Kivanc Yazan (KYZN)
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2002-2019 by Adam Kennedy.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
CLASS_INSPECTOR

    $main::fatpacked{"Class/Inspector/Functions.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'CLASS_INSPECTOR_FUNCTIONS';
  package Class::Inspector::Functions;
  
  use 5.006;
  use strict;
  use warnings;
  use Exporter         ();
  use Class::Inspector ();
  use base qw( Exporter );
  
  # ABSTRACT: Get information about a class and its structure
  our $VERSION = '1.36'; # VERSION
  
  BEGIN {
  
    our @EXPORT = qw(
      installed
      loaded
  
      filename
      functions
      methods
  
      subclasses
    );
  
    our @EXPORT_OK = qw(
      resolved_filename
      loaded_filename
  
      function_refs
      function_exists
    );
      #children
      #recursive_children
  
    our %EXPORT_TAGS = ( ALL => [ @EXPORT_OK, @EXPORT ] );
  
    foreach my $meth (@EXPORT, @EXPORT_OK) {
        my $sub = Class::Inspector->can($meth);
        no strict 'refs';
        *{$meth} = sub {&$sub('Class::Inspector', @_)};
    }
  
  }
  
  1;
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Class::Inspector::Functions - Get information about a class and its structure
  
  =head1 VERSION
  
  version 1.36
  
  =head1 SYNOPSIS
  
    use Class::Inspector::Functions;
    # Class::Inspector provides a non-polluting,
    # method based interface!
    
    # Is a class installed and/or loaded
    installed( 'Foo::Class' );
    loaded( 'Foo::Class' );
    
    # Filename related information
    filename( 'Foo::Class' );
    resolved_filename( 'Foo::Class' );
    
    # Get subroutine related information
    functions( 'Foo::Class' );
    function_refs( 'Foo::Class' );
    function_exists( 'Foo::Class', 'bar' );
    methods( 'Foo::Class', 'full', 'public' );
    
    # Find all loaded subclasses or something
    subclasses( 'Foo::Class' );
  
  =head1 DESCRIPTION
  
  Class::Inspector::Functions is a function based interface of
  L<Class::Inspector>. For a thorough documentation of the available
  functions, please check the manual for the main module.
  
  =head2 Exports
  
  The following functions are exported by default.
  
    installed
    loaded
    filename
    functions
    methods
    subclasses
  
  The following functions are exported only by request.
  
    resolved_filename
    loaded_filename
    function_refs
    function_exists
  
  All the functions may be imported using the C<:ALL> tag.
  
  =head1 SEE ALSO
  
  L<http://ali.as/>, L<Class::Handle>, L<Class::Inspector>
  
  =head1 AUTHOR
  
  Original author: Adam Kennedy E<lt>adamk@cpan.orgE<gt>
  
  Current maintainer: Graham Ollis E<lt>plicease@cpan.orgE<gt>
  
  Contributors:
  
  Tom Wyant
  
  Steffen Müller
  
  Kivanc Yazan (KYZN)
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2002-2019 by Adam Kennedy.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
CLASS_INSPECTOR_FUNCTIONS

    $main::fatpacked{"Class/Singleton.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'CLASS_SINGLETON';
  #============================================================================
  #
  # Class::Singleton.pm
  #
  # Implementation of a "singleton" module which ensures that a class has
  # only one instance and provides global access to it.  For a description 
  # of the Singleton class, see "Design Patterns", Gamma et al, Addison-
  # Wesley, 1995, ISBN 0-201-63361-2
  #
  # Written by Andy Wardley <abw@wardley.org>
  #
  # Copyright (C) 1998-2008 Andy Wardley.  All Rights Reserved.
  # Copyright (C) 1998 Canon Research Centre Europe Ltd.
  #
  #============================================================================
  
  package Class::Singleton;
  require 5.004;
  use strict;
  use warnings;
  
  our $VERSION = 1.5;
  my %_INSTANCES = ();
  
  
  #========================================================================
  #
  # instance()
  #
  # Module constructor.  Creates an Class::Singleton (or derived) instance 
  # if one doesn't already exist.  The instance reference is stored in the
  # %_INSTANCES hash of the Class::Singleton package.  The impact of this is
  # that you can create any number of classes derived from Class::Singleton
  # and create a single instance of each one.  If the instance reference
  # was stored in a scalar $_INSTANCE variable, you could only instantiate 
  # *ONE* object of *ANY* class derived from Class::Singleton.  The first
  # time the instance is created, the _new_instance() constructor is called 
  # which simply returns a reference to a blessed hash.  This can be 
  # overloaded for custom constructors.  Any addtional parameters passed to 
  # instance() are forwarded to _new_instance().
  #
  # Returns a reference to the existing, or a newly created Class::Singleton
  # object.  If the _new_instance() method returns an undefined value
  # then the constructer is deemed to have failed.
  #
  #========================================================================
  
  sub instance {
      my $class = shift;
      
      # already got an object
      return $class if ref $class;
  
      # we store the instance against the $class key of %_INSTANCES
      my $instance = $_INSTANCES{$class};
      unless(defined $instance) {
          $_INSTANCES{$class} = $instance = $class->_new_instance(@_);
      }
      return $instance;
  }
  
  
  #=======================================================================
  # has_instance()
  #
  # Public method to return the current instance if it exists.
  #=======================================================================
  
  sub has_instance {
      my $class = shift;
      $class = ref $class || $class;
      return $_INSTANCES{$class};
  }
  
  
  #========================================================================
  # _new_instance(...)
  #
  # Simple constructor which returns a hash reference blessed into the 
  # current class.  May be overloaded to create non-hash objects or 
  # handle any specific initialisation required.
  #========================================================================
  
  sub _new_instance {
      my $class = shift;
      my %args  = @_ && ref $_[0] eq 'HASH' ? %{ $_[0] } : @_;
      bless { %args }, $class;
  }
  
  
  #========================================================================
  # END()
  #
  # END block to explicitly destroy all Class::Singleton objects since
  # destruction order at program exit is not predictable. See CPAN RT
  # bugs #23568 and #68526 for examples of what can go wrong without this.
  #========================================================================
  
  END {
      # dereferences and causes orderly destruction of all instances
      undef(%_INSTANCES);
  }
  
  
  1;
  
  __END__
  
  =head1 NAME
  
  Class::Singleton - Implementation of a "Singleton" class 
  
  =head1 SYNOPSIS
  
      use Class::Singleton;
      
      my $one = Class::Singleton->instance();   # returns a new instance
      my $two = Class::Singleton->instance();   # returns same instance
  
  =head1 DESCRIPTION
  
  This is the C<Class::Singleton> module.  A Singleton describes an object class
  that can have only one instance in any system.  An example of a Singleton
  might be a print spooler or system registry.  This module implements a
  Singleton class from which other classes can be derived.  By itself, the
  C<Class::Singleton> module does very little other than manage the instantiation
  of a single object.  In deriving a class from C<Class::Singleton>, your module 
  will inherit the Singleton instantiation method and can implement whatever
  specific functionality is required.
  
  For a description and discussion of the Singleton class, see 
  "Design Patterns", Gamma et al, Addison-Wesley, 1995, ISBN 0-201-63361-2.
  
  =head1 PREREQUISITES
  
  C<Class::Singleton> requires Perl version 5.004 or later. If you have an older
  version of Perl, please upgrade to latest version, available from your nearest
  CPAN site (see L<INSTALLATION> below).
  
  =head1 INSTALLATION
  
  The C<Class::Singleton> module is available from CPAN. As the 'perlmod' man
  page explains:
  
      CPAN stands for the Comprehensive Perl Archive Network.
      This is a globally replicated collection of all known Perl
      materials, including hundreds of unbunded modules.
      
      [...]
      
      For an up-to-date listing of CPAN sites, see
      http://www.perl.com/perl/ or ftp://ftp.perl.com/perl/ .
  
  The module is available in the following directories:
  
      /modules/by-module/Class/Class-Singleton-<version>.tar.gz
      /authors/id/ABW/Class-Singleton-<version>.tar.gz
  
  C<Class::Singleton> is distributed as a single gzipped tar archive file:
  
      Class-Singleton-<version>.tar.gz
  
  Note that "<version>" represents the current version number, of the 
  form "C<1.23>".  See L<VERSION> below to determine the current version 
  number for C<Class::Singleton>.
  
  Unpack the archive to create an installation directory:
  
      gunzip Class-Singleton-<version>.tar.gz
      tar xvf Class-Singleton-<version>.tar
  
  'cd' into that directory, make, test and install the module:
  
      cd Class-Singleton-<version>
      perl Makefile.PL
      make
      make test
      make install
  
  The 'C<make install>' will install the module on your system.  You may need 
  root access to perform this task.  If you install the module in a local 
  directory (for example, by executing "C<perl Makefile.PL LIB=~/lib>" in the 
  above - see C<perldoc MakeMaker> for full details), you will need to ensure 
  that the C<PERL5LIB> environment variable is set to include the location, or 
  add a line to your scripts explicitly naming the library location:
  
      use lib '/local/path/to/lib';
  
  =head1 USING THE CLASS::SINGLETON MODULE
  
  To import and use the C<Class::Singleton> module the following line should 
  appear in your Perl program:
  
      use Class::Singleton;
  
  The L<instance()> method is used to create a new C<Class::Singleton> instance,
  or return a reference to an existing instance. Using this method, it is only
  possible to have a single instance of the class in any system.
  
      my $highlander = Class::Singleton->instance();
  
  Assuming that no C<Class::Singleton> object currently exists, this first call
  to L<instance()> will create a new C<Class::Singleton> and return a reference
  to it. Future invocations of L<instance()> will return the same reference.
  
      my $macleod    = Class::Singleton->instance();
  
  In the above example, both C<$highlander> and C<$macleod> contain the same
  reference to a C<Class::Singleton> instance.  There can be only one.
  
  =head1 DERIVING SINGLETON CLASSES
  
  A module class may be derived from C<Class::Singleton> and will inherit the 
  L<instance()> method that correctly instantiates only one object.
  
      package PrintSpooler;
      use base 'Class::Singleton';
      
      # derived class specific code
      sub submit_job {
          ...
      }
      
      sub cancel_job {
          ...
      }
  
  The C<PrintSpooler> class defined above could be used as follows:
  
      use PrintSpooler;
      
      my $spooler = PrintSpooler->instance();
      
      $spooler->submit_job(...);
  
  The L<instance()> method calls the L<_new_instance()> constructor method the
  first and only time a new instance is created. All parameters passed to the
  L<instance()> method are forwarded to L<_new_instance()>. In the base class
  the L<_new_instance()> method returns a blessed reference to a hash array
  containing any arguments passed as either a hash reference or list of named 
  parameters. 
  
      package MyConfig;
      use base 'Class::Singleton';
      
      sub foo {
          shift->{ foo };
      }
      
      sub bar {
          shift->{ bar };
      }
      
      package main;
      
      # either: hash reference of named parameters
      my $config = MyConfig->instance({ foo => 10, bar => 20 });
      
      # or: list of named parameters
      my $config = MyConfig->instance( foo => 10, bar => 20 );
      
      print $config->foo();   # 10
      print $config->bar();   # 20
  
  Derived classes may redefine the L<_new_instance()> method to provide more
  specific object initialisation or change the underlying object type (to a list
  reference, for example).
  
      package MyApp::Database;
      use base 'Class::Singleton';
      use DBI;
      
      # this only gets called the first time instance() is called
      sub _new_instance {
          my $class = shift;
          my $self  = bless { }, $class;
          my $db    = shift || "myappdb";    
          my $host  = shift || "localhost";
          
          $self->{ DB } = DBI->connect("DBI:mSQL:$db:$host")
              || die "Cannot connect to database: $DBI::errstr";
          
          # any other initialisation...
          
          return $self;
      }
  
  The above example might be used as follows:
  
      use MyApp::Database;
      
      # first use - database gets initialised
      my $database = MyApp::Database->instance();
  
  Some time later on in a module far, far away...
  
      package MyApp::FooBar
      use MyApp::Database;
      
      # this FooBar object needs access to the database; the Singleton
      # approach gives a nice wrapper around global variables.
      
      sub new {
          my $class = shift;
          bless {
              database => MyApp::Database->instance(),
          }, $class;
      }
  
  The C<Class::Singleton> L<instance()> method uses a private hash to store
  a reference to any existing instance of the object, keyed against the derived
  class package name.
  
  This allows different classes to be derived from C<Class::Singleton> that can
  co-exist in the same system, while still allowing only one instance of any one
  class to exist. For example, it would be possible to derive both
  'C<PrintSpooler>' and 'C<MyApp::Database>' from C<Class::Singleton> and have a
  single instance of I<each> in a system, rather than a single instance of
  I<either>.
  
  You can use the L<has_instance()> method to find out if a particular class 
  already has an instance defined.  A reference to the instance is returned or
  C<undef> if none is currently defined.
  
      my $instance = MyApp::Database->has_instance()
          || warn "No instance is defined yet";
  
  =head1 METHODS
  
  =head2 instance()
  
  This method is called to return a current object instance or create a new
  one by calling L<_new_instance()>.
  
  =head2 has_instance()
  
  This method returns a reference to any existing instance or C<undef> if none
  is defined.
  
      my $testing = MySingleton1->has_instance()
          || warn "No instance defined for MySingleton1";
  
  =head2 _new_instance()
  
  This "private" method is called by L<instance()> to create a new object
  instance if one doesn't already exist. It is not intended to be called
  directly (although there's nothing to stop you from calling it if you're
  really determined to do so).
  
  It creates a blessed hash reference containing any arguments passed to the
  method as either a hash reference or list of named parameters.
  
      # either: hash reference of named parameters
      my $example1 = MySingleton1->new({ pi => 3.14, e => 2.718 });
  
      # or: list of named parameters
      my $example2 = MySingleton2->new( pi => 3.14, e => 2.718 );
  
  It is important to remember that the L<instance()> method will I<only> call
  the I<_new_instance()> method once, so any arguments you pass may be silently
  ignored if an instance already exists. You can use the L<has_instance()>
  method to determine if an instance is already defined.
  
  =head1 AUTHOR
  
  Andy Wardley E<lt>abw@wardley.orgE<gt> L<http://wardley.org/>
  
  Thanks to Andreas Koenig for providing some significant speedup patches and
  other ideas.
  
  =head1 VERSION
  
  This is version 1.5, released November 2014
  
  =head1 COPYRIGHT
  
  Copyright Andy Wardley 1998-2007.  All Rights Reserved.
  
  This module is free software; you can redistribute it and/or
  modify it under the same terms as Perl itself.
  
  =cut
CLASS_SINGLETON

    $main::fatpacked{"Clone/PP.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'CLONE_PP';
  package Clone::PP;
  
  use 5.006;
  use strict;
  use warnings;
  use vars qw($VERSION @EXPORT_OK);
  use Exporter;
  
  $VERSION = 1.07;
  
  @EXPORT_OK = qw( clone );
  sub import { goto &Exporter::import } # lazy Exporter
  
  # These methods can be temporarily overridden to work with a given class.
  use vars qw( $CloneSelfMethod $CloneInitMethod );
  $CloneSelfMethod ||= 'clone_self';
  $CloneInitMethod ||= 'clone_init';
  
  # Used to detect looped networks and avoid infinite recursion. 
  use vars qw( %CloneCache );
  
  # Generic cloning function
  sub clone {
    my $source = shift;
  
    return undef if not defined($source);
    
    # Optional depth limit: after a given number of levels, do shallow copy.
    my $depth = shift;
    return $source if ( defined $depth and $depth -- < 1 );
    
    # Maintain a shared cache during recursive calls, then clear it at the end.
    local %CloneCache = ( undef => undef ) unless ( exists $CloneCache{undef} );
    
    return $CloneCache{ $source } if ( defined $CloneCache{ $source } );
    
    # Non-reference values are copied shallowly
    my $ref_type = ref $source or return $source;
    
    # Extract both the structure type and the class name of referent
    my $class_name;
    if ( "$source" =~ /^\Q$ref_type\E\=([A-Z]+)\(0x[0-9a-f]+\)$/ ) {
      $class_name = $ref_type;
      $ref_type = $1;
      # Some objects would prefer to clone themselves; check for clone_self().
      return $CloneCache{ $source } = $source->$CloneSelfMethod() 
  				  if $source->can($CloneSelfMethod);
    }
    
    # To make a copy:
    # - Prepare a reference to the same type of structure;
    # - Store it in the cache, to avoid looping if it refers to itself;
    # - Tie in to the same class as the original, if it was tied;
    # - Assign a value to the reference by cloning each item in the original;
    
    my $copy;
    if ($ref_type eq 'HASH') {
      $CloneCache{ $source } = $copy = {};
      if ( my $tied = tied( %$source ) ) { tie %$copy, ref $tied }
      %$copy = map { ! ref($_) ? $_ : clone($_, $depth) } %$source;
    } elsif ($ref_type eq 'ARRAY') {
      $CloneCache{ $source } = $copy = [];
      if ( my $tied = tied( @$source ) ) { tie @$copy, ref $tied }
      @$copy = map { ! ref($_) ? $_ : clone($_, $depth) } @$source;
    } elsif ($ref_type eq 'REF' or $ref_type eq 'SCALAR') {
      $CloneCache{ $source } = $copy = \( my $var = "" );
      if ( my $tied = tied( $$source ) ) { tie $$copy, ref $tied }
      $$copy = clone($$source, $depth);
    } else {
      # Shallow copy anything else; this handles a reference to code, glob, regex
      $CloneCache{ $source } = $copy = $source;
    }
    
    # - Bless it into the same class as the original, if it was blessed;
    # - If it has a post-cloning initialization method, call it.
    if ( $class_name ) {
      bless $copy, $class_name;
      $copy->$CloneInitMethod() if $copy->can($CloneInitMethod);
    }
    
    return $copy;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Clone::PP - Recursively copy Perl datatypes
  
  =head1 SYNOPSIS
  
    use Clone::PP qw(clone);
    
    $item = { 'foo' => 'bar', 'move' => [ 'zig', 'zag' ]  };
    $copy = clone( $item );
  
    $item = [ 'alpha', 'beta', { 'gamma' => 'vlissides' } ];
    $copy = clone( $item );
  
    $item = Foo->new();
    $copy = clone( $item );
  
  Or as an object method:
  
    require Clone::PP;
    push @Foo::ISA, 'Clone::PP';
    
    $item = Foo->new();
    $copy = $item->clone();
  
  =head1 DESCRIPTION
  
  This module provides a general-purpose clone function to make deep
  copies of Perl data structures. It calls itself recursively to copy
  nested hash, array, scalar and reference types, including tied
  variables and objects.
  
  The clone() function takes a scalar argument to copy. To duplicate
  arrays or hashes, pass them in by reference:
  
    my $copy = clone(\@array);    my @copy = @{ clone(\@array) };
    my $copy = clone(\%hash);     my %copy = %{ clone(\%hash) };
  
  The clone() function also accepts an optional second parameter that
  can be used to limit the depth of the copy. If you pass a limit of
  0, clone will return the same value you supplied; for a limit of
  1, a shallow copy is constructed; for a limit of 2, two layers of
  copying are done, and so on.
  
    my $shallow_copy = clone( $item, 1 );
  
  To allow objects to intervene in the way they are copied, the
  clone() function checks for a couple of optional methods. If an
  object provides a method named C<clone_self>, it is called and the
  result returned without further processing. Alternately, if an
  object provides a method named C<clone_init>, it is called on the
  copied object before it is returned.
  
  =head1 BUGS
  
  Some data types, such as globs, regexes, and code refs, are always copied shallowly.
  
  References to hash elements are not properly duplicated. (This is why two tests in t/dclone.t that are marked "todo".) For example, the following test should succeed but does not:
  
    my $hash = { foo => 1 }; 
    $hash->{bar} = \{ $hash->{foo} }; 
    my $copy = clone( \%hash ); 
    $hash->{foo} = 2; 
    $copy->{foo} = 2; 
    ok( $hash->{bar} == $copy->{bar} );
  
  To report bugs via the CPAN web tracking system, go to 
  C<http://rt.cpan.org/NoAuth/Bugs.html?Dist=Clone-PP> or send mail 
  to C<Dist=Clone-PP#rt.cpan.org>, replacing C<#> with C<@>.
  
  =head1 SEE ALSO
  
  L<Clone> - a baseclass which provides a C<clone()> method.
  
  L<MooseX::Clone> - find-grained cloning for Moose objects.
  
  The C<dclone()> function in L<Storable>.
  
  L<Data::Clone> -
  polymorphic data cloning (see its documentation for what that means).
  
  L<Clone::Any> - use whichever of the cloning methods is available.
  
  =head1 REPOSITORY
  
  L<https://github.com/neilbowers/Clone-PP>
  
  =head1 AUTHOR AND CREDITS
  
  Developed by Matthew Simon Cavalletto at Evolution Softworks. 
  More free Perl software is available at C<www.evoscript.org>.
  
  
  =head1 COPYRIGHT AND LICENSE
  
  Copyright 2003 Matthew Simon Cavalletto. You may contact the author
  directly at C<evo@cpan.org> or C<simonm@cavalletto.org>.
  
  Code initially derived from Ref.pm. Portions Copyright 1994 David Muir Sharnoff.
  
  Interface based by Clone by Ray Finch with contributions from chocolateboy.
  Portions Copyright 2001 Ray Finch. Portions Copyright 2001 chocolateboy. 
  
  You may use, modify, and distribute this software under the same terms as Perl.
  
  =cut
CLONE_PP

    $main::fatpacked{"Color/ANSI/Util.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'COLOR_ANSI_UTIL';
  package Color::ANSI::Util;
  
  our $DATE = '2019-08-20'; # DATE
  our $VERSION = '0.163'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  use Color::RGB::Util qw(rgb_diff);
  
  require Exporter;
  our @ISA       = qw(Exporter);
  our @EXPORT_OK = qw(
                         ansi16_to_rgb
                         rgb_to_ansi16
                         rgb_to_ansi16_fg_code
                         ansi16fg
                         rgb_to_ansi16_bg_code
                         ansi16bg
  
                         ansi256_to_rgb
                         rgb_to_ansi256
                         rgb_to_ansi256_fg_code
                         ansi256fg
                         rgb_to_ansi256_bg_code
                         ansi256bg
  
                         rgb_to_ansi24b_fg_code
                         ansi24bfg
                         rgb_to_ansi24b_bg_code
                         ansi24bbg
  
                         rgb_to_ansi_fg_code
                         ansifg
                         rgb_to_ansi_bg_code
                         ansibg
  
                         ansi_reset
                 );
  
  our %SPEC;
  
  my %ansi16 = (
      0  => '000000',
      1  => '800000',
      2  => '008000',
      3  => '808000',
      4  => '000080',
      5  => '800080',
      6  => '008080',
      7  => 'c0c0c0',
      8  => '808080',
      9  => 'ff0000',
      10 => '00ff00',
      11 => 'ffff00',
      12 => '0000ff',
      13 => 'ff00ff',
      14 => '00ffff',
      15 => 'ffffff',
  );
  my @revansi16;
  for my $idx (sort {$a<=>$b} keys %ansi16) {
      push @revansi16, [$ansi16{$idx}, $idx];
  }
  
  my %ansi256 = (
      %ansi16,
  
      16 => '000000',  17 => '00005f',  18 => '000087',  19 => '0000af',  20 => '0000d7',  21 => '0000ff',
      22 => '005f00',  23 => '005f5f',  24 => '005f87',  25 => '005faf',  26 => '005fd7',  27 => '005fff',
      28 => '008700',  29 => '00875f',  30 => '008787',  31 => '0087af',  32 => '0087d7',  33 => '0087ff',
      34 => '00af00',  35 => '00af5f',  36 => '00af87',  37 => '00afaf',  38 => '00afd7',  39 => '00afff',
      40 => '00d700',  41 => '00d75f',  42 => '00d787',  43 => '00d7af',  44 => '00d7d7',  45 => '00d7ff',
      46 => '00ff00',  47 => '00ff5f',  48 => '00ff87',  49 => '00ffaf',  50 => '00ffd7',  51 => '00ffff',
      52 => '5f0000',  53 => '5f005f',  54 => '5f0087',  55 => '5f00af',  56 => '5f00d7',  57 => '5f00ff',
      58 => '5f5f00',  59 => '5f5f5f',  60 => '5f5f87',  61 => '5f5faf',  62 => '5f5fd7',  63 => '5f5fff',
      64 => '5f8700',  65 => '5f875f',  66 => '5f8787',  67 => '5f87af',  68 => '5f87d7',  69 => '5f87ff',
      70 => '5faf00',  71 => '5faf5f',  72 => '5faf87',  73 => '5fafaf',  74 => '5fafd7',  75 => '5fafff',
      76 => '5fd700',  77 => '5fd75f',  78 => '5fd787',  79 => '5fd7af',  80 => '5fd7d7',  81 => '5fd7ff',
      82 => '5fff00',  83 => '5fff5f',  84 => '5fff87',  85 => '5fffaf',  86 => '5fffd7',  87 => '5fffff',
      88 => '870000',  89 => '87005f',  90 => '870087',  91 => '8700af',  92 => '8700d7',  93 => '8700ff',
      94 => '875f00',  95 => '875f5f',  96 => '875f87',  97 => '875faf',  98 => '875fd7',  99 => '875fff',
      100 => '878700', 101 => '87875f', 102 => '878787', 103 => '8787af', 104 => '8787d7', 105 => '8787ff',
      106 => '87af00', 107 => '87af5f', 108 => '87af87', 109 => '87afaf', 110 => '87afd7', 111 => '87afff',
      112 => '87d700', 113 => '87d75f', 114 => '87d787', 115 => '87d7af', 116 => '87d7d7', 117 => '87d7ff',
      118 => '87ff00', 119 => '87ff5f', 120 => '87ff87', 121 => '87ffaf', 122 => '87ffd7', 123 => '87ffff',
      124 => 'af0000', 125 => 'af005f', 126 => 'af0087', 127 => 'af00af', 128 => 'af00d7', 129 => 'af00ff',
      130 => 'af5f00', 131 => 'af5f5f', 132 => 'af5f87', 133 => 'af5faf', 134 => 'af5fd7', 135 => 'af5fff',
      136 => 'af8700', 137 => 'af875f', 138 => 'af8787', 139 => 'af87af', 140 => 'af87d7', 141 => 'af87ff',
      142 => 'afaf00', 143 => 'afaf5f', 144 => 'afaf87', 145 => 'afafaf', 146 => 'afafd7', 147 => 'afafff',
      148 => 'afd700', 149 => 'afd75f', 150 => 'afd787', 151 => 'afd7af', 152 => 'afd7d7', 153 => 'afd7ff',
      154 => 'afff00', 155 => 'afff5f', 156 => 'afff87', 157 => 'afffaf', 158 => 'afffd7', 159 => 'afffff',
      160 => 'd70000', 161 => 'd7005f', 162 => 'd70087', 163 => 'd700af', 164 => 'd700d7', 165 => 'd700ff',
      166 => 'd75f00', 167 => 'd75f5f', 168 => 'd75f87', 169 => 'd75faf', 170 => 'd75fd7', 171 => 'd75fff',
      172 => 'd78700', 173 => 'd7875f', 174 => 'd78787', 175 => 'd787af', 176 => 'd787d7', 177 => 'd787ff',
      178 => 'd7af00', 179 => 'd7af5f', 180 => 'd7af87', 181 => 'd7afaf', 182 => 'd7afd7', 183 => 'd7afff',
      184 => 'd7d700', 185 => 'd7d75f', 186 => 'd7d787', 187 => 'd7d7af', 188 => 'd7d7d7', 189 => 'd7d7ff',
      190 => 'd7ff00', 191 => 'd7ff5f', 192 => 'd7ff87', 193 => 'd7ffaf', 194 => 'd7ffd7', 195 => 'd7ffff',
      196 => 'ff0000', 197 => 'ff005f', 198 => 'ff0087', 199 => 'ff00af', 200 => 'ff00d7', 201 => 'ff00ff',
      202 => 'ff5f00', 203 => 'ff5f5f', 204 => 'ff5f87', 205 => 'ff5faf', 206 => 'ff5fd7', 207 => 'ff5fff',
      208 => 'ff8700', 209 => 'ff875f', 210 => 'ff8787', 211 => 'ff87af', 212 => 'ff87d7', 213 => 'ff87ff',
      214 => 'ffaf00', 215 => 'ffaf5f', 216 => 'ffaf87', 217 => 'ffafaf', 218 => 'ffafd7', 219 => 'ffafff',
      220 => 'ffd700', 221 => 'ffd75f', 222 => 'ffd787', 223 => 'ffd7af', 224 => 'ffd7d7', 225 => 'ffd7ff',
      226 => 'ffff00', 227 => 'ffff5f', 228 => 'ffff87', 229 => 'ffffaf', 230 => 'ffffd7', 231 => 'ffffff',
  
      232 => '080808', 233 => '121212', 234 => '1c1c1c', 235 => '262626', 236 => '303030', 237 => '3a3a3a',
      238 => '444444', 239 => '4e4e4e', 240 => '585858', 241 => '606060', 242 => '666666', 243 => '767676',
      244 => '808080', 245 => '8a8a8a', 246 => '949494', 247 => '9e9e9e', 248 => 'a8a8a8', 249 => 'b2b2b2',
      250 => 'bcbcbc', 251 => 'c6c6c6', 252 => 'd0d0d0', 253 => 'dadada', 254 => 'e4e4e4', 255 => 'eeeeee',
  );
  my @revansi256;
  for my $idx (sort {$a<=>$b} keys %ansi256) {
      push @revansi256, [$ansi256{$idx}, $idx];
  }
  
  $SPEC{ansi16_to_rgb} = {
      v => 1.1,
      summary => 'Convert ANSI-16 color to RGB',
      description => <<'_',
  
  Returns 6-hexdigit, e.g. 'ff00cc'.
  
  _
      args => {
          color => {
              schema => 'color::ansi16*',
              req => 1,
              pos => 0,
          },
      },
      args_as => 'array',
      result => {
          schema => 'color::rgb24*',
      },
      result_naked => 1,
  };
  sub ansi16_to_rgb {
      my ($input) = @_;
  
      if ($input =~ /^\d+$/) {
          if ($input >= 0 && $input <= 15) {
              return $ansi16{$input + 0}; # to remove prefix zero e.g. "06"
          } else {
              die "Invalid ANSI 16-color number '$input'";
          }
      } elsif ($input =~ /^(?:(bold|bright) \s )?(black|red|green|yellow|blue|magenta|cyan|white)$/ix) {
          my ($bold, $col) = (lc($1 // ""), lc($2));
          my $i;
          if ($col eq 'black') {
              $i = 0;
          } elsif ($col eq 'red') {
              $i = 1;
          } elsif ($col eq 'green') {
              $i = 2;
          } elsif ($col eq 'yellow') {
              $i = 3;
          } elsif ($col eq 'blue') {
              $i = 4;
          } elsif ($col eq 'magenta') {
              $i = 5;
          } elsif ($col eq 'cyan') {
              $i = 6;
          } elsif ($col eq 'white') {
              $i = 7;
          }
          $i += 8 if $bold;
          return $ansi16{$i};
      } else {
          die "Invalid ANSI 16-color name '$input'";
      }
  }
  
  sub _rgb_to_indexed {
      my ($rgb, $table) = @_;
  
      my ($smallest_diff, $res);
      for my $e (@$table) {
          my $diff = rgb_diff($rgb, $e->[0], 'hsv_hue1');
          # exact match, return immediately
          return $e->[1] if $diff == 0;
          if (!defined($smallest_diff) || $smallest_diff > $diff) {
              $smallest_diff = $diff;
              $res = $e->[1];
          }
      }
      return $res;
  }
  
  $SPEC{ansi256_to_rgb} = {
      v => 1.1,
      summary => 'Convert ANSI-256 color to RGB',
      args => {
          color => {
              schema => 'color::ansi256*',
              req => 1,
              pos => 0,
          },
      },
      args_as => 'array',
      result => {
          schema => 'color::rgb24',
      },
      result_naked => 1,
  };
  sub ansi256_to_rgb {
      my ($input) = @_;
  
      $input += 0;
      exists($ansi256{$input}) or die "Invalid ANSI 256-color index '$input'";
      $ansi256{$input};
  }
  
  $SPEC{rgb_to_ansi16} = {
      v => 1.1,
      summary => 'Convert RGB to ANSI-16 color',
      args => {
          color => {
              schema => 'color::rgb24*',
              req => 1,
              pos => 0,
          },
      },
      args_as => 'array',
      result => {
          schema => 'color::ansi16*',
      },
      result_naked => 1,
  };
  sub rgb_to_ansi16 {
      my ($input) = @_;
      _rgb_to_indexed($input, \@revansi16);
  }
  
  $SPEC{rgb_to_ansi256} = {
      v => 1.1,
      summary => 'Convert RGB to ANSI-256 color',
      args => {
          color => {
              schema => 'color::rgb24*',
              req => 1,
              pos => 0,
          },
      },
      args_as => 'array',
      result => {
          schema => 'color::ansi256*',
      },
      result_naked => 1,
  };
  sub rgb_to_ansi256 {
      my ($input) = @_;
      _rgb_to_indexed($input, \@revansi256);
  }
  
  $SPEC{rgb_to_ansi16_fg_code} = {
      v => 1.1,
      summary => 'Convert RGB to ANSI-16 color escape sequence to change foreground color',
      args => {
          color => {
              schema => 'color::rgb24*',
              req => 1,
              pos => 0,
          },
      },
      args_as => 'array',
      result => {
          schema => 'str*',
      },
      result_naked => 1,
  };
  sub rgb_to_ansi16_fg_code {
      my ($input) = @_;
  
      my $res = _rgb_to_indexed($input, \@revansi16);
      return "\e[" . ($res >= 8 ? ($res+30-8) . ";1" : ($res+30)) . "m";
  }
  
  sub ansi16fg  { goto &rgb_to_ansi16_fg_code  }
  
  $SPEC{rgb_to_ansi16_bg_code} = {
      v => 1.1,
      summary => 'Convert RGB to ANSI-16 color escape sequence to change background color',
      args => {
          color => {
              schema => 'color::rgb24*',
              req => 1,
              pos => 0,
          },
      },
      args_as => 'array',
      result => {
          schema => 'str*',
      },
      result_naked => 1,
  };
  sub rgb_to_ansi16_bg_code {
      my ($input) = @_;
  
      my $res = _rgb_to_indexed($input, \@revansi16);
      return "\e[" . ($res >= 8 ? ($res+40-8) : ($res+40)) . "m";
  }
  
  sub ansi16bg  { goto &rgb_to_ansi16_bg_code  }
  
  $SPEC{rgb_to_ansi256_fg_code} = {
      v => 1.1,
      summary => 'Convert RGB to ANSI-256 color escape sequence to change foreground color',
      args => {
          color => {
              schema => 'color::rgb24*',
              req => 1,
              pos => 0,
          },
      },
      args_as => 'array',
      result => {
          schema => 'str*',
      },
      result_naked => 1,
  };
  sub rgb_to_ansi256_fg_code {
      my ($input) = @_;
  
      my $res = _rgb_to_indexed($input, \@revansi16);
      return "\e[38;5;${res}m";
  }
  
  sub ansi256fg { goto &rgb_to_ansi256_fg_code }
  
  $SPEC{rgb_to_ansi256_bg_code} = {
      v => 1.1,
      summary => 'Convert RGB to ANSI-256 color escape sequence to change background color',
      args => {
          color => {
              schema => 'color::rgb24*',
              req => 1,
              pos => 0,
          },
      },
      args_as => 'array',
      result => {
          schema => 'str*',
      },
      result_naked => 1,
  };
  sub rgb_to_ansi256_bg_code {
      my ($input) = @_;
  
      my $res = _rgb_to_indexed($input, \@revansi16);
      return "\e[48;5;${res}m";
  }
  
  sub ansi256bg { goto &rgb_to_ansi256_bg_code }
  
  $SPEC{rgb_to_ansi24b_fg_code} = {
      v => 1.1,
      summary => 'Convert RGB to ANSI 24bit-color escape sequence to change foreground color',
      args => {
          color => {
              schema => 'color::rgb24*',
              req => 1,
              pos => 0,
          },
      },
      args_as => 'array',
      result => {
          schema => 'str*',
      },
      result_naked => 1,
  };
  sub rgb_to_ansi24b_fg_code {
      my ($rgb) = @_;
  
      return sprintf("\e[38;2;%d;%d;%dm",
                     hex(substr($rgb, 0, 2)),
                     hex(substr($rgb, 2, 2)),
                     hex(substr($rgb, 4, 2)));
  }
  
  sub ansi24bfg { goto &rgb_to_ansi24b_fg_code }
  
  $SPEC{rgb_to_ansi24b_bg_code} = {
      v => 1.1,
      summary => 'Convert RGB to ANSI 24bit-color escape sequence to change background color',
      args => {
          color => {
              schema => 'color::rgb24*',
              req => 1,
              pos => 0,
          },
      },
      args_as => 'array',
      result => {
          schema => 'str*',
      },
      result_naked => 1,
  };
  sub rgb_to_ansi24b_bg_code {
      my ($rgb) = @_;
  
      return sprintf("\e[48;2;%d;%d;%dm",
                     hex(substr($rgb, 0, 2)),
                     hex(substr($rgb, 2, 2)),
                     hex(substr($rgb, 4, 2)));
  }
  
  sub ansi24bbg { goto &rgb_to_ansi24b_bg_code }
  
  our $_use_termdetsw = 1;
  our $_color_depth; # cache, can be set during testing
  sub _color_depth {
      unless (defined $_color_depth) {
          {
              if (exists $ENV{NO_COLOR}) {
                  $_color_depth = 0;
                  last;
              }
              if (defined $ENV{COLOR} && !$ENV{COLOR}) {
                  $_color_depth = 0;
                  last;
              }
              if (defined $ENV{COLOR_DEPTH}) {
                  $_color_depth = $ENV{COLOR_DEPTH};
                  last;
              }
              if ($_use_termdetsw) {
                  eval { require Term::Detect::Software };
                  if (!$@) {
                      $_color_depth = Term::Detect::Software::detect_terminal_cached()->{color_depth};
                      last;
                  }
              }
              # simple heuristic
              if ($ENV{KONSOLE_DBUS_SERVICE}) {
                  $_color_depth = 2**24;
                  last;
              }
              # safe value
              $_color_depth = 16;
          }
      };
      $_color_depth;
  }
  
  $SPEC{rgb_to_ansi_fg_code} = {
      v => 1.1,
      summary => 'Convert RGB to ANSI color escape sequence to change foreground color',
      description => <<'_',
  
  Autodetect terminal capability and can return either empty string, 16-color,
  256-color, or 24bit-code.
  
  Color depth used is determined by `COLOR_DEPTH` environment setting or from
  <pm:Term::Detect::Software> if that module is available. In other words, this
  function automatically chooses rgb_to_ansi{24b,256,16}_fg_code().
  
  _
      args => {
          color => {
              schema => 'color::rgb24*',
              req => 1,
              pos => 0,
          },
      },
      args_as => 'array',
      result => {
          schema => 'str*',
      },
      result_naked => 1,
  };
  sub rgb_to_ansi_fg_code {
      my ($rgb) = @_;
      my $cd = _color_depth();
      if ($cd >= 2**24) {
          rgb_to_ansi24b_fg_code($rgb);
      } elsif ($cd >= 256) {
          rgb_to_ansi256_fg_code($rgb);
      } elsif ($cd >= 16) {
          rgb_to_ansi16_fg_code($rgb);
      } else {
          "";
      }
  }
  
  sub ansifg { goto &rgb_to_ansi_fg_code }
  
  $SPEC{rgb_to_ansi_bg_code} = {
      v => 1.1,
      summary => 'Convert RGB to ANSI color escape sequence to change background color',
      description => <<'_',
  
  Autodetect terminal capability and can return either empty string, 16-color,
  256-color, or 24bit-code.
  
  Which color depth used is determined by `COLOR_DEPTH` environment setting or
  from <pm:Term::Detect::Software> if that module is available). In other words,
  this function automatically chooses rgb_to_ansi{24b,256,16}_bg_code().
  
  _
      args => {
          color => {
              schema => 'color::rgb24*',
              req => 1,
              pos => 0,
          },
      },
      args_as => 'array',
      result => {
          schema => 'str*',
      },
      result_naked => 1,
  };
  sub rgb_to_ansi_bg_code {
      my ($rgb) = @_;
      my $cd = _color_depth();
      if ($cd >= 2**24) {
          rgb_to_ansi24b_bg_code($rgb);
      } elsif ($cd >= 256) {
          rgb_to_ansi256_bg_code($rgb);
      } else {
          rgb_to_ansi16_bg_code($rgb);
      }
  }
  
  sub ansibg { goto &rgb_to_ansi_bg_code }
  
  sub ansi_reset { "\e[0m" }
  
  1;
  # ABSTRACT: Routines for dealing with ANSI colors
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Color::ANSI::Util - Routines for dealing with ANSI colors
  
  =head1 VERSION
  
  This document describes version 0.163 of Color::ANSI::Util (from Perl distribution Color-ANSI-Util), released on 2019-08-20.
  
  =head1 SYNOPSIS
  
   use Color::ANSI::Util qw(
       ansifg
       ansibg
   );
  
   say ansifg("f0c010"); # => "\e[33;1m" (on 16-color terminal)
                         # => "\e[38;5;11m" (on 256-color terminal)
                         # => "\e[38;2;240;192;16m" (on 24-bit-color terminal)
  
   say ansibg("ff5f87"); # => "\e[47m" (on 16-color terminal)
                         # => "\e[48;5;7m" (on 256-color terminal)
                         # => "\e[48;2;255;95;135m" (on 24-bit-color terminal)
  
  There are a bunch of other exportable functions too, mostly for converting
  between RGB and ANSI color (16/256/24bit color depth).
  
  =head1 DESCRIPTION
  
  This module provides routines for dealing with ANSI colors. The two main
  functions are C<ansifg> and C<ansibg>. With those functions, you can specify
  colors in RGB and let it output the correct ANSI color escape code according to
  the color depth support of the terminal (whether 16-color, 256-color, or 24bit).
  There are other functions to convert RGB to ANSI in specific color depths, or
  reverse functions to convert from ANSI to RGB codes.
  
  Keywords: xterm, xterm-256color, terminal
  
  =head1 BUGS/NOTES
  
  Algorithm for finding closest indexed color from RGB color currently not very
  efficient. Probably can add some threshold square distance, below which we can
  shortcut to the final answer.
  
  =head1 FUNCTIONS
  
  
  =head2 ansi16_to_rgb
  
  Usage:
  
   ansi16_to_rgb($color) -> color::rgb24
  
  Convert ANSI-16 color to RGB.
  
  Returns 6-hexdigit, e.g. 'ff00cc'.
  
  This function is not exported by default, but exportable.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<$color>* => I<color::ansi16>
  
  =back
  
  Return value:  (color::rgb24)
  
  
  
  =head2 ansi256_to_rgb
  
  Usage:
  
   ansi256_to_rgb($color) -> color::rgb24
  
  Convert ANSI-256 color to RGB.
  
  This function is not exported by default, but exportable.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<$color>* => I<color::ansi256>
  
  =back
  
  Return value:  (color::rgb24)
  
  
  
  =head2 rgb_to_ansi16
  
  Usage:
  
   rgb_to_ansi16($color) -> color::ansi16
  
  Convert RGB to ANSI-16 color.
  
  This function is not exported by default, but exportable.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<$color>* => I<color::rgb24>
  
  =back
  
  Return value:  (color::ansi16)
  
  
  
  =head2 rgb_to_ansi16_bg_code
  
  Usage:
  
   rgb_to_ansi16_bg_code($color) -> str
  
  Convert RGB to ANSI-16 color escape sequence to change background color.
  
  This function is not exported by default, but exportable.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<$color>* => I<color::rgb24>
  
  =back
  
  Return value:  (str)
  
  
  
  =head2 rgb_to_ansi16_fg_code
  
  Usage:
  
   rgb_to_ansi16_fg_code($color) -> str
  
  Convert RGB to ANSI-16 color escape sequence to change foreground color.
  
  This function is not exported by default, but exportable.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<$color>* => I<color::rgb24>
  
  =back
  
  Return value:  (str)
  
  
  
  =head2 rgb_to_ansi24b_bg_code
  
  Usage:
  
   rgb_to_ansi24b_bg_code($color) -> str
  
  Convert RGB to ANSI 24bit-color escape sequence to change background color.
  
  This function is not exported by default, but exportable.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<$color>* => I<color::rgb24>
  
  =back
  
  Return value:  (str)
  
  
  
  =head2 rgb_to_ansi24b_fg_code
  
  Usage:
  
   rgb_to_ansi24b_fg_code($color) -> str
  
  Convert RGB to ANSI 24bit-color escape sequence to change foreground color.
  
  This function is not exported by default, but exportable.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<$color>* => I<color::rgb24>
  
  =back
  
  Return value:  (str)
  
  
  
  =head2 rgb_to_ansi256
  
  Usage:
  
   rgb_to_ansi256($color) -> color::ansi256
  
  Convert RGB to ANSI-256 color.
  
  This function is not exported by default, but exportable.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<$color>* => I<color::rgb24>
  
  =back
  
  Return value:  (color::ansi256)
  
  
  
  =head2 rgb_to_ansi256_bg_code
  
  Usage:
  
   rgb_to_ansi256_bg_code($color) -> str
  
  Convert RGB to ANSI-256 color escape sequence to change background color.
  
  This function is not exported by default, but exportable.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<$color>* => I<color::rgb24>
  
  =back
  
  Return value:  (str)
  
  
  
  =head2 rgb_to_ansi256_fg_code
  
  Usage:
  
   rgb_to_ansi256_fg_code($color) -> str
  
  Convert RGB to ANSI-256 color escape sequence to change foreground color.
  
  This function is not exported by default, but exportable.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<$color>* => I<color::rgb24>
  
  =back
  
  Return value:  (str)
  
  
  
  =head2 rgb_to_ansi_bg_code
  
  Usage:
  
   rgb_to_ansi_bg_code($color) -> str
  
  Convert RGB to ANSI color escape sequence to change background color.
  
  Autodetect terminal capability and can return either empty string, 16-color,
  256-color, or 24bit-code.
  
  Which color depth used is determined by C<COLOR_DEPTH> environment setting or
  from L<Term::Detect::Software> if that module is available). In other words,
  this function automatically chooses rgb_to_ansi{24b,256,16}I<bg>code().
  
  This function is not exported by default, but exportable.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<$color>* => I<color::rgb24>
  
  =back
  
  Return value:  (str)
  
  
  
  =head2 rgb_to_ansi_fg_code
  
  Usage:
  
   rgb_to_ansi_fg_code($color) -> str
  
  Convert RGB to ANSI color escape sequence to change foreground color.
  
  Autodetect terminal capability and can return either empty string, 16-color,
  256-color, or 24bit-code.
  
  Color depth used is determined by C<COLOR_DEPTH> environment setting or from
  L<Term::Detect::Software> if that module is available. In other words, this
  function automatically chooses rgb_to_ansi{24b,256,16}I<fg>code().
  
  This function is not exported by default, but exportable.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<$color>* => I<color::rgb24>
  
  =back
  
  Return value:  (str)
  
  
  =head2 ansi16fg($rgb) => STR
  
  Alias for rgb_to_ansi16_fg_code().
  
  =head2 ansi16bg($rgb) => STR
  
  Alias for rgb_to_ansi16_bg_code().
  
  =head2 ansi256fg($rgb) => STR
  
  Alias for rgb_to_ansi256_fg_code().
  
  =head2 ansi256bg($rgb) => STR
  
  Alias for rgb_to_ansi256_bg_code().
  
  =head2 ansi24bfg($rgb) => STR
  
  Alias for rgb_to_ansi24b_fg_code().
  
  =head2 ansi24bbg($rgb) => STR
  
  Alias for rgb_to_ansi24b_bg_code().
  
  =head2 rgb_to_ansi_fg_code($rgb) => STR
  
  =head2 ansifg($rgb) => STR
  
  Alias for rgb_to_ansi_fg_code().
  
  =head2 ansibg($rgb) => STR
  
  Alias for rgb_to_ansi_bg_code().
  
  =head2 ansi_reset
  
  Returns "\e[0m", which is the ANSI escape sequence to reset color. Normally you
  print this sequence after you print colored text.
  
  =head1 ENVIRONMENT
  
  =head2 NO_COLOR
  
  Can be used to explicitly disable color. See L<https://no-color.org> for more
  details.
  
  Observed by: ansi{fg,bg}.
  
  =head2 COLOR => bool
  
  Can be used to explicitly disable color by setting it to 0.
  
  Observed by: ansi{fg,bg}.
  
  =head2 COLOR_DEPTH => INT
  
  Can be used to explicitly set color depth instead of trying to detect
  appropriate color depth.
  
  Observed by: ansi{fg,bg}.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Color-ANSI-Util>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Color-ANSI-Util>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Color-ANSI-Util>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Term::ANSIColor>
  
  L<http://en.wikipedia.org/wiki/ANSI_escape_code>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2019, 2018, 2017, 2016, 2015, 2014, 2013 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
COLOR_ANSI_UTIL

    $main::fatpacked{"Color/RGB/Util.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'COLOR_RGB_UTIL';
  package Color::RGB::Util;
  
  our $DATE = '2019-08-20'; # DATE
  our $VERSION = '0.599'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  #use List::Util qw(min);
  
  require Exporter;
  our @ISA = qw(Exporter);
  our @EXPORT_OK = qw(
                         assign_rgb_color
                         assign_rgb_dark_color
                         assign_rgb_light_color
                         int2rgb
                         mix_2_rgb_colors
                         mix_rgb_colors
                         rand_rgb_color
                         rand_rgb_colors
                         reverse_rgb_color
                         rgb2grayscale
                         rgb2hsv
                         rgb2hsl
                         rgb2int
                         rgb2sepia
                         rgb_diff
                         rgb_distance
                         rgb_is_dark
                         rgb_is_light
                         rgb_luminance
                         tint_rgb_color
                 );
  
  my $re_rgb = qr/\A#?([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})\z/;
  
  sub _min {
      $_[0] < $_[1] ? $_[0] : $_[1];
  }
  
  sub assign_rgb_color {
      require Digest::SHA;
  
      my ($str) = @_;
  
      my $sha1 = Digest::SHA::sha1_hex($str);
      substr($sha1, 0, 2) .
      substr($sha1, 18, 2) .
      substr($sha1, 38, 2);
  }
  
  sub assign_rgb_dark_color {
      my $str = shift;
  
      my $rgb = assign_rgb_color($str);
      rgb_is_dark($rgb) ? $rgb : mix_2_rgb_colors($rgb, '000000');
  }
  
  sub assign_rgb_light_color {
      my $str = shift;
  
      my $rgb = assign_rgb_color($str);
      rgb_is_light($rgb) ? $rgb : mix_2_rgb_colors($rgb, 'ffffff');
  }
  
  sub int2rgb {
      my $int = shift;
  
      return sprintf("%02x%02x%02x",
                     ($int & 0xff0000) >> 16,
                     ($int & 0x00ff00) >>  8,
                     ($int & 0x0000ff),
                 );
  }
  
  sub mix_2_rgb_colors {
      my ($rgb1, $rgb2, $pct) = @_;
  
      $pct //= 0.5;
  
      my ($r1, $g1, $b1) =
          $rgb1 =~ $re_rgb or die "Invalid rgb1 color, must be in 'ffffff' form";
      my ($r2, $g2, $b2) =
          $rgb2 =~ $re_rgb or die "Invalid rgb2 color, must be in 'ffffff' form";
      for ($r1, $g1, $b1, $r2, $g2, $b2) { $_ = hex $_ }
  
      return sprintf("%02x%02x%02x",
                     $r1 + $pct*($r2-$r1),
                     $g1 + $pct*($g2-$g1),
                     $b1 + $pct*($b2-$b1),
                 );
  }
  
  sub mix_rgb_colors {
  
      my (@weights, @r, @g, @b);
  
      while (@_ >= 2) {
          my ($rgb, $weight) = splice @_, 0, 2;
          my ($r, $g, $b) = $rgb =~ $re_rgb
              or die "Invalid rgb color '$rgb', must be in 'ffffff' form";
          push @r, hex $r;
          push @g, hex $g;
          push @b, hex $b;
          push @weights, $weight;
      }
      my $tot_r = 0; for (0..$#r) { $tot_r += $r[$_]*$weights[$_] }
      my $tot_g = 0; for (0..$#g) { $tot_g += $g[$_]*$weights[$_] }
      my $tot_b = 0; for (0..$#b) { $tot_b += $b[$_]*$weights[$_] }
      my $tot_weight = 0; $tot_weight += $_ for @weights;
      die "Zero/negative total weight" unless $tot_weight > 0;
  
      return sprintf("%02x%02x%02x",
                     $tot_r / $tot_weight,
                     $tot_g / $tot_weight,
                     $tot_b / $tot_weight,
                 );
  }
  
  sub rand_rgb_color {
      my ($rgb1, $rgb2) = @_;
  
      $rgb1 //= '000000';
      my ($r1, $g1, $b1) =
          $rgb1 =~ $re_rgb or die "Invalid rgb1 color, must be in 'ffffff' form";
      $rgb2 //= 'ffffff';
      my ($r2, $g2, $b2) =
          $rgb2 =~ $re_rgb or die "Invalid rgb2 color, must be in 'ffffff' form";
      for ($r1, $g1, $b1, $r2, $g2, $b2) { $_ = hex $_ }
  
      return sprintf("%02x%02x%02x",
                     $r1 + rand()*($r2-$r1+1),
                     $g1 + rand()*($g2-$g1+1),
                     $b1 + rand()*($b2-$b1+1),
                 );
  }
  
  sub rand_rgb_colors {
      my $opts = ref $_[0] eq 'HASH' ? shift : {};
      my $num = shift // 1;
      my $light_color  = exists($opts->{light_color}) ? $opts->{light_color} : 1;
      my $max_attempts = $opts->{max_attempts} // 1000;
      my $avoid_colors = $opts->{avoid_colors};
  
      my @res;
      while (@res < $num) {
          my $num_attempts = 0;
          my $rgb;
          while (1) {
              $rgb = rand_rgb_color();
              my $reject = 0;
            REJECT: {
                  if ($light_color) {
                      do { $reject++; last } if rgb_is_dark($rgb);
                  } elsif (defined $light_color) {
                      do { $reject++; last } if rgb_is_light($rgb);
                  }
                  if ($avoid_colors && ref $avoid_colors eq 'ARRAY') {
                      do { $reject++; last } if grep { $rgb eq $_ } @$avoid_colors;
                  }
                  if ($avoid_colors && ref $avoid_colors eq 'HASH') {
                      do { $reject++; last } if $avoid_colors->{$rgb}
                  }
              } # REJECT
              last if !$reject;
              last if ++$num_attempts >= $max_attempts;
          }
          push @res, $rgb;
      }
      @res;
  }
  
  sub reverse_rgb_color {
      my ($rgb) = @_;
  
      my ($r, $g, $b) =
          $rgb =~ $re_rgb or die "Invalid rgb color, must be in 'ffffff' form";
      for ($r, $g, $b) { $_ = hex $_ }
  
      return sprintf("%02x%02x%02x", 255-$r, 255-$g, 255-$b);
  }
  
  sub rgb2grayscale {
      my ($rgb) = @_;
  
      my ($r, $g, $b) =
          $rgb =~ $re_rgb or die "Invalid rgb color, must be in 'ffffff' form";
      for ($r, $g, $b) { $_ = hex $_ }
  
      # basically we just average the R, G, B
      my $avg = int(($r + $g + $b)/3);
      return sprintf("%02x%02x%02x", $avg, $avg, $avg);
  }
  
  sub rgb2int {
      my $rgb = shift;
  
      # just to check
      $rgb =~ $re_rgb or die "Invalid rgb color, must be in 'ffffff' form";
  
      hex($rgb);
  }
  
  sub rgb2sepia {
      my ($rgb) = @_;
  
      my ($r, $g, $b) =
          $rgb =~ $re_rgb or die "Invalid rgb color, must be in 'ffffff' form";
      for ($r, $g, $b) { $_ = hex $_ }
  
      # reference: http://www.techrepublic.com/blog/howdoi/how-do-i-convert-images-to-grayscale-and-sepia-tone-using-c/120
      my $or = ($r*0.393) + ($g*0.769) + ($b*0.189);
      my $og = ($r*0.349) + ($g*0.686) + ($b*0.168);
      my $ob = ($r*0.272) + ($g*0.534) + ($b*0.131);
      for ($or, $og, $ob) { $_ = 255 if $_ > 255 }
      return sprintf("%02x%02x%02x", $or, $og, $ob);
  }
  
  sub rgb_diff {
      my ($rgb1, $rgb2, $algo) = @_;
  
      $algo //= 'euclidean';
  
      my ($r1, $g1, $b1) =
          $rgb1 =~ $re_rgb or die "Invalid rgb1 color, must be in 'ffffff' form";
      my ($r2, $g2, $b2) =
          $rgb2 =~ $re_rgb or die "Invalid rgb2 color, must be in 'ffffff' form";
      for ($r1, $g1, $b1, $r2, $g2, $b2) { $_ = hex $_ }
  
      my $dr2 = ($r1-$r2)**2;
      my $dg2 = ($g1-$g2)**2;
      my $db2 = ($b1-$b2)**2;
  
      if ($algo eq 'approx1' || $algo eq 'approx2') {
          my $rm = ($r1 + $r2)/2;
          if ($algo eq 'approx1') {
              return (2*$dr2 + 4*$dg2 + 3*$db2 + $rm*($dr2 - $db2)/256 )**0.5;
          } else { # approx2
              if ($rm < 128) {
                  return (3*$dr2 + 4*$dg2 + 2*$db2)**0.5;
              } else {
                  return (2*$dr2 + 4*$dg2 + 3*$db2)**0.5;
              }
          }
      } elsif ($algo eq 'hsv_euclidean' || $algo eq 'hsv_hue1') {
          my $hsv1 = rgb2hsv($rgb1);
          my ($h1, $s1, $v1) = split / /, $hsv1;
          my $hsv2 = rgb2hsv($rgb2);
          my ($h2, $s2, $v2) = split / /, $hsv2;
  
          my $dh2 = ( _min(abs($h2-$h1), 360-abs($h2-$h1))/180 )**2;
          my $ds2 = ( $s2-$s1 )**2;
          my $dv2 = ( ($v2-$v1)/255.0 )**2;
  
          if ($algo eq 'hsv_hue1') {
              return (5*$dh2 + $ds2 + $dv2)**0.5;
          } else { # hsv_euclidean
              return ($dh2 + $ds2 + $dv2)**0.5;
          }
      } else { # euclidean
          return ($dr2 + $dg2 + $db2)**0.5;
      }
  }
  
  sub rgb_distance {
      my ($rgb1, $rgb2) = @_;
  
      my ($r1, $g1, $b1) =
          $rgb1 =~ $re_rgb or die "Invalid rgb1 color, must be in 'ffffff' form";
      my ($r2, $g2, $b2) =
          $rgb2 =~ $re_rgb or die "Invalid rgb2 color, must be in 'ffffff' form";
      for ($r1, $g1, $b1, $r2, $g2, $b2) { $_ = hex $_ }
  
      (($r1-$r2)**2 + ($g1-$g2)**2 + ($b1-$b2)**2)**0.5;
  }
  
  sub rgb_is_dark {
      my ($rgb) = @_;
      rgb_distance($rgb, "000000") < rgb_distance($rgb, "ffffff") ? 1:0;
  }
  
  sub rgb_is_light {
      my ($rgb) = @_;
      rgb_distance($rgb, "000000") > rgb_distance($rgb, "ffffff") ? 1:0;
  }
  
  sub _rgb_luminance {
      my ($r, $g, $b) = @_;
      0.2126*$r/255 + 0.7152*$g/255 + 0.0722*$b/255;
  }
  
  sub rgb_luminance {
      my ($rgb) = @_;
  
      my ($r, $g, $b) =
          $rgb =~ $re_rgb or die "Invalid rgb color, must be in 'ffffff' form";
      for ($r, $g, $b) { $_ = hex $_ }
  
      return _rgb_luminance($r, $g, $b);
  }
  
  sub tint_rgb_color {
      my ($rgb1, $rgb2, $pct) = @_;
  
      $pct //= 0.5;
  
      my ($r1, $g1, $b1) =
          $rgb1 =~ $re_rgb or die "Invalid rgb1 color, must be in 'ffffff' form";
      my ($r2, $g2, $b2) =
          $rgb2 =~ $re_rgb or die "Invalid rgb2 color, must be in 'ffffff' form";
      for ($r1, $g1, $b1, $r2, $g2, $b2) { $_ = hex $_ }
  
      my $lum = _rgb_luminance($r1, $g1, $b1);
  
      return sprintf("%02x%02x%02x",
                     $r1 + $pct*($r2-$r1)*$lum,
                     $g1 + $pct*($g2-$g1)*$lum,
                     $b1 + $pct*($b2-$b1)*$lum,
                 );
  }
  
  sub rgb2hsl {
      my ($rgb) = @_;
  
      my ($r, $g, $b) =
          $rgb =~ $re_rgb or die "Invalid rgb color, must be in 'ffffff' form";
      for ($r, $g, $b) { $_ = hex($_)/255 }
  
      my $max = $r;
      my $maxc = 'r';
      my $min = $r;
  
      if ($g > $max) {
          $max = $g;
          $maxc = 'g';
      }
      if ($b > $max) {
          $max = $b;
          $maxc = 'b';
      }
  
      if ($g < $min) {
          $min = $g;
      }
      if ($b < $min) {
          $min = $b;
      }
  
      my ($h, $s, $l);
      if ($max == $min) {
          $h = 0;
      } elsif ($maxc eq 'r') {
          $h = 60 * (($g - $b) / ($max - $min)) % 360;
      } elsif ($maxc eq 'g') {
          $h = (60 * (($b - $r) / ($max - $min)) + 120);
      } elsif ($maxc eq 'b') {
          $h = (60 * (($r - $g) / ($max - $min)) + 240);
      }
  
      $l = ($max + $min) / 2;
  
      if ($max == $min) {
          $s = 0;
      } elsif($l <= .5) {
          $s = ($max - $min) / ($max + $min);
      } else {
          $s = ($max - $min) / (2 - ($max + $min));
      }
  
      return sprintf("%.3g %.3g %.3g", $h, $s, $l);
  }
  
  sub rgb2hsv {
      my ($rgb) = @_;
  
      my ($r, $g, $b) =
          $rgb =~ $re_rgb or die "Invalid rgb color, must be in 'ffffff' form";
      for ($r, $g, $b) { $_ = hex($_)/255 }
  
      my $max = $r;
      my $maxc = 'r';
      my $min = $r;
  
      if ($g > $max) {
          $max = $g;
          $maxc = 'g';
      }
      if($b > $max) {
          $max = $b;
          $maxc = 'b';
      }
  
      if($g < $min) {
          $min = $g;
      }
      if($b < $min) {
          $min = $b;
      }
  
      my ($h, $s, $v);
  
      if ($max == $min) {
          $h = 0;
      } elsif ($maxc eq 'r') {
          $h = 60 * (($g - $b) / ($max - $min)) % 360;
      } elsif ($maxc eq 'g') {
          $h = (60 * (($b - $r) / ($max - $min)) + 120);
      } elsif ($maxc eq 'b') {
          $h = (60 * (($r - $g) / ($max - $min)) + 240);
      }
  
      $v = $max;
      if($max == 0) {
          $s = 0;
      } else {
          $s = 1 - ($min / $max);
      }
  
      return sprintf("%.3g %.3g %.3g", $h, $s, $v);
  }
  
  1;
  # ABSTRACT: Utilities related to RGB colors
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Color::RGB::Util - Utilities related to RGB colors
  
  =head1 VERSION
  
  This document describes version 0.599 of Color::RGB::Util (from Perl distribution Color-RGB-Util), released on 2019-08-20.
  
  =head1 SYNOPSIS
  
   use Color::RGB::Util qw(
       assign_rgb_color
       assign_rgb_dark_color
       assign_rgb_light_color
       int2rgb
       mix_2_rgb_colors
       mix_rgb_colors
       rand_rgb_color
       rand_rgb_colors
       reverse_rgb_color
       rgb2grayscale
       rgb2int
       rgb2sepia
       rgb_diff
       rgb_distance
       rgb_is_dark
       rgb_is_light
       rgb_luminance
       tint_rgb_color
   );
  
   say assign_rgb_color("foo");                    # 0b5d33
   say assign_rgb_dark_color("foo");               # 0b5d33
   say assign_rgb_light_color("foo");              # 85ae99
  
   say int2rgb(0xffffff);                          # ffffff
  
   say mix_2_rgb_colors('#ff0000', '#ffffff');     # pink (red + white)
   say mix_2_rgb_colors('ff0000', 'ffffff', 0.75); # pink with a whiter shade
  
   say mix_rgb_colors('ff0000', 1, 'ffffff', 1);   # pink (red + white 1 : 1)
   say mix_rgb_colors('ff0000', 1, 'ffffff', 3);   # pink with a whiter shade (red + white 1 : 3)
   say mix_rgb_colors('ff0000', 1, 'ffffff', 1, '0000ff', 0.5);   # bluish pink
  
   say rand_rgb_color();
   say rand_rgb_color('000000', '333333');         # limit range
  
   say rand_rgb_colors(
         {light_color => 1, avoid_colors=>[qw/ffffff ffcc00 ff00cc/],
         3);                                       # ("e9f3d7", "e0bbcc", "63f88c")
  
   say reverse_rgb_color('0033CC');                # => ffcc33
  
   say rgb2grayscale('0033CC');                    # => 555555
  
   say rgb2int("ffffff");                          # 16777215 (which is 0xffffff)
  
   say rgb2sepia('0033CC');                        # => 4d4535
  
   say rgb_distance('000000', '000000')            # => 0
   say rgb_distance('01f000', '04f400')            # => 5
   say rgb_distance('ffff00', 'ffffff')            # => 255
  
   say rgb_diff('000000', '000000');               # => 0
   say rgb_diff('01f000', '04f400');               # => 5
   say rgb_diff('ffff00', 'ffffff');               # => 255
   say rgb_diff('000000', '000000', 'approx1');    # => 0
   say rgb_diff('01f000', '04f400', 'approx1');    # => 9.06
   say rgb_diff('ffff00', 'ffffff', 'approx1');    # => 360.98
  
   say rgb_is_dark('404040');                      # => 1
   say rgb_is_dark('a0a0a0');                      # => 0
   say rgb_is_light('404040');                     # => 0
   say rgb_is_light('a0a0a0');                     # => 1
  
   say rgb_luminance('d090aa');                    # => ffcc33
  
   say tint_rgb_color('#ff8800', '#0033cc');       # => b36e3c
  
  =head1 DESCRIPTION
  
  =head1 FUNCTIONS
  
  None are exported by default, but they are exportable.
  
  =head2 assign_rgb_color
  
  Usage:
  
   my $rgb = assign_rgb_color($str);
  
  Map a string to an RGB color. This is done by producing SHA-1 digest (160bit, 20
  bytes) of the string, then taking the first, 10th, and last byte to become the
  RGB color.
  
  =head2 assign_rgb_dark_color
  
  Like L</assign_rgb_color> except that it will make sure the assigned color is
  dark.
  
  =head2 assign_rgb_light_color
  
  Like L</assign_rgb_color> except that it will make sure the assigned color is
  light.
  
  =head2 int2rgb
  
  Usage:
  
   my $rgb = int2rgb(0xffffff); # => ffffff
  
  Convert integer to RGB string.
  
  =head2 mix_2_rgb_colors
  
  Usage:
  
   my $mixed_rgb = mix_2_rgb_colors($rgb1, $rgb2, $pct);
  
  Mix 2 RGB colors. C<$pct> is a number between 0 and 1, by default 0.5 (halfway),
  the closer to 1 the closer the resulting color to C<$rgb2>.
  
  =head2 mix_rgb_colors
  
  Usage:
  
   my $mixed_rgb = mix_rgb_colors($color1, $weight1, $color2, $weight2, ...);
  
  Mix several RGB colors.
  
  =head2 rand_rgb_color
  
  Usage:
  
   my $rgb = rand_rgb_color([ $low_limit [ , $high_limit ] ]);
  
  Generate a random RGB color. You can specify the limit. Otherwise, they default
  to the full range (000000 to ffffff).
  
  =head2 rand_rgb_colors
  
  Usage:
  
   my @rgbs = rand_rgb_colors([ \%opts ], $num=1);
  
  Produce C<$num> random RGB colors, with some options. Will make reasonable
  attempt to make the colors different from one another.
  
  Known options:
  
  =over
  
  =item * light_color
  
  Boolean, default true. By default, this function will create light RGB colors,
  assuming the background color is dark, which is often the case in terminal. If
  this option is set to false, will create dark colors instead, If this option is
  set to undef, will create both dark and light colors.
  
  =item * avoid_colors
  
  Arrayref or hashref. List of colors to be avoided. You can put, for example,
  colors that you've already assigned/picked for your palette and don't want to
  use again.
  
  =item * max_attempts
  
  Uint, default 1000. Number of attempts to try generating the next random color
  if the generated color is rejected because it is light/dark, or because it's in
  C<avoid_colors>.
  
  When the number of attempts has been exceeded, the generated color is used
  anyway.
  
  =back
  
  =head2 reverse_rgb_color
  
  Usage:
  
   my $reversed = reverse_rgb_color($rgb);
  
  Reverse C<$rgb>.
  
  =head2 rgb2grayscale
  
  Usage:
  
   my $rgb_gs = rgb2grayscale($rgb);
  
  Convert C<$rgb> to grayscale RGB value.
  
  =head2 rgb2hsl
  
  Usage:
  
   my $hsl = rgb2hsl($rgb); # example: "0 1 0.5"
  
  Convert RGB (0-255) to HSL. The result is a space-separated H, S, L values.
  
  =head2 rgb2hsv
  
  Usage:
  
   my $hsv = rgb2hsv($rgb); # example: "0 1 255"
  
  Convert RGB (0-255) to HSV. The result is a space-separated H, S, V values.
  
  =head2 rgb2int
  
  Usage:
  
   my $int = rgb2int("ffffff"); # => 16777216, which is 0xffffff
  
  Convert RGB string to integer.
  
  =head2 rgb2sepia
  
  Usage:
  
   my $rgb_sepia = rgb2sepia($rgb);
  
  Convert C<$rgb> to sepia tone RGB value.
  
  =head2 rgb_diff
  
  Usage:
  
   my $dist = rgb_diff($rgb1, $rgb2[ , $algo ])
  
  Calculate difference between two RGB colors, using one of several algorithms.
  
  =over
  
  =item * euclidean
  
  The default. It calculates the distance as:
  
   ( (R1-R2)**2 + (G1-G2)**2 + (B1-B2)**2 )**0.5
  
  which is the same as what L</"rgb_distance">() would produce.
  
  =item * approx1
  
  This algorithm uses the following formula:
  
   ( 2*(R1-R2)**2 + 4*(G1-G2)**2 + 3*(B1-B2)**2 + Rm*((R1-R2)**2 - (B1-B2)**2)/256 )**0.5
  
  where, Rm or "R mean" is (R1+R2)/2.
  
  =item * approx2
  
  Like C<approx1>, but uses this formula:
  
   ( 2*(R1-R2)**2 + 4*(G1-G2)**2 + 3*(B1-B2)**2 )**0.5  # if Rm < 128
   ( 3*(R1-R2)**2 + 4*(G1-G2)**2 + 2*(B1-B2)**2 )**0.5  # otherwise
  
  =item * hsv_euclidean
  
  Convert the RGB values to HSV, then calculate the HSV distance. Please see
  source code for details.
  
  =item * hsv_hue1
  
  Like C<hsv_euclidean> but puts more emphasis on hue difference. This algorithm
  is used, for example, by L<Color::ANSI::Util> when mapping RGB 24bit color to
  the "closest" the ANSI 256-color or 16-color. This algorithm tends to choose the
  hued colors instead of favoring to fallback on white/gray, which is more
  preferred.
  
  =back
  
  For more details about color difference, refer to
  L<https://en.wikipedia.org/wiki/Color_difference>.
  
  =head2 rgb_distance
  
  Usage:
  
   my $dist = rgb_distance($rgb1, $rgb2)
  
  Calculate the euclidean RGB distance, using this formula:
  
   ( (R1-R2)**2 + (G1-G2)**2 + (B1-B2)**2 )**0.5
  
  For example, the distance between "000000" and "ffffff" is ~441.67, while the
  distance between "ffff00" and "ffffff" is 255.
  
  =head2 rgb_is_dark
  
  Usage:
  
   my $is_dark = rgb_is_dark($rgb)
  
  Return true if C<$rgb> is a "dark" color, which is determined by checking if the
  RGB distance to "000000" is smaller than to "ffffff".
  
  =head2 rgb_is_light
  
  Usage:
  
   my $is_light = rgb_is_light($rgb)
  
  Return true if C<$rgb> is a "light" color, which is determined by checking if
  the RGB distance to "000000" is larger than to "ffffff".
  
  =head2 rgb_luminance
  
  Usage:
  
   my $luminance = rgb_luminance($rgb);
  
  Calculate standard/objective luminance from RGB value using this formula:
  
   (0.2126*R) + (0.7152*G) + (0.0722*B)
  
  where R, G, and B range from 0 to 1. Return a number from 0 to 1.
  
  =head2 tint_rgb_color
  
  Usage:
  
   my $new_rgb = tint_rgb_color($rgb, $tint_rgb, $pct)
  
  Tint C<$rgb> with C<$tint_rgb>. $pct is by default 0.5. It is similar to mixing,
  but the less luminance the color is the less it is tinted with the tint color.
  This has the effect of black color still being black instead of becoming tinted.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Color-RGB-Util>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Color-RGB-Util>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Color-RGB-Util>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Color::ANSI::Util>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2019, 2018, 2015, 2014, 2013 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
COLOR_RGB_UTIL

    $main::fatpacked{"Color/Theme/Role.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'COLOR_THEME_ROLE';
  ## no critic (Subroutines::ProhibitReturnSort)
  
  package Color::Theme::Role;
  
  our $DATE = '2018-02-25'; # DATE
  our $VERSION = '0.020'; # VERSION
  
  use 5.010001;
  use Moo::Role;
  
  has color_theme_args  => (is => 'rw', default => sub { {} });
  has _all_color_themes => (is => 'rw');
  
  sub color_theme_module_prefix {
      my $self = shift;
  
      (ref($self) ? ref($self) : $self ) . '::ColorTheme';
  }
  
  sub color_theme {
      my $self = shift;
  
      if (!@_) { return $self->{color_theme} }
      my $ct = shift;
  
      my $p2 = "";
      if (!ref($ct)) {
          $p2 = " named $ct";
          $ct = $self->get_color_theme($ct);
      }
  
      my $err;
      if (!$ct->{no_color} && !$self->use_color) {
          $err = "color theme uses color but use_color is set to false";
      }
      die "Can't select color theme$p2: $err" if $err;
  
      $self->{color_theme} = $ct;
  }
  
  sub get_color_theme {
      my ($self, $ct) = @_;
  
      my $prefix = $self->color_theme_module_prefix;
      my $cts;
      my $pkg;
      if ($ct =~ s/(.+):://) {
          $pkg = "$prefix\::$1";
          my $pkgp = $pkg; $pkgp =~ s!::!/!g;
          require "$pkgp.pm";
          no strict 'refs';
          $cts = \%{"$pkg\::color_themes"};
      } else {
          #$cts = $self->list_color_themes(1);
          die "Please use SubPackage::name to choose color theme, ".
              "use list_color_themes() to list available themes";
      }
      $cts->{$ct} or die "Unknown color theme name '$ct'".
          ($pkg ? " in package $pkg" : "");
      ($cts->{$ct}{v} // 1.0) == 1.1 or die "Color theme '$ct' is too old ".
          "(v < 1.1)". ($pkg ? ", please upgrade $pkg" : "");
      $cts->{$ct};
  }
  
  sub get_theme_color {
      my ($self, $item_name) = @_;
  
      return undef if $self->{color_theme}{no_color};
      $self->{color_theme}{colors}{$item_name};
  }
  
  sub get_theme_color_as_rgb {
      my ($self, $item_name, $args) = @_;
      my $c = $self->get_theme_color($item_name);
      return undef unless defined($c);
  
      # resolve coderef color
      if (ref($c) eq 'CODE') {
          $args //= {};
          $c = $c->($self, %$args);
      }
  
      $c;
  }
  
  sub list_color_themes {
      require Module::List;
      require Module::Load;
  
      my ($self, $detail) = @_;
  
      my $prefix = $self->color_theme_module_prefix;
      my $all_ct = $self->_all_color_themes;
  
      if (!$all_ct) {
          my $mods = Module::List::list_modules("$prefix\::",
                                                {list_modules=>1, recurse=>1});
          no strict 'refs';
          $all_ct = {};
          for my $mod (sort keys %$mods) {
              #$log->tracef("Loading color theme module '%s' ...", $mod);
              Module::Load::load($mod);
              my $ct = \%{"$mod\::color_themes"};
              for (keys %$ct) {
                  my $cutmod = $mod;
                  $cutmod =~ s/^\Q$prefix\E:://;
                  my $name = "$cutmod\::$_";
                  $ct->{$_}{name} = $name;
                  $all_ct->{$name} = $ct->{$_};
              }
          }
          $self->_all_color_themes($all_ct);
      }
  
      if ($detail) {
          return $all_ct;
      } else {
          return sort keys %$all_ct;
      }
  }
  
  1;
  # ABSTRACT: Role for class wanting to support color themes
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Color::Theme::Role - Role for class wanting to support color themes
  
  =head1 VERSION
  
  This document describes version 0.020 of Color::Theme::Role (from Perl distribution Color-Theme-Role), released on 2018-02-25.
  
  =head1 DESCRIPTION
  
  This role is for class that wants to support color themes. Color theme is
  represented as a structure according to the specification described in
  L<Color::Theme>.
  
  B<Color theme module.> Color themes are put in modules under
  C<Color::Theme::Themes::> (configurable using C<color_theme_module_prefix>
  attribute). Each color theme modules can contain one or more color themes. The
  module must define a package global variable named C<%color_themes> that contain
  color themes keyed by their names. Example:
  
   package MyProject::ColorThemes::Default;
  
   our %color_themes = (
       no_color => {
           v => 1.1,
           summary => 'Special theme that means no color',
           colors => {
           },
           no_color => 1,
       },
  
       default => {
           v => 1.1,
           summary => 'Default color theme',
           colors => {
           },
       },
   );
  
  =head1 ATTRIBUTES
  
  =head2 color_theme => HASH
  
  Get/set color theme.
  
  =head2 color_theme_args => HASH
  
  Get/set arguments for color theme. This can be
  
  =head2 color_theme_module_prefix => STR (default: CLASS + C<::ColorTheme::>)
  
  Each project should have its own class prefix. For example, L<Text::ANSITable>
  has its color themes in C<Text::ANSITable::ColorTheme::> namespace,
  L<Data::Dump::Color> has them in C<Data::Dump::Color::ColorTheme::> and so on.
  
  =head1 METHODS
  
  =head2 $cl->list_color_themes($detail) => array
  
  Will search packages under C<color_theme_module_prefix> for color theme modules,
  then list all color themes for each module. If, for example, the color theme
  modules found are C<MyProject::ColorTheme::Default> and
  C<MyProject::ColorTheme::Extras>, will return something like:
  
   ['Default::theme1', 'Default::theme2', 'Extras::extra3', 'Extras::extra4']
  
  =head2 $cl->get_color_theme($name) => hash
  
  Get color theme hash data structure by name. Note that name must be prefixed by
  color theme module name (minus the C<color_theme_module_prefix>).
  
  =head2 $cl->get_theme_color($item_name) => str
  
  Get an item's color value from the current color theme (will get from the color
  theme's C<colors> hash, then the C<$item_name> key from that hash). If color
  value is a coderef, it will be
  
  =head2 $cl->get_theme_color_as_rgb($item_name, \%args) => str|hash
  
  Like C<get_theme_color>, but if the resulting color value is a coderef, will
  call that coderef, passing C<%args> to it and returning the value.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Color-Theme-Role>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Color-Theme-Role>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Color-Theme-Role>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Color::Theme>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2018 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
COLOR_THEME_ROLE

    $main::fatpacked{"Color/Theme/Role/ANSI.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'COLOR_THEME_ROLE_ANSI';
  package Color::Theme::Role::ANSI;
  
  our $DATE = '2018-02-25'; # DATE
  our $VERSION = '0.020'; # VERSION
  
  use 5.010001;
  use Moo::Role;
  
  use Color::ANSI::Util ();
  with 'Color::Theme::Role';
  with 'Term::App::Role::Attrs';
  
  sub theme_color_to_ansi {
      my ($self, $c, $args, $is_bg) = @_;
  
      # empty? skip
      return '' if !defined($c) || !length($c);
  
      # resolve coderef color
      if (ref($c) eq 'CODE') {
          $args //= {};
          $c = $c->($self, %$args);
      }
  
      my $coldepth = $self->color_depth;
  
      if ($coldepth >= 2**24) {
          if (ref $c) {
              my $ansifg = $c->{ansi_fg};
              $ansifg //= Color::ANSI::Util::ansi24bfg($c->{fg})
                  if defined $c->{fg};
              $ansifg //= "";
              my $ansibg = $c->{ansi_bg};
              $ansibg //= Color::ANSI::Util::ansi24bbg($c->{bg})
                  if defined $c->{bg};
              $ansibg //= "";
              $c = $ansifg . $ansibg;
          } else {
              $c = $is_bg ? Color::ANSI::Util::ansi24bbg($c) :
                  Color::ANSI::Util::ansi24bfg($c);
          }
      } elsif ($coldepth >= 256) {
          if (ref $c) {
              my $ansifg = $c->{ansi_fg};
              $ansifg //= Color::ANSI::Util::ansi256fg($c->{fg})
                  if defined $c->{fg};
              $ansifg //= "";
              my $ansibg = $c->{ansi_bg};
              $ansibg //= Color::ANSI::Util::ansi256bg($c->{bg})
                  if defined $c->{bg};
              $ansibg //= "";
              $c = $ansifg . $ansibg;
          } else {
              $c = $is_bg ? Color::ANSI::Util::ansi256bg($c) :
                  Color::ANSI::Util::ansi256fg($c);
          }
      } else {
          if (ref $c) {
              my $ansifg = $c->{ansi_fg};
              $ansifg //= Color::ANSI::Util::ansi16fg($c->{fg})
                  if defined $c->{fg};
              $ansifg //= "";
              my $ansibg = $c->{ansi_bg};
              $ansibg //= Color::ANSI::Util::ansi16bg($c->{bg})
                  if defined $c->{bg};
              $ansibg //= "";
              $c = $ansifg . $ansibg;
          } else {
              $c = $is_bg ? Color::ANSI::Util::ansi16bg($c) :
                  Color::ANSI::Util::ansi16fg($c);
          }
      }
      $c;
  }
  
  sub get_theme_color_as_ansi {
      my ($self, $item_name, $args) = @_;
      $self->theme_color_to_ansi(
          $self->get_theme_color($item_name),
          {name=>$item_name, %{ $args // {} }},
          $item_name =~ /_bg$/,
      );
  }
  
  1;
  # ABSTRACT: Role for class wanting to support color themes (ANSI support)
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Color::Theme::Role::ANSI - Role for class wanting to support color themes (ANSI support)
  
  =head1 VERSION
  
  This document describes version 0.020 of Color::Theme::Role::ANSI (from Perl distribution Color-Theme-Role), released on 2018-02-25.
  
  =head1 DESCRIPTION
  
  This role consumes L<Color::Theme::Role> and L<Term::App::Role::Attrs>.
  
  =head1 METHODS
  
  =head2 $cl->theme_color_to_ansi($color) => str
  
  =head2 $cl->get_theme_color_as_ansi($item_name, \%args) => str
  
  Like C<get_theme_color>, but if the resulting color value is a coderef, will
  call that coderef, passing C<%args> to it and returning the value. Also, will
  convert color theme to ANSI color escape codes.
  
  When converting to ANSI code, will consult C<color_depth> from
  L<Term::App::Role::Attr>.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Color-Theme-Role>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Color-Theme-Role>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Color-Theme-Role>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2018 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
COLOR_THEME_ROLE_ANSI

    $main::fatpacked{"Complete/Bash.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'COMPLETE_BASH';
  package Complete::Bash;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-01-28'; # DATE
  our $DIST = 'Complete-Bash'; # DIST
  our $VERSION = '0.334'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  use Log::ger;
  
  require Exporter;
  our @ISA = qw(Exporter);
  our @EXPORT_OK = qw(
                         point
                         parse_cmdline
                         join_wordbreak_words
                         format_completion
                 );
  
  our %SPEC;
  
  $SPEC{':package'} = {
      v => 1.1,
      summary => 'Completion routines for bash shell',
  };
  
  sub _expand_tilde {
      my ($user, $slash) = @_;
      my @ent;
      if (length $user) {
          @ent = getpwnam($user);
      } else {
          @ent = getpwuid($>);
          $user = $ent[0];
      }
      return $ent[7] . $slash if @ent;
      "~$user$slash"; # return as-is when failed
  }
  
  sub _add_unquoted {
      no warnings 'uninitialized';
  
      my ($word, $is_cur_word, $after_ws) = @_;
  
      #say "D:add_unquoted word=$word is_cur_word=$is_cur_word after_ws=$after_ws";
  
      $word =~ s!^(~)(\w*)(/|\z) |  # 1) tilde  2) username  3) optional slash
                 \\(.)           |  # 4) escaped char
                 \$(\w+)            # 5) variable name
                !
                    $1 ? (not($after_ws) || $is_cur_word ? "$1$2$3" : _expand_tilde($2, $3)) :
                        $4 ? $4 :
                            ($is_cur_word ? "\$$5" : $ENV{$5})
                                !egx;
      $word;
  }
  
  sub _add_double_quoted {
      no warnings 'uninitialized';
  
      my ($word, $is_cur_word) = @_;
  
      $word =~ s!\\(.)           |  # 1) escaped char
                 \$(\w+)            # 2) variable name
                !
                    $1 ? $1 :
                        ($is_cur_word ? "\$$2" : $ENV{$2})
                            !egx;
      $word;
  }
  
  sub _add_single_quoted {
      my $word = shift;
      $word =~ s/\\(.)/$1/g;
      $word;
  }
  
  $SPEC{point} = {
      v => 1.1,
      summary => 'Return line with point marked by a marker',
      description => <<'_',
  
  This is a utility function useful for testing/debugging. `parse_cmdline()`
  expects a command-line and a cursor position (`$line`, `$point`). This routine
  expects `$line` with a marker character (by default it's the caret, `^`) and
  return (`$line`, `$point`) to feed to `parse_cmdline()`.
  
  Example:
  
      point("^foo") # => ("foo", 0)
      point("fo^o") # => ("foo", 2)
  
  _
      args_as => 'array',
      args => {
          cmdline => {
              summary => 'Command-line which contains a marker character',
              schema => 'str*',
              pos => 0,
          },
          marker => {
              summary => 'Marker character',
              schema => ['str*', len=>1],
              default => '^',
              pos => 1,
          },
      },
      result_naked => 1,
  };
  sub point {
      my ($line, $marker) = @_;
      $marker //= '^';
  
      my $point = index($line, $marker);
      die "BUG: No marker '$marker' in line <$line>" unless $point >= 0;
      $line =~ s/\Q$marker\E//;
      ($line, $point);
  }
  
  $SPEC{parse_cmdline} = {
      v => 1.1,
      summary => 'Parse shell command-line for processing by completion routines',
      description => <<'_',
  
  This function basically converts `COMP_LINE` (str) and `COMP_POINT` (int) into
  something like (but not exactly the same as) `COMP_WORDS` (array) and
  `COMP_CWORD` (int) that bash supplies to shell functions.
  
  The differences with bash are (these differences are mostly for parsing
  convenience for programs that use this routine; this comparison is made against
  bash versions 4.2-4.3):
  
  1) quotes and backslashes are stripped (bash's `COMP_WORDS` contains all the
     quotes and backslashes);
  
  2) quoted phrase that contains spaces, or phrase that contains escaped spaces is
     parsed as a single word. For example:
  
      command "First argument" Second\ argument
  
     bash would split it as (represented as Perl):
  
      ["command", "\"First", "argument\"", "Second\\", "argument"]
  
     which is not very convenient. We parse it into:
  
      ["command", "First argument", "Second argument"]
  
  3) variables are substituted with their values from environment variables except
     for the current word (`COMP_WORDS[COMP_CWORD]`) (bash does not perform
     variable substitution for `COMP_WORDS`). However, note that special shell
     variables that are not environment variables like `$0`, `$_`, `$IFS` will not
     be replaced correctly because bash does not export those variables for us.
  
  4) tildes (`~`) are expanded with user's home directory except for the current
     word (bash does not perform tilde expansion for `COMP_WORDS`);
  
  Caveats:
  
  * Like bash, we group non-whitespace word-breaking characters into its own word.
    By default `COMP_WORDBREAKS` is:
  
      "'@><=;|&(:
  
    So if raw command-line is:
  
      command --foo=bar http://example.com:80 mail@example.org Foo::Bar
  
    then the parse result will be:
  
      ["command", "--foo", "=", "bar", "http", ":", "//example.com", ":", "80", "Foo", "::", "Bar"]
  
    which is annoying sometimes. But we follow bash here so we can more easily
    accept input from a joined `COMP_WORDS` if we write completion bash functions,
    e.g. (in the example, `foo` is a Perl script):
  
      _foo ()
      {
          local words=(${COMP_CWORDS[@]})
          # add things to words, etc
          local point=... # calculate the new point
          COMPREPLY=( `COMP_LINE="foo ${words[@]}" COMP_POINT=$point foo` )
      }
  
    To avoid these word-breaking characters to be split/grouped, we can escape
    them with backslash or quote them, e.g.:
  
      command "http://example.com:80" Foo\:\:Bar
  
    which bash will parse as:
  
      ["command", "\"http://example.com:80\"", "Foo\\:\\:Bar"]
  
    and we parse as:
  
      ["command", "http://example.com:80", "Foo::Bar"]
  
  * Due to the way bash parses the command line (see above), the two below are
    equivalent:
  
      % cmd --foo=bar
      % cmd --foo = bar
  
  Because they both expand to `['--foo', '=', 'bar']`. But obviously
  <pm:Getopt::Long> does not regard the two as equivalent.
  
  _
      args_as => 'array',
      args => {
          cmdline => {
              summary => 'Command-line, defaults to COMP_LINE environment',
              schema => 'str*',
              pos => 0,
          },
          point => {
              summary => 'Point/position to complete in command-line, '.
                  'defaults to COMP_POINT',
              schema => 'int*',
              pos => 1,
          },
          opts => {
              summary => 'Options',
              schema => 'hash*',
              description => <<'_',
  
  Optional. Known options:
  
  * `truncate_current_word` (bool). If set to 1, will truncate current word to the
    position of cursor, for example (`^` marks the position of cursor):
    `--vers^oo` to `--vers` instead of `--versoo`. This is more convenient when
    doing tab completion.
  
  _
              schema => 'hash*',
              pos => 2,
          },
      },
      result => {
          schema => ['array*', len=>2],
          description => <<'_',
  
  Return a 2-element array: `[$words, $cword]`. `$words` is array of str,
  equivalent to `COMP_WORDS` provided by bash to shell functions. `$cword` is an
  integer, roughly equivalent to `COMP_CWORD` provided by bash to shell functions.
  The word to be completed is at `$words->[$cword]`.
  
  Note that COMP_LINE includes the command name. If you want the command-line
  arguments only (like in `@ARGV`), you need to strip the first element from
  `$words` and reduce `$cword` by 1.
  
  
  _
      },
      result_naked => 1,
      links => [
      ],
  };
  sub parse_cmdline {
      no warnings 'uninitialized';
      my ($line, $point, $opts) = @_;
  
      $line  //= $ENV{COMP_LINE};
      $point //= $ENV{COMP_POINT} // 0;
  
      die "$0: COMP_LINE not set, make sure this script is run under ".
          "bash completion (e.g. through complete -C)\n" unless defined $line;
  
      log_trace "[compbash] line=<$line> point=<$point>"
          if $ENV{COMPLETE_BASH_TRACE};
  
      my @words;
      my $cword;
      my $pos = 0;
      my $pos_min_ws = 0;
      my $after_ws = 1; # XXX what does this variable mean?
      my $chunk;
      my $add_blank;
      my $is_cur_word;
      $line =~ s!(                                                         # 1) everything
                    (")((?: \\\\|\\"|[^"])*)(?:"|\z)(\s*)               |  #  2) open "  3) content  4) space after
                    (')((?: \\\\|\\'|[^'])*)(?:'|\z)(\s*)               |  #  5) open '  6) content  7) space after
                    ((?: \\\\|\\"|\\'|\\=|\\\s|[^"'@><=|&\(:\s])+)(\s*) |  #  8) unquoted word  9) space after
                    ([\@><=|&\(:]+) |                                      #  10) non-whitespace word-breaking characters
                    \s+
                )!
                    $pos += length($1);
                    #say "D: \$1=<$1> \$2=<$3> \$3=<$3> \$4=<$4> \$5=<$5> \$6=<$6> \$7=<$7> \$8=<$8> \$9=<$9> \$10=<$10>";
                    #say "D:<$1> pos=$pos, point=$point, cword=$cword, after_ws=$after_ws";
  
                    if ($2 || $5 || defined($8)) {
                        # double-quoted/single-quoted/unquoted chunk
  
                        if (not(defined $cword)) {
                            $pos_min_ws = $pos - length($2 ? $4 : $5 ? $7 : $9);
                            #say "D:pos_min_ws=$pos_min_ws";
                            if ($point <= $pos_min_ws) {
                                $cword = @words - ($after_ws ? 0 : 1);
                            } elsif ($point < $pos) {
                                $cword = @words + 1 - ($after_ws ? 0 : 1);
                                $add_blank = 1;
                            }
                        }
  
                        if ($after_ws) {
                            $is_cur_word = defined($cword) && $cword==@words;
                        } else {
                            $is_cur_word = defined($cword) && $cword==@words-1;
                        }
                        #say "D:is_cur_word=$is_cur_word";
                        $chunk =
                            $2 ? _add_double_quoted($3, $is_cur_word) :
                                $5 ? _add_single_quoted($6) :
                                _add_unquoted($8, $is_cur_word, $after_ws);
                        if ($opts && $opts->{truncate_current_word} &&
                                $is_cur_word && $pos > $point) {
                            $chunk = substr(
                                $chunk, 0, length($chunk)-($pos_min_ws-$point));
                            #say "D:truncating current word to <$chunk>";
                        }
                        if ($after_ws) {
                            push @words, $chunk;
                        } else {
                            $words[-1] .= $chunk;
                        }
                        if ($add_blank) {
                            push @words, '';
                            $add_blank = 0;
                        }
                        $after_ws = ($2 ? $4 : $5 ? $7 : $9) ? 1:0;
  
                    } elsif ($10) {
                        # non-whitespace word-breaking characters
                        push @words, $10;
                        $after_ws = 1;
                    } else {
                        # whitespace
                        $after_ws = 1;
                    }
      !egx;
  
      $cword //= @words;
      $words[$cword] //= '';
  
      log_trace "[compbash] words=%s, cword=%s", \@words, $cword
          if $ENV{COMPLETE_BASH_TRACE};
  
      [\@words, $cword];
  }
  
  $SPEC{join_wordbreak_words} = {
      v => 1.1,
      summary => 'Post-process parse_cmdline() result by joining some words',
      description => <<'_',
  
  `parse_cmdline()`, like bash, splits some characters that are considered as
  word-breaking characters:
  
      "'@><=;|&(:
  
  So if command-line is:
  
      command -MData::Dump bob@example.org
  
  then they will be parsed as:
  
      ["command", "-MData", "::", "Dump", "bob", '@', "example.org"]
  
  Normally in Perl applications, we want `:`, `@` to be part of word. So this
  routine will convert the above into:
  
      ["command", "-MData::Dump", 'bob@example.org']
  
  _
  };
  sub join_wordbreak_words {
      my ($words, $cword) = @_;
      my $new_words = [];
      my $i = -1;
      while (++$i < @$words) {
          my $w = $words->[$i];
          if ($w =~ /\A[\@=:]+\z/) {
              if (@$new_words and $#$new_words != $cword) {
                  $new_words->[-1] .= $w;
                  $cword-- if $cword >= $i || $cword >= @$new_words;
              } else {
                  push @$new_words, $w;
              }
              if ($i+1 < @$words) {
                  $i++;
                  $new_words->[-1] .= $words->[$i];
                  $cword-- if $cword >= $i || $cword >= @$new_words;
              }
          } else {
              push @$new_words, $w;
          }
      }
      [$new_words, $cword];
  }
  
  sub _terminal_width {
      # XXX need to cache?
      if (eval { require Term::Size; 1 }) {
          my ($cols, undef) = Term::Size::chars(*STDOUT{IO});
          $cols // 80;
      } else {
          $ENV{COLUMNS} // 80;
      }
  }
  
  # given terminal width & number of columns, calculate column width
  sub _column_width {
      my ($terminal_width, $num_columns) = @_;
      if (defined $num_columns && $num_columns > 0) {
          int( ($terminal_width - ($num_columns-1)*2) / $num_columns ) - 1;
      } else {
          undef;
      }
  }
  
  # given terminal width & column width, calculate number of columns
  sub _num_columns {
      my ($terminal_width, $column_width) = @_;
      my $n = int( ($terminal_width+2) / ($column_width+2) );
      $n >= 1 ? $n : 1;
  }
  
  $SPEC{format_completion} = {
      v => 1.1,
      summary => 'Format completion for output (for shell)',
      description => <<'_',
  
  Bash accepts completion reply in the form of one entry per line to STDOUT. Some
  characters will need to be escaped. This function helps you do the formatting,
  with some options.
  
  This function accepts completion answer structure as described in the `Complete`
  POD. Aside from `words`, this function also recognizes these keys:
  
  _
      args_as => 'array',
      args => {
          completion => {
              summary => 'Completion answer structure',
              description => <<'_',
  
  Either an array or hash. See function description for more details.
  
  _
              schema=>['any*' => of => ['hash*', 'array*']],
              req=>1,
              pos=>0,
          },
          opts => {
              summary => 'Specify options',
              schema=>'hash*',
              pos=>1,
              description => <<'_',
  
  Known options:
  
  * as
  
    Either `string` (the default) or `array` (to return array of lines instead of
    the lines joined together). Returning array is useful if you are doing
    completion inside `Term::ReadLine`, for example, where the library expects an
    array.
  
  * esc_mode
  
    Escaping mode for entries. Either `default` (most nonalphanumeric characters
    will be escaped), `shellvar` (like `default`, but dollar sign `$` will also be
    escaped, convenient when completing environment variables for example),
    `filename` (currently equals to `default`), `option` (currently equals to
    `default`), or `none` (no escaping will be done).
  
  * word
  
    A workaround. String. For now, see source code for more details.
  
  * show_summaries
  
    Whether to show item's summaries. Boolean, default is from
    COMPLETE_BASH_SHOW_SUMMARIES environment variable or 1.
  
    An answer item contain summary, which is a short description about the item,
    e.g.:
  
        [{word=>"-a"    , summary=>"Show hidden files"},
         {word=>"-l"    , summary=>"Show details"},
         {word=>"--sort", summary=>"Specify sort order"}],
  
    When summaries are not shown, user will just be seeing something like:
  
        -a
        -l
        --sort
  
    But when summaries are shown, user will see:
  
        -a         -- Show hidden files
        -l         -- Show details
        --sort     -- Specify sort order
  
    which is quite helpful.
  
  * workaround_with_wordbreaks
  
    Boolean. Default is true. See source code for more details.
  
  _
  
          },
      },
      result => {
          summary => 'Formatted string (or array, if `as` is set to `array`)',
          schema => ['any*' => of => ['str*', 'array*']],
      },
      result_naked => 1,
  };
  sub format_completion {
      my ($hcomp, $opts) = @_;
  
      $opts //= {};
  
      $hcomp = {words=>$hcomp} unless ref($hcomp) eq 'HASH';
      my $words    = $hcomp->{words};
      my $as       = $opts->{as} // 'string';
      # 'escmode' key is deprecated (Complete 0.11-) and will be removed later
      my $esc_mode = $opts->{esc_mode} // $ENV{COMPLETE_BASH_DEFAULT_ESC_MODE} //
          'default';
      my $path_sep = $hcomp->{path_sep};
  
      # we keep the original words (before formatted with summaries) when we want
      # to use fzf instead of passing to bash directly
      my @words;
      my @summaries;
      my @res;
      my $has_summary;
  
      my $code_return_message = sub {
          # display a message instead of list of words. we send " " (ASCII space)
          # which bash does not display, so we can display a line of message while
          # the user does not get the message as the completion. I've also tried
          # \000 to \037 instead of space (\040) but nothing works better.
          my $msg = shift;
          if ($msg =~ /\A /) {
              $msg =~ s/\A +//;
              $msg = " (empty message)" unless length $msg;
          }
          return (sprintf("%-"._terminal_width()."s", $msg), " ");
      };
  
    FORMAT_MESSAGE:
      # display a message instead of list of words. we send " " (ASCII space)
      # which bash does not display, so we can display a line of message while the
      # user does not get the message as the completion. I've also tried \000 to
      # \037 instead of space (\040) but nothing works better.
      if (defined $hcomp->{message}) {
          @res = $code_return_message->($hcomp->{message});
          goto RETURN_RES;
      }
  
    WORKAROUND_PREVENT_BASH_FROM_INSERTING_SPACE:
      {
          last unless @$words == 1;
          if (defined $path_sep) {
              my $re = qr/\Q$path_sep\E\z/;
              my $word;
              if (ref $words->[0] eq 'HASH') {
                  $words = [$words->[0], {word=>"$words->[0]{word} "}] if
                      $words->[0]{word} =~ $re;
              } else {
                  $words = [$words->[0], "$words->[0] "]
                      if $words->[0] =~ $re;
              }
              last;
          }
  
          if ($hcomp->{is_partial} ||
                  ref $words->[0] eq 'HASH' && $words->[0]{is_partial}) {
              if (ref $words->[0] eq 'HASH') {
                  $words = [$words->[0], {word=>"$words->[0]{word} "}];
              } else {
                  $words = [$words->[0], "$words->[0] "];
              }
              last;
          }
      }
  
    WORKAROUND_WITH_WORDBREAKS:
      # this is a workaround. since bash breaks words using characters in
      # $COMP_WORDBREAKS, which by default is "'@><=;|&(: this presents a problem
      # we often encounter: if we want to provide with a list of strings
      # containing say ':', most often Perl modules/packages, if user types e.g.
      # "Text::AN" and we provide completion ["Text::ANSI"] then bash will change
      # the word at cursor to become "Text::Text::ANSI" since it sees the current
      # word as "AN" and not "Text::AN". the workaround is to chop /^Text::/ from
      # completion answers. btw, we actually chop /^text::/i to handle
      # case-insensitive matching, although this does not have the ability to
      # replace the current word (e.g. if we type 'text::an' then bash can only
      # replace the current word 'an' with 'ANSI).
      {
          last unless $opts->{workaround_with_wordbreaks} // 1;
          last unless defined $opts->{word};
  
          if ($opts->{word} =~ s/(.+[\@><=;|&\(:])//) {
              my $prefix = $1;
              for (@$words) {
                  if (ref($_) eq 'HASH') {
                      $_->{word} =~ s/\A\Q$prefix\E//i;
                  } else {
                      s/\A\Q$prefix\E//i;
                  }
              }
          }
      }
  
    ESCAPE_WORDS:
      for my $entry (@$words) {
          my $word    = ref($entry) eq 'HASH' ? $entry->{word}    : $entry;
          my $summary = (ref($entry) eq 'HASH' ? $entry->{summary} : undef) // '';
          if ($esc_mode eq 'shellvar') {
              # escape $ also
              $word =~ s!([^A-Za-z0-9,+._/:~-])!\\$1!g;
          } elsif ($esc_mode eq 'none') {
              # no escaping
          } else {
              # default
              $word =~ s!([^A-Za-z0-9,+._/:\$~-])!\\$1!g;
          }
          push @words, $word;
          push @summaries, $summary;
          $has_summary = 1 if length $summary;
      }
  
      my $summary_align = $ENV{COMPLETE_BASH_SUMMARY_ALIGN} // 'left';
      my $max_columns = $ENV{COMPLETE_BASH_MAX_COLUMNS} // 0;
      my $terminal_width = _terminal_width();
      my $column_width = _column_width($terminal_width, $max_columns);
  
      #warn "terminal_width=$terminal_width, column_width=".($column_width // 'undef')."\n";
  
    FORMAT_SUMMARIES: {
          @res = @words;
          last if @words <= 1;
          last unless $has_summary;
          last unless $opts->{show_summaries} //
              $ENV{COMPLETE_BASH_SHOW_SUMMARIES} // 1;
          my $max_entry_width   = 8;
          my $max_summ_width = 0;
          for (0..$#words) {
              $max_entry_width = length $words[$_]
                  if $max_entry_width < length $words[$_];
              $max_summ_width = length $summaries[$_]
                  if $max_summ_width < length $summaries[$_];
          }
          #warn "max_entry_width=$max_entry_width, max_summ_width=$max_summ_width\n";
          if ($summary_align eq 'right') {
              # if we are aligning summary to the right, we want to fill column
              # width width
              if ($max_columns <= 0) {
                  $max_columns = _num_columns(
                      $terminal_width, ($max_entry_width + 2 + $max_summ_width));
              }
              $column_width = _column_width($terminal_width, $max_columns);
              my $new_max_summ_width = $column_width - 2 - $max_entry_width;
              $max_summ_width = $new_max_summ_width
                  if $max_summ_width < $new_max_summ_width;
              #warn "max_columns=$max_columns, column_width=$column_width, max_summ_width=$max_summ_width\n";
          }
  
          for (0..$#words) {
              my $summary = $summaries[$_];
              if (length $summary) {
                  $res[$_] = sprintf(
                      "%-${max_entry_width}s |%".
                          ($summary_align eq 'right' ? $max_summ_width : '')."s",
                      $words[$_], $summary);
              }
          }
      } # FORMAT_SUMMARIES
  
    MAX_COLUMNS: {
          last unless $max_columns > 0;
          my $max_entry_width = 0;
          for (@res) {
              $max_entry_width = length if $max_entry_width < length;
          }
          last if $max_entry_width >= $column_width;
          for (@res) {
              $_ .= " " x ($column_width - length) if $column_width > length;
          }
      }
  
    PASS_TO_FZF: {
          last unless $ENV{COMPLETE_BASH_FZF};
          my $items = $ENV{COMPLETE_BASH_FZF_ITEMS} // 100;
          last unless @words >= $items;
  
          require File::Which;
          unless (File::Which::which("fzf")) {
              #@res = $code_return_message->("Cannot find fzf to filter ".
              #                                  scalar(@words)." items");
              goto RETURN_RES;
          }
  
          require IPC::Open2;
          local *CHLD_OUT;
          local *CHLD_IN;
          my $pid = IPC::Open2::open2(
              \*CHLD_OUT, \*CHLD_IN, "fzf", "-m", "-d:", "--with-nth=2..")
              or do {
                  @res = $code_return_message->("Cannot open fzf to filter ".
                                                    scalar(@words)." items");
                  goto RETURN_RES;
              };
  
          print CHLD_IN map { "$_:$res[$_]\n" } 0..$#res;
          close CHLD_IN;
  
          my @res_words;
          while (<CHLD_OUT>) {
              my ($index) = /\A([0-9]+)\:/ or next;
              push @res_words, $words[$index];
          }
          if (@res_words) {
              @res = join(" ", @res_words);
          } else {
              @res = ();
          }
          waitpid($pid, 0);
      }
  
    RETURN_RES:
      #use Data::Dump; warn Data::Dump::dump(\@res);
      if ($as eq 'array') {
          return \@res;
      } else {
          return join("", map {($_, "\n")} @res);
      }
  }
  
  1;
  # ABSTRACT: Completion routines for bash shell
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Complete::Bash - Completion routines for bash shell
  
  =head1 VERSION
  
  This document describes version 0.334 of Complete::Bash (from Perl distribution Complete-Bash), released on 2020-01-28.
  
  =head1 DESCRIPTION
  
  This module provides routines related to tab completion in bash shell.
  
  =head2 About programmable completion in bash
  
  Bash allows completion to come from various sources. The simplest is from a list
  of words (C<-W>):
  
   % complete -W "one two three four" somecmd
   % somecmd t<Tab>
   two  three
  
  Another source is from a bash function (C<-F>). The function will receive input
  in two variables: C<COMP_WORDS> (array, command-line chopped into words) and
  C<COMP_CWORD> (integer, index to the array of words indicating the cursor
  position). It must set an array variable C<COMPREPLY> that contains the list of
  possible completion:
  
   % _foo()
   {
     local cur
     COMPREPLY=()
     cur=${COMP_WORDS[COMP_CWORD]}
     COMPREPLY=($( compgen -W '--help --verbose --version' -- $cur ) )
   }
   % complete -F _foo foo
   % foo <Tab>
   --help  --verbose  --version
  
  And yet another source is an external command (C<-C>) including, from a Perl
  script. The command receives two environment variables: C<COMP_LINE> (string,
  raw command-line) and C<COMP_POINT> (integer, cursor location). Program must
  split C<COMP_LINE> into words, find the word to be completed, complete that, and
  return the list of words one per-line to STDOUT. An example:
  
   % cat foo-complete
   #!/usr/bin/perl
   use Complete::Bash qw(parse_cmdline format_completion);
   use Complete::Util qw(complete_array_elem);
   my ($words, $cword) = @{ parse_cmdline() };
   my $res = complete_array_elem(array=>[qw/--help --verbose --version/], word=>$words->[$cword]);
   print format_completion($res);
  
   % complete -C foo-complete foo
   % foo --v<Tab>
   --verbose --version
  
  =head2 About the routines in this module
  
  First of all, C<parse_cmdline()> is the function to parse raw command-line (such
  as what you get from bash in C<COMP_LINE> environment variable) into words. This
  makes it easy for the other functions to generate completion answer. See the
  documentation for that function for more details.
  
  C<format_completion()> is what you use to format completion answer structure for
  bash.
  
  =head1 FUNCTIONS
  
  
  =head2 format_completion
  
  Usage:
  
   format_completion($completion, $opts) -> str|array
  
  Format completion for output (for shell).
  
  Bash accepts completion reply in the form of one entry per line to STDOUT. Some
  characters will need to be escaped. This function helps you do the formatting,
  with some options.
  
  This function accepts completion answer structure as described in the C<Complete>
  POD. Aside from C<words>, this function also recognizes these keys:
  
  This function is not exported by default, but exportable.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<$completion>* => I<hash|array>
  
  Completion answer structure.
  
  Either an array or hash. See function description for more details.
  
  =item * B<$opts> => I<hash>
  
  Specify options.
  
  Known options:
  
  =over
  
  =item * as
  
  Either C<string> (the default) or C<array> (to return array of lines instead of
  the lines joined together). Returning array is useful if you are doing
  completion inside C<Term::ReadLine>, for example, where the library expects an
  array.
  
  =item * esc_mode
  
  Escaping mode for entries. Either C<default> (most nonalphanumeric characters
  will be escaped), C<shellvar> (like C<default>, but dollar sign C<$> will also be
  escaped, convenient when completing environment variables for example),
  C<filename> (currently equals to C<default>), C<option> (currently equals to
  C<default>), or C<none> (no escaping will be done).
  
  =item * word
  
  A workaround. String. For now, see source code for more details.
  
  =item * show_summaries
  
  Whether to show item's summaries. Boolean, default is from
  COMPLETE_BASH_SHOW_SUMMARIES environment variable or 1.
  
  An answer item contain summary, which is a short description about the item,
  e.g.:
  
    [{word=>"-a"    , summary=>"Show hidden files"},
     {word=>"-l"    , summary=>"Show details"},
     {word=>"--sort", summary=>"Specify sort order"}],
  
  When summaries are not shown, user will just be seeing something like:
  
    -a
    -l
    --sort
  
  But when summaries are shown, user will see:
  
    -a         -- Show hidden files
    -l         -- Show details
    --sort     -- Specify sort order
  
  which is quite helpful.
  
  =item * workaround_with_wordbreaks
  
  Boolean. Default is true. See source code for more details.
  
  =back
  
  =back
  
  Return value: Formatted string (or array, if `as` is set to `array`) (str|array)
  
  
  
  =head2 join_wordbreak_words
  
  Usage:
  
   join_wordbreak_words() -> [status, msg, payload, meta]
  
  Post-process parse_cmdline() result by joining some words.
  
  C<parse_cmdline()>, like bash, splits some characters that are considered as
  word-breaking characters:
  
   "'@><=;|&(:
  
  So if command-line is:
  
   command -MData::Dump bob@example.org
  
  then they will be parsed as:
  
   ["command", "-MData", "::", "Dump", "bob", '@', "example.org"]
  
  Normally in Perl applications, we want C<:>, C<@> to be part of word. So this
  routine will convert the above into:
  
   ["command", "-MData::Dump", 'bob@example.org']
  
  This function is not exported by default, but exportable.
  
  No arguments.
  
  Returns an enveloped result (an array).
  
  First element (status) is an integer containing HTTP status code
  (200 means OK, 4xx caller error, 5xx function error). Second element
  (msg) is a string containing error message, or 'OK' if status is
  200. Third element (payload) is optional, the actual result. Fourth
  element (meta) is called result metadata and is optional, a hash
  that contains extra information.
  
  Return value:  (any)
  
  
  
  =head2 parse_cmdline
  
  Usage:
  
   parse_cmdline($cmdline, $point, $opts) -> array
  
  Parse shell command-line for processing by completion routines.
  
  This function basically converts C<COMP_LINE> (str) and C<COMP_POINT> (int) into
  something like (but not exactly the same as) C<COMP_WORDS> (array) and
  C<COMP_CWORD> (int) that bash supplies to shell functions.
  
  The differences with bash are (these differences are mostly for parsing
  convenience for programs that use this routine; this comparison is made against
  bash versions 4.2-4.3):
  
  1) quotes and backslashes are stripped (bash's C<COMP_WORDS> contains all the
     quotes and backslashes);
  
  2) quoted phrase that contains spaces, or phrase that contains escaped spaces is
     parsed as a single word. For example:
  
   command "First argument" Second\ argument
  
     bash would split it as (represented as Perl):
  
   ["command", "\"First", "argument\"", "Second\\", "argument"]
  
     which is not very convenient. We parse it into:
  
   ["command", "First argument", "Second argument"]
  
  3) variables are substituted with their values from environment variables except
     for the current word (C<COMP_WORDS[COMP_CWORD]>) (bash does not perform
     variable substitution for C<COMP_WORDS>). However, note that special shell
     variables that are not environment variables like C<$0>, C<$_>, C<$IFS> will not
     be replaced correctly because bash does not export those variables for us.
  
  4) tildes (C<~>) are expanded with user's home directory except for the current
     word (bash does not perform tilde expansion for C<COMP_WORDS>);
  
  Caveats:
  
  =over
  
  =item * Like bash, we group non-whitespace word-breaking characters into its own word.
  By default C<COMP_WORDBREAKS> is:
  
  "'@><=;|&(:
  
  So if raw command-line is:
  
  command --foo=bar http://example.com:80 mail@example.org Foo::Bar
  
  then the parse result will be:
  
  ["command", "--foo", "=", "bar", "http", ":", "//example.com", ":", "80", "Foo", "::", "Bar"]
  
  which is annoying sometimes. But we follow bash here so we can more easily
  accept input from a joined C<COMP_WORDS> if we write completion bash functions,
  e.g. (in the example, C<foo> is a Perl script):
  
  I<foo ()
  {
      local words=(${COMP>CWORDS[@]})
      # add things to words, etc
      local point=... # calculate the new point
      COMPREPLY=( C<COMP_LINE="foo ${words[@]}" COMP_POINT=$point foo> )
  }
  
  To avoid these word-breaking characters to be split/grouped, we can escape
  them with backslash or quote them, e.g.:
  
  command "http://example.com:80" Foo\:\:Bar
  
  which bash will parse as:
  
  ["command", "\"http://example.com:80\"", "Foo\:\:Bar"]
  
  and we parse as:
  
  ["command", "http://example.com:80", "Foo::Bar"]
  
  =item * Due to the way bash parses the command line (see above), the two below are
  equivalent:
  
  % cmd --foo=bar
  % cmd --foo = bar
  
  =back
  
  Because they both expand to C<['--foo', '=', 'bar']>. But obviously
  L<Getopt::Long> does not regard the two as equivalent.
  
  This function is not exported by default, but exportable.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<$cmdline> => I<str>
  
  Command-line, defaults to COMP_LINE environment.
  
  =item * B<$opts> => I<hash>
  
  Options.
  
  Optional. Known options:
  
  =over
  
  =item * C<truncate_current_word> (bool). If set to 1, will truncate current word to the
  position of cursor, for example (C<^> marks the position of cursor):
  C<--vers^oo> to C<--vers> instead of C<--versoo>. This is more convenient when
  doing tab completion.
  
  =back
  
  =item * B<$point> => I<int>
  
  Point/position to complete in command-line, defaults to COMP_POINT.
  
  =back
  
  Return value:  (array)
  
  
  Return a 2-element array: C<[$words, $cword]>. C<$words> is array of str,
  equivalent to C<COMP_WORDS> provided by bash to shell functions. C<$cword> is an
  integer, roughly equivalent to C<COMP_CWORD> provided by bash to shell functions.
  The word to be completed is at C<< $words-E<gt>[$cword] >>.
  
  Note that COMP_LINE includes the command name. If you want the command-line
  arguments only (like in C<@ARGV>), you need to strip the first element from
  C<$words> and reduce C<$cword> by 1.
  
  
  
  =head2 point
  
  Usage:
  
   point($cmdline, $marker) -> any
  
  Return line with point marked by a marker.
  
  This is a utility function useful for testing/debugging. C<parse_cmdline()>
  expects a command-line and a cursor position (C<$line>, C<$point>). This routine
  expects C<$line> with a marker character (by default it's the caret, C<^>) and
  return (C<$line>, C<$point>) to feed to C<parse_cmdline()>.
  
  Example:
  
   point("^foo") # => ("foo", 0)
   point("fo^o") # => ("foo", 2)
  
  This function is not exported by default, but exportable.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<$cmdline> => I<str>
  
  Command-line which contains a marker character.
  
  =item * B<$marker> => I<str> (default: "^")
  
  Marker character.
  
  =back
  
  Return value:  (any)
  
  =head1 ENVIRONMENT
  
  =head2 COMPLETE_BASH_DEFAULT_ESC_MODE
  
  Str. To provide default for the C<esc_mode> option in L</format_completion>.
  
  =head2 COMPLETE_BASH_FZF
  
  Bool. Whether to pass large completion answer to fzf instead of directly passing
  it to bash and letting bash page it with a simpler more-like internal pager. By
  default, large is defined as having at least 100 items (same bash's
  C<completion-query-items> setting). This can be configured via
  L</COMPLETE_BASH_FZF_ITEMS>.
  
  =head2 COMPLETE_BASH_FZF_ITEMS
  
  Uint. Default 100. The minimum number of items to trigger passing completion
  answer to fzf. See also: L</COMPLETE_BASH_FZF>.
  
  =head2 COMPLETE_BASH_MAX_COLUMNS
  
  Uint.
  
  Bash will show completion entries in one or several columns, depending on the
  terminal width and the length of the entries (much like a standard non-long
  `ls`). If you prefer completion entries to be shown in a single column no matter
  how wide your terminal is, or how short the entries are, you can set the value
  of this variable to 1. If you prefer a maximum of two columns, set to 2, and so
  on. L</format_completion> will pad the entries with sufficient spaces to limit
  the number of columns.
  
  =head2 COMPLETE_BASH_SHOW_SUMMARIES
  
  Bool. Will set the default for C<show_summaries> option in
  L</format_completion>.
  
  =head2 COMPLETE_BASH_SUMMARY_ALIGN
  
  String. Either C<left> (the default) or C<right>.
  
  The C<left> align looks something like this:
  
   --bar      Summary about the bar option
   --baz      Summary about the baz option
   --foo      Summary about the foo option
   --schapen  Summary about the schapen option
  
  The C<right> align will make the completion answer look like what you see in the
  B<fish> shell:
  
   --bar                        Summary about the bar option
   --baz                        Summary about the baz option
   --foo                        Summary about the foo option
   --schapen                Summary about the schapen option
  
  =head2 COMPLETE_BASH_TRACE
  
  Bool. If set to true, will produce more log statements to L<Log::ger>.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Complete-Bash>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Complete-Bash>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Complete-Bash>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Complete>, the convention that this module follows.
  
  Some higher-level modules that use this module (so you don't have to use this
  module directly): L<Getopt::Long::Complete> (via L<Complete::Getopt::Long>),
  L<Getopt::Long::Subcommand>, L<Perinci::CmdLine> (via
  L<Perinci::Sub::Complete>).
  
  Other modules related to bash shell tab completion: L<Bash::Completion>,
  L<Getopt::Complete>, L<Term::Bash::Completion::Generator>.
  
  Programmable Completion section in Bash manual:
  L<https://www.gnu.org/software/bash/manual/html_node/Programmable-Completion.html>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2016, 2015, 2014 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
COMPLETE_BASH

    $main::fatpacked{"Complete/Common.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'COMPLETE_COMMON';
  package Complete::Common;
  
  our $DATE = '2016-01-07'; # DATE
  our $VERSION = '0.22'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  use Exporter qw(import);
  our @EXPORT_OK = qw(
                         %arg_word
                 );
  
  our %EXPORT_TAGS = (
      all => \@EXPORT_OK
  );
  
  our %arg_word = (
      word => {
          summary => 'Word to complete',
          schema => ['str', default=>''],
          pos=>0,
          req=>1,
      },
  );
  
  our $OPT_CI          = ($ENV{COMPLETE_OPT_CI}          // 1) ? 1:0;
  our $OPT_WORD_MODE   = ($ENV{COMPLETE_OPT_WORD_MODE}   // 1) ? 1:0;
  our $OPT_CHAR_MODE   = ($ENV{COMPLETE_OPT_CHAR_MODE}   // 1) ? 1:0;
  our $OPT_FUZZY       = ($ENV{COMPLETE_OPT_FUZZY}       // 1)+0;
  our $OPT_MAP_CASE    = ($ENV{COMPLETE_OPT_MAP_CASE}    // 1) ? 1:0;
  our $OPT_EXP_IM_PATH = ($ENV{COMPLETE_OPT_EXP_IM_PATH} // 1) ? 1:0;
  our $OPT_DIG_LEAF    = ($ENV{COMPLETE_OPT_DIG_LEAF}    // 1) ? 1:0;
  
  1;
  # ABSTRACT: Common stuffs for completion routines
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Complete::Common - Common stuffs for completion routines
  
  =head1 VERSION
  
  This document describes version 0.22 of Complete::Common (from Perl distribution Complete-Common), released on 2016-01-07.
  
  =head1 DESCRIPTION
  
  This module defines some common arguments and settings. C<Complete::*> modules
  should use the default from these settings, to make it convenient for users to
  change some behaviors globally.
  
  The defaults are optimized for convenience and laziness for user typing and
  might change from release to release.
  
  =head2 C<$Complete::Common::OPT_CI> => bool (default: from COMPLETE_OPT_CI or 1)
  
  If set to 1, matching is done case-insensitively.
  
  In bash/readline, this is akin to setting C<completion-ignore-case>.
  
  =head2 C<$Complete::Common::OPT_WORD_MODE> => bool (default: from COMPLETE_OPT_WORD_MODE or 1)
  
  If set to 1, enable word-mode matching.
  
  Word mode matching is normally only done when exact matching fails to return any
  candidate. To give you an idea of how word-mode matching works, you can run
  Emacs and try its completion of filenames (C<C-x C-f>) or function names
  (C<M-x>). Basically, each string is split into words and matching is tried for
  all available word even non-adjacent ones. For example, if you have C<dua-d> and
  the choices are (C<dua-tiga>, C<dua-empat>, C<dua-lima-delapan>) then
  C<dua-lima-delapan> will match because C<d> matches C<delapan> even though the
  word is not adjacent. This is convenient when you have strings that are several
  or many words long: you can just type the starting letters of some of the words
  instead of just the starting letters of the whole string (which might need to be
  quite long before producing a unique match).
  
  =head2 C<$Complete::Common::OPT_CHAR_MODE> => bool (default: from COMPLETE_OPT_CHAR_MODE or 1)
  
  If set to 1, enable character-mode matching.
  
  This mode is like word-mode matching, except it works on a
  character-by-character basis. Basically, it will match if a word contains any
  letters of the string in the correct order. For example, C<ap> will match C<ap>,
  C<amp>, C<slap>, or C<cramp> (but will not match C<pa> or C<pram>).
  
  Character-mode matching is normally only done when exact matching and word-mode
  fail to return any candidate.
  
  =head2 C<$Complete::Common::OPT_FUZZY> => int (default: from COMPLETE_OPT_FUZZY or 1)
  
  Enable fuzzy matching (matching even though there are some spelling mistakes).
  The greater the number, the greater the tolerance. To disable fuzzy matching,
  set to 0.
  
  Fuzzy matching is normally only done when exact matching, word-mode, and
  char-mode matching fail to return any candidate.
  
  =head2 C<$Complete::Common::OPT_MAP_CASE> => bool (default: from COMPLETE_OPT_MAP_CASE or 1)
  
  This is exactly like C<completion-map-case> in readline/bash to treat C<_> and
  C<-> as the same when matching.
  
  All L<Complete::Path>-based modules (like L<Complete::File>,
  L<Complete::Module>, or L<Complete::Riap>) respect this setting.
  
  =head2 C<$Complete::Common::OPT_EXP_IM_PATH> => bool (default: from COMPLETE_OPT_EXP_IM_PATH or 1)
  
  Whether to "expand intermediate paths". What is meant by this is something like
  zsh: when you type something like C<cd /h/u/b/myscript> it can be completed to
  C<cd /home/ujang/bin/myscript>.
  
  All L<Complete::Path>-based modules (like L<Complete::File>,
  L<Complete::Module>, or L<Complete::Riap>) respect this setting.
  
  =head2 C<$Complete::Common::OPT_DIG_LEAF> => bool (default: from COMPLETE_OPT_DIG_LEAF or 1)
  
  (Experimental) When enabled, this option mimics what's seen on GitHub. If a
  directory entry only contains a single subentry, it will directly show the
  subentry (and subsubentry and so on) to save a number of tab presses.
  
  Suppose you have files like this:
  
   a
   b/c/d/e
   c
  
  If you complete for C<b> you will directly get C<b/c/d/e> (the leaf).
  
  This is currently experimental because if you want to complete only directories,
  you won't get b or b/c or b/c/d. Need to think how to solve this.
  
  =head1 ENVIRONMENT
  
  =head2 COMPLETE_OPT_CI => bool
  
  Set default for C<$Complete::Common::OPT_CI>.
  
  =head2 COMPLETE_OPT_FUZZY => int
  
  Set default for C<$Complete::Common::OPT_FUZZY>.
  
  =head2 COMPLETE_OPT_WORD_MODE => bool
  
  Set default for C<$Complete::Common::OPT_WORD_MODE>.
  
  =head2 COMPLETE_OPT_MAP_CASE => bool
  
  Set default for C<$Complete::Common::OPT_MAP_CASE>.
  
  =head2 COMPLETE_OPT_EXP_IM_PATH => bool
  
  Set default for C<$Complete::Common::OPT_EXP_IM_PATH>.
  
  =head2 COMPLETE_OPT_DIG_LEAF => bool
  
  Set default for C<$Complete::Common::OPT_DIG_LEAF>.
  
  =head1 SEE ALSO
  
  L<Complete>
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Complete-Common>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Complete-Common>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Complete-Common>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
COMPLETE_COMMON

    $main::fatpacked{"Complete/Env.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'COMPLETE_ENV';
  package Complete::Env;
  
  our $DATE = '2017-12-31'; # DATE
  our $VERSION = '0.400'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  use Complete::Common qw(:all);
  
  require Exporter;
  our @ISA = qw(Exporter);
  our @EXPORT_OK = qw(
                         complete_env
                         complete_env_elem
                         complete_path_env_elem
                 );
  
  our %SPEC;
  
  $SPEC{':package'} = {
      v => 1.1,
      summary => 'Completion routines related to environment variables',
  };
  
  $SPEC{complete_env} = {
      v => 1.1,
      summary => 'Complete from environment variables',
      description => <<'_',
  
  On Windows, environment variable names are all converted to uppercase. You can
  use case-insensitive option (`ci`) to match against original casing.
  
  _
      args => {
          %arg_word,
      },
      result_naked => 1,
      result => {
          schema => 'array',
      },
  };
  sub complete_env {
      require Complete::Util;
  
      my %args  = @_;
      my $word     = $args{word} // "";
      if ($word =~ /^\$/) {
          Complete::Util::complete_array_elem(
              word=>$word, array=>[map {"\$$_"} keys %ENV],
          );
      } else {
          Complete::Util::complete_array_elem(
              word=>$word, array=>[keys %ENV],
          );
      }
  }
  
  $SPEC{complete_env_elem} = {
      v => 1.1,
      summary => 'Complete from elements of an environment variable',
      description => <<'_',
  
  An environment variable like PATH contains colon- (or, on Windows, semicolon-)
  separated elements. This routine complete from the elements of such variable.
  
  _
      args => {
          %arg_word,
          env      => {
              summary => 'Name of environment variable to use',
              schema  => 'str*',
              req => 1,
              pos => 1,
          },
      },
      result_naked => 1,
      result => {
          schema => 'array',
      },
  };
  sub complete_env_elem {
      require Complete::Util;
  
      my %args  = @_;
      my $word  = $args{word} // "";
      my $env   = $args{env};
      my @elems;
      if ($^O eq 'MSWin32') {
          @elems = split /;/, ($ENV{$env} // '');
      } else {
          @elems = split /:/, ($ENV{$env} // '');
      }
      Complete::Util::complete_array_elem(
          word=>$word, array=>\@elems,
      );
  }
  
  $SPEC{complete_path_env_elem} = {
      v => 1.1,
      summary => 'Complete from elements of PATH environment variable',
      description => <<'_',
  
  PATH environment variable contains colon- (or, on Windows, semicolon-) separated
  elements. This routine complete from those elements.
  
  _
      args => {
          %arg_word,
      },
      result_naked => 1,
      result => {
          schema => 'array',
      },
  };
  sub complete_path_env_elem {
      my %args  = @_;
      complete_env_elem(word => $args{word}, env => 'PATH');
  }
  
  1;
  # ABSTRACT: Completion routines related to environment variables
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Complete::Env - Completion routines related to environment variables
  
  =head1 VERSION
  
  This document describes version 0.400 of Complete::Env (from Perl distribution Complete-Env), released on 2017-12-31.
  
  =head1 DESCRIPTION
  
  =head1 FUNCTIONS
  
  
  =head2 complete_env
  
  Usage:
  
   complete_env(%args) -> array
  
  Complete from environment variables.
  
  On Windows, environment variable names are all converted to uppercase. You can
  use case-insensitive option (C<ci>) to match against original casing.
  
  This function is not exported by default, but exportable.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<word>* => I<str> (default: "")
  
  Word to complete.
  
  =back
  
  Return value:  (array)
  
  
  =head2 complete_env_elem
  
  Usage:
  
   complete_env_elem(%args) -> array
  
  Complete from elements of an environment variable.
  
  An environment variable like PATH contains colon- (or, on Windows, semicolon-)
  separated elements. This routine complete from the elements of such variable.
  
  This function is not exported by default, but exportable.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<env>* => I<str>
  
  Name of environment variable to use.
  
  =item * B<word>* => I<str> (default: "")
  
  Word to complete.
  
  =back
  
  Return value:  (array)
  
  
  =head2 complete_path_env_elem
  
  Usage:
  
   complete_path_env_elem(%args) -> array
  
  Complete from elements of PATH environment variable.
  
  PATH environment variable contains colon- (or, on Windows, semicolon-) separated
  elements. This routine complete from those elements.
  
  This function is not exported by default, but exportable.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<word>* => I<str> (default: "")
  
  Word to complete.
  
  =back
  
  Return value:  (array)
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Complete-Env>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Complete-Env>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Complete-Env>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Complete>
  
  Other C<Complete::*> modules.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2017, 2016, 2015 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
COMPLETE_ENV

    $main::fatpacked{"Complete/File.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'COMPLETE_FILE';
  package Complete::File;
  
  our $DATE = '2019-12-18'; # DATE
  our $VERSION = '0.440'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  use Complete::Common qw(:all);
  use Complete::Util qw(hashify_answer);
  
  require Exporter;
  our @ISA = qw(Exporter);
  our @EXPORT_OK = qw(
                         complete_file
                         complete_dir
                 );
  
  our %SPEC;
  
  $SPEC{':package'} = {
      v => 1.1,
      summary => 'Completion routines related to files',
  };
  
  $SPEC{complete_file} = {
      v => 1.1,
      summary => 'Complete file and directory from local filesystem',
      args => {
          %arg_word,
          filter => {
              summary => 'Only return items matching this filter',
              description => <<'_',
  
  Filter can either be a string or a code.
  
  For string filter, you can specify a pipe-separated groups of sequences of these
  characters: f, d, r, w, x. Dash can appear anywhere in the sequence to mean
  not/negate. An example: `f` means to only show regular files, `-f` means only
  show non-regular files, `drwx` means to show only directories which are
  readable, writable, and executable (cd-able). `wf|wd` means writable regular
  files or writable directories.
  
  For code filter, you supply a coderef. The coderef will be called for each item
  with these arguments: `$name`. It should return true if it wants the item to be
  included.
  
  _
              schema  => ['any*' => {of => ['str*', 'code*']}],
              tags => ['category:filtering'],
          },
          file_regex_filter => {
              summary => 'Filter shortcut for file regex',
              description => <<'_',
  
  This is a shortcut for constructing a filter. So instead of using `filter`, you
  use this option. This will construct a filter of including only directories or
  regular files, and the file must match a regex pattern. This use-case is common.
  
  _
              schema => 're*',
              tags => ['category:filtering'],
          },
          exclude_dir => {
              schema => 'bool*',
              description => <<'_',
  
  This is also an alternative to specifying full `filter`. Set this to true if you
  do not want directories.
  
  If you only want directories, take a look at `complete_dir()`.
  
  _
              tags => ['category:filtering'],
          },
          file_ext_filter => {
              schema => ['any*', of=>['re*', ['array*',of=>'str*']]],
              description => <<'_',
  
  This is also an alternative to specifying full `filter` or `file_regex_filter`.
  You can set this to a regex or a set of extensions to accept. Note that like in
  `file_regex_filter`, directories of any name is also still allowed.
  
  _
              tags => ['category:filtering'],
          },
          starting_path => {
              schema  => 'str*',
              default => '.',
          },
          handle_tilde => {
              schema  => 'bool',
              default => 1,
          },
          allow_dot => {
              summary => 'If turned off, will not allow "." or ".." in path',
              description => <<'_',
  
  This is most useful when combined with `starting_path` option to prevent user
  going up/outside the starting path.
  
  _
              schema  => 'bool',
              default => 1,
          },
      },
      result_naked => 1,
      result => {
          schema => 'array',
      },
  };
  sub complete_file {
      require Complete::Path;
      require Encode;
      require File::Glob;
  
      my %args   = @_;
      my $word   = $args{word} // "";
      my $handle_tilde = $args{handle_tilde} // 1;
      my $allow_dot   = $args{allow_dot} // 1;
  
      # if word is starts with "~/" or "~foo/" replace it temporarily with user's
      # name (so we can restore it back at the end). this is to mimic bash
      # support. note that bash does not support case-insensitivity for "foo".
      my $result_prefix;
      my $starting_path = $args{starting_path} // '.';
      if ($handle_tilde && $word =~ s!\A(~[^/]*)/!!) {
          $result_prefix = "$1/";
          my @dir = File::Glob::bsd_glob($1); # glob will expand ~foo to /home/foo
          return [] unless @dir;
          $starting_path = Encode::decode('UTF-8', $dir[0]);
      } elsif ($allow_dot && $word =~ s!\A((?:\.\.?/+)+|/+)!!) {
          # just an optimization to skip sequences of '../'
          $starting_path = $1;
          $result_prefix = $1;
          $starting_path =~ s#/+\z## unless $starting_path =~ m!\A/!;
      }
  
      # bail if we don't allow dot and the path contains dot
      return [] if !$allow_dot &&
          $word =~ m!(?:\A|/)\.\.?(?:\z|/)!;
  
      # prepare list_func
      my $list = sub {
          my ($path, $intdir, $isint) = @_;
          opendir my($dh), $path or return undef;
          my @res;
          for (sort readdir $dh) {
              # skip . and .. if leaf is empty, like in bash
              next if ($_ eq '.' || $_ eq '..') && $intdir eq '';
              next if $isint && !(-d "$path/$_");
              push @res, Encode::decode('UTF-8', $_);
          }
          \@res;
      };
  
      # prepare filter_func
  
      # from the filter option
      my $filter;
      if ($args{filter} && !ref($args{filter})) {
          my @seqs = split /\s*\|\s*/, $args{filter};
          $filter = sub {
              my $name = shift;
              my @st = stat($name) or return 0;
              my $mode = $st[2];
              my $pass;
            SEQ:
              for my $seq (@seqs) {
                  my $neg = sub { $_[0] };
                  for my $c (split //, $seq) {
                      if    ($c eq '-') { $neg = sub { $_[0] ? 0 : 1 } }
                      elsif ($c eq 'r') { next SEQ unless $neg->($mode & 0400) }
                      elsif ($c eq 'w') { next SEQ unless $neg->($mode & 0200) }
                      elsif ($c eq 'x') { next SEQ unless $neg->($mode & 0100) }
                      elsif ($c eq 'f') { next SEQ unless $neg->($mode & 0100000)}
                      elsif ($c eq 'd') { next SEQ unless $neg->($mode & 0040000)}
                      else {
                          die "Unknown character in filter: $c (in $seq)";
                      }
                  }
                  $pass = 1; last SEQ;
              }
              $pass;
          };
      } elsif ($args{filter} && ref($args{filter}) eq 'CODE') {
          $filter = $args{filter};
      }
  
      # from the file_regex_filter option
      my $filter_fregex;
      if ($args{file_regex_filter}) {
          $filter_fregex = sub {
              my $name = shift;
              return 1 if -d $name;
              return 0 unless -f _;
              return 1 if $name =~ $args{file_regex_filter};
              0;
          };
      }
  
      # from the file_ext_filter option
      my $filter_fext;
      if ($args{file_ext_filter} && ref $args{file_ext_filter} eq 'Regexp') {
          $filter_fext = sub {
              my $name = shift;
              return 1 if -d $name;
              return 0 unless -f _;
              my $ext = $name =~ /\.(\w+)\z/ ? $1 : '';
              return 1 if $ext =~ $args{file_ext_filter};
              0;
          };
      } elsif ($args{file_ext_filter} && ref $args{file_ext_filter} eq 'ARRAY') {
          $filter_fext = sub {
              my $name = shift;
              return 1 if -d $name;
              return 0 unless -f _;
              my $ext = $name =~ /\.(\w+)\z/ ? $1 : '';
              if ($Complete::Common::OPT_CI) {
                  $ext = lc($ext);
                  for my $e (@{ $args{file_ext_filter} }) {
                      return 1 if $ext eq lc($e);
                  }
              } else {
                  for my $e (@{ $args{file_ext_filter} }) {
                      return 1 if $ext eq $e;
                  }
              }
              0;
          };
      }
  
      # from _dir (used by complete_dir)
      my $filter_dir;
      if ($args{_dir}) {
          $filter_dir = sub { return 0 unless (-d $_[0]); 1 };
      }
  
      # from exclude_dir option
      my $filter_xdir;
      if ($args{exclude_dir}) {
          $filter_xdir = sub { return 0 if (-d $_[0]); 1 };
      }
  
      # final filter sub
      my $final_filter = sub {
          my $name = shift;
          if ($filter_dir)    { return 0 unless $filter_dir->($name)    }
          if ($filter_xdir)   { return 0 unless $filter_xdir->($name)   }
          if ($filter)        { return 0 unless $filter->($name)        }
          if ($filter_fregex) { return 0 unless $filter_fregex->($name) }
          if ($filter_fext)   { return 0 unless $filter_fext->($name)   }
          1;
      };
  
      my $compres = Complete::Path::complete_path(
          word => $word,
          list_func => $list,
          is_dir_func => sub { -d $_[0] },
          filter_func => $final_filter,
          starting_path => $starting_path,
          result_prefix => $result_prefix,
      );
  
      # XXX why doesn't Complete::Path return hash answer with path_sep? we add
      # workaround here to enable path mode.
      hashify_answer($compres, {path_sep=>'/'});
  }
  
  $SPEC{complete_dir} = do {
      my $spec = {%{ $SPEC{complete_file} }}; # shallow copy
  
      $spec->{summary} = 'Complete directory from local filesystem '.
          '(wrapper for complete_dir() that only picks directories)';
      $spec->{args} = { %{$spec->{args}} }; # shallow copy of args
      delete $spec->{args}{file_regex_filter};
      delete $spec->{args}{file_ext_filter};
      delete $spec->{args}{exclude_dir};
  
      $spec;
  };
  sub complete_dir {
      my %args = @_;
  
      complete_file(%args, _dir=>1);
  }
  
  1;
  # ABSTRACT: Completion routines related to files
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Complete::File - Completion routines related to files
  
  =head1 VERSION
  
  This document describes version 0.440 of Complete::File (from Perl distribution Complete-File), released on 2019-12-18.
  
  =head1 DESCRIPTION
  
  =head1 FUNCTIONS
  
  
  =head2 complete_dir
  
  Usage:
  
   complete_dir(%args) -> array
  
  Complete directory from local filesystem (wrapper for complete_dir() that only picks directories).
  
  This function is not exported by default, but exportable.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<allow_dot> => I<bool> (default: 1)
  
  If turned off, will not allow "." or ".." in path.
  
  This is most useful when combined with C<starting_path> option to prevent user
  going up/outside the starting path.
  
  =item * B<filter> => I<str|code>
  
  Only return items matching this filter.
  
  Filter can either be a string or a code.
  
  For string filter, you can specify a pipe-separated groups of sequences of these
  characters: f, d, r, w, x. Dash can appear anywhere in the sequence to mean
  not/negate. An example: C<f> means to only show regular files, C<-f> means only
  show non-regular files, C<drwx> means to show only directories which are
  readable, writable, and executable (cd-able). C<wf|wd> means writable regular
  files or writable directories.
  
  For code filter, you supply a coderef. The coderef will be called for each item
  with these arguments: C<$name>. It should return true if it wants the item to be
  included.
  
  =item * B<handle_tilde> => I<bool> (default: 1)
  
  =item * B<starting_path> => I<str> (default: ".")
  
  =item * B<word>* => I<str> (default: "")
  
  Word to complete.
  
  =back
  
  Return value:  (array)
  
  
  
  =head2 complete_file
  
  Usage:
  
   complete_file(%args) -> array
  
  Complete file and directory from local filesystem.
  
  This function is not exported by default, but exportable.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<allow_dot> => I<bool> (default: 1)
  
  If turned off, will not allow "." or ".." in path.
  
  This is most useful when combined with C<starting_path> option to prevent user
  going up/outside the starting path.
  
  =item * B<exclude_dir> => I<bool>
  
  This is also an alternative to specifying full C<filter>. Set this to true if you
  do not want directories.
  
  If you only want directories, take a look at C<complete_dir()>.
  
  =item * B<file_ext_filter> => I<re|array[str]>
  
  This is also an alternative to specifying full C<filter> or C<file_regex_filter>.
  You can set this to a regex or a set of extensions to accept. Note that like in
  C<file_regex_filter>, directories of any name is also still allowed.
  
  =item * B<file_regex_filter> => I<re>
  
  Filter shortcut for file regex.
  
  This is a shortcut for constructing a filter. So instead of using C<filter>, you
  use this option. This will construct a filter of including only directories or
  regular files, and the file must match a regex pattern. This use-case is common.
  
  =item * B<filter> => I<str|code>
  
  Only return items matching this filter.
  
  Filter can either be a string or a code.
  
  For string filter, you can specify a pipe-separated groups of sequences of these
  characters: f, d, r, w, x. Dash can appear anywhere in the sequence to mean
  not/negate. An example: C<f> means to only show regular files, C<-f> means only
  show non-regular files, C<drwx> means to show only directories which are
  readable, writable, and executable (cd-able). C<wf|wd> means writable regular
  files or writable directories.
  
  For code filter, you supply a coderef. The coderef will be called for each item
  with these arguments: C<$name>. It should return true if it wants the item to be
  included.
  
  =item * B<handle_tilde> => I<bool> (default: 1)
  
  =item * B<starting_path> => I<str> (default: ".")
  
  =item * B<word>* => I<str> (default: "")
  
  Word to complete.
  
  =back
  
  Return value:  (array)
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Complete-File>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Complete-File>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Complete-File>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Complete>
  
  Other C<Complete::*> modules.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2019, 2017, 2016, 2015 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
COMPLETE_FILE

    $main::fatpacked{"Complete/Fish.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'COMPLETE_FISH';
  package Complete::Fish;
  
  our $DATE = '2020-01-29'; # DATE
  our $VERSION = '0.060'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  require Exporter;
  our @ISA = qw(Exporter);
  our @EXPORT_OK = qw(
                         format_completion
                 );
  
  require Complete::Bash;
  
  our %SPEC;
  
  $SPEC{':package'} = {
      v => 1.1,
      summary => 'Completion module for fish shell',
  };
  
  $SPEC{format_completion} = {
      v => 1.1,
      summary => 'Format completion for output (for shell)',
      description => <<'_',
  
  fish accepts completion reply in the form of one entry per line to STDOUT.
  Description can be added to each entry, prefixed by tab character.
  
  _
      args_as => 'array',
      args => {
          completion => {
              summary => 'Completion answer structure',
              description => <<'_',
  
  Either an array or hash, as described in `Complete`.
  
  _
              schema=>['any*' => of => ['hash*', 'array*']],
              req=>1,
              pos=>0,
          },
      },
      result => {
          summary => 'Formatted string (or array, if `as` key is set to `array`)',
          schema => ['any*' => of => ['str*', 'array*']],
      },
      result_naked => 1,
  };
  sub format_completion {
      my $comp = shift;
  
      my $as;
      my $entries;
  
      # we currently use Complete::Bash's rule because i haven't done a read up on
      # how exactly fish escaping rules are.
      if (ref $comp eq 'HASH') {
          $as = $comp->{as} // 'string';
          $entries = Complete::Bash::format_completion({%$comp}, {as=>'array'});
      } else {
          $as = 'string';
          $entries = Complete::Bash::format_completion({words=>$comp}, {as=>'array'});
      }
  
      # insert description
      {
          my $compary = ref($comp) eq 'HASH' ? $comp->{words} : $comp;
          for (my $i=0; $i<@$compary; $i++) {
  
              my $desc = (ref($compary->[$i]) eq 'HASH' ?
                              $compary->[$i]{description} : '' ) // '';
              $desc =~ s/\R/ /g;
              $entries->[$i] .= "\t$desc";
          }
      }
  
      # turn back to string if that's what the user wants
      if ($as eq 'string') {
          $entries = join("", map{"$_\n"} @$entries);
      }
      $entries;
  }
  
  1;
  # ABSTRACT: Completion module for fish shell
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Complete::Fish - Completion module for fish shell
  
  =head1 VERSION
  
  This document describes version 0.060 of Complete::Fish (from Perl distribution Complete-Fish), released on 2020-01-29.
  
  =head1 DESCRIPTION
  
  fish allows completion of option arguments to come from an external command,
  e.g.:
  
   % complete -c deluser -l user -d Username -a "(cat /etc/passwd|cut -d : -f 1)"
  
  The command is supposed to return completion entries one in a separate line.
  Description for each entry can be added, prefixed with a tab character. The
  provided function C<format_completion()> accept a completion answer structure
  and format it for fish. Example:
  
   format_completion(["a", "b", {word=>"c", description=>"Another letter"}])
  
  will result in:
  
   a
   b
   c       Another letter
  
  =head1 FUNCTIONS
  
  
  =head2 format_completion
  
  Usage:
  
   format_completion($completion) -> str|array
  
  Format completion for output (for shell).
  
  fish accepts completion reply in the form of one entry per line to STDOUT.
  Description can be added to each entry, prefixed by tab character.
  
  This function is not exported by default, but exportable.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<$completion>* => I<hash|array>
  
  Completion answer structure.
  
  Either an array or hash, as described in C<Complete>.
  
  
  =back
  
  Return value: Formatted string (or array, if `as` key is set to `array`) (str|array)
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Complete-Fish>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Complete-Fish>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Complete-Fish>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Complete>
  
  L<Complete::Bash>
  
  Fish manual.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2016, 2015, 2014 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
COMPLETE_FISH

    $main::fatpacked{"Complete/Getopt/Long.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'COMPLETE_GETOPT_LONG';
  package Complete::Getopt::Long;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-02-05'; # DATE
  our $DIST = 'Complete-Getopt-Long'; # DIST
  our $VERSION = '0.475'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  use Log::ger;
  
  require Exporter;
  our @ISA = qw(Exporter);
  our @EXPORT_OK = qw(
                         complete_cli_arg
                 );
  
  our %SPEC;
  
  our $COMPLETE_GETOPT_LONG_TRACE=$ENV{COMPLETE_GETOPT_LONG_TRACE} // 0;
  our $COMPLETE_GETOPT_LONG_DEFAULT_ENV = $ENV{COMPLETE_GETOPT_LONG_DEFAULT_ENV} // 1;
  our $COMPLETE_GETOPT_LONG_DEFAULT_FILE = $ENV{COMPLETE_GETOPT_LONG_DEFAULT_FILE} // 1;
  
  sub _default_completion {
      require Complete::Env;
      require Complete::File;
      require Complete::Util;
  
      my %args = @_;
      my $word = $args{word} // '';
  
      my $fres;
      log_trace('[comp][compgl] entering default completion routine') if $COMPLETE_GETOPT_LONG_TRACE;
  
      # try completing '$...' with shell variables
      if ($word =~ /\A\$/ && $COMPLETE_GETOPT_LONG_DEFAULT_ENV) {
          log_trace('[comp][compgl] completing shell variable') if $COMPLETE_GETOPT_LONG_TRACE;
          {
              my $compres = Complete::Env::complete_env(
                  word=>$word);
              last unless @$compres;
              $fres = {words=>$compres, esc_mode=>'shellvar'};
              goto RETURN_RES;
          }
          # if empty, fallback to searching file
      }
  
      # try completing '~foo' with user dir (appending / if user's home exists)
      if ($word =~ m!\A~([^/]*)\z! && $COMPLETE_GETOPT_LONG_DEFAULT_FILE) {
          log_trace("[comp][compgl] completing userdir, user=%s", $1) if $COMPLETE_GETOPT_LONG_TRACE;
          {
              eval { require Unix::Passwd::File };
              last if $@;
              my $res = Unix::Passwd::File::list_users(detail=>1);
              last unless $res->[0] == 200;
              my $compres = Complete::Util::complete_array_elem(
                  array=>[map {"~" . $_->{user} . ((-d $_->{home}) ? "/":"")}
                              @{ $res->[2] }],
                  word=>$word,
              );
              last unless @$compres;
              $fres = {words=>$compres, path_sep=>'/'};
              goto RETURN_RES;
          }
          # if empty, fallback to searching file
      }
  
      # try completing '~/blah' or '~foo/blah' as if completing file, but do not
      # expand ~foo (this is supported by complete_file(), so we just give it off
      # to the routine)
      if ($word =~ m!\A(~[^/]*)/! && $COMPLETE_GETOPT_LONG_DEFAULT_FILE) {
          log_trace("[comp][compgl] completing file, path=<%s>", $word) if $COMPLETE_GETOPT_LONG_TRACE;
          $fres = Complete::Util::hashify_answer(
              Complete::File::complete_file(word=>$word),
              {path_sep=>'/'}
          );
          goto RETURN_RES;
      }
  
      # try completing something that contains wildcard with glob. for
      # convenience, we add '*' at the end so that when user type [AB] it is
      # treated like [AB]*.
      require String::Wildcard::Bash;
      if (String::Wildcard::Bash::contains_wildcard($word) && $COMPLETE_GETOPT_LONG_DEFAULT_FILE) {
          log_trace("[comp][compgl] completing with wildcard glob, glob=<%s>", "$word*") if $COMPLETE_GETOPT_LONG_TRACE;
          {
              my $compres = [glob("$word*")];
              last unless @$compres;
              for (@$compres) {
                  $_ .= "/" if (-d $_);
              }
              $fres = {words=>$compres, path_sep=>'/'};
              goto RETURN_RES;
          }
          # if empty, fallback to searching file
      }
  
      if ($COMPLETE_GETOPT_LONG_DEFAULT_FILE) {
          log_trace("[comp][compgl] completing with file, file=<%s>", $word) if $COMPLETE_GETOPT_LONG_TRACE;
          $fres = Complete::Util::hashify_answer(
              Complete::File::complete_file(word=>$word),
              {path_sep=>'/'}
          );
      }
  
    RETURN_RES:
      log_trace("[comp][compgl] leaving default completion routine, result=%s", $fres) if $COMPLETE_GETOPT_LONG_TRACE;
      $fres;
  }
  
  # return the key/element if $opt matches exactly a key/element in $opts (which
  # can be an array/hash) OR expands unambiguously to exactly one key/element in
  # $opts, otherwise return undef. e.g. _expand1('--fo', [qw/--foo --bar --baz
  # --fee --feet/]) and _expand('--fee', ...) will respectively return '--foo' and
  # '--fee' because it expands/is unambiguous in the list, but _expand1('--ba',
  # ...) or _expand1('--qux', ...) will both return undef because '--ba' expands
  # ambiguously (--bar/--baz) while '--qux' cannot be expanded.
  sub _expand1 {
      my ($opt, $opts) = @_;
      my @candidates;
      my $is_hash = ref($opts) eq 'HASH';
      for ($is_hash ? (sort {length($a)<=>length($b)} keys %$opts) : @$opts) {
          next unless index($_, $opt) == 0;
          push @candidates, $is_hash ? $opts->{$_} : $_;
          last if $opt eq $_;
      }
      return @candidates == 1 ? $candidates[0] : undef;
  }
  
  # mark an option (and all its aliases) as seen
  sub _mark_seen {
      my ($seen_opts, $opt, $opts) = @_;
      my $opthash = $opts->{$opt};
      return unless $opthash;
      my $ospec = $opthash->{ospec};
      for (keys %$opts) {
          my $v = $opts->{$_};
          $seen_opts->{$_}++ if $v->{ospec} eq $ospec;
      }
  }
  
  $SPEC{complete_cli_arg} = {
      v => 1.1,
      summary => 'Complete command-line argument using '.
          'Getopt::Long specification',
      description => <<'_',
  
  This routine can complete option names, where the option names are retrieved
  from <pm:Getopt::Long> specification. If you provide completion routine in
  `completion`, you can also complete _option values_ and _arguments_.
  
  Note that this routine does not use <pm:Getopt::Long> (it does its own parsing)
  and currently is not affected by Getopt::Long's configuration. Its behavior
  mimics Getopt::Long under these configuration: `no_ignore_case`, `bundling` (or
  `no_bundling` if the `bundling` option is turned off). Which I think is the
  sensible default. This routine also does not currently support `auto_help` and
  `auto_version`, so you'll need to add those options specifically if you want to
  recognize `--help/-?` and `--version`, respectively.
  
  _
      args => {
          getopt_spec => {
              summary => 'Getopt::Long specification',
              schema  => 'hash*',
              req     => 1,
          },
          completion => {
              summary     =>
                  'Completion routine to complete option value/argument',
              schema      => 'code*',
              description => <<'_',
  
  Completion code will receive a hash of arguments (`%args`) containing these
  keys:
  
  * `type` (str, what is being completed, either `optval`, or `arg`)
  * `word` (str, word to be completed)
  * `cword` (int, position of words in the words array, starts from 0)
  * `opt` (str, option name, e.g. `--str`; undef if we're completing argument)
  * `ospec` (str, Getopt::Long option spec, e.g. `str|S=s`; undef when completing
    argument)
  * `argpos` (int, argument position, zero-based; undef if type='optval')
  * `nth` (int, the number of times this option has seen before, starts from 0
    that means this is the first time this option has been seen; undef when
    type='arg')
  * `seen_opts` (hash, all the options seen in `words`)
  * `parsed_opts` (hash, options parsed the standard/raw way)
  
  as well as all keys from `extras` (but these won't override the above keys).
  
  and is expected to return a completion answer structure as described in
  `Complete` which is either a hash or an array. The simplest form of answer is
  just to return an array of strings. The various `complete_*` function like those
  in <pm:Complete::Util> or the other `Complete::*` modules are suitable to use
  here.
  
  Completion routine can also return undef to express declination, in which case
  the default completion routine will then be consulted. The default routine
  completes from shell environment variables (`$FOO`), Unix usernames (`~foo`),
  and files/directories.
  
  Example:
  
      use Complete::Unix qw(complete_user);
      use Complete::Util qw(complete_array_elem);
      complete_cli_arg(
          getopt_spec => {
              'help|h'   => sub{...},
              'format=s' => \$format,
              'user=s'   => \$user,
          },
          completion  => sub {
              my %args  = @_;
              my $word  = $args{word};
              my $ospec = $args{ospec};
              if ($ospec && $ospec eq 'format=s') {
                  complete_array_elem(array=>[qw/json text xml yaml/], word=>$word);
              } else {
                  complete_user(word=>$word);
              }
          },
      );
  
  _
          },
          words => {
              summary     => 'Command line arguments, like @ARGV',
              description => <<'_',
  
  See function `parse_cmdline` in <pm:Complete::Bash> on how to produce this (if
  you're using bash).
  
  _
              schema      => 'array*',
              req         => 1,
          },
          cword => {
              summary     =>
                  "Index in words of the word we're trying to complete",
              description => <<'_',
  
  See function `parse_cmdline` in <pm:Complete::Bash> on how to produce this (if
  you're using bash).
  
  _
              schema      => 'int*',
              req         => 1,
          },
          extras => {
              summary => 'Add extra arguments to completion routine',
              schema  => 'hash',
              description => <<'_',
  
  The keys from this `extras` hash will be merged into the final `%args` passed to
  completion routines. Note that standard keys like `type`, `word`, and so on as
  described in the function description will not be overwritten by this.
  
  _
          },
          bundling => {
              schema  => 'bool*',
              default => 1,
              'summary.alt.bool.not' => 'Turn off bundling',
              description => <<'_',
  
  If you turn off bundling, completion of short-letter options won't support
  bundling (e.g. `-b<tab>` won't add more single-letter options), but single-dash
  multiletter options can be recognized. Currently only those specified with a
  single dash will be completed. For example if you have `-foo=s` in your option
  specification, `-f<tab>` can complete it.
  
  This can be used to complete old-style programs, e.g. emacs which has options
  like `-nw`, `-nbc` etc (but also have double-dash options like
  `--no-window-system` or `--no-blinking-cursor`).
  
  _
          },
      },
      result_naked => 1,
      result => {
          schema => ['any*' => of => ['hash*', 'array*']],
          description => <<'_',
  
  You can use `format_completion` function in <pm:Complete::Bash> module to format
  the result of this function for bash.
  
  _
      },
  };
  sub complete_cli_arg {
      require Complete::Util;
      require Getopt::Long::Util;
  
      my %args = @_;
  
      my $fname = __PACKAGE__ . "::complete_cli_arg"; # XXX use __SUB__
      my $fres;
  
      $args{words} or die "Please specify words";
      my @words = @{ $args{words} };
      defined(my $cword = $args{cword}) or die "Please specify cword";
      my $gospec = $args{getopt_spec} or die "Please specify getopt_spec";
      my $comp = $args{completion};
      my $extras = $args{extras} // {};
      my $bundling = $args{bundling} // 1;
      my %parsed_opts;
  
      log_trace('[comp][compgl] entering %s(), words=%s, cword=%d, word=<%s>',
                $fname, \@words, $cword, $words[$cword]) if $COMPLETE_GETOPT_LONG_TRACE;
  
      # parse all options first & supply default completion routine
      my %opts;
      for my $ospec (keys %$gospec) {
          my $res = Getopt::Long::Util::parse_getopt_long_opt_spec($ospec)
              or die "Can't parse option spec '$ospec'";
          next if $res->{is_arg};
          $res->{min_vals} //= $res->{type} ? 1 : 0;
          $res->{max_vals} //= $res->{type} || $res->{opttype} ? 1:0;
          for my $o0 (@{ $res->{opts} }) {
              my @ary = $res->{is_neg} && length($o0) > 1 ?
                  ([$o0, 0], ["no$o0",1], ["no-$o0",1]) : ([$o0,0]);
              for my $elem (@ary) {
                  my $o = $elem->[0];
                  my $is_neg = $elem->[1];
                  my $k = length($o)==1 ||
                      (!$bundling && $res->{dash_prefix} eq '-') ?
                          "-$o" : "--$o";
                  $opts{$k} = {
                      name => $k,
                      ospec => $ospec, # key to getopt specification
                      parsed => $res,
                      is_neg => $is_neg,
                  };
              }
          }
      }
      my @optnames = sort keys %opts;
  
      my $code_get_summary = sub {
          # currently we only extract summaries from Rinci metadata and
          # Perinci::CmdLine object
          return unless $extras;
          my $ggls_res = $extras->{ggls_res};
          return unless $ggls_res;
          my $cmdline = $extras->{cmdline};
          return unless $cmdline;
          my $r = $extras->{r};
          return unless $r;
  
          my $optname = shift;
          my $ospec  = $opts{$optname}{ospec};
          return unless $ospec; # shouldn't happen
          my $specmeta = $ggls_res->[3]{'func.specmeta'};
          my $ospecmeta = $specmeta->{$ospec};
  
          if ($ospecmeta->{is_alias}) {
              my $real_ospecmeta = $specmeta->{ $ospecmeta->{alias_for} };
              my $real_opt = $real_ospecmeta->{parsed}{opts}[0];
              $real_opt = length($real_opt) == 1 ? "-$real_opt" : "--$real_opt";
              return "Alias for $real_opt";
          }
  
          if (defined(my $coptname = $ospecmeta->{common_opt})) {
              # it's a common Perinci::CmdLine option
              my $coptspec = $cmdline->{common_opts}{$coptname};
              #use DD; dd $coptspec;
              return unless $coptspec;
  
              my $summ;
              # XXX translate
              if ($opts{$optname}{is_neg}) {
                  $summ = $coptspec->{"summary.alt.bool.not"};
                  return $summ if defined $summ;
                  my $pos_opt = $ospecmeta->{pos_opts}[0];
                  $pos_opt = length($pos_opt) == 1 ? "-$pos_opt" : "--$pos_opt";
                  return "The opposite of $pos_opt";
              } else {
                  $summ = $coptspec->{"summary.alt.bool.yes"};
                  return $summ if defined $summ;
                  $summ = $coptspec->{"summary"};
                  return $summ if defined $summ;
              }
          } else {
              # it's option from function argument
              my $arg = $ospecmeta->{arg};
              my $argspec = $extras->{r}{meta}{args}{$arg};
              #use DD; dd $argspec;
  
              my $summ;
              # XXX translate
              #use DD; dd {optname=>$optname, ospecmeta=>$ospecmeta};
              if ($ospecmeta->{is_neg}) {
                  $summ = $argspec->{"summary.alt.bool.not"};
                  return $summ if defined $summ;
                  my $pos_opt = $ospecmeta->{pos_opts}[0];
                  $pos_opt = length($pos_opt) == 1 ? "-$pos_opt" : "--$pos_opt";
                  return "The opposite of $pos_opt";
              } else {
                  $summ = $argspec->{"summary.alt.bool.yes"};
                  return $summ if defined $summ;
                  $summ = $argspec->{"summary"};
                  return $summ if defined $summ;
              }
          }
  
          return;
      };
  
      my %seen_opts;
  
      # for each word (each element in this array), we try to find out whether
      # it's supposed to complete option name, or option value, or argument, or
      # separator (or more than one of them). plus some other information.
      #
      # each element is a hash. if hash contains 'optname' key then it expects an
      # option name. if hash contains 'optval' key then it expects an option
      # value.
      #
      # 'short_only' means that the word is not to be completed with long option
      # name, only (bundle of) one-letter option names.
  
      my @expects;
  
      my $i = -1;
      my $argpos = 0;
  
    WORD:
      while (1) {
          last WORD if ++$i >= @words;
          my $word = $words[$i];
          #say "D:i=$i, word=$word, ~~\@words=",~~@words;
  
          if ($word eq '--' && $i != $cword) {
              $expects[$i] = {separator=>1};
              while (1) {
                  $i++;
                  last WORD if $i >= @words;
                  $expects[$i] = {arg=>1, argpos=>$argpos++};
              }
          }
  
          if ($word =~ /\A-/) {
  
              # check if it is a (bundle) of short option names
            SHORT_OPTS:
              {
                  # it's not a known short option
                  last unless $opts{"-".substr($word,1,1)};
  
                  # not a bundle, regard as only a single short option name
                  last unless $bundling;
  
                  # expand bundle
                  my $j = $i;
                  my $rest = substr($word, 1);
                  my @inswords;
                  my $encounter_equal_sign;
                EXPAND:
                  while (1) {
                      $rest =~ s/(.)// or last;
                      my $opt = "-$1";
                      my $opthash = $opts{$opt};
                      unless ($opthash) {
                          # we encounter an unknown option, doubt that this is a
                          # bundle of short option name, it could be someone
                          # typing --long as -long
                          @inswords = ();
                          $expects[$i]{short_only} = 0;
                          $rest = $word;
                          last EXPAND;
                      }
                      if ($opthash->{parsed}{max_vals}) {
                          # stop after an option that requires value
                          _mark_seen(\%seen_opts, $opt, \%opts);
  
                          if ($i == $j) {
                              $words[$i] = $opt;
                          } else {
                              push @inswords, $opt;
                              $j++;
                          }
  
                          my $expand;
                          if (length $rest) {
                              $expand++;
                              # complete -Sfoo^ is completing option value
                              $expects[$j > $i ? $j+1 : $j+2]{do_complete_optname} = 0;
                              $expects[$j > $i ? $j+1 : $j+2]{optval} = $opt;
                          } else {
                              # complete -S^ as [-S] to add space
                              $expects[$j > $i ? $j-1 : $j]{optname} = $opt;
                              $expects[$j > $i ? $j-1 : $j]{comp_result} = [
                                  substr($word, 0, length($word)-length($rest))];
                          }
  
                          if ($rest =~ s/\A=//) {
                              $encounter_equal_sign++;
                          }
  
                          if ($expand) {
                              push @inswords, "=", $rest;
                              $j+=2;
                          }
                          last EXPAND;
                      }
                      # continue splitting
                      _mark_seen(\%seen_opts, $opt, \%opts);
                      if ($i == $j) {
                          $words[$i] = $opt;
                      } else {
                          push @inswords, $opt;
                      }
                      $j++;
                  }
  
                  #use DD; print "D:inswords: "; dd \@inswords;
  
                  my $prefix = $encounter_equal_sign ? '' :
                      substr($word, 0, length($word)-length($rest));
                  splice @words, $i+1, 0, @inswords;
                  for (0..@inswords) {
                      $expects[$i+$_]{prefix} = $prefix;
                      $expects[$i+$_]{word}   = $rest;
                  }
                  $cword += @inswords;
                  $i += @inswords;
                  $word = $words[$i];
                  $expects[$i]{short_only} //= 1;
              } # SHORT_OPTS
  
              # split --foo=val -> --foo, =, val
            SPLIT_EQUAL:
              {
                  if ($word =~ /\A(--?[^=]+)(=)(.*)/) {
                      splice @words, $i, 1, $1, $2, $3;
                      $word = $1;
                      $cword += 2 if $cword >= $i;
                  }
              }
  
              my $opt = $word;
              my $opthash = _expand1($opt, \%opts);
  
              if ($opthash) {
                  $opt = $opthash->{name};
                  $expects[$i]{optname} = $opt;
                  my $nth = $seen_opts{$opt} // 0;
                  $expects[$i]{nth} = $nth;
                  _mark_seen(\%seen_opts, $opt, \%opts);
  
                  my $min_vals = $opthash->{parsed}{min_vals};
                  my $max_vals = $opthash->{parsed}{max_vals};
                  #say "D:min_vals=$min_vals, max_vals=$max_vals";
  
                  # detect = after --opt
                  if ($i+1 < @words && $words[$i+1] eq '=') {
                      $i++;
                      $expects[$i] = {separator=>1, optval=>$opt, word=>'', nth=>$nth};
                      # force a value due to =
                      if (!$max_vals) { $min_vals = $max_vals = 1 }
                  }
  
                  for (1 .. $min_vals) {
                      $i++;
                      last WORD if $i >= @words;
                      $expects[$i]{optval} = $opt;
                      $expects[$i]{nth} = $nth;
                      push @{ $parsed_opts{$opt} }, $words[$i];
                  }
                  for (1 .. $max_vals-$min_vals) {
                      last if $i+$_ >= @words;
                      last if $words[$i+$_] =~ /\A-/; # a new option
                      $expects[$i+$_]{optval} = $opt; # but can also be optname
                      $expects[$i]{nth} = $nth;
                      push @{ $parsed_opts{$opt} }, $words[$i+$_];
                  }
              } else {
                  # an unknown option, assume it doesn't require argument, unless
                  # it's --opt= or --opt=foo
                  $opt = undef;
                  $expects[$i]{optname} = $opt;
  
                  # detect = after --opt
                  if ($i+1 < @words && $words[$i+1] eq '=') {
                      $i++;
                      $expects[$i] = {separator=>1, optval=>undef, word=>''};
                      if ($i+1 < @words) {
                          $i++;
                          $expects[$i]{optval} = $opt;
                      }
                  }
              }
          } else {
              $expects[$i]{optname} = '';
              $expects[$i]{arg} = 1;
              $expects[$i]{argpos} = $argpos++;
          }
      }
  
      my $exp = $expects[$cword];
      my $word = $exp->{word} // $words[$cword];
  
      #use DD; print "D:words: "; dd \@words;
      #say "D:cword: $cword";
      #use DD; print "D:expects: "; dd \@expects;
      #use DD; print "D:seen_opts: "; dd \%seen_opts;
      #use DD; print "D:parsed_opts: "; dd \%parsed_opts;
      #use DD; print "D:exp: "; dd $exp;
      #use DD; say "D:word:<$word>";
  
      my @answers;
  
      # complete option names
      {
          last if $word =~ /\A[^-]/;
          last unless exists $exp->{optname};
          last if defined($exp->{do_complete_optname}) &&
              !$exp->{do_complete_optname};
          if ($exp->{comp_result}) {
              push @answers, $exp->{comp_result};
              last;
          }
          #say "D:completing option names";
          my $opt = $exp->{optname};
          my @o;
          my @osumms;
          my $o_has_summaries;
          for my $optname (@optnames) {
              my $repeatable = 0;
              next if $exp->{short_only} && $optname =~ /\A--/;
              if ($seen_opts{$optname}) {
                  my $opthash = $opts{$optname};
                  my $ospecval = $gospec->{$opthash->{ospec}};
                  my $parsed = $opthash->{parsed};
                  if (ref($ospecval) eq 'ARRAY') {
                      $repeatable = 1;
                  } elsif ($parsed->{desttype} || $parsed->{is_inc}) {
                      $repeatable = 1;
                  }
              }
              # skip options that have been specified and not repeatable
              #use DD; dd {'$_'=>$_, seen=>$seen_opts{$_}, repeatable=>$repeatable, opt=>$opt};
              next if $seen_opts{$optname} && !$repeatable && (
                  # long option has been specified
                  (!$opt || $opt ne $optname) ||
                       # short option (in a bundle) has been specified
                      (defined($exp->{prefix}) &&
                           index($exp->{prefix}, substr($opt, 1, 1)) >= 0));
              if (defined $exp->{prefix}) {
                  my $o = $optname; $o =~ s/\A-//;
                  push @o, "$exp->{prefix}$o";
              } else {
                  push @o, $optname;
              }
              my $summ = $code_get_summary->($optname) // '';
              if (length $summ) {
                  $o_has_summaries = 1;
                  push @osumms, $summ;
              } else {
                  push @osumms, '';
              }
          }
          #use DD; dd \@o;
          #use DD; dd \@osumms;
          my $compres = Complete::Util::complete_array_elem(
              array => \@o, word => $word,
              (summaries => \@osumms) x !!$o_has_summaries,
          );
          log_trace('[comp][compgl] adding result from option names, '.
                        'matching options=%s', $compres) if $COMPLETE_GETOPT_LONG_TRACE;
          push @answers, $compres;
          if (!exists($exp->{optval}) && !exists($exp->{arg})) {
              $fres = {words=>$compres, esc_mode=>'option'};
              goto RETURN_RES;
          }
      }
  
      # complete option value
      {
          last unless exists($exp->{optval});
          #say "D:completing option value";
          my $opt = $exp->{optval};
          my $opthash; $opthash = $opts{$opt} if $opt;
          my %compargs = (
              %$extras,
              type=>'optval', words=>\@words, cword=>$args{cword},
              word=>$word, opt=>$opt, ospec=>$opthash->{ospec},
              argpos=>undef, nth=>$exp->{nth}, seen_opts=>\%seen_opts,
              parsed_opts=>\%parsed_opts,
          );
          my $compres;
          if ($comp) {
              log_trace("[comp][compgl] invoking routine supplied from 'completion' argument to complete option value, option=<%s>", $opt) if $COMPLETE_GETOPT_LONG_TRACE;
              $compres = $comp->(%compargs);
              Complete::Util::modify_answer(answer=>$compres, prefix=>$exp->{prefix})
                  if defined $exp->{prefix};
              log_trace('[comp][compgl] adding result from routine: %s', $compres) if $COMPLETE_GETOPT_LONG_TRACE;
          }
          if (!$compres || !$comp) {
              $compres = _default_completion(%compargs);
              Complete::Util::modify_answer(answer=>$compres, prefix=>$exp->{prefix})
                  if defined $exp->{prefix};
              log_trace('[comp][compgl] adding result from default '.
                            'completion routine') if $COMPLETE_GETOPT_LONG_TRACE;
          }
          push @answers, $compres;
      }
  
      # complete argument
      {
          last unless exists($exp->{arg});
          my %compargs = (
              %$extras,
              type=>'arg', words=>\@words, cword=>$args{cword},
              word=>$word, opt=>undef, ospec=>undef,
              argpos=>$exp->{argpos}, seen_opts=>\%seen_opts,
              parsed_opts=>\%parsed_opts,
          );
          log_trace('[comp][compgl] invoking \'completion\' routine '.
                        'to complete argument') if $COMPLETE_GETOPT_LONG_TRACE;
          my $compres; $compres = $comp->(%compargs) if $comp;
          if (!defined $compres) {
              $compres = _default_completion(%compargs);
              log_trace('[comp][compgl] adding result from default '.
                            'completion routine: %s', $compres) if $COMPLETE_GETOPT_LONG_TRACE;
          }
          push @answers, $compres;
      }
  
      log_trace("[comp][compgl] combining result from %d source(s)", scalar @answers) if $COMPLETE_GETOPT_LONG_TRACE;
      $fres = Complete::Util::combine_answers(@answers) // [];
  
    RETURN_RES:
      log_trace("[comp][compgl] leaving %s(), result=%s", $fname, $fres) if $COMPLETE_GETOPT_LONG_TRACE;
      $fres;
  }
  
  1;
  # ABSTRACT: Complete command-line argument using Getopt::Long specification
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Complete::Getopt::Long - Complete command-line argument using Getopt::Long specification
  
  =head1 VERSION
  
  This document describes version 0.475 of Complete::Getopt::Long (from Perl distribution Complete-Getopt-Long), released on 2020-02-05.
  
  =head1 SYNOPSIS
  
  See L<Getopt::Long::Complete> for an easy way to use this module.
  
  =head1 DESCRIPTION
  
  =head1 FUNCTIONS
  
  
  =head2 complete_cli_arg
  
  Usage:
  
   complete_cli_arg(%args) -> hash|array
  
  Complete command-line argument using Getopt::Long specification.
  
  This routine can complete option names, where the option names are retrieved
  from L<Getopt::Long> specification. If you provide completion routine in
  C<completion>, you can also complete I<option values> and I<arguments>.
  
  Note that this routine does not use L<Getopt::Long> (it does its own parsing)
  and currently is not affected by Getopt::Long's configuration. Its behavior
  mimics Getopt::Long under these configuration: C<no_ignore_case>, C<bundling> (or
  C<no_bundling> if the C<bundling> option is turned off). Which I think is the
  sensible default. This routine also does not currently support C<auto_help> and
  C<auto_version>, so you'll need to add those options specifically if you want to
  recognize C<--help/-?> and C<--version>, respectively.
  
  This function is not exported by default, but exportable.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<bundling> => I<bool> (default: 1)
  
  If you turn off bundling, completion of short-letter options won't support
  bundling (e.g. C<< -bE<lt>tabE<gt> >> won't add more single-letter options), but single-dash
  multiletter options can be recognized. Currently only those specified with a
  single dash will be completed. For example if you have C<-foo=s> in your option
  specification, C<< -fE<lt>tabE<gt> >> can complete it.
  
  This can be used to complete old-style programs, e.g. emacs which has options
  like C<-nw>, C<-nbc> etc (but also have double-dash options like
  C<--no-window-system> or C<--no-blinking-cursor>).
  
  =item * B<completion> => I<code>
  
  Completion routine to complete option valueE<sol>argument.
  
  Completion code will receive a hash of arguments (C<%args>) containing these
  keys:
  
  =over
  
  =item * C<type> (str, what is being completed, either C<optval>, or C<arg>)
  
  =item * C<word> (str, word to be completed)
  
  =item * C<cword> (int, position of words in the words array, starts from 0)
  
  =item * C<opt> (str, option name, e.g. C<--str>; undef if we're completing argument)
  
  =item * C<ospec> (str, Getopt::Long option spec, e.g. C<str|S=s>; undef when completing
  argument)
  
  =item * C<argpos> (int, argument position, zero-based; undef if type='optval')
  
  =item * C<nth> (int, the number of times this option has seen before, starts from 0
  that means this is the first time this option has been seen; undef when
  type='arg')
  
  =item * C<seen_opts> (hash, all the options seen in C<words>)
  
  =item * C<parsed_opts> (hash, options parsed the standard/raw way)
  
  =back
  
  as well as all keys from C<extras> (but these won't override the above keys).
  
  and is expected to return a completion answer structure as described in
  C<Complete> which is either a hash or an array. The simplest form of answer is
  just to return an array of strings. The various C<complete_*> function like those
  in L<Complete::Util> or the other C<Complete::*> modules are suitable to use
  here.
  
  Completion routine can also return undef to express declination, in which case
  the default completion routine will then be consulted. The default routine
  completes from shell environment variables (C<$FOO>), Unix usernames (C<~foo>),
  and files/directories.
  
  Example:
  
   use Complete::Unix qw(complete_user);
   use Complete::Util qw(complete_array_elem);
   complete_cli_arg(
       getopt_spec => {
           'help|h'   => sub{...},
           'format=s' => \$format,
           'user=s'   => \$user,
       },
       completion  => sub {
           my %args  = @_;
           my $word  = $args{word};
           my $ospec = $args{ospec};
           if ($ospec && $ospec eq 'format=s') {
               complete_array_elem(array=>[qw/json text xml yaml/], word=>$word);
           } else {
               complete_user(word=>$word);
           }
       },
   );
  
  =item * B<cword>* => I<int>
  
  Index in words of the word we're trying to complete.
  
  See function C<parse_cmdline> in L<Complete::Bash> on how to produce this (if
  you're using bash).
  
  =item * B<extras> => I<hash>
  
  Add extra arguments to completion routine.
  
  The keys from this C<extras> hash will be merged into the final C<%args> passed to
  completion routines. Note that standard keys like C<type>, C<word>, and so on as
  described in the function description will not be overwritten by this.
  
  =item * B<getopt_spec>* => I<hash>
  
  Getopt::Long specification.
  
  =item * B<words>* => I<array>
  
  Command line arguments, like @ARGV.
  
  See function C<parse_cmdline> in L<Complete::Bash> on how to produce this (if
  you're using bash).
  
  
  =back
  
  Return value:  (hash|array)
  
  
  You can use C<format_completion> function in L<Complete::Bash> module to format
  the result of this function for bash.
  
  =head1 ENVIRONMENT
  
  =head2 COMPLETE_GETOPT_LONG_TRACE
  
  Bool. If set to true, will generated more log statements for debugging (at the
  trace level).
  
  =head2 COMPLETE_GETOPT_LONG_DEFAULT_ENV
  
  Bool. Default true. Can be set to false to disable completing from environment
  variable in default completion.
  
  =head2 COMPLETE_GETOPT_LONG_DEFAULT_FILE
  
  Bool. Default true. Can be set to false to disable completing from filesystem
  (file and directory names) in default completion.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Complete-Getopt-Long>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Complete-Getopt-Long>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Complete-Getopt-Long>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Getopt::Long::Complete>
  
  L<Complete>
  
  L<Complete::Bash>
  
  Other modules related to bash shell tab completion: L<Bash::Completion>,
  L<Getopt::Complete>.
  
  L<Perinci::CmdLine> - an alternative way to easily create command-line
  applications with completion feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2017, 2016, 2015, 2014 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
COMPLETE_GETOPT_LONG

    $main::fatpacked{"Complete/Path.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'COMPLETE_PATH';
  package Complete::Path;
  
  our $DATE = '2017-07-03'; # DATE
  our $VERSION = '0.24'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  use Complete::Common qw(:all);
  
  our $COMPLETE_PATH_TRACE = $ENV{COMPLETE_PATH_TRACE} // 0;
  
  require Exporter;
  our @ISA = qw(Exporter);
  our @EXPORT_OK = qw(
                         complete_path
                 );
  
  sub _dig_leaf {
      my ($p, $list_func, $is_dir_func, $filter_func, $path_sep) = @_;
      my $num_dirs;
      my $listres = $list_func->($p, '', 0);
      return $p unless ref($listres) eq 'ARRAY' && @$listres;
      my @candidates;
    L1:
      for my $e (@$listres) {
          my $p2 = $p =~ m!\Q$path_sep\E\z! ? "$p$e" : "$p$path_sep$e";
          {
              local $_ = $p2; # convenience for filter func
              next L1 if $filter_func && !$filter_func->($p2);
          }
          push @candidates, $p2;
      }
      return $p unless @candidates == 1;
      my $p2 = $candidates[0];
      my $is_dir;
      if ($p2 =~ m!\Q$path_sep\E\z!) {
          $is_dir++;
      } else {
          $is_dir = $is_dir_func && $is_dir_func->($p2);
      }
      return _dig_leaf($p2, $list_func, $is_dir_func, $filter_func, $path_sep)
          if $is_dir;
      $p2;
  }
  
  our %SPEC;
  
  $SPEC{complete_path} = {
      v => 1.1,
      summary => 'Complete path',
      description => <<'_',
  
  Complete path, for anything path-like. Meant to be used as backend for other
  functions like `Complete::File::complete_file` or
  `Complete::Module::complete_module`. Provides features like case-insensitive
  matching, expanding intermediate paths, and case mapping.
  
  Algorithm is to split path into path elements, then list items (using the
  supplied `list_func`) and perform filtering (using the supplied `filter_func`)
  at every level.
  
  _
      args => {
          %arg_word,
          list_func => {
              summary => 'Function to list the content of intermediate "dirs"',
              schema => 'code*',
              req => 1,
              description => <<'_',
  
  Code will be called with arguments: ($path, $cur_path_elem, $is_intermediate).
  Code should return an arrayref containing list of elements. "Directories" can be
  marked by ending the name with the path separator (see `path_sep`). Or, you can
  also provide an `is_dir_func` function that will be consulted after filtering.
  If an item is a "directory" then its name will be suffixed with a path
  separator by `complete_path()`.
  
  _
          },
          is_dir_func => {
              summary => 'Function to check whether a path is a "dir"',
              schema  => 'code*',
              description => <<'_',
  
  Optional. You can provide this function to determine if an item is a "directory"
  (so its name can be suffixed with path separator). You do not need to do this if
  you already suffix names of "directories" with path separator in `list_func`.
  
  One reason you might want to provide this and not mark "directories" in
  `list_func` is when you want to do extra filtering with `filter_func`. Sometimes
  you do not want to suffix the names first (example: see `complete_file` in
  `Complete::File`).
  
  _
          },
          starting_path => {
              schema => 'str*',
              req => 1,
              default => '',
          },
          filter_func => {
              schema  => 'code*',
              description => <<'_',
  
  Provide extra filtering. Code will be given path and should return 1 if the item
  should be included in the final result or 0 if the item should be excluded.
  
  _
          },
          path_sep => {
              schema  => 'str*',
              default => '/',
          },
          #result_prefix => {
          #    summary => 'Prefix each result with this string',
          #    schema  => 'str*',
          #},
      },
      result_naked => 1,
      result => {
          schema => 'array',
      },
  };
  sub complete_path {
      require Complete::Util;
  
      my %args   = @_;
      my $word   = $args{word} // "";
      my $path_sep = $args{path_sep} // '/';
      my $list_func   = $args{list_func};
      my $is_dir_func = $args{is_dir_func};
      my $filter_func = $args{filter_func};
      my $result_prefix = $args{result_prefix};
      my $starting_path = $args{starting_path} // '';
  
      my $ci          = $Complete::Common::OPT_CI;
      my $word_mode   = $Complete::Common::OPT_WORD_MODE;
      my $fuzzy       = $Complete::Common::OPT_FUZZY;
      my $map_case    = $Complete::Common::OPT_MAP_CASE;
      my $exp_im_path = $Complete::Common::OPT_EXP_IM_PATH;
      my $dig_leaf    = $Complete::Common::OPT_DIG_LEAF;
  
      my $re_ends_with_path_sep = qr!\A\z|\Q$path_sep\E\z!;
  
      # split word by into path elements, as we want to dig level by level (needed
      # when doing case-insensitive search on a case-sensitive tree).
      my @intermediate_dirs;
      {
          @intermediate_dirs = split qr/\Q$path_sep/, $word;
          @intermediate_dirs = ('') if !@intermediate_dirs;
          push @intermediate_dirs, '' if $word =~ $re_ends_with_path_sep;
      }
  
      # extract leaf path, because this one is treated differently
      my $leaf = pop @intermediate_dirs;
      @intermediate_dirs = ('') if !@intermediate_dirs;
  
      #say "D:starting_path=<$starting_path>";
      #say "D:intermediate_dirs=[",join(", ", map{"<$_>"} @intermediate_dirs),"]";
      #say "D:leaf=<$leaf>";
  
      # candidate for intermediate paths. when doing case-insensitive search,
      # there maybe multiple candidate paths for each dir, for example if
      # word='../foo/s' and there is '../foo/Surya', '../Foo/sri', '../FOO/SUPER'
      # then candidate paths would be ['../foo', '../Foo', '../FOO'] and the
      # filename should be searched inside all those dirs. everytime we drill down
      # to deeper subdirectories, we adjust this list by removing
      # no-longer-eligible candidates.
      my @candidate_paths;
  
      for my $i (0..$#intermediate_dirs) {
          my $intdir = $intermediate_dirs[$i];
          my $intdir_with_path_sep = "$intdir$path_sep";
          my @dirs;
          if ($i == 0) {
              # first path elem, we search starting_path first since
              # candidate_paths is still empty.
              @dirs = ($starting_path);
          } else {
              # subsequent path elem, we search all candidate_paths
              @dirs = @candidate_paths;
          }
  
          if ($i == $#intermediate_dirs && $intdir eq '') {
              @candidate_paths = @dirs;
              last;
          }
  
          my @new_candidate_paths;
          for my $dir (@dirs) {
              #say "D:  intdir list($dir)";
              my $listres = $list_func->($dir, $intdir, 1);
              next unless $listres && @$listres;
              #use DD; say "D: list res=", DD::dump($listres);
              my $matches = Complete::Util::complete_array_elem(
                  word => $intdir, array => $listres,
              );
              my $exact_matches = [grep {
                  $_ eq $intdir || $_ eq $intdir_with_path_sep
              } @$matches];
              #use Data::Dmp; say "D: word=<$intdir>, matches=", dmp($matches), ", exact_matches=", dmp($exact_matches);
  
              # when doing exp_im_path, check if we have a single exact match. in
              # that case, don't use all the candidates because that can be
              # annoying, e.g. you have 'a/foo' and 'and/food', you won't be able
              # to complete 'a/f' because bash (e.g.) will always cut the answer
              # to 'a' because the candidates are 'a/foo' and 'and/foo' (it will
              # use the shortest common string which is 'a').
              #say "D:  num_exact_matches: ", scalar @$exact_matches;
              if (!$exp_im_path || @$exact_matches == 1) {
                  $matches = $exact_matches;
              }
  
              for (@$matches) {
                  my $p = $dir =~ $re_ends_with_path_sep ?
                      "$dir$_" : "$dir$path_sep$_";
                  push @new_candidate_paths, $p;
              }
  
          }
          #say "D:  candidate_paths=[",join(", ", map{"<$_>"} @new_candidate_paths),"]";
          return [] unless @new_candidate_paths;
          @candidate_paths = @new_candidate_paths;
      }
  
      my $cut_chars = 0;
      if (length($starting_path)) {
          $cut_chars += length($starting_path);
          unless ($starting_path =~ /\Q$path_sep\E\z/) {
              $cut_chars += length($path_sep);
          }
      }
  
      my @res;
      for my $dir (@candidate_paths) {
          #say "D:opendir($dir)";
          my $listres = $list_func->($dir, $leaf, 0);
          next unless $listres && @$listres;
          my $matches = Complete::Util::complete_array_elem(
              word => $leaf, array => $listres,
          );
          #use DD; dd $matches;
  
        L1:
          for my $e (@$matches) {
              my $p = $dir =~ $re_ends_with_path_sep ?
                  "$dir$e" : "$dir$path_sep$e";
              #say "D:p=$p";
              {
                  local $_ = $p; # convenience for filter func
                  next L1 if $filter_func && !$filter_func->($p);
              }
  
              my $is_dir;
              if ($e =~ $re_ends_with_path_sep) {
                  $is_dir = 1;
              } else {
                  local $_ = $p; # convenience for is_dir_func
                  $is_dir = $is_dir_func->($p);
              }
  
              if ($is_dir && $dig_leaf) {
                  {
                      my $p2 = _dig_leaf($p, $list_func, $is_dir_func, $filter_func, $path_sep);
                      last if $p2 eq $p;
                      $p = $p2;
                      #say "D:p=$p (dig_leaf)";
  
                      # check again
                      if ($p =~ $re_ends_with_path_sep) {
                          $is_dir = 1;
                      } else {
                          local $_ = $p; # convenience for is_dir_func
                          $is_dir = $is_dir_func->($p);
                      }
                  }
              }
  
              # process into final result
              my $p0 = $p;
              substr($p, 0, $cut_chars) = '' if $cut_chars;
              $p = "$result_prefix$p" if length($result_prefix);
              unless ($p =~ /\Q$path_sep\E\z/) {
                  $p .= $path_sep if $is_dir;
              }
              push @res, $p;
          }
      }
  
      \@res;
  }
  1;
  # ABSTRACT: Complete path
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Complete::Path - Complete path
  
  =head1 VERSION
  
  This document describes version 0.24 of Complete::Path (from Perl distribution Complete-Path), released on 2017-07-03.
  
  =head1 DESCRIPTION
  
  =head1 FUNCTIONS
  
  
  =head2 complete_path
  
  Usage:
  
   complete_path(%args) -> array
  
  Complete path.
  
  Complete path, for anything path-like. Meant to be used as backend for other
  functions like C<Complete::File::complete_file> or
  C<Complete::Module::complete_module>. Provides features like case-insensitive
  matching, expanding intermediate paths, and case mapping.
  
  Algorithm is to split path into path elements, then list items (using the
  supplied C<list_func>) and perform filtering (using the supplied C<filter_func>)
  at every level.
  
  This function is not exported by default, but exportable.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<filter_func> => I<code>
  
  Provide extra filtering. Code will be given path and should return 1 if the item
  should be included in the final result or 0 if the item should be excluded.
  
  =item * B<is_dir_func> => I<code>
  
  Function to check whether a path is a "dir".
  
  Optional. You can provide this function to determine if an item is a "directory"
  (so its name can be suffixed with path separator). You do not need to do this if
  you already suffix names of "directories" with path separator in C<list_func>.
  
  One reason you might want to provide this and not mark "directories" in
  C<list_func> is when you want to do extra filtering with C<filter_func>. Sometimes
  you do not want to suffix the names first (example: see C<complete_file> in
  C<Complete::File>).
  
  =item * B<list_func>* => I<code>
  
  Function to list the content of intermediate "dirs".
  
  Code will be called with arguments: ($path, $cur_path_elem, $is_intermediate).
  Code should return an arrayref containing list of elements. "Directories" can be
  marked by ending the name with the path separator (see C<path_sep>). Or, you can
  also provide an C<is_dir_func> function that will be consulted after filtering.
  If an item is a "directory" then its name will be suffixed with a path
  separator by C<complete_path()>.
  
  =item * B<path_sep> => I<str> (default: "/")
  
  =item * B<starting_path>* => I<str> (default: "")
  
  =item * B<word>* => I<str> (default: "")
  
  Word to complete.
  
  =back
  
  Return value:  (array)
  
  =head1 ENVIRONMENT
  
  =head2 COMPLETE_PATH_TRACE => bool
  
  If set to true, will produce more log statements for debugging.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Complete-Path>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Complete-Path>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Complete-Path>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Complete>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2017, 2016, 2015, 2014 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
COMPLETE_PATH

    $main::fatpacked{"Complete/Sah.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'COMPLETE_SAH';
  package Complete::Sah;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-03-04'; # DATE
  our $DIST = 'Complete-Sah'; # DIST
  our $VERSION = '0.006'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  use Log::ger;
  
  use Complete::Common qw(:all);
  use Complete::Util qw(combine_answers complete_array_elem hashify_answer);
  
  our %SPEC;
  require Exporter;
  our @ISA       = qw(Exporter);
  our @EXPORT_OK = qw(complete_from_schema);
  
  $SPEC{':package'} = {
      v => 1.1,
      summary => 'Sah-related completion routines',
  };
  
  $SPEC{complete_from_schema} = {
      v => 1.1,
      summary => 'Complete a value from schema',
      description => <<'_',
  
  Employ some heuristics to complete a value from Sah schema. For example, if
  schema is `[str => in => [qw/new open resolved rejected/]]`, then we can
  complete from the `in` clause. Or for something like `[int => between => [1,
  20]]` we can complete using values from 1 to 20.
  
  _
      args => {
          schema => {
              description => <<'_',
  
  Will be normalized, unless when `schema_is_normalized` is set to true, in which
  case schema must already be normalized.
  
  _
              req => 1,
          },
          schema_is_normalized => {
              schema => 'bool',
              default => 0,
          },
          word => {
              schema => [str => default => ''],
              req => 1,
          },
      },
  };
  sub complete_from_schema {
      my %args = @_;
      my $sch  = $args{schema};
      my $word = $args{word} // "";
  
      unless ($args{schema_is_normalized}) {
          require Data::Sah::Normalize;
          $sch =Data::Sah::Normalize::normalize_schema($sch);
      }
  
      my $fres;
      log_trace("[compsah] entering complete_from_schema, word=<%s>, schema=%s", $word, $sch);
  
      my ($type, $cs) = @{$sch};
  
      # schema might be based on other schemas, if that is the case, let's try to
      # look at Sah::SchemaR::* module to quickly find the base type
      unless ($type =~ /\A(all|any|array|bool|buf|cistr|code|date|duration|float|hash|int|num|obj|re|str|undef)\z/) {
          no strict 'refs';
          my $pkg = "Sah::SchemaR::$type";
          (my $pkg_pm = "$pkg.pm") =~ s!::!/!g;
          eval { require $pkg_pm; 1 };
          if ($@) {
              log_trace("[compsah] couldn't load schema module %s: %s, skipped", $pkg, $@);
              goto RETURN_RES;
          }
          my $rsch = ${"$pkg\::rschema"};
          $type = $rsch->[0];
          # let's just merge everything, for quick checking of clause
          $cs = {};
          for my $cs0 (@{ $rsch->[1] // [] }) {
              for (keys %$cs0) {
                  $cs->{$_} = $cs0->{$_};
              }
          }
          log_trace("[compsah] retrieving schema from module %s, base type=%s", $pkg, $type);
      }
  
      my $static;
      my $words;
      my $summaries;
      eval {
          if (my $xcomp = $cs->{'x.completion'}) {
              require Module::Installed::Tiny;
              my $comp;
              if (ref($xcomp) eq 'CODE') {
                  $comp = $xcomp;
              } else {
                  my ($submod, $xcargs);
                  if (ref($xcomp) eq 'ARRAY') {
                      $submod = $xcomp->[0];
                      $xcargs = $xcomp->[1];
                  } else {
                      $submod = $xcomp;
                      $xcargs = {};
                  }
                  my $mod = "Perinci::Sub::XCompletion::$submod";
                  if (Module::Installed::Tiny::module_installed($mod)) {
                      log_trace("[compsah] loading module %s ...", $mod);
                      my $mod_pm = $mod; $mod_pm =~ s!::!/!g; $mod_pm .= ".pm";
                      require $mod_pm;
                      my $fref = \&{"$mod\::gen_completion"};
                      log_trace("[compsah] invoking %s's gen_completion(%s) ...", $mod, $xcargs);
                      $comp = $fref->(%$xcargs);
                  } else {
                      log_trace("[compsah] module %s is not installed, skipped", $mod);
                  }
              }
              if ($comp) {
                  log_trace("[compsah] using arg completion routine from schema's 'x.completion' attribute");
                  $fres = $comp->(
                      %{$args{extras} // {}},
                      word=>$word, arg=>$args{arg}, args=>$args{args});
                  return; # from eval
                  }
              }
  
          if ($cs->{is} && !ref($cs->{is})) {
              log_trace("[compsah] adding completion from schema's 'is' clause");
              push @$words, $cs->{is};
              push @$summaries, undef;
              $static++;
              return; # from eval. there should not be any other value
          }
          if ($cs->{in}) {
              log_trace("[compsah] adding completion from schema's 'in' clause");
              for my $i (0..$#{ $cs->{in} }) {
                  next if ref $cs->{in}[$i];
                  push @$words    , $cs->{in}[$i];
                  push @$summaries, $cs->{'x.in.summaries'} ? $cs->{'x.in.summaries'}[$i] : undef;
              }
              $static++;
              return; # from eval. there should not be any other value
          }
          if ($cs->{'examples'}) {
              log_trace("[compsah] adding completion from schema's 'examples' clause");
              for my $eg (@{ $cs->{'examples'} }) {
                  if (ref $eg eq 'HASH') {
                      next unless !exists($eg->{valid}) || $eg->{valid};
                      next unless defined $eg->{value};
                      next if ref $eg->{value};
                      push @$words, $eg->{value};
                      push @$summaries, $eg->{summary};
                  } else {
                      next unless defined $eg;
                      next if ref $eg;
                      push @$words, $eg;
                      push @$summaries, undef;
                  }
              }
              #$static++;
              #return; # from eval. there should not be any other value
          }
          if ($type eq 'any') {
              # because currently Data::Sah::Normalize doesn't recursively
              # normalize schemas in 'of' clauses, etc.
              require Data::Sah::Normalize;
              if ($cs->{of} && @{ $cs->{of} }) {
  
                  $fres = combine_answers(
                      grep { defined } map {
                          complete_from_schema(schema=>$_, word => $word)
                      } @{ $cs->{of} }
                  );
                  goto RETURN_RES; # directly return result
              }
          }
          if ($type eq 'bool') {
              log_trace("[compsah] adding completion from possible values of bool");
              push @$words, 0, 1;
              push @$summaries, undef, undef;
              $static++;
              return; # from eval
          }
          if ($type eq 'int') {
              my $limit = 100;
              if ($cs->{between} &&
                      $cs->{between}[0] - $cs->{between}[0] <= $limit) {
                  log_trace("[compsah] adding completion from schema's 'between' clause");
                  for ($cs->{between}[0] .. $cs->{between}[1]) {
                      push @$words, $_;
                      push @$summaries, undef;
                  }
                  $static++;
              } elsif ($cs->{xbetween} &&
                           $cs->{xbetween}[0] - $cs->{xbetween}[0] <= $limit) {
                  log_trace("[compsah] adding completion from schema's 'xbetween' clause");
                  for ($cs->{xbetween}[0]+1 .. $cs->{xbetween}[1]-1) {
                      push @$words, $_;
                      push @$summaries, undef;
                  }
                  $static++;
              } elsif (defined($cs->{min}) && defined($cs->{max}) &&
                           $cs->{max}-$cs->{min} <= $limit) {
                  log_trace("[compsah] adding completion from schema's 'min' & 'max' clauses");
                  for ($cs->{min} .. $cs->{max}) {
                      push @$words, $_;
                      push @$summaries, undef;
                  }
                  $static++;
              } elsif (defined($cs->{min}) && defined($cs->{xmax}) &&
                           $cs->{xmax}-$cs->{min} <= $limit) {
                  log_trace("[compsah] adding completion from schema's 'min' & 'xmax' clauses");
                  for ($cs->{min} .. $cs->{xmax}-1) {
                      push @$words, $_;
                      push @$summaries, undef;
                  }
                  $static++;
              } elsif (defined($cs->{xmin}) && defined($cs->{max}) &&
                           $cs->{max}-$cs->{xmin} <= $limit) {
                  log_trace("[compsah] adding completion from schema's 'xmin' & 'max' clauses");
                  for ($cs->{xmin}+1 .. $cs->{max}) {
                      push @$words, $_;
                      push @$summaries, undef;
                  }
                  $static++;
              } elsif (defined($cs->{xmin}) && defined($cs->{xmax}) &&
                           $cs->{xmax}-$cs->{xmin} <= $limit) {
                  log_trace("[compsah] adding completion from schema's 'xmin' & 'xmax' clauses");
                  for ($cs->{xmin}+1 .. $cs->{xmax}-1) {
                      push @$words, $_;
                      push @$summaries, undef;
                  }
                  $static++;
              } elsif (length($word) && $word !~ /\A-?\d*\z/) {
                  log_trace("[compsah] word not an int");
                  $words = [];
                  $summaries = [];
              } else {
                  # do a digit by digit completion
                  $words = [];
                  $summaries = [];
                  for my $sign ("", "-") {
                      for ("", 0..9) {
                          my $i = $sign . $word . $_;
                          next unless length $i;
                          next unless $i =~ /\A-?\d+\z/;
                          next if $i eq '-0';
                          next if $i =~ /\A-?0\d/;
                          next if $cs->{between} &&
                              ($i < $cs->{between}[0] ||
                                   $i > $cs->{between}[1]);
                          next if $cs->{xbetween} &&
                              ($i <= $cs->{xbetween}[0] ||
                                   $i >= $cs->{xbetween}[1]);
                          next if defined($cs->{min} ) && $i <  $cs->{min};
                          next if defined($cs->{xmin}) && $i <= $cs->{xmin};
                          next if defined($cs->{max} ) && $i >  $cs->{max};
                          next if defined($cs->{xmin}) && $i >= $cs->{xmax};
                          push @$words, $i;
                          push @$summaries, undef;
                      }
                  }
              }
              return; # from eval
          }
          if ($type eq 'float') {
              if (length($word) && $word !~ /\A-?\d*(\.\d*)?\z/) {
                  log_trace("[compsah] word not a float");
                  $words = [];
                  $summaries = [];
              } else {
                  $words = [];
                  $summaries = [];
                  for my $sig ("", "-") {
                      for ("", 0..9,
                           ".0",".1",".2",".3",".4",".5",".6",".7",".8",".9") {
                          my $f = $sig . $word . $_;
                          next unless length $f;
                          next unless $f =~ /\A-?\d+(\.\d+)?\z/;
                          next if $f eq '-0';
                          next if $f =~ /\A-?0\d\z/;
                          next if $cs->{between} &&
                              ($f < $cs->{between}[0] ||
                                   $f > $cs->{between}[1]);
                          next if $cs->{xbetween} &&
                              ($f <= $cs->{xbetween}[0] ||
                                   $f >= $cs->{xbetween}[1]);
                          next if defined($cs->{min} ) && $f <  $cs->{min};
                          next if defined($cs->{xmin}) && $f <= $cs->{xmin};
                          next if defined($cs->{max} ) && $f >  $cs->{max};
                          next if defined($cs->{xmin}) && $f >= $cs->{xmax};
                          push @$words, $f;
                          push @$summaries, undef;
                      }
                  }
                  my @orders = sort { $words->[$a] cmp $words->[$b] }
                      0..$#{$words};
                  my $words     = [map {$words->[$_]    } @orders];
                  my $summaries = [map {$summaries->[$_]} @orders];
              }
              return; # from eval
          }
      }; # eval
      log_trace("[compsah] complete_from_schema died: %s", $@) if $@;
  
      my $replace_map;
    GET_REPLACE_MAP:
      {
          last unless $cs->{prefilters};
          # TODO: make replace_map in Complete::Util equivalent as
          # Str::replace_map's map.
          for my $entry (@{ $cs->{prefilters} }) {
              next unless ref $entry eq 'ARRAY';
              next unless $entry->[0] eq 'Str::replace_map';
              $replace_map = {};
              for my $k (keys %{ $entry->[1]{map} }) {
                  my $v = $entry->[1]{map}{$k};
                  $replace_map->{$v} = [$k];
              }
              last;
          }
      }
  
      goto RETURN_RES unless $words;
      $fres = hashify_answer(
          complete_array_elem(
              array=>$words,
              summaries=>$summaries,
              word=>$word,
              (replace_map => $replace_map) x !!$replace_map,
          ),
          {static=>$static && $word eq '' ? 1:0},
      );
  
    RETURN_RES:
      log_trace("[compsah] leaving complete_from_schema, result=%s", $fres);
      $fres;
  }
  
  1;
  # ABSTRACT: Sah-related completion routines
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Complete::Sah - Sah-related completion routines
  
  =head1 VERSION
  
  This document describes version 0.006 of Complete::Sah (from Perl distribution Complete-Sah), released on 2020-03-04.
  
  =head1 SYNOPSIS
  
   use Complete::Sah qw(complete_from_schema);
   my $res = complete_from_schema(word => 'a', schema=>[str => {in=>[qw/apple apricot banana/]}]);
   # -> {words=>['apple', 'apricot'], static=>0}
  
  =head1 FUNCTIONS
  
  
  =head2 complete_from_schema
  
  Usage:
  
   complete_from_schema(%args) -> [status, msg, payload, meta]
  
  Complete a value from schema.
  
  Employ some heuristics to complete a value from Sah schema. For example, if
  schema is C<< [str =E<gt> in =E<gt> [qw/new open resolved rejected/]] >>, then we can
  complete from the C<in> clause. Or for something like C<< [int =E<gt> between =E<gt> [1,
  20]] >> we can complete using values from 1 to 20.
  
  This function is not exported by default, but exportable.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<schema>* => I<any>
  
  Will be normalized, unless when C<schema_is_normalized> is set to true, in which
  case schema must already be normalized.
  
  =item * B<schema_is_normalized> => I<bool> (default: 0)
  
  =item * B<word>* => I<str> (default: "")
  
  
  =back
  
  Returns an enveloped result (an array).
  
  First element (status) is an integer containing HTTP status code
  (200 means OK, 4xx caller error, 5xx function error). Second element
  (msg) is a string containing error message, or 'OK' if status is
  200. Third element (payload) is optional, the actual result. Fourth
  element (meta) is called result metadata and is optional, a hash
  that contains extra information.
  
  Return value:  (any)
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Complete-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Complete-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Complete-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
COMPLETE_SAH

    $main::fatpacked{"Complete/Tcsh.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'COMPLETE_TCSH';
  package Complete::Tcsh;
  
  our $DATE = '2019-12-20'; # DATE
  our $VERSION = '0.030'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  require Exporter;
  our @ISA = qw(Exporter);
  our @EXPORT_OK = qw(
                         parse_cmdline
                         format_completion
                 );
  
  require Complete::Bash;
  
  our %SPEC;
  
  $SPEC{':package'} = {
      v => 1.1,
      summary => 'Completion module for tcsh shell',
  };
  
  $SPEC{parse_cmdline} = {
      v => 1.1,
      summary => 'Parse shell command-line for processing by completion routines',
      description => <<'_',
  
  This function converts COMMAND_LINE (str) given by tcsh to become something like
  COMP_WORDS (array) and COMP_CWORD (int), like what bash supplies to shell
  functions. Currently implemented using `Complete::Bash`'s `parse_cmdline`.
  
  _
      args_as => 'array',
      args => {
          cmdline => {
              summary => 'Command-line, defaults to COMMAND_LINE environment',
              schema => 'str*',
              pos => 0,
          },
      },
      result => {
          schema => ['array*', len=>2],
          description => <<'_',
  
  Return a 2-element array: `[$words, $cword]`. `$words` is array of str,
  equivalent to `COMP_WORDS` provided by bash to shell functions. `$cword` is an
  integer, equivalent to `COMP_CWORD` provided by bash to shell functions. The
  word to be completed is at `$words->[$cword]`.
  
  Note that COMP_LINE includes the command name. If you want the command-line
  arguments only (like in `@ARGV`), you need to strip the first element from
  `$words` and reduce `$cword` by 1.
  
  _
      },
      result_naked => 1,
  };
  sub parse_cmdline {
      my ($line) = @_;
  
      $line //= $ENV{COMMAND_LINE};
      Complete::Bash::parse_cmdline($line, length($line));
  }
  
  $SPEC{format_completion} = {
      v => 1.1,
      summary => 'Format completion for output (for shell)',
      description => <<'_',
  
  tcsh accepts completion reply in the form of one entry per line to STDOUT.
  Currently the formatting is done using `Complete::Bash`'s `format_completion`
  because escaping rule and so on are not yet well defined in tcsh.
  
  _
      args_as => 'array',
      args => {
          completion => {
              summary => 'Completion answer structure',
              description => <<'_',
  
  Either an array or hash, as described in `Complete`.
  
  _
              schema=>['any*' => of => ['hash*', 'array*']],
              req=>1,
              pos=>0,
          },
      },
      result => {
          summary => 'Formatted string (or array, if `as` is set to `array`)',
          schema => ['any*' => of => ['str*', 'array*']],
      },
      result_naked => 1,
  };
  sub format_completion {
      Complete::Bash::format_completion(@_);
  }
  
  1;
  # ABSTRACT: Completion module for tcsh shell
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Complete::Tcsh - Completion module for tcsh shell
  
  =head1 VERSION
  
  This document describes version 0.030 of Complete::Tcsh (from Perl distribution Complete-Tcsh), released on 2019-12-20.
  
  =head1 DESCRIPTION
  
  tcsh allows completion to come from various sources. One of the simplest is from
  a list of words:
  
   % complete CMDNAME 'p/*/(one two three)/'
  
  Another source is from an external command:
  
   % complete CMDNAME 'p/*/`mycompleter --somearg`/'
  
  The command receives one environment variables C<COMMAND_LINE> (string, raw
  command-line). Unlike bash, tcsh does not (yet) provide something akin to
  C<COMP_POINT> in bash. Command is expected to print completion entries, one line
  at a time.
  
   % cat foo-complete
   #!/usr/bin/perl
   use Complete::Tcsh qw(parse_cmdline format_completion);
   use Complete::Util qw(complete_array_elem);
   my ($words, $cword) = @{ parse_cmdline() };
   my $res = complete_array_elem(array=>[qw/--help --verbose --version/], word=>$words->[$cword]);
   print format_completion($res);
  
   % complete foo 'p/*/`foo-complete`/'
   % foo --v<Tab>
   --verbose --version
  
  This module provides routines for you to be doing the above.
  
  Also, unlike bash, currently tcsh does not allow delegating completion to a
  shell function.
  
  =head1 FUNCTIONS
  
  
  =head2 format_completion
  
  Usage:
  
   format_completion($completion) -> str|array
  
  Format completion for output (for shell).
  
  tcsh accepts completion reply in the form of one entry per line to STDOUT.
  Currently the formatting is done using C<Complete::Bash>'s C<format_completion>
  because escaping rule and so on are not yet well defined in tcsh.
  
  This function is not exported by default, but exportable.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<$completion>* => I<hash|array>
  
  Completion answer structure.
  
  Either an array or hash, as described in C<Complete>.
  
  =back
  
  Return value: Formatted string (or array, if `as` is set to `array`) (str|array)
  
  
  
  =head2 parse_cmdline
  
  Usage:
  
   parse_cmdline($cmdline) -> array
  
  Parse shell command-line for processing by completion routines.
  
  This function converts COMMAND_LINE (str) given by tcsh to become something like
  COMP_WORDS (array) and COMP_CWORD (int), like what bash supplies to shell
  functions. Currently implemented using C<Complete::Bash>'s C<parse_cmdline>.
  
  This function is not exported by default, but exportable.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<$cmdline> => I<str>
  
  Command-line, defaults to COMMAND_LINE environment.
  
  =back
  
  Return value:  (array)
  
  
  Return a 2-element array: C<[$words, $cword]>. C<$words> is array of str,
  equivalent to C<COMP_WORDS> provided by bash to shell functions. C<$cword> is an
  integer, equivalent to C<COMP_CWORD> provided by bash to shell functions. The
  word to be completed is at C<< $words-E<gt>[$cword] >>.
  
  Note that COMP_LINE includes the command name. If you want the command-line
  arguments only (like in C<@ARGV>), you need to strip the first element from
  C<$words> and reduce C<$cword> by 1.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Complete-Tcsh>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Complete-Tcsh>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Complete-Tcsh>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Complete>
  
  L<Complete::Bash>
  
  tcsh manual.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2019, 2015, 2014 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
COMPLETE_TCSH

    $main::fatpacked{"Complete/Util.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'COMPLETE_UTIL';
  package Complete::Util;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-01-28'; # DATE
  our $DIST = 'Complete-Util'; # DIST
  our $VERSION = '0.611'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  use Log::ger;
  
  use Complete::Common qw(:all);
  
  use Exporter qw(import);
  our @EXPORT_OK = qw(
                         hashify_answer
                         arrayify_answer
                         combine_answers
                         modify_answer
                         ununiquify_answer
                         answer_has_entries
                         answer_num_entries
                         complete_array_elem
                         complete_hash_key
                         complete_comma_sep
                 );
  
  our %SPEC;
  
  our $COMPLETE_UTIL_TRACE = $ENV{COMPLETE_UTIL_TRACE} // 0;
  
  our %arg0_answer = (
      answer => {
          summary => 'Completion answer structure',
          schema  => ['any*' => of => ['array*','hash*']],
          req => 1,
          pos => 0,
      },
  );
  
  $SPEC{':package'} = {
      v => 1.1,
      summary => 'General completion routine',
      description => <<'_',
  
  This package provides some generic completion routines that follow the
  <pm:Complete> convention. (If you are looking for bash/shell tab completion
  routines, take a look at the See Also section.) The main routine is
  `complete_array_elem` which tries to complete a word using choices from elements
  of supplied array. For example:
  
      complete_array_elem(word => "a", array => ["apple", "apricot", "banana"]);
  
  The routine will first try a simple substring prefix matching. If that fails,
  will try some other methods like word-mode, character-mode, or fuzzy matching.
  These methods can be disabled using settings.
  
  There are other utility routines e.g. for converting completion answer structure
  from hash to array/array to hash, combine or modify answer, etc. These routines
  are usually used by the other more specific or higher-level completion modules.
  
  _
  };
  
  $SPEC{hashify_answer} = {
      v => 1.1,
      summary => 'Make sure we return completion answer in hash form',
      description => <<'_',
  
  This function accepts a hash or an array. If it receives an array, will convert
  the array into `{words=>$ary}' first to make sure the completion answer is in
  hash form.
  
  Then will add keys from `meta` to the hash.
  
  _
      args => {
          %arg0_answer,
          meta => {
              summary => 'Metadata (extra keys) for the hash',
              schema  => 'hash*',
              pos => 1,
          },
      },
      args_as => 'array',
      result_naked => 1,
      result => {
          schema => 'hash*',
      },
  };
  sub hashify_answer {
      my $ans = shift;
      if (ref($ans) ne 'HASH') {
          $ans = {words=>$ans};
      }
      if (@_) {
          my $meta = shift;
          for (keys %$meta) {
              $ans->{$_} = $meta->{$_};
          }
      }
      $ans;
  }
  
  $SPEC{arrayify_answer} = {
      v => 1.1,
      summary => 'Make sure we return completion answer in array form',
      description => <<'_',
  
  This is the reverse of `hashify_answer`. It accepts a hash or an array. If it
  receives a hash, will return its `words` key.
  
  _
      args => {
          %arg0_answer,
      },
      args_as => 'array',
      result_naked => 1,
      result => {
          schema => 'array*',
      },
  };
  sub arrayify_answer {
      my $ans = shift;
      if (ref($ans) eq 'HASH') {
          $ans = $ans->{words};
      }
      $ans;
  }
  
  $SPEC{answer_num_entries} = {
      v => 1.1,
      summary => 'Get the number of entries in an answer',
      description => <<'_',
  
  It is equivalent to:
  
      ref $answer eq 'ARRAY' ? (@$answer // 0) : (@{$answer->{words}} // 0);
  
  _
      args => {
          %arg0_answer,
      },
      args_as => 'array',
      result_naked => 1,
      result => {
          schema => 'int*',
      },
  };
  sub answer_num_entries {
      my $ans = shift;
      return ref($ans) eq 'HASH' ? (@{$ans->{words} // []} // 0) : (@$ans // 0);
  }
  
  $SPEC{answer_has_entries} = {
      v => 1.1,
      summary => 'Check if answer has entries',
      description => <<'_',
  
  It is equivalent to:
  
      ref $answer eq 'ARRAY' ? (@$answer ? 1:0) : (@{$answer->{words}} ? 1:0);
  
  _
      args => {
          %arg0_answer,
      },
      args_as => 'array',
      result_naked => 1,
      result => {
          schema => 'int*',
      },
  };
  sub answer_has_entries {
      my $ans = shift;
      return ref($ans) eq 'HASH' ? (@{$ans->{words} // []} ? 1:0) : (@$ans ? 1:0);
  }
  
  sub __min(@) {
      my $m = $_[0];
      for (@_) {
          $m = $_ if $_ < $m;
      }
      $m;
  }
  
  our $code_editdist;
  our $editdist_flex;
  
  # straight copy of Wikipedia's "Levenshtein Distance"
  sub __editdist {
      my @a = split //, shift;
      my @b = split //, shift;
  
      # There is an extra row and column in the matrix. This is the distance from
      # the empty string to a substring of the target.
      my @d;
      $d[$_][0] = $_ for 0 .. @a;
      $d[0][$_] = $_ for 0 .. @b;
  
      for my $i (1 .. @a) {
          for my $j (1 .. @b) {
              $d[$i][$j] = (
                  $a[$i-1] eq $b[$j-1]
                      ? $d[$i-1][$j-1]
                      : 1 + __min(
                          $d[$i-1][$j],
                          $d[$i][$j-1],
                          $d[$i-1][$j-1]
                      )
                  );
          }
      }
  
      $d[@a][@b];
  }
  
  my %complete_array_elem_args = (
      %arg_word,
      array       => {
          schema => ['array*'=>{of=>'str*'}],
          req => 1,
          pos => 1,
          slurpy => 1,
      },
      summaries => {
          schema => ['array*'=>{of=>'str*'}],
      },
      exclude     => {
          schema => ['array*'],
      },
      replace_map => {
          schema => ['hash*', each_value=>['array*', of=>'str*']],
          description => <<'_',
  
  You can supply correction entries in this option. An example is when array if
  `['mount','unmount']` and `umount` is a popular "typo" for `unmount`. When
  someone already types `um` it cannot be completed into anything (even the
  current fuzzy mode will return *both* so it cannot complete immediately).
  
  One solution is to add replace_map `{'unmount'=>['umount']}`. This way, `umount`
  will be regarded the same as `unmount` and when user types `um` it can be
  completed unambiguously into `unmount`.
  
  _
          tags => ['experimental'],
      },
  );
  
  $SPEC{complete_array_elem} = {
      v => 1.1,
      summary => 'Complete from array',
      description => <<'_',
  
  Try to find completion from an array of strings. Will attempt several methods,
  from the cheapest and most discriminating to the most expensive and least
  discriminating.
  
  First method is normal/exact string prefix matching (either case-sensitive or
  insensitive depending on the `$Complete::Common::OPT_CI` variable or the
  `COMPLETE_OPT_CI` environment variable). If at least one match is found, return
  result. Else, proceed to the next method.
  
  Word-mode matching (can be disabled by setting
  `$Complete::Common::OPT_WORD_MODE` or `COMPLETE_OPT_WORD_MODE` environment
  varialbe to false). Word-mode matching is described in <pm:Complete::Common>. If
  at least one match is found, return result. Else, proceed to the next method.
  
  Prefix char-mode matching (can be disabled by settings
  `$Complete::Common::OPT_CHAR_MODE` or `COMPLETE_OPT_CHAR_MODE` environment
  variable to false). Prefix char-mode matching is just like char-mode matching
  (see next paragraph) except the first character must match. If at least one
  match is found, return result. Else, proceed to the next method.
  
  Char-mode matching (can be disabled by settings
  `$Complete::Common::OPT_CHAR_MODE` or `COMPLETE_OPT_CHAR_MODE` environment
  variable to false). Char-mode matching is described in <pm:Complete::Common>. If
  at least one match is found, return result. Else, proceed to the next method.
  
  Fuzzy matching (can be disabled by setting `$Complete::Common::OPT_FUZZY` or
  `COMPLETE_OPT_FUZZY` to false). Fuzzy matching is described in
  <pm:Complete::Common>. If at least one match is found, return result. Else,
  return empty string.
  
  Will sort the resulting completion list, so you don't have to presort the array.
  
  _
      args => {
          %complete_array_elem_args,
      },
      result_naked => 1,
      result => {
          schema => 'array',
      },
  };
  sub complete_array_elem {
      my %args  = @_;
  
      my $array0    = $args{array} or die "Please specify array";
      my $summaries = $args{summaries};
      my $word      = $args{word} // "";
  
      my $ci          = $Complete::Common::OPT_CI;
      my $map_case    = $Complete::Common::OPT_MAP_CASE;
      my $word_mode   = $Complete::Common::OPT_WORD_MODE;
      my $char_mode   = $Complete::Common::OPT_CHAR_MODE;
      my $fuzzy       = $Complete::Common::OPT_FUZZY;
  
      log_trace("[computil] entering complete_array_elem(), word=<%s>", $word)
          if $COMPLETE_UTIL_TRACE;
  
      my $res;
  
      unless (@$array0) {
          $res = []; goto RETURN_RES;
      }
  
      # normalize
      my $wordn = $ci ? uc($word) : $word; $wordn =~ s/_/-/g if $map_case;
  
      my $excluden;
      if ($args{exclude}) {
          $excluden = {};
          for my $el (@{$args{exclude}}) {
              my $eln = $ci ? uc($el) : $el; $eln =~ s/_/-/g if $map_case;
              $excluden->{$eln} //= 1;
          }
      }
  
      my $rmapn;
      my $rev_rmapn; # to replace back to the original words back in the result
      if (my $rmap = $args{replace_map}) {
          $rmapn = {};
          $rev_rmapn = {};
          for my $k (keys %$rmap) {
              my $kn = $ci ? uc($k) : $k; $kn =~ s/_/-/g if $map_case;
              my @vn;
              for my $v (@{ $rmap->{$k} }) {
                  my $vn = $ci ? uc($v) : $v; $vn =~ s/_/-/g if $map_case;
                  push @vn, $vn;
                  $rev_rmapn->{$vn} //= $k;
              }
              $rmapn->{$kn} = \@vn;
          }
      }
  
      my @words;      # the answer
      my @wordsumms;  # summaries for each item in @words
      my @array ;     # original array + rmap entries
      my @arrayn;     # case- & map-case-normalized form of $array + rmap entries
      my @arraysumms; # summaries for each item in @array (or @arrayn)
  
      # normal string prefix matching. we also fill @array & @arrayn here (which
      # will be used again in word-mode, fuzzy, and char-mode matching) so we
      # don't have to calculate again.
      log_trace("[computil] Trying normal string-prefix matching ...") if $COMPLETE_UTIL_TRACE;
      for my $i (0..$#{$array0}) {
          my $el = $array0->[$i];
          my $eln = $ci ? uc($el) : $el; $eln =~ s/_/-/g if $map_case;
          next if $excluden && $excluden->{$eln};
          push @array , $el;
          push @arrayn, $eln;
          push @arraysumms, $summaries->[$i] if $summaries;
          if (0==index($eln, $wordn)) {
              push @words, $el;
              push @wordsumms, $summaries->[$i] if $summaries;
          }
          if ($rmapn && $rmapn->{$eln}) {
              for my $vn (@{ $rmapn->{$eln} }) {
                  push @array , $el;
                  push @arrayn, $vn;
                  # we add the normalized form, because we'll just revert it back
                  # to the original word in the final result
                  if (0==index($vn, $wordn)) {
                      push @words, $vn;
                      push @wordsumms, $summaries->[$i] if $summaries;
                  }
              }
          }
      }
      log_trace("[computil] Result from normal string-prefix matching: %s", \@words) if @words && $COMPLETE_UTIL_TRACE;
  
      # word-mode matching
      {
          last unless $word_mode && !@words;
          my @split_wordn = $wordn =~ /(\w+)/g;
          unshift @split_wordn, '' if $wordn =~ /\A\W/;
          last unless @split_wordn > 1;
          my $re = '\A';
          for my $i (0..$#split_wordn) {
              $re .= '(?:\W+\w+)*\W+' if $i;
              $re .= quotemeta($split_wordn[$i]).'\w*';
          }
          $re = qr/$re/;
          log_trace("[computil] Trying word-mode matching (re=%s) ...", $re) if $COMPLETE_UTIL_TRACE;
  
          for my $i (0..$#array) {
              my $match;
              {
                  if ($arrayn[$i] =~ $re) {
                      $match++;
                      last;
                  }
                  # try splitting CamelCase into Camel-Case
                  my $tmp = $array[$i];
                  if ($tmp =~ s/([a-z0-9_])([A-Z])/$1-$2/g) {
                      $tmp = uc($tmp) if $ci; $tmp =~ s/_/-/g if $map_case; # normalize again
                      if ($tmp =~ $re) {
                          $match++;
                          last;
                      }
                  }
              }
              next unless $match;
              push @words, $array[$i];
              push @wordsumms, $arraysumms[$i] if $summaries;
          }
          log_trace("[computil] Result from word-mode matching: %s", \@words) if @words && $COMPLETE_UTIL_TRACE;
      }
  
      # prefix char-mode matching
      if ($char_mode && !@words && length($wordn) && length($wordn) <= 7) {
          my $re = join(".*", map {quotemeta} split(//, $wordn));
          $re = qr/\A$re/;
          log_trace("[computil] Trying prefix char-mode matching (re=%s) ...", $re) if $COMPLETE_UTIL_TRACE;
          for my $i (0..$#array) {
              if ($arrayn[$i] =~ $re) {
                  push @words, $array[$i];
                  push @wordsumms, $arraysumms[$i] if $summaries;
              }
          }
          log_trace("[computil] Result from prefix char-mode matching: %s", \@words) if @words && $COMPLETE_UTIL_TRACE;
      }
  
      # char-mode matching
      if ($char_mode && !@words && length($wordn) && length($wordn) <= 7) {
          my $re = join(".*", map {quotemeta} split(//, $wordn));
          $re = qr/$re/;
          log_trace("[computil] Trying char-mode matching (re=%s) ...", $re) if $COMPLETE_UTIL_TRACE;
          for my $i (0..$#array) {
              if ($arrayn[$i] =~ $re) {
                  push @words, $array[$i];
                  push @wordsumms, $arraysumms[$i] if $summaries;
              }
          }
          log_trace("[computil] Result from char-mode matching: %s", \@words) if @words && $COMPLETE_UTIL_TRACE;
      }
  
      # fuzzy matching
      if ($fuzzy && !@words) {
          log_trace("[computil] Trying fuzzy matching ...") if $COMPLETE_UTIL_TRACE;
          $code_editdist //= do {
              my $env = $ENV{COMPLETE_UTIL_LEVENSHTEIN} // '';
              if ($env eq 'xs') {
                  require Text::Levenshtein::XS;
                  $editdist_flex = 0;
                  \&Text::Levenshtein::XS::distance;
              } elsif ($env eq 'flexible') {
                  require Text::Levenshtein::Flexible;
                  $editdist_flex = 1;
                  \&Text::Levenshtein::Flexible::levenshtein_l;
              } elsif ($env eq 'pp') {
                  $editdist_flex = 0;
                  \&__editdist;
              } elsif (eval { require Text::Levenshtein::Flexible; 1 }) {
                  $editdist_flex = 1;
                  \&Text::Levenshtein::Flexible::levenshtein_l;
              } else {
                  $editdist_flex = 0;
                  \&__editdist;
              }
          };
  
          my $factor = 1.3;
          my $x = -1;
          my $y = 1;
  
          # note: we cannot use Text::Levenshtein::Flexible::levenshtein_l_all()
          # because we perform distance calculation on the normalized array but we
          # want to get the original array elements
  
          my %editdists;
        ELEM:
          for my $i (0..$#array) {
              my $eln = $arrayn[$i];
  
              for my $l (length($wordn)-$y .. length($wordn)+$y) {
                  next if $l <= 0;
                  my $chopped = substr($eln, 0, $l);
                  my $maxd = __min(
                      __min(length($chopped), length($word))/$factor,
                      $fuzzy,
                  );
                  my $d;
                  unless (defined $editdists{$chopped}) {
                      if ($editdist_flex) {
                          $d = $code_editdist->($wordn, $chopped, $maxd);
                          next ELEM unless defined $d;
                      } else {
                          $d = $code_editdist->($wordn, $chopped);
                      }
                      $editdists{$chopped} = $d;
                  } else {
                      $d = $editdists{$chopped};
                  }
                  #say "D: d($word,$chopped)=$d (maxd=$maxd)";
                  next unless $d <= $maxd;
                  push @words, $array[$i];
                  push @wordsumms, $arraysumms[$i] if $summaries;
                  next ELEM;
              }
          }
          log_trace("[computil] Result from fuzzy matching: %s", \@words) if @words && $COMPLETE_UTIL_TRACE;
      }
  
      # replace back the words from replace_map
      if ($rmapn && @words) {
          my @wordsn;
          for my $el (@words) {
              my $eln = $ci ? uc($el) : $el; $eln =~ s/_/-/g if $map_case;
              push @wordsn, $eln;
          }
          for my $i (0..$#words) {
              if (my $w = $rev_rmapn->{$wordsn[$i]}) {
                  $words[$i] = $w;
              }
          }
      }
  
      # sort results and insert summaries
      $res = [
          map {
              $summaries ?
                  {word=>$words[$_], summary=>$wordsumms[$_]} :
                  $words[$_]
              }
              sort {
                  $ci ?
                      lc($words[$a]) cmp lc($words[$b]) :
                      $words[$a]     cmp $words[$b] }
              0 .. $#words
          ];
  
    RETURN_RES:
      log_trace("[computil] leaving complete_array_elem(), res=%s", $res)
          if $COMPLETE_UTIL_TRACE;
      $res;
  }
  
  $SPEC{complete_hash_key} = {
      v => 1.1,
      summary => 'Complete from hash keys',
      args => {
          %arg_word,
          hash      => { schema=>['hash*'=>{}], req=>1 },
          summaries => { schema=>['hash*'=>{}] },
          summaries_from_hash_values => { schema=>'true*' },
      },
      result_naked => 1,
      result => {
          schema => 'array',
      },
      args_rels => {
          choose_one => ['summaries', 'summaries_from_hash_values'],
      },
  };
  sub complete_hash_key {
      my %args  = @_;
      my $hash      = $args{hash} or die "Please specify hash";
      my $word      = $args{word} // "";
      my $summaries = $args{summaries};
      my $summaries_from_hash_values = $args{summaries_from_hash_values};
  
      my @keys = keys %$hash;
      my @summaries;
      my $has_summary;
      if ($summaries) {
          $has_summary++;
          for (@keys) { push @summaries, $summaries->{$_} }
      } elsif ($summaries_from_hash_values) {
          $has_summary++;
          for (@keys) { push @summaries, $hash->{$_} }
      }
  
      complete_array_elem(
          word=>$word, array=>\@keys,
          (summaries=>\@summaries) x !!$has_summary,
      );
  }
  
  my %complete_comma_sep_args = (
      %complete_array_elem_args,
      sep => {
          schema  => 'str*',
          default => ',',
      },
      uniq => {
          summary => 'Whether list should contain unique elements',
          description => <<'_',
  
  When this option is set to true, if the formed list in the current word already
  contains an element, the element will not be offered again as completion answer.
  For example, if `elems` is `[1,2,3,4]` and `word` is `2,3,` then without `uniq`
  set to true the completion answer is:
  
      2,3,1
      2,3,2
      2,3,3
      2,3,4
  
  but with `uniq` set to true, the completion answer becomes:
  
      2,3,1
      2,3,4
  
  See also the `remaining` option for a more general mechanism of offering fewer
  elements.
  
  _
          schema => ['bool*', is=>1],
      },
      remaining => {
          schema => ['code*'],
          summary => 'What elements should remain for completion',
          description => <<'_',
  
  This is a more general mechanism if the `uniq` option does not suffice. Suppose
  you are offering completion for sorting fields. The elements are field names as
  well as field names prefixed with dash (`-`) to mean sorting with a reverse
  order. So for example `elems` is `["name","-name","age","-age"]`. When current
  word is `name`, it doesn't make sense to offer `name` nor `-name` again as the
  next sorting field. So we can set `remaining` to this code:
  
      sub {
          my ($seen_elems, $elems) = @_;
  
          my %seen;
          for (@$seen_elems) {
              (my $nodash = $_) =~ s/^-//;
              $seen{$nodash}++;
          }
  
          my @remaining;
          for (@$elems) {
              (my $nodash = $_) =~ s/^-//;
              push @remaining, $_ unless $seen{$nodash};
          }
  
          \@remaining;
      }
  
  As you can see above, the code is given `$seen_elems` and `$elems` as arguments
  and is expected to return remaining elements to offer.
  
  _
          tags => ['hidden-cli'],
      },
  );
  $complete_comma_sep_args{elems} = delete $complete_comma_sep_args{array};
  
  $SPEC{complete_comma_sep} = {
      v => 1.1,
      summary => 'Complete a comma-separated list string',
      args => {
          %complete_comma_sep_args,
      },
      result_naked => 1,
      result => {
          schema => 'array',
      },
  };
  sub complete_comma_sep {
      my %args  = @_;
      my $word      = delete $args{word} // "";
      my $sep       = delete $args{sep} // ',';
      my $elems     = delete $args{elems} or die "Please specify elems";
      my $uniq      = delete $args{uniq};
      my $remaining = delete $args{remaining};
  
      my $ci = $Complete::Common::OPT_CI;
  
      my @mentioned_elems = split /\Q$sep\E/, $word, -1;
      my $cae_word = @mentioned_elems ? pop(@mentioned_elems) : '';
  
      my $remaining_elems;
      if ($remaining) {
          $remaining_elems = $remaining->(\@mentioned_elems, $elems);
      } elsif ($uniq) {
          my %mem;
          $remaining_elems = [];
          for (@mentioned_elems) {
              if ($ci) { $mem{lc $_}++ } else { $mem{$_}++ }
          }
          for (@$elems) {
              push @$remaining_elems, $_ unless ($ci ? $mem{lc $_} : $mem{$_});
          }
      } else {
          $remaining_elems = $elems;
      }
  
      my $cae_res = complete_array_elem(
          %args,
          word  => $cae_word,
          array => $remaining_elems,
      );
  
      my $prefix = join($sep, @mentioned_elems);
      $prefix .= $sep if @mentioned_elems;
      $cae_res = [map { "$prefix$_" } @$cae_res];
  
      # add trailing comma for convenience, where appropriate
      {
          last unless @$cae_res == 1;
          last if @$remaining_elems <= 1;
          $cae_res = [{word=>"$cae_res->[0]$sep", is_partial=>1}];
      }
      $cae_res;
  }
  
  $SPEC{combine_answers} = {
      v => 1.1,
      summary => 'Given two or more answers, combine them into one',
      description => <<'_',
  
  This function is useful if you want to provide a completion answer that is
  gathered from multiple sources. For example, say you are providing completion
  for the Perl tool <prog:cpanm>, which accepts a filename (a tarball like
  `*.tar.gz`), a directory, or a module name. You can do something like this:
  
      combine_answers(
          complete_file(word=>$word),
          complete_module(word=>$word),
      );
  
  But if a completion answer has a metadata `final` set to true, then that answer
  is used as the final answer without any combining with the other answers.
  
  _
      args => {
          answers => {
              schema => [
                  'array*' => {
                      of => ['any*', of=>['hash*','array*']], # XXX answer_t
                      min_len => 1,
                  },
              ],
              req => 1,
              pos => 0,
              greedy => 1,
          },
      },
      args_as => 'array',
      result_naked => 1,
      result => {
          schema => 'hash*',
          description => <<'_',
  
  Return a combined completion answer. Words from each input answer will be
  combined, order preserved and duplicates removed. The other keys from each
  answer will be merged.
  
  _
      },
  };
  sub combine_answers {
      require List::Util;
  
      return undef unless @_;
      return $_[0] if @_ < 2;
  
      my $final = {words=>[]};
      my $encounter_hash;
      my $add_words = sub {
          my $words = shift;
          for my $entry (@$words) {
              push @{ $final->{words} }, $entry
                  unless List::Util::first(
                      sub {
                          (ref($entry) ? $entry->{word} : $entry)
                              eq
                                  (ref($_) ? $_->{word} : $_)
                              }, @{ $final->{words} }
                          );
          }
      };
  
    ANSWER:
      for my $ans (@_) {
          if (ref($ans) eq 'ARRAY') {
              $add_words->($ans);
          } elsif (ref($ans) eq 'HASH') {
              $encounter_hash++;
  
              if ($ans->{final}) {
                  $final = $ans;
                  last ANSWER;
              }
  
              $add_words->($ans->{words} // []);
              for (keys %$ans) {
                  if ($_ eq 'words') {
                      next;
                  } elsif ($_ eq 'static') {
                      if (exists $final->{$_}) {
                          $final->{$_} &&= $ans->{$_};
                      } else {
                          $final->{$_} = $ans->{$_};
                      }
                  } else {
                      $final->{$_} = $ans->{$_};
                  }
              }
          }
      }
  
      $encounter_hash ? $final : $final->{words};
  }
  
  $SPEC{modify_answer} = {
      v => 1.1,
      summary => 'Modify answer (add prefix/suffix, etc)',
      args => {
          answer => {
              schema => ['any*', of=>['hash*','array*']], # XXX answer_t
              req => 1,
              pos => 0,
          },
          suffix => {
              schema => 'str*',
          },
          prefix => {
              schema => 'str*',
          },
      },
      result_naked => 1,
      result => {
          schema => 'undef',
      },
  };
  sub modify_answer {
      my %args = @_;
  
      my $answer = $args{answer};
      my $words = ref($answer) eq 'HASH' ? $answer->{words} : $answer;
  
      if (defined(my $prefix = $args{prefix})) {
          for (@$words) {
              if (ref $_ eq 'HASH') {
                  $_->{word} = "$prefix$_->{word}";
              } else {
                  $_ = "$prefix$_";
              }
          }
      }
      if (defined(my $suffix = $args{suffix})) {
          for (@$words) {
              if (ref $_ eq 'HASH') {
                  $_->{word} = "$_->{word}$suffix";
              } else {
                  $_ = "$_$suffix";
              }
          }
      }
      $answer;
  }
  
  $SPEC{ununiquify_answer} = {
      v => 1.1,
      summary => 'If answer contains only one item, make it two',
      description => <<'_',
  
  For example, if answer is `["a"]`, then will make answer become `["a","a "]`.
  This will prevent shell from automatically adding space.
  
  _
      args => {
          answer => {
              schema => ['any*', of=>['hash*','array*']], # XXX answer_t
              req => 1,
              pos => 0,
          },
      },
      result_naked => 1,
      result => {
          schema => 'undef',
      },
      tags => ['hidden'],
  };
  sub ununiquify_answer {
      my %args = @_;
  
      my $answer = $args{answer};
      my $words = ref($answer) eq 'HASH' ? $answer->{words} : $answer;
  
      if (@$words == 1) {
          push @$words, "$words->[0] ";
      }
      undef;
  }
  
  1;
  # ABSTRACT: General completion routine
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Complete::Util - General completion routine
  
  =head1 VERSION
  
  This document describes version 0.611 of Complete::Util (from Perl distribution Complete-Util), released on 2020-01-28.
  
  =head1 DESCRIPTION
  
  
  This package provides some generic completion routines that follow the
  L<Complete> convention. (If you are looking for bash/shell tab completion
  routines, take a look at the See Also section.) The main routine is
  C<complete_array_elem> which tries to complete a word using choices from elements
  of supplied array. For example:
  
   complete_array_elem(word => "a", array => ["apple", "apricot", "banana"]);
  
  The routine will first try a simple substring prefix matching. If that fails,
  will try some other methods like word-mode, character-mode, or fuzzy matching.
  These methods can be disabled using settings.
  
  There are other utility routines e.g. for converting completion answer structure
  from hash to array/array to hash, combine or modify answer, etc. These routines
  are usually used by the other more specific or higher-level completion modules.
  
  =head1 FUNCTIONS
  
  
  =head2 answer_has_entries
  
  Usage:
  
   answer_has_entries($answer) -> int
  
  Check if answer has entries.
  
  It is equivalent to:
  
   ref $answer eq 'ARRAY' ? (@$answer ? 1:0) : (@{$answer->{words}} ? 1:0);
  
  This function is not exported by default, but exportable.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<$answer>* => I<array|hash>
  
  Completion answer structure.
  
  
  =back
  
  Return value:  (int)
  
  
  
  =head2 answer_num_entries
  
  Usage:
  
   answer_num_entries($answer) -> int
  
  Get the number of entries in an answer.
  
  It is equivalent to:
  
   ref $answer eq 'ARRAY' ? (@$answer // 0) : (@{$answer->{words}} // 0);
  
  This function is not exported by default, but exportable.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<$answer>* => I<array|hash>
  
  Completion answer structure.
  
  
  =back
  
  Return value:  (int)
  
  
  
  =head2 arrayify_answer
  
  Usage:
  
   arrayify_answer($answer) -> array
  
  Make sure we return completion answer in array form.
  
  This is the reverse of C<hashify_answer>. It accepts a hash or an array. If it
  receives a hash, will return its C<words> key.
  
  This function is not exported by default, but exportable.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<$answer>* => I<array|hash>
  
  Completion answer structure.
  
  
  =back
  
  Return value:  (array)
  
  
  
  =head2 combine_answers
  
  Usage:
  
   combine_answers($answers, ...) -> hash
  
  Given two or more answers, combine them into one.
  
  This function is useful if you want to provide a completion answer that is
  gathered from multiple sources. For example, say you are providing completion
  for the Perl tool L<cpanm>, which accepts a filename (a tarball like
  C<*.tar.gz>), a directory, or a module name. You can do something like this:
  
   combine_answers(
       complete_file(word=>$word),
       complete_module(word=>$word),
   );
  
  But if a completion answer has a metadata C<final> set to true, then that answer
  is used as the final answer without any combining with the other answers.
  
  This function is not exported by default, but exportable.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<$answers>* => I<array[hash|array]>
  
  
  =back
  
  Return value:  (hash)
  
  
  Return a combined completion answer. Words from each input answer will be
  combined, order preserved and duplicates removed. The other keys from each
  answer will be merged.
  
  
  
  =head2 complete_array_elem
  
  Usage:
  
   complete_array_elem(%args) -> array
  
  Complete from array.
  
  Try to find completion from an array of strings. Will attempt several methods,
  from the cheapest and most discriminating to the most expensive and least
  discriminating.
  
  First method is normal/exact string prefix matching (either case-sensitive or
  insensitive depending on the C<$Complete::Common::OPT_CI> variable or the
  C<COMPLETE_OPT_CI> environment variable). If at least one match is found, return
  result. Else, proceed to the next method.
  
  Word-mode matching (can be disabled by setting
  C<$Complete::Common::OPT_WORD_MODE> or C<COMPLETE_OPT_WORD_MODE> environment
  varialbe to false). Word-mode matching is described in L<Complete::Common>. If
  at least one match is found, return result. Else, proceed to the next method.
  
  Prefix char-mode matching (can be disabled by settings
  C<$Complete::Common::OPT_CHAR_MODE> or C<COMPLETE_OPT_CHAR_MODE> environment
  variable to false). Prefix char-mode matching is just like char-mode matching
  (see next paragraph) except the first character must match. If at least one
  match is found, return result. Else, proceed to the next method.
  
  Char-mode matching (can be disabled by settings
  C<$Complete::Common::OPT_CHAR_MODE> or C<COMPLETE_OPT_CHAR_MODE> environment
  variable to false). Char-mode matching is described in L<Complete::Common>. If
  at least one match is found, return result. Else, proceed to the next method.
  
  Fuzzy matching (can be disabled by setting C<$Complete::Common::OPT_FUZZY> or
  C<COMPLETE_OPT_FUZZY> to false). Fuzzy matching is described in
  L<Complete::Common>. If at least one match is found, return result. Else,
  return empty string.
  
  Will sort the resulting completion list, so you don't have to presort the array.
  
  This function is not exported by default, but exportable.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<array>* => I<array[str]>
  
  =item * B<exclude> => I<array>
  
  =item * B<replace_map> => I<hash>
  
  You can supply correction entries in this option. An example is when array if
  C<['mount','unmount']> and C<umount> is a popular "typo" for C<unmount>. When
  someone already types C<um> it cannot be completed into anything (even the
  current fuzzy mode will return I<both> so it cannot complete immediately).
  
  One solution is to add replace_map C<< {'unmount'=E<gt>['umount']} >>. This way, C<umount>
  will be regarded the same as C<unmount> and when user types C<um> it can be
  completed unambiguously into C<unmount>.
  
  =item * B<summaries> => I<array[str]>
  
  =item * B<word>* => I<str> (default: "")
  
  Word to complete.
  
  
  =back
  
  Return value:  (array)
  
  
  
  =head2 complete_comma_sep
  
  Usage:
  
   complete_comma_sep(%args) -> array
  
  Complete a comma-separated list string.
  
  This function is not exported by default, but exportable.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<elems>* => I<array[str]>
  
  =item * B<exclude> => I<array>
  
  =item * B<remaining> => I<code>
  
  What elements should remain for completion.
  
  This is a more general mechanism if the C<uniq> option does not suffice. Suppose
  you are offering completion for sorting fields. The elements are field names as
  well as field names prefixed with dash (C<->) to mean sorting with a reverse
  order. So for example C<elems> is C<["name","-name","age","-age"]>. When current
  word is C<name>, it doesn't make sense to offer C<name> nor C<-name> again as the
  next sorting field. So we can set C<remaining> to this code:
  
   sub {
       my ($seen_elems, $elems) = @_;
   
       my %seen;
       for (@$seen_elems) {
           (my $nodash = $_) =~ s/^-//;
           $seen{$nodash}++;
       }
   
       my @remaining;
       for (@$elems) {
           (my $nodash = $_) =~ s/^-//;
           push @remaining, $_ unless $seen{$nodash};
       }
   
       \@remaining;
   }
  
  As you can see above, the code is given C<$seen_elems> and C<$elems> as arguments
  and is expected to return remaining elements to offer.
  
  =item * B<replace_map> => I<hash>
  
  You can supply correction entries in this option. An example is when array if
  C<['mount','unmount']> and C<umount> is a popular "typo" for C<unmount>. When
  someone already types C<um> it cannot be completed into anything (even the
  current fuzzy mode will return I<both> so it cannot complete immediately).
  
  One solution is to add replace_map C<< {'unmount'=E<gt>['umount']} >>. This way, C<umount>
  will be regarded the same as C<unmount> and when user types C<um> it can be
  completed unambiguously into C<unmount>.
  
  =item * B<sep> => I<str> (default: ",")
  
  =item * B<summaries> => I<array[str]>
  
  =item * B<uniq> => I<bool>
  
  Whether list should contain unique elements.
  
  When this option is set to true, if the formed list in the current word already
  contains an element, the element will not be offered again as completion answer.
  For example, if C<elems> is C<[1,2,3,4]> and C<word> is C<2,3,> then without C<uniq>
  set to true the completion answer is:
  
   2,3,1
   2,3,2
   2,3,3
   2,3,4
  
  but with C<uniq> set to true, the completion answer becomes:
  
   2,3,1
   2,3,4
  
  See also the C<remaining> option for a more general mechanism of offering fewer
  elements.
  
  =item * B<word>* => I<str> (default: "")
  
  Word to complete.
  
  
  =back
  
  Return value:  (array)
  
  
  
  =head2 complete_hash_key
  
  Usage:
  
   complete_hash_key(%args) -> array
  
  Complete from hash keys.
  
  This function is not exported by default, but exportable.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<hash>* => I<hash>
  
  =item * B<summaries> => I<hash>
  
  =item * B<summaries_from_hash_values> => I<true>
  
  =item * B<word>* => I<str> (default: "")
  
  Word to complete.
  
  
  =back
  
  Return value:  (array)
  
  
  
  =head2 hashify_answer
  
  Usage:
  
   hashify_answer($answer, $meta) -> hash
  
  Make sure we return completion answer in hash form.
  
  This function accepts a hash or an array. If it receives an array, will convert
  the array into `{words=>$ary}' first to make sure the completion answer is in
  hash form.
  
  Then will add keys from C<meta> to the hash.
  
  This function is not exported by default, but exportable.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<$answer>* => I<array|hash>
  
  Completion answer structure.
  
  =item * B<$meta> => I<hash>
  
  Metadata (extra keys) for the hash.
  
  
  =back
  
  Return value:  (hash)
  
  
  
  =head2 modify_answer
  
  Usage:
  
   modify_answer(%args) -> undef
  
  Modify answer (add prefixE<sol>suffix, etc).
  
  This function is not exported by default, but exportable.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<answer>* => I<hash|array>
  
  =item * B<prefix> => I<str>
  
  =item * B<suffix> => I<str>
  
  
  =back
  
  Return value:  (undef)
  
  =for Pod::Coverage ^(ununiquify_answer)$
  
  =head1 FAQ
  
  =head2 Why is fuzzy matching slow?
  
  Example:
  
   use Benchmark qw(timethis);
   use Complete::Util qw(complete_array_elem);
  
   # turn off the other non-exact matching methods
   $Complete::Common::OPT_CI = 0;
   $Complete::Common::OPT_WORD_MODE = 0;
   $Complete::Common::OPT_CHAR_MODE = 0;
  
   my @ary = ("aaa".."zzy"); # 17575 elems
   timethis(20, sub { complete_array_elem(array=>\@ary, word=>"zzz") });
  
  results in:
  
   timethis 20:  7 wallclock secs ( 6.82 usr +  0.00 sys =  6.82 CPU) @  2.93/s (n=20)
  
  Answer: fuzzy matching is slower than exact matching due to having to calculate
  Levenshtein distance. But if you find fuzzy matching too slow using the default
  pure-perl implementation, you might want to install
  L<Text::Levenshtein::Flexible> (an optional prereq) to speed up fuzzy matching.
  After Text::Levenshtein::Flexible is installed:
  
   timethis 20:  1 wallclock secs ( 1.04 usr +  0.00 sys =  1.04 CPU) @ 19.23/s (n=20)
  
  =head1 ENVIRONMENT
  
  =head2 COMPLETE_UTIL_TRACE
  
  Bool. If set to true, will generate more log statements for debugging (at the
  trace level).
  
  =head2 COMPLETE_UTIL_LEVENSHTEIN => str ('pp'|'xs'|'flexible')
  
  Can be used to force which Levenshtein distance implementation to use. C<pp>
  means the included PP implementation, which is the slowest (1-2 orders of
  magnitude slower than XS implementations), C<xs> which means
  L<Text::Levenshtein::XS>, or C<flexible> which means
  L<Text::Levenshtein::Flexible> (performs best).
  
  If this is not set, the default is to use Text::Levenshtein::Flexible when it's
  available, then fallback to the included PP implementation.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Complete-Util>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Complete-Util>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Complete-Util>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Complete>
  
  If you want to do bash tab completion with Perl, take a look at
  L<Complete::Bash> or L<Getopt::Long::Complete> or L<Perinci::CmdLine>.
  
  Other C<Complete::*> modules.
  
  L<Bencher::Scenarios::CompleteUtil>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2017, 2016, 2015, 2014, 2013 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
COMPLETE_UTIL

    $main::fatpacked{"Complete/Zsh.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'COMPLETE_ZSH';
  package Complete::Zsh;
  
  our $DATE = '2016-10-22'; # DATE
  our $VERSION = '0.03'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  require Exporter;
  our @ISA = qw(Exporter);
  our @EXPORT_OK = qw(
                         parse_cmdline
                         format_completion
                 );
  
  require Complete::Bash;
  
  our %SPEC;
  
  $SPEC{':package'} = {
      v => 1.1,
      summary => 'Completion module for zsh shell',
  };
  
  $SPEC{format_completion} = {
      v => 1.1,
      summary => 'Format completion for output (for shell)',
      description => <<'_',
  
  zsh accepts completion reply in the form of one entry per line to STDOUT.
  Currently the formatting is done using `Complete::Bash`'s `format_completion`.
  
  _
      args_as => 'array',
      args => {
          completion => {
              summary => 'Completion answer structure',
              description => <<'_',
  
  Either an array or hash, as described in `Complete`.
  
  _
              schema=>['any*' => of => ['hash*', 'array*']],
              req=>1,
              pos=>0,
          },
      },
      result => {
          summary => 'Formatted string (or array, if `as` key is set to `array`)',
          schema => ['any*' => of => ['str*', 'array*']],
      },
      result_naked => 1,
  };
  sub format_completion {
      Complete::Bash::format_completion(@_);
  }
  
  1;
  # ABSTRACT: Completion module for zsh shell
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Complete::Zsh - Completion module for zsh shell
  
  =head1 VERSION
  
  This document describes version 0.03 of Complete::Zsh (from Perl distribution Complete-Zsh), released on 2016-10-22.
  
  =head1 DESCRIPTION
  
  This module provides routines related to doing completion in zsh.
  
  =head1 FUNCTIONS
  
  
  =head2 format_completion($completion) -> str|array
  
  Format completion for output (for shell).
  
  zsh accepts completion reply in the form of one entry per line to STDOUT.
  Currently the formatting is done using C<Complete::Bash>'s C<format_completion>.
  
  This function is not exported by default, but exportable.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<$completion>* => I<hash|array>
  
  Completion answer structure.
  
  Either an array or hash, as described in C<Complete>.
  
  =back
  
  Return value: Formatted string (or array, if `as` key is set to `array`) (str|array)
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Complete-Zsh>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/sharyanto/perl-Complete-Zsh>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Complete-Zsh>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Complete>
  
  L<Complete::Bash>, L<Complete::Fish>, L<Complete::Tcsh>.
  
  zshcompctl manual page.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
COMPLETE_ZSH

    $main::fatpacked{"Config/IOD/Base.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'CONFIG_IOD_BASE';
  package Config::IOD::Base;
  
  our $DATE = '2019-01-17'; # DATE
  our $VERSION = '0.342'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  #use Carp; # avoided to shave a bit of startup time
  
  use constant +{
      COL_V_ENCODING => 0, # either "!j"... or '"', '[', '{', '~'
      COL_V_WS1 => 1,
      COL_V_VALUE => 2,
      COL_V_WS2 => 3,
      COL_V_COMMENT_CHAR => 4,
      COL_V_COMMENT => 5,
  };
  
  sub new {
      my ($class, %attrs) = @_;
      $attrs{default_section} //= 'GLOBAL';
      $attrs{allow_bang_only} //= 1;
      $attrs{allow_duplicate_key} //= 1;
      $attrs{enable_directive} //= 1;
      $attrs{enable_encoding} //= 1;
      $attrs{enable_quoting}  //= 1;
      $attrs{enable_bracket}  //= 1;
      $attrs{enable_brace}    //= 1;
      $attrs{enable_tilde}    //= 1;
      $attrs{enable_expr}     //= 0;
      $attrs{expr_vars}       //= {};
      $attrs{ignore_unknown_directive} //= 0;
      # allow_encodings
      # disallow_encodings
      # allow_directives
      # disallow_directives
      bless \%attrs, $class;
  }
  
  # borrowed from Parse::CommandLine. differences: returns arrayref. return undef
  # on error (instead of dying).
  sub _parse_command_line {
      my ($self, $str) = @_;
  
      $str =~ s/\A\s+//ms;
      $str =~ s/\s+\z//ms;
  
      my @argv;
      my $buf;
      my $escaped;
      my $double_quoted;
      my $single_quoted;
  
      for my $char (split //, $str) {
          if ($escaped) {
              $buf .= $char;
              $escaped = undef;
              next;
          }
  
          if ($char eq '\\') {
              if ($single_quoted) {
                  $buf .= $char;
              }
              else {
                  $escaped = 1;
              }
              next;
          }
  
          if ($char =~ /\s/) {
              if ($single_quoted || $double_quoted) {
                  $buf .= $char;
              }
              else {
                  push @argv, $buf if defined $buf;
                  undef $buf;
              }
              next;
          }
  
          if ($char eq '"') {
              if ($single_quoted) {
                  $buf .= $char;
                  next;
              }
              $double_quoted = !$double_quoted;
              next;
          }
  
          if ($char eq "'") {
              if ($double_quoted) {
                  $buf .= $char;
                  next;
              }
              $single_quoted = !$single_quoted;
              next;
          }
  
          $buf .= $char;
      }
      push @argv, $buf if defined $buf;
  
      if ($escaped || $single_quoted || $double_quoted) {
          return undef;
      }
  
      \@argv;
  }
  
  # return ($err, $res, $decoded_val)
  sub _parse_raw_value {
      my ($self, $val, $needs_res) = @_;
  
      if ($val =~ /\A!/ && $self->{enable_encoding}) {
  
          $val =~ s/!(\w+)(\s+)// or return ("Invalid syntax in encoded value");
          my ($enc, $ws1) = ($1, $2);
  
          my $res; $res = [
              "!$enc", # COL_V_ENCODING
              $ws1, # COL_V_WS1
              $1, # COL_V_VALUE
              $2, # COL_V_WS2
              $3, # COL_V_COMMENT_CHAR
              $4, # COL_V_COMMENT
          ] if $needs_res;
  
          # canonicalize shorthands
          $enc = "json" if $enc eq 'j';
          $enc = "hex"  if $enc eq 'h';
          $enc = "expr" if $enc eq 'e';
  
          if ($self->{allow_encodings}) {
              return ("Encoding '$enc' is not in ".
                          "allow_encodings list")
                  unless grep {$_ eq $enc} @{$self->{allow_encodings}};
          }
          if ($self->{disallow_encodings}) {
              return ("Encoding '$enc' is in ".
                          "disallow_encodings list")
                  if grep {$_ eq $enc} @{$self->{disallow_encodings}};
          }
  
          if ($enc eq 'json') {
  
              # XXX imperfect regex for simplicity, comment should not contain
              # "]", '"', or '}' or it will be gobbled up as value by greedy regex
              # quantifier
              $val =~ /\A
                       (".*"|\[.*\]|\{.*\}|\S+)
                       (\s*)
                       (?: ([;#])(.*) )?
                       \z/x or return ("Invalid syntax in JSON-encoded value");
              my $decode_res = $self->_decode_json($val);
              return ($decode_res->[1]) unless $decode_res->[0] == 200;
              return (undef, $res, $decode_res->[2]);
  
          } elsif ($enc eq 'path' || $enc eq 'paths') {
  
              my $decode_res = $self->_decode_path_or_paths($val, $enc);
              return ($decode_res->[1]) unless $decode_res->[0] == 200;
              return (undef, $res, $decode_res->[2]);
  
          } elsif ($enc eq 'hex') {
  
              $val =~ /\A
                       ([0-9A-Fa-f]*)
                       (\s*)
                       (?: ([;#])(.*) )?
                       \z/x or return ("Invalid syntax in hex-encoded value");
              my $decode_res = $self->_decode_hex($1);
              return ($decode_res->[1]) unless $decode_res->[0] == 200;
              return (undef, $res, $decode_res->[2]);
  
          } elsif ($enc eq 'base64') {
  
              $val =~ m!\A
                        ([A-Za-z0-9+/]*=*)
                        (\s*)
                        (?: ([;#])(.*) )?
                        \z!x or return ("Invalid syntax in base64-encoded value");
              my $decode_res = $self->_decode_base64($1);
              return ($decode_res->[1]) unless $decode_res->[0] == 200;
              return (undef, $res, $decode_res->[2]);
  
          } elsif ($enc eq 'none') {
  
              return (undef, $res, $val);
  
          } elsif ($enc eq 'expr') {
  
              return ("expr is not allowed (enable_expr=0)")
                  unless $self->{enable_expr};
              # XXX imperfect regex, expression can't contain # and ; because it
              # will be assumed as comment
              $val =~ m!\A
                        ((?:[^#;])+?)
                        (\s*)
                        (?: ([;#])(.*) )?
                        \z!x or return ("Invalid syntax in expr-encoded value");
              my $decode_res = $self->_decode_expr($1);
              return ($decode_res->[1]) unless $decode_res->[0] == 200;
              return (undef, $res, $decode_res->[2]);
  
          } else {
  
              return ("unknown encoding '$enc'");
  
          }
  
      } elsif ($val =~ /\A"/ && $self->{enable_quoting}) {
  
          $val =~ /\A
                   "( (?:
                           \\\\ | # backslash
                           \\.  | # escaped something
                           [^"\\]+ # non-doublequote or non-backslash
                       )* )"
                   (\s*)
                   (?: ([;#])(.*) )?
                   \z/x or return ("Invalid syntax in quoted string value");
          my $res; $res = [
              '"', # COL_V_ENCODING
              '', # COL_V_WS1
              $1, # VOL_V_VALUE
              $2, # COL_V_WS2
              $3, # COL_V_COMMENT_CHAR
              $4, # COL_V_COMMENT
          ] if $needs_res;
          my $decode_res = $self->_decode_json(qq("$1"));
          return ($decode_res->[1]) unless $decode_res->[0] == 200;
          return (undef, $res, $decode_res->[2]);
  
      } elsif ($val =~ /\A\[/ && $self->{enable_bracket}) {
  
          # XXX imperfect regex for simplicity, comment should not contain "]" or
          # it will be gobbled up as value by greedy regex quantifier
          $val =~ /\A
                   \[(.*)\]
                   (?:
                       (\s*)
                       ([#;])(.*)
                   )?
                   \z/x or return ("Invalid syntax in bracketed array value");
          my $res; $res = [
              '[', # COL_V_ENCODING
              '', # COL_V_WS1
              $1, # VOL_V_VALUE
              $2, # COL_V_WS2
              $3, # COL_V_COMMENT_CHAR
              $4, # COL_V_COMMENT
          ] if $needs_res;
          my $decode_res = $self->_decode_json("[$1]");
          return ($decode_res->[1]) unless $decode_res->[0] == 200;
          return (undef, $res, $decode_res->[2]);
  
      } elsif ($val =~ /\A\{/ && $self->{enable_brace}) {
  
          # XXX imperfect regex for simplicity, comment should not contain "}" or
          # it will be gobbled up as value by greedy regex quantifier
          $val =~ /\A
                   \{(.*)\}
                   (?:
                       (\s*)
                       ([#;])(.*)
                   )?
                   \z/x or return ("Invalid syntax in braced hash value");
          my $res; $res = [
              '{', # COL_V_ENCODING
              '', # COL_V_WS1
              $1, # VOL_V_VALUE
              $2, # COL_V_WS2
              $3, # COL_V_COMMENT_CHAR
              $4, # COL_V_COMMENT
          ] if $needs_res;
          my $decode_res = $self->_decode_json("{$1}");
          return ($decode_res->[1]) unless $decode_res->[0] == 200;
          return (undef, $res, $decode_res->[2]);
  
      } elsif ($val =~ /\A~/ && $self->{enable_tilde}) {
  
          $val =~ /\A
                   ~(.*)
                   (\s*)
                   (?: ([;#])(.*) )?
                   \z/x or return ("Invalid syntax in path value");
          my $res; $res = [
              '~', # COL_V_ENCODING
              '', # COL_V_WS1
              $1, # VOL_V_VALUE
              $2, # COL_V_WS2
              $3, # COL_V_COMMENT_CHAR
              $4, # COL_V_COMMENT
          ] if $needs_res;
  
          my $decode_res = $self->_decode_path_or_paths($val, 'path');
          return ($decode_res->[1]) unless $decode_res->[0] == 200;
          return (undef, $res, $decode_res->[2]);
  
      } else {
  
          $val =~ /\A
                   (.*?)
                   (\s*)
                   (?: ([#;])(.*) )?
                   \z/x or return ("Invalid syntax in value"); # shouldn't happen, regex should match any string
          my $res; $res = [
              '', # COL_V_ENCODING
              '', # COL_V_WS1
              $1, # VOL_V_VALUE
              $2, # COL_V_WS2
              $3, # COL_V_COMMENT_CHAR
              $4, # COL_V_COMMENT
          ] if $needs_res;
          return (undef, $res, $1);
  
      }
      # should not be reached
  }
  
  sub _get_my_user_name {
      if ($^O eq 'MSWin32') {
          return $ENV{USERNAME};
      } else {
          return $ENV{USER} if $ENV{USER};
          my @pw;
          eval { @pw = getpwuid($>) };
          return $pw[0] if @pw;
      }
  }
  
  # borrowed from PERLANCAR::File::HomeDir 0.04
  sub _get_my_home_dir {
      if ($^O eq 'MSWin32') {
          # File::HomeDir always uses exists($ENV{x}) first, does it want to avoid
          # accidentally creating env vars?
          return $ENV{HOME} if $ENV{HOME};
          return $ENV{USERPROFILE} if $ENV{USERPROFILE};
          return join($ENV{HOMEDRIVE}, "\\", $ENV{HOMEPATH})
              if $ENV{HOMEDRIVE} && $ENV{HOMEPATH};
      } else {
          return $ENV{HOME} if $ENV{HOME};
          my @pw;
          eval { @pw = getpwuid($>) };
          return $pw[7] if @pw;
      }
  
      die "Can't get home directory";
  }
  
  # borrowed from PERLANCAR::File::HomeDir 0.05, with some modifications
  sub _get_user_home_dir {
      my ($name) = @_;
  
      if ($^O eq 'MSWin32') {
          # not yet implemented
          return undef;
      } else {
          # IF and only if we have getpwuid support, and the name of the user is
          # our own, shortcut to my_home. This is needed to handle HOME
          # environment settings.
          if ($name eq getpwuid($<)) {
              return _get_my_home_dir();
          }
  
        SCOPE: {
              my $home = (getpwnam($name))[7];
              return $home if $home and -d $home;
          }
  
          return undef;
      }
  
  }
  
  sub _decode_json {
      my ($self, $val) = @_;
      state $json = do {
          if (eval { require Cpanel::JSON::XS; 1 }) {
              Cpanel::JSON::XS->new->allow_nonref;
          } else {
              require JSON::PP;
              JSON::PP->new->allow_nonref;
          }
      };
      my $res;
      eval { $res = $json->decode($val) };
      if ($@) {
          return [500, "Invalid JSON: $@"];
      } else {
          return [200, "OK", $res];
      }
  }
  
  sub _decode_path_or_paths {
      my ($self, $val, $which) = @_;
  
      if ($val =~ m!\A~([^/]+)?(?:/|\z)!) {
          my $home_dir = length($1) ?
              _get_user_home_dir($1) : _get_my_home_dir();
          unless ($home_dir) {
              if (length $1) {
                  return [500, "Can't get home directory for user '$1' in path"];
              } else {
                  return [500, "Can't get home directory for current user in path"];
              }
          }
          $val =~ s!\A~([^/]+)?!$home_dir!;
      }
      $val =~ s!(?<=.)/\z!!;
  
      if ($which eq 'path') {
          return [200, "OK", $val];
      } else {
          return [200, "OK", [glob $val]];
      }
  }
  
  sub _decode_hex {
      my ($self, $val) = @_;
      [200, "OK", pack("H*", $val)];
  }
  
  sub _decode_base64 {
      my ($self, $val) = @_;
      require MIME::Base64;
      [200, "OK", MIME::Base64::decode_base64($val)];
  }
  
  sub _decode_expr {
      require Config::IOD::Expr;
  
      my ($self, $val) = @_;
      no strict 'refs';
      local *{"Config::IOD::Expr::_Compiled::val"} = sub {
          my $arg = shift;
          if ($arg =~ /(.+)\.(.+)/) {
              return $self->{_res}{$1}{$2};
          } else {
              return $self->{_res}{ $self->{_cur_section} }{$arg};
          }
      };
      Config::IOD::Expr::_parse_expr($val);
  }
  
  sub _err {
      my ($self, $msg) = @_;
      die join(
          "",
          @{ $self->{_include_stack} } ? "$self->{_include_stack}[0] " : "",
          "line $self->{_linum}: ",
          $msg
      );
  }
  
  sub _push_include_stack {
      require Cwd;
  
      my ($self, $path) = @_;
  
      # included file's path is based on the main (topmost) file
      if (@{ $self->{_include_stack} }) {
          require File::Spec;
          my ($vol, $dir, $file) =
              File::Spec->splitpath($self->{_include_stack}[-1]);
          $path = File::Spec->rel2abs($path, File::Spec->catpath($vol, $dir));
      }
  
      my $abs_path = Cwd::abs_path($path) or return [400, "Invalid path name"];
      return [409, "Recursive", $abs_path]
          if grep { $_ eq $abs_path } @{ $self->{_include_stack} };
      push @{ $self->{_include_stack} }, $abs_path;
      return [200, "OK", $abs_path];
  }
  
  sub _pop_include_stack {
      my $self = shift;
  
      die "BUG: Overpopped _pop_include_stack"
          unless @{$self->{_include_stack}};
      pop @{ $self->{_include_stack} };
  }
  
  sub _init_read {
      my $self = shift;
  
      $self->{_include_stack} = [];
  
      # set expr variables
      {
          last unless $self->{enable_expr};
          no strict 'refs';
          my $pkg = \%{"Config::IOD::Expr::_Compiled::"};
          undef ${"Config::IOD::Expr::_Compiled::$_"} for keys %$pkg;
          my $vars = $self->{expr_vars};
          ${"Config::IOD::Expr::_Compiled::$_"} = $vars->{$_} for keys %$vars;
      }
  }
  
  sub _read_file {
      my ($self, $filename) = @_;
      open my $fh, "<", $filename
          or die "Can't open file '$filename': $!";
      binmode($fh, ":encoding(utf8)");
      local $/;
      my $res = scalar <$fh>;
      close $fh;
      $res;
  }
  
  sub read_file {
      my $self = shift;
      my $filename = shift;
      $self->_init_read;
      my $res = $self->_push_include_stack($filename);
      die "Can't read '$filename': $res->[1]" unless $res->[0] == 200;
      $res =
          $self->_read_string($self->_read_file($filename), @_);
      $self->_pop_include_stack;
      $res;
  }
  
  sub read_string {
      my $self = shift;
      $self->_init_read;
      $self->_read_string(@_);
  }
  
  1;
  # ABSTRACT: Base class for Config::IOD and Config::IOD::Reader
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Config::IOD::Base - Base class for Config::IOD and Config::IOD::Reader
  
  =head1 VERSION
  
  This document describes version 0.342 of Config::IOD::Base (from Perl distribution Config-IOD-Reader), released on 2019-01-17.
  
  =head1 EXPRESSION
  
  =for BEGIN_BLOCK: expression
  
  Expression allows you to do things like:
  
   [section1]
   foo=1
   bar="monkey"
  
   [section2]
   baz =!e 1+1
   qux =!e "grease" . val("section1.bar")
   quux=!e val("qux") . " " . val('baz')
  
  And the result will be:
  
   {
       section1 => {foo=>1, bar=>"monkey"},
       section2 => {baz=>2, qux=>"greasemonkey", quux=>"greasemonkey 2"},
   }
  
  For safety, you'll need to set C<enable_expr> attribute to 1 first to enable
  this feature.
  
  The syntax of the expression (the C<expr> encoding) is not officially specified
  yet in the L<IOD> specification. It will probably be Expr (see
  L<Language::Expr::Manual::Syntax>). At the moment, this module implements a very
  limited subset that is compatible (lowest common denominator) with Perl syntax
  and uses C<eval()> to evaluate the expression. However, only the limited subset
  is allowed (checked by Perl 5.10 regular expression).
  
  The supported terms:
  
   number
   string (double-quoted and single-quoted)
   undef literal
   simple variable ($abc, no namespace, no array/hash sigil, no special variables)
   function call (only the 'val' function is supported)
   grouping (parenthesis)
  
  The supported operators are:
  
   + - .
   * / % x
   **
   unary -, unary +, !, ~
  
  The C<val()> function refers to the configuration key. If the argument contains
  ".", it will be assumed as C<SECTIONNAME.KEYNAME>, otherwise it will access the
  current section's key. Since parsing is done in a single pass, you can only
  refer to the already mentioned key.
  
  Code will be compiled using Perl's C<eval()> in the
  C<Config::IOD::Expr::_Compiled> namespace, with C<no strict>, C<no warnings>.
  
  =for END_BLOCK: expression
  
  =head1 ATTRIBUTES
  
  =for BEGIN_BLOCK: attributes
  
  =head2 default_section => str (default: C<GLOBAL>)
  
  If a key line is specified before any section line, this is the section that the
  key will be put in.
  
  =head2 enable_directive => bool (default: 1)
  
  If set to false, then directives will not be parsed. Lines such as below will be
  considered a regular comment:
  
   ;!include foo.ini
  
  and lines such as below will be considered a syntax error (B<regardless> of the
  C<allow_bang_only> setting):
  
   !include foo.ini
  
  B<NOTE: Turning this setting off violates IOD specification.>
  
  =head2 enable_encoding => bool (default: 1)
  
  If set to false, then encoding notation will be ignored and key value will be
  parsed as verbatim. Example:
  
   name = !json null
  
  With C<enable_encoding> turned off, value will not be undef but will be string
  with the value of (as Perl literal) C<"!json null">.
  
  B<NOTE: Turning this setting off violates IOD specification.>
  
  =head2 enable_quoting => bool (default: 1)
  
  If set to false, then quotes on key value will be ignored and key value will be
  parsed as verbatim. Example:
  
   name = "line 1\nline2"
  
  With C<enable_quoting> turned off, value will not be a two-line string, but will
  be a one line string with the value of (as Perl literal) C<"line 1\\nline2">.
  
  B<NOTE: Turning this setting off violates IOD specification.>
  
  =head2 enable_bracket => bool (default: 1)
  
  If set to false, then JSON literal array will be parsed as verbatim. Example:
  
   name = [1,2,3]
  
  With C<enable_bracket> turned off, value will not be a three-element array, but
  will be a string with the value of (as Perl literal) C<"[1,2,3]">.
  
  B<NOTE: Turning this setting off violates IOD specification.>
  
  =head2 enable_brace => bool (default: 1)
  
  If set to false, then JSON literal object (hash) will be parsed as verbatim.
  Example:
  
   name = {"a":1,"b":2}
  
  With C<enable_brace> turned off, value will not be a hash with two pairs, but
  will be a string with the value of (as Perl literal) C<'{"a":1,"b":2}'>.
  
  B<NOTE: Turning this setting off violates IOD specification.>
  
  =head2 enable_tilde => bool (default: 1)
  
  If set to true (the default), then value that starts with C<~> (tilde) will be
  assumed to use !path encoding, unless an explicit encoding has been otherwise
  specified.
  
  Example:
  
   log_dir = ~/logs  ; ~ will be resolved to current user's home directory
  
  With C<enable_tilde> turned off, value will still be literally C<~/logs>.
  
  B<NOTE: Turning this setting off violates IOD specification.>
  
  =head2 allow_encodings => array
  
  If defined, set list of allowed encodings. Note that if C<disallow_encodings> is
  also set, an encoding must also not be in that list.
  
  Also note that, for safety reason, if you want to enable C<expr> encoding,
  you'll also need to set C<enable_expr> to 1.
  
  =head2 disallow_encodings => array
  
  If defined, set list of disallowed encodings. Note that if C<allow_encodings> is
  also set, an encoding must also be in that list.
  
  Also note that, for safety reason, if you want to enable C<expr> encoding,
  you'll also need to set C<enable_expr> to 1.
  
  =head2 enable_expr => bool (default: 0)
  
  Whether to enable C<expr> encoding. By default this is turned on, for safety.
  Please see L</"EXPRESSION"> for more details.
  
  =head2 allow_directives => array
  
  If defined, only directives listed here are allowed. Note that if
  C<disallow_directives> is also set, a directive must also not be in that list.
  
  =head2 disallow_directives => array
  
  If defined, directives listed here are not allowed. Note that if
  C<allow_directives> is also set, a directive must also be in that list.
  
  =head2 allow_bang_only => bool (default: 1)
  
  Since the mistake of specifying a directive like this:
  
   !foo
  
  instead of the correct:
  
   ;!foo
  
  is very common, the spec allows it. This reader, however, can be configured to
  be more strict.
  
  =head2 allow_duplicate_key => bool (default: 1)
  
  If set to 0, you can forbid duplicate key, e.g.:
  
   [section]
   a=1
   a=2
  
  or:
  
   [section]
   a=1
   b=2
   c=3
   a=10
  
  In traditional INI file, to specify an array you specify multiple keys. But when
  there is only a single key, it is unclear if the value is a single-element array
  or a scalar. You can use this setting to avoid this array/scalar ambiguity in
  config file and force user to use JSON encoding or bracket to specify array:
  
   [section]
   a=[1,2]
  
  B<NOTE: Turning this setting off violates IOD specification.>
  
  =head2 ignore_unknown_directive => bool (default: 0)
  
  If set to true, will not die if an unknown directive is encountered. It will
  simply be ignored as a regular comment.
  
  B<NOTE: Turning this setting on violates IOD specification.>
  
  =for END_BLOCK: attributes
  
  =head1 METHODS
  
  =for BEGIN_BLOCK: methods
  
  =head2 new(%attrs) => obj
  
  =head2 $reader->read_file($filename)
  
  Read IOD configuration from a file. Die on errors.
  
  =head2 $reader->read_string($str)
  
  Read IOD configuration from a string. Die on errors.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Config-IOD-Reader>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Config-IOD-Reader>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Config-IOD-Reader>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2019, 2018, 2017, 2016, 2015, 2014 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
CONFIG_IOD_BASE

    $main::fatpacked{"Config/IOD/Expr.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'CONFIG_IOD_EXPR';
  package Config::IOD::Expr;
  
  our $DATE = '2019-01-17'; # DATE
  our $VERSION = '0.342'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  
  my $EXPR_RE = qr{
  
  (?&ANSWER)
  
  (?(DEFINE)
  
  (?<ANSWER>    (?&ADD))
  (?<ADD>       (?&MULT)   | (?&MULT)  (?: \s* ([+.-]) \s* (?&MULT)  )+)
  (?<MULT>      (?&UNARY)  | (?&UNARY) (?: \s* ([*/x%]) \s* (?&UNARY))+)
  (?<UNARY>     (?&POWER)  | [!~+-] (?&POWER))
  (?<POWER>     (?&TERM)   | (?&TERM) (?: \s* \*\* \s* (?&TERM))+)
  
  (?<TERM>
      (?&NUM)
    | (?&STR_SINGLE)
    | (?&STR_DOUBLE)
    | undef
    | (?&VAR)
    | (?&FUNC)
    | \( \s* ((?&ANSWER)) \s* \)
  )
  
  (?<FUNC> val \s* \( (?&TERM) \))
  
  (?<NUM>
      (
       -?
       (?: 0 | [1-9][0-9]* )
       (?: \. [0-9]+ )?
       (?: [eE] [-+]? [0-9]+ )?
      )
  )
  
  (?<VAR> \$[A-Za-z_][A-Za-z0-9_]{0,63})
  
  (?<STR_SINGLE>
      (
       '
       (?:
           [^\\']+
         |
           \\ ['\\]
         |
           \\
       )*
       '
      )
  )
  
  (?<STR_DOUBLE>
      (
       "
       (?:
           [^\\"]+
         |
           \\ ["'\\\$tnrfbae]
  # octal, hex, wide hex
       )*
       "
      )
  )
  
  ) # DEFINE
  
  }msx;
  
  sub _parse_expr {
      my $str = shift;
  
      return [400, 'Not a valid expr'] unless $str =~ m{\A$EXPR_RE\z}o;
      my $res = eval "package Config::IOD::Expr::_Compiled; no strict; no warnings; $str";
      return [500, "Died when evaluating expr: $@"] if $@;
      [200, "OK", $res];
  }
  
  1;
  # ABSTRACT: Parse expression
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Config::IOD::Expr - Parse expression
  
  =head1 VERSION
  
  This document describes version 0.342 of Config::IOD::Expr (from Perl distribution Config-IOD-Reader), released on 2019-01-17.
  
  =head1 SYNOPSIS
  
  See L<Config::IOD::Reader> on how to use expressions in your IOD file.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Config-IOD-Reader>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Config-IOD-Reader>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Config-IOD-Reader>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2019, 2018, 2017, 2016, 2015, 2014 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
CONFIG_IOD_EXPR

    $main::fatpacked{"Config/IOD/INI/Reader.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'CONFIG_IOD_INI_READER';
  package Config::IOD::INI::Reader;
  
  our $DATE = '2019-01-17'; # DATE
  our $VERSION = '0.342'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  use parent qw(Config::IOD::Reader);
  
  sub new {
      my ($class, %attrs) = @_;
      $attrs{enable_directive} //= 0;
      $attrs{enable_encoding}  //= 0;
      $attrs{enable_quoting}   //= 0;
      $attrs{enable_bracket}   //= 0;
      $attrs{enable_brace}     //= 0;
      $attrs{enable_tilde}     //= 0;
      $class->SUPER::new(%attrs);
  }
  
  1;
  # ABSTRACT: Read INI configuration files (using Config::IOD::Reader)
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Config::IOD::INI::Reader - Read INI configuration files (using Config::IOD::Reader)
  
  =head1 VERSION
  
  This document describes version 0.342 of Config::IOD::INI::Reader (from Perl distribution Config-IOD-Reader), released on 2019-01-17.
  
  =head1 SYNOPSIS
  
   use Config::IOD::INI::Reader;
   my $reader = Config::IOD::INI::Reader->new();
   my $config_hash = $reader->read_file('config.ini');
  
  =head1 DESCRIPTION
  
  This module is just a L<Config::IOD::Reader> subclass. It uses the following
  defaults to make the reader's behavior closer to a typical "regular INI files
  parser".
  
      enable_directive = 0
      enable_encoding  = 0
      enable_quoting   = 0
      enable_bracket   = 0
      enable_brace     = 0
      enable_tilde     = 0
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Config-IOD-Reader>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Config-IOD-Reader>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Config-IOD-Reader>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Config::IOD::Reader>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2019, 2018, 2017, 2016, 2015, 2014 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
CONFIG_IOD_INI_READER

    $main::fatpacked{"Config/IOD/Reader.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'CONFIG_IOD_READER';
  package Config::IOD::Reader;
  
  our $DATE = '2019-01-17'; # DATE
  our $VERSION = '0.342'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  use parent qw(Config::IOD::Base);
  
  sub _merge {
      my ($self, $section) = @_;
  
      my $res = $self->{_res};
      for my $msect (@{ $self->{_merge} }) {
          if ($msect eq $section) {
              # ignore merging self
              next;
              #local $self->{_linum} = $self->{_linum}-1;
              #$self->_err("Can't merge section '$msect' to '$section': ".
              #                "Same section");
          }
          if (!exists($res->{$msect})) {
              local $self->{_linum} = $self->{_linum}-1;
              $self->_err("Can't merge section '$msect' to '$section': ".
                              "Section '$msect' not seen yet");
          }
          for my $k (keys %{ $res->{$msect} }) {
              $res->{$section}{$k} //= $res->{$msect}{$k};
          }
      }
  }
  
  sub _init_read {
      my $self = shift;
  
      $self->SUPER::_init_read;
      $self->{_res} = {};
      $self->{_merge} = undef;
      $self->{_num_seen_section_lines} = 0;
      $self->{_cur_section} = $self->{default_section};
      $self->{_arrayified} = {};
  }
  
  sub _read_string {
      my ($self, $str, $cb) = @_;
  
      my $res = $self->{_res};
      my $cur_section = $self->{_cur_section};
  
      my $directive_re = $self->{allow_bang_only} ?
          qr/^;?\s*!\s*(\w+)\s*/ :
          qr/^;\s*!\s*(\w+)\s*/;
  
      my $_raw_val; # only to provide to callback
  
      my @lines = split /^/, $str;
      local $self->{_linum} = 0;
    LINE:
      for my $line (@lines) {
          $self->{_linum}++;
  
          # blank line
          if ($line !~ /\S/) {
              next LINE;
          }
  
          # directive line
          if ($self->{enable_directive} && $line =~ s/$directive_re//) {
              my $directive = $1;
              if ($self->{allow_directives}) {
                  $self->_err("Directive '$directive' is not in ".
                                  "allow_directives list")
                      unless grep { $_ eq $directive }
                          @{$self->{allow_directives}};
              }
              if ($self->{disallow_directives}) {
                  $self->_err("Directive '$directive' is in ".
                                  "disallow_directives list")
                      if grep { $_ eq $directive }
                          @{$self->{disallow_directives}};
              }
              my $args = $self->_parse_command_line($line);
              if (!defined($args)) {
                  $self->_err("Invalid arguments syntax '$line'");
              }
  
              if ($cb) {
                  $cb->(
                      event => 'directive',
                      linum=>$self->{_linum}, line=>$line, cur_section=>$self->{_cur_section},
                      directive => $directive,
                      args => $args,
                  );
              }
  
              if ($directive eq 'include') {
                  my $path;
                  if (! @$args) {
                      $self->_err("Missing filename to include");
                  } elsif (@$args > 1) {
                      $self->_err("Extraneous arguments");
                  } else {
                      $path = $args->[0];
                  }
                  my $res = $self->_push_include_stack($path);
                  if ($res->[0] != 200) {
                      $self->_err("Can't include '$path': $res->[1]");
                  }
                  $path = $res->[2];
                  $self->_read_string($self->_read_file($path, $cb), $cb);
                  $self->_pop_include_stack;
              } elsif ($directive eq 'merge') {
                  $self->{_merge} = @$args ? $args : undef;
              } elsif ($directive eq 'noop') {
              } else {
                  if ($self->{ignore_unknown_directive}) {
                      # assume a regular comment
                      next LINE;
                  } else {
                      $self->_err("Unknown directive '$directive'");
                  }
              }
              next LINE;
          }
  
          # comment line
          if ($line =~ /^\s*[;#]/) {
  
              if ($cb) {
                  $cb->(
                      event => 'comment',
                      linum=>$self->{_linum}, line=>$line, cur_section=>$self->{_cur_section},
                  );
              }
  
              next LINE;
          }
  
          # section line
          if ($line =~ /^\s*\[\s*(.+?)\s*\](?: \s*[;#].*)?/) {
              my $prev_section = $self->{_cur_section};
              $self->{_cur_section} = $cur_section = $1;
              $res->{$cur_section} //= {};
              $self->{_num_seen_section_lines}++;
  
              # previous section exists? do merging for previous section
              if ($self->{_merge} && $self->{_num_seen_section_lines} > 1) {
                  $self->_merge($prev_section);
              }
  
              if ($cb) {
                  $cb->(
                      event => 'section',
                      linum=>$self->{_linum}, line=>$line, cur_section=>$self->{_cur_section},
                      section => $cur_section,
                  );
              }
  
              next LINE;
          }
  
          # key line
          if ($line =~ /^\s*([^=]+?)\s*=\s*(.*)/) {
              my $key = $1;
              my $val = $2;
  
              # the common case is that value are not decoded or
              # quoted/bracketed/braced, so we avoid calling _parse_raw_value here
              # to avoid overhead
              if ($val =~ /\A["!\\[\{~]/) {
                  $_raw_val = $val if $cb;
                  my ($err, $parse_res, $decoded_val) = $self->_parse_raw_value($val);
                  $self->_err("Invalid value: " . $err) if $err;
                  $val = $decoded_val;
              } else {
                  $_raw_val = $val if $cb;
                  $val =~ s/\s*[#;].*//; # strip comment
              }
  
              if (exists $res->{$cur_section}{$key}) {
                  if (!$self->{allow_duplicate_key}) {
                      $self->_err("Duplicate key: $key (section $cur_section)");
                  } elsif ($self->{_arrayified}{$cur_section}{$key}++) {
                      push @{ $res->{$cur_section}{$key} }, $val;
                  } else {
                      $res->{$cur_section}{$key} = [
                          $res->{$cur_section}{$key}, $val];
                  }
              } else {
                  $res->{$cur_section}{$key} = $val;
              }
  
              if ($cb) {
                  $cb->(
                      event => 'key',
                      linum=>$self->{_linum}, line=>$line, cur_section=>$self->{_cur_section},
                      key => $key,
                      val => $val,
                      raw_val => $_raw_val,
                  );
              }
  
              next LINE;
          }
  
          $self->_err("Invalid syntax");
      }
  
      if ($self->{_merge} && $self->{_num_seen_section_lines} > 1) {
          $self->_merge($cur_section);
      }
  
      $res;
  }
  
  1;
  # ABSTRACT: Read IOD/INI configuration files
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Config::IOD::Reader - Read IOD/INI configuration files
  
  =head1 VERSION
  
  This document describes version 0.342 of Config::IOD::Reader (from Perl distribution Config-IOD-Reader), released on 2019-01-17.
  
  =head1 SYNOPSIS
  
   use Config::IOD::Reader;
   my $reader = Config::IOD::Reader->new(
       # list of known attributes, with their default values
       # default_section     => 'GLOBAL',
       # enable_directive    => 1,
       # enable_encoding     => 1,
       # enable_quoting      => 1,
       # enable_backet       => 1,
       # enable_brace        => 1,
       # allow_encodings     => undef, # or ['base64','json',...]
       # disallow_encodings  => undef, # or ['base64','json',...]
       # allow_directives    => undef, # or ['include','merge',...]
       # disallow_directives => undef, # or ['include','merge',...]
       # allow_bang_only     => 1,
       # enable_expr         => 0,
       # allow_duplicate_key => 1,
       # ignore_unknown_directive => 0,
   );
   my $config_hash = $reader->read_file('config.iod');
  
  =head1 DESCRIPTION
  
  This module reads L<IOD> configuration files (IOD is an INI-like format with
  more precise specification, some extra features, and 99% compatible with typical
  INI format). It is a minimalist alternative to the more fully-featured
  L<Config::IOD>. It cannot write IOD files and is optimized for low startup
  overhead.
  
  =head1 EXPRESSION
  
  Expression allows you to do things like:
  
   [section1]
   foo=1
   bar="monkey"
  
   [section2]
   baz =!e 1+1
   qux =!e "grease" . val("section1.bar")
   quux=!e val("qux") . " " . val('baz')
  
  And the result will be:
  
   {
       section1 => {foo=>1, bar=>"monkey"},
       section2 => {baz=>2, qux=>"greasemonkey", quux=>"greasemonkey 2"},
   }
  
  For safety, you'll need to set C<enable_expr> attribute to 1 first to enable
  this feature.
  
  The syntax of the expression (the C<expr> encoding) is not officially specified
  yet in the L<IOD> specification. It will probably be Expr (see
  L<Language::Expr::Manual::Syntax>). At the moment, this module implements a very
  limited subset that is compatible (lowest common denominator) with Perl syntax
  and uses C<eval()> to evaluate the expression. However, only the limited subset
  is allowed (checked by Perl 5.10 regular expression).
  
  The supported terms:
  
   number
   string (double-quoted and single-quoted)
   undef literal
   simple variable ($abc, no namespace, no array/hash sigil, no special variables)
   function call (only the 'val' function is supported)
   grouping (parenthesis)
  
  The supported operators are:
  
   + - .
   * / % x
   **
   unary -, unary +, !, ~
  
  The C<val()> function refers to the configuration key. If the argument contains
  ".", it will be assumed as C<SECTIONNAME.KEYNAME>, otherwise it will access the
  current section's key. Since parsing is done in a single pass, you can only
  refer to the already mentioned key.
  
  Code will be compiled using Perl's C<eval()> in the
  C<Config::IOD::Expr::_Compiled> namespace, with C<no strict>, C<no warnings>.
  
  =head1 ATTRIBUTES
  
  =head2 default_section => str (default: C<GLOBAL>)
  
  If a key line is specified before any section line, this is the section that the
  key will be put in.
  
  =head2 enable_directive => bool (default: 1)
  
  If set to false, then directives will not be parsed. Lines such as below will be
  considered a regular comment:
  
   ;!include foo.ini
  
  and lines such as below will be considered a syntax error (B<regardless> of the
  C<allow_bang_only> setting):
  
   !include foo.ini
  
  B<NOTE: Turning this setting off violates IOD specification.>
  
  =head2 enable_encoding => bool (default: 1)
  
  If set to false, then encoding notation will be ignored and key value will be
  parsed as verbatim. Example:
  
   name = !json null
  
  With C<enable_encoding> turned off, value will not be undef but will be string
  with the value of (as Perl literal) C<"!json null">.
  
  B<NOTE: Turning this setting off violates IOD specification.>
  
  =head2 enable_quoting => bool (default: 1)
  
  If set to false, then quotes on key value will be ignored and key value will be
  parsed as verbatim. Example:
  
   name = "line 1\nline2"
  
  With C<enable_quoting> turned off, value will not be a two-line string, but will
  be a one line string with the value of (as Perl literal) C<"line 1\\nline2">.
  
  B<NOTE: Turning this setting off violates IOD specification.>
  
  =head2 enable_bracket => bool (default: 1)
  
  If set to false, then JSON literal array will be parsed as verbatim. Example:
  
   name = [1,2,3]
  
  With C<enable_bracket> turned off, value will not be a three-element array, but
  will be a string with the value of (as Perl literal) C<"[1,2,3]">.
  
  B<NOTE: Turning this setting off violates IOD specification.>
  
  =head2 enable_brace => bool (default: 1)
  
  If set to false, then JSON literal object (hash) will be parsed as verbatim.
  Example:
  
   name = {"a":1,"b":2}
  
  With C<enable_brace> turned off, value will not be a hash with two pairs, but
  will be a string with the value of (as Perl literal) C<'{"a":1,"b":2}'>.
  
  B<NOTE: Turning this setting off violates IOD specification.>
  
  =head2 enable_tilde => bool (default: 1)
  
  If set to true (the default), then value that starts with C<~> (tilde) will be
  assumed to use !path encoding, unless an explicit encoding has been otherwise
  specified.
  
  Example:
  
   log_dir = ~/logs  ; ~ will be resolved to current user's home directory
  
  With C<enable_tilde> turned off, value will still be literally C<~/logs>.
  
  B<NOTE: Turning this setting off violates IOD specification.>
  
  =head2 allow_encodings => array
  
  If defined, set list of allowed encodings. Note that if C<disallow_encodings> is
  also set, an encoding must also not be in that list.
  
  Also note that, for safety reason, if you want to enable C<expr> encoding,
  you'll also need to set C<enable_expr> to 1.
  
  =head2 disallow_encodings => array
  
  If defined, set list of disallowed encodings. Note that if C<allow_encodings> is
  also set, an encoding must also be in that list.
  
  Also note that, for safety reason, if you want to enable C<expr> encoding,
  you'll also need to set C<enable_expr> to 1.
  
  =head2 enable_expr => bool (default: 0)
  
  Whether to enable C<expr> encoding. By default this is turned on, for safety.
  Please see L</"EXPRESSION"> for more details.
  
  =head2 allow_directives => array
  
  If defined, only directives listed here are allowed. Note that if
  C<disallow_directives> is also set, a directive must also not be in that list.
  
  =head2 disallow_directives => array
  
  If defined, directives listed here are not allowed. Note that if
  C<allow_directives> is also set, a directive must also be in that list.
  
  =head2 allow_bang_only => bool (default: 1)
  
  Since the mistake of specifying a directive like this:
  
   !foo
  
  instead of the correct:
  
   ;!foo
  
  is very common, the spec allows it. This reader, however, can be configured to
  be more strict.
  
  =head2 allow_duplicate_key => bool (default: 1)
  
  If set to 0, you can forbid duplicate key, e.g.:
  
   [section]
   a=1
   a=2
  
  or:
  
   [section]
   a=1
   b=2
   c=3
   a=10
  
  In traditional INI file, to specify an array you specify multiple keys. But when
  there is only a single key, it is unclear if the value is a single-element array
  or a scalar. You can use this setting to avoid this array/scalar ambiguity in
  config file and force user to use JSON encoding or bracket to specify array:
  
   [section]
   a=[1,2]
  
  B<NOTE: Turning this setting off violates IOD specification.>
  
  =head2 ignore_unknown_directive => bool (default: 0)
  
  If set to true, will not die if an unknown directive is encountered. It will
  simply be ignored as a regular comment.
  
  B<NOTE: Turning this setting on violates IOD specification.>
  
  =head1 METHODS
  
  =head2 new(%attrs) => obj
  
  =head2 $reader->read_file($filename[ , $callback ]) => hash
  
  Read IOD configuration from a file. Die on errors.
  
  See C<read_string> for more information on C<$callback> argument.
  
  =head2 $reader->read_string($str[ , $callback ]) => hash
  
  Read IOD configuration from a string. Die on errors.
  
  C<$callback> is an optional coderef argument that will be called during various
  stages. It can be useful if you want more information (especially ordering). It
  will be called with hash argument C<%args>
  
  =over
  
  =item * Found a directive line
  
  Arguments passed: C<event> (str, has the value of 'directive'), C<linum> (int,
  line number, starts from 1), C<line> (str, raw line), C<directive> (str,
  directive name), C<cur_section> (str, current section name), C<args> (array,
  directive arguments).
  
  =item * Found a comment line
  
  Arguments passed: C<event> (str, 'comment'), C<linum>, C<line>, C<cur_section>.
  
  =item * Found a section line
  
  Arguments passed: C<event> (str, 'section'), C<linum>, C<line>, C<cur_section>,
  C<section> (str, section name).
  
  =item * Found a key line
  
  Arguments passed: C<event> (str, 'section'), C<linum>, C<line>, C<cur_section>,
  C<key> (str, key name), C<val> (any, value name, already decoded if encoded),
  C<raw_val> (str, raw value).
  
  =back
  
  TODO: callback when there is merging.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Config-IOD-Reader>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Config-IOD-Reader>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Config-IOD-Reader>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<IOD> - specification
  
  L<Config::IOD> - round-trip parser for reading as well as writing IOD documents
  
  L<IOD::Examples> - sample documents
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2019, 2018, 2017, 2016, 2015, 2014 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
CONFIG_IOD_READER

    $main::fatpacked{"Data/Check/Structure.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_CHECK_STRUCTURE';
  package Data::Check::Structure;
  
  our $DATE = '2017-07-18'; # DATE
  our $VERSION = '0.04'; # VERSION
  
  use strict;
  #use warnings;
  
  use Exporter 'import';
  our @EXPORT_OK = qw(
                         is_aoa
                         is_aoaos
                         is_aoh
                         is_aohos
                         is_aos
                         is_hoa
                         is_hoaos
                         is_hoh
                         is_hohos
                         is_hos
                 );
  
  sub is_aos {
      my ($data, $opts) = @_;
      $opts ||= {};
      my $max = $opts->{max};
  
      return 0 unless ref($data) eq 'ARRAY';
      for my $i (0..@$data-1) {
          last if defined($max) && $i >= $max;
          return 0 if ref($data->[$i]);
      }
      1;
  }
  
  sub is_aoa {
      my ($data, $opts) = @_;
      $opts ||= {};
      my $max = $opts->{max};
  
      return 0 unless ref($data) eq 'ARRAY';
      for my $i (0..@$data-1) {
          last if defined($max) && $i >= $max;
          return 0 unless ref($data->[$i]) eq 'ARRAY';
      }
      1;
  }
  
  sub is_aoaos {
      my ($data, $opts) = @_;
      $opts ||= {};
      my $max = $opts->{max};
  
      return 0 unless ref($data) eq 'ARRAY';
      my $aos_opts = {max=>$max};
      for my $i (0..@$data-1) {
          last if defined($max) && $i >= $max;
          return 0 unless is_aos($data->[$i], $aos_opts);
      }
      1;
  }
  
  sub is_aoh {
      my ($data, $opts) = @_;
      $opts ||= {};
      my $max = $opts->{max};
  
      return 0 unless ref($data) eq 'ARRAY';
      for my $i (0..@$data-1) {
          last if defined($max) && $i >= $max;
          return 0 unless ref($data->[$i]) eq 'HASH';
      }
      1;
  }
  
  sub is_aohos {
      my ($data, $opts) = @_;
      $opts ||= {};
      my $max = $opts->{max};
  
      return 0 unless ref($data) eq 'ARRAY';
      my $hos_opts = {max=>$max};
      for my $i (0..@$data-1) {
          last if defined($max) && $i >= $max;
          return 0 unless is_hos($data->[$i], $hos_opts);
      }
      1;
  }
  
  sub is_hos {
      my ($data, $opts) = @_;
      $opts ||= {};
      my $max = $opts->{max};
  
      return 0 unless ref($data) eq 'HASH';
      my $i = 0;
      for my $k (keys %$data) {
          last if defined($max) && ++$i >= $max;
          return 0 if ref($data->{$k});
      }
      1;
  }
  
  sub is_hoa {
      my ($data, $opts) = @_;
      $opts ||= {};
      my $max = $opts->{max};
  
      return 0 unless ref($data) eq 'HASH';
      my $i = 0;
      for my $k (keys %$data) {
          last if defined($max) && ++$i >= $max;
          return 0 unless ref($data->{$k}) eq 'ARRAY';
      }
      1;
  }
  
  sub is_hoaos {
      my ($data, $opts) = @_;
      $opts ||= {};
      my $max = $opts->{max};
  
      return 0 unless ref($data) eq 'HASH';
      my $i = 0;
      for my $k (keys %$data) {
          last if defined($max) && ++$i >= $max;
          return 0 unless is_aos($data->{$k});
      }
      1;
  }
  
  sub is_hoh {
      my ($data, $opts) = @_;
      $opts ||= {};
      my $max = $opts->{max};
  
      return 0 unless ref($data) eq 'HASH';
      my $i = 0;
      for my $k (keys %$data) {
          last if defined($max) && ++$i >= $max;
          return 0 unless ref($data->{$k}) eq 'HASH';
      }
      1;
  }
  
  sub is_hohos {
      my ($data, $opts) = @_;
      $opts ||= {};
      my $max = $opts->{max};
  
      return 0 unless ref($data) eq 'HASH';
      my $i = 0;
      for my $k (keys %$data) {
          last if defined($max) && ++$i >= $max;
          return 0 unless is_hos($data->{$k});
      }
      1;
  }
  
  1;
  # ABSTRACT: Check structure of data
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Check::Structure - Check structure of data
  
  =head1 VERSION
  
  This document describes version 0.04 of Data::Check::Structure (from Perl distribution Data-Check-Structure), released on 2017-07-18.
  
  =head1 SYNOPSIS
  
  =head1 DESCRIPTION
  
  This small module provides several simple routines to check the structure of
  data, e.g. whether data is an array of arrays ("aoa"), array of scalars ("aos"),
  and so on.
  
  =head1 FUNCTIONS
  
  None exported by default, but they are exportable.
  
  =head2 is_aos($data[, \%opts]) => bool
  
  Check that data is an array of scalars. Examples:
  
   is_aos([]);                     # true
   is_aos(['a', 'b']);             # true
   is_aos(['a', []]);              # false
   is_aos([1,2,3, []], {max=>3});  # true
  
  Known options: C<max> (maximum number of items to check, undef means check all
  items).
  
  =head2 is_aoa($data[, \%opts]) => bool
  
  Check that data is an array of arrays. Examples:
  
   is_aoa([]);                          # true
   is_aoa([[1], [2]]);                  # true
   is_aoa([[1], 'a']);                  # false
   is_aoa([[1],[],[], 'a'], {max=>3});  # true
  
  Known options: C<max> (maximum number of items to check, undef means check all
  items).
  
  =head2 is_aoaos($data[, \%opts]) => bool
  
  Check that data is an array of arrays of scalars. Examples:
  
   is_aoaos([]);                           # true
   is_aoaos([[1], [2]]);                   # true
   is_aoaos([[1], [{}]]);                  # false
   is_aoaos([[1],[],[], [{}]], {max=>3});  # true
  
  Known options: C<max> (maximum number of items to check, undef means check all
  items).
  
  =head2 is_aoh($data[, \%opts]) => bool
  
  Check that data is an array of hashes. Examples:
  
   is_aoh([]);                             # true
   is_aoh([{}, {a=>1}]);                   # true
   is_aoh([{}, 'a']);                      # false
   is_aoh([{},{},{a=>1}, 'a'], {max=>3});  # true
  
  Known options: C<max> (maximum number of items to check, undef means check all
  items).
  
  =head2 is_aohos($data[, \%opts]) => bool
  
  Check that data is an array of hashes of scalars. Examples:
  
   is_aohos([]);                                 # true
   is_aohos([{a=>1}, {}]);                       # true
   is_aohos([{a=>1}, {b=>[]}]);                  # false
   is_aohos([{a=>1},{},{}, {b=>[]}], {max=>3});  # true
  
  Known options: C<max> (maximum number of items to check, undef means check all
  items).
  
  =head2 is_hos($data[, \%opts]) => bool
  
  Check that data is a hash of scalars. Examples:
  
   is_hos({});                                   # true
   is_hos({a=>1, b=>2});                         # true
   is_hos({a=>1, b=>[]});                        # false
   is_hos({a=>1, b=>2, c=>3, d=>[]}, {max=>3});  # true (or false, depending on random hash key ordering)
  
  Known options: C<max> (maximum number of items to check, undef means check all
  items).
  
  =head2 is_hoa($data[, \%opts]) => bool
  
  Check that data is a hash of arrays. Examples:
  
   is_hoa({}) );       # true
   is_hoa({a=>[]}) );  # true
   is_hoa({a=>1}) );   # false
  
  Known options: C<max> (maximum number of items to check, undef means check all
  items).
  
  =head2 is_hoaos($data[, \%opts]) => bool
  
  Check that data is a hash of arrays of scalars. Examples:
  
   is_hoaos({}) );         # true
   is_hoaos({a=>[]}) );    # true
   is_hoaos({a=>[1]}) );   # true
   is_hoaos({a=>1}) );     # false
   is_hoaos({a=>[{}]}) );  # false
  
  Known options: C<max> (maximum number of items to check, undef means check all
  items).
  
  =head2 is_hoh($data[, \%opts]) => bool
  
  Check that data is a hash of hashes. Examples:
  
   is_hoh({}) );       # true
   is_hoh({a=>{}}) );  # true
   is_hoh({a=>1}) );   # false
  
  Known options: C<max> (maximum number of items to check, undef means check all
  items).
  
  =head2 is_hohos($data[, \%opts]) => bool
  
  Check that data is a hash of hashes of scalrs. Examples:
  
   is_hohos({}) );            # true
   is_hohos({a=>{}}) );       # true
   is_hohos({a=>{b=>1}}) );   # true
   is_hohos({a=>1}) );        # false
   is_hohos({a=>{b=>[]}}) );  # false
  
  Known options: C<max> (maximum number of items to check, undef means check all
  items).
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Check-Structure>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Check-Structure>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Check-Structure>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2017, 2014 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_CHECK_STRUCTURE

    $main::fatpacked{"Data/Clean.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_CLEAN';
  package Data::Clean;
  
  our $DATE = '2019-11-18'; # DATE
  our $VERSION = '0.506'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  use Log::ger;
  
  sub new {
      my ($class, %opts) = @_;
      my $self = bless {_opts=>\%opts}, $class;
      log_trace("Cleanser options: %s", \%opts);
  
      my $cd = $self->_generate_cleanser_code;
      for my $mod (keys %{ $cd->{modules} }) {
          (my $mod_pm = "$mod.pm") =~ s!::!/!g;
          require $mod_pm;
      }
      $self->{_cd} = $cd;
      $self->{_code} = eval $cd->{src};
      {
          last unless $cd->{clone_func} =~ /(.+)::(.+)/;
          (my $mod_pm = "$1.pm") =~ s!::!/!g;
          require $mod_pm;
      }
      die "Can't generate code: $@" if $@;
  
      $self;
  }
  
  sub command_call_method {
      my ($self, $cd, $args) = @_;
      my $mn = $args->[0];
      die "Invalid method name syntax" unless $mn =~ /\A\w+\z/;
      return "{{var}} = {{var}}->$mn; \$ref = ref({{var}})";
  }
  
  sub command_call_func {
      my ($self, $cd, $args) = @_;
      my $fn = $args->[0];
      die "Invalid func name syntax" unless $fn =~ /\A\w+(::\w+)*\z/;
      return "{{var}} = $fn({{var}}); \$ref = ref({{var}})";
  }
  
  sub command_one_or_zero {
      my ($self, $cd, $args) = @_;
      return "{{var}} = {{var}} ? 1:0; \$ref = ''";
  }
  
  sub command_deref_scalar_one_or_zero {
      my ($self, $cd, $args) = @_;
      return "{{var}} = \${ {{var}} } ? 1:0; \$ref = ''";
  }
  
  sub command_deref_scalar {
      my ($self, $cd, $args) = @_;
      return '{{var}} = ${ {{var}} }; $ref = ref({{var}})';
  }
  
  sub command_stringify {
      my ($self, $cd, $args) = @_;
      return '{{var}} = "{{var}}"; $ref = ""';
  }
  
  sub command_replace_with_ref {
      my ($self, $cd, $args) = @_;
      return '{{var}} = $ref; $ref = ""';
  }
  
  sub command_replace_with_str {
      require String::PerlQuote;
  
      my ($self, $cd, $args) = @_;
      return "{{var}} = ".String::PerlQuote::double_quote($args->[0]).'; $ref=""';
  }
  
  sub command_unbless {
      my ($self, $cd, $args) = @_;
  
      return join(
          "",
          'my $reftype = Scalar::Util::reftype({{var}}); ',
          '{{var}} = $reftype eq "HASH" ? {%{ {{var}} }} :',
          ' $reftype eq "ARRAY" ? [@{ {{var}} }] :',
          ' $reftype eq "SCALAR" ? \(my $copy = ${ {{var}} }) :',
          ' $reftype eq "CODE" ? sub { goto &{ {{var}} } } :',
          '(die "Cannot unbless object with type $ref")',
      );
  }
  
  sub command_clone {
      my ($self, $cd, $args) = @_;
  
      my $limit = $args->[0] // 1;
      return join(
          "",
          "if (++\$ctr_circ <= $limit) { ",
          "{{var}} = $cd->{clone_func}({{var}}); redo ",
          "} else { ",
          "{{var}} = 'CIRCULAR'; \$ref = '' }",
      );
  }
  
  sub command_unbless_ffc_inlined {
      my ($self, $cd, $args) = @_;
  
      # code taken from Function::Fallback::CoreOrPP 0.07
      $cd->{subs}{unbless} //= <<'EOC';
      my $ref = shift;
  
      my $r = ref($ref);
      # not a reference
      return $ref unless $r;
  
      # return if not a blessed ref
      my ($r2, $r3) = "$ref" =~ /(.+)=(.+?)\(/
          or return $ref;
  
      if ($r3 eq 'HASH') {
          return { %$ref };
      } elsif ($r3 eq 'ARRAY') {
          return [ @$ref ];
      } elsif ($r3 eq 'SCALAR') {
          return \( my $copy = ${$ref} );
      } else {
          die "Can't handle $ref";
      }
  EOC
  
      "{{var}} = \$sub_unbless->({{var}}); \$ref = ref({{var}})";
  }
  
  # test
  sub command_die {
      my ($self, $cd, $args) = @_;
      return "die";
  }
  
  sub _generate_cleanser_code {
      my $self = shift;
      my $opts = $self->{_opts};
  
      # compilation data, a structure that will be passed around between routines
      # during the generation of cleanser code.
      my $cd = {
          modules => {}, # key = module name, val = version
          clone_func   => $self->{_opts}{'!clone_func'},
          code => '',
          subs => {},
      };
  
      $cd->{modules}{'Scalar::Util'} //= 0;
  
      if (!$cd->{clone_func}) {
          $cd->{clone_func} = 'Clone::PP::clone';
      }
      {
          last unless $cd->{clone_func} =~ /(.+)::(.+)/;
          $cd->{modules}{$1} //= 0;
      }
  
      my (@code, @stmts_ary, @stmts_hash, @stmts_main);
  
      my $n = 0;
      my $add_stmt = sub {
          my $which = shift;
          if ($which eq 'if' || $which eq 'new_if') {
              my ($cond0, $act0) = @_;
              for ([\@stmts_ary, '$e', 'ary'],
                   [\@stmts_hash, '$h->{$k}', 'hash'],
                   [\@stmts_main, '$_', 'main']) {
                  my $act  = $act0 ; $act  =~ s/\Q{{var}}\E/$_->[1]/g;
                  my $cond = $cond0; $cond =~ s/\Q{{var}}\E/$_->[1]/g;
                  #unless (@{ $_->[0] }) { push @{ $_->[0] }, '    say "D:'.$_->[2].' val=", '.$_->[1].', ", ref=$ref"; # DEBUG'."\n" }
                  push @{ $_->[0] }, "    ".($n && $which ne 'new_if' ? "els":"")."if ($cond) { $act }\n";
              }
              $n++;
          } else {
              my ($stmt0) = @_;
              for ([\@stmts_ary, '$e', 'ary'],
                   [\@stmts_hash, '$h->{$k}', 'hash'],
                   [\@stmts_main, '$_', 'main']) {
                  my $stmt = $stmt0; $stmt =~ s/\Q{{var}}\E/$_->[1]/g;
                  push @{ $_->[0] }, "    $stmt;\n";
              }
          }
      };
      my $add_if = sub {
          $add_stmt->('if', @_);
      };
      my $add_new_if = sub {
          $add_stmt->('new_if', @_);
      };
      my $add_if_ref = sub {
          my ($ref, $act0) = @_;
          $add_if->("\$ref eq '$ref'", $act0);
      };
      my $add_new_if_ref = sub {
          my ($ref, $act0) = @_;
          $add_new_if->("\$ref eq '$ref'", $act0);
      };
  
      # catch circular references
      my $circ = $opts->{-circular};
      if ($circ) {
          my $meth = "command_$circ->[0]";
          die "Can't handle command $circ->[0] for option '-circular'" unless $self->can($meth);
          my @args = @$circ; shift @args;
          my $act = $self->$meth($cd, \@args);
          #$add_stmt->('stmt', 'say "ref=$ref, " . {{var}}'); # DEBUG
          $add_new_if->('$ref && $refs{ {{var}} }++', $act);
      }
  
      # catch object of specified classes (e.g. DateTime, etc)
      for my $on (grep {/\A\w*(::\w+)*\z/} sort keys %$opts) {
          my $o = $opts->{$on};
          next unless $o;
          my $meth = "command_$o->[0]";
          die "Can't handle command $o->[0] for option '$on'" unless $self->can($meth);
          my @args = @$o; shift @args;
          my $act = $self->$meth($cd, \@args);
          $add_if_ref->($on, $act);
      }
  
      # catch general object not caught by previous
      for my $p ([-obj => 'Scalar::Util::blessed({{var}})']) {
          my $o = $opts->{$p->[0]};
          next unless $o;
          my $meth = "command_$o->[0]";
          die "Can't handle command $o->[0] for option '$p->[0]'" unless $self->can($meth);
          my @args = @$o; shift @args;
          $add_if->($p->[1], $self->$meth($cd, \@args));
      }
  
      # recurse array and hash
      if ($opts->{'!recurse_obj'}) {
          $add_stmt->('stmt', 'my $reftype=Scalar::Util::reftype({{var}})//""');
          $add_new_if->('$reftype eq "ARRAY"', '$process_array->({{var}})');
          $add_if->('$reftype eq "HASH"' , '$process_hash->({{var}})');
      } else {
          $add_new_if_ref->("ARRAY", '$process_array->({{var}})');
          $add_if_ref->("HASH" , '$process_hash->({{var}})');
      }
  
      # lastly, catch any reference left
      for my $p ([-ref => '$ref']) {
          my $o = $opts->{$p->[0]};
          next unless $o;
          my $meth = "command_$o->[0]";
          die "Can't handle command $o->[0] for option '$p->[0]'" unless $self->can($meth);
          my @args = @$o; shift @args;
          $add_if->($p->[1], $self->$meth($cd, \@args));
      }
  
      push @code, 'sub {'."\n";
  
      for (sort keys %{$cd->{subs}}) {
          push @code, "state \$sub_$_ = sub { ".$cd->{subs}{$_}." };\n";
      }
  
      push @code, 'my $data = shift;'."\n";
      push @code, 'state %refs;'."\n" if $circ;
      push @code, 'state $ctr_circ;'."\n" if $circ;
      push @code, 'state $process_array;'."\n";
      push @code, 'state $process_hash;'."\n";
      push @code, (
          'if (!$process_array) { $process_array = sub { my $a = shift; for my $e (@$a) { ',
          'my $ref=ref($e);'."\n",
          join("", @stmts_ary).'} } }'."\n"
      );
      push @code, (
          'if (!$process_hash) { $process_hash = sub { my $h = shift; for my $k (keys %$h) { ',
          'my $ref=ref($h->{$k});'."\n",
          join("", @stmts_hash).'} } }'."\n"
      );
      push @code, '%refs = (); $ctr_circ=0;'."\n" if $circ;
      push @code, (
          'for ($data) { ',
          'my $ref=ref($_);'."\n",
          join("", @stmts_main).'}'."\n"
      );
      push @code, '$data'."\n";
      push @code, '}'."\n";
  
      my $code = join("", @code).";";
  
      if ($ENV{LOG_CLEANSER_CODE} && log_is_trace()) {
          require String::LineNumber;
          log_trace("Cleanser code:\n%s",
                       $ENV{LINENUM} // 1 ?
                           String::LineNumber::linenum($code) : $code);
      }
  
      $cd->{src} = $code;
  
      $cd;
  }
  
  sub clean_in_place {
      my ($self, $data) = @_;
  
      $self->{_code}->($data);
  }
  
  sub clone_and_clean {
      no strict 'refs';
  
      my ($self, $data) = @_;
      my $clone = &{$self->{_cd}{clone_func}}($data);
      $self->clean_in_place($clone);
  }
  
  1;
  # ABSTRACT: Clean data structure
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Clean - Clean data structure
  
  =head1 VERSION
  
  This document describes version 0.506 of Data::Clean (from Perl distribution Data-Clean), released on 2019-11-18.
  
  =head1 SYNOPSIS
  
   use Data::Clean;
  
   my $cleanser = Data::Clean->new(
       # specify how to deal with specific classes
       'DateTime'     => [call_method => 'epoch'], # replace object with its epoch
       'Time::Moment' => [call_method => 'epoch'], # replace object with its epoch
       'Regexp'       => ['stringify'], # replace $obj with "$obj"
  
       # specify how to deal with all scalar refs
       SCALAR         => ['deref_scalar'], # replace \1 with 1
  
       # specify how to deal with circular reference
       -circular      => ['clone'],
  
       # specify how to deal with all other kinds of objects
       -obj           => ['unbless'],
   );
  
   # to get cleansed data
   my $cleansed_data = $cleanser->clone_and_clean($data);
  
   # to replace original data with cleansed one
   $cleanser->clean_in_place($data);
  
  =head1 DESCRIPTION
  
  This class can be used to process a data structure by replacing some forms of
  data items with other forms. One of the main uses is to clean "unsafe" data,
  e.g. clean a data structure so it can be encoded to JSON (see
  L<Data::Clean::ForJSON>, which is a thin wrapper over this class).
  
  As can be seen from the example, you specify a list of transformations to be
  done, and then this class will generate an appropriate Perl code to do the
  cleansing. This class is faster than the other ways of processing, e.g.
  L<Data::Rmap> (see L<Bencher::Scenarios::DataCleansing> for some benchmarks).
  
  =for Pod::Coverage ^(command_.+)$
  
  =head1 METHODS
  
  =head2 new(%opts) => $obj
  
  Create a new instance.
  
  Options specify what to do with certain category of data. Option keys are either
  reference types (like C<HASH>, C<ARRAY>, C<SCALAR>) or class names (like
  C<Foo::Bar>), or C<-obj> (to match all kinds of objects, a.k.a. blessed
  references), C<-circular> (to match circular references), C<-ref> (to refer to
  any kind of references, used to process references not handled by other
  options). Option values are arrayrefs, the first element of the array is command
  name, to specify what to do with the reference/class. The rest are command
  arguments.
  
  Note that arrayrefs and hashrefs are always walked into, so it's not trapped by
  C<-ref>.
  
  Default for C<%opts>: C<< -ref => 'stringify' >>.
  
  Option keys that start with C<!> are special:
  
  =over
  
  =item * !recurse_obj (bool)
  
  Can be set to true to to recurse into objects if they are hash- or array-based.
  By default objects are not recursed into. Note that if you enable this option,
  object options (like C<Foo::Bar> or C<-obj>) won't work for hash- and
  array-based objects because they will be recursed instead.
  
  =item * !clone_func (str)
  
  Set fully qualified name of clone function to use. The default is to use
  C<Clone::PP::clone>.
  
  The clone module (all but the last part of the C<!clone_func> value) will
  automatically be loaded using C<require()>.
  
  =back
  
  Available commands:
  
  =over 4
  
  =item * ['stringify']
  
  This will stringify a reference like C<{}> to something like C<HASH(0x135f998)>.
  
  =item * ['replace_with_ref']
  
  This will replace a reference like C<{}> with C<HASH>.
  
  =item * ['replace_with_str', STR]
  
  This will replace a reference like C<{}> with I<STR>.
  
  =item * ['call_method' => STR]
  
  This will call a method named I<STR> and use its return as the replacement. For
  example: C<< DateTime->from_epoch(epoch=>1000) >> when processed with C<<
  [call_method => 'epoch'] >> will become 1000.
  
  =item * ['call_func', STR]
  
  This will call a function named I<STR> with value as argument and use its return
  as the replacement.
  
  =item * ['one_or_zero']
  
  This will perform C<< $val ? 1:0 >>.
  
  =item * ['deref_scalar_one_or_zero']
  
  This will perform C<< ${$val} ? 1:0 >>.
  
  =item * ['deref_scalar']
  
  This will replace a scalar reference like \1 with 1.
  
  =item * ['unbless']
  
  This will perform unblessing using L<Function::Fallback::CoreOrPP::unbless()>.
  Should be done only for objects (C<-obj>).
  
  =item * ['code', STR]
  
  This will replace with I<STR> treated as Perl code.
  
  =item * ['clone', INT]
  
  This command is useful if you have circular references and want to expand/copy
  them. For example:
  
   my $def_opts = { opt1 => 'default', opt2 => 0 };
   my $users    = { alice => $def_opts, bob => $def_opts, charlie => $def_opts };
  
  C<$users> contains three references to the same data structure. With the default
  behaviour of C<< -circular => [replace_with_str => 'CIRCULAR'] >> the cleaned
  data structure will be:
  
   { alice   => { opt1 => 'default', opt2 => 0 },
     bob     => 'CIRCULAR',
     charlie => 'CIRCULAR' }
  
  But with C<< -circular => ['clone'] >> option, the data structure will be
  cleaned to become (the C<$def_opts> is cloned):
  
   { alice   => { opt1 => 'default', opt2 => 0 },
     bob     => { opt1 => 'default', opt2 => 0 },
     charlie => { opt1 => 'default', opt2 => 0 }, }
  
  The command argument specifies the number of references to clone as a limit (the
  default is 50), since a cyclical structure can lead to infinite cloning. Above
  this limit, the circular references will be replaced with a string
  C<"CIRCULAR">. For example:
  
   my $a = [1]; push @$a, $a;
  
  With C<< -circular => ['clone', 2] >> the data will be cleaned as:
  
   [1, [1, [1, "CIRCULAR"]]]
  
  With C<< -circular => ['clone', 3] >> the data will be cleaned as:
  
   [1, [1, [1, [1, "CIRCULAR"]]]]
  
  =back
  
  =head2 $obj->clean_in_place($data) => $cleaned
  
  Clean $data. Modify data in-place.
  
  =head2 $obj->clone_and_clean($data) => $cleaned
  
  Clean $data. Clone $data first.
  
  =head1 ENVIRONMENT
  
  =over
  
  =item * LOG_CLEANSER_CODE => BOOL (default: 0)
  
  Can be enabled if you want to see the generated cleanser code. It is logged at
  level C<trace> using L<Log::ger>.
  
  =item * LINENUM => BOOL (default: 1)
  
  When logging cleanser code, whether to give line numbers.
  
  =back
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Clean>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Clean>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Clean>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  Related modules: L<Data::Rmap>, L<Hash::Sanitize>, L<Data::Walk>.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2019, 2018, 2017, 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_CLEAN

    $main::fatpacked{"Data/Clean/ForJSON.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_CLEAN_FORJSON';
  package Data::Clean::ForJSON;
  
  our $DATE = '2019-11-26'; # DATE
  our $VERSION = '0.395'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  use parent qw(Data::Clean);
  use vars qw($creating_singleton);
  
  use Exporter qw(import);
  our @EXPORT_OK = qw(
                         clean_json_in_place
                         clone_and_clean_json
                 );
  
  sub new {
      my ($class, %opts) = @_;
  
      if (!%opts && !$creating_singleton) {
          warn "You are creating a new ".__PACKAGE__." object without customizing options. ".
              "You probably want to call get_cleanser() yet to get a singleton instead?";
      }
  
      $opts{DateTime}  //= [call_method => 'epoch'];
      $opts{'Time::Moment'} //= [call_method => 'epoch'];
      $opts{'Math::BigInt'} //= [call_method => 'bstr'];
      $opts{Regexp}    //= ['stringify'];
      $opts{version}   //= ['stringify'];
  
      $opts{SCALAR}    //= ['deref_scalar'];
      $opts{-ref}      //= ['replace_with_ref'];
      $opts{-circular} //= ['clone'];
      $opts{-obj}      //= ['unbless'];
  
      $opts{'!recurse_obj'} //= 1;
      $class->SUPER::new(%opts);
  }
  
  sub get_cleanser {
      my $class = shift;
      local $creating_singleton = 1;
      state $singleton = $class->new;
      $singleton;
  }
  
  sub clean_json_in_place {
      __PACKAGE__->get_cleanser->clean_in_place(@_);
  }
  
  sub clone_and_clean_json {
      __PACKAGE__->get_cleanser->clone_and_clean(@_);
  }
  
  1;
  # ABSTRACT: Clean data so it is safe to output to JSON
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Clean::ForJSON - Clean data so it is safe to output to JSON
  
  =head1 VERSION
  
  This document describes version 0.395 of Data::Clean::ForJSON (from Perl distribution Data-Clean-ForJSON), released on 2019-11-26.
  
  =head1 SYNOPSIS
  
   use Data::Clean::ForJSON;
   my $cleanser = Data::Clean::ForJSON->get_cleanser;
   my $data     = { code=>sub {}, re=>qr/abc/i };
  
   my $cleaned;
  
   # modifies data in-place
   $cleaned = $cleanser->clean_in_place($data);
  
   # ditto, but deep clone first, return
   $cleaned = $cleanser->clone_and_clean($data);
  
   # now output it
   use JSON;
   print encode_json($cleaned); # prints '{"code":"CODE","re":"(?^i:abc)"}'
  
  Functional shortcuts:
  
   use Data::Clean::ForJSON qw(clean_json_in_place clone_and_clean_json);
  
   # equivalent to Data::Clean::ForJSON->get_cleanser->clean_in_place($data)
   clean_json_in_place($data);
  
   # equivalent to Data::Clean::ForJSON->get_cleanser->clone_and_clean($data)
   $cleaned = clone_and_clean_json($data);
  
  =head1 DESCRIPTION
  
  This class cleans data from anything that might be problematic when encoding to
  JSON. This includes coderefs, globs, and so on. Here's what it will do by
  default:
  
  =over
  
  =item * Change DateTime and Time::Moment object to its epoch value
  
  =item * Change Regexp and version object to its string value
  
  =item * Change scalar references (e.g. \1) to its scalar value (e.g. 1)
  
  =item * Change other references (non-hash, non-array) to its ref() value (e.g. "GLOB", "CODE")
  
  =item * Clone circular references
  
  With a default limit of 1, meaning that if a reference is first seen again for
  the first time, it will be cloned. But if it is seen again for the second time,
  it will be replaced with "CIRCULAR".
  
  To change the default limit, customize your cleanser object:
  
   $cleanser = Data::Clean::ForJSON->new(
       -circular => ["clone", 4],
   );
  
  or you can perform other action for circular references, see L<Data::Clean> for
  more details.
  
  =item * Unbless other types of objects
  
  =back
  
  Cleaning recurses into objects.
  
  Data that has been cleaned will probably not be convertible back to the
  original, due to information loss (for example, coderefs converted to string
  C<"CODE">).
  
  The design goals are good performance, good defaults, and just enough
  flexibility. The original use-case is for returning JSON response in HTTP API
  service.
  
  This module is significantly faster than modules like L<Data::Rmap> or
  L<Data::Visitor::Callback> because with something like Data::Rmap you repeatedly
  invoke callback for each data item. This module, on the other hand, generates a
  cleanser code using eval(), using native Perl for() loops.
  
  If C<LOG_CLEANSER_CODE> environment is set to true, the generated cleanser code
  will be logged using L<Log::ger> at trace level. You can see it, e.g. using
  L<Log::ger::Output::Screen>:
  
   % LOG_CLEANSER_CODE=1 perl -MLog::ger::Output=Screen -MLog::ger::Level::trace -MData::Clean::ForJSON \
     -e'$c=Data::Clean::ForJSON->new; ...'
  
  =head1 FUNCTIONS
  
  None of the functions are exported by default.
  
  =head2 clean_json_in_place($data)
  
  A shortcut for:
  
   Data::Clean::ForJSON->get_cleanser->clean_in_place($data)
  
  =head2 clone_and_clean_json($data) => $cleaned
  
  A shortcut for:
  
   $cleaned = Data::Clean::ForJSON->get_cleanser->clone_and_clean($data)
  
  =head1 METHODS
  
  =head2 CLASS->get_cleanser => $obj
  
  Return a singleton instance, with default options. Use C<new()> if you want to
  customize options.
  
  =head2 CLASS->new() => $obj
  
  Create a new instance.
  
  =head2 $obj->clean_in_place($data) => $cleaned
  
  Clean $data. Modify data in-place.
  
  =head2 $obj->clone_and_clean($data) => $cleaned
  
  Clean $data. Clone $data first.
  
  =head1 FAQ
  
  =head2 Why clone/modify? Why not directly output JSON?
  
  So that the data can be used for other stuffs, like outputting to YAML, etc.
  
  =head2 Why is it slow?
  
  If you use C<new()> instead of C<get_cleanser()>, make sure that you do not
  construct the Data::Clean::ForJSON object repeatedly, as the constructor
  generates the cleanser code first using eval(). A short benchmark (run on my
  slow Atom netbook):
  
   % bench -MData::Clean::ForJSON -b'$c=Data::Clean::ForJSON->new' \
       'Data::Clean::ForJSON->new->clone_and_clean([1..100])' \
       '$c->clone_and_clean([1..100])'
   Benchmarking sub { Data::Clean::ForJSON->new->clean_in_place([1..100]) }, sub { $c->clean_in_place([1..100]) } ...
   a: 302 calls (291.3/s), 1.037s (3.433ms/call)
   b: 7043 calls (4996/s), 1.410s (0.200ms/call)
   Fastest is b (17.15x a)
  
  Second, you can turn off some checks if you are sure you will not be getting bad
  data. For example, if you know that your input will not contain circular
  references, you can turn off circular detection:
  
   $cleanser = Data::Clean::ForJSON->new(-circular => 0);
  
  Benchmark:
  
   $ perl -MData::Clean::ForJSON -MBench -E '
     $data = [[1],[2],[3],[4],[5]];
     bench {
         circ   => sub { state $c = Data::Clean::ForJSON->new;               $c->clone_and_clean($data) },
         nocirc => sub { state $c = Data::Clean::ForJSON->new(-circular=>0); $c->clone_and_clean($data) }
     }, -1'
   circ: 9456 calls (9425/s), 1.003s (0.106ms/call)
   nocirc: 13161 calls (12885/s), 1.021s (0.0776ms/call)
   Fastest is nocirc (1.367x circ)
  
  The less number of checks you do, the faster the cleansing process will be.
  
  =head2 Why am I getting 'Not a CODE reference at lib/Data/Clean.pm line xxx'?
  
  [2013-08-07 ] This error message is from Data::Clone::clone() when it is cloning
  an object. If you are cleaning objects, instead of using clone_and_clean(), try
  using clean_in_place(). Or, clone your data first using something else like
  L<Sereal>.
  
  =head1 ENVIRONMENT
  
  =head2 LOG_CLEANSER_CODE
  
  Bool. Can be set to true to log cleanser code using L<Log::ger> at C<trace>
  level.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Clean-ForJSON>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Clean-ForJSON>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Clean-ForJSON>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Data::Rmap>
  
  L<Data::Visitor::Callback>
  
  L<Data::Abridge> is similar in goal, which is to let Perl data structures (which
  might contain stuffs unsupported in JSON) be encodeable to JSON. But unlike
  Data::Clean::ForJSON, it has some (currently) non-configurable rules, like
  changing a coderef with a hash C<< {CODE=>'\&main::__ANON__'} >> or a scalar ref
  with C<< {SCALAR=>'value'} >> and so on. Note that the abridging process is
  similarly unidirectional (you cannot convert back the original Perl data
  structure).
  
  Some benchmarks in L<Bencher::Scenarios::DataCleansing>. You can see that
  Data::Clean::ForJSON can be several times faster than, say, Data::Rmap.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_CLEAN_FORJSON

    $main::fatpacked{"Data/Clean/FromJSON.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_CLEAN_FROMJSON';
  package Data::Clean::FromJSON;
  
  our $DATE = '2019-11-26'; # DATE
  our $VERSION = '0.395'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  use parent qw(Data::Clean);
  use vars qw($creating_singleton);
  
  sub new {
      my ($class, %opts) = @_;
      if (!%opts && !$creating_singleton) {
          warn "You are creating a new ".__PACKAGE__." object without customizing options. ".
              "You probably want to call get_cleanser() yet to get a singleton instead?";
      }
  
      $opts{"JSON::PP::Boolean"} //= ['deref_scalar_one_or_zero'];
  
      $class->SUPER::new(%opts);
  }
  
  sub get_cleanser {
      my $class = shift;
      local $creating_singleton = 1;
      state $singleton = $class->new;
      $singleton;
  }
  
  1;
  # ABSTRACT: Clean data from JSON decoder
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Clean::FromJSON - Clean data from JSON decoder
  
  =head1 VERSION
  
  This document describes version 0.395 of Data::Clean::FromJSON (from Perl distribution Data-Clean-ForJSON), released on 2019-11-26.
  
  =head1 SYNOPSIS
  
   use Data::Clean::FromJSON;
   use JSON;
   my $cleanser = Data::Clean::FromJSON->get_cleanser;
   my $data    = JSON->new->decode('[true]'); # -> [bless(do{\(my $o=1)},"JSON::XS::Boolean")]
   my $cleaned = $cleanser->clean_in_place($data); # -> [1]
  
  =head1 DESCRIPTION
  
  This class can "clean" data that comes from a JSON encoder. Currently what it
  does is:
  
  =over
  
  =item * Convert boolean objects to simple Perl values
  
  =back
  
  =head1 METHODS
  
  =head2 CLASS->get_cleanser => $obj
  
  Return a singleton instance, with default options. Use C<new()> if you want to
  customize options.
  
  =head2 CLASS->new() => $obj
  
  =head2 $obj->clean_in_place($data) => $cleaned
  
  Clean $data. Modify data in-place.
  
  =head2 $obj->clone_and_clean($data) => $cleaned
  
  Clean $data. Clone $data first.
  
  =head1 FAQ
  
  =head2 Why am I getting 'Modification of a read-only value attempted at lib/Data/Clean.pm line xxx'?
  
  [2013-10-15 ] This is also from Data::Clone::clone() when it encounters
  JSON::{PP,XS}::Boolean objects. You can use clean_in_place() instead of
  clone_and_clean(), or clone your data using other cloner like L<Sereal>.
  
  =head1 ENVIRONMENT
  
  LOG_CLEANSER_CODE
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Clean-ForJSON>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Clean-ForJSON>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Clean-ForJSON>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_CLEAN_FROMJSON

    $main::fatpacked{"Data/Clean/JSON.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_CLEAN_JSON';
  package Data::Clean::JSON;
  
  our $DATE = '2019-09-11'; # DATE
  our $VERSION = '0.392'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  use parent qw(Data::Clean);
  
  use Exporter qw(import);
  our @EXPORT_OK = qw(
                         clean_json_in_place
                         clone_and_clean_json
                 );
  
  sub new {
      my ($class, %opts) = @_;
  
      # from FromJSON
      $opts{"JSON::PP::Boolean"} //= ['one_or_zero'];
      $opts{"JSON::XS::Boolean"} //= ['one_or_zero']; # this doesn't exist though
      $opts{"Cpanel::JSON::XS::Boolean"} //= ['one_or_zero']; # this doesn't exist though
  
      $opts{DateTime}  //= [call_method => 'epoch'];
      $opts{'Time::Moment'} //= [call_method => 'epoch'];
      $opts{'Math::BigInt'} //= [call_method => 'bstr'];
      $opts{Regexp}    //= ['stringify'];
      $opts{version}   //= ['stringify'];
  
      $opts{SCALAR}    //= ['deref_scalar'];
      $opts{-ref}      //= ['replace_with_ref'];
      $opts{-circular} //= ['clone'];
      $opts{-obj}      //= ['unbless'];
  
      $opts{'!recurse_obj'} //= 1;
      $class->SUPER::new(%opts);
  }
  
  sub get_cleanser {
      my $class = shift;
      state $singleton = $class->new;
      $singleton;
  }
  
  sub clean_json_in_place {
      __PACKAGE__->get_cleanser->clean_in_place(@_);
  }
  
  sub clone_and_clean_json {
      __PACKAGE__->get_cleanser->clone_and_clean(@_);
  }
  
  1;
  # ABSTRACT: (DEPRECATED) Clean data so it is safe to output to JSON
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Clean::JSON - (DEPRECATED) Clean data so it is safe to output to JSON
  
  =head1 VERSION
  
  This document describes version 0.392 of Data::Clean::JSON (from Perl distribution Data-Clean-JSON), released on 2019-09-11.
  
  =head1 SYNOPSIS
  
   use Data::Clean::JSON;
   my $cleanser = Data::Clean::JSON->get_cleanser;
   my $data     = { code=>sub {}, re=>qr/abc/i };
  
   my $cleaned;
  
   # modifies data in-place
   $cleaned = $cleanser->clean_in_place($data);
  
   # ditto, but deep clone first, return
   $cleaned = $cleanser->clone_and_clean($data);
  
   # now output it
   use JSON;
   print encode_json($cleaned); # prints '{"code":"CODE","re":"(?^i:abc)"}'
  
  Functional shortcuts:
  
   use Data::Clean::JSON qw(clean_json_in_place clone_and_clean_json);
  
   # equivalent to Data::Clean::JSON->get_cleanser->clean_in_place($data)
   clean_json_in_place($data);
  
   # equivalent to Data::Clean::JSON->get_cleanser->clone_and_clean($data)
   $cleaned = clone_and_clean_json($data);
  
  =head1 DESCRIPTION
  
  B<DEPRECATION NOTICE:> This module has been renamed to L<Data::Clean::ForJSON>
  for more clarity. This old name is retained because there are distributions
  still depending on it.
  
  This class cleans data from anything that might be problematic when encoding to
  JSON. This includes coderefs, globs, and so on. Here's what it will do by
  default:
  
  =over
  
  =item * Change DateTime and Time::Moment object to its epoch value
  
  =item * Change Regexp and version object to its string value
  
  =item * Change scalar references (e.g. \1) to its scalar value (e.g. 1)
  
  =item * Change other references (non-hash, non-array) to its ref() value (e.g. "GLOB", "CODE")
  
  =item * Clone circular references
  
  With a default limit of 1, meaning that if a reference is first seen again for
  the first time, it will be cloned. But if it is seen again for the second time,
  it will be replaced with "CIRCULAR".
  
  To change the default limit, customize your cleanser object:
  
   $cleanser = Data::Clean::JSON->new(
       -circular => ["clone", 4],
   );
  
  or you can perform other action for circular references, see L<Data::Clean> for
  more details.
  
  =item * Unbless other types of objects
  
  =back
  
  Cleaning recurses into objects.
  
  Data that has been cleaned will probably not be convertible back to the
  original, due to information loss (for example, coderefs converted to string
  C<"CODE">).
  
  The design goals are good performance, good defaults, and just enough
  flexibility. The original use-case is for returning JSON response in HTTP API
  service.
  
  This module is significantly faster than modules like L<Data::Rmap> or
  L<Data::Visitor::Callback> because with something like Data::Rmap you repeatedly
  invoke callback for each data item. This module, on the other hand, generates a
  cleanser code using eval(), using native Perl for() loops.
  
  If C<LOG_CLEANSER_CODE> environment is set to true, the generated cleanser code
  will be logged using L<Log::get> at trace level. You can see it, e.g. using
  L<Log::ger::Output::Screen>:
  
   % LOG_CLEANSER_CODE=1 perl -MLog::ger::Output=Screen -MLog::ger::Level::trace -MData::Clean::JSON \
     -e'$c=Data::Clean::JSON->new; ...'
  
  =head1 FUNCTIONS
  
  None of the functions are exported by default.
  
  =head2 clean_json_in_place($data)
  
  A shortcut for:
  
   Data::Clean::JSON->get_cleanser->clean_in_place($data)
  
  =head2 clone_and_clean_json($data) => $cleaned
  
  A shortcut for:
  
   $cleaned = Data::Clean::JSON->get_cleanser->clone_and_clean($data)
  
  =head1 METHODS
  
  =head2 CLASS->get_cleanser => $obj
  
  Return a singleton instance, with default options. Use C<new()> if you want to
  customize options.
  
  =head2 CLASS->new() => $obj
  
  Create a new instance.
  
  =head2 $obj->clean_in_place($data) => $cleaned
  
  Clean $data. Modify data in-place.
  
  =head2 $obj->clone_and_clean($data) => $cleaned
  
  Clean $data. Clone $data first.
  
  =head1 FAQ
  
  =head2 Why clone/modify? Why not directly output JSON?
  
  So that the data can be used for other stuffs, like outputting to YAML, etc.
  
  =head2 Why is it slow?
  
  If you use C<new()> instead of C<get_cleanser()>, make sure that you do not
  construct the Data::Clean::JSON object repeatedly, as the constructor generates
  the cleanser code first using eval(). A short benchmark (run on my slow Atom
  netbook):
  
   % bench -MData::Clean::JSON -b'$c=Data::Clean::JSON->new' \
       'Data::Clean::JSON->new->clone_and_clean([1..100])' \
       '$c->clone_and_clean([1..100])'
   Benchmarking sub { Data::Clean::JSON->new->clean_in_place([1..100]) }, sub { $c->clean_in_place([1..100]) } ...
   a: 302 calls (291.3/s), 1.037s (3.433ms/call)
   b: 7043 calls (4996/s), 1.410s (0.200ms/call)
   Fastest is b (17.15x a)
  
  Second, you can turn off some checks if you are sure you will not be getting bad
  data. For example, if you know that your input will not contain circular
  references, you can turn off circular detection:
  
   $cleanser = Data::Clean::JSON->new(-circular => 0);
  
  Benchmark:
  
   $ perl -MData::Clean::JSON -MBench -E '
     $data = [[1],[2],[3],[4],[5]];
     bench {
         circ   => sub { state $c = Data::Clean::JSON->new;               $c->clone_and_clean($data) },
         nocirc => sub { state $c = Data::Clean::JSON->new(-circular=>0); $c->clone_and_clean($data) }
     }, -1'
   circ: 9456 calls (9425/s), 1.003s (0.106ms/call)
   nocirc: 13161 calls (12885/s), 1.021s (0.0776ms/call)
   Fastest is nocirc (1.367x circ)
  
  The less number of checks you do, the faster the cleansing process will be.
  
  =head2 Why am I getting 'Not a CODE reference at lib/Data/Clean.pm line xxx'?
  
  [2013-08-07 ] This error message is from Data::Clone::clone() when it is cloning
  an object. If you are cleaning objects, instead of using clone_and_clean(), try
  using clean_in_place(). Or, clone your data first using something else like
  L<Sereal>.
  
  =head1 ENVIRONMENT
  
  LOG_CLEANSER_CODE
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Clean-JSON>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Clean-JSON>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Clean-JSON>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Data::Rmap>
  
  L<Data::Visitor::Callback>
  
  L<Data::Abridge> is similar in goal, which is to let Perl data structures (which
  might contain stuffs unsupported in JSON) be encodeable to JSON. But unlike
  Data::Clean::JSON, it has some (currently) non-configurable rules, like changing
  a coderef with a hash C<< {CODE=>'\&main::__ANON__'} >> or a scalar ref with C<<
  {SCALAR=>'value'} >> and so on. Note that the abridging process is similarly
  unidirectional (you cannot convert back the original Perl data structure).
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_CLEAN_JSON

    $main::fatpacked{"Data/Dmp.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_DMP';
  package Data::Dmp;
  
  our $DATE = '2017-01-30'; # DATE
  our $VERSION = '0.23'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  use Scalar::Util qw(looks_like_number blessed reftype refaddr);
  
  require Exporter;
  our @ISA = qw(Exporter);
  our @EXPORT = qw(dd dmp);
  
  # for when dealing with circular refs
  our %_seen_refaddrs;
  our %_subscripts;
  our @_fixups;
  
  our $OPT_PERL_VERSION = "5.010";
  our $OPT_REMOVE_PRAGMAS = 0;
  our $OPT_DEPARSE = 1;
  our $OPT_STRINGIFY_NUMBERS = 0;
  
  # BEGIN COPY PASTE FROM Data::Dump
  my %esc = (
      "\a" => "\\a",
      "\b" => "\\b",
      "\t" => "\\t",
      "\n" => "\\n",
      "\f" => "\\f",
      "\r" => "\\r",
      "\e" => "\\e",
  );
  
  # put a string value in double quotes
  sub _double_quote {
      local($_) = $_[0];
  
      # If there are many '"' we might want to use qq() instead
      s/([\\\"\@\$])/\\$1/g;
      return qq("$_") unless /[^\040-\176]/;  # fast exit
  
      s/([\a\b\t\n\f\r\e])/$esc{$1}/g;
  
      # no need for 3 digits in escape for these
      s/([\0-\037])(?!\d)/sprintf('\\%o',ord($1))/eg;
  
      s/([\0-\037\177-\377])/sprintf('\\x%02X',ord($1))/eg;
      s/([^\040-\176])/sprintf('\\x{%X}',ord($1))/eg;
  
      return qq("$_");
  }
  # END COPY PASTE FROM Data::Dump
  
  sub _dump_code {
      my $code = shift;
  
      state $deparse = do {
          require B::Deparse;
          B::Deparse->new("-l"); # -i option doesn't have any effect?
      };
  
      my $res = $deparse->coderef2text($code);
  
      my ($res_before_first_line, $res_after_first_line) =
          $res =~ /(.+?)^(#line .+)/ms;
  
      if ($OPT_REMOVE_PRAGMAS) {
          $res_before_first_line = "{";
      } elsif ($OPT_PERL_VERSION < 5.016) {
          # older perls' feature.pm doesn't yet support q{no feature ':all';}
          # so we replace it with q{no feature}.
          $res_before_first_line =~ s/no feature ':all';/no feature;/m;
      }
      $res_after_first_line =~ s/^#line .+//gm;
  
      $res = "sub" . $res_before_first_line . $res_after_first_line;
      $res =~ s/^\s+//gm;
      $res =~ s/\n+//g;
      $res =~ s/;\}\z/}/;
      $res;
  }
  
  sub _quote_key {
      $_[0] =~ /\A-?[A-Za-z_][A-Za-z0-9_]*\z/ ||
          $_[0] =~ /\A-?[1-9][0-9]{0,8}\z/ ? $_[0] : _double_quote($_[0]);
  }
  
  sub _dump {
      my ($val, $subscript) = @_;
  
      my $ref = ref($val);
      if ($ref eq '') {
          if (!defined($val)) {
              return "undef";
          } elsif (looks_like_number($val) && !$OPT_STRINGIFY_NUMBERS &&
                       # perl does several normalizations to number literal, e.g.
                       # "+1" becomes 1, 0123 is octal literal, etc. make sure we
                       # only leave out quote when the number is not normalized
                       $val eq $val+0 &&
                       # perl also doesn't recognize Inf and NaN as numeric
                       # literals (ref: perldata) so these unquoted literals will
                       # choke under 'use strict "subs"
                       $val !~ /\A-?(?:inf(?:inity)?|nan)\z/i
                   ) {
              return $val;
          } else {
              return _double_quote($val);
          }
      }
      my $refaddr = refaddr($val);
      $_subscripts{$refaddr} //= $subscript;
      if ($_seen_refaddrs{$refaddr}++) {
          push @_fixups, "\$a->$subscript=\$a",
              ($_subscripts{$refaddr} ? "->$_subscripts{$refaddr}" : ""), ";";
          return "'fix'";
      }
  
      my $class;
  
      if ($ref eq 'Regexp' || $ref eq 'REGEXP') {
          require Regexp::Stringify;
          return Regexp::Stringify::stringify_regexp(
              regexp=>$val, with_qr=>1, plver=>$OPT_PERL_VERSION);
      }
  
      if (blessed $val) {
          $class = $ref;
          $ref = reftype($val);
      }
  
      my $res;
      if ($ref eq 'ARRAY') {
          $res = "[";
          my $i = 0;
          for (@$val) {
              $res .= "," if $i;
              $res .= _dump($_, "$subscript\[$i]");
              $i++;
          }
          $res .= "]";
      } elsif ($ref eq 'HASH') {
          $res = "{";
          my $i = 0;
          for (sort keys %$val) {
              $res .= "," if $i++;
              my $k = _quote_key($_);
              my $v = _dump($val->{$_}, "$subscript\{$k}");
              $res .= "$k=>$v";
          }
          $res .= "}";
      } elsif ($ref eq 'SCALAR') {
          $res = "\\"._dump($$val, $subscript);
      } elsif ($ref eq 'REF') {
          $res = "\\"._dump($$val, $subscript);
      } elsif ($ref eq 'CODE') {
          $res = $OPT_DEPARSE ? _dump_code($val) : 'sub{"DUMMY"}';
      } else {
          die "Sorry, I can't dump $val (ref=$ref) yet";
      }
  
      $res = "bless($res,"._double_quote($class).")" if defined($class);
      $res;
  }
  
  our $_is_dd;
  sub _dd_or_dmp {
      local %_seen_refaddrs;
      local %_subscripts;
      local @_fixups;
  
      my $res;
      if (@_ > 1) {
          $res = "(" . join(",", map {_dump($_, '')} @_) . ")";
      } else {
          $res = _dump($_[0], '');
      }
      if (@_fixups) {
          $res = "do{my\$a=$res;" . join("", @_fixups) . "\$a}";
      }
  
      if ($_is_dd) {
          say $res;
          return wantarray() || @_ > 1 ? @_ : $_[0];
      } else {
          return $res;
      }
  }
  
  sub dd { local $_is_dd=1; _dd_or_dmp(@_) } # goto &sub doesn't work here
  sub dmp { goto &_dd_or_dmp }
  
  1;
  # ABSTRACT: Dump Perl data structures as Perl code
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Dmp - Dump Perl data structures as Perl code
  
  =head1 VERSION
  
  This document describes version 0.23 of Data::Dmp (from Perl distribution Data-Dmp), released on 2017-01-30.
  
  =head1 SYNOPSIS
  
   use Data::Dmp; # exports dd() and dmp()
   dd [1, 2, 3]; # prints "[1,2,3]"
   $a = dmp({a => 1}); # -> "{a=>1}"
  
  =head1 DESCRIPTION
  
  Data::Dmp is a Perl dumper like L<Data::Dumper>. It's compact (only about 175
  lines of code long), starts fast and does not use any non-core modules except
  L<Regexp::Stringify> when dumping regexes. It produces compact single-line
  output (similar to L<Data::Dumper::Concise>). It roughly has the same speed as
  Data::Dumper (usually a bit faster for smaller structures) and faster than
  L<Data::Dump>, but does not offer the various formatting options. It supports
  dumping objects, regexes, circular structures, coderefs. Its code is first based
  on L<Data::Dump>: I removed all the parts that I don't need, particularly the
  pretty formatting stuffs) and added some features that I need like proper regex
  dumping and coderef deparsing.
  
  =head1 SETTINGS
  
  =head2 $Data::Dmp::OPT_PERL_VERSION => str (default: 5.010)
  
  Set target Perl version. If you set this to, say C<5.010>, then the dumped code
  will keep compatibility with Perl 5.10.0. This is used in the following ways:
  
  =over
  
  =item * passed to L<Regexp::Stringify>
  
  =item * when dumping code references
  
  For example, in perls earlier than 5.016, feature.pm does not understand:
  
   no feature ':all';
  
  so we replace it with:
  
   no feature;
  
  =back
  
  =head2 $Data::Dmp::OPT_REMOVE_PRAGMAS => bool (default: 0)
  
  If set to 1, then pragmas at the start of coderef dump will be removed. Coderef
  dump is produced by L<B::Deparse> and is of the form like:
  
   sub { use feature 'current_sub', 'evalbytes', 'fc', 'say', 'state', 'switch', 'unicode_strings', 'unicode_eval'; $a <=> $b }
  
  If you want to dump short coderefs, the pragmas might be distracting. You can
  turn turn on this option which will make the above dump become:
  
   sub { $a <=> $b }
  
  Note that without the pragmas, the dump might be incorrect.
  
  =head2 $Data::Dmp::OPT_DEPARSE => bool (default: 1)
  
  Can be set to 0 to skip deparsing code. Coderefs will be dumped as
  C<sub{"DUMMY"}> instead, like in Data::Dump.
  
  =head2 $Data::Dmp::OPT_STRINGIFY_NUMBERS => bool (default: 0)
  
  If set to true, will dump numbers as quoted string, e.g. 123 as "123" instead of
  123. This might be helpful if you want to compute the hash of or get a canonical
  representation of data structure.
  
  =head1 BENCHMARKS
  
   [1..10]:
                         Rate    Data::Dump Data::Dumper Data::Dmp
   Data::Dump     30417+-55/s            --       -66.2%    -74.0%
   Data::Dumper   89888+-79/s  195.52+-0.6%           --    -23.1%
   Data::Dmp    116890+-160/s 284.29+-0.87% 30.04+-0.21%        --
   
   [1..100]:
                          Rate    Data::Dump  Data::Dmp Data::Dumper
   Data::Dump    3712.3+-7.9/s            --     -73.9%       -74.9%
   Data::Dmp    14211.3+-4.9/s 282.82+-0.82%         --        -3.8%
   Data::Dumper    14771+-28/s   297.9+-1.1% 3.94+-0.2%           --
   
   Some mixed structure:
                       Rate    Data::Dump    Data::Dmp Data::Dumper
   Data::Dump    8764+-16/s            --       -67.6%       -80.1%
   Data::Dmp    27016+-36/s  208.28+-0.7%           --       -38.6%
   Data::Dumper 43995+-13/s 402.02+-0.95% 62.85+-0.22%           --
  
  =head1 FUNCTIONS
  
  =head2 dd($data, ...) => $data ...
  
  Exported by default. Like C<Data::Dump>'s C<dd> (a.k.a. C<dump>), print one or
  more data to STDOUT. Unlike C<Data::Dump>'s C<dd>, it I<always> prints and
  return I<the original data> (like L<XXX>), making it convenient to insert into
  expressions. This also removes ambiguity and saves one C<wantarray()> call.
  
  =head2 dmp($data, ...) => $str
  
  Exported by default. Return dump result as string. Unlike C<Data::Dump>'s C<dd>
  (a.k.a. C<dump>), it I<never> prints and only return the data.
  
  =head1 FAQ
  
  =head2 When to use Data::Dmp? How does it compare to other dumper modules?
  
  Data::Dmp might be suitable for you if you want a relatively fast pure-Perl data
  structure dumper to eval-able Perl code. It produces compact, single-line Perl
  code but offers little/no formatting options. Data::Dmp and Data::Dump module
  family usually produce Perl code that is "more eval-able", e.g. it can recreate
  circular structure.
  
  L<Data::Dump> produces visually nicer output (some alignment, use of range
  operator to shorten lists, use of base64 for binary data, etc) but no built-in
  option to produce compact/single-line output. It's more suitable for debugging.
  It's also relatively slow. I usually use its variant, L<Data::Dump::Color>, for
  console debugging.
  
  L<Data::Dumper> is a core module, offers a lot of formatting options (like
  disabling hash key sorting, setting verboseness/indent level, and so on) but you
  usually have to configure it quite a bit before it does exactly like you want
  (that's why there are modules on CPAN that are just wrapping Data::Dumper with
  some configuration, like L<Data::Dumper::Concise> et al). It does not support
  dumping Perl code that can recreate circular structures.
  
  Of course, dumping to eval-able Perl code is slow (not to mention the cost of
  re-loading the code back to in-memory data, via eval-ing) compared to dumping to
  JSON, YAML, Sereal, or other format. So you need to decide first whether this is
  the appropriate route you want to take. (But note that there is also
  L<Data::Dumper::Limited> and L<Data::Undump> which uses a format similar to
  Data::Dumper but lets you load the serialized data without eval-ing them, thus
  achieving the speed comparable to JSON::XS).
  
  =head2 Is the output guaranteed to be single line dump?
  
  No. Some things can still produce multiline dump, e.g. newline in regular
  expression.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Dmp>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Dmp>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Dmp>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Data::Dump> and other variations/derivate works in Data::Dump::*.
  
  L<Data::Dumper> and its variants.
  
  L<Data::Printer>.
  
  L<YAML>, L<JSON>, L<Storable>, L<Sereal>, and other serialization formats.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2017 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_DMP

    $main::fatpacked{"Data/Dump.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_DUMP';
  package Data::Dump;
  
  use strict;
  use vars qw(@EXPORT @EXPORT_OK $VERSION $DEBUG);
  use subs qq(dump);
  
  require Exporter;
  *import = \&Exporter::import;
  @EXPORT = qw(dd ddx);
  @EXPORT_OK = qw(dump pp dumpf quote);
  
  $VERSION = "1.23";
  $DEBUG = 0;
  
  use overload ();
  use vars qw(%seen %refcnt @dump @fixup %require $TRY_BASE64 @FILTERS $INDENT);
  
  $TRY_BASE64 = 50 unless defined $TRY_BASE64;
  $INDENT = "  " unless defined $INDENT;
  
  sub dump
  {
      local %seen;
      local %refcnt;
      local %require;
      local @fixup;
  
      require Data::Dump::FilterContext if @FILTERS;
  
      my $name = "a";
      my @dump;
  
      for my $v (@_) {
  	my $val = _dump($v, $name, [], tied($v));
  	push(@dump, [$name, $val]);
      } continue {
  	$name++;
      }
  
      my $out = "";
      if (%require) {
  	for (sort keys %require) {
  	    $out .= "require $_;\n";
  	}
      }
      if (%refcnt) {
  	# output all those with refcounts first
  	for (@dump) {
  	    my $name = $_->[0];
  	    if ($refcnt{$name}) {
  		$out .= "my \$$name = $_->[1];\n";
  		undef $_->[1];
  	    }
  	}
  	for (@fixup) {
  	    $out .= "$_;\n";
  	}
      }
  
      my $paren = (@dump != 1);
      $out .= "(" if $paren;
      $out .= format_list($paren, undef,
  			map {defined($_->[1]) ? $_->[1] : "\$".$_->[0]}
  			    @dump
  		       );
      $out .= ")" if $paren;
  
      if (%refcnt || %require) {
  	$out .= ";\n";
  	$out =~ s/^/$INDENT/gm;
  	$out = "do {\n$out}";
      }
  
      print STDERR "$out\n" unless defined wantarray;
      $out;
  }
  
  *pp = \&dump;
  
  sub dd {
      print dump(@_), "\n";
  }
  
  sub ddx {
      my(undef, $file, $line) = caller;
      $file =~ s,.*[\\/],,;
      my $out = "$file:$line: " . dump(@_) . "\n";
      $out =~ s/^/# /gm;
      print $out;
  }
  
  sub dumpf {
      require Data::Dump::Filtered;
      goto &Data::Dump::Filtered::dump_filtered;
  }
  
  sub _dump
  {
      my $ref  = ref $_[0];
      my $rval = $ref ? $_[0] : \$_[0];
      shift;
  
      my($name, $idx, $dont_remember, $pclass, $pidx) = @_;
  
      my($class, $type, $id);
      my $strval = overload::StrVal($rval);
      # Parse $strval without using regexps, in order not to clobber $1, $2,...
      if ((my $i = rindex($strval, "=")) >= 0) {
  	$class = substr($strval, 0, $i);
  	$strval = substr($strval, $i+1);
      }
      if ((my $i = index($strval, "(0x")) >= 0) {
  	$type = substr($strval, 0, $i);
  	$id = substr($strval, $i + 2, -1);
      }
      else {
  	die "Can't parse " . overload::StrVal($rval);
      }
      if ($] < 5.008 && $type eq "SCALAR") {
  	$type = "REF" if $ref eq "REF";
      }
      warn "\$$name(@$idx) $class $type $id ($ref)" if $DEBUG;
  
      my $out;
      my $comment;
      my $hide_keys;
      if (@FILTERS) {
  	my $pself = "";
  	$pself = fullname("self", [@$idx[$pidx..(@$idx - 1)]]) if $pclass;
  	my $ctx = Data::Dump::FilterContext->new($rval, $class, $type, $ref, $pclass, $pidx, $idx);
  	my @bless;
  	for my $filter (@FILTERS) {
  	    if (my $f = $filter->($ctx, $rval)) {
  		if (my $v = $f->{object}) {
  		    local @FILTERS;
  		    $out = _dump($v, $name, $idx, 1);
  		    $dont_remember++;
  		}
  		if (defined(my $c = $f->{bless})) {
  		    push(@bless, $c);
  		}
  		if (my $c = $f->{comment}) {
  		    $comment = $c;
  		}
  		if (defined(my $c = $f->{dump})) {
  		    $out = $c;
  		    $dont_remember++;
  		}
  		if (my $h = $f->{hide_keys}) {
  		    if (ref($h) eq "ARRAY") {
  			$hide_keys = sub {
  			    for my $k (@$h) {
  				return 1 if $k eq $_[0];
  			    }
  			    return 0;
  			};
  		    }
  		}
  	    }
  	}
  	push(@bless, "") if defined($out) && !@bless;
  	if (@bless) {
  	    $class = shift(@bless);
  	    warn "More than one filter callback tried to bless object" if @bless;
  	}
      }
  
      unless ($dont_remember) {
  	if (my $s = $seen{$id}) {
  	    my($sname, $sidx) = @$s;
  	    $refcnt{$sname}++;
  	    my $sref = fullname($sname, $sidx,
  				($ref && $type eq "SCALAR"));
  	    warn "SEEN: [\$$name(@$idx)] => [\$$sname(@$sidx)] ($ref,$sref)" if $DEBUG;
  	    return $sref unless $sname eq $name;
  	    $refcnt{$name}++;
  	    push(@fixup, fullname($name,$idx)." = $sref");
  	    return "do{my \$fix}" if @$idx && $idx->[-1] eq '$';
  	    return "'fix'";
  	}
  	$seen{$id} = [$name, $idx];
      }
  
      if ($class) {
  	$pclass = $class;
  	$pidx = @$idx;
      }
  
      if (defined $out) {
  	# keep it
      }
      elsif ($type eq "SCALAR" || $type eq "REF" || $type eq "REGEXP") {
  	if ($ref) {
  	    if ($class && $class eq "Regexp") {
  		my $v = "$rval";
  
  		my $mod = "";
  		if ($v =~ /^\(\?\^?([msix-]*):([\x00-\xFF]*)\)\z/) {
  		    $mod = $1;
  		    $v = $2;
  		    $mod =~ s/-.*//;
  		}
  
  		my $sep = '/';
  		my $sep_count = ($v =~ tr/\///);
  		if ($sep_count) {
  		    # see if we can find a better one
  		    for ('|', ',', ':', '#') {
  			my $c = eval "\$v =~ tr/\Q$_\E//";
  			#print "SEP $_ $c $sep_count\n";
  			if ($c < $sep_count) {
  			    $sep = $_;
  			    $sep_count = $c;
  			    last if $sep_count == 0;
  			}
  		    }
  		}
  		$v =~ s/\Q$sep\E/\\$sep/g;
  
  		$out = "qr$sep$v$sep$mod";
  		undef($class);
  	    }
  	    else {
  		delete $seen{$id} if $type eq "SCALAR";  # will be seen again shortly
  		my $val = _dump($$rval, $name, [@$idx, "\$"], 0, $pclass, $pidx);
  		$out = $class ? "do{\\(my \$o = $val)}" : "\\$val";
  	    }
  	} else {
  	    if (!defined $$rval) {
  		$out = "undef";
  	    }
  	    elsif (do {no warnings 'numeric'; $$rval + 0 eq $$rval}) {
  		$out = $$rval;
  	    }
  	    else {
  		$out = str($$rval);
  	    }
  	    if ($class && !@$idx) {
  		# Top is an object, not a reference to one as perl needs
  		$refcnt{$name}++;
  		my $obj = fullname($name, $idx);
  		my $cl  = quote($class);
  		push(@fixup, "bless \\$obj, $cl");
  	    }
  	}
      }
      elsif ($type eq "GLOB") {
  	if ($ref) {
  	    delete $seen{$id};
  	    my $val = _dump($$rval, $name, [@$idx, "*"], 0, $pclass, $pidx);
  	    $out = "\\$val";
  	    if ($out =~ /^\\\*Symbol::/) {
  		$require{Symbol}++;
  		$out = "Symbol::gensym()";
  	    }
  	} else {
  	    my $val = "$$rval";
  	    $out = "$$rval";
  
  	    for my $k (qw(SCALAR ARRAY HASH)) {
  		my $gval = *$$rval{$k};
  		next unless defined $gval;
  		next if $k eq "SCALAR" && ! defined $$gval;  # always there
  		my $f = scalar @fixup;
  		push(@fixup, "RESERVED");  # overwritten after _dump() below
  		$gval = _dump($gval, $name, [@$idx, "*{$k}"], 0, $pclass, $pidx);
  		$refcnt{$name}++;
  		my $gname = fullname($name, $idx);
  		$fixup[$f] = "$gname = $gval";  #XXX indent $gval
  	    }
  	}
      }
      elsif ($type eq "ARRAY") {
  	my @vals;
  	my $tied = tied_str(tied(@$rval));
  	my $i = 0;
  	for my $v (@$rval) {
  	    push(@vals, _dump($v, $name, [@$idx, "[$i]"], $tied, $pclass, $pidx));
  	    $i++;
  	}
  	$out = "[" . format_list(1, $tied, @vals) . "]";
      }
      elsif ($type eq "HASH") {
  	my(@keys, @vals);
  	my $tied = tied_str(tied(%$rval));
  
  	# statistics to determine variation in key lengths
  	my $kstat_max = 0;
  	my $kstat_sum = 0;
  	my $kstat_sum2 = 0;
  
  	my @orig_keys = keys %$rval;
  	if ($hide_keys) {
  	    @orig_keys = grep !$hide_keys->($_), @orig_keys;
  	}
  	my $text_keys = 0;
  	for (@orig_keys) {
  	    $text_keys++, last unless /^[-+]?(?:0|[1-9]\d*)(?:\.\d+)?\z/;
  	}
  
  	if ($text_keys) {
  	    @orig_keys = sort { lc($a) cmp lc($b) } @orig_keys;
  	}
  	else {
  	    @orig_keys = sort { $a <=> $b } @orig_keys;
  	}
  
  	my $quote;
  	for my $key (@orig_keys) {
  	    next if $key =~ /^-?[a-zA-Z_]\w*\z/;
  	    next if $key =~ /^-?[1-9]\d{0,8}\z/;
  	    $quote++;
  	    last;
  	}
  
  	for my $key (@orig_keys) {
  	    my $val = \$rval->{$key};  # capture value before we modify $key
  	    $key = quote($key) if $quote;
  	    $kstat_max = length($key) if length($key) > $kstat_max;
  	    $kstat_sum += length($key);
  	    $kstat_sum2 += length($key)*length($key);
  
  	    push(@keys, $key);
  	    push(@vals, _dump($$val, $name, [@$idx, "{$key}"], $tied, $pclass, $pidx));
  	}
  	my $nl = "";
  	my $klen_pad = 0;
  	my $tmp = "@keys @vals";
  	if (length($tmp) > 60 || $tmp =~ /\n/ || $tied) {
  	    $nl = "\n";
  
  	    # Determine what padding to add
  	    if ($kstat_max < 4) {
  		$klen_pad = $kstat_max;
  	    }
  	    elsif (@keys >= 2) {
  		my $n = @keys;
  		my $avg = $kstat_sum/$n;
  		my $stddev = sqrt(($kstat_sum2 - $n * $avg * $avg) / ($n - 1));
  
  		# I am not actually very happy with this heuristics
  		if ($stddev / $kstat_max < 0.25) {
  		    $klen_pad = $kstat_max;
  		}
  		if ($DEBUG) {
  		    push(@keys, "__S");
  		    push(@vals, sprintf("%.2f (%d/%.1f/%.1f)",
  					$stddev / $kstat_max,
  					$kstat_max, $avg, $stddev));
  		}
  	    }
  	}
  	$out = "{$nl";
  	$out .= "$INDENT# $tied$nl" if $tied;
  	while (@keys) {
  	    my $key = shift @keys;
  	    my $val = shift @vals;
  	    my $vpad = $INDENT . (" " x ($klen_pad ? $klen_pad + 4 : 0));
  	    $val =~ s/\n/\n$vpad/gm;
  	    my $kpad = $nl ? $INDENT : " ";
  	    $key .= " " x ($klen_pad - length($key)) if $nl && $klen_pad > length($key);
  	    $out .= "$kpad$key => $val,$nl";
  	}
  	$out =~ s/,$/ / unless $nl;
  	$out .= "}";
      }
      elsif ($type eq "CODE") {
  	$out = 'sub { ... }';
      }
      elsif ($type eq "VSTRING") {
          $out = sprintf +($ref ? '\v%vd' : 'v%vd'), $$rval;
      }
      else {
  	warn "Can't handle $type data";
  	$out = "'#$type#'";
      }
  
      if ($class && $ref) {
  	$out = "bless($out, " . quote($class) . ")";
      }
      if ($comment) {
  	$comment =~ s/^/# /gm;
  	$comment .= "\n" unless $comment =~ /\n\z/;
  	$comment =~ s/^#[ \t]+\n/\n/;
  	$out = "$comment$out";
      }
      return $out;
  }
  
  sub tied_str {
      my $tied = shift;
      if ($tied) {
  	if (my $tied_ref = ref($tied)) {
  	    $tied = "tied $tied_ref";
  	}
  	else {
  	    $tied = "tied";
  	}
      }
      return $tied;
  }
  
  sub fullname
  {
      my($name, $idx, $ref) = @_;
      substr($name, 0, 0) = "\$";
  
      my @i = @$idx;  # need copy in order to not modify @$idx
      if ($ref && @i && $i[0] eq "\$") {
  	shift(@i);  # remove one deref
  	$ref = 0;
      }
      while (@i && $i[0] eq "\$") {
  	shift @i;
  	$name = "\$$name";
      }
  
      my $last_was_index;
      for my $i (@i) {
  	if ($i eq "*" || $i eq "\$") {
  	    $last_was_index = 0;
  	    $name = "$i\{$name}";
  	} elsif ($i =~ s/^\*//) {
  	    $name .= $i;
  	    $last_was_index++;
  	} else {
  	    $name .= "->" unless $last_was_index++;
  	    $name .= $i;
  	}
      }
      $name = "\\$name" if $ref;
      $name;
  }
  
  sub format_list
  {
      my $paren = shift;
      my $comment = shift;
      my $indent_lim = $paren ? 0 : 1;
      if (@_ > 3) {
  	# can we use range operator to shorten the list?
  	my $i = 0;
  	while ($i < @_) {
  	    my $j = $i + 1;
  	    my $v = $_[$i];
  	    while ($j < @_) {
  		# XXX allow string increment too?
  		if ($v eq "0" || $v =~ /^-?[1-9]\d{0,9}\z/) {
  		    $v++;
  		}
  		elsif ($v =~ /^"([A-Za-z]{1,3}\d*)"\z/) {
  		    $v = $1;
  		    $v++;
  		    $v = qq("$v");
  		}
  		else {
  		    last;
  		}
  		last if $_[$j] ne $v;
  		$j++;
  	    }
  	    if ($j - $i > 3) {
  		splice(@_, $i, $j - $i, "$_[$i] .. $_[$j-1]");
  	    }
  	    $i++;
  	}
      }
      my $tmp = "@_";
      if ($comment || (@_ > $indent_lim && (length($tmp) > 60 || $tmp =~ /\n/))) {
  	my @elem = @_;
  	for (@elem) { s/^/$INDENT/gm; }
  	return "\n" . ($comment ? "$INDENT# $comment\n" : "") .
                 join(",\n", @elem, "");
      } else {
  	return join(", ", @_);
      }
  }
  
  sub str {
    if (length($_[0]) > 20) {
        for ($_[0]) {
        # Check for repeated string
        if (/^(.)\1\1\1/s) {
            # seems to be a repeating sequence, let's check if it really is
            # without backtracking
            unless (/[^\Q$1\E]/) {
                my $base = quote($1);
                my $repeat = length;
                return "($base x $repeat)"
            }
        }
        # Length protection because the RE engine will blow the stack [RT#33520]
        if (length($_) < 16 * 1024 && /^(.{2,5}?)\1*\z/s) {
  	  my $base   = quote($1);
  	  my $repeat = length($_)/length($1);
  	  return "($base x $repeat)";
        }
        }
    }
  
    local $_ = &quote;
  
    if (length($_) > 40  && !/\\x\{/ && length($_) > (length($_[0]) * 2)) {
        # too much binary data, better to represent as a hex/base64 string
  
        # Base64 is more compact than hex when string is longer than
        # 17 bytes (not counting any require statement needed).
        # But on the other hand, hex is much more readable.
        if ($TRY_BASE64 && length($_[0]) > $TRY_BASE64 &&
  	  (defined &utf8::is_utf8 && !utf8::is_utf8($_[0])) &&
  	  eval { require MIME::Base64 })
        {
  	  $require{"MIME::Base64"}++;
  	  return "MIME::Base64::decode(\"" .
  	             MIME::Base64::encode($_[0],"") .
  		 "\")";
        }
        return "pack(\"H*\",\"" . unpack("H*", $_[0]) . "\")";
    }
  
    return $_;
  }
  
  my %esc = (
      "\a" => "\\a",
      "\b" => "\\b",
      "\t" => "\\t",
      "\n" => "\\n",
      "\f" => "\\f",
      "\r" => "\\r",
      "\e" => "\\e",
  );
  
  # put a string value in double quotes
  sub quote {
    local($_) = $_[0];
    # If there are many '"' we might want to use qq() instead
    s/([\\\"\@\$])/\\$1/g;
    return qq("$_") unless /[^\040-\176]/;  # fast exit
  
    s/([\a\b\t\n\f\r\e])/$esc{$1}/g;
  
    # no need for 3 digits in escape for these
    s/([\0-\037])(?!\d)/sprintf('\\%o',ord($1))/eg;
  
    s/([\0-\037\177-\377])/sprintf('\\x%02X',ord($1))/eg;
    s/([^\040-\176])/sprintf('\\x{%X}',ord($1))/eg;
  
    return qq("$_");
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Data::Dump - Pretty printing of data structures
  
  =head1 SYNOPSIS
  
   use Data::Dump qw(dump);
  
   $str = dump(@list);
   @copy_of_list = eval $str;
  
   # or use it for easy debug printout
   use Data::Dump; dd localtime;
  
  =head1 DESCRIPTION
  
  This module provide a few functions that traverse their
  argument and produces a string as its result.  The string contains
  Perl code that, when C<eval>ed, produces a deep copy of the original
  arguments.
  
  The main feature of the module is that it strives to produce output
  that is easy to read.  Example:
  
      @a = (1, [2, 3], {4 => 5});
      dump(@a);
  
  Produces:
  
      "(1, [2, 3], { 4 => 5 })"
  
  If you dump just a little data, it is output on a single line. If
  you dump data that is more complex or there is a lot of it, line breaks
  are automatically added to keep it easy to read.
  
  The following functions are provided (only the dd* functions are exported by default):
  
  =over
  
  =item dump( ... )
  
  =item pp( ... )
  
  Returns a string containing a Perl expression.  If you pass this
  string to Perl's built-in eval() function it should return a copy of
  the arguments you passed to dump().
  
  If you call the function with multiple arguments then the output will
  be wrapped in parenthesis "( ..., ... )".  If you call the function with a
  single argument the output will not have the wrapping.  If you call the function with
  a single scalar (non-reference) argument it will just return the
  scalar quoted if needed, but never break it into multiple lines.  If you
  pass multiple arguments or references to arrays of hashes then the
  return value might contain line breaks to format it for easier
  reading.  The returned string will never be "\n" terminated, even if
  contains multiple lines.  This allows code like this to place the
  semicolon in the expected place:
  
     print '$obj = ', dump($obj), ";\n";
  
  If dump() is called in void context, then the dump is printed on
  STDERR and then "\n" terminated.  You might find this useful for quick
  debug printouts, but the dd*() functions might be better alternatives
  for this.
  
  There is no difference between dump() and pp(), except that dump()
  shares its name with a not-so-useful perl builtin.  Because of this
  some might want to avoid using that name.
  
  =item quote( $string )
  
  Returns a quoted version of the provided string.
  
  It differs from C<dump($string)> in that it will quote even numbers and
  not try to come up with clever expressions that might shorten the
  output.  If a non-scalar argument is provided then it's just stringified
  instead of traversed.
  
  =item dd( ... )
  
  =item ddx( ... )
  
  These functions will call dump() on their argument and print the
  result to STDOUT (actually, it's the currently selected output handle, but
  STDOUT is the default for that).
  
  The difference between them is only that ddx() will prefix the lines
  it prints with "# " and mark the first line with the file and line
  number where it was called.  This is meant to be useful for debug
  printouts of state within programs.
  
  =item dumpf( ..., \&filter )
  
  Short hand for calling the dump_filtered() function of L<Data::Dump::Filtered>.
  This works like dump(), but the last argument should be a filter callback
  function.  As objects are visited the filter callback is invoked and it
  can modify how the objects are dumped.
  
  =back
  
  =head1 CONFIGURATION
  
  There are a few global variables that can be set to modify the output
  generated by the dump functions.  It's wise to localize the setting of
  these.
  
  =over
  
  =item $Data::Dump::INDENT
  
  This holds the string that's used for indenting multiline data structures.
  It's default value is "  " (two spaces).  Set it to "" to suppress indentation.
  Setting it to "| " makes for nice visuals even if the dump output then fails to
  be valid Perl.
  
  =item $Data::Dump::TRY_BASE64
  
  How long must a binary string be before we try to use the base64 encoding
  for the dump output.  The default is 50.  Set it to 0 to disable base64 dumps.
  
  =back
  
  
  =head1 LIMITATIONS
  
  Code references will be dumped as C<< sub { ... } >>. Thus, C<eval>ing them will
  not reproduce the original routine.  The C<...>-operator used will also require
  perl-5.12 or better to be evaled.
  
  If you forget to explicitly import the C<dump> function, your code will
  core dump. That's because you just called the builtin C<dump> function
  by accident, which intentionally dumps core.  Because of this you can
  also import the same function as C<pp>, mnemonic for "pretty-print".
  
  =head1 HISTORY
  
  The C<Data::Dump> module grew out of frustration with Sarathy's
  in-most-cases-excellent C<Data::Dumper>.  Basic ideas and some code
  are shared with Sarathy's module.
  
  The C<Data::Dump> module provides a much simpler interface than
  C<Data::Dumper>.  No OO interface is available and there are fewer
  configuration options to worry about.  The other benefit is
  that the dump produced does not try to set any variables.  It only
  returns what is needed to produce a copy of the arguments.  This means
  that C<dump("foo")> simply returns C<'"foo"'>, and C<dump(1..3)> simply
  returns C<'(1, 2, 3)'>.
  
  =head1 SEE ALSO
  
  L<Data::Dump::Filtered>, L<Data::Dump::Trace>, L<Data::Dumper>, L<JSON>,
  L<Storable>
  
  =head1 AUTHORS
  
  The C<Data::Dump> module is written by Gisle Aas <gisle@aas.no>, based
  on C<Data::Dumper> by Gurusamy Sarathy <gsar@umich.edu>.
  
   Copyright 1998-2010 Gisle Aas.
   Copyright 1996-1998 Gurusamy Sarathy.
  
  This library is free software; you can redistribute it and/or
  modify it under the same terms as Perl itself.
  
  =cut
DATA_DUMP

    $main::fatpacked{"Data/Dump/FilterContext.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_DUMP_FILTERCONTEXT';
  package Data::Dump::FilterContext;
  
  sub new {
      my($class, $obj, $oclass, $type, $ref, $pclass, $pidx, $idx) = @_;
      return bless {
  	object => $obj,
  	class => $ref && $oclass,
  	reftype => $type,
  	is_ref => $ref,
  	pclass => $pclass,
  	pidx => $pidx,
  	idx => $idx,
      }, $class;
  }
  
  sub object_ref {
      my $self = shift;
      return $self->{object};
  }
  
  sub class {
      my $self = shift;
      return $self->{class} || "";
  }
  
  *is_blessed = \&class;
  
  sub reftype {
      my $self = shift;
      return $self->{reftype};
  }
  
  sub is_scalar {
      my $self = shift;
      return $self->{reftype} eq "SCALAR";
  }
  
  sub is_array {
      my $self = shift;
      return $self->{reftype} eq "ARRAY";
  }
  
  sub is_hash {
      my $self = shift;
      return $self->{reftype} eq "HASH";
  }
  
  sub is_code {
      my $self = shift;
      return $self->{reftype} eq "CODE";
  }
  
  sub is_ref {
      my $self = shift;
      return $self->{is_ref};
  }
  
  sub container_class {
      my $self = shift;
      return $self->{pclass} || "";
  }
  
  sub container_self {
      my $self = shift;
      return "" unless $self->{pclass};
      my $idx = $self->{idx};
      my $pidx = $self->{pidx};
      return Data::Dump::fullname("self", [@$idx[$pidx..(@$idx - 1)]]);
  }
  
  sub expr {
      my $self = shift;
      my $top = shift || "var";
      $top =~ s/^\$//; # it's always added by fullname()
      my $idx = $self->{idx};
      return Data::Dump::fullname($top, $idx);
  }
  
  sub object_isa {
      my($self, $class) = @_;
      return $self->{class} && $self->{class}->isa($class);
  }
  
  sub container_isa {
      my($self, $class) = @_;
      return $self->{pclass} && $self->{pclass}->isa($class);
  }
  
  sub depth {
      my $self = shift;
      return scalar @{$self->{idx}};
  }
  
  1;
DATA_DUMP_FILTERCONTEXT

    $main::fatpacked{"Data/Dump/Filtered.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_DUMP_FILTERED';
  package Data::Dump::Filtered;
  
  use Data::Dump ();
  use Carp ();
  
  use base 'Exporter';
  our @EXPORT_OK = qw(add_dump_filter remove_dump_filter dump_filtered);
  
  sub add_dump_filter {
      my $filter = shift;
      unless (ref($filter) eq "CODE") {
  	Carp::croak("add_dump_filter argument must be a code reference");
      }
      push(@Data::Dump::FILTERS, $filter);
      return $filter;
  }
  
  sub remove_dump_filter {
      my $filter = shift;
      @Data::Dump::FILTERS = grep $_ ne $filter, @Data::Dump::FILTERS;
  }
  
  sub dump_filtered {
      my $filter = pop;
      if (defined($filter) && ref($filter) ne "CODE") {
  	Carp::croak("Last argument to dump_filtered must be undef or a code reference");
      }
      local @Data::Dump::FILTERS = ($filter ? $filter : ());
      return &Data::Dump::dump;
  }
  
  1;
  
  =head1 NAME
  
  Data::Dump::Filtered - Pretty printing with filtering
  
  =head1 DESCRIPTION
  
  The following functions are provided:
  
  =over
  
  =item add_dump_filter( \&filter )
  
  This registers a filter function to be used by the regular Data::Dump::dump()
  function.  By default no filters are active.
  
  Since registering filters has a global effect is might be more appropriate
  to use the dump_filtered() function instead.
  
  =item remove_dump_filter( \&filter )
  
  Unregister the given callback function as filter callback.
  This undoes the effect of L<add_filter>.
  
  =item dump_filtered(..., \&filter )
  
  Works like Data::Dump::dump(), but the last argument should
  be a filter callback function.  As objects are visited the
  filter callback is invoked at it might influence how objects are dumped.
  
  Any filters registered with L<add_filter()> are ignored when
  this interface is invoked.  Actually, passing C<undef> as \&filter
  is allowed and C<< dump_filtered(..., undef) >> is the official way to
  force unfiltered dumps.
  
  =back
  
  =head2 Filter callback
  
  A filter callback is a function that will be invoked with 2 arguments;
  a context object and reference to the object currently visited.  The return
  value should either be a hash reference or C<undef>.
  
      sub filter_callback {
          my($ctx, $object_ref) = @_;
  	...
  	return { ... }
      }
  
  If the filter callback returns C<undef> (or nothing) then normal
  processing and formatting of the visited object happens.
  If the filter callback returns a hash it might replace
  or annotate the representation of the current object.
  
  =head2 Filter context
  
  The context object provide methods that can be used to determine what kind of
  object is currently visited and where it's located.  The context object has the
  following interface:
  
  =over
  
  =item $ctx->object_ref
  
  Alternative way to obtain a reference to the current object
  
  =item $ctx->class
  
  If the object is blessed this return the class.  Returns ""
  for objects not blessed.
  
  =item $ctx->reftype
  
  Returns what kind of object this is.  It's a string like "SCALAR",
  "ARRAY", "HASH", "CODE",...
  
  =item $ctx->is_ref
  
  Returns true if a reference was provided.
  
  =item $ctx->is_blessed
  
  Returns true if the object is blessed.  Actually, this is just an alias
  for C<< $ctx->class >>.
  
  =item $ctx->is_array
  
  Returns true if the object is an array
  
  =item $ctx->is_hash
  
  Returns true if the object is a hash
  
  =item $ctx->is_scalar
  
  Returns true if the object is a scalar (a string or a number)
  
  =item $ctx->is_code
  
  Returns true if the object is a function (aka subroutine)
  
  =item $ctx->container_class
  
  Returns the class of the innermost container that contains this object.
  Returns "" if there is no blessed container.
  
  =item $ctx->container_self
  
  Returns an textual expression relative to the container object that names this
  object.  The variable C<$self> in this expression is the container itself.
  
  =item $ctx->object_isa( $class )
  
  Returns TRUE if the current object is of the given class or is of a subclass.
  
  =item $ctx->container_isa( $class )
  
  Returns TRUE if the innermost container is of the given class or is of a
  subclass.
  
  =item $ctx->depth
  
  Returns how many levels deep have we recursed into the structure (from the
  original dump_filtered() arguments).
  
  =item $ctx->expr
  
  =item $ctx->expr( $top_level_name )
  
  Returns an textual expression that denotes the current object.  In the
  expression C<$var> is used as the name of the top level object dumped.  This
  can be overridden by providing a different name as argument.
  
  =back
  
  =head2 Filter return hash
  
  The following elements has significance in the returned hash:
  
  =over
  
  =item dump => $string
  
  incorporate the given string as the representation for the
  current value
  
  =item object => $value
  
  dump the given value instead of the one visited and passed in as $object.
  Basically the same as specifying C<< dump => Data::Dump::dump($value) >>.
  
  =item comment => $comment
  
  prefix the value with the given comment string
  
  =item bless => $class
  
  make it look as if the current object is of the given $class
  instead of the class it really has (if any).  The internals of the object
  is dumped in the regular way.  The $class can be the empty string
  to make Data::Dump pretend the object wasn't blessed at all.
  
  =item hide_keys => ['key1', 'key2',...]
  
  =item hide_keys => \&code
  
  If the $object is a hash dump is as normal but pretend that the
  listed keys did not exist.  If the argument is a function then
  the function is called to determine if the given key should be
  hidden.
  
  =back
  
  =head1 SEE ALSO
  
  L<Data::Dump>
DATA_DUMP_FILTERED

    $main::fatpacked{"Data/Dump/OneLine.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_DUMP_ONELINE';
  package Data::Dump::OneLine;
  
  our $DATE = '2015-03-25'; # DATE
  our $VERSION = '0.07'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  use Data::Dmp;
  
  our @ISA = qw(Data::Dmp);
  our @EXPORT = (@Data::Dmp::EXPORT, 'dump1', 'dump_one_line');
  
  *dump1 = \&Data::Dmp::dmp;
  *dump_one_line = \&Data::Dmp::dmp;
  
  1;
  # ABSTRACT: Dump data structures as single-line strings
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Dump::OneLine - Dump data structures as single-line strings
  
  =head1 VERSION
  
  This document describes version 0.07 of Data::Dump::OneLine (from Perl distribution Data-Dump-OneLine), released on 2015-03-25.
  
  =head1 SYNOPSIS
  
   use Data::Dump::OneLine; # exports dd and dmp
   $str = dd(@list);
  
  =head1 DESCRIPTION
  
  It now uses L<Data::Dmp>. You should use Data::Dmp directly.
  
  =for Pod::Coverage ^(.+)$
  
  =head1 SEE ALSO
  
  L<JSON> should also encode to a single-line string, but some data structures
  (cyclical, contains globs or other special Perl data) cannot be encoded out of
  the box to JSON.
  
  L<Data::Dumper::OneLine> strives to do the same for L<Data::Dumper>, but last
  time I tried it (at v0.05) it's still buggy.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Dump-OneLine>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Dump-OneLine>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Dump-OneLine>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2015 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_DUMP_ONELINE

    $main::fatpacked{"Data/Dump/Trace.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_DUMP_TRACE';
  package Data::Dump::Trace;
  
  $VERSION = "0.02";
  
  # Todo:
  #   - prototypes
  #     in/out parameters key/value style
  #   - exception
  #   - wrap class
  #   - configurable colors
  #   - show call depth using indentation
  #   - show nested calls sensibly
  #   - time calls
  
  use strict;
  
  use base 'Exporter';
  our @EXPORT_OK = qw(call mcall wrap autowrap trace);
  
  use Carp qw(croak);
  use overload ();
  
  my %obj_name;
  my %autowrap_class;
  my %name_count;
  
  sub autowrap {
      while (@_) {
          my $class = shift;
          my $info = shift;
          $info = { prefix => $info } unless ref($info);
          for ($info->{prefix}) {
              unless ($_) {
                  $_ = lc($class);
                  s/.*:://;
              }
              $_ = '$' . $_ unless /^\$/;
          }
          $autowrap_class{$class} = $info;
      }
  }
  
  sub wrap {
      my %arg = @_;
      my $name = $arg{name} || "func";
      my $func = $arg{func};
      my $proto = $arg{proto};
  
      return sub {
          call($name, $func, $proto, @_);
      } if $func;
  
      if (my $obj = $arg{obj}) {
          $name = '$' . $name unless $name =~ /^\$/;
          $obj_name{overload::StrVal($obj)} = $name;
          return bless {
              name => $name,
              obj => $obj,
              proto => $arg{proto},
          }, "Data::Dump::Trace::Wrapper";
      }
  
      croak("Either the 'func' or 'obj' option must be given");
  }
  
  sub trace {
      my($symbol, $prototype) = @_;
      no strict 'refs';
      no warnings 'redefine';
      *{$symbol} = wrap(name => $symbol, func => \&{$symbol}, proto => $prototype);
  }
  
  sub call {
      my $name = shift;
      my $func = shift;
      my $proto = shift;
      my $fmt = Data::Dump::Trace::Call->new($name, $proto, \@_);
      if (!defined wantarray) {
          $func->(@_);
          return $fmt->return_void(\@_);
      }
      elsif (wantarray) {
          return $fmt->return_list(\@_, $func->(@_));
      }
      else {
          return $fmt->return_scalar(\@_, scalar $func->(@_));
      }
  }
  
  sub mcall {
      my $o = shift;
      my $method = shift;
      my $proto = shift;
      return if $method eq "DESTROY" && !$o->can("DESTROY");
      my $oname = ref($o) ? $obj_name{overload::StrVal($o)} || "\$o" : $o;
      my $fmt = Data::Dump::Trace::Call->new("$oname->$method", $proto, \@_);
      if (!defined wantarray) {
          $o->$method(@_);
          return $fmt->return_void(\@_);
      }
      elsif (wantarray) {
          return $fmt->return_list(\@_, $o->$method(@_));
      }
      else {
          return $fmt->return_scalar(\@_, scalar $o->$method(@_));
      }
  }
  
  package Data::Dump::Trace::Wrapper;
  
  sub AUTOLOAD {
      my $self = shift;
      our $AUTOLOAD;
      my $method = substr($AUTOLOAD, rindex($AUTOLOAD, '::')+2);
      Data::Dump::Trace::mcall($self->{obj}, $method, $self->{proto}{$method}, @_);
  }
  
  package Data::Dump::Trace::Call;
  
  use Term::ANSIColor ();
  use Data::Dump ();
  
  *_dump = \&Data::Dump::dump;
  
  our %COLOR = (
      name => "yellow",
      output => "cyan",
      error => "red",
      debug => "red",
  );
  
  %COLOR = () unless -t STDOUT;
  
  sub _dumpav {
      return "(" . _dump(@_) . ")" if @_ == 1;
      return _dump(@_);
  }
  
  sub _dumpkv {
      return _dumpav(@_) if @_ % 2;
      my %h = @_;
      my $str = _dump(\%h);
      $str =~ s/^\{/(/ && $str =~ s/\}\z/)/;
      return $str;
  }
  
  sub new {
      my($class, $name, $proto, $input_args) = @_;
      my $self = bless {
          name => $name,
          proto => $proto,
      }, $class;
      my $proto_arg = $self->proto_arg;
      if ($proto_arg =~ /o/) {
          for (@$input_args) {
              push(@{$self->{input_av}}, _dump($_));
          }
      }
      else {
          $self->{input} = $proto_arg eq "%" ? _dumpkv(@$input_args) : _dumpav(@$input_args);
      }
      return $self;
  }
  
  sub proto_arg {
      my $self = shift;
      my($arg, $ret) = split(/\s*=\s*/, $self->{proto} || "");
      $arg ||= '@';
      return $arg;
  }
  
  sub proto_ret {
      my $self = shift;
      my($arg, $ret) = split(/\s*=\s*/, $self->{proto} || "");
      $ret ||= '@';
      return $ret;
  }
  
  sub color {
      my($self, $category, $text) = @_;
      return $text unless $COLOR{$category};
      return Term::ANSIColor::colored($text, $COLOR{$category});
  }
  
  sub print_call {
      my $self = shift;
      my $outarg = shift;
      print $self->color("name", "$self->{name}");
      if (my $input = $self->{input}) {
          $input = "" if $input eq "()" && $self->{name} =~ /->/;
          print $self->color("input", $input);
      }
      else {
          my $proto_arg = $self->proto_arg;
          print "(";
          my $i = 0;
          for (@{$self->{input_av}}) {
              print ", " if $i;
              my $proto = substr($proto_arg, 0, 1, "");
              if ($proto ne "o") {
                  print $self->color("input", $_);
              }
              if ($proto eq "o" || $proto eq "O") {
                  print " = " if $proto eq "O";
                  print $self->color("output", _dump($outarg->[$i]));
              }
          }
          continue {
              $i++;
          }
          print ")";
      }
  }
  
  sub return_void {
      my $self = shift;
      my $arg = shift;
      $self->print_call($arg);
      print "\n";
      return;
  }
  
  sub return_scalar {
      my $self = shift;
      my $arg = shift;
      $self->print_call($arg);
      my $s = shift;
      my $name;
      my $proto_ret = $self->proto_ret;
      my $wrap = $autowrap_class{ref($s)};
      if ($proto_ret =~ /^\$\w+\z/ && ref($s) && ref($s) !~ /^(?:ARRAY|HASH|CODE|GLOB)\z/) {
          $name = $proto_ret;
      }
      else {
          $name = $wrap->{prefix} if $wrap;
      }
      if ($name) {
          $name .= $name_count{$name} if $name_count{$name}++;
          print " = ", $self->color("output", $name), "\n";
          $s = Data::Dump::Trace::wrap(name => $name, obj => $s, proto => $wrap->{proto});
      }
      else {
          print " = ", $self->color("output", _dump($s));
          if (!$s && $proto_ret =~ /!/ && $!) {
              print " ", $self->color("error", errno($!));
          }
          print "\n";
      }
      return $s;
  }
  
  sub return_list {
      my $self = shift;
      my $arg = shift;
      $self->print_call($arg);
      print " = ", $self->color("output", $self->proto_ret eq "%" ? _dumpkv(@_) : _dumpav(@_)), "\n";
      return @_;
  }
  
  sub errno {
      my $t = "";
      for (keys %!) {
          if ($!{$_}) {
              $t = $_;
              last;
          }
      }
      my $n = int($!);
      return "$t($n) $!";
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Data::Dump::Trace - Helpers to trace function and method calls
  
  =head1 SYNOPSIS
  
    use Data::Dump::Trace qw(autowrap mcall);
  
    autowrap("LWP::UserAgent" => "ua", "HTTP::Response" => "res");
  
    use LWP::UserAgent;
    $ua = mcall(LWP::UserAgent => "new");      # instead of LWP::UserAgent->new;
    $ua->get("http://www.example.com")->dump;
  
  =head1 DESCRIPTION
  
  The following functions are provided:
  
  =over
  
  =item autowrap( $class )
  
  =item autowrap( $class => $prefix )
  
  =item autowrap( $class1 => $prefix1,  $class2 => $prefix2, ... )
  
  =item autowrap( $class1 => \%info1, $class2 => \%info2, ... )
  
  Register classes whose objects are automatically wrapped when
  returned by one of the call functions below.  If $prefix is provided
  it will be used as to name the objects.
  
  Alternative is to pass an %info hash for each class.  The recognized keys are:
  
  =over
  
  =item prefix => $string
  
  The prefix string used to name objects of this type.
  
  =item proto => \%hash
  
  A hash of prototypes to use for the methods when an object is wrapped.
  
  =back
  
  =item wrap( name => $str, func => \&func, proto => $proto )
  
  =item wrap( name => $str, obj => $obj, proto => \%hash )
  
  Returns a wrapped function or object.  When a wrapped function is
  invoked then a trace is printed after the underlying function has returned.
  When a method on a wrapped object is invoked then a trace is printed
  after the methods on the underlying objects has returned.
  
  See L</"Prototypes"> for description of the C<proto> argument.
  
  =item call( $name, \&func, $proto, @ARGS )
  
  Calls the given function with the given arguments.  The trace will use
  $name as the name of the function.
  
  See L</"Prototypes"> for description of the $proto argument.
  
  =item mcall( $class, $method, $proto, @ARGS )
  
  =item mcall( $object, $method, $proto, @ARGS )
  
  Calls the given method with the given arguments.
  
  See L</"Prototypes"> for description of the $proto argument.
  
  =item trace( $symbol, $prototype )
  
  Replaces the function given by $symbol with a wrapped function.
  
  =back
  
  =head2 Prototypes
  
  B<Note: The prototype string syntax described here is experimental and
  likely to change in revisions of this interface>.
  
  The $proto argument to call() and mcall() can optionally provide a
  prototype for the function call.  This give the tracer hints about how
  to best format the argument lists and if there are I<in/out> or I<out>
  arguments.  The general form for the prototype string is:
  
     <arguments> = <return_value>
  
  The default prototype is "@ = @"; list of values as input and list of
  values as output.
  
  The value '%' can be used for both arguments and return value to say
  that key/value pair style lists are used.
  
  Alternatively, individual positional arguments can be listed each
  represented by a letter:
  
  =over
  
  =item C<i>
  
  input argument
  
  =item C<o>
  
  output argument
  
  =item C<O>
  
  both input and output argument
  
  =back
  
  If the return value prototype has C<!> appended, then it signals that
  this function sets errno ($!) when it returns a false value.  The
  trace will display the current value of errno in that case.
  
  If the return value prototype looks like a variable name (with C<$>
  prefix), and the function returns a blessed object, then the variable
  name will be used as prefix and the returned object automatically
  traced.
  
  =head1 SEE ALSO
  
  L<Data::Dump>
  
  =head1 AUTHOR
  
  Copyright 2009 Gisle Aas.
  
  This library is free software; you can redistribute it and/or
  modify it under the same terms as Perl itself.
  
  =cut
DATA_DUMP_TRACE

    $main::fatpacked{"Data/Format/Pretty.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_FORMAT_PRETTY';
  package Data::Format::Pretty;
  
  use 5.010001;
  use strict;
  use warnings;
  
  use Module::Load;
  use Module::Loaded;
  
  require Exporter;
  our @ISA       = qw(Exporter);
  our @EXPORT    = qw(ppr);
  our @EXPORT_OK = qw(format_pretty print_pretty ppr);
  
  our $VERSION = '0.04'; # VERSION
  
  sub format_pretty {
      my ($data, $opts0) = @_;
  
      my %opts = $opts0 ? %$opts0 : ();
      my $module = $opts{module};
      if (!$module) {
          if ($ENV{GATEWAY_INTERFACE} || $ENV{PLACK_ENV}) {
              $module = 'HTML';
          } else {
              $module = 'Console';
          }
      }
      delete $opts{module};
  
      my $module_full = "Data::Format::Pretty::" . $module;
      load $module_full unless is_loaded $module_full;
      my $sub = \&{$module_full . "::format_pretty"};
  
      $sub->($data, \%opts);
  }
  
  sub print_pretty {
      print format_pretty(@_);
  }
  
  *ppr = \&print_pretty;
  
  1;
  # ABSTRACT: Pretty-print data structure
  
  
  =pod
  
  =head1 NAME
  
  Data::Format::Pretty - Pretty-print data structure
  
  =head1 VERSION
  
  version 0.04
  
  =head1 SYNOPSIS
  
  In your program:
  
   use Data::Format::Pretty qw(format_pretty print_pretty);
  
   # automatically choose an appropriate formatter
   print format_pretty($data);
  
   # explicitly select a formatter
   print format_pretty($data, {module=>'JSON'});
  
   # specify formatter option(s)
   print format_pretty($data, {module=>'Console', interactive=>1});
  
   # shortcut for printing to output
   print_pretty($data);
  
  
   # ppr() is alias for print_pretty(), exported automatically. suitable for when
   # debugging.
   use Data::Format::Pretty;
   ppr [1, 2, 3];
  
  =head1 DESCRIPTION
  
  Data::Format::Pretty is an extremely simple framework for pretty-printing data
  structure. Its focus is on "prettiness" and automatic detection of appropriate
  format to use.
  
  To develop a formatter, look at one of the formatter modules (like
  L<Data::Format::Pretty::JSON>) for example. You only need to specify one
  function, C<format_pretty>.
  
  =head1 FUNCTIONS
  
  =head2 format_pretty($data, \%opts) => STR
  
  Send $data to formatter module (one of Data::Format::Pretty::* modules) and
  return the result. Options:
  
  =over 4
  
  =item * module => STR
  
  Select the formatter module. It will be prefixed with "Data::Format::Pretty::".
  
  Currently if unspecified the default is 'Console', or 'HTML' if CGI/PSGI/plackup
  environment is detected. In the future, more sophisticated detection logic will
  be used.
  
  =back
  
  The rest of the options will be passed to the formatter module.
  
  =head2 print_pretty($data, \%opts)
  
  Just call format_pretty() and print() it.
  
  =head2 ppr($data, \%opts) [EXPORTED BY DEFAULT]
  
  Alias for print_pretty().
  
  =head1 SEE ALSO
  
  One of Data::Format::Pretty::* formatter, like L<Data::Format::Pretty::Console>,
  L<Data::Format::Pretty::HTML>, L<Data::Format::Pretty::JSON>,
  L<Data::Format::Pretty::YAML>.
  
  Alternative data formatting framework/module family: L<Any::Renderer>.
  
  =head1 AUTHOR
  
  Steven Haryanto <stevenharyanto@gmail.com>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2013 by Steven Haryanto.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
  
  
  __END__
  
DATA_FORMAT_PRETTY

    $main::fatpacked{"Data/Format/Pretty/CompactJSON.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_FORMAT_PRETTY_COMPACTJSON';
  package Data::Format::Pretty::CompactJSON;
  
  use 5.010;
  use strict;
  use warnings;
  
  require Exporter;
  our @ISA = qw(Exporter);
  our @EXPORT_OK = qw(format_pretty);
  
  our $VERSION = '0.12'; # VERSION
  
  sub content_type { "application/json" }
  
  sub format_pretty {
      my ($data, $opts) = @_;
      state $json;
  
      $opts //= {};
  
      if ($opts->{color} // $ENV{COLOR} // (-t STDOUT)) {
          require JSON::Color;
          JSON::Color::encode_json($data, {pretty=>0, linum=>0});
      } else {
          if (!$json) {
              require JSON::MaybeXS;
              $json = JSON::MaybeXS->new->utf8->allow_nonref;
          }
          $json->encode($data);
      }
  }
  
  1;
  # ABSTRACT: Pretty-print data structure as compact JSON
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Format::Pretty::CompactJSON - Pretty-print data structure as compact JSON
  
  =head1 VERSION
  
  This document describes version 0.12 of Data::Format::Pretty::CompactJSON (from Perl distribution Data-Format-Pretty-JSON), released on 2016-03-11.
  
  =head1 SYNOPSIS
  
   use Data::Format::Pretty::CompactJSON qw(format_pretty);
   print format_pretty($data);
  
  Some example output:
  
  =over 4
  
  =item * format_pretty({a=>1, b=>2});
  
   {"a":1,"b":2}
  
  =back
  
  =head1 DESCRIPTION
  
  Like L<Data::Format::Pretty::JSON>, but will always print with JSON option C<<
  pretty => 0 >> (minimal indentation).
  
  =head1 FUNCTIONS
  
  =head2 format_pretty($data, \%opts)
  
  Return formatted data structure as JSON. Options:
  
  =over 4
  
  =item * color => BOOL
  
  Whether to enable coloring. The default is the enable only when running
  interactively.
  
  =back
  
  =head2 content_type() => STR
  
  Return C<application/json>.
  
  =head1 ENVIRONMENT
  
  =head2 COLOR => BOOL
  
  Set C<color> option (if unset).
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Format-Pretty-JSON>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Format-Pretty-JSON>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Format-Pretty-JSON>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Data::Format::Pretty::JSON>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_FORMAT_PRETTY_COMPACTJSON

    $main::fatpacked{"Data/Format/Pretty/Console.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_FORMAT_PRETTY_CONSOLE';
  package Data::Format::Pretty::Console;
  
  our $DATE = '2017-07-10'; # DATE
  our $VERSION = '0.38'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  use experimental 'smartmatch';
  use Log::ger;
  
  use Scalar::Util qw(blessed);
  use Text::ANSITable;
  use YAML::Any;
  use JSON::MaybeXS;
  
  my $json = JSON::MaybeXS->new->allow_nonref;
  
  require Exporter;
  our @ISA = qw(Exporter);
  our @EXPORT_OK = qw(format_pretty);
  
  sub content_type { "text/plain" }
  
  sub format_pretty {
      my ($data, $opts) = @_;
      $opts //= {};
      __PACKAGE__->new($opts)->_format($data);
  }
  
  # OO interface is nto documented, we use it just to subclass
  # Data::Format::Pretty::HTML
  sub new {
      my ($class, $opts) = @_;
      $opts //= {};
      $opts->{interactive} //= $ENV{INTERACTIVE} // (-t STDOUT);
      $opts->{table_column_orders} //= $json->decode(
          $ENV{FORMAT_PRETTY_TABLE_COLUMN_ORDERS})
          if defined($ENV{FORMAT_PRETTY_TABLE_COLUMN_ORDERS});
      $opts->{table_column_formats} //= $json->decode(
          $ENV{FORMAT_PRETTY_TABLE_COLUMN_FORMATS})
          if defined($ENV{FORMAT_PRETTY_TABLE_COLUMN_FORMATS});
      $opts->{table_column_types} //= $json->decode(
          $ENV{FORMAT_PRETTY_TABLE_COLUMN_TYPES})
          if defined($ENV{FORMAT_PRETTY_TABLE_COLUMN_TYPES});
      $opts->{list_max_columns} //= $ENV{FORMAT_PRETTY_LIST_MAX_COLUMNS};
      bless {opts=>$opts}, $class;
  }
  
  sub _is_cell_or_format_cell {
      my ($self, $data, $is_format) = @_;
  
      # XXX currently hardcoded limits
      my $maxlen = 1000;
  
      if (!ref($data) || blessed($data)) {
          if (!defined($data)) {
              return "" if $is_format;
              return 1;
          }
          if (length($data) > $maxlen) {
              return;
          }
          return "$data" if $is_format;
          return 1;
      } elsif (ref($data) eq 'ARRAY') {
          if (grep {ref($_) && !blessed($_)} @$data) {
              return;
          }
          my $s = join(", ", map {defined($_) ? "$_":""} @$data);
          if (length($s) > $maxlen) {
              return;
          }
          return $s if $is_format;
          return 1;
      } else {
          return;
      }
  }
  
  # return a string when data can be represented as a cell, otherwise undef. what
  # can be put in a table cell? a string (or stringified object) or array of
  # strings (stringified objects) that is quite "short".
  sub _format_cell { _is_cell_or_format_cell(@_, 1) }
  
  sub _is_cell     { _is_cell_or_format_cell(@_, 0) }
  
  sub _detect_struct {
      my ($self, $data) = @_;
      my $struct;
      my $struct_meta = {};
  
      # XXX perhaps, use Data::Schema later?
    CHECK_FORMAT:
      {
        CHECK_SCALAR:
          {
              if (!ref($data) || blessed($data)) {
                  $struct = "scalar";
                  last CHECK_FORMAT;
              }
          }
  
        CHECK_AOA:
          {
              if (ref($data) eq 'ARRAY') {
                  my $numcols;
                  for my $row (@$data) {
                      last CHECK_AOA unless ref($row) eq 'ARRAY';
                      last CHECK_AOA if defined($numcols) && $numcols != @$row;
                      last CHECK_AOA if grep { !$self->_is_cell($_) } @$row;
                      $numcols = @$row;
                  }
                  $struct = "aoa";
                  last CHECK_FORMAT;
              }
          }
  
        CHECK_AOH:
          {
              if (ref($data) eq 'ARRAY') {
                  $struct_meta->{columns} = {};
                  for my $row (@$data) {
                      last CHECK_AOH unless ref($row) eq 'HASH';
                      for my $k (keys %$row) {
                          last CHECK_AOH if !$self->_is_cell($row->{$k});
                          $struct_meta->{columns}{$k} = 1;
                      }
                  }
                  $struct = "aoh";
                  last CHECK_FORMAT;
              }
          }
  
          # list of scalars/cells
        CHECK_LIST:
          {
              if (ref($data) eq 'ARRAY') {
                  for (@$data) {
                      last CHECK_LIST unless $self->_is_cell($_);
                  }
                  $struct = "list";
                  last CHECK_FORMAT;
              }
          }
  
          # hash which contains at least one "table" (list/aoa/aoh)
        CHECK_HOT:
          {
              last CHECK_HOT if $self->{opts}{skip_hot};
              last CHECK_HOT unless ref($data) eq 'HASH';
              my $has_t;
              while (my ($k, $v) = each %$data) {
                  my ($s2, $sm2) = $self->_detect_struct($v, {skip_hot=>1});
                  last CHECK_HOT unless $s2;
                  $has_t = 1 if $s2 =~ /^(?:list|aoa|aoh|hash)$/;
              }
              last CHECK_HOT unless $has_t;
              $struct = "hot";
              last CHECK_FORMAT;
          }
  
          # hash of scalars/cells
        CHECK_HASH:
          {
              if (ref($data) eq 'HASH') {
                  for (values %$data) {
                      last CHECK_HASH unless $self->_is_cell($_);
                  }
                  $struct = "hash";
                  last CHECK_FORMAT;
              }
          }
  
      }
  
      ($struct, $struct_meta);
  }
  
  # t (table) is a structure like this: {cols=>["colName1", "colName2", ...]},
  # rows=>[ [row1.1, row1.2, ...], [row2.1, row2.2, ...], ... ], at_opts=>{...},
  # col_widths=>{colName1=>5, ...}}. the job of this routine is to render it
  # (currently uses Text::ANSITable).
  sub _render_table {
      my ($self, $t) = @_;
  
      my $colfmts;
      my $tcff = $self->{opts}{table_column_formats};
      if ($tcff) {
          for my $tcf (@$tcff) {
              my $match = 1;
              my @tcols = @{ $t->{cols} };
              for my $scol (keys %$tcf) {
                  do { $match = 0; last } unless $scol ~~ @tcols;
              }
              if ($match) {
                  $colfmts = $tcf;
                  last;
              }
          }
      }
  
      my $coltypes;
      my $tctt = $self->{opts}{table_column_types};
      if ($tctt) {
          for my $tct (@$tctt) {
              my $match = 1;
              my @tcols = @{ $t->{cols} };
              for my $scol (keys %$tct) {
                  do { $match = 0; last } unless $scol ~~ @tcols;
              }
              if ($match) {
                  $coltypes = $tct;
                  last;
              }
          }
      }
  
      # render using Text::ANSITable
      my $at = Text::ANSITable->new;
      $at->columns($t->{cols});
      $at->rows($t->{rows});
      if ($t->{at_opts}) {
          $at->{$_} = $t->{at_opts}{$_} for keys %{ $t->{at_opts} };
      }
      if ($colfmts) {
          $at->set_column_style($_ => formats => $colfmts->{$_})
              for keys %$colfmts;
      }
      if ($coltypes) {
          $at->set_column_style($_ => type => $coltypes->{$_})
              for keys %$coltypes;
      }
      if ($t->{col_widths}) {
          $at->set_column_style($_ => width => $t->{col_widths}{$_})
              for keys %{ $t->{col_widths} };
      }
      $at->draw;
  }
  
  # format unknown structure, the default is to dump YAML structure
  sub _format_unknown {
      my ($self, $data) = @_;
      Dump($data);
  }
  
  sub _format_scalar {
      my ($self, $data) = @_;
  
      my $sdata = defined($data) ? "$data" : "";
      return "" if !length($sdata);
      return $sdata =~ /\n\z/s ? $sdata : "$sdata\n";
  }
  
  sub _format_list {
      my ($self, $data) = @_;
      if ($self->{opts}{interactive}) {
  
          require List::Util;
          require POSIX;
  
          # format list as as columns (a la 'ls' output)
  
          my @rows = map { $self->_format_cell($_) } @$data;
  
          my $maxwidth = List::Util::max(map { length } @rows) // 0;
          my ($termcols, $termrows);
          if ($ENV{COLUMNS}) {
              $termcols = $ENV{COLUMNS};
          } elsif (eval { require Term::Size; 1 }) {
              ($termcols, $termrows) = Term::Size::chars();
          } else {
              # sane default, on windows we need to offset by 1 because printing
              # at the rightmost column will cause cursor to move down one line.
              $termcols = $^O =~ /Win/ ? 79 : 80;
          }
          my $numcols = 1;
          if ($maxwidth) {
              # | some-text-some | some-text-some... |
              # 2/\__maxwidth__/\3/\__maxwidth__/...\2
              #
              # table width = (2+maxwidth) + (3+maxwidth)*(numcols-1) + 2
              #
              # so with a bit of algrebra, solve for numcols:
              $numcols = int( (($termcols-1)-$maxwidth-6)/(3+$maxwidth) + 1 );
              $numcols = @rows if $numcols > @rows;
              $numcols = 1 if $numcols < 1;
          }
          $numcols = $self->{opts}{list_max_columns}
              if defined($self->{opts}{list_max_columns}) &&
                  $numcols > $self->{opts}{list_max_columns};
          my $numrows = POSIX::ceil(@rows/$numcols);
          if ($numrows) {
              # reduce number of columns to avoid empty columns
              $numcols = POSIX::ceil(@rows/$numrows);
          }
          #say "D: $numcols x $numrows";
  
          my $t = {rows=>[], at_opts=>{show_header=>0}};
          $t->{cols} = [map { "c$_" } 1..$numcols];
          if ($numcols > 1) {
              $t->{col_widths}{"c$_"} = $maxwidth for 1..$numcols;
          }
          for my $r (1..$numrows) {
              my @trow;
              for my $c (1..$numcols) {
                  my $idx = ($c-1)*$numrows + ($r-1);
                  push @trow, $idx < @rows ? $rows[$idx] : '';
              }
              push @{$t->{rows}}, \@trow;
          }
  
          return $self->_render_table($t);
  
      } else {
          my @rows;
          for my $row (@$data) {
              push @rows, ($row // "") . "\n";
          }
          return join("", @rows);
      }
  }
  
  sub _format_hash {
      my ($self, $data) = @_;
      # format hash as two-column table
      if ($self->{opts}{interactive}) {
          my $t = {cols=>[qw/key value/], rows=>[],
                   at_opts=>{}};
          for my $k (sort keys %$data) {
              push @{ $t->{rows} }, [$k, $self->_format_cell($data->{$k})];
          }
          return $self->_render_table($t);
      } else {
          my @t;
          for my $k (sort keys %$data) {
              push @t, $k, "\t", ($data->{$k} // ""), "\n";
          }
          return join("", @t);
      }
  }
  
  sub _format_aoa {
      my ($self, $data) = @_;
      # show aoa as table
      if ($self->{opts}{interactive}) {
          if (@$data) {
              my $t = {rows=>[], at_opts=>{}};
              $t->{cols} = [map { "column$_" } 0..@{ $data->[0] }-1];
              for my $i (0..@$data-1) {
                  push @{ $t->{rows} },
                      [map {$self->_format_cell($_)} @{ $data->[$i] }];
              }
              return $self->_render_table($t);
          } else {
              return "";
          }
      } else {
          # tab-separated
          my @t;
          for my $row (@$data) {
              push @t, join("\t", map { $self->_format_cell($_) } @$row) .
                  "\n";
          }
          return join("", @t);
      }
  }
  
  sub _format_aoh {
      my ($self, $data, $struct_meta) = @_;
      # show aoh as table
      my @cols = @{ $self->_order_table_columns(
          [keys %{$struct_meta->{columns}}]) };
      if ($self->{opts}{interactive}) {
          my $t = {cols=>\@cols, rows=>[]};
          for my $i (0..@$data-1) {
              my $row = $data->[$i];
              push @{ $t->{rows} }, [map {$self->_format_cell($row->{$_})} @cols];
          }
          return $self->_render_table($t);
      } else {
          # tab-separated
          my @t;
          for my $row (@$data) {
              my @row = map {$self->_format_cell($row->{$_})} @cols;
              push @t, join("\t", @row) . "\n";
          }
          return join("", @t);
      }
  }
  
  sub _format_hot {
      my ($self, $data) = @_;
      # show hot as paragraphs:
      #
      # key:
      # value (table)
      #
      # key2:
      # value ...
      my @t;
      for my $k (sort keys %$data) {
          push @t, "$k:\n", $self->_format($data->{$k}), "\n";
      }
      return join("", @t);
  }
  
  sub _format {
      my ($self, $data) = @_;
  
      my ($struct, $struct_meta) = $self->_detect_struct($data);
  
      if (!$struct) {
          return $self->_format_unknown($data, $struct_meta);
      } elsif ($struct eq 'scalar') {
          return $self->_format_scalar($data, $struct_meta);
      } elsif ($struct eq 'list') {
          return $self->_format_list($data, $struct_meta);
      } elsif ($struct eq 'hash') {
          return $self->_format_hash($data, $struct_meta);
      } elsif ($struct eq 'aoa') {
          return $self->_format_aoa($data, $struct_meta);
      } elsif ($struct eq 'aoh') {
          return $self->_format_aoh($data, $struct_meta);
      } elsif ($struct eq 'hot') {
          return $self->_format_hot($data, $struct_meta);
      } else {
          die "BUG: Unknown format `$struct`";
      }
  }
  
  sub _order_table_columns {
      #$log->tracef('=> _order_table_columns(%s)', \@_);
      my ($self, $cols) = @_;
  
      my $found; # whether we found an ordering in table_column_orders
      my $tco = $self->{opts}{table_column_orders};
      my %orders; # colname => idx
      if ($tco) {
          die "table_column_orders should be an arrayref"
              unless ref($tco) eq 'ARRAY';
        CO:
          for my $co (@$tco) {
              die "table_column_orders elements must all be arrayrefs"
                  unless ref($co) eq 'ARRAY';
              for (@$co) {
                  next CO unless $_ ~~ @$cols;
              }
  
              $found++;
              for (my $i=0; $i<@$co; $i++) {
                  $orders{$co->[$i]} = $i;
              }
              $found++;
              last CO;
          }
      }
  
      my @ocols;
      if ($found) {
          @ocols = sort {
              (defined($orders{$a}) && defined($orders{$b}) ?
                   $orders{$a} <=> $orders{$b} : 0)
                  || $a cmp $b
          } (sort @$cols);
      } else {
          @ocols = sort @$cols;
      }
  
      \@ocols;
  }
  
  1;
  # ABSTRACT: Pretty-print data structure for console output
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Format::Pretty::Console - Pretty-print data structure for console output
  
  =head1 VERSION
  
  This document describes version 0.38 of Data::Format::Pretty::Console (from Perl distribution Data-Format-Pretty-Console), released on 2017-07-10.
  
  =head1 SYNOPSIS
  
  In your program:
  
   use Data::Format::Pretty::Console qw(format_pretty);
   ...
   print format_pretty($result);
  
  Some example output:
  
  Scalar, format_pretty("foo"):
  
   foo
  
  List, format_pretty([1..21]):
  
   .------------------------------------------------------.
   |  1 |  3 |  5 |  7 |  9 | 11 | 13 | 15 | 17 | 19 | 21 |
   |  2 |  4 |  6 |  8 | 10 | 12 | 14 | 16 | 18 | 20 |    |
   '----+----+----+----+----+----+----+----+----+----+----'
  
  The same list, when program output is being piped (that is, (-t STDOUT) is
  false):
  
   1
   2
   3
   4
   5
   6
   7
   8
   9
   10
   11
   12
   14
   15
   16
   17
   18
   19
   20
   21
  
  Hash, format_pretty({foo=>"data",bar=>"format",baz=>"pretty",qux=>"console"}):
  
   +-----+---------+
   | bar | format  |
   | baz | pretty  |
   | foo | data    |
   | qux | console |
   '-----+---------'
  
  2-dimensional array, format_pretty([ [1, 2, ""], [28, "bar", 3], ["foo", 3,
  undef] ]):
  
   +---------+---------+---------+
   |       1 |       2 |         |
   |      28 | bar     |       3 |
   | foo     |       3 |         |
   '---------+---------+---------'
  
  An array of hashrefs, such as commonly found if you use DBI's fetchrow_hashref()
  and friends, format_pretty([ {a=>1, b=>2}, {b=>2, c=>3}, {c=>4} ]):
  
   .-----------.
   | a | b | c |
   +---+---+---+
   | 1 | 2 |   |
   |   | 2 | 3 |
   |   |   | 4 |
   '---+---+---'
  
  Some more complex data, format_pretty({summary => "Blah...", users =>
  [{name=>"budi", domains=>["foo.com", "bar.com"], quota=>"1000"}, {name=>"arif",
  domains=>["baz.com"], quota=>"2000"}], verified => 0}):
  
   summary:
   Blah...
  
   users:
   .---------------------------------.
   | domains          | name | quota |
   +------------------+------+-------+
   | foo.com, bar.com | budi |  1000 |
   | baz.com          | arif |  2000 |
   '------------------+------+-------'
  
   verified:
   0
  
  Structures which can't be handled yet will simply be output as YAML,
  format_pretty({a {b=>1}}):
  
   ---
   a:
     b: 1
  
  =head1 DESCRIPTION
  
  This module is meant to output data structure in a "pretty" or "nice" format,
  suitable for console programs. The idea of this module is that for you to just
  merrily dump data structure to the console, and this module will figure out how
  to best display your data to the end-user.
  
  Currently this module tries to display the data mostly as a nice text table (or
  a series of text tables), and failing that, display it as YAML.
  
  This module takes piping into consideration, and will output a simpler, more
  suitable format when your user pipes your program's output into some other
  program.
  
  Most of the time, you don't have to configure anything, but some options are
  provided to tweak the output.
  
  =for Pod::Coverage ^(content_type)$
  
  =head1 FUNCTIONS
  
  =for Pod::Coverage new
  
  =head2 format_pretty($data, \%opts)
  
  Return formatted data structure. Options:
  
  =over
  
  =item * interactive => BOOL (optional, default undef)
  
  If set, will override interactive terminal detection (-t STDOUT). Simpler
  formatting will be done if terminal is non-interactive (e.g. when output is
  piped). Using this option will force simpler/full formatting.
  
  =item * list_max_columns => INT
  
  When displaying list as columns, specify maximum number of columns. This can be
  used to force fewer columns (for example, single column) instead of using the
  whole available terminal width.
  
  =item * table_column_orders => [[COLNAME1, COLNAME2], ...]
  
  Specify column orders when drawing a table. If a table has all the columns, then
  the column names will be ordered according to the specification. For example,
  when table_column_orders is [[qw/foo bar baz/]], this table's columns will not
  be reordered because it doesn't have all the mentioned columns:
  
   |foo|quux|
  
  But this table will:
  
   |apple|bar|baz|foo|quux|
  
  into:
  
   |apple|foo|bar|baz|quux|
  
  =item * table_column_formats => [{COLNAME=>FMT, ...}, ...]
  
  Specify formats for columns. Each table format specification is a hashref
  {COLNAME=>FMT, COLNAME2=>FMT2, ...}. It will be applied to a table if the table
  has all the columns. FMT is a format specification according to
  L<Data::Unixish::Apply>, it's basically either a name of a dux function (e.g.
  C<"date">) or an array of function name + arguments (e.g. C<< [['date', [align
  => {align=>'middle'}]] >>). This will be fed to L<Text::ANSITable>'s C<formats>
  column style.
  
  =item * table_column_types => [{COLNAME=>TYPE, ...}, ...]
  
  Specify types for columns. Each table format specification is a hashref
  {COLNAME=>TYPE, COLNAME2=>TYPE2, ...}. It will be applied to a table if the
  table has all the columns. TYPE is type name according to L<Sah> schema. This
  will be fed to L<Text::ANSITable>'s C<type> column style to give hints on how to
  format the column. Sometimes this is the simpler alternative to
  C<table_column_formats>.
  
  =back
  
  =head1 ENVIRONMENT
  
  =over
  
  =item * INTERACTIVE => BOOL
  
  To set default for C<interactive> option (overrides automatic detection).
  
  =item * FORMAT_PRETTY_LIST_MAX_COLUMNS => INT
  
  To set C<list_max_columns> option.
  
  =item * FORMAT_PRETTY_TABLE_COLUMN_FORMATS => ARRAY (JSON)
  
  To set C<table_column_formats> option, interpreted as JSON.
  
  =item * FORMAT_PRETTY_TABLE_COLUMN_TYPES => ARRAY (JSON)
  
  To set C<table_column_types> option, interpreted as JSON.
  
  =item * FORMAT_PRETTY_TABLE_COLUMN_ORDERS => ARRAY (JSON)
  
  To set C<table_column_orders> option, interpreted as JSON.
  
  =item * COLUMNS => INT
  
  To override terminal width detection.
  
  =back
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Format-Pretty-Console>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Format-Pretty-Console>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Format-Pretty-Console>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  Modules used for formatting: L<Text::ANSITable>, L<YAML>.
  
  L<Data::Format::Pretty>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2017, 2016, 2015, 2014, 2013, 2012, 2011, 2010 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_FORMAT_PRETTY_CONSOLE

    $main::fatpacked{"Data/Format/Pretty/HTML.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_FORMAT_PRETTY_HTML';
  package Data::Format::Pretty::HTML;
  
  use 5.010001;
  use strict;
  use warnings;
  use Log::ger;
  
  use Data::Format::Pretty::Console 0.24;
  use HTML::Entities;
  use Scalar::Util qw(looks_like_number);
  use URI::Find::Schemeless;
  use YAML::Any;
  
  require Exporter;
  our @ISA = qw(Exporter Data::Format::Pretty::Console);
  our @EXPORT_OK = qw(format_pretty);
  
  our $VERSION = '0.11'; # VERSION
  
  sub content_type { "text/html" }
  
  sub format_pretty {
      my ($data, $opts) = @_;
      $opts //= {};
      __PACKAGE__->new($opts)->_format($data);
  }
  
  # OO interface is hidden
  sub new {
      my ($class, $opts) = @_;
      my $obj = $class->SUPER::new($opts);
      #my $obj = Data::Format::Pretty::Console->new($opts);
      $obj->{opts}{linkify_urls_in_text} //= 1;
      $obj->{opts}{interactive} = 1;
      $obj->{opts}{list_max_columns} = 1;
      #bless $class, $obj;
      $obj;
  }
  
  sub _htmlify {
      my ($self, $text) = @_;
  
      $text = encode_entities($text);
      if ($self->{opts}{linkify_urls_in_text}) {
          URI::Find::Schemeless->new(
              sub {
                  #my $uri = encode_entities $_[0];
                  #my $uri = $_[0];
                  my $uri = decode_entities $_[0];
                  return qq|<a href="$uri">$uri</a>|;
              })->find(\$text);
      }
      if ($text =~ /\R/) {
          return "<pre>$text</pre>";
      } else {
          return $text;
      }
  }
  
  sub _render_table {
      my ($self, $t) = @_;
      my @t = ("<table>\n");
  
      my $sh = $t->{at_opts}{show_header};
      unless (defined($sh) && !$sh) {
          push @t, "  <thead>\n";
          push @t, "    <tr>";
          for my $c (@{$t->{cols}}) {
              push @t, (
                  "<th", (looks_like_number($c) ? ' class="number"':''), ">",
                  $self->_htmlify($c),
                  "</th>",
              );
          }
          push @t, "</tr>\n";
          push @t, "  </thead>\n";
      }
  
      push @t, "  <tbody>\n";
      for my $r (@{$t->{rows}}) {
          push @t, "    <tr>";
          my $cidx = 0;
          for my $c (@$r) {
              if ($t->{html_cols} && $t->{html_cols}[$cidx]) {
                  push @t, "<td>", $c, "</td>";
              } else {
                  push @t, (
                      "<td", (looks_like_number($c) ? ' class="number"':''), ">",
                      $self->_htmlify($c),
                      "</td>",
                  );
              }
              $cidx++;
          }
          push @t, "</tr>\n";
      }
      push @t, "  </tbody>\n";
      push @t, "</table>\n";
      join "", @t;
  }
  
  # format unknown structure, the default is to dump YAML structure
  sub _format_unknown {
      my ($self, $data) = @_;
      $self->_htmlify(Dump $data);
  }
  
  sub _format_scalar {
      my ($self, $data) = @_;
  
      my $sdata = defined($data) ? "$data" : "";
      $self->_htmlify($sdata);
  }
  
  sub _format_hot {
      my ($self, $data) = @_;
      my @t;
      # format as 2-column table of key/value
      my $t = {cols=>[qw/key value/], html_cols=>[0, 1], rows=>[]};
      for my $k (sort keys %$data) {
          push @{ $t->{rows} }, [$k, $self->_format($data->{$k})];
      }
      $self->_render_table($t);
  }
  
  1;
  # ABSTRACT: Pretty-print data structure for HTML output
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Format::Pretty::HTML - Pretty-print data structure for HTML output
  
  =head1 VERSION
  
  This document describes version 0.11 of Data::Format::Pretty::HTML (from Perl distribution Data-Format-Pretty-HTML), released on 2017-07-10.
  
  =head1 SYNOPSIS
  
  In your program:
  
   use Data::Format::Pretty::HTML qw(format_pretty);
   ...
   print format_pretty($result);
  
  Some example output:
  
  Scalar, format_pretty("foo & bar"):
  
   foo &amp; bar
  
  Scalar multiline, format_pretty("foo\nbar\nbaz"):
  
   <pre>foo
   bar
   baz</pre>
  
  List, format_pretty([qw/foo bar baz qux/]):
  
   <table>
     <tr><td>foo</td></tr>
     <tr><td>bar</td></tr>
     <tr><td>baz</td></tr>
     <tr><td>qux</td></tr>
   </table>
  
  Hash, format_pretty({foo=>"data",bar=>"format",baz=>"pretty",qux=>"html"}):
  
   <table>
     <tr><th>key</th><th>value</th></tr>
     <tr><td>bar</td><td>format</td></tr>
     <tr><td>baz</td><td>pretty</td></tr>
     <tr><td>foo</td><td>data</td></tr>
     <tr><td>qux</td><td>html</td></tr>
   </table>
  
  2-dimensional array, format_pretty([ [1, 2, ""], [28, "bar", 3], ["foo", 3,
  undef] ]):
  
   <table>
     <tr><th>column0</th><th>column1</th><th>column2</th></tr>
     <tr><td class="number">1</td><td class="number">2</td><td></td></tr>
     <tr><td class="number">28</td><td>bar</td><td class="number">3</td></tr>
     <tr><td>foo</td><td class="number">3</td><td></td></tr>
   </table>
  
  An array of hashrefs, such as commonly found if you use DBI's fetchrow_hashref()
  and friends, format_pretty([ {a=>1, b=>2}, {b=>2, c=>3}, {c=>4} ]):
  
   <table>
     <tr><th>a</th><th>b</th><th>c</th></tr>
     <tr><td class="number">1</td><td class="number">2</td><td></td></tr>
     <tr><td></td><td class="number">2</td><td class="number">3</td></tr>
     <tr><td></td><td></td><td class="number">4</td></tr>
   </table>
  
  Some more complex data, format_pretty({summary => "Blah...", users =>
  [{name=>"budi", domains=>["f.com", "b.com"], quota=>"1000"}, {name=>"arif",
  domains=>["baz.com"], quota=>"2000"}], verified => 0}):
  
   <table>
  
     <tr>
       <td>summary</td>
       <td>Blah...</td>
     </tr>
  
     <tr>
       <td>users</td>
       <td>
         <table>
           <tr><th>domains</th><th>name</th><th>quota</th></tr>
           <tr><td>f.com, b.com</td><td>budi</td><td class="number">1000</td></tr>
           <tr><td>baz.com</td><td>arif</td><td class="number">2000</td></tr>
       </td>
     </tr>
  
     <tr>
       <td>verified</td>
       <td class="number">0</td>
     </tr>
  
   </table>
  
  Structures which can't be handled yet will simply be output as YAML,
  format_pretty({a => {b=>1}}):
  
   <pre>a:
     b: 1
   </pre>
  
  =head1 DESCRIPTION
  
  This module has the same spirit as L<Data::Format::Pretty::Console> (and
  currently implemented as its subclass). The idea is to throw it some data
  structure and let it figure out how to best display the data in a pretty HTML
  format.
  
  Differences with Data::Format::Pretty::Console:
  
  =over 4
  
  =item * hot (hash of table) structure is rendered as table of inner tables
  
  =back
  
  =for Pod::Coverage new
  
  =head1 FUNCTIONS
  
  =head2 format_pretty($data, \%opts)
  
  Return formatted data structure as HTML. Options:
  
  =over 4
  
  =item * table_column_orders => [[colname, colname], ...]
  
  See Data::Format::Pretty::Console for more details.
  
  =item * linkify_urls_in_text => BOOL
  
  Whether to convert 'http://foo' in text into '<a
  href="http://foo">http://foo</a>'. Default is true.
  
  =back
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Format-Pretty-HTML>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Format-Pretty-HTML>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Format-Pretty-HTML>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Data::Format::Pretty>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2017, 2015, 2014, 2013, 2012, 2011 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_FORMAT_PRETTY_HTML

    $main::fatpacked{"Data/Format/Pretty/JSON.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_FORMAT_PRETTY_JSON';
  package Data::Format::Pretty::JSON;
  
  our $DATE = '2016-03-11'; # DATE
  our $VERSION = '0.12'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  require Exporter;
  our @ISA = qw(Exporter);
  our @EXPORT_OK = qw(format_pretty);
  
  sub content_type { "application/json" }
  
  sub format_pretty {
      my ($data, $opts) = @_;
      $opts //= {};
  
      state $json;
      my $interactive = (-t STDOUT);
      my $pretty = $opts->{pretty} // 1;
      my $color  = $opts->{color} // $ENV{COLOR} // $interactive //
          $opts->{pretty};
      my $linum  = $opts->{linum} // $ENV{LINUM} // 0;
      if ($color) {
          require JSON::Color;
          JSON::Color::encode_json($data, {pretty=>$pretty, linum=>$linum})."\n";
      } else {
          if (!$json) {
              require JSON::MaybeXS;
              $json = JSON::MaybeXS->new->utf8->allow_nonref;
          }
          $json->pretty($pretty);
          if ($linum) {
              require String::LineNumber;
              String::LineNumber::linenum($json->encode($data));
          } else {
              $json->encode($data);
          }
      }
  }
  
  1;
  # ABSTRACT: Pretty-print data structure as JSON
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Format::Pretty::JSON - Pretty-print data structure as JSON
  
  =head1 VERSION
  
  This document describes version 0.12 of Data::Format::Pretty::JSON (from Perl distribution Data-Format-Pretty-JSON), released on 2016-03-11.
  
  =head1 SYNOPSIS
  
   use Data::Format::Pretty::JSON qw(format_pretty);
   print format_pretty($data);
  
  =head1 DESCRIPTION
  
  This module uses L<JSON::MaybeXS> or L<JSON::Color> to encode data as JSON.
  
  =for Pod::Coverage ^(new)$
  
  =head1 FUNCTIONS
  
  =head2 format_pretty($data, \%opts)
  
  Return formatted data structure as JSON. Options:
  
  =over 4
  
  =item * color => BOOL (default: from env or 1 on interactive)
  
  Whether to enable coloring. The default is the enable only when running
  interactively.
  
  =item * pretty => BOOL (default: 1)
  
  Whether to pretty-print JSON.
  
  =item * linum => BOOL (default: from env or 0)
  
  Whether to add line numbers.
  
  =back
  
  =head2 content_type() => STR
  
  Return C<application/json>.
  
  =head1 FAQ
  
  =head1 ENVIRONMENT
  
  =head2 COLOR => BOOL
  
  Set C<color> option (if unset).
  
  =head2 LINUM => BOOL
  
  Set C<linum> option (if unset).
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Format-Pretty-JSON>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Format-Pretty-JSON>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Format-Pretty-JSON>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Data::Format::Pretty>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_FORMAT_PRETTY_JSON

    $main::fatpacked{"Data/Format/Pretty/SimpleText.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_FORMAT_PRETTY_SIMPLETEXT';
  package Data::Format::Pretty::SimpleText;
  
  use 5.010;
  use strict;
  use warnings;
  
  use Data::Format::Pretty::Console ();
  
  require Exporter;
  our @ISA = qw(Exporter);
  our @EXPORT_OK = qw(format_pretty);
  
  our $VERSION = '0.38'; # VERSION
  
  sub content_type { "text/plain" }
  
  sub format_pretty {
      my ($data, $opts) = @_;
      my %opts = $opts ? %$opts : ();
      $opts{interactive} = 0;
      Data::Format::Pretty::Console::format_pretty($data, \%opts);
  }
  
  1;
  # ABSTRACT: Pretty-print data structure as simple text
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Format::Pretty::SimpleText - Pretty-print data structure as simple text
  
  =head1 VERSION
  
  This document describes version 0.38 of Data::Format::Pretty::SimpleText (from Perl distribution Data-Format-Pretty-Console), released on 2017-07-10.
  
  =head1 SYNOPSIS
  
  In your program:
  
   use Data::Format::Pretty::SimpleText qw(format_pretty);
   print format_pretty($data);
  
  Some example output:
  
  =over 4
  
  =item * format_pretty([qw/foo bar baz qux/])
  
   foo
   bar
   baz
   qux
  
  =back
  
  =head1 DESCRIPTION
  
  This module just calls L<Data::Format::Pretty::Console::format_pretty> with
  C<interactive>=0 option.
  
  =for Pod::Coverage ^(content_type)$
  
  =head1 FUNCTIONS
  
  =head2 format_pretty($data, \%opts)
  
  Return formatted data structure. See L<Data::Format::Pretty::Console> for
  details.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Format-Pretty-Console>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Format-Pretty-Console>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Format-Pretty-Console>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Data::Format::Pretty::Console>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2017, 2016, 2015, 2014, 2013, 2012, 2011, 2010 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_FORMAT_PRETTY_SIMPLETEXT

    $main::fatpacked{"Data/Format/Pretty/Text.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_FORMAT_PRETTY_TEXT';
  package Data::Format::Pretty::Text;
  
  use 5.010;
  use strict;
  use warnings;
  
  use Data::Format::Pretty::Console ();
  
  require Exporter;
  our @ISA = qw(Exporter);
  our @EXPORT_OK = qw(format_pretty);
  
  our $VERSION = '0.38'; # VERSION
  
  sub content_type { "text/plain" }
  
  sub format_pretty {
      my ($data, $opts) = @_;
      my %opts = $opts ? %$opts : ();
      $opts{interactive} = 1;
      Data::Format::Pretty::Console::format_pretty($data, \%opts);
  }
  
  1;
  # ABSTRACT: Pretty-print data structure as text
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Format::Pretty::Text - Pretty-print data structure as text
  
  =head1 VERSION
  
  This document describes version 0.38 of Data::Format::Pretty::Text (from Perl distribution Data-Format-Pretty-Console), released on 2017-07-10.
  
  =head1 SYNOPSIS
  
  In your program:
  
   use Data::Format::Pretty::Text qw(format_pretty);
   print format_pretty($data);
  
  Some example output:
  
  =over 4
  
  =item * format_pretty([qw/foo bar baz qux/])
  
   +------+
   | foo  |
   | bar  |
   | baz  |
   | qux  |
   '------'
  
  =back
  
  =head1 DESCRIPTION
  
  This module just calls L<Data::Format::Pretty::Console::format_pretty> with
  C<interactive>=1 option.
  
  =for Pod::Coverage ^(content_type)$
  
  =head1 FUNCTIONS
  
  =head2 format_pretty($data, \%opts)
  
  Return formatted data structure. See L<Data::Format::Pretty::Console> for
  details.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Format-Pretty-Console>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Format-Pretty-Console>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Format-Pretty-Console>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Data::Format::Pretty::Console>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2017, 2016, 2015, 2014, 2013, 2012, 2011, 2010 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_FORMAT_PRETTY_TEXT

    $main::fatpacked{"Data/ModeMerge.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_MODEMERGE';
  package Data::ModeMerge;
  
  our $DATE = '2016-07-22'; # DATE
  our $VERSION = '0.35'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  use Mo qw(build default);
  
  require Exporter;
  our @ISA = qw(Exporter);
  our @EXPORT = qw(mode_merge);
  
  sub mode_merge {
      my ($l, $r, $config_vars) = @_;
      my $mm = __PACKAGE__->new(config => $config_vars);
      $mm->merge($l, $r);
  }
  
  has config => (is => "rw");
  
  # hash of modename => handler
  has modes => (is => 'rw', default => sub { {} });
  
  has combine_rules => (is => 'rw');
  
  # merging process state
  has path => (is => "rw", default => sub { [] });
  has errors => (is => "rw", default => sub { [] });
  has mem => (is => "rw", default => sub { {} }); # for handling circular refs. {key=>{res=>[...], todo=>[sub1, ...]}, ...}
  has cur_mem_key => (is => "rw"); # for handling circular refs. instead of passing around this as argument, we put it here.
  
  sub _in($$) {
      state $load_dmp = do { require Data::Dmp };
      my ($self, $needle, $haystack) = @_;
      return 0 unless defined($needle);
      my $r1 = ref($needle);
      my $f1 = $r1 ? Data::Dmp::dmp($needle) : undef;
      for (@$haystack) {
          my $r2 = ref($_);
          next if $r1 xor $r2;
          return 1 if  $r2 && $f1 eq Data::Dmp::dmp($_);
          return 1 if !$r2 && $needle eq $_;
      }
      0;
  }
  
  sub BUILD {
      require Data::ModeMerge::Config;
  
      my ($self, $args) = @_;
  
      if ($self->config) {
          # some sanity checks
          my $is_hashref = ref($self->config) eq 'HASH';
          die "config must be a hashref or a Data::ModeMerge::Config" unless
              $is_hashref || UNIVERSAL::isa($self->config, "Data::ModeMerge::Config");
          $self->config(Data::ModeMerge::Config->new(%{ $self->config })) if $is_hashref;
      } else {
          $self->config(Data::ModeMerge::Config->new);
      }
  
      for (qw(NORMAL KEEP ADD CONCAT SUBTRACT DELETE)) {
  	$self->register_mode($_);
      }
  
      if (!$self->combine_rules) {
          $self->combine_rules({
              # "left + right" => [which mode to use, which mode after merge]
              'ADD+ADD'            => ['ADD'     , 'ADD'   ],
              #'ADD+CONCAT'         => undef,
              'ADD+DELETE'         => ['DELETE'  , 'DELETE'],
              #'ADD+KEEP'           => undef,
              'ADD+NORMAL'         => ['NORMAL'  , 'NORMAL'],
              'ADD+SUBTRACT'       => ['SUBTRACT', 'ADD'   ],
  
              #'CONCAT+ADD'         => undef,
              'CONCAT+CONCAT'      => ['CONCAT'  , 'CONCAT'],
              'CONCAT+DELETE'      => ['DELETE'  , 'DELETE'],
              #'CONCAT+KEEP'        => undef,
              'CONCAT+NORMAL'      => ['NORMAL'  , 'NORMAL'],
              #'CONCAT+SUBTRACT'    => undef,
  
              'DELETE+ADD'         => ['NORMAL'  , 'ADD'     ],
              'DELETE+CONCAT'      => ['NORMAL'  , 'CONCAT'  ],
              'DELETE+DELETE'      => ['DELETE'  , 'DELETE'  ],
              'DELETE+KEEP'        => ['NORMAL'  , 'KEEP'    ],
              'DELETE+NORMAL'      => ['NORMAL'  , 'NORMAL'  ],
              'DELETE+SUBTRACT'    => ['NORMAL'  , 'SUBTRACT'],
  
              'KEEP+ADD'          => ['KEEP', 'KEEP'],
              'KEEP+CONCAT'       => ['KEEP', 'KEEP'],
              'KEEP+DELETE'       => ['KEEP', 'KEEP'],
              'KEEP+KEEP'         => ['KEEP', 'KEEP'],
              'KEEP+NORMAL'       => ['KEEP', 'KEEP'],
              'KEEP+SUBTRACT'     => ['KEEP', 'KEEP'],
  
              'NORMAL+ADD'        => ['ADD'     , 'NORMAL'],
              'NORMAL+CONCAT'     => ['CONCAT'  , 'NORMAL'],
              'NORMAL+DELETE'     => ['DELETE'  , 'NORMAL'],
              'NORMAL+KEEP'       => ['NORMAL'  , 'KEEP'  ],
              'NORMAL+NORMAL'     => ['NORMAL'  , 'NORMAL'],
              'NORMAL+SUBTRACT'   => ['SUBTRACT', 'NORMAL'],
  
              'SUBTRACT+ADD'      => ['SUBTRACT', 'SUBTRACT'],
              #'SUBTRACT+CONCAT'   => undef,
              'SUBTRACT+DELETE'   => ['DELETE'  , 'DELETE'  ],
              #'SUBTRACT+KEEP'     => undef,
              'SUBTRACT+NORMAL'   => ['NORMAL'  , 'NORMAL'  ],
              'SUBTRACT+SUBTRACT' => ['ADD'     , 'SUBTRACT'],
          });
      }
  }
  
  sub push_error {
      my ($self, $errmsg) = @_;
      push @{ $self->errors }, [[@{ $self->path }], $errmsg];
      return;
  }
  
  sub register_mode {
      my ($self, $name0) = @_;
      my $obj;
      if (ref($name0)) {
          my $obj = $name0;
      } elsif ($name0 =~ /^\w+(::\w+)+$/) {
          eval "require $name0; \$obj = $name0->new";
          die "Can't load module $name0: $@" if $@;
      } elsif ($name0 =~ /^\w+$/) {
          my $modname = "Data::ModeMerge::Mode::$name0";
          eval "require $modname; \$obj = $modname->new";
          die "Can't load module $modname: $@" if $@;
      } else {
          die "Invalid mode name $name0";
      }
      my $name = $obj->name;
      die "Mode $name already registered" if $self->modes->{$name};
      $obj->merger($self);
      $self->modes->{$name} = $obj;
  }
  
  sub check_prefix {
      my ($self, $hash_key) = @_;
      die "Hash key not a string" if ref($hash_key);
      my $dis = $self->config->disable_modes;
      if (defined($dis) && ref($dis) ne 'ARRAY') {
          $self->push_error("Invalid config value `disable_modes`: must be an array");
          return;
      }
      for my $mh (sort { $b->precedence_level <=> $a->precedence_level }
                  grep { !$dis || !$self->_in($_->name, $dis) }
                  values %{ $self->modes }) {
          if ($mh->check_prefix($hash_key)) {
              return $mh->name;
          }
      }
      return;
  }
  
  sub check_prefix_on_hash {
      my ($self, $hash) = @_;
      die "Not a hash" unless ref($hash) eq 'HASH';
      my $res = 0;
      for (keys %$hash) {
  	do { $res++; last } if $self->check_prefix($_);
      }
      $res;
  }
  
  sub add_prefix {
      my ($self, $hash_key, $mode) = @_;
      die "Hash key not a string" if ref($hash_key);
      my $dis = $self->config->disable_modes;
      if (defined($dis) && ref($dis) ne 'ARRAY') {
          die "Invalid config value `disable_modes`: must be an array";
      }
      if ($dis && $self->_in($mode, $dis)) {
          $self->push_error("Can't add prefix for currently disabled mode `$mode`");
          return $hash_key;
      }
      my $mh = $self->modes->{$mode} or die "Unknown mode: $mode";
      $mh->add_prefix($hash_key);
  }
  
  sub remove_prefix {
      my ($self, $hash_key) = @_;
      die "Hash key not a string" if ref($hash_key);
      my $dis = $self->config->disable_modes;
      if (defined($dis) && ref($dis) ne 'ARRAY') {
          die "Invalid config value `disable_modes`: must be an array";
      }
      for my $mh (sort { $b->precedence_level <=> $a->precedence_level }
                  grep { !$dis || !$self->_in($_->name, $dis) }
                  values %{ $self->modes }) {
          if ($mh->check_prefix($hash_key)) {
              my $r = $mh->remove_prefix($hash_key);
              if (wantarray) { return ($r, $mh->name) }
              else           { return $r }
          }
      }
      if (wantarray) { return ($hash_key, $self->config->default_mode) }
      else           { return $hash_key }
  }
  
  sub remove_prefix_on_hash {
      my ($self, $hash) = @_;
      die "Not a hash" unless ref($hash) eq 'HASH';
      for (keys %$hash) {
  	my $old = $_;
  	$_ = $self->remove_prefix($_);
  	next unless $old ne $_;
  	die "Conflict when removing prefix on hash: $old -> $_ but $_ already exists"
  	    if exists $hash->{$_};
  	$hash->{$_} = $hash->{$old};
  	delete $hash->{$old};
      }
      $hash;
  }
  
  sub merge {
      my ($self, $l, $r) = @_;
      $self->path([]);
      $self->errors([]);
      $self->mem({});
      $self->cur_mem_key(undef);
      my ($key, $res, $backup) = $self->_merge(undef, $l, $r);
      {
          success => !@{ $self->errors },
          error   => (@{ $self->errors } ?
                      join(", ",
                           map { sprintf("/%s: %s", join("/", @{ $_->[0] }), $_->[1]) }
                               @{ $self->errors }) : ''),
          result  => $res,
          backup  => $backup,
      };
  }
  
  # handle circular refs: process todo's
  sub _process_todo {
      my ($self) = @_;
      if ($self->cur_mem_key) {
          for my $mk (keys %{ $self->mem }) {
              my $res = $self->mem->{$mk}{res};
              if (defined($res) && @{ $self->mem->{$mk}{todo} }) {
                  #print "DEBUG: processing todo for mem<$mk>\n";
                  for (@{  $self->mem->{$mk}{todo} }) {
                      $_->(@$res);
                      return if @{ $self->errors };
                  }
                  $self->mem->{$mk}{todo} = [];
              }
          }
      }
  }
  
  sub _merge {
      my ($self, $key, $l, $r, $mode) = @_;
      my $c = $self->config;
      $mode //= $c->default_mode;
  
      my $mh = $self->modes->{$mode};
      die "Can't find handler for mode $mode" unless $mh;
  
      # determine which merge method we will call
      my $rl = ref($l);
      my $rr = ref($r);
      my $tl = $rl eq 'HASH' ? 'HASH' : $rl eq 'ARRAY' ? 'ARRAY' : $rl eq 'CODE' ? 'CODE' : !$rl ? 'SCALAR' : '';
      my $tr = $rr eq 'HASH' ? 'HASH' : $rr eq 'ARRAY' ? 'ARRAY' : $rr eq 'CODE' ? 'CODE' : !$rr ? 'SCALAR' : '';
      if (!$tl) { $self->push_error("Unknown type in left side: $rl"); return }
      if (!$tr) { $self->push_error("Unknown type in right side: $rr"); return }
      if (!$c->allow_create_array && $tl ne 'ARRAY' && $tr eq 'ARRAY') {
          $self->push_error("Not allowed to create array"); return;
      }
      if (!$c->allow_create_hash && $tl ne 'HASH' && $tr eq 'HASH') {
          $self->push_error("Not allowed to create hash"); return;
      }
      if (!$c->allow_destroy_array && $tl eq 'ARRAY' && $tr ne 'ARRAY') {
          $self->push_error("Not allowed to destroy array"); return;
      }
      if (!$c->allow_destroy_hash && $tl eq 'HASH' && $tr ne 'HASH') {
          $self->push_error("Not allowed to destroy hash"); return;
      }
      my $meth = "merge_${tl}_${tr}";
      if (!$mh->can($meth)) { $self->push_error("No merge method found for $tl + $tr (mode $mode)"); return }
  
      #$self->_process_todo;
      # handle circular refs: add to todo if necessary
      my $memkey;
      if ($rl || $rr) {
          $memkey = sprintf "%s%s %s%s %s %s",
              (defined($l) ? ($rl ? 2 : 1) : 0),
              (defined($l) ? "$l" : ''),
              (defined($r) ? ($rr ? 2 : 1) : 0),
              (defined($r) ? "$r" : ''),
              $mode,
              $self->config;
          #print "DEBUG: number of keys in mem = ".scalar(keys %{ $self->mem })."\n";
          #print "DEBUG: mem keys = \n".join("", map { "  $_\n" } keys %{ $self->mem }) if keys %{ $self->mem };
          #print "DEBUG: calculating memkey = <$memkey>\n";
      }
      if ($memkey) {
          if (exists $self->mem->{$memkey}) {
              $self->_process_todo;
              if (defined $self->mem->{$memkey}{res}) {
                  #print "DEBUG: already calculated, using cached result\n";
                  return @{ $self->mem->{$memkey}{res} };
              } else {
                  #print "DEBUG: detecting circular\n";
                  return ($key, undef, undef, 1);
              }
          } else {
              $self->mem->{$memkey} = {res=>undef, todo=>[]};
              $self->cur_mem_key($memkey);
              #print "DEBUG: invoking ".$mh->name."'s $meth(".dmp($key).", ".dmp($l).", ".dmp($r).")\n";
              my ($newkey, $res, $backup) = $mh->$meth($key, $l, $r);
              #print "DEBUG: setting res for mem<$memkey>\n";
              $self->mem->{$memkey}{res} = [$newkey, $res, $backup];
              $self->_process_todo;
              return ($newkey, $res, $backup);
          }
      } else {
          $self->_process_todo;
          #print "DEBUG: invoking ".$mh->name."'s $meth(".dmp($key).", ".dmp($l).", ".dmp($r).")\n";
          return $mh->$meth($key, $l, $r);
      }
  }
  
  # returns 1 if a is included in b (e.g. [user => "jajang"] in included in [user
  # => jajang => "quota"], but [user => "paijo"] is not)
  sub _path_is_included {
      my ($self, $p1, $p2) = @_;
      my $res = 1;
      for my $i (0..@$p1-1) {
          do { $res = 0; last } if !defined($p2->[$i]) || $p1->[$i] ne $p2->[$i];
      }
      #print "_path_is_included([".join(", ", @$p1)."], [".join(", ", @$p2)."])? $res\n";
      $res;
  }
  
  1;
  # ABSTRACT: Merge two nested data structures, with merging modes and options
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::ModeMerge - Merge two nested data structures, with merging modes and options
  
  =head1 VERSION
  
  This document describes version 0.35 of Data::ModeMerge (from Perl distribution Data-ModeMerge), released on 2016-07-22.
  
  =head1 SYNOPSIS
  
      use Data::ModeMerge;
  
      my $hash1 = { a=>1,    c=>1, d=>{  da =>[1]} };
      my $hash2 = { a=>2, "-c"=>2, d=>{"+da"=>[2]} };
  
  
      # if you want Data::ModeMerge to behave like many other merging
      # modules (e.g. Hash::Merge or Data::Merger), turn off modes
      # (prefix) parsing and options key parsing.
  
      my $mm = Data::ModeMerge->new(config => {parse_prefix=>0, options_key=>undef});
      my $res = $mm->merge($hash1, $hash2);
      die $res->{error} if $res->{error};
      # $res->{result} -> { a=>2, c=>1, "-c"=>2, d=>{da=>[1], "+da"=>[2]} }
  
  
      # otherwise Data::ModeMerge will parse prefix as well as options
      # key
  
      my $res = $mm->merge($hash1, $hash2);
      die $res->{error} if $res->{error};
      # $res->{result} -> { a=>2, c=>-1, d=>{da=>[1,2]} }
  
      $res = $merge({  a =>1, {  a2 =>1, ""=>{parse_prefix=>0}},
                    {".a"=>2, {".a2"=>2                       }});
      # $res->{result} -> { a=>12, {a2=>1, ".a2"=>2} }, parse_prefix is turned off in just the subhash
  
  
      # procedural interface
  
      my $res = mode_merge($hash1, $hash2, {allow_destroy_hash=>0});
  
  =head1 DESCRIPTION
  
  There are already several modules on CPAN to do recursive data
  structure merging, like L<Data::Merger> and
  L<Hash::Merge>. C<Data::ModeMerge> differs in that it offers merging
  "modes" and "options". It provides greater flexibility on what the
  result of a merge between two data should/can be. This module may or
  may not be what you need.
  
  One application of this module is in handling configuration. Often
  there are multiple levels of configuration, e.g. in your typical Unix
  command-line program there are system-wide config file in /etc,
  per-user config file under ~/, and command-line options. It's
  convenient programatically to load each of those in a hash and then
  merge system-wide hash with the per-user hash, and then merge the
  result with the command-line hash to get the a single hash as the
  final configuration. Your program can from there on deal with this
  just one hash instead of three.
  
  In a typical merging process between two hashes (left-side and
  right-side), when there is a conflicting key, then the right-side key
  will override the left-side. This is usually the desired behaviour in
  our said program as the system-wide config is there to provide
  defaults, and the per-user config (and the command-line arguments)
  allow a user to override those defaults.
  
  But suppose that the user wants to I<unset> a certain configuration
  setting that is defined by the system-wide config? She can't do that
  unless she edits the system-wide config (in which she might need admin
  rights), or the program allows the user to disregard the system-wide
  config. The latter is usually what's implemented by many Unix
  programs, e.g. the C<-noconfig> command-line option in C<mplayer>. But
  this has two drawbacks: a slightly added complexity in the program
  (need to provide a special, extra comand-line option) and the user
  loses all the default settings in the system-wide config. What she
  needed in the first place was to just unset I<a single setting> (a
  single key-value pair of the hash).
  
  L<Data::ModeMerge> comes to the rescue. It provides a so-called
  C<DELETE mode>.
  
   mode_merge({foo=>1, bar=>2}, {"!foo"=>undef, bar=>3, baz=>1});
  
  will result ini:
  
   {bar=>3, baz=>1}
  
  The C<!> prefix tells Data::ModeMerge to do a DELETE mode merging. So
  the final result will lack the C<foo> key.
  
  On the other hand, what if the system admin wants to I<protect> a
  certain configuration setting from being overriden by the user or the
  command-line? This is useful in a hosting or other retrictive
  environment where we want to limit users' freedom to some levels. This
  is possible via the KEEP mode merging.
  
   mode_merge({"^bar"=>2, "^baz"=>1}, {bar=>3, "!baz"=>0, qux=>7});
  
  will result in:
  
   {"^bar"=>2, "^baz"=>1, qux=>7}
  
  effectively protecting C<bar> and C<baz> from being
  overriden/deleted/etc.
  
  Aside from the two mentioned modes, there are also a few others
  available by default: ADD (prefix C<+>), CONCAT (prefix C<.>),
  SUBTRACT (prefix C<->), as well as the plain ol' NORMAL/override
  (optional prefix C<*>).
  
  You can add other modes by writing a mode handler module.
  
  You can change the default prefixes for each mode if you want. You can
  disable each mode individually.
  
  You can default to always using a certain mode, like the NORMAL mode,
  and ignore all the prefixes, in which case Data::ModeMerge will behave
  like most other merge modules.
  
  There are a few other options like whether or not the right side is
  allowed a "change the structure" of the left side (e.g. replacing a
  scalar with an array/hash, destroying an existing array/hash with
  scalar), maximum length of scalar/array/hash, etc.
  
  You can change default mode, prefixes, disable/enable modes, etc on a
  per-hash basis using the so-called B<options key>. See the B<OPTIONS
  KEY> section for more details.
  
  This module can handle (though not all possible cases)
  circular/recursive references.
  
  =for Pod::Coverage ^(BUILD)$
  
  =head1 MERGING PREFIXES AND YOUR DATA
  
  Merging with this module means you need to be careful when your hash
  keys might contain one of the mode prefixes characters by accident,
  because it will trigger the wrong merge mode and moreover the prefix
  characters will be B<stripped> from the final result (unless you
  configure the module not to do so).
  
  A rather common case is when you have regexes in your hash
  keys. Regexes often begins with C<^>, which coincidentally is a prefix
  for the KEEP mode. Or perhaps you have dot filenames as hash keys,
  where it clashes with the CONCAT mode. Or perhaps shell wildcards,
  where C<*> is also used as the prefix for NORMAL mode.
  
  To avoid clashes, you can either:
  
  =over 4
  
  =item * exclude the keys using
  C<exclude_merge>/C<include_merge>/C<exclude_parse>/C<include_parse>
  config settings
  
  =item * turn off some modes which you don't want via the
  C<disable_modes> config
  
  =item * change the prefix for that mode so that it doesn't clash with
  your data via the C<set_prefix> config
  
  =item * disable prefix parsing altogether via setting C<parse_prefix>
  config to 0
  
  =back
  
  You can do this via the configuration, or on a per-hash basis, using
  the options key.
  
  See L<Data::ModeMerge::Config> for more details on configuration.
  
  =head1 OPTIONS KEY
  
  Aside from merging mode prefixes, you also need to watch out if your
  hash contains a "" (empty string) key, because by default this is the
  key used for options key.
  
  Options key are used to specify configuration on a per-hash basis.
  
  If your hash keys might contain "" keys which are not meant to be an
  options key, you can either:
  
  =over 4
  
  =item * change the name of the key for options key, via setting
  C<options_key> config to another string.
  
  =item * turn off options key mechanism,
  by setting C<options_key> config to undef.
  
  =back
  
  See L<Data::ModeMerge::Config> for more details about options key.
  
  =head1 MERGING MODES
  
  =head2 NORMAL (optional '*' prefix on left/right side)
  
   mode_merge({  a =>11, b=>12}, {  b =>22, c=>23}); # {a=>11, b=>22, c=>23}
   mode_merge({"*a"=>11, b=>12}, {"*b"=>22, c=>23}); # {a=>11, b=>22, c=>23}
  
  =head2 ADD ('+' prefix on the right side)
  
   mode_merge({i=>3}, {"+i"=>4, "+j"=>1}); # {i=>7, j=>1}
   mode_merge({a=>[1]}, {"+a"=>[2, 3]}); # {a=>[1, 2, 3]}
  
  Additive merge on hashes will be treated like a normal merge.
  
  =head2 CONCAT ('.' prefix on the right side)
  
   mode_merge({i=>3}, {".i"=>4, ".j"=>1}); # {i=>34, j=>1}
  
  Concative merge on arrays will be treated like additive merge.
  
  =head2 SUBTRACT ('-' prefix on the right side)
  
   mode_merge({i=>3}, {"-i"=>4}); # {i=>-1}
   mode_merge({a=>["a","b","c"]}, {"-a"=>["b"]}); # {a=>["a","c"]}
  
  Subtractive merge on hashes behaves like a normal merge, except that
  each key on the right-side hash without any prefix will be assumed to
  have a DELETE prefix, i.e.:
  
   mode_merge({h=>{a=>1, b=>1}}, {-h=>{a=>2, "+b"=>2, c=>2}})
  
  is equivalent to:
  
   mode_merge({h=>{a=>1, b=>1}}, {h=>{"!a"=>2, "+b"=>2, "!c"=>2}})
  
  and will merge to become:
  
   {h=>{b=>3}}
  
  =head2 DELETE ('!' prefix on the right side)
  
   mode_merge({x=>WHATEVER}, {"!x"=>WHATEVER}); # {}
  
  =head2 KEEP ('^' prefix on the left/right side)
  
  If you add '^' prefix on the left side, it will be protected from
  being replaced/deleted/etc.
  
   mode_merge({'^x'=>WHATEVER1}, {"x"=>WHATEVER2}); # {x=>WHATEVER1}
  
  For hashes, KEEP mode means that all keys on the left side will not be
  replaced/modified/deleted, *but* you can still add more keys from the
  right side hash.
  
   mode_merge({a=>1, b=>2, c=>3},
              {a=>4, '^c'=>1, d=>5},
              {default_mode=>'KEEP'});
              # {a=>1, b=>2, c=>3, d=>5}
  
  Multiple prefixes on the right side is allowed, where the merging will
  be done by precedence level (highest first):
  
   mode_merge({a=>[1,2]}, {'-a'=>[1], '+a'=>[10]}); # {a=>[2,10]}
  
  but not on the left side:
  
   mode_merge({a=>1, '^a'=>2}, {a=>3}); # error!
  
  Precedence levels (from highest to lowest):
  
   KEEP
   NORMAL
   SUBTRACT
   CONCAT ADD
   DELETE
  
  =head1 CREATING AND USING YOUR OWN MODE
  
  Let's say you want to add a mode named C<FOO>. It will have the prefix
  '?'.
  
  Create the mode handler class,
  e.g. C<Data::ModeMerge::Mode::FOO>. It's probably best to subclass
  from L<Data::ModeMerge::Mode::Base>. The class must implement name(),
  precedence_level(), default_prefix(), default_prefix_re(), and
  merge_{SCALAR,ARRAY,HASH}_{SCALAR,ARRAY,HASH}(). For more details, see
  the source code of Base.pm and one of the mode handlers
  (e.g. NORMAL.pm).
  
  To use the mode, register it:
  
   my $mm = Data::ModeMerge->new;
   $mm->register_mode('FOO');
  
  This will require C<Data::ModeMerge::Mode::FOO>. After that, define
  the operations against other modes:
  
   # if there's FOO on the left and NORMAL on the right, what mode
   # should the merge be done in (FOO), and what the mode should be
   # after the merge? (NORMAL)
   $mm->combine_rules->{"FOO+NORMAL"} = ["FOO", "NORMAL"];
  
   # we don't define FOO+ADD
  
   $mm->combine_rules->{"FOO+KEEP"} = ["KEEP", "KEEP"];
  
   # and so on
  
  =head1 FUNCTIONS
  
  =head2 mode_merge($l, $r[, $config_vars])
  
  A non-OO wrapper for merge() method. Exported by default. See C<merge>
  method for more details.
  
  =head1 ATTRIBUTES
  
  =head2 config
  
  A hashref for config. See L<Data::ModeMerge::Config>.
  
  =head2 modes
  
  =head2 combine_rules
  
  =head2 path
  
  =head2 errors
  
  =head2 mem
  
  =head2 cur_mem_key
  
  =head1 METHODS
  
  For typical usage, you only need merge().
  
  =head2 push_error($errmsg)
  
  Used by mode handlers to push error when doing merge. End users
  normally should not need this.
  
  =head2 register_mode($name_or_package_or_obj)
  
  Register a mode. Will die if mode with the same name already exists.
  
  =head2 check_prefix($hash_key)
  
  Check whether hash key has prefix for certain mode. Return the name of
  the mode, or undef if no prefix is detected.
  
  =head2 check_prefix_on_hash($hash)
  
  This is like C<check_prefix> but performed on every key of the
  specified hash. Return true if any of the key contain a merge prefix.
  
  =head2 add_prefix($hash_key, $mode)
  
  Return hash key with added prefix with specified mode. Log merge error
  if mode is unknown or is disabled.
  
  =head2 remove_prefix($hash_key)
  
  Return hash key will any prefix removed.
  
  =head2 remove_prefix_on_hash($hash)
  
  This is like C<remove_prefix> but performed on every key of the
  specified hash. Return the same hash but with prefixes removed.
  
  =head2 merge($l, $r)
  
  Merge two nested data structures. Returns the result hash: {
  success=>0|1, error=>'...', result=>..., backup=>... }. The 'error'
  key is set to contain an error message if there is an error. The merge
  result is in the 'result' key. The 'backup' key contains replaced
  elements from the original hash/array.
  
  =head1 FAQ
  
  =head2 What is this module good for? Why would I want to use this module instead of the other hash merge modules?
  
  If you just need to (deeply) merge two hashes, chances are you do not
  need this module. Use, for example, L<Hash::Merge>, which is also
  flexible enough because it allows you to set merging behaviour for
  merging different types (e.g. SCALAR vs ARRAY).
  
  You might need this module if your data is recursive/self-referencing
  (which, last time I checked, is not handled well by Hash::Merge), or
  if you want to be able to merge differently (i.e. apply different
  merging B<modes>) according to different prefixes on the key, or
  through special key. In other words, you specify merging modes from
  inside the hash itself.
  
  I originally wrote Data::ModeMerge this for L<Data::Schema> and
  L<Config::Tree>. I want to reuse the "parent" schema (or
  configuration) in more ways other than just override conflicting
  keys. I also want to be able to allow the parent to protect certain
  keys from being overriden. I found these two features lacking in all
  merging modules that I've evaluated prior to writing Data::ModeMerge.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-ModeMerge>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-ModeMerge>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-ModeMerge>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Data::ModeMerge::Config>
  
  Other merging modules on CPAN: L<Data::Merger> (from Data-Utilities),
  L<Hash::Merge>, L<Hash::Merge::Simple>
  
  L<Data::Schema> and L<Config::Tree> (among others, two modules which
  use Data::ModeMerge)
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_MODEMERGE

    $main::fatpacked{"Data/ModeMerge/Config.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_MODEMERGE_CONFIG';
  package Data::ModeMerge::Config;
  
  our $DATE = '2016-07-22'; # DATE
  our $VERSION = '0.35'; # VERSION
  
  use 5.010;
  use Mo qw(build default);
  
  has recurse_hash          => (is => 'rw', default => sub{1});
  has recurse_array         => (is => 'rw', default => sub{0});
  has parse_prefix          => (is => 'rw', default => sub{1});
  has wanted_path           => (is => 'rw');
  has default_mode          => (is => 'rw', default => sub{'NORMAL'});
  has disable_modes         => (is => 'rw');
  has allow_create_array    => (is => 'rw', default => sub{1});
  has allow_create_hash     => (is => 'rw', default => sub{1});
  has allow_destroy_array   => (is => 'rw', default => sub{1});
  has allow_destroy_hash    => (is => 'rw', default => sub{1});
  has exclude_parse         => (is => 'rw');
  has exclude_parse_regex   => (is => 'rw');
  has include_parse         => (is => 'rw');
  has include_parse_regex   => (is => 'rw');
  has exclude_merge         => (is => 'rw');
  has exclude_merge_regex   => (is => 'rw');
  has include_merge         => (is => 'rw');
  has include_merge_regex   => (is => 'rw');
  has set_prefix            => (is => 'rw');
  has readd_prefix          => (is => 'rw', default => sub{1});
  has premerge_pair_filter  => (is => 'rw');
  has options_key           => (is => 'rw', default => sub{''});
  has allow_override        => (is => 'rw');
  has disallow_override     => (is => 'rw');
  
  # list of config settings only available in merger-object's config
  # (not in options key)
  sub _config_config {
      state $a = [qw/
          wanted_path
          options_key
          allow_override
          disallow_override
                    /];
  }
  
  # list of config settings available in options key
  sub _config_ok {
      state $a = [qw/
          recurse_hash
          recurse_array
          parse_prefix
          default_mode
          disable_modes
          allow_create_array
          allow_create_hash
          allow_destroy_array
          allow_destroy_hash
          exclude_parse
          exclude_parse_regex
          include_parse
          include_parse_regex
          exclude_merge
          exclude_merge_regex
          include_merge
          include_merge_regex
          set_prefix
          readd_prefix
          premerge_pair_filter
                    /];
  }
  
  1;
  # ABSTRACT: Data::ModeMerge configuration
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::ModeMerge::Config - Data::ModeMerge configuration
  
  =head1 VERSION
  
  This document describes version 0.35 of Data::ModeMerge::Config (from Perl distribution Data-ModeMerge), released on 2016-07-22.
  
  =head1 SYNOPSIS
  
   # getting configuration
   if ($mm->config->allow_extra_hash_keys) { ... }
  
   # setting configuration
   $mm->config->max_warnings(100);
  
  =head1 DESCRIPTION
  
  Configuration variables for Data::ModeMerge.
  
  =head1 ATTRIBUTES
  
  =head2 recurse_hash => BOOL
  
  Context: config, options key
  
  Default: 1
  
  Whether to recursively merge hash. When 1, each key-value pair between
  2 hashes will be recursively merged. Otherwise, the right-side hash
  will just replace the left-side.
  
  Options key will not be parsed under recurse_hash=0.
  
  Example:
  
   mode_merge({h=>{a=>1}}, {h=>{b=>1}}                   ); # {h=>{a=>1, b=>1}}
   mode_merge({h=>{a=>1}}, {h=>{b=>1}}, {recurse_hash=>0}); # {h=>{b=>1}}
  
  =head2 recurse_array => BOOL
  
  Context: config, options key
  
  Default: 0
  
  Whether to recursively merge array. When 1, each element is
  recursively merged. Otherwise, the right-side array will just replace
  the left-side.
  
  Example:
  
   mode_merge([1, 1], [4]                    ); # [4, 1]
   mode_merge([1, 1], [4], {recurse_array=>0}); # [2]
  
  =head2 parse_prefix => BOOL
  
  Context: config, options key
  
  Default: 1
  
  Whether to parse merge prefix in hash keys. If set to 0, merging
  behaviour is similar to most other nested merge modules.
  
   mode_merge({a=>1}, {"+a"=>2}                   ); # {a=>3}
   mode_merge({a=>1}, {"+a"=>2}, {parse_prefix=>0}); # {a=>1, "+a"=>2}
  
  =head2 wanted_path => ARRAYREF
  
  Context: config, options key
  
  Default: undef
  
  If set, merging is only done to the specified "branch". Useful to save
  time/storage when merging large hash "trees" while you only want a
  certain branch of the trees (e.g. resolving just a config variable
  from several config hashes).
  
  Example:
  
   mode_merge(
     {
      user => {
        jajang => { quota => 100, admin => 1 },
        paijo  => { quota =>  50, admin => 0 },
        kuya   => { quota => 150, admin => 0 },
      },
      groups => [qw/admin staff/],
     },
     {
      user => {
        jajang => { quota => 1000 },
      }
     }
   );
  
  With wanted_path unset, the result would be:
  
     {
      user => {
        jajang => { quota => 1000, admin => 1 },
        paijo  => { quota =>   50, admin => 0 },
        kuya   => { quota =>  150, admin => 0 },
      }
      groups => [qw/admin staff/],
     }
  
  With wanted_path set to ["user", "jajang", "quota"] (in other words,
  you're saying that you'll be disregarding other branches), the result
  would be:
  
     {
      user => {
        jajang => { quota => 1000, admin => undef },
      }
     }
  
  =head2 default_mode => 'NORMAL' | 'ADD' | 'CONCAT' | 'SUBTRACT' | 'DELETE' | 'KEEP' | ...
  
  Context: config, options key
  
  Default: NORMAL
  
  Example:
  
   mode_merge(3, 4                         ); # 4
   mode_merge(3, 4, {default_mode => "ADD"}); # 7
  
  =head2 disable_modes => ARRAYREF
  
  Context: config, options key
  
  Default: []
  
  List of modes to ignore the prefixes of.
  
  Example:
  
   mode_merge({add=>1, del=>2, concat=>3},
              {add=>2, "!del"=>0, .concat=>4},
              {disable_modes=>[qw/CONCAT/]});
   #          {add=>3,         concat=>3, .concat=>4}
  
  See also: C<parse_prefix> which if set to 0 will in effect disable all
  modes except the default mode.
  
  =head2 allow_create_array => BOOL
  
  Context: config, options key
  
  Default: 1
  
  If enabled, then array creation will be allowed (from something
  non-array, like a hash/scalar). Setting to 0 is useful if you want to
  avoid the merge to "change the structure" of the left side.
  
  Example:
  
   mode_merge(1, [1,2]                         ); # success, result=[1,2]
   mode_merge(1, [1,2], {allow_create_array=>0}); # failed, can't create array
  
  =head2 allow_create_hash => BOOL
  
  Context: config, options key
  
  Default: 1
  
  If enabled, then hash creation will be allowed (from something
  non-hash, like array/scalar). Setting to 0 is useful if you want to
  avoid the merge to "change the structure" of the left side.
  
  Example:
  
   mode_merge(1, {a=>1}                        ); # success, result={a=>1}
   mode_merge(1, {a=>1}, {allow_create_hash=>0}); # failed, can't create hash
  
  =head2 allow_destroy_array => BOOL
  
  Context: config, options key
  
  Default: 1
  
  If enabled, then replacing array on the left side with non-array
  (e.g. hash/scalar) on the right side is allowed. Setting to 0 is
  useful if you want to avoid the merge to "change the structure" of the
  left side.
  
  Example:
  
   mode_merge([1,2], {}                          ); # success, result={}
   mode_merge([1,2], {}, {allow_destroy_array=>0}); # failed, can't destroy array
  
  =head2 allow_destroy_hash => BOOL
  
  Context: config, options key
  
  Default: 1
  
  If enabled, then replacing hash on the left side with non-hash
  (e.g. array/scalar) on the right side is allowed. Setting to 0 is
  useful if you want to avoid the merge to "change the structure" of the
  left side.
  
  Example:
  
   mode_merge({a=>1}, []                         ); # success, result=[]
   mode_merge({a=>1}, [], {allow_destroy_hash=>0}); # failed, can't destroy hash
  
  =head2 exclude_parse => ARRAYREF
  
  Context: config, options key
  
  Default: undef
  
  The list of hash keys that should not be parsed for prefix and merged
  as-is using the default mode.
  
  If C<include_parse> is also mentioned then only keys in
  C<include_parse> and not in C<exclude_parse> will be parsed for
  prefix.
  
  Example:
  
   mode_merge({a=>1, b=>2}, {"+a"=>3, "+b"=>4}, {exclude_parse=>["+b"]}); # {a=>4, b=>2, "+b"=>4}
  
  =head2 exclude_parse_regex => REGEX
  
  Context: config, options key
  
  Default: undef
  
  Just like C<exclude_parse> but using regex instead of list.
  
  =head2 include_parse => ARRAYREF
  
  Context: config, options key
  
  Default: undef
  
  If specified, then only hash keys listed by this setting will be
  parsed for prefix. The rest of the keys will not be parsed and merged
  as-is using the default mode.
  
  If C<exclude_parse> is also mentioned then only keys in
  C<include_parse> and not in C<exclude_parse> will be parsed for
  prefix.
  
  Example:
  
   mode_merge({a=>1, b=>2, c=>3}, {"+a"=>4, "+b"=>5, "+c"=>6},
              {include_parse=>["+a"]}); # {a=>1, "+a"=>4, b=>7, c=>3, "+c"=>6}
  
  =head2 include_parse_regex => REGEX
  
  Context: config, options key
  
  Default: undef
  
  Just like C<include_parse> but using regex instead of list.
  
  =head2 exclude_merge => ARRAYREF
  
  Context: config, options key
  
  Default: undef
  
  The list of hash keys on the left side that should not be merged and
  instead copied directly to the result. All merging keys on the right
  side will be ignored.
  
  If C<include_merge> is also mentioned then only keys in
  C<include_merge> and not in C<exclude_merge> will be merged.
  
  Example:
  
   mode_merge({a=>1}, {"+a"=>20, "-a"=>30}, {exclude_merge=>["a"]}); # {a=>1}
  
  =head2 exclude_merge_regex => REGEX
  
  Context: config, options key
  
  Default: undef
  
  Just like C<exclude_merge> but using regex instead of list.
  
  =head2 include_merge => ARRAYREF
  
  Context: config, options key
  
  Default: undef
  
  If specified, then only hash keys listed by this setting will be
  merged.
  
  If C<exclude_merge> is also mentioned then only keys in
  C<include_merge> and not in C<exclude_merge> will be merged.
  
  Example:
  
   mode_merge({a=>1, b=>2, c=>3}, {"+a"=>40, "+b"=>50, "+c"=>60, "!c"=>70},
              {include_merge=>["a"]}); # {a=>41, b=>2, c=>3}
  
  =head2 include_merge_regex => ARRAYREF
  
  Context: config, options key
  
  Default: undef
  
  Just like C<include_merge> but using regex instead of list.
  
  =head2 set_prefix => HASHREF
  
  Context: config, options key
  
  Default: undef
  
  Temporarily change the prefix character for each mode. Value is
  hashref where each hash key is mode and the value is a new prefix
  string.
  
   mode_merge({a=>1, c=>2}, {'+a'=>10, '.c'=>20});                                        # {a=>11, c=>220}
   mode_merge({a=>1, c=>2}, {'+a'=>10, '.c'=>20}, {set_prefix=>{ADD=>'.', CONCAT=>'+'}}); # {a=>110, c=>22}
  
  =head2 readd_prefix => BOOL
  
  Context: config, options key
  
  Default: 1
  
  When merging two hashes, the prefixes are first stripped before
  merging. After merging is done, the prefixes by default will be
  re-added. This is done so that modes which are "sticky" (like KEEP)
  can propagate their mode). Setting C<readd_prefix> to 0 will prevent
  their stickiness.
  
   mode_merge({"^a"=>1}, {a=>2});                    # {"^a"=>1}
   mode_merge({"^a"=>1}, {a=>2}, {readd_prefix=>0}); # { "a"=>1}
  
  =head2 premerge_pair_filter => CODEREF
  
  Context: config, options key
  
  Default: undef
  
  Pass the key and value of each hash pair to a subroutine before
  merging (and before the keys are stripped for mode prefixes). Will
  push error if there is conflicting key in the hash.
  
  The subroutine should return a list of new key(s) and value(s). If key
  is undef then it means the pair should be discarded. This way, the
  filter is able to add or remove pairs from the hash.
  
   mode_merge({a=>1}, {"+amok"=>2},
              {premerge_pair_filter=>sub{ uc(substr($_[0],0,2)), $_[1]*2 }});
   # {"A"=>6}
  
  =head2 options_key => STR
  
  Context: config
  
  Default: '' (empty string)
  
  If defined, then when merging two hashes, this key will be searched
  first on the left-side and right-side hash. The values will then be
  merged and override (many of) the configuration.
  
  Options key is analogous to Apache's C<.htaccess> mechanism, which
  allows setting configuration on a per-directory (per-hash)
  basis. There's even an C<allow_override> config similar to Apache
  directive of the same name.
  
  If you want to disable processing of options key, set this to undef.
  
  Example:
  
   mode_merge({a=>1, {x=>3}},
              {a=>2, {x=>4}},
              {default_mode=>'ADD'}); # {a=>3, {x=>7}}
   mode_merge({a=>1, {x=>3}},
              {a=>2, {x=>4, ''=>{default_mode=>'CONCAT'}}},
              {default_mode=>'ADD'}); # {a=>3, {x=>34}}
  
  On the above example, C<default_mode> is set to ADD. But in the
  {x=>...} subhash, C<default_mode> is changed to CONCAT by the options
  key.
  
  =head2 allow_override => REGEX
  
  Context: config
  
  Default: undef
  
  If defined, then only config names matching regex will be able to be
  set in options key.
  
  If C<disallow_override> is also set, then only config names matching
  C<allow_override> and not matching C<disallow_override> will be able
  to be set in options key.
  
  =head2 disallow_override => REGEX
  
  Context: config
  
  Default: undef
  
  If defined, then config names matching regex will not be able to be
  set in options key.
  
  For example, if you want to restrict "structural changes" in merging
  while still allowing options key, you can set C<allow_create_hash>,
  C<allow_destroy_hash>, C<allow_create_array>, and
  C<allow_destroy_array> all to 0 and C<disallow_override> to
  C<allow_create|allow_destroy> to forbid overriding via options key.
  
  If C<disallow_override> is also set, then only config names matching
  C<allow_override> and not matching C<disallow_override> will be able
  to be set in options key.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-ModeMerge>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-ModeMerge>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-ModeMerge>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_MODEMERGE_CONFIG

    $main::fatpacked{"Data/ModeMerge/Mode/ADD.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_MODEMERGE_MODE_ADD';
  package Data::ModeMerge::Mode::ADD;
  
  our $DATE = '2016-07-22'; # DATE
  our $VERSION = '0.35'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  use Mo qw(build default);
  extends 'Data::ModeMerge::Mode::NORMAL';
  
  sub name { 'ADD' }
  
  sub precedence_level { 3 }
  
  sub default_prefix { '+' }
  
  sub default_prefix_re { qr/^\+/ }
  
  sub merge_SCALAR_SCALAR {
      my ($self, $key, $l, $r) = @_;
      ($key, ( $l // 0 ) + $r);
  }
  
  sub merge_SCALAR_ARRAY {
      my ($self, $key, $l, $r) = @_;
      $self->merger->push_error("Can't add scalar and array");
      return;
  }
  
  sub merge_SCALAR_HASH {
      my ($self, $key, $l, $r) = @_;
      $self->merger->push_error("Can't add scalar and hash");
      return;
  }
  
  sub merge_ARRAY_SCALAR {
      my ($self, $key, $l, $r) = @_;
      $self->merger->push_error("Can't add array and scalar");
      return;
  }
  
  sub merge_ARRAY_ARRAY {
      my ($self, $key, $l, $r) = @_;
      ($key, [ @$l, @$r ]);
  }
  
  sub merge_ARRAY_HASH {
      my ($self, $key, $l, $r) = @_;
      $self->merger->push_error("Can't add array and hash");
      return;
  }
  
  sub merge_HASH_SCALAR {
      my ($self, $key, $l, $r) = @_;
      $self->merger->push_error("Can't add hash and scalar");
      return;
  }
  
  sub merge_HASH_ARRAY {
      my ($self, $key, $l, $r) = @_;
      $self->merger->push_error("Can't add hash and array");
      return;
  }
  
  1;
  # ABSTRACT: Handler for Data::ModeMerge ADD merge mode
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::ModeMerge::Mode::ADD - Handler for Data::ModeMerge ADD merge mode
  
  =head1 VERSION
  
  This document describes version 0.35 of Data::ModeMerge::Mode::ADD (from Perl distribution Data-ModeMerge), released on 2016-07-22.
  
  =head1 SYNOPSIS
  
   use Data::ModeMerge;
  
  =head1 DESCRIPTION
  
  This is the class to handle ADD merge mode.
  
  =for Pod::Coverage ^merge_.*
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-ModeMerge>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-ModeMerge>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-ModeMerge>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_MODEMERGE_MODE_ADD

    $main::fatpacked{"Data/ModeMerge/Mode/Base.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_MODEMERGE_MODE_BASE';
  package Data::ModeMerge::Mode::Base;
  
  our $DATE = '2016-07-22'; # DATE
  our $VERSION = '0.35'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  
  #use Data::Dmp;
  
  #use Log::Any '$log';
  use Mo qw(build default);
  
  #use Data::Clone qw/clone/;
  
  has merger => (is => 'rw');
  has prefix => (is => 'rw');
  has prefix_re => (is => 'rw');
  has check_prefix_sub => (is => 'rw');
  has add_prefix_sub => (is => 'rw');
  has remove_prefix_sub => (is => 'rw');
  
  sub name {
      die "Subclass must provide name()";
  }
  
  sub precedence_level {
      die "Subclass must provide precedence_level()";
  }
  
  sub default_prefix {
      die "Subclass must provide default_prefix()";
  }
  
  sub default_prefix_re {
      die "Subclass must provide default_prefix_re()";
  }
  
  sub BUILD {
      my ($self) = @_;
      $self->prefix($self->default_prefix);
      $self->prefix_re($self->default_prefix_re);
  }
  
  sub check_prefix {
      my ($self, $hash_key) = @_;
      if ($self->check_prefix_sub) {
          $self->check_prefix_sub->($hash_key);
      } else {
          $hash_key =~ $self->prefix_re;
      }
  }
  
  sub add_prefix {
      my ($self, $hash_key) = @_;
      if ($self->add_prefix_sub) {
          $self->add_prefix_sub->($hash_key);
      } else {
          $self->prefix . $hash_key;
      }
  }
  
  sub remove_prefix {
      my ($self, $hash_key) = @_;
      if ($self->remove_prefix_sub) {
          $self->remove_prefix_sub->($hash_key);
      } else {
          my $re = $self->prefix_re;
          $hash_key =~ s/$re//;
          $hash_key;
      }
  }
  
  sub merge_ARRAY_ARRAY {
      my ($self, $key, $l, $r) = @_;
      my $mm = $self->merger;
      my $c = $mm->config;
      return $self->merge_SCALAR_SCALAR($key, $l, $r) unless $c->recurse_array;
      return if $c->wanted_path && !$mm->_path_is_included($mm->path, $c->wanted_path);
  
      my @res;
      my @backup;
      my $la = @$l;
      my $lb = @$r;
      push @{ $mm->path }, -1;
      for my $i (0..($la > $lb ? $la : $lb)-1) {
          #print "DEBUG: merge_A_A: #$i: a->[$i]=".Data::Dumper->new([$l->[$i]])->Indent(0)->Terse(1)->Dump.", b->[$i]=".Data::Dumper->new([$r->[$i]])->Indent(0)->Terse(1)->Dump."\n";
          $mm->path->[-1] = $i;
          if ($i < $la && $i < $lb) {
              push @backup, $l->[$i];
              my ($subnewkey, $subres, $subbackup, $is_circular) = $mm->_merge($i, $l->[$i], $r->[$i], $c->default_mode);
              last if @{ $mm->errors };
              if ($is_circular) {
                  push @res, undef;
                  #print "DEBUG: pushing todo to mem<".$mm->cur_mem_key.">\n";
                  push @{ $mm->mem->{ $mm->cur_mem_key }{todo} }, sub {
                      my ($subnewkey, $subres, $subbackup) = @_;
                      #print "DEBUG: Entering todo subroutine (i=$i)\n";
                      $res[$i] = $subres;
                  }
              } else {
                  push @res, $subres;# if defined($newkey); = we allow DELETE on array?
              }
          } elsif ($i < $la) {
              push @res, $l->[$i];
          } else {
              push @res, $r->[$i];
          }
      }
      pop @{ $mm->path };
      ($key, \@res, \@backup);
  }
  
  sub _prefilter_hash {
      my ($self, $h, $desc, $sub) = @_;
      my $mm = $self->merger;
  
      if (ref($sub) ne 'CODE') {
          $mm->push_error("$desc failed: filter must be a coderef");
          return;
      }
  
      my $res = {};
      for (keys %$h) {
          my @r = $sub->($_, $h->{$_});
          while (my ($k, $v) = splice @r, 0, 2) {
              next unless defined $k;
              if (exists $res->{$k}) {
                  $mm->push_error("$desc failed; key conflict: ".
                                  "$_ -> $k, but key $k already exists");
                  return;
              }
              $res->{$k} = $v;
          }
      }
  
      $res;
  }
  
  # turn {[prefix]key => val, ...} into { key => [MODE, val], ...}, push
  # error if there's conflicting key
  sub _gen_left {
      my ($self, $l, $mode, $esub, $ep, $ip, $epr, $ipr) = @_;
      my $mm = $self->merger;
      my $c = $mm->config;
  
      #print "DEBUG: Entering _gen_left(".dmp($l).", $mode, ...)\n";
  
      if ($c->premerge_pair_filter) {
          $l = $self->_prefilter_hash($l, "premerge filter left hash",
                                      $c->premerge_pair_filter);
          return if @{ $mm->errors };
      }
  
      my $hl = {};
      if ($c->parse_prefix) {
          for (keys %$l) {
              my $do_parse = 1;
              $do_parse = 0 if $do_parse && $ep  &&  $mm->_in($_, $ep);
              $do_parse = 0 if $do_parse && $ip  && !$mm->_in($_, $ip);
              $do_parse = 0 if $do_parse && $epr &&  /$epr/;
              $do_parse = 0 if $do_parse && $ipr && !/$ipr/;
  
              if ($do_parse) {
                  my $old = $_;
                  my $m2;
                  ($_, $m2) = $mm->remove_prefix($_);
                  next if $esub && !$esub->($_);
                  if ($old ne $_ && exists($l->{$_})) {
                      $mm->push_error("Conflict when removing prefix on left-side ".
                                      "hash key: $old -> $_ but $_ already exists");
                      return;
                  }
                  $hl->{$_} = [$m2, $l->{$old}];
              } else {
                  next if $esub && !$esub->($_);
                  $hl->{$_} = [$mode, $l->{$_}];
              }
          }
      } else {
          for (keys %$l) {
              next if $esub && !$esub->($_);
              $hl->{$_} = [$mode, $l->{$_}];
          }
      }
  
      #print "DEBUG: Leaving _gen_left, result = ".dmp($hl)."\n";
      $hl;
  }
  
  # turn {[prefix]key => val, ...} into { key => {MODE=>val, ...}, ...},
  # push error if there's conflicting key+MODE
  sub _gen_right {
      my ($self, $r, $mode, $esub, $ep, $ip, $epr, $ipr) = @_;
      my $mm = $self->merger;
      my $c = $mm->config;
  
      #print "DEBUG: Entering _gen_right(".dmp($r).", $mode, ...)\n";
  
      if ($c->premerge_pair_filter) {
          $r = $self->_prefilter_hash($r, "premerge filter right hash",
                                      $c->premerge_pair_filter);
          return if @{ $mm->errors };
      }
  
      my $hr = {};
      if ($c->parse_prefix) {
          for (keys %$r) {
              my $do_parse = 1;
              $do_parse = 0 if $do_parse && $ep  &&  $mm->_in($_, $ep);
              $do_parse = 0 if $do_parse && $ip  && !$mm->_in($_, $ip);
              $do_parse = 0 if $do_parse && $epr &&  /$epr/;
              $do_parse = 0 if $do_parse && $ipr && !/$ipr/;
  
              if ($do_parse) {
                  my $old = $_;
                  my $m2;
                  ($_, $m2) = $mm->remove_prefix($_);
                  next if $esub && !$esub->($_);
                  if (exists $hr->{$_}{$m2}) {
                      $mm->push_error("Conflict when removing prefix on right-side ".
                                      "hash key: $old($m2) -> $_ ($m2) but $_ ($m2) ".
                                      "already exists");
                      return;
                  }
                  $hr->{$_}{$m2} = $r->{$old};
              } else {
                  next if $esub && !$esub->($_);
                  $hr->{$_} = {$mode => $r->{$_}};
              }
          }
      } else {
          for (keys %$r) {
              next if $esub && !$esub->($_);
              $hr->{$_} = {$mode => $r->{$_}}
          }
      }
      #print "DEBUG: Leaving _gen_right, result = ".dmp($hr)."\n";
      $hr;
  }
  
  # merge two hashes which have been prepared by _gen_left and
  # _gen_right, will result in { key => [final_mode, val], ... }
  sub _merge_gen {
      my ($self, $hl, $hr, $mode, $em, $im, $emr, $imr) = @_;
      my $mm = $self->merger;
      my $c = $mm->config;
  
      #print "DEBUG: Entering _merge_gen(".dmp($hl).", ".dmp($hr).", $mode, ...)\n";
  
      my $res = {};
      my $backup = {};
  
      my %k = map {$_=>1} keys(%$hl), keys(%$hr);
      push @{ $mm->path }, "";
    K:
      for my $k (keys %k) {
          my @o;
          $mm->path->[-1] = $k;
          my $do_merge = 1;
          $do_merge = 0 if $do_merge && $em  &&  $mm->_in($k, $em);
          $do_merge = 0 if $do_merge && $im  && !$mm->_in($k, $im);
          $do_merge = 0 if $do_merge && $emr && $k =~ /$emr/;
          $do_merge = 0 if $do_merge && $imr && $k !~ /$imr/;
  
          if (!$do_merge) {
              $res->{$k} = $hl->{$k} if $hl->{$k};
              next K;
          }
  
          $backup->{$k} = $hl->{$k}[1] if $hl->{$k} && $hr->{$k};
          if ($hl->{$k}) {
              push @o, $hl->{$k};
          }
          if ($hr->{$k}) {
              my %m = map {$_=>$mm->modes->{$_}->precedence_level} keys %{ $hr->{$k} };
              #print "DEBUG: \\%m=".Data::Dumper->new([\%m])->Indent(0)->Terse(1)->Dump."\n";
              push @o, map { [$_, $hr->{$k}{$_}] } sort { $m{$b} <=> $m{$a} } keys %m;
          }
          my $final_mode;
          my $is_circular;
          my $v;
          #print "DEBUG: k=$k, o=".Data::Dumper->new([\@o])->Indent(0)->Terse(1)->Dump."\n";
          for my $i (0..$#o) {
              if ($i == 0) {
                  my $mh = $mm->modes->{$o[$i][0]};
                  if (@o == 1 &&
                          (($hl->{$k} && $mh->can("merge_left_only")) ||
                           ($hr->{$k} && $mh->can("merge_right_only")))) {
                      # there's only left-side or right-side
                      my $meth = $hl->{$k} ? "merge_left_only" : "merge_right_only";
                      my ($subnewkey, $v, $subbackup, $is_circular, $newmode) = $mh->$meth($k, $o[$i][1]); # XXX handle circular?
                      next K unless defined($subnewkey);
                      $final_mode = $newmode;
                      $v = $res;
                  } else {
                      $final_mode = $o[$i][0];
                      $v = $o[$i][1];
                  }
              } else {
                  my $m = $mm->combine_rules->{"$final_mode+$o[$i][0]"}
                      or do {
                          $mm->push_error("Can't merge $final_mode + $o[$i][0]");
                          return;
                      };
                  #print "DEBUG: merge $final_mode+$o[$i][0] = $m->[0], $m->[1]\n";
                  my ($subnewkey, $subbackup);
                  ($subnewkey, $v, $subbackup, $is_circular) = $mm->_merge($k, $v, $o[$i][1], $m->[0]);
                  return if @{ $mm->errors };
                  if ($is_circular) {
                      if ($i < $#o) {
                          $mm->push_error("Can't handle circular at $i of $#o merges (mode $m->[0]): not the last merge");
                          return;
                      }
                      #print "DEBUG: pushing todo to mem<".$mm->cur_mem_key.">\n";
                      push @{ $mm->mem->{ $mm->cur_mem_key }{todo} }, sub {
                          my ($subnewkey, $subres, $subbackup) = @_;
                          #print "DEBUG: Entering todo subroutine (k=$k)\n";
                          my $final_mode = $m->[1];
                          #XXX return unless defined($subnewkey);
                          $res->{$k} = [$m->[1], $subres];
                          if ($c->readd_prefix) {
                              # XXX if there is a conflict error in
                              # _readd_prefix, how to adjust path?
                              $self->_readd_prefix($res, $k, $c->default_mode);
                          } else {
                              $res->{$k} = $res->{$k}[1];
                          }
                      };
                      delete $res->{$k};
                  }
                  next K unless defined $subnewkey;
                  $final_mode = $m->[1];
              }
          }
          $res->{$k} = [$final_mode, $v] unless $is_circular;
      }
      pop @{ $mm->path };
      #print "DEBUG: Leaving _merge_gen, res = ".dmp($res)."\n";
      ($res, $backup);
  }
  
  # hh is {key=>[MODE, val], ...} which is the format returned by _merge_gen
  sub _readd_prefix {
      my ($self, $hh, $k, $defmode) = @_;
      my $mm = $self->merger;
      my $c = $mm->config;
  
      my $m = $hh->{$k}[0];
      if ($m eq $defmode) {
          $hh->{$k} = $hh->{$k}[1];
      } else {
          my $kp = $mm->modes->{$m}->add_prefix($k);
          if (exists $hh->{$kp}) {
              $mm->push_error("BUG: conflict when re-adding prefix after merge: $kp");
              return;
          }
          $hh->{$kp} = $hh->{$k}[1];
          delete $hh->{$k};
      }
  }
  
  sub merge_HASH_HASH {
      my ($self, $key, $l, $r, $mode) = @_;
      my $mm = $self->merger;
      my $c = $mm->config;
      $mode //= $c->default_mode;
      #print "DEBUG: entering merge_H_H(".dmp($l).", ".dmp($r).", $mode), config=($c)=",dmp($c),"\n";
      #$log->trace("using config($c)");
  
      return $self->merge_SCALAR_SCALAR($key, $l, $r) unless $c->recurse_hash;
      return if $c->wanted_path && !$mm->_path_is_included($mm->path, $c->wanted_path);
  
      # STEP 1. MERGE LEFT & RIGHT OPTIONS KEY
      my $config_replaced;
      my $orig_c = $c;
      my $ok = $c->options_key;
      {
          last unless defined $ok;
  
          my $okl = $self->_gen_left ($l, $mode, sub {$_[0] eq $ok});
          return if @{ $mm->errors };
  
          my $okr = $self->_gen_right($r, $mode, sub {$_[0] eq $ok});
          return if @{ $mm->errors };
  
          push @{ $mm->path }, $ok;
          my ($res, $backup);
          {
              local $c->{readd_prefix} = 0;
              ($res, $backup) = $self->_merge_gen($okl, $okr, $mode);
          }
          pop @{ $mm->path };
          return if @{ $mm->errors };
  
          #print "DEBUG: merge options key (".dmp($okl).", ".dmp($okr).") = ".dmp($res)."\n";
  
          $res = $res->{$ok} ? $res->{$ok}[1] : undef;
          if (defined($res) && ref($res) ne 'HASH') {
              $mm->push_error("Invalid options key after merge: value must be hash");
              return;
          }
          last unless keys %$res;
          #$log->tracef("cloning config ...");
          # Data::Clone by default does *not* deep-copy object
          #my $c2 = clone($c);
          my $c2 = bless({ %$c }, ref($c));
  
          for (keys %$res) {
              if ($c->allow_override) {
                  my $re = $c->allow_override;
                  if (!/$re/) {
                      $mm->push_error("Configuration in options key `$_` not allowed by allow_override $re");
                      return;
                  }
              }
              if ($c->disallow_override) {
                  my $re = $c->disallow_override;
                  if (/$re/) {
                      $mm->push_error("Configuration in options key `$_` not allowed by disallow_override $re");
                      return;
                  }
              }
              if ($mm->_in($_, $c->_config_config)) {
                  $mm->push_error("Configuration not allowed in options key: $_");
                  return;
              }
              if ($_ ne $ok && !$mm->_in($_, $c->_config_ok)) {
                  $mm->push_error("Unknown configuration in options key: $_");
                  return;
              }
              $c2->$_($res->{$_}) unless $_ eq $ok;
          }
          $mm->config($c2);
          $config_replaced++;
          $c = $c2;
          #$log->trace("config now changed to $c2");
      }
  
      my $sp = $c->set_prefix;
      my $saved_prefixes;
      if (defined($sp)) {
          if (ref($sp) ne 'HASH') {
              $mm->push_error("Invalid config value `set_prefix`: must be a hash");
              return;
          }
          $saved_prefixes = {};
          for my $mh (values %{ $mm->modes }) {
              my $n = $mh->name;
              if ($sp->{$n}) {
                  $saved_prefixes->{$n} = {
                      prefix => $mh->prefix,
                      prefix_re => $mh->prefix_re,
                      check_prefix_sub => $mh->check_prefix_sub,
                      add_prefix_sub => $mh->add_prefix_sub,
                      remove_prefix_sub => $mh->remove_prefix_sub,
                  };
                  $mh->prefix($sp->{$n});
                  my $re = quotemeta($sp->{$n});
                  $mh->prefix_re(qr/^$re/);
                  $mh->check_prefix_sub(undef);
                  $mh->add_prefix_sub(undef);
                  $mh->remove_prefix_sub(undef);
              }
          }
      }
  
      my $ep = $c->exclude_parse;
      my $ip = $c->include_parse;
      if (defined($ep) && ref($ep) ne 'ARRAY') {
          $mm->push_error("Invalid config value `exclude_parse`: must be an array");
          return;
      }
      if (defined($ip) && ref($ip) ne 'ARRAY') {
          $mm->push_error("Invalid config value `include_parse`: must be an array");
          return;
      }
  
      my $epr = $c->exclude_parse_regex;
      my $ipr = $c->include_parse_regex;
      if (defined($epr)) {
          eval { $epr = qr/$epr/ };
          if ($@) {
              $mm->push_error("Invalid config value `exclude_parse_regex`: invalid regex: $@");
              return;
          }
      }
      if (defined($ipr)) {
          eval { $ipr = qr/$ipr/ };
          if ($@) {
              $mm->push_error("Invalid config value `include_parse_regex`: invalid regex: $@");
              return;
          }
      }
  
      # STEP 2. PREPARE LEFT HASH
      my $hl = $self->_gen_left ($l, $mode, sub {defined($ok) ? $_[0] ne $ok : 1}, $ep, $ip, $epr, $ipr);
      return if @{ $mm->errors };
  
      # STEP 3. PREPARE RIGHT HASH
      my $hr = $self->_gen_right($r, $mode, sub {defined($ok) ? $_[0] ne $ok : 1}, $ep, $ip, $epr, $ipr);
      return if @{ $mm->errors };
  
      #print "DEBUG: hl=".Data::Dumper->new([$hl])->Indent(0)->Terse(1)->Dump."\n";
      #print "DEBUG: hr=".Data::Dumper->new([$hr])->Indent(0)->Terse(1)->Dump."\n";
  
      my $em = $c->exclude_merge;
      my $im = $c->include_merge;
      if (defined($em) && ref($em) ne 'ARRAY') {
          $mm->push_error("Invalid config value `exclude_marge`: must be an array");
          return;
      }
      if (defined($im) && ref($im) ne 'ARRAY') {
          $mm->push_error("Invalid config value `include_merge`: must be an array");
          return;
      }
  
      my $emr = $c->exclude_merge_regex;
      my $imr = $c->include_merge_regex;
      if (defined($emr)) {
          eval { $emr = qr/$emr/ };
          if ($@) {
              $mm->push_error("Invalid config value `exclude_merge_regex`: invalid regex: $@");
              return;
          }
      }
      if (defined($imr)) {
          eval { $imr = qr/$imr/ };
          if ($@) {
              $mm->push_error("Invalid config value `include_merge_regex`: invalid regex: $@");
              return;
          }
      }
  
      # STEP 4. MERGE LEFT & RIGHT
      my ($res, $backup) = $self->_merge_gen($hl, $hr, $mode, $em, $im, $emr, $imr);
      return if @{ $mm->errors };
  
      #print "DEBUG: intermediate res(5) = ".Data::Dumper->new([$res])->Indent(0)->Terse(1)->Dump."\n";
  
      # STEP 5. TURN BACK {key=>[MODE=>val]}, ...} INTO {(prefix)key => val, ...}
      if ($c->readd_prefix) {
          for my $k (keys %$res) {
              $self->_readd_prefix($res, $k, $c->default_mode);
          }
      } else {
          $res->{$_} = $res->{$_}[1] for keys %$res;
      }
  
      if ($saved_prefixes) {
          for (keys %$saved_prefixes) {
              my $mh = $mm->modes->{$_};
              my $s = $saved_prefixes->{$_};
              $mh->prefix($s->{prefix});
              $mh->prefix_re($s->{prefix_re});
              $mh->check_prefix_sub($s->{check_prefix_sub});
              $mh->add_prefix_sub($s->{add_prefix_sub});
              $mh->remove_prefix_sub($s->{remove_prefix_sub});
          }
      }
  
      # restore config
      if ($config_replaced) {
          $mm->config($orig_c);
          #print "DEBUG: Restored config, config=", dmp($mm->config), "\n";
      }
  
      #print "DEBUG: backup = ".Data::Dumper->new([$backup])->Indent(0)->Terse(1)->Dump."\n";
      #print "DEBUG: leaving merge_H_H, result = ".dmp($res)."\n";
      ($key, $res, $backup);
  }
  
  1;
  # ABSTRACT: Base class for Data::ModeMerge mode handler
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::ModeMerge::Mode::Base - Base class for Data::ModeMerge mode handler
  
  =head1 VERSION
  
  This document describes version 0.35 of Data::ModeMerge::Mode::Base (from Perl distribution Data-ModeMerge), released on 2016-07-22.
  
  =head1 SYNOPSIS
  
   use Data::ModeMerge;
  
  =head1 DESCRIPTION
  
  This is the base class for mode type handlers.
  
  =for Pod::Coverage ^(BUILD|merge_.+)$
  
  =head1 ATTRIBUTES
  
  =head2 merger
  
  =head2 prefix
  
  =head2 prefix_re
  
  =head2 check_prefix_sub
  
  =head2 add_prefix_sub
  
  =head2 remove_prefix_sub
  
  =head1 METHODS
  
  =head2 name
  
  Return name of mode. Subclass must override this method.
  
  =head2 precedence_level
  
  Return precedence level, which is a number. The greater the number,
  the higher the precedence. Subclass must override this method.
  
  =head2 default_prefix
  
  Return default prefix. Subclass must override this method.
  
  =head2 default_prefix_re
  
  Return default prefix regex. Subclass must override this method.
  
  =head2 check_prefix($hash_key)
  
  Return true if hash key has prefix for this mode.
  
  =head2 add_prefix($hash_key)
  
  Return hash key with added prefix of this mode.
  
  =head2 remove_prefix($hash_key)
  
  Return hash key with prefix of this mode prefix removed.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-ModeMerge>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-ModeMerge>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-ModeMerge>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_MODEMERGE_MODE_BASE

    $main::fatpacked{"Data/ModeMerge/Mode/CONCAT.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_MODEMERGE_MODE_CONCAT';
  package Data::ModeMerge::Mode::CONCAT;
  
  our $DATE = '2016-07-22'; # DATE
  our $VERSION = '0.35'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  use Mo qw(build default);
  extends 'Data::ModeMerge::Mode::ADD';
  
  sub name { 'CONCAT' }
  
  sub precedence_level { 2 }
  
  sub default_prefix { '.' }
  
  sub default_prefix_re { qr/^\./ }
  
  sub merge_SCALAR_SCALAR {
      my ($self, $key, $l, $r) = @_;
      ($key, ($l // "") . $r);
  }
  
  1;
  # ABSTRACT: Handler for Data::ModeMerge CONCAT merge mode
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::ModeMerge::Mode::CONCAT - Handler for Data::ModeMerge CONCAT merge mode
  
  =head1 VERSION
  
  This document describes version 0.35 of Data::ModeMerge::Mode::CONCAT (from Perl distribution Data-ModeMerge), released on 2016-07-22.
  
  =head1 SYNOPSIS
  
   use Data::ModeMerge;
  
  =head1 DESCRIPTION
  
  This is the class to handle CONCAT merge mode.
  
  =for Pod::Coverage ^merge_.*
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-ModeMerge>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-ModeMerge>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-ModeMerge>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_MODEMERGE_MODE_CONCAT

    $main::fatpacked{"Data/ModeMerge/Mode/DELETE.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_MODEMERGE_MODE_DELETE';
  package Data::ModeMerge::Mode::DELETE;
  
  our $DATE = '2016-07-22'; # DATE
  our $VERSION = '0.35'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  use Mo qw(build default);
  extends 'Data::ModeMerge::Mode::Base';
  
  sub name { 'DELETE' }
  
  sub precedence_level { 1 }
  
  sub default_prefix { '!' }
  
  sub default_prefix_re { qr/^!/ }
  
  # merge_left_only and merge_right_only are a bit different: they are
  # called with $l only or $r only instead of both, and should return an
  # extra argument $mode, i.e. ($key, $result, $backup, $is_circular,
  # $mode)
  sub merge_left_only {
      my ($self, $key, $l) = @_;
      return;
  }
  
  sub merge_right_only {
      my ($self, $key, $r) = @_;
      return;
  }
  
  sub merge_SCALAR_SCALAR {
      return;
  }
  
  sub merge_SCALAR_ARRAY {
      return;
  }
  
  sub merge_SCALAR_HASH {
      return;
  }
  
  sub merge_ARRAY_SCALAR {
      return;
  }
  
  sub merge_ARRAY_ARRAY {
      my ($self, $key, $l, $r) = @_;
      $self->merger->config->allow_destroy_array or
          $self->merger->push_error("Now allowed to destroy array via DELETE mode");
      return;
  }
  
  sub merge_ARRAY_HASH {
      return;
  }
  
  sub merge_HASH_SCALAR {
      return;
  }
  
  sub merge_HASH_ARRAY {
      return;
  }
  
  sub merge_HASH_HASH {
      my ($self, $key, $l, $r) = @_;
      $self->merger->config->allow_destroy_hash or
          $self->merger->push_error("Now allowed to destroy hash via DELETE mode");
      return;
  }
  
  1;
  # ABSTRACT: Handler for Data::ModeMerge DELETE merge mode
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::ModeMerge::Mode::DELETE - Handler for Data::ModeMerge DELETE merge mode
  
  =head1 VERSION
  
  This document describes version 0.35 of Data::ModeMerge::Mode::DELETE (from Perl distribution Data-ModeMerge), released on 2016-07-22.
  
  =head1 SYNOPSIS
  
   use Data::ModeMerge;
  
  =head1 DESCRIPTION
  
  This is the class to handle DELETE merge mode.
  
  =for Pod::Coverage ^merge_.*
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-ModeMerge>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-ModeMerge>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-ModeMerge>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_MODEMERGE_MODE_DELETE

    $main::fatpacked{"Data/ModeMerge/Mode/KEEP.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_MODEMERGE_MODE_KEEP';
  package Data::ModeMerge::Mode::KEEP;
  
  our $DATE = '2016-07-22'; # DATE
  our $VERSION = '0.35'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  use Mo qw(build default);
  extends 'Data::ModeMerge::Mode::Base';
  
  sub name { 'KEEP' }
  
  sub precedence_level { 6 }
  
  sub default_prefix { '^' }
  
  sub default_prefix_re { qr/^\^/ }
  
  sub merge_SCALAR_SCALAR {
      my ($self, $key, $l, $r) = @_;
      ($key, $l);
  }
  
  sub merge_SCALAR_ARRAY {
      my ($self, $key, $l, $r) = @_;
      ($key, $l);
  }
  
  sub merge_SCALAR_HASH {
      my ($self, $key, $l, $r) = @_;
      ($key, $l);
  }
  
  sub merge_ARRAY_SCALAR {
      my ($self, $key, $l, $r) = @_;
      ($key, $l);
  }
  
  sub merge_ARRAY_ARRAY {
      my ($self, $key, $l, $r) = @_;
      $self->SUPER::merge_ARRAY_ARRAY($key, $l, $r, 'KEEP');
  };
  
  sub merge_ARRAY_HASH {
      my ($self, $key, $l, $r) = @_;
      ($key, $l);
  }
  
  sub merge_HASH_SCALAR {
      my ($self, $key, $l, $r) = @_;
      ($key, $l);
  }
  
  sub merge_HASH_ARRAY {
      my ($self, $key, $l, $r) = @_;
      ($key, $l);
  }
  
  sub merge_HASH_HASH {
      my ($self, $key, $l, $r) = @_;
      $self->SUPER::merge_HASH_HASH($key, $l, $r, 'KEEP');
  };
  
  1;
  # ABSTRACT: Handler for Data::ModeMerge KEEP merge mode
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::ModeMerge::Mode::KEEP - Handler for Data::ModeMerge KEEP merge mode
  
  =head1 VERSION
  
  This document describes version 0.35 of Data::ModeMerge::Mode::KEEP (from Perl distribution Data-ModeMerge), released on 2016-07-22.
  
  =head1 SYNOPSIS
  
   use Data::ModeMerge;
  
  =head1 DESCRIPTION
  
  This is the class to handle KEEP merge mode.
  
  =for Pod::Coverage ^merge_.*
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-ModeMerge>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-ModeMerge>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-ModeMerge>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_MODEMERGE_MODE_KEEP

    $main::fatpacked{"Data/ModeMerge/Mode/NORMAL.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_MODEMERGE_MODE_NORMAL';
  package Data::ModeMerge::Mode::NORMAL;
  
  our $DATE = '2016-07-22'; # DATE
  our $VERSION = '0.35'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  use Mo qw(build default);
  extends 'Data::ModeMerge::Mode::Base';
  
  sub name { 'NORMAL' }
  
  sub precedence_level { 5 }
  
  sub default_prefix { '*' }
  
  sub default_prefix_re { qr/^\*/ }
  
  sub merge_SCALAR_SCALAR {
      my ($self, $key, $l, $r) = @_;
      ($key, $r);
  }
  
  sub merge_SCALAR_ARRAY {
      my ($self, $key, $l, $r) = @_;
      ($key, $r);
  }
  
  sub merge_SCALAR_HASH {
      my ($self, $key, $l, $r) = @_;
      ($key, $r);
  }
  
  sub merge_SCALAR_CODE {
      my ($self, $key, $l, $r) = @_;
      ($key, $r);
  }
  
  sub merge_ARRAY_SCALAR {
      my ($self, $key, $l, $r) = @_;
      ($key, $r);
  }
  
  sub merge_ARRAY_HASH {
      my ($self, $key, $l, $r) = @_;
      ($key, $r);
  }
  
  sub merge_ARRAY_CODE {
      my ($self, $key, $l, $r) = @_;
      ($key, $r);
  }
  
  sub merge_HASH_SCALAR {
      my ($self, $key, $l, $r) = @_;
      ($key, $r);
  }
  
  sub merge_HASH_ARRAY {
      my ($self, $key, $l, $r) = @_;
      ($key, $r);
  }
  
  sub merge_HASH_CODE {
      my ($self, $key, $l, $r) = @_;
      ($key, $r);
  }
  
  sub merge_CODE_SCALAR {
      my ($self, $key, $l, $r) = @_;
      ($key, $r);
  }
  
  sub merge_CODE_ARRAY {
      my ($self, $key, $l, $r) = @_;
      ($key, $r);
  }
  
  sub merge_CODE_HASH {
      my ($self, $key, $l, $r) = @_;
      ($key, $r);
  }
  
  sub merge_CODE_CODE {
      my ($self, $key, $l, $r) = @_;
      ($key, $r);
  }
  
  1;
  # ABSTRACT: Handler for Data::ModeMerge NORMAL merge mode
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::ModeMerge::Mode::NORMAL - Handler for Data::ModeMerge NORMAL merge mode
  
  =head1 VERSION
  
  This document describes version 0.35 of Data::ModeMerge::Mode::NORMAL (from Perl distribution Data-ModeMerge), released on 2016-07-22.
  
  =head1 SYNOPSIS
  
   use Data::ModeMerge;
  
  =head1 DESCRIPTION
  
  This is the class to handle NORMAL merge mode.
  
  =for Pod::Coverage ^merge_.*
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-ModeMerge>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-ModeMerge>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-ModeMerge>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_MODEMERGE_MODE_NORMAL

    $main::fatpacked{"Data/ModeMerge/Mode/SUBTRACT.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_MODEMERGE_MODE_SUBTRACT';
  package Data::ModeMerge::Mode::SUBTRACT;
  
  our $DATE = '2016-07-22'; # DATE
  our $VERSION = '0.35'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  use Mo qw(build default);
  extends 'Data::ModeMerge::Mode::NORMAL';
  
  sub name { 'SUBTRACT' }
  
  sub precedence_level { 4 }
  
  sub default_prefix { '-' }
  
  sub default_prefix_re { qr/^-/ }
  
  sub merge_SCALAR_SCALAR {
      my ($self, $key, $l, $r) = @_;
      ($key, $l - $r);
  }
  
  sub merge_SCALAR_ARRAY {
      my ($self, $key, $l, $r) = @_;
      $self->merger->push_error("Can't subtract scalar and array");
      return;
  }
  
  sub merge_SCALAR_HASH {
      my ($self, $key, $l, $r) = @_;
      $self->merger->push_error("Can't subtract scalar and hash");
      return;
  }
  
  sub merge_ARRAY_SCALAR {
      my ($self, $key, $l, $r) = @_;
      $self->merger->push_error("Can't subtract array and scalar");
      return;
  }
  
  sub merge_ARRAY_ARRAY {
      my ($self, $key, $l, $r) = @_;
      my @res;
      my $mm = $self->merger;
      for (@$l) {
          push @res, $_ unless $mm->_in($_, $r);
      }
      ($key, \@res);
  }
  
  sub merge_ARRAY_HASH {
      my ($self, $key, $l, $r) = @_;
      $self->merger->push_error("Can't subtract array and hash");
      return;
  }
  
  sub merge_HASH_SCALAR {
      my ($self, $key, $l, $r) = @_;
      $self->merger->push_error("Can't subtract hash and scalar");
      return;
  }
  
  sub merge_HASH_ARRAY {
      my ($self, $key, $l, $r) = @_;
      $self->merger->push_error("Can't subtract hash and array");
      return;
  }
  
  sub merge_HASH_HASH {
      my ($self, $key, $l, $r) = @_;
      my $mm = $self->merger;
  
      my %res;
      my $r2 = {};
      for (keys %$r) {
          my $k = $mm->check_prefix($_) ? $_ : $mm->add_prefix($_, 'DELETE');
          if ($k ne $_ && exists($r->{$k})) {
              $mm->push_error("Conflict when adding DELETE prefix on right-side hash key $_ ".
                              "for SUBTRACT merge: key $k already exists");
              return;
          }
          $r2->{$k} = $r->{$_};
      }
      $mm->_merge($key, $l, $r2, 'NORMAL');
  }
  
  1;
  # ABSTRACT: Handler for Data::ModeMerge SUBTRACT merge mode
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::ModeMerge::Mode::SUBTRACT - Handler for Data::ModeMerge SUBTRACT merge mode
  
  =head1 VERSION
  
  This document describes version 0.35 of Data::ModeMerge::Mode::SUBTRACT (from Perl distribution Data-ModeMerge), released on 2016-07-22.
  
  =head1 SYNOPSIS
  
   use Data::ModeMerge;
  
  =head1 DESCRIPTION
  
  This is the class to handle SUBTRACT merge mode.
  
  =for Pod::Coverage ^merge_.*
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-ModeMerge>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-ModeMerge>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-ModeMerge>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_MODEMERGE_MODE_SUBTRACT

    $main::fatpacked{"Data/Rmap.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_RMAP';
  package Data::Rmap;
  our $VERSION = 0.65;
  
  =head1 NAME
  
  Data::Rmap - recursive map, apply a block to a data structure
  
  =head1 SYNOPSIS
  
   $ perl -MData::Rmap -e 'print rmap { $_ } 1, [2,3], \\4, "\n"'
   1234
  
   $ perl -MData::Rmap=:all
   rmap_all { print (ref($_) || "?") ,"\n" } \@array, \%hash, \*glob;
  
   # OUTPUT (Note: a GLOB always has a SCALAR, hence the last two items)
   # ARRAY
   # HASH
   # GLOB
   # SCALAR
   # ?
  
  
   # Upper-case your leaves in-place
   $array = [ "a", "b", "c" ];
   $hash  = { key => "a value" };
   rmap { $_ = uc $_; } $array, $hash;
  
   use Data::Dumper; $Data::Dumper::Terse=1; $Data::Dumper::Indent=0;
   print Dumper($array), " ", Dumper($hash), "\n";
  
   # OUTPUT
   # ['A','B','C'] {'key' => 'A VALUE'}
  
  
   # Simple array dumper.
   # Uses $self->recurse method to alter traversal order
   ($dump) = rmap_to {
  
      return "'$_'" unless ref($_); # scalars are quoted and returned
  
      my $self = shift;
      # use $self->recurse to grab results and wrap them
      return '[ ' . join(', ', $self->recurse() ) . ' ]';
  
    } ARRAY|VALUE,  [ 1, [ 2, [ [ 3 ], 4 ] ], 5 ];
  
   print "$dump\n";
   # OUTPUT
   # [ '1', [ '2', [ [ '3' ], '4' ] ], '5' ]
  
  
  =head1 DESCRIPTION
  
   rmap BLOCK LIST
  
  Recursively evaluate a BLOCK over a list of data structures
  (locally setting $_ to each element) and return the list composed
  of the results of such evaluations.  $_ can be used to modify
  the elements.
  
  Data::Rmap currently traverses HASH, ARRAY, SCALAR and GLOB reference
  types and ignores others.  Depending on which rmap_* wrapper is used,
  the BLOCK is called for only scalar values, arrays, hashes, references,
  all elements or a customizable combination.
  
  The list of data structures is traversed pre-order in a depth-first fashion.
  That is, the BLOCK is called for the container reference before is it called
  for it's elements (although see "recurse" below for post-order).
  The values of a hash are traversed in the usual "values" order which
  may affect some applications.
  
  If the "cut" subroutine is called in the BLOCK then the traversal
  stops for that branch, say if you "cut" an array then the code is
  never called for it's elements (or their sub-elements).
  To simultaneously return values and cut, simply pass the return list
  to cut:  C<cut('add','to','returned');>
  
  The first parameter to the BLOCK is an object which maintains the
  state of the traversal.  Methods available on this object are
  described in L<State Object> below.
  
  =head1 EXPORTS
  
  By default:
  
   rmap, rmap_all, cut
  
  Optionally:
  
   rmap_scalar rmap_hash rmap_array rmap_code rmap_ref rmap_to
   :types => [ qw(NONE VALUE HASH ARRAY SCALAR REF CODE ALL) ],
   :all => ... # everything
  
  =head1 Functions
  
  The various names are just wrappers which select when to call
  the code BLOCK.  rmap_all always calls it, the others are more
  selective while rmap_to takes an extra parameter permitting you
  to provide selection criteria.  Furthermore, you can always
  just rmap_all and skip nodes which are not of interest.
  
  =over 4
  
  =item rmap_to { ... } $want, @data_structures;
  
  Most general first.
  
  Recurse the @data_structures and apply the BLOCK to
  elements selected by $want.  The $want parameter is the
  bitwise "or" of whatever types you choose (imported with :types):
  
   VALUE  - non-reference scalar, eg. 1
   HASH   - hash reference
   ARRAY  - array reference
   SCALAR - scalar refernce, eg. \1
   REF    - higher-level reference, eg. \\1, \\{}
            B<NOT> any reference type, see <Scalar::Util>'s reftype:
            perl -MScalar::Util=reftype -le 'print map reftype($_), \1, \\1'
   GLOB   - glob reference, eg. \*x
            (scalar, hash and array recursed, code too as of 0.63)
   ALL    - all of the above (not CODE)
   CODE   - code references (as of 0.63)
   NONE   - none of the above
  
  So to call the block for arrays and scalar values do:
  
   use Data::Rmap ':all';         # or qw(:types rmap_to)
   rmap { ... } ARRAY|VALUE, @data_structures;
  
  (ALL | CODE) and (ALL & !GLOB) might also be handy.
  
  The remainder of the wrappers are given in terms of the $want for rmap_to.
  
  =item rmap { ... } @list;
  
  Recurse and call the BLOCK on non-reference scalar values.  $want = VALUE
  
  =item rmap_all BLOCK LIST
  
  Recurse and call the BLOCK on everything.  $want = ALL
  
  =item rmap_scalar { ... }  @list
  
  Recurse and call the BLOCK on non-collection scalars.
  $want = VALUE|SCALAR|REF
  
  =item rmap_hash
  
  Recurse and call the BLOCK on hash refs.  $want = HASH
  
  =item rmap_array
  
  Recurse and call the BLOCK on array refs.  $want = ARRAY
  
  =item rmap_code
  
  Recurse and call the BLOCK on code refs.  $want = CODE
  
  =item rmap_ref
  
  Recurse and call the BLOCK on all "normal" references:
  $want = HASH|ARRAY|SCALAR|REF
  
  Note: rmap_ref isn't the same as rmap_to {} REF
  
  =item cut(@list)
  
  Don't traverse sub-elements and return the @list immediately.
  For example, if $_ is an ARRAY reference, then the array's elements
  are not traversed.
  
  If there's two paths to an element, both will need to be cut.
  
  =back
  
  =head1 State Object
  
  The first parameter to the BLOCK is an object which maintains
  most of the traversal state (except current node, which is $_).
  I<You will ignore it most of the time>.
  The "recurse" method may be useful.
  Other methods should only be used in throw away tools, see L<TODO>
  
  Methods:
  
  =over 4
  
  =item recurse
  
  Process child nodes of $_ now and return the result.
  
  This makes it easier to perform post-order and in-order
  processing of a structure.  Note that since the same "seen list"
  is used, the child nodes aren't reprocessed.
  
  =item code
  
  The code reference of the BLOCK itself.  Possible useful in
  some situations.
  
  =item seen
  
  Reference to the HASH used to track where we have visited.
  You may want to modify it in some situations (though I haven't yet).
  Beware circular references.  The (current) convention used for the key
  is in the source.
  
  =item want
  
  The $want state described in L<rmap_to>.
  
  =back
  
  =head1 EXAMPLES
  
   # command-line play
   $ perl -MData::Rmap -le 'print join ":", rmap { $_ } 1,2,[3..5],\\6'
   1:2:3:4:5:6
  
  
   # Linearly number questions on a set of pages
   my $qnum = 1;
   rmap_hash {
       $_->{qnum} = $qnum++ if($_->{qn});
   } @pages;
  
  
   # Grep recursively, finding ALL objects
   use Scalar::Util qw(blessed);
   my @objects = rmap_ref {
       blessed($_) ? $_ : ();
   } $data_structure;
  
  
   # Grep recursively, finding public objects (note the cut)
   use Scalar::Util qw(blessed);
   my @objects = rmap_ref {
       blessed($_) ?  cut($_) : ();
   } $data_structure;
  
  
   # Return a modified structure
   # (result flattening means we must cheat by cloning then modifying)
   use Storable qw(dclone);
   use Lingua::EN::Numbers::Easy;
  
   $words = [ 1, \2, { key => 3 } ];
   $nums = dclone $words;
   rmap { $_ = $N{$_} || $_ } $nums;
  
  
   # Make an assertion about a structure
   use Data::Dump;
   rmap_ref {
      blessed($_) && $_->isa('Question') && defined($_->name)
          or die "Question doesn't have a name:", dump($_);
   } @pages;
  
  
   # Traverse a tree using localize state
   $tree = [
       one =>
       two =>
       [
           three_one =>
           three_two =>
           [
               three_three_one =>
           ],
           three_four =>
       ],
       four =>
       [
           [
               five_one_one =>
           ],
       ],
   ];
  
   @path = ('q');
   rmap_to {
       if(ref $_) {
           local(@path) = (@path, 1); # ARRAY adds a new level to the path
           $_[0]->recurse(); # does stuff within local(@path)'s scope
       } else {
           print join('.', @path), " = $_ \n"; # show the scalar's path
       }
       $path[-1]++; # bump last element (even when it was an aref)
   } ARRAY|VALUE, $tree;
  
   # OUTPUT
   # q.1 = one
   # q.2 = two
   # q.3.1 = three_one
   # q.3.2 = three_two
   # q.3.3.1 = three_three_one
   # q.3.4 = three_four
   # q.4 = four
   # q.5.1.1 = five_one_one
  
   # replace CODE with "<CODE>"
   $ perl -MData::Rmap=:all -E 'say join ":", rmap_code { "<CODE>" } sub{},sub{}'
   <CODE>:<CODE>
  
   # look inside code refs with PadWalker
   $ perl -MData::Rmap=:all -MSub::Identify=:all -MPadWalker=:all -MSub::Name
     use 5.10.0;
     my $s = sub {}; sub A::a { $s };
     say join ", ",
      rmap_code {
          sub_fullname($_),                       # name string
          map { $_[0]->recurse } closed_over($_)  # then recurse the sub innards
      } \*A::a, subname b => sub { $s };
     # A::a, main::__ANON__, main::b
  
  =head1 Troubleshooting
  
  Beware comma after block:
  
   rmap { print }, 1..3;
                 ^-------- bad news, you get an empty list:
   rmap(sub { print $_; }), 1..3;
  
  If you don't import a function, perl's confusion may produce:
  
   $ perl -MData::Rmap -le 'rmap_scalar { print } 1'
   Can't call method "rmap_scalar" without a package or object reference...
  
   $ perl -MData::Rmap -le 'rmap_scalar { $_++ } 1'
   Can't call method "rmap_scalar" without a package or object reference...
  
  If there's two paths to an element, both will need to be cut.
  
  If there's two paths to an element, one will be taken randomly when
  there is an intervening hash.
  
  Autovivification can lead to "Deep recursion" warnings if you test
  C<< exists $_->{this}{that} >> instead of
  C<< exists $_->{this} && exists $_->{this}{that} >>
  as you may follow a long chain of "this"s
  Alternatively use the "no autovivification" pragma to avoid this problem.
  
  =head1 TODO
  
  put for @_ in wrapper to allow parameters in a different wrapper,
  solve localizing problem.
  
  Store custom localized data about the traversal.
  Seems too difficult and ugly when compare to doing it at the call site.
  Should support multiple reentrancy so avoid the symbol table.
  
  C<rmap_args { } $data_structure, @args> form to pass parameters.
  Could potentially help localizing needs.  (Maybe only recurse last item)
  
  Benchmark.  Use array based object and/or direct access internally.
  
  Think about permitting different callback for different types.
  The prototype syntax is a bit too flaky....
  
  Ensure that no memory leaks are possible, leaking the closure.
  
  =head1 SEE ALSO
  
  map, grep, L<Storable>'s dclone, L<Scalar::Util>'s reftype and blessed
  
  Faint traces of treemap:
  
   http://www.perlmonks.org/index.pl?node_id=60829
  
  Update: various alternatives have appear over the years,
  L<Data::Visitor> has a list.
  
  =head1 AUTHOR
  
  Brad Bowman E<lt>rmap@bereft.netE<gt>
  
  =head1 LICENCE AND COPYRIGHT
  
  Copyright (c) 2004- Brad Bowman (E<lt>rmap@bereft.netE<gt>).
  All rights reserved.
  
  This module is free software; you can redistribute it and/or
  modify it under the same terms as Perl itself.
  See L<perlartistic> and L<perlgpl>.
  
  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  
  =cut
  
  # Early design discussion:
  # http://www.perlmonks.org/index.pl?node_id=295642
  # wantarray
  # http://www.class-dbi.com/cgi-bin/wiki/index.cgi?AtomicUpdates
  
  use warnings;
  use strict;
  use Carp qw(croak);
  use Scalar::Util qw(blessed refaddr reftype);
  
  require Exporter;
  our @ISA = qw(Exporter);
  our @EXPORT = qw(rmap rmap_all cut);
  our %EXPORT_TAGS = (
      types => [ qw(NONE VALUE HASH ARRAY SCALAR REF GLOB CODE ALL) ],
  );
  our @EXPORT_OK = ( qw(rmap_scalar rmap_hash rmap_array rmap_code rmap_ref rmap_to),
                  @{ $EXPORT_TAGS{types} } );
  
  $EXPORT_TAGS{all} = [ @EXPORT, @EXPORT_OK ];
  
  
  # Uses stringifying instead of S::U::ref* b/c it's under control
  my $cut = \do { my $thing }; # my = out of symbol table
  sub cut {
      die $cut = [@_]; # cut can return
  }
  
  sub NONE()   { 0 }
  sub VALUE()  { 1 }
  sub HASH()   { 2 }
  sub ARRAY()  { 4 }
  sub SCALAR() { 8 }
  sub REF()    { 16 }
  sub GLOB()   { 32 }
  sub CODE()   { 64 }
  sub ALL()    { VALUE|HASH|ARRAY|SCALAR|REF|GLOB }
  # Others like CODE, Regex, etc are ignored
  
  my %type_bits = (
      HASH => HASH,
      ARRAY => ARRAY,
      SCALAR => SCALAR,
      REF => REF,
      GLOB => GLOB,
      CODE => CODE,
      # reftype actually returns undef for:
      VALUE => VALUE,
  );
  
  sub new {
      bless { code => $_[1], want => $_[2], seen => $_[3] }, $_[0];
  }
  sub code { $_[0]->{code} }
  sub want { $_[0]->{want} }
  sub seen { $_[0]->{seen} }
  sub call { $_[0]->{code}->($_[0]) }
  
  sub recurse {
      # needs to deref $_ and *then* run the code, enter _recurse directly
      $_[0]->_recurse(); # cut not needed as seen remembers
  }
  
  sub rmap (&@) {
      __PACKAGE__->new(shift, VALUE, {})->_rmap(@_);
  }
  
  sub rmap_all (&@) {
      __PACKAGE__->new(shift, ALL, {})->_rmap(@_);
  }
  
  sub rmap_scalar (&@) {
      __PACKAGE__->new(shift, VALUE|SCALAR|REF, {})->_rmap(@_);
  }
  
  sub rmap_hash (&@) {
      __PACKAGE__->new(shift, HASH, {})->_rmap(@_);
  }
  
  sub rmap_array (&@) {
      __PACKAGE__->new(shift, ARRAY, {})->_rmap(@_);
  }
  
  sub rmap_code (&@) {
      __PACKAGE__->new(shift, CODE, {})->_rmap(@_);
  }
  
  sub rmap_ref (&@) {
      __PACKAGE__->new(shift, HASH|ARRAY|SCALAR|REF, {})->_rmap(@_);
  }
  
  sub rmap_to (&@) {
      __PACKAGE__->new(shift, shift, {})->_rmap(@_);
  }
  
  sub _rmap {
      my $self = shift;
      my @return;
  
      for (@_) { # just one after the wrapper call
          my ($key, $type);
  
          if($type = reftype($_)) {
              $key = refaddr $_;
              $type = $type_bits{$type} or next;
          } else {
              $key = "V:".refaddr(\$_); # prefix to distinguish from \$_
              $type = VALUE;
          }
  
          next if ( exists $self->seen->{$key} );
          $self->seen->{$key} = undef;
  
          # Call the $code
          if($self->want & $type) {
              my $e; # local($@) and rethrow caused problems
              my @got;
              {
                  local ($@); # don't trample, cut impl. should be transparent
                  # call in array context.  pass block for reentrancy
                  @got = eval { $self->call() };
                  $e = $@;
              }
  
              if($e) {
                  if(ref($e) && $e == $cut) {
                      push @return, @$cut; # cut can add to return list
                      next; # they're cutting, don't recurse
                  } else {
                      die $e;
                  }
              }
              push @return, @got;
          }
  
          push @return, $self->_recurse(); # process $_ node
      }
      return @return;
  }
  
  sub _recurse {
      my $self = shift;
      my $type = $type_bits{reftype($_) || 'VALUE'} or return;
      my @return;
  
      # Recurse appropriately, keeping $_ alias
      if ($type & HASH) {
          push @return, $self->_rmap($_) for values %$_;
      } elsif ($type & ARRAY) {
          # Does this change cut behaviour? No, cut is one scalar ref
          #push @return, _rmap($code, $want, $seen, $_) for @$_;
          push @return, $self->_rmap(@$_);
      } elsif ($type & (SCALAR|REF) ) {
          push @return, $self->_rmap($$_);
      } elsif ($type & GLOB) {
          # SCALAR is always there, undef may be unused or set to undef
          push @return, $self->_rmap(*$_{SCALAR});
          defined *$_{ARRAY} and
              push @return, $self->_rmap(*$_{ARRAY});
          defined *$_{HASH} and
              push @return, $self->_rmap(*$_{HASH});
          defined *$_{CODE} and
              push @return, $self->_rmap(*$_{CODE});
          # Is it always: *f{GLOB} == \*f ?
          # Also PACKAGE NAME GLOB
      }
      return @return;
  }
  
  1;
DATA_RMAP

    $main::fatpacked{"Data/Sah.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH';
  package Data::Sah;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-02-12'; # DATE
  our $DIST = 'Data-Sah'; # DIST
  our $VERSION = '0.907'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  #use Log::ger;
  
  use Mo qw(build default);
  
  our $Log_Validator_Code = $ENV{LOG_SAH_VALIDATOR_CODE} // 0;
  
  use Data::Sah::Normalize qw(
                         $type_re
                         $clause_name_re
                         $clause_re
                         $attr_re
                         $funcset_re
                         $compiler_re
                         );
  
  require Exporter;
  our @ISA       = qw(Exporter);
  our @EXPORT_OK = qw(normalize_schema gen_validator);
  
  # store Data::Sah::Compiler::* instances
  has compilers    => (is => 'rw', default => sub { {} });
  
  has _var_enumer  => (
      is      => 'rw',
      lazy    => 1,
      default => sub {
          require Language::Expr::Interpreter::var_enumer;
          Language::Expr::Interpreter::var_enumer->new;
      },
  );
  
  sub normalize_clset {
      require Scalar::Util;
  
      my $self;
      if (Scalar::Util::blessed($_[0])) {
          $self = shift;
      } else {
          $self = __PACKAGE__->new;
      }
  
      Data::Sah::Normalize::normalize_clset($_[0]);
  }
  
  sub normalize_schema {
      require Scalar::Util;
  
      my $self;
      if (Scalar::Util::blessed($_[0])) {
          $self = shift;
      } else {
          $self = __PACKAGE__->new;
      }
      my ($s) = @_;
  
      Data::Sah::Normalize::normalize_schema($_[0]);
  }
  
  sub gen_validator {
      require Scalar::Util;
  
      my $self;
      if (Scalar::Util::blessed($_[0])) {
          $self = shift;
      } else {
          $self = __PACKAGE__->new;
      }
      my ($schema, $opts) = @_;
      my %args = (schema => $schema, %{$opts // {}});
      my $opt_source = delete $args{source};
  
      $args{log_result} = 1 if $Log_Validator_Code;
  
      my $pl = $self->get_compiler("perl");
      my $code = $pl->expr_validator_sub(%args);
      return $code if $opt_source;
  
      my $res = eval $code;
      die "Can't compile validator: $@" if $@;
      $res;
  }
  
  sub get_compiler {
      my ($self, $name) = @_;
      return $self->compilers->{$name} if $self->compilers->{$name};
  
      die "Invalid compiler name `$name`" unless $name =~ $compiler_re;
      my $module = "Data::Sah::Compiler::$name";
      if (!eval "require $module; 1") {
          die "Can't load compiler module $module".($@ ? ": $@" : "");
      }
  
      my $obj = $module->new(main => $self);
      $self->compilers->{$name} = $obj;
  
      return $obj;
  }
  
  sub normalize_var {
      my ($self, $var, $curpath) = @_;
      die "Not yet implemented";
  }
  
  1;
  # ABSTRACT: Fast and featureful data structure validation
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah - Fast and featureful data structure validation
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =head1 SYNOPSIS
  
  Non-OO interface:
  
   use Data::Sah qw(
       normalize_schema
       gen_validator
   );
  
   my $v;
  
   # generate a validator for schema
   $v = gen_validator(["int*", min=>1, max=>10]);
  
   # validate your data using the generated validator
   say "valid" if $v->(5);     # valid
   say "valid" if $v->(11);    # invalid
   say "valid" if $v->(undef); # invalid
   say "valid" if $v->("x");   # invalid
  
   # generate validator which reports error message string
   $v = gen_validator(["int*", min=>1, max=>10],
                      {return_type=>'str_errmsg', lang=>'id_ID'});
   # ditto but the error message will be in Indonesian
   $v = gen_validator(["int*", min=>1, max=>10],
                      {return_type=>'str_errmsg', lang=>'id_ID'});
   say $v->(5);  # ''
   say $v->(12); # 'Data tidak boleh lebih besar dari 10'
                 # (in English: 'Data must not be larger than 10')
  
   # normalize a schema
   my $nschema = normalize_schema("int*"); # => ["int", {req=>1}, {}]
   normalize_schema(["int*", min=>0]); # => ["int", {min=>0, req=>1}, {}]
  
  OO interface (more advanced usage):
  
   use Data::Sah;
   my $sah = Data::Sah->new;
  
   # get perl compiler
   my $pl = $sah->get_compiler("perl");
  
   # compile schema into Perl code
   my $cd = $pl->compile(schema => ["int*", min=>0]);
   say $cd->{result};
  
  will print something like:
  
   # req #0
   (defined($data))
   &&
   # check type 'int'
   (Scalar::Util::Numeric::isint($data))
   &&
   (# clause: min
   ($data >= 0))
  
  To see the full validator code (with C<sub {}> and all), you can do something
  like:
  
   % LOG_SAH_VALIDATOR_CODE=1 TRACE=1 perl -MLog::ger::LevelFromEnv -MLog::ger::Output=Screen -MData::Sah=gen_validator -E'gen_validator(["int*", min=>0])'
  
  which will print log message like:
  
   normalized schema=['int',{min => 0,req => 1},{}]
   validator code:
      1|do {
      2|    require Scalar::Util::Numeric;
      3|    sub {
      4|        my ($data) = @_;
      5|        my $_sahv_res =
       |
      7|            # req #0
      8|            (defined($data))
       |
     10|            &&
       |
     12|            # check type 'int'
     13|            (Scalar::Util::Numeric::isint($data))
       |
     15|            &&
       |
     17|            (# clause: min
     18|            ($data >= 0));
       |
     20|        return($_sahv_res);
     21|    }}
  
  =head1 DESCRIPTION
  
  This distribution, C<Data-Sah>, implements compilers for producing Perl and
  JavaScript validators, as well as translatable human description text from
  L<Sah> schemas. Compiler approach is used instead of interpreter for faster
  speed.
  
  The generated validator code can run without the C<Data::Sah::*> modules.
  
  =head1 STATUS
  
  Some features are not implemented yet:
  
  =over
  
  =item * def/subschema
  
  =item * obj: meths, attrs properties
  
  =item * .prio, .err_msg, .ok_err_msg attributes
  
  =item * .result_var attribute
  
  =item * BaseType: more forms of if clause
  
  Only the basic form of the C<if> clause is implemented.
  
  =item * BaseType: postfilters
  
  =item * BaseType: prefilters.temp
  
  =item * BaseType: check, prop, check_prop clauses
  
  =item * HasElems: each_index, check_each_elem, check_each_index, exists clauses
  
  =item * HasElems: len, elems, indices properties
  
  =item * hash: check_each_key, check_each_value, allowed_keys_re, forbidden_keys_re clauses
  
  =item * array: uniq clauses
  
  =item * human compiler: markdown output
  
  =back
  
  =head1 VARIABLES
  
  =head2 C<$Log_Validator_Code> (bool, default: 0)
  
  =head1 MODULE ORGANIZATION
  
  B<Data::Sah::Type::*> roles specify Sah types, e.g. C<Data::Sah::Type::bool>
  specifies the bool type. It can also be used to name distributions that
  introduce new types, e.g. C<Data-Sah-Type-complex> which introduces complex
  number type.
  
  B<Data::Sah::FuncSet::*> roles specify bundles of functions, e.g.
  <Data::Sah::FuncSet::Core> specifies the core/standard functions.
  
  B<Data::Sah::Compiler::$LANG::> namespace is for compilers. Each compiler might
  further contain C<::TH::*> (type handler) and C<::FSH::*> (function handler)
  subnamespaces to implement appropriate functionalities, e.g.
  L<Data::Sah::Compiler::perl::TH::bool> is the bool type handler for the Perl
  compiler, L<Data::Sah::Compiler::perl::FSH::Core> is the Core funcset handler
  for Perl compiler.
  
  B<Data::Sah::Coerce::$LANG::To_$TARGET_TYPE::From_$SOURCE_TYPE::$DESCRIPTION>
  contains coercion rules.
  
  B<Data::Sah::Filter::$LANG::$TOPIC::$DESCRIPTION> contains filtering rules.
  
  B<Data::Sah::TypeX::$TYPENAME::$CLAUSENAME> namespace can be used to name
  distributions that extend an existing Sah type by introducing a new clause for
  it. See L<Data::Sah::Manual::Extending> for an example.
  
  B<Data::Sah::Lang::$LANGCODE> namespaces are for modules that contain
  translations. They are further organized according to the organization of other
  Data::Sah modules, e.g. L<Data::Sah::Lang::en_US::Type::int> or
  C<Data::Sah::Lang::en_US::TypeX::str::is_palindrome>.
  
  B<Sah::Schema::> namespace is reserved for modules that contain bundles of
  schemas. For example, C<Sah::Schema::CPANMeta> contains the schema to validate
  CPAN META.yml. L<Sah::Schema::Int> contains various schemas for integers such as
  C<pos_int>, C<int8>, C<uint32>. L<Sah::Schema::Sah> contains the schema for Sah
  schema itself.
  
  B<Sah::SchemaR::> namespace is reserved to store resolved version of schema. For
  example, L<Sah::Schema::unix::local_username> contains the definition for the
  schema C<unix::local_username> which is C<unix::username> with some additional
  coerce rules. C<unix::username> in turn is defined in
  L<Sah::Schema::unix::username> which is base type C<str> with some clauses like
  minimum and maximum length as well as regular expression for valid pattern. To
  find out the base type of a schema (which might be defined based on another
  schema), one has to perform one to several lookups to C<Sah::Schema::*> modules.
  A C<Sah::SchemaR::*> module, however, contains the "B<r>esolved" version of the
  definition, so by looking at L<Sah::SchemaR::unix::local_username> one can know
  that the schema eventually is based on the base type C<str>. See
  L<Dist::Zilla::Plugin::Sah::Schemas>.
  
  B<Sah::SchemaV::> namespace is reserved to store generated schema validator
  code. See L<Dist::Zilla::Plugin::Rinci::GenValidator>.
  
  =head1 FUNCTIONS
  
  None exported by default.
  
  =head2 normalize_schema($schema) => ARRAY
  
  Normalize C<$schema>.
  
  Can also be used as a method.
  
  =head2 gen_validator($schema, \%opts) => CODE (or STR)
  
  Generate validator code for C<$schema>. Can also be used as a method. Known
  options (unknown options will be passed to Perl schema compiler):
  
  =over
  
  =item * accept_ref => BOOL (default: 0)
  
  Normally the generated validator accepts data, as in:
  
   $res = $vdr->($data);
   $res = $vdr->(42);
  
  If this option is set to true, validator accepts reference to data instead, as
  in:
  
   $res = $vdr->(\$data);
  
  This allows $data to be modified by the validator (mainly, to set default value
  specified in schema). For example:
  
   my $data;
   my $vdr = gen_validator([int => {min=>0, max=>10, default=>5}],
                           {accept_ref=>1});
   my $res = $vdr->(\$data);
   say $res;  # => 1 (success)
   say $data; # => 5
  
  =item * source => BOOL (default: 0)
  
  If set to 1, return source code string instead of compiled subroutine. Usually
  only needed for debugging (but see also C<$Log_Validator_Code> and
  C<LOG_SAH_VALIDATOR_CODE> if you want to log validator source code).
  
  =back
  
  =head1 ATTRIBUTES
  
  =head2 compilers => HASH
  
  A mapping of compiler name and compiler (C<Data::Sah::Compiler::*>) objects.
  
  =head1 METHODS
  
  =head2 new() => OBJ
  
  Create a new Data::Sah instance.
  
  =head2 $sah->get_compiler($name) => OBJ
  
  Get compiler object. C<Data::Sah::Compiler::$name> will be loaded first and
  instantiated if not already so. After that, the compiler object is cached.
  
  Example:
  
   my $plc = $sah->get_compiler("perl"); # loads Data::Sah::Compiler::perl
  
  =head2 $sah->normalize_schema($schema) => HASH
  
  Normalize a schema, e.g. change C<int*> into C<< [int => {req=>1}] >>, as well
  as do some sanity checks on it. Returns the normalized schema if succeeds, or
  dies on error.
  
  Can also be used as a function.
  
  Note: this functionality is implemented in L<Data::Sah::Normalize> (distributed
  separately in Data-Sah-Normalize). Use that module instead if you just need
  normalizing schemas, to reduce dependencies.
  
  =head2 $sah->normalize_clset($clset[, \%opts]) => HASH
  
  Normalize a clause set, e.g. change C<< {"!match"=>"abc"} >> into C<<
  {"match"=>"abc", "match.op"=>"not"} >>. Produce a shallow copy of the input
  clause set hash.
  
  Can also be used as a function.
  
  =head2 $sah->normalize_var($var) => STR
  
  Normalize a variable name in expression into its fully qualified/absolute form.
  
  Not yet implemented (pending specification).
  
  For example:
  
   [int => {min => 10, 'max=' => '2*$min'}]
  
  $min in the above expression will be normalized as C<schema:clauses.min>.
  
  =head2 $sah->gen_validator($schema, \%opts) => CODE
  
  Use the Perl compiler to generate validator code. Can also be used as a
  function. See the documentation as a function for list of known options.
  
  =head1 FAQ
  
  See also L<Sah::FAQ>.
  
  =head2 Comparison to {JSON::Schema, Data::Rx, Data::FormValidator, ...}?
  
  See L<Sah::FAQ>.
  
  =head2 Why is it so slow?
  
  You probably do not reuse the compiled schema, e.g. you continually destroy and
  recreate Data::Sah object, or repeatedly recompile the same schema. To gain the
  benefit of compilation, you need to keep the compiled result and use the
  generated Perl code repeatedly.
  
  =head2 Can I generate another schema dynamically from within the schema?
  
  For example:
  
   // if first element is an integer, require the array to contain only integers,
   // otherwise require the array to contain only strings.
   ["array", {"min_len": 1, "of=": "[is_int($_[0]) ? 'int':'str']"}]
  
  Currently no, Data::Sah does not support expression on clauses that contain
  other schemas. In other words, dynamically generated schemas are not supported.
  To support this, if the generated code needs to run independent of Data::Sah, it
  needs to contain the compiler code itself (or an interpreter) to compile or
  evaluate the generated schema.
  
  However, an C<eval_schema()> Sah function which uses Data::Sah can be trivially
  declared and target the Perl compiler.
  
  =head2 How to display the validator code being generated?
  
  Use the C<< source => 1 >> option in C<gen_validator()>.
  
  If you use the OO interface, e.g.:
  
   # generate perl code
   my $cd = $plc->compile(schema=>..., ...);
  
  then the generated code is in C<< $cd->{result} >> and you can just print it.
  
  If you generate validator using C<gen_validator()>, you can set environment
  LOG_SAH_VALIDATOR_CODE or package variable C<$Log_Validator_Code> to true and
  the generated code will be logged at trace level using L<Log::ger>. The log can
  be displayed using, e.g., L<Log::ger::Output::Screen>:
  
   % LOG_SAH_VALIDATOR_CODE=1 TRACE=1 \
     perl -MLog::ger::LevelFromEnv -MLog::ger::Output=Screen \
     -MData::Sah=gen_validator -e '$sub = gen_validator([int => min=>1, max=>10])'
  
  Sample output:
  
   normalized schema=['int',{max => 10,min => 1},{}]
   schema already normalized, skipped normalization
   validator code:
      1|do {
      2|    require Scalar::Util::Numeric;
      3|    sub {
      4|        my ($data) = @_;
      5|        my $_sahv_res =
       |
      7|            # skip if undef
      8|            (!defined($data) ? 1 :
       |
     10|            (# check type 'int'
     11|            (Scalar::Util::Numeric::isint($data))
       |
     13|            &&
       |
     15|            (# clause: min
     16|            ($data >= 1))
       |
     18|            &&
       |
     20|            (# clause: max
     21|            ($data <= 10))));
       |
     23|        return($_sahv_res);
     24|    }}
  
  Lastly, you can also use L<validate-with-sah> CLI utility from the
  L<App::SahUtils> distribution (use the C<--show-code> option).
  
  =head2 How to show the validation error message? The validator only returns true/false!
  
  Pass the C<< return_type=>"str_errmsg" >> to get an error message string on
  error, or C<< return_type=>"hash_details" >> to get a hash of detailed error
  messages. Note also that the error messages are translateable (e.g. use C<LANG>
  or C<< lang=>... >> option. For example:
  
   my $v = gen_validator([int => between => [1,10]], {return_type=>"str_errmsg"});
   say "$_: ", $v->($_) for 1, "x", 12;
  
  will output:
  
   1:
   "x": Input is not of type integer
   12: Must be between 1 and 10
  
  =head2 How to show all the error and warning messages?
  
  If you pass C<< return_type=>"hash_details" >> then the generated validator code
  can return a hashref containing all the errors (in the C<errors> key) and
  warnings (in the C<warnings> key) instead of just a boolean (when C<<
  return_type=>"bool_valid" >>) or a string containing the first encountered error
  message (when C<< return_type=>"str_errmsg" >>) .
  
  =head2 How to get the data value with the default filled in, or coercion done?
  
  If you use C<< return_type=>"hash_details" >>, the generated validator code will
  also return the input data after the default is filled in or coercion is done in
  the C<value> key of the result hashref. Or, if you do not need a validator that
  checks for all errors/warnings, you can use C<< return_type=>"bool_valid+val" >>
  or C<< return_type=>"str_errmsg+val" >>. For example:
  
   my $v = gen_validator(["date", {"x.perl.coerce_to"=>"DateTime"}],
                         {return_type=>"str_errmsg+val"});
  
   my ($err, $val) = @{ $v->("2016-05-14") };
  
  The validator will return an error message string (or an empty string if
  validation succeeds) as well as the final value. In the example above, C<$val>
  will contain a L<DateTime> object. This is convenient because the final value is
  what is usually used further after validation process.
  
  =head2 What does the C<@...> prefix that is sometimes shown on the error message mean?
  
  It shows the path to data item that fails the validation, e.g.:
  
   my $v = gen_validator([array => of => [int=>min=>5], {return_type=>"str_errmsg"});
   say $v->([10, 5, "x"]);
  
  prints:
  
   @[2]: Input is not of type integer
  
  which means that the third element (subscript 2) of the array fails the
  validation. Another example:
  
   my $v = gen_validator([array => of => [hash=>keys=>{a=>"int"}]]);
   say $v->([{}, {a=>1.1}]);
  
  prints:
  
   @[1][a]: Input is not of type integer
  
  Note that for validator that returns full result hashref (C<<
  return_type=>"hash_details" >>) the error messages in the C<errors> key are also
  keyed with data path, albeit in a slightly different format (i.e.
  slash-separated, e.g. C<2> and C<1/a>) for easier parsing.
  
  =head2 How to show the process of validation by the compiled code?
  
  If you are generating Perl code from schema, you can pass C<< debug=>1 >> option
  so the code contains logging (L<Log::ger>-based) and other debugging
  information, which you can display. For example:
  
   % TRACE=1 perl -MLog::ger::LevelFromEnv -MLog::ger::Output=Screen \
     -MData::Sah=gen_validator -E'
     $v = gen_validator([array => of => [hash => {req_keys=>["a"]}]],
                        {return_type=>"str_errmsg", debug=>1});
     say "Validation result: ", $v->([{a=>1}, "x"]);'
  
  will output:
  
   ...
   [spath=[]]skip if undef ...
   [spath=[]]check type 'array' ...
   [spath=['of']]clause: {"of":["hash",{"req_keys":["a"]}]} ...
   [spath=['of']]skip if undef ...
   [spath=['of']]check type 'hash' ...
   [spath=['of','req_keys']]clause: {"req_keys":["a"]} ...
   [spath=['of']]skip if undef ...
   [spath=['of']]check type 'hash' ...
   Validation result: [spath=of]@1: Input is not of type hash
  
  =head2 What else can I do with the compiled code?
  
  Data::Sah offers some options in code generation. Beside compiling the validator
  code into a subroutine, there are also some other options. Examples:
  
  =over
  
  =item * L<Dist::Zilla::Plugin::Rinci::Validate>
  
  This plugin inserts the generated code (without the C<sub { ... }> wrapper) to
  validate the content of C<%args> right before C<# VALIDATE_ARG> or C<#
  VALIDATE_ARGS> like below:
  
   $SPEC{foo} = {
       args => {
           arg1 => { schema => ..., req=>1 },
           arg2 => { schema => ... },
       },
       ...
   };
   sub foo {
       my %args = @_; # VALIDATE_ARGS
   }
  
  The schemas will be retrieved from the Rinci metadata (C<$SPEC{foo}> above).
  This means, subroutines in your built distribution will do argument validation.
  
  =item * L<Perinci::Sub::Wrapper>
  
  This module is part of the L<Perinci> family. What the module does is basically
  wrap your subroutine with a wrapper code that can include validation code (among
  others). This is a convenient way to add argument validation to an existing
  subroutine/code.
  
  =back
  
  =head1 ENVIRONMENT
  
  =head2 LOG_SAH_VALIDATOR_CODE => bool
  
  If set to true, will log (using L<Log::ger>, at the trace level) the validator
  code being generated. See L</"SYNOPSIS"> or L</"FAQ"> for example on how to see
  this log message.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  =head3 Other interpreted validators
  
  L<Params::Validate> is very fast, although minimal. L<Data::Rx>, L<Kwalify>,
  L<Data::Verifier>, L<Data::Validator>, L<JSON::Schema>, L<Validation::Class>.
  
  For Moo/Mouse/Moose stuffs: L<Moose> type system, L<MooseX::Params::Validate>,
  among others.
  
  Form-oriented: L<Data::FormValidator>, L<FormValidator::Lite>, among others.
  
  =head3 Other compiled validators
  
  L<Type::Tiny>
  
  L<Params::ValidationCompiler>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH

    $main::fatpacked{"Data/Sah/Coerce.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COERCE';
  package Data::Sah::Coerce;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-02-12'; # DATE
  our $DIST = 'Data-Sah-Coerce'; # DIST
  our $VERSION = '0.047'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  no warnings 'once';
  use Log::ger;
  
  use Data::Sah::CoerceCommon;
  
  use Exporter qw(import);
  our @EXPORT_OK = qw(gen_coercer);
  
  our %SPEC;
  
  our $Log_Coercer_Code = $ENV{LOG_SAH_COERCER_CODE} // 0;
  
  $SPEC{gen_coercer} = {
      v => 1.1,
      summary => 'Generate coercer code',
      description => <<'_',
  
  This is mostly for testing. Normally the coercion rules will be used from
  <pm:Data::Sah>.
  
  _
      args => {
          %Data::Sah::CoerceCommon::gen_coercer_args,
      },
      result_naked => 1,
  };
  sub gen_coercer {
      my %args = @_;
  
      my $rt = $args{return_type} // 'val';
      # old values still supported but deprecated
      $rt = 'bool_coerced+val' if $rt eq 'status+val';
      $rt = 'bool_coerced+str_errmsg+val' if $rt eq 'status+err+val';
  
      my $rules = Data::Sah::CoerceCommon::get_coerce_rules(
          %args,
          compiler=>'perl',
          data_term=>'$data',
      );
  
      my $code;
      if (@$rules) {
          my $code_require = '';
          my %mem;
          for my $rule (@$rules) {
              next unless $rule->{modules};
              for my $mod (keys %{$rule->{modules}}) {
                  next if $mem{$mod}++;
                  $code_require .= "require $mod;\n";
              }
          }
  
          my $expr;
          for my $i (reverse 0..$#{$rules}) {
              my $rule = $rules->[$i];
              my $prev_term;
              if ($i == $#{$rules}) {
                  if ($rt eq 'val') {
                      $prev_term = '$data';
                  } elsif ($rt eq 'bool_coerced+val') {
                      $prev_term = '[undef, $data]';
                  } else { # bool_coerced+str_errmsg+val
                      $prev_term = '[undef, undef, $data]';
                  }
              } else {
                  $prev_term = $expr;
              }
  
              if ($rt eq 'val') {
                  if ($rule->{meta}{might_fail}) {
                      $expr = "do { if ($rule->{expr_match}) { my \$res = $rule->{expr_coerce}; \$res->[0] ? undef : \$res->[1] } else { $prev_term } }";
                  } else {
                      $expr = "($rule->{expr_match}) ? ($rule->{expr_coerce}) : $prev_term";
                  }
              } elsif ($rt eq 'bool_coerced+val') {
                  if ($rule->{meta}{might_fail}) {
                      $expr = "do { if ($rule->{expr_match}) { my \$res = $rule->{expr_coerce}; \$res->[0] ? [1,\$res->[1]] : [1,\$res->[1]] } else { $prev_term } }";
                  } else {
                      $expr = "($rule->{expr_match}) ? [1, $rule->{expr_coerce}] : $prev_term";
                  }
              } else { # bool_coerced+str_errmsg+val
                  if ($rule->{meta}{might_fail}) {
                      $expr = "do { if ($rule->{expr_match}) { my \$res = $rule->{expr_coerce}; \$res->[0] ? [1, \$res->[0], \$res->[1]] : [1, undef, \$res->[1]] } else { $prev_term } }";
                  } else {
                      $expr = "($rule->{expr_match}) ? [1, undef, $rule->{expr_coerce}] : $prev_term";
                  }
              }
          }
  
          $code = join(
              "",
              $code_require,
              "sub {\n",
              "    my \$data = shift;\n",
              "    unless (defined \$data) {\n",
              "        ", ($rt eq 'val' ? "return undef;" :
                               $rt eq 'bool_coerced+val' ? "return [undef, undef];" :
                               "return [undef, undef, undef];" # bool_coerced+str_errmsg+val
                           ), "\n",
              "    }\n",
              "    $expr;\n",
              "}",
          );
      } else {
          if ($rt eq 'val') {
              $code = 'sub { $_[0] }';
          } elsif ($rt eq 'bool_coerced+val') {
              $code = 'sub { [undef, $_[0]] }';
          } else { # bool_coerced+str_errmsg+val
              $code = 'sub { [undef, undef, $_[0]] }';
          }
      }
  
      if ($Log_Coercer_Code) {
          log_trace("Coercer code (gen args: %s): %s", \%args, $code);
      }
  
      return $code if $args{source};
  
      my $coercer = eval $code;
      die if $@;
      $coercer;
  }
  
  1;
  # ABSTRACT: Coercion rules for Data::Sah
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Coerce - Coercion rules for Data::Sah
  
  =head1 VERSION
  
  This document describes version 0.047 of Data::Sah::Coerce (from Perl distribution Data-Sah-Coerce), released on 2020-02-12.
  
  =head1 SYNOPSIS
  
   use Data::Sah::Coerce qw(gen_coercer);
  
   # a utility routine: gen_coercer
   my $c = gen_coercer(
       type               => 'date',
       coerce_to          => 'DateTime',
       coerce_rules       => ['From_str::natural'],  # explicitly enable a rule, etc
       # return_type      => 'str+val',              # default is 'val'
   );
  
   my $val = $c->(123);          # unchanged, 123
   my $val = $c->(1463307881);   # becomes a DateTime object
   my $val = $c->("2016-05-15"); # becomes a DateTime object
   my $val = $c->("2016foo");    # unchanged, "2016foo"
  
  =head1 DESCRIPTION
  
  This distribution contains a standard set of coercion rules for L<Data::Sah>. It
  is separated from the C<Data-Sah> distribution and can be used independently.
  
  A coercion rule is put in
  C<Data::Sah::Coerce::$COMPILER::To_$TARGET_TYPE::From_$SOURCE_TYPE::DESCRIPTION>
  module, for example: L<Data::Sah::Coerce::perl::To_date::From_float::epoch> for
  converting date from integer (Unix epoch) or
  L<Data::Sah::Coerce::perl::To_date::From_str::iso8601> for converting date from
  ISO8601 strings like "2016-05-15".
  
  Basically, a coercion rule will provide an expression (C<expr_match>) that
  evaluates to true when data can be coerced, and an expression (C<expr_coerce>)
  to actually coerce/convert data to the target type. This rule can be combined
  with other rules to form the final coercion code.
  
  The module must contain C<meta> subroutine which must return a hashref that has
  the following keys (C<*> marks that the key is required):
  
  =over
  
  =item * v* => int (default: 1)
  
  Metadata specification version. From L<DefHash>. Currently at 4.
  
  History: bumped from 3 to 4 to remove C<enable_by_default> property. Now the
  list of standard (enabled-by-default) coercion rules is maintained in
  Data::Sah::Coerce itself. This allows us to skip scanning all
  Data::Sah::Coerce::* coercion modules installed on the system. Data::Sah::Coerce
  still accepts version 3; it just ignores the C<enable_by_default> property.
  
  History: bumped from 2 to 3 to allow coercion expression to return error message
  explaining why coercion fails. The C<might_die> metadata property is replaced
  with C<might_fail>. When C<might_fail> is set to true, C<expr_coerce> must
  return array containing error message and coerced data, instead of just coerced
  data.
  
  History: Bumped from 1 to 2 to exclude old module names.
  
  =item * summary => str
  
  From L<DefHash>.
  
  =item * might_fail => bool (default: 0)
  
  Whether coercion might fail, e.g. because of invalid input. If set to 1,
  C<expr_coerce> key that the C<coerce()> routine returns must be an expression
  that returns an array (envelope) of C<< (error_msg, data) >> instead of just
  coerced data. Error message should be a string that is set when coercion fails
  and explains why. Otherwise, if coercion succeeds, the error message string
  should be set to undefined value.
  
  An example of a rule like this is coercing from string in the form of
  "YYYY-MM-DD" to a DateTime object. The rule might match any string in the form
  of C<< /\A(\d{4})-(\d{2})-(\d{2})\z/ >> while it might not be a valid date.
  
  This is used for coercion rules that act as a data checker.
  
  =item * prio => int (0-100, default: 50)
  
  This is to regulate the ordering of rules. The higher the number, the lower the
  priority (meaning the rule will be put further back). Rules that are
  computationally more expensive and/or match more broadly in general should be
  put further back (lower priority, higher number).
  
  =item * precludes => array of (str|re)
  
  List the other rules or rule patterns that are precluded by this rule. Rules
  that are mutually exclusive or pure alternatives to one another (e.g. date
  coercien rules
  L<From_str::natural|Data::Sah::Coerce::To_date::From_str::natural> vs
  L<From_str::flexible|Data::Sah::Coerce::To_date::From_str::flexible> both parse
  natural language date string; there is usually little to none of usefulness in
  using both; besides, both rules match all string and dies when failing to parse
  the string. So in C<From_str::natural> rule, you'll find this metadata:
  
   precludes => [qr/\A(From_str::alami(_.+)?|From_str::natural)\z/]
  
  and in C<From_str::flexible> rule you'll find this metadata:
  
   precludes => [qr/\A(From_str::alami(_.+)?|From_str::flexible)\z/]
  
  Also note that rules which are specifically requested to be used (e.g. using
  C<x.perl.coerce_rules> attribute in Sah schema) will still be precluded.
  
  =back
  
  The module must also contain C<coerce> subroutine which must generate the code
  for coercion. The subroutine must accept a hash of arguments (C<*> indicates
  required arguments):
  
  =over
  
  =item * data_term => str
  
  =item * coerce_to => str
  
  Some Sah types are "abstract" and can be represented using a choice of several
  actual types in the target programming language. For example, "date" can be
  represented in Perl as an integer (Unix epoch value), or a DateTime object, or a
  Time::Moment object.
  
  Not all target Sah types will need this argument.
  
  =back
  
  The C<coerce> subroutine must return a hashref with the following keys (C<*>
  indicates required keys):
  
  =over
  
  =item * expr_match => str
  
  Expression in the target language to test whether the data can be coerced. For
  example, in C<Data::Sah::Coerce::perl::To_date::From_float::epoch>, only
  integers ranging from 10^8 to 2^31 are converted into date. Non-integers or
  integers outside this range are not coerced.
  
  =item * expr_coerce => str
  
  Expression in the target language to actually convert data to the target type.
  
  =item * modules => hash
  
  A list of modules required by the expressions.
  
  =back
  
  Basically, the C<coerce> subroutine must generates a code that accepts a
  non-undef data and must convert this data to the desired type/format under the
  right condition. The code to match the right condition must be put in
  C<expr_match> and the code to convert data must be put in C<expr_coerce>.
  
  Program/library that uses Data::Sah::Coerce can collect rules from the rule
  modules then compose them into the final code, something like (in pseudocode):
  
   if (data is undef) {
     return undef;
   } elsif (data matches expr-match-from-rule1) {
     return expr-coerce-from-rule1;
   } elsif (data matches expr-match-from-rule2) {
     return expr-coerce-from-rule1;
   ...
   } else {
     # does not match any expr-match
     return original data;
   }
  
  =head1 VARIABLES
  
  =head2 $Log_Coercer_Code => bool (default: from ENV or 0)
  
  If set to true, will log the generated coercer code (currently using L<Log::ger>
  at trace level). To see the log message, e.g. to the screen, you can use
  something like:
  
   % TRACE=1 perl -MLog::ger::LevelFromEnv -MLog::ger::Output=Screen \
       -MData::Sah::Coerce=gen_coercer -E'my $c = gen_coercer(...)'
  
  =head1 FUNCTIONS
  
  
  =head2 gen_coercer
  
  Usage:
  
   gen_coercer() -> any
  
  Generate coercer code.
  
  This is mostly for testing. Normally the coercion rules will be used from
  L<Data::Sah>.
  
  This function is not exported by default, but exportable.
  
  No arguments.
  
  Return value:  (any)
  
  =head1 ENVIRONMENT
  
  =head2 LOG_SAH_COERCER_CODE => bool
  
  Set default for C<$Log_Coercer_Code>.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah-Coerce>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah-Coerce>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah-Coerce>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Data::Sah>
  
  L<Data::Sah::CoerceJS>
  
  L<App::SahUtils>, including L<coerce-with-sah> to conveniently test coercion
  from the command-line.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COERCE

    $main::fatpacked{"Data/Sah/Coerce/js/To_bool/From_float/zero_one.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COERCE_JS_TO_BOOL_FROM_FLOAT_ZERO_ONE';
  package Data::Sah::Coerce::js::To_bool::From_float::zero_one;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-02-12'; # DATE
  our $DIST = 'Data-Sah-Coerce'; # DIST
  our $VERSION = '0.047'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  sub meta {
      +{
          v => 4,
          summary => 'Coerce 0 to false and 1 to true',
          prio => 50,
      };
  }
  
  sub coerce {
      my %args = @_;
  
      my $dt = $args{data_term};
  
      my $res = {};
  
      $res->{expr_match} = join(
          " && ",
          "typeof($dt)=='number'",
          "$dt == 0 || $dt == 1",
      );
  
      # XXX how to avoid matching twice? even three times now
  
      $res->{expr_coerce} = "$dt == 1 ? true : false";
  
      $res;
  }
  
  1;
  # ABSTRACT: Coerce 0 to false and 1 to true
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Coerce::js::To_bool::From_float::zero_one - Coerce 0 to false and 1 to true
  
  =head1 VERSION
  
  This document describes version 0.047 of Data::Sah::Coerce::js::To_bool::From_float::zero_one (from Perl distribution Data-Sah-Coerce), released on 2020-02-12.
  
  =head1 SYNOPSIS
  
  To use in a Sah schema:
  
   ["bool",{"x.perl.coerce_rules"=>["From_float::zero_one"]}]
  
  =head1 DESCRIPTION
  
  Convert number 1 to false and 0 to true. Any other number is not coerced to
  boolean.
  
  =for Pod::Coverage ^(meta|coerce)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah-Coerce>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah-Coerce>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah-Coerce>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COERCE_JS_TO_BOOL_FROM_FLOAT_ZERO_ONE

    $main::fatpacked{"Data/Sah/Coerce/js/To_bool/From_str/common_words.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COERCE_JS_TO_BOOL_FROM_STR_COMMON_WORDS';
  package Data::Sah::Coerce::js::To_bool::From_str::common_words;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-02-12'; # DATE
  our $DIST = 'Data-Sah-Coerce'; # DIST
  our $VERSION = '0.047'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  sub meta {
      +{
          v => 4,
          summary => 'Coerce from common true/false words (e.g. "true","yes","on" for true, and "false","no","off" to false)',
          prio => 50,
      };
  }
  
  sub coerce {
      my %args = @_;
  
      my $dt = $args{data_term};
  
      my $res = {};
  
      my $re      = '/^(yes|no|true|false|on|off|1|0)$/i';
      my $re_true = '/^(yes|true|on|1)$/i';
  
      $res->{expr_match} = join(
          " && ",
          "typeof($dt)=='string'",
          "$dt.match($re)",
      );
  
      # XXX how to avoid matching twice? even three times now
  
      $res->{expr_coerce} = "(function(_m) { _m = $dt.match($re); return _m[1].match($re_true) ? true : false })()";
  
      $res;
  }
  
  1;
  # ABSTRACT: Coerce from common true/false words (e.g. "true","yes","on" for true, and "false","no","off" to false)
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Coerce::js::To_bool::From_str::common_words - Coerce from common true/false words (e.g. "true","yes","on" for true, and "false","no","off" to false)
  
  =head1 VERSION
  
  This document describes version 0.047 of Data::Sah::Coerce::js::To_bool::From_str::common_words (from Perl distribution Data-Sah-Coerce), released on 2020-02-12.
  
  =head1 SYNOPSIS
  
  To use in a Sah schema:
  
   ["bool",{"x.perl.coerce_rules"=>["From_str::common_words"]}]
  
  =head1 DESCRIPTION
  
  Convert some strings like "true", "yes", "on", "1" (matched case-insensitively)
  to boolean true.
  
  Convert "false", "no", "off", "0" (matched case-insensitively) to boolean false.
  
  All other strings are not coerced to boolean.
  
  =for Pod::Coverage ^(meta|coerce)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah-Coerce>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah-Coerce>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah-Coerce>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COERCE_JS_TO_BOOL_FROM_STR_COMMON_WORDS

    $main::fatpacked{"Data/Sah/Coerce/js/To_date/From_float/epoch.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COERCE_JS_TO_DATE_FROM_FLOAT_EPOCH';
  package Data::Sah::Coerce::js::To_date::From_float::epoch;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-02-12'; # DATE
  our $DIST = 'Data-Sah-Coerce'; # DIST
  our $VERSION = '0.047'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  sub meta {
      +{
          v => 4,
          summary => 'Coerce date from number (assumed to be epoch)',
          prio => 50,
      };
  }
  
  sub coerce {
      my %args = @_;
  
      my $dt = $args{data_term};
  
      my $res = {};
  
      $res->{expr_match} = join(
          " && ",
          "typeof($dt)=='number'",
          "$dt >= " . (10**8),
          "$dt <= " . (2**31),
      );
  
      $res->{expr_coerce} = "(new Date($dt * 1000))";
  
      $res;
  }
  
  1;
  # ABSTRACT: Coerce date from number (assumed to be epoch)
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Coerce::js::To_date::From_float::epoch - Coerce date from number (assumed to be epoch)
  
  =head1 VERSION
  
  This document describes version 0.047 of Data::Sah::Coerce::js::To_date::From_float::epoch (from Perl distribution Data-Sah-Coerce), released on 2020-02-12.
  
  =head1 SYNOPSIS
  
  To use in a Sah schema:
  
   ["date",{"x.perl.coerce_rules"=>["From_float::epoch"]}]
  
  =head1 DESCRIPTION
  
  To avoid confusion with integer that contains "YYYY", "YYYYMM", or "YYYYMMDD",
  we only do this coercion if data is an integer between 10^8 and 2^31.
  
  =for Pod::Coverage ^(meta|coerce)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah-Coerce>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah-Coerce>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah-Coerce>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COERCE_JS_TO_DATE_FROM_FLOAT_EPOCH

    $main::fatpacked{"Data/Sah/Coerce/js/To_date/From_obj/date.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COERCE_JS_TO_DATE_FROM_OBJ_DATE';
  package Data::Sah::Coerce::js::To_date::From_obj::date;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-02-12'; # DATE
  our $DIST = 'Data-Sah-Coerce'; # DIST
  our $VERSION = '0.047'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  sub meta {
      +{
          v => 4,
          summary => 'Coerce date from Date object',
          might_fail => 1, # we return error when date is invalid
          prio => 50,
      };
  }
  
  sub coerce {
      my %args = @_;
  
      my $dt = $args{data_term};
  
      my $res = {};
  
      $res->{expr_match} = join(
          " && ",
          "($dt instanceof Date)",
      );
  
      $res->{expr_coerce} = "isNaN($dt) ? ['Invalid date', $dt] : [null, $dt]";
  
      $res;
  }
  
  1;
  # ABSTRACT: Coerce date from Date object
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Coerce::js::To_date::From_obj::date - Coerce date from Date object
  
  =head1 VERSION
  
  This document describes version 0.047 of Data::Sah::Coerce::js::To_date::From_obj::date (from Perl distribution Data-Sah-Coerce), released on 2020-02-12.
  
  =head1 SYNOPSIS
  
  To use in a Sah schema:
  
   ["date",{"x.perl.coerce_rules"=>["From_obj::date"]}]
  
  =head1 DESCRIPTION
  
  This is basically just to throw an error when date is invalid.
  
  =for Pod::Coverage ^(meta|coerce)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah-Coerce>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah-Coerce>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah-Coerce>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COERCE_JS_TO_DATE_FROM_OBJ_DATE

    $main::fatpacked{"Data/Sah/Coerce/js/To_date/From_str/date_parse.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COERCE_JS_TO_DATE_FROM_STR_DATE_PARSE';
  package Data::Sah::Coerce::js::To_date::From_str::date_parse;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-02-12'; # DATE
  our $DIST = 'Data-Sah-Coerce'; # DIST
  our $VERSION = '0.047'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  sub meta {
      +{
          v => 4,
          summary => 'Coerce date from string using Date.parse()',
          might_fail => 1, # we throw exception date is invalid
          prio => 50,
      };
  }
  
  sub coerce {
      my %args = @_;
  
      my $dt = $args{data_term};
  
      my $res = {};
  
      $res->{expr_match} = join(
          " && ",
          "typeof($dt)=='string'",
      );
  
      # note: (function(a,b,c){...})() is a trick to simulate lexical variables
      $res->{expr_coerce} = "(function (_m) { _m = new Date($dt); if (isNaN(_m)) { return ['Invalid date', _m] } else { return [null, _m] } })()";
  
      $res;
  }
  
  1;
  # ABSTRACT: Coerce date from string using Date.parse()
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Coerce::js::To_date::From_str::date_parse - Coerce date from string using Date.parse()
  
  =head1 VERSION
  
  This document describes version 0.047 of Data::Sah::Coerce::js::To_date::From_str::date_parse (from Perl distribution Data-Sah-Coerce), released on 2020-02-12.
  
  =head1 SYNOPSIS
  
  To use in a Sah schema:
  
   ["date",{"x.perl.coerce_rules"=>["From_str::date_parse"]}]
  
  =head1 DESCRIPTION
  
  This will simply use JavaScript's C<Date.parse()>, but will throw an error when
  date is invalid.
  
  =for Pod::Coverage ^(meta|coerce)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah-Coerce>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah-Coerce>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah-Coerce>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COERCE_JS_TO_DATE_FROM_STR_DATE_PARSE

    $main::fatpacked{"Data/Sah/Coerce/js/To_datenotime/From_float/epoch.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COERCE_JS_TO_DATENOTIME_FROM_FLOAT_EPOCH';
  package Data::Sah::Coerce::js::To_datenotime::From_float::epoch;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-02-12'; # DATE
  our $DIST = 'Data-Sah-Coerce'; # DIST
  our $VERSION = '0.047'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  use subroutines 'Data::Sah::Coerce::js::To_date::From_float::epoch';
  
  1;
  # ABSTRACT: Coerce date from number (assumed to be epoch)
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Coerce::js::To_datenotime::From_float::epoch - Coerce date from number (assumed to be epoch)
  
  =head1 VERSION
  
  This document describes version 0.047 of Data::Sah::Coerce::js::To_datenotime::From_float::epoch (from Perl distribution Data-Sah-Coerce), released on 2020-02-12.
  
  =head1 SYNOPSIS
  
  To use in a Sah schema:
  
   ["datenotime",{"x.perl.coerce_rules"=>["From_float::epoch"]}]
  
  =head1 DESCRIPTION
  
  To avoid confusion with integer that contains "YYYY", "YYYYMM", or "YYYYMMDD",
  we only do this coercion if data is an integer between 10^8 and 2^31.
  
  =for Pod::Coverage ^(meta|coerce)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah-Coerce>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah-Coerce>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah-Coerce>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COERCE_JS_TO_DATENOTIME_FROM_FLOAT_EPOCH

    $main::fatpacked{"Data/Sah/Coerce/js/To_datenotime/From_obj/date.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COERCE_JS_TO_DATENOTIME_FROM_OBJ_DATE';
  package Data::Sah::Coerce::js::To_datenotime::From_obj::date;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-02-12'; # DATE
  our $DIST = 'Data-Sah-Coerce'; # DIST
  our $VERSION = '0.047'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  use subroutines 'Data::Sah::Coerce::js::To_date::From_obj::date';
  
  1;
  # ABSTRACT: Coerce date from Date object
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Coerce::js::To_datenotime::From_obj::date - Coerce date from Date object
  
  =head1 VERSION
  
  This document describes version 0.047 of Data::Sah::Coerce::js::To_datenotime::From_obj::date (from Perl distribution Data-Sah-Coerce), released on 2020-02-12.
  
  =head1 SYNOPSIS
  
  To use in a Sah schema:
  
   ["datenotime",{"x.perl.coerce_rules"=>["From_obj::date"]}]
  
  =head1 DESCRIPTION
  
  This is basically just to throw an error when date is invalid.
  
  =for Pod::Coverage ^(meta|coerce)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah-Coerce>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah-Coerce>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah-Coerce>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COERCE_JS_TO_DATENOTIME_FROM_OBJ_DATE

    $main::fatpacked{"Data/Sah/Coerce/js/To_datenotime/From_str/date_parse.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COERCE_JS_TO_DATENOTIME_FROM_STR_DATE_PARSE';
  package Data::Sah::Coerce::js::To_datenotime::From_str::date_parse;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-02-12'; # DATE
  our $DIST = 'Data-Sah-Coerce'; # DIST
  our $VERSION = '0.047'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  use subroutines 'Data::Sah::Coerce::js::To_date::From_str::date_parse';
  
  1;
  # ABSTRACT: Coerce date from string using Date.parse()
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Coerce::js::To_datenotime::From_str::date_parse - Coerce date from string using Date.parse()
  
  =head1 VERSION
  
  This document describes version 0.047 of Data::Sah::Coerce::js::To_datenotime::From_str::date_parse (from Perl distribution Data-Sah-Coerce), released on 2020-02-12.
  
  =head1 SYNOPSIS
  
  To use in a Sah schema:
  
   ["datenotime",{"x.perl.coerce_rules"=>["From_str::date_parse"]}]
  
  =head1 DESCRIPTION
  
  This will simply use JavaScript's C<Date.parse()>, but will throw an error when
  date is invalid.
  
  =for Pod::Coverage ^(meta|coerce)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah-Coerce>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah-Coerce>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah-Coerce>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COERCE_JS_TO_DATENOTIME_FROM_STR_DATE_PARSE

    $main::fatpacked{"Data/Sah/Coerce/js/To_datetime/From_float/epoch.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COERCE_JS_TO_DATETIME_FROM_FLOAT_EPOCH';
  package Data::Sah::Coerce::js::To_datetime::From_float::epoch;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-02-12'; # DATE
  our $DIST = 'Data-Sah-Coerce'; # DIST
  our $VERSION = '0.047'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  use subroutines 'Data::Sah::Coerce::js::To_date::From_float::epoch';
  
  1;
  # ABSTRACT: Coerce date from number (assumed to be epoch)
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Coerce::js::To_datetime::From_float::epoch - Coerce date from number (assumed to be epoch)
  
  =head1 VERSION
  
  This document describes version 0.047 of Data::Sah::Coerce::js::To_datetime::From_float::epoch (from Perl distribution Data-Sah-Coerce), released on 2020-02-12.
  
  =head1 SYNOPSIS
  
  To use in a Sah schema:
  
   ["datetime",{"x.perl.coerce_rules"=>["From_float::epoch"]}]
  
  =head1 DESCRIPTION
  
  To avoid confusion with integer that contains "YYYY", "YYYYMM", or "YYYYMMDD",
  we only do this coercion if data is an integer between 10^8 and 2^31.
  
  =for Pod::Coverage ^(meta|coerce)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah-Coerce>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah-Coerce>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah-Coerce>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COERCE_JS_TO_DATETIME_FROM_FLOAT_EPOCH

    $main::fatpacked{"Data/Sah/Coerce/js/To_datetime/From_obj/date.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COERCE_JS_TO_DATETIME_FROM_OBJ_DATE';
  package Data::Sah::Coerce::js::To_datetime::From_obj::date;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-02-12'; # DATE
  our $DIST = 'Data-Sah-Coerce'; # DIST
  our $VERSION = '0.047'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  use subroutines 'Data::Sah::Coerce::js::To_date::From_obj::date';
  
  1;
  # ABSTRACT: Coerce date from Date object
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Coerce::js::To_datetime::From_obj::date - Coerce date from Date object
  
  =head1 VERSION
  
  This document describes version 0.047 of Data::Sah::Coerce::js::To_datetime::From_obj::date (from Perl distribution Data-Sah-Coerce), released on 2020-02-12.
  
  =head1 SYNOPSIS
  
  To use in a Sah schema:
  
   ["datetime",{"x.perl.coerce_rules"=>["From_obj::date"]}]
  
  =head1 DESCRIPTION
  
  This is basically just to throw an error when date is invalid.
  
  =for Pod::Coverage ^(meta|coerce)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah-Coerce>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah-Coerce>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah-Coerce>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COERCE_JS_TO_DATETIME_FROM_OBJ_DATE

    $main::fatpacked{"Data/Sah/Coerce/js/To_datetime/From_str/date_parse.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COERCE_JS_TO_DATETIME_FROM_STR_DATE_PARSE';
  package Data::Sah::Coerce::js::To_datetime::From_str::date_parse;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-02-12'; # DATE
  our $DIST = 'Data-Sah-Coerce'; # DIST
  our $VERSION = '0.047'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  use subroutines 'Data::Sah::Coerce::js::To_date::From_str::date_parse';
  
  1;
  # ABSTRACT: Coerce date from string using Date.parse()
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Coerce::js::To_datetime::From_str::date_parse - Coerce date from string using Date.parse()
  
  =head1 VERSION
  
  This document describes version 0.047 of Data::Sah::Coerce::js::To_datetime::From_str::date_parse (from Perl distribution Data-Sah-Coerce), released on 2020-02-12.
  
  =head1 SYNOPSIS
  
  To use in a Sah schema:
  
   ["datetime",{"x.perl.coerce_rules"=>["From_str::date_parse"]}]
  
  =head1 DESCRIPTION
  
  This will simply use JavaScript's C<Date.parse()>, but will throw an error when
  date is invalid.
  
  =for Pod::Coverage ^(meta|coerce)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah-Coerce>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah-Coerce>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah-Coerce>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COERCE_JS_TO_DATETIME_FROM_STR_DATE_PARSE

    $main::fatpacked{"Data/Sah/Coerce/js/To_duration/From_float/seconds.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COERCE_JS_TO_DURATION_FROM_FLOAT_SECONDS';
  package Data::Sah::Coerce::js::To_duration::From_float::seconds;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-02-12'; # DATE
  our $DIST = 'Data-Sah-Coerce'; # DIST
  our $VERSION = '0.047'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  sub meta {
      +{
          v => 4,
          summary => 'Coerce duration from number (assumed to be number of seconds)',
          prio => 50,
      };
  }
  
  sub coerce {
      my %args = @_;
  
      my $dt = $args{data_term};
      my $coerce_to = $args{coerce_to};
  
      my $res = {};
  
      $res->{expr_match} = join(
          " && ",
          "(typeof($dt)=='number' || typeof($dt)=='string' && $dt.match(/^[0-9]+(?:\\.[0-9]+)?\$/))",
          "parseFloat($dt) >= 0", # we don't allow negative duration
          "!isNaN(parseFloat($dt))",
          "isFinite(parseFloat($dt))", # we don't allow infinite duration
      );
  
      $res->{expr_coerce} = "parseFloat($dt)";
  
      $res;
  }
  
  1;
  # ABSTRACT: Coerce duration from number (assumed to be number of seconds)
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Coerce::js::To_duration::From_float::seconds - Coerce duration from number (assumed to be number of seconds)
  
  =head1 VERSION
  
  This document describes version 0.047 of Data::Sah::Coerce::js::To_duration::From_float::seconds (from Perl distribution Data-Sah-Coerce), released on 2020-02-12.
  
  =head1 SYNOPSIS
  
  To use in a Sah schema:
  
   ["duration",{"x.perl.coerce_rules"=>["From_float::seconds"]}]
  
  =for Pod::Coverage ^(meta|coerce)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah-Coerce>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah-Coerce>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah-Coerce>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COERCE_JS_TO_DURATION_FROM_FLOAT_SECONDS

    $main::fatpacked{"Data/Sah/Coerce/js/To_duration/From_str/iso8601.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COERCE_JS_TO_DURATION_FROM_STR_ISO8601';
  package Data::Sah::Coerce::js::To_duration::From_str::iso8601;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-02-12'; # DATE
  our $DIST = 'Data-Sah-Coerce'; # DIST
  our $VERSION = '0.047'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  sub meta {
      +{
          v => 4,
          summary => 'Coerce duration from (subset of) ISO8601 string (e.g. "P1Y2M", "P14M")',
          prio => 50,
      };
  }
  
  sub coerce {
      my %args = @_;
  
      my $dt = $args{data_term};
      my $coerce_to = $args{coerce_to};
  
      my $res = {};
  
      my $re_num = '[0-9]+(?:\\.[0-9]+)?';
      # js doesn't support /x flag, nor \A and \z. oh my
      #                                     #1=Y           #2=M(on)       #3=W           #4=D               #5=H           #6=M(in)       #7=S
      my $expr_re_match = "$dt.match(/^P(?:($re_num)Y)?(?:($re_num)M)?(?:($re_num)W)?(?:($re_num)D)?(?:T(?:($re_num)H)?(?:($re_num)M)?(?:($re_num)S)?)?\$/)";
      $res->{expr_match} = join(
          " && ",
          "typeof($dt)=='string'",
          $expr_re_match,
      );
  
      # XXX i need a trick to avoid doing regex match twice
  
      # approximation
      $res->{expr_coerce} = "(function(_m) { _m = $expr_re_match; return ((_m[1]||0)*365.25*86400 + (_m[2]||0)*30.4375*86400 + (_m[3]||0)*7*86400 + (_m[4]||0)*86400 + (_m[5]||0)*3600 + (_m[6]||0)*60 + (_m[7]||0)*1) })()";
  
      $res;
  }
  
  1;
  # ABSTRACT: Coerce duration from (subset of) ISO8601 string (e.g. "P1Y2M", "P14M")
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Coerce::js::To_duration::From_str::iso8601 - Coerce duration from (subset of) ISO8601 string (e.g. "P1Y2M", "P14M")
  
  =head1 VERSION
  
  This document describes version 0.047 of Data::Sah::Coerce::js::To_duration::From_str::iso8601 (from Perl distribution Data-Sah-Coerce), released on 2020-02-12.
  
  =head1 SYNOPSIS
  
  To use in a Sah schema:
  
   ["duration",{"x.perl.coerce_rules"=>["From_str::iso8601"]}]
  
  =head1 DESCRIPTION
  
  The format is:
  
   PnYnMnWnDTnHnMnS
  
  Examples: "P1Y2M" (equals to "P14M", 14 months), "P1DT13M" (1 day, 13 minutes).
  
  =for Pod::Coverage ^(meta|coerce)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah-Coerce>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah-Coerce>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah-Coerce>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COERCE_JS_TO_DURATION_FROM_STR_ISO8601

    $main::fatpacked{"Data/Sah/Coerce/js/To_timeofday/From_str/hms.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COERCE_JS_TO_TIMEOFDAY_FROM_STR_HMS';
  package Data::Sah::Coerce::js::To_timeofday::From_str::hms;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-02-12'; # DATE
  our $DIST = 'Data-Sah-Coerce'; # DIST
  our $VERSION = '0.047'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  sub meta {
      +{
          v => 4,
          summary => 'Coerce timeofday from string of the form hh:mm:ss',
          might_fail => 1, # we throw exception h:m:s is invalid
          prio => 50,
      };
  }
  
  sub coerce {
      my %args = @_;
  
      my $dt = $args{data_term};
  
      my $res = {};
  
      $res->{expr_match} = join(
          " && ",
          "typeof($dt)=='string'",
          "($dt).match(/^([0-9]{1,2}):([0-9]{1,2})(?::([0-9]{1,2}(?:\\.[0-9]{1,9})?))?\$/)",
      );
  
      # note: (function(a,b,c){...})() is a trick to simulate lexical variables
      $res->{expr_coerce} = join(
          "",
          "(function (_m) { ",
          "  _m = ($dt).match(/^([0-9]{1,2}):([0-9]{1,2})(?::([0-9]{1,2}(?:\\.[0-9]{1,9})?))?\$/); ", # assume always match, because of expr_match
          "  _m[1] = parseInt(_m[1]);   if (_m[1] >= 24) { return ['Invalid hour '+_m[1]+', must be between 0-23'] } ",
          "  _m[2] = parseInt(_m[2]);   if (_m[2] >= 60) { return ['Invalid minute '+_m[2]+', must be between 0-59'] } ",
          "  _m[3] = _m[3] ? parseFloat(_m[3]) : 0; if (_m[3] >= 60) { return ['Invalid second '+_m[3]+', must be between 0-60'] } ",
          "  return [null, _m[1]*3600 + _m[2]*60 + _m[3]] ",
          "})()",
      );
      $res;
  }
  
  1;
  # ABSTRACT: Coerce timeofday from string of the form hh:mm:ss
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Coerce::js::To_timeofday::From_str::hms - Coerce timeofday from string of the form hh:mm:ss
  
  =head1 VERSION
  
  This document describes version 0.047 of Data::Sah::Coerce::js::To_timeofday::From_str::hms (from Perl distribution Data-Sah-Coerce), released on 2020-02-12.
  
  =head1 SYNOPSIS
  
  To use in a Sah schema:
  
   ["timeofday",{"x.perl.coerce_rules"=>["From_str::hms"]}]
  
  =head1 DESCRIPTION
  
  =for Pod::Coverage ^(meta|coerce)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah-Coerce>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah-Coerce>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah-Coerce>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COERCE_JS_TO_TIMEOFDAY_FROM_STR_HMS

    $main::fatpacked{"Data/Sah/Coerce/perl/To_bool/From_str/common_words.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COERCE_PERL_TO_BOOL_FROM_STR_COMMON_WORDS';
  package Data::Sah::Coerce::perl::To_bool::From_str::common_words;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-02-12'; # DATE
  our $DIST = 'Data-Sah-Coerce'; # DIST
  our $VERSION = '0.047'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  sub meta {
      +{
          v => 4,
          summary => 'Convert common true/false words (e.g. "yes","true","on","1" to "1", and "no","false","off","0" to "")',
          prio => 50,
      };
  }
  
  sub coerce {
      my %args = @_;
  
      my $dt = $args{data_term};
  
      my $res = {};
  
      $res->{expr_match} = join(
          " && ",
          "1",
      );
  
      $res->{expr_coerce} = "$dt =~ /\\A(yes|true|on)\\z/i ? 1 : $dt =~ /\\A(no|false|off|0)\\z/i ? '' : $dt";
  
      $res;
  }
  
  1;
  # ABSTRACT: Convert common true/false words (e.g. "yes","true","on","1" to "1", and "no","false","off","0" to "")
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Coerce::perl::To_bool::From_str::common_words - Convert common true/false words (e.g. "yes","true","on","1" to "1", and "no","false","off","0" to "")
  
  =head1 VERSION
  
  This document describes version 0.047 of Data::Sah::Coerce::perl::To_bool::From_str::common_words (from Perl distribution Data-Sah-Coerce), released on 2020-02-12.
  
  =head1 SYNOPSIS
  
  To use in a Sah schema:
  
   ["bool",{"x.perl.coerce_rules"=>["From_str::common_words"]}]
  
  =head1 DESCRIPTION
  
  This coercion rule converts "true", "yes", "on" (matched case-insensitively) to
  "1"; and "false", "no", "off", "0" (matched case-insensitively) to "". All other
  strings are left untouched.
  
  B<Note that this rule is incompatible with Perl's notion of true/false.> Perl
  regards all non-empty string that isn't "0" (including "no", "false", "off") as
  true. But this might be useful in CLI's or other places.
  
  =for Pod::Coverage ^(meta|coerce)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah-Coerce>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah-Coerce>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah-Coerce>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COERCE_PERL_TO_BOOL_FROM_STR_COMMON_WORDS

    $main::fatpacked{"Data/Sah/Coerce/perl/To_date/From_float/epoch.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COERCE_PERL_TO_DATE_FROM_FLOAT_EPOCH';
  package Data::Sah::Coerce::perl::To_date::From_float::epoch;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-02-12'; # DATE
  our $DIST = 'Data-Sah-Coerce'; # DIST
  our $VERSION = '0.047'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  sub meta {
      +{
          v => 4,
          summary => 'Coerce date from number (assumed to be epoch)',
          prio => 50,
          precludes => ['From_float::epoch_always'],
      };
  }
  
  sub coerce {
      my %args = @_;
  
      my $dt = $args{data_term};
      my $coerce_to = $args{coerce_to} // 'float(epoch)';
  
      my $res = {};
  
      $res->{expr_match} = join(
          " && ",
          "!ref($dt)",
          "$dt =~ /\\A[0-9]{8,10}(?:\.[0-9]+)?\\z/",
          "$dt >= 10**8",
          "$dt <= 2**31",
      );
  
      if ($coerce_to eq 'float(epoch)') {
          $res->{expr_coerce} = $dt;
      } elsif ($coerce_to eq 'DateTime') {
          $res->{modules}{DateTime} //= 0;
          $res->{expr_coerce} = "DateTime->from_epoch(epoch => $dt)";
      } elsif ($coerce_to eq 'Time::Moment') {
          $res->{modules}{'Time::Moment'} //= 0;
          $res->{expr_coerce} = "Time::Moment->from_epoch($dt)";
      } else {
          die "BUG: Unknown coerce_to value '$coerce_to', ".
              "please use float(epoch), DateTime, or Time::Moment";
      }
  
      $res;
  }
  
  1;
  # ABSTRACT: Coerce date from number (assumed to be epoch)
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Coerce::perl::To_date::From_float::epoch - Coerce date from number (assumed to be epoch)
  
  =head1 VERSION
  
  This document describes version 0.047 of Data::Sah::Coerce::perl::To_date::From_float::epoch (from Perl distribution Data-Sah-Coerce), released on 2020-02-12.
  
  =head1 SYNOPSIS
  
  To use in a Sah schema:
  
   ["date",{"x.perl.coerce_rules"=>["From_float::epoch"]}]
  
  =head1 DESCRIPTION
  
  This rule coerces date from a number that is assumed to be a Unix epoch. To
  avoid confusion with number that contains "YYYY", "YYYYMM", or "YYYYMMDD", we
  only do this coercion if data is a number between 10^8 and 2^31.
  
  Hence, this rule has a Y2038 problem :-).
  
  =for Pod::Coverage ^(meta|coerce)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah-Coerce>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah-Coerce>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah-Coerce>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Data::Sah::Coerce::perl::To_date::From_float::epoch_always>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COERCE_PERL_TO_DATE_FROM_FLOAT_EPOCH

    $main::fatpacked{"Data/Sah/Coerce/perl/To_date/From_float/epoch_always.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COERCE_PERL_TO_DATE_FROM_FLOAT_EPOCH_ALWAYS';
  package Data::Sah::Coerce::perl::To_date::From_float::epoch_always;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-02-12'; # DATE
  our $DIST = 'Data-Sah-Coerce'; # DIST
  our $VERSION = '0.047'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  sub meta {
      +{
          v => 4,
          summary => 'Coerce date from number (assumed to be epoch)',
          prio => 50,
          precludes => ['From_float::epoch'],
      };
  }
  
  sub coerce {
      my %args = @_;
  
      my $dt = $args{data_term};
      my $coerce_to = $args{coerce_to} // 'float(epoch)';
  
      my $res = {};
  
      $res->{expr_match} = join(
          " && ",
          "!ref($dt)",
          "$dt =~ /\\A[0-9]+(?:\.[0-9]+)?\\z/",
      );
  
      if ($coerce_to eq 'float(epoch)') {
          $res->{expr_coerce} = $dt;
      } elsif ($coerce_to eq 'DateTime') {
          $res->{modules}{DateTime} //= 0;
          $res->{expr_coerce} = "DateTime->from_epoch(epoch => $dt)";
      } elsif ($coerce_to eq 'Time::Moment') {
          $res->{modules}{'Time::Moment'} //= 0;
          $res->{expr_coerce} = "Time::Moment->from_epoch($dt)";
      } else {
          die "BUG: Unknown coerce_to value '$coerce_to', ".
              "please use float(epoch), DateTime, or Time::Moment";
      }
  
      $res;
  }
  
  1;
  # ABSTRACT: Coerce date from number (assumed to be epoch)
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Coerce::perl::To_date::From_float::epoch_always - Coerce date from number (assumed to be epoch)
  
  =head1 VERSION
  
  This document describes version 0.047 of Data::Sah::Coerce::perl::To_date::From_float::epoch_always (from Perl distribution Data-Sah-Coerce), released on 2020-02-12.
  
  =head1 SYNOPSIS
  
  To use in a Sah schema:
  
   ["date",{"x.perl.coerce_rules"=>["From_float::epoch_always"]}]
  
  =head1 DESCRIPTION
  
  This rule coerces date from number (which assumed to be epoch). If data is a
  number and C<coerce_to> is "float(epoch)" (the default), then this rule does
  nothing. If C<coerce_to> is "DateTime" or "Time::Moment" then this rule
  instantiates the appropriate date object using the epoch value.
  
  =for Pod::Coverage ^(meta|coerce)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah-Coerce>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah-Coerce>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah-Coerce>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Data::Sah::Coerce::perl::To_date::From_float::epoch>
  
  L<Data::Sah::Coerce::perl::To_date::From_str::iso8601>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COERCE_PERL_TO_DATE_FROM_FLOAT_EPOCH_ALWAYS

    $main::fatpacked{"Data/Sah/Coerce/perl/To_date/From_obj/datetime.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COERCE_PERL_TO_DATE_FROM_OBJ_DATETIME';
  package Data::Sah::Coerce::perl::To_date::From_obj::datetime;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-02-12'; # DATE
  our $DIST = 'Data-Sah-Coerce'; # DIST
  our $VERSION = '0.047'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  sub meta {
      +{
          v => 4,
          summary => 'Coerce date from DateTime object',
          prio => 50,
      };
  }
  
  sub coerce {
      my %args = @_;
  
      my $dt = $args{data_term};
      my $coerce_to = $args{coerce_to} // 'float(epoch)';
  
      my $res = {};
  
      $res->{modules}{'Scalar::Util'} //= 0;
  
      $res->{expr_match} = join(
          " && ",
          "Scalar::Util::blessed($dt)",
          "$dt\->isa('DateTime')",
      );
  
      if ($coerce_to eq 'float(epoch)') {
          $res->{expr_coerce} = "$dt\->epoch";
      } elsif ($coerce_to eq 'DateTime') {
          $res->{expr_coerce} = $dt;
      } elsif ($coerce_to eq 'Time::Moment') {
          $res->{modules}{'Time::Moment'} //= 0;
          $res->{expr_coerce} = "Time::Moment->from_object($dt)";
      } else {
          die "BUG: Unknown coerce_to value '$coerce_to', ".
              "please use float(epoch), DateTime, or Time::Moment";
      }
  
      $res;
  }
  
  1;
  # ABSTRACT: Coerce date from DateTime object
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Coerce::perl::To_date::From_obj::datetime - Coerce date from DateTime object
  
  =head1 VERSION
  
  This document describes version 0.047 of Data::Sah::Coerce::perl::To_date::From_obj::datetime (from Perl distribution Data-Sah-Coerce), released on 2020-02-12.
  
  =head1 SYNOPSIS
  
  To use in a Sah schema:
  
   ["date",{"x.perl.coerce_rules"=>["From_obj::datetime"]}]
  
  =head1 DESCRIPTION
  
  This rule coerces date from a L<DateTime> object. If C<coerce_to> is "DateTime"
  that this rule does not do anything. Otherwise, it converts the DateTime object
  to epoch (if C<coerce_to>="float(epoch)") or L<Time::Moment> object (if
  C<coerce_to>="Time::Moment").
  
  =for Pod::Coverage ^(meta|coerce)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah-Coerce>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah-Coerce>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah-Coerce>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COERCE_PERL_TO_DATE_FROM_OBJ_DATETIME

    $main::fatpacked{"Data/Sah/Coerce/perl/To_date/From_obj/time_moment.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COERCE_PERL_TO_DATE_FROM_OBJ_TIME_MOMENT';
  package Data::Sah::Coerce::perl::To_date::From_obj::time_moment;
  
  our $DATE = '2020-02-12'; # DATE
  our $DIST = 'Data-Sah-Coerce'; # DIST
  our $VERSION = '0.047'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  sub meta {
      +{
          v => 4,
          summary => 'Coerce date from Time::Moment object',
          prio => 50,
      };
  }
  
  sub coerce {
      my %args = @_;
  
      my $dt = $args{data_term};
      my $coerce_to = $args{coerce_to} // 'float(epoch)';
  
      my $res = {};
  
      $res->{modules}{'Scalar::Util'} //= 0;
  
      $res->{expr_match} = join(
          " && ",
          "Scalar::Util::blessed($dt)",
          "$dt\->isa('Time::Moment')",
      );
  
      if ($coerce_to eq 'float(epoch)') {
          $res->{expr_coerce} = "$dt\->epoch";
      } elsif ($coerce_to eq 'DateTime') {
          $res->{modules}{'DateTime'} //= 0;
          $res->{expr_coerce} = "DateTime->from_epoch(epoch => $dt\->epoch, time_zone => sprintf('%s%04d', $dt\->offset >= 0 ? '+':'-', abs(int($dt\->offset / 60)*100) + abs(int($dt\->offset % 60))))";
      } elsif ($coerce_to eq 'Time::Moment') {
          $res->{expr_coerce} = $dt;
      } else {
          die "BUG: Unknown coerce_to value '$coerce_to', ".
              "please use float(epoch), DateTime, or Time::Moment";
      }
  
      $res;
  }
  
  1;
  # ABSTRACT: Coerce date from Time::Moment object
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Coerce::perl::To_date::From_obj::time_moment - Coerce date from Time::Moment object
  
  =head1 VERSION
  
  This document describes version 0.047 of Data::Sah::Coerce::perl::To_date::From_obj::time_moment (from Perl distribution Data-Sah-Coerce), released on 2020-02-12.
  
  =head1 SYNOPSIS
  
  To use in a Sah schema:
  
   ["date",{"x.perl.coerce_rules"=>["From_obj::time_moment"]}]
  
  =head1 DESCRIPTION
  
  This rule coerces date from a L<Time::Moment> object. If C<coerce_to> is
  "Time::Moment" that this rule does not do anything. Otherwise, it converts the
  Time::Moment object to epoch (if C<coerce_to>="float(epoch)") or L<DateTime>
  object (if C<coerce_to>="DateTime").
  
  =for Pod::Coverage ^(meta|coerce)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah-Coerce>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah-Coerce>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah-Coerce>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COERCE_PERL_TO_DATE_FROM_OBJ_TIME_MOMENT

    $main::fatpacked{"Data/Sah/Coerce/perl/To_date/From_str/iso8601.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COERCE_PERL_TO_DATE_FROM_STR_ISO8601';
  package Data::Sah::Coerce::perl::To_date::From_str::iso8601;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-02-12'; # DATE
  our $DIST = 'Data-Sah-Coerce'; # DIST
  our $VERSION = '0.047'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  sub meta {
      +{
          v => 4,
          summary => 'Coerce date from (a subset of) ISO8601 string',
          might_fail => 1, # we match any (YYYY-MM-DD... string, so the conversion to date might fail on invalid dates)
          prio => 50,
      };
  }
  
  sub coerce {
      my %args = @_;
  
      my $dt = $args{data_term};
      my $coerce_to = $args{coerce_to} // 'float(epoch)';
  
      my $res = {};
  
      $res->{expr_match} = join(
          " && ",
          "!ref($dt)",
          #            1=Y        2=M        3=D          4="T" 5=h        6=m        7=s       8="Z"
          "$dt =~ /\\A([0-9]{4})-([0-9]{2})-([0-9]{2})(?:([T ])([0-9]{2}):([0-9]{2}):([0-9]{2})(Z?))?\\z/",
      );
  
      if ($coerce_to eq 'float(epoch)') {
          $res->{modules}{"Time::Local"} //= 0;
          $res->{expr_coerce} = qq(do { my \$time; eval { \$time = \$8 ? Time::Local::timegm_modern(\$7, \$6, \$5, \$3, \$2-1, \$1) : \$4 ? Time::Local::timelocal_modern(\$7, \$6, \$5, \$3, \$2-1, \$1) : Time::Local::timelocal_modern(0, 0, 0, \$3, \$2-1, \$1) }; my \$err = \$@; if (\$err) { \$err =~ s/ at .+//s; ["Invalid date/time: \$err", \$time] } else { [undef, \$time] } });
      } elsif ($coerce_to eq 'DateTime') {
          $res->{modules}{"DateTime"} //= 0;
          $res->{expr_coerce} = qq(do { my \$time; eval { \$time = DateTime->new(year=>\$1, month=>\$2, day=>\$3, ((hour=>\$5, minute=>\$6, second=>\$7) x !!\$4), time_zone => \$8 ? 'UTC' : 'local') };                                                              my \$err = \$@; if (\$err) { \$err =~ s/ at .+//s; ["Invalid date/time: \$err", \$time] } else { [undef, \$time] } });
      } elsif ($coerce_to eq 'Time::Moment') {
          $res->{modules}{"Time::Moment"} //= 0;
          # XXX set offset=>... when $8 is not Z?
          $res->{expr_coerce} = qq(do { my \$time; eval { \$time = Time::Moment->new(year=>\$1, month=>\$2, day=>\$3, ((hour=>\$5, minute=>\$6, second=>\$7) x !!\$4), offset=>0) };                                                                                   my \$err = \$@; if (\$err) { \$err =~ s/ at .+//s; ["Invalid date/time: \$err", \$time] } else { [undef, \$time] } });
      } else {
          die "BUG: Unknown coerce_to value '$coerce_to', ".
              "please use float(epoch), DateTime, or Time::Moment";
      }
  
      $res;
  }
  
  1;
  # ABSTRACT: Coerce date from (a subset of) ISO8601 string
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Coerce::perl::To_date::From_str::iso8601 - Coerce date from (a subset of) ISO8601 string
  
  =head1 VERSION
  
  This document describes version 0.047 of Data::Sah::Coerce::perl::To_date::From_str::iso8601 (from Perl distribution Data-Sah-Coerce), released on 2020-02-12.
  
  =head1 SYNOPSIS
  
  To use in a Sah schema:
  
   ["date",{"x.perl.coerce_rules"=>["From_str::iso8601"]}]
  
  =head1 DESCRIPTION
  
  This rule coerces date from a subset of ISO8601 string. Currently only the
  following formats are accepted:
  
   "YYYY-MM-DD"            ; # date (local time), e.g.: 2016-05-13
   "YYYY-MM-DDThh:mm:ss"   ; # date+time (local time), e.g.: 2016-05-13T22:42:00
   "YYYY-MM-DDThh:mm:ssZ"  ; # date+time (UTC), e.g.: 2016-05-13T22:42:00Z
  
   "YYYY-MM-DD hh:mm:ss"   ; # date+time (local time), MySQL format, e.g.: 2016-05-13 22:42:00
   "YYYY-MM-DD hh:mm:ssZ"  ; # date+time (UTC), MySQL format, e.g.: 2016-05-13 22:42:00Z
  
  =for Pod::Coverage ^(meta|coerce)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah-Coerce>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah-Coerce>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah-Coerce>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COERCE_PERL_TO_DATE_FROM_STR_ISO8601

    $main::fatpacked{"Data/Sah/Coerce/perl/To_datenotime/From_float/epoch.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COERCE_PERL_TO_DATENOTIME_FROM_FLOAT_EPOCH';
  package Data::Sah::Coerce::perl::To_datenotime::From_float::epoch;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-02-12'; # DATE
  our $DIST = 'Data-Sah-Coerce'; # DIST
  our $VERSION = '0.047'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  use subroutines 'Data::Sah::Coerce::perl::To_date::From_float::epoch';
  
  1;
  # ABSTRACT: Coerce date from number (assumed to be epoch)
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Coerce::perl::To_datenotime::From_float::epoch - Coerce date from number (assumed to be epoch)
  
  =head1 VERSION
  
  This document describes version 0.047 of Data::Sah::Coerce::perl::To_datenotime::From_float::epoch (from Perl distribution Data-Sah-Coerce), released on 2020-02-12.
  
  =head1 SYNOPSIS
  
  To use in a Sah schema:
  
   ["datenotime",{"x.perl.coerce_rules"=>["From_float::epoch"]}]
  
  =head1 DESCRIPTION
  
  To avoid confusion with number that contains "YYYY", "YYYYMM", or "YYYYMMDD", we
  only do this coercion if data is a number between 10^8 and 2^31.
  
  =for Pod::Coverage ^(meta|coerce)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah-Coerce>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah-Coerce>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah-Coerce>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Data::Sah::Coerce::perl::To_datenotime::From_float::epoch_always>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COERCE_PERL_TO_DATENOTIME_FROM_FLOAT_EPOCH

    $main::fatpacked{"Data/Sah/Coerce/perl/To_datenotime/From_float/epoch_always.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COERCE_PERL_TO_DATENOTIME_FROM_FLOAT_EPOCH_ALWAYS';
  package Data::Sah::Coerce::perl::To_datenotime::From_float::epoch_always;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-02-12'; # DATE
  our $DIST = 'Data-Sah-Coerce'; # DIST
  our $VERSION = '0.047'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  use subroutines 'Data::Sah::Coerce::perl::To_date::From_float::epoch_always';
  
  1;
  # ABSTRACT: Coerce date from number (assumed to be epoch)
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Coerce::perl::To_datenotime::From_float::epoch_always - Coerce date from number (assumed to be epoch)
  
  =head1 VERSION
  
  This document describes version 0.047 of Data::Sah::Coerce::perl::To_datenotime::From_float::epoch_always (from Perl distribution Data-Sah-Coerce), released on 2020-02-12.
  
  =head1 SYNOPSIS
  
  To use in a Sah schema:
  
   ["datenotime",{"x.perl.coerce_rules"=>["From_float::epoch_always"]}]
  
  =head1 DESCRIPTION
  
  =for Pod::Coverage ^(meta|coerce)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah-Coerce>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah-Coerce>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah-Coerce>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Data::Sah::Coerce::perl::To_datenotime::From_float::epoch>
  
  L<Data::Sah::Coerce::perl::To_datenotime::From_str::iso8601>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COERCE_PERL_TO_DATENOTIME_FROM_FLOAT_EPOCH_ALWAYS

    $main::fatpacked{"Data/Sah/Coerce/perl/To_datenotime/From_obj/datetime.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COERCE_PERL_TO_DATENOTIME_FROM_OBJ_DATETIME';
  package Data::Sah::Coerce::perl::To_datenotime::From_obj::datetime;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-02-12'; # DATE
  our $DIST = 'Data-Sah-Coerce'; # DIST
  our $VERSION = '0.047'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  use subroutines 'Data::Sah::Coerce::perl::To_date::From_obj::datetime';
  
  # XXX truncate DateTime to day
  
  1;
  # ABSTRACT: Coerce date from DateTime object
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Coerce::perl::To_datenotime::From_obj::datetime - Coerce date from DateTime object
  
  =head1 VERSION
  
  This document describes version 0.047 of Data::Sah::Coerce::perl::To_datenotime::From_obj::datetime (from Perl distribution Data-Sah-Coerce), released on 2020-02-12.
  
  =head1 SYNOPSIS
  
  To use in a Sah schema:
  
   ["datenotime",{"x.perl.coerce_rules"=>["From_obj::datetime"]}]
  
  =for Pod::Coverage ^(meta|coerce)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah-Coerce>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah-Coerce>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah-Coerce>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COERCE_PERL_TO_DATENOTIME_FROM_OBJ_DATETIME

    $main::fatpacked{"Data/Sah/Coerce/perl/To_datenotime/From_obj/time_moment.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COERCE_PERL_TO_DATENOTIME_FROM_OBJ_TIME_MOMENT';
  package Data::Sah::Coerce::perl::To_datenotime::From_obj::time_moment;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-02-12'; # DATE
  our $DIST = 'Data-Sah-Coerce'; # DIST
  our $VERSION = '0.047'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  use subroutines 'Data::Sah::Coerce::perl::To_date::From_obj::time_moment';
  
  1;
  # ABSTRACT: Coerce date from Time::Moment object
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Coerce::perl::To_datenotime::From_obj::time_moment - Coerce date from Time::Moment object
  
  =head1 VERSION
  
  This document describes version 0.047 of Data::Sah::Coerce::perl::To_datenotime::From_obj::time_moment (from Perl distribution Data-Sah-Coerce), released on 2020-02-12.
  
  =head1 SYNOPSIS
  
  To use in a Sah schema:
  
   ["datenotime",{"x.perl.coerce_rules"=>["From_obj::time_moment"]}]
  
  =for Pod::Coverage ^(meta|coerce)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah-Coerce>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah-Coerce>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah-Coerce>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COERCE_PERL_TO_DATENOTIME_FROM_OBJ_TIME_MOMENT

    $main::fatpacked{"Data/Sah/Coerce/perl/To_datenotime/From_str/iso8601.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COERCE_PERL_TO_DATENOTIME_FROM_STR_ISO8601';
  package Data::Sah::Coerce::perl::To_datenotime::From_str::iso8601;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-02-12'; # DATE
  our $DIST = 'Data-Sah-Coerce'; # DIST
  our $VERSION = '0.047'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  sub meta {
      +{
          v => 4,
          summary => 'Coerce datenotime from (a subset of) ISO8601 string',
          might_fail => 1, # we match any (YYYY-MM-DD... string, so the conversion to date might fail on invalid dates)
          prio => 50,
      };
  }
  
  sub coerce {
      my %args = @_;
  
      my $dt = $args{data_term};
      my $coerce_to = $args{coerce_to} // 'float(epoch)';
  
      my $res = {};
  
      $res->{expr_match} = join(
          " && ",
          "!ref($dt)",
          #            1=Y        2=M        3=D
          "$dt =~ /\\A([0-9]{4})-([0-9]{2})-([0-9]{2})\\z/",
      );
  
      if ($coerce_to eq 'float(epoch)') {
          $res->{modules}{"Time::Local"} //= 0;
          $res->{expr_coerce} = qq(do { my \$time; eval { \$time = Time::Local::timelocal_modern(0, 0, 0, \$3, \$2-1, \$1) }; my \$err = \$@; if (\$err) { \$err =~ s/ at .+//s; ["Invalid date/time: \$err", \$time] } else { [undef, \$time] } });
      } elsif ($coerce_to eq 'DateTime') {
          $res->{modules}{"DateTime"} //= 0;
          $res->{expr_coerce} = qq(do { my \$time; eval { \$time = DateTime->new(year=>\$1, month=>\$2, day=>\$3) };          my \$err = \$@; if (\$err) { \$err =~ s/ at .+//s; ["Invalid date/time: \$err", \$time] } else { [undef, \$time] } });
      } elsif ($coerce_to eq 'Time::Moment') {
          $res->{modules}{"Time::Moment"} //= 0;
          $res->{expr_coerce} = qq(do { my \$time; eval { \$time = Time::Moment->new(year=>\$1, month=>\$2, day=>\$3) };      my \$err = \$@; if (\$err) { \$err =~ s/ at .+//s; ["Invalid date/time: \$err", \$time] } else { [undef, \$time] } });
      } else {
          die "BUG: Unknown coerce_to value '$coerce_to', ".
              "please use float(epoch), DateTime, or Time::Moment";
      }
  
      $res;
  }
  
  1;
  # ABSTRACT: Coerce datenotime from (a subset of) ISO8601 string
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Coerce::perl::To_datenotime::From_str::iso8601 - Coerce datenotime from (a subset of) ISO8601 string
  
  =head1 VERSION
  
  This document describes version 0.047 of Data::Sah::Coerce::perl::To_datenotime::From_str::iso8601 (from Perl distribution Data-Sah-Coerce), released on 2020-02-12.
  
  =head1 SYNOPSIS
  
  To use in a Sah schema:
  
   ["datenotime",{"x.perl.coerce_rules"=>["From_str::iso8601"]}]
  
  =head1 DESCRIPTION
  
  This rule coerces datenotime from a subset of ISO8601 string. Currently only the
  following formats are accepted:
  
   "YYYY-MM-DD"            ; # date (local time), e.g.: 2016-05-13
  
  =for Pod::Coverage ^(meta|coerce)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah-Coerce>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah-Coerce>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah-Coerce>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COERCE_PERL_TO_DATENOTIME_FROM_STR_ISO8601

    $main::fatpacked{"Data/Sah/Coerce/perl/To_datetime/From_float/epoch.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COERCE_PERL_TO_DATETIME_FROM_FLOAT_EPOCH';
  package Data::Sah::Coerce::perl::To_datetime::From_float::epoch;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-02-12'; # DATE
  our $DIST = 'Data-Sah-Coerce'; # DIST
  our $VERSION = '0.047'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  use subroutines 'Data::Sah::Coerce::perl::To_date::From_float::epoch';
  
  1;
  # ABSTRACT: Coerce date from number (assumed to be epoch)
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Coerce::perl::To_datetime::From_float::epoch - Coerce date from number (assumed to be epoch)
  
  =head1 VERSION
  
  This document describes version 0.047 of Data::Sah::Coerce::perl::To_datetime::From_float::epoch (from Perl distribution Data-Sah-Coerce), released on 2020-02-12.
  
  =head1 SYNOPSIS
  
  To use in a Sah schema:
  
   ["datetime",{"x.perl.coerce_rules"=>["From_float::epoch"]}]
  
  =head1 DESCRIPTION
  
  To avoid confusion with number that contains "YYYY", "YYYYMM", or "YYYYMMDD", we
  only do this coercion if data is a number between 10^8 and 2^31.
  
  =for Pod::Coverage ^(meta|coerce)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah-Coerce>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah-Coerce>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah-Coerce>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Data::Sah::Coerce::perl::To_datetime::From_float::epoch_always>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COERCE_PERL_TO_DATETIME_FROM_FLOAT_EPOCH

    $main::fatpacked{"Data/Sah/Coerce/perl/To_datetime/From_float/epoch_always.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COERCE_PERL_TO_DATETIME_FROM_FLOAT_EPOCH_ALWAYS';
  package Data::Sah::Coerce::perl::To_datetime::From_float::epoch_always;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-02-12'; # DATE
  our $DIST = 'Data-Sah-Coerce'; # DIST
  our $VERSION = '0.047'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  use subroutines 'Data::Sah::Coerce::perl::To_date::From_float::epoch_always';
  
  1;
  # ABSTRACT: Coerce date from number (assumed to be epoch)
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Coerce::perl::To_datetime::From_float::epoch_always - Coerce date from number (assumed to be epoch)
  
  =head1 VERSION
  
  This document describes version 0.047 of Data::Sah::Coerce::perl::To_datetime::From_float::epoch_always (from Perl distribution Data-Sah-Coerce), released on 2020-02-12.
  
  =head1 SYNOPSIS
  
  To use in a Sah schema:
  
   ["datetime",{"x.perl.coerce_rules"=>["From_float::epoch_always"]}]
  
  =head1 DESCRIPTION
  
  =for Pod::Coverage ^(meta|coerce)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah-Coerce>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah-Coerce>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah-Coerce>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Data::Sah::Coerce::perl::To_datetime::From_float::epoch>
  
  L<Data::Sah::Coerce::perl::To_datetime::From_str::iso8601>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COERCE_PERL_TO_DATETIME_FROM_FLOAT_EPOCH_ALWAYS

    $main::fatpacked{"Data/Sah/Coerce/perl/To_datetime/From_obj/datetime.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COERCE_PERL_TO_DATETIME_FROM_OBJ_DATETIME';
  package Data::Sah::Coerce::perl::To_datetime::From_obj::datetime;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-02-12'; # DATE
  our $DIST = 'Data-Sah-Coerce'; # DIST
  our $VERSION = '0.047'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  use subroutines 'Data::Sah::Coerce::perl::To_date::From_obj::datetime';
  
  1;
  # ABSTRACT: Coerce date from DateTime object
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Coerce::perl::To_datetime::From_obj::datetime - Coerce date from DateTime object
  
  =head1 VERSION
  
  This document describes version 0.047 of Data::Sah::Coerce::perl::To_datetime::From_obj::datetime (from Perl distribution Data-Sah-Coerce), released on 2020-02-12.
  
  =head1 SYNOPSIS
  
  To use in a Sah schema:
  
   ["datetime",{"x.perl.coerce_rules"=>["From_obj::datetime"]}]
  
  =for Pod::Coverage ^(meta|coerce)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah-Coerce>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah-Coerce>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah-Coerce>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COERCE_PERL_TO_DATETIME_FROM_OBJ_DATETIME

    $main::fatpacked{"Data/Sah/Coerce/perl/To_datetime/From_obj/time_moment.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COERCE_PERL_TO_DATETIME_FROM_OBJ_TIME_MOMENT';
  package Data::Sah::Coerce::perl::To_datetime::From_obj::time_moment;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-02-12'; # DATE
  our $DIST = 'Data-Sah-Coerce'; # DIST
  our $VERSION = '0.047'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  use subroutines 'Data::Sah::Coerce::perl::To_date::From_obj::time_moment';
  
  1;
  # ABSTRACT: Coerce date from Time::Moment object
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Coerce::perl::To_datetime::From_obj::time_moment - Coerce date from Time::Moment object
  
  =head1 VERSION
  
  This document describes version 0.047 of Data::Sah::Coerce::perl::To_datetime::From_obj::time_moment (from Perl distribution Data-Sah-Coerce), released on 2020-02-12.
  
  =head1 SYNOPSIS
  
  To use in a Sah schema:
  
   ["datetime",{"x.perl.coerce_rules"=>["From_obj::time_moment"]}]
  
  =for Pod::Coverage ^(meta|coerce)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah-Coerce>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah-Coerce>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah-Coerce>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COERCE_PERL_TO_DATETIME_FROM_OBJ_TIME_MOMENT

    $main::fatpacked{"Data/Sah/Coerce/perl/To_datetime/From_str/iso8601.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COERCE_PERL_TO_DATETIME_FROM_STR_ISO8601';
  package Data::Sah::Coerce::perl::To_datetime::From_str::iso8601;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-02-12'; # DATE
  our $DIST = 'Data-Sah-Coerce'; # DIST
  our $VERSION = '0.047'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  sub meta {
      +{
          v => 4,
          summary => 'Coerce datetime from (a subset of) ISO8601 string',
          might_fail => 1, # we match any (YYYY-MM-DD... string, so the conversion to date might fail on invalid dates)
          prio => 50,
      };
  }
  
  sub coerce {
      my %args = @_;
  
      my $dt = $args{data_term};
      my $coerce_to = $args{coerce_to} // 'float(epoch)';
  
      my $res = {};
  
      $res->{expr_match} = join(
          " && ",
          "!ref($dt)",
          #            1=Y        2=M        3=D          4="T" 5=h        6=m        7=s       8="Z"
          "$dt =~ /\\A([0-9]{4})-([0-9]{2})-([0-9]{2})([T ])([0-9]{2}):([0-9]{2}):([0-9]{2})(Z?)\\z/",
      );
  
      if ($coerce_to eq 'float(epoch)') {
          $res->{modules}{"Time::Local"} //= 0;
          $res->{expr_coerce} = qq(do { my \$time; eval { \$time = \$8 ? Time::Local::timegm_modern(\$7, \$6, \$5, \$3, \$2-1, \$1) : Time::Local::timelocal_modern(\$7, \$6, \$5, \$3, \$2-1, \$1) }; my \$err = \$@; if (\$err) { \$err =~ s/ at .+//s; ["Invalid date/time: \$err", \$time] } else { [undef, \$time] } });
      } elsif ($coerce_to eq 'DateTime') {
          $res->{modules}{"DateTime"} //= 0;
          $res->{expr_coerce} = qq(do { my \$time; eval { \$time = DateTime->new(year=>\$1, month=>\$2, day=>\$3, hour=>\$5, minute=>\$6, second=>\$7, time_zone => \$8 ? 'UTC' : 'local') };          my \$err = \$@; if (\$err) { \$err =~ s/ at .+//s; ["Invalid date/time: \$err", \$time] } else { [undef, \$time] } });
      } elsif ($coerce_to eq 'Time::Moment') {
          $res->{modules}{"Time::Moment"} //= 0;
          # XXX set offset=>... when $8 is not Z
          $res->{expr_coerce} = qq(do { my \$time; eval { \$time = Time::Moment->new(year=>\$1, month=>\$2, day=>\$3, hour=>\$5, minute=>\$6, second=>\$7, offset=>0) };                               my \$err = \$@; if (\$err) { \$err =~ s/ at .+//s; ["Invalid date/time: \$err", \$time] } else { [undef, \$time] } });
      } else {
          die "BUG: Unknown coerce_to value '$coerce_to', ".
              "please use float(epoch), DateTime, or Time::Moment";
      }
  
      $res;
  }
  
  1;
  # ABSTRACT: Coerce datetime from (a subset of) ISO8601 string
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Coerce::perl::To_datetime::From_str::iso8601 - Coerce datetime from (a subset of) ISO8601 string
  
  =head1 VERSION
  
  This document describes version 0.047 of Data::Sah::Coerce::perl::To_datetime::From_str::iso8601 (from Perl distribution Data-Sah-Coerce), released on 2020-02-12.
  
  =head1 SYNOPSIS
  
  To use in a Sah schema:
  
   ["datetime",{"x.perl.coerce_rules"=>["From_str::iso8601"]}]
  
  =head1 DESCRIPTION
  
  Currently only the following formats are accepted:
  
   "YYYY-MM-DDThh:mm:ss"   ; # date+time (local time), e.g.: 2016-05-13T22:42:00
   "YYYY-MM-DDThh:mm:ssZ"  ; # date+time (UTC), e.g.: 2016-05-13T22:42:00Z
  
   "YYYY-MM-DD hh:mm:ss"   ; # date+time (local time), MySQL format, e.g.: 2016-05-13 22:42:00
   "YYYY-MM-DD hh:mm:ssZ"  ; # date+time (UTC), MySQL format, e.g.: 2016-05-13 22:42:00Z
  
  =for Pod::Coverage ^(meta|coerce)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah-Coerce>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah-Coerce>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah-Coerce>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COERCE_PERL_TO_DATETIME_FROM_STR_ISO8601

    $main::fatpacked{"Data/Sah/Coerce/perl/To_duration/From_float/seconds.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COERCE_PERL_TO_DURATION_FROM_FLOAT_SECONDS';
  package Data::Sah::Coerce::perl::To_duration::From_float::seconds;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-02-12'; # DATE
  our $DIST = 'Data-Sah-Coerce'; # DIST
  our $VERSION = '0.047'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  sub meta {
      +{
          v => 4,
          summary => 'Coerce duration from float (assumed to be number of seconds)',
          prio => 50,
      };
  }
  
  sub coerce {
      my %args = @_;
  
      my $dt = $args{data_term};
      my $coerce_to = $args{coerce_to} // 'float(secs)';
  
      my $res = {};
  
      $res->{expr_match} = join(
          " && ",
          "!ref($dt)",
          "$dt =~ /\\A[0-9]+(?:\.[0-9]+)\\z/",
      );
  
      if ($coerce_to eq 'float(secs)') {
          $res->{expr_coerce} = $dt;
      } elsif ($coerce_to eq 'DateTime::Duration') {
          $res->{modules}{'DateTime::Duration'} //= 0;
          $res->{expr_coerce} = "DateTime::Duration->new(seconds => $dt)";
      } else {
          die "BUG: Unknown coerce_to value '$coerce_to', ".
              "please use float(secs) or DateTime::Duration";
      }
  
      $res;
  }
  
  1;
  # ABSTRACT: Coerce duration from float (assumed to be number of seconds)
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Coerce::perl::To_duration::From_float::seconds - Coerce duration from float (assumed to be number of seconds)
  
  =head1 VERSION
  
  This document describes version 0.047 of Data::Sah::Coerce::perl::To_duration::From_float::seconds (from Perl distribution Data-Sah-Coerce), released on 2020-02-12.
  
  =head1 SYNOPSIS
  
  To use in a Sah schema:
  
   ["duration",{"x.perl.coerce_rules"=>["From_float::seconds"]}]
  
  =for Pod::Coverage ^(meta|coerce)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah-Coerce>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah-Coerce>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah-Coerce>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COERCE_PERL_TO_DURATION_FROM_FLOAT_SECONDS

    $main::fatpacked{"Data/Sah/Coerce/perl/To_duration/From_obj/datetime_duration.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COERCE_PERL_TO_DURATION_FROM_OBJ_DATETIME_DURATION';
  package Data::Sah::Coerce::perl::To_duration::From_obj::datetime_duration;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-02-12'; # DATE
  our $DIST = 'Data-Sah-Coerce'; # DIST
  our $VERSION = '0.047'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  sub meta {
      +{
          v => 4,
          summary => 'Coerce duration from DateTime::Duration object',
          prio => 50,
      };
  }
  
  sub coerce {
      my %args = @_;
  
      my $dt = $args{data_term};
      my $coerce_to = $args{coerce_to} // 'float(secs)';
  
      my $res = {};
  
      $res->{modules}{'Scalar::Util'} //= 0;
  
      $res->{expr_match} = join(
          " && ",
          "Scalar::Util::blessed($dt)",
          "$dt\->isa('DateTime::Duration')",
      );
  
      if ($coerce_to eq 'float(secs)') {
          # approximation
          $res->{expr_coerce} = "($dt\->years * 365.25*86400 + $dt\->months * 30.4375*86400 + $dt\->weeks * 7*86400 + $dt\->days * 86400 + $dt\->hours * 3600 + $dt\->minutes * 60 + $dt\->seconds + $dt\->nanoseconds * 1e-9)";
      } elsif ($coerce_to eq 'DateTime::Duration') {
          $res->{expr_coerce} = $dt;
      } else {
          die "BUG: Unknown coerce_to value '$coerce_to', ".
              "please use float(secs) or DateTime::Duration";
      }
  
      $res;
  }
  
  1;
  # ABSTRACT: Coerce duration from DateTime::Duration object
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Coerce::perl::To_duration::From_obj::datetime_duration - Coerce duration from DateTime::Duration object
  
  =head1 VERSION
  
  This document describes version 0.047 of Data::Sah::Coerce::perl::To_duration::From_obj::datetime_duration (from Perl distribution Data-Sah-Coerce), released on 2020-02-12.
  
  =head1 SYNOPSIS
  
  To use in a Sah schema:
  
   ["duration",{"x.perl.coerce_rules"=>["From_obj::datetime_duration"]}]
  
  =for Pod::Coverage ^(meta|coerce)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah-Coerce>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah-Coerce>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah-Coerce>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COERCE_PERL_TO_DURATION_FROM_OBJ_DATETIME_DURATION

    $main::fatpacked{"Data/Sah/Coerce/perl/To_duration/From_str/human.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COERCE_PERL_TO_DURATION_FROM_STR_HUMAN';
  package Data::Sah::Coerce::perl::To_duration::From_str::human;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-02-12'; # DATE
  our $DIST = 'Data-Sah-Coerce'; # DIST
  our $VERSION = '0.047'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  sub meta {
      +{
          v => 4,
          summary => 'Coerce duration from human notation string (e.g. "2 days 10 hours", "3h")',
          might_fail => 1, # we feed most string to Time::Duration::Parse::AsHash which might croak when fed invalid string
          prio => 60,
      };
  }
  
  sub coerce {
      my %args = @_;
  
      my $dt = $args{data_term};
      my $coerce_to = $args{coerce_to} // 'float(secs)';
  
      my $res = {};
  
      $res->{expr_match} = join(
          " && ",
          "!ref($dt)",
          "$dt =~ /\\d.*[a-z]/",
      );
  
      $res->{modules}{"Time::Duration::Parse::AsHash"} //= 0;
      if ($coerce_to eq 'float(secs)') {
          # approximation
          $res->{expr_coerce} = qq(do { my \$p; eval { \$p = Time::Duration::Parse::AsHash::parse_duration($dt) }; my \$err = \$@; if (\$err) { \$err =~ s/ at .+//s; ["Invalid duration: \$err"] } else { [undef, (\$p->{years}||0) * 365.25*86400 + (\$p->{months}||0) * 30.4375*86400 + (\$p->{weeks}||0) * 7*86400 + (\$p->{days}||0) * 86400 + (\$p->{hours}||0) * 3600 + (\$p->{minutes}||0) * 60 + (\$p->{seconds}||0)] } });
      } elsif ($coerce_to eq 'DateTime::Duration') {
          $res->{modules}{"DateTime::Duration"} //= 0;
          $res->{expr_coerce} = qq(do { my \$p; eval { \$p = Time::Duration::Parse::AsHash::parse_duration($dt) }; my \$err = \$@; if (\$err) { \$err =~ s/ at .+//s; ["Invalid duration: \$err"] } else { [undef, DateTime::Duration->new( (years=>\$p->{years}) x !!defined(\$p->{years}), (months=>\$p->{months}) x !!defined(\$p->{months}), (weeks=>\$p->{weeks}) x !!defined(\$p->{weeks}), (days=>\$p->{days}) x !!defined(\$p->{days}), (hours=>\$p->{hours}) x !!defined(\$p->{hours}), (minutes=>\$p->{minutes}) x !!defined(\$p->{minutes}), (seconds=>\$p->{seconds}) x !!defined(\$p->{seconds}))] } });
      } else {
          die "BUG: Unknown coerce_to value '$coerce_to', ".
              "please use float(secs) or DateTime::Duration";
      }
  
      $res;
  }
  
  1;
  # ABSTRACT: Coerce duration from human notation string (e.g. "2 days 10 hours", "3h")
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Coerce::perl::To_duration::From_str::human - Coerce duration from human notation string (e.g. "2 days 10 hours", "3h")
  
  =head1 VERSION
  
  This document describes version 0.047 of Data::Sah::Coerce::perl::To_duration::From_str::human (from Perl distribution Data-Sah-Coerce), released on 2020-02-12.
  
  =head1 SYNOPSIS
  
  To use in a Sah schema:
  
   ["duration",{"x.perl.coerce_rules"=>["From_str::human"]}]
  
  =head1 DESCRIPTION
  
  The human notation is parsed using L<Time::Duration::Parse::AsHash>.
  
  =for Pod::Coverage ^(meta|coerce)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah-Coerce>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah-Coerce>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah-Coerce>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COERCE_PERL_TO_DURATION_FROM_STR_HUMAN

    $main::fatpacked{"Data/Sah/Coerce/perl/To_duration/From_str/iso8601.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COERCE_PERL_TO_DURATION_FROM_STR_ISO8601';
  package Data::Sah::Coerce::perl::To_duration::From_str::iso8601;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-02-12'; # DATE
  our $DIST = 'Data-Sah-Coerce'; # DIST
  our $VERSION = '0.047'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  sub meta {
      +{
          v => 4,
          summary => 'Coerce duration from (subset of) ISO8601 string (e.g. "P1Y2M", "P14M")',
          prio => 50,
      };
  }
  
  sub coerce {
      my %args = @_;
  
      my $dt = $args{data_term};
      my $coerce_to = $args{coerce_to} // 'float(secs)';
  
      my $res = {};
  
      my $re_num = '[0-9]+(?:\\.[0-9]+)?';
      $res->{expr_match} = join(
          " && ",
          "!ref($dt)",
          #                #1=Y            #2=M(on)        #3=W            #4=D                  #5=H            #6=M(in)        #7=S
          "$dt =~ /\\AP(?:($re_num)Y)? (?:($re_num)M)? (?:($re_num)W)? (?:($re_num)D)? (?: T (?:($re_num)H)? (?:($re_num)M)? (?:($re_num)S)? )?\\z/x",
      );
  
      if ($coerce_to eq 'float(secs)') {
          # approximation
          $res->{expr_coerce} = "((\$1||0)*365.25*86400 + (\$2||0)*30.4375*86400 + (\$3||0)*7*86400 + (\$4||0)*86400 + (\$5||0)*3600 + (\$6||0)*60 + (\$7||0))";
      } elsif ($coerce_to eq 'DateTime::Duration') {
          $res->{modules}{"DateTime::Duration"} //= 0;
          $res->{expr_coerce} = "DateTime::Duration->new( (years=>\$1) x !!defined(\$1), (months=>\$2) x !!defined(\$2), (weeks=>\$3) x !!defined(\$3), (days=>\$4) x !!defined(\$4), (hours=>\$5) x !!defined(\$5), (minutes=>\$6) x !!defined(\$6), (seconds=>\$7) x !!defined(\$7))";
      } else {
          die "BUG: Unknown coerce_to value '$coerce_to', ".
              "please use float(secs) or DateTime::Duration";
      }
  
      $res;
  }
  
  1;
  # ABSTRACT: Coerce duration from (subset of) ISO8601 string (e.g. "P1Y2M", "P14M")
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Coerce::perl::To_duration::From_str::iso8601 - Coerce duration from (subset of) ISO8601 string (e.g. "P1Y2M", "P14M")
  
  =head1 VERSION
  
  This document describes version 0.047 of Data::Sah::Coerce::perl::To_duration::From_str::iso8601 (from Perl distribution Data-Sah-Coerce), released on 2020-02-12.
  
  =head1 SYNOPSIS
  
  To use in a Sah schema:
  
   ["duration",{"x.perl.coerce_rules"=>["From_str::iso8601"]}]
  
  =head1 DESCRIPTION
  
  The format is:
  
   PnYnMnWnDTnHnMnS
  
  Examples: "P1Y2M" (equals to "P14M", 14 months), "P1DT13M" (1 day, 13 minutes).
  
  =for Pod::Coverage ^(meta|coerce)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah-Coerce>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah-Coerce>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah-Coerce>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COERCE_PERL_TO_DURATION_FROM_STR_ISO8601

    $main::fatpacked{"Data/Sah/Coerce/perl/To_float/From_str/percent.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COERCE_PERL_TO_FLOAT_FROM_STR_PERCENT';
  package Data::Sah::Coerce::perl::To_float::From_str::percent;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-02-12'; # DATE
  our $DIST = 'Data-Sah-Coerce'; # DIST
  our $VERSION = '0.047'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  sub meta {
      +{
          v => 4,
          summary => 'Coerce float from percent string (e.g. "100.5%")',
          prio => 50,
      };
  }
  
  sub coerce {
      my %args = @_;
  
      my $dt = $args{data_term};
  
      my $res = {};
  
      $res->{expr_match} = join(
          " && ",
          "$dt =~ /\\A([+-]?\\d+(?:\\.\\d*)?)%\\z/",
      );
  
      $res->{expr_coerce} = "\$1/100";
      $res;
  }
  
  1;
  # ABSTRACT: Coerce float from percent string (e.g. "100.5%")
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Coerce::perl::To_float::From_str::percent - Coerce float from percent string (e.g. "100.5%")
  
  =head1 VERSION
  
  This document describes version 0.047 of Data::Sah::Coerce::perl::To_float::From_str::percent (from Perl distribution Data-Sah-Coerce), released on 2020-02-12.
  
  =head1 SYNOPSIS
  
  To use in a Sah schema:
  
   ["float",{"x.perl.coerce_rules"=>["From_str::percent"]}]
  
  =head1 DESCRIPTION
  
  =for Pod::Coverage ^(meta|coerce)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah-Coerce>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah-Coerce>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah-Coerce>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COERCE_PERL_TO_FLOAT_FROM_STR_PERCENT

    $main::fatpacked{"Data/Sah/Coerce/perl/To_int/From_str/percent.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COERCE_PERL_TO_INT_FROM_STR_PERCENT';
  package Data::Sah::Coerce::perl::To_int::From_str::percent;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-02-12'; # DATE
  our $DIST = 'Data-Sah-Coerce'; # DIST
  our $VERSION = '0.047'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  sub meta {
      +{
          v => 4,
          summary => 'Coerce int from percent string (e.g. "100%")',
          prio => 50,
      };
  }
  
  sub coerce {
      my %args = @_;
  
      my $dt = $args{data_term};
  
      my $res = {};
  
      $res->{expr_match} = join(
          " && ",
          "$dt =~ /\\A([+-]?\\d+)%\\z/",
      );
  
      $res->{expr_coerce} = "\$1/100";
      $res;
  }
  
  1;
  # ABSTRACT: Coerce int from percent string (e.g. "100%")
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Coerce::perl::To_int::From_str::percent - Coerce int from percent string (e.g. "100%")
  
  =head1 VERSION
  
  This document describes version 0.047 of Data::Sah::Coerce::perl::To_int::From_str::percent (from Perl distribution Data-Sah-Coerce), released on 2020-02-12.
  
  =head1 SYNOPSIS
  
  To use in a Sah schema:
  
   ["int",{"x.perl.coerce_rules"=>["From_str::percent"]}]
  
  =head1 DESCRIPTION
  
  =for Pod::Coverage ^(meta|coerce)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah-Coerce>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah-Coerce>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah-Coerce>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COERCE_PERL_TO_INT_FROM_STR_PERCENT

    $main::fatpacked{"Data/Sah/Coerce/perl/To_timeofday/From_obj/date_timeofday.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COERCE_PERL_TO_TIMEOFDAY_FROM_OBJ_DATE_TIMEOFDAY';
  package Data::Sah::Coerce::perl::To_timeofday::From_obj::date_timeofday;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-02-12'; # DATE
  our $DIST = 'Data-Sah-Coerce'; # DIST
  our $VERSION = '0.047'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  sub meta {
      +{
          v => 4,
          summary => 'Coerce timeofday from Date::TimeOfDay object',
          prio => 50,
      };
  }
  
  sub coerce {
      my %args = @_;
  
      my $dt = $args{data_term};
      my $coerce_to = $args{coerce_to} // 'str_hms';
  
      my $res = {};
  
      $res->{modules}{'Scalar::Util'} //= 0;
  
      $res->{expr_match} = join(
          " && ",
          "Scalar::Util::blessed($dt)",
          "$dt\->isa('Date::TimeOfDay')",
      );
  
      if ($coerce_to eq 'float') {
          $res->{expr_coerce} = "$dt\->float";
      } elsif ($coerce_to eq 'str_hms') {
          $res->{expr_coerce} = "$dt\->hms";
      } elsif ($coerce_to eq 'Date::TimeOfDay') {
          $res->{expr_coerce} = $dt;
      } else {
          die "BUG: Unknown coerce_to value '$coerce_to', ".
              "please use float, str_hms, or Date::TimeOfDay";
      }
  
      $res;
  }
  
  1;
  # ABSTRACT: Coerce timeofday from Date::TimeOfDay object
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Coerce::perl::To_timeofday::From_obj::date_timeofday - Coerce timeofday from Date::TimeOfDay object
  
  =head1 VERSION
  
  This document describes version 0.047 of Data::Sah::Coerce::perl::To_timeofday::From_obj::date_timeofday (from Perl distribution Data-Sah-Coerce), released on 2020-02-12.
  
  =head1 SYNOPSIS
  
  To use in a Sah schema:
  
   ["timeofday",{"x.perl.coerce_rules"=>["From_obj::date_timeofday"]}]
  
  =head1 DESCRIPTION
  
  =for Pod::Coverage ^(meta|coerce)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah-Coerce>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah-Coerce>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah-Coerce>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COERCE_PERL_TO_TIMEOFDAY_FROM_OBJ_DATE_TIMEOFDAY

    $main::fatpacked{"Data/Sah/Coerce/perl/To_timeofday/From_str/hms.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COERCE_PERL_TO_TIMEOFDAY_FROM_STR_HMS';
  package Data::Sah::Coerce::perl::To_timeofday::From_str::hms;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-02-12'; # DATE
  our $DIST = 'Data-Sah-Coerce'; # DIST
  our $VERSION = '0.047'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  sub meta {
      +{
          v => 4,
          summary => 'Coerce timeofday from string in the form of hh:mm:ss',
          might_fail => 1, # we match any (hh:mm:ss string, so the conversion might fail on invalid value)
          prio => 50,
      };
  }
  
  sub coerce {
      my %args = @_;
  
      my $dt = $args{data_term};
      my $coerce_to = $args{coerce_to} // 'str_hms';
  
      my $res = {};
  
      $res->{expr_match} = join(
          " && ",
          "$dt =~ /\\A([0-9]{1,2}):([0-9]{1,2})(?::([0-9]{1,2})(\.[0-9]{1,9})?)?\\z/",
      );
  
      my $code_check = qq(if (\$1 > 23) { ["Invalid hour '\$1', must be between 0-23"] } elsif (\$2 > 59) { ["Invalid minute '\$2', must be between 0-59"] } elsif (defined \$3 && \$3 > 59) { ["Invalid second '\$3', must be between 0-59"] });
  
      if ($coerce_to eq 'float') {
          $res->{expr_coerce} = qq(do { $code_check else { [undef, \$1*3600 + \$2*60 + (defined \$3 ? \$3 : 0) + (defined \$4 ? \$4 : 0)] } });
      } elsif ($coerce_to eq 'str_hms') {
          $res->{expr_coerce} = qq(do { $code_check else { [undef, defined(\$4) && \$4 > 0 ? sprintf("%02d:%02d:%s%.11g", \$1, \$2, (!defined(\$3) || \$3 < 10 ? "0":""), (defined \$3 ? \$3:0)+\$4) : sprintf("%02d:%02d:%02d", \$1, \$2, (defined \$3 ? \$3 : 0))] } });
      } elsif ($coerce_to eq 'Date::TimeOfDay') {
          $res->{modules}{"Date::TimeOfDay"} //= 0.002;
          $res->{expr_coerce} = qq([undef, Date::TimeOfDay->new(hour=>\$1, minute=>\$2, second=>(defined \$3 ? \$3 : 0), nanosecond=>(defined \$4 ? \$4*1e9 : 0))]);
      } else {
          die "BUG: Unknown coerce_to value '$coerce_to', ".
              "please use float, str_hms, or Date::TimeOfDay";
      }
  
      $res;
  }
  
  1;
  # ABSTRACT: Coerce timeofday from string in the form of hh:mm:ss
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Coerce::perl::To_timeofday::From_str::hms - Coerce timeofday from string in the form of hh:mm:ss
  
  =head1 VERSION
  
  This document describes version 0.047 of Data::Sah::Coerce::perl::To_timeofday::From_str::hms (from Perl distribution Data-Sah-Coerce), released on 2020-02-12.
  
  =head1 SYNOPSIS
  
  To use in a Sah schema:
  
   ["timeofday",{"x.perl.coerce_rules"=>["From_str::hms"]}]
  
  =head1 DESCRIPTION
  
  Timeofday can be coerced into one of: C<float> (seconds after midnight, e.g.
  86399 is 23:59:59), C<str_hms> (string in the form of hh:mm:ss), or
  C<Date::TimeOfDay> (an instance of L<Date::TimeOfDay> class).
  
  =for Pod::Coverage ^(meta|coerce)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah-Coerce>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah-Coerce>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah-Coerce>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COERCE_PERL_TO_TIMEOFDAY_FROM_STR_HMS

    $main::fatpacked{"Data/Sah/CoerceCommon.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COERCECOMMON';
  package Data::Sah::CoerceCommon;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-02-12'; # DATE
  our $DIST = 'Data-Sah-Coerce'; # DIST
  our $VERSION = '0.047'; # VERSION
  
  use 5.010001;
  use strict 'subs', 'vars';
  
  our $SUPPORT_OLD_PREFIX = $ENV{PERL_DATA_SAH_COERCE_SUPPORT_OLD_PREFIX} // 1;
  
  our %Default_Rules = (
      perl => {
          bool       => [qw//],
          date       => [qw/From_float::epoch From_obj::datetime From_obj::time_moment From_str::iso8601/],
          datenotime => [qw/From_float::epoch From_obj::datetime From_obj::time_moment From_str::iso8601/],
          datetime   => [qw/From_float::epoch From_obj::datetime From_obj::time_moment From_str::iso8601/],
          duration   => [qw/From_float::seconds From_obj::datetime_duration From_str::human From_str::iso8601/],
          timeofday  => [qw/From_obj::date_timeofday From_str::hms/],
      },
      js => {
          bool       => [qw/From_float::zero_one From_str::common_words/],
          date       => [qw/From_float::epoch From_obj::date From_str::date_parse/],
          datetime   => [qw/From_float::epoch From_obj::date From_str::date_parse/],
          datenotime => [qw/From_float::epoch From_obj::date From_str::date_parse/],
          duration   => [qw/From_float::seconds From_str::iso8601/],
          timeofday  => [qw/From_str::hms/],
      },
  );
  
  my %common_args = (
      type => {
          schema => 'sah::type_name*',
              req => 1,
          pos => 0,
      },
      coerce_to => {
          schema => 'str*',
          description => <<'_',
  
  Some Sah types, like `date`, can be represented in a choice of types in the
  target language. For example, in Perl you can store it as a floating number
  a.k.a. `float(epoch)`, or as a <pm:DateTime> object, or <pm:Time::Moment>
  object. Storing in DateTime can be convenient for date manipulation but requires
  an overhead of loading the module and storing in a bulky format. The choice is
  yours to make, via this setting.
  
  _
      },
      coerce_rules => {
          summary => 'A specification of coercion rules to use (or avoid)',
          schema => ['array*', of=>'str*'],
          description => <<'_',
  
  This setting is used to specify which coercion rules to use (or avoid) in a
  flexible way. Each element is a string, in the form of either `NAME` to mean
  specifically include a rule, or `!NAME` to exclude a rule.
  
  Some coercion modules are used by default, unless explicitly avoided using the
  '!NAME' rule.
  
  To not use any rules:
  
  To use the default rules plus R1 and R2:
  
      ['R1', 'R2']
  
  To use the default rules but not R1 and R2:
  
      ['!R1', '!R2']
  
  _
      },
  );
  
  my %gen_coercer_args = (
      %common_args,
      return_type => {
          schema => ['str*', {
              in => [qw/val bool_coerced+val bool_coerced+str_errmsg+val/],
              prefilters => [
                  ["Str::replace_map", {map=>{
                      "status+val"     => "bool_coerced+val",
                      "status+err+val" => "bool_coerced+str_errmsg+val",
                  }}],
              ],
          }],
          default => 'val',
          description => <<'_',
  
  `val` means the coercer will return the input (possibly) coerced or undef if
  coercion fails.
  
  `bool_coerced+val` means the coercer will return a 2-element array. The first
  element is a bool value set to 1 if coercion has been performed or 0 if
  otherwise. The second element is the (possibly) coerced input.
  
  `bool_coerced+str_errmsg+val` means the coercer will return a 3-element array.
  The first element is a bool value set to 1 if coercion has been performed or 0
  if otherwise. The second element is the error message string which will be set
  if there is a failure in coercion (or undef if coercion is successful). The
  third element is the (possibly) coerced input.
  
  _
      },
      source => {
          summary => 'If set to true, will return coercer source code string'.
              ' instead of compiled code',
          schema => 'bool',
      },
  );
  
  our %SPEC;
  
  $SPEC{get_coerce_rules} = {
      v => 1.1,
      summary => 'Get coerce rules',
      description => <<'_',
  
  This routine determines coerce rule modules to use (based on the default set and
  `coerce_rules` specified), loads them, filters out modules with old/incompatible
  metadata version, and return the list of rules.
  
  This common routine is used by <pm:Data::Sah> compilers, as well as
  <pm:Data::Sah::Coerce> and <pm:Data::Sah::CoerceJS>.
  
  _
      args => {
          %common_args,
          compiler => {
              schema => 'str*',
              req => 1,
          },
          data_term => {
              schema => 'str*',
              req => 1,
          },
      },
  };
  sub get_coerce_rules {
      my %args = @_;
  
      my $type     = $args{type};
      my $compiler = $args{compiler};
      my $dt       = $args{data_term};
  
      my $typen = $type; $typen =~ s/::/__/g;
      my $old_prefix = "Data::Sah::Coerce::$compiler\::$typen\::"; # deprecated, <0.034, will be removed in the future
      my $prefix = "Data::Sah::Coerce::$compiler\::To_$typen\::";
  
      my @rule_names = @{ $Default_Rules{$compiler}{$typen} || [] };
      for my $item (@{ $args{coerce_rules} // [] }) {
          my $is_exclude = $item =~ s/\A!//;
          if ($SUPPORT_OLD_PREFIX && $item =~ /\A\w+\z/) {
              # old name
          } elsif ($item =~ /\AFrom_[A-Za-z0-9_]+::[A-Za-z0-9_]+\z/) {
              # new name
          } else {
              die "Invalid syntax for coercion rule item '$item', please ".
                  "only use From_<type>::<description>";
          }
          if ($is_exclude) {
              @rule_names = grep { $_ ne $item } @rule_names;
          } else {
              push @rule_names, $item unless grep { $_ eq $item } @rule_names;
          }
      }
  
      my @rules;
      for my $rule_name (@rule_names) {
          my $is_old_name = $SUPPORT_OLD_PREFIX && $rule_name =~ /\A\w+\z/;
          my $mod = ($is_old_name ? $old_prefix : $prefix) . $rule_name;
          (my $mod_pm = "$mod.pm") =~ s!::!/!g;
          require $mod_pm;
          my $rule_meta = &{"$mod\::meta"};
          my $rule_v = ($rule_meta->{v} // 1);
          if ($rule_v != 3 && $rule_v != 4) {
              warn "Only coercion rule module following metadata version 3/4 is ".
                  "supported, this rule module '$mod' follows metadata version ".
                  "$rule_v and will not be used";
              next;
          }
          my $rule = &{"$mod\::coerce"}(
              data_term => $dt,
              coerce_to => $args{coerce_to},
          );
          $rule->{name} = $rule_name;
          $rule->{meta} = $rule_meta;
          push @rules, $rule;
      }
  
      # sort by priority (then name)
      @rules = sort {
          ($a->{meta}{prio}//50) <=> ($b->{meta}{prio}//50) ||
              $a->{name} cmp $b->{name}
          } @rules;
  
      # precludes
      {
          my $i = 0;
          while ($i < @rules) {
              my $rule = $rules[$i];
              if ($rule->{meta}{precludes}) {
                  for my $j (reverse 0 .. $#rules) {
                      next if $j == $i;
                      my $match;
                      for my $p (@{ $rule->{meta}{precludes} }) {
                          if (ref($p) eq 'Regexp' && $rules[$j]{name} =~ $p ||
                                  $rules[$j]{name} eq $p) {
                              $match = 1;
                              last;
                          }
                      }
                      next unless $match;
                      warn "Coercion rule $rules[$j]{name} is precluded by rule $rule->{name}";
                      splice @rules, $j, 1;
                  }
              }
              $i++;
          }
      }
  
      \@rules;
  }
  
  1;
  # ABSTRACT: Common stuffs for Data::Sah::Coerce and Data::Sah::CoerceJS
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::CoerceCommon - Common stuffs for Data::Sah::Coerce and Data::Sah::CoerceJS
  
  =head1 VERSION
  
  This document describes version 0.047 of Data::Sah::CoerceCommon (from Perl distribution Data-Sah-Coerce), released on 2020-02-12.
  
  =head1 FUNCTIONS
  
  
  =head2 get_coerce_rules
  
  Usage:
  
   get_coerce_rules(%args) -> [status, msg, payload, meta]
  
  Get coerce rules.
  
  This routine determines coerce rule modules to use (based on the default set and
  C<coerce_rules> specified), loads them, filters out modules with old/incompatible
  metadata version, and return the list of rules.
  
  This common routine is used by L<Data::Sah> compilers, as well as
  L<Data::Sah::Coerce> and L<Data::Sah::CoerceJS>.
  
  This function is not exported.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<coerce_rules> => I<array[str]>
  
  A specification of coercion rules to use (or avoid).
  
  This setting is used to specify which coercion rules to use (or avoid) in a
  flexible way. Each element is a string, in the form of either C<NAME> to mean
  specifically include a rule, or C<!NAME> to exclude a rule.
  
  Some coercion modules are used by default, unless explicitly avoided using the
  '!NAME' rule.
  
  To not use any rules:
  
  To use the default rules plus R1 and R2:
  
   ['R1', 'R2']
  
  To use the default rules but not R1 and R2:
  
   ['!R1', '!R2']
  
  =item * B<coerce_to> => I<str>
  
  Some Sah types, like C<date>, can be represented in a choice of types in the
  target language. For example, in Perl you can store it as a floating number
  a.k.a. C<float(epoch)>, or as a L<DateTime> object, or L<Time::Moment>
  object. Storing in DateTime can be convenient for date manipulation but requires
  an overhead of loading the module and storing in a bulky format. The choice is
  yours to make, via this setting.
  
  =item * B<compiler>* => I<str>
  
  =item * B<data_term>* => I<str>
  
  =item * B<type>* => I<sah::type_name>
  
  
  =back
  
  Returns an enveloped result (an array).
  
  First element (status) is an integer containing HTTP status code
  (200 means OK, 4xx caller error, 5xx function error). Second element
  (msg) is a string containing error message, or 'OK' if status is
  200. Third element (payload) is optional, the actual result. Fourth
  element (meta) is called result metadata and is optional, a hash
  that contains extra information.
  
  Return value:  (any)
  
  =head1 ENVIRONMENT
  
  =head2 PERL_DATA_SAH_COERCE_SUPPORT_OLD_PREFIX
  
  If set to false, will not support old prefix
  (Data::Sah::Coerce::<$TARGET_TYPE>::<$SOURCE_TYPE_AND_DESC>. Mainly for testing.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah-Coerce>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah-Coerce>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah-Coerce>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COERCECOMMON

    $main::fatpacked{"Data/Sah/CoerceJS.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COERCEJS';
  package Data::Sah::CoerceJS;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-02-12'; # DATE
  our $DIST = 'Data-Sah-Coerce'; # DIST
  our $VERSION = '0.047'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  use Log::ger;
  
  use Data::Sah::CoerceCommon;
  use IPC::System::Options;
  use Nodejs::Util qw(get_nodejs_path);
  
  use Exporter qw(import);
  our @EXPORT_OK = qw(gen_coercer);
  
  our %SPEC;
  
  our $Log_Coercer_Code = $ENV{LOG_SAH_COERCER_CODE} // 0;
  
  $SPEC{gen_coercer} = {
      v => 1.1,
      summary => 'Generate coercer code',
      description => <<'_',
  
  This is mostly for testing. Normally the coercion rules will be used from
  <pm:Data::Sah>.
  
  _
      args => {
          %Data::Sah::CoerceCommon::gen_coercer_args,
      },
      result_naked => 1,
  };
  sub gen_coercer {
      my %args = @_;
  
      my $rt = $args{return_type} // 'val';
      # old values still supported but deprecated
      $rt = 'bool_coerced+val' if $rt eq 'status+val';
      $rt = 'bool_coerced+str_errmsg+val' if $rt eq 'status+err+val';
  
      my $rules = Data::Sah::CoerceCommon::get_coerce_rules(
          %args,
          compiler=>'js',
          data_term=>'data',
      );
  
      my $code;
      if (@$rules) {
          my $expr;
          for my $i (reverse 0..$#{$rules}) {
              my $rule = $rules->[$i];
  
              my $prev_term;
              if ($i == $#{$rules}) {
                  if ($rt eq 'val') {
                      $prev_term = 'data';
                  } elsif ($rt eq 'bool_coerced+val') {
                      $prev_term = '[null, data]';
                  } else { # bool_coerced+str_errmsg+val
                      $prev_term = '[null, null, data]';
                  }
              } else {
                  $prev_term = $expr;
              }
  
              if ($rt eq 'val') {
                  if ($rule->{meta}{might_fail}) {
                      $expr = "(function() { if ($rule->{expr_match}) { var _tmp1 = $rule->{expr_coerce}; if (_tmp1[0]) { return null } else { return _tmp1[1] } } else { return $prev_term } })()";
                  } else {
                      $expr = "($rule->{expr_match}) ? ($rule->{expr_coerce}) : $prev_term";
                  }
              } elsif ($rt eq 'bool_coerced+val') {
                  if ($rule->{meta}{might_fail}) {
                      $expr = "(function() { if ($rule->{expr_match}) { var _tmp1 = $rule->{expr_coerce}; if (_tmp1[0]) { return [true, null] } else { return [true, _tmp1[1]] } } else { return $prev_term } })()";
                  } else {
                      $expr = "($rule->{expr_match}) ? [true, $rule->{expr_coerce}] : $prev_term";
                  }
              } else { # bool_coerced+str_errmsg+val
                  if ($rule->{meta}{might_fail}) {
                      $expr = "(function() { if ($rule->{expr_match}) { var _tmp1 = $rule->{expr_coerce}; if (_tmp1[0]) { return [true, _tmp1[0], null] } else { return [true, null, _tmp1[1]] } } else { return $prev_term } })()";
                  } else {
                      $expr = "($rule->{expr_match}) ? [true, null, $rule->{expr_coerce}] : $prev_term";
                  }
              }
          }
  
          $code = join(
              "",
              "function (data) {\n",
              "    if (data === undefined || data === null) {\n",
              "        ", ($rt eq 'val' ? "return null;" :
                               $rt eq 'bool_coerced+val' ? "return [null, null];" :
                               "return [null, null, null];" # bool_coerced+str_errmsg+val
                           ), "\n",
              "    }\n",
              "    return ($expr);\n",
              "}",
          );
      } else {
          if ($rt eq 'val') {
              $code = 'function (data) { return data }';
          } elsif ($rt eq 'bool_coerced+val') {
              $code = 'function (data) { return [null, data] }';
          } else { # bool_coerced+str_errmsg+val
              $code = 'function (data) { return [null, null, data] }';
          }
      }
  
      if ($Log_Coercer_Code) {
          log_trace("Coercer code (gen args: %s): %s", \%args, $code);
      }
  
      return $code if $args{source};
  
      state $nodejs_path = get_nodejs_path();
      die "Can't find node.js in PATH" unless $nodejs_path;
  
      sub {
          require File::Temp;
          require JSON;
          #require String::ShellQuote;
  
          my $data = shift;
  
          state $json = JSON->new->allow_nonref;
  
          # code to be sent to nodejs
          my $src = "var coercer = $code;\n\n".
              "console.log(JSON.stringify(coercer(".
                  $json->encode($data).")))";
  
          my ($jsh, $jsfn) = File::Temp::tempfile();
          print $jsh $src;
          close($jsh) or die "Can't write JS code to file $jsfn: $!";
  
          my $out = IPC::System::Options::readpipe($nodejs_path, $jsfn);
          $json->decode($out);
      };
  }
  
  1;
  # ABSTRACT: Generate coercer code
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::CoerceJS - Generate coercer code
  
  =head1 VERSION
  
  This document describes version 0.047 of Data::Sah::CoerceJS (from Perl distribution Data-Sah-Coerce), released on 2020-02-12.
  
  =head1 SYNOPSIS
  
   use Data::Sah::CoerceJS qw(gen_coercer);
  
   # use as you would use Data::Sah::Coerce
  
  =head1 DESCRIPTION
  
  This module is just like L<Data::Sah::Coerce> except that it uses JavaScript
  coercion rule modules.
  
  =head1 VARIABLES
  
  =head2 $Log_Coercer_Code => bool (default: from ENV or 0)
  
  If set to true, will log the generated coercer code (currently using L<Log::ger>
  at trace level). To see the log message, e.g. to the screen, you can use
  something like:
  
   % TRACE=1 perl -MLog::ger::LevelFromEnv -MLog::ger::Output=Screen \
       -MData::Sah::CoerceJS=gen_coercer -E'my $c = gen_coercer(...)'
  
  =head1 FUNCTIONS
  
  
  =head2 gen_coercer
  
  Usage:
  
   gen_coercer() -> any
  
  Generate coercer code.
  
  This is mostly for testing. Normally the coercion rules will be used from
  L<Data::Sah>.
  
  This function is not exported by default, but exportable.
  
  No arguments.
  
  Return value:  (any)
  
  =head1 ENVIRONMENT
  
  =head2 LOG_SAH_COERCER_CODE => bool
  
  Set default for C<$Log_Coercer_Code>.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah-Coerce>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah-Coerce>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah-Coerce>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Data::Sah::Coerce>
  
  L<App::SahUtils>, including L<coerce-with-sah> to conveniently test coercion
  from the command-line.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COERCEJS

    $main::fatpacked{"Data/Sah/Compiler.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COMPILER';
  package Data::Sah::Compiler;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  
  #use Carp;
  use Mo qw(default);
  use Role::Tiny::With;
  use Log::ger;
  use Scalar::Util qw(blessed);
  
  our %coercer_cache; # key=type, value=coercer coderef
  
  with 'Data::Sah::Compiler::TextResultRole';
  
  has main => (is => 'rw');
  
  # BEGIN COPIED FROM String::LineNumber
  sub __linenum {
      my ($str, $opts) = @_;
      $opts //= {};
      $opts->{width}      //= 4;
      $opts->{zeropad}    //= 0;
      $opts->{skip_empty} //= 1;
  
      my $i = 0;
          $str =~ s/^(([\t ]*\S)?.*)/
          sprintf(join("",
                       "%",
                       ($opts->{zeropad} && !($opts->{skip_empty}
                                                  && !defined($2)) ? "0" : ""),
                       $opts->{width}, "s",
                       "|%s"),
                  ++$i && $opts->{skip_empty} && !defined($2) ? "" : $i,
                  $1)/meg;
  
      $str;
  }
  # END COPIED FROM String::LineNumber
  
  sub name {
      die "BUG: Please override name()";
  }
  
  # literal representation in target language
  sub literal {
      die "BUG: Please override literal()";
  }
  
  # compile expression to target language
  sub expr {
      die "BUG: Please override expr()";
  }
  
  sub _die {
      my ($self, $cd, $msg) = @_;
      die join(
          "",
          "Sah ". $self->name . " compiler: ",
          "at schema:/", join("/", @{$cd->{spath} // []}), ": ",
          # XXX show (snippet of) current schema
          $msg,
      );
  }
  
  # form dependency list from which clauses are mentioned in expressions NEED TO
  # BE UPDATED: NEED TO CHECK EXPR IN ALL ATTRS FOR THE WHOLE SCHEMA/SUBSCHEMAS
  # (NOT IN THE CURRENT CLSET ONLY), THERE IS NO LONGER A ctbl, THE WAY EXPR IS
  # STORED IS NOW DIFFERENT. PLAN: NORMALIZE ALL SUBSCHEMAS, GATHER ALL EXPR VARS
  # AND STORE IN $cd->{all_expr_vars} (SKIP DOING THIS IS
  # $cd->{outer_cd}{all_expr_vars} is already defined).
  sub _form_deps {
      #require Data::Graph::Util;
      require Language::Expr::Interpreter::var_enumer;
  
      my ($self, $cd, $ctbl) = @_;
      my $main = $self->main;
  
      my %depends;
      for my $crec (values %$ctbl) {
          my $cn = $crec->{name};
          my $expr = defined($crec->{expr}) ? $crec->{value} :
              $crec->{attrs}{expr};
          if (defined $expr) {
              my $vars = $main->_var_enumer->eval($expr);
              for (@$vars) {
                  /^\w+$/ or $self->_die($cd,
                      "Invalid variable syntax '$_', ".
                          "currently only the form \$abc is supported");
                  $ctbl->{$_} or $self->_die($cd,
                      "Unhandled clause specified in variable '$_'");
              }
              $depends{$cn} = $vars;
              for (@$vars) {
                  push @{ $ctbl->{$_}{depended_by} }, $cn;
              }
          } else {
              $depends{$cn} = [];
          }
      }
      #$log->tracef("deps: %s", \%depends);
      #my @sorted = Data::Graph::Util::toposort(\%depends); # dies when cyclic
      #$log->tracef("sorted: %s", \@sorted);
      my %rsched = #map
          #{@{ $depends{$sched->[$_]} } ? ($sched->[$_] => $_) : ()}
          #    0..@$sched-1;
          (); # TMP
      #$log->tracef("deps: %s", \%rsched);
      \%rsched;
  }
  
  # generate a list of clauses in clsets, in order of evaluation. clauses are
  # sorted based on expression dependencies and priority. result is array of
  # [CLSET_NUM, CLAUSE, CLAUSEMETA] triplets, e.g. ([0, 'default', {...}], [1,
  # 'default', {...}], [0, 'min', {...}], [0, 'max', {...}]).
  sub _get_clauses_from_clsets {
      my ($self, $cd, $clsets) = @_;
      my $tn = $cd->{type};
      my $th = $cd->{th};
  
      my $deps;
      ## temporarily disabled, expr needs to be sorted globally
      #if ($self->_clset_has_expr($clset)) {
      #    $deps = $self->_form_deps($ctbl);
      #} else {
      #    $deps = {};
      #}
      #$deps = {};
  
      my $sorter = sub {
          my ($ia, $ca, $metaa) = @$a;
          my ($ib, $cb, $metab) = @$b;
          my $res;
  
          # dependency
          #$res = ($deps->{"$ca.$ia"} // -1) <=> ($deps->{"$cb.$ib"} // -1);
          #return $res if $res;
  
          {
              $res = $metaa->{prio} <=> $metab->{prio};
              #$log->errorf("TMP:   sort1");
              last if $res;
  
              # prio from schema
              my $sprioa = $clsets->[$ia]{"$ca.prio"} // 50;
              my $spriob = $clsets->[$ib]{"$cb.prio"} // 50;
              $res = $sprioa <=> $spriob;
              #$log->errorf("TMP:   sort2");
              last if $res;
  
              # alphabetical order of clause name
              $res = $ca cmp $cb;
              #$log->errorf("TMP:   sort3");
              last if $res;
  
              # clause set order
              $res = $ia <=> $ib;
              #$log->errorf("TMP:   sort4");
              last if $res;
  
              $res = 0;
          }
  
          #$log->errorf("TMP:   sort [%s,%s] vs [%s,%s] = %s", $ia, $ca, $ib, $cb, $res);
          $res;
      };
  
      my @clauses;
      for my $i (0..@$clsets-1) {
          for my $k (grep {!/\A_/ && !/\./} keys %{$clsets->[$i]}) {
              my $meta;
              eval {
                  $meta = "Data::Sah::Type::$tn"->${\("clausemeta_$k")};
              };
              if ($@) {
                  for ($cd->{args}{on_unhandled_clause}) {
                      my $msg = "Unhandled clause for type $tn: $k ($@)";
                      next if $_ eq 'ignore';
                      next if $_ eq 'warn'; # don't produce multiple warnings
                      $self->_die($cd, $msg);
                  }
              }
              $meta //= {prio=>50};
              push @clauses, [$i, $k, $meta];
          }
      }
  
      my $res = [sort $sorter @clauses];
      #$log->errorf("TMP: sorted clauses: %s", $res);
      $res;
  }
  
  sub get_th {
      my ($self, %args) = @_;
      my $cd    = $args{cd};
      my $name  = $args{name};
  
      my $th_map = $cd->{th_map};
      return $th_map->{$name} if $th_map->{$name};
  
      if ($args{load} // 1) {
          no warnings;
          $self->_die($cd, "Invalid syntax for type name '$name', please use ".
                          "letters/numbers/underscores only")
              unless $name =~ $Data::Sah::type_re;
          my $main = $self->main;
          my $module = ref($self) . "::TH::$name";
          if (!eval "require $module; 1") {
              $self->_die($cd, "Can't load type handler $module".
                              ($@ ? ": $@" : ""));
          }
          $self->add_compile_module($cd, $module, {category=>'type_handler'});
  
          my $obj = $module->new(compiler=>$self);
          $th_map->{$name} = $obj;
      }
      return $th_map->{$name};
  }
  
  sub get_fsh {
      my ($self, %args) = @_;
      my $cd    = $args{cd};
      my $name  = $args{name};
  
      my $fsh_table = $cd->{fsh_table};
      return $fsh_table->{$name} if $fsh_table->{$name};
  
      if ($args{load} // 1) {
          no warnings;
          $self->_die($cd, "Invalid syntax for func set name '$name', ".
                          "please use letters/numbers/underscores")
              unless $name =~ $Data::Sah::funcset_re;
          my $module = ref($self) . "::FSH::$name";
          if (!eval "require $module; 1") {
              $self->_die($cd, "Can't load func set handler $module".
                              ($@ ? ": $@" : ""));
          }
  
          my $obj = $module->new();
          $fsh_table->{$name} = $obj;
      }
      return $fsh_table->{$name};
  }
  
  sub init_cd {
      require Time::HiRes;
  
      my ($self, %args) = @_;
  
      my $cd = {};
      $cd->{v} = 2;
      $cd->{args} = \%args;
      $cd->{compiler} = $self;
      $cd->{compiler_name} = $self->name;
  
      if (my $ocd = $args{outer_cd}) {
          # for checking later, because outer_cd might be autovivified to hash
          # later
          $cd->{is_inner}       = 1;
  
          $cd->{outer_cd}     = $ocd;
          $cd->{indent_level} = $ocd->{indent_level};
          $cd->{th_map}       = { %{ $ocd->{th_map}  } };
          $cd->{fsh_map}      = { %{ $ocd->{fsh_map} } };
          $cd->{default_lang} = $ocd->{default_lang};
          $cd->{spath}        = [@{ $ocd->{spath} }];
      } else {
          $cd->{indent_level} = $cd->{args}{indent_level} // 0;
          $cd->{th_map}       = {};
          $cd->{fsh_map}      = {};
          # we use || here because in some env, LANG/LANGUAGE is set to ''
          $cd->{default_lang} = $ENV{LANG} || "en_US";
          $cd->{default_lang} =~ s/\..+//; # en_US.UTF-8 -> en_US
          $cd->{spath}        = [];
      }
      $cd->{_id} = Time::HiRes::gettimeofday(); # compilation id
      $cd->{ccls} = [];
  
      $cd;
  }
  
  sub check_compile_args {
      my ($self, $args) = @_;
  
      return if $args->{_args_checked}++;
  
      $args->{data_name} //= 'data';
      $args->{data_name} =~ /\A[A-Za-z_]\w*\z/ or $self->_die(
          {}, "Invalid syntax in data_name '$args->{data_name}', ".
              "please use letters/nums only");
      $args->{allow_expr} //= 1;
      $args->{on_unhandled_attr}   //= 'die';
      $args->{on_unhandled_clause} //= 'die';
      $args->{skip_clause}         //= [];
      $args->{mark_missing_translation} //= 1;
      for ($args->{lang}) {
          $_ //= $ENV{LANG} || $ENV{LANGUAGE} || "en_US";
          s/\W.*//; # LANG=en_US.UTF-8, LANGUAGE=en_US:en
      }
      # locale, no default
  }
  
  sub _process_clause {
      my ($self, $cd, $clset_num, $clause) = @_;
  
      my $th = $cd->{th};
      my $tn = $cd->{type};
      my $clsets = $cd->{clsets};
  
      my $clset = $clsets->[$clset_num];
      local $cd->{spath}       = [@{$cd->{spath}}, $clause];
      local $cd->{clset}       = $clset;
      local $cd->{clset_num}   = $clset_num;
      local $cd->{uclset}      = $cd->{uclsets}[$clset_num];
      local $cd->{clset_dlang} = $cd->{_clset_dlangs}[$clset_num];
      #$log->tracef("Processing clause %s", $clause);
  
      delete $cd->{uclset}{$clause};
      delete $cd->{uclset}{"$clause.prio"};
  
      if (grep { $_ eq $clause } @{ $cd->{args}{skip_clause} }) {
          delete $cd->{uclset}{$_}
              for grep {/^\Q$clause\E(\.|\z)/} keys(%{$cd->{uclset}});
          return;
      }
  
      my $meth  = "clause_$clause";
      my $mmeth = "clausemeta_$clause";
      unless ($th->can($meth)) {
          for ($cd->{args}{on_unhandled_clause}) {
              next if $_ eq 'ignore';
              do { warn "Can't handle clause $clause"; next }
                  if $_ eq 'warn';
              $self->_die($cd, "Can't handle clause $clause");
          }
      }
  
      # put information about the clause to $cd
  
      my $meta;
      if ($th->can($mmeth)) {
          $meta = $th->$mmeth;
      } else {
          $meta = {};
      }
      local $cd->{cl_meta} = $meta;
      $self->_die($cd, "Clause $clause doesn't allow expression")
          if $clset->{"$clause.is_expr"} && !$meta->{allow_expr};
      for my $a (keys %{ $meta->{attrs} }) {
          my $av = $meta->{attrs}{$a};
          $self->_die($cd, "Attribute $clause.$a doesn't allow ".
                          "expression")
              if $clset->{"$clause.$a.is_expr"} && !$av->{allow_expr};
      }
      local $cd->{clause} = $clause;
      my $cv = $clset->{$clause};
      my $ie = $clset->{"$clause.is_expr"};
      my $op = $clset->{"$clause.op"};
  
      # store original value before being coerced/normalized
      local $cd->{cl_raw_value}   = $cv;
  
      # coerce clause value (with default coerce rules & x.perl.coerce_to). XXX it
      # should be validate + coerce but for now we do coerce to reduce compilation
      # overhead.
      {
          last if $ie;
          my $coerce_type = $meta->{schema}[0] or last;
          my $value_is_array;
          if ($coerce_type eq '_same') {
              $coerce_type = $cd->{type};
          } elsif ($coerce_type eq '_same_elem') {
              $coerce_type = $cd->{nschema}[1]{of} //
                  $cd->{nschema}[1]{each_elem} // 'any';
          } elsif ($clause eq 'between' || $clause eq 'xbetween') { # XXX special cased for now
              $coerce_type = $cd->{type};
              $value_is_array = 1;
          }
          my $coercer = $coercer_cache{$coerce_type};
          if (!$coercer) {
              require Data::Sah::Coerce;
              $coercer = Data::Sah::Coerce::gen_coercer(
                  type => $coerce_type,
                  return_type=>'status+err+val',
                  (coerce_to => $cd->{coerce_to}) x !!$cd->{coerce_to},
              );
              $coercer_cache{$coerce_type} = $coercer;
          }
          my ($cstatus, $cerr);
          if ($op && ($op eq 'or' || $op eq 'and')) {
              for my $cv2 (@$cv) {
                  if ($value_is_array) {
                      $cv2 = [@$cv2]; # shallow copy
                      for (@$cv2) {
                          ($cstatus, $cerr, $_) = @{ $coercer->($_) };
                          if ($cerr) {
                              $self->_die($cd, "Can't coerce clause value $_: $cerr");
                          }
                      }
                  } else {
                      ($cstatus, $cerr, $cv) = @{ $coercer->($cv) };
                      if ($cerr) {
                          $self->_die($cd, "Can't coerce clause value $cv: $cerr");
                      }
                  }
              }
          } else {
              if ($value_is_array) {
                  $cv = [@$cv]; # shallow copy
                  for (@$cv) {
                      my $cf;
                      ($cstatus, $cerr, $_) = @{ $coercer->($_) };
                      if ($cerr) {
                          $self->_die($cd, "Can't coerce clause value $_: $cerr");
                      }
                  }
              } else {
                  ($cstatus, $cerr, $cv) = @{ $coercer->($cv) };
                  if ($cerr) {
                      $self->_die($cd, "Can't coerce clause value $cv: $cerr");
                  }
              }
          }
          #$log->tracef("Coerced clause value %s to %s (type=%s)",
          #             $cd->{cl_raw_value}, $cv, $coerce_type);
      }
  
      local $cd->{cl_value}   = $cv;
      local $cd->{cl_term}    = $ie ? $self->expr($cd, $cv) : $self->literal($cv);
      local $cd->{cl_is_expr} = $ie;
      local $cd->{cl_op}      = $op;
      delete $cd->{uclset}{"$clause.is_expr"};
      delete $cd->{uclset}{"$clause.op"};
  
      if ($self->can("before_clause")) {
          $self->before_clause($cd);
      }
      if ($th->can("before_clause")) {
          $th->before_clause($cd);
      }
      my $tmpnam = "before_clause_$clause";
      if ($th->can($tmpnam)) {
          $th->$tmpnam($cd);
      }
  
      my $is_multi;
      if (defined($op) && !$ie) {
          if ($op =~ /\A(and|or|none)\z/) {
              $is_multi = 1;
          } elsif ($op eq 'not') {
              $is_multi = 0;
          } else {
              $self->_die($cd, "Invalid value for $clause.op, ".
                              "must be one of and/or/not/none");
          }
      }
      $self->_die($cd, "'$clause.op' attribute set to $op, ".
                      "but value of '$clause' clause not an array")
          if $is_multi && ref($cv) ne 'ARRAY';
      if (!$th->can($meth)) {
          # skip
      } elsif ($cd->{CLAUSE_DO_MULTI} || !$is_multi) {
          local $cd->{cl_is_multi} = 1 if $is_multi;
          $th->$meth($cd);
      } else {
          my $i = 0;
          for my $cv2 (@$cv) {
              local $cd->{spath} = [@{ $cd->{spath} }, $i];
              local $cd->{cl_value} = $cv2;
              local $cd->{cl_term}  = $self->literal($cv2);
              local $cd->{_debug_ccl_note} = "" if $i;
              $i++;
              $th->$meth($cd);
          }
      }
  
      $tmpnam = "after_clause_$clause";
      if ($th->can($tmpnam)) {
          $th->$tmpnam($cd);
      }
      if ($th->can("after_clause")) {
          $th->after_clause($cd);
      }
      if ($self->can("after_clause")) {
          $self->after_clause($cd);
      }
  
      delete $cd->{uclset}{"$clause.err_msg"};
      delete $cd->{uclset}{"$clause.err_level"};
      delete $cd->{uclset}{$_} for
          grep {/\A\Q$clause\E\.human(\..+)?\z/} keys(%{$cd->{uclset}});
  }
  
  sub _process_clsets {
      my ($self, $cd, $which) = @_;
  
      # $which can be left undef/false if called from compile(), or set to 'from
      # clause_clset' if called from within clause_clset(), in which case
      # before_handle_type, handle_type, before_all_clauses, and after_all_clauses
      # won't be called.
  
      my $th = $cd->{th};
      my $tn = $cd->{type};
      my $clsets = $cd->{clsets};
  
      my $cname = $self->name;
      local $cd->{uclsets} = [];
      $cd->{_clset_dlangs} = []; # default lang for each clset
      for my $clset (@$clsets) {
          for (keys %$clset) {
              if (!$cd->{args}{allow_expr} && /\.is_expr\z/ && $clset->{$_}) {
                  $self->_die($cd, "Expression not allowed: $_");
              }
          }
          $cd->{coerce_to} //= $clset->{'x.perl.coerce_to'} if $clset->{'x.perl.coerce_to'};
          push @{ $cd->{uclsets} }, {
              map {$_=>$clset->{$_}}
                  grep {
                      !/\A_|\._|\Ax\./ && (!/\Ac\./ || /\Ac\.\Q$cname\E\./)
                  } keys %$clset
          };
          my $dl = $clset->{default_lang} //
              ($cd->{outer_cd} ? $cd->{outer_cd}{clset_dlang} : undef) //
                  "en_US";
          push @{ $cd->{_clset_dlangs} }, $dl;
      }
  
      my $clauses = $self->_get_clauses_from_clsets($cd, $clsets);
      $cd->{has_constraint_clause} = 0;
      $cd->{has_subschema} = 0;
      #$cd->{inspect_elem} = 0; # currently not needed
      for my $cl (@$clauses) {
          # 0=clset_num, 1=cl name, 2=cl meta
          next if $cl->[1] =~ /\A(req|forbidden)\z/;
          $cd->{has_subschema} = 1 if $cl->[2]{subschema};
          #$cd->{inspect_elem}  = 1 if $cl->[2]{inspect_elem};
          if ($cl->[2]{tags} && grep {$_ eq 'constraint'} @{ $cl->[2]{tags} }) {
              $cd->{has_constraint_clause} = 1;
          }
      }
  
      if ($which) {
          # {before,after}_clause_sets is currently internal/undocumented, created
          # only for clause_clset
          if ($self->can("before_clause_sets")) {
              $self->before_clause_sets($cd);
          }
          if ($th->can("before_clause_sets")) {
              $th->before_clause_sets($cd);
          }
      } else {
          if ($self->can("before_handle_type")) {
              $self->before_handle_type($cd);
          }
  
          $th->handle_type($cd);
  
          if ($self->can("before_all_clauses")) {
              $self->before_all_clauses($cd);
          }
          if ($th->can("before_all_clauses")) {
              $th->before_all_clauses($cd);
          }
      }
  
      for my $clause0 (@$clauses) {
          my ($clset_num, $clause) = @$clause0;
          $self->_process_clause($cd, $clset_num, $clause);
      } # for clause
  
      for my $uclset (@{ $cd->{uclsets} }) {
          if (keys %$uclset) {
              for ($cd->{args}{on_unhandled_attr}) {
                  my $msg = "Unhandled attribute(s) for type $tn: ".
                      join(", ", keys %$uclset);
                  next if $_ eq 'ignore';
                  do { warn $msg; next } if $_ eq 'warn';
                  $self->_die($cd, $msg);
              }
          }
      }
  
      if ($which) {
          # {before,after}_clause_sets is currently internal/undocumented, created
          # only for clause_clset
          if ($th->can("after_clause_sets")) {
              $th->after_clause_sets($cd);
          }
          if ($self->can("after_clause_sets")) {
              $self->after_clause_sets($cd);
          }
      } else {
          if ($th->can("after_all_clauses")) {
              $th->after_all_clauses($cd);
          }
          if ($self->can("after_all_clauses")) {
              $self->after_all_clauses($cd);
          }
      }
  }
  
  sub compile {
      my ($self, %args) = @_;
  
      # XXX schema
      $self->check_compile_args(\%args);
  
      my $main   = $self->main;
      my $cd     = $self->init_cd(%args);
  
      if ($self->can("before_compile")) {
          $self->before_compile($cd);
      }
  
      # normalize schema
      my $schema0 = $args{schema} or $self->_die($cd, "No schema");
      my $nschema;
      if ($args{schema_is_normalized}) {
          $nschema = $schema0;
          #$log->tracef("schema already normalized, skipped normalization");
      } else {
          $nschema = $main->normalize_schema($schema0);
          #$log->tracef("normalized schema=%s", $nschema);
      }
      $cd->{nschema} = $nschema;
      local $cd->{schema} = $nschema;
  
      {
          my $defs = $nschema->[2]{def};
          if ($defs) {
              for my $name (sort keys %$defs) {
                  my $def = $defs->{$name};
                  my $opt = $name =~ s/[?]\z//;
                  local $cd->{def_optional} = $opt;
                  local $cd->{def_name}     = $name;
                  $self->_die($cd, "Invalid name syntax in def: '$name'")
                      unless $name =~ $Data::Sah::type_re;
                  local $cd->{def_def}      = $def;
                  $self->def($cd);
                  #$log->tracef("=> def() name=%s, def=>%s, optional=%s)",
                  #             $name, $def, $opt);
              }
          }
      }
  
      require Data::Sah::Resolve;
      my $res       = Data::Sah::Resolve::resolve_schema(
          {
              schema_is_normalized => 1,
              #return_intermediates => 1,
          }, $nschema);
      my $tn        = $res->[0];
      $cd->{th}     = $self->get_th(name=>$tn, cd=>$cd);
      $cd->{type}   = $tn;
      $cd->{clsets} = $res->[1];
      #$cd->{_intermediate_schemas} = $res->[2];
      if ($nschema->[0] ne $tn) {
          $self->add_compile_module($cd, "Sah::Schema::$nschema->[0]");
      }
  
      $self->_process_clsets($cd);
  
      if ($self->can("after_compile")) {
          $self->after_compile($cd);
      }
  
      if ($args{log_result}) {# && $log->is_trace) {
          log_trace(
              "Schema compilation result:\n%s",
              !ref($cd->{result}) && ($ENV{LINENUM} // 1) ?
                  __linenum($cd->{result}) :
                  $cd->{result}
              );
      }
      return $cd;
  }
  
  sub def {
      my ($self, $cd) = @_;
      my $name = $cd->{def_name};
      my $def  = $cd->{def_def};
      my $opt  = $cd->{def_optional};
  
      my $th = $self->get_th(cd=>$cd, name=>$name, load=>0);
      if ($th) {
          if ($opt) {
              #$log->tracef("Not redefining already-defined schema/type '$name'");
              return;
          }
          $self->_die($cd, "Redefining existing type ($name) not allowed");
      }
  
      my $nschema = $self->main->normalize_schema($def);
      $cd->{th_map}{$name} = $nschema;
  }
  
  sub _ignore_clause {
      my ($self, $cd) = @_;
      my $cl = $cd->{clause};
      delete $cd->{uclset}{$cl};
  }
  
  sub _ignore_clause_and_attrs {
      my ($self, $cd) = @_;
      my $cl = $cd->{clause};
      delete $cd->{uclset}{$cl};
      delete $cd->{uclset}{$_} for grep {/\A\Q$cl\E\./} keys %{$cd->{uclset}};
  }
  
  sub _die_unimplemented_clause {
      my ($self, $cd, $note) = @_;
  
      $self->_die($cd, "Clause '$cd->{clause}' for type '$cd->{type}' ".
                      ($note ? "($note) " : "") .
                          "is currently unimplemented");
  }
  
  sub add_module {
      my ($self, $cd, $name, $extra_keys, $allow_duplicate) = @_;
  
      my $found;
      for (@{ $cd->{modules} }) {
          if ($_->{name} eq $name && $_->{phase} eq $extra_keys->{phase}) {
              $found++;
              last;
          }
      }
      return if $found && !$allow_duplicate;
      push @{ $cd->{modules} }, {
          name => $name,
          %{ $extra_keys // {} },
      };
  }
  
  sub add_runtime_module {
      my ($self, $cd, $name, $extra_keys, $allow_duplicate) = @_;
  
      if ($extra_keys) {
          $extra_keys = { %$extra_keys, phase => 'runtime' };
      } else {
          $extra_keys = { phase => 'runtime' };
      }
      $self->add_module($cd, $name, $extra_keys, $allow_duplicate);
  }
  
  sub add_compile_module {
      my ($self, $cd, $name, $extra_keys, $allow_duplicate) = @_;
  
      if ($extra_keys) {
          $extra_keys = { %$extra_keys, phase => 'compile' };
      } else {
          $extra_keys = { phase => 'compile' };
      }
      $self->add_module($cd, $name, $extra_keys, $allow_duplicate);
  }
  
  1;
  # ABSTRACT: Base class for Sah compilers (Data::Sah::Compiler::*)
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Compiler - Base class for Sah compilers (Data::Sah::Compiler::*)
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Compiler (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(check_compile_args|def|expr|init_cd|literal|name|add_module|add_compile_module|add_runtime_module)$
  
  =head1 COMPILATION DATA KEYS
  
  =over
  
  =item * v => int
  
  Version of compilation data structure. Currently at 2. Whenever there's a
  backward-incompatible change introduced in the structure, this version number
  will be bumped. Client code can check this key to deliberately fail when it
  encounters version number that it can't handle.
  
  =item * args => HASH
  
  Arguments given to C<compile()>.
  
  =item * compiler => OBJ
  
  The compiler object.
  
  =item * compiler_name => str
  
  Compiler name, e.g. C<perl>, C<js>.
  
  =item * is_inner => bool
  
  Convenience. Will be set to 1 when this compilation is a subcompilation (i.e.
  compilation of a subschema). You can also check for C<outer_cd> to find out if
  this compilation is an inner compilation.
  
  =item * outer_cd => HASH
  
  If compilation is called from within another C<compile()>, this will be set to
  the outer compilation's C<$cd>. The inner compilation will inherit some values
  from the outer, like list of types (C<th_map>) and function sets (C<fsh_map>).
  
  =item * th_map => HASH
  
  Mapping of fully-qualified type names like C<int> and its
  C<Data::Sah::Compiler::*::TH::*> type handler object (or array, a normalized
  schema).
  
  =item * fsh_map => HASH
  
  Mapping of function set name like C<core> and its
  C<Data::Sah::Compiler::*::FSH::*> handler object.
  
  =item * schema => ARRAY
  
  The current schema (normalized) being processed. Since schema can contain other
  schemas, there will be subcompilation and this value will not necessarily equal
  to C<< $cd->{args}{schema} >>.
  
  =item * spath = ARRAY
  
  An array of strings, with empty array (C<[]>) as the root. Point to current
  location in schema during compilation. Inner compilation will continue/append
  the path.
  
  Example:
  
   # spath, with pointer to location in the schema
  
   spath: ["elems"] ----
                        \
   schema: ["array", {elems => ["float", [int => {min=>3}], [int => "div_by&" => [2, 3]]]}
  
   spath: ["elems", 0] ------------
                                   \
   schema: ["array", {elems => ["float", [int => {min=>3}], [int => "div_by&" => [2, 3]]]}
  
   spath: ["elems", 1, "min"] ---------------------
                                                   \
   schema: ["array", {elems => ["float", [int => {min=>3}], [int => "div_by&" => [2, 3]]]}
  
   spath: ["elems", 2, "div_by", 1] -------------------------------------------------
                                                                                     \
   schema: ["array", {elems => ["float", [int => {min=>3}], [int => "div_by&" => [2, 3]]]}
  
  Note: aside from C<spath>, there is also the analogous C<dpath> which points to
  the location of I<data> (e.g. array element, hash key). But this is declared and
  maintained by the generated code, not by the compiler.
  
  =item * th => OBJ
  
  Current type handler.
  
  =item * type => STR
  
  Current type name.
  
  =item * clsets => ARRAY
  
  All the clause sets. Each schema might have more than one clause set, due to
  processing base type's clause set.
  
  =item * clset => HASH
  
  Current clause set being processed. Note that clauses are evaluated not strictly
  in clset order, but instead based on expression dependencies and priority.
  
  =item * clset_dlang => HASH
  
  Default language of the current clause set. This value is taken from C<<
  $cd->{clset}{default_lang} >> or C<< $cd->{outer_cd}{default_lang} >> or the
  default C<en_US>.
  
  =item * clset_num => INT
  
  Set to 0 for the first clause set, 1 for the second, and so on. Due to merging,
  we might process more than one clause set during compilation.
  
  =item * uclset => HASH
  
  Short for "unprocessed clause set", a shallow copy of C<clset>, keys will be
  removed from here as they are processed by clause handlers, remaining keys after
  processing the clause set means they are not recognized by hooks and thus
  constitutes an error.
  
  =item * uclsets => ARRAY
  
  All the C<uclset> for each clause set.
  
  =item * clause => STR
  
  Current clause name.
  
  =item * cl_meta => HASH
  
  Metadata information about the clause, from the clause definition. This include
  C<prio> (priority), C<attrs> (list of attributes specific for this clause),
  C<allow_expr> (whether clause allows expression in its value), etc. See
  C<Data::Sah::Type::$TYPENAME> for more information.
  
  =item * cl_value => ANY
  
  Clause value. Note: for putting in generated code, use C<cl_term>.
  
  The clause value will be coerced if there are applicable coercion rules. To get
  the raw/original value as the schema specifies it, see C<cl_raw_value>.
  
  =item * cl_raw_value => any
  
  Like C<cl_value>, but without any coercion/filtering done to the value.
  
  =item * cl_term => STR
  
  Clause value term. If clause value is a literal (C<.is_expr> is false) then it
  is produced by passing clause value to C<literal()>. Otherwise, it is produced
  by passing clause value to C<expr()>.
  
  =item * cl_is_expr => BOOL
  
  A copy of C<< $cd->{clset}{"${clause}.is_expr"} >>, for convenience.
  
  =item * cl_op => STR
  
  A copy of C<< $cd->{clset}{"${clause}.op"} >>, for convenience.
  
  =item * cl_is_multi => BOOL
  
  Set to true if cl_value contains multiple clause values. This will happen if
  C<.op> is either C<and>, C<or>, or C<none> and C<< $cd->{CLAUSE_DO_MULTI} >> is
  set to true.
  
  =item * indent_level => INT
  
  Current level of indent when printing result using C<< $c->line() >>. 0 means
  unindented.
  
  =item * all_expr_vars => ARRAY
  
  All variables in all expressions in the current schema (and all of its
  subschemas). Used internally by compiler. For example (XXX syntax not not
  finalized):
  
   # schema
   [array => {of=>'str1', min_len=>1, 'max_len=' => '$min_len*3'},
    {def => {
        str1 => [str => {min_len=>6, 'max_len=' => '$min_len*2',
                         check=>'substr($_,0,1) eq "a"'}],
    }}]
  
   all_expr_vars => ['schema:///clsets/0/min_len', # or perhaps .../min_len/value
                     'schema://str1/clsets/0/min_len']
  
  This data can be used to order the compilation of clauses based on dependencies.
  In the above example, C<min_len> needs to be evaluated before C<max_len>
  (especially if C<min_len> is an expression).
  
  =item * modules => array of hash
  
  List of modules that are required, one way or another. Each element is a hash
  which must contain at least the C<name> key (module name). There are other keys
  like C<version> (minimum version), C<phase> (explained below). Some languages
  might add other keys, like C<perl> with C<use_statement> (statement to load/use
  the module, used by e.g. pragmas like C<no warnings 'void'> which are not the
  regular C<require MODULE> statement). Generally, duplicate entries (entries with
  the same C<name> and C<phase>) are avoided, except in special cases like Perl
  pragmas.
  
  There are I<runtime> modules (C<phase> key set to C<runtime>), which are
  required by the generated code when running. For each entry, the only required
  key is C<name>. Other keys include: C<version> (minimum version). Some languages
  have some additional rule for this, e.g. perl has C<use_statement> (how to use
  the module, e.g. for pragma, like C<no warnings 'void'>).
  
  There are also I<compile-time> modules (C<phase> key set to C<compile>), which
  are required during compilation of schema. This include coercion rule modules
  like L<Data::Sah::Coerce::perl::To_date::From_float::Epoch>, and so on. This
  information might be useful for distributions that use Data::Sah. Because
  Data::Sah is a modular library, where there are third party extensions for
  types, coercion rules, and so on, listing these modules as dependencies instead
  of a single C<Data::Sah> will ensure that dependants will pull the right
  distribution during installation.
  
  =item * ccls => [HASH, ...]
  
  (Result) Compiled clauses, collected during processing of schema's clauses. Each
  element will contain the compiled code in the target language, error message,
  and other information. At the end of processing, these will be joined together.
  
  =item * result => ...
  
  (Result) The final result. For most compilers, it will be string/text.
  
  =item * has_constraint_clause => bool
  
  Convenience. True if there is at least one constraint clause in the schema. This
  I<excludes> special clause C<req> and C<forbidden>.
  
  =item * has_subschema => bool
  
  Convenience. True if there is at least one clause which contains a subschema.
  
  =back
  
  =head1 ATTRIBUTES
  
  =head2 main => OBJ
  
  Reference to the main Data::Sah object.
  
  =head2 expr_compiler => OBJ
  
  Reference to expression compiler object. In the perl compiler, for example, this
  will be an instance of L<Language::Expr::Compiler::Perl> object.
  
  =head1 METHODS
  
  =head2 new() => OBJ
  
  =head2 $c->compile(%args) => HASH
  
  Compile schema into target language.
  
  Arguments (C<*> denotes required arguments, subclass may introduce others):
  
  =over 4
  
  =item * data_name => STR (default: 'data')
  
  A unique name. Will be used as default for variable names, etc. Should only be
  comprised of letters/numbers/underscores.
  
  =item * schema* => STR|ARRAY
  
  The schema to use. Will be normalized by compiler, unless
  C<schema_is_normalized> is set to true.
  
  =item * lang => STR (default: from LANG/LANGUAGE or C<en_US>)
  
  Desired output human language. Defaults (and falls back to) C<en_US>.
  
  =item * mark_missing_translation => BOOL (default: 1)
  
  If a piece of text is not found in desired human language, C<en_US> version of
  the text will be used but using this format:
  
   (en_US:the text to be translated)
  
  If you do not want this marker, set the C<mark_missing_translation> option to 0.
  
  =item * locale => STR
  
  Locale name, to be set during generating human text description. This sometimes
  needs to be if setlocale() fails to set locale using only C<lang>.
  
  =item * schema_is_normalized => BOOL (default: 0)
  
  If set to true, instruct the compiler not to normalize the input schema and
  assume it is already normalized.
  
  =item * allow_expr => BOOL (default: 1)
  
  Whether to allow expressions. If false, will die when encountering expression
  during compilation. Usually set to false for security reason, to disallow
  complex expressions when schemas come from untrusted sources.
  
  =item * on_unhandled_attr => STR (default: 'die')
  
  What to do when an attribute can't be handled by compiler (either it is an
  invalid attribute, or the compiler has not implemented it yet). Valid values
  include: C<die>, C<warn>, C<ignore>.
  
  =item * on_unhandled_clause => STR (default: 'die')
  
  What to do when a clause can't be handled by compiler (either it is an invalid
  clause, or the compiler has not implemented it yet). Valid values include:
  C<die>, C<warn>, C<ignore>.
  
  =item * indent_level => INT (default: 0)
  
  Start at a specified indent level. Useful when generated code will be inserted
  into another code (e.g. inside C<sub {}> where it is nice to be able to indent
  the inside code).
  
  =item * skip_clause => ARRAY (default: [])
  
  List of clauses to skip (to assume as if it did not exist). Example when
  compiling with the human compiler:
  
   # schema
   [int => {default=>1, between=>[1, 10]}]
  
   # generated human description in English
   integer, between 1 and 10, default 1
  
   # generated human description, with skip_clause => ['default']
   integer, between 1 and 10
  
  =back
  
  =head3 Compilation data
  
  During compilation, compile() will call various hooks (listed below). The hooks
  will be passed compilation data (C<$cd>) which is a hashref containing various
  compilation state and result. Compilation data is written to this hashref
  instead of on the object's attributes to make it easy to do recursive
  compilation (compilation of subschemas).
  
  Keys that are put into this compilation data include input data, compilation
  state, and others. Many of these keys might exist only temporarily during
  certain phases of compilation and will no longer exist at the end of
  compilation, for example C<clause> will only exist during processing of a clause
  and will be seen by hooks like C<before_clause> and C<after_clause>, it will not
  be seen by C<before_all_clauses> or C<after_compile>.
  
  For a list of keys, see L</"COMPILATION DATA KEYS">. Subclasses may add more
  data; see their respective documentation.
  
  =head3 Return value
  
  The compilation data will be returned as return value. Main result will be in
  the C<result> key. There is also C<ccls>, and subclasses may put additional
  results in other keys. Final usable result might need to be pieced together from
  these results, depending on your needs.
  
  =head3 Hooks
  
  By default this base compiler does not define any hooks; subclasses can define
  hooks to implement their compilation process. Each hook will be passed
  compilation data, and should modify or set the compilation data as needed. The
  hooks that compile() will call at various points, in calling order, are:
  
  =over 4
  
  =item * $c->before_compile($cd)
  
  Called once at the beginning of compilation.
  
  =item * $c->before_handle_type($cd)
  
  =item * $th->handle_type($cd)
  
  =item * $c->before_all_clauses($cd)
  
  Called before calling handler for any clauses.
  
  =item * $th->before_all_clauses($cd)
  
  Called before calling handler for any clauses, after compiler's
  before_all_clauses().
  
  =item * $c->before_clause($cd)
  
  Called for each clause, before calling the actual clause handler
  ($th->clause_NAME() or $th->clause).
  
  =item * $th->before_clause($cd)
  
  After compiler's before_clause() is called, I<type handler>'s before_clause()
  will also be called if available.
  
  Input and output interpretation is the same as compiler's before_clause().
  
  =item * $th->before_clause_NAME($cd)
  
  Can be used to customize clause.
  
  Introduced in v0.10.
  
  =item * $th->clause_NAME($cd)
  
  Clause handler. Will be called only once (if C<$cd->{CLAUSE_DO_MULTI}> is set to
  by other hooks before this) or once for each value in a multi-value clause (e.g.
  when C<.op> attribute is set to C<and> or C<or>). For example, in this schema:
  
   [int => {"div_by&" => [2, 3, 5]}]
  
  C<clause_div_by()> can be called only once with C<< $cd->{cl_value} >> set to
  [2, 3, 5] or three times, each with C<< $cd->{value} >> set to 2, 3, and 5
  respectively.
  
  =item * $th->after_clause_NAME($cd)
  
  Can be used to customize clause.
  
  Introduced in v0.10.
  
  =item * $th->after_clause($cd)
  
  Called for each clause, after calling the actual clause handler
  ($th->clause_NAME()).
  
  =item * $c->after_clause($cd)
  
  Called for each clause, after calling the actual clause handler
  ($th->clause_NAME()).
  
  Output interpretation is the same as $th->after_clause().
  
  =item * $th->after_all_clauses($cd)
  
  Called after all clauses have been compiled, before compiler's
  after_all_clauses().
  
  =item * $c->after_all_clauses($cd)
  
  Called after all clauses have been compiled.
  
  =item * $c->after_compile($cd)
  
  Called at the very end before compiling process end.
  
  =back
  
  =head2 $c->get_th
  
  =head2 $c->get_fsh
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COMPILER

    $main::fatpacked{"Data/Sah/Compiler/Prog.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COMPILER_PROG';
  package Data::Sah::Compiler::Prog;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-02-12'; # DATE
  our $DIST = 'Data-Sah'; # DIST
  our $VERSION = '0.907'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  use Log::ger;
  
  use Mo qw(build default);
  extends 'Data::Sah::Compiler';
  
  #use Digest::MD5 qw(md5_hex);
  
  # human compiler, to produce error messages
  has hc => (is => 'rw');
  
  # subclass should provide a default, choices: 'shell', 'c', 'ini', 'cpp'
  has comment_style => (is => 'rw');
  
  has var_sigil => (is => 'rw');
  
  has concat_op => (is => 'rw');
  
  has logical_and_op => (is => 'rw', default => sub {'&&'});
  
  has logical_not_op => (is => 'rw', default => sub {'!'});
  
  #has logical_or_op => (is => 'rw', default => sub {'||'});
  
  sub init_cd {
      my ($self, %args) = @_;
  
      my $cd = $self->SUPER::init_cd(%args);
      $cd->{vars} = {};
  
      my $hc = $self->hc;
      if (!$hc) {
          $hc = $self->main->get_compiler("human");
          $self->hc($hc);
      }
  
      if (my $ocd = $cd->{outer_cd}) {
          $cd->{vars}    = $ocd->{vars};
          $cd->{modules} = $ocd->{modules};
          $cd->{_hc}     = $ocd->{_hc};
          $cd->{_hcd}    = $ocd->{_hcd};
          $cd->{_subdata_level} = $ocd->{_subdata_level};
          $cd->{use_dpath} = 1 if $ocd->{use_dpath};
      } else {
          $cd->{vars}    = {};
          $cd->{modules} = [];
          $cd->{_hc}     = $hc;
          $cd->{_subdata_level} = 0;
      }
  
      $cd;
  }
  
  sub check_compile_args {
      my ($self, $args) = @_;
  
      return if $args->{_args_checked_Prog}++;
  
      $self->SUPER::check_compile_args($args);
  
      my $ct = ($args->{code_type} //= 'validator');
      if ($ct ne 'validator') {
          $self->_die({}, "code_type currently can only be 'validator'");
      }
      for ($args->{return_type}) {
          $_ //= 'bool_valid';
          # old values that are still supported but now deprecated
          $_ = "bool_valid"     if $_ eq 'bool';
          $_ = "bool_valid+val" if $_ eq 'bool+val';
          $_ = "str_errmsg"     if $_ eq 'str';
          $_ = "str_errmsg+val" if $_ eq 'str+val';
          $_ = "hash_details"   if $_ eq 'full';
      }
      my $rt = $args->{return_type};
      if ($rt !~ /\A(bool_valid\+val|bool_valid|str_errmsg\+val|str_errmsg|hash_details)\z/) {
          $self->_die({}, "Invalid value for return_type, ".
                          "use bool_valid+val|bool_valid|str_errmsg+val|str_errmsg|hash_details");
      }
      $args->{var_prefix} //= "_sahv_";
      $args->{sub_prefix} //= "_sahs_";
      $args->{data_term}  //= $self->var_sigil . $args->{data_name};
      $args->{data_term_is_lvalue} //= 1;
      $args->{tmp_data_name} //= "tmp_$args->{data_name}";
      $args->{tmp_data_term} //= $self->var_sigil . $args->{tmp_data_name};
      $args->{comment}    //= 1;
      $args->{err_term}   //= $self->var_sigil . "err_$args->{data_name}";
      $args->{coerce}     //= 1;
  }
  
  sub comment {
      my ($self, $cd, @args) = @_;
      return '' unless $cd->{args}{comment};
  
      my $content = join("", @args);
      $content =~ s/\n+/ /g;
  
      my $style = $self->comment_style;
      if ($style eq 'shell') {
          return join("", "# ", $content, "\n");
      } elsif ($style eq 'shell2') {
          return join("", "## ", $content, "\n");
      } elsif ($style eq 'cpp') {
          return join("", "// ", $content, "\n");
      } elsif ($style eq 'c') {
          return join("", "/* ", $content, '*/');
      } elsif ($style eq 'ini') {
          return join("", "; ", $content, "\n");
      } else {
          $self->_die($cd, "BUG: Unknown comment style: $style");
      }
  }
  
  # enclose expression with parentheses, unless it already is
  sub enclose_paren {
      my ($self, $expr, $force) = @_;
      if ($expr =~ /\A(\s*)(\(.+\)\s*)\z/os) {
          return $expr if !$force;
          return "$1($2)";
      } else {
          $expr =~ /\A(\s*)(.*)/os;
          return "$1($2)";
      }
  }
  
  sub add_var {
      my ($self, $cd, $name, $value) = @_;
  
      return if exists $cd->{vars}{$name};
      #$log->tracef("TMP: add_var %s", $name);
      $cd->{vars}{$name} = $value;
  }
  
  # naming convention: expr_NOUN(), stmt_VERB(_NOUN)?()
  
  # XXX requires: expr_list
  
  # XXX requires: expr_defined
  
  # XXX requires: expr_array
  
  # XXX requires: expr_array_subscript
  
  # XXX requires: expr_last_elem
  
  # XXX requires: expr_push
  
  # XXX requires: expr_pop
  
  # XXX requires: expr_push_and_pop_dpath_between_expr
  
  # XXX requires: expr_prefix_dpath
  
  # XXX requires: expr_set
  
  # XXX requires: expr_setif
  
  # XXX requires: expr_set_err_str
  
  # XXX requires: expr_set_err_full
  
  # XXX requires: expr_reset_err_str
  
  # XXX requires: expr_reset_err_full
  
  # XXX requires: expr_ternary
  
  # XXX requires: expr_log
  
  # XXX requires: expr_block
  
  # XXX requires: expr_anon_sub
  
  # XXX requires: expr_eval
  
  # XXX requires: stt_declare_local_var
  
  # TODO XXX requires: expr_declare_lexical_var
  
  # XXX requires: stmt_require_module
  
  # XXX requires: stmt_require_log_module
  
  # XXX requires: stmt_assign_hash_value
  
  # XXX requires: stmt_return
  
  sub _xlt {
      my ($self, $cd, $text) = @_;
  
      my $hc  = $cd->{_hc};
      my $hcd = $cd->{_hcd};
      #$log->tracef("(Prog) Translating text %s ...", $text);
      $hc->_xlt($hcd, $text);
  }
  
  # concatenate strings
  sub expr_concat {
      my ($self, @t) = @_;
      join(" " . $self->concat_op . " ", @t);
  }
  
  # variable
  sub expr_var {
      my ($self, $v) = @_;
      $self->var_sigil. $v;
  }
  
  sub expr_preinc {
      my ($self, $t) = @_;
      "++$t";
  }
  
  sub expr_preinc_var {
      my ($self, $v) = @_;
      "++" . $self->var_sigil. $v;
  }
  
  # expr_postinc
  # expr_predec
  # expr_postdec
  
  # args: log_result, var_term, err_term. the rest is the same/supplied to
  # compile().
  sub expr_validator_sub {
      my ($self, %args) = @_;
  
      my $log_result = delete $args{log_result};
      my $dt         = $args{data_term};
      my $vt         = delete($args{var_term}) // $dt;
      my $do_log     = $args{debug_log} // $args{debug};
      my $rt         = $args{return_type} // 'bool_valid';
  
      $args{indent_level} = 1;
  
      my $cd = $args{cd} // $self->compile(%args);
      my $et = $cd->{args}{err_term};
  
      if ($rt !~ /\Abool/) {
          my ($ev) = $et =~ /(\w+)/; # to remove sigil
          $self->add_var($cd, $ev, $rt =~ /\Astr/ ? undef : {});
      }
      my $resv = '_sahv_res';
      my $rest = $self->var_sigil . $resv;
  
      my $needs_expr_block = (grep {$_->{phase} eq 'runtime'} @{ $cd->{modules} })
                                  || $do_log;
  
      my $code = join(
          "",
          ($self->stmt_require_log_module."\n") x !!$do_log,
          (map { $self->stmt_require_module($_)."\n" }
               grep { $_->{phase} eq 'runtime' } @{ $cd->{modules} }),
          $self->expr_anon_sub(
              [$vt],
              join(
                  "",
                  (map {$self->stmt_declare_local_var(
                      $_, $self->literal($cd->{vars}{$_}))."\n"}
                       sort keys %{ $cd->{vars} }),
                  #$log->tracef('-> (validator)(%s) ...', $dt);\n";
                  $self->stmt_declare_local_var($resv, "\n\n" . $cd->{result})."\n\n",
  
                  # when rt=bool_valid, return true/false result
                  #(";\n\n\$log->tracef('<- validator() = %s', \$res)")
                  #    x !!($do_log && $rt eq 'bool_valid'),
                  ($self->stmt_return($rest)."\n")
                      x !!($rt eq 'bool_valid'),
  
                  # when rt=str_errmsg, return string error message
                  #($log->tracef('<- validator() = %s', ".
                  #     "\$err_data);\n\n";
                  #    x !!($do_log && $rt eq 'str_errmsg'),
                  ($self->expr_set_err_str($et, $self->literal('')).";",
                   "\n\n".$self->stmt_return($et)."\n")
                      x !!($rt eq 'str_errmsg'),
  
                  # when rt=bool_valid+val, return true/false result as well as
                  # final input value
                  ($self->stmt_return($self->expr_array($rest, $dt))."\n")
                      x !!($rt eq 'bool_valid+val'),
  
                  # when rt=str_errmsg+val, return string error message as well as
                  # final input value
                  ($self->expr_set_err_str($et, $self->literal('')).";",
                   "\n\n".$self->stmt_return($self->expr_array($et, $dt))."\n")
                      x !!($rt eq 'str_errmsg+val'),
  
                  # when rt=hash_details, return error hash
                  ($self->stmt_assign_hash_value($et, $self->literal('value'), $dt),
                   "\n".$self->stmt_return($et)."\n")
                      x !!($rt eq 'hash_details'),
              )
          ),
      );
  
      if ($needs_expr_block) {
          $code = $self->expr_block($code);
      }
  
      if ($log_result && log_is_trace()) {
          log_trace("validator code:\n%s",
                       ($ENV{LINENUM} // 1) ?
                           Data::Sah::Compiler::__linenum($code) :
                             $code);
      }
  
      $code;
  }
  
  # add compiled clause to ccls, along with extra information useful for joining
  # later (like error level, code for adding error message, etc). available
  # options:
  #
  # - err_level (str, the default will be taken from current clause's .err_level
  # if not specified),
  #
  # - err_expr (str, a string expression in the target language that evaluates to
  # an error message, the more general and dynamic alternative to err_msg.
  #
  # - err_msg (str, the default will be produced by human compiler if not
  # supplied, or taken from current clause's .err_msg),
  #
  # - subdata (bool, default false, if set to true then this means we are
  # delving into subdata, e.g. array elements or hash pair values, and appropriate
  # things must be done to adjust for this [e.g. push_dpath/pop_dpath at the end
  # so that error message can show the proper data path].
  #
  # - assert (bool, default false, if set to true means this ccl is an assert ccl,
  # meaning it always returns true and is not translated from an actual clause. it
  # will not affect number of errors nor produce error messages.)
  sub add_ccl {
      my ($self, $cd, $ccl, $opts) = @_;
      $opts //= {};
      my $clause = $cd->{clause} // "";
      my $op     = $cd->{cl_op} // "";
      #$log->errorf("TMP: adding ccl %s, current ccls=%s", $ccl, $cd->{ccls});
  
      my $el = $opts->{err_level} // $cd->{clset}{"$clause.err_level"} // "error";
      my $err_expr = $opts->{err_expr};
      my $err_msg  = $opts->{err_msg};
  
      if (defined $err_expr) {
          $self->add_var($cd, '_sahv_dpath', []) if $cd->{use_dpath};
          $err_expr = $self->expr_prefix_dpath($err_expr) if $cd->{use_dpath};
      } else {
          unless (defined $err_msg) { $err_msg = $cd->{clset}{"$clause.err_msg"} }
          unless (defined $err_msg) {
              # XXX how to invert on op='none' or op='not'?
  
              my @msgpath = @{$cd->{spath}};
              my $msgpath;
              my $hc  = $cd->{_hc};
              my $hcd = $cd->{_hcd};
              while (1) {
                  # search error message, use more general one if the more
                  # specific one is not available
                  last unless @msgpath;
                  $msgpath = join("/", @msgpath);
                  my $ccls = $hcd->{result}{$msgpath};
                  pop @msgpath;
                  if ($ccls) {
                      local $hcd->{args}{format} = 'inline_err_text';
                      $err_msg = $hc->format_ccls($hcd, $ccls);
                      # show path when debugging
                      $err_msg = "(msgpath=$msgpath) $err_msg"
                          if $cd->{args}{debug};
                      last;
                  }
              }
              if (!$err_msg) {
                  $err_msg = "ERR (clause=".($cd->{clause} // "").")";
              } else {
                  $err_msg = ucfirst($err_msg);
              }
          }
          if ($err_msg) {
              $self->add_var($cd, '_sahv_dpath', []) if $cd->{use_dpath};
              $err_expr = $self->literal($err_msg);
              $err_expr = $self->expr_prefix_dpath($err_expr) if $cd->{use_dpath};
          }
      }
  
      my $rt = $cd->{args}{return_type};
      my $et = $cd->{args}{err_term};
      my $err_code;
      if ($rt eq 'hash_details') {
          $self->add_var($cd, '_sahv_dpath', []) if $cd->{use_dpath};
          my $k = $el eq 'warn' ? 'warnings' : 'errors';
          $err_code = $self->expr_set_err_full($et, $k, $err_expr) if $err_expr;
      } elsif ($rt =~ /\Astr/) {
          if ($el ne 'warn') {
              $err_code = $self->expr_set_err_str($et, $err_expr) if $err_expr;
          }
      }
  
      my $res = {
          ccl             => $ccl,
          err_level       => $el,
          err_code        => $err_code,
          (_debug_ccl_note => $cd->{_debug_ccl_note}) x !!$cd->{_debug_ccl_note},
          subdata         => $opts->{subdata},
      };
      push @{ $cd->{ccls} }, $res;
      delete $cd->{uclset}{"$clause.err_level"};
      delete $cd->{uclset}{"$clause.err_msg"};
  }
  
  # join ccls to handle .op and insert error messages. opts = op
  sub join_ccls {
      my ($self, $cd, $ccls, $opts) = @_;
      $opts //= {};
      my $op = $opts->{op} // "and";
      #$log->errorf("TMP: joining ccl %s", $ccls);
      #warn "join_ccls"; #TMP
  
      my ($min_ok, $max_ok, $min_nok, $max_nok);
      if ($op eq 'and') {
          $max_nok = 0;
      } elsif ($op eq 'or') {
          $min_ok = 1;
      } elsif ($op eq 'none') {
          $max_ok = 0;
      } elsif ($op eq 'not') {
  
      }
      my $dmin_ok  = defined($min_ok);
      my $dmax_ok  = defined($max_ok);
      my $dmin_nok = defined($min_nok);
      my $dmax_nok = defined($max_nok);
  
      return "" unless @$ccls;
  
      my $rt      = $cd->{args}{return_type};
      my $vp      = $cd->{args}{var_prefix};
  
      my $aop = $self->logical_and_op;
      my $nop = $self->logical_not_op;
  
      my $true = $self->true;
  
      # insert comment, error message, and $ok/$nok counting. $which is 0 by
      # default (normal), or 1 (reverse logic, for 'not' or 'none'), or 2 (for
      # $ok/$nok counting), or 3 (like 2, but for the last clause).
      my $_ice = sub {
          my ($ccl, $which) = @_;
  
          return $self->enclose_paren($ccl->{ccl}) if $ccl->{assert};
  
          my $res = "";
  
          if ($ccl->{_debug_ccl_note}) {
              if ($cd->{args}{debug_log} // $cd->{args}{debug}) {
                  $res .= $self->expr_log(
                      $cd, $self->literal($ccl->{_debug_ccl_note})) . " $aop\n";
              } else {
                  $res .= $self->comment($cd, $ccl->{_debug_ccl_note});
              }
          }
  
          $which //= 0;
          # clause code
          my $cc = ($which == 1 ? $nop:"") . $self->enclose_paren($ccl->{ccl});
          my ($ec, $oec);
          my ($ret, $oret);
          if ($which >= 2) {
              my @chk;
              if ($ccl->{err_level} eq 'warn') {
                  $oret = 1;
                  $ret  = 1;
              } elsif ($ccl->{err_level} eq 'fatal') {
                  $oret = 1;
                  $ret  = 0;
              } else {
                  $oret = $self->expr_preinc_var("${vp}ok");
                  $ret  = $self->expr_preinc_var("${vp}nok");
                  push @chk, $self->expr_var("${vp}ok"). " <= $max_ok"
                      if $dmax_ok;
                  push @chk, $self->expr_var("${vp}nok")." <= $max_nok"
                      if $dmax_nok;
                  if ($which == 3) {
                      push @chk, $self->expr_var("${vp}ok"). " >= $min_ok"
                          if $dmin_ok;
                      push @chk, $self->expr_var("${vp}nok")." >= $min_nok"
                          if $dmin_nok;
  
                      # we need to clear the error message previously set
                      if ($rt !~ /\Abool/) {
                          my $et = $cd->{args}{err_term};
                          my $clerrc;
                          if ($rt eq 'hash_details') {
                              $clerrc = $self->expr_reset_err_full($et);
                          } else {
                              $clerrc = $self->expr_reset_err_str($et);
                          }
                          push @chk, $clerrc;
                      }
                  }
              }
              $res .= "($cc ? $oret : $ret)";
              $res .= " $aop " . join(" $aop ", @chk) if @chk;
          } else {
              $ec = $ccl->{err_code};
              $ret =
                  $ccl->{err_level} eq 'fatal' ? 0 :
                      # this must not be done because it messes up ok/nok counting
                      #$rt eq 'hash_details' ? 1 :
                          $ccl->{err_level} eq 'warn' ? 1 : 0;
              if ($rt =~ /\Abool/ && $ret) {
                  $res .= $true;
              } elsif ($rt =~ /\Abool/ || !$ec) {
                  $res .= $self->enclose_paren($cc);
              } else {
                  $res .= $self->enclose_paren(
                      $self->enclose_paren($cc). " ? $true : ($ec,$ret)",
                      "force");
              }
          }
  
          # insert dpath handling
          $res = $self->expr_push_and_pop_dpath_between_expr($res)
              if $cd->{use_dpath} && $ccl->{subdata};
          $res;
  
      };
  
      my $j = "\n\n$aop\n\n";
      if ($op eq 'not') {
          return $_ice->($ccls->[0], 1);
      } elsif ($op eq 'and') {
          return join $j, map { $_ice->($_) } @$ccls;
      } elsif ($op eq 'none') {
          return join $j, map { $_ice->($_, 1) } @$ccls;
      } else {
          my $jccl = join $j, map {$_ice->($ccls->[$_], $_ == @$ccls-1 ? 3:2)}
              0..@$ccls-1;
          {
              local $cd->{ccls} = [];
              local $cd->{_debug_ccl_note} = "op=$op";
              $self->add_ccl(
                  $cd,
                  $self->expr_block(
                      join(
                          "",
                          $self->stmt_declare_local_var("${vp}ok" , "0"), "\n",
                          $self->stmt_declare_local_var("${vp}nok", "0"), "\n",
                          "\n",
                          $self->block_uses_sub ?
                              $self->stmt_return($jccl) : $jccl,
                      )
                  ),
              );
              $_ice->($cd->{ccls}[0]);
          }
      }
  }
  
  sub before_compile {
      my ($self, $cd) = @_;
  
      if ($cd->{args}{data_term_is_lvalue}) {
          $cd->{data_term} = $cd->{args}{data_term};
      } else {
          my $v = $cd->{args}{var_prefix} . $cd->{args}{data_name};
          push @{ $cd->{vars} }, $v; # XXX unless already there
          $cd->{data_term} = $self->var_sigil . $v;
          die "BUG: support for non-perl compiler not yet added here"
              unless $cd->{compiler_name} eq 'perl';
          push @{ $cd->{ccls} }, ["(local($cd->{data_term} = $cd->{args}{data_term}), 1)"];
      }
  }
  
  sub before_handle_type {
      my ($self, $cd) = @_;
  
      # do a human compilation first to collect all the error messages
  
      unless ($cd->{is_inner}) {
          my $hc = $cd->{_hc};
          my %hargs = %{$cd->{args}};
          $hargs{format}               = 'msg_catalog';
          $hargs{schema_is_normalized} = 1;
          $hargs{schema}               = $cd->{nschema};
          $hargs{on_unhandled_clause}  = 'ignore';
          $hargs{on_unhandled_attr}    = 'ignore';
          $hargs{hash_values}          = $cd->{args}{human_hash_values};
          $cd->{_hcd} = $hc->compile(%hargs);
      }
  }
  
  sub before_all_clauses {
      my ($self, $cd) = @_;
  
      my $rt = $cd->{args}{return_type};
      my $rt_is_hash = $rt =~ /\Ahash/;
      my $rt_is_str  = $rt =~ /\Astr/;
  
      $cd->{use_dpath} //= (
          $rt_is_hash ||
          ($rt_is_str && $cd->{has_subschema})
      );
  
      # handle ok/default/coercion/prefilters/req/forbidden clauses and type check
  
      my $c      = $cd->{compiler};
      my $cname  = $c->name;
      my $dt     = $cd->{data_term};
      my $et     = $cd->{args}{err_term};
      my $clsets = $cd->{clsets};
  
      # handle ok, this is very high priority because !ok=>1 should fail undef
      # too. we need to handle its .op=not here.
      for my $i (0..@$clsets-1) {
          my $clset  = $clsets->[$i];
          next unless exists $clset->{ok};
          my $op = $clset->{"ok.op"} // "";
          if ($op && $op ne 'not') {
              $self->_die($cd, "ok can only be combined with .op=not");
          }
          if ($op eq 'not') {
              local $cd->{_debug_ccl_note} = "!ok #$i";
              $self->add_ccl($cd, $self->false);
          } else {
              local $cd->{_debug_ccl_note} = "ok #$i";
              $self->add_ccl($cd, $self->true);
          }
          delete $cd->{uclsets}[$i]{"ok"};
          delete $cd->{uclsets}[$i]{"ok.is_expr"};
      }
  
      # handle default
      for my $i (0..@$clsets-1) {
          my $clset  = $clsets->[$i];
          my $def    = $clset->{default};
          my $defie  = $clset->{"default.is_expr"};
          if (defined $def) {
              local $cd->{_debug_ccl_note} = "default #$i";
              my $ct = $defie ?
                  $self->expr($cd, $def) : $self->literal($def);
              $self->add_ccl(
                  $cd,
                  $self->expr_list(
                      $self->expr_setif($dt, $ct),
                      $self->true,
                  ),
                  {err_msg => ""},
              );
          }
          delete $cd->{uclsets}[$i]{"default"};
          delete $cd->{uclsets}[$i]{"default.is_expr"};
      }
  
      # handle req
      my $has_req;
      for my $i (0..@$clsets-1) {
          my $clset  = $clsets->[$i];
          my $req    = $clset->{req};
          my $reqie  = $clset->{"req.is_expr"};
          my $req_err_msg = $self->_xlt($cd, "Required but not specified");
          local $cd->{_debug_ccl_note} = "req #$i";
          if ($req && !$reqie) {
              $has_req++;
              $self->add_ccl(
                  $cd, $self->expr_defined($dt),
                  {
                      err_msg   => $req_err_msg,
                      err_level => 'fatal',
                  },
              );
          } elsif ($reqie) {
              $has_req++;
              my $ct = $self->expr($cd, $req);
              $self->add_ccl(
                  $cd, "!($ct) || ".$self->expr_defined($dt),
                  {
                      err_msg   => $req_err_msg,
                      err_level => 'fatal',
                  },
              );
          }
          delete $cd->{uclsets}[$i]{"req"};
          delete $cd->{uclsets}[$i]{"req.is_expr"};
      }
  
      # handle forbidden
      my $has_fbd;
      for my $i (0..@$clsets-1) {
          my $clset  = $clsets->[$i];
          my $fbd    = $clset->{forbidden};
          my $fbdie  = $clset->{"forbidden.is_expr"};
          my $fbd_err_msg = $self->_xlt($cd, "Forbidden but specified");
          local $cd->{_debug_ccl_note} = "forbidden #$i";
          if ($fbd && !$fbdie) {
              $has_fbd++;
              $self->add_ccl(
                  $cd, "!".$self->expr_defined($dt),
                  {
                      err_msg   => $fbd_err_msg,
                      err_level => 'fatal',
                  },
              );
          } elsif ($fbdie) {
              $has_fbd++;
              my $ct = $self->expr($cd, $fbd);
              $self->add_ccl(
                  $cd, "!($ct) || !".$self->expr_defined($dt),
                  {
                      err_msg   => $fbd_err_msg,
                      err_level => 'fatal',
                  },
              );
          }
          delete $cd->{uclsets}[$i]{"forbidden"};
          delete $cd->{uclsets}[$i]{"forbidden.is_expr"};
      }
  
      if (!$has_req && !$has_fbd) {
          $cd->{_skip_undef} = 1;
          $cd->{_ccls_idx1} = @{$cd->{ccls}};
      }
  
      my $coerce_expr;
      my $coerce_might_fail;
      my $coerce_ccl_note;
    GEN_COERCE_EXPR:
      {
          last unless $cd->{args}{coerce};
  
          require Data::Sah::CoerceCommon;
  
          my @coerce_rules;
          for my $i (0..@$clsets-1) {
              my $clset = $clsets->[$i];
              push @coerce_rules,
                  @{ $clset->{"x.$cname.coerce_rules"} // [] },
                  @{ $clset->{'x.coerce_rules'} // [] };
          }
  
          my $rules = Data::Sah::CoerceCommon::get_coerce_rules(
              compiler => $self->name,
              type => $cd->{type},
              data_term => $dt,
              coerce_to => $cd->{coerce_to},
              coerce_rules => \@coerce_rules,
          );
          last unless @$rules;
  
          $coerce_might_fail = 1 if grep { $_->{meta}{might_fail} } @$rules;
  
          my $prev_term;
          for my $i (reverse 0..$#{$rules}) {
              my $rule = $rules->[$i];
  
              $self->add_compile_module(
                  $cd, "Data::Sah::Coerce::$cname\::To_$cd->{type}::$rule->{name}",
                  {category => 'coerce'},
              );
  
              if ($rule->{modules}) {
                  for my $mod (keys %{ $rule->{modules} }) {
                      my $modspec = $rule->{modules}{$mod};
                      $modspec = {version=>$modspec} unless ref $modspec eq 'HASH';
                      $self->add_runtime_module($cd, $mod, {category=>'coerce', %$modspec});
                  }
              }
  
              if ($i == $#{$rules}) {
                  if ($coerce_might_fail) {
                      $prev_term = $self->expr_array($self->literal(undef), $dt);
                  } else {
                      $prev_term = $dt;
                  }
              } else {
                  $prev_term = "($coerce_expr)";
              }
  
              my $ec;
              if ($coerce_might_fail && !$rule->{meta}{might_fail}) {
                  $ec = $self->expr_array($self->literal(undef), $rule->{expr_coerce});
              } else {
                  $ec = "($rule->{expr_coerce})";
              }
  
              $coerce_expr = $self->expr_ternary(
                  "($rule->{expr_match})",
                  $ec,
                  $prev_term,
              );
          }
          $coerce_ccl_note = "coerce rule(s): ".
              join(", ", map {$_->{name}} @$rules) .
              ($cd->{coerce_to} ? " # coerce to: $cd->{coerce_to}" : "");
      } # GEN_COERCE_EXPR
  
      my $prefilters_expr;
      my $prefilters_ccl_note;
    GEN_PREFILTERS_EXPRS:
      {
          my @filter_names;
          for my $i (0..@$clsets-1) {
              my $clset = $clsets->[$i];
              push @filter_names, @{ $clset->{prefilters} }
                  if defined $clset->{prefilters};
          }
          last unless @filter_names;
  
          require Data::Sah::FilterCommon;
          my $rules = Data::Sah::FilterCommon::get_filter_rules(
              compiler => $cname,
              data_term => $dt,
              filter_names => \@filter_names,
          );
  
          my @exprs;
          for my $i (0..$#{$rules}) {
              my $rule = $rules->[$i];
  
              $self->add_compile_module(
                  $cd, "Data::Sah::Filter::$cname\::$rule->{name}",
                  {category => 'filter'},
              );
              if ($rule->{modules}) {
                  for my $mod (keys %{ $rule->{modules} }) {
                      my $modspec = $rule->{modules}{$mod};
                      $modspec = {version=>$modspec} unless ref $modspec eq 'HASH';
                      $self->add_runtime_module($cd, $mod, {category=>'filter', %$modspec});
                  }
              }
  
              my $rule_might_fail = $rule->{meta}{might_fail};
              my $expr;
              if ($rule->{meta}{might_fail}) {
                  my $expr_fail;
                  # XXX rather hackish: like when coercion handling, to avoid
                  # adding another temporary variable, we reuse data term to hold
                  # filtering result (which contains error message string as well
                  # filtered data) then set the data term to the filtered data
                  # again. this might fail in languages or setting that is
                  # stricter (e.g. data term must be of certain type).
                  if ($rt_is_hash) {
                      $expr_fail = $self->expr_list(
                          $self->expr_set_err_full($et, 'errors', $self->expr_array_subscript($dt, 0)),
                          $self->false,
                      );
                  } elsif ($rt_is_str) {
                      $expr_fail = $self->expr_list(
                          $self->expr_set_err_str($et, $self->expr_array_subscript($dt, 0)),
                          $self->expr_set($dt, $self->expr_array_subscript($dt, 1)),
                          $self->false,
                      );
                  } else {
                      $expr_fail = $self->false;
                  }
  
                  $expr = $self->expr_list(
                      $self->expr_set($dt, $rule->{expr_filter}),
                      $self->expr_ternary(
                          $self->expr_defined($self->expr_array_subscript($dt, 0)),
                          $expr_fail,
                          $self->expr_list(
                              $self->expr_set($dt, $self->expr_array_subscript($dt, 1)),
                              $self->true,
                          )
                      ),
                  );
              } else {
                  $expr = $self->expr_list(
                      $self->expr_set($dt, $rule->{expr_filter}),
                      $self->true,
                  );
              }
              push @exprs, $expr;
          } # for rules
          $prefilters_expr = join(" ".$self->logical_and_op." ", @exprs);
          $prefilters_ccl_note = "prefilters: ".
              join(", ", map {$_->{name}} @$rules);
      } # GEN_PREFILTERS_EXPR
  
    HANDLE_TYPE_CHECK:
      {
          $self->_die($cd, "BUG: type handler did not produce _ccl_check_type")
              unless defined($cd->{_ccl_check_type});
          local $cd->{_debug_ccl_note};
  
          # handle coercion
          if ($coerce_expr) {
              $cd->{_debug_ccl_note} = $coerce_ccl_note;
              if ($coerce_might_fail) {
  
                  my $expr_fail;
                  if ($rt_is_hash) {
                      $expr_fail = $self->expr_list(
                          $self->expr_set_err_full($et, 'errors', $self->expr_array_subscript($dt, 0)),
                          $self->false,
                      );
                  } elsif ($rt_is_str) {
                      $expr_fail = $self->expr_list(
                          $self->expr_set_err_str($et, $self->expr_array_subscript($dt, 0)),
                          $self->expr_set($dt, $self->expr_array_subscript($dt, 1)),
                          $self->false,
                      );
                  } else {
                      $expr_fail = $self->false;
                  }
  
                  $self->add_ccl(
                      $cd,
                      $self->expr_list(
                          $self->expr_set($dt, $coerce_expr),
                          $self->expr_ternary(
                              $self->expr_defined($self->expr_array_subscript($dt, 0)),
                              $expr_fail,
                              $self->expr_list(
                                  $self->expr_set($dt, $self->expr_array_subscript($dt, 1)),
                                  $self->true,
                              )
                          ),
                      ),
                      {
                          err_msg => "",
                          err_level => "fatal",
                      },
                  );
              } else {
                  $self->add_ccl(
                      $cd,
                      $self->expr_list(
                          $self->expr_set($dt, $coerce_expr),
                          $self->true,
                      ),
                      {
                          err_msg => "",
                          err_level => "fatal",
                      },
                  );
              }
          } # handle coercion
  
          # handle prefilters
          if (defined $prefilters_expr) {
              $cd->{_debug_ccl_note} = $prefilters_ccl_note;
              $self->add_ccl(
                  $cd,
                  $prefilters_expr,
                  {
                      err_msg => "",
                      err_level => "fatal",
                  },
              );
          } # handle prefilters
  
          $cd->{_debug_ccl_note} = "check type '$cd->{type}'";
          $self->add_ccl(
              $cd, $cd->{_ccl_check_type},
              {
                  err_msg   => sprintf(
                      $self->_xlt($cd, "Not of type %s"),
                      $self->_xlt(
                          $cd,
                          $cd->{_hc}->get_th(name=>$cd->{type})->name //
                              $cd->{type}
                          ),
                  ),
                  err_level => 'fatal',
              },
          );
      }
  }
  
  sub before_clause {
      my ($self, $cd) = @_;
  
      $self->_die($cd, "Sorry, .op + .is_expr not yet supported ".
                      "(found in clause $cd->{clause})")
          if $cd->{cl_is_expr} && $cd->{cl_op};
  
      if ($cd->{args}{debug}) {
          state $json = do {
              require JSON;
              JSON->new->allow_nonref;
          };
          my $clset = $cd->{clset};
          my $cl    = $cd->{clause};
          my $res   = $json->encode({
              map { $_ => $clset->{$_}}
                  grep {/\A\Q$cl\E(?:\.|\z)/}
                      keys %$clset });
          $res =~ s/\n+/ /g;
          # a one-line dump of the clause, suitable for putting in generated
          # code's comment
          $cd->{_debug_ccl_note} = "clause: $res";
      } else {
          $cd->{_debug_ccl_note} = "clause: $cd->{clause}";
      }
  
      # we save ccls to save_ccls and empty ccls for each clause, to let clause
      # join and do stuffs to ccls. at after_clause(), we push the clause's result
      # as a single ccl to the original ccls.
  
      push @{ $cd->{_save_ccls} }, $cd->{ccls};
      $cd->{ccls} = [];
  }
  
  sub after_clause {
      my ($self, $cd) = @_;
  
      if ($cd->{args}{debug}) {
          delete $cd->{_debug_ccl_note};
      }
  
      my $save = pop @{ $cd->{_save_ccls} };
      if (@{ $cd->{ccls} }) {
          push @$save, {
              ccl       => $self->join_ccls($cd, $cd->{ccls}, {op=>$cd->{cl_op}}),
              err_level => $cd->{clset}{"$cd->{clause}.err_level"} // "error",
          }
      }
      $cd->{ccls} = $save;
  }
  
  sub after_clause_sets {
      my ($self, $cd) = @_;
  
      # simply join them together with &&
      $cd->{result} = $self->indent(
          $cd,
          $self->join_ccls($cd, $cd->{ccls}, {err_msg => ''}),
      );
  }
  
  sub after_all_clauses {
      my ($self, $cd) = @_;
  
      # XXX also handle postfilters here
  
      if (delete $cd->{_skip_undef}) {
          my $jccl = $self->join_ccls(
              $cd,
              [splice(@{ $cd->{ccls} }, $cd->{_ccls_idx1})],
          );
          local $cd->{_debug_ccl_note} = "skip if undef";
          $self->add_ccl(
              $cd,
              "!".$self->expr_defined($cd->{data_term})." ? ".$self->true." : \n\n".
                  $self->enclose_paren($jccl),
              {err_msg => ''},
          );
      }
  
      # simply join them together with &&
      $cd->{result} = $self->indent(
          $cd,
          $self->join_ccls($cd, $cd->{ccls}, {err_msg => ''}),
      );
  }
  
  1;
  # ABSTRACT: Base class for programming language compilers
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Compiler::Prog - Base class for programming language compilers
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Compiler::Prog (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =head1 SYNOPSIS
  
  =head1 DESCRIPTION
  
  This class is derived from L<Data::Sah::Compiler>. It is used as base class for
  compilers which compile schemas into code (validator) in several programming
  languages, Perl (L<Data::Sah::Compiler::perl>) and JavaScript
  (L<Data::Sah::Compiler::js>) being two of them. (Other similar programming
  languages like PHP and Ruby might also be supported later on if needed).
  
  Compilers using this base class are flexible in the kind of code they produce:
  
  =over 4
  
  =item * configurable validator return type
  
  Can generate validator that returns a simple bool result, str, or full data
  structure (containing errors, warnings, and potentially other information).
  
  =item * configurable data term
  
  For flexibility in combining the validator code with other code, e.g. putting
  inside subroutine wrapper (see L<Perinci::Sub::Wrapper>) or directly embedded to
  your source code (see L<Dist::Zilla::Plugin::Rinci::Validate>).
  
  =back
  
  =for Pod::Coverage ^(after_.+|before_.+|add_var|add_ccl|join_ccls|check_compile_args|enclose_paren|init_cd|expr|expr_.+|stmt_.+)$
  
  =head1 HOW IT WORKS
  
  The compiler generates code in the following form:
  
   EXPR && EXPR2 && ...
  
  where C<EXPR> can be a single expression or multiple expressions joined by the
  list operator (which Perl and JavaScript support). Each C<EXPR> is typically
  generated out of a single schema clause. Some pseudo-example of generated
  JavaScript code:
  
   (data >= 0)  # from clause: min => 0
   &&
   (data <= 10) # from clause: max => 10
  
  Another example, a fuller translation of schema C<< [int => {min=>0, max=>10}]
  >> to Perl, returning string result (error message) instead of boolean:
  
   # from clause: req => 0
   !defined($data) ? 1 : (
  
       # type check
       ($data =~ /^[+-]?\d+$/ ? 1 : ($err //= "Data is not an integer", 0))
  
       &&
  
       # from clause: min => 0
       ($data >=  0 ? 1 : ($err //= "Must be at least 0", 0))
  
       &&
  
       # from clause: max => 10
       ($data <= 10 ? 1 : ($err //= "Must be at most 10", 0))
  
   )
  
  The final validator code will add enclosing subroutine and variable declaration,
  loading of modules, etc.
  
  Note: Current assumptions/hard-coded things for the supported languages: ternary
  operator (C<? :>), semicolon as statement separator.
  
  =head1 COMPILATION DATA KEYS
  
  =over
  
  =item * use_dpath => bool
  
  Convenience. This is set when code needs to track data path, which is when
  C<return_type> argument is set to something other than C<bool> or C<bool+val>,
  and when schema has subschemas. Data path is used when generating error message
  string, to help point to the item in the data structure (an array element, a
  hash value) which fails the validation. This is not needed when we want the
  validator to only return true/false, and also not needed when we do not recurse
  into subschemas.
  
  =item * data_term => ARRAY
  
  Input data term. Set to C<< $cd->{args}{data_term} >> or a temporary variable
  (if C<< $cd->{args}{data_term_is_lvalue} >> is false). Hooks should use this
  instead of C<< $cd->{args}{data_term} >> directly, because aside from the
  aforementioned temporary variable, data term can also change, for example if
  C<default.temp> or C<prefilters.temp> attribute is set, where generated code
  will operate on another temporary variable to avoid modifying the original data.
  Or when C<.input> attribute is set, where generated code will operate on
  variable other than data.
  
  =item * subs => ARRAY
  
  Contains pairs of subroutine names and definition code string, e.g. C<< [
  [_sahs_zero => 'sub _sahs_zero { $_[0] == 0 }'], [_sahs_nonzero => 'sub
  _sah_s_nonzero { $_[0] != 0 }'] ] >>. For flexibility, you'll need to do this
  bit of arranging yourself to get the final usable code you can compile in your
  chosen programming language.
  
  =item * vars => HASH
  
  =item * coerce_to => str
  
  Retrieved from the schema's C<x.$COMPILER.coerce_to> attribute. Each type
  handler might have its own default value.
  
  =back
  
  =head1 INTERNAL VARIABLES IN THE GENERATED CODE
  
  The generated code maintains the following variables. C<_sahv_> prefix stands
  for "Sah validator", it is used to minimize clash with data_term.
  
  =over
  
  =item * _sahv_dpath => ARRAY
  
  Analogous to C<spath> in compilation data, this variable stands for "data path"
  and is used to track location within data. If a clause is checking each element
  of an array (like the 'each_elem' or 'elems' array clause), this variable will
  be adjusted accordingly. Error messages thus can be more informative by pointing
  more exactly where in the data the problem lies.
  
  =item * tmp_data_term => ANY
  
  As explained in the C<compile()> method, this is used to store temporary value
  when checking against clauses.
  
  =item * _sahv_stack => ARRAY
  
  This variable is used to store validation result of subdata. It is only used if
  the validator is returning a string or full structure, not a single boolean
  value. See C<Data::Sah::Compiler::js::TH::hash> for an example.
  
  =item * _sahv_x
  
  Usually used as temporary variable in short, anonymous functions.
  
  =back
  
  =head1 ATTRIBUTES
  
  These usually need not be set/changed by users.
  
  =head2 hc => OBJ
  
  Instance of L<Data::Sah::Compiler::human>, to generate error messages.
  
  =head2 comment_style => STR
  
  Specify how comments are written in the target language. Either 'cpp' (C<//
  comment>), 'shell' (C<# comment>), 'c' (C</* comment */>), or 'ini' (C<;
  comment>). Each programming language subclass will set this, for example, the
  perl compiler sets this to 'shell' while js sets this to 'cpp'.
  
  =head2 var_sigil => STR
  
  =head2 concat_op => STR
  
  =head2 logical_and_op => STR
  
  =head2 logical_not_op => STR
  
  =head1 METHODS
  
  =head2 new() => OBJ
  
  =head2 $c->compile(%args) => RESULT
  
  Aside from base class' arguments, this class supports these arguments (suffix
  C<*> denotes required argument):
  
  =over
  
  =item * data_term => STR
  
  A variable name or an expression in the target language that contains the data,
  defaults to I<var_sigil> + C<name> if not specified.
  
  =item * data_term_is_lvalue => BOOL (default: 1)
  
  Whether C<data_term> can be assigned to.
  
  =item * tmp_data_name => STR
  
  Normally need not be set manually, as it will be set to "tmp_" . data_name. Used
  to store temporary data during clause evaluation.
  
  =item * tmp_data_term => STR
  
  Normally need not be set manually, as it will be set to var_sigil .
  tmp_data_name. Used to store temporary data during clause evaluation. For
  example, in JavaScript, the 'int' and 'float' type pass strings in the type
  check. But for further checking with the clauses (like 'min', 'max',
  'divisible_by') the string data needs to be converted to number first. Likewise
  with prefiltering. This variable holds the temporary value. The clauses compare
  against this value. At the end of clauses, the original data_term is restored.
  So the output validator code for schema C<< [int => min => 1] >> will look
  something like:
  
   // type check 'int'
   type(data)=='number' && Math.round(data)==data || parseInt(data)==data)
  
   &&
  
   // convert to number
   (tmp_data = type(data)=='number' ? data : parseFloat(data), true)
  
   &&
  
   // check clause 'min'
   (tmp_data >= 1)
  
  =item * err_term => STR
  
  A variable name or lvalue expression to store error message(s), defaults to
  I<var_sigil> + C<err_NAME> (e.g. C<$err_data> in the Perl compiler).
  
  =item * var_prefix => STR (default: _sahv_)
  
  Prefix for variables declared by generated code.
  
  =item * sub_prefix => STR (default: _sahs_)
  
  Prefix for subroutines declared by generated code.
  
  =item * code_type => STR (default: validator)
  
  The kind of code to generate. For now the only valid (and default) value is
  'validator'. Compiler can perhaps generate other kinds of code in the future.
  
  =item * return_type => STR (default: bool)
  
  Specify what kind of return value the generated code should produce. Either
  C<bool_valid>, C<bool_valid+val>, C<str_errmsg>, C<str_errmsg+val>, or
  C<hash_details>.
  
  C<bool_valid> means generated validator code should just return true/false
  depending on whether validation succeeds/fails.
  
  C<bool_valid+val> is like C<bool_valid>, but instead of just C<bool_valid> the
  validator code will return a two-element arrayref C<< [bool_valid, val] >> where
  C<val> is the final value of data (after setting of default, coercion, etc.)
  
  C<str_errmsg> means validation should return an error message string (the first
  one encountered) if validation fails and an empty string/undef if validation
  succeeds.
  
  C<str_errmsg+val> is like C<str_errmsg>, but instead of just C<str_errmsg> the
  validator code will return a two-element arrayref C<< [str_errmsg, val] >> where
  C<val> is the final value of data (after setting of default, coercion, etc.)
  
  C<hash_details> means validation should return a full hash data structure. From
  this structure you can check whether validation succeeds, retrieve all the
  collected errors/warnings, etc.
  
  =item * coerce => bool (default: 1)
  
  If set to false, will not include coercion code.
  
  =item * debug => BOOL (default: 0)
  
  This is a general debugging option which should turn on all debugging-related
  options, e.g. produce more comments in the generated code, etc. Each compiler
  might have more specific debugging options.
  
  If turned on, specific debugging options can be explicitly turned off
  afterwards, e.g. C<< debug=>1, debug_log=>0 >> will turn on all debugging
  options but turn off the C<debug_log> setting.
  
  Currently turning on C<debug> means:
  
  =over
  
  =item - Turning on the other debug_* options, like debug_log
  
  =item - Prefixing error message with msgpath
  
  =back
  
  =item * debug_log => BOOL (default: 0)
  
  Whether to add logging to generated code. This aids in debugging generated code
  specially for more complex validation.
  
  =item * comment => BOOL (default: 1)
  
  If set to false, generated code will be devoid of comments.
  
  =item * human_hash_values => hash
  
  Optional. Will be passed to C<hash_values> argument during C<compile()> by human
  compiler.
  
  =back
  
  =head2 $c->comment($cd, @args) => STR
  
  Generate a comment. For example, in perl compiler:
  
   $c->comment($cd, "123"); # -> "# 123\n"
  
  Will return an empty string if compile argument C<comment> is set to false.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COMPILER_PROG

    $main::fatpacked{"Data/Sah/Compiler/Prog/TH.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COMPILER_PROG_TH';
  package Data::Sah::Compiler::Prog::TH;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-02-12'; # DATE
  our $DIST = 'Data-Sah'; # DIST
  our $VERSION = '0.907'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  #use Log::Any '$log';
  
  use Mo qw(build default);
  
  extends 'Data::Sah::Compiler::TH';
  
  # handled in compiler's before_all_clauses()
  
  sub clause_default {}
  sub clause_ok {}
  sub clause_req {}
  sub clause_forbidden {}
  sub clause_prefilters {}
  
  # handled in compiler's after_all_clauses()
  
  sub clause_postfilters {}
  
  sub clause_name {
      my ($self, $cd) = @_;
      $self->compiler->_ignore_clause_and_attrs($cd);
  }
  
  sub clause_summary {
      my ($self, $cd) = @_;
      $self->compiler->_ignore_clause_and_attrs($cd);
  }
  
  sub clause_description {
      my ($self, $cd) = @_;
      $self->compiler->_ignore_clause_and_attrs($cd);
  }
  
  sub clause_comment {
      my ($self, $cd) = @_;
      $self->compiler->_ignore_clause($cd);
  }
  
  sub clause_tags {
      my ($self, $cd) = @_;
      $self->compiler->_ignore_clause($cd);
  }
  
  sub clause_defhash_v {
      my ($self, $cd) = @_;
      $self->compiler->_ignore_clause($cd);
  }
  
  sub clause_v {
      my ($self, $cd) = @_;
      $self->compiler->_ignore_clause($cd);
  }
  
  sub clause_examples {
      my ($self, $cd) = @_;
      $self->compiler->_ignore_clause($cd);
  }
  
  sub clause_invalid_examples {
      my ($self, $cd) = @_;
      $self->compiler->_ignore_clause($cd);
  }
  
  # temporarily use temporary variable for referring to data (e.g. when converting
  # non-number to number for checking in clauses, or prefiltering)
  sub set_tmp_data_term {
      my ($self, $cd, $expr) = @_;
      my $c = $self->compiler;
      #$log->errorf("TMP: set_tmp_data_term");
  
      $expr //= $cd->{data_term};
  
      my $tdn = $cd->{args}{tmp_data_name};
      my $tdt = $cd->{args}{tmp_data_term};
      my $t = $c->expr_array_subscript($tdt, $cd->{_subdata_level});
      unless ($cd->{_save_data_term}) {
          $c->add_var($cd, $tdn, []);
          $cd->{_save_data_term} = $cd->{data_term};
          $cd->{data_term} = $t;
      }
      local $cd->{_debug_ccl_note} = 'set temporary data term';
      $c->add_ccl($cd, "(".$c->expr_set($t, $expr). ", ".$c->true.")",
                  {err_msg => ''});
  }
  
  sub restore_data_term {
      my ($self, $cd) = @_;
      my $c = $self->compiler;
      #$log->errorf("TMP: restore_data_term");
  
      my $tdt = $cd->{args}{tmp_data_term};
      if ($cd->{_save_data_term}) {
          $cd->{data_term} = delete($cd->{_save_data_term});
          local $cd->{_debug_ccl_note} = 'restore original data term';
          $c->add_ccl($cd, "(".$c->expr_pop($tdt). ", ".$c->true.")",
                      {err_msg => ''});
      }
  }
  
  sub gen_any_or_all_of {
      my ($self, $which, $cd) = @_;
      my $c  = $self->compiler;
      my $cv = $cd->{cl_value};
      my $dt = $cd->{data_term};
  
      my $jccl;
      {
          local $cd->{ccls} = [];
          for my $i (0..@$cv-1) {
              local $cd->{spath} = [@{ $cd->{spath} }, $i];
              my $sch  = $cv->[$i];
              my %iargs = %{$cd->{args}};
              $iargs{outer_cd}             = $cd;
              $iargs{schema}               = $sch;
              $iargs{schema_is_normalized} = 0;
              $iargs{indent_level}++;
              my $icd  = $c->compile(%iargs);
              my @code = (
                  $icd->{result},
              );
              $c->add_ccl($cd, join("", @code));
          }
          if ($which eq 'all') {
              $jccl = $c->join_ccls(
                  $cd, $cd->{ccls}, {err_msg=>''});
          } else {
              $jccl = $c->join_ccls(
                  $cd, $cd->{ccls}, {err_msg=>'', op=>'or'});
          }
      }
      $c->add_ccl($cd, $jccl);
  }
  
  sub clause_if {
      my ($self, $cd) = @_;
      my $c  = $self->compiler;
      my $cv = $cd->{cl_value};
  
      my ($cond, $then, $else) = @$cv;
  
      unless (!ref($cond) && ref($then) eq 'ARRAY' && !$else) {
          $c->_die($cd, "Sorry, for 'if' clause, I currently can only handle COND=str (expr), THEN=array (schema), and no ELSE");
      }
  
      # COND
      my $comp_cond = $c->expr($cd, $cond);
  
      # THEN
      my $comp_then;
      {
          local $cd->{ccls} = [];
          local $cd->{spath} = [@{ $cd->{spath} }, 'if'];
          my $sch  = $then;
          my %iargs = %{$cd->{args}};
          $iargs{outer_cd}             = $cd;
          $iargs{schema}               = $sch;
          $iargs{schema_is_normalized} = 0;
          $iargs{indent_level}++;
          my $icd  = $c->compile(%iargs);
          my @code = (
              $icd->{result},
          );
          $comp_then = join("", @code);
      }
  
      $c->add_ccl(
          $cd,
          $c->expr_ternary($comp_cond, $comp_then, $c->true, {err_msg=>''}),
      );
  }
  
  1;
  # ABSTRACT: Base class for programming-language emiting compiler's type handlers
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Compiler::Prog::TH - Base class for programming-language emiting compiler's type handlers
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Compiler::Prog::TH (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(compiler|clause_.+|handle_.+|gen_.+|set_tmp_data_term|restore_data_term)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COMPILER_PROG_TH

    $main::fatpacked{"Data/Sah/Compiler/Prog/TH/all.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COMPILER_PROG_TH_ALL';
  package Data::Sah::Compiler::Prog::TH::all;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  #use Log::Any '$log';
  
  use Mo qw(build default);
  use Role::Tiny::With;
  
  extends 'Data::Sah::Compiler::Prog::TH';
  with 'Data::Sah::Type::all';
  
  sub handle_type {
      my ($self, $cd) = @_;
      my $c = $self->compiler;
  
      my $dt = $cd->{data_term};
      $cd->{_ccl_check_type} = $c->true;
  }
  
  sub clause_of {
      my ($self, $cd) = @_;
      $self->gen_any_or_all_of("all", $cd);
  }
  
  1;
  # ABSTRACT: Base class for programming language compiler handler for type "all"
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Compiler::Prog::TH::all - Base class for programming language compiler handler for type "all"
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Compiler::Prog::TH::all (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(clause_.+|superclause_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COMPILER_PROG_TH_ALL

    $main::fatpacked{"Data/Sah/Compiler/Prog/TH/any.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COMPILER_PROG_TH_ANY';
  package Data::Sah::Compiler::Prog::TH::any;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  #use Log::Any '$log';
  
  use Mo qw(build default);
  use Role::Tiny::With;
  
  extends 'Data::Sah::Compiler::Prog::TH';
  with 'Data::Sah::Type::any';
  
  sub handle_type {
      my ($self, $cd) = @_;
      my $c = $self->compiler;
  
      my $dt = $cd->{data_term};
      $cd->{_ccl_check_type} = $c->true;
  }
  
  sub clause_of {
      my ($self, $cd) = @_;
      $self->gen_any_or_all_of("any", $cd);
  }
  
  1;
  # ABSTRACT: Base class for programming language compiler handler for type "any"
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Compiler::Prog::TH::any - Base class for programming language compiler handler for type "any"
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Compiler::Prog::TH::any (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(clause_.+|superclause_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COMPILER_PROG_TH_ANY

    $main::fatpacked{"Data/Sah/Compiler/TH.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COMPILER_TH';
  package Data::Sah::Compiler::TH;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  use Mo qw(build default);
  
  # reference to compiler object
  has compiler => (is => 'rw');
  
  sub clause_v {
      my ($self, $cd) = @_;
      $self->compiler->_ignore_clause($cd);
  }
  
  sub clause_defhash_v {
      my ($self, $cd) = @_;
      $self->compiler->_ignore_clause($cd);
  }
  
  sub clause_schema_v {
      my ($self, $cd) = @_;
      $self->compiler->_ignore_clause($cd);
  }
  
  sub clause_base_v {
      my ($self, $cd) = @_;
      $self->compiler->_ignore_clause($cd);
  }
  
  sub clause_default_lang {
      my ($self, $cd) = @_;
      $self->compiler->_ignore_clause($cd);
  }
  
  sub clause_clause {
      my ($self, $cd) = @_;
      my $c  = $self->compiler;
      my $cv = $cd->{cl_value};
  
      my ($clause, $clv) = @$cv;
      my $meth   = "clause_$clause";
      my $mmeth  = "clausemeta_$clause";
  
      # provide an illusion of a clsets
      my $clsets = [{$clause => $clv}];
      local $cd->{clsets} = $clsets;
  
      $c->_process_clause($cd, 0, $clause);
  }
  
  # clause_clset, like clause_clause, also works by doing what compile() does.
  
  sub clause_clset {
      my ($self, $cd) = @_;
      my $c  = $self->compiler;
      my $cv = $cd->{cl_value};
  
      # provide an illusion of a clsets
      local $cd->{clsets} = [$cv];
      $c->_process_clsets($cd, 'from clause_clset');
  }
  
  1;
  # ABSTRACT: Base class for type handlers
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Compiler::TH - Base class for type handlers
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Compiler::TH (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(compiler|clause_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COMPILER_TH

    $main::fatpacked{"Data/Sah/Compiler/TextResultRole.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COMPILER_TEXTRESULTROLE';
  package Data::Sah::Compiler::TextResultRole;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  
  use Mo qw(default);
  use Role::Tiny;
  
  # can be changed to tab, for example
  has indent_character => (is => 'rw', default => sub {''});
  
  sub add_result {
      my ($self, $cd, @args) = @_;
  
      $cd->{result} //= [];
      push @{ $cd->{result} }, $self->indent($cd, join("", @args));
      $self;
  }
  
  # BEGIN COPIED FROM String::Indent
  sub _indent {
      my ($indent, $str, $opts) = @_;
      $opts //= {};
  
      my $ibl = $opts->{indent_blank_lines} // 1;
      my $fli = $opts->{first_line_indent} // $indent;
      my $sli = $opts->{subsequent_lines_indent} // $indent;
      #say "D:ibl=<$ibl>, fli=<$fli>, sli=<$sli>";
  
      my $i = 0;
      $str =~ s/^([^\r\n]?)/$i++; !$ibl && !$1 ? "$1" : $i==1 ? "$fli$1" : "$sli$1"/egm;
      $str;
  }
  # END COPIED FROM String::Indent
  
  sub indent {
      my ($self, $cd, $str) = @_;
      _indent(
          $self->indent_character x $cd->{indent_level},
          $str,
      );
  }
  
  sub inc_indent {
      my ($self, $cd) = @_;
      $cd->{indent_level}++;
  }
  
  sub dec_indent {
      my ($self, $cd) = @_;
      $cd->{indent_level}--;
  }
  
  sub indent_str {
      my ($self, $cd) = @_;
      $self->indent_character x $cd->{indent_level};
  }
  
  1;
  # ABSTRACT: Role for compilers that produce text result (array of lines)
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Compiler::TextResultRole - Role for compilers that produce text result (array of lines)
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Compiler::TextResultRole (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =head1 ATTRIBUTES
  
  =head2 indent_character => STR
  
  =head1 METHODS
  
  =head2 $c->add_result($cd, @arg)
  
  Append result to C<< $cd->{result} >>. Will use C<< $cd->{indent_level} >> to
  indent the line. Used by compiler; users normally do not need this.
  
  =head2 $c->inc_indent($cd)
  
  Increase indent level. This is done by increasing C<< $cd->{indent_level} >> by
  1.
  
  =head2 $c->dec_indent($cd)
  
  Decrease indent level. This is done by decreasing C<< $cd->{indent_level} >> by
  1.
  
  =head2 $c->indent_str($cd)
  
  Shortcut for C<< $c->indent_character x $cd->{indent_level} >>.
  
  =head2 $c->indent($cd, $str) => STR
  
  Indent each line in $str with indent_str and return the result.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COMPILER_TEXTRESULTROLE

    $main::fatpacked{"Data/Sah/Compiler/human.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COMPILER_HUMAN';
  package Data::Sah::Compiler::human;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  #use Log::Any::IfLOG qw($log);
  
  use Data::Dmp qw(dmp);
  use Mo qw(build default);
  use POSIX qw(locale_h);
  use Text::sprintfn;
  
  extends 'Data::Sah::Compiler';
  
  # every type extension is registered here
  our %typex; # key = type, val = [clause, ...]
  
  sub name { "human" }
  
  sub _add_msg_catalog {
      my ($self, $cd, $msg) = @_;
      return unless $cd->{args}{format} eq 'msg_catalog';
  
      my $spath = join("/", @{ $cd->{spath} });
      $cd->{_msg_catalog}{$spath} = $msg;
  }
  
  sub check_compile_args {
      my ($self, $args) = @_;
  
      $self->SUPER::check_compile_args($args);
  
      my @fmts = ('inline_text', 'inline_err_text', 'markdown', 'msg_catalog');
      $args->{format} //= $fmts[0];
      unless (grep { $_ eq $args->{format} } @fmts) {
          $self->_die({}, "Unsupported format, use one of: ".join(", ", @fmts));
      }
  }
  
  sub init_cd {
      my ($self, %args) = @_;
  
      my $cd = $self->SUPER::init_cd(%args);
      if (($cd->{args}{format} // '') eq 'msg_catalog') {
          $cd->{_msg_catalog} //= $cd->{outer_cd}{_msg_catalog};
          $cd->{_msg_catalog} //= {};
      }
      $cd;
  }
  
  sub expr {
      my ($self, $cd, $expr) = @_;
  
      # for now we dump expression as is. we should probably parse it first to
      # localize number, e.g. "1.1 + 2" should become "1,1 + 2" in id_ID.
  
      # XXX for nicer output, perhaps say "the expression X" instead of just "X",
      # especially if X has a variable or rather complex.
      $expr;
  }
  
  sub literal {
      my ($self, $val) = @_;
  
      return $val unless ref($val);
      dmp($val);
  }
  
  # translate
  sub _xlt {
      my ($self, $cd, $text) = @_;
  
      my $lang = $cd->{args}{lang};
  
      #$log->tracef("translating text '%s' to '%s'", $text, $lang);
  
      return $text if $lang eq 'en_US';
      my $translations;
      {
          no strict 'refs';
          $translations = \%{"Data::Sah::Lang::$lang\::translations"};
      }
      return $translations->{$text} if defined($translations->{$text});
      if ($cd->{args}{mark_missing_translation}) {
          return "(no $lang text:$text)";
      } else {
          return $text;
      }
  }
  
  # ($cd, 3, "element") -> "3rd element"
  sub _ordinate {
      my ($self, $cd, $n, $noun) = @_;
  
      my $lang = $cd->{args}{lang};
  
      # we assume _xlt() has been called (and thus the appropriate
      # Data::Sah::Lang::* has been loaded)
  
      if ($lang eq 'en_US') {
          require Lingua::EN::Numbers::Ordinate;
          return Lingua::EN::Numbers::Ordinate::ordinate($n) . " $noun";
      } else {
          no strict 'refs';
          return "Data::Sah::Lang::$lang\::ordinate"->($n, $noun);
      }
  }
  
  sub _add_ccl {
      my ($self, $cd, $ccl) = @_;
      #$log->errorf("TMP: add_ccl %s", $ccl);
  
      $ccl->{xlt} //= 1;
  
      my $clause = $cd->{clause} // "";
      $ccl->{type} //= "clause";
  
      my $do_xlt = 1;
  
      my $hvals = {
          modal_verb     => $self->_xlt($cd, "must"),
          modal_verb_neg => $self->_xlt($cd, "must not"),
  
          # so they can overriden through hash_values
          field          => $self->_xlt($cd, "field"),
          fields         => $self->_xlt($cd, "fields"),
  
          %{ $cd->{args}{hash_values} // {} },
      };
      my $mod="";
  
      # is .human for desired language specified? if yes, use that instead
  
      {
          my $lang   = $cd->{args}{lang};
          my $dlang  = $cd->{clset_dlang} // "en_US"; # undef if not in clause
          my $suffix = $lang eq $dlang ? "" : ".alt.lang.$lang";
          if ($clause) {
              delete $cd->{uclset}{$_} for
                  grep {/\A\Q$clause.human\E(\.|\z)/} keys %{$cd->{uclset}};
              if (defined $cd->{clset}{"$clause.human$suffix"}) {
                  $ccl->{type} = 'clause';
                  $ccl->{fmt}  = $cd->{clset}{"$clause.human$suffix"};
                  goto FILL_FORMAT;
              }
          } else {
              delete $cd->{uclset}{$_} for
                  grep {/\A\.name(\.|\z)/} keys %{$cd->{uclset}};
              if (defined $cd->{clset}{".name$suffix"}) {
                  $ccl->{type} = 'noun';
                  $ccl->{fmt}  = $cd->{clset}{".name$suffix"};
                  $ccl->{vals} = undef;
                  goto FILL_FORMAT;
              }
          }
      }
  
      goto TRANSLATE unless $clause;
  
      my $ie    = $cd->{cl_is_expr};
      my $im    = $cd->{cl_is_multi};
      my $op    = $cd->{cl_op} // "";
      my $cv    = $cd->{clset}{$clause};
      my $vals  = $ccl->{vals} // [$cv];
  
      # handle .is_expr
  
      if ($ie) {
          if (!$ccl->{expr}) {
              $ccl->{fmt} = "($clause -> %s" . ($op ? " op=$op" : "") . ")";
              $do_xlt = 0;
              $vals = [$self->expr($cd, $vals)];
          }
          goto ERR_LEVEL;
      }
  
      # handle .op
  
      if ($op eq 'not') {
          ($hvals->{modal_verb}, $hvals->{modal_verb_neg}) =
              ($hvals->{modal_verb_neg}, $hvals->{modal_verb});
          $vals = [map {$self->literal($_)} @$vals];
      } elsif ($im && $op eq 'and') {
          if (@$cv == 2) {
              $vals = [sprintf($self->_xlt($cd, "%s and %s"),
                               $self->literal($cv->[0]),
                               $self->literal($cv->[1]))];
          } else {
              $vals = [sprintf($self->_xlt($cd, "all of %s"),
                               $self->literal($cv))];
          }
      } elsif ($im && $op eq 'or') {
          if (@$cv == 2) {
              $vals = [sprintf($self->_xlt($cd, "%s or %s"),
                               $self->literal($cv->[0]),
                               $self->literal($cv->[1]))];
          } else {
              $vals = [sprintf($self->_xlt($cd, "one of %s"),
                               $self->literal($cv))];
          }
      } elsif ($im && $op eq 'none') {
          ($hvals->{modal_verb}, $hvals->{modal_verbneg}) =
              ($hvals->{modal_verb_neg}, $hvals->{modal_verb});
          if (@$cv == 2) {
              $vals = [sprintf($self->_xlt($cd, "%s nor %s"),
                               $self->literal($cv->[0]),
                               $self->literal($cv->[1]))];
          } else {
              $vals = [sprintf($self->_xlt($cd, "any of %s"),
                               $self->literal($cv))];
          }
      } else {
          $vals = [map {$self->literal($_)} @$vals];
      }
  
    ERR_LEVEL:
  
      # handle .err_level
      if ($ccl->{type} eq 'clause' && grep { $_ eq 'constraint' } @{ $cd->{cl_meta}{tags} // [] }) {
          if (($cd->{clset}{"$clause.err_level"}//'error') eq 'warn') {
              if ($op eq 'not') {
                  $hvals->{modal_verb}     = $self->_xlt($cd, "should not");
                  $hvals->{modal_verb_neg} = $self->_xlt($cd, "should");
              } else {
                  $hvals->{modal_verb}     = $self->_xlt($cd, "should");
                  $hvals->{modal_verb_neg} = $self->_xlt($cd, "should not");
              }
          }
      }
      delete $cd->{uclset}{"$clause.err_level"};
  
    TRANSLATE:
  
      if ($ccl->{xlt}) {
          if (ref($ccl->{fmt}) eq 'ARRAY') {
              $ccl->{fmt}  = [map {$self->_xlt($cd, $_)} @{$ccl->{fmt}}];
          } elsif (!ref($ccl->{fmt})) {
              $ccl->{fmt}  = $self->_xlt($cd, $ccl->{fmt});
          }
      }
  
    FILL_FORMAT:
  
      if (ref($ccl->{fmt}) eq 'ARRAY') {
          $ccl->{text} = [map {sprintfn($_, (map {$_//""} ($hvals, @$vals)))}
                              @{$ccl->{fmt}}];
      } elsif (!ref($ccl->{fmt})) {
          $ccl->{text} = sprintfn($ccl->{fmt}, (map {$_//""} ($hvals, @$vals)));
      }
      delete $ccl->{fmt} unless $cd->{args}{debug};
  
    PUSH:
      push @{$cd->{ccls}}, $ccl;
  
      $self->_add_msg_catalog($cd, $ccl);
  }
  
  # add a compiled clause (ccl), which will be combined at the end of compilation
  # to be the final result. args is a hashref with these keys:
  #
  # * type* - str (default 'clause'). either 'noun', 'clause', 'list' (bulleted
  #   list, a clause followed by a list of items, each of them is also a ccl)
  #
  # * fmt* - str/2-element array. human text which can be used as the first
  #   argument to sprintf. string. if type=noun, can be a two-element arrayref to
  #   contain singular and plural version of noun.
  #
  # * expr - bool. fmt can handle .is_expr=1. for example, 'len=' => '1+1' can be
  #   compiled into 'length must be 1+1'. other clauses cannot handle expression,
  #   e.g. 'between=' => '[2, 2*2]'. this clause will be using the generic message
  #   'between must [2, 2*2]'
  #
  # * vals - arrayref (default [clause value]). values to fill fmt with.
  #
  # * items - arrayref. required if type=list. a single ccl or a list of ccls.
  #
  # * xlt - bool (default 1). set to 0 if fmt has been translated, and should not
  #   be translated again.
  #
  # add_ccl() is called by clause handlers and handles using .human, translating
  # fmt, sprintf(fmt, vals) into 'text', .err_level (adding 'must be %s', 'should
  # not be %s'), .is_expr, .op.
  sub add_ccl {
      my ($self, $cd, @ccls) = @_;
  
      my $op     = $cd->{cl_op} // '';
  
      my $ccl;
      if (@ccls == 1) {
          $self->_add_ccl($cd, $ccls[0]);
      } else {
          my $inner_cd = $self->init_cd(outer_cd => $cd);
          $inner_cd->{args} = $cd->{args};
          $inner_cd->{clause} = $cd->{clause};
          for (@ccls) {
              $self->_add_ccl($inner_cd, $_);
          }
  
          $ccl = {
              type  => 'list',
              vals  => [],
              items => $inner_cd->{ccls},
              multi => 0,
          };
          if ($op eq 'or') {
              $ccl->{fmt} = 'any of the following %(modal_verb)s be true';
          } elsif ($op eq 'and') {
              $ccl->{fmt} = 'all of the following %(modal_verb)s be true';
          } elsif ($op eq 'none') {
              $ccl->{fmt} = 'none of the following %(modal_verb)s be true';
              # or perhaps, fmt = 'All of the following ...' but set op to 'not'?
          }
          $self->_add_ccl($cd, $ccl);
      }
  }
  
  # format ccls to form final result. at the end of compilation, we have a tree of
  # ccls. this method accept a single ccl (of type either noun/clause) or an array
  # of ccls (which it will join together).
  sub format_ccls {
      my ($self, $cd, $ccls) = @_;
  
      # used internally to determine if the result is a single noun, in which case
      # when format is inline_err_text, we add 'Not of type '. XXX: currently this
      # is the wrong way to count? we shouldn't count children? perhaps count from
      # msg_catalog instead?
      local $cd->{_fmt_noun_count} = 0;
      local $cd->{_fmt_etc_count} = 0;
  
      my $f = $cd->{args}{format};
      my $res;
      if ($f eq 'inline_text' || $f eq 'inline_err_text' || $f eq 'msg_catalog') {
          $res = $self->_format_ccls_itext($cd, $ccls);
          if ($f eq 'inline_err_text') {
              #$log->errorf("TMP: noun=%d, etc=%d", $cd->{_fmt_noun_count}, $cd->{_fmt_etc_count});
              if ($cd->{_fmt_noun_count} == 1 && $cd->{_fmt_etc_count} == 0) {
                  # a single noun (type name), we should add some preamble
                  $res = sprintf(
                      $self->_xlt($cd, "Not of type %s"),
                      $res
                  );
              } elsif (!$cd->{_fmt_noun_count}) {
                  # a clause (e.g. "must be >= 10"), already looks like errmsg
              } else {
                  # a noun + clauses (e.g. "integer, must be even"). add preamble
                  $res = sprintf(
                      $self->_xlt(
                          $cd, "Does not satisfy the following schema: %s"),
                      $res
                  );
              }
          }
      } else {
          $res = $self->_format_ccls_markdown($cd, $ccls);
      }
      $res;
  }
  
  sub _format_ccls_itext {
      my ($self, $cd, $ccls) = @_;
  
      local $cd->{args}{mark_missing_translation} = 0;
      my $c_comma = $self->_xlt($cd, ", ");
  
      if (ref($ccls) eq 'HASH' && $ccls->{type} =~ /^(noun|clause)$/) {
          if ($ccls->{type} eq 'noun') {
              $cd->{_fmt_noun_count}++;
          } else {
              $cd->{_fmt_etc_count}++;
          }
          # handle a single noun/clause ccl
          my $ccl = $ccls;
          return ref($ccl->{text}) eq 'ARRAY' ? $ccl->{text}[0] : $ccl->{text};
      } elsif (ref($ccls) eq 'HASH' && $ccls->{type} eq 'list') {
          # handle a single list ccl
          my $c_openpar  = $self->_xlt($cd, "(");
          my $c_closepar = $self->_xlt($cd, ")");
          my $c_colon    = $self->_xlt($cd, ": ");
          my $ccl = $ccls;
  
          my $txt = $ccl->{text}; $txt =~ s/\s+$//;
          my @t = ($txt, $c_colon);
          my $i = 0;
          for (@{ $ccl->{items} }) {
              push @t, $c_comma if $i;
              my $it = $self->_format_ccls_itext($cd, $_);
              if ($it =~ /\Q$c_comma/) {
                  push @t, $c_openpar, $it, $c_closepar;
              } else {
                  push @t, $it;
              }
              $i++;
          }
          return join("", @t);
      } elsif (ref($ccls) eq 'ARRAY') {
          # handle an array of ccls
          return join($c_comma, map {$self->_format_ccls_itext($cd, $_)} @$ccls);
      } else {
          $self->_die($cd, "Can't format $ccls");
      }
  }
  
  sub _format_ccls_markdown {
      my ($self, $cd, $ccls) = @_;
  
      $self->_die($cd, "Sorry, markdown not yet implemented");
  }
  
  sub _load_lang_modules {
      my ($self, $cd) = @_;
  
      my $lang = $cd->{args}{lang};
      die "Invalid language '$lang', please use letters only"
          unless $lang =~ /\A\w+\z/;
  
      my @modp;
      unless ($lang eq 'en_US') {
          push @modp, "Data/Sah/Lang/$lang.pm";
          for my $cl (@{ $typex{$cd->{type}} // []}) {
              my $modp = "Data/Sah/Lang/$lang/TypeX/$cd->{type}/$cl.pm";
              $modp =~ s!::!/!g; # $cd->{type} might still contain '::'
              push @modp, $modp;
          }
      }
      my $i;
      for my $modp (@modp) {
          $i++;
          unless (exists $INC{$modp}) {
              if ($i == 1) {
                  # test to check whether Data::Sah::Lang::$lang exists. if it
                  # does not, we fallback to en_US.
                  require Module::Installed::Tiny;
                  if (!Module::Installed::Tiny::module_installed($modp)) {
                      #$log->debug("$mod cannot be found, falling back to en_US");
                      $cd->{args}{lang} = 'en_US';
                      last;
                  }
              }
              #$log->trace("Loading $modp ...");
              require $modp;
  
              # negative-cache, so we don't have to try again
              $INC{$modp} = undef;
          }
      }
  }
  
  sub before_compile {
      my ($self, $cd) = @_;
  
      # set locale so that numbers etc are printed according to locale (e.g.
      # sprintf("%s", 1.2) prints '1,2' in id_ID).
      $cd->{_orig_locale} = setlocale(LC_ALL);
  
      # XXX do we need to set everything? LC_ADDRESS, LC_TELEPHONE, LC_PAPER, ...
      my $res = setlocale(LC_ALL, $cd->{args}{locale} // $cd->{args}{lang});
      warn "Unsupported locale $cd->{args}{lang}"
          if $cd->{args}{debug} && !defined($res);
  }
  
  sub before_handle_type {
      my ($self, $cd) = @_;
  
      $self->_load_lang_modules($cd);
  }
  
  sub before_clause {
      my ($self, $cd) = @_;
  
      # by default, human clause handler can handle multiple values (e.g.
      # "div_by&"=>[2, 3] becomes "must be divisible by 2 and 3" instead of having
      # to be ["must be divisible by 2", "must be divisible by 3"]. some clauses
      # that don't can override this value to 0.
      $cd->{CLAUSE_DO_MULTI} = 1;
  }
  
  sub after_clause {
      my ($self, $cd) = @_;
  
      # reset what we set in before_clause()
      delete $cd->{CLAUSE_DO_MULTI};
  }
  
  sub after_all_clauses {
      my ($self, $cd) = @_;
  
      # quantify NOUN (e.g. integer) into 'required integer', 'optional integer',
      # or 'forbidden integer'.
  
      # my $q;
      # if (!$cd->{clset}{'required.is_expr'} &&
      #         !(grep {$_ eq 'required'} @{ $cd->{args}{skip_clause} })) {
      #     if ($cd->{clset}{required}) {
      #         $q = 'required %s';
      #     } else {
      #         $q = 'optional %s';
      #     }
      # } elsif ($cd->{clset}{forbidden} && !$cd->{clset}{'forbidden.is_expr'} &&
      #              !(grep { $_ eq 'forbidden' } @{ $cd->{args}{skip_clause} })) {
      #     $q = 'forbidden %s';
      # }
      # if ($q && @{$cd->{ccls}} && $cd->{ccls}[0]{type} eq 'noun') {
      #     $q = $self->_xlt($cd, $q);
      #     for (ref($cd->{ccls}[0]{text}) eq 'ARRAY' ?
      #              @{ $cd->{ccls}[0]{text} } : $cd->{ccls}[0]{text}) {
      #         $_ = sprintf($q, $_);
      #     }
      # }
  
      $cd->{result} = $self->format_ccls($cd, $cd->{ccls});
  }
  
  sub after_compile {
      my ($self, $cd) = @_;
  
      setlocale(LC_ALL, $cd->{_orig_locale});
  
      if ($cd->{args}{format} eq 'msg_catalog') {
          $cd->{result} = $cd->{_msg_catalog};
      }
  }
  
  1;
  # ABSTRACT: Compile Sah schema to human language
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Compiler::human - Compile Sah schema to human language
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Compiler::human (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =head1 SYNOPSIS
  
  =head1 DESCRIPTION
  
  This class is derived from L<Data::Sah::Compiler>. It generates human language
  text.
  
  =for Pod::Coverage ^(name|literal|expr|add_ccl|format_ccls|check_compile_args|handle_.+|before_.+|after_.+)$
  
  =head1 ATTRIBUTES
  
  =head1 METHODS
  
  =head2 new() => OBJ
  
  =head2 $c->compile(%args) => RESULT
  
  Aside from base class' arguments, this class supports these arguments (suffix
  C<*> denotes required argument):
  
  =over
  
  =item * format => STR (default: C<inline_text>)
  
  Format of text to generate. Either C<inline_text>, C<inline_err_text>, or
  C<markdown>. Note that you can easily convert Markdown to HTML, there are
  libraries in Perl, JavaScript, etc to do that.
  
  Sample C<inline_text> output:
  
   integer, must satisfy all of the following: (divisible by 3, at least 10)
  
  C<inline_err_text> is just like C<inline_text>, except geared towards producing
  an error message. Currently, instead of producing "integer" from schema "int",
  it produces "Not of type integer". The rest is identical.
  
  Sample C<markdown> output:
  
   integer, must satisfy all of the following:
  
   * divisible by 3
   * at least 10
  
  =item * hash_values => hash
  
  Optional, supply more keys to hash value to C<sprintfn> which will be used
  during compilation.
  
  =back
  
  =head3 Compilation data
  
  This subclass adds the following compilation data (C<$cd>).
  
  Keys which contain compilation state:
  
  =over 4
  
  =back
  
  Keys which contain compilation result:
  
  =over 4
  
  =back
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COMPILER_HUMAN

    $main::fatpacked{"Data/Sah/Compiler/human/TH.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COMPILER_HUMAN_TH';
  package Data::Sah::Compiler::human::TH;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  #use Log::Any '$log';
  
  use Mo qw(build default);
  use Role::Tiny::With;
  
  extends 'Data::Sah::Compiler::TH';
  
  sub name { undef }
  
  sub handle_type {
      my ($self, $cd) = @_;
      my $c = $self->compiler;
  
      # give the class name
      my $pkg = ref($self);
      $pkg =~ s/^Data::Sah::Compiler::human::TH:://;
  
      $c->add_ccl($cd, {type=>'noun', fmt=>$pkg});
  }
  
  # not translated
  
  sub clause_name {}
  sub clause_summary {}
  sub clause_description {}
  sub clause_comment {}
  sub clause_tags {}
  sub clause_examples {}
  sub clause_invalid_examples {}
  
  sub clause_prefilters {}
  sub clause_postfilters {}
  
  # ignored
  
  sub clause_ok {}
  
  # handled in after_all_clauses
  
  sub clause_req {}
  sub clause_forbidden {}
  
  # default implementation
  
  sub clause_default {
      my ($self, $cd) = @_;
      my $c = $self->compiler;
  
      $c->add_ccl($cd, {expr=>1,
                        fmt => 'default value %s'});
  }
  
  sub before_clause_clause {
      my ($self, $cd) = @_;
      $cd->{CLAUSE_DO_MULTI} = 0;
  }
  
  sub before_clause_clset {
      my ($self, $cd) = @_;
      $cd->{CLAUSE_DO_MULTI} = 0;
  }
  
  sub before_clause_if {
      my ($self, $cd) = @_;
      $cd->{CLAUSE_DO_MULTI} = 0;
  }
  
  sub clause_if {
      my ($self, $cd) = @_;
      my $c  = $self->compiler;
      my $cv = $cd->{cl_value};
  
      my ($cond, $then, $else) = @$cv;
  
      unless (!ref($cond) && ref($then) eq 'ARRAY' && !$else) {
          $c->_die($cd, "Sorry, for 'if' clause, I currently can only handle COND=str (expr), THEN=array (schema), and no ELSE");
      }
  
      # temporary. currently it sucks because it plasters schema and expr directly
      $c->add_ccl($cd, {
          expr => 0,
          vals => [$cond, $then],
          fmt => 'if the expression %s is true then the schema %s must be followed',
      });
  }
  
  1;
  # ABSTRACT: Base class for human type handlers
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Compiler::human::TH - Base class for human type handlers
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Compiler::human::TH (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(name|compiler|clause_.+|handle_.+|before_.+|after_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COMPILER_HUMAN_TH

    $main::fatpacked{"Data/Sah/Compiler/human/TH/Comparable.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COMPILER_HUMAN_TH_COMPARABLE';
  package Data::Sah::Compiler::human::TH::Comparable;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  #use Log::Any '$log';
  
  use Mo qw(build default);
  use Role::Tiny;
  use Role::Tiny::With;
  
  with 'Data::Sah::Type::Comparable';
  
  sub superclause_comparable {
      my ($self, $which, $cd) = @_;
      my $c = $self->compiler;
  
      my $fmt;
      if ($which eq 'is') {
          $c->add_ccl($cd, {expr=>1, multi=>1,
                            fmt => '%(modal_verb)s have the value %s'});
      } elsif ($which eq 'in') {
          $c->add_ccl($cd, {expr=>1, multi=>1,
                            fmt => '%(modal_verb)s be one of %s'});
      }
  }
  1;
  # ABSTRACT: human's type handler for role "Comparable"
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Compiler::human::TH::Comparable - human's type handler for role "Comparable"
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Compiler::human::TH::Comparable (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(clause_.+|superclause_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COMPILER_HUMAN_TH_COMPARABLE

    $main::fatpacked{"Data/Sah/Compiler/human/TH/HasElems.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COMPILER_HUMAN_TH_HASELEMS';
  package Data::Sah::Compiler::human::TH::HasElems;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  #use Log::Any '$log';
  
  use Mo qw(build default);
  use Role::Tiny;
  use Role::Tiny::With;
  
  with 'Data::Sah::Type::HasElems';
  
  sub before_clause {
      my ($self_th, $which, $cd) = @_;
  }
  
  sub before_clause_len_between {
      my ($self, $cd) = @_;
      $cd->{CLAUSE_DO_MULTI} = 0;
  }
  
  sub superclause_has_elems {
      my ($self_th, $which, $cd) = @_;
      my $c  = $self_th->compiler;
      my $cv = $cd->{cl_value};
  
      if ($which eq 'len') {
          $c->add_ccl($cd, {
              expr  => 1,
              fmt   => q[length %(modal_verb)s be %s],
          });
      } elsif ($which eq 'min_len') {
          $c->add_ccl($cd, {
              expr  => 1,
              fmt   => q[length %(modal_verb)s be at least %s],
          });
      } elsif ($which eq 'max_len') {
          $c->add_ccl($cd, {
              expr  => 1,
              fmt   => q[length %(modal_verb)s be at most %s],
          });
      } elsif ($which eq 'len_between') {
          $c->add_ccl($cd, {
              fmt   => q[length %(modal_verb)s be between %s and %s],
              vals  => $cv,
          });
      } elsif ($which eq 'has') {
          $c->add_ccl($cd, {
              expr=>1, multi=>1,
              fmt => "%(modal_verb)s have %s in its elements"});
      } elsif ($which eq 'each_index') {
          $self_th->clause_each_index($cd);
      } elsif ($which eq 'each_elem') {
          $self_th->clause_each_elem($cd);
      } elsif ($which eq 'check_each_index') {
          $self_th->compiler->_die_unimplemented_clause($cd);
      } elsif ($which eq 'check_each_elem') {
          $self_th->compiler->_die_unimplemented_clause($cd);
      } elsif ($which eq 'uniq') {
          $self_th->compiler->_die_unimplemented_clause($cd);
      } elsif ($which eq 'exists') {
          $self_th->compiler->_die_unimplemented_clause($cd);
      }
  }
  
  1;
  # ABSTRACT: human's type handler for role "HasElems"
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Compiler::human::TH::HasElems - human's type handler for role "HasElems"
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Compiler::human::TH::HasElems (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(name|clause_.+|superclause_.+|before_.+|after_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COMPILER_HUMAN_TH_HASELEMS

    $main::fatpacked{"Data/Sah/Compiler/human/TH/Sortable.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COMPILER_HUMAN_TH_SORTABLE';
  package Data::Sah::Compiler::human::TH::Sortable;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  #use Log::Any '$log';
  
  use Mo qw(build default);
  use Role::Tiny;
  use Role::Tiny::With;
  
  with 'Data::Sah::Type::Sortable';
  
  sub before_clause_between {
      my ($self, $cd) = @_;
      $cd->{CLAUSE_DO_MULTI} = 0;
  }
  
  sub before_clause_xbetween {
      my ($self, $cd) = @_;
      $cd->{CLAUSE_DO_MULTI} = 0;
  }
  
  sub superclause_sortable {
      my ($self, $which, $cd) = @_;
      my $c = $self->compiler;
      my $cv = $cd->{cl_value};
  
      if ($which eq 'min') {
          $c->add_ccl($cd, {
              expr=>1,
              fmt => '%(modal_verb)s be at least %s',
          });
      } elsif ($which eq 'xmin') {
          $c->add_ccl($cd, {
              expr=>1,
              fmt => '%(modal_verb)s be larger than %s',
          });
      } elsif ($which eq 'max') {
          $c->add_ccl($cd, {
              expr=>1,
              fmt => '%(modal_verb)s be at most %s',
          });
      } elsif ($which eq 'xmax') {
          $c->add_ccl($cd, {
              expr=>1,
              fmt => '%(modal_verb)s be smaller than %s',
          });
      } elsif ($which eq 'between') {
          $c->add_ccl($cd, {
              fmt => '%(modal_verb)s be between %s and %s',
              vals => $cv,
          });
      } elsif ($which eq 'xbetween') {
          $c->add_ccl($cd, {
              fmt => '%(modal_verb)s be larger than %s and smaller than %s',
              vals => $cv,
          });
      }
  }
  
  1;
  # ABSTRACT: human's type handler for role "Sortable"
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Compiler::human::TH::Sortable - human's type handler for role "Sortable"
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Compiler::human::TH::Sortable (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(name|clause_.+|superclause_.+|before_.+|after_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COMPILER_HUMAN_TH_SORTABLE

    $main::fatpacked{"Data/Sah/Compiler/human/TH/all.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COMPILER_HUMAN_TH_ALL';
  package Data::Sah::Compiler::human::TH::all;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  #use Log::Any '$log';
  
  use Mo qw(build default);
  use Role::Tiny::With;
  
  extends 'Data::Sah::Compiler::human::TH';
  with 'Data::Sah::Type::all';
  
  sub handle_type {
  }
  
  sub clause_of {
      my ($self, $cd) = @_;
      my $c  = $self->compiler;
      my $cv = $cd->{cl_value};
  
      my @result;
      my $i = 0;
      for my $cv2 (@$cv) {
          local $cd->{spath} = [@{$cd->{spath}}, $i];
          my %iargs = %{$cd->{args}};
          $iargs{outer_cd}             = $cd;
          $iargs{schema}               = $cv2;
          $iargs{schema_is_normalized} = 0;
          my $icd = $c->compile(%iargs);
          push @result, $icd->{ccls};
          $c->_add_msg_catalog($cd, $icd->{ccls});
          $i++;
      }
  
      # can we say 'NOUN1 as well as NOUN2 as well as NOUN3 ...'?
      my $can = 1;
      for my $r (@result) {
          unless (@$r == 1 && $r->[0]{type} eq 'noun') {
              $can = 0;
              last;
          }
      }
  
      my $vals;
      if ($can) {
          my $c0  = $c->_xlt($cd, '%(modal_verb)s be %s');
          my $awa = $c->_xlt($cd, 'as well as %s');
          my $wb  = $c->_xlt($cd, ' ');
          my $fmt;
          my $i = 0;
          for my $r (@result) {
              $fmt .= $i ? $wb . $awa : $c0;
              push @$vals, ref($r->[0]{text}) eq 'ARRAY' ?
                  $r->[0]{text}[0] : $r->[0]{text};
              $i++;
          }
          $c->add_ccl($cd, {
              fmt  => $fmt,
              vals => $vals,
              xlt  => 0,
              type => 'noun',
          });
      } else {
          $c->add_ccl($cd, {
              type  => 'list',
              fmt   => '%(modal_verb)s be all of the following',
              items => [
                  @result,
              ],
              vals  => [],
          });
      }
  }
  
  1;
  # ABSTRACT: perl's type handler for type "all"
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Compiler::human::TH::all - perl's type handler for type "all"
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Compiler::human::TH::all (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(clause_.+|superclause_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COMPILER_HUMAN_TH_ALL

    $main::fatpacked{"Data/Sah/Compiler/human/TH/any.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COMPILER_HUMAN_TH_ANY';
  package Data::Sah::Compiler::human::TH::any;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  #use Log::Any '$log';
  
  use Mo qw(build default);
  use Role::Tiny::With;
  
  extends 'Data::Sah::Compiler::human::TH';
  with 'Data::Sah::Type::any';
  
  sub handle_type {
      # does not have a noun
  }
  
  sub clause_of {
      my ($self, $cd) = @_;
      my $c  = $self->compiler;
      my $cv = $cd->{cl_value};
  
      my @result;
      my $i = 0;
      for my $cv2 (@$cv) {
          local $cd->{spath} = [@{$cd->{spath}}, $i];
          my %iargs = %{$cd->{args}};
          $iargs{outer_cd}             = $cd;
          $iargs{schema}               = $cv2;
          $iargs{schema_is_normalized} = 0;
          my $icd = $c->compile(%iargs);
          push @result, $icd->{ccls};
          $i++;
      }
  
      # can we say 'either NOUN1 or NOUN2 or NOUN3 ...'?
      my $can = 1;
      for my $r (@result) {
          unless (@$r == 1 && $r->[0]{type} eq 'noun') {
              $can = 0;
              last;
          }
      }
  
      my $vals;
      if ($can) {
          my $c0  = $c->_xlt($cd, '%(modal_verb)s be either %s');
          my $awa = $c->_xlt($cd, 'or %s');
          my $wb  = $c->_xlt($cd, ' ');
          my $fmt;
          my $i = 0;
          for my $r (@result) {
              $fmt .= $i ? $wb . $awa : $c0;
              push @$vals, ref($r->[0]{text}) eq 'ARRAY' ?
                  $r->[0]{text}[0] : $r->[0]{text};
              $i++;
          }
          $c->add_ccl($cd, {
              fmt  => $fmt,
              vals => $vals,
              xlt  => 0,
              type => 'noun',
          });
      } else {
          $c->add_ccl($cd, {
              type  => 'list',
              fmt   => '%(modal_verb)s be one of the following',
              items => [
                  @result,
              ],
              vals  => [],
          });
      }
  }
  
  1;
  # ABSTRACT: perl's type handler for type "any"
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Compiler::human::TH::any - perl's type handler for type "any"
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Compiler::human::TH::any (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(clause_.+|superclause_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COMPILER_HUMAN_TH_ANY

    $main::fatpacked{"Data/Sah/Compiler/human/TH/array.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COMPILER_HUMAN_TH_ARRAY';
  package Data::Sah::Compiler::human::TH::array;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  #use Log::Any '$log';
  
  use Mo qw(build default);
  use Role::Tiny::With;
  
  extends 'Data::Sah::Compiler::human::TH';
  with 'Data::Sah::Compiler::human::TH::Comparable';
  with 'Data::Sah::Compiler::human::TH::HasElems';
  with 'Data::Sah::Type::array';
  
  sub handle_type {
      my ($self, $cd) = @_;
      my $c = $self->compiler;
  
      $c->add_ccl($cd, {
          fmt   => ["array", "arrays"],
          type  => 'noun',
      });
  }
  
  sub clause_each_index {
      my ($self, $cd) = @_;
      my $c  = $self->compiler;
      my $cv = $cd->{cl_value};
  
      my %iargs = %{$cd->{args}};
      $iargs{outer_cd}             = $cd;
      $iargs{schema}               = $cv;
      $iargs{schema_is_normalized} = 0;
      my $icd = $c->compile(%iargs);
  
      $c->add_ccl($cd, {
          type  => 'list',
          fmt   => 'each array subscript %(modal_verb)s be',
          items => [
              $icd->{ccls},
          ],
          vals  => [],
      });
  }
  
  sub clause_each_elem {
      my ($self, $cd) = @_;
      my $c  = $self->compiler;
      my $cv = $cd->{cl_value};
  
      my %iargs = %{$cd->{args}};
      $iargs{outer_cd}             = $cd;
      $iargs{schema}               = $cv;
      $iargs{schema_is_normalized} = 0;
      my $icd = $c->compile(%iargs);
  
      # can we say 'array of INOUNS', e.g. 'array of integers'?
      if (@{$icd->{ccls}} == 1) {
          my $c0 = $icd->{ccls}[0];
          if ($c0->{type} eq 'noun' && ref($c0->{text}) eq 'ARRAY' &&
                  @{$c0->{text}} > 1 && @{$cd->{ccls}} &&
                      $cd->{ccls}[0]{type} eq 'noun') {
              for (ref($cd->{ccls}[0]{text}) eq 'ARRAY' ?
                       @{$cd->{ccls}[0]{text}} : ($cd->{ccls}[0]{text})) {
                  my $fmt = $c->_xlt($cd, '%s of %s');
                  $_ = sprintf $fmt, $_, $c0->{text}[1];
              }
              return;
          }
      }
  
      # nope, we can't
      $c->add_ccl($cd, {
          type  => 'list',
          fmt   => 'each array element %(modal_verb)s be',
          items => [
              $icd->{ccls},
          ],
          vals  => [],
      });
  }
  
  sub clause_elems {
      my ($self, $cd) = @_;
      my $c  = $self->compiler;
      my $cv = $cd->{cl_value};
  
      for my $i (0..@$cv-1) {
          local $cd->{spath} = [@{$cd->{spath}}, $i];
          my $v = $cv->[$i];
          my %iargs = %{$cd->{args}};
          $iargs{outer_cd}             = $cd;
          $iargs{schema}               = $v;
          $iargs{schema_is_normalized} = 0;
          my $icd = $c->compile(%iargs);
          $c->add_ccl($cd, {
              type  => 'list',
              fmt   => '%s %(modal_verb)s be',
              vals  => [
                  $c->_ordinate($cd, $i+1, $c->_xlt($cd, "element")),
              ],
              items => [ $icd->{ccls} ],
          });
      }
  }
  
  1;
  # ABSTRACT: human's type handler for type "array"
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Compiler::human::TH::array - human's type handler for type "array"
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Compiler::human::TH::array (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(clause_.+|superclause_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COMPILER_HUMAN_TH_ARRAY

    $main::fatpacked{"Data/Sah/Compiler/human/TH/bool.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COMPILER_HUMAN_TH_BOOL';
  package Data::Sah::Compiler::human::TH::bool;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  #use Log::Any '$log';
  
  use Mo qw(build default);
  use Role::Tiny::With;
  
  extends 'Data::Sah::Compiler::human::TH';
  with 'Data::Sah::Compiler::human::TH::Comparable';
  with 'Data::Sah::Compiler::human::TH::Sortable';
  with 'Data::Sah::Type::bool';
  
  sub name { "boolean value" }
  
  sub handle_type {
      my ($self, $cd) = @_;
      my $c = $self->compiler;
  
      $c->add_ccl($cd, {
          fmt   => ["boolean value", "boolean values"],
          type  => 'noun',
      });
  }
  
  sub before_clause_is_true {
      my ($self, $cd) = @_;
      $cd->{CLAUSE_DO_MULTI} = 0;
  }
  
  sub clause_is_true {
      my ($self, $cd) = @_;
      my $c  = $self->compiler;
      my $cv = $cd->{cl_value};
  
      $c->add_ccl($cd, {
          fmt   => $cv ? q[%(modal_verb)s be true] : q[%(modal_verb)s be false],
      });
  }
  
  sub clause_is_re {
      my ($self, $cd) = @_;
      my $c  = $self->compiler;
      my $cv = $cd->{cl_value};
  
      $c->add_ccl($cd, {
          fmt   => q[%(modal_verb)s be a regex pattern],
      });
  }
  
  1;
  # ABSTRACT: perl's type handler for type "bool"
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Compiler::human::TH::bool - perl's type handler for type "bool"
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Compiler::human::TH::bool (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(name|clause_.+|superclause_.+|before_.+|after_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COMPILER_HUMAN_TH_BOOL

    $main::fatpacked{"Data/Sah/Compiler/human/TH/buf.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COMPILER_HUMAN_TH_BUF';
  package Data::Sah::Compiler::human::TH::buf;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  #use Log::Any '$log';
  
  use Mo qw(build default);
  use Role::Tiny::With;
  
  extends 'Data::Sah::Compiler::human::TH::str';
  
  sub name { "buffer" }
  
  sub handle_type {
      my ($self, $cd) = @_;
      my $c = $self->compiler;
  
      $c->add_ccl($cd, {
          fmt   => ["buffer", "buffers"],
          type  => 'noun',
      });
  }
  
  1;
  # ABSTRACT: perl's type handler for type "buf"
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Compiler::human::TH::buf - perl's type handler for type "buf"
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Compiler::human::TH::buf (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(name|clause_.+|superclause_.+|before_.+|after_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COMPILER_HUMAN_TH_BUF

    $main::fatpacked{"Data/Sah/Compiler/human/TH/cistr.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COMPILER_HUMAN_TH_CISTR';
  package Data::Sah::Compiler::human::TH::cistr;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  #use Log::Any '$log';
  
  use Mo qw(build default);
  use Role::Tiny::With;
  
  extends 'Data::Sah::Compiler::human::TH::str';
  
  1;
  # ABSTRACT: perl's type handler for type "cistr"
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Compiler::human::TH::cistr - perl's type handler for type "cistr"
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Compiler::human::TH::cistr (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(name|clause_.+|superclause_.+|before_.+|after_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COMPILER_HUMAN_TH_CISTR

    $main::fatpacked{"Data/Sah/Compiler/human/TH/code.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COMPILER_HUMAN_TH_CODE';
  package Data::Sah::Compiler::human::TH::code;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  #use Log::Any '$log';
  
  use Mo qw(build default);
  use Role::Tiny::With;
  
  extends 'Data::Sah::Compiler::human::TH';
  with 'Data::Sah::Type::code';
  
  sub handle_type {
      my ($self, $cd) = @_;
      my $c = $self->compiler;
  
      $c->add_ccl($cd, {
          fmt   => ["code", "codes"],
          type  => 'noun',
      });
  }
  
  1;
  # ABSTRACT: perl's type handler for type "code"
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Compiler::human::TH::code - perl's type handler for type "code"
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Compiler::human::TH::code (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(clause_.+|superclause_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COMPILER_HUMAN_TH_CODE

    $main::fatpacked{"Data/Sah/Compiler/human/TH/date.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COMPILER_HUMAN_TH_DATE';
  package Data::Sah::Compiler::human::TH::date;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  #use Log::Any '$log';
  
  use Mo qw(build default);
  use Role::Tiny::With;
  
  extends 'Data::Sah::Compiler::human::TH';
  with 'Data::Sah::Compiler::human::TH::Comparable';
  with 'Data::Sah::Compiler::human::TH::Sortable';
  with 'Data::Sah::Type::date';
  
  sub name { "date" }
  
  sub handle_type {
      my ($self, $cd) = @_;
      my $c = $self->compiler;
  
      $c->add_ccl($cd, {type=>'noun', fmt => ["date", "dates"]});
  }
  
  1;
  # ABSTRACT: human's type handler for type "date"
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Compiler::human::TH::date - human's type handler for type "date"
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Compiler::human::TH::date (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(name|clause_.+|superclause_.+|before_.+|after_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COMPILER_HUMAN_TH_DATE

    $main::fatpacked{"Data/Sah/Compiler/human/TH/datenotime.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COMPILER_HUMAN_TH_DATENOTIME';
  package Data::Sah::Compiler::human::TH::datenotime;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  #use Log::Any '$log';
  
  use Mo qw(build default);
  use Role::Tiny::With;
  
  extends 'Data::Sah::Compiler::human::TH::date';
  
  1;
  # ABSTRACT: perl's type handler for type "datenotime"
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Compiler::human::TH::datenotime - perl's type handler for type "datenotime"
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Compiler::human::TH::datenotime (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(name|clause_.+|superclause_.+|before_.+|after_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COMPILER_HUMAN_TH_DATENOTIME

    $main::fatpacked{"Data/Sah/Compiler/human/TH/datetime.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COMPILER_HUMAN_TH_DATETIME';
  package Data::Sah::Compiler::human::TH::datetime;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  #use Log::Any '$log';
  
  use Mo qw(build default);
  use Role::Tiny::With;
  
  extends 'Data::Sah::Compiler::human::TH::date';
  
  sub name { "datetime" }
  
  sub handle_type {
      my ($self, $cd) = @_;
      my $c = $self->compiler;
  
      $c->add_ccl($cd, {type=>'noun', fmt => ["datetime", "datetimes"]});
  }
  
  1;
  # ABSTRACT: perl's type handler for type "datetime"
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Compiler::human::TH::datetime - perl's type handler for type "datetime"
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Compiler::human::TH::datetime (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(name|clause_.+|superclause_.+|before_.+|after_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COMPILER_HUMAN_TH_DATETIME

    $main::fatpacked{"Data/Sah/Compiler/human/TH/duration.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COMPILER_HUMAN_TH_DURATION';
  package Data::Sah::Compiler::human::TH::duration;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  #use Log::Any '$log';
  
  use Mo qw(build default);
  use Role::Tiny::With;
  
  extends 'Data::Sah::Compiler::human::TH';
  with 'Data::Sah::Compiler::human::TH::Comparable';
  with 'Data::Sah::Compiler::human::TH::Sortable';
  with 'Data::Sah::Type::duration';
  
  sub name { "duration" }
  
  sub handle_type {
      my ($self, $cd) = @_;
      my $c = $self->compiler;
  
      $c->add_ccl($cd, {type=>'noun', fmt => ["duration", "durations"]});
  }
  
  1;
  # ABSTRACT: human's type handler for type "duration"
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Compiler::human::TH::duration - human's type handler for type "duration"
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Compiler::human::TH::duration (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(name|clause_.+|superclause_.+|before_.+|after_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COMPILER_HUMAN_TH_DURATION

    $main::fatpacked{"Data/Sah/Compiler/human/TH/float.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COMPILER_HUMAN_TH_FLOAT';
  package Data::Sah::Compiler::human::TH::float;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  #use Log::Any '$log';
  
  use Mo qw(build default);
  use Role::Tiny::With;
  
  extends 'Data::Sah::Compiler::human::TH';
  with 'Data::Sah::Compiler::human::TH::Comparable';
  with 'Data::Sah::Compiler::human::TH::Sortable';
  with 'Data::Sah::Type::float';
  
  sub name { "decimal number" }
  
  sub handle_type {
      my ($self, $cd) = @_;
      my $c = $self->compiler;
  
      $c->add_ccl($cd, {
          type=>'noun',
          fmt => ["decimal number", "decimal numbers"],
      });
  }
  
  sub clause_is_nan {
      my ($self, $cd) = @_;
      my $c = $self->compiler;
  
      my $cv = $cd->{cl_value};
      if ($cd->{cl_is_expr}) {
          $c->add_ccl($cd, {});
      } else {
          $c->add_ccl($cd, {
              fmt => $cv ?
                  q[%(modal_verb)s be a NaN] :
                      q[%(modal_verb_neg)s be a NaN],
          });
      }
  }
  
  sub clause_is_inf {
      my ($self, $cd) = @_;
      my $c = $self->compiler;
  
      my $cv = $cd->{cl_value};
      if ($cd->{cl_is_expr}) {
          $c->add_ccl($cd, {});
      } else {
          $c->add_ccl($cd, {
              fmt => $cv ?
                  q[%(modal_verb)s an infinity] :
                      q[%(modal_verb_neg)s an infinity],
          });
      }
  }
  
  sub clause_is_pos_inf {
      my ($self, $cd) = @_;
      my $c = $self->compiler;
  
      my $cv = $cd->{cl_value};
      if ($cd->{cl_is_expr}) {
          $c->add_ccl($cd, {});
      } else {
          $c->add_ccl($cd, {
              fmt => $cv ?
                  q[%(modal_verb)s a positive infinity] :
                      q[%(modal_verb_neg)s a positive infinity],
          });
      }
  }
  
  sub clause_is_neg_inf {
      my ($self, $cd) = @_;
      my $c = $self->compiler;
  
      my $cv = $cd->{cl_value};
      if ($cd->{cl_is_expr}) {
          $c->add_ccl($cd, {});
      } else {
          $c->add_ccl($cd, {
              fmt => $cv ?
                  q[%(modal_verb)s a negative infinity] :
                      q[%(modal_verb_neg)s a negative infinity],
          });
      }
  }
  
  1;
  # ABSTRACT: human's type handler for type "num"
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Compiler::human::TH::float - human's type handler for type "num"
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Compiler::human::TH::float (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(name|clause_.+|superclause_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COMPILER_HUMAN_TH_FLOAT

    $main::fatpacked{"Data/Sah/Compiler/human/TH/hash.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COMPILER_HUMAN_TH_HASH';
  package Data::Sah::Compiler::human::TH::hash;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  #use Log::Any '$log';
  
  use Mo qw(build default);
  use Role::Tiny::With;
  
  extends 'Data::Sah::Compiler::human::TH';
  with 'Data::Sah::Compiler::human::TH::Comparable';
  with 'Data::Sah::Compiler::human::TH::HasElems';
  with 'Data::Sah::Type::hash';
  
  sub handle_type {
      my ($self, $cd) = @_;
      my $c = $self->compiler;
  
      $c->add_ccl($cd, {
          fmt   => ["hash", "hashes"],
          type  => 'noun',
      });
  }
  
  sub clause_has {
      my ($self, $cd) = @_;
      my $c  = $self->compiler;
  
      $c->add_ccl($cd, {
          expr=>1, multi=>1,
          fmt => "%(modal_verb)s have %s in its %(field)s values"});
  }
  
  sub clause_each_index {
      my ($self, $cd) = @_;
      my $c  = $self->compiler;
      my $cv = $cd->{cl_value};
  
      my %iargs = %{$cd->{args}};
      $iargs{outer_cd}             = $cd;
      $iargs{schema}               = $cv;
      $iargs{schema_is_normalized} = 0;
      my $icd = $c->compile(%iargs);
  
      $c->add_ccl($cd, {
          type  => 'list',
          fmt   => '%(field)s name %(modal_verb)s be',
          items => [
              $icd->{ccls},
          ],
          vals  => [],
      });
  }
  
  sub clause_each_elem {
      my ($self, $cd) = @_;
      my $c  = $self->compiler;
      my $cv = $cd->{cl_value};
  
      my %iargs = %{$cd->{args}};
      $iargs{outer_cd}             = $cd;
      $iargs{schema}               = $cv;
      $iargs{schema_is_normalized} = 0;
      my $icd = $c->compile(%iargs);
  
      $c->add_ccl($cd, {
          type  => 'list',
          fmt   => 'each %(field)s %(modal_verb)s be',
          items => [
              $icd->{ccls},
          ],
          vals  => [],
      });
  }
  
  sub clause_keys {
      my ($self, $cd) = @_;
      my $c  = $self->compiler;
      my $cv = $cd->{cl_value};
  
      for my $k (sort keys %$cv) {
          local $cd->{spath} = [@{$cd->{spath}}, $k];
          my $v = $cv->{$k};
          my %iargs = %{$cd->{args}};
          $iargs{outer_cd}             = $cd;
          $iargs{schema}               = $v;
          $iargs{schema_is_normalized} = 0;
          my $icd = $c->compile(%iargs);
          $c->add_ccl($cd, {
              type  => 'list',
              fmt   => '%(field)s %s %(modal_verb)s be',
              vals  => [$k],
              items => [ $icd->{ccls} ],
          });
      }
  }
  
  sub clause_re_keys {
      my ($self, $cd) = @_;
      my $c  = $self->compiler;
      my $cv = $cd->{cl_value};
  
      for my $k (sort keys %$cv) {
          local $cd->{spath} = [@{$cd->{spath}}, $k];
          my $v = $cv->{$k};
          my %iargs = %{$cd->{args}};
          $iargs{outer_cd}             = $cd;
          $iargs{schema}               = $v;
          $iargs{schema_is_normalized} = 0;
          my $icd = $c->compile(%iargs);
          $c->add_ccl($cd, {
              type  => 'list',
              fmt   => '%(fields)s whose names match regex pattern %s %(modal_verb)s be',
              vals  => [$k],
              items => [ $icd->{ccls} ],
          });
      }
  }
  
  sub clause_req_keys {
      my ($self, $cd) = @_;
      my $c  = $self->compiler;
  
      $c->add_ccl($cd, {
          fmt   => q[%(modal_verb)s have required %(fields)s %s],
          expr  => 1,
      });
  }
  
  sub clause_allowed_keys {
      my ($self, $cd) = @_;
      my $c  = $self->compiler;
  
      $c->add_ccl($cd, {
          fmt   => q[%(modal_verb)s only have these allowed %(fields)s %s],
          expr  => 1,
      });
  }
  
  sub clause_allowed_keys_re {
      my ($self, $cd) = @_;
      my $c  = $self->compiler;
  
      $c->add_ccl($cd, {
          fmt   => q[%(modal_verb)s only have %(fields)s matching regex pattern %s],
          expr  => 1,
      });
  }
  
  sub clause_forbidden_keys {
      my ($self, $cd) = @_;
      my $c  = $self->compiler;
  
      $c->add_ccl($cd, {
          fmt   => q[%(modal_verb_neg)s have these forbidden %(fields)s %s],
          expr  => 1,
      });
  }
  
  sub clause_forbidden_keys_re {
      my ($self, $cd) = @_;
      my $c  = $self->compiler;
  
      $c->add_ccl($cd, {
          fmt   => q[%(modal_verb_neg)s have %(fields)s matching regex pattern %s],
          expr  => 1,
      });
  }
  
  sub clause_choose_one_key {
      my ($self, $cd) = @_;
      my $c  = $self->compiler;
  
      my $multi = $cd->{cl_is_multi};
      $cd->{cl_is_multi} = 0;
  
      my @ccls;
      for my $cv ($multi ? @{ $cd->{cl_value} } : ($cd->{cl_value})) {
          push @ccls, {
              fmt   => q[%(modal_verb)s contain at most one of these %(fields)s %s],
              vals  => [$cv],
          };
      }
      $c->add_ccl($cd, @ccls);
  }
  
  sub clause_choose_all_keys {
      my ($self, $cd) = @_;
      my $c  = $self->compiler;
  
      my $multi = $cd->{cl_is_multi};
      $cd->{cl_is_multi} = 0;
  
      my @ccls;
      for my $cv ($multi ? @{ $cd->{cl_value} } : ($cd->{cl_value})) {
          push @ccls, {
              fmt   => q[%(modal_verb)s contain either none or all of these %(fields)s %s],
              vals  => [$cv],
          };
      }
      $c->add_ccl($cd, @ccls);
  }
  
  sub clause_req_one_key {
      my ($self, $cd) = @_;
      my $c  = $self->compiler;
  
      my $multi = $cd->{cl_is_multi};
      $cd->{cl_is_multi} = 0;
  
      my @ccls;
      for my $cv ($multi ? @{ $cd->{cl_value} } : ($cd->{cl_value})) {
          push @ccls, {
              fmt   => q[%(modal_verb)s contain exactly one of these %(fields)s %s],
              vals  => [$cv],
          };
      }
      $c->add_ccl($cd, @ccls);
  }
  
  sub clause_req_some_keys {
      my ($self, $cd) = @_;
      my $c  = $self->compiler;
  
      my $multi = $cd->{cl_is_multi};
      $cd->{cl_is_multi} = 0;
  
      my @ccls;
      for my $cv ($multi ? @{ $cd->{cl_value} } : ($cd->{cl_value})) {
          push @ccls, {
              fmt   => q[%(modal_verb)s contain between %d and %d of these %(fields)s %s],
              vals  => [$cv->[0], $cv->[1], $cv->[2]],
          };
      }
      $c->add_ccl($cd, @ccls);
  }
  
  sub clause_dep_any {
      my ($self, $cd) = @_;
      my $c  = $self->compiler;
  
      my $multi = $cd->{cl_is_multi};
      $cd->{cl_is_multi} = 0;
  
      my @ccls;
      for my $cv ($multi ? @{ $cd->{cl_value} } : ($cd->{cl_value})) {
          if (@{ $cv->[1] } == 1) {
              push @ccls, {
                  fmt   => q[%(field)s %2$s %(modal_verb)s be present before %(field)s %1$s can be present],
                  vals  => [$cv->[0], $cv->[1][0]],
              };
          } else {
              push @ccls, {
                  fmt   => q[one of %(fields)s %2$s %(modal_verb)s be present before %(field)s %1$s can be present],
                  vals  => $cv,
                  multi => 0,
              };
          }
      }
      $c->add_ccl($cd, @ccls);
  }
  
  sub clause_dep_all {
      my ($self, $cd) = @_;
      my $c  = $self->compiler;
  
      my $multi = $cd->{cl_is_multi};
      $cd->{cl_is_multi} = 0;
  
      my @ccls;
      for my $cv ($multi ? @{ $cd->{cl_value} } : ($cd->{cl_value})) {
          if (@{ $cv->[1] } == 1) {
              push @ccls, {
                  fmt   => q[%(field)s %2$s %(modal_verb)s be present before %(field)s %1$s can be present],
                  vals  => [$cv->[0], $cv->[1][0]],
              };
          } else {
              push @ccls, {
                  fmt   => q[all of %(fields)s %2$s %(modal_verb)s be present before %(field)s %1$s can be present],
                  vals  => $cv,
              };
          }
      }
      $c->add_ccl($cd, @ccls);
  }
  
  sub clause_req_dep_any {
      my ($self, $cd) = @_;
      my $c  = $self->compiler;
  
      my $multi = $cd->{cl_is_multi};
      $cd->{cl_is_multi} = 0;
  
      my @ccls;
      for my $cv ($multi ? @{ $cd->{cl_value} } : ($cd->{cl_value})) {
          if (@{ $cv->[1] } == 1) {
              push @ccls, {
                  fmt   => q[%(field)s %1$s %(modal_verb)s be present when %(field)s %2$s is present],
                  vals  => [$cv->[0], $cv->[1][0]],
              };
          } else {
              push @ccls, {
                  fmt   => q[%(field)s %1$s %(modal_verb)s be present when one of %(fields)s %2$s is present],
                  vals  => $cv,
              };
          }
      }
      $c->add_ccl($cd, @ccls);
  }
  
  sub clause_req_dep_all {
      my ($self, $cd) = @_;
      my $c  = $self->compiler;
  
      my $multi = $cd->{cl_is_multi};
      $cd->{cl_is_multi} = 0;
  
      my @ccls;
      for my $cv ($multi ? @{ $cd->{cl_value} } : ($cd->{cl_value})) {
          if (@{ $cv->[1] } == 1) {
              push @ccls, {
                  fmt   => q[%(field)s %1$s %(modal_verb)s be present when %(field)s %2$s is present],
                  vals  => [$cv->[0], $cv->[1][0]],
              };
          } else {
              push @ccls, {
                  fmt   => q[%(field)s %1$s %(modal_verb)s be present when all of %(fields)s %2$s are present],
                  vals  => $cv,
              };
          }
      }
      $c->add_ccl($cd, @ccls);
  }
  
  1;
  # ABSTRACT: human's type handler for type "hash"
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Compiler::human::TH::hash - human's type handler for type "hash"
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Compiler::human::TH::hash (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(clause_.+|superclause_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COMPILER_HUMAN_TH_HASH

    $main::fatpacked{"Data/Sah/Compiler/human/TH/int.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COMPILER_HUMAN_TH_INT';
  package Data::Sah::Compiler::human::TH::int;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  #use Log::Any '$log';
  
  use Mo qw(build default);
  use Role::Tiny::With;
  
  extends 'Data::Sah::Compiler::human::TH::num';
  with 'Data::Sah::Type::int';
  
  sub name { "integer" }
  
  sub handle_type {
      my ($self, $cd) = @_;
      my $c = $self->compiler;
  
      $c->add_ccl($cd, {
          type  => 'noun',
          fmt   => ["integer", "integers"],
      });
  }
  
  sub clause_div_by {
      my ($self, $cd) = @_;
      my $c  = $self->compiler;
      my $cv = $cd->{cl_value};
  
      if (!$cd->{cl_is_multi} && !$cd->{cl_is_expr} &&
              $cv == 2) {
          $c->add_ccl($cd, {
              fmt   => q[%(modal_verb)s be even],
          });
          return;
      }
  
      $c->add_ccl($cd, {
          fmt   => q[%(modal_verb)s be divisible by %s],
          expr  => 1,
      });
  }
  
  sub clause_mod {
      my ($self, $cd) = @_;
      my $c  = $self->compiler;
      my $cv = $cd->{cl_value};
  
      if (!$cd->{cl_is_multi} && !$cd->{cl_is_expr}) {
          if ($cv->[0] == 2 && $cv->[1] == 0) {
              $c->add_ccl($cd, {
                  fmt   => q[%(modal_verb)s be even],
              });
              return;
          } elsif ($cv->[0] == 2 && $cv->[1] == 1) {
              $c->add_ccl($cd, {
                  fmt   => q[%(modal_verb)s be odd],
              });
              return;
          }
      }
  
      my @ccls;
      for my $cv ($cd->{cl_is_multi} ? @{ $cd->{cl_value} } : ($cd->{cl_value})) {
          push @ccls, {
              fmt  => q[%(modal_verb)s leave a remainder of %2$s when divided by %1$s],
              vals => $cv,
          };
      }
      $c->add_ccl($cd, @ccls);
  }
  
  1;
  # ABSTRACT: human's type handler for type "int"
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Compiler::human::TH::int - human's type handler for type "int"
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Compiler::human::TH::int (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(name|clause_.+|superclause_.+|before_.+|after_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COMPILER_HUMAN_TH_INT

    $main::fatpacked{"Data/Sah/Compiler/human/TH/num.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COMPILER_HUMAN_TH_NUM';
  package Data::Sah::Compiler::human::TH::num;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  #use Log::Any '$log';
  
  use Mo qw(build default);
  use Role::Tiny::With;
  
  extends 'Data::Sah::Compiler::human::TH';
  with 'Data::Sah::Compiler::human::TH::Comparable';
  with 'Data::Sah::Compiler::human::TH::Sortable';
  with 'Data::Sah::Type::num';
  
  sub name { "number" }
  
  sub handle_type {
      my ($self, $cd) = @_;
      my $c = $self->compiler;
  
      $c->add_ccl($cd, {type=>'noun', fmt => ["number", "numbers"]});
  }
  
  1;
  # ABSTRACT: human's type handler for type "num"
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Compiler::human::TH::num - human's type handler for type "num"
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Compiler::human::TH::num (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(name|clause_.+|superclause_.+|before_.+|after_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COMPILER_HUMAN_TH_NUM

    $main::fatpacked{"Data/Sah/Compiler/human/TH/obj.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COMPILER_HUMAN_TH_OBJ';
  package Data::Sah::Compiler::human::TH::obj;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  #use Log::Any '$log';
  
  use Mo qw(build default);
  use Role::Tiny::With;
  
  extends 'Data::Sah::Compiler::human::TH';
  with 'Data::Sah::Type::obj';
  
  sub name { "object" }
  
  sub handle_type {
      my ($self, $cd) = @_;
      my $c = $self->compiler;
  
      $c->add_ccl($cd, {
          fmt   => ["object", "objects"],
          type  => 'noun',
      });
  }
  
  sub clause_can {
      my ($self, $cd) = @_;
      my $c  = $self->compiler;
      my $cv = $cd->{cl_value};
  
      $c->add_ccl($cd, {
          fmt   => q[%(modal_verb)s have method(s) %s],
          #expr  => 1, # weird
      });
  }
  
  sub clause_isa {
      my ($self, $cd) = @_;
      my $c  = $self->compiler;
      my $cv = $cd->{cl_value};
  
      $c->add_ccl($cd, {
          fmt   => q[%(modal_verb)s be subclass of %s],
      });
  }
  
  1;
  # ABSTRACT: perl's type handler for type "obj"
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Compiler::human::TH::obj - perl's type handler for type "obj"
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Compiler::human::TH::obj (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(name|clause_.+|superclause_.+|before_.+|after_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COMPILER_HUMAN_TH_OBJ

    $main::fatpacked{"Data/Sah/Compiler/human/TH/re.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COMPILER_HUMAN_TH_RE';
  package Data::Sah::Compiler::human::TH::re;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  #use Log::Any '$log';
  
  use Mo qw(build default);
  use Role::Tiny::With;
  
  extends 'Data::Sah::Compiler::human::TH';
  with 'Data::Sah::Type::re';
  
  sub name { "regex pattern" }
  
  sub handle_type {
      my ($self, $cd) = @_;
      my $c = $self->compiler;
  
      $c->add_ccl($cd, {
          fmt   => ["regex pattern", "regex patterns"],
          type  => 'noun',
      });
  }
  
  1;
  # ABSTRACT: perl's type handler for type "re"
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Compiler::human::TH::re - perl's type handler for type "re"
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Compiler::human::TH::re (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(name|clause_.+|superclause_.+|before_.+|after_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COMPILER_HUMAN_TH_RE

    $main::fatpacked{"Data/Sah/Compiler/human/TH/str.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COMPILER_HUMAN_TH_STR';
  package Data::Sah::Compiler::human::TH::str;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  #use Log::Any '$log';
  
  use Mo qw(build default);
  use Role::Tiny::With;
  
  extends 'Data::Sah::Compiler::human::TH';
  with 'Data::Sah::Compiler::human::TH::Sortable';
  with 'Data::Sah::Compiler::human::TH::Comparable';
  with 'Data::Sah::Compiler::human::TH::HasElems';
  with 'Data::Sah::Type::str';
  
  sub name { "text" }
  
  sub handle_type {
      my ($self, $cd) = @_;
      my $c = $self->compiler;
  
      $c->add_ccl($cd, {
          fmt   => ["text", "texts"],
          type  => 'noun',
      });
  }
  
  sub clause_each_index {
      my ($self, $cd) = @_;
      my $c  = $self->compiler;
      my $cv = $cd->{cl_value};
  
      my %iargs = %{$cd->{args}};
      $iargs{outer_cd}             = $cd;
      $iargs{schema}               = $cv;
      $iargs{schema_is_normalized} = 0;
      my $icd = $c->compile(%iargs);
  
      $c->add_ccl($cd, {
          type  => 'list',
          fmt   => 'each subscript of text %(modal_verb)s be',
          items => [
              $icd->{ccls},
          ],
          vals  => [],
      });
  }
  
  sub clause_each_elem {
      my ($self, $cd) = @_;
      my $c  = $self->compiler;
      my $cv = $cd->{cl_value};
  
      my %iargs = %{$cd->{args}};
      $iargs{outer_cd}             = $cd;
      $iargs{schema}               = $cv;
      $iargs{schema_is_normalized} = 0;
      my $icd = $c->compile(%iargs);
  
      $c->add_ccl($cd, {
          type  => 'list',
          fmt   => 'each character of the text %(modal_verb)s be',
          items => [
              $icd->{ccls},
          ],
          vals  => [],
      });
  }
  
  sub clause_encoding {
      my ($self, $cd) = @_;
      my $c  = $self->compiler;
      my $cv = $cd->{cl_value};
  
      $c->_die($cd, "Only 'utf8' encoding is currently supported")
          unless $cv eq 'utf8';
      # currently does nothing
  }
  
  sub clause_match {
      my ($self, $cd) = @_;
      my $c  = $self->compiler;
      my $cv = $cd->{cl_value};
  
      $c->add_ccl($cd, {
          fmt   => q[%(modal_verb)s match regex pattern %s],
          #expr  => 1, # weird
      });
  }
  
  sub clause_is_re {
      my ($self, $cd) = @_;
      my $c  = $self->compiler;
      my $cv = $cd->{cl_value};
  
      $c->add_ccl($cd, {
          fmt   => q[%(modal_verb)s be a regex pattern],
      });
  }
  
  1;
  # ABSTRACT: perl's type handler for type "str"
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Compiler::human::TH::str - perl's type handler for type "str"
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Compiler::human::TH::str (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(name|clause_.+|superclause_.+|before_.+|after_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COMPILER_HUMAN_TH_STR

    $main::fatpacked{"Data/Sah/Compiler/human/TH/timeofday.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COMPILER_HUMAN_TH_TIMEOFDAY';
  package Data::Sah::Compiler::human::TH::timeofday;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  #use Log::Any '$log';
  
  use Mo qw(build default);
  use Role::Tiny::With;
  
  extends 'Data::Sah::Compiler::human::TH';
  with 'Data::Sah::Compiler::human::TH::Comparable';
  with 'Data::Sah::Compiler::human::TH::Sortable';
  with 'Data::Sah::Type::timeofday';
  
  sub name { "time" }
  
  sub handle_type {
      my ($self, $cd) = @_;
      my $c = $self->compiler;
  
      $c->add_ccl($cd, {type=>'noun', fmt => ["time", "times"]});
  }
  
  1;
  # ABSTRACT: human's type handler for type "timeofday"
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Compiler::human::TH::timeofday - human's type handler for type "timeofday"
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Compiler::human::TH::timeofday (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(name|clause_.+|superclause_.+|before_.+|after_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COMPILER_HUMAN_TH_TIMEOFDAY

    $main::fatpacked{"Data/Sah/Compiler/human/TH/undef.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COMPILER_HUMAN_TH_UNDEF';
  package Data::Sah::Compiler::human::TH::undef;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  #use Log::Any '$log';
  
  use Mo qw(build default);
  use Role::Tiny::With;
  
  extends 'Data::Sah::Compiler::human::TH';
  with 'Data::Sah::Type::undef';
  
  sub name { "undefined value" }
  
  sub handle_type {
      my ($self, $cd) = @_;
      my $c = $self->compiler;
  
      $c->add_ccl($cd, {
          fmt   => ["undefined value", "undefined values"],
          type  => 'noun',
      });
  }
  
  1;
  # ABSTRACT: perl's type handler for type "undef"
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Compiler::human::TH::undef - perl's type handler for type "undef"
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Compiler::human::TH::undef (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(name|clause_.+|superclause_.+|before_.+|after_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COMPILER_HUMAN_TH_UNDEF

    $main::fatpacked{"Data/Sah/Compiler/perl.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COMPILER_PERL';
  package Data::Sah::Compiler::perl;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  
  use Data::Dmp qw(dmp);
  use Mo qw(build default);
  
  extends 'Data::Sah::Compiler::Prog';
  
  our $PP;
  our $CORE;
  our $CORE_OR_PP;
  our $NO_MODULES;
  
  # BEGIN COPIED FROM String::Indent
  sub __indent {
      my ($indent, $str, $opts) = @_;
      $opts //= {};
  
      my $ibl = $opts->{indent_blank_lines} // 1;
      my $fli = $opts->{first_line_indent} // $indent;
      my $sli = $opts->{subsequent_lines_indent} // $indent;
      #say "D:ibl=<$ibl>, fli=<$fli>, sli=<$sli>";
  
      my $i = 0;
      $str =~ s/^([^\r\n]?)/$i++; !$ibl && !$1 ? "$1" : $i==1 ? "$fli$1" : "$sli$1"/egm;
      $str;
  }
  # END COPIED FROM String::Indent
  
  sub BUILD {
      my ($self, $args) = @_;
  
      $self->comment_style('shell');
      $self->indent_character(" " x 4);
      $self->var_sigil('$');
      $self->concat_op(".");
  }
  
  sub name { "perl" }
  
  sub literal {
      dmp($_[1]);
  }
  
  sub compile {
      my ($self, %args) = @_;
  
      #$self->expr_compiler->compiler->hook_var(
      #    sub {
      #        $_[0];
      #    }
      #);
  
      #$self->expr_compiler->compiler->hook_func(
      #    sub {
      #        my ($name, @args) = @_;
      #        die "Unknown function $name"
      #            unless $self->main->func_names->{$name};
      #        my $subname = "func_$name";
      #        $self->define_sub_start($subname);
      #        my $meth = "func_$name";
      #        $self->func_handlers->{$name}->$meth;
      #        $self->define_sub_end();
      #        $subname . "(" . join(", ", @args) . ")";
      #    }
      #);
  
      # Data::Dumper is chosen as the default because it's core, but note here the
      # inconveniences: 1) the incantation to use it the way we want is
      # cumbersome. Storable is not feasible because of reason explained in
      # comment in expr_dump(). Data::Dmp is another choice.
      $args{dump_module} //= "Data::Dumper";
  
      $args{pp} //= $PP // $ENV{DATA_SAH_PP} // 0;
      $args{core} //= $CORE // $ENV{DATA_SAH_CORE} // 0;
      $args{core_or_pp} //= $CORE_OR_PP // $ENV{DATA_SAH_CORE_OR_PP} // 0;
      $args{no_modules} //= $NO_MODULES // $ENV{DATA_SAH_NO_MODULES} // 0;
  
      $self->SUPER::compile(%args);
  }
  
  sub init_cd {
      my ($self, %args) = @_;
  
      my $cd = $self->SUPER::init_cd(%args);
  
      $self->add_runtime_no($cd, 'warnings', ["'void'"]) unless $cd->{args}{no_modules};
  
      $cd;
  }
  
  sub true { "1" }
  
  sub false { "''" }
  
  # quick lookup table, to avoid having to use Module::CoreList or Module::XSOrPP
  our %known_modules = (
      'DateTime::Duration'        => {pp=>1, core=>0},
      'DateTime'                  => {pp=>0, core=>0},
      'DateTime::Format::Alami'     => {pp=>1, core=>0},
      'DateTime::Format::Alami::EN' => {pp=>1, core=>0},
      'DateTime::Format::Alami::ID' => {pp=>1, core=>0},
      'DateTime::Format::Natural'   => {pp=>1, core=>0},
      'experimental'              => {pp=>1, core=>0}, # only core in 5.020+, so we note it as 0
      'List::Util'                => {pp=>0, core=>1},
      'Scalar::Util::Numeric'     => {pp=>0, core=>0},
      'Scalar::Util::Numeric::PP' => {pp=>1, core=>0},
      'Scalar::Util'              => {pp=>0, core=>1},
      'Storable'                  => {pp=>0, core=>1},
      'Time::Duration::Parse::AsHash' => {pp=>1, core=>0},
      'Time::Local'               => {pp=>1, core=>1},
      'Time::Moment'              => {pp=>0, core=>0},
      'Time::Piece'               => {pp=>0, core=>1},
      'warnings'                  => {pp=>1, core=>1},
  );
  
  sub add_module {
      my ($self, $cd, $name, $extra_keys, $allow_duplicate) = @_;
  
      if (exists $extra_keys->{core}) {
          $known_modules{$name}{core} = $extra_keys->{core};
      }
  
      if (exists $extra_keys->{pp}) {
          $known_modules{$name}{pp} = $extra_keys->{pp};
      }
  
      if ($extra_keys->{phase} eq 'runtime') {
          if ($cd->{args}{no_modules}) {
              die "BUG: Use of module '$name' when compile option no_modules=1";
          }
  
          if ($cd->{args}{whitelist_modules} && grep { $_ eq $name } @{ $cd->{args}{whitelist_modules} }) {
              goto PASS;
          }
  
          if ($cd->{args}{pp}) {
              if (!$known_modules{$name}) {
                  die "BUG: Haven't noted about Perl module '$name' as being pp/xs";
              } elsif (!$known_modules{$name}{pp}) {
                  die "Use of XS module '$name' when compile option pp=1";
              }
          }
  
          if ($cd->{args}{core}) {
              if (!$known_modules{$name}) {
                  die "BUG: Haven't noted about Perl module '$name' as being core/non-core";
              } elsif (!$known_modules{$name}{core}) {
                  die "Use of non-core module '$name' when compile option core=1";
              }
          }
  
          if ($cd->{args}{core_or_pp}) {
              if (!$known_modules{$name}) {
                  die "BUG: Haven't noted about Perl module '$name' as being core/non-core or pp/xs";
              } elsif (!$known_modules{$name}{pp} && !$known_modules{$name}{core}) {
                  die "Use of non-core XS module '$name' when compile option core_or_pp=1";
              }
          }
      }
    PASS:
      $self->SUPER::add_module($cd, $name, $extra_keys, $allow_duplicate);
  }
  
  sub add_runtime_use {
      my ($self, $cd, $name, $import_terms) = @_;
      my $use_statement = "use $name".
          ($import_terms && @$import_terms ? " (".(join ",", @$import_terms).")" : "");
  
      # avoid duplicate use statement
      for my $mod (@{ $cd->{modules} }) {
          next unless $mod->{phase} eq 'runtime';
          return if $mod->{use_statement} &&
              $mod->{use_statement} eq $use_statement;
      }
  
      $self->add_runtime_module(
          $cd,
          $name,
          {
              use_statement => $use_statement,
          },
          1, # allow duplicate
      );
  }
  
  sub add_runtime_no {
      my ($self, $cd, $name, $import_terms) = @_;
  
      my $use_statement = "no $name".
          ($import_terms && @$import_terms ? " (".(join ",", @$import_terms).")" : "");
  
      # avoid duplicate use statement
      for my $mod (@{ $cd->{modules} }) {
          next unless $mod->{phase} eq 'runtime';
          return if $mod->{use_statement} &&
              $mod->{use_statement} eq $use_statement;
      }
  
      $self->add_runtime_module(
          $cd,
          $name,
          {
              use_statement => $use_statement,
          },
          1, # allow duplicate
      );
  }
  
  # add Scalar::Util::Numeric module
  sub add_sun_module {
      my ($self, $cd) = @_;
      if ($cd->{args}{pp} || $cd->{args}{core_or_pp} ||
              !eval { require Scalar::Util::Numeric; 1 }) {
          $cd->{_sun_module} = 'Scalar::Util::Numeric::PP';
      } elsif ($cd->{args}{core}) {
          # just to make sure compilation will fail if we mistakenly use a sun
          # module
          $cd->{_sun_module} = 'Foo';
      } else {
          $cd->{_sun_module} = 'Scalar::Util::Numeric';
      }
      $self->add_runtime_module($cd, $cd->{_sun_module});
  }
  
  # evaluate all terms, then return the last term. user has to make sure all the
  # terms are properly parenthesized if it contains operator with precedence less
  # than the list operator.
  sub expr_list {
      my ($self, @t) = @_;
      "(".join(", ", @t).")";
  }
  
  sub expr_defined {
      my ($self, $t) = @_;
      "defined($t)";
  }
  
  sub expr_array {
      my ($self, @t) = @_;
      "[".join(",", @t)."]";
  }
  
  sub expr_array_subscript {
      my ($self, $at, $idxt) = @_;
      "$at->\[$idxt]";
  }
  
  sub expr_last_elem {
      my ($self, $at, $idxt) = @_;
      "$at->\[-1]";
  }
  
  sub expr_push {
      my ($self, $at, $elt) = @_;
      "push(\@{$at}, $elt)";
  }
  
  sub expr_pop {
      my ($self, $at, $elt) = @_;
      "pop(\@{$at})";
  }
  
  sub expr_push_and_pop_dpath_between_expr {
      my ($self, $et) = @_;
      join(
          "",
          "[",
          $self->expr_push('$_sahv_dpath', $self->literal(undef)), ", ", # 0
          "scalar", $self->enclose_paren($et), ", ", #1 ('scalar' to avoid list flattening)
          $self->expr_pop('$_sahv_dpath'), # 2
          "]->[1]",
      );
  }
  
  sub expr_prefix_dpath {
      my ($self, $t) = @_;
      '(@$_sahv_dpath ? \'@\'.join("",map {"[$_]"} @$_sahv_dpath).": " : "") . ' . $t;
  }
  
  # $l = $r
  sub expr_set {
      my ($self, $l, $r) = @_;
      "($l = $r)";
  }
  
  # $l //= $r
  sub expr_setif {
      my ($self, $l, $r) = @_;
      "($l //= $r)";
  }
  
  sub expr_set_err_str {
      my ($self, $et, $err_expr) = @_;
      "($et //= $err_expr)";
  }
  
  sub expr_set_err_full {
      my ($self, $et, $k, $err_expr) = @_;
      "($et\->{$k}{join('/',\@\$_sahv_dpath)} //= $err_expr)";
  }
  
  sub expr_reset_err_str {
      my ($self, $et, $err_expr) = @_;
      "($et = undef, 1)";
  }
  
  sub expr_reset_err_full {
      my ($self, $et) = @_;
      "(delete($et\->{errors}{join('/',\@\$_sahv_dpath)}), 1)";
  }
  
  # $cond_term ? $true_term : $false_term
  sub expr_ternary {
      my ($self, $cond_term, $true_term, $false_term) = @_;
      "$cond_term ? $true_term : $false_term";
  }
  
  sub expr_log {
      my ($self, $cd, @expr) = @_;
  
      "log_trace('[sah validator](spath=%s) %s', " .
          $self->literal($cd->{spath}).", " . join(", ", @expr) . ")";
  }
  
  # convert Expr expression to perl expression
  sub expr {
      require Language::Expr;
  
      my ($self, $cd, $expr) = @_;
  
      $self->add_runtime_use($cd, 'boolean');
      "(" . Language::Expr->new->get_compiler('perl')->compile($expr) . ")";
  }
  
  # wrap statements into an expression
  sub expr_block {
      my ($self, $code) = @_;
      join(
          "",
          "do {\n",
          __indent(
              $self->indent_character,
              $code,
          ),
          "}",
      );
  }
  
  # whether block is implemented using function
  sub block_uses_sub { 0 }
  
  sub stmt_declare_local_var {
      my ($self, $v, $vt) = @_;
      if ($vt eq 'undef') {
          "my \$$v;";
      } else {
          "my \$$v = $vt;";
      }
  }
  
  sub expr_anon_sub {
      my ($self, $args, $code) = @_;
      join(
          "",
          "sub {\n",
          __indent(
              $self->indent_character,
              join(
                  "",
                  ("my (".join(", ", @$args).") = \@_;\n") x !!@$args,
                  $code,
              ),
          ),
          "}"
      );
  }
  
  # enclose $stmt in an eval/try block, return true if succeeds, false if error
  # was thrown. XXX error message was not recorded yet.
  sub expr_eval {
      my ($self, $stmt) = @_;
      "(eval { $stmt }, !\$@)";
  }
  
  # Storable (fast, core) is not chosen because i cannot make it to dump 3 and "3"
  # as "3". some other inconveniences (but not deal breaker): 1) only accepts
  # references so we need to freeze \$foo or [$foo] instead of just $foo; 2) need
  # to set $Storable::canonical to true, otherwise hash keys are not ordered.
  
  sub expr_dump {
      my ($self, $cd, $t) = @_;
      my $dump_module = $cd->{args}{dump_module};
      if ($dump_module eq 'Data::Dumper') {
          "Data::Dumper->new([$t])->Terse(1)->Indent(0)->Sortkeys(1)->Dump";
      } elsif ($dump_module eq 'Data::Dmp') {
          "Data::Dmp::dmp($t)";
      } else {
          $self->_die($cd, "Unknown dump module '$dump_module'") if $@;
      }
  }
  
  sub stmt_require_module {
      my ($self, $mod_record) = @_;
  
      if ($mod_record->{use_statement}) {
          return "$mod_record->{use_statement};";
      } else {
          "require $mod_record->{name};";
      }
  }
  
  sub stmt_require_log_module {
      my ($self) = @_;
      'use Log::ger;';
  }
  
  sub stmt_assign_hash_value {
      my ($self, $ht, $kt, $vt) = @_;
      "$ht\->{$kt} = $vt;";
  }
  
  sub stmt_return {
      my $self = shift;
      if (@_) {
          "return($_[0]);";
      } else {
          'return;';
      }
  }
  
  sub expr_validator_sub {
      my ($self, %args) = @_;
  
      $self->check_compile_args(\%args);
  
      my $aref = delete $args{accept_ref};
      if ($aref) {
          $args{var_term}  = '$ref_'.$args{data_name};
          $args{data_term} = '$$ref_'.$args{data_name};
      } else {
          $args{var_term}  = '$'.$args{data_name};
          $args{data_term} = '$'.$args{data_name};
      }
  
      $self->SUPER::expr_validator_sub(%args);
  }
  
  sub _str2reliteral {
      require Regexp::Stringify;
  
      my ($self, $cd, $str) = @_;
  
      my $re;
      if (ref($str) eq 'Regexp') {
          $re = $str;
      } else {
          eval { $re = qr/$str/ };
          $self->_die($cd, "Invalid regex $str: $@") if $@;
      }
  
      Regexp::Stringify::stringify_regexp(regexp=>$re, plver=>5.010);
  }
  
  1;
  # ABSTRACT: Compile Sah schema to Perl code
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Compiler::perl - Compile Sah schema to Perl code
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Compiler::perl (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =head1 SYNOPSIS
  
   # see Data::Sah
  
  =head1 DESCRIPTION
  
  Derived from L<Data::Sah::Compiler::Prog>.
  
  =for Pod::Coverage BUILD ^(after_.+|before_.+|name|expr|true|false|literal|expr_.+|stmt_.+|block_uses_sub)$
  
  =head1 VARIABLES
  
  =head2 $PP => bool
  
  Set default for C<pp> compile argument. Takes precedence over environment
  C<DATA_SAH_PP>.
  
  =head2 $CORE => bool
  
  Set default for C<core> compile argument. Takes precedence over environment
  C<DATA_SAH_CORE>.
  
  =head2 $CORE_OR_PP => bool
  
  Set default for C<core_or_pp> compile argument. Takes precedence over
  environment C<DATA_SAH_CORE_OR_PP>.
  
  =head2 $NO_MODULES => bool
  
  Set default for C<no_modules> compile argument. Takes precedence over
  environment C<DATA_SAH_NO_MODULES>.
  
  =head1 DEVELOPER NOTES
  
  To generate expression code that says "all subexpression must be true", you can
  do:
  
   !defined(List::Util::first(sub { blah($_) }, "value", ...))
  
  This is a bit harder to read than:
  
   !grep { !blah($_) } "value", ...
  
  but has the advantage of the ability to shortcut on the first item that fails.
  
  Similarly, to say "at least one subexpression must be true":
  
   defined(List::Util::first(sub { blah($_) }, "value", ...))
  
  which can shortcut in contrast to:
  
   grep { blah($_) } "value", ...
  
  =head1 METHODS
  
  =head2 new() => OBJ
  
  =head3 Compilation data
  
  This subclass adds the following compilation data (C<$cd>).
  
  Keys which contain compilation result:
  
  =over
  
  =back
  
  =head2 $c->comment($cd, @args) => STR
  
  Generate a comment. For example, in perl compiler:
  
   $c->comment($cd, "123"); # -> "# 123\n"
  
  Will return an empty string if compile argument C<comment> is set to false.
  
  =head2 $c->compile(%args) => RESULT
  
  Aside from Prog's arguments, this class supports these arguments:
  
  =over
  
  =item * pp => bool (default: 0)
  
  If set to true, will avoid the use of XS modules in the generated code and will
  opt instead to use pure-perl modules.
  
  =item * core => bool (default: 0)
  
  If set to true, will avoid the use of non-core modules in the generated code and
  will opt instead to use core modules.
  
  =item * core_or_pp => bool (default: 0)
  
  If set to true, will stick to using only core or PP modules in the generated
  code.
  
  =item * whitelist_modules => array {of=>'str'}
  
  When C<pp>/C<core>/C<core_or_pp> option is set to true, the use of
  non-appropriate modules will cause failure. However, you can pass a list of
  modules that are allowed nevertheless.
  
  =back
  
  =head2 $c->add_runtime_use($cd, $module [, \@import_terms ])
  
  This is like C<add_runtime_module()>, but indicate that C<$module> needs to be
  C<use>-d in the generated code (for example, Perl pragmas). Normally if
  C<add_runtime_module()> is used, the generated code will use C<require>.
  
  If you use C<< $c->add_runtime_use($cd, 'foo') >>, this code will be generated:
  
   use foo;
  
  If you use C<< $c->add_runtime_use($cd, 'foo', ["'a'", "'b'", "123"]) >>, this code will
  be generated:
  
   use foo ('a', 'b', 123);
  
  If you use C<< $c->add_runtime_use($cd, 'foo', []) >>, this code will be generated:
  
   use foo ();
  
  The generated statement will be added at the top (top-level lexical scope) and
  duplicates are ignored. To generate multiple and lexically-scoped C<use> and
  C<no> statements, e.g. like below, currently you can generate them manually:
  
   if (blah) {
       no warnings;
       ...
   }
  
  =head2 $c->add_runtime_no($cd, $module [, \@import_terms ])
  
  This is the counterpart of C<add_runtime_use()>, to generate C<no foo> statement.
  
  See also: C<add_runtime_use()>.
  
  =head2 $c->add_sun_module($cd)
  
  Add L<Scalar::Util::Numeric> module, or L<Scalar::Util::Numeric::PP> when C<pp>
  compile argument is true.
  
  =head1 ENVIRONMENT
  
  =head2 DATA_SAH_PP => bool
  
  Set default for C<pp> compile argument.
  
  =head2 DATA_SAH_CORE => bool
  
  Set default for C<core> compile argument.
  
  =head2 DATA_SAH_CORE_OR_PP => bool
  
  Set default for C<core_or_pp> compile argument.
  
  =head2 DATA_SAH_NO_MODULES => bool
  
  Set default for C<no_modules> compile argument.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COMPILER_PERL

    $main::fatpacked{"Data/Sah/Compiler/perl/TH.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COMPILER_PERL_TH';
  package Data::Sah::Compiler::perl::TH;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-02-12'; # DATE
  our $DIST = 'Data-Sah'; # DIST
  our $VERSION = '0.907'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  #use Log::Any '$log';
  
  use Mo qw(build default);
  use Role::Tiny::With;
  
  extends 'Data::Sah::Compiler::Prog::TH';
  
  sub gen_each {
      my ($self, $cd, $indices_expr, $data_name, $data_term, $code_at_sub_begin) = @_;
      my $c  = $self->compiler;
      my $cv = $cd->{cl_value};
      my $dt = $cd->{data_term};
  
      local $cd->{_subdata_level} = $cd->{_subdata_level} + 1;
  
      $c->add_runtime_module($cd, 'List::Util');
      my %iargs = %{$cd->{args}};
      $iargs{outer_cd}             = $cd;
      $iargs{data_name}            = $data_name;
      $iargs{data_term}            = $data_term;
      $iargs{schema}               = $cv;
      $iargs{schema_is_normalized} = 0;
      $iargs{indent_level}++;
      $iargs{data_term_includes_topic_var} = 1;
      my $icd = $c->compile(%iargs);
      my @code = (
          "!defined(List::Util::first(sub {", ($code_at_sub_begin // ''), "!(\n",
          ($c->indent_str($cd),
           "(\$_sahv_dpath->[-1] = \$_),\n") x !!$cd->{use_dpath},
           $icd->{result}, "\n",
           $c->indent_str($icd), ")}, ",
           $indices_expr,
           "))",
      );
      $c->add_ccl($cd, join("", @code), {subdata=>1});
  }
  
  1;
  # ABSTRACT: Base class for perl type handlers
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Compiler::perl::TH - Base class for perl type handlers
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Compiler::perl::TH (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(compiler|clause_.+|gen_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COMPILER_PERL_TH

    $main::fatpacked{"Data/Sah/Compiler/perl/TH/all.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COMPILER_PERL_TH_ALL';
  package Data::Sah::Compiler::perl::TH::all;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  #use Log::Any '$log';
  
  use Mo qw(build default);
  use Role::Tiny::With;
  
  # Mo currently doesn't support multiple classes in 'extends'
  #extends
  #    'Data::Sah::Compiler::perl::TH',
  #    'Data::Sah::Compiler::Prog::TH::all';
  
  use parent (
      'Data::Sah::Compiler::perl::TH',
      'Data::Sah::Compiler::Prog::TH::all',
  );
  
  1;
  # ABSTRACT: perl's type handler for type "all"
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Compiler::perl::TH::all - perl's type handler for type "all"
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Compiler::perl::TH::all (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(clause_.+|superclause_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COMPILER_PERL_TH_ALL

    $main::fatpacked{"Data/Sah/Compiler/perl/TH/any.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COMPILER_PERL_TH_ANY';
  package Data::Sah::Compiler::perl::TH::any;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  #use Log::Any '$log';
  
  use Mo qw(build default);
  use Role::Tiny::With;
  
  # Mo currently doesn't support multiple classes in 'extends'
  #extends
  #    'Data::Sah::Compiler::perl::TH',
  #    'Data::Sah::Compiler::Prog::TH::any';
  
  use parent (
      'Data::Sah::Compiler::perl::TH',
      'Data::Sah::Compiler::Prog::TH::any',
  );
  
  1;
  # ABSTRACT: perl's type handler for type "any"
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Compiler::perl::TH::any - perl's type handler for type "any"
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Compiler::perl::TH::any (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(clause_.+|superclause_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COMPILER_PERL_TH_ANY

    $main::fatpacked{"Data/Sah/Compiler/perl/TH/array.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COMPILER_PERL_TH_ARRAY';
  package Data::Sah::Compiler::perl::TH::array;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  #use Log::ger;
  
  use Mo qw(build default);
  use Role::Tiny::With;
  
  extends 'Data::Sah::Compiler::perl::TH';
  with 'Data::Sah::Type::array';
  
  sub handle_type {
      my ($self, $cd) = @_;
      my $c = $self->compiler;
  
      my $dt = $cd->{data_term};
      $cd->{_ccl_check_type} = "ref($dt) eq 'ARRAY'";
  }
  
  sub superclause_comparable {
      my ($self, $which, $cd) = @_;
      my $c  = $self->compiler;
      my $ct = $cd->{cl_term};
      my $dt = $cd->{data_term};
  
      $c->add_runtime_module($cd, $cd->{args}{dump_module});
  
      if ($which eq 'is') {
          $c->add_ccl($cd, $c->expr_dump($cd, $dt).' eq '.$c->expr_dump($cd, $ct));
      } elsif ($which eq 'in') {
          $c->add_ccl($cd, "do { my \$_sahv_dt_str = ".$c->expr_dump($cd, $dt)."; my \$_sahv_res = 0; " .
                          "for my \$_sahv_el (\@{ $ct }) { my \$_sahv_el_str = ".$c->expr_dump($cd, "\$_sahv_el")."; ".
                          "if (\$_sahv_dt_str eq \$_sahv_el_str) { \$_sahv_res = 1; last } } \$_sahv_res }");
      }
  }
  
  sub superclause_has_elems {
      my ($self_th, $which, $cd) = @_;
      my $c  = $self_th->compiler;
      my $cv = $cd->{cl_value};
      my $ct = $cd->{cl_term};
      my $dt = $cd->{data_term};
  
      if ($which eq 'len') {
          $c->add_ccl($cd, "\@{$dt} == $ct");
      } elsif ($which eq 'min_len') {
          $c->add_ccl($cd, "\@{$dt} >= $ct");
      } elsif ($which eq 'max_len') {
          $c->add_ccl($cd, "\@{$dt} <= $ct");
      } elsif ($which eq 'len_between') {
          if ($cd->{cl_is_expr}) {
              $c->add_ccl(
                  $cd, "\@{$dt} >= $ct\->[0] && \@{$dt} >= $ct\->[1]");
          } else {
              # simplify code
              $c->add_ccl(
                  $cd, "\@{$dt} >= $cv->[0] && \@{$dt} <= $cv->[1]");
          }
      } elsif ($which eq 'has') {
          $c->add_runtime_module($cd, $cd->{args}{dump_module});
          $c->add_ccl($cd, "do { my \$_sahv_ct_str = ".$c->expr_dump($cd, $ct)."; my \$_sahv_res = 0; " .
                          "for my \$_sahv_el (\@{ $dt }) { my \$_sahv_el_str = ".$c->expr_dump($cd, "\$_sahv_el")."; ".
                          "if (\$_sahv_ct_str eq \$_sahv_el_str) { \$_sahv_res = 1; last } } \$_sahv_res }");
      } elsif ($which eq 'each_index') {
          $self_th->set_tmp_data_term($cd) if $cd->{args}{data_term_includes_topic_var};
          $self_th->gen_each($cd, "0..\@{$cd->{data_term}}-1", '_', '$_');
          $self_th->restore_data_term($cd) if $cd->{args}{data_term_includes_topic_var};
      } elsif ($which eq 'each_elem') {
          $self_th->set_tmp_data_term($cd) if $cd->{args}{data_term_includes_topic_var};
          $self_th->gen_each($cd, "0..\@{$cd->{data_term}}-1", '_', "$cd->{data_term}\->[\$_]");
          $self_th->restore_data_term($cd) if $cd->{args}{data_term_includes_topic_var};
      } elsif ($which eq 'check_each_index') {
          $self_th->compiler->_die_unimplemented_clause($cd);
      } elsif ($which eq 'check_each_elem') {
          $self_th->compiler->_die_unimplemented_clause($cd);
      } elsif ($which eq 'uniq') {
          $self_th->compiler->_die_unimplemented_clause($cd);
      } elsif ($which eq 'exists') {
          $self_th->compiler->_die_unimplemented_clause($cd);
      }
  }
  
  sub clause_elems {
      my ($self_th, $cd) = @_;
      my $c  = $self_th->compiler;
      my $cv = $cd->{cl_value};
      my $dt = $cd->{data_term};
  
      local $cd->{_subdata_level} = $cd->{_subdata_level} + 1;
  
      my $jccl;
      {
          local $cd->{ccls} = [];
  
          my $cdef = $cd->{clset}{"elems.create_default"} // 1;
          delete $cd->{uclset}{"elems.create_default"};
  
          for my $i (0..@$cv-1) {
              local $cd->{spath} = [@{$cd->{spath}}, $i];
              my $sch = $c->main->normalize_schema($cv->[$i]);
              my $edt = "$dt\->[$i]";
              my %iargs = %{$cd->{args}};
              $iargs{outer_cd}             = $cd;
              $iargs{data_name}            = "$cd->{args}{data_name}_$i";
              $iargs{data_term}            = $edt;
              $iargs{schema}               = $sch;
              $iargs{schema_is_normalized} = 1;
              $iargs{indent_level}++;
              my $icd = $c->compile(%iargs);
              my @code = (
                  ($c->indent_str($cd), "(\$_sahv_dpath->[-1] = $i),\n") x !!$cd->{use_dpath},
                  $icd->{result}, "\n",
              );
              my $ires = join("", @code);
              local $cd->{_debug_ccl_note} = "elem: $i";
              if ($cdef && defined($sch->[1]{default})) {
                  $c->add_ccl($cd, $ires);
              } else {
                  $c->add_ccl($cd, "\@{$dt} < ".($i+1)." || ($ires)");
              }
          }
          $jccl = $c->join_ccls(
              $cd, $cd->{ccls}, {err_msg => ''});
      }
      $c->add_ccl($cd, $jccl, {subdata=>1});
  }
  
  1;
  # ABSTRACT: perl's type handler for type "array"
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Compiler::perl::TH::array - perl's type handler for type "array"
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Compiler::perl::TH::array (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(clause_.+|superclause_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COMPILER_PERL_TH_ARRAY

    $main::fatpacked{"Data/Sah/Compiler/perl/TH/bool.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COMPILER_PERL_TH_BOOL';
  package Data::Sah::Compiler::perl::TH::bool;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  #use Log::Any '$log';
  
  use Mo qw(build default);
  use Role::Tiny::With;
  
  extends 'Data::Sah::Compiler::perl::TH';
  with 'Data::Sah::Type::bool';
  
  sub handle_type {
      my ($self, $cd) = @_;
      my $c = $self->compiler;
  
      my $dt = $cd->{data_term};
      $cd->{_ccl_check_type} = "!ref($dt)";
  }
  
  sub superclause_comparable {
      my ($self, $which, $cd) = @_;
      my $c  = $self->compiler;
      my $ct = $cd->{cl_term};
      my $dt = $cd->{data_term};
  
      if ($which eq 'is') {
          $c->add_ccl($cd, "($dt ? 1:0) == ($ct ? 1:0)");
      } elsif ($which eq 'in') {
          if ($dt =~ /\$_\b/) {
              $c->add_ccl($cd, "do { my \$_sahv_dt = $dt; (grep { (\$_ ? 1:0) == (\$_sahv_dt ? 1:0) } \@{ $ct }) ? 1:0 }");
          } else {
              $c->add_ccl($cd, "(grep { (\$_ ? 1:0) == ($dt ? 1:0) } \@{ $ct }) ? 1:0");
          }
      }
  }
  
  sub superclause_sortable {
      my ($self, $which, $cd) = @_;
      my $c  = $self->compiler;
      my $cv = $cd->{cl_value};
      my $ct = $cd->{cl_term};
      my $dt = $cd->{data_term};
  
      if ($which eq 'min') {
          $c->add_ccl($cd, "($dt ? 1:0) >= ($ct ? 1:0)");
      } elsif ($which eq 'xmin') {
          $c->add_ccl($cd, "($dt ? 1:0) > ($ct ? 1:0)");
      } elsif ($which eq 'max') {
          $c->add_ccl($cd, "($dt ? 1:0) <= ($ct ? 1:0)");
      } elsif ($which eq 'xmax') {
          $c->add_ccl($cd, "($dt ? 1:0) < ($ct ? 1:0)");
      } elsif ($which eq 'between') {
          if ($cd->{cl_is_expr}) {
              $c->add_ccl($cd, "($dt ? 1:0) >= ($ct\->[0] ? 1:0) && ".
                              "($dt ? 1:0) <= ($ct\->[1] ? 1:0)");
          } else {
              # simplify code
              $c->add_ccl($cd, "($dt ? 1:0) >= ($cv->[0] ? 1:0) && ".
                              "($dt ? 1:0) <= ($cv->[1] ? 1:0)");
          }
      } elsif ($which eq 'xbetween') {
          if ($cd->{cl_is_expr}) {
              $c->add_ccl($cd, "($dt ? 1:0) > ($ct\->[0] ? 1:0) && ".
                              "($dt ? 1:0) < ($ct\->[1] ? 1:0)");
          } else {
              # simplify code
              $c->add_ccl($cd, "($dt ? 1:0) > ($cv->[0] ? 1:0) && ".
                              "($dt ? 1:0) < ($cv->[1] ? 1:0)");
          }
      }
  }
  
  sub clause_is_true {
      my ($self, $cd) = @_;
      my $c  = $self->compiler;
      my $ct = $cd->{cl_term};
      my $dt = $cd->{data_term};
  
      $c->add_ccl($cd, "($ct) ? $dt : !defined($ct) ? 1 : !$dt");
  }
  
  1;
  # ABSTRACT: perl's type handler for type "bool"
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Compiler::perl::TH::bool - perl's type handler for type "bool"
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Compiler::perl::TH::bool (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(clause_.+|superclause_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COMPILER_PERL_TH_BOOL

    $main::fatpacked{"Data/Sah/Compiler/perl/TH/buf.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COMPILER_PERL_TH_BUF';
  package Data::Sah::Compiler::perl::TH::buf;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  #use Log::Any '$log';
  
  use Mo qw(build default);
  use Role::Tiny::With;
  
  extends 'Data::Sah::Compiler::perl::TH::str';
  with 'Data::Sah::Type::buf';
  
  1;
  # ABSTRACT: perl's type handler for type "buf"
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Compiler::perl::TH::buf - perl's type handler for type "buf"
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Compiler::perl::TH::buf (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(clause_.+|superclause_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COMPILER_PERL_TH_BUF

    $main::fatpacked{"Data/Sah/Compiler/perl/TH/cistr.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COMPILER_PERL_TH_CISTR';
  package Data::Sah::Compiler::perl::TH::cistr;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  #use Log::Any '$log';
  
  use Mo qw(build default);
  use Role::Tiny::With;
  
  extends 'Data::Sah::Compiler::perl::TH::str';
  with 'Data::Sah::Type::cistr';
  
  sub before_all_clauses {
      my ($self, $cd) = @_;
      my $c = $self->compiler;
      my $dt = $cd->{data_term};
  
      # XXX only do this when there are clauses
  
      # convert to lowercase so we don't lc() the data repeatedly
      $self->set_tmp_data_term($cd, "lc($dt)");
  }
  
  sub after_all_clauses {
      my ($self, $cd) = @_;
      my $c = $self->compiler;
      my $dt = $cd->{data_term};
  
      $self->restore_data_term($cd);
  }
  
  sub superclause_comparable {
      my ($self, $which, $cd) = @_;
      my $c  = $self->compiler;
      my $ct = $cd->{cl_term};
      my $dt = $cd->{data_term};
  
      if ($which eq 'is') {
          $c->add_ccl($cd, "$dt eq lc($ct)");
      } elsif ($which eq 'in') {
          if ($dt =~ /\$_\b/) {
              $c->add_ccl($cd, "do { my \$_sahv_dt = $dt; grep { lc(\$_) eq \$_sahv_dt } \@{ $ct } }");
          } else {
              $c->add_ccl($cd, "grep { lc(\$_) eq $dt } \@{ $ct }");
          }
      }
  }
  
  sub superclause_sortable {
      my ($self, $which, $cd) = @_;
      my $c  = $self->compiler;
      my $cv = $cd->{cl_value};
      my $ct = $cd->{cl_term};
      my $dt = $cd->{data_term};
  
      if ($which eq 'min') {
          $c->add_ccl($cd, "$dt ge lc($ct)");
      } elsif ($which eq 'xmin') {
          $c->add_ccl($cd, "$dt gt lc($ct)");
      } elsif ($which eq 'max') {
          $c->add_ccl($cd, "$dt le lc($ct)");
      } elsif ($which eq 'xmax') {
          $c->add_ccl($cd, "$dt lt lc($ct)");
      } elsif ($which eq 'between') {
          if ($cd->{cl_is_expr}) {
              $c->add_ccl($cd, "$dt ge lc($ct\->[0]) && ".
                              "$dt le lc($ct\->[1])");
          } else {
              # simplify code
              $c->add_ccl($cd, "$dt ge ".$c->literal(lc $cv->[0]).
                              " && $dt le ".$c->literal(lc $cv->[1]));
          }
      } elsif ($which eq 'xbetween') {
          if ($cd->{cl_is_expr}) {
              $c->add_ccl($cd, "$dt gt lc($ct\->[0]) && ".
                              "$dt lt lc($ct\->[1])");
          } else {
              # simplify code
              $c->add_ccl($cd, "$dt gt ".$c->literal(lc $cv->[0]).
                              " && $dt lt ".$c->literal(lc $cv->[1]));
          }
      }
  }
  
  sub superclause_has_elems {
      my ($self_th, $which, $cd) = @_;
      my $c  = $self_th->compiler;
      my $cv = $cd->{cl_value};
      my $ct = $cd->{cl_term};
      my $dt = $cd->{data_term};
  
      if ($which eq 'has') {
          $c->add_ccl($cd, "index($dt, lc($ct)) > -1");
      } else {
          $self_th->SUPER::superclause_has_elems($which, $cd);
      }
  }
  
  # turn "(?-xism:blah)" to "(?i-xsm:blah)"
  sub __change_re_str_switch {
      my $re = shift;
  
      if ($^V ge v5.14.0) {
          state $sub = sub { my $s = shift; $s =~ /i/ ? $s : "i$s" };
          $re =~ s/\A\(\?\^(\w*):/"(?".$sub->($1).":"/e;
      } else {
          state $subl = sub { my $s = shift; $s =~ /i/ ? $s : "i$s" };
          state $subr = sub { my $s = shift; $s =~ s/i//; $s };
          $re =~ s/\A\(\?(\w*)-(\w*):/"(?".$subl->($1)."-".$subr->($2).":"/e;
      }
      return $re;
  }
  
  sub clause_match {
      my ($self, $cd) = @_;
      my $c  = $self->compiler;
      my $cv = $cd->{cl_value};
      my $ct = $cd->{cl_term};
      my $dt = $cd->{data_term};
  
      if ($cd->{cl_is_expr}) {
          $c->add_ccl($cd, join(
              "",
              "ref($ct) eq 'Regexp' ? $dt =~ qr/$ct/i : ",
              "do { my \$_sahv_re = $ct; eval { \$_sahv_re = /\$_sahv_re/i; 1 } && ",
              "$dt =~ \$_sahv_re }",
          ));
      } else {
          # simplify code and we can check regex at compile time
          my $re = $c->_str2reliteral($cd, $cv);
          $re = __change_re_str_switch($re);
          $c->add_ccl($cd, "$dt =~ /$re/i");
      }
  }
  
  1;
  # ABSTRACT: perl's type handler for type "cistr"
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Compiler::perl::TH::cistr - perl's type handler for type "cistr"
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Compiler::perl::TH::cistr (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(clause_.+|superclause_.+|handle_.+|before_.+|after_.+)$
  
  =head1 NOTES
  
  Should probably be reimplemented using special Perl string type, or special Perl
  operators, instead of simulated using C<lc()> on a per-clause basis. The
  implementation as it is now is not "contagious", e.g. C<< [cistr =>
  check_each_elem => '$_ eq "A"'] >> should be true even if data is C<"Aaa">,
  since one would expect C<< $_ eq "A" >> is also done case-insensitively, but it
  is currently internally implemented by converting data to lowercase and
  splitting per character to become C<< ["a", "a", "a"] >>.
  
  Or, avoid C<cistr> altogether and use C<prefilters> to convert to
  lowercase/uppercase first before processing.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COMPILER_PERL_TH_CISTR

    $main::fatpacked{"Data/Sah/Compiler/perl/TH/code.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COMPILER_PERL_TH_CODE';
  package Data::Sah::Compiler::perl::TH::code;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  #use Log::Any '$log';
  
  use Mo qw(build default);
  use Role::Tiny::With;
  
  extends 'Data::Sah::Compiler::perl::TH';
  with 'Data::Sah::Type::code';
  
  sub handle_type {
      my ($self, $cd) = @_;
      my $c = $self->compiler;
  
      my $dt = $cd->{data_term};
      $cd->{_ccl_check_type} = "ref($dt) eq 'CODE'";
  }
  
  1;
  # ABSTRACT: perl's type handler for type "code"
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Compiler::perl::TH::code - perl's type handler for type "code"
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Compiler::perl::TH::code (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(clause_.+|superclause_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COMPILER_PERL_TH_CODE

    $main::fatpacked{"Data/Sah/Compiler/perl/TH/date.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COMPILER_PERL_TH_DATE';
  package Data::Sah::Compiler::perl::TH::date;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  #use Log::Any '$log';
  
  use Mo qw(build default);
  use Role::Tiny::With;
  use Scalar::Util qw(blessed looks_like_number);
  
  extends 'Data::Sah::Compiler::perl::TH';
  with 'Data::Sah::Type::date';
  
  sub handle_type {
      my ($self, $cd) = @_;
      my $c  = $self->compiler;
      my $dt = $cd->{data_term};
  
      $cd->{coerce_to} = $cd->{nschema}[1]{"x.perl.coerce_to"} // 'float(epoch)';
  
      my $coerce_to = $cd->{coerce_to};
  
      if ($coerce_to eq 'float(epoch)') {
          $cd->{_ccl_check_type} = "!ref($dt) && $dt =~ /\\A[0-9]+\\z/";
      } elsif ($coerce_to eq 'DateTime') {
          $c->add_runtime_module($cd, 'Scalar::Util');
          $cd->{_ccl_check_type} = "Scalar::Util::blessed($dt) && $dt\->isa('DateTime')";
      } elsif ($coerce_to eq 'Time::Moment') {
          $c->add_runtime_module($cd, 'Scalar::Util');
          $cd->{_ccl_check_type} = "Scalar::Util::blessed($dt) && $dt\->isa('Time::Moment')";
      } else {
          die "BUG: Unknown coerce_to value '$coerce_to', use either ".
              "float(epoch), DateTime, or Time::Moment";
      }
  }
  
  sub superclause_comparable {
      my ($self, $which, $cd) = @_;
      my $c  = $self->compiler;
      my $cv = $cd->{cl_value};
      my $ct = $cd->{cl_term};
      my $dt = $cd->{data_term};
  
      if ($cd->{cl_is_expr}) {
          # i'm lazy, technical debt
          $c->_die($cd, "date's comparison with expression not yet supported");
      }
  
      my $coerce_to = $cd->{coerce_to};
      if ($coerce_to eq 'float(epoch)') {
          if ($which eq 'is') {
              $c->add_ccl($cd, "$dt == $ct");
          } elsif ($which eq 'in') {
              $c->add_runtime_module($cd, 'List::Util');
              $c->add_ccl($cd, "List::Util::first(sub{$dt == \$_}, $ct)");
          }
      } elsif ($coerce_to eq 'DateTime') {
          # we need to encode this because otherwise just dumping DateTime object
          # $cv will be unwieldy
          my $ect = "DateTime->from_epoch(epoch=>".$cv->epoch.")";
  
          if ($which eq 'is') {
              $c->add_ccl($cd, "DateTime->compare($dt, $ect)==0");
          } elsif ($which eq 'in') {
              $c->add_runtime_module($cd, 'List::Util');
              $c->add_ccl($cd, "List::Util::first(sub{DateTime->compare($dt, \$_)==0}, $ect)");
          }
      } elsif ($coerce_to eq 'Time::Moment') {
          # we need to encode this because otherwise just dumping DateTime object
          # $cv will be unwieldy
          my $ect = "Time::Moment->from_epoch(".$cv->epoch.")";
  
          if ($which eq 'is') {
              $c->add_ccl($cd, "$dt\->compare($ect)==0");
          } elsif ($which eq 'in') {
              $c->add_runtime_module($cd, 'List::Util');
              $c->add_ccl($cd, "List::Util::first(sub{$dt\->compare(\$_)==0}, $ect)");
          }
      }
  }
  
  sub superclause_sortable {
      my ($self, $which, $cd) = @_;
      my $c  = $self->compiler;
      my $cv = $cd->{cl_value};
      my $ct = $cd->{cl_term};
      my $dt = $cd->{data_term};
  
      if ($cd->{cl_is_expr}) {
          # i'm lazy, technical debt
          $c->_die($cd, "date's comparison with expression not yet supported");
      }
  
      my $coerce_to = $cd->{coerce_to};
      if ($coerce_to eq 'float(epoch)') {
          if ($which eq 'min') {
              $c->add_ccl($cd, "$dt >= $cv");
          } elsif ($which eq 'xmin') {
              $c->add_ccl($cd, "$dt > $cv");
          } elsif ($which eq 'max') {
              $c->add_ccl($cd, "$dt <= $cv");
          } elsif ($which eq 'xmax') {
              $c->add_ccl($cd, "$dt < $cv");
          } elsif ($which eq 'between') {
              $c->add_ccl($cd, "$dt >= $cv->[0] && $dt <= $cv->[1]");
          } elsif ($which eq 'xbetween') {
              $c->add_ccl($cd, "$dt >  $cv->[0] && $dt <  $cv->[1]");
          }
      } elsif ($coerce_to eq 'DateTime') {
          # we need to encode this because otherwise just dumping DateTime object
          # $cv will be unwieldy
          my ($ect, $ect0, $ect1);
          if (ref($cv) eq 'ARRAY') {
              $ect0 = "DateTime->from_epoch(epoch=>".$cv->[0]->epoch.")";
              $ect1 = "DateTime->from_epoch(epoch=>".$cv->[1]->epoch.")";
          } else {
              $ect = "DateTime->from_epoch(epoch=>".$cv->epoch.")";
          }
  
          if ($which eq 'min') {
              $c->add_ccl($cd, "DateTime->compare($dt, $ect) >= 0");
          } elsif ($which eq 'xmin') {
              $c->add_ccl($cd, "DateTime->compare($dt, $ect) > 0");
          } elsif ($which eq 'max') {
              $c->add_ccl($cd, "DateTime->compare($dt, $ect) <= 0");
          } elsif ($which eq 'xmax') {
              $c->add_ccl($cd, "DateTime->compare($dt, $ect) < 0");
          } elsif ($which eq 'between') {
              $c->add_ccl($cd, "DateTime->compare($dt, $ect0) >= 0 && DateTime->compare($dt, $ect1) <= 0");
          } elsif ($which eq 'xbetween') {
              $c->add_ccl($cd, "DateTime->compare($dt, $ect0) >  0 && DateTime->compare($dt, $ect1) <  0");
          }
      } elsif ($coerce_to eq 'Time::Moment') {
          # we need to encode this because otherwise just dumping DateTime object
          # $cv will be unwieldy
          my ($ect, $ect0, $ect1);
          if (ref($cv) eq 'ARRAY') {
              $ect0 = "Time::Moment->from_epoch(".$cv->[0]->epoch.")";
              $ect1 = "Time::Moment->from_epoch(".$cv->[1]->epoch.")";
          } else {
              $ect = "Time::Moment->from_epoch(".$cv->epoch.")";
          }
  
          if ($which eq 'min') {
              $c->add_ccl($cd, "$dt\->compare($ect) >= 0");
          } elsif ($which eq 'xmin') {
              $c->add_ccl($cd, "$dt\->compare($ect) > 0");
          } elsif ($which eq 'max') {
              $c->add_ccl($cd, "$dt\->compare($ect) <= 0");
          } elsif ($which eq 'xmax') {
              $c->add_ccl($cd, "$dt\->compare($ect) < 0");
          } elsif ($which eq 'between') {
              $c->add_ccl($cd, "$dt\->compare($ect0) >= 0 && $dt\->compare($ect1) <= 0");
          } elsif ($which eq 'xbetween') {
              $c->add_ccl($cd, "$dt\->compare($ect0) >  0 && $dt\->compare($ect1) <  0");
          }
      }
  }
  
  1;
  # ABSTRACT: perl's type handler for type "date"
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Compiler::perl::TH::date - perl's type handler for type "date"
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Compiler::perl::TH::date (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =head1 DESCRIPTION
  
  The C<date> type can be represented using one of three choices: int (epoch),
  L<DateTime> object, or L<Time::Moment> object. This choice can be specified in
  the schema using clause attribute C<x.perl.coerce_to>, e.g.:
  
   ["date", "x.perl.coerce_to"=>"float(epoch)"]
   ["date", "x.perl.coerce_to"=>"DateTime"]
   ["date", "x.perl.coerce_to"=>"Time::Moment"]
  
  =for Pod::Coverage ^(clause_.+|superclause_.+|handle_.+|before_.+|after_.+)$
  
  =head1 COMPILATION DATA KEYS
  
  =over
  
  =item * B<coerce_to> => str
  
  By default will be set to C<float(epoch)>. Other valid values include:
  C<DateTime>, C<Time::Moment>.
  
  =back
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COMPILER_PERL_TH_DATE

    $main::fatpacked{"Data/Sah/Compiler/perl/TH/datenotime.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COMPILER_PERL_TH_DATENOTIME';
  package Data::Sah::Compiler::perl::TH::datenotime;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  #use Log::Any '$log';
  
  use Mo qw(build default);
  use Role::Tiny::With;
  
  extends 'Data::Sah::Compiler::perl::TH::date';
  with 'Data::Sah::Type::datenotime';
  
  1;
  # ABSTRACT: perl's type handler for type "datenotime"
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Compiler::perl::TH::datenotime - perl's type handler for type "datenotime"
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Compiler::perl::TH::datenotime (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(clause_.+|superclause_.+|handle_.+|before_.+|after_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COMPILER_PERL_TH_DATENOTIME

    $main::fatpacked{"Data/Sah/Compiler/perl/TH/datetime.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COMPILER_PERL_TH_DATETIME';
  package Data::Sah::Compiler::perl::TH::datetime;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  #use Log::Any '$log';
  
  use Mo qw(build default);
  use Role::Tiny::With;
  
  extends 'Data::Sah::Compiler::perl::TH::date';
  with 'Data::Sah::Type::datetime';
  
  1;
  # ABSTRACT: perl's type handler for type "datetime"
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Compiler::perl::TH::datetime - perl's type handler for type "datetime"
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Compiler::perl::TH::datetime (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(clause_.+|superclause_.+|handle_.+|before_.+|after_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COMPILER_PERL_TH_DATETIME

    $main::fatpacked{"Data/Sah/Compiler/perl/TH/duration.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COMPILER_PERL_TH_DURATION';
  package Data::Sah::Compiler::perl::TH::duration;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  #use Log::Any '$log';
  
  use Mo qw(build default);
  use Role::Tiny::With;
  use Scalar::Util qw(blessed looks_like_number);
  
  extends 'Data::Sah::Compiler::perl::TH';
  with 'Data::Sah::Type::duration';
  
  sub handle_type {
      my ($self, $cd) = @_;
      my $c  = $self->compiler;
      my $dt = $cd->{data_term};
  
      $cd->{coerce_to} = $cd->{nschema}[1]{"x.perl.coerce_to"} // 'float(secs)';
  
      my $coerce_to = $cd->{coerce_to};
  
      if ($coerce_to eq 'float(secs)') {
          $cd->{_ccl_check_type} = "!ref($dt) && $dt =~ /\\A[0-9]+(?:\.[0-9]+)?\\z/"; # XXX no support exp notation for yet?
      } elsif ($coerce_to eq 'DateTime::Duration') {
          $c->add_runtime_module($cd, 'Scalar::Util');
          $cd->{_ccl_check_type} = "Scalar::Util::blessed($dt) && $dt\->isa('DateTime::Duration')";
      } else {
          die "BUG: Unknown coerce_to value '$coerce_to', use either ".
              "float(secs) or DateTime::Duration";
      }
  }
  
  sub superclause_comparable {
      my ($self, $which, $cd) = @_;
      my $c  = $self->compiler;
      my $cv = $cd->{cl_value};
      my $ct = $cd->{cl_term};
      my $dt = $cd->{data_term};
  
      if ($cd->{cl_is_expr}) {
          # i'm lazy, technical debt
          $c->_die($cd, "duration's comparison with expression not yet supported");
      }
  
      my $coerce_to = $cd->{coerce_to};
      if ($coerce_to eq 'float(secs)') {
          if ($which eq 'is') {
              $c->add_ccl($cd, "$dt == $ct"); # XXX yeah we're not supposed to use == with floats
          } elsif ($which eq 'in') {
              $c->add_runtime_module('List::Util');
              $c->add_ccl($cd, "List::Util::first(sub{$dt == \$_}, $ct)"); # XXX yeah we're not supposed to use == with floats
          }
      } elsif ($coerce_to eq 'DateTime::Duration') {
          # we need to express this like this because if we just use the raw $cv
          # (dump) it will be unwieldy
          my $ect = join(
              "",
              "DateTime::Duration->new(",
              "years => "  .$cv->years.",",
              "months => " .$cv->months.",",
              "weeks => "  .$cv->weeks.",",
              "days => "   .$cv->days.",",
              "hours => "  .$cv->hours.",",
              "minutes => ".$cv->minutes.",",
              "seconds => ".$cv->seconds.",",
              ")",
          );
  
          if ($which eq 'is') {
              $c->add_ccl($cd, "DateTime::Duration->compare($dt, $ect)==0");
          } elsif ($which eq 'in') {
              $c->add_runtime_module('List::Util');
              $c->add_ccl($cd, "List::Util::first(sub{DateTime::Duration->compare($dt, \$_)==0}, $ect)");
          }
      }
  }
  
  sub superclause_sortable {
      my ($self, $which, $cd) = @_;
      my $c  = $self->compiler;
      my $cv = $cd->{cl_value};
      my $ct = $cd->{cl_term};
      my $dt = $cd->{data_term};
  
      if ($cd->{cl_is_expr}) {
          # i'm lazy, technical debt
          $c->_die($cd, "duration's comparison with expression not yet supported");
      }
  
      my $coerce_to = $cd->{coerce_to};
      if ($coerce_to eq 'float(secs)') {
          if ($which eq 'min') {
              $c->add_ccl($cd, "$dt >= $cv");
          } elsif ($which eq 'xmin') {
              $c->add_ccl($cd, "$dt > $cv");
          } elsif ($which eq 'max') {
              $c->add_ccl($cd, "$dt <= $cv");
          } elsif ($which eq 'xmax') {
              $c->add_ccl($cd, "$dt < $cv");
          } elsif ($which eq 'between') {
              $c->add_ccl($cd, "$dt >= $cv->[0] && $dt <= $cv->[1]");
          } elsif ($which eq 'xbetween') {
              $c->add_ccl($cd, "$dt >  $cv->[0] && $dt <  $cv->[1]");
          }
      } elsif ($coerce_to eq 'DateTime::Duration') {
          # we need to express this like this because if we just use the raw $cv
          # (dump) it will be unwieldy
          my ($ect, $ect0, $ect1);
          if (ref($cv) eq 'ARRAY') {
              $ect0 = join(
                  "",
                  "DateTime::Duration->new(",
                  "years => "  .$cv->[0]->years.",",
                  "months => " .$cv->[0]->months.",",
                  "weeks => "  .$cv->[0]->weeks.",",
                  "days => "   .$cv->[0]->days.",",
                  "hours => "  .$cv->[0]->hours.",",
                  "minutes => ".$cv->[0]->minutes.",",
                  "seconds => ".$cv->[0]->seconds.",",
                  ")",
              );
              $ect1 = join(
                  "",
                  "DateTime::Duration->new(",
                  "years => "  .$cv->[1]->years.",",
                  "months => " .$cv->[1]->months.",",
                  "weeks => "  .$cv->[1]->weeks.",",
                  "days => "   .$cv->[1]->days.",",
                  "hours => "  .$cv->[1]->hours.",",
                  "minutes => ".$cv->[1]->minutes.",",
                  "seconds => ".$cv->[1]->seconds.",",
                  ")",
              );
          } else {
              $ect = join(
                  "",
                  "DateTime::Duration->new(",
                  "years => "  .$cv->years.",",
                  "months => " .$cv->months.",",
                  "weeks => "  .$cv->weeks.",",
                  "days => "   .$cv->days.",",
                  "hours => "  .$cv->hours.",",
                  "minutes => ".$cv->minutes.",",
                  "seconds => ".$cv->seconds.",",
                  ")",
              );
          }
  
          if ($which eq 'min') {
              $c->add_ccl($cd, "DateTime->compare($dt, $ect) >= 0");
          } elsif ($which eq 'xmin') {
              $c->add_ccl($cd, "DateTime->compare($dt, $ect) > 0");
          } elsif ($which eq 'max') {
              $c->add_ccl($cd, "DateTime->compare($dt, $ect) <= 0");
          } elsif ($which eq 'xmax') {
              $c->add_ccl($cd, "DateTime->compare($dt, $ect) < 0");
          } elsif ($which eq 'between') {
              $c->add_ccl($cd, "DateTime->compare($dt, $ect0) >= 0 && DateTime->compare($dt, $ect1) <= 0");
          } elsif ($which eq 'xbetween') {
              $c->add_ccl($cd, "DateTime->compare($dt, $ect0) >  0 && DateTime->compare($dt, $ect1) <  0");
          }
      }
  }
  
  1;
  # ABSTRACT: perl's type handler for type "duration"
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Compiler::perl::TH::duration - perl's type handler for type "duration"
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Compiler::perl::TH::duration (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =head1 DESCRIPTION
  
  The C<duration> type in perl can be represented one of two choices: float
  (secs), or L<DateTime::Duration> object.
  
  =for Pod::Coverage ^(clause_.+|superclause_.+|handle_.+|before_.+|after_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COMPILER_PERL_TH_DURATION

    $main::fatpacked{"Data/Sah/Compiler/perl/TH/float.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COMPILER_PERL_TH_FLOAT';
  package Data::Sah::Compiler::perl::TH::float;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  #use Log::Any '$log';
  
  use Mo qw(build default);
  use Role::Tiny::With;
  
  extends 'Data::Sah::Compiler::perl::TH::num';
  with 'Data::Sah::Type::float';
  
  sub handle_type {
      my ($self, $cd) = @_;
      my $c = $self->compiler;
  
      my $dt = $cd->{data_term};
      if ($cd->{args}{core} || $cd->{args}{no_modules}) {
          $cd->{_ccl_check_type} = "$dt =~ ".'/\A(?:[+-]?(?:0|[1-9][0-9]*)(\.[0-9]+)?([eE][+-]?[0-9]+)?|((?i)\s*nan\s*)|((?i)\s*[+-]?inf(inity)?)\s*)\z/';
      } else {
          $c->add_sun_module($cd);
          # we use isnum = isint + isfloat, because isfloat(3) is false
          $cd->{_ccl_check_type} = "$cd->{_sun_module}::isnum($dt)";
      }
  }
  
  sub clause_is_nan {
      my ($self, $cd) = @_;
      my $c  = $self->compiler;
      my $ct = $cd->{cl_term};
      my $dt = $cd->{data_term};
  
      if ($cd->{cl_is_expr}) {
          if ($cd->{args}{core} || $cd->{args}{no_modules}) {
              $c->add_ccl(
                  $cd,
                  qq[$ct ? lc($dt+0) eq "nan" : defined($ct) ? lc($dt+0) ne "nan" : 1],
              );
          } else {
              $c->add_ccl(
                  $cd,
                  join(
                      "",
                      "$ct ? $cd->{_sun_module}::isnan($dt) : ",
                      "defined($ct) ? !$cd->{_sun_module}::isnan($dt) : 1",
                  )
              );
          }
      } else {
          if ($cd->{cl_value}) {
              if ($cd->{args}{core} || $cd->{args}{no_modules}) {
                  $c->add_ccl($cd, qq[lc($dt+0) eq "nan"]);
              } else {
                  $c->add_ccl($cd, "$cd->{_sun_module}::isnan($dt)");
              }
          } elsif (defined $cd->{cl_value}) {
              if ($cd->{args}{core} || $cd->{args}{no_modules}) {
                  $c->add_ccl($cd, qq[lc($dt+0) ne "nan"]);
              } else {
                  $c->add_ccl($cd, "!$cd->{_sun_module}::isnan($dt)");
              }
          }
      }
  }
  
  sub clause_is_neg_inf {
      my ($self, $cd) = @_;
      my $c  = $self->compiler;
      my $ct = $cd->{cl_term};
      my $dt = $cd->{data_term};
  
      if ($cd->{cl_is_expr}) {
          if ($cd->{args}{core} || $cd->{args}{no_modules}) {
              $c->add_ccl(
                  $cd, join(
                      '',
                      qq[$ct ? $dt =~ /\\A\\s*-inf(inity)?\\s*\\z/i : ],
                      qq[defined($ct) ? $dt !~ /\\A\\s*inf(inity)?\\s*\\z/i : 1]
                  ));
          } else {
              $c->add_ccl(
                  $cd, join(
                      '',
                      "$ct ? $cd->{_sun_module}::isinf($dt) && $cd->{_sun_module}::isneg($dt) : ",
                      "defined($ct) ? !($cd->{_sun_module}::isinf($dt) && $cd->{_sun_module}::isneg($dt)) : 1",
                  ));
          }
      } else {
          if ($cd->{cl_value}) {
              if ($cd->{args}{core} || $cd->{args}{no_modules}) {
                  $c->add_ccl($cd, qq[$dt =~ /\\A\\s*-inf(inity)?\\s*\\z/i]);
              } else {
                  $c->add_ccl($cd, "$cd->{_sun_module}::isinf($dt) && $cd->{_sun_module}::isneg($dt)");
              }
          } elsif (defined $cd->{cl_value}) {
              if ($cd->{args}{core} || $cd->{args}{no_modules}) {
                  $c->add_ccl($cd, qq[$dt !~ /\\A\\s*-inf(inity)?\\s*\\z/i]);
              } else {
                  $c->add_ccl($cd, "!($cd->{_sun_module}::isinf($dt) && $cd->{_sun_module}::isneg($dt))");
              }
          }
      }
  }
  
  sub clause_is_pos_inf {
      my ($self, $cd) = @_;
      my $c  = $self->compiler;
      my $ct = $cd->{cl_term};
      my $dt = $cd->{data_term};
  
      if ($cd->{cl_is_expr}) {
          if ($cd->{args}{core} || $cd->{args}{no_modules}) {
              $c->add_ccl(
                  $cd, join(
                      '',
                      qq[$ct ? $dt =~ /\\A\\s*inf(inity)?\\s*\\z/i : ],
                      qq[defined($ct) ? $dt !~ /\\A\\s*inf(inity)?\\s*\\z/i : 1]
                  ));
          } else {
              $c->add_ccl(
                  $cd, join(
                      '',
                      "$ct ? $cd->{_sun_module}::isinf($dt) && !$cd->{_sun_module}::isneg($dt) : ",
                      "defined($ct) ? !($cd->{_sun_module}::isinf($dt) && !$cd->{_sun_module}::isneg($dt)) : 1",
                  ));
          }
      } else {
          if ($cd->{cl_value}) {
              if ($cd->{args}{core} || $cd->{args}{no_modules}) {
                  $c->add_ccl($cd, qq[$dt =~ /\\A\\s*inf(inity)?\\s*\\z/i]);
              } else {
                  $c->add_ccl($cd, "$cd->{_sun_module}::isinf($dt) && !$cd->{_sun_module}::isneg($dt)");
              }
          } elsif (defined $cd->{cl_value}) {
              if ($cd->{args}{core} || $cd->{args}{no_modules}) {
                  $c->add_ccl($cd, qq[$dt !~ /\\A\\s*inf(inity)?\\s*\\z/i]);
              } else {
                  $c->add_ccl($cd, "!($cd->{_sun_module}::isinf($dt) && !$cd->{_sun_module}::isneg($dt))");
              }
          }
      }
  }
  
  sub clause_is_inf {
      my ($self, $cd) = @_;
      my $c  = $self->compiler;
      my $ct = $cd->{cl_term};
      my $dt = $cd->{data_term};
  
      if ($cd->{cl_is_expr}) {
          if ($cd->{args}{core} || $cd->{args}{no_modules}) {
              $c->add_ccl(
                  $cd, join(
                      '',
                      qq[$ct ? $dt =~ /\\A\\s*-?inf(inity)?\\s*\\z/i : ],
                      qq[defined($ct) ? $dt+0 !~ /\\A-?inf\\z/ : 1]
                  ));
          } else {
              $c->add_ccl($cd, "$ct ? $cd->{_sun_module}::isinf($dt) : ".
                              "defined($ct) ? $cd->{_sun_module}::isinf($dt) : 1");
          }
      } else {
          if ($cd->{cl_value}) {
              if ($cd->{args}{core} || $cd->{args}{no_modules}) {
                  $c->add_ccl($cd, qq[$dt =~ /\\A\\s*-?inf(inity)?\\s*\\z/i]);
              } else {
                  $c->add_ccl($cd, "$cd->{_sun_module}::isinf($dt)");
              }
          } elsif (defined $cd->{cl_value}) {
              if ($cd->{args}{core} || $cd->{args}{no_modules}) {
                  $c->add_ccl($cd, qq[$dt !~ /\\A\\s*-?inf(inity)?\\s*\\z/i]);
              } else {
                  $c->add_ccl($cd, "!$cd->{_sun_module}::isinf($dt)");
              }
          }
      }
  }
  
  1;
  # ABSTRACT: perl's type handler for type "float"
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Compiler::perl::TH::float - perl's type handler for type "float"
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Compiler::perl::TH::float (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(compiler|clause_.+|handle_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COMPILER_PERL_TH_FLOAT

    $main::fatpacked{"Data/Sah/Compiler/perl/TH/hash.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COMPILER_PERL_TH_HASH';
  package Data::Sah::Compiler::perl::TH::hash;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  #use Log::Any '$log';
  
  use Data::Dmp;
  
  use Mo qw(build default);
  use Role::Tiny::With;
  
  extends 'Data::Sah::Compiler::perl::TH';
  with 'Data::Sah::Type::hash';
  
  sub handle_type {
      my ($self, $cd) = @_;
      my $c = $self->compiler;
  
      my $dt = $cd->{data_term};
      $cd->{_ccl_check_type} = "ref($dt) eq 'HASH'";
  }
  
  sub superclause_comparable {
      my ($self, $which, $cd) = @_;
      my $c  = $self->compiler;
      my $ct = $cd->{cl_term};
      my $dt = $cd->{data_term};
  
      $c->add_runtime_module($cd, $cd->{args}{dump_module});
  
      if ($which eq 'is') {
          $c->add_ccl($cd, $c->expr_dump($cd, $dt).' eq '.$c->expr_dump($cd, $ct));
      } elsif ($which eq 'in') {
          $c->add_ccl($cd, "do { my \$_sahv_dt_str = ".$c->expr_dump($cd, $dt)."; my \$_sahv_res = 0; " .
                          "for my \$_sahv_el (\@{ $ct }) { my \$_sahv_el_str = ".$c->expr_dump($cd, "\$_sahv_el")."; ".
                          "if (\$_sahv_dt_str eq \$_sahv_el_str) { \$_sahv_res = 1; last } } \$_sahv_res }");
      }
  }
  
  sub superclause_has_elems {
      my ($self_th, $which, $cd) = @_;
      my $c  = $self_th->compiler;
      my $cv = $cd->{cl_value};
      my $ct = $cd->{cl_term};
      my $dt = $cd->{data_term};
  
      if ($which eq 'len') {
          $c->add_ccl($cd, "keys(\%{$dt}) == $ct");
      } elsif ($which eq 'min_len') {
          $c->add_ccl($cd, "keys(\%{$dt}) >= $ct");
      } elsif ($which eq 'max_len') {
          $c->add_ccl($cd, "keys(\%{$dt}) <= $ct");
      } elsif ($which eq 'len_between') {
          if ($cd->{cl_is_expr}) {
              $c->add_ccl(
                  $cd, "keys(\%{$dt}) >= $ct\->[0] && ".
                      "keys(\%{$dt}) >= $ct\->[1]");
          } else {
              # simplify code
              $c->add_ccl(
                  $cd, "keys(\%{$dt}) >= $cv->[0] && ".
                      "keys(\%{$dt}) <= $cv->[1]");
          }
      } elsif ($which eq 'has') {
          $c->add_runtime_module($cd, $cd->{args}{dump_module});
          $c->add_ccl($cd, "do { my \$_sahv_ct_str = ".$c->expr_dump($cd, $ct)."; my \$_sahv_res = 0; " .
                          "for my \$_sahv_el (values \%{ $dt }) { my \$_sahv_el_str = ".$c->expr_dump($cd, "\$_sahv_el")."; ".
                          "if (\$_sahv_ct_str eq \$_sahv_el_str) { \$_sahv_res = 1; last } } \$_sahv_res }");
      } elsif ($which eq 'each_index') {
          $self_th->set_tmp_data_term($cd) if $cd->{args}{data_term_includes_topic_var};
          $self_th->gen_each($cd, "sort keys(\%{$cd->{data_term}})", '', '$_');
          $self_th->restore_data_term($cd) if $cd->{args}{data_term_includes_topic_var};
      } elsif ($which eq 'each_elem') {
          $self_th->set_tmp_data_term($cd) if $cd->{args}{data_term_includes_topic_var};
          $self_th->gen_each($cd, "sort keys(\%{$cd->{data_term}})", '_', "$cd->{data_term}\->{\$_}");
          $self_th->restore_data_term($cd) if $cd->{args}{data_term_includes_topic_var};
      } elsif ($which eq 'check_each_index') {
          $self_th->compiler->_die_unimplemented_clause($cd);
      } elsif ($which eq 'check_each_elem') {
          $self_th->compiler->_die_unimplemented_clause($cd);
      } elsif ($which eq 'uniq') {
          $self_th->compiler->_die_unimplemented_clause($cd);
      } elsif ($which eq 'exists') {
          $self_th->compiler->_die_unimplemented_clause($cd);
      }
  }
  
  sub _clause_keys_or_re_keys {
      my ($self_th, $which, $cd) = @_;
      my $c  = $self_th->compiler;
      my $cv = $cd->{cl_value};
      my $dt = $cd->{data_term};
  
      local $cd->{_subdata_level} = $cd->{_subdata_level} + 1;
  
      # we handle subdata manually here, because in generated code for
      # {keys,re_keys}.restrict, we haven't delved into the keys
  
      my $jccl;
      {
          local $cd->{ccls} = [];
  
          my $lit_valid_keys;
          if ($which eq 'keys') {
              $lit_valid_keys = $c->literal([sort keys %$cv]);
          } else {
              $lit_valid_keys = "[".
                  join(",", map { "qr/".$c->_str2reliteral($cd, $_)."/" }
                           sort keys %$cv)."]";
          }
  
          $self_th->set_tmp_data_term($cd) if $cd->{args}{data_term_includes_topic_var};
  
          if ($cd->{clset}{"$which.restrict"} // 1) {
              local $cd->{_debug_ccl_note} = "$which.restrict";
              #$c->add_runtime_module($cd, "List::Util");
              $c->add_ccl(
                  $cd,
                  #"!defined(List::Util::first(sub { my \$ditem=\$_; !defined(List::Util::first(sub {\$ditem ".($which eq 'keys' ? 'eq' : '=~')." \$_ }, \@{ $lit_valid_keys })) }, keys %{ $dt }))",
                  "!(grep { my \$_sahv_dt_item=\$_; !(grep { \$_sahv_dt_item ".($which eq 'keys' ? 'eq' : '=~')." \$_ } \@{ $lit_valid_keys }) } keys %{ $dt })",
                  {
                      err_msg => 'TMP',
                      err_expr => join(
                          "",
                          'sprintf(',
                          $c->literal($c->_xlt(
                              $cd, "hash contains ".
                                  "unknown field(s) (%s)")),
                          ',',
                          "join(', ', sort grep { my \$_sahv_dt_item=\$_; !(grep { \$_sahv_dt_item ".($which eq 'keys' ? 'eq':'=~')." \$_ } \@{ $lit_valid_keys })} keys %{ $dt })",
                          ')',
                      ),
                  },
              );
              $self_th->restore_data_term($cd) if $cd->{args}{data_term_includes_topic_var};
          }
          delete $cd->{uclset}{"$which.restrict"};
  
          my $cdef;
          if ($which eq 'keys') {
              $cdef = $cd->{clset}{"keys.create_default"} // 1;
              delete $cd->{uclset}{"keys.create_default"};
          }
  
          $self_th->set_tmp_data_term($cd) if $cd->{args}{data_term_includes_topic_var};
  
          my $nkeys = scalar(keys %$cv);
          my $i = 0;
          for my $k (sort keys %$cv) {
              my $kre = $c->_str2reliteral($cd, $k);
              local $cd->{spath} = [@{ $cd->{spath} }, $k];
              ++$i;
              my $sch = $c->main->normalize_schema($cv->{$k});
              my $kdn = $k; $kdn =~ s/\W+/_/g;
              my $klit = $which eq 're_keys' ? '$_' : $c->literal($k);
              my $kdt = "$dt\->{$klit}";
              my %iargs = %{$cd->{args}};
              $iargs{outer_cd}             = $cd;
              $iargs{data_name}            = $kdn;
              $iargs{data_term}            = $kdt;
              $iargs{schema}               = $sch;
              $iargs{schema_is_normalized} = 1;
              $iargs{indent_level}++;
              $iargs{data_term_includes_topic_var} = 1 if $which eq 're_keys';
              my $icd = $c->compile(%iargs);
  
              # should we set default for hash value?
              my $sdef = $cdef && defined($sch->[1]{default});
  
              # stack is used to store (non-bool) subresults
              $c->add_var($cd, '_sahv_stack', []) if $cd->{use_dpath};
  
              $c->add_runtime_module($cd, "List::Util") if $which eq 're_keys'; # for re_keys
  
              my @code = (
                  ($c->indent_str($cd), "(push(@\$_sahv_dpath, undef), push(\@\$_sahv_stack, undef), \$_sahv_stack->[-1] = \n")
                      x !!($cd->{use_dpath} && $i == 1),
  
                  # for re_keys, we iterate over all data's keys which match regex
                  ('(!defined(List::Util::first(sub {!(')
                      x !!($which eq 're_keys'),
  
                  $which eq 're_keys' ? "\$_ !~ /$kre/ || (" :
                      ($sdef ? "" : "!exists($kdt) || ("),
  
                  ($c->indent_str($cd), "(\$_sahv_dpath->[-1] = ".
                       ($which eq 're_keys' ? '$_' : $klit)."),\n")
                           x !!$cd->{use_dpath},
                  $icd->{result}, "\n",
  
                  $which eq 're_keys' || !$sdef ? ")" : "",
  
                  # close iteration over all data's keys which match regex
                  (")}, sort keys %{ $dt })))")
                      x !!($which eq 're_keys'),
  
                  ($c->indent_str($cd), "), pop(\@\$_sahv_dpath), pop(\@\$_sahv_stack)\n")
                      x !!($cd->{use_dpath} && $i == $nkeys),
              );
              my $ires = join("", @code);
              local $cd->{_debug_ccl_note} = "$which: ".$c->literal($k);
              $c->add_ccl($cd, $ires);
          }
  
          $self_th->restore_data_term($cd) if $cd->{args}{data_term_includes_topic_var};
  
          $jccl = $c->join_ccls(
              $cd, $cd->{ccls}, {err_msg => ''});
      }
      $c->add_ccl($cd, $jccl, {});
  }
  
  sub clause_keys {
      my ($self, $cd) = @_;
      $self->_clause_keys_or_re_keys('keys', $cd);
  }
  
  sub clause_re_keys {
      my ($self, $cd) = @_;
      $self->_clause_keys_or_re_keys('re_keys', $cd);
  }
  
  sub clause_req_keys {
      my ($self, $cd) = @_;
      my $c  = $self->compiler;
      my $ct = $cd->{cl_term};
      my $dt = $cd->{data_term};
  
      # we assign to $_sahv_h first to avoid variable clashing if $dt is '$_'.
  
      $c->add_runtime_module($cd, "List::Util");
      $c->add_ccl(
        $cd,
        "do { my \$_sahv_h = $dt; !defined(List::Util::first(sub {!exists(\$_sahv_h\->{\$_})}, \@{ $ct })) }",
        {
          err_msg => 'TMP',
          err_expr =>
            "sprintf(".
            $c->literal($c->_xlt($cd, "hash has missing required field(s) (%s)")).
            ",join(', ', do { my \$_sahv_h = $dt; grep { !exists(\$_sahv_h\->{\$_}) } \@{ $ct } }))"
        }
      );
  }
  
  sub clause_allowed_keys {
      my ($self, $cd) = @_;
      my $c  = $self->compiler;
      my $ct = $cd->{cl_term};
      my $dt = $cd->{data_term};
  
      #$c->add_runtime_module($cd, "List::Util");
      $c->add_ccl(
        $cd,
        #"!defined(List::Util::first(sub { my \$_sahv_dt_item=\$_; !defined(List::Util::first!(sub { \$_sahv_dt_item eq \$_ }, \@{ $ct })) }, keys \%{ $dt }))",
        "!(grep { my \$_sahv_dt_item=\$_; !(grep { \$_sahv_dt_item eq \$_ } \@{ $ct }) } keys \%{ $dt })",
        {
          err_msg => 'TMP',
          err_expr =>
            "sprintf(".
            $c->literal($c->_xlt($cd, "hash contains non-allowed field(s) (%s)")).
            ",join(', ', sort grep { my \$_sahv_dt_item=\$_; !(grep { \$_sahv_dt_item eq \$_ } \@{ $ct }) } keys \%{ $dt }))"
        }
      );
  }
  
  sub clause_allowed_keys_re {
      my ($self, $cd) = @_;
      my $c  = $self->compiler;
      #my $ct = $cd->{cl_term};
      my $cv = $cd->{cl_value};
      my $dt = $cd->{data_term};
  
      if ($cd->{cl_is_expr}) {
          # i'm lazy atm and does not need expr yet
          $c->_die_unimplemented_clause($cd, "with expr");
      }
  
      my $re = $c->_str2reliteral($cd, $cv);
      #$c->add_runtime_module($cd, "List::Util");
      $c->add_ccl(
          $cd,
          #"!defined(List::Util::first(sub {\$_ !~ /$re/}, keys \%{ $dt }))",
          "!(grep {\$_ !~ /$re/} keys \%{ $dt })",
          {
            err_msg => 'TMP',
            err_expr =>
            "sprintf(".
            $c->literal($c->_xlt($cd, "hash contains non-allowed field(s) (%s)")).
            ",join(', ', sort grep { \$_ !~ /$re/ } keys \%{ $dt }))"
        }
      );
  }
  
  sub clause_forbidden_keys {
      my ($self, $cd) = @_;
      my $c  = $self->compiler;
      my $ct = $cd->{cl_term};
      my $dt = $cd->{data_term};
  
      #$c->add_runtime_module($cd, "List::Util");
      $c->add_ccl(
        $cd,
        #"!defined(List::Util::first(sub {\$_ ~~ $ct}, keys \%{ $dt }))",
        "!(grep { my \$_sahv_dt_item=\$_; !!(grep { \$_sahv_dt_item eq \$_ } \@{ $ct }) } keys \%{ $dt })",
        {
          err_msg => 'TMP',
          err_expr =>
            "sprintf(".
            $c->literal($c->_xlt($cd, "hash contains forbidden field(s) (%s)")).
            ",join(', ', sort grep { my \$_sahv_dt_item=\$_; !(grep { \$_sahv_dt_item eq \$_ } \@{ $ct }) } keys \%{ $dt }))"
        }
      );
  }
  
  sub clause_forbidden_keys_re {
      my ($self, $cd) = @_;
      my $c  = $self->compiler;
      #my $ct = $cd->{cl_term};
      my $cv = $cd->{cl_value};
      my $dt = $cd->{data_term};
  
      if ($cd->{cl_is_expr}) {
          # i'm lazy atm and does not need expr yet
          $c->_die_unimplemented_clause($cd, "with expr");
      }
  
      my $re = $c->_str2reliteral($cd, $cv);
      #$c->add_runtime_module($cd, "List::Util");
      $c->add_ccl(
          $cd,
          #"!defined(List::Util::first(sub {\$_ =~ /$re/}, keys \%{ $dt }))",
          "!(grep {\$_ =~ /$re/} keys \%{ $dt })",
          {
            err_msg => 'TMP',
            err_expr =>
            "sprintf(".
            $c->literal($c->_xlt($cd, "hash contains forbidden field(s) (%s)")).
            ",join(', ', sort grep { \$_ =~ /$re/ } keys \%{ $dt }))"
        }
      );
  }
  
  sub clause_choose_one_key {
      my ($self, $cd) = @_;
      my $c  = $self->compiler;
      my $ct = $cd->{cl_term};
      my $dt = $cd->{data_term};
  
      # we assign to $_sahv_h first to avoid variable clashing if $dt is '$_'.
  
      $c->add_runtime_module($cd, "List::Util");
      $c->add_ccl(
        $cd,
        "do { my \$_sahv_h = $dt; List::Util::sum(map {exists(\$_sahv_h\->{\$_}) ? 1:0} \@{ $ct }) <= 1 }",
        {},
      );
  }
  
  sub clause_choose_all_keys {
      my ($self, $cd) = @_;
      my $c  = $self->compiler;
      my $ct = $cd->{cl_term};
      my $dt = $cd->{data_term};
  
      # we assign to $h first to avoid variable clashing if $dt is '$_'.
  
      $c->add_runtime_module($cd, "List::Util");
      $c->add_ccl(
        $cd,
        "do { my \$_sahv_h = $dt; my \$_sahv_keys = $ct; my \$_sahv_tot = List::Util::sum(map {exists(\$_sahv_h\->{\$_}) ? 1:0} \@\$_sahv_keys); \$_sahv_tot==0 || \$_sahv_tot==\@\$_sahv_keys }",
        {},
      );
  }
  
  sub clause_req_one_key {
      my ($self, $cd) = @_;
      my $c  = $self->compiler;
      my $ct = $cd->{cl_term};
      my $dt = $cd->{data_term};
  
      # we assign to $_sahv_h first to avoid variable clashing if $dt is '$_'.
  
      $c->add_runtime_module($cd, "List::Util");
      $c->add_ccl(
        $cd,
        "do { my \$_sahv_h = $dt; List::Util::sum(map {exists(\$_sahv_h\->{\$_}) ? 1:0} \@{ $ct }) == 1 }",
        {},
      );
  }
  
  sub clause_req_some_keys {
      my ($self, $cd) = @_;
      my $c  = $self->compiler;
      my $cv = $cd->{cl_value};
      my $dt = $cd->{data_term};
  
      # we assign to $_sahv_h first to avoid variable clashing if $dt is '$_'.
  
      $c->add_runtime_module($cd, "List::Util");
      $c->add_ccl(
        $cd,
        "do { my \$_sahv_h = $dt; my \$_sahv_n = List::Util::sum(map {exists(\$_sahv_h\->{\$_}) ? 1:0} \@{ ".$c->literal($cv->[2])." }); \$_sahv_n >= $cv->[0] && \$_sahv_n <= $cv->[1] }",
        {},
      );
  }
  
  sub clause_dep_any {
      my ($self, $cd) = @_;
      my $c  = $self->compiler;
      my $ct = $cd->{cl_term};
      my $dt = $cd->{data_term};
  
      # we assign to $_sahv_h first to avoid variable clashing if $dt is '$_'.
  
      $c->add_runtime_module($cd, "List::Util");
      $c->add_ccl(
        $cd,
        "do { my \$_sahv_h = $dt; my \$_sahv_ct = $ct; ".
            "my \$_sahv_has_prereq = List::Util::sum(map {exists(\$_sahv_h\->{\$_}) ? 1:0} \@{ \$_sahv_ct->[1] }) ? 1:0; ".
            "my \$_sahv_has_dep    = List::Util::sum(map {exists(\$_sahv_h\->{\$_}) ? 1:0} (ref(\$_sahv_ct->[0]) eq 'ARRAY' ? \@{ \$_sahv_ct->[0] } : (\$_sahv_ct->[0]))) ? 1:0; ".
            "!\$_sahv_has_dep || \$_sahv_has_prereq }",
        {},
      );
  }
  
  sub clause_dep_all {
      my ($self, $cd) = @_;
      my $c  = $self->compiler;
      my $ct = $cd->{cl_term};
      my $dt = $cd->{data_term};
  
      # we assign to $_sahv_h first to avoid variable clashing if $dt is '$_'.
  
      $c->add_runtime_module($cd, "List::Util");
      $c->add_ccl(
        $cd,
        "do { my \$_sahv_h = $dt; my \$_sahv_ct = $ct; ".
            "my \$_sahv_has_prereq = List::Util::sum(map {exists(\$_sahv_h\->{\$_}) ? 1:0} \@{ \$_sahv_ct->[1] }) == \@{ \$_sahv_ct->[1] } ? 1:0; ".
            "my \$_sahv_has_dep    = List::Util::sum(map {exists(\$_sahv_h\->{\$_}) ? 1:0} (ref(\$_sahv_ct->[0]) eq 'ARRAY' ? \@{ \$_sahv_ct->[0] } : (\$_sahv_ct->[0]))) ? 1:0; ".
            "!\$_sahv_has_dep || \$_sahv_has_prereq }",
        {},
      );
  }
  
  sub clause_req_dep_any {
      my ($self, $cd) = @_;
      my $c  = $self->compiler;
      my $ct = $cd->{cl_term};
      my $dt = $cd->{data_term};
  
      # we assign to $_sahv_h first to avoid variable clashing if $dt is '$_'.
  
      $c->add_runtime_module($cd, "List::Util");
      $c->add_ccl(
        $cd,
        "do { my \$_sahv_h = $dt; my \$_sahv_ct = $ct; ".
            "my \$_sahv_has_prereq = List::Util::sum(map {exists(\$_sahv_h\->{\$_}) ? 1:0} \@{ \$_sahv_ct->[1] }) ? 1:0; ".
            "my \$_sahv_has_dep    = List::Util::sum(map {exists(\$_sahv_h\->{\$_}) ? 1:0} (ref(\$_sahv_ct->[0]) eq 'ARRAY' ? \@{ \$_sahv_ct->[0] } : (\$_sahv_ct->[0]))) ? 1:0; ".
            "\$_sahv_has_dep || !\$_sahv_has_prereq }",
        {},
      );
  }
  
  sub clause_req_dep_all {
      my ($self, $cd) = @_;
      my $c  = $self->compiler;
      my $ct = $cd->{cl_term};
      my $dt = $cd->{data_term};
  
      # we assign to $_sahv_h first to avoid variable clashing if $dt is '$_'.
  
      $c->add_runtime_module($cd, "List::Util");
      $c->add_ccl(
        $cd,
        "do { my \$_sahv_h = $dt; my \$_sahv_ct = $ct; ".
            "my \$_sahv_has_prereq = List::Util::sum(map {exists(\$_sahv_h\->{\$_}) ? 1:0} \@{ \$_sahv_ct->[1] }) == \@{ \$_sahv_ct->[1] } ? 1:0; ".
            "my \$_sahv_has_dep    = List::Util::sum(map {exists(\$_sahv_h\->{\$_}) ? 1:0} (ref(\$_sahv_ct->[0]) eq 'ARRAY' ? \@{ \$_sahv_ct->[0] } : (\$_sahv_ct->[0]))) ? 1:0; ".
            "\$_sahv_has_dep || !\$_sahv_has_prereq }",
        {},
      );
  }
  
  1;
  # ABSTRACT: perl's type handler for type "hash"
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Compiler::perl::TH::hash - perl's type handler for type "hash"
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Compiler::perl::TH::hash (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(clause_.+|superclause_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COMPILER_PERL_TH_HASH

    $main::fatpacked{"Data/Sah/Compiler/perl/TH/int.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COMPILER_PERL_TH_INT';
  package Data::Sah::Compiler::perl::TH::int;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  #use Log::Any '$log';
  
  use Mo qw(build default);
  use Role::Tiny::With;
  
  extends 'Data::Sah::Compiler::perl::TH::num';
  with 'Data::Sah::Type::int';
  
  sub handle_type {
      my ($self, $cd) = @_;
      my $c = $self->compiler;
  
      my $dt = $cd->{data_term};
      if ($cd->{args}{core} || $cd->{args}{no_modules}) {
          $cd->{_ccl_check_type} = "$dt =~ ".'/\A[+-]?(?:0|[1-9][0-9]*)\z/';
      } else {
          $c->add_sun_module($cd);
          $cd->{_ccl_check_type} =
              "$cd->{_sun_module}::isint($dt)";
      }
  }
  
  sub clause_div_by {
      my ($self, $cd) = @_;
      my $c  = $self->compiler;
      my $ct = $cd->{cl_term};
      my $dt = $cd->{data_term};
  
      $c->add_ccl($cd, "$dt % $ct == 0");
  }
  
  sub clause_mod {
      my ($self, $cd) = @_;
      my $c  = $self->compiler;
      my $ct = $cd->{cl_term};
      my $dt = $cd->{data_term};
  
      $c->add_ccl($cd, "$dt % $ct\->[0] == $ct\->[1]");
  }
  
  1;
  # ABSTRACT: perl's type handler for type "int"
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Compiler::perl::TH::int - perl's type handler for type "int"
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Compiler::perl::TH::int (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(clause_.+|superclause_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COMPILER_PERL_TH_INT

    $main::fatpacked{"Data/Sah/Compiler/perl/TH/num.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COMPILER_PERL_TH_NUM';
  package Data::Sah::Compiler::perl::TH::num;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  #use Log::Any '$log';
  
  use Mo qw(build default);
  use Role::Tiny::With;
  
  extends 'Data::Sah::Compiler::perl::TH';
  with 'Data::Sah::Type::num';
  
  sub handle_type {
      my ($self, $cd) = @_;
      my $c = $self->compiler;
      my $dt = $cd->{data_term};
  
      if ($cd->{args}{core} || $cd->{args}{no_modules}) {
          $cd->{_ccl_check_type} = "$dt =~ ".'/\A(?:[+-]?(?:0|[1-9][0-9]*)(\.[0-9]+)?([eE][+-]?[0-9]+)?|((?i)\s*nan\s*)|((?i)\s*[+-]?inf(inity)?)\s*)\z/';
      } else {
          $c->add_sun_module($cd);
          $cd->{_ccl_check_type} = "$cd->{_sun_module}::isnum($dt)";
      }
  }
  
  sub superclause_comparable {
      my ($self, $which, $cd) = @_;
      my $c  = $self->compiler;
      my $ct = $cd->{cl_term};
      my $dt = $cd->{data_term};
  
      if ($which eq 'is') {
          $c->add_ccl($cd, "$dt == $ct");
      } elsif ($which eq 'in') {
          if ($dt =~ /\$_\b/) {
              $c->add_ccl($cd, "do { my \$_sahv_dt = $dt; grep { \$_ == \$_sahv_dt } \@{ $ct } }");
          } else {
              $c->add_ccl($cd, "grep { \$_ == $dt } \@{ $ct }");
          }
      }
  }
  
  sub superclause_sortable {
      my ($self, $which, $cd) = @_;
      my $c  = $self->compiler;
      my $cv = $cd->{cl_value};
      my $ct = $cd->{cl_term};
      my $dt = $cd->{data_term};
  
      if ($which eq 'min') {
          $c->add_ccl($cd, "$dt >= $ct");
      } elsif ($which eq 'xmin') {
          $c->add_ccl($cd, "$dt > $ct");
      } elsif ($which eq 'max') {
          $c->add_ccl($cd, "$dt <= $ct");
      } elsif ($which eq 'xmax') {
          $c->add_ccl($cd, "$dt < $ct");
      } elsif ($which eq 'between') {
          if ($cd->{cl_is_expr}) {
              $c->add_ccl($cd, "$dt >= $ct\->[0] && $dt <= $ct\->[1]");
          } else {
              # simplify code
              $c->add_ccl($cd, "$dt >= $cv->[0] && $dt <= $cv->[1]");
          }
      } elsif ($which eq 'xbetween') {
          if ($cd->{cl_is_expr}) {
              $c->add_ccl($cd, "$dt > $ct\->[0] && $dt < $ct\->[1]");
          } else {
              # simplify code
              $c->add_ccl($cd, "$dt > $cv->[0] && $dt < $cv->[1]");
          }
      }
  }
  
  1;
  # ABSTRACT: perl's type handler for type "num"
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Compiler::perl::TH::num - perl's type handler for type "num"
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Compiler::perl::TH::num (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(clause_.+|superclause_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COMPILER_PERL_TH_NUM

    $main::fatpacked{"Data/Sah/Compiler/perl/TH/obj.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COMPILER_PERL_TH_OBJ';
  package Data::Sah::Compiler::perl::TH::obj;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  #use Log::Any '$log';
  
  use Mo qw(build default);
  use Role::Tiny::With;
  
  extends 'Data::Sah::Compiler::perl::TH';
  with 'Data::Sah::Type::obj';
  
  sub handle_type {
      my ($self, $cd) = @_;
      my $c = $self->compiler;
  
      my $dt = $cd->{data_term};
      $c->add_runtime_module($cd, 'Scalar::Util');
      $cd->{_ccl_check_type} = "Scalar::Util::blessed($dt)";
  }
  
  sub clause_can {
      my ($self, $cd) = @_;
      my $c  = $self->compiler;
      my $ct = $cd->{cl_term};
      my $dt = $cd->{data_term};
  
      $c->add_ccl($cd, "$dt->can($ct)");
  }
  
  sub clause_isa {
      my ($self, $cd) = @_;
      my $c  = $self->compiler;
      my $ct = $cd->{cl_term};
      my $dt = $cd->{data_term};
  
      $c->add_ccl($cd, "$dt->isa($ct)");
  }
  
  1;
  # ABSTRACT: perl's type handler for type "obj"
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Compiler::perl::TH::obj - perl's type handler for type "obj"
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Compiler::perl::TH::obj (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(clause_.+|superclause_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COMPILER_PERL_TH_OBJ

    $main::fatpacked{"Data/Sah/Compiler/perl/TH/re.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COMPILER_PERL_TH_RE';
  package Data::Sah::Compiler::perl::TH::re;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  #use Log::Any '$log';
  
  use Mo qw(build default);
  use Role::Tiny::With;
  
  extends 'Data::Sah::Compiler::perl::TH';
  with 'Data::Sah::Type::re';
  
  # XXX prefilter to convert string to regex object
  
  sub handle_type {
      my ($self, $cd) = @_;
      my $c = $self->compiler;
  
      my $dt = $cd->{data_term};
      $cd->{_ccl_check_type} = "ref($dt) eq 'Regexp' || !ref($dt) && ".
          "eval { my \$_sahv_re = $dt; qr/\$_sahv_re/; 1 }";
  }
  
  1;
  # ABSTRACT: perl's type handler for type "re"
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Compiler::perl::TH::re - perl's type handler for type "re"
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Compiler::perl::TH::re (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(clause_.+|superclause_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COMPILER_PERL_TH_RE

    $main::fatpacked{"Data/Sah/Compiler/perl/TH/str.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COMPILER_PERL_TH_STR';
  package Data::Sah::Compiler::perl::TH::str;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  #use Log::Any '$log';
  
  use Mo qw(build default);
  use Role::Tiny::With;
  
  extends 'Data::Sah::Compiler::perl::TH';
  with 'Data::Sah::Type::str';
  
  sub handle_type {
      my ($self, $cd) = @_;
      my $c = $self->compiler;
  
      my $dt = $cd->{data_term};
      $cd->{_ccl_check_type} = "!ref($dt)";
  }
  
  sub superclause_comparable {
      my ($self, $which, $cd) = @_;
      my $c  = $self->compiler;
      my $ct = $cd->{cl_term};
      my $dt = $cd->{data_term};
  
      if ($which eq 'is') {
          $c->add_ccl($cd, "$dt eq $ct");
      } elsif ($which eq 'in') {
          if ($dt =~ /\$_\b/) {
              $c->add_ccl($cd, "do { my \$_sahv_dt = $dt; grep { \$_ eq \$_sahv_dt } \@{ $ct } }");
          } else {
              $c->add_ccl($cd, "grep { \$_ eq $dt } \@{ $ct }");
          }
      }
  }
  
  sub superclause_sortable {
      my ($self, $which, $cd) = @_;
      my $c  = $self->compiler;
      my $cv = $cd->{cl_value};
      my $ct = $cd->{cl_term};
      my $dt = $cd->{data_term};
  
      if ($which eq 'min') {
          $c->add_ccl($cd, "$dt ge $ct");
      } elsif ($which eq 'xmin') {
          $c->add_ccl($cd, "$dt gt $ct");
      } elsif ($which eq 'max') {
          $c->add_ccl($cd, "$dt le $ct");
      } elsif ($which eq 'xmax') {
          $c->add_ccl($cd, "$dt lt $ct");
      } elsif ($which eq 'between') {
          if ($cd->{cl_is_expr}) {
              $c->add_ccl($cd, "$dt ge $ct\->[0] && $dt le $ct\->[1]");
          } else {
              # simplify code
              $c->add_ccl($cd, "$dt ge ".$c->literal($cv->[0]).
                              " && $dt le ".$c->literal($cv->[1]));
          }
      } elsif ($which eq 'xbetween') {
          if ($cd->{cl_is_expr}) {
              $c->add_ccl($cd, "$dt gt $ct\->[0] && $dt lt $ct\->[1]");
          } else {
              # simplify code
              $c->add_ccl($cd, "$dt gt ".$c->literal($cv->[0]).
                              " && $dt lt ".$c->literal($cv->[1]));
          }
      }
  }
  
  sub superclause_has_elems {
      my ($self_th, $which, $cd) = @_;
      my $c  = $self_th->compiler;
      my $cv = $cd->{cl_value};
      my $ct = $cd->{cl_term};
      my $dt = $cd->{data_term};
  
      if ($which eq 'len') {
          $c->add_ccl($cd, "length($dt) == $ct");
      } elsif ($which eq 'min_len') {
          $c->add_ccl($cd, "length($dt) >= $ct");
      } elsif ($which eq 'max_len') {
          $c->add_ccl($cd, "length($dt) <= $ct");
      } elsif ($which eq 'len_between') {
          if ($cd->{cl_is_expr}) {
              $c->add_ccl(
                  $cd, "length($dt) >= $ct\->[0] && ".
                      "length($dt) >= $ct\->[1]");
          } else {
              # simplify code
              $c->add_ccl(
                  $cd, "length($dt) >= $cv->[0] && ".
                      "length($dt) <= $cv->[1]");
          }
      } elsif ($which eq 'has') {
          $c->add_ccl($cd, "index($dt, $ct) >= 0");
      } elsif ($which eq 'each_index') {
          $self_th->set_tmp_data_term($cd) if $cd->{args}{data_term_includes_topic_var};
          $self_th->gen_each($cd, "0..length($cd->{data_term})-1", '_', '$_');
          $self_th->restore_data_term($cd) if $cd->{args}{data_term_includes_topic_var};
      } elsif ($which eq 'each_elem') {
          $self_th->set_tmp_data_term($cd) if $cd->{args}{data_term_includes_topic_var};
          $self_th->gen_each($cd, "0..length($cd->{data_term})-1", '_', "substr($cd->{data_term}, \$_, 1)");
          $self_th->restore_data_term($cd) if $cd->{args}{data_term_includes_topic_var};
      } elsif ($which eq 'check_each_index') {
          $self_th->compiler->_die_unimplemented_clause($cd);
      } elsif ($which eq 'check_each_elem') {
          $self_th->compiler->_die_unimplemented_clause($cd);
      } elsif ($which eq 'uniq') {
          $self_th->compiler->_die_unimplemented_clause($cd);
      } elsif ($which eq 'exists') {
          $self_th->compiler->_die_unimplemented_clause($cd);
      }
  }
  
  sub clause_encoding {
      my ($self, $cd) = @_;
      my $c  = $self->compiler;
      my $cv = $cd->{cl_value};
      my $ct = $cd->{cl_term};
      my $dt = $cd->{data_term};
  
      $c->_die($cd, "Only 'utf8' encoding is currently supported")
          unless $cv eq 'utf8';
      # currently does nothing
  }
  
  sub clause_match {
      my ($self, $cd) = @_;
      my $c  = $self->compiler;
      my $cv = $cd->{cl_value};
      my $ct = $cd->{cl_term};
      my $dt = $cd->{data_term};
  
      if ($cd->{cl_is_expr}) {
          $c->add_ccl($cd, join(
              "",
              "ref($ct) eq 'Regexp' ? $dt =~ $ct : ",
              "do { my \$_sahv_re = $ct; eval { \$_sahv_re = /\$_sahv_re/; 1 } && ",
              "$dt =~ \$_sahv_re }",
          ));
      } else {
          # simplify code and we can check regex at compile time
          my $re = $c->_str2reliteral($cd, $cv);
          $c->add_ccl($cd, "$dt =~ qr($re)");
      }
  }
  
  sub clause_is_re {
      my ($self, $cd) = @_;
      my $c  = $self->compiler;
      my $cv = $cd->{cl_value};
      my $ct = $cd->{cl_term};
      my $dt = $cd->{data_term};
  
      if ($cd->{cl_is_expr}) {
          $c->add_ccl($cd, join(
              "",
              "do { my \$_sahv_re = $dt; ",
              "(eval { \$_sahv_re = qr/\$_sahv_re/; 1 } ? 1:0) == ($ct ? 1:0) }",
          ));
      } else {
          # simplify code
          $c->add_ccl($cd, join(
              "",
              "do { my \$_sahv_re = $dt; ",
              ($cv ? "" : "!"), "(eval { \$_sahv_re = qr/\$_sahv_re/; 1 })",
              "}",
          ));
      }
  }
  
  1;
  # ABSTRACT: perl's type handler for type "str"
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Compiler::perl::TH::str - perl's type handler for type "str"
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Compiler::perl::TH::str (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(clause_.+|superclause_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COMPILER_PERL_TH_STR

    $main::fatpacked{"Data/Sah/Compiler/perl/TH/timeofday.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COMPILER_PERL_TH_TIMEOFDAY';
  package Data::Sah::Compiler::perl::TH::timeofday;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  #use Log::Any '$log';
  
  use Mo qw(build default);
  use Role::Tiny::With;
  use Scalar::Util qw(blessed looks_like_number);
  
  extends 'Data::Sah::Compiler::perl::TH';
  with 'Data::Sah::Type::timeofday';
  
  sub handle_type {
      my ($self, $cd) = @_;
      my $c  = $self->compiler;
      my $dt = $cd->{data_term};
  
      $cd->{coerce_to} = $cd->{nschema}[1]{"x.perl.coerce_to"} // 'str_hms';
  
      my $coerce_to = $cd->{coerce_to};
  
      if ($coerce_to eq 'float') {
          $cd->{_ccl_check_type} = "!ref($dt) && $dt >= 0 && $dt < 86400";
      } elsif ($coerce_to eq 'str_hms') {
          $cd->{_ccl_check_type} = "$dt =~ /\\A([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2})(?:\\.[0-9]{1,9})?\\z/";
      } elsif ($coerce_to eq 'Date::TimeOfDay') {
          $c->add_runtime_module($cd, 'Scalar::Util');
          $cd->{_ccl_check_type} = "Scalar::Util::blessed($dt) && $dt\->isa('Date::TimeOfDay')";
      } else {
          die "BUG: Unknown coerce_to value '$coerce_to', use either ".
              "float, str_hms, or Date::TimeOfDay";
      }
  }
  
  sub superclause_comparable {
      my ($self, $which, $cd) = @_;
      my $c  = $self->compiler;
      my $cv = $cd->{cl_value};
      my $ct = $cd->{cl_term};
      my $dt = $cd->{data_term};
  
      if ($cd->{cl_is_expr}) {
          # i'm lazy, technical debt
          $c->_die($cd, "timeofday's comparison with expression not yet supported");
      }
  
      my $coerce_to = $cd->{coerce_to};
      if ($coerce_to eq 'float') {
          if ($which eq 'is') {
              $c->add_ccl($cd, "$dt == $ct");
          } elsif ($which eq 'in') {
              $c->add_runtime_module($cd, 'List::Util');
              $c->add_ccl($cd, "List::Util::first(sub{$dt == \$_}, $ct)");
          }
      } elsif ($coerce_to eq 'str_hms') {
          if ($which eq 'is') {
              $c->add_ccl($cd, "$dt eq $ct");
          } elsif ($which eq 'in') {
              $c->add_runtime_module($cd, 'List::Util');
              $c->add_ccl($cd, "List::Util::first(sub{$dt eq \$_}, $ct)");
          }
      } elsif ($coerce_to eq 'Date::TimeOfDay') {
          if ($which eq 'is') {
              $c->add_ccl($cd, "Date::TimeOfDay->compare($dt, $ct)==0");
          } elsif ($which eq 'in') {
              $c->add_runtime_module($cd, 'List::Util');
              $c->add_ccl($cd, "List::Util::first(sub{Date::TimeOfDay->compare($dt, \$_)==0}, $ct)");
          }
      }
  }
  
  sub superclause_sortable {
      my ($self, $which, $cd) = @_;
      my $c  = $self->compiler;
      my $cv = $cd->{cl_value};
      my $ct = $cd->{cl_term};
      my $dt = $cd->{data_term};
  
      if ($cd->{cl_is_expr}) {
          # i'm lazy, technical debt
          $c->_die($cd, "timeofday's comparison with expression not yet supported");
      }
  
      my $coerce_to = $cd->{coerce_to};
      if ($coerce_to eq 'float') {
          if ($which eq 'min') {
              $c->add_ccl($cd, "$dt >= $cv");
          } elsif ($which eq 'xmin') {
              $c->add_ccl($cd, "$dt > $cv");
          } elsif ($which eq 'max') {
              $c->add_ccl($cd, "$dt <= $cv");
          } elsif ($which eq 'xmax') {
              $c->add_ccl($cd, "$dt < $cv");
          } elsif ($which eq 'between') {
              $c->add_ccl($cd, "$dt >= $cv->[0] && $dt <= $cv->[1]");
          } elsif ($which eq 'xbetween') {
              $c->add_ccl($cd, "$dt >  $cv->[0] && $dt <  $cv->[1]");
          }
      } elsif ($coerce_to eq 'str_hms') {
          if ($which eq 'min') {
              $c->add_ccl($cd, "$dt ge '$cv'");
          } elsif ($which eq 'xmin') {
              $c->add_ccl($cd, "$dt gt '$cv'");
          } elsif ($which eq 'max') {
              $c->add_ccl($cd, "$dt le '$cv'");
          } elsif ($which eq 'xmax') {
              $c->add_ccl($cd, "$dt lt '$cv'");
          } elsif ($which eq 'between') {
              $c->add_ccl($cd, "$dt ge '$cv->[0]' && $dt le '$cv->[1]'");
          } elsif ($which eq 'xbetween') {
              $c->add_ccl($cd, "$dt gt '$cv->[0]' && $dt lt '$cv->[1]'");
          }
      } elsif ($coerce_to eq 'Date::TimeOfDay') {
          if ($which eq 'min') {
              $c->add_ccl($cd, "Date::TimeOfDay->compare($dt, $cv) >= 0");
          } elsif ($which eq 'xmin') {
              $c->add_ccl($cd, "Date::TimeOfDay->compare($dt, $cv) > 0");
          } elsif ($which eq 'max') {
              $c->add_ccl($cd, "Date::TimeOfDay->compare($dt, $cv) <= 0");
          } elsif ($which eq 'xmax') {
              $c->add_ccl($cd, "Date::TimeOfDay->compare($dt, $cv) < 0");
          } elsif ($which eq 'between') {
              $c->add_ccl($cd, "Date::TimeOfDay->compare($dt, $cv\->[0]) >= 0 && Date::TimeOfDay->compare($dt, $ct\->[1]) <= 0");
          } elsif ($which eq 'xbetween') {
              $c->add_ccl($cd, "Date::TimeOfDay->compare($dt, $cv\->[0]) >  0 && Date::TimeOfDay->compare($dt, $ct\->[1]) <  0");
          }
      }
  }
  
  1;
  # ABSTRACT: perl's type handler for type "timeofday"
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Compiler::perl::TH::timeofday - perl's type handler for type "timeofday"
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Compiler::perl::TH::timeofday (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =head1 DESCRIPTION
  
  The C<timeofday> type can be represented using one of three choices: C<float>
  (seconds after midnight), C<str_hms> (string in the form of hh:mm:ss), or
  C<Date::TimeOfDay> (instance of L<Date::TimeOfDay> class). This choice can be
  specified in the schema using clause attribute C<x.perl.coerce_to>, e.g.:
  
   ["date", "x.perl.coerce_to"=>"float"]
   ["date", "x.perl.coerce_to"=>"str_hms"]
   ["date", "x.perl.coerce_to"=>"Date::TimeOfDay"]
  
  =for Pod::Coverage ^(clause_.+|superclause_.+|handle_.+|before_.+|after_.+)$
  
  =head1 COMPILATION DATA KEYS
  
  =over
  
  =item * B<coerce_to> => str
  
  By default will be set to C<str_hms>.
  
  =back
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COMPILER_PERL_TH_TIMEOFDAY

    $main::fatpacked{"Data/Sah/Compiler/perl/TH/undef.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_COMPILER_PERL_TH_UNDEF';
  package Data::Sah::Compiler::perl::TH::undef;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  #use Log::Any '$log';
  
  use Mo qw(build default);
  use Role::Tiny::With;
  
  extends 'Data::Sah::Compiler::perl::TH';
  with 'Data::Sah::Type::undef';
  
  sub handle_type {
      my ($self, $cd) = @_;
      my $c = $self->compiler;
  
      my $dt = $cd->{data_term};
      $cd->{_ccl_check_type} = "!defined($dt)";
  }
  
  1;
  # ABSTRACT: perl's type handler for type "undef"
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Compiler::perl::TH::undef - perl's type handler for type "undef"
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Compiler::perl::TH::undef (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(clause_.+|superclause_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_COMPILER_PERL_TH_UNDEF

    $main::fatpacked{"Data/Sah/Filter.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_FILTER';
  package Data::Sah::Filter;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-02-11'; # DATE
  our $DIST = 'Data-Sah-Filter'; # DIST
  our $VERSION = '0.004'; # VERSION
  
  use strict 'subs', 'vars';
  use warnings;
  no warnings 'once';
  use Log::ger;
  
  use Data::Sah::FilterCommon;
  
  use Exporter qw(import);
  our @EXPORT_OK = qw(gen_filter);
  
  our %SPEC;
  
  our $Log_Filter_Code = $ENV{LOG_SAH_FILTER_CODE} // 0;
  
  $SPEC{gen_filter} = {
      v => 1.1,
      summary => 'Generate filter code',
      description => <<'_',
  
  This is mostly for testing. Normally the filter rules will be used from
  <pm:Data::Sah>.
  
  _
      args => {
          %Data::Sah::FilterCommon::gen_filter_args,
      },
      result_naked => 1,
  };
  sub gen_filter {
      my %args = @_;
  
      my $rt = $args{return_type} // 'val';
  
      my $rules = Data::Sah::FilterCommon::get_filter_rules(
          %args,
          compiler=>'perl',
          data_term=>'$data',
      );
  
      my $code;
      if (@$rules) {
          my $code_require = '';
          my %mem;
          for my $rule (@$rules) {
              next unless $rule->{modules};
              for my $mod (keys %{$rule->{modules}}) {
                  next if $mem{$mod}++;
                  $code_require .= "require $mod;\n";
              }
          }
  
          my $code_filter = "";
          my $has_defined_tmp;
          for my $rule (@$rules) {
              if ($rule->{meta}{might_fail}) {
                  if ($rt eq 'val') {
                      $code_filter .= "    my \$tmp; " unless $has_defined_tmp++;
                      $code_filter .= "    \$tmp = $rule->{expr_filter}; return undef if \$tmp->[0]; ";
                  } else {
                      $code_filter .= "    \$data = $rule->{expr_filter}; return \$data if \$data->[0]; ";
                  }
              } else {
                  if ($rt eq 'val') {
                      $code_filter .= "    \$data = $rule->{expr_filter}; ";
                  } else {
                      $code_filter .= "    \$data = [undef, $rule->{expr_filter}]; ";
                  }
              }
          }
  
          $code = join(
              "",
              $code_require,
              "sub {\n",
              "    my \$data = shift;\n",
              "    unless (defined \$data) {\n",
              "        ", ($rt eq 'val' ? "return undef;" :
                               "return [undef, undef];" # str_errmsg+val
                           ), "\n",
              "    }\n",
              $code_filter, "\n",
              "    \$data;\n",
              "}",
          );
      } else {
          if ($rt eq 'val') {
              $code = 'sub { $_[0] }';
          } else {
              $code = 'sub { [undef, $_[0]] }';
          }
      }
  
      if ($Log_Filter_Code) {
          log_trace("Filter code (gen args: %s): %s", \%args, $code);
      }
  
      return $code if $args{source};
  
      my $filter = eval $code;
      die if $@;
      $filter;
  }
  
  1;
  # ABSTRACT: Filtering for Data::Sah
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Filter - Filtering for Data::Sah
  
  =head1 VERSION
  
  This document describes version 0.004 of Data::Sah::Filter (from Perl distribution Data-Sah-Filter), released on 2020-02-11.
  
  =head1 SYNOPSIS
  
   use Data::Sah::Filter qw(gen_filter);
  
   # a utility routine: gen_filter
   my $c = gen_filter(
       filter_names       => ['Str::ltrim', 'Str::rtrim'],
   );
  
   my $val = $c->("foo");        # unchanged, "foo"
   my $val = $c->(" foo ");      # "foo"
  
  =head1 DESCRIPTION
  
  This distribution contains a standard set of filter rules for L<Data::Sah> (to
  be used in C<prefilters> and C<postfilter> cause). It is separated from the
  C<Data-Sah> distribution and can be used independently.
  
  A filter rule is put in C<Data::Sah::Filter::$COMPILER::$CATEGORY:$DESCRIPTION>
  module, for example: L<Data::Sah::Filter::perl::Str::trim> for trimming
  whitespace at the beginning and end of string.
  
  Basically, a filter rule will provide an expression (C<expr_filter>) to convert
  data to another. Multiple filter rules will be combined to form the final
  filtering code.
  
  The filter rule module must contain C<meta> subroutine which must return a
  hashref (L<DefHash>) that has the following keys (C<*> marks that the key is
  required):
  
  =over
  
  =item * v* => int (default: 1)
  
  Metadata specification version. From L<DefHash>. Currently at 1.
  
  =item * summary => str
  
  From L<DefHash>.
  
  =back
  
  The filter rule module must also contain C<filter> subroutine which must
  generate the code for filtering. The subroutine must accept a hash of arguments
  (C<*> indicates required arguments):
  
  =over
  
  =item * data_term => str
  
  =back
  
  The C<filter> subroutine must return a hashref with the following keys (C<*>
  indicates required keys):
  
  =over
  
  =item * might_fail => bool
  
  Whether coercion might fail, e.g. because of invalid input. If set to 1,
  C<expr_filter> key that the C<filter()> routine returns must be an expression
  that returns an array (envelope) of C<< (error_msg, data) >> instead of just
  filtered data. Error message should be a string that is set when filtering fails
  and explains why. Otherwise, if filtering succeeds, the string should be set to
  undefined value.
  
  This is used for filtering rules that act as a data checker.
  
  =item * expr_filter => str
  
  Expression in the target language to actually convert data.
  
  =item * modules => hash
  
  A list of modules required by the expression.
  
  =back
  
  Basically, the C<filter> subroutine must generate a code that accepts a
  non-undef data and must convert this data to the desired value.
  
  Program/library that uses L<Data::Sah::Filter> can collect rules from the rule
  modules then compose them into the final code, something like (in pseudo-Perl
  code):
  
   if (!defined $data) {
     return undef;
   } else {
     $data = expr-filter-from-rule1($data);
     $data = expr-filter-from-rule2($data);
     ...
     return $data;
   }
  
  =head1 VARIABLES
  
  =head2 $Log_Filter_Code => bool (default: from ENV or 0)
  
  If set to true, will log the generated filter code (currently using L<Log::ger>
  at trace level). To see the log message, e.g. to the screen, you can use
  something like:
  
   % TRACE=1 perl -MLog::ger::LevelFromEnv -MLog::ger::Output=Screen \
       -MData::Sah::Filter=gen_filter -E'my $c = gen_filter(...)'
  
  =head1 FUNCTIONS
  
  
  =head2 gen_filter
  
  Usage:
  
   gen_filter(%args) -> any
  
  Generate filter code.
  
  This is mostly for testing. Normally the filter rules will be used from
  L<Data::Sah>.
  
  This function is not exported by default, but exportable.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<filter_names>* => I<array[str]>
  
  =item * B<return_type> => I<str> (default: "val")
  
  
  =back
  
  Return value:  (any)
  
  =head1 ENVIRONMENT
  
  =head2 LOG_SAH_FILTER_CODE => bool
  
  Set default for C<$Log_Filter_Code>.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah-Filter>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah-Filter>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah-Filter>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Data::Sah>
  
  L<Data::Sah::FilterJS>
  
  L<App::SahUtils>, including L<filter-with-sah> to conveniently test filter from
  the command-line.
  
  L<Data::Sah::Coerce>. Filtering works very similarly to coercion in the
  L<Data::Sah> framework (see l<Data::Sah::Coerce>) but is simpler and composited
  differently to form the final filtering code. Mainly, input data will be passed
  to all filtering expressions.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_FILTER

    $main::fatpacked{"Data/Sah/Filter/js/Str/downcase.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_FILTER_JS_STR_DOWNCASE';
  package Data::Sah::Filter::js::Str::downcase;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-02-11'; # DATE
  our $DIST = 'Data-Sah-Filter'; # DIST
  our $VERSION = '0.004'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  sub meta {
      +{
          v => 1,
          summary => 'Convert string to lowercase',
          target_type => 'str',
      };
  }
  
  sub filter {
      my %args = @_;
  
      my $dt = $args{data_term};
  
      my $res = {};
  
      $res->{expr_filter} = "$dt.toLowerCase()";
  
      $res;
  }
  
  1;
  # ABSTRACT: Convert string to lowercase
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Filter::js::Str::downcase - Convert string to lowercase
  
  =head1 VERSION
  
  This document describes version 0.004 of Data::Sah::Filter::js::Str::downcase (from Perl distribution Data-Sah-Filter), released on 2020-02-11.
  
  =head1 SYNOPSIS
  
  Use in Sah schema's C<prefilters> (or C<postfilters>) clause:
  
   ["str","prefilters",["Str::downcase"]]
  
  =for Pod::Coverage ^(meta|filter)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah-Filter>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah-Filter>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah-Filter>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_FILTER_JS_STR_DOWNCASE

    $main::fatpacked{"Data/Sah/Filter/js/Str/ltrim.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_FILTER_JS_STR_LTRIM';
  package Data::Sah::Filter::js::Str::ltrim;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-02-11'; # DATE
  our $DIST = 'Data-Sah-Filter'; # DIST
  our $VERSION = '0.004'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  sub meta {
      +{
          v => 1,
          summary => 'Trim whitespace at the beginning of string',
      };
  }
  
  sub filter {
      my %args = @_;
  
      my $dt = $args{data_term};
  
      my $res = {};
  
      $res->{expr_filter} = "$dt.trimLeft()";
  
      $res;
  }
  
  1;
  # ABSTRACT: Trim whitespace at the beginning of string
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Filter::js::Str::ltrim - Trim whitespace at the beginning of string
  
  =head1 VERSION
  
  This document describes version 0.004 of Data::Sah::Filter::js::Str::ltrim (from Perl distribution Data-Sah-Filter), released on 2020-02-11.
  
  =head1 SYNOPSIS
  
  Use in Sah schema's C<prefilters> (or C<postfilters>) clause:
  
   ["str","prefilters",["Str::ltrim"]]
  
  =for Pod::Coverage ^(meta|filter)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah-Filter>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah-Filter>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah-Filter>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_FILTER_JS_STR_LTRIM

    $main::fatpacked{"Data/Sah/Filter/js/Str/rtrim.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_FILTER_JS_STR_RTRIM';
  package Data::Sah::Filter::js::Str::rtrim;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-02-11'; # DATE
  our $DIST = 'Data-Sah-Filter'; # DIST
  our $VERSION = '0.004'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  sub meta {
      +{
          v => 1,
          summary => 'Trim whitespace at the end of string',
      };
  }
  
  sub filter {
      my %args = @_;
  
      my $dt = $args{data_term};
  
      my $res = {};
  
      $res->{expr_filter} = "$dt.trimRight()";
  
      $res;
  }
  
  1;
  # ABSTRACT: Trim whitespace at the end of string
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Filter::js::Str::rtrim - Trim whitespace at the end of string
  
  =head1 VERSION
  
  This document describes version 0.004 of Data::Sah::Filter::js::Str::rtrim (from Perl distribution Data-Sah-Filter), released on 2020-02-11.
  
  =head1 SYNOPSIS
  
  Use in Sah schema's C<prefilters> (or C<postfilters>) clause:
  
   ["str","prefilters",["Str::rtrim"]]
  
  =for Pod::Coverage ^(meta|filter)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah-Filter>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah-Filter>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah-Filter>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_FILTER_JS_STR_RTRIM

    $main::fatpacked{"Data/Sah/Filter/js/Str/trim.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_FILTER_JS_STR_TRIM';
  package Data::Sah::Filter::js::Str::trim;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-02-11'; # DATE
  our $DIST = 'Data-Sah-Filter'; # DIST
  our $VERSION = '0.004'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  sub meta {
      +{
          v => 1,
          summary => 'Trim whitespace at the beginning and end of string',
      };
  }
  
  sub filter {
      my %args = @_;
  
      my $dt = $args{data_term};
  
      my $res = {};
  
      $res->{expr_filter} = "$dt.trim()";
  
      $res;
  }
  
  1;
  # ABSTRACT: Trim whitespace at the beginning and end of string
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Filter::js::Str::trim - Trim whitespace at the beginning and end of string
  
  =head1 VERSION
  
  This document describes version 0.004 of Data::Sah::Filter::js::Str::trim (from Perl distribution Data-Sah-Filter), released on 2020-02-11.
  
  =head1 SYNOPSIS
  
  Use in Sah schema's C<prefilters> (or C<postfilters>) clause:
  
   ["str","prefilters",["Str::trim"]]
  
  =for Pod::Coverage ^(meta|filter)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah-Filter>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah-Filter>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah-Filter>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_FILTER_JS_STR_TRIM

    $main::fatpacked{"Data/Sah/Filter/js/Str/upcase.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_FILTER_JS_STR_UPCASE';
  package Data::Sah::Filter::js::Str::upcase;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-02-11'; # DATE
  our $DIST = 'Data-Sah-Filter'; # DIST
  our $VERSION = '0.004'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  sub meta {
      +{
          v => 1,
          summary => 'Convert string to uppercase',
          target_type => 'str',
      };
  }
  
  sub filter {
      my %args = @_;
  
      my $dt = $args{data_term};
  
      my $res = {};
  
      $res->{expr_filter} = "$dt.toUpperCase()";
  
      $res;
  }
  
  1;
  # ABSTRACT: Convert string to uppercase
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Filter::js::Str::upcase - Convert string to uppercase
  
  =head1 VERSION
  
  This document describes version 0.004 of Data::Sah::Filter::js::Str::upcase (from Perl distribution Data-Sah-Filter), released on 2020-02-11.
  
  =head1 SYNOPSIS
  
  Use in Sah schema's C<prefilters> (or C<postfilters>) clause:
  
   ["str","prefilters",["Str::upcase"]]
  
  =for Pod::Coverage ^(meta|filter)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah-Filter>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah-Filter>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah-Filter>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_FILTER_JS_STR_UPCASE

    $main::fatpacked{"Data/Sah/Filter/perl/Str/check.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_FILTER_PERL_STR_CHECK';
  package Data::Sah::Filter::perl::Str::check;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-02-11'; # DATE
  our $DIST = 'Data-Sah-Filter'; # DIST
  our $VERSION = '0.004'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  use Data::Dmp;
  
  sub meta {
      +{
          v => 1,
          summary => 'Perform some checks',
          might_fail => 1,
          args => {
              min_len => {
                  schema => 'uint*',
              },
              max_len => {
                  schema => 'uint*',
              },
              match => {
                  schema => 're*',
              },
              in => {
                  schema => ['array*', of=>'str*'],
              },
          },
      };
  }
  
  sub filter {
      my %fargs = @_;
  
      my $dt = $fargs{data_term};
      my $gen_args = $fargs{args} // {};
  
      my @check_exprs;
      if (defined $gen_args->{min_len}) {
          my $val = $gen_args->{min_len} + 0;
          push @check_exprs, (@check_exprs ? "elsif" : "if") . qq( (length(\$tmp) < $val) { ["Length of data must be at least $val", undef] } );
      }
      if (defined $gen_args->{max_len}) {
          my $val = $gen_args->{max_len} + 0;
          push @check_exprs, (@check_exprs ? "elsif" : "if") . qq( (length(\$tmp) > $val) { ["Length of data must be at most $val", undef] } );
      }
      if (defined $gen_args->{match}) {
          my $val = ref $gen_args->{match} eq 'Regexp' ? $gen_args->{match} : qr/$gen_args->{match}/;
          push @check_exprs, (@check_exprs ? "elsif" : "if") . qq| (\$tmp !~ |.dmp($val).qq|) { ["Data must match $val", undef] } |;
      }
      if (defined $gen_args->{in}) {
          my $val = $gen_args->{in};
          push @check_exprs, (@check_exprs ? "elsif" : "if") . qq| (!grep { \$_ eq \$tmp } \@{ |.dmp($val).qq| }) { ["Data must be one of ".join(", ", \@{|.dmp($val).qq|}), undef] } |;
      }
      unless (@check_exprs) {
          push @check_exprs, qq(if (0) { } );
      }
      my $res = {};
      $res->{expr_filter} = join(
          "",
          "do {",
          "    my \$tmp = $dt; ",
          @check_exprs,
          "    else { [undef, \$tmp] } ",
          "}",
      );
  
      $res;
  }
  
  1;
  # ABSTRACT: Perform some checks
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Filter::perl::Str::check - Perform some checks
  
  =head1 VERSION
  
  This document describes version 0.004 of Data::Sah::Filter::perl::Str::check (from Perl distribution Data-Sah-Filter), released on 2020-02-11.
  
  =head1 SYNOPSIS
  
  Use in Sah schema's C<prefilters> (or C<postfilters>) clause:
  
   ["str","prefilters",["Str::check"]]
  
  =head1 DESCRIPTION
  
  This is more or less a demo filter rule, to show how a filter rule can be used
  to perform some checks. The standard checks performed by this rule, however,
  are better done using standard schema clauses like C<in>, C<min_len>, etc.
  
  =for Pod::Coverage ^(meta|filter)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah-Filter>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah-Filter>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah-Filter>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_FILTER_PERL_STR_CHECK

    $main::fatpacked{"Data/Sah/Filter/perl/Str/downcase.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_FILTER_PERL_STR_DOWNCASE';
  package Data::Sah::Filter::perl::Str::downcase;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-02-11'; # DATE
  our $DIST = 'Data-Sah-Filter'; # DIST
  our $VERSION = '0.004'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  sub meta {
      +{
          v => 1,
          summary => 'Convert string to lowercase',
      };
  }
  
  sub filter {
      my %args = @_;
  
      my $dt = $args{data_term};
  
      my $res = {};
      $res->{expr_filter} = join(
          "",
          "lc($dt)",
      );
  
      $res;
  }
  
  1;
  # ABSTRACT: Convert string to lowercase
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Filter::perl::Str::downcase - Convert string to lowercase
  
  =head1 VERSION
  
  This document describes version 0.004 of Data::Sah::Filter::perl::Str::downcase (from Perl distribution Data-Sah-Filter), released on 2020-02-11.
  
  =head1 SYNOPSIS
  
  Use in Sah schema's C<prefilters> (or C<postfilters>) clause:
  
   ["str","prefilters",["Str::downcase"]]
  
  =for Pod::Coverage ^(meta|filter)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah-Filter>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah-Filter>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah-Filter>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_FILTER_PERL_STR_DOWNCASE

    $main::fatpacked{"Data/Sah/Filter/perl/Str/ltrim.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_FILTER_PERL_STR_LTRIM';
  package Data::Sah::Filter::perl::Str::ltrim;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-02-11'; # DATE
  our $DIST = 'Data-Sah-Filter'; # DIST
  our $VERSION = '0.004'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  sub meta {
      +{
          v => 1,
          summary => 'Trim whitespaces at the beginning of string',
      };
  }
  
  sub filter {
      my %args = @_;
  
      my $dt = $args{data_term};
  
      my $res = {};
      $res->{expr_filter} = join(
          "",
          "do { my \$res = $dt; \$res =~ s/\\A\\s+//s; \$res }",
      );
  
      $res;
  }
  
  1;
  # ABSTRACT: Trim whitespaces at the beginning of string
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Filter::perl::Str::ltrim - Trim whitespaces at the beginning of string
  
  =head1 VERSION
  
  This document describes version 0.004 of Data::Sah::Filter::perl::Str::ltrim (from Perl distribution Data-Sah-Filter), released on 2020-02-11.
  
  =head1 SYNOPSIS
  
  Use in Sah schema's C<prefilters> (or C<postfilters>) clause:
  
   ["str","prefilters",["Str::ltrim"]]
  
  =for Pod::Coverage ^(meta|filter)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah-Filter>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah-Filter>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah-Filter>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_FILTER_PERL_STR_LTRIM

    $main::fatpacked{"Data/Sah/Filter/perl/Str/replace_map.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_FILTER_PERL_STR_REPLACE_MAP';
  package Data::Sah::Filter::perl::Str::replace_map;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-02-11'; # DATE
  our $DIST = 'Data-Sah-Filter'; # DIST
  our $VERSION = '0.004'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  use Data::Dmp;
  
  sub meta {
      +{
          v => 1,
          summary => 'Replace (map) some values with (to) other values',
          args => {
              map => {
                  schema => 'hash*',
                  req => 1,
              },
          },
      };
  }
  
  sub filter {
      my %fargs = @_;
  
      my $dt = $fargs{data_term};
      my $gen_args = $fargs{args} // {};
  
      my $res = {};
      $res->{expr_filter} = join(
          "",
          "do {",
          "    my \$tmp = $dt; ",
          "    my \$map = ".dmp($gen_args->{map})."; ",
          "    defined \$map->{\$tmp} ? \$map->{\$tmp} : \$tmp; ",
          "}",
      );
  
      $res;
  }
  
  1;
  # ABSTRACT: Replace (map) some values with (to) other values
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Filter::perl::Str::replace_map - Replace (map) some values with (to) other values
  
  =head1 VERSION
  
  This document describes version 0.004 of Data::Sah::Filter::perl::Str::replace_map (from Perl distribution Data-Sah-Filter), released on 2020-02-11.
  
  =head1 SYNOPSIS
  
  Use in Sah schema's C<prefilters> (or C<postfilters>) clause:
  
   ["str","prefilters",["Str::replace_map"]]
  
  =head1 DESCRIPTION
  
  This filter rule can be used to replace some (e.g. old) values to other (e.g.
  new) values. For example, with this rule:
  
   [replace_map => {burma => "myanmar", siam => "thailand"}]
  
  then "indonesia" or "myanmar" will be unchanged, but "burma" will be changed to
  "myanmar" and "siam" will be changed to "thailand".
  
  =for Pod::Coverage ^(meta|filter)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah-Filter>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah-Filter>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah-Filter>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Complete::Util>'s L<complete_array_elem|Complete::Util/complete_array_elem>
  also has a C<replace_map> option.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_FILTER_PERL_STR_REPLACE_MAP

    $main::fatpacked{"Data/Sah/Filter/perl/Str/rtrim.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_FILTER_PERL_STR_RTRIM';
  package Data::Sah::Filter::perl::Str::rtrim;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-02-11'; # DATE
  our $DIST = 'Data-Sah-Filter'; # DIST
  our $VERSION = '0.004'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  sub meta {
      +{
          v => 1,
          summary => 'Trim whitespaces at the end of string',
      };
  }
  
  sub filter {
      my %args = @_;
  
      my $dt = $args{data_term};
  
      my $res = {};
      $res->{expr_filter} = join(
          "",
          "do { my \$res = $dt; \$res =~ s/\\s+\\z//s; \$res }",
      );
  
      $res;
  }
  
  1;
  # ABSTRACT: Trim whitespaces at the end of string
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Filter::perl::Str::rtrim - Trim whitespaces at the end of string
  
  =head1 VERSION
  
  This document describes version 0.004 of Data::Sah::Filter::perl::Str::rtrim (from Perl distribution Data-Sah-Filter), released on 2020-02-11.
  
  =head1 SYNOPSIS
  
  Use in Sah schema's C<prefilters> (or C<postfilters>) clause:
  
   ["str","prefilters",["Str::rtrim"]]
  
  =for Pod::Coverage ^(meta|filter)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah-Filter>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah-Filter>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah-Filter>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_FILTER_PERL_STR_RTRIM

    $main::fatpacked{"Data/Sah/Filter/perl/Str/trim.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_FILTER_PERL_STR_TRIM';
  package Data::Sah::Filter::perl::Str::trim;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-02-11'; # DATE
  our $DIST = 'Data-Sah-Filter'; # DIST
  our $VERSION = '0.004'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  sub meta {
      +{
          v => 1,
          summary => 'Trim whitespaces at the beginning and end of string',
      };
  }
  
  sub filter {
      my %args = @_;
  
      my $dt = $args{data_term};
  
      my $res = {};
      $res->{expr_filter} = join(
          "",
          "do { my \$res = $dt; \$res =~ s/\\A\\s+//s; \$res =~ s/\\s+\\z//s; \$res }",
      );
  
      $res;
  }
  
  1;
  # ABSTRACT: Trim whitespaces at the beginning and end of string
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Filter::perl::Str::trim - Trim whitespaces at the beginning and end of string
  
  =head1 VERSION
  
  This document describes version 0.004 of Data::Sah::Filter::perl::Str::trim (from Perl distribution Data-Sah-Filter), released on 2020-02-11.
  
  =head1 SYNOPSIS
  
  Use in Sah schema's C<prefilters> (or C<postfilters>) clause:
  
   ["str","prefilters",["Str::trim"]]
  
  =for Pod::Coverage ^(meta|filter)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah-Filter>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah-Filter>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah-Filter>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_FILTER_PERL_STR_TRIM

    $main::fatpacked{"Data/Sah/Filter/perl/Str/upcase.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_FILTER_PERL_STR_UPCASE';
  package Data::Sah::Filter::perl::Str::upcase;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-02-11'; # DATE
  our $DIST = 'Data-Sah-Filter'; # DIST
  our $VERSION = '0.004'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  sub meta {
      +{
          v => 1,
          summary => 'Convert string to uppercase',
      };
  }
  
  sub filter {
      my %args = @_;
  
      my $dt = $args{data_term};
  
      my $res = {};
      $res->{expr_filter} = join(
          "",
          "uc($dt)",
      );
  
      $res;
  }
  
  1;
  # ABSTRACT: Convert string to uppercase
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Filter::perl::Str::upcase - Convert string to uppercase
  
  =head1 VERSION
  
  This document describes version 0.004 of Data::Sah::Filter::perl::Str::upcase (from Perl distribution Data-Sah-Filter), released on 2020-02-11.
  
  =head1 SYNOPSIS
  
  Use in Sah schema's C<prefilters> (or C<postfilters>) clause:
  
   ["str","prefilters",["Str::upcase"]]
  
  =for Pod::Coverage ^(meta|filter)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah-Filter>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah-Filter>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah-Filter>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_FILTER_PERL_STR_UPCASE

    $main::fatpacked{"Data/Sah/FilterCommon.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_FILTERCOMMON';
  package Data::Sah::FilterCommon;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-02-11'; # DATE
  our $DIST = 'Data-Sah-Filter'; # DIST
  our $VERSION = '0.004'; # VERSION
  
  use 5.010001;
  use strict 'subs', 'vars';
  use warnings;
  
  our %SPEC;
  
  our %common_args = (
      filter_names => {
          schema => ['array*', of=>'str*'],
          req => 1,
      },
  );
  
  our %gen_filter_args = (
      %common_args,
      return_type => {
          schema => ['str*', in=>['val', 'errstr+val']],
          default => 'val',
      },
  );
  
  $SPEC{get_filter_rules} = {
      v => 1.1,
      summary => 'Get filter rules from filter rule modules',
      args => {
          %common_args,
          compiler => {
              schema => 'str*',
              req => 1,
          },
          data_term => {
              schema => 'str*',
              req => 1,
          },
      },
  };
  sub get_filter_rules {
      my %args = @_;
  
      my $compiler = $args{compiler};
      my $dt       = $args{data_term};
      my $prefix = "Data::Sah::Filter::$compiler\::";
  
      my @rules;
      for my $entry (@{ $args{filter_names} }) {
          my $filter_name = ref $entry eq 'ARRAY' ? $entry->[0] : $entry;
          my $filter_gen_args = ref $entry eq 'ARRAY' ? $entry->[1] : undef;
  
          my $mod = $prefix . $filter_name;
          (my $mod_pm = "$mod.pm") =~ s!::!/!g;
          require $mod_pm;
          my $filter_meta = &{"$mod\::meta"};
          my $filter_v = ($filter_meta->{v} // 1);
          if ($filter_v != 1) {
              die "Only filter module following metadata version 1 is ".
                  "supported, this filter module '$mod' follows metadata version ".
                  "$filter_v and cannot be used";
          }
          my $rule = &{"$mod\::filter"}(
              data_term => $dt,
              (args => $filter_gen_args) x !!$filter_gen_args,
          );
          $rule->{name} = $filter_name;
          $rule->{meta} = $filter_meta;
          push @rules, $rule;
      }
  
      \@rules;
  }
  
  1;
  # ABSTRACT: Common stuffs for Data::Sah::Filter and Data::Sah::FilterJS
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::FilterCommon - Common stuffs for Data::Sah::Filter and Data::Sah::FilterJS
  
  =head1 VERSION
  
  This document describes version 0.004 of Data::Sah::FilterCommon (from Perl distribution Data-Sah-Filter), released on 2020-02-11.
  
  =head1 FUNCTIONS
  
  
  =head2 get_filter_rules
  
  Usage:
  
   get_filter_rules(%args) -> [status, msg, payload, meta]
  
  Get filter rules from filter rule modules.
  
  This function is not exported.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<compiler>* => I<str>
  
  =item * B<data_term>* => I<str>
  
  =item * B<filter_names>* => I<array[str]>
  
  
  =back
  
  Returns an enveloped result (an array).
  
  First element (status) is an integer containing HTTP status code
  (200 means OK, 4xx caller error, 5xx function error). Second element
  (msg) is a string containing error message, or 'OK' if status is
  200. Third element (payload) is optional, the actual result. Fourth
  element (meta) is called result metadata and is optional, a hash
  that contains extra information.
  
  Return value:  (any)
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah-Filter>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah-Filter>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah-Filter>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_FILTERCOMMON

    $main::fatpacked{"Data/Sah/FilterJS.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_FILTERJS';
  package Data::Sah::FilterJS;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-02-11'; # DATE
  our $DIST = 'Data-Sah-Filter'; # DIST
  our $VERSION = '0.004'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  use Log::ger;
  
  use Data::Sah::FilterCommon;
  use IPC::System::Options;
  use Nodejs::Util qw(get_nodejs_path);
  
  use Exporter qw(import);
  our @EXPORT_OK = qw(gen_filter);
  
  our %SPEC;
  
  our $Log_Filter_Code = $ENV{LOG_SAH_FILTER_CODE} // 0;
  
  $SPEC{gen_filter} = {
      v => 1.1,
      summary => 'Generate filter code',
      description => <<'_',
  
  This is mostly for testing. Normally the filter rules will be used from
  <pm:Data::Sah>.
  
  _
      args => {
          filter_names => {
              schema => ['array*', of=>'str*'],
          },
      },
      result_naked => 1,
  };
  sub gen_filter {
      my %args = @_;
  
      my $rules = Data::Sah::FilterCommon::get_filter_rules(
          %args,
          compiler=>'js',
          data_term=>'data',
      );
  
      my $code;
      if (@$rules) {
          $code = join(
              "",
              "function (data) {\n",
              "    if (data === undefined || data === null) {\n",
              "        return null;\n",
              "    }\n",
              (map { "    data = $_->{expr_filter};\n" } @$rules),
              "    return data;\n",
              "}",
          );
      } else {
          $code = 'function (data) { return data }';
      }
  
      if ($Log_Filter_Code) {
          log_trace("Filter code (gen args: %s): %s", \%args, $code);
      }
  
      return $code if $args{source};
  
      state $nodejs_path = get_nodejs_path();
      die "Can't find node.js in PATH" unless $nodejs_path;
  
      sub {
          require File::Temp;
          require JSON;
          #require String::ShellQuote;
  
          my $data = shift;
  
          state $json = JSON->new->allow_nonref;
  
          # code to be sent to nodejs
          my $src = "var filter = $code;\n\n".
              "console.log(JSON.stringify(filter(".
                  $json->encode($data).")))";
  
          my ($jsh, $jsfn) = File::Temp::tempfile();
          print $jsh $src;
          close($jsh) or die "Can't write JS code to file $jsfn: $!";
  
          my $out = IPC::System::Options::readpipe($nodejs_path, $jsfn);
          $json->decode($out);
      };
  }
  
  1;
  # ABSTRACT: Generate filter code
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::FilterJS - Generate filter code
  
  =head1 VERSION
  
  This document describes version 0.004 of Data::Sah::FilterJS (from Perl distribution Data-Sah-Filter), released on 2020-02-11.
  
  =head1 SYNOPSIS
  
   use Data::Sah::FilterJS qw(gen_filter);
  
   # use as you would use Data::Sah::Filter
  
  =head1 DESCRIPTION
  
  This module is just like L<Data::Sah::Filter> except that it uses JavaScript
  filter rule modules.
  
  =head1 VARIABLES
  
  =head2 $Log_Filter_Code => bool (default: from ENV or 0)
  
  If set to true, will log the generated filter code (currently using L<Log::ger>
  at trace level). To see the log message, e.g. to the screen, you can use
  something like:
  
   % TRACE=1 perl -MLog::ger::LevelFromEnv -MLog::ger::Output=Screen \
       -MData::Sah::FilterJS=gen_filter -E'my $c = gen_filter(...)'
  
  =head1 FUNCTIONS
  
  
  =head2 gen_filter
  
  Usage:
  
   gen_filter(%args) -> any
  
  Generate filter code.
  
  This is mostly for testing. Normally the filter rules will be used from
  L<Data::Sah>.
  
  This function is not exported by default, but exportable.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<filter_names> => I<array[str]>
  
  
  =back
  
  Return value:  (any)
  
  =head1 ENVIRONMENT
  
  =head2 LOG_SAH_FILTER_CODE => bool
  
  Set default for C<$Log_Filter_Code>.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah-Filter>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah-Filter>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah-Filter>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Data::Sah::Filter>
  
  L<App::SahUtils>, including L<filter-with-sah> to conveniently test filtering
  from the command-line.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_FILTERJS

    $main::fatpacked{"Data/Sah/Human.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_HUMAN';
  package Data::Sah::Human;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  #use Log::Any::IfLOG qw($log);
  
  our $Log_Validator_Code = $ENV{LOG_SAH_VALIDATOR_CODE} // 0;
  
  require Exporter;
  our @ISA       = qw(Exporter);
  our @EXPORT_OK = qw(gen_human_msg);
  
  sub gen_human_msg {
      require Data::Sah;
  
      my ($schema, $opts) = @_;
  
      state $hc = Data::Sah->new->get_compiler("human");
  
      my %args = (schema => $schema, %{$opts // {}});
      my $opt_source = delete $args{source};
  
      $args{log_result} = 1 if $Log_Validator_Code;
  
      my $cd = $hc->compile(%args);
      $opt_source ? $cd : $cd->{result};
  }
  
  1;
  # ABSTRACT: Some functions to use Data::Sah human compiler
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Human - Some functions to use Data::Sah human compiler
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Human (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =head1 SYNOPSIS
  
   use Data::Sah::Human qw(gen_human_msg);
  
   say gen_human_msg(["int*", min=>2]); # -> "Integer, minimum 2"
  
  =head1 DESCRIPTION
  
  =head1 FUNCTIONS
  
  None exported by default.
  
  =head2 gen_human_msg($schema, \%opts) => STR (or ANY)
  
  Compile schema using human compiler and return the result.
  
  Known options (unknown ones will be passed to the compiler):
  
  =over
  
  =item * source => BOOL (default: 0)
  
  If set to true, will return raw compilation result.
  
  =back
  
  =head1 ENVIRONMENT
  
  L<LOG_SAH_VALIDATOR_CODE>
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Data::Sah>, L<Data::Sah::Compiler::human>.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_HUMAN

    $main::fatpacked{"Data/Sah/Lang.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_LANG';
  package Data::Sah::Lang;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  
  our @ISA    = qw(Exporter);
  our @EXPORT = qw(add_translations);
  
  sub add_translations {
      my %args = @_;
  
      # XXX check caller package and determine language, fill translations in
      # %Data::Sah::Lang::<lang>::translations
  }
  
  1;
  # ABSTRACT: Language routines
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Lang - Language routines
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Lang (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage add_translations
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_LANG

    $main::fatpacked{"Data/Sah/Lang/fr_FR.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_LANG_FR_FR';
  package Data::Sah::Lang::fr_FR;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  
  use Tie::IxHash;
  
  # currently incomplete
  
  our %translations;
  tie %translations, 'Tie::IxHash', (
  
      # punctuations
  
      q[ ], # inter-word boundary
      q[ ],
  
      q[, ],
      q[, ],
  
      q[: ],
      q[: ],
  
      q[. ],
      q[. ],
  
      q[(],
      q[(],
  
      q[)],
      q[)],
  
      # modal verbs
  
      q[must],
      q[doit],
  
      q[must not],
      q[ne doit pas],
  
      q[should],
      q[devrait],
  
      q[should not],
      q[ne devrait pas],
  
      # field/fields/argument/arguments
  
      q[field],
      q[champ],
  
      q[fields],
      q[champs],
  
      q[argument],
      q[argument],
  
      q[arguments],
      q[arguments],
  
      # multi
  
      q[%s and %s],
      q[%s et %s],
  
      q[%s or %s],
      q[%s ou %s],
  
      q[one of %s],
      q[une des %s],
  
      q[all of %s],
      q[toutes les valeurs %s],
  
      q[%(modal_verb)s satisfy all of the following],
      q[%(modal_verb)s satisfaire à toutes les conditions suivantes],
  
      q[%(modal_verb)s satisfy one of the following],
      q[%(modal_verb)s satisfaire l'une des conditions suivantes],
  
      q[%(modal_verb)s satisfy none of the following],
      q[%(modal_verb)s satisfaire à aucune des conditions suivantes],
  
      # type: BaseType
  
      # type: Sortable
  
      # type: Comparable
  
      # type: HasElems
  
      # type: num
  
      # type: int
  
      q[integer],
      q[nombre entier],
  
      q[integers],
      q[nombres entiers],
  
      q[%(modal_verb)s be divisible by %s],
      q[%(modal_verb)s être divisible par %s],
  
      q[%(modal_verb)s leave a remainder of %2$s when divided by %1$s],
      q[%(modal_verb)s laisser un reste %2$s si divisé par %1$s],
  
      # messages for compiler
  );
  
  1;
  # ABSTRACT: fr_FR locale
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Lang::fr_FR - fr_FR locale
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Lang::fr_FR (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage .+
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_LANG_FR_FR

    $main::fatpacked{"Data/Sah/Lang/id_ID.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_LANG_ID_ID';
  package Data::Sah::Lang::id_ID;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  
  use Tie::IxHash;
  
  sub ordinate {
      my ($n, $noun) = @_;
      "$noun ke-$n";
  }
  
  our %translations;
  tie %translations, 'Tie::IxHash', (
  
      # punctuations
  
      q[ ], # inter-word boundary
      q[ ],
  
      q[, ],
      q[, ],
  
      q[: ],
      q[: ],
  
      q[. ],
      q[. ],
  
      q[(],
      q[(],
  
      q[)],
      q[)],
  
      # modal verbs
  
      q[must],
      q[harus],
  
      q[must not],
      q[tidak boleh],
  
      q[should],
      q[sebaiknya],
  
      q[should not],
      q[sebaiknya tidak],
  
      # field/fields/argument/arguments
  
      q[field],
      q[field],
  
      q[fields],
      q[field],
  
      q[argument],
      q[argumen],
  
      q[arguments],
      q[argumen],
  
      # multi
  
      q[%s and %s],
      q[%s dan %s],
  
      q[%s or %s],
      q[%s atau %s],
  
      q[%s nor %s],
      q[%s maupun %s],
  
      q[one of %s],
      q[salah satu dari %s],
  
      q[all of %s],
      q[semua dari nilai-nilai %s],
  
      q[any of %s],
      q[satupun dari %s],
  
      q[none of %s],
      q[tak satupun dari %s],
  
      q[%(modal_verb)s satisfy all of the following],
      q[%(modal_verb)s memenuhi semua ketentuan ini],
  
      q[%(modal_verb)s satisfy none all of the following],
      q[%(modal_verb)s melanggar semua ketentuan ini],
  
      q[%(modal_verb)s satisfy one of the following],
      q[%(modal_verb)s memenuhi salah satu ketentuan ini],
  
      # type: BaseType
  
      q[default value is %s],
      q[jika tidak diisi diset ke %s],
  
      q[required %s],
      q[%s wajib diisi],
  
      q[optional %s],
      q[%s opsional],
  
      q[forbidden %s],
      q[%s tidak boleh diisi],
  
      # type: Comparable
  
      q[%(modal_verb)s have the value %s],
      q[%(modal_verb)s bernilai %s],
  
      q[%(modal_verb)s be one of %s],
      q[%(modal_verb)s salah satu dari %s],
  
      # type: HasElems
  
      q[length %(modal_verb)s be %s],
      q[panjang %(modal_verb)s %s],
  
      q[length %(modal_verb)s be at least %s],
      q[panjang %(modal_verb)s minimal %s],
  
      q[length %(modal_verb)s be at most %s],
      q[panjang %(modal_verb)s maksimal %s],
  
      q[length %(modal_verb)s be between %s and %s],
      q[panjang %(modal_verb)s antara %s dan %s],
  
      q[%(modal_verb)s have %s in its elements],
      q[%(modal_verb)s mengandung %s di elemennya],
  
      # type: Sortable
  
      q[%(modal_verb)s be at least %s],
      q[%(modal_verb)s minimal %s],
  
      q[%(modal_verb)s be larger than %s],
      q[%(modal_verb)s lebih besar dari %s],
  
      q[%(modal_verb)s be at most %s],
      q[%(modal_verb)s maksimal %s],
  
      q[%(modal_verb)s be smaller than %s],
      q[%(modal_verb)s lebih kecil dari %s],
  
      q[%(modal_verb)s be between %s and %s],
      q[%(modal_verb)s antara %s dan %s],
  
      q[%(modal_verb)s be larger than %s and smaller than %s],
      q[%(modal_verb)s lebih besar dari %s dan lebih kecil dari %s],
  
      # type: undef
  
      q[undefined value],
      q[nilai tak terdefinisi],
  
      q[undefined values],
      q[nilai tak terdefinisi],
  
      # type: all
  
      q[%(modal_verb)s be %s],
      q[%(modal_verb)s %s],
  
      q[as well as %s],
      q[juga %s],
  
      q[%(modal_verb)s be all of the following],
      q[%(modal_verb)s merupakan semua ini],
  
      # type: any
  
      q[%(modal_verb)s be either %s],
      q[%s],
  
      q[or %s],
      q[atau %s],
  
      q[%(modal_verb)s be one of the following],
      q[%(modal_verb)s merupakan salah satu dari],
  
      # type: array
  
      q[array],
      q[larik],
  
      q[arrays],
      q[larik],
  
      q[%s of %s],
      q[%s %s],
  
      q[each array element %(modal_verb)s be],
      q[setiap elemen larik %(modal_verb)s],
  
      q[%s %(modal_verb)s be],
      q[%s %(modal_verb)s],
  
      q[element],
      q[elemen],
  
      q[each array subscript %(modal_verb)s be],
      q[setiap subskrip larik %(modal_verb)s],
  
      # type: bool
  
      q[boolean value],
      q[nilai boolean],
  
      q[boolean values],
      q[nilai boolean],
  
      q[%(modal_verb)s be true],
      q[%(modal_verb)s bernilai benar],
  
      q[%(modal_verb)s be false],
      q[%(modal_verb)s bernilai salah],
  
      # type: code
  
      q[code],
      q[kode],
  
      q[codes],
      q[kode],
  
      # type: float
  
      q[decimal number],
      q[bilangan desimal],
  
      q[decimal numbers],
      q[bilangan desimal],
  
      q[%(modal_verb)s be a NaN],
      q[%(modal_verb)s NaN],
  
      q[%(modal_verb_neg)s be a NaN],
      q[%(modal_verb_neg)s NaN],
  
      q[%(modal_verb)s be an infinity],
      q[%(modal_verb)s tak hingga],
  
      q[%(modal_verb_neg)s be an infinity],
      q[%(modal_verb_neg)s tak hingga],
  
      q[%(modal_verb)s be a positive infinity],
      q[%(modal_verb)s positif tak hingga],
  
      q[%(modal_verb_neg)s be a positive infinity],
      q[%(modal_verb_neg)s positif tak hingga],
  
      q[%(modal_verb)s be a negative infinity],
      q[%(modal_verb)s negatif tak hingga],
  
      q[%(modal_verb)s be a negative infinity],
      q[%(modal_verb)s negatif tak hingga],
  
      # type: hash
  
      q[hash],
      q[hash],
  
      q[hashes],
      q[hash],
  
      q[field %s %(modal_verb)s be],
      q[field %s %(modal_verb)s],
  
      q[field name %(modal_verb)s be],
      q[nama field %(modal_verb)s],
  
      q[each field %(modal_verb)s be],
      q[setiap field %(modal_verb)s],
  
      q[hash contains unknown field(s) (%s)],
      q[hash mengandung field yang tidak dikenali (%s)],
  
      q[hash contains unknown field(s) (%s)],
      q[hash mengandung field yang tidak dikenali (%s)],
  
      q[%(modal_verb)s have required fields %s],
      q[%(modal_verb)s mengandung field wajib %s],
  
      q[hash has missing required field(s) (%s)],
      q[hash kekurangan field wajib (%s)],
  
      q[%(modal_verb)s have %s in its field values],
      q[%(modal_verb)s mengandung %s di nilai field],
  
      q[%(modal_verb)s only have these allowed fields %s],
      q[%(modal_verb)s hanya mengandung field yang diizinkan %s],
  
      q[%(modal_verb)s only have fields matching regex pattern %s],
      q[%(modal_verb)s hanya mengandung field yang namanya mengikuti pola regex %s],
  
      q[%(modal_verb_neg)s have these forbidden fields %s],
      q[%(modal_verb_neg)s mengandung field yang dilarang %s],
  
      q[%(modal_verb_neg)s have fields matching regex pattern %s],
      q[%(modal_verb_neg)s mengandung field yang namanya mengikuti pola regex %s],
  
      q[hash contains non-allowed field(s) (%s)],
      q[hash mengandung field yang tidak diizinkan (%s)],
  
      q[hash contains forbidden field(s) (%s)],
      q[hash mengandung field yang dilarang (%s)],
  
      q[fields whose names match regex pattern %s %(modal_verb)s be],
      q[field yang namanya cocok dengan pola regex %s %(modal_verb)s],
  
      # type: int
  
      q[integer],
      q[bilangan bulat],
  
      q[integers],
      q[bilangan bulat],
  
      q[%(modal_verb)s be divisible by %s],
      q[%(modal_verb)s dapat dibagi oleh %s],
  
      q[%(modal_verb)s be odd],
      q[%(modal_verb)s ganjil],
  
      q[%(modal_verb)s be even],
      q[%(modal_verb)s genap],
  
      q[%(modal_verb)s leave a remainder of %2$s when divided by %1$s],
      q[jika dibagi %1$s %(modal_verb)s menyisakan %2$s],
  
      # type: num
  
      q[number],
      q[bilangan],
  
      q[numbers],
      q[bilangan],
  
      # type: obj
  
      q[object],
      q[objek],
  
      q[objects],
      q[objek],
  
      # type: re
  
      q[regex pattern],
      q[pola regex],
  
      q[regex patterns],
      q[pola regex],
  
      # type: str
  
      q[text],
      q[teks],
  
      q[texts],
      q[teks],
  
      q[%(modal_verb)s match regex pattern %s],
      q[%(modal_verb)s cocok dengan pola regex %s],
  
      q[%(modal_verb)s be a regex pattern],
      q[%(modal_verb)s pola regex],
  
      q[each subscript of text %(modal_verb)s be],
      q[setiap subskrip dari teks %(modal_verb)s],
  
      q[each character of the text %(modal_verb)s be],
      q[setiap karakter dari teks %(modal_verb)s],
  
      q[character],
      q[karakter],
  
      # type: cistr
  
      # type: buf
  
      q[buffer],
      q[buffer],
  
      q[buffers],
      q[buffer],
  
      # messages for compiler
  
      q[Does not satisfy the following schema: %s],
      q[Tidak memenuhi skema ini: %s],
  
      q[Not of type %s],
      q[Tidak bertipe %s],
  
      q[Required but not specified],
      q[Wajib tapi belum diisi],
  
      q[Forbidden but specified],
      q[Dilarang tapi diisi],
  
      q[Structure contains unknown field(s) [%%s]],
      q[Struktur mengandung field yang tidak dikenal [%%s]],
  
      q[Cannot coerce data to %s [%s]],
      q[Data tidak dapat dikonversi ke %s [%%s]],
  );
  
  1;
  # ABSTRACT: id_ID locale
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Lang::id_ID - id_ID locale
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Lang::id_ID (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage .+
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_LANG_ID_ID

    $main::fatpacked{"Data/Sah/Lang/zh_CN.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_LANG_ZH_CN';
  package Data::Sah::Lang::zh_CN;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use 5.010;
  use strict;
  use utf8;
  use warnings;
  
  use Tie::IxHash;
  
  # currently incomplete
  
  our %translations;
  tie %translations, 'Tie::IxHash', (
  
      # punctuations
  
      q[ ], # inter-word boundary
      q[],
  
      q[, ],
      q[，],
  
      q[: ],
      q[：],
  
      q[. ],
      q[。],
  
      q[(],
      q[（],
  
      q[)],
      q[）],
  
      # modal verbs
  
      q[must],
      q[必须],
  
      q[must not],
      q[必须不],
  
      q[should],
      q[应],
  
      q[should not],
      q[应不],
  
      # field/fields/argument/arguments
  
      q[field],
      q[字段],
  
      q[fields],
      q[字段],
  
      q[argument],
      q[参数],
  
      q[arguments],
      q[参数],
  
      # multi
  
      q[%s and %s],
      q[%s和%s],
  
      q[%s or %s],
      q[%s或%s],
  
      q[one of %s],
      q[这些值%s之一],
  
      q[all of %s],
      q[所有这些值%s],
  
      q[%(modal_verb)s satisfy all of the following],
      q[%(modal_verb)s满足所有这些条件],
  
      q[%(modal_verb)s satisfy one of the following],
      q[%(modal_verb)s满足这些条件之一],
  
      q[%(modal_verb)s satisfy none of the following],
      q[%(modal_verb_neg)s满足所有这些条件],
  
      # type: BaseType
  
      # type: Sortable
  
      # type: Comparable
  
      # type: HasElems
  
      # type: num
  
      # type: int
  
      q[integer],
      q[整数],
  
      q[integers],
      q[整数],
  
      q[%(modal_verb)s be divisible by %s],
      q[%(modal_verb)s被%s整除],
  
      q[%(modal_verb)s leave a remainder of %2$s when divided by %1$s],
      q[除以%1$s时余数%(modal_verb)s为%2$s],
  
      # messages for compiler
  );
  
  1;
  # ABSTRACT: zh_CN locale
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Lang::zh_CN - zh_CN locale
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Lang::zh_CN (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage .+
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_LANG_ZH_CN

    $main::fatpacked{"Data/Sah/Normalize.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_NORMALIZE';
  package Data::Sah::Normalize;
  
  use 5.010001;
  use strict;
  use warnings;
  
  our $DATE = '2018-09-10'; # DATE
  our $VERSION = '0.050'; # VERSION
  
  require Exporter;
  our @ISA       = qw(Exporter);
  our @EXPORT_OK = qw(
                         normalize_clset
                         normalize_schema
  
                         $type_re
                         $clause_name_re
                         $clause_re
                         $attr_re
                         $funcset_re
                         $compiler_re
                 );
  
  our $type_re        = qr/\A(?:[A-Za-z_]\w*::)*[A-Za-z_]\w*\z/;
  our $clause_name_re = qr/\A[A-Za-z_]\w*\z/;
  our $clause_re      = qr/\A[A-Za-z_]\w*(?:\.[A-Za-z_]\w*)*\z/;
  our $attr_re        = $clause_re;
  our $funcset_re     = qr/\A(?:[A-Za-z_]\w*::)*[A-Za-z_]\w*\z/;
  our $compiler_re    = qr/\A[A-Za-z_]\w*\z/;
  our $clause_attr_on_empty_clause_re = qr/\A(?:\.[A-Za-z_]\w*)+\z/;
  
  sub normalize_clset($;$) {
      my ($clset0, $opts) = @_;
      $opts //= {};
  
      my $clset = {};
      for my $c (sort keys %$clset0) {
          my $c0 = $c;
  
          my $v = $clset0->{$c};
  
          # ignore expression
          my $expr;
          if ($c =~ s/=\z//) {
              $expr++;
              # XXX currently can't disregard merge prefix when checking
              # conflict
              die "Conflict between '$c=' and '$c'" if exists $clset0->{$c};
              $clset->{"$c.is_expr"} = 1;
              }
  
          my $sc = "";
          my $cn;
          {
              my $errp = "Invalid clause name syntax '$c0'"; # error prefix
              if (!$expr && $c =~ s/\A!(?=.)//) {
                  die "$errp, syntax should be !CLAUSE"
                      unless $c =~ $clause_name_re;
                  $sc = "!";
              } elsif (!$expr && $c =~ s/(?<=.)\|\z//) {
                  die "$errp, syntax should be CLAUSE|"
                      unless $c =~ $clause_name_re;
                  $sc = "|";
              } elsif (!$expr && $c =~ s/(?<=.)\&\z//) {
                  die "$errp, syntax should be CLAUSE&"
                      unless $c =~ $clause_name_re;
                  $sc = "&";
              } elsif (!$expr && $c =~ /\A([^.]+)(?:\.(.+))?\((\w+)\)\z/) {
                  my ($c2, $a, $lang) = ($1, $2, $3);
                  die "$errp, syntax should be CLAUSE(LANG) or C.ATTR(LANG)"
                      unless $c2 =~ $clause_name_re &&
                          (!defined($a) || $a =~ $attr_re);
                  $sc = "(LANG)";
                  $cn = $c2 . (defined($a) ? ".$a" : "") . ".alt.lang.$lang";
              } elsif ($c !~ $clause_re &&
                           $c !~ $clause_attr_on_empty_clause_re) {
                  die "$errp, please use letter/digit/underscore only";
              }
          }
  
          # XXX can't disregard merge prefix when checking conflict
          if ($sc eq '!') {
              die "Conflict between clause shortcuts '!$c' and '$c'"
                  if exists $clset0->{$c};
              die "Conflict between clause shortcuts '!$c' and '$c|'"
                  if exists $clset0->{"$c|"};
              die "Conflict between clause shortcuts '!$c' and '$c&'"
                  if exists $clset0->{"$c&"};
              $clset->{$c} = $v;
              $clset->{"$c.op"} = "not";
          } elsif ($sc eq '&') {
              die "Conflict between clause shortcuts '$c&' and '$c'"
                  if exists $clset0->{$c};
              die "Conflict between clause shortcuts '$c&' and '$c|'"
                  if exists $clset0->{"$c|"};
              die "Clause 'c&' value must be an array"
                  unless ref($v) eq 'ARRAY';
              $clset->{$c} = $v;
              $clset->{"$c.op"} = "and";
          } elsif ($sc eq '|') {
              die "Conflict between clause shortcuts '$c|' and '$c'"
                  if exists $clset0->{$c};
              die "Clause 'c|' value must be an array"
                  unless ref($v) eq 'ARRAY';
              $clset->{$c} = $v;
              $clset->{"$c.op"} = "or";
          } elsif ($sc eq '(LANG)') {
              die "Conflict between clause '$c' and '$cn'"
                  if exists $clset0->{$cn};
              $clset->{$cn} = $v;
          } else {
              $clset->{$c} = $v;
          }
  
      }
      $clset->{req} = 1 if $opts->{has_req};
  
      # XXX option to recursively normalize clset, any's of, all's of, ...
      #if ($clset->{clset}) {
      #    local $opts->{has_req};
      #    if ($clset->{'clset.op'} && $clset->{'clset.op'} =~ /and|or/) {
      #        # multiple clause sets
      #        $clset->{clset} = map { $self->normalize_clset($_, $opts) }
      #            @{ $clset->{clset} };
      #    } else {
      #        $clset->{clset} = $self->normalize_clset($_, $opts);
      #    }
      #}
  
      $clset;
  }
  
  sub normalize_schema($) {
      my $s = shift;
  
      my $ref = ref($s);
      if (!defined($s)) {
  
          die "Schema is missing";
  
      } elsif (!$ref) {
  
          my $has_req = $s =~ s/\*\z//;
          $s =~ $type_re or die "Invalid type syntax $s, please use ".
              "letter/digit/underscore only";
          return [$s, $has_req ? {req=>1} : {}, {}];
  
      } elsif ($ref eq 'ARRAY') {
  
          my $t = $s->[0];
          my $has_req = $t && $t =~ s/\*\z//;
          if (!defined($t)) {
              die "For array form, at least 1 element is needed for type";
          } elsif (ref $t) {
              die "For array form, first element must be a string";
          }
          $t =~ $type_re or die "Invalid type syntax $s, please use ".
              "letter/digit/underscore only";
  
          my $clset0;
          my $extras;
          if (defined($s->[1])) {
              if (ref($s->[1]) eq 'HASH') {
                  $clset0 = $s->[1];
                  $extras = $s->[2];
                  die "For array form, there should not be more than 3 elements"
                      if @$s > 3;
              } else {
                  # flattened clause set [t, c=>1, c2=>2, ...]
                  die "For array in the form of [t, c1=>1, ...], there must be ".
                      "3 elements (or 5, 7, ...)"
                          unless @$s % 2;
                  $clset0 = { @{$s}[1..@$s-1] };
              }
          } else {
              $clset0 = {};
          }
  
          # check clauses and parse shortcuts (!c, c&, c|, c=)
          my $clset = normalize_clset($clset0, {has_req=>$has_req});
          if (defined $extras) {
              die "For array form with 3 elements, extras must be hash"
                  unless ref($extras) eq 'HASH';
              die "'def' in extras must be a hash"
                  if exists $extras->{def} && ref($extras->{def}) ne 'HASH';
              return [$t, $clset, { %{$extras} }];
          } else {
              return [$t, $clset, {}];
          }
      }
  
      die "Schema must be a string or arrayref (not $ref)";
  }
  
  1;
  # ABSTRACT: Normalize Sah schema
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Normalize - Normalize Sah schema
  
  =head1 VERSION
  
  This document describes version 0.050 of Data::Sah::Normalize (from Perl distribution Data-Sah-Normalize), released on 2018-09-10.
  
  =head1 SYNOPSIS
  
   use Data::Sah::Normalize qw(normalize_clset normalize_schema);
  
   my $nclset = normalize_clset({'!a'=>1}); # -> {a=>1, 'a.op'=>'not'}
   my $nsch   = normalize_schema("int");    # -> ["int", {}, {}]
  
  =head1 DESCRIPTION
  
  This often-needed functionality is split from the main L<Data::Sah> to keep it
  in a small and minimal-dependencies package.
  
  =head1 FUNCTIONS
  
  =head2 normalize_clset($clset) => HASH
  
  Normalize a clause set (hash). Return a shallow copy of the original hash. Die
  on failure.
  
  TODO: option to recursively normalize clause which contains sah clauses (e.g.
  C<of>).
  
  =head2 normalize_schema($sch) => ARRAY
  
  Normalize a Sah schema (scalar or array). Return an array. Produce a 2-level
  copy of schema, so it's safe to add/delete/modify the normalized schema's clause
  set and extras (but clause set's and extras' values are still references to the
  original). Die on failure.
  
  TODO: recursively normalize clause which contains sah clauses (e.g. C<of>).
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah-Normalize>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah-Normalize>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah-Normalize>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Sah>, L<Data::Sah>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2018, 2015, 2014 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_NORMALIZE

    $main::fatpacked{"Data/Sah/Resolve.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_RESOLVE';
  package Data::Sah::Resolve;
  
  our $DATE = '2017-04-19'; # DATE
  our $VERSION = '0.007'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  use Exporter qw(import);
  our @EXPORT_OK = qw(resolve_schema);
  
  sub _resolve {
      my ($opts, $type, $clsets, $seen) = @_;
  
      die "Recursive schema definition: ".join(" -> ", @$seen, $type)
          if grep { $type eq $_ } @$seen;
      push @$seen, $type;
  
      (my $typemod_pm = "Data/Sah/Type/$type.pm") =~ s!::!/!g;
      eval { require $typemod_pm; 1 };
      my $err = $@;
      # already a builtin-type, so just return the schema's type name & clause set
      return [$type, $clsets] unless $err;
      die "Can't check whether $type is a builtin Sah type: $err"
          unless $err =~ /\ACan't locate/;
  
      # not a type, try a schema under Sah::Schema
      my $schmod = "Sah::Schema::$type";
      (my $schmod_pm = "$schmod.pm") =~ s!::!/!g;
      eval { require $schmod_pm; 1 };
      die "Not a known built-in Sah type '$type' (can't locate ".
          "Data::Sah::Type::$type) and not a known schema name '$type' ($@)"
              if $@;
      no strict 'refs';
      my $sch2 = ${"$schmod\::schema"};
      die "BUG: Schema module $schmod doesn't contain \$schema" unless $sch2;
      unshift @$clsets, $sch2->[1];
      _resolve($opts, $sch2->[0], $clsets, $seen);
  }
  
  sub resolve_schema {
      my $opts = ref($_[0]) eq 'HASH' ? shift : {};
      my $sch = shift;
  
      unless ($opts->{schema_is_normalized}) {
          require Data::Sah::Normalize;
          $sch =  Data::Sah::Normalize::normalize_schema($sch);
      }
      $opts->{merge_clause_sets} //= 1;
  
      my $seen = [];
      my $res = _resolve($opts, $sch->[0], keys(%{$sch->[1]}) ? [$sch->[1]] : [], $seen);
  
    MERGE:
      {
          last unless $opts->{merge_clause_sets};
          last if @{ $res->[1] } < 2;
  
          my @clsets = (shift @{ $res->[1] });
          for my $clset (@{ $res->[1] }) {
              my $has_merge_mode_keys;
              for (keys %$clset) {
                  if (/\Amerge\./) {
                      $has_merge_mode_keys = 1;
                      last;
                  }
              }
              if ($has_merge_mode_keys) {
                  state $merger = do {
                      require Data::ModeMerge;
                      my $mm = Data::ModeMerge->new(config => {
                          recurse_array => 1,
                      });
                      $mm->modes->{NORMAL}  ->prefix   ('merge.normal.');
                      $mm->modes->{NORMAL}  ->prefix_re(qr/\Amerge\.normal\./);
                      $mm->modes->{ADD}     ->prefix   ('merge.add.');
                      $mm->modes->{ADD}     ->prefix_re(qr/\Amerge\.add\./);
                      $mm->modes->{CONCAT}  ->prefix   ('merge.concat.');
                      $mm->modes->{CONCAT}  ->prefix_re(qr/\Amerge\.concat\./);
                      $mm->modes->{SUBTRACT}->prefix   ('merge.subtract.');
                      $mm->modes->{SUBTRACT}->prefix_re(qr/\Amerge\.subtract\./);
                      $mm->modes->{DELETE}  ->prefix   ('merge.delete.');
                      $mm->modes->{DELETE}  ->prefix_re(qr/\Amerge\.delete\./);
                      $mm->modes->{KEEP}    ->prefix   ('merge.keep.');
                      $mm->modes->{KEEP}    ->prefix_re(qr/\Amerge\.keep\./);
                      $mm;
                  };
                  my $merge_res = $merger->merge($clsets[-1], $clset);
                  unless ($merge_res->{success}) {
                      die "Can't merge clause set: $merge_res->{error}";
                  }
                  $clsets[-1] = $merge_res->{result};
              } else {
                  push @clsets, $clset;
              }
          }
  
          $res->[1] = \@clsets;
      }
  
      $res->[2] = $seen if $opts->{return_intermediates};
  
      $res;
  }
  
  1;
  # ABSTRACT: Resolve Sah schema
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Resolve - Resolve Sah schema
  
  =head1 VERSION
  
  This document describes version 0.007 of Data::Sah::Resolve (from Perl distribution Data-Sah-Resolve), released on 2017-04-19.
  
  =head1 SYNOPSIS
  
   use Data::Sah::Resolve qw(resolve_schema);
  
   my $sch = resolve_schema("int");
   # => ["int", []]
  
   my $sch = resolve_schema("posint*");
   # => ["int", [{min=>1}, {req=>1}]
  
   my $sch = resolve_schema([posint => div_by => 3]);
   # => ["int", {min=>1}, {div_by=>3}]
  
   my $sch = resolve_schema(["posint", "merge.delete.min"=>undef, div_by => 3]);
   # => ["int", {div_by=>3}]
  
  =head1 DESCRIPTION
  
  =head1 FUNCTIONS
  
  =head2 resolve_schema([ \%opts, ] $sch) => sch
  
  Sah schemas can be defined in terms of other schemas. The resolving process
  follows the base schema recursively until it finds a builtin type as the base.
  
  This routine performs the following steps:
  
  =over
  
  =item 1. Normalize the schema
  
  Unless C<schema_is_normalized> option is true, in which case schema is assumed
  to be normalized already.
  
  =item 2. Check if the schema's type is a builtin type
  
  Currently this is done by checking if the module of the name C<<
  Data::Sah::Type::<type> >> is loadable. If it is a builtin type then we are
  done.
  
  =item 3. Check if the schema's type is the name of another schema
  
  This is done by checking if C<< Sah::Schema::<name> >> module exists and is
  loadable. If this is the case then we retrieve the base schema from the
  C<$schema> variable in the C<< Sah::Schema::<name> >> package and repeat the
  process while accumulating and/or merging the clause sets.
  
  =item 4. If schema's type is neither, we die.
  
  =back
  
  Returns C<< [base_type, clause_sets] >>. If C<return_intermediates> option is
  true, then the third elements will be the list of intermediate schema names.
  
  Example 1: C<int>.
  
  First we normalize to C<< ["int",{},{}] >>. The type is C<int> and it is a
  builtin type (L<Data::Sah::Type::int> exists) so the final result is C<< ["int",
  []] >>.
  
  Example 2: C<posint*>.
  
  First we normalize to C<< ["posint",{req=>1},{}] >>. The type is C<posint> and
  it is the name of another schema (L<Sah::Schema::posint>). We retrieve the
  schema which is C<< ["int", {summary=>"Positive integer (1,2,3,...)", min=>1},
  {}] >>. We now try to resolve C<int> and find that it's a builtin type. So the
  final result is: C<< ["int", [ {req=>1}, {summary=>"Positive integer
  (1,2,3,...)", min=>1} ]] >>.
  
  Known options:
  
  =over
  
  =item * schema_is_normalized => bool (default: 0)
  
  When set to true, function will skip normalizing schema and assume input schema
  is normalized.
  
  =item * merge_clause_sets => bool (default: 1)
  
  =item * return_intermediates => bool
  
  =back
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah-Resolve>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah-Resolve>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah-Resolve>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Sah>, L<Data::Sah>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2017, 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_RESOLVE

    $main::fatpacked{"Data/Sah/Type/BaseType.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_TYPE_BASETYPE';
  package Data::Sah::Type::BaseType;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-02-12'; # DATE
  our $DIST = 'Data-Sah'; # DIST
  our $VERSION = '0.907'; # VERSION
  
  # why name it BaseType instead of Base? because I'm sick of having 5 files named
  # Base.pm in my editor (there would be Type::Base and the various
  # Compiler::*::Type::Base).
  
  use 5.010;
  use strict;
  use warnings;
  
  use Data::Sah::Util::Role 'has_clause';
  use Role::Tiny;
  #use Sah::Schema::Common;
  #use Sah::Schema::Sah;
  
  our $sch_filter_elem = ['any', {of=>[
      ['str', {req=>1}, {}],
      ['array', {req=>1, len=>2, elems=>[ ['str',{req=>1},{}], ['hash',{req=>1}, {}] ]}, {}],
  ]}, {}];
  
  requires 'handle_type';
  
  has_clause 'v',
      v => 2,
      prio   => 0,
      tags   => ['meta', 'defhash'],
      schema => ['float'=>{req=>1, is=>1}, {}],
      ;
  
  has_clause 'defhash_v',
      v => 2,
      prio   => 0,
      tags   => ['meta', 'defhash'],
      schema => ['float'=>{req=>1, is=>1}, {}],
      ;
  
  has_clause 'schema_v',
      v => 2,
      prio   => 0,
      tags   => ['meta'],
      schema => ['float'=>{req=>1}, {}],
      ;
  
  has_clause 'base_v',
      v => 2,
      prio   => 0,
      tags   => ['meta'],
      schema => ['float'=>{req=>1}, {}],
      ;
  
  has_clause 'ok',
      v => 2,
      tags       => ['constraint'],
      prio       => 1,
      schema     => ['any', {}, {}],
      allow_expr => 1,
      ;
  has_clause 'default',
      v => 2,
      prio       => 1,
      tags       => ['default'],
      schema     => ['any', {}, {}],
      allow_expr => 1,
      attrs      => {
          temp => {
              schema     => [bool => {default=>0}, {}],
              allow_expr => 0,
          },
      },
      ;
  has_clause 'prefilters',
      v => 2,
      tags       => ['filter'],
      prio       => 10,
      schema      => ['array' => {of=>$sch_filter_elem}, {}],
      attrs      => {
          temp => {
          },
      }
      ;
  has_clause 'default_lang',
      v => 2,
      tags       => ['meta', 'defhash'],
      prio       => 2,
      schema     => ['str'=>{req=>1, default=>'en_US'}, {}],
      ;
  has_clause 'name',
      v => 2,
      tags       => ['meta', 'defhash'],
      prio       => 2,
      schema     => ['str', {req=>1}, {}],
      ;
  has_clause 'summary',
      v => 2,
      prio       => 2,
      tags       => ['meta', 'defhash'],
      schema     => ['str', {req=>1}, {}],
      ;
  has_clause 'description',
      v => 2,
      tags       => ['meta', 'defhash'],
      prio       => 2,
      schema     => ['str', {req=>1}, {}],
      ;
  has_clause 'tags',
      v => 2,
      tags       => ['meta', 'defhash'],
      prio       => 2,
      schema     => ['array', {of=>['str', {req=>1}, {}]}, {}],
      ;
  has_clause 'req',
      v => 2,
      tags       => ['constraint'],
      prio       => 3,
      schema     => ['bool', {}, {}],
      allow_expr => 1,
      ;
  has_clause 'forbidden',
      v => 2,
      tags       => ['constraint'],
      prio       => 3,
      schema     => ['bool', {}, {}],
      allow_expr => 1,
      ;
  has_clause 'if',
      v => 2,
      tags       => ['constraint'],
      prio       => 50,
      schema     => ['array', {}, {}], # XXX elems: [str|array|hash, str|array|hash, [ str|array|hash ]]
      allow_expr => 0,
  ;
  
  #has_clause 'each', tags=>['constraint'];
  
  #has_clause 'check_each', tags=>['constraint'];
  
  #has_clause 'exists', tags=>['constraint'];
  
  #has_clause 'check_exists', tags=>['constraint'];
  
  #has_clause 'check', schema=>['sah::expr',{req=>1},{}], tags=>['constraint'];
  
  has_clause 'clause',
      v => 2,
      tags       => ['constraint'],
      prio       => 50,
      schema     => ['array' => {req=>1, len=>2, elems => [
          ['sah::clname', {req=>1}, {}],
          ['any', {}, {}],
      ]}, {}],
      ;
  has_clause 'clset',
      v => 2,
      prio   => 50,
      tags   => ['constraint'],
      schema => ['sah::clset', {req=>1}, {}],
      ;
  has_clause 'postfilters',
      v => 2,
      tags       => ['filter'],
      prio       => 90,
      schema     => ['array' => {req=>1, of=>$sch_filter_elem}, {}],
      attrs      => {
      }
      ;
  has_clause 'examples',
      v => 2,
      tags       => ['meta'],
      prio       => 99,
      schema     => ['array', {of=>['any', {}, {}]}, {}], # XXX non-hash or defhash with 'value' property specified
      ;
  has_clause 'invalid_examples',
      v => 2,
      tags       => ['meta'],
      prio       => 99,
      schema     => ['array', {of=>['any', {}, {}]}, {}], # XXX non-hash or defhash with 'value' property specified
      ;
  
  1;
  # ABSTRACT: Base type
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Type::BaseType - Base type
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Type::BaseType (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(clause_.+|clausemeta_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_TYPE_BASETYPE

    $main::fatpacked{"Data/Sah/Type/Comparable.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_TYPE_COMPARABLE';
  package Data::Sah::Type::Comparable;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use Data::Sah::Util::Role 'has_clause';
  use Role::Tiny;
  
  requires 'superclause_comparable';
  
  has_clause 'in',
      v => 2,
      tags       => ['constraint'],
      schema     => ['array', {req=>1, of=>['_same', {req=>1}, {}]}, {}],
      allow_expr => 1,
      code       => sub {
          my ($self, $cd) = @_;
          $self->superclause_comparable('in', $cd);
      };
  has_clause 'is',
      v => 2,
      tags       => ['constraint'],
      schema     => ['_same', {req=>1}, {}],
      allow_expr => 1,
      code       => sub {
          my ($self, $cd) = @_;
          $self->superclause_comparable('is', $cd);
      };
  
  1;
  # ABSTRACT: Comparable type role
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Type::Comparable - Comparable type role
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Type::Comparable (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =head1 DESCRIPTION
  
  Role consumer must provide method C<superclause_comparable> which will be given
  normal C<%args> given to clause methods, but with extra key C<-which> (either
  C<in>, C<is>).
  
  =for Pod::Coverage ^(clause_.+|clausemeta_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_TYPE_COMPARABLE

    $main::fatpacked{"Data/Sah/Type/HasElems.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_TYPE_HASELEMS';
  package Data::Sah::Type::HasElems;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use Data::Sah::Util::Role 'has_clause';
  use Role::Tiny;
  
  requires 'superclause_has_elems';
  
  has_clause 'max_len',
      v => 2,
      prio       => 51,
      tags       => ['constraint'],
      schema     => ['int', {min=>0}, {}],
      allow_expr => 1,
      code       => sub {
          my ($self, $cd) = @_;
          $self->superclause_has_elems('max_len', $cd);
      };
  
  has_clause 'min_len',
      v => 2,
      tags       => ['constraint'],
      schema     => ['int', {min=>0}, {}],
      allow_expr => 1,
      code       => sub {
          my ($self, $cd) = @_;
          $self->superclause_has_elems('min_len', $cd);
      };
  
  has_clause 'len_between',
      v => 2,
      tags       => ['constraint'],
      schema     => ['array' => {req=>1, len=>2, elems => [
          [int => {req=>1}, {}],
          [int => {req=>1}, {}],
      ]}, {}],
      allow_expr => 1,
      code       => sub {
          my ($self, $cd) = @_;
          $self->superclause_has_elems('len_between', $cd);
      };
  
  has_clause 'len',
      v => 2,
      tags       => ['constraint'],
      schema     => ['int', {min=>0}, {}],
      allow_expr => 1,
      code       => sub {
          my ($self, $cd) = @_;
          $self->superclause_has_elems('len', $cd);
      };
  
  has_clause 'has',
      v => 2,
      tags       => ['constraint'],
      schema       => ['_same_elem', {req=>1}, {}],
      inspect_elem => 1,
      prio         => 55, # we should wait for clauses like e.g. 'each_elem' to coerce elements
      allow_expr   => 1,
      code         => sub {
          my ($self, $cd) = @_;
          $self->superclause_has_elems('has', $cd);
      };
  
  has_clause 'each_index',
      v => 2,
      tags       => ['constraint'],
      schema     => ['sah::schema', {req=>1}, {}],
      subschema  => sub { $_[0] },
      allow_expr => 0,
      code       => sub {
          my ($self, $cd) = @_;
          $self->superclause_has_elems('each_index', $cd);
      };
  
  has_clause 'each_elem',
      v => 2,
      tags       => ['constraint'],
      schema     => ['sah::schema', {req=>1}, {}],
      inspect_elem => 1,
      subschema  => sub { $_[0] },
      allow_expr => 0,
      code       => sub {
          my ($self, $cd) = @_;
          $self->superclause_has_elems('each_elem', $cd);
      };
  
  has_clause 'check_each_index',
      v => 2,
      tags       => ['constraint'],
      schema     => ['sah::schema', {req=>1}, {}],
      subschema  => sub { $_[0] },
      allow_expr => 0,
      code       => sub {
          my ($self, $cd) = @_;
          $self->superclause_has_elems('check_each_index', $cd);
      };
  
  has_clause 'check_each_elem',
      v => 2,
      tags       => ['constraint'],
      schema     => ['sah::schema', {req=>1}, {}],
      inspect_elem => 1,
      subschema  => sub { $_[0] },
      allow_expr => 0,
      code       => sub {
          my ($self, $cd) = @_;
          $self->superclause_has_elems('check_each_elem', $cd);
      };
  
  has_clause 'uniq',
      v => 2,
      tags       => ['constraint'],
      schema     => ['bool', {}, {}],
      inspect_elem => 1,
      prio         => 55, # we should wait for clauses like e.g. 'each_elem' to coerce elements
      subschema  => sub { $_[0] },
      allow_expr => 1,
      code       => sub {
          my ($self, $cd) = @_;
          $self->superclause_has_elems('uniq', $cd);
      };
  
  has_clause 'exists',
      v => 2,
      tags       => ['constraint'],
      schema     => ['sah::schema', {req=>1}, {}],
      inspect_elem => 1,
      subschema  => sub { $_[0] },
      allow_expr => 0,
      code       => sub {
          my ($self, $cd) = @_;
          $self->superclause_has_elems('exists', $cd);
      };
  
  # has_prop 'len';
  
  # has_prop 'elems';
  
  # has_prop 'indices';
  
  1;
  # ABSTRACT: HasElems role
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Type::HasElems - HasElems role
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Type::HasElems (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(clause_.+|clausemeta_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_TYPE_HASELEMS

    $main::fatpacked{"Data/Sah/Type/Sortable.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_TYPE_SORTABLE';
  package Data::Sah::Type::Sortable;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use Data::Sah::Util::Role 'has_clause';
  use Role::Tiny;
  
  requires 'superclause_sortable';
  
  has_clause 'min',
      v => 2,
      tags       => ['constraint'],
      schema     => ['_same', {req=>1}, {}],
      allow_expr => 1,
      code       => sub {
          my ($self, $cd) = @_;
          $self->superclause_sortable('min', $cd);
      },
      ;
  has_clause 'xmin',
      v => 2,
      tags       => ['constraint'],
      schema     => ['_same', {req=>1}, {}],
      allow_expr => 1,
      code       => sub {
          my ($self, $cd) = @_;
          $self->superclause_sortable('xmin', $cd);
      },
      ;
  has_clause 'max',
      v => 2,
      prio       => 51,
      tags       => ['constraint'],
      schema     => ['_same', {req=>1}, {}],
      allow_expr => 1,
      code       => sub {
          my ($self, $cd) = @_;
          $self->superclause_sortable('max', $cd);
      },
      ;
  has_clause 'xmax',
      v => 2,
      prio       => 51,
      tags       => ['constraint'],
      schema     => ['_same', {req=>1}, {}],
      allow_expr => 1,
      code       => sub {
          my ($self, $cd) = @_;
          $self->superclause_sortable('xmax', $cd);
      },
      ;
  has_clause 'between',
      v => 2,
      tags       => ['constraint'],
      schema     => ['array', {req=>1, len=>2, elems=>[
          ['_same', {req=>1}, {}],
          ['_same', {req=>1}, {}],
      ]}, {}],
      allow_expr => 1,
      code       => sub {
          my ($self, $cd) = @_;
          $self->superclause_sortable('between', $cd);
      },
      ;
  has_clause 'xbetween',
      v => 2,
      tags       => ['constraint'],
      schema     => ['array', {req=>1, len=>2, elems=>[
          ['_same', {req=>1}, {}],
          ['_same', {req=>1}, {}],
      ]}, {}],
      allow_expr => 1,
      code => sub {
          my ($self, $cd) = @_;
          $self->superclause_sortable('xbetween', $cd);
      },
      ;
  
  1;
  # ABSTRACT: Role for sortable types
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Type::Sortable - Role for sortable types
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Type::Sortable (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =head1 DESCRIPTION
  
  Role consumer must provide method C<superclause_sortable> which will receive the
  same C<%args> as clause methods, but with additional key: C<-which> (either
  C<min>, C<max>, C<xmin>, C<xmax>, C<between>, C<xbetween>).
  
  =for Pod::Coverage ^(clause_.+|clausemeta_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_TYPE_SORTABLE

    $main::fatpacked{"Data/Sah/Type/all.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_TYPE_ALL';
  package Data::Sah::Type::all;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use Data::Sah::Util::Role 'has_clause';
  use Role::Tiny;
  use Role::Tiny::With;
  
  with 'Data::Sah::Type::BaseType';
  
  has_clause 'of',
      v => 2,
      tags       => ['constraint'],
      schema     => ['array' => {req=>1, min_len=>1, each_elem => ['sah::schema', {req=>1}, {}]}, {}],
      subschema  => sub { @{ $_[0] } },
      allow_expr => 0,
      ;
  
  1;
  # ABSTRACT: all type
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Type::all - all type
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Type::all (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(clause_.+|clausemeta_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_TYPE_ALL

    $main::fatpacked{"Data/Sah/Type/any.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_TYPE_ANY';
  package Data::Sah::Type::any;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use Data::Sah::Util::Role 'has_clause';
  use Role::Tiny;
  use Role::Tiny::With;
  
  with 'Data::Sah::Type::BaseType';
  
  has_clause 'of',
      v => 2,
      tags       => ['constraint'],
      schema     => ['array' => {req=>1, min_len=>1, each_elem => ['sah::schema', {req=>1}, {}]}, {}],
      subschema  => sub { @{ $_[0] } },
      allow_expr => 0,
      ;
  
  1;
  # ABSTRACT: any type
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Type::any - any type
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Type::any (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(clause_.+|clausemeta_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_TYPE_ANY

    $main::fatpacked{"Data/Sah/Type/array.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_TYPE_ARRAY';
  package Data::Sah::Type::array;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use Data::Sah::Util::Role 'has_clause', 'has_clause_alias';
  use Role::Tiny;
  use Role::Tiny::With;
  
  with 'Data::Sah::Type::BaseType';
  with 'Data::Sah::Type::Comparable';
  with 'Data::Sah::Type::HasElems';
  
  has_clause 'elems',
      v => 2,
      tags       => ['constraint'],
      schema     => ['array' => {req=>1, of=>['sah::schema', {req=>1}, {}]}, {}],
      inspect_elem => 1,
      allow_expr => 0,
      subschema  => sub { @{ $_[0] } },
      attrs      => {
          create_default => {
              schema     => [bool => {default=>1}, {}],
              allow_expr => 0, # TODO
          },
      },
      ;
  has_clause_alias each_elem => 'of';
  
  1;
  # ABSTRACT: array type
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Type::array - array type
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Type::array (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(clause_.+|clausemeta_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_TYPE_ARRAY

    $main::fatpacked{"Data/Sah/Type/bool.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_TYPE_BOOL';
  package Data::Sah::Type::bool;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use Data::Sah::Util::Role 'has_clause';
  use Role::Tiny;
  use Role::Tiny::With;
  
  with 'Data::Sah::Type::BaseType';
  with 'Data::Sah::Type::Comparable';
  with 'Data::Sah::Type::Sortable';
  
  has_clause 'is_true',
      v => 2,
      tags       => ['constraint'],
      schema     => ['bool', {}, {}],
      allow_expr => 1,
      ;
  
  1;
  # ABSTRACT: bool type
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Type::bool - bool type
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Type::bool (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(clause_.+|clausemeta_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_TYPE_BOOL

    $main::fatpacked{"Data/Sah/Type/buf.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_TYPE_BUF';
  package Data::Sah::Type::buf;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use Role::Tiny;
  use Role::Tiny::With;
  
  with 'Data::Sah::Type::str';
  
  1;
  # ABSTRACT: buf type
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Type::buf - buf type
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Type::buf (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(clause_.+|clausemeta_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_TYPE_BUF

    $main::fatpacked{"Data/Sah/Type/cistr.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_TYPE_CISTR';
  package Data::Sah::Type::cistr;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use Role::Tiny;
  use Role::Tiny::With;
  
  with 'Data::Sah::Type::str';
  
  1;
  # ABSTRACT: cistr type
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Type::cistr - cistr type
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Type::cistr (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(clause_.+|clausemeta_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_TYPE_CISTR

    $main::fatpacked{"Data/Sah/Type/code.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_TYPE_CODE';
  package Data::Sah::Type::code;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use Role::Tiny;
  use Role::Tiny::With;
  
  with 'Data::Sah::Type::BaseType';
  
  1;
  # ABSTRACT: code type
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Type::code - code type
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Type::code (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(clause_.+|clausemeta_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_TYPE_CODE

    $main::fatpacked{"Data/Sah/Type/date.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_TYPE_DATE';
  package Data::Sah::Type::date;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use Data::Sah::Util::Role 'has_clause';
  use Role::Tiny;
  use Role::Tiny::With;
  
  with 'Data::Sah::Type::BaseType';
  with 'Data::Sah::Type::Comparable';
  with 'Data::Sah::Type::Sortable';
  
  # XXX prop: year
  # XXX prop: quarter (1-4)
  # XXX prop: month
  # XXX prop: day
  # XXX prop: day_of_month
  # XXX prop: hour
  # XXX prop: minute
  # XXX prop: second
  # XXX prop: millisecond
  # XXX prop: microsecond
  # XXX prop: nanosecond
  # XXX prop: day_of_week
  # XXX prop: day_of_quarter
  # XXX prop: day_of_year
  # XXX prop: week_of_month
  # XXX prop: week_of_year
  # XXX prop: date?
  # XXX prop: time?
  # XXX prop: time_zone_long_name
  # XXX prop: time_zone_offset
  # XXX prop: is_leap_year
  
  1;
  # ABSTRACT: date type
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Type::date - date type
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Type::date (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(clause_.+|clausemeta_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_TYPE_DATE

    $main::fatpacked{"Data/Sah/Type/datenotime.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_TYPE_DATENOTIME';
  package Data::Sah::Type::datenotime;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use Role::Tiny;
  use Role::Tiny::With;
  
  with 'Data::Sah::Type::date';
  
  1;
  # ABSTRACT: datenotime type
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Type::datenotime - datenotime type
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Type::datenotime (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(clause_.+|clausemeta_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_TYPE_DATENOTIME

    $main::fatpacked{"Data/Sah/Type/datetime.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_TYPE_DATETIME';
  package Data::Sah::Type::datetime;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use Role::Tiny;
  use Role::Tiny::With;
  
  with 'Data::Sah::Type::date';
  
  1;
  # ABSTRACT: datetime type
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Type::datetime - datetime type
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Type::datetime (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(clause_.+|clausemeta_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_TYPE_DATETIME

    $main::fatpacked{"Data/Sah/Type/duration.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_TYPE_DURATION';
  package Data::Sah::Type::duration;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use Data::Sah::Util::Role 'has_clause';
  use Role::Tiny;
  use Role::Tiny::With;
  
  with 'Data::Sah::Type::BaseType';
  with 'Data::Sah::Type::Comparable';
  with 'Data::Sah::Type::Sortable';
  
  # XXX prop: ...
  
  1;
  # ABSTRACT: date/time duration type
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Type::duration - date/time duration type
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Type::duration (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(clause_.+|clausemeta_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_TYPE_DURATION

    $main::fatpacked{"Data/Sah/Type/float.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_TYPE_FLOAT';
  package Data::Sah::Type::float;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use Data::Sah::Util::Role 'has_clause';
  use Role::Tiny;
  use Role::Tiny::With;
  
  with 'Data::Sah::Type::num';
  
  has_clause 'is_nan',
      v => 2,
      tags        => ['constraint'],
      schema      => ['bool', {}, {}],
      allow_expr  => 1,
      allow_multi => 0,
      ;
  
  has_clause 'is_inf',
      v => 2,
      tags        => ['constraint'],
      schema      => ['bool', {}, {}],
      allow_expr  => 1,
      allow_multi => 1,
      ;
  
  has_clause 'is_pos_inf',
      v => 2,
      tags        => ['constraint'],
      schema      => ['bool', {}, {}],
      allow_expr  => 1,
      allow_multi => 1,
      ;
  
  has_clause 'is_neg_inf',
      v => 2,
      tags        => ['constraint'],
      schema      => ['bool', {}, {}],
      allow_expr  => 1,
      allow_multi => 1,
      ;
  
  1;
  # ABSTRACT: float type
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Type::float - float type
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Type::float (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(clause_.+|clausemeta_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_TYPE_FLOAT

    $main::fatpacked{"Data/Sah/Type/hash.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_TYPE_HASH';
  package Data::Sah::Type::hash;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use Data::Sah::Util::Role 'has_clause', 'has_clause_alias';
  use Role::Tiny;
  use Role::Tiny::With;
  
  with 'Data::Sah::Type::BaseType';
  with 'Data::Sah::Type::Comparable';
  with 'Data::Sah::Type::HasElems';
  
  has_clause_alias each_elem => 'of';
  
  has_clause_alias each_index => 'each_key';
  has_clause_alias each_elem => 'each_value';
  has_clause_alias check_each_index => 'check_each_key';
  has_clause_alias check_each_elem => 'check_each_value';
  
  has_clause "keys",
      v => 2,
      tags       => ['constraint'],
      schema     => ['hash' => {req=>1, values => ['sah::schema', {req=>1}, {}]}, {}],
      inspect_elem => 1,
      subschema  => sub { values %{ $_[0] } },
      allow_expr => 0,
      attrs      => {
          restrict => {
              schema     => [bool => default=>1],
              allow_expr => 0, # TODO
          },
          create_default => {
              schema     => [bool => default=>1],
              allow_expr => 0, # TODO
          },
      },
      ;
  
  has_clause "re_keys",
      v => 2,
      prio       => 51,
      tags       => ['constraint'],
      schema     => ['hash' => {
          req=>1,
          keys   => ['re', {req=>1}, {}],
          values => ['sah::schema', {req=>1}, {}],
      }, {}],
      inspect_elem => 1,
      subschema  => sub { values %{ $_[0] } },
      allow_expr => 0,
      attrs      => {
          restrict => {
              schema     => [bool => default=>1],
              allow_expr => 0, # TODO
          },
      },
      ;
  
  has_clause "req_keys",
      v => 2,
      tags       => ['constraint'],
      schema     => ['array', {req=>1, of=>['str', {req=>1}, {}]}, {}],
      allow_expr => 1,
      ;
  has_clause_alias req_keys => 'req_all_keys';
  has_clause_alias req_keys => 'req_all';
  
  has_clause "allowed_keys",
      v => 2,
      tags       => ['constraint'],
      schema     => ['array', {req=>1, of=>['str', {req=>1}, {}]}, {}],
      allow_expr => 1,
      ;
  
  has_clause "allowed_keys_re",
      v => 2,
      prio       => 51,
      tags       => ['constraint'],
      schema     => ['re', {req=>1}, {}],
      allow_expr => 1,
      ;
  
  has_clause "forbidden_keys",
      v => 2,
      tags       => ['constraint'],
      schema     => ['array', {req=>1, of=>['str', {req=>1}, {}]}, {}],
      allow_expr => 1,
      ;
  
  has_clause "forbidden_keys_re",
      v => 2,
      prio       => 51,
      tags       => ['constraint'],
      schema     => ['re', {req=>1}, {}],
      allow_expr => 1,
      ;
  
  has_clause "choose_one_key",
      v => 2,
      prio       => 50,
      tags       => ['constraint'],
      schema     => ['array', {req=>1, of=>['str', {req=>1}, {}], min_len=>1}, {}],
      allow_expr => 0, # for now
      ;
  has_clause_alias choose_one_key => 'choose_one';
  
  has_clause "choose_all_keys",
      v => 2,
      prio       => 50,
      tags       => ['constraint'],
      schema     => ['array', {req=>1, of=>['str', {req=>1}, {}], min_len=>1}, {}],
      allow_expr => 0, # for now
      ;
  has_clause_alias choose_all_keys => 'choose_all';
  
  has_clause "req_one_key",
      v => 2,
      prio       => 50,
      tags       => ['constraint'],
      schema     => ['array', {req=>1, of=>['str', {req=>1}, {}], min_len=>1}, {}],
      allow_expr => 0, # for now
      ;
  has_clause_alias req_one_key => 'req_one';
  
  has_clause "req_some_keys",
      v => 2,
      prio       => 50,
      tags       => ['constraint'],
      schema     => ['array', {
          req => 1,
          len => 3,
          elems => [
              [int => {req=>1, min=>0}], # min
              [int => {req=>1, min=>0}], # max
              [array => {req=>1, of=>['str', {req=>1}, {}], min_len=>1}, {}], # keys
          ],
      }, {}],
      allow_expr => 0, # for now
      ;
  has_clause_alias req_some_keys => 'req_some';
  
  # for now we only support the first argument as str, not array[str]
  my $sch_dep = ['array', {
      req => 1,
      elems => [
          ['str', {req=>1}, {}],
          ['array', {of=>['str', {req=>1}, {}]}, {}],
      ],
  }, {}];
  
  has_clause "dep_any",
      v => 2,
      prio       => 50,
      tags       => ['constraint'],
      schema     => $sch_dep,
      allow_expr => 0, # for now
      ;
  
  has_clause "dep_all",
      v => 2,
      prio       => 50,
      tags       => ['constraint'],
      schema     => $sch_dep,
      allow_expr => 0, # for now
      ;
  
  has_clause "req_dep_any",
      v => 2,
      prio       => 50,
      tags       => ['constraint'],
      schema     => $sch_dep,
      allow_expr => 0, # for now
      ;
  
  has_clause "req_dep_all",
      v => 2,
      prio       => 50,
      tags       => ['constraint'],
      schema     => $sch_dep,
      allow_expr => 0, # for now
      ;
  
  # prop_alias indices => 'keys'
  
  # prop_alias elems => 'values'
  
  1;
  # ABSTRACT: hash type
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Type::hash - hash type
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Type::hash (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(clause_.+|clausemeta_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_TYPE_HASH

    $main::fatpacked{"Data/Sah/Type/int.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_TYPE_INT';
  package Data::Sah::Type::int;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use Data::Sah::Util::Role 'has_clause';
  use Role::Tiny;
  use Role::Tiny::With;
  
  with 'Data::Sah::Type::num';
  
  has_clause 'mod',
      v => 2,
      tags       => ['constraint'],
      schema     => ['array' => {req=>1, len=>2, elems => [
          ['int' => {req=>1, is=>0, 'is.op'=>'not'}, {}],
          ['int' => {req=>1}, {}],
      ]}, {}],
      allow_expr => 1,
      ;
  has_clause 'div_by',
      v => 2,
      tags       => ['constraint'],
      schema     => ['int' => {req=>1, is=>0, 'is.op'=>'not'}, {}],
      allow_expr => 1,
      ;
  
  1;
  # ABSTRACT: int type
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Type::int - int type
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Type::int (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(clause_.+|clausemeta_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_TYPE_INT

    $main::fatpacked{"Data/Sah/Type/num.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_TYPE_NUM';
  package Data::Sah::Type::num;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use Role::Tiny;
  use Role::Tiny::With;
  
  with 'Data::Sah::Type::BaseType';
  with 'Data::Sah::Type::Comparable';
  with 'Data::Sah::Type::Sortable';
  
  1;
  # ABSTRACT: num type
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Type::num - num type
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Type::num (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(clause_.+|clausemeta_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_TYPE_NUM

    $main::fatpacked{"Data/Sah/Type/obj.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_TYPE_OBJ';
  package Data::Sah::Type::obj;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use Data::Sah::Util::Role 'has_clause';
  use Role::Tiny;
  use Role::Tiny::With;
  
  with 'Data::Sah::Type::BaseType';
  
  has_clause 'can',
      v => 2,
      tags       => ['constraint'],
      schema     => ['str', {req => 1}, {}], # XXX perl_method_name
      allow_expr => 1,
      ;
  has_clause 'isa',
      v => 2,
      tags       => ['constraint'],
      schema     => ['str', {req => 1}, {}], # XXX perl_class_name
      allow_expr => 1,
      ;
  
  1;
  # ABSTRACT: obj type
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Type::obj - obj type
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Type::obj (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(clause_.+|clausemeta_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_TYPE_OBJ

    $main::fatpacked{"Data/Sah/Type/re.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_TYPE_RE';
  package Data::Sah::Type::re;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use Data::Sah::Util::Role 'has_clause';
  use Role::Tiny;
  use Role::Tiny::With;
  
  with 'Data::Sah::Type::BaseType';
  
  1;
  # ABSTRACT: re type
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Type::re - re type
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Type::re (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(clause_.+|clausemeta_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_TYPE_RE

    $main::fatpacked{"Data/Sah/Type/str.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_TYPE_STR';
  package Data::Sah::Type::str;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use Data::Sah::Util::Role 'has_clause';
  use Role::Tiny;
  use Role::Tiny::With;
  
  with 'Data::Sah::Type::BaseType';
  with 'Data::Sah::Type::Comparable';
  with 'Data::Sah::Type::Sortable';
  with 'Data::Sah::Type::HasElems';
  
  # currently we only support regex instead of hash of regexes
  #my $t_re = 'regex*|{*=>regex*}';
  my $t_re = ['regex', {req=>1}, {}];
  
  has_clause 'encoding',
      v => 2,
      tags       => ['constraint'],
      schema     => ['str', {req=>1}, {}],
      allow_expr => 0,
      ;
  has_clause 'match',
      v => 2,
      tags       => ['constraint'],
      schema     => $t_re,
      allow_expr => 1,
      ;
  has_clause 'is_re',
      v => 2,
      tags       => ['constraint'],
      schema     => ['bool', {}, {}],
      allow_expr => 1,
      ;
  
  1;
  # ABSTRACT: str type
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Type::str - str type
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Type::str (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(clause_.+|clausemeta_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_TYPE_STR

    $main::fatpacked{"Data/Sah/Type/timeofday.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_TYPE_TIMEOFDAY';
  package Data::Sah::Type::timeofday;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use Data::Sah::Util::Role 'has_clause';
  use Role::Tiny;
  use Role::Tiny::With;
  
  with 'Data::Sah::Type::BaseType';
  with 'Data::Sah::Type::Comparable';
  with 'Data::Sah::Type::Sortable';
  
  1;
  # ABSTRACT: timeofday type
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Type::timeofday - timeofday type
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Type::timeofday (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(clause_.+|clausemeta_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_TYPE_TIMEOFDAY

    $main::fatpacked{"Data/Sah/Type/undef.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_TYPE_UNDEF';
  package Data::Sah::Type::undef;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use Role::Tiny;
  use Data::Sah::Util::Role 'has_clause';
  
  1;
  # ABSTRACT: undef type
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Type::undef - undef type
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Type::undef (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =for Pod::Coverage ^(clause_.+|clausemeta_.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_TYPE_UNDEF

    $main::fatpacked{"Data/Sah/Util/Func.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_UTIL_FUNC';
  package Data::Sah::Util::Func;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  #use Log::Any '$log';
  
  require Exporter;
  our @ISA = qw(Exporter);
  our @EXPORT_OK = qw(
                         add_func
                 );
  
  sub add_func {
      my ($funcset, $func, %opts) = @_;
      # not yet implemented
  }
  
  1;
  # ABSTRACT: Sah utility routines for adding function
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Util::Func - Sah utility routines for adding function
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Util::Func (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =head1 DESCRIPTION
  
  This module provides some utility routines to be used by modules that add Sah
  functions.
  
  =head1 FUNCTIONS
  
  =head2 add_func($funcset, $func, %opts)
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_UTIL_FUNC

    $main::fatpacked{"Data/Sah/Util/Role.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_UTIL_ROLE';
  package Data::Sah::Util::Role;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use 5.010;
  use strict 'subs', 'vars';
  use warnings;
  #use Log::Any '$log';
  
  require Exporter;
  our @ISA = qw(Exporter);
  our @EXPORT_OK = qw(
                         has_clause has_clause_alias
                         has_func   has_func_alias
                 );
  
  sub has_clause {
      my ($name, %args) = @_;
      my $caller = caller;
      my $into   = $args{into} // $caller;
  
      my $v = $args{v} // 1;
      if ($v != 2) {
          die "Declaration of clause '$name' still follows version $v ".
              "(2 expected), please make sure $caller is the latest version";
      }
  
      if ($args{code}) {
          *{"$into\::clause_$name"} = $args{code};
      } else {
          eval "package $into; use Role::Tiny; ".
              "requires 'clause_$name';";
      }
      *{"$into\::clausemeta_$name"} = sub {
          state $meta = {
              names        => [$name],
              tags         => $args{tags},
              prio         => $args{prio} // 50,
              schema       => $args{schema},
              allow_expr   => $args{allow_expr},
              attrs        => $args{attrs} // {},
              inspect_elem => $args{inspect_elem},
              subschema    => $args{subschema},
          };
          $meta;
      };
      has_clause_alias($name, $args{alias}  , $into);
      has_clause_alias($name, $args{aliases}, $into);
  }
  
  sub has_clause_alias {
      my ($name, $aliases, $into) = @_;
      my $caller   = caller;
      $into      //= $caller;
      my @aliases = !$aliases ? () :
          ref($aliases) eq 'ARRAY' ? @$aliases : $aliases;
      my $meta = $into->${\("clausemeta_$name")};
  
      for my $alias (@aliases) {
          push @{ $meta->{names} }, $alias;
          eval
              "package $into;".
              "sub clause_$alias { shift->clause_$name(\@_) } ".
              "sub clausemeta_$alias { shift->clausemeta_$name(\@_) } ";
          $@ and die "Can't make clause alias $alias -> $name: $@";
      }
  }
  
  sub has_func {
      my ($name, %args) = @_;
      my $caller = caller;
      my $into   = $args{into} // $caller;
  
      if ($args{code}) {
          *{"$into\::func_$name"} = $args{code};
      } else {
          eval "package $into; use Role::Tiny; requires 'func_$name';";
      }
      *{"$into\::funcmeta_$name"} = sub {
          state $meta = {
              names => [$name],
              args  => $args{args},
          };
          $meta;
      };
      my @aliases =
          map { (!$args{$_} ? () :
                     ref($args{$_}) eq 'ARRAY' ? @{ $args{$_} } : $args{$_}) }
              qw/alias aliases/;
      has_func_alias($name, $args{alias}  , $into);
      has_func_alias($name, $args{aliases}, $into);
  }
  
  sub has_func_alias {
      my ($name, $aliases, $into) = @_;
      my $caller   = caller;
      $into      //= $caller;
      my @aliases = !$aliases ? () :
          ref($aliases) eq 'ARRAY' ? @$aliases : $aliases;
      my $meta = $into->${\("funcmeta_$name")};
  
      for my $alias (@aliases) {
          push @{ $meta->{names} }, $alias;
          eval
              "package $into;".
              "sub func_$alias { shift->func_$name(\@_) } ".
              "sub funcmeta_$alias { shift->funcmeta_$name(\@_) } ";
          $@ and die "Can't make func alias $alias -> $name: $@";
      }
  }
  
  1;
  # ABSTRACT: Sah utility routines for roles
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Util::Role - Sah utility routines for roles
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Util::Role (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =head1 DESCRIPTION
  
  This module provides some utility routines to be used in roles, e.g.
  C<Data::Sah::Type::*> and C<Data::Sah::FuncSet::*>.
  
  =head1 FUNCTIONS
  
  =head2 has_clause($name, %opts)
  
  Define a clause. Used in type roles (C<Data::Sah::Type::*>). Internally it adds
  a L<Moo> C<requires> for C<clause_$name>.
  
  Options:
  
  =over 4
  
  =item * v => int
  
  Specify clause specification version. Must be 2 (the current version).
  
  =item * schema => sah::schema
  
  Define schema for clause value.
  
  =item * prio => int {min=>0, max=>100, default=>50}
  
  Optional. Default is 50. The higher the priority (the lower the number), the
  earlier the clause will be processed.
  
  =item * aliases => \@aliases OR $alias
  
  Define aliases. Optional.
  
  =item * inspect_elem => bool
  
  If set to true, then this means clause inspect the element(s) of the data. This
  is only relevant for types that has elements (see L<HasElems
  role|Data::Sah::Type::HasElems>). An example of clause like this is C<has> or
  C<each_elem>. When the value of C<inspect_elem> is true, a compiler must prepare
  by coercing the elements of the data, if there are coercion rules applicable.
  
  =item * subschema => coderef
  
  If set, then declare that the clause value contains a subschema. The coderef
  must provide a way to get the subschema from
  
  =item * code => coderef
  
  Optional. Define implementation for the clause. The code will be installed as
  'clause_$name'.
  
  =item * into => str $package
  
  By default it is the caller package, but can be set to other package.
  
  =back
  
  Example:
  
   has_clause minimum => (arg => 'int*', aliases => 'min');
  
  =head2 has_clause_alias TARGET => ALIAS | [ALIAS1, ...]
  
  Specify that clause named ALIAS is an alias for TARGET.
  
  You have to define TARGET clause first (see B<has_clause> above).
  
  Example:
  
   has_clause max_length => ...;
   has_clause_alias max_length => "max_len";
  
  =head2 has_func($name, %opts)
  
  Define a Sah function. Used in function set roles (C<Data::Sah::FuncSet::*>).
  Internally it adds a L<Moo> C<requires> for C<func_$name>.
  
  Options:
  
  =over 4
  
  =item * aliases => \@aliases OR $alias
  
  Optional. Declare aliases.
  
  =item * code => $code
  
  Supply implementation for the function. The code will be installed as
  'func_$name'.
  
  =item * into => $package
  
  By default it is the caller package, but can be set to other package.
  
  =back
  
  Example:
  
   has_func abs => (args => 'num');
  
  =head2 has_func_alias TARGET => ALIAS | [ALIASES...]
  
  Specify that function named ALIAS is an alias for TARGET.
  
  You have to specify TARGET function first (see B<has_func> above).
  
  Example:
  
   has_func_alias 'atan' => 'arctan';
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_UTIL_ROLE

    $main::fatpacked{"Data/Sah/Util/Type.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_UTIL_TYPE';
  package Data::Sah::Util::Type;
  
  our $DATE = '2016-12-09'; # DATE
  our $VERSION = '0.46'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  require Exporter;
  our @ISA       = qw(Exporter);
  our @EXPORT_OK = qw(get_type is_type is_simple is_numeric is_collection is_ref);
  
  # XXX absorb and use metadata from Data::Sah::Type::*
  our $type_metas = {
      all   => {scalar=>0, numeric=>0, ref=>0},
      any   => {scalar=>0, numeric=>0, ref=>0},
      array => {scalar=>0, numeric=>0, ref=>1},
      bool  => {scalar=>1, numeric=>0, ref=>0},
      buf   => {scalar=>1, numeric=>0, ref=>0},
      cistr => {scalar=>1, numeric=>0, ref=>0},
      code  => {scalar=>1, numeric=>0, ref=>1},
      float => {scalar=>1, numeric=>1, ref=>0},
      hash  => {scalar=>0, numeric=>0, ref=>1},
      int   => {scalar=>1, numeric=>1, ref=>0},
      num   => {scalar=>1, numeric=>1, ref=>0},
      obj   => {scalar=>1, numeric=>0, ref=>1},
      re    => {scalar=>1, numeric=>0, ref=>1, simple=>1},
      str   => {scalar=>1, numeric=>0, ref=>0},
      undef => {scalar=>1, numeric=>0, ref=>0},
      date     => {scalar=>1, numeric=>0, ref=>0},
      duration => {scalar=>1, numeric=>0, ref=>0},
  };
  
  sub get_type {
      my $sch = shift;
  
      if (ref($sch) eq 'ARRAY') {
          $sch = $sch->[0];
      }
  
      if (defined($sch) && !ref($sch)) {
          $sch =~ s/\*\z//;
          return $sch;
      } else {
          return undef;
      }
  }
  
  sub _normalize {
      require Data::Sah::Normalize;
  
      my ($sch, $opts) = @_;
      return $sch if $opts->{schema_is_normalized};
      return Data::Sah::Normalize::normalize_schema($sch);
  }
  
  # for any|all to pass a criteria, we assume that all of the schemas in the 'of'
  # clause must also pass (and there must not be '!of', 'of&', or that kind of
  # thing.
  sub _handle_any_all {
      my ($sch, $opts, $crit) = @_;
      $sch = _normalize($sch, $opts);
      return 0 if $sch->[1]{'of.op'};
      my $of = $sch->[1]{of};
      return 0 unless $of && ref($of) eq 'ARRAY' && @$of;
      for (@$of) {
          return 0 unless $crit->($_);
      }
      1;
  }
  
  sub is_type {
      my ($sch, $opts) = @_;
      $opts //= {};
  
      my $type = get_type($sch) or return undef;
      my $tmeta = $type_metas->{$type} or return undef;
      $type;
  }
  
  sub is_simple {
      my ($sch, $opts) = @_;
      $opts //= {};
  
      my $type = get_type($sch) or return undef;
      my $tmeta = $type_metas->{$type} or return undef;
      if ($type eq 'any' || $type eq 'all') {
          return _handle_any_all($sch, $opts, sub { is_simple(shift) });
      }
      return $tmeta->{simple} // ($tmeta->{scalar} && !$tmeta->{ref});
  }
  
  sub is_collection {
      my ($sch, $opts) = @_;
      $opts //= {};
  
      my $type = get_type($sch) or return undef;
      my $tmeta = $type_metas->{$type} or return undef;
      if ($type eq 'any' || $type eq 'all') {
          return _handle_any_all($sch, $opts, sub { is_collection(shift) });
      }
      return !$tmeta->{scalar};
  }
  
  sub is_numeric {
      my ($sch, $opts) = @_;
      $opts //= {};
  
      my $type = get_type($sch) or return undef;
      my $tmeta = $type_metas->{$type} or return undef;
      if ($type eq 'any' || $type eq 'all') {
          return _handle_any_all($sch, $opts, sub { is_numeric(shift) });
      }
      return $tmeta->{numeric};
  }
  
  sub is_ref {
      my ($sch, $opts) = @_;
      $opts //= {};
  
      my $type = get_type($sch) or return undef;
      my $tmeta = $type_metas->{$type} or return undef;
      if ($type eq 'any' || $type eq 'all') {
          return _handle_any_all($sch, $opts, sub { is_ref(shift) });
      }
      return $tmeta->{ref};
  }
  
  1;
  # ABSTRACT: Utility functions related to types
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Util::Type - Utility functions related to types
  
  =head1 VERSION
  
  This document describes version 0.46 of Data::Sah::Util::Type (from Perl distribution Data-Sah-Util-Type), released on 2016-12-09.
  
  =head1 SYNOPSIS
  
   use Data::Sah::Util::Type qw(
       get_type
       is_type
       is_simple is_numeric is_collection is_ref
   );
  
   say get_type("int");                          # -> int
   say get_type("int*");                         # -> int
   say get_type([int => min=>0]);                # -> int
   say get_type("foo");                          # -> foo (doesn't check type is known)
  
   say is_type("int*");                          # -> 1
   say is_type("foo");                           # -> 0
  
   say is_simple("int");                          # -> 1
   say is_simple("array");                        # -> 0
   say is_simple([any => of => ["float", "str"]); # -> 1
   say is_simple("re");                           # -> 1
   say is_simple("foo");                          # -> 0
  
   say is_collection("array*");            # -> 1
   say is_collection(["hash", of=>"int"]); # -> 1
   say is_collection("str");               # -> 0
   say is_collection("foo");               # -> 0
  
   say is_ref("code*"); # -> 1
   say is_ref("array"); # -> 1
   say is_ref("str");   # -> 0
   say is_ref("foo");   # -> 0
  
   say is_numeric(["int", min=>0]); # -> 1
   say is_numeric("str");           # -> 0
   say is_numeric("foo");           # -> 0
  
  =head1 DESCRIPTION
  
  This module provides some secondary utility functions related to L<Sah> and
  L<Data::Sah>. It is deliberately distributed separately from the Data-Sah main
  distribution to be differentiated from Data::Sah::Util which contains "primary"
  utilities and is distributed with Data-Sah.
  
  Reference table for simple/collection/ref/numeric criteria of builtin types:
  
   +----------+-----------+---------------+--------+------------+
   | type     | is_simple | is_collection | is_ref | is_numeric |
   +----------+-----------+---------------+--------+------------+
   | array    |           | 1             | 1      |            |
   | bool     | 1         |               |        |            |
   | buf      | 1         |               |        |            |
   | cistr    | 1         |               |        |            |
   | code     |           |               | 1      |            |
   | date     | 1         |               |        |            |
   | duration | 1         |               |        |            |
   | float    | 1         |               |        | 1          |
   | hash     |           | 1             | 1      |            |
   | int      | 1         |               |        | 1          |
   | num      | 1         |               |        | 1          |
   | obj      |           |               | 1      |            |
   | re       | 1         |               | 1      |            |
   | str      | 1         |               |        |            |
   | undef    | 1         |               |        |            |
   +----------+-----------+---------------+--------+------------+
  
  =head1 FUNCTIONS
  
  None exported by default, but they are exportable.
  
  =head2 get_type($sch) => STR
  
  Return type name.
  
  =head2 is_type($sch) => STR
  
  Return type name if type in schema is known, or undef.
  
  =head2 is_simple($sch[, \%opts]) => BOOL
  
  Simple means "scalar" or can be represented as a scalar. This is currently used
  to determine if a builtin type can be specified as an argument or option value
  in command-line.
  
  This includes C<re>, C<bool>, as well as C<date> and C<duration>.
  
  If type is C<all>, then for this routine to be true all of the mentioned types
  must be simple. If type is C<any>, then for this routine to be true at least one
  of the mentioned types must be simple.
  
  Options:
  
  =over
  
  =item * schema_is_normalized => BOOL
  
  =back
  
  =head2 is_collection($sch[, \%opts]) => BOOL
  
  Collection means C<array> or C<hash>.
  
  If type is C<all>, then for this routine to be true all of the mentioned types
  must be collection. If type is C<any>, then for this routine to be true at least
  one of the mentioned types must be collection.
  
  =head2 is_ref($sch[, \%opts]) => BOOL
  
  "Ref" means generally a reference in Perl. But C<date> and C<duration> are not
  regarded as "ref". Regular expression on the other hand is regarded as a ref.
  
  If type is C<all>, then for this routine to be true all of the mentioned types
  must be "ref". If type is C<any>, then for this routine to be true at least one
  of the mentioned types must be "ref".
  
  =head2 is_numeric($sch[, \%opts]) => BOOL
  
  Currently, only C<num>, C<int>, and C<float> are numeric.
  
  If type is C<all>, then for this routine to be true all of the mentioned types
  must be numeric. If type is C<any>, then for this routine to be true at least
  one of the mentioned types must be numeric.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah-Util-Type>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah-Util-Type>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah-Util-Type>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Data::Sah>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_UTIL_TYPE

    $main::fatpacked{"Data/Sah/Util/Type/Date.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_UTIL_TYPE_DATE';
  package Data::Sah::Util::Type::Date;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  #use Log::Any '$log';
  
  use Scalar::Util qw(blessed looks_like_number);
  
  require Exporter;
  our @ISA = qw(Exporter);
  our @EXPORT_OK = qw(
                         coerce_date
                         coerce_duration
                 );
  
  our $DATE_MODULE = $ENV{DATA_SAH_DATE_MODULE} // $ENV{PERL_DATE_MODULE} //
      "DateTime"; # XXX change defaults to Time::Piece (core)
  
  my $re_ymd = qr/\A([0-9]{4})-([0-9]{2})-([0-9]{2})\z/;
  my $re_ymdThmsZ = qr/\A([0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})Z\z/;
  
  sub coerce_date {
      my $val = shift;
      if (!defined($val)) {
          return undef;
      }
  
      if ($DATE_MODULE eq 'DateTime') {
          require DateTime;
          if (blessed($val) && $val->isa('DateTime')) {
              return $val;
          } elsif (looks_like_number($val) && $val >= 10**8 && $val <= 2**31) {
              return DateTime->from_epoch(epoch => $val);
          } elsif ($val =~ $re_ymd) {
              my $d;
              eval { $d = DateTime->new(year=>$1, month=>$2, day=>$3, time_zone=>'UTC') };
              return undef if $@;
              return $d;
          } elsif ($val =~ $re_ymdThmsZ) {
              my $d;
              eval { $d = DateTime->new(year=>$1, month=>$2, day=>$3, hour=>$4, minute=>$5, second=>$6, time_zone=>'UTC') };
              return undef if $@;
              return $d;
          } elsif (blessed($val) && $val->isa('Time::Moment')) {
              return DateTime->from_epoch(epoch => $val->epoch);
          } elsif (blessed($val) && $val->isa('Time::Piece')) {
              return DateTime->from_epoch(epoch => $val->epoch);
          } else {
              return undef;
          }
      } elsif ($DATE_MODULE eq 'Time::Moment') {
          require Time::Moment;
          if (blessed($val) && $val->isa('Time::Moment')) {
              return $val;
          } elsif (looks_like_number($val) && $val >= 10**8 && $val <= 2**31) {
              return Time::Moment->from_epoch(int($val), $val-int($val));
          } elsif ($val =~ $re_ymd) {
              my $d;
              eval { $d = Time::Moment->new(year=>$1, month=>$2, day=>$3) };
              return undef if $@;
              return $d;
          } elsif ($val =~ $re_ymdThmsZ) {
              my $d;
              eval { $d = Time::Moment->new(year=>$1, month=>$2, day=>$3, hour=>$4, minute=>$5, second=>$6) };
              return undef if $@;
              return $d;
          } elsif (blessed($val) && $val->isa('DateTime')) {
              return Time::Moment->from_epoch($val->epoch);
          } elsif (blessed($val) && $val->isa('Time::Piece')) {
              return Time::Moment->from_epoch($val->epoch);
          } else {
              return undef;
          }
      } elsif ($DATE_MODULE eq 'Time::Piece') {
          require Time::Piece;
          if (blessed($val) && $val->isa('Time::Piece')) {
              return $val;
          } elsif (looks_like_number($val) && $val >= 10**8 && $val <= 2**31) {
              return scalar Time::Piece->gmtime($val);
          } elsif ($val =~ $re_ymd) {
              my $d;
              eval { $d = Time::Piece->strptime($val, "%Y-%m-%d") };
              return undef if $@;
              return $d;
          } elsif ($val =~ $re_ymdThmsZ) {
              my $d;
              eval { $d = Time::Piece->strptime($val, "%Y-%m-%dT%H:%M:%SZ") };
              return undef if $@;
              return $d;
          } elsif (blessed($val) && $val->isa('DateTime')) {
              return scalar Time::Piece->gmtime(epoch => $val->epoch);
          } elsif (blessed($val) && $val->isa('Time::Moment')) {
              return scalar Time::Piece->gmtime(epoch => $val->epoch);
          } else {
              return undef;
          }
      } else {
          die "BUG: Unknown Perl date module '$DATE_MODULE'";
      }
  }
  
  sub coerce_duration {
      my $val = shift;
      if (!defined($val)) {
          return undef;
      } elsif (blessed($val) && $val->isa('DateTime::Duration')) {
          return $val;
      } elsif ($val =~ /\AP
                        (?: ([0-9]+(?:\.[0-9]+)?)Y )?
                        (?: ([0-9]+(?:\.[0-9]+)?)M )?
                        (?: ([0-9]+(?:\.[0-9]+)?)W )?
                        (?: ([0-9]+(?:\.[0-9]+)?)D )?
                        (?:
                            T
                            (?: ([0-9]+(?:\.[0-9]+)?)H )?
                            (?: ([0-9]+(?:\.[0-9]+)?)M )?
                            (?: ([0-9]+(?:\.[0-9]+)?)S )?
                        )?
                        \z/x) {
          require DateTime::Duration;
          my $d;
          eval {
              $d = DateTime::Duration->new(
                  years   => $1 // 0,
                  months  => $2 // 0,
                  weeks   => $3 // 0,
                  days    => $4 // 0,
                  hours   => $5 // 0,
                  minutes => $6 // 0,
                  seconds => $7 // 0,
              );
          };
          return undef if $@;
          return $d;
      } else {
          return undef;
      }
  }
  
  1;
  # ABSTRACT: Utility related to date/duration type
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Util::Type::Date - Utility related to date/duration type
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Util::Type::Date (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =head1 DESCRIPTION
  
  =head1 FUNCTIONS
  
  =head2 coerce_date($val) => DATETIME OBJ|undef
  
  Coerce value to DateTime object according to perl Sah compiler (see
  L<Data::Sah::Compiler::perl::TH::date>). Return undef if value is not
  acceptable.
  
  =head2 coerce_duration($val) => DATETIME_DURATION OBJ|undef
  
  Coerce value to DateTime::Duration object according to perl Sah compiler (see
  L<Data::Sah::Compiler::perl::TH::duration>). Return undef if value is not
  acceptable.
  
  =head1 ENVIRONMENT
  
  =head2 DATA_SAH_DATE_MODULE => string (default: DateTime)
  
  Pick the date module to use. Available choices: DateTime, Time::Moment.
  
  =head2 PERL_DATE_MODULE => string (default: DateTime)
  
  Pick the date module to use. Available choices: DateTime, Time::Moment. Has
  lower priority compared to DATA_SAH_DATE_MODULE.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_UTIL_TYPE_DATE

    $main::fatpacked{"Data/Sah/Util/TypeX.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATA_SAH_UTIL_TYPEX';
  package Data::Sah::Util::TypeX;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  #use Log::Any '$log';
  
  require Exporter;
  our @ISA = qw(Exporter);
  our @EXPORT_OK = qw(
                         add_clause
                 );
  
  sub add_clause {
      my ($type, $clause, %opts) = @_;
      # not yet implemented
  
      # * check duplicate
  
      # * call Data::Sah::Util::Role::has_clause
      # * install handlers to Data::Sah::Compiler::$Compiler::TH::$type
      # * push @{ $Data::Sah::Compiler::human::TypeX{$type} }, $clause;
  }
  
  1;
  # ABSTRACT: Sah utility routines for type extensions
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Data::Sah::Util::TypeX - Sah utility routines for type extensions
  
  =head1 VERSION
  
  This document describes version 0.907 of Data::Sah::Util::TypeX (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =head1 DESCRIPTION
  
  This module provides some utility routines to be used by type extension modules
  (C<Data::Sah::TypeX::*>).
  
  =head1 FUNCTIONS
  
  =head2 add_clause($type, $clause, %opts)
  
  Add a clause. Used when wanting to add a clause to an existing type.
  
  Options:
  
  =over 4
  
  =item * definition => HASH
  
  Will be passed to L<Data::Sah::Util::Role>'s C<has_clause>.
  
  =item * handlers => HASH
  
  A mapping of compiler name and coderefs. Coderef will be installed as
  C<clause_$clause> in the C<Data::Sah::Compiler::$Compiler::TH::>.
  
  =item * prio => $priority
  
  Optional. Default is 50. The higher the priority, the earlier the clause will be
  processed.
  
  =item * aliases => \@aliases OR $alias
  
  Define aliases. Optional.
  
  =item * code => $code
  
  Optional. Define implementation for the clause. The code will be installed as
  'clause_$name'.
  
  =back
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DATA_SAH_UTIL_TYPEX

    $main::fatpacked{"Date/Format.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATE_FORMAT';
  # Copyright (c) 1995-2009 Graham Barr. This program is free
  # software; you can redistribute it and/or modify it under the same terms
  # as Perl itself.
  
  package Date::Format;
  
  use     strict;
  use     vars qw(@EXPORT @ISA $VERSION);
  require Exporter;
  
  $VERSION = "2.24";
  @ISA     = qw(Exporter);
  @EXPORT  = qw(time2str strftime ctime asctime);
  
  sub time2str ($;$$)
  {
   Date::Format::Generic->time2str(@_);
  }
  
  sub strftime ($\@;$)
  {
   Date::Format::Generic->strftime(@_);
  }
  
  sub ctime ($;$)
  {
   my($t,$tz) = @_;
   Date::Format::Generic->time2str("%a %b %e %T %Y\n", $t, $tz); 
  }
  
  sub asctime (\@;$)
  {
   my($t,$tz) = @_;
   Date::Format::Generic->strftime("%a %b %e %T %Y\n", $t, $tz); 
  }
  
  ##
  ##
  ##
  
  package Date::Format::Generic;
  
  use vars qw($epoch $tzname);
  use Time::Zone;
  use Time::Local;
  
  sub ctime
  {
   my($me,$t,$tz) = @_;
   $me->time2str("%a %b %e %T %Y\n", $t, $tz); 
  }
  
  sub asctime
  {
   my($me,$t,$tz) = @_;
   $me->strftime("%a %b %e %T %Y\n", $t, $tz); 
  }
  
  sub _subs
  {
   my $fn;
   $_[1] =~ s/
  		%(O?[%a-zA-Z])
  	   /
                  ($_[0]->can("format_$1") || sub { $1 })->($_[0]);
  	   /sgeox;
  
   $_[1];
  }
  
  sub strftime 
  {
   my($pkg,$fmt,$time);
  
   ($pkg,$fmt,$time,$tzname) = @_;
  
   my $me = ref($pkg) ? $pkg : bless [];
  
   if(defined $tzname)
    {
     $tzname = uc $tzname;
  
     $tzname = sprintf("%+05d",$tzname)
  	unless($tzname =~ /\D/);
  
     $epoch = timegm(@{$time}[0..5]);
  
     @$me = gmtime($epoch + tz_offset($tzname) - tz_offset());
    }
   else
    {
     @$me = @$time;
     undef $epoch;
    }
  
   _subs($me,$fmt);
  }
  
  sub time2str
  {
   my($pkg,$fmt,$time);
  
   ($pkg,$fmt,$time,$tzname) = @_;
  
   my $me = ref($pkg) ? $pkg : bless [], $pkg;
  
   $epoch = $time;
  
   if(defined $tzname)
    {
     $tzname = uc $tzname;
  
     $tzname = sprintf("%+05d",$tzname)
  	unless($tzname =~ /\D/);
  
     $time += tz_offset($tzname);
     @$me = gmtime($time);
    }
   else
    {
     @$me = localtime($time);
    }
   $me->[9] = $time;
   _subs($me,$fmt);
  }
  
  my(@DoW,@MoY,@DoWs,@MoYs,@AMPM,%format,@Dsuf);
  
  @DoW = qw(Sunday Monday Tuesday Wednesday Thursday Friday Saturday);
  
  @MoY = qw(January February March April May June
            July August September October November December);
  
  @DoWs = map { substr($_,0,3) } @DoW;
  @MoYs = map { substr($_,0,3) } @MoY;
  
  @AMPM = qw(AM PM);
  
  @Dsuf = (qw(th st nd rd th th th th th th)) x 3;
  @Dsuf[11,12,13] = qw(th th th);
  @Dsuf[30,31] = qw(th st);
  
  %format = ('x' => "%m/%d/%y",
             'C' => "%a %b %e %T %Z %Y",
             'X' => "%H:%M:%S",
            );
  
  my @locale;
  my $locale = "/usr/share/lib/locale/LC_TIME/default";
  local *LOCALE;
  
  if(open(LOCALE,"$locale"))
   {
    chop(@locale = <LOCALE>);
    close(LOCALE);
  
    @MoYs = @locale[0 .. 11];
    @MoY  = @locale[12 .. 23];
    @DoWs = @locale[24 .. 30];
    @DoW  = @locale[31 .. 37];
    @format{"X","x","C"} =  @locale[38 .. 40];
    @AMPM = @locale[41 .. 42];
   }
  
  sub wkyr {
      my($wstart, $wday, $yday) = @_;
      $wday = ($wday + 7 - $wstart) % 7;
      return int(($yday - $wday + 13) / 7 - 1);
  }
  
  ##
  ## these 6 formatting routins need to be *copied* into the language
  ## specific packages
  ##
  
  my @roman = ('',qw(I II III IV V VI VII VIII IX));
  sub roman {
    my $n = shift;
  
    $n =~ s/(\d)$//;
    my $r = $roman[ $1 ];
  
    if($n =~ s/(\d)$//) {
      (my $t = $roman[$1]) =~ tr/IVX/XLC/;
      $r = $t . $r;
    }
    if($n =~ s/(\d)$//) {
      (my $t = $roman[$1]) =~ tr/IVX/CDM/;
      $r = $t . $r;
    }
    if($n =~ s/(\d)$//) {
      (my $t = $roman[$1]) =~ tr/IVX/M../;
      $r = $t . $r;
    }
    $r;
  }
  
  sub format_a { $DoWs[$_[0]->[6]] }
  sub format_A { $DoW[$_[0]->[6]] }
  sub format_b { $MoYs[$_[0]->[4]] }
  sub format_B { $MoY[$_[0]->[4]] }
  sub format_h { $MoYs[$_[0]->[4]] }
  sub format_p { $_[0]->[2] >= 12 ?  $AMPM[1] : $AMPM[0] }
  sub format_P { lc($_[0]->[2] >= 12 ?  $AMPM[1] : $AMPM[0]) }
  
  sub format_d { sprintf("%02d",$_[0]->[3]) }
  sub format_e { sprintf("%2d",$_[0]->[3]) }
  sub format_H { sprintf("%02d",$_[0]->[2]) }
  sub format_I { sprintf("%02d",$_[0]->[2] % 12 || 12)}
  sub format_j { sprintf("%03d",$_[0]->[7] + 1) }
  sub format_k { sprintf("%2d",$_[0]->[2]) }
  sub format_l { sprintf("%2d",$_[0]->[2] % 12 || 12)}
  sub format_L { $_[0]->[4] + 1 }
  sub format_m { sprintf("%02d",$_[0]->[4] + 1) }
  sub format_M { sprintf("%02d",$_[0]->[1]) }
  sub format_q { sprintf("%01d",int($_[0]->[4] / 3) + 1) }
  sub format_s { 
     $epoch = timelocal(@{$_[0]}[0..5])
  	unless defined $epoch;
     sprintf("%d",$epoch) 
  }
  sub format_S { sprintf("%02d",$_[0]->[0]) }
  sub format_U { wkyr(0, $_[0]->[6], $_[0]->[7]) }
  sub format_w { $_[0]->[6] }
  sub format_W { wkyr(1, $_[0]->[6], $_[0]->[7]) }
  sub format_y { sprintf("%02d",$_[0]->[5] % 100) }
  sub format_Y { sprintf("%04d",$_[0]->[5] + 1900) }
  
  sub format_Z {
   my $o = tz_local_offset(timelocal(@{$_[0]}[0..5]));
   defined $tzname ? $tzname : uc tz_name($o, $_[0]->[8]);
  }
  
  sub format_z {
   my $t = timelocal(@{$_[0]}[0..5]);
   my $o = defined $tzname ? tz_offset($tzname, $t) : tz_offset(undef,$t);
   sprintf("%+03d%02d", int($o / 3600), int(abs($o) % 3600) / 60);
  }
  
  sub format_c { &format_x . " " . &format_X }
  sub format_D { &format_m . "/" . &format_d . "/" . &format_y  }      
  sub format_r { &format_I . ":" . &format_M . ":" . &format_S . " " . &format_p  }   
  sub format_R { &format_H . ":" . &format_M }
  sub format_T { &format_H . ":" . &format_M . ":" . &format_S }
  sub format_t { "\t" }
  sub format_n { "\n" }
  sub format_o { sprintf("%2d%s",$_[0]->[3],$Dsuf[$_[0]->[3]]) }
  sub format_x { my $f = $format{'x'}; _subs($_[0],$f); }
  sub format_X { my $f = $format{'X'}; _subs($_[0],$f); }
  sub format_C { my $f = $format{'C'}; _subs($_[0],$f); }
  
  sub format_Od { roman(format_d(@_)) }
  sub format_Oe { roman(format_e(@_)) }
  sub format_OH { roman(format_H(@_)) }
  sub format_OI { roman(format_I(@_)) }
  sub format_Oj { roman(format_j(@_)) }
  sub format_Ok { roman(format_k(@_)) }
  sub format_Ol { roman(format_l(@_)) }
  sub format_Om { roman(format_m(@_)) }
  sub format_OM { roman(format_M(@_)) }
  sub format_Oq { roman(format_q(@_)) }
  sub format_Oy { roman(format_y(@_)) }
  sub format_OY { roman(format_Y(@_)) }
  
  sub format_G { int(($_[0]->[9] - 315993600) / 604800) }
  
  1;
  __END__
  
  =head1 NAME
  
  Date::Format - Date formating subroutines
  
  =head1 SYNOPSIS
  
  	use Date::Format;
  	
  	@lt = localtime(time);
  	
  	print time2str($template, time);
  	print strftime($template, @lt);
  	
  	print time2str($template, time, $zone);
  	print strftime($template, @lt, $zone);
  	
  	print ctime(time);
  	print asctime(@lt);
  	
  	print ctime(time, $zone);
  	print asctime(@lt, $zone);
  
  =head1 DESCRIPTION
  
  This module provides routines to format dates into ASCII strings. They
  correspond to the C library routines C<strftime> and C<ctime>.
  
  =over 4
  
  =item time2str(TEMPLATE, TIME [, ZONE])
  
  C<time2str> converts C<TIME> into an ASCII string using the conversion
  specification given in C<TEMPLATE>. C<ZONE> if given specifies the zone
  which the output is required to be in, C<ZONE> defaults to your current zone.
  
  
  =item strftime(TEMPLATE, TIME [, ZONE])
  
  C<strftime> is similar to C<time2str> with the exception that the time is
  passed as an array, such as the array returned by C<localtime>.
  
  =item ctime(TIME [, ZONE])
  
  C<ctime> calls C<time2str> with the given arguments using the
  conversion specification C<"%a %b %e %T %Y\n">
  
  =item asctime(TIME [, ZONE])
  
  C<asctime> calls C<time2str> with the given arguments using the
  conversion specification C<"%a %b %e %T %Y\n">
  
  =back
  
  =head1 MULTI-LANGUAGE SUPPORT
  
  Date::Format is capable of formating into several languages by creating
  a language specific object and calling methods, see L<Date::Language>
  
  	my $lang = Date::Language->new('German');
  	$lang->time2str("%a %b %e %T %Y\n", time);
  
  I am open to suggestions on this.
  
  =head1 CONVERSION SPECIFICATION
  
  Each conversion specification  is  replaced  by  appropriate
  characters   as   described  in  the  following  list.   The
  appropriate  characters  are  determined  by   the   LC_TIME
  category of the program's locale.
  
  	%%	PERCENT
  	%a	day of the week abbr
  	%A	day of the week
  	%b	month abbr
  	%B 	month
  	%c	MM/DD/YY HH:MM:SS
  	%C 	ctime format: Sat Nov 19 21:05:57 1994
  	%d 	numeric day of the month, with leading zeros (eg 01..31)
  	%e 	like %d, but a leading zero is replaced by a space (eg  1..32)
  	%D 	MM/DD/YY
  	%G	GPS week number (weeks since January 6, 1980)
  	%h 	month abbr
  	%H 	hour, 24 hour clock, leading 0's)
  	%I 	hour, 12 hour clock, leading 0's)
  	%j 	day of the year
  	%k 	hour
  	%l 	hour, 12 hour clock
  	%L 	month number, starting with 1
  	%m 	month number, starting with 01
  	%M 	minute, leading 0's
  	%n 	NEWLINE
  	%o	ornate day of month -- "1st", "2nd", "25th", etc.
  	%p 	AM or PM 
  	%P 	am or pm (Yes %p and %P are backwards :)
  	%q	Quarter number, starting with 1
  	%r 	time format: 09:05:57 PM
  	%R 	time format: 21:05
  	%s	seconds since the Epoch, UCT
  	%S 	seconds, leading 0's
  	%t 	TAB
  	%T 	time format: 21:05:57
  	%U 	week number, Sunday as first day of week
  	%w 	day of the week, numerically, Sunday == 0
  	%W 	week number, Monday as first day of week
  	%x 	date format: 11/19/94
  	%X 	time format: 21:05:57
  	%y	year (2 digits)
  	%Y	year (4 digits)
  	%Z 	timezone in ascii. eg: PST
  	%z	timezone in format -/+0000
  
  C<%d>, C<%e>, C<%H>, C<%I>, C<%j>, C<%k>, C<%l>, C<%m>, C<%M>, C<%q>,
  C<%y> and C<%Y> can be output in Roman numerals by prefixing the letter
  with C<O>, e.g. C<%OY> will output the year as roman numerals.
  
  =head1 LIMITATION
  
  The functions in this module are limited to the time range that can be
  represented by the time_t data type, i.e. 1901-12-13 20:45:53 GMT to
  2038-01-19 03:14:07 GMT.
  
  =head1 AUTHOR
  
  Graham Barr <gbarr@pobox.com>
  
  =head1 COPYRIGHT
  
  Copyright (c) 1995-2009 Graham Barr. This program is free
  software; you can redistribute it and/or modify it under the same terms
  as Perl itself.
  
  =cut
  
  
DATE_FORMAT

    $main::fatpacked{"Date/Parse.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATE_PARSE';
  # Copyright (c) 1995-2009 Graham Barr. This program is free
  # software; you can redistribute it and/or modify it under the same terms
  # as Perl itself.
  
  package Date::Parse;
  
  require 5.000;
  use strict;
  use vars qw($VERSION @ISA @EXPORT);
  use Time::Local;
  use Carp;
  use Time::Zone;
  use Exporter;
  
  @ISA = qw(Exporter);
  @EXPORT = qw(&strtotime &str2time &strptime);
  
  $VERSION = "2.30";
  
  my %month = (
  	january		=> 0,
  	february	=> 1,
  	march		=> 2,
  	april		=> 3,
  	may		=> 4,
  	june		=> 5,
  	july		=> 6,
  	august		=> 7,
  	september	=> 8,
  	sept		=> 8,
  	october		=> 9,
  	november	=> 10,
  	december	=> 11,
  	);
  
  my %day = (
  	sunday		=> 0,
  	monday		=> 1,
  	tuesday		=> 2,
  	tues		=> 2,
  	wednesday	=> 3,
  	wednes		=> 3,
  	thursday	=> 4,
  	thur		=> 4,
  	thurs		=> 4,
  	friday		=> 5,
  	saturday	=> 6,
  	);
  
  my @suf = (qw(th st nd rd th th th th th th)) x 3;
  @suf[11,12,13] = qw(th th th);
  
  #Abbreviations
  
  map { $month{substr($_,0,3)} = $month{$_} } keys %month;
  map { $day{substr($_,0,3)}   = $day{$_} }   keys %day;
  
  my $strptime = <<'ESQ';
   my %month = map { lc $_ } %$mon_ref;
   my $daypat = join("|", map { lc $_ } reverse sort keys %$day_ref);
   my $monpat = join("|", reverse sort keys %month);
   my $sufpat = join("|", reverse sort map { lc $_ } @$suf_ref);
  
   my %ampm = (
  	'a' => 0,  # AM
  	'p' => 12, # PM
  	);
  
   my($AM, $PM) = (0,12);
  
  sub {
  
    my $dtstr = lc shift;
    my $merid = 24;
  
    my($year,$month,$day,$hh,$mm,$ss,$zone,$dst,$frac);
  
    $zone = tz_offset(shift) if @_;
  
    1 while $dtstr =~ s#\([^\(\)]*\)# #o;
  
    $dtstr =~ s#(\A|\n|\Z)# #sog;
  
    # ignore day names
    $dtstr =~ s#([\d\w\s])[\.\,]\s#$1 #sog;
    $dtstr =~ s/,/ /g;
    $dtstr =~ s#($daypat)\s*(den\s)?\b# #o;
    # Time: 12:00 or 12:00:00 with optional am/pm
  
    return unless $dtstr =~ /\S/;
    
    if ($dtstr =~ s/\s(\d{4})([-:]?)(\d\d?)\2(\d\d?)(?:[-Tt ](\d\d?)(?:([-:]?)(\d\d?)(?:\6(\d\d?)(?:[.,](\d+))?)?)?)?(?=\D)/ /) {
      ($year,$month,$day,$hh,$mm,$ss,$frac) = ($1,$3-1,$4,$5,$7,$8,$9);
    }
  
    unless (defined $hh) {
      if ($dtstr =~ s#[:\s](\d\d?):(\d\d?)(:(\d\d?)(?:\.\d+)?)?(z)?\s*(?:([ap])\.?m?\.?)?\s# #o) {
        ($hh,$mm,$ss) = ($1,$2,$4);
        $zone = 0 if $5;
        $merid = $ampm{$6} if $6;
      }
  
      # Time: 12 am
      
      elsif ($dtstr =~ s#\s(\d\d?)\s*([ap])\.?m?\.?\s# #o) {
        ($hh,$mm,$ss) = ($1,0,0);
        $merid = $ampm{$2};
      }
    }
      
    if (defined $hh and $hh <= 12 and $dtstr =~ s# ([ap])\.?m?\.?\s# #o) {
      $merid = $ampm{$1};
    }
  
  
    unless (defined $year) {
      # Date: 12-June-96 (using - . or /)
      
      if ($dtstr =~ s#\s(\d\d?)([\-\./])($monpat)(\2(\d\d+))?\s# #o) {
        ($month,$day) = ($month{$3},$1);
        $year = $5 if $5;
      }
      
      # Date: 12-12-96 (using '-', '.' or '/' )
      
      elsif ($dtstr =~ s#\s(\d+)([\-\./])(\d\d?)(\2(\d+))?\s# #o) {
        ($month,$day) = ($1 - 1,$3);
  
        if ($5) {
  	$year = $5;
  	# Possible match for 1995-01-24 (short mainframe date format);
  	($year,$month,$day) = ($1, $3 - 1, $5) if $month > 12;
  	return if length($year) > 2 and $year < 1901;
        }
      }
      elsif ($dtstr =~ s#\s(\d+)\s*($sufpat)?\s*($monpat)# #o) {
        ($month,$day) = ($month{$3},$1);
      }
      elsif ($dtstr =~ s#($monpat)\s*(\d+)\s*($sufpat)?\s# #o) {
        ($month,$day) = ($month{$1},$2);
      }
      elsif ($dtstr =~ s#($monpat)([\/-])(\d+)[\/-]# #o) {
        ($month,$day) = ($month{$1},$3);
      }
  
      # Date: 961212
  
      elsif ($dtstr =~ s#\s(\d\d)(\d\d)(\d\d)\s# #o) {
        ($year,$month,$day) = ($1,$2-1,$3);
      }
  
      $year = $1 if !defined($year) and $dtstr =~ s#\s(\d{2}(\d{2})?)[\s\.,]# #o;
  
    }
  
    # Zone
  
    $dst = 1 if $dtstr =~ s#\bdst\b##o;
  
    if ($dtstr =~ s#\s"?([a-z]{3,4})(dst|\d+[a-z]*|_[a-z]+)?"?\s# #o) {
      $dst = 1 if $2 and $2 eq 'dst';
      $zone = tz_offset($1);
      return unless defined $zone;
    }
    elsif ($dtstr =~ s#\s([a-z]{3,4})?([\-\+]?)-?(\d\d?):?(\d\d)?(00)?\s# #o) {
      my $m = defined($4) ? "$2$4" : 0;
      my $h = "$2$3";
      $zone = defined($1) ? tz_offset($1) : 0;
      return unless defined $zone;
      $zone += 60 * ($m + (60 * $h));
    }
  
    if ($dtstr =~ /\S/) {
      # now for some dumb dates
      if ($dtstr =~ s/^\s*(ut?|z)\s*$//) {
        $zone = 0;
      }
      elsif ($dtstr =~ s#\s([a-z]{3,4})?([\-\+]?)-?(\d\d?)(\d\d)?(00)?\s# #o) {
        my $m = defined($4) ? "$2$4" : 0;
        my $h = "$2$3";
        $zone = defined($1) ? tz_offset($1) : 0;
        return unless defined $zone;
        $zone += 60 * ($m + (60 * $h));
      }
  
      return if $dtstr =~ /\S/o;
    }
  
    if (defined $hh) {
      if ($hh == 12) {
        $hh = 0 if $merid == $AM;
      }
      elsif ($merid == $PM) {
        $hh += 12;
      }
    }
  
    $year -= 1900 if defined $year && $year > 1900;
  
    $zone += 3600 if defined $zone && $dst;
    $ss += "0.$frac" if $frac;
  
    return ($ss,$mm,$hh,$day,$month,$year,$zone);
  }
  ESQ
  
  use vars qw($day_ref $mon_ref $suf_ref $obj);
  
  sub gen_parser
  {
   local($day_ref,$mon_ref,$suf_ref,$obj) = @_;
  
   if($obj)
    {
     my $obj_strptime = $strptime;
     substr($obj_strptime,index($strptime,"sub")+6,0) = <<'ESQ';
   shift; # package
  ESQ
     my $sub = eval "$obj_strptime" or die $@;
     return $sub;
    }
  
   eval "$strptime" or die $@;
  
  }
  
  *strptime = gen_parser(\%day,\%month,\@suf);
  
  sub str2time
  {
   my @t = strptime(@_);
  
   return undef
  	unless @t;
  
   my($ss,$mm,$hh,$day,$month,$year,$zone) = @t;
   my @lt  = localtime(time);
  
   $hh    ||= 0;
   $mm    ||= 0;
   $ss    ||= 0;
  
   my $frac = $ss - int($ss);
   $ss = int $ss;
  
   $month = $lt[4]
  	unless(defined $month);
  
   $day  = $lt[3]
  	unless(defined $day);
  
   $year = ($month > $lt[4]) ? ($lt[5] - 1) : $lt[5]
  	unless(defined $year);
  
   return undef
  	unless($month <= 11 && $day >= 1 && $day <= 31
  		&& $hh <= 23 && $mm <= 59 && $ss <= 59);
  
   my $result;
  
   if (defined $zone) {
     $result = eval {
       local $SIG{__DIE__} = sub {}; # Ick!
       timegm($ss,$mm,$hh,$day,$month,$year);
     };
     return undef
       if !defined $result
          or $result == -1
             && join("",$ss,$mm,$hh,$day,$month,$year)
       	        ne "595923311169";
     $result -= $zone;
   }
   else {
     $result = eval {
       local $SIG{__DIE__} = sub {}; # Ick!
       timelocal($ss,$mm,$hh,$day,$month,$year);
     };
     return undef
       if !defined $result
          or $result == -1
             && join("",$ss,$mm,$hh,$day,$month,$year)
       	        ne join("",(localtime(-1))[0..5]);
   }
  
   return $result + $frac;
  }
  
  1;
  
  __END__
  
  
  =head1 NAME
  
  Date::Parse - Parse date strings into time values
  
  =head1 SYNOPSIS
  
  	use Date::Parse;
  	
  	$time = str2time($date);
  	
  	($ss,$mm,$hh,$day,$month,$year,$zone) = strptime($date);
  
  =head1 DESCRIPTION
  
  C<Date::Parse> provides two routines for parsing date strings into time values.
  
  =over 4
  
  =item str2time(DATE [, ZONE])
  
  C<str2time> parses C<DATE> and returns a unix time value, or undef upon failure.
  C<ZONE>, if given, specifies the timezone to assume when parsing if the
  date string does not specify a timezone.
  
  =item strptime(DATE [, ZONE])
  
  C<strptime> takes the same arguments as str2time but returns an array of
  values C<($ss,$mm,$hh,$day,$month,$year,$zone)>. Elements are only defined
  if they could be extracted from the date string. The C<$zone> element is
  the timezone offset in seconds from GMT. An empty array is returned upon
  failure.
  
  =head1 MULTI-LANGUAGE SUPPORT
  
  Date::Parse is capable of parsing dates in several languages, these include
  English, French, German and Italian.
  
  	$lang = Date::Language->new('German');
  	$lang->str2time("25 Jun 1996 21:09:55 +0100");
  
  =head1 EXAMPLE DATES
  
  Below is a sample list of dates that are known to be parsable with Date::Parse
  
   1995:01:24T09:08:17.1823213           ISO-8601
   1995-01-24T09:08:17.1823213
   Wed, 16 Jun 94 07:29:35 CST           Comma and day name are optional 
   Thu, 13 Oct 94 10:13:13 -0700
   Wed, 9 Nov 1994 09:50:32 -0500 (EST)  Text in ()'s will be ignored.
   21 dec 17:05                          Will be parsed in the current time zone
   21-dec 17:05
   21/dec 17:05
   21/dec/93 17:05
   1999 10:02:18 "GMT"
   16 Nov 94 22:28:20 PST 
  
  =head1 LIMITATION
  
  Date::Parse uses L<Time::Local> internally, so is limited to only parsing dates
  which result in valid values for Time::Local::timelocal. This generally means dates
  between 1901-12-17 00:00:00 GMT and 2038-01-16 23:59:59 GMT
  
  =head1 BUGS
  
  When both the month and the date are specified in the date as numbers
  they are always parsed assuming that the month number comes before the
  date. This is the usual format used in American dates.
  
  The reason why it is like this and not dynamic is that it must be
  deterministic. Several people have suggested using the current locale,
  but this will not work as the date being parsed may not be in the format
  of the current locale.
  
  My plans to address this, which will be in a future release, is to allow
  the programmer to state what order they want these values parsed in.
  
  =head1 AUTHOR
  
  Graham Barr <gbarr@pobox.com>
  
  =head1 COPYRIGHT
  
  Copyright (c) 1995-2009 Graham Barr. This program is free
  software; you can redistribute it and/or modify it under the same terms
  as Perl itself.
  
  =cut
  
DATE_PARSE

    $main::fatpacked{"DateTime.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME';
  ## no critic (Modules::ProhibitExcessMainComplexity)
  package DateTime;
  
  use 5.008004;
  
  use strict;
  use warnings;
  use warnings::register;
  use namespace::autoclean 0.19;
  
  our $VERSION = '1.51';
  
  use Carp;
  use DateTime::Duration;
  use DateTime::Helpers;
  use DateTime::Locale 1.06;
  use DateTime::TimeZone 2.02;
  use DateTime::Types;
  use POSIX qw( floor fmod );
  use Params::ValidationCompiler 0.26 qw( validation_for );
  use Scalar::Util qw( blessed );
  use Try::Tiny;
  
  ## no critic (Variables::ProhibitPackageVars)
  our $IsPurePerl;
  
  {
      my $loaded = 0;
  
      unless ( $ENV{PERL_DATETIME_PP} ) {
          try {
              require XSLoader;
              XSLoader::load(
                  __PACKAGE__,
                  exists $DateTime::{VERSION} && ${ $DateTime::{VERSION} }
                  ? ${ $DateTime::{VERSION} }
                  : 42
              );
  
              $loaded     = 1;
              $IsPurePerl = 0;
          }
          catch {
              die $_ if $_ && $_ !~ /object version|loadable object/;
          };
      }
  
      if ($loaded) {
          ## no critic (Variables::ProtectPrivateVars)
          require DateTime::PPExtra
              unless defined &DateTime::_normalize_tai_seconds;
      }
      else {
          require DateTime::PP;
      }
  }
  
  # for some reason, overloading doesn't work unless fallback is listed
  # early.
  #
  # 3rd parameter ( $_[2] ) means the parameters are 'reversed'.
  # see: "Calling conventions for binary operations" in overload docs.
  #
  use overload (
      fallback => 1,
      '<=>'    => '_compare_overload',
      'cmp'    => '_string_compare_overload',
      q{""}    => 'stringify',
      bool     => sub {1},
      '-'      => '_subtract_overload',
      '+'      => '_add_overload',
      'eq'     => '_string_equals_overload',
      'ne'     => '_string_not_equals_overload',
  );
  
  # Have to load this after overloading is defined, after BEGIN blocks
  # or else weird crashes ensue
  require DateTime::Infinite;
  
  sub MAX_NANOSECONDS () {1_000_000_000}                  # 1E9 = almost 32 bits
  sub INFINITY ()        { 100**100**100**100 }
  sub NEG_INFINITY ()    { -1 * ( 100**100**100**100 ) }
  sub NAN ()             { INFINITY - INFINITY }
  
  sub SECONDS_PER_DAY () {86400}
  
  sub duration_class () {'DateTime::Duration'}
  
  my (
      @MonthLengths,
      @LeapYearMonthLengths,
      @QuarterLengths,
      @LeapYearQuarterLengths,
  );
  
  BEGIN {
      @MonthLengths = ( 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 );
  
      @LeapYearMonthLengths = @MonthLengths;
      $LeapYearMonthLengths[1]++;
  
      @QuarterLengths = ( 90, 91, 92, 92 );
  
      @LeapYearQuarterLengths = @QuarterLengths;
      $LeapYearQuarterLengths[0]++;
  }
  
  {
  
      # I'd rather use Class::Data::Inheritable for this, but there's no
      # way to add the module-loading behavior to an accessor it
      # creates, despite what its docs say!
      my $DefaultLocale;
  
      sub DefaultLocale {
          shift;
  
          if (@_) {
              my $lang = shift;
  
              $DefaultLocale = DateTime::Locale->load($lang);
          }
  
          return $DefaultLocale;
      }
  }
  __PACKAGE__->DefaultLocale('en-US');
  
  {
      my $validator = validation_for(
          name             => '_check_new_params',
          name_is_optional => 1,
          params           => {
              year  => { type => t('Year') },
              month => {
                  type    => t('Month'),
                  default => 1,
              },
              day => {
                  type    => t('DayOfMonth'),
                  default => 1,
              },
              hour => {
                  type    => t('Hour'),
                  default => 0,
              },
              minute => {
                  type    => t('Minute'),
                  default => 0,
              },
              second => {
                  type    => t('Second'),
                  default => 0,
              },
              nanosecond => {
                  type    => t('Nanosecond'),
                  default => 0,
              },
              locale => {
                  type     => t('Locale'),
                  optional => 1,
              },
              formatter => {
                  type     => t('Formatter'),
                  optional => 1,
              },
              time_zone => {
                  type     => t('TimeZone'),
                  optional => 1,
              },
          },
      );
  
      sub new {
          my $class = shift;
          my %p     = $validator->(@_);
  
          Carp::croak(
              "Invalid day of month (day = $p{day} - month = $p{month} - year = $p{year})\n"
              )
              if $p{day} > 28
              && $p{day} > $class->_month_length( $p{year}, $p{month} );
  
          return $class->_new(%p);
      }
  }
  
  sub _new {
      my $class = shift;
      my %p     = @_;
  
      Carp::croak('Constructor called with reference, we expected a package')
          if ref $class;
  
      # If this method is called from somewhere other than new(), then some of
      # these defaults may not get applied.
      $p{month}      = 1                          unless exists $p{month};
      $p{day}        = 1                          unless exists $p{day};
      $p{hour}       = 0                          unless exists $p{hour};
      $p{minute}     = 0                          unless exists $p{minute};
      $p{second}     = 0                          unless exists $p{second};
      $p{nanosecond} = 0                          unless exists $p{nanosecond};
      $p{time_zone}  = $class->_default_time_zone unless exists $p{time_zone};
  
      my $self = bless {}, $class;
  
      $self->_set_locale( $p{locale} );
  
      $self->{tz} = (
          ref $p{time_zone}
          ? $p{time_zone}
          : DateTime::TimeZone->new( name => $p{time_zone} )
      );
  
      $self->{local_rd_days} = $class->_ymd2rd( @p{qw( year month day )} );
  
      $self->{local_rd_secs}
          = $class->_time_as_seconds( @p{qw( hour minute second )} );
  
      $self->{offset_modifier} = 0;
  
      $self->{rd_nanosecs} = $p{nanosecond};
      $self->{formatter}   = $p{formatter};
  
      $self->_normalize_nanoseconds(
          $self->{local_rd_secs},
          $self->{rd_nanosecs}
      );
  
      # Set this explicitly since it can't be calculated accurately
      # without knowing our time zone offset, and it's possible that the
      # offset can't be calculated without having at least a rough guess
      # of the datetime's year. This year need not be correct, as long
      # as its equal or greater to the correct number, so we fudge by
      # adding one to the local year given to the constructor.
      $self->{utc_year} = $p{year} + 1;
  
      $self->_maybe_future_dst_warning( $p{year}, $p{time_zone} );
  
      $self->_calc_utc_rd;
  
      $self->_handle_offset_modifier( $p{second} );
  
      $self->_calc_local_rd;
  
      if ( $p{second} > 59 ) {
          if (
              $self->{tz}->is_floating
              ||
  
              # If true, this means that the actual calculated leap
              # second does not occur in the second given to new()
              ( $self->{utc_rd_secs} - 86399 < $p{second} - 59 )
          ) {
              Carp::croak("Invalid second value ($p{second})\n");
          }
      }
  
      return $self;
  }
  
  # Warning: do not use this environment variable unless you have no choice in
  # the matter.
  sub _default_time_zone {
      return $ENV{PERL_DATETIME_DEFAULT_TZ} || 'floating';
  }
  
  sub _set_locale {
      my $self   = shift;
      my $locale = shift;
  
      if ( defined $locale && ref $locale ) {
          $self->{locale} = $locale;
      }
      else {
          $self->{locale}
              = $locale
              ? DateTime::Locale->load($locale)
              : $self->DefaultLocale();
      }
  
      return;
  }
  
  # This method exists for the benefit of internal methods which create
  # a new object based on the current object, like set() and truncate().
  sub _new_from_self {
      my $self = shift;
      my %p    = @_;
  
      my %old = map { $_ => $self->$_() } qw(
          year month day
          hour minute second
          nanosecond
          locale time_zone
      );
      $old{formatter} = $self->formatter()
          if defined $self->formatter();
  
      my $method = delete $p{_skip_validation} ? '_new' : 'new';
  
      return ( ref $self )->$method( %old, %p );
  }
  
  sub _handle_offset_modifier {
      my $self = shift;
  
      $self->{offset_modifier} = 0;
  
      return if $self->{tz}->is_floating;
  
      my $second       = shift;
      my $utc_is_valid = shift;
  
      my $utc_rd_days = $self->{utc_rd_days};
  
      my $offset
          = $utc_is_valid ? $self->offset : $self->_offset_for_local_datetime;
  
      if (   $offset >= 0
          && $self->{local_rd_secs} >= $offset ) {
          if ( $second < 60 && $offset > 0 ) {
              $self->{offset_modifier}
                  = $self->_day_length( $utc_rd_days - 1 ) - SECONDS_PER_DAY;
  
              $self->{local_rd_secs} += $self->{offset_modifier};
          }
          elsif (
              $second == 60
              && (
                  ( $self->{local_rd_secs} == $offset && $offset > 0 )
                  || (   $offset == 0
                      && $self->{local_rd_secs} > 86399 )
              )
          ) {
              my $mod
                  = $self->_day_length( $utc_rd_days - 1 ) - SECONDS_PER_DAY;
  
              unless ( $mod == 0 ) {
                  $self->{utc_rd_secs} -= $mod;
  
                  $self->_normalize_seconds;
              }
          }
      }
      elsif ($offset < 0
          && $self->{local_rd_secs} >= SECONDS_PER_DAY + $offset ) {
          if ( $second < 60 ) {
              $self->{offset_modifier}
                  = $self->_day_length( $utc_rd_days - 1 ) - SECONDS_PER_DAY;
  
              $self->{local_rd_secs} += $self->{offset_modifier};
          }
          elsif ($second == 60
              && $self->{local_rd_secs} == SECONDS_PER_DAY + $offset ) {
              my $mod
                  = $self->_day_length( $utc_rd_days - 1 ) - SECONDS_PER_DAY;
  
              unless ( $mod == 0 ) {
                  $self->{utc_rd_secs} -= $mod;
  
                  $self->_normalize_seconds;
              }
          }
      }
  }
  
  sub _calc_utc_rd {
      my $self = shift;
  
      delete $self->{utc_c};
  
      if ( $self->{tz}->is_utc || $self->{tz}->is_floating ) {
          $self->{utc_rd_days} = $self->{local_rd_days};
          $self->{utc_rd_secs} = $self->{local_rd_secs};
      }
      else {
          my $offset = $self->_offset_for_local_datetime;
  
          $offset += $self->{offset_modifier};
  
          $self->{utc_rd_days} = $self->{local_rd_days};
          $self->{utc_rd_secs} = $self->{local_rd_secs} - $offset;
      }
  
      # We account for leap seconds in the new() method and nowhere else
      # except date math.
      $self->_normalize_tai_seconds(
          $self->{utc_rd_days},
          $self->{utc_rd_secs}
      );
  }
  
  sub _normalize_seconds {
      my $self = shift;
  
      return if $self->{utc_rd_secs} >= 0 && $self->{utc_rd_secs} <= 86399;
  
      if ( $self->{tz}->is_floating ) {
          $self->_normalize_tai_seconds(
              $self->{utc_rd_days},
              $self->{utc_rd_secs}
          );
      }
      else {
          $self->_normalize_leap_seconds(
              $self->{utc_rd_days},
              $self->{utc_rd_secs}
          );
      }
  }
  
  sub _calc_local_rd {
      my $self = shift;
  
      delete $self->{local_c};
  
      # We must short circuit for UTC times or else we could end up with
      # loops between DateTime.pm and DateTime::TimeZone
      if ( $self->{tz}->is_utc || $self->{tz}->is_floating ) {
          $self->{local_rd_days} = $self->{utc_rd_days};
          $self->{local_rd_secs} = $self->{utc_rd_secs};
      }
      else {
          my $offset = $self->offset;
  
          $self->{local_rd_days} = $self->{utc_rd_days};
          $self->{local_rd_secs} = $self->{utc_rd_secs} + $offset;
  
          # intentionally ignore leap seconds here
          $self->_normalize_tai_seconds(
              $self->{local_rd_days},
              $self->{local_rd_secs}
          );
  
          $self->{local_rd_secs} += $self->{offset_modifier};
      }
  
      $self->_calc_local_components;
  }
  
  sub _calc_local_components {
      my $self = shift;
  
      @{ $self->{local_c} }{
          qw( year month day day_of_week
              day_of_year quarter day_of_quarter)
          }
          = $self->_rd2ymd( $self->{local_rd_days}, 1 );
  
      @{ $self->{local_c} }{qw( hour minute second )}
          = $self->_seconds_as_components(
          $self->{local_rd_secs},
          $self->{utc_rd_secs}, $self->{offset_modifier}
          );
  }
  
  {
      my $validator = validation_for(
          name             => '_check_from_epoch_params',
          name_is_optional => 1,
          params           => {
              epoch     => { type => t('Num') },
              formatter => {
                  type     => t('Formatter'),
                  optional => 1
              },
              locale => {
                  type     => t('Locale'),
                  optional => 1
              },
              time_zone => {
                  type     => t('TimeZone'),
                  optional => 1
              },
          },
      );
  
      sub from_epoch {
          my $class = shift;
          my %p     = $validator->(@_);
  
          my %args;
  
          # This does two things. First, if given a negative non-integer epoch,
          # it will round the epoch _down_ to the next second and then adjust
          # the nanoseconds to be positive. In other words, -0.5 corresponds to
          # a second of -1 and a nanosecond value of 500,000. Before this code
          # was implemented our handling of negative non-integer epochs was
          # quite broken, and would end up rounding some values up, so that -0.5
          # become 0.5 (which is obviously wrong!).
          #
          # Second, it rounds any decimal values to the nearest microsecond
          # (1E6). Here's what Christian Hansen, who wrote this patch, says:
          #
          #     Perl is typically compiled with NV as a double. A double with a
          #     significand precision of 53 bits can only represent a nanosecond
          #     epoch without loss of precision if the duration from zero epoch
          #     is less than ≈ ±104 days. With microseconds the duration is
          #     ±104,000 days, which is ≈ ±285 years.
          if ( int $p{epoch} != $p{epoch} ) {
              my ( $floor, $nano, $second );
  
              $floor  = $nano = fmod( $p{epoch}, 1.0 );
              $second = floor( $p{epoch} - $floor );
              if ( $nano < 0 ) {
                  $nano += 1;
              }
              $p{epoch}         = $second + floor( $floor - $nano );
              $args{nanosecond} = floor( $nano * 1E6 + 0.5 ) * 1E3;
          }
  
          # Note, for very large negative values this may give a
          # blatantly wrong answer.
          @args{qw( second minute hour day month year )}
              = ( gmtime( $p{epoch} ) )[ 0 .. 5 ];
          $args{year} += 1900;
          $args{month}++;
  
          my $self = $class->_new( %p, %args, time_zone => 'UTC' );
  
          $self->_maybe_future_dst_warning( $self->year(), $p{time_zone} );
  
          $self->set_time_zone( $p{time_zone} ) if exists $p{time_zone};
  
          return $self;
      }
  }
  
  sub now {
      my $class = shift;
      return $class->from_epoch( epoch => $class->_core_time(), @_ );
  }
  
  sub _maybe_future_dst_warning {
      shift;
      my $year = shift;
      my $tz   = shift;
  
      return unless $year >= 5000 && $tz;
  
      my $tz_name = ref $tz ? $tz->name() : $tz;
      return if $tz_name eq 'floating' || $tz_name eq 'UTC';
  
      warnings::warnif(
          "You are creating a DateTime object with a far future year ($year) and a time zone ($tz_name)."
              . ' If the time zone you specified has future DST changes this will be very slow.'
      );
  }
  
  # use scalar time in case someone's loaded Time::Piece
  sub _core_time {
      return scalar time;
  }
  
  sub today { shift->now(@_)->truncate( to => 'day' ) }
  
  {
      my $validator = validation_for(
          name             => '_check_from_object_params',
          name_is_optional => 1,
          params           => {
              object => { type => t('ConvertibleObject') },
              locale => {
                  type     => t('Locale'),
                  optional => 1,
              },
              formatter => {
                  type     => t('Formatter'),
                  optional => 1,
              },
          },
      );
  
      sub from_object {
          my $class = shift;
          my %p     = $validator->(@_);
  
          my $object = delete $p{object};
  
          if ( $object->isa('DateTime::Infinite') ) {
              return $object->clone;
          }
  
          my ( $rd_days, $rd_secs, $rd_nanosecs ) = $object->utc_rd_values;
  
          # A kludge because until all calendars are updated to return all
          # three values, $rd_nanosecs could be undef
          $rd_nanosecs ||= 0;
  
          # This is a big hack to let _seconds_as_components operate naively
          # on the given value. If the object _is_ on a leap second, we'll
          # add that to the generated seconds value later.
          my $leap_seconds = 0;
          if (   $object->can('time_zone')
              && !$object->time_zone->is_floating
              && $rd_secs > 86399
              && $rd_secs <= $class->_day_length($rd_days) ) {
              $leap_seconds = $rd_secs - 86399;
              $rd_secs -= $leap_seconds;
          }
  
          my %args;
          @args{qw( year month day )} = $class->_rd2ymd($rd_days);
          @args{qw( hour minute second )}
              = $class->_seconds_as_components($rd_secs);
          $args{nanosecond} = $rd_nanosecs;
  
          $args{second} += $leap_seconds;
  
          my $new = $class->new( %p, %args, time_zone => 'UTC' );
  
          if ( $object->can('time_zone') ) {
              $new->set_time_zone( $object->time_zone );
          }
          else {
              $new->set_time_zone( $class->_default_time_zone );
          }
  
          return $new;
      }
  }
  
  {
      my $validator = validation_for(
          name             => '_check_last_day_of_month_params',
          name_is_optional => 1,
          params           => {
              year  => { type => t('Year') },
              month => { type => t('Month') },
              day   => {
                  type    => t('DayOfMonth'),
                  default => 1,
              },
              hour => {
                  type    => t('Hour'),
                  default => 0,
              },
              minute => {
                  type    => t('Minute'),
                  default => 0,
              },
              second => {
                  type    => t('Second'),
                  default => 0,
              },
              nanosecond => {
                  type    => t('Nanosecond'),
                  default => 0,
              },
              locale => {
                  type     => t('Locale'),
                  optional => 1,
              },
              formatter => {
                  type     => t('Formatter'),
                  optional => 1,
              },
              time_zone => {
                  type     => t('TimeZone'),
                  optional => 1,
              },
          },
      );
  
      sub last_day_of_month {
          my $class = shift;
          my %p     = $validator->(@_);
  
          my $day = $class->_month_length( $p{year}, $p{month} );
  
          return $class->_new( %p, day => $day );
      }
  }
  
  sub _month_length {
      return (
            $_[0]->_is_leap_year( $_[1] )
          ? $LeapYearMonthLengths[ $_[2] - 1 ]
          : $MonthLengths[ $_[2] - 1 ]
      );
  }
  
  {
      my $validator = validation_for(
          name             => '_check_from_day_of_year_params',
          name_is_optional => 1,
          params           => {
              year        => { type => t('Year') },
              day_of_year => { type => t('DayOfYear') },
              hour        => {
                  type    => t('Hour'),
                  default => 0,
              },
              minute => {
                  type    => t('Minute'),
                  default => 0,
              },
              second => {
                  type    => t('Second'),
                  default => 0,
              },
              nanosecond => {
                  type    => t('Nanosecond'),
                  default => 0,
              },
              locale => {
                  type     => t('Locale'),
                  optional => 1,
              },
              formatter => {
                  type     => t('Formatter'),
                  optional => 1,
              },
              time_zone => {
                  type     => t('TimeZone'),
                  optional => 1,
              },
          },
      );
  
      sub from_day_of_year {
          my $class = shift;
          my %p     = $validator->(@_);
  
          Carp::croak("$p{year} is not a leap year.\n")
              if $p{day_of_year} == 366 && !$class->_is_leap_year( $p{year} );
  
          my $month = 1;
          my $day   = delete $p{day_of_year};
  
          if ( $day > 31 ) {
              my $length = $class->_month_length( $p{year}, $month );
  
              while ( $day > $length ) {
                  $day -= $length;
                  $month++;
                  $length = $class->_month_length( $p{year}, $month );
              }
          }
  
          return $class->_new(
              %p,
              month => $month,
              day   => $day,
          );
      }
  }
  
  sub formatter { $_[0]->{formatter} }
  
  sub clone { bless { %{ $_[0] } }, ref $_[0] }
  
  sub year {
      Carp::carp('year() is a read-only accessor') if @_ > 1;
      return $_[0]->{local_c}{year};
  }
  
  sub ce_year {
      $_[0]->{local_c}{year} <= 0
          ? $_[0]->{local_c}{year} - 1
          : $_[0]->{local_c}{year};
  }
  
  sub era_name { $_[0]->{locale}->era_wide->[ $_[0]->_era_index() ] }
  
  sub era_abbr { $_[0]->{locale}->era_abbreviated->[ $_[0]->_era_index() ] }
  
  # deprecated
  *era = \&era_abbr;
  
  sub _era_index { $_[0]->{local_c}{year} <= 0 ? 0 : 1 }
  
  sub christian_era { $_[0]->ce_year > 0 ? 'AD' : 'BC' }
  sub secular_era   { $_[0]->ce_year > 0 ? 'CE' : 'BCE' }
  
  sub year_with_era           { ( abs $_[0]->ce_year ) . $_[0]->era_abbr }
  sub year_with_christian_era { ( abs $_[0]->ce_year ) . $_[0]->christian_era }
  sub year_with_secular_era   { ( abs $_[0]->ce_year ) . $_[0]->secular_era }
  
  sub month {
      Carp::carp('month() is a read-only accessor') if @_ > 1;
      return $_[0]->{local_c}{month};
  }
  *mon = \&month;
  
  sub month_0 { $_[0]->{local_c}{month} - 1 }
  *mon_0 = \&month_0;
  
  sub month_name { $_[0]->{locale}->month_format_wide->[ $_[0]->month_0() ] }
  
  sub month_abbr {
      $_[0]->{locale}->month_format_abbreviated->[ $_[0]->month_0() ];
  }
  
  sub day_of_month {
      Carp::carp('day_of_month() is a read-only accessor') if @_ > 1;
      $_[0]->{local_c}{day};
  }
  *day  = \&day_of_month;
  *mday = \&day_of_month;
  
  sub weekday_of_month { use integer; ( ( $_[0]->day - 1 ) / 7 ) + 1 }
  
  sub quarter { $_[0]->{local_c}{quarter} }
  
  sub quarter_name {
      $_[0]->{locale}->quarter_format_wide->[ $_[0]->quarter_0() ];
  }
  
  sub quarter_abbr {
      $_[0]->{locale}->quarter_format_abbreviated->[ $_[0]->quarter_0() ];
  }
  
  sub quarter_0 { $_[0]->{local_c}{quarter} - 1 }
  
  sub day_of_month_0 { $_[0]->{local_c}{day} - 1 }
  *day_0  = \&day_of_month_0;
  *mday_0 = \&day_of_month_0;
  
  sub day_of_week { $_[0]->{local_c}{day_of_week} }
  *wday = \&day_of_week;
  *dow  = \&day_of_week;
  
  sub day_of_week_0 { $_[0]->{local_c}{day_of_week} - 1 }
  *wday_0 = \&day_of_week_0;
  *dow_0  = \&day_of_week_0;
  
  sub local_day_of_week {
      my $self = shift;
      return 1
          + ( $self->day_of_week - $self->{locale}->first_day_of_week ) % 7;
  }
  
  sub day_name { $_[0]->{locale}->day_format_wide->[ $_[0]->day_of_week_0() ] }
  
  sub day_abbr {
      $_[0]->{locale}->day_format_abbreviated->[ $_[0]->day_of_week_0() ];
  }
  
  sub day_of_quarter { $_[0]->{local_c}{day_of_quarter} }
  *doq = \&day_of_quarter;
  
  sub day_of_quarter_0 { $_[0]->day_of_quarter - 1 }
  *doq_0 = \&day_of_quarter_0;
  
  sub day_of_year { $_[0]->{local_c}{day_of_year} }
  *doy = \&day_of_year;
  
  sub day_of_year_0 { $_[0]->{local_c}{day_of_year} - 1 }
  *doy_0 = \&day_of_year_0;
  
  sub am_or_pm {
      $_[0]->{locale}->am_pm_abbreviated->[ $_[0]->hour() < 12 ? 0 : 1 ];
  }
  
  sub ymd {
      my ( $self, $sep ) = @_;
      $sep = '-' unless defined $sep;
  
      return sprintf(
          '%0.4d%s%0.2d%s%0.2d',
          $self->year,             $sep,
          $self->{local_c}{month}, $sep,
          $self->{local_c}{day}
      );
  }
  *date = sub { shift->ymd(@_) };
  
  sub mdy {
      my ( $self, $sep ) = @_;
      $sep = '-' unless defined $sep;
  
      return sprintf(
          '%0.2d%s%0.2d%s%0.4d',
          $self->{local_c}{month}, $sep,
          $self->{local_c}{day},   $sep,
          $self->year
      );
  }
  
  sub dmy {
      my ( $self, $sep ) = @_;
      $sep = '-' unless defined $sep;
  
      return sprintf(
          '%0.2d%s%0.2d%s%0.4d',
          $self->{local_c}{day},   $sep,
          $self->{local_c}{month}, $sep,
          $self->year
      );
  }
  
  sub hour {
      Carp::carp('hour() is a read-only accessor') if @_ > 1;
      return $_[0]->{local_c}{hour};
  }
  sub hour_1 { $_[0]->{local_c}{hour} == 0 ? 24 : $_[0]->{local_c}{hour} }
  
  sub hour_12 { my $h = $_[0]->hour % 12; return $h ? $h : 12 }
  sub hour_12_0 { $_[0]->hour % 12 }
  
  sub minute {
      Carp::carp('minute() is a read-only accessor') if @_ > 1;
      return $_[0]->{local_c}{minute};
  }
  *min = \&minute;
  
  sub second {
      Carp::carp('second() is a read-only accessor') if @_ > 1;
      return $_[0]->{local_c}{second};
  }
  *sec = \&second;
  
  sub fractional_second { $_[0]->second + $_[0]->nanosecond / MAX_NANOSECONDS }
  
  sub nanosecond {
      Carp::carp('nanosecond() is a read-only accessor') if @_ > 1;
      return $_[0]->{rd_nanosecs};
  }
  
  sub millisecond { floor( $_[0]->{rd_nanosecs} / 1000000 ) }
  
  sub microsecond { floor( $_[0]->{rd_nanosecs} / 1000 ) }
  
  sub leap_seconds {
      my $self = shift;
  
      return 0 if $self->{tz}->is_floating;
  
      return $self->_accumulated_leap_seconds( $self->{utc_rd_days} );
  }
  
  sub stringify {
      my $self = shift;
  
      return $self->iso8601 unless $self->{formatter};
      return $self->{formatter}->format_datetime($self);
  }
  
  sub hms {
      my ( $self, $sep ) = @_;
      $sep = ':' unless defined $sep;
  
      return sprintf(
          '%0.2d%s%0.2d%s%0.2d',
          $self->{local_c}{hour},   $sep,
          $self->{local_c}{minute}, $sep,
          $self->{local_c}{second}
      );
  }
  
  # don't want to override CORE::time()
  *DateTime::time = sub { shift->hms(@_) };
  
  sub iso8601 { $_[0]->datetime('T') }
  
  sub datetime {
      my ( $self, $sep ) = @_;
      $sep = 'T' unless defined $sep;
      return join $sep, $self->ymd('-'), $self->hms(':');
  }
  
  sub is_leap_year { $_[0]->_is_leap_year( $_[0]->year ) }
  
  sub month_length {
      $_[0]->_month_length( $_[0]->year, $_[0]->month );
  }
  
  sub quarter_length {
      return (
            $_[0]->_is_leap_year( $_[0]->year )
          ? $LeapYearQuarterLengths[ $_[0]->quarter - 1 ]
          : $QuarterLengths[ $_[0]->quarter - 1 ]
      );
  }
  
  sub year_length {
      $_[0]->_is_leap_year( $_[0]->year ) ? 366 : 365;
  }
  
  sub is_last_day_of_month {
      $_[0]->day == $_[0]->_month_length( $_[0]->year, $_[0]->month );
  }
  
  sub is_last_day_of_quarter {
      $_[0]->day_of_quarter == $_[0]->quarter_length;
  }
  
  sub is_last_day_of_year {
      $_[0]->day_of_year == $_[0]->year_length;
  }
  
  sub week {
      my $self = shift;
  
      $self->{utc_c}{week_year} ||= $self->_week_values;
  
      return @{ $self->{utc_c}{week_year} }[ 0, 1 ];
  }
  
  # This algorithm comes from
  # https://en.wikipedia.org/wiki/ISO_week_date#Calculating_the_week_number_of_a_given_date
  sub _week_values {
      my $self = shift;
  
      my $week
          = int( ( ( $self->day_of_year - $self->day_of_week ) + 10 ) / 7 );
  
      my $year = $self->year;
      if ( $week == 0 ) {
          $year--;
          return [ $year, $self->_weeks_in_year($year) ];
      }
      elsif ( $week == 53 && $self->_weeks_in_year($year) == 52 ) {
          return [ $year + 1, 1 ];
      }
  
      return [ $year, $week ];
  }
  
  sub _weeks_in_year {
      my $self = shift;
      my $year = shift;
  
      my $dow = $self->_ymd2rd( $year, 1, 1 ) % 7;
  
      # Years starting with a Thursday and leap years starting with a Wednesday
      # have 53 weeks.
      return ( $dow == 4 || ( $dow == 3 && $self->_is_leap_year($year) ) )
          ? 53
          : 52;
  }
  
  sub week_year   { ( $_[0]->week )[0] }
  sub week_number { ( $_[0]->week )[1] }
  
  # ISO says that the first week of a year is the first week containing
  # a Thursday. Extending that says that the first week of the month is
  # the first week containing a Thursday. ICU agrees.
  sub week_of_month {
      my $self = shift;
      my $thu  = $self->day + 4 - $self->day_of_week;
      return int( ( $thu + 6 ) / 7 );
  }
  
  sub time_zone {
      Carp::carp('time_zone() is a read-only accessor') if @_ > 1;
      return $_[0]->{tz};
  }
  
  sub offset { $_[0]->{tz}->offset_for_datetime( $_[0] ) }
  
  sub _offset_for_local_datetime {
      $_[0]->{tz}->offset_for_local_datetime( $_[0] );
  }
  
  sub is_dst { $_[0]->{tz}->is_dst_for_datetime( $_[0] ) }
  
  sub time_zone_long_name  { $_[0]->{tz}->name }
  sub time_zone_short_name { $_[0]->{tz}->short_name_for_datetime( $_[0] ) }
  
  sub locale {
      Carp::carp('locale() is a read-only accessor') if @_ > 1;
      return $_[0]->{locale};
  }
  
  sub utc_rd_values {
      @{ $_[0] }{ 'utc_rd_days', 'utc_rd_secs', 'rd_nanosecs' };
  }
  
  sub local_rd_values {
      @{ $_[0] }{ 'local_rd_days', 'local_rd_secs', 'rd_nanosecs' };
  }
  
  # NOTE: no nanoseconds, no leap seconds
  sub utc_rd_as_seconds {
      ( $_[0]->{utc_rd_days} * SECONDS_PER_DAY ) + $_[0]->{utc_rd_secs};
  }
  
  # NOTE: no nanoseconds, no leap seconds
  sub local_rd_as_seconds {
      ( $_[0]->{local_rd_days} * SECONDS_PER_DAY ) + $_[0]->{local_rd_secs};
  }
  
  # RD 1 is MJD 678,576 - a simple offset
  sub mjd {
      my $self = shift;
  
      my $mjd = $self->{utc_rd_days} - 678_576;
  
      my $day_length = $self->_day_length( $self->{utc_rd_days} );
  
      return (  $mjd
              + ( $self->{utc_rd_secs} / $day_length )
              + ( $self->{rd_nanosecs} / $day_length / MAX_NANOSECONDS ) );
  }
  
  sub jd { $_[0]->mjd + 2_400_000.5 }
  
  {
      my %strftime_patterns = (
          'a' => sub { $_[0]->day_abbr },
          'A' => sub { $_[0]->day_name },
          'b' => sub { $_[0]->month_abbr },
          'B' => sub { $_[0]->month_name },
          'c' => sub {
              $_[0]->format_cldr( $_[0]->{locale}->datetime_format_default() );
          },
          'C' => sub { int( $_[0]->year / 100 ) },
          'd' => sub { sprintf( '%02d', $_[0]->day_of_month ) },
          'D' => sub { $_[0]->strftime('%m/%d/%y') },
          'e' => sub { sprintf( '%2d', $_[0]->day_of_month ) },
          'F' => sub { $_[0]->strftime('%Y-%m-%d') },
          'g' => sub { substr( $_[0]->week_year, -2 ) },
          'G' => sub { $_[0]->week_year },
          'H' => sub { sprintf( '%02d', $_[0]->hour ) },
          'I' => sub { sprintf( '%02d', $_[0]->hour_12 ) },
          'j' => sub { sprintf( '%03d', $_[0]->day_of_year ) },
          'k' => sub { sprintf( '%2d', $_[0]->hour ) },
          'l' => sub { sprintf( '%2d', $_[0]->hour_12 ) },
          'm' => sub { sprintf( '%02d', $_[0]->month ) },
          'M' => sub { sprintf( '%02d', $_[0]->minute ) },
          'n' => sub {"\n"},                     # should this be OS-sensitive?
          'N' => \&_format_nanosecs,
          'p' => sub { $_[0]->am_or_pm() },
          'P' => sub { lc $_[0]->am_or_pm() },
          'r' => sub { $_[0]->strftime('%I:%M:%S %p') },
          'R' => sub { $_[0]->strftime('%H:%M') },
          's' => sub { $_[0]->epoch },
          'S' => sub { sprintf( '%02d', $_[0]->second ) },
          't' => sub {"\t"},
          'T' => sub { $_[0]->strftime('%H:%M:%S') },
          'u' => sub { $_[0]->day_of_week },
          'U' => sub {
              my $sun = $_[0]->day_of_year - ( $_[0]->day_of_week + 7 ) % 7;
              return sprintf( '%02d', int( ( $sun + 6 ) / 7 ) );
          },
          'V' => sub { sprintf( '%02d', $_[0]->week_number ) },
          'w' => sub {
              my $dow = $_[0]->day_of_week;
              return $dow % 7;
          },
          'W' => sub {
              my $mon = $_[0]->day_of_year - ( $_[0]->day_of_week + 6 ) % 7;
              return sprintf( '%02d', int( ( $mon + 6 ) / 7 ) );
          },
          'x' => sub {
              $_[0]->format_cldr( $_[0]->{locale}->date_format_default() );
          },
          'X' => sub {
              $_[0]->format_cldr( $_[0]->{locale}->time_format_default() );
          },
          'y' => sub { sprintf( '%02d', substr( $_[0]->year, -2 ) ) },
          'Y' => sub { return $_[0]->year },
          'z' => sub { DateTime::TimeZone->offset_as_string( $_[0]->offset ) },
          'Z' => sub { $_[0]->{tz}->short_name_for_datetime( $_[0] ) },
          '%' => sub {'%'},
      );
  
      $strftime_patterns{h} = $strftime_patterns{b};
  
      sub strftime {
          my $self = shift;
  
          # make a copy or caller's scalars get munged
          my @patterns = @_;
  
          my @r;
          foreach my $p (@patterns) {
              $p =~ s/
                      (?:
                        %\{(\w+)\}       # method name like %{day_name}
                        |
                        %([%a-zA-Z])     # single character specifier like %d
                        |
                        %(\d+)N          # special case for %N
                      )
                     /
                      ( $1
                        ? ( $self->can($1) ? $self->$1() : "\%{$1}" )
                        : $2
                        ? ( $strftime_patterns{$2} ? $strftime_patterns{$2}->($self) : "\%$2" )
                        : $3
                        ? $strftime_patterns{N}->($self, $3)
                        : ''  # this won't happen
                      )
                     /sgex;
  
              return $p unless wantarray;
  
              push @r, $p;
          }
  
          return @r;
      }
  }
  
  {
  
      # It's an array because the order in which the regexes are checked
      # is important. These patterns are similar to the ones Java uses,
      # but not quite the same. See
      # http://www.unicode.org/reports/tr35/tr35-9.html#Date_Format_Patterns.
      my @patterns = (
          qr/GGGGG/ =>
              sub { $_[0]->{locale}->era_narrow->[ $_[0]->_era_index() ] },
          qr/GGGG/   => 'era_name',
          qr/G{1,3}/ => 'era_abbr',
  
          qr/(y{3,5})/ =>
              sub { $_[0]->_zero_padded_number( $1, $_[0]->year() ) },
  
          # yy is a weird special case, where it must be exactly 2 digits
          qr/yy/ => sub {
              my $year = $_[0]->year();
              my $y2   = length $year > 2 ? substr( $year, -2, 2 ) : $year;
              $y2 *= -1 if $year < 0;
              $_[0]->_zero_padded_number( 'yy', $y2 );
          },
          qr/y/    => sub { $_[0]->year() },
          qr/(u+)/ => sub { $_[0]->_zero_padded_number( $1, $_[0]->year() ) },
          qr/(Y+)/ =>
              sub { $_[0]->_zero_padded_number( $1, $_[0]->week_year() ) },
  
          qr/QQQQ/ => 'quarter_name',
          qr/QQQ/  => 'quarter_abbr',
          qr/(QQ?)/ =>
              sub { $_[0]->_zero_padded_number( $1, $_[0]->quarter() ) },
  
          qr/qqqq/ => sub {
              $_[0]->{locale}->quarter_stand_alone_wide()
                  ->[ $_[0]->quarter_0() ];
          },
          qr/qqq/ => sub {
              $_[0]->{locale}->quarter_stand_alone_abbreviated()
                  ->[ $_[0]->quarter_0() ];
          },
          qr/(qq?)/ =>
              sub { $_[0]->_zero_padded_number( $1, $_[0]->quarter() ) },
  
          qr/MMMMM/ =>
              sub { $_[0]->{locale}->month_format_narrow->[ $_[0]->month_0() ] }
          ,
          qr/MMMM/  => 'month_name',
          qr/MMM/   => 'month_abbr',
          qr/(MM?)/ => sub { $_[0]->_zero_padded_number( $1, $_[0]->month() ) },
  
          qr/LLLLL/ => sub {
              $_[0]->{locale}->month_stand_alone_narrow->[ $_[0]->month_0() ];
          },
          qr/LLLL/ => sub {
              $_[0]->{locale}->month_stand_alone_wide->[ $_[0]->month_0() ];
          },
          qr/LLL/ => sub {
              $_[0]->{locale}
                  ->month_stand_alone_abbreviated->[ $_[0]->month_0() ];
          },
          qr/(LL?)/ => sub { $_[0]->_zero_padded_number( $1, $_[0]->month() ) },
  
          qr/(ww?)/ =>
              sub { $_[0]->_zero_padded_number( $1, $_[0]->week_number() ) },
          qr/W/ => 'week_of_month',
  
          qr/(dd?)/ =>
              sub { $_[0]->_zero_padded_number( $1, $_[0]->day_of_month() ) },
          qr/(D{1,3})/ =>
              sub { $_[0]->_zero_padded_number( $1, $_[0]->day_of_year() ) },
  
          qr/F/    => 'weekday_of_month',
          qr/(g+)/ => sub { $_[0]->_zero_padded_number( $1, $_[0]->mjd() ) },
  
          qr/EEEEE/ => sub {
              $_[0]->{locale}->day_format_narrow->[ $_[0]->day_of_week_0() ];
          },
          qr/EEEE/   => 'day_name',
          qr/E{1,3}/ => 'day_abbr',
  
          qr/eeeee/ => sub {
              $_[0]->{locale}->day_format_narrow->[ $_[0]->day_of_week_0() ];
          },
          qr/eeee/  => 'day_name',
          qr/eee/   => 'day_abbr',
          qr/(ee?)/ => sub {
              $_[0]->_zero_padded_number( $1, $_[0]->local_day_of_week() );
          },
  
          qr/ccccc/ => sub {
              $_[0]->{locale}
                  ->day_stand_alone_narrow->[ $_[0]->day_of_week_0() ];
          },
          qr/cccc/ => sub {
              $_[0]->{locale}->day_stand_alone_wide->[ $_[0]->day_of_week_0() ];
          },
          qr/ccc/ => sub {
              $_[0]->{locale}
                  ->day_stand_alone_abbreviated->[ $_[0]->day_of_week_0() ];
          },
          qr/(cc?)/ =>
              sub { $_[0]->_zero_padded_number( $1, $_[0]->day_of_week() ) },
  
          qr/a/ => 'am_or_pm',
  
          qr/(hh?)/ =>
              sub { $_[0]->_zero_padded_number( $1, $_[0]->hour_12() ) },
          qr/(HH?)/ => sub { $_[0]->_zero_padded_number( $1, $_[0]->hour() ) },
          qr/(KK?)/ =>
              sub { $_[0]->_zero_padded_number( $1, $_[0]->hour_12_0() ) },
          qr/(kk?)/ =>
              sub { $_[0]->_zero_padded_number( $1, $_[0]->hour_1() ) },
          qr/(jj?)/ => sub {
              my $h
                  = $_[0]->{locale}->prefers_24_hour_time()
                  ? $_[0]->hour()
                  : $_[0]->hour_12();
              $_[0]->_zero_padded_number( $1, $h );
          },
  
          qr/(mm?)/ =>
              sub { $_[0]->_zero_padded_number( $1, $_[0]->minute() ) },
  
          qr/(ss?)/ =>
              sub { $_[0]->_zero_padded_number( $1, $_[0]->second() ) },
  
          # The LDML spec is not 100% clear on how to truncate this field, but
          # this way seems as good as anything.
          qr/(S+)/ => sub { $_[0]->_format_nanosecs( length($1) ) },
          qr/A+/ =>
              sub { ( $_[0]->{local_rd_secs} * 1000 ) + $_[0]->millisecond() },
  
          qr/zzzz/   => sub { $_[0]->time_zone_long_name() },
          qr/z{1,3}/ => sub { $_[0]->time_zone_short_name() },
          qr/ZZZZZ/  => sub {
              substr(
                  my $z
                      = DateTime::TimeZone->offset_as_string( $_[0]->offset() ),
                  -2, 0, ':'
              );
              $z;
          },
          qr/ZZZZ/ => sub {
              $_[0]->time_zone_short_name()
                  . DateTime::TimeZone->offset_as_string( $_[0]->offset() );
          },
          qr/Z{1,3}/ =>
              sub { DateTime::TimeZone->offset_as_string( $_[0]->offset() ) },
          qr/vvvv/   => sub { $_[0]->time_zone_long_name() },
          qr/v{1,3}/ => sub { $_[0]->time_zone_short_name() },
          qr/VVVV/   => sub { $_[0]->time_zone_long_name() },
          qr/V{1,3}/ => sub { $_[0]->time_zone_short_name() },
      );
  
      sub _zero_padded_number {
          my $self = shift;
          my $size = length shift;
          my $val  = shift;
  
          return sprintf( "%0${size}d", $val );
      }
  
      sub format_cldr {
          my $self = shift;
  
          # make a copy or caller's scalars get munged
          my @p = @_;
  
          my @r;
          foreach my $p (@p) {
              $p =~ s/\G
                      (?:
                        '((?:[^']|'')*)' # quote escaped bit of text
                                         # it needs to end with one
                                         # quote not followed by
                                         # another
                        |
                        (([a-zA-Z])\3*)     # could be a pattern
                        |
                        (.)                 # anything else
                      )
                     /
                      defined $1
                      ? $1
                      : defined $2
                      ? $self->_cldr_pattern($2)
                      : defined $4
                      ? $4
                      : undef # should never get here
                     /sgex;
  
              $p =~ s/\'\'/\'/g;
  
              return $p unless wantarray;
  
              push @r, $p;
          }
  
          return @r;
      }
  
      sub _cldr_pattern {
          my $self    = shift;
          my $pattern = shift;
  
          ## no critic (ControlStructures::ProhibitCStyleForLoops)
          for ( my $i = 0; $i < @patterns; $i += 2 ) {
              if ( $pattern =~ /$patterns[$i]/ ) {
                  my $sub = $patterns[ $i + 1 ];
  
                  return $self->$sub();
              }
          }
  
          return $pattern;
      }
  }
  
  sub _format_nanosecs {
      my $self      = shift;
      my $precision = @_ ? shift : 9;
  
      my $exponent     = 9 - $precision;
      my $formatted_ns = floor(
          (
                $exponent < 0
              ? $self->{rd_nanosecs} * 10**-$exponent
              : $self->{rd_nanosecs} / 10**$exponent
          )
      );
  
      return sprintf(
          '%0' . $precision . 'u',
          $formatted_ns
      );
  }
  
  sub epoch {
      my $self = shift;
  
      return $self->{utc_c}{epoch}
          if exists $self->{utc_c}{epoch};
  
      return $self->{utc_c}{epoch}
          = ( $self->{utc_rd_days} - 719163 ) * SECONDS_PER_DAY
          + $self->{utc_rd_secs};
  }
  
  sub hires_epoch {
      my $self = shift;
  
      my $epoch = $self->epoch;
  
      return undef unless defined $epoch;
  
      my $nano = $self->{rd_nanosecs} / MAX_NANOSECONDS;
  
      return $epoch + $nano;
  }
  
  sub is_finite   {1}
  sub is_infinite {0}
  
  # added for benefit of DateTime::TimeZone
  sub utc_year { $_[0]->{utc_year} }
  
  # returns a result that is relative to the first datetime
  sub subtract_datetime {
      my $dt1 = shift;
      my $dt2 = shift;
  
      $dt2 = $dt2->clone->set_time_zone( $dt1->time_zone )
          unless $dt1->time_zone eq $dt2->time_zone;
  
      # We only want a negative duration if $dt2 > $dt1 ($self)
      my ( $bigger, $smaller, $negative ) = (
          $dt1 >= $dt2
          ? ( $dt1, $dt2, 0 )
          : ( $dt2, $dt1, 1 )
      );
  
      my $is_floating = $dt1->time_zone->is_floating
          && $dt2->time_zone->is_floating;
  
      my $minute_length = 60;
      unless ($is_floating) {
          my ( $utc_rd_days, $utc_rd_secs ) = $smaller->utc_rd_values;
  
          if ( $utc_rd_secs >= 86340 && !$is_floating ) {
  
              # If the smaller of the two datetimes occurs in the last
              # UTC minute of the UTC day, then that minute may not be
              # 60 seconds long. If we need to subtract a minute from
              # the larger datetime's minutes count in order to adjust
              # the seconds difference to be positive, we need to know
              # how long that minute was. If one of the datetimes is
              # floating, we just assume a minute is 60 seconds.
  
              $minute_length = $dt1->_day_length($utc_rd_days) - 86340;
          }
      }
  
      # This is a gross hack that basically figures out if the bigger of
      # the two datetimes is the day of a DST change. If it's a 23 hour
      # day (switching _to_ DST) then we subtract 60 minutes from the
      # local time. If it's a 25 hour day then we add 60 minutes to the
      # local time.
      #
      # This produces the most "intuitive" results, though there are
      # still reversibility problems with the resultant duration.
      #
      # However, if the two objects are on the same (local) date, and we
      # are not crossing a DST change, we don't want to invoke the hack
      # - see 38local-subtract.t
      my $bigger_min = $bigger->hour * 60 + $bigger->minute;
      if (   $bigger->time_zone->has_dst_changes
          && $bigger->is_dst != $smaller->is_dst ) {
  
          $bigger_min -= 60
  
              # it's a 23 hour (local) day
              if (
              $bigger->is_dst
              && do {
                  my $prev_day = try { $bigger->clone->subtract( days => 1 ) };
                  $prev_day && !$prev_day->is_dst ? 1 : 0;
              }
              );
  
          $bigger_min += 60
  
              # it's a 25 hour (local) day
              if (
              !$bigger->is_dst
              && do {
                  my $prev_day = try { $bigger->clone->subtract( days => 1 ) };
                  $prev_day && $prev_day->is_dst ? 1 : 0;
              }
              );
      }
  
      my ( $months, $days, $minutes, $seconds, $nanoseconds )
          = $dt1->_adjust_for_positive_difference(
          $bigger->year * 12 + $bigger->month,
          $smaller->year * 12 + $smaller->month,
  
          $bigger->day, $smaller->day,
  
          $bigger_min, $smaller->hour * 60 + $smaller->minute,
  
          $bigger->second, $smaller->second,
  
          $bigger->nanosecond, $smaller->nanosecond,
  
          $minute_length,
  
          # XXX - using the smaller as the month length is
          # somewhat arbitrary, we could also use the bigger -
          # either way we have reversibility problems
          $dt1->_month_length( $smaller->year, $smaller->month ),
          );
  
      if ($negative) {
          for ( $months, $days, $minutes, $seconds, $nanoseconds ) {
  
              # Some versions of Perl can end up with -0 if we do "0 * -1"!!
              $_ *= -1 if $_;
          }
      }
  
      return $dt1->duration_class->new(
          months      => $months,
          days        => $days,
          minutes     => $minutes,
          seconds     => $seconds,
          nanoseconds => $nanoseconds,
      );
  }
  
  sub _adjust_for_positive_difference
  {    ## no critic (Subroutines::ProhibitManyArgs)
      my (
          $self,
          $month1, $month2,
          $day1,   $day2,
          $min1,   $min2,
          $sec1,   $sec2,
          $nano1,  $nano2,
          $minute_length,
          $month_length,
      ) = @_;
  
      if ( $nano1 < $nano2 ) {
          $sec1--;
          $nano1 += MAX_NANOSECONDS;
      }
  
      if ( $sec1 < $sec2 ) {
          $min1--;
          $sec1 += $minute_length;
      }
  
      # A day always has 24 * 60 minutes, though the minutes may vary in
      # length.
      if ( $min1 < $min2 ) {
          $day1--;
          $min1 += 24 * 60;
      }
  
      if ( $day1 < $day2 ) {
          $month1--;
          $day1 += $month_length;
      }
  
      return (
          $month1 - $month2,
          $day1 - $day2,
          $min1 - $min2,
          $sec1 - $sec2,
          $nano1 - $nano2,
      );
  }
  
  sub subtract_datetime_absolute {
      my $self = shift;
      my $dt   = shift;
  
      my $utc_rd_secs1 = $self->utc_rd_as_seconds;
      $utc_rd_secs1 += $self->_accumulated_leap_seconds( $self->{utc_rd_days} )
          if !$self->time_zone->is_floating;
  
      my $utc_rd_secs2 = $dt->utc_rd_as_seconds;
      $utc_rd_secs2 += $self->_accumulated_leap_seconds( $dt->{utc_rd_days} )
          if !$dt->time_zone->is_floating;
  
      my $seconds     = $utc_rd_secs1 - $utc_rd_secs2;
      my $nanoseconds = $self->nanosecond - $dt->nanosecond;
  
      if ( $nanoseconds < 0 ) {
          $seconds--;
          $nanoseconds += MAX_NANOSECONDS;
      }
  
      return $self->duration_class->new(
          seconds     => $seconds,
          nanoseconds => $nanoseconds,
      );
  }
  
  sub delta_md {
      my $self = shift;
      my $dt   = shift;
  
      my ( $smaller, $bigger ) = sort $self, $dt;
  
      my ( $months, $days, undef, undef, undef )
          = $dt->_adjust_for_positive_difference(
          $bigger->year * 12 + $bigger->month,
          $smaller->year * 12 + $smaller->month,
  
          $bigger->day, $smaller->day,
  
          0, 0,
  
          0, 0,
  
          0, 0,
  
          60,
  
          $smaller->_month_length( $smaller->year, $smaller->month ),
          );
  
      return $self->duration_class->new(
          months => $months,
          days   => $days
      );
  }
  
  sub delta_days {
      my $self = shift;
      my $dt   = shift;
  
      my $days
          = abs( ( $self->local_rd_values )[0] - ( $dt->local_rd_values )[0] );
  
      $self->duration_class->new( days => $days );
  }
  
  sub delta_ms {
      my $self = shift;
      my $dt   = shift;
  
      my ( $smaller, $greater ) = sort $self, $dt;
  
      my $days = int( $greater->jd - $smaller->jd );
  
      my $dur = $greater->subtract_datetime($smaller);
  
      my %p;
      $p{hours}   = $dur->hours + ( $days * 24 );
      $p{minutes} = $dur->minutes;
      $p{seconds} = $dur->seconds;
  
      return $self->duration_class->new(%p);
  }
  
  sub _add_overload {
      my ( $dt, $dur, $reversed ) = @_;
  
      if ($reversed) {
          ( $dur, $dt ) = ( $dt, $dur );
      }
  
      unless ( DateTime::Helpers::isa( $dur, 'DateTime::Duration' ) ) {
          my $class     = ref $dt;
          my $dt_string = overload::StrVal($dt);
  
          Carp::croak( "Cannot add $dur to a $class object ($dt_string).\n"
                  . ' Only a DateTime::Duration object can '
                  . " be added to a $class object." );
      }
  
      return $dt->clone->add_duration($dur);
  }
  
  sub _subtract_overload {
      my ( $date1, $date2, $reversed ) = @_;
  
      if ($reversed) {
          ( $date2, $date1 ) = ( $date1, $date2 );
      }
  
      if ( DateTime::Helpers::isa( $date2, 'DateTime::Duration' ) ) {
          my $new = $date1->clone;
          $new->add_duration( $date2->inverse );
          return $new;
      }
      elsif ( DateTime::Helpers::isa( $date2, 'DateTime' ) ) {
          return $date1->subtract_datetime($date2);
      }
      else {
          my $class     = ref $date1;
          my $dt_string = overload::StrVal($date1);
  
          Carp::croak(
              "Cannot subtract $date2 from a $class object ($dt_string).\n"
                  . ' Only a DateTime::Duration or DateTime object can '
                  . " be subtracted from a $class object." );
      }
  }
  
  sub add {
      my $self = shift;
  
      return $self->add_duration( $self->_duration_object_from_args(@_) );
  }
  
  sub subtract {
      my $self = shift;
  
      my %eom;
      if ( @_ % 2 == 0 ) {
          my %p = @_;
  
          $eom{end_of_month} = delete $p{end_of_month}
              if exists $p{end_of_month};
      }
  
      my $dur = $self->_duration_object_from_args(@_)->inverse(%eom);
  
      return $self->add_duration($dur);
  }
  
  # Syntactic sugar for add and subtract: use a duration object if it's
  # supplied, otherwise build a new one from the arguments.
  
  sub _duration_object_from_args {
      my $self = shift;
  
      return $_[0]
          if @_ == 1 && blessed( $_[0] ) && $_[0]->isa( $self->duration_class );
  
      return $self->duration_class->new(@_);
  }
  
  sub subtract_duration { return $_[0]->add_duration( $_[1]->inverse ) }
  
  {
      my $validator = validation_for(
          name             => '_check_add_duration_params',
          name_is_optional => 1,
          params           => [
              { type => t('Duration') },
          ],
      );
  
      ## no critic (Subroutines::ProhibitExcessComplexity)
      sub add_duration {
          my $self = shift;
          my ($dur) = $validator->(@_);
  
          # simple optimization
          return $self if $dur->is_zero;
  
          my %deltas = $dur->deltas;
  
          # This bit isn't quite right since DateTime::Infinite::Future -
          # infinite duration should NaN
          foreach my $val ( values %deltas ) {
              my $inf;
              if ( $val == INFINITY ) {
                  $inf = DateTime::Infinite::Future->new;
              }
              elsif ( $val == NEG_INFINITY ) {
                  $inf = DateTime::Infinite::Past->new;
              }
  
              if ($inf) {
                  %$self = %$inf;
                  bless $self, ref $inf;
  
                  return $self;
              }
          }
  
          return $self if $self->is_infinite;
  
          my %orig = %{$self};
          try {
              $self->_add_duration($dur);
          }
          catch {
              %{$self} = %orig;
              die $_;
          };
      }
  }
  
  sub _add_duration {
      my $self = shift;
      my $dur  = shift;
  
      my %deltas = $dur->deltas;
  
      if ( $deltas{days} ) {
          $self->{local_rd_days} += $deltas{days};
  
          $self->{utc_year} += int( $deltas{days} / 365 ) + 1;
      }
  
      if ( $deltas{months} ) {
  
          # For preserve mode, if it is the last day of the month, make
          # it the 0th day of the following month (which then will
          # normalize back to the last day of the new month).
          my ( $y, $m, $d ) = (
                $dur->is_preserve_mode
              ? $self->_rd2ymd( $self->{local_rd_days} + 1 )
              : $self->_rd2ymd( $self->{local_rd_days} )
          );
  
          $d -= 1 if $dur->is_preserve_mode;
  
          if ( !$dur->is_wrap_mode && $d > 28 ) {
  
              # find the rd for the last day of our target month
              $self->{local_rd_days}
                  = $self->_ymd2rd( $y, $m + $deltas{months} + 1, 0 );
  
              # what day of the month is it? (discard year and month)
              my $last_day
                  = ( $self->_rd2ymd( $self->{local_rd_days} ) )[2];
  
              # if our original day was less than the last day,
              # use that instead
              $self->{local_rd_days} -= $last_day - $d if $last_day > $d;
          }
          else {
              $self->{local_rd_days}
                  = $self->_ymd2rd( $y, $m + $deltas{months}, $d );
          }
  
          $self->{utc_year} += int( $deltas{months} / 12 ) + 1;
      }
  
      if ( $deltas{days} || $deltas{months} ) {
          $self->_calc_utc_rd;
  
          $self->_handle_offset_modifier( $self->second );
      }
  
      if ( $deltas{minutes} ) {
          $self->{utc_rd_secs} += $deltas{minutes} * 60;
  
          # This intentionally ignores leap seconds
          $self->_normalize_tai_seconds(
              $self->{utc_rd_days},
              $self->{utc_rd_secs}
          );
      }
  
      if ( $deltas{seconds} || $deltas{nanoseconds} ) {
          $self->{utc_rd_secs} += $deltas{seconds};
  
          if ( $deltas{nanoseconds} ) {
              $self->{rd_nanosecs} += $deltas{nanoseconds};
              $self->_normalize_nanoseconds(
                  $self->{utc_rd_secs},
                  $self->{rd_nanosecs}
              );
          }
  
          $self->_normalize_seconds;
  
          # This might be some big number much bigger than 60, but
          # that's ok (there are tests in 19leap_second.t to confirm
          # that)
          $self->_handle_offset_modifier( $self->second + $deltas{seconds} );
      }
  
      my $new = ( ref $self )->from_object(
          object => $self,
          locale => $self->{locale},
          ( $self->{formatter} ? ( formatter => $self->{formatter} ) : () ),
      );
  
      %$self = %$new;
  
      return $self;
  }
  
  sub _compare_overload {
  
      # note: $_[1]->compare( $_[0] ) is an error when $_[1] is not a
      # DateTime (such as the INFINITY value)
  
      return undef unless defined $_[1];
  
      return $_[2] ? -$_[0]->compare( $_[1] ) : $_[0]->compare( $_[1] );
  }
  
  sub _string_compare_overload {
      my ( $dt1, $dt2, $flip ) = @_;
  
      # One is a DateTime object, one isn't. Just stringify and compare.
      if ( !DateTime::Helpers::can( $dt2, 'utc_rd_values' ) ) {
          my $sign = $flip ? -1 : 1;
          return $sign * ( "$dt1" cmp "$dt2" );
      }
      else {
          my $meth = $dt1->can('_compare_overload');
          goto $meth;
      }
  }
  
  sub compare {
      shift->_compare( @_, 0 );
  }
  
  sub compare_ignore_floating {
      shift->_compare( @_, 1 );
  }
  
  sub _compare {
      my ( undef, $dt1, $dt2, $consistent ) = ref $_[0] ? ( undef, @_ ) : @_;
  
      return undef unless defined $dt2;
  
      if ( !ref $dt2 && ( $dt2 == INFINITY || $dt2 == NEG_INFINITY ) ) {
          return $dt1->{utc_rd_days} <=> $dt2;
      }
  
      unless ( DateTime::Helpers::can( $dt1, 'utc_rd_values' )
          && DateTime::Helpers::can( $dt2, 'utc_rd_values' ) ) {
          my $dt1_string = overload::StrVal($dt1);
          my $dt2_string = overload::StrVal($dt2);
  
          Carp::croak( 'A DateTime object can only be compared to'
                  . " another DateTime object ($dt1_string, $dt2_string)." );
      }
  
      if (   !$consistent
          && DateTime::Helpers::can( $dt1, 'time_zone' )
          && DateTime::Helpers::can( $dt2, 'time_zone' ) ) {
          my $is_floating1 = $dt1->time_zone->is_floating;
          my $is_floating2 = $dt2->time_zone->is_floating;
  
          if ( $is_floating1 && !$is_floating2 ) {
              $dt1 = $dt1->clone->set_time_zone( $dt2->time_zone );
          }
          elsif ( $is_floating2 && !$is_floating1 ) {
              $dt2 = $dt2->clone->set_time_zone( $dt1->time_zone );
          }
      }
  
      my @dt1_components = $dt1->utc_rd_values;
      my @dt2_components = $dt2->utc_rd_values;
  
      foreach my $i ( 0 .. 2 ) {
          return $dt1_components[$i] <=> $dt2_components[$i]
              if $dt1_components[$i] != $dt2_components[$i];
      }
  
      return 0;
  }
  
  sub _string_equals_overload {
      my ( $class, $dt1, $dt2 ) = ref $_[0] ? ( undef, @_ ) : @_;
  
      if ( !DateTime::Helpers::can( $dt2, 'utc_rd_values' ) ) {
          return "$dt1" eq "$dt2";
      }
  
      $class ||= ref $dt1;
      return !$class->compare( $dt1, $dt2 );
  }
  
  sub _string_not_equals_overload {
      return !_string_equals_overload(@_);
  }
  
  sub _normalize_nanoseconds {
      use integer;
  
      # seconds, nanoseconds
      if ( $_[2] < 0 ) {
          my $overflow = 1 + $_[2] / MAX_NANOSECONDS;
          $_[2] += $overflow * MAX_NANOSECONDS;
          $_[1] -= $overflow;
      }
      elsif ( $_[2] >= MAX_NANOSECONDS ) {
          my $overflow = $_[2] / MAX_NANOSECONDS;
          $_[2] -= $overflow * MAX_NANOSECONDS;
          $_[1] += $overflow;
      }
  }
  
  {
      my $validator = validation_for(
          name             => '_check_set_params',
          name_is_optional => 1,
          params           => {
              year => {
                  type     => t('Year'),
                  optional => 1,
              },
              month => {
                  type     => t('Month'),
                  optional => 1,
              },
              day => {
                  type     => t('DayOfMonth'),
                  optional => 1,
              },
              hour => {
                  type     => t('Hour'),
                  optional => 1,
              },
              minute => {
                  type     => t('Minute'),
                  optional => 1,
              },
              second => {
                  type     => t('Second'),
                  optional => 1,
              },
              nanosecond => {
                  type     => t('Nanosecond'),
                  optional => 1,
              },
              locale => {
                  type     => t('Locale'),
                  optional => 1,
              },
          },
      );
  
      ## no critic (NamingConventions::ProhibitAmbiguousNames)
      sub set {
          my $self = shift;
          my %p    = $validator->(@_);
  
          if ( $p{locale} ) {
              carp 'You passed a locale to the set() method.'
                  . ' You should use set_locale() instead, as using set() may alter the local time near a DST boundary.';
          }
  
          my $new_dt = $self->_new_from_self(%p);
  
          %$self = %$new_dt;
  
          return $self;
      }
  }
  
  sub set_year       { $_[0]->set( year       => $_[1] ) }
  sub set_month      { $_[0]->set( month      => $_[1] ) }
  sub set_day        { $_[0]->set( day        => $_[1] ) }
  sub set_hour       { $_[0]->set( hour       => $_[1] ) }
  sub set_minute     { $_[0]->set( minute     => $_[1] ) }
  sub set_second     { $_[0]->set( second     => $_[1] ) }
  sub set_nanosecond { $_[0]->set( nanosecond => $_[1] ) }
  
  # These two are special cased because ... if the local time is the hour of a
  # DST change where the same local time occurs twice then passing it through
  # _new() can actually change the underlying UTC time, which is bad.
  
  {
      my $validator = validation_for(
          name             => '_check_set_locale_params',
          name_is_optional => 1,
          params           => [
              { type => t( 'Maybe', of => t('Locale') ) },
          ],
      );
  
      sub set_locale {
          my $self = shift;
          my ($locale) = $validator->(@_);
  
          $self->_set_locale($locale);
  
          return $self;
      }
  }
  
  {
      my $validator = validation_for(
          name             => '_check_set_formatter_params',
          name_is_optional => 1,
          params           => [
              { type => t( 'Maybe', of => t('Formatter') ) },
          ],
      );
  
      sub set_formatter {
          my $self = shift;
          my ($formatter) = $validator->(@_);
  
          $self->{formatter} = $formatter;
  
          return $self;
      }
  }
  
  {
      my %TruncateDefault = (
          month      => 1,
          day        => 1,
          hour       => 0,
          minute     => 0,
          second     => 0,
          nanosecond => 0,
      );
  
      my $validator = validation_for(
          name             => '_check_truncate_params',
          name_is_optional => 1,
          params           => {
              to => { type => t('TruncationLevel') },
          },
      );
  
      my $re = join '|', 'year', 'week', 'local_week', 'quarter',
          grep { $_ ne 'nanosecond' } keys %TruncateDefault;
      my $spec = { to => { regex => qr/^(?:$re)$/ } };
  
      ## no critic (Subroutines::ProhibitBuiltinHomonyms)
      sub truncate {
          my $self = shift;
          my %p    = $validator->(@_);
  
          my %new;
          if ( $p{to} eq 'week' || $p{to} eq 'local_week' ) {
              my $first_day_of_week
                  = ( $p{to} eq 'local_week' )
                  ? $self->{locale}->first_day_of_week
                  : 1;
  
              my $day_diff = ( $self->day_of_week - $first_day_of_week ) % 7;
  
              if ($day_diff) {
                  $self->add( days => -1 * $day_diff );
              }
  
              # This can fail if the truncate ends up giving us an invalid local
              # date time. If that happens we need to reverse the addition we
              # just did. See https://rt.cpan.org/Ticket/Display.html?id=93347.
              try {
                  $self->truncate( to => 'day' );
              }
              catch {
                  $self->add( days => $day_diff );
                  die $_;
              };
          }
          elsif ( $p{to} eq 'quarter' ) {
              %new = (
                  year       => $self->year,
                  month      => int( ( $self->month - 1 ) / 3 ) * 3 + 1,
                  day        => 1,
                  hour       => 0,
                  minute     => 0,
                  second     => 0,
                  nanosecond => 0,
              );
          }
          else {
              my $truncate;
              foreach my $f (qw( year month day hour minute second nanosecond ))
              {
                  $new{$f} = $truncate ? $TruncateDefault{$f} : $self->$f();
  
                  $truncate = 1 if $p{to} eq $f;
              }
          }
  
          my $new_dt = $self->_new_from_self( %new, _skip_validation => 1 );
  
          %$self = %$new_dt;
  
          return $self;
      }
  }
  
  sub set_time_zone {
      my ( $self, $tz ) = @_;
  
      if ( ref $tz ) {
  
          # This is a bit of a hack but it works because time zone objects
          # are singletons, and if it doesn't work all we lose is a little
          # bit of speed.
          return $self if $self->{tz} eq $tz;
      }
      else {
          return $self if $self->{tz}->name() eq $tz;
      }
  
      my $was_floating = $self->{tz}->is_floating;
  
      my $old_tz = $self->{tz};
      $self->{tz} = ref $tz ? $tz : DateTime::TimeZone->new( name => $tz );
  
      $self->_handle_offset_modifier( $self->second, 1 );
  
      my $e;
      try {
          # if it either was or now is floating (but not both)
          if ( $self->{tz}->is_floating xor $was_floating ) {
              $self->_calc_utc_rd;
          }
          elsif ( !$was_floating ) {
              $self->_calc_local_rd;
          }
      }
      catch {
          $e = $_;
      };
  
      # If we can't recalc the RD values then we shouldn't keep the new TZ. RT
      # #83940
      if ($e) {
          $self->{tz} = $old_tz;
          die $e;
      }
  
      return $self;
  }
  
  sub STORABLE_freeze {
      my $self = shift;
  
      my $serialized = q{};
      foreach my $key (
          qw( utc_rd_days
          utc_rd_secs
          rd_nanosecs )
      ) {
          $serialized .= "$key:$self->{$key}|";
      }
  
      # not used yet, but may be handy in the future.
      $serialized .= 'version:' . ( $DateTime::VERSION || 'git' );
  
      # Formatter needs to be returned as a reference since it may be
      # undef or a class name, and Storable will complain if extra
      # return values aren't refs
      return $serialized, $self->{locale}, $self->{tz}, \$self->{formatter};
  }
  
  sub STORABLE_thaw {
      my $self = shift;
      shift;
      my $serialized = shift;
  
      my %serialized = map { split /:/ } split /\|/, $serialized;
  
      my ( $locale, $tz, $formatter );
  
      # more recent code version
      if (@_) {
          ( $locale, $tz, $formatter ) = @_;
      }
      else {
          $tz = DateTime::TimeZone->new( name => delete $serialized{tz} );
  
          $locale = DateTime::Locale->load( delete $serialized{locale} );
      }
  
      delete $serialized{version};
  
      my $object = bless {
          utc_vals => [
              $serialized{utc_rd_days},
              $serialized{utc_rd_secs},
              $serialized{rd_nanosecs},
          ],
          tz => $tz,
          },
          'DateTime::_Thawed';
  
      my %formatter = defined $$formatter ? ( formatter => $$formatter ) : ();
      my $new       = ( ref $self )->from_object(
          object => $object,
          locale => $locale,
          %formatter,
      );
  
      %$self = %$new;
  
      return $self;
  }
  
  ## no critic (Modules::ProhibitMultiplePackages)
  package    # hide from PAUSE
      DateTime::_Thawed;
  
  sub utc_rd_values { @{ $_[0]->{utc_vals} } }
  
  sub time_zone { $_[0]->{tz} }
  
  1;
  
  # ABSTRACT: A date and time object for Perl
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  DateTime - A date and time object for Perl
  
  =head1 VERSION
  
  version 1.51
  
  =head1 SYNOPSIS
  
    use DateTime;
  
    $dt = DateTime->new(
        year       => 1964,
        month      => 10,
        day        => 16,
        hour       => 16,
        minute     => 12,
        second     => 47,
        nanosecond => 500000000,
        time_zone  => 'Asia/Taipei',
    );
  
    $dt = DateTime->from_epoch( epoch => $epoch );
    $dt = DateTime->now; # same as ( epoch => time() )
  
    $year   = $dt->year;
    $month  = $dt->month;          # 1-12
  
    $day    = $dt->day;            # 1-31
  
    $dow    = $dt->day_of_week;    # 1-7 (Monday is 1)
  
    $hour   = $dt->hour;           # 0-23
    $minute = $dt->minute;         # 0-59
  
    $second = $dt->second;         # 0-61 (leap seconds!)
  
    $doy    = $dt->day_of_year;    # 1-366 (leap years)
  
    $doq    = $dt->day_of_quarter; # 1..
  
    $qtr    = $dt->quarter;        # 1-4
  
    # all of the start-at-1 methods above have corresponding start-at-0
    # methods, such as $dt->day_of_month_0, $dt->month_0 and so on
  
    $ymd    = $dt->ymd;           # 2002-12-06
    $ymd    = $dt->ymd('/');      # 2002/12/06
  
    $mdy    = $dt->mdy;           # 12-06-2002
    $mdy    = $dt->mdy('/');      # 12/06/2002
  
    $dmy    = $dt->dmy;           # 06-12-2002
    $dmy    = $dt->dmy('/');      # 06/12/2002
  
    $hms    = $dt->hms;           # 14:02:29
    $hms    = $dt->hms('!');      # 14!02!29
  
    $is_leap  = $dt->is_leap_year;
  
    # these are localizable, see Locales section
    $month_name  = $dt->month_name; # January, February, ...
    $month_abbr  = $dt->month_abbr; # Jan, Feb, ...
    $day_name    = $dt->day_name;   # Monday, Tuesday, ...
    $day_abbr    = $dt->day_abbr;   # Mon, Tue, ...
  
    # May not work for all possible datetime, see the docs on this
    # method for more details.
    $epoch_time  = $dt->epoch;
  
    $dt2 = $dt + $duration_object;
  
    $dt3 = $dt - $duration_object;
  
    $duration_object = $dt - $dt2;
  
    $dt->set( year => 1882 );
  
    $dt->set_time_zone( 'America/Chicago' );
  
    $dt->set_formatter( $formatter );
  
  =head1 DESCRIPTION
  
  DateTime is a class for the representation of date/time combinations,
  and is part of the Perl DateTime project. For details on this project
  please see L<http://datetime.perl.org/>. The DateTime site has a FAQ
  which may help answer many "how do I do X?" questions. The FAQ is at
  L<http://datetime.perl.org/wiki/datetime/page/FAQ>.
  
  It represents the Gregorian calendar, extended backwards in time
  before its creation (in 1582). This is sometimes known as the
  "proleptic Gregorian calendar". In this calendar, the first day of
  the calendar (the epoch), is the first day of year 1, which
  corresponds to the date which was (incorrectly) believed to be the
  birth of Jesus Christ.
  
  The calendar represented does have a year 0, and in that way differs
  from how dates are often written using "BCE/CE" or "BC/AD".
  
  For infinite datetimes, please see the
  L<DateTime::Infinite|DateTime::Infinite> module.
  
  =head1 USAGE
  
  =head2 0-based Versus 1-based Numbers
  
  The DateTime.pm module follows a simple logic for determining whether or not a
  given number is 0-based or 1-based.
  
  Month, day of month, day of week, and day of year are 1-based. Any
  method that is 1-based also has an equivalent 0-based method ending in
  "_0". So for example, this class provides both C<day_of_week()> and
  C<day_of_week_0()> methods.
  
  The C<day_of_week_0()> method still treats Monday as the first day of
  the week.
  
  All I<time>-related numbers such as hour, minute, and second are
  0-based.
  
  Years are neither, as they can be both positive or negative, unlike
  any other datetime component. There I<is> a year 0.
  
  There is no C<quarter_0()> method.
  
  =head2 Error Handling
  
  Some errors may cause this module to die with an error string. This
  can only happen when calling constructor methods, methods that change
  the object, such as C<set()>, or methods that take parameters.
  Methods that retrieve information about the object, such as C<year()>
  or C<epoch()>, will never die.
  
  =head2 Locales
  
  All the object methods which return names or abbreviations return data based
  on a locale. This is done by setting the locale when constructing a DateTime
  object. If this is not set, then "en-US" is used.
  
  =head2 Floating DateTimes
  
  The default time zone for new DateTime objects, except where stated
  otherwise, is the "floating" time zone. This concept comes from the
  iCal standard. A floating datetime is one which is not anchored to
  any particular time zone. In addition, floating datetimes do not
  include leap seconds, since we cannot apply them without knowing the
  datetime's time zone.
  
  The results of date math and comparison between a floating datetime
  and one with a real time zone are not really valid, because one
  includes leap seconds and the other does not. Similarly, the results
  of datetime math between two floating datetimes and two datetimes with
  time zones are not really comparable.
  
  If you are planning to use any objects with a real time zone, it is
  strongly recommended that you B<do not> mix these with floating
  datetimes.
  
  =head2 Math
  
  If you are going to be doing date math, please read the section L<How DateTime
  Math Works>.
  
  =head2 Determining the Local Time Zone Can Be Slow
  
  If C<$ENV{TZ}> is not set, it may involve reading a number of files in F</etc>
  or elsewhere. If you know that the local time zone won't change while your
  code is running, and you need to make many objects for the local time zone, it
  is strongly recommended that you retrieve the local time zone once and cache
  it:
  
    our $App::LocalTZ = DateTime::TimeZone->new( name => 'local' );
  
    ... # then everywhere else
  
    my $dt = DateTime->new( ..., time_zone => $App::LocalTZ );
  
  DateTime itself does not do this internally because local time zones can
  change, and there's no good way to determine if it's changed without doing all
  the work to look it up.
  
  Do not try to use named time zones (like "America/Chicago") with dates
  very far in the future (thousands of years). The current
  implementation of C<DateTime::TimeZone> will use a huge amount of
  memory calculating all the DST changes from now until the future
  date. Use UTC or the floating time zone and you will be safe.
  
  =head2 Globally Setting a Default Time Zone
  
  B<Warning: This is very dangerous. Do this at your own risk!>
  
  By default, C<DateTime> uses either the floating time zone or UTC for newly
  created objects, depending on the constructor.
  
  You can force C<DateTime> to use a different time zone by setting the
  C<PERL_DATETIME_DEFAULT_TZ> environment variable.
  
  As noted above, this is very dangerous, as it affects all code that creates a
  C<DateTime> object, including modules from CPAN. If those modules expect the
  normal default, then setting this can cause confusing breakage or subtly
  broken data. Before setting this variable, you are strongly encouraged to
  audit your CPAN dependencies to see how they use C<DateTime>. Try running the
  test suite for each dependency with this environment variable set before using
  this in production.
  
  =head2 Upper and Lower Bounds
  
  Internally, dates are represented the number of days before or after
  0001-01-01. This is stored as an integer, meaning that the upper and lower
  bounds are based on your Perl's integer size (C<$Config{ivsize}>).
  
  The limit on 32-bit systems is around 2^29 days, which gets you to year
  (+/-)1,469,903. On a 64-bit system you get 2^62 days,
  (+/-)12,626,367,463,883,278 (12.626 quadrillion).
  
  =head1 METHODS
  
  DateTime provide many methods. The documentation breaks them down into groups
  based on what they do (constructor, accessors, modifiers, etc.).
  
  =head2 Constructors
  
  All constructors can die when invalid parameters are given.
  
  =head3 Warnings
  
  Currently, constructors will warn if you try to create a far future DateTime
  (year >= 5000) with any time zone besides floating or UTC. This can be very
  slow if the time zone has future DST transitions that need to be
  calculated. If the date is sufficiently far in the future this can be
  I<really> slow (minutes).
  
  All warnings from DateTime use the C<DateTime> category and can be suppressed
  with:
  
      no warnings 'DateTime';
  
  This warning may be removed in the future if L<DateTime::TimeZone> is made
  much faster.
  
  =head3 DateTime->new( ... )
  
  This class method accepts parameters for each date and time component:
  "year", "month", "day", "hour", "minute", "second", "nanosecond".
  It also accepts "locale", "time_zone", and "formatter" parameters.
  
    my $dt = DateTime->new(
        year       => 1966,
        month      => 10,
        day        => 25,
        hour       => 7,
        minute     => 15,
        second     => 47,
        nanosecond => 500000000,
        time_zone  => 'America/Chicago',
    );
  
  DateTime validates the "month", "day", "hour", "minute", and "second",
  and "nanosecond" parameters. The valid values for these parameters are:
  
  =over 8
  
  =item * month
  
  An integer from 1-12.
  
  =item * day
  
  An integer from 1-31, and it must be within the valid range of days for the
  specified month.
  
  =item * hour
  
  An integer from 0-23.
  
  =item * minute
  
  An integer from 0-59.
  
  =item * second
  
  An integer from 0-61 (to allow for leap seconds). Values of 60 or 61 are only
  allowed when they match actual leap seconds.
  
  =item * nanosecond
  
  An integer >= 0. If this number is greater than 1 billion, it will be
  normalized into the second value for the DateTime object.
  
  =back
  
  Invalid parameter types (like an array reference) will cause the
  constructor to die.
  
  The value for seconds may be from 0 to 61, to account for leap
  seconds. If you give a value greater than 59, DateTime does check to
  see that it really matches a valid leap second.
  
  All of the parameters are optional except for "year". The "month" and
  "day" parameters both default to 1, while the "hour", "minute",
  "second", and "nanosecond" parameters all default to 0.
  
  The "locale" parameter should be a string containing a locale code, like
  "en-US" or "zh-Hant-TW", or an object returned by C<< DateTime::Locale->load
  >>. See the L<DateTime::Locale|DateTime::Locale> documentation for details.
  
  The "time_zone" parameter can be either a string or a C<DateTime::TimeZone>
  object. A string will simply be passed to the C<< DateTime::TimeZone->new >>
  method as its "name" parameter. This string may be an Olson DB time zone name
  ("America/Chicago"), an offset string ("+0630"), or the words "floating" or
  "local". See the C<DateTime::TimeZone> documentation for more details.
  
  The default time zone is "floating".
  
  The "formatter" can be either a scalar or an object, but the class
  specified by the scalar or the object must implement a
  C<format_datetime()> method.
  
  =head4 Parsing Dates
  
  B<This module does not parse dates!> That means there is no
  constructor to which you can pass things like "March 3, 1970 12:34".
  
  Instead, take a look at the various C<DateTime::Format::*> modules on
  CPAN. These parse all sorts of different date formats, and you're
  bound to find something that can handle your particular needs.
  
  =head4 Ambiguous Local Times
  
  Because of Daylight Saving Time, it is possible to specify a local
  time that is ambiguous. For example, in the US in 2003, the
  transition from to saving to standard time occurred on October 26, at
  02:00:00 local time. The local clock changed from 01:59:59 (saving
  time) to 01:00:00 (standard time). This means that the hour from
  01:00:00 through 01:59:59 actually occurs twice, though the UTC time
  continues to move forward.
  
  If you specify an ambiguous time, then the latest UTC time is always
  used, in effect always choosing standard time. In this case, you can
  simply subtract an hour to the object in order to move to saving time,
  for example:
  
    # This object represent 01:30:00 standard time
    my $dt = DateTime->new(
        year      => 2003,
        month     => 10,
        day       => 26,
        hour      => 1,
        minute    => 30,
        second    => 0,
        time_zone => 'America/Chicago',
    );
  
    print $dt->hms;  # prints 01:30:00
  
    # Now the object represent 01:30:00 saving time
    $dt->subtract( hours => 1 );
  
    print $dt->hms;  # still prints 01:30:00
  
  Alternately, you could create the object with the UTC time zone, and
  then call the C<set_time_zone()> method to change the time zone. This
  is a good way to ensure that the time is not ambiguous.
  
  =head4 Invalid Local Times
  
  Another problem introduced by Daylight Saving Time is that certain
  local times just do not exist. For example, in the US in 2003, the
  transition from standard to saving time occurred on April 6, at the
  change to 2:00:00 local time. The local clock changes from 01:59:59
  (standard time) to 03:00:00 (saving time). This means that there is
  no 02:00:00 through 02:59:59 on April 6!
  
  Attempting to create an invalid time currently causes a fatal error.
  This may change in future version of this module.
  
  =head3 DateTime->from_epoch( epoch => $epoch, ... )
  
  This class method can be used to construct a new DateTime object from
  an epoch time instead of components. Just as with the C<new()>
  method, it accepts "time_zone", "locale", and "formatter" parameters.
  
  If the epoch value is a floating-point value, it will be rounded to
  nearest microsecond.
  
  By default, the returned object will be in the UTC time zone.
  
  =head3 DateTime->now( ... )
  
  This class method is equivalent to calling C<from_epoch()> with the
  value returned from Perl's C<time()> function. Just as with the
  C<new()> method, it accepts "time_zone" and "locale" parameters.
  
  By default, the returned object will be in the UTC time zone.
  
  =head3 DateTime->today( ... )
  
  This class method is equivalent to:
  
    DateTime->now(@_)->truncate( to => 'day' );
  
  =head3 DateTime->from_object( object => $object, ... )
  
  This class method can be used to construct a new DateTime object from
  any object that implements the C<utc_rd_values()> method. All
  C<DateTime::Calendar> modules must implement this method in order to
  provide cross-calendar compatibility. This method accepts a
  "locale" and "formatter" parameter
  
  If the object passed to this method has a C<time_zone()> method, that
  is used to set the time zone of the newly created C<DateTime.pm>
  object.
  
  Otherwise, the returned object will be in the floating time zone.
  
  =head3 DateTime->last_day_of_month( ... )
  
  This constructor takes the same arguments as can be given to the
  C<new()> method, except for "day". Additionally, both "year" and
  "month" are required.
  
  =head3 DateTime->from_day_of_year( ... )
  
  This constructor takes the same arguments as can be given to the
  C<new()> method, except that it does not accept a "month" or "day"
  argument. Instead, it requires both "year" and "day_of_year". The
  day of year must be between 1 and 366, and 366 is only allowed for
  leap years.
  
  =head3 $dt->clone()
  
  This object method returns a new object that is replica of the object
  upon which the method is called.
  
  =head2 "Get" Methods
  
  This class has many methods for retrieving information about an
  object.
  
  =head3 $dt->year()
  
  Returns the year.
  
  =head3 $dt->ce_year()
  
  Returns the year according to the BCE/CE numbering system. The year
  before year 1 in this system is year -1, aka "1 BCE".
  
  =head3 $dt->era_name()
  
  Returns the long name of the current era, something like "Before
  Christ". See the L<Locales|/Locales> section for more details.
  
  =head3 $dt->era_abbr()
  
  Returns the abbreviated name of the current era, something like "BC".
  See the L<Locales|/Locales> section for more details.
  
  =head3 $dt->christian_era()
  
  Returns a string, either "BC" or "AD", according to the year.
  
  =head3 $dt->secular_era()
  
  Returns a string, either "BCE" or "CE", according to the year.
  
  =head3 $dt->year_with_era()
  
  Returns a string containing the year immediately followed by its era
  abbreviation. The year is the absolute value of C<ce_year()>, so that
  year 1 is "1AD" and year 0 is "1BC".
  
  =head3 $dt->year_with_christian_era()
  
  Like C<year_with_era()>, but uses the christian_era() method to get the era
  name.
  
  =head3 $dt->year_with_secular_era()
  
  Like C<year_with_era()>, but uses the secular_era() method to get the
  era name.
  
  =head3 $dt->month()
  
  Returns the month of the year, from 1..12.
  
  Also available as C<< $dt->mon() >>.
  
  =head3 $dt->month_name()
  
  Returns the name of the current month. See the
  L<Locales|/Locales> section for more details.
  
  =head3 $dt->month_abbr()
  
  Returns the abbreviated name of the current month. See the
  L<Locales|/Locales> section for more details.
  
  =head3 $dt->day()
  
  Returns the day of the month, from 1..31.
  
  Also available as C<< $dt->mday() >> and C<< $dt->day_of_month() >>.
  
  =head3 $dt->day_of_week()
  
  Returns the day of the week as a number, from 1..7, with 1 being
  Monday and 7 being Sunday.
  
  Also available as C<< $dt->wday() >> and C<< $dt->dow() >>.
  
  =head3 $dt->local_day_of_week()
  
  Returns the day of the week as a number, from 1..7. The day
  corresponding to 1 will vary based on the locale.
  
  =head3 $dt->day_name()
  
  Returns the name of the current day of the week. See the
  L<Locales|/Locales> section for more details.
  
  =head3 $dt->day_abbr()
  
  Returns the abbreviated name of the current day of the week. See the
  L<Locales|/Locales> section for more details.
  
  =head3 $dt->day_of_year()
  
  Returns the day of the year.
  
  Also available as C<< $dt->doy() >>.
  
  =head3 $dt->quarter()
  
  Returns the quarter of the year, from 1..4.
  
  =head3 $dt->quarter_name()
  
  Returns the name of the current quarter. See the
  L<Locales|/Locales> section for more details.
  
  =head3 $dt->quarter_abbr()
  
  Returns the abbreviated name of the current quarter. See the
  L<Locales|/Locales> section for more details.
  
  =head3 $dt->day_of_quarter()
  
  Returns the day of the quarter.
  
  Also available as C<< $dt->doq() >>.
  
  =head3 $dt->weekday_of_month()
  
  Returns a number from 1..5 indicating which week day of the month this
  is. For example, June 9, 2003 is the second Monday of the month, and
  so this method returns 2 for that day.
  
  =head3 $dt->ymd( $optional_separator ), $dt->mdy(...), $dt->dmy(...)
  
  Each method returns the year, month, and day, in the order indicated
  by the method name. Years are zero-padded to four digits. Months and
  days are 0-padded to two digits.
  
  By default, the values are separated by a dash (-), but this can be
  overridden by passing a value to the method.
  
  The C<< $dt->ymd() >> method is also available as C<< $dt->date() >>.
  
  =head3 $dt->hour()
  
  Returns the hour of the day, from 0..23.
  
  =head3 $dt->hour_1()
  
  Returns the hour of the day, from 1..24.
  
  =head3 $dt->hour_12()
  
  Returns the hour of the day, from 1..12.
  
  =head3 $dt->hour_12_0()
  
  Returns the hour of the day, from 0..11.
  
  =head3 $dt->am_or_pm()
  
  Returns the appropriate localized abbreviation, depending on the
  current hour.
  
  =head3 $dt->minute()
  
  Returns the minute of the hour, from 0..59.
  
  Also available as C<< $dt->min() >>.
  
  =head3 $dt->second()
  
  Returns the second, from 0..61. The values 60 and 61 are used for
  leap seconds.
  
  Also available as C<< $dt->sec() >>.
  
  =head3 $dt->fractional_second()
  
  Returns the second, as a real number from 0.0 until 61.999999999
  
  The values 60 and 61 are used for leap seconds.
  
  =head3 $dt->millisecond()
  
  Returns the fractional part of the second as milliseconds (1E-3 seconds).
  
  Half a second is 500 milliseconds.
  
  This value will always be rounded down to the nearest integer.
  
  =head3 $dt->microsecond()
  
  Returns the fractional part of the second as microseconds (1E-6
  seconds).
  
  Half a second is 500_000 microseconds.
  
  This value will always be rounded down to the nearest integer.
  
  =head3 $dt->nanosecond()
  
  Returns the fractional part of the second as nanoseconds (1E-9 seconds).
  
  Half a second is 500_000_000 nanoseconds.
  
  =head3 $dt->hms( $optional_separator )
  
  Returns the hour, minute, and second, all zero-padded to two digits.
  If no separator is specified, a colon (:) is used by default.
  
  Also available as C<< $dt->time() >>.
  
  =head3 $dt->datetime( $optional_separator )
  
  This method is equivalent to:
  
    $dt->ymd('-') . 'T' . $dt->hms(':')
  
  The C<$optional_separator> parameter allows you to override the separator
  between the date and time, for e.g. C<< $dt->datetime(q{ }) >>.
  
  This method is also available as C<< $dt->iso8601() >>, but it's not really a
  very good ISO8601 format, as it lacks a time zone.  If called as
  C<< $dt->iso8601() >> you cannot change the separator, as ISO8601 specifies
  that "T" must be used to separate them.
  
  =head3 $dt->stringify()
  
  This method returns a stringified version of the object. It is how
  stringification overloading is implemented. If the object has a formatter,
  then its C<format_datetime()> method is used to produce a string. Otherwise,
  this method calls C<< $dt->iso8601() >> to produce a string. See L<Formatters
  And Stringification> for details.
  
  =head3 $dt->is_leap_year()
  
  This method returns a true or false value indicating whether or not the
  datetime object is in a leap year.
  
  =head3 $dt->is_last_day_of_month()
  
  This method returns a true or false value indicating whether or not the
  datetime object is the last day of the month.
  
  =head3 $dt->is_last_day_of_quarter()
  
  This method returns a true or false value indicating whether or not the
  datetime object is the last day of the quarter.
  
  =head3 $dt->is_last_day_of_year()
  
  This method returns a true or false value indicating whether or not the
  datetime object is the last day of the year.
  
  =head3 $dt->month_length()
  
  This method returns the number of days in the current month.
  
  =head3 $dt->quarter_length()
  
  This method returns the number of days in the current quarter.
  
  =head3 $dt->year_length()
  
  This method returns the number of days in the current year.
  
  =head3 $dt->week()
  
   ($week_year, $week_number) = $dt->week;
  
  Returns information about the calendar week which contains this
  datetime object. The values returned by this method are also available
  separately through the week_year and week_number methods.
  
  The first week of the year is defined by ISO as the one which contains
  the fourth day of January, which is equivalent to saying that it's the
  first week to overlap the new year by at least four days.
  
  Typically the week year will be the same as the year that the object
  is in, but dates at the very beginning of a calendar year often end up
  in the last week of the prior year, and similarly, the final few days
  of the year may be placed in the first week of the next year.
  
  =head3 $dt->week_year()
  
  Returns the year of the week. See C<< $dt->week() >> for details.
  
  =head3 $dt->week_number()
  
  Returns the week of the year, from 1..53. See C<< $dt->week() >> for details.
  
  =head3 $dt->week_of_month()
  
  The week of the month, from 0..5. The first week of the month is the
  first week that contains a Thursday. This is based on the ICU
  definition of week of month, and correlates to the ISO8601 week of
  year definition. A day in the week I<before> the week with the first
  Thursday will be week 0.
  
  =head3 $dt->jd(), $dt->mjd()
  
  These return the Julian Day and Modified Julian Day, respectively.
  The value returned is a floating point number. The fractional portion
  of the number represents the time portion of the datetime.
  
  =head3 $dt->time_zone()
  
  This returns the C<DateTime::TimeZone> object for the datetime object.
  
  =head3 $dt->offset()
  
  This returns the offset from UTC, in seconds, of the datetime object
  according to the time zone.
  
  =head3 $dt->is_dst()
  
  Returns a boolean indicating whether or not the datetime object is
  currently in Daylight Saving Time or not.
  
  =head3 $dt->time_zone_long_name()
  
  This is a shortcut for C<< $dt->time_zone->name >>. It's provided so
  that one can use "%{time_zone_long_name}" as a strftime format
  specifier.
  
  =head3 $dt->time_zone_short_name()
  
  This method returns the time zone abbreviation for the current time
  zone, such as "PST" or "GMT". These names are B<not> definitive, and
  should not be used in any application intended for general use by
  users around the world.
  
  =head3 $dt->strftime( $format, ... )
  
  This method implements functionality similar to the C<strftime()>
  method in C. However, if given multiple format strings, then it will
  return multiple scalars, one for each format string.
  
  See the L<strftime Patterns> section for a list of all possible
  strftime patterns.
  
  If you give a pattern that doesn't exist, then it is simply treated as
  text.
  
  Note that any deviation from the POSIX standard is probably a bug. DateTime
  should match the output of C<POSIX::strftime> for any given pattern.
  
  =head3 $dt->format_cldr( $format, ... )
  
  This method implements formatting based on the CLDR date patterns. If
  given multiple format strings, then it will return multiple scalars,
  one for each format string.
  
  See the L<CLDR Patterns> section for a list of all possible CLDR
  patterns.
  
  If you give a pattern that doesn't exist, then it is simply treated as
  text.
  
  =head3 $dt->epoch()
  
  Return the UTC epoch value for the datetime object. Datetimes before the start
  of the epoch will be returned as a negative number.
  
  The return value from this method is always an integer.
  
  Since the epoch does not account for leap seconds, the epoch time for
  1972-12-31T23:59:60 (UTC) is exactly the same as that for
  1973-01-01T00:00:00.
  
  =head3 $dt->hires_epoch()
  
  Returns the epoch as a floating point number. The floating point
  portion of the value represents the nanosecond value of the object.
  This method is provided for compatibility with the C<Time::HiRes>
  module.
  
  Note that this method suffers from the imprecision of floating point numbers,
  and the result may end up rounded to an arbitrary degree depending on your
  platform.
  
      my $dt = DateTime->new( year => 2012, nanosecond => 4 );
      say $dt->hires_epoch();
  
  On my system, this simply prints C<1325376000> because adding C<0.000000004>
  to C<1325376000> returns C<1325376000>.
  
  =head3 $dt->is_finite(), $dt->is_infinite()
  
  These methods allow you to distinguish normal datetime objects from
  infinite ones. Infinite datetime objects are documented in
  L<DateTime::Infinite|DateTime::Infinite>.
  
  =head3 $dt->utc_rd_values()
  
  Returns the current UTC Rata Die days, seconds, and nanoseconds as a
  three element list. This exists primarily to allow other calendar
  modules to create objects based on the values provided by this object.
  
  =head3 $dt->local_rd_values()
  
  Returns the current local Rata Die days, seconds, and nanoseconds as a
  three element list. This exists for the benefit of other modules
  which might want to use this information for date math, such as
  C<DateTime::Event::Recurrence>.
  
  =head3 $dt->leap_seconds()
  
  Returns the number of leap seconds that have happened up to the
  datetime represented by the object. For floating datetimes, this
  always returns 0.
  
  =head3 $dt->utc_rd_as_seconds()
  
  Returns the current UTC Rata Die days and seconds purely as seconds.
  This number ignores any fractional seconds stored in the object,
  as well as leap seconds.
  
  =head3 $dt->locale()
  
  Returns the current locale object.
  
  =head3 $dt->formatter()
  
  Returns current formatter object or class. See L<Formatters And
  Stringification> for details.
  
  =head2 "Set" Methods
  
  The remaining methods provided by C<DateTime.pm>, except where otherwise
  specified, return the object itself, thus making method chaining
  possible. For example:
  
    my $dt = DateTime->now->set_time_zone( 'Australia/Sydney' );
  
    my $first = DateTime
                  ->last_day_of_month( year => 2003, month => 3 )
                  ->add( days => 1 )
                  ->subtract( seconds => 1 );
  
  =head3 $dt->set( .. )
  
  This method can be used to change the local components of a date time. This
  method accepts any parameter allowed by the C<new()> method except for
  "locale" or "time_zone". Use C<set_locale()> and C<set_time_zone()> for those
  instead.
  
  This method performs parameter validation just like the C<new()> method.
  
  B<Do not use this method to do date math. Use the C<add()> and C<subtract()>
  methods instead.>
  
  =head3 $dt->set_year(), $dt->set_month(), etc.
  
  DateTime has a C<set_*> method for every item that can be passed to the
  constructor:
  
  =over 4
  
  =item * $dt->set_year()
  
  =item * $dt->set_month()
  
  =item * $dt->set_day()
  
  =item * $dt->set_hour()
  
  =item * $dt->set_minute()
  
  =item * $dt->set_second()
  
  =item * $dt->set_nanosecond()
  
  =back
  
  These are shortcuts to calling C<set()> with a single key. They all
  take a single parameter.
  
  =head3 $dt->truncate( to => ... )
  
  This method allows you to reset some of the local time components in the
  object to their "zero" values. The "to" parameter is used to specify which
  values to truncate, and it may be one of "year", "quarter", "month", "week",
  "local_week", "day", "hour", "minute", or "second".
  
  For example, if "month" is specified, then the local day becomes 1, and the
  hour, minute, and second all become 0.
  
  If "week" is given, then the datetime is set to the Monday of the week in
  which it occurs, and the time components are all set to 0. If you truncate to
  "local_week", then the first day of the week is locale-dependent. For example,
  in the C<en-US> locale, the first day of the week is Sunday.
  
  =head3 $dt->set_locale( $locale )
  
  Sets the object's locale. You can provide either a locale code like "en-US" or
  an object returned by C<< DateTime::Locale->load >>.
  
  =head3 $dt->set_time_zone( $tz )
  
  This method accepts either a time zone object or a string that can be
  passed as the "name" parameter to C<< DateTime::TimeZone->new() >>.
  If the new time zone's offset is different from the old time zone,
  then the I<local> time is adjusted accordingly.
  
  For example:
  
    my $dt = DateTime->new(
        year      => 2000,
        month     => 5,
        day       => 10,
        hour      => 15,
        minute    => 15,
        time_zone => 'America/Los_Angeles',
    );
  
    print $dt->hour; # prints 15
  
    $dt->set_time_zone( 'America/Chicago' );
  
    print $dt->hour; # prints 17
  
  If the old time zone was a floating time zone, then no adjustments to
  the local time are made, except to account for leap seconds. If the
  new time zone is floating, then the I<UTC> time is adjusted in order
  to leave the local time untouched.
  
  Fans of Tsai Ming-Liang's films will be happy to know that this does
  work:
  
    my $dt = DateTime->now( time_zone => 'Asia/Taipei' );
  
    $dt->set_time_zone( 'Europe/Paris' );
  
  Yes, now we can know "ni3 na4 bian1 ji2dian3?"
  
  =head3 $dt->set_formatter( $formatter )
  
  Set the formatter for the object. See L<Formatters And
  Stringification> for details.
  
  You can set this to C<undef> to revert to the default formatter.
  
  =head2 Math Methods
  
  Like the set methods, math related methods always return the object
  itself, to allow for chaining:
  
    $dt->add( days => 1 )->subtract( seconds => 1 );
  
  =head3 $dt->duration_class()
  
  This returns C<DateTime::Duration>, but exists so that a subclass of
  C<DateTime.pm> can provide a different value.
  
  =head3 $dt->add_duration( $duration_object )
  
  This method adds a C<DateTime::Duration> to the current datetime. See
  the L<DateTime::Duration|DateTime::Duration> docs for more details.
  
  =head3 $dt->add( parameters for DateTime::Duration )
  
  This method is syntactic sugar around the C<add_duration()> method. It
  simply creates a new C<DateTime::Duration> object using the parameters
  given, and then calls the C<add_duration()> method.
  
  =head3 $dt->add( $duration_object )
  
  A synonym of C<< $dt->add_duration( $duration_object ) >>.
  
  =head3 $dt->subtract_duration( $duration_object )
  
  When given a C<DateTime::Duration> object, this method simply calls
  C<invert()> on that object and passes that new duration to the
  C<add_duration> method.
  
  =head3 $dt->subtract( DateTime::Duration->new parameters )
  
  Like C<add()>, this is syntactic sugar for the C<subtract_duration()>
  method.
  
  =head3 $dt->subtract( $duration_object )
  
  A synonym of C<< $dt->subtract_duration( $duration_object ) >>.
  
  =head3 $dt->subtract_datetime( $datetime )
  
  This method returns a new C<DateTime::Duration> object representing
  the difference between the two dates. The duration is B<relative> to
  the object from which C<$datetime> is subtracted. For example:
  
      2003-03-15 00:00:00.00000000
   -  2003-02-15 00:00:00.00000000
   -------------------------------
   = 1 month
  
  Note that this duration is not an absolute measure of the amount of
  time between the two datetimes, because the length of a month varies,
  as well as due to the presence of leap seconds.
  
  The returned duration may have deltas for months, days, minutes,
  seconds, and nanoseconds.
  
  =head3 $dt->delta_md( $datetime )
  
  =head3 $dt->delta_days( $datetime )
  
  Each of these methods returns a new C<DateTime::Duration> object
  representing some portion of the difference between two datetimes.
  The C<delta_md()> method returns a duration which contains only the
  month and day portions of the duration is represented. The
  C<delta_days()> method returns a duration which contains only days.
  
  The C<delta_md> and C<delta_days> methods truncate the duration so
  that any fractional portion of a day is ignored. Both of these
  methods operate on the date portion of a datetime only, and so
  effectively ignore the time zone.
  
  Unlike the subtraction methods, B<these methods always return a
  positive (or zero) duration>.
  
  =head3 $dt->delta_ms( $datetime )
  
  Returns a duration which contains only minutes and seconds. Any day
  and month differences to minutes are converted to minutes and
  seconds. This method also B<always return a positive (or zero)
  duration>.
  
  =head3 $dt->subtract_datetime_absolute( $datetime )
  
  This method returns a new C<DateTime::Duration> object representing
  the difference between the two dates in seconds and nanoseconds. This
  is the only way to accurately measure the absolute amount of time
  between two datetimes, since units larger than a second do not
  represent a fixed number of seconds.
  
  Note that because of leap seconds, this may not return the same result as
  doing this math based on the value returned by C<< $dt->epoch() >>.
  
  =head2 Class Methods
  
  =head3 DateTime->DefaultLocale( $locale )
  
  This can be used to specify the default locale to be used when
  creating DateTime objects. If unset, then "en-US" is used.
  
  =head3 DateTime->compare( $dt1, $dt2 ), DateTime->compare_ignore_floating( $dt1, $dt2 )
  
    $cmp = DateTime->compare( $dt1, $dt2 );
  
    $cmp = DateTime->compare_ignore_floating( $dt1, $dt2 );
  
  Compare two DateTime objects. The semantics are compatible with Perl's
  C<sort()> function; it returns -1 if $dt1 < $dt2, 0 if $dt1 == $dt2, 1 if $dt1
  > $dt2.
  
  If one of the two DateTime objects has a floating time zone, it will
  first be converted to the time zone of the other object. This is what
  you want most of the time, but it can lead to inconsistent results
  when you compare a number of DateTime objects, some of which are
  floating, and some of which are in other time zones.
  
  If you want to have consistent results (because you want to sort a
  number of objects, for example), you can use the
  C<compare_ignore_floating()> method:
  
    @dates = sort { DateTime->compare_ignore_floating($a, $b) } @dates;
  
  In this case, objects with a floating time zone will be sorted as if
  they were UTC times.
  
  Since DateTime objects overload comparison operators, this:
  
    @dates = sort @dates;
  
  is equivalent to this:
  
    @dates = sort { DateTime->compare($a, $b) } @dates;
  
  DateTime objects can be compared to any other calendar class that
  implements the C<utc_rd_values()> method.
  
  =head2 Testing Code That Uses DateTime
  
  If you are trying to test code that calls uses DateTime, you may want to be
  able to explicitly set the value returned by Perl's C<time()> builtin. This
  builtin is called by C<< DateTime->now() >> and C<< DateTime->today() >>.
  
  You can  override C<CORE::GLOBAL::time()>, but this  will only work if  you do
  this B<before> loading  DateTime. If doing this is inconvenient,  you can also
  override C<DateTime::_core_time()>:
  
      no warnings 'redefine';
      local *DateTime::_core_time = sub { return 42 };
  
  DateTime is guaranteed to call this subroutine to get the current C<time()>
  value. You can also override the C<_core_time()> sub in a subclass of DateTime
  and use that.
  
  =head2 How DateTime Math Works
  
  It's important to have some understanding of how datetime math is
  implemented in order to effectively use this module and
  C<DateTime::Duration>.
  
  =head3 Making Things Simple
  
  If you want to simplify your life and not have to think too hard about
  the nitty-gritty of datetime math, I have several recommendations:
  
  =over 4
  
  =item * use the floating time zone
  
  If you do not care about time zones or leap seconds, use the
  "floating" timezone:
  
    my $dt = DateTime->now( time_zone => 'floating' );
  
  Math done on two objects in the floating time zone produces very
  predictable results.
  
  Note that in most cases you will want to start by creating an object in a
  specific zone and I<then> convert it to the floating time zone. When an object
  goes from a real zone to the floating zone, the time for the object remains
  the same.
  
  This means that passing the floating zone to a constructor may not do what you
  want.
  
    my $dt = DateTime->now( time_zone => 'floating' );
  
  is equivalent to
  
    my $dt = DateTime->now( time_zone => 'UTC' )->set_time_zone('floating');
  
  This might not be what you wanted. Instead, you may prefer to do this:
  
    my $dt = DateTime->now( time_zone => 'local' )->set_time_zone('floating');
  
  =item * use UTC for all calculations
  
  If you do care about time zones (particularly DST) or leap seconds,
  try to use non-UTC time zones for presentation and user input only.
  Convert to UTC immediately and convert back to the local time zone for
  presentation:
  
    my $dt = DateTime->new( %user_input, time_zone => $user_tz );
    $dt->set_time_zone('UTC');
  
    # do various operations - store it, retrieve it, add, subtract, etc.
  
    $dt->set_time_zone($user_tz);
    print $dt->datetime;
  
  =item * math on non-UTC time zones
  
  If you need to do date math on objects with non-UTC time zones, please
  read the caveats below carefully. The results C<DateTime.pm> produces are
  predictable and correct, and mostly intuitive, but datetime math gets
  very ugly when time zones are involved, and there are a few strange
  corner cases involving subtraction of two datetimes across a DST
  change.
  
  If you can always use the floating or UTC time zones, you can skip
  ahead to L<Leap Seconds and Date Math>
  
  =item * date vs datetime math
  
  If you only care about the date (calendar) portion of a datetime, you
  should use either C<delta_md()> or C<delta_days()>, not
  C<subtract_datetime()>. This will give predictable, unsurprising
  results, free from DST-related complications.
  
  =item * subtract_datetime() and add_duration()
  
  You must convert your datetime objects to the UTC time zone before
  doing date math if you want to make sure that the following formulas
  are always true:
  
    $dt2 - $dt1 = $dur
    $dt1 + $dur = $dt2
    $dt2 - $dur = $dt1
  
  Note that using C<delta_days> ensures that this formula always works,
  regardless of the timezone of the objects involved, as does using
  C<subtract_datetime_absolute()>. Other methods of subtraction are not
  always reversible.
  
  =item * never do math on two objects where only one is in the floating time zone
  
  The date math code accounts for leap seconds whenever the C<DateTime> object
  is not in the floating time zone. If you try to do math where one object is in
  the floating zone and the other isn't, the results will be confusing and
  wrong.
  
  =back
  
  =head3 Adding a Duration to a Datetime
  
  The parts of a duration can be broken down into five parts. These are
  months, days, minutes, seconds, and nanoseconds. Adding one month to
  a date is different than adding 4 weeks or 28, 29, 30, or 31 days.
  Similarly, due to DST and leap seconds, adding a day can be different
  than adding 86,400 seconds, and adding a minute is not exactly the
  same as 60 seconds.
  
  We cannot convert between these units, except for seconds and
  nanoseconds, because there is no fixed conversion between the two
  units, because of things like leap seconds, DST changes, etc.
  
  C<DateTime.pm> always adds (or subtracts) days, then months, minutes, and then
  seconds and nanoseconds. If there are any boundary overflows, these are
  normalized at each step. For the days and months the local (not UTC) values
  are used. For minutes and seconds, the local values are used. This generally
  just works.
  
  This means that adding one month and one day to February 28, 2003 will
  produce the date April 1, 2003, not March 29, 2003.
  
    my $dt = DateTime->new( year => 2003, month => 2, day => 28 );
  
    $dt->add( months => 1, days => 1 );
  
    # 2003-04-01 - the result
  
  On the other hand, if we add months first, and then separately add
  days, we end up with March 29, 2003:
  
    $dt->add( months => 1 )->add( days => 1 );
  
    # 2003-03-29
  
  We see similar strangeness when math crosses a DST boundary:
  
    my $dt = DateTime->new(
        year      => 2003,
        month     => 4,
        day       => 5,
        hour      => 1,
        minute    => 58,
        time_zone => "America/Chicago",
    );
  
    $dt->add( days => 1, minutes => 3 );
    # 2003-04-06 02:01:00
  
    $dt->add( minutes => 3 )->add( days => 1 );
    # 2003-04-06 03:01:00
  
  Note that if you converted the datetime object to UTC first you would
  get predictable results.
  
  If you want to know how many seconds a duration object represents, you
  have to add it to a datetime to find out, so you could do:
  
   my $now = DateTime->now( time_zone => 'UTC' );
   my $later = $now->clone->add_duration($duration);
  
   my $seconds_dur = $later->subtract_datetime_absolute($now);
  
  This returns a duration which only contains seconds and nanoseconds.
  
  If we were add the duration to a different datetime object we might
  get a different number of seconds.
  
  L<DateTime::Duration> supports three different end-of-month algorithms for
  adding months. This comes into play when an addition results in a day past the
  end of the month (for example, adding one month to January 30).
  
   # 2010-08-31 + 1 month = 2010-10-01
   $dt->add( months => 1, end_of_month => 'wrap' );
  
   # 2010-01-30 + 1 month = 2010-02-28
   $dt->add( months => 1, end_of_month => 'limit' );
  
   # 2010-04-30 + 1 month = 2010-05-31
   $dt->add( months => 1, end_of_month => 'preserve' );
  
  By default, it uses "wrap" for positive durations and "preserve" for negative
  durations. See L<DateTime::Duration> for a detailed explanation of these
  algorithms.
  
  If you need to do lots of work with durations, take a look at Rick
  Measham's C<DateTime::Format::Duration> module, which lets you present
  information from durations in many useful ways.
  
  There are other subtract/delta methods in DateTime.pm to generate
  different types of durations. These methods are
  C<subtract_datetime()>, C<subtract_datetime_absolute()>,
  C<delta_md()>, C<delta_days()>, and C<delta_ms()>.
  
  =head3 Datetime Subtraction
  
  Date subtraction is done solely based on the two object's local
  datetimes, with one exception to handle DST changes. Also, if the two
  datetime objects are in different time zones, one of them is converted
  to the other's time zone first before subtraction. This is best
  explained through examples:
  
  The first of these probably makes the most sense:
  
    my $dt1 = DateTime->new(
        year      => 2003,
        month     => 5,
        day       => 6,
        time_zone => 'America/Chicago',
    );
  
    # not DST
  
    my $dt2 = DateTime->new(
        year      => 2003,
        month     => 11,
        day       => 6,
        time_zone => 'America/Chicago',
    );
  
    # is DST
  
    my $dur = $dt2->subtract_datetime($dt1);
    # 6 months
  
  Nice and simple.
  
  This one is a little trickier, but still fairly logical:
  
    my $dt1 = DateTime->new(
        year      => 2003,
        month     => 4,
        day       => 5,
        hour      => 1,
        minute    => 58,
        time_zone => "America/Chicago",
    );
  
    # is DST
  
    my $dt2 = DateTime->new(
        year      => 2003,
        month     => 4,
        day       => 7,
        hour      => 2,
        minute    => 1,
        time_zone => "America/Chicago",
    );
  
    # not DST
  
    my $dur = $dt2->subtract_datetime($dt1);
  
    # 2 days and 3 minutes
  
  Which contradicts the result this one gives, even though they both
  make sense:
  
    my $dt1 = DateTime->new(
        year      => 2003,
        month     => 4,
        day       => 5,
        hour      => 1,
        minute    => 58,
        time_zone => "America/Chicago",
    );
  
    # is DST
  
    my $dt2 = DateTime->new(
        year      => 2003,
        month     => 4,
        day       => 6,
        hour      => 3,
        minute    => 1,
        time_zone => "America/Chicago",
    );
  
    # not DST
  
    my $dur = $dt2->subtract_datetime($dt1);
  
    # 1 day and 3 minutes
  
  This last example illustrates the "DST" exception mentioned earlier.
  The exception accounts for the fact 2003-04-06 only lasts 23 hours.
  
  And finally:
  
    my $dt2 = DateTime->new(
        year      => 2003,
        month     => 10,
        day       => 26,
        hour      => 1,
        time_zone => 'America/Chicago',
    );
  
    my $dt1 = $dt2->clone->subtract( hours => 1 );
  
    my $dur = $dt2->subtract_datetime($dt1);
    # 60 minutes
  
  This seems obvious until you realize that subtracting 60 minutes from
  C<$dt2> in the above example still leaves the clock time at
  "01:00:00". This time we are accounting for a 25 hour day.
  
  =head3 Reversibility
  
  Date math operations are not always reversible. This is because of
  the way that addition operations are ordered. As was discussed
  earlier, adding 1 day and 3 minutes in one call to C<add()> is not the
  same as first adding 3 minutes and 1 day in two separate calls.
  
  If we take a duration returned from C<subtract_datetime()> and then
  try to add or subtract that duration from one of the datetimes we just
  used, we sometimes get interesting results:
  
    my $dt1 = DateTime->new(
        year      => 2003,
        month     => 4,
        day       => 5,
        hour      => 1,
        minute    => 58,
        time_zone => "America/Chicago",
    );
  
    my $dt2 = DateTime->new(
        year      => 2003,
        month     => 4,
        day       => 6,
        hour      => 3,
        minute    => 1,
        time_zone => "America/Chicago",
    );
  
    my $dur = $dt2->subtract_datetime($dt1);
    # 1 day and 3 minutes
  
    $dt1->add_duration($dur);
    # gives us $dt2
  
    $dt2->subtract_duration($dur);
    # gives us 2003-04-05 02:58:00 - 1 hour later than $dt1
  
  The C<subtract_duration()> operation gives us a (perhaps) unexpected
  answer because it first subtracts one day to get 2003-04-05T03:01:00
  and then subtracts 3 minutes to get the final result.
  
  If we explicitly reverse the order we can get the original value of
  C<$dt1>. This can be facilitated by C<DateTime::Duration>'s
  C<calendar_duration()> and C<clock_duration()> methods:
  
    $dt2->subtract_duration( $dur->clock_duration )
        ->subtract_duration( $dur->calendar_duration );
  
  =head3 Leap Seconds and Date Math
  
  The presence of leap seconds can cause even more anomalies in date
  math. For example, the following is a legal datetime:
  
    my $dt = DateTime->new(
        year      => 1972,
        month     => 12,
        day       => 31,
        hour      => 23,
        minute    => 59,
        second    => 60,
        time_zone => 'UTC'
    );
  
  If we do the following:
  
   $dt->add( months => 1 );
  
  Then the datetime is now "1973-02-01 00:00:00", because there is no
  23:59:60 on 1973-01-31.
  
  Leap seconds also force us to distinguish between minutes and seconds
  during date math. Given the following datetime:
  
    my $dt = DateTime->new(
        year      => 1972,
        month     => 12,
        day       => 31,
        hour      => 23,
        minute    => 59,
        second    => 30,
        time_zone => 'UTC'
    );
  
  we will get different results when adding 1 minute than we get if we
  add 60 seconds. This is because in this case, the last minute of the
  day, beginning at 23:59:00, actually contains 61 seconds.
  
  Here are the results we get:
  
    # 1972-12-31 23:59:30 - our starting datetime
  
    $dt->clone->add( minutes => 1 );
    # 1973-01-01 00:00:30 - one minute later
  
    $dt->clone->add( seconds => 60 );
    # 1973-01-01 00:00:29 - 60 seconds later
  
    $dt->clone->add( seconds => 61 );
    # 1973-01-01 00:00:30 - 61 seconds later
  
  =head3 Local vs. UTC and 24 hours vs. 1 day
  
  When math crosses a daylight saving boundary, a single day may have
  more or less than 24 hours.
  
  For example, if you do this:
  
    my $dt = DateTime->new(
        year      => 2003,
        month     => 4,
        day       => 5,
        hour      => 2,
        time_zone => 'America/Chicago',
    );
  
    $dt->add( days => 1 );
  
  then you will produce an I<invalid> local time, and therefore an
  exception will be thrown.
  
  However, this works:
  
    my $dt = DateTime->new(
        year      => 2003,
        month     => 4,
        day       => 5,
        hour      => 2,
        time_zone => 'America/Chicago',
    );
  
    $dt->add( hours => 24 );
  
  and produces a datetime with the local time of "03:00".
  
  If all this makes your head hurt, there is a simple alternative. Just
  convert your datetime object to the "UTC" time zone before doing date
  math on it, and switch it back to the local time zone afterwards.
  This avoids the possibility of having date math throw an exception,
  and makes sure that 1 day equals 24 hours. Of course, this may not
  always be desirable, so caveat user!
  
  =head2 Overloading
  
  This module explicitly overloads the addition (+), subtraction (-),
  string and numeric comparison operators. This means that the
  following all do sensible things:
  
    my $new_dt = $dt + $duration_obj;
  
    my $new_dt = $dt - $duration_obj;
  
    my $duration_obj = $dt - $new_dt;
  
    foreach my $dt ( sort @dts ) { ... }
  
  Additionally, the fallback parameter is set to true, so other
  derivable operators (+=, -=, etc.) will work properly. Do not expect
  increment (++) or decrement (--) to do anything useful.
  
  The string comparison operators, C<eq> or C<ne>, will use the string
  value to compare with non-DateTime objects.
  
  DateTime objects do not have a numeric value, using C<==> or C<< <=>
  >> to compare a DateTime object with a non-DateTime object will result
  in an exception. To safely sort mixed DateTime and non-DateTime
  objects, use C<sort { $a cmp $b } @dates>.
  
  The module also overloads stringification using the object's
  formatter, defaulting to C<iso8601()> method. See L<Formatters And
  Stringification> for details.
  
  =head2 Formatters And Stringification
  
  You can optionally specify a "formatter", which is usually a
  DateTime::Format::* object/class, to control the stringification of
  the DateTime object.
  
  Any of the constructor methods can accept a formatter argument:
  
    my $formatter = DateTime::Format::Strptime->new(...);
    my $dt = DateTime->new(year => 2004, formatter => $formatter);
  
  Or, you can set it afterwards:
  
    $dt->set_formatter($formatter);
    $formatter = $dt->formatter();
  
  Once you set the formatter, the overloaded stringification method will
  use the formatter. If unspecified, the C<iso8601()> method is used.
  
  A formatter can be handy when you know that in your application you
  want to stringify your DateTime objects into a special format all the
  time, for example to a different language.
  
  If you provide a formatter class name or object, it must implement a
  C<format_datetime> method. This method will be called with just the
  DateTime object as its argument.
  
  =head2 CLDR Patterns
  
  The CLDR pattern language is both more powerful and more complex than
  strftime. Unlike strftime patterns, you often have to explicitly
  escape text that you do not want formatted, as the patterns are simply
  letters without any prefix.
  
  For example, "yyyy-MM-dd" is a valid CLDR pattern. If you want to
  include any lower or upper case ASCII characters as-is, you can
  surround them with single quotes ('). If you want to include a single
  quote, you must escape it as two single quotes ('').
  
    'Today is ' EEEE
    'It is now' h 'o''clock' a
  
  Spaces and any non-letter text will always be passed through as-is.
  
  Many CLDR patterns which produce numbers will pad the number with
  leading zeroes depending on the length of the format specifier. For
  example, "h" represents the current hour from 1-12. If you specify
  "hh" then the 1-9 will have a leading zero prepended.
  
  However, CLDR often uses five of a letter to represent the narrow form
  of a pattern. This inconsistency is necessary for backwards
  compatibility.
  
  CLDR often distinguishes between the "format" and "stand-alone" forms
  of a pattern. The format pattern is used when the thing in question is
  being placed into a larger string. The stand-alone form is used when
  displaying that item by itself, for example in a calendar.
  
  It also often provides three sizes for each item, wide (the full
  name), abbreviated, and narrow. The narrow form is often just a single
  character, for example "T" for "Tuesday", and may not be unique.
  
  CLDR provides a fairly complex system for localizing time zones that
  we ignore entirely. The time zone patterns just use the information
  provided by C<DateTime::TimeZone>, and I<do not follow the CLDR spec>.
  
  The output of a CLDR pattern is always localized, when applicable.
  
  CLDR provides the following patterns:
  
  =over 4
  
  =item * G{1,3}
  
  The abbreviated era (BC, AD).
  
  =item * GGGG
  
  The wide era (Before Christ, Anno Domini).
  
  =item * GGGGG
  
  The narrow era, if it exists (and it mostly doesn't).
  
  =item * y and y{3,}
  
  The year, zero-prefixed as needed. Negative years will start with a "-",
  and this will be included in the length calculation.
  
  In other, words the "yyyyy" pattern will format year -1234 as "-1234", not
  "-01234".
  
  =item * yy
  
  This is a special case. It always produces a two-digit year, so "1976" becomes
  "76". Negative years will start with a "-", making them one character longer.
  
  =item * Y{1,}
  
  The year in "week of the year" calendars, from C<< $dt->week_year() >>.
  
  =item * u{1,}
  
  Same as "y" except that "uu" is not a special case.
  
  =item * Q{1,2}
  
  The quarter as a number (1..4).
  
  =item * QQQ
  
  The abbreviated format form for the quarter.
  
  =item * QQQQ
  
  The wide format form for the quarter.
  
  =item * q{1,2}
  
  The quarter as a number (1..4).
  
  =item * qqq
  
  The abbreviated stand-alone form for the quarter.
  
  =item * qqqq
  
  The wide stand-alone form for the quarter.
  
  =item * M{1,2]
  
  The numerical month.
  
  =item * MMM
  
  The abbreviated format form for the month.
  
  =item * MMMM
  
  The wide format form for the month.
  
  =item * MMMMM
  
  The narrow format form for the month.
  
  =item * L{1,2]
  
  The numerical month.
  
  =item * LLL
  
  The abbreviated stand-alone form for the month.
  
  =item * LLLL
  
  The wide stand-alone form for the month.
  
  =item * LLLLL
  
  The narrow stand-alone form for the month.
  
  =item * w{1,2}
  
  The week of the year, from C<< $dt->week_number() >>.
  
  =item * W
  
  The week of the month, from C<< $dt->week_of_month() >>.
  
  =item * d{1,2}
  
  The numeric day of the month.
  
  =item * D{1,3}
  
  The numeric day of the year.
  
  =item * F
  
  The day of the week in the month, from C<< $dt->weekday_of_month() >>.
  
  =item * g{1,}
  
  The modified Julian day, from C<< $dt->mjd() >>.
  
  =item * E{1,3} and eee
  
  The abbreviated format form for the day of the week.
  
  =item * EEEE and eeee
  
  The wide format form for the day of the week.
  
  =item * EEEEE and eeeee
  
  The narrow format form for the day of the week.
  
  =item * e{1,2}
  
  The I<local> numeric day of the week, from 1 to 7. This number depends
  on what day is considered the first day of the week, which varies by
  locale. For example, in the US, Sunday is the first day of the week,
  so this returns 2 for Monday.
  
  =item * c
  
  The numeric day of the week from 1 to 7, treating Monday as the first
  of the week, regardless of locale.
  
  =item * ccc
  
  The abbreviated stand-alone form for the day of the week.
  
  =item * cccc
  
  The wide stand-alone form for the day of the week.
  
  =item * ccccc
  
  The narrow format form for the day of the week.
  
  =item * a
  
  The localized form of AM or PM for the time.
  
  =item * h{1,2}
  
  The hour from 1-12.
  
  =item * H{1,2}
  
  The hour from 0-23.
  
  =item * K{1,2}
  
  The hour from 0-11.
  
  =item * k{1,2}
  
  The hour from 1-24.
  
  =item * j{1,2}
  
  The hour, in 12 or 24 hour form, based on the preferred form for the
  locale. In other words, this is equivalent to either "h{1,2}" or
  "H{1,2}".
  
  =item * m{1,2}
  
  The minute.
  
  =item * s{1,2}
  
  The second.
  
  =item * S{1,}
  
  The fractional portion of the seconds, rounded based on the length of
  the specifier. This returned I<without> a leading decimal point, but
  may have leading or trailing zeroes.
  
  =item * A{1,}
  
  The millisecond of the day, based on the current time. In other words,
  if it is 12:00:00.00, this returns 43200000.
  
  =item * z{1,3}
  
  The time zone short name.
  
  =item * zzzz
  
  The time zone long name.
  
  =item * Z{1,3}
  
  The time zone offset.
  
  =item * ZZZZ
  
  The time zone short name and the offset as one string, so something
  like "CDT-0500".
  
  =item * ZZZZZ
  
  The time zone offset as a sexagesimal number, so something like "-05:00".
  (This is useful for W3C format.)
  
  =item * v{1,3}
  
  The time zone short name.
  
  =item * vvvv
  
  The time zone long name.
  
  =item * V{1,3}
  
  The time zone short name.
  
  =item * VVVV
  
  The time zone long name.
  
  =back
  
  =head3 CLDR "Available Formats"
  
  The CLDR data includes pre-defined formats for various patterns such as "month
  and day" or "time of day". Using these formats lets you render information
  about a datetime in the most natural way for users from a given locale.
  
  These formats are indexed by a key that is itself a CLDR pattern. When you
  look these up, you get back a different CLDR pattern suitable for the locale.
  
  Let's look at some example We'll use C<2008-02-05T18:30:30> as our example
  datetime value, and see how this is rendered for the C<en-US> and C<fr-FR>
  locales.
  
  =over 4
  
  =item * C<MMMd>
  
  The abbreviated month and day as number. For C<en-US>, we get the pattern
  C<MMM d>, which renders as C<Feb 5>. For C<fr-FR>, we get the pattern
  C<d MMM>, which renders as C<5 févr.>.
  
  =item * C<yQQQ>
  
  The year and abbreviated quarter of year. For C<en-US>, we get the pattern
  C<QQQ y>, which renders as C<Q1 2008>. For C<fr-FR>, we get the same pattern,
  C<QQQ y>, which renders as C<T1 2008>.
  
  =item * C<hm>
  
  The 12-hour time of day without seconds.  For C<en-US>, we get the pattern
  C<h:mm a>, which renders as C<6:30 PM>. For C<fr-FR>, we get the exact same
  pattern and rendering.
  
  =back
  
  The available formats for each locale are documented in the POD for that
  locale. To get back the format, you use the C<< $locale->format_for >>
  method. For example:
  
      say $dt->format_cldr( $dt->locale->format_for('MMMd') );
  
  =head2 strftime Patterns
  
  The following patterns are allowed in the format string given to the
  C<< $dt->strftime() >> method:
  
  =over 4
  
  =item * %a
  
  The abbreviated weekday name.
  
  =item * %A
  
  The full weekday name.
  
  =item * %b
  
  The abbreviated month name.
  
  =item * %B
  
  The full month name.
  
  =item * %c
  
  The default datetime format for the object's locale.
  
  =item * %C
  
  The century number (year/100) as a 2-digit integer.
  
  =item * %d
  
  The day of the month as a decimal number (range 01 to 31).
  
  =item * %D
  
  Equivalent to %m/%d/%y. This is not a good standard format if you
  want folks from both the United States and the rest of the world to
  understand the date!
  
  =item * %e
  
  Like %d, the day of the month as a decimal number, but a leading zero
  is replaced by a space.
  
  =item * %F
  
  Equivalent to %Y-%m-%d (the ISO 8601 date format)
  
  =item * %G
  
  The ISO 8601 year with century as a decimal number. The 4-digit year
  corresponding to the ISO week number (see %V). This has the same
  format and value as %Y, except that if the ISO week number belongs to
  the previous or next year, that year is used instead. (TZ)
  
  =item * %g
  
  Like %G, but without century, i.e., with a 2-digit year (00-99).
  
  =item * %h
  
  Equivalent to %b.
  
  =item * %H
  
  The hour as a decimal number using a 24-hour clock (range 00 to 23).
  
  =item * %I
  
  The hour as a decimal number using a 12-hour clock (range 01 to 12).
  
  =item * %j
  
  The day of the year as a decimal number (range 001 to 366).
  
  =item * %k
  
  The hour (24-hour clock) as a decimal number (range 0 to 23); single
  digits are preceded by a blank. (See also %H.)
  
  =item * %l
  
  The hour (12-hour clock) as a decimal number (range 1 to 12); single
  digits are preceded by a blank. (See also %I.)
  
  =item * %m
  
  The month as a decimal number (range 01 to 12).
  
  =item * %M
  
  The minute as a decimal number (range 00 to 59).
  
  =item * %n
  
  A newline character.
  
  =item * %N
  
  The fractional seconds digits. Default is 9 digits (nanoseconds).
  
    %3N   milliseconds (3 digits)
    %6N   microseconds (6 digits)
    %9N   nanoseconds  (9 digits)
  
  This value will always be rounded down to the nearest integer.
  
  =item * %p
  
  Either `AM' or `PM' according to the given time value, or the
  corresponding strings for the current locale. Noon is treated as `pm'
  and midnight as `am'.
  
  =item * %P
  
  Like %p but in lowercase: `am' or `pm' or a corresponding string for
  the current locale.
  
  =item * %r
  
  The time in a.m. or p.m. notation. In the POSIX locale this is
  equivalent to `%I:%M:%S %p'.
  
  =item * %R
  
  The time in 24-hour notation (%H:%M). (SU) For a version including the
  seconds, see %T below.
  
  =item * %s
  
  The number of seconds since the epoch.
  
  =item * %S
  
  The second as a decimal number (range 00 to 61).
  
  =item * %t
  
  A tab character.
  
  =item * %T
  
  The time in 24-hour notation (%H:%M:%S).
  
  =item * %u
  
  The day of the week as a decimal, range 1 to 7, Monday being 1. See
  also %w.
  
  =item * %U
  
  The week number of the current year as a decimal number, range 00 to
  53, starting with the first Sunday as the first day of week 01. See
  also %V and %W.
  
  =item * %V
  
  The ISO 8601:1988 week number of the current year as a decimal number,
  range 01 to 53, where week 1 is the first week that has at least 4
  days in the current year, and with Monday as the first day of the
  week. See also %U and %W.
  
  =item * %w
  
  The day of the week as a decimal, range 0 to 6, Sunday being 0. See
  also %u.
  
  =item * %W
  
  The week number of the current year as a decimal number, range 00 to
  53, starting with the first Monday as the first day of week 01.
  
  =item * %x
  
  The default date format for the object's locale.
  
  =item * %X
  
  The default time format for the object's locale.
  
  =item * %y
  
  The year as a decimal number without a century (range 00 to 99).
  
  =item * %Y
  
  The year as a decimal number including the century.
  
  =item * %z
  
  The time-zone as hour offset from UTC. Required to emit
  RFC822-conformant dates (using "%a, %d %b %Y %H:%M:%S %z").
  
  =item * %Z
  
  The short name for the time zone, typically an abbreviation like "EST" or
  "AEST".
  
  =item * %%
  
  A literal `%' character.
  
  =item * %{method}
  
  Any method name may be specified using the format C<%{method}> name
  where "method" is a valid C<DateTime.pm> object method.
  
  =back
  
  =head2 DateTime.pm and Storable
  
  DateTime implements Storable hooks in order to reduce the size of a
  serialized DateTime object.
  
  =head1 THE DATETIME PROJECT ECOSYSTEM
  
  This module is part of a larger ecosystem of modules in the DateTime
  family.
  
  =head2 L<DateTime::Set>
  
  The L<DateTime::Set> module represents sets (including recurrences) of
  datetimes. Many modules return sets or recurrences.
  
  =head2 Format Modules
  
  The various format modules exist to parse and format datetimes. For example,
  L<DateTime::Format::HTTP> parses dates according to the RFC 1123 format:
  
    my $datetime
        = DateTime::Format::HTTP->parse_datetime('Thu Feb  3 17:03:55 GMT 1994');
  
    print DateTime::Format::HTTP->format_datetime($datetime);
  
  Most format modules are suitable for use as a C<formatter> with a DateTime
  object.
  
  All format modules start with C<DateTime::Format::>.
  
  =head2 Calendar Modules
  
  There are a number of modules on CPAN that implement non-Gregorian calendars,
  such as the Chinese, Mayan, and Julian calendars.
  
  All calendar modules start with C<DateTime::Calendar::>.
  
  =head2 Event Modules
  
  There are a number of modules that calculate the dates for events, such as
  Easter, Sunrise, etc.
  
  All event modules start with C<DateTime::Event::>.
  
  =head2 Others
  
  There are many other modules that work with DateTime, including modules in the
  C<DateTimeX> namespace, as well as others.
  
  See the L<datetime wiki|http://datetime.perl.org> and
  L<search.cpan.org|http://search.cpan.org/search?query=datetime&mode=dist> for
  more details.
  
  =head1 KNOWN BUGS
  
  The tests in F<20infinite.t> seem to fail on some machines,
  particularly on Win32. This appears to be related to Perl's internal
  handling of IEEE infinity and NaN, and seems to be highly
  platform/compiler/phase of moon dependent.
  
  If you don't plan to use infinite datetimes you can probably ignore
  this. This will be fixed (perhaps) in future versions.
  
  =head1 SEE ALSO
  
  L<A Date with
  Perl|http://www.houseabsolute.com/presentations/a-date-with-perl/> - a talk
  I've given at a few YAPCs.
  
  L<datetime@perl.org mailing list|http://lists.perl.org/list/datetime.html>
  
  L<http://datetime.perl.org/>
  
  =head1 SUPPORT
  
  Bugs may be submitted at L<https://github.com/houseabsolute/DateTime.pm/issues>.
  
  There is a mailing list available for users of this distribution,
  L<mailto:datetime@perl.org>.
  
  I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
  
  =head1 SOURCE
  
  The source code repository for DateTime can be found at L<https://github.com/houseabsolute/DateTime.pm>.
  
  =head1 DONATIONS
  
  If you'd like to thank me for the work I've done on this module, please
  consider making a "donation" to me via PayPal. I spend a lot of free time
  creating free software, and would appreciate any support you'd care to offer.
  
  Please note that B<I am not suggesting that you must do this> in order for me
  to continue working on this particular software. I will continue to do so,
  inasmuch as I have in the past, for as long as it interests me.
  
  Similarly, a donation made in this way will probably not make me work on this
  software much more, unless I get so many donations that I can consider working
  on free software full time (let's all have a chuckle at that together).
  
  To donate, log into PayPal and send money to autarch@urth.org, or use the
  button at L<http://www.urth.org/~autarch/fs-donation.html>.
  
  =head1 AUTHOR
  
  Dave Rolsky <autarch@urth.org>
  
  =head1 CONTRIBUTORS
  
  =for stopwords Ben Bennett Christian Hansen Daisuke Maki Dan Book Stewart David E. Wheeler Precious Doug Bell Flávio Soibelmann Glock Gianni Ceccarelli Gregory Oschwald Hauke D Iain Truskett Jason McIntosh Joshua Hoblitt Karen Etheridge Michael Conrad R. Davis Mohammad S Anwar M Somerville Nick Tonkin Olaf Alders Ovid Paul Howarth Philippe Bruhat (BooK) Ricardo Signes Richard Bowen Ron Hill Sam Kington viviparous
  
  =over 4
  
  =item *
  
  Ben Bennett <fiji@limey.net>
  
  =item *
  
  Christian Hansen <chansen@cpan.org>
  
  =item *
  
  Daisuke Maki <dmaki@cpan.org>
  
  =item *
  
  Dan Book <grinnz@gmail.com>
  
  =item *
  
  Dan Stewart <danielandrewstewart@gmail.com>
  
  =item *
  
  David E. Wheeler <david@justatheory.com>
  
  =item *
  
  David Precious <davidp@preshweb.co.uk>
  
  =item *
  
  Doug Bell <madcityzen@gmail.com>
  
  =item *
  
  Flávio Soibelmann Glock <fglock@gmail.com>
  
  =item *
  
  Gianni Ceccarelli <gianni.ceccarelli@broadbean.com>
  
  =item *
  
  Gregory Oschwald <oschwald@gmail.com>
  
  =item *
  
  Hauke D <haukex@zero-g.net>
  
  =item *
  
  Iain Truskett <deceased>
  
  =item *
  
  Jason McIntosh <jmac@jmac.org>
  
  =item *
  
  Joshua Hoblitt <jhoblitt@cpan.org>
  
  =item *
  
  Karen Etheridge <ether@cpan.org>
  
  =item *
  
  Michael Conrad <mike@nrdvana.net>
  
  =item *
  
  Michael R. Davis <mrdvt92@users.noreply.github.com>
  
  =item *
  
  Mohammad S Anwar <mohammad.anwar@yahoo.com>
  
  =item *
  
  M Somerville <dracos@users.noreply.github.com>
  
  =item *
  
  Nick Tonkin <1nickt@users.noreply.github.com>
  
  =item *
  
  Olaf Alders <olaf@wundersolutions.com>
  
  =item *
  
  Ovid <curtis_ovid_poe@yahoo.com>
  
  =item *
  
  Paul Howarth <paul@city-fan.org>
  
  =item *
  
  Philippe Bruhat (BooK) <book@cpan.org>
  
  =item *
  
  Ricardo Signes <rjbs@cpan.org>
  
  =item *
  
  Richard Bowen <bowen@cpan.org>
  
  =item *
  
  Ron Hill <rkhill@cpan.org>
  
  =item *
  
  Sam Kington <github@illuminated.co.uk>
  
  =item *
  
  viviparous <viviparous@prc>
  
  =back
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is Copyright (c) 2003 - 2019 by Dave Rolsky.
  
  This is free software, licensed under:
  
    The Artistic License 2.0 (GPL Compatible)
  
  The full text of the license can be found in the
  F<LICENSE> file included with this distribution.
  
  =cut
DATETIME

    $main::fatpacked{"DateTime/Duration.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_DURATION';
  package DateTime::Duration;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '1.51';
  
  use Carp ();
  use DateTime;
  use DateTime::Helpers;
  use DateTime::Types;
  use Params::ValidationCompiler 0.26 qw( validation_for );
  use Scalar::Util qw( blessed );
  
  use overload (
      fallback => 1,
      '+'      => '_add_overload',
      '-'      => '_subtract_overload',
      '*'      => '_multiply_overload',
      '<=>'    => '_compare_overload',
      'cmp'    => '_compare_overload',
  );
  
  sub MAX_NANOSECONDS () {1_000_000_000}    # 1E9 = almost 32 bits
  
  my @all_units = qw( months days minutes seconds nanoseconds );
  
  {
      my %units = map {
          $_ => {
  
              # XXX - what we really want is to accept an integer, Inf, -Inf,
              # and NaN, but I can't figure out how to accept NaN since it never
              # compares to anything.
              type    => t('Defined'),
              default => 0,
          }
          } qw(
          years
          months
          weeks
          days
          hours
          minutes
          seconds
          nanoseconds
      );
  
      my $check = validation_for(
          name             => '_check_new_params',
          name_is_optional => 1,
          params           => {
              %units,
              end_of_month => {
                  type     => t('EndOfMonthMode'),
                  optional => 1,
              },
          },
      );
  
      sub new {
          my $class = shift;
          my %p     = $check->(@_);
  
          my $self = bless {}, $class;
  
          $self->{months} = ( $p{years} * 12 ) + $p{months};
  
          $self->{days} = ( $p{weeks} * 7 ) + $p{days};
  
          $self->{minutes} = ( $p{hours} * 60 ) + $p{minutes};
  
          $self->{seconds} = $p{seconds};
  
          if ( $p{nanoseconds} ) {
              $self->{nanoseconds} = $p{nanoseconds};
              $self->_normalize_nanoseconds;
          }
          else {
  
              # shortcut - if they don't need nanoseconds
              $self->{nanoseconds} = 0;
          }
  
          $self->{end_of_month} = (
                defined $p{end_of_month} ? $p{end_of_month}
              : $self->{months} < 0      ? 'preserve'
              :                            'wrap'
          );
  
          return $self;
      }
  }
  
  # make the signs of seconds, nanos the same; 0 < abs(nanos) < MAX_NANOS
  # NB this requires nanoseconds != 0 (callers check this already)
  sub _normalize_nanoseconds {
      my $self = shift;
  
      return
          if ( $self->{nanoseconds} == DateTime::INFINITY()
          || $self->{nanoseconds} == DateTime::NEG_INFINITY()
          || $self->{nanoseconds} eq DateTime::NAN() );
  
      my $seconds = $self->{seconds} + $self->{nanoseconds} / MAX_NANOSECONDS;
      $self->{seconds}     = int($seconds);
      $self->{nanoseconds} = $self->{nanoseconds} % MAX_NANOSECONDS;
      $self->{nanoseconds} -= MAX_NANOSECONDS if $seconds < 0;
  }
  
  sub clone { bless { %{ $_[0] } }, ref $_[0] }
  
  sub years       { abs( $_[0]->in_units('years') ) }
  sub months      { abs( $_[0]->in_units( 'months', 'years' ) ) }
  sub weeks       { abs( $_[0]->in_units('weeks') ) }
  sub days        { abs( $_[0]->in_units( 'days', 'weeks' ) ) }
  sub hours       { abs( $_[0]->in_units('hours') ) }
  sub minutes     { abs( $_[0]->in_units( 'minutes', 'hours' ) ) }
  sub seconds     { abs( $_[0]->in_units('seconds') ) }
  sub nanoseconds { abs( $_[0]->in_units( 'nanoseconds', 'seconds' ) ) }
  
  sub is_positive { $_[0]->_has_positive  && !$_[0]->_has_negative }
  sub is_negative { !$_[0]->_has_positive && $_[0]->_has_negative }
  
  sub _has_positive {
      ( grep { $_ > 0 } @{ $_[0] }{@all_units} ) ? 1 : 0;
  }
  
  sub _has_negative {
      ( grep { $_ < 0 } @{ $_[0] }{@all_units} ) ? 1 : 0;
  }
  
  sub is_zero {
      return 0 if grep { $_ != 0 } @{ $_[0] }{@all_units};
      return 1;
  }
  
  sub delta_months      { $_[0]->{months} }
  sub delta_days        { $_[0]->{days} }
  sub delta_minutes     { $_[0]->{minutes} }
  sub delta_seconds     { $_[0]->{seconds} }
  sub delta_nanoseconds { $_[0]->{nanoseconds} }
  
  sub deltas {
      map { $_ => $_[0]->{$_} } @all_units;
  }
  
  sub in_units {
      my $self  = shift;
      my @units = @_;
  
      my %units = map { $_ => 1 } @units;
  
      my %ret;
  
      my ( $months, $days, $minutes, $seconds )
          = @{$self}{qw( months days minutes seconds )};
  
      if ( $units{years} ) {
          $ret{years} = int( $months / 12 );
          $months -= $ret{years} * 12;
      }
  
      if ( $units{months} ) {
          $ret{months} = $months;
      }
  
      if ( $units{weeks} ) {
          $ret{weeks} = int( $days / 7 );
          $days -= $ret{weeks} * 7;
      }
  
      if ( $units{days} ) {
          $ret{days} = $days;
      }
  
      if ( $units{hours} ) {
          $ret{hours} = int( $minutes / 60 );
          $minutes -= $ret{hours} * 60;
      }
  
      if ( $units{minutes} ) {
          $ret{minutes} = $minutes;
      }
  
      if ( $units{seconds} ) {
          $ret{seconds} = $seconds;
          $seconds = 0;
      }
  
      if ( $units{nanoseconds} ) {
          $ret{nanoseconds} = $seconds * MAX_NANOSECONDS + $self->{nanoseconds};
      }
  
      wantarray ? @ret{@units} : $ret{ $units[0] };
  }
  
  sub is_wrap_mode     { $_[0]->{end_of_month} eq 'wrap'     ? 1 : 0 }
  sub is_limit_mode    { $_[0]->{end_of_month} eq 'limit'    ? 1 : 0 }
  sub is_preserve_mode { $_[0]->{end_of_month} eq 'preserve' ? 1 : 0 }
  
  sub end_of_month_mode { $_[0]->{end_of_month} }
  
  sub calendar_duration {
      my $self = shift;
  
      return ( ref $self )
          ->new( map { $_ => $self->{$_} } qw( months days end_of_month ) );
  }
  
  sub clock_duration {
      my $self = shift;
  
      return ( ref $self )
          ->new( map { $_ => $self->{$_} }
              qw( minutes seconds nanoseconds end_of_month ) );
  }
  
  sub inverse {
      my $self = shift;
      my %p    = @_;
  
      my %new;
      foreach my $u (@all_units) {
          $new{$u} = $self->{$u};
  
          # avoid -0 bug
          $new{$u} *= -1 if $new{$u};
      }
  
      $new{end_of_month} = $p{end_of_month}
          if exists $p{end_of_month};
  
      return ( ref $self )->new(%new);
  }
  
  sub add_duration {
      my ( $self, $dur ) = @_;
  
      foreach my $u (@all_units) {
          $self->{$u} += $dur->{$u};
      }
  
      $self->_normalize_nanoseconds if $self->{nanoseconds};
  
      return $self;
  }
  
  sub add {
      my $self = shift;
  
      return $self->add_duration( $self->_duration_object_from_args(@_) );
  }
  
  sub subtract {
      my $self = shift;
  
      return $self->subtract_duration( $self->_duration_object_from_args(@_) );
  }
  
  # Syntactic sugar for add and subtract: use a duration object if it's
  # supplied, otherwise build a new one from the arguments.
  sub _duration_object_from_args {
      my $self = shift;
  
      return $_[0]
          if @_ == 1 && blessed( $_[0] ) && $_[0]->isa(__PACKAGE__);
  
      return __PACKAGE__->new(@_);
  }
  
  sub subtract_duration { return $_[0]->add_duration( $_[1]->inverse ) }
  
  {
      my $check = validation_for(
          name             => '_check_multiply_params',
          name_is_optional => 1,
          params           => [
              { type => t('Int') },
          ],
      );
  
      sub multiply {
          my $self = shift;
          my ($multiplier) = $check->(@_);
  
          foreach my $u (@all_units) {
              $self->{$u} *= $multiplier;
          }
  
          $self->_normalize_nanoseconds if $self->{nanoseconds};
  
          return $self;
      }
  }
  
  sub compare {
      my ( undef, $dur1, $dur2, $dt ) = @_;
  
      $dt ||= DateTime->now;
  
      return DateTime->compare(
          $dt->clone->add_duration($dur1),
          $dt->clone->add_duration($dur2)
      );
  }
  
  sub _add_overload {
      my ( $d1, $d2, $rev ) = @_;
  
      ( $d1, $d2 ) = ( $d2, $d1 ) if $rev;
  
      if ( DateTime::Helpers::isa( $d2, 'DateTime' ) ) {
          $d2->add_duration($d1);
          return;
      }
  
      # will also work if $d1 is a DateTime.pm object
      return $d1->clone->add_duration($d2);
  }
  
  sub _subtract_overload {
      my ( $d1, $d2, $rev ) = @_;
  
      ( $d1, $d2 ) = ( $d2, $d1 ) if $rev;
  
      Carp::croak(
          'Cannot subtract a DateTime object from a DateTime::Duration object')
          if DateTime::Helpers::isa( $d2, 'DateTime' );
  
      return $d1->clone->subtract_duration($d2);
  }
  
  sub _multiply_overload {
      my $self = shift;
  
      my $new = $self->clone;
  
      return $new->multiply(shift);
  }
  
  sub _compare_overload {
      Carp::croak( 'DateTime::Duration does not overload comparison.'
              . '  See the documentation on the compare() method for details.'
      );
  }
  
  1;
  
  # ABSTRACT: Duration objects for date math
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  DateTime::Duration - Duration objects for date math
  
  =head1 VERSION
  
  version 1.51
  
  =head1 SYNOPSIS
  
    use DateTime::Duration;
  
    $dur = DateTime::Duration->new(
        years       => 3,
        months      => 5,
        weeks       => 1,
        days        => 1,
        hours       => 6,
        minutes     => 15,
        seconds     => 45,
        nanoseconds => 12000
    );
  
    my ( $days, $hours, $seconds ) = $dur->in_units('days', 'hours', 'seconds');
  
    # Human-readable accessors, always positive, but consider using
    # DateTime::Format::Duration instead
    $dur->years;
    $dur->months;
    $dur->weeks;
    $dur->days;
    $dur->hours;
    $dur->minutes;
    $dur->seconds;
    $dur->nanoseconds;
  
    $dur->is_wrap_mode
    $dur->is_limit_mode
    $dur->is_preserve_mode
  
    print $dur->end_of_month_mode;
  
    # Multiply all values by -1
    my $opposite = $dur->inverse;
  
    my $bigger  = $dur1 + $dur2;
    my $smaller = $dur1 - $dur2; # the result could be negative
    my $bigger  = $dur1 * 3;
  
    my $base_dt = DateTime->new( year => 2000 );
    my @sorted =
        sort { DateTime::Duration->compare( $a, $b, $base_dt ) } @durations;
  
    if ( $dur->is_positive ) { ... }
    if ( $dur->is_zero )     { ... }
    if ( $dur->is_negative ) { ... }
  
  =head1 DESCRIPTION
  
  This is a simple class for representing duration objects. These
  objects are used whenever you do date math with DateTime.pm.
  
  See the L<How DateTime Math Works|DateTime/"How DateTime Math Works"> section
  of the DateTime.pm documentation for more details. The short course: One
  cannot in general convert between seconds, minutes, days, and months, so this
  class will never do so. Instead, create the duration with the desired units to
  begin with, for example by calling the appropriate subtraction/delta method on
  a C<DateTime.pm> object.
  
  =head1 METHODS
  
  Like C<DateTime> itself, C<DateTime::Duration> returns the object from
  mutator methods in order to make method chaining possible.
  
  C<DateTime::Duration> has the following methods:
  
  =head2 DateTime::Duration->new( ... )
  
  This method takes the parameters "years", "months", "weeks", "days",
  "hours", "minutes", "seconds", "nanoseconds", and "end_of_month". All
  of these except "end_of_month" are numbers. If any of the numbers are
  negative, the entire duration is negative.
  
  All of the numbers B<must be integers>.
  
  Internally, years as just treated as 12 months. Similarly, weeks are
  treated as 7 days, and hours are converted to minutes. Seconds and
  nanoseconds are both treated separately.
  
  The "end_of_month" parameter must be either "wrap", "limit", or
  "preserve". This parameter specifies how date math that crosses the
  end of a month is handled.
  
  In "wrap" mode, adding months or years that result in days beyond the
  end of the new month will roll over into the following month. For
  instance, adding one year to Feb 29 will result in Mar 1.
  
  If you specify "end_of_month" mode as "limit", the end of the month is
  never crossed. Thus, adding one year to Feb 29, 2000 will result in
  Feb 28, 2001. If you were to then add three more years this will
  result in Feb 28, 2004.
  
  If you specify "end_of_month" mode as "preserve", the same calculation
  is done as for "limit" except that if the original date is at the end
  of the month the new date will also be. For instance, adding one
  month to Feb 29, 2000 will result in Mar 31, 2000.
  
  For positive durations, the "end_of_month" parameter defaults to wrap.
  For negative durations, the default is "preserve". This should match
  how most people "intuitively" expect datetime math to work.
  
  =head2 $dur->clone()
  
  Returns a new object with the same properties as the object on which
  this method was called.
  
  =head2 $dur->in_units( ... )
  
  Returns the length of the duration in the units (any of those that can
  be passed to C<new>) given as arguments. All lengths are integral,
  but may be negative. Smaller units are computed from what remains
  after taking away the larger units given, so for example:
  
    my $dur = DateTime::Duration->new( years => 1, months => 15 );
  
    $dur->in_units( 'years' );            # 2
    $dur->in_units( 'months' );           # 27
    $dur->in_units( 'years', 'months' );  # (2, 3)
    $dur->in_units( 'weeks', 'days' );    # (0, 0) !
  
  The last example demonstrates that there will not be any conversion
  between units which don't have a fixed conversion rate. The only
  conversions possible are:
  
  =over 8
  
  =item * years <=> months
  
  =item * weeks <=> days
  
  =item * hours <=> minutes
  
  =item * seconds <=> nanoseconds
  
  =back
  
  For the explanation of why this is the case, please see the L<How DateTime
  Math Works|DateTime/"How DateTime Math Works"> section of the DateTime.pm
  documentation
  
  Note that the numbers returned by this method may not match the values
  given to the constructor.
  
  In list context, in_units returns the lengths in the order of the units
  given. In scalar context, it returns the length in the first unit (but
  still computes in terms of all given units).
  
  If you need more flexibility in presenting information about
  durations, please take a look a C<DateTime::Format::Duration>.
  
  =head2 $dur->is_positive(), $dur->is_zero(), $dur->is_negative()
  
  Indicates whether or not the duration is positive, zero, or negative.
  
  If the duration contains both positive and negative units, then it
  will return false for B<all> of these methods.
  
  =head2 $dur->is_wrap_mode(), $dur->is_limit_mode(), $dur->is_preserve_mode()
  
  Indicates what mode is used for end of month wrapping.
  
  =head2 $dur->end_of_month_mode()
  
  Returns one of "wrap", "limit", or "preserve".
  
  =head2 $dur->calendar_duration()
  
  Returns a new object with the same I<calendar> delta (months and days
  only) and end of month mode as the current object.
  
  =head2 $dur->clock_duration()
  
  Returns a new object with the same I<clock> deltas (minutes, seconds,
  and nanoseconds) and end of month mode as the current object.
  
  =head2 $dur->inverse( ... )
  
  Returns a new object with the same deltas as the current object, but
  multiple by -1. The end of month mode for the new object will be the
  default end of month mode, which depends on whether the new duration
  is positive or negative.
  
  You can set the end of month mode in the inverted duration explicitly by
  passing "end_of_month => ..." to the C<inverse()> method.
  
  =head2 $dur->add_duration( $duration_object ), $dur->subtract_duration( $duration_object )
  
  Adds or subtracts one duration from another.
  
  =head2 $dur->add( ... ), $dur->subtract( ... )
  
  These accept either constructor parameters for a new C<DateTime::Duration>
  object or an already-constructed duration object.
  
  =head2 $dur->multiply( $number )
  
  Multiplies each unit in the C<DateTime::Duration> object by the specified integer number.
  
  =head2 DateTime::Duration->compare( $duration1, $duration2, $base_datetime )
  
  This is a class method that can be used to compare or sort durations.
  Comparison is done by adding each duration to the specified
  C<DateTime.pm> object and comparing the resulting datetimes. This is
  necessary because without a base, many durations are not comparable.
  For example, 1 month may or may not be longer than 29 days, depending
  on what datetime it is added to.
  
  If no base datetime is given, then the result of C<< DateTime->now >>
  is used instead. Using this default will give non-repeatable results
  if used to compare two duration objects containing different units.
  It will also give non-repeatable results if the durations contain
  multiple types of units, such as months and days.
  
  However, if you know that both objects only consist of one type of
  unit (months I<or> days I<or> hours, etc.), and each duration contains
  the same type of unit, then the results of the comparison will be
  repeatable.
  
  =head2 $dur->delta_months(), $dur->delta_days(), $dur->delta_minutes(), $dur->delta_seconds(), $dur->delta_nanoseconds()
  
  These methods provide the information C<DateTime.pm> needs for doing date
  math. The numbers returned may be positive or negative. This is mostly useful
  for doing date math in L<DateTime>.
  
  =head2 $dur->deltas()
  
  Returns a hash with the keys "months", "days", "minutes", "seconds", and
  "nanoseconds", containing all the delta information for the object. This is
  mostly useful for doing date math in L<DateTime>.
  
  =head2 $dur->years(), $dur->months(), $dur->weeks(), $dur->days(), $dur->hours(), $dur->minutes(), $dur->seconds(), $dur->nanoseconds()
  
  These methods return numbers indicating how many of the given unit the
  object represents, after having done a conversion to any larger units.
  For example, days are first converted to weeks, and then the remainder
  is returned. These numbers are always positive.
  
  Here's what each method returns:
  
   $dur->years()       == abs( $dur->in_units('years') )
   $dur->months()      == abs( ( $dur->in_units( 'months', 'years' ) )[0] )
   $dur->weeks()       == abs( $dur->in_units( 'weeks' ) )
   $dur->days()        == abs( ( $dur->in_units( 'days', 'weeks' ) )[0] )
   $dur->hours()       == abs( $dur->in_units( 'hours' ) )
   $dur->minutes       == abs( ( $dur->in_units( 'minutes', 'hours' ) )[0] )
   $dur->seconds       == abs( $dur->in_units( 'seconds' ) )
   $dur->nanoseconds() == abs( ( $dur->in_units( 'nanoseconds', 'seconds' ) )[0] )
  
  If this seems confusing, remember that you can always use the
  C<in_units()> method to specify exactly what you want.
  
  Better yet, if you are trying to generate output suitable for humans,
  use the C<DateTime::Format::Duration> module.
  
  =head2 Overloading
  
  This class overloads addition, subtraction, and mutiplication.
  
  Comparison is B<not> overloaded. If you attempt to compare durations
  using C<< <=> >> or C<cmp>, then an exception will be thrown!  Use the
  C<compare()> class method instead.
  
  =head1 SEE ALSO
  
  datetime@perl.org mailing list
  
  http://datetime.perl.org/
  
  =head1 SUPPORT
  
  Support for this module is provided via the datetime@perl.org email
  list. See http://lists.perl.org/ for more details.
  
  Bugs may be submitted at L<https://github.com/houseabsolute/DateTime.pm/issues>.
  
  There is a mailing list available for users of this distribution,
  L<mailto:datetime@perl.org>.
  
  I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
  
  =head1 SOURCE
  
  The source code repository for DateTime can be found at L<https://github.com/houseabsolute/DateTime.pm>.
  
  =head1 AUTHOR
  
  Dave Rolsky <autarch@urth.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is Copyright (c) 2003 - 2019 by Dave Rolsky.
  
  This is free software, licensed under:
  
    The Artistic License 2.0 (GPL Compatible)
  
  The full text of the license can be found in the
  F<LICENSE> file included with this distribution.
  
  =cut
DATETIME_DURATION

    $main::fatpacked{"DateTime/Helpers.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_HELPERS';
  package DateTime::Helpers;
  
  use strict;
  use warnings;
  
  our $VERSION = '1.51';
  
  use Scalar::Util ();
  
  sub can {
      my $object = shift;
      my $method = shift;
  
      return unless Scalar::Util::blessed($object);
      return $object->can($method);
  }
  
  sub isa {
      my $object = shift;
      my $method = shift;
  
      return unless Scalar::Util::blessed($object);
      return $object->isa($method);
  }
  
  1;
DATETIME_HELPERS

    $main::fatpacked{"DateTime/Infinite.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_INFINITE';
  ## no critic (Modules::ProhibitMultiplePackages)
  package DateTime::Infinite;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '1.51';
  
  use DateTime;
  use DateTime::TimeZone;
  
  use base qw(DateTime);
  
  foreach my $m (qw( set set_time_zone truncate )) {
      ## no critic (TestingAndDebugging::ProhibitNoStrict)
      no strict 'refs';
      *{"DateTime::Infinite::$m"} = sub { return $_[0] };
  }
  
  sub is_finite   {0}
  sub is_infinite {1}
  
  ## no critic (Subroutines::ProhibitUnusedPrivateSubroutines)
  sub _rd2ymd {
      return $_[2] ? ( $_[1] ) x 7 : ( $_[1] ) x 3;
  }
  
  sub _seconds_as_components {
      return ( $_[1] ) x 3;
  }
  
  sub ymd {
      return $_[0]->iso8601;
  }
  
  sub mdy {
      return $_[0]->iso8601;
  }
  
  sub dmy {
      return $_[0]->iso8601;
  }
  
  sub hms {
      return $_[0]->iso8601;
  }
  
  sub hour_12 {
      return $_[0]->_infinity_string;
  }
  
  sub hour_12_0 {
      return $_[0]->_infinity_string;
  }
  
  sub datetime {
      return $_[0]->_infinity_string;
  }
  
  sub stringify {
      return $_[0]->_infinity_string;
  }
  
  sub _infinity_string {
      return $_[0]->{utc_rd_days} == DateTime::INFINITY
          ? DateTime::INFINITY . q{}
          : DateTime::NEG_INFINITY . q{};
  }
  
  sub _week_values { [ $_[0]->{utc_rd_days}, $_[0]->{utc_rd_days} ] }
  
  sub STORABLE_freeze {return}
  sub STORABLE_thaw   {return}
  
  package DateTime::Infinite::Future;
  
  use strict;
  use warnings;
  
  use base qw(DateTime::Infinite);
  
  {
      my $Pos = bless {
          utc_rd_days   => DateTime::INFINITY,
          utc_rd_secs   => DateTime::INFINITY,
          local_rd_days => DateTime::INFINITY,
          local_rd_secs => DateTime::INFINITY,
          rd_nanosecs   => DateTime::INFINITY,
          tz            => DateTime::TimeZone->new( name => 'floating' ),
          locale        => FakeLocale->instance(),
          },
          __PACKAGE__;
  
      $Pos->_calc_utc_rd;
      $Pos->_calc_local_rd;
  
      sub new {$Pos}
  }
  
  package DateTime::Infinite::Past;
  
  use strict;
  use warnings;
  
  use base qw(DateTime::Infinite);
  
  {
      my $Neg = bless {
          utc_rd_days   => DateTime::NEG_INFINITY,
          utc_rd_secs   => DateTime::NEG_INFINITY,
          local_rd_days => DateTime::NEG_INFINITY,
          local_rd_secs => DateTime::NEG_INFINITY,
          rd_nanosecs   => DateTime::NEG_INFINITY,
          tz            => DateTime::TimeZone->new( name => 'floating' ),
          locale        => FakeLocale->instance(),
          },
          __PACKAGE__;
  
      $Neg->_calc_utc_rd;
      $Neg->_calc_local_rd;
  
      sub new {$Neg}
  }
  
  package    # hide from PAUSE
      FakeLocale;
  
  use strict;
  use warnings;
  
  use DateTime::Locale;
  
  my $Instance;
  
  sub instance {
      return $Instance ||= bless { locale => DateTime::Locale->load('en_US') },
          __PACKAGE__;
  }
  
  sub id {
      return 'infinite';
  }
  
  sub language_id {
      return 'infinite';
  }
  
  sub name {
      'Fake locale for Infinite DateTime objects';
  }
  
  sub language {
      'Fake locale for Infinite DateTime objects';
  }
  
  my @methods = qw(
      script_id
      territory_id
      variant_id
      script
      territory
      variant
      native_name
      native_language
      native_script
      native_territory
      native_variant
  );
  
  for my $meth (@methods) {
      ## no critic (TestingAndDebugging::ProhibitNoStrict)
      no strict 'refs';
      *{$meth} = sub {undef};
  }
  
  # Totally arbitrary
  sub first_day_of_week {
      return 1;
  }
  
  sub prefers_24_hour_time {
      return 0;
  }
  
  our $AUTOLOAD;
  
  ## no critic (ClassHierarchies::ProhibitAutoloading)
  sub AUTOLOAD {
      my $self = shift;
  
      my ($meth) = $AUTOLOAD =~ /::(\w+)$/;
  
      if ( $meth =~ /format/ && $meth !~ /^(?:day|month|quarter)/ ) {
          return $self->{locale}->$meth(@_);
      }
  
      return [];
  }
  
  1;
  
  # ABSTRACT: Infinite past and future DateTime objects
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  DateTime::Infinite - Infinite past and future DateTime objects
  
  =head1 VERSION
  
  version 1.51
  
  =head1 SYNOPSIS
  
    my $future = DateTime::Infinite::Future->new();
    my $past   = DateTime::Infinite::Past->new();
  
  =head1 DESCRIPTION
  
  This module provides two L<DateTime.pm|DateTime> subclasses,
  C<DateTime::Infinite::Future> and C<DateTime::Infinite::Past>.
  
  The objects are in the "floating" timezone, and this cannot be
  changed.
  
  =head1 METHODS
  
  The only constructor for these two classes is the C<new()> method, as
  shown in the L<SYNOPSIS|/SYNOPSIS>. This method takes no parameters.
  
  All "get" methods in this module simply return infinity, positive or
  negative. If the method is expected to return a string, it returns the
  string representation of positive or negative infinity used by your
  system. For example, on my system calling C<year()> returns a number
  which when printed appears either "Inf" or "-Inf".
  
  This also applies to methods that are compound stringifications, which return
  the same strings even for things like C<ymd()> or C<iso8601()>
  
  The object is not mutable, so the C<set()>, C<set_time_zone()>, and
  C<truncate()> methods are all do-nothing methods that simply return
  the object they are called with.
  
  Obviously, the C<is_finite()> method returns false and the
  C<is_infinite()> method returns true.
  
  =head1 SEE ALSO
  
  datetime@perl.org mailing list
  
  http://datetime.perl.org/
  
  =head1 BUGS
  
  There seem to be lots of problems when dealing with infinite numbers
  on Win32. This may be a problem with this code, Perl, or Win32's IEEE
  math implementation. Either way, the module may not be well-behaved
  on Win32 operating systems.
  
  Bugs may be submitted at L<https://github.com/houseabsolute/DateTime.pm/issues>.
  
  There is a mailing list available for users of this distribution,
  L<mailto:datetime@perl.org>.
  
  I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
  
  =head1 SOURCE
  
  The source code repository for DateTime can be found at L<https://github.com/houseabsolute/DateTime.pm>.
  
  =head1 AUTHOR
  
  Dave Rolsky <autarch@urth.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is Copyright (c) 2003 - 2019 by Dave Rolsky.
  
  This is free software, licensed under:
  
    The Artistic License 2.0 (GPL Compatible)
  
  The full text of the license can be found in the
  F<LICENSE> file included with this distribution.
  
  =cut
DATETIME_INFINITE

    $main::fatpacked{"DateTime/LeapSecond.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_LEAPSECOND';
  package DateTime::LeapSecond;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '1.51';
  
  our ( @RD, @LEAP_SECONDS, %RD_LENGTH );
  
  use DateTime;
  
  # Generates a Perl binary decision tree
  sub _make_utx {
      my ( $beg, $end, $tab, $op ) = @_;
      my $step = int( ( $end - $beg ) / 2 );
      my $tmp;
      if ( $step <= 0 ) {
          $tmp = "${tab}return $LEAP_SECONDS[$beg + 1];\n";
          return $tmp;
      }
      $tmp = "${tab}if (\$val < " . $RD[ $beg + $step ] . ") {\n";
      $tmp .= _make_utx( $beg,         $beg + $step, $tab . q{    }, $op );
      $tmp .= "${tab}}\n";
      $tmp .= "${tab}else {\n";
      $tmp .= _make_utx( $beg + $step, $end,         $tab . q{    }, $op );
      $tmp .= "${tab}}\n";
      return $tmp;
  }
  
  # Process BEGIN data and write binary tree decision table
  sub _init {
      my $value = -1;
      while (@_) {
          my ( $year, $mon, $mday, $leap_seconds )
              = ( shift, shift, shift, shift );
  
          # print "$year,$mon,$mday\n";
  
          ## no critic (Subroutines::ProtectPrivateSubs)
          my $utc_epoch
              = DateTime->_ymd2rd( $year, ( $mon =~ /Jan/i ? 1 : 7 ), $mday );
  
          $value++;
          push @LEAP_SECONDS, $value;
          push @RD,           $utc_epoch;
  
          $RD_LENGTH{ $utc_epoch - 1 } = $leap_seconds;
  
          # warn "$year,$mon,$mday = $utc_epoch +$value";
      }
  
      push @LEAP_SECONDS, ++$value;
  
      my $tmp;
  
      # write binary tree decision table
  
      $tmp = "sub leap_seconds {\n";
      $tmp .= "    my \$val = shift;\n";
      $tmp .= _make_utx( -1, 1 + $#RD, q{    }, '+' );
      $tmp .= "}; 1\n";
  
      # NOTE: uncomment the line below to see the code:
      #warn $tmp;
  
      ## no critic (BuiltinFunctions::ProhibitStringyEval)
      eval $tmp or die $@;
  }
  
  sub extra_seconds {
      exists $RD_LENGTH{ $_[0] } ? $RD_LENGTH{ $_[0] } : 0;
  }
  
  sub day_length {
      exists $RD_LENGTH{ $_[0] } ? 86400 + $RD_LENGTH{ $_[0] } : 86400;
  }
  
  sub _initialize {
  
      # There are no leap seconds before 1972, because that's the
      # year this system was implemented.
      #
      # year month day number-of-leapseconds
      #
      _init(
          qw(
              1972  Jul. 1  +1
              1973  Jan. 1  +1
              1974  Jan. 1  +1
              1975  Jan. 1  +1
              1976  Jan. 1  +1
              1977  Jan. 1  +1
              1978  Jan. 1  +1
              1979  Jan. 1  +1
              1980  Jan. 1  +1
              1981  Jul. 1  +1
              1982  Jul. 1  +1
              1983  Jul. 1  +1
              1985  Jul. 1  +1
              1988  Jan. 1  +1
              1990  Jan. 1  +1
              1991  Jan. 1  +1
              1992  Jul. 1  +1
              1993  Jul. 1  +1
              1994  Jul. 1  +1
              1996  Jan. 1  +1
              1997  Jul. 1  +1
              1999  Jan. 1  +1
              2006  Jan. 1  +1
              2009  Jan. 1  +1
              2012  Jul. 1  +1
              2015  Jul. 1  +1
              2017  Jan. 1  +1
              )
      );
  }
  
  __PACKAGE__->_initialize();
  
  1;
  
  # ABSTRACT: leap seconds table and utilities
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  DateTime::LeapSecond - leap seconds table and utilities
  
  =head1 VERSION
  
  version 1.51
  
  =head1 SYNOPSIS
  
    use DateTime;
    use DateTime::LeapSecond;
  
    print "Leap seconds between years 1990 and 2000 are ";
    print DateTime::Leapsecond::leap_seconds( $utc_rd_2000 ) -
          DateTime::Leapsecond::leap_seconds( $utc_rd_1990 );
  
  =head1 DESCRIPTION
  
  This module is used to calculate leap seconds for a given Rata Die
  day. It is used when DateTime.pm cannot compile the XS version of
  this code.
  
  This library is known to be accurate for dates until Jun 2017.
  
  There are no leap seconds before 1972, because that's the year this
  system was implemented.
  
  =over 4
  
  =item * leap_seconds( $rd )
  
  Returns the number of accumulated leap seconds for a given day.
  
  =item * extra_seconds( $rd )
  
  Returns the number of leap seconds for a given day,
  in the range -2 .. 2.
  
  =item * day_length( $rd )
  
  Returns the number of seconds for a given day,
  in the range 86398 .. 86402.
  
  =back
  
  =head1 SEE ALSO
  
  L<http://hpiers.obspm.fr/eop-pc/earthor/utc/leapsecond.html>
  
  http://datetime.perl.org
  
  =head1 SUPPORT
  
  Bugs may be submitted at L<https://github.com/houseabsolute/DateTime.pm/issues>.
  
  There is a mailing list available for users of this distribution,
  L<mailto:datetime@perl.org>.
  
  I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
  
  =head1 SOURCE
  
  The source code repository for DateTime can be found at L<https://github.com/houseabsolute/DateTime.pm>.
  
  =head1 AUTHOR
  
  Dave Rolsky <autarch@urth.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is Copyright (c) 2003 - 2019 by Dave Rolsky.
  
  This is free software, licensed under:
  
    The Artistic License 2.0 (GPL Compatible)
  
  The full text of the license can be found in the
  F<LICENSE> file included with this distribution.
  
  =cut
DATETIME_LEAPSECOND

    $main::fatpacked{"DateTime/Locale.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_LOCALE';
  package DateTime::Locale;
  
  use 5.008004;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '1.24';
  
  use DateTime::Locale::Data;
  use DateTime::Locale::FromData;
  use DateTime::Locale::Util qw( parse_locale_code );
  use Params::ValidationCompiler 0.13 qw( validation_for );
  use Specio::Library::String;
  
  my %Class;
  my %DataForCode;
  my %NameToCode;
  my %NativeNameToCode;
  my %UserDefinedAlias;
  
  my %LoadCache;
  
  sub register {
      my $class = shift;
  
      %LoadCache = ();
  
      if ( ref $_[0] ) {
          $class->_register(%$_) foreach @_;
      }
      else {
          $class->_register(@_);
      }
  }
  
  sub _register {
      shift;
      my %p = @_;
  
      my $id = $p{id};
  
      die q{'\@' or '=' are not allowed in locale ids}
          if $id =~ /[\@=]/;
  
      die
          "You cannot replace an existing locale ('$id') unless you also specify the 'replace' parameter as true\n"
          if !delete $p{replace} && exists $DataForCode{$id};
  
      $p{native_language} = $p{en_language}
          unless exists $p{native_language};
  
      my @en_pieces;
      my @native_pieces;
      foreach my $p (qw( language script territory variant )) {
          push @en_pieces,     $p{"en_$p"}     if exists $p{"en_$p"};
          push @native_pieces, $p{"native_$p"} if exists $p{"native_$p"};
      }
  
      $p{en_complete_name}     = join q{ }, @en_pieces;
      $p{native_complete_name} = join q{ }, @native_pieces;
  
      $id =~ s/_/-/g;
  
      $DataForCode{$id} = \%p;
  
      $NameToCode{ $p{en_complete_name} }           = $id;
      $NativeNameToCode{ $p{native_complete_name} } = $id;
  
      $Class{$id} = $p{class} if defined exists $p{class};
  }
  
  sub register_from_data {
      shift;
  
      %LoadCache = ();
  
      my %p = ref $_[0] ? %{ $_[0] } : @_;
  
      my $code = $p{code};
  
      die q{'\@' or '=' are not allowed in locale codes}
          if $code =~ /[\@=]/;
  
      $code =~ s/_/-/g;
  
      DateTime::Locale::Data::add_locale( $code, \%p );
      return $LoadCache{$code} = DateTime::Locale::FromData->new( \%p );
  }
  
  sub add_aliases {
      shift;
  
      %LoadCache = ();
  
      my $aliases = ref $_[0] ? $_[0] : {@_};
  
      for my $alias ( keys %{$aliases} ) {
          my $code = $aliases->{$alias};
  
          die q{Can't alias an id to itself}
              if $alias eq $code;
  
          # check for overwrite?
  
          my %seen = ( $alias => 1, $code => 1 );
          my $copy = $code;
          while ( $copy = $UserDefinedAlias{$copy} ) {
              die
                  "Creating an alias from $alias to $code would create a loop.\n"
                  if $seen{$copy};
  
              $seen{$copy} = 1;
          }
  
          $UserDefinedAlias{$alias} = $code;
      }
  }
  
  sub remove_alias {
      shift;
  
      %LoadCache = ();
  
      my $alias = shift;
  
      return delete $UserDefinedAlias{$alias};
  }
  
  # deprecated
  sub ids {
      shift->codes;
  }
  
  ## no critic (Variables::ProhibitPackageVars)
  sub codes {
      wantarray
          ? keys %DateTime::Locale::Data::Codes
          : [ keys %DateTime::Locale::Data::Codes ];
  }
  
  sub names {
      wantarray
          ? keys %DateTime::Locale::Data::Names
          : [ keys %DateTime::Locale::Data::Names ];
  }
  
  sub native_names {
      wantarray
          ? keys %DateTime::Locale::Data::NativeNames
          : [ keys %DateTime::Locale::Data::NativeNames ];
  }
  
  # These are hard-coded for backwards comaptibility with the DateTime::Language
  # code.
  my %DateTimeLanguageAliases = (
  
      #    'Afar'      => 'aa',
      'Amharic'   => 'am-ET',
      'Austrian'  => 'de-AT',
      'Brazilian' => 'pt-BR',
      'Czech'     => 'cs-CZ',
      'Danish'    => 'da-DK',
      'Dutch'     => 'nl-NL',
      'English'   => 'en-US',
      'French'    => 'fr-FR',
  
      #      'Gedeo'             => undef, # XXX
      'German'    => 'de-DE',
      'Italian'   => 'it-IT',
      'Norwegian' => 'no-NO',
      'Oromo'     => 'om-ET',    # Maybe om-KE or plain om ?
      'Portugese' => 'pt-PT',
  
      #    'Sidama'            => 'sid',
      'Somali'  => 'so-SO',
      'Spanish' => 'es-ES',
      'Swedish' => 'sv-SE',
  
      #    'Tigre'             => 'tig',
      'TigrinyaEthiopian' => 'ti-ET',
      'TigrinyaEritrean'  => 'ti-ER',
  );
  
  my %POSIXAliases = (
      C     => 'en-US-POSIX',
      POSIX => 'en-US-POSIX',
  );
  
  {
      my $validator = validation_for(
          name             => '_check_load_params',
          name_is_optional => 1,
          params           => [
              { type => t('NonEmptyStr') },
          ],
      );
  
      sub load {
          my $class = shift;
          my ($code) = $validator->(@_);
  
          # We used to use underscores in codes instead of dashes. We want to
          # support both indefinitely.
          $code =~ tr/_/-/;
  
          # Strip off charset for LC_* codes : en_GB.UTF-8 etc
          $code =~ s/\..*$//;
  
          return $LoadCache{$code} if exists $LoadCache{$code};
  
          while ( exists $UserDefinedAlias{$code} ) {
              $code = $UserDefinedAlias{$code};
          }
  
          $code = $DateTimeLanguageAliases{$code}
              if exists $DateTimeLanguageAliases{$code};
          $code = $POSIXAliases{$code} if exists $POSIXAliases{$code};
          $code = $DateTime::Locale::Data::ISO639Aliases{$code}
              if exists $DateTime::Locale::Data::ISO639Aliases{$code};
  
          if ( exists $DateTime::Locale::Data::Codes{$code} ) {
              return $class->_locale_object_for($code);
          }
  
          if ( exists $DateTime::Locale::Data::Names{$code} ) {
              return $class->_locale_object_for(
                  $DateTime::Locale::Data::Names{$code} );
          }
  
          if ( exists $DateTime::Locale::Data::NativeNames{$code} ) {
              return $class->_locale_object_for(
                  $DateTime::Locale::Data::NativeNames{$code} );
          }
  
          if ( my $locale = $class->_registered_locale_for($code) ) {
              return $locale;
          }
  
          if ( my $guessed = $class->_guess_code($code) ) {
              return $class->_locale_object_for($guessed);
          }
  
          die "Invalid locale code or name: $code\n";
      }
  }
  
  sub _guess_code {
      shift;
      my $code = shift;
  
      my %codes = parse_locale_code($code);
  
      my @guesses;
  
      if ( $codes{script} ) {
          my $guess = join q{-}, $codes{language}, $codes{script};
  
          push @guesses, $guess;
  
          $guess .= q{-} . $codes{territory} if defined $codes{territory};
  
          # version with script comes first
          unshift @guesses, $guess;
      }
  
      if ( $codes{variant} ) {
          push @guesses, join q{-}, $codes{language}, $codes{territory},
              $codes{variant};
      }
  
      if ( $codes{territory} ) {
          push @guesses, join q{-}, $codes{language}, $codes{territory};
      }
  
      push @guesses, $codes{language};
  
      for my $code (@guesses) {
          return $code
              if exists $DateTime::Locale::Data::Codes{$code}
              || exists $DateTime::Locale::Data::Names{$code};
      }
  }
  
  sub _locale_object_for {
      shift;
      my $code = shift;
  
      my $data = DateTime::Locale::Data::locale_data($code)
          or return;
  
      # We want to make a copy of the data just in case ...
      return $LoadCache{$code} = DateTime::Locale::FromData->new( \%{$data} );
  }
  
  sub _registered_locale_for {
      my $class = shift;
      my $code  = shift;
  
      # Custom locale registered by user
      if ( $Class{$code} ) {
          return $LoadCache{$code}
              = $class->_load_class_from_code( $code, $Class{$code} );
      }
  
      if ( $DataForCode{$code} ) {
          return $LoadCache{$code} = $class->_load_class_from_code($code);
      }
  
      if ( $NameToCode{$code} ) {
          return $LoadCache{$code}
              = $class->_load_class_from_code( $NameToCode{$code} );
      }
  
      if ( $NativeNameToCode{$code} ) {
          return $LoadCache{$code}
              = $class->_load_class_from_code( $NativeNameToCode{$code} );
      }
  }
  
  sub _load_class_from_code {
      my $class      = shift;
      my $code       = shift;
      my $real_class = shift;
  
      # We want the first alias for which there is data, even if it has
      # no corresponding .pm file.  There may be multiple levels of
      # alias to go through.
      my $data_code = $code;
      while ( exists $UserDefinedAlias{$data_code}
          && !exists $DataForCode{$data_code} ) {
  
          $data_code = $UserDefinedAlias{$data_code};
      }
  
      ( my $underscore_code = $data_code ) =~ s/-/_/g;
      $real_class ||= "DateTime::Locale::$underscore_code";
  
      unless ( $real_class->can('new') ) {
          ## no critic (BuiltinFunctions::ProhibitStringyEval, ErrorHandling::RequireCheckingReturnValueOfEval)
          eval "require $real_class";
          die $@ if $@;
          ## use critic
      }
  
      my $locale = $real_class->new(
          %{ $DataForCode{$data_code} },
          code => $code,
      );
  
      if ( $locale->can('cldr_version') ) {
          my $object_version = $locale->cldr_version;
  
          if ( $object_version ne $DateTime::Locale::Data::CLDRVersion ) {
              warn
                  "Loaded $real_class, which is from an older version ($object_version)"
                  . ' of the CLDR database than this installation of'
                  . " DateTime::Locale ($DateTime::Locale::Data::CLDRVersion).\n";
          }
      }
  
      return $locale;
  }
  ## use critic
  
  1;
  
  # ABSTRACT: Localization support for DateTime.pm
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  DateTime::Locale - Localization support for DateTime.pm
  
  =head1 VERSION
  
  version 1.24
  
  =head1 SYNOPSIS
  
    use DateTime::Locale;
  
    my $loc = DateTime::Locale->load('en-GB');
  
    print $loc->native_name, "\n", $loc->datetime_format_long, "\n";
  
    # but mostly just things like ...
  
    my $dt = DateTime->now( locale => 'fr' );
    print "Aujourd'hui le mois est " . $dt->month_name, "\n";
  
  =head1 DESCRIPTION
  
  DateTime::Locale is primarily a factory for the various locale subclasses. It
  also provides some functions for getting information on all the available
  locales.
  
  If you want to know what methods are available for locale objects, then please
  read the C<DateTime::Locale::FromData> documentation.
  
  =head1 USAGE
  
  This module provides the following class methods:
  
  =head2 DateTime::Locale->load( $locale_code | $locale_name )
  
  Returns the locale object for the specified locale code or name - see the
  C<DateTime::Locale::Catalog> documentation for the list of available codes and
  names. The name provided may be either the English or native name.
  
  If the requested locale is not found, a fallback search takes place to
  find a suitable replacement.
  
  The fallback search order is:
  
    {language}-{script}-{territory}
    {language}-{script}
    {language}-{territory}-{variant}
    {language}-{territory}
    {language}
  
  Eg. For the locale code C<es-XX-UNKNOWN> the fallback search would be:
  
    es-XX-UNKNOWN   # Fails - no such locale
    es-XX           # Fails - no such locale
    es              # Found - the es locale is returned as the
                    # closest match to the requested id
  
  Eg. For the locale code C<es-Latn-XX> the fallback search would be:
  
    es-Latn-XX      # Fails - no such locale
    es-Latn         # Fails - no such locale
    es-XX           # Fails - no such locale
    es              # Found - the es locale is returned as the
                    # closest match to the requested id
  
  If no suitable replacement is found, then an exception is thrown.
  
  The loaded locale is cached, so that B<locale objects may be
  singletons>. Calling C<< DateTime::Locale->register_from_data >>, C<<
  DateTime::Locale->add_aliases >>, or C<< DateTime::Locale->remove_alias >>
  clears the cache.
  
  =head2 DateTime::Locale->codes
  
    my @codes = DateTime::Locale->codes;
    my $codes = DateTime::Locale->codes;
  
  Returns an unsorted list of the available locale codes, or an array reference if
  called in a scalar context. This list does not include aliases.
  
  =head2 DateTime::Locale->names
  
    my @names = DateTime::Locale->names;
    my $names = DateTime::Locale->names;
  
  Returns an unsorted list of the available locale names in English, or an array
  reference if called in a scalar context.
  
  =head2 DateTime::Locale->native_names
  
    my @names = DateTime::Locale->native_names;
    my $names = DateTime::Locale->native_names;
  
  Returns an unsorted list of the available locale names in their native
  language, or an array reference if called in a scalar context. All native
  names use UTF-8 as appropriate.
  
  =head2 DateTime::Locale->register_from_data( $locale_data )
  
  This method allows you to register a custom locale. The data for the locale is
  specified as a hash (or hashref) where the keys match the method names given
  in C<DateTime::Locale::FromData>.
  
  If you just want to make some small changes on top of an existing locale you
  can get that locale's data by calling C<< $locale->locale_data >>.
  
  Here is an example of making a custom locale based off of C<en-US>:
  
    my $locale = DateTime::Locale->load('en-US');
    my %data   = $locale->locale_data;
    $data{code}               = 'en-US-CUSTOM';
    $data{time_format_medium} = 'HH:mm:ss';
  
    DateTime::Locale->register_from_data(%data);
  
    # Prints 18:24:38
    say DateTime->now( locale => 'en-US-CUSTOM' )->strftime('%X');
  
    # Prints 6:24:38 PM
    say DateTime->now( locale => 'en-US' )->strftime('%X');
  
  The keys that should be present in the hash are the same as the accessor
  methods provided by L<DateTime::Locale::FromData>, except for the following:
  
  =over 4
  
  =item The C<*_code> methods
  
  While you should provide a C<code> key, the other methods like
  C<language_code> and C<script_code> are determined by parsing the code.
  
  =item All C<id> returning methods
  
  These are aliases for the corresponding C<*code> methods.
  
  =item C<prefers_24_hour_time>
  
  This is determined by looking at the short time format to see how it formats
  hours,
  
  =item C<date_format_default> and C<time_format_default>
  
  These are the corresponding medium formats.
  
  =item C<datetime_format> and C<datetime_format_default>
  
  This is the same as the medium format.
  
  =item C<date_formats> and C<time_formats>
  
  These are calculated as needed.
  
  =item C<available_formats>
  
  This should be provided as a hashref where the keys are things like C<Gy> or
  C<MMMEd> and the values are an actual format like C<"y G"> or C<"E, MMM d">.
  
  =item C<locale_data>
  
  This is everything you pass in.
  
  =back
  
  =head1 LOADING LOCALES IN A PRE-FORKING SYSTEM
  
  If you are running an application that does pre-forking (for example with
  Starman), then you should try to load all the locales that you'll need in the
  parent process. Locales are loaded on-demand, so loading them once in each
  child will waste memory that could otherwise be shared.
  
  =head1 CLDR DATA BUGS
  
  Please be aware that all locale data has been generated from the CLDR (Common
  Locale Data Repository) project locales data). The data is incomplete, and may
  contain errors in some locales.
  
  When reporting errors in data, please check the primary data sources first,
  then where necessary report errors directly to the primary source via the CLDR
  bug report system. See http://unicode.org/cldr/filing_bug_reports.html for
  details.
  
  Once these errors have been confirmed, please forward the error report and
  corrections to the DateTime mailing list, datetime@perl.org.
  
  =head1 AUTHOR EMERITUS
  
  Richard Evans wrote the first version of DateTime::Locale, including the tools
  to extract the CLDR data.
  
  =head1 SEE ALSO
  
  L<DateTime::Locale::Base>
  
  datetime@perl.org mailing list
  
  http://datetime.perl.org/
  
  =head1 SUPPORT
  
  Bugs may be submitted at L<https://github.com/houseabsolute/DateTime-Locale/issues>.
  
  There is a mailing list available for users of this distribution,
  L<mailto:datetime@perl.org>.
  
  I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
  
  =head1 SOURCE
  
  The source code repository for DateTime-Locale can be found at L<https://github.com/houseabsolute/DateTime-Locale>.
  
  =head1 DONATIONS
  
  If you'd like to thank me for the work I've done on this module, please
  consider making a "donation" to me via PayPal. I spend a lot of free time
  creating free software, and would appreciate any support you'd care to offer.
  
  Please note that B<I am not suggesting that you must do this> in order for me
  to continue working on this particular software. I will continue to do so,
  inasmuch as I have in the past, for as long as it interests me.
  
  Similarly, a donation made in this way will probably not make me work on this
  software much more, unless I get so many donations that I can consider working
  on free software full time (let's all have a chuckle at that together).
  
  To donate, log into PayPal and send money to autarch@urth.org, or use the
  button at L<http://www.urth.org/~autarch/fs-donation.html>.
  
  =head1 AUTHOR
  
  Dave Rolsky <autarch@urth.org>
  
  =head1 CONTRIBUTORS
  
  =for stopwords Karen Etheridge Mohammad S Anwar Ryley Breiddal Sergey Leschenko yasu47b
  
  =over 4
  
  =item *
  
  Karen Etheridge <ether@cpan.org>
  
  =item *
  
  Mohammad S Anwar <mohammad.anwar@yahoo.com>
  
  =item *
  
  Ryley Breiddal <rbreiddal@presinet.com>
  
  =item *
  
  Sergey Leschenko <Sergey.Leschenko@portaone.com>
  
  =item *
  
  yasu47b <nakayamayasuhiro1986@gmail.com>
  
  =back
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2003 - 2019 by Dave Rolsky.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  The full text of the license can be found in the
  F<LICENSE> file included with this distribution.
  
  =cut
DATETIME_LOCALE

    $main::fatpacked{"DateTime/Locale/Base.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_LOCALE_BASE';
  package DateTime::Locale::Base;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '1.24';
  
  use Carp qw( carp );
  use DateTime::Locale;
  use List::Util 1.45 ();
  use Params::ValidationCompiler 0.13 qw( validation_for );
  use Specio::Declare;
  
  BEGIN {
      foreach my $field (
          qw( id en_complete_name native_complete_name
          en_language en_script en_territory en_variant
          native_language native_script native_territory native_variant
          )
      ) {
  
          # remove leading 'en_' for method name
          ( my $meth_name = $field ) =~ s/^en_//;
  
          # also remove 'complete_'
          $meth_name =~ s/complete_//;
  
          no strict 'refs';
          *{$meth_name} = sub { $_[0]->{$field} };
      }
  }
  
  sub new {
      my $class = shift;
  
      # By making the default format lengths part of the object's hash
      # key, it allows them to be settable.
      return bless {
          @_,
          default_date_format_length => 'long',
          default_time_format_length => 'long',
      }, $class;
  }
  
  sub language_id  { ( DateTime::Locale::_parse_id( $_[0]->id ) )[0] }
  sub script_id    { ( DateTime::Locale::_parse_id( $_[0]->id ) )[1] }
  sub territory_id { ( DateTime::Locale::_parse_id( $_[0]->id ) )[2] }
  sub variant_id   { ( DateTime::Locale::_parse_id( $_[0]->id ) )[3] }
  
  my @FormatLengths = qw( short medium long full );
  
  sub date_format_default {
      my $meth = 'date_format_' . $_[0]->default_date_format_length();
      $_[0]->$meth();
  }
  
  sub date_formats {
      return {
          map {
              my $meth = 'date_format_' . $_;
              $_ => $_[0]->$meth()
          } @FormatLengths
      };
  }
  
  sub time_format_default {
      my $meth = 'time_format_' . $_[0]->default_time_format_length();
      $_[0]->$meth();
  }
  
  sub time_formats {
      return {
          map {
              my $meth = 'time_format_' . $_;
              $_ => $_[0]->$meth()
          } @FormatLengths
      };
  }
  
  sub format_for {
      my $self = shift;
      my $for  = shift;
  
      my $meth = '_format_for_' . $for;
  
      return unless $self->can($meth);
  
      return $self->$meth();
  }
  
  sub available_formats {
      my $self = shift;
  
      # The various parens seem to be necessary to force uniq() to see
      # the caller's list context. Go figure.
      my @uniq
          = List::Util::uniq( map { keys %{ $_->_available_formats() || {} } }
              _self_and_super_path( ref $self ) );
  
      # Doing the sort in the same expression doesn't work under 5.6.x.
      return sort @uniq;
  }
  
  # Copied wholesale from Class::ISA, because said module warns as deprecated
  # with perl 5.11.0+, which is kind of annoying.
  sub _self_and_super_path {
  
      # Assumption: searching is depth-first.
      # Assumption: '' (empty string) can't be a class package name.
      # Note: 'UNIVERSAL' is not given any special treatment.
      return () unless @_;
  
      my @out = ();
  
      my @in_stack = ( $_[0] );
      my %seen     = ( $_[0] => 1 );
  
      my $current;
      while (@in_stack) {
          next unless defined( $current = shift @in_stack ) && length($current);
          push @out, $current;
          no strict 'refs';
          unshift @in_stack, map {
              my $c = $_;    # copy, to avoid being destructive
              substr( $c, 0, 2 ) = "main::" if substr( $c, 0, 2 ) eq '::';
  
              # Canonize the :: -> main::, ::foo -> main::foo thing.
              # Should I ever canonize the Foo'Bar = Foo::Bar thing?
              $seen{$c}++ ? () : $c;
          } @{"$current\::ISA"};
  
          # I.e., if this class has any parents (at least, ones I've never seen
          # before), push them, in order, onto the stack of classes I need to
          # explore.
      }
  
      return @out;
  }
  
  # Just needed for the above method.
  sub _available_formats { }
  
  sub default_date_format_length { $_[0]->{default_date_format_length} }
  
  my $length    = enum( values => [qw( full long medium short )] );
  my $validator = validation_for(
      name             => '_check_length_parameter',
      name_is_optional => 1,
      params           => [ { type => $length } ],
  );
  
  sub set_default_date_format_length {
      my $self = shift;
      my ($l) = $validator->(@_);
  
      $self->{default_date_format_length} = lc $l;
  }
  
  sub default_time_format_length { $_[0]->{default_time_format_length} }
  
  sub set_default_time_format_length {
      my $self = shift;
      my ($l) = $validator->(@_);
  
      $self->{default_time_format_length} = lc $l;
  }
  
  for my $length (qw( full long medium short )) {
      my $key = 'datetime_format_' . $length;
  
      my $sub = sub {
          my $self = shift;
  
          return $self->{$key} if exists $self->{$key};
  
          my $date_meth = 'date_format_' . $length;
          my $time_meth = 'time_format_' . $length;
  
          return $self->{$key}
              = $self->_make_datetime_format( $date_meth, $time_meth );
      };
  
      no strict 'refs';
      *{$key} = $sub;
  }
  
  sub datetime_format_default {
      my $self = shift;
  
      my $date_meth = 'date_format_' . $self->default_date_format_length();
      my $time_meth = 'time_format_' . $self->default_time_format_length();
  
      return $self->_make_datetime_format( $date_meth, $time_meth );
  }
  
  sub _make_datetime_format {
      my $self      = shift;
      my $date_meth = shift;
      my $time_meth = shift;
  
      my $dt_format = $self->datetime_format();
  
      my $time = $self->$time_meth();
      my $date = $self->$date_meth();
  
      $dt_format =~ s/\{0\}/$time/g;
      $dt_format =~ s/\{1\}/$date/g;
  
      return $dt_format;
  }
  
  sub prefers_24_hour_time {
      my $self = shift;
  
      return $self->{prefers_24_hour_time}
          if exists $self->{prefers_24_hour_time};
  
      $self->{prefers_24_hour_time}
          = $self->time_format_short() =~ /h|K/ ? 0 : 1;
  }
  
  # Backwards compat for DateTime.pm version <= 0.42
  {
      my %subs = (
          month_name => sub { $_[0]->month_format_wide()->[ $_[1]->month_0 ] },
  
          month_abbreviation => sub {
              $_[0]->month_format_abbreviated()->[ $_[1]->month_0 ];
          },
          month_narrow =>
              sub { $_[0]->month_format_narrow()->[ $_[1]->month_0 ]; },
  
          month_names         => sub { $_[0]->month_format_wide() },
          month_abbreviations => sub { $_[0]->month_format_abbreviated() },
          month_narrows       => sub { $_[0]->month_format_narrow() },
  
          day_name =>
              sub { $_[0]->day_format_wide()->[ $_[1]->day_of_week_0 ] },
  
          day_abbreviation => sub {
              $_[0]->day_format_abbreviated()->[ $_[1]->day_of_week_0 ];
          },
          day_narrow =>
              sub { $_[0]->day_format_narrow()->[ $_[1]->day_of_week_0 ]; },
  
          day_names         => sub { $_[0]->day_format_wide() },
          day_abbreviations => sub { $_[0]->day_format_abbreviated() },
          day_narrows       => sub { $_[0]->day_format_narrow() },
  
          quarter_name =>
              sub { $_[0]->quarter_format_wide()->[ $_[1]->quarter - 1 ] },
  
          quarter_abbreviation => sub {
              $_[0]->quarter_format_abbreviated()->[ $_[1]->quarter - 1 ];
          },
          quarter_narrow =>
              sub { $_[0]->quarter_format_narrow()->[ $_[1]->quarter - 1 ] },
  
          quarter_names         => sub { $_[0]->quarter_format_wide() },
          quarter_abbreviations => sub { $_[0]->quarter_format_abbreviated() },
  
          am_pm =>
              sub { $_[0]->am_pm_abbreviated()->[ $_[1]->hour < 12 ? 0 : 1 ] },
          am_pms => sub { $_[0]->am_pm_abbreviated() },
  
          era_name => sub { $_[0]->era_wide()->[ $_[1]->ce_year < 0 ? 0 : 1 ] },
  
          era_abbreviation => sub {
              $_[0]->era_abbreviated()->[ $_[1]->ce_year < 0 ? 0 : 1 ];
          },
          era_narrow =>
              sub { $_[0]->era_narrow()->[ $_[1]->ce_year < 0 ? 0 : 1 ] },
  
          era_names         => sub { $_[0]->era_wide() },
          era_abbreviations => sub { $_[0]->era_abbreviated() },
  
          # ancient backwards compat
          era  => sub { $_[0]->era_abbreviation },
          eras => sub { $_[0]->era_abbreviations },
  
          date_before_time => sub {
              my $self = shift;
  
              my $dt_format = $self->datetime_format();
  
              return $dt_format =~ /\{1\}.*\{0\}/ ? 1 : 0;
          },
  
          date_parts_order => sub {
              my $self = shift;
  
              my $short = $self->date_format_short();
  
              $short =~ tr{dmyDMY}{}cd;
              $short =~ tr{dmyDMY}{dmydmy}s;
  
              return $short;
          },
  
          full_date_format => sub {
              $_[0]->_convert_to_strftime( $_[0]->date_format_full() );
          },
  
          long_date_format => sub {
              $_[0]->_convert_to_strftime( $_[0]->date_format_long() );
          },
  
          medium_date_format => sub {
              $_[0]->_convert_to_strftime( $_[0]->date_format_medium() );
          },
  
          short_date_format => sub {
              $_[0]->_convert_to_strftime( $_[0]->date_format_short() );
          },
  
          default_date_format => sub {
              $_[0]->_convert_to_strftime( $_[0]->date_format_default() );
          },
  
          full_time_format => sub {
              $_[0]->_convert_to_strftime( $_[0]->time_format_full() );
          },
  
          long_time_format => sub {
              $_[0]->_convert_to_strftime( $_[0]->time_format_long() );
          },
  
          medium_time_format => sub {
              $_[0]->_convert_to_strftime( $_[0]->time_format_medium() );
          },
  
          short_time_format => sub {
              $_[0]->_convert_to_strftime( $_[0]->time_format_short() );
          },
  
          default_time_format => sub {
              $_[0]->_convert_to_strftime( $_[0]->time_format_default() );
          },
  
          full_datetime_format => sub {
              $_[0]->_convert_to_strftime( $_[0]->datetime_format_full() );
          },
  
          long_datetime_format => sub {
              $_[0]->_convert_to_strftime( $_[0]->datetime_format_long() );
          },
  
          medium_datetime_format => sub {
              $_[0]->_convert_to_strftime( $_[0]->datetime_format_medium() );
          },
  
          short_datetime_format => sub {
              $_[0]->_convert_to_strftime( $_[0]->datetime_format_short() );
          },
  
          default_datetime_format => sub {
              $_[0]->_convert_to_strftime( $_[0]->datetime_format_default() );
          },
      );
  
      for my $name ( keys %subs ) {
          my $real_sub = $subs{$name};
  
          my $sub = sub {
              carp
                  "The $name method in DateTime::Locale::Base has been deprecated. Please see the DateTime::Locale distribution's Changes file for details";
              return shift->$real_sub(@_);
          };
  
          no strict 'refs';
          *{$name} = $sub;
      }
  }
  
  # Older versions of DateTime.pm will not pass in the $cldr_ok flag, so
  # we will give them the converted-to-strftime pattern (bugs and all).
  sub _convert_to_strftime {
      my $self    = shift;
      my $pattern = shift;
      my $cldr_ok = shift;
  
      return $pattern if $cldr_ok;
  
      return $self->{_converted_patterns}{$pattern}
          if exists $self->{_converted_patterns}{$pattern};
  
      return $self->{_converted_patterns}{$pattern}
          = $self->_cldr_to_strftime($pattern);
  }
  
  {
      my @JavaPatterns = (
          qr/G/    => '{era}',
          qr/yyyy/ => '{ce_year}',
          qr/y/    => 'y',
          qr/u/    => 'Y',
          qr/MMMM/ => 'B',
          qr/MMM/  => 'b',
          qr/MM/   => 'm',
          qr/M/    => '{month}',
          qr/dd/   => 'd',
          qr/d/    => '{day}',
          qr/hh/   => 'l',
          qr/h/    => '{hour_12}',
          qr/HH/   => 'H',
          qr/H/    => '{hour}',
          qr/mm/   => 'M',
          qr/m/    => '{minute}',
          qr/ss/   => 'S',
          qr/s/    => '{second}',
          qr/S/    => 'N',
          qr/EEEE/ => 'A',
          qr/E/    => 'a',
          qr/D/    => 'j',
          qr/F/    => '{weekday_of_month}',
          qr/w/    => 'V',
          qr/W/    => '{week_month}',
          qr/a/    => 'p',
          qr/k/    => '{hour_1}',
          qr/K/    => '{hour_12_0}',
          qr/z/    => '{time_zone_long_name}',
      );
  
      sub _cldr_to_strftime {
          shift;
          my $simple = shift;
  
          $simple
              =~ s/(G+|y+|u+|M+|d+|h+|H+|m+|s+|S+|E+|D+|F+|w+|W+|a+|k+|K+|z+)|'((?:[^']|'')*)'/
                  $2 ? _stringify($2) : $1 ? _convert($1) : "'"/eg;
  
          return $simple;
      }
  
      sub _convert {
          my $simple = shift;
  
          for ( my $x = 0; $x < @JavaPatterns; $x += 2 ) {
              return '%' . $JavaPatterns[ $x + 1 ]
                  if $simple =~ /$JavaPatterns[$x]/;
          }
  
          die "**Dont know $simple***";
      }
  
      sub _stringify {
          my $string = shift;
  
          $string =~ s/%(?:[^%])/%%/g;
          $string =~ s/\'\'/\'/g;
  
          return $string;
      }
  }
  
  # end backwards compat
  
  sub STORABLE_freeze {
      my $self    = shift;
      my $cloning = shift;
  
      return if $cloning;
  
      return $self->id();
  }
  
  sub STORABLE_thaw {
      my $self = shift;
      shift;
      my $serialized = shift;
  
      my $obj = DateTime::Locale->load($serialized);
  
      %$self = %$obj;
  
      return $self;
  }
  
  1;
  
  # ABSTRACT: Base class for individual locale objects
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  DateTime::Locale::Base - Base class for individual locale objects
  
  =head1 VERSION
  
  version 1.24
  
  =head1 SYNOPSIS
  
    use base 'DateTime::Locale::Base';
  
  =head1 DESCRIPTION
  
  B<This module is no longer used by the code in the distribution.> It is still
  included for the sake of any code out in the wild that may subclass this
  class. This class will be removed in a future release.
  
  =head1 DEFAULT FORMATS
  
  Each locale has a set of four default date and time formats.  They are
  distinguished by length, and are called "full", "long", "medium", and
  "short". Each locale may have a different default length which it uses
  when its C<< $locale->date_format_default() >>, C<<
  $locale->time_format_default() >>, or C<<
  $locale->datetime_format_default() >> methods are called.
  
  This can be changed by calling the C<<
  $locale->set_default_date_format() >> or C<<
  $locale->set_default_time_format() >> methods.  These methods accept a
  string which must be one of "full", "long", "medium", or "short".
  
  =head1 NAME FORMS
  
  Most names come in a number of variations. First, they may vary based
  on length, with wide, abbreviated, and narrow forms. The wide form is
  typically the full name, while the narrow form is often a single
  character. The narrow forms may not be unique. For example, "T" may be
  used for Tuesday and Thursday in the English narrow forms.
  
  Many names also distinguish between "format" and "stand-alone" forms
  of a pattern. The format pattern is used when the thing in question is
  being placed into a larger string. The stand-alone form is used when
  displaying that item by itself, for example in a calendar.
  
  =head1 METHODS
  
  All locales provide the following methods:
  
  =over 4
  
  =item * $locale->id()
  
  The locale's id.
  
  =item * $locale->language_id()
  
  The language portion of the id.
  
  =item * $locale->script_id()
  
  The script portion of the id, if any.
  
  =item * $locale->territory_id()
  
  The territory portion of the id, if any.
  
  =item * $locale->variant_id()
  
  The variant portion of the id, if any.
  
  =item * $locale->name()
  
  The full name for the locale in English.
  
  =item * $locale->language()
  
  The language name for the locale in English.
  
  =item * $locale->script()
  
  The script name for the locale in English, if any.
  
  =item * $locale->territory()
  
  The territory name for the locale in English, if any.
  
  =item * $locale->variant()
  
  The variant name for the locale in English, if any.
  
  =item * $locale->native_name()
  
  The full name for the locale in its native language, if any.
  
  =item * $locale->native_language()
  
  The language name for the locale in its native language, if any.
  
  =item * $locale->native_script()
  
  The script name for the locale in its native language, if any.
  
  =item * $locale->native_territory()
  
  The territory name for the locale in its native language, if any.
  
  =item * $locale->native_variant()
  
  The variant name for the locale in its native language, if any.
  
  =item * $locale->month_format_wide()
  
  Returns an array reference containing the wide format names of the
  months, with January as the first month.
  
  =item * $locale->month_format_abbreviated()
  
  Returns an array reference containing the abbreviated format names of
  the months, with January as the first month.
  
  =item * $locale->month_format_narrow()
  
  Returns an array reference containing the narrow format names of the
  months, with January as the first month.
  
  =item * $locale->month_stand_alone_wide()
  
  Returns an array reference containing the wide stand-alone names of
  the months, with January as the first month.
  
  =item * $locale->month_stand_alone_abbreviated()
  
  Returns an array reference containing the abbreviated stand-alone
  names of the months, with January as the first month.
  
  =item * $locale->month_stand_alone_narrow()
  
  Returns an array reference containing the narrow stand-alone names of the
  months, with January as the first month.
  
  =item * $locale->day_format_wide()
  
  Returns an array reference containing the wide format names of the
  days, with Monday as the first day.
  
  =item * $locale->day_format_abbreviated()
  
  Returns an array reference containing the abbreviated format names of
  the days, with Monday as the first day.
  
  =item * $locale->day_format_narrow()
  
  Returns an array reference containing the narrow format names of the
  days, with Monday as the first day.
  
  =item * $locale->day_stand_alone_wide()
  
  Returns an array reference containing the wide stand-alone names of
  the days, with Monday as the first day.
  
  =item * $locale->day_stand_alone_abbreviated()
  
  Returns an array reference containing the abbreviated stand-alone
  names of the days, with Monday as the first day.
  
  =item * $locale->day_stand_alone_narrow()
  
  Returns an array reference containing the narrow stand-alone names of
  the days, with Monday as the first day.
  
  =item * $locale->quarter_format_wide()
  
  Returns an array reference containing the wide format names of the
  quarters.
  
  =item * $locale->quarter_format_abbreviated()
  
  Returns an array reference containing the abbreviated format names of
  the quarters.
  
  =item * $locale->quarter_format_narrow()
  
  Returns an array reference containing the narrow format names of the
  quarters.
  
  =item * $locale->quarter_stand_alone_wide()
  
  Returns an array reference containing the wide stand-alone names of
  the quarters.
  
  =item * $locale->quarter_stand_alone_abbreviated()
  
  Returns an array reference containing the abbreviated stand-alone
  names of the quarters.
  
  =item * $locale->quarter_stand_alone_narrow()
  
  Returns an array reference containing the narrow stand-alone names of the
  quarters.
  
  =item * $locale->era_wide()
  
  Returns an array reference containing the wide names of the eras, with
  "BCE" first.
  
  =item * $locale->era_abbreviated()
  
  Returns an array reference containing the abbreviated names of the
  eras, with "BCE" first.
  
  =item * $locale->era_narrow()
  
  Returns an array reference containing the abbreviated names of the
  eras, with "BCE" first. However, most locales do not differ between
  the narrow and abbreviated length of the era.
  
  =item * $locale->am_pm_abbreviated()
  
  Returns an array reference containing the abbreviated names of "AM"
  and "PM".
  
  =item * $locale->date_format_long()
  
  =item * $locale->date_format_full()
  
  =item * $locale->date_format_medium()
  
  =item * $locale->date_format_short()
  
  Returns the CLDR date pattern of the appropriate length.
  
  =item * $locale->date_formats()
  
  Returns a hash reference of CLDR date patterns for the date formats,
  where the keys are "full", "long", "medium", and "short".
  
  =item * $locale->time_format_long()
  
  =item * $locale->time_format_full()
  
  =item * $locale->time_format_medium()
  
  =item * $locale->time_format_short()
  
  Returns the CLDR date pattern of the appropriate length.
  
  =item * $locale->time_formats()
  
  Returns a hash reference of CLDR date patterns for the time formats,
  where the keys are "full", "long", "medium", and "short".
  
  =item * $locale->datetime_format_long()
  
  =item * $locale->datetime_format_full()
  
  =item * $locale->datetime_format_medium()
  
  =item * $locale->datetime_format_short()
  
  Returns the CLDR date pattern of the appropriate length.
  
  =item * $locale->datetime_formats()
  
  Returns a hash reference of CLDR date patterns for the datetime
  formats, where the keys are "full", "long", "medium", and "short".
  
  =item * $locale->date_format_default()
  
  =item * $locale->time_format_default()
  
  =item * $locale->datetime_format_default()
  
  Returns the default CLDR date pattern. The length of this format is
  based on the value of C<< $locale->default_date_format_length() >>
  and/or C<< $locale->default_time_format_length() >>.
  
  =item * $locale->default_date_format_length()
  
  =item * $locale->default_time_format_length()
  
  Returns the default length for the format, one of "full", "long",
  "medium", or "short".
  
  =item * $locale->set_default_date_format_length()
  
  =item * $locale->set_default_time_format_length()
  
  Sets the default length for the format. This must be one of "full",
  "long", "medium", or "short".
  
  =item * $locale->prefers_24_hour_time()
  
  Returns a boolean indicating the preferred hour format for this
  locale.
  
  =item * $locale->first_day_of_week()
  
  Returns a number from 1 to 7 indicating the I<local> first day of the week,
  with Monday being 1 and Sunday being 7. For example, for a US locale this
  returns 7.
  
  =item * $locale->available_formats()
  
  A list of format names, like "MMdd" or "yyyyMM". This should be the
  list directly supported by the subclass, not its parents.
  
  =item * $locale->format_for($key)
  
  Given a valid name, returns the CLDR date pattern for that thing, if
  one exists.
  
  =back
  
  =head1 SUPPORT
  
  See L<DateTime::Locale>.
  
  Bugs may be submitted at L<https://github.com/houseabsolute/DateTime-Locale/issues>.
  
  There is a mailing list available for users of this distribution,
  L<mailto:datetime@perl.org>.
  
  I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
  
  =head1 SOURCE
  
  The source code repository for DateTime-Locale can be found at L<https://github.com/houseabsolute/DateTime-Locale>.
  
  =head1 AUTHOR
  
  Dave Rolsky <autarch@urth.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2003 - 2019 by Dave Rolsky.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  The full text of the license can be found in the
  F<LICENSE> file included with this distribution.
  
  =cut
DATETIME_LOCALE_BASE

    $main::fatpacked{"DateTime/Locale/Catalog.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_LOCALE_CATALOG';
  package DateTime::Locale::Catalog;
  
  use strict;
  use warnings;
  
  our $VERSION = '1.24';
  
  1;
  
  # ABSTRACT: Provides a catalog of all valid locale names
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  DateTime::Locale::Catalog - Provides a catalog of all valid locale names
  
  =head1 VERSION
  
  version 1.24
  
  =head1 DESCRIPTION
  
  This module contains a list of all known locales.
  
  =head1 LOCALES
  
  Any method taking locale code or name arguments should use one of the values
  listed below. Codes and names are case sensitive. The code starts with the
  ISO639-1 language code, and may also include information identifying any or
  all of territory, script, or variant.
  
  Always select the closest matching locale - for example, French Canadians
  would choose C<fr-CA> over fr - and B<always> use locale codes in preference
  to names; locale codes offer greater compatibility when using localized third
  party modules.
  
  The available locales are:
  
  =begin :locales
  
  
  
  =end :locales
  
   Locale code      Locale name (in English)                    Native locale name
   ==========================================================================================================
   af               Afrikaans                                   Afrikaans
   af-NA            Afrikaans Namibia                           Afrikaans Namibië
   af-ZA            Afrikaans South Africa                      Afrikaans Suid-Afrika
   agq              Aghem                                       Aghem
   agq-CM           Aghem Cameroon                              Aghem Kàmàlûŋ
   ak               Akan                                        Akan
   ak-GH            Akan Ghana                                  Akan Gaana
   am               Amharic                                     አማርኛ
   am-ET            Amharic Ethiopia                            አማርኛ ኢትዮጵያ
   ar               Arabic                                      العربية
   ar-001           Arabic World                                العربية العالم
   ar-AE            Arabic United Arab Emirates                 العربية الإمارات العربية المتحدة
   ar-BH            Arabic Bahrain                              العربية البحرين
   ar-DJ            Arabic Djibouti                             العربية جيبوتي
   ar-DZ            Arabic Algeria                              العربية الجزائر
   ar-EG            Arabic Egypt                                العربية مصر
   ar-EH            Arabic Western Sahara                       العربية الصحراء الغربية
   ar-ER            Arabic Eritrea                              العربية إريتريا
   ar-IL            Arabic Israel                               العربية إسرائيل
   ar-IQ            Arabic Iraq                                 العربية العراق
   ar-JO            Arabic Jordan                               العربية الأردن
   ar-KM            Arabic Comoros                              العربية جزر القمر
   ar-KW            Arabic Kuwait                               العربية الكويت
   ar-LB            Arabic Lebanon                              العربية لبنان
   ar-LY            Arabic Libya                                العربية ليبيا
   ar-MA            Arabic Morocco                              العربية المغرب
   ar-MR            Arabic Mauritania                           العربية موريتانيا
   ar-OM            Arabic Oman                                 العربية عُمان
   ar-PS            Arabic Palestinian Territories              العربية الأراضي الفلسطينية
   ar-QA            Arabic Qatar                                العربية قطر
   ar-SA            Arabic Saudi Arabia                         العربية المملكة العربية السعودية
   ar-SD            Arabic Sudan                                العربية السودان
   ar-SO            Arabic Somalia                              العربية الصومال
   ar-SS            Arabic South Sudan                          العربية جنوب السودان
   ar-SY            Arabic Syria                                العربية سوريا
   ar-TD            Arabic Chad                                 العربية تشاد
   ar-TN            Arabic Tunisia                              العربية تونس
   ar-YE            Arabic Yemen                                العربية اليمن
   as               Assamese                                    অসমীয়া
   as-IN            Assamese India                              অসমীয়া ভাৰত
   asa              Asu                                         Kipare
   asa-TZ           Asu Tanzania                                Kipare Tadhania
   ast              Asturian                                    asturianu
   ast-ES           Asturian Spain                              asturianu España
   az               Azerbaijani                                 azərbaycan
   az-Cyrl          Azerbaijani Cyrillic                        азәрбајҹан Кирил
   az-Cyrl-AZ       Azerbaijani Azerbaijan Cyrillic             азәрбајҹан Азәрбајҹан Кирил
   az-Latn          Azerbaijani Latin                           azərbaycan latın
   az-Latn-AZ       Azerbaijani Azerbaijan Latin                azərbaycan Azərbaycan latın
   bas              Basaa                                       Ɓàsàa
   bas-CM           Basaa Cameroon                              Ɓàsàa Kàmɛ̀rûn
   be               Belarusian                                  беларуская
   be-BY            Belarusian Belarus                          беларуская Беларусь
   bem              Bemba                                       Ichibemba
   bem-ZM           Bemba Zambia                                Ichibemba Zambia
   bez              Bena                                        Hibena
   bez-TZ           Bena Tanzania                               Hibena Hutanzania
   bg               Bulgarian                                   български
   bg-BG            Bulgarian Bulgaria                          български България
   bm               Bambara                                     bamanakan
   bm-ML            Bambara Mali                                bamanakan Mali
   bn               Bangla                                      বাংলা
   bn-BD            Bangla Bangladesh                           বাংলা বাংলাদেশ
   bn-IN            Bangla India                                বাংলা ভারত
   bo               Tibetan                                     བོད་སྐད་
   bo-CN            Tibetan China                               བོད་སྐད་ རྒྱ་ནག
   bo-IN            Tibetan India                               བོད་སྐད་ རྒྱ་གར་
   br               Breton                                      brezhoneg
   br-FR            Breton France                               brezhoneg Frañs
   brx              Bodo                                        बड़ो
   brx-IN           Bodo India                                  बड़ो भारत
   bs               Bosnian                                     bosanski
   bs-Cyrl          Bosnian Cyrillic                            босански ћирилица
   bs-Cyrl-BA       Bosnian Bosnia & Herzegovina Cyrillic       босански Босна и Херцеговина ћирилица
   bs-Latn          Bosnian Latin                               bosanski latinica
   bs-Latn-BA       Bosnian Bosnia & Herzegovina Latin          bosanski Bosna i Hercegovina latinica
   ca               Catalan                                     català
   ca-AD            Catalan Andorra                             català Andorra
   ca-ES            Catalan Spain                               català Espanya
   ca-ES-VALENCIA   Catalan Spain Valencian                     català Espanya valencià
   ca-FR            Catalan France                              català França
   ca-IT            Catalan Italy                               català Itàlia
   ccp              Chakma                                      𑄌𑄋𑄴𑄟𑄳𑄦
   ccp-BD           Chakma Bangladesh                           𑄌𑄋𑄴𑄟𑄳𑄦 𑄝𑄁𑄣𑄘𑄬𑄌𑄴
   ccp-IN           Chakma India                                𑄌𑄋𑄴𑄟𑄳𑄦 𑄞𑄢𑄧𑄖𑄴
   ce               Chechen                                     нохчийн
   ce-RU            Chechen Russia                              нохчийн Росси
   ceb              Cebuano                                     Cebuano
   ceb-PH           Cebuano Philippines                         Cebuano Pilipinas
   cgg              Chiga                                       Rukiga
   cgg-UG           Chiga Uganda                                Rukiga Uganda
   chr              Cherokee                                    ᏣᎳᎩ
   chr-US           Cherokee United States                      ᏣᎳᎩ ᏌᏊ ᎢᏳᎾᎵᏍᏔᏅ ᏍᎦᏚᎩ
   ckb              Central Kurdish                             کوردیی ناوەندی
   ckb-IQ           Central Kurdish Iraq                        کوردیی ناوەندی عێراق
   ckb-IR           Central Kurdish Iran                        کوردیی ناوەندی ئێران
   cs               Czech                                       čeština
   cs-CZ            Czech Czechia                               čeština Česko
   cu               Church Slavic                               cu
   cu-RU            Church Slavic Russia                        cu RU
   cy               Welsh                                       Cymraeg
   cy-GB            Welsh United Kingdom                        Cymraeg Y Deyrnas Unedig
   da               Danish                                      dansk
   da-DK            Danish Denmark                              dansk Danmark
   da-GL            Danish Greenland                            dansk Grønland
   dav              Taita                                       Kitaita
   dav-KE           Taita Kenya                                 Kitaita Kenya
   de               German                                      Deutsch
   de-AT            German Austria                              Deutsch Österreich
   de-BE            German Belgium                              Deutsch Belgien
   de-CH            German Switzerland                          Deutsch Schweiz
   de-DE            German Germany                              Deutsch Deutschland
   de-IT            German Italy                                Deutsch Italien
   de-LI            German Liechtenstein                        Deutsch Liechtenstein
   de-LU            German Luxembourg                           Deutsch Luxemburg
   dje              Zarma                                       Zarmaciine
   dje-NE           Zarma Niger                                 Zarmaciine Nižer
   dsb              Lower Sorbian                               dolnoserbšćina
   dsb-DE           Lower Sorbian Germany                       dolnoserbšćina Nimska
   dua              Duala                                       duálá
   dua-CM           Duala Cameroon                              duálá Cameroun
   dyo              Jola-Fonyi                                  joola
   dyo-SN           Jola-Fonyi Senegal                          joola Senegal
   dz               Dzongkha                                    རྫོང་ཁ
   dz-BT            Dzongkha Bhutan                             རྫོང་ཁ འབྲུག
   ebu              Embu                                        Kĩembu
   ebu-KE           Embu Kenya                                  Kĩembu Kenya
   ee               Ewe                                         Eʋegbe
   ee-GH            Ewe Ghana                                   Eʋegbe Ghana nutome
   ee-TG            Ewe Togo                                    Eʋegbe Togo nutome
   el               Greek                                       Ελληνικά
   el-CY            Greek Cyprus                                Ελληνικά Κύπρος
   el-GR            Greek Greece                                Ελληνικά Ελλάδα
   en               English                                     English
   en-001           English World                               English World
   en-150           English Europe                              English Europe
   en-AE            English United Arab Emirates                English United Arab Emirates
   en-AG            English Antigua & Barbuda                   English Antigua & Barbuda
   en-AI            English Anguilla                            English Anguilla
   en-AS            English American Samoa                      English American Samoa
   en-AT            English Austria                             English Austria
   en-AU            English Australia                           English Australia
   en-BB            English Barbados                            English Barbados
   en-BE            English Belgium                             English Belgium
   en-BI            English Burundi                             English Burundi
   en-BM            English Bermuda                             English Bermuda
   en-BS            English Bahamas                             English Bahamas
   en-BW            English Botswana                            English Botswana
   en-BZ            English Belize                              English Belize
   en-CA            English Canada                              English Canada
   en-CC            English Cocos (Keeling) Islands             English Cocos (Keeling) Islands
   en-CH            English Switzerland                         English Switzerland
   en-CK            English Cook Islands                        English Cook Islands
   en-CM            English Cameroon                            English Cameroon
   en-CX            English Christmas Island                    English Christmas Island
   en-CY            English Cyprus                              English Cyprus
   en-DE            English Germany                             English Germany
   en-DG            English Diego Garcia                        English Diego Garcia
   en-DK            English Denmark                             English Denmark
   en-DM            English Dominica                            English Dominica
   en-ER            English Eritrea                             English Eritrea
   en-FI            English Finland                             English Finland
   en-FJ            English Fiji                                English Fiji
   en-FK            English Falkland Islands                    English Falkland Islands
   en-FM            English Micronesia                          English Micronesia
   en-GB            English United Kingdom                      English United Kingdom
   en-GD            English Grenada                             English Grenada
   en-GG            English Guernsey                            English Guernsey
   en-GH            English Ghana                               English Ghana
   en-GI            English Gibraltar                           English Gibraltar
   en-GM            English Gambia                              English Gambia
   en-GU            English Guam                                English Guam
   en-GY            English Guyana                              English Guyana
   en-HK            English Hong Kong SAR China                 English Hong Kong SAR China
   en-IE            English Ireland                             English Ireland
   en-IL            English Israel                              English Israel
   en-IM            English Isle of Man                         English Isle of Man
   en-IN            English India                               English India
   en-IO            English British Indian Ocean Territory      English British Indian Ocean Territory
   en-JE            English Jersey                              English Jersey
   en-JM            English Jamaica                             English Jamaica
   en-KE            English Kenya                               English Kenya
   en-KI            English Kiribati                            English Kiribati
   en-KN            English St. Kitts & Nevis                   English St. Kitts & Nevis
   en-KY            English Cayman Islands                      English Cayman Islands
   en-LC            English St. Lucia                           English St. Lucia
   en-LR            English Liberia                             English Liberia
   en-LS            English Lesotho                             English Lesotho
   en-MG            English Madagascar                          English Madagascar
   en-MH            English Marshall Islands                    English Marshall Islands
   en-MO            English Macao SAR China                     English Macao SAR China
   en-MP            English Northern Mariana Islands            English Northern Mariana Islands
   en-MS            English Montserrat                          English Montserrat
   en-MT            English Malta                               English Malta
   en-MU            English Mauritius                           English Mauritius
   en-MW            English Malawi                              English Malawi
   en-MY            English Malaysia                            English Malaysia
   en-NA            English Namibia                             English Namibia
   en-NF            English Norfolk Island                      English Norfolk Island
   en-NG            English Nigeria                             English Nigeria
   en-NL            English Netherlands                         English Netherlands
   en-NR            English Nauru                               English Nauru
   en-NU            English Niue                                English Niue
   en-NZ            English New Zealand                         English New Zealand
   en-PG            English Papua New Guinea                    English Papua New Guinea
   en-PH            English Philippines                         English Philippines
   en-PK            English Pakistan                            English Pakistan
   en-PN            English Pitcairn Islands                    English Pitcairn Islands
   en-PR            English Puerto Rico                         English Puerto Rico
   en-PW            English Palau                               English Palau
   en-RW            English Rwanda                              English Rwanda
   en-SB            English Solomon Islands                     English Solomon Islands
   en-SC            English Seychelles                          English Seychelles
   en-SD            English Sudan                               English Sudan
   en-SE            English Sweden                              English Sweden
   en-SG            English Singapore                           English Singapore
   en-SH            English St. Helena                          English St. Helena
   en-SI            English Slovenia                            English Slovenia
   en-SL            English Sierra Leone                        English Sierra Leone
   en-SS            English South Sudan                         English South Sudan
   en-SX            English Sint Maarten                        English Sint Maarten
   en-SZ            English Eswatini                            English Eswatini
   en-TC            English Turks & Caicos Islands              English Turks & Caicos Islands
   en-TK            English Tokelau                             English Tokelau
   en-TO            English Tonga                               English Tonga
   en-TT            English Trinidad & Tobago                   English Trinidad & Tobago
   en-TV            English Tuvalu                              English Tuvalu
   en-TZ            English Tanzania                            English Tanzania
   en-UG            English Uganda                              English Uganda
   en-UM            English U.S. Outlying Islands               English U.S. Outlying Islands
   en-US            English United States                       English United States
   en-US-POSIX      English United States Computer              English United States Computer
   en-VC            English St. Vincent & Grenadines            English St. Vincent & Grenadines
   en-VG            English British Virgin Islands              English British Virgin Islands
   en-VI            English U.S. Virgin Islands                 English U.S. Virgin Islands
   en-VU            English Vanuatu                             English Vanuatu
   en-WS            English Samoa                               English Samoa
   en-ZA            English South Africa                        English South Africa
   en-ZM            English Zambia                              English Zambia
   en-ZW            English Zimbabwe                            English Zimbabwe
   eo               Esperanto                                   esperanto
   eo-001           Esperanto World                             esperanto Mondo
   es               Spanish                                     español
   es-419           Spanish Latin America                       español Latinoamérica
   es-AR            Spanish Argentina                           español Argentina
   es-BO            Spanish Bolivia                             español Bolivia
   es-BR            Spanish Brazil                              español Brasil
   es-BZ            Spanish Belize                              español Belice
   es-CL            Spanish Chile                               español Chile
   es-CO            Spanish Colombia                            español Colombia
   es-CR            Spanish Costa Rica                          español Costa Rica
   es-CU            Spanish Cuba                                español Cuba
   es-DO            Spanish Dominican Republic                  español República Dominicana
   es-EA            Spanish Ceuta & Melilla                     español Ceuta y Melilla
   es-EC            Spanish Ecuador                             español Ecuador
   es-ES            Spanish Spain                               español España
   es-GQ            Spanish Equatorial Guinea                   español Guinea Ecuatorial
   es-GT            Spanish Guatemala                           español Guatemala
   es-HN            Spanish Honduras                            español Honduras
   es-IC            Spanish Canary Islands                      español Canarias
   es-MX            Spanish Mexico                              español México
   es-NI            Spanish Nicaragua                           español Nicaragua
   es-PA            Spanish Panama                              español Panamá
   es-PE            Spanish Peru                                español Perú
   es-PH            Spanish Philippines                         español Filipinas
   es-PR            Spanish Puerto Rico                         español Puerto Rico
   es-PY            Spanish Paraguay                            español Paraguay
   es-SV            Spanish El Salvador                         español El Salvador
   es-US            Spanish United States                       español Estados Unidos
   es-UY            Spanish Uruguay                             español Uruguay
   es-VE            Spanish Venezuela                           español Venezuela
   et               Estonian                                    eesti
   et-EE            Estonian Estonia                            eesti Eesti
   eu               Basque                                      euskara
   eu-ES            Basque Spain                                euskara Espainia
   ewo              Ewondo                                      ewondo
   ewo-CM           Ewondo Cameroon                             ewondo Kamərún
   fa               Persian                                     فارسی
   fa-AF            Persian Afghanistan                         فارسی افغانستان
   fa-IR            Persian Iran                                فارسی ایران
   ff               Fulah                                       Pulaar
   ff-Latn          Fulah Latin                                 Pulaar Latn
   ff-Latn-BF       Fulah Burkina Faso Latin                    Pulaar Burkibaa Faaso Latn
   ff-Latn-CM       Fulah Cameroon Latin                        Pulaar Kameruun Latn
   ff-Latn-GH       Fulah Ghana Latin                           Pulaar Ganaa Latn
   ff-Latn-GM       Fulah Gambia Latin                          Pulaar Gammbi Latn
   ff-Latn-GN       Fulah Guinea Latin                          Pulaar Gine Latn
   ff-Latn-GW       Fulah Guinea-Bissau Latin                   Pulaar Gine-Bisaawo Latn
   ff-Latn-LR       Fulah Liberia Latin                         Pulaar Liberiyaa Latn
   ff-Latn-MR       Fulah Mauritania Latin                      Pulaar Muritani Latn
   ff-Latn-NE       Fulah Niger Latin                           Pulaar Nijeer Latn
   ff-Latn-NG       Fulah Nigeria Latin                         Pulaar Nijeriyaa Latn
   ff-Latn-SL       Fulah Sierra Leone Latin                    Pulaar Seraa liyon Latn
   ff-Latn-SN       Fulah Senegal Latin                         Pulaar Senegaal Latn
   fi               Finnish                                     suomi
   fi-FI            Finnish Finland                             suomi Suomi
   fil              Filipino                                    Filipino
   fil-PH           Filipino Philippines                        Filipino Pilipinas
   fo               Faroese                                     føroyskt
   fo-DK            Faroese Denmark                             føroyskt Danmark
   fo-FO            Faroese Faroe Islands                       føroyskt Føroyar
   fr               French                                      français
   fr-BE            French Belgium                              français Belgique
   fr-BF            French Burkina Faso                         français Burkina Faso
   fr-BI            French Burundi                              français Burundi
   fr-BJ            French Benin                                français Bénin
   fr-BL            French St. Barthélemy                       français Saint-Barthélemy
   fr-CA            French Canada                               français Canada
   fr-CD            French Congo - Kinshasa                     français Congo-Kinshasa
   fr-CF            French Central African Republic             français République centrafricaine
   fr-CG            French Congo - Brazzaville                  français Congo-Brazzaville
   fr-CH            French Switzerland                          français Suisse
   fr-CI            French Côte d’Ivoire                        français Côte d’Ivoire
   fr-CM            French Cameroon                             français Cameroun
   fr-DJ            French Djibouti                             français Djibouti
   fr-DZ            French Algeria                              français Algérie
   fr-FR            French France                               français France
   fr-GA            French Gabon                                français Gabon
   fr-GF            French French Guiana                        français Guyane française
   fr-GN            French Guinea                               français Guinée
   fr-GP            French Guadeloupe                           français Guadeloupe
   fr-GQ            French Equatorial Guinea                    français Guinée équatoriale
   fr-HT            French Haiti                                français Haïti
   fr-KM            French Comoros                              français Comores
   fr-LU            French Luxembourg                           français Luxembourg
   fr-MA            French Morocco                              français Maroc
   fr-MC            French Monaco                               français Monaco
   fr-MF            French St. Martin                           français Saint-Martin
   fr-MG            French Madagascar                           français Madagascar
   fr-ML            French Mali                                 français Mali
   fr-MQ            French Martinique                           français Martinique
   fr-MR            French Mauritania                           français Mauritanie
   fr-MU            French Mauritius                            français Maurice
   fr-NC            French New Caledonia                        français Nouvelle-Calédonie
   fr-NE            French Niger                                français Niger
   fr-PF            French French Polynesia                     français Polynésie française
   fr-PM            French St. Pierre & Miquelon                français Saint-Pierre-et-Miquelon
   fr-RE            French Réunion                              français La Réunion
   fr-RW            French Rwanda                               français Rwanda
   fr-SC            French Seychelles                           français Seychelles
   fr-SN            French Senegal                              français Sénégal
   fr-SY            French Syria                                français Syrie
   fr-TD            French Chad                                 français Tchad
   fr-TG            French Togo                                 français Togo
   fr-TN            French Tunisia                              français Tunisie
   fr-VU            French Vanuatu                              français Vanuatu
   fr-WF            French Wallis & Futuna                      français Wallis-et-Futuna
   fr-YT            French Mayotte                              français Mayotte
   fur              Friulian                                    furlan
   fur-IT           Friulian Italy                              furlan Italie
   fy               Western Frisian                             Frysk
   fy-NL            Western Frisian Netherlands                 Frysk Nederlân
   ga               Irish                                       Gaeilge
   ga-IE            Irish Ireland                               Gaeilge Éire
   gd               Scottish Gaelic                             Gàidhlig
   gd-GB            Scottish Gaelic United Kingdom              Gàidhlig An Rìoghachd Aonaichte
   gl               Galician                                    galego
   gl-ES            Galician Spain                              galego España
   gsw              Swiss German                                Schwiizertüütsch
   gsw-CH           Swiss German Switzerland                    Schwiizertüütsch Schwiiz
   gsw-FR           Swiss German France                         Schwiizertüütsch Frankriich
   gsw-LI           Swiss German Liechtenstein                  Schwiizertüütsch Liächteschtäi
   gu               Gujarati                                    ગુજરાતી
   gu-IN            Gujarati India                              ગુજરાતી ભારત
   guz              Gusii                                       Ekegusii
   guz-KE           Gusii Kenya                                 Ekegusii Kenya
   gv               Manx                                        Gaelg
   gv-IM            Manx Isle of Man                            Gaelg Ellan Vannin
   ha               Hausa                                       Hausa
   ha-GH            Hausa Ghana                                 Hausa Gana
   ha-NE            Hausa Niger                                 Hausa Nijar
   ha-NG            Hausa Nigeria                               Hausa Najeriya
   haw              Hawaiian                                    ʻŌlelo Hawaiʻi
   haw-US           Hawaiian United States                      ʻŌlelo Hawaiʻi ʻAmelika Hui Pū ʻIa
   he               Hebrew                                      עברית
   he-IL            Hebrew Israel                               עברית ישראל
   hi               Hindi                                       हिन्दी
   hi-IN            Hindi India                                 हिन्दी भारत
   hr               Croatian                                    hrvatski
   hr-BA            Croatian Bosnia & Herzegovina               hrvatski Bosna i Hercegovina
   hr-HR            Croatian Croatia                            hrvatski Hrvatska
   hsb              Upper Sorbian                               hornjoserbšćina
   hsb-DE           Upper Sorbian Germany                       hornjoserbšćina Němska
   hu               Hungarian                                   magyar
   hu-HU            Hungarian Hungary                           magyar Magyarország
   hy               Armenian                                    հայերեն
   hy-AM            Armenian Armenia                            հայերեն Հայաստան
   ia               Interlingua                                 interlingua
   ia-001           Interlingua World                           interlingua Mundo
   id               Indonesian                                  Indonesia
   id-ID            Indonesian Indonesia                        Indonesia Indonesia
   ig               Igbo                                        Asụsụ Igbo
   ig-NG            Igbo Nigeria                                Asụsụ Igbo Naịjịrịa
   ii               Sichuan Yi                                  ꆈꌠꉙ
   ii-CN            Sichuan Yi China                            ꆈꌠꉙ ꍏꇩ
   is               Icelandic                                   íslenska
   is-IS            Icelandic Iceland                           íslenska Ísland
   it               Italian                                     italiano
   it-CH            Italian Switzerland                         italiano Svizzera
   it-IT            Italian Italy                               italiano Italia
   it-SM            Italian San Marino                          italiano San Marino
   it-VA            Italian Vatican City                        italiano Città del Vaticano
   ja               Japanese                                    日本語
   ja-JP            Japanese Japan                              日本語 日本
   jgo              Ngomba                                      Ndaꞌa
   jgo-CM           Ngomba Cameroon                             Ndaꞌa Kamɛlûn
   jmc              Machame                                     Kimachame
   jmc-TZ           Machame Tanzania                            Kimachame Tanzania
   jv               Javanese                                    Jawa
   jv-ID            Javanese Indonesia                          Jawa Indonésia
   ka               Georgian                                    ქართული
   ka-GE            Georgian Georgia                            ქართული საქართველო
   kab              Kabyle                                      Taqbaylit
   kab-DZ           Kabyle Algeria                              Taqbaylit Lezzayer
   kam              Kamba                                       Kikamba
   kam-KE           Kamba Kenya                                 Kikamba Kenya
   kde              Makonde                                     Chimakonde
   kde-TZ           Makonde Tanzania                            Chimakonde Tanzania
   kea              Kabuverdianu                                kabuverdianu
   kea-CV           Kabuverdianu Cape Verde                     kabuverdianu Kabu Verdi
   khq              Koyra Chiini                                Koyra ciini
   khq-ML           Koyra Chiini Mali                           Koyra ciini Maali
   ki               Kikuyu                                      Gikuyu
   ki-KE            Kikuyu Kenya                                Gikuyu Kenya
   kk               Kazakh                                      қазақ тілі
   kk-KZ            Kazakh Kazakhstan                           қазақ тілі Қазақстан
   kkj              Kako                                        kakɔ
   kkj-CM           Kako Cameroon                               kakɔ Kamɛrun
   kl               Kalaallisut                                 kalaallisut
   kl-GL            Kalaallisut Greenland                       kalaallisut Kalaallit Nunaat
   kln              Kalenjin                                    Kalenjin
   kln-KE           Kalenjin Kenya                              Kalenjin Emetab Kenya
   km               Khmer                                       ខ្មែរ
   km-KH            Khmer Cambodia                              ខ្មែរ កម្ពុជា
   kn               Kannada                                     ಕನ್ನಡ
   kn-IN            Kannada India                               ಕನ್ನಡ ಭಾರತ
   ko               Korean                                      한국어
   ko-KP            Korean North Korea                          한국어 조선민주주의인민공화국
   ko-KR            Korean South Korea                          한국어 대한민국
   kok              Konkani                                     कोंकणी
   kok-IN           Konkani India                               कोंकणी भारत
   ks               Kashmiri                                    کٲشُر
   ks-IN            Kashmiri India                              کٲشُر ہِندوستان
   ksb              Shambala                                    Kishambaa
   ksb-TZ           Shambala Tanzania                           Kishambaa Tanzania
   ksf              Bafia                                       rikpa
   ksf-CM           Bafia Cameroon                              rikpa kamɛrún
   ksh              Colognian                                   Kölsch
   ksh-DE           Colognian Germany                           Kölsch Doütschland
   ku               Kurdish                                     kurdî
   ku-TR            Kurdish Turkey                              kurdî Tirkiye
   kw               Cornish                                     kernewek
   kw-GB            Cornish United Kingdom                      kernewek Rywvaneth Unys
   ky               Kyrgyz                                      кыргызча
   ky-KG            Kyrgyz Kyrgyzstan                           кыргызча Кыргызстан
   lag              Langi                                       Kɨlaangi
   lag-TZ           Langi Tanzania                              Kɨlaangi Taansanía
   lb               Luxembourgish                               Lëtzebuergesch
   lb-LU            Luxembourgish Luxembourg                    Lëtzebuergesch Lëtzebuerg
   lg               Ganda                                       Luganda
   lg-UG            Ganda Uganda                                Luganda Yuganda
   lkt              Lakota                                      Lakȟólʼiyapi
   lkt-US           Lakota United States                        Lakȟólʼiyapi Mílahaŋska Tȟamákȟočhe
   ln               Lingala                                     lingála
   ln-AO            Lingala Angola                              lingála Angóla
   ln-CD            Lingala Congo - Kinshasa                    lingála Republíki ya Kongó Demokratíki
   ln-CF            Lingala Central African Republic            lingála Repibiki ya Afríka ya Káti
   ln-CG            Lingala Congo - Brazzaville                 lingála Kongo
   lo               Lao                                         ລາວ
   lo-LA            Lao Laos                                    ລາວ ລາວ
   lrc              Northern Luri                               لۊری شومالی
   lrc-IQ           Northern Luri Iraq                          لۊری شومالی IQ
   lrc-IR           Northern Luri Iran                          لۊری شومالی IR
   lt               Lithuanian                                  lietuvių
   lt-LT            Lithuanian Lithuania                        lietuvių Lietuva
   lu               Luba-Katanga                                Tshiluba
   lu-CD            Luba-Katanga Congo - Kinshasa               Tshiluba Ditunga wa Kongu
   luo              Luo                                         Dholuo
   luo-KE           Luo Kenya                                   Dholuo Kenya
   luy              Luyia                                       Luluhia
   luy-KE           Luyia Kenya                                 Luluhia Kenya
   lv               Latvian                                     latviešu
   lv-LV            Latvian Latvia                              latviešu Latvija
   mas              Masai                                       Maa
   mas-KE           Masai Kenya                                 Maa Kenya
   mas-TZ           Masai Tanzania                              Maa Tansania
   mer              Meru                                        Kĩmĩrũ
   mer-KE           Meru Kenya                                  Kĩmĩrũ Kenya
   mfe              Morisyen                                    kreol morisien
   mfe-MU           Morisyen Mauritius                          kreol morisien Moris
   mg               Malagasy                                    Malagasy
   mg-MG            Malagasy Madagascar                         Malagasy Madagasikara
   mgh              Makhuwa-Meetto                              Makua
   mgh-MZ           Makhuwa-Meetto Mozambique                   Makua Umozambiki
   mgo              Metaʼ                                       metaʼ
   mgo-CM           Metaʼ Cameroon                              metaʼ Kamalun
   mi               Maori                                       Māori
   mi-NZ            Maori New Zealand                           Māori Aotearoa
   mk               Macedonian                                  македонски
   mk-MK            Macedonian North Macedonia                  македонски Северна Македонија
   ml               Malayalam                                   മലയാളം
   ml-IN            Malayalam India                             മലയാളം ഇന്ത്യ
   mn               Mongolian                                   монгол
   mn-MN            Mongolian Mongolia                          монгол Монгол
   mr               Marathi                                     मराठी
   mr-IN            Marathi India                               मराठी भारत
   ms               Malay                                       Melayu
   ms-BN            Malay Brunei                                Melayu Brunei
   ms-MY            Malay Malaysia                              Melayu Malaysia
   ms-SG            Malay Singapore                             Melayu Singapura
   mt               Maltese                                     Malti
   mt-MT            Maltese Malta                               Malti Malta
   mua              Mundang                                     MUNDAŊ
   mua-CM           Mundang Cameroon                            MUNDAŊ kameruŋ
   my               Burmese                                     မြန်မာ
   my-MM            Burmese Myanmar (Burma)                     မြန်မာ မြန်မာ
   mzn              Mazanderani                                 مازرونی
   mzn-IR           Mazanderani Iran                            مازرونی ایران
   naq              Nama                                        Khoekhoegowab
   naq-NA           Nama Namibia                                Khoekhoegowab Namibiab
   nb               Norwegian Bokmål                            norsk bokmål
   nb-NO            Norwegian Bokmål Norway                     norsk bokmål Norge
   nb-SJ            Norwegian Bokmål Svalbard & Jan Mayen       norsk bokmål Svalbard og Jan Mayen
   nd               North Ndebele                               isiNdebele
   nd-ZW            North Ndebele Zimbabwe                      isiNdebele Zimbabwe
   nds              Low German                                  nds
   nds-DE           Low German Germany                          nds DE
   nds-NL           Low German Netherlands                      nds NL
   ne               Nepali                                      नेपाली
   ne-IN            Nepali India                                नेपाली भारत
   ne-NP            Nepali Nepal                                नेपाली नेपाल
   nl               Dutch                                       Nederlands
   nl-AW            Dutch Aruba                                 Nederlands Aruba
   nl-BE            Dutch Belgium                               Nederlands België
   nl-BQ            Dutch Caribbean Netherlands                 Nederlands Caribisch Nederland
   nl-CW            Dutch Curaçao                               Nederlands Curaçao
   nl-NL            Dutch Netherlands                           Nederlands Nederland
   nl-SR            Dutch Suriname                              Nederlands Suriname
   nl-SX            Dutch Sint Maarten                          Nederlands Sint-Maarten
   nmg              Kwasio                                      nmg
   nmg-CM           Kwasio Cameroon                             nmg Kamerun
   nn               Norwegian Nynorsk                           nynorsk
   nn-NO            Norwegian Nynorsk Norway                    nynorsk Noreg
   nnh              Ngiemboon                                   Shwóŋò ngiembɔɔn
   nnh-CM           Ngiemboon Cameroon                          Shwóŋò ngiembɔɔn Kàmalûm
   nus              Nuer                                        Thok Nath
   nus-SS           Nuer South Sudan                            Thok Nath SS
   nyn              Nyankole                                    Runyankore
   nyn-UG           Nyankole Uganda                             Runyankore Uganda
   om               Oromo                                       Oromoo
   om-ET            Oromo Ethiopia                              Oromoo Itoophiyaa
   om-KE            Oromo Kenya                                 Oromoo Keeniyaa
   or               Odia                                        ଓଡ଼ିଆ
   or-IN            Odia India                                  ଓଡ଼ିଆ ଭାରତ
   os               Ossetic                                     ирон
   os-GE            Ossetic Georgia                             ирон Гуырдзыстон
   os-RU            Ossetic Russia                              ирон Уӕрӕсе
   pa               Punjabi                                     ਪੰਜਾਬੀ
   pa-Arab          Punjabi Arabic                              پنجابی عربی
   pa-Arab-PK       Punjabi Pakistan Arabic                     پنجابی پاکستان عربی
   pa-Guru          Punjabi Gurmukhi                            ਪੰਜਾਬੀ ਗੁਰਮੁਖੀ
   pa-Guru-IN       Punjabi India Gurmukhi                      ਪੰਜਾਬੀ ਭਾਰਤ ਗੁਰਮੁਖੀ
   pl               Polish                                      polski
   pl-PL            Polish Poland                               polski Polska
   prg              Prussian                                    prūsiskan
   prg-001          Prussian World                              prūsiskan 001
   ps               Pashto                                      پښتو
   ps-AF            Pashto Afghanistan                          پښتو افغانستان
   ps-PK            Pashto Pakistan                             پښتو پاکستان
   pt               Portuguese                                  português
   pt-AO            Portuguese Angola                           português Angola
   pt-BR            Portuguese Brazil                           português Brasil
   pt-CH            Portuguese Switzerland                      português Suíça
   pt-CV            Portuguese Cape Verde                       português Cabo Verde
   pt-GQ            Portuguese Equatorial Guinea                português Guiné Equatorial
   pt-GW            Portuguese Guinea-Bissau                    português Guiné-Bissau
   pt-LU            Portuguese Luxembourg                       português Luxemburgo
   pt-MO            Portuguese Macao SAR China                  português Macau, RAE da China
   pt-MZ            Portuguese Mozambique                       português Moçambique
   pt-PT            Portuguese Portugal                         português Portugal
   pt-ST            Portuguese São Tomé & Príncipe              português São Tomé e Príncipe
   pt-TL            Portuguese Timor-Leste                      português Timor-Leste
   qu               Quechua                                     Runasimi
   qu-BO            Quechua Bolivia                             Runasimi Bolivia
   qu-EC            Quechua Ecuador                             Runasimi Ecuador
   qu-PE            Quechua Peru                                Runasimi Perú
   rm               Romansh                                     rumantsch
   rm-CH            Romansh Switzerland                         rumantsch Svizra
   rn               Rundi                                       Ikirundi
   rn-BI            Rundi Burundi                               Ikirundi Uburundi
   ro               Romanian                                    română
   ro-MD            Romanian Moldova                            română Republica Moldova
   ro-RO            Romanian Romania                            română România
   rof              Rombo                                       Kihorombo
   rof-TZ           Rombo Tanzania                              Kihorombo Tanzania
   root             Root                                        root
   ru               Russian                                     русский
   ru-BY            Russian Belarus                             русский Беларусь
   ru-KG            Russian Kyrgyzstan                          русский Киргизия
   ru-KZ            Russian Kazakhstan                          русский Казахстан
   ru-MD            Russian Moldova                             русский Молдова
   ru-RU            Russian Russia                              русский Россия
   ru-UA            Russian Ukraine                             русский Украина
   rw               Kinyarwanda                                 Kinyarwanda
   rw-RW            Kinyarwanda Rwanda                          Kinyarwanda U Rwanda
   rwk              Rwa                                         Kiruwa
   rwk-TZ           Rwa Tanzania                                Kiruwa Tanzania
   sah              Sakha                                       саха тыла
   sah-RU           Sakha Russia                                саха тыла Арассыыйа
   saq              Samburu                                     Kisampur
   saq-KE           Samburu Kenya                               Kisampur Kenya
   sbp              Sangu                                       Ishisangu
   sbp-TZ           Sangu Tanzania                              Ishisangu Tansaniya
   sd               Sindhi                                      سنڌي
   sd-PK            Sindhi Pakistan                             سنڌي پاڪستان
   se               Northern Sami                               davvisámegiella
   se-FI            Northern Sami Finland                       davvisámegiella Suopma
   se-NO            Northern Sami Norway                        davvisámegiella Norga
   se-SE            Northern Sami Sweden                        davvisámegiella Ruoŧŧa
   seh              Sena                                        sena
   seh-MZ           Sena Mozambique                             sena Moçambique
   ses              Koyraboro Senni                             Koyraboro senni
   ses-ML           Koyraboro Senni Mali                        Koyraboro senni Maali
   sg               Sango                                       Sängö
   sg-CF            Sango Central African Republic              Sängö Ködörösêse tî Bêafrîka
   shi              Tachelhit                                   ⵜⴰⵛⵍⵃⵉⵜ
   shi-Latn         Tachelhit Latin                             Tashelḥiyt Latn
   shi-Latn-MA      Tachelhit Morocco Latin                     Tashelḥiyt lmɣrib Latn
   shi-Tfng         Tachelhit Tifinagh                          ⵜⴰⵛⵍⵃⵉⵜ Tfng
   shi-Tfng-MA      Tachelhit Morocco Tifinagh                  ⵜⴰⵛⵍⵃⵉⵜ ⵍⵎⵖⵔⵉⴱ Tfng
   si               Sinhala                                     සිංහල
   si-LK            Sinhala Sri Lanka                           සිංහල ශ්‍රී ලංකාව
   sk               Slovak                                      slovenčina
   sk-SK            Slovak Slovakia                             slovenčina Slovensko
   sl               Slovenian                                   slovenščina
   sl-SI            Slovenian Slovenia                          slovenščina Slovenija
   smn              Inari Sami                                  anarâškielâ
   smn-FI           Inari Sami Finland                          anarâškielâ Suomâ
   sn               Shona                                       chiShona
   sn-ZW            Shona Zimbabwe                              chiShona Zimbabwe
   so               Somali                                      Soomaali
   so-DJ            Somali Djibouti                             Soomaali Jabuuti
   so-ET            Somali Ethiopia                             Soomaali Itoobiya
   so-KE            Somali Kenya                                Soomaali Kenya
   so-SO            Somali Somalia                              Soomaali Soomaaliya
   sq               Albanian                                    shqip
   sq-AL            Albanian Albania                            shqip Shqipëri
   sq-MK            Albanian North Macedonia                    shqip Maqedonia e Veriut
   sq-XK            Albanian Kosovo                             shqip Kosovë
   sr               Serbian                                     српски
   sr-Cyrl          Serbian Cyrillic                            српски ћирилица
   sr-Cyrl-BA       Serbian Bosnia & Herzegovina Cyrillic       српски Босна и Херцеговина ћирилица
   sr-Cyrl-ME       Serbian Montenegro Cyrillic                 српски Црна Гора ћирилица
   sr-Cyrl-RS       Serbian Serbia Cyrillic                     српски Србија ћирилица
   sr-Cyrl-XK       Serbian Kosovo Cyrillic                     српски Косово ћирилица
   sr-Latn          Serbian Latin                               srpski latinica
   sr-Latn-BA       Serbian Bosnia & Herzegovina Latin          srpski Bosna i Hercegovina latinica
   sr-Latn-ME       Serbian Montenegro Latin                    srpski Crna Gora latinica
   sr-Latn-RS       Serbian Serbia Latin                        srpski Srbija latinica
   sr-Latn-XK       Serbian Kosovo Latin                        srpski Kosovo latinica
   sv               Swedish                                     svenska
   sv-AX            Swedish Åland Islands                       svenska Åland
   sv-FI            Swedish Finland                             svenska Finland
   sv-SE            Swedish Sweden                              svenska Sverige
   sw               Swahili                                     Kiswahili
   sw-CD            Swahili Congo - Kinshasa                    Kiswahili Jamhuri ya Kidemokrasia ya Kongo
   sw-KE            Swahili Kenya                               Kiswahili Kenya
   sw-TZ            Swahili Tanzania                            Kiswahili Tanzania
   sw-UG            Swahili Uganda                              Kiswahili Uganda
   ta               Tamil                                       தமிழ்
   ta-IN            Tamil India                                 தமிழ் இந்தியா
   ta-LK            Tamil Sri Lanka                             தமிழ் இலங்கை
   ta-MY            Tamil Malaysia                              தமிழ் மலேசியா
   ta-SG            Tamil Singapore                             தமிழ் சிங்கப்பூர்
   te               Telugu                                      తెలుగు
   te-IN            Telugu India                                తెలుగు భారతదేశం
   teo              Teso                                        Kiteso
   teo-KE           Teso Kenya                                  Kiteso Kenia
   teo-UG           Teso Uganda                                 Kiteso Uganda
   tg               Tajik                                       тоҷикӣ
   tg-TJ            Tajik Tajikistan                            тоҷикӣ Тоҷикистон
   th               Thai                                        ไทย
   th-TH            Thai Thailand                               ไทย ไทย
   ti               Tigrinya                                    ትግርኛ
   ti-ER            Tigrinya Eritrea                            ትግርኛ ኤርትራ
   ti-ET            Tigrinya Ethiopia                           ትግርኛ ኢትዮጵያ
   tk               Turkmen                                     türkmen dili
   tk-TM            Turkmen Turkmenistan                        türkmen dili Türkmenistan
   to               Tongan                                      lea fakatonga
   to-TO            Tongan Tonga                                lea fakatonga Tonga
   tr               Turkish                                     Türkçe
   tr-CY            Turkish Cyprus                              Türkçe Kıbrıs
   tr-TR            Turkish Turkey                              Türkçe Türkiye
   tt               Tatar                                       татар
   tt-RU            Tatar Russia                                татар Россия
   twq              Tasawaq                                     Tasawaq senni
   twq-NE           Tasawaq Niger                               Tasawaq senni Nižer
   tzm              Central Atlas Tamazight                     Tamaziɣt n laṭlaṣ
   tzm-MA           Central Atlas Tamazight Morocco             Tamaziɣt n laṭlaṣ Meṛṛuk
   ug               Uyghur                                      ئۇيغۇرچە
   ug-CN            Uyghur China                                ئۇيغۇرچە جۇڭگو
   uk               Ukrainian                                   українська
   uk-UA            Ukrainian Ukraine                           українська Україна
   ur               Urdu                                        اردو
   ur-IN            Urdu India                                  اردو بھارت
   ur-PK            Urdu Pakistan                               اردو پاکستان
   uz               Uzbek                                       o‘zbek
   uz-Arab          Uzbek Arabic                                اوزبیک عربی
   uz-Arab-AF       Uzbek Afghanistan Arabic                    اوزبیک افغانستان عربی
   uz-Cyrl          Uzbek Cyrillic                              ўзбекча Кирил
   uz-Cyrl-UZ       Uzbek Uzbekistan Cyrillic                   ўзбекча Ўзбекистон Кирил
   uz-Latn          Uzbek Latin                                 o‘zbek lotin
   uz-Latn-UZ       Uzbek Uzbekistan Latin                      o‘zbek Oʻzbekiston lotin
   vai              Vai                                         ꕙꔤ
   vai-Latn         Vai Latin                                   Vai Latn
   vai-Latn-LR      Vai Liberia Latin                           Vai Laibhiya Latn
   vai-Vaii         Vai Vai                                     ꕙꔤ Vaii
   vai-Vaii-LR      Vai Liberia Vai                             ꕙꔤ ꕞꔤꔫꕩ Vaii
   vi               Vietnamese                                  Tiếng Việt
   vi-VN            Vietnamese Vietnam                          Tiếng Việt Việt Nam
   vo               Volapük                                     vo
   vo-001           Volapük World                               vo 001
   vun              Vunjo                                       Kyivunjo
   vun-TZ           Vunjo Tanzania                              Kyivunjo Tanzania
   wae              Walser                                      Walser
   wae-CH           Walser Switzerland                          Walser Schwiz
   wo               Wolof                                       Wolof
   wo-SN            Wolof Senegal                               Wolof Senegaal
   xh               Xhosa                                       isiXhosa
   xh-ZA            Xhosa South Africa                          isiXhosa eMzantsi Afrika
   xog              Soga                                        Olusoga
   xog-UG           Soga Uganda                                 Olusoga Yuganda
   yav              Yangben                                     nuasue
   yav-CM           Yangben Cameroon                            nuasue Kemelún
   yi               Yiddish                                     ייִדיש
   yi-001           Yiddish World                               ייִדיש וועלט
   yo               Yoruba                                      Èdè Yorùbá
   yo-BJ            Yoruba Benin                                Èdè Yorùbá Orílɛ́ède Bɛ̀nɛ̀
   yo-NG            Yoruba Nigeria                              Èdè Yorùbá Orilẹ̀-èdè Nàìjíríà
   yue              Cantonese                                   粵語
   yue-Hans         Cantonese Simplified                        粤语 简体
   yue-Hans-CN      Cantonese China Simplified                  粤语 中华人民共和国 简体
   yue-Hant         Cantonese Traditional                       粵語 繁體
   yue-Hant-HK      Cantonese Hong Kong SAR China Traditional   粵語 中華人民共和國香港特別行政區 繁體
   zgh              Standard Moroccan Tamazight                 ⵜⴰⵎⴰⵣⵉⵖⵜ
   zgh-MA           Standard Moroccan Tamazight Morocco         ⵜⴰⵎⴰⵣⵉⵖⵜ ⵍⵎⵖⵔⵉⴱ
   zh               Chinese                                     中文
   zh-Hans          Chinese Simplified                          中文 简体
   zh-Hans-CN       Chinese China Simplified                    中文 中国 简体
   zh-Hans-HK       Chinese Hong Kong SAR China Simplified      中文 中国香港特别行政区 简体
   zh-Hans-MO       Chinese Macao SAR China Simplified          中文 中国澳门特别行政区 简体
   zh-Hans-SG       Chinese Singapore Simplified                中文 新加坡 简体
   zh-Hant          Chinese Traditional                         中文 繁體
   zh-Hant-HK       Chinese Hong Kong SAR China Traditional     中文 中國香港特別行政區 繁體字
   zh-Hant-MO       Chinese Macao SAR China Traditional         中文 中國澳門特別行政區 繁體字
   zh-Hant-TW       Chinese Taiwan Traditional                  中文 台灣 繁體
   zu               Zulu                                        isiZulu
   zu-ZA            Zulu South Africa                           isiZulu iNingizimu Afrika
  
  =head1 SUPPORT
  
  Bugs may be submitted at L<https://github.com/houseabsolute/DateTime-Locale/issues>.
  
  There is a mailing list available for users of this distribution,
  L<mailto:datetime@perl.org>.
  
  I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
  
  =head1 SOURCE
  
  The source code repository for DateTime-Locale can be found at L<https://github.com/houseabsolute/DateTime-Locale>.
  
  =head1 AUTHOR
  
  Dave Rolsky <autarch@urth.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2003 - 2019 by Dave Rolsky.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  The full text of the license can be found in the
  F<LICENSE> file included with this distribution.
  
  =cut
DATETIME_LOCALE_CATALOG

    $main::fatpacked{"DateTime/Locale/Data.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_LOCALE_DATA';
  ###########################################################################
  #
  # This file is partially auto-generated by the DateTime::Locale generator
  # tools (v0.10). This code generator comes with the DateTime::Locale
  # distribution in the tools/ directory, and is called generate-modules.
  #
  # This file was generated from the CLDR JSON locale data. See the LICENSE.cldr
  # file included in this distribution for license details.
  #
  # Do not edit this file directly unless you are sure the part you are editing
  # is not created by the generator.
  #
  ###########################################################################
  
  package DateTime::Locale::Data;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  use File::ShareDir qw( dist_file );
  
  our $VERSION = '1.24';
  
  #<<<
  ### :start CLDRVersion:
  our $CLDRVersion = 35;
  ### :end CLDRVersion:
  #>>>
  
  #<<<
  ### :start Codes:
  our %Codes = (
    af => 1,
    "af-NA" => 1,
    "af-ZA" => 1,
    agq => 1,
    "agq-CM" => 1,
    ak => 1,
    "ak-GH" => 1,
    am => 1,
    "am-ET" => 1,
    ar => 1,
    "ar-001" => 1,
    "ar-AE" => 1,
    "ar-BH" => 1,
    "ar-DJ" => 1,
    "ar-DZ" => 1,
    "ar-EG" => 1,
    "ar-EH" => 1,
    "ar-ER" => 1,
    "ar-IL" => 1,
    "ar-IQ" => 1,
    "ar-JO" => 1,
    "ar-KM" => 1,
    "ar-KW" => 1,
    "ar-LB" => 1,
    "ar-LY" => 1,
    "ar-MA" => 1,
    "ar-MR" => 1,
    "ar-OM" => 1,
    "ar-PS" => 1,
    "ar-QA" => 1,
    "ar-SA" => 1,
    "ar-SD" => 1,
    "ar-SO" => 1,
    "ar-SS" => 1,
    "ar-SY" => 1,
    "ar-TD" => 1,
    "ar-TN" => 1,
    "ar-YE" => 1,
    as => 1,
    "as-IN" => 1,
    asa => 1,
    "asa-TZ" => 1,
    ast => 1,
    "ast-ES" => 1,
    az => 1,
    "az-Cyrl" => 1,
    "az-Cyrl-AZ" => 1,
    "az-Latn" => 1,
    "az-Latn-AZ" => 1,
    bas => 1,
    "bas-CM" => 1,
    be => 1,
    "be-BY" => 1,
    bem => 1,
    "bem-ZM" => 1,
    bez => 1,
    "bez-TZ" => 1,
    bg => 1,
    "bg-BG" => 1,
    bm => 1,
    "bm-ML" => 1,
    bn => 1,
    "bn-BD" => 1,
    "bn-IN" => 1,
    bo => 1,
    "bo-CN" => 1,
    "bo-IN" => 1,
    br => 1,
    "br-FR" => 1,
    brx => 1,
    "brx-IN" => 1,
    bs => 1,
    "bs-Cyrl" => 1,
    "bs-Cyrl-BA" => 1,
    "bs-Latn" => 1,
    "bs-Latn-BA" => 1,
    ca => 1,
    "ca-AD" => 1,
    "ca-ES" => 1,
    "ca-ES-VALENCIA" => 1,
    "ca-FR" => 1,
    "ca-IT" => 1,
    ccp => 1,
    "ccp-BD" => 1,
    "ccp-IN" => 1,
    ce => 1,
    "ce-RU" => 1,
    ceb => 1,
    "ceb-PH" => 1,
    cgg => 1,
    "cgg-UG" => 1,
    chr => 1,
    "chr-US" => 1,
    ckb => 1,
    "ckb-IQ" => 1,
    "ckb-IR" => 1,
    cs => 1,
    "cs-CZ" => 1,
    cu => 1,
    "cu-RU" => 1,
    cy => 1,
    "cy-GB" => 1,
    da => 1,
    "da-DK" => 1,
    "da-GL" => 1,
    dav => 1,
    "dav-KE" => 1,
    de => 1,
    "de-AT" => 1,
    "de-BE" => 1,
    "de-CH" => 1,
    "de-DE" => 1,
    "de-IT" => 1,
    "de-LI" => 1,
    "de-LU" => 1,
    dje => 1,
    "dje-NE" => 1,
    dsb => 1,
    "dsb-DE" => 1,
    dua => 1,
    "dua-CM" => 1,
    dyo => 1,
    "dyo-SN" => 1,
    dz => 1,
    "dz-BT" => 1,
    ebu => 1,
    "ebu-KE" => 1,
    ee => 1,
    "ee-GH" => 1,
    "ee-TG" => 1,
    el => 1,
    "el-CY" => 1,
    "el-GR" => 1,
    en => 1,
    "en-001" => 1,
    "en-150" => 1,
    "en-AE" => 1,
    "en-AG" => 1,
    "en-AI" => 1,
    "en-AS" => 1,
    "en-AT" => 1,
    "en-AU" => 1,
    "en-BB" => 1,
    "en-BE" => 1,
    "en-BI" => 1,
    "en-BM" => 1,
    "en-BS" => 1,
    "en-BW" => 1,
    "en-BZ" => 1,
    "en-CA" => 1,
    "en-CC" => 1,
    "en-CH" => 1,
    "en-CK" => 1,
    "en-CM" => 1,
    "en-CX" => 1,
    "en-CY" => 1,
    "en-DE" => 1,
    "en-DG" => 1,
    "en-DK" => 1,
    "en-DM" => 1,
    "en-ER" => 1,
    "en-FI" => 1,
    "en-FJ" => 1,
    "en-FK" => 1,
    "en-FM" => 1,
    "en-GB" => 1,
    "en-GD" => 1,
    "en-GG" => 1,
    "en-GH" => 1,
    "en-GI" => 1,
    "en-GM" => 1,
    "en-GU" => 1,
    "en-GY" => 1,
    "en-HK" => 1,
    "en-IE" => 1,
    "en-IL" => 1,
    "en-IM" => 1,
    "en-IN" => 1,
    "en-IO" => 1,
    "en-JE" => 1,
    "en-JM" => 1,
    "en-KE" => 1,
    "en-KI" => 1,
    "en-KN" => 1,
    "en-KY" => 1,
    "en-LC" => 1,
    "en-LR" => 1,
    "en-LS" => 1,
    "en-MG" => 1,
    "en-MH" => 1,
    "en-MO" => 1,
    "en-MP" => 1,
    "en-MS" => 1,
    "en-MT" => 1,
    "en-MU" => 1,
    "en-MW" => 1,
    "en-MY" => 1,
    "en-NA" => 1,
    "en-NF" => 1,
    "en-NG" => 1,
    "en-NL" => 1,
    "en-NR" => 1,
    "en-NU" => 1,
    "en-NZ" => 1,
    "en-PG" => 1,
    "en-PH" => 1,
    "en-PK" => 1,
    "en-PN" => 1,
    "en-PR" => 1,
    "en-PW" => 1,
    "en-RW" => 1,
    "en-SB" => 1,
    "en-SC" => 1,
    "en-SD" => 1,
    "en-SE" => 1,
    "en-SG" => 1,
    "en-SH" => 1,
    "en-SI" => 1,
    "en-SL" => 1,
    "en-SS" => 1,
    "en-SX" => 1,
    "en-SZ" => 1,
    "en-TC" => 1,
    "en-TK" => 1,
    "en-TO" => 1,
    "en-TT" => 1,
    "en-TV" => 1,
    "en-TZ" => 1,
    "en-UG" => 1,
    "en-UM" => 1,
    "en-US" => 1,
    "en-US-POSIX" => 1,
    "en-VC" => 1,
    "en-VG" => 1,
    "en-VI" => 1,
    "en-VU" => 1,
    "en-WS" => 1,
    "en-ZA" => 1,
    "en-ZM" => 1,
    "en-ZW" => 1,
    eo => 1,
    "eo-001" => 1,
    es => 1,
    "es-419" => 1,
    "es-AR" => 1,
    "es-BO" => 1,
    "es-BR" => 1,
    "es-BZ" => 1,
    "es-CL" => 1,
    "es-CO" => 1,
    "es-CR" => 1,
    "es-CU" => 1,
    "es-DO" => 1,
    "es-EA" => 1,
    "es-EC" => 1,
    "es-ES" => 1,
    "es-GQ" => 1,
    "es-GT" => 1,
    "es-HN" => 1,
    "es-IC" => 1,
    "es-MX" => 1,
    "es-NI" => 1,
    "es-PA" => 1,
    "es-PE" => 1,
    "es-PH" => 1,
    "es-PR" => 1,
    "es-PY" => 1,
    "es-SV" => 1,
    "es-US" => 1,
    "es-UY" => 1,
    "es-VE" => 1,
    et => 1,
    "et-EE" => 1,
    eu => 1,
    "eu-ES" => 1,
    ewo => 1,
    "ewo-CM" => 1,
    fa => 1,
    "fa-AF" => 1,
    "fa-IR" => 1,
    ff => 1,
    "ff-Latn" => 1,
    "ff-Latn-BF" => 1,
    "ff-Latn-CM" => 1,
    "ff-Latn-GH" => 1,
    "ff-Latn-GM" => 1,
    "ff-Latn-GN" => 1,
    "ff-Latn-GW" => 1,
    "ff-Latn-LR" => 1,
    "ff-Latn-MR" => 1,
    "ff-Latn-NE" => 1,
    "ff-Latn-NG" => 1,
    "ff-Latn-SL" => 1,
    "ff-Latn-SN" => 1,
    fi => 1,
    "fi-FI" => 1,
    fil => 1,
    "fil-PH" => 1,
    fo => 1,
    "fo-DK" => 1,
    "fo-FO" => 1,
    fr => 1,
    "fr-BE" => 1,
    "fr-BF" => 1,
    "fr-BI" => 1,
    "fr-BJ" => 1,
    "fr-BL" => 1,
    "fr-CA" => 1,
    "fr-CD" => 1,
    "fr-CF" => 1,
    "fr-CG" => 1,
    "fr-CH" => 1,
    "fr-CI" => 1,
    "fr-CM" => 1,
    "fr-DJ" => 1,
    "fr-DZ" => 1,
    "fr-FR" => 1,
    "fr-GA" => 1,
    "fr-GF" => 1,
    "fr-GN" => 1,
    "fr-GP" => 1,
    "fr-GQ" => 1,
    "fr-HT" => 1,
    "fr-KM" => 1,
    "fr-LU" => 1,
    "fr-MA" => 1,
    "fr-MC" => 1,
    "fr-MF" => 1,
    "fr-MG" => 1,
    "fr-ML" => 1,
    "fr-MQ" => 1,
    "fr-MR" => 1,
    "fr-MU" => 1,
    "fr-NC" => 1,
    "fr-NE" => 1,
    "fr-PF" => 1,
    "fr-PM" => 1,
    "fr-RE" => 1,
    "fr-RW" => 1,
    "fr-SC" => 1,
    "fr-SN" => 1,
    "fr-SY" => 1,
    "fr-TD" => 1,
    "fr-TG" => 1,
    "fr-TN" => 1,
    "fr-VU" => 1,
    "fr-WF" => 1,
    "fr-YT" => 1,
    fur => 1,
    "fur-IT" => 1,
    fy => 1,
    "fy-NL" => 1,
    ga => 1,
    "ga-IE" => 1,
    gd => 1,
    "gd-GB" => 1,
    gl => 1,
    "gl-ES" => 1,
    gsw => 1,
    "gsw-CH" => 1,
    "gsw-FR" => 1,
    "gsw-LI" => 1,
    gu => 1,
    "gu-IN" => 1,
    guz => 1,
    "guz-KE" => 1,
    gv => 1,
    "gv-IM" => 1,
    ha => 1,
    "ha-GH" => 1,
    "ha-NE" => 1,
    "ha-NG" => 1,
    haw => 1,
    "haw-US" => 1,
    he => 1,
    "he-IL" => 1,
    hi => 1,
    "hi-IN" => 1,
    hr => 1,
    "hr-BA" => 1,
    "hr-HR" => 1,
    hsb => 1,
    "hsb-DE" => 1,
    hu => 1,
    "hu-HU" => 1,
    hy => 1,
    "hy-AM" => 1,
    ia => 1,
    "ia-001" => 1,
    id => 1,
    "id-ID" => 1,
    ig => 1,
    "ig-NG" => 1,
    ii => 1,
    "ii-CN" => 1,
    is => 1,
    "is-IS" => 1,
    it => 1,
    "it-CH" => 1,
    "it-IT" => 1,
    "it-SM" => 1,
    "it-VA" => 1,
    ja => 1,
    "ja-JP" => 1,
    jgo => 1,
    "jgo-CM" => 1,
    jmc => 1,
    "jmc-TZ" => 1,
    jv => 1,
    "jv-ID" => 1,
    ka => 1,
    "ka-GE" => 1,
    kab => 1,
    "kab-DZ" => 1,
    kam => 1,
    "kam-KE" => 1,
    kde => 1,
    "kde-TZ" => 1,
    kea => 1,
    "kea-CV" => 1,
    khq => 1,
    "khq-ML" => 1,
    ki => 1,
    "ki-KE" => 1,
    kk => 1,
    "kk-KZ" => 1,
    kkj => 1,
    "kkj-CM" => 1,
    kl => 1,
    "kl-GL" => 1,
    kln => 1,
    "kln-KE" => 1,
    km => 1,
    "km-KH" => 1,
    kn => 1,
    "kn-IN" => 1,
    ko => 1,
    "ko-KP" => 1,
    "ko-KR" => 1,
    kok => 1,
    "kok-IN" => 1,
    ks => 1,
    "ks-IN" => 1,
    ksb => 1,
    "ksb-TZ" => 1,
    ksf => 1,
    "ksf-CM" => 1,
    ksh => 1,
    "ksh-DE" => 1,
    ku => 1,
    "ku-TR" => 1,
    kw => 1,
    "kw-GB" => 1,
    ky => 1,
    "ky-KG" => 1,
    lag => 1,
    "lag-TZ" => 1,
    lb => 1,
    "lb-LU" => 1,
    lg => 1,
    "lg-UG" => 1,
    lkt => 1,
    "lkt-US" => 1,
    ln => 1,
    "ln-AO" => 1,
    "ln-CD" => 1,
    "ln-CF" => 1,
    "ln-CG" => 1,
    lo => 1,
    "lo-LA" => 1,
    lrc => 1,
    "lrc-IQ" => 1,
    "lrc-IR" => 1,
    lt => 1,
    "lt-LT" => 1,
    lu => 1,
    "lu-CD" => 1,
    luo => 1,
    "luo-KE" => 1,
    luy => 1,
    "luy-KE" => 1,
    lv => 1,
    "lv-LV" => 1,
    mas => 1,
    "mas-KE" => 1,
    "mas-TZ" => 1,
    mer => 1,
    "mer-KE" => 1,
    mfe => 1,
    "mfe-MU" => 1,
    mg => 1,
    "mg-MG" => 1,
    mgh => 1,
    "mgh-MZ" => 1,
    mgo => 1,
    "mgo-CM" => 1,
    mi => 1,
    "mi-NZ" => 1,
    mk => 1,
    "mk-MK" => 1,
    ml => 1,
    "ml-IN" => 1,
    mn => 1,
    "mn-MN" => 1,
    mr => 1,
    "mr-IN" => 1,
    ms => 1,
    "ms-BN" => 1,
    "ms-MY" => 1,
    "ms-SG" => 1,
    mt => 1,
    "mt-MT" => 1,
    mua => 1,
    "mua-CM" => 1,
    my => 1,
    "my-MM" => 1,
    mzn => 1,
    "mzn-IR" => 1,
    naq => 1,
    "naq-NA" => 1,
    nb => 1,
    "nb-NO" => 1,
    "nb-SJ" => 1,
    nd => 1,
    "nd-ZW" => 1,
    nds => 1,
    "nds-DE" => 1,
    "nds-NL" => 1,
    ne => 1,
    "ne-IN" => 1,
    "ne-NP" => 1,
    nl => 1,
    "nl-AW" => 1,
    "nl-BE" => 1,
    "nl-BQ" => 1,
    "nl-CW" => 1,
    "nl-NL" => 1,
    "nl-SR" => 1,
    "nl-SX" => 1,
    nmg => 1,
    "nmg-CM" => 1,
    nn => 1,
    "nn-NO" => 1,
    nnh => 1,
    "nnh-CM" => 1,
    nus => 1,
    "nus-SS" => 1,
    nyn => 1,
    "nyn-UG" => 1,
    om => 1,
    "om-ET" => 1,
    "om-KE" => 1,
    or => 1,
    "or-IN" => 1,
    os => 1,
    "os-GE" => 1,
    "os-RU" => 1,
    pa => 1,
    "pa-Arab" => 1,
    "pa-Arab-PK" => 1,
    "pa-Guru" => 1,
    "pa-Guru-IN" => 1,
    pl => 1,
    "pl-PL" => 1,
    prg => 1,
    "prg-001" => 1,
    ps => 1,
    "ps-AF" => 1,
    "ps-PK" => 1,
    pt => 1,
    "pt-AO" => 1,
    "pt-BR" => 1,
    "pt-CH" => 1,
    "pt-CV" => 1,
    "pt-GQ" => 1,
    "pt-GW" => 1,
    "pt-LU" => 1,
    "pt-MO" => 1,
    "pt-MZ" => 1,
    "pt-PT" => 1,
    "pt-ST" => 1,
    "pt-TL" => 1,
    qu => 1,
    "qu-BO" => 1,
    "qu-EC" => 1,
    "qu-PE" => 1,
    rm => 1,
    "rm-CH" => 1,
    rn => 1,
    "rn-BI" => 1,
    ro => 1,
    "ro-MD" => 1,
    "ro-RO" => 1,
    rof => 1,
    "rof-TZ" => 1,
    root => 1,
    ru => 1,
    "ru-BY" => 1,
    "ru-KG" => 1,
    "ru-KZ" => 1,
    "ru-MD" => 1,
    "ru-RU" => 1,
    "ru-UA" => 1,
    rw => 1,
    "rw-RW" => 1,
    rwk => 1,
    "rwk-TZ" => 1,
    sah => 1,
    "sah-RU" => 1,
    saq => 1,
    "saq-KE" => 1,
    sbp => 1,
    "sbp-TZ" => 1,
    sd => 1,
    "sd-PK" => 1,
    se => 1,
    "se-FI" => 1,
    "se-NO" => 1,
    "se-SE" => 1,
    seh => 1,
    "seh-MZ" => 1,
    ses => 1,
    "ses-ML" => 1,
    sg => 1,
    "sg-CF" => 1,
    shi => 1,
    "shi-Latn" => 1,
    "shi-Latn-MA" => 1,
    "shi-Tfng" => 1,
    "shi-Tfng-MA" => 1,
    si => 1,
    "si-LK" => 1,
    sk => 1,
    "sk-SK" => 1,
    sl => 1,
    "sl-SI" => 1,
    smn => 1,
    "smn-FI" => 1,
    sn => 1,
    "sn-ZW" => 1,
    so => 1,
    "so-DJ" => 1,
    "so-ET" => 1,
    "so-KE" => 1,
    "so-SO" => 1,
    sq => 1,
    "sq-AL" => 1,
    "sq-MK" => 1,
    "sq-XK" => 1,
    sr => 1,
    "sr-Cyrl" => 1,
    "sr-Cyrl-BA" => 1,
    "sr-Cyrl-ME" => 1,
    "sr-Cyrl-RS" => 1,
    "sr-Cyrl-XK" => 1,
    "sr-Latn" => 1,
    "sr-Latn-BA" => 1,
    "sr-Latn-ME" => 1,
    "sr-Latn-RS" => 1,
    "sr-Latn-XK" => 1,
    sv => 1,
    "sv-AX" => 1,
    "sv-FI" => 1,
    "sv-SE" => 1,
    sw => 1,
    "sw-CD" => 1,
    "sw-KE" => 1,
    "sw-TZ" => 1,
    "sw-UG" => 1,
    ta => 1,
    "ta-IN" => 1,
    "ta-LK" => 1,
    "ta-MY" => 1,
    "ta-SG" => 1,
    te => 1,
    "te-IN" => 1,
    teo => 1,
    "teo-KE" => 1,
    "teo-UG" => 1,
    tg => 1,
    "tg-TJ" => 1,
    th => 1,
    "th-TH" => 1,
    ti => 1,
    "ti-ER" => 1,
    "ti-ET" => 1,
    tk => 1,
    "tk-TM" => 1,
    to => 1,
    "to-TO" => 1,
    tr => 1,
    "tr-CY" => 1,
    "tr-TR" => 1,
    tt => 1,
    "tt-RU" => 1,
    twq => 1,
    "twq-NE" => 1,
    tzm => 1,
    "tzm-MA" => 1,
    ug => 1,
    "ug-CN" => 1,
    uk => 1,
    "uk-UA" => 1,
    ur => 1,
    "ur-IN" => 1,
    "ur-PK" => 1,
    uz => 1,
    "uz-Arab" => 1,
    "uz-Arab-AF" => 1,
    "uz-Cyrl" => 1,
    "uz-Cyrl-UZ" => 1,
    "uz-Latn" => 1,
    "uz-Latn-UZ" => 1,
    vai => 1,
    "vai-Latn" => 1,
    "vai-Latn-LR" => 1,
    "vai-Vaii" => 1,
    "vai-Vaii-LR" => 1,
    vi => 1,
    "vi-VN" => 1,
    vo => 1,
    "vo-001" => 1,
    vun => 1,
    "vun-TZ" => 1,
    wae => 1,
    "wae-CH" => 1,
    wo => 1,
    "wo-SN" => 1,
    xh => 1,
    "xh-ZA" => 1,
    xog => 1,
    "xog-UG" => 1,
    yav => 1,
    "yav-CM" => 1,
    yi => 1,
    "yi-001" => 1,
    yo => 1,
    "yo-BJ" => 1,
    "yo-NG" => 1,
    yue => 1,
    "yue-Hans" => 1,
    "yue-Hans-CN" => 1,
    "yue-Hant" => 1,
    "yue-Hant-HK" => 1,
    zgh => 1,
    "zgh-MA" => 1,
    zh => 1,
    "zh-Hans" => 1,
    "zh-Hans-CN" => 1,
    "zh-Hans-HK" => 1,
    "zh-Hans-MO" => 1,
    "zh-Hans-SG" => 1,
    "zh-Hant" => 1,
    "zh-Hant-HK" => 1,
    "zh-Hant-MO" => 1,
    "zh-Hant-TW" => 1,
    zu => 1,
    "zu-ZA" => 1,
  );
  ### :end Codes:
  #>>>
  
  #<<<
  ### :start Names:
  our %Names = (
    Afrikaans => "af",
    "Afrikaans Namibia" => "af-NA",
    "Afrikaans South Africa" => "af-ZA",
    Aghem => "agq",
    "Aghem Cameroon" => "agq-CM",
    Akan => "ak",
    "Akan Ghana" => "ak-GH",
    Albanian => "sq",
    "Albanian Albania" => "sq-AL",
    "Albanian Kosovo" => "sq-XK",
    "Albanian North Macedonia" => "sq-MK",
    Amharic => "am",
    "Amharic Ethiopia" => "am-ET",
    Arabic => "ar",
    "Arabic Algeria" => "ar-DZ",
    "Arabic Bahrain" => "ar-BH",
    "Arabic Chad" => "ar-TD",
    "Arabic Comoros" => "ar-KM",
    "Arabic Djibouti" => "ar-DJ",
    "Arabic Egypt" => "ar-EG",
    "Arabic Eritrea" => "ar-ER",
    "Arabic Iraq" => "ar-IQ",
    "Arabic Israel" => "ar-IL",
    "Arabic Jordan" => "ar-JO",
    "Arabic Kuwait" => "ar-KW",
    "Arabic Lebanon" => "ar-LB",
    "Arabic Libya" => "ar-LY",
    "Arabic Mauritania" => "ar-MR",
    "Arabic Morocco" => "ar-MA",
    "Arabic Oman" => "ar-OM",
    "Arabic Palestinian Territories" => "ar-PS",
    "Arabic Qatar" => "ar-QA",
    "Arabic Saudi Arabia" => "ar-SA",
    "Arabic Somalia" => "ar-SO",
    "Arabic South Sudan" => "ar-SS",
    "Arabic Sudan" => "ar-SD",
    "Arabic Syria" => "ar-SY",
    "Arabic Tunisia" => "ar-TN",
    "Arabic United Arab Emirates" => "ar-AE",
    "Arabic Western Sahara" => "ar-EH",
    "Arabic World" => "ar-001",
    "Arabic Yemen" => "ar-YE",
    Armenian => "hy",
    "Armenian Armenia" => "hy-AM",
    Assamese => "as",
    "Assamese India" => "as-IN",
    Asturian => "ast",
    "Asturian Spain" => "ast-ES",
    Asu => "asa",
    "Asu Tanzania" => "asa-TZ",
    Azerbaijani => "az",
    "Azerbaijani Azerbaijan Cyrillic" => "az-Cyrl-AZ",
    "Azerbaijani Azerbaijan Latin" => "az-Latn-AZ",
    "Azerbaijani Cyrillic" => "az-Cyrl",
    "Azerbaijani Latin" => "az-Latn",
    Bafia => "ksf",
    "Bafia Cameroon" => "ksf-CM",
    Bambara => "bm",
    "Bambara Mali" => "bm-ML",
    Bangla => "bn",
    "Bangla Bangladesh" => "bn-BD",
    "Bangla India" => "bn-IN",
    Basaa => "bas",
    "Basaa Cameroon" => "bas-CM",
    Basque => "eu",
    "Basque Spain" => "eu-ES",
    Belarusian => "be",
    "Belarusian Belarus" => "be-BY",
    Bemba => "bem",
    "Bemba Zambia" => "bem-ZM",
    Bena => "bez",
    "Bena Tanzania" => "bez-TZ",
    Bodo => "brx",
    "Bodo India" => "brx-IN",
    Bosnian => "bs",
    "Bosnian Bosnia & Herzegovina Cyrillic" => "bs-Cyrl-BA",
    "Bosnian Bosnia & Herzegovina Latin" => "bs-Latn-BA",
    "Bosnian Cyrillic" => "bs-Cyrl",
    "Bosnian Latin" => "bs-Latn",
    Breton => "br",
    "Breton France" => "br-FR",
    Bulgarian => "bg",
    "Bulgarian Bulgaria" => "bg-BG",
    Burmese => "my",
    "Burmese Myanmar (Burma)" => "my-MM",
    Cantonese => "yue",
    "Cantonese China Simplified" => "yue-Hans-CN",
    "Cantonese Hong Kong SAR China Traditional" => "yue-Hant-HK",
    "Cantonese Simplified" => "yue-Hans",
    "Cantonese Traditional" => "yue-Hant",
    Catalan => "ca",
    "Catalan Andorra" => "ca-AD",
    "Catalan France" => "ca-FR",
    "Catalan Italy" => "ca-IT",
    "Catalan Spain" => "ca-ES",
    "Catalan Spain Valencian" => "ca-ES-VALENCIA",
    Cebuano => "ceb",
    "Cebuano Philippines" => "ceb-PH",
    "Central Atlas Tamazight" => "tzm",
    "Central Atlas Tamazight Morocco" => "tzm-MA",
    "Central Kurdish" => "ckb",
    "Central Kurdish Iran" => "ckb-IR",
    "Central Kurdish Iraq" => "ckb-IQ",
    Chakma => "ccp",
    "Chakma Bangladesh" => "ccp-BD",
    "Chakma India" => "ccp-IN",
    Chechen => "ce",
    "Chechen Russia" => "ce-RU",
    Cherokee => "chr",
    "Cherokee United States" => "chr-US",
    Chiga => "cgg",
    "Chiga Uganda" => "cgg-UG",
    Chinese => "zh",
    "Chinese China Simplified" => "zh-Hans-CN",
    "Chinese Hong Kong SAR China Simplified" => "zh-Hans-HK",
    "Chinese Hong Kong SAR China Traditional" => "zh-Hant-HK",
    "Chinese Macao SAR China Simplified" => "zh-Hans-MO",
    "Chinese Macao SAR China Traditional" => "zh-Hant-MO",
    "Chinese Simplified" => "zh-Hans",
    "Chinese Singapore Simplified" => "zh-Hans-SG",
    "Chinese Taiwan Traditional" => "zh-Hant-TW",
    "Chinese Traditional" => "zh-Hant",
    "Church Slavic" => "cu",
    "Church Slavic Russia" => "cu-RU",
    Colognian => "ksh",
    "Colognian Germany" => "ksh-DE",
    Cornish => "kw",
    "Cornish United Kingdom" => "kw-GB",
    Croatian => "hr",
    "Croatian Bosnia & Herzegovina" => "hr-BA",
    "Croatian Croatia" => "hr-HR",
    Czech => "cs",
    "Czech Czechia" => "cs-CZ",
    Danish => "da",
    "Danish Denmark" => "da-DK",
    "Danish Greenland" => "da-GL",
    Duala => "dua",
    "Duala Cameroon" => "dua-CM",
    Dutch => "nl",
    "Dutch Aruba" => "nl-AW",
    "Dutch Belgium" => "nl-BE",
    "Dutch Caribbean Netherlands" => "nl-BQ",
    "Dutch Cura\N{U+00e7}ao" => "nl-CW",
    "Dutch Netherlands" => "nl-NL",
    "Dutch Sint Maarten" => "nl-SX",
    "Dutch Suriname" => "nl-SR",
    Dzongkha => "dz",
    "Dzongkha Bhutan" => "dz-BT",
    Embu => "ebu",
    "Embu Kenya" => "ebu-KE",
    English => "en",
    "English American Samoa" => "en-AS",
    "English Anguilla" => "en-AI",
    "English Antigua & Barbuda" => "en-AG",
    "English Australia" => "en-AU",
    "English Austria" => "en-AT",
    "English Bahamas" => "en-BS",
    "English Barbados" => "en-BB",
    "English Belgium" => "en-BE",
    "English Belize" => "en-BZ",
    "English Bermuda" => "en-BM",
    "English Botswana" => "en-BW",
    "English British Indian Ocean Territory" => "en-IO",
    "English British Virgin Islands" => "en-VG",
    "English Burundi" => "en-BI",
    "English Cameroon" => "en-CM",
    "English Canada" => "en-CA",
    "English Cayman Islands" => "en-KY",
    "English Christmas Island" => "en-CX",
    "English Cocos (Keeling) Islands" => "en-CC",
    "English Cook Islands" => "en-CK",
    "English Cyprus" => "en-CY",
    "English Denmark" => "en-DK",
    "English Diego Garcia" => "en-DG",
    "English Dominica" => "en-DM",
    "English Eritrea" => "en-ER",
    "English Eswatini" => "en-SZ",
    "English Europe" => "en-150",
    "English Falkland Islands" => "en-FK",
    "English Fiji" => "en-FJ",
    "English Finland" => "en-FI",
    "English Gambia" => "en-GM",
    "English Germany" => "en-DE",
    "English Ghana" => "en-GH",
    "English Gibraltar" => "en-GI",
    "English Grenada" => "en-GD",
    "English Guam" => "en-GU",
    "English Guernsey" => "en-GG",
    "English Guyana" => "en-GY",
    "English Hong Kong SAR China" => "en-HK",
    "English India" => "en-IN",
    "English Ireland" => "en-IE",
    "English Isle of Man" => "en-IM",
    "English Israel" => "en-IL",
    "English Jamaica" => "en-JM",
    "English Jersey" => "en-JE",
    "English Kenya" => "en-KE",
    "English Kiribati" => "en-KI",
    "English Lesotho" => "en-LS",
    "English Liberia" => "en-LR",
    "English Macao SAR China" => "en-MO",
    "English Madagascar" => "en-MG",
    "English Malawi" => "en-MW",
    "English Malaysia" => "en-MY",
    "English Malta" => "en-MT",
    "English Marshall Islands" => "en-MH",
    "English Mauritius" => "en-MU",
    "English Micronesia" => "en-FM",
    "English Montserrat" => "en-MS",
    "English Namibia" => "en-NA",
    "English Nauru" => "en-NR",
    "English Netherlands" => "en-NL",
    "English New Zealand" => "en-NZ",
    "English Nigeria" => "en-NG",
    "English Niue" => "en-NU",
    "English Norfolk Island" => "en-NF",
    "English Northern Mariana Islands" => "en-MP",
    "English Pakistan" => "en-PK",
    "English Palau" => "en-PW",
    "English Papua New Guinea" => "en-PG",
    "English Philippines" => "en-PH",
    "English Pitcairn Islands" => "en-PN",
    "English Puerto Rico" => "en-PR",
    "English Rwanda" => "en-RW",
    "English Samoa" => "en-WS",
    "English Seychelles" => "en-SC",
    "English Sierra Leone" => "en-SL",
    "English Singapore" => "en-SG",
    "English Sint Maarten" => "en-SX",
    "English Slovenia" => "en-SI",
    "English Solomon Islands" => "en-SB",
    "English South Africa" => "en-ZA",
    "English South Sudan" => "en-SS",
    "English St. Helena" => "en-SH",
    "English St. Kitts & Nevis" => "en-KN",
    "English St. Lucia" => "en-LC",
    "English St. Vincent & Grenadines" => "en-VC",
    "English Sudan" => "en-SD",
    "English Sweden" => "en-SE",
    "English Switzerland" => "en-CH",
    "English Tanzania" => "en-TZ",
    "English Tokelau" => "en-TK",
    "English Tonga" => "en-TO",
    "English Trinidad & Tobago" => "en-TT",
    "English Turks & Caicos Islands" => "en-TC",
    "English Tuvalu" => "en-TV",
    "English U.S. Outlying Islands" => "en-UM",
    "English U.S. Virgin Islands" => "en-VI",
    "English Uganda" => "en-UG",
    "English United Arab Emirates" => "en-AE",
    "English United Kingdom" => "en-GB",
    "English United States" => "en-US",
    "English United States Computer" => "en-US-POSIX",
    "English Vanuatu" => "en-VU",
    "English World" => "en-001",
    "English Zambia" => "en-ZM",
    "English Zimbabwe" => "en-ZW",
    Esperanto => "eo",
    "Esperanto World" => "eo-001",
    Estonian => "et",
    "Estonian Estonia" => "et-EE",
    Ewe => "ee",
    "Ewe Ghana" => "ee-GH",
    "Ewe Togo" => "ee-TG",
    Ewondo => "ewo",
    "Ewondo Cameroon" => "ewo-CM",
    Faroese => "fo",
    "Faroese Denmark" => "fo-DK",
    "Faroese Faroe Islands" => "fo-FO",
    Filipino => "fil",
    "Filipino Philippines" => "fil-PH",
    Finnish => "fi",
    "Finnish Finland" => "fi-FI",
    French => "fr",
    "French Algeria" => "fr-DZ",
    "French Belgium" => "fr-BE",
    "French Benin" => "fr-BJ",
    "French Burkina Faso" => "fr-BF",
    "French Burundi" => "fr-BI",
    "French Cameroon" => "fr-CM",
    "French Canada" => "fr-CA",
    "French Central African Republic" => "fr-CF",
    "French Chad" => "fr-TD",
    "French Comoros" => "fr-KM",
    "French Congo - Brazzaville" => "fr-CG",
    "French Congo - Kinshasa" => "fr-CD",
    "French C\N{U+00f4}te d\N{U+2019}Ivoire" => "fr-CI",
    "French Djibouti" => "fr-DJ",
    "French Equatorial Guinea" => "fr-GQ",
    "French France" => "fr-FR",
    "French French Guiana" => "fr-GF",
    "French French Polynesia" => "fr-PF",
    "French Gabon" => "fr-GA",
    "French Guadeloupe" => "fr-GP",
    "French Guinea" => "fr-GN",
    "French Haiti" => "fr-HT",
    "French Luxembourg" => "fr-LU",
    "French Madagascar" => "fr-MG",
    "French Mali" => "fr-ML",
    "French Martinique" => "fr-MQ",
    "French Mauritania" => "fr-MR",
    "French Mauritius" => "fr-MU",
    "French Mayotte" => "fr-YT",
    "French Monaco" => "fr-MC",
    "French Morocco" => "fr-MA",
    "French New Caledonia" => "fr-NC",
    "French Niger" => "fr-NE",
    "French Rwanda" => "fr-RW",
    "French R\N{U+00e9}union" => "fr-RE",
    "French Senegal" => "fr-SN",
    "French Seychelles" => "fr-SC",
    "French St. Barth\N{U+00e9}lemy" => "fr-BL",
    "French St. Martin" => "fr-MF",
    "French St. Pierre & Miquelon" => "fr-PM",
    "French Switzerland" => "fr-CH",
    "French Syria" => "fr-SY",
    "French Togo" => "fr-TG",
    "French Tunisia" => "fr-TN",
    "French Vanuatu" => "fr-VU",
    "French Wallis & Futuna" => "fr-WF",
    Friulian => "fur",
    "Friulian Italy" => "fur-IT",
    Fulah => "ff",
    "Fulah Burkina Faso Latin" => "ff-Latn-BF",
    "Fulah Cameroon Latin" => "ff-Latn-CM",
    "Fulah Gambia Latin" => "ff-Latn-GM",
    "Fulah Ghana Latin" => "ff-Latn-GH",
    "Fulah Guinea Latin" => "ff-Latn-GN",
    "Fulah Guinea-Bissau Latin" => "ff-Latn-GW",
    "Fulah Latin" => "ff-Latn",
    "Fulah Liberia Latin" => "ff-Latn-LR",
    "Fulah Mauritania Latin" => "ff-Latn-MR",
    "Fulah Niger Latin" => "ff-Latn-NE",
    "Fulah Nigeria Latin" => "ff-Latn-NG",
    "Fulah Senegal Latin" => "ff-Latn-SN",
    "Fulah Sierra Leone Latin" => "ff-Latn-SL",
    Galician => "gl",
    "Galician Spain" => "gl-ES",
    Ganda => "lg",
    "Ganda Uganda" => "lg-UG",
    Georgian => "ka",
    "Georgian Georgia" => "ka-GE",
    German => "de",
    "German Austria" => "de-AT",
    "German Belgium" => "de-BE",
    "German Germany" => "de-DE",
    "German Italy" => "de-IT",
    "German Liechtenstein" => "de-LI",
    "German Luxembourg" => "de-LU",
    "German Switzerland" => "de-CH",
    Greek => "el",
    "Greek Cyprus" => "el-CY",
    "Greek Greece" => "el-GR",
    Gujarati => "gu",
    "Gujarati India" => "gu-IN",
    Gusii => "guz",
    "Gusii Kenya" => "guz-KE",
    Hausa => "ha",
    "Hausa Ghana" => "ha-GH",
    "Hausa Niger" => "ha-NE",
    "Hausa Nigeria" => "ha-NG",
    Hawaiian => "haw",
    "Hawaiian United States" => "haw-US",
    Hebrew => "he",
    "Hebrew Israel" => "he-IL",
    Hindi => "hi",
    "Hindi India" => "hi-IN",
    Hungarian => "hu",
    "Hungarian Hungary" => "hu-HU",
    Icelandic => "is",
    "Icelandic Iceland" => "is-IS",
    Igbo => "ig",
    "Igbo Nigeria" => "ig-NG",
    "Inari Sami" => "smn",
    "Inari Sami Finland" => "smn-FI",
    Indonesian => "id",
    "Indonesian Indonesia" => "id-ID",
    Interlingua => "ia",
    "Interlingua World" => "ia-001",
    Irish => "ga",
    "Irish Ireland" => "ga-IE",
    Italian => "it",
    "Italian Italy" => "it-IT",
    "Italian San Marino" => "it-SM",
    "Italian Switzerland" => "it-CH",
    "Italian Vatican City" => "it-VA",
    Japanese => "ja",
    "Japanese Japan" => "ja-JP",
    Javanese => "jv",
    "Javanese Indonesia" => "jv-ID",
    "Jola-Fonyi" => "dyo",
    "Jola-Fonyi Senegal" => "dyo-SN",
    Kabuverdianu => "kea",
    "Kabuverdianu Cape Verde" => "kea-CV",
    Kabyle => "kab",
    "Kabyle Algeria" => "kab-DZ",
    Kako => "kkj",
    "Kako Cameroon" => "kkj-CM",
    Kalaallisut => "kl",
    "Kalaallisut Greenland" => "kl-GL",
    Kalenjin => "kln",
    "Kalenjin Kenya" => "kln-KE",
    Kamba => "kam",
    "Kamba Kenya" => "kam-KE",
    Kannada => "kn",
    "Kannada India" => "kn-IN",
    Kashmiri => "ks",
    "Kashmiri India" => "ks-IN",
    Kazakh => "kk",
    "Kazakh Kazakhstan" => "kk-KZ",
    Khmer => "km",
    "Khmer Cambodia" => "km-KH",
    Kikuyu => "ki",
    "Kikuyu Kenya" => "ki-KE",
    Kinyarwanda => "rw",
    "Kinyarwanda Rwanda" => "rw-RW",
    Konkani => "kok",
    "Konkani India" => "kok-IN",
    Korean => "ko",
    "Korean North Korea" => "ko-KP",
    "Korean South Korea" => "ko-KR",
    "Koyra Chiini" => "khq",
    "Koyra Chiini Mali" => "khq-ML",
    "Koyraboro Senni" => "ses",
    "Koyraboro Senni Mali" => "ses-ML",
    Kurdish => "ku",
    "Kurdish Turkey" => "ku-TR",
    Kwasio => "nmg",
    "Kwasio Cameroon" => "nmg-CM",
    Kyrgyz => "ky",
    "Kyrgyz Kyrgyzstan" => "ky-KG",
    Lakota => "lkt",
    "Lakota United States" => "lkt-US",
    Langi => "lag",
    "Langi Tanzania" => "lag-TZ",
    Lao => "lo",
    "Lao Laos" => "lo-LA",
    Latvian => "lv",
    "Latvian Latvia" => "lv-LV",
    Lingala => "ln",
    "Lingala Angola" => "ln-AO",
    "Lingala Central African Republic" => "ln-CF",
    "Lingala Congo - Brazzaville" => "ln-CG",
    "Lingala Congo - Kinshasa" => "ln-CD",
    Lithuanian => "lt",
    "Lithuanian Lithuania" => "lt-LT",
    "Low German" => "nds",
    "Low German Germany" => "nds-DE",
    "Low German Netherlands" => "nds-NL",
    "Lower Sorbian" => "dsb",
    "Lower Sorbian Germany" => "dsb-DE",
    "Luba-Katanga" => "lu",
    "Luba-Katanga Congo - Kinshasa" => "lu-CD",
    Luo => "luo",
    "Luo Kenya" => "luo-KE",
    Luxembourgish => "lb",
    "Luxembourgish Luxembourg" => "lb-LU",
    Luyia => "luy",
    "Luyia Kenya" => "luy-KE",
    Macedonian => "mk",
    "Macedonian North Macedonia" => "mk-MK",
    Machame => "jmc",
    "Machame Tanzania" => "jmc-TZ",
    "Makhuwa-Meetto" => "mgh",
    "Makhuwa-Meetto Mozambique" => "mgh-MZ",
    Makonde => "kde",
    "Makonde Tanzania" => "kde-TZ",
    Malagasy => "mg",
    "Malagasy Madagascar" => "mg-MG",
    Malay => "ms",
    "Malay Brunei" => "ms-BN",
    "Malay Malaysia" => "ms-MY",
    "Malay Singapore" => "ms-SG",
    Malayalam => "ml",
    "Malayalam India" => "ml-IN",
    Maltese => "mt",
    "Maltese Malta" => "mt-MT",
    Manx => "gv",
    "Manx Isle of Man" => "gv-IM",
    Maori => "mi",
    "Maori New Zealand" => "mi-NZ",
    Marathi => "mr",
    "Marathi India" => "mr-IN",
    Masai => "mas",
    "Masai Kenya" => "mas-KE",
    "Masai Tanzania" => "mas-TZ",
    Mazanderani => "mzn",
    "Mazanderani Iran" => "mzn-IR",
    Meru => "mer",
    "Meru Kenya" => "mer-KE",
    "Meta\N{U+02bc}" => "mgo",
    "Meta\N{U+02bc} Cameroon" => "mgo-CM",
    Mongolian => "mn",
    "Mongolian Mongolia" => "mn-MN",
    Morisyen => "mfe",
    "Morisyen Mauritius" => "mfe-MU",
    Mundang => "mua",
    "Mundang Cameroon" => "mua-CM",
    Nama => "naq",
    "Nama Namibia" => "naq-NA",
    Nepali => "ne",
    "Nepali India" => "ne-IN",
    "Nepali Nepal" => "ne-NP",
    Ngiemboon => "nnh",
    "Ngiemboon Cameroon" => "nnh-CM",
    Ngomba => "jgo",
    "Ngomba Cameroon" => "jgo-CM",
    "North Ndebele" => "nd",
    "North Ndebele Zimbabwe" => "nd-ZW",
    "Northern Luri" => "lrc",
    "Northern Luri Iran" => "lrc-IR",
    "Northern Luri Iraq" => "lrc-IQ",
    "Northern Sami" => "se",
    "Northern Sami Finland" => "se-FI",
    "Northern Sami Norway" => "se-NO",
    "Northern Sami Sweden" => "se-SE",
    "Norwegian Bokm\N{U+00e5}l" => "nb",
    "Norwegian Bokm\N{U+00e5}l Norway" => "nb-NO",
    "Norwegian Bokm\N{U+00e5}l Svalbard & Jan Mayen" => "nb-SJ",
    "Norwegian Nynorsk" => "nn",
    "Norwegian Nynorsk Norway" => "nn-NO",
    Nuer => "nus",
    "Nuer South Sudan" => "nus-SS",
    Nyankole => "nyn",
    "Nyankole Uganda" => "nyn-UG",
    Odia => "or",
    "Odia India" => "or-IN",
    Oromo => "om",
    "Oromo Ethiopia" => "om-ET",
    "Oromo Kenya" => "om-KE",
    Ossetic => "os",
    "Ossetic Georgia" => "os-GE",
    "Ossetic Russia" => "os-RU",
    Pashto => "ps",
    "Pashto Afghanistan" => "ps-AF",
    "Pashto Pakistan" => "ps-PK",
    Persian => "fa",
    "Persian Afghanistan" => "fa-AF",
    "Persian Iran" => "fa-IR",
    Polish => "pl",
    "Polish Poland" => "pl-PL",
    Portuguese => "pt",
    "Portuguese Angola" => "pt-AO",
    "Portuguese Brazil" => "pt-BR",
    "Portuguese Cape Verde" => "pt-CV",
    "Portuguese Equatorial Guinea" => "pt-GQ",
    "Portuguese Guinea-Bissau" => "pt-GW",
    "Portuguese Luxembourg" => "pt-LU",
    "Portuguese Macao SAR China" => "pt-MO",
    "Portuguese Mozambique" => "pt-MZ",
    "Portuguese Portugal" => "pt-PT",
    "Portuguese Switzerland" => "pt-CH",
    "Portuguese S\N{U+00e3}o Tom\N{U+00e9} & Pr\N{U+00ed}ncipe" => "pt-ST",
    "Portuguese Timor-Leste" => "pt-TL",
    Prussian => "prg",
    "Prussian World" => "prg-001",
    Punjabi => "pa",
    "Punjabi Arabic" => "pa-Arab",
    "Punjabi Gurmukhi" => "pa-Guru",
    "Punjabi India Gurmukhi" => "pa-Guru-IN",
    "Punjabi Pakistan Arabic" => "pa-Arab-PK",
    Quechua => "qu",
    "Quechua Bolivia" => "qu-BO",
    "Quechua Ecuador" => "qu-EC",
    "Quechua Peru" => "qu-PE",
    Romanian => "ro",
    "Romanian Moldova" => "ro-MD",
    "Romanian Romania" => "ro-RO",
    Romansh => "rm",
    "Romansh Switzerland" => "rm-CH",
    Rombo => "rof",
    "Rombo Tanzania" => "rof-TZ",
    Root => "root",
    Rundi => "rn",
    "Rundi Burundi" => "rn-BI",
    Russian => "ru",
    "Russian Belarus" => "ru-BY",
    "Russian Kazakhstan" => "ru-KZ",
    "Russian Kyrgyzstan" => "ru-KG",
    "Russian Moldova" => "ru-MD",
    "Russian Russia" => "ru-RU",
    "Russian Ukraine" => "ru-UA",
    Rwa => "rwk",
    "Rwa Tanzania" => "rwk-TZ",
    Sakha => "sah",
    "Sakha Russia" => "sah-RU",
    Samburu => "saq",
    "Samburu Kenya" => "saq-KE",
    Sango => "sg",
    "Sango Central African Republic" => "sg-CF",
    Sangu => "sbp",
    "Sangu Tanzania" => "sbp-TZ",
    "Scottish Gaelic" => "gd",
    "Scottish Gaelic United Kingdom" => "gd-GB",
    Sena => "seh",
    "Sena Mozambique" => "seh-MZ",
    Serbian => "sr",
    "Serbian Bosnia & Herzegovina Cyrillic" => "sr-Cyrl-BA",
    "Serbian Bosnia & Herzegovina Latin" => "sr-Latn-BA",
    "Serbian Cyrillic" => "sr-Cyrl",
    "Serbian Kosovo Cyrillic" => "sr-Cyrl-XK",
    "Serbian Kosovo Latin" => "sr-Latn-XK",
    "Serbian Latin" => "sr-Latn",
    "Serbian Montenegro Cyrillic" => "sr-Cyrl-ME",
    "Serbian Montenegro Latin" => "sr-Latn-ME",
    "Serbian Serbia Cyrillic" => "sr-Cyrl-RS",
    "Serbian Serbia Latin" => "sr-Latn-RS",
    Shambala => "ksb",
    "Shambala Tanzania" => "ksb-TZ",
    Shona => "sn",
    "Shona Zimbabwe" => "sn-ZW",
    "Sichuan Yi" => "ii",
    "Sichuan Yi China" => "ii-CN",
    Sindhi => "sd",
    "Sindhi Pakistan" => "sd-PK",
    Sinhala => "si",
    "Sinhala Sri Lanka" => "si-LK",
    Slovak => "sk",
    "Slovak Slovakia" => "sk-SK",
    Slovenian => "sl",
    "Slovenian Slovenia" => "sl-SI",
    Soga => "xog",
    "Soga Uganda" => "xog-UG",
    Somali => "so",
    "Somali Djibouti" => "so-DJ",
    "Somali Ethiopia" => "so-ET",
    "Somali Kenya" => "so-KE",
    "Somali Somalia" => "so-SO",
    Spanish => "es",
    "Spanish Argentina" => "es-AR",
    "Spanish Belize" => "es-BZ",
    "Spanish Bolivia" => "es-BO",
    "Spanish Brazil" => "es-BR",
    "Spanish Canary Islands" => "es-IC",
    "Spanish Ceuta & Melilla" => "es-EA",
    "Spanish Chile" => "es-CL",
    "Spanish Colombia" => "es-CO",
    "Spanish Costa Rica" => "es-CR",
    "Spanish Cuba" => "es-CU",
    "Spanish Dominican Republic" => "es-DO",
    "Spanish Ecuador" => "es-EC",
    "Spanish El Salvador" => "es-SV",
    "Spanish Equatorial Guinea" => "es-GQ",
    "Spanish Guatemala" => "es-GT",
    "Spanish Honduras" => "es-HN",
    "Spanish Latin America" => "es-419",
    "Spanish Mexico" => "es-MX",
    "Spanish Nicaragua" => "es-NI",
    "Spanish Panama" => "es-PA",
    "Spanish Paraguay" => "es-PY",
    "Spanish Peru" => "es-PE",
    "Spanish Philippines" => "es-PH",
    "Spanish Puerto Rico" => "es-PR",
    "Spanish Spain" => "es-ES",
    "Spanish United States" => "es-US",
    "Spanish Uruguay" => "es-UY",
    "Spanish Venezuela" => "es-VE",
    "Standard Moroccan Tamazight" => "zgh",
    "Standard Moroccan Tamazight Morocco" => "zgh-MA",
    Swahili => "sw",
    "Swahili Congo - Kinshasa" => "sw-CD",
    "Swahili Kenya" => "sw-KE",
    "Swahili Tanzania" => "sw-TZ",
    "Swahili Uganda" => "sw-UG",
    Swedish => "sv",
    "Swedish Finland" => "sv-FI",
    "Swedish Sweden" => "sv-SE",
    "Swedish \N{U+00c5}land Islands" => "sv-AX",
    "Swiss German" => "gsw",
    "Swiss German France" => "gsw-FR",
    "Swiss German Liechtenstein" => "gsw-LI",
    "Swiss German Switzerland" => "gsw-CH",
    Tachelhit => "shi",
    "Tachelhit Latin" => "shi-Latn",
    "Tachelhit Morocco Latin" => "shi-Latn-MA",
    "Tachelhit Morocco Tifinagh" => "shi-Tfng-MA",
    "Tachelhit Tifinagh" => "shi-Tfng",
    Taita => "dav",
    "Taita Kenya" => "dav-KE",
    Tajik => "tg",
    "Tajik Tajikistan" => "tg-TJ",
    Tamil => "ta",
    "Tamil India" => "ta-IN",
    "Tamil Malaysia" => "ta-MY",
    "Tamil Singapore" => "ta-SG",
    "Tamil Sri Lanka" => "ta-LK",
    Tasawaq => "twq",
    "Tasawaq Niger" => "twq-NE",
    Tatar => "tt",
    "Tatar Russia" => "tt-RU",
    Telugu => "te",
    "Telugu India" => "te-IN",
    Teso => "teo",
    "Teso Kenya" => "teo-KE",
    "Teso Uganda" => "teo-UG",
    Thai => "th",
    "Thai Thailand" => "th-TH",
    Tibetan => "bo",
    "Tibetan China" => "bo-CN",
    "Tibetan India" => "bo-IN",
    Tigrinya => "ti",
    "Tigrinya Eritrea" => "ti-ER",
    "Tigrinya Ethiopia" => "ti-ET",
    Tongan => "to",
    "Tongan Tonga" => "to-TO",
    Turkish => "tr",
    "Turkish Cyprus" => "tr-CY",
    "Turkish Turkey" => "tr-TR",
    Turkmen => "tk",
    "Turkmen Turkmenistan" => "tk-TM",
    Ukrainian => "uk",
    "Ukrainian Ukraine" => "uk-UA",
    "Upper Sorbian" => "hsb",
    "Upper Sorbian Germany" => "hsb-DE",
    Urdu => "ur",
    "Urdu India" => "ur-IN",
    "Urdu Pakistan" => "ur-PK",
    Uyghur => "ug",
    "Uyghur China" => "ug-CN",
    Uzbek => "uz",
    "Uzbek Afghanistan Arabic" => "uz-Arab-AF",
    "Uzbek Arabic" => "uz-Arab",
    "Uzbek Cyrillic" => "uz-Cyrl",
    "Uzbek Latin" => "uz-Latn",
    "Uzbek Uzbekistan Cyrillic" => "uz-Cyrl-UZ",
    "Uzbek Uzbekistan Latin" => "uz-Latn-UZ",
    Vai => "vai",
    "Vai Latin" => "vai-Latn",
    "Vai Liberia Latin" => "vai-Latn-LR",
    "Vai Liberia Vai" => "vai-Vaii-LR",
    "Vai Vai" => "vai-Vaii",
    Vietnamese => "vi",
    "Vietnamese Vietnam" => "vi-VN",
    "Volap\N{U+00fc}k" => "vo",
    "Volap\N{U+00fc}k World" => "vo-001",
    Vunjo => "vun",
    "Vunjo Tanzania" => "vun-TZ",
    Walser => "wae",
    "Walser Switzerland" => "wae-CH",
    Welsh => "cy",
    "Welsh United Kingdom" => "cy-GB",
    "Western Frisian" => "fy",
    "Western Frisian Netherlands" => "fy-NL",
    Wolof => "wo",
    "Wolof Senegal" => "wo-SN",
    Xhosa => "xh",
    "Xhosa South Africa" => "xh-ZA",
    Yangben => "yav",
    "Yangben Cameroon" => "yav-CM",
    Yiddish => "yi",
    "Yiddish World" => "yi-001",
    Yoruba => "yo",
    "Yoruba Benin" => "yo-BJ",
    "Yoruba Nigeria" => "yo-NG",
    Zarma => "dje",
    "Zarma Niger" => "dje-NE",
    Zulu => "zu",
    "Zulu South Africa" => "zu-ZA",
  );
  ### :end Names:
  #>>>
  
  #<<<
  ### :start NativeNames:
  our %NativeNames = (
    Afrikaans => "af",
    "Afrikaans Namibi\N{U+00eb}" => "af-NA",
    "Afrikaans Suid-Afrika" => "af-ZA",
    Aghem => "agq",
    "Aghem K\N{U+00e0}m\N{U+00e0}l\N{U+00fb}\N{U+014b}" => "agq-CM",
    Akan => "ak",
    "Akan Gaana" => "ak-GH",
    "As\N{U+1ee5}s\N{U+1ee5} Igbo" => "ig",
    "As\N{U+1ee5}s\N{U+1ee5} Igbo Na\N{U+1ecb}j\N{U+1ecb}r\N{U+1ecb}a" => "ig-NG",
    Cebuano => "ceb",
    "Cebuano Pilipinas" => "ceb-PH",
    Chimakonde => "kde",
    "Chimakonde Tanzania" => "kde-TZ",
    Cymraeg => "cy",
    "Cymraeg Y Deyrnas Unedig" => "cy-GB",
    Deutsch => "de",
    "Deutsch Belgien" => "de-BE",
    "Deutsch Deutschland" => "de-DE",
    "Deutsch Italien" => "de-IT",
    "Deutsch Liechtenstein" => "de-LI",
    "Deutsch Luxemburg" => "de-LU",
    "Deutsch Schweiz" => "de-CH",
    "Deutsch \N{U+00d6}sterreich" => "de-AT",
    Dholuo => "luo",
    "Dholuo Kenya" => "luo-KE",
    Ekegusii => "guz",
    "Ekegusii Kenya" => "guz-KE",
    English => "en",
    "English American Samoa" => "en-AS",
    "English Anguilla" => "en-AI",
    "English Antigua & Barbuda" => "en-AG",
    "English Australia" => "en-AU",
    "English Austria" => "en-AT",
    "English Bahamas" => "en-BS",
    "English Barbados" => "en-BB",
    "English Belgium" => "en-BE",
    "English Belize" => "en-BZ",
    "English Bermuda" => "en-BM",
    "English Botswana" => "en-BW",
    "English British Indian Ocean Territory" => "en-IO",
    "English British Virgin Islands" => "en-VG",
    "English Burundi" => "en-BI",
    "English Cameroon" => "en-CM",
    "English Canada" => "en-CA",
    "English Cayman Islands" => "en-KY",
    "English Christmas Island" => "en-CX",
    "English Cocos (Keeling) Islands" => "en-CC",
    "English Cook Islands" => "en-CK",
    "English Cyprus" => "en-CY",
    "English Denmark" => "en-DK",
    "English Diego Garcia" => "en-DG",
    "English Dominica" => "en-DM",
    "English Eritrea" => "en-ER",
    "English Eswatini" => "en-SZ",
    "English Europe" => "en-150",
    "English Falkland Islands" => "en-FK",
    "English Fiji" => "en-FJ",
    "English Finland" => "en-FI",
    "English Gambia" => "en-GM",
    "English Germany" => "en-DE",
    "English Ghana" => "en-GH",
    "English Gibraltar" => "en-GI",
    "English Grenada" => "en-GD",
    "English Guam" => "en-GU",
    "English Guernsey" => "en-GG",
    "English Guyana" => "en-GY",
    "English Hong Kong SAR China" => "en-HK",
    "English India" => "en-IN",
    "English Ireland" => "en-IE",
    "English Isle of Man" => "en-IM",
    "English Israel" => "en-IL",
    "English Jamaica" => "en-JM",
    "English Jersey" => "en-JE",
    "English Kenya" => "en-KE",
    "English Kiribati" => "en-KI",
    "English Lesotho" => "en-LS",
    "English Liberia" => "en-LR",
    "English Macao SAR China" => "en-MO",
    "English Madagascar" => "en-MG",
    "English Malawi" => "en-MW",
    "English Malaysia" => "en-MY",
    "English Malta" => "en-MT",
    "English Marshall Islands" => "en-MH",
    "English Mauritius" => "en-MU",
    "English Micronesia" => "en-FM",
    "English Montserrat" => "en-MS",
    "English Namibia" => "en-NA",
    "English Nauru" => "en-NR",
    "English Netherlands" => "en-NL",
    "English New Zealand" => "en-NZ",
    "English Nigeria" => "en-NG",
    "English Niue" => "en-NU",
    "English Norfolk Island" => "en-NF",
    "English Northern Mariana Islands" => "en-MP",
    "English Pakistan" => "en-PK",
    "English Palau" => "en-PW",
    "English Papua New Guinea" => "en-PG",
    "English Philippines" => "en-PH",
    "English Pitcairn Islands" => "en-PN",
    "English Puerto Rico" => "en-PR",
    "English Rwanda" => "en-RW",
    "English Samoa" => "en-WS",
    "English Seychelles" => "en-SC",
    "English Sierra Leone" => "en-SL",
    "English Singapore" => "en-SG",
    "English Sint Maarten" => "en-SX",
    "English Slovenia" => "en-SI",
    "English Solomon Islands" => "en-SB",
    "English South Africa" => "en-ZA",
    "English South Sudan" => "en-SS",
    "English St. Helena" => "en-SH",
    "English St. Kitts & Nevis" => "en-KN",
    "English St. Lucia" => "en-LC",
    "English St. Vincent & Grenadines" => "en-VC",
    "English Sudan" => "en-SD",
    "English Sweden" => "en-SE",
    "English Switzerland" => "en-CH",
    "English Tanzania" => "en-TZ",
    "English Tokelau" => "en-TK",
    "English Tonga" => "en-TO",
    "English Trinidad & Tobago" => "en-TT",
    "English Turks & Caicos Islands" => "en-TC",
    "English Tuvalu" => "en-TV",
    "English U.S. Outlying Islands" => "en-UM",
    "English U.S. Virgin Islands" => "en-VI",
    "English Uganda" => "en-UG",
    "English United Arab Emirates" => "en-AE",
    "English United Kingdom" => "en-GB",
    "English United States" => "en-US",
    "English United States Computer" => "en-US-POSIX",
    "English Vanuatu" => "en-VU",
    "English World" => "en-001",
    "English Zambia" => "en-ZM",
    "English Zimbabwe" => "en-ZW",
    "E\N{U+028b}egbe" => "ee",
    "E\N{U+028b}egbe Ghana nutome" => "ee-GH",
    "E\N{U+028b}egbe Togo nutome" => "ee-TG",
    Filipino => "fil",
    "Filipino Pilipinas" => "fil-PH",
    Frysk => "fy",
    "Frysk Nederl\N{U+00e2}n" => "fy-NL",
    Gaeilge => "ga",
    "Gaeilge \N{U+00c9}ire" => "ga-IE",
    Gaelg => "gv",
    "Gaelg Ellan Vannin" => "gv-IM",
    Gikuyu => "ki",
    "Gikuyu Kenya" => "ki-KE",
    "G\N{U+00e0}idhlig" => "gd",
    "G\N{U+00e0}idhlig An R\N{U+00ec}oghachd Aonaichte" => "gd-GB",
    Hausa => "ha",
    "Hausa Gana" => "ha-GH",
    "Hausa Najeriya" => "ha-NG",
    "Hausa Nijar" => "ha-NE",
    Hibena => "bez",
    "Hibena Hutanzania" => "bez-TZ",
    Ichibemba => "bem",
    "Ichibemba Zambia" => "bem-ZM",
    Ikirundi => "rn",
    "Ikirundi Uburundi" => "rn-BI",
    Indonesia => "id",
    "Indonesia Indonesia" => "id-ID",
    Ishisangu => "sbp",
    "Ishisangu Tansaniya" => "sbp-TZ",
    Jawa => "jv",
    "Jawa Indon\N{U+00e9}sia" => "jv-ID",
    Kalenjin => "kln",
    "Kalenjin Emetab Kenya" => "kln-KE",
    Khoekhoegowab => "naq",
    "Khoekhoegowab Namibiab" => "naq-NA",
    Kihorombo => "rof",
    "Kihorombo Tanzania" => "rof-TZ",
    Kikamba => "kam",
    "Kikamba Kenya" => "kam-KE",
    Kimachame => "jmc",
    "Kimachame Tanzania" => "jmc-TZ",
    Kinyarwanda => "rw",
    "Kinyarwanda U Rwanda" => "rw-RW",
    Kipare => "asa",
    "Kipare Tadhania" => "asa-TZ",
    Kiruwa => "rwk",
    "Kiruwa Tanzania" => "rwk-TZ",
    Kisampur => "saq",
    "Kisampur Kenya" => "saq-KE",
    Kishambaa => "ksb",
    "Kishambaa Tanzania" => "ksb-TZ",
    Kiswahili => "sw",
    "Kiswahili Jamhuri ya Kidemokrasia ya Kongo" => "sw-CD",
    "Kiswahili Kenya" => "sw-KE",
    "Kiswahili Tanzania" => "sw-TZ",
    "Kiswahili Uganda" => "sw-UG",
    Kitaita => "dav",
    "Kitaita Kenya" => "dav-KE",
    Kiteso => "teo",
    "Kiteso Kenia" => "teo-KE",
    "Kiteso Uganda" => "teo-UG",
    "Koyra ciini" => "khq",
    "Koyra ciini Maali" => "khq-ML",
    "Koyraboro senni" => "ses",
    "Koyraboro senni Maali" => "ses-ML",
    Kyivunjo => "vun",
    "Kyivunjo Tanzania" => "vun-TZ",
    "K\N{U+00f6}lsch" => "ksh",
    "K\N{U+00f6}lsch Do\N{U+00fc}tschland" => "ksh-DE",
    "K\N{U+0129}embu" => "ebu",
    "K\N{U+0129}embu Kenya" => "ebu-KE",
    "K\N{U+0129}m\N{U+0129}r\N{U+0169}" => "mer",
    "K\N{U+0129}m\N{U+0129}r\N{U+0169} Kenya" => "mer-KE",
    "K\N{U+0268}laangi" => "lag",
    "K\N{U+0268}laangi Taansan\N{U+00ed}a" => "lag-TZ",
    "Lak\N{U+021f}\N{U+00f3}l\N{U+02bc}iyapi" => "lkt",
    "Lak\N{U+021f}\N{U+00f3}l\N{U+02bc}iyapi M\N{U+00ed}laha\N{U+014b}ska T\N{U+021f}am\N{U+00e1}k\N{U+021f}o\N{U+010d}he" => "lkt-US",
    Luganda => "lg",
    "Luganda Yuganda" => "lg-UG",
    Luluhia => "luy",
    "Luluhia Kenya" => "luy-KE",
    "L\N{U+00eb}tzebuergesch" => "lb",
    "L\N{U+00eb}tzebuergesch L\N{U+00eb}tzebuerg" => "lb-LU",
    "MUNDA\N{U+014a}" => "mua",
    "MUNDA\N{U+014a} kameru\N{U+014b}" => "mua-CM",
    Maa => "mas",
    "Maa Kenya" => "mas-KE",
    "Maa Tansania" => "mas-TZ",
    Makua => "mgh",
    "Makua Umozambiki" => "mgh-MZ",
    Malagasy => "mg",
    "Malagasy Madagasikara" => "mg-MG",
    Malti => "mt",
    "Malti Malta" => "mt-MT",
    Melayu => "ms",
    "Melayu Brunei" => "ms-BN",
    "Melayu Malaysia" => "ms-MY",
    "Melayu Singapura" => "ms-SG",
    "M\N{U+0101}ori" => "mi",
    "M\N{U+0101}ori Aotearoa" => "mi-NZ",
    "Nda\N{U+a78c}a" => "jgo",
    "Nda\N{U+a78c}a Kam\N{U+025b}l\N{U+00fb}n" => "jgo-CM",
    Nederlands => "nl",
    "Nederlands Aruba" => "nl-AW",
    "Nederlands Belgi\N{U+00eb}" => "nl-BE",
    "Nederlands Caribisch Nederland" => "nl-BQ",
    "Nederlands Cura\N{U+00e7}ao" => "nl-CW",
    "Nederlands Nederland" => "nl-NL",
    "Nederlands Sint-Maarten" => "nl-SX",
    "Nederlands Suriname" => "nl-SR",
    Olusoga => "xog",
    "Olusoga Yuganda" => "xog-UG",
    Oromoo => "om",
    "Oromoo Itoophiyaa" => "om-ET",
    "Oromoo Keeniyaa" => "om-KE",
    Pulaar => "ff",
    "Pulaar Burkibaa Faaso Latn" => "ff-Latn-BF",
    "Pulaar Gammbi Latn" => "ff-Latn-GM",
    "Pulaar Ganaa Latn" => "ff-Latn-GH",
    "Pulaar Gine Latn" => "ff-Latn-GN",
    "Pulaar Gine-Bisaawo Latn" => "ff-Latn-GW",
    "Pulaar Kameruun Latn" => "ff-Latn-CM",
    "Pulaar Latn" => "ff-Latn",
    "Pulaar Liberiyaa Latn" => "ff-Latn-LR",
    "Pulaar Muritani Latn" => "ff-Latn-MR",
    "Pulaar Nijeer Latn" => "ff-Latn-NE",
    "Pulaar Nijeriyaa Latn" => "ff-Latn-NG",
    "Pulaar Senegaal Latn" => "ff-Latn-SN",
    "Pulaar Seraa liyon Latn" => "ff-Latn-SL",
    Rukiga => "cgg",
    "Rukiga Uganda" => "cgg-UG",
    Runasimi => "qu",
    "Runasimi Bolivia" => "qu-BO",
    "Runasimi Ecuador" => "qu-EC",
    "Runasimi Per\N{U+00fa}" => "qu-PE",
    Runyankore => "nyn",
    "Runyankore Uganda" => "nyn-UG",
    "Schwiizert\N{U+00fc}\N{U+00fc}tsch" => "gsw",
    "Schwiizert\N{U+00fc}\N{U+00fc}tsch Frankriich" => "gsw-FR",
    "Schwiizert\N{U+00fc}\N{U+00fc}tsch Li\N{U+00e4}chtescht\N{U+00e4}i" => "gsw-LI",
    "Schwiizert\N{U+00fc}\N{U+00fc}tsch Schwiiz" => "gsw-CH",
    "Shw\N{U+00f3}\N{U+014b}\N{U+00f2} ngiemb\N{U+0254}\N{U+0254}n" => "nnh",
    "Shw\N{U+00f3}\N{U+014b}\N{U+00f2} ngiemb\N{U+0254}\N{U+0254}n K\N{U+00e0}mal\N{U+00fb}m" => "nnh-CM",
    Soomaali => "so",
    "Soomaali Itoobiya" => "so-ET",
    "Soomaali Jabuuti" => "so-DJ",
    "Soomaali Kenya" => "so-KE",
    "Soomaali Soomaaliya" => "so-SO",
    "S\N{U+00e4}ng\N{U+00f6}" => "sg",
    "S\N{U+00e4}ng\N{U+00f6} K\N{U+00f6}d\N{U+00f6}r\N{U+00f6}s\N{U+00ea}se t\N{U+00ee} B\N{U+00ea}afr\N{U+00ee}ka" => "sg-CF",
    "Tamazi\N{U+0263}t n la\N{U+1e6d}la\N{U+1e63}" => "tzm",
    "Tamazi\N{U+0263}t n la\N{U+1e6d}la\N{U+1e63} Me\N{U+1e5b}\N{U+1e5b}uk" => "tzm-MA",
    Taqbaylit => "kab",
    "Taqbaylit Lezzayer" => "kab-DZ",
    "Tasawaq senni" => "twq",
    "Tasawaq senni Ni\N{U+017e}er" => "twq-NE",
    "Tashel\N{U+1e25}iyt Latn" => "shi-Latn",
    "Tashel\N{U+1e25}iyt lm\N{U+0263}rib Latn" => "shi-Latn-MA",
    "Thok Nath" => "nus",
    "Thok Nath SS" => "nus-SS",
    "Ti\N{U+1ebf}ng Vi\N{U+1ec7}t" => "vi",
    "Ti\N{U+1ebf}ng Vi\N{U+1ec7}t Vi\N{U+1ec7}t Nam" => "vi-VN",
    Tshiluba => "lu",
    "Tshiluba Ditunga wa Kongu" => "lu-CD",
    "T\N{U+00fc}rk\N{U+00e7}e" => "tr",
    "T\N{U+00fc}rk\N{U+00e7}e K\N{U+0131}br\N{U+0131}s" => "tr-CY",
    "T\N{U+00fc}rk\N{U+00e7}e T\N{U+00fc}rkiye" => "tr-TR",
    "Vai Laibhiya Latn" => "vai-Latn-LR",
    "Vai Latn" => "vai-Latn",
    Walser => "wae",
    "Walser Schwiz" => "wae-CH",
    Wolof => "wo",
    "Wolof Senegaal" => "wo-SN",
    Zarmaciine => "dje",
    "Zarmaciine Ni\N{U+017e}er" => "dje-NE",
    "anar\N{U+00e2}\N{U+0161}kiel\N{U+00e2}" => "smn",
    "anar\N{U+00e2}\N{U+0161}kiel\N{U+00e2} Suom\N{U+00e2}" => "smn-FI",
    asturianu => "ast",
    "asturianu Espa\N{U+00f1}a" => "ast-ES",
    "az\N{U+0259}rbaycan" => "az",
    "az\N{U+0259}rbaycan Az\N{U+0259}rbaycan lat\N{U+0131}n" => "az-Latn-AZ",
    "az\N{U+0259}rbaycan lat\N{U+0131}n" => "az-Latn",
    bamanakan => "bm",
    "bamanakan Mali" => "bm-ML",
    bosanski => "bs",
    "bosanski Bosna i Hercegovina latinica" => "bs-Latn-BA",
    "bosanski latinica" => "bs-Latn",
    brezhoneg => "br",
    "brezhoneg Fra\N{U+00f1}s" => "br-FR",
    "catal\N{U+00e0}" => "ca",
    "catal\N{U+00e0} Andorra" => "ca-AD",
    "catal\N{U+00e0} Espanya" => "ca-ES",
    "catal\N{U+00e0} Espanya valenci\N{U+00e0}" => "ca-ES-VALENCIA",
    "catal\N{U+00e0} Fran\N{U+00e7}a" => "ca-FR",
    "catal\N{U+00e0} It\N{U+00e0}lia" => "ca-IT",
    chiShona => "sn",
    "chiShona Zimbabwe" => "sn-ZW",
    cu => "cu",
    "cu RU" => "cu-RU",
    dansk => "da",
    "dansk Danmark" => "da-DK",
    "dansk Gr\N{U+00f8}nland" => "da-GL",
    "davvis\N{U+00e1}megiella" => "se",
    "davvis\N{U+00e1}megiella Norga" => "se-NO",
    "davvis\N{U+00e1}megiella Ruo\N{U+0167}\N{U+0167}a" => "se-SE",
    "davvis\N{U+00e1}megiella Suopma" => "se-FI",
    "dolnoserb\N{U+0161}\N{U+0107}ina" => "dsb",
    "dolnoserb\N{U+0161}\N{U+0107}ina Nimska" => "dsb-DE",
    "du\N{U+00e1}l\N{U+00e1}" => "dua",
    "du\N{U+00e1}l\N{U+00e1} Cameroun" => "dua-CM",
    eesti => "et",
    "eesti Eesti" => "et-EE",
    "espa\N{U+00f1}ol" => "es",
    "espa\N{U+00f1}ol Argentina" => "es-AR",
    "espa\N{U+00f1}ol Belice" => "es-BZ",
    "espa\N{U+00f1}ol Bolivia" => "es-BO",
    "espa\N{U+00f1}ol Brasil" => "es-BR",
    "espa\N{U+00f1}ol Canarias" => "es-IC",
    "espa\N{U+00f1}ol Ceuta y Melilla" => "es-EA",
    "espa\N{U+00f1}ol Chile" => "es-CL",
    "espa\N{U+00f1}ol Colombia" => "es-CO",
    "espa\N{U+00f1}ol Costa Rica" => "es-CR",
    "espa\N{U+00f1}ol Cuba" => "es-CU",
    "espa\N{U+00f1}ol Ecuador" => "es-EC",
    "espa\N{U+00f1}ol El Salvador" => "es-SV",
    "espa\N{U+00f1}ol Espa\N{U+00f1}a" => "es-ES",
    "espa\N{U+00f1}ol Estados Unidos" => "es-US",
    "espa\N{U+00f1}ol Filipinas" => "es-PH",
    "espa\N{U+00f1}ol Guatemala" => "es-GT",
    "espa\N{U+00f1}ol Guinea Ecuatorial" => "es-GQ",
    "espa\N{U+00f1}ol Honduras" => "es-HN",
    "espa\N{U+00f1}ol Latinoam\N{U+00e9}rica" => "es-419",
    "espa\N{U+00f1}ol M\N{U+00e9}xico" => "es-MX",
    "espa\N{U+00f1}ol Nicaragua" => "es-NI",
    "espa\N{U+00f1}ol Panam\N{U+00e1}" => "es-PA",
    "espa\N{U+00f1}ol Paraguay" => "es-PY",
    "espa\N{U+00f1}ol Per\N{U+00fa}" => "es-PE",
    "espa\N{U+00f1}ol Puerto Rico" => "es-PR",
    "espa\N{U+00f1}ol Rep\N{U+00fa}blica Dominicana" => "es-DO",
    "espa\N{U+00f1}ol Uruguay" => "es-UY",
    "espa\N{U+00f1}ol Venezuela" => "es-VE",
    esperanto => "eo",
    "esperanto Mondo" => "eo-001",
    euskara => "eu",
    "euskara Espainia" => "eu-ES",
    ewondo => "ewo",
    "ewondo Kam\N{U+0259}r\N{U+00fa}n" => "ewo-CM",
    "fran\N{U+00e7}ais" => "fr",
    "fran\N{U+00e7}ais Alg\N{U+00e9}rie" => "fr-DZ",
    "fran\N{U+00e7}ais Belgique" => "fr-BE",
    "fran\N{U+00e7}ais Burkina Faso" => "fr-BF",
    "fran\N{U+00e7}ais Burundi" => "fr-BI",
    "fran\N{U+00e7}ais B\N{U+00e9}nin" => "fr-BJ",
    "fran\N{U+00e7}ais Cameroun" => "fr-CM",
    "fran\N{U+00e7}ais Canada" => "fr-CA",
    "fran\N{U+00e7}ais Comores" => "fr-KM",
    "fran\N{U+00e7}ais Congo-Brazzaville" => "fr-CG",
    "fran\N{U+00e7}ais Congo-Kinshasa" => "fr-CD",
    "fran\N{U+00e7}ais C\N{U+00f4}te d\N{U+2019}Ivoire" => "fr-CI",
    "fran\N{U+00e7}ais Djibouti" => "fr-DJ",
    "fran\N{U+00e7}ais France" => "fr-FR",
    "fran\N{U+00e7}ais Gabon" => "fr-GA",
    "fran\N{U+00e7}ais Guadeloupe" => "fr-GP",
    "fran\N{U+00e7}ais Guin\N{U+00e9}e" => "fr-GN",
    "fran\N{U+00e7}ais Guin\N{U+00e9}e \N{U+00e9}quatoriale" => "fr-GQ",
    "fran\N{U+00e7}ais Guyane fran\N{U+00e7}aise" => "fr-GF",
    "fran\N{U+00e7}ais Ha\N{U+00ef}ti" => "fr-HT",
    "fran\N{U+00e7}ais La R\N{U+00e9}union" => "fr-RE",
    "fran\N{U+00e7}ais Luxembourg" => "fr-LU",
    "fran\N{U+00e7}ais Madagascar" => "fr-MG",
    "fran\N{U+00e7}ais Mali" => "fr-ML",
    "fran\N{U+00e7}ais Maroc" => "fr-MA",
    "fran\N{U+00e7}ais Martinique" => "fr-MQ",
    "fran\N{U+00e7}ais Maurice" => "fr-MU",
    "fran\N{U+00e7}ais Mauritanie" => "fr-MR",
    "fran\N{U+00e7}ais Mayotte" => "fr-YT",
    "fran\N{U+00e7}ais Monaco" => "fr-MC",
    "fran\N{U+00e7}ais Niger" => "fr-NE",
    "fran\N{U+00e7}ais Nouvelle-Cal\N{U+00e9}donie" => "fr-NC",
    "fran\N{U+00e7}ais Polyn\N{U+00e9}sie fran\N{U+00e7}aise" => "fr-PF",
    "fran\N{U+00e7}ais Rwanda" => "fr-RW",
    "fran\N{U+00e7}ais R\N{U+00e9}publique centrafricaine" => "fr-CF",
    "fran\N{U+00e7}ais Saint-Barth\N{U+00e9}lemy" => "fr-BL",
    "fran\N{U+00e7}ais Saint-Martin" => "fr-MF",
    "fran\N{U+00e7}ais Saint-Pierre-et-Miquelon" => "fr-PM",
    "fran\N{U+00e7}ais Seychelles" => "fr-SC",
    "fran\N{U+00e7}ais Suisse" => "fr-CH",
    "fran\N{U+00e7}ais Syrie" => "fr-SY",
    "fran\N{U+00e7}ais S\N{U+00e9}n\N{U+00e9}gal" => "fr-SN",
    "fran\N{U+00e7}ais Tchad" => "fr-TD",
    "fran\N{U+00e7}ais Togo" => "fr-TG",
    "fran\N{U+00e7}ais Tunisie" => "fr-TN",
    "fran\N{U+00e7}ais Vanuatu" => "fr-VU",
    "fran\N{U+00e7}ais Wallis-et-Futuna" => "fr-WF",
    furlan => "fur",
    "furlan Italie" => "fur-IT",
    "f\N{U+00f8}royskt" => "fo",
    "f\N{U+00f8}royskt Danmark" => "fo-DK",
    "f\N{U+00f8}royskt F\N{U+00f8}royar" => "fo-FO",
    galego => "gl",
    "galego Espa\N{U+00f1}a" => "gl-ES",
    "hornjoserb\N{U+0161}\N{U+0107}ina" => "hsb",
    "hornjoserb\N{U+0161}\N{U+0107}ina N\N{U+011b}mska" => "hsb-DE",
    hrvatski => "hr",
    "hrvatski Bosna i Hercegovina" => "hr-BA",
    "hrvatski Hrvatska" => "hr-HR",
    interlingua => "ia",
    "interlingua Mundo" => "ia-001",
    isiNdebele => "nd",
    "isiNdebele Zimbabwe" => "nd-ZW",
    isiXhosa => "xh",
    "isiXhosa eMzantsi Afrika" => "xh-ZA",
    isiZulu => "zu",
    "isiZulu iNingizimu Afrika" => "zu-ZA",
    italiano => "it",
    "italiano Citt\N{U+00e0} del Vaticano" => "it-VA",
    "italiano Italia" => "it-IT",
    "italiano San Marino" => "it-SM",
    "italiano Svizzera" => "it-CH",
    joola => "dyo",
    "joola Senegal" => "dyo-SN",
    kabuverdianu => "kea",
    "kabuverdianu Kabu Verdi" => "kea-CV",
    "kak\N{U+0254}" => "kkj",
    "kak\N{U+0254} Kam\N{U+025b}run" => "kkj-CM",
    kalaallisut => "kl",
    "kalaallisut Kalaallit Nunaat" => "kl-GL",
    kernewek => "kw",
    "kernewek Rywvaneth Unys" => "kw-GB",
    "kreol morisien" => "mfe",
    "kreol morisien Moris" => "mfe-MU",
    "kurd\N{U+00ee}" => "ku",
    "kurd\N{U+00ee} Tirkiye" => "ku-TR",
    "latvie\N{U+0161}u" => "lv",
    "latvie\N{U+0161}u Latvija" => "lv-LV",
    "lea fakatonga" => "to",
    "lea fakatonga Tonga" => "to-TO",
    "lietuvi\N{U+0173}" => "lt",
    "lietuvi\N{U+0173} Lietuva" => "lt-LT",
    "ling\N{U+00e1}la" => "ln",
    "ling\N{U+00e1}la Ang\N{U+00f3}la" => "ln-AO",
    "ling\N{U+00e1}la Kongo" => "ln-CG",
    "ling\N{U+00e1}la Repibiki ya Afr\N{U+00ed}ka ya K\N{U+00e1}ti" => "ln-CF",
    "ling\N{U+00e1}la Republ\N{U+00ed}ki ya Kong\N{U+00f3} Demokrat\N{U+00ed}ki" => "ln-CD",
    magyar => "hu",
    "magyar Magyarorsz\N{U+00e1}g" => "hu-HU",
    "meta\N{U+02bc}" => "mgo",
    "meta\N{U+02bc} Kamalun" => "mgo-CM",
    nds => "nds",
    "nds DE" => "nds-DE",
    "nds NL" => "nds-NL",
    nmg => "nmg",
    "nmg Kamerun" => "nmg-CM",
    "norsk bokm\N{U+00e5}l" => "nb",
    "norsk bokm\N{U+00e5}l Norge" => "nb-NO",
    "norsk bokm\N{U+00e5}l Svalbard og Jan Mayen" => "nb-SJ",
    nuasue => "yav",
    "nuasue Kemel\N{U+00fa}n" => "yav-CM",
    nynorsk => "nn",
    "nynorsk Noreg" => "nn-NO",
    "o\N{U+2018}zbek" => "uz",
    "o\N{U+2018}zbek O\N{U+02bb}zbekiston lotin" => "uz-Latn-UZ",
    "o\N{U+2018}zbek lotin" => "uz-Latn",
    polski => "pl",
    "polski Polska" => "pl-PL",
    "portugu\N{U+00ea}s" => "pt",
    "portugu\N{U+00ea}s Angola" => "pt-AO",
    "portugu\N{U+00ea}s Brasil" => "pt-BR",
    "portugu\N{U+00ea}s Cabo Verde" => "pt-CV",
    "portugu\N{U+00ea}s Guin\N{U+00e9} Equatorial" => "pt-GQ",
    "portugu\N{U+00ea}s Guin\N{U+00e9}-Bissau" => "pt-GW",
    "portugu\N{U+00ea}s Luxemburgo" => "pt-LU",
    "portugu\N{U+00ea}s Macau, RAE da China" => "pt-MO",
    "portugu\N{U+00ea}s Mo\N{U+00e7}ambique" => "pt-MZ",
    "portugu\N{U+00ea}s Portugal" => "pt-PT",
    "portugu\N{U+00ea}s Su\N{U+00ed}\N{U+00e7}a" => "pt-CH",
    "portugu\N{U+00ea}s S\N{U+00e3}o Tom\N{U+00e9} e Pr\N{U+00ed}ncipe" => "pt-ST",
    "portugu\N{U+00ea}s Timor-Leste" => "pt-TL",
    "pr\N{U+016b}siskan" => "prg",
    "pr\N{U+016b}siskan 001" => "prg-001",
    rikpa => "ksf",
    "rikpa kam\N{U+025b}r\N{U+00fa}n" => "ksf-CM",
    "rom\N{U+00e2}n\N{U+0103}" => "ro",
    "rom\N{U+00e2}n\N{U+0103} Republica Moldova" => "ro-MD",
    "rom\N{U+00e2}n\N{U+0103} Rom\N{U+00e2}nia" => "ro-RO",
    root => "root",
    rumantsch => "rm",
    "rumantsch Svizra" => "rm-CH",
    sena => "seh",
    "sena Mo\N{U+00e7}ambique" => "seh-MZ",
    shqip => "sq",
    "shqip Kosov\N{U+00eb}" => "sq-XK",
    "shqip Maqedonia e Veriut" => "sq-MK",
    "shqip Shqip\N{U+00eb}ri" => "sq-AL",
    "sloven\N{U+010d}ina" => "sk",
    "sloven\N{U+010d}ina Slovensko" => "sk-SK",
    "sloven\N{U+0161}\N{U+010d}ina" => "sl",
    "sloven\N{U+0161}\N{U+010d}ina Slovenija" => "sl-SI",
    "srpski Bosna i Hercegovina latinica" => "sr-Latn-BA",
    "srpski Crna Gora latinica" => "sr-Latn-ME",
    "srpski Kosovo latinica" => "sr-Latn-XK",
    "srpski Srbija latinica" => "sr-Latn-RS",
    "srpski latinica" => "sr-Latn",
    suomi => "fi",
    "suomi Suomi" => "fi-FI",
    svenska => "sv",
    "svenska Finland" => "sv-FI",
    "svenska Sverige" => "sv-SE",
    "svenska \N{U+00c5}land" => "sv-AX",
    "t\N{U+00fc}rkmen dili" => "tk",
    "t\N{U+00fc}rkmen dili T\N{U+00fc}rkmenistan" => "tk-TM",
    vo => "vo",
    "vo 001" => "vo-001",
    "\N{U+00c8}d\N{U+00e8} Yor\N{U+00f9}b\N{U+00e1}" => "yo",
    "\N{U+00c8}d\N{U+00e8} Yor\N{U+00f9}b\N{U+00e1} Oril\N{U+1eb9}\N{U+0300}-\N{U+00e8}d\N{U+00e8} N\N{U+00e0}\N{U+00ec}j\N{U+00ed}r\N{U+00ed}\N{U+00e0}" => "yo-NG",
    "\N{U+00c8}d\N{U+00e8} Yor\N{U+00f9}b\N{U+00e1} Or\N{U+00ed}l\N{U+025b}\N{U+0301}\N{U+00e8}de B\N{U+025b}\N{U+0300}n\N{U+025b}\N{U+0300}" => "yo-BJ",
    "\N{U+00ed}slenska" => "is",
    "\N{U+00ed}slenska \N{U+00cd}sland" => "is-IS",
    "\N{U+010d}e\N{U+0161}tina" => "cs",
    "\N{U+010d}e\N{U+0161}tina \N{U+010c}esko" => "cs-CZ",
    "\N{U+0181}\N{U+00e0}s\N{U+00e0}a" => "bas",
    "\N{U+0181}\N{U+00e0}s\N{U+00e0}a K\N{U+00e0}m\N{U+025b}\N{U+0300}r\N{U+00fb}n" => "bas-CM",
    "\N{U+02bb}\N{U+014c}lelo Hawai\N{U+02bb}i" => "haw",
    "\N{U+02bb}\N{U+014c}lelo Hawai\N{U+02bb}i \N{U+02bb}Amelika Hui P\N{U+016b} \N{U+02bb}Ia" => "haw-US",
    "\N{U+0395}\N{U+03bb}\N{U+03bb}\N{U+03b7}\N{U+03bd}\N{U+03b9}\N{U+03ba}\N{U+03ac}" => "el",
    "\N{U+0395}\N{U+03bb}\N{U+03bb}\N{U+03b7}\N{U+03bd}\N{U+03b9}\N{U+03ba}\N{U+03ac} \N{U+0395}\N{U+03bb}\N{U+03bb}\N{U+03ac}\N{U+03b4}\N{U+03b1}" => "el-GR",
    "\N{U+0395}\N{U+03bb}\N{U+03bb}\N{U+03b7}\N{U+03bd}\N{U+03b9}\N{U+03ba}\N{U+03ac} \N{U+039a}\N{U+03cd}\N{U+03c0}\N{U+03c1}\N{U+03bf}\N{U+03c2}" => "el-CY",
    "\N{U+0430}\N{U+0437}\N{U+04d9}\N{U+0440}\N{U+0431}\N{U+0430}\N{U+0458}\N{U+04b9}\N{U+0430}\N{U+043d} \N{U+0410}\N{U+0437}\N{U+04d9}\N{U+0440}\N{U+0431}\N{U+0430}\N{U+0458}\N{U+04b9}\N{U+0430}\N{U+043d} \N{U+041a}\N{U+0438}\N{U+0440}\N{U+0438}\N{U+043b}" => "az-Cyrl-AZ",
    "\N{U+0430}\N{U+0437}\N{U+04d9}\N{U+0440}\N{U+0431}\N{U+0430}\N{U+0458}\N{U+04b9}\N{U+0430}\N{U+043d} \N{U+041a}\N{U+0438}\N{U+0440}\N{U+0438}\N{U+043b}" => "az-Cyrl",
    "\N{U+0431}\N{U+0435}\N{U+043b}\N{U+0430}\N{U+0440}\N{U+0443}\N{U+0441}\N{U+043a}\N{U+0430}\N{U+044f}" => "be",
    "\N{U+0431}\N{U+0435}\N{U+043b}\N{U+0430}\N{U+0440}\N{U+0443}\N{U+0441}\N{U+043a}\N{U+0430}\N{U+044f} \N{U+0411}\N{U+0435}\N{U+043b}\N{U+0430}\N{U+0440}\N{U+0443}\N{U+0441}\N{U+044c}" => "be-BY",
    "\N{U+0431}\N{U+043e}\N{U+0441}\N{U+0430}\N{U+043d}\N{U+0441}\N{U+043a}\N{U+0438} \N{U+0411}\N{U+043e}\N{U+0441}\N{U+043d}\N{U+0430} \N{U+0438} \N{U+0425}\N{U+0435}\N{U+0440}\N{U+0446}\N{U+0435}\N{U+0433}\N{U+043e}\N{U+0432}\N{U+0438}\N{U+043d}\N{U+0430} \N{U+045b}\N{U+0438}\N{U+0440}\N{U+0438}\N{U+043b}\N{U+0438}\N{U+0446}\N{U+0430}" => "bs-Cyrl-BA",
    "\N{U+0431}\N{U+043e}\N{U+0441}\N{U+0430}\N{U+043d}\N{U+0441}\N{U+043a}\N{U+0438} \N{U+045b}\N{U+0438}\N{U+0440}\N{U+0438}\N{U+043b}\N{U+0438}\N{U+0446}\N{U+0430}" => "bs-Cyrl",
    "\N{U+0431}\N{U+044a}\N{U+043b}\N{U+0433}\N{U+0430}\N{U+0440}\N{U+0441}\N{U+043a}\N{U+0438}" => "bg",
    "\N{U+0431}\N{U+044a}\N{U+043b}\N{U+0433}\N{U+0430}\N{U+0440}\N{U+0441}\N{U+043a}\N{U+0438} \N{U+0411}\N{U+044a}\N{U+043b}\N{U+0433}\N{U+0430}\N{U+0440}\N{U+0438}\N{U+044f}" => "bg-BG",
    "\N{U+0438}\N{U+0440}\N{U+043e}\N{U+043d}" => "os",
    "\N{U+0438}\N{U+0440}\N{U+043e}\N{U+043d} \N{U+0413}\N{U+0443}\N{U+044b}\N{U+0440}\N{U+0434}\N{U+0437}\N{U+044b}\N{U+0441}\N{U+0442}\N{U+043e}\N{U+043d}" => "os-GE",
    "\N{U+0438}\N{U+0440}\N{U+043e}\N{U+043d} \N{U+0423}\N{U+04d5}\N{U+0440}\N{U+04d5}\N{U+0441}\N{U+0435}" => "os-RU",
    "\N{U+043a}\N{U+044b}\N{U+0440}\N{U+0433}\N{U+044b}\N{U+0437}\N{U+0447}\N{U+0430}" => "ky",
    "\N{U+043a}\N{U+044b}\N{U+0440}\N{U+0433}\N{U+044b}\N{U+0437}\N{U+0447}\N{U+0430} \N{U+041a}\N{U+044b}\N{U+0440}\N{U+0433}\N{U+044b}\N{U+0437}\N{U+0441}\N{U+0442}\N{U+0430}\N{U+043d}" => "ky-KG",
    "\N{U+043c}\N{U+0430}\N{U+043a}\N{U+0435}\N{U+0434}\N{U+043e}\N{U+043d}\N{U+0441}\N{U+043a}\N{U+0438}" => "mk",
    "\N{U+043c}\N{U+0430}\N{U+043a}\N{U+0435}\N{U+0434}\N{U+043e}\N{U+043d}\N{U+0441}\N{U+043a}\N{U+0438} \N{U+0421}\N{U+0435}\N{U+0432}\N{U+0435}\N{U+0440}\N{U+043d}\N{U+0430} \N{U+041c}\N{U+0430}\N{U+043a}\N{U+0435}\N{U+0434}\N{U+043e}\N{U+043d}\N{U+0438}\N{U+0458}\N{U+0430}" => "mk-MK",
    "\N{U+043c}\N{U+043e}\N{U+043d}\N{U+0433}\N{U+043e}\N{U+043b}" => "mn",
    "\N{U+043c}\N{U+043e}\N{U+043d}\N{U+0433}\N{U+043e}\N{U+043b} \N{U+041c}\N{U+043e}\N{U+043d}\N{U+0433}\N{U+043e}\N{U+043b}" => "mn-MN",
    "\N{U+043d}\N{U+043e}\N{U+0445}\N{U+0447}\N{U+0438}\N{U+0439}\N{U+043d}" => "ce",
    "\N{U+043d}\N{U+043e}\N{U+0445}\N{U+0447}\N{U+0438}\N{U+0439}\N{U+043d} \N{U+0420}\N{U+043e}\N{U+0441}\N{U+0441}\N{U+0438}" => "ce-RU",
    "\N{U+0440}\N{U+0443}\N{U+0441}\N{U+0441}\N{U+043a}\N{U+0438}\N{U+0439}" => "ru",
    "\N{U+0440}\N{U+0443}\N{U+0441}\N{U+0441}\N{U+043a}\N{U+0438}\N{U+0439} \N{U+0411}\N{U+0435}\N{U+043b}\N{U+0430}\N{U+0440}\N{U+0443}\N{U+0441}\N{U+044c}" => "ru-BY",
    "\N{U+0440}\N{U+0443}\N{U+0441}\N{U+0441}\N{U+043a}\N{U+0438}\N{U+0439} \N{U+041a}\N{U+0430}\N{U+0437}\N{U+0430}\N{U+0445}\N{U+0441}\N{U+0442}\N{U+0430}\N{U+043d}" => "ru-KZ",
    "\N{U+0440}\N{U+0443}\N{U+0441}\N{U+0441}\N{U+043a}\N{U+0438}\N{U+0439} \N{U+041a}\N{U+0438}\N{U+0440}\N{U+0433}\N{U+0438}\N{U+0437}\N{U+0438}\N{U+044f}" => "ru-KG",
    "\N{U+0440}\N{U+0443}\N{U+0441}\N{U+0441}\N{U+043a}\N{U+0438}\N{U+0439} \N{U+041c}\N{U+043e}\N{U+043b}\N{U+0434}\N{U+043e}\N{U+0432}\N{U+0430}" => "ru-MD",
    "\N{U+0440}\N{U+0443}\N{U+0441}\N{U+0441}\N{U+043a}\N{U+0438}\N{U+0439} \N{U+0420}\N{U+043e}\N{U+0441}\N{U+0441}\N{U+0438}\N{U+044f}" => "ru-RU",
    "\N{U+0440}\N{U+0443}\N{U+0441}\N{U+0441}\N{U+043a}\N{U+0438}\N{U+0439} \N{U+0423}\N{U+043a}\N{U+0440}\N{U+0430}\N{U+0438}\N{U+043d}\N{U+0430}" => "ru-UA",
    "\N{U+0441}\N{U+0430}\N{U+0445}\N{U+0430} \N{U+0442}\N{U+044b}\N{U+043b}\N{U+0430}" => "sah",
    "\N{U+0441}\N{U+0430}\N{U+0445}\N{U+0430} \N{U+0442}\N{U+044b}\N{U+043b}\N{U+0430} \N{U+0410}\N{U+0440}\N{U+0430}\N{U+0441}\N{U+0441}\N{U+044b}\N{U+044b}\N{U+0439}\N{U+0430}" => "sah-RU",
    "\N{U+0441}\N{U+0440}\N{U+043f}\N{U+0441}\N{U+043a}\N{U+0438}" => "sr",
    "\N{U+0441}\N{U+0440}\N{U+043f}\N{U+0441}\N{U+043a}\N{U+0438} \N{U+0411}\N{U+043e}\N{U+0441}\N{U+043d}\N{U+0430} \N{U+0438} \N{U+0425}\N{U+0435}\N{U+0440}\N{U+0446}\N{U+0435}\N{U+0433}\N{U+043e}\N{U+0432}\N{U+0438}\N{U+043d}\N{U+0430} \N{U+045b}\N{U+0438}\N{U+0440}\N{U+0438}\N{U+043b}\N{U+0438}\N{U+0446}\N{U+0430}" => "sr-Cyrl-BA",
    "\N{U+0441}\N{U+0440}\N{U+043f}\N{U+0441}\N{U+043a}\N{U+0438} \N{U+041a}\N{U+043e}\N{U+0441}\N{U+043e}\N{U+0432}\N{U+043e} \N{U+045b}\N{U+0438}\N{U+0440}\N{U+0438}\N{U+043b}\N{U+0438}\N{U+0446}\N{U+0430}" => "sr-Cyrl-XK",
    "\N{U+0441}\N{U+0440}\N{U+043f}\N{U+0441}\N{U+043a}\N{U+0438} \N{U+0421}\N{U+0440}\N{U+0431}\N{U+0438}\N{U+0458}\N{U+0430} \N{U+045b}\N{U+0438}\N{U+0440}\N{U+0438}\N{U+043b}\N{U+0438}\N{U+0446}\N{U+0430}" => "sr-Cyrl-RS",
    "\N{U+0441}\N{U+0440}\N{U+043f}\N{U+0441}\N{U+043a}\N{U+0438} \N{U+0426}\N{U+0440}\N{U+043d}\N{U+0430} \N{U+0413}\N{U+043e}\N{U+0440}\N{U+0430} \N{U+045b}\N{U+0438}\N{U+0440}\N{U+0438}\N{U+043b}\N{U+0438}\N{U+0446}\N{U+0430}" => "sr-Cyrl-ME",
    "\N{U+0441}\N{U+0440}\N{U+043f}\N{U+0441}\N{U+043a}\N{U+0438} \N{U+045b}\N{U+0438}\N{U+0440}\N{U+0438}\N{U+043b}\N{U+0438}\N{U+0446}\N{U+0430}" => "sr-Cyrl",
    "\N{U+0442}\N{U+0430}\N{U+0442}\N{U+0430}\N{U+0440}" => "tt",
    "\N{U+0442}\N{U+0430}\N{U+0442}\N{U+0430}\N{U+0440} \N{U+0420}\N{U+043e}\N{U+0441}\N{U+0441}\N{U+0438}\N{U+044f}" => "tt-RU",
    "\N{U+0442}\N{U+043e}\N{U+04b7}\N{U+0438}\N{U+043a}\N{U+04e3}" => "tg",
    "\N{U+0442}\N{U+043e}\N{U+04b7}\N{U+0438}\N{U+043a}\N{U+04e3} \N{U+0422}\N{U+043e}\N{U+04b7}\N{U+0438}\N{U+043a}\N{U+0438}\N{U+0441}\N{U+0442}\N{U+043e}\N{U+043d}" => "tg-TJ",
    "\N{U+0443}\N{U+043a}\N{U+0440}\N{U+0430}\N{U+0457}\N{U+043d}\N{U+0441}\N{U+044c}\N{U+043a}\N{U+0430}" => "uk",
    "\N{U+0443}\N{U+043a}\N{U+0440}\N{U+0430}\N{U+0457}\N{U+043d}\N{U+0441}\N{U+044c}\N{U+043a}\N{U+0430} \N{U+0423}\N{U+043a}\N{U+0440}\N{U+0430}\N{U+0457}\N{U+043d}\N{U+0430}" => "uk-UA",
    "\N{U+045e}\N{U+0437}\N{U+0431}\N{U+0435}\N{U+043a}\N{U+0447}\N{U+0430} \N{U+040e}\N{U+0437}\N{U+0431}\N{U+0435}\N{U+043a}\N{U+0438}\N{U+0441}\N{U+0442}\N{U+043e}\N{U+043d} \N{U+041a}\N{U+0438}\N{U+0440}\N{U+0438}\N{U+043b}" => "uz-Cyrl-UZ",
    "\N{U+045e}\N{U+0437}\N{U+0431}\N{U+0435}\N{U+043a}\N{U+0447}\N{U+0430} \N{U+041a}\N{U+0438}\N{U+0440}\N{U+0438}\N{U+043b}" => "uz-Cyrl",
    "\N{U+049b}\N{U+0430}\N{U+0437}\N{U+0430}\N{U+049b} \N{U+0442}\N{U+0456}\N{U+043b}\N{U+0456}" => "kk",
    "\N{U+049b}\N{U+0430}\N{U+0437}\N{U+0430}\N{U+049b} \N{U+0442}\N{U+0456}\N{U+043b}\N{U+0456} \N{U+049a}\N{U+0430}\N{U+0437}\N{U+0430}\N{U+049b}\N{U+0441}\N{U+0442}\N{U+0430}\N{U+043d}" => "kk-KZ",
    "\N{U+0570}\N{U+0561}\N{U+0575}\N{U+0565}\N{U+0580}\N{U+0565}\N{U+0576}" => "hy",
    "\N{U+0570}\N{U+0561}\N{U+0575}\N{U+0565}\N{U+0580}\N{U+0565}\N{U+0576} \N{U+0540}\N{U+0561}\N{U+0575}\N{U+0561}\N{U+057d}\N{U+057f}\N{U+0561}\N{U+0576}" => "hy-AM",
    "\N{U+05d9}\N{U+05d9}\N{U+05b4}\N{U+05d3}\N{U+05d9}\N{U+05e9}" => "yi",
    "\N{U+05d9}\N{U+05d9}\N{U+05b4}\N{U+05d3}\N{U+05d9}\N{U+05e9} \N{U+05d5}\N{U+05d5}\N{U+05e2}\N{U+05dc}\N{U+05d8}" => "yi-001",
    "\N{U+05e2}\N{U+05d1}\N{U+05e8}\N{U+05d9}\N{U+05ea}" => "he",
    "\N{U+05e2}\N{U+05d1}\N{U+05e8}\N{U+05d9}\N{U+05ea} \N{U+05d9}\N{U+05e9}\N{U+05e8}\N{U+05d0}\N{U+05dc}" => "he-IL",
    "\N{U+0626}\N{U+06c7}\N{U+064a}\N{U+063a}\N{U+06c7}\N{U+0631}\N{U+0686}\N{U+06d5}" => "ug",
    "\N{U+0626}\N{U+06c7}\N{U+064a}\N{U+063a}\N{U+06c7}\N{U+0631}\N{U+0686}\N{U+06d5} \N{U+062c}\N{U+06c7}\N{U+06ad}\N{U+06af}\N{U+0648}" => "ug-CN",
    "\N{U+0627}\N{U+0631}\N{U+062f}\N{U+0648}" => "ur",
    "\N{U+0627}\N{U+0631}\N{U+062f}\N{U+0648} \N{U+0628}\N{U+06be}\N{U+0627}\N{U+0631}\N{U+062a}" => "ur-IN",
    "\N{U+0627}\N{U+0631}\N{U+062f}\N{U+0648} \N{U+067e}\N{U+0627}\N{U+06a9}\N{U+0633}\N{U+062a}\N{U+0627}\N{U+0646}" => "ur-PK",
    "\N{U+0627}\N{U+0644}\N{U+0639}\N{U+0631}\N{U+0628}\N{U+064a}\N{U+0629}" => "ar",
    "\N{U+0627}\N{U+0644}\N{U+0639}\N{U+0631}\N{U+0628}\N{U+064a}\N{U+0629} \N{U+0625}\N{U+0631}\N{U+064a}\N{U+062a}\N{U+0631}\N{U+064a}\N{U+0627}" => "ar-ER",
    "\N{U+0627}\N{U+0644}\N{U+0639}\N{U+0631}\N{U+0628}\N{U+064a}\N{U+0629} \N{U+0625}\N{U+0633}\N{U+0631}\N{U+0627}\N{U+0626}\N{U+064a}\N{U+0644}" => "ar-IL",
    "\N{U+0627}\N{U+0644}\N{U+0639}\N{U+0631}\N{U+0628}\N{U+064a}\N{U+0629} \N{U+0627}\N{U+0644}\N{U+0623}\N{U+0631}\N{U+0627}\N{U+0636}\N{U+064a} \N{U+0627}\N{U+0644}\N{U+0641}\N{U+0644}\N{U+0633}\N{U+0637}\N{U+064a}\N{U+0646}\N{U+064a}\N{U+0629}" => "ar-PS",
    "\N{U+0627}\N{U+0644}\N{U+0639}\N{U+0631}\N{U+0628}\N{U+064a}\N{U+0629} \N{U+0627}\N{U+0644}\N{U+0623}\N{U+0631}\N{U+062f}\N{U+0646}" => "ar-JO",
    "\N{U+0627}\N{U+0644}\N{U+0639}\N{U+0631}\N{U+0628}\N{U+064a}\N{U+0629} \N{U+0627}\N{U+0644}\N{U+0625}\N{U+0645}\N{U+0627}\N{U+0631}\N{U+0627}\N{U+062a} \N{U+0627}\N{U+0644}\N{U+0639}\N{U+0631}\N{U+0628}\N{U+064a}\N{U+0629} \N{U+0627}\N{U+0644}\N{U+0645}\N{U+062a}\N{U+062d}\N{U+062f}\N{U+0629}" => "ar-AE",
    "\N{U+0627}\N{U+0644}\N{U+0639}\N{U+0631}\N{U+0628}\N{U+064a}\N{U+0629} \N{U+0627}\N{U+0644}\N{U+0628}\N{U+062d}\N{U+0631}\N{U+064a}\N{U+0646}" => "ar-BH",
    "\N{U+0627}\N{U+0644}\N{U+0639}\N{U+0631}\N{U+0628}\N{U+064a}\N{U+0629} \N{U+0627}\N{U+0644}\N{U+062c}\N{U+0632}\N{U+0627}\N{U+0626}\N{U+0631}" => "ar-DZ",
    "\N{U+0627}\N{U+0644}\N{U+0639}\N{U+0631}\N{U+0628}\N{U+064a}\N{U+0629} \N{U+0627}\N{U+0644}\N{U+0633}\N{U+0648}\N{U+062f}\N{U+0627}\N{U+0646}" => "ar-SD",
    "\N{U+0627}\N{U+0644}\N{U+0639}\N{U+0631}\N{U+0628}\N{U+064a}\N{U+0629} \N{U+0627}\N{U+0644}\N{U+0635}\N{U+062d}\N{U+0631}\N{U+0627}\N{U+0621} \N{U+0627}\N{U+0644}\N{U+063a}\N{U+0631}\N{U+0628}\N{U+064a}\N{U+0629}" => "ar-EH",
    "\N{U+0627}\N{U+0644}\N{U+0639}\N{U+0631}\N{U+0628}\N{U+064a}\N{U+0629} \N{U+0627}\N{U+0644}\N{U+0635}\N{U+0648}\N{U+0645}\N{U+0627}\N{U+0644}" => "ar-SO",
    "\N{U+0627}\N{U+0644}\N{U+0639}\N{U+0631}\N{U+0628}\N{U+064a}\N{U+0629} \N{U+0627}\N{U+0644}\N{U+0639}\N{U+0627}\N{U+0644}\N{U+0645}" => "ar-001",
    "\N{U+0627}\N{U+0644}\N{U+0639}\N{U+0631}\N{U+0628}\N{U+064a}\N{U+0629} \N{U+0627}\N{U+0644}\N{U+0639}\N{U+0631}\N{U+0627}\N{U+0642}" => "ar-IQ",
    "\N{U+0627}\N{U+0644}\N{U+0639}\N{U+0631}\N{U+0628}\N{U+064a}\N{U+0629} \N{U+0627}\N{U+0644}\N{U+0643}\N{U+0648}\N{U+064a}\N{U+062a}" => "ar-KW",
    "\N{U+0627}\N{U+0644}\N{U+0639}\N{U+0631}\N{U+0628}\N{U+064a}\N{U+0629} \N{U+0627}\N{U+0644}\N{U+0645}\N{U+063a}\N{U+0631}\N{U+0628}" => "ar-MA",
    "\N{U+0627}\N{U+0644}\N{U+0639}\N{U+0631}\N{U+0628}\N{U+064a}\N{U+0629} \N{U+0627}\N{U+0644}\N{U+0645}\N{U+0645}\N{U+0644}\N{U+0643}\N{U+0629} \N{U+0627}\N{U+0644}\N{U+0639}\N{U+0631}\N{U+0628}\N{U+064a}\N{U+0629} \N{U+0627}\N{U+0644}\N{U+0633}\N{U+0639}\N{U+0648}\N{U+062f}\N{U+064a}\N{U+0629}" => "ar-SA",
    "\N{U+0627}\N{U+0644}\N{U+0639}\N{U+0631}\N{U+0628}\N{U+064a}\N{U+0629} \N{U+0627}\N{U+0644}\N{U+064a}\N{U+0645}\N{U+0646}" => "ar-YE",
    "\N{U+0627}\N{U+0644}\N{U+0639}\N{U+0631}\N{U+0628}\N{U+064a}\N{U+0629} \N{U+062a}\N{U+0634}\N{U+0627}\N{U+062f}" => "ar-TD",
    "\N{U+0627}\N{U+0644}\N{U+0639}\N{U+0631}\N{U+0628}\N{U+064a}\N{U+0629} \N{U+062a}\N{U+0648}\N{U+0646}\N{U+0633}" => "ar-TN",
    "\N{U+0627}\N{U+0644}\N{U+0639}\N{U+0631}\N{U+0628}\N{U+064a}\N{U+0629} \N{U+062c}\N{U+0632}\N{U+0631} \N{U+0627}\N{U+0644}\N{U+0642}\N{U+0645}\N{U+0631}" => "ar-KM",
    "\N{U+0627}\N{U+0644}\N{U+0639}\N{U+0631}\N{U+0628}\N{U+064a}\N{U+0629} \N{U+062c}\N{U+0646}\N{U+0648}\N{U+0628} \N{U+0627}\N{U+0644}\N{U+0633}\N{U+0648}\N{U+062f}\N{U+0627}\N{U+0646}" => "ar-SS",
    "\N{U+0627}\N{U+0644}\N{U+0639}\N{U+0631}\N{U+0628}\N{U+064a}\N{U+0629} \N{U+062c}\N{U+064a}\N{U+0628}\N{U+0648}\N{U+062a}\N{U+064a}" => "ar-DJ",
    "\N{U+0627}\N{U+0644}\N{U+0639}\N{U+0631}\N{U+0628}\N{U+064a}\N{U+0629} \N{U+0633}\N{U+0648}\N{U+0631}\N{U+064a}\N{U+0627}" => "ar-SY",
    "\N{U+0627}\N{U+0644}\N{U+0639}\N{U+0631}\N{U+0628}\N{U+064a}\N{U+0629} \N{U+0639}\N{U+064f}\N{U+0645}\N{U+0627}\N{U+0646}" => "ar-OM",
    "\N{U+0627}\N{U+0644}\N{U+0639}\N{U+0631}\N{U+0628}\N{U+064a}\N{U+0629} \N{U+0642}\N{U+0637}\N{U+0631}" => "ar-QA",
    "\N{U+0627}\N{U+0644}\N{U+0639}\N{U+0631}\N{U+0628}\N{U+064a}\N{U+0629} \N{U+0644}\N{U+0628}\N{U+0646}\N{U+0627}\N{U+0646}" => "ar-LB",
    "\N{U+0627}\N{U+0644}\N{U+0639}\N{U+0631}\N{U+0628}\N{U+064a}\N{U+0629} \N{U+0644}\N{U+064a}\N{U+0628}\N{U+064a}\N{U+0627}" => "ar-LY",
    "\N{U+0627}\N{U+0644}\N{U+0639}\N{U+0631}\N{U+0628}\N{U+064a}\N{U+0629} \N{U+0645}\N{U+0635}\N{U+0631}" => "ar-EG",
    "\N{U+0627}\N{U+0644}\N{U+0639}\N{U+0631}\N{U+0628}\N{U+064a}\N{U+0629} \N{U+0645}\N{U+0648}\N{U+0631}\N{U+064a}\N{U+062a}\N{U+0627}\N{U+0646}\N{U+064a}\N{U+0627}" => "ar-MR",
    "\N{U+0627}\N{U+0648}\N{U+0632}\N{U+0628}\N{U+06cc}\N{U+06a9} \N{U+0627}\N{U+0641}\N{U+063a}\N{U+0627}\N{U+0646}\N{U+0633}\N{U+062a}\N{U+0627}\N{U+0646} \N{U+0639}\N{U+0631}\N{U+0628}\N{U+06cc}" => "uz-Arab-AF",
    "\N{U+0627}\N{U+0648}\N{U+0632}\N{U+0628}\N{U+06cc}\N{U+06a9} \N{U+0639}\N{U+0631}\N{U+0628}\N{U+06cc}" => "uz-Arab",
    "\N{U+0633}\N{U+0646}\N{U+068c}\N{U+064a}" => "sd",
    "\N{U+0633}\N{U+0646}\N{U+068c}\N{U+064a} \N{U+067e}\N{U+0627}\N{U+06aa}\N{U+0633}\N{U+062a}\N{U+0627}\N{U+0646}" => "sd-PK",
    "\N{U+0641}\N{U+0627}\N{U+0631}\N{U+0633}\N{U+06cc}" => "fa",
    "\N{U+0641}\N{U+0627}\N{U+0631}\N{U+0633}\N{U+06cc} \N{U+0627}\N{U+0641}\N{U+063a}\N{U+0627}\N{U+0646}\N{U+0633}\N{U+062a}\N{U+0627}\N{U+0646}" => "fa-AF",
    "\N{U+0641}\N{U+0627}\N{U+0631}\N{U+0633}\N{U+06cc} \N{U+0627}\N{U+06cc}\N{U+0631}\N{U+0627}\N{U+0646}" => "fa-IR",
    "\N{U+0644}\N{U+06ca}\N{U+0631}\N{U+06cc} \N{U+0634}\N{U+0648}\N{U+0645}\N{U+0627}\N{U+0644}\N{U+06cc}" => "lrc",
    "\N{U+0644}\N{U+06ca}\N{U+0631}\N{U+06cc} \N{U+0634}\N{U+0648}\N{U+0645}\N{U+0627}\N{U+0644}\N{U+06cc} IQ" => "lrc-IQ",
    "\N{U+0644}\N{U+06ca}\N{U+0631}\N{U+06cc} \N{U+0634}\N{U+0648}\N{U+0645}\N{U+0627}\N{U+0644}\N{U+06cc} IR" => "lrc-IR",
    "\N{U+0645}\N{U+0627}\N{U+0632}\N{U+0631}\N{U+0648}\N{U+0646}\N{U+06cc}" => "mzn",
    "\N{U+0645}\N{U+0627}\N{U+0632}\N{U+0631}\N{U+0648}\N{U+0646}\N{U+06cc} \N{U+0627}\N{U+06cc}\N{U+0631}\N{U+0627}\N{U+0646}" => "mzn-IR",
    "\N{U+067e}\N{U+0646}\N{U+062c}\N{U+0627}\N{U+0628}\N{U+06cc} \N{U+0639}\N{U+0631}\N{U+0628}\N{U+06cc}" => "pa-Arab",
    "\N{U+067e}\N{U+0646}\N{U+062c}\N{U+0627}\N{U+0628}\N{U+06cc} \N{U+067e}\N{U+0627}\N{U+06a9}\N{U+0633}\N{U+062a}\N{U+0627}\N{U+0646} \N{U+0639}\N{U+0631}\N{U+0628}\N{U+06cc}" => "pa-Arab-PK",
    "\N{U+067e}\N{U+069a}\N{U+062a}\N{U+0648}" => "ps",
    "\N{U+067e}\N{U+069a}\N{U+062a}\N{U+0648} \N{U+0627}\N{U+0641}\N{U+063a}\N{U+0627}\N{U+0646}\N{U+0633}\N{U+062a}\N{U+0627}\N{U+0646}" => "ps-AF",
    "\N{U+067e}\N{U+069a}\N{U+062a}\N{U+0648} \N{U+067e}\N{U+0627}\N{U+06a9}\N{U+0633}\N{U+062a}\N{U+0627}\N{U+0646}" => "ps-PK",
    "\N{U+06a9}\N{U+0648}\N{U+0631}\N{U+062f}\N{U+06cc}\N{U+06cc} \N{U+0646}\N{U+0627}\N{U+0648}\N{U+06d5}\N{U+0646}\N{U+062f}\N{U+06cc}" => "ckb",
    "\N{U+06a9}\N{U+0648}\N{U+0631}\N{U+062f}\N{U+06cc}\N{U+06cc} \N{U+0646}\N{U+0627}\N{U+0648}\N{U+06d5}\N{U+0646}\N{U+062f}\N{U+06cc} \N{U+0626}\N{U+06ce}\N{U+0631}\N{U+0627}\N{U+0646}" => "ckb-IR",
    "\N{U+06a9}\N{U+0648}\N{U+0631}\N{U+062f}\N{U+06cc}\N{U+06cc} \N{U+0646}\N{U+0627}\N{U+0648}\N{U+06d5}\N{U+0646}\N{U+062f}\N{U+06cc} \N{U+0639}\N{U+06ce}\N{U+0631}\N{U+0627}\N{U+0642}" => "ckb-IQ",
    "\N{U+06a9}\N{U+0672}\N{U+0634}\N{U+064f}\N{U+0631}" => "ks",
    "\N{U+06a9}\N{U+0672}\N{U+0634}\N{U+064f}\N{U+0631} \N{U+06c1}\N{U+0650}\N{U+0646}\N{U+062f}\N{U+0648}\N{U+0633}\N{U+062a}\N{U+0627}\N{U+0646}" => "ks-IN",
    "\N{U+0915}\N{U+094b}\N{U+0902}\N{U+0915}\N{U+0923}\N{U+0940}" => "kok",
    "\N{U+0915}\N{U+094b}\N{U+0902}\N{U+0915}\N{U+0923}\N{U+0940} \N{U+092d}\N{U+093e}\N{U+0930}\N{U+0924}" => "kok-IN",
    "\N{U+0928}\N{U+0947}\N{U+092a}\N{U+093e}\N{U+0932}\N{U+0940}" => "ne",
    "\N{U+0928}\N{U+0947}\N{U+092a}\N{U+093e}\N{U+0932}\N{U+0940} \N{U+0928}\N{U+0947}\N{U+092a}\N{U+093e}\N{U+0932}" => "ne-NP",
    "\N{U+0928}\N{U+0947}\N{U+092a}\N{U+093e}\N{U+0932}\N{U+0940} \N{U+092d}\N{U+093e}\N{U+0930}\N{U+0924}" => "ne-IN",
    "\N{U+092c}\N{U+0921}\N{U+093c}\N{U+094b}" => "brx",
    "\N{U+092c}\N{U+0921}\N{U+093c}\N{U+094b} \N{U+092d}\N{U+093e}\N{U+0930}\N{U+0924}" => "brx-IN",
    "\N{U+092e}\N{U+0930}\N{U+093e}\N{U+0920}\N{U+0940}" => "mr",
    "\N{U+092e}\N{U+0930}\N{U+093e}\N{U+0920}\N{U+0940} \N{U+092d}\N{U+093e}\N{U+0930}\N{U+0924}" => "mr-IN",
    "\N{U+0939}\N{U+093f}\N{U+0928}\N{U+094d}\N{U+0926}\N{U+0940}" => "hi",
    "\N{U+0939}\N{U+093f}\N{U+0928}\N{U+094d}\N{U+0926}\N{U+0940} \N{U+092d}\N{U+093e}\N{U+0930}\N{U+0924}" => "hi-IN",
    "\N{U+0985}\N{U+09b8}\N{U+09ae}\N{U+09c0}\N{U+09af}\N{U+09bc}\N{U+09be}" => "as",
    "\N{U+0985}\N{U+09b8}\N{U+09ae}\N{U+09c0}\N{U+09af}\N{U+09bc}\N{U+09be} \N{U+09ad}\N{U+09be}\N{U+09f0}\N{U+09a4}" => "as-IN",
    "\N{U+09ac}\N{U+09be}\N{U+0982}\N{U+09b2}\N{U+09be}" => "bn",
    "\N{U+09ac}\N{U+09be}\N{U+0982}\N{U+09b2}\N{U+09be} \N{U+09ac}\N{U+09be}\N{U+0982}\N{U+09b2}\N{U+09be}\N{U+09a6}\N{U+09c7}\N{U+09b6}" => "bn-BD",
    "\N{U+09ac}\N{U+09be}\N{U+0982}\N{U+09b2}\N{U+09be} \N{U+09ad}\N{U+09be}\N{U+09b0}\N{U+09a4}" => "bn-IN",
    "\N{U+0a2a}\N{U+0a70}\N{U+0a1c}\N{U+0a3e}\N{U+0a2c}\N{U+0a40}" => "pa",
    "\N{U+0a2a}\N{U+0a70}\N{U+0a1c}\N{U+0a3e}\N{U+0a2c}\N{U+0a40} \N{U+0a17}\N{U+0a41}\N{U+0a30}\N{U+0a2e}\N{U+0a41}\N{U+0a16}\N{U+0a40}" => "pa-Guru",
    "\N{U+0a2a}\N{U+0a70}\N{U+0a1c}\N{U+0a3e}\N{U+0a2c}\N{U+0a40} \N{U+0a2d}\N{U+0a3e}\N{U+0a30}\N{U+0a24} \N{U+0a17}\N{U+0a41}\N{U+0a30}\N{U+0a2e}\N{U+0a41}\N{U+0a16}\N{U+0a40}" => "pa-Guru-IN",
    "\N{U+0a97}\N{U+0ac1}\N{U+0a9c}\N{U+0ab0}\N{U+0abe}\N{U+0aa4}\N{U+0ac0}" => "gu",
    "\N{U+0a97}\N{U+0ac1}\N{U+0a9c}\N{U+0ab0}\N{U+0abe}\N{U+0aa4}\N{U+0ac0} \N{U+0aad}\N{U+0abe}\N{U+0ab0}\N{U+0aa4}" => "gu-IN",
    "\N{U+0b13}\N{U+0b21}\N{U+0b3c}\N{U+0b3f}\N{U+0b06}" => "or",
    "\N{U+0b13}\N{U+0b21}\N{U+0b3c}\N{U+0b3f}\N{U+0b06} \N{U+0b2d}\N{U+0b3e}\N{U+0b30}\N{U+0b24}" => "or-IN",
    "\N{U+0ba4}\N{U+0bae}\N{U+0bbf}\N{U+0bb4}\N{U+0bcd}" => "ta",
    "\N{U+0ba4}\N{U+0bae}\N{U+0bbf}\N{U+0bb4}\N{U+0bcd} \N{U+0b87}\N{U+0ba8}\N{U+0bcd}\N{U+0ba4}\N{U+0bbf}\N{U+0baf}\N{U+0bbe}" => "ta-IN",
    "\N{U+0ba4}\N{U+0bae}\N{U+0bbf}\N{U+0bb4}\N{U+0bcd} \N{U+0b87}\N{U+0bb2}\N{U+0b99}\N{U+0bcd}\N{U+0b95}\N{U+0bc8}" => "ta-LK",
    "\N{U+0ba4}\N{U+0bae}\N{U+0bbf}\N{U+0bb4}\N{U+0bcd} \N{U+0b9a}\N{U+0bbf}\N{U+0b99}\N{U+0bcd}\N{U+0b95}\N{U+0baa}\N{U+0bcd}\N{U+0baa}\N{U+0bc2}\N{U+0bb0}\N{U+0bcd}" => "ta-SG",
    "\N{U+0ba4}\N{U+0bae}\N{U+0bbf}\N{U+0bb4}\N{U+0bcd} \N{U+0bae}\N{U+0bb2}\N{U+0bc7}\N{U+0b9a}\N{U+0bbf}\N{U+0baf}\N{U+0bbe}" => "ta-MY",
    "\N{U+0c24}\N{U+0c46}\N{U+0c32}\N{U+0c41}\N{U+0c17}\N{U+0c41}" => "te",
    "\N{U+0c24}\N{U+0c46}\N{U+0c32}\N{U+0c41}\N{U+0c17}\N{U+0c41} \N{U+0c2d}\N{U+0c3e}\N{U+0c30}\N{U+0c24}\N{U+0c26}\N{U+0c47}\N{U+0c36}\N{U+0c02}" => "te-IN",
    "\N{U+0c95}\N{U+0ca8}\N{U+0ccd}\N{U+0ca8}\N{U+0ca1}" => "kn",
    "\N{U+0c95}\N{U+0ca8}\N{U+0ccd}\N{U+0ca8}\N{U+0ca1} \N{U+0cad}\N{U+0cbe}\N{U+0cb0}\N{U+0ca4}" => "kn-IN",
    "\N{U+0d2e}\N{U+0d32}\N{U+0d2f}\N{U+0d3e}\N{U+0d33}\N{U+0d02}" => "ml",
    "\N{U+0d2e}\N{U+0d32}\N{U+0d2f}\N{U+0d3e}\N{U+0d33}\N{U+0d02} \N{U+0d07}\N{U+0d28}\N{U+0d4d}\N{U+0d24}\N{U+0d4d}\N{U+0d2f}" => "ml-IN",
    "\N{U+0dc3}\N{U+0dd2}\N{U+0d82}\N{U+0dc4}\N{U+0dbd}" => "si",
    "\N{U+0dc3}\N{U+0dd2}\N{U+0d82}\N{U+0dc4}\N{U+0dbd} \N{U+0dc1}\N{U+0dca}\N{U+200d}\N{U+0dbb}\N{U+0dd3} \N{U+0dbd}\N{U+0d82}\N{U+0d9a}\N{U+0dcf}\N{U+0dc0}" => "si-LK",
    "\N{U+0e44}\N{U+0e17}\N{U+0e22}" => "th",
    "\N{U+0e44}\N{U+0e17}\N{U+0e22} \N{U+0e44}\N{U+0e17}\N{U+0e22}" => "th-TH",
    "\N{U+0ea5}\N{U+0eb2}\N{U+0ea7}" => "lo",
    "\N{U+0ea5}\N{U+0eb2}\N{U+0ea7} \N{U+0ea5}\N{U+0eb2}\N{U+0ea7}" => "lo-LA",
    "\N{U+0f56}\N{U+0f7c}\N{U+0f51}\N{U+0f0b}\N{U+0f66}\N{U+0f90}\N{U+0f51}\N{U+0f0b}" => "bo",
    "\N{U+0f56}\N{U+0f7c}\N{U+0f51}\N{U+0f0b}\N{U+0f66}\N{U+0f90}\N{U+0f51}\N{U+0f0b} \N{U+0f62}\N{U+0f92}\N{U+0fb1}\N{U+0f0b}\N{U+0f42}\N{U+0f62}\N{U+0f0b}" => "bo-IN",
    "\N{U+0f56}\N{U+0f7c}\N{U+0f51}\N{U+0f0b}\N{U+0f66}\N{U+0f90}\N{U+0f51}\N{U+0f0b} \N{U+0f62}\N{U+0f92}\N{U+0fb1}\N{U+0f0b}\N{U+0f53}\N{U+0f42}" => "bo-CN",
    "\N{U+0f62}\N{U+0fab}\N{U+0f7c}\N{U+0f44}\N{U+0f0b}\N{U+0f41}" => "dz",
    "\N{U+0f62}\N{U+0fab}\N{U+0f7c}\N{U+0f44}\N{U+0f0b}\N{U+0f41} \N{U+0f60}\N{U+0f56}\N{U+0fb2}\N{U+0f74}\N{U+0f42}" => "dz-BT",
    "\N{U+1019}\N{U+103c}\N{U+1014}\N{U+103a}\N{U+1019}\N{U+102c}" => "my",
    "\N{U+1019}\N{U+103c}\N{U+1014}\N{U+103a}\N{U+1019}\N{U+102c} \N{U+1019}\N{U+103c}\N{U+1014}\N{U+103a}\N{U+1019}\N{U+102c}" => "my-MM",
    "\N{U+10e5}\N{U+10d0}\N{U+10e0}\N{U+10d7}\N{U+10e3}\N{U+10da}\N{U+10d8}" => "ka",
    "\N{U+10e5}\N{U+10d0}\N{U+10e0}\N{U+10d7}\N{U+10e3}\N{U+10da}\N{U+10d8} \N{U+10e1}\N{U+10d0}\N{U+10e5}\N{U+10d0}\N{U+10e0}\N{U+10d7}\N{U+10d5}\N{U+10d4}\N{U+10da}\N{U+10dd}" => "ka-GE",
    "\N{U+1275}\N{U+130d}\N{U+122d}\N{U+129b}" => "ti",
    "\N{U+1275}\N{U+130d}\N{U+122d}\N{U+129b} \N{U+12a2}\N{U+1275}\N{U+12ee}\N{U+1335}\N{U+12eb}" => "ti-ET",
    "\N{U+1275}\N{U+130d}\N{U+122d}\N{U+129b} \N{U+12a4}\N{U+122d}\N{U+1275}\N{U+122b}" => "ti-ER",
    "\N{U+12a0}\N{U+121b}\N{U+122d}\N{U+129b}" => "am",
    "\N{U+12a0}\N{U+121b}\N{U+122d}\N{U+129b} \N{U+12a2}\N{U+1275}\N{U+12ee}\N{U+1335}\N{U+12eb}" => "am-ET",
    "\N{U+13e3}\N{U+13b3}\N{U+13a9}" => "chr",
    "\N{U+13e3}\N{U+13b3}\N{U+13a9} \N{U+13cc}\N{U+13ca} \N{U+13a2}\N{U+13f3}\N{U+13be}\N{U+13b5}\N{U+13cd}\N{U+13d4}\N{U+13c5} \N{U+13cd}\N{U+13a6}\N{U+13da}\N{U+13a9}" => "chr-US",
    "\N{U+1781}\N{U+17d2}\N{U+1798}\N{U+17c2}\N{U+179a}" => "km",
    "\N{U+1781}\N{U+17d2}\N{U+1798}\N{U+17c2}\N{U+179a} \N{U+1780}\N{U+1798}\N{U+17d2}\N{U+1796}\N{U+17bb}\N{U+1787}\N{U+17b6}" => "km-KH",
    "\N{U+2d5c}\N{U+2d30}\N{U+2d4e}\N{U+2d30}\N{U+2d63}\N{U+2d49}\N{U+2d56}\N{U+2d5c}" => "zgh",
    "\N{U+2d5c}\N{U+2d30}\N{U+2d4e}\N{U+2d30}\N{U+2d63}\N{U+2d49}\N{U+2d56}\N{U+2d5c} \N{U+2d4d}\N{U+2d4e}\N{U+2d56}\N{U+2d54}\N{U+2d49}\N{U+2d31}" => "zgh-MA",
    "\N{U+2d5c}\N{U+2d30}\N{U+2d5b}\N{U+2d4d}\N{U+2d43}\N{U+2d49}\N{U+2d5c}" => "shi",
    "\N{U+2d5c}\N{U+2d30}\N{U+2d5b}\N{U+2d4d}\N{U+2d43}\N{U+2d49}\N{U+2d5c} Tfng" => "shi-Tfng",
    "\N{U+2d5c}\N{U+2d30}\N{U+2d5b}\N{U+2d4d}\N{U+2d43}\N{U+2d49}\N{U+2d5c} \N{U+2d4d}\N{U+2d4e}\N{U+2d56}\N{U+2d54}\N{U+2d49}\N{U+2d31} Tfng" => "shi-Tfng-MA",
    "\N{U+4e2d}\N{U+6587}" => "zh",
    "\N{U+4e2d}\N{U+6587} \N{U+4e2d}\N{U+56fd} \N{U+7b80}\N{U+4f53}" => "zh-Hans-CN",
    "\N{U+4e2d}\N{U+6587} \N{U+4e2d}\N{U+56fd}\N{U+6fb3}\N{U+95e8}\N{U+7279}\N{U+522b}\N{U+884c}\N{U+653f}\N{U+533a} \N{U+7b80}\N{U+4f53}" => "zh-Hans-MO",
    "\N{U+4e2d}\N{U+6587} \N{U+4e2d}\N{U+56fd}\N{U+9999}\N{U+6e2f}\N{U+7279}\N{U+522b}\N{U+884c}\N{U+653f}\N{U+533a} \N{U+7b80}\N{U+4f53}" => "zh-Hans-HK",
    "\N{U+4e2d}\N{U+6587} \N{U+4e2d}\N{U+570b}\N{U+6fb3}\N{U+9580}\N{U+7279}\N{U+5225}\N{U+884c}\N{U+653f}\N{U+5340} \N{U+7e41}\N{U+9ad4}\N{U+5b57}" => "zh-Hant-MO",
    "\N{U+4e2d}\N{U+6587} \N{U+4e2d}\N{U+570b}\N{U+9999}\N{U+6e2f}\N{U+7279}\N{U+5225}\N{U+884c}\N{U+653f}\N{U+5340} \N{U+7e41}\N{U+9ad4}\N{U+5b57}" => "zh-Hant-HK",
    "\N{U+4e2d}\N{U+6587} \N{U+53f0}\N{U+7063} \N{U+7e41}\N{U+9ad4}" => "zh-Hant-TW",
    "\N{U+4e2d}\N{U+6587} \N{U+65b0}\N{U+52a0}\N{U+5761} \N{U+7b80}\N{U+4f53}" => "zh-Hans-SG",
    "\N{U+4e2d}\N{U+6587} \N{U+7b80}\N{U+4f53}" => "zh-Hans",
    "\N{U+4e2d}\N{U+6587} \N{U+7e41}\N{U+9ad4}" => "zh-Hant",
    "\N{U+65e5}\N{U+672c}\N{U+8a9e}" => "ja",
    "\N{U+65e5}\N{U+672c}\N{U+8a9e} \N{U+65e5}\N{U+672c}" => "ja-JP",
    "\N{U+7ca4}\N{U+8bed} \N{U+4e2d}\N{U+534e}\N{U+4eba}\N{U+6c11}\N{U+5171}\N{U+548c}\N{U+56fd} \N{U+7b80}\N{U+4f53}" => "yue-Hans-CN",
    "\N{U+7ca4}\N{U+8bed} \N{U+7b80}\N{U+4f53}" => "yue-Hans",
    "\N{U+7cb5}\N{U+8a9e}" => "yue",
    "\N{U+7cb5}\N{U+8a9e} \N{U+4e2d}\N{U+83ef}\N{U+4eba}\N{U+6c11}\N{U+5171}\N{U+548c}\N{U+570b}\N{U+9999}\N{U+6e2f}\N{U+7279}\N{U+5225}\N{U+884c}\N{U+653f}\N{U+5340} \N{U+7e41}\N{U+9ad4}" => "yue-Hant-HK",
    "\N{U+7cb5}\N{U+8a9e} \N{U+7e41}\N{U+9ad4}" => "yue-Hant",
    "\N{U+a188}\N{U+a320}\N{U+a259}" => "ii",
    "\N{U+a188}\N{U+a320}\N{U+a259} \N{U+a34f}\N{U+a1e9}" => "ii-CN",
    "\N{U+a559}\N{U+a524}" => "vai",
    "\N{U+a559}\N{U+a524} Vaii" => "vai-Vaii",
    "\N{U+a559}\N{U+a524} \N{U+a55e}\N{U+a524}\N{U+a52b}\N{U+a569} Vaii" => "vai-Vaii-LR",
    "\N{U+d55c}\N{U+ad6d}\N{U+c5b4}" => "ko",
    "\N{U+d55c}\N{U+ad6d}\N{U+c5b4} \N{U+b300}\N{U+d55c}\N{U+bbfc}\N{U+ad6d}" => "ko-KR",
    "\N{U+d55c}\N{U+ad6d}\N{U+c5b4} \N{U+c870}\N{U+c120}\N{U+bbfc}\N{U+c8fc}\N{U+c8fc}\N{U+c758}\N{U+c778}\N{U+bbfc}\N{U+acf5}\N{U+d654}\N{U+ad6d}" => "ko-KP",
    "\N{U+1110c}\N{U+1110b}\N{U+11134}\N{U+1111f}\N{U+11133}\N{U+11126}" => "ccp",
    "\N{U+1110c}\N{U+1110b}\N{U+11134}\N{U+1111f}\N{U+11133}\N{U+11126} \N{U+1111d}\N{U+11101}\N{U+11123}\N{U+11118}\N{U+1112c}\N{U+1110c}\N{U+11134}" => "ccp-BD",
    "\N{U+1110c}\N{U+1110b}\N{U+11134}\N{U+1111f}\N{U+11133}\N{U+11126} \N{U+1111e}\N{U+11122}\N{U+11127}\N{U+11116}\N{U+11134}" => "ccp-IN",
  );
  ### :end NativeNames:
  #>>>
  
  #<<<
  ### :start ISO639Aliases:
  our %ISO639Aliases = (
    afr => "af",
    "afr-NA" => "af-NA",
    "afr-ZA" => "af-ZA",
    aka => "ak",
    "aka-GH" => "ak-GH",
    alb => "sq",
    "alb-AL" => "sq-AL",
    "alb-MK" => "sq-MK",
    "alb-XK" => "sq-XK",
    amh => "am",
    "amh-ET" => "am-ET",
    ara => "ar",
    "ara-001" => "ar-001",
    "ara-AE" => "ar-AE",
    "ara-BH" => "ar-BH",
    "ara-DJ" => "ar-DJ",
    "ara-DZ" => "ar-DZ",
    "ara-EG" => "ar-EG",
    "ara-EH" => "ar-EH",
    "ara-ER" => "ar-ER",
    "ara-IL" => "ar-IL",
    "ara-IQ" => "ar-IQ",
    "ara-JO" => "ar-JO",
    "ara-KM" => "ar-KM",
    "ara-KW" => "ar-KW",
    "ara-LB" => "ar-LB",
    "ara-LY" => "ar-LY",
    "ara-MA" => "ar-MA",
    "ara-MR" => "ar-MR",
    "ara-OM" => "ar-OM",
    "ara-PS" => "ar-PS",
    "ara-QA" => "ar-QA",
    "ara-SA" => "ar-SA",
    "ara-SD" => "ar-SD",
    "ara-SO" => "ar-SO",
    "ara-SS" => "ar-SS",
    "ara-SY" => "ar-SY",
    "ara-TD" => "ar-TD",
    "ara-TN" => "ar-TN",
    "ara-YE" => "ar-YE",
    arm => "hy",
    "arm-AM" => "hy-AM",
    asm => "as",
    "asm-IN" => "as-IN",
    aze => "az",
    "aze-Cyrl" => "az-Cyrl",
    "aze-Cyrl-AZ" => "az-Cyrl-AZ",
    "aze-Latn" => "az-Latn",
    "aze-Latn-AZ" => "az-Latn-AZ",
    bam => "bm",
    "bam-ML" => "bm-ML",
    baq => "eu",
    "baq-ES" => "eu-ES",
    bel => "be",
    "bel-BY" => "be-BY",
    ben => "bn",
    "ben-BD" => "bn-BD",
    "ben-IN" => "bn-IN",
    bos => "bs",
    "bos-Cyrl" => "bs-Cyrl",
    "bos-Cyrl-BA" => "bs-Cyrl-BA",
    "bos-Latn" => "bs-Latn",
    "bos-Latn-BA" => "bs-Latn-BA",
    bre => "br",
    "bre-FR" => "br-FR",
    bul => "bg",
    "bul-BG" => "bg-BG",
    bur => "my",
    "bur-MM" => "my-MM",
    cat => "ca",
    "cat-AD" => "ca-AD",
    "cat-ES" => "ca-ES",
    "cat-ES-VALENCIA" => "ca-ES-VALENCIA",
    "cat-FR" => "ca-FR",
    "cat-IT" => "ca-IT",
    che => "ce",
    "che-RU" => "ce-RU",
    chi => "zh",
    "chi-Hans" => "zh-Hans",
    "chi-Hans-CN" => "zh-Hans-CN",
    "chi-Hans-HK" => "zh-Hans-HK",
    "chi-Hans-MO" => "zh-Hans-MO",
    "chi-Hans-SG" => "zh-Hans-SG",
    "chi-Hant" => "zh-Hant",
    "chi-Hant-HK" => "zh-Hant-HK",
    "chi-Hant-MO" => "zh-Hant-MO",
    "chi-Hant-TW" => "zh-Hant-TW",
    chu => "cu",
    "chu-RU" => "cu-RU",
    cor => "kw",
    "cor-GB" => "kw-GB",
    cze => "cs",
    "cze-CZ" => "cs-CZ",
    dan => "da",
    "dan-DK" => "da-DK",
    "dan-GL" => "da-GL",
    dut => "nl",
    "dut-AW" => "nl-AW",
    "dut-BE" => "nl-BE",
    "dut-BQ" => "nl-BQ",
    "dut-CW" => "nl-CW",
    "dut-NL" => "nl-NL",
    "dut-SR" => "nl-SR",
    "dut-SX" => "nl-SX",
    dzo => "dz",
    "dzo-BT" => "dz-BT",
    eng => "en",
    "eng-001" => "en-001",
    "eng-150" => "en-150",
    "eng-AE" => "en-AE",
    "eng-AG" => "en-AG",
    "eng-AI" => "en-AI",
    "eng-AS" => "en-AS",
    "eng-AT" => "en-AT",
    "eng-AU" => "en-AU",
    "eng-BB" => "en-BB",
    "eng-BE" => "en-BE",
    "eng-BI" => "en-BI",
    "eng-BM" => "en-BM",
    "eng-BS" => "en-BS",
    "eng-BW" => "en-BW",
    "eng-BZ" => "en-BZ",
    "eng-CA" => "en-CA",
    "eng-CC" => "en-CC",
    "eng-CH" => "en-CH",
    "eng-CK" => "en-CK",
    "eng-CM" => "en-CM",
    "eng-CX" => "en-CX",
    "eng-CY" => "en-CY",
    "eng-DE" => "en-DE",
    "eng-DG" => "en-DG",
    "eng-DK" => "en-DK",
    "eng-DM" => "en-DM",
    "eng-ER" => "en-ER",
    "eng-FI" => "en-FI",
    "eng-FJ" => "en-FJ",
    "eng-FK" => "en-FK",
    "eng-FM" => "en-FM",
    "eng-GB" => "en-GB",
    "eng-GD" => "en-GD",
    "eng-GG" => "en-GG",
    "eng-GH" => "en-GH",
    "eng-GI" => "en-GI",
    "eng-GM" => "en-GM",
    "eng-GU" => "en-GU",
    "eng-GY" => "en-GY",
    "eng-HK" => "en-HK",
    "eng-IE" => "en-IE",
    "eng-IL" => "en-IL",
    "eng-IM" => "en-IM",
    "eng-IN" => "en-IN",
    "eng-IO" => "en-IO",
    "eng-JE" => "en-JE",
    "eng-JM" => "en-JM",
    "eng-KE" => "en-KE",
    "eng-KI" => "en-KI",
    "eng-KN" => "en-KN",
    "eng-KY" => "en-KY",
    "eng-LC" => "en-LC",
    "eng-LR" => "en-LR",
    "eng-LS" => "en-LS",
    "eng-MG" => "en-MG",
    "eng-MH" => "en-MH",
    "eng-MO" => "en-MO",
    "eng-MP" => "en-MP",
    "eng-MS" => "en-MS",
    "eng-MT" => "en-MT",
    "eng-MU" => "en-MU",
    "eng-MW" => "en-MW",
    "eng-MY" => "en-MY",
    "eng-NA" => "en-NA",
    "eng-NF" => "en-NF",
    "eng-NG" => "en-NG",
    "eng-NL" => "en-NL",
    "eng-NR" => "en-NR",
    "eng-NU" => "en-NU",
    "eng-NZ" => "en-NZ",
    "eng-PG" => "en-PG",
    "eng-PH" => "en-PH",
    "eng-PK" => "en-PK",
    "eng-PN" => "en-PN",
    "eng-PR" => "en-PR",
    "eng-PW" => "en-PW",
    "eng-RW" => "en-RW",
    "eng-SB" => "en-SB",
    "eng-SC" => "en-SC",
    "eng-SD" => "en-SD",
    "eng-SE" => "en-SE",
    "eng-SG" => "en-SG",
    "eng-SH" => "en-SH",
    "eng-SI" => "en-SI",
    "eng-SL" => "en-SL",
    "eng-SS" => "en-SS",
    "eng-SX" => "en-SX",
    "eng-SZ" => "en-SZ",
    "eng-TC" => "en-TC",
    "eng-TK" => "en-TK",
    "eng-TO" => "en-TO",
    "eng-TT" => "en-TT",
    "eng-TV" => "en-TV",
    "eng-TZ" => "en-TZ",
    "eng-UG" => "en-UG",
    "eng-UM" => "en-UM",
    "eng-US" => "en-US",
    "eng-US-POSIX" => "en-US-POSIX",
    "eng-VC" => "en-VC",
    "eng-VG" => "en-VG",
    "eng-VI" => "en-VI",
    "eng-VU" => "en-VU",
    "eng-WS" => "en-WS",
    "eng-ZA" => "en-ZA",
    "eng-ZM" => "en-ZM",
    "eng-ZW" => "en-ZW",
    epo => "eo",
    "epo-001" => "eo-001",
    est => "et",
    "est-EE" => "et-EE",
    ewe => "ee",
    "ewe-GH" => "ee-GH",
    "ewe-TG" => "ee-TG",
    fao => "fo",
    "fao-DK" => "fo-DK",
    "fao-FO" => "fo-FO",
    fin => "fi",
    "fin-FI" => "fi-FI",
    fre => "fr",
    "fre-BE" => "fr-BE",
    "fre-BF" => "fr-BF",
    "fre-BI" => "fr-BI",
    "fre-BJ" => "fr-BJ",
    "fre-BL" => "fr-BL",
    "fre-CA" => "fr-CA",
    "fre-CD" => "fr-CD",
    "fre-CF" => "fr-CF",
    "fre-CG" => "fr-CG",
    "fre-CH" => "fr-CH",
    "fre-CI" => "fr-CI",
    "fre-CM" => "fr-CM",
    "fre-DJ" => "fr-DJ",
    "fre-DZ" => "fr-DZ",
    "fre-FR" => "fr-FR",
    "fre-GA" => "fr-GA",
    "fre-GF" => "fr-GF",
    "fre-GN" => "fr-GN",
    "fre-GP" => "fr-GP",
    "fre-GQ" => "fr-GQ",
    "fre-HT" => "fr-HT",
    "fre-KM" => "fr-KM",
    "fre-LU" => "fr-LU",
    "fre-MA" => "fr-MA",
    "fre-MC" => "fr-MC",
    "fre-MF" => "fr-MF",
    "fre-MG" => "fr-MG",
    "fre-ML" => "fr-ML",
    "fre-MQ" => "fr-MQ",
    "fre-MR" => "fr-MR",
    "fre-MU" => "fr-MU",
    "fre-NC" => "fr-NC",
    "fre-NE" => "fr-NE",
    "fre-PF" => "fr-PF",
    "fre-PM" => "fr-PM",
    "fre-RE" => "fr-RE",
    "fre-RW" => "fr-RW",
    "fre-SC" => "fr-SC",
    "fre-SN" => "fr-SN",
    "fre-SY" => "fr-SY",
    "fre-TD" => "fr-TD",
    "fre-TG" => "fr-TG",
    "fre-TN" => "fr-TN",
    "fre-VU" => "fr-VU",
    "fre-WF" => "fr-WF",
    "fre-YT" => "fr-YT",
    fry => "fy",
    "fry-NL" => "fy-NL",
    ful => "ff",
    "ful-Latn" => "ff-Latn",
    "ful-Latn-BF" => "ff-Latn-BF",
    "ful-Latn-CM" => "ff-Latn-CM",
    "ful-Latn-GH" => "ff-Latn-GH",
    "ful-Latn-GM" => "ff-Latn-GM",
    "ful-Latn-GN" => "ff-Latn-GN",
    "ful-Latn-GW" => "ff-Latn-GW",
    "ful-Latn-LR" => "ff-Latn-LR",
    "ful-Latn-MR" => "ff-Latn-MR",
    "ful-Latn-NE" => "ff-Latn-NE",
    "ful-Latn-NG" => "ff-Latn-NG",
    "ful-Latn-SL" => "ff-Latn-SL",
    "ful-Latn-SN" => "ff-Latn-SN",
    geo => "ka",
    "geo-GE" => "ka-GE",
    ger => "de",
    "ger-AT" => "de-AT",
    "ger-BE" => "de-BE",
    "ger-CH" => "de-CH",
    "ger-DE" => "de-DE",
    "ger-IT" => "de-IT",
    "ger-LI" => "de-LI",
    "ger-LU" => "de-LU",
    gla => "gd",
    "gla-GB" => "gd-GB",
    gle => "ga",
    "gle-IE" => "ga-IE",
    glg => "gl",
    "glg-ES" => "gl-ES",
    glv => "gv",
    "glv-IM" => "gv-IM",
    gre => "el",
    "gre-CY" => "el-CY",
    "gre-GR" => "el-GR",
    guj => "gu",
    "guj-IN" => "gu-IN",
    hau => "ha",
    "hau-GH" => "ha-GH",
    "hau-NE" => "ha-NE",
    "hau-NG" => "ha-NG",
    heb => "he",
    "heb-IL" => "he-IL",
    hin => "hi",
    "hin-IN" => "hi-IN",
    hrv => "hr",
    "hrv-BA" => "hr-BA",
    "hrv-HR" => "hr-HR",
    hun => "hu",
    "hun-HU" => "hu-HU",
    ibo => "ig",
    "ibo-NG" => "ig-NG",
    ice => "is",
    "ice-IS" => "is-IS",
    iii => "ii",
    "iii-CN" => "ii-CN",
    ina => "ia",
    "ina-001" => "ia-001",
    ind => "id",
    "ind-ID" => "id-ID",
    ita => "it",
    "ita-CH" => "it-CH",
    "ita-IT" => "it-IT",
    "ita-SM" => "it-SM",
    "ita-VA" => "it-VA",
    jav => "jv",
    "jav-ID" => "jv-ID",
    jpn => "ja",
    "jpn-JP" => "ja-JP",
    kal => "kl",
    "kal-GL" => "kl-GL",
    kan => "kn",
    "kan-IN" => "kn-IN",
    kas => "ks",
    "kas-IN" => "ks-IN",
    kaz => "kk",
    "kaz-KZ" => "kk-KZ",
    khm => "km",
    "khm-KH" => "km-KH",
    kik => "ki",
    "kik-KE" => "ki-KE",
    kin => "rw",
    "kin-RW" => "rw-RW",
    kir => "ky",
    "kir-KG" => "ky-KG",
    kor => "ko",
    "kor-KP" => "ko-KP",
    "kor-KR" => "ko-KR",
    kur => "ku",
    "kur-TR" => "ku-TR",
    lao => "lo",
    "lao-LA" => "lo-LA",
    lav => "lv",
    "lav-LV" => "lv-LV",
    lin => "ln",
    "lin-AO" => "ln-AO",
    "lin-CD" => "ln-CD",
    "lin-CF" => "ln-CF",
    "lin-CG" => "ln-CG",
    lit => "lt",
    "lit-LT" => "lt-LT",
    ltz => "lb",
    "ltz-LU" => "lb-LU",
    lub => "lu",
    "lub-CD" => "lu-CD",
    lug => "lg",
    "lug-UG" => "lg-UG",
    mac => "mk",
    "mac-MK" => "mk-MK",
    mal => "ml",
    "mal-IN" => "ml-IN",
    mao => "mi",
    "mao-NZ" => "mi-NZ",
    mar => "mr",
    "mar-IN" => "mr-IN",
    may => "ms",
    "may-BN" => "ms-BN",
    "may-MY" => "ms-MY",
    "may-SG" => "ms-SG",
    mlg => "mg",
    "mlg-MG" => "mg-MG",
    mlt => "mt",
    "mlt-MT" => "mt-MT",
    mon => "mn",
    "mon-MN" => "mn-MN",
    nde => "nd",
    "nde-ZW" => "nd-ZW",
    nep => "ne",
    "nep-IN" => "ne-IN",
    "nep-NP" => "ne-NP",
    nno => "nn",
    "nno-NO" => "nn-NO",
    nob => "nb",
    "nob-NO" => "nb-NO",
    "nob-SJ" => "nb-SJ",
    ori => "or",
    "ori-IN" => "or-IN",
    orm => "om",
    "orm-ET" => "om-ET",
    "orm-KE" => "om-KE",
    oss => "os",
    "oss-GE" => "os-GE",
    "oss-RU" => "os-RU",
    pan => "pa",
    "pan-Arab" => "pa-Arab",
    "pan-Arab-PK" => "pa-Arab-PK",
    "pan-Guru" => "pa-Guru",
    "pan-Guru-IN" => "pa-Guru-IN",
    per => "fa",
    "per-AF" => "fa-AF",
    "per-IR" => "fa-IR",
    pol => "pl",
    "pol-PL" => "pl-PL",
    por => "pt",
    "por-AO" => "pt-AO",
    "por-BR" => "pt-BR",
    "por-CH" => "pt-CH",
    "por-CV" => "pt-CV",
    "por-GQ" => "pt-GQ",
    "por-GW" => "pt-GW",
    "por-LU" => "pt-LU",
    "por-MO" => "pt-MO",
    "por-MZ" => "pt-MZ",
    "por-PT" => "pt-PT",
    "por-ST" => "pt-ST",
    "por-TL" => "pt-TL",
    pus => "ps",
    "pus-AF" => "ps-AF",
    "pus-PK" => "ps-PK",
    que => "qu",
    "que-BO" => "qu-BO",
    "que-EC" => "qu-EC",
    "que-PE" => "qu-PE",
    roh => "rm",
    "roh-CH" => "rm-CH",
    rum => "ro",
    "rum-MD" => "ro-MD",
    "rum-RO" => "ro-RO",
    run => "rn",
    "run-BI" => "rn-BI",
    rus => "ru",
    "rus-BY" => "ru-BY",
    "rus-KG" => "ru-KG",
    "rus-KZ" => "ru-KZ",
    "rus-MD" => "ru-MD",
    "rus-RU" => "ru-RU",
    "rus-UA" => "ru-UA",
    sag => "sg",
    "sag-CF" => "sg-CF",
    sin => "si",
    "sin-LK" => "si-LK",
    slo => "sk",
    "slo-SK" => "sk-SK",
    slv => "sl",
    "slv-SI" => "sl-SI",
    sme => "se",
    "sme-FI" => "se-FI",
    "sme-NO" => "se-NO",
    "sme-SE" => "se-SE",
    sna => "sn",
    "sna-ZW" => "sn-ZW",
    snd => "sd",
    "snd-PK" => "sd-PK",
    som => "so",
    "som-DJ" => "so-DJ",
    "som-ET" => "so-ET",
    "som-KE" => "so-KE",
    "som-SO" => "so-SO",
    spa => "es",
    "spa-419" => "es-419",
    "spa-AR" => "es-AR",
    "spa-BO" => "es-BO",
    "spa-BR" => "es-BR",
    "spa-BZ" => "es-BZ",
    "spa-CL" => "es-CL",
    "spa-CO" => "es-CO",
    "spa-CR" => "es-CR",
    "spa-CU" => "es-CU",
    "spa-DO" => "es-DO",
    "spa-EA" => "es-EA",
    "spa-EC" => "es-EC",
    "spa-ES" => "es-ES",
    "spa-GQ" => "es-GQ",
    "spa-GT" => "es-GT",
    "spa-HN" => "es-HN",
    "spa-IC" => "es-IC",
    "spa-MX" => "es-MX",
    "spa-NI" => "es-NI",
    "spa-PA" => "es-PA",
    "spa-PE" => "es-PE",
    "spa-PH" => "es-PH",
    "spa-PR" => "es-PR",
    "spa-PY" => "es-PY",
    "spa-SV" => "es-SV",
    "spa-US" => "es-US",
    "spa-UY" => "es-UY",
    "spa-VE" => "es-VE",
    srp => "sr",
    "srp-Cyrl" => "sr-Cyrl",
    "srp-Cyrl-BA" => "sr-Cyrl-BA",
    "srp-Cyrl-ME" => "sr-Cyrl-ME",
    "srp-Cyrl-RS" => "sr-Cyrl-RS",
    "srp-Cyrl-XK" => "sr-Cyrl-XK",
    "srp-Latn" => "sr-Latn",
    "srp-Latn-BA" => "sr-Latn-BA",
    "srp-Latn-ME" => "sr-Latn-ME",
    "srp-Latn-RS" => "sr-Latn-RS",
    "srp-Latn-XK" => "sr-Latn-XK",
    swa => "sw",
    "swa-CD" => "sw-CD",
    "swa-KE" => "sw-KE",
    "swa-TZ" => "sw-TZ",
    "swa-UG" => "sw-UG",
    swe => "sv",
    "swe-AX" => "sv-AX",
    "swe-FI" => "sv-FI",
    "swe-SE" => "sv-SE",
    tam => "ta",
    "tam-IN" => "ta-IN",
    "tam-LK" => "ta-LK",
    "tam-MY" => "ta-MY",
    "tam-SG" => "ta-SG",
    tat => "tt",
    "tat-RU" => "tt-RU",
    tel => "te",
    "tel-IN" => "te-IN",
    tgk => "tg",
    "tgk-TJ" => "tg-TJ",
    tha => "th",
    "tha-TH" => "th-TH",
    tib => "bo",
    "tib-CN" => "bo-CN",
    "tib-IN" => "bo-IN",
    tir => "ti",
    "tir-ER" => "ti-ER",
    "tir-ET" => "ti-ET",
    ton => "to",
    "ton-TO" => "to-TO",
    tuk => "tk",
    "tuk-TM" => "tk-TM",
    tur => "tr",
    "tur-CY" => "tr-CY",
    "tur-TR" => "tr-TR",
    uig => "ug",
    "uig-CN" => "ug-CN",
    ukr => "uk",
    "ukr-UA" => "uk-UA",
    urd => "ur",
    "urd-IN" => "ur-IN",
    "urd-PK" => "ur-PK",
    uzb => "uz",
    "uzb-Arab" => "uz-Arab",
    "uzb-Arab-AF" => "uz-Arab-AF",
    "uzb-Cyrl" => "uz-Cyrl",
    "uzb-Cyrl-UZ" => "uz-Cyrl-UZ",
    "uzb-Latn" => "uz-Latn",
    "uzb-Latn-UZ" => "uz-Latn-UZ",
    vie => "vi",
    "vie-VN" => "vi-VN",
    vol => "vo",
    "vol-001" => "vo-001",
    wel => "cy",
    "wel-GB" => "cy-GB",
    wol => "wo",
    "wol-SN" => "wo-SN",
    xho => "xh",
    "xho-ZA" => "xh-ZA",
    yid => "yi",
    "yid-001" => "yi-001",
    yor => "yo",
    "yor-BJ" => "yo-BJ",
    "yor-NG" => "yo-NG",
    zul => "zu",
    "zul-ZA" => "zu-ZA",
  );
  ### :end ISO639Aliases:
  #>>>
  
  #<<<
  ### :start LocaleData:
  my %LocaleData = (
    ar => {
      am_pm_abbreviated => [
        "\N{U+0635}",
        "\N{U+0645}",
      ],
      available_formats => {
        Bh => "h B",
        Bhm => "h:mm B",
        Bhms => "h:mm:ss B",
        E => "ccc",
        EBhm => "E h:mm B",
        EBhms => "E h:mm:ss B",
        EHm => "E HH:mm",
        EHms => "E HH:mm:ss",
        Ed => "E\N{U+060c} d",
        Ehm => "E h:mm a",
        Ehms => "E h:mm:ss a",
        Gy => "y G",
        GyMMM => "MMM y G",
        GyMMMEd => "E\N{U+060c} d MMM y G",
        GyMMMd => "d MMM y G",
        H => "HH",
        Hm => "HH:mm",
        Hms => "HH:mm:ss",
        Hmsv => "HH:mm:ss v",
        Hmv => "HH:mm v",
        M => "L",
        MEd => "E\N{U+060c} d/M",
        MMM => "LLL",
        MMMEd => "E\N{U+060c} d MMM",
        MMMMEd => "E\N{U+060c} d MMMM",
        "MMMMW-count-few" => "\N{U+0627}\N{U+0644}\N{U+0623}\N{U+0633}\N{U+0628}\N{U+0648}\N{U+0639} W \N{U+0645}\N{U+0646} MMMM",
        "MMMMW-count-many" => "\N{U+0627}\N{U+0644}\N{U+0623}\N{U+0633}\N{U+0628}\N{U+0648}\N{U+0639} W \N{U+0645}\N{U+0646} MMMM",
        "MMMMW-count-one" => "\N{U+0627}\N{U+0644}\N{U+0623}\N{U+0633}\N{U+0628}\N{U+0648}\N{U+0639} W \N{U+0645}\N{U+0646} MMMM",
        "MMMMW-count-other" => "\N{U+0627}\N{U+0644}\N{U+0623}\N{U+0633}\N{U+0628}\N{U+0648}\N{U+0639} W \N{U+0645}\N{U+0646} MMMM",
        "MMMMW-count-two" => "\N{U+0627}\N{U+0644}\N{U+0623}\N{U+0633}\N{U+0628}\N{U+0648}\N{U+0639} W \N{U+0645}\N{U+0646} MMMM",
        "MMMMW-count-zero" => "\N{U+0627}\N{U+0644}\N{U+0623}\N{U+0633}\N{U+0628}\N{U+0648}\N{U+0639} W \N{U+0645}\N{U+0646} MMMM",
        MMMMd => "d MMMM",
        MMMd => "d MMM",
        MMdd => "dd\N{U+200f}/MM",
        Md => "d/\N{U+200f}M",
        d => "d",
        h => "h a",
        hm => "h:mm a",
        hms => "h:mm:ss a",
        hmsv => "h:mm:ss a v",
        hmv => "h:mm a v",
        ms => "mm:ss",
        y => "y",
        yM => "M\N{U+200f}/y",
        yMEd => "E\N{U+060c} d/\N{U+200f}M/\N{U+200f}y",
        yMM => "MM\N{U+200f}/y",
        yMMM => "MMM y",
        yMMMEd => "E\N{U+060c} d MMM y",
        yMMMM => "MMMM y",
        yMMMd => "d MMM y",
        yMd => "d\N{U+200f}/M\N{U+200f}/y",
        yQQQ => "QQQ y",
        yQQQQ => "QQQQ y",
        "yw-count-few" => "\N{U+0627}\N{U+0644}\N{U+0623}\N{U+0633}\N{U+0628}\N{U+0648}\N{U+0639} w \N{U+0645}\N{U+0646} \N{U+0633}\N{U+0646}\N{U+0629} Y",
        "yw-count-many" => "\N{U+0627}\N{U+0644}\N{U+0623}\N{U+0633}\N{U+0628}\N{U+0648}\N{U+0639} w \N{U+0645}\N{U+0646} \N{U+0633}\N{U+0646}\N{U+0629} Y",
        "yw-count-one" => "\N{U+0627}\N{U+0644}\N{U+0623}\N{U+0633}\N{U+0628}\N{U+0648}\N{U+0639} w \N{U+0645}\N{U+0646} \N{U+0633}\N{U+0646}\N{U+0629} Y",
        "yw-count-other" => "\N{U+0627}\N{U+0644}\N{U+0623}\N{U+0633}\N{U+0628}\N{U+0648}\N{U+0639} w \N{U+0645}\N{U+0646} \N{U+0633}\N{U+0646}\N{U+0629} Y",
        "yw-count-two" => "\N{U+0627}\N{U+0644}\N{U+0623}\N{U+0633}\N{U+0628}\N{U+0648}\N{U+0639} w \N{U+0645}\N{U+0646} \N{U+0633}\N{U+0646}\N{U+0629} Y",
        "yw-count-zero" => "\N{U+0627}\N{U+0644}\N{U+0623}\N{U+0633}\N{U+0628}\N{U+0648}\N{U+0639} w \N{U+0645}\N{U+0646} \N{U+0633}\N{U+0646}\N{U+0629} Y",
      },
      code => "ar",
      date_format_full => "EEEE\N{U+060c} d MMMM y",
      date_format_long => "d MMMM y",
      date_format_medium => "dd\N{U+200f}/MM\N{U+200f}/y",
      date_format_short => "d\N{U+200f}/M\N{U+200f}/y",
      datetime_format_full => "{1} {0}",
      datetime_format_long => "{1} {0}",
      datetime_format_medium => "{1} {0}",
      datetime_format_short => "{1} {0}",
      day_format_abbreviated => [
        "\N{U+0627}\N{U+0644}\N{U+0627}\N{U+062b}\N{U+0646}\N{U+064a}\N{U+0646}",
        "\N{U+0627}\N{U+0644}\N{U+062b}\N{U+0644}\N{U+0627}\N{U+062b}\N{U+0627}\N{U+0621}",
        "\N{U+0627}\N{U+0644}\N{U+0623}\N{U+0631}\N{U+0628}\N{U+0639}\N{U+0627}\N{U+0621}",
        "\N{U+0627}\N{U+0644}\N{U+062e}\N{U+0645}\N{U+064a}\N{U+0633}",
        "\N{U+0627}\N{U+0644}\N{U+062c}\N{U+0645}\N{U+0639}\N{U+0629}",
        "\N{U+0627}\N{U+0644}\N{U+0633}\N{U+0628}\N{U+062a}",
        "\N{U+0627}\N{U+0644}\N{U+0623}\N{U+062d}\N{U+062f}",
      ],
      day_format_narrow => [
        "\N{U+0646}",
        "\N{U+062b}",
        "\N{U+0631}",
        "\N{U+062e}",
        "\N{U+062c}",
        "\N{U+0633}",
        "\N{U+062d}",
      ],
      day_format_wide => [
        "\N{U+0627}\N{U+0644}\N{U+0627}\N{U+062b}\N{U+0646}\N{U+064a}\N{U+0646}",
        "\N{U+0627}\N{U+0644}\N{U+062b}\N{U+0644}\N{U+0627}\N{U+062b}\N{U+0627}\N{U+0621}",
        "\N{U+0627}\N{U+0644}\N{U+0623}\N{U+0631}\N{U+0628}\N{U+0639}\N{U+0627}\N{U+0621}",
        "\N{U+0627}\N{U+0644}\N{U+062e}\N{U+0645}\N{U+064a}\N{U+0633}",
        "\N{U+0627}\N{U+0644}\N{U+062c}\N{U+0645}\N{U+0639}\N{U+0629}",
        "\N{U+0627}\N{U+0644}\N{U+0633}\N{U+0628}\N{U+062a}",
        "\N{U+0627}\N{U+0644}\N{U+0623}\N{U+062d}\N{U+062f}",
      ],
      day_stand_alone_abbreviated => [
        "\N{U+0627}\N{U+0644}\N{U+0627}\N{U+062b}\N{U+0646}\N{U+064a}\N{U+0646}",
        "\N{U+0627}\N{U+0644}\N{U+062b}\N{U+0644}\N{U+0627}\N{U+062b}\N{U+0627}\N{U+0621}",
        "\N{U+0627}\N{U+0644}\N{U+0623}\N{U+0631}\N{U+0628}\N{U+0639}\N{U+0627}\N{U+0621}",
        "\N{U+0627}\N{U+0644}\N{U+062e}\N{U+0645}\N{U+064a}\N{U+0633}",
        "\N{U+0627}\N{U+0644}\N{U+062c}\N{U+0645}\N{U+0639}\N{U+0629}",
        "\N{U+0627}\N{U+0644}\N{U+0633}\N{U+0628}\N{U+062a}",
        "\N{U+0627}\N{U+0644}\N{U+0623}\N{U+062d}\N{U+062f}",
      ],
      day_stand_alone_narrow => [
        "\N{U+0646}",
        "\N{U+062b}",
        "\N{U+0631}",
        "\N{U+062e}",
        "\N{U+062c}",
        "\N{U+0633}",
        "\N{U+062d}",
      ],
      day_stand_alone_wide => [
        "\N{U+0627}\N{U+0644}\N{U+0627}\N{U+062b}\N{U+0646}\N{U+064a}\N{U+0646}",
        "\N{U+0627}\N{U+0644}\N{U+062b}\N{U+0644}\N{U+0627}\N{U+062b}\N{U+0627}\N{U+0621}",
        "\N{U+0627}\N{U+0644}\N{U+0623}\N{U+0631}\N{U+0628}\N{U+0639}\N{U+0627}\N{U+0621}",
        "\N{U+0627}\N{U+0644}\N{U+062e}\N{U+0645}\N{U+064a}\N{U+0633}",
        "\N{U+0627}\N{U+0644}\N{U+062c}\N{U+0645}\N{U+0639}\N{U+0629}",
        "\N{U+0627}\N{U+0644}\N{U+0633}\N{U+0628}\N{U+062a}",
        "\N{U+0627}\N{U+0644}\N{U+0623}\N{U+062d}\N{U+062f}",
      ],
      era_abbreviated => [
        "\N{U+0642}.\N{U+0645}",
        "\N{U+0645}",
      ],
      era_narrow => [
        "\N{U+0642}.\N{U+0645}",
        "\N{U+0645}",
      ],
      era_wide => [
        "\N{U+0642}\N{U+0628}\N{U+0644} \N{U+0627}\N{U+0644}\N{U+0645}\N{U+064a}\N{U+0644}\N{U+0627}\N{U+062f}",
        "\N{U+0645}\N{U+064a}\N{U+0644}\N{U+0627}\N{U+062f}\N{U+064a}",
      ],
      first_day_of_week => 1,
      glibc_date_1_format => "%a %b %e %H:%M:%S %Z %Y",
      glibc_date_format => "%m/%d/%y",
      glibc_datetime_format => "%a %b %e %H:%M:%S %Y",
      glibc_time_12_format => "%I:%M:%S %p",
      glibc_time_format => "%H:%M:%S",
      language => "Arabic",
      month_format_abbreviated => [
        "\N{U+064a}\N{U+0646}\N{U+0627}\N{U+064a}\N{U+0631}",
        "\N{U+0641}\N{U+0628}\N{U+0631}\N{U+0627}\N{U+064a}\N{U+0631}",
        "\N{U+0645}\N{U+0627}\N{U+0631}\N{U+0633}",
        "\N{U+0623}\N{U+0628}\N{U+0631}\N{U+064a}\N{U+0644}",
        "\N{U+0645}\N{U+0627}\N{U+064a}\N{U+0648}",
        "\N{U+064a}\N{U+0648}\N{U+0646}\N{U+064a}\N{U+0648}",
        "\N{U+064a}\N{U+0648}\N{U+0644}\N{U+064a}\N{U+0648}",
        "\N{U+0623}\N{U+063a}\N{U+0633}\N{U+0637}\N{U+0633}",
        "\N{U+0633}\N{U+0628}\N{U+062a}\N{U+0645}\N{U+0628}\N{U+0631}",
        "\N{U+0623}\N{U+0643}\N{U+062a}\N{U+0648}\N{U+0628}\N{U+0631}",
        "\N{U+0646}\N{U+0648}\N{U+0641}\N{U+0645}\N{U+0628}\N{U+0631}",
        "\N{U+062f}\N{U+064a}\N{U+0633}\N{U+0645}\N{U+0628}\N{U+0631}",
      ],
      month_format_narrow => [
        "\N{U+064a}",
        "\N{U+0641}",
        "\N{U+0645}",
        "\N{U+0623}",
        "\N{U+0648}",
        "\N{U+0646}",
        "\N{U+0644}",
        "\N{U+063a}",
        "\N{U+0633}",
        "\N{U+0643}",
        "\N{U+0628}",
        "\N{U+062f}",
      ],
      month_format_wide => [
        "\N{U+064a}\N{U+0646}\N{U+0627}\N{U+064a}\N{U+0631}",
        "\N{U+0641}\N{U+0628}\N{U+0631}\N{U+0627}\N{U+064a}\N{U+0631}",
        "\N{U+0645}\N{U+0627}\N{U+0631}\N{U+0633}",
        "\N{U+0623}\N{U+0628}\N{U+0631}\N{U+064a}\N{U+0644}",
        "\N{U+0645}\N{U+0627}\N{U+064a}\N{U+0648}",
        "\N{U+064a}\N{U+0648}\N{U+0646}\N{U+064a}\N{U+0648}",
        "\N{U+064a}\N{U+0648}\N{U+0644}\N{U+064a}\N{U+0648}",
        "\N{U+0623}\N{U+063a}\N{U+0633}\N{U+0637}\N{U+0633}",
        "\N{U+0633}\N{U+0628}\N{U+062a}\N{U+0645}\N{U+0628}\N{U+0631}",
        "\N{U+0623}\N{U+0643}\N{U+062a}\N{U+0648}\N{U+0628}\N{U+0631}",
        "\N{U+0646}\N{U+0648}\N{U+0641}\N{U+0645}\N{U+0628}\N{U+0631}",
        "\N{U+062f}\N{U+064a}\N{U+0633}\N{U+0645}\N{U+0628}\N{U+0631}",
      ],
      month_stand_alone_abbreviated => [
        "\N{U+064a}\N{U+0646}\N{U+0627}\N{U+064a}\N{U+0631}",
        "\N{U+0641}\N{U+0628}\N{U+0631}\N{U+0627}\N{U+064a}\N{U+0631}",
        "\N{U+0645}\N{U+0627}\N{U+0631}\N{U+0633}",
        "\N{U+0623}\N{U+0628}\N{U+0631}\N{U+064a}\N{U+0644}",
        "\N{U+0645}\N{U+0627}\N{U+064a}\N{U+0648}",
        "\N{U+064a}\N{U+0648}\N{U+0646}\N{U+064a}\N{U+0648}",
        "\N{U+064a}\N{U+0648}\N{U+0644}\N{U+064a}\N{U+0648}",
        "\N{U+0623}\N{U+063a}\N{U+0633}\N{U+0637}\N{U+0633}",
        "\N{U+0633}\N{U+0628}\N{U+062a}\N{U+0645}\N{U+0628}\N{U+0631}",
        "\N{U+0623}\N{U+0643}\N{U+062a}\N{U+0648}\N{U+0628}\N{U+0631}",
        "\N{U+0646}\N{U+0648}\N{U+0641}\N{U+0645}\N{U+0628}\N{U+0631}",
        "\N{U+062f}\N{U+064a}\N{U+0633}\N{U+0645}\N{U+0628}\N{U+0631}",
      ],
      month_stand_alone_narrow => [
        "\N{U+064a}",
        "\N{U+0641}",
        "\N{U+0645}",
        "\N{U+0623}",
        "\N{U+0648}",
        "\N{U+0646}",
        "\N{U+0644}",
        "\N{U+063a}",
        "\N{U+0633}",
        "\N{U+0643}",
        "\N{U+0628}",
        "\N{U+062f}",
      ],
      month_stand_alone_wide => [
        "\N{U+064a}\N{U+0646}\N{U+0627}\N{U+064a}\N{U+0631}",
        "\N{U+0641}\N{U+0628}\N{U+0631}\N{U+0627}\N{U+064a}\N{U+0631}",
        "\N{U+0645}\N{U+0627}\N{U+0631}\N{U+0633}",
        "\N{U+0623}\N{U+0628}\N{U+0631}\N{U+064a}\N{U+0644}",
        "\N{U+0645}\N{U+0627}\N{U+064a}\N{U+0648}",
        "\N{U+064a}\N{U+0648}\N{U+0646}\N{U+064a}\N{U+0648}",
        "\N{U+064a}\N{U+0648}\N{U+0644}\N{U+064a}\N{U+0648}",
        "\N{U+0623}\N{U+063a}\N{U+0633}\N{U+0637}\N{U+0633}",
        "\N{U+0633}\N{U+0628}\N{U+062a}\N{U+0645}\N{U+0628}\N{U+0631}",
        "\N{U+0623}\N{U+0643}\N{U+062a}\N{U+0648}\N{U+0628}\N{U+0631}",
        "\N{U+0646}\N{U+0648}\N{U+0641}\N{U+0645}\N{U+0628}\N{U+0631}",
        "\N{U+062f}\N{U+064a}\N{U+0633}\N{U+0645}\N{U+0628}\N{U+0631}",
      ],
      name => "Arabic",
      native_language => "\N{U+0627}\N{U+0644}\N{U+0639}\N{U+0631}\N{U+0628}\N{U+064a}\N{U+0629}",
      native_name => "\N{U+0627}\N{U+0644}\N{U+0639}\N{U+0631}\N{U+0628}\N{U+064a}\N{U+0629}",
      native_script => undef,
      native_territory => undef,
      native_variant => undef,
      quarter_format_abbreviated => [
        "\N{U+0627}\N{U+0644}\N{U+0631}\N{U+0628}\N{U+0639} \N{U+0627}\N{U+0644}\N{U+0623}\N{U+0648}\N{U+0644}",
        "\N{U+0627}\N{U+0644}\N{U+0631}\N{U+0628}\N{U+0639} \N{U+0627}\N{U+0644}\N{U+062b}\N{U+0627}\N{U+0646}\N{U+064a}",
        "\N{U+0627}\N{U+0644}\N{U+0631}\N{U+0628}\N{U+0639} \N{U+0627}\N{U+0644}\N{U+062b}\N{U+0627}\N{U+0644}\N{U+062b}",
        "\N{U+0627}\N{U+0644}\N{U+0631}\N{U+0628}\N{U+0639} \N{U+0627}\N{U+0644}\N{U+0631}\N{U+0627}\N{U+0628}\N{U+0639}",
      ],
      quarter_format_narrow => [
        "\N{U+0661}",
        "\N{U+0662}",
        "\N{U+0663}",
        "\N{U+0664}",
      ],
      quarter_format_wide => [
        "\N{U+0627}\N{U+0644}\N{U+0631}\N{U+0628}\N{U+0639} \N{U+0627}\N{U+0644}\N{U+0623}\N{U+0648}\N{U+0644}",
        "\N{U+0627}\N{U+0644}\N{U+0631}\N{U+0628}\N{U+0639} \N{U+0627}\N{U+0644}\N{U+062b}\N{U+0627}\N{U+0646}\N{U+064a}",
        "\N{U+0627}\N{U+0644}\N{U+0631}\N{U+0628}\N{U+0639} \N{U+0627}\N{U+0644}\N{U+062b}\N{U+0627}\N{U+0644}\N{U+062b}",
        "\N{U+0627}\N{U+0644}\N{U+0631}\N{U+0628}\N{U+0639} \N{U+0627}\N{U+0644}\N{U+0631}\N{U+0627}\N{U+0628}\N{U+0639}",
      ],
      quarter_stand_alone_abbreviated => [
        "\N{U+0627}\N{U+0644}\N{U+0631}\N{U+0628}\N{U+0639} \N{U+0627}\N{U+0644}\N{U+0623}\N{U+0648}\N{U+0644}",
        "\N{U+0627}\N{U+0644}\N{U+0631}\N{U+0628}\N{U+0639} \N{U+0627}\N{U+0644}\N{U+062b}\N{U+0627}\N{U+0646}\N{U+064a}",
        "\N{U+0627}\N{U+0644}\N{U+0631}\N{U+0628}\N{U+0639} \N{U+0627}\N{U+0644}\N{U+062b}\N{U+0627}\N{U+0644}\N{U+062b}",
        "\N{U+0627}\N{U+0644}\N{U+0631}\N{U+0628}\N{U+0639} \N{U+0627}\N{U+0644}\N{U+0631}\N{U+0627}\N{U+0628}\N{U+0639}",
      ],
      quarter_stand_alone_narrow => [
        "\N{U+0661}",
        "\N{U+0662}",
        "\N{U+0663}",
        "\N{U+0664}",
      ],
      quarter_stand_alone_wide => [
        "\N{U+0627}\N{U+0644}\N{U+0631}\N{U+0628}\N{U+0639} \N{U+0627}\N{U+0644}\N{U+0623}\N{U+0648}\N{U+0644}",
        "\N{U+0627}\N{U+0644}\N{U+0631}\N{U+0628}\N{U+0639} \N{U+0627}\N{U+0644}\N{U+062b}\N{U+0627}\N{U+0646}\N{U+064a}",
        "\N{U+0627}\N{U+0644}\N{U+0631}\N{U+0628}\N{U+0639} \N{U+0627}\N{U+0644}\N{U+062b}\N{U+0627}\N{U+0644}\N{U+062b}",
        "\N{U+0627}\N{U+0644}\N{U+0631}\N{U+0628}\N{U+0639} \N{U+0627}\N{U+0644}\N{U+0631}\N{U+0627}\N{U+0628}\N{U+0639}",
      ],
      script => undef,
      territory => undef,
      time_format_full => "h:mm:ss a zzzz",
      time_format_long => "h:mm:ss a z",
      time_format_medium => "h:mm:ss a",
      time_format_short => "h:mm a",
      variant => undef,
      version => 35,
    },
    en => {
      am_pm_abbreviated => [
        "AM",
        "PM",
      ],
      available_formats => {
        Bh => "h B",
        Bhm => "h:mm B",
        Bhms => "h:mm:ss B",
        E => "ccc",
        EBhm => "E h:mm B",
        EBhms => "E h:mm:ss B",
        EHm => "E HH:mm",
        EHms => "E HH:mm:ss",
        Ed => "d E",
        Ehm => "E h:mm a",
        Ehms => "E h:mm:ss a",
        Gy => "y G",
        GyMMM => "MMM y G",
        GyMMMEd => "E, MMM d, y G",
        GyMMMd => "MMM d, y G",
        H => "HH",
        Hm => "HH:mm",
        Hms => "HH:mm:ss",
        Hmsv => "HH:mm:ss v",
        Hmv => "HH:mm v",
        M => "L",
        MEd => "E, M/d",
        MMM => "LLL",
        MMMEd => "E, MMM d",
        "MMMMW-count-one" => "'week' W 'of' MMMM",
        "MMMMW-count-other" => "'week' W 'of' MMMM",
        MMMMd => "MMMM d",
        MMMd => "MMM d",
        Md => "M/d",
        d => "d",
        h => "h a",
        hm => "h:mm a",
        hms => "h:mm:ss a",
        hmsv => "h:mm:ss a v",
        hmv => "h:mm a v",
        ms => "mm:ss",
        y => "y",
        yM => "M/y",
        yMEd => "E, M/d/y",
        yMMM => "MMM y",
        yMMMEd => "E, MMM d, y",
        yMMMM => "MMMM y",
        yMMMd => "MMM d, y",
        yMd => "M/d/y",
        yQQQ => "QQQ y",
        yQQQQ => "QQQQ y",
        "yw-count-one" => "'week' w 'of' Y",
        "yw-count-other" => "'week' w 'of' Y",
      },
      code => "en",
      date_format_full => "EEEE, MMMM d, y",
      date_format_long => "MMMM d, y",
      date_format_medium => "MMM d, y",
      date_format_short => "M/d/yy",
      datetime_format_full => "{1} 'at' {0}",
      datetime_format_long => "{1} 'at' {0}",
      datetime_format_medium => "{1}, {0}",
      datetime_format_short => "{1}, {0}",
      day_format_abbreviated => [
        "Mon",
        "Tue",
        "Wed",
        "Thu",
        "Fri",
        "Sat",
        "Sun",
      ],
      day_format_narrow => [
        "M",
        "T",
        "W",
        "T",
        "F",
        "S",
        "S",
      ],
      day_format_wide => [
        "Monday",
        "Tuesday",
        "Wednesday",
        "Thursday",
        "Friday",
        "Saturday",
        "Sunday",
      ],
      day_stand_alone_abbreviated => [
        "Mon",
        "Tue",
        "Wed",
        "Thu",
        "Fri",
        "Sat",
        "Sun",
      ],
      day_stand_alone_narrow => [
        "M",
        "T",
        "W",
        "T",
        "F",
        "S",
        "S",
      ],
      day_stand_alone_wide => [
        "Monday",
        "Tuesday",
        "Wednesday",
        "Thursday",
        "Friday",
        "Saturday",
        "Sunday",
      ],
      era_abbreviated => [
        "BC",
        "AD",
      ],
      era_narrow => [
        "B",
        "A",
      ],
      era_wide => [
        "Before Christ",
        "Anno Domini",
      ],
      first_day_of_week => 1,
      glibc_date_1_format => "%a %b %e %H:%M:%S %Z %Y",
      glibc_date_format => "%m/%d/%y",
      glibc_datetime_format => "%a %b %e %H:%M:%S %Y",
      glibc_time_12_format => "%I:%M:%S %p",
      glibc_time_format => "%H:%M:%S",
      language => "English",
      month_format_abbreviated => [
        "Jan",
        "Feb",
        "Mar",
        "Apr",
        "May",
        "Jun",
        "Jul",
        "Aug",
        "Sep",
        "Oct",
        "Nov",
        "Dec",
      ],
      month_format_narrow => [
        "J",
        "F",
        "M",
        "A",
        "M",
        "J",
        "J",
        "A",
        "S",
        "O",
        "N",
        "D",
      ],
      month_format_wide => [
        "January",
        "February",
        "March",
        "April",
        "May",
        "June",
        "July",
        "August",
        "September",
        "October",
        "November",
        "December",
      ],
      month_stand_alone_abbreviated => [
        "Jan",
        "Feb",
        "Mar",
        "Apr",
        "May",
        "Jun",
        "Jul",
        "Aug",
        "Sep",
        "Oct",
        "Nov",
        "Dec",
      ],
      month_stand_alone_narrow => [
        "J",
        "F",
        "M",
        "A",
        "M",
        "J",
        "J",
        "A",
        "S",
        "O",
        "N",
        "D",
      ],
      month_stand_alone_wide => [
        "January",
        "February",
        "March",
        "April",
        "May",
        "June",
        "July",
        "August",
        "September",
        "October",
        "November",
        "December",
      ],
      name => "English",
      native_language => "English",
      native_name => "English",
      native_script => undef,
      native_territory => undef,
      native_variant => undef,
      quarter_format_abbreviated => [
        "Q1",
        "Q2",
        "Q3",
        "Q4",
      ],
      quarter_format_narrow => [
        1,
        2,
        3,
        4,
      ],
      quarter_format_wide => [
        "1st quarter",
        "2nd quarter",
        "3rd quarter",
        "4th quarter",
      ],
      quarter_stand_alone_abbreviated => [
        "Q1",
        "Q2",
        "Q3",
        "Q4",
      ],
      quarter_stand_alone_narrow => [
        1,
        2,
        3,
        4,
      ],
      quarter_stand_alone_wide => [
        "1st quarter",
        "2nd quarter",
        "3rd quarter",
        "4th quarter",
      ],
      script => undef,
      territory => undef,
      time_format_full => "h:mm:ss a zzzz",
      time_format_long => "h:mm:ss a z",
      time_format_medium => "h:mm:ss a",
      time_format_short => "h:mm a",
      variant => undef,
      version => 35,
    },
    "en-CA" => {
      am_pm_abbreviated => [
        "a.m.",
        "p.m.",
      ],
      available_formats => {
        Bh => "h B",
        Bhm => "h:mm B",
        Bhms => "h:mm:ss B",
        E => "ccc",
        EBhm => "E, h:mm B",
        EBhms => "E, h:mm:ss B",
        EHm => "E HH:mm",
        EHms => "E HH:mm:ss",
        Ed => "E d",
        Ehm => "E h:mm a",
        Ehms => "E h:mm:ss a",
        Gy => "y G",
        GyMMM => "MMM y G",
        GyMMMEd => "E, MMM d, y G",
        GyMMMd => "MMM d, y G",
        H => "HH",
        Hm => "HH:mm",
        Hms => "HH:mm:ss",
        Hmsv => "HH:mm:ss v",
        Hmv => "HH:mm v",
        M => "L",
        MEd => "E, MM-dd",
        "MEd-alt-variant" => "E, d/M",
        MMM => "LLL",
        MMMEd => "E, MMM d",
        "MMMMW-count-one" => "'week' W 'of' MMMM",
        "MMMMW-count-other" => "'week' W 'of' MMMM",
        MMMMd => "MMMM d",
        MMMd => "MMM d",
        MMdd => "MM-dd",
        "MMdd-alt-variant" => "dd/MM",
        Md => "MM-dd",
        "Md-alt-variant" => "d/M",
        d => "d",
        h => "h a",
        hm => "h:mm a",
        hms => "h:mm:ss a",
        hmsv => "h:mm:ss a v",
        hmv => "h:mm a v",
        ms => "mm:ss",
        y => "y",
        yM => "y-MM",
        "yM-alt-variant" => "M/y",
        yMEd => "E, y-MM-dd",
        "yMEd-alt-variant" => "E, d/M/y",
        yMMM => "MMM y",
        yMMMEd => "E, MMM d, y",
        yMMMM => "MMMM y",
        yMMMd => "MMM d, y",
        yMd => "y-MM-dd",
        "yMd-alt-variant" => "d/M/y",
        yQQQ => "QQQ y",
        yQQQQ => "QQQQ y",
        "yw-count-one" => "'week' w 'of' Y",
        "yw-count-other" => "'week' w 'of' Y",
      },
      code => "en-CA",
      date_format_full => "EEEE, MMMM d, y",
      date_format_long => "MMMM d, y",
      date_format_medium => "MMM d, y",
      date_format_short => "y-MM-dd",
      datetime_format_full => "{1} 'at' {0}",
      datetime_format_long => "{1} 'at' {0}",
      datetime_format_medium => "{1}, {0}",
      datetime_format_short => "{1}, {0}",
      day_format_abbreviated => [
        "Mon.",
        "Tue.",
        "Wed.",
        "Thu.",
        "Fri.",
        "Sat.",
        "Sun.",
      ],
      day_format_narrow => [
        "M",
        "T",
        "W",
        "T",
        "F",
        "S",
        "S",
      ],
      day_format_wide => [
        "Monday",
        "Tuesday",
        "Wednesday",
        "Thursday",
        "Friday",
        "Saturday",
        "Sunday",
      ],
      day_stand_alone_abbreviated => [
        "Mon.",
        "Tue.",
        "Wed.",
        "Thu.",
        "Fri.",
        "Sat.",
        "Sun.",
      ],
      day_stand_alone_narrow => [
        "M",
        "T",
        "W",
        "T",
        "F",
        "S",
        "S",
      ],
      day_stand_alone_wide => [
        "Monday",
        "Tuesday",
        "Wednesday",
        "Thursday",
        "Friday",
        "Saturday",
        "Sunday",
      ],
      era_abbreviated => [
        "BC",
        "AD",
      ],
      era_narrow => [
        "B",
        "A",
      ],
      era_wide => [
        "Before Christ",
        "Anno Domini",
      ],
      first_day_of_week => 7,
      glibc_date_1_format => "%a %b %e %H:%M:%S %Z %Y",
      glibc_date_format => "%Y-%m-%d",
      glibc_datetime_format => "%a %d %b %Y %r %Z",
      glibc_time_12_format => "%I:%M:%S %p",
      glibc_time_format => "%r",
      language => "English",
      month_format_abbreviated => [
        "Jan.",
        "Feb.",
        "Mar.",
        "Apr.",
        "May",
        "Jun.",
        "Jul.",
        "Aug.",
        "Sep.",
        "Oct.",
        "Nov.",
        "Dec.",
      ],
      month_format_narrow => [
        "J",
        "F",
        "M",
        "A",
        "M",
        "J",
        "J",
        "A",
        "S",
        "O",
        "N",
        "D",
      ],
      month_format_wide => [
        "January",
        "February",
        "March",
        "April",
        "May",
        "June",
        "July",
        "August",
        "September",
        "October",
        "November",
        "December",
      ],
      month_stand_alone_abbreviated => [
        "Jan.",
        "Feb.",
        "Mar.",
        "Apr.",
        "May",
        "Jun.",
        "Jul.",
        "Aug.",
        "Sep.",
        "Oct.",
        "Nov.",
        "Dec.",
      ],
      month_stand_alone_narrow => [
        "J",
        "F",
        "M",
        "A",
        "M",
        "J",
        "J",
        "A",
        "S",
        "O",
        "N",
        "D",
      ],
      month_stand_alone_wide => [
        "January",
        "February",
        "March",
        "April",
        "May",
        "June",
        "July",
        "August",
        "September",
        "October",
        "November",
        "December",
      ],
      name => "English Canada",
      native_language => "English",
      native_name => "English Canada",
      native_script => undef,
      native_territory => "Canada",
      native_variant => undef,
      quarter_format_abbreviated => [
        "Q1",
        "Q2",
        "Q3",
        "Q4",
      ],
      quarter_format_narrow => [
        1,
        2,
        3,
        4,
      ],
      quarter_format_wide => [
        "1st quarter",
        "2nd quarter",
        "3rd quarter",
        "4th quarter",
      ],
      quarter_stand_alone_abbreviated => [
        "Q1",
        "Q2",
        "Q3",
        "Q4",
      ],
      quarter_stand_alone_narrow => [
        1,
        2,
        3,
        4,
      ],
      quarter_stand_alone_wide => [
        "1st quarter",
        "2nd quarter",
        "3rd quarter",
        "4th quarter",
      ],
      script => undef,
      territory => "Canada",
      time_format_full => "h:mm:ss a zzzz",
      time_format_long => "h:mm:ss a z",
      time_format_medium => "h:mm:ss a",
      time_format_short => "h:mm a",
      variant => undef,
      version => 35,
    },
    "en-US" => {
      am_pm_abbreviated => [
        "AM",
        "PM",
      ],
      available_formats => {
        Bh => "h B",
        Bhm => "h:mm B",
        Bhms => "h:mm:ss B",
        E => "ccc",
        EBhm => "E h:mm B",
        EBhms => "E h:mm:ss B",
        EHm => "E HH:mm",
        EHms => "E HH:mm:ss",
        Ed => "d E",
        Ehm => "E h:mm a",
        Ehms => "E h:mm:ss a",
        Gy => "y G",
        GyMMM => "MMM y G",
        GyMMMEd => "E, MMM d, y G",
        GyMMMd => "MMM d, y G",
        H => "HH",
        Hm => "HH:mm",
        Hms => "HH:mm:ss",
        Hmsv => "HH:mm:ss v",
        Hmv => "HH:mm v",
        M => "L",
        MEd => "E, M/d",
        MMM => "LLL",
        MMMEd => "E, MMM d",
        "MMMMW-count-one" => "'week' W 'of' MMMM",
        "MMMMW-count-other" => "'week' W 'of' MMMM",
        MMMMd => "MMMM d",
        MMMd => "MMM d",
        Md => "M/d",
        d => "d",
        h => "h a",
        hm => "h:mm a",
        hms => "h:mm:ss a",
        hmsv => "h:mm:ss a v",
        hmv => "h:mm a v",
        ms => "mm:ss",
        y => "y",
        yM => "M/y",
        yMEd => "E, M/d/y",
        yMMM => "MMM y",
        yMMMEd => "E, MMM d, y",
        yMMMM => "MMMM y",
        yMMMd => "MMM d, y",
        yMd => "M/d/y",
        yQQQ => "QQQ y",
        yQQQQ => "QQQQ y",
        "yw-count-one" => "'week' w 'of' Y",
        "yw-count-other" => "'week' w 'of' Y",
      },
      code => "en-US",
      date_format_full => "EEEE, MMMM d, y",
      date_format_long => "MMMM d, y",
      date_format_medium => "MMM d, y",
      date_format_short => "M/d/yy",
      datetime_format_full => "{1} 'at' {0}",
      datetime_format_long => "{1} 'at' {0}",
      datetime_format_medium => "{1}, {0}",
      datetime_format_short => "{1}, {0}",
      day_format_abbreviated => [
        "Mon",
        "Tue",
        "Wed",
        "Thu",
        "Fri",
        "Sat",
        "Sun",
      ],
      day_format_narrow => [
        "M",
        "T",
        "W",
        "T",
        "F",
        "S",
        "S",
      ],
      day_format_wide => [
        "Monday",
        "Tuesday",
        "Wednesday",
        "Thursday",
        "Friday",
        "Saturday",
        "Sunday",
      ],
      day_stand_alone_abbreviated => [
        "Mon",
        "Tue",
        "Wed",
        "Thu",
        "Fri",
        "Sat",
        "Sun",
      ],
      day_stand_alone_narrow => [
        "M",
        "T",
        "W",
        "T",
        "F",
        "S",
        "S",
      ],
      day_stand_alone_wide => [
        "Monday",
        "Tuesday",
        "Wednesday",
        "Thursday",
        "Friday",
        "Saturday",
        "Sunday",
      ],
      era_abbreviated => [
        "BC",
        "AD",
      ],
      era_narrow => [
        "B",
        "A",
      ],
      era_wide => [
        "Before Christ",
        "Anno Domini",
      ],
      first_day_of_week => 7,
      glibc_date_1_format => "%a %b %e %H:%M:%S %Z %Y",
      glibc_date_format => "%m/%d/%Y",
      glibc_datetime_format => "%a %d %b %Y %r %Z",
      glibc_time_12_format => "%I:%M:%S %p",
      glibc_time_format => "%r",
      language => "English",
      month_format_abbreviated => [
        "Jan",
        "Feb",
        "Mar",
        "Apr",
        "May",
        "Jun",
        "Jul",
        "Aug",
        "Sep",
        "Oct",
        "Nov",
        "Dec",
      ],
      month_format_narrow => [
        "J",
        "F",
        "M",
        "A",
        "M",
        "J",
        "J",
        "A",
        "S",
        "O",
        "N",
        "D",
      ],
      month_format_wide => [
        "January",
        "February",
        "March",
        "April",
        "May",
        "June",
        "July",
        "August",
        "September",
        "October",
        "November",
        "December",
      ],
      month_stand_alone_abbreviated => [
        "Jan",
        "Feb",
        "Mar",
        "Apr",
        "May",
        "Jun",
        "Jul",
        "Aug",
        "Sep",
        "Oct",
        "Nov",
        "Dec",
      ],
      month_stand_alone_narrow => [
        "J",
        "F",
        "M",
        "A",
        "M",
        "J",
        "J",
        "A",
        "S",
        "O",
        "N",
        "D",
      ],
      month_stand_alone_wide => [
        "January",
        "February",
        "March",
        "April",
        "May",
        "June",
        "July",
        "August",
        "September",
        "October",
        "November",
        "December",
      ],
      name => "English United States",
      native_language => "English",
      native_name => "English United States",
      native_script => undef,
      native_territory => "United States",
      native_variant => undef,
      quarter_format_abbreviated => [
        "Q1",
        "Q2",
        "Q3",
        "Q4",
      ],
      quarter_format_narrow => [
        1,
        2,
        3,
        4,
      ],
      quarter_format_wide => [
        "1st quarter",
        "2nd quarter",
        "3rd quarter",
        "4th quarter",
      ],
      quarter_stand_alone_abbreviated => [
        "Q1",
        "Q2",
        "Q3",
        "Q4",
      ],
      quarter_stand_alone_narrow => [
        1,
        2,
        3,
        4,
      ],
      quarter_stand_alone_wide => [
        "1st quarter",
        "2nd quarter",
        "3rd quarter",
        "4th quarter",
      ],
      script => undef,
      territory => "United States",
      time_format_full => "h:mm:ss a zzzz",
      time_format_long => "h:mm:ss a z",
      time_format_medium => "h:mm:ss a",
      time_format_short => "h:mm a",
      variant => undef,
      version => 35,
    },
    es => {
      am_pm_abbreviated => [
        "a.\N{U+00a0}m.",
        "p.\N{U+00a0}m.",
      ],
      available_formats => {
        Bh => "h B",
        Bhm => "h:mm B",
        Bhms => "h:mm:ss B",
        E => "ccc",
        EBhm => "E h:mm B",
        EBhms => "E h:mm:ss B",
        EHm => "E, H:mm",
        EHms => "E, H:mm:ss",
        Ed => "E d",
        Ehm => "E, h:mm a",
        Ehms => "E, h:mm:ss a",
        Gy => "y G",
        GyMMM => "MMM y G",
        GyMMMEd => "E, d MMM y G",
        GyMMMM => "MMMM 'de' y G",
        GyMMMMEd => "E, d 'de' MMMM 'de' y G",
        GyMMMMd => "d 'de' MMMM 'de' y G",
        GyMMMd => "d MMM y G",
        H => "H",
        Hm => "H:mm",
        Hms => "H:mm:ss",
        Hmsv => "H:mm:ss v",
        Hmsvvvv => "H:mm:ss (vvvv)",
        Hmv => "H:mm v",
        M => "L",
        MEd => "E, d/M",
        MMM => "LLL",
        MMMEd => "E, d MMM",
        MMMMEd => "E, d 'de' MMMM",
        "MMMMW-count-one" => "'semana' W 'de' MMMM",
        "MMMMW-count-other" => "'semana' W 'de' MMMM",
        MMMMd => "d 'de' MMMM",
        MMMd => "d MMM",
        MMd => "d/M",
        MMdd => "d/M",
        Md => "d/M",
        d => "d",
        h => "h a",
        hm => "h:mm a",
        hms => "h:mm:ss a",
        hmsv => "h:mm:ss a v",
        hmsvvvv => "h:mm:ss a (vvvv)",
        hmv => "h:mm a v",
        ms => "mm:ss",
        y => "y",
        yM => "M/y",
        yMEd => "EEE, d/M/y",
        yMM => "M/y",
        yMMM => "MMM y",
        yMMMEd => "EEE, d MMM y",
        yMMMM => "MMMM 'de' y",
        yMMMMEd => "EEE, d 'de' MMMM 'de' y",
        yMMMMd => "d 'de' MMMM 'de' y",
        yMMMd => "d MMM y",
        yMd => "d/M/y",
        yQQQ => "QQQ y",
        yQQQQ => "QQQQ 'de' y",
        "yw-count-one" => "'semana' w 'de' Y",
        "yw-count-other" => "'semana' w 'de' Y",
      },
      code => "es",
      date_format_full => "EEEE, d 'de' MMMM 'de' y",
      date_format_long => "d 'de' MMMM 'de' y",
      date_format_medium => "d MMM y",
      date_format_short => "d/M/yy",
      datetime_format_full => "{1}, {0}",
      datetime_format_long => "{1}, {0}",
      datetime_format_medium => "{1} {0}",
      datetime_format_short => "{1} {0}",
      day_format_abbreviated => [
        "lun.",
        "mar.",
        "mi\N{U+00e9}.",
        "jue.",
        "vie.",
        "s\N{U+00e1}b.",
        "dom.",
      ],
      day_format_narrow => [
        "L",
        "M",
        "X",
        "J",
        "V",
        "S",
        "D",
      ],
      day_format_wide => [
        "lunes",
        "martes",
        "mi\N{U+00e9}rcoles",
        "jueves",
        "viernes",
        "s\N{U+00e1}bado",
        "domingo",
      ],
      day_stand_alone_abbreviated => [
        "lun.",
        "mar.",
        "mi\N{U+00e9}.",
        "jue.",
        "vie.",
        "s\N{U+00e1}b.",
        "dom.",
      ],
      day_stand_alone_narrow => [
        "L",
        "M",
        "X",
        "J",
        "V",
        "S",
        "D",
      ],
      day_stand_alone_wide => [
        "lunes",
        "martes",
        "mi\N{U+00e9}rcoles",
        "jueves",
        "viernes",
        "s\N{U+00e1}bado",
        "domingo",
      ],
      era_abbreviated => [
        "a. C.",
        "d. C.",
      ],
      era_narrow => [
        "a. C.",
        "d. C.",
      ],
      era_wide => [
        "antes de Cristo",
        "despu\N{U+00e9}s de Cristo",
      ],
      first_day_of_week => 1,
      glibc_date_1_format => "%a %b %e %H:%M:%S %Z %Y",
      glibc_date_format => "%m/%d/%y",
      glibc_datetime_format => "%a %b %e %H:%M:%S %Y",
      glibc_time_12_format => "%I:%M:%S %p",
      glibc_time_format => "%H:%M:%S",
      language => "Spanish",
      month_format_abbreviated => [
        "ene.",
        "feb.",
        "mar.",
        "abr.",
        "may.",
        "jun.",
        "jul.",
        "ago.",
        "sept.",
        "oct.",
        "nov.",
        "dic.",
      ],
      month_format_narrow => [
        "E",
        "F",
        "M",
        "A",
        "M",
        "J",
        "J",
        "A",
        "S",
        "O",
        "N",
        "D",
      ],
      month_format_wide => [
        "enero",
        "febrero",
        "marzo",
        "abril",
        "mayo",
        "junio",
        "julio",
        "agosto",
        "septiembre",
        "octubre",
        "noviembre",
        "diciembre",
      ],
      month_stand_alone_abbreviated => [
        "ene.",
        "feb.",
        "mar.",
        "abr.",
        "may.",
        "jun.",
        "jul.",
        "ago.",
        "sept.",
        "oct.",
        "nov.",
        "dic.",
      ],
      month_stand_alone_narrow => [
        "E",
        "F",
        "M",
        "A",
        "M",
        "J",
        "J",
        "A",
        "S",
        "O",
        "N",
        "D",
      ],
      month_stand_alone_wide => [
        "enero",
        "febrero",
        "marzo",
        "abril",
        "mayo",
        "junio",
        "julio",
        "agosto",
        "septiembre",
        "octubre",
        "noviembre",
        "diciembre",
      ],
      name => "Spanish",
      native_language => "espa\N{U+00f1}ol",
      native_name => "espa\N{U+00f1}ol",
      native_script => undef,
      native_territory => undef,
      native_variant => undef,
      quarter_format_abbreviated => [
        "T1",
        "T2",
        "T3",
        "T4",
      ],
      quarter_format_narrow => [
        1,
        2,
        3,
        4,
      ],
      quarter_format_wide => [
        "1.er trimestre",
        "2.\N{U+00ba} trimestre",
        "3.er trimestre",
        "4.\N{U+00ba} trimestre",
      ],
      quarter_stand_alone_abbreviated => [
        "T1",
        "T2",
        "T3",
        "T4",
      ],
      quarter_stand_alone_narrow => [
        1,
        2,
        3,
        4,
      ],
      quarter_stand_alone_wide => [
        "1.er trimestre",
        "2.\N{U+00ba} trimestre",
        "3.er trimestre",
        "4.\N{U+00ba} trimestre",
      ],
      script => undef,
      territory => undef,
      time_format_full => "H:mm:ss (zzzz)",
      time_format_long => "H:mm:ss z",
      time_format_medium => "H:mm:ss",
      time_format_short => "H:mm",
      variant => undef,
      version => 35,
    },
    "fr-FR" => {
      am_pm_abbreviated => [
        "AM",
        "PM",
      ],
      available_formats => {
        Bh => "h B",
        Bhm => "h:mm B",
        Bhms => "h:mm:ss B",
        E => "E",
        EBhm => "E h:mm B",
        EBhms => "E h:mm:ss B",
        EHm => "E HH:mm",
        EHms => "E HH:mm:ss",
        Ed => "E d",
        Ehm => "E h:mm a",
        Ehms => "E h:mm:ss a",
        Gy => "y G",
        GyMMM => "MMM y G",
        GyMMMEd => "E d MMM y G",
        GyMMMd => "d MMM y G",
        H => "HH 'h'",
        Hm => "HH:mm",
        Hms => "HH:mm:ss",
        Hmsv => "HH:mm:ss v",
        Hmv => "HH:mm v",
        M => "L",
        MEd => "E dd/MM",
        MMM => "LLL",
        MMMEd => "E d MMM",
        "MMMMW-count-one" => "'semaine' W (MMMM)",
        "MMMMW-count-other" => "'semaine' W (MMMM)",
        MMMMd => "d MMMM",
        MMMd => "d MMM",
        Md => "dd/MM",
        d => "d",
        h => "h a",
        hm => "h:mm a",
        hms => "h:mm:ss a",
        hmsv => "h:mm:ss a v",
        hmv => "h:mm a v",
        ms => "mm:ss",
        y => "y",
        yM => "MM/y",
        yMEd => "E dd/MM/y",
        yMMM => "MMM y",
        yMMMEd => "E d MMM y",
        yMMMM => "MMMM y",
        yMMMd => "d MMM y",
        yMd => "dd/MM/y",
        yQQQ => "QQQ y",
        yQQQQ => "QQQQ y",
        "yw-count-one" => "'semaine' w 'de' Y",
        "yw-count-other" => "'semaine' w 'de' Y",
      },
      code => "fr-FR",
      date_format_full => "EEEE d MMMM y",
      date_format_long => "d MMMM y",
      date_format_medium => "d MMM y",
      date_format_short => "dd/MM/y",
      datetime_format_full => "{1} '\N{U+00e0}' {0}",
      datetime_format_long => "{1} '\N{U+00e0}' {0}",
      datetime_format_medium => "{1} '\N{U+00e0}' {0}",
      datetime_format_short => "{1} {0}",
      day_format_abbreviated => [
        "lun.",
        "mar.",
        "mer.",
        "jeu.",
        "ven.",
        "sam.",
        "dim.",
      ],
      day_format_narrow => [
        "L",
        "M",
        "M",
        "J",
        "V",
        "S",
        "D",
      ],
      day_format_wide => [
        "lundi",
        "mardi",
        "mercredi",
        "jeudi",
        "vendredi",
        "samedi",
        "dimanche",
      ],
      day_stand_alone_abbreviated => [
        "lun.",
        "mar.",
        "mer.",
        "jeu.",
        "ven.",
        "sam.",
        "dim.",
      ],
      day_stand_alone_narrow => [
        "L",
        "M",
        "M",
        "J",
        "V",
        "S",
        "D",
      ],
      day_stand_alone_wide => [
        "lundi",
        "mardi",
        "mercredi",
        "jeudi",
        "vendredi",
        "samedi",
        "dimanche",
      ],
      era_abbreviated => [
        "av. J.-C.",
        "ap. J.-C.",
      ],
      era_narrow => [
        "av. J.-C.",
        "ap. J.-C.",
      ],
      era_wide => [
        "avant J\N{U+00e9}sus-Christ",
        "apr\N{U+00e8}s J\N{U+00e9}sus-Christ",
      ],
      first_day_of_week => 1,
      glibc_date_1_format => "%a %b %e %H:%M:%S %Z %Y",
      glibc_date_format => "%d/%m/%Y",
      glibc_datetime_format => "%a %d %b %Y %T %Z",
      glibc_time_12_format => "%I:%M:%S %p",
      glibc_time_format => "%T",
      language => "French",
      month_format_abbreviated => [
        "janv.",
        "f\N{U+00e9}vr.",
        "mars",
        "avr.",
        "mai",
        "juin",
        "juil.",
        "ao\N{U+00fb}t",
        "sept.",
        "oct.",
        "nov.",
        "d\N{U+00e9}c.",
      ],
      month_format_narrow => [
        "J",
        "F",
        "M",
        "A",
        "M",
        "J",
        "J",
        "A",
        "S",
        "O",
        "N",
        "D",
      ],
      month_format_wide => [
        "janvier",
        "f\N{U+00e9}vrier",
        "mars",
        "avril",
        "mai",
        "juin",
        "juillet",
        "ao\N{U+00fb}t",
        "septembre",
        "octobre",
        "novembre",
        "d\N{U+00e9}cembre",
      ],
      month_stand_alone_abbreviated => [
        "janv.",
        "f\N{U+00e9}vr.",
        "mars",
        "avr.",
        "mai",
        "juin",
        "juil.",
        "ao\N{U+00fb}t",
        "sept.",
        "oct.",
        "nov.",
        "d\N{U+00e9}c.",
      ],
      month_stand_alone_narrow => [
        "J",
        "F",
        "M",
        "A",
        "M",
        "J",
        "J",
        "A",
        "S",
        "O",
        "N",
        "D",
      ],
      month_stand_alone_wide => [
        "janvier",
        "f\N{U+00e9}vrier",
        "mars",
        "avril",
        "mai",
        "juin",
        "juillet",
        "ao\N{U+00fb}t",
        "septembre",
        "octobre",
        "novembre",
        "d\N{U+00e9}cembre",
      ],
      name => "French France",
      native_language => "fran\N{U+00e7}ais",
      native_name => "fran\N{U+00e7}ais France",
      native_script => undef,
      native_territory => "France",
      native_variant => undef,
      quarter_format_abbreviated => [
        "T1",
        "T2",
        "T3",
        "T4",
      ],
      quarter_format_narrow => [
        1,
        2,
        3,
        4,
      ],
      quarter_format_wide => [
        "1er trimestre",
        "2e trimestre",
        "3e trimestre",
        "4e trimestre",
      ],
      quarter_stand_alone_abbreviated => [
        "T1",
        "T2",
        "T3",
        "T4",
      ],
      quarter_stand_alone_narrow => [
        1,
        2,
        3,
        4,
      ],
      quarter_stand_alone_wide => [
        "1er trimestre",
        "2e trimestre",
        "3e trimestre",
        "4e trimestre",
      ],
      script => undef,
      territory => "France",
      time_format_full => "HH:mm:ss zzzz",
      time_format_long => "HH:mm:ss z",
      time_format_medium => "HH:mm:ss",
      time_format_short => "HH:mm",
      variant => undef,
      version => 35,
    },
    hi => {
      am_pm_abbreviated => [
        "am",
        "pm",
      ],
      available_formats => {
        Bh => "B h",
        Bhm => "B h:mm",
        Bhms => "B h:mm:ss",
        E => "ccc",
        EBhm => "E B h:mm",
        EBhms => "E B h:mm:ss",
        EHm => "E HH:mm",
        EHms => "E HH:mm:ss",
        Ed => "E d",
        Ehm => "E h:mm a",
        Ehms => "E h:mm:ss a",
        Gy => "y G",
        GyMMM => "MMM G y",
        GyMMMEd => "E, d MMM y G",
        GyMMMd => "d MMM y G",
        H => "HH",
        Hm => "HH:mm",
        Hms => "HH:mm:ss",
        Hmsv => "HH:mm:ss v",
        Hmv => "HH:mm v",
        M => "L",
        MEd => "E, d/M",
        MMM => "LLL",
        MMMEd => "E, d MMM",
        MMMMEd => "E, d MMMM",
        "MMMMW-count-one" => "MMMM \N{U+0915}\N{U+093e} \N{U+0938}\N{U+092a}\N{U+094d}\N{U+0924}\N{U+093e}\N{U+0939} W",
        "MMMMW-count-other" => "MMMM \N{U+0915}\N{U+093e} \N{U+0938}\N{U+092a}\N{U+094d}\N{U+0924}\N{U+093e}\N{U+0939} W",
        MMMMd => "d MMMM",
        MMMd => "d MMM",
        MMdd => "dd/MM",
        Md => "d/M",
        d => "d",
        h => "h a",
        hm => "h:mm a",
        hms => "h:mm:ss a",
        hmsv => "h:mm:ss a v",
        hmv => "h:mm a v",
        ms => "mm:ss",
        y => "y",
        yM => "M/y",
        yMEd => "E, d/M/y",
        yMM => "MM/y",
        yMMM => "MMM y",
        yMMMEd => "E, d MMM y",
        yMMMM => "MMMM y",
        yMMMd => "d MMM y",
        yMMdd => "dd/MM/y",
        yMd => "d/M/y",
        yQQQ => "QQQ y",
        yQQQQ => "QQQQ y",
        "yw-count-one" => "Y \N{U+0915}\N{U+093e} \N{U+0938}\N{U+092a}\N{U+094d}\N{U+0924}\N{U+093e}\N{U+0939} w",
        "yw-count-other" => "Y \N{U+0915}\N{U+093e} \N{U+0938}\N{U+092a}\N{U+094d}\N{U+0924}\N{U+093e}\N{U+0939} w",
      },
      code => "hi",
      date_format_full => "EEEE, d MMMM y",
      date_format_long => "d MMMM y",
      date_format_medium => "d MMM y",
      date_format_short => "d/M/yy",
      datetime_format_full => "{1} \N{U+0915}\N{U+094b} {0}",
      datetime_format_long => "{1} \N{U+0915}\N{U+094b} {0}",
      datetime_format_medium => "{1}, {0}",
      datetime_format_short => "{1}, {0}",
      day_format_abbreviated => [
        "\N{U+0938}\N{U+094b}\N{U+092e}",
        "\N{U+092e}\N{U+0902}\N{U+0917}\N{U+0932}",
        "\N{U+092c}\N{U+0941}\N{U+0927}",
        "\N{U+0917}\N{U+0941}\N{U+0930}\N{U+0941}",
        "\N{U+0936}\N{U+0941}\N{U+0915}\N{U+094d}\N{U+0930}",
        "\N{U+0936}\N{U+0928}\N{U+093f}",
        "\N{U+0930}\N{U+0935}\N{U+093f}",
      ],
      day_format_narrow => [
        "\N{U+0938}\N{U+094b}",
        "\N{U+092e}\N{U+0902}",
        "\N{U+092c}\N{U+0941}",
        "\N{U+0917}\N{U+0941}",
        "\N{U+0936}\N{U+0941}",
        "\N{U+0936}",
        "\N{U+0930}",
      ],
      day_format_wide => [
        "\N{U+0938}\N{U+094b}\N{U+092e}\N{U+0935}\N{U+093e}\N{U+0930}",
        "\N{U+092e}\N{U+0902}\N{U+0917}\N{U+0932}\N{U+0935}\N{U+093e}\N{U+0930}",
        "\N{U+092c}\N{U+0941}\N{U+0927}\N{U+0935}\N{U+093e}\N{U+0930}",
        "\N{U+0917}\N{U+0941}\N{U+0930}\N{U+0941}\N{U+0935}\N{U+093e}\N{U+0930}",
        "\N{U+0936}\N{U+0941}\N{U+0915}\N{U+094d}\N{U+0930}\N{U+0935}\N{U+093e}\N{U+0930}",
        "\N{U+0936}\N{U+0928}\N{U+093f}\N{U+0935}\N{U+093e}\N{U+0930}",
        "\N{U+0930}\N{U+0935}\N{U+093f}\N{U+0935}\N{U+093e}\N{U+0930}",
      ],
      day_stand_alone_abbreviated => [
        "\N{U+0938}\N{U+094b}\N{U+092e}",
        "\N{U+092e}\N{U+0902}\N{U+0917}\N{U+0932}",
        "\N{U+092c}\N{U+0941}\N{U+0927}",
        "\N{U+0917}\N{U+0941}\N{U+0930}\N{U+0941}",
        "\N{U+0936}\N{U+0941}\N{U+0915}\N{U+094d}\N{U+0930}",
        "\N{U+0936}\N{U+0928}\N{U+093f}",
        "\N{U+0930}\N{U+0935}\N{U+093f}",
      ],
      day_stand_alone_narrow => [
        "\N{U+0938}\N{U+094b}",
        "\N{U+092e}\N{U+0902}",
        "\N{U+092c}\N{U+0941}",
        "\N{U+0917}\N{U+0941}",
        "\N{U+0936}\N{U+0941}",
        "\N{U+0936}",
        "\N{U+0930}",
      ],
      day_stand_alone_wide => [
        "\N{U+0938}\N{U+094b}\N{U+092e}\N{U+0935}\N{U+093e}\N{U+0930}",
        "\N{U+092e}\N{U+0902}\N{U+0917}\N{U+0932}\N{U+0935}\N{U+093e}\N{U+0930}",
        "\N{U+092c}\N{U+0941}\N{U+0927}\N{U+0935}\N{U+093e}\N{U+0930}",
        "\N{U+0917}\N{U+0941}\N{U+0930}\N{U+0941}\N{U+0935}\N{U+093e}\N{U+0930}",
        "\N{U+0936}\N{U+0941}\N{U+0915}\N{U+094d}\N{U+0930}\N{U+0935}\N{U+093e}\N{U+0930}",
        "\N{U+0936}\N{U+0928}\N{U+093f}\N{U+0935}\N{U+093e}\N{U+0930}",
        "\N{U+0930}\N{U+0935}\N{U+093f}\N{U+0935}\N{U+093e}\N{U+0930}",
      ],
      era_abbreviated => [
        "\N{U+0908}\N{U+0938}\N{U+093e}-\N{U+092a}\N{U+0942}\N{U+0930}\N{U+094d}\N{U+0935}",
        "\N{U+0908}\N{U+0938}\N{U+094d}\N{U+0935}\N{U+0940}",
      ],
      era_narrow => [
        "\N{U+0908}\N{U+0938}\N{U+093e}-\N{U+092a}\N{U+0942}\N{U+0930}\N{U+094d}\N{U+0935}",
        "\N{U+0908}\N{U+0938}\N{U+094d}\N{U+0935}\N{U+0940}",
      ],
      era_wide => [
        "\N{U+0908}\N{U+0938}\N{U+093e}-\N{U+092a}\N{U+0942}\N{U+0930}\N{U+094d}\N{U+0935}",
        "\N{U+0908}\N{U+0938}\N{U+0935}\N{U+0940} \N{U+0938}\N{U+0928}",
      ],
      first_day_of_week => 1,
      glibc_date_1_format => "%a %b %e %H:%M:%S %Z %Y",
      glibc_date_format => "%m/%d/%y",
      glibc_datetime_format => "%a %b %e %H:%M:%S %Y",
      glibc_time_12_format => "%I:%M:%S %p",
      glibc_time_format => "%H:%M:%S",
      language => "Hindi",
      month_format_abbreviated => [
        "\N{U+091c}\N{U+0928}\N{U+0970}",
        "\N{U+092b}\N{U+093c}\N{U+0930}\N{U+0970}",
        "\N{U+092e}\N{U+093e}\N{U+0930}\N{U+094d}\N{U+091a}",
        "\N{U+0905}\N{U+092a}\N{U+094d}\N{U+0930}\N{U+0948}\N{U+0932}",
        "\N{U+092e}\N{U+0908}",
        "\N{U+091c}\N{U+0942}\N{U+0928}",
        "\N{U+091c}\N{U+0941}\N{U+0932}\N{U+0970}",
        "\N{U+0905}\N{U+0917}\N{U+0970}",
        "\N{U+0938}\N{U+093f}\N{U+0924}\N{U+0970}",
        "\N{U+0905}\N{U+0915}\N{U+094d}\N{U+0924}\N{U+0942}\N{U+0970}",
        "\N{U+0928}\N{U+0935}\N{U+0970}",
        "\N{U+0926}\N{U+093f}\N{U+0938}\N{U+0970}",
      ],
      month_format_narrow => [
        "\N{U+091c}",
        "\N{U+092b}\N{U+093c}",
        "\N{U+092e}\N{U+093e}",
        "\N{U+0905}",
        "\N{U+092e}",
        "\N{U+091c}\N{U+0942}",
        "\N{U+091c}\N{U+0941}",
        "\N{U+0905}",
        "\N{U+0938}\N{U+093f}",
        "\N{U+0905}",
        "\N{U+0928}",
        "\N{U+0926}\N{U+093f}",
      ],
      month_format_wide => [
        "\N{U+091c}\N{U+0928}\N{U+0935}\N{U+0930}\N{U+0940}",
        "\N{U+092b}\N{U+093c}\N{U+0930}\N{U+0935}\N{U+0930}\N{U+0940}",
        "\N{U+092e}\N{U+093e}\N{U+0930}\N{U+094d}\N{U+091a}",
        "\N{U+0905}\N{U+092a}\N{U+094d}\N{U+0930}\N{U+0948}\N{U+0932}",
        "\N{U+092e}\N{U+0908}",
        "\N{U+091c}\N{U+0942}\N{U+0928}",
        "\N{U+091c}\N{U+0941}\N{U+0932}\N{U+093e}\N{U+0908}",
        "\N{U+0905}\N{U+0917}\N{U+0938}\N{U+094d}\N{U+0924}",
        "\N{U+0938}\N{U+093f}\N{U+0924}\N{U+0902}\N{U+092c}\N{U+0930}",
        "\N{U+0905}\N{U+0915}\N{U+094d}\N{U+0924}\N{U+0942}\N{U+092c}\N{U+0930}",
        "\N{U+0928}\N{U+0935}\N{U+0902}\N{U+092c}\N{U+0930}",
        "\N{U+0926}\N{U+093f}\N{U+0938}\N{U+0902}\N{U+092c}\N{U+0930}",
      ],
      month_stand_alone_abbreviated => [
        "\N{U+091c}\N{U+0928}\N{U+0970}",
        "\N{U+092b}\N{U+093c}\N{U+0930}\N{U+0970}",
        "\N{U+092e}\N{U+093e}\N{U+0930}\N{U+094d}\N{U+091a}",
        "\N{U+0905}\N{U+092a}\N{U+094d}\N{U+0930}\N{U+0948}\N{U+0932}",
        "\N{U+092e}\N{U+0908}",
        "\N{U+091c}\N{U+0942}\N{U+0928}",
        "\N{U+091c}\N{U+0941}\N{U+0932}\N{U+0970}",
        "\N{U+0905}\N{U+0917}\N{U+0970}",
        "\N{U+0938}\N{U+093f}\N{U+0924}\N{U+0970}",
        "\N{U+0905}\N{U+0915}\N{U+094d}\N{U+0924}\N{U+0942}\N{U+0970}",
        "\N{U+0928}\N{U+0935}\N{U+0970}",
        "\N{U+0926}\N{U+093f}\N{U+0938}\N{U+0970}",
      ],
      month_stand_alone_narrow => [
        "\N{U+091c}",
        "\N{U+092b}\N{U+093c}",
        "\N{U+092e}\N{U+093e}",
        "\N{U+0905}",
        "\N{U+092e}",
        "\N{U+091c}\N{U+0942}",
        "\N{U+091c}\N{U+0941}",
        "\N{U+0905}",
        "\N{U+0938}\N{U+093f}",
        "\N{U+0905}",
        "\N{U+0928}",
        "\N{U+0926}\N{U+093f}",
      ],
      month_stand_alone_wide => [
        "\N{U+091c}\N{U+0928}\N{U+0935}\N{U+0930}\N{U+0940}",
        "\N{U+092b}\N{U+093c}\N{U+0930}\N{U+0935}\N{U+0930}\N{U+0940}",
        "\N{U+092e}\N{U+093e}\N{U+0930}\N{U+094d}\N{U+091a}",
        "\N{U+0905}\N{U+092a}\N{U+094d}\N{U+0930}\N{U+0948}\N{U+0932}",
        "\N{U+092e}\N{U+0908}",
        "\N{U+091c}\N{U+0942}\N{U+0928}",
        "\N{U+091c}\N{U+0941}\N{U+0932}\N{U+093e}\N{U+0908}",
        "\N{U+0905}\N{U+0917}\N{U+0938}\N{U+094d}\N{U+0924}",
        "\N{U+0938}\N{U+093f}\N{U+0924}\N{U+0902}\N{U+092c}\N{U+0930}",
        "\N{U+0905}\N{U+0915}\N{U+094d}\N{U+0924}\N{U+0942}\N{U+092c}\N{U+0930}",
        "\N{U+0928}\N{U+0935}\N{U+0902}\N{U+092c}\N{U+0930}",
        "\N{U+0926}\N{U+093f}\N{U+0938}\N{U+0902}\N{U+092c}\N{U+0930}",
      ],
      name => "Hindi",
      native_language => "\N{U+0939}\N{U+093f}\N{U+0928}\N{U+094d}\N{U+0926}\N{U+0940}",
      native_name => "\N{U+0939}\N{U+093f}\N{U+0928}\N{U+094d}\N{U+0926}\N{U+0940}",
      native_script => undef,
      native_territory => undef,
      native_variant => undef,
      quarter_format_abbreviated => [
        "\N{U+0924}\N{U+093f}1",
        "\N{U+0924}\N{U+093f}2",
        "\N{U+0924}\N{U+093f}3",
        "\N{U+0924}\N{U+093f}4",
      ],
      quarter_format_narrow => [
        1,
        2,
        3,
        4,
      ],
      quarter_format_wide => [
        "\N{U+092a}\N{U+0939}\N{U+0932}\N{U+0940} \N{U+0924}\N{U+093f}\N{U+092e}\N{U+093e}\N{U+0939}\N{U+0940}",
        "\N{U+0926}\N{U+0942}\N{U+0938}\N{U+0930}\N{U+0940} \N{U+0924}\N{U+093f}\N{U+092e}\N{U+093e}\N{U+0939}\N{U+0940}",
        "\N{U+0924}\N{U+0940}\N{U+0938}\N{U+0930}\N{U+0940} \N{U+0924}\N{U+093f}\N{U+092e}\N{U+093e}\N{U+0939}\N{U+0940}",
        "\N{U+091a}\N{U+094c}\N{U+0925}\N{U+0940} \N{U+0924}\N{U+093f}\N{U+092e}\N{U+093e}\N{U+0939}\N{U+0940}",
      ],
      quarter_stand_alone_abbreviated => [
        "\N{U+0924}\N{U+093f}1",
        "\N{U+0924}\N{U+093f}2",
        "\N{U+0924}\N{U+093f}3",
        "\N{U+0924}\N{U+093f}4",
      ],
      quarter_stand_alone_narrow => [
        1,
        2,
        3,
        4,
      ],
      quarter_stand_alone_wide => [
        "\N{U+092a}\N{U+0939}\N{U+0932}\N{U+0940} \N{U+0924}\N{U+093f}\N{U+092e}\N{U+093e}\N{U+0939}\N{U+0940}",
        "\N{U+0926}\N{U+0942}\N{U+0938}\N{U+0930}\N{U+0940} \N{U+0924}\N{U+093f}\N{U+092e}\N{U+093e}\N{U+0939}\N{U+0940}",
        "\N{U+0924}\N{U+0940}\N{U+0938}\N{U+0930}\N{U+0940} \N{U+0924}\N{U+093f}\N{U+092e}\N{U+093e}\N{U+0939}\N{U+0940}",
        "\N{U+091a}\N{U+094c}\N{U+0925}\N{U+0940} \N{U+0924}\N{U+093f}\N{U+092e}\N{U+093e}\N{U+0939}\N{U+0940}",
      ],
      script => undef,
      territory => undef,
      time_format_full => "h:mm:ss a zzzz",
      time_format_long => "h:mm:ss a z",
      time_format_medium => "h:mm:ss a",
      time_format_short => "h:mm a",
      variant => undef,
      version => 35,
    },
    "ja-JP" => {
      am_pm_abbreviated => [
        "\N{U+5348}\N{U+524d}",
        "\N{U+5348}\N{U+5f8c}",
      ],
      available_formats => {
        Bh => "BK\N{U+6642}",
        Bhm => "BK:mm",
        Bhms => "BK:mm:ss",
        E => "ccc",
        EBhm => "BK:mm (E)",
        EBhms => "BK:mm:ss (E)",
        EEEEd => "d\N{U+65e5}EEEE",
        EHm => "H:mm (E)",
        EHms => "H:mm:ss (E)",
        Ed => "d\N{U+65e5}(E)",
        Ehm => "aK:mm (E)",
        Ehms => "aK:mm:ss (E)",
        Gy => "Gy\N{U+5e74}",
        GyMMM => "Gy\N{U+5e74}M\N{U+6708}",
        GyMMMEEEEd => "Gy\N{U+5e74}M\N{U+6708}d\N{U+65e5}EEEE",
        GyMMMEd => "Gy\N{U+5e74}M\N{U+6708}d\N{U+65e5}(E)",
        GyMMMd => "Gy\N{U+5e74}M\N{U+6708}d\N{U+65e5}",
        H => "H\N{U+6642}",
        Hm => "H:mm",
        Hms => "H:mm:ss",
        Hmsv => "H:mm:ss v",
        Hmv => "H:mm v",
        M => "M\N{U+6708}",
        MEEEEd => "M/dEEEE",
        MEd => "M/d(E)",
        MMM => "M\N{U+6708}",
        MMMEEEEd => "M\N{U+6708}d\N{U+65e5}EEEE",
        MMMEd => "M\N{U+6708}d\N{U+65e5}(E)",
        "MMMMW-count-other" => "M\N{U+6708}\N{U+7b2c}W\N{U+9031}",
        MMMMd => "M\N{U+6708}d\N{U+65e5}",
        MMMd => "M\N{U+6708}d\N{U+65e5}",
        Md => "M/d",
        d => "d\N{U+65e5}",
        h => "aK\N{U+6642}",
        hm => "aK:mm",
        hms => "aK:mm:ss",
        hmsv => "aK:mm:ss v",
        hmv => "aK:mm v",
        ms => "mm:ss",
        y => "y\N{U+5e74}",
        yM => "y/M",
        yMEEEEd => "y/M/dEEEE",
        yMEd => "y/M/d(E)",
        yMM => "y/MM",
        yMMM => "y\N{U+5e74}M\N{U+6708}",
        yMMMEEEEd => "y\N{U+5e74}M\N{U+6708}d\N{U+65e5}EEEE",
        yMMMEd => "y\N{U+5e74}M\N{U+6708}d\N{U+65e5}(E)",
        yMMMM => "y\N{U+5e74}M\N{U+6708}",
        yMMMd => "y\N{U+5e74}M\N{U+6708}d\N{U+65e5}",
        yMd => "y/M/d",
        yQQQ => "y/QQQ",
        yQQQQ => "y\N{U+5e74}QQQQ",
        "yw-count-other" => "Y\N{U+5e74}\N{U+7b2c}w\N{U+9031}",
      },
      code => "ja-JP",
      date_format_full => "y\N{U+5e74}M\N{U+6708}d\N{U+65e5}EEEE",
      date_format_long => "y\N{U+5e74}M\N{U+6708}d\N{U+65e5}",
      date_format_medium => "y/MM/dd",
      date_format_short => "y/MM/dd",
      datetime_format_full => "{1} {0}",
      datetime_format_long => "{1} {0}",
      datetime_format_medium => "{1} {0}",
      datetime_format_short => "{1} {0}",
      day_format_abbreviated => [
        "\N{U+6708}",
        "\N{U+706b}",
        "\N{U+6c34}",
        "\N{U+6728}",
        "\N{U+91d1}",
        "\N{U+571f}",
        "\N{U+65e5}",
      ],
      day_format_narrow => [
        "\N{U+6708}",
        "\N{U+706b}",
        "\N{U+6c34}",
        "\N{U+6728}",
        "\N{U+91d1}",
        "\N{U+571f}",
        "\N{U+65e5}",
      ],
      day_format_wide => [
        "\N{U+6708}\N{U+66dc}\N{U+65e5}",
        "\N{U+706b}\N{U+66dc}\N{U+65e5}",
        "\N{U+6c34}\N{U+66dc}\N{U+65e5}",
        "\N{U+6728}\N{U+66dc}\N{U+65e5}",
        "\N{U+91d1}\N{U+66dc}\N{U+65e5}",
        "\N{U+571f}\N{U+66dc}\N{U+65e5}",
        "\N{U+65e5}\N{U+66dc}\N{U+65e5}",
      ],
      day_stand_alone_abbreviated => [
        "\N{U+6708}",
        "\N{U+706b}",
        "\N{U+6c34}",
        "\N{U+6728}",
        "\N{U+91d1}",
        "\N{U+571f}",
        "\N{U+65e5}",
      ],
      day_stand_alone_narrow => [
        "\N{U+6708}",
        "\N{U+706b}",
        "\N{U+6c34}",
        "\N{U+6728}",
        "\N{U+91d1}",
        "\N{U+571f}",
        "\N{U+65e5}",
      ],
      day_stand_alone_wide => [
        "\N{U+6708}\N{U+66dc}\N{U+65e5}",
        "\N{U+706b}\N{U+66dc}\N{U+65e5}",
        "\N{U+6c34}\N{U+66dc}\N{U+65e5}",
        "\N{U+6728}\N{U+66dc}\N{U+65e5}",
        "\N{U+91d1}\N{U+66dc}\N{U+65e5}",
        "\N{U+571f}\N{U+66dc}\N{U+65e5}",
        "\N{U+65e5}\N{U+66dc}\N{U+65e5}",
      ],
      era_abbreviated => [
        "\N{U+7d00}\N{U+5143}\N{U+524d}",
        "\N{U+897f}\N{U+66a6}",
      ],
      era_narrow => [
        "BC",
        "AD",
      ],
      era_wide => [
        "\N{U+7d00}\N{U+5143}\N{U+524d}",
        "\N{U+897f}\N{U+66a6}",
      ],
      first_day_of_week => 7,
      glibc_date_1_format => "%Y\N{U+5e74} %b %e\N{U+65e5} %A %H:%M:%S %Z",
      glibc_date_format => "%Y\N{U+5e74}%m\N{U+6708}%d\N{U+65e5}",
      glibc_datetime_format => "%Y\N{U+5e74}%m\N{U+6708}%d\N{U+65e5} %H\N{U+6642}%M\N{U+5206}%S\N{U+79d2}",
      glibc_time_12_format => "%p%I\N{U+6642}%M\N{U+5206}%S\N{U+79d2}",
      glibc_time_format => "%H\N{U+6642}%M\N{U+5206}%S\N{U+79d2}",
      language => "Japanese",
      month_format_abbreviated => [
        "1\N{U+6708}",
        "2\N{U+6708}",
        "3\N{U+6708}",
        "4\N{U+6708}",
        "5\N{U+6708}",
        "6\N{U+6708}",
        "7\N{U+6708}",
        "8\N{U+6708}",
        "9\N{U+6708}",
        "10\N{U+6708}",
        "11\N{U+6708}",
        "12\N{U+6708}",
      ],
      month_format_narrow => [
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        9,
        10,
        11,
        12,
      ],
      month_format_wide => [
        "1\N{U+6708}",
        "2\N{U+6708}",
        "3\N{U+6708}",
        "4\N{U+6708}",
        "5\N{U+6708}",
        "6\N{U+6708}",
        "7\N{U+6708}",
        "8\N{U+6708}",
        "9\N{U+6708}",
        "10\N{U+6708}",
        "11\N{U+6708}",
        "12\N{U+6708}",
      ],
      month_stand_alone_abbreviated => [
        "1\N{U+6708}",
        "2\N{U+6708}",
        "3\N{U+6708}",
        "4\N{U+6708}",
        "5\N{U+6708}",
        "6\N{U+6708}",
        "7\N{U+6708}",
        "8\N{U+6708}",
        "9\N{U+6708}",
        "10\N{U+6708}",
        "11\N{U+6708}",
        "12\N{U+6708}",
      ],
      month_stand_alone_narrow => [
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        9,
        10,
        11,
        12,
      ],
      month_stand_alone_wide => [
        "1\N{U+6708}",
        "2\N{U+6708}",
        "3\N{U+6708}",
        "4\N{U+6708}",
        "5\N{U+6708}",
        "6\N{U+6708}",
        "7\N{U+6708}",
        "8\N{U+6708}",
        "9\N{U+6708}",
        "10\N{U+6708}",
        "11\N{U+6708}",
        "12\N{U+6708}",
      ],
      name => "Japanese Japan",
      native_language => "\N{U+65e5}\N{U+672c}\N{U+8a9e}",
      native_name => "\N{U+65e5}\N{U+672c}\N{U+8a9e} \N{U+65e5}\N{U+672c}",
      native_script => undef,
      native_territory => "\N{U+65e5}\N{U+672c}",
      native_variant => undef,
      quarter_format_abbreviated => [
        "Q1",
        "Q2",
        "Q3",
        "Q4",
      ],
      quarter_format_narrow => [
        1,
        2,
        3,
        4,
      ],
      quarter_format_wide => [
        "\N{U+7b2c}1\N{U+56db}\N{U+534a}\N{U+671f}",
        "\N{U+7b2c}2\N{U+56db}\N{U+534a}\N{U+671f}",
        "\N{U+7b2c}3\N{U+56db}\N{U+534a}\N{U+671f}",
        "\N{U+7b2c}4\N{U+56db}\N{U+534a}\N{U+671f}",
      ],
      quarter_stand_alone_abbreviated => [
        "Q1",
        "Q2",
        "Q3",
        "Q4",
      ],
      quarter_stand_alone_narrow => [
        1,
        2,
        3,
        4,
      ],
      quarter_stand_alone_wide => [
        "\N{U+7b2c}1\N{U+56db}\N{U+534a}\N{U+671f}",
        "\N{U+7b2c}2\N{U+56db}\N{U+534a}\N{U+671f}",
        "\N{U+7b2c}3\N{U+56db}\N{U+534a}\N{U+671f}",
        "\N{U+7b2c}4\N{U+56db}\N{U+534a}\N{U+671f}",
      ],
      script => undef,
      territory => "Japan",
      time_format_full => "H\N{U+6642}mm\N{U+5206}ss\N{U+79d2} zzzz",
      time_format_long => "H:mm:ss z",
      time_format_medium => "H:mm:ss",
      time_format_short => "H:mm",
      variant => undef,
      version => 35,
    },
    "pt-BR" => {
      am_pm_abbreviated => [
        "AM",
        "PM",
      ],
      available_formats => {
        Bh => "h B",
        Bhm => "h:mm B",
        Bhms => "h:mm:ss B",
        E => "ccc",
        EBhm => "E h:mm B",
        EBhms => "E h:mm:ss B",
        EHm => "E, HH:mm",
        EHms => "E, HH:mm:ss",
        Ed => "E, d",
        Ehm => "E, h:mm a",
        Ehms => "E, h:mm:ss a",
        Gy => "y G",
        GyMMM => "MMM 'de' y G",
        GyMMMEd => "E, d 'de' MMM 'de' y G",
        GyMMMd => "d 'de' MMM 'de' y G",
        H => "HH",
        Hm => "HH:mm",
        Hms => "HH:mm:ss",
        Hmsv => "HH:mm:ss v",
        Hmv => "HH:mm v",
        M => "L",
        MEd => "E, dd/MM",
        MMM => "LLL",
        MMMEd => "E, d 'de' MMM",
        MMMMEd => "E, d 'de' MMMM",
        "MMMMW-count-one" => "W'\N{U+00aa}' 'semana' 'de' MMMM",
        "MMMMW-count-other" => "W'\N{U+00aa}' 'semana' 'de' MMMM",
        MMMMd => "d 'de' MMMM",
        MMMd => "d 'de' MMM",
        MMdd => "dd/MM",
        Md => "d/M",
        d => "d",
        h => "h a",
        hm => "h:mm a",
        hms => "h:mm:ss a",
        hmsv => "h:mm:ss a v",
        hmv => "h:mm a v",
        ms => "mm:ss",
        y => "y",
        yM => "MM/y",
        yMEd => "E, dd/MM/y",
        yMM => "MM/y",
        yMMM => "MMM 'de' y",
        yMMMEd => "E, d 'de' MMM 'de' y",
        yMMMM => "MMMM 'de' y",
        yMMMMEd => "E, d 'de' MMMM 'de' y",
        yMMMMd => "d 'de' MMMM 'de' y",
        yMMMd => "d 'de' MMM 'de' y",
        yMd => "dd/MM/y",
        yQQQ => "QQQ 'de' y",
        yQQQQ => "QQQQ 'de' y",
        "yw-count-one" => "w'\N{U+00aa}' 'semana' 'de' Y",
        "yw-count-other" => "w'\N{U+00aa}' 'semana' 'de' Y",
      },
      code => "pt-BR",
      date_format_full => "EEEE, d 'de' MMMM 'de' y",
      date_format_long => "d 'de' MMMM 'de' y",
      date_format_medium => "d 'de' MMM 'de' y",
      date_format_short => "dd/MM/y",
      datetime_format_full => "{1} {0}",
      datetime_format_long => "{1} {0}",
      datetime_format_medium => "{1} {0}",
      datetime_format_short => "{1} {0}",
      day_format_abbreviated => [
        "seg",
        "ter",
        "qua",
        "qui",
        "sex",
        "s\N{U+00e1}b",
        "dom",
      ],
      day_format_narrow => [
        "S",
        "T",
        "Q",
        "Q",
        "S",
        "S",
        "D",
      ],
      day_format_wide => [
        "segunda-feira",
        "ter\N{U+00e7}a-feira",
        "quarta-feira",
        "quinta-feira",
        "sexta-feira",
        "s\N{U+00e1}bado",
        "domingo",
      ],
      day_stand_alone_abbreviated => [
        "seg",
        "ter",
        "qua",
        "qui",
        "sex",
        "s\N{U+00e1}b",
        "dom",
      ],
      day_stand_alone_narrow => [
        "S",
        "T",
        "Q",
        "Q",
        "S",
        "S",
        "D",
      ],
      day_stand_alone_wide => [
        "segunda-feira",
        "ter\N{U+00e7}a-feira",
        "quarta-feira",
        "quinta-feira",
        "sexta-feira",
        "s\N{U+00e1}bado",
        "domingo",
      ],
      era_abbreviated => [
        "a.C.",
        "d.C.",
      ],
      era_narrow => [
        "a.C.",
        "d.C.",
      ],
      era_wide => [
        "antes de Cristo",
        "depois de Cristo",
      ],
      first_day_of_week => 7,
      glibc_date_1_format => "%a %b %e %H:%M:%S %Z %Y",
      glibc_date_format => "%d-%m-%Y",
      glibc_datetime_format => "%a %d %b %Y %T %Z",
      glibc_time_12_format => "%I:%M:%S %p",
      glibc_time_format => "%T",
      language => "Portuguese",
      month_format_abbreviated => [
        "jan",
        "fev",
        "mar",
        "abr",
        "mai",
        "jun",
        "jul",
        "ago",
        "set",
        "out",
        "nov",
        "dez",
      ],
      month_format_narrow => [
        "J",
        "F",
        "M",
        "A",
        "M",
        "J",
        "J",
        "A",
        "S",
        "O",
        "N",
        "D",
      ],
      month_format_wide => [
        "janeiro",
        "fevereiro",
        "mar\N{U+00e7}o",
        "abril",
        "maio",
        "junho",
        "julho",
        "agosto",
        "setembro",
        "outubro",
        "novembro",
        "dezembro",
      ],
      month_stand_alone_abbreviated => [
        "jan",
        "fev",
        "mar",
        "abr",
        "mai",
        "jun",
        "jul",
        "ago",
        "set",
        "out",
        "nov",
        "dez",
      ],
      month_stand_alone_narrow => [
        "J",
        "F",
        "M",
        "A",
        "M",
        "J",
        "J",
        "A",
        "S",
        "O",
        "N",
        "D",
      ],
      month_stand_alone_wide => [
        "janeiro",
        "fevereiro",
        "mar\N{U+00e7}o",
        "abril",
        "maio",
        "junho",
        "julho",
        "agosto",
        "setembro",
        "outubro",
        "novembro",
        "dezembro",
      ],
      name => "Portuguese Brazil",
      native_language => "portugu\N{U+00ea}s",
      native_name => "portugu\N{U+00ea}s Brasil",
      native_script => undef,
      native_territory => "Brasil",
      native_variant => undef,
      quarter_format_abbreviated => [
        "T1",
        "T2",
        "T3",
        "T4",
      ],
      quarter_format_narrow => [
        1,
        2,
        3,
        4,
      ],
      quarter_format_wide => [
        "1\N{U+00ba} trimestre",
        "2\N{U+00ba} trimestre",
        "3\N{U+00ba} trimestre",
        "4\N{U+00ba} trimestre",
      ],
      quarter_stand_alone_abbreviated => [
        "T1",
        "T2",
        "T3",
        "T4",
      ],
      quarter_stand_alone_narrow => [
        1,
        2,
        3,
        4,
      ],
      quarter_stand_alone_wide => [
        "1\N{U+00ba} trimestre",
        "2\N{U+00ba} trimestre",
        "3\N{U+00ba} trimestre",
        "4\N{U+00ba} trimestre",
      ],
      script => undef,
      territory => "Brazil",
      time_format_full => "HH:mm:ss zzzz",
      time_format_long => "HH:mm:ss z",
      time_format_medium => "HH:mm:ss",
      time_format_short => "HH:mm",
      variant => undef,
      version => 35,
    },
    "zh-Hans-CN" => {
      am_pm_abbreviated => [
        "\N{U+4e0a}\N{U+5348}",
        "\N{U+4e0b}\N{U+5348}",
      ],
      available_formats => {
        Bh => "Bh\N{U+65f6}",
        Bhm => "Bh:mm",
        Bhms => "Bh:mm:ss",
        E => "ccc",
        EBhm => "EBh:mm",
        EBhms => "EBh:mm:ss",
        EHm => "EHH:mm",
        EHms => "EHH:mm:ss",
        Ed => "d\N{U+65e5}E",
        Ehm => "Eah:mm",
        Ehms => "Eah:mm:ss",
        Gy => "Gy\N{U+5e74}",
        GyMMM => "Gy\N{U+5e74}M\N{U+6708}",
        GyMMMEd => "Gy\N{U+5e74}M\N{U+6708}d\N{U+65e5}E",
        GyMMMd => "Gy\N{U+5e74}M\N{U+6708}d\N{U+65e5}",
        H => "H\N{U+65f6}",
        Hm => "HH:mm",
        Hms => "HH:mm:ss",
        Hmsv => "v HH:mm:ss",
        Hmv => "v HH:mm",
        M => "M\N{U+6708}",
        MEd => "M/dE",
        MMM => "LLL",
        MMMEd => "M\N{U+6708}d\N{U+65e5}E",
        "MMMMW-count-other" => "MMMM\N{U+7b2c}W\N{U+5468}",
        MMMMd => "M\N{U+6708}d\N{U+65e5}",
        MMMd => "M\N{U+6708}d\N{U+65e5}",
        MMdd => "MM/dd",
        Md => "M/d",
        d => "d\N{U+65e5}",
        h => "ah\N{U+65f6}",
        hm => "ah:mm",
        hms => "ah:mm:ss",
        hmsv => "v ah:mm:ss",
        hmv => "v ah:mm",
        ms => "mm:ss",
        y => "y\N{U+5e74}",
        yM => "y\N{U+5e74}M\N{U+6708}",
        yMEd => "y/M/dE",
        yMM => "y\N{U+5e74}M\N{U+6708}",
        yMMM => "y\N{U+5e74}M\N{U+6708}",
        yMMMEd => "y\N{U+5e74}M\N{U+6708}d\N{U+65e5}E",
        yMMMM => "y\N{U+5e74}M\N{U+6708}",
        yMMMd => "y\N{U+5e74}M\N{U+6708}d\N{U+65e5}",
        yMd => "y/M/d",
        yQQQ => "y\N{U+5e74}\N{U+7b2c}Q\N{U+5b63}\N{U+5ea6}",
        yQQQQ => "y\N{U+5e74}\N{U+7b2c}Q\N{U+5b63}\N{U+5ea6}",
        "yw-count-other" => "Y\N{U+5e74}\N{U+7b2c}w\N{U+5468}",
      },
      code => "zh-Hans-CN",
      date_format_full => "y\N{U+5e74}M\N{U+6708}d\N{U+65e5}EEEE",
      date_format_long => "y\N{U+5e74}M\N{U+6708}d\N{U+65e5}",
      date_format_medium => "y\N{U+5e74}M\N{U+6708}d\N{U+65e5}",
      date_format_short => "y/M/d",
      datetime_format_full => "{1} {0}",
      datetime_format_long => "{1} {0}",
      datetime_format_medium => "{1} {0}",
      datetime_format_short => "{1} {0}",
      day_format_abbreviated => [
        "\N{U+5468}\N{U+4e00}",
        "\N{U+5468}\N{U+4e8c}",
        "\N{U+5468}\N{U+4e09}",
        "\N{U+5468}\N{U+56db}",
        "\N{U+5468}\N{U+4e94}",
        "\N{U+5468}\N{U+516d}",
        "\N{U+5468}\N{U+65e5}",
      ],
      day_format_narrow => [
        "\N{U+4e00}",
        "\N{U+4e8c}",
        "\N{U+4e09}",
        "\N{U+56db}",
        "\N{U+4e94}",
        "\N{U+516d}",
        "\N{U+65e5}",
      ],
      day_format_wide => [
        "\N{U+661f}\N{U+671f}\N{U+4e00}",
        "\N{U+661f}\N{U+671f}\N{U+4e8c}",
        "\N{U+661f}\N{U+671f}\N{U+4e09}",
        "\N{U+661f}\N{U+671f}\N{U+56db}",
        "\N{U+661f}\N{U+671f}\N{U+4e94}",
        "\N{U+661f}\N{U+671f}\N{U+516d}",
        "\N{U+661f}\N{U+671f}\N{U+65e5}",
      ],
      day_stand_alone_abbreviated => [
        "\N{U+5468}\N{U+4e00}",
        "\N{U+5468}\N{U+4e8c}",
        "\N{U+5468}\N{U+4e09}",
        "\N{U+5468}\N{U+56db}",
        "\N{U+5468}\N{U+4e94}",
        "\N{U+5468}\N{U+516d}",
        "\N{U+5468}\N{U+65e5}",
      ],
      day_stand_alone_narrow => [
        "\N{U+4e00}",
        "\N{U+4e8c}",
        "\N{U+4e09}",
        "\N{U+56db}",
        "\N{U+4e94}",
        "\N{U+516d}",
        "\N{U+65e5}",
      ],
      day_stand_alone_wide => [
        "\N{U+661f}\N{U+671f}\N{U+4e00}",
        "\N{U+661f}\N{U+671f}\N{U+4e8c}",
        "\N{U+661f}\N{U+671f}\N{U+4e09}",
        "\N{U+661f}\N{U+671f}\N{U+56db}",
        "\N{U+661f}\N{U+671f}\N{U+4e94}",
        "\N{U+661f}\N{U+671f}\N{U+516d}",
        "\N{U+661f}\N{U+671f}\N{U+65e5}",
      ],
      era_abbreviated => [
        "\N{U+516c}\N{U+5143}\N{U+524d}",
        "\N{U+516c}\N{U+5143}",
      ],
      era_narrow => [
        "\N{U+516c}\N{U+5143}\N{U+524d}",
        "\N{U+516c}\N{U+5143}",
      ],
      era_wide => [
        "\N{U+516c}\N{U+5143}\N{U+524d}",
        "\N{U+516c}\N{U+5143}",
      ],
      first_day_of_week => 7,
      glibc_date_1_format => "%a %b %e %H:%M:%S %Z %Y",
      glibc_date_format => "%m/%d/%y",
      glibc_datetime_format => "%a %b %e %H:%M:%S %Y",
      glibc_time_12_format => "%I:%M:%S %p",
      glibc_time_format => "%H:%M:%S",
      language => "Chinese",
      month_format_abbreviated => [
        "1\N{U+6708}",
        "2\N{U+6708}",
        "3\N{U+6708}",
        "4\N{U+6708}",
        "5\N{U+6708}",
        "6\N{U+6708}",
        "7\N{U+6708}",
        "8\N{U+6708}",
        "9\N{U+6708}",
        "10\N{U+6708}",
        "11\N{U+6708}",
        "12\N{U+6708}",
      ],
      month_format_narrow => [
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        9,
        10,
        11,
        12,
      ],
      month_format_wide => [
        "\N{U+4e00}\N{U+6708}",
        "\N{U+4e8c}\N{U+6708}",
        "\N{U+4e09}\N{U+6708}",
        "\N{U+56db}\N{U+6708}",
        "\N{U+4e94}\N{U+6708}",
        "\N{U+516d}\N{U+6708}",
        "\N{U+4e03}\N{U+6708}",
        "\N{U+516b}\N{U+6708}",
        "\N{U+4e5d}\N{U+6708}",
        "\N{U+5341}\N{U+6708}",
        "\N{U+5341}\N{U+4e00}\N{U+6708}",
        "\N{U+5341}\N{U+4e8c}\N{U+6708}",
      ],
      month_stand_alone_abbreviated => [
        "1\N{U+6708}",
        "2\N{U+6708}",
        "3\N{U+6708}",
        "4\N{U+6708}",
        "5\N{U+6708}",
        "6\N{U+6708}",
        "7\N{U+6708}",
        "8\N{U+6708}",
        "9\N{U+6708}",
        "10\N{U+6708}",
        "11\N{U+6708}",
        "12\N{U+6708}",
      ],
      month_stand_alone_narrow => [
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        9,
        10,
        11,
        12,
      ],
      month_stand_alone_wide => [
        "\N{U+4e00}\N{U+6708}",
        "\N{U+4e8c}\N{U+6708}",
        "\N{U+4e09}\N{U+6708}",
        "\N{U+56db}\N{U+6708}",
        "\N{U+4e94}\N{U+6708}",
        "\N{U+516d}\N{U+6708}",
        "\N{U+4e03}\N{U+6708}",
        "\N{U+516b}\N{U+6708}",
        "\N{U+4e5d}\N{U+6708}",
        "\N{U+5341}\N{U+6708}",
        "\N{U+5341}\N{U+4e00}\N{U+6708}",
        "\N{U+5341}\N{U+4e8c}\N{U+6708}",
      ],
      name => "Chinese China Simplified",
      native_language => "\N{U+4e2d}\N{U+6587}",
      native_name => "\N{U+4e2d}\N{U+6587} \N{U+4e2d}\N{U+56fd} \N{U+7b80}\N{U+4f53}",
      native_script => "\N{U+7b80}\N{U+4f53}",
      native_territory => "\N{U+4e2d}\N{U+56fd}",
      native_variant => undef,
      quarter_format_abbreviated => [
        "1\N{U+5b63}\N{U+5ea6}",
        "2\N{U+5b63}\N{U+5ea6}",
        "3\N{U+5b63}\N{U+5ea6}",
        "4\N{U+5b63}\N{U+5ea6}",
      ],
      quarter_format_narrow => [
        1,
        2,
        3,
        4,
      ],
      quarter_format_wide => [
        "\N{U+7b2c}\N{U+4e00}\N{U+5b63}\N{U+5ea6}",
        "\N{U+7b2c}\N{U+4e8c}\N{U+5b63}\N{U+5ea6}",
        "\N{U+7b2c}\N{U+4e09}\N{U+5b63}\N{U+5ea6}",
        "\N{U+7b2c}\N{U+56db}\N{U+5b63}\N{U+5ea6}",
      ],
      quarter_stand_alone_abbreviated => [
        "1\N{U+5b63}\N{U+5ea6}",
        "2\N{U+5b63}\N{U+5ea6}",
        "3\N{U+5b63}\N{U+5ea6}",
        "4\N{U+5b63}\N{U+5ea6}",
      ],
      quarter_stand_alone_narrow => [
        1,
        2,
        3,
        4,
      ],
      quarter_stand_alone_wide => [
        "\N{U+7b2c}\N{U+4e00}\N{U+5b63}\N{U+5ea6}",
        "\N{U+7b2c}\N{U+4e8c}\N{U+5b63}\N{U+5ea6}",
        "\N{U+7b2c}\N{U+4e09}\N{U+5b63}\N{U+5ea6}",
        "\N{U+7b2c}\N{U+56db}\N{U+5b63}\N{U+5ea6}",
      ],
      script => "Simplified",
      territory => "China",
      time_format_full => "zzzz ah:mm:ss",
      time_format_long => "z ah:mm:ss",
      time_format_medium => "ah:mm:ss",
      time_format_short => "ah:mm",
      variant => undef,
      version => 35,
    },
    "zh-Hant-TW" => {
      am_pm_abbreviated => [
        "\N{U+4e0a}\N{U+5348}",
        "\N{U+4e0b}\N{U+5348}",
      ],
      available_formats => {
        Bh => "Bh\N{U+6642}",
        Bhm => "Bh:mm",
        Bhms => "Bh:mm:ss",
        E => "ccc",
        EBhm => "E Bh:mm",
        EBhms => "E Bh:mm:ss",
        EHm => "E HH:mm",
        EHms => "E HH:mm:ss",
        Ed => "d E",
        Ehm => "E ah:mm",
        Ehms => "E ah:mm:ss",
        Gy => "Gy\N{U+5e74}",
        GyMMM => "Gy\N{U+5e74}M\N{U+6708}",
        GyMMMEd => "Gy\N{U+5e74}M\N{U+6708}d\N{U+65e5} E",
        GyMMMd => "Gy\N{U+5e74}M\N{U+6708}d\N{U+65e5}",
        H => "H\N{U+6642}",
        Hm => "HH:mm",
        Hms => "HH:mm:ss",
        Hmsv => "HH:mm:ss [v]",
        Hmv => "HH:mm [v]",
        M => "M\N{U+6708}",
        MEd => "M/d\N{U+ff08}E\N{U+ff09}",
        MMM => "LLL",
        MMMEd => "M\N{U+6708}d\N{U+65e5} E",
        "MMMMW-count-other" => "MMMM\N{U+7684}\N{U+7b2c}W\N{U+9031}",
        MMMMd => "M\N{U+6708}d\N{U+65e5}",
        MMMd => "M\N{U+6708}d\N{U+65e5}",
        MMdd => "MM/dd",
        Md => "M/d",
        d => "d\N{U+65e5}",
        h => "ah\N{U+6642}",
        hm => "ah:mm",
        hms => "ah:mm:ss",
        hmsv => "ah:mm:ss [v]",
        hmv => "ah:mm [v]",
        ms => "mm:ss",
        y => "y\N{U+5e74}",
        yM => "y/M",
        yMEd => "y/M/d\N{U+ff08}E\N{U+ff09}",
        yMM => "y/MM",
        yMMM => "y\N{U+5e74}M\N{U+6708}",
        yMMMEd => "y\N{U+5e74}M\N{U+6708}d\N{U+65e5} E",
        yMMMM => "y\N{U+5e74}M\N{U+6708}",
        yMMMd => "y\N{U+5e74}M\N{U+6708}d\N{U+65e5}",
        yMd => "y/M/d",
        yQQQ => "y\N{U+5e74}QQQ",
        yQQQQ => "y\N{U+5e74}QQQQ",
        "yw-count-other" => "Y\N{U+5e74}\N{U+7684}\N{U+7b2c}w\N{U+9031}",
      },
      code => "zh-Hant-TW",
      date_format_full => "y\N{U+5e74}M\N{U+6708}d\N{U+65e5} EEEE",
      date_format_long => "y\N{U+5e74}M\N{U+6708}d\N{U+65e5}",
      date_format_medium => "y\N{U+5e74}M\N{U+6708}d\N{U+65e5}",
      date_format_short => "y/M/d",
      datetime_format_full => "{1} {0}",
      datetime_format_long => "{1} {0}",
      datetime_format_medium => "{1} {0}",
      datetime_format_short => "{1} {0}",
      day_format_abbreviated => [
        "\N{U+9031}\N{U+4e00}",
        "\N{U+9031}\N{U+4e8c}",
        "\N{U+9031}\N{U+4e09}",
        "\N{U+9031}\N{U+56db}",
        "\N{U+9031}\N{U+4e94}",
        "\N{U+9031}\N{U+516d}",
        "\N{U+9031}\N{U+65e5}",
      ],
      day_format_narrow => [
        "\N{U+4e00}",
        "\N{U+4e8c}",
        "\N{U+4e09}",
        "\N{U+56db}",
        "\N{U+4e94}",
        "\N{U+516d}",
        "\N{U+65e5}",
      ],
      day_format_wide => [
        "\N{U+661f}\N{U+671f}\N{U+4e00}",
        "\N{U+661f}\N{U+671f}\N{U+4e8c}",
        "\N{U+661f}\N{U+671f}\N{U+4e09}",
        "\N{U+661f}\N{U+671f}\N{U+56db}",
        "\N{U+661f}\N{U+671f}\N{U+4e94}",
        "\N{U+661f}\N{U+671f}\N{U+516d}",
        "\N{U+661f}\N{U+671f}\N{U+65e5}",
      ],
      day_stand_alone_abbreviated => [
        "\N{U+9031}\N{U+4e00}",
        "\N{U+9031}\N{U+4e8c}",
        "\N{U+9031}\N{U+4e09}",
        "\N{U+9031}\N{U+56db}",
        "\N{U+9031}\N{U+4e94}",
        "\N{U+9031}\N{U+516d}",
        "\N{U+9031}\N{U+65e5}",
      ],
      day_stand_alone_narrow => [
        "\N{U+4e00}",
        "\N{U+4e8c}",
        "\N{U+4e09}",
        "\N{U+56db}",
        "\N{U+4e94}",
        "\N{U+516d}",
        "\N{U+65e5}",
      ],
      day_stand_alone_wide => [
        "\N{U+661f}\N{U+671f}\N{U+4e00}",
        "\N{U+661f}\N{U+671f}\N{U+4e8c}",
        "\N{U+661f}\N{U+671f}\N{U+4e09}",
        "\N{U+661f}\N{U+671f}\N{U+56db}",
        "\N{U+661f}\N{U+671f}\N{U+4e94}",
        "\N{U+661f}\N{U+671f}\N{U+516d}",
        "\N{U+661f}\N{U+671f}\N{U+65e5}",
      ],
      era_abbreviated => [
        "\N{U+897f}\N{U+5143}\N{U+524d}",
        "\N{U+897f}\N{U+5143}",
      ],
      era_narrow => [
        "\N{U+897f}\N{U+5143}\N{U+524d}",
        "\N{U+897f}\N{U+5143}",
      ],
      era_wide => [
        "\N{U+897f}\N{U+5143}\N{U+524d}",
        "\N{U+897f}\N{U+5143}",
      ],
      first_day_of_week => 7,
      glibc_date_1_format => "%a %b %e %H:%M:%S %Z %Y",
      glibc_date_format => "%m/%d/%y",
      glibc_datetime_format => "%a %b %e %H:%M:%S %Y",
      glibc_time_12_format => "%I:%M:%S %p",
      glibc_time_format => "%H:%M:%S",
      language => "Chinese",
      month_format_abbreviated => [
        "1\N{U+6708}",
        "2\N{U+6708}",
        "3\N{U+6708}",
        "4\N{U+6708}",
        "5\N{U+6708}",
        "6\N{U+6708}",
        "7\N{U+6708}",
        "8\N{U+6708}",
        "9\N{U+6708}",
        "10\N{U+6708}",
        "11\N{U+6708}",
        "12\N{U+6708}",
      ],
      month_format_narrow => [
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        9,
        10,
        11,
        12,
      ],
      month_format_wide => [
        "1\N{U+6708}",
        "2\N{U+6708}",
        "3\N{U+6708}",
        "4\N{U+6708}",
        "5\N{U+6708}",
        "6\N{U+6708}",
        "7\N{U+6708}",
        "8\N{U+6708}",
        "9\N{U+6708}",
        "10\N{U+6708}",
        "11\N{U+6708}",
        "12\N{U+6708}",
      ],
      month_stand_alone_abbreviated => [
        "1\N{U+6708}",
        "2\N{U+6708}",
        "3\N{U+6708}",
        "4\N{U+6708}",
        "5\N{U+6708}",
        "6\N{U+6708}",
        "7\N{U+6708}",
        "8\N{U+6708}",
        "9\N{U+6708}",
        "10\N{U+6708}",
        "11\N{U+6708}",
        "12\N{U+6708}",
      ],
      month_stand_alone_narrow => [
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        9,
        10,
        11,
        12,
      ],
      month_stand_alone_wide => [
        "1\N{U+6708}",
        "2\N{U+6708}",
        "3\N{U+6708}",
        "4\N{U+6708}",
        "5\N{U+6708}",
        "6\N{U+6708}",
        "7\N{U+6708}",
        "8\N{U+6708}",
        "9\N{U+6708}",
        "10\N{U+6708}",
        "11\N{U+6708}",
        "12\N{U+6708}",
      ],
      name => "Chinese Taiwan Traditional",
      native_language => "\N{U+4e2d}\N{U+6587}",
      native_name => "\N{U+4e2d}\N{U+6587} \N{U+53f0}\N{U+7063} \N{U+7e41}\N{U+9ad4}",
      native_script => "\N{U+7e41}\N{U+9ad4}",
      native_territory => "\N{U+53f0}\N{U+7063}",
      native_variant => undef,
      quarter_format_abbreviated => [
        "\N{U+7b2c}1\N{U+5b63}",
        "\N{U+7b2c}2\N{U+5b63}",
        "\N{U+7b2c}3\N{U+5b63}",
        "\N{U+7b2c}4\N{U+5b63}",
      ],
      quarter_format_narrow => [
        1,
        2,
        3,
        4,
      ],
      quarter_format_wide => [
        "\N{U+7b2c}1\N{U+5b63}",
        "\N{U+7b2c}2\N{U+5b63}",
        "\N{U+7b2c}3\N{U+5b63}",
        "\N{U+7b2c}4\N{U+5b63}",
      ],
      quarter_stand_alone_abbreviated => [
        "\N{U+7b2c}1\N{U+5b63}",
        "\N{U+7b2c}2\N{U+5b63}",
        "\N{U+7b2c}3\N{U+5b63}",
        "\N{U+7b2c}4\N{U+5b63}",
      ],
      quarter_stand_alone_narrow => [
        1,
        2,
        3,
        4,
      ],
      quarter_stand_alone_wide => [
        "\N{U+7b2c}1\N{U+5b63}",
        "\N{U+7b2c}2\N{U+5b63}",
        "\N{U+7b2c}3\N{U+5b63}",
        "\N{U+7b2c}4\N{U+5b63}",
      ],
      script => "Traditional",
      territory => "Taiwan",
      time_format_full => "ah:mm:ss [zzzz]",
      time_format_long => "ah:mm:ss [z]",
      time_format_medium => "ah:mm:ss",
      time_format_short => "ah:mm",
      variant => undef,
      version => 35,
    },
  );
  ### :end LocaleData:
  #>>>
  
  sub locale_data {
      my $code = shift;
      return $LocaleData{$code} if $LocaleData{$code};
  
      my $data = _data_for($code);
  
      return $LocaleData{$code} = $data;
  }
  
  sub _data_for {
      my $code = shift;
  
      my $data = do( dist_file( 'DateTime-Locale', $code . '.pl' ) );
      die $@ if $@;
  
      return $data;
  }
  
  sub add_locale {
      my $code = shift;
      my $data = shift;
  
      die "You cannot add an existing locale - $code\n"
          if exists $Codes{$code};
      die
          qq{One of either the 'en_language' or 'language' keys is required to add a new locale\n}
          if !( exists $data->{en_language} || exists $data->{language} );
  
      my $lang
          = ( exists $data->{en_language} )
          ? $data->{en_language}
          : $data->{language};
      $Names{$lang}                            = $code;
      $Codes{$code}                            = 1;
      $NativeNames{ $data->{native_language} } = $code
          if exists $data->{native_language};
      $LocaleData{$code} = $data;
  }
  
  # ABSTRACT: Locale data generated from CLDR
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  DateTime::Locale::Data - Locale data generated from CLDR
  
  =head1 VERSION
  
  version 1.24
  
  =head1 DESCRIPTION
  
  There are no user-facing parts in this module.
  
  =head1 SUPPORT
  
  Bugs may be submitted at L<https://github.com/houseabsolute/DateTime-Locale/issues>.
  
  There is a mailing list available for users of this distribution,
  L<mailto:datetime@perl.org>.
  
  I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
  
  =head1 SOURCE
  
  The source code repository for DateTime-Locale can be found at L<https://github.com/houseabsolute/DateTime-Locale>.
  
  =head1 AUTHOR
  
  Dave Rolsky <autarch@urth.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2003 - 2019 by Dave Rolsky.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  The full text of the license can be found in the
  F<LICENSE> file included with this distribution.
  
  =cut
DATETIME_LOCALE_DATA

    $main::fatpacked{"DateTime/Locale/FromData.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_LOCALE_FROMDATA';
  package DateTime::Locale::FromData;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  use DateTime::Locale::Util qw( parse_locale_code );
  use Params::ValidationCompiler 0.13 qw( validation_for );
  use Specio::Declare;
  
  our $VERSION = '1.24';
  
  my @FormatLengths;
  
  BEGIN {
      my @methods = qw(
          code
          name
          language
          script
          territory
          variant
          native_name
          native_language
          native_script
          native_territory
          native_variant
          am_pm_abbreviated
          date_format_full
          date_format_long
          date_format_medium
          date_format_short
          time_format_full
          time_format_long
          time_format_medium
          time_format_short
          day_format_abbreviated
          day_format_narrow
          day_format_wide
          day_stand_alone_abbreviated
          day_stand_alone_narrow
          day_stand_alone_wide
          month_format_abbreviated
          month_format_narrow
          month_format_wide
          month_stand_alone_abbreviated
          month_stand_alone_narrow
          month_stand_alone_wide
          quarter_format_abbreviated
          quarter_format_narrow
          quarter_format_wide
          quarter_stand_alone_abbreviated
          quarter_stand_alone_narrow
          quarter_stand_alone_wide
          era_abbreviated
          era_narrow
          era_wide
          default_date_format_length
          default_time_format_length
          first_day_of_week
          version
          glibc_datetime_format
          glibc_date_format
          glibc_date_1_format
          glibc_time_format
          glibc_time_12_format
      );
  
      for my $meth (@methods) {
          my $sub = sub { $_[0]->{$meth} };
          ## no critic (TestingAndDebugging::ProhibitNoStrict)
          no strict 'refs';
          *{$meth} = $sub;
      }
  
      @FormatLengths = qw( short medium long full );
  
      for my $length (@FormatLengths) {
          my $meth = 'datetime_format_' . $length;
          my $key  = 'computed_' . $meth;
  
          my $sub = sub {
              my $self = shift;
  
              return $self->{$key} if exists $self->{$key};
  
              return $self->{$key} = $self->_make_datetime_format($length);
          };
  
          ## no critic (TestingAndDebugging::ProhibitNoStrict)
          no strict 'refs';
          *{$meth} = $sub;
      }
  }
  
  sub new {
      my $class = shift;
      my $data  = shift;
  
      return bless {
          %{$data},
          default_date_format_length => 'medium',
          default_time_format_length => 'medium',
          locale_data                => $data
      }, $class;
  }
  
  sub date_format_default {
      return $_[0]->date_format_medium;
  }
  
  sub time_format_default {
      return $_[0]->time_format_medium;
  }
  
  sub datetime_format {
      return $_[0]->{datetime_format_medium};
  }
  
  sub datetime_format_default {
      return $_[0]->datetime_format_medium;
  }
  
  sub _make_datetime_format {
      my $self   = shift;
      my $length = shift;
  
      my $dt_key    = 'datetime_format_' . $length;
      my $date_meth = 'date_format_' . $length;
      my $time_meth = 'time_format_' . $length;
  
      my $dt_format = $self->{$dt_key};
      $dt_format =~ s/\{0\}/$self->$time_meth/eg;
      $dt_format =~ s/\{1\}/$self->$date_meth/eg;
  
      return $dt_format;
  }
  
  my $length    = enum( values => [qw( full long medium short )] );
  my $validator = validation_for(
      name             => '_check_length_parameter',
      name_is_optional => 1,
      params           => [ { type => $length } ],
  );
  
  sub set_default_date_format_length {
      my $self = shift;
      my ($l) = $validator->(@_);
  
      $self->{default_date_format_length} = lc $l;
  }
  
  sub set_default_time_format_length {
      my $self = shift;
      my ($l) = $validator->(@_);
  
      $self->{default_time_format_length} = lc $l;
  }
  
  sub date_formats {
      my %formats;
      for my $length (@FormatLengths) {
          my $meth = 'date_format_' . $length;
          $formats{$length} = $_[0]->$meth;
      }
      return \%formats;
  }
  
  sub time_formats {
      my %formats;
      for my $length (@FormatLengths) {
          my $meth = 'time_format_' . $length;
          $formats{$length} = $_[0]->$meth;
      }
      return \%formats;
  }
  
  sub available_formats {
      my $self = shift;
  
      $self->{computed_available_formats}
          ||= [ sort keys %{ $self->_available_formats } ];
  
      return @{ $self->{computed_available_formats} };
  }
  
  sub format_for {
      my $self = shift;
      my $for  = shift;
  
      return $self->_available_formats->{$for};
  }
  
  sub _available_formats { $_[0]->{available_formats} }
  
  sub prefers_24_hour_time {
      my $self = shift;
  
      return $self->{prefers_24_hour_time}
          if exists $self->{prefers_24_hour_time};
  
      $self->{prefers_24_hour_time} = $self->time_format_short =~ /h|K/ ? 0 : 1;
  }
  
  sub language_code {
      my $self = shift;
      return ( $self->{parsed_code} ||= { parse_locale_code( $self->code ) } )
          ->{language};
  }
  
  sub script_code {
      my $self = shift;
      return ( $self->{parsed_code} ||= { parse_locale_code( $self->code ) } )
          ->{script};
  }
  
  sub territory_code {
      my $self = shift;
      return ( $self->{parsed_code} ||= { parse_locale_code( $self->code ) } )
          ->{territory};
  }
  
  sub variant_code {
      my $self = shift;
      return ( $self->{parsed_code} ||= { parse_locale_code( $self->code ) } )
          ->{variant};
  }
  
  sub id {
      $_[0]->code;
  }
  
  sub language_id {
      $_[0]->language_code;
  }
  
  sub script_id {
      $_[0]->script_code;
  }
  
  sub territory_id {
      $_[0]->territory_code;
  }
  
  sub variant_id {
      $_[0]->variant_code;
  }
  
  sub locale_data {
      return %{ $_[0]->{locale_data} };
  }
  
  sub STORABLE_freeze {
      my $self    = shift;
      my $cloning = shift;
  
      return if $cloning;
  
      return $self->code;
  }
  
  sub STORABLE_thaw {
      my $self = shift;
      shift;
      my $serialized = shift;
  
      require DateTime::Locale;
      my $obj = DateTime::Locale->load($serialized);
  
      %{$self} = %{$obj};
  
      return $self;
  }
  
  1;
  
  # ABSTRACT: Class for locale objects instantiated from pre-defined data
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  DateTime::Locale::FromData - Class for locale objects instantiated from pre-defined data
  
  =head1 VERSION
  
  version 1.24
  
  =head1 SYNOPSIS
  
    my $locale = DateTime::Locale::FromData->new(%lots_of_data)
  
  =head1 DESCRIPTION
  
  This class is used to represent locales instantiated from the data in the
  DateTime::Locale::Data module.
  
  =head1 METHODS
  
  This class provides the following methods:
  
  =head2 $locale->code
  
  The complete locale id, something like "en-US".
  
  =head2 $locale->language_code
  
  The language portion of the code, like "en".
  
  =head2 $locale->script_code
  
  The script portion of the code, like "Hant".
  
  =head2 $locale->territory_code
  
  The territory portion of the code, like "US".
  
  =head2 $locale->variant_code
  
  The variant portion of the code, like "POSIX".
  
  =head2 $locale->name
  
  The locale's complete name, which always includes at least a language
  component, plus optional territory and variant components. Something like
  "English United States". The value returned will always be in English.
  
  =head2 $locale->language
  
  =head2 $locale->script
  
  =head2 $locale->territory
  
  =head2 $locale->variant
  
  The relevant component from the locale's complete name, like "English"
  or "United States".
  
  =head2 $locale->native_name
  
  The locale's complete name in localized form as a UTF-8 string.
  
  =head2 $locale->native_language
  
  =head2 $locale->native_script
  
  =head2 $locale->native_territory
  
  =head2 $locale->native_variant
  
  The relevant component from the locale's complete native name as a UTF-8
  string.
  
  =head2 $locale->month_format_wide
  
  =head2 $locale->month_format_abbreviated
  
  =head2 $locale->month_format_narrow
  
  =head2 $locale->month_stand_alone_wide
  
  =head2 $locale->month_stand_alone_abbreviated
  
  =head2 $locale->month_stand_alone_narrow
  
  =head2 $locale->day_format_wide
  
  =head2 $locale->day_format_abbreviated
  
  =head2 $locale->day_format_narrow
  
  =head2 $locale->day_stand_alone_wide
  
  =head2 $locale->day_stand_alone_abbreviated
  
  =head2 $locale->day_stand_alone_narrow
  
  =head2 $locale->quarter_format_wide
  
  =head2 $locale->quarter_format_abbreviated
  
  =head2 $locale->quarter_format_narrow
  
  =head2 $locale->quarter_stand_alone_wide
  
  =head2 $locale->quarter_stand_alone_abbreviated
  
  =head2 $locale->quarter_stand_alone_narrow
  
  =head2 $locale->am_pm_abbreviated
  
  =head2 $locale->era_wide
  
  =head2 $locale->era_abbreviated
  
  =head2 $locale->era_narrow
  
  These methods all return an array reference containing the specified data.
  
  The methods with "format" in the name should return strings that can be used a
  part of a string, like "the month of July". The stand alone values are for use
  in things like calendars as opposed to a sentence.
  
  The narrow forms may not be unique (for example, in the day column heading for
  a calendar it's okay to have "T" for both Tuesday and Thursday).
  
  The wide name should always be the full name of thing in question. The narrow
  name should be just one or two characters.
  
  =head2 $locale->date_format_full
  
  =head2 $locale->date_format_long
  
  =head2 $locale->date_format_medium
  
  =head2 $locale->date_format_short
  
  =head2 $locale->time_format_full
  
  =head2 $locale->time_format_long
  
  =head2 $locale->time_format_medium
  
  =head2 $locale->time_format_short
  
  =head2 $locale->datetime_format_full
  
  =head2 $locale->datetime_format_long
  
  =head2 $locale->datetime_format_medium
  
  =head2 $locale->datetime_format_short
  
  These methods return strings appropriate for the C<< DateTime->format_cldr >>
  method.
  
  =head2 $locale->format_for($name)
  
  These are accessed by passing a name to C<< $locale->format_for(...)  >>,
  where the name is a CLDR-style format specifier.
  
  The return value is a string suitable for passing to C<< $dt->format_cldr >>,
  so you can do something like this:
  
    print $dt->format_cldr( $dt->locale->format_for('MMMdd') )
  
  which for the "en" locale would print out something like "08 Jul".
  
  Note that the localization may also include additional text specific to the
  locale. For example, the "MMMMd" format for the "zh" locale includes the
  Chinese characters for "day" (日) and month (月), so you get something like
  "S<8月23日>".
  
  =head2 $locale->available_formats
  
  This should return a list of all the format names that could be passed
  to C<< $locale->format_for >>.
  
  See the documentation for individual locales for details and examples of these
  formats. The format names that are available vary by locale.
  
  =head2 $locale->glibc_datetime_format
  
  =head2 $locale->glibc_date_format
  
  =head2 $locale->glibc_date_1_format
  
  =head2 $locale->glibc_time_format
  
  =head2 $locale->glibc_time_12_format
  
  These methods return strings appropriate for the C<< DateTime->strftime >>
  method. However, you are strongly encouraged to use the other format methods,
  which use the CLDR format data. They are primarily included for the benefit
  for L<DateTime::Format::Strptime>.
  
  =head2 $locale->version
  
  The CLDR version from which this locale was generated.
  
  =head2 $locale->prefers_24_hour_time
  
  Returns a boolean indicating whether or not the locale prefers 24-hour time.
  
  =head2 $locale->first_day_of_week
  
  Returns a number from 1 to 7 indicating the I<local> first day of the
  week, with Monday being 1 and Sunday being 7.
  
  =head2 $locale->locale_data
  
  Returns the original data used to create this locale as a hash. This is here
  to facilitate creating custom locale that via
  C<DateTime::Locale->register_data_locale>.
  
  =head1 SUPPORT
  
  Bugs may be submitted at L<https://github.com/houseabsolute/DateTime-Locale/issues>.
  
  There is a mailing list available for users of this distribution,
  L<mailto:datetime@perl.org>.
  
  I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
  
  =head1 SOURCE
  
  The source code repository for DateTime-Locale can be found at L<https://github.com/houseabsolute/DateTime-Locale>.
  
  =head1 AUTHOR
  
  Dave Rolsky <autarch@urth.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2003 - 2019 by Dave Rolsky.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  The full text of the license can be found in the
  F<LICENSE> file included with this distribution.
  
  =cut
DATETIME_LOCALE_FROMDATA

    $main::fatpacked{"DateTime/Locale/Util.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_LOCALE_UTIL';
  package DateTime::Locale::Util;
  
  use strict;
  use warnings;
  use namespace::autoclean 0.19 -except => ['import'];
  
  use Exporter qw( import );
  
  our $VERSION = '1.24';
  
  our @EXPORT_OK = 'parse_locale_code';
  
  sub parse_locale_code {
      my @pieces = split /-/, $_[0];
  
      return unless @pieces;
  
      my %codes = ( language => lc shift @pieces );
      if ( @pieces == 1 ) {
          if ( length $pieces[0] == 2 || $pieces[0] =~ /^\d\d\d$/ ) {
              $codes{territory} = uc shift @pieces;
          }
          else {
              $codes{script} = _tc( shift @pieces );
          }
      }
      elsif ( @pieces == 3 ) {
          $codes{script}    = _tc( shift @pieces );
          $codes{territory} = uc shift @pieces;
          $codes{variant}   = uc shift @pieces;
      }
      elsif ( @pieces == 2 ) {
  
          # I don't think it's possible to have a script + variant without also
          # having a territory.
          if ( length $pieces[1] == 2 || $pieces[1] =~ /^\d\d\d$/ ) {
              $codes{script}    = _tc( shift @pieces );
              $codes{territory} = uc shift @pieces;
          }
          else {
              $codes{territory} = uc shift @pieces;
              $codes{variant}   = uc shift @pieces;
          }
      }
  
      return %codes;
  }
  
  sub _tc {
      return ucfirst lc $_[0];
  }
  
  1;
  
  # ABSTRACT: Utility code for DateTime::Locale
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  DateTime::Locale::Util - Utility code for DateTime::Locale
  
  =head1 VERSION
  
  version 1.24
  
  =head1 DESCRIPTION
  
  There are no user-facing parts in this module.
  
  =head1 SUPPORT
  
  Bugs may be submitted at L<https://github.com/houseabsolute/DateTime-Locale/issues>.
  
  There is a mailing list available for users of this distribution,
  L<mailto:datetime@perl.org>.
  
  I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
  
  =head1 SOURCE
  
  The source code repository for DateTime-Locale can be found at L<https://github.com/houseabsolute/DateTime-Locale>.
  
  =head1 AUTHOR
  
  Dave Rolsky <autarch@urth.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2003 - 2019 by Dave Rolsky.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  The full text of the license can be found in the
  F<LICENSE> file included with this distribution.
  
  =cut
DATETIME_LOCALE_UTIL

    $main::fatpacked{"DateTime/PP.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_PP';
  package DateTime::PP;
  
  use strict;
  use warnings;
  
  our $VERSION = '1.51';
  
  ## no critic (Variables::ProhibitPackageVars)
  $DateTime::IsPurePerl = 1;
  ## use critic
  
  my @MonthLengths = ( 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 );
  
  my @LeapYearMonthLengths = @MonthLengths;
  $LeapYearMonthLengths[1]++;
  
  my @EndOfLastMonthDayOfYear;
  {
      my $x = 0;
      foreach my $length (@MonthLengths) {
          push @EndOfLastMonthDayOfYear, $x;
          $x += $length;
      }
  }
  
  my @EndOfLastMonthDayOfLeapYear = @EndOfLastMonthDayOfYear;
  $EndOfLastMonthDayOfLeapYear[$_]++ for 2 .. 11;
  
  ## no critic (Subroutines::ProhibitUnusedPrivateSubroutines)
  sub _time_as_seconds {
      shift;
      my ( $hour, $min, $sec ) = @_;
  
      $hour ||= 0;
      $min  ||= 0;
      $sec  ||= 0;
  
      my $secs = $hour * 3600 + $min * 60 + $sec;
      return $secs;
  }
  
  sub _rd2ymd {
      my $class = shift;
  
      use integer;
      my $d  = shift;
      my $rd = $d;
  
      my $yadj = 0;
      my ( $c, $y, $m );
  
      # add 306 days to make relative to Mar 1, 0
      if ( ( $d += 306 ) <= 0 ) {
  
          # avoid ambiguity in C division of negatives
          $yadj = -( -$d / 146097 + 1 );
          $d -= $yadj * 146097;
      }
  
      $c = ( $d * 4 - 1 )
          / 146097;    # calc # of centuries $d is after 29 Feb of yr 0
      $d -= $c * 146097 / 4;    # (4 centuries = 146097 days)
      $y = ( $d * 4 - 1 ) / 1461;    # calc number of years into the century,
      $d -= $y * 1461 / 4;           # again March-based (4 yrs =~ 146[01] days)
      $m = ( $d * 12 + 1093 )
          / 367;    # get the month (3..14 represent March through
      $d -= ( $m * 367 - 1094 ) / 12;    # February of following year)
      $y += $c * 100 + $yadj * 400;      # get the real year, which is off by
                                         # one if month is January or February
  
      if ( $m > 12 ) {
          ++$y;
          $m -= 12;
      }
  
      if ( $_[0] ) {
          my $dow;
  
          if ( $rd < -6 ) {
              $dow = ( $rd + 6 ) % 7;
              $dow += $dow ? 8 : 1;
          }
          else {
              $dow = ( ( $rd + 6 ) % 7 ) + 1;
          }
  
          my $doy = $class->_end_of_last_month_day_of_year( $y, $m );
  
          $doy += $d;
  
          my $quarter;
          {
              no integer;
              $quarter = int( ( 1 / 3.1 ) * $m ) + 1;
          }
  
          my $qm = ( 3 * $quarter ) - 2;
  
          my $doq
              = ( $doy - $class->_end_of_last_month_day_of_year( $y, $qm ) );
  
          return ( $y, $m, $d, $dow, $doy, $quarter, $doq );
      }
  
      return ( $y, $m, $d );
  }
  
  sub _ymd2rd {
      shift;    # ignore class
  
      use integer;
      my ( $y, $m, $d ) = @_;
      my $adj;
  
      # make month in range 3..14 (treat Jan & Feb as months 13..14 of
      # prev year)
      if ( $m <= 2 ) {
          $y -= ( $adj = ( 14 - $m ) / 12 );
          $m += 12 * $adj;
      }
      elsif ( $m > 14 ) {
          $y += ( $adj = ( $m - 3 ) / 12 );
          $m -= 12 * $adj;
      }
  
      # make year positive (oh, for a use integer 'sane_div'!)
      if ( $y < 0 ) {
          $d -= 146097 * ( $adj = ( 399 - $y ) / 400 );
          $y += 400 * $adj;
      }
  
      # add: day of month, days of previous 0-11 month period that began
      # w/March, days of previous 0-399 year period that began w/March
      # of a 400-multiple year), days of any 400-year periods before
      # that, and finally subtract 306 days to adjust from Mar 1, year
      # 0-relative to Jan 1, year 1-relative (whew)
  
      $d
          += ( $m * 367 - 1094 ) / 12
          + $y % 100 * 1461 / 4
          + ( $y / 100 * 36524 + $y / 400 )
          - 306;
  }
  
  sub _seconds_as_components {
      shift;
      my $secs     = shift;
      my $utc_secs = shift;
      my $modifier = shift || 0;
  
      use integer;
  
      $secs -= $modifier;
  
      my $hour = $secs / 3600;
      $secs -= $hour * 3600;
  
      my $minute = $secs / 60;
  
      my $second = $secs - ( $minute * 60 );
  
      if ( $utc_secs && $utc_secs >= 86400 ) {
  
          # there is no such thing as +3 or more leap seconds!
          die "Invalid UTC RD seconds value: $utc_secs"
              if $utc_secs > 86401;
  
          $second += $utc_secs - 86400 + 60;
  
          $minute = 59;
  
          $hour--;
          $hour = 23 if $hour < 0;
      }
  
      return ( $hour, $minute, $second );
  }
  
  sub _end_of_last_month_day_of_year {
      my $class = shift;
  
      my ( $y, $m ) = @_;
      $m--;
      return (
            $class->_is_leap_year($y)
          ? $EndOfLastMonthDayOfLeapYear[$m]
          : $EndOfLastMonthDayOfYear[$m]
      );
  }
  
  sub _is_leap_year {
      shift;
      my $year = shift;
  
      # According to Bjorn Tackmann, this line prevents an infinite loop
      # when running the tests under Qemu. I cannot reproduce this on
      # Ubuntu or with Strawberry Perl on Win2K.
      return 0
          if $year == DateTime::INFINITY() || $year == DateTime::NEG_INFINITY();
      return 0 if $year % 4;
      return 1 if $year % 100;
      return 0 if $year % 400;
  
      return 1;
  }
  
  sub _day_length { DateTime::LeapSecond::day_length( $_[1] ) }
  
  sub _accumulated_leap_seconds { DateTime::LeapSecond::leap_seconds( $_[1] ) }
  
  my @subs = qw(
      _time_as_seconds
      _rd2ymd
      _ymd2rd
      _seconds_as_components
      _end_of_last_month_day_of_year
      _is_leap_year
      _day_length
      _accumulated_leap_seconds
  );
  
  for my $sub (@subs) {
      ## no critic (TestingAndDebugging::ProhibitNoStrict)
      no strict 'refs';
      *{ 'DateTime::' . $sub } = __PACKAGE__->can($sub);
  }
  
  # This is down here so that _ymd2rd is available when it loads,
  # because it will load DateTime::LeapSecond, which needs
  # DateTime->_ymd2rd to be available when it is loading
  require DateTime::PPExtra;
  
  1;
DATETIME_PP

    $main::fatpacked{"DateTime/PPExtra.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_PPEXTRA';
  package DateTime::PPExtra;
  
  use strict;
  use warnings;
  
  our $VERSION = '1.51';
  
  use DateTime::LeapSecond;
  
  ## no critic (Subroutines::ProhibitUnusedPrivateSubroutines)
  sub _normalize_tai_seconds {
      return
          if
          grep { $_ == DateTime::INFINITY() || $_ == DateTime::NEG_INFINITY() }
          @_[ 1, 2 ];
  
      # This must be after checking for infinity, because it breaks in
      # presence of use integer !
      use integer;
  
      my $adj;
  
      if ( $_[2] < 0 ) {
          $adj = ( $_[2] - 86399 ) / 86400;
      }
      else {
          $adj = $_[2] / 86400;
      }
  
      $_[1] += $adj;
  
      $_[2] -= $adj * 86400;
  }
  
  sub _normalize_leap_seconds {
  
      # args: 0 => days, 1 => seconds
      my $delta_days;
  
      use integer;
  
      # rough adjust - can adjust many days
      if ( $_[2] < 0 ) {
          $delta_days = ( $_[2] - 86399 ) / 86400;
      }
      else {
          $delta_days = $_[2] / 86400;
      }
  
      my $new_day = $_[1] + $delta_days;
      my $delta_seconds
          = ( 86400 * $delta_days )
          + DateTime::LeapSecond::leap_seconds($new_day)
          - DateTime::LeapSecond::leap_seconds( $_[1] );
  
      $_[2] -= $delta_seconds;
      $_[1] = $new_day;
  
      # fine adjust - up to 1 day
      my $day_length = DateTime::LeapSecond::day_length($new_day);
      if ( $_[2] >= $day_length ) {
          $_[2] -= $day_length;
          $_[1]++;
      }
      elsif ( $_[2] < 0 ) {
          $day_length = DateTime::LeapSecond::day_length( $new_day - 1 );
          $_[2] += $day_length;
          $_[1]--;
      }
  }
  
  my @subs = qw(
      _normalize_tai_seconds
      _normalize_leap_seconds
  );
  
  for my $sub (@subs) {
      ## no critic (TestingAndDebugging::ProhibitNoStrict)
      no strict 'refs';
      *{ 'DateTime::' . $sub } = __PACKAGE__->can($sub);
  }
  
  1;
DATETIME_PPEXTRA

    $main::fatpacked{"DateTime/TimeZone.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE';
  package DateTime::TimeZone;
  
  use 5.008004;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use DateTime::TimeZone::Catalog;
  use DateTime::TimeZone::Floating;
  use DateTime::TimeZone::Local;
  use DateTime::TimeZone::OffsetOnly;
  use DateTime::TimeZone::OlsonDB::Change;
  use DateTime::TimeZone::UTC;
  use Module::Runtime qw( require_module );
  use Params::ValidationCompiler 0.13 qw( validation_for );
  use Specio::Library::Builtins;
  use Specio::Library::String;
  use Try::Tiny;
  
  ## no critic (ValuesAndExpressions::ProhibitConstantPragma)
  use constant INFINITY     => 100**1000;
  use constant NEG_INFINITY => -1 * ( 100**1000 );
  
  # the offsets for each span element
  use constant UTC_START   => 0;
  use constant UTC_END     => 1;
  use constant LOCAL_START => 2;
  use constant LOCAL_END   => 3;
  use constant OFFSET      => 4;
  use constant IS_DST      => 5;
  use constant SHORT_NAME  => 6;
  
  my %SpecialName = map { $_ => 1 }
      qw( EST MST HST CET EET MET WET EST5EDT CST6CDT MST7MDT PST8PDT );
  
  {
      my $validator = validation_for(
          name             => '_check_new_params',
          name_is_optional => 1,
          params           => {
              name => {
                  type => t('NonEmptyStr'),
              },
          },
      );
  
      sub new {
          shift;
          my %p = $validator->(@_);
  
          if ( exists $DateTime::TimeZone::Catalog::LINKS{ $p{name} } ) {
              $p{name} = $DateTime::TimeZone::Catalog::LINKS{ $p{name} };
          }
          elsif ( exists $DateTime::TimeZone::Catalog::LINKS{ uc $p{name} } ) {
              $p{name} = $DateTime::TimeZone::Catalog::LINKS{ uc $p{name} };
          }
  
          unless ( $p{name} =~ m{/}
              || $SpecialName{ $p{name} } ) {
              if ( $p{name} eq 'floating' ) {
                  return DateTime::TimeZone::Floating->instance;
              }
  
              if ( $p{name} eq 'local' ) {
                  return DateTime::TimeZone::Local->TimeZone();
              }
  
              if ( $p{name} eq 'UTC' || $p{name} eq 'Z' ) {
                  return DateTime::TimeZone::UTC->instance;
              }
  
              return DateTime::TimeZone::OffsetOnly->new( offset => $p{name} );
          }
  
          my $subclass = $p{name};
          $subclass =~ s{/}{::}g;
          $subclass =~ s/-(\d)/_Minus$1/;
          $subclass =~ s/\+/_Plus/;
          $subclass =~ s/-/_/g;
  
          my $real_class = "DateTime::TimeZone::$subclass";
  
          die "The timezone '$p{name}' is an invalid name.\n"
              unless $real_class =~ /^\w+(::\w+)*$/;
  
          unless ( $real_class->can('instance') ) {
              ($real_class)
                  = $real_class =~ m{\A([a-zA-Z0-9_]+(?:::[a-zA-Z0-9_]+)*)\z};
  
              my $e;
              try {
                  ## no critic (Variables::RequireInitializationForLocalVars)
                  local $SIG{__DIE__};
                  require_module($real_class);
              }
              catch {
                  $e = $_;
              };
  
              if ($e) {
                  my $regex = join '.', split /::/, $real_class;
                  $regex .= '\\.pm';
  
                  if ( $e =~ /^Can't locate $regex/i ) {
                      die
                          "The timezone '$p{name}' could not be loaded, or is an invalid name.\n";
                  }
                  else {
                      die $e;
                  }
              }
          }
  
          my $zone = $real_class->instance( name => $p{name}, is_olson => 1 );
  
          if ( $zone->is_olson() ) {
              my $object_version
                  = $zone->can('olson_version')
                  ? $zone->olson_version()
                  : 'unknown';
              my $catalog_version = DateTime::TimeZone::Catalog->OlsonVersion();
  
              if ( $object_version ne $catalog_version ) {
                  warn
                      "Loaded $real_class, which is from a different version ($object_version) of the Olson database than this installation of DateTime::TimeZone ($catalog_version).\n";
              }
          }
  
          return $zone;
      }
  }
  
  {
      my $validator = validation_for(
          name             => '_check_init_params',
          name_is_optional => 1,
          params           => {
              name => {
                  type => t('NonEmptyStr'),
              },
              spans => {
                  type => t('ArrayRef'),
              },
              is_olson => {
                  type    => t('Bool'),
                  default => 0,
              },
          },
      );
  
      ## no critic (Subroutines::ProhibitUnusedPrivateSubroutines)
      sub _init {
          my $class = shift;
          my %p     = $validator->(@_);
  
          my $self = bless {
              name     => $p{name},
              spans    => $p{spans},
              is_olson => $p{is_olson},
          }, $class;
  
          foreach my $k (qw( last_offset last_observance rules max_year )) {
              my $m = "_$k";
              $self->{$k} = $self->$m() if $self->can($m);
          }
  
          return $self;
      }
      ## use critic
  }
  
  sub is_olson { $_[0]->{is_olson} }
  
  sub is_dst_for_datetime {
      my $self = shift;
  
      my $span = $self->_span_for_datetime( 'utc', $_[0] );
  
      return $span->[IS_DST];
  }
  
  sub offset_for_datetime {
      my $self = shift;
  
      my $span = $self->_span_for_datetime( 'utc', $_[0] );
  
      return $span->[OFFSET];
  }
  
  sub offset_for_local_datetime {
      my $self = shift;
  
      my $span = $self->_span_for_datetime( 'local', $_[0] );
  
      return $span->[OFFSET];
  }
  
  sub short_name_for_datetime {
      my $self = shift;
  
      my $span = $self->_span_for_datetime( 'utc', $_[0] );
  
      return $span->[SHORT_NAME];
  }
  
  sub _span_for_datetime {
      my $self = shift;
      my $type = shift;
      my $dt   = shift;
  
      my $method = $type . '_rd_as_seconds';
  
      my $end = $type eq 'utc' ? UTC_END : LOCAL_END;
  
      my $span;
      my $seconds = $dt->$method();
      if ( $seconds < $self->max_span->[$end] ) {
          $span = $self->_spans_binary_search( $type, $seconds );
      }
      else {
          my $until_year = $dt->utc_year + 1;
          $span = $self->_generate_spans_until_match(
              $until_year, $seconds,
              $type
          );
      }
  
      # This means someone gave a local time that doesn't exist
      # (like during a transition into savings time)
      unless ( defined $span ) {
          my $err = 'Invalid local time for date';
          $err .= q{ } . $dt->iso8601 if $type eq 'utc';
          $err .= ' in time zone: ' . $self->name;
          $err .= "\n";
  
          die $err;
      }
  
      return $span;
  }
  
  sub _spans_binary_search {
      my $self = shift;
      my ( $type, $seconds ) = @_;
  
      my ( $start, $end ) = _keys_for_type($type);
  
      my $min = 0;
      my $max = scalar @{ $self->{spans} } + 1;
      my $i   = int( $max / 2 );
  
      # special case for when there are only 2 spans
      $i++ if $max % 2 && $max != 3;
  
      $i = 0 if @{ $self->{spans} } == 1;
  
      while (1) {
          my $current = $self->{spans}[$i];
  
          if ( $seconds < $current->[$start] ) {
              $max = $i;
              my $c = int( ( $i - $min ) / 2 );
              $c ||= 1;
  
              $i -= $c;
  
              return if $i < $min;
          }
          elsif ( $seconds >= $current->[$end] ) {
              $min = $i;
              my $c = int( ( $max - $i ) / 2 );
              $c ||= 1;
  
              $i += $c;
  
              return if $i >= $max;
          }
          else {
  
              # Special case for overlapping ranges because of DST and
              # other weirdness (like Alaska's change when bought from
              # Russia by the US).  Always prefer latest span.
              if ( $current->[IS_DST] && $type eq 'local' ) {
  
                  # Asia/Dhaka in 2009j goes into DST without any known
                  # end-of-DST date (wtf, Bangladesh).
                  return $current if $current->[UTC_END] == INFINITY;
  
                  my $next = $self->{spans}[ $i + 1 ];
  
                  # Sometimes we will get here and the span we're
                  # looking at is the last that's been generated so far.
                  # We need to try to generate one more or else we run
                  # out.
                  $next ||= $self->_generate_next_span;
  
                  die "No next span in $self->{max_year}" unless defined $next;
  
                  if (   ( !$next->[IS_DST] )
                      && $next->[$start] <= $seconds
                      && $seconds <= $next->[$end] ) {
                      return $next;
                  }
              }
  
              return $current;
          }
      }
  }
  
  sub _generate_next_span {
      my $self = shift;
  
      my $last_idx = $#{ $self->{spans} };
  
      my $max_span = $self->max_span;
  
      # Kind of a hack, but AFAIK there are no zones where it takes
      # _more_ than a year for a _future_ time zone change to occur, so
      # by looking two years out we can ensure that we will find at
      # least one more span.  Of course, I will no doubt be proved wrong
      # and this will cause errors.
      $self->_generate_spans_until_match(
          $self->{max_year} + 2,
          $max_span->[UTC_END] + ( 366 * 86400 ), 'utc'
      );
  
      return $self->{spans}[ $last_idx + 1 ];
  }
  
  sub _generate_spans_until_match {
      my $self                = shift;
      my $generate_until_year = shift;
      my $seconds             = shift;
      my $type                = shift;
  
      my @changes;
      my @rules = @{ $self->_rules };
      foreach my $year ( $self->{max_year} .. $generate_until_year ) {
          ## no critic (ControlStructures::ProhibitCStyleForLoops)
          for ( my $x = 0; $x < @rules; $x++ ) {
              my $last_offset_from_std;
  
              if ( @rules == 2 ) {
                  $last_offset_from_std
                      = $x
                      ? $rules[0]->offset_from_std
                      : $rules[1]->offset_from_std;
              }
              elsif ( @rules == 1 ) {
                  $last_offset_from_std = $rules[0]->offset_from_std;
              }
              else {
                  my $count = scalar @rules;
                  die
                      "Cannot generate future changes for zone with $count infinite rules\n";
              }
  
              my $rule = $rules[$x];
  
              my $next = $rule->utc_start_datetime_for_year(
                  $year,
                  $self->{last_offset}, $last_offset_from_std
              );
  
              # don't bother with changes we've seen already
              next if $next->utc_rd_as_seconds < $self->max_span->[UTC_END];
  
              push @changes,
                  DateTime::TimeZone::OlsonDB::Change->new(
                  type                 => 'rule',
                  utc_start_datetime   => $next,
                  local_start_datetime => $next + DateTime::Duration->new(
                      seconds => $self->{last_observance}->total_offset
                          + $rule->offset_from_std
                  ),
                  short_name => $self->{last_observance}
                      ->formatted_short_name( $rule->letter ),
                  observance => $self->{last_observance},
                  rule       => $rule,
                  );
          }
      }
  
      $self->{max_year} = $generate_until_year;
  
      my @sorted
          = sort { $a->utc_start_datetime <=> $b->utc_start_datetime } @changes;
  
      my ( $start, $end ) = _keys_for_type($type);
  
      my $match;
      ## no critic (ControlStructures::ProhibitCStyleForLoops)
      for ( my $x = 1; $x < @sorted; $x++ ) {
          my $span = DateTime::TimeZone::OlsonDB::Change::two_changes_as_span(
              @sorted[ $x - 1, $x ] );
  
          $span = _span_as_array($span);
  
          push @{ $self->{spans} }, $span;
  
          $match = $span
              if $seconds >= $span->[$start] && $seconds < $span->[$end];
      }
  
      return $match;
  }
  
  sub max_span { $_[0]->{spans}[-1] }
  
  sub _keys_for_type {
      $_[0] eq 'utc' ? ( UTC_START, UTC_END ) : ( LOCAL_START, LOCAL_END );
  }
  
  sub _span_as_array {
      [
          @{ $_[0] }{
              qw( utc_start utc_end local_start local_end offset is_dst short_name )
          }
      ];
  }
  
  sub is_floating {0}
  
  sub is_utc {0}
  
  sub has_dst_changes {0}
  
  sub name { $_[0]->{name} }
  sub category { ( split /\//, $_[0]->{name}, 2 )[0] }
  
  sub is_valid_name {
      my $class = shift;
      my $name  = shift;
  
      my $tz = try {
          ## no critic (Variables::RequireInitializationForLocalVars)
          local $SIG{__DIE__};
          $class->new( name => $name );
      };
  
      return $tz && $tz->isa('DateTime::TimeZone') ? 1 : 0;
  }
  
  sub STORABLE_freeze {
      my $self = shift;
  
      return $self->name;
  }
  
  sub STORABLE_thaw {
      my $self = shift;
      shift;
      my $serialized = shift;
  
      my $class = ref $self || $self;
  
      my $obj;
      if ( $class->isa(__PACKAGE__) ) {
          $obj = __PACKAGE__->new( name => $serialized );
      }
      else {
          $obj = $class->new( name => $serialized );
      }
  
      %$self = %$obj;
  
      return $self;
  }
  
  #
  # Functions
  #
  sub offset_as_seconds {
      my $offset = shift;
      $offset = shift if try {
          ## no critic (Variables::RequireInitializationForLocalVars)
          local $SIG{__DIE__};
          $offset->isa('DateTime::TimeZone');
      };
  
      return undef unless defined $offset;
  
      return 0 if $offset eq '0';
  
      my ( $sign, $hours, $minutes, $seconds );
      if ( $offset =~ /^([\+\-])?(\d\d?):(\d\d)(?::(\d\d))?$/ ) {
          ( $sign, $hours, $minutes, $seconds ) = ( $1, $2, $3, $4 );
      }
      elsif ( $offset =~ /^([\+\-])?(\d\d)(\d\d)(\d\d)?$/ ) {
          ( $sign, $hours, $minutes, $seconds ) = ( $1, $2, $3, $4 );
      }
      else {
          return undef;
      }
  
      $sign = '+' unless defined $sign;
      return undef unless $hours >= 0   && $hours <= 99;
      return undef unless $minutes >= 0 && $minutes <= 59;
      return undef
          unless !defined($seconds) || ( $seconds >= 0 && $seconds <= 59 );
  
      my $total = $hours * 3600 + $minutes * 60;
      $total += $seconds if $seconds;
      $total *= -1 if $sign eq '-';
  
      return $total;
  }
  
  sub offset_as_string {
      my $offset = shift;
      $offset = shift if try {
          ## no critic (Variables::RequireInitializationForLocalVars)
          local $SIG{__DIE__};
          $offset->isa('DateTime::TimeZone');
      };
  
      return undef unless defined $offset;
      return undef unless $offset >= -359999 && $offset <= 359999;
  
      my $sign = $offset < 0 ? '-' : '+';
  
      $offset = abs($offset);
  
      my $hours = int( $offset / 3600 );
      $offset %= 3600;
      my $mins = int( $offset / 60 );
      $offset %= 60;
      my $secs = int($offset);
  
      return (
          $secs
          ? sprintf( '%s%02d%02d%02d', $sign, $hours, $mins, $secs )
          : sprintf( '%s%02d%02d',     $sign, $hours, $mins )
      );
  }
  
  # These methods all operate on data contained in the DateTime/TimeZone/Catalog.pm file.
  
  sub all_names {
      return wantarray
          ? @DateTime::TimeZone::Catalog::ALL
          : [@DateTime::TimeZone::Catalog::ALL];
  }
  
  sub categories {
      return wantarray
          ? @DateTime::TimeZone::Catalog::CATEGORY_NAMES
          : [@DateTime::TimeZone::Catalog::CATEGORY_NAMES];
  }
  
  sub links {
      return wantarray
          ? %DateTime::TimeZone::Catalog::LINKS
          : {%DateTime::TimeZone::Catalog::LINKS};
  }
  
  sub names_in_category {
      shift if $_[0]->isa('DateTime::TimeZone');
      return unless exists $DateTime::TimeZone::Catalog::CATEGORIES{ $_[0] };
  
      return wantarray
          ? @{ $DateTime::TimeZone::Catalog::CATEGORIES{ $_[0] } }
          : $DateTime::TimeZone::Catalog::CATEGORIES{ $_[0] };
  }
  
  sub countries {
      wantarray
          ? ( sort keys %DateTime::TimeZone::Catalog::ZONES_BY_COUNTRY )
          : [ sort keys %DateTime::TimeZone::Catalog::ZONES_BY_COUNTRY ];
  }
  
  sub names_in_country {
      shift if $_[0]->isa('DateTime::TimeZone');
  
      return
          unless
          exists $DateTime::TimeZone::Catalog::ZONES_BY_COUNTRY{ lc $_[0] };
  
      return
          wantarray
          ? @{ $DateTime::TimeZone::Catalog::ZONES_BY_COUNTRY{ lc $_[0] } }
          : $DateTime::TimeZone::Catalog::ZONES_BY_COUNTRY{ lc $_[0] };
  }
  
  1;
  
  # ABSTRACT: Time zone object base class and factory
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  DateTime::TimeZone - Time zone object base class and factory
  
  =head1 VERSION
  
  version 2.36
  
  =head1 SYNOPSIS
  
    use DateTime;
    use DateTime::TimeZone;
  
    my $tz = DateTime::TimeZone->new( name => 'America/Chicago' );
  
    my $dt = DateTime->now();
    my $offset = $tz->offset_for_datetime($dt);
  
  =head1 DESCRIPTION
  
  This class is the base class for all time zone objects.  A time zone
  is represented internally as a set of observances, each of which
  describes the offset from GMT for a given time period.
  
  Note that without the L<DateTime> module, this module does not do
  much.  It's primary interface is through a L<DateTime> object, and
  most users will not need to directly use C<DateTime::TimeZone>
  methods.
  
  =head2 Special Case Platforms
  
  If you are on the Win32 platform, you will want to also install
  L<DateTime::TimeZone::Local::Win32>. This will enable you to specify a time
  zone of C<'local'> when creating a L<DateTime> object.
  
  If you are on HPUX, install L<DateTime::TimeZone::HPUX>. This provides support
  for HPUX style time zones like C<'MET-1METDST'>.
  
  =head1 USAGE
  
  This class has the following methods:
  
  =head2 DateTime::TimeZone->new( name => $tz_name )
  
  Given a valid time zone name, this method returns a new time zone
  blessed into the appropriate subclass.  Subclasses are named for the
  given time zone, so that the time zone "America/Chicago" is the
  DateTime::TimeZone::America::Chicago class.
  
  If the name given is a "link" name in the Olson database, the object
  created may have a different name.  For example, there is a link from
  the old "EST5EDT" name to "America/New_York".
  
  When loading a time zone from the Olson database, the constructor
  checks the version of the loaded class to make sure it matches the
  version of the current DateTime::TimeZone installation. If they do not
  match it will issue a warning. This is useful because time zone names
  may fall out of use, but you may have an old module file installed for
  that time zone.
  
  There are also several special values that can be given as names.
  
  If the "name" parameter is "floating", then a C<DateTime::TimeZone::Floating>
  object is returned.  A floating time zone does not have I<any> offset, and is
  always the same time.  This is useful for calendaring applications, which may
  need to specify that a given event happens at the same I<local> time,
  regardless of where it occurs. See L<RFC
  2445|https://www.ietf.org/rfc/rfc2445.txt> for more details.
  
  If the "name" parameter is "UTC", then a C<DateTime::TimeZone::UTC>
  object is returned.
  
  If the "name" is an offset string, it is converted to a number, and a
  C<DateTime::TimeZone::OffsetOnly> object is returned.
  
  =head3 The "local" time zone
  
  If the "name" parameter is "local", then the module attempts to
  determine the local time zone for the system.
  
  The method for finding the local zone varies by operating system. See
  the appropriate module for details of how we check for the local time
  zone.
  
  =over 4
  
  =item * L<DateTime::TimeZone::Local::Unix>
  
  =item * L<DateTime::TimeZone::Local::Android>
  
  =item * L<DateTime::TimeZone::Local::hpux>
  
  =item * L<DateTime::TimeZone::Local::Win32>
  
  =item * L<DateTime::TimeZone::Local::VMS>
  
  =back
  
  If a local time zone is not found, then an exception will be thrown. This
  exception will always stringify to something containing the text C<"Cannot
  determine local time zone">.
  
  If you are writing code for users to run on systems you do not control, you
  should try to account for the possibility that this exception may be
  thrown. Falling back to UTC might be a reasonable alternative.
  
  When writing tests for your modules that might be run on others' systems, you
  are strongly encouraged to either not use C<local> when creating L<DateTime>
  objects or to set C<$ENV{TZ}> to a known value in your test code. All of the
  per-OS classes check this environment variable.
  
  =head2 $tz->offset_for_datetime( $dt )
  
  Given a C<DateTime> object, this method returns the offset in seconds
  for the given datetime.  This takes into account historical time zone
  information, as well as Daylight Saving Time.  The offset is
  determined by looking at the object's UTC Rata Die days and seconds.
  
  =head2 $tz->offset_for_local_datetime( $dt )
  
  Given a C<DateTime> object, this method returns the offset in seconds
  for the given datetime.  Unlike the previous method, this method uses
  the local time's Rata Die days and seconds.  This should only be done
  when the corresponding UTC time is not yet known, because local times
  can be ambiguous due to Daylight Saving Time rules.
  
  =head2 $tz->is_dst_for_datetime( $dt )
  
  Given a C<DateTime> object, this method returns true if the DateTime is
  currently in Daylight Saving Time.
  
  =head2 $tz->name
  
  Returns the name of the time zone.
  
  =head2 $tz->short_name_for_datetime( $dt )
  
  Given a C<DateTime> object, this method returns the "short name" for
  the current observance and rule this datetime is in.  These are names
  like "EST", "GMT", etc.
  
  It is B<strongly> recommended that you do not rely on these names for
  anything other than display.  These names are not official, and many
  of them are simply the invention of the Olson database maintainers.
  Moreover, these names are not unique.  For example, there is an "EST"
  at both -0500 and +1000/+1100.
  
  =head2 $tz->is_floating
  
  Returns a boolean indicating whether or not this object represents a floating
  time zone, as defined by L<RFC 2445|https://www.ietf.org/rfc/rfc2445.txt>.
  
  =head2 $tz->is_utc
  
  Indicates whether or not this object represents the UTC (GMT) time
  zone.
  
  =head2 $tz->has_dst_changes
  
  Indicates whether or not this zone has I<ever> had a change to and
  from DST, either in the past or future.
  
  =head2 $tz->is_olson
  
  Returns true if the time zone is a named time zone from the Olson
  database.
  
  =head2 $tz->category
  
  Returns the part of the time zone name before the first slash.  For
  example, the "America/Chicago" time zone would return "America".
  
  =head2 DateTime::TimeZone->is_valid_name($name)
  
  Given a string, this method returns a boolean value indicating whether
  or not the string is a valid time zone name.  If you are using
  C<DateTime::TimeZone::Alias>, any aliases you've created will be valid.
  
  =head2 DateTime::TimeZone->all_names
  
  This returns a pre-sorted list of all the time zone names.  This list
  does not include link names.  In scalar context, it returns an array
  reference, while in list context it returns an array.
  
  =head2 DateTime::TimeZone->categories
  
  This returns a list of all time zone categories.  In scalar context,
  it returns an array reference, while in list context it returns an
  array.
  
  =head2 DateTime::TimeZone->links
  
  This returns a hash of all time zone links, where the keys are the
  old, deprecated names, and the values are the new names.  In scalar
  context, it returns a hash reference, while in list context it returns
  a hash.
  
  =head2 DateTime::TimeZone->names_in_category( $category )
  
  Given a valid category, this method returns a list of the names in
  that category, without the category portion.  So the list for the
  "America" category would include the strings "Chicago",
  "Kentucky/Monticello", and "New_York". In scalar context, it returns
  an array reference, while in list context it returns an array.
  
  =head2 DateTime::TimeZone->countries()
  
  Returns a sorted list of all the valid country codes (in lower-case)
  which can be passed to C<names_in_country()>. In scalar context, it
  returns an array reference, while in list context it returns an array.
  
  If you need to convert country codes to names or vice versa you can
  use C<Locale::Country> to do so.
  
  =head2 DateTime::TimeZone->names_in_country( $country_code )
  
  Given a two-letter ISO3166 country code, this method returns a list of
  time zones used in that country. The country code may be of any
  case. In scalar context, it returns an array reference, while in list
  context it returns an array.
  
  This list is returned in an order vaguely based on geography and
  population. In general, the least used zones come last, but there are not
  guarantees of a specific order from one release to the next. This order is
  probably the best option for presenting zones names to end users.
  
  =head2 DateTime::TimeZone->offset_as_seconds( $offset )
  
  Given an offset as a string, this returns the number of seconds
  represented by the offset as a positive or negative number.  Returns
  C<undef> if $offset is not in the range C<-99:59:59> to C<+99:59:59>.
  
  The offset is expected to match either
  C</^([\+\-])?(\d\d?):(\d\d)(?::(\d\d))?$/> or
  C</^([\+\-])?(\d\d)(\d\d)(\d\d)?$/>.  If it doesn't match either of
  these, C<undef> will be returned.
  
  This means that if you want to specify hours as a single digit, then
  each element of the offset must be separated by a colon (:).
  
  =head2 DateTime::TimeZone->offset_as_string( $offset )
  
  Given an offset as a number, this returns the offset as a string.
  Returns C<undef> if $offset is not in the range C<-359999> to C<359999>.
  
  =head2 Storable Hooks
  
  This module provides freeze and thaw hooks for C<Storable> so that the
  huge data structures for Olson time zones are not actually stored in
  the serialized structure.
  
  If you subclass C<DateTime::TimeZone>, you will inherit its hooks,
  which may not work for your module, so please test the interaction of
  your module with Storable.
  
  =head1 LOADING TIME ZONES IN A PRE-FORKING SYSTEM
  
  If you are running an application that does pre-forking (for example with
  Starman), then you should try to load all the time zones that you'll need in
  the parent process. Time zones are loaded on-demand, so loading them once in
  each child will waste memory that could otherwise be shared.
  
  =head1 CREDITS
  
  This module was inspired by Jesse Vincent's work on
  Date::ICal::Timezone, and written with much help from the
  datetime@perl.org list.
  
  =head1 SEE ALSO
  
  datetime@perl.org mailing list
  
  http://datetime.perl.org/
  
  The tools directory of the DateTime::TimeZone distribution includes
  two scripts that may be of interest to some people.  They are
  parse_olson and tests_from_zdump.  Please run them with the --help
  flag to see what they can be used for.
  
  =head1 SUPPORT
  
  Support for this module is provided via the datetime@perl.org email list. See
  http://datetime.perl.org/wiki/datetime/page/Mailing_List for details.
  
  Please submit bugs to the CPAN RT system at
  http://rt.cpan.org/NoAuth/ReportBug.html?Queue=datetime%3A%3Atimezone
  or via email at bug-datetime-timezone@rt.cpan.org.
  
  Bugs may be submitted at L<https://github.com/houseabsolute/DateTime-TimeZone/issues>.
  
  I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
  
  =head1 SOURCE
  
  The source code repository for DateTime-TimeZone can be found at L<https://github.com/houseabsolute/DateTime-TimeZone>.
  
  =head1 DONATIONS
  
  If you'd like to thank me for the work I've done on this module, please
  consider making a "donation" to me via PayPal. I spend a lot of free time
  creating free software, and would appreciate any support you'd care to offer.
  
  Please note that B<I am not suggesting that you must do this> in order for me
  to continue working on this particular software. I will continue to do so,
  inasmuch as I have in the past, for as long as it interests me.
  
  Similarly, a donation made in this way will probably not make me work on this
  software much more, unless I get so many donations that I can consider working
  on free software full time (let's all have a chuckle at that together).
  
  To donate, log into PayPal and send money to autarch@urth.org, or use the
  button at L<http://www.urth.org/~autarch/fs-donation.html>.
  
  =head1 AUTHOR
  
  Dave Rolsky <autarch@urth.org>
  
  =head1 CONTRIBUTORS
  
  =for stopwords Alexey Molchanov Alfie John Andrew Paprocki Bron Gondwana Daisuke Maki David Pinkowitz Iain Truskett Jakub Wilk James E Keenan Joshua Hoblitt Karen Etheridge karupanerura Mohammad S Anwar Olaf Alders Peter Rabbitson Tom Wyant
  
  =over 4
  
  =item *
  
  Alexey Molchanov <alexey.molchanov@gmail.com>
  
  =item *
  
  Alfie John <alfiej@fastmail.fm>
  
  =item *
  
  Andrew Paprocki <apaprocki@bloomberg.net>
  
  =item *
  
  Bron Gondwana <brong@fastmail.fm>
  
  =item *
  
  Daisuke Maki <dmaki@cpan.org>
  
  =item *
  
  David Pinkowitz <dave@pinkowitz.com>
  
  =item *
  
  Iain Truskett <deceased>
  
  =item *
  
  Jakub Wilk <jwilk@jwilk.net>
  
  =item *
  
  James E Keenan <jkeenan@cpan.org>
  
  =item *
  
  Joshua Hoblitt <jhoblitt@cpan.org>
  
  =item *
  
  Karen Etheridge <ether@cpan.org>
  
  =item *
  
  karupanerura <karupa@cpan.org>
  
  =item *
  
  Mohammad S Anwar <mohammad.anwar@yahoo.com>
  
  =item *
  
  Olaf Alders <olaf@wundersolutions.com>
  
  =item *
  
  Peter Rabbitson <ribasushi@cpan.org>
  
  =item *
  
  Tom Wyant <wyant@cpan.org>
  
  =back
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2019 by Dave Rolsky.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  The full text of the license can be found in the
  F<LICENSE> file included with this distribution.
  
  =cut
DATETIME_TIMEZONE

    $main::fatpacked{"DateTime/TimeZone/Africa/Abidjan.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AFRICA_ABIDJAN';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/africa.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Africa::Abidjan;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Africa::Abidjan::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60305300168, #      utc_end 1912-01-01 00:16:08 (Mon)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60305299200, #    local_end 1912-01-01 00:00:00 (Mon)
  -968,
  0,
  'LMT',
      ],
      [
  60305300168, #    utc_start 1912-01-01 00:16:08 (Mon)
  DateTime::TimeZone::INFINITY, #      utc_end
  60305300168, #  local_start 1912-01-01 00:16:08 (Mon)
  DateTime::TimeZone::INFINITY, #    local_end
  0,
  0,
  'GMT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AFRICA_ABIDJAN

    $main::fatpacked{"DateTime/TimeZone/Africa/Accra.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AFRICA_ACCRA';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/africa.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Africa::Accra;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Africa::Accra::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60494688052, #      utc_end 1918-01-01 00:00:52 (Tue)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60494688000, #    local_end 1918-01-01 00:00:00 (Tue)
  -52,
  0,
  'LMT',
      ],
      [
  60494688052, #    utc_start 1918-01-01 00:00:52 (Tue)
  60578841600, #      utc_end 1920-09-01 00:00:00 (Wed)
  60494688052, #  local_start 1918-01-01 00:00:52 (Tue)
  60578841600, #    local_end 1920-09-01 00:00:00 (Wed)
  0,
  0,
  'GMT',
      ],
      [
  60578841600, #    utc_start 1920-09-01 00:00:00 (Wed)
  60589294800, #      utc_end 1920-12-30 23:40:00 (Thu)
  60578842800, #  local_start 1920-09-01 00:20:00 (Wed)
  60589296000, #    local_end 1920-12-31 00:00:00 (Fri)
  1200,
  1,
  '+0020',
      ],
      [
  60589294800, #    utc_start 1920-12-30 23:40:00 (Thu)
  60610377600, #      utc_end 1921-09-01 00:00:00 (Thu)
  60589294800, #  local_start 1920-12-30 23:40:00 (Thu)
  60610377600, #    local_end 1921-09-01 00:00:00 (Thu)
  0,
  0,
  'GMT',
      ],
      [
  60610377600, #    utc_start 1921-09-01 00:00:00 (Thu)
  60620830800, #      utc_end 1921-12-30 23:40:00 (Fri)
  60610378800, #  local_start 1921-09-01 00:20:00 (Thu)
  60620832000, #    local_end 1921-12-31 00:00:00 (Sat)
  1200,
  1,
  '+0020',
      ],
      [
  60620830800, #    utc_start 1921-12-30 23:40:00 (Fri)
  60641913600, #      utc_end 1922-09-01 00:00:00 (Fri)
  60620830800, #  local_start 1921-12-30 23:40:00 (Fri)
  60641913600, #    local_end 1922-09-01 00:00:00 (Fri)
  0,
  0,
  'GMT',
      ],
      [
  60641913600, #    utc_start 1922-09-01 00:00:00 (Fri)
  60652366800, #      utc_end 1922-12-30 23:40:00 (Sat)
  60641914800, #  local_start 1922-09-01 00:20:00 (Fri)
  60652368000, #    local_end 1922-12-31 00:00:00 (Sun)
  1200,
  1,
  '+0020',
      ],
      [
  60652366800, #    utc_start 1922-12-30 23:40:00 (Sat)
  60673449600, #      utc_end 1923-09-01 00:00:00 (Sat)
  60652366800, #  local_start 1922-12-30 23:40:00 (Sat)
  60673449600, #    local_end 1923-09-01 00:00:00 (Sat)
  0,
  0,
  'GMT',
      ],
      [
  60673449600, #    utc_start 1923-09-01 00:00:00 (Sat)
  60683902800, #      utc_end 1923-12-30 23:40:00 (Sun)
  60673450800, #  local_start 1923-09-01 00:20:00 (Sat)
  60683904000, #    local_end 1923-12-31 00:00:00 (Mon)
  1200,
  1,
  '+0020',
      ],
      [
  60683902800, #    utc_start 1923-12-30 23:40:00 (Sun)
  60705072000, #      utc_end 1924-09-01 00:00:00 (Mon)
  60683902800, #  local_start 1923-12-30 23:40:00 (Sun)
  60705072000, #    local_end 1924-09-01 00:00:00 (Mon)
  0,
  0,
  'GMT',
      ],
      [
  60705072000, #    utc_start 1924-09-01 00:00:00 (Mon)
  60715525200, #      utc_end 1924-12-30 23:40:00 (Tue)
  60705073200, #  local_start 1924-09-01 00:20:00 (Mon)
  60715526400, #    local_end 1924-12-31 00:00:00 (Wed)
  1200,
  1,
  '+0020',
      ],
      [
  60715525200, #    utc_start 1924-12-30 23:40:00 (Tue)
  60736608000, #      utc_end 1925-09-01 00:00:00 (Tue)
  60715525200, #  local_start 1924-12-30 23:40:00 (Tue)
  60736608000, #    local_end 1925-09-01 00:00:00 (Tue)
  0,
  0,
  'GMT',
      ],
      [
  60736608000, #    utc_start 1925-09-01 00:00:00 (Tue)
  60747061200, #      utc_end 1925-12-30 23:40:00 (Wed)
  60736609200, #  local_start 1925-09-01 00:20:00 (Tue)
  60747062400, #    local_end 1925-12-31 00:00:00 (Thu)
  1200,
  1,
  '+0020',
      ],
      [
  60747061200, #    utc_start 1925-12-30 23:40:00 (Wed)
  60768144000, #      utc_end 1926-09-01 00:00:00 (Wed)
  60747061200, #  local_start 1925-12-30 23:40:00 (Wed)
  60768144000, #    local_end 1926-09-01 00:00:00 (Wed)
  0,
  0,
  'GMT',
      ],
      [
  60768144000, #    utc_start 1926-09-01 00:00:00 (Wed)
  60778597200, #      utc_end 1926-12-30 23:40:00 (Thu)
  60768145200, #  local_start 1926-09-01 00:20:00 (Wed)
  60778598400, #    local_end 1926-12-31 00:00:00 (Fri)
  1200,
  1,
  '+0020',
      ],
      [
  60778597200, #    utc_start 1926-12-30 23:40:00 (Thu)
  60799680000, #      utc_end 1927-09-01 00:00:00 (Thu)
  60778597200, #  local_start 1926-12-30 23:40:00 (Thu)
  60799680000, #    local_end 1927-09-01 00:00:00 (Thu)
  0,
  0,
  'GMT',
      ],
      [
  60799680000, #    utc_start 1927-09-01 00:00:00 (Thu)
  60810133200, #      utc_end 1927-12-30 23:40:00 (Fri)
  60799681200, #  local_start 1927-09-01 00:20:00 (Thu)
  60810134400, #    local_end 1927-12-31 00:00:00 (Sat)
  1200,
  1,
  '+0020',
      ],
      [
  60810133200, #    utc_start 1927-12-30 23:40:00 (Fri)
  60831302400, #      utc_end 1928-09-01 00:00:00 (Sat)
  60810133200, #  local_start 1927-12-30 23:40:00 (Fri)
  60831302400, #    local_end 1928-09-01 00:00:00 (Sat)
  0,
  0,
  'GMT',
      ],
      [
  60831302400, #    utc_start 1928-09-01 00:00:00 (Sat)
  60841755600, #      utc_end 1928-12-30 23:40:00 (Sun)
  60831303600, #  local_start 1928-09-01 00:20:00 (Sat)
  60841756800, #    local_end 1928-12-31 00:00:00 (Mon)
  1200,
  1,
  '+0020',
      ],
      [
  60841755600, #    utc_start 1928-12-30 23:40:00 (Sun)
  60862838400, #      utc_end 1929-09-01 00:00:00 (Sun)
  60841755600, #  local_start 1928-12-30 23:40:00 (Sun)
  60862838400, #    local_end 1929-09-01 00:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  60862838400, #    utc_start 1929-09-01 00:00:00 (Sun)
  60873291600, #      utc_end 1929-12-30 23:40:00 (Mon)
  60862839600, #  local_start 1929-09-01 00:20:00 (Sun)
  60873292800, #    local_end 1929-12-31 00:00:00 (Tue)
  1200,
  1,
  '+0020',
      ],
      [
  60873291600, #    utc_start 1929-12-30 23:40:00 (Mon)
  60894374400, #      utc_end 1930-09-01 00:00:00 (Mon)
  60873291600, #  local_start 1929-12-30 23:40:00 (Mon)
  60894374400, #    local_end 1930-09-01 00:00:00 (Mon)
  0,
  0,
  'GMT',
      ],
      [
  60894374400, #    utc_start 1930-09-01 00:00:00 (Mon)
  60904827600, #      utc_end 1930-12-30 23:40:00 (Tue)
  60894375600, #  local_start 1930-09-01 00:20:00 (Mon)
  60904828800, #    local_end 1930-12-31 00:00:00 (Wed)
  1200,
  1,
  '+0020',
      ],
      [
  60904827600, #    utc_start 1930-12-30 23:40:00 (Tue)
  60925910400, #      utc_end 1931-09-01 00:00:00 (Tue)
  60904827600, #  local_start 1930-12-30 23:40:00 (Tue)
  60925910400, #    local_end 1931-09-01 00:00:00 (Tue)
  0,
  0,
  'GMT',
      ],
      [
  60925910400, #    utc_start 1931-09-01 00:00:00 (Tue)
  60936363600, #      utc_end 1931-12-30 23:40:00 (Wed)
  60925911600, #  local_start 1931-09-01 00:20:00 (Tue)
  60936364800, #    local_end 1931-12-31 00:00:00 (Thu)
  1200,
  1,
  '+0020',
      ],
      [
  60936363600, #    utc_start 1931-12-30 23:40:00 (Wed)
  60957532800, #      utc_end 1932-09-01 00:00:00 (Thu)
  60936363600, #  local_start 1931-12-30 23:40:00 (Wed)
  60957532800, #    local_end 1932-09-01 00:00:00 (Thu)
  0,
  0,
  'GMT',
      ],
      [
  60957532800, #    utc_start 1932-09-01 00:00:00 (Thu)
  60967986000, #      utc_end 1932-12-30 23:40:00 (Fri)
  60957534000, #  local_start 1932-09-01 00:20:00 (Thu)
  60967987200, #    local_end 1932-12-31 00:00:00 (Sat)
  1200,
  1,
  '+0020',
      ],
      [
  60967986000, #    utc_start 1932-12-30 23:40:00 (Fri)
  60989068800, #      utc_end 1933-09-01 00:00:00 (Fri)
  60967986000, #  local_start 1932-12-30 23:40:00 (Fri)
  60989068800, #    local_end 1933-09-01 00:00:00 (Fri)
  0,
  0,
  'GMT',
      ],
      [
  60989068800, #    utc_start 1933-09-01 00:00:00 (Fri)
  60999522000, #      utc_end 1933-12-30 23:40:00 (Sat)
  60989070000, #  local_start 1933-09-01 00:20:00 (Fri)
  60999523200, #    local_end 1933-12-31 00:00:00 (Sun)
  1200,
  1,
  '+0020',
      ],
      [
  60999522000, #    utc_start 1933-12-30 23:40:00 (Sat)
  61020604800, #      utc_end 1934-09-01 00:00:00 (Sat)
  60999522000, #  local_start 1933-12-30 23:40:00 (Sat)
  61020604800, #    local_end 1934-09-01 00:00:00 (Sat)
  0,
  0,
  'GMT',
      ],
      [
  61020604800, #    utc_start 1934-09-01 00:00:00 (Sat)
  61031058000, #      utc_end 1934-12-30 23:40:00 (Sun)
  61020606000, #  local_start 1934-09-01 00:20:00 (Sat)
  61031059200, #    local_end 1934-12-31 00:00:00 (Mon)
  1200,
  1,
  '+0020',
      ],
      [
  61031058000, #    utc_start 1934-12-30 23:40:00 (Sun)
  61052140800, #      utc_end 1935-09-01 00:00:00 (Sun)
  61031058000, #  local_start 1934-12-30 23:40:00 (Sun)
  61052140800, #    local_end 1935-09-01 00:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61052140800, #    utc_start 1935-09-01 00:00:00 (Sun)
  61062594000, #      utc_end 1935-12-30 23:40:00 (Mon)
  61052142000, #  local_start 1935-09-01 00:20:00 (Sun)
  61062595200, #    local_end 1935-12-31 00:00:00 (Tue)
  1200,
  1,
  '+0020',
      ],
      [
  61062594000, #    utc_start 1935-12-30 23:40:00 (Mon)
  61083763200, #      utc_end 1936-09-01 00:00:00 (Tue)
  61062594000, #  local_start 1935-12-30 23:40:00 (Mon)
  61083763200, #    local_end 1936-09-01 00:00:00 (Tue)
  0,
  0,
  'GMT',
      ],
      [
  61083763200, #    utc_start 1936-09-01 00:00:00 (Tue)
  61094216400, #      utc_end 1936-12-30 23:40:00 (Wed)
  61083764400, #  local_start 1936-09-01 00:20:00 (Tue)
  61094217600, #    local_end 1936-12-31 00:00:00 (Thu)
  1200,
  1,
  '+0020',
      ],
      [
  61094216400, #    utc_start 1936-12-30 23:40:00 (Wed)
  61115299200, #      utc_end 1937-09-01 00:00:00 (Wed)
  61094216400, #  local_start 1936-12-30 23:40:00 (Wed)
  61115299200, #    local_end 1937-09-01 00:00:00 (Wed)
  0,
  0,
  'GMT',
      ],
      [
  61115299200, #    utc_start 1937-09-01 00:00:00 (Wed)
  61125752400, #      utc_end 1937-12-30 23:40:00 (Thu)
  61115300400, #  local_start 1937-09-01 00:20:00 (Wed)
  61125753600, #    local_end 1937-12-31 00:00:00 (Fri)
  1200,
  1,
  '+0020',
      ],
      [
  61125752400, #    utc_start 1937-12-30 23:40:00 (Thu)
  61146835200, #      utc_end 1938-09-01 00:00:00 (Thu)
  61125752400, #  local_start 1937-12-30 23:40:00 (Thu)
  61146835200, #    local_end 1938-09-01 00:00:00 (Thu)
  0,
  0,
  'GMT',
      ],
      [
  61146835200, #    utc_start 1938-09-01 00:00:00 (Thu)
  61157288400, #      utc_end 1938-12-30 23:40:00 (Fri)
  61146836400, #  local_start 1938-09-01 00:20:00 (Thu)
  61157289600, #    local_end 1938-12-31 00:00:00 (Sat)
  1200,
  1,
  '+0020',
      ],
      [
  61157288400, #    utc_start 1938-12-30 23:40:00 (Fri)
  61178371200, #      utc_end 1939-09-01 00:00:00 (Fri)
  61157288400, #  local_start 1938-12-30 23:40:00 (Fri)
  61178371200, #    local_end 1939-09-01 00:00:00 (Fri)
  0,
  0,
  'GMT',
      ],
      [
  61178371200, #    utc_start 1939-09-01 00:00:00 (Fri)
  61188824400, #      utc_end 1939-12-30 23:40:00 (Sat)
  61178372400, #  local_start 1939-09-01 00:20:00 (Fri)
  61188825600, #    local_end 1939-12-31 00:00:00 (Sun)
  1200,
  1,
  '+0020',
      ],
      [
  61188824400, #    utc_start 1939-12-30 23:40:00 (Sat)
  61209993600, #      utc_end 1940-09-01 00:00:00 (Sun)
  61188824400, #  local_start 1939-12-30 23:40:00 (Sat)
  61209993600, #    local_end 1940-09-01 00:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61209993600, #    utc_start 1940-09-01 00:00:00 (Sun)
  61220446800, #      utc_end 1940-12-30 23:40:00 (Mon)
  61209994800, #  local_start 1940-09-01 00:20:00 (Sun)
  61220448000, #    local_end 1940-12-31 00:00:00 (Tue)
  1200,
  1,
  '+0020',
      ],
      [
  61220446800, #    utc_start 1940-12-30 23:40:00 (Mon)
  61241529600, #      utc_end 1941-09-01 00:00:00 (Mon)
  61220446800, #  local_start 1940-12-30 23:40:00 (Mon)
  61241529600, #    local_end 1941-09-01 00:00:00 (Mon)
  0,
  0,
  'GMT',
      ],
      [
  61241529600, #    utc_start 1941-09-01 00:00:00 (Mon)
  61251982800, #      utc_end 1941-12-30 23:40:00 (Tue)
  61241530800, #  local_start 1941-09-01 00:20:00 (Mon)
  61251984000, #    local_end 1941-12-31 00:00:00 (Wed)
  1200,
  1,
  '+0020',
      ],
      [
  61251982800, #    utc_start 1941-12-30 23:40:00 (Tue)
  61273065600, #      utc_end 1942-09-01 00:00:00 (Tue)
  61251982800, #  local_start 1941-12-30 23:40:00 (Tue)
  61273065600, #    local_end 1942-09-01 00:00:00 (Tue)
  0,
  0,
  'GMT',
      ],
      [
  61273065600, #    utc_start 1942-09-01 00:00:00 (Tue)
  61283518800, #      utc_end 1942-12-30 23:40:00 (Wed)
  61273066800, #  local_start 1942-09-01 00:20:00 (Tue)
  61283520000, #    local_end 1942-12-31 00:00:00 (Thu)
  1200,
  1,
  '+0020',
      ],
      [
  61283518800, #    utc_start 1942-12-30 23:40:00 (Wed)
  DateTime::TimeZone::INFINITY, #      utc_end
  61283518800, #  local_start 1942-12-30 23:40:00 (Wed)
  DateTime::TimeZone::INFINITY, #    local_end
  0,
  0,
  'GMT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {23}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AFRICA_ACCRA

    $main::fatpacked{"DateTime/TimeZone/Africa/Algiers.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AFRICA_ALGIERS';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/africa.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Africa::Algiers;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Africa::Algiers::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59649004128, #      utc_end 1891-03-14 23:48:48 (Sat)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59649004860, #    local_end 1891-03-15 00:01:00 (Sun)
  732,
  0,
  'LMT',
      ],
      [
  59649004128, #    utc_start 1891-03-14 23:48:48 (Sat)
  60279724239, #      utc_end 1911-03-10 23:50:39 (Fri)
  59649004689, #  local_start 1891-03-14 23:58:09 (Sat)
  60279724800, #    local_end 1911-03-11 00:00:00 (Sat)
  561,
  0,
  'PMT',
      ],
      [
  60279724239, #    utc_start 1911-03-10 23:50:39 (Fri)
  60445868400, #      utc_end 1916-06-14 23:00:00 (Wed)
  60279724239, #  local_start 1911-03-10 23:50:39 (Fri)
  60445868400, #    local_end 1916-06-14 23:00:00 (Wed)
  0,
  0,
  'WET',
      ],
      [
  60445868400, #    utc_start 1916-06-14 23:00:00 (Wed)
  60455286000, #      utc_end 1916-10-01 23:00:00 (Sun)
  60445872000, #  local_start 1916-06-15 00:00:00 (Thu)
  60455289600, #    local_end 1916-10-02 00:00:00 (Mon)
  3600,
  1,
  'WEST',
      ],
      [
  60455286000, #    utc_start 1916-10-01 23:00:00 (Sun)
  60470319600, #      utc_end 1917-03-24 23:00:00 (Sat)
  60455286000, #  local_start 1916-10-01 23:00:00 (Sun)
  60470319600, #    local_end 1917-03-24 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  60470319600, #    utc_start 1917-03-24 23:00:00 (Sat)
  60487340400, #      utc_end 1917-10-07 23:00:00 (Sun)
  60470323200, #  local_start 1917-03-25 00:00:00 (Sun)
  60487344000, #    local_end 1917-10-08 00:00:00 (Mon)
  3600,
  1,
  'WEST',
      ],
      [
  60487340400, #    utc_start 1917-10-07 23:00:00 (Sun)
  60500559600, #      utc_end 1918-03-09 23:00:00 (Sat)
  60487340400, #  local_start 1917-10-07 23:00:00 (Sun)
  60500559600, #    local_end 1918-03-09 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  60500559600, #    utc_start 1918-03-09 23:00:00 (Sat)
  60518790000, #      utc_end 1918-10-06 23:00:00 (Sun)
  60500563200, #  local_start 1918-03-10 00:00:00 (Sun)
  60518793600, #    local_end 1918-10-07 00:00:00 (Mon)
  3600,
  1,
  'WEST',
      ],
      [
  60518790000, #    utc_start 1918-10-06 23:00:00 (Sun)
  60531404400, #      utc_end 1919-03-01 23:00:00 (Sat)
  60518790000, #  local_start 1918-10-06 23:00:00 (Sun)
  60531404400, #    local_end 1919-03-01 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  60531404400, #    utc_start 1919-03-01 23:00:00 (Sat)
  60550239600, #      utc_end 1919-10-05 23:00:00 (Sun)
  60531408000, #  local_start 1919-03-02 00:00:00 (Sun)
  60550243200, #    local_end 1919-10-06 00:00:00 (Mon)
  3600,
  1,
  'WEST',
      ],
      [
  60550239600, #    utc_start 1919-10-05 23:00:00 (Sun)
  60561644400, #      utc_end 1920-02-14 23:00:00 (Sat)
  60550239600, #  local_start 1919-10-05 23:00:00 (Sun)
  60561644400, #    local_end 1920-02-14 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  60561644400, #    utc_start 1920-02-14 23:00:00 (Sat)
  60583417200, #      utc_end 1920-10-23 23:00:00 (Sat)
  60561648000, #  local_start 1920-02-15 00:00:00 (Sun)
  60583420800, #    local_end 1920-10-24 00:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60583417200, #    utc_start 1920-10-23 23:00:00 (Sat)
  60595686000, #      utc_end 1921-03-14 23:00:00 (Mon)
  60583417200, #  local_start 1920-10-23 23:00:00 (Sat)
  60595686000, #    local_end 1921-03-14 23:00:00 (Mon)
  0,
  0,
  'WET',
      ],
      [
  60595686000, #    utc_start 1921-03-14 23:00:00 (Mon)
  60604239600, #      utc_end 1921-06-21 23:00:00 (Tue)
  60595689600, #  local_start 1921-03-15 00:00:00 (Tue)
  60604243200, #    local_end 1921-06-22 00:00:00 (Wed)
  3600,
  1,
  'WEST',
      ],
      [
  60604239600, #    utc_start 1921-06-21 23:00:00 (Tue)
  61179318000, #      utc_end 1939-09-11 23:00:00 (Mon)
  60604239600, #  local_start 1921-06-21 23:00:00 (Tue)
  61179318000, #    local_end 1939-09-11 23:00:00 (Mon)
  0,
  0,
  'WET',
      ],
      [
  61179318000, #    utc_start 1939-09-11 23:00:00 (Mon)
  61185196800, #      utc_end 1939-11-19 00:00:00 (Sun)
  61179321600, #  local_start 1939-09-12 00:00:00 (Tue)
  61185200400, #    local_end 1939-11-19 01:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  61185196800, #    utc_start 1939-11-19 00:00:00 (Sun)
  61193671200, #      utc_end 1940-02-25 02:00:00 (Sun)
  61185196800, #  local_start 1939-11-19 00:00:00 (Sun)
  61193671200, #    local_end 1940-02-25 02:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  61193671200, #    utc_start 1940-02-25 02:00:00 (Sun)
  61323181200, #      utc_end 1944-04-03 01:00:00 (Mon)
  61193674800, #  local_start 1940-02-25 03:00:00 (Sun)
  61323184800, #    local_end 1944-04-03 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61323181200, #    utc_start 1944-04-03 01:00:00 (Mon)
  61339420800, #      utc_end 1944-10-08 00:00:00 (Sun)
  61323188400, #  local_start 1944-04-03 03:00:00 (Mon)
  61339428000, #    local_end 1944-10-08 02:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  61339420800, #    utc_start 1944-10-08 00:00:00 (Sun)
  61354630800, #      utc_end 1945-04-02 01:00:00 (Mon)
  61339424400, #  local_start 1944-10-08 01:00:00 (Sun)
  61354634400, #    local_end 1945-04-02 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61354630800, #    utc_start 1945-04-02 01:00:00 (Mon)
  61369052400, #      utc_end 1945-09-15 23:00:00 (Sat)
  61354638000, #  local_start 1945-04-02 03:00:00 (Mon)
  61369059600, #    local_end 1945-09-16 01:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  61369052400, #    utc_start 1945-09-15 23:00:00 (Sat)
  61402402800, #      utc_end 1946-10-06 23:00:00 (Sun)
  61369056000, #  local_start 1945-09-16 00:00:00 (Sun)
  61402406400, #    local_end 1946-10-07 00:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61402402800, #    utc_start 1946-10-06 23:00:00 (Sun)
  61696252800, #      utc_end 1956-01-29 00:00:00 (Sun)
  61402402800, #  local_start 1946-10-06 23:00:00 (Sun)
  61696252800, #    local_end 1956-01-29 00:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  61696252800, #    utc_start 1956-01-29 00:00:00 (Sun)
  61923654000, #      utc_end 1963-04-13 23:00:00 (Sat)
  61696256400, #  local_start 1956-01-29 01:00:00 (Sun)
  61923657600, #    local_end 1963-04-14 00:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  61923654000, #    utc_start 1963-04-13 23:00:00 (Sat)
  62177151600, #      utc_end 1971-04-25 23:00:00 (Sun)
  61923654000, #  local_start 1963-04-13 23:00:00 (Sat)
  62177151600, #    local_end 1971-04-25 23:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62177151600, #    utc_start 1971-04-25 23:00:00 (Sun)
  62190457200, #      utc_end 1971-09-26 23:00:00 (Sun)
  62177155200, #  local_start 1971-04-26 00:00:00 (Mon)
  62190460800, #    local_end 1971-09-27 00:00:00 (Mon)
  3600,
  1,
  'WEST',
      ],
      [
  62190457200, #    utc_start 1971-09-26 23:00:00 (Sun)
  62367408000, #      utc_end 1977-05-06 00:00:00 (Fri)
  62190457200, #  local_start 1971-09-26 23:00:00 (Sun)
  62367408000, #    local_end 1977-05-06 00:00:00 (Fri)
  0,
  0,
  'WET',
      ],
      [
  62367408000, #    utc_start 1977-05-06 00:00:00 (Fri)
  62381919600, #      utc_end 1977-10-20 23:00:00 (Thu)
  62367411600, #  local_start 1977-05-06 01:00:00 (Fri)
  62381923200, #    local_end 1977-10-21 00:00:00 (Fri)
  3600,
  1,
  'WEST',
      ],
      [
  62381919600, #    utc_start 1977-10-20 23:00:00 (Thu)
  62395228800, #      utc_end 1978-03-24 00:00:00 (Fri)
  62381923200, #  local_start 1977-10-21 00:00:00 (Fri)
  62395232400, #    local_end 1978-03-24 01:00:00 (Fri)
  3600,
  0,
  'CET',
      ],
      [
  62395228800, #    utc_start 1978-03-24 00:00:00 (Fri)
  62410957200, #      utc_end 1978-09-22 01:00:00 (Fri)
  62395236000, #  local_start 1978-03-24 02:00:00 (Fri)
  62410964400, #    local_end 1978-09-22 03:00:00 (Fri)
  7200,
  1,
  'CEST',
      ],
      [
  62410957200, #    utc_start 1978-09-22 01:00:00 (Fri)
  62445423600, #      utc_end 1979-10-25 23:00:00 (Thu)
  62410960800, #  local_start 1978-09-22 02:00:00 (Fri)
  62445427200, #    local_end 1979-10-26 00:00:00 (Fri)
  3600,
  0,
  'CET',
      ],
      [
  62445423600, #    utc_start 1979-10-25 23:00:00 (Thu)
  62461152000, #      utc_end 1980-04-25 00:00:00 (Fri)
  62445423600, #  local_start 1979-10-25 23:00:00 (Thu)
  62461152000, #    local_end 1980-04-25 00:00:00 (Fri)
  0,
  0,
  'WET',
      ],
      [
  62461152000, #    utc_start 1980-04-25 00:00:00 (Fri)
  62477485200, #      utc_end 1980-10-31 01:00:00 (Fri)
  62461155600, #  local_start 1980-04-25 01:00:00 (Fri)
  62477488800, #    local_end 1980-10-31 02:00:00 (Fri)
  3600,
  1,
  'WEST',
      ],
      [
  62477485200, #    utc_start 1980-10-31 01:00:00 (Fri)
  62493206400, #      utc_end 1981-05-01 00:00:00 (Fri)
  62477485200, #  local_start 1980-10-31 01:00:00 (Fri)
  62493206400, #    local_end 1981-05-01 00:00:00 (Fri)
  0,
  0,
  'WET',
      ],
      [
  62493206400, #    utc_start 1981-05-01 00:00:00 (Fri)
  DateTime::TimeZone::INFINITY, #      utc_end
  62493210000, #  local_start 1981-05-01 01:00:00 (Fri)
  DateTime::TimeZone::INFINITY, #    local_end
  3600,
  0,
  'CET',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {13}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AFRICA_ALGIERS

    $main::fatpacked{"DateTime/TimeZone/Africa/Bissau.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AFRICA_BISSAU';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/africa.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Africa::Bissau;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Africa::Bissau::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60305302800, #      utc_end 1912-01-01 01:00:00 (Mon)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60305299060, #    local_end 1911-12-31 23:57:40 (Sun)
  -3740,
  0,
  'LMT',
      ],
      [
  60305302800, #    utc_start 1912-01-01 01:00:00 (Mon)
  62293453200, #      utc_end 1975-01-01 01:00:00 (Wed)
  60305299200, #  local_start 1912-01-01 00:00:00 (Mon)
  62293449600, #    local_end 1975-01-01 00:00:00 (Wed)
  -3600,
  0,
  '-01',
      ],
      [
  62293453200, #    utc_start 1975-01-01 01:00:00 (Wed)
  DateTime::TimeZone::INFINITY, #      utc_end
  62293453200, #  local_start 1975-01-01 01:00:00 (Wed)
  DateTime::TimeZone::INFINITY, #    local_end
  0,
  0,
  'GMT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AFRICA_BISSAU

    $main::fatpacked{"DateTime/TimeZone/Africa/Cairo.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AFRICA_CAIRO';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/africa.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Africa::Cairo;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Africa::Cairo::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59950274091, #      utc_end 1900-09-30 21:54:51 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59950281600, #    local_end 1900-10-01 00:00:00 (Mon)
  7509,
  0,
  'LMT',
      ],
      [
  59950274091, #    utc_start 1900-09-30 21:54:51 (Sun)
  61205839200, #      utc_end 1940-07-14 22:00:00 (Sun)
  59950281291, #  local_start 1900-09-30 23:54:51 (Sun)
  61205846400, #    local_end 1940-07-15 00:00:00 (Mon)
  7200,
  0,
  'EET',
      ],
      [
  61205839200, #    utc_start 1940-07-14 22:00:00 (Sun)
  61212574800, #      utc_end 1940-09-30 21:00:00 (Mon)
  61205850000, #  local_start 1940-07-15 01:00:00 (Mon)
  61212585600, #    local_end 1940-10-01 00:00:00 (Tue)
  10800,
  1,
  'EEST',
      ],
      [
  61212574800, #    utc_start 1940-09-30 21:00:00 (Mon)
  61229512800, #      utc_end 1941-04-14 22:00:00 (Mon)
  61212582000, #  local_start 1940-09-30 23:00:00 (Mon)
  61229520000, #    local_end 1941-04-15 00:00:00 (Tue)
  7200,
  0,
  'EET',
      ],
      [
  61229512800, #    utc_start 1941-04-14 22:00:00 (Mon)
  61242814800, #      utc_end 1941-09-15 21:00:00 (Mon)
  61229523600, #  local_start 1941-04-15 01:00:00 (Tue)
  61242825600, #    local_end 1941-09-16 00:00:00 (Tue)
  10800,
  1,
  'EEST',
      ],
      [
  61242814800, #    utc_start 1941-09-15 21:00:00 (Mon)
  61259839200, #      utc_end 1942-03-31 22:00:00 (Tue)
  61242822000, #  local_start 1941-09-15 23:00:00 (Mon)
  61259846400, #    local_end 1942-04-01 00:00:00 (Wed)
  7200,
  0,
  'EET',
      ],
      [
  61259839200, #    utc_start 1942-03-31 22:00:00 (Tue)
  61277893200, #      utc_end 1942-10-26 21:00:00 (Mon)
  61259850000, #  local_start 1942-04-01 01:00:00 (Wed)
  61277904000, #    local_end 1942-10-27 00:00:00 (Tue)
  10800,
  1,
  'EEST',
      ],
      [
  61277893200, #    utc_start 1942-10-26 21:00:00 (Mon)
  61291375200, #      utc_end 1943-03-31 22:00:00 (Wed)
  61277900400, #  local_start 1942-10-26 23:00:00 (Mon)
  61291382400, #    local_end 1943-04-01 00:00:00 (Thu)
  7200,
  0,
  'EET',
      ],
      [
  61291375200, #    utc_start 1943-03-31 22:00:00 (Wed)
  61309861200, #      utc_end 1943-10-31 21:00:00 (Sun)
  61291386000, #  local_start 1943-04-01 01:00:00 (Thu)
  61309872000, #    local_end 1943-11-01 00:00:00 (Mon)
  10800,
  1,
  'EEST',
      ],
      [
  61309861200, #    utc_start 1943-10-31 21:00:00 (Sun)
  61322997600, #      utc_end 1944-03-31 22:00:00 (Fri)
  61309868400, #  local_start 1943-10-31 23:00:00 (Sun)
  61323004800, #    local_end 1944-04-01 00:00:00 (Sat)
  7200,
  0,
  'EET',
      ],
      [
  61322997600, #    utc_start 1944-03-31 22:00:00 (Fri)
  61341483600, #      utc_end 1944-10-31 21:00:00 (Tue)
  61323008400, #  local_start 1944-04-01 01:00:00 (Sat)
  61341494400, #    local_end 1944-11-01 00:00:00 (Wed)
  10800,
  1,
  'EEST',
      ],
      [
  61341483600, #    utc_start 1944-10-31 21:00:00 (Tue)
  61355829600, #      utc_end 1945-04-15 22:00:00 (Sun)
  61341490800, #  local_start 1944-10-31 23:00:00 (Tue)
  61355836800, #    local_end 1945-04-16 00:00:00 (Mon)
  7200,
  0,
  'EET',
      ],
      [
  61355829600, #    utc_start 1945-04-15 22:00:00 (Sun)
  61373019600, #      utc_end 1945-10-31 21:00:00 (Wed)
  61355840400, #  local_start 1945-04-16 01:00:00 (Mon)
  61373030400, #    local_end 1945-11-01 00:00:00 (Thu)
  10800,
  1,
  'EEST',
      ],
      [
  61373019600, #    utc_start 1945-10-31 21:00:00 (Wed)
  61736594400, #      utc_end 1957-05-09 22:00:00 (Thu)
  61373026800, #  local_start 1945-10-31 23:00:00 (Wed)
  61736601600, #    local_end 1957-05-10 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  61736594400, #    utc_start 1957-05-09 22:00:00 (Thu)
  61749032400, #      utc_end 1957-09-30 21:00:00 (Mon)
  61736605200, #  local_start 1957-05-10 01:00:00 (Fri)
  61749043200, #    local_end 1957-10-01 00:00:00 (Tue)
  10800,
  1,
  'EEST',
      ],
      [
  61749032400, #    utc_start 1957-09-30 21:00:00 (Mon)
  61767352800, #      utc_end 1958-04-30 22:00:00 (Wed)
  61749039600, #  local_start 1957-09-30 23:00:00 (Mon)
  61767360000, #    local_end 1958-05-01 00:00:00 (Thu)
  7200,
  0,
  'EET',
      ],
      [
  61767352800, #    utc_start 1958-04-30 22:00:00 (Wed)
  61780568400, #      utc_end 1958-09-30 21:00:00 (Tue)
  61767363600, #  local_start 1958-05-01 01:00:00 (Thu)
  61780579200, #    local_end 1958-10-01 00:00:00 (Wed)
  10800,
  1,
  'EEST',
      ],
      [
  61780568400, #    utc_start 1958-09-30 21:00:00 (Tue)
  61798892400, #      utc_end 1959-04-30 23:00:00 (Thu)
  61780575600, #  local_start 1958-09-30 23:00:00 (Tue)
  61798899600, #    local_end 1959-05-01 01:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  61798892400, #    utc_start 1959-04-30 23:00:00 (Thu)
  61812028800, #      utc_end 1959-09-30 00:00:00 (Wed)
  61798903200, #  local_start 1959-05-01 02:00:00 (Fri)
  61812039600, #    local_end 1959-09-30 03:00:00 (Wed)
  10800,
  1,
  'EEST',
      ],
      [
  61812028800, #    utc_start 1959-09-30 00:00:00 (Wed)
  61830514800, #      utc_end 1960-04-30 23:00:00 (Sat)
  61812036000, #  local_start 1959-09-30 02:00:00 (Wed)
  61830522000, #    local_end 1960-05-01 01:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  61830514800, #    utc_start 1960-04-30 23:00:00 (Sat)
  61843651200, #      utc_end 1960-09-30 00:00:00 (Fri)
  61830525600, #  local_start 1960-05-01 02:00:00 (Sun)
  61843662000, #    local_end 1960-09-30 03:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  61843651200, #    utc_start 1960-09-30 00:00:00 (Fri)
  61862050800, #      utc_end 1961-04-30 23:00:00 (Sun)
  61843658400, #  local_start 1960-09-30 02:00:00 (Fri)
  61862058000, #    local_end 1961-05-01 01:00:00 (Mon)
  7200,
  0,
  'EET',
      ],
      [
  61862050800, #    utc_start 1961-04-30 23:00:00 (Sun)
  61875187200, #      utc_end 1961-09-30 00:00:00 (Sat)
  61862061600, #  local_start 1961-05-01 02:00:00 (Mon)
  61875198000, #    local_end 1961-09-30 03:00:00 (Sat)
  10800,
  1,
  'EEST',
      ],
      [
  61875187200, #    utc_start 1961-09-30 00:00:00 (Sat)
  61893586800, #      utc_end 1962-04-30 23:00:00 (Mon)
  61875194400, #  local_start 1961-09-30 02:00:00 (Sat)
  61893594000, #    local_end 1962-05-01 01:00:00 (Tue)
  7200,
  0,
  'EET',
      ],
      [
  61893586800, #    utc_start 1962-04-30 23:00:00 (Mon)
  61906723200, #      utc_end 1962-09-30 00:00:00 (Sun)
  61893597600, #  local_start 1962-05-01 02:00:00 (Tue)
  61906734000, #    local_end 1962-09-30 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  61906723200, #    utc_start 1962-09-30 00:00:00 (Sun)
  61925122800, #      utc_end 1963-04-30 23:00:00 (Tue)
  61906730400, #  local_start 1962-09-30 02:00:00 (Sun)
  61925130000, #    local_end 1963-05-01 01:00:00 (Wed)
  7200,
  0,
  'EET',
      ],
      [
  61925122800, #    utc_start 1963-04-30 23:00:00 (Tue)
  61938259200, #      utc_end 1963-09-30 00:00:00 (Mon)
  61925133600, #  local_start 1963-05-01 02:00:00 (Wed)
  61938270000, #    local_end 1963-09-30 03:00:00 (Mon)
  10800,
  1,
  'EEST',
      ],
      [
  61938259200, #    utc_start 1963-09-30 00:00:00 (Mon)
  61956745200, #      utc_end 1964-04-30 23:00:00 (Thu)
  61938266400, #  local_start 1963-09-30 02:00:00 (Mon)
  61956752400, #    local_end 1964-05-01 01:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  61956745200, #    utc_start 1964-04-30 23:00:00 (Thu)
  61969881600, #      utc_end 1964-09-30 00:00:00 (Wed)
  61956756000, #  local_start 1964-05-01 02:00:00 (Fri)
  61969892400, #    local_end 1964-09-30 03:00:00 (Wed)
  10800,
  1,
  'EEST',
      ],
      [
  61969881600, #    utc_start 1964-09-30 00:00:00 (Wed)
  61988281200, #      utc_end 1965-04-30 23:00:00 (Fri)
  61969888800, #  local_start 1964-09-30 02:00:00 (Wed)
  61988288400, #    local_end 1965-05-01 01:00:00 (Sat)
  7200,
  0,
  'EET',
      ],
      [
  61988281200, #    utc_start 1965-04-30 23:00:00 (Fri)
  62001417600, #      utc_end 1965-09-30 00:00:00 (Thu)
  61988292000, #  local_start 1965-05-01 02:00:00 (Sat)
  62001428400, #    local_end 1965-09-30 03:00:00 (Thu)
  10800,
  1,
  'EEST',
      ],
      [
  62001417600, #    utc_start 1965-09-30 00:00:00 (Thu)
  62019817200, #      utc_end 1966-04-30 23:00:00 (Sat)
  62001424800, #  local_start 1965-09-30 02:00:00 (Thu)
  62019824400, #    local_end 1966-05-01 01:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62019817200, #    utc_start 1966-04-30 23:00:00 (Sat)
  62033040000, #      utc_end 1966-10-01 00:00:00 (Sat)
  62019828000, #  local_start 1966-05-01 02:00:00 (Sun)
  62033050800, #    local_end 1966-10-01 03:00:00 (Sat)
  10800,
  1,
  'EEST',
      ],
      [
  62033040000, #    utc_start 1966-10-01 00:00:00 (Sat)
  62051353200, #      utc_end 1967-04-30 23:00:00 (Sun)
  62033047200, #  local_start 1966-10-01 02:00:00 (Sat)
  62051360400, #    local_end 1967-05-01 01:00:00 (Mon)
  7200,
  0,
  'EET',
      ],
      [
  62051353200, #    utc_start 1967-04-30 23:00:00 (Sun)
  62064576000, #      utc_end 1967-10-01 00:00:00 (Sun)
  62051364000, #  local_start 1967-05-01 02:00:00 (Mon)
  62064586800, #    local_end 1967-10-01 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62064576000, #    utc_start 1967-10-01 00:00:00 (Sun)
  62082975600, #      utc_end 1968-04-30 23:00:00 (Tue)
  62064583200, #  local_start 1967-10-01 02:00:00 (Sun)
  62082982800, #    local_end 1968-05-01 01:00:00 (Wed)
  7200,
  0,
  'EET',
      ],
      [
  62082975600, #    utc_start 1968-04-30 23:00:00 (Tue)
  62096198400, #      utc_end 1968-10-01 00:00:00 (Tue)
  62082986400, #  local_start 1968-05-01 02:00:00 (Wed)
  62096209200, #    local_end 1968-10-01 03:00:00 (Tue)
  10800,
  1,
  'EEST',
      ],
      [
  62096198400, #    utc_start 1968-10-01 00:00:00 (Tue)
  62114511600, #      utc_end 1969-04-30 23:00:00 (Wed)
  62096205600, #  local_start 1968-10-01 02:00:00 (Tue)
  62114518800, #    local_end 1969-05-01 01:00:00 (Thu)
  7200,
  0,
  'EET',
      ],
      [
  62114511600, #    utc_start 1969-04-30 23:00:00 (Wed)
  62127734400, #      utc_end 1969-10-01 00:00:00 (Wed)
  62114522400, #  local_start 1969-05-01 02:00:00 (Thu)
  62127745200, #    local_end 1969-10-01 03:00:00 (Wed)
  10800,
  1,
  'EEST',
      ],
      [
  62127734400, #    utc_start 1969-10-01 00:00:00 (Wed)
  62146047600, #      utc_end 1970-04-30 23:00:00 (Thu)
  62127741600, #  local_start 1969-10-01 02:00:00 (Wed)
  62146054800, #    local_end 1970-05-01 01:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  62146047600, #    utc_start 1970-04-30 23:00:00 (Thu)
  62159270400, #      utc_end 1970-10-01 00:00:00 (Thu)
  62146058400, #  local_start 1970-05-01 02:00:00 (Fri)
  62159281200, #    local_end 1970-10-01 03:00:00 (Thu)
  10800,
  1,
  'EEST',
      ],
      [
  62159270400, #    utc_start 1970-10-01 00:00:00 (Thu)
  62177583600, #      utc_end 1971-04-30 23:00:00 (Fri)
  62159277600, #  local_start 1970-10-01 02:00:00 (Thu)
  62177590800, #    local_end 1971-05-01 01:00:00 (Sat)
  7200,
  0,
  'EET',
      ],
      [
  62177583600, #    utc_start 1971-04-30 23:00:00 (Fri)
  62190806400, #      utc_end 1971-10-01 00:00:00 (Fri)
  62177594400, #  local_start 1971-05-01 02:00:00 (Sat)
  62190817200, #    local_end 1971-10-01 03:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  62190806400, #    utc_start 1971-10-01 00:00:00 (Fri)
  62209206000, #      utc_end 1972-04-30 23:00:00 (Sun)
  62190813600, #  local_start 1971-10-01 02:00:00 (Fri)
  62209213200, #    local_end 1972-05-01 01:00:00 (Mon)
  7200,
  0,
  'EET',
      ],
      [
  62209206000, #    utc_start 1972-04-30 23:00:00 (Sun)
  62222428800, #      utc_end 1972-10-01 00:00:00 (Sun)
  62209216800, #  local_start 1972-05-01 02:00:00 (Mon)
  62222439600, #    local_end 1972-10-01 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62222428800, #    utc_start 1972-10-01 00:00:00 (Sun)
  62240742000, #      utc_end 1973-04-30 23:00:00 (Mon)
  62222436000, #  local_start 1972-10-01 02:00:00 (Sun)
  62240749200, #    local_end 1973-05-01 01:00:00 (Tue)
  7200,
  0,
  'EET',
      ],
      [
  62240742000, #    utc_start 1973-04-30 23:00:00 (Mon)
  62253964800, #      utc_end 1973-10-01 00:00:00 (Mon)
  62240752800, #  local_start 1973-05-01 02:00:00 (Tue)
  62253975600, #    local_end 1973-10-01 03:00:00 (Mon)
  10800,
  1,
  'EEST',
      ],
      [
  62253964800, #    utc_start 1973-10-01 00:00:00 (Mon)
  62272278000, #      utc_end 1974-04-30 23:00:00 (Tue)
  62253972000, #  local_start 1973-10-01 02:00:00 (Mon)
  62272285200, #    local_end 1974-05-01 01:00:00 (Wed)
  7200,
  0,
  'EET',
      ],
      [
  62272278000, #    utc_start 1974-04-30 23:00:00 (Tue)
  62285500800, #      utc_end 1974-10-01 00:00:00 (Tue)
  62272288800, #  local_start 1974-05-01 02:00:00 (Wed)
  62285511600, #    local_end 1974-10-01 03:00:00 (Tue)
  10800,
  1,
  'EEST',
      ],
      [
  62285500800, #    utc_start 1974-10-01 00:00:00 (Tue)
  62303814000, #      utc_end 1975-04-30 23:00:00 (Wed)
  62285508000, #  local_start 1974-10-01 02:00:00 (Tue)
  62303821200, #    local_end 1975-05-01 01:00:00 (Thu)
  7200,
  0,
  'EET',
      ],
      [
  62303814000, #    utc_start 1975-04-30 23:00:00 (Wed)
  62317036800, #      utc_end 1975-10-01 00:00:00 (Wed)
  62303824800, #  local_start 1975-05-01 02:00:00 (Thu)
  62317047600, #    local_end 1975-10-01 03:00:00 (Wed)
  10800,
  1,
  'EEST',
      ],
      [
  62317036800, #    utc_start 1975-10-01 00:00:00 (Wed)
  62335436400, #      utc_end 1976-04-30 23:00:00 (Fri)
  62317044000, #  local_start 1975-10-01 02:00:00 (Wed)
  62335443600, #    local_end 1976-05-01 01:00:00 (Sat)
  7200,
  0,
  'EET',
      ],
      [
  62335436400, #    utc_start 1976-04-30 23:00:00 (Fri)
  62348659200, #      utc_end 1976-10-01 00:00:00 (Fri)
  62335447200, #  local_start 1976-05-01 02:00:00 (Sat)
  62348670000, #    local_end 1976-10-01 03:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  62348659200, #    utc_start 1976-10-01 00:00:00 (Fri)
  62366972400, #      utc_end 1977-04-30 23:00:00 (Sat)
  62348666400, #  local_start 1976-10-01 02:00:00 (Fri)
  62366979600, #    local_end 1977-05-01 01:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62366972400, #    utc_start 1977-04-30 23:00:00 (Sat)
  62380195200, #      utc_end 1977-10-01 00:00:00 (Sat)
  62366983200, #  local_start 1977-05-01 02:00:00 (Sun)
  62380206000, #    local_end 1977-10-01 03:00:00 (Sat)
  10800,
  1,
  'EEST',
      ],
      [
  62380195200, #    utc_start 1977-10-01 00:00:00 (Sat)
  62398508400, #      utc_end 1978-04-30 23:00:00 (Sun)
  62380202400, #  local_start 1977-10-01 02:00:00 (Sat)
  62398515600, #    local_end 1978-05-01 01:00:00 (Mon)
  7200,
  0,
  'EET',
      ],
      [
  62398508400, #    utc_start 1978-04-30 23:00:00 (Sun)
  62411731200, #      utc_end 1978-10-01 00:00:00 (Sun)
  62398519200, #  local_start 1978-05-01 02:00:00 (Mon)
  62411742000, #    local_end 1978-10-01 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62411731200, #    utc_start 1978-10-01 00:00:00 (Sun)
  62430044400, #      utc_end 1979-04-30 23:00:00 (Mon)
  62411738400, #  local_start 1978-10-01 02:00:00 (Sun)
  62430051600, #    local_end 1979-05-01 01:00:00 (Tue)
  7200,
  0,
  'EET',
      ],
      [
  62430044400, #    utc_start 1979-04-30 23:00:00 (Mon)
  62443267200, #      utc_end 1979-10-01 00:00:00 (Mon)
  62430055200, #  local_start 1979-05-01 02:00:00 (Tue)
  62443278000, #    local_end 1979-10-01 03:00:00 (Mon)
  10800,
  1,
  'EEST',
      ],
      [
  62443267200, #    utc_start 1979-10-01 00:00:00 (Mon)
  62461666800, #      utc_end 1980-04-30 23:00:00 (Wed)
  62443274400, #  local_start 1979-10-01 02:00:00 (Mon)
  62461674000, #    local_end 1980-05-01 01:00:00 (Thu)
  7200,
  0,
  'EET',
      ],
      [
  62461666800, #    utc_start 1980-04-30 23:00:00 (Wed)
  62474889600, #      utc_end 1980-10-01 00:00:00 (Wed)
  62461677600, #  local_start 1980-05-01 02:00:00 (Thu)
  62474900400, #    local_end 1980-10-01 03:00:00 (Wed)
  10800,
  1,
  'EEST',
      ],
      [
  62474889600, #    utc_start 1980-10-01 00:00:00 (Wed)
  62493202800, #      utc_end 1981-04-30 23:00:00 (Thu)
  62474896800, #  local_start 1980-10-01 02:00:00 (Wed)
  62493210000, #    local_end 1981-05-01 01:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  62493202800, #    utc_start 1981-04-30 23:00:00 (Thu)
  62506425600, #      utc_end 1981-10-01 00:00:00 (Thu)
  62493213600, #  local_start 1981-05-01 02:00:00 (Fri)
  62506436400, #    local_end 1981-10-01 03:00:00 (Thu)
  10800,
  1,
  'EEST',
      ],
      [
  62506425600, #    utc_start 1981-10-01 00:00:00 (Thu)
  62532082800, #      utc_end 1982-07-24 23:00:00 (Sat)
  62506432800, #  local_start 1981-10-01 02:00:00 (Thu)
  62532090000, #    local_end 1982-07-25 01:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62532082800, #    utc_start 1982-07-24 23:00:00 (Sat)
  62537961600, #      utc_end 1982-10-01 00:00:00 (Fri)
  62532093600, #  local_start 1982-07-25 02:00:00 (Sun)
  62537972400, #    local_end 1982-10-01 03:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  62537961600, #    utc_start 1982-10-01 00:00:00 (Fri)
  62562495600, #      utc_end 1983-07-11 23:00:00 (Mon)
  62537968800, #  local_start 1982-10-01 02:00:00 (Fri)
  62562502800, #    local_end 1983-07-12 01:00:00 (Tue)
  7200,
  0,
  'EET',
      ],
      [
  62562495600, #    utc_start 1983-07-11 23:00:00 (Mon)
  62569497600, #      utc_end 1983-10-01 00:00:00 (Sat)
  62562506400, #  local_start 1983-07-12 02:00:00 (Tue)
  62569508400, #    local_end 1983-10-01 03:00:00 (Sat)
  10800,
  1,
  'EEST',
      ],
      [
  62569497600, #    utc_start 1983-10-01 00:00:00 (Sat)
  62587897200, #      utc_end 1984-04-30 23:00:00 (Mon)
  62569504800, #  local_start 1983-10-01 02:00:00 (Sat)
  62587904400, #    local_end 1984-05-01 01:00:00 (Tue)
  7200,
  0,
  'EET',
      ],
      [
  62587897200, #    utc_start 1984-04-30 23:00:00 (Mon)
  62601120000, #      utc_end 1984-10-01 00:00:00 (Mon)
  62587908000, #  local_start 1984-05-01 02:00:00 (Tue)
  62601130800, #    local_end 1984-10-01 03:00:00 (Mon)
  10800,
  1,
  'EEST',
      ],
      [
  62601120000, #    utc_start 1984-10-01 00:00:00 (Mon)
  62619433200, #      utc_end 1985-04-30 23:00:00 (Tue)
  62601127200, #  local_start 1984-10-01 02:00:00 (Mon)
  62619440400, #    local_end 1985-05-01 01:00:00 (Wed)
  7200,
  0,
  'EET',
      ],
      [
  62619433200, #    utc_start 1985-04-30 23:00:00 (Tue)
  62632656000, #      utc_end 1985-10-01 00:00:00 (Tue)
  62619444000, #  local_start 1985-05-01 02:00:00 (Wed)
  62632666800, #    local_end 1985-10-01 03:00:00 (Tue)
  10800,
  1,
  'EEST',
      ],
      [
  62632656000, #    utc_start 1985-10-01 00:00:00 (Tue)
  62650969200, #      utc_end 1986-04-30 23:00:00 (Wed)
  62632663200, #  local_start 1985-10-01 02:00:00 (Tue)
  62650976400, #    local_end 1986-05-01 01:00:00 (Thu)
  7200,
  0,
  'EET',
      ],
      [
  62650969200, #    utc_start 1986-04-30 23:00:00 (Wed)
  62664192000, #      utc_end 1986-10-01 00:00:00 (Wed)
  62650980000, #  local_start 1986-05-01 02:00:00 (Thu)
  62664202800, #    local_end 1986-10-01 03:00:00 (Wed)
  10800,
  1,
  'EEST',
      ],
      [
  62664192000, #    utc_start 1986-10-01 00:00:00 (Wed)
  62682505200, #      utc_end 1987-04-30 23:00:00 (Thu)
  62664199200, #  local_start 1986-10-01 02:00:00 (Wed)
  62682512400, #    local_end 1987-05-01 01:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  62682505200, #    utc_start 1987-04-30 23:00:00 (Thu)
  62695728000, #      utc_end 1987-10-01 00:00:00 (Thu)
  62682516000, #  local_start 1987-05-01 02:00:00 (Fri)
  62695738800, #    local_end 1987-10-01 03:00:00 (Thu)
  10800,
  1,
  'EEST',
      ],
      [
  62695728000, #    utc_start 1987-10-01 00:00:00 (Thu)
  62714127600, #      utc_end 1988-04-30 23:00:00 (Sat)
  62695735200, #  local_start 1987-10-01 02:00:00 (Thu)
  62714134800, #    local_end 1988-05-01 01:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62714127600, #    utc_start 1988-04-30 23:00:00 (Sat)
  62727350400, #      utc_end 1988-10-01 00:00:00 (Sat)
  62714138400, #  local_start 1988-05-01 02:00:00 (Sun)
  62727361200, #    local_end 1988-10-01 03:00:00 (Sat)
  10800,
  1,
  'EEST',
      ],
      [
  62727350400, #    utc_start 1988-10-01 00:00:00 (Sat)
  62746095600, #      utc_end 1989-05-05 23:00:00 (Fri)
  62727357600, #  local_start 1988-10-01 02:00:00 (Sat)
  62746102800, #    local_end 1989-05-06 01:00:00 (Sat)
  7200,
  0,
  'EET',
      ],
      [
  62746095600, #    utc_start 1989-05-05 23:00:00 (Fri)
  62758886400, #      utc_end 1989-10-01 00:00:00 (Sun)
  62746106400, #  local_start 1989-05-06 02:00:00 (Sat)
  62758897200, #    local_end 1989-10-01 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62758886400, #    utc_start 1989-10-01 00:00:00 (Sun)
  62777199600, #      utc_end 1990-04-30 23:00:00 (Mon)
  62758893600, #  local_start 1989-10-01 02:00:00 (Sun)
  62777206800, #    local_end 1990-05-01 01:00:00 (Tue)
  7200,
  0,
  'EET',
      ],
      [
  62777199600, #    utc_start 1990-04-30 23:00:00 (Mon)
  62790422400, #      utc_end 1990-10-01 00:00:00 (Mon)
  62777210400, #  local_start 1990-05-01 02:00:00 (Tue)
  62790433200, #    local_end 1990-10-01 03:00:00 (Mon)
  10800,
  1,
  'EEST',
      ],
      [
  62790422400, #    utc_start 1990-10-01 00:00:00 (Mon)
  62808735600, #      utc_end 1991-04-30 23:00:00 (Tue)
  62790429600, #  local_start 1990-10-01 02:00:00 (Mon)
  62808742800, #    local_end 1991-05-01 01:00:00 (Wed)
  7200,
  0,
  'EET',
      ],
      [
  62808735600, #    utc_start 1991-04-30 23:00:00 (Tue)
  62821958400, #      utc_end 1991-10-01 00:00:00 (Tue)
  62808746400, #  local_start 1991-05-01 02:00:00 (Wed)
  62821969200, #    local_end 1991-10-01 03:00:00 (Tue)
  10800,
  1,
  'EEST',
      ],
      [
  62821958400, #    utc_start 1991-10-01 00:00:00 (Tue)
  62840358000, #      utc_end 1992-04-30 23:00:00 (Thu)
  62821965600, #  local_start 1991-10-01 02:00:00 (Tue)
  62840365200, #    local_end 1992-05-01 01:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  62840358000, #    utc_start 1992-04-30 23:00:00 (Thu)
  62853580800, #      utc_end 1992-10-01 00:00:00 (Thu)
  62840368800, #  local_start 1992-05-01 02:00:00 (Fri)
  62853591600, #    local_end 1992-10-01 03:00:00 (Thu)
  10800,
  1,
  'EEST',
      ],
      [
  62853580800, #    utc_start 1992-10-01 00:00:00 (Thu)
  62871894000, #      utc_end 1993-04-30 23:00:00 (Fri)
  62853588000, #  local_start 1992-10-01 02:00:00 (Thu)
  62871901200, #    local_end 1993-05-01 01:00:00 (Sat)
  7200,
  0,
  'EET',
      ],
      [
  62871894000, #    utc_start 1993-04-30 23:00:00 (Fri)
  62885116800, #      utc_end 1993-10-01 00:00:00 (Fri)
  62871904800, #  local_start 1993-05-01 02:00:00 (Sat)
  62885127600, #    local_end 1993-10-01 03:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  62885116800, #    utc_start 1993-10-01 00:00:00 (Fri)
  62903430000, #      utc_end 1994-04-30 23:00:00 (Sat)
  62885124000, #  local_start 1993-10-01 02:00:00 (Fri)
  62903437200, #    local_end 1994-05-01 01:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62903430000, #    utc_start 1994-04-30 23:00:00 (Sat)
  62916652800, #      utc_end 1994-10-01 00:00:00 (Sat)
  62903440800, #  local_start 1994-05-01 02:00:00 (Sun)
  62916663600, #    local_end 1994-10-01 03:00:00 (Sat)
  10800,
  1,
  'EEST',
      ],
      [
  62916652800, #    utc_start 1994-10-01 00:00:00 (Sat)
  62934703200, #      utc_end 1995-04-27 22:00:00 (Thu)
  62916660000, #  local_start 1994-10-01 02:00:00 (Sat)
  62934710400, #    local_end 1995-04-28 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  62934703200, #    utc_start 1995-04-27 22:00:00 (Thu)
  62948005200, #      utc_end 1995-09-28 21:00:00 (Thu)
  62934714000, #  local_start 1995-04-28 01:00:00 (Fri)
  62948016000, #    local_end 1995-09-29 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  62948005200, #    utc_start 1995-09-28 21:00:00 (Thu)
  62966152800, #      utc_end 1996-04-25 22:00:00 (Thu)
  62948012400, #  local_start 1995-09-28 23:00:00 (Thu)
  62966160000, #    local_end 1996-04-26 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  62966152800, #    utc_start 1996-04-25 22:00:00 (Thu)
  62979454800, #      utc_end 1996-09-26 21:00:00 (Thu)
  62966163600, #  local_start 1996-04-26 01:00:00 (Fri)
  62979465600, #    local_end 1996-09-27 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  62979454800, #    utc_start 1996-09-26 21:00:00 (Thu)
  62997602400, #      utc_end 1997-04-24 22:00:00 (Thu)
  62979462000, #  local_start 1996-09-26 23:00:00 (Thu)
  62997609600, #    local_end 1997-04-25 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  62997602400, #    utc_start 1997-04-24 22:00:00 (Thu)
  63010904400, #      utc_end 1997-09-25 21:00:00 (Thu)
  62997613200, #  local_start 1997-04-25 01:00:00 (Fri)
  63010915200, #    local_end 1997-09-26 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63010904400, #    utc_start 1997-09-25 21:00:00 (Thu)
  63029052000, #      utc_end 1998-04-23 22:00:00 (Thu)
  63010911600, #  local_start 1997-09-25 23:00:00 (Thu)
  63029059200, #    local_end 1998-04-24 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63029052000, #    utc_start 1998-04-23 22:00:00 (Thu)
  63042354000, #      utc_end 1998-09-24 21:00:00 (Thu)
  63029062800, #  local_start 1998-04-24 01:00:00 (Fri)
  63042364800, #    local_end 1998-09-25 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63042354000, #    utc_start 1998-09-24 21:00:00 (Thu)
  63061106400, #      utc_end 1999-04-29 22:00:00 (Thu)
  63042361200, #  local_start 1998-09-24 23:00:00 (Thu)
  63061113600, #    local_end 1999-04-30 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63061106400, #    utc_start 1999-04-29 22:00:00 (Thu)
  63074408400, #      utc_end 1999-09-30 21:00:00 (Thu)
  63061117200, #  local_start 1999-04-30 01:00:00 (Fri)
  63074419200, #    local_end 1999-10-01 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63074408400, #    utc_start 1999-09-30 21:00:00 (Thu)
  63092556000, #      utc_end 2000-04-27 22:00:00 (Thu)
  63074415600, #  local_start 1999-09-30 23:00:00 (Thu)
  63092563200, #    local_end 2000-04-28 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63092556000, #    utc_start 2000-04-27 22:00:00 (Thu)
  63105858000, #      utc_end 2000-09-28 21:00:00 (Thu)
  63092566800, #  local_start 2000-04-28 01:00:00 (Fri)
  63105868800, #    local_end 2000-09-29 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63105858000, #    utc_start 2000-09-28 21:00:00 (Thu)
  63124005600, #      utc_end 2001-04-26 22:00:00 (Thu)
  63105865200, #  local_start 2000-09-28 23:00:00 (Thu)
  63124012800, #    local_end 2001-04-27 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63124005600, #    utc_start 2001-04-26 22:00:00 (Thu)
  63137307600, #      utc_end 2001-09-27 21:00:00 (Thu)
  63124016400, #  local_start 2001-04-27 01:00:00 (Fri)
  63137318400, #    local_end 2001-09-28 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63137307600, #    utc_start 2001-09-27 21:00:00 (Thu)
  63155455200, #      utc_end 2002-04-25 22:00:00 (Thu)
  63137314800, #  local_start 2001-09-27 23:00:00 (Thu)
  63155462400, #    local_end 2002-04-26 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63155455200, #    utc_start 2002-04-25 22:00:00 (Thu)
  63168757200, #      utc_end 2002-09-26 21:00:00 (Thu)
  63155466000, #  local_start 2002-04-26 01:00:00 (Fri)
  63168768000, #    local_end 2002-09-27 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63168757200, #    utc_start 2002-09-26 21:00:00 (Thu)
  63186904800, #      utc_end 2003-04-24 22:00:00 (Thu)
  63168764400, #  local_start 2002-09-26 23:00:00 (Thu)
  63186912000, #    local_end 2003-04-25 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63186904800, #    utc_start 2003-04-24 22:00:00 (Thu)
  63200206800, #      utc_end 2003-09-25 21:00:00 (Thu)
  63186915600, #  local_start 2003-04-25 01:00:00 (Fri)
  63200217600, #    local_end 2003-09-26 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63200206800, #    utc_start 2003-09-25 21:00:00 (Thu)
  63218959200, #      utc_end 2004-04-29 22:00:00 (Thu)
  63200214000, #  local_start 2003-09-25 23:00:00 (Thu)
  63218966400, #    local_end 2004-04-30 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63218959200, #    utc_start 2004-04-29 22:00:00 (Thu)
  63232261200, #      utc_end 2004-09-30 21:00:00 (Thu)
  63218970000, #  local_start 2004-04-30 01:00:00 (Fri)
  63232272000, #    local_end 2004-10-01 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63232261200, #    utc_start 2004-09-30 21:00:00 (Thu)
  63250408800, #      utc_end 2005-04-28 22:00:00 (Thu)
  63232268400, #  local_start 2004-09-30 23:00:00 (Thu)
  63250416000, #    local_end 2005-04-29 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63250408800, #    utc_start 2005-04-28 22:00:00 (Thu)
  63263710800, #      utc_end 2005-09-29 21:00:00 (Thu)
  63250419600, #  local_start 2005-04-29 01:00:00 (Fri)
  63263721600, #    local_end 2005-09-30 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63263710800, #    utc_start 2005-09-29 21:00:00 (Thu)
  63281858400, #      utc_end 2006-04-27 22:00:00 (Thu)
  63263718000, #  local_start 2005-09-29 23:00:00 (Thu)
  63281865600, #    local_end 2006-04-28 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63281858400, #    utc_start 2006-04-27 22:00:00 (Thu)
  63294555600, #      utc_end 2006-09-21 21:00:00 (Thu)
  63281869200, #  local_start 2006-04-28 01:00:00 (Fri)
  63294566400, #    local_end 2006-09-22 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63294555600, #    utc_start 2006-09-21 21:00:00 (Thu)
  63313308000, #      utc_end 2007-04-26 22:00:00 (Thu)
  63294562800, #  local_start 2006-09-21 23:00:00 (Thu)
  63313315200, #    local_end 2007-04-27 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63313308000, #    utc_start 2007-04-26 22:00:00 (Thu)
  63324795600, #      utc_end 2007-09-06 21:00:00 (Thu)
  63313318800, #  local_start 2007-04-27 01:00:00 (Fri)
  63324806400, #    local_end 2007-09-07 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63324795600, #    utc_start 2007-09-06 21:00:00 (Thu)
  63344757600, #      utc_end 2008-04-24 22:00:00 (Thu)
  63324802800, #  local_start 2007-09-06 23:00:00 (Thu)
  63344764800, #    local_end 2008-04-25 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63344757600, #    utc_start 2008-04-24 22:00:00 (Thu)
  63355640400, #      utc_end 2008-08-28 21:00:00 (Thu)
  63344768400, #  local_start 2008-04-25 01:00:00 (Fri)
  63355651200, #    local_end 2008-08-29 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63355640400, #    utc_start 2008-08-28 21:00:00 (Thu)
  63376207200, #      utc_end 2009-04-23 22:00:00 (Thu)
  63355647600, #  local_start 2008-08-28 23:00:00 (Thu)
  63376214400, #    local_end 2009-04-24 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63376207200, #    utc_start 2009-04-23 22:00:00 (Thu)
  63386485200, #      utc_end 2009-08-20 21:00:00 (Thu)
  63376218000, #  local_start 2009-04-24 01:00:00 (Fri)
  63386496000, #    local_end 2009-08-21 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63386485200, #    utc_start 2009-08-20 21:00:00 (Thu)
  63408261600, #      utc_end 2010-04-29 22:00:00 (Thu)
  63386492400, #  local_start 2009-08-20 23:00:00 (Thu)
  63408268800, #    local_end 2010-04-30 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63408261600, #    utc_start 2010-04-29 22:00:00 (Thu)
  63417157200, #      utc_end 2010-08-10 21:00:00 (Tue)
  63408272400, #  local_start 2010-04-30 01:00:00 (Fri)
  63417168000, #    local_end 2010-08-11 00:00:00 (Wed)
  10800,
  1,
  'EEST',
      ],
      [
  63417157200, #    utc_start 2010-08-10 21:00:00 (Tue)
  63419752800, #      utc_end 2010-09-09 22:00:00 (Thu)
  63417164400, #  local_start 2010-08-10 23:00:00 (Tue)
  63419760000, #    local_end 2010-09-10 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63419752800, #    utc_start 2010-09-09 22:00:00 (Thu)
  63421563600, #      utc_end 2010-09-30 21:00:00 (Thu)
  63419763600, #  local_start 2010-09-10 01:00:00 (Fri)
  63421574400, #    local_end 2010-10-01 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63421563600, #    utc_start 2010-09-30 21:00:00 (Thu)
  63535874400, #      utc_end 2014-05-15 22:00:00 (Thu)
  63421570800, #  local_start 2010-09-30 23:00:00 (Thu)
  63535881600, #    local_end 2014-05-16 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63535874400, #    utc_start 2014-05-15 22:00:00 (Thu)
  63539499600, #      utc_end 2014-06-26 21:00:00 (Thu)
  63535885200, #  local_start 2014-05-16 01:00:00 (Fri)
  63539510400, #    local_end 2014-06-27 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63539499600, #    utc_start 2014-06-26 21:00:00 (Thu)
  63542527200, #      utc_end 2014-07-31 22:00:00 (Thu)
  63539506800, #  local_start 2014-06-26 23:00:00 (Thu)
  63542534400, #    local_end 2014-08-01 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63542527200, #    utc_start 2014-07-31 22:00:00 (Thu)
  63547362000, #      utc_end 2014-09-25 21:00:00 (Thu)
  63542538000, #  local_start 2014-08-01 01:00:00 (Fri)
  63547372800, #    local_end 2014-09-26 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63547362000, #    utc_start 2014-09-25 21:00:00 (Thu)
  DateTime::TimeZone::INFINITY, #      utc_end
  63547369200, #  local_start 2014-09-25 23:00:00 (Thu)
  DateTime::TimeZone::INFINITY, #    local_end
  7200,
  0,
  'EET',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {63}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AFRICA_CAIRO

    $main::fatpacked{"DateTime/TimeZone/Africa/Casablanca.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AFRICA_CASABLANCA';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/africa.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Africa::Casablanca;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Africa::Casablanca::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60362670620, #      utc_end 1913-10-26 00:30:20 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60362668800, #    local_end 1913-10-26 00:00:00 (Sun)
  -1820,
  0,
  'LMT',
      ],
      [
  60362670620, #    utc_start 1913-10-26 00:30:20 (Sun)
  61179321600, #      utc_end 1939-09-12 00:00:00 (Tue)
  60362670620, #  local_start 1913-10-26 00:30:20 (Sun)
  61179321600, #    local_end 1939-09-12 00:00:00 (Tue)
  0,
  0,
  '+00',
      ],
      [
  61179321600, #    utc_start 1939-09-12 00:00:00 (Tue)
  61185193200, #      utc_end 1939-11-18 23:00:00 (Sat)
  61179325200, #  local_start 1939-09-12 01:00:00 (Tue)
  61185196800, #    local_end 1939-11-19 00:00:00 (Sun)
  3600,
  1,
  '+01',
      ],
      [
  61185193200, #    utc_start 1939-11-18 23:00:00 (Sat)
  61193664000, #      utc_end 1940-02-25 00:00:00 (Sun)
  61185193200, #  local_start 1939-11-18 23:00:00 (Sat)
  61193664000, #    local_end 1940-02-25 00:00:00 (Sun)
  0,
  0,
  '+00',
      ],
      [
  61193664000, #    utc_start 1940-02-25 00:00:00 (Sun)
  61374495600, #      utc_end 1945-11-17 23:00:00 (Sat)
  61193667600, #  local_start 1940-02-25 01:00:00 (Sun)
  61374499200, #    local_end 1945-11-18 00:00:00 (Sun)
  3600,
  1,
  '+01',
      ],
      [
  61374495600, #    utc_start 1945-11-17 23:00:00 (Sat)
  61518441600, #      utc_end 1950-06-11 00:00:00 (Sun)
  61374495600, #  local_start 1945-11-17 23:00:00 (Sat)
  61518441600, #    local_end 1950-06-11 00:00:00 (Sun)
  0,
  0,
  '+00',
      ],
      [
  61518441600, #    utc_start 1950-06-11 00:00:00 (Sun)
  61530534000, #      utc_end 1950-10-28 23:00:00 (Sat)
  61518445200, #  local_start 1950-06-11 01:00:00 (Sun)
  61530537600, #    local_end 1950-10-29 00:00:00 (Sun)
  3600,
  1,
  '+01',
      ],
      [
  61530534000, #    utc_start 1950-10-28 23:00:00 (Sat)
  62054251200, #      utc_end 1967-06-03 12:00:00 (Sat)
  61530534000, #  local_start 1950-10-28 23:00:00 (Sat)
  62054251200, #    local_end 1967-06-03 12:00:00 (Sat)
  0,
  0,
  '+00',
      ],
      [
  62054251200, #    utc_start 1967-06-03 12:00:00 (Sat)
  62064572400, #      utc_end 1967-09-30 23:00:00 (Sat)
  62054254800, #  local_start 1967-06-03 13:00:00 (Sat)
  62064576000, #    local_end 1967-10-01 00:00:00 (Sun)
  3600,
  1,
  '+01',
      ],
      [
  62064572400, #    utc_start 1967-09-30 23:00:00 (Sat)
  62276947200, #      utc_end 1974-06-24 00:00:00 (Mon)
  62064572400, #  local_start 1967-09-30 23:00:00 (Sat)
  62276947200, #    local_end 1974-06-24 00:00:00 (Mon)
  0,
  0,
  '+00',
      ],
      [
  62276947200, #    utc_start 1974-06-24 00:00:00 (Mon)
  62282905200, #      utc_end 1974-08-31 23:00:00 (Sat)
  62276950800, #  local_start 1974-06-24 01:00:00 (Mon)
  62282908800, #    local_end 1974-09-01 00:00:00 (Sun)
  3600,
  1,
  '+01',
      ],
      [
  62282905200, #    utc_start 1974-08-31 23:00:00 (Sat)
  62335440000, #      utc_end 1976-05-01 00:00:00 (Sat)
  62282905200, #  local_start 1974-08-31 23:00:00 (Sat)
  62335440000, #    local_end 1976-05-01 00:00:00 (Sat)
  0,
  0,
  '+00',
      ],
      [
  62335440000, #    utc_start 1976-05-01 00:00:00 (Sat)
  62343385200, #      utc_end 1976-07-31 23:00:00 (Sat)
  62335443600, #  local_start 1976-05-01 01:00:00 (Sat)
  62343388800, #    local_end 1976-08-01 00:00:00 (Sun)
  3600,
  1,
  '+01',
      ],
      [
  62343385200, #    utc_start 1976-07-31 23:00:00 (Sat)
  62366976000, #      utc_end 1977-05-01 00:00:00 (Sun)
  62343385200, #  local_start 1976-07-31 23:00:00 (Sat)
  62366976000, #    local_end 1977-05-01 00:00:00 (Sun)
  0,
  0,
  '+00',
      ],
      [
  62366976000, #    utc_start 1977-05-01 00:00:00 (Sun)
  62379932400, #      utc_end 1977-09-27 23:00:00 (Tue)
  62366979600, #  local_start 1977-05-01 01:00:00 (Sun)
  62379936000, #    local_end 1977-09-28 00:00:00 (Wed)
  3600,
  1,
  '+01',
      ],
      [
  62379932400, #    utc_start 1977-09-27 23:00:00 (Tue)
  62401190400, #      utc_end 1978-06-01 00:00:00 (Thu)
  62379932400, #  local_start 1977-09-27 23:00:00 (Tue)
  62401190400, #    local_end 1978-06-01 00:00:00 (Thu)
  0,
  0,
  '+00',
      ],
      [
  62401190400, #    utc_start 1978-06-01 00:00:00 (Thu)
  62406716400, #      utc_end 1978-08-03 23:00:00 (Thu)
  62401194000, #  local_start 1978-06-01 01:00:00 (Thu)
  62406720000, #    local_end 1978-08-04 00:00:00 (Fri)
  3600,
  1,
  '+01',
      ],
      [
  62406716400, #    utc_start 1978-08-03 23:00:00 (Thu)
  62583926400, #      utc_end 1984-03-16 00:00:00 (Fri)
  62406716400, #  local_start 1978-08-03 23:00:00 (Thu)
  62583926400, #    local_end 1984-03-16 00:00:00 (Fri)
  0,
  0,
  '+00',
      ],
      [
  62583926400, #    utc_start 1984-03-16 00:00:00 (Fri)
  62640601200, #      utc_end 1985-12-31 23:00:00 (Tue)
  62583930000, #  local_start 1984-03-16 01:00:00 (Fri)
  62640604800, #    local_end 1986-01-01 00:00:00 (Wed)
  3600,
  0,
  '+01',
      ],
      [
  62640601200, #    utc_start 1985-12-31 23:00:00 (Tue)
  63347961600, #      utc_end 2008-06-01 00:00:00 (Sun)
  62640601200, #  local_start 1985-12-31 23:00:00 (Tue)
  63347961600, #    local_end 2008-06-01 00:00:00 (Sun)
  0,
  0,
  '+00',
      ],
      [
  63347961600, #    utc_start 2008-06-01 00:00:00 (Sun)
  63355906800, #      utc_end 2008-08-31 23:00:00 (Sun)
  63347965200, #  local_start 2008-06-01 01:00:00 (Sun)
  63355910400, #    local_end 2008-09-01 00:00:00 (Mon)
  3600,
  1,
  '+01',
      ],
      [
  63355906800, #    utc_start 2008-08-31 23:00:00 (Sun)
  63379497600, #      utc_end 2009-06-01 00:00:00 (Mon)
  63355906800, #  local_start 2008-08-31 23:00:00 (Sun)
  63379497600, #    local_end 2009-06-01 00:00:00 (Mon)
  0,
  0,
  '+00',
      ],
      [
  63379497600, #    utc_start 2009-06-01 00:00:00 (Mon)
  63386492400, #      utc_end 2009-08-20 23:00:00 (Thu)
  63379501200, #  local_start 2009-06-01 01:00:00 (Mon)
  63386496000, #    local_end 2009-08-21 00:00:00 (Fri)
  3600,
  1,
  '+01',
      ],
      [
  63386492400, #    utc_start 2009-08-20 23:00:00 (Thu)
  63408441600, #      utc_end 2010-05-02 00:00:00 (Sun)
  63386492400, #  local_start 2009-08-20 23:00:00 (Thu)
  63408441600, #    local_end 2010-05-02 00:00:00 (Sun)
  0,
  0,
  '+00',
      ],
      [
  63408441600, #    utc_start 2010-05-02 00:00:00 (Sun)
  63416905200, #      utc_end 2010-08-07 23:00:00 (Sat)
  63408445200, #  local_start 2010-05-02 01:00:00 (Sun)
  63416908800, #    local_end 2010-08-08 00:00:00 (Sun)
  3600,
  1,
  '+01',
      ],
      [
  63416905200, #    utc_start 2010-08-07 23:00:00 (Sat)
  63437472000, #      utc_end 2011-04-03 00:00:00 (Sun)
  63416905200, #  local_start 2010-08-07 23:00:00 (Sat)
  63437472000, #    local_end 2011-04-03 00:00:00 (Sun)
  0,
  0,
  '+00',
      ],
      [
  63437472000, #    utc_start 2011-04-03 00:00:00 (Sun)
  63447750000, #      utc_end 2011-07-30 23:00:00 (Sat)
  63437475600, #  local_start 2011-04-03 01:00:00 (Sun)
  63447753600, #    local_end 2011-07-31 00:00:00 (Sun)
  3600,
  1,
  '+01',
      ],
      [
  63447750000, #    utc_start 2011-07-30 23:00:00 (Sat)
  63471348000, #      utc_end 2012-04-29 02:00:00 (Sun)
  63447750000, #  local_start 2011-07-30 23:00:00 (Sat)
  63471348000, #    local_end 2012-04-29 02:00:00 (Sun)
  0,
  0,
  '+00',
      ],
      [
  63471348000, #    utc_start 2012-04-29 02:00:00 (Sun)
  63478432800, #      utc_end 2012-07-20 02:00:00 (Fri)
  63471351600, #  local_start 2012-04-29 03:00:00 (Sun)
  63478436400, #    local_end 2012-07-20 03:00:00 (Fri)
  3600,
  1,
  '+01',
      ],
      [
  63478432800, #    utc_start 2012-07-20 02:00:00 (Fri)
  63481111200, #      utc_end 2012-08-20 02:00:00 (Mon)
  63478432800, #  local_start 2012-07-20 02:00:00 (Fri)
  63481111200, #    local_end 2012-08-20 02:00:00 (Mon)
  0,
  0,
  '+00',
      ],
      [
  63481111200, #    utc_start 2012-08-20 02:00:00 (Mon)
  63484653600, #      utc_end 2012-09-30 02:00:00 (Sun)
  63481114800, #  local_start 2012-08-20 03:00:00 (Mon)
  63484657200, #    local_end 2012-09-30 03:00:00 (Sun)
  3600,
  1,
  '+01',
      ],
      [
  63484653600, #    utc_start 2012-09-30 02:00:00 (Sun)
  63502797600, #      utc_end 2013-04-28 02:00:00 (Sun)
  63484653600, #  local_start 2012-09-30 02:00:00 (Sun)
  63502797600, #    local_end 2013-04-28 02:00:00 (Sun)
  0,
  0,
  '+00',
      ],
      [
  63502797600, #    utc_start 2013-04-28 02:00:00 (Sun)
  63508845600, #      utc_end 2013-07-07 02:00:00 (Sun)
  63502801200, #  local_start 2013-04-28 03:00:00 (Sun)
  63508849200, #    local_end 2013-07-07 03:00:00 (Sun)
  3600,
  1,
  '+01',
      ],
      [
  63508845600, #    utc_start 2013-07-07 02:00:00 (Sun)
  63511783200, #      utc_end 2013-08-10 02:00:00 (Sat)
  63508845600, #  local_start 2013-07-07 02:00:00 (Sun)
  63511783200, #    local_end 2013-08-10 02:00:00 (Sat)
  0,
  0,
  '+00',
      ],
      [
  63511783200, #    utc_start 2013-08-10 02:00:00 (Sat)
  63518522400, #      utc_end 2013-10-27 02:00:00 (Sun)
  63511786800, #  local_start 2013-08-10 03:00:00 (Sat)
  63518526000, #    local_end 2013-10-27 03:00:00 (Sun)
  3600,
  1,
  '+01',
      ],
      [
  63518522400, #    utc_start 2013-10-27 02:00:00 (Sun)
  63531828000, #      utc_end 2014-03-30 02:00:00 (Sun)
  63518522400, #  local_start 2013-10-27 02:00:00 (Sun)
  63531828000, #    local_end 2014-03-30 02:00:00 (Sun)
  0,
  0,
  '+00',
      ],
      [
  63531828000, #    utc_start 2014-03-30 02:00:00 (Sun)
  63539604000, #      utc_end 2014-06-28 02:00:00 (Sat)
  63531831600, #  local_start 2014-03-30 03:00:00 (Sun)
  63539607600, #    local_end 2014-06-28 03:00:00 (Sat)
  3600,
  1,
  '+01',
      ],
      [
  63539604000, #    utc_start 2014-06-28 02:00:00 (Sat)
  63542628000, #      utc_end 2014-08-02 02:00:00 (Sat)
  63539604000, #  local_start 2014-06-28 02:00:00 (Sat)
  63542628000, #    local_end 2014-08-02 02:00:00 (Sat)
  0,
  0,
  '+00',
      ],
      [
  63542628000, #    utc_start 2014-08-02 02:00:00 (Sat)
  63549972000, #      utc_end 2014-10-26 02:00:00 (Sun)
  63542631600, #  local_start 2014-08-02 03:00:00 (Sat)
  63549975600, #    local_end 2014-10-26 03:00:00 (Sun)
  3600,
  1,
  '+01',
      ],
      [
  63549972000, #    utc_start 2014-10-26 02:00:00 (Sun)
  63563277600, #      utc_end 2015-03-29 02:00:00 (Sun)
  63549972000, #  local_start 2014-10-26 02:00:00 (Sun)
  63563277600, #    local_end 2015-03-29 02:00:00 (Sun)
  0,
  0,
  '+00',
      ],
      [
  63563277600, #    utc_start 2015-03-29 02:00:00 (Sun)
  63569930400, #      utc_end 2015-06-14 02:00:00 (Sun)
  63563281200, #  local_start 2015-03-29 03:00:00 (Sun)
  63569934000, #    local_end 2015-06-14 03:00:00 (Sun)
  3600,
  1,
  '+01',
      ],
      [
  63569930400, #    utc_start 2015-06-14 02:00:00 (Sun)
  63572954400, #      utc_end 2015-07-19 02:00:00 (Sun)
  63569930400, #  local_start 2015-06-14 02:00:00 (Sun)
  63572954400, #    local_end 2015-07-19 02:00:00 (Sun)
  0,
  0,
  '+00',
      ],
      [
  63572954400, #    utc_start 2015-07-19 02:00:00 (Sun)
  63581421600, #      utc_end 2015-10-25 02:00:00 (Sun)
  63572958000, #  local_start 2015-07-19 03:00:00 (Sun)
  63581425200, #    local_end 2015-10-25 03:00:00 (Sun)
  3600,
  1,
  '+01',
      ],
      [
  63581421600, #    utc_start 2015-10-25 02:00:00 (Sun)
  63594727200, #      utc_end 2016-03-27 02:00:00 (Sun)
  63581421600, #  local_start 2015-10-25 02:00:00 (Sun)
  63594727200, #    local_end 2016-03-27 02:00:00 (Sun)
  0,
  0,
  '+00',
      ],
      [
  63594727200, #    utc_start 2016-03-27 02:00:00 (Sun)
  63600775200, #      utc_end 2016-06-05 02:00:00 (Sun)
  63594730800, #  local_start 2016-03-27 03:00:00 (Sun)
  63600778800, #    local_end 2016-06-05 03:00:00 (Sun)
  3600,
  1,
  '+01',
      ],
      [
  63600775200, #    utc_start 2016-06-05 02:00:00 (Sun)
  63603799200, #      utc_end 2016-07-10 02:00:00 (Sun)
  63600775200, #  local_start 2016-06-05 02:00:00 (Sun)
  63603799200, #    local_end 2016-07-10 02:00:00 (Sun)
  0,
  0,
  '+00',
      ],
      [
  63603799200, #    utc_start 2016-07-10 02:00:00 (Sun)
  63613476000, #      utc_end 2016-10-30 02:00:00 (Sun)
  63603802800, #  local_start 2016-07-10 03:00:00 (Sun)
  63613479600, #    local_end 2016-10-30 03:00:00 (Sun)
  3600,
  1,
  '+01',
      ],
      [
  63613476000, #    utc_start 2016-10-30 02:00:00 (Sun)
  63626176800, #      utc_end 2017-03-26 02:00:00 (Sun)
  63613476000, #  local_start 2016-10-30 02:00:00 (Sun)
  63626176800, #    local_end 2017-03-26 02:00:00 (Sun)
  0,
  0,
  '+00',
      ],
      [
  63626176800, #    utc_start 2017-03-26 02:00:00 (Sun)
  63631015200, #      utc_end 2017-05-21 02:00:00 (Sun)
  63626180400, #  local_start 2017-03-26 03:00:00 (Sun)
  63631018800, #    local_end 2017-05-21 03:00:00 (Sun)
  3600,
  1,
  '+01',
      ],
      [
  63631015200, #    utc_start 2017-05-21 02:00:00 (Sun)
  63634644000, #      utc_end 2017-07-02 02:00:00 (Sun)
  63631015200, #  local_start 2017-05-21 02:00:00 (Sun)
  63634644000, #    local_end 2017-07-02 02:00:00 (Sun)
  0,
  0,
  '+00',
      ],
      [
  63634644000, #    utc_start 2017-07-02 02:00:00 (Sun)
  63644925600, #      utc_end 2017-10-29 02:00:00 (Sun)
  63634647600, #  local_start 2017-07-02 03:00:00 (Sun)
  63644929200, #    local_end 2017-10-29 03:00:00 (Sun)
  3600,
  1,
  '+01',
      ],
      [
  63644925600, #    utc_start 2017-10-29 02:00:00 (Sun)
  63657626400, #      utc_end 2018-03-25 02:00:00 (Sun)
  63644925600, #  local_start 2017-10-29 02:00:00 (Sun)
  63657626400, #    local_end 2018-03-25 02:00:00 (Sun)
  0,
  0,
  '+00',
      ],
      [
  63657626400, #    utc_start 2018-03-25 02:00:00 (Sun)
  63661860000, #      utc_end 2018-05-13 02:00:00 (Sun)
  63657630000, #  local_start 2018-03-25 03:00:00 (Sun)
  63661863600, #    local_end 2018-05-13 03:00:00 (Sun)
  3600,
  1,
  '+01',
      ],
      [
  63661860000, #    utc_start 2018-05-13 02:00:00 (Sun)
  63664884000, #      utc_end 2018-06-17 02:00:00 (Sun)
  63661860000, #  local_start 2018-05-13 02:00:00 (Sun)
  63664884000, #    local_end 2018-06-17 02:00:00 (Sun)
  0,
  0,
  '+00',
      ],
      [
  63664884000, #    utc_start 2018-06-17 02:00:00 (Sun)
  63676375200, #      utc_end 2018-10-28 02:00:00 (Sun)
  63664887600, #  local_start 2018-06-17 03:00:00 (Sun)
  63676378800, #    local_end 2018-10-28 03:00:00 (Sun)
  3600,
  1,
  '+01',
      ],
      [
  63676375200, #    utc_start 2018-10-28 02:00:00 (Sun)
  63692704800, #      utc_end 2019-05-05 02:00:00 (Sun)
  63676378800, #  local_start 2018-10-28 03:00:00 (Sun)
  63692708400, #    local_end 2019-05-05 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  63692704800, #    utc_start 2019-05-05 02:00:00 (Sun)
  63695728800, #      utc_end 2019-06-09 02:00:00 (Sun)
  63692704800, #  local_start 2019-05-05 02:00:00 (Sun)
  63695728800, #    local_end 2019-06-09 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63695728800, #    utc_start 2019-06-09 02:00:00 (Sun)
  63722944800, #      utc_end 2020-04-19 02:00:00 (Sun)
  63695732400, #  local_start 2019-06-09 03:00:00 (Sun)
  63722948400, #    local_end 2020-04-19 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  63722944800, #    utc_start 2020-04-19 02:00:00 (Sun)
  63725968800, #      utc_end 2020-05-24 02:00:00 (Sun)
  63722944800, #  local_start 2020-04-19 02:00:00 (Sun)
  63725968800, #    local_end 2020-05-24 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63725968800, #    utc_start 2020-05-24 02:00:00 (Sun)
  63753789600, #      utc_end 2021-04-11 02:00:00 (Sun)
  63725972400, #  local_start 2020-05-24 03:00:00 (Sun)
  63753793200, #    local_end 2021-04-11 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  63753789600, #    utc_start 2021-04-11 02:00:00 (Sun)
  63756813600, #      utc_end 2021-05-16 02:00:00 (Sun)
  63753789600, #  local_start 2021-04-11 02:00:00 (Sun)
  63756813600, #    local_end 2021-05-16 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63756813600, #    utc_start 2021-05-16 02:00:00 (Sun)
  63784029600, #      utc_end 2022-03-27 02:00:00 (Sun)
  63756817200, #  local_start 2021-05-16 03:00:00 (Sun)
  63784033200, #    local_end 2022-03-27 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  63784029600, #    utc_start 2022-03-27 02:00:00 (Sun)
  63787658400, #      utc_end 2022-05-08 02:00:00 (Sun)
  63784029600, #  local_start 2022-03-27 02:00:00 (Sun)
  63787658400, #    local_end 2022-05-08 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63787658400, #    utc_start 2022-05-08 02:00:00 (Sun)
  63814874400, #      utc_end 2023-03-19 02:00:00 (Sun)
  63787662000, #  local_start 2022-05-08 03:00:00 (Sun)
  63814878000, #    local_end 2023-03-19 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  63814874400, #    utc_start 2023-03-19 02:00:00 (Sun)
  63817898400, #      utc_end 2023-04-23 02:00:00 (Sun)
  63814874400, #  local_start 2023-03-19 02:00:00 (Sun)
  63817898400, #    local_end 2023-04-23 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63817898400, #    utc_start 2023-04-23 02:00:00 (Sun)
  63845719200, #      utc_end 2024-03-10 02:00:00 (Sun)
  63817902000, #  local_start 2023-04-23 03:00:00 (Sun)
  63845722800, #    local_end 2024-03-10 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  63845719200, #    utc_start 2024-03-10 02:00:00 (Sun)
  63848743200, #      utc_end 2024-04-14 02:00:00 (Sun)
  63845719200, #  local_start 2024-03-10 02:00:00 (Sun)
  63848743200, #    local_end 2024-04-14 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63848743200, #    utc_start 2024-04-14 02:00:00 (Sun)
  63875959200, #      utc_end 2025-02-23 02:00:00 (Sun)
  63848746800, #  local_start 2024-04-14 03:00:00 (Sun)
  63875962800, #    local_end 2025-02-23 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  63875959200, #    utc_start 2025-02-23 02:00:00 (Sun)
  63879588000, #      utc_end 2025-04-06 02:00:00 (Sun)
  63875959200, #  local_start 2025-02-23 02:00:00 (Sun)
  63879588000, #    local_end 2025-04-06 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63879588000, #    utc_start 2025-04-06 02:00:00 (Sun)
  63906804000, #      utc_end 2026-02-15 02:00:00 (Sun)
  63879591600, #  local_start 2025-04-06 03:00:00 (Sun)
  63906807600, #    local_end 2026-02-15 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  63906804000, #    utc_start 2026-02-15 02:00:00 (Sun)
  63909828000, #      utc_end 2026-03-22 02:00:00 (Sun)
  63906804000, #  local_start 2026-02-15 02:00:00 (Sun)
  63909828000, #    local_end 2026-03-22 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63909828000, #    utc_start 2026-03-22 02:00:00 (Sun)
  63937648800, #      utc_end 2027-02-07 02:00:00 (Sun)
  63909831600, #  local_start 2026-03-22 03:00:00 (Sun)
  63937652400, #    local_end 2027-02-07 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  63937648800, #    utc_start 2027-02-07 02:00:00 (Sun)
  63940672800, #      utc_end 2027-03-14 02:00:00 (Sun)
  63937648800, #  local_start 2027-02-07 02:00:00 (Sun)
  63940672800, #    local_end 2027-03-14 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63940672800, #    utc_start 2027-03-14 02:00:00 (Sun)
  63967888800, #      utc_end 2028-01-23 02:00:00 (Sun)
  63940676400, #  local_start 2027-03-14 03:00:00 (Sun)
  63967892400, #    local_end 2028-01-23 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  63967888800, #    utc_start 2028-01-23 02:00:00 (Sun)
  63970912800, #      utc_end 2028-02-27 02:00:00 (Sun)
  63967888800, #  local_start 2028-01-23 02:00:00 (Sun)
  63970912800, #    local_end 2028-02-27 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63970912800, #    utc_start 2028-02-27 02:00:00 (Sun)
  63998733600, #      utc_end 2029-01-14 02:00:00 (Sun)
  63970916400, #  local_start 2028-02-27 03:00:00 (Sun)
  63998737200, #    local_end 2029-01-14 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  63998733600, #    utc_start 2029-01-14 02:00:00 (Sun)
  64001757600, #      utc_end 2029-02-18 02:00:00 (Sun)
  63998733600, #  local_start 2029-01-14 02:00:00 (Sun)
  64001757600, #    local_end 2029-02-18 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  64001757600, #    utc_start 2029-02-18 02:00:00 (Sun)
  64028973600, #      utc_end 2029-12-30 02:00:00 (Sun)
  64001761200, #  local_start 2029-02-18 03:00:00 (Sun)
  64028977200, #    local_end 2029-12-30 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  64028973600, #    utc_start 2029-12-30 02:00:00 (Sun)
  64032602400, #      utc_end 2030-02-10 02:00:00 (Sun)
  64028973600, #  local_start 2029-12-30 02:00:00 (Sun)
  64032602400, #    local_end 2030-02-10 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  64032602400, #    utc_start 2030-02-10 02:00:00 (Sun)
  64059818400, #      utc_end 2030-12-22 02:00:00 (Sun)
  64032606000, #  local_start 2030-02-10 03:00:00 (Sun)
  64059822000, #    local_end 2030-12-22 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  64059818400, #    utc_start 2030-12-22 02:00:00 (Sun)
  64062842400, #      utc_end 2031-01-26 02:00:00 (Sun)
  64059818400, #  local_start 2030-12-22 02:00:00 (Sun)
  64062842400, #    local_end 2031-01-26 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  64062842400, #    utc_start 2031-01-26 02:00:00 (Sun)
  64090663200, #      utc_end 2031-12-14 02:00:00 (Sun)
  64062846000, #  local_start 2031-01-26 03:00:00 (Sun)
  64090666800, #    local_end 2031-12-14 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  64090663200, #    utc_start 2031-12-14 02:00:00 (Sun)
  64093687200, #      utc_end 2032-01-18 02:00:00 (Sun)
  64090663200, #  local_start 2031-12-14 02:00:00 (Sun)
  64093687200, #    local_end 2032-01-18 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  64093687200, #    utc_start 2032-01-18 02:00:00 (Sun)
  64120903200, #      utc_end 2032-11-28 02:00:00 (Sun)
  64093690800, #  local_start 2032-01-18 03:00:00 (Sun)
  64120906800, #    local_end 2032-11-28 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  64120903200, #    utc_start 2032-11-28 02:00:00 (Sun)
  64124532000, #      utc_end 2033-01-09 02:00:00 (Sun)
  64120903200, #  local_start 2032-11-28 02:00:00 (Sun)
  64124532000, #    local_end 2033-01-09 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  64124532000, #    utc_start 2033-01-09 02:00:00 (Sun)
  64151748000, #      utc_end 2033-11-20 02:00:00 (Sun)
  64124535600, #  local_start 2033-01-09 03:00:00 (Sun)
  64151751600, #    local_end 2033-11-20 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  64151748000, #    utc_start 2033-11-20 02:00:00 (Sun)
  64154772000, #      utc_end 2033-12-25 02:00:00 (Sun)
  64151748000, #  local_start 2033-11-20 02:00:00 (Sun)
  64154772000, #    local_end 2033-12-25 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  64154772000, #    utc_start 2033-12-25 02:00:00 (Sun)
  64181988000, #      utc_end 2034-11-05 02:00:00 (Sun)
  64154775600, #  local_start 2033-12-25 03:00:00 (Sun)
  64181991600, #    local_end 2034-11-05 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  64181988000, #    utc_start 2034-11-05 02:00:00 (Sun)
  64185616800, #      utc_end 2034-12-17 02:00:00 (Sun)
  64181988000, #  local_start 2034-11-05 02:00:00 (Sun)
  64185616800, #    local_end 2034-12-17 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  64185616800, #    utc_start 2034-12-17 02:00:00 (Sun)
  64212832800, #      utc_end 2035-10-28 02:00:00 (Sun)
  64185620400, #  local_start 2034-12-17 03:00:00 (Sun)
  64212836400, #    local_end 2035-10-28 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  64212832800, #    utc_start 2035-10-28 02:00:00 (Sun)
  64215856800, #      utc_end 2035-12-02 02:00:00 (Sun)
  64212832800, #  local_start 2035-10-28 02:00:00 (Sun)
  64215856800, #    local_end 2035-12-02 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  64215856800, #    utc_start 2035-12-02 02:00:00 (Sun)
  64243677600, #      utc_end 2036-10-19 02:00:00 (Sun)
  64215860400, #  local_start 2035-12-02 03:00:00 (Sun)
  64243681200, #    local_end 2036-10-19 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  64243677600, #    utc_start 2036-10-19 02:00:00 (Sun)
  64246701600, #      utc_end 2036-11-23 02:00:00 (Sun)
  64243677600, #  local_start 2036-10-19 02:00:00 (Sun)
  64246701600, #    local_end 2036-11-23 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  64246701600, #    utc_start 2036-11-23 02:00:00 (Sun)
  64273917600, #      utc_end 2037-10-04 02:00:00 (Sun)
  64246705200, #  local_start 2036-11-23 03:00:00 (Sun)
  64273921200, #    local_end 2037-10-04 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  64273917600, #    utc_start 2037-10-04 02:00:00 (Sun)
  64277546400, #      utc_end 2037-11-15 02:00:00 (Sun)
  64273917600, #  local_start 2037-10-04 02:00:00 (Sun)
  64277546400, #    local_end 2037-11-15 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  64277546400, #    utc_start 2037-11-15 02:00:00 (Sun)
  64304762400, #      utc_end 2038-09-26 02:00:00 (Sun)
  64277550000, #  local_start 2037-11-15 03:00:00 (Sun)
  64304766000, #    local_end 2038-09-26 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  64304762400, #    utc_start 2038-09-26 02:00:00 (Sun)
  64307786400, #      utc_end 2038-10-31 02:00:00 (Sun)
  64304762400, #  local_start 2038-09-26 02:00:00 (Sun)
  64307786400, #    local_end 2038-10-31 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  64307786400, #    utc_start 2038-10-31 02:00:00 (Sun)
  64335607200, #      utc_end 2039-09-18 02:00:00 (Sun)
  64307790000, #  local_start 2038-10-31 03:00:00 (Sun)
  64335610800, #    local_end 2039-09-18 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  64335607200, #    utc_start 2039-09-18 02:00:00 (Sun)
  64338631200, #      utc_end 2039-10-23 02:00:00 (Sun)
  64335607200, #  local_start 2039-09-18 02:00:00 (Sun)
  64338631200, #    local_end 2039-10-23 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  64338631200, #    utc_start 2039-10-23 02:00:00 (Sun)
  64365847200, #      utc_end 2040-09-02 02:00:00 (Sun)
  64338634800, #  local_start 2039-10-23 03:00:00 (Sun)
  64365850800, #    local_end 2040-09-02 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  64365847200, #    utc_start 2040-09-02 02:00:00 (Sun)
  64369476000, #      utc_end 2040-10-14 02:00:00 (Sun)
  64365847200, #  local_start 2040-09-02 02:00:00 (Sun)
  64369476000, #    local_end 2040-10-14 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  64369476000, #    utc_start 2040-10-14 02:00:00 (Sun)
  64396692000, #      utc_end 2041-08-25 02:00:00 (Sun)
  64369479600, #  local_start 2040-10-14 03:00:00 (Sun)
  64396695600, #    local_end 2041-08-25 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  64396692000, #    utc_start 2041-08-25 02:00:00 (Sun)
  64399716000, #      utc_end 2041-09-29 02:00:00 (Sun)
  64396692000, #  local_start 2041-08-25 02:00:00 (Sun)
  64399716000, #    local_end 2041-09-29 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  64399716000, #    utc_start 2041-09-29 02:00:00 (Sun)
  64426932000, #      utc_end 2042-08-10 02:00:00 (Sun)
  64399719600, #  local_start 2041-09-29 03:00:00 (Sun)
  64426935600, #    local_end 2042-08-10 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  64426932000, #    utc_start 2042-08-10 02:00:00 (Sun)
  64430560800, #      utc_end 2042-09-21 02:00:00 (Sun)
  64426932000, #  local_start 2042-08-10 02:00:00 (Sun)
  64430560800, #    local_end 2042-09-21 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  64430560800, #    utc_start 2042-09-21 02:00:00 (Sun)
  64457776800, #      utc_end 2043-08-02 02:00:00 (Sun)
  64430564400, #  local_start 2042-09-21 03:00:00 (Sun)
  64457780400, #    local_end 2043-08-02 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  64457776800, #    utc_start 2043-08-02 02:00:00 (Sun)
  64460800800, #      utc_end 2043-09-06 02:00:00 (Sun)
  64457776800, #  local_start 2043-08-02 02:00:00 (Sun)
  64460800800, #    local_end 2043-09-06 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  64460800800, #    utc_start 2043-09-06 02:00:00 (Sun)
  64488621600, #      utc_end 2044-07-24 02:00:00 (Sun)
  64460804400, #  local_start 2043-09-06 03:00:00 (Sun)
  64488625200, #    local_end 2044-07-24 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  64488621600, #    utc_start 2044-07-24 02:00:00 (Sun)
  64491645600, #      utc_end 2044-08-28 02:00:00 (Sun)
  64488621600, #  local_start 2044-07-24 02:00:00 (Sun)
  64491645600, #    local_end 2044-08-28 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  64491645600, #    utc_start 2044-08-28 02:00:00 (Sun)
  64518861600, #      utc_end 2045-07-09 02:00:00 (Sun)
  64491649200, #  local_start 2044-08-28 03:00:00 (Sun)
  64518865200, #    local_end 2045-07-09 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  64518861600, #    utc_start 2045-07-09 02:00:00 (Sun)
  64522490400, #      utc_end 2045-08-20 02:00:00 (Sun)
  64518861600, #  local_start 2045-07-09 02:00:00 (Sun)
  64522490400, #    local_end 2045-08-20 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  64522490400, #    utc_start 2045-08-20 02:00:00 (Sun)
  64549706400, #      utc_end 2046-07-01 02:00:00 (Sun)
  64522494000, #  local_start 2045-08-20 03:00:00 (Sun)
  64549710000, #    local_end 2046-07-01 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  64549706400, #    utc_start 2046-07-01 02:00:00 (Sun)
  64552730400, #      utc_end 2046-08-05 02:00:00 (Sun)
  64549706400, #  local_start 2046-07-01 02:00:00 (Sun)
  64552730400, #    local_end 2046-08-05 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  64552730400, #    utc_start 2046-08-05 02:00:00 (Sun)
  64580551200, #      utc_end 2047-06-23 02:00:00 (Sun)
  64552734000, #  local_start 2046-08-05 03:00:00 (Sun)
  64580554800, #    local_end 2047-06-23 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  64580551200, #    utc_start 2047-06-23 02:00:00 (Sun)
  64583575200, #      utc_end 2047-07-28 02:00:00 (Sun)
  64580551200, #  local_start 2047-06-23 02:00:00 (Sun)
  64583575200, #    local_end 2047-07-28 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  64583575200, #    utc_start 2047-07-28 02:00:00 (Sun)
  64610791200, #      utc_end 2048-06-07 02:00:00 (Sun)
  64583578800, #  local_start 2047-07-28 03:00:00 (Sun)
  64610794800, #    local_end 2048-06-07 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  64610791200, #    utc_start 2048-06-07 02:00:00 (Sun)
  64614420000, #      utc_end 2048-07-19 02:00:00 (Sun)
  64610791200, #  local_start 2048-06-07 02:00:00 (Sun)
  64614420000, #    local_end 2048-07-19 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  64614420000, #    utc_start 2048-07-19 02:00:00 (Sun)
  64641636000, #      utc_end 2049-05-30 02:00:00 (Sun)
  64614423600, #  local_start 2048-07-19 03:00:00 (Sun)
  64641639600, #    local_end 2049-05-30 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  64641636000, #    utc_start 2049-05-30 02:00:00 (Sun)
  64644660000, #      utc_end 2049-07-04 02:00:00 (Sun)
  64641636000, #  local_start 2049-05-30 02:00:00 (Sun)
  64644660000, #    local_end 2049-07-04 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  64644660000, #    utc_start 2049-07-04 02:00:00 (Sun)
  64671876000, #      utc_end 2050-05-15 02:00:00 (Sun)
  64644663600, #  local_start 2049-07-04 03:00:00 (Sun)
  64671879600, #    local_end 2050-05-15 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  64671876000, #    utc_start 2050-05-15 02:00:00 (Sun)
  64675504800, #      utc_end 2050-06-26 02:00:00 (Sun)
  64671876000, #  local_start 2050-05-15 02:00:00 (Sun)
  64675504800, #    local_end 2050-06-26 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  64675504800, #    utc_start 2050-06-26 02:00:00 (Sun)
  64702720800, #      utc_end 2051-05-07 02:00:00 (Sun)
  64675508400, #  local_start 2050-06-26 03:00:00 (Sun)
  64702724400, #    local_end 2051-05-07 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  64702720800, #    utc_start 2051-05-07 02:00:00 (Sun)
  64705744800, #      utc_end 2051-06-11 02:00:00 (Sun)
  64702720800, #  local_start 2051-05-07 02:00:00 (Sun)
  64705744800, #    local_end 2051-06-11 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  64705744800, #    utc_start 2051-06-11 02:00:00 (Sun)
  64733565600, #      utc_end 2052-04-28 02:00:00 (Sun)
  64705748400, #  local_start 2051-06-11 03:00:00 (Sun)
  64733569200, #    local_end 2052-04-28 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  64733565600, #    utc_start 2052-04-28 02:00:00 (Sun)
  64736589600, #      utc_end 2052-06-02 02:00:00 (Sun)
  64733565600, #  local_start 2052-04-28 02:00:00 (Sun)
  64736589600, #    local_end 2052-06-02 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  64736589600, #    utc_start 2052-06-02 02:00:00 (Sun)
  64763805600, #      utc_end 2053-04-13 02:00:00 (Sun)
  64736593200, #  local_start 2052-06-02 03:00:00 (Sun)
  64763809200, #    local_end 2053-04-13 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  64763805600, #    utc_start 2053-04-13 02:00:00 (Sun)
  64767434400, #      utc_end 2053-05-25 02:00:00 (Sun)
  64763805600, #  local_start 2053-04-13 02:00:00 (Sun)
  64767434400, #    local_end 2053-05-25 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  64767434400, #    utc_start 2053-05-25 02:00:00 (Sun)
  64794650400, #      utc_end 2054-04-05 02:00:00 (Sun)
  64767438000, #  local_start 2053-05-25 03:00:00 (Sun)
  64794654000, #    local_end 2054-04-05 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  64794650400, #    utc_start 2054-04-05 02:00:00 (Sun)
  64797674400, #      utc_end 2054-05-10 02:00:00 (Sun)
  64794650400, #  local_start 2054-04-05 02:00:00 (Sun)
  64797674400, #    local_end 2054-05-10 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  64797674400, #    utc_start 2054-05-10 02:00:00 (Sun)
  64825495200, #      utc_end 2055-03-28 02:00:00 (Sun)
  64797678000, #  local_start 2054-05-10 03:00:00 (Sun)
  64825498800, #    local_end 2055-03-28 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  64825495200, #    utc_start 2055-03-28 02:00:00 (Sun)
  64828519200, #      utc_end 2055-05-02 02:00:00 (Sun)
  64825495200, #  local_start 2055-03-28 02:00:00 (Sun)
  64828519200, #    local_end 2055-05-02 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  64828519200, #    utc_start 2055-05-02 02:00:00 (Sun)
  64855735200, #      utc_end 2056-03-12 02:00:00 (Sun)
  64828522800, #  local_start 2055-05-02 03:00:00 (Sun)
  64855738800, #    local_end 2056-03-12 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  64855735200, #    utc_start 2056-03-12 02:00:00 (Sun)
  64859364000, #      utc_end 2056-04-23 02:00:00 (Sun)
  64855735200, #  local_start 2056-03-12 02:00:00 (Sun)
  64859364000, #    local_end 2056-04-23 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  64859364000, #    utc_start 2056-04-23 02:00:00 (Sun)
  64886580000, #      utc_end 2057-03-04 02:00:00 (Sun)
  64859367600, #  local_start 2056-04-23 03:00:00 (Sun)
  64886583600, #    local_end 2057-03-04 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  64886580000, #    utc_start 2057-03-04 02:00:00 (Sun)
  64889604000, #      utc_end 2057-04-08 02:00:00 (Sun)
  64886580000, #  local_start 2057-03-04 02:00:00 (Sun)
  64889604000, #    local_end 2057-04-08 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  64889604000, #    utc_start 2057-04-08 02:00:00 (Sun)
  64916820000, #      utc_end 2058-02-17 02:00:00 (Sun)
  64889607600, #  local_start 2057-04-08 03:00:00 (Sun)
  64916823600, #    local_end 2058-02-17 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  64916820000, #    utc_start 2058-02-17 02:00:00 (Sun)
  64920448800, #      utc_end 2058-03-31 02:00:00 (Sun)
  64916820000, #  local_start 2058-02-17 02:00:00 (Sun)
  64920448800, #    local_end 2058-03-31 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  64920448800, #    utc_start 2058-03-31 02:00:00 (Sun)
  64947664800, #      utc_end 2059-02-09 02:00:00 (Sun)
  64920452400, #  local_start 2058-03-31 03:00:00 (Sun)
  64947668400, #    local_end 2059-02-09 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  64947664800, #    utc_start 2059-02-09 02:00:00 (Sun)
  64950688800, #      utc_end 2059-03-16 02:00:00 (Sun)
  64947664800, #  local_start 2059-02-09 02:00:00 (Sun)
  64950688800, #    local_end 2059-03-16 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  64950688800, #    utc_start 2059-03-16 02:00:00 (Sun)
  64978509600, #      utc_end 2060-02-01 02:00:00 (Sun)
  64950692400, #  local_start 2059-03-16 03:00:00 (Sun)
  64978513200, #    local_end 2060-02-01 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  64978509600, #    utc_start 2060-02-01 02:00:00 (Sun)
  64981533600, #      utc_end 2060-03-07 02:00:00 (Sun)
  64978509600, #  local_start 2060-02-01 02:00:00 (Sun)
  64981533600, #    local_end 2060-03-07 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  64981533600, #    utc_start 2060-03-07 02:00:00 (Sun)
  65008749600, #      utc_end 2061-01-16 02:00:00 (Sun)
  64981537200, #  local_start 2060-03-07 03:00:00 (Sun)
  65008753200, #    local_end 2061-01-16 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  65008749600, #    utc_start 2061-01-16 02:00:00 (Sun)
  65012378400, #      utc_end 2061-02-27 02:00:00 (Sun)
  65008749600, #  local_start 2061-01-16 02:00:00 (Sun)
  65012378400, #    local_end 2061-02-27 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  65012378400, #    utc_start 2061-02-27 02:00:00 (Sun)
  65039594400, #      utc_end 2062-01-08 02:00:00 (Sun)
  65012382000, #  local_start 2061-02-27 03:00:00 (Sun)
  65039598000, #    local_end 2062-01-08 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  65039594400, #    utc_start 2062-01-08 02:00:00 (Sun)
  65042618400, #      utc_end 2062-02-12 02:00:00 (Sun)
  65039594400, #  local_start 2062-01-08 02:00:00 (Sun)
  65042618400, #    local_end 2062-02-12 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  65042618400, #    utc_start 2062-02-12 02:00:00 (Sun)
  65070439200, #      utc_end 2062-12-31 02:00:00 (Sun)
  65042622000, #  local_start 2062-02-12 03:00:00 (Sun)
  65070442800, #    local_end 2062-12-31 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  65070439200, #    utc_start 2062-12-31 02:00:00 (Sun)
  65073463200, #      utc_end 2063-02-04 02:00:00 (Sun)
  65070439200, #  local_start 2062-12-31 02:00:00 (Sun)
  65073463200, #    local_end 2063-02-04 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  65073463200, #    utc_start 2063-02-04 02:00:00 (Sun)
  65100679200, #      utc_end 2063-12-16 02:00:00 (Sun)
  65073466800, #  local_start 2063-02-04 03:00:00 (Sun)
  65100682800, #    local_end 2063-12-16 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  65100679200, #    utc_start 2063-12-16 02:00:00 (Sun)
  65103703200, #      utc_end 2064-01-20 02:00:00 (Sun)
  65100679200, #  local_start 2063-12-16 02:00:00 (Sun)
  65103703200, #    local_end 2064-01-20 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  65103703200, #    utc_start 2064-01-20 02:00:00 (Sun)
  65131524000, #      utc_end 2064-12-07 02:00:00 (Sun)
  65103706800, #  local_start 2064-01-20 03:00:00 (Sun)
  65131527600, #    local_end 2064-12-07 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  65131524000, #    utc_start 2064-12-07 02:00:00 (Sun)
  65134548000, #      utc_end 2065-01-11 02:00:00 (Sun)
  65131524000, #  local_start 2064-12-07 02:00:00 (Sun)
  65134548000, #    local_end 2065-01-11 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  65134548000, #    utc_start 2065-01-11 02:00:00 (Sun)
  65161764000, #      utc_end 2065-11-22 02:00:00 (Sun)
  65134551600, #  local_start 2065-01-11 03:00:00 (Sun)
  65161767600, #    local_end 2065-11-22 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  65161764000, #    utc_start 2065-11-22 02:00:00 (Sun)
  65165392800, #      utc_end 2066-01-03 02:00:00 (Sun)
  65161764000, #  local_start 2065-11-22 02:00:00 (Sun)
  65165392800, #    local_end 2066-01-03 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  65165392800, #    utc_start 2066-01-03 02:00:00 (Sun)
  65192608800, #      utc_end 2066-11-14 02:00:00 (Sun)
  65165396400, #  local_start 2066-01-03 03:00:00 (Sun)
  65192612400, #    local_end 2066-11-14 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  65192608800, #    utc_start 2066-11-14 02:00:00 (Sun)
  65195632800, #      utc_end 2066-12-19 02:00:00 (Sun)
  65192608800, #  local_start 2066-11-14 02:00:00 (Sun)
  65195632800, #    local_end 2066-12-19 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  65195632800, #    utc_start 2066-12-19 02:00:00 (Sun)
  65223453600, #      utc_end 2067-11-06 02:00:00 (Sun)
  65195636400, #  local_start 2066-12-19 03:00:00 (Sun)
  65223457200, #    local_end 2067-11-06 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  65223453600, #    utc_start 2067-11-06 02:00:00 (Sun)
  65226477600, #      utc_end 2067-12-11 02:00:00 (Sun)
  65223453600, #  local_start 2067-11-06 02:00:00 (Sun)
  65226477600, #    local_end 2067-12-11 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  65226477600, #    utc_start 2067-12-11 02:00:00 (Sun)
  65253693600, #      utc_end 2068-10-21 02:00:00 (Sun)
  65226481200, #  local_start 2067-12-11 03:00:00 (Sun)
  65253697200, #    local_end 2068-10-21 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  65253693600, #    utc_start 2068-10-21 02:00:00 (Sun)
  65257322400, #      utc_end 2068-12-02 02:00:00 (Sun)
  65253693600, #  local_start 2068-10-21 02:00:00 (Sun)
  65257322400, #    local_end 2068-12-02 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  65257322400, #    utc_start 2068-12-02 02:00:00 (Sun)
  65284538400, #      utc_end 2069-10-13 02:00:00 (Sun)
  65257326000, #  local_start 2068-12-02 03:00:00 (Sun)
  65284542000, #    local_end 2069-10-13 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  65284538400, #    utc_start 2069-10-13 02:00:00 (Sun)
  65287562400, #      utc_end 2069-11-17 02:00:00 (Sun)
  65284538400, #  local_start 2069-10-13 02:00:00 (Sun)
  65287562400, #    local_end 2069-11-17 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  65287562400, #    utc_start 2069-11-17 02:00:00 (Sun)
  65315383200, #      utc_end 2070-10-05 02:00:00 (Sun)
  65287566000, #  local_start 2069-11-17 03:00:00 (Sun)
  65315386800, #    local_end 2070-10-05 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  65315383200, #    utc_start 2070-10-05 02:00:00 (Sun)
  65318407200, #      utc_end 2070-11-09 02:00:00 (Sun)
  65315383200, #  local_start 2070-10-05 02:00:00 (Sun)
  65318407200, #    local_end 2070-11-09 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  65318407200, #    utc_start 2070-11-09 02:00:00 (Sun)
  65345623200, #      utc_end 2071-09-20 02:00:00 (Sun)
  65318410800, #  local_start 2070-11-09 03:00:00 (Sun)
  65345626800, #    local_end 2071-09-20 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  65345623200, #    utc_start 2071-09-20 02:00:00 (Sun)
  65348647200, #      utc_end 2071-10-25 02:00:00 (Sun)
  65345623200, #  local_start 2071-09-20 02:00:00 (Sun)
  65348647200, #    local_end 2071-10-25 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  65348647200, #    utc_start 2071-10-25 02:00:00 (Sun)
  65376468000, #      utc_end 2072-09-11 02:00:00 (Sun)
  65348650800, #  local_start 2071-10-25 03:00:00 (Sun)
  65376471600, #    local_end 2072-09-11 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  65376468000, #    utc_start 2072-09-11 02:00:00 (Sun)
  65379492000, #      utc_end 2072-10-16 02:00:00 (Sun)
  65376468000, #  local_start 2072-09-11 02:00:00 (Sun)
  65379492000, #    local_end 2072-10-16 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  65379492000, #    utc_start 2072-10-16 02:00:00 (Sun)
  65406708000, #      utc_end 2073-08-27 02:00:00 (Sun)
  65379495600, #  local_start 2072-10-16 03:00:00 (Sun)
  65406711600, #    local_end 2073-08-27 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  65406708000, #    utc_start 2073-08-27 02:00:00 (Sun)
  65410336800, #      utc_end 2073-10-08 02:00:00 (Sun)
  65406708000, #  local_start 2073-08-27 02:00:00 (Sun)
  65410336800, #    local_end 2073-10-08 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  65410336800, #    utc_start 2073-10-08 02:00:00 (Sun)
  65437552800, #      utc_end 2074-08-19 02:00:00 (Sun)
  65410340400, #  local_start 2073-10-08 03:00:00 (Sun)
  65437556400, #    local_end 2074-08-19 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  65437552800, #    utc_start 2074-08-19 02:00:00 (Sun)
  65440576800, #      utc_end 2074-09-23 02:00:00 (Sun)
  65437552800, #  local_start 2074-08-19 02:00:00 (Sun)
  65440576800, #    local_end 2074-09-23 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  65440576800, #    utc_start 2074-09-23 02:00:00 (Sun)
  65468397600, #      utc_end 2075-08-11 02:00:00 (Sun)
  65440580400, #  local_start 2074-09-23 03:00:00 (Sun)
  65468401200, #    local_end 2075-08-11 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  65468397600, #    utc_start 2075-08-11 02:00:00 (Sun)
  65471421600, #      utc_end 2075-09-15 02:00:00 (Sun)
  65468397600, #  local_start 2075-08-11 02:00:00 (Sun)
  65471421600, #    local_end 2075-09-15 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  65471421600, #    utc_start 2075-09-15 02:00:00 (Sun)
  65498637600, #      utc_end 2076-07-26 02:00:00 (Sun)
  65471425200, #  local_start 2075-09-15 03:00:00 (Sun)
  65498641200, #    local_end 2076-07-26 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  65498637600, #    utc_start 2076-07-26 02:00:00 (Sun)
  65502266400, #      utc_end 2076-09-06 02:00:00 (Sun)
  65498637600, #  local_start 2076-07-26 02:00:00 (Sun)
  65502266400, #    local_end 2076-09-06 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  65502266400, #    utc_start 2076-09-06 02:00:00 (Sun)
  65529482400, #      utc_end 2077-07-18 02:00:00 (Sun)
  65502270000, #  local_start 2076-09-06 03:00:00 (Sun)
  65529486000, #    local_end 2077-07-18 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  65529482400, #    utc_start 2077-07-18 02:00:00 (Sun)
  65532506400, #      utc_end 2077-08-22 02:00:00 (Sun)
  65529482400, #  local_start 2077-07-18 02:00:00 (Sun)
  65532506400, #    local_end 2077-08-22 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  65532506400, #    utc_start 2077-08-22 02:00:00 (Sun)
  65560327200, #      utc_end 2078-07-10 02:00:00 (Sun)
  65532510000, #  local_start 2077-08-22 03:00:00 (Sun)
  65560330800, #    local_end 2078-07-10 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  65560327200, #    utc_start 2078-07-10 02:00:00 (Sun)
  65563351200, #      utc_end 2078-08-14 02:00:00 (Sun)
  65560327200, #  local_start 2078-07-10 02:00:00 (Sun)
  65563351200, #    local_end 2078-08-14 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  65563351200, #    utc_start 2078-08-14 02:00:00 (Sun)
  65590567200, #      utc_end 2079-06-25 02:00:00 (Sun)
  65563354800, #  local_start 2078-08-14 03:00:00 (Sun)
  65590570800, #    local_end 2079-06-25 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  65590567200, #    utc_start 2079-06-25 02:00:00 (Sun)
  65593591200, #      utc_end 2079-07-30 02:00:00 (Sun)
  65590567200, #  local_start 2079-06-25 02:00:00 (Sun)
  65593591200, #    local_end 2079-07-30 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  65593591200, #    utc_start 2079-07-30 02:00:00 (Sun)
  65621412000, #      utc_end 2080-06-16 02:00:00 (Sun)
  65593594800, #  local_start 2079-07-30 03:00:00 (Sun)
  65621415600, #    local_end 2080-06-16 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  65621412000, #    utc_start 2080-06-16 02:00:00 (Sun)
  65624436000, #      utc_end 2080-07-21 02:00:00 (Sun)
  65621412000, #  local_start 2080-06-16 02:00:00 (Sun)
  65624436000, #    local_end 2080-07-21 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  65624436000, #    utc_start 2080-07-21 02:00:00 (Sun)
  65651652000, #      utc_end 2081-06-01 02:00:00 (Sun)
  65624439600, #  local_start 2080-07-21 03:00:00 (Sun)
  65651655600, #    local_end 2081-06-01 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  65651652000, #    utc_start 2081-06-01 02:00:00 (Sun)
  65655280800, #      utc_end 2081-07-13 02:00:00 (Sun)
  65651652000, #  local_start 2081-06-01 02:00:00 (Sun)
  65655280800, #    local_end 2081-07-13 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  65655280800, #    utc_start 2081-07-13 02:00:00 (Sun)
  65682496800, #      utc_end 2082-05-24 02:00:00 (Sun)
  65655284400, #  local_start 2081-07-13 03:00:00 (Sun)
  65682500400, #    local_end 2082-05-24 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  65682496800, #    utc_start 2082-05-24 02:00:00 (Sun)
  65685520800, #      utc_end 2082-06-28 02:00:00 (Sun)
  65682496800, #  local_start 2082-05-24 02:00:00 (Sun)
  65685520800, #    local_end 2082-06-28 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  65685520800, #    utc_start 2082-06-28 02:00:00 (Sun)
  65713341600, #      utc_end 2083-05-16 02:00:00 (Sun)
  65685524400, #  local_start 2082-06-28 03:00:00 (Sun)
  65713345200, #    local_end 2083-05-16 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  65713341600, #    utc_start 2083-05-16 02:00:00 (Sun)
  65716365600, #      utc_end 2083-06-20 02:00:00 (Sun)
  65713341600, #  local_start 2083-05-16 02:00:00 (Sun)
  65716365600, #    local_end 2083-06-20 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  65716365600, #    utc_start 2083-06-20 02:00:00 (Sun)
  65743581600, #      utc_end 2084-04-30 02:00:00 (Sun)
  65716369200, #  local_start 2083-06-20 03:00:00 (Sun)
  65743585200, #    local_end 2084-04-30 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  65743581600, #    utc_start 2084-04-30 02:00:00 (Sun)
  65747210400, #      utc_end 2084-06-11 02:00:00 (Sun)
  65743581600, #  local_start 2084-04-30 02:00:00 (Sun)
  65747210400, #    local_end 2084-06-11 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  65747210400, #    utc_start 2084-06-11 02:00:00 (Sun)
  65774426400, #      utc_end 2085-04-22 02:00:00 (Sun)
  65747214000, #  local_start 2084-06-11 03:00:00 (Sun)
  65774430000, #    local_end 2085-04-22 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  65774426400, #    utc_start 2085-04-22 02:00:00 (Sun)
  65777450400, #      utc_end 2085-05-27 02:00:00 (Sun)
  65774426400, #  local_start 2085-04-22 02:00:00 (Sun)
  65777450400, #    local_end 2085-05-27 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  65777450400, #    utc_start 2085-05-27 02:00:00 (Sun)
  65805271200, #      utc_end 2086-04-14 02:00:00 (Sun)
  65777454000, #  local_start 2085-05-27 03:00:00 (Sun)
  65805274800, #    local_end 2086-04-14 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  65805271200, #    utc_start 2086-04-14 02:00:00 (Sun)
  65808295200, #      utc_end 2086-05-19 02:00:00 (Sun)
  65805271200, #  local_start 2086-04-14 02:00:00 (Sun)
  65808295200, #    local_end 2086-05-19 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  65808295200, #    utc_start 2086-05-19 02:00:00 (Sun)
  65835511200, #      utc_end 2087-03-30 02:00:00 (Sun)
  65808298800, #  local_start 2086-05-19 03:00:00 (Sun)
  65835514800, #    local_end 2087-03-30 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  65835511200, #    utc_start 2087-03-30 02:00:00 (Sun)
  65838535200, #      utc_end 2087-05-04 02:00:00 (Sun)
  65835511200, #  local_start 2087-03-30 02:00:00 (Sun)
  65838535200, #    local_end 2087-05-04 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  65838535200, #    utc_start 2087-05-04 02:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #      utc_end
  65838538800, #  local_start 2087-05-04 03:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  3600,
  0,
  '+01',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {97}
  
  sub _max_year {2087}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AFRICA_CASABLANCA

    $main::fatpacked{"DateTime/TimeZone/Africa/Ceuta.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AFRICA_CEUTA';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Africa::Ceuta;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Africa::Ceuta::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59958230400, #      utc_end 1901-01-01 00:00:00 (Tue)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59958229124, #    local_end 1900-12-31 23:38:44 (Mon)
  -1276,
  0,
  'LMT',
      ],
      [
  59958230400, #    utc_start 1901-01-01 00:00:00 (Tue)
  60505570800, #      utc_end 1918-05-06 23:00:00 (Mon)
  59958230400, #  local_start 1901-01-01 00:00:00 (Tue)
  60505570800, #    local_end 1918-05-06 23:00:00 (Mon)
  0,
  0,
  'WET',
      ],
      [
  60505570800, #    utc_start 1918-05-06 23:00:00 (Mon)
  60518872800, #      utc_end 1918-10-07 22:00:00 (Mon)
  60505574400, #  local_start 1918-05-07 00:00:00 (Tue)
  60518876400, #    local_end 1918-10-07 23:00:00 (Mon)
  3600,
  1,
  'WEST',
      ],
      [
  60518872800, #    utc_start 1918-10-07 22:00:00 (Mon)
  60683990400, #      utc_end 1924-01-01 00:00:00 (Tue)
  60518872800, #  local_start 1918-10-07 22:00:00 (Mon)
  60683990400, #    local_end 1924-01-01 00:00:00 (Tue)
  0,
  0,
  'WET',
      ],
      [
  60683990400, #    utc_start 1924-01-01 00:00:00 (Tue)
  60693231600, #      utc_end 1924-04-16 23:00:00 (Wed)
  60683990400, #  local_start 1924-01-01 00:00:00 (Tue)
  60693231600, #    local_end 1924-04-16 23:00:00 (Wed)
  0,
  0,
  'WET',
      ],
      [
  60693231600, #    utc_start 1924-04-16 23:00:00 (Wed)
  60708009600, #      utc_end 1924-10-05 00:00:00 (Sun)
  60693235200, #  local_start 1924-04-17 00:00:00 (Thu)
  60708013200, #    local_end 1924-10-05 01:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60708009600, #    utc_start 1924-10-05 00:00:00 (Sun)
  60756390000, #      utc_end 1926-04-17 23:00:00 (Sat)
  60708009600, #  local_start 1924-10-05 00:00:00 (Sun)
  60756390000, #    local_end 1926-04-17 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  60756390000, #    utc_start 1926-04-17 23:00:00 (Sat)
  60770908800, #      utc_end 1926-10-03 00:00:00 (Sun)
  60756393600, #  local_start 1926-04-18 00:00:00 (Sun)
  60770912400, #    local_end 1926-10-03 01:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60770908800, #    utc_start 1926-10-03 00:00:00 (Sun)
  60787234800, #      utc_end 1927-04-09 23:00:00 (Sat)
  60770908800, #  local_start 1926-10-03 00:00:00 (Sun)
  60787234800, #    local_end 1927-04-09 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  60787234800, #    utc_start 1927-04-09 23:00:00 (Sat)
  60802358400, #      utc_end 1927-10-02 00:00:00 (Sun)
  60787238400, #  local_start 1927-04-10 00:00:00 (Sun)
  60802362000, #    local_end 1927-10-02 01:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60802358400, #    utc_start 1927-10-02 00:00:00 (Sun)
  60819292800, #      utc_end 1928-04-15 00:00:00 (Sun)
  60802358400, #  local_start 1927-10-02 00:00:00 (Sun)
  60819292800, #    local_end 1928-04-15 00:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  60819292800, #    utc_start 1928-04-15 00:00:00 (Sun)
  60834412800, #      utc_end 1928-10-07 00:00:00 (Sun)
  60819296400, #  local_start 1928-04-15 01:00:00 (Sun)
  60834416400, #    local_end 1928-10-07 01:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60834412800, #    utc_start 1928-10-07 00:00:00 (Sun)
  60841843200, #      utc_end 1929-01-01 00:00:00 (Tue)
  60834412800, #  local_start 1928-10-07 00:00:00 (Sun)
  60841843200, #    local_end 1929-01-01 00:00:00 (Tue)
  0,
  0,
  'WET',
      ],
      [
  60841843200, #    utc_start 1929-01-01 00:00:00 (Tue)
  62040988800, #      utc_end 1967-01-01 00:00:00 (Sun)
  60841843200, #  local_start 1929-01-01 00:00:00 (Tue)
  62040988800, #    local_end 1967-01-01 00:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62040988800, #    utc_start 1967-01-01 00:00:00 (Sun)
  62054251200, #      utc_end 1967-06-03 12:00:00 (Sat)
  62040988800, #  local_start 1967-01-01 00:00:00 (Sun)
  62054251200, #    local_end 1967-06-03 12:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  62054251200, #    utc_start 1967-06-03 12:00:00 (Sat)
  62064572400, #      utc_end 1967-09-30 23:00:00 (Sat)
  62054254800, #  local_start 1967-06-03 13:00:00 (Sat)
  62064576000, #    local_end 1967-10-01 00:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62064572400, #    utc_start 1967-09-30 23:00:00 (Sat)
  62276947200, #      utc_end 1974-06-24 00:00:00 (Mon)
  62064572400, #  local_start 1967-09-30 23:00:00 (Sat)
  62276947200, #    local_end 1974-06-24 00:00:00 (Mon)
  0,
  0,
  'WET',
      ],
      [
  62276947200, #    utc_start 1974-06-24 00:00:00 (Mon)
  62282905200, #      utc_end 1974-08-31 23:00:00 (Sat)
  62276950800, #  local_start 1974-06-24 01:00:00 (Mon)
  62282908800, #    local_end 1974-09-01 00:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62282905200, #    utc_start 1974-08-31 23:00:00 (Sat)
  62335440000, #      utc_end 1976-05-01 00:00:00 (Sat)
  62282905200, #  local_start 1974-08-31 23:00:00 (Sat)
  62335440000, #    local_end 1976-05-01 00:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  62335440000, #    utc_start 1976-05-01 00:00:00 (Sat)
  62343385200, #      utc_end 1976-07-31 23:00:00 (Sat)
  62335443600, #  local_start 1976-05-01 01:00:00 (Sat)
  62343388800, #    local_end 1976-08-01 00:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62343385200, #    utc_start 1976-07-31 23:00:00 (Sat)
  62366976000, #      utc_end 1977-05-01 00:00:00 (Sun)
  62343385200, #  local_start 1976-07-31 23:00:00 (Sat)
  62366976000, #    local_end 1977-05-01 00:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62366976000, #    utc_start 1977-05-01 00:00:00 (Sun)
  62379932400, #      utc_end 1977-09-27 23:00:00 (Tue)
  62366979600, #  local_start 1977-05-01 01:00:00 (Sun)
  62379936000, #    local_end 1977-09-28 00:00:00 (Wed)
  3600,
  1,
  'WEST',
      ],
      [
  62379932400, #    utc_start 1977-09-27 23:00:00 (Tue)
  62401190400, #      utc_end 1978-06-01 00:00:00 (Thu)
  62379932400, #  local_start 1977-09-27 23:00:00 (Tue)
  62401190400, #    local_end 1978-06-01 00:00:00 (Thu)
  0,
  0,
  'WET',
      ],
      [
  62401190400, #    utc_start 1978-06-01 00:00:00 (Thu)
  62406716400, #      utc_end 1978-08-03 23:00:00 (Thu)
  62401194000, #  local_start 1978-06-01 01:00:00 (Thu)
  62406720000, #    local_end 1978-08-04 00:00:00 (Fri)
  3600,
  1,
  'WEST',
      ],
      [
  62406716400, #    utc_start 1978-08-03 23:00:00 (Thu)
  62583926400, #      utc_end 1984-03-16 00:00:00 (Fri)
  62406716400, #  local_start 1978-08-03 23:00:00 (Thu)
  62583926400, #    local_end 1984-03-16 00:00:00 (Fri)
  0,
  0,
  'WET',
      ],
      [
  62583926400, #    utc_start 1984-03-16 00:00:00 (Fri)
  62640601200, #      utc_end 1985-12-31 23:00:00 (Tue)
  62583930000, #  local_start 1984-03-16 01:00:00 (Fri)
  62640604800, #    local_end 1986-01-01 00:00:00 (Wed)
  3600,
  0,
  'CET',
      ],
      [
  62640601200, #    utc_start 1985-12-31 23:00:00 (Tue)
  62648211600, #      utc_end 1986-03-30 01:00:00 (Sun)
  62640604800, #  local_start 1986-01-01 00:00:00 (Wed)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62648211600, #    utc_start 1986-03-30 01:00:00 (Sun)
  62663936400, #      utc_end 1986-09-28 01:00:00 (Sun)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62663936400, #    utc_start 1986-09-28 01:00:00 (Sun)
  62679661200, #      utc_end 1987-03-29 01:00:00 (Sun)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62679661200, #    utc_start 1987-03-29 01:00:00 (Sun)
  62695386000, #      utc_end 1987-09-27 01:00:00 (Sun)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62695386000, #    utc_start 1987-09-27 01:00:00 (Sun)
  62711110800, #      utc_end 1988-03-27 01:00:00 (Sun)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62711110800, #    utc_start 1988-03-27 01:00:00 (Sun)
  62726835600, #      utc_end 1988-09-25 01:00:00 (Sun)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62726835600, #    utc_start 1988-09-25 01:00:00 (Sun)
  62742560400, #      utc_end 1989-03-26 01:00:00 (Sun)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62742560400, #    utc_start 1989-03-26 01:00:00 (Sun)
  62758285200, #      utc_end 1989-09-24 01:00:00 (Sun)
  62742567600, #  local_start 1989-03-26 03:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62758285200, #    utc_start 1989-09-24 01:00:00 (Sun)
  62774010000, #      utc_end 1990-03-25 01:00:00 (Sun)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62774010000, #    utc_start 1990-03-25 01:00:00 (Sun)
  62790339600, #      utc_end 1990-09-30 01:00:00 (Sun)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62790339600, #    utc_start 1990-09-30 01:00:00 (Sun)
  62806064400, #      utc_end 1991-03-31 01:00:00 (Sun)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62806064400, #    utc_start 1991-03-31 01:00:00 (Sun)
  62821789200, #      utc_end 1991-09-29 01:00:00 (Sun)
  62806071600, #  local_start 1991-03-31 03:00:00 (Sun)
  62821796400, #    local_end 1991-09-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62821789200, #    utc_start 1991-09-29 01:00:00 (Sun)
  62837514000, #      utc_end 1992-03-29 01:00:00 (Sun)
  62821792800, #  local_start 1991-09-29 02:00:00 (Sun)
  62837517600, #    local_end 1992-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62837514000, #    utc_start 1992-03-29 01:00:00 (Sun)
  62853238800, #      utc_end 1992-09-27 01:00:00 (Sun)
  62837521200, #  local_start 1992-03-29 03:00:00 (Sun)
  62853246000, #    local_end 1992-09-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62853238800, #    utc_start 1992-09-27 01:00:00 (Sun)
  62868963600, #      utc_end 1993-03-28 01:00:00 (Sun)
  62853242400, #  local_start 1992-09-27 02:00:00 (Sun)
  62868967200, #    local_end 1993-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62868963600, #    utc_start 1993-03-28 01:00:00 (Sun)
  62884688400, #      utc_end 1993-09-26 01:00:00 (Sun)
  62868970800, #  local_start 1993-03-28 03:00:00 (Sun)
  62884695600, #    local_end 1993-09-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62884688400, #    utc_start 1993-09-26 01:00:00 (Sun)
  62900413200, #      utc_end 1994-03-27 01:00:00 (Sun)
  62884692000, #  local_start 1993-09-26 02:00:00 (Sun)
  62900416800, #    local_end 1994-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62900413200, #    utc_start 1994-03-27 01:00:00 (Sun)
  62916138000, #      utc_end 1994-09-25 01:00:00 (Sun)
  62900420400, #  local_start 1994-03-27 03:00:00 (Sun)
  62916145200, #    local_end 1994-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62916138000, #    utc_start 1994-09-25 01:00:00 (Sun)
  62931862800, #      utc_end 1995-03-26 01:00:00 (Sun)
  62916141600, #  local_start 1994-09-25 02:00:00 (Sun)
  62931866400, #    local_end 1995-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62931862800, #    utc_start 1995-03-26 01:00:00 (Sun)
  62947587600, #      utc_end 1995-09-24 01:00:00 (Sun)
  62931870000, #  local_start 1995-03-26 03:00:00 (Sun)
  62947594800, #    local_end 1995-09-24 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62947587600, #    utc_start 1995-09-24 01:00:00 (Sun)
  62963917200, #      utc_end 1996-03-31 01:00:00 (Sun)
  62947591200, #  local_start 1995-09-24 02:00:00 (Sun)
  62963920800, #    local_end 1996-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62963917200, #    utc_start 1996-03-31 01:00:00 (Sun)
  62982061200, #      utc_end 1996-10-27 01:00:00 (Sun)
  62963924400, #  local_start 1996-03-31 03:00:00 (Sun)
  62982068400, #    local_end 1996-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62982061200, #    utc_start 1996-10-27 01:00:00 (Sun)
  62995366800, #      utc_end 1997-03-30 01:00:00 (Sun)
  62982064800, #  local_start 1996-10-27 02:00:00 (Sun)
  62995370400, #    local_end 1997-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62995366800, #    utc_start 1997-03-30 01:00:00 (Sun)
  63013510800, #      utc_end 1997-10-26 01:00:00 (Sun)
  62995374000, #  local_start 1997-03-30 03:00:00 (Sun)
  63013518000, #    local_end 1997-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63013510800, #    utc_start 1997-10-26 01:00:00 (Sun)
  63026816400, #      utc_end 1998-03-29 01:00:00 (Sun)
  63013514400, #  local_start 1997-10-26 02:00:00 (Sun)
  63026820000, #    local_end 1998-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63026816400, #    utc_start 1998-03-29 01:00:00 (Sun)
  63044960400, #      utc_end 1998-10-25 01:00:00 (Sun)
  63026823600, #  local_start 1998-03-29 03:00:00 (Sun)
  63044967600, #    local_end 1998-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63044960400, #    utc_start 1998-10-25 01:00:00 (Sun)
  63058266000, #      utc_end 1999-03-28 01:00:00 (Sun)
  63044964000, #  local_start 1998-10-25 02:00:00 (Sun)
  63058269600, #    local_end 1999-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63058266000, #    utc_start 1999-03-28 01:00:00 (Sun)
  63077014800, #      utc_end 1999-10-31 01:00:00 (Sun)
  63058273200, #  local_start 1999-03-28 03:00:00 (Sun)
  63077022000, #    local_end 1999-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63077014800, #    utc_start 1999-10-31 01:00:00 (Sun)
  63089715600, #      utc_end 2000-03-26 01:00:00 (Sun)
  63077018400, #  local_start 1999-10-31 02:00:00 (Sun)
  63089719200, #    local_end 2000-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63089715600, #    utc_start 2000-03-26 01:00:00 (Sun)
  63108464400, #      utc_end 2000-10-29 01:00:00 (Sun)
  63089722800, #  local_start 2000-03-26 03:00:00 (Sun)
  63108471600, #    local_end 2000-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63108464400, #    utc_start 2000-10-29 01:00:00 (Sun)
  63121165200, #      utc_end 2001-03-25 01:00:00 (Sun)
  63108468000, #  local_start 2000-10-29 02:00:00 (Sun)
  63121168800, #    local_end 2001-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63121165200, #    utc_start 2001-03-25 01:00:00 (Sun)
  63139914000, #      utc_end 2001-10-28 01:00:00 (Sun)
  63121172400, #  local_start 2001-03-25 03:00:00 (Sun)
  63139921200, #    local_end 2001-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63139914000, #    utc_start 2001-10-28 01:00:00 (Sun)
  63153219600, #      utc_end 2002-03-31 01:00:00 (Sun)
  63139917600, #  local_start 2001-10-28 02:00:00 (Sun)
  63153223200, #    local_end 2002-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63153219600, #    utc_start 2002-03-31 01:00:00 (Sun)
  63171363600, #      utc_end 2002-10-27 01:00:00 (Sun)
  63153226800, #  local_start 2002-03-31 03:00:00 (Sun)
  63171370800, #    local_end 2002-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63171363600, #    utc_start 2002-10-27 01:00:00 (Sun)
  63184669200, #      utc_end 2003-03-30 01:00:00 (Sun)
  63171367200, #  local_start 2002-10-27 02:00:00 (Sun)
  63184672800, #    local_end 2003-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63184669200, #    utc_start 2003-03-30 01:00:00 (Sun)
  63202813200, #      utc_end 2003-10-26 01:00:00 (Sun)
  63184676400, #  local_start 2003-03-30 03:00:00 (Sun)
  63202820400, #    local_end 2003-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63202813200, #    utc_start 2003-10-26 01:00:00 (Sun)
  63216118800, #      utc_end 2004-03-28 01:00:00 (Sun)
  63202816800, #  local_start 2003-10-26 02:00:00 (Sun)
  63216122400, #    local_end 2004-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63216118800, #    utc_start 2004-03-28 01:00:00 (Sun)
  63234867600, #      utc_end 2004-10-31 01:00:00 (Sun)
  63216126000, #  local_start 2004-03-28 03:00:00 (Sun)
  63234874800, #    local_end 2004-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63234867600, #    utc_start 2004-10-31 01:00:00 (Sun)
  63247568400, #      utc_end 2005-03-27 01:00:00 (Sun)
  63234871200, #  local_start 2004-10-31 02:00:00 (Sun)
  63247572000, #    local_end 2005-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63247568400, #    utc_start 2005-03-27 01:00:00 (Sun)
  63266317200, #      utc_end 2005-10-30 01:00:00 (Sun)
  63247575600, #  local_start 2005-03-27 03:00:00 (Sun)
  63266324400, #    local_end 2005-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63266317200, #    utc_start 2005-10-30 01:00:00 (Sun)
  63279018000, #      utc_end 2006-03-26 01:00:00 (Sun)
  63266320800, #  local_start 2005-10-30 02:00:00 (Sun)
  63279021600, #    local_end 2006-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63279018000, #    utc_start 2006-03-26 01:00:00 (Sun)
  63297766800, #      utc_end 2006-10-29 01:00:00 (Sun)
  63279025200, #  local_start 2006-03-26 03:00:00 (Sun)
  63297774000, #    local_end 2006-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63297766800, #    utc_start 2006-10-29 01:00:00 (Sun)
  63310467600, #      utc_end 2007-03-25 01:00:00 (Sun)
  63297770400, #  local_start 2006-10-29 02:00:00 (Sun)
  63310471200, #    local_end 2007-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63310467600, #    utc_start 2007-03-25 01:00:00 (Sun)
  63329216400, #      utc_end 2007-10-28 01:00:00 (Sun)
  63310474800, #  local_start 2007-03-25 03:00:00 (Sun)
  63329223600, #    local_end 2007-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63329216400, #    utc_start 2007-10-28 01:00:00 (Sun)
  63342522000, #      utc_end 2008-03-30 01:00:00 (Sun)
  63329220000, #  local_start 2007-10-28 02:00:00 (Sun)
  63342525600, #    local_end 2008-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63342522000, #    utc_start 2008-03-30 01:00:00 (Sun)
  63360666000, #      utc_end 2008-10-26 01:00:00 (Sun)
  63342529200, #  local_start 2008-03-30 03:00:00 (Sun)
  63360673200, #    local_end 2008-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63360666000, #    utc_start 2008-10-26 01:00:00 (Sun)
  63373971600, #      utc_end 2009-03-29 01:00:00 (Sun)
  63360669600, #  local_start 2008-10-26 02:00:00 (Sun)
  63373975200, #    local_end 2009-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63373971600, #    utc_start 2009-03-29 01:00:00 (Sun)
  63392115600, #      utc_end 2009-10-25 01:00:00 (Sun)
  63373978800, #  local_start 2009-03-29 03:00:00 (Sun)
  63392122800, #    local_end 2009-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63392115600, #    utc_start 2009-10-25 01:00:00 (Sun)
  63405421200, #      utc_end 2010-03-28 01:00:00 (Sun)
  63392119200, #  local_start 2009-10-25 02:00:00 (Sun)
  63405424800, #    local_end 2010-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63405421200, #    utc_start 2010-03-28 01:00:00 (Sun)
  63424170000, #      utc_end 2010-10-31 01:00:00 (Sun)
  63405428400, #  local_start 2010-03-28 03:00:00 (Sun)
  63424177200, #    local_end 2010-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63424170000, #    utc_start 2010-10-31 01:00:00 (Sun)
  63436870800, #      utc_end 2011-03-27 01:00:00 (Sun)
  63424173600, #  local_start 2010-10-31 02:00:00 (Sun)
  63436874400, #    local_end 2011-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63436870800, #    utc_start 2011-03-27 01:00:00 (Sun)
  63455619600, #      utc_end 2011-10-30 01:00:00 (Sun)
  63436878000, #  local_start 2011-03-27 03:00:00 (Sun)
  63455626800, #    local_end 2011-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63455619600, #    utc_start 2011-10-30 01:00:00 (Sun)
  63468320400, #      utc_end 2012-03-25 01:00:00 (Sun)
  63455623200, #  local_start 2011-10-30 02:00:00 (Sun)
  63468324000, #    local_end 2012-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63468320400, #    utc_start 2012-03-25 01:00:00 (Sun)
  63487069200, #      utc_end 2012-10-28 01:00:00 (Sun)
  63468327600, #  local_start 2012-03-25 03:00:00 (Sun)
  63487076400, #    local_end 2012-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63487069200, #    utc_start 2012-10-28 01:00:00 (Sun)
  63500374800, #      utc_end 2013-03-31 01:00:00 (Sun)
  63487072800, #  local_start 2012-10-28 02:00:00 (Sun)
  63500378400, #    local_end 2013-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63500374800, #    utc_start 2013-03-31 01:00:00 (Sun)
  63518518800, #      utc_end 2013-10-27 01:00:00 (Sun)
  63500382000, #  local_start 2013-03-31 03:00:00 (Sun)
  63518526000, #    local_end 2013-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63518518800, #    utc_start 2013-10-27 01:00:00 (Sun)
  63531824400, #      utc_end 2014-03-30 01:00:00 (Sun)
  63518522400, #  local_start 2013-10-27 02:00:00 (Sun)
  63531828000, #    local_end 2014-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63531824400, #    utc_start 2014-03-30 01:00:00 (Sun)
  63549968400, #      utc_end 2014-10-26 01:00:00 (Sun)
  63531831600, #  local_start 2014-03-30 03:00:00 (Sun)
  63549975600, #    local_end 2014-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63549968400, #    utc_start 2014-10-26 01:00:00 (Sun)
  63563274000, #      utc_end 2015-03-29 01:00:00 (Sun)
  63549972000, #  local_start 2014-10-26 02:00:00 (Sun)
  63563277600, #    local_end 2015-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63563274000, #    utc_start 2015-03-29 01:00:00 (Sun)
  63581418000, #      utc_end 2015-10-25 01:00:00 (Sun)
  63563281200, #  local_start 2015-03-29 03:00:00 (Sun)
  63581425200, #    local_end 2015-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63581418000, #    utc_start 2015-10-25 01:00:00 (Sun)
  63594723600, #      utc_end 2016-03-27 01:00:00 (Sun)
  63581421600, #  local_start 2015-10-25 02:00:00 (Sun)
  63594727200, #    local_end 2016-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63594723600, #    utc_start 2016-03-27 01:00:00 (Sun)
  63613472400, #      utc_end 2016-10-30 01:00:00 (Sun)
  63594730800, #  local_start 2016-03-27 03:00:00 (Sun)
  63613479600, #    local_end 2016-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63613472400, #    utc_start 2016-10-30 01:00:00 (Sun)
  63626173200, #      utc_end 2017-03-26 01:00:00 (Sun)
  63613476000, #  local_start 2016-10-30 02:00:00 (Sun)
  63626176800, #    local_end 2017-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63626173200, #    utc_start 2017-03-26 01:00:00 (Sun)
  63644922000, #      utc_end 2017-10-29 01:00:00 (Sun)
  63626180400, #  local_start 2017-03-26 03:00:00 (Sun)
  63644929200, #    local_end 2017-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63644922000, #    utc_start 2017-10-29 01:00:00 (Sun)
  63657622800, #      utc_end 2018-03-25 01:00:00 (Sun)
  63644925600, #  local_start 2017-10-29 02:00:00 (Sun)
  63657626400, #    local_end 2018-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63657622800, #    utc_start 2018-03-25 01:00:00 (Sun)
  63676371600, #      utc_end 2018-10-28 01:00:00 (Sun)
  63657630000, #  local_start 2018-03-25 03:00:00 (Sun)
  63676378800, #    local_end 2018-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63676371600, #    utc_start 2018-10-28 01:00:00 (Sun)
  63689677200, #      utc_end 2019-03-31 01:00:00 (Sun)
  63676375200, #  local_start 2018-10-28 02:00:00 (Sun)
  63689680800, #    local_end 2019-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63689677200, #    utc_start 2019-03-31 01:00:00 (Sun)
  63707821200, #      utc_end 2019-10-27 01:00:00 (Sun)
  63689684400, #  local_start 2019-03-31 03:00:00 (Sun)
  63707828400, #    local_end 2019-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63707821200, #    utc_start 2019-10-27 01:00:00 (Sun)
  63721126800, #      utc_end 2020-03-29 01:00:00 (Sun)
  63707824800, #  local_start 2019-10-27 02:00:00 (Sun)
  63721130400, #    local_end 2020-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63721126800, #    utc_start 2020-03-29 01:00:00 (Sun)
  63739270800, #      utc_end 2020-10-25 01:00:00 (Sun)
  63721134000, #  local_start 2020-03-29 03:00:00 (Sun)
  63739278000, #    local_end 2020-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63739270800, #    utc_start 2020-10-25 01:00:00 (Sun)
  63752576400, #      utc_end 2021-03-28 01:00:00 (Sun)
  63739274400, #  local_start 2020-10-25 02:00:00 (Sun)
  63752580000, #    local_end 2021-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63752576400, #    utc_start 2021-03-28 01:00:00 (Sun)
  63771325200, #      utc_end 2021-10-31 01:00:00 (Sun)
  63752583600, #  local_start 2021-03-28 03:00:00 (Sun)
  63771332400, #    local_end 2021-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63771325200, #    utc_start 2021-10-31 01:00:00 (Sun)
  63784026000, #      utc_end 2022-03-27 01:00:00 (Sun)
  63771328800, #  local_start 2021-10-31 02:00:00 (Sun)
  63784029600, #    local_end 2022-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63784026000, #    utc_start 2022-03-27 01:00:00 (Sun)
  63802774800, #      utc_end 2022-10-30 01:00:00 (Sun)
  63784033200, #  local_start 2022-03-27 03:00:00 (Sun)
  63802782000, #    local_end 2022-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63802774800, #    utc_start 2022-10-30 01:00:00 (Sun)
  63815475600, #      utc_end 2023-03-26 01:00:00 (Sun)
  63802778400, #  local_start 2022-10-30 02:00:00 (Sun)
  63815479200, #    local_end 2023-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63815475600, #    utc_start 2023-03-26 01:00:00 (Sun)
  63834224400, #      utc_end 2023-10-29 01:00:00 (Sun)
  63815482800, #  local_start 2023-03-26 03:00:00 (Sun)
  63834231600, #    local_end 2023-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63834224400, #    utc_start 2023-10-29 01:00:00 (Sun)
  63847530000, #      utc_end 2024-03-31 01:00:00 (Sun)
  63834228000, #  local_start 2023-10-29 02:00:00 (Sun)
  63847533600, #    local_end 2024-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63847530000, #    utc_start 2024-03-31 01:00:00 (Sun)
  63865674000, #      utc_end 2024-10-27 01:00:00 (Sun)
  63847537200, #  local_start 2024-03-31 03:00:00 (Sun)
  63865681200, #    local_end 2024-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63865674000, #    utc_start 2024-10-27 01:00:00 (Sun)
  63878979600, #      utc_end 2025-03-30 01:00:00 (Sun)
  63865677600, #  local_start 2024-10-27 02:00:00 (Sun)
  63878983200, #    local_end 2025-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63878979600, #    utc_start 2025-03-30 01:00:00 (Sun)
  63897123600, #      utc_end 2025-10-26 01:00:00 (Sun)
  63878986800, #  local_start 2025-03-30 03:00:00 (Sun)
  63897130800, #    local_end 2025-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63897123600, #    utc_start 2025-10-26 01:00:00 (Sun)
  63910429200, #      utc_end 2026-03-29 01:00:00 (Sun)
  63897127200, #  local_start 2025-10-26 02:00:00 (Sun)
  63910432800, #    local_end 2026-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63910429200, #    utc_start 2026-03-29 01:00:00 (Sun)
  63928573200, #      utc_end 2026-10-25 01:00:00 (Sun)
  63910436400, #  local_start 2026-03-29 03:00:00 (Sun)
  63928580400, #    local_end 2026-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63928573200, #    utc_start 2026-10-25 01:00:00 (Sun)
  63941878800, #      utc_end 2027-03-28 01:00:00 (Sun)
  63928576800, #  local_start 2026-10-25 02:00:00 (Sun)
  63941882400, #    local_end 2027-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63941878800, #    utc_start 2027-03-28 01:00:00 (Sun)
  63960627600, #      utc_end 2027-10-31 01:00:00 (Sun)
  63941886000, #  local_start 2027-03-28 03:00:00 (Sun)
  63960634800, #    local_end 2027-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63960627600, #    utc_start 2027-10-31 01:00:00 (Sun)
  63973328400, #      utc_end 2028-03-26 01:00:00 (Sun)
  63960631200, #  local_start 2027-10-31 02:00:00 (Sun)
  63973332000, #    local_end 2028-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63973328400, #    utc_start 2028-03-26 01:00:00 (Sun)
  63992077200, #      utc_end 2028-10-29 01:00:00 (Sun)
  63973335600, #  local_start 2028-03-26 03:00:00 (Sun)
  63992084400, #    local_end 2028-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63992077200, #    utc_start 2028-10-29 01:00:00 (Sun)
  64004778000, #      utc_end 2029-03-25 01:00:00 (Sun)
  63992080800, #  local_start 2028-10-29 02:00:00 (Sun)
  64004781600, #    local_end 2029-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  64004778000, #    utc_start 2029-03-25 01:00:00 (Sun)
  64023526800, #      utc_end 2029-10-28 01:00:00 (Sun)
  64004785200, #  local_start 2029-03-25 03:00:00 (Sun)
  64023534000, #    local_end 2029-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  64023526800, #    utc_start 2029-10-28 01:00:00 (Sun)
  64036832400, #      utc_end 2030-03-31 01:00:00 (Sun)
  64023530400, #  local_start 2029-10-28 02:00:00 (Sun)
  64036836000, #    local_end 2030-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  64036832400, #    utc_start 2030-03-31 01:00:00 (Sun)
  64054976400, #      utc_end 2030-10-27 01:00:00 (Sun)
  64036839600, #  local_start 2030-03-31 03:00:00 (Sun)
  64054983600, #    local_end 2030-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {55}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { 3600 }
  
  my $last_observance = bless( {
    'format' => 'CE%sT',
    'gmtoff' => '1:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 725007,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 725007,
      'utc_rd_secs' => 0,
      'utc_year' => 1987
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => 3600,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 725006,
      'local_rd_secs' => 82800,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 725006,
      'utc_rd_secs' => 82800,
      'utc_year' => 1986
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '1:00u',
      'from' => '1996',
      'in' => 'Oct',
      'letter' => '',
      'name' => 'EU',
      'offset_from_std' => 0,
      'on' => 'lastSun',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '1:00u',
      'from' => '1981',
      'in' => 'Mar',
      'letter' => 'S',
      'name' => 'EU',
      'offset_from_std' => 3600,
      'on' => 'lastSun',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AFRICA_CEUTA

    $main::fatpacked{"DateTime/TimeZone/Africa/El_Aaiun.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AFRICA_EL_AAIUN';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/africa.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Africa::El_Aaiun;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Africa::El_Aaiun::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60999612768, #      utc_end 1934-01-01 00:52:48 (Mon)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60999609600, #    local_end 1934-01-01 00:00:00 (Mon)
  -3168,
  0,
  'LMT',
      ],
      [
  60999612768, #    utc_start 1934-01-01 00:52:48 (Mon)
  62333974800, #      utc_end 1976-04-14 01:00:00 (Wed)
  60999609168, #  local_start 1933-12-31 23:52:48 (Sun)
  62333971200, #    local_end 1976-04-14 00:00:00 (Wed)
  -3600,
  0,
  '-01',
      ],
      [
  62333974800, #    utc_start 1976-04-14 01:00:00 (Wed)
  62335440000, #      utc_end 1976-05-01 00:00:00 (Sat)
  62333974800, #  local_start 1976-04-14 01:00:00 (Wed)
  62335440000, #    local_end 1976-05-01 00:00:00 (Sat)
  0,
  0,
  '+00',
      ],
      [
  62335440000, #    utc_start 1976-05-01 00:00:00 (Sat)
  62343385200, #      utc_end 1976-07-31 23:00:00 (Sat)
  62335443600, #  local_start 1976-05-01 01:00:00 (Sat)
  62343388800, #    local_end 1976-08-01 00:00:00 (Sun)
  3600,
  1,
  '+01',
      ],
      [
  62343385200, #    utc_start 1976-07-31 23:00:00 (Sat)
  62366976000, #      utc_end 1977-05-01 00:00:00 (Sun)
  62343385200, #  local_start 1976-07-31 23:00:00 (Sat)
  62366976000, #    local_end 1977-05-01 00:00:00 (Sun)
  0,
  0,
  '+00',
      ],
      [
  62366976000, #    utc_start 1977-05-01 00:00:00 (Sun)
  62379932400, #      utc_end 1977-09-27 23:00:00 (Tue)
  62366979600, #  local_start 1977-05-01 01:00:00 (Sun)
  62379936000, #    local_end 1977-09-28 00:00:00 (Wed)
  3600,
  1,
  '+01',
      ],
      [
  62379932400, #    utc_start 1977-09-27 23:00:00 (Tue)
  62401190400, #      utc_end 1978-06-01 00:00:00 (Thu)
  62379932400, #  local_start 1977-09-27 23:00:00 (Tue)
  62401190400, #    local_end 1978-06-01 00:00:00 (Thu)
  0,
  0,
  '+00',
      ],
      [
  62401190400, #    utc_start 1978-06-01 00:00:00 (Thu)
  62406716400, #      utc_end 1978-08-03 23:00:00 (Thu)
  62401194000, #  local_start 1978-06-01 01:00:00 (Thu)
  62406720000, #    local_end 1978-08-04 00:00:00 (Fri)
  3600,
  1,
  '+01',
      ],
      [
  62406716400, #    utc_start 1978-08-03 23:00:00 (Thu)
  63347961600, #      utc_end 2008-06-01 00:00:00 (Sun)
  62406716400, #  local_start 1978-08-03 23:00:00 (Thu)
  63347961600, #    local_end 2008-06-01 00:00:00 (Sun)
  0,
  0,
  '+00',
      ],
      [
  63347961600, #    utc_start 2008-06-01 00:00:00 (Sun)
  63355906800, #      utc_end 2008-08-31 23:00:00 (Sun)
  63347965200, #  local_start 2008-06-01 01:00:00 (Sun)
  63355910400, #    local_end 2008-09-01 00:00:00 (Mon)
  3600,
  1,
  '+01',
      ],
      [
  63355906800, #    utc_start 2008-08-31 23:00:00 (Sun)
  63379497600, #      utc_end 2009-06-01 00:00:00 (Mon)
  63355906800, #  local_start 2008-08-31 23:00:00 (Sun)
  63379497600, #    local_end 2009-06-01 00:00:00 (Mon)
  0,
  0,
  '+00',
      ],
      [
  63379497600, #    utc_start 2009-06-01 00:00:00 (Mon)
  63386492400, #      utc_end 2009-08-20 23:00:00 (Thu)
  63379501200, #  local_start 2009-06-01 01:00:00 (Mon)
  63386496000, #    local_end 2009-08-21 00:00:00 (Fri)
  3600,
  1,
  '+01',
      ],
      [
  63386492400, #    utc_start 2009-08-20 23:00:00 (Thu)
  63408441600, #      utc_end 2010-05-02 00:00:00 (Sun)
  63386492400, #  local_start 2009-08-20 23:00:00 (Thu)
  63408441600, #    local_end 2010-05-02 00:00:00 (Sun)
  0,
  0,
  '+00',
      ],
      [
  63408441600, #    utc_start 2010-05-02 00:00:00 (Sun)
  63416905200, #      utc_end 2010-08-07 23:00:00 (Sat)
  63408445200, #  local_start 2010-05-02 01:00:00 (Sun)
  63416908800, #    local_end 2010-08-08 00:00:00 (Sun)
  3600,
  1,
  '+01',
      ],
      [
  63416905200, #    utc_start 2010-08-07 23:00:00 (Sat)
  63437472000, #      utc_end 2011-04-03 00:00:00 (Sun)
  63416905200, #  local_start 2010-08-07 23:00:00 (Sat)
  63437472000, #    local_end 2011-04-03 00:00:00 (Sun)
  0,
  0,
  '+00',
      ],
      [
  63437472000, #    utc_start 2011-04-03 00:00:00 (Sun)
  63447750000, #      utc_end 2011-07-30 23:00:00 (Sat)
  63437475600, #  local_start 2011-04-03 01:00:00 (Sun)
  63447753600, #    local_end 2011-07-31 00:00:00 (Sun)
  3600,
  1,
  '+01',
      ],
      [
  63447750000, #    utc_start 2011-07-30 23:00:00 (Sat)
  63471348000, #      utc_end 2012-04-29 02:00:00 (Sun)
  63447750000, #  local_start 2011-07-30 23:00:00 (Sat)
  63471348000, #    local_end 2012-04-29 02:00:00 (Sun)
  0,
  0,
  '+00',
      ],
      [
  63471348000, #    utc_start 2012-04-29 02:00:00 (Sun)
  63478432800, #      utc_end 2012-07-20 02:00:00 (Fri)
  63471351600, #  local_start 2012-04-29 03:00:00 (Sun)
  63478436400, #    local_end 2012-07-20 03:00:00 (Fri)
  3600,
  1,
  '+01',
      ],
      [
  63478432800, #    utc_start 2012-07-20 02:00:00 (Fri)
  63481111200, #      utc_end 2012-08-20 02:00:00 (Mon)
  63478432800, #  local_start 2012-07-20 02:00:00 (Fri)
  63481111200, #    local_end 2012-08-20 02:00:00 (Mon)
  0,
  0,
  '+00',
      ],
      [
  63481111200, #    utc_start 2012-08-20 02:00:00 (Mon)
  63484653600, #      utc_end 2012-09-30 02:00:00 (Sun)
  63481114800, #  local_start 2012-08-20 03:00:00 (Mon)
  63484657200, #    local_end 2012-09-30 03:00:00 (Sun)
  3600,
  1,
  '+01',
      ],
      [
  63484653600, #    utc_start 2012-09-30 02:00:00 (Sun)
  63502797600, #      utc_end 2013-04-28 02:00:00 (Sun)
  63484653600, #  local_start 2012-09-30 02:00:00 (Sun)
  63502797600, #    local_end 2013-04-28 02:00:00 (Sun)
  0,
  0,
  '+00',
      ],
      [
  63502797600, #    utc_start 2013-04-28 02:00:00 (Sun)
  63508845600, #      utc_end 2013-07-07 02:00:00 (Sun)
  63502801200, #  local_start 2013-04-28 03:00:00 (Sun)
  63508849200, #    local_end 2013-07-07 03:00:00 (Sun)
  3600,
  1,
  '+01',
      ],
      [
  63508845600, #    utc_start 2013-07-07 02:00:00 (Sun)
  63511783200, #      utc_end 2013-08-10 02:00:00 (Sat)
  63508845600, #  local_start 2013-07-07 02:00:00 (Sun)
  63511783200, #    local_end 2013-08-10 02:00:00 (Sat)
  0,
  0,
  '+00',
      ],
      [
  63511783200, #    utc_start 2013-08-10 02:00:00 (Sat)
  63518522400, #      utc_end 2013-10-27 02:00:00 (Sun)
  63511786800, #  local_start 2013-08-10 03:00:00 (Sat)
  63518526000, #    local_end 2013-10-27 03:00:00 (Sun)
  3600,
  1,
  '+01',
      ],
      [
  63518522400, #    utc_start 2013-10-27 02:00:00 (Sun)
  63531828000, #      utc_end 2014-03-30 02:00:00 (Sun)
  63518522400, #  local_start 2013-10-27 02:00:00 (Sun)
  63531828000, #    local_end 2014-03-30 02:00:00 (Sun)
  0,
  0,
  '+00',
      ],
      [
  63531828000, #    utc_start 2014-03-30 02:00:00 (Sun)
  63539604000, #      utc_end 2014-06-28 02:00:00 (Sat)
  63531831600, #  local_start 2014-03-30 03:00:00 (Sun)
  63539607600, #    local_end 2014-06-28 03:00:00 (Sat)
  3600,
  1,
  '+01',
      ],
      [
  63539604000, #    utc_start 2014-06-28 02:00:00 (Sat)
  63542628000, #      utc_end 2014-08-02 02:00:00 (Sat)
  63539604000, #  local_start 2014-06-28 02:00:00 (Sat)
  63542628000, #    local_end 2014-08-02 02:00:00 (Sat)
  0,
  0,
  '+00',
      ],
      [
  63542628000, #    utc_start 2014-08-02 02:00:00 (Sat)
  63549972000, #      utc_end 2014-10-26 02:00:00 (Sun)
  63542631600, #  local_start 2014-08-02 03:00:00 (Sat)
  63549975600, #    local_end 2014-10-26 03:00:00 (Sun)
  3600,
  1,
  '+01',
      ],
      [
  63549972000, #    utc_start 2014-10-26 02:00:00 (Sun)
  63563277600, #      utc_end 2015-03-29 02:00:00 (Sun)
  63549972000, #  local_start 2014-10-26 02:00:00 (Sun)
  63563277600, #    local_end 2015-03-29 02:00:00 (Sun)
  0,
  0,
  '+00',
      ],
      [
  63563277600, #    utc_start 2015-03-29 02:00:00 (Sun)
  63569930400, #      utc_end 2015-06-14 02:00:00 (Sun)
  63563281200, #  local_start 2015-03-29 03:00:00 (Sun)
  63569934000, #    local_end 2015-06-14 03:00:00 (Sun)
  3600,
  1,
  '+01',
      ],
      [
  63569930400, #    utc_start 2015-06-14 02:00:00 (Sun)
  63572954400, #      utc_end 2015-07-19 02:00:00 (Sun)
  63569930400, #  local_start 2015-06-14 02:00:00 (Sun)
  63572954400, #    local_end 2015-07-19 02:00:00 (Sun)
  0,
  0,
  '+00',
      ],
      [
  63572954400, #    utc_start 2015-07-19 02:00:00 (Sun)
  63581421600, #      utc_end 2015-10-25 02:00:00 (Sun)
  63572958000, #  local_start 2015-07-19 03:00:00 (Sun)
  63581425200, #    local_end 2015-10-25 03:00:00 (Sun)
  3600,
  1,
  '+01',
      ],
      [
  63581421600, #    utc_start 2015-10-25 02:00:00 (Sun)
  63594727200, #      utc_end 2016-03-27 02:00:00 (Sun)
  63581421600, #  local_start 2015-10-25 02:00:00 (Sun)
  63594727200, #    local_end 2016-03-27 02:00:00 (Sun)
  0,
  0,
  '+00',
      ],
      [
  63594727200, #    utc_start 2016-03-27 02:00:00 (Sun)
  63600775200, #      utc_end 2016-06-05 02:00:00 (Sun)
  63594730800, #  local_start 2016-03-27 03:00:00 (Sun)
  63600778800, #    local_end 2016-06-05 03:00:00 (Sun)
  3600,
  1,
  '+01',
      ],
      [
  63600775200, #    utc_start 2016-06-05 02:00:00 (Sun)
  63603799200, #      utc_end 2016-07-10 02:00:00 (Sun)
  63600775200, #  local_start 2016-06-05 02:00:00 (Sun)
  63603799200, #    local_end 2016-07-10 02:00:00 (Sun)
  0,
  0,
  '+00',
      ],
      [
  63603799200, #    utc_start 2016-07-10 02:00:00 (Sun)
  63613476000, #      utc_end 2016-10-30 02:00:00 (Sun)
  63603802800, #  local_start 2016-07-10 03:00:00 (Sun)
  63613479600, #    local_end 2016-10-30 03:00:00 (Sun)
  3600,
  1,
  '+01',
      ],
      [
  63613476000, #    utc_start 2016-10-30 02:00:00 (Sun)
  63626176800, #      utc_end 2017-03-26 02:00:00 (Sun)
  63613476000, #  local_start 2016-10-30 02:00:00 (Sun)
  63626176800, #    local_end 2017-03-26 02:00:00 (Sun)
  0,
  0,
  '+00',
      ],
      [
  63626176800, #    utc_start 2017-03-26 02:00:00 (Sun)
  63631015200, #      utc_end 2017-05-21 02:00:00 (Sun)
  63626180400, #  local_start 2017-03-26 03:00:00 (Sun)
  63631018800, #    local_end 2017-05-21 03:00:00 (Sun)
  3600,
  1,
  '+01',
      ],
      [
  63631015200, #    utc_start 2017-05-21 02:00:00 (Sun)
  63634644000, #      utc_end 2017-07-02 02:00:00 (Sun)
  63631015200, #  local_start 2017-05-21 02:00:00 (Sun)
  63634644000, #    local_end 2017-07-02 02:00:00 (Sun)
  0,
  0,
  '+00',
      ],
      [
  63634644000, #    utc_start 2017-07-02 02:00:00 (Sun)
  63644925600, #      utc_end 2017-10-29 02:00:00 (Sun)
  63634647600, #  local_start 2017-07-02 03:00:00 (Sun)
  63644929200, #    local_end 2017-10-29 03:00:00 (Sun)
  3600,
  1,
  '+01',
      ],
      [
  63644925600, #    utc_start 2017-10-29 02:00:00 (Sun)
  63657626400, #      utc_end 2018-03-25 02:00:00 (Sun)
  63644925600, #  local_start 2017-10-29 02:00:00 (Sun)
  63657626400, #    local_end 2018-03-25 02:00:00 (Sun)
  0,
  0,
  '+00',
      ],
      [
  63657626400, #    utc_start 2018-03-25 02:00:00 (Sun)
  63661860000, #      utc_end 2018-05-13 02:00:00 (Sun)
  63657630000, #  local_start 2018-03-25 03:00:00 (Sun)
  63661863600, #    local_end 2018-05-13 03:00:00 (Sun)
  3600,
  1,
  '+01',
      ],
      [
  63661860000, #    utc_start 2018-05-13 02:00:00 (Sun)
  63664884000, #      utc_end 2018-06-17 02:00:00 (Sun)
  63661860000, #  local_start 2018-05-13 02:00:00 (Sun)
  63664884000, #    local_end 2018-06-17 02:00:00 (Sun)
  0,
  0,
  '+00',
      ],
      [
  63664884000, #    utc_start 2018-06-17 02:00:00 (Sun)
  63676375200, #      utc_end 2018-10-28 02:00:00 (Sun)
  63664887600, #  local_start 2018-06-17 03:00:00 (Sun)
  63676378800, #    local_end 2018-10-28 03:00:00 (Sun)
  3600,
  1,
  '+01',
      ],
      [
  63676375200, #    utc_start 2018-10-28 02:00:00 (Sun)
  63692704800, #      utc_end 2019-05-05 02:00:00 (Sun)
  63676378800, #  local_start 2018-10-28 03:00:00 (Sun)
  63692708400, #    local_end 2019-05-05 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  63692704800, #    utc_start 2019-05-05 02:00:00 (Sun)
  63695728800, #      utc_end 2019-06-09 02:00:00 (Sun)
  63692704800, #  local_start 2019-05-05 02:00:00 (Sun)
  63695728800, #    local_end 2019-06-09 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63695728800, #    utc_start 2019-06-09 02:00:00 (Sun)
  63722944800, #      utc_end 2020-04-19 02:00:00 (Sun)
  63695732400, #  local_start 2019-06-09 03:00:00 (Sun)
  63722948400, #    local_end 2020-04-19 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  63722944800, #    utc_start 2020-04-19 02:00:00 (Sun)
  63725968800, #      utc_end 2020-05-24 02:00:00 (Sun)
  63722944800, #  local_start 2020-04-19 02:00:00 (Sun)
  63725968800, #    local_end 2020-05-24 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63725968800, #    utc_start 2020-05-24 02:00:00 (Sun)
  63753789600, #      utc_end 2021-04-11 02:00:00 (Sun)
  63725972400, #  local_start 2020-05-24 03:00:00 (Sun)
  63753793200, #    local_end 2021-04-11 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  63753789600, #    utc_start 2021-04-11 02:00:00 (Sun)
  63756813600, #      utc_end 2021-05-16 02:00:00 (Sun)
  63753789600, #  local_start 2021-04-11 02:00:00 (Sun)
  63756813600, #    local_end 2021-05-16 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63756813600, #    utc_start 2021-05-16 02:00:00 (Sun)
  63784029600, #      utc_end 2022-03-27 02:00:00 (Sun)
  63756817200, #  local_start 2021-05-16 03:00:00 (Sun)
  63784033200, #    local_end 2022-03-27 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  63784029600, #    utc_start 2022-03-27 02:00:00 (Sun)
  63787658400, #      utc_end 2022-05-08 02:00:00 (Sun)
  63784029600, #  local_start 2022-03-27 02:00:00 (Sun)
  63787658400, #    local_end 2022-05-08 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63787658400, #    utc_start 2022-05-08 02:00:00 (Sun)
  63814874400, #      utc_end 2023-03-19 02:00:00 (Sun)
  63787662000, #  local_start 2022-05-08 03:00:00 (Sun)
  63814878000, #    local_end 2023-03-19 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  63814874400, #    utc_start 2023-03-19 02:00:00 (Sun)
  63817898400, #      utc_end 2023-04-23 02:00:00 (Sun)
  63814874400, #  local_start 2023-03-19 02:00:00 (Sun)
  63817898400, #    local_end 2023-04-23 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63817898400, #    utc_start 2023-04-23 02:00:00 (Sun)
  63845719200, #      utc_end 2024-03-10 02:00:00 (Sun)
  63817902000, #  local_start 2023-04-23 03:00:00 (Sun)
  63845722800, #    local_end 2024-03-10 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  63845719200, #    utc_start 2024-03-10 02:00:00 (Sun)
  63848743200, #      utc_end 2024-04-14 02:00:00 (Sun)
  63845719200, #  local_start 2024-03-10 02:00:00 (Sun)
  63848743200, #    local_end 2024-04-14 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63848743200, #    utc_start 2024-04-14 02:00:00 (Sun)
  63875959200, #      utc_end 2025-02-23 02:00:00 (Sun)
  63848746800, #  local_start 2024-04-14 03:00:00 (Sun)
  63875962800, #    local_end 2025-02-23 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  63875959200, #    utc_start 2025-02-23 02:00:00 (Sun)
  63879588000, #      utc_end 2025-04-06 02:00:00 (Sun)
  63875959200, #  local_start 2025-02-23 02:00:00 (Sun)
  63879588000, #    local_end 2025-04-06 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63879588000, #    utc_start 2025-04-06 02:00:00 (Sun)
  63906804000, #      utc_end 2026-02-15 02:00:00 (Sun)
  63879591600, #  local_start 2025-04-06 03:00:00 (Sun)
  63906807600, #    local_end 2026-02-15 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  63906804000, #    utc_start 2026-02-15 02:00:00 (Sun)
  63909828000, #      utc_end 2026-03-22 02:00:00 (Sun)
  63906804000, #  local_start 2026-02-15 02:00:00 (Sun)
  63909828000, #    local_end 2026-03-22 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63909828000, #    utc_start 2026-03-22 02:00:00 (Sun)
  63937648800, #      utc_end 2027-02-07 02:00:00 (Sun)
  63909831600, #  local_start 2026-03-22 03:00:00 (Sun)
  63937652400, #    local_end 2027-02-07 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  63937648800, #    utc_start 2027-02-07 02:00:00 (Sun)
  63940672800, #      utc_end 2027-03-14 02:00:00 (Sun)
  63937648800, #  local_start 2027-02-07 02:00:00 (Sun)
  63940672800, #    local_end 2027-03-14 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63940672800, #    utc_start 2027-03-14 02:00:00 (Sun)
  63967888800, #      utc_end 2028-01-23 02:00:00 (Sun)
  63940676400, #  local_start 2027-03-14 03:00:00 (Sun)
  63967892400, #    local_end 2028-01-23 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  63967888800, #    utc_start 2028-01-23 02:00:00 (Sun)
  63970912800, #      utc_end 2028-02-27 02:00:00 (Sun)
  63967888800, #  local_start 2028-01-23 02:00:00 (Sun)
  63970912800, #    local_end 2028-02-27 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63970912800, #    utc_start 2028-02-27 02:00:00 (Sun)
  63998733600, #      utc_end 2029-01-14 02:00:00 (Sun)
  63970916400, #  local_start 2028-02-27 03:00:00 (Sun)
  63998737200, #    local_end 2029-01-14 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  63998733600, #    utc_start 2029-01-14 02:00:00 (Sun)
  64001757600, #      utc_end 2029-02-18 02:00:00 (Sun)
  63998733600, #  local_start 2029-01-14 02:00:00 (Sun)
  64001757600, #    local_end 2029-02-18 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  64001757600, #    utc_start 2029-02-18 02:00:00 (Sun)
  64028973600, #      utc_end 2029-12-30 02:00:00 (Sun)
  64001761200, #  local_start 2029-02-18 03:00:00 (Sun)
  64028977200, #    local_end 2029-12-30 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  64028973600, #    utc_start 2029-12-30 02:00:00 (Sun)
  64032602400, #      utc_end 2030-02-10 02:00:00 (Sun)
  64028973600, #  local_start 2029-12-30 02:00:00 (Sun)
  64032602400, #    local_end 2030-02-10 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  64032602400, #    utc_start 2030-02-10 02:00:00 (Sun)
  64059818400, #      utc_end 2030-12-22 02:00:00 (Sun)
  64032606000, #  local_start 2030-02-10 03:00:00 (Sun)
  64059822000, #    local_end 2030-12-22 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  64059818400, #    utc_start 2030-12-22 02:00:00 (Sun)
  64062842400, #      utc_end 2031-01-26 02:00:00 (Sun)
  64059818400, #  local_start 2030-12-22 02:00:00 (Sun)
  64062842400, #    local_end 2031-01-26 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  64062842400, #    utc_start 2031-01-26 02:00:00 (Sun)
  64090663200, #      utc_end 2031-12-14 02:00:00 (Sun)
  64062846000, #  local_start 2031-01-26 03:00:00 (Sun)
  64090666800, #    local_end 2031-12-14 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  64090663200, #    utc_start 2031-12-14 02:00:00 (Sun)
  64093687200, #      utc_end 2032-01-18 02:00:00 (Sun)
  64090663200, #  local_start 2031-12-14 02:00:00 (Sun)
  64093687200, #    local_end 2032-01-18 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  64093687200, #    utc_start 2032-01-18 02:00:00 (Sun)
  64120903200, #      utc_end 2032-11-28 02:00:00 (Sun)
  64093690800, #  local_start 2032-01-18 03:00:00 (Sun)
  64120906800, #    local_end 2032-11-28 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  64120903200, #    utc_start 2032-11-28 02:00:00 (Sun)
  64124532000, #      utc_end 2033-01-09 02:00:00 (Sun)
  64120903200, #  local_start 2032-11-28 02:00:00 (Sun)
  64124532000, #    local_end 2033-01-09 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  64124532000, #    utc_start 2033-01-09 02:00:00 (Sun)
  64151748000, #      utc_end 2033-11-20 02:00:00 (Sun)
  64124535600, #  local_start 2033-01-09 03:00:00 (Sun)
  64151751600, #    local_end 2033-11-20 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  64151748000, #    utc_start 2033-11-20 02:00:00 (Sun)
  64154772000, #      utc_end 2033-12-25 02:00:00 (Sun)
  64151748000, #  local_start 2033-11-20 02:00:00 (Sun)
  64154772000, #    local_end 2033-12-25 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  64154772000, #    utc_start 2033-12-25 02:00:00 (Sun)
  64181988000, #      utc_end 2034-11-05 02:00:00 (Sun)
  64154775600, #  local_start 2033-12-25 03:00:00 (Sun)
  64181991600, #    local_end 2034-11-05 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  64181988000, #    utc_start 2034-11-05 02:00:00 (Sun)
  64185616800, #      utc_end 2034-12-17 02:00:00 (Sun)
  64181988000, #  local_start 2034-11-05 02:00:00 (Sun)
  64185616800, #    local_end 2034-12-17 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  64185616800, #    utc_start 2034-12-17 02:00:00 (Sun)
  64212832800, #      utc_end 2035-10-28 02:00:00 (Sun)
  64185620400, #  local_start 2034-12-17 03:00:00 (Sun)
  64212836400, #    local_end 2035-10-28 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  64212832800, #    utc_start 2035-10-28 02:00:00 (Sun)
  64215856800, #      utc_end 2035-12-02 02:00:00 (Sun)
  64212832800, #  local_start 2035-10-28 02:00:00 (Sun)
  64215856800, #    local_end 2035-12-02 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  64215856800, #    utc_start 2035-12-02 02:00:00 (Sun)
  64243677600, #      utc_end 2036-10-19 02:00:00 (Sun)
  64215860400, #  local_start 2035-12-02 03:00:00 (Sun)
  64243681200, #    local_end 2036-10-19 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  64243677600, #    utc_start 2036-10-19 02:00:00 (Sun)
  64246701600, #      utc_end 2036-11-23 02:00:00 (Sun)
  64243677600, #  local_start 2036-10-19 02:00:00 (Sun)
  64246701600, #    local_end 2036-11-23 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  64246701600, #    utc_start 2036-11-23 02:00:00 (Sun)
  64273917600, #      utc_end 2037-10-04 02:00:00 (Sun)
  64246705200, #  local_start 2036-11-23 03:00:00 (Sun)
  64273921200, #    local_end 2037-10-04 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  64273917600, #    utc_start 2037-10-04 02:00:00 (Sun)
  64277546400, #      utc_end 2037-11-15 02:00:00 (Sun)
  64273917600, #  local_start 2037-10-04 02:00:00 (Sun)
  64277546400, #    local_end 2037-11-15 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  64277546400, #    utc_start 2037-11-15 02:00:00 (Sun)
  64304762400, #      utc_end 2038-09-26 02:00:00 (Sun)
  64277550000, #  local_start 2037-11-15 03:00:00 (Sun)
  64304766000, #    local_end 2038-09-26 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  64304762400, #    utc_start 2038-09-26 02:00:00 (Sun)
  64307786400, #      utc_end 2038-10-31 02:00:00 (Sun)
  64304762400, #  local_start 2038-09-26 02:00:00 (Sun)
  64307786400, #    local_end 2038-10-31 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  64307786400, #    utc_start 2038-10-31 02:00:00 (Sun)
  64335607200, #      utc_end 2039-09-18 02:00:00 (Sun)
  64307790000, #  local_start 2038-10-31 03:00:00 (Sun)
  64335610800, #    local_end 2039-09-18 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  64335607200, #    utc_start 2039-09-18 02:00:00 (Sun)
  64338631200, #      utc_end 2039-10-23 02:00:00 (Sun)
  64335607200, #  local_start 2039-09-18 02:00:00 (Sun)
  64338631200, #    local_end 2039-10-23 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  64338631200, #    utc_start 2039-10-23 02:00:00 (Sun)
  64365847200, #      utc_end 2040-09-02 02:00:00 (Sun)
  64338634800, #  local_start 2039-10-23 03:00:00 (Sun)
  64365850800, #    local_end 2040-09-02 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  64365847200, #    utc_start 2040-09-02 02:00:00 (Sun)
  64369476000, #      utc_end 2040-10-14 02:00:00 (Sun)
  64365847200, #  local_start 2040-09-02 02:00:00 (Sun)
  64369476000, #    local_end 2040-10-14 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  64369476000, #    utc_start 2040-10-14 02:00:00 (Sun)
  64396692000, #      utc_end 2041-08-25 02:00:00 (Sun)
  64369479600, #  local_start 2040-10-14 03:00:00 (Sun)
  64396695600, #    local_end 2041-08-25 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  64396692000, #    utc_start 2041-08-25 02:00:00 (Sun)
  64399716000, #      utc_end 2041-09-29 02:00:00 (Sun)
  64396692000, #  local_start 2041-08-25 02:00:00 (Sun)
  64399716000, #    local_end 2041-09-29 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  64399716000, #    utc_start 2041-09-29 02:00:00 (Sun)
  64426932000, #      utc_end 2042-08-10 02:00:00 (Sun)
  64399719600, #  local_start 2041-09-29 03:00:00 (Sun)
  64426935600, #    local_end 2042-08-10 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  64426932000, #    utc_start 2042-08-10 02:00:00 (Sun)
  64430560800, #      utc_end 2042-09-21 02:00:00 (Sun)
  64426932000, #  local_start 2042-08-10 02:00:00 (Sun)
  64430560800, #    local_end 2042-09-21 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  64430560800, #    utc_start 2042-09-21 02:00:00 (Sun)
  64457776800, #      utc_end 2043-08-02 02:00:00 (Sun)
  64430564400, #  local_start 2042-09-21 03:00:00 (Sun)
  64457780400, #    local_end 2043-08-02 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  64457776800, #    utc_start 2043-08-02 02:00:00 (Sun)
  64460800800, #      utc_end 2043-09-06 02:00:00 (Sun)
  64457776800, #  local_start 2043-08-02 02:00:00 (Sun)
  64460800800, #    local_end 2043-09-06 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  64460800800, #    utc_start 2043-09-06 02:00:00 (Sun)
  64488621600, #      utc_end 2044-07-24 02:00:00 (Sun)
  64460804400, #  local_start 2043-09-06 03:00:00 (Sun)
  64488625200, #    local_end 2044-07-24 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  64488621600, #    utc_start 2044-07-24 02:00:00 (Sun)
  64491645600, #      utc_end 2044-08-28 02:00:00 (Sun)
  64488621600, #  local_start 2044-07-24 02:00:00 (Sun)
  64491645600, #    local_end 2044-08-28 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  64491645600, #    utc_start 2044-08-28 02:00:00 (Sun)
  64518861600, #      utc_end 2045-07-09 02:00:00 (Sun)
  64491649200, #  local_start 2044-08-28 03:00:00 (Sun)
  64518865200, #    local_end 2045-07-09 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  64518861600, #    utc_start 2045-07-09 02:00:00 (Sun)
  64522490400, #      utc_end 2045-08-20 02:00:00 (Sun)
  64518861600, #  local_start 2045-07-09 02:00:00 (Sun)
  64522490400, #    local_end 2045-08-20 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  64522490400, #    utc_start 2045-08-20 02:00:00 (Sun)
  64549706400, #      utc_end 2046-07-01 02:00:00 (Sun)
  64522494000, #  local_start 2045-08-20 03:00:00 (Sun)
  64549710000, #    local_end 2046-07-01 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  64549706400, #    utc_start 2046-07-01 02:00:00 (Sun)
  64552730400, #      utc_end 2046-08-05 02:00:00 (Sun)
  64549706400, #  local_start 2046-07-01 02:00:00 (Sun)
  64552730400, #    local_end 2046-08-05 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  64552730400, #    utc_start 2046-08-05 02:00:00 (Sun)
  64580551200, #      utc_end 2047-06-23 02:00:00 (Sun)
  64552734000, #  local_start 2046-08-05 03:00:00 (Sun)
  64580554800, #    local_end 2047-06-23 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  64580551200, #    utc_start 2047-06-23 02:00:00 (Sun)
  64583575200, #      utc_end 2047-07-28 02:00:00 (Sun)
  64580551200, #  local_start 2047-06-23 02:00:00 (Sun)
  64583575200, #    local_end 2047-07-28 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  64583575200, #    utc_start 2047-07-28 02:00:00 (Sun)
  64610791200, #      utc_end 2048-06-07 02:00:00 (Sun)
  64583578800, #  local_start 2047-07-28 03:00:00 (Sun)
  64610794800, #    local_end 2048-06-07 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  64610791200, #    utc_start 2048-06-07 02:00:00 (Sun)
  64614420000, #      utc_end 2048-07-19 02:00:00 (Sun)
  64610791200, #  local_start 2048-06-07 02:00:00 (Sun)
  64614420000, #    local_end 2048-07-19 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  64614420000, #    utc_start 2048-07-19 02:00:00 (Sun)
  64641636000, #      utc_end 2049-05-30 02:00:00 (Sun)
  64614423600, #  local_start 2048-07-19 03:00:00 (Sun)
  64641639600, #    local_end 2049-05-30 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  64641636000, #    utc_start 2049-05-30 02:00:00 (Sun)
  64644660000, #      utc_end 2049-07-04 02:00:00 (Sun)
  64641636000, #  local_start 2049-05-30 02:00:00 (Sun)
  64644660000, #    local_end 2049-07-04 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  64644660000, #    utc_start 2049-07-04 02:00:00 (Sun)
  64671876000, #      utc_end 2050-05-15 02:00:00 (Sun)
  64644663600, #  local_start 2049-07-04 03:00:00 (Sun)
  64671879600, #    local_end 2050-05-15 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  64671876000, #    utc_start 2050-05-15 02:00:00 (Sun)
  64675504800, #      utc_end 2050-06-26 02:00:00 (Sun)
  64671876000, #  local_start 2050-05-15 02:00:00 (Sun)
  64675504800, #    local_end 2050-06-26 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  64675504800, #    utc_start 2050-06-26 02:00:00 (Sun)
  64702720800, #      utc_end 2051-05-07 02:00:00 (Sun)
  64675508400, #  local_start 2050-06-26 03:00:00 (Sun)
  64702724400, #    local_end 2051-05-07 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  64702720800, #    utc_start 2051-05-07 02:00:00 (Sun)
  64705744800, #      utc_end 2051-06-11 02:00:00 (Sun)
  64702720800, #  local_start 2051-05-07 02:00:00 (Sun)
  64705744800, #    local_end 2051-06-11 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  64705744800, #    utc_start 2051-06-11 02:00:00 (Sun)
  64733565600, #      utc_end 2052-04-28 02:00:00 (Sun)
  64705748400, #  local_start 2051-06-11 03:00:00 (Sun)
  64733569200, #    local_end 2052-04-28 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  64733565600, #    utc_start 2052-04-28 02:00:00 (Sun)
  64736589600, #      utc_end 2052-06-02 02:00:00 (Sun)
  64733565600, #  local_start 2052-04-28 02:00:00 (Sun)
  64736589600, #    local_end 2052-06-02 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  64736589600, #    utc_start 2052-06-02 02:00:00 (Sun)
  64763805600, #      utc_end 2053-04-13 02:00:00 (Sun)
  64736593200, #  local_start 2052-06-02 03:00:00 (Sun)
  64763809200, #    local_end 2053-04-13 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  64763805600, #    utc_start 2053-04-13 02:00:00 (Sun)
  64767434400, #      utc_end 2053-05-25 02:00:00 (Sun)
  64763805600, #  local_start 2053-04-13 02:00:00 (Sun)
  64767434400, #    local_end 2053-05-25 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  64767434400, #    utc_start 2053-05-25 02:00:00 (Sun)
  64794650400, #      utc_end 2054-04-05 02:00:00 (Sun)
  64767438000, #  local_start 2053-05-25 03:00:00 (Sun)
  64794654000, #    local_end 2054-04-05 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  64794650400, #    utc_start 2054-04-05 02:00:00 (Sun)
  64797674400, #      utc_end 2054-05-10 02:00:00 (Sun)
  64794650400, #  local_start 2054-04-05 02:00:00 (Sun)
  64797674400, #    local_end 2054-05-10 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  64797674400, #    utc_start 2054-05-10 02:00:00 (Sun)
  64825495200, #      utc_end 2055-03-28 02:00:00 (Sun)
  64797678000, #  local_start 2054-05-10 03:00:00 (Sun)
  64825498800, #    local_end 2055-03-28 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  64825495200, #    utc_start 2055-03-28 02:00:00 (Sun)
  64828519200, #      utc_end 2055-05-02 02:00:00 (Sun)
  64825495200, #  local_start 2055-03-28 02:00:00 (Sun)
  64828519200, #    local_end 2055-05-02 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  64828519200, #    utc_start 2055-05-02 02:00:00 (Sun)
  64855735200, #      utc_end 2056-03-12 02:00:00 (Sun)
  64828522800, #  local_start 2055-05-02 03:00:00 (Sun)
  64855738800, #    local_end 2056-03-12 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  64855735200, #    utc_start 2056-03-12 02:00:00 (Sun)
  64859364000, #      utc_end 2056-04-23 02:00:00 (Sun)
  64855735200, #  local_start 2056-03-12 02:00:00 (Sun)
  64859364000, #    local_end 2056-04-23 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  64859364000, #    utc_start 2056-04-23 02:00:00 (Sun)
  64886580000, #      utc_end 2057-03-04 02:00:00 (Sun)
  64859367600, #  local_start 2056-04-23 03:00:00 (Sun)
  64886583600, #    local_end 2057-03-04 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  64886580000, #    utc_start 2057-03-04 02:00:00 (Sun)
  64889604000, #      utc_end 2057-04-08 02:00:00 (Sun)
  64886580000, #  local_start 2057-03-04 02:00:00 (Sun)
  64889604000, #    local_end 2057-04-08 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  64889604000, #    utc_start 2057-04-08 02:00:00 (Sun)
  64916820000, #      utc_end 2058-02-17 02:00:00 (Sun)
  64889607600, #  local_start 2057-04-08 03:00:00 (Sun)
  64916823600, #    local_end 2058-02-17 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  64916820000, #    utc_start 2058-02-17 02:00:00 (Sun)
  64920448800, #      utc_end 2058-03-31 02:00:00 (Sun)
  64916820000, #  local_start 2058-02-17 02:00:00 (Sun)
  64920448800, #    local_end 2058-03-31 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  64920448800, #    utc_start 2058-03-31 02:00:00 (Sun)
  64947664800, #      utc_end 2059-02-09 02:00:00 (Sun)
  64920452400, #  local_start 2058-03-31 03:00:00 (Sun)
  64947668400, #    local_end 2059-02-09 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  64947664800, #    utc_start 2059-02-09 02:00:00 (Sun)
  64950688800, #      utc_end 2059-03-16 02:00:00 (Sun)
  64947664800, #  local_start 2059-02-09 02:00:00 (Sun)
  64950688800, #    local_end 2059-03-16 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  64950688800, #    utc_start 2059-03-16 02:00:00 (Sun)
  64978509600, #      utc_end 2060-02-01 02:00:00 (Sun)
  64950692400, #  local_start 2059-03-16 03:00:00 (Sun)
  64978513200, #    local_end 2060-02-01 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  64978509600, #    utc_start 2060-02-01 02:00:00 (Sun)
  64981533600, #      utc_end 2060-03-07 02:00:00 (Sun)
  64978509600, #  local_start 2060-02-01 02:00:00 (Sun)
  64981533600, #    local_end 2060-03-07 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  64981533600, #    utc_start 2060-03-07 02:00:00 (Sun)
  65008749600, #      utc_end 2061-01-16 02:00:00 (Sun)
  64981537200, #  local_start 2060-03-07 03:00:00 (Sun)
  65008753200, #    local_end 2061-01-16 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  65008749600, #    utc_start 2061-01-16 02:00:00 (Sun)
  65012378400, #      utc_end 2061-02-27 02:00:00 (Sun)
  65008749600, #  local_start 2061-01-16 02:00:00 (Sun)
  65012378400, #    local_end 2061-02-27 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  65012378400, #    utc_start 2061-02-27 02:00:00 (Sun)
  65039594400, #      utc_end 2062-01-08 02:00:00 (Sun)
  65012382000, #  local_start 2061-02-27 03:00:00 (Sun)
  65039598000, #    local_end 2062-01-08 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  65039594400, #    utc_start 2062-01-08 02:00:00 (Sun)
  65042618400, #      utc_end 2062-02-12 02:00:00 (Sun)
  65039594400, #  local_start 2062-01-08 02:00:00 (Sun)
  65042618400, #    local_end 2062-02-12 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  65042618400, #    utc_start 2062-02-12 02:00:00 (Sun)
  65070439200, #      utc_end 2062-12-31 02:00:00 (Sun)
  65042622000, #  local_start 2062-02-12 03:00:00 (Sun)
  65070442800, #    local_end 2062-12-31 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  65070439200, #    utc_start 2062-12-31 02:00:00 (Sun)
  65073463200, #      utc_end 2063-02-04 02:00:00 (Sun)
  65070439200, #  local_start 2062-12-31 02:00:00 (Sun)
  65073463200, #    local_end 2063-02-04 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  65073463200, #    utc_start 2063-02-04 02:00:00 (Sun)
  65100679200, #      utc_end 2063-12-16 02:00:00 (Sun)
  65073466800, #  local_start 2063-02-04 03:00:00 (Sun)
  65100682800, #    local_end 2063-12-16 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  65100679200, #    utc_start 2063-12-16 02:00:00 (Sun)
  65103703200, #      utc_end 2064-01-20 02:00:00 (Sun)
  65100679200, #  local_start 2063-12-16 02:00:00 (Sun)
  65103703200, #    local_end 2064-01-20 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  65103703200, #    utc_start 2064-01-20 02:00:00 (Sun)
  65131524000, #      utc_end 2064-12-07 02:00:00 (Sun)
  65103706800, #  local_start 2064-01-20 03:00:00 (Sun)
  65131527600, #    local_end 2064-12-07 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  65131524000, #    utc_start 2064-12-07 02:00:00 (Sun)
  65134548000, #      utc_end 2065-01-11 02:00:00 (Sun)
  65131524000, #  local_start 2064-12-07 02:00:00 (Sun)
  65134548000, #    local_end 2065-01-11 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  65134548000, #    utc_start 2065-01-11 02:00:00 (Sun)
  65161764000, #      utc_end 2065-11-22 02:00:00 (Sun)
  65134551600, #  local_start 2065-01-11 03:00:00 (Sun)
  65161767600, #    local_end 2065-11-22 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  65161764000, #    utc_start 2065-11-22 02:00:00 (Sun)
  65165392800, #      utc_end 2066-01-03 02:00:00 (Sun)
  65161764000, #  local_start 2065-11-22 02:00:00 (Sun)
  65165392800, #    local_end 2066-01-03 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  65165392800, #    utc_start 2066-01-03 02:00:00 (Sun)
  65192608800, #      utc_end 2066-11-14 02:00:00 (Sun)
  65165396400, #  local_start 2066-01-03 03:00:00 (Sun)
  65192612400, #    local_end 2066-11-14 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  65192608800, #    utc_start 2066-11-14 02:00:00 (Sun)
  65195632800, #      utc_end 2066-12-19 02:00:00 (Sun)
  65192608800, #  local_start 2066-11-14 02:00:00 (Sun)
  65195632800, #    local_end 2066-12-19 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  65195632800, #    utc_start 2066-12-19 02:00:00 (Sun)
  65223453600, #      utc_end 2067-11-06 02:00:00 (Sun)
  65195636400, #  local_start 2066-12-19 03:00:00 (Sun)
  65223457200, #    local_end 2067-11-06 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  65223453600, #    utc_start 2067-11-06 02:00:00 (Sun)
  65226477600, #      utc_end 2067-12-11 02:00:00 (Sun)
  65223453600, #  local_start 2067-11-06 02:00:00 (Sun)
  65226477600, #    local_end 2067-12-11 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  65226477600, #    utc_start 2067-12-11 02:00:00 (Sun)
  65253693600, #      utc_end 2068-10-21 02:00:00 (Sun)
  65226481200, #  local_start 2067-12-11 03:00:00 (Sun)
  65253697200, #    local_end 2068-10-21 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  65253693600, #    utc_start 2068-10-21 02:00:00 (Sun)
  65257322400, #      utc_end 2068-12-02 02:00:00 (Sun)
  65253693600, #  local_start 2068-10-21 02:00:00 (Sun)
  65257322400, #    local_end 2068-12-02 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  65257322400, #    utc_start 2068-12-02 02:00:00 (Sun)
  65284538400, #      utc_end 2069-10-13 02:00:00 (Sun)
  65257326000, #  local_start 2068-12-02 03:00:00 (Sun)
  65284542000, #    local_end 2069-10-13 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  65284538400, #    utc_start 2069-10-13 02:00:00 (Sun)
  65287562400, #      utc_end 2069-11-17 02:00:00 (Sun)
  65284538400, #  local_start 2069-10-13 02:00:00 (Sun)
  65287562400, #    local_end 2069-11-17 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  65287562400, #    utc_start 2069-11-17 02:00:00 (Sun)
  65315383200, #      utc_end 2070-10-05 02:00:00 (Sun)
  65287566000, #  local_start 2069-11-17 03:00:00 (Sun)
  65315386800, #    local_end 2070-10-05 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  65315383200, #    utc_start 2070-10-05 02:00:00 (Sun)
  65318407200, #      utc_end 2070-11-09 02:00:00 (Sun)
  65315383200, #  local_start 2070-10-05 02:00:00 (Sun)
  65318407200, #    local_end 2070-11-09 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  65318407200, #    utc_start 2070-11-09 02:00:00 (Sun)
  65345623200, #      utc_end 2071-09-20 02:00:00 (Sun)
  65318410800, #  local_start 2070-11-09 03:00:00 (Sun)
  65345626800, #    local_end 2071-09-20 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  65345623200, #    utc_start 2071-09-20 02:00:00 (Sun)
  65348647200, #      utc_end 2071-10-25 02:00:00 (Sun)
  65345623200, #  local_start 2071-09-20 02:00:00 (Sun)
  65348647200, #    local_end 2071-10-25 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  65348647200, #    utc_start 2071-10-25 02:00:00 (Sun)
  65376468000, #      utc_end 2072-09-11 02:00:00 (Sun)
  65348650800, #  local_start 2071-10-25 03:00:00 (Sun)
  65376471600, #    local_end 2072-09-11 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  65376468000, #    utc_start 2072-09-11 02:00:00 (Sun)
  65379492000, #      utc_end 2072-10-16 02:00:00 (Sun)
  65376468000, #  local_start 2072-09-11 02:00:00 (Sun)
  65379492000, #    local_end 2072-10-16 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  65379492000, #    utc_start 2072-10-16 02:00:00 (Sun)
  65406708000, #      utc_end 2073-08-27 02:00:00 (Sun)
  65379495600, #  local_start 2072-10-16 03:00:00 (Sun)
  65406711600, #    local_end 2073-08-27 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  65406708000, #    utc_start 2073-08-27 02:00:00 (Sun)
  65410336800, #      utc_end 2073-10-08 02:00:00 (Sun)
  65406708000, #  local_start 2073-08-27 02:00:00 (Sun)
  65410336800, #    local_end 2073-10-08 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  65410336800, #    utc_start 2073-10-08 02:00:00 (Sun)
  65437552800, #      utc_end 2074-08-19 02:00:00 (Sun)
  65410340400, #  local_start 2073-10-08 03:00:00 (Sun)
  65437556400, #    local_end 2074-08-19 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  65437552800, #    utc_start 2074-08-19 02:00:00 (Sun)
  65440576800, #      utc_end 2074-09-23 02:00:00 (Sun)
  65437552800, #  local_start 2074-08-19 02:00:00 (Sun)
  65440576800, #    local_end 2074-09-23 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  65440576800, #    utc_start 2074-09-23 02:00:00 (Sun)
  65468397600, #      utc_end 2075-08-11 02:00:00 (Sun)
  65440580400, #  local_start 2074-09-23 03:00:00 (Sun)
  65468401200, #    local_end 2075-08-11 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  65468397600, #    utc_start 2075-08-11 02:00:00 (Sun)
  65471421600, #      utc_end 2075-09-15 02:00:00 (Sun)
  65468397600, #  local_start 2075-08-11 02:00:00 (Sun)
  65471421600, #    local_end 2075-09-15 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  65471421600, #    utc_start 2075-09-15 02:00:00 (Sun)
  65498637600, #      utc_end 2076-07-26 02:00:00 (Sun)
  65471425200, #  local_start 2075-09-15 03:00:00 (Sun)
  65498641200, #    local_end 2076-07-26 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  65498637600, #    utc_start 2076-07-26 02:00:00 (Sun)
  65502266400, #      utc_end 2076-09-06 02:00:00 (Sun)
  65498637600, #  local_start 2076-07-26 02:00:00 (Sun)
  65502266400, #    local_end 2076-09-06 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  65502266400, #    utc_start 2076-09-06 02:00:00 (Sun)
  65529482400, #      utc_end 2077-07-18 02:00:00 (Sun)
  65502270000, #  local_start 2076-09-06 03:00:00 (Sun)
  65529486000, #    local_end 2077-07-18 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  65529482400, #    utc_start 2077-07-18 02:00:00 (Sun)
  65532506400, #      utc_end 2077-08-22 02:00:00 (Sun)
  65529482400, #  local_start 2077-07-18 02:00:00 (Sun)
  65532506400, #    local_end 2077-08-22 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  65532506400, #    utc_start 2077-08-22 02:00:00 (Sun)
  65560327200, #      utc_end 2078-07-10 02:00:00 (Sun)
  65532510000, #  local_start 2077-08-22 03:00:00 (Sun)
  65560330800, #    local_end 2078-07-10 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  65560327200, #    utc_start 2078-07-10 02:00:00 (Sun)
  65563351200, #      utc_end 2078-08-14 02:00:00 (Sun)
  65560327200, #  local_start 2078-07-10 02:00:00 (Sun)
  65563351200, #    local_end 2078-08-14 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  65563351200, #    utc_start 2078-08-14 02:00:00 (Sun)
  65590567200, #      utc_end 2079-06-25 02:00:00 (Sun)
  65563354800, #  local_start 2078-08-14 03:00:00 (Sun)
  65590570800, #    local_end 2079-06-25 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  65590567200, #    utc_start 2079-06-25 02:00:00 (Sun)
  65593591200, #      utc_end 2079-07-30 02:00:00 (Sun)
  65590567200, #  local_start 2079-06-25 02:00:00 (Sun)
  65593591200, #    local_end 2079-07-30 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  65593591200, #    utc_start 2079-07-30 02:00:00 (Sun)
  65621412000, #      utc_end 2080-06-16 02:00:00 (Sun)
  65593594800, #  local_start 2079-07-30 03:00:00 (Sun)
  65621415600, #    local_end 2080-06-16 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  65621412000, #    utc_start 2080-06-16 02:00:00 (Sun)
  65624436000, #      utc_end 2080-07-21 02:00:00 (Sun)
  65621412000, #  local_start 2080-06-16 02:00:00 (Sun)
  65624436000, #    local_end 2080-07-21 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  65624436000, #    utc_start 2080-07-21 02:00:00 (Sun)
  65651652000, #      utc_end 2081-06-01 02:00:00 (Sun)
  65624439600, #  local_start 2080-07-21 03:00:00 (Sun)
  65651655600, #    local_end 2081-06-01 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  65651652000, #    utc_start 2081-06-01 02:00:00 (Sun)
  65655280800, #      utc_end 2081-07-13 02:00:00 (Sun)
  65651652000, #  local_start 2081-06-01 02:00:00 (Sun)
  65655280800, #    local_end 2081-07-13 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  65655280800, #    utc_start 2081-07-13 02:00:00 (Sun)
  65682496800, #      utc_end 2082-05-24 02:00:00 (Sun)
  65655284400, #  local_start 2081-07-13 03:00:00 (Sun)
  65682500400, #    local_end 2082-05-24 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  65682496800, #    utc_start 2082-05-24 02:00:00 (Sun)
  65685520800, #      utc_end 2082-06-28 02:00:00 (Sun)
  65682496800, #  local_start 2082-05-24 02:00:00 (Sun)
  65685520800, #    local_end 2082-06-28 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  65685520800, #    utc_start 2082-06-28 02:00:00 (Sun)
  65713341600, #      utc_end 2083-05-16 02:00:00 (Sun)
  65685524400, #  local_start 2082-06-28 03:00:00 (Sun)
  65713345200, #    local_end 2083-05-16 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  65713341600, #    utc_start 2083-05-16 02:00:00 (Sun)
  65716365600, #      utc_end 2083-06-20 02:00:00 (Sun)
  65713341600, #  local_start 2083-05-16 02:00:00 (Sun)
  65716365600, #    local_end 2083-06-20 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  65716365600, #    utc_start 2083-06-20 02:00:00 (Sun)
  65743581600, #      utc_end 2084-04-30 02:00:00 (Sun)
  65716369200, #  local_start 2083-06-20 03:00:00 (Sun)
  65743585200, #    local_end 2084-04-30 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  65743581600, #    utc_start 2084-04-30 02:00:00 (Sun)
  65747210400, #      utc_end 2084-06-11 02:00:00 (Sun)
  65743581600, #  local_start 2084-04-30 02:00:00 (Sun)
  65747210400, #    local_end 2084-06-11 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  65747210400, #    utc_start 2084-06-11 02:00:00 (Sun)
  65774426400, #      utc_end 2085-04-22 02:00:00 (Sun)
  65747214000, #  local_start 2084-06-11 03:00:00 (Sun)
  65774430000, #    local_end 2085-04-22 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  65774426400, #    utc_start 2085-04-22 02:00:00 (Sun)
  65777450400, #      utc_end 2085-05-27 02:00:00 (Sun)
  65774426400, #  local_start 2085-04-22 02:00:00 (Sun)
  65777450400, #    local_end 2085-05-27 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  65777450400, #    utc_start 2085-05-27 02:00:00 (Sun)
  65805271200, #      utc_end 2086-04-14 02:00:00 (Sun)
  65777454000, #  local_start 2085-05-27 03:00:00 (Sun)
  65805274800, #    local_end 2086-04-14 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  65805271200, #    utc_start 2086-04-14 02:00:00 (Sun)
  65808295200, #      utc_end 2086-05-19 02:00:00 (Sun)
  65805271200, #  local_start 2086-04-14 02:00:00 (Sun)
  65808295200, #    local_end 2086-05-19 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  65808295200, #    utc_start 2086-05-19 02:00:00 (Sun)
  65835511200, #      utc_end 2087-03-30 02:00:00 (Sun)
  65808298800, #  local_start 2086-05-19 03:00:00 (Sun)
  65835514800, #    local_end 2087-03-30 03:00:00 (Sun)
  3600,
  0,
  '+01',
      ],
      [
  65835511200, #    utc_start 2087-03-30 02:00:00 (Sun)
  65838535200, #      utc_end 2087-05-04 02:00:00 (Sun)
  65835511200, #  local_start 2087-03-30 02:00:00 (Sun)
  65838535200, #    local_end 2087-05-04 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  65838535200, #    utc_start 2087-05-04 02:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #      utc_end
  65838538800, #  local_start 2087-05-04 03:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  3600,
  0,
  '+01',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {92}
  
  sub _max_year {2087}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AFRICA_EL_AAIUN

    $main::fatpacked{"DateTime/TimeZone/Africa/Johannesburg.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AFRICA_JOHANNESBURG';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/africa.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Africa::Johannesburg;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Africa::Johannesburg::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59677510080, #      utc_end 1892-02-07 22:08:00 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59677516800, #    local_end 1892-02-08 00:00:00 (Mon)
  6720,
  0,
  'LMT',
      ],
      [
  59677510080, #    utc_start 1892-02-07 22:08:00 (Sun)
  60026394600, #      utc_end 1903-02-28 22:30:00 (Sat)
  59677515480, #  local_start 1892-02-07 23:38:00 (Sun)
  60026400000, #    local_end 1903-03-01 00:00:00 (Sun)
  5400,
  0,
  'SAST',
      ],
      [
  60026394600, #    utc_start 1903-02-28 22:30:00 (Sat)
  61274707200, #      utc_end 1942-09-20 00:00:00 (Sun)
  60026401800, #  local_start 1903-03-01 00:30:00 (Sun)
  61274714400, #    local_end 1942-09-20 02:00:00 (Sun)
  7200,
  0,
  'SAST',
      ],
      [
  61274707200, #    utc_start 1942-09-20 00:00:00 (Sun)
  61290428400, #      utc_end 1943-03-20 23:00:00 (Sat)
  61274718000, #  local_start 1942-09-20 03:00:00 (Sun)
  61290439200, #    local_end 1943-03-21 02:00:00 (Sun)
  10800,
  1,
  'SAST',
      ],
      [
  61290428400, #    utc_start 1943-03-20 23:00:00 (Sat)
  61306156800, #      utc_end 1943-09-19 00:00:00 (Sun)
  61290435600, #  local_start 1943-03-21 01:00:00 (Sun)
  61306164000, #    local_end 1943-09-19 02:00:00 (Sun)
  7200,
  0,
  'SAST',
      ],
      [
  61306156800, #    utc_start 1943-09-19 00:00:00 (Sun)
  61321878000, #      utc_end 1944-03-18 23:00:00 (Sat)
  61306167600, #  local_start 1943-09-19 03:00:00 (Sun)
  61321888800, #    local_end 1944-03-19 02:00:00 (Sun)
  10800,
  1,
  'SAST',
      ],
      [
  61321878000, #    utc_start 1944-03-18 23:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  61321885200, #  local_start 1944-03-19 01:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  7200,
  0,
  'SAST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {2}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AFRICA_JOHANNESBURG

    $main::fatpacked{"DateTime/TimeZone/Africa/Juba.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AFRICA_JUBA';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/africa.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Africa::Juba;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Africa::Juba::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60904907612, #      utc_end 1930-12-31 21:53:32 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60904915200, #    local_end 1931-01-01 00:00:00 (Thu)
  7588,
  0,
  'LMT',
      ],
      [
  60904907612, #    utc_start 1930-12-31 21:53:32 (Wed)
  62146044000, #      utc_end 1970-04-30 22:00:00 (Thu)
  60904914812, #  local_start 1930-12-31 23:53:32 (Wed)
  62146051200, #    local_end 1970-05-01 00:00:00 (Fri)
  7200,
  0,
  'CAT',
      ],
      [
  62146044000, #    utc_start 1970-04-30 22:00:00 (Thu)
  62160469200, #      utc_end 1970-10-14 21:00:00 (Wed)
  62146054800, #  local_start 1970-05-01 01:00:00 (Fri)
  62160480000, #    local_end 1970-10-15 00:00:00 (Thu)
  10800,
  1,
  'CAST',
      ],
      [
  62160469200, #    utc_start 1970-10-14 21:00:00 (Wed)
  62177493600, #      utc_end 1971-04-29 22:00:00 (Thu)
  62160476400, #  local_start 1970-10-14 23:00:00 (Wed)
  62177500800, #    local_end 1971-04-30 00:00:00 (Fri)
  7200,
  0,
  'CAT',
      ],
      [
  62177493600, #    utc_start 1971-04-29 22:00:00 (Thu)
  62192005200, #      utc_end 1971-10-14 21:00:00 (Thu)
  62177504400, #  local_start 1971-04-30 01:00:00 (Fri)
  62192016000, #    local_end 1971-10-15 00:00:00 (Fri)
  10800,
  1,
  'CAST',
      ],
      [
  62192005200, #    utc_start 1971-10-14 21:00:00 (Thu)
  62209116000, #      utc_end 1972-04-29 22:00:00 (Sat)
  62192012400, #  local_start 1971-10-14 23:00:00 (Thu)
  62209123200, #    local_end 1972-04-30 00:00:00 (Sun)
  7200,
  0,
  'CAT',
      ],
      [
  62209116000, #    utc_start 1972-04-29 22:00:00 (Sat)
  62223627600, #      utc_end 1972-10-14 21:00:00 (Sat)
  62209126800, #  local_start 1972-04-30 01:00:00 (Sun)
  62223638400, #    local_end 1972-10-15 00:00:00 (Sun)
  10800,
  1,
  'CAST',
      ],
      [
  62223627600, #    utc_start 1972-10-14 21:00:00 (Sat)
  62240565600, #      utc_end 1973-04-28 22:00:00 (Sat)
  62223634800, #  local_start 1972-10-14 23:00:00 (Sat)
  62240572800, #    local_end 1973-04-29 00:00:00 (Sun)
  7200,
  0,
  'CAT',
      ],
      [
  62240565600, #    utc_start 1973-04-28 22:00:00 (Sat)
  62255163600, #      utc_end 1973-10-14 21:00:00 (Sun)
  62240576400, #  local_start 1973-04-29 01:00:00 (Sun)
  62255174400, #    local_end 1973-10-15 00:00:00 (Mon)
  10800,
  1,
  'CAST',
      ],
      [
  62255163600, #    utc_start 1973-10-14 21:00:00 (Sun)
  62272015200, #      utc_end 1974-04-27 22:00:00 (Sat)
  62255170800, #  local_start 1973-10-14 23:00:00 (Sun)
  62272022400, #    local_end 1974-04-28 00:00:00 (Sun)
  7200,
  0,
  'CAT',
      ],
      [
  62272015200, #    utc_start 1974-04-27 22:00:00 (Sat)
  62286699600, #      utc_end 1974-10-14 21:00:00 (Mon)
  62272026000, #  local_start 1974-04-28 01:00:00 (Sun)
  62286710400, #    local_end 1974-10-15 00:00:00 (Tue)
  10800,
  1,
  'CAST',
      ],
      [
  62286699600, #    utc_start 1974-10-14 21:00:00 (Mon)
  62303464800, #      utc_end 1975-04-26 22:00:00 (Sat)
  62286706800, #  local_start 1974-10-14 23:00:00 (Mon)
  62303472000, #    local_end 1975-04-27 00:00:00 (Sun)
  7200,
  0,
  'CAT',
      ],
      [
  62303464800, #    utc_start 1975-04-26 22:00:00 (Sat)
  62318235600, #      utc_end 1975-10-14 21:00:00 (Tue)
  62303475600, #  local_start 1975-04-27 01:00:00 (Sun)
  62318246400, #    local_end 1975-10-15 00:00:00 (Wed)
  10800,
  1,
  'CAST',
      ],
      [
  62318235600, #    utc_start 1975-10-14 21:00:00 (Tue)
  62334914400, #      utc_end 1976-04-24 22:00:00 (Sat)
  62318242800, #  local_start 1975-10-14 23:00:00 (Tue)
  62334921600, #    local_end 1976-04-25 00:00:00 (Sun)
  7200,
  0,
  'CAT',
      ],
      [
  62334914400, #    utc_start 1976-04-24 22:00:00 (Sat)
  62349858000, #      utc_end 1976-10-14 21:00:00 (Thu)
  62334925200, #  local_start 1976-04-25 01:00:00 (Sun)
  62349868800, #    local_end 1976-10-15 00:00:00 (Fri)
  10800,
  1,
  'CAST',
      ],
      [
  62349858000, #    utc_start 1976-10-14 21:00:00 (Thu)
  62366364000, #      utc_end 1977-04-23 22:00:00 (Sat)
  62349865200, #  local_start 1976-10-14 23:00:00 (Thu)
  62366371200, #    local_end 1977-04-24 00:00:00 (Sun)
  7200,
  0,
  'CAT',
      ],
      [
  62366364000, #    utc_start 1977-04-23 22:00:00 (Sat)
  62381394000, #      utc_end 1977-10-14 21:00:00 (Fri)
  62366374800, #  local_start 1977-04-24 01:00:00 (Sun)
  62381404800, #    local_end 1977-10-15 00:00:00 (Sat)
  10800,
  1,
  'CAST',
      ],
      [
  62381394000, #    utc_start 1977-10-14 21:00:00 (Fri)
  62398418400, #      utc_end 1978-04-29 22:00:00 (Sat)
  62381401200, #  local_start 1977-10-14 23:00:00 (Fri)
  62398425600, #    local_end 1978-04-30 00:00:00 (Sun)
  7200,
  0,
  'CAT',
      ],
      [
  62398418400, #    utc_start 1978-04-29 22:00:00 (Sat)
  62412930000, #      utc_end 1978-10-14 21:00:00 (Sat)
  62398429200, #  local_start 1978-04-30 01:00:00 (Sun)
  62412940800, #    local_end 1978-10-15 00:00:00 (Sun)
  10800,
  1,
  'CAST',
      ],
      [
  62412930000, #    utc_start 1978-10-14 21:00:00 (Sat)
  62429868000, #      utc_end 1979-04-28 22:00:00 (Sat)
  62412937200, #  local_start 1978-10-14 23:00:00 (Sat)
  62429875200, #    local_end 1979-04-29 00:00:00 (Sun)
  7200,
  0,
  'CAT',
      ],
      [
  62429868000, #    utc_start 1979-04-28 22:00:00 (Sat)
  62444466000, #      utc_end 1979-10-14 21:00:00 (Sun)
  62429878800, #  local_start 1979-04-29 01:00:00 (Sun)
  62444476800, #    local_end 1979-10-15 00:00:00 (Mon)
  10800,
  1,
  'CAST',
      ],
      [
  62444466000, #    utc_start 1979-10-14 21:00:00 (Sun)
  62461317600, #      utc_end 1980-04-26 22:00:00 (Sat)
  62444473200, #  local_start 1979-10-14 23:00:00 (Sun)
  62461324800, #    local_end 1980-04-27 00:00:00 (Sun)
  7200,
  0,
  'CAT',
      ],
      [
  62461317600, #    utc_start 1980-04-26 22:00:00 (Sat)
  62476088400, #      utc_end 1980-10-14 21:00:00 (Tue)
  62461328400, #  local_start 1980-04-27 01:00:00 (Sun)
  62476099200, #    local_end 1980-10-15 00:00:00 (Wed)
  10800,
  1,
  'CAST',
      ],
      [
  62476088400, #    utc_start 1980-10-14 21:00:00 (Tue)
  62492767200, #      utc_end 1981-04-25 22:00:00 (Sat)
  62476095600, #  local_start 1980-10-14 23:00:00 (Tue)
  62492774400, #    local_end 1981-04-26 00:00:00 (Sun)
  7200,
  0,
  'CAT',
      ],
      [
  62492767200, #    utc_start 1981-04-25 22:00:00 (Sat)
  62507624400, #      utc_end 1981-10-14 21:00:00 (Wed)
  62492778000, #  local_start 1981-04-26 01:00:00 (Sun)
  62507635200, #    local_end 1981-10-15 00:00:00 (Thu)
  10800,
  1,
  'CAST',
      ],
      [
  62507624400, #    utc_start 1981-10-14 21:00:00 (Wed)
  62524216800, #      utc_end 1982-04-24 22:00:00 (Sat)
  62507631600, #  local_start 1981-10-14 23:00:00 (Wed)
  62524224000, #    local_end 1982-04-25 00:00:00 (Sun)
  7200,
  0,
  'CAT',
      ],
      [
  62524216800, #    utc_start 1982-04-24 22:00:00 (Sat)
  62539160400, #      utc_end 1982-10-14 21:00:00 (Thu)
  62524227600, #  local_start 1982-04-25 01:00:00 (Sun)
  62539171200, #    local_end 1982-10-15 00:00:00 (Fri)
  10800,
  1,
  'CAST',
      ],
      [
  62539160400, #    utc_start 1982-10-14 21:00:00 (Thu)
  62555666400, #      utc_end 1983-04-23 22:00:00 (Sat)
  62539167600, #  local_start 1982-10-14 23:00:00 (Thu)
  62555673600, #    local_end 1983-04-24 00:00:00 (Sun)
  7200,
  0,
  'CAT',
      ],
      [
  62555666400, #    utc_start 1983-04-23 22:00:00 (Sat)
  62570696400, #      utc_end 1983-10-14 21:00:00 (Fri)
  62555677200, #  local_start 1983-04-24 01:00:00 (Sun)
  62570707200, #    local_end 1983-10-15 00:00:00 (Sat)
  10800,
  1,
  'CAST',
      ],
      [
  62570696400, #    utc_start 1983-10-14 21:00:00 (Fri)
  62587720800, #      utc_end 1984-04-28 22:00:00 (Sat)
  62570703600, #  local_start 1983-10-14 23:00:00 (Fri)
  62587728000, #    local_end 1984-04-29 00:00:00 (Sun)
  7200,
  0,
  'CAT',
      ],
      [
  62587720800, #    utc_start 1984-04-28 22:00:00 (Sat)
  62602318800, #      utc_end 1984-10-14 21:00:00 (Sun)
  62587731600, #  local_start 1984-04-29 01:00:00 (Sun)
  62602329600, #    local_end 1984-10-15 00:00:00 (Mon)
  10800,
  1,
  'CAST',
      ],
      [
  62602318800, #    utc_start 1984-10-14 21:00:00 (Sun)
  62619170400, #      utc_end 1985-04-27 22:00:00 (Sat)
  62602326000, #  local_start 1984-10-14 23:00:00 (Sun)
  62619177600, #    local_end 1985-04-28 00:00:00 (Sun)
  7200,
  0,
  'CAT',
      ],
      [
  62619170400, #    utc_start 1985-04-27 22:00:00 (Sat)
  62633854800, #      utc_end 1985-10-14 21:00:00 (Mon)
  62619181200, #  local_start 1985-04-28 01:00:00 (Sun)
  62633865600, #    local_end 1985-10-15 00:00:00 (Tue)
  10800,
  1,
  'CAST',
      ],
      [
  62633854800, #    utc_start 1985-10-14 21:00:00 (Mon)
  63083613600, #      utc_end 2000-01-15 10:00:00 (Sat)
  62633862000, #  local_start 1985-10-14 23:00:00 (Mon)
  63083620800, #    local_end 2000-01-15 12:00:00 (Sat)
  7200,
  0,
  'CAT',
      ],
      [
  63083613600, #    utc_start 2000-01-15 10:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  63083624400, #  local_start 2000-01-15 13:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #    local_end
  10800,
  0,
  'EAT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {16}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AFRICA_JUBA

    $main::fatpacked{"DateTime/TimeZone/Africa/Khartoum.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AFRICA_KHARTOUM';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/africa.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Africa::Khartoum;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Africa::Khartoum::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60904907392, #      utc_end 1930-12-31 21:49:52 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60904915200, #    local_end 1931-01-01 00:00:00 (Thu)
  7808,
  0,
  'LMT',
      ],
      [
  60904907392, #    utc_start 1930-12-31 21:49:52 (Wed)
  62146044000, #      utc_end 1970-04-30 22:00:00 (Thu)
  60904914592, #  local_start 1930-12-31 23:49:52 (Wed)
  62146051200, #    local_end 1970-05-01 00:00:00 (Fri)
  7200,
  0,
  'CAT',
      ],
      [
  62146044000, #    utc_start 1970-04-30 22:00:00 (Thu)
  62160469200, #      utc_end 1970-10-14 21:00:00 (Wed)
  62146054800, #  local_start 1970-05-01 01:00:00 (Fri)
  62160480000, #    local_end 1970-10-15 00:00:00 (Thu)
  10800,
  1,
  'CAST',
      ],
      [
  62160469200, #    utc_start 1970-10-14 21:00:00 (Wed)
  62177493600, #      utc_end 1971-04-29 22:00:00 (Thu)
  62160476400, #  local_start 1970-10-14 23:00:00 (Wed)
  62177500800, #    local_end 1971-04-30 00:00:00 (Fri)
  7200,
  0,
  'CAT',
      ],
      [
  62177493600, #    utc_start 1971-04-29 22:00:00 (Thu)
  62192005200, #      utc_end 1971-10-14 21:00:00 (Thu)
  62177504400, #  local_start 1971-04-30 01:00:00 (Fri)
  62192016000, #    local_end 1971-10-15 00:00:00 (Fri)
  10800,
  1,
  'CAST',
      ],
      [
  62192005200, #    utc_start 1971-10-14 21:00:00 (Thu)
  62209116000, #      utc_end 1972-04-29 22:00:00 (Sat)
  62192012400, #  local_start 1971-10-14 23:00:00 (Thu)
  62209123200, #    local_end 1972-04-30 00:00:00 (Sun)
  7200,
  0,
  'CAT',
      ],
      [
  62209116000, #    utc_start 1972-04-29 22:00:00 (Sat)
  62223627600, #      utc_end 1972-10-14 21:00:00 (Sat)
  62209126800, #  local_start 1972-04-30 01:00:00 (Sun)
  62223638400, #    local_end 1972-10-15 00:00:00 (Sun)
  10800,
  1,
  'CAST',
      ],
      [
  62223627600, #    utc_start 1972-10-14 21:00:00 (Sat)
  62240565600, #      utc_end 1973-04-28 22:00:00 (Sat)
  62223634800, #  local_start 1972-10-14 23:00:00 (Sat)
  62240572800, #    local_end 1973-04-29 00:00:00 (Sun)
  7200,
  0,
  'CAT',
      ],
      [
  62240565600, #    utc_start 1973-04-28 22:00:00 (Sat)
  62255163600, #      utc_end 1973-10-14 21:00:00 (Sun)
  62240576400, #  local_start 1973-04-29 01:00:00 (Sun)
  62255174400, #    local_end 1973-10-15 00:00:00 (Mon)
  10800,
  1,
  'CAST',
      ],
      [
  62255163600, #    utc_start 1973-10-14 21:00:00 (Sun)
  62272015200, #      utc_end 1974-04-27 22:00:00 (Sat)
  62255170800, #  local_start 1973-10-14 23:00:00 (Sun)
  62272022400, #    local_end 1974-04-28 00:00:00 (Sun)
  7200,
  0,
  'CAT',
      ],
      [
  62272015200, #    utc_start 1974-04-27 22:00:00 (Sat)
  62286699600, #      utc_end 1974-10-14 21:00:00 (Mon)
  62272026000, #  local_start 1974-04-28 01:00:00 (Sun)
  62286710400, #    local_end 1974-10-15 00:00:00 (Tue)
  10800,
  1,
  'CAST',
      ],
      [
  62286699600, #    utc_start 1974-10-14 21:00:00 (Mon)
  62303464800, #      utc_end 1975-04-26 22:00:00 (Sat)
  62286706800, #  local_start 1974-10-14 23:00:00 (Mon)
  62303472000, #    local_end 1975-04-27 00:00:00 (Sun)
  7200,
  0,
  'CAT',
      ],
      [
  62303464800, #    utc_start 1975-04-26 22:00:00 (Sat)
  62318235600, #      utc_end 1975-10-14 21:00:00 (Tue)
  62303475600, #  local_start 1975-04-27 01:00:00 (Sun)
  62318246400, #    local_end 1975-10-15 00:00:00 (Wed)
  10800,
  1,
  'CAST',
      ],
      [
  62318235600, #    utc_start 1975-10-14 21:00:00 (Tue)
  62334914400, #      utc_end 1976-04-24 22:00:00 (Sat)
  62318242800, #  local_start 1975-10-14 23:00:00 (Tue)
  62334921600, #    local_end 1976-04-25 00:00:00 (Sun)
  7200,
  0,
  'CAT',
      ],
      [
  62334914400, #    utc_start 1976-04-24 22:00:00 (Sat)
  62349858000, #      utc_end 1976-10-14 21:00:00 (Thu)
  62334925200, #  local_start 1976-04-25 01:00:00 (Sun)
  62349868800, #    local_end 1976-10-15 00:00:00 (Fri)
  10800,
  1,
  'CAST',
      ],
      [
  62349858000, #    utc_start 1976-10-14 21:00:00 (Thu)
  62366364000, #      utc_end 1977-04-23 22:00:00 (Sat)
  62349865200, #  local_start 1976-10-14 23:00:00 (Thu)
  62366371200, #    local_end 1977-04-24 00:00:00 (Sun)
  7200,
  0,
  'CAT',
      ],
      [
  62366364000, #    utc_start 1977-04-23 22:00:00 (Sat)
  62381394000, #      utc_end 1977-10-14 21:00:00 (Fri)
  62366374800, #  local_start 1977-04-24 01:00:00 (Sun)
  62381404800, #    local_end 1977-10-15 00:00:00 (Sat)
  10800,
  1,
  'CAST',
      ],
      [
  62381394000, #    utc_start 1977-10-14 21:00:00 (Fri)
  62398418400, #      utc_end 1978-04-29 22:00:00 (Sat)
  62381401200, #  local_start 1977-10-14 23:00:00 (Fri)
  62398425600, #    local_end 1978-04-30 00:00:00 (Sun)
  7200,
  0,
  'CAT',
      ],
      [
  62398418400, #    utc_start 1978-04-29 22:00:00 (Sat)
  62412930000, #      utc_end 1978-10-14 21:00:00 (Sat)
  62398429200, #  local_start 1978-04-30 01:00:00 (Sun)
  62412940800, #    local_end 1978-10-15 00:00:00 (Sun)
  10800,
  1,
  'CAST',
      ],
      [
  62412930000, #    utc_start 1978-10-14 21:00:00 (Sat)
  62429868000, #      utc_end 1979-04-28 22:00:00 (Sat)
  62412937200, #  local_start 1978-10-14 23:00:00 (Sat)
  62429875200, #    local_end 1979-04-29 00:00:00 (Sun)
  7200,
  0,
  'CAT',
      ],
      [
  62429868000, #    utc_start 1979-04-28 22:00:00 (Sat)
  62444466000, #      utc_end 1979-10-14 21:00:00 (Sun)
  62429878800, #  local_start 1979-04-29 01:00:00 (Sun)
  62444476800, #    local_end 1979-10-15 00:00:00 (Mon)
  10800,
  1,
  'CAST',
      ],
      [
  62444466000, #    utc_start 1979-10-14 21:00:00 (Sun)
  62461317600, #      utc_end 1980-04-26 22:00:00 (Sat)
  62444473200, #  local_start 1979-10-14 23:00:00 (Sun)
  62461324800, #    local_end 1980-04-27 00:00:00 (Sun)
  7200,
  0,
  'CAT',
      ],
      [
  62461317600, #    utc_start 1980-04-26 22:00:00 (Sat)
  62476088400, #      utc_end 1980-10-14 21:00:00 (Tue)
  62461328400, #  local_start 1980-04-27 01:00:00 (Sun)
  62476099200, #    local_end 1980-10-15 00:00:00 (Wed)
  10800,
  1,
  'CAST',
      ],
      [
  62476088400, #    utc_start 1980-10-14 21:00:00 (Tue)
  62492767200, #      utc_end 1981-04-25 22:00:00 (Sat)
  62476095600, #  local_start 1980-10-14 23:00:00 (Tue)
  62492774400, #    local_end 1981-04-26 00:00:00 (Sun)
  7200,
  0,
  'CAT',
      ],
      [
  62492767200, #    utc_start 1981-04-25 22:00:00 (Sat)
  62507624400, #      utc_end 1981-10-14 21:00:00 (Wed)
  62492778000, #  local_start 1981-04-26 01:00:00 (Sun)
  62507635200, #    local_end 1981-10-15 00:00:00 (Thu)
  10800,
  1,
  'CAST',
      ],
      [
  62507624400, #    utc_start 1981-10-14 21:00:00 (Wed)
  62524216800, #      utc_end 1982-04-24 22:00:00 (Sat)
  62507631600, #  local_start 1981-10-14 23:00:00 (Wed)
  62524224000, #    local_end 1982-04-25 00:00:00 (Sun)
  7200,
  0,
  'CAT',
      ],
      [
  62524216800, #    utc_start 1982-04-24 22:00:00 (Sat)
  62539160400, #      utc_end 1982-10-14 21:00:00 (Thu)
  62524227600, #  local_start 1982-04-25 01:00:00 (Sun)
  62539171200, #    local_end 1982-10-15 00:00:00 (Fri)
  10800,
  1,
  'CAST',
      ],
      [
  62539160400, #    utc_start 1982-10-14 21:00:00 (Thu)
  62555666400, #      utc_end 1983-04-23 22:00:00 (Sat)
  62539167600, #  local_start 1982-10-14 23:00:00 (Thu)
  62555673600, #    local_end 1983-04-24 00:00:00 (Sun)
  7200,
  0,
  'CAT',
      ],
      [
  62555666400, #    utc_start 1983-04-23 22:00:00 (Sat)
  62570696400, #      utc_end 1983-10-14 21:00:00 (Fri)
  62555677200, #  local_start 1983-04-24 01:00:00 (Sun)
  62570707200, #    local_end 1983-10-15 00:00:00 (Sat)
  10800,
  1,
  'CAST',
      ],
      [
  62570696400, #    utc_start 1983-10-14 21:00:00 (Fri)
  62587720800, #      utc_end 1984-04-28 22:00:00 (Sat)
  62570703600, #  local_start 1983-10-14 23:00:00 (Fri)
  62587728000, #    local_end 1984-04-29 00:00:00 (Sun)
  7200,
  0,
  'CAT',
      ],
      [
  62587720800, #    utc_start 1984-04-28 22:00:00 (Sat)
  62602318800, #      utc_end 1984-10-14 21:00:00 (Sun)
  62587731600, #  local_start 1984-04-29 01:00:00 (Sun)
  62602329600, #    local_end 1984-10-15 00:00:00 (Mon)
  10800,
  1,
  'CAST',
      ],
      [
  62602318800, #    utc_start 1984-10-14 21:00:00 (Sun)
  62619170400, #      utc_end 1985-04-27 22:00:00 (Sat)
  62602326000, #  local_start 1984-10-14 23:00:00 (Sun)
  62619177600, #    local_end 1985-04-28 00:00:00 (Sun)
  7200,
  0,
  'CAT',
      ],
      [
  62619170400, #    utc_start 1985-04-27 22:00:00 (Sat)
  62633854800, #      utc_end 1985-10-14 21:00:00 (Mon)
  62619181200, #  local_start 1985-04-28 01:00:00 (Sun)
  62633865600, #    local_end 1985-10-15 00:00:00 (Tue)
  10800,
  1,
  'CAST',
      ],
      [
  62633854800, #    utc_start 1985-10-14 21:00:00 (Mon)
  63083613600, #      utc_end 2000-01-15 10:00:00 (Sat)
  62633862000, #  local_start 1985-10-14 23:00:00 (Mon)
  63083620800, #    local_end 2000-01-15 12:00:00 (Sat)
  7200,
  0,
  'CAT',
      ],
      [
  63083613600, #    utc_start 2000-01-15 10:00:00 (Sat)
  63645166800, #      utc_end 2017-10-31 21:00:00 (Tue)
  63083624400, #  local_start 2000-01-15 13:00:00 (Sat)
  63645177600, #    local_end 2017-11-01 00:00:00 (Wed)
  10800,
  0,
  'EAT',
      ],
      [
  63645166800, #    utc_start 2017-10-31 21:00:00 (Tue)
  DateTime::TimeZone::INFINITY, #      utc_end
  63645174000, #  local_start 2017-10-31 23:00:00 (Tue)
  DateTime::TimeZone::INFINITY, #    local_end
  7200,
  0,
  'CAT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {16}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AFRICA_KHARTOUM

    $main::fatpacked{"DateTime/TimeZone/Africa/Lagos.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AFRICA_LAGOS';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/africa.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Africa::Lagos;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Africa::Lagos::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60547218384, #      utc_end 1919-08-31 23:46:24 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60547219200, #    local_end 1919-09-01 00:00:00 (Mon)
  816,
  0,
  'LMT',
      ],
      [
  60547218384, #    utc_start 1919-08-31 23:46:24 (Sun)
  DateTime::TimeZone::INFINITY, #      utc_end
  60547221984, #  local_start 1919-09-01 00:46:24 (Mon)
  DateTime::TimeZone::INFINITY, #    local_end
  3600,
  0,
  'WAT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AFRICA_LAGOS

    $main::fatpacked{"DateTime/TimeZone/Africa/Maputo.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AFRICA_MAPUTO';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/africa.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Africa::Maputo;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Africa::Maputo::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60026392180, #      utc_end 1903-02-28 21:49:40 (Sat)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60026400000, #    local_end 1903-03-01 00:00:00 (Sun)
  7820,
  0,
  'LMT',
      ],
      [
  60026392180, #    utc_start 1903-02-28 21:49:40 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  60026399380, #  local_start 1903-02-28 23:49:40 (Sat)
  DateTime::TimeZone::INFINITY, #    local_end
  7200,
  0,
  'CAT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AFRICA_MAPUTO

    $main::fatpacked{"DateTime/TimeZone/Africa/Monrovia.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AFRICA_MONROVIA';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/africa.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Africa::Monrovia;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Africa::Monrovia::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59358703388, #      utc_end 1882-01-01 00:43:08 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59358700800, #    local_end 1882-01-01 00:00:00 (Sun)
  -2588,
  0,
  'LMT',
      ],
      [
  59358703388, #    utc_start 1882-01-01 00:43:08 (Sun)
  60531324188, #      utc_end 1919-03-01 00:43:08 (Sat)
  59358700800, #  local_start 1882-01-01 00:00:00 (Sun)
  60531321600, #    local_end 1919-03-01 00:00:00 (Sat)
  -2588,
  0,
  'MMT',
      ],
      [
  60531324188, #    utc_start 1919-03-01 00:43:08 (Sat)
  62199276270, #      utc_end 1972-01-07 00:44:30 (Fri)
  60531321518, #  local_start 1919-02-28 23:58:38 (Fri)
  62199273600, #    local_end 1972-01-07 00:00:00 (Fri)
  -2670,
  0,
  'MMT',
      ],
      [
  62199276270, #    utc_start 1972-01-07 00:44:30 (Fri)
  DateTime::TimeZone::INFINITY, #      utc_end
  62199276270, #  local_start 1972-01-07 00:44:30 (Fri)
  DateTime::TimeZone::INFINITY, #    local_end
  0,
  0,
  'GMT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AFRICA_MONROVIA

    $main::fatpacked{"DateTime/TimeZone/Africa/Nairobi.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AFRICA_NAIROBI';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/africa.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Africa::Nairobi;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Africa::Nairobi::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60825936764, #      utc_end 1928-06-30 21:32:44 (Sat)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60825945600, #    local_end 1928-07-01 00:00:00 (Sun)
  8836,
  0,
  'LMT',
      ],
      [
  60825936764, #    utc_start 1928-06-30 21:32:44 (Sat)
  60873368400, #      utc_end 1929-12-31 21:00:00 (Tue)
  60825947564, #  local_start 1928-07-01 00:32:44 (Sun)
  60873379200, #    local_end 1930-01-01 00:00:00 (Wed)
  10800,
  0,
  'EAT',
      ],
      [
  60873368400, #    utc_start 1929-12-31 21:00:00 (Tue)
  61188903000, #      utc_end 1939-12-31 21:30:00 (Sun)
  60873377400, #  local_start 1929-12-31 23:30:00 (Tue)
  61188912000, #    local_end 1940-01-01 00:00:00 (Mon)
  9000,
  0,
  '+0230',
      ],
      [
  61188903000, #    utc_start 1939-12-31 21:30:00 (Sun)
  61820054100, #      utc_end 1959-12-31 21:15:00 (Thu)
  61188912900, #  local_start 1940-01-01 00:15:00 (Mon)
  61820064000, #    local_end 1960-01-01 00:00:00 (Fri)
  9900,
  0,
  '+0245',
      ],
      [
  61820054100, #    utc_start 1959-12-31 21:15:00 (Thu)
  DateTime::TimeZone::INFINITY, #      utc_end
  61820064900, #  local_start 1960-01-01 00:15:00 (Fri)
  DateTime::TimeZone::INFINITY, #    local_end
  10800,
  0,
  'EAT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AFRICA_NAIROBI

    $main::fatpacked{"DateTime/TimeZone/Africa/Ndjamena.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AFRICA_NDJAMENA';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/africa.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Africa::Ndjamena;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Africa::Ndjamena::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60305295588, #      utc_end 1911-12-31 22:59:48 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60305299200, #    local_end 1912-01-01 00:00:00 (Mon)
  3612,
  0,
  'LMT',
      ],
      [
  60305295588, #    utc_start 1911-12-31 22:59:48 (Sun)
  62444386800, #      utc_end 1979-10-13 23:00:00 (Sat)
  60305299188, #  local_start 1911-12-31 23:59:48 (Sun)
  62444390400, #    local_end 1979-10-14 00:00:00 (Sun)
  3600,
  0,
  'WAT',
      ],
      [
  62444386800, #    utc_start 1979-10-13 23:00:00 (Sat)
  62456997600, #      utc_end 1980-03-07 22:00:00 (Fri)
  62444394000, #  local_start 1979-10-14 01:00:00 (Sun)
  62457004800, #    local_end 1980-03-08 00:00:00 (Sat)
  7200,
  1,
  'WAST',
      ],
      [
  62456997600, #    utc_start 1980-03-07 22:00:00 (Fri)
  DateTime::TimeZone::INFINITY, #      utc_end
  62457001200, #  local_start 1980-03-07 23:00:00 (Fri)
  DateTime::TimeZone::INFINITY, #    local_end
  3600,
  0,
  'WAT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {1}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AFRICA_NDJAMENA

    $main::fatpacked{"DateTime/TimeZone/Africa/Sao_Tome.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AFRICA_SAO_TOME';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/africa.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Africa::Sao_Tome;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Africa::Sao_Tome::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59421771184, #      utc_end 1883-12-31 23:33:04 (Mon)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59421772800, #    local_end 1884-01-01 00:00:00 (Tue)
  1616,
  0,
  'LMT',
      ],
      [
  59421771184, #    utc_start 1883-12-31 23:33:04 (Mon)
  60305299200, #      utc_end 1912-01-01 00:00:00 (Mon)
  59421768979, #  local_start 1883-12-31 22:56:19 (Mon)
  60305296995, #    local_end 1911-12-31 23:23:15 (Sun)
  -2205,
  0,
  'LMT',
      ],
      [
  60305299200, #    utc_start 1912-01-01 00:00:00 (Mon)
  63650451600, #      utc_end 2018-01-01 01:00:00 (Mon)
  60305299200, #  local_start 1912-01-01 00:00:00 (Mon)
  63650451600, #    local_end 2018-01-01 01:00:00 (Mon)
  0,
  0,
  'GMT',
      ],
      [
  63650451600, #    utc_start 2018-01-01 01:00:00 (Mon)
  63681987600, #      utc_end 2019-01-01 01:00:00 (Tue)
  63650455200, #  local_start 2018-01-01 02:00:00 (Mon)
  63681991200, #    local_end 2019-01-01 02:00:00 (Tue)
  3600,
  0,
  'WAT',
      ],
      [
  63681987600, #    utc_start 2019-01-01 01:00:00 (Tue)
  DateTime::TimeZone::INFINITY, #      utc_end
  63681987600, #  local_start 2019-01-01 01:00:00 (Tue)
  DateTime::TimeZone::INFINITY, #    local_end
  0,
  0,
  'GMT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AFRICA_SAO_TOME

    $main::fatpacked{"DateTime/TimeZone/Africa/Tripoli.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AFRICA_TRIPOLI';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/africa.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Africa::Tripoli;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Africa::Tripoli::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60557756836, #      utc_end 1919-12-31 23:07:16 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60557760000, #    local_end 1920-01-01 00:00:00 (Thu)
  3164,
  0,
  'LMT',
      ],
      [
  60557756836, #    utc_start 1919-12-31 23:07:16 (Wed)
  61560781200, #      utc_end 1951-10-14 01:00:00 (Sun)
  60557760436, #  local_start 1920-01-01 00:07:16 (Thu)
  61560784800, #    local_end 1951-10-14 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  61560781200, #    utc_start 1951-10-14 01:00:00 (Sun)
  61567596000, #      utc_end 1951-12-31 22:00:00 (Mon)
  61560788400, #  local_start 1951-10-14 03:00:00 (Sun)
  61567603200, #    local_end 1952-01-01 00:00:00 (Tue)
  7200,
  1,
  'CEST',
      ],
      [
  61567596000, #    utc_start 1951-12-31 22:00:00 (Mon)
  61623507600, #      utc_end 1953-10-09 01:00:00 (Fri)
  61567599600, #  local_start 1951-12-31 23:00:00 (Mon)
  61623511200, #    local_end 1953-10-09 02:00:00 (Fri)
  3600,
  0,
  'CET',
      ],
      [
  61623507600, #    utc_start 1953-10-09 01:00:00 (Fri)
  61630754400, #      utc_end 1953-12-31 22:00:00 (Thu)
  61623514800, #  local_start 1953-10-09 03:00:00 (Fri)
  61630761600, #    local_end 1954-01-01 00:00:00 (Fri)
  7200,
  1,
  'CEST',
      ],
      [
  61630754400, #    utc_start 1953-12-31 22:00:00 (Thu)
  61685794800, #      utc_end 1955-09-29 23:00:00 (Thu)
  61630758000, #  local_start 1953-12-31 23:00:00 (Thu)
  61685798400, #    local_end 1955-09-30 00:00:00 (Fri)
  3600,
  0,
  'CET',
      ],
      [
  61685794800, #    utc_start 1955-09-29 23:00:00 (Thu)
  61693826400, #      utc_end 1955-12-31 22:00:00 (Sat)
  61685802000, #  local_start 1955-09-30 01:00:00 (Fri)
  61693833600, #    local_end 1956-01-01 00:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  61693826400, #    utc_start 1955-12-31 22:00:00 (Sat)
  61788524400, #      utc_end 1958-12-31 23:00:00 (Wed)
  61693830000, #  local_start 1955-12-31 23:00:00 (Sat)
  61788528000, #    local_end 1959-01-01 00:00:00 (Thu)
  3600,
  0,
  'CET',
      ],
      [
  61788524400, #    utc_start 1958-12-31 23:00:00 (Wed)
  62514367200, #      utc_end 1981-12-31 22:00:00 (Thu)
  61788531600, #  local_start 1959-01-01 01:00:00 (Thu)
  62514374400, #    local_end 1982-01-01 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  62514367200, #    utc_start 1981-12-31 22:00:00 (Thu)
  62522146800, #      utc_end 1982-03-31 23:00:00 (Wed)
  62514370800, #  local_start 1981-12-31 23:00:00 (Thu)
  62522150400, #    local_end 1982-04-01 00:00:00 (Thu)
  3600,
  0,
  'CET',
      ],
      [
  62522146800, #    utc_start 1982-03-31 23:00:00 (Wed)
  62537954400, #      utc_end 1982-09-30 22:00:00 (Thu)
  62522154000, #  local_start 1982-04-01 01:00:00 (Thu)
  62537961600, #    local_end 1982-10-01 00:00:00 (Fri)
  7200,
  1,
  'CEST',
      ],
      [
  62537954400, #    utc_start 1982-09-30 22:00:00 (Thu)
  62553682800, #      utc_end 1983-03-31 23:00:00 (Thu)
  62537958000, #  local_start 1982-09-30 23:00:00 (Thu)
  62553686400, #    local_end 1983-04-01 00:00:00 (Fri)
  3600,
  0,
  'CET',
      ],
      [
  62553682800, #    utc_start 1983-03-31 23:00:00 (Thu)
  62569490400, #      utc_end 1983-09-30 22:00:00 (Fri)
  62553690000, #  local_start 1983-04-01 01:00:00 (Fri)
  62569497600, #    local_end 1983-10-01 00:00:00 (Sat)
  7200,
  1,
  'CEST',
      ],
      [
  62569490400, #    utc_start 1983-09-30 22:00:00 (Fri)
  62585305200, #      utc_end 1984-03-31 23:00:00 (Sat)
  62569494000, #  local_start 1983-09-30 23:00:00 (Fri)
  62585308800, #    local_end 1984-04-01 00:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62585305200, #    utc_start 1984-03-31 23:00:00 (Sat)
  62601112800, #      utc_end 1984-09-30 22:00:00 (Sun)
  62585312400, #  local_start 1984-04-01 01:00:00 (Sun)
  62601120000, #    local_end 1984-10-01 00:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  62601112800, #    utc_start 1984-09-30 22:00:00 (Sun)
  62617273200, #      utc_end 1985-04-05 23:00:00 (Fri)
  62601116400, #  local_start 1984-09-30 23:00:00 (Sun)
  62617276800, #    local_end 1985-04-06 00:00:00 (Sat)
  3600,
  0,
  'CET',
      ],
      [
  62617273200, #    utc_start 1985-04-05 23:00:00 (Fri)
  62632648800, #      utc_end 1985-09-30 22:00:00 (Mon)
  62617280400, #  local_start 1985-04-06 01:00:00 (Sat)
  62632656000, #    local_end 1985-10-01 00:00:00 (Tue)
  7200,
  1,
  'CEST',
      ],
      [
  62632648800, #    utc_start 1985-09-30 22:00:00 (Mon)
  62648636400, #      utc_end 1986-04-03 23:00:00 (Thu)
  62632652400, #  local_start 1985-09-30 23:00:00 (Mon)
  62648640000, #    local_end 1986-04-04 00:00:00 (Fri)
  3600,
  0,
  'CET',
      ],
      [
  62648636400, #    utc_start 1986-04-03 23:00:00 (Thu)
  62664357600, #      utc_end 1986-10-02 22:00:00 (Thu)
  62648643600, #  local_start 1986-04-04 01:00:00 (Fri)
  62664364800, #    local_end 1986-10-03 00:00:00 (Fri)
  7200,
  1,
  'CEST',
      ],
      [
  62664357600, #    utc_start 1986-10-02 22:00:00 (Thu)
  62679913200, #      utc_end 1987-03-31 23:00:00 (Tue)
  62664361200, #  local_start 1986-10-02 23:00:00 (Thu)
  62679916800, #    local_end 1987-04-01 00:00:00 (Wed)
  3600,
  0,
  'CET',
      ],
      [
  62679913200, #    utc_start 1987-03-31 23:00:00 (Tue)
  62695720800, #      utc_end 1987-09-30 22:00:00 (Wed)
  62679920400, #  local_start 1987-04-01 01:00:00 (Wed)
  62695728000, #    local_end 1987-10-01 00:00:00 (Thu)
  7200,
  1,
  'CEST',
      ],
      [
  62695720800, #    utc_start 1987-09-30 22:00:00 (Wed)
  62711535600, #      utc_end 1988-03-31 23:00:00 (Thu)
  62695724400, #  local_start 1987-09-30 23:00:00 (Wed)
  62711539200, #    local_end 1988-04-01 00:00:00 (Fri)
  3600,
  0,
  'CET',
      ],
      [
  62711535600, #    utc_start 1988-03-31 23:00:00 (Thu)
  62727343200, #      utc_end 1988-09-30 22:00:00 (Fri)
  62711542800, #  local_start 1988-04-01 01:00:00 (Fri)
  62727350400, #    local_end 1988-10-01 00:00:00 (Sat)
  7200,
  1,
  'CEST',
      ],
      [
  62727343200, #    utc_start 1988-09-30 22:00:00 (Fri)
  62743071600, #      utc_end 1989-03-31 23:00:00 (Fri)
  62727346800, #  local_start 1988-09-30 23:00:00 (Fri)
  62743075200, #    local_end 1989-04-01 00:00:00 (Sat)
  3600,
  0,
  'CET',
      ],
      [
  62743071600, #    utc_start 1989-03-31 23:00:00 (Fri)
  62758879200, #      utc_end 1989-09-30 22:00:00 (Sat)
  62743078800, #  local_start 1989-04-01 01:00:00 (Sat)
  62758886400, #    local_end 1989-10-01 00:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62758879200, #    utc_start 1989-09-30 22:00:00 (Sat)
  62777458800, #      utc_end 1990-05-03 23:00:00 (Thu)
  62758882800, #  local_start 1989-09-30 23:00:00 (Sat)
  62777462400, #    local_end 1990-05-04 00:00:00 (Fri)
  3600,
  0,
  'CET',
      ],
      [
  62777458800, #    utc_start 1990-05-03 23:00:00 (Thu)
  62979717600, #      utc_end 1996-09-29 22:00:00 (Sun)
  62777466000, #  local_start 1990-05-04 01:00:00 (Fri)
  62979724800, #    local_end 1996-09-30 00:00:00 (Mon)
  7200,
  0,
  'EET',
      ],
      [
  62979717600, #    utc_start 1996-09-29 22:00:00 (Sun)
  62995791600, #      utc_end 1997-04-03 23:00:00 (Thu)
  62979721200, #  local_start 1996-09-29 23:00:00 (Sun)
  62995795200, #    local_end 1997-04-04 00:00:00 (Fri)
  3600,
  0,
  'CET',
      ],
      [
  62995791600, #    utc_start 1997-04-03 23:00:00 (Thu)
  63011599200, #      utc_end 1997-10-03 22:00:00 (Fri)
  62995798800, #  local_start 1997-04-04 01:00:00 (Fri)
  63011606400, #    local_end 1997-10-04 00:00:00 (Sat)
  7200,
  1,
  'CEST',
      ],
      [
  63011599200, #    utc_start 1997-10-03 22:00:00 (Fri)
  63488188800, #      utc_end 2012-11-10 00:00:00 (Sat)
  63011606400, #  local_start 1997-10-04 00:00:00 (Sat)
  63488196000, #    local_end 2012-11-10 02:00:00 (Sat)
  7200,
  0,
  'EET',
      ],
      [
  63488188800, #    utc_start 2012-11-10 00:00:00 (Sat)
  63500198400, #      utc_end 2013-03-29 00:00:00 (Fri)
  63488192400, #  local_start 2012-11-10 01:00:00 (Sat)
  63500202000, #    local_end 2013-03-29 01:00:00 (Fri)
  3600,
  0,
  'CET',
      ],
      [
  63500198400, #    utc_start 2013-03-29 00:00:00 (Fri)
  63518342400, #      utc_end 2013-10-25 00:00:00 (Fri)
  63500205600, #  local_start 2013-03-29 02:00:00 (Fri)
  63518349600, #    local_end 2013-10-25 02:00:00 (Fri)
  7200,
  1,
  'CEST',
      ],
      [
  63518342400, #    utc_start 2013-10-25 00:00:00 (Fri)
  DateTime::TimeZone::INFINITY, #      utc_end
  63518349600, #  local_start 2013-10-25 02:00:00 (Fri)
  DateTime::TimeZone::INFINITY, #    local_end
  7200,
  0,
  'EET',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {13}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AFRICA_TRIPOLI

    $main::fatpacked{"DateTime/TimeZone/Africa/Tunis.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AFRICA_TUNIS';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/africa.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Africa::Tunis;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Africa::Tunis::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59338480756, #      utc_end 1881-05-11 23:19:16 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59338483200, #    local_end 1881-05-12 00:00:00 (Thu)
  2444,
  0,
  'LMT',
      ],
      [
  59338480756, #    utc_start 1881-05-11 23:19:16 (Wed)
  60279724239, #      utc_end 1911-03-10 23:50:39 (Fri)
  59338481317, #  local_start 1881-05-11 23:28:37 (Wed)
  60279724800, #    local_end 1911-03-11 00:00:00 (Sat)
  561,
  0,
  'PMT',
      ],
      [
  60279724239, #    utc_start 1911-03-10 23:50:39 (Fri)
  61166440800, #      utc_end 1939-04-15 22:00:00 (Sat)
  60279727839, #  local_start 1911-03-11 00:50:39 (Sat)
  61166444400, #    local_end 1939-04-15 23:00:00 (Sat)
  3600,
  0,
  'CET',
      ],
      [
  61166440800, #    utc_start 1939-04-15 22:00:00 (Sat)
  61185189600, #      utc_end 1939-11-18 22:00:00 (Sat)
  61166448000, #  local_start 1939-04-16 00:00:00 (Sun)
  61185196800, #    local_end 1939-11-19 00:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  61185189600, #    utc_start 1939-11-18 22:00:00 (Sat)
  61193743200, #      utc_end 1940-02-25 22:00:00 (Sun)
  61185193200, #  local_start 1939-11-18 23:00:00 (Sat)
  61193746800, #    local_end 1940-02-25 23:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  61193743200, #    utc_start 1940-02-25 22:00:00 (Sun)
  61244546400, #      utc_end 1941-10-05 22:00:00 (Sun)
  61193750400, #  local_start 1940-02-26 00:00:00 (Mon)
  61244553600, #    local_end 1941-10-06 00:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61244546400, #    utc_start 1941-10-05 22:00:00 (Sun)
  61257855600, #      utc_end 1942-03-08 23:00:00 (Sun)
  61244550000, #  local_start 1941-10-05 23:00:00 (Sun)
  61257859200, #    local_end 1942-03-09 00:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61257855600, #    utc_start 1942-03-08 23:00:00 (Sun)
  61278426000, #      utc_end 1942-11-02 01:00:00 (Mon)
  61257862800, #  local_start 1942-03-09 01:00:00 (Mon)
  61278433200, #    local_end 1942-11-02 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61278426000, #    utc_start 1942-11-02 01:00:00 (Mon)
  61291126800, #      utc_end 1943-03-29 01:00:00 (Mon)
  61278429600, #  local_start 1942-11-02 02:00:00 (Mon)
  61291130400, #    local_end 1943-03-29 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61291126800, #    utc_start 1943-03-29 01:00:00 (Mon)
  61292764800, #      utc_end 1943-04-17 00:00:00 (Sat)
  61291134000, #  local_start 1943-03-29 03:00:00 (Mon)
  61292772000, #    local_end 1943-04-17 02:00:00 (Sat)
  7200,
  1,
  'CEST',
      ],
      [
  61292764800, #    utc_start 1943-04-17 00:00:00 (Sat)
  61293459600, #      utc_end 1943-04-25 01:00:00 (Sun)
  61292768400, #  local_start 1943-04-17 01:00:00 (Sat)
  61293463200, #    local_end 1943-04-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  61293459600, #    utc_start 1943-04-25 01:00:00 (Sun)
  61307452800, #      utc_end 1943-10-04 00:00:00 (Mon)
  61293466800, #  local_start 1943-04-25 03:00:00 (Sun)
  61307460000, #    local_end 1943-10-04 02:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61307452800, #    utc_start 1943-10-04 00:00:00 (Mon)
  61323181200, #      utc_end 1944-04-03 01:00:00 (Mon)
  61307456400, #  local_start 1943-10-04 01:00:00 (Mon)
  61323184800, #    local_end 1944-04-03 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61323181200, #    utc_start 1944-04-03 01:00:00 (Mon)
  61339413600, #      utc_end 1944-10-07 22:00:00 (Sat)
  61323188400, #  local_start 1944-04-03 03:00:00 (Mon)
  61339420800, #    local_end 1944-10-08 00:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  61339413600, #    utc_start 1944-10-07 22:00:00 (Sat)
  61354630800, #      utc_end 1945-04-02 01:00:00 (Mon)
  61339417200, #  local_start 1944-10-07 23:00:00 (Sat)
  61354634400, #    local_end 1945-04-02 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61354630800, #    utc_start 1945-04-02 01:00:00 (Mon)
  61369048800, #      utc_end 1945-09-15 22:00:00 (Sat)
  61354638000, #  local_start 1945-04-02 03:00:00 (Mon)
  61369056000, #    local_end 1945-09-16 00:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  61369048800, #    utc_start 1945-09-15 22:00:00 (Sat)
  62366886000, #      utc_end 1977-04-29 23:00:00 (Fri)
  61369052400, #  local_start 1945-09-15 23:00:00 (Sat)
  62366889600, #    local_end 1977-04-30 00:00:00 (Sat)
  3600,
  0,
  'CET',
      ],
      [
  62366886000, #    utc_start 1977-04-29 23:00:00 (Fri)
  62379586800, #      utc_end 1977-09-23 23:00:00 (Fri)
  62366893200, #  local_start 1977-04-30 01:00:00 (Sat)
  62379594000, #    local_end 1977-09-24 01:00:00 (Sat)
  7200,
  1,
  'CEST',
      ],
      [
  62379586800, #    utc_start 1977-09-23 23:00:00 (Fri)
  62398508400, #      utc_end 1978-04-30 23:00:00 (Sun)
  62379590400, #  local_start 1977-09-24 00:00:00 (Sat)
  62398512000, #    local_end 1978-05-01 00:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  62398508400, #    utc_start 1978-04-30 23:00:00 (Sun)
  62411727600, #      utc_end 1978-09-30 23:00:00 (Sat)
  62398515600, #  local_start 1978-05-01 01:00:00 (Mon)
  62411734800, #    local_end 1978-10-01 01:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62411727600, #    utc_start 1978-09-30 23:00:00 (Sat)
  62716806000, #      utc_end 1988-05-31 23:00:00 (Tue)
  62411731200, #  local_start 1978-10-01 00:00:00 (Sun)
  62716809600, #    local_end 1988-06-01 00:00:00 (Wed)
  3600,
  0,
  'CET',
      ],
      [
  62716806000, #    utc_start 1988-05-31 23:00:00 (Tue)
  62726828400, #      utc_end 1988-09-24 23:00:00 (Sat)
  62716813200, #  local_start 1988-06-01 01:00:00 (Wed)
  62726835600, #    local_end 1988-09-25 01:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62726828400, #    utc_start 1988-09-24 23:00:00 (Sat)
  62742553200, #      utc_end 1989-03-25 23:00:00 (Sat)
  62726832000, #  local_start 1988-09-25 00:00:00 (Sun)
  62742556800, #    local_end 1989-03-26 00:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62742553200, #    utc_start 1989-03-25 23:00:00 (Sat)
  62758278000, #      utc_end 1989-09-23 23:00:00 (Sat)
  62742560400, #  local_start 1989-03-26 01:00:00 (Sun)
  62758285200, #    local_end 1989-09-24 01:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62758278000, #    utc_start 1989-09-23 23:00:00 (Sat)
  62777199600, #      utc_end 1990-04-30 23:00:00 (Mon)
  62758281600, #  local_start 1989-09-24 00:00:00 (Sun)
  62777203200, #    local_end 1990-05-01 00:00:00 (Tue)
  3600,
  0,
  'CET',
      ],
      [
  62777199600, #    utc_start 1990-04-30 23:00:00 (Mon)
  62790332400, #      utc_end 1990-09-29 23:00:00 (Sat)
  62777206800, #  local_start 1990-05-01 01:00:00 (Tue)
  62790339600, #    local_end 1990-09-30 01:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62790332400, #    utc_start 1990-09-29 23:00:00 (Sat)
  63250585200, #      utc_end 2005-04-30 23:00:00 (Sat)
  62790336000, #  local_start 1990-09-30 00:00:00 (Sun)
  63250588800, #    local_end 2005-05-01 00:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63250585200, #    utc_start 2005-04-30 23:00:00 (Sat)
  63263721600, #      utc_end 2005-09-30 00:00:00 (Fri)
  63250592400, #  local_start 2005-05-01 01:00:00 (Sun)
  63263728800, #    local_end 2005-09-30 02:00:00 (Fri)
  7200,
  1,
  'CEST',
      ],
      [
  63263721600, #    utc_start 2005-09-30 00:00:00 (Fri)
  63279018000, #      utc_end 2006-03-26 01:00:00 (Sun)
  63263725200, #  local_start 2005-09-30 01:00:00 (Fri)
  63279021600, #    local_end 2006-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63279018000, #    utc_start 2006-03-26 01:00:00 (Sun)
  63297766800, #      utc_end 2006-10-29 01:00:00 (Sun)
  63279025200, #  local_start 2006-03-26 03:00:00 (Sun)
  63297774000, #    local_end 2006-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63297766800, #    utc_start 2006-10-29 01:00:00 (Sun)
  63310467600, #      utc_end 2007-03-25 01:00:00 (Sun)
  63297770400, #  local_start 2006-10-29 02:00:00 (Sun)
  63310471200, #    local_end 2007-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63310467600, #    utc_start 2007-03-25 01:00:00 (Sun)
  63329216400, #      utc_end 2007-10-28 01:00:00 (Sun)
  63310474800, #  local_start 2007-03-25 03:00:00 (Sun)
  63329223600, #    local_end 2007-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63329216400, #    utc_start 2007-10-28 01:00:00 (Sun)
  63342522000, #      utc_end 2008-03-30 01:00:00 (Sun)
  63329220000, #  local_start 2007-10-28 02:00:00 (Sun)
  63342525600, #    local_end 2008-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63342522000, #    utc_start 2008-03-30 01:00:00 (Sun)
  63360666000, #      utc_end 2008-10-26 01:00:00 (Sun)
  63342529200, #  local_start 2008-03-30 03:00:00 (Sun)
  63360673200, #    local_end 2008-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63360666000, #    utc_start 2008-10-26 01:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #      utc_end
  63360669600, #  local_start 2008-10-26 02:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  3600,
  0,
  'CET',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {16}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AFRICA_TUNIS

    $main::fatpacked{"DateTime/TimeZone/Africa/Windhoek.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AFRICA_WINDHOEK';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/africa.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Africa::Windhoek;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Africa::Windhoek::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59677512696, #      utc_end 1892-02-07 22:51:36 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59677516800, #    local_end 1892-02-08 00:00:00 (Mon)
  4104,
  0,
  'LMT',
      ],
      [
  59677512696, #    utc_start 1892-02-07 22:51:36 (Sun)
  60026394600, #      utc_end 1903-02-28 22:30:00 (Sat)
  59677518096, #  local_start 1892-02-08 00:21:36 (Mon)
  60026400000, #    local_end 1903-03-01 00:00:00 (Sun)
  5400,
  0,
  '+0130',
      ],
      [
  60026394600, #    utc_start 1903-02-28 22:30:00 (Sat)
  61274707200, #      utc_end 1942-09-20 00:00:00 (Sun)
  60026401800, #  local_start 1903-03-01 00:30:00 (Sun)
  61274714400, #    local_end 1942-09-20 02:00:00 (Sun)
  7200,
  0,
  'SAST',
      ],
      [
  61274707200, #    utc_start 1942-09-20 00:00:00 (Sun)
  61290428400, #      utc_end 1943-03-20 23:00:00 (Sat)
  61274718000, #  local_start 1942-09-20 03:00:00 (Sun)
  61290439200, #    local_end 1943-03-21 02:00:00 (Sun)
  10800,
  1,
  'SAST',
      ],
      [
  61290428400, #    utc_start 1943-03-20 23:00:00 (Sat)
  62773653600, #      utc_end 1990-03-20 22:00:00 (Tue)
  61290435600, #  local_start 1943-03-21 01:00:00 (Sun)
  62773660800, #    local_end 1990-03-21 00:00:00 (Wed)
  7200,
  0,
  'SAST',
      ],
      [
  62773653600, #    utc_start 1990-03-20 22:00:00 (Tue)
  62899884000, #      utc_end 1994-03-20 22:00:00 (Sun)
  62773660800, #  local_start 1990-03-21 00:00:00 (Wed)
  62899891200, #    local_end 1994-03-21 00:00:00 (Mon)
  7200,
  0,
  'CAT',
      ],
      [
  62899884000, #    utc_start 1994-03-20 22:00:00 (Sun)
  62914323600, #      utc_end 1994-09-04 01:00:00 (Sun)
  62899887600, #  local_start 1994-03-20 23:00:00 (Sun)
  62914327200, #    local_end 1994-09-04 02:00:00 (Sun)
  3600,
  1,
  'WAT',
      ],
      [
  62914323600, #    utc_start 1994-09-04 01:00:00 (Sun)
  62932464000, #      utc_end 1995-04-02 00:00:00 (Sun)
  62914330800, #  local_start 1994-09-04 03:00:00 (Sun)
  62932471200, #    local_end 1995-04-02 02:00:00 (Sun)
  7200,
  0,
  'CAT',
      ],
      [
  62932464000, #    utc_start 1995-04-02 00:00:00 (Sun)
  62945773200, #      utc_end 1995-09-03 01:00:00 (Sun)
  62932467600, #  local_start 1995-04-02 01:00:00 (Sun)
  62945776800, #    local_end 1995-09-03 02:00:00 (Sun)
  3600,
  1,
  'WAT',
      ],
      [
  62945773200, #    utc_start 1995-09-03 01:00:00 (Sun)
  62964518400, #      utc_end 1996-04-07 00:00:00 (Sun)
  62945780400, #  local_start 1995-09-03 03:00:00 (Sun)
  62964525600, #    local_end 1996-04-07 02:00:00 (Sun)
  7200,
  0,
  'CAT',
      ],
      [
  62964518400, #    utc_start 1996-04-07 00:00:00 (Sun)
  62977222800, #      utc_end 1996-09-01 01:00:00 (Sun)
  62964522000, #  local_start 1996-04-07 01:00:00 (Sun)
  62977226400, #    local_end 1996-09-01 02:00:00 (Sun)
  3600,
  1,
  'WAT',
      ],
      [
  62977222800, #    utc_start 1996-09-01 01:00:00 (Sun)
  62995968000, #      utc_end 1997-04-06 00:00:00 (Sun)
  62977230000, #  local_start 1996-09-01 03:00:00 (Sun)
  62995975200, #    local_end 1997-04-06 02:00:00 (Sun)
  7200,
  0,
  'CAT',
      ],
      [
  62995968000, #    utc_start 1997-04-06 00:00:00 (Sun)
  63009277200, #      utc_end 1997-09-07 01:00:00 (Sun)
  62995971600, #  local_start 1997-04-06 01:00:00 (Sun)
  63009280800, #    local_end 1997-09-07 02:00:00 (Sun)
  3600,
  1,
  'WAT',
      ],
      [
  63009277200, #    utc_start 1997-09-07 01:00:00 (Sun)
  63027417600, #      utc_end 1998-04-05 00:00:00 (Sun)
  63009284400, #  local_start 1997-09-07 03:00:00 (Sun)
  63027424800, #    local_end 1998-04-05 02:00:00 (Sun)
  7200,
  0,
  'CAT',
      ],
      [
  63027417600, #    utc_start 1998-04-05 00:00:00 (Sun)
  63040726800, #      utc_end 1998-09-06 01:00:00 (Sun)
  63027421200, #  local_start 1998-04-05 01:00:00 (Sun)
  63040730400, #    local_end 1998-09-06 02:00:00 (Sun)
  3600,
  1,
  'WAT',
      ],
      [
  63040726800, #    utc_start 1998-09-06 01:00:00 (Sun)
  63058867200, #      utc_end 1999-04-04 00:00:00 (Sun)
  63040734000, #  local_start 1998-09-06 03:00:00 (Sun)
  63058874400, #    local_end 1999-04-04 02:00:00 (Sun)
  7200,
  0,
  'CAT',
      ],
      [
  63058867200, #    utc_start 1999-04-04 00:00:00 (Sun)
  63072176400, #      utc_end 1999-09-05 01:00:00 (Sun)
  63058870800, #  local_start 1999-04-04 01:00:00 (Sun)
  63072180000, #    local_end 1999-09-05 02:00:00 (Sun)
  3600,
  1,
  'WAT',
      ],
      [
  63072176400, #    utc_start 1999-09-05 01:00:00 (Sun)
  63090316800, #      utc_end 2000-04-02 00:00:00 (Sun)
  63072183600, #  local_start 1999-09-05 03:00:00 (Sun)
  63090324000, #    local_end 2000-04-02 02:00:00 (Sun)
  7200,
  0,
  'CAT',
      ],
      [
  63090316800, #    utc_start 2000-04-02 00:00:00 (Sun)
  63103626000, #      utc_end 2000-09-03 01:00:00 (Sun)
  63090320400, #  local_start 2000-04-02 01:00:00 (Sun)
  63103629600, #    local_end 2000-09-03 02:00:00 (Sun)
  3600,
  1,
  'WAT',
      ],
      [
  63103626000, #    utc_start 2000-09-03 01:00:00 (Sun)
  63121766400, #      utc_end 2001-04-01 00:00:00 (Sun)
  63103633200, #  local_start 2000-09-03 03:00:00 (Sun)
  63121773600, #    local_end 2001-04-01 02:00:00 (Sun)
  7200,
  0,
  'CAT',
      ],
      [
  63121766400, #    utc_start 2001-04-01 00:00:00 (Sun)
  63135075600, #      utc_end 2001-09-02 01:00:00 (Sun)
  63121770000, #  local_start 2001-04-01 01:00:00 (Sun)
  63135079200, #    local_end 2001-09-02 02:00:00 (Sun)
  3600,
  1,
  'WAT',
      ],
      [
  63135075600, #    utc_start 2001-09-02 01:00:00 (Sun)
  63153820800, #      utc_end 2002-04-07 00:00:00 (Sun)
  63135082800, #  local_start 2001-09-02 03:00:00 (Sun)
  63153828000, #    local_end 2002-04-07 02:00:00 (Sun)
  7200,
  0,
  'CAT',
      ],
      [
  63153820800, #    utc_start 2002-04-07 00:00:00 (Sun)
  63166525200, #      utc_end 2002-09-01 01:00:00 (Sun)
  63153824400, #  local_start 2002-04-07 01:00:00 (Sun)
  63166528800, #    local_end 2002-09-01 02:00:00 (Sun)
  3600,
  1,
  'WAT',
      ],
      [
  63166525200, #    utc_start 2002-09-01 01:00:00 (Sun)
  63185270400, #      utc_end 2003-04-06 00:00:00 (Sun)
  63166532400, #  local_start 2002-09-01 03:00:00 (Sun)
  63185277600, #    local_end 2003-04-06 02:00:00 (Sun)
  7200,
  0,
  'CAT',
      ],
      [
  63185270400, #    utc_start 2003-04-06 00:00:00 (Sun)
  63198579600, #      utc_end 2003-09-07 01:00:00 (Sun)
  63185274000, #  local_start 2003-04-06 01:00:00 (Sun)
  63198583200, #    local_end 2003-09-07 02:00:00 (Sun)
  3600,
  1,
  'WAT',
      ],
      [
  63198579600, #    utc_start 2003-09-07 01:00:00 (Sun)
  63216720000, #      utc_end 2004-04-04 00:00:00 (Sun)
  63198586800, #  local_start 2003-09-07 03:00:00 (Sun)
  63216727200, #    local_end 2004-04-04 02:00:00 (Sun)
  7200,
  0,
  'CAT',
      ],
      [
  63216720000, #    utc_start 2004-04-04 00:00:00 (Sun)
  63230029200, #      utc_end 2004-09-05 01:00:00 (Sun)
  63216723600, #  local_start 2004-04-04 01:00:00 (Sun)
  63230032800, #    local_end 2004-09-05 02:00:00 (Sun)
  3600,
  1,
  'WAT',
      ],
      [
  63230029200, #    utc_start 2004-09-05 01:00:00 (Sun)
  63248169600, #      utc_end 2005-04-03 00:00:00 (Sun)
  63230036400, #  local_start 2004-09-05 03:00:00 (Sun)
  63248176800, #    local_end 2005-04-03 02:00:00 (Sun)
  7200,
  0,
  'CAT',
      ],
      [
  63248169600, #    utc_start 2005-04-03 00:00:00 (Sun)
  63261478800, #      utc_end 2005-09-04 01:00:00 (Sun)
  63248173200, #  local_start 2005-04-03 01:00:00 (Sun)
  63261482400, #    local_end 2005-09-04 02:00:00 (Sun)
  3600,
  1,
  'WAT',
      ],
      [
  63261478800, #    utc_start 2005-09-04 01:00:00 (Sun)
  63279619200, #      utc_end 2006-04-02 00:00:00 (Sun)
  63261486000, #  local_start 2005-09-04 03:00:00 (Sun)
  63279626400, #    local_end 2006-04-02 02:00:00 (Sun)
  7200,
  0,
  'CAT',
      ],
      [
  63279619200, #    utc_start 2006-04-02 00:00:00 (Sun)
  63292928400, #      utc_end 2006-09-03 01:00:00 (Sun)
  63279622800, #  local_start 2006-04-02 01:00:00 (Sun)
  63292932000, #    local_end 2006-09-03 02:00:00 (Sun)
  3600,
  1,
  'WAT',
      ],
      [
  63292928400, #    utc_start 2006-09-03 01:00:00 (Sun)
  63311068800, #      utc_end 2007-04-01 00:00:00 (Sun)
  63292935600, #  local_start 2006-09-03 03:00:00 (Sun)
  63311076000, #    local_end 2007-04-01 02:00:00 (Sun)
  7200,
  0,
  'CAT',
      ],
      [
  63311068800, #    utc_start 2007-04-01 00:00:00 (Sun)
  63324378000, #      utc_end 2007-09-02 01:00:00 (Sun)
  63311072400, #  local_start 2007-04-01 01:00:00 (Sun)
  63324381600, #    local_end 2007-09-02 02:00:00 (Sun)
  3600,
  1,
  'WAT',
      ],
      [
  63324378000, #    utc_start 2007-09-02 01:00:00 (Sun)
  63343123200, #      utc_end 2008-04-06 00:00:00 (Sun)
  63324385200, #  local_start 2007-09-02 03:00:00 (Sun)
  63343130400, #    local_end 2008-04-06 02:00:00 (Sun)
  7200,
  0,
  'CAT',
      ],
      [
  63343123200, #    utc_start 2008-04-06 00:00:00 (Sun)
  63356432400, #      utc_end 2008-09-07 01:00:00 (Sun)
  63343126800, #  local_start 2008-04-06 01:00:00 (Sun)
  63356436000, #    local_end 2008-09-07 02:00:00 (Sun)
  3600,
  1,
  'WAT',
      ],
      [
  63356432400, #    utc_start 2008-09-07 01:00:00 (Sun)
  63374572800, #      utc_end 2009-04-05 00:00:00 (Sun)
  63356439600, #  local_start 2008-09-07 03:00:00 (Sun)
  63374580000, #    local_end 2009-04-05 02:00:00 (Sun)
  7200,
  0,
  'CAT',
      ],
      [
  63374572800, #    utc_start 2009-04-05 00:00:00 (Sun)
  63387882000, #      utc_end 2009-09-06 01:00:00 (Sun)
  63374576400, #  local_start 2009-04-05 01:00:00 (Sun)
  63387885600, #    local_end 2009-09-06 02:00:00 (Sun)
  3600,
  1,
  'WAT',
      ],
      [
  63387882000, #    utc_start 2009-09-06 01:00:00 (Sun)
  63406022400, #      utc_end 2010-04-04 00:00:00 (Sun)
  63387889200, #  local_start 2009-09-06 03:00:00 (Sun)
  63406029600, #    local_end 2010-04-04 02:00:00 (Sun)
  7200,
  0,
  'CAT',
      ],
      [
  63406022400, #    utc_start 2010-04-04 00:00:00 (Sun)
  63419331600, #      utc_end 2010-09-05 01:00:00 (Sun)
  63406026000, #  local_start 2010-04-04 01:00:00 (Sun)
  63419335200, #    local_end 2010-09-05 02:00:00 (Sun)
  3600,
  1,
  'WAT',
      ],
      [
  63419331600, #    utc_start 2010-09-05 01:00:00 (Sun)
  63437472000, #      utc_end 2011-04-03 00:00:00 (Sun)
  63419338800, #  local_start 2010-09-05 03:00:00 (Sun)
  63437479200, #    local_end 2011-04-03 02:00:00 (Sun)
  7200,
  0,
  'CAT',
      ],
      [
  63437472000, #    utc_start 2011-04-03 00:00:00 (Sun)
  63450781200, #      utc_end 2011-09-04 01:00:00 (Sun)
  63437475600, #  local_start 2011-04-03 01:00:00 (Sun)
  63450784800, #    local_end 2011-09-04 02:00:00 (Sun)
  3600,
  1,
  'WAT',
      ],
      [
  63450781200, #    utc_start 2011-09-04 01:00:00 (Sun)
  63468921600, #      utc_end 2012-04-01 00:00:00 (Sun)
  63450788400, #  local_start 2011-09-04 03:00:00 (Sun)
  63468928800, #    local_end 2012-04-01 02:00:00 (Sun)
  7200,
  0,
  'CAT',
      ],
      [
  63468921600, #    utc_start 2012-04-01 00:00:00 (Sun)
  63482230800, #      utc_end 2012-09-02 01:00:00 (Sun)
  63468925200, #  local_start 2012-04-01 01:00:00 (Sun)
  63482234400, #    local_end 2012-09-02 02:00:00 (Sun)
  3600,
  1,
  'WAT',
      ],
      [
  63482230800, #    utc_start 2012-09-02 01:00:00 (Sun)
  63500976000, #      utc_end 2013-04-07 00:00:00 (Sun)
  63482238000, #  local_start 2012-09-02 03:00:00 (Sun)
  63500983200, #    local_end 2013-04-07 02:00:00 (Sun)
  7200,
  0,
  'CAT',
      ],
      [
  63500976000, #    utc_start 2013-04-07 00:00:00 (Sun)
  63513680400, #      utc_end 2013-09-01 01:00:00 (Sun)
  63500979600, #  local_start 2013-04-07 01:00:00 (Sun)
  63513684000, #    local_end 2013-09-01 02:00:00 (Sun)
  3600,
  1,
  'WAT',
      ],
      [
  63513680400, #    utc_start 2013-09-01 01:00:00 (Sun)
  63532425600, #      utc_end 2014-04-06 00:00:00 (Sun)
  63513687600, #  local_start 2013-09-01 03:00:00 (Sun)
  63532432800, #    local_end 2014-04-06 02:00:00 (Sun)
  7200,
  0,
  'CAT',
      ],
      [
  63532425600, #    utc_start 2014-04-06 00:00:00 (Sun)
  63545734800, #      utc_end 2014-09-07 01:00:00 (Sun)
  63532429200, #  local_start 2014-04-06 01:00:00 (Sun)
  63545738400, #    local_end 2014-09-07 02:00:00 (Sun)
  3600,
  1,
  'WAT',
      ],
      [
  63545734800, #    utc_start 2014-09-07 01:00:00 (Sun)
  63563875200, #      utc_end 2015-04-05 00:00:00 (Sun)
  63545742000, #  local_start 2014-09-07 03:00:00 (Sun)
  63563882400, #    local_end 2015-04-05 02:00:00 (Sun)
  7200,
  0,
  'CAT',
      ],
      [
  63563875200, #    utc_start 2015-04-05 00:00:00 (Sun)
  63577184400, #      utc_end 2015-09-06 01:00:00 (Sun)
  63563878800, #  local_start 2015-04-05 01:00:00 (Sun)
  63577188000, #    local_end 2015-09-06 02:00:00 (Sun)
  3600,
  1,
  'WAT',
      ],
      [
  63577184400, #    utc_start 2015-09-06 01:00:00 (Sun)
  63595324800, #      utc_end 2016-04-03 00:00:00 (Sun)
  63577191600, #  local_start 2015-09-06 03:00:00 (Sun)
  63595332000, #    local_end 2016-04-03 02:00:00 (Sun)
  7200,
  0,
  'CAT',
      ],
      [
  63595324800, #    utc_start 2016-04-03 00:00:00 (Sun)
  63608634000, #      utc_end 2016-09-04 01:00:00 (Sun)
  63595328400, #  local_start 2016-04-03 01:00:00 (Sun)
  63608637600, #    local_end 2016-09-04 02:00:00 (Sun)
  3600,
  1,
  'WAT',
      ],
      [
  63608634000, #    utc_start 2016-09-04 01:00:00 (Sun)
  63626774400, #      utc_end 2017-04-02 00:00:00 (Sun)
  63608641200, #  local_start 2016-09-04 03:00:00 (Sun)
  63626781600, #    local_end 2017-04-02 02:00:00 (Sun)
  7200,
  0,
  'CAT',
      ],
      [
  63626774400, #    utc_start 2017-04-02 00:00:00 (Sun)
  63640083600, #      utc_end 2017-09-03 01:00:00 (Sun)
  63626778000, #  local_start 2017-04-02 01:00:00 (Sun)
  63640087200, #    local_end 2017-09-03 02:00:00 (Sun)
  3600,
  1,
  'WAT',
      ],
      [
  63640083600, #    utc_start 2017-09-03 01:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #      utc_end
  63640090800, #  local_start 2017-09-03 03:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  7200,
  0,
  'CAT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {25}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AFRICA_WINDHOEK

    $main::fatpacked{"DateTime/TimeZone/America/Adak.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_ADAK';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Adak;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Adak::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  58910459473, #      utc_end 1867-10-19 00:31:13 (Sat)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  58910503475, #    local_end 1867-10-19 12:44:35 (Sat)
  44002,
  0,
  'LMT',
      ],
      [
  58910459473, #    utc_start 1867-10-19 00:31:13 (Sat)
  59946738398, #      utc_end 1900-08-20 23:46:38 (Mon)
  58910417075, #  local_start 1867-10-18 12:44:35 (Fri)
  59946696000, #    local_end 1900-08-20 12:00:00 (Mon)
  -42398,
  0,
  'LMT',
      ],
      [
  59946738398, #    utc_start 1900-08-20 23:46:38 (Mon)
  61252110000, #      utc_end 1942-01-01 11:00:00 (Thu)
  59946698798, #  local_start 1900-08-20 12:46:38 (Mon)
  61252070400, #    local_end 1942-01-01 00:00:00 (Thu)
  -39600,
  0,
  'NST',
      ],
      [
  61252110000, #    utc_start 1942-01-01 11:00:00 (Thu)
  61255486800, #      utc_end 1942-02-09 13:00:00 (Mon)
  61252070400, #  local_start 1942-01-01 00:00:00 (Thu)
  61255447200, #    local_end 1942-02-09 02:00:00 (Mon)
  -39600,
  0,
  'NST',
      ],
      [
  61255486800, #    utc_start 1942-02-09 13:00:00 (Mon)
  61366287600, #      utc_end 1945-08-14 23:00:00 (Tue)
  61255450800, #  local_start 1942-02-09 03:00:00 (Mon)
  61366251600, #    local_end 1945-08-14 13:00:00 (Tue)
  -36000,
  1,
  'NWT',
      ],
      [
  61366287600, #    utc_start 1945-08-14 23:00:00 (Tue)
  61370308800, #      utc_end 1945-09-30 12:00:00 (Sun)
  61366251600, #  local_start 1945-08-14 13:00:00 (Tue)
  61370272800, #    local_end 1945-09-30 02:00:00 (Sun)
  -36000,
  1,
  'NPT',
      ],
      [
  61370308800, #    utc_start 1945-09-30 12:00:00 (Sun)
  61378340400, #      utc_end 1946-01-01 11:00:00 (Tue)
  61370269200, #  local_start 1945-09-30 01:00:00 (Sun)
  61378300800, #    local_end 1946-01-01 00:00:00 (Tue)
  -39600,
  0,
  'NST',
      ],
      [
  61378340400, #    utc_start 1946-01-01 11:00:00 (Tue)
  62048804400, #      utc_end 1967-04-01 11:00:00 (Sat)
  61378300800, #  local_start 1946-01-01 00:00:00 (Tue)
  62048764800, #    local_end 1967-04-01 00:00:00 (Sat)
  -39600,
  0,
  'NST',
      ],
      [
  62048804400, #    utc_start 1967-04-01 11:00:00 (Sat)
  62104186800, #      utc_end 1969-01-01 11:00:00 (Wed)
  62048764800, #  local_start 1967-04-01 00:00:00 (Sat)
  62104147200, #    local_end 1969-01-01 00:00:00 (Wed)
  -39600,
  0,
  'BST',
      ],
      [
  62104186800, #    utc_start 1969-01-01 11:00:00 (Wed)
  62114216400, #      utc_end 1969-04-27 13:00:00 (Sun)
  62104147200, #  local_start 1969-01-01 00:00:00 (Wed)
  62114176800, #    local_end 1969-04-27 02:00:00 (Sun)
  -39600,
  0,
  'BST',
      ],
      [
  62114216400, #    utc_start 1969-04-27 13:00:00 (Sun)
  62129937600, #      utc_end 1969-10-26 12:00:00 (Sun)
  62114180400, #  local_start 1969-04-27 03:00:00 (Sun)
  62129901600, #    local_end 1969-10-26 02:00:00 (Sun)
  -36000,
  1,
  'BDT',
      ],
      [
  62129937600, #    utc_start 1969-10-26 12:00:00 (Sun)
  62145666000, #      utc_end 1970-04-26 13:00:00 (Sun)
  62129898000, #  local_start 1969-10-26 01:00:00 (Sun)
  62145626400, #    local_end 1970-04-26 02:00:00 (Sun)
  -39600,
  0,
  'BST',
      ],
      [
  62145666000, #    utc_start 1970-04-26 13:00:00 (Sun)
  62161387200, #      utc_end 1970-10-25 12:00:00 (Sun)
  62145630000, #  local_start 1970-04-26 03:00:00 (Sun)
  62161351200, #    local_end 1970-10-25 02:00:00 (Sun)
  -36000,
  1,
  'BDT',
      ],
      [
  62161387200, #    utc_start 1970-10-25 12:00:00 (Sun)
  62177115600, #      utc_end 1971-04-25 13:00:00 (Sun)
  62161347600, #  local_start 1970-10-25 01:00:00 (Sun)
  62177076000, #    local_end 1971-04-25 02:00:00 (Sun)
  -39600,
  0,
  'BST',
      ],
      [
  62177115600, #    utc_start 1971-04-25 13:00:00 (Sun)
  62193441600, #      utc_end 1971-10-31 12:00:00 (Sun)
  62177079600, #  local_start 1971-04-25 03:00:00 (Sun)
  62193405600, #    local_end 1971-10-31 02:00:00 (Sun)
  -36000,
  1,
  'BDT',
      ],
      [
  62193441600, #    utc_start 1971-10-31 12:00:00 (Sun)
  62209170000, #      utc_end 1972-04-30 13:00:00 (Sun)
  62193402000, #  local_start 1971-10-31 01:00:00 (Sun)
  62209130400, #    local_end 1972-04-30 02:00:00 (Sun)
  -39600,
  0,
  'BST',
      ],
      [
  62209170000, #    utc_start 1972-04-30 13:00:00 (Sun)
  62224891200, #      utc_end 1972-10-29 12:00:00 (Sun)
  62209134000, #  local_start 1972-04-30 03:00:00 (Sun)
  62224855200, #    local_end 1972-10-29 02:00:00 (Sun)
  -36000,
  1,
  'BDT',
      ],
      [
  62224891200, #    utc_start 1972-10-29 12:00:00 (Sun)
  62240619600, #      utc_end 1973-04-29 13:00:00 (Sun)
  62224851600, #  local_start 1972-10-29 01:00:00 (Sun)
  62240580000, #    local_end 1973-04-29 02:00:00 (Sun)
  -39600,
  0,
  'BST',
      ],
      [
  62240619600, #    utc_start 1973-04-29 13:00:00 (Sun)
  62256340800, #      utc_end 1973-10-28 12:00:00 (Sun)
  62240583600, #  local_start 1973-04-29 03:00:00 (Sun)
  62256304800, #    local_end 1973-10-28 02:00:00 (Sun)
  -36000,
  1,
  'BDT',
      ],
      [
  62256340800, #    utc_start 1973-10-28 12:00:00 (Sun)
  62262392400, #      utc_end 1974-01-06 13:00:00 (Sun)
  62256301200, #  local_start 1973-10-28 01:00:00 (Sun)
  62262352800, #    local_end 1974-01-06 02:00:00 (Sun)
  -39600,
  0,
  'BST',
      ],
      [
  62262392400, #    utc_start 1974-01-06 13:00:00 (Sun)
  62287790400, #      utc_end 1974-10-27 12:00:00 (Sun)
  62262356400, #  local_start 1974-01-06 03:00:00 (Sun)
  62287754400, #    local_end 1974-10-27 02:00:00 (Sun)
  -36000,
  1,
  'BDT',
      ],
      [
  62287790400, #    utc_start 1974-10-27 12:00:00 (Sun)
  62298075600, #      utc_end 1975-02-23 13:00:00 (Sun)
  62287750800, #  local_start 1974-10-27 01:00:00 (Sun)
  62298036000, #    local_end 1975-02-23 02:00:00 (Sun)
  -39600,
  0,
  'BST',
      ],
      [
  62298075600, #    utc_start 1975-02-23 13:00:00 (Sun)
  62319240000, #      utc_end 1975-10-26 12:00:00 (Sun)
  62298039600, #  local_start 1975-02-23 03:00:00 (Sun)
  62319204000, #    local_end 1975-10-26 02:00:00 (Sun)
  -36000,
  1,
  'BDT',
      ],
      [
  62319240000, #    utc_start 1975-10-26 12:00:00 (Sun)
  62334968400, #      utc_end 1976-04-25 13:00:00 (Sun)
  62319200400, #  local_start 1975-10-26 01:00:00 (Sun)
  62334928800, #    local_end 1976-04-25 02:00:00 (Sun)
  -39600,
  0,
  'BST',
      ],
      [
  62334968400, #    utc_start 1976-04-25 13:00:00 (Sun)
  62351294400, #      utc_end 1976-10-31 12:00:00 (Sun)
  62334932400, #  local_start 1976-04-25 03:00:00 (Sun)
  62351258400, #    local_end 1976-10-31 02:00:00 (Sun)
  -36000,
  1,
  'BDT',
      ],
      [
  62351294400, #    utc_start 1976-10-31 12:00:00 (Sun)
  62366418000, #      utc_end 1977-04-24 13:00:00 (Sun)
  62351254800, #  local_start 1976-10-31 01:00:00 (Sun)
  62366378400, #    local_end 1977-04-24 02:00:00 (Sun)
  -39600,
  0,
  'BST',
      ],
      [
  62366418000, #    utc_start 1977-04-24 13:00:00 (Sun)
  62382744000, #      utc_end 1977-10-30 12:00:00 (Sun)
  62366382000, #  local_start 1977-04-24 03:00:00 (Sun)
  62382708000, #    local_end 1977-10-30 02:00:00 (Sun)
  -36000,
  1,
  'BDT',
      ],
      [
  62382744000, #    utc_start 1977-10-30 12:00:00 (Sun)
  62398472400, #      utc_end 1978-04-30 13:00:00 (Sun)
  62382704400, #  local_start 1977-10-30 01:00:00 (Sun)
  62398432800, #    local_end 1978-04-30 02:00:00 (Sun)
  -39600,
  0,
  'BST',
      ],
      [
  62398472400, #    utc_start 1978-04-30 13:00:00 (Sun)
  62414193600, #      utc_end 1978-10-29 12:00:00 (Sun)
  62398436400, #  local_start 1978-04-30 03:00:00 (Sun)
  62414157600, #    local_end 1978-10-29 02:00:00 (Sun)
  -36000,
  1,
  'BDT',
      ],
      [
  62414193600, #    utc_start 1978-10-29 12:00:00 (Sun)
  62429922000, #      utc_end 1979-04-29 13:00:00 (Sun)
  62414154000, #  local_start 1978-10-29 01:00:00 (Sun)
  62429882400, #    local_end 1979-04-29 02:00:00 (Sun)
  -39600,
  0,
  'BST',
      ],
      [
  62429922000, #    utc_start 1979-04-29 13:00:00 (Sun)
  62445643200, #      utc_end 1979-10-28 12:00:00 (Sun)
  62429886000, #  local_start 1979-04-29 03:00:00 (Sun)
  62445607200, #    local_end 1979-10-28 02:00:00 (Sun)
  -36000,
  1,
  'BDT',
      ],
      [
  62445643200, #    utc_start 1979-10-28 12:00:00 (Sun)
  62461371600, #      utc_end 1980-04-27 13:00:00 (Sun)
  62445603600, #  local_start 1979-10-28 01:00:00 (Sun)
  62461332000, #    local_end 1980-04-27 02:00:00 (Sun)
  -39600,
  0,
  'BST',
      ],
      [
  62461371600, #    utc_start 1980-04-27 13:00:00 (Sun)
  62477092800, #      utc_end 1980-10-26 12:00:00 (Sun)
  62461335600, #  local_start 1980-04-27 03:00:00 (Sun)
  62477056800, #    local_end 1980-10-26 02:00:00 (Sun)
  -36000,
  1,
  'BDT',
      ],
      [
  62477092800, #    utc_start 1980-10-26 12:00:00 (Sun)
  62492821200, #      utc_end 1981-04-26 13:00:00 (Sun)
  62477053200, #  local_start 1980-10-26 01:00:00 (Sun)
  62492781600, #    local_end 1981-04-26 02:00:00 (Sun)
  -39600,
  0,
  'BST',
      ],
      [
  62492821200, #    utc_start 1981-04-26 13:00:00 (Sun)
  62508542400, #      utc_end 1981-10-25 12:00:00 (Sun)
  62492785200, #  local_start 1981-04-26 03:00:00 (Sun)
  62508506400, #    local_end 1981-10-25 02:00:00 (Sun)
  -36000,
  1,
  'BDT',
      ],
      [
  62508542400, #    utc_start 1981-10-25 12:00:00 (Sun)
  62524270800, #      utc_end 1982-04-25 13:00:00 (Sun)
  62508502800, #  local_start 1981-10-25 01:00:00 (Sun)
  62524231200, #    local_end 1982-04-25 02:00:00 (Sun)
  -39600,
  0,
  'BST',
      ],
      [
  62524270800, #    utc_start 1982-04-25 13:00:00 (Sun)
  62540596800, #      utc_end 1982-10-31 12:00:00 (Sun)
  62524234800, #  local_start 1982-04-25 03:00:00 (Sun)
  62540560800, #    local_end 1982-10-31 02:00:00 (Sun)
  -36000,
  1,
  'BDT',
      ],
      [
  62540596800, #    utc_start 1982-10-31 12:00:00 (Sun)
  62555720400, #      utc_end 1983-04-24 13:00:00 (Sun)
  62540557200, #  local_start 1982-10-31 01:00:00 (Sun)
  62555680800, #    local_end 1983-04-24 02:00:00 (Sun)
  -39600,
  0,
  'BST',
      ],
      [
  62555720400, #    utc_start 1983-04-24 13:00:00 (Sun)
  62572046400, #      utc_end 1983-10-30 12:00:00 (Sun)
  62555684400, #  local_start 1983-04-24 03:00:00 (Sun)
  62572010400, #    local_end 1983-10-30 02:00:00 (Sun)
  -36000,
  1,
  'BDT',
      ],
      [
  62572046400, #    utc_start 1983-10-30 12:00:00 (Sun)
  62574717600, #      utc_end 1983-11-30 10:00:00 (Wed)
  62572010400, #  local_start 1983-10-30 02:00:00 (Sun)
  62574681600, #    local_end 1983-11-30 00:00:00 (Wed)
  -36000,
  0,
  'AHST',
      ],
      [
  62574717600, #    utc_start 1983-11-30 10:00:00 (Wed)
  62587771200, #      utc_end 1984-04-29 12:00:00 (Sun)
  62574681600, #  local_start 1983-11-30 00:00:00 (Wed)
  62587735200, #    local_end 1984-04-29 02:00:00 (Sun)
  -36000,
  0,
  'HST',
      ],
      [
  62587771200, #    utc_start 1984-04-29 12:00:00 (Sun)
  62603492400, #      utc_end 1984-10-28 11:00:00 (Sun)
  62587738800, #  local_start 1984-04-29 03:00:00 (Sun)
  62603460000, #    local_end 1984-10-28 02:00:00 (Sun)
  -32400,
  1,
  'HDT',
      ],
      [
  62603492400, #    utc_start 1984-10-28 11:00:00 (Sun)
  62619220800, #      utc_end 1985-04-28 12:00:00 (Sun)
  62603456400, #  local_start 1984-10-28 01:00:00 (Sun)
  62619184800, #    local_end 1985-04-28 02:00:00 (Sun)
  -36000,
  0,
  'HST',
      ],
      [
  62619220800, #    utc_start 1985-04-28 12:00:00 (Sun)
  62634942000, #      utc_end 1985-10-27 11:00:00 (Sun)
  62619188400, #  local_start 1985-04-28 03:00:00 (Sun)
  62634909600, #    local_end 1985-10-27 02:00:00 (Sun)
  -32400,
  1,
  'HDT',
      ],
      [
  62634942000, #    utc_start 1985-10-27 11:00:00 (Sun)
  62650670400, #      utc_end 1986-04-27 12:00:00 (Sun)
  62634906000, #  local_start 1985-10-27 01:00:00 (Sun)
  62650634400, #    local_end 1986-04-27 02:00:00 (Sun)
  -36000,
  0,
  'HST',
      ],
      [
  62650670400, #    utc_start 1986-04-27 12:00:00 (Sun)
  62666391600, #      utc_end 1986-10-26 11:00:00 (Sun)
  62650638000, #  local_start 1986-04-27 03:00:00 (Sun)
  62666359200, #    local_end 1986-10-26 02:00:00 (Sun)
  -32400,
  1,
  'HDT',
      ],
      [
  62666391600, #    utc_start 1986-10-26 11:00:00 (Sun)
  62680305600, #      utc_end 1987-04-05 12:00:00 (Sun)
  62666355600, #  local_start 1986-10-26 01:00:00 (Sun)
  62680269600, #    local_end 1987-04-05 02:00:00 (Sun)
  -36000,
  0,
  'HST',
      ],
      [
  62680305600, #    utc_start 1987-04-05 12:00:00 (Sun)
  62697841200, #      utc_end 1987-10-25 11:00:00 (Sun)
  62680273200, #  local_start 1987-04-05 03:00:00 (Sun)
  62697808800, #    local_end 1987-10-25 02:00:00 (Sun)
  -32400,
  1,
  'HDT',
      ],
      [
  62697841200, #    utc_start 1987-10-25 11:00:00 (Sun)
  62711755200, #      utc_end 1988-04-03 12:00:00 (Sun)
  62697805200, #  local_start 1987-10-25 01:00:00 (Sun)
  62711719200, #    local_end 1988-04-03 02:00:00 (Sun)
  -36000,
  0,
  'HST',
      ],
      [
  62711755200, #    utc_start 1988-04-03 12:00:00 (Sun)
  62729895600, #      utc_end 1988-10-30 11:00:00 (Sun)
  62711722800, #  local_start 1988-04-03 03:00:00 (Sun)
  62729863200, #    local_end 1988-10-30 02:00:00 (Sun)
  -32400,
  1,
  'HDT',
      ],
      [
  62729895600, #    utc_start 1988-10-30 11:00:00 (Sun)
  62743204800, #      utc_end 1989-04-02 12:00:00 (Sun)
  62729859600, #  local_start 1988-10-30 01:00:00 (Sun)
  62743168800, #    local_end 1989-04-02 02:00:00 (Sun)
  -36000,
  0,
  'HST',
      ],
      [
  62743204800, #    utc_start 1989-04-02 12:00:00 (Sun)
  62761345200, #      utc_end 1989-10-29 11:00:00 (Sun)
  62743172400, #  local_start 1989-04-02 03:00:00 (Sun)
  62761312800, #    local_end 1989-10-29 02:00:00 (Sun)
  -32400,
  1,
  'HDT',
      ],
      [
  62761345200, #    utc_start 1989-10-29 11:00:00 (Sun)
  62774654400, #      utc_end 1990-04-01 12:00:00 (Sun)
  62761309200, #  local_start 1989-10-29 01:00:00 (Sun)
  62774618400, #    local_end 1990-04-01 02:00:00 (Sun)
  -36000,
  0,
  'HST',
      ],
      [
  62774654400, #    utc_start 1990-04-01 12:00:00 (Sun)
  62792794800, #      utc_end 1990-10-28 11:00:00 (Sun)
  62774622000, #  local_start 1990-04-01 03:00:00 (Sun)
  62792762400, #    local_end 1990-10-28 02:00:00 (Sun)
  -32400,
  1,
  'HDT',
      ],
      [
  62792794800, #    utc_start 1990-10-28 11:00:00 (Sun)
  62806708800, #      utc_end 1991-04-07 12:00:00 (Sun)
  62792758800, #  local_start 1990-10-28 01:00:00 (Sun)
  62806672800, #    local_end 1991-04-07 02:00:00 (Sun)
  -36000,
  0,
  'HST',
      ],
      [
  62806708800, #    utc_start 1991-04-07 12:00:00 (Sun)
  62824244400, #      utc_end 1991-10-27 11:00:00 (Sun)
  62806676400, #  local_start 1991-04-07 03:00:00 (Sun)
  62824212000, #    local_end 1991-10-27 02:00:00 (Sun)
  -32400,
  1,
  'HDT',
      ],
      [
  62824244400, #    utc_start 1991-10-27 11:00:00 (Sun)
  62838158400, #      utc_end 1992-04-05 12:00:00 (Sun)
  62824208400, #  local_start 1991-10-27 01:00:00 (Sun)
  62838122400, #    local_end 1992-04-05 02:00:00 (Sun)
  -36000,
  0,
  'HST',
      ],
      [
  62838158400, #    utc_start 1992-04-05 12:00:00 (Sun)
  62855694000, #      utc_end 1992-10-25 11:00:00 (Sun)
  62838126000, #  local_start 1992-04-05 03:00:00 (Sun)
  62855661600, #    local_end 1992-10-25 02:00:00 (Sun)
  -32400,
  1,
  'HDT',
      ],
      [
  62855694000, #    utc_start 1992-10-25 11:00:00 (Sun)
  62869608000, #      utc_end 1993-04-04 12:00:00 (Sun)
  62855658000, #  local_start 1992-10-25 01:00:00 (Sun)
  62869572000, #    local_end 1993-04-04 02:00:00 (Sun)
  -36000,
  0,
  'HST',
      ],
      [
  62869608000, #    utc_start 1993-04-04 12:00:00 (Sun)
  62887748400, #      utc_end 1993-10-31 11:00:00 (Sun)
  62869575600, #  local_start 1993-04-04 03:00:00 (Sun)
  62887716000, #    local_end 1993-10-31 02:00:00 (Sun)
  -32400,
  1,
  'HDT',
      ],
      [
  62887748400, #    utc_start 1993-10-31 11:00:00 (Sun)
  62901057600, #      utc_end 1994-04-03 12:00:00 (Sun)
  62887712400, #  local_start 1993-10-31 01:00:00 (Sun)
  62901021600, #    local_end 1994-04-03 02:00:00 (Sun)
  -36000,
  0,
  'HST',
      ],
      [
  62901057600, #    utc_start 1994-04-03 12:00:00 (Sun)
  62919198000, #      utc_end 1994-10-30 11:00:00 (Sun)
  62901025200, #  local_start 1994-04-03 03:00:00 (Sun)
  62919165600, #    local_end 1994-10-30 02:00:00 (Sun)
  -32400,
  1,
  'HDT',
      ],
      [
  62919198000, #    utc_start 1994-10-30 11:00:00 (Sun)
  62932507200, #      utc_end 1995-04-02 12:00:00 (Sun)
  62919162000, #  local_start 1994-10-30 01:00:00 (Sun)
  62932471200, #    local_end 1995-04-02 02:00:00 (Sun)
  -36000,
  0,
  'HST',
      ],
      [
  62932507200, #    utc_start 1995-04-02 12:00:00 (Sun)
  62950647600, #      utc_end 1995-10-29 11:00:00 (Sun)
  62932474800, #  local_start 1995-04-02 03:00:00 (Sun)
  62950615200, #    local_end 1995-10-29 02:00:00 (Sun)
  -32400,
  1,
  'HDT',
      ],
      [
  62950647600, #    utc_start 1995-10-29 11:00:00 (Sun)
  62964561600, #      utc_end 1996-04-07 12:00:00 (Sun)
  62950611600, #  local_start 1995-10-29 01:00:00 (Sun)
  62964525600, #    local_end 1996-04-07 02:00:00 (Sun)
  -36000,
  0,
  'HST',
      ],
      [
  62964561600, #    utc_start 1996-04-07 12:00:00 (Sun)
  62982097200, #      utc_end 1996-10-27 11:00:00 (Sun)
  62964529200, #  local_start 1996-04-07 03:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  -32400,
  1,
  'HDT',
      ],
      [
  62982097200, #    utc_start 1996-10-27 11:00:00 (Sun)
  62996011200, #      utc_end 1997-04-06 12:00:00 (Sun)
  62982061200, #  local_start 1996-10-27 01:00:00 (Sun)
  62995975200, #    local_end 1997-04-06 02:00:00 (Sun)
  -36000,
  0,
  'HST',
      ],
      [
  62996011200, #    utc_start 1997-04-06 12:00:00 (Sun)
  63013546800, #      utc_end 1997-10-26 11:00:00 (Sun)
  62995978800, #  local_start 1997-04-06 03:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  -32400,
  1,
  'HDT',
      ],
      [
  63013546800, #    utc_start 1997-10-26 11:00:00 (Sun)
  63027460800, #      utc_end 1998-04-05 12:00:00 (Sun)
  63013510800, #  local_start 1997-10-26 01:00:00 (Sun)
  63027424800, #    local_end 1998-04-05 02:00:00 (Sun)
  -36000,
  0,
  'HST',
      ],
      [
  63027460800, #    utc_start 1998-04-05 12:00:00 (Sun)
  63044996400, #      utc_end 1998-10-25 11:00:00 (Sun)
  63027428400, #  local_start 1998-04-05 03:00:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  -32400,
  1,
  'HDT',
      ],
      [
  63044996400, #    utc_start 1998-10-25 11:00:00 (Sun)
  63058910400, #      utc_end 1999-04-04 12:00:00 (Sun)
  63044960400, #  local_start 1998-10-25 01:00:00 (Sun)
  63058874400, #    local_end 1999-04-04 02:00:00 (Sun)
  -36000,
  0,
  'HST',
      ],
      [
  63058910400, #    utc_start 1999-04-04 12:00:00 (Sun)
  63077050800, #      utc_end 1999-10-31 11:00:00 (Sun)
  63058878000, #  local_start 1999-04-04 03:00:00 (Sun)
  63077018400, #    local_end 1999-10-31 02:00:00 (Sun)
  -32400,
  1,
  'HDT',
      ],
      [
  63077050800, #    utc_start 1999-10-31 11:00:00 (Sun)
  63090360000, #      utc_end 2000-04-02 12:00:00 (Sun)
  63077014800, #  local_start 1999-10-31 01:00:00 (Sun)
  63090324000, #    local_end 2000-04-02 02:00:00 (Sun)
  -36000,
  0,
  'HST',
      ],
      [
  63090360000, #    utc_start 2000-04-02 12:00:00 (Sun)
  63108500400, #      utc_end 2000-10-29 11:00:00 (Sun)
  63090327600, #  local_start 2000-04-02 03:00:00 (Sun)
  63108468000, #    local_end 2000-10-29 02:00:00 (Sun)
  -32400,
  1,
  'HDT',
      ],
      [
  63108500400, #    utc_start 2000-10-29 11:00:00 (Sun)
  63121809600, #      utc_end 2001-04-01 12:00:00 (Sun)
  63108464400, #  local_start 2000-10-29 01:00:00 (Sun)
  63121773600, #    local_end 2001-04-01 02:00:00 (Sun)
  -36000,
  0,
  'HST',
      ],
      [
  63121809600, #    utc_start 2001-04-01 12:00:00 (Sun)
  63139950000, #      utc_end 2001-10-28 11:00:00 (Sun)
  63121777200, #  local_start 2001-04-01 03:00:00 (Sun)
  63139917600, #    local_end 2001-10-28 02:00:00 (Sun)
  -32400,
  1,
  'HDT',
      ],
      [
  63139950000, #    utc_start 2001-10-28 11:00:00 (Sun)
  63153864000, #      utc_end 2002-04-07 12:00:00 (Sun)
  63139914000, #  local_start 2001-10-28 01:00:00 (Sun)
  63153828000, #    local_end 2002-04-07 02:00:00 (Sun)
  -36000,
  0,
  'HST',
      ],
      [
  63153864000, #    utc_start 2002-04-07 12:00:00 (Sun)
  63171399600, #      utc_end 2002-10-27 11:00:00 (Sun)
  63153831600, #  local_start 2002-04-07 03:00:00 (Sun)
  63171367200, #    local_end 2002-10-27 02:00:00 (Sun)
  -32400,
  1,
  'HDT',
      ],
      [
  63171399600, #    utc_start 2002-10-27 11:00:00 (Sun)
  63185313600, #      utc_end 2003-04-06 12:00:00 (Sun)
  63171363600, #  local_start 2002-10-27 01:00:00 (Sun)
  63185277600, #    local_end 2003-04-06 02:00:00 (Sun)
  -36000,
  0,
  'HST',
      ],
      [
  63185313600, #    utc_start 2003-04-06 12:00:00 (Sun)
  63202849200, #      utc_end 2003-10-26 11:00:00 (Sun)
  63185281200, #  local_start 2003-04-06 03:00:00 (Sun)
  63202816800, #    local_end 2003-10-26 02:00:00 (Sun)
  -32400,
  1,
  'HDT',
      ],
      [
  63202849200, #    utc_start 2003-10-26 11:00:00 (Sun)
  63216763200, #      utc_end 2004-04-04 12:00:00 (Sun)
  63202813200, #  local_start 2003-10-26 01:00:00 (Sun)
  63216727200, #    local_end 2004-04-04 02:00:00 (Sun)
  -36000,
  0,
  'HST',
      ],
      [
  63216763200, #    utc_start 2004-04-04 12:00:00 (Sun)
  63234903600, #      utc_end 2004-10-31 11:00:00 (Sun)
  63216730800, #  local_start 2004-04-04 03:00:00 (Sun)
  63234871200, #    local_end 2004-10-31 02:00:00 (Sun)
  -32400,
  1,
  'HDT',
      ],
      [
  63234903600, #    utc_start 2004-10-31 11:00:00 (Sun)
  63248212800, #      utc_end 2005-04-03 12:00:00 (Sun)
  63234867600, #  local_start 2004-10-31 01:00:00 (Sun)
  63248176800, #    local_end 2005-04-03 02:00:00 (Sun)
  -36000,
  0,
  'HST',
      ],
      [
  63248212800, #    utc_start 2005-04-03 12:00:00 (Sun)
  63266353200, #      utc_end 2005-10-30 11:00:00 (Sun)
  63248180400, #  local_start 2005-04-03 03:00:00 (Sun)
  63266320800, #    local_end 2005-10-30 02:00:00 (Sun)
  -32400,
  1,
  'HDT',
      ],
      [
  63266353200, #    utc_start 2005-10-30 11:00:00 (Sun)
  63279662400, #      utc_end 2006-04-02 12:00:00 (Sun)
  63266317200, #  local_start 2005-10-30 01:00:00 (Sun)
  63279626400, #    local_end 2006-04-02 02:00:00 (Sun)
  -36000,
  0,
  'HST',
      ],
      [
  63279662400, #    utc_start 2006-04-02 12:00:00 (Sun)
  63297802800, #      utc_end 2006-10-29 11:00:00 (Sun)
  63279630000, #  local_start 2006-04-02 03:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  -32400,
  1,
  'HDT',
      ],
      [
  63297802800, #    utc_start 2006-10-29 11:00:00 (Sun)
  63309297600, #      utc_end 2007-03-11 12:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63309261600, #    local_end 2007-03-11 02:00:00 (Sun)
  -36000,
  0,
  'HST',
      ],
      [
  63309297600, #    utc_start 2007-03-11 12:00:00 (Sun)
  63329857200, #      utc_end 2007-11-04 11:00:00 (Sun)
  63309265200, #  local_start 2007-03-11 03:00:00 (Sun)
  63329824800, #    local_end 2007-11-04 02:00:00 (Sun)
  -32400,
  1,
  'HDT',
      ],
      [
  63329857200, #    utc_start 2007-11-04 11:00:00 (Sun)
  63340747200, #      utc_end 2008-03-09 12:00:00 (Sun)
  63329821200, #  local_start 2007-11-04 01:00:00 (Sun)
  63340711200, #    local_end 2008-03-09 02:00:00 (Sun)
  -36000,
  0,
  'HST',
      ],
      [
  63340747200, #    utc_start 2008-03-09 12:00:00 (Sun)
  63361306800, #      utc_end 2008-11-02 11:00:00 (Sun)
  63340714800, #  local_start 2008-03-09 03:00:00 (Sun)
  63361274400, #    local_end 2008-11-02 02:00:00 (Sun)
  -32400,
  1,
  'HDT',
      ],
      [
  63361306800, #    utc_start 2008-11-02 11:00:00 (Sun)
  63372196800, #      utc_end 2009-03-08 12:00:00 (Sun)
  63361270800, #  local_start 2008-11-02 01:00:00 (Sun)
  63372160800, #    local_end 2009-03-08 02:00:00 (Sun)
  -36000,
  0,
  'HST',
      ],
      [
  63372196800, #    utc_start 2009-03-08 12:00:00 (Sun)
  63392756400, #      utc_end 2009-11-01 11:00:00 (Sun)
  63372164400, #  local_start 2009-03-08 03:00:00 (Sun)
  63392724000, #    local_end 2009-11-01 02:00:00 (Sun)
  -32400,
  1,
  'HDT',
      ],
      [
  63392756400, #    utc_start 2009-11-01 11:00:00 (Sun)
  63404251200, #      utc_end 2010-03-14 12:00:00 (Sun)
  63392720400, #  local_start 2009-11-01 01:00:00 (Sun)
  63404215200, #    local_end 2010-03-14 02:00:00 (Sun)
  -36000,
  0,
  'HST',
      ],
      [
  63404251200, #    utc_start 2010-03-14 12:00:00 (Sun)
  63424810800, #      utc_end 2010-11-07 11:00:00 (Sun)
  63404218800, #  local_start 2010-03-14 03:00:00 (Sun)
  63424778400, #    local_end 2010-11-07 02:00:00 (Sun)
  -32400,
  1,
  'HDT',
      ],
      [
  63424810800, #    utc_start 2010-11-07 11:00:00 (Sun)
  63435700800, #      utc_end 2011-03-13 12:00:00 (Sun)
  63424774800, #  local_start 2010-11-07 01:00:00 (Sun)
  63435664800, #    local_end 2011-03-13 02:00:00 (Sun)
  -36000,
  0,
  'HST',
      ],
      [
  63435700800, #    utc_start 2011-03-13 12:00:00 (Sun)
  63456260400, #      utc_end 2011-11-06 11:00:00 (Sun)
  63435668400, #  local_start 2011-03-13 03:00:00 (Sun)
  63456228000, #    local_end 2011-11-06 02:00:00 (Sun)
  -32400,
  1,
  'HDT',
      ],
      [
  63456260400, #    utc_start 2011-11-06 11:00:00 (Sun)
  63467150400, #      utc_end 2012-03-11 12:00:00 (Sun)
  63456224400, #  local_start 2011-11-06 01:00:00 (Sun)
  63467114400, #    local_end 2012-03-11 02:00:00 (Sun)
  -36000,
  0,
  'HST',
      ],
      [
  63467150400, #    utc_start 2012-03-11 12:00:00 (Sun)
  63487710000, #      utc_end 2012-11-04 11:00:00 (Sun)
  63467118000, #  local_start 2012-03-11 03:00:00 (Sun)
  63487677600, #    local_end 2012-11-04 02:00:00 (Sun)
  -32400,
  1,
  'HDT',
      ],
      [
  63487710000, #    utc_start 2012-11-04 11:00:00 (Sun)
  63498600000, #      utc_end 2013-03-10 12:00:00 (Sun)
  63487674000, #  local_start 2012-11-04 01:00:00 (Sun)
  63498564000, #    local_end 2013-03-10 02:00:00 (Sun)
  -36000,
  0,
  'HST',
      ],
      [
  63498600000, #    utc_start 2013-03-10 12:00:00 (Sun)
  63519159600, #      utc_end 2013-11-03 11:00:00 (Sun)
  63498567600, #  local_start 2013-03-10 03:00:00 (Sun)
  63519127200, #    local_end 2013-11-03 02:00:00 (Sun)
  -32400,
  1,
  'HDT',
      ],
      [
  63519159600, #    utc_start 2013-11-03 11:00:00 (Sun)
  63530049600, #      utc_end 2014-03-09 12:00:00 (Sun)
  63519123600, #  local_start 2013-11-03 01:00:00 (Sun)
  63530013600, #    local_end 2014-03-09 02:00:00 (Sun)
  -36000,
  0,
  'HST',
      ],
      [
  63530049600, #    utc_start 2014-03-09 12:00:00 (Sun)
  63550609200, #      utc_end 2014-11-02 11:00:00 (Sun)
  63530017200, #  local_start 2014-03-09 03:00:00 (Sun)
  63550576800, #    local_end 2014-11-02 02:00:00 (Sun)
  -32400,
  1,
  'HDT',
      ],
      [
  63550609200, #    utc_start 2014-11-02 11:00:00 (Sun)
  63561499200, #      utc_end 2015-03-08 12:00:00 (Sun)
  63550573200, #  local_start 2014-11-02 01:00:00 (Sun)
  63561463200, #    local_end 2015-03-08 02:00:00 (Sun)
  -36000,
  0,
  'HST',
      ],
      [
  63561499200, #    utc_start 2015-03-08 12:00:00 (Sun)
  63582058800, #      utc_end 2015-11-01 11:00:00 (Sun)
  63561466800, #  local_start 2015-03-08 03:00:00 (Sun)
  63582026400, #    local_end 2015-11-01 02:00:00 (Sun)
  -32400,
  1,
  'HDT',
      ],
      [
  63582058800, #    utc_start 2015-11-01 11:00:00 (Sun)
  63593553600, #      utc_end 2016-03-13 12:00:00 (Sun)
  63582022800, #  local_start 2015-11-01 01:00:00 (Sun)
  63593517600, #    local_end 2016-03-13 02:00:00 (Sun)
  -36000,
  0,
  'HST',
      ],
      [
  63593553600, #    utc_start 2016-03-13 12:00:00 (Sun)
  63614113200, #      utc_end 2016-11-06 11:00:00 (Sun)
  63593521200, #  local_start 2016-03-13 03:00:00 (Sun)
  63614080800, #    local_end 2016-11-06 02:00:00 (Sun)
  -32400,
  1,
  'HDT',
      ],
      [
  63614113200, #    utc_start 2016-11-06 11:00:00 (Sun)
  63625003200, #      utc_end 2017-03-12 12:00:00 (Sun)
  63614077200, #  local_start 2016-11-06 01:00:00 (Sun)
  63624967200, #    local_end 2017-03-12 02:00:00 (Sun)
  -36000,
  0,
  'HST',
      ],
      [
  63625003200, #    utc_start 2017-03-12 12:00:00 (Sun)
  63645562800, #      utc_end 2017-11-05 11:00:00 (Sun)
  63624970800, #  local_start 2017-03-12 03:00:00 (Sun)
  63645530400, #    local_end 2017-11-05 02:00:00 (Sun)
  -32400,
  1,
  'HDT',
      ],
      [
  63645562800, #    utc_start 2017-11-05 11:00:00 (Sun)
  63656452800, #      utc_end 2018-03-11 12:00:00 (Sun)
  63645526800, #  local_start 2017-11-05 01:00:00 (Sun)
  63656416800, #    local_end 2018-03-11 02:00:00 (Sun)
  -36000,
  0,
  'HST',
      ],
      [
  63656452800, #    utc_start 2018-03-11 12:00:00 (Sun)
  63677012400, #      utc_end 2018-11-04 11:00:00 (Sun)
  63656420400, #  local_start 2018-03-11 03:00:00 (Sun)
  63676980000, #    local_end 2018-11-04 02:00:00 (Sun)
  -32400,
  1,
  'HDT',
      ],
      [
  63677012400, #    utc_start 2018-11-04 11:00:00 (Sun)
  63687902400, #      utc_end 2019-03-10 12:00:00 (Sun)
  63676976400, #  local_start 2018-11-04 01:00:00 (Sun)
  63687866400, #    local_end 2019-03-10 02:00:00 (Sun)
  -36000,
  0,
  'HST',
      ],
      [
  63687902400, #    utc_start 2019-03-10 12:00:00 (Sun)
  63708462000, #      utc_end 2019-11-03 11:00:00 (Sun)
  63687870000, #  local_start 2019-03-10 03:00:00 (Sun)
  63708429600, #    local_end 2019-11-03 02:00:00 (Sun)
  -32400,
  1,
  'HDT',
      ],
      [
  63708462000, #    utc_start 2019-11-03 11:00:00 (Sun)
  63719352000, #      utc_end 2020-03-08 12:00:00 (Sun)
  63708426000, #  local_start 2019-11-03 01:00:00 (Sun)
  63719316000, #    local_end 2020-03-08 02:00:00 (Sun)
  -36000,
  0,
  'HST',
      ],
      [
  63719352000, #    utc_start 2020-03-08 12:00:00 (Sun)
  63739911600, #      utc_end 2020-11-01 11:00:00 (Sun)
  63719319600, #  local_start 2020-03-08 03:00:00 (Sun)
  63739879200, #    local_end 2020-11-01 02:00:00 (Sun)
  -32400,
  1,
  'HDT',
      ],
      [
  63739911600, #    utc_start 2020-11-01 11:00:00 (Sun)
  63751406400, #      utc_end 2021-03-14 12:00:00 (Sun)
  63739875600, #  local_start 2020-11-01 01:00:00 (Sun)
  63751370400, #    local_end 2021-03-14 02:00:00 (Sun)
  -36000,
  0,
  'HST',
      ],
      [
  63751406400, #    utc_start 2021-03-14 12:00:00 (Sun)
  63771966000, #      utc_end 2021-11-07 11:00:00 (Sun)
  63751374000, #  local_start 2021-03-14 03:00:00 (Sun)
  63771933600, #    local_end 2021-11-07 02:00:00 (Sun)
  -32400,
  1,
  'HDT',
      ],
      [
  63771966000, #    utc_start 2021-11-07 11:00:00 (Sun)
  63782856000, #      utc_end 2022-03-13 12:00:00 (Sun)
  63771930000, #  local_start 2021-11-07 01:00:00 (Sun)
  63782820000, #    local_end 2022-03-13 02:00:00 (Sun)
  -36000,
  0,
  'HST',
      ],
      [
  63782856000, #    utc_start 2022-03-13 12:00:00 (Sun)
  63803415600, #      utc_end 2022-11-06 11:00:00 (Sun)
  63782823600, #  local_start 2022-03-13 03:00:00 (Sun)
  63803383200, #    local_end 2022-11-06 02:00:00 (Sun)
  -32400,
  1,
  'HDT',
      ],
      [
  63803415600, #    utc_start 2022-11-06 11:00:00 (Sun)
  63814305600, #      utc_end 2023-03-12 12:00:00 (Sun)
  63803379600, #  local_start 2022-11-06 01:00:00 (Sun)
  63814269600, #    local_end 2023-03-12 02:00:00 (Sun)
  -36000,
  0,
  'HST',
      ],
      [
  63814305600, #    utc_start 2023-03-12 12:00:00 (Sun)
  63834865200, #      utc_end 2023-11-05 11:00:00 (Sun)
  63814273200, #  local_start 2023-03-12 03:00:00 (Sun)
  63834832800, #    local_end 2023-11-05 02:00:00 (Sun)
  -32400,
  1,
  'HDT',
      ],
      [
  63834865200, #    utc_start 2023-11-05 11:00:00 (Sun)
  63845755200, #      utc_end 2024-03-10 12:00:00 (Sun)
  63834829200, #  local_start 2023-11-05 01:00:00 (Sun)
  63845719200, #    local_end 2024-03-10 02:00:00 (Sun)
  -36000,
  0,
  'HST',
      ],
      [
  63845755200, #    utc_start 2024-03-10 12:00:00 (Sun)
  63866314800, #      utc_end 2024-11-03 11:00:00 (Sun)
  63845722800, #  local_start 2024-03-10 03:00:00 (Sun)
  63866282400, #    local_end 2024-11-03 02:00:00 (Sun)
  -32400,
  1,
  'HDT',
      ],
      [
  63866314800, #    utc_start 2024-11-03 11:00:00 (Sun)
  63877204800, #      utc_end 2025-03-09 12:00:00 (Sun)
  63866278800, #  local_start 2024-11-03 01:00:00 (Sun)
  63877168800, #    local_end 2025-03-09 02:00:00 (Sun)
  -36000,
  0,
  'HST',
      ],
      [
  63877204800, #    utc_start 2025-03-09 12:00:00 (Sun)
  63897764400, #      utc_end 2025-11-02 11:00:00 (Sun)
  63877172400, #  local_start 2025-03-09 03:00:00 (Sun)
  63897732000, #    local_end 2025-11-02 02:00:00 (Sun)
  -32400,
  1,
  'HDT',
      ],
      [
  63897764400, #    utc_start 2025-11-02 11:00:00 (Sun)
  63908654400, #      utc_end 2026-03-08 12:00:00 (Sun)
  63897728400, #  local_start 2025-11-02 01:00:00 (Sun)
  63908618400, #    local_end 2026-03-08 02:00:00 (Sun)
  -36000,
  0,
  'HST',
      ],
      [
  63908654400, #    utc_start 2026-03-08 12:00:00 (Sun)
  63929214000, #      utc_end 2026-11-01 11:00:00 (Sun)
  63908622000, #  local_start 2026-03-08 03:00:00 (Sun)
  63929181600, #    local_end 2026-11-01 02:00:00 (Sun)
  -32400,
  1,
  'HDT',
      ],
      [
  63929214000, #    utc_start 2026-11-01 11:00:00 (Sun)
  63940708800, #      utc_end 2027-03-14 12:00:00 (Sun)
  63929178000, #  local_start 2026-11-01 01:00:00 (Sun)
  63940672800, #    local_end 2027-03-14 02:00:00 (Sun)
  -36000,
  0,
  'HST',
      ],
      [
  63940708800, #    utc_start 2027-03-14 12:00:00 (Sun)
  63961268400, #      utc_end 2027-11-07 11:00:00 (Sun)
  63940676400, #  local_start 2027-03-14 03:00:00 (Sun)
  63961236000, #    local_end 2027-11-07 02:00:00 (Sun)
  -32400,
  1,
  'HDT',
      ],
      [
  63961268400, #    utc_start 2027-11-07 11:00:00 (Sun)
  63972158400, #      utc_end 2028-03-12 12:00:00 (Sun)
  63961232400, #  local_start 2027-11-07 01:00:00 (Sun)
  63972122400, #    local_end 2028-03-12 02:00:00 (Sun)
  -36000,
  0,
  'HST',
      ],
      [
  63972158400, #    utc_start 2028-03-12 12:00:00 (Sun)
  63992718000, #      utc_end 2028-11-05 11:00:00 (Sun)
  63972126000, #  local_start 2028-03-12 03:00:00 (Sun)
  63992685600, #    local_end 2028-11-05 02:00:00 (Sun)
  -32400,
  1,
  'HDT',
      ],
      [
  63992718000, #    utc_start 2028-11-05 11:00:00 (Sun)
  64003608000, #      utc_end 2029-03-11 12:00:00 (Sun)
  63992682000, #  local_start 2028-11-05 01:00:00 (Sun)
  64003572000, #    local_end 2029-03-11 02:00:00 (Sun)
  -36000,
  0,
  'HST',
      ],
      [
  64003608000, #    utc_start 2029-03-11 12:00:00 (Sun)
  64024167600, #      utc_end 2029-11-04 11:00:00 (Sun)
  64003575600, #  local_start 2029-03-11 03:00:00 (Sun)
  64024135200, #    local_end 2029-11-04 02:00:00 (Sun)
  -32400,
  1,
  'HDT',
      ],
      [
  64024167600, #    utc_start 2029-11-04 11:00:00 (Sun)
  64035057600, #      utc_end 2030-03-10 12:00:00 (Sun)
  64024131600, #  local_start 2029-11-04 01:00:00 (Sun)
  64035021600, #    local_end 2030-03-10 02:00:00 (Sun)
  -36000,
  0,
  'HST',
      ],
      [
  64035057600, #    utc_start 2030-03-10 12:00:00 (Sun)
  64055617200, #      utc_end 2030-11-03 11:00:00 (Sun)
  64035025200, #  local_start 2030-03-10 03:00:00 (Sun)
  64055584800, #    local_end 2030-11-03 02:00:00 (Sun)
  -32400,
  1,
  'HDT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {64}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -36000 }
  
  my $last_observance = bless( {
    'format' => 'H%sT',
    'gmtoff' => '-10:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 724244,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 724244,
      'utc_rd_secs' => 0,
      'utc_year' => 1984
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -36000,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 724244,
      'local_rd_secs' => 36000,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 724244,
      'utc_rd_secs' => 36000,
      'utc_year' => 1984
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Mar',
      'letter' => 'D',
      'name' => 'US',
      'offset_from_std' => 3600,
      'on' => 'Sun>=8',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Nov',
      'letter' => 'S',
      'name' => 'US',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_ADAK

    $main::fatpacked{"DateTime/TimeZone/America/Anchorage.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_ANCHORAGE';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Anchorage;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Anchorage::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  58910459473, #      utc_end 1867-10-19 00:31:13 (Sat)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  58910509897, #    local_end 1867-10-19 14:31:37 (Sat)
  50424,
  0,
  'LMT',
      ],
      [
  58910459473, #    utc_start 1867-10-19 00:31:13 (Sat)
  59946731976, #      utc_end 1900-08-20 21:59:36 (Mon)
  58910423497, #  local_start 1867-10-18 14:31:37 (Fri)
  59946696000, #    local_end 1900-08-20 12:00:00 (Mon)
  -35976,
  0,
  'LMT',
      ],
      [
  59946731976, #    utc_start 1900-08-20 21:59:36 (Mon)
  61252106400, #      utc_end 1942-01-01 10:00:00 (Thu)
  59946695976, #  local_start 1900-08-20 11:59:36 (Mon)
  61252070400, #    local_end 1942-01-01 00:00:00 (Thu)
  -36000,
  0,
  'AST',
      ],
      [
  61252106400, #    utc_start 1942-01-01 10:00:00 (Thu)
  61255483200, #      utc_end 1942-02-09 12:00:00 (Mon)
  61252070400, #  local_start 1942-01-01 00:00:00 (Thu)
  61255447200, #    local_end 1942-02-09 02:00:00 (Mon)
  -36000,
  0,
  'AST',
      ],
      [
  61255483200, #    utc_start 1942-02-09 12:00:00 (Mon)
  61366287600, #      utc_end 1945-08-14 23:00:00 (Tue)
  61255450800, #  local_start 1942-02-09 03:00:00 (Mon)
  61366255200, #    local_end 1945-08-14 14:00:00 (Tue)
  -32400,
  1,
  'AWT',
      ],
      [
  61366287600, #    utc_start 1945-08-14 23:00:00 (Tue)
  61370305200, #      utc_end 1945-09-30 11:00:00 (Sun)
  61366255200, #  local_start 1945-08-14 14:00:00 (Tue)
  61370272800, #    local_end 1945-09-30 02:00:00 (Sun)
  -32400,
  1,
  'APT',
      ],
      [
  61370305200, #    utc_start 1945-09-30 11:00:00 (Sun)
  62048800800, #      utc_end 1967-04-01 10:00:00 (Sat)
  61370269200, #  local_start 1945-09-30 01:00:00 (Sun)
  62048764800, #    local_end 1967-04-01 00:00:00 (Sat)
  -36000,
  0,
  'AST',
      ],
      [
  62048800800, #    utc_start 1967-04-01 10:00:00 (Sat)
  62104183200, #      utc_end 1969-01-01 10:00:00 (Wed)
  62048764800, #  local_start 1967-04-01 00:00:00 (Sat)
  62104147200, #    local_end 1969-01-01 00:00:00 (Wed)
  -36000,
  0,
  'AHST',
      ],
      [
  62104183200, #    utc_start 1969-01-01 10:00:00 (Wed)
  62114212800, #      utc_end 1969-04-27 12:00:00 (Sun)
  62104147200, #  local_start 1969-01-01 00:00:00 (Wed)
  62114176800, #    local_end 1969-04-27 02:00:00 (Sun)
  -36000,
  0,
  'AHST',
      ],
      [
  62114212800, #    utc_start 1969-04-27 12:00:00 (Sun)
  62129934000, #      utc_end 1969-10-26 11:00:00 (Sun)
  62114180400, #  local_start 1969-04-27 03:00:00 (Sun)
  62129901600, #    local_end 1969-10-26 02:00:00 (Sun)
  -32400,
  1,
  'AHDT',
      ],
      [
  62129934000, #    utc_start 1969-10-26 11:00:00 (Sun)
  62145662400, #      utc_end 1970-04-26 12:00:00 (Sun)
  62129898000, #  local_start 1969-10-26 01:00:00 (Sun)
  62145626400, #    local_end 1970-04-26 02:00:00 (Sun)
  -36000,
  0,
  'AHST',
      ],
      [
  62145662400, #    utc_start 1970-04-26 12:00:00 (Sun)
  62161383600, #      utc_end 1970-10-25 11:00:00 (Sun)
  62145630000, #  local_start 1970-04-26 03:00:00 (Sun)
  62161351200, #    local_end 1970-10-25 02:00:00 (Sun)
  -32400,
  1,
  'AHDT',
      ],
      [
  62161383600, #    utc_start 1970-10-25 11:00:00 (Sun)
  62177112000, #      utc_end 1971-04-25 12:00:00 (Sun)
  62161347600, #  local_start 1970-10-25 01:00:00 (Sun)
  62177076000, #    local_end 1971-04-25 02:00:00 (Sun)
  -36000,
  0,
  'AHST',
      ],
      [
  62177112000, #    utc_start 1971-04-25 12:00:00 (Sun)
  62193438000, #      utc_end 1971-10-31 11:00:00 (Sun)
  62177079600, #  local_start 1971-04-25 03:00:00 (Sun)
  62193405600, #    local_end 1971-10-31 02:00:00 (Sun)
  -32400,
  1,
  'AHDT',
      ],
      [
  62193438000, #    utc_start 1971-10-31 11:00:00 (Sun)
  62209166400, #      utc_end 1972-04-30 12:00:00 (Sun)
  62193402000, #  local_start 1971-10-31 01:00:00 (Sun)
  62209130400, #    local_end 1972-04-30 02:00:00 (Sun)
  -36000,
  0,
  'AHST',
      ],
      [
  62209166400, #    utc_start 1972-04-30 12:00:00 (Sun)
  62224887600, #      utc_end 1972-10-29 11:00:00 (Sun)
  62209134000, #  local_start 1972-04-30 03:00:00 (Sun)
  62224855200, #    local_end 1972-10-29 02:00:00 (Sun)
  -32400,
  1,
  'AHDT',
      ],
      [
  62224887600, #    utc_start 1972-10-29 11:00:00 (Sun)
  62240616000, #      utc_end 1973-04-29 12:00:00 (Sun)
  62224851600, #  local_start 1972-10-29 01:00:00 (Sun)
  62240580000, #    local_end 1973-04-29 02:00:00 (Sun)
  -36000,
  0,
  'AHST',
      ],
      [
  62240616000, #    utc_start 1973-04-29 12:00:00 (Sun)
  62256337200, #      utc_end 1973-10-28 11:00:00 (Sun)
  62240583600, #  local_start 1973-04-29 03:00:00 (Sun)
  62256304800, #    local_end 1973-10-28 02:00:00 (Sun)
  -32400,
  1,
  'AHDT',
      ],
      [
  62256337200, #    utc_start 1973-10-28 11:00:00 (Sun)
  62262388800, #      utc_end 1974-01-06 12:00:00 (Sun)
  62256301200, #  local_start 1973-10-28 01:00:00 (Sun)
  62262352800, #    local_end 1974-01-06 02:00:00 (Sun)
  -36000,
  0,
  'AHST',
      ],
      [
  62262388800, #    utc_start 1974-01-06 12:00:00 (Sun)
  62287786800, #      utc_end 1974-10-27 11:00:00 (Sun)
  62262356400, #  local_start 1974-01-06 03:00:00 (Sun)
  62287754400, #    local_end 1974-10-27 02:00:00 (Sun)
  -32400,
  1,
  'AHDT',
      ],
      [
  62287786800, #    utc_start 1974-10-27 11:00:00 (Sun)
  62298072000, #      utc_end 1975-02-23 12:00:00 (Sun)
  62287750800, #  local_start 1974-10-27 01:00:00 (Sun)
  62298036000, #    local_end 1975-02-23 02:00:00 (Sun)
  -36000,
  0,
  'AHST',
      ],
      [
  62298072000, #    utc_start 1975-02-23 12:00:00 (Sun)
  62319236400, #      utc_end 1975-10-26 11:00:00 (Sun)
  62298039600, #  local_start 1975-02-23 03:00:00 (Sun)
  62319204000, #    local_end 1975-10-26 02:00:00 (Sun)
  -32400,
  1,
  'AHDT',
      ],
      [
  62319236400, #    utc_start 1975-10-26 11:00:00 (Sun)
  62334964800, #      utc_end 1976-04-25 12:00:00 (Sun)
  62319200400, #  local_start 1975-10-26 01:00:00 (Sun)
  62334928800, #    local_end 1976-04-25 02:00:00 (Sun)
  -36000,
  0,
  'AHST',
      ],
      [
  62334964800, #    utc_start 1976-04-25 12:00:00 (Sun)
  62351290800, #      utc_end 1976-10-31 11:00:00 (Sun)
  62334932400, #  local_start 1976-04-25 03:00:00 (Sun)
  62351258400, #    local_end 1976-10-31 02:00:00 (Sun)
  -32400,
  1,
  'AHDT',
      ],
      [
  62351290800, #    utc_start 1976-10-31 11:00:00 (Sun)
  62366414400, #      utc_end 1977-04-24 12:00:00 (Sun)
  62351254800, #  local_start 1976-10-31 01:00:00 (Sun)
  62366378400, #    local_end 1977-04-24 02:00:00 (Sun)
  -36000,
  0,
  'AHST',
      ],
      [
  62366414400, #    utc_start 1977-04-24 12:00:00 (Sun)
  62382740400, #      utc_end 1977-10-30 11:00:00 (Sun)
  62366382000, #  local_start 1977-04-24 03:00:00 (Sun)
  62382708000, #    local_end 1977-10-30 02:00:00 (Sun)
  -32400,
  1,
  'AHDT',
      ],
      [
  62382740400, #    utc_start 1977-10-30 11:00:00 (Sun)
  62398468800, #      utc_end 1978-04-30 12:00:00 (Sun)
  62382704400, #  local_start 1977-10-30 01:00:00 (Sun)
  62398432800, #    local_end 1978-04-30 02:00:00 (Sun)
  -36000,
  0,
  'AHST',
      ],
      [
  62398468800, #    utc_start 1978-04-30 12:00:00 (Sun)
  62414190000, #      utc_end 1978-10-29 11:00:00 (Sun)
  62398436400, #  local_start 1978-04-30 03:00:00 (Sun)
  62414157600, #    local_end 1978-10-29 02:00:00 (Sun)
  -32400,
  1,
  'AHDT',
      ],
      [
  62414190000, #    utc_start 1978-10-29 11:00:00 (Sun)
  62429918400, #      utc_end 1979-04-29 12:00:00 (Sun)
  62414154000, #  local_start 1978-10-29 01:00:00 (Sun)
  62429882400, #    local_end 1979-04-29 02:00:00 (Sun)
  -36000,
  0,
  'AHST',
      ],
      [
  62429918400, #    utc_start 1979-04-29 12:00:00 (Sun)
  62445639600, #      utc_end 1979-10-28 11:00:00 (Sun)
  62429886000, #  local_start 1979-04-29 03:00:00 (Sun)
  62445607200, #    local_end 1979-10-28 02:00:00 (Sun)
  -32400,
  1,
  'AHDT',
      ],
      [
  62445639600, #    utc_start 1979-10-28 11:00:00 (Sun)
  62461368000, #      utc_end 1980-04-27 12:00:00 (Sun)
  62445603600, #  local_start 1979-10-28 01:00:00 (Sun)
  62461332000, #    local_end 1980-04-27 02:00:00 (Sun)
  -36000,
  0,
  'AHST',
      ],
      [
  62461368000, #    utc_start 1980-04-27 12:00:00 (Sun)
  62477089200, #      utc_end 1980-10-26 11:00:00 (Sun)
  62461335600, #  local_start 1980-04-27 03:00:00 (Sun)
  62477056800, #    local_end 1980-10-26 02:00:00 (Sun)
  -32400,
  1,
  'AHDT',
      ],
      [
  62477089200, #    utc_start 1980-10-26 11:00:00 (Sun)
  62492817600, #      utc_end 1981-04-26 12:00:00 (Sun)
  62477053200, #  local_start 1980-10-26 01:00:00 (Sun)
  62492781600, #    local_end 1981-04-26 02:00:00 (Sun)
  -36000,
  0,
  'AHST',
      ],
      [
  62492817600, #    utc_start 1981-04-26 12:00:00 (Sun)
  62508538800, #      utc_end 1981-10-25 11:00:00 (Sun)
  62492785200, #  local_start 1981-04-26 03:00:00 (Sun)
  62508506400, #    local_end 1981-10-25 02:00:00 (Sun)
  -32400,
  1,
  'AHDT',
      ],
      [
  62508538800, #    utc_start 1981-10-25 11:00:00 (Sun)
  62524267200, #      utc_end 1982-04-25 12:00:00 (Sun)
  62508502800, #  local_start 1981-10-25 01:00:00 (Sun)
  62524231200, #    local_end 1982-04-25 02:00:00 (Sun)
  -36000,
  0,
  'AHST',
      ],
      [
  62524267200, #    utc_start 1982-04-25 12:00:00 (Sun)
  62540593200, #      utc_end 1982-10-31 11:00:00 (Sun)
  62524234800, #  local_start 1982-04-25 03:00:00 (Sun)
  62540560800, #    local_end 1982-10-31 02:00:00 (Sun)
  -32400,
  1,
  'AHDT',
      ],
      [
  62540593200, #    utc_start 1982-10-31 11:00:00 (Sun)
  62555716800, #      utc_end 1983-04-24 12:00:00 (Sun)
  62540557200, #  local_start 1982-10-31 01:00:00 (Sun)
  62555680800, #    local_end 1983-04-24 02:00:00 (Sun)
  -36000,
  0,
  'AHST',
      ],
      [
  62555716800, #    utc_start 1983-04-24 12:00:00 (Sun)
  62572042800, #      utc_end 1983-10-30 11:00:00 (Sun)
  62555684400, #  local_start 1983-04-24 03:00:00 (Sun)
  62572010400, #    local_end 1983-10-30 02:00:00 (Sun)
  -32400,
  1,
  'AHDT',
      ],
      [
  62572042800, #    utc_start 1983-10-30 11:00:00 (Sun)
  62574714000, #      utc_end 1983-11-30 09:00:00 (Wed)
  62572010400, #  local_start 1983-10-30 02:00:00 (Sun)
  62574681600, #    local_end 1983-11-30 00:00:00 (Wed)
  -32400,
  0,
  'YST',
      ],
      [
  62574714000, #    utc_start 1983-11-30 09:00:00 (Wed)
  62587767600, #      utc_end 1984-04-29 11:00:00 (Sun)
  62574681600, #  local_start 1983-11-30 00:00:00 (Wed)
  62587735200, #    local_end 1984-04-29 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62587767600, #    utc_start 1984-04-29 11:00:00 (Sun)
  62603488800, #      utc_end 1984-10-28 10:00:00 (Sun)
  62587738800, #  local_start 1984-04-29 03:00:00 (Sun)
  62603460000, #    local_end 1984-10-28 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  62603488800, #    utc_start 1984-10-28 10:00:00 (Sun)
  62619217200, #      utc_end 1985-04-28 11:00:00 (Sun)
  62603456400, #  local_start 1984-10-28 01:00:00 (Sun)
  62619184800, #    local_end 1985-04-28 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62619217200, #    utc_start 1985-04-28 11:00:00 (Sun)
  62634938400, #      utc_end 1985-10-27 10:00:00 (Sun)
  62619188400, #  local_start 1985-04-28 03:00:00 (Sun)
  62634909600, #    local_end 1985-10-27 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  62634938400, #    utc_start 1985-10-27 10:00:00 (Sun)
  62650666800, #      utc_end 1986-04-27 11:00:00 (Sun)
  62634906000, #  local_start 1985-10-27 01:00:00 (Sun)
  62650634400, #    local_end 1986-04-27 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62650666800, #    utc_start 1986-04-27 11:00:00 (Sun)
  62666388000, #      utc_end 1986-10-26 10:00:00 (Sun)
  62650638000, #  local_start 1986-04-27 03:00:00 (Sun)
  62666359200, #    local_end 1986-10-26 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  62666388000, #    utc_start 1986-10-26 10:00:00 (Sun)
  62680302000, #      utc_end 1987-04-05 11:00:00 (Sun)
  62666355600, #  local_start 1986-10-26 01:00:00 (Sun)
  62680269600, #    local_end 1987-04-05 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62680302000, #    utc_start 1987-04-05 11:00:00 (Sun)
  62697837600, #      utc_end 1987-10-25 10:00:00 (Sun)
  62680273200, #  local_start 1987-04-05 03:00:00 (Sun)
  62697808800, #    local_end 1987-10-25 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  62697837600, #    utc_start 1987-10-25 10:00:00 (Sun)
  62711751600, #      utc_end 1988-04-03 11:00:00 (Sun)
  62697805200, #  local_start 1987-10-25 01:00:00 (Sun)
  62711719200, #    local_end 1988-04-03 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62711751600, #    utc_start 1988-04-03 11:00:00 (Sun)
  62729892000, #      utc_end 1988-10-30 10:00:00 (Sun)
  62711722800, #  local_start 1988-04-03 03:00:00 (Sun)
  62729863200, #    local_end 1988-10-30 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  62729892000, #    utc_start 1988-10-30 10:00:00 (Sun)
  62743201200, #      utc_end 1989-04-02 11:00:00 (Sun)
  62729859600, #  local_start 1988-10-30 01:00:00 (Sun)
  62743168800, #    local_end 1989-04-02 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62743201200, #    utc_start 1989-04-02 11:00:00 (Sun)
  62761341600, #      utc_end 1989-10-29 10:00:00 (Sun)
  62743172400, #  local_start 1989-04-02 03:00:00 (Sun)
  62761312800, #    local_end 1989-10-29 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  62761341600, #    utc_start 1989-10-29 10:00:00 (Sun)
  62774650800, #      utc_end 1990-04-01 11:00:00 (Sun)
  62761309200, #  local_start 1989-10-29 01:00:00 (Sun)
  62774618400, #    local_end 1990-04-01 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62774650800, #    utc_start 1990-04-01 11:00:00 (Sun)
  62792791200, #      utc_end 1990-10-28 10:00:00 (Sun)
  62774622000, #  local_start 1990-04-01 03:00:00 (Sun)
  62792762400, #    local_end 1990-10-28 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  62792791200, #    utc_start 1990-10-28 10:00:00 (Sun)
  62806705200, #      utc_end 1991-04-07 11:00:00 (Sun)
  62792758800, #  local_start 1990-10-28 01:00:00 (Sun)
  62806672800, #    local_end 1991-04-07 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62806705200, #    utc_start 1991-04-07 11:00:00 (Sun)
  62824240800, #      utc_end 1991-10-27 10:00:00 (Sun)
  62806676400, #  local_start 1991-04-07 03:00:00 (Sun)
  62824212000, #    local_end 1991-10-27 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  62824240800, #    utc_start 1991-10-27 10:00:00 (Sun)
  62838154800, #      utc_end 1992-04-05 11:00:00 (Sun)
  62824208400, #  local_start 1991-10-27 01:00:00 (Sun)
  62838122400, #    local_end 1992-04-05 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62838154800, #    utc_start 1992-04-05 11:00:00 (Sun)
  62855690400, #      utc_end 1992-10-25 10:00:00 (Sun)
  62838126000, #  local_start 1992-04-05 03:00:00 (Sun)
  62855661600, #    local_end 1992-10-25 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  62855690400, #    utc_start 1992-10-25 10:00:00 (Sun)
  62869604400, #      utc_end 1993-04-04 11:00:00 (Sun)
  62855658000, #  local_start 1992-10-25 01:00:00 (Sun)
  62869572000, #    local_end 1993-04-04 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62869604400, #    utc_start 1993-04-04 11:00:00 (Sun)
  62887744800, #      utc_end 1993-10-31 10:00:00 (Sun)
  62869575600, #  local_start 1993-04-04 03:00:00 (Sun)
  62887716000, #    local_end 1993-10-31 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  62887744800, #    utc_start 1993-10-31 10:00:00 (Sun)
  62901054000, #      utc_end 1994-04-03 11:00:00 (Sun)
  62887712400, #  local_start 1993-10-31 01:00:00 (Sun)
  62901021600, #    local_end 1994-04-03 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62901054000, #    utc_start 1994-04-03 11:00:00 (Sun)
  62919194400, #      utc_end 1994-10-30 10:00:00 (Sun)
  62901025200, #  local_start 1994-04-03 03:00:00 (Sun)
  62919165600, #    local_end 1994-10-30 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  62919194400, #    utc_start 1994-10-30 10:00:00 (Sun)
  62932503600, #      utc_end 1995-04-02 11:00:00 (Sun)
  62919162000, #  local_start 1994-10-30 01:00:00 (Sun)
  62932471200, #    local_end 1995-04-02 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62932503600, #    utc_start 1995-04-02 11:00:00 (Sun)
  62950644000, #      utc_end 1995-10-29 10:00:00 (Sun)
  62932474800, #  local_start 1995-04-02 03:00:00 (Sun)
  62950615200, #    local_end 1995-10-29 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  62950644000, #    utc_start 1995-10-29 10:00:00 (Sun)
  62964558000, #      utc_end 1996-04-07 11:00:00 (Sun)
  62950611600, #  local_start 1995-10-29 01:00:00 (Sun)
  62964525600, #    local_end 1996-04-07 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62964558000, #    utc_start 1996-04-07 11:00:00 (Sun)
  62982093600, #      utc_end 1996-10-27 10:00:00 (Sun)
  62964529200, #  local_start 1996-04-07 03:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  62982093600, #    utc_start 1996-10-27 10:00:00 (Sun)
  62996007600, #      utc_end 1997-04-06 11:00:00 (Sun)
  62982061200, #  local_start 1996-10-27 01:00:00 (Sun)
  62995975200, #    local_end 1997-04-06 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62996007600, #    utc_start 1997-04-06 11:00:00 (Sun)
  63013543200, #      utc_end 1997-10-26 10:00:00 (Sun)
  62995978800, #  local_start 1997-04-06 03:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63013543200, #    utc_start 1997-10-26 10:00:00 (Sun)
  63027457200, #      utc_end 1998-04-05 11:00:00 (Sun)
  63013510800, #  local_start 1997-10-26 01:00:00 (Sun)
  63027424800, #    local_end 1998-04-05 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63027457200, #    utc_start 1998-04-05 11:00:00 (Sun)
  63044992800, #      utc_end 1998-10-25 10:00:00 (Sun)
  63027428400, #  local_start 1998-04-05 03:00:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63044992800, #    utc_start 1998-10-25 10:00:00 (Sun)
  63058906800, #      utc_end 1999-04-04 11:00:00 (Sun)
  63044960400, #  local_start 1998-10-25 01:00:00 (Sun)
  63058874400, #    local_end 1999-04-04 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63058906800, #    utc_start 1999-04-04 11:00:00 (Sun)
  63077047200, #      utc_end 1999-10-31 10:00:00 (Sun)
  63058878000, #  local_start 1999-04-04 03:00:00 (Sun)
  63077018400, #    local_end 1999-10-31 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63077047200, #    utc_start 1999-10-31 10:00:00 (Sun)
  63090356400, #      utc_end 2000-04-02 11:00:00 (Sun)
  63077014800, #  local_start 1999-10-31 01:00:00 (Sun)
  63090324000, #    local_end 2000-04-02 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63090356400, #    utc_start 2000-04-02 11:00:00 (Sun)
  63108496800, #      utc_end 2000-10-29 10:00:00 (Sun)
  63090327600, #  local_start 2000-04-02 03:00:00 (Sun)
  63108468000, #    local_end 2000-10-29 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63108496800, #    utc_start 2000-10-29 10:00:00 (Sun)
  63121806000, #      utc_end 2001-04-01 11:00:00 (Sun)
  63108464400, #  local_start 2000-10-29 01:00:00 (Sun)
  63121773600, #    local_end 2001-04-01 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63121806000, #    utc_start 2001-04-01 11:00:00 (Sun)
  63139946400, #      utc_end 2001-10-28 10:00:00 (Sun)
  63121777200, #  local_start 2001-04-01 03:00:00 (Sun)
  63139917600, #    local_end 2001-10-28 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63139946400, #    utc_start 2001-10-28 10:00:00 (Sun)
  63153860400, #      utc_end 2002-04-07 11:00:00 (Sun)
  63139914000, #  local_start 2001-10-28 01:00:00 (Sun)
  63153828000, #    local_end 2002-04-07 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63153860400, #    utc_start 2002-04-07 11:00:00 (Sun)
  63171396000, #      utc_end 2002-10-27 10:00:00 (Sun)
  63153831600, #  local_start 2002-04-07 03:00:00 (Sun)
  63171367200, #    local_end 2002-10-27 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63171396000, #    utc_start 2002-10-27 10:00:00 (Sun)
  63185310000, #      utc_end 2003-04-06 11:00:00 (Sun)
  63171363600, #  local_start 2002-10-27 01:00:00 (Sun)
  63185277600, #    local_end 2003-04-06 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63185310000, #    utc_start 2003-04-06 11:00:00 (Sun)
  63202845600, #      utc_end 2003-10-26 10:00:00 (Sun)
  63185281200, #  local_start 2003-04-06 03:00:00 (Sun)
  63202816800, #    local_end 2003-10-26 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63202845600, #    utc_start 2003-10-26 10:00:00 (Sun)
  63216759600, #      utc_end 2004-04-04 11:00:00 (Sun)
  63202813200, #  local_start 2003-10-26 01:00:00 (Sun)
  63216727200, #    local_end 2004-04-04 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63216759600, #    utc_start 2004-04-04 11:00:00 (Sun)
  63234900000, #      utc_end 2004-10-31 10:00:00 (Sun)
  63216730800, #  local_start 2004-04-04 03:00:00 (Sun)
  63234871200, #    local_end 2004-10-31 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63234900000, #    utc_start 2004-10-31 10:00:00 (Sun)
  63248209200, #      utc_end 2005-04-03 11:00:00 (Sun)
  63234867600, #  local_start 2004-10-31 01:00:00 (Sun)
  63248176800, #    local_end 2005-04-03 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63248209200, #    utc_start 2005-04-03 11:00:00 (Sun)
  63266349600, #      utc_end 2005-10-30 10:00:00 (Sun)
  63248180400, #  local_start 2005-04-03 03:00:00 (Sun)
  63266320800, #    local_end 2005-10-30 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63266349600, #    utc_start 2005-10-30 10:00:00 (Sun)
  63279658800, #      utc_end 2006-04-02 11:00:00 (Sun)
  63266317200, #  local_start 2005-10-30 01:00:00 (Sun)
  63279626400, #    local_end 2006-04-02 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63279658800, #    utc_start 2006-04-02 11:00:00 (Sun)
  63297799200, #      utc_end 2006-10-29 10:00:00 (Sun)
  63279630000, #  local_start 2006-04-02 03:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63297799200, #    utc_start 2006-10-29 10:00:00 (Sun)
  63309294000, #      utc_end 2007-03-11 11:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63309261600, #    local_end 2007-03-11 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63309294000, #    utc_start 2007-03-11 11:00:00 (Sun)
  63329853600, #      utc_end 2007-11-04 10:00:00 (Sun)
  63309265200, #  local_start 2007-03-11 03:00:00 (Sun)
  63329824800, #    local_end 2007-11-04 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63329853600, #    utc_start 2007-11-04 10:00:00 (Sun)
  63340743600, #      utc_end 2008-03-09 11:00:00 (Sun)
  63329821200, #  local_start 2007-11-04 01:00:00 (Sun)
  63340711200, #    local_end 2008-03-09 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63340743600, #    utc_start 2008-03-09 11:00:00 (Sun)
  63361303200, #      utc_end 2008-11-02 10:00:00 (Sun)
  63340714800, #  local_start 2008-03-09 03:00:00 (Sun)
  63361274400, #    local_end 2008-11-02 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63361303200, #    utc_start 2008-11-02 10:00:00 (Sun)
  63372193200, #      utc_end 2009-03-08 11:00:00 (Sun)
  63361270800, #  local_start 2008-11-02 01:00:00 (Sun)
  63372160800, #    local_end 2009-03-08 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63372193200, #    utc_start 2009-03-08 11:00:00 (Sun)
  63392752800, #      utc_end 2009-11-01 10:00:00 (Sun)
  63372164400, #  local_start 2009-03-08 03:00:00 (Sun)
  63392724000, #    local_end 2009-11-01 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63392752800, #    utc_start 2009-11-01 10:00:00 (Sun)
  63404247600, #      utc_end 2010-03-14 11:00:00 (Sun)
  63392720400, #  local_start 2009-11-01 01:00:00 (Sun)
  63404215200, #    local_end 2010-03-14 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63404247600, #    utc_start 2010-03-14 11:00:00 (Sun)
  63424807200, #      utc_end 2010-11-07 10:00:00 (Sun)
  63404218800, #  local_start 2010-03-14 03:00:00 (Sun)
  63424778400, #    local_end 2010-11-07 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63424807200, #    utc_start 2010-11-07 10:00:00 (Sun)
  63435697200, #      utc_end 2011-03-13 11:00:00 (Sun)
  63424774800, #  local_start 2010-11-07 01:00:00 (Sun)
  63435664800, #    local_end 2011-03-13 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63435697200, #    utc_start 2011-03-13 11:00:00 (Sun)
  63456256800, #      utc_end 2011-11-06 10:00:00 (Sun)
  63435668400, #  local_start 2011-03-13 03:00:00 (Sun)
  63456228000, #    local_end 2011-11-06 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63456256800, #    utc_start 2011-11-06 10:00:00 (Sun)
  63467146800, #      utc_end 2012-03-11 11:00:00 (Sun)
  63456224400, #  local_start 2011-11-06 01:00:00 (Sun)
  63467114400, #    local_end 2012-03-11 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63467146800, #    utc_start 2012-03-11 11:00:00 (Sun)
  63487706400, #      utc_end 2012-11-04 10:00:00 (Sun)
  63467118000, #  local_start 2012-03-11 03:00:00 (Sun)
  63487677600, #    local_end 2012-11-04 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63487706400, #    utc_start 2012-11-04 10:00:00 (Sun)
  63498596400, #      utc_end 2013-03-10 11:00:00 (Sun)
  63487674000, #  local_start 2012-11-04 01:00:00 (Sun)
  63498564000, #    local_end 2013-03-10 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63498596400, #    utc_start 2013-03-10 11:00:00 (Sun)
  63519156000, #      utc_end 2013-11-03 10:00:00 (Sun)
  63498567600, #  local_start 2013-03-10 03:00:00 (Sun)
  63519127200, #    local_end 2013-11-03 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63519156000, #    utc_start 2013-11-03 10:00:00 (Sun)
  63530046000, #      utc_end 2014-03-09 11:00:00 (Sun)
  63519123600, #  local_start 2013-11-03 01:00:00 (Sun)
  63530013600, #    local_end 2014-03-09 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63530046000, #    utc_start 2014-03-09 11:00:00 (Sun)
  63550605600, #      utc_end 2014-11-02 10:00:00 (Sun)
  63530017200, #  local_start 2014-03-09 03:00:00 (Sun)
  63550576800, #    local_end 2014-11-02 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63550605600, #    utc_start 2014-11-02 10:00:00 (Sun)
  63561495600, #      utc_end 2015-03-08 11:00:00 (Sun)
  63550573200, #  local_start 2014-11-02 01:00:00 (Sun)
  63561463200, #    local_end 2015-03-08 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63561495600, #    utc_start 2015-03-08 11:00:00 (Sun)
  63582055200, #      utc_end 2015-11-01 10:00:00 (Sun)
  63561466800, #  local_start 2015-03-08 03:00:00 (Sun)
  63582026400, #    local_end 2015-11-01 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63582055200, #    utc_start 2015-11-01 10:00:00 (Sun)
  63593550000, #      utc_end 2016-03-13 11:00:00 (Sun)
  63582022800, #  local_start 2015-11-01 01:00:00 (Sun)
  63593517600, #    local_end 2016-03-13 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63593550000, #    utc_start 2016-03-13 11:00:00 (Sun)
  63614109600, #      utc_end 2016-11-06 10:00:00 (Sun)
  63593521200, #  local_start 2016-03-13 03:00:00 (Sun)
  63614080800, #    local_end 2016-11-06 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63614109600, #    utc_start 2016-11-06 10:00:00 (Sun)
  63624999600, #      utc_end 2017-03-12 11:00:00 (Sun)
  63614077200, #  local_start 2016-11-06 01:00:00 (Sun)
  63624967200, #    local_end 2017-03-12 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63624999600, #    utc_start 2017-03-12 11:00:00 (Sun)
  63645559200, #      utc_end 2017-11-05 10:00:00 (Sun)
  63624970800, #  local_start 2017-03-12 03:00:00 (Sun)
  63645530400, #    local_end 2017-11-05 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63645559200, #    utc_start 2017-11-05 10:00:00 (Sun)
  63656449200, #      utc_end 2018-03-11 11:00:00 (Sun)
  63645526800, #  local_start 2017-11-05 01:00:00 (Sun)
  63656416800, #    local_end 2018-03-11 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63656449200, #    utc_start 2018-03-11 11:00:00 (Sun)
  63677008800, #      utc_end 2018-11-04 10:00:00 (Sun)
  63656420400, #  local_start 2018-03-11 03:00:00 (Sun)
  63676980000, #    local_end 2018-11-04 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63677008800, #    utc_start 2018-11-04 10:00:00 (Sun)
  63687898800, #      utc_end 2019-03-10 11:00:00 (Sun)
  63676976400, #  local_start 2018-11-04 01:00:00 (Sun)
  63687866400, #    local_end 2019-03-10 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63687898800, #    utc_start 2019-03-10 11:00:00 (Sun)
  63708458400, #      utc_end 2019-11-03 10:00:00 (Sun)
  63687870000, #  local_start 2019-03-10 03:00:00 (Sun)
  63708429600, #    local_end 2019-11-03 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63708458400, #    utc_start 2019-11-03 10:00:00 (Sun)
  63719348400, #      utc_end 2020-03-08 11:00:00 (Sun)
  63708426000, #  local_start 2019-11-03 01:00:00 (Sun)
  63719316000, #    local_end 2020-03-08 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63719348400, #    utc_start 2020-03-08 11:00:00 (Sun)
  63739908000, #      utc_end 2020-11-01 10:00:00 (Sun)
  63719319600, #  local_start 2020-03-08 03:00:00 (Sun)
  63739879200, #    local_end 2020-11-01 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63739908000, #    utc_start 2020-11-01 10:00:00 (Sun)
  63751402800, #      utc_end 2021-03-14 11:00:00 (Sun)
  63739875600, #  local_start 2020-11-01 01:00:00 (Sun)
  63751370400, #    local_end 2021-03-14 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63751402800, #    utc_start 2021-03-14 11:00:00 (Sun)
  63771962400, #      utc_end 2021-11-07 10:00:00 (Sun)
  63751374000, #  local_start 2021-03-14 03:00:00 (Sun)
  63771933600, #    local_end 2021-11-07 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63771962400, #    utc_start 2021-11-07 10:00:00 (Sun)
  63782852400, #      utc_end 2022-03-13 11:00:00 (Sun)
  63771930000, #  local_start 2021-11-07 01:00:00 (Sun)
  63782820000, #    local_end 2022-03-13 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63782852400, #    utc_start 2022-03-13 11:00:00 (Sun)
  63803412000, #      utc_end 2022-11-06 10:00:00 (Sun)
  63782823600, #  local_start 2022-03-13 03:00:00 (Sun)
  63803383200, #    local_end 2022-11-06 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63803412000, #    utc_start 2022-11-06 10:00:00 (Sun)
  63814302000, #      utc_end 2023-03-12 11:00:00 (Sun)
  63803379600, #  local_start 2022-11-06 01:00:00 (Sun)
  63814269600, #    local_end 2023-03-12 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63814302000, #    utc_start 2023-03-12 11:00:00 (Sun)
  63834861600, #      utc_end 2023-11-05 10:00:00 (Sun)
  63814273200, #  local_start 2023-03-12 03:00:00 (Sun)
  63834832800, #    local_end 2023-11-05 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63834861600, #    utc_start 2023-11-05 10:00:00 (Sun)
  63845751600, #      utc_end 2024-03-10 11:00:00 (Sun)
  63834829200, #  local_start 2023-11-05 01:00:00 (Sun)
  63845719200, #    local_end 2024-03-10 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63845751600, #    utc_start 2024-03-10 11:00:00 (Sun)
  63866311200, #      utc_end 2024-11-03 10:00:00 (Sun)
  63845722800, #  local_start 2024-03-10 03:00:00 (Sun)
  63866282400, #    local_end 2024-11-03 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63866311200, #    utc_start 2024-11-03 10:00:00 (Sun)
  63877201200, #      utc_end 2025-03-09 11:00:00 (Sun)
  63866278800, #  local_start 2024-11-03 01:00:00 (Sun)
  63877168800, #    local_end 2025-03-09 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63877201200, #    utc_start 2025-03-09 11:00:00 (Sun)
  63897760800, #      utc_end 2025-11-02 10:00:00 (Sun)
  63877172400, #  local_start 2025-03-09 03:00:00 (Sun)
  63897732000, #    local_end 2025-11-02 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63897760800, #    utc_start 2025-11-02 10:00:00 (Sun)
  63908650800, #      utc_end 2026-03-08 11:00:00 (Sun)
  63897728400, #  local_start 2025-11-02 01:00:00 (Sun)
  63908618400, #    local_end 2026-03-08 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63908650800, #    utc_start 2026-03-08 11:00:00 (Sun)
  63929210400, #      utc_end 2026-11-01 10:00:00 (Sun)
  63908622000, #  local_start 2026-03-08 03:00:00 (Sun)
  63929181600, #    local_end 2026-11-01 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63929210400, #    utc_start 2026-11-01 10:00:00 (Sun)
  63940705200, #      utc_end 2027-03-14 11:00:00 (Sun)
  63929178000, #  local_start 2026-11-01 01:00:00 (Sun)
  63940672800, #    local_end 2027-03-14 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63940705200, #    utc_start 2027-03-14 11:00:00 (Sun)
  63961264800, #      utc_end 2027-11-07 10:00:00 (Sun)
  63940676400, #  local_start 2027-03-14 03:00:00 (Sun)
  63961236000, #    local_end 2027-11-07 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63961264800, #    utc_start 2027-11-07 10:00:00 (Sun)
  63972154800, #      utc_end 2028-03-12 11:00:00 (Sun)
  63961232400, #  local_start 2027-11-07 01:00:00 (Sun)
  63972122400, #    local_end 2028-03-12 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63972154800, #    utc_start 2028-03-12 11:00:00 (Sun)
  63992714400, #      utc_end 2028-11-05 10:00:00 (Sun)
  63972126000, #  local_start 2028-03-12 03:00:00 (Sun)
  63992685600, #    local_end 2028-11-05 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63992714400, #    utc_start 2028-11-05 10:00:00 (Sun)
  64003604400, #      utc_end 2029-03-11 11:00:00 (Sun)
  63992682000, #  local_start 2028-11-05 01:00:00 (Sun)
  64003572000, #    local_end 2029-03-11 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  64003604400, #    utc_start 2029-03-11 11:00:00 (Sun)
  64024164000, #      utc_end 2029-11-04 10:00:00 (Sun)
  64003575600, #  local_start 2029-03-11 03:00:00 (Sun)
  64024135200, #    local_end 2029-11-04 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  64024164000, #    utc_start 2029-11-04 10:00:00 (Sun)
  64035054000, #      utc_end 2030-03-10 11:00:00 (Sun)
  64024131600, #  local_start 2029-11-04 01:00:00 (Sun)
  64035021600, #    local_end 2030-03-10 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  64035054000, #    utc_start 2030-03-10 11:00:00 (Sun)
  64055613600, #      utc_end 2030-11-03 10:00:00 (Sun)
  64035025200, #  local_start 2030-03-10 03:00:00 (Sun)
  64055584800, #    local_end 2030-11-03 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {64}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -32400 }
  
  my $last_observance = bless( {
    'format' => 'AK%sT',
    'gmtoff' => '-9:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 724244,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 724244,
      'utc_rd_secs' => 0,
      'utc_year' => 1984
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -32400,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 724244,
      'local_rd_secs' => 32400,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 724244,
      'utc_rd_secs' => 32400,
      'utc_year' => 1984
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Mar',
      'letter' => 'D',
      'name' => 'US',
      'offset_from_std' => 3600,
      'on' => 'Sun>=8',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Nov',
      'letter' => 'S',
      'name' => 'US',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_ANCHORAGE

    $main::fatpacked{"DateTime/TimeZone/America/Araguaina.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_ARAGUAINA';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/southamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Araguaina;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Araguaina::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60368469168, #      utc_end 1914-01-01 03:12:48 (Thu)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60368457600, #    local_end 1914-01-01 00:00:00 (Thu)
  -11568,
  0,
  'LMT',
      ],
      [
  60368469168, #    utc_start 1914-01-01 03:12:48 (Thu)
  60928725600, #      utc_end 1931-10-03 14:00:00 (Sat)
  60368458368, #  local_start 1914-01-01 00:12:48 (Thu)
  60928714800, #    local_end 1931-10-03 11:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  60928725600, #    utc_start 1931-10-03 14:00:00 (Sat)
  60944320800, #      utc_end 1932-04-01 02:00:00 (Fri)
  60928718400, #  local_start 1931-10-03 12:00:00 (Sat)
  60944313600, #    local_end 1932-04-01 00:00:00 (Fri)
  -7200,
  1,
  '-02',
      ],
      [
  60944320800, #    utc_start 1932-04-01 02:00:00 (Fri)
  60960308400, #      utc_end 1932-10-03 03:00:00 (Mon)
  60944310000, #  local_start 1932-03-31 23:00:00 (Thu)
  60960297600, #    local_end 1932-10-03 00:00:00 (Mon)
  -10800,
  0,
  '-03',
      ],
      [
  60960308400, #    utc_start 1932-10-03 03:00:00 (Mon)
  60975856800, #      utc_end 1933-04-01 02:00:00 (Sat)
  60960301200, #  local_start 1932-10-03 01:00:00 (Mon)
  60975849600, #    local_end 1933-04-01 00:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  60975856800, #    utc_start 1933-04-01 02:00:00 (Sat)
  61501863600, #      utc_end 1949-12-01 03:00:00 (Thu)
  60975846000, #  local_start 1933-03-31 23:00:00 (Fri)
  61501852800, #    local_end 1949-12-01 00:00:00 (Thu)
  -10800,
  0,
  '-03',
      ],
      [
  61501863600, #    utc_start 1949-12-01 03:00:00 (Thu)
  61513614000, #      utc_end 1950-04-16 03:00:00 (Sun)
  61501856400, #  local_start 1949-12-01 01:00:00 (Thu)
  61513606800, #    local_end 1950-04-16 01:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  61513614000, #    utc_start 1950-04-16 03:00:00 (Sun)
  61533399600, #      utc_end 1950-12-01 03:00:00 (Fri)
  61513603200, #  local_start 1950-04-16 00:00:00 (Sun)
  61533388800, #    local_end 1950-12-01 00:00:00 (Fri)
  -10800,
  0,
  '-03',
      ],
      [
  61533399600, #    utc_start 1950-12-01 03:00:00 (Fri)
  61543850400, #      utc_end 1951-04-01 02:00:00 (Sun)
  61533392400, #  local_start 1950-12-01 01:00:00 (Fri)
  61543843200, #    local_end 1951-04-01 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  61543850400, #    utc_start 1951-04-01 02:00:00 (Sun)
  61564935600, #      utc_end 1951-12-01 03:00:00 (Sat)
  61543839600, #  local_start 1951-03-31 23:00:00 (Sat)
  61564924800, #    local_end 1951-12-01 00:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  61564935600, #    utc_start 1951-12-01 03:00:00 (Sat)
  61575472800, #      utc_end 1952-04-01 02:00:00 (Tue)
  61564928400, #  local_start 1951-12-01 01:00:00 (Sat)
  61575465600, #    local_end 1952-04-01 00:00:00 (Tue)
  -7200,
  1,
  '-02',
      ],
      [
  61575472800, #    utc_start 1952-04-01 02:00:00 (Tue)
  61596558000, #      utc_end 1952-12-01 03:00:00 (Mon)
  61575462000, #  local_start 1952-03-31 23:00:00 (Mon)
  61596547200, #    local_end 1952-12-01 00:00:00 (Mon)
  -10800,
  0,
  '-03',
      ],
      [
  61596558000, #    utc_start 1952-12-01 03:00:00 (Mon)
  61604330400, #      utc_end 1953-03-01 02:00:00 (Sun)
  61596550800, #  local_start 1952-12-01 01:00:00 (Mon)
  61604323200, #    local_end 1953-03-01 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  61604330400, #    utc_start 1953-03-01 02:00:00 (Sun)
  61944318000, #      utc_end 1963-12-09 03:00:00 (Mon)
  61604319600, #  local_start 1953-02-28 23:00:00 (Sat)
  61944307200, #    local_end 1963-12-09 00:00:00 (Mon)
  -10800,
  0,
  '-03',
      ],
      [
  61944318000, #    utc_start 1963-12-09 03:00:00 (Mon)
  61951485600, #      utc_end 1964-03-01 02:00:00 (Sun)
  61944310800, #  local_start 1963-12-09 01:00:00 (Mon)
  61951478400, #    local_end 1964-03-01 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  61951485600, #    utc_start 1964-03-01 02:00:00 (Sun)
  61980519600, #      utc_end 1965-01-31 03:00:00 (Sun)
  61951474800, #  local_start 1964-02-29 23:00:00 (Sat)
  61980508800, #    local_end 1965-01-31 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  61980519600, #    utc_start 1965-01-31 03:00:00 (Sun)
  61985613600, #      utc_end 1965-03-31 02:00:00 (Wed)
  61980512400, #  local_start 1965-01-31 01:00:00 (Sun)
  61985606400, #    local_end 1965-03-31 00:00:00 (Wed)
  -7200,
  1,
  '-02',
      ],
      [
  61985613600, #    utc_start 1965-03-31 02:00:00 (Wed)
  62006785200, #      utc_end 1965-12-01 03:00:00 (Wed)
  61985602800, #  local_start 1965-03-30 23:00:00 (Tue)
  62006774400, #    local_end 1965-12-01 00:00:00 (Wed)
  -10800,
  0,
  '-03',
      ],
      [
  62006785200, #    utc_start 1965-12-01 03:00:00 (Wed)
  62014557600, #      utc_end 1966-03-01 02:00:00 (Tue)
  62006778000, #  local_start 1965-12-01 01:00:00 (Wed)
  62014550400, #    local_end 1966-03-01 00:00:00 (Tue)
  -7200,
  1,
  '-02',
      ],
      [
  62014557600, #    utc_start 1966-03-01 02:00:00 (Tue)
  62035729200, #      utc_end 1966-11-01 03:00:00 (Tue)
  62014546800, #  local_start 1966-02-28 23:00:00 (Mon)
  62035718400, #    local_end 1966-11-01 00:00:00 (Tue)
  -10800,
  0,
  '-03',
      ],
      [
  62035729200, #    utc_start 1966-11-01 03:00:00 (Tue)
  62046093600, #      utc_end 1967-03-01 02:00:00 (Wed)
  62035722000, #  local_start 1966-11-01 01:00:00 (Tue)
  62046086400, #    local_end 1967-03-01 00:00:00 (Wed)
  -7200,
  1,
  '-02',
      ],
      [
  62046093600, #    utc_start 1967-03-01 02:00:00 (Wed)
  62067265200, #      utc_end 1967-11-01 03:00:00 (Wed)
  62046082800, #  local_start 1967-02-28 23:00:00 (Tue)
  62067254400, #    local_end 1967-11-01 00:00:00 (Wed)
  -10800,
  0,
  '-03',
      ],
      [
  62067265200, #    utc_start 1967-11-01 03:00:00 (Wed)
  62077716000, #      utc_end 1968-03-01 02:00:00 (Fri)
  62067258000, #  local_start 1967-11-01 01:00:00 (Wed)
  62077708800, #    local_end 1968-03-01 00:00:00 (Fri)
  -7200,
  1,
  '-02',
      ],
      [
  62077716000, #    utc_start 1968-03-01 02:00:00 (Fri)
  62635431600, #      utc_end 1985-11-02 03:00:00 (Sat)
  62077705200, #  local_start 1968-02-29 23:00:00 (Thu)
  62635420800, #    local_end 1985-11-02 00:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  62635431600, #    utc_start 1985-11-02 03:00:00 (Sat)
  62646919200, #      utc_end 1986-03-15 02:00:00 (Sat)
  62635424400, #  local_start 1985-11-02 01:00:00 (Sat)
  62646912000, #    local_end 1986-03-15 00:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  62646919200, #    utc_start 1986-03-15 02:00:00 (Sat)
  62666276400, #      utc_end 1986-10-25 03:00:00 (Sat)
  62646908400, #  local_start 1986-03-14 23:00:00 (Fri)
  62666265600, #    local_end 1986-10-25 00:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  62666276400, #    utc_start 1986-10-25 03:00:00 (Sat)
  62675949600, #      utc_end 1987-02-14 02:00:00 (Sat)
  62666269200, #  local_start 1986-10-25 01:00:00 (Sat)
  62675942400, #    local_end 1987-02-14 00:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  62675949600, #    utc_start 1987-02-14 02:00:00 (Sat)
  62697812400, #      utc_end 1987-10-25 03:00:00 (Sun)
  62675938800, #  local_start 1987-02-13 23:00:00 (Fri)
  62697801600, #    local_end 1987-10-25 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62697812400, #    utc_start 1987-10-25 03:00:00 (Sun)
  62706880800, #      utc_end 1988-02-07 02:00:00 (Sun)
  62697805200, #  local_start 1987-10-25 01:00:00 (Sun)
  62706873600, #    local_end 1988-02-07 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62706880800, #    utc_start 1988-02-07 02:00:00 (Sun)
  62728657200, #      utc_end 1988-10-16 03:00:00 (Sun)
  62706870000, #  local_start 1988-02-06 23:00:00 (Sat)
  62728646400, #    local_end 1988-10-16 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62728657200, #    utc_start 1988-10-16 03:00:00 (Sun)
  62737725600, #      utc_end 1989-01-29 02:00:00 (Sun)
  62728650000, #  local_start 1988-10-16 01:00:00 (Sun)
  62737718400, #    local_end 1989-01-29 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62737725600, #    utc_start 1989-01-29 02:00:00 (Sun)
  62760106800, #      utc_end 1989-10-15 03:00:00 (Sun)
  62737714800, #  local_start 1989-01-28 23:00:00 (Sat)
  62760096000, #    local_end 1989-10-15 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62760106800, #    utc_start 1989-10-15 03:00:00 (Sun)
  62770384800, #      utc_end 1990-02-11 02:00:00 (Sun)
  62760099600, #  local_start 1989-10-15 01:00:00 (Sun)
  62770377600, #    local_end 1990-02-11 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62770384800, #    utc_start 1990-02-11 02:00:00 (Sun)
  62789223600, #      utc_end 1990-09-17 03:00:00 (Mon)
  62770374000, #  local_start 1990-02-10 23:00:00 (Sat)
  62789212800, #    local_end 1990-09-17 00:00:00 (Mon)
  -10800,
  0,
  '-03',
      ],
      [
  62789223600, #    utc_start 1990-09-17 03:00:00 (Mon)
  62946730800, #      utc_end 1995-09-14 03:00:00 (Thu)
  62789212800, #  local_start 1990-09-17 00:00:00 (Mon)
  62946720000, #    local_end 1995-09-14 00:00:00 (Thu)
  -10800,
  0,
  '-03',
      ],
      [
  62946730800, #    utc_start 1995-09-14 03:00:00 (Thu)
  62949409200, #      utc_end 1995-10-15 03:00:00 (Sun)
  62946720000, #  local_start 1995-09-14 00:00:00 (Thu)
  62949398400, #    local_end 1995-10-15 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62949409200, #    utc_start 1995-10-15 03:00:00 (Sun)
  62959687200, #      utc_end 1996-02-11 02:00:00 (Sun)
  62949402000, #  local_start 1995-10-15 01:00:00 (Sun)
  62959680000, #    local_end 1996-02-11 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62959687200, #    utc_start 1996-02-11 02:00:00 (Sun)
  62980254000, #      utc_end 1996-10-06 03:00:00 (Sun)
  62959676400, #  local_start 1996-02-10 23:00:00 (Sat)
  62980243200, #    local_end 1996-10-06 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62980254000, #    utc_start 1996-10-06 03:00:00 (Sun)
  62991741600, #      utc_end 1997-02-16 02:00:00 (Sun)
  62980246800, #  local_start 1996-10-06 01:00:00 (Sun)
  62991734400, #    local_end 1997-02-16 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62991741600, #    utc_start 1997-02-16 02:00:00 (Sun)
  63011790000, #      utc_end 1997-10-06 03:00:00 (Mon)
  62991730800, #  local_start 1997-02-15 23:00:00 (Sat)
  63011779200, #    local_end 1997-10-06 00:00:00 (Mon)
  -10800,
  0,
  '-03',
      ],
      [
  63011790000, #    utc_start 1997-10-06 03:00:00 (Mon)
  63024400800, #      utc_end 1998-03-01 02:00:00 (Sun)
  63011782800, #  local_start 1997-10-06 01:00:00 (Mon)
  63024393600, #    local_end 1998-03-01 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63024400800, #    utc_start 1998-03-01 02:00:00 (Sun)
  63043758000, #      utc_end 1998-10-11 03:00:00 (Sun)
  63024390000, #  local_start 1998-02-28 23:00:00 (Sat)
  63043747200, #    local_end 1998-10-11 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63043758000, #    utc_start 1998-10-11 03:00:00 (Sun)
  63055245600, #      utc_end 1999-02-21 02:00:00 (Sun)
  63043750800, #  local_start 1998-10-11 01:00:00 (Sun)
  63055238400, #    local_end 1999-02-21 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63055245600, #    utc_start 1999-02-21 02:00:00 (Sun)
  63074602800, #      utc_end 1999-10-03 03:00:00 (Sun)
  63055234800, #  local_start 1999-02-20 23:00:00 (Sat)
  63074592000, #    local_end 1999-10-03 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63074602800, #    utc_start 1999-10-03 03:00:00 (Sun)
  63087300000, #      utc_end 2000-02-27 02:00:00 (Sun)
  63074595600, #  local_start 1999-10-03 01:00:00 (Sun)
  63087292800, #    local_end 2000-02-27 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63087300000, #    utc_start 2000-02-27 02:00:00 (Sun)
  63106657200, #      utc_end 2000-10-08 03:00:00 (Sun)
  63087289200, #  local_start 2000-02-26 23:00:00 (Sat)
  63106646400, #    local_end 2000-10-08 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63106657200, #    utc_start 2000-10-08 03:00:00 (Sun)
  63118144800, #      utc_end 2001-02-18 02:00:00 (Sun)
  63106650000, #  local_start 2000-10-08 01:00:00 (Sun)
  63118137600, #    local_end 2001-02-18 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63118144800, #    utc_start 2001-02-18 02:00:00 (Sun)
  63138711600, #      utc_end 2001-10-14 03:00:00 (Sun)
  63118134000, #  local_start 2001-02-17 23:00:00 (Sat)
  63138700800, #    local_end 2001-10-14 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63138711600, #    utc_start 2001-10-14 03:00:00 (Sun)
  63149594400, #      utc_end 2002-02-17 02:00:00 (Sun)
  63138704400, #  local_start 2001-10-14 01:00:00 (Sun)
  63149587200, #    local_end 2002-02-17 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63149594400, #    utc_start 2002-02-17 02:00:00 (Sun)
  63171975600, #      utc_end 2002-11-03 03:00:00 (Sun)
  63149583600, #  local_start 2002-02-16 23:00:00 (Sat)
  63171964800, #    local_end 2002-11-03 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63171975600, #    utc_start 2002-11-03 03:00:00 (Sun)
  63181044000, #      utc_end 2003-02-16 02:00:00 (Sun)
  63171968400, #  local_start 2002-11-03 01:00:00 (Sun)
  63181036800, #    local_end 2003-02-16 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63181044000, #    utc_start 2003-02-16 02:00:00 (Sun)
  63200055600, #      utc_end 2003-09-24 03:00:00 (Wed)
  63181033200, #  local_start 2003-02-15 23:00:00 (Sat)
  63200044800, #    local_end 2003-09-24 00:00:00 (Wed)
  -10800,
  0,
  '-03',
      ],
      [
  63200055600, #    utc_start 2003-09-24 03:00:00 (Wed)
  63486471600, #      utc_end 2012-10-21 03:00:00 (Sun)
  63200044800, #  local_start 2003-09-24 00:00:00 (Wed)
  63486460800, #    local_end 2012-10-21 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63486471600, #    utc_start 2012-10-21 03:00:00 (Sun)
  63496749600, #      utc_end 2013-02-17 02:00:00 (Sun)
  63486464400, #  local_start 2012-10-21 01:00:00 (Sun)
  63496742400, #    local_end 2013-02-17 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63496749600, #    utc_start 2013-02-17 02:00:00 (Sun)
  63513687600, #      utc_end 2013-09-01 03:00:00 (Sun)
  63496738800, #  local_start 2013-02-16 23:00:00 (Sat)
  63513676800, #    local_end 2013-09-01 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63513687600, #    utc_start 2013-09-01 03:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #      utc_end
  63513676800, #  local_start 2013-09-01 00:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  -10800,
  0,
  '-03',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {25}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_ARAGUAINA

    $main::fatpacked{"DateTime/TimeZone/America/Argentina/Buenos_Aires.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_ARGENTINA_BUENOS_AIRES';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/southamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Argentina::Buenos_Aires;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Argentina::Buenos_Aires::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59763585228, #      utc_end 1894-10-31 03:53:48 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59763571200, #    local_end 1894-10-31 00:00:00 (Wed)
  -14028,
  0,
  'LMT',
      ],
      [
  59763585228, #    utc_start 1894-10-31 03:53:48 (Wed)
  60568229808, #      utc_end 1920-05-01 04:16:48 (Sat)
  59763569820, #  local_start 1894-10-30 23:37:00 (Tue)
  60568214400, #    local_end 1920-05-01 00:00:00 (Sat)
  -15408,
  0,
  'CMT',
      ],
      [
  60568229808, #    utc_start 1920-05-01 04:16:48 (Sat)
  60902251200, #      utc_end 1930-12-01 04:00:00 (Mon)
  60568215408, #  local_start 1920-05-01 00:16:48 (Sat)
  60902236800, #    local_end 1930-12-01 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  60902251200, #    utc_start 1930-12-01 04:00:00 (Mon)
  60912702000, #      utc_end 1931-04-01 03:00:00 (Wed)
  60902240400, #  local_start 1930-12-01 01:00:00 (Mon)
  60912691200, #    local_end 1931-04-01 00:00:00 (Wed)
  -10800,
  1,
  '-03',
      ],
      [
  60912702000, #    utc_start 1931-04-01 03:00:00 (Wed)
  60929726400, #      utc_end 1931-10-15 04:00:00 (Thu)
  60912687600, #  local_start 1931-03-31 23:00:00 (Tue)
  60929712000, #    local_end 1931-10-15 00:00:00 (Thu)
  -14400,
  0,
  '-04',
      ],
      [
  60929726400, #    utc_start 1931-10-15 04:00:00 (Thu)
  60941646000, #      utc_end 1932-03-01 03:00:00 (Tue)
  60929715600, #  local_start 1931-10-15 01:00:00 (Thu)
  60941635200, #    local_end 1932-03-01 00:00:00 (Tue)
  -10800,
  1,
  '-03',
      ],
      [
  60941646000, #    utc_start 1932-03-01 03:00:00 (Tue)
  60962817600, #      utc_end 1932-11-01 04:00:00 (Tue)
  60941631600, #  local_start 1932-02-29 23:00:00 (Mon)
  60962803200, #    local_end 1932-11-01 00:00:00 (Tue)
  -14400,
  0,
  '-04',
      ],
      [
  60962817600, #    utc_start 1932-11-01 04:00:00 (Tue)
  60973182000, #      utc_end 1933-03-01 03:00:00 (Wed)
  60962806800, #  local_start 1932-11-01 01:00:00 (Tue)
  60973171200, #    local_end 1933-03-01 00:00:00 (Wed)
  -10800,
  1,
  '-03',
      ],
      [
  60973182000, #    utc_start 1933-03-01 03:00:00 (Wed)
  60994353600, #      utc_end 1933-11-01 04:00:00 (Wed)
  60973167600, #  local_start 1933-02-28 23:00:00 (Tue)
  60994339200, #    local_end 1933-11-01 00:00:00 (Wed)
  -14400,
  0,
  '-04',
      ],
      [
  60994353600, #    utc_start 1933-11-01 04:00:00 (Wed)
  61004718000, #      utc_end 1934-03-01 03:00:00 (Thu)
  60994342800, #  local_start 1933-11-01 01:00:00 (Wed)
  61004707200, #    local_end 1934-03-01 00:00:00 (Thu)
  -10800,
  1,
  '-03',
      ],
      [
  61004718000, #    utc_start 1934-03-01 03:00:00 (Thu)
  61025889600, #      utc_end 1934-11-01 04:00:00 (Thu)
  61004703600, #  local_start 1934-02-28 23:00:00 (Wed)
  61025875200, #    local_end 1934-11-01 00:00:00 (Thu)
  -14400,
  0,
  '-04',
      ],
      [
  61025889600, #    utc_start 1934-11-01 04:00:00 (Thu)
  61036254000, #      utc_end 1935-03-01 03:00:00 (Fri)
  61025878800, #  local_start 1934-11-01 01:00:00 (Thu)
  61036243200, #    local_end 1935-03-01 00:00:00 (Fri)
  -10800,
  1,
  '-03',
      ],
      [
  61036254000, #    utc_start 1935-03-01 03:00:00 (Fri)
  61057425600, #      utc_end 1935-11-01 04:00:00 (Fri)
  61036239600, #  local_start 1935-02-28 23:00:00 (Thu)
  61057411200, #    local_end 1935-11-01 00:00:00 (Fri)
  -14400,
  0,
  '-04',
      ],
      [
  61057425600, #    utc_start 1935-11-01 04:00:00 (Fri)
  61067876400, #      utc_end 1936-03-01 03:00:00 (Sun)
  61057414800, #  local_start 1935-11-01 01:00:00 (Fri)
  61067865600, #    local_end 1936-03-01 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61067876400, #    utc_start 1936-03-01 03:00:00 (Sun)
  61089048000, #      utc_end 1936-11-01 04:00:00 (Sun)
  61067862000, #  local_start 1936-02-29 23:00:00 (Sat)
  61089033600, #    local_end 1936-11-01 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  61089048000, #    utc_start 1936-11-01 04:00:00 (Sun)
  61099412400, #      utc_end 1937-03-01 03:00:00 (Mon)
  61089037200, #  local_start 1936-11-01 01:00:00 (Sun)
  61099401600, #    local_end 1937-03-01 00:00:00 (Mon)
  -10800,
  1,
  '-03',
      ],
      [
  61099412400, #    utc_start 1937-03-01 03:00:00 (Mon)
  61120584000, #      utc_end 1937-11-01 04:00:00 (Mon)
  61099398000, #  local_start 1937-02-28 23:00:00 (Sun)
  61120569600, #    local_end 1937-11-01 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  61120584000, #    utc_start 1937-11-01 04:00:00 (Mon)
  61130948400, #      utc_end 1938-03-01 03:00:00 (Tue)
  61120573200, #  local_start 1937-11-01 01:00:00 (Mon)
  61130937600, #    local_end 1938-03-01 00:00:00 (Tue)
  -10800,
  1,
  '-03',
      ],
      [
  61130948400, #    utc_start 1938-03-01 03:00:00 (Tue)
  61152120000, #      utc_end 1938-11-01 04:00:00 (Tue)
  61130934000, #  local_start 1938-02-28 23:00:00 (Mon)
  61152105600, #    local_end 1938-11-01 00:00:00 (Tue)
  -14400,
  0,
  '-04',
      ],
      [
  61152120000, #    utc_start 1938-11-01 04:00:00 (Tue)
  61162484400, #      utc_end 1939-03-01 03:00:00 (Wed)
  61152109200, #  local_start 1938-11-01 01:00:00 (Tue)
  61162473600, #    local_end 1939-03-01 00:00:00 (Wed)
  -10800,
  1,
  '-03',
      ],
      [
  61162484400, #    utc_start 1939-03-01 03:00:00 (Wed)
  61183656000, #      utc_end 1939-11-01 04:00:00 (Wed)
  61162470000, #  local_start 1939-02-28 23:00:00 (Tue)
  61183641600, #    local_end 1939-11-01 00:00:00 (Wed)
  -14400,
  0,
  '-04',
      ],
      [
  61183656000, #    utc_start 1939-11-01 04:00:00 (Wed)
  61194106800, #      utc_end 1940-03-01 03:00:00 (Fri)
  61183645200, #  local_start 1939-11-01 01:00:00 (Wed)
  61194096000, #    local_end 1940-03-01 00:00:00 (Fri)
  -10800,
  1,
  '-03',
      ],
      [
  61194106800, #    utc_start 1940-03-01 03:00:00 (Fri)
  61204651200, #      utc_end 1940-07-01 04:00:00 (Mon)
  61194092400, #  local_start 1940-02-29 23:00:00 (Thu)
  61204636800, #    local_end 1940-07-01 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  61204651200, #    utc_start 1940-07-01 04:00:00 (Mon)
  61234801200, #      utc_end 1941-06-15 03:00:00 (Sun)
  61204640400, #  local_start 1940-07-01 01:00:00 (Mon)
  61234790400, #    local_end 1941-06-15 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61234801200, #    utc_start 1941-06-15 03:00:00 (Sun)
  61245345600, #      utc_end 1941-10-15 04:00:00 (Wed)
  61234786800, #  local_start 1941-06-14 23:00:00 (Sat)
  61245331200, #    local_end 1941-10-15 00:00:00 (Wed)
  -14400,
  0,
  '-04',
      ],
      [
  61245345600, #    utc_start 1941-10-15 04:00:00 (Wed)
  61301934000, #      utc_end 1943-08-01 03:00:00 (Sun)
  61245334800, #  local_start 1941-10-15 01:00:00 (Wed)
  61301923200, #    local_end 1943-08-01 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61301934000, #    utc_start 1943-08-01 03:00:00 (Sun)
  61308417600, #      utc_end 1943-10-15 04:00:00 (Fri)
  61301919600, #  local_start 1943-07-31 23:00:00 (Sat)
  61308403200, #    local_end 1943-10-15 00:00:00 (Fri)
  -14400,
  0,
  '-04',
      ],
      [
  61308417600, #    utc_start 1943-10-15 04:00:00 (Fri)
  61383409200, #      utc_end 1946-03-01 03:00:00 (Fri)
  61308406800, #  local_start 1943-10-15 01:00:00 (Fri)
  61383398400, #    local_end 1946-03-01 00:00:00 (Fri)
  -10800,
  1,
  '-03',
      ],
      [
  61383409200, #    utc_start 1946-03-01 03:00:00 (Fri)
  61401902400, #      utc_end 1946-10-01 04:00:00 (Tue)
  61383394800, #  local_start 1946-02-28 23:00:00 (Thu)
  61401888000, #    local_end 1946-10-01 00:00:00 (Tue)
  -14400,
  0,
  '-04',
      ],
      [
  61401902400, #    utc_start 1946-10-01 04:00:00 (Tue)
  61938356400, #      utc_end 1963-10-01 03:00:00 (Tue)
  61401891600, #  local_start 1946-10-01 01:00:00 (Tue)
  61938345600, #    local_end 1963-10-01 00:00:00 (Tue)
  -10800,
  1,
  '-03',
      ],
      [
  61938356400, #    utc_start 1963-10-01 03:00:00 (Tue)
  61944840000, #      utc_end 1963-12-15 04:00:00 (Sun)
  61938342000, #  local_start 1963-09-30 23:00:00 (Mon)
  61944825600, #    local_end 1963-12-15 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  61944840000, #    utc_start 1963-12-15 04:00:00 (Sun)
  61951489200, #      utc_end 1964-03-01 03:00:00 (Sun)
  61944829200, #  local_start 1963-12-15 01:00:00 (Sun)
  61951478400, #    local_end 1964-03-01 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61951489200, #    utc_start 1964-03-01 03:00:00 (Sun)
  61971192000, #      utc_end 1964-10-15 04:00:00 (Thu)
  61951474800, #  local_start 1964-02-29 23:00:00 (Sat)
  61971177600, #    local_end 1964-10-15 00:00:00 (Thu)
  -14400,
  0,
  '-04',
      ],
      [
  61971192000, #    utc_start 1964-10-15 04:00:00 (Thu)
  61983025200, #      utc_end 1965-03-01 03:00:00 (Mon)
  61971181200, #  local_start 1964-10-15 01:00:00 (Thu)
  61983014400, #    local_end 1965-03-01 00:00:00 (Mon)
  -10800,
  1,
  '-03',
      ],
      [
  61983025200, #    utc_start 1965-03-01 03:00:00 (Mon)
  62002728000, #      utc_end 1965-10-15 04:00:00 (Fri)
  61983010800, #  local_start 1965-02-28 23:00:00 (Sun)
  62002713600, #    local_end 1965-10-15 00:00:00 (Fri)
  -14400,
  0,
  '-04',
      ],
      [
  62002728000, #    utc_start 1965-10-15 04:00:00 (Fri)
  62014561200, #      utc_end 1966-03-01 03:00:00 (Tue)
  62002717200, #  local_start 1965-10-15 01:00:00 (Fri)
  62014550400, #    local_end 1966-03-01 00:00:00 (Tue)
  -10800,
  1,
  '-03',
      ],
      [
  62014561200, #    utc_start 1966-03-01 03:00:00 (Tue)
  62034264000, #      utc_end 1966-10-15 04:00:00 (Sat)
  62014546800, #  local_start 1966-02-28 23:00:00 (Mon)
  62034249600, #    local_end 1966-10-15 00:00:00 (Sat)
  -14400,
  0,
  '-04',
      ],
      [
  62034264000, #    utc_start 1966-10-15 04:00:00 (Sat)
  62048862000, #      utc_end 1967-04-02 03:00:00 (Sun)
  62034253200, #  local_start 1966-10-15 01:00:00 (Sat)
  62048851200, #    local_end 1967-04-02 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62048862000, #    utc_start 1967-04-02 03:00:00 (Sun)
  62064590400, #      utc_end 1967-10-01 04:00:00 (Sun)
  62048847600, #  local_start 1967-04-01 23:00:00 (Sat)
  62064576000, #    local_end 1967-10-01 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62064590400, #    utc_start 1967-10-01 04:00:00 (Sun)
  62080916400, #      utc_end 1968-04-07 03:00:00 (Sun)
  62064579600, #  local_start 1967-10-01 01:00:00 (Sun)
  62080905600, #    local_end 1968-04-07 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62080916400, #    utc_start 1968-04-07 03:00:00 (Sun)
  62096644800, #      utc_end 1968-10-06 04:00:00 (Sun)
  62080902000, #  local_start 1968-04-06 23:00:00 (Sat)
  62096630400, #    local_end 1968-10-06 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62096644800, #    utc_start 1968-10-06 04:00:00 (Sun)
  62112366000, #      utc_end 1969-04-06 03:00:00 (Sun)
  62096634000, #  local_start 1968-10-06 01:00:00 (Sun)
  62112355200, #    local_end 1969-04-06 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62112366000, #    utc_start 1969-04-06 03:00:00 (Sun)
  62128094400, #      utc_end 1969-10-05 04:00:00 (Sun)
  62112351600, #  local_start 1969-04-05 23:00:00 (Sat)
  62128080000, #    local_end 1969-10-05 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62128094400, #    utc_start 1969-10-05 04:00:00 (Sun)
  62263825200, #      utc_end 1974-01-23 03:00:00 (Wed)
  62128083600, #  local_start 1969-10-05 01:00:00 (Sun)
  62263814400, #    local_end 1974-01-23 00:00:00 (Wed)
  -10800,
  0,
  '-03',
      ],
      [
  62263825200, #    utc_start 1974-01-23 03:00:00 (Wed)
  62272288800, #      utc_end 1974-05-01 02:00:00 (Wed)
  62263818000, #  local_start 1974-01-23 01:00:00 (Wed)
  62272281600, #    local_end 1974-05-01 00:00:00 (Wed)
  -7200,
  1,
  '-02',
      ],
      [
  62272288800, #    utc_start 1974-05-01 02:00:00 (Wed)
  62732631600, #      utc_end 1988-12-01 03:00:00 (Thu)
  62272278000, #  local_start 1974-04-30 23:00:00 (Tue)
  62732620800, #    local_end 1988-12-01 00:00:00 (Thu)
  -10800,
  0,
  '-03',
      ],
      [
  62732631600, #    utc_start 1988-12-01 03:00:00 (Thu)
  62740749600, #      utc_end 1989-03-05 02:00:00 (Sun)
  62732624400, #  local_start 1988-12-01 01:00:00 (Thu)
  62740742400, #    local_end 1989-03-05 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62740749600, #    utc_start 1989-03-05 02:00:00 (Sun)
  62760106800, #      utc_end 1989-10-15 03:00:00 (Sun)
  62740738800, #  local_start 1989-03-04 23:00:00 (Sat)
  62760096000, #    local_end 1989-10-15 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62760106800, #    utc_start 1989-10-15 03:00:00 (Sun)
  62772199200, #      utc_end 1990-03-04 02:00:00 (Sun)
  62760099600, #  local_start 1989-10-15 01:00:00 (Sun)
  62772192000, #    local_end 1990-03-04 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62772199200, #    utc_start 1990-03-04 02:00:00 (Sun)
  62792161200, #      utc_end 1990-10-21 03:00:00 (Sun)
  62772188400, #  local_start 1990-03-03 23:00:00 (Sat)
  62792150400, #    local_end 1990-10-21 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62792161200, #    utc_start 1990-10-21 03:00:00 (Sun)
  62803648800, #      utc_end 1991-03-03 02:00:00 (Sun)
  62792154000, #  local_start 1990-10-21 01:00:00 (Sun)
  62803641600, #    local_end 1991-03-03 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62803648800, #    utc_start 1991-03-03 02:00:00 (Sun)
  62823610800, #      utc_end 1991-10-20 03:00:00 (Sun)
  62803638000, #  local_start 1991-03-02 23:00:00 (Sat)
  62823600000, #    local_end 1991-10-20 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62823610800, #    utc_start 1991-10-20 03:00:00 (Sun)
  62835098400, #      utc_end 1992-03-01 02:00:00 (Sun)
  62823603600, #  local_start 1991-10-20 01:00:00 (Sun)
  62835091200, #    local_end 1992-03-01 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62835098400, #    utc_start 1992-03-01 02:00:00 (Sun)
  62855060400, #      utc_end 1992-10-18 03:00:00 (Sun)
  62835087600, #  local_start 1992-02-29 23:00:00 (Sat)
  62855049600, #    local_end 1992-10-18 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62855060400, #    utc_start 1992-10-18 03:00:00 (Sun)
  62867152800, #      utc_end 1993-03-07 02:00:00 (Sun)
  62855053200, #  local_start 1992-10-18 01:00:00 (Sun)
  62867145600, #    local_end 1993-03-07 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62867152800, #    utc_start 1993-03-07 02:00:00 (Sun)
  63074602800, #      utc_end 1999-10-03 03:00:00 (Sun)
  62867142000, #  local_start 1993-03-06 23:00:00 (Sat)
  63074592000, #    local_end 1999-10-03 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63074602800, #    utc_start 1999-10-03 03:00:00 (Sun)
  63087735600, #      utc_end 2000-03-03 03:00:00 (Fri)
  63074592000, #  local_start 1999-10-03 00:00:00 (Sun)
  63087724800, #    local_end 2000-03-03 00:00:00 (Fri)
  -10800,
  1,
  '-03',
      ],
      [
  63087735600, #    utc_start 2000-03-03 03:00:00 (Fri)
  63334666800, #      utc_end 2007-12-30 03:00:00 (Sun)
  63087724800, #  local_start 2000-03-03 00:00:00 (Fri)
  63334656000, #    local_end 2007-12-30 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63334666800, #    utc_start 2007-12-30 03:00:00 (Sun)
  63341316000, #      utc_end 2008-03-16 02:00:00 (Sun)
  63334659600, #  local_start 2007-12-30 01:00:00 (Sun)
  63341308800, #    local_end 2008-03-16 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63341316000, #    utc_start 2008-03-16 02:00:00 (Sun)
  63360068400, #      utc_end 2008-10-19 03:00:00 (Sun)
  63341305200, #  local_start 2008-03-15 23:00:00 (Sat)
  63360057600, #    local_end 2008-10-19 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63360068400, #    utc_start 2008-10-19 03:00:00 (Sun)
  63372765600, #      utc_end 2009-03-15 02:00:00 (Sun)
  63360061200, #  local_start 2008-10-19 01:00:00 (Sun)
  63372758400, #    local_end 2009-03-15 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63372765600, #    utc_start 2009-03-15 02:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #      utc_end
  63372754800, #  local_start 2009-03-14 23:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #    local_end
  -10800,
  0,
  '-03',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {29}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_ARGENTINA_BUENOS_AIRES

    $main::fatpacked{"DateTime/TimeZone/America/Argentina/Catamarca.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_ARGENTINA_CATAMARCA';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/southamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Argentina::Catamarca;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Argentina::Catamarca::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59763586988, #      utc_end 1894-10-31 04:23:08 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59763571200, #    local_end 1894-10-31 00:00:00 (Wed)
  -15788,
  0,
  'LMT',
      ],
      [
  59763586988, #    utc_start 1894-10-31 04:23:08 (Wed)
  60568229808, #      utc_end 1920-05-01 04:16:48 (Sat)
  59763571580, #  local_start 1894-10-31 00:06:20 (Wed)
  60568214400, #    local_end 1920-05-01 00:00:00 (Sat)
  -15408,
  0,
  'CMT',
      ],
      [
  60568229808, #    utc_start 1920-05-01 04:16:48 (Sat)
  60902251200, #      utc_end 1930-12-01 04:00:00 (Mon)
  60568215408, #  local_start 1920-05-01 00:16:48 (Sat)
  60902236800, #    local_end 1930-12-01 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  60902251200, #    utc_start 1930-12-01 04:00:00 (Mon)
  60912702000, #      utc_end 1931-04-01 03:00:00 (Wed)
  60902240400, #  local_start 1930-12-01 01:00:00 (Mon)
  60912691200, #    local_end 1931-04-01 00:00:00 (Wed)
  -10800,
  1,
  '-03',
      ],
      [
  60912702000, #    utc_start 1931-04-01 03:00:00 (Wed)
  60929726400, #      utc_end 1931-10-15 04:00:00 (Thu)
  60912687600, #  local_start 1931-03-31 23:00:00 (Tue)
  60929712000, #    local_end 1931-10-15 00:00:00 (Thu)
  -14400,
  0,
  '-04',
      ],
      [
  60929726400, #    utc_start 1931-10-15 04:00:00 (Thu)
  60941646000, #      utc_end 1932-03-01 03:00:00 (Tue)
  60929715600, #  local_start 1931-10-15 01:00:00 (Thu)
  60941635200, #    local_end 1932-03-01 00:00:00 (Tue)
  -10800,
  1,
  '-03',
      ],
      [
  60941646000, #    utc_start 1932-03-01 03:00:00 (Tue)
  60962817600, #      utc_end 1932-11-01 04:00:00 (Tue)
  60941631600, #  local_start 1932-02-29 23:00:00 (Mon)
  60962803200, #    local_end 1932-11-01 00:00:00 (Tue)
  -14400,
  0,
  '-04',
      ],
      [
  60962817600, #    utc_start 1932-11-01 04:00:00 (Tue)
  60973182000, #      utc_end 1933-03-01 03:00:00 (Wed)
  60962806800, #  local_start 1932-11-01 01:00:00 (Tue)
  60973171200, #    local_end 1933-03-01 00:00:00 (Wed)
  -10800,
  1,
  '-03',
      ],
      [
  60973182000, #    utc_start 1933-03-01 03:00:00 (Wed)
  60994353600, #      utc_end 1933-11-01 04:00:00 (Wed)
  60973167600, #  local_start 1933-02-28 23:00:00 (Tue)
  60994339200, #    local_end 1933-11-01 00:00:00 (Wed)
  -14400,
  0,
  '-04',
      ],
      [
  60994353600, #    utc_start 1933-11-01 04:00:00 (Wed)
  61004718000, #      utc_end 1934-03-01 03:00:00 (Thu)
  60994342800, #  local_start 1933-11-01 01:00:00 (Wed)
  61004707200, #    local_end 1934-03-01 00:00:00 (Thu)
  -10800,
  1,
  '-03',
      ],
      [
  61004718000, #    utc_start 1934-03-01 03:00:00 (Thu)
  61025889600, #      utc_end 1934-11-01 04:00:00 (Thu)
  61004703600, #  local_start 1934-02-28 23:00:00 (Wed)
  61025875200, #    local_end 1934-11-01 00:00:00 (Thu)
  -14400,
  0,
  '-04',
      ],
      [
  61025889600, #    utc_start 1934-11-01 04:00:00 (Thu)
  61036254000, #      utc_end 1935-03-01 03:00:00 (Fri)
  61025878800, #  local_start 1934-11-01 01:00:00 (Thu)
  61036243200, #    local_end 1935-03-01 00:00:00 (Fri)
  -10800,
  1,
  '-03',
      ],
      [
  61036254000, #    utc_start 1935-03-01 03:00:00 (Fri)
  61057425600, #      utc_end 1935-11-01 04:00:00 (Fri)
  61036239600, #  local_start 1935-02-28 23:00:00 (Thu)
  61057411200, #    local_end 1935-11-01 00:00:00 (Fri)
  -14400,
  0,
  '-04',
      ],
      [
  61057425600, #    utc_start 1935-11-01 04:00:00 (Fri)
  61067876400, #      utc_end 1936-03-01 03:00:00 (Sun)
  61057414800, #  local_start 1935-11-01 01:00:00 (Fri)
  61067865600, #    local_end 1936-03-01 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61067876400, #    utc_start 1936-03-01 03:00:00 (Sun)
  61089048000, #      utc_end 1936-11-01 04:00:00 (Sun)
  61067862000, #  local_start 1936-02-29 23:00:00 (Sat)
  61089033600, #    local_end 1936-11-01 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  61089048000, #    utc_start 1936-11-01 04:00:00 (Sun)
  61099412400, #      utc_end 1937-03-01 03:00:00 (Mon)
  61089037200, #  local_start 1936-11-01 01:00:00 (Sun)
  61099401600, #    local_end 1937-03-01 00:00:00 (Mon)
  -10800,
  1,
  '-03',
      ],
      [
  61099412400, #    utc_start 1937-03-01 03:00:00 (Mon)
  61120584000, #      utc_end 1937-11-01 04:00:00 (Mon)
  61099398000, #  local_start 1937-02-28 23:00:00 (Sun)
  61120569600, #    local_end 1937-11-01 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  61120584000, #    utc_start 1937-11-01 04:00:00 (Mon)
  61130948400, #      utc_end 1938-03-01 03:00:00 (Tue)
  61120573200, #  local_start 1937-11-01 01:00:00 (Mon)
  61130937600, #    local_end 1938-03-01 00:00:00 (Tue)
  -10800,
  1,
  '-03',
      ],
      [
  61130948400, #    utc_start 1938-03-01 03:00:00 (Tue)
  61152120000, #      utc_end 1938-11-01 04:00:00 (Tue)
  61130934000, #  local_start 1938-02-28 23:00:00 (Mon)
  61152105600, #    local_end 1938-11-01 00:00:00 (Tue)
  -14400,
  0,
  '-04',
      ],
      [
  61152120000, #    utc_start 1938-11-01 04:00:00 (Tue)
  61162484400, #      utc_end 1939-03-01 03:00:00 (Wed)
  61152109200, #  local_start 1938-11-01 01:00:00 (Tue)
  61162473600, #    local_end 1939-03-01 00:00:00 (Wed)
  -10800,
  1,
  '-03',
      ],
      [
  61162484400, #    utc_start 1939-03-01 03:00:00 (Wed)
  61183656000, #      utc_end 1939-11-01 04:00:00 (Wed)
  61162470000, #  local_start 1939-02-28 23:00:00 (Tue)
  61183641600, #    local_end 1939-11-01 00:00:00 (Wed)
  -14400,
  0,
  '-04',
      ],
      [
  61183656000, #    utc_start 1939-11-01 04:00:00 (Wed)
  61194106800, #      utc_end 1940-03-01 03:00:00 (Fri)
  61183645200, #  local_start 1939-11-01 01:00:00 (Wed)
  61194096000, #    local_end 1940-03-01 00:00:00 (Fri)
  -10800,
  1,
  '-03',
      ],
      [
  61194106800, #    utc_start 1940-03-01 03:00:00 (Fri)
  61204651200, #      utc_end 1940-07-01 04:00:00 (Mon)
  61194092400, #  local_start 1940-02-29 23:00:00 (Thu)
  61204636800, #    local_end 1940-07-01 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  61204651200, #    utc_start 1940-07-01 04:00:00 (Mon)
  61234801200, #      utc_end 1941-06-15 03:00:00 (Sun)
  61204640400, #  local_start 1940-07-01 01:00:00 (Mon)
  61234790400, #    local_end 1941-06-15 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61234801200, #    utc_start 1941-06-15 03:00:00 (Sun)
  61245345600, #      utc_end 1941-10-15 04:00:00 (Wed)
  61234786800, #  local_start 1941-06-14 23:00:00 (Sat)
  61245331200, #    local_end 1941-10-15 00:00:00 (Wed)
  -14400,
  0,
  '-04',
      ],
      [
  61245345600, #    utc_start 1941-10-15 04:00:00 (Wed)
  61301934000, #      utc_end 1943-08-01 03:00:00 (Sun)
  61245334800, #  local_start 1941-10-15 01:00:00 (Wed)
  61301923200, #    local_end 1943-08-01 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61301934000, #    utc_start 1943-08-01 03:00:00 (Sun)
  61308417600, #      utc_end 1943-10-15 04:00:00 (Fri)
  61301919600, #  local_start 1943-07-31 23:00:00 (Sat)
  61308403200, #    local_end 1943-10-15 00:00:00 (Fri)
  -14400,
  0,
  '-04',
      ],
      [
  61308417600, #    utc_start 1943-10-15 04:00:00 (Fri)
  61383409200, #      utc_end 1946-03-01 03:00:00 (Fri)
  61308406800, #  local_start 1943-10-15 01:00:00 (Fri)
  61383398400, #    local_end 1946-03-01 00:00:00 (Fri)
  -10800,
  1,
  '-03',
      ],
      [
  61383409200, #    utc_start 1946-03-01 03:00:00 (Fri)
  61401902400, #      utc_end 1946-10-01 04:00:00 (Tue)
  61383394800, #  local_start 1946-02-28 23:00:00 (Thu)
  61401888000, #    local_end 1946-10-01 00:00:00 (Tue)
  -14400,
  0,
  '-04',
      ],
      [
  61401902400, #    utc_start 1946-10-01 04:00:00 (Tue)
  61938356400, #      utc_end 1963-10-01 03:00:00 (Tue)
  61401891600, #  local_start 1946-10-01 01:00:00 (Tue)
  61938345600, #    local_end 1963-10-01 00:00:00 (Tue)
  -10800,
  1,
  '-03',
      ],
      [
  61938356400, #    utc_start 1963-10-01 03:00:00 (Tue)
  61944840000, #      utc_end 1963-12-15 04:00:00 (Sun)
  61938342000, #  local_start 1963-09-30 23:00:00 (Mon)
  61944825600, #    local_end 1963-12-15 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  61944840000, #    utc_start 1963-12-15 04:00:00 (Sun)
  61951489200, #      utc_end 1964-03-01 03:00:00 (Sun)
  61944829200, #  local_start 1963-12-15 01:00:00 (Sun)
  61951478400, #    local_end 1964-03-01 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61951489200, #    utc_start 1964-03-01 03:00:00 (Sun)
  61971192000, #      utc_end 1964-10-15 04:00:00 (Thu)
  61951474800, #  local_start 1964-02-29 23:00:00 (Sat)
  61971177600, #    local_end 1964-10-15 00:00:00 (Thu)
  -14400,
  0,
  '-04',
      ],
      [
  61971192000, #    utc_start 1964-10-15 04:00:00 (Thu)
  61983025200, #      utc_end 1965-03-01 03:00:00 (Mon)
  61971181200, #  local_start 1964-10-15 01:00:00 (Thu)
  61983014400, #    local_end 1965-03-01 00:00:00 (Mon)
  -10800,
  1,
  '-03',
      ],
      [
  61983025200, #    utc_start 1965-03-01 03:00:00 (Mon)
  62002728000, #      utc_end 1965-10-15 04:00:00 (Fri)
  61983010800, #  local_start 1965-02-28 23:00:00 (Sun)
  62002713600, #    local_end 1965-10-15 00:00:00 (Fri)
  -14400,
  0,
  '-04',
      ],
      [
  62002728000, #    utc_start 1965-10-15 04:00:00 (Fri)
  62014561200, #      utc_end 1966-03-01 03:00:00 (Tue)
  62002717200, #  local_start 1965-10-15 01:00:00 (Fri)
  62014550400, #    local_end 1966-03-01 00:00:00 (Tue)
  -10800,
  1,
  '-03',
      ],
      [
  62014561200, #    utc_start 1966-03-01 03:00:00 (Tue)
  62034264000, #      utc_end 1966-10-15 04:00:00 (Sat)
  62014546800, #  local_start 1966-02-28 23:00:00 (Mon)
  62034249600, #    local_end 1966-10-15 00:00:00 (Sat)
  -14400,
  0,
  '-04',
      ],
      [
  62034264000, #    utc_start 1966-10-15 04:00:00 (Sat)
  62048862000, #      utc_end 1967-04-02 03:00:00 (Sun)
  62034253200, #  local_start 1966-10-15 01:00:00 (Sat)
  62048851200, #    local_end 1967-04-02 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62048862000, #    utc_start 1967-04-02 03:00:00 (Sun)
  62064590400, #      utc_end 1967-10-01 04:00:00 (Sun)
  62048847600, #  local_start 1967-04-01 23:00:00 (Sat)
  62064576000, #    local_end 1967-10-01 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62064590400, #    utc_start 1967-10-01 04:00:00 (Sun)
  62080916400, #      utc_end 1968-04-07 03:00:00 (Sun)
  62064579600, #  local_start 1967-10-01 01:00:00 (Sun)
  62080905600, #    local_end 1968-04-07 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62080916400, #    utc_start 1968-04-07 03:00:00 (Sun)
  62096644800, #      utc_end 1968-10-06 04:00:00 (Sun)
  62080902000, #  local_start 1968-04-06 23:00:00 (Sat)
  62096630400, #    local_end 1968-10-06 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62096644800, #    utc_start 1968-10-06 04:00:00 (Sun)
  62112366000, #      utc_end 1969-04-06 03:00:00 (Sun)
  62096634000, #  local_start 1968-10-06 01:00:00 (Sun)
  62112355200, #    local_end 1969-04-06 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62112366000, #    utc_start 1969-04-06 03:00:00 (Sun)
  62128094400, #      utc_end 1969-10-05 04:00:00 (Sun)
  62112351600, #  local_start 1969-04-05 23:00:00 (Sat)
  62128080000, #    local_end 1969-10-05 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62128094400, #    utc_start 1969-10-05 04:00:00 (Sun)
  62263825200, #      utc_end 1974-01-23 03:00:00 (Wed)
  62128083600, #  local_start 1969-10-05 01:00:00 (Sun)
  62263814400, #    local_end 1974-01-23 00:00:00 (Wed)
  -10800,
  0,
  '-03',
      ],
      [
  62263825200, #    utc_start 1974-01-23 03:00:00 (Wed)
  62272288800, #      utc_end 1974-05-01 02:00:00 (Wed)
  62263818000, #  local_start 1974-01-23 01:00:00 (Wed)
  62272281600, #    local_end 1974-05-01 00:00:00 (Wed)
  -7200,
  1,
  '-02',
      ],
      [
  62272288800, #    utc_start 1974-05-01 02:00:00 (Wed)
  62732631600, #      utc_end 1988-12-01 03:00:00 (Thu)
  62272278000, #  local_start 1974-04-30 23:00:00 (Tue)
  62732620800, #    local_end 1988-12-01 00:00:00 (Thu)
  -10800,
  0,
  '-03',
      ],
      [
  62732631600, #    utc_start 1988-12-01 03:00:00 (Thu)
  62740749600, #      utc_end 1989-03-05 02:00:00 (Sun)
  62732624400, #  local_start 1988-12-01 01:00:00 (Thu)
  62740742400, #    local_end 1989-03-05 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62740749600, #    utc_start 1989-03-05 02:00:00 (Sun)
  62760106800, #      utc_end 1989-10-15 03:00:00 (Sun)
  62740738800, #  local_start 1989-03-04 23:00:00 (Sat)
  62760096000, #    local_end 1989-10-15 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62760106800, #    utc_start 1989-10-15 03:00:00 (Sun)
  62772199200, #      utc_end 1990-03-04 02:00:00 (Sun)
  62760099600, #  local_start 1989-10-15 01:00:00 (Sun)
  62772192000, #    local_end 1990-03-04 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62772199200, #    utc_start 1990-03-04 02:00:00 (Sun)
  62792161200, #      utc_end 1990-10-21 03:00:00 (Sun)
  62772188400, #  local_start 1990-03-03 23:00:00 (Sat)
  62792150400, #    local_end 1990-10-21 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62792161200, #    utc_start 1990-10-21 03:00:00 (Sun)
  62803648800, #      utc_end 1991-03-03 02:00:00 (Sun)
  62792154000, #  local_start 1990-10-21 01:00:00 (Sun)
  62803641600, #    local_end 1991-03-03 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62803648800, #    utc_start 1991-03-03 02:00:00 (Sun)
  62823614400, #      utc_end 1991-10-20 04:00:00 (Sun)
  62803634400, #  local_start 1991-03-02 22:00:00 (Sat)
  62823600000, #    local_end 1991-10-20 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62823614400, #    utc_start 1991-10-20 04:00:00 (Sun)
  62835098400, #      utc_end 1992-03-01 02:00:00 (Sun)
  62823607200, #  local_start 1991-10-20 02:00:00 (Sun)
  62835091200, #    local_end 1992-03-01 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62835098400, #    utc_start 1992-03-01 02:00:00 (Sun)
  62855060400, #      utc_end 1992-10-18 03:00:00 (Sun)
  62835087600, #  local_start 1992-02-29 23:00:00 (Sat)
  62855049600, #    local_end 1992-10-18 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62855060400, #    utc_start 1992-10-18 03:00:00 (Sun)
  62867152800, #      utc_end 1993-03-07 02:00:00 (Sun)
  62855053200, #  local_start 1992-10-18 01:00:00 (Sun)
  62867145600, #    local_end 1993-03-07 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62867152800, #    utc_start 1993-03-07 02:00:00 (Sun)
  63074602800, #      utc_end 1999-10-03 03:00:00 (Sun)
  62867142000, #  local_start 1993-03-06 23:00:00 (Sat)
  63074592000, #    local_end 1999-10-03 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63074602800, #    utc_start 1999-10-03 03:00:00 (Sun)
  63087735600, #      utc_end 2000-03-03 03:00:00 (Fri)
  63074592000, #  local_start 1999-10-03 00:00:00 (Sun)
  63087724800, #    local_end 2000-03-03 00:00:00 (Fri)
  -10800,
  1,
  '-03',
      ],
      [
  63087735600, #    utc_start 2000-03-03 03:00:00 (Fri)
  63221742000, #      utc_end 2004-06-01 03:00:00 (Tue)
  63087724800, #  local_start 2000-03-03 00:00:00 (Fri)
  63221731200, #    local_end 2004-06-01 00:00:00 (Tue)
  -10800,
  0,
  '-03',
      ],
      [
  63221742000, #    utc_start 2004-06-01 03:00:00 (Tue)
  63223387200, #      utc_end 2004-06-20 04:00:00 (Sun)
  63221727600, #  local_start 2004-05-31 23:00:00 (Mon)
  63223372800, #    local_end 2004-06-20 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63223387200, #    utc_start 2004-06-20 04:00:00 (Sun)
  63334666800, #      utc_end 2007-12-30 03:00:00 (Sun)
  63223376400, #  local_start 2004-06-20 01:00:00 (Sun)
  63334656000, #    local_end 2007-12-30 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63334666800, #    utc_start 2007-12-30 03:00:00 (Sun)
  63341316000, #      utc_end 2008-03-16 02:00:00 (Sun)
  63334659600, #  local_start 2007-12-30 01:00:00 (Sun)
  63341308800, #    local_end 2008-03-16 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63341316000, #    utc_start 2008-03-16 02:00:00 (Sun)
  63359982000, #      utc_end 2008-10-18 03:00:00 (Sat)
  63341305200, #  local_start 2008-03-15 23:00:00 (Sat)
  63359971200, #    local_end 2008-10-18 00:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  63359982000, #    utc_start 2008-10-18 03:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  63359971200, #  local_start 2008-10-18 00:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #    local_end
  -10800,
  0,
  '-03',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {28}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_ARGENTINA_CATAMARCA

    $main::fatpacked{"DateTime/TimeZone/America/Argentina/Cordoba.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_ARGENTINA_CORDOBA';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/southamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Argentina::Cordoba;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Argentina::Cordoba::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59763586608, #      utc_end 1894-10-31 04:16:48 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59763571200, #    local_end 1894-10-31 00:00:00 (Wed)
  -15408,
  0,
  'LMT',
      ],
      [
  59763586608, #    utc_start 1894-10-31 04:16:48 (Wed)
  60568229808, #      utc_end 1920-05-01 04:16:48 (Sat)
  59763571200, #  local_start 1894-10-31 00:00:00 (Wed)
  60568214400, #    local_end 1920-05-01 00:00:00 (Sat)
  -15408,
  0,
  'CMT',
      ],
      [
  60568229808, #    utc_start 1920-05-01 04:16:48 (Sat)
  60902251200, #      utc_end 1930-12-01 04:00:00 (Mon)
  60568215408, #  local_start 1920-05-01 00:16:48 (Sat)
  60902236800, #    local_end 1930-12-01 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  60902251200, #    utc_start 1930-12-01 04:00:00 (Mon)
  60912702000, #      utc_end 1931-04-01 03:00:00 (Wed)
  60902240400, #  local_start 1930-12-01 01:00:00 (Mon)
  60912691200, #    local_end 1931-04-01 00:00:00 (Wed)
  -10800,
  1,
  '-03',
      ],
      [
  60912702000, #    utc_start 1931-04-01 03:00:00 (Wed)
  60929726400, #      utc_end 1931-10-15 04:00:00 (Thu)
  60912687600, #  local_start 1931-03-31 23:00:00 (Tue)
  60929712000, #    local_end 1931-10-15 00:00:00 (Thu)
  -14400,
  0,
  '-04',
      ],
      [
  60929726400, #    utc_start 1931-10-15 04:00:00 (Thu)
  60941646000, #      utc_end 1932-03-01 03:00:00 (Tue)
  60929715600, #  local_start 1931-10-15 01:00:00 (Thu)
  60941635200, #    local_end 1932-03-01 00:00:00 (Tue)
  -10800,
  1,
  '-03',
      ],
      [
  60941646000, #    utc_start 1932-03-01 03:00:00 (Tue)
  60962817600, #      utc_end 1932-11-01 04:00:00 (Tue)
  60941631600, #  local_start 1932-02-29 23:00:00 (Mon)
  60962803200, #    local_end 1932-11-01 00:00:00 (Tue)
  -14400,
  0,
  '-04',
      ],
      [
  60962817600, #    utc_start 1932-11-01 04:00:00 (Tue)
  60973182000, #      utc_end 1933-03-01 03:00:00 (Wed)
  60962806800, #  local_start 1932-11-01 01:00:00 (Tue)
  60973171200, #    local_end 1933-03-01 00:00:00 (Wed)
  -10800,
  1,
  '-03',
      ],
      [
  60973182000, #    utc_start 1933-03-01 03:00:00 (Wed)
  60994353600, #      utc_end 1933-11-01 04:00:00 (Wed)
  60973167600, #  local_start 1933-02-28 23:00:00 (Tue)
  60994339200, #    local_end 1933-11-01 00:00:00 (Wed)
  -14400,
  0,
  '-04',
      ],
      [
  60994353600, #    utc_start 1933-11-01 04:00:00 (Wed)
  61004718000, #      utc_end 1934-03-01 03:00:00 (Thu)
  60994342800, #  local_start 1933-11-01 01:00:00 (Wed)
  61004707200, #    local_end 1934-03-01 00:00:00 (Thu)
  -10800,
  1,
  '-03',
      ],
      [
  61004718000, #    utc_start 1934-03-01 03:00:00 (Thu)
  61025889600, #      utc_end 1934-11-01 04:00:00 (Thu)
  61004703600, #  local_start 1934-02-28 23:00:00 (Wed)
  61025875200, #    local_end 1934-11-01 00:00:00 (Thu)
  -14400,
  0,
  '-04',
      ],
      [
  61025889600, #    utc_start 1934-11-01 04:00:00 (Thu)
  61036254000, #      utc_end 1935-03-01 03:00:00 (Fri)
  61025878800, #  local_start 1934-11-01 01:00:00 (Thu)
  61036243200, #    local_end 1935-03-01 00:00:00 (Fri)
  -10800,
  1,
  '-03',
      ],
      [
  61036254000, #    utc_start 1935-03-01 03:00:00 (Fri)
  61057425600, #      utc_end 1935-11-01 04:00:00 (Fri)
  61036239600, #  local_start 1935-02-28 23:00:00 (Thu)
  61057411200, #    local_end 1935-11-01 00:00:00 (Fri)
  -14400,
  0,
  '-04',
      ],
      [
  61057425600, #    utc_start 1935-11-01 04:00:00 (Fri)
  61067876400, #      utc_end 1936-03-01 03:00:00 (Sun)
  61057414800, #  local_start 1935-11-01 01:00:00 (Fri)
  61067865600, #    local_end 1936-03-01 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61067876400, #    utc_start 1936-03-01 03:00:00 (Sun)
  61089048000, #      utc_end 1936-11-01 04:00:00 (Sun)
  61067862000, #  local_start 1936-02-29 23:00:00 (Sat)
  61089033600, #    local_end 1936-11-01 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  61089048000, #    utc_start 1936-11-01 04:00:00 (Sun)
  61099412400, #      utc_end 1937-03-01 03:00:00 (Mon)
  61089037200, #  local_start 1936-11-01 01:00:00 (Sun)
  61099401600, #    local_end 1937-03-01 00:00:00 (Mon)
  -10800,
  1,
  '-03',
      ],
      [
  61099412400, #    utc_start 1937-03-01 03:00:00 (Mon)
  61120584000, #      utc_end 1937-11-01 04:00:00 (Mon)
  61099398000, #  local_start 1937-02-28 23:00:00 (Sun)
  61120569600, #    local_end 1937-11-01 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  61120584000, #    utc_start 1937-11-01 04:00:00 (Mon)
  61130948400, #      utc_end 1938-03-01 03:00:00 (Tue)
  61120573200, #  local_start 1937-11-01 01:00:00 (Mon)
  61130937600, #    local_end 1938-03-01 00:00:00 (Tue)
  -10800,
  1,
  '-03',
      ],
      [
  61130948400, #    utc_start 1938-03-01 03:00:00 (Tue)
  61152120000, #      utc_end 1938-11-01 04:00:00 (Tue)
  61130934000, #  local_start 1938-02-28 23:00:00 (Mon)
  61152105600, #    local_end 1938-11-01 00:00:00 (Tue)
  -14400,
  0,
  '-04',
      ],
      [
  61152120000, #    utc_start 1938-11-01 04:00:00 (Tue)
  61162484400, #      utc_end 1939-03-01 03:00:00 (Wed)
  61152109200, #  local_start 1938-11-01 01:00:00 (Tue)
  61162473600, #    local_end 1939-03-01 00:00:00 (Wed)
  -10800,
  1,
  '-03',
      ],
      [
  61162484400, #    utc_start 1939-03-01 03:00:00 (Wed)
  61183656000, #      utc_end 1939-11-01 04:00:00 (Wed)
  61162470000, #  local_start 1939-02-28 23:00:00 (Tue)
  61183641600, #    local_end 1939-11-01 00:00:00 (Wed)
  -14400,
  0,
  '-04',
      ],
      [
  61183656000, #    utc_start 1939-11-01 04:00:00 (Wed)
  61194106800, #      utc_end 1940-03-01 03:00:00 (Fri)
  61183645200, #  local_start 1939-11-01 01:00:00 (Wed)
  61194096000, #    local_end 1940-03-01 00:00:00 (Fri)
  -10800,
  1,
  '-03',
      ],
      [
  61194106800, #    utc_start 1940-03-01 03:00:00 (Fri)
  61204651200, #      utc_end 1940-07-01 04:00:00 (Mon)
  61194092400, #  local_start 1940-02-29 23:00:00 (Thu)
  61204636800, #    local_end 1940-07-01 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  61204651200, #    utc_start 1940-07-01 04:00:00 (Mon)
  61234801200, #      utc_end 1941-06-15 03:00:00 (Sun)
  61204640400, #  local_start 1940-07-01 01:00:00 (Mon)
  61234790400, #    local_end 1941-06-15 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61234801200, #    utc_start 1941-06-15 03:00:00 (Sun)
  61245345600, #      utc_end 1941-10-15 04:00:00 (Wed)
  61234786800, #  local_start 1941-06-14 23:00:00 (Sat)
  61245331200, #    local_end 1941-10-15 00:00:00 (Wed)
  -14400,
  0,
  '-04',
      ],
      [
  61245345600, #    utc_start 1941-10-15 04:00:00 (Wed)
  61301934000, #      utc_end 1943-08-01 03:00:00 (Sun)
  61245334800, #  local_start 1941-10-15 01:00:00 (Wed)
  61301923200, #    local_end 1943-08-01 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61301934000, #    utc_start 1943-08-01 03:00:00 (Sun)
  61308417600, #      utc_end 1943-10-15 04:00:00 (Fri)
  61301919600, #  local_start 1943-07-31 23:00:00 (Sat)
  61308403200, #    local_end 1943-10-15 00:00:00 (Fri)
  -14400,
  0,
  '-04',
      ],
      [
  61308417600, #    utc_start 1943-10-15 04:00:00 (Fri)
  61383409200, #      utc_end 1946-03-01 03:00:00 (Fri)
  61308406800, #  local_start 1943-10-15 01:00:00 (Fri)
  61383398400, #    local_end 1946-03-01 00:00:00 (Fri)
  -10800,
  1,
  '-03',
      ],
      [
  61383409200, #    utc_start 1946-03-01 03:00:00 (Fri)
  61401902400, #      utc_end 1946-10-01 04:00:00 (Tue)
  61383394800, #  local_start 1946-02-28 23:00:00 (Thu)
  61401888000, #    local_end 1946-10-01 00:00:00 (Tue)
  -14400,
  0,
  '-04',
      ],
      [
  61401902400, #    utc_start 1946-10-01 04:00:00 (Tue)
  61938356400, #      utc_end 1963-10-01 03:00:00 (Tue)
  61401891600, #  local_start 1946-10-01 01:00:00 (Tue)
  61938345600, #    local_end 1963-10-01 00:00:00 (Tue)
  -10800,
  1,
  '-03',
      ],
      [
  61938356400, #    utc_start 1963-10-01 03:00:00 (Tue)
  61944840000, #      utc_end 1963-12-15 04:00:00 (Sun)
  61938342000, #  local_start 1963-09-30 23:00:00 (Mon)
  61944825600, #    local_end 1963-12-15 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  61944840000, #    utc_start 1963-12-15 04:00:00 (Sun)
  61951489200, #      utc_end 1964-03-01 03:00:00 (Sun)
  61944829200, #  local_start 1963-12-15 01:00:00 (Sun)
  61951478400, #    local_end 1964-03-01 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61951489200, #    utc_start 1964-03-01 03:00:00 (Sun)
  61971192000, #      utc_end 1964-10-15 04:00:00 (Thu)
  61951474800, #  local_start 1964-02-29 23:00:00 (Sat)
  61971177600, #    local_end 1964-10-15 00:00:00 (Thu)
  -14400,
  0,
  '-04',
      ],
      [
  61971192000, #    utc_start 1964-10-15 04:00:00 (Thu)
  61983025200, #      utc_end 1965-03-01 03:00:00 (Mon)
  61971181200, #  local_start 1964-10-15 01:00:00 (Thu)
  61983014400, #    local_end 1965-03-01 00:00:00 (Mon)
  -10800,
  1,
  '-03',
      ],
      [
  61983025200, #    utc_start 1965-03-01 03:00:00 (Mon)
  62002728000, #      utc_end 1965-10-15 04:00:00 (Fri)
  61983010800, #  local_start 1965-02-28 23:00:00 (Sun)
  62002713600, #    local_end 1965-10-15 00:00:00 (Fri)
  -14400,
  0,
  '-04',
      ],
      [
  62002728000, #    utc_start 1965-10-15 04:00:00 (Fri)
  62014561200, #      utc_end 1966-03-01 03:00:00 (Tue)
  62002717200, #  local_start 1965-10-15 01:00:00 (Fri)
  62014550400, #    local_end 1966-03-01 00:00:00 (Tue)
  -10800,
  1,
  '-03',
      ],
      [
  62014561200, #    utc_start 1966-03-01 03:00:00 (Tue)
  62034264000, #      utc_end 1966-10-15 04:00:00 (Sat)
  62014546800, #  local_start 1966-02-28 23:00:00 (Mon)
  62034249600, #    local_end 1966-10-15 00:00:00 (Sat)
  -14400,
  0,
  '-04',
      ],
      [
  62034264000, #    utc_start 1966-10-15 04:00:00 (Sat)
  62048862000, #      utc_end 1967-04-02 03:00:00 (Sun)
  62034253200, #  local_start 1966-10-15 01:00:00 (Sat)
  62048851200, #    local_end 1967-04-02 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62048862000, #    utc_start 1967-04-02 03:00:00 (Sun)
  62064590400, #      utc_end 1967-10-01 04:00:00 (Sun)
  62048847600, #  local_start 1967-04-01 23:00:00 (Sat)
  62064576000, #    local_end 1967-10-01 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62064590400, #    utc_start 1967-10-01 04:00:00 (Sun)
  62080916400, #      utc_end 1968-04-07 03:00:00 (Sun)
  62064579600, #  local_start 1967-10-01 01:00:00 (Sun)
  62080905600, #    local_end 1968-04-07 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62080916400, #    utc_start 1968-04-07 03:00:00 (Sun)
  62096644800, #      utc_end 1968-10-06 04:00:00 (Sun)
  62080902000, #  local_start 1968-04-06 23:00:00 (Sat)
  62096630400, #    local_end 1968-10-06 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62096644800, #    utc_start 1968-10-06 04:00:00 (Sun)
  62112366000, #      utc_end 1969-04-06 03:00:00 (Sun)
  62096634000, #  local_start 1968-10-06 01:00:00 (Sun)
  62112355200, #    local_end 1969-04-06 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62112366000, #    utc_start 1969-04-06 03:00:00 (Sun)
  62128094400, #      utc_end 1969-10-05 04:00:00 (Sun)
  62112351600, #  local_start 1969-04-05 23:00:00 (Sat)
  62128080000, #    local_end 1969-10-05 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62128094400, #    utc_start 1969-10-05 04:00:00 (Sun)
  62263825200, #      utc_end 1974-01-23 03:00:00 (Wed)
  62128083600, #  local_start 1969-10-05 01:00:00 (Sun)
  62263814400, #    local_end 1974-01-23 00:00:00 (Wed)
  -10800,
  0,
  '-03',
      ],
      [
  62263825200, #    utc_start 1974-01-23 03:00:00 (Wed)
  62272288800, #      utc_end 1974-05-01 02:00:00 (Wed)
  62263818000, #  local_start 1974-01-23 01:00:00 (Wed)
  62272281600, #    local_end 1974-05-01 00:00:00 (Wed)
  -7200,
  1,
  '-02',
      ],
      [
  62272288800, #    utc_start 1974-05-01 02:00:00 (Wed)
  62732631600, #      utc_end 1988-12-01 03:00:00 (Thu)
  62272278000, #  local_start 1974-04-30 23:00:00 (Tue)
  62732620800, #    local_end 1988-12-01 00:00:00 (Thu)
  -10800,
  0,
  '-03',
      ],
      [
  62732631600, #    utc_start 1988-12-01 03:00:00 (Thu)
  62740749600, #      utc_end 1989-03-05 02:00:00 (Sun)
  62732624400, #  local_start 1988-12-01 01:00:00 (Thu)
  62740742400, #    local_end 1989-03-05 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62740749600, #    utc_start 1989-03-05 02:00:00 (Sun)
  62760106800, #      utc_end 1989-10-15 03:00:00 (Sun)
  62740738800, #  local_start 1989-03-04 23:00:00 (Sat)
  62760096000, #    local_end 1989-10-15 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62760106800, #    utc_start 1989-10-15 03:00:00 (Sun)
  62772199200, #      utc_end 1990-03-04 02:00:00 (Sun)
  62760099600, #  local_start 1989-10-15 01:00:00 (Sun)
  62772192000, #    local_end 1990-03-04 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62772199200, #    utc_start 1990-03-04 02:00:00 (Sun)
  62792161200, #      utc_end 1990-10-21 03:00:00 (Sun)
  62772188400, #  local_start 1990-03-03 23:00:00 (Sat)
  62792150400, #    local_end 1990-10-21 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62792161200, #    utc_start 1990-10-21 03:00:00 (Sun)
  62803648800, #      utc_end 1991-03-03 02:00:00 (Sun)
  62792154000, #  local_start 1990-10-21 01:00:00 (Sun)
  62803641600, #    local_end 1991-03-03 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62803648800, #    utc_start 1991-03-03 02:00:00 (Sun)
  62823614400, #      utc_end 1991-10-20 04:00:00 (Sun)
  62803634400, #  local_start 1991-03-02 22:00:00 (Sat)
  62823600000, #    local_end 1991-10-20 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62823614400, #    utc_start 1991-10-20 04:00:00 (Sun)
  62835098400, #      utc_end 1992-03-01 02:00:00 (Sun)
  62823607200, #  local_start 1991-10-20 02:00:00 (Sun)
  62835091200, #    local_end 1992-03-01 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62835098400, #    utc_start 1992-03-01 02:00:00 (Sun)
  62855060400, #      utc_end 1992-10-18 03:00:00 (Sun)
  62835087600, #  local_start 1992-02-29 23:00:00 (Sat)
  62855049600, #    local_end 1992-10-18 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62855060400, #    utc_start 1992-10-18 03:00:00 (Sun)
  62867152800, #      utc_end 1993-03-07 02:00:00 (Sun)
  62855053200, #  local_start 1992-10-18 01:00:00 (Sun)
  62867145600, #    local_end 1993-03-07 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62867152800, #    utc_start 1993-03-07 02:00:00 (Sun)
  63074602800, #      utc_end 1999-10-03 03:00:00 (Sun)
  62867142000, #  local_start 1993-03-06 23:00:00 (Sat)
  63074592000, #    local_end 1999-10-03 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63074602800, #    utc_start 1999-10-03 03:00:00 (Sun)
  63087735600, #      utc_end 2000-03-03 03:00:00 (Fri)
  63074592000, #  local_start 1999-10-03 00:00:00 (Sun)
  63087724800, #    local_end 2000-03-03 00:00:00 (Fri)
  -10800,
  1,
  '-03',
      ],
      [
  63087735600, #    utc_start 2000-03-03 03:00:00 (Fri)
  63334666800, #      utc_end 2007-12-30 03:00:00 (Sun)
  63087724800, #  local_start 2000-03-03 00:00:00 (Fri)
  63334656000, #    local_end 2007-12-30 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63334666800, #    utc_start 2007-12-30 03:00:00 (Sun)
  63341316000, #      utc_end 2008-03-16 02:00:00 (Sun)
  63334659600, #  local_start 2007-12-30 01:00:00 (Sun)
  63341308800, #    local_end 2008-03-16 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63341316000, #    utc_start 2008-03-16 02:00:00 (Sun)
  63360068400, #      utc_end 2008-10-19 03:00:00 (Sun)
  63341305200, #  local_start 2008-03-15 23:00:00 (Sat)
  63360057600, #    local_end 2008-10-19 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63360068400, #    utc_start 2008-10-19 03:00:00 (Sun)
  63372765600, #      utc_end 2009-03-15 02:00:00 (Sun)
  63360061200, #  local_start 2008-10-19 01:00:00 (Sun)
  63372758400, #    local_end 2009-03-15 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63372765600, #    utc_start 2009-03-15 02:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #      utc_end
  63372754800, #  local_start 2009-03-14 23:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #    local_end
  -10800,
  0,
  '-03',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {29}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_ARGENTINA_CORDOBA

    $main::fatpacked{"DateTime/TimeZone/America/Argentina/Jujuy.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_ARGENTINA_JUJUY';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/southamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Argentina::Jujuy;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Argentina::Jujuy::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59763586872, #      utc_end 1894-10-31 04:21:12 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59763571200, #    local_end 1894-10-31 00:00:00 (Wed)
  -15672,
  0,
  'LMT',
      ],
      [
  59763586872, #    utc_start 1894-10-31 04:21:12 (Wed)
  60568229808, #      utc_end 1920-05-01 04:16:48 (Sat)
  59763571464, #  local_start 1894-10-31 00:04:24 (Wed)
  60568214400, #    local_end 1920-05-01 00:00:00 (Sat)
  -15408,
  0,
  'CMT',
      ],
      [
  60568229808, #    utc_start 1920-05-01 04:16:48 (Sat)
  60902251200, #      utc_end 1930-12-01 04:00:00 (Mon)
  60568215408, #  local_start 1920-05-01 00:16:48 (Sat)
  60902236800, #    local_end 1930-12-01 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  60902251200, #    utc_start 1930-12-01 04:00:00 (Mon)
  60912702000, #      utc_end 1931-04-01 03:00:00 (Wed)
  60902240400, #  local_start 1930-12-01 01:00:00 (Mon)
  60912691200, #    local_end 1931-04-01 00:00:00 (Wed)
  -10800,
  1,
  '-03',
      ],
      [
  60912702000, #    utc_start 1931-04-01 03:00:00 (Wed)
  60929726400, #      utc_end 1931-10-15 04:00:00 (Thu)
  60912687600, #  local_start 1931-03-31 23:00:00 (Tue)
  60929712000, #    local_end 1931-10-15 00:00:00 (Thu)
  -14400,
  0,
  '-04',
      ],
      [
  60929726400, #    utc_start 1931-10-15 04:00:00 (Thu)
  60941646000, #      utc_end 1932-03-01 03:00:00 (Tue)
  60929715600, #  local_start 1931-10-15 01:00:00 (Thu)
  60941635200, #    local_end 1932-03-01 00:00:00 (Tue)
  -10800,
  1,
  '-03',
      ],
      [
  60941646000, #    utc_start 1932-03-01 03:00:00 (Tue)
  60962817600, #      utc_end 1932-11-01 04:00:00 (Tue)
  60941631600, #  local_start 1932-02-29 23:00:00 (Mon)
  60962803200, #    local_end 1932-11-01 00:00:00 (Tue)
  -14400,
  0,
  '-04',
      ],
      [
  60962817600, #    utc_start 1932-11-01 04:00:00 (Tue)
  60973182000, #      utc_end 1933-03-01 03:00:00 (Wed)
  60962806800, #  local_start 1932-11-01 01:00:00 (Tue)
  60973171200, #    local_end 1933-03-01 00:00:00 (Wed)
  -10800,
  1,
  '-03',
      ],
      [
  60973182000, #    utc_start 1933-03-01 03:00:00 (Wed)
  60994353600, #      utc_end 1933-11-01 04:00:00 (Wed)
  60973167600, #  local_start 1933-02-28 23:00:00 (Tue)
  60994339200, #    local_end 1933-11-01 00:00:00 (Wed)
  -14400,
  0,
  '-04',
      ],
      [
  60994353600, #    utc_start 1933-11-01 04:00:00 (Wed)
  61004718000, #      utc_end 1934-03-01 03:00:00 (Thu)
  60994342800, #  local_start 1933-11-01 01:00:00 (Wed)
  61004707200, #    local_end 1934-03-01 00:00:00 (Thu)
  -10800,
  1,
  '-03',
      ],
      [
  61004718000, #    utc_start 1934-03-01 03:00:00 (Thu)
  61025889600, #      utc_end 1934-11-01 04:00:00 (Thu)
  61004703600, #  local_start 1934-02-28 23:00:00 (Wed)
  61025875200, #    local_end 1934-11-01 00:00:00 (Thu)
  -14400,
  0,
  '-04',
      ],
      [
  61025889600, #    utc_start 1934-11-01 04:00:00 (Thu)
  61036254000, #      utc_end 1935-03-01 03:00:00 (Fri)
  61025878800, #  local_start 1934-11-01 01:00:00 (Thu)
  61036243200, #    local_end 1935-03-01 00:00:00 (Fri)
  -10800,
  1,
  '-03',
      ],
      [
  61036254000, #    utc_start 1935-03-01 03:00:00 (Fri)
  61057425600, #      utc_end 1935-11-01 04:00:00 (Fri)
  61036239600, #  local_start 1935-02-28 23:00:00 (Thu)
  61057411200, #    local_end 1935-11-01 00:00:00 (Fri)
  -14400,
  0,
  '-04',
      ],
      [
  61057425600, #    utc_start 1935-11-01 04:00:00 (Fri)
  61067876400, #      utc_end 1936-03-01 03:00:00 (Sun)
  61057414800, #  local_start 1935-11-01 01:00:00 (Fri)
  61067865600, #    local_end 1936-03-01 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61067876400, #    utc_start 1936-03-01 03:00:00 (Sun)
  61089048000, #      utc_end 1936-11-01 04:00:00 (Sun)
  61067862000, #  local_start 1936-02-29 23:00:00 (Sat)
  61089033600, #    local_end 1936-11-01 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  61089048000, #    utc_start 1936-11-01 04:00:00 (Sun)
  61099412400, #      utc_end 1937-03-01 03:00:00 (Mon)
  61089037200, #  local_start 1936-11-01 01:00:00 (Sun)
  61099401600, #    local_end 1937-03-01 00:00:00 (Mon)
  -10800,
  1,
  '-03',
      ],
      [
  61099412400, #    utc_start 1937-03-01 03:00:00 (Mon)
  61120584000, #      utc_end 1937-11-01 04:00:00 (Mon)
  61099398000, #  local_start 1937-02-28 23:00:00 (Sun)
  61120569600, #    local_end 1937-11-01 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  61120584000, #    utc_start 1937-11-01 04:00:00 (Mon)
  61130948400, #      utc_end 1938-03-01 03:00:00 (Tue)
  61120573200, #  local_start 1937-11-01 01:00:00 (Mon)
  61130937600, #    local_end 1938-03-01 00:00:00 (Tue)
  -10800,
  1,
  '-03',
      ],
      [
  61130948400, #    utc_start 1938-03-01 03:00:00 (Tue)
  61152120000, #      utc_end 1938-11-01 04:00:00 (Tue)
  61130934000, #  local_start 1938-02-28 23:00:00 (Mon)
  61152105600, #    local_end 1938-11-01 00:00:00 (Tue)
  -14400,
  0,
  '-04',
      ],
      [
  61152120000, #    utc_start 1938-11-01 04:00:00 (Tue)
  61162484400, #      utc_end 1939-03-01 03:00:00 (Wed)
  61152109200, #  local_start 1938-11-01 01:00:00 (Tue)
  61162473600, #    local_end 1939-03-01 00:00:00 (Wed)
  -10800,
  1,
  '-03',
      ],
      [
  61162484400, #    utc_start 1939-03-01 03:00:00 (Wed)
  61183656000, #      utc_end 1939-11-01 04:00:00 (Wed)
  61162470000, #  local_start 1939-02-28 23:00:00 (Tue)
  61183641600, #    local_end 1939-11-01 00:00:00 (Wed)
  -14400,
  0,
  '-04',
      ],
      [
  61183656000, #    utc_start 1939-11-01 04:00:00 (Wed)
  61194106800, #      utc_end 1940-03-01 03:00:00 (Fri)
  61183645200, #  local_start 1939-11-01 01:00:00 (Wed)
  61194096000, #    local_end 1940-03-01 00:00:00 (Fri)
  -10800,
  1,
  '-03',
      ],
      [
  61194106800, #    utc_start 1940-03-01 03:00:00 (Fri)
  61204651200, #      utc_end 1940-07-01 04:00:00 (Mon)
  61194092400, #  local_start 1940-02-29 23:00:00 (Thu)
  61204636800, #    local_end 1940-07-01 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  61204651200, #    utc_start 1940-07-01 04:00:00 (Mon)
  61234801200, #      utc_end 1941-06-15 03:00:00 (Sun)
  61204640400, #  local_start 1940-07-01 01:00:00 (Mon)
  61234790400, #    local_end 1941-06-15 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61234801200, #    utc_start 1941-06-15 03:00:00 (Sun)
  61245345600, #      utc_end 1941-10-15 04:00:00 (Wed)
  61234786800, #  local_start 1941-06-14 23:00:00 (Sat)
  61245331200, #    local_end 1941-10-15 00:00:00 (Wed)
  -14400,
  0,
  '-04',
      ],
      [
  61245345600, #    utc_start 1941-10-15 04:00:00 (Wed)
  61301934000, #      utc_end 1943-08-01 03:00:00 (Sun)
  61245334800, #  local_start 1941-10-15 01:00:00 (Wed)
  61301923200, #    local_end 1943-08-01 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61301934000, #    utc_start 1943-08-01 03:00:00 (Sun)
  61308417600, #      utc_end 1943-10-15 04:00:00 (Fri)
  61301919600, #  local_start 1943-07-31 23:00:00 (Sat)
  61308403200, #    local_end 1943-10-15 00:00:00 (Fri)
  -14400,
  0,
  '-04',
      ],
      [
  61308417600, #    utc_start 1943-10-15 04:00:00 (Fri)
  61383409200, #      utc_end 1946-03-01 03:00:00 (Fri)
  61308406800, #  local_start 1943-10-15 01:00:00 (Fri)
  61383398400, #    local_end 1946-03-01 00:00:00 (Fri)
  -10800,
  1,
  '-03',
      ],
      [
  61383409200, #    utc_start 1946-03-01 03:00:00 (Fri)
  61401902400, #      utc_end 1946-10-01 04:00:00 (Tue)
  61383394800, #  local_start 1946-02-28 23:00:00 (Thu)
  61401888000, #    local_end 1946-10-01 00:00:00 (Tue)
  -14400,
  0,
  '-04',
      ],
      [
  61401902400, #    utc_start 1946-10-01 04:00:00 (Tue)
  61938356400, #      utc_end 1963-10-01 03:00:00 (Tue)
  61401891600, #  local_start 1946-10-01 01:00:00 (Tue)
  61938345600, #    local_end 1963-10-01 00:00:00 (Tue)
  -10800,
  1,
  '-03',
      ],
      [
  61938356400, #    utc_start 1963-10-01 03:00:00 (Tue)
  61944840000, #      utc_end 1963-12-15 04:00:00 (Sun)
  61938342000, #  local_start 1963-09-30 23:00:00 (Mon)
  61944825600, #    local_end 1963-12-15 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  61944840000, #    utc_start 1963-12-15 04:00:00 (Sun)
  61951489200, #      utc_end 1964-03-01 03:00:00 (Sun)
  61944829200, #  local_start 1963-12-15 01:00:00 (Sun)
  61951478400, #    local_end 1964-03-01 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61951489200, #    utc_start 1964-03-01 03:00:00 (Sun)
  61971192000, #      utc_end 1964-10-15 04:00:00 (Thu)
  61951474800, #  local_start 1964-02-29 23:00:00 (Sat)
  61971177600, #    local_end 1964-10-15 00:00:00 (Thu)
  -14400,
  0,
  '-04',
      ],
      [
  61971192000, #    utc_start 1964-10-15 04:00:00 (Thu)
  61983025200, #      utc_end 1965-03-01 03:00:00 (Mon)
  61971181200, #  local_start 1964-10-15 01:00:00 (Thu)
  61983014400, #    local_end 1965-03-01 00:00:00 (Mon)
  -10800,
  1,
  '-03',
      ],
      [
  61983025200, #    utc_start 1965-03-01 03:00:00 (Mon)
  62002728000, #      utc_end 1965-10-15 04:00:00 (Fri)
  61983010800, #  local_start 1965-02-28 23:00:00 (Sun)
  62002713600, #    local_end 1965-10-15 00:00:00 (Fri)
  -14400,
  0,
  '-04',
      ],
      [
  62002728000, #    utc_start 1965-10-15 04:00:00 (Fri)
  62014561200, #      utc_end 1966-03-01 03:00:00 (Tue)
  62002717200, #  local_start 1965-10-15 01:00:00 (Fri)
  62014550400, #    local_end 1966-03-01 00:00:00 (Tue)
  -10800,
  1,
  '-03',
      ],
      [
  62014561200, #    utc_start 1966-03-01 03:00:00 (Tue)
  62034264000, #      utc_end 1966-10-15 04:00:00 (Sat)
  62014546800, #  local_start 1966-02-28 23:00:00 (Mon)
  62034249600, #    local_end 1966-10-15 00:00:00 (Sat)
  -14400,
  0,
  '-04',
      ],
      [
  62034264000, #    utc_start 1966-10-15 04:00:00 (Sat)
  62048862000, #      utc_end 1967-04-02 03:00:00 (Sun)
  62034253200, #  local_start 1966-10-15 01:00:00 (Sat)
  62048851200, #    local_end 1967-04-02 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62048862000, #    utc_start 1967-04-02 03:00:00 (Sun)
  62064590400, #      utc_end 1967-10-01 04:00:00 (Sun)
  62048847600, #  local_start 1967-04-01 23:00:00 (Sat)
  62064576000, #    local_end 1967-10-01 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62064590400, #    utc_start 1967-10-01 04:00:00 (Sun)
  62080916400, #      utc_end 1968-04-07 03:00:00 (Sun)
  62064579600, #  local_start 1967-10-01 01:00:00 (Sun)
  62080905600, #    local_end 1968-04-07 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62080916400, #    utc_start 1968-04-07 03:00:00 (Sun)
  62096644800, #      utc_end 1968-10-06 04:00:00 (Sun)
  62080902000, #  local_start 1968-04-06 23:00:00 (Sat)
  62096630400, #    local_end 1968-10-06 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62096644800, #    utc_start 1968-10-06 04:00:00 (Sun)
  62112366000, #      utc_end 1969-04-06 03:00:00 (Sun)
  62096634000, #  local_start 1968-10-06 01:00:00 (Sun)
  62112355200, #    local_end 1969-04-06 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62112366000, #    utc_start 1969-04-06 03:00:00 (Sun)
  62128094400, #      utc_end 1969-10-05 04:00:00 (Sun)
  62112351600, #  local_start 1969-04-05 23:00:00 (Sat)
  62128080000, #    local_end 1969-10-05 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62128094400, #    utc_start 1969-10-05 04:00:00 (Sun)
  62263825200, #      utc_end 1974-01-23 03:00:00 (Wed)
  62128083600, #  local_start 1969-10-05 01:00:00 (Sun)
  62263814400, #    local_end 1974-01-23 00:00:00 (Wed)
  -10800,
  0,
  '-03',
      ],
      [
  62263825200, #    utc_start 1974-01-23 03:00:00 (Wed)
  62272288800, #      utc_end 1974-05-01 02:00:00 (Wed)
  62263818000, #  local_start 1974-01-23 01:00:00 (Wed)
  62272281600, #    local_end 1974-05-01 00:00:00 (Wed)
  -7200,
  1,
  '-02',
      ],
      [
  62272288800, #    utc_start 1974-05-01 02:00:00 (Wed)
  62732631600, #      utc_end 1988-12-01 03:00:00 (Thu)
  62272278000, #  local_start 1974-04-30 23:00:00 (Tue)
  62732620800, #    local_end 1988-12-01 00:00:00 (Thu)
  -10800,
  0,
  '-03',
      ],
      [
  62732631600, #    utc_start 1988-12-01 03:00:00 (Thu)
  62740749600, #      utc_end 1989-03-05 02:00:00 (Sun)
  62732624400, #  local_start 1988-12-01 01:00:00 (Thu)
  62740742400, #    local_end 1989-03-05 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62740749600, #    utc_start 1989-03-05 02:00:00 (Sun)
  62760106800, #      utc_end 1989-10-15 03:00:00 (Sun)
  62740738800, #  local_start 1989-03-04 23:00:00 (Sat)
  62760096000, #    local_end 1989-10-15 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62760106800, #    utc_start 1989-10-15 03:00:00 (Sun)
  62772199200, #      utc_end 1990-03-04 02:00:00 (Sun)
  62760099600, #  local_start 1989-10-15 01:00:00 (Sun)
  62772192000, #    local_end 1990-03-04 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62772199200, #    utc_start 1990-03-04 02:00:00 (Sun)
  62792769600, #      utc_end 1990-10-28 04:00:00 (Sun)
  62772184800, #  local_start 1990-03-03 22:00:00 (Sat)
  62792755200, #    local_end 1990-10-28 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62792769600, #    utc_start 1990-10-28 04:00:00 (Sun)
  62804862000, #      utc_end 1991-03-17 03:00:00 (Sun)
  62792758800, #  local_start 1990-10-28 01:00:00 (Sun)
  62804851200, #    local_end 1991-03-17 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62804862000, #    utc_start 1991-03-17 03:00:00 (Sun)
  62822404800, #      utc_end 1991-10-06 04:00:00 (Sun)
  62804847600, #  local_start 1991-03-16 23:00:00 (Sat)
  62822390400, #    local_end 1991-10-06 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62822404800, #    utc_start 1991-10-06 04:00:00 (Sun)
  62829914400, #      utc_end 1992-01-01 02:00:00 (Wed)
  62822397600, #  local_start 1991-10-06 02:00:00 (Sun)
  62829907200, #    local_end 1992-01-01 00:00:00 (Wed)
  -7200,
  1,
  '-02',
      ],
      [
  62829914400, #    utc_start 1992-01-01 02:00:00 (Wed)
  62835098400, #      utc_end 1992-03-01 02:00:00 (Sun)
  62829907200, #  local_start 1992-01-01 00:00:00 (Wed)
  62835091200, #    local_end 1992-03-01 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62835098400, #    utc_start 1992-03-01 02:00:00 (Sun)
  62855060400, #      utc_end 1992-10-18 03:00:00 (Sun)
  62835087600, #  local_start 1992-02-29 23:00:00 (Sat)
  62855049600, #    local_end 1992-10-18 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62855060400, #    utc_start 1992-10-18 03:00:00 (Sun)
  62867152800, #      utc_end 1993-03-07 02:00:00 (Sun)
  62855053200, #  local_start 1992-10-18 01:00:00 (Sun)
  62867145600, #    local_end 1993-03-07 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62867152800, #    utc_start 1993-03-07 02:00:00 (Sun)
  63074602800, #      utc_end 1999-10-03 03:00:00 (Sun)
  62867142000, #  local_start 1993-03-06 23:00:00 (Sat)
  63074592000, #    local_end 1999-10-03 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63074602800, #    utc_start 1999-10-03 03:00:00 (Sun)
  63087735600, #      utc_end 2000-03-03 03:00:00 (Fri)
  63074592000, #  local_start 1999-10-03 00:00:00 (Sun)
  63087724800, #    local_end 2000-03-03 00:00:00 (Fri)
  -10800,
  1,
  '-03',
      ],
      [
  63087735600, #    utc_start 2000-03-03 03:00:00 (Fri)
  63334666800, #      utc_end 2007-12-30 03:00:00 (Sun)
  63087724800, #  local_start 2000-03-03 00:00:00 (Fri)
  63334656000, #    local_end 2007-12-30 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63334666800, #    utc_start 2007-12-30 03:00:00 (Sun)
  63341316000, #      utc_end 2008-03-16 02:00:00 (Sun)
  63334659600, #  local_start 2007-12-30 01:00:00 (Sun)
  63341308800, #    local_end 2008-03-16 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63341316000, #    utc_start 2008-03-16 02:00:00 (Sun)
  63359982000, #      utc_end 2008-10-18 03:00:00 (Sat)
  63341305200, #  local_start 2008-03-15 23:00:00 (Sat)
  63359971200, #    local_end 2008-10-18 00:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  63359982000, #    utc_start 2008-10-18 03:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  63359971200, #  local_start 2008-10-18 00:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #    local_end
  -10800,
  0,
  '-03',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {29}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_ARGENTINA_JUJUY

    $main::fatpacked{"DateTime/TimeZone/America/Argentina/La_Rioja.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_ARGENTINA_LA_RIOJA';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/southamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Argentina::La_Rioja;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Argentina::La_Rioja::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59763587244, #      utc_end 1894-10-31 04:27:24 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59763571200, #    local_end 1894-10-31 00:00:00 (Wed)
  -16044,
  0,
  'LMT',
      ],
      [
  59763587244, #    utc_start 1894-10-31 04:27:24 (Wed)
  60568229808, #      utc_end 1920-05-01 04:16:48 (Sat)
  59763571836, #  local_start 1894-10-31 00:10:36 (Wed)
  60568214400, #    local_end 1920-05-01 00:00:00 (Sat)
  -15408,
  0,
  'CMT',
      ],
      [
  60568229808, #    utc_start 1920-05-01 04:16:48 (Sat)
  60902251200, #      utc_end 1930-12-01 04:00:00 (Mon)
  60568215408, #  local_start 1920-05-01 00:16:48 (Sat)
  60902236800, #    local_end 1930-12-01 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  60902251200, #    utc_start 1930-12-01 04:00:00 (Mon)
  60912702000, #      utc_end 1931-04-01 03:00:00 (Wed)
  60902240400, #  local_start 1930-12-01 01:00:00 (Mon)
  60912691200, #    local_end 1931-04-01 00:00:00 (Wed)
  -10800,
  1,
  '-03',
      ],
      [
  60912702000, #    utc_start 1931-04-01 03:00:00 (Wed)
  60929726400, #      utc_end 1931-10-15 04:00:00 (Thu)
  60912687600, #  local_start 1931-03-31 23:00:00 (Tue)
  60929712000, #    local_end 1931-10-15 00:00:00 (Thu)
  -14400,
  0,
  '-04',
      ],
      [
  60929726400, #    utc_start 1931-10-15 04:00:00 (Thu)
  60941646000, #      utc_end 1932-03-01 03:00:00 (Tue)
  60929715600, #  local_start 1931-10-15 01:00:00 (Thu)
  60941635200, #    local_end 1932-03-01 00:00:00 (Tue)
  -10800,
  1,
  '-03',
      ],
      [
  60941646000, #    utc_start 1932-03-01 03:00:00 (Tue)
  60962817600, #      utc_end 1932-11-01 04:00:00 (Tue)
  60941631600, #  local_start 1932-02-29 23:00:00 (Mon)
  60962803200, #    local_end 1932-11-01 00:00:00 (Tue)
  -14400,
  0,
  '-04',
      ],
      [
  60962817600, #    utc_start 1932-11-01 04:00:00 (Tue)
  60973182000, #      utc_end 1933-03-01 03:00:00 (Wed)
  60962806800, #  local_start 1932-11-01 01:00:00 (Tue)
  60973171200, #    local_end 1933-03-01 00:00:00 (Wed)
  -10800,
  1,
  '-03',
      ],
      [
  60973182000, #    utc_start 1933-03-01 03:00:00 (Wed)
  60994353600, #      utc_end 1933-11-01 04:00:00 (Wed)
  60973167600, #  local_start 1933-02-28 23:00:00 (Tue)
  60994339200, #    local_end 1933-11-01 00:00:00 (Wed)
  -14400,
  0,
  '-04',
      ],
      [
  60994353600, #    utc_start 1933-11-01 04:00:00 (Wed)
  61004718000, #      utc_end 1934-03-01 03:00:00 (Thu)
  60994342800, #  local_start 1933-11-01 01:00:00 (Wed)
  61004707200, #    local_end 1934-03-01 00:00:00 (Thu)
  -10800,
  1,
  '-03',
      ],
      [
  61004718000, #    utc_start 1934-03-01 03:00:00 (Thu)
  61025889600, #      utc_end 1934-11-01 04:00:00 (Thu)
  61004703600, #  local_start 1934-02-28 23:00:00 (Wed)
  61025875200, #    local_end 1934-11-01 00:00:00 (Thu)
  -14400,
  0,
  '-04',
      ],
      [
  61025889600, #    utc_start 1934-11-01 04:00:00 (Thu)
  61036254000, #      utc_end 1935-03-01 03:00:00 (Fri)
  61025878800, #  local_start 1934-11-01 01:00:00 (Thu)
  61036243200, #    local_end 1935-03-01 00:00:00 (Fri)
  -10800,
  1,
  '-03',
      ],
      [
  61036254000, #    utc_start 1935-03-01 03:00:00 (Fri)
  61057425600, #      utc_end 1935-11-01 04:00:00 (Fri)
  61036239600, #  local_start 1935-02-28 23:00:00 (Thu)
  61057411200, #    local_end 1935-11-01 00:00:00 (Fri)
  -14400,
  0,
  '-04',
      ],
      [
  61057425600, #    utc_start 1935-11-01 04:00:00 (Fri)
  61067876400, #      utc_end 1936-03-01 03:00:00 (Sun)
  61057414800, #  local_start 1935-11-01 01:00:00 (Fri)
  61067865600, #    local_end 1936-03-01 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61067876400, #    utc_start 1936-03-01 03:00:00 (Sun)
  61089048000, #      utc_end 1936-11-01 04:00:00 (Sun)
  61067862000, #  local_start 1936-02-29 23:00:00 (Sat)
  61089033600, #    local_end 1936-11-01 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  61089048000, #    utc_start 1936-11-01 04:00:00 (Sun)
  61099412400, #      utc_end 1937-03-01 03:00:00 (Mon)
  61089037200, #  local_start 1936-11-01 01:00:00 (Sun)
  61099401600, #    local_end 1937-03-01 00:00:00 (Mon)
  -10800,
  1,
  '-03',
      ],
      [
  61099412400, #    utc_start 1937-03-01 03:00:00 (Mon)
  61120584000, #      utc_end 1937-11-01 04:00:00 (Mon)
  61099398000, #  local_start 1937-02-28 23:00:00 (Sun)
  61120569600, #    local_end 1937-11-01 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  61120584000, #    utc_start 1937-11-01 04:00:00 (Mon)
  61130948400, #      utc_end 1938-03-01 03:00:00 (Tue)
  61120573200, #  local_start 1937-11-01 01:00:00 (Mon)
  61130937600, #    local_end 1938-03-01 00:00:00 (Tue)
  -10800,
  1,
  '-03',
      ],
      [
  61130948400, #    utc_start 1938-03-01 03:00:00 (Tue)
  61152120000, #      utc_end 1938-11-01 04:00:00 (Tue)
  61130934000, #  local_start 1938-02-28 23:00:00 (Mon)
  61152105600, #    local_end 1938-11-01 00:00:00 (Tue)
  -14400,
  0,
  '-04',
      ],
      [
  61152120000, #    utc_start 1938-11-01 04:00:00 (Tue)
  61162484400, #      utc_end 1939-03-01 03:00:00 (Wed)
  61152109200, #  local_start 1938-11-01 01:00:00 (Tue)
  61162473600, #    local_end 1939-03-01 00:00:00 (Wed)
  -10800,
  1,
  '-03',
      ],
      [
  61162484400, #    utc_start 1939-03-01 03:00:00 (Wed)
  61183656000, #      utc_end 1939-11-01 04:00:00 (Wed)
  61162470000, #  local_start 1939-02-28 23:00:00 (Tue)
  61183641600, #    local_end 1939-11-01 00:00:00 (Wed)
  -14400,
  0,
  '-04',
      ],
      [
  61183656000, #    utc_start 1939-11-01 04:00:00 (Wed)
  61194106800, #      utc_end 1940-03-01 03:00:00 (Fri)
  61183645200, #  local_start 1939-11-01 01:00:00 (Wed)
  61194096000, #    local_end 1940-03-01 00:00:00 (Fri)
  -10800,
  1,
  '-03',
      ],
      [
  61194106800, #    utc_start 1940-03-01 03:00:00 (Fri)
  61204651200, #      utc_end 1940-07-01 04:00:00 (Mon)
  61194092400, #  local_start 1940-02-29 23:00:00 (Thu)
  61204636800, #    local_end 1940-07-01 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  61204651200, #    utc_start 1940-07-01 04:00:00 (Mon)
  61234801200, #      utc_end 1941-06-15 03:00:00 (Sun)
  61204640400, #  local_start 1940-07-01 01:00:00 (Mon)
  61234790400, #    local_end 1941-06-15 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61234801200, #    utc_start 1941-06-15 03:00:00 (Sun)
  61245345600, #      utc_end 1941-10-15 04:00:00 (Wed)
  61234786800, #  local_start 1941-06-14 23:00:00 (Sat)
  61245331200, #    local_end 1941-10-15 00:00:00 (Wed)
  -14400,
  0,
  '-04',
      ],
      [
  61245345600, #    utc_start 1941-10-15 04:00:00 (Wed)
  61301934000, #      utc_end 1943-08-01 03:00:00 (Sun)
  61245334800, #  local_start 1941-10-15 01:00:00 (Wed)
  61301923200, #    local_end 1943-08-01 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61301934000, #    utc_start 1943-08-01 03:00:00 (Sun)
  61308417600, #      utc_end 1943-10-15 04:00:00 (Fri)
  61301919600, #  local_start 1943-07-31 23:00:00 (Sat)
  61308403200, #    local_end 1943-10-15 00:00:00 (Fri)
  -14400,
  0,
  '-04',
      ],
      [
  61308417600, #    utc_start 1943-10-15 04:00:00 (Fri)
  61383409200, #      utc_end 1946-03-01 03:00:00 (Fri)
  61308406800, #  local_start 1943-10-15 01:00:00 (Fri)
  61383398400, #    local_end 1946-03-01 00:00:00 (Fri)
  -10800,
  1,
  '-03',
      ],
      [
  61383409200, #    utc_start 1946-03-01 03:00:00 (Fri)
  61401902400, #      utc_end 1946-10-01 04:00:00 (Tue)
  61383394800, #  local_start 1946-02-28 23:00:00 (Thu)
  61401888000, #    local_end 1946-10-01 00:00:00 (Tue)
  -14400,
  0,
  '-04',
      ],
      [
  61401902400, #    utc_start 1946-10-01 04:00:00 (Tue)
  61938356400, #      utc_end 1963-10-01 03:00:00 (Tue)
  61401891600, #  local_start 1946-10-01 01:00:00 (Tue)
  61938345600, #    local_end 1963-10-01 00:00:00 (Tue)
  -10800,
  1,
  '-03',
      ],
      [
  61938356400, #    utc_start 1963-10-01 03:00:00 (Tue)
  61944840000, #      utc_end 1963-12-15 04:00:00 (Sun)
  61938342000, #  local_start 1963-09-30 23:00:00 (Mon)
  61944825600, #    local_end 1963-12-15 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  61944840000, #    utc_start 1963-12-15 04:00:00 (Sun)
  61951489200, #      utc_end 1964-03-01 03:00:00 (Sun)
  61944829200, #  local_start 1963-12-15 01:00:00 (Sun)
  61951478400, #    local_end 1964-03-01 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61951489200, #    utc_start 1964-03-01 03:00:00 (Sun)
  61971192000, #      utc_end 1964-10-15 04:00:00 (Thu)
  61951474800, #  local_start 1964-02-29 23:00:00 (Sat)
  61971177600, #    local_end 1964-10-15 00:00:00 (Thu)
  -14400,
  0,
  '-04',
      ],
      [
  61971192000, #    utc_start 1964-10-15 04:00:00 (Thu)
  61983025200, #      utc_end 1965-03-01 03:00:00 (Mon)
  61971181200, #  local_start 1964-10-15 01:00:00 (Thu)
  61983014400, #    local_end 1965-03-01 00:00:00 (Mon)
  -10800,
  1,
  '-03',
      ],
      [
  61983025200, #    utc_start 1965-03-01 03:00:00 (Mon)
  62002728000, #      utc_end 1965-10-15 04:00:00 (Fri)
  61983010800, #  local_start 1965-02-28 23:00:00 (Sun)
  62002713600, #    local_end 1965-10-15 00:00:00 (Fri)
  -14400,
  0,
  '-04',
      ],
      [
  62002728000, #    utc_start 1965-10-15 04:00:00 (Fri)
  62014561200, #      utc_end 1966-03-01 03:00:00 (Tue)
  62002717200, #  local_start 1965-10-15 01:00:00 (Fri)
  62014550400, #    local_end 1966-03-01 00:00:00 (Tue)
  -10800,
  1,
  '-03',
      ],
      [
  62014561200, #    utc_start 1966-03-01 03:00:00 (Tue)
  62034264000, #      utc_end 1966-10-15 04:00:00 (Sat)
  62014546800, #  local_start 1966-02-28 23:00:00 (Mon)
  62034249600, #    local_end 1966-10-15 00:00:00 (Sat)
  -14400,
  0,
  '-04',
      ],
      [
  62034264000, #    utc_start 1966-10-15 04:00:00 (Sat)
  62048862000, #      utc_end 1967-04-02 03:00:00 (Sun)
  62034253200, #  local_start 1966-10-15 01:00:00 (Sat)
  62048851200, #    local_end 1967-04-02 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62048862000, #    utc_start 1967-04-02 03:00:00 (Sun)
  62064590400, #      utc_end 1967-10-01 04:00:00 (Sun)
  62048847600, #  local_start 1967-04-01 23:00:00 (Sat)
  62064576000, #    local_end 1967-10-01 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62064590400, #    utc_start 1967-10-01 04:00:00 (Sun)
  62080916400, #      utc_end 1968-04-07 03:00:00 (Sun)
  62064579600, #  local_start 1967-10-01 01:00:00 (Sun)
  62080905600, #    local_end 1968-04-07 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62080916400, #    utc_start 1968-04-07 03:00:00 (Sun)
  62096644800, #      utc_end 1968-10-06 04:00:00 (Sun)
  62080902000, #  local_start 1968-04-06 23:00:00 (Sat)
  62096630400, #    local_end 1968-10-06 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62096644800, #    utc_start 1968-10-06 04:00:00 (Sun)
  62112366000, #      utc_end 1969-04-06 03:00:00 (Sun)
  62096634000, #  local_start 1968-10-06 01:00:00 (Sun)
  62112355200, #    local_end 1969-04-06 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62112366000, #    utc_start 1969-04-06 03:00:00 (Sun)
  62128094400, #      utc_end 1969-10-05 04:00:00 (Sun)
  62112351600, #  local_start 1969-04-05 23:00:00 (Sat)
  62128080000, #    local_end 1969-10-05 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62128094400, #    utc_start 1969-10-05 04:00:00 (Sun)
  62263825200, #      utc_end 1974-01-23 03:00:00 (Wed)
  62128083600, #  local_start 1969-10-05 01:00:00 (Sun)
  62263814400, #    local_end 1974-01-23 00:00:00 (Wed)
  -10800,
  0,
  '-03',
      ],
      [
  62263825200, #    utc_start 1974-01-23 03:00:00 (Wed)
  62272288800, #      utc_end 1974-05-01 02:00:00 (Wed)
  62263818000, #  local_start 1974-01-23 01:00:00 (Wed)
  62272281600, #    local_end 1974-05-01 00:00:00 (Wed)
  -7200,
  1,
  '-02',
      ],
      [
  62272288800, #    utc_start 1974-05-01 02:00:00 (Wed)
  62732631600, #      utc_end 1988-12-01 03:00:00 (Thu)
  62272278000, #  local_start 1974-04-30 23:00:00 (Tue)
  62732620800, #    local_end 1988-12-01 00:00:00 (Thu)
  -10800,
  0,
  '-03',
      ],
      [
  62732631600, #    utc_start 1988-12-01 03:00:00 (Thu)
  62740749600, #      utc_end 1989-03-05 02:00:00 (Sun)
  62732624400, #  local_start 1988-12-01 01:00:00 (Thu)
  62740742400, #    local_end 1989-03-05 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62740749600, #    utc_start 1989-03-05 02:00:00 (Sun)
  62760106800, #      utc_end 1989-10-15 03:00:00 (Sun)
  62740738800, #  local_start 1989-03-04 23:00:00 (Sat)
  62760096000, #    local_end 1989-10-15 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62760106800, #    utc_start 1989-10-15 03:00:00 (Sun)
  62772199200, #      utc_end 1990-03-04 02:00:00 (Sun)
  62760099600, #  local_start 1989-10-15 01:00:00 (Sun)
  62772192000, #    local_end 1990-03-04 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62772199200, #    utc_start 1990-03-04 02:00:00 (Sun)
  62792161200, #      utc_end 1990-10-21 03:00:00 (Sun)
  62772188400, #  local_start 1990-03-03 23:00:00 (Sat)
  62792150400, #    local_end 1990-10-21 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62792161200, #    utc_start 1990-10-21 03:00:00 (Sun)
  62803476000, #      utc_end 1991-03-01 02:00:00 (Fri)
  62792154000, #  local_start 1990-10-21 01:00:00 (Sun)
  62803468800, #    local_end 1991-03-01 00:00:00 (Fri)
  -7200,
  1,
  '-02',
      ],
      [
  62803476000, #    utc_start 1991-03-01 02:00:00 (Fri)
  62809272000, #      utc_end 1991-05-07 04:00:00 (Tue)
  62803461600, #  local_start 1991-02-28 22:00:00 (Thu)
  62809257600, #    local_end 1991-05-07 00:00:00 (Tue)
  -14400,
  0,
  '-04',
      ],
      [
  62809272000, #    utc_start 1991-05-07 04:00:00 (Tue)
  62823610800, #      utc_end 1991-10-20 03:00:00 (Sun)
  62809261200, #  local_start 1991-05-07 01:00:00 (Tue)
  62823600000, #    local_end 1991-10-20 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62823610800, #    utc_start 1991-10-20 03:00:00 (Sun)
  62835098400, #      utc_end 1992-03-01 02:00:00 (Sun)
  62823603600, #  local_start 1991-10-20 01:00:00 (Sun)
  62835091200, #    local_end 1992-03-01 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62835098400, #    utc_start 1992-03-01 02:00:00 (Sun)
  62855060400, #      utc_end 1992-10-18 03:00:00 (Sun)
  62835087600, #  local_start 1992-02-29 23:00:00 (Sat)
  62855049600, #    local_end 1992-10-18 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62855060400, #    utc_start 1992-10-18 03:00:00 (Sun)
  62867152800, #      utc_end 1993-03-07 02:00:00 (Sun)
  62855053200, #  local_start 1992-10-18 01:00:00 (Sun)
  62867145600, #    local_end 1993-03-07 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62867152800, #    utc_start 1993-03-07 02:00:00 (Sun)
  63074602800, #      utc_end 1999-10-03 03:00:00 (Sun)
  62867142000, #  local_start 1993-03-06 23:00:00 (Sat)
  63074592000, #    local_end 1999-10-03 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63074602800, #    utc_start 1999-10-03 03:00:00 (Sun)
  63087735600, #      utc_end 2000-03-03 03:00:00 (Fri)
  63074592000, #  local_start 1999-10-03 00:00:00 (Sun)
  63087724800, #    local_end 2000-03-03 00:00:00 (Fri)
  -10800,
  1,
  '-03',
      ],
      [
  63087735600, #    utc_start 2000-03-03 03:00:00 (Fri)
  63221742000, #      utc_end 2004-06-01 03:00:00 (Tue)
  63087724800, #  local_start 2000-03-03 00:00:00 (Fri)
  63221731200, #    local_end 2004-06-01 00:00:00 (Tue)
  -10800,
  0,
  '-03',
      ],
      [
  63221742000, #    utc_start 2004-06-01 03:00:00 (Tue)
  63223387200, #      utc_end 2004-06-20 04:00:00 (Sun)
  63221727600, #  local_start 2004-05-31 23:00:00 (Mon)
  63223372800, #    local_end 2004-06-20 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63223387200, #    utc_start 2004-06-20 04:00:00 (Sun)
  63334666800, #      utc_end 2007-12-30 03:00:00 (Sun)
  63223376400, #  local_start 2004-06-20 01:00:00 (Sun)
  63334656000, #    local_end 2007-12-30 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63334666800, #    utc_start 2007-12-30 03:00:00 (Sun)
  63341316000, #      utc_end 2008-03-16 02:00:00 (Sun)
  63334659600, #  local_start 2007-12-30 01:00:00 (Sun)
  63341308800, #    local_end 2008-03-16 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63341316000, #    utc_start 2008-03-16 02:00:00 (Sun)
  63359982000, #      utc_end 2008-10-18 03:00:00 (Sat)
  63341305200, #  local_start 2008-03-15 23:00:00 (Sat)
  63359971200, #    local_end 2008-10-18 00:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  63359982000, #    utc_start 2008-10-18 03:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  63359971200, #  local_start 2008-10-18 00:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #    local_end
  -10800,
  0,
  '-03',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {28}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_ARGENTINA_LA_RIOJA

    $main::fatpacked{"DateTime/TimeZone/America/Argentina/Mendoza.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_ARGENTINA_MENDOZA';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/southamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Argentina::Mendoza;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Argentina::Mendoza::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59763587716, #      utc_end 1894-10-31 04:35:16 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59763571200, #    local_end 1894-10-31 00:00:00 (Wed)
  -16516,
  0,
  'LMT',
      ],
      [
  59763587716, #    utc_start 1894-10-31 04:35:16 (Wed)
  60568229808, #      utc_end 1920-05-01 04:16:48 (Sat)
  59763572308, #  local_start 1894-10-31 00:18:28 (Wed)
  60568214400, #    local_end 1920-05-01 00:00:00 (Sat)
  -15408,
  0,
  'CMT',
      ],
      [
  60568229808, #    utc_start 1920-05-01 04:16:48 (Sat)
  60902251200, #      utc_end 1930-12-01 04:00:00 (Mon)
  60568215408, #  local_start 1920-05-01 00:16:48 (Sat)
  60902236800, #    local_end 1930-12-01 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  60902251200, #    utc_start 1930-12-01 04:00:00 (Mon)
  60912702000, #      utc_end 1931-04-01 03:00:00 (Wed)
  60902240400, #  local_start 1930-12-01 01:00:00 (Mon)
  60912691200, #    local_end 1931-04-01 00:00:00 (Wed)
  -10800,
  1,
  '-03',
      ],
      [
  60912702000, #    utc_start 1931-04-01 03:00:00 (Wed)
  60929726400, #      utc_end 1931-10-15 04:00:00 (Thu)
  60912687600, #  local_start 1931-03-31 23:00:00 (Tue)
  60929712000, #    local_end 1931-10-15 00:00:00 (Thu)
  -14400,
  0,
  '-04',
      ],
      [
  60929726400, #    utc_start 1931-10-15 04:00:00 (Thu)
  60941646000, #      utc_end 1932-03-01 03:00:00 (Tue)
  60929715600, #  local_start 1931-10-15 01:00:00 (Thu)
  60941635200, #    local_end 1932-03-01 00:00:00 (Tue)
  -10800,
  1,
  '-03',
      ],
      [
  60941646000, #    utc_start 1932-03-01 03:00:00 (Tue)
  60962817600, #      utc_end 1932-11-01 04:00:00 (Tue)
  60941631600, #  local_start 1932-02-29 23:00:00 (Mon)
  60962803200, #    local_end 1932-11-01 00:00:00 (Tue)
  -14400,
  0,
  '-04',
      ],
      [
  60962817600, #    utc_start 1932-11-01 04:00:00 (Tue)
  60973182000, #      utc_end 1933-03-01 03:00:00 (Wed)
  60962806800, #  local_start 1932-11-01 01:00:00 (Tue)
  60973171200, #    local_end 1933-03-01 00:00:00 (Wed)
  -10800,
  1,
  '-03',
      ],
      [
  60973182000, #    utc_start 1933-03-01 03:00:00 (Wed)
  60994353600, #      utc_end 1933-11-01 04:00:00 (Wed)
  60973167600, #  local_start 1933-02-28 23:00:00 (Tue)
  60994339200, #    local_end 1933-11-01 00:00:00 (Wed)
  -14400,
  0,
  '-04',
      ],
      [
  60994353600, #    utc_start 1933-11-01 04:00:00 (Wed)
  61004718000, #      utc_end 1934-03-01 03:00:00 (Thu)
  60994342800, #  local_start 1933-11-01 01:00:00 (Wed)
  61004707200, #    local_end 1934-03-01 00:00:00 (Thu)
  -10800,
  1,
  '-03',
      ],
      [
  61004718000, #    utc_start 1934-03-01 03:00:00 (Thu)
  61025889600, #      utc_end 1934-11-01 04:00:00 (Thu)
  61004703600, #  local_start 1934-02-28 23:00:00 (Wed)
  61025875200, #    local_end 1934-11-01 00:00:00 (Thu)
  -14400,
  0,
  '-04',
      ],
      [
  61025889600, #    utc_start 1934-11-01 04:00:00 (Thu)
  61036254000, #      utc_end 1935-03-01 03:00:00 (Fri)
  61025878800, #  local_start 1934-11-01 01:00:00 (Thu)
  61036243200, #    local_end 1935-03-01 00:00:00 (Fri)
  -10800,
  1,
  '-03',
      ],
      [
  61036254000, #    utc_start 1935-03-01 03:00:00 (Fri)
  61057425600, #      utc_end 1935-11-01 04:00:00 (Fri)
  61036239600, #  local_start 1935-02-28 23:00:00 (Thu)
  61057411200, #    local_end 1935-11-01 00:00:00 (Fri)
  -14400,
  0,
  '-04',
      ],
      [
  61057425600, #    utc_start 1935-11-01 04:00:00 (Fri)
  61067876400, #      utc_end 1936-03-01 03:00:00 (Sun)
  61057414800, #  local_start 1935-11-01 01:00:00 (Fri)
  61067865600, #    local_end 1936-03-01 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61067876400, #    utc_start 1936-03-01 03:00:00 (Sun)
  61089048000, #      utc_end 1936-11-01 04:00:00 (Sun)
  61067862000, #  local_start 1936-02-29 23:00:00 (Sat)
  61089033600, #    local_end 1936-11-01 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  61089048000, #    utc_start 1936-11-01 04:00:00 (Sun)
  61099412400, #      utc_end 1937-03-01 03:00:00 (Mon)
  61089037200, #  local_start 1936-11-01 01:00:00 (Sun)
  61099401600, #    local_end 1937-03-01 00:00:00 (Mon)
  -10800,
  1,
  '-03',
      ],
      [
  61099412400, #    utc_start 1937-03-01 03:00:00 (Mon)
  61120584000, #      utc_end 1937-11-01 04:00:00 (Mon)
  61099398000, #  local_start 1937-02-28 23:00:00 (Sun)
  61120569600, #    local_end 1937-11-01 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  61120584000, #    utc_start 1937-11-01 04:00:00 (Mon)
  61130948400, #      utc_end 1938-03-01 03:00:00 (Tue)
  61120573200, #  local_start 1937-11-01 01:00:00 (Mon)
  61130937600, #    local_end 1938-03-01 00:00:00 (Tue)
  -10800,
  1,
  '-03',
      ],
      [
  61130948400, #    utc_start 1938-03-01 03:00:00 (Tue)
  61152120000, #      utc_end 1938-11-01 04:00:00 (Tue)
  61130934000, #  local_start 1938-02-28 23:00:00 (Mon)
  61152105600, #    local_end 1938-11-01 00:00:00 (Tue)
  -14400,
  0,
  '-04',
      ],
      [
  61152120000, #    utc_start 1938-11-01 04:00:00 (Tue)
  61162484400, #      utc_end 1939-03-01 03:00:00 (Wed)
  61152109200, #  local_start 1938-11-01 01:00:00 (Tue)
  61162473600, #    local_end 1939-03-01 00:00:00 (Wed)
  -10800,
  1,
  '-03',
      ],
      [
  61162484400, #    utc_start 1939-03-01 03:00:00 (Wed)
  61183656000, #      utc_end 1939-11-01 04:00:00 (Wed)
  61162470000, #  local_start 1939-02-28 23:00:00 (Tue)
  61183641600, #    local_end 1939-11-01 00:00:00 (Wed)
  -14400,
  0,
  '-04',
      ],
      [
  61183656000, #    utc_start 1939-11-01 04:00:00 (Wed)
  61194106800, #      utc_end 1940-03-01 03:00:00 (Fri)
  61183645200, #  local_start 1939-11-01 01:00:00 (Wed)
  61194096000, #    local_end 1940-03-01 00:00:00 (Fri)
  -10800,
  1,
  '-03',
      ],
      [
  61194106800, #    utc_start 1940-03-01 03:00:00 (Fri)
  61204651200, #      utc_end 1940-07-01 04:00:00 (Mon)
  61194092400, #  local_start 1940-02-29 23:00:00 (Thu)
  61204636800, #    local_end 1940-07-01 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  61204651200, #    utc_start 1940-07-01 04:00:00 (Mon)
  61234801200, #      utc_end 1941-06-15 03:00:00 (Sun)
  61204640400, #  local_start 1940-07-01 01:00:00 (Mon)
  61234790400, #    local_end 1941-06-15 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61234801200, #    utc_start 1941-06-15 03:00:00 (Sun)
  61245345600, #      utc_end 1941-10-15 04:00:00 (Wed)
  61234786800, #  local_start 1941-06-14 23:00:00 (Sat)
  61245331200, #    local_end 1941-10-15 00:00:00 (Wed)
  -14400,
  0,
  '-04',
      ],
      [
  61245345600, #    utc_start 1941-10-15 04:00:00 (Wed)
  61301934000, #      utc_end 1943-08-01 03:00:00 (Sun)
  61245334800, #  local_start 1941-10-15 01:00:00 (Wed)
  61301923200, #    local_end 1943-08-01 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61301934000, #    utc_start 1943-08-01 03:00:00 (Sun)
  61308417600, #      utc_end 1943-10-15 04:00:00 (Fri)
  61301919600, #  local_start 1943-07-31 23:00:00 (Sat)
  61308403200, #    local_end 1943-10-15 00:00:00 (Fri)
  -14400,
  0,
  '-04',
      ],
      [
  61308417600, #    utc_start 1943-10-15 04:00:00 (Fri)
  61383409200, #      utc_end 1946-03-01 03:00:00 (Fri)
  61308406800, #  local_start 1943-10-15 01:00:00 (Fri)
  61383398400, #    local_end 1946-03-01 00:00:00 (Fri)
  -10800,
  1,
  '-03',
      ],
      [
  61383409200, #    utc_start 1946-03-01 03:00:00 (Fri)
  61401902400, #      utc_end 1946-10-01 04:00:00 (Tue)
  61383394800, #  local_start 1946-02-28 23:00:00 (Thu)
  61401888000, #    local_end 1946-10-01 00:00:00 (Tue)
  -14400,
  0,
  '-04',
      ],
      [
  61401902400, #    utc_start 1946-10-01 04:00:00 (Tue)
  61938356400, #      utc_end 1963-10-01 03:00:00 (Tue)
  61401891600, #  local_start 1946-10-01 01:00:00 (Tue)
  61938345600, #    local_end 1963-10-01 00:00:00 (Tue)
  -10800,
  1,
  '-03',
      ],
      [
  61938356400, #    utc_start 1963-10-01 03:00:00 (Tue)
  61944840000, #      utc_end 1963-12-15 04:00:00 (Sun)
  61938342000, #  local_start 1963-09-30 23:00:00 (Mon)
  61944825600, #    local_end 1963-12-15 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  61944840000, #    utc_start 1963-12-15 04:00:00 (Sun)
  61951489200, #      utc_end 1964-03-01 03:00:00 (Sun)
  61944829200, #  local_start 1963-12-15 01:00:00 (Sun)
  61951478400, #    local_end 1964-03-01 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61951489200, #    utc_start 1964-03-01 03:00:00 (Sun)
  61971192000, #      utc_end 1964-10-15 04:00:00 (Thu)
  61951474800, #  local_start 1964-02-29 23:00:00 (Sat)
  61971177600, #    local_end 1964-10-15 00:00:00 (Thu)
  -14400,
  0,
  '-04',
      ],
      [
  61971192000, #    utc_start 1964-10-15 04:00:00 (Thu)
  61983025200, #      utc_end 1965-03-01 03:00:00 (Mon)
  61971181200, #  local_start 1964-10-15 01:00:00 (Thu)
  61983014400, #    local_end 1965-03-01 00:00:00 (Mon)
  -10800,
  1,
  '-03',
      ],
      [
  61983025200, #    utc_start 1965-03-01 03:00:00 (Mon)
  62002728000, #      utc_end 1965-10-15 04:00:00 (Fri)
  61983010800, #  local_start 1965-02-28 23:00:00 (Sun)
  62002713600, #    local_end 1965-10-15 00:00:00 (Fri)
  -14400,
  0,
  '-04',
      ],
      [
  62002728000, #    utc_start 1965-10-15 04:00:00 (Fri)
  62014561200, #      utc_end 1966-03-01 03:00:00 (Tue)
  62002717200, #  local_start 1965-10-15 01:00:00 (Fri)
  62014550400, #    local_end 1966-03-01 00:00:00 (Tue)
  -10800,
  1,
  '-03',
      ],
      [
  62014561200, #    utc_start 1966-03-01 03:00:00 (Tue)
  62034264000, #      utc_end 1966-10-15 04:00:00 (Sat)
  62014546800, #  local_start 1966-02-28 23:00:00 (Mon)
  62034249600, #    local_end 1966-10-15 00:00:00 (Sat)
  -14400,
  0,
  '-04',
      ],
      [
  62034264000, #    utc_start 1966-10-15 04:00:00 (Sat)
  62048862000, #      utc_end 1967-04-02 03:00:00 (Sun)
  62034253200, #  local_start 1966-10-15 01:00:00 (Sat)
  62048851200, #    local_end 1967-04-02 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62048862000, #    utc_start 1967-04-02 03:00:00 (Sun)
  62064590400, #      utc_end 1967-10-01 04:00:00 (Sun)
  62048847600, #  local_start 1967-04-01 23:00:00 (Sat)
  62064576000, #    local_end 1967-10-01 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62064590400, #    utc_start 1967-10-01 04:00:00 (Sun)
  62080916400, #      utc_end 1968-04-07 03:00:00 (Sun)
  62064579600, #  local_start 1967-10-01 01:00:00 (Sun)
  62080905600, #    local_end 1968-04-07 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62080916400, #    utc_start 1968-04-07 03:00:00 (Sun)
  62096644800, #      utc_end 1968-10-06 04:00:00 (Sun)
  62080902000, #  local_start 1968-04-06 23:00:00 (Sat)
  62096630400, #    local_end 1968-10-06 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62096644800, #    utc_start 1968-10-06 04:00:00 (Sun)
  62112366000, #      utc_end 1969-04-06 03:00:00 (Sun)
  62096634000, #  local_start 1968-10-06 01:00:00 (Sun)
  62112355200, #    local_end 1969-04-06 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62112366000, #    utc_start 1969-04-06 03:00:00 (Sun)
  62128094400, #      utc_end 1969-10-05 04:00:00 (Sun)
  62112351600, #  local_start 1969-04-05 23:00:00 (Sat)
  62128080000, #    local_end 1969-10-05 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62128094400, #    utc_start 1969-10-05 04:00:00 (Sun)
  62263825200, #      utc_end 1974-01-23 03:00:00 (Wed)
  62128083600, #  local_start 1969-10-05 01:00:00 (Sun)
  62263814400, #    local_end 1974-01-23 00:00:00 (Wed)
  -10800,
  0,
  '-03',
      ],
      [
  62263825200, #    utc_start 1974-01-23 03:00:00 (Wed)
  62272288800, #      utc_end 1974-05-01 02:00:00 (Wed)
  62263818000, #  local_start 1974-01-23 01:00:00 (Wed)
  62272281600, #    local_end 1974-05-01 00:00:00 (Wed)
  -7200,
  1,
  '-02',
      ],
      [
  62272288800, #    utc_start 1974-05-01 02:00:00 (Wed)
  62732631600, #      utc_end 1988-12-01 03:00:00 (Thu)
  62272278000, #  local_start 1974-04-30 23:00:00 (Tue)
  62732620800, #    local_end 1988-12-01 00:00:00 (Thu)
  -10800,
  0,
  '-03',
      ],
      [
  62732631600, #    utc_start 1988-12-01 03:00:00 (Thu)
  62740749600, #      utc_end 1989-03-05 02:00:00 (Sun)
  62732624400, #  local_start 1988-12-01 01:00:00 (Thu)
  62740742400, #    local_end 1989-03-05 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62740749600, #    utc_start 1989-03-05 02:00:00 (Sun)
  62760106800, #      utc_end 1989-10-15 03:00:00 (Sun)
  62740738800, #  local_start 1989-03-04 23:00:00 (Sat)
  62760096000, #    local_end 1989-10-15 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62760106800, #    utc_start 1989-10-15 03:00:00 (Sun)
  62772199200, #      utc_end 1990-03-04 02:00:00 (Sun)
  62760099600, #  local_start 1989-10-15 01:00:00 (Sun)
  62772192000, #    local_end 1990-03-04 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62772199200, #    utc_start 1990-03-04 02:00:00 (Sun)
  62791646400, #      utc_end 1990-10-15 04:00:00 (Mon)
  62772184800, #  local_start 1990-03-03 22:00:00 (Sat)
  62791632000, #    local_end 1990-10-15 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  62791646400, #    utc_start 1990-10-15 04:00:00 (Mon)
  62803479600, #      utc_end 1991-03-01 03:00:00 (Fri)
  62791635600, #  local_start 1990-10-15 01:00:00 (Mon)
  62803468800, #    local_end 1991-03-01 00:00:00 (Fri)
  -10800,
  1,
  '-03',
      ],
      [
  62803479600, #    utc_start 1991-03-01 03:00:00 (Fri)
  62823182400, #      utc_end 1991-10-15 04:00:00 (Tue)
  62803465200, #  local_start 1991-02-28 23:00:00 (Thu)
  62823168000, #    local_end 1991-10-15 00:00:00 (Tue)
  -14400,
  0,
  '-04',
      ],
      [
  62823182400, #    utc_start 1991-10-15 04:00:00 (Tue)
  62835102000, #      utc_end 1992-03-01 03:00:00 (Sun)
  62823171600, #  local_start 1991-10-15 01:00:00 (Tue)
  62835091200, #    local_end 1992-03-01 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62835102000, #    utc_start 1992-03-01 03:00:00 (Sun)
  62855064000, #      utc_end 1992-10-18 04:00:00 (Sun)
  62835087600, #  local_start 1992-02-29 23:00:00 (Sat)
  62855049600, #    local_end 1992-10-18 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62855064000, #    utc_start 1992-10-18 04:00:00 (Sun)
  62867152800, #      utc_end 1993-03-07 02:00:00 (Sun)
  62855056800, #  local_start 1992-10-18 02:00:00 (Sun)
  62867145600, #    local_end 1993-03-07 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62867152800, #    utc_start 1993-03-07 02:00:00 (Sun)
  63074602800, #      utc_end 1999-10-03 03:00:00 (Sun)
  62867142000, #  local_start 1993-03-06 23:00:00 (Sat)
  63074592000, #    local_end 1999-10-03 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63074602800, #    utc_start 1999-10-03 03:00:00 (Sun)
  63087735600, #      utc_end 2000-03-03 03:00:00 (Fri)
  63074592000, #  local_start 1999-10-03 00:00:00 (Sun)
  63087724800, #    local_end 2000-03-03 00:00:00 (Fri)
  -10800,
  1,
  '-03',
      ],
      [
  63087735600, #    utc_start 2000-03-03 03:00:00 (Fri)
  63220964400, #      utc_end 2004-05-23 03:00:00 (Sun)
  63087724800, #  local_start 2000-03-03 00:00:00 (Fri)
  63220953600, #    local_end 2004-05-23 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63220964400, #    utc_start 2004-05-23 03:00:00 (Sun)
  63231854400, #      utc_end 2004-09-26 04:00:00 (Sun)
  63220950000, #  local_start 2004-05-22 23:00:00 (Sat)
  63231840000, #    local_end 2004-09-26 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63231854400, #    utc_start 2004-09-26 04:00:00 (Sun)
  63334666800, #      utc_end 2007-12-30 03:00:00 (Sun)
  63231843600, #  local_start 2004-09-26 01:00:00 (Sun)
  63334656000, #    local_end 2007-12-30 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63334666800, #    utc_start 2007-12-30 03:00:00 (Sun)
  63341316000, #      utc_end 2008-03-16 02:00:00 (Sun)
  63334659600, #  local_start 2007-12-30 01:00:00 (Sun)
  63341308800, #    local_end 2008-03-16 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63341316000, #    utc_start 2008-03-16 02:00:00 (Sun)
  63359982000, #      utc_end 2008-10-18 03:00:00 (Sat)
  63341305200, #  local_start 2008-03-15 23:00:00 (Sat)
  63359971200, #    local_end 2008-10-18 00:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  63359982000, #    utc_start 2008-10-18 03:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  63359971200, #  local_start 2008-10-18 00:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #    local_end
  -10800,
  0,
  '-03',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {28}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_ARGENTINA_MENDOZA

    $main::fatpacked{"DateTime/TimeZone/America/Argentina/Rio_Gallegos.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_ARGENTINA_RIO_GALLEGOS';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/southamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Argentina::Rio_Gallegos;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Argentina::Rio_Gallegos::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59763587812, #      utc_end 1894-10-31 04:36:52 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59763571200, #    local_end 1894-10-31 00:00:00 (Wed)
  -16612,
  0,
  'LMT',
      ],
      [
  59763587812, #    utc_start 1894-10-31 04:36:52 (Wed)
  60568229808, #      utc_end 1920-05-01 04:16:48 (Sat)
  59763572404, #  local_start 1894-10-31 00:20:04 (Wed)
  60568214400, #    local_end 1920-05-01 00:00:00 (Sat)
  -15408,
  0,
  'CMT',
      ],
      [
  60568229808, #    utc_start 1920-05-01 04:16:48 (Sat)
  60902251200, #      utc_end 1930-12-01 04:00:00 (Mon)
  60568215408, #  local_start 1920-05-01 00:16:48 (Sat)
  60902236800, #    local_end 1930-12-01 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  60902251200, #    utc_start 1930-12-01 04:00:00 (Mon)
  60912702000, #      utc_end 1931-04-01 03:00:00 (Wed)
  60902240400, #  local_start 1930-12-01 01:00:00 (Mon)
  60912691200, #    local_end 1931-04-01 00:00:00 (Wed)
  -10800,
  1,
  '-03',
      ],
      [
  60912702000, #    utc_start 1931-04-01 03:00:00 (Wed)
  60929726400, #      utc_end 1931-10-15 04:00:00 (Thu)
  60912687600, #  local_start 1931-03-31 23:00:00 (Tue)
  60929712000, #    local_end 1931-10-15 00:00:00 (Thu)
  -14400,
  0,
  '-04',
      ],
      [
  60929726400, #    utc_start 1931-10-15 04:00:00 (Thu)
  60941646000, #      utc_end 1932-03-01 03:00:00 (Tue)
  60929715600, #  local_start 1931-10-15 01:00:00 (Thu)
  60941635200, #    local_end 1932-03-01 00:00:00 (Tue)
  -10800,
  1,
  '-03',
      ],
      [
  60941646000, #    utc_start 1932-03-01 03:00:00 (Tue)
  60962817600, #      utc_end 1932-11-01 04:00:00 (Tue)
  60941631600, #  local_start 1932-02-29 23:00:00 (Mon)
  60962803200, #    local_end 1932-11-01 00:00:00 (Tue)
  -14400,
  0,
  '-04',
      ],
      [
  60962817600, #    utc_start 1932-11-01 04:00:00 (Tue)
  60973182000, #      utc_end 1933-03-01 03:00:00 (Wed)
  60962806800, #  local_start 1932-11-01 01:00:00 (Tue)
  60973171200, #    local_end 1933-03-01 00:00:00 (Wed)
  -10800,
  1,
  '-03',
      ],
      [
  60973182000, #    utc_start 1933-03-01 03:00:00 (Wed)
  60994353600, #      utc_end 1933-11-01 04:00:00 (Wed)
  60973167600, #  local_start 1933-02-28 23:00:00 (Tue)
  60994339200, #    local_end 1933-11-01 00:00:00 (Wed)
  -14400,
  0,
  '-04',
      ],
      [
  60994353600, #    utc_start 1933-11-01 04:00:00 (Wed)
  61004718000, #      utc_end 1934-03-01 03:00:00 (Thu)
  60994342800, #  local_start 1933-11-01 01:00:00 (Wed)
  61004707200, #    local_end 1934-03-01 00:00:00 (Thu)
  -10800,
  1,
  '-03',
      ],
      [
  61004718000, #    utc_start 1934-03-01 03:00:00 (Thu)
  61025889600, #      utc_end 1934-11-01 04:00:00 (Thu)
  61004703600, #  local_start 1934-02-28 23:00:00 (Wed)
  61025875200, #    local_end 1934-11-01 00:00:00 (Thu)
  -14400,
  0,
  '-04',
      ],
      [
  61025889600, #    utc_start 1934-11-01 04:00:00 (Thu)
  61036254000, #      utc_end 1935-03-01 03:00:00 (Fri)
  61025878800, #  local_start 1934-11-01 01:00:00 (Thu)
  61036243200, #    local_end 1935-03-01 00:00:00 (Fri)
  -10800,
  1,
  '-03',
      ],
      [
  61036254000, #    utc_start 1935-03-01 03:00:00 (Fri)
  61057425600, #      utc_end 1935-11-01 04:00:00 (Fri)
  61036239600, #  local_start 1935-02-28 23:00:00 (Thu)
  61057411200, #    local_end 1935-11-01 00:00:00 (Fri)
  -14400,
  0,
  '-04',
      ],
      [
  61057425600, #    utc_start 1935-11-01 04:00:00 (Fri)
  61067876400, #      utc_end 1936-03-01 03:00:00 (Sun)
  61057414800, #  local_start 1935-11-01 01:00:00 (Fri)
  61067865600, #    local_end 1936-03-01 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61067876400, #    utc_start 1936-03-01 03:00:00 (Sun)
  61089048000, #      utc_end 1936-11-01 04:00:00 (Sun)
  61067862000, #  local_start 1936-02-29 23:00:00 (Sat)
  61089033600, #    local_end 1936-11-01 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  61089048000, #    utc_start 1936-11-01 04:00:00 (Sun)
  61099412400, #      utc_end 1937-03-01 03:00:00 (Mon)
  61089037200, #  local_start 1936-11-01 01:00:00 (Sun)
  61099401600, #    local_end 1937-03-01 00:00:00 (Mon)
  -10800,
  1,
  '-03',
      ],
      [
  61099412400, #    utc_start 1937-03-01 03:00:00 (Mon)
  61120584000, #      utc_end 1937-11-01 04:00:00 (Mon)
  61099398000, #  local_start 1937-02-28 23:00:00 (Sun)
  61120569600, #    local_end 1937-11-01 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  61120584000, #    utc_start 1937-11-01 04:00:00 (Mon)
  61130948400, #      utc_end 1938-03-01 03:00:00 (Tue)
  61120573200, #  local_start 1937-11-01 01:00:00 (Mon)
  61130937600, #    local_end 1938-03-01 00:00:00 (Tue)
  -10800,
  1,
  '-03',
      ],
      [
  61130948400, #    utc_start 1938-03-01 03:00:00 (Tue)
  61152120000, #      utc_end 1938-11-01 04:00:00 (Tue)
  61130934000, #  local_start 1938-02-28 23:00:00 (Mon)
  61152105600, #    local_end 1938-11-01 00:00:00 (Tue)
  -14400,
  0,
  '-04',
      ],
      [
  61152120000, #    utc_start 1938-11-01 04:00:00 (Tue)
  61162484400, #      utc_end 1939-03-01 03:00:00 (Wed)
  61152109200, #  local_start 1938-11-01 01:00:00 (Tue)
  61162473600, #    local_end 1939-03-01 00:00:00 (Wed)
  -10800,
  1,
  '-03',
      ],
      [
  61162484400, #    utc_start 1939-03-01 03:00:00 (Wed)
  61183656000, #      utc_end 1939-11-01 04:00:00 (Wed)
  61162470000, #  local_start 1939-02-28 23:00:00 (Tue)
  61183641600, #    local_end 1939-11-01 00:00:00 (Wed)
  -14400,
  0,
  '-04',
      ],
      [
  61183656000, #    utc_start 1939-11-01 04:00:00 (Wed)
  61194106800, #      utc_end 1940-03-01 03:00:00 (Fri)
  61183645200, #  local_start 1939-11-01 01:00:00 (Wed)
  61194096000, #    local_end 1940-03-01 00:00:00 (Fri)
  -10800,
  1,
  '-03',
      ],
      [
  61194106800, #    utc_start 1940-03-01 03:00:00 (Fri)
  61204651200, #      utc_end 1940-07-01 04:00:00 (Mon)
  61194092400, #  local_start 1940-02-29 23:00:00 (Thu)
  61204636800, #    local_end 1940-07-01 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  61204651200, #    utc_start 1940-07-01 04:00:00 (Mon)
  61234801200, #      utc_end 1941-06-15 03:00:00 (Sun)
  61204640400, #  local_start 1940-07-01 01:00:00 (Mon)
  61234790400, #    local_end 1941-06-15 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61234801200, #    utc_start 1941-06-15 03:00:00 (Sun)
  61245345600, #      utc_end 1941-10-15 04:00:00 (Wed)
  61234786800, #  local_start 1941-06-14 23:00:00 (Sat)
  61245331200, #    local_end 1941-10-15 00:00:00 (Wed)
  -14400,
  0,
  '-04',
      ],
      [
  61245345600, #    utc_start 1941-10-15 04:00:00 (Wed)
  61301934000, #      utc_end 1943-08-01 03:00:00 (Sun)
  61245334800, #  local_start 1941-10-15 01:00:00 (Wed)
  61301923200, #    local_end 1943-08-01 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61301934000, #    utc_start 1943-08-01 03:00:00 (Sun)
  61308417600, #      utc_end 1943-10-15 04:00:00 (Fri)
  61301919600, #  local_start 1943-07-31 23:00:00 (Sat)
  61308403200, #    local_end 1943-10-15 00:00:00 (Fri)
  -14400,
  0,
  '-04',
      ],
      [
  61308417600, #    utc_start 1943-10-15 04:00:00 (Fri)
  61383409200, #      utc_end 1946-03-01 03:00:00 (Fri)
  61308406800, #  local_start 1943-10-15 01:00:00 (Fri)
  61383398400, #    local_end 1946-03-01 00:00:00 (Fri)
  -10800,
  1,
  '-03',
      ],
      [
  61383409200, #    utc_start 1946-03-01 03:00:00 (Fri)
  61401902400, #      utc_end 1946-10-01 04:00:00 (Tue)
  61383394800, #  local_start 1946-02-28 23:00:00 (Thu)
  61401888000, #    local_end 1946-10-01 00:00:00 (Tue)
  -14400,
  0,
  '-04',
      ],
      [
  61401902400, #    utc_start 1946-10-01 04:00:00 (Tue)
  61938356400, #      utc_end 1963-10-01 03:00:00 (Tue)
  61401891600, #  local_start 1946-10-01 01:00:00 (Tue)
  61938345600, #    local_end 1963-10-01 00:00:00 (Tue)
  -10800,
  1,
  '-03',
      ],
      [
  61938356400, #    utc_start 1963-10-01 03:00:00 (Tue)
  61944840000, #      utc_end 1963-12-15 04:00:00 (Sun)
  61938342000, #  local_start 1963-09-30 23:00:00 (Mon)
  61944825600, #    local_end 1963-12-15 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  61944840000, #    utc_start 1963-12-15 04:00:00 (Sun)
  61951489200, #      utc_end 1964-03-01 03:00:00 (Sun)
  61944829200, #  local_start 1963-12-15 01:00:00 (Sun)
  61951478400, #    local_end 1964-03-01 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61951489200, #    utc_start 1964-03-01 03:00:00 (Sun)
  61971192000, #      utc_end 1964-10-15 04:00:00 (Thu)
  61951474800, #  local_start 1964-02-29 23:00:00 (Sat)
  61971177600, #    local_end 1964-10-15 00:00:00 (Thu)
  -14400,
  0,
  '-04',
      ],
      [
  61971192000, #    utc_start 1964-10-15 04:00:00 (Thu)
  61983025200, #      utc_end 1965-03-01 03:00:00 (Mon)
  61971181200, #  local_start 1964-10-15 01:00:00 (Thu)
  61983014400, #    local_end 1965-03-01 00:00:00 (Mon)
  -10800,
  1,
  '-03',
      ],
      [
  61983025200, #    utc_start 1965-03-01 03:00:00 (Mon)
  62002728000, #      utc_end 1965-10-15 04:00:00 (Fri)
  61983010800, #  local_start 1965-02-28 23:00:00 (Sun)
  62002713600, #    local_end 1965-10-15 00:00:00 (Fri)
  -14400,
  0,
  '-04',
      ],
      [
  62002728000, #    utc_start 1965-10-15 04:00:00 (Fri)
  62014561200, #      utc_end 1966-03-01 03:00:00 (Tue)
  62002717200, #  local_start 1965-10-15 01:00:00 (Fri)
  62014550400, #    local_end 1966-03-01 00:00:00 (Tue)
  -10800,
  1,
  '-03',
      ],
      [
  62014561200, #    utc_start 1966-03-01 03:00:00 (Tue)
  62034264000, #      utc_end 1966-10-15 04:00:00 (Sat)
  62014546800, #  local_start 1966-02-28 23:00:00 (Mon)
  62034249600, #    local_end 1966-10-15 00:00:00 (Sat)
  -14400,
  0,
  '-04',
      ],
      [
  62034264000, #    utc_start 1966-10-15 04:00:00 (Sat)
  62048862000, #      utc_end 1967-04-02 03:00:00 (Sun)
  62034253200, #  local_start 1966-10-15 01:00:00 (Sat)
  62048851200, #    local_end 1967-04-02 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62048862000, #    utc_start 1967-04-02 03:00:00 (Sun)
  62064590400, #      utc_end 1967-10-01 04:00:00 (Sun)
  62048847600, #  local_start 1967-04-01 23:00:00 (Sat)
  62064576000, #    local_end 1967-10-01 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62064590400, #    utc_start 1967-10-01 04:00:00 (Sun)
  62080916400, #      utc_end 1968-04-07 03:00:00 (Sun)
  62064579600, #  local_start 1967-10-01 01:00:00 (Sun)
  62080905600, #    local_end 1968-04-07 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62080916400, #    utc_start 1968-04-07 03:00:00 (Sun)
  62096644800, #      utc_end 1968-10-06 04:00:00 (Sun)
  62080902000, #  local_start 1968-04-06 23:00:00 (Sat)
  62096630400, #    local_end 1968-10-06 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62096644800, #    utc_start 1968-10-06 04:00:00 (Sun)
  62112366000, #      utc_end 1969-04-06 03:00:00 (Sun)
  62096634000, #  local_start 1968-10-06 01:00:00 (Sun)
  62112355200, #    local_end 1969-04-06 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62112366000, #    utc_start 1969-04-06 03:00:00 (Sun)
  62128094400, #      utc_end 1969-10-05 04:00:00 (Sun)
  62112351600, #  local_start 1969-04-05 23:00:00 (Sat)
  62128080000, #    local_end 1969-10-05 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62128094400, #    utc_start 1969-10-05 04:00:00 (Sun)
  62263825200, #      utc_end 1974-01-23 03:00:00 (Wed)
  62128083600, #  local_start 1969-10-05 01:00:00 (Sun)
  62263814400, #    local_end 1974-01-23 00:00:00 (Wed)
  -10800,
  0,
  '-03',
      ],
      [
  62263825200, #    utc_start 1974-01-23 03:00:00 (Wed)
  62272288800, #      utc_end 1974-05-01 02:00:00 (Wed)
  62263818000, #  local_start 1974-01-23 01:00:00 (Wed)
  62272281600, #    local_end 1974-05-01 00:00:00 (Wed)
  -7200,
  1,
  '-02',
      ],
      [
  62272288800, #    utc_start 1974-05-01 02:00:00 (Wed)
  62732631600, #      utc_end 1988-12-01 03:00:00 (Thu)
  62272278000, #  local_start 1974-04-30 23:00:00 (Tue)
  62732620800, #    local_end 1988-12-01 00:00:00 (Thu)
  -10800,
  0,
  '-03',
      ],
      [
  62732631600, #    utc_start 1988-12-01 03:00:00 (Thu)
  62740749600, #      utc_end 1989-03-05 02:00:00 (Sun)
  62732624400, #  local_start 1988-12-01 01:00:00 (Thu)
  62740742400, #    local_end 1989-03-05 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62740749600, #    utc_start 1989-03-05 02:00:00 (Sun)
  62760106800, #      utc_end 1989-10-15 03:00:00 (Sun)
  62740738800, #  local_start 1989-03-04 23:00:00 (Sat)
  62760096000, #    local_end 1989-10-15 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62760106800, #    utc_start 1989-10-15 03:00:00 (Sun)
  62772199200, #      utc_end 1990-03-04 02:00:00 (Sun)
  62760099600, #  local_start 1989-10-15 01:00:00 (Sun)
  62772192000, #    local_end 1990-03-04 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62772199200, #    utc_start 1990-03-04 02:00:00 (Sun)
  62792161200, #      utc_end 1990-10-21 03:00:00 (Sun)
  62772188400, #  local_start 1990-03-03 23:00:00 (Sat)
  62792150400, #    local_end 1990-10-21 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62792161200, #    utc_start 1990-10-21 03:00:00 (Sun)
  62803648800, #      utc_end 1991-03-03 02:00:00 (Sun)
  62792154000, #  local_start 1990-10-21 01:00:00 (Sun)
  62803641600, #    local_end 1991-03-03 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62803648800, #    utc_start 1991-03-03 02:00:00 (Sun)
  62823610800, #      utc_end 1991-10-20 03:00:00 (Sun)
  62803638000, #  local_start 1991-03-02 23:00:00 (Sat)
  62823600000, #    local_end 1991-10-20 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62823610800, #    utc_start 1991-10-20 03:00:00 (Sun)
  62835098400, #      utc_end 1992-03-01 02:00:00 (Sun)
  62823603600, #  local_start 1991-10-20 01:00:00 (Sun)
  62835091200, #    local_end 1992-03-01 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62835098400, #    utc_start 1992-03-01 02:00:00 (Sun)
  62855060400, #      utc_end 1992-10-18 03:00:00 (Sun)
  62835087600, #  local_start 1992-02-29 23:00:00 (Sat)
  62855049600, #    local_end 1992-10-18 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62855060400, #    utc_start 1992-10-18 03:00:00 (Sun)
  62867152800, #      utc_end 1993-03-07 02:00:00 (Sun)
  62855053200, #  local_start 1992-10-18 01:00:00 (Sun)
  62867145600, #    local_end 1993-03-07 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62867152800, #    utc_start 1993-03-07 02:00:00 (Sun)
  63074602800, #      utc_end 1999-10-03 03:00:00 (Sun)
  62867142000, #  local_start 1993-03-06 23:00:00 (Sat)
  63074592000, #    local_end 1999-10-03 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63074602800, #    utc_start 1999-10-03 03:00:00 (Sun)
  63087735600, #      utc_end 2000-03-03 03:00:00 (Fri)
  63074592000, #  local_start 1999-10-03 00:00:00 (Sun)
  63087724800, #    local_end 2000-03-03 00:00:00 (Fri)
  -10800,
  1,
  '-03',
      ],
      [
  63087735600, #    utc_start 2000-03-03 03:00:00 (Fri)
  63221742000, #      utc_end 2004-06-01 03:00:00 (Tue)
  63087724800, #  local_start 2000-03-03 00:00:00 (Fri)
  63221731200, #    local_end 2004-06-01 00:00:00 (Tue)
  -10800,
  0,
  '-03',
      ],
      [
  63221742000, #    utc_start 2004-06-01 03:00:00 (Tue)
  63223387200, #      utc_end 2004-06-20 04:00:00 (Sun)
  63221727600, #  local_start 2004-05-31 23:00:00 (Mon)
  63223372800, #    local_end 2004-06-20 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63223387200, #    utc_start 2004-06-20 04:00:00 (Sun)
  63334666800, #      utc_end 2007-12-30 03:00:00 (Sun)
  63223376400, #  local_start 2004-06-20 01:00:00 (Sun)
  63334656000, #    local_end 2007-12-30 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63334666800, #    utc_start 2007-12-30 03:00:00 (Sun)
  63341316000, #      utc_end 2008-03-16 02:00:00 (Sun)
  63334659600, #  local_start 2007-12-30 01:00:00 (Sun)
  63341308800, #    local_end 2008-03-16 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63341316000, #    utc_start 2008-03-16 02:00:00 (Sun)
  63359982000, #      utc_end 2008-10-18 03:00:00 (Sat)
  63341305200, #  local_start 2008-03-15 23:00:00 (Sat)
  63359971200, #    local_end 2008-10-18 00:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  63359982000, #    utc_start 2008-10-18 03:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  63359971200, #  local_start 2008-10-18 00:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #    local_end
  -10800,
  0,
  '-03',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {28}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_ARGENTINA_RIO_GALLEGOS

    $main::fatpacked{"DateTime/TimeZone/America/Argentina/Salta.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_ARGENTINA_SALTA';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/southamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Argentina::Salta;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Argentina::Salta::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59763586900, #      utc_end 1894-10-31 04:21:40 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59763571200, #    local_end 1894-10-31 00:00:00 (Wed)
  -15700,
  0,
  'LMT',
      ],
      [
  59763586900, #    utc_start 1894-10-31 04:21:40 (Wed)
  60568229808, #      utc_end 1920-05-01 04:16:48 (Sat)
  59763571492, #  local_start 1894-10-31 00:04:52 (Wed)
  60568214400, #    local_end 1920-05-01 00:00:00 (Sat)
  -15408,
  0,
  'CMT',
      ],
      [
  60568229808, #    utc_start 1920-05-01 04:16:48 (Sat)
  60902251200, #      utc_end 1930-12-01 04:00:00 (Mon)
  60568215408, #  local_start 1920-05-01 00:16:48 (Sat)
  60902236800, #    local_end 1930-12-01 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  60902251200, #    utc_start 1930-12-01 04:00:00 (Mon)
  60912702000, #      utc_end 1931-04-01 03:00:00 (Wed)
  60902240400, #  local_start 1930-12-01 01:00:00 (Mon)
  60912691200, #    local_end 1931-04-01 00:00:00 (Wed)
  -10800,
  1,
  '-03',
      ],
      [
  60912702000, #    utc_start 1931-04-01 03:00:00 (Wed)
  60929726400, #      utc_end 1931-10-15 04:00:00 (Thu)
  60912687600, #  local_start 1931-03-31 23:00:00 (Tue)
  60929712000, #    local_end 1931-10-15 00:00:00 (Thu)
  -14400,
  0,
  '-04',
      ],
      [
  60929726400, #    utc_start 1931-10-15 04:00:00 (Thu)
  60941646000, #      utc_end 1932-03-01 03:00:00 (Tue)
  60929715600, #  local_start 1931-10-15 01:00:00 (Thu)
  60941635200, #    local_end 1932-03-01 00:00:00 (Tue)
  -10800,
  1,
  '-03',
      ],
      [
  60941646000, #    utc_start 1932-03-01 03:00:00 (Tue)
  60962817600, #      utc_end 1932-11-01 04:00:00 (Tue)
  60941631600, #  local_start 1932-02-29 23:00:00 (Mon)
  60962803200, #    local_end 1932-11-01 00:00:00 (Tue)
  -14400,
  0,
  '-04',
      ],
      [
  60962817600, #    utc_start 1932-11-01 04:00:00 (Tue)
  60973182000, #      utc_end 1933-03-01 03:00:00 (Wed)
  60962806800, #  local_start 1932-11-01 01:00:00 (Tue)
  60973171200, #    local_end 1933-03-01 00:00:00 (Wed)
  -10800,
  1,
  '-03',
      ],
      [
  60973182000, #    utc_start 1933-03-01 03:00:00 (Wed)
  60994353600, #      utc_end 1933-11-01 04:00:00 (Wed)
  60973167600, #  local_start 1933-02-28 23:00:00 (Tue)
  60994339200, #    local_end 1933-11-01 00:00:00 (Wed)
  -14400,
  0,
  '-04',
      ],
      [
  60994353600, #    utc_start 1933-11-01 04:00:00 (Wed)
  61004718000, #      utc_end 1934-03-01 03:00:00 (Thu)
  60994342800, #  local_start 1933-11-01 01:00:00 (Wed)
  61004707200, #    local_end 1934-03-01 00:00:00 (Thu)
  -10800,
  1,
  '-03',
      ],
      [
  61004718000, #    utc_start 1934-03-01 03:00:00 (Thu)
  61025889600, #      utc_end 1934-11-01 04:00:00 (Thu)
  61004703600, #  local_start 1934-02-28 23:00:00 (Wed)
  61025875200, #    local_end 1934-11-01 00:00:00 (Thu)
  -14400,
  0,
  '-04',
      ],
      [
  61025889600, #    utc_start 1934-11-01 04:00:00 (Thu)
  61036254000, #      utc_end 1935-03-01 03:00:00 (Fri)
  61025878800, #  local_start 1934-11-01 01:00:00 (Thu)
  61036243200, #    local_end 1935-03-01 00:00:00 (Fri)
  -10800,
  1,
  '-03',
      ],
      [
  61036254000, #    utc_start 1935-03-01 03:00:00 (Fri)
  61057425600, #      utc_end 1935-11-01 04:00:00 (Fri)
  61036239600, #  local_start 1935-02-28 23:00:00 (Thu)
  61057411200, #    local_end 1935-11-01 00:00:00 (Fri)
  -14400,
  0,
  '-04',
      ],
      [
  61057425600, #    utc_start 1935-11-01 04:00:00 (Fri)
  61067876400, #      utc_end 1936-03-01 03:00:00 (Sun)
  61057414800, #  local_start 1935-11-01 01:00:00 (Fri)
  61067865600, #    local_end 1936-03-01 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61067876400, #    utc_start 1936-03-01 03:00:00 (Sun)
  61089048000, #      utc_end 1936-11-01 04:00:00 (Sun)
  61067862000, #  local_start 1936-02-29 23:00:00 (Sat)
  61089033600, #    local_end 1936-11-01 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  61089048000, #    utc_start 1936-11-01 04:00:00 (Sun)
  61099412400, #      utc_end 1937-03-01 03:00:00 (Mon)
  61089037200, #  local_start 1936-11-01 01:00:00 (Sun)
  61099401600, #    local_end 1937-03-01 00:00:00 (Mon)
  -10800,
  1,
  '-03',
      ],
      [
  61099412400, #    utc_start 1937-03-01 03:00:00 (Mon)
  61120584000, #      utc_end 1937-11-01 04:00:00 (Mon)
  61099398000, #  local_start 1937-02-28 23:00:00 (Sun)
  61120569600, #    local_end 1937-11-01 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  61120584000, #    utc_start 1937-11-01 04:00:00 (Mon)
  61130948400, #      utc_end 1938-03-01 03:00:00 (Tue)
  61120573200, #  local_start 1937-11-01 01:00:00 (Mon)
  61130937600, #    local_end 1938-03-01 00:00:00 (Tue)
  -10800,
  1,
  '-03',
      ],
      [
  61130948400, #    utc_start 1938-03-01 03:00:00 (Tue)
  61152120000, #      utc_end 1938-11-01 04:00:00 (Tue)
  61130934000, #  local_start 1938-02-28 23:00:00 (Mon)
  61152105600, #    local_end 1938-11-01 00:00:00 (Tue)
  -14400,
  0,
  '-04',
      ],
      [
  61152120000, #    utc_start 1938-11-01 04:00:00 (Tue)
  61162484400, #      utc_end 1939-03-01 03:00:00 (Wed)
  61152109200, #  local_start 1938-11-01 01:00:00 (Tue)
  61162473600, #    local_end 1939-03-01 00:00:00 (Wed)
  -10800,
  1,
  '-03',
      ],
      [
  61162484400, #    utc_start 1939-03-01 03:00:00 (Wed)
  61183656000, #      utc_end 1939-11-01 04:00:00 (Wed)
  61162470000, #  local_start 1939-02-28 23:00:00 (Tue)
  61183641600, #    local_end 1939-11-01 00:00:00 (Wed)
  -14400,
  0,
  '-04',
      ],
      [
  61183656000, #    utc_start 1939-11-01 04:00:00 (Wed)
  61194106800, #      utc_end 1940-03-01 03:00:00 (Fri)
  61183645200, #  local_start 1939-11-01 01:00:00 (Wed)
  61194096000, #    local_end 1940-03-01 00:00:00 (Fri)
  -10800,
  1,
  '-03',
      ],
      [
  61194106800, #    utc_start 1940-03-01 03:00:00 (Fri)
  61204651200, #      utc_end 1940-07-01 04:00:00 (Mon)
  61194092400, #  local_start 1940-02-29 23:00:00 (Thu)
  61204636800, #    local_end 1940-07-01 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  61204651200, #    utc_start 1940-07-01 04:00:00 (Mon)
  61234801200, #      utc_end 1941-06-15 03:00:00 (Sun)
  61204640400, #  local_start 1940-07-01 01:00:00 (Mon)
  61234790400, #    local_end 1941-06-15 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61234801200, #    utc_start 1941-06-15 03:00:00 (Sun)
  61245345600, #      utc_end 1941-10-15 04:00:00 (Wed)
  61234786800, #  local_start 1941-06-14 23:00:00 (Sat)
  61245331200, #    local_end 1941-10-15 00:00:00 (Wed)
  -14400,
  0,
  '-04',
      ],
      [
  61245345600, #    utc_start 1941-10-15 04:00:00 (Wed)
  61301934000, #      utc_end 1943-08-01 03:00:00 (Sun)
  61245334800, #  local_start 1941-10-15 01:00:00 (Wed)
  61301923200, #    local_end 1943-08-01 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61301934000, #    utc_start 1943-08-01 03:00:00 (Sun)
  61308417600, #      utc_end 1943-10-15 04:00:00 (Fri)
  61301919600, #  local_start 1943-07-31 23:00:00 (Sat)
  61308403200, #    local_end 1943-10-15 00:00:00 (Fri)
  -14400,
  0,
  '-04',
      ],
      [
  61308417600, #    utc_start 1943-10-15 04:00:00 (Fri)
  61383409200, #      utc_end 1946-03-01 03:00:00 (Fri)
  61308406800, #  local_start 1943-10-15 01:00:00 (Fri)
  61383398400, #    local_end 1946-03-01 00:00:00 (Fri)
  -10800,
  1,
  '-03',
      ],
      [
  61383409200, #    utc_start 1946-03-01 03:00:00 (Fri)
  61401902400, #      utc_end 1946-10-01 04:00:00 (Tue)
  61383394800, #  local_start 1946-02-28 23:00:00 (Thu)
  61401888000, #    local_end 1946-10-01 00:00:00 (Tue)
  -14400,
  0,
  '-04',
      ],
      [
  61401902400, #    utc_start 1946-10-01 04:00:00 (Tue)
  61938356400, #      utc_end 1963-10-01 03:00:00 (Tue)
  61401891600, #  local_start 1946-10-01 01:00:00 (Tue)
  61938345600, #    local_end 1963-10-01 00:00:00 (Tue)
  -10800,
  1,
  '-03',
      ],
      [
  61938356400, #    utc_start 1963-10-01 03:00:00 (Tue)
  61944840000, #      utc_end 1963-12-15 04:00:00 (Sun)
  61938342000, #  local_start 1963-09-30 23:00:00 (Mon)
  61944825600, #    local_end 1963-12-15 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  61944840000, #    utc_start 1963-12-15 04:00:00 (Sun)
  61951489200, #      utc_end 1964-03-01 03:00:00 (Sun)
  61944829200, #  local_start 1963-12-15 01:00:00 (Sun)
  61951478400, #    local_end 1964-03-01 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61951489200, #    utc_start 1964-03-01 03:00:00 (Sun)
  61971192000, #      utc_end 1964-10-15 04:00:00 (Thu)
  61951474800, #  local_start 1964-02-29 23:00:00 (Sat)
  61971177600, #    local_end 1964-10-15 00:00:00 (Thu)
  -14400,
  0,
  '-04',
      ],
      [
  61971192000, #    utc_start 1964-10-15 04:00:00 (Thu)
  61983025200, #      utc_end 1965-03-01 03:00:00 (Mon)
  61971181200, #  local_start 1964-10-15 01:00:00 (Thu)
  61983014400, #    local_end 1965-03-01 00:00:00 (Mon)
  -10800,
  1,
  '-03',
      ],
      [
  61983025200, #    utc_start 1965-03-01 03:00:00 (Mon)
  62002728000, #      utc_end 1965-10-15 04:00:00 (Fri)
  61983010800, #  local_start 1965-02-28 23:00:00 (Sun)
  62002713600, #    local_end 1965-10-15 00:00:00 (Fri)
  -14400,
  0,
  '-04',
      ],
      [
  62002728000, #    utc_start 1965-10-15 04:00:00 (Fri)
  62014561200, #      utc_end 1966-03-01 03:00:00 (Tue)
  62002717200, #  local_start 1965-10-15 01:00:00 (Fri)
  62014550400, #    local_end 1966-03-01 00:00:00 (Tue)
  -10800,
  1,
  '-03',
      ],
      [
  62014561200, #    utc_start 1966-03-01 03:00:00 (Tue)
  62034264000, #      utc_end 1966-10-15 04:00:00 (Sat)
  62014546800, #  local_start 1966-02-28 23:00:00 (Mon)
  62034249600, #    local_end 1966-10-15 00:00:00 (Sat)
  -14400,
  0,
  '-04',
      ],
      [
  62034264000, #    utc_start 1966-10-15 04:00:00 (Sat)
  62048862000, #      utc_end 1967-04-02 03:00:00 (Sun)
  62034253200, #  local_start 1966-10-15 01:00:00 (Sat)
  62048851200, #    local_end 1967-04-02 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62048862000, #    utc_start 1967-04-02 03:00:00 (Sun)
  62064590400, #      utc_end 1967-10-01 04:00:00 (Sun)
  62048847600, #  local_start 1967-04-01 23:00:00 (Sat)
  62064576000, #    local_end 1967-10-01 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62064590400, #    utc_start 1967-10-01 04:00:00 (Sun)
  62080916400, #      utc_end 1968-04-07 03:00:00 (Sun)
  62064579600, #  local_start 1967-10-01 01:00:00 (Sun)
  62080905600, #    local_end 1968-04-07 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62080916400, #    utc_start 1968-04-07 03:00:00 (Sun)
  62096644800, #      utc_end 1968-10-06 04:00:00 (Sun)
  62080902000, #  local_start 1968-04-06 23:00:00 (Sat)
  62096630400, #    local_end 1968-10-06 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62096644800, #    utc_start 1968-10-06 04:00:00 (Sun)
  62112366000, #      utc_end 1969-04-06 03:00:00 (Sun)
  62096634000, #  local_start 1968-10-06 01:00:00 (Sun)
  62112355200, #    local_end 1969-04-06 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62112366000, #    utc_start 1969-04-06 03:00:00 (Sun)
  62128094400, #      utc_end 1969-10-05 04:00:00 (Sun)
  62112351600, #  local_start 1969-04-05 23:00:00 (Sat)
  62128080000, #    local_end 1969-10-05 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62128094400, #    utc_start 1969-10-05 04:00:00 (Sun)
  62263825200, #      utc_end 1974-01-23 03:00:00 (Wed)
  62128083600, #  local_start 1969-10-05 01:00:00 (Sun)
  62263814400, #    local_end 1974-01-23 00:00:00 (Wed)
  -10800,
  0,
  '-03',
      ],
      [
  62263825200, #    utc_start 1974-01-23 03:00:00 (Wed)
  62272288800, #      utc_end 1974-05-01 02:00:00 (Wed)
  62263818000, #  local_start 1974-01-23 01:00:00 (Wed)
  62272281600, #    local_end 1974-05-01 00:00:00 (Wed)
  -7200,
  1,
  '-02',
      ],
      [
  62272288800, #    utc_start 1974-05-01 02:00:00 (Wed)
  62732631600, #      utc_end 1988-12-01 03:00:00 (Thu)
  62272278000, #  local_start 1974-04-30 23:00:00 (Tue)
  62732620800, #    local_end 1988-12-01 00:00:00 (Thu)
  -10800,
  0,
  '-03',
      ],
      [
  62732631600, #    utc_start 1988-12-01 03:00:00 (Thu)
  62740749600, #      utc_end 1989-03-05 02:00:00 (Sun)
  62732624400, #  local_start 1988-12-01 01:00:00 (Thu)
  62740742400, #    local_end 1989-03-05 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62740749600, #    utc_start 1989-03-05 02:00:00 (Sun)
  62760106800, #      utc_end 1989-10-15 03:00:00 (Sun)
  62740738800, #  local_start 1989-03-04 23:00:00 (Sat)
  62760096000, #    local_end 1989-10-15 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62760106800, #    utc_start 1989-10-15 03:00:00 (Sun)
  62772199200, #      utc_end 1990-03-04 02:00:00 (Sun)
  62760099600, #  local_start 1989-10-15 01:00:00 (Sun)
  62772192000, #    local_end 1990-03-04 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62772199200, #    utc_start 1990-03-04 02:00:00 (Sun)
  62792161200, #      utc_end 1990-10-21 03:00:00 (Sun)
  62772188400, #  local_start 1990-03-03 23:00:00 (Sat)
  62792150400, #    local_end 1990-10-21 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62792161200, #    utc_start 1990-10-21 03:00:00 (Sun)
  62803648800, #      utc_end 1991-03-03 02:00:00 (Sun)
  62792154000, #  local_start 1990-10-21 01:00:00 (Sun)
  62803641600, #    local_end 1991-03-03 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62803648800, #    utc_start 1991-03-03 02:00:00 (Sun)
  62823614400, #      utc_end 1991-10-20 04:00:00 (Sun)
  62803634400, #  local_start 1991-03-02 22:00:00 (Sat)
  62823600000, #    local_end 1991-10-20 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62823614400, #    utc_start 1991-10-20 04:00:00 (Sun)
  62835098400, #      utc_end 1992-03-01 02:00:00 (Sun)
  62823607200, #  local_start 1991-10-20 02:00:00 (Sun)
  62835091200, #    local_end 1992-03-01 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62835098400, #    utc_start 1992-03-01 02:00:00 (Sun)
  62855060400, #      utc_end 1992-10-18 03:00:00 (Sun)
  62835087600, #  local_start 1992-02-29 23:00:00 (Sat)
  62855049600, #    local_end 1992-10-18 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62855060400, #    utc_start 1992-10-18 03:00:00 (Sun)
  62867152800, #      utc_end 1993-03-07 02:00:00 (Sun)
  62855053200, #  local_start 1992-10-18 01:00:00 (Sun)
  62867145600, #    local_end 1993-03-07 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62867152800, #    utc_start 1993-03-07 02:00:00 (Sun)
  63074602800, #      utc_end 1999-10-03 03:00:00 (Sun)
  62867142000, #  local_start 1993-03-06 23:00:00 (Sat)
  63074592000, #    local_end 1999-10-03 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63074602800, #    utc_start 1999-10-03 03:00:00 (Sun)
  63087735600, #      utc_end 2000-03-03 03:00:00 (Fri)
  63074592000, #  local_start 1999-10-03 00:00:00 (Sun)
  63087724800, #    local_end 2000-03-03 00:00:00 (Fri)
  -10800,
  1,
  '-03',
      ],
      [
  63087735600, #    utc_start 2000-03-03 03:00:00 (Fri)
  63334666800, #      utc_end 2007-12-30 03:00:00 (Sun)
  63087724800, #  local_start 2000-03-03 00:00:00 (Fri)
  63334656000, #    local_end 2007-12-30 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63334666800, #    utc_start 2007-12-30 03:00:00 (Sun)
  63341316000, #      utc_end 2008-03-16 02:00:00 (Sun)
  63334659600, #  local_start 2007-12-30 01:00:00 (Sun)
  63341308800, #    local_end 2008-03-16 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63341316000, #    utc_start 2008-03-16 02:00:00 (Sun)
  63359982000, #      utc_end 2008-10-18 03:00:00 (Sat)
  63341305200, #  local_start 2008-03-15 23:00:00 (Sat)
  63359971200, #    local_end 2008-10-18 00:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  63359982000, #    utc_start 2008-10-18 03:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  63359971200, #  local_start 2008-10-18 00:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #    local_end
  -10800,
  0,
  '-03',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {28}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_ARGENTINA_SALTA

    $main::fatpacked{"DateTime/TimeZone/America/Argentina/San_Juan.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_ARGENTINA_SAN_JUAN';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/southamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Argentina::San_Juan;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Argentina::San_Juan::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59763587644, #      utc_end 1894-10-31 04:34:04 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59763571200, #    local_end 1894-10-31 00:00:00 (Wed)
  -16444,
  0,
  'LMT',
      ],
      [
  59763587644, #    utc_start 1894-10-31 04:34:04 (Wed)
  60568229808, #      utc_end 1920-05-01 04:16:48 (Sat)
  59763572236, #  local_start 1894-10-31 00:17:16 (Wed)
  60568214400, #    local_end 1920-05-01 00:00:00 (Sat)
  -15408,
  0,
  'CMT',
      ],
      [
  60568229808, #    utc_start 1920-05-01 04:16:48 (Sat)
  60902251200, #      utc_end 1930-12-01 04:00:00 (Mon)
  60568215408, #  local_start 1920-05-01 00:16:48 (Sat)
  60902236800, #    local_end 1930-12-01 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  60902251200, #    utc_start 1930-12-01 04:00:00 (Mon)
  60912702000, #      utc_end 1931-04-01 03:00:00 (Wed)
  60902240400, #  local_start 1930-12-01 01:00:00 (Mon)
  60912691200, #    local_end 1931-04-01 00:00:00 (Wed)
  -10800,
  1,
  '-03',
      ],
      [
  60912702000, #    utc_start 1931-04-01 03:00:00 (Wed)
  60929726400, #      utc_end 1931-10-15 04:00:00 (Thu)
  60912687600, #  local_start 1931-03-31 23:00:00 (Tue)
  60929712000, #    local_end 1931-10-15 00:00:00 (Thu)
  -14400,
  0,
  '-04',
      ],
      [
  60929726400, #    utc_start 1931-10-15 04:00:00 (Thu)
  60941646000, #      utc_end 1932-03-01 03:00:00 (Tue)
  60929715600, #  local_start 1931-10-15 01:00:00 (Thu)
  60941635200, #    local_end 1932-03-01 00:00:00 (Tue)
  -10800,
  1,
  '-03',
      ],
      [
  60941646000, #    utc_start 1932-03-01 03:00:00 (Tue)
  60962817600, #      utc_end 1932-11-01 04:00:00 (Tue)
  60941631600, #  local_start 1932-02-29 23:00:00 (Mon)
  60962803200, #    local_end 1932-11-01 00:00:00 (Tue)
  -14400,
  0,
  '-04',
      ],
      [
  60962817600, #    utc_start 1932-11-01 04:00:00 (Tue)
  60973182000, #      utc_end 1933-03-01 03:00:00 (Wed)
  60962806800, #  local_start 1932-11-01 01:00:00 (Tue)
  60973171200, #    local_end 1933-03-01 00:00:00 (Wed)
  -10800,
  1,
  '-03',
      ],
      [
  60973182000, #    utc_start 1933-03-01 03:00:00 (Wed)
  60994353600, #      utc_end 1933-11-01 04:00:00 (Wed)
  60973167600, #  local_start 1933-02-28 23:00:00 (Tue)
  60994339200, #    local_end 1933-11-01 00:00:00 (Wed)
  -14400,
  0,
  '-04',
      ],
      [
  60994353600, #    utc_start 1933-11-01 04:00:00 (Wed)
  61004718000, #      utc_end 1934-03-01 03:00:00 (Thu)
  60994342800, #  local_start 1933-11-01 01:00:00 (Wed)
  61004707200, #    local_end 1934-03-01 00:00:00 (Thu)
  -10800,
  1,
  '-03',
      ],
      [
  61004718000, #    utc_start 1934-03-01 03:00:00 (Thu)
  61025889600, #      utc_end 1934-11-01 04:00:00 (Thu)
  61004703600, #  local_start 1934-02-28 23:00:00 (Wed)
  61025875200, #    local_end 1934-11-01 00:00:00 (Thu)
  -14400,
  0,
  '-04',
      ],
      [
  61025889600, #    utc_start 1934-11-01 04:00:00 (Thu)
  61036254000, #      utc_end 1935-03-01 03:00:00 (Fri)
  61025878800, #  local_start 1934-11-01 01:00:00 (Thu)
  61036243200, #    local_end 1935-03-01 00:00:00 (Fri)
  -10800,
  1,
  '-03',
      ],
      [
  61036254000, #    utc_start 1935-03-01 03:00:00 (Fri)
  61057425600, #      utc_end 1935-11-01 04:00:00 (Fri)
  61036239600, #  local_start 1935-02-28 23:00:00 (Thu)
  61057411200, #    local_end 1935-11-01 00:00:00 (Fri)
  -14400,
  0,
  '-04',
      ],
      [
  61057425600, #    utc_start 1935-11-01 04:00:00 (Fri)
  61067876400, #      utc_end 1936-03-01 03:00:00 (Sun)
  61057414800, #  local_start 1935-11-01 01:00:00 (Fri)
  61067865600, #    local_end 1936-03-01 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61067876400, #    utc_start 1936-03-01 03:00:00 (Sun)
  61089048000, #      utc_end 1936-11-01 04:00:00 (Sun)
  61067862000, #  local_start 1936-02-29 23:00:00 (Sat)
  61089033600, #    local_end 1936-11-01 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  61089048000, #    utc_start 1936-11-01 04:00:00 (Sun)
  61099412400, #      utc_end 1937-03-01 03:00:00 (Mon)
  61089037200, #  local_start 1936-11-01 01:00:00 (Sun)
  61099401600, #    local_end 1937-03-01 00:00:00 (Mon)
  -10800,
  1,
  '-03',
      ],
      [
  61099412400, #    utc_start 1937-03-01 03:00:00 (Mon)
  61120584000, #      utc_end 1937-11-01 04:00:00 (Mon)
  61099398000, #  local_start 1937-02-28 23:00:00 (Sun)
  61120569600, #    local_end 1937-11-01 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  61120584000, #    utc_start 1937-11-01 04:00:00 (Mon)
  61130948400, #      utc_end 1938-03-01 03:00:00 (Tue)
  61120573200, #  local_start 1937-11-01 01:00:00 (Mon)
  61130937600, #    local_end 1938-03-01 00:00:00 (Tue)
  -10800,
  1,
  '-03',
      ],
      [
  61130948400, #    utc_start 1938-03-01 03:00:00 (Tue)
  61152120000, #      utc_end 1938-11-01 04:00:00 (Tue)
  61130934000, #  local_start 1938-02-28 23:00:00 (Mon)
  61152105600, #    local_end 1938-11-01 00:00:00 (Tue)
  -14400,
  0,
  '-04',
      ],
      [
  61152120000, #    utc_start 1938-11-01 04:00:00 (Tue)
  61162484400, #      utc_end 1939-03-01 03:00:00 (Wed)
  61152109200, #  local_start 1938-11-01 01:00:00 (Tue)
  61162473600, #    local_end 1939-03-01 00:00:00 (Wed)
  -10800,
  1,
  '-03',
      ],
      [
  61162484400, #    utc_start 1939-03-01 03:00:00 (Wed)
  61183656000, #      utc_end 1939-11-01 04:00:00 (Wed)
  61162470000, #  local_start 1939-02-28 23:00:00 (Tue)
  61183641600, #    local_end 1939-11-01 00:00:00 (Wed)
  -14400,
  0,
  '-04',
      ],
      [
  61183656000, #    utc_start 1939-11-01 04:00:00 (Wed)
  61194106800, #      utc_end 1940-03-01 03:00:00 (Fri)
  61183645200, #  local_start 1939-11-01 01:00:00 (Wed)
  61194096000, #    local_end 1940-03-01 00:00:00 (Fri)
  -10800,
  1,
  '-03',
      ],
      [
  61194106800, #    utc_start 1940-03-01 03:00:00 (Fri)
  61204651200, #      utc_end 1940-07-01 04:00:00 (Mon)
  61194092400, #  local_start 1940-02-29 23:00:00 (Thu)
  61204636800, #    local_end 1940-07-01 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  61204651200, #    utc_start 1940-07-01 04:00:00 (Mon)
  61234801200, #      utc_end 1941-06-15 03:00:00 (Sun)
  61204640400, #  local_start 1940-07-01 01:00:00 (Mon)
  61234790400, #    local_end 1941-06-15 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61234801200, #    utc_start 1941-06-15 03:00:00 (Sun)
  61245345600, #      utc_end 1941-10-15 04:00:00 (Wed)
  61234786800, #  local_start 1941-06-14 23:00:00 (Sat)
  61245331200, #    local_end 1941-10-15 00:00:00 (Wed)
  -14400,
  0,
  '-04',
      ],
      [
  61245345600, #    utc_start 1941-10-15 04:00:00 (Wed)
  61301934000, #      utc_end 1943-08-01 03:00:00 (Sun)
  61245334800, #  local_start 1941-10-15 01:00:00 (Wed)
  61301923200, #    local_end 1943-08-01 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61301934000, #    utc_start 1943-08-01 03:00:00 (Sun)
  61308417600, #      utc_end 1943-10-15 04:00:00 (Fri)
  61301919600, #  local_start 1943-07-31 23:00:00 (Sat)
  61308403200, #    local_end 1943-10-15 00:00:00 (Fri)
  -14400,
  0,
  '-04',
      ],
      [
  61308417600, #    utc_start 1943-10-15 04:00:00 (Fri)
  61383409200, #      utc_end 1946-03-01 03:00:00 (Fri)
  61308406800, #  local_start 1943-10-15 01:00:00 (Fri)
  61383398400, #    local_end 1946-03-01 00:00:00 (Fri)
  -10800,
  1,
  '-03',
      ],
      [
  61383409200, #    utc_start 1946-03-01 03:00:00 (Fri)
  61401902400, #      utc_end 1946-10-01 04:00:00 (Tue)
  61383394800, #  local_start 1946-02-28 23:00:00 (Thu)
  61401888000, #    local_end 1946-10-01 00:00:00 (Tue)
  -14400,
  0,
  '-04',
      ],
      [
  61401902400, #    utc_start 1946-10-01 04:00:00 (Tue)
  61938356400, #      utc_end 1963-10-01 03:00:00 (Tue)
  61401891600, #  local_start 1946-10-01 01:00:00 (Tue)
  61938345600, #    local_end 1963-10-01 00:00:00 (Tue)
  -10800,
  1,
  '-03',
      ],
      [
  61938356400, #    utc_start 1963-10-01 03:00:00 (Tue)
  61944840000, #      utc_end 1963-12-15 04:00:00 (Sun)
  61938342000, #  local_start 1963-09-30 23:00:00 (Mon)
  61944825600, #    local_end 1963-12-15 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  61944840000, #    utc_start 1963-12-15 04:00:00 (Sun)
  61951489200, #      utc_end 1964-03-01 03:00:00 (Sun)
  61944829200, #  local_start 1963-12-15 01:00:00 (Sun)
  61951478400, #    local_end 1964-03-01 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61951489200, #    utc_start 1964-03-01 03:00:00 (Sun)
  61971192000, #      utc_end 1964-10-15 04:00:00 (Thu)
  61951474800, #  local_start 1964-02-29 23:00:00 (Sat)
  61971177600, #    local_end 1964-10-15 00:00:00 (Thu)
  -14400,
  0,
  '-04',
      ],
      [
  61971192000, #    utc_start 1964-10-15 04:00:00 (Thu)
  61983025200, #      utc_end 1965-03-01 03:00:00 (Mon)
  61971181200, #  local_start 1964-10-15 01:00:00 (Thu)
  61983014400, #    local_end 1965-03-01 00:00:00 (Mon)
  -10800,
  1,
  '-03',
      ],
      [
  61983025200, #    utc_start 1965-03-01 03:00:00 (Mon)
  62002728000, #      utc_end 1965-10-15 04:00:00 (Fri)
  61983010800, #  local_start 1965-02-28 23:00:00 (Sun)
  62002713600, #    local_end 1965-10-15 00:00:00 (Fri)
  -14400,
  0,
  '-04',
      ],
      [
  62002728000, #    utc_start 1965-10-15 04:00:00 (Fri)
  62014561200, #      utc_end 1966-03-01 03:00:00 (Tue)
  62002717200, #  local_start 1965-10-15 01:00:00 (Fri)
  62014550400, #    local_end 1966-03-01 00:00:00 (Tue)
  -10800,
  1,
  '-03',
      ],
      [
  62014561200, #    utc_start 1966-03-01 03:00:00 (Tue)
  62034264000, #      utc_end 1966-10-15 04:00:00 (Sat)
  62014546800, #  local_start 1966-02-28 23:00:00 (Mon)
  62034249600, #    local_end 1966-10-15 00:00:00 (Sat)
  -14400,
  0,
  '-04',
      ],
      [
  62034264000, #    utc_start 1966-10-15 04:00:00 (Sat)
  62048862000, #      utc_end 1967-04-02 03:00:00 (Sun)
  62034253200, #  local_start 1966-10-15 01:00:00 (Sat)
  62048851200, #    local_end 1967-04-02 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62048862000, #    utc_start 1967-04-02 03:00:00 (Sun)
  62064590400, #      utc_end 1967-10-01 04:00:00 (Sun)
  62048847600, #  local_start 1967-04-01 23:00:00 (Sat)
  62064576000, #    local_end 1967-10-01 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62064590400, #    utc_start 1967-10-01 04:00:00 (Sun)
  62080916400, #      utc_end 1968-04-07 03:00:00 (Sun)
  62064579600, #  local_start 1967-10-01 01:00:00 (Sun)
  62080905600, #    local_end 1968-04-07 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62080916400, #    utc_start 1968-04-07 03:00:00 (Sun)
  62096644800, #      utc_end 1968-10-06 04:00:00 (Sun)
  62080902000, #  local_start 1968-04-06 23:00:00 (Sat)
  62096630400, #    local_end 1968-10-06 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62096644800, #    utc_start 1968-10-06 04:00:00 (Sun)
  62112366000, #      utc_end 1969-04-06 03:00:00 (Sun)
  62096634000, #  local_start 1968-10-06 01:00:00 (Sun)
  62112355200, #    local_end 1969-04-06 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62112366000, #    utc_start 1969-04-06 03:00:00 (Sun)
  62128094400, #      utc_end 1969-10-05 04:00:00 (Sun)
  62112351600, #  local_start 1969-04-05 23:00:00 (Sat)
  62128080000, #    local_end 1969-10-05 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62128094400, #    utc_start 1969-10-05 04:00:00 (Sun)
  62263825200, #      utc_end 1974-01-23 03:00:00 (Wed)
  62128083600, #  local_start 1969-10-05 01:00:00 (Sun)
  62263814400, #    local_end 1974-01-23 00:00:00 (Wed)
  -10800,
  0,
  '-03',
      ],
      [
  62263825200, #    utc_start 1974-01-23 03:00:00 (Wed)
  62272288800, #      utc_end 1974-05-01 02:00:00 (Wed)
  62263818000, #  local_start 1974-01-23 01:00:00 (Wed)
  62272281600, #    local_end 1974-05-01 00:00:00 (Wed)
  -7200,
  1,
  '-02',
      ],
      [
  62272288800, #    utc_start 1974-05-01 02:00:00 (Wed)
  62732631600, #      utc_end 1988-12-01 03:00:00 (Thu)
  62272278000, #  local_start 1974-04-30 23:00:00 (Tue)
  62732620800, #    local_end 1988-12-01 00:00:00 (Thu)
  -10800,
  0,
  '-03',
      ],
      [
  62732631600, #    utc_start 1988-12-01 03:00:00 (Thu)
  62740749600, #      utc_end 1989-03-05 02:00:00 (Sun)
  62732624400, #  local_start 1988-12-01 01:00:00 (Thu)
  62740742400, #    local_end 1989-03-05 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62740749600, #    utc_start 1989-03-05 02:00:00 (Sun)
  62760106800, #      utc_end 1989-10-15 03:00:00 (Sun)
  62740738800, #  local_start 1989-03-04 23:00:00 (Sat)
  62760096000, #    local_end 1989-10-15 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62760106800, #    utc_start 1989-10-15 03:00:00 (Sun)
  62772199200, #      utc_end 1990-03-04 02:00:00 (Sun)
  62760099600, #  local_start 1989-10-15 01:00:00 (Sun)
  62772192000, #    local_end 1990-03-04 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62772199200, #    utc_start 1990-03-04 02:00:00 (Sun)
  62792161200, #      utc_end 1990-10-21 03:00:00 (Sun)
  62772188400, #  local_start 1990-03-03 23:00:00 (Sat)
  62792150400, #    local_end 1990-10-21 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62792161200, #    utc_start 1990-10-21 03:00:00 (Sun)
  62803476000, #      utc_end 1991-03-01 02:00:00 (Fri)
  62792154000, #  local_start 1990-10-21 01:00:00 (Sun)
  62803468800, #    local_end 1991-03-01 00:00:00 (Fri)
  -7200,
  1,
  '-02',
      ],
      [
  62803476000, #    utc_start 1991-03-01 02:00:00 (Fri)
  62809272000, #      utc_end 1991-05-07 04:00:00 (Tue)
  62803461600, #  local_start 1991-02-28 22:00:00 (Thu)
  62809257600, #    local_end 1991-05-07 00:00:00 (Tue)
  -14400,
  0,
  '-04',
      ],
      [
  62809272000, #    utc_start 1991-05-07 04:00:00 (Tue)
  62823610800, #      utc_end 1991-10-20 03:00:00 (Sun)
  62809261200, #  local_start 1991-05-07 01:00:00 (Tue)
  62823600000, #    local_end 1991-10-20 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62823610800, #    utc_start 1991-10-20 03:00:00 (Sun)
  62835098400, #      utc_end 1992-03-01 02:00:00 (Sun)
  62823603600, #  local_start 1991-10-20 01:00:00 (Sun)
  62835091200, #    local_end 1992-03-01 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62835098400, #    utc_start 1992-03-01 02:00:00 (Sun)
  62855060400, #      utc_end 1992-10-18 03:00:00 (Sun)
  62835087600, #  local_start 1992-02-29 23:00:00 (Sat)
  62855049600, #    local_end 1992-10-18 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62855060400, #    utc_start 1992-10-18 03:00:00 (Sun)
  62867152800, #      utc_end 1993-03-07 02:00:00 (Sun)
  62855053200, #  local_start 1992-10-18 01:00:00 (Sun)
  62867145600, #    local_end 1993-03-07 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62867152800, #    utc_start 1993-03-07 02:00:00 (Sun)
  63074602800, #      utc_end 1999-10-03 03:00:00 (Sun)
  62867142000, #  local_start 1993-03-06 23:00:00 (Sat)
  63074592000, #    local_end 1999-10-03 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63074602800, #    utc_start 1999-10-03 03:00:00 (Sun)
  63087735600, #      utc_end 2000-03-03 03:00:00 (Fri)
  63074592000, #  local_start 1999-10-03 00:00:00 (Sun)
  63087724800, #    local_end 2000-03-03 00:00:00 (Fri)
  -10800,
  1,
  '-03',
      ],
      [
  63087735600, #    utc_start 2000-03-03 03:00:00 (Fri)
  63221655600, #      utc_end 2004-05-31 03:00:00 (Mon)
  63087724800, #  local_start 2000-03-03 00:00:00 (Fri)
  63221644800, #    local_end 2004-05-31 00:00:00 (Mon)
  -10800,
  0,
  '-03',
      ],
      [
  63221655600, #    utc_start 2004-05-31 03:00:00 (Mon)
  63226411200, #      utc_end 2004-07-25 04:00:00 (Sun)
  63221641200, #  local_start 2004-05-30 23:00:00 (Sun)
  63226396800, #    local_end 2004-07-25 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63226411200, #    utc_start 2004-07-25 04:00:00 (Sun)
  63334666800, #      utc_end 2007-12-30 03:00:00 (Sun)
  63226400400, #  local_start 2004-07-25 01:00:00 (Sun)
  63334656000, #    local_end 2007-12-30 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63334666800, #    utc_start 2007-12-30 03:00:00 (Sun)
  63341316000, #      utc_end 2008-03-16 02:00:00 (Sun)
  63334659600, #  local_start 2007-12-30 01:00:00 (Sun)
  63341308800, #    local_end 2008-03-16 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63341316000, #    utc_start 2008-03-16 02:00:00 (Sun)
  63359982000, #      utc_end 2008-10-18 03:00:00 (Sat)
  63341305200, #  local_start 2008-03-15 23:00:00 (Sat)
  63359971200, #    local_end 2008-10-18 00:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  63359982000, #    utc_start 2008-10-18 03:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  63359971200, #  local_start 2008-10-18 00:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #    local_end
  -10800,
  0,
  '-03',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {28}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_ARGENTINA_SAN_JUAN

    $main::fatpacked{"DateTime/TimeZone/America/Argentina/San_Luis.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_ARGENTINA_SAN_LUIS';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/southamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Argentina::San_Luis;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Argentina::San_Luis::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59763587124, #      utc_end 1894-10-31 04:25:24 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59763571200, #    local_end 1894-10-31 00:00:00 (Wed)
  -15924,
  0,
  'LMT',
      ],
      [
  59763587124, #    utc_start 1894-10-31 04:25:24 (Wed)
  60568229808, #      utc_end 1920-05-01 04:16:48 (Sat)
  59763571716, #  local_start 1894-10-31 00:08:36 (Wed)
  60568214400, #    local_end 1920-05-01 00:00:00 (Sat)
  -15408,
  0,
  'CMT',
      ],
      [
  60568229808, #    utc_start 1920-05-01 04:16:48 (Sat)
  60902251200, #      utc_end 1930-12-01 04:00:00 (Mon)
  60568215408, #  local_start 1920-05-01 00:16:48 (Sat)
  60902236800, #    local_end 1930-12-01 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  60902251200, #    utc_start 1930-12-01 04:00:00 (Mon)
  60912702000, #      utc_end 1931-04-01 03:00:00 (Wed)
  60902240400, #  local_start 1930-12-01 01:00:00 (Mon)
  60912691200, #    local_end 1931-04-01 00:00:00 (Wed)
  -10800,
  1,
  '-03',
      ],
      [
  60912702000, #    utc_start 1931-04-01 03:00:00 (Wed)
  60929726400, #      utc_end 1931-10-15 04:00:00 (Thu)
  60912687600, #  local_start 1931-03-31 23:00:00 (Tue)
  60929712000, #    local_end 1931-10-15 00:00:00 (Thu)
  -14400,
  0,
  '-04',
      ],
      [
  60929726400, #    utc_start 1931-10-15 04:00:00 (Thu)
  60941646000, #      utc_end 1932-03-01 03:00:00 (Tue)
  60929715600, #  local_start 1931-10-15 01:00:00 (Thu)
  60941635200, #    local_end 1932-03-01 00:00:00 (Tue)
  -10800,
  1,
  '-03',
      ],
      [
  60941646000, #    utc_start 1932-03-01 03:00:00 (Tue)
  60962817600, #      utc_end 1932-11-01 04:00:00 (Tue)
  60941631600, #  local_start 1932-02-29 23:00:00 (Mon)
  60962803200, #    local_end 1932-11-01 00:00:00 (Tue)
  -14400,
  0,
  '-04',
      ],
      [
  60962817600, #    utc_start 1932-11-01 04:00:00 (Tue)
  60973182000, #      utc_end 1933-03-01 03:00:00 (Wed)
  60962806800, #  local_start 1932-11-01 01:00:00 (Tue)
  60973171200, #    local_end 1933-03-01 00:00:00 (Wed)
  -10800,
  1,
  '-03',
      ],
      [
  60973182000, #    utc_start 1933-03-01 03:00:00 (Wed)
  60994353600, #      utc_end 1933-11-01 04:00:00 (Wed)
  60973167600, #  local_start 1933-02-28 23:00:00 (Tue)
  60994339200, #    local_end 1933-11-01 00:00:00 (Wed)
  -14400,
  0,
  '-04',
      ],
      [
  60994353600, #    utc_start 1933-11-01 04:00:00 (Wed)
  61004718000, #      utc_end 1934-03-01 03:00:00 (Thu)
  60994342800, #  local_start 1933-11-01 01:00:00 (Wed)
  61004707200, #    local_end 1934-03-01 00:00:00 (Thu)
  -10800,
  1,
  '-03',
      ],
      [
  61004718000, #    utc_start 1934-03-01 03:00:00 (Thu)
  61025889600, #      utc_end 1934-11-01 04:00:00 (Thu)
  61004703600, #  local_start 1934-02-28 23:00:00 (Wed)
  61025875200, #    local_end 1934-11-01 00:00:00 (Thu)
  -14400,
  0,
  '-04',
      ],
      [
  61025889600, #    utc_start 1934-11-01 04:00:00 (Thu)
  61036254000, #      utc_end 1935-03-01 03:00:00 (Fri)
  61025878800, #  local_start 1934-11-01 01:00:00 (Thu)
  61036243200, #    local_end 1935-03-01 00:00:00 (Fri)
  -10800,
  1,
  '-03',
      ],
      [
  61036254000, #    utc_start 1935-03-01 03:00:00 (Fri)
  61057425600, #      utc_end 1935-11-01 04:00:00 (Fri)
  61036239600, #  local_start 1935-02-28 23:00:00 (Thu)
  61057411200, #    local_end 1935-11-01 00:00:00 (Fri)
  -14400,
  0,
  '-04',
      ],
      [
  61057425600, #    utc_start 1935-11-01 04:00:00 (Fri)
  61067876400, #      utc_end 1936-03-01 03:00:00 (Sun)
  61057414800, #  local_start 1935-11-01 01:00:00 (Fri)
  61067865600, #    local_end 1936-03-01 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61067876400, #    utc_start 1936-03-01 03:00:00 (Sun)
  61089048000, #      utc_end 1936-11-01 04:00:00 (Sun)
  61067862000, #  local_start 1936-02-29 23:00:00 (Sat)
  61089033600, #    local_end 1936-11-01 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  61089048000, #    utc_start 1936-11-01 04:00:00 (Sun)
  61099412400, #      utc_end 1937-03-01 03:00:00 (Mon)
  61089037200, #  local_start 1936-11-01 01:00:00 (Sun)
  61099401600, #    local_end 1937-03-01 00:00:00 (Mon)
  -10800,
  1,
  '-03',
      ],
      [
  61099412400, #    utc_start 1937-03-01 03:00:00 (Mon)
  61120584000, #      utc_end 1937-11-01 04:00:00 (Mon)
  61099398000, #  local_start 1937-02-28 23:00:00 (Sun)
  61120569600, #    local_end 1937-11-01 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  61120584000, #    utc_start 1937-11-01 04:00:00 (Mon)
  61130948400, #      utc_end 1938-03-01 03:00:00 (Tue)
  61120573200, #  local_start 1937-11-01 01:00:00 (Mon)
  61130937600, #    local_end 1938-03-01 00:00:00 (Tue)
  -10800,
  1,
  '-03',
      ],
      [
  61130948400, #    utc_start 1938-03-01 03:00:00 (Tue)
  61152120000, #      utc_end 1938-11-01 04:00:00 (Tue)
  61130934000, #  local_start 1938-02-28 23:00:00 (Mon)
  61152105600, #    local_end 1938-11-01 00:00:00 (Tue)
  -14400,
  0,
  '-04',
      ],
      [
  61152120000, #    utc_start 1938-11-01 04:00:00 (Tue)
  61162484400, #      utc_end 1939-03-01 03:00:00 (Wed)
  61152109200, #  local_start 1938-11-01 01:00:00 (Tue)
  61162473600, #    local_end 1939-03-01 00:00:00 (Wed)
  -10800,
  1,
  '-03',
      ],
      [
  61162484400, #    utc_start 1939-03-01 03:00:00 (Wed)
  61183656000, #      utc_end 1939-11-01 04:00:00 (Wed)
  61162470000, #  local_start 1939-02-28 23:00:00 (Tue)
  61183641600, #    local_end 1939-11-01 00:00:00 (Wed)
  -14400,
  0,
  '-04',
      ],
      [
  61183656000, #    utc_start 1939-11-01 04:00:00 (Wed)
  61194106800, #      utc_end 1940-03-01 03:00:00 (Fri)
  61183645200, #  local_start 1939-11-01 01:00:00 (Wed)
  61194096000, #    local_end 1940-03-01 00:00:00 (Fri)
  -10800,
  1,
  '-03',
      ],
      [
  61194106800, #    utc_start 1940-03-01 03:00:00 (Fri)
  61204651200, #      utc_end 1940-07-01 04:00:00 (Mon)
  61194092400, #  local_start 1940-02-29 23:00:00 (Thu)
  61204636800, #    local_end 1940-07-01 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  61204651200, #    utc_start 1940-07-01 04:00:00 (Mon)
  61234801200, #      utc_end 1941-06-15 03:00:00 (Sun)
  61204640400, #  local_start 1940-07-01 01:00:00 (Mon)
  61234790400, #    local_end 1941-06-15 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61234801200, #    utc_start 1941-06-15 03:00:00 (Sun)
  61245345600, #      utc_end 1941-10-15 04:00:00 (Wed)
  61234786800, #  local_start 1941-06-14 23:00:00 (Sat)
  61245331200, #    local_end 1941-10-15 00:00:00 (Wed)
  -14400,
  0,
  '-04',
      ],
      [
  61245345600, #    utc_start 1941-10-15 04:00:00 (Wed)
  61301934000, #      utc_end 1943-08-01 03:00:00 (Sun)
  61245334800, #  local_start 1941-10-15 01:00:00 (Wed)
  61301923200, #    local_end 1943-08-01 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61301934000, #    utc_start 1943-08-01 03:00:00 (Sun)
  61308417600, #      utc_end 1943-10-15 04:00:00 (Fri)
  61301919600, #  local_start 1943-07-31 23:00:00 (Sat)
  61308403200, #    local_end 1943-10-15 00:00:00 (Fri)
  -14400,
  0,
  '-04',
      ],
      [
  61308417600, #    utc_start 1943-10-15 04:00:00 (Fri)
  61383409200, #      utc_end 1946-03-01 03:00:00 (Fri)
  61308406800, #  local_start 1943-10-15 01:00:00 (Fri)
  61383398400, #    local_end 1946-03-01 00:00:00 (Fri)
  -10800,
  1,
  '-03',
      ],
      [
  61383409200, #    utc_start 1946-03-01 03:00:00 (Fri)
  61401902400, #      utc_end 1946-10-01 04:00:00 (Tue)
  61383394800, #  local_start 1946-02-28 23:00:00 (Thu)
  61401888000, #    local_end 1946-10-01 00:00:00 (Tue)
  -14400,
  0,
  '-04',
      ],
      [
  61401902400, #    utc_start 1946-10-01 04:00:00 (Tue)
  61938356400, #      utc_end 1963-10-01 03:00:00 (Tue)
  61401891600, #  local_start 1946-10-01 01:00:00 (Tue)
  61938345600, #    local_end 1963-10-01 00:00:00 (Tue)
  -10800,
  1,
  '-03',
      ],
      [
  61938356400, #    utc_start 1963-10-01 03:00:00 (Tue)
  61944840000, #      utc_end 1963-12-15 04:00:00 (Sun)
  61938342000, #  local_start 1963-09-30 23:00:00 (Mon)
  61944825600, #    local_end 1963-12-15 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  61944840000, #    utc_start 1963-12-15 04:00:00 (Sun)
  61951489200, #      utc_end 1964-03-01 03:00:00 (Sun)
  61944829200, #  local_start 1963-12-15 01:00:00 (Sun)
  61951478400, #    local_end 1964-03-01 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61951489200, #    utc_start 1964-03-01 03:00:00 (Sun)
  61971192000, #      utc_end 1964-10-15 04:00:00 (Thu)
  61951474800, #  local_start 1964-02-29 23:00:00 (Sat)
  61971177600, #    local_end 1964-10-15 00:00:00 (Thu)
  -14400,
  0,
  '-04',
      ],
      [
  61971192000, #    utc_start 1964-10-15 04:00:00 (Thu)
  61983025200, #      utc_end 1965-03-01 03:00:00 (Mon)
  61971181200, #  local_start 1964-10-15 01:00:00 (Thu)
  61983014400, #    local_end 1965-03-01 00:00:00 (Mon)
  -10800,
  1,
  '-03',
      ],
      [
  61983025200, #    utc_start 1965-03-01 03:00:00 (Mon)
  62002728000, #      utc_end 1965-10-15 04:00:00 (Fri)
  61983010800, #  local_start 1965-02-28 23:00:00 (Sun)
  62002713600, #    local_end 1965-10-15 00:00:00 (Fri)
  -14400,
  0,
  '-04',
      ],
      [
  62002728000, #    utc_start 1965-10-15 04:00:00 (Fri)
  62014561200, #      utc_end 1966-03-01 03:00:00 (Tue)
  62002717200, #  local_start 1965-10-15 01:00:00 (Fri)
  62014550400, #    local_end 1966-03-01 00:00:00 (Tue)
  -10800,
  1,
  '-03',
      ],
      [
  62014561200, #    utc_start 1966-03-01 03:00:00 (Tue)
  62034264000, #      utc_end 1966-10-15 04:00:00 (Sat)
  62014546800, #  local_start 1966-02-28 23:00:00 (Mon)
  62034249600, #    local_end 1966-10-15 00:00:00 (Sat)
  -14400,
  0,
  '-04',
      ],
      [
  62034264000, #    utc_start 1966-10-15 04:00:00 (Sat)
  62048862000, #      utc_end 1967-04-02 03:00:00 (Sun)
  62034253200, #  local_start 1966-10-15 01:00:00 (Sat)
  62048851200, #    local_end 1967-04-02 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62048862000, #    utc_start 1967-04-02 03:00:00 (Sun)
  62064590400, #      utc_end 1967-10-01 04:00:00 (Sun)
  62048847600, #  local_start 1967-04-01 23:00:00 (Sat)
  62064576000, #    local_end 1967-10-01 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62064590400, #    utc_start 1967-10-01 04:00:00 (Sun)
  62080916400, #      utc_end 1968-04-07 03:00:00 (Sun)
  62064579600, #  local_start 1967-10-01 01:00:00 (Sun)
  62080905600, #    local_end 1968-04-07 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62080916400, #    utc_start 1968-04-07 03:00:00 (Sun)
  62096644800, #      utc_end 1968-10-06 04:00:00 (Sun)
  62080902000, #  local_start 1968-04-06 23:00:00 (Sat)
  62096630400, #    local_end 1968-10-06 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62096644800, #    utc_start 1968-10-06 04:00:00 (Sun)
  62112366000, #      utc_end 1969-04-06 03:00:00 (Sun)
  62096634000, #  local_start 1968-10-06 01:00:00 (Sun)
  62112355200, #    local_end 1969-04-06 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62112366000, #    utc_start 1969-04-06 03:00:00 (Sun)
  62128094400, #      utc_end 1969-10-05 04:00:00 (Sun)
  62112351600, #  local_start 1969-04-05 23:00:00 (Sat)
  62128080000, #    local_end 1969-10-05 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62128094400, #    utc_start 1969-10-05 04:00:00 (Sun)
  62263825200, #      utc_end 1974-01-23 03:00:00 (Wed)
  62128083600, #  local_start 1969-10-05 01:00:00 (Sun)
  62263814400, #    local_end 1974-01-23 00:00:00 (Wed)
  -10800,
  0,
  '-03',
      ],
      [
  62263825200, #    utc_start 1974-01-23 03:00:00 (Wed)
  62272288800, #      utc_end 1974-05-01 02:00:00 (Wed)
  62263818000, #  local_start 1974-01-23 01:00:00 (Wed)
  62272281600, #    local_end 1974-05-01 00:00:00 (Wed)
  -7200,
  1,
  '-02',
      ],
      [
  62272288800, #    utc_start 1974-05-01 02:00:00 (Wed)
  62732631600, #      utc_end 1988-12-01 03:00:00 (Thu)
  62272278000, #  local_start 1974-04-30 23:00:00 (Tue)
  62732620800, #    local_end 1988-12-01 00:00:00 (Thu)
  -10800,
  0,
  '-03',
      ],
      [
  62732631600, #    utc_start 1988-12-01 03:00:00 (Thu)
  62740749600, #      utc_end 1989-03-05 02:00:00 (Sun)
  62732624400, #  local_start 1988-12-01 01:00:00 (Thu)
  62740742400, #    local_end 1989-03-05 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62740749600, #    utc_start 1989-03-05 02:00:00 (Sun)
  62760106800, #      utc_end 1989-10-15 03:00:00 (Sun)
  62740738800, #  local_start 1989-03-04 23:00:00 (Sat)
  62760096000, #    local_end 1989-10-15 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62760106800, #    utc_start 1989-10-15 03:00:00 (Sun)
  62766842400, #      utc_end 1990-01-01 02:00:00 (Mon)
  62760099600, #  local_start 1989-10-15 01:00:00 (Sun)
  62766835200, #    local_end 1990-01-01 00:00:00 (Mon)
  -7200,
  1,
  '-02',
      ],
      [
  62766842400, #    utc_start 1990-01-01 02:00:00 (Mon)
  62773063200, #      utc_end 1990-03-14 02:00:00 (Wed)
  62766835200, #  local_start 1990-01-01 00:00:00 (Mon)
  62773056000, #    local_end 1990-03-14 00:00:00 (Wed)
  -7200,
  1,
  '-02',
      ],
      [
  62773063200, #    utc_start 1990-03-14 02:00:00 (Wed)
  62791646400, #      utc_end 1990-10-15 04:00:00 (Mon)
  62773048800, #  local_start 1990-03-13 22:00:00 (Tue)
  62791632000, #    local_end 1990-10-15 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  62791646400, #    utc_start 1990-10-15 04:00:00 (Mon)
  62803479600, #      utc_end 1991-03-01 03:00:00 (Fri)
  62791635600, #  local_start 1990-10-15 01:00:00 (Mon)
  62803468800, #    local_end 1991-03-01 00:00:00 (Fri)
  -10800,
  1,
  '-03',
      ],
      [
  62803479600, #    utc_start 1991-03-01 03:00:00 (Fri)
  62811432000, #      utc_end 1991-06-01 04:00:00 (Sat)
  62803465200, #  local_start 1991-02-28 23:00:00 (Thu)
  62811417600, #    local_end 1991-06-01 00:00:00 (Sat)
  -14400,
  0,
  '-04',
      ],
      [
  62811432000, #    utc_start 1991-06-01 04:00:00 (Sat)
  63074602800, #      utc_end 1999-10-03 03:00:00 (Sun)
  62811421200, #  local_start 1991-06-01 01:00:00 (Sat)
  63074592000, #    local_end 1999-10-03 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63074602800, #    utc_start 1999-10-03 03:00:00 (Sun)
  63087735600, #      utc_end 2000-03-03 03:00:00 (Fri)
  63074592000, #  local_start 1999-10-03 00:00:00 (Sun)
  63087724800, #    local_end 2000-03-03 00:00:00 (Fri)
  -10800,
  1,
  '-03',
      ],
      [
  63087735600, #    utc_start 2000-03-03 03:00:00 (Fri)
  63221655600, #      utc_end 2004-05-31 03:00:00 (Mon)
  63087724800, #  local_start 2000-03-03 00:00:00 (Fri)
  63221644800, #    local_end 2004-05-31 00:00:00 (Mon)
  -10800,
  0,
  '-03',
      ],
      [
  63221655600, #    utc_start 2004-05-31 03:00:00 (Mon)
  63226411200, #      utc_end 2004-07-25 04:00:00 (Sun)
  63221641200, #  local_start 2004-05-30 23:00:00 (Sun)
  63226396800, #    local_end 2004-07-25 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63226411200, #    utc_start 2004-07-25 04:00:00 (Sun)
  63334666800, #      utc_end 2007-12-30 03:00:00 (Sun)
  63226400400, #  local_start 2004-07-25 01:00:00 (Sun)
  63334656000, #    local_end 2007-12-30 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63334666800, #    utc_start 2007-12-30 03:00:00 (Sun)
  63336564000, #      utc_end 2008-01-21 02:00:00 (Mon)
  63334659600, #  local_start 2007-12-30 01:00:00 (Sun)
  63336556800, #    local_end 2008-01-21 00:00:00 (Mon)
  -7200,
  1,
  '-02',
      ],
      [
  63336564000, #    utc_start 2008-01-21 02:00:00 (Mon)
  63340714800, #      utc_end 2008-03-09 03:00:00 (Sun)
  63336553200, #  local_start 2008-01-20 23:00:00 (Sun)
  63340704000, #    local_end 2008-03-09 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63340714800, #    utc_start 2008-03-09 03:00:00 (Sun)
  63359467200, #      utc_end 2008-10-12 04:00:00 (Sun)
  63340700400, #  local_start 2008-03-08 23:00:00 (Sat)
  63359452800, #    local_end 2008-10-12 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63359467200, #    utc_start 2008-10-12 04:00:00 (Sun)
  63372164400, #      utc_end 2009-03-08 03:00:00 (Sun)
  63359456400, #  local_start 2008-10-12 01:00:00 (Sun)
  63372153600, #    local_end 2009-03-08 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63372164400, #    utc_start 2009-03-08 03:00:00 (Sun)
  63390916800, #      utc_end 2009-10-11 04:00:00 (Sun)
  63372150000, #  local_start 2009-03-07 23:00:00 (Sat)
  63390902400, #    local_end 2009-10-11 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63390916800, #    utc_start 2009-10-11 04:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #      utc_end
  63390906000, #  local_start 2009-10-11 01:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  -10800,
  0,
  '-03',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {29}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_ARGENTINA_SAN_LUIS

    $main::fatpacked{"DateTime/TimeZone/America/Argentina/Tucuman.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_ARGENTINA_TUCUMAN';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/southamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Argentina::Tucuman;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Argentina::Tucuman::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59763586852, #      utc_end 1894-10-31 04:20:52 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59763571200, #    local_end 1894-10-31 00:00:00 (Wed)
  -15652,
  0,
  'LMT',
      ],
      [
  59763586852, #    utc_start 1894-10-31 04:20:52 (Wed)
  60568229808, #      utc_end 1920-05-01 04:16:48 (Sat)
  59763571444, #  local_start 1894-10-31 00:04:04 (Wed)
  60568214400, #    local_end 1920-05-01 00:00:00 (Sat)
  -15408,
  0,
  'CMT',
      ],
      [
  60568229808, #    utc_start 1920-05-01 04:16:48 (Sat)
  60902251200, #      utc_end 1930-12-01 04:00:00 (Mon)
  60568215408, #  local_start 1920-05-01 00:16:48 (Sat)
  60902236800, #    local_end 1930-12-01 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  60902251200, #    utc_start 1930-12-01 04:00:00 (Mon)
  60912702000, #      utc_end 1931-04-01 03:00:00 (Wed)
  60902240400, #  local_start 1930-12-01 01:00:00 (Mon)
  60912691200, #    local_end 1931-04-01 00:00:00 (Wed)
  -10800,
  1,
  '-03',
      ],
      [
  60912702000, #    utc_start 1931-04-01 03:00:00 (Wed)
  60929726400, #      utc_end 1931-10-15 04:00:00 (Thu)
  60912687600, #  local_start 1931-03-31 23:00:00 (Tue)
  60929712000, #    local_end 1931-10-15 00:00:00 (Thu)
  -14400,
  0,
  '-04',
      ],
      [
  60929726400, #    utc_start 1931-10-15 04:00:00 (Thu)
  60941646000, #      utc_end 1932-03-01 03:00:00 (Tue)
  60929715600, #  local_start 1931-10-15 01:00:00 (Thu)
  60941635200, #    local_end 1932-03-01 00:00:00 (Tue)
  -10800,
  1,
  '-03',
      ],
      [
  60941646000, #    utc_start 1932-03-01 03:00:00 (Tue)
  60962817600, #      utc_end 1932-11-01 04:00:00 (Tue)
  60941631600, #  local_start 1932-02-29 23:00:00 (Mon)
  60962803200, #    local_end 1932-11-01 00:00:00 (Tue)
  -14400,
  0,
  '-04',
      ],
      [
  60962817600, #    utc_start 1932-11-01 04:00:00 (Tue)
  60973182000, #      utc_end 1933-03-01 03:00:00 (Wed)
  60962806800, #  local_start 1932-11-01 01:00:00 (Tue)
  60973171200, #    local_end 1933-03-01 00:00:00 (Wed)
  -10800,
  1,
  '-03',
      ],
      [
  60973182000, #    utc_start 1933-03-01 03:00:00 (Wed)
  60994353600, #      utc_end 1933-11-01 04:00:00 (Wed)
  60973167600, #  local_start 1933-02-28 23:00:00 (Tue)
  60994339200, #    local_end 1933-11-01 00:00:00 (Wed)
  -14400,
  0,
  '-04',
      ],
      [
  60994353600, #    utc_start 1933-11-01 04:00:00 (Wed)
  61004718000, #      utc_end 1934-03-01 03:00:00 (Thu)
  60994342800, #  local_start 1933-11-01 01:00:00 (Wed)
  61004707200, #    local_end 1934-03-01 00:00:00 (Thu)
  -10800,
  1,
  '-03',
      ],
      [
  61004718000, #    utc_start 1934-03-01 03:00:00 (Thu)
  61025889600, #      utc_end 1934-11-01 04:00:00 (Thu)
  61004703600, #  local_start 1934-02-28 23:00:00 (Wed)
  61025875200, #    local_end 1934-11-01 00:00:00 (Thu)
  -14400,
  0,
  '-04',
      ],
      [
  61025889600, #    utc_start 1934-11-01 04:00:00 (Thu)
  61036254000, #      utc_end 1935-03-01 03:00:00 (Fri)
  61025878800, #  local_start 1934-11-01 01:00:00 (Thu)
  61036243200, #    local_end 1935-03-01 00:00:00 (Fri)
  -10800,
  1,
  '-03',
      ],
      [
  61036254000, #    utc_start 1935-03-01 03:00:00 (Fri)
  61057425600, #      utc_end 1935-11-01 04:00:00 (Fri)
  61036239600, #  local_start 1935-02-28 23:00:00 (Thu)
  61057411200, #    local_end 1935-11-01 00:00:00 (Fri)
  -14400,
  0,
  '-04',
      ],
      [
  61057425600, #    utc_start 1935-11-01 04:00:00 (Fri)
  61067876400, #      utc_end 1936-03-01 03:00:00 (Sun)
  61057414800, #  local_start 1935-11-01 01:00:00 (Fri)
  61067865600, #    local_end 1936-03-01 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61067876400, #    utc_start 1936-03-01 03:00:00 (Sun)
  61089048000, #      utc_end 1936-11-01 04:00:00 (Sun)
  61067862000, #  local_start 1936-02-29 23:00:00 (Sat)
  61089033600, #    local_end 1936-11-01 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  61089048000, #    utc_start 1936-11-01 04:00:00 (Sun)
  61099412400, #      utc_end 1937-03-01 03:00:00 (Mon)
  61089037200, #  local_start 1936-11-01 01:00:00 (Sun)
  61099401600, #    local_end 1937-03-01 00:00:00 (Mon)
  -10800,
  1,
  '-03',
      ],
      [
  61099412400, #    utc_start 1937-03-01 03:00:00 (Mon)
  61120584000, #      utc_end 1937-11-01 04:00:00 (Mon)
  61099398000, #  local_start 1937-02-28 23:00:00 (Sun)
  61120569600, #    local_end 1937-11-01 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  61120584000, #    utc_start 1937-11-01 04:00:00 (Mon)
  61130948400, #      utc_end 1938-03-01 03:00:00 (Tue)
  61120573200, #  local_start 1937-11-01 01:00:00 (Mon)
  61130937600, #    local_end 1938-03-01 00:00:00 (Tue)
  -10800,
  1,
  '-03',
      ],
      [
  61130948400, #    utc_start 1938-03-01 03:00:00 (Tue)
  61152120000, #      utc_end 1938-11-01 04:00:00 (Tue)
  61130934000, #  local_start 1938-02-28 23:00:00 (Mon)
  61152105600, #    local_end 1938-11-01 00:00:00 (Tue)
  -14400,
  0,
  '-04',
      ],
      [
  61152120000, #    utc_start 1938-11-01 04:00:00 (Tue)
  61162484400, #      utc_end 1939-03-01 03:00:00 (Wed)
  61152109200, #  local_start 1938-11-01 01:00:00 (Tue)
  61162473600, #    local_end 1939-03-01 00:00:00 (Wed)
  -10800,
  1,
  '-03',
      ],
      [
  61162484400, #    utc_start 1939-03-01 03:00:00 (Wed)
  61183656000, #      utc_end 1939-11-01 04:00:00 (Wed)
  61162470000, #  local_start 1939-02-28 23:00:00 (Tue)
  61183641600, #    local_end 1939-11-01 00:00:00 (Wed)
  -14400,
  0,
  '-04',
      ],
      [
  61183656000, #    utc_start 1939-11-01 04:00:00 (Wed)
  61194106800, #      utc_end 1940-03-01 03:00:00 (Fri)
  61183645200, #  local_start 1939-11-01 01:00:00 (Wed)
  61194096000, #    local_end 1940-03-01 00:00:00 (Fri)
  -10800,
  1,
  '-03',
      ],
      [
  61194106800, #    utc_start 1940-03-01 03:00:00 (Fri)
  61204651200, #      utc_end 1940-07-01 04:00:00 (Mon)
  61194092400, #  local_start 1940-02-29 23:00:00 (Thu)
  61204636800, #    local_end 1940-07-01 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  61204651200, #    utc_start 1940-07-01 04:00:00 (Mon)
  61234801200, #      utc_end 1941-06-15 03:00:00 (Sun)
  61204640400, #  local_start 1940-07-01 01:00:00 (Mon)
  61234790400, #    local_end 1941-06-15 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61234801200, #    utc_start 1941-06-15 03:00:00 (Sun)
  61245345600, #      utc_end 1941-10-15 04:00:00 (Wed)
  61234786800, #  local_start 1941-06-14 23:00:00 (Sat)
  61245331200, #    local_end 1941-10-15 00:00:00 (Wed)
  -14400,
  0,
  '-04',
      ],
      [
  61245345600, #    utc_start 1941-10-15 04:00:00 (Wed)
  61301934000, #      utc_end 1943-08-01 03:00:00 (Sun)
  61245334800, #  local_start 1941-10-15 01:00:00 (Wed)
  61301923200, #    local_end 1943-08-01 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61301934000, #    utc_start 1943-08-01 03:00:00 (Sun)
  61308417600, #      utc_end 1943-10-15 04:00:00 (Fri)
  61301919600, #  local_start 1943-07-31 23:00:00 (Sat)
  61308403200, #    local_end 1943-10-15 00:00:00 (Fri)
  -14400,
  0,
  '-04',
      ],
      [
  61308417600, #    utc_start 1943-10-15 04:00:00 (Fri)
  61383409200, #      utc_end 1946-03-01 03:00:00 (Fri)
  61308406800, #  local_start 1943-10-15 01:00:00 (Fri)
  61383398400, #    local_end 1946-03-01 00:00:00 (Fri)
  -10800,
  1,
  '-03',
      ],
      [
  61383409200, #    utc_start 1946-03-01 03:00:00 (Fri)
  61401902400, #      utc_end 1946-10-01 04:00:00 (Tue)
  61383394800, #  local_start 1946-02-28 23:00:00 (Thu)
  61401888000, #    local_end 1946-10-01 00:00:00 (Tue)
  -14400,
  0,
  '-04',
      ],
      [
  61401902400, #    utc_start 1946-10-01 04:00:00 (Tue)
  61938356400, #      utc_end 1963-10-01 03:00:00 (Tue)
  61401891600, #  local_start 1946-10-01 01:00:00 (Tue)
  61938345600, #    local_end 1963-10-01 00:00:00 (Tue)
  -10800,
  1,
  '-03',
      ],
      [
  61938356400, #    utc_start 1963-10-01 03:00:00 (Tue)
  61944840000, #      utc_end 1963-12-15 04:00:00 (Sun)
  61938342000, #  local_start 1963-09-30 23:00:00 (Mon)
  61944825600, #    local_end 1963-12-15 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  61944840000, #    utc_start 1963-12-15 04:00:00 (Sun)
  61951489200, #      utc_end 1964-03-01 03:00:00 (Sun)
  61944829200, #  local_start 1963-12-15 01:00:00 (Sun)
  61951478400, #    local_end 1964-03-01 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61951489200, #    utc_start 1964-03-01 03:00:00 (Sun)
  61971192000, #      utc_end 1964-10-15 04:00:00 (Thu)
  61951474800, #  local_start 1964-02-29 23:00:00 (Sat)
  61971177600, #    local_end 1964-10-15 00:00:00 (Thu)
  -14400,
  0,
  '-04',
      ],
      [
  61971192000, #    utc_start 1964-10-15 04:00:00 (Thu)
  61983025200, #      utc_end 1965-03-01 03:00:00 (Mon)
  61971181200, #  local_start 1964-10-15 01:00:00 (Thu)
  61983014400, #    local_end 1965-03-01 00:00:00 (Mon)
  -10800,
  1,
  '-03',
      ],
      [
  61983025200, #    utc_start 1965-03-01 03:00:00 (Mon)
  62002728000, #      utc_end 1965-10-15 04:00:00 (Fri)
  61983010800, #  local_start 1965-02-28 23:00:00 (Sun)
  62002713600, #    local_end 1965-10-15 00:00:00 (Fri)
  -14400,
  0,
  '-04',
      ],
      [
  62002728000, #    utc_start 1965-10-15 04:00:00 (Fri)
  62014561200, #      utc_end 1966-03-01 03:00:00 (Tue)
  62002717200, #  local_start 1965-10-15 01:00:00 (Fri)
  62014550400, #    local_end 1966-03-01 00:00:00 (Tue)
  -10800,
  1,
  '-03',
      ],
      [
  62014561200, #    utc_start 1966-03-01 03:00:00 (Tue)
  62034264000, #      utc_end 1966-10-15 04:00:00 (Sat)
  62014546800, #  local_start 1966-02-28 23:00:00 (Mon)
  62034249600, #    local_end 1966-10-15 00:00:00 (Sat)
  -14400,
  0,
  '-04',
      ],
      [
  62034264000, #    utc_start 1966-10-15 04:00:00 (Sat)
  62048862000, #      utc_end 1967-04-02 03:00:00 (Sun)
  62034253200, #  local_start 1966-10-15 01:00:00 (Sat)
  62048851200, #    local_end 1967-04-02 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62048862000, #    utc_start 1967-04-02 03:00:00 (Sun)
  62064590400, #      utc_end 1967-10-01 04:00:00 (Sun)
  62048847600, #  local_start 1967-04-01 23:00:00 (Sat)
  62064576000, #    local_end 1967-10-01 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62064590400, #    utc_start 1967-10-01 04:00:00 (Sun)
  62080916400, #      utc_end 1968-04-07 03:00:00 (Sun)
  62064579600, #  local_start 1967-10-01 01:00:00 (Sun)
  62080905600, #    local_end 1968-04-07 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62080916400, #    utc_start 1968-04-07 03:00:00 (Sun)
  62096644800, #      utc_end 1968-10-06 04:00:00 (Sun)
  62080902000, #  local_start 1968-04-06 23:00:00 (Sat)
  62096630400, #    local_end 1968-10-06 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62096644800, #    utc_start 1968-10-06 04:00:00 (Sun)
  62112366000, #      utc_end 1969-04-06 03:00:00 (Sun)
  62096634000, #  local_start 1968-10-06 01:00:00 (Sun)
  62112355200, #    local_end 1969-04-06 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62112366000, #    utc_start 1969-04-06 03:00:00 (Sun)
  62128094400, #      utc_end 1969-10-05 04:00:00 (Sun)
  62112351600, #  local_start 1969-04-05 23:00:00 (Sat)
  62128080000, #    local_end 1969-10-05 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62128094400, #    utc_start 1969-10-05 04:00:00 (Sun)
  62263825200, #      utc_end 1974-01-23 03:00:00 (Wed)
  62128083600, #  local_start 1969-10-05 01:00:00 (Sun)
  62263814400, #    local_end 1974-01-23 00:00:00 (Wed)
  -10800,
  0,
  '-03',
      ],
      [
  62263825200, #    utc_start 1974-01-23 03:00:00 (Wed)
  62272288800, #      utc_end 1974-05-01 02:00:00 (Wed)
  62263818000, #  local_start 1974-01-23 01:00:00 (Wed)
  62272281600, #    local_end 1974-05-01 00:00:00 (Wed)
  -7200,
  1,
  '-02',
      ],
      [
  62272288800, #    utc_start 1974-05-01 02:00:00 (Wed)
  62732631600, #      utc_end 1988-12-01 03:00:00 (Thu)
  62272278000, #  local_start 1974-04-30 23:00:00 (Tue)
  62732620800, #    local_end 1988-12-01 00:00:00 (Thu)
  -10800,
  0,
  '-03',
      ],
      [
  62732631600, #    utc_start 1988-12-01 03:00:00 (Thu)
  62740749600, #      utc_end 1989-03-05 02:00:00 (Sun)
  62732624400, #  local_start 1988-12-01 01:00:00 (Thu)
  62740742400, #    local_end 1989-03-05 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62740749600, #    utc_start 1989-03-05 02:00:00 (Sun)
  62760106800, #      utc_end 1989-10-15 03:00:00 (Sun)
  62740738800, #  local_start 1989-03-04 23:00:00 (Sat)
  62760096000, #    local_end 1989-10-15 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62760106800, #    utc_start 1989-10-15 03:00:00 (Sun)
  62772199200, #      utc_end 1990-03-04 02:00:00 (Sun)
  62760099600, #  local_start 1989-10-15 01:00:00 (Sun)
  62772192000, #    local_end 1990-03-04 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62772199200, #    utc_start 1990-03-04 02:00:00 (Sun)
  62792161200, #      utc_end 1990-10-21 03:00:00 (Sun)
  62772188400, #  local_start 1990-03-03 23:00:00 (Sat)
  62792150400, #    local_end 1990-10-21 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62792161200, #    utc_start 1990-10-21 03:00:00 (Sun)
  62803648800, #      utc_end 1991-03-03 02:00:00 (Sun)
  62792154000, #  local_start 1990-10-21 01:00:00 (Sun)
  62803641600, #    local_end 1991-03-03 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62803648800, #    utc_start 1991-03-03 02:00:00 (Sun)
  62823614400, #      utc_end 1991-10-20 04:00:00 (Sun)
  62803634400, #  local_start 1991-03-02 22:00:00 (Sat)
  62823600000, #    local_end 1991-10-20 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62823614400, #    utc_start 1991-10-20 04:00:00 (Sun)
  62835098400, #      utc_end 1992-03-01 02:00:00 (Sun)
  62823607200, #  local_start 1991-10-20 02:00:00 (Sun)
  62835091200, #    local_end 1992-03-01 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62835098400, #    utc_start 1992-03-01 02:00:00 (Sun)
  62855060400, #      utc_end 1992-10-18 03:00:00 (Sun)
  62835087600, #  local_start 1992-02-29 23:00:00 (Sat)
  62855049600, #    local_end 1992-10-18 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62855060400, #    utc_start 1992-10-18 03:00:00 (Sun)
  62867152800, #      utc_end 1993-03-07 02:00:00 (Sun)
  62855053200, #  local_start 1992-10-18 01:00:00 (Sun)
  62867145600, #    local_end 1993-03-07 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62867152800, #    utc_start 1993-03-07 02:00:00 (Sun)
  63074602800, #      utc_end 1999-10-03 03:00:00 (Sun)
  62867142000, #  local_start 1993-03-06 23:00:00 (Sat)
  63074592000, #    local_end 1999-10-03 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63074602800, #    utc_start 1999-10-03 03:00:00 (Sun)
  63087735600, #      utc_end 2000-03-03 03:00:00 (Fri)
  63074592000, #  local_start 1999-10-03 00:00:00 (Sun)
  63087724800, #    local_end 2000-03-03 00:00:00 (Fri)
  -10800,
  1,
  '-03',
      ],
      [
  63087735600, #    utc_start 2000-03-03 03:00:00 (Fri)
  63221742000, #      utc_end 2004-06-01 03:00:00 (Tue)
  63087724800, #  local_start 2000-03-03 00:00:00 (Fri)
  63221731200, #    local_end 2004-06-01 00:00:00 (Tue)
  -10800,
  0,
  '-03',
      ],
      [
  63221742000, #    utc_start 2004-06-01 03:00:00 (Tue)
  63222782400, #      utc_end 2004-06-13 04:00:00 (Sun)
  63221727600, #  local_start 2004-05-31 23:00:00 (Mon)
  63222768000, #    local_end 2004-06-13 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63222782400, #    utc_start 2004-06-13 04:00:00 (Sun)
  63334666800, #      utc_end 2007-12-30 03:00:00 (Sun)
  63222771600, #  local_start 2004-06-13 01:00:00 (Sun)
  63334656000, #    local_end 2007-12-30 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63334666800, #    utc_start 2007-12-30 03:00:00 (Sun)
  63341316000, #      utc_end 2008-03-16 02:00:00 (Sun)
  63334659600, #  local_start 2007-12-30 01:00:00 (Sun)
  63341308800, #    local_end 2008-03-16 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63341316000, #    utc_start 2008-03-16 02:00:00 (Sun)
  63360068400, #      utc_end 2008-10-19 03:00:00 (Sun)
  63341305200, #  local_start 2008-03-15 23:00:00 (Sat)
  63360057600, #    local_end 2008-10-19 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63360068400, #    utc_start 2008-10-19 03:00:00 (Sun)
  63372765600, #      utc_end 2009-03-15 02:00:00 (Sun)
  63360061200, #  local_start 2008-10-19 01:00:00 (Sun)
  63372758400, #    local_end 2009-03-15 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63372765600, #    utc_start 2009-03-15 02:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #      utc_end
  63372754800, #  local_start 2009-03-14 23:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #    local_end
  -10800,
  0,
  '-03',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {29}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_ARGENTINA_TUCUMAN

    $main::fatpacked{"DateTime/TimeZone/America/Argentina/Ushuaia.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_ARGENTINA_USHUAIA';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/southamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Argentina::Ushuaia;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Argentina::Ushuaia::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59763587592, #      utc_end 1894-10-31 04:33:12 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59763571200, #    local_end 1894-10-31 00:00:00 (Wed)
  -16392,
  0,
  'LMT',
      ],
      [
  59763587592, #    utc_start 1894-10-31 04:33:12 (Wed)
  60568229808, #      utc_end 1920-05-01 04:16:48 (Sat)
  59763572184, #  local_start 1894-10-31 00:16:24 (Wed)
  60568214400, #    local_end 1920-05-01 00:00:00 (Sat)
  -15408,
  0,
  'CMT',
      ],
      [
  60568229808, #    utc_start 1920-05-01 04:16:48 (Sat)
  60902251200, #      utc_end 1930-12-01 04:00:00 (Mon)
  60568215408, #  local_start 1920-05-01 00:16:48 (Sat)
  60902236800, #    local_end 1930-12-01 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  60902251200, #    utc_start 1930-12-01 04:00:00 (Mon)
  60912702000, #      utc_end 1931-04-01 03:00:00 (Wed)
  60902240400, #  local_start 1930-12-01 01:00:00 (Mon)
  60912691200, #    local_end 1931-04-01 00:00:00 (Wed)
  -10800,
  1,
  '-03',
      ],
      [
  60912702000, #    utc_start 1931-04-01 03:00:00 (Wed)
  60929726400, #      utc_end 1931-10-15 04:00:00 (Thu)
  60912687600, #  local_start 1931-03-31 23:00:00 (Tue)
  60929712000, #    local_end 1931-10-15 00:00:00 (Thu)
  -14400,
  0,
  '-04',
      ],
      [
  60929726400, #    utc_start 1931-10-15 04:00:00 (Thu)
  60941646000, #      utc_end 1932-03-01 03:00:00 (Tue)
  60929715600, #  local_start 1931-10-15 01:00:00 (Thu)
  60941635200, #    local_end 1932-03-01 00:00:00 (Tue)
  -10800,
  1,
  '-03',
      ],
      [
  60941646000, #    utc_start 1932-03-01 03:00:00 (Tue)
  60962817600, #      utc_end 1932-11-01 04:00:00 (Tue)
  60941631600, #  local_start 1932-02-29 23:00:00 (Mon)
  60962803200, #    local_end 1932-11-01 00:00:00 (Tue)
  -14400,
  0,
  '-04',
      ],
      [
  60962817600, #    utc_start 1932-11-01 04:00:00 (Tue)
  60973182000, #      utc_end 1933-03-01 03:00:00 (Wed)
  60962806800, #  local_start 1932-11-01 01:00:00 (Tue)
  60973171200, #    local_end 1933-03-01 00:00:00 (Wed)
  -10800,
  1,
  '-03',
      ],
      [
  60973182000, #    utc_start 1933-03-01 03:00:00 (Wed)
  60994353600, #      utc_end 1933-11-01 04:00:00 (Wed)
  60973167600, #  local_start 1933-02-28 23:00:00 (Tue)
  60994339200, #    local_end 1933-11-01 00:00:00 (Wed)
  -14400,
  0,
  '-04',
      ],
      [
  60994353600, #    utc_start 1933-11-01 04:00:00 (Wed)
  61004718000, #      utc_end 1934-03-01 03:00:00 (Thu)
  60994342800, #  local_start 1933-11-01 01:00:00 (Wed)
  61004707200, #    local_end 1934-03-01 00:00:00 (Thu)
  -10800,
  1,
  '-03',
      ],
      [
  61004718000, #    utc_start 1934-03-01 03:00:00 (Thu)
  61025889600, #      utc_end 1934-11-01 04:00:00 (Thu)
  61004703600, #  local_start 1934-02-28 23:00:00 (Wed)
  61025875200, #    local_end 1934-11-01 00:00:00 (Thu)
  -14400,
  0,
  '-04',
      ],
      [
  61025889600, #    utc_start 1934-11-01 04:00:00 (Thu)
  61036254000, #      utc_end 1935-03-01 03:00:00 (Fri)
  61025878800, #  local_start 1934-11-01 01:00:00 (Thu)
  61036243200, #    local_end 1935-03-01 00:00:00 (Fri)
  -10800,
  1,
  '-03',
      ],
      [
  61036254000, #    utc_start 1935-03-01 03:00:00 (Fri)
  61057425600, #      utc_end 1935-11-01 04:00:00 (Fri)
  61036239600, #  local_start 1935-02-28 23:00:00 (Thu)
  61057411200, #    local_end 1935-11-01 00:00:00 (Fri)
  -14400,
  0,
  '-04',
      ],
      [
  61057425600, #    utc_start 1935-11-01 04:00:00 (Fri)
  61067876400, #      utc_end 1936-03-01 03:00:00 (Sun)
  61057414800, #  local_start 1935-11-01 01:00:00 (Fri)
  61067865600, #    local_end 1936-03-01 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61067876400, #    utc_start 1936-03-01 03:00:00 (Sun)
  61089048000, #      utc_end 1936-11-01 04:00:00 (Sun)
  61067862000, #  local_start 1936-02-29 23:00:00 (Sat)
  61089033600, #    local_end 1936-11-01 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  61089048000, #    utc_start 1936-11-01 04:00:00 (Sun)
  61099412400, #      utc_end 1937-03-01 03:00:00 (Mon)
  61089037200, #  local_start 1936-11-01 01:00:00 (Sun)
  61099401600, #    local_end 1937-03-01 00:00:00 (Mon)
  -10800,
  1,
  '-03',
      ],
      [
  61099412400, #    utc_start 1937-03-01 03:00:00 (Mon)
  61120584000, #      utc_end 1937-11-01 04:00:00 (Mon)
  61099398000, #  local_start 1937-02-28 23:00:00 (Sun)
  61120569600, #    local_end 1937-11-01 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  61120584000, #    utc_start 1937-11-01 04:00:00 (Mon)
  61130948400, #      utc_end 1938-03-01 03:00:00 (Tue)
  61120573200, #  local_start 1937-11-01 01:00:00 (Mon)
  61130937600, #    local_end 1938-03-01 00:00:00 (Tue)
  -10800,
  1,
  '-03',
      ],
      [
  61130948400, #    utc_start 1938-03-01 03:00:00 (Tue)
  61152120000, #      utc_end 1938-11-01 04:00:00 (Tue)
  61130934000, #  local_start 1938-02-28 23:00:00 (Mon)
  61152105600, #    local_end 1938-11-01 00:00:00 (Tue)
  -14400,
  0,
  '-04',
      ],
      [
  61152120000, #    utc_start 1938-11-01 04:00:00 (Tue)
  61162484400, #      utc_end 1939-03-01 03:00:00 (Wed)
  61152109200, #  local_start 1938-11-01 01:00:00 (Tue)
  61162473600, #    local_end 1939-03-01 00:00:00 (Wed)
  -10800,
  1,
  '-03',
      ],
      [
  61162484400, #    utc_start 1939-03-01 03:00:00 (Wed)
  61183656000, #      utc_end 1939-11-01 04:00:00 (Wed)
  61162470000, #  local_start 1939-02-28 23:00:00 (Tue)
  61183641600, #    local_end 1939-11-01 00:00:00 (Wed)
  -14400,
  0,
  '-04',
      ],
      [
  61183656000, #    utc_start 1939-11-01 04:00:00 (Wed)
  61194106800, #      utc_end 1940-03-01 03:00:00 (Fri)
  61183645200, #  local_start 1939-11-01 01:00:00 (Wed)
  61194096000, #    local_end 1940-03-01 00:00:00 (Fri)
  -10800,
  1,
  '-03',
      ],
      [
  61194106800, #    utc_start 1940-03-01 03:00:00 (Fri)
  61204651200, #      utc_end 1940-07-01 04:00:00 (Mon)
  61194092400, #  local_start 1940-02-29 23:00:00 (Thu)
  61204636800, #    local_end 1940-07-01 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  61204651200, #    utc_start 1940-07-01 04:00:00 (Mon)
  61234801200, #      utc_end 1941-06-15 03:00:00 (Sun)
  61204640400, #  local_start 1940-07-01 01:00:00 (Mon)
  61234790400, #    local_end 1941-06-15 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61234801200, #    utc_start 1941-06-15 03:00:00 (Sun)
  61245345600, #      utc_end 1941-10-15 04:00:00 (Wed)
  61234786800, #  local_start 1941-06-14 23:00:00 (Sat)
  61245331200, #    local_end 1941-10-15 00:00:00 (Wed)
  -14400,
  0,
  '-04',
      ],
      [
  61245345600, #    utc_start 1941-10-15 04:00:00 (Wed)
  61301934000, #      utc_end 1943-08-01 03:00:00 (Sun)
  61245334800, #  local_start 1941-10-15 01:00:00 (Wed)
  61301923200, #    local_end 1943-08-01 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61301934000, #    utc_start 1943-08-01 03:00:00 (Sun)
  61308417600, #      utc_end 1943-10-15 04:00:00 (Fri)
  61301919600, #  local_start 1943-07-31 23:00:00 (Sat)
  61308403200, #    local_end 1943-10-15 00:00:00 (Fri)
  -14400,
  0,
  '-04',
      ],
      [
  61308417600, #    utc_start 1943-10-15 04:00:00 (Fri)
  61383409200, #      utc_end 1946-03-01 03:00:00 (Fri)
  61308406800, #  local_start 1943-10-15 01:00:00 (Fri)
  61383398400, #    local_end 1946-03-01 00:00:00 (Fri)
  -10800,
  1,
  '-03',
      ],
      [
  61383409200, #    utc_start 1946-03-01 03:00:00 (Fri)
  61401902400, #      utc_end 1946-10-01 04:00:00 (Tue)
  61383394800, #  local_start 1946-02-28 23:00:00 (Thu)
  61401888000, #    local_end 1946-10-01 00:00:00 (Tue)
  -14400,
  0,
  '-04',
      ],
      [
  61401902400, #    utc_start 1946-10-01 04:00:00 (Tue)
  61938356400, #      utc_end 1963-10-01 03:00:00 (Tue)
  61401891600, #  local_start 1946-10-01 01:00:00 (Tue)
  61938345600, #    local_end 1963-10-01 00:00:00 (Tue)
  -10800,
  1,
  '-03',
      ],
      [
  61938356400, #    utc_start 1963-10-01 03:00:00 (Tue)
  61944840000, #      utc_end 1963-12-15 04:00:00 (Sun)
  61938342000, #  local_start 1963-09-30 23:00:00 (Mon)
  61944825600, #    local_end 1963-12-15 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  61944840000, #    utc_start 1963-12-15 04:00:00 (Sun)
  61951489200, #      utc_end 1964-03-01 03:00:00 (Sun)
  61944829200, #  local_start 1963-12-15 01:00:00 (Sun)
  61951478400, #    local_end 1964-03-01 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61951489200, #    utc_start 1964-03-01 03:00:00 (Sun)
  61971192000, #      utc_end 1964-10-15 04:00:00 (Thu)
  61951474800, #  local_start 1964-02-29 23:00:00 (Sat)
  61971177600, #    local_end 1964-10-15 00:00:00 (Thu)
  -14400,
  0,
  '-04',
      ],
      [
  61971192000, #    utc_start 1964-10-15 04:00:00 (Thu)
  61983025200, #      utc_end 1965-03-01 03:00:00 (Mon)
  61971181200, #  local_start 1964-10-15 01:00:00 (Thu)
  61983014400, #    local_end 1965-03-01 00:00:00 (Mon)
  -10800,
  1,
  '-03',
      ],
      [
  61983025200, #    utc_start 1965-03-01 03:00:00 (Mon)
  62002728000, #      utc_end 1965-10-15 04:00:00 (Fri)
  61983010800, #  local_start 1965-02-28 23:00:00 (Sun)
  62002713600, #    local_end 1965-10-15 00:00:00 (Fri)
  -14400,
  0,
  '-04',
      ],
      [
  62002728000, #    utc_start 1965-10-15 04:00:00 (Fri)
  62014561200, #      utc_end 1966-03-01 03:00:00 (Tue)
  62002717200, #  local_start 1965-10-15 01:00:00 (Fri)
  62014550400, #    local_end 1966-03-01 00:00:00 (Tue)
  -10800,
  1,
  '-03',
      ],
      [
  62014561200, #    utc_start 1966-03-01 03:00:00 (Tue)
  62034264000, #      utc_end 1966-10-15 04:00:00 (Sat)
  62014546800, #  local_start 1966-02-28 23:00:00 (Mon)
  62034249600, #    local_end 1966-10-15 00:00:00 (Sat)
  -14400,
  0,
  '-04',
      ],
      [
  62034264000, #    utc_start 1966-10-15 04:00:00 (Sat)
  62048862000, #      utc_end 1967-04-02 03:00:00 (Sun)
  62034253200, #  local_start 1966-10-15 01:00:00 (Sat)
  62048851200, #    local_end 1967-04-02 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62048862000, #    utc_start 1967-04-02 03:00:00 (Sun)
  62064590400, #      utc_end 1967-10-01 04:00:00 (Sun)
  62048847600, #  local_start 1967-04-01 23:00:00 (Sat)
  62064576000, #    local_end 1967-10-01 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62064590400, #    utc_start 1967-10-01 04:00:00 (Sun)
  62080916400, #      utc_end 1968-04-07 03:00:00 (Sun)
  62064579600, #  local_start 1967-10-01 01:00:00 (Sun)
  62080905600, #    local_end 1968-04-07 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62080916400, #    utc_start 1968-04-07 03:00:00 (Sun)
  62096644800, #      utc_end 1968-10-06 04:00:00 (Sun)
  62080902000, #  local_start 1968-04-06 23:00:00 (Sat)
  62096630400, #    local_end 1968-10-06 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62096644800, #    utc_start 1968-10-06 04:00:00 (Sun)
  62112366000, #      utc_end 1969-04-06 03:00:00 (Sun)
  62096634000, #  local_start 1968-10-06 01:00:00 (Sun)
  62112355200, #    local_end 1969-04-06 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62112366000, #    utc_start 1969-04-06 03:00:00 (Sun)
  62128094400, #      utc_end 1969-10-05 04:00:00 (Sun)
  62112351600, #  local_start 1969-04-05 23:00:00 (Sat)
  62128080000, #    local_end 1969-10-05 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62128094400, #    utc_start 1969-10-05 04:00:00 (Sun)
  62263825200, #      utc_end 1974-01-23 03:00:00 (Wed)
  62128083600, #  local_start 1969-10-05 01:00:00 (Sun)
  62263814400, #    local_end 1974-01-23 00:00:00 (Wed)
  -10800,
  0,
  '-03',
      ],
      [
  62263825200, #    utc_start 1974-01-23 03:00:00 (Wed)
  62272288800, #      utc_end 1974-05-01 02:00:00 (Wed)
  62263818000, #  local_start 1974-01-23 01:00:00 (Wed)
  62272281600, #    local_end 1974-05-01 00:00:00 (Wed)
  -7200,
  1,
  '-02',
      ],
      [
  62272288800, #    utc_start 1974-05-01 02:00:00 (Wed)
  62732631600, #      utc_end 1988-12-01 03:00:00 (Thu)
  62272278000, #  local_start 1974-04-30 23:00:00 (Tue)
  62732620800, #    local_end 1988-12-01 00:00:00 (Thu)
  -10800,
  0,
  '-03',
      ],
      [
  62732631600, #    utc_start 1988-12-01 03:00:00 (Thu)
  62740749600, #      utc_end 1989-03-05 02:00:00 (Sun)
  62732624400, #  local_start 1988-12-01 01:00:00 (Thu)
  62740742400, #    local_end 1989-03-05 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62740749600, #    utc_start 1989-03-05 02:00:00 (Sun)
  62760106800, #      utc_end 1989-10-15 03:00:00 (Sun)
  62740738800, #  local_start 1989-03-04 23:00:00 (Sat)
  62760096000, #    local_end 1989-10-15 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62760106800, #    utc_start 1989-10-15 03:00:00 (Sun)
  62772199200, #      utc_end 1990-03-04 02:00:00 (Sun)
  62760099600, #  local_start 1989-10-15 01:00:00 (Sun)
  62772192000, #    local_end 1990-03-04 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62772199200, #    utc_start 1990-03-04 02:00:00 (Sun)
  62792161200, #      utc_end 1990-10-21 03:00:00 (Sun)
  62772188400, #  local_start 1990-03-03 23:00:00 (Sat)
  62792150400, #    local_end 1990-10-21 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62792161200, #    utc_start 1990-10-21 03:00:00 (Sun)
  62803648800, #      utc_end 1991-03-03 02:00:00 (Sun)
  62792154000, #  local_start 1990-10-21 01:00:00 (Sun)
  62803641600, #    local_end 1991-03-03 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62803648800, #    utc_start 1991-03-03 02:00:00 (Sun)
  62823610800, #      utc_end 1991-10-20 03:00:00 (Sun)
  62803638000, #  local_start 1991-03-02 23:00:00 (Sat)
  62823600000, #    local_end 1991-10-20 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62823610800, #    utc_start 1991-10-20 03:00:00 (Sun)
  62835098400, #      utc_end 1992-03-01 02:00:00 (Sun)
  62823603600, #  local_start 1991-10-20 01:00:00 (Sun)
  62835091200, #    local_end 1992-03-01 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62835098400, #    utc_start 1992-03-01 02:00:00 (Sun)
  62855060400, #      utc_end 1992-10-18 03:00:00 (Sun)
  62835087600, #  local_start 1992-02-29 23:00:00 (Sat)
  62855049600, #    local_end 1992-10-18 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62855060400, #    utc_start 1992-10-18 03:00:00 (Sun)
  62867152800, #      utc_end 1993-03-07 02:00:00 (Sun)
  62855053200, #  local_start 1992-10-18 01:00:00 (Sun)
  62867145600, #    local_end 1993-03-07 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62867152800, #    utc_start 1993-03-07 02:00:00 (Sun)
  63074602800, #      utc_end 1999-10-03 03:00:00 (Sun)
  62867142000, #  local_start 1993-03-06 23:00:00 (Sat)
  63074592000, #    local_end 1999-10-03 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63074602800, #    utc_start 1999-10-03 03:00:00 (Sun)
  63087735600, #      utc_end 2000-03-03 03:00:00 (Fri)
  63074592000, #  local_start 1999-10-03 00:00:00 (Sun)
  63087724800, #    local_end 2000-03-03 00:00:00 (Fri)
  -10800,
  1,
  '-03',
      ],
      [
  63087735600, #    utc_start 2000-03-03 03:00:00 (Fri)
  63221569200, #      utc_end 2004-05-30 03:00:00 (Sun)
  63087724800, #  local_start 2000-03-03 00:00:00 (Fri)
  63221558400, #    local_end 2004-05-30 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63221569200, #    utc_start 2004-05-30 03:00:00 (Sun)
  63223387200, #      utc_end 2004-06-20 04:00:00 (Sun)
  63221554800, #  local_start 2004-05-29 23:00:00 (Sat)
  63223372800, #    local_end 2004-06-20 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63223387200, #    utc_start 2004-06-20 04:00:00 (Sun)
  63334666800, #      utc_end 2007-12-30 03:00:00 (Sun)
  63223376400, #  local_start 2004-06-20 01:00:00 (Sun)
  63334656000, #    local_end 2007-12-30 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63334666800, #    utc_start 2007-12-30 03:00:00 (Sun)
  63341316000, #      utc_end 2008-03-16 02:00:00 (Sun)
  63334659600, #  local_start 2007-12-30 01:00:00 (Sun)
  63341308800, #    local_end 2008-03-16 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63341316000, #    utc_start 2008-03-16 02:00:00 (Sun)
  63359982000, #      utc_end 2008-10-18 03:00:00 (Sat)
  63341305200, #  local_start 2008-03-15 23:00:00 (Sat)
  63359971200, #    local_end 2008-10-18 00:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  63359982000, #    utc_start 2008-10-18 03:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  63359971200, #  local_start 2008-10-18 00:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #    local_end
  -10800,
  0,
  '-03',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {28}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_ARGENTINA_USHUAIA

    $main::fatpacked{"DateTime/TimeZone/America/Asuncion.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_ASUNCION';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/southamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Asuncion;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Asuncion::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59611175440, #      utc_end 1890-01-01 03:50:40 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59611161600, #    local_end 1890-01-01 00:00:00 (Wed)
  -13840,
  0,
  'LMT',
      ],
      [
  59611175440, #    utc_start 1890-01-01 03:50:40 (Wed)
  60929293840, #      utc_end 1931-10-10 03:50:40 (Sat)
  59611161600, #  local_start 1890-01-01 00:00:00 (Wed)
  60929280000, #    local_end 1931-10-10 00:00:00 (Sat)
  -13840,
  0,
  'AMT',
      ],
      [
  60929293840, #    utc_start 1931-10-10 03:50:40 (Sat)
  62222443200, #      utc_end 1972-10-01 04:00:00 (Sun)
  60929279440, #  local_start 1931-10-09 23:50:40 (Fri)
  62222428800, #    local_end 1972-10-01 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62222443200, #    utc_start 1972-10-01 04:00:00 (Sun)
  62269700400, #      utc_end 1974-04-01 03:00:00 (Mon)
  62222432400, #  local_start 1972-10-01 01:00:00 (Sun)
  62269689600, #    local_end 1974-04-01 00:00:00 (Mon)
  -10800,
  0,
  '-03',
      ],
      [
  62269700400, #    utc_start 1974-04-01 03:00:00 (Mon)
  62317051200, #      utc_end 1975-10-01 04:00:00 (Wed)
  62269686000, #  local_start 1974-03-31 23:00:00 (Sun)
  62317036800, #    local_end 1975-10-01 00:00:00 (Wed)
  -14400,
  0,
  '-04',
      ],
      [
  62317051200, #    utc_start 1975-10-01 04:00:00 (Wed)
  62330180400, #      utc_end 1976-03-01 03:00:00 (Mon)
  62317040400, #  local_start 1975-10-01 01:00:00 (Wed)
  62330169600, #    local_end 1976-03-01 00:00:00 (Mon)
  -10800,
  1,
  '-03',
      ],
      [
  62330180400, #    utc_start 1976-03-01 03:00:00 (Mon)
  62348673600, #      utc_end 1976-10-01 04:00:00 (Fri)
  62330166000, #  local_start 1976-02-29 23:00:00 (Sun)
  62348659200, #    local_end 1976-10-01 00:00:00 (Fri)
  -14400,
  0,
  '-04',
      ],
      [
  62348673600, #    utc_start 1976-10-01 04:00:00 (Fri)
  62361716400, #      utc_end 1977-03-01 03:00:00 (Tue)
  62348662800, #  local_start 1976-10-01 01:00:00 (Fri)
  62361705600, #    local_end 1977-03-01 00:00:00 (Tue)
  -10800,
  1,
  '-03',
      ],
      [
  62361716400, #    utc_start 1977-03-01 03:00:00 (Tue)
  62380209600, #      utc_end 1977-10-01 04:00:00 (Sat)
  62361702000, #  local_start 1977-02-28 23:00:00 (Mon)
  62380195200, #    local_end 1977-10-01 00:00:00 (Sat)
  -14400,
  0,
  '-04',
      ],
      [
  62380209600, #    utc_start 1977-10-01 04:00:00 (Sat)
  62393252400, #      utc_end 1978-03-01 03:00:00 (Wed)
  62380198800, #  local_start 1977-10-01 01:00:00 (Sat)
  62393241600, #    local_end 1978-03-01 00:00:00 (Wed)
  -10800,
  1,
  '-03',
      ],
      [
  62393252400, #    utc_start 1978-03-01 03:00:00 (Wed)
  62411745600, #      utc_end 1978-10-01 04:00:00 (Sun)
  62393238000, #  local_start 1978-02-28 23:00:00 (Tue)
  62411731200, #    local_end 1978-10-01 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62411745600, #    utc_start 1978-10-01 04:00:00 (Sun)
  62427466800, #      utc_end 1979-04-01 03:00:00 (Sun)
  62411734800, #  local_start 1978-10-01 01:00:00 (Sun)
  62427456000, #    local_end 1979-04-01 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62427466800, #    utc_start 1979-04-01 03:00:00 (Sun)
  62443281600, #      utc_end 1979-10-01 04:00:00 (Mon)
  62427452400, #  local_start 1979-03-31 23:00:00 (Sat)
  62443267200, #    local_end 1979-10-01 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  62443281600, #    utc_start 1979-10-01 04:00:00 (Mon)
  62459089200, #      utc_end 1980-04-01 03:00:00 (Tue)
  62443270800, #  local_start 1979-10-01 01:00:00 (Mon)
  62459078400, #    local_end 1980-04-01 00:00:00 (Tue)
  -10800,
  1,
  '-03',
      ],
      [
  62459089200, #    utc_start 1980-04-01 03:00:00 (Tue)
  62474904000, #      utc_end 1980-10-01 04:00:00 (Wed)
  62459074800, #  local_start 1980-03-31 23:00:00 (Mon)
  62474889600, #    local_end 1980-10-01 00:00:00 (Wed)
  -14400,
  0,
  '-04',
      ],
      [
  62474904000, #    utc_start 1980-10-01 04:00:00 (Wed)
  62490625200, #      utc_end 1981-04-01 03:00:00 (Wed)
  62474893200, #  local_start 1980-10-01 01:00:00 (Wed)
  62490614400, #    local_end 1981-04-01 00:00:00 (Wed)
  -10800,
  1,
  '-03',
      ],
      [
  62490625200, #    utc_start 1981-04-01 03:00:00 (Wed)
  62506440000, #      utc_end 1981-10-01 04:00:00 (Thu)
  62490610800, #  local_start 1981-03-31 23:00:00 (Tue)
  62506425600, #    local_end 1981-10-01 00:00:00 (Thu)
  -14400,
  0,
  '-04',
      ],
      [
  62506440000, #    utc_start 1981-10-01 04:00:00 (Thu)
  62522161200, #      utc_end 1982-04-01 03:00:00 (Thu)
  62506429200, #  local_start 1981-10-01 01:00:00 (Thu)
  62522150400, #    local_end 1982-04-01 00:00:00 (Thu)
  -10800,
  1,
  '-03',
      ],
      [
  62522161200, #    utc_start 1982-04-01 03:00:00 (Thu)
  62537976000, #      utc_end 1982-10-01 04:00:00 (Fri)
  62522146800, #  local_start 1982-03-31 23:00:00 (Wed)
  62537961600, #    local_end 1982-10-01 00:00:00 (Fri)
  -14400,
  0,
  '-04',
      ],
      [
  62537976000, #    utc_start 1982-10-01 04:00:00 (Fri)
  62553697200, #      utc_end 1983-04-01 03:00:00 (Fri)
  62537965200, #  local_start 1982-10-01 01:00:00 (Fri)
  62553686400, #    local_end 1983-04-01 00:00:00 (Fri)
  -10800,
  1,
  '-03',
      ],
      [
  62553697200, #    utc_start 1983-04-01 03:00:00 (Fri)
  62569512000, #      utc_end 1983-10-01 04:00:00 (Sat)
  62553682800, #  local_start 1983-03-31 23:00:00 (Thu)
  62569497600, #    local_end 1983-10-01 00:00:00 (Sat)
  -14400,
  0,
  '-04',
      ],
      [
  62569512000, #    utc_start 1983-10-01 04:00:00 (Sat)
  62585319600, #      utc_end 1984-04-01 03:00:00 (Sun)
  62569501200, #  local_start 1983-10-01 01:00:00 (Sat)
  62585308800, #    local_end 1984-04-01 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62585319600, #    utc_start 1984-04-01 03:00:00 (Sun)
  62601134400, #      utc_end 1984-10-01 04:00:00 (Mon)
  62585305200, #  local_start 1984-03-31 23:00:00 (Sat)
  62601120000, #    local_end 1984-10-01 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  62601134400, #    utc_start 1984-10-01 04:00:00 (Mon)
  62616855600, #      utc_end 1985-04-01 03:00:00 (Mon)
  62601123600, #  local_start 1984-10-01 01:00:00 (Mon)
  62616844800, #    local_end 1985-04-01 00:00:00 (Mon)
  -10800,
  1,
  '-03',
      ],
      [
  62616855600, #    utc_start 1985-04-01 03:00:00 (Mon)
  62632670400, #      utc_end 1985-10-01 04:00:00 (Tue)
  62616841200, #  local_start 1985-03-31 23:00:00 (Sun)
  62632656000, #    local_end 1985-10-01 00:00:00 (Tue)
  -14400,
  0,
  '-04',
      ],
      [
  62632670400, #    utc_start 1985-10-01 04:00:00 (Tue)
  62648391600, #      utc_end 1986-04-01 03:00:00 (Tue)
  62632659600, #  local_start 1985-10-01 01:00:00 (Tue)
  62648380800, #    local_end 1986-04-01 00:00:00 (Tue)
  -10800,
  1,
  '-03',
      ],
      [
  62648391600, #    utc_start 1986-04-01 03:00:00 (Tue)
  62664206400, #      utc_end 1986-10-01 04:00:00 (Wed)
  62648377200, #  local_start 1986-03-31 23:00:00 (Mon)
  62664192000, #    local_end 1986-10-01 00:00:00 (Wed)
  -14400,
  0,
  '-04',
      ],
      [
  62664206400, #    utc_start 1986-10-01 04:00:00 (Wed)
  62679927600, #      utc_end 1987-04-01 03:00:00 (Wed)
  62664195600, #  local_start 1986-10-01 01:00:00 (Wed)
  62679916800, #    local_end 1987-04-01 00:00:00 (Wed)
  -10800,
  1,
  '-03',
      ],
      [
  62679927600, #    utc_start 1987-04-01 03:00:00 (Wed)
  62695742400, #      utc_end 1987-10-01 04:00:00 (Thu)
  62679913200, #  local_start 1987-03-31 23:00:00 (Tue)
  62695728000, #    local_end 1987-10-01 00:00:00 (Thu)
  -14400,
  0,
  '-04',
      ],
      [
  62695742400, #    utc_start 1987-10-01 04:00:00 (Thu)
  62711550000, #      utc_end 1988-04-01 03:00:00 (Fri)
  62695731600, #  local_start 1987-10-01 01:00:00 (Thu)
  62711539200, #    local_end 1988-04-01 00:00:00 (Fri)
  -10800,
  1,
  '-03',
      ],
      [
  62711550000, #    utc_start 1988-04-01 03:00:00 (Fri)
  62727364800, #      utc_end 1988-10-01 04:00:00 (Sat)
  62711535600, #  local_start 1988-03-31 23:00:00 (Thu)
  62727350400, #    local_end 1988-10-01 00:00:00 (Sat)
  -14400,
  0,
  '-04',
      ],
      [
  62727364800, #    utc_start 1988-10-01 04:00:00 (Sat)
  62743086000, #      utc_end 1989-04-01 03:00:00 (Sat)
  62727354000, #  local_start 1988-10-01 01:00:00 (Sat)
  62743075200, #    local_end 1989-04-01 00:00:00 (Sat)
  -10800,
  1,
  '-03',
      ],
      [
  62743086000, #    utc_start 1989-04-01 03:00:00 (Sat)
  62760715200, #      utc_end 1989-10-22 04:00:00 (Sun)
  62743071600, #  local_start 1989-03-31 23:00:00 (Fri)
  62760700800, #    local_end 1989-10-22 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62760715200, #    utc_start 1989-10-22 04:00:00 (Sun)
  62774622000, #      utc_end 1990-04-01 03:00:00 (Sun)
  62760704400, #  local_start 1989-10-22 01:00:00 (Sun)
  62774611200, #    local_end 1990-04-01 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62774622000, #    utc_start 1990-04-01 03:00:00 (Sun)
  62790436800, #      utc_end 1990-10-01 04:00:00 (Mon)
  62774607600, #  local_start 1990-03-31 23:00:00 (Sat)
  62790422400, #    local_end 1990-10-01 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  62790436800, #    utc_start 1990-10-01 04:00:00 (Mon)
  62806158000, #      utc_end 1991-04-01 03:00:00 (Mon)
  62790426000, #  local_start 1990-10-01 01:00:00 (Mon)
  62806147200, #    local_end 1991-04-01 00:00:00 (Mon)
  -10800,
  1,
  '-03',
      ],
      [
  62806158000, #    utc_start 1991-04-01 03:00:00 (Mon)
  62822404800, #      utc_end 1991-10-06 04:00:00 (Sun)
  62806143600, #  local_start 1991-03-31 23:00:00 (Sun)
  62822390400, #    local_end 1991-10-06 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62822404800, #    utc_start 1991-10-06 04:00:00 (Sun)
  62835102000, #      utc_end 1992-03-01 03:00:00 (Sun)
  62822394000, #  local_start 1991-10-06 01:00:00 (Sun)
  62835091200, #    local_end 1992-03-01 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62835102000, #    utc_start 1992-03-01 03:00:00 (Sun)
  62853940800, #      utc_end 1992-10-05 04:00:00 (Mon)
  62835087600, #  local_start 1992-02-29 23:00:00 (Sat)
  62853926400, #    local_end 1992-10-05 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  62853940800, #    utc_start 1992-10-05 04:00:00 (Mon)
  62869230000, #      utc_end 1993-03-31 03:00:00 (Wed)
  62853930000, #  local_start 1992-10-05 01:00:00 (Mon)
  62869219200, #    local_end 1993-03-31 00:00:00 (Wed)
  -10800,
  1,
  '-03',
      ],
      [
  62869230000, #    utc_start 1993-03-31 03:00:00 (Wed)
  62885131200, #      utc_end 1993-10-01 04:00:00 (Fri)
  62869215600, #  local_start 1993-03-30 23:00:00 (Tue)
  62885116800, #    local_end 1993-10-01 00:00:00 (Fri)
  -14400,
  0,
  '-04',
      ],
      [
  62885131200, #    utc_start 1993-10-01 04:00:00 (Fri)
  62898001200, #      utc_end 1994-02-27 03:00:00 (Sun)
  62885120400, #  local_start 1993-10-01 01:00:00 (Fri)
  62897990400, #    local_end 1994-02-27 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62898001200, #    utc_start 1994-02-27 03:00:00 (Sun)
  62916667200, #      utc_end 1994-10-01 04:00:00 (Sat)
  62897986800, #  local_start 1994-02-26 23:00:00 (Sat)
  62916652800, #    local_end 1994-10-01 00:00:00 (Sat)
  -14400,
  0,
  '-04',
      ],
      [
  62916667200, #    utc_start 1994-10-01 04:00:00 (Sat)
  62929450800, #      utc_end 1995-02-26 03:00:00 (Sun)
  62916656400, #  local_start 1994-10-01 01:00:00 (Sat)
  62929440000, #    local_end 1995-02-26 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62929450800, #    utc_start 1995-02-26 03:00:00 (Sun)
  62948203200, #      utc_end 1995-10-01 04:00:00 (Sun)
  62929436400, #  local_start 1995-02-25 23:00:00 (Sat)
  62948188800, #    local_end 1995-10-01 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62948203200, #    utc_start 1995-10-01 04:00:00 (Sun)
  62961332400, #      utc_end 1996-03-01 03:00:00 (Fri)
  62948192400, #  local_start 1995-10-01 01:00:00 (Sun)
  62961321600, #    local_end 1996-03-01 00:00:00 (Fri)
  -10800,
  1,
  '-03',
      ],
      [
  62961332400, #    utc_start 1996-03-01 03:00:00 (Fri)
  62980257600, #      utc_end 1996-10-06 04:00:00 (Sun)
  62961318000, #  local_start 1996-02-29 23:00:00 (Thu)
  62980243200, #    local_end 1996-10-06 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62980257600, #    utc_start 1996-10-06 04:00:00 (Sun)
  62992350000, #      utc_end 1997-02-23 03:00:00 (Sun)
  62980246800, #  local_start 1996-10-06 01:00:00 (Sun)
  62992339200, #    local_end 1997-02-23 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62992350000, #    utc_start 1997-02-23 03:00:00 (Sun)
  63011707200, #      utc_end 1997-10-05 04:00:00 (Sun)
  62992335600, #  local_start 1997-02-22 23:00:00 (Sat)
  63011692800, #    local_end 1997-10-05 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63011707200, #    utc_start 1997-10-05 04:00:00 (Sun)
  63024404400, #      utc_end 1998-03-01 03:00:00 (Sun)
  63011696400, #  local_start 1997-10-05 01:00:00 (Sun)
  63024393600, #    local_end 1998-03-01 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63024404400, #    utc_start 1998-03-01 03:00:00 (Sun)
  63043156800, #      utc_end 1998-10-04 04:00:00 (Sun)
  63024390000, #  local_start 1998-02-28 23:00:00 (Sat)
  63043142400, #    local_end 1998-10-04 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63043156800, #    utc_start 1998-10-04 04:00:00 (Sun)
  63056458800, #      utc_end 1999-03-07 03:00:00 (Sun)
  63043146000, #  local_start 1998-10-04 01:00:00 (Sun)
  63056448000, #    local_end 1999-03-07 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63056458800, #    utc_start 1999-03-07 03:00:00 (Sun)
  63074606400, #      utc_end 1999-10-03 04:00:00 (Sun)
  63056444400, #  local_start 1999-03-06 23:00:00 (Sat)
  63074592000, #    local_end 1999-10-03 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63074606400, #    utc_start 1999-10-03 04:00:00 (Sun)
  63087908400, #      utc_end 2000-03-05 03:00:00 (Sun)
  63074595600, #  local_start 1999-10-03 01:00:00 (Sun)
  63087897600, #    local_end 2000-03-05 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63087908400, #    utc_start 2000-03-05 03:00:00 (Sun)
  63106056000, #      utc_end 2000-10-01 04:00:00 (Sun)
  63087894000, #  local_start 2000-03-04 23:00:00 (Sat)
  63106041600, #    local_end 2000-10-01 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63106056000, #    utc_start 2000-10-01 04:00:00 (Sun)
  63119358000, #      utc_end 2001-03-04 03:00:00 (Sun)
  63106045200, #  local_start 2000-10-01 01:00:00 (Sun)
  63119347200, #    local_end 2001-03-04 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63119358000, #    utc_start 2001-03-04 03:00:00 (Sun)
  63138110400, #      utc_end 2001-10-07 04:00:00 (Sun)
  63119343600, #  local_start 2001-03-03 23:00:00 (Sat)
  63138096000, #    local_end 2001-10-07 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63138110400, #    utc_start 2001-10-07 04:00:00 (Sun)
  63153831600, #      utc_end 2002-04-07 03:00:00 (Sun)
  63138099600, #  local_start 2001-10-07 01:00:00 (Sun)
  63153820800, #    local_end 2002-04-07 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63153831600, #    utc_start 2002-04-07 03:00:00 (Sun)
  63166536000, #      utc_end 2002-09-01 04:00:00 (Sun)
  63153817200, #  local_start 2002-04-06 23:00:00 (Sat)
  63166521600, #    local_end 2002-09-01 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63166536000, #    utc_start 2002-09-01 04:00:00 (Sun)
  63185281200, #      utc_end 2003-04-06 03:00:00 (Sun)
  63166525200, #  local_start 2002-09-01 01:00:00 (Sun)
  63185270400, #    local_end 2003-04-06 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63185281200, #    utc_start 2003-04-06 03:00:00 (Sun)
  63198590400, #      utc_end 2003-09-07 04:00:00 (Sun)
  63185266800, #  local_start 2003-04-05 23:00:00 (Sat)
  63198576000, #    local_end 2003-09-07 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63198590400, #    utc_start 2003-09-07 04:00:00 (Sun)
  63216730800, #      utc_end 2004-04-04 03:00:00 (Sun)
  63198579600, #  local_start 2003-09-07 01:00:00 (Sun)
  63216720000, #    local_end 2004-04-04 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63216730800, #    utc_start 2004-04-04 03:00:00 (Sun)
  63233668800, #      utc_end 2004-10-17 04:00:00 (Sun)
  63216716400, #  local_start 2004-04-03 23:00:00 (Sat)
  63233654400, #    local_end 2004-10-17 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63233668800, #    utc_start 2004-10-17 04:00:00 (Sun)
  63246366000, #      utc_end 2005-03-13 03:00:00 (Sun)
  63233658000, #  local_start 2004-10-17 01:00:00 (Sun)
  63246355200, #    local_end 2005-03-13 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63246366000, #    utc_start 2005-03-13 03:00:00 (Sun)
  63265118400, #      utc_end 2005-10-16 04:00:00 (Sun)
  63246351600, #  local_start 2005-03-12 23:00:00 (Sat)
  63265104000, #    local_end 2005-10-16 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63265118400, #    utc_start 2005-10-16 04:00:00 (Sun)
  63277815600, #      utc_end 2006-03-12 03:00:00 (Sun)
  63265107600, #  local_start 2005-10-16 01:00:00 (Sun)
  63277804800, #    local_end 2006-03-12 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63277815600, #    utc_start 2006-03-12 03:00:00 (Sun)
  63296568000, #      utc_end 2006-10-15 04:00:00 (Sun)
  63277801200, #  local_start 2006-03-11 23:00:00 (Sat)
  63296553600, #    local_end 2006-10-15 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63296568000, #    utc_start 2006-10-15 04:00:00 (Sun)
  63309265200, #      utc_end 2007-03-11 03:00:00 (Sun)
  63296557200, #  local_start 2006-10-15 01:00:00 (Sun)
  63309254400, #    local_end 2007-03-11 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63309265200, #    utc_start 2007-03-11 03:00:00 (Sun)
  63328622400, #      utc_end 2007-10-21 04:00:00 (Sun)
  63309250800, #  local_start 2007-03-10 23:00:00 (Sat)
  63328608000, #    local_end 2007-10-21 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63328622400, #    utc_start 2007-10-21 04:00:00 (Sun)
  63340714800, #      utc_end 2008-03-09 03:00:00 (Sun)
  63328611600, #  local_start 2007-10-21 01:00:00 (Sun)
  63340704000, #    local_end 2008-03-09 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63340714800, #    utc_start 2008-03-09 03:00:00 (Sun)
  63360072000, #      utc_end 2008-10-19 04:00:00 (Sun)
  63340700400, #  local_start 2008-03-08 23:00:00 (Sat)
  63360057600, #    local_end 2008-10-19 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63360072000, #    utc_start 2008-10-19 04:00:00 (Sun)
  63372164400, #      utc_end 2009-03-08 03:00:00 (Sun)
  63360061200, #  local_start 2008-10-19 01:00:00 (Sun)
  63372153600, #    local_end 2009-03-08 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63372164400, #    utc_start 2009-03-08 03:00:00 (Sun)
  63391521600, #      utc_end 2009-10-18 04:00:00 (Sun)
  63372150000, #  local_start 2009-03-07 23:00:00 (Sat)
  63391507200, #    local_end 2009-10-18 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63391521600, #    utc_start 2009-10-18 04:00:00 (Sun)
  63406638000, #      utc_end 2010-04-11 03:00:00 (Sun)
  63391510800, #  local_start 2009-10-18 01:00:00 (Sun)
  63406627200, #    local_end 2010-04-11 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63406638000, #    utc_start 2010-04-11 03:00:00 (Sun)
  63421761600, #      utc_end 2010-10-03 04:00:00 (Sun)
  63406623600, #  local_start 2010-04-10 23:00:00 (Sat)
  63421747200, #    local_end 2010-10-03 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63421761600, #    utc_start 2010-10-03 04:00:00 (Sun)
  63438087600, #      utc_end 2011-04-10 03:00:00 (Sun)
  63421750800, #  local_start 2010-10-03 01:00:00 (Sun)
  63438076800, #    local_end 2011-04-10 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63438087600, #    utc_start 2011-04-10 03:00:00 (Sun)
  63453211200, #      utc_end 2011-10-02 04:00:00 (Sun)
  63438073200, #  local_start 2011-04-09 23:00:00 (Sat)
  63453196800, #    local_end 2011-10-02 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63453211200, #    utc_start 2011-10-02 04:00:00 (Sun)
  63469537200, #      utc_end 2012-04-08 03:00:00 (Sun)
  63453200400, #  local_start 2011-10-02 01:00:00 (Sun)
  63469526400, #    local_end 2012-04-08 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63469537200, #    utc_start 2012-04-08 03:00:00 (Sun)
  63485265600, #      utc_end 2012-10-07 04:00:00 (Sun)
  63469522800, #  local_start 2012-04-07 23:00:00 (Sat)
  63485251200, #    local_end 2012-10-07 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63485265600, #    utc_start 2012-10-07 04:00:00 (Sun)
  63499777200, #      utc_end 2013-03-24 03:00:00 (Sun)
  63485254800, #  local_start 2012-10-07 01:00:00 (Sun)
  63499766400, #    local_end 2013-03-24 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63499777200, #    utc_start 2013-03-24 03:00:00 (Sun)
  63516715200, #      utc_end 2013-10-06 04:00:00 (Sun)
  63499762800, #  local_start 2013-03-23 23:00:00 (Sat)
  63516700800, #    local_end 2013-10-06 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63516715200, #    utc_start 2013-10-06 04:00:00 (Sun)
  63531226800, #      utc_end 2014-03-23 03:00:00 (Sun)
  63516704400, #  local_start 2013-10-06 01:00:00 (Sun)
  63531216000, #    local_end 2014-03-23 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63531226800, #    utc_start 2014-03-23 03:00:00 (Sun)
  63548164800, #      utc_end 2014-10-05 04:00:00 (Sun)
  63531212400, #  local_start 2014-03-22 23:00:00 (Sat)
  63548150400, #    local_end 2014-10-05 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63548164800, #    utc_start 2014-10-05 04:00:00 (Sun)
  63562676400, #      utc_end 2015-03-22 03:00:00 (Sun)
  63548154000, #  local_start 2014-10-05 01:00:00 (Sun)
  63562665600, #    local_end 2015-03-22 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63562676400, #    utc_start 2015-03-22 03:00:00 (Sun)
  63579614400, #      utc_end 2015-10-04 04:00:00 (Sun)
  63562662000, #  local_start 2015-03-21 23:00:00 (Sat)
  63579600000, #    local_end 2015-10-04 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63579614400, #    utc_start 2015-10-04 04:00:00 (Sun)
  63594730800, #      utc_end 2016-03-27 03:00:00 (Sun)
  63579603600, #  local_start 2015-10-04 01:00:00 (Sun)
  63594720000, #    local_end 2016-03-27 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63594730800, #    utc_start 2016-03-27 03:00:00 (Sun)
  63611064000, #      utc_end 2016-10-02 04:00:00 (Sun)
  63594716400, #  local_start 2016-03-26 23:00:00 (Sat)
  63611049600, #    local_end 2016-10-02 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63611064000, #    utc_start 2016-10-02 04:00:00 (Sun)
  63626180400, #      utc_end 2017-03-26 03:00:00 (Sun)
  63611053200, #  local_start 2016-10-02 01:00:00 (Sun)
  63626169600, #    local_end 2017-03-26 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63626180400, #    utc_start 2017-03-26 03:00:00 (Sun)
  63642513600, #      utc_end 2017-10-01 04:00:00 (Sun)
  63626166000, #  local_start 2017-03-25 23:00:00 (Sat)
  63642499200, #    local_end 2017-10-01 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63642513600, #    utc_start 2017-10-01 04:00:00 (Sun)
  63657630000, #      utc_end 2018-03-25 03:00:00 (Sun)
  63642502800, #  local_start 2017-10-01 01:00:00 (Sun)
  63657619200, #    local_end 2018-03-25 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63657630000, #    utc_start 2018-03-25 03:00:00 (Sun)
  63674568000, #      utc_end 2018-10-07 04:00:00 (Sun)
  63657615600, #  local_start 2018-03-24 23:00:00 (Sat)
  63674553600, #    local_end 2018-10-07 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63674568000, #    utc_start 2018-10-07 04:00:00 (Sun)
  63689079600, #      utc_end 2019-03-24 03:00:00 (Sun)
  63674557200, #  local_start 2018-10-07 01:00:00 (Sun)
  63689068800, #    local_end 2019-03-24 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63689079600, #    utc_start 2019-03-24 03:00:00 (Sun)
  63706017600, #      utc_end 2019-10-06 04:00:00 (Sun)
  63689065200, #  local_start 2019-03-23 23:00:00 (Sat)
  63706003200, #    local_end 2019-10-06 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63706017600, #    utc_start 2019-10-06 04:00:00 (Sun)
  63720529200, #      utc_end 2020-03-22 03:00:00 (Sun)
  63706006800, #  local_start 2019-10-06 01:00:00 (Sun)
  63720518400, #    local_end 2020-03-22 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63720529200, #    utc_start 2020-03-22 03:00:00 (Sun)
  63737467200, #      utc_end 2020-10-04 04:00:00 (Sun)
  63720514800, #  local_start 2020-03-21 23:00:00 (Sat)
  63737452800, #    local_end 2020-10-04 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63737467200, #    utc_start 2020-10-04 04:00:00 (Sun)
  63752583600, #      utc_end 2021-03-28 03:00:00 (Sun)
  63737456400, #  local_start 2020-10-04 01:00:00 (Sun)
  63752572800, #    local_end 2021-03-28 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63752583600, #    utc_start 2021-03-28 03:00:00 (Sun)
  63768916800, #      utc_end 2021-10-03 04:00:00 (Sun)
  63752569200, #  local_start 2021-03-27 23:00:00 (Sat)
  63768902400, #    local_end 2021-10-03 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63768916800, #    utc_start 2021-10-03 04:00:00 (Sun)
  63784033200, #      utc_end 2022-03-27 03:00:00 (Sun)
  63768906000, #  local_start 2021-10-03 01:00:00 (Sun)
  63784022400, #    local_end 2022-03-27 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63784033200, #    utc_start 2022-03-27 03:00:00 (Sun)
  63800366400, #      utc_end 2022-10-02 04:00:00 (Sun)
  63784018800, #  local_start 2022-03-26 23:00:00 (Sat)
  63800352000, #    local_end 2022-10-02 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63800366400, #    utc_start 2022-10-02 04:00:00 (Sun)
  63815482800, #      utc_end 2023-03-26 03:00:00 (Sun)
  63800355600, #  local_start 2022-10-02 01:00:00 (Sun)
  63815472000, #    local_end 2023-03-26 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63815482800, #    utc_start 2023-03-26 03:00:00 (Sun)
  63831816000, #      utc_end 2023-10-01 04:00:00 (Sun)
  63815468400, #  local_start 2023-03-25 23:00:00 (Sat)
  63831801600, #    local_end 2023-10-01 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63831816000, #    utc_start 2023-10-01 04:00:00 (Sun)
  63846932400, #      utc_end 2024-03-24 03:00:00 (Sun)
  63831805200, #  local_start 2023-10-01 01:00:00 (Sun)
  63846921600, #    local_end 2024-03-24 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63846932400, #    utc_start 2024-03-24 03:00:00 (Sun)
  63863870400, #      utc_end 2024-10-06 04:00:00 (Sun)
  63846918000, #  local_start 2024-03-23 23:00:00 (Sat)
  63863856000, #    local_end 2024-10-06 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63863870400, #    utc_start 2024-10-06 04:00:00 (Sun)
  63878382000, #      utc_end 2025-03-23 03:00:00 (Sun)
  63863859600, #  local_start 2024-10-06 01:00:00 (Sun)
  63878371200, #    local_end 2025-03-23 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63878382000, #    utc_start 2025-03-23 03:00:00 (Sun)
  63895320000, #      utc_end 2025-10-05 04:00:00 (Sun)
  63878367600, #  local_start 2025-03-22 23:00:00 (Sat)
  63895305600, #    local_end 2025-10-05 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63895320000, #    utc_start 2025-10-05 04:00:00 (Sun)
  63909831600, #      utc_end 2026-03-22 03:00:00 (Sun)
  63895309200, #  local_start 2025-10-05 01:00:00 (Sun)
  63909820800, #    local_end 2026-03-22 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63909831600, #    utc_start 2026-03-22 03:00:00 (Sun)
  63926769600, #      utc_end 2026-10-04 04:00:00 (Sun)
  63909817200, #  local_start 2026-03-21 23:00:00 (Sat)
  63926755200, #    local_end 2026-10-04 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63926769600, #    utc_start 2026-10-04 04:00:00 (Sun)
  63941886000, #      utc_end 2027-03-28 03:00:00 (Sun)
  63926758800, #  local_start 2026-10-04 01:00:00 (Sun)
  63941875200, #    local_end 2027-03-28 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63941886000, #    utc_start 2027-03-28 03:00:00 (Sun)
  63958219200, #      utc_end 2027-10-03 04:00:00 (Sun)
  63941871600, #  local_start 2027-03-27 23:00:00 (Sat)
  63958204800, #    local_end 2027-10-03 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63958219200, #    utc_start 2027-10-03 04:00:00 (Sun)
  63973335600, #      utc_end 2028-03-26 03:00:00 (Sun)
  63958208400, #  local_start 2027-10-03 01:00:00 (Sun)
  63973324800, #    local_end 2028-03-26 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63973335600, #    utc_start 2028-03-26 03:00:00 (Sun)
  63989668800, #      utc_end 2028-10-01 04:00:00 (Sun)
  63973321200, #  local_start 2028-03-25 23:00:00 (Sat)
  63989654400, #    local_end 2028-10-01 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63989668800, #    utc_start 2028-10-01 04:00:00 (Sun)
  64004785200, #      utc_end 2029-03-25 03:00:00 (Sun)
  63989658000, #  local_start 2028-10-01 01:00:00 (Sun)
  64004774400, #    local_end 2029-03-25 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  64004785200, #    utc_start 2029-03-25 03:00:00 (Sun)
  64021723200, #      utc_end 2029-10-07 04:00:00 (Sun)
  64004770800, #  local_start 2029-03-24 23:00:00 (Sat)
  64021708800, #    local_end 2029-10-07 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  64021723200, #    utc_start 2029-10-07 04:00:00 (Sun)
  64036234800, #      utc_end 2030-03-24 03:00:00 (Sun)
  64021712400, #  local_start 2029-10-07 01:00:00 (Sun)
  64036224000, #    local_end 2030-03-24 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  64036234800, #    utc_start 2030-03-24 03:00:00 (Sun)
  64053172800, #      utc_end 2030-10-06 04:00:00 (Sun)
  64036220400, #  local_start 2030-03-23 23:00:00 (Sat)
  64053158400, #    local_end 2030-10-06 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {56}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -14400 }
  
  my $last_observance = bless( {
    'format' => '-04/-03',
    'gmtoff' => '-4:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 720713,
      'local_rd_secs' => 82800,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 720713,
      'utc_rd_secs' => 82800,
      'utc_year' => 1975
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -14400,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 720714,
      'local_rd_secs' => 10800,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 720714,
      'utc_rd_secs' => 10800,
      'utc_year' => 1975
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '0:00',
      'from' => '2010',
      'in' => 'Oct',
      'letter' => '',
      'name' => 'Para',
      'offset_from_std' => 3600,
      'on' => 'Sun>=1',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '0:00',
      'from' => '2013',
      'in' => 'Mar',
      'letter' => '',
      'name' => 'Para',
      'offset_from_std' => 0,
      'on' => 'Sun>=22',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_ASUNCION

    $main::fatpacked{"DateTime/TimeZone/America/Atikokan.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_ATIKOKAN';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Atikokan;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Atikokan::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59768949988, #      utc_end 1895-01-01 06:06:28 (Tue)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59768928000, #    local_end 1895-01-01 00:00:00 (Tue)
  -21988,
  0,
  'LMT',
      ],
      [
  59768949988, #    utc_start 1895-01-01 06:06:28 (Tue)
  60503616000, #      utc_end 1918-04-14 08:00:00 (Sun)
  59768928388, #  local_start 1895-01-01 00:06:28 (Tue)
  60503594400, #    local_end 1918-04-14 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  60503616000, #    utc_start 1918-04-14 08:00:00 (Sun)
  60520546800, #      utc_end 1918-10-27 07:00:00 (Sun)
  60503598000, #  local_start 1918-04-14 03:00:00 (Sun)
  60520528800, #    local_end 1918-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  60520546800, #    utc_start 1918-10-27 07:00:00 (Sun)
  61212434400, #      utc_end 1940-09-29 06:00:00 (Sun)
  60520525200, #  local_start 1918-10-27 01:00:00 (Sun)
  61212412800, #    local_end 1940-09-29 00:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61212434400, #    utc_start 1940-09-29 06:00:00 (Sun)
  61255468800, #      utc_end 1942-02-09 08:00:00 (Mon)
  61212416400, #  local_start 1940-09-29 01:00:00 (Sun)
  61255450800, #    local_end 1942-02-09 03:00:00 (Mon)
  -18000,
  1,
  'CDT',
      ],
      [
  61255468800, #    utc_start 1942-02-09 08:00:00 (Mon)
  61366287600, #      utc_end 1945-08-14 23:00:00 (Tue)
  61255450800, #  local_start 1942-02-09 03:00:00 (Mon)
  61366269600, #    local_end 1945-08-14 18:00:00 (Tue)
  -18000,
  1,
  'CWT',
      ],
      [
  61366287600, #    utc_start 1945-08-14 23:00:00 (Tue)
  61370290800, #      utc_end 1945-09-30 07:00:00 (Sun)
  61366269600, #  local_start 1945-08-14 18:00:00 (Tue)
  61370272800, #    local_end 1945-09-30 02:00:00 (Sun)
  -18000,
  1,
  'CPT',
      ],
      [
  61370290800, #    utc_start 1945-09-30 07:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #      utc_end
  61370272800, #  local_start 1945-09-30 02:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  -18000,
  0,
  'EST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {4}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_ATIKOKAN

    $main::fatpacked{"DateTime/TimeZone/America/Bahia.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_BAHIA';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/southamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Bahia;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Bahia::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60368466844, #      utc_end 1914-01-01 02:34:04 (Thu)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60368457600, #    local_end 1914-01-01 00:00:00 (Thu)
  -9244,
  0,
  'LMT',
      ],
      [
  60368466844, #    utc_start 1914-01-01 02:34:04 (Thu)
  60928725600, #      utc_end 1931-10-03 14:00:00 (Sat)
  60368456044, #  local_start 1913-12-31 23:34:04 (Wed)
  60928714800, #    local_end 1931-10-03 11:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  60928725600, #    utc_start 1931-10-03 14:00:00 (Sat)
  60944320800, #      utc_end 1932-04-01 02:00:00 (Fri)
  60928718400, #  local_start 1931-10-03 12:00:00 (Sat)
  60944313600, #    local_end 1932-04-01 00:00:00 (Fri)
  -7200,
  1,
  '-02',
      ],
      [
  60944320800, #    utc_start 1932-04-01 02:00:00 (Fri)
  60960308400, #      utc_end 1932-10-03 03:00:00 (Mon)
  60944310000, #  local_start 1932-03-31 23:00:00 (Thu)
  60960297600, #    local_end 1932-10-03 00:00:00 (Mon)
  -10800,
  0,
  '-03',
      ],
      [
  60960308400, #    utc_start 1932-10-03 03:00:00 (Mon)
  60975856800, #      utc_end 1933-04-01 02:00:00 (Sat)
  60960301200, #  local_start 1932-10-03 01:00:00 (Mon)
  60975849600, #    local_end 1933-04-01 00:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  60975856800, #    utc_start 1933-04-01 02:00:00 (Sat)
  61501863600, #      utc_end 1949-12-01 03:00:00 (Thu)
  60975846000, #  local_start 1933-03-31 23:00:00 (Fri)
  61501852800, #    local_end 1949-12-01 00:00:00 (Thu)
  -10800,
  0,
  '-03',
      ],
      [
  61501863600, #    utc_start 1949-12-01 03:00:00 (Thu)
  61513614000, #      utc_end 1950-04-16 03:00:00 (Sun)
  61501856400, #  local_start 1949-12-01 01:00:00 (Thu)
  61513606800, #    local_end 1950-04-16 01:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  61513614000, #    utc_start 1950-04-16 03:00:00 (Sun)
  61533399600, #      utc_end 1950-12-01 03:00:00 (Fri)
  61513603200, #  local_start 1950-04-16 00:00:00 (Sun)
  61533388800, #    local_end 1950-12-01 00:00:00 (Fri)
  -10800,
  0,
  '-03',
      ],
      [
  61533399600, #    utc_start 1950-12-01 03:00:00 (Fri)
  61543850400, #      utc_end 1951-04-01 02:00:00 (Sun)
  61533392400, #  local_start 1950-12-01 01:00:00 (Fri)
  61543843200, #    local_end 1951-04-01 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  61543850400, #    utc_start 1951-04-01 02:00:00 (Sun)
  61564935600, #      utc_end 1951-12-01 03:00:00 (Sat)
  61543839600, #  local_start 1951-03-31 23:00:00 (Sat)
  61564924800, #    local_end 1951-12-01 00:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  61564935600, #    utc_start 1951-12-01 03:00:00 (Sat)
  61575472800, #      utc_end 1952-04-01 02:00:00 (Tue)
  61564928400, #  local_start 1951-12-01 01:00:00 (Sat)
  61575465600, #    local_end 1952-04-01 00:00:00 (Tue)
  -7200,
  1,
  '-02',
      ],
      [
  61575472800, #    utc_start 1952-04-01 02:00:00 (Tue)
  61596558000, #      utc_end 1952-12-01 03:00:00 (Mon)
  61575462000, #  local_start 1952-03-31 23:00:00 (Mon)
  61596547200, #    local_end 1952-12-01 00:00:00 (Mon)
  -10800,
  0,
  '-03',
      ],
      [
  61596558000, #    utc_start 1952-12-01 03:00:00 (Mon)
  61604330400, #      utc_end 1953-03-01 02:00:00 (Sun)
  61596550800, #  local_start 1952-12-01 01:00:00 (Mon)
  61604323200, #    local_end 1953-03-01 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  61604330400, #    utc_start 1953-03-01 02:00:00 (Sun)
  61944318000, #      utc_end 1963-12-09 03:00:00 (Mon)
  61604319600, #  local_start 1953-02-28 23:00:00 (Sat)
  61944307200, #    local_end 1963-12-09 00:00:00 (Mon)
  -10800,
  0,
  '-03',
      ],
      [
  61944318000, #    utc_start 1963-12-09 03:00:00 (Mon)
  61951485600, #      utc_end 1964-03-01 02:00:00 (Sun)
  61944310800, #  local_start 1963-12-09 01:00:00 (Mon)
  61951478400, #    local_end 1964-03-01 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  61951485600, #    utc_start 1964-03-01 02:00:00 (Sun)
  61980519600, #      utc_end 1965-01-31 03:00:00 (Sun)
  61951474800, #  local_start 1964-02-29 23:00:00 (Sat)
  61980508800, #    local_end 1965-01-31 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  61980519600, #    utc_start 1965-01-31 03:00:00 (Sun)
  61985613600, #      utc_end 1965-03-31 02:00:00 (Wed)
  61980512400, #  local_start 1965-01-31 01:00:00 (Sun)
  61985606400, #    local_end 1965-03-31 00:00:00 (Wed)
  -7200,
  1,
  '-02',
      ],
      [
  61985613600, #    utc_start 1965-03-31 02:00:00 (Wed)
  62006785200, #      utc_end 1965-12-01 03:00:00 (Wed)
  61985602800, #  local_start 1965-03-30 23:00:00 (Tue)
  62006774400, #    local_end 1965-12-01 00:00:00 (Wed)
  -10800,
  0,
  '-03',
      ],
      [
  62006785200, #    utc_start 1965-12-01 03:00:00 (Wed)
  62014557600, #      utc_end 1966-03-01 02:00:00 (Tue)
  62006778000, #  local_start 1965-12-01 01:00:00 (Wed)
  62014550400, #    local_end 1966-03-01 00:00:00 (Tue)
  -7200,
  1,
  '-02',
      ],
      [
  62014557600, #    utc_start 1966-03-01 02:00:00 (Tue)
  62035729200, #      utc_end 1966-11-01 03:00:00 (Tue)
  62014546800, #  local_start 1966-02-28 23:00:00 (Mon)
  62035718400, #    local_end 1966-11-01 00:00:00 (Tue)
  -10800,
  0,
  '-03',
      ],
      [
  62035729200, #    utc_start 1966-11-01 03:00:00 (Tue)
  62046093600, #      utc_end 1967-03-01 02:00:00 (Wed)
  62035722000, #  local_start 1966-11-01 01:00:00 (Tue)
  62046086400, #    local_end 1967-03-01 00:00:00 (Wed)
  -7200,
  1,
  '-02',
      ],
      [
  62046093600, #    utc_start 1967-03-01 02:00:00 (Wed)
  62067265200, #      utc_end 1967-11-01 03:00:00 (Wed)
  62046082800, #  local_start 1967-02-28 23:00:00 (Tue)
  62067254400, #    local_end 1967-11-01 00:00:00 (Wed)
  -10800,
  0,
  '-03',
      ],
      [
  62067265200, #    utc_start 1967-11-01 03:00:00 (Wed)
  62077716000, #      utc_end 1968-03-01 02:00:00 (Fri)
  62067258000, #  local_start 1967-11-01 01:00:00 (Wed)
  62077708800, #    local_end 1968-03-01 00:00:00 (Fri)
  -7200,
  1,
  '-02',
      ],
      [
  62077716000, #    utc_start 1968-03-01 02:00:00 (Fri)
  62635431600, #      utc_end 1985-11-02 03:00:00 (Sat)
  62077705200, #  local_start 1968-02-29 23:00:00 (Thu)
  62635420800, #    local_end 1985-11-02 00:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  62635431600, #    utc_start 1985-11-02 03:00:00 (Sat)
  62646919200, #      utc_end 1986-03-15 02:00:00 (Sat)
  62635424400, #  local_start 1985-11-02 01:00:00 (Sat)
  62646912000, #    local_end 1986-03-15 00:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  62646919200, #    utc_start 1986-03-15 02:00:00 (Sat)
  62666276400, #      utc_end 1986-10-25 03:00:00 (Sat)
  62646908400, #  local_start 1986-03-14 23:00:00 (Fri)
  62666265600, #    local_end 1986-10-25 00:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  62666276400, #    utc_start 1986-10-25 03:00:00 (Sat)
  62675949600, #      utc_end 1987-02-14 02:00:00 (Sat)
  62666269200, #  local_start 1986-10-25 01:00:00 (Sat)
  62675942400, #    local_end 1987-02-14 00:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  62675949600, #    utc_start 1987-02-14 02:00:00 (Sat)
  62697812400, #      utc_end 1987-10-25 03:00:00 (Sun)
  62675938800, #  local_start 1987-02-13 23:00:00 (Fri)
  62697801600, #    local_end 1987-10-25 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62697812400, #    utc_start 1987-10-25 03:00:00 (Sun)
  62706880800, #      utc_end 1988-02-07 02:00:00 (Sun)
  62697805200, #  local_start 1987-10-25 01:00:00 (Sun)
  62706873600, #    local_end 1988-02-07 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62706880800, #    utc_start 1988-02-07 02:00:00 (Sun)
  62728657200, #      utc_end 1988-10-16 03:00:00 (Sun)
  62706870000, #  local_start 1988-02-06 23:00:00 (Sat)
  62728646400, #    local_end 1988-10-16 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62728657200, #    utc_start 1988-10-16 03:00:00 (Sun)
  62737725600, #      utc_end 1989-01-29 02:00:00 (Sun)
  62728650000, #  local_start 1988-10-16 01:00:00 (Sun)
  62737718400, #    local_end 1989-01-29 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62737725600, #    utc_start 1989-01-29 02:00:00 (Sun)
  62760106800, #      utc_end 1989-10-15 03:00:00 (Sun)
  62737714800, #  local_start 1989-01-28 23:00:00 (Sat)
  62760096000, #    local_end 1989-10-15 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62760106800, #    utc_start 1989-10-15 03:00:00 (Sun)
  62770384800, #      utc_end 1990-02-11 02:00:00 (Sun)
  62760099600, #  local_start 1989-10-15 01:00:00 (Sun)
  62770377600, #    local_end 1990-02-11 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62770384800, #    utc_start 1990-02-11 02:00:00 (Sun)
  62792161200, #      utc_end 1990-10-21 03:00:00 (Sun)
  62770374000, #  local_start 1990-02-10 23:00:00 (Sat)
  62792150400, #    local_end 1990-10-21 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62792161200, #    utc_start 1990-10-21 03:00:00 (Sun)
  62802439200, #      utc_end 1991-02-17 02:00:00 (Sun)
  62792154000, #  local_start 1990-10-21 01:00:00 (Sun)
  62802432000, #    local_end 1991-02-17 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62802439200, #    utc_start 1991-02-17 02:00:00 (Sun)
  62823610800, #      utc_end 1991-10-20 03:00:00 (Sun)
  62802428400, #  local_start 1991-02-16 23:00:00 (Sat)
  62823600000, #    local_end 1991-10-20 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62823610800, #    utc_start 1991-10-20 03:00:00 (Sun)
  62833284000, #      utc_end 1992-02-09 02:00:00 (Sun)
  62823603600, #  local_start 1991-10-20 01:00:00 (Sun)
  62833276800, #    local_end 1992-02-09 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62833284000, #    utc_start 1992-02-09 02:00:00 (Sun)
  62855665200, #      utc_end 1992-10-25 03:00:00 (Sun)
  62833273200, #  local_start 1992-02-08 23:00:00 (Sat)
  62855654400, #    local_end 1992-10-25 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62855665200, #    utc_start 1992-10-25 03:00:00 (Sun)
  62864128800, #      utc_end 1993-01-31 02:00:00 (Sun)
  62855658000, #  local_start 1992-10-25 01:00:00 (Sun)
  62864121600, #    local_end 1993-01-31 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62864128800, #    utc_start 1993-01-31 02:00:00 (Sun)
  62886510000, #      utc_end 1993-10-17 03:00:00 (Sun)
  62864118000, #  local_start 1993-01-30 23:00:00 (Sat)
  62886499200, #    local_end 1993-10-17 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62886510000, #    utc_start 1993-10-17 03:00:00 (Sun)
  62897392800, #      utc_end 1994-02-20 02:00:00 (Sun)
  62886502800, #  local_start 1993-10-17 01:00:00 (Sun)
  62897385600, #    local_end 1994-02-20 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62897392800, #    utc_start 1994-02-20 02:00:00 (Sun)
  62917959600, #      utc_end 1994-10-16 03:00:00 (Sun)
  62897382000, #  local_start 1994-02-19 23:00:00 (Sat)
  62917948800, #    local_end 1994-10-16 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62917959600, #    utc_start 1994-10-16 03:00:00 (Sun)
  62928842400, #      utc_end 1995-02-19 02:00:00 (Sun)
  62917952400, #  local_start 1994-10-16 01:00:00 (Sun)
  62928835200, #    local_end 1995-02-19 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62928842400, #    utc_start 1995-02-19 02:00:00 (Sun)
  62949409200, #      utc_end 1995-10-15 03:00:00 (Sun)
  62928831600, #  local_start 1995-02-18 23:00:00 (Sat)
  62949398400, #    local_end 1995-10-15 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62949409200, #    utc_start 1995-10-15 03:00:00 (Sun)
  62959687200, #      utc_end 1996-02-11 02:00:00 (Sun)
  62949402000, #  local_start 1995-10-15 01:00:00 (Sun)
  62959680000, #    local_end 1996-02-11 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62959687200, #    utc_start 1996-02-11 02:00:00 (Sun)
  62980254000, #      utc_end 1996-10-06 03:00:00 (Sun)
  62959676400, #  local_start 1996-02-10 23:00:00 (Sat)
  62980243200, #    local_end 1996-10-06 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62980254000, #    utc_start 1996-10-06 03:00:00 (Sun)
  62991741600, #      utc_end 1997-02-16 02:00:00 (Sun)
  62980246800, #  local_start 1996-10-06 01:00:00 (Sun)
  62991734400, #    local_end 1997-02-16 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62991741600, #    utc_start 1997-02-16 02:00:00 (Sun)
  63011790000, #      utc_end 1997-10-06 03:00:00 (Mon)
  62991730800, #  local_start 1997-02-15 23:00:00 (Sat)
  63011779200, #    local_end 1997-10-06 00:00:00 (Mon)
  -10800,
  0,
  '-03',
      ],
      [
  63011790000, #    utc_start 1997-10-06 03:00:00 (Mon)
  63024400800, #      utc_end 1998-03-01 02:00:00 (Sun)
  63011782800, #  local_start 1997-10-06 01:00:00 (Mon)
  63024393600, #    local_end 1998-03-01 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63024400800, #    utc_start 1998-03-01 02:00:00 (Sun)
  63043758000, #      utc_end 1998-10-11 03:00:00 (Sun)
  63024390000, #  local_start 1998-02-28 23:00:00 (Sat)
  63043747200, #    local_end 1998-10-11 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63043758000, #    utc_start 1998-10-11 03:00:00 (Sun)
  63055245600, #      utc_end 1999-02-21 02:00:00 (Sun)
  63043750800, #  local_start 1998-10-11 01:00:00 (Sun)
  63055238400, #    local_end 1999-02-21 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63055245600, #    utc_start 1999-02-21 02:00:00 (Sun)
  63074602800, #      utc_end 1999-10-03 03:00:00 (Sun)
  63055234800, #  local_start 1999-02-20 23:00:00 (Sat)
  63074592000, #    local_end 1999-10-03 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63074602800, #    utc_start 1999-10-03 03:00:00 (Sun)
  63087300000, #      utc_end 2000-02-27 02:00:00 (Sun)
  63074595600, #  local_start 1999-10-03 01:00:00 (Sun)
  63087292800, #    local_end 2000-02-27 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63087300000, #    utc_start 2000-02-27 02:00:00 (Sun)
  63106657200, #      utc_end 2000-10-08 03:00:00 (Sun)
  63087289200, #  local_start 2000-02-26 23:00:00 (Sat)
  63106646400, #    local_end 2000-10-08 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63106657200, #    utc_start 2000-10-08 03:00:00 (Sun)
  63118144800, #      utc_end 2001-02-18 02:00:00 (Sun)
  63106650000, #  local_start 2000-10-08 01:00:00 (Sun)
  63118137600, #    local_end 2001-02-18 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63118144800, #    utc_start 2001-02-18 02:00:00 (Sun)
  63138711600, #      utc_end 2001-10-14 03:00:00 (Sun)
  63118134000, #  local_start 2001-02-17 23:00:00 (Sat)
  63138700800, #    local_end 2001-10-14 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63138711600, #    utc_start 2001-10-14 03:00:00 (Sun)
  63149594400, #      utc_end 2002-02-17 02:00:00 (Sun)
  63138704400, #  local_start 2001-10-14 01:00:00 (Sun)
  63149587200, #    local_end 2002-02-17 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63149594400, #    utc_start 2002-02-17 02:00:00 (Sun)
  63171975600, #      utc_end 2002-11-03 03:00:00 (Sun)
  63149583600, #  local_start 2002-02-16 23:00:00 (Sat)
  63171964800, #    local_end 2002-11-03 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63171975600, #    utc_start 2002-11-03 03:00:00 (Sun)
  63181044000, #      utc_end 2003-02-16 02:00:00 (Sun)
  63171968400, #  local_start 2002-11-03 01:00:00 (Sun)
  63181036800, #    local_end 2003-02-16 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63181044000, #    utc_start 2003-02-16 02:00:00 (Sun)
  63200055600, #      utc_end 2003-09-24 03:00:00 (Wed)
  63181033200, #  local_start 2003-02-15 23:00:00 (Sat)
  63200044800, #    local_end 2003-09-24 00:00:00 (Wed)
  -10800,
  0,
  '-03',
      ],
      [
  63200055600, #    utc_start 2003-09-24 03:00:00 (Wed)
  63454417200, #      utc_end 2011-10-16 03:00:00 (Sun)
  63200044800, #  local_start 2003-09-24 00:00:00 (Wed)
  63454406400, #    local_end 2011-10-16 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63454417200, #    utc_start 2011-10-16 03:00:00 (Sun)
  63465904800, #      utc_end 2012-02-26 02:00:00 (Sun)
  63454410000, #  local_start 2011-10-16 01:00:00 (Sun)
  63465897600, #    local_end 2012-02-26 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63465904800, #    utc_start 2012-02-26 02:00:00 (Sun)
  63486471600, #      utc_end 2012-10-21 03:00:00 (Sun)
  63465894000, #  local_start 2012-02-25 23:00:00 (Sat)
  63486460800, #    local_end 2012-10-21 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63486471600, #    utc_start 2012-10-21 03:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #      utc_end
  63486460800, #  local_start 2012-10-21 00:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  -10800,
  0,
  '-03',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {30}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_BAHIA

    $main::fatpacked{"DateTime/TimeZone/America/Bahia_Banderas.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_BAHIA_BANDERAS';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Bahia_Banderas;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Bahia_Banderas::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60620943600, #      utc_end 1922-01-01 07:00:00 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60620918340, #    local_end 1921-12-31 23:59:00 (Sat)
  -25260,
  0,
  'LMT',
      ],
      [
  60620943600, #    utc_start 1922-01-01 07:00:00 (Sun)
  60792616800, #      utc_end 1927-06-11 06:00:00 (Sat)
  60620918400, #  local_start 1922-01-01 00:00:00 (Sun)
  60792591600, #    local_end 1927-06-10 23:00:00 (Fri)
  -25200,
  0,
  'MST',
      ],
      [
  60792616800, #    utc_start 1927-06-11 06:00:00 (Sat)
  60900876000, #      utc_end 1930-11-15 06:00:00 (Sat)
  60792595200, #  local_start 1927-06-11 00:00:00 (Sat)
  60900854400, #    local_end 1930-11-15 00:00:00 (Sat)
  -21600,
  0,
  'CST',
      ],
      [
  60900876000, #    utc_start 1930-11-15 06:00:00 (Sat)
  60915391200, #      utc_end 1931-05-02 06:00:00 (Sat)
  60900850800, #  local_start 1930-11-14 23:00:00 (Fri)
  60915366000, #    local_end 1931-05-01 23:00:00 (Fri)
  -25200,
  0,
  'MST',
      ],
      [
  60915391200, #    utc_start 1931-05-02 06:00:00 (Sat)
  60928524000, #      utc_end 1931-10-01 06:00:00 (Thu)
  60915369600, #  local_start 1931-05-02 00:00:00 (Sat)
  60928502400, #    local_end 1931-10-01 00:00:00 (Thu)
  -21600,
  0,
  'CST',
      ],
      [
  60928524000, #    utc_start 1931-10-01 06:00:00 (Thu)
  60944338800, #      utc_end 1932-04-01 07:00:00 (Fri)
  60928498800, #  local_start 1931-09-30 23:00:00 (Wed)
  60944313600, #    local_end 1932-04-01 00:00:00 (Fri)
  -25200,
  0,
  'MST',
      ],
      [
  60944338800, #    utc_start 1932-04-01 07:00:00 (Fri)
  61261855200, #      utc_end 1942-04-24 06:00:00 (Fri)
  60944317200, #  local_start 1932-04-01 01:00:00 (Fri)
  61261833600, #    local_end 1942-04-24 00:00:00 (Fri)
  -21600,
  0,
  'CST',
      ],
      [
  61261855200, #    utc_start 1942-04-24 06:00:00 (Fri)
  61474143600, #      utc_end 1949-01-14 07:00:00 (Fri)
  61261830000, #  local_start 1942-04-23 23:00:00 (Thu)
  61474118400, #    local_end 1949-01-14 00:00:00 (Fri)
  -25200,
  0,
  'MST',
      ],
      [
  61474143600, #    utc_start 1949-01-14 07:00:00 (Fri)
  62135712000, #      utc_end 1970-01-01 08:00:00 (Thu)
  61474114800, #  local_start 1949-01-13 23:00:00 (Thu)
  62135683200, #    local_end 1970-01-01 00:00:00 (Thu)
  -28800,
  0,
  'PST',
      ],
      [
  62135712000, #    utc_start 1970-01-01 08:00:00 (Thu)
  62964550800, #      utc_end 1996-04-07 09:00:00 (Sun)
  62135686800, #  local_start 1970-01-01 01:00:00 (Thu)
  62964525600, #    local_end 1996-04-07 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62964550800, #    utc_start 1996-04-07 09:00:00 (Sun)
  62982086400, #      utc_end 1996-10-27 08:00:00 (Sun)
  62964529200, #  local_start 1996-04-07 03:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62982086400, #    utc_start 1996-10-27 08:00:00 (Sun)
  62996000400, #      utc_end 1997-04-06 09:00:00 (Sun)
  62982061200, #  local_start 1996-10-27 01:00:00 (Sun)
  62995975200, #    local_end 1997-04-06 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62996000400, #    utc_start 1997-04-06 09:00:00 (Sun)
  63013536000, #      utc_end 1997-10-26 08:00:00 (Sun)
  62995978800, #  local_start 1997-04-06 03:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63013536000, #    utc_start 1997-10-26 08:00:00 (Sun)
  63027450000, #      utc_end 1998-04-05 09:00:00 (Sun)
  63013510800, #  local_start 1997-10-26 01:00:00 (Sun)
  63027424800, #    local_end 1998-04-05 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63027450000, #    utc_start 1998-04-05 09:00:00 (Sun)
  63044985600, #      utc_end 1998-10-25 08:00:00 (Sun)
  63027428400, #  local_start 1998-04-05 03:00:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63044985600, #    utc_start 1998-10-25 08:00:00 (Sun)
  63058899600, #      utc_end 1999-04-04 09:00:00 (Sun)
  63044960400, #  local_start 1998-10-25 01:00:00 (Sun)
  63058874400, #    local_end 1999-04-04 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63058899600, #    utc_start 1999-04-04 09:00:00 (Sun)
  63077040000, #      utc_end 1999-10-31 08:00:00 (Sun)
  63058878000, #  local_start 1999-04-04 03:00:00 (Sun)
  63077018400, #    local_end 1999-10-31 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63077040000, #    utc_start 1999-10-31 08:00:00 (Sun)
  63090349200, #      utc_end 2000-04-02 09:00:00 (Sun)
  63077014800, #  local_start 1999-10-31 01:00:00 (Sun)
  63090324000, #    local_end 2000-04-02 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63090349200, #    utc_start 2000-04-02 09:00:00 (Sun)
  63108489600, #      utc_end 2000-10-29 08:00:00 (Sun)
  63090327600, #  local_start 2000-04-02 03:00:00 (Sun)
  63108468000, #    local_end 2000-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63108489600, #    utc_start 2000-10-29 08:00:00 (Sun)
  63124822800, #      utc_end 2001-05-06 09:00:00 (Sun)
  63108464400, #  local_start 2000-10-29 01:00:00 (Sun)
  63124797600, #    local_end 2001-05-06 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63124822800, #    utc_start 2001-05-06 09:00:00 (Sun)
  63137520000, #      utc_end 2001-09-30 08:00:00 (Sun)
  63124801200, #  local_start 2001-05-06 03:00:00 (Sun)
  63137498400, #    local_end 2001-09-30 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63137520000, #    utc_start 2001-09-30 08:00:00 (Sun)
  63153853200, #      utc_end 2002-04-07 09:00:00 (Sun)
  63137494800, #  local_start 2001-09-30 01:00:00 (Sun)
  63153828000, #    local_end 2002-04-07 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63153853200, #    utc_start 2002-04-07 09:00:00 (Sun)
  63171388800, #      utc_end 2002-10-27 08:00:00 (Sun)
  63153831600, #  local_start 2002-04-07 03:00:00 (Sun)
  63171367200, #    local_end 2002-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63171388800, #    utc_start 2002-10-27 08:00:00 (Sun)
  63185302800, #      utc_end 2003-04-06 09:00:00 (Sun)
  63171363600, #  local_start 2002-10-27 01:00:00 (Sun)
  63185277600, #    local_end 2003-04-06 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63185302800, #    utc_start 2003-04-06 09:00:00 (Sun)
  63202838400, #      utc_end 2003-10-26 08:00:00 (Sun)
  63185281200, #  local_start 2003-04-06 03:00:00 (Sun)
  63202816800, #    local_end 2003-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63202838400, #    utc_start 2003-10-26 08:00:00 (Sun)
  63216752400, #      utc_end 2004-04-04 09:00:00 (Sun)
  63202813200, #  local_start 2003-10-26 01:00:00 (Sun)
  63216727200, #    local_end 2004-04-04 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63216752400, #    utc_start 2004-04-04 09:00:00 (Sun)
  63234892800, #      utc_end 2004-10-31 08:00:00 (Sun)
  63216730800, #  local_start 2004-04-04 03:00:00 (Sun)
  63234871200, #    local_end 2004-10-31 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63234892800, #    utc_start 2004-10-31 08:00:00 (Sun)
  63248202000, #      utc_end 2005-04-03 09:00:00 (Sun)
  63234867600, #  local_start 2004-10-31 01:00:00 (Sun)
  63248176800, #    local_end 2005-04-03 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63248202000, #    utc_start 2005-04-03 09:00:00 (Sun)
  63266342400, #      utc_end 2005-10-30 08:00:00 (Sun)
  63248180400, #  local_start 2005-04-03 03:00:00 (Sun)
  63266320800, #    local_end 2005-10-30 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63266342400, #    utc_start 2005-10-30 08:00:00 (Sun)
  63279651600, #      utc_end 2006-04-02 09:00:00 (Sun)
  63266317200, #  local_start 2005-10-30 01:00:00 (Sun)
  63279626400, #    local_end 2006-04-02 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63279651600, #    utc_start 2006-04-02 09:00:00 (Sun)
  63297792000, #      utc_end 2006-10-29 08:00:00 (Sun)
  63279630000, #  local_start 2006-04-02 03:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63297792000, #    utc_start 2006-10-29 08:00:00 (Sun)
  63311101200, #      utc_end 2007-04-01 09:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63311076000, #    local_end 2007-04-01 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63311101200, #    utc_start 2007-04-01 09:00:00 (Sun)
  63329241600, #      utc_end 2007-10-28 08:00:00 (Sun)
  63311079600, #  local_start 2007-04-01 03:00:00 (Sun)
  63329220000, #    local_end 2007-10-28 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63329241600, #    utc_start 2007-10-28 08:00:00 (Sun)
  63343155600, #      utc_end 2008-04-06 09:00:00 (Sun)
  63329216400, #  local_start 2007-10-28 01:00:00 (Sun)
  63343130400, #    local_end 2008-04-06 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63343155600, #    utc_start 2008-04-06 09:00:00 (Sun)
  63360691200, #      utc_end 2008-10-26 08:00:00 (Sun)
  63343134000, #  local_start 2008-04-06 03:00:00 (Sun)
  63360669600, #    local_end 2008-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63360691200, #    utc_start 2008-10-26 08:00:00 (Sun)
  63374605200, #      utc_end 2009-04-05 09:00:00 (Sun)
  63360666000, #  local_start 2008-10-26 01:00:00 (Sun)
  63374580000, #    local_end 2009-04-05 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63374605200, #    utc_start 2009-04-05 09:00:00 (Sun)
  63392140800, #      utc_end 2009-10-25 08:00:00 (Sun)
  63374583600, #  local_start 2009-04-05 03:00:00 (Sun)
  63392119200, #    local_end 2009-10-25 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63392140800, #    utc_start 2009-10-25 08:00:00 (Sun)
  63406054800, #      utc_end 2010-04-04 09:00:00 (Sun)
  63392115600, #  local_start 2009-10-25 01:00:00 (Sun)
  63406029600, #    local_end 2010-04-04 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63406054800, #    utc_start 2010-04-04 09:00:00 (Sun)
  63424191600, #      utc_end 2010-10-31 07:00:00 (Sun)
  63406036800, #  local_start 2010-04-04 04:00:00 (Sun)
  63424173600, #    local_end 2010-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63424191600, #    utc_start 2010-10-31 07:00:00 (Sun)
  63437500800, #      utc_end 2011-04-03 08:00:00 (Sun)
  63424170000, #  local_start 2010-10-31 01:00:00 (Sun)
  63437479200, #    local_end 2011-04-03 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63437500800, #    utc_start 2011-04-03 08:00:00 (Sun)
  63455641200, #      utc_end 2011-10-30 07:00:00 (Sun)
  63437482800, #  local_start 2011-04-03 03:00:00 (Sun)
  63455623200, #    local_end 2011-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63455641200, #    utc_start 2011-10-30 07:00:00 (Sun)
  63468950400, #      utc_end 2012-04-01 08:00:00 (Sun)
  63455619600, #  local_start 2011-10-30 01:00:00 (Sun)
  63468928800, #    local_end 2012-04-01 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63468950400, #    utc_start 2012-04-01 08:00:00 (Sun)
  63487090800, #      utc_end 2012-10-28 07:00:00 (Sun)
  63468932400, #  local_start 2012-04-01 03:00:00 (Sun)
  63487072800, #    local_end 2012-10-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63487090800, #    utc_start 2012-10-28 07:00:00 (Sun)
  63501004800, #      utc_end 2013-04-07 08:00:00 (Sun)
  63487069200, #  local_start 2012-10-28 01:00:00 (Sun)
  63500983200, #    local_end 2013-04-07 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63501004800, #    utc_start 2013-04-07 08:00:00 (Sun)
  63518540400, #      utc_end 2013-10-27 07:00:00 (Sun)
  63500986800, #  local_start 2013-04-07 03:00:00 (Sun)
  63518522400, #    local_end 2013-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63518540400, #    utc_start 2013-10-27 07:00:00 (Sun)
  63532454400, #      utc_end 2014-04-06 08:00:00 (Sun)
  63518518800, #  local_start 2013-10-27 01:00:00 (Sun)
  63532432800, #    local_end 2014-04-06 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63532454400, #    utc_start 2014-04-06 08:00:00 (Sun)
  63549990000, #      utc_end 2014-10-26 07:00:00 (Sun)
  63532436400, #  local_start 2014-04-06 03:00:00 (Sun)
  63549972000, #    local_end 2014-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63549990000, #    utc_start 2014-10-26 07:00:00 (Sun)
  63563904000, #      utc_end 2015-04-05 08:00:00 (Sun)
  63549968400, #  local_start 2014-10-26 01:00:00 (Sun)
  63563882400, #    local_end 2015-04-05 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63563904000, #    utc_start 2015-04-05 08:00:00 (Sun)
  63581439600, #      utc_end 2015-10-25 07:00:00 (Sun)
  63563886000, #  local_start 2015-04-05 03:00:00 (Sun)
  63581421600, #    local_end 2015-10-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63581439600, #    utc_start 2015-10-25 07:00:00 (Sun)
  63595353600, #      utc_end 2016-04-03 08:00:00 (Sun)
  63581418000, #  local_start 2015-10-25 01:00:00 (Sun)
  63595332000, #    local_end 2016-04-03 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63595353600, #    utc_start 2016-04-03 08:00:00 (Sun)
  63613494000, #      utc_end 2016-10-30 07:00:00 (Sun)
  63595335600, #  local_start 2016-04-03 03:00:00 (Sun)
  63613476000, #    local_end 2016-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63613494000, #    utc_start 2016-10-30 07:00:00 (Sun)
  63626803200, #      utc_end 2017-04-02 08:00:00 (Sun)
  63613472400, #  local_start 2016-10-30 01:00:00 (Sun)
  63626781600, #    local_end 2017-04-02 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63626803200, #    utc_start 2017-04-02 08:00:00 (Sun)
  63644943600, #      utc_end 2017-10-29 07:00:00 (Sun)
  63626785200, #  local_start 2017-04-02 03:00:00 (Sun)
  63644925600, #    local_end 2017-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63644943600, #    utc_start 2017-10-29 07:00:00 (Sun)
  63658252800, #      utc_end 2018-04-01 08:00:00 (Sun)
  63644922000, #  local_start 2017-10-29 01:00:00 (Sun)
  63658231200, #    local_end 2018-04-01 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63658252800, #    utc_start 2018-04-01 08:00:00 (Sun)
  63676393200, #      utc_end 2018-10-28 07:00:00 (Sun)
  63658234800, #  local_start 2018-04-01 03:00:00 (Sun)
  63676375200, #    local_end 2018-10-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63676393200, #    utc_start 2018-10-28 07:00:00 (Sun)
  63690307200, #      utc_end 2019-04-07 08:00:00 (Sun)
  63676371600, #  local_start 2018-10-28 01:00:00 (Sun)
  63690285600, #    local_end 2019-04-07 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63690307200, #    utc_start 2019-04-07 08:00:00 (Sun)
  63707842800, #      utc_end 2019-10-27 07:00:00 (Sun)
  63690289200, #  local_start 2019-04-07 03:00:00 (Sun)
  63707824800, #    local_end 2019-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63707842800, #    utc_start 2019-10-27 07:00:00 (Sun)
  63721756800, #      utc_end 2020-04-05 08:00:00 (Sun)
  63707821200, #  local_start 2019-10-27 01:00:00 (Sun)
  63721735200, #    local_end 2020-04-05 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63721756800, #    utc_start 2020-04-05 08:00:00 (Sun)
  63739292400, #      utc_end 2020-10-25 07:00:00 (Sun)
  63721738800, #  local_start 2020-04-05 03:00:00 (Sun)
  63739274400, #    local_end 2020-10-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63739292400, #    utc_start 2020-10-25 07:00:00 (Sun)
  63753206400, #      utc_end 2021-04-04 08:00:00 (Sun)
  63739270800, #  local_start 2020-10-25 01:00:00 (Sun)
  63753184800, #    local_end 2021-04-04 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63753206400, #    utc_start 2021-04-04 08:00:00 (Sun)
  63771346800, #      utc_end 2021-10-31 07:00:00 (Sun)
  63753188400, #  local_start 2021-04-04 03:00:00 (Sun)
  63771328800, #    local_end 2021-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63771346800, #    utc_start 2021-10-31 07:00:00 (Sun)
  63784656000, #      utc_end 2022-04-03 08:00:00 (Sun)
  63771325200, #  local_start 2021-10-31 01:00:00 (Sun)
  63784634400, #    local_end 2022-04-03 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63784656000, #    utc_start 2022-04-03 08:00:00 (Sun)
  63802796400, #      utc_end 2022-10-30 07:00:00 (Sun)
  63784638000, #  local_start 2022-04-03 03:00:00 (Sun)
  63802778400, #    local_end 2022-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63802796400, #    utc_start 2022-10-30 07:00:00 (Sun)
  63816105600, #      utc_end 2023-04-02 08:00:00 (Sun)
  63802774800, #  local_start 2022-10-30 01:00:00 (Sun)
  63816084000, #    local_end 2023-04-02 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63816105600, #    utc_start 2023-04-02 08:00:00 (Sun)
  63834246000, #      utc_end 2023-10-29 07:00:00 (Sun)
  63816087600, #  local_start 2023-04-02 03:00:00 (Sun)
  63834228000, #    local_end 2023-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63834246000, #    utc_start 2023-10-29 07:00:00 (Sun)
  63848160000, #      utc_end 2024-04-07 08:00:00 (Sun)
  63834224400, #  local_start 2023-10-29 01:00:00 (Sun)
  63848138400, #    local_end 2024-04-07 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63848160000, #    utc_start 2024-04-07 08:00:00 (Sun)
  63865695600, #      utc_end 2024-10-27 07:00:00 (Sun)
  63848142000, #  local_start 2024-04-07 03:00:00 (Sun)
  63865677600, #    local_end 2024-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63865695600, #    utc_start 2024-10-27 07:00:00 (Sun)
  63879609600, #      utc_end 2025-04-06 08:00:00 (Sun)
  63865674000, #  local_start 2024-10-27 01:00:00 (Sun)
  63879588000, #    local_end 2025-04-06 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63879609600, #    utc_start 2025-04-06 08:00:00 (Sun)
  63897145200, #      utc_end 2025-10-26 07:00:00 (Sun)
  63879591600, #  local_start 2025-04-06 03:00:00 (Sun)
  63897127200, #    local_end 2025-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63897145200, #    utc_start 2025-10-26 07:00:00 (Sun)
  63911059200, #      utc_end 2026-04-05 08:00:00 (Sun)
  63897123600, #  local_start 2025-10-26 01:00:00 (Sun)
  63911037600, #    local_end 2026-04-05 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63911059200, #    utc_start 2026-04-05 08:00:00 (Sun)
  63928594800, #      utc_end 2026-10-25 07:00:00 (Sun)
  63911041200, #  local_start 2026-04-05 03:00:00 (Sun)
  63928576800, #    local_end 2026-10-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63928594800, #    utc_start 2026-10-25 07:00:00 (Sun)
  63942508800, #      utc_end 2027-04-04 08:00:00 (Sun)
  63928573200, #  local_start 2026-10-25 01:00:00 (Sun)
  63942487200, #    local_end 2027-04-04 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63942508800, #    utc_start 2027-04-04 08:00:00 (Sun)
  63960649200, #      utc_end 2027-10-31 07:00:00 (Sun)
  63942490800, #  local_start 2027-04-04 03:00:00 (Sun)
  63960631200, #    local_end 2027-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63960649200, #    utc_start 2027-10-31 07:00:00 (Sun)
  63973958400, #      utc_end 2028-04-02 08:00:00 (Sun)
  63960627600, #  local_start 2027-10-31 01:00:00 (Sun)
  63973936800, #    local_end 2028-04-02 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63973958400, #    utc_start 2028-04-02 08:00:00 (Sun)
  63992098800, #      utc_end 2028-10-29 07:00:00 (Sun)
  63973940400, #  local_start 2028-04-02 03:00:00 (Sun)
  63992080800, #    local_end 2028-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63992098800, #    utc_start 2028-10-29 07:00:00 (Sun)
  64005408000, #      utc_end 2029-04-01 08:00:00 (Sun)
  63992077200, #  local_start 2028-10-29 01:00:00 (Sun)
  64005386400, #    local_end 2029-04-01 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  64005408000, #    utc_start 2029-04-01 08:00:00 (Sun)
  64023548400, #      utc_end 2029-10-28 07:00:00 (Sun)
  64005390000, #  local_start 2029-04-01 03:00:00 (Sun)
  64023530400, #    local_end 2029-10-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  64023548400, #    utc_start 2029-10-28 07:00:00 (Sun)
  64037462400, #      utc_end 2030-04-07 08:00:00 (Sun)
  64023526800, #  local_start 2029-10-28 01:00:00 (Sun)
  64037440800, #    local_end 2030-04-07 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  64037462400, #    utc_start 2030-04-07 08:00:00 (Sun)
  64054998000, #      utc_end 2030-10-27 07:00:00 (Sun)
  64037444400, #  local_start 2030-04-07 03:00:00 (Sun)
  64054980000, #    local_end 2030-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {35}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -21600 }
  
  my $last_observance = bless( {
    'format' => 'C%sT',
    'gmtoff' => '-6:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 733866,
      'local_rd_secs' => 14400,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 733866,
      'utc_rd_secs' => 14400,
      'utc_year' => 2011
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -21600,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 733866,
      'local_rd_secs' => 32400,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 733866,
      'utc_rd_secs' => 32400,
      'utc_year' => 2011
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2002',
      'in' => 'Oct',
      'letter' => 'S',
      'name' => 'Mexico',
      'offset_from_std' => 0,
      'on' => 'lastSun',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2002',
      'in' => 'Apr',
      'letter' => 'D',
      'name' => 'Mexico',
      'offset_from_std' => 3600,
      'on' => 'Sun>=1',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_BAHIA_BANDERAS

    $main::fatpacked{"DateTime/TimeZone/America/Barbados.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_BARBADOS';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Barbados;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Barbados::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60684004709, #      utc_end 1924-01-01 03:58:29 (Tue)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60683990400, #    local_end 1924-01-01 00:00:00 (Tue)
  -14309,
  0,
  'LMT',
      ],
      [
  60684004709, #    utc_start 1924-01-01 03:58:29 (Tue)
  60936465509, #      utc_end 1932-01-01 03:58:29 (Fri)
  60683990400, #  local_start 1924-01-01 00:00:00 (Tue)
  60936451200, #    local_end 1932-01-01 00:00:00 (Fri)
  -14309,
  0,
  'BMT',
      ],
      [
  60936465509, #    utc_start 1932-01-01 03:58:29 (Fri)
  62370626400, #      utc_end 1977-06-12 06:00:00 (Sun)
  60936451109, #  local_start 1931-12-31 23:58:29 (Thu)
  62370612000, #    local_end 1977-06-12 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62370626400, #    utc_start 1977-06-12 06:00:00 (Sun)
  62380299600, #      utc_end 1977-10-02 05:00:00 (Sun)
  62370615600, #  local_start 1977-06-12 03:00:00 (Sun)
  62380288800, #    local_end 1977-10-02 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62380299600, #    utc_start 1977-10-02 05:00:00 (Sun)
  62397237600, #      utc_end 1978-04-16 06:00:00 (Sun)
  62380285200, #  local_start 1977-10-02 01:00:00 (Sun)
  62397223200, #    local_end 1978-04-16 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62397237600, #    utc_start 1978-04-16 06:00:00 (Sun)
  62411749200, #      utc_end 1978-10-01 05:00:00 (Sun)
  62397226800, #  local_start 1978-04-16 03:00:00 (Sun)
  62411738400, #    local_end 1978-10-01 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62411749200, #    utc_start 1978-10-01 05:00:00 (Sun)
  62428687200, #      utc_end 1979-04-15 06:00:00 (Sun)
  62411734800, #  local_start 1978-10-01 01:00:00 (Sun)
  62428672800, #    local_end 1979-04-15 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62428687200, #    utc_start 1979-04-15 06:00:00 (Sun)
  62443198800, #      utc_end 1979-09-30 05:00:00 (Sun)
  62428676400, #  local_start 1979-04-15 03:00:00 (Sun)
  62443188000, #    local_end 1979-09-30 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62443198800, #    utc_start 1979-09-30 05:00:00 (Sun)
  62460741600, #      utc_end 1980-04-20 06:00:00 (Sun)
  62443184400, #  local_start 1979-09-30 01:00:00 (Sun)
  62460727200, #    local_end 1980-04-20 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62460741600, #    utc_start 1980-04-20 06:00:00 (Sun)
  62474389200, #      utc_end 1980-09-25 05:00:00 (Thu)
  62460730800, #  local_start 1980-04-20 03:00:00 (Sun)
  62474378400, #    local_end 1980-09-25 02:00:00 (Thu)
  -10800,
  1,
  'ADT',
      ],
      [
  62474389200, #    utc_start 1980-09-25 05:00:00 (Thu)
  DateTime::TimeZone::INFINITY, #      utc_end
  62474374800, #  local_start 1980-09-25 01:00:00 (Thu)
  DateTime::TimeZone::INFINITY, #    local_end
  -14400,
  0,
  'AST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {4}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_BARBADOS

    $main::fatpacked{"DateTime/TimeZone/America/Belem.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_BELEM';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/southamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Belem;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Belem::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60368469236, #      utc_end 1914-01-01 03:13:56 (Thu)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60368457600, #    local_end 1914-01-01 00:00:00 (Thu)
  -11636,
  0,
  'LMT',
      ],
      [
  60368469236, #    utc_start 1914-01-01 03:13:56 (Thu)
  60928725600, #      utc_end 1931-10-03 14:00:00 (Sat)
  60368458436, #  local_start 1914-01-01 00:13:56 (Thu)
  60928714800, #    local_end 1931-10-03 11:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  60928725600, #    utc_start 1931-10-03 14:00:00 (Sat)
  60944320800, #      utc_end 1932-04-01 02:00:00 (Fri)
  60928718400, #  local_start 1931-10-03 12:00:00 (Sat)
  60944313600, #    local_end 1932-04-01 00:00:00 (Fri)
  -7200,
  1,
  '-02',
      ],
      [
  60944320800, #    utc_start 1932-04-01 02:00:00 (Fri)
  60960308400, #      utc_end 1932-10-03 03:00:00 (Mon)
  60944310000, #  local_start 1932-03-31 23:00:00 (Thu)
  60960297600, #    local_end 1932-10-03 00:00:00 (Mon)
  -10800,
  0,
  '-03',
      ],
      [
  60960308400, #    utc_start 1932-10-03 03:00:00 (Mon)
  60975856800, #      utc_end 1933-04-01 02:00:00 (Sat)
  60960301200, #  local_start 1932-10-03 01:00:00 (Mon)
  60975849600, #    local_end 1933-04-01 00:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  60975856800, #    utc_start 1933-04-01 02:00:00 (Sat)
  61501863600, #      utc_end 1949-12-01 03:00:00 (Thu)
  60975846000, #  local_start 1933-03-31 23:00:00 (Fri)
  61501852800, #    local_end 1949-12-01 00:00:00 (Thu)
  -10800,
  0,
  '-03',
      ],
      [
  61501863600, #    utc_start 1949-12-01 03:00:00 (Thu)
  61513614000, #      utc_end 1950-04-16 03:00:00 (Sun)
  61501856400, #  local_start 1949-12-01 01:00:00 (Thu)
  61513606800, #    local_end 1950-04-16 01:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  61513614000, #    utc_start 1950-04-16 03:00:00 (Sun)
  61533399600, #      utc_end 1950-12-01 03:00:00 (Fri)
  61513603200, #  local_start 1950-04-16 00:00:00 (Sun)
  61533388800, #    local_end 1950-12-01 00:00:00 (Fri)
  -10800,
  0,
  '-03',
      ],
      [
  61533399600, #    utc_start 1950-12-01 03:00:00 (Fri)
  61543850400, #      utc_end 1951-04-01 02:00:00 (Sun)
  61533392400, #  local_start 1950-12-01 01:00:00 (Fri)
  61543843200, #    local_end 1951-04-01 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  61543850400, #    utc_start 1951-04-01 02:00:00 (Sun)
  61564935600, #      utc_end 1951-12-01 03:00:00 (Sat)
  61543839600, #  local_start 1951-03-31 23:00:00 (Sat)
  61564924800, #    local_end 1951-12-01 00:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  61564935600, #    utc_start 1951-12-01 03:00:00 (Sat)
  61575472800, #      utc_end 1952-04-01 02:00:00 (Tue)
  61564928400, #  local_start 1951-12-01 01:00:00 (Sat)
  61575465600, #    local_end 1952-04-01 00:00:00 (Tue)
  -7200,
  1,
  '-02',
      ],
      [
  61575472800, #    utc_start 1952-04-01 02:00:00 (Tue)
  61596558000, #      utc_end 1952-12-01 03:00:00 (Mon)
  61575462000, #  local_start 1952-03-31 23:00:00 (Mon)
  61596547200, #    local_end 1952-12-01 00:00:00 (Mon)
  -10800,
  0,
  '-03',
      ],
      [
  61596558000, #    utc_start 1952-12-01 03:00:00 (Mon)
  61604330400, #      utc_end 1953-03-01 02:00:00 (Sun)
  61596550800, #  local_start 1952-12-01 01:00:00 (Mon)
  61604323200, #    local_end 1953-03-01 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  61604330400, #    utc_start 1953-03-01 02:00:00 (Sun)
  61944318000, #      utc_end 1963-12-09 03:00:00 (Mon)
  61604319600, #  local_start 1953-02-28 23:00:00 (Sat)
  61944307200, #    local_end 1963-12-09 00:00:00 (Mon)
  -10800,
  0,
  '-03',
      ],
      [
  61944318000, #    utc_start 1963-12-09 03:00:00 (Mon)
  61951485600, #      utc_end 1964-03-01 02:00:00 (Sun)
  61944310800, #  local_start 1963-12-09 01:00:00 (Mon)
  61951478400, #    local_end 1964-03-01 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  61951485600, #    utc_start 1964-03-01 02:00:00 (Sun)
  61980519600, #      utc_end 1965-01-31 03:00:00 (Sun)
  61951474800, #  local_start 1964-02-29 23:00:00 (Sat)
  61980508800, #    local_end 1965-01-31 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  61980519600, #    utc_start 1965-01-31 03:00:00 (Sun)
  61985613600, #      utc_end 1965-03-31 02:00:00 (Wed)
  61980512400, #  local_start 1965-01-31 01:00:00 (Sun)
  61985606400, #    local_end 1965-03-31 00:00:00 (Wed)
  -7200,
  1,
  '-02',
      ],
      [
  61985613600, #    utc_start 1965-03-31 02:00:00 (Wed)
  62006785200, #      utc_end 1965-12-01 03:00:00 (Wed)
  61985602800, #  local_start 1965-03-30 23:00:00 (Tue)
  62006774400, #    local_end 1965-12-01 00:00:00 (Wed)
  -10800,
  0,
  '-03',
      ],
      [
  62006785200, #    utc_start 1965-12-01 03:00:00 (Wed)
  62014557600, #      utc_end 1966-03-01 02:00:00 (Tue)
  62006778000, #  local_start 1965-12-01 01:00:00 (Wed)
  62014550400, #    local_end 1966-03-01 00:00:00 (Tue)
  -7200,
  1,
  '-02',
      ],
      [
  62014557600, #    utc_start 1966-03-01 02:00:00 (Tue)
  62035729200, #      utc_end 1966-11-01 03:00:00 (Tue)
  62014546800, #  local_start 1966-02-28 23:00:00 (Mon)
  62035718400, #    local_end 1966-11-01 00:00:00 (Tue)
  -10800,
  0,
  '-03',
      ],
      [
  62035729200, #    utc_start 1966-11-01 03:00:00 (Tue)
  62046093600, #      utc_end 1967-03-01 02:00:00 (Wed)
  62035722000, #  local_start 1966-11-01 01:00:00 (Tue)
  62046086400, #    local_end 1967-03-01 00:00:00 (Wed)
  -7200,
  1,
  '-02',
      ],
      [
  62046093600, #    utc_start 1967-03-01 02:00:00 (Wed)
  62067265200, #      utc_end 1967-11-01 03:00:00 (Wed)
  62046082800, #  local_start 1967-02-28 23:00:00 (Tue)
  62067254400, #    local_end 1967-11-01 00:00:00 (Wed)
  -10800,
  0,
  '-03',
      ],
      [
  62067265200, #    utc_start 1967-11-01 03:00:00 (Wed)
  62077716000, #      utc_end 1968-03-01 02:00:00 (Fri)
  62067258000, #  local_start 1967-11-01 01:00:00 (Wed)
  62077708800, #    local_end 1968-03-01 00:00:00 (Fri)
  -7200,
  1,
  '-02',
      ],
      [
  62077716000, #    utc_start 1968-03-01 02:00:00 (Fri)
  62635431600, #      utc_end 1985-11-02 03:00:00 (Sat)
  62077705200, #  local_start 1968-02-29 23:00:00 (Thu)
  62635420800, #    local_end 1985-11-02 00:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  62635431600, #    utc_start 1985-11-02 03:00:00 (Sat)
  62646919200, #      utc_end 1986-03-15 02:00:00 (Sat)
  62635424400, #  local_start 1985-11-02 01:00:00 (Sat)
  62646912000, #    local_end 1986-03-15 00:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  62646919200, #    utc_start 1986-03-15 02:00:00 (Sat)
  62666276400, #      utc_end 1986-10-25 03:00:00 (Sat)
  62646908400, #  local_start 1986-03-14 23:00:00 (Fri)
  62666265600, #    local_end 1986-10-25 00:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  62666276400, #    utc_start 1986-10-25 03:00:00 (Sat)
  62675949600, #      utc_end 1987-02-14 02:00:00 (Sat)
  62666269200, #  local_start 1986-10-25 01:00:00 (Sat)
  62675942400, #    local_end 1987-02-14 00:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  62675949600, #    utc_start 1987-02-14 02:00:00 (Sat)
  62697812400, #      utc_end 1987-10-25 03:00:00 (Sun)
  62675938800, #  local_start 1987-02-13 23:00:00 (Fri)
  62697801600, #    local_end 1987-10-25 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62697812400, #    utc_start 1987-10-25 03:00:00 (Sun)
  62706880800, #      utc_end 1988-02-07 02:00:00 (Sun)
  62697805200, #  local_start 1987-10-25 01:00:00 (Sun)
  62706873600, #    local_end 1988-02-07 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62706880800, #    utc_start 1988-02-07 02:00:00 (Sun)
  62725719600, #      utc_end 1988-09-12 03:00:00 (Mon)
  62706870000, #  local_start 1988-02-06 23:00:00 (Sat)
  62725708800, #    local_end 1988-09-12 00:00:00 (Mon)
  -10800,
  0,
  '-03',
      ],
      [
  62725719600, #    utc_start 1988-09-12 03:00:00 (Mon)
  DateTime::TimeZone::INFINITY, #      utc_end
  62725708800, #  local_start 1988-09-12 00:00:00 (Mon)
  DateTime::TimeZone::INFINITY, #    local_end
  -10800,
  0,
  '-03',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {14}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_BELEM

    $main::fatpacked{"DateTime/TimeZone/America/Belize.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_BELIZE';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Belize;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Belize::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60313182768, #      utc_end 1912-04-01 05:52:48 (Mon)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60313161600, #    local_end 1912-04-01 00:00:00 (Mon)
  -21168,
  0,
  'LMT',
      ],
      [
  60313182768, #    utc_start 1912-04-01 05:52:48 (Mon)
  60518728800, #      utc_end 1918-10-06 06:00:00 (Sun)
  60313161168, #  local_start 1912-03-31 23:52:48 (Sun)
  60518707200, #    local_end 1918-10-06 00:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  60518728800, #    utc_start 1918-10-06 06:00:00 (Sun)
  60529613400, #      utc_end 1919-02-09 05:30:00 (Sun)
  60518709000, #  local_start 1918-10-06 00:30:00 (Sun)
  60529593600, #    local_end 1919-02-09 00:00:00 (Sun)
  -19800,
  1,
  '-0530',
      ],
      [
  60529613400, #    utc_start 1919-02-09 05:30:00 (Sun)
  60550178400, #      utc_end 1919-10-05 06:00:00 (Sun)
  60529591800, #  local_start 1919-02-08 23:30:00 (Sat)
  60550156800, #    local_end 1919-10-05 00:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  60550178400, #    utc_start 1919-10-05 06:00:00 (Sun)
  60561667800, #      utc_end 1920-02-15 05:30:00 (Sun)
  60550158600, #  local_start 1919-10-05 00:30:00 (Sun)
  60561648000, #    local_end 1920-02-15 00:00:00 (Sun)
  -19800,
  1,
  '-0530',
      ],
      [
  60561667800, #    utc_start 1920-02-15 05:30:00 (Sun)
  60581628000, #      utc_end 1920-10-03 06:00:00 (Sun)
  60561646200, #  local_start 1920-02-14 23:30:00 (Sat)
  60581606400, #    local_end 1920-10-03 00:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  60581628000, #    utc_start 1920-10-03 06:00:00 (Sun)
  60593117400, #      utc_end 1921-02-13 05:30:00 (Sun)
  60581608200, #  local_start 1920-10-03 00:30:00 (Sun)
  60593097600, #    local_end 1921-02-13 00:00:00 (Sun)
  -19800,
  1,
  '-0530',
      ],
      [
  60593117400, #    utc_start 1921-02-13 05:30:00 (Sun)
  60613077600, #      utc_end 1921-10-02 06:00:00 (Sun)
  60593095800, #  local_start 1921-02-12 23:30:00 (Sat)
  60613056000, #    local_end 1921-10-02 00:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  60613077600, #    utc_start 1921-10-02 06:00:00 (Sun)
  60624567000, #      utc_end 1922-02-12 05:30:00 (Sun)
  60613057800, #  local_start 1921-10-02 00:30:00 (Sun)
  60624547200, #    local_end 1922-02-12 00:00:00 (Sun)
  -19800,
  1,
  '-0530',
      ],
      [
  60624567000, #    utc_start 1922-02-12 05:30:00 (Sun)
  60645132000, #      utc_end 1922-10-08 06:00:00 (Sun)
  60624545400, #  local_start 1922-02-11 23:30:00 (Sat)
  60645110400, #    local_end 1922-10-08 00:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  60645132000, #    utc_start 1922-10-08 06:00:00 (Sun)
  60656016600, #      utc_end 1923-02-11 05:30:00 (Sun)
  60645112200, #  local_start 1922-10-08 00:30:00 (Sun)
  60655996800, #    local_end 1923-02-11 00:00:00 (Sun)
  -19800,
  1,
  '-0530',
      ],
      [
  60656016600, #    utc_start 1923-02-11 05:30:00 (Sun)
  60676581600, #      utc_end 1923-10-07 06:00:00 (Sun)
  60655995000, #  local_start 1923-02-10 23:30:00 (Sat)
  60676560000, #    local_end 1923-10-07 00:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  60676581600, #    utc_start 1923-10-07 06:00:00 (Sun)
  60687466200, #      utc_end 1924-02-10 05:30:00 (Sun)
  60676561800, #  local_start 1923-10-07 00:30:00 (Sun)
  60687446400, #    local_end 1924-02-10 00:00:00 (Sun)
  -19800,
  1,
  '-0530',
      ],
      [
  60687466200, #    utc_start 1924-02-10 05:30:00 (Sun)
  60708031200, #      utc_end 1924-10-05 06:00:00 (Sun)
  60687444600, #  local_start 1924-02-09 23:30:00 (Sat)
  60708009600, #    local_end 1924-10-05 00:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  60708031200, #    utc_start 1924-10-05 06:00:00 (Sun)
  60719520600, #      utc_end 1925-02-15 05:30:00 (Sun)
  60708011400, #  local_start 1924-10-05 00:30:00 (Sun)
  60719500800, #    local_end 1925-02-15 00:00:00 (Sun)
  -19800,
  1,
  '-0530',
      ],
      [
  60719520600, #    utc_start 1925-02-15 05:30:00 (Sun)
  60739480800, #      utc_end 1925-10-04 06:00:00 (Sun)
  60719499000, #  local_start 1925-02-14 23:30:00 (Sat)
  60739459200, #    local_end 1925-10-04 00:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  60739480800, #    utc_start 1925-10-04 06:00:00 (Sun)
  60750970200, #      utc_end 1926-02-14 05:30:00 (Sun)
  60739461000, #  local_start 1925-10-04 00:30:00 (Sun)
  60750950400, #    local_end 1926-02-14 00:00:00 (Sun)
  -19800,
  1,
  '-0530',
      ],
      [
  60750970200, #    utc_start 1926-02-14 05:30:00 (Sun)
  60770930400, #      utc_end 1926-10-03 06:00:00 (Sun)
  60750948600, #  local_start 1926-02-13 23:30:00 (Sat)
  60770908800, #    local_end 1926-10-03 00:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  60770930400, #    utc_start 1926-10-03 06:00:00 (Sun)
  60782419800, #      utc_end 1927-02-13 05:30:00 (Sun)
  60770910600, #  local_start 1926-10-03 00:30:00 (Sun)
  60782400000, #    local_end 1927-02-13 00:00:00 (Sun)
  -19800,
  1,
  '-0530',
      ],
      [
  60782419800, #    utc_start 1927-02-13 05:30:00 (Sun)
  60802380000, #      utc_end 1927-10-02 06:00:00 (Sun)
  60782398200, #  local_start 1927-02-12 23:30:00 (Sat)
  60802358400, #    local_end 1927-10-02 00:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  60802380000, #    utc_start 1927-10-02 06:00:00 (Sun)
  60813869400, #      utc_end 1928-02-12 05:30:00 (Sun)
  60802360200, #  local_start 1927-10-02 00:30:00 (Sun)
  60813849600, #    local_end 1928-02-12 00:00:00 (Sun)
  -19800,
  1,
  '-0530',
      ],
      [
  60813869400, #    utc_start 1928-02-12 05:30:00 (Sun)
  60834434400, #      utc_end 1928-10-07 06:00:00 (Sun)
  60813847800, #  local_start 1928-02-11 23:30:00 (Sat)
  60834412800, #    local_end 1928-10-07 00:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  60834434400, #    utc_start 1928-10-07 06:00:00 (Sun)
  60845319000, #      utc_end 1929-02-10 05:30:00 (Sun)
  60834414600, #  local_start 1928-10-07 00:30:00 (Sun)
  60845299200, #    local_end 1929-02-10 00:00:00 (Sun)
  -19800,
  1,
  '-0530',
      ],
      [
  60845319000, #    utc_start 1929-02-10 05:30:00 (Sun)
  60865884000, #      utc_end 1929-10-06 06:00:00 (Sun)
  60845297400, #  local_start 1929-02-09 23:30:00 (Sat)
  60865862400, #    local_end 1929-10-06 00:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  60865884000, #    utc_start 1929-10-06 06:00:00 (Sun)
  60876768600, #      utc_end 1930-02-09 05:30:00 (Sun)
  60865864200, #  local_start 1929-10-06 00:30:00 (Sun)
  60876748800, #    local_end 1930-02-09 00:00:00 (Sun)
  -19800,
  1,
  '-0530',
      ],
      [
  60876768600, #    utc_start 1930-02-09 05:30:00 (Sun)
  60897333600, #      utc_end 1930-10-05 06:00:00 (Sun)
  60876747000, #  local_start 1930-02-08 23:30:00 (Sat)
  60897312000, #    local_end 1930-10-05 00:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  60897333600, #    utc_start 1930-10-05 06:00:00 (Sun)
  60908823000, #      utc_end 1931-02-15 05:30:00 (Sun)
  60897313800, #  local_start 1930-10-05 00:30:00 (Sun)
  60908803200, #    local_end 1931-02-15 00:00:00 (Sun)
  -19800,
  1,
  '-0530',
      ],
      [
  60908823000, #    utc_start 1931-02-15 05:30:00 (Sun)
  60928783200, #      utc_end 1931-10-04 06:00:00 (Sun)
  60908801400, #  local_start 1931-02-14 23:30:00 (Sat)
  60928761600, #    local_end 1931-10-04 00:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  60928783200, #    utc_start 1931-10-04 06:00:00 (Sun)
  60940272600, #      utc_end 1932-02-14 05:30:00 (Sun)
  60928763400, #  local_start 1931-10-04 00:30:00 (Sun)
  60940252800, #    local_end 1932-02-14 00:00:00 (Sun)
  -19800,
  1,
  '-0530',
      ],
      [
  60940272600, #    utc_start 1932-02-14 05:30:00 (Sun)
  60960232800, #      utc_end 1932-10-02 06:00:00 (Sun)
  60940251000, #  local_start 1932-02-13 23:30:00 (Sat)
  60960211200, #    local_end 1932-10-02 00:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  60960232800, #    utc_start 1932-10-02 06:00:00 (Sun)
  60971722200, #      utc_end 1933-02-12 05:30:00 (Sun)
  60960213000, #  local_start 1932-10-02 00:30:00 (Sun)
  60971702400, #    local_end 1933-02-12 00:00:00 (Sun)
  -19800,
  1,
  '-0530',
      ],
      [
  60971722200, #    utc_start 1933-02-12 05:30:00 (Sun)
  60992287200, #      utc_end 1933-10-08 06:00:00 (Sun)
  60971700600, #  local_start 1933-02-11 23:30:00 (Sat)
  60992265600, #    local_end 1933-10-08 00:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  60992287200, #    utc_start 1933-10-08 06:00:00 (Sun)
  61003171800, #      utc_end 1934-02-11 05:30:00 (Sun)
  60992267400, #  local_start 1933-10-08 00:30:00 (Sun)
  61003152000, #    local_end 1934-02-11 00:00:00 (Sun)
  -19800,
  1,
  '-0530',
      ],
      [
  61003171800, #    utc_start 1934-02-11 05:30:00 (Sun)
  61023736800, #      utc_end 1934-10-07 06:00:00 (Sun)
  61003150200, #  local_start 1934-02-10 23:30:00 (Sat)
  61023715200, #    local_end 1934-10-07 00:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61023736800, #    utc_start 1934-10-07 06:00:00 (Sun)
  61034621400, #      utc_end 1935-02-10 05:30:00 (Sun)
  61023717000, #  local_start 1934-10-07 00:30:00 (Sun)
  61034601600, #    local_end 1935-02-10 00:00:00 (Sun)
  -19800,
  1,
  '-0530',
      ],
      [
  61034621400, #    utc_start 1935-02-10 05:30:00 (Sun)
  61055186400, #      utc_end 1935-10-06 06:00:00 (Sun)
  61034599800, #  local_start 1935-02-09 23:30:00 (Sat)
  61055164800, #    local_end 1935-10-06 00:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61055186400, #    utc_start 1935-10-06 06:00:00 (Sun)
  61066071000, #      utc_end 1936-02-09 05:30:00 (Sun)
  61055166600, #  local_start 1935-10-06 00:30:00 (Sun)
  61066051200, #    local_end 1936-02-09 00:00:00 (Sun)
  -19800,
  1,
  '-0530',
      ],
      [
  61066071000, #    utc_start 1936-02-09 05:30:00 (Sun)
  61086636000, #      utc_end 1936-10-04 06:00:00 (Sun)
  61066049400, #  local_start 1936-02-08 23:30:00 (Sat)
  61086614400, #    local_end 1936-10-04 00:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61086636000, #    utc_start 1936-10-04 06:00:00 (Sun)
  61098125400, #      utc_end 1937-02-14 05:30:00 (Sun)
  61086616200, #  local_start 1936-10-04 00:30:00 (Sun)
  61098105600, #    local_end 1937-02-14 00:00:00 (Sun)
  -19800,
  1,
  '-0530',
      ],
      [
  61098125400, #    utc_start 1937-02-14 05:30:00 (Sun)
  61118085600, #      utc_end 1937-10-03 06:00:00 (Sun)
  61098103800, #  local_start 1937-02-13 23:30:00 (Sat)
  61118064000, #    local_end 1937-10-03 00:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61118085600, #    utc_start 1937-10-03 06:00:00 (Sun)
  61129575000, #      utc_end 1938-02-13 05:30:00 (Sun)
  61118065800, #  local_start 1937-10-03 00:30:00 (Sun)
  61129555200, #    local_end 1938-02-13 00:00:00 (Sun)
  -19800,
  1,
  '-0530',
      ],
      [
  61129575000, #    utc_start 1938-02-13 05:30:00 (Sun)
  61149535200, #      utc_end 1938-10-02 06:00:00 (Sun)
  61129553400, #  local_start 1938-02-12 23:30:00 (Sat)
  61149513600, #    local_end 1938-10-02 00:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61149535200, #    utc_start 1938-10-02 06:00:00 (Sun)
  61161024600, #      utc_end 1939-02-12 05:30:00 (Sun)
  61149515400, #  local_start 1938-10-02 00:30:00 (Sun)
  61161004800, #    local_end 1939-02-12 00:00:00 (Sun)
  -19800,
  1,
  '-0530',
      ],
      [
  61161024600, #    utc_start 1939-02-12 05:30:00 (Sun)
  61181589600, #      utc_end 1939-10-08 06:00:00 (Sun)
  61161003000, #  local_start 1939-02-11 23:30:00 (Sat)
  61181568000, #    local_end 1939-10-08 00:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61181589600, #    utc_start 1939-10-08 06:00:00 (Sun)
  61192474200, #      utc_end 1940-02-11 05:30:00 (Sun)
  61181569800, #  local_start 1939-10-08 00:30:00 (Sun)
  61192454400, #    local_end 1940-02-11 00:00:00 (Sun)
  -19800,
  1,
  '-0530',
      ],
      [
  61192474200, #    utc_start 1940-02-11 05:30:00 (Sun)
  61213039200, #      utc_end 1940-10-06 06:00:00 (Sun)
  61192452600, #  local_start 1940-02-10 23:30:00 (Sat)
  61213017600, #    local_end 1940-10-06 00:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61213039200, #    utc_start 1940-10-06 06:00:00 (Sun)
  61223923800, #      utc_end 1941-02-09 05:30:00 (Sun)
  61213019400, #  local_start 1940-10-06 00:30:00 (Sun)
  61223904000, #    local_end 1941-02-09 00:00:00 (Sun)
  -19800,
  1,
  '-0530',
      ],
      [
  61223923800, #    utc_start 1941-02-09 05:30:00 (Sun)
  61244488800, #      utc_end 1941-10-05 06:00:00 (Sun)
  61223902200, #  local_start 1941-02-08 23:30:00 (Sat)
  61244467200, #    local_end 1941-10-05 00:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61244488800, #    utc_start 1941-10-05 06:00:00 (Sun)
  61255978200, #      utc_end 1942-02-15 05:30:00 (Sun)
  61244469000, #  local_start 1941-10-05 00:30:00 (Sun)
  61255958400, #    local_end 1942-02-15 00:00:00 (Sun)
  -19800,
  1,
  '-0530',
      ],
      [
  61255978200, #    utc_start 1942-02-15 05:30:00 (Sun)
  61275938400, #      utc_end 1942-10-04 06:00:00 (Sun)
  61255956600, #  local_start 1942-02-14 23:30:00 (Sat)
  61275916800, #    local_end 1942-10-04 00:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61275938400, #    utc_start 1942-10-04 06:00:00 (Sun)
  61287427800, #      utc_end 1943-02-14 05:30:00 (Sun)
  61275918600, #  local_start 1942-10-04 00:30:00 (Sun)
  61287408000, #    local_end 1943-02-14 00:00:00 (Sun)
  -19800,
  1,
  '-0530',
      ],
      [
  61287427800, #    utc_start 1943-02-14 05:30:00 (Sun)
  62259602400, #      utc_end 1973-12-05 06:00:00 (Wed)
  61287406200, #  local_start 1943-02-13 23:30:00 (Sat)
  62259580800, #    local_end 1973-12-05 00:00:00 (Wed)
  -21600,
  0,
  'CST',
      ],
      [
  62259602400, #    utc_start 1973-12-05 06:00:00 (Wed)
  62265301200, #      utc_end 1974-02-09 05:00:00 (Sat)
  62259584400, #  local_start 1973-12-05 01:00:00 (Wed)
  62265283200, #    local_end 1974-02-09 00:00:00 (Sat)
  -18000,
  1,
  'CDT',
      ],
      [
  62265301200, #    utc_start 1974-02-09 05:00:00 (Sat)
  62544722400, #      utc_end 1982-12-18 06:00:00 (Sat)
  62265279600, #  local_start 1974-02-08 23:00:00 (Fri)
  62544700800, #    local_end 1982-12-18 00:00:00 (Sat)
  -21600,
  0,
  'CST',
      ],
      [
  62544722400, #    utc_start 1982-12-18 06:00:00 (Sat)
  62549557200, #      utc_end 1983-02-12 05:00:00 (Sat)
  62544704400, #  local_start 1982-12-18 01:00:00 (Sat)
  62549539200, #    local_end 1983-02-12 00:00:00 (Sat)
  -18000,
  1,
  'CDT',
      ],
      [
  62549557200, #    utc_start 1983-02-12 05:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  62549535600, #  local_start 1983-02-11 23:00:00 (Fri)
  DateTime::TimeZone::INFINITY, #    local_end
  -21600,
  0,
  'CST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {27}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_BELIZE

    $main::fatpacked{"DateTime/TimeZone/America/Blanc_Sablon.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_BLANC_SABLON';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Blanc_Sablon;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Blanc_Sablon::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59421786508, #      utc_end 1884-01-01 03:48:28 (Tue)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59421772800, #    local_end 1884-01-01 00:00:00 (Tue)
  -13708,
  0,
  'LMT',
      ],
      [
  59421786508, #    utc_start 1884-01-01 03:48:28 (Tue)
  60503608800, #      utc_end 1918-04-14 06:00:00 (Sun)
  59421772108, #  local_start 1883-12-31 23:48:28 (Mon)
  60503594400, #    local_end 1918-04-14 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  60503608800, #    utc_start 1918-04-14 06:00:00 (Sun)
  60520539600, #      utc_end 1918-10-27 05:00:00 (Sun)
  60503598000, #  local_start 1918-04-14 03:00:00 (Sun)
  60520528800, #    local_end 1918-10-27 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  60520539600, #    utc_start 1918-10-27 05:00:00 (Sun)
  61255461600, #      utc_end 1942-02-09 06:00:00 (Mon)
  60520525200, #  local_start 1918-10-27 01:00:00 (Sun)
  61255447200, #    local_end 1942-02-09 02:00:00 (Mon)
  -14400,
  0,
  'AST',
      ],
      [
  61255461600, #    utc_start 1942-02-09 06:00:00 (Mon)
  61366287600, #      utc_end 1945-08-14 23:00:00 (Tue)
  61255450800, #  local_start 1942-02-09 03:00:00 (Mon)
  61366276800, #    local_end 1945-08-14 20:00:00 (Tue)
  -10800,
  1,
  'AWT',
      ],
      [
  61366287600, #    utc_start 1945-08-14 23:00:00 (Tue)
  61370283600, #      utc_end 1945-09-30 05:00:00 (Sun)
  61366276800, #  local_start 1945-08-14 20:00:00 (Tue)
  61370272800, #    local_end 1945-09-30 02:00:00 (Sun)
  -10800,
  1,
  'APT',
      ],
      [
  61370283600, #    utc_start 1945-09-30 05:00:00 (Sun)
  62135697600, #      utc_end 1970-01-01 04:00:00 (Thu)
  61370269200, #  local_start 1945-09-30 01:00:00 (Sun)
  62135683200, #    local_end 1970-01-01 00:00:00 (Thu)
  -14400,
  0,
  'AST',
      ],
      [
  62135697600, #    utc_start 1970-01-01 04:00:00 (Thu)
  DateTime::TimeZone::INFINITY, #      utc_end
  62135683200, #  local_start 1970-01-01 00:00:00 (Thu)
  DateTime::TimeZone::INFINITY, #    local_end
  -14400,
  0,
  'AST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {3}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_BLANC_SABLON

    $main::fatpacked{"DateTime/TimeZone/America/Boa_Vista.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_BOA_VISTA';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/southamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Boa_Vista;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Boa_Vista::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60368472160, #      utc_end 1914-01-01 04:02:40 (Thu)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60368457600, #    local_end 1914-01-01 00:00:00 (Thu)
  -14560,
  0,
  'LMT',
      ],
      [
  60368472160, #    utc_start 1914-01-01 04:02:40 (Thu)
  60928729200, #      utc_end 1931-10-03 15:00:00 (Sat)
  60368457760, #  local_start 1914-01-01 00:02:40 (Thu)
  60928714800, #    local_end 1931-10-03 11:00:00 (Sat)
  -14400,
  0,
  '-04',
      ],
      [
  60928729200, #    utc_start 1931-10-03 15:00:00 (Sat)
  60944324400, #      utc_end 1932-04-01 03:00:00 (Fri)
  60928718400, #  local_start 1931-10-03 12:00:00 (Sat)
  60944313600, #    local_end 1932-04-01 00:00:00 (Fri)
  -10800,
  1,
  '-03',
      ],
      [
  60944324400, #    utc_start 1932-04-01 03:00:00 (Fri)
  60960312000, #      utc_end 1932-10-03 04:00:00 (Mon)
  60944310000, #  local_start 1932-03-31 23:00:00 (Thu)
  60960297600, #    local_end 1932-10-03 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  60960312000, #    utc_start 1932-10-03 04:00:00 (Mon)
  60975860400, #      utc_end 1933-04-01 03:00:00 (Sat)
  60960301200, #  local_start 1932-10-03 01:00:00 (Mon)
  60975849600, #    local_end 1933-04-01 00:00:00 (Sat)
  -10800,
  1,
  '-03',
      ],
      [
  60975860400, #    utc_start 1933-04-01 03:00:00 (Sat)
  61501867200, #      utc_end 1949-12-01 04:00:00 (Thu)
  60975846000, #  local_start 1933-03-31 23:00:00 (Fri)
  61501852800, #    local_end 1949-12-01 00:00:00 (Thu)
  -14400,
  0,
  '-04',
      ],
      [
  61501867200, #    utc_start 1949-12-01 04:00:00 (Thu)
  61513617600, #      utc_end 1950-04-16 04:00:00 (Sun)
  61501856400, #  local_start 1949-12-01 01:00:00 (Thu)
  61513606800, #    local_end 1950-04-16 01:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61513617600, #    utc_start 1950-04-16 04:00:00 (Sun)
  61533403200, #      utc_end 1950-12-01 04:00:00 (Fri)
  61513603200, #  local_start 1950-04-16 00:00:00 (Sun)
  61533388800, #    local_end 1950-12-01 00:00:00 (Fri)
  -14400,
  0,
  '-04',
      ],
      [
  61533403200, #    utc_start 1950-12-01 04:00:00 (Fri)
  61543854000, #      utc_end 1951-04-01 03:00:00 (Sun)
  61533392400, #  local_start 1950-12-01 01:00:00 (Fri)
  61543843200, #    local_end 1951-04-01 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61543854000, #    utc_start 1951-04-01 03:00:00 (Sun)
  61564939200, #      utc_end 1951-12-01 04:00:00 (Sat)
  61543839600, #  local_start 1951-03-31 23:00:00 (Sat)
  61564924800, #    local_end 1951-12-01 00:00:00 (Sat)
  -14400,
  0,
  '-04',
      ],
      [
  61564939200, #    utc_start 1951-12-01 04:00:00 (Sat)
  61575476400, #      utc_end 1952-04-01 03:00:00 (Tue)
  61564928400, #  local_start 1951-12-01 01:00:00 (Sat)
  61575465600, #    local_end 1952-04-01 00:00:00 (Tue)
  -10800,
  1,
  '-03',
      ],
      [
  61575476400, #    utc_start 1952-04-01 03:00:00 (Tue)
  61596561600, #      utc_end 1952-12-01 04:00:00 (Mon)
  61575462000, #  local_start 1952-03-31 23:00:00 (Mon)
  61596547200, #    local_end 1952-12-01 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  61596561600, #    utc_start 1952-12-01 04:00:00 (Mon)
  61604334000, #      utc_end 1953-03-01 03:00:00 (Sun)
  61596550800, #  local_start 1952-12-01 01:00:00 (Mon)
  61604323200, #    local_end 1953-03-01 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61604334000, #    utc_start 1953-03-01 03:00:00 (Sun)
  61944321600, #      utc_end 1963-12-09 04:00:00 (Mon)
  61604319600, #  local_start 1953-02-28 23:00:00 (Sat)
  61944307200, #    local_end 1963-12-09 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  61944321600, #    utc_start 1963-12-09 04:00:00 (Mon)
  61951489200, #      utc_end 1964-03-01 03:00:00 (Sun)
  61944310800, #  local_start 1963-12-09 01:00:00 (Mon)
  61951478400, #    local_end 1964-03-01 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61951489200, #    utc_start 1964-03-01 03:00:00 (Sun)
  61980523200, #      utc_end 1965-01-31 04:00:00 (Sun)
  61951474800, #  local_start 1964-02-29 23:00:00 (Sat)
  61980508800, #    local_end 1965-01-31 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  61980523200, #    utc_start 1965-01-31 04:00:00 (Sun)
  61985617200, #      utc_end 1965-03-31 03:00:00 (Wed)
  61980512400, #  local_start 1965-01-31 01:00:00 (Sun)
  61985606400, #    local_end 1965-03-31 00:00:00 (Wed)
  -10800,
  1,
  '-03',
      ],
      [
  61985617200, #    utc_start 1965-03-31 03:00:00 (Wed)
  62006788800, #      utc_end 1965-12-01 04:00:00 (Wed)
  61985602800, #  local_start 1965-03-30 23:00:00 (Tue)
  62006774400, #    local_end 1965-12-01 00:00:00 (Wed)
  -14400,
  0,
  '-04',
      ],
      [
  62006788800, #    utc_start 1965-12-01 04:00:00 (Wed)
  62014561200, #      utc_end 1966-03-01 03:00:00 (Tue)
  62006778000, #  local_start 1965-12-01 01:00:00 (Wed)
  62014550400, #    local_end 1966-03-01 00:00:00 (Tue)
  -10800,
  1,
  '-03',
      ],
      [
  62014561200, #    utc_start 1966-03-01 03:00:00 (Tue)
  62035732800, #      utc_end 1966-11-01 04:00:00 (Tue)
  62014546800, #  local_start 1966-02-28 23:00:00 (Mon)
  62035718400, #    local_end 1966-11-01 00:00:00 (Tue)
  -14400,
  0,
  '-04',
      ],
      [
  62035732800, #    utc_start 1966-11-01 04:00:00 (Tue)
  62046097200, #      utc_end 1967-03-01 03:00:00 (Wed)
  62035722000, #  local_start 1966-11-01 01:00:00 (Tue)
  62046086400, #    local_end 1967-03-01 00:00:00 (Wed)
  -10800,
  1,
  '-03',
      ],
      [
  62046097200, #    utc_start 1967-03-01 03:00:00 (Wed)
  62067268800, #      utc_end 1967-11-01 04:00:00 (Wed)
  62046082800, #  local_start 1967-02-28 23:00:00 (Tue)
  62067254400, #    local_end 1967-11-01 00:00:00 (Wed)
  -14400,
  0,
  '-04',
      ],
      [
  62067268800, #    utc_start 1967-11-01 04:00:00 (Wed)
  62077719600, #      utc_end 1968-03-01 03:00:00 (Fri)
  62067258000, #  local_start 1967-11-01 01:00:00 (Wed)
  62077708800, #    local_end 1968-03-01 00:00:00 (Fri)
  -10800,
  1,
  '-03',
      ],
      [
  62077719600, #    utc_start 1968-03-01 03:00:00 (Fri)
  62635435200, #      utc_end 1985-11-02 04:00:00 (Sat)
  62077705200, #  local_start 1968-02-29 23:00:00 (Thu)
  62635420800, #    local_end 1985-11-02 00:00:00 (Sat)
  -14400,
  0,
  '-04',
      ],
      [
  62635435200, #    utc_start 1985-11-02 04:00:00 (Sat)
  62646922800, #      utc_end 1986-03-15 03:00:00 (Sat)
  62635424400, #  local_start 1985-11-02 01:00:00 (Sat)
  62646912000, #    local_end 1986-03-15 00:00:00 (Sat)
  -10800,
  1,
  '-03',
      ],
      [
  62646922800, #    utc_start 1986-03-15 03:00:00 (Sat)
  62666280000, #      utc_end 1986-10-25 04:00:00 (Sat)
  62646908400, #  local_start 1986-03-14 23:00:00 (Fri)
  62666265600, #    local_end 1986-10-25 00:00:00 (Sat)
  -14400,
  0,
  '-04',
      ],
      [
  62666280000, #    utc_start 1986-10-25 04:00:00 (Sat)
  62675953200, #      utc_end 1987-02-14 03:00:00 (Sat)
  62666269200, #  local_start 1986-10-25 01:00:00 (Sat)
  62675942400, #    local_end 1987-02-14 00:00:00 (Sat)
  -10800,
  1,
  '-03',
      ],
      [
  62675953200, #    utc_start 1987-02-14 03:00:00 (Sat)
  62697816000, #      utc_end 1987-10-25 04:00:00 (Sun)
  62675938800, #  local_start 1987-02-13 23:00:00 (Fri)
  62697801600, #    local_end 1987-10-25 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62697816000, #    utc_start 1987-10-25 04:00:00 (Sun)
  62706884400, #      utc_end 1988-02-07 03:00:00 (Sun)
  62697805200, #  local_start 1987-10-25 01:00:00 (Sun)
  62706873600, #    local_end 1988-02-07 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62706884400, #    utc_start 1988-02-07 03:00:00 (Sun)
  62725723200, #      utc_end 1988-09-12 04:00:00 (Mon)
  62706870000, #  local_start 1988-02-06 23:00:00 (Sat)
  62725708800, #    local_end 1988-09-12 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  62725723200, #    utc_start 1988-09-12 04:00:00 (Mon)
  63074347200, #      utc_end 1999-09-30 04:00:00 (Thu)
  62725708800, #  local_start 1988-09-12 00:00:00 (Mon)
  63074332800, #    local_end 1999-09-30 00:00:00 (Thu)
  -14400,
  0,
  '-04',
      ],
      [
  63074347200, #    utc_start 1999-09-30 04:00:00 (Thu)
  63074606400, #      utc_end 1999-10-03 04:00:00 (Sun)
  63074332800, #  local_start 1999-09-30 00:00:00 (Thu)
  63074592000, #    local_end 1999-10-03 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63074606400, #    utc_start 1999-10-03 04:00:00 (Sun)
  63087303600, #      utc_end 2000-02-27 03:00:00 (Sun)
  63074595600, #  local_start 1999-10-03 01:00:00 (Sun)
  63087292800, #    local_end 2000-02-27 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63087303600, #    utc_start 2000-02-27 03:00:00 (Sun)
  63106660800, #      utc_end 2000-10-08 04:00:00 (Sun)
  63087289200, #  local_start 2000-02-26 23:00:00 (Sat)
  63106646400, #    local_end 2000-10-08 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63106660800, #    utc_start 2000-10-08 04:00:00 (Sun)
  63107262000, #      utc_end 2000-10-15 03:00:00 (Sun)
  63106650000, #  local_start 2000-10-08 01:00:00 (Sun)
  63107251200, #    local_end 2000-10-15 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63107262000, #    utc_start 2000-10-15 03:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #      utc_end
  63107247600, #  local_start 2000-10-14 23:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #    local_end
  -14400,
  0,
  '-04',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {16}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_BOA_VISTA

    $main::fatpacked{"DateTime/TimeZone/America/Bogota.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_BOGOTA';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/southamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Bogota;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Bogota::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59428011376, #      utc_end 1884-03-13 04:56:16 (Thu)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59427993600, #    local_end 1884-03-13 00:00:00 (Thu)
  -17776,
  0,
  'LMT',
      ],
      [
  59428011376, #    utc_start 1884-03-13 04:56:16 (Thu)
  60396641776, #      utc_end 1914-11-23 04:56:16 (Mon)
  59427993600, #  local_start 1884-03-13 00:00:00 (Thu)
  60396624000, #    local_end 1914-11-23 00:00:00 (Mon)
  -17776,
  0,
  'BMT',
      ],
      [
  60396641776, #    utc_start 1914-11-23 04:56:16 (Mon)
  62840552400, #      utc_end 1992-05-03 05:00:00 (Sun)
  60396623776, #  local_start 1914-11-22 23:56:16 (Sun)
  62840534400, #    local_end 1992-05-03 00:00:00 (Sun)
  -18000,
  0,
  '-05',
      ],
      [
  62840552400, #    utc_start 1992-05-03 05:00:00 (Sun)
  62869579200, #      utc_end 1993-04-04 04:00:00 (Sun)
  62840538000, #  local_start 1992-05-03 01:00:00 (Sun)
  62869564800, #    local_end 1993-04-04 00:00:00 (Sun)
  -14400,
  1,
  '-04',
      ],
      [
  62869579200, #    utc_start 1993-04-04 04:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #      utc_end
  62869561200, #  local_start 1993-04-03 23:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #    local_end
  -18000,
  0,
  '-05',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {1}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_BOGOTA

    $main::fatpacked{"DateTime/TimeZone/America/Boise.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_BOISE';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Boise;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Boise::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59418043200, #      utc_end 1883-11-18 20:00:00 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59418015311, #    local_end 1883-11-18 12:15:11 (Sun)
  -27889,
  0,
  'LMT',
      ],
      [
  59418043200, #    utc_start 1883-11-18 20:00:00 (Sun)
  60502413600, #      utc_end 1918-03-31 10:00:00 (Sun)
  59418014400, #  local_start 1883-11-18 12:00:00 (Sun)
  60502384800, #    local_end 1918-03-31 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  60502413600, #    utc_start 1918-03-31 10:00:00 (Sun)
  60520554000, #      utc_end 1918-10-27 09:00:00 (Sun)
  60502388400, #  local_start 1918-03-31 03:00:00 (Sun)
  60520528800, #    local_end 1918-10-27 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  60520554000, #    utc_start 1918-10-27 09:00:00 (Sun)
  60533863200, #      utc_end 1919-03-30 10:00:00 (Sun)
  60520525200, #  local_start 1918-10-27 01:00:00 (Sun)
  60533834400, #    local_end 1919-03-30 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  60533863200, #    utc_start 1919-03-30 10:00:00 (Sun)
  60552003600, #      utc_end 1919-10-26 09:00:00 (Sun)
  60533838000, #  local_start 1919-03-30 03:00:00 (Sun)
  60551978400, #    local_end 1919-10-26 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  60552003600, #    utc_start 1919-10-26 09:00:00 (Sun)
  60663895200, #      utc_end 1923-05-13 10:00:00 (Sun)
  60551974800, #  local_start 1919-10-26 01:00:00 (Sun)
  60663866400, #    local_end 1923-05-13 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  60663895200, #    utc_start 1923-05-13 10:00:00 (Sun)
  61255472400, #      utc_end 1942-02-09 09:00:00 (Mon)
  60663870000, #  local_start 1923-05-13 03:00:00 (Sun)
  61255447200, #    local_end 1942-02-09 02:00:00 (Mon)
  -25200,
  0,
  'MST',
      ],
      [
  61255472400, #    utc_start 1942-02-09 09:00:00 (Mon)
  61366287600, #      utc_end 1945-08-14 23:00:00 (Tue)
  61255450800, #  local_start 1942-02-09 03:00:00 (Mon)
  61366266000, #    local_end 1945-08-14 17:00:00 (Tue)
  -21600,
  1,
  'MWT',
      ],
      [
  61366287600, #    utc_start 1945-08-14 23:00:00 (Tue)
  61370294400, #      utc_end 1945-09-30 08:00:00 (Sun)
  61366266000, #  local_start 1945-08-14 17:00:00 (Tue)
  61370272800, #    local_end 1945-09-30 02:00:00 (Sun)
  -21600,
  1,
  'MPT',
      ],
      [
  61370294400, #    utc_start 1945-09-30 08:00:00 (Sun)
  62051302800, #      utc_end 1967-04-30 09:00:00 (Sun)
  61370269200, #  local_start 1945-09-30 01:00:00 (Sun)
  62051277600, #    local_end 1967-04-30 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62051302800, #    utc_start 1967-04-30 09:00:00 (Sun)
  62067024000, #      utc_end 1967-10-29 08:00:00 (Sun)
  62051281200, #  local_start 1967-04-30 03:00:00 (Sun)
  62067002400, #    local_end 1967-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62067024000, #    utc_start 1967-10-29 08:00:00 (Sun)
  62082752400, #      utc_end 1968-04-28 09:00:00 (Sun)
  62066998800, #  local_start 1967-10-29 01:00:00 (Sun)
  62082727200, #    local_end 1968-04-28 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62082752400, #    utc_start 1968-04-28 09:00:00 (Sun)
  62098473600, #      utc_end 1968-10-27 08:00:00 (Sun)
  62082730800, #  local_start 1968-04-28 03:00:00 (Sun)
  62098452000, #    local_end 1968-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62098473600, #    utc_start 1968-10-27 08:00:00 (Sun)
  62114202000, #      utc_end 1969-04-27 09:00:00 (Sun)
  62098448400, #  local_start 1968-10-27 01:00:00 (Sun)
  62114176800, #    local_end 1969-04-27 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62114202000, #    utc_start 1969-04-27 09:00:00 (Sun)
  62129923200, #      utc_end 1969-10-26 08:00:00 (Sun)
  62114180400, #  local_start 1969-04-27 03:00:00 (Sun)
  62129901600, #    local_end 1969-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62129923200, #    utc_start 1969-10-26 08:00:00 (Sun)
  62145651600, #      utc_end 1970-04-26 09:00:00 (Sun)
  62129898000, #  local_start 1969-10-26 01:00:00 (Sun)
  62145626400, #    local_end 1970-04-26 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62145651600, #    utc_start 1970-04-26 09:00:00 (Sun)
  62161372800, #      utc_end 1970-10-25 08:00:00 (Sun)
  62145630000, #  local_start 1970-04-26 03:00:00 (Sun)
  62161351200, #    local_end 1970-10-25 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62161372800, #    utc_start 1970-10-25 08:00:00 (Sun)
  62177101200, #      utc_end 1971-04-25 09:00:00 (Sun)
  62161347600, #  local_start 1970-10-25 01:00:00 (Sun)
  62177076000, #    local_end 1971-04-25 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62177101200, #    utc_start 1971-04-25 09:00:00 (Sun)
  62193427200, #      utc_end 1971-10-31 08:00:00 (Sun)
  62177079600, #  local_start 1971-04-25 03:00:00 (Sun)
  62193405600, #    local_end 1971-10-31 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62193427200, #    utc_start 1971-10-31 08:00:00 (Sun)
  62209155600, #      utc_end 1972-04-30 09:00:00 (Sun)
  62193402000, #  local_start 1971-10-31 01:00:00 (Sun)
  62209130400, #    local_end 1972-04-30 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62209155600, #    utc_start 1972-04-30 09:00:00 (Sun)
  62224876800, #      utc_end 1972-10-29 08:00:00 (Sun)
  62209134000, #  local_start 1972-04-30 03:00:00 (Sun)
  62224855200, #    local_end 1972-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62224876800, #    utc_start 1972-10-29 08:00:00 (Sun)
  62240605200, #      utc_end 1973-04-29 09:00:00 (Sun)
  62224851600, #  local_start 1972-10-29 01:00:00 (Sun)
  62240580000, #    local_end 1973-04-29 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62240605200, #    utc_start 1973-04-29 09:00:00 (Sun)
  62256326400, #      utc_end 1973-10-28 08:00:00 (Sun)
  62240583600, #  local_start 1973-04-29 03:00:00 (Sun)
  62256304800, #    local_end 1973-10-28 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62256326400, #    utc_start 1973-10-28 08:00:00 (Sun)
  62261938800, #      utc_end 1974-01-01 07:00:00 (Tue)
  62256301200, #  local_start 1973-10-28 01:00:00 (Sun)
  62261913600, #    local_end 1974-01-01 00:00:00 (Tue)
  -25200,
  0,
  'MST',
      ],
      [
  62261938800, #    utc_start 1974-01-01 07:00:00 (Tue)
  62264797200, #      utc_end 1974-02-03 09:00:00 (Sun)
  62261913600, #  local_start 1974-01-01 00:00:00 (Tue)
  62264772000, #    local_end 1974-02-03 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62264797200, #    utc_start 1974-02-03 09:00:00 (Sun)
  62287776000, #      utc_end 1974-10-27 08:00:00 (Sun)
  62264775600, #  local_start 1974-02-03 03:00:00 (Sun)
  62287754400, #    local_end 1974-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62287776000, #    utc_start 1974-10-27 08:00:00 (Sun)
  62298061200, #      utc_end 1975-02-23 09:00:00 (Sun)
  62287750800, #  local_start 1974-10-27 01:00:00 (Sun)
  62298036000, #    local_end 1975-02-23 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62298061200, #    utc_start 1975-02-23 09:00:00 (Sun)
  62319225600, #      utc_end 1975-10-26 08:00:00 (Sun)
  62298039600, #  local_start 1975-02-23 03:00:00 (Sun)
  62319204000, #    local_end 1975-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62319225600, #    utc_start 1975-10-26 08:00:00 (Sun)
  62334954000, #      utc_end 1976-04-25 09:00:00 (Sun)
  62319200400, #  local_start 1975-10-26 01:00:00 (Sun)
  62334928800, #    local_end 1976-04-25 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62334954000, #    utc_start 1976-04-25 09:00:00 (Sun)
  62351280000, #      utc_end 1976-10-31 08:00:00 (Sun)
  62334932400, #  local_start 1976-04-25 03:00:00 (Sun)
  62351258400, #    local_end 1976-10-31 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62351280000, #    utc_start 1976-10-31 08:00:00 (Sun)
  62366403600, #      utc_end 1977-04-24 09:00:00 (Sun)
  62351254800, #  local_start 1976-10-31 01:00:00 (Sun)
  62366378400, #    local_end 1977-04-24 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62366403600, #    utc_start 1977-04-24 09:00:00 (Sun)
  62382729600, #      utc_end 1977-10-30 08:00:00 (Sun)
  62366382000, #  local_start 1977-04-24 03:00:00 (Sun)
  62382708000, #    local_end 1977-10-30 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62382729600, #    utc_start 1977-10-30 08:00:00 (Sun)
  62398458000, #      utc_end 1978-04-30 09:00:00 (Sun)
  62382704400, #  local_start 1977-10-30 01:00:00 (Sun)
  62398432800, #    local_end 1978-04-30 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62398458000, #    utc_start 1978-04-30 09:00:00 (Sun)
  62414179200, #      utc_end 1978-10-29 08:00:00 (Sun)
  62398436400, #  local_start 1978-04-30 03:00:00 (Sun)
  62414157600, #    local_end 1978-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62414179200, #    utc_start 1978-10-29 08:00:00 (Sun)
  62429907600, #      utc_end 1979-04-29 09:00:00 (Sun)
  62414154000, #  local_start 1978-10-29 01:00:00 (Sun)
  62429882400, #    local_end 1979-04-29 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62429907600, #    utc_start 1979-04-29 09:00:00 (Sun)
  62445628800, #      utc_end 1979-10-28 08:00:00 (Sun)
  62429886000, #  local_start 1979-04-29 03:00:00 (Sun)
  62445607200, #    local_end 1979-10-28 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62445628800, #    utc_start 1979-10-28 08:00:00 (Sun)
  62461357200, #      utc_end 1980-04-27 09:00:00 (Sun)
  62445603600, #  local_start 1979-10-28 01:00:00 (Sun)
  62461332000, #    local_end 1980-04-27 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62461357200, #    utc_start 1980-04-27 09:00:00 (Sun)
  62477078400, #      utc_end 1980-10-26 08:00:00 (Sun)
  62461335600, #  local_start 1980-04-27 03:00:00 (Sun)
  62477056800, #    local_end 1980-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62477078400, #    utc_start 1980-10-26 08:00:00 (Sun)
  62492806800, #      utc_end 1981-04-26 09:00:00 (Sun)
  62477053200, #  local_start 1980-10-26 01:00:00 (Sun)
  62492781600, #    local_end 1981-04-26 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62492806800, #    utc_start 1981-04-26 09:00:00 (Sun)
  62508528000, #      utc_end 1981-10-25 08:00:00 (Sun)
  62492785200, #  local_start 1981-04-26 03:00:00 (Sun)
  62508506400, #    local_end 1981-10-25 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62508528000, #    utc_start 1981-10-25 08:00:00 (Sun)
  62524256400, #      utc_end 1982-04-25 09:00:00 (Sun)
  62508502800, #  local_start 1981-10-25 01:00:00 (Sun)
  62524231200, #    local_end 1982-04-25 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62524256400, #    utc_start 1982-04-25 09:00:00 (Sun)
  62540582400, #      utc_end 1982-10-31 08:00:00 (Sun)
  62524234800, #  local_start 1982-04-25 03:00:00 (Sun)
  62540560800, #    local_end 1982-10-31 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62540582400, #    utc_start 1982-10-31 08:00:00 (Sun)
  62555706000, #      utc_end 1983-04-24 09:00:00 (Sun)
  62540557200, #  local_start 1982-10-31 01:00:00 (Sun)
  62555680800, #    local_end 1983-04-24 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62555706000, #    utc_start 1983-04-24 09:00:00 (Sun)
  62572032000, #      utc_end 1983-10-30 08:00:00 (Sun)
  62555684400, #  local_start 1983-04-24 03:00:00 (Sun)
  62572010400, #    local_end 1983-10-30 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62572032000, #    utc_start 1983-10-30 08:00:00 (Sun)
  62587760400, #      utc_end 1984-04-29 09:00:00 (Sun)
  62572006800, #  local_start 1983-10-30 01:00:00 (Sun)
  62587735200, #    local_end 1984-04-29 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62587760400, #    utc_start 1984-04-29 09:00:00 (Sun)
  62603481600, #      utc_end 1984-10-28 08:00:00 (Sun)
  62587738800, #  local_start 1984-04-29 03:00:00 (Sun)
  62603460000, #    local_end 1984-10-28 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62603481600, #    utc_start 1984-10-28 08:00:00 (Sun)
  62619210000, #      utc_end 1985-04-28 09:00:00 (Sun)
  62603456400, #  local_start 1984-10-28 01:00:00 (Sun)
  62619184800, #    local_end 1985-04-28 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62619210000, #    utc_start 1985-04-28 09:00:00 (Sun)
  62634931200, #      utc_end 1985-10-27 08:00:00 (Sun)
  62619188400, #  local_start 1985-04-28 03:00:00 (Sun)
  62634909600, #    local_end 1985-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62634931200, #    utc_start 1985-10-27 08:00:00 (Sun)
  62650659600, #      utc_end 1986-04-27 09:00:00 (Sun)
  62634906000, #  local_start 1985-10-27 01:00:00 (Sun)
  62650634400, #    local_end 1986-04-27 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62650659600, #    utc_start 1986-04-27 09:00:00 (Sun)
  62666380800, #      utc_end 1986-10-26 08:00:00 (Sun)
  62650638000, #  local_start 1986-04-27 03:00:00 (Sun)
  62666359200, #    local_end 1986-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62666380800, #    utc_start 1986-10-26 08:00:00 (Sun)
  62680294800, #      utc_end 1987-04-05 09:00:00 (Sun)
  62666355600, #  local_start 1986-10-26 01:00:00 (Sun)
  62680269600, #    local_end 1987-04-05 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62680294800, #    utc_start 1987-04-05 09:00:00 (Sun)
  62697830400, #      utc_end 1987-10-25 08:00:00 (Sun)
  62680273200, #  local_start 1987-04-05 03:00:00 (Sun)
  62697808800, #    local_end 1987-10-25 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62697830400, #    utc_start 1987-10-25 08:00:00 (Sun)
  62711744400, #      utc_end 1988-04-03 09:00:00 (Sun)
  62697805200, #  local_start 1987-10-25 01:00:00 (Sun)
  62711719200, #    local_end 1988-04-03 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62711744400, #    utc_start 1988-04-03 09:00:00 (Sun)
  62729884800, #      utc_end 1988-10-30 08:00:00 (Sun)
  62711722800, #  local_start 1988-04-03 03:00:00 (Sun)
  62729863200, #    local_end 1988-10-30 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62729884800, #    utc_start 1988-10-30 08:00:00 (Sun)
  62743194000, #      utc_end 1989-04-02 09:00:00 (Sun)
  62729859600, #  local_start 1988-10-30 01:00:00 (Sun)
  62743168800, #    local_end 1989-04-02 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62743194000, #    utc_start 1989-04-02 09:00:00 (Sun)
  62761334400, #      utc_end 1989-10-29 08:00:00 (Sun)
  62743172400, #  local_start 1989-04-02 03:00:00 (Sun)
  62761312800, #    local_end 1989-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62761334400, #    utc_start 1989-10-29 08:00:00 (Sun)
  62774643600, #      utc_end 1990-04-01 09:00:00 (Sun)
  62761309200, #  local_start 1989-10-29 01:00:00 (Sun)
  62774618400, #    local_end 1990-04-01 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62774643600, #    utc_start 1990-04-01 09:00:00 (Sun)
  62792784000, #      utc_end 1990-10-28 08:00:00 (Sun)
  62774622000, #  local_start 1990-04-01 03:00:00 (Sun)
  62792762400, #    local_end 1990-10-28 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62792784000, #    utc_start 1990-10-28 08:00:00 (Sun)
  62806698000, #      utc_end 1991-04-07 09:00:00 (Sun)
  62792758800, #  local_start 1990-10-28 01:00:00 (Sun)
  62806672800, #    local_end 1991-04-07 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62806698000, #    utc_start 1991-04-07 09:00:00 (Sun)
  62824233600, #      utc_end 1991-10-27 08:00:00 (Sun)
  62806676400, #  local_start 1991-04-07 03:00:00 (Sun)
  62824212000, #    local_end 1991-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62824233600, #    utc_start 1991-10-27 08:00:00 (Sun)
  62838147600, #      utc_end 1992-04-05 09:00:00 (Sun)
  62824208400, #  local_start 1991-10-27 01:00:00 (Sun)
  62838122400, #    local_end 1992-04-05 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62838147600, #    utc_start 1992-04-05 09:00:00 (Sun)
  62855683200, #      utc_end 1992-10-25 08:00:00 (Sun)
  62838126000, #  local_start 1992-04-05 03:00:00 (Sun)
  62855661600, #    local_end 1992-10-25 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62855683200, #    utc_start 1992-10-25 08:00:00 (Sun)
  62869597200, #      utc_end 1993-04-04 09:00:00 (Sun)
  62855658000, #  local_start 1992-10-25 01:00:00 (Sun)
  62869572000, #    local_end 1993-04-04 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62869597200, #    utc_start 1993-04-04 09:00:00 (Sun)
  62887737600, #      utc_end 1993-10-31 08:00:00 (Sun)
  62869575600, #  local_start 1993-04-04 03:00:00 (Sun)
  62887716000, #    local_end 1993-10-31 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62887737600, #    utc_start 1993-10-31 08:00:00 (Sun)
  62901046800, #      utc_end 1994-04-03 09:00:00 (Sun)
  62887712400, #  local_start 1993-10-31 01:00:00 (Sun)
  62901021600, #    local_end 1994-04-03 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62901046800, #    utc_start 1994-04-03 09:00:00 (Sun)
  62919187200, #      utc_end 1994-10-30 08:00:00 (Sun)
  62901025200, #  local_start 1994-04-03 03:00:00 (Sun)
  62919165600, #    local_end 1994-10-30 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62919187200, #    utc_start 1994-10-30 08:00:00 (Sun)
  62932496400, #      utc_end 1995-04-02 09:00:00 (Sun)
  62919162000, #  local_start 1994-10-30 01:00:00 (Sun)
  62932471200, #    local_end 1995-04-02 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62932496400, #    utc_start 1995-04-02 09:00:00 (Sun)
  62950636800, #      utc_end 1995-10-29 08:00:00 (Sun)
  62932474800, #  local_start 1995-04-02 03:00:00 (Sun)
  62950615200, #    local_end 1995-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62950636800, #    utc_start 1995-10-29 08:00:00 (Sun)
  62964550800, #      utc_end 1996-04-07 09:00:00 (Sun)
  62950611600, #  local_start 1995-10-29 01:00:00 (Sun)
  62964525600, #    local_end 1996-04-07 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62964550800, #    utc_start 1996-04-07 09:00:00 (Sun)
  62982086400, #      utc_end 1996-10-27 08:00:00 (Sun)
  62964529200, #  local_start 1996-04-07 03:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62982086400, #    utc_start 1996-10-27 08:00:00 (Sun)
  62996000400, #      utc_end 1997-04-06 09:00:00 (Sun)
  62982061200, #  local_start 1996-10-27 01:00:00 (Sun)
  62995975200, #    local_end 1997-04-06 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62996000400, #    utc_start 1997-04-06 09:00:00 (Sun)
  63013536000, #      utc_end 1997-10-26 08:00:00 (Sun)
  62995978800, #  local_start 1997-04-06 03:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63013536000, #    utc_start 1997-10-26 08:00:00 (Sun)
  63027450000, #      utc_end 1998-04-05 09:00:00 (Sun)
  63013510800, #  local_start 1997-10-26 01:00:00 (Sun)
  63027424800, #    local_end 1998-04-05 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63027450000, #    utc_start 1998-04-05 09:00:00 (Sun)
  63044985600, #      utc_end 1998-10-25 08:00:00 (Sun)
  63027428400, #  local_start 1998-04-05 03:00:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63044985600, #    utc_start 1998-10-25 08:00:00 (Sun)
  63058899600, #      utc_end 1999-04-04 09:00:00 (Sun)
  63044960400, #  local_start 1998-10-25 01:00:00 (Sun)
  63058874400, #    local_end 1999-04-04 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63058899600, #    utc_start 1999-04-04 09:00:00 (Sun)
  63077040000, #      utc_end 1999-10-31 08:00:00 (Sun)
  63058878000, #  local_start 1999-04-04 03:00:00 (Sun)
  63077018400, #    local_end 1999-10-31 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63077040000, #    utc_start 1999-10-31 08:00:00 (Sun)
  63090349200, #      utc_end 2000-04-02 09:00:00 (Sun)
  63077014800, #  local_start 1999-10-31 01:00:00 (Sun)
  63090324000, #    local_end 2000-04-02 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63090349200, #    utc_start 2000-04-02 09:00:00 (Sun)
  63108489600, #      utc_end 2000-10-29 08:00:00 (Sun)
  63090327600, #  local_start 2000-04-02 03:00:00 (Sun)
  63108468000, #    local_end 2000-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63108489600, #    utc_start 2000-10-29 08:00:00 (Sun)
  63121798800, #      utc_end 2001-04-01 09:00:00 (Sun)
  63108464400, #  local_start 2000-10-29 01:00:00 (Sun)
  63121773600, #    local_end 2001-04-01 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63121798800, #    utc_start 2001-04-01 09:00:00 (Sun)
  63139939200, #      utc_end 2001-10-28 08:00:00 (Sun)
  63121777200, #  local_start 2001-04-01 03:00:00 (Sun)
  63139917600, #    local_end 2001-10-28 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63139939200, #    utc_start 2001-10-28 08:00:00 (Sun)
  63153853200, #      utc_end 2002-04-07 09:00:00 (Sun)
  63139914000, #  local_start 2001-10-28 01:00:00 (Sun)
  63153828000, #    local_end 2002-04-07 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63153853200, #    utc_start 2002-04-07 09:00:00 (Sun)
  63171388800, #      utc_end 2002-10-27 08:00:00 (Sun)
  63153831600, #  local_start 2002-04-07 03:00:00 (Sun)
  63171367200, #    local_end 2002-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63171388800, #    utc_start 2002-10-27 08:00:00 (Sun)
  63185302800, #      utc_end 2003-04-06 09:00:00 (Sun)
  63171363600, #  local_start 2002-10-27 01:00:00 (Sun)
  63185277600, #    local_end 2003-04-06 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63185302800, #    utc_start 2003-04-06 09:00:00 (Sun)
  63202838400, #      utc_end 2003-10-26 08:00:00 (Sun)
  63185281200, #  local_start 2003-04-06 03:00:00 (Sun)
  63202816800, #    local_end 2003-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63202838400, #    utc_start 2003-10-26 08:00:00 (Sun)
  63216752400, #      utc_end 2004-04-04 09:00:00 (Sun)
  63202813200, #  local_start 2003-10-26 01:00:00 (Sun)
  63216727200, #    local_end 2004-04-04 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63216752400, #    utc_start 2004-04-04 09:00:00 (Sun)
  63234892800, #      utc_end 2004-10-31 08:00:00 (Sun)
  63216730800, #  local_start 2004-04-04 03:00:00 (Sun)
  63234871200, #    local_end 2004-10-31 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63234892800, #    utc_start 2004-10-31 08:00:00 (Sun)
  63248202000, #      utc_end 2005-04-03 09:00:00 (Sun)
  63234867600, #  local_start 2004-10-31 01:00:00 (Sun)
  63248176800, #    local_end 2005-04-03 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63248202000, #    utc_start 2005-04-03 09:00:00 (Sun)
  63266342400, #      utc_end 2005-10-30 08:00:00 (Sun)
  63248180400, #  local_start 2005-04-03 03:00:00 (Sun)
  63266320800, #    local_end 2005-10-30 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63266342400, #    utc_start 2005-10-30 08:00:00 (Sun)
  63279651600, #      utc_end 2006-04-02 09:00:00 (Sun)
  63266317200, #  local_start 2005-10-30 01:00:00 (Sun)
  63279626400, #    local_end 2006-04-02 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63279651600, #    utc_start 2006-04-02 09:00:00 (Sun)
  63297792000, #      utc_end 2006-10-29 08:00:00 (Sun)
  63279630000, #  local_start 2006-04-02 03:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63297792000, #    utc_start 2006-10-29 08:00:00 (Sun)
  63309286800, #      utc_end 2007-03-11 09:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63309261600, #    local_end 2007-03-11 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63309286800, #    utc_start 2007-03-11 09:00:00 (Sun)
  63329846400, #      utc_end 2007-11-04 08:00:00 (Sun)
  63309265200, #  local_start 2007-03-11 03:00:00 (Sun)
  63329824800, #    local_end 2007-11-04 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63329846400, #    utc_start 2007-11-04 08:00:00 (Sun)
  63340736400, #      utc_end 2008-03-09 09:00:00 (Sun)
  63329821200, #  local_start 2007-11-04 01:00:00 (Sun)
  63340711200, #    local_end 2008-03-09 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63340736400, #    utc_start 2008-03-09 09:00:00 (Sun)
  63361296000, #      utc_end 2008-11-02 08:00:00 (Sun)
  63340714800, #  local_start 2008-03-09 03:00:00 (Sun)
  63361274400, #    local_end 2008-11-02 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63361296000, #    utc_start 2008-11-02 08:00:00 (Sun)
  63372186000, #      utc_end 2009-03-08 09:00:00 (Sun)
  63361270800, #  local_start 2008-11-02 01:00:00 (Sun)
  63372160800, #    local_end 2009-03-08 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63372186000, #    utc_start 2009-03-08 09:00:00 (Sun)
  63392745600, #      utc_end 2009-11-01 08:00:00 (Sun)
  63372164400, #  local_start 2009-03-08 03:00:00 (Sun)
  63392724000, #    local_end 2009-11-01 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63392745600, #    utc_start 2009-11-01 08:00:00 (Sun)
  63404240400, #      utc_end 2010-03-14 09:00:00 (Sun)
  63392720400, #  local_start 2009-11-01 01:00:00 (Sun)
  63404215200, #    local_end 2010-03-14 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63404240400, #    utc_start 2010-03-14 09:00:00 (Sun)
  63424800000, #      utc_end 2010-11-07 08:00:00 (Sun)
  63404218800, #  local_start 2010-03-14 03:00:00 (Sun)
  63424778400, #    local_end 2010-11-07 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63424800000, #    utc_start 2010-11-07 08:00:00 (Sun)
  63435690000, #      utc_end 2011-03-13 09:00:00 (Sun)
  63424774800, #  local_start 2010-11-07 01:00:00 (Sun)
  63435664800, #    local_end 2011-03-13 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63435690000, #    utc_start 2011-03-13 09:00:00 (Sun)
  63456249600, #      utc_end 2011-11-06 08:00:00 (Sun)
  63435668400, #  local_start 2011-03-13 03:00:00 (Sun)
  63456228000, #    local_end 2011-11-06 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63456249600, #    utc_start 2011-11-06 08:00:00 (Sun)
  63467139600, #      utc_end 2012-03-11 09:00:00 (Sun)
  63456224400, #  local_start 2011-11-06 01:00:00 (Sun)
  63467114400, #    local_end 2012-03-11 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63467139600, #    utc_start 2012-03-11 09:00:00 (Sun)
  63487699200, #      utc_end 2012-11-04 08:00:00 (Sun)
  63467118000, #  local_start 2012-03-11 03:00:00 (Sun)
  63487677600, #    local_end 2012-11-04 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63487699200, #    utc_start 2012-11-04 08:00:00 (Sun)
  63498589200, #      utc_end 2013-03-10 09:00:00 (Sun)
  63487674000, #  local_start 2012-11-04 01:00:00 (Sun)
  63498564000, #    local_end 2013-03-10 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63498589200, #    utc_start 2013-03-10 09:00:00 (Sun)
  63519148800, #      utc_end 2013-11-03 08:00:00 (Sun)
  63498567600, #  local_start 2013-03-10 03:00:00 (Sun)
  63519127200, #    local_end 2013-11-03 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63519148800, #    utc_start 2013-11-03 08:00:00 (Sun)
  63530038800, #      utc_end 2014-03-09 09:00:00 (Sun)
  63519123600, #  local_start 2013-11-03 01:00:00 (Sun)
  63530013600, #    local_end 2014-03-09 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63530038800, #    utc_start 2014-03-09 09:00:00 (Sun)
  63550598400, #      utc_end 2014-11-02 08:00:00 (Sun)
  63530017200, #  local_start 2014-03-09 03:00:00 (Sun)
  63550576800, #    local_end 2014-11-02 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63550598400, #    utc_start 2014-11-02 08:00:00 (Sun)
  63561488400, #      utc_end 2015-03-08 09:00:00 (Sun)
  63550573200, #  local_start 2014-11-02 01:00:00 (Sun)
  63561463200, #    local_end 2015-03-08 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63561488400, #    utc_start 2015-03-08 09:00:00 (Sun)
  63582048000, #      utc_end 2015-11-01 08:00:00 (Sun)
  63561466800, #  local_start 2015-03-08 03:00:00 (Sun)
  63582026400, #    local_end 2015-11-01 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63582048000, #    utc_start 2015-11-01 08:00:00 (Sun)
  63593542800, #      utc_end 2016-03-13 09:00:00 (Sun)
  63582022800, #  local_start 2015-11-01 01:00:00 (Sun)
  63593517600, #    local_end 2016-03-13 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63593542800, #    utc_start 2016-03-13 09:00:00 (Sun)
  63614102400, #      utc_end 2016-11-06 08:00:00 (Sun)
  63593521200, #  local_start 2016-03-13 03:00:00 (Sun)
  63614080800, #    local_end 2016-11-06 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63614102400, #    utc_start 2016-11-06 08:00:00 (Sun)
  63624992400, #      utc_end 2017-03-12 09:00:00 (Sun)
  63614077200, #  local_start 2016-11-06 01:00:00 (Sun)
  63624967200, #    local_end 2017-03-12 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63624992400, #    utc_start 2017-03-12 09:00:00 (Sun)
  63645552000, #      utc_end 2017-11-05 08:00:00 (Sun)
  63624970800, #  local_start 2017-03-12 03:00:00 (Sun)
  63645530400, #    local_end 2017-11-05 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63645552000, #    utc_start 2017-11-05 08:00:00 (Sun)
  63656442000, #      utc_end 2018-03-11 09:00:00 (Sun)
  63645526800, #  local_start 2017-11-05 01:00:00 (Sun)
  63656416800, #    local_end 2018-03-11 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63656442000, #    utc_start 2018-03-11 09:00:00 (Sun)
  63677001600, #      utc_end 2018-11-04 08:00:00 (Sun)
  63656420400, #  local_start 2018-03-11 03:00:00 (Sun)
  63676980000, #    local_end 2018-11-04 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63677001600, #    utc_start 2018-11-04 08:00:00 (Sun)
  63687891600, #      utc_end 2019-03-10 09:00:00 (Sun)
  63676976400, #  local_start 2018-11-04 01:00:00 (Sun)
  63687866400, #    local_end 2019-03-10 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63687891600, #    utc_start 2019-03-10 09:00:00 (Sun)
  63708451200, #      utc_end 2019-11-03 08:00:00 (Sun)
  63687870000, #  local_start 2019-03-10 03:00:00 (Sun)
  63708429600, #    local_end 2019-11-03 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63708451200, #    utc_start 2019-11-03 08:00:00 (Sun)
  63719341200, #      utc_end 2020-03-08 09:00:00 (Sun)
  63708426000, #  local_start 2019-11-03 01:00:00 (Sun)
  63719316000, #    local_end 2020-03-08 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63719341200, #    utc_start 2020-03-08 09:00:00 (Sun)
  63739900800, #      utc_end 2020-11-01 08:00:00 (Sun)
  63719319600, #  local_start 2020-03-08 03:00:00 (Sun)
  63739879200, #    local_end 2020-11-01 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63739900800, #    utc_start 2020-11-01 08:00:00 (Sun)
  63751395600, #      utc_end 2021-03-14 09:00:00 (Sun)
  63739875600, #  local_start 2020-11-01 01:00:00 (Sun)
  63751370400, #    local_end 2021-03-14 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63751395600, #    utc_start 2021-03-14 09:00:00 (Sun)
  63771955200, #      utc_end 2021-11-07 08:00:00 (Sun)
  63751374000, #  local_start 2021-03-14 03:00:00 (Sun)
  63771933600, #    local_end 2021-11-07 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63771955200, #    utc_start 2021-11-07 08:00:00 (Sun)
  63782845200, #      utc_end 2022-03-13 09:00:00 (Sun)
  63771930000, #  local_start 2021-11-07 01:00:00 (Sun)
  63782820000, #    local_end 2022-03-13 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63782845200, #    utc_start 2022-03-13 09:00:00 (Sun)
  63803404800, #      utc_end 2022-11-06 08:00:00 (Sun)
  63782823600, #  local_start 2022-03-13 03:00:00 (Sun)
  63803383200, #    local_end 2022-11-06 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63803404800, #    utc_start 2022-11-06 08:00:00 (Sun)
  63814294800, #      utc_end 2023-03-12 09:00:00 (Sun)
  63803379600, #  local_start 2022-11-06 01:00:00 (Sun)
  63814269600, #    local_end 2023-03-12 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63814294800, #    utc_start 2023-03-12 09:00:00 (Sun)
  63834854400, #      utc_end 2023-11-05 08:00:00 (Sun)
  63814273200, #  local_start 2023-03-12 03:00:00 (Sun)
  63834832800, #    local_end 2023-11-05 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63834854400, #    utc_start 2023-11-05 08:00:00 (Sun)
  63845744400, #      utc_end 2024-03-10 09:00:00 (Sun)
  63834829200, #  local_start 2023-11-05 01:00:00 (Sun)
  63845719200, #    local_end 2024-03-10 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63845744400, #    utc_start 2024-03-10 09:00:00 (Sun)
  63866304000, #      utc_end 2024-11-03 08:00:00 (Sun)
  63845722800, #  local_start 2024-03-10 03:00:00 (Sun)
  63866282400, #    local_end 2024-11-03 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63866304000, #    utc_start 2024-11-03 08:00:00 (Sun)
  63877194000, #      utc_end 2025-03-09 09:00:00 (Sun)
  63866278800, #  local_start 2024-11-03 01:00:00 (Sun)
  63877168800, #    local_end 2025-03-09 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63877194000, #    utc_start 2025-03-09 09:00:00 (Sun)
  63897753600, #      utc_end 2025-11-02 08:00:00 (Sun)
  63877172400, #  local_start 2025-03-09 03:00:00 (Sun)
  63897732000, #    local_end 2025-11-02 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63897753600, #    utc_start 2025-11-02 08:00:00 (Sun)
  63908643600, #      utc_end 2026-03-08 09:00:00 (Sun)
  63897728400, #  local_start 2025-11-02 01:00:00 (Sun)
  63908618400, #    local_end 2026-03-08 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63908643600, #    utc_start 2026-03-08 09:00:00 (Sun)
  63929203200, #      utc_end 2026-11-01 08:00:00 (Sun)
  63908622000, #  local_start 2026-03-08 03:00:00 (Sun)
  63929181600, #    local_end 2026-11-01 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63929203200, #    utc_start 2026-11-01 08:00:00 (Sun)
  63940698000, #      utc_end 2027-03-14 09:00:00 (Sun)
  63929178000, #  local_start 2026-11-01 01:00:00 (Sun)
  63940672800, #    local_end 2027-03-14 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63940698000, #    utc_start 2027-03-14 09:00:00 (Sun)
  63961257600, #      utc_end 2027-11-07 08:00:00 (Sun)
  63940676400, #  local_start 2027-03-14 03:00:00 (Sun)
  63961236000, #    local_end 2027-11-07 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63961257600, #    utc_start 2027-11-07 08:00:00 (Sun)
  63972147600, #      utc_end 2028-03-12 09:00:00 (Sun)
  63961232400, #  local_start 2027-11-07 01:00:00 (Sun)
  63972122400, #    local_end 2028-03-12 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63972147600, #    utc_start 2028-03-12 09:00:00 (Sun)
  63992707200, #      utc_end 2028-11-05 08:00:00 (Sun)
  63972126000, #  local_start 2028-03-12 03:00:00 (Sun)
  63992685600, #    local_end 2028-11-05 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63992707200, #    utc_start 2028-11-05 08:00:00 (Sun)
  64003597200, #      utc_end 2029-03-11 09:00:00 (Sun)
  63992682000, #  local_start 2028-11-05 01:00:00 (Sun)
  64003572000, #    local_end 2029-03-11 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  64003597200, #    utc_start 2029-03-11 09:00:00 (Sun)
  64024156800, #      utc_end 2029-11-04 08:00:00 (Sun)
  64003575600, #  local_start 2029-03-11 03:00:00 (Sun)
  64024135200, #    local_end 2029-11-04 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  64024156800, #    utc_start 2029-11-04 08:00:00 (Sun)
  64035046800, #      utc_end 2030-03-10 09:00:00 (Sun)
  64024131600, #  local_start 2029-11-04 01:00:00 (Sun)
  64035021600, #    local_end 2030-03-10 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  64035046800, #    utc_start 2030-03-10 09:00:00 (Sun)
  64055606400, #      utc_end 2030-11-03 08:00:00 (Sun)
  64035025200, #  local_start 2030-03-10 03:00:00 (Sun)
  64055584800, #    local_end 2030-11-03 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {68}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -25200 }
  
  my $last_observance = bless( {
    'format' => 'M%sT',
    'gmtoff' => '-7:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 720657,
      'local_rd_secs' => 10800,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 720657,
      'utc_rd_secs' => 10800,
      'utc_year' => 1975
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -25200,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 720657,
      'local_rd_secs' => 32400,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 720657,
      'utc_rd_secs' => 32400,
      'utc_year' => 1975
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Nov',
      'letter' => 'S',
      'name' => 'US',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Mar',
      'letter' => 'D',
      'name' => 'US',
      'offset_from_std' => 3600,
      'on' => 'Sun>=8',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_BOISE

    $main::fatpacked{"DateTime/TimeZone/America/Cambridge_Bay.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_CAMBRIDGE_BAY';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Cambridge_Bay;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Cambridge_Bay::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60557760000, #      utc_end 1920-01-01 00:00:00 (Thu)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60557760000, #    local_end 1920-01-01 00:00:00 (Thu)
  0,
  0,
  '-00',
      ],
      [
  60557760000, #    utc_start 1920-01-01 00:00:00 (Thu)
  61255472400, #      utc_end 1942-02-09 09:00:00 (Mon)
  60557734800, #  local_start 1919-12-31 17:00:00 (Wed)
  61255447200, #    local_end 1942-02-09 02:00:00 (Mon)
  -25200,
  0,
  'MST',
      ],
      [
  61255472400, #    utc_start 1942-02-09 09:00:00 (Mon)
  61366287600, #      utc_end 1945-08-14 23:00:00 (Tue)
  61255450800, #  local_start 1942-02-09 03:00:00 (Mon)
  61366266000, #    local_end 1945-08-14 17:00:00 (Tue)
  -21600,
  1,
  'MWT',
      ],
      [
  61366287600, #    utc_start 1945-08-14 23:00:00 (Tue)
  61370294400, #      utc_end 1945-09-30 08:00:00 (Sun)
  61366266000, #  local_start 1945-08-14 17:00:00 (Tue)
  61370272800, #    local_end 1945-09-30 02:00:00 (Sun)
  -21600,
  1,
  'MPT',
      ],
      [
  61370294400, #    utc_start 1945-09-30 08:00:00 (Sun)
  61987791600, #      utc_end 1965-04-25 07:00:00 (Sun)
  61370269200, #  local_start 1945-09-30 01:00:00 (Sun)
  61987766400, #    local_end 1965-04-25 00:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  61987791600, #    utc_start 1965-04-25 07:00:00 (Sun)
  62004121200, #      utc_end 1965-10-31 07:00:00 (Sun)
  61987773600, #  local_start 1965-04-25 02:00:00 (Sun)
  62004103200, #    local_end 1965-10-31 02:00:00 (Sun)
  -18000,
  1,
  'MDDT',
      ],
      [
  62004121200, #    utc_start 1965-10-31 07:00:00 (Sun)
  62461357200, #      utc_end 1980-04-27 09:00:00 (Sun)
  62004096000, #  local_start 1965-10-31 00:00:00 (Sun)
  62461332000, #    local_end 1980-04-27 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62461357200, #    utc_start 1980-04-27 09:00:00 (Sun)
  62477078400, #      utc_end 1980-10-26 08:00:00 (Sun)
  62461335600, #  local_start 1980-04-27 03:00:00 (Sun)
  62477056800, #    local_end 1980-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62477078400, #    utc_start 1980-10-26 08:00:00 (Sun)
  62492806800, #      utc_end 1981-04-26 09:00:00 (Sun)
  62477053200, #  local_start 1980-10-26 01:00:00 (Sun)
  62492781600, #    local_end 1981-04-26 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62492806800, #    utc_start 1981-04-26 09:00:00 (Sun)
  62508528000, #      utc_end 1981-10-25 08:00:00 (Sun)
  62492785200, #  local_start 1981-04-26 03:00:00 (Sun)
  62508506400, #    local_end 1981-10-25 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62508528000, #    utc_start 1981-10-25 08:00:00 (Sun)
  62524256400, #      utc_end 1982-04-25 09:00:00 (Sun)
  62508502800, #  local_start 1981-10-25 01:00:00 (Sun)
  62524231200, #    local_end 1982-04-25 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62524256400, #    utc_start 1982-04-25 09:00:00 (Sun)
  62540582400, #      utc_end 1982-10-31 08:00:00 (Sun)
  62524234800, #  local_start 1982-04-25 03:00:00 (Sun)
  62540560800, #    local_end 1982-10-31 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62540582400, #    utc_start 1982-10-31 08:00:00 (Sun)
  62555706000, #      utc_end 1983-04-24 09:00:00 (Sun)
  62540557200, #  local_start 1982-10-31 01:00:00 (Sun)
  62555680800, #    local_end 1983-04-24 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62555706000, #    utc_start 1983-04-24 09:00:00 (Sun)
  62572032000, #      utc_end 1983-10-30 08:00:00 (Sun)
  62555684400, #  local_start 1983-04-24 03:00:00 (Sun)
  62572010400, #    local_end 1983-10-30 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62572032000, #    utc_start 1983-10-30 08:00:00 (Sun)
  62587760400, #      utc_end 1984-04-29 09:00:00 (Sun)
  62572006800, #  local_start 1983-10-30 01:00:00 (Sun)
  62587735200, #    local_end 1984-04-29 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62587760400, #    utc_start 1984-04-29 09:00:00 (Sun)
  62603481600, #      utc_end 1984-10-28 08:00:00 (Sun)
  62587738800, #  local_start 1984-04-29 03:00:00 (Sun)
  62603460000, #    local_end 1984-10-28 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62603481600, #    utc_start 1984-10-28 08:00:00 (Sun)
  62619210000, #      utc_end 1985-04-28 09:00:00 (Sun)
  62603456400, #  local_start 1984-10-28 01:00:00 (Sun)
  62619184800, #    local_end 1985-04-28 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62619210000, #    utc_start 1985-04-28 09:00:00 (Sun)
  62634931200, #      utc_end 1985-10-27 08:00:00 (Sun)
  62619188400, #  local_start 1985-04-28 03:00:00 (Sun)
  62634909600, #    local_end 1985-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62634931200, #    utc_start 1985-10-27 08:00:00 (Sun)
  62650659600, #      utc_end 1986-04-27 09:00:00 (Sun)
  62634906000, #  local_start 1985-10-27 01:00:00 (Sun)
  62650634400, #    local_end 1986-04-27 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62650659600, #    utc_start 1986-04-27 09:00:00 (Sun)
  62666380800, #      utc_end 1986-10-26 08:00:00 (Sun)
  62650638000, #  local_start 1986-04-27 03:00:00 (Sun)
  62666359200, #    local_end 1986-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62666380800, #    utc_start 1986-10-26 08:00:00 (Sun)
  62680294800, #      utc_end 1987-04-05 09:00:00 (Sun)
  62666355600, #  local_start 1986-10-26 01:00:00 (Sun)
  62680269600, #    local_end 1987-04-05 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62680294800, #    utc_start 1987-04-05 09:00:00 (Sun)
  62697830400, #      utc_end 1987-10-25 08:00:00 (Sun)
  62680273200, #  local_start 1987-04-05 03:00:00 (Sun)
  62697808800, #    local_end 1987-10-25 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62697830400, #    utc_start 1987-10-25 08:00:00 (Sun)
  62711744400, #      utc_end 1988-04-03 09:00:00 (Sun)
  62697805200, #  local_start 1987-10-25 01:00:00 (Sun)
  62711719200, #    local_end 1988-04-03 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62711744400, #    utc_start 1988-04-03 09:00:00 (Sun)
  62729884800, #      utc_end 1988-10-30 08:00:00 (Sun)
  62711722800, #  local_start 1988-04-03 03:00:00 (Sun)
  62729863200, #    local_end 1988-10-30 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62729884800, #    utc_start 1988-10-30 08:00:00 (Sun)
  62743194000, #      utc_end 1989-04-02 09:00:00 (Sun)
  62729859600, #  local_start 1988-10-30 01:00:00 (Sun)
  62743168800, #    local_end 1989-04-02 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62743194000, #    utc_start 1989-04-02 09:00:00 (Sun)
  62761334400, #      utc_end 1989-10-29 08:00:00 (Sun)
  62743172400, #  local_start 1989-04-02 03:00:00 (Sun)
  62761312800, #    local_end 1989-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62761334400, #    utc_start 1989-10-29 08:00:00 (Sun)
  62774643600, #      utc_end 1990-04-01 09:00:00 (Sun)
  62761309200, #  local_start 1989-10-29 01:00:00 (Sun)
  62774618400, #    local_end 1990-04-01 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62774643600, #    utc_start 1990-04-01 09:00:00 (Sun)
  62792784000, #      utc_end 1990-10-28 08:00:00 (Sun)
  62774622000, #  local_start 1990-04-01 03:00:00 (Sun)
  62792762400, #    local_end 1990-10-28 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62792784000, #    utc_start 1990-10-28 08:00:00 (Sun)
  62806698000, #      utc_end 1991-04-07 09:00:00 (Sun)
  62792758800, #  local_start 1990-10-28 01:00:00 (Sun)
  62806672800, #    local_end 1991-04-07 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62806698000, #    utc_start 1991-04-07 09:00:00 (Sun)
  62824233600, #      utc_end 1991-10-27 08:00:00 (Sun)
  62806676400, #  local_start 1991-04-07 03:00:00 (Sun)
  62824212000, #    local_end 1991-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62824233600, #    utc_start 1991-10-27 08:00:00 (Sun)
  62838147600, #      utc_end 1992-04-05 09:00:00 (Sun)
  62824208400, #  local_start 1991-10-27 01:00:00 (Sun)
  62838122400, #    local_end 1992-04-05 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62838147600, #    utc_start 1992-04-05 09:00:00 (Sun)
  62855683200, #      utc_end 1992-10-25 08:00:00 (Sun)
  62838126000, #  local_start 1992-04-05 03:00:00 (Sun)
  62855661600, #    local_end 1992-10-25 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62855683200, #    utc_start 1992-10-25 08:00:00 (Sun)
  62869597200, #      utc_end 1993-04-04 09:00:00 (Sun)
  62855658000, #  local_start 1992-10-25 01:00:00 (Sun)
  62869572000, #    local_end 1993-04-04 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62869597200, #    utc_start 1993-04-04 09:00:00 (Sun)
  62887737600, #      utc_end 1993-10-31 08:00:00 (Sun)
  62869575600, #  local_start 1993-04-04 03:00:00 (Sun)
  62887716000, #    local_end 1993-10-31 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62887737600, #    utc_start 1993-10-31 08:00:00 (Sun)
  62901046800, #      utc_end 1994-04-03 09:00:00 (Sun)
  62887712400, #  local_start 1993-10-31 01:00:00 (Sun)
  62901021600, #    local_end 1994-04-03 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62901046800, #    utc_start 1994-04-03 09:00:00 (Sun)
  62919187200, #      utc_end 1994-10-30 08:00:00 (Sun)
  62901025200, #  local_start 1994-04-03 03:00:00 (Sun)
  62919165600, #    local_end 1994-10-30 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62919187200, #    utc_start 1994-10-30 08:00:00 (Sun)
  62932496400, #      utc_end 1995-04-02 09:00:00 (Sun)
  62919162000, #  local_start 1994-10-30 01:00:00 (Sun)
  62932471200, #    local_end 1995-04-02 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62932496400, #    utc_start 1995-04-02 09:00:00 (Sun)
  62950636800, #      utc_end 1995-10-29 08:00:00 (Sun)
  62932474800, #  local_start 1995-04-02 03:00:00 (Sun)
  62950615200, #    local_end 1995-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62950636800, #    utc_start 1995-10-29 08:00:00 (Sun)
  62964550800, #      utc_end 1996-04-07 09:00:00 (Sun)
  62950611600, #  local_start 1995-10-29 01:00:00 (Sun)
  62964525600, #    local_end 1996-04-07 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62964550800, #    utc_start 1996-04-07 09:00:00 (Sun)
  62982086400, #      utc_end 1996-10-27 08:00:00 (Sun)
  62964529200, #  local_start 1996-04-07 03:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62982086400, #    utc_start 1996-10-27 08:00:00 (Sun)
  62996000400, #      utc_end 1997-04-06 09:00:00 (Sun)
  62982061200, #  local_start 1996-10-27 01:00:00 (Sun)
  62995975200, #    local_end 1997-04-06 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62996000400, #    utc_start 1997-04-06 09:00:00 (Sun)
  63013536000, #      utc_end 1997-10-26 08:00:00 (Sun)
  62995978800, #  local_start 1997-04-06 03:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63013536000, #    utc_start 1997-10-26 08:00:00 (Sun)
  63027450000, #      utc_end 1998-04-05 09:00:00 (Sun)
  63013510800, #  local_start 1997-10-26 01:00:00 (Sun)
  63027424800, #    local_end 1998-04-05 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63027450000, #    utc_start 1998-04-05 09:00:00 (Sun)
  63044985600, #      utc_end 1998-10-25 08:00:00 (Sun)
  63027428400, #  local_start 1998-04-05 03:00:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63044985600, #    utc_start 1998-10-25 08:00:00 (Sun)
  63058899600, #      utc_end 1999-04-04 09:00:00 (Sun)
  63044960400, #  local_start 1998-10-25 01:00:00 (Sun)
  63058874400, #    local_end 1999-04-04 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63058899600, #    utc_start 1999-04-04 09:00:00 (Sun)
  63077040000, #      utc_end 1999-10-31 08:00:00 (Sun)
  63058878000, #  local_start 1999-04-04 03:00:00 (Sun)
  63077018400, #    local_end 1999-10-31 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63077040000, #    utc_start 1999-10-31 08:00:00 (Sun)
  63090345600, #      utc_end 2000-04-02 08:00:00 (Sun)
  63077018400, #  local_start 1999-10-31 02:00:00 (Sun)
  63090324000, #    local_end 2000-04-02 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63090345600, #    utc_start 2000-04-02 08:00:00 (Sun)
  63108486000, #      utc_end 2000-10-29 07:00:00 (Sun)
  63090327600, #  local_start 2000-04-02 03:00:00 (Sun)
  63108468000, #    local_end 2000-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63108486000, #    utc_start 2000-10-29 07:00:00 (Sun)
  63109083600, #      utc_end 2000-11-05 05:00:00 (Sun)
  63108468000, #  local_start 2000-10-29 02:00:00 (Sun)
  63109065600, #    local_end 2000-11-05 00:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63109083600, #    utc_start 2000-11-05 05:00:00 (Sun)
  63121798800, #      utc_end 2001-04-01 09:00:00 (Sun)
  63109062000, #  local_start 2000-11-04 23:00:00 (Sat)
  63121777200, #    local_end 2001-04-01 03:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63121798800, #    utc_start 2001-04-01 09:00:00 (Sun)
  63139939200, #      utc_end 2001-10-28 08:00:00 (Sun)
  63121777200, #  local_start 2001-04-01 03:00:00 (Sun)
  63139917600, #    local_end 2001-10-28 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63139939200, #    utc_start 2001-10-28 08:00:00 (Sun)
  63153853200, #      utc_end 2002-04-07 09:00:00 (Sun)
  63139914000, #  local_start 2001-10-28 01:00:00 (Sun)
  63153828000, #    local_end 2002-04-07 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63153853200, #    utc_start 2002-04-07 09:00:00 (Sun)
  63171388800, #      utc_end 2002-10-27 08:00:00 (Sun)
  63153831600, #  local_start 2002-04-07 03:00:00 (Sun)
  63171367200, #    local_end 2002-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63171388800, #    utc_start 2002-10-27 08:00:00 (Sun)
  63185302800, #      utc_end 2003-04-06 09:00:00 (Sun)
  63171363600, #  local_start 2002-10-27 01:00:00 (Sun)
  63185277600, #    local_end 2003-04-06 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63185302800, #    utc_start 2003-04-06 09:00:00 (Sun)
  63202838400, #      utc_end 2003-10-26 08:00:00 (Sun)
  63185281200, #  local_start 2003-04-06 03:00:00 (Sun)
  63202816800, #    local_end 2003-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63202838400, #    utc_start 2003-10-26 08:00:00 (Sun)
  63216752400, #      utc_end 2004-04-04 09:00:00 (Sun)
  63202813200, #  local_start 2003-10-26 01:00:00 (Sun)
  63216727200, #    local_end 2004-04-04 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63216752400, #    utc_start 2004-04-04 09:00:00 (Sun)
  63234892800, #      utc_end 2004-10-31 08:00:00 (Sun)
  63216730800, #  local_start 2004-04-04 03:00:00 (Sun)
  63234871200, #    local_end 2004-10-31 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63234892800, #    utc_start 2004-10-31 08:00:00 (Sun)
  63248202000, #      utc_end 2005-04-03 09:00:00 (Sun)
  63234867600, #  local_start 2004-10-31 01:00:00 (Sun)
  63248176800, #    local_end 2005-04-03 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63248202000, #    utc_start 2005-04-03 09:00:00 (Sun)
  63266342400, #      utc_end 2005-10-30 08:00:00 (Sun)
  63248180400, #  local_start 2005-04-03 03:00:00 (Sun)
  63266320800, #    local_end 2005-10-30 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63266342400, #    utc_start 2005-10-30 08:00:00 (Sun)
  63279651600, #      utc_end 2006-04-02 09:00:00 (Sun)
  63266317200, #  local_start 2005-10-30 01:00:00 (Sun)
  63279626400, #    local_end 2006-04-02 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63279651600, #    utc_start 2006-04-02 09:00:00 (Sun)
  63297792000, #      utc_end 2006-10-29 08:00:00 (Sun)
  63279630000, #  local_start 2006-04-02 03:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63297792000, #    utc_start 2006-10-29 08:00:00 (Sun)
  63309286800, #      utc_end 2007-03-11 09:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63309261600, #    local_end 2007-03-11 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63309286800, #    utc_start 2007-03-11 09:00:00 (Sun)
  63329846400, #      utc_end 2007-11-04 08:00:00 (Sun)
  63309265200, #  local_start 2007-03-11 03:00:00 (Sun)
  63329824800, #    local_end 2007-11-04 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63329846400, #    utc_start 2007-11-04 08:00:00 (Sun)
  63340736400, #      utc_end 2008-03-09 09:00:00 (Sun)
  63329821200, #  local_start 2007-11-04 01:00:00 (Sun)
  63340711200, #    local_end 2008-03-09 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63340736400, #    utc_start 2008-03-09 09:00:00 (Sun)
  63361296000, #      utc_end 2008-11-02 08:00:00 (Sun)
  63340714800, #  local_start 2008-03-09 03:00:00 (Sun)
  63361274400, #    local_end 2008-11-02 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63361296000, #    utc_start 2008-11-02 08:00:00 (Sun)
  63372186000, #      utc_end 2009-03-08 09:00:00 (Sun)
  63361270800, #  local_start 2008-11-02 01:00:00 (Sun)
  63372160800, #    local_end 2009-03-08 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63372186000, #    utc_start 2009-03-08 09:00:00 (Sun)
  63392745600, #      utc_end 2009-11-01 08:00:00 (Sun)
  63372164400, #  local_start 2009-03-08 03:00:00 (Sun)
  63392724000, #    local_end 2009-11-01 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63392745600, #    utc_start 2009-11-01 08:00:00 (Sun)
  63404240400, #      utc_end 2010-03-14 09:00:00 (Sun)
  63392720400, #  local_start 2009-11-01 01:00:00 (Sun)
  63404215200, #    local_end 2010-03-14 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63404240400, #    utc_start 2010-03-14 09:00:00 (Sun)
  63424800000, #      utc_end 2010-11-07 08:00:00 (Sun)
  63404218800, #  local_start 2010-03-14 03:00:00 (Sun)
  63424778400, #    local_end 2010-11-07 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63424800000, #    utc_start 2010-11-07 08:00:00 (Sun)
  63435690000, #      utc_end 2011-03-13 09:00:00 (Sun)
  63424774800, #  local_start 2010-11-07 01:00:00 (Sun)
  63435664800, #    local_end 2011-03-13 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63435690000, #    utc_start 2011-03-13 09:00:00 (Sun)
  63456249600, #      utc_end 2011-11-06 08:00:00 (Sun)
  63435668400, #  local_start 2011-03-13 03:00:00 (Sun)
  63456228000, #    local_end 2011-11-06 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63456249600, #    utc_start 2011-11-06 08:00:00 (Sun)
  63467139600, #      utc_end 2012-03-11 09:00:00 (Sun)
  63456224400, #  local_start 2011-11-06 01:00:00 (Sun)
  63467114400, #    local_end 2012-03-11 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63467139600, #    utc_start 2012-03-11 09:00:00 (Sun)
  63487699200, #      utc_end 2012-11-04 08:00:00 (Sun)
  63467118000, #  local_start 2012-03-11 03:00:00 (Sun)
  63487677600, #    local_end 2012-11-04 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63487699200, #    utc_start 2012-11-04 08:00:00 (Sun)
  63498589200, #      utc_end 2013-03-10 09:00:00 (Sun)
  63487674000, #  local_start 2012-11-04 01:00:00 (Sun)
  63498564000, #    local_end 2013-03-10 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63498589200, #    utc_start 2013-03-10 09:00:00 (Sun)
  63519148800, #      utc_end 2013-11-03 08:00:00 (Sun)
  63498567600, #  local_start 2013-03-10 03:00:00 (Sun)
  63519127200, #    local_end 2013-11-03 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63519148800, #    utc_start 2013-11-03 08:00:00 (Sun)
  63530038800, #      utc_end 2014-03-09 09:00:00 (Sun)
  63519123600, #  local_start 2013-11-03 01:00:00 (Sun)
  63530013600, #    local_end 2014-03-09 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63530038800, #    utc_start 2014-03-09 09:00:00 (Sun)
  63550598400, #      utc_end 2014-11-02 08:00:00 (Sun)
  63530017200, #  local_start 2014-03-09 03:00:00 (Sun)
  63550576800, #    local_end 2014-11-02 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63550598400, #    utc_start 2014-11-02 08:00:00 (Sun)
  63561488400, #      utc_end 2015-03-08 09:00:00 (Sun)
  63550573200, #  local_start 2014-11-02 01:00:00 (Sun)
  63561463200, #    local_end 2015-03-08 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63561488400, #    utc_start 2015-03-08 09:00:00 (Sun)
  63582048000, #      utc_end 2015-11-01 08:00:00 (Sun)
  63561466800, #  local_start 2015-03-08 03:00:00 (Sun)
  63582026400, #    local_end 2015-11-01 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63582048000, #    utc_start 2015-11-01 08:00:00 (Sun)
  63593542800, #      utc_end 2016-03-13 09:00:00 (Sun)
  63582022800, #  local_start 2015-11-01 01:00:00 (Sun)
  63593517600, #    local_end 2016-03-13 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63593542800, #    utc_start 2016-03-13 09:00:00 (Sun)
  63614102400, #      utc_end 2016-11-06 08:00:00 (Sun)
  63593521200, #  local_start 2016-03-13 03:00:00 (Sun)
  63614080800, #    local_end 2016-11-06 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63614102400, #    utc_start 2016-11-06 08:00:00 (Sun)
  63624992400, #      utc_end 2017-03-12 09:00:00 (Sun)
  63614077200, #  local_start 2016-11-06 01:00:00 (Sun)
  63624967200, #    local_end 2017-03-12 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63624992400, #    utc_start 2017-03-12 09:00:00 (Sun)
  63645552000, #      utc_end 2017-11-05 08:00:00 (Sun)
  63624970800, #  local_start 2017-03-12 03:00:00 (Sun)
  63645530400, #    local_end 2017-11-05 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63645552000, #    utc_start 2017-11-05 08:00:00 (Sun)
  63656442000, #      utc_end 2018-03-11 09:00:00 (Sun)
  63645526800, #  local_start 2017-11-05 01:00:00 (Sun)
  63656416800, #    local_end 2018-03-11 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63656442000, #    utc_start 2018-03-11 09:00:00 (Sun)
  63677001600, #      utc_end 2018-11-04 08:00:00 (Sun)
  63656420400, #  local_start 2018-03-11 03:00:00 (Sun)
  63676980000, #    local_end 2018-11-04 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63677001600, #    utc_start 2018-11-04 08:00:00 (Sun)
  63687891600, #      utc_end 2019-03-10 09:00:00 (Sun)
  63676976400, #  local_start 2018-11-04 01:00:00 (Sun)
  63687866400, #    local_end 2019-03-10 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63687891600, #    utc_start 2019-03-10 09:00:00 (Sun)
  63708451200, #      utc_end 2019-11-03 08:00:00 (Sun)
  63687870000, #  local_start 2019-03-10 03:00:00 (Sun)
  63708429600, #    local_end 2019-11-03 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63708451200, #    utc_start 2019-11-03 08:00:00 (Sun)
  63719341200, #      utc_end 2020-03-08 09:00:00 (Sun)
  63708426000, #  local_start 2019-11-03 01:00:00 (Sun)
  63719316000, #    local_end 2020-03-08 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63719341200, #    utc_start 2020-03-08 09:00:00 (Sun)
  63739900800, #      utc_end 2020-11-01 08:00:00 (Sun)
  63719319600, #  local_start 2020-03-08 03:00:00 (Sun)
  63739879200, #    local_end 2020-11-01 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63739900800, #    utc_start 2020-11-01 08:00:00 (Sun)
  63751395600, #      utc_end 2021-03-14 09:00:00 (Sun)
  63739875600, #  local_start 2020-11-01 01:00:00 (Sun)
  63751370400, #    local_end 2021-03-14 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63751395600, #    utc_start 2021-03-14 09:00:00 (Sun)
  63771955200, #      utc_end 2021-11-07 08:00:00 (Sun)
  63751374000, #  local_start 2021-03-14 03:00:00 (Sun)
  63771933600, #    local_end 2021-11-07 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63771955200, #    utc_start 2021-11-07 08:00:00 (Sun)
  63782845200, #      utc_end 2022-03-13 09:00:00 (Sun)
  63771930000, #  local_start 2021-11-07 01:00:00 (Sun)
  63782820000, #    local_end 2022-03-13 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63782845200, #    utc_start 2022-03-13 09:00:00 (Sun)
  63803404800, #      utc_end 2022-11-06 08:00:00 (Sun)
  63782823600, #  local_start 2022-03-13 03:00:00 (Sun)
  63803383200, #    local_end 2022-11-06 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63803404800, #    utc_start 2022-11-06 08:00:00 (Sun)
  63814294800, #      utc_end 2023-03-12 09:00:00 (Sun)
  63803379600, #  local_start 2022-11-06 01:00:00 (Sun)
  63814269600, #    local_end 2023-03-12 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63814294800, #    utc_start 2023-03-12 09:00:00 (Sun)
  63834854400, #      utc_end 2023-11-05 08:00:00 (Sun)
  63814273200, #  local_start 2023-03-12 03:00:00 (Sun)
  63834832800, #    local_end 2023-11-05 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63834854400, #    utc_start 2023-11-05 08:00:00 (Sun)
  63845744400, #      utc_end 2024-03-10 09:00:00 (Sun)
  63834829200, #  local_start 2023-11-05 01:00:00 (Sun)
  63845719200, #    local_end 2024-03-10 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63845744400, #    utc_start 2024-03-10 09:00:00 (Sun)
  63866304000, #      utc_end 2024-11-03 08:00:00 (Sun)
  63845722800, #  local_start 2024-03-10 03:00:00 (Sun)
  63866282400, #    local_end 2024-11-03 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63866304000, #    utc_start 2024-11-03 08:00:00 (Sun)
  63877194000, #      utc_end 2025-03-09 09:00:00 (Sun)
  63866278800, #  local_start 2024-11-03 01:00:00 (Sun)
  63877168800, #    local_end 2025-03-09 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63877194000, #    utc_start 2025-03-09 09:00:00 (Sun)
  63897753600, #      utc_end 2025-11-02 08:00:00 (Sun)
  63877172400, #  local_start 2025-03-09 03:00:00 (Sun)
  63897732000, #    local_end 2025-11-02 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63897753600, #    utc_start 2025-11-02 08:00:00 (Sun)
  63908643600, #      utc_end 2026-03-08 09:00:00 (Sun)
  63897728400, #  local_start 2025-11-02 01:00:00 (Sun)
  63908618400, #    local_end 2026-03-08 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63908643600, #    utc_start 2026-03-08 09:00:00 (Sun)
  63929203200, #      utc_end 2026-11-01 08:00:00 (Sun)
  63908622000, #  local_start 2026-03-08 03:00:00 (Sun)
  63929181600, #    local_end 2026-11-01 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63929203200, #    utc_start 2026-11-01 08:00:00 (Sun)
  63940698000, #      utc_end 2027-03-14 09:00:00 (Sun)
  63929178000, #  local_start 2026-11-01 01:00:00 (Sun)
  63940672800, #    local_end 2027-03-14 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63940698000, #    utc_start 2027-03-14 09:00:00 (Sun)
  63961257600, #      utc_end 2027-11-07 08:00:00 (Sun)
  63940676400, #  local_start 2027-03-14 03:00:00 (Sun)
  63961236000, #    local_end 2027-11-07 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63961257600, #    utc_start 2027-11-07 08:00:00 (Sun)
  63972147600, #      utc_end 2028-03-12 09:00:00 (Sun)
  63961232400, #  local_start 2027-11-07 01:00:00 (Sun)
  63972122400, #    local_end 2028-03-12 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63972147600, #    utc_start 2028-03-12 09:00:00 (Sun)
  63992707200, #      utc_end 2028-11-05 08:00:00 (Sun)
  63972126000, #  local_start 2028-03-12 03:00:00 (Sun)
  63992685600, #    local_end 2028-11-05 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63992707200, #    utc_start 2028-11-05 08:00:00 (Sun)
  64003597200, #      utc_end 2029-03-11 09:00:00 (Sun)
  63992682000, #  local_start 2028-11-05 01:00:00 (Sun)
  64003572000, #    local_end 2029-03-11 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  64003597200, #    utc_start 2029-03-11 09:00:00 (Sun)
  64024156800, #      utc_end 2029-11-04 08:00:00 (Sun)
  64003575600, #  local_start 2029-03-11 03:00:00 (Sun)
  64024135200, #    local_end 2029-11-04 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  64024156800, #    utc_start 2029-11-04 08:00:00 (Sun)
  64035046800, #      utc_end 2030-03-10 09:00:00 (Sun)
  64024131600, #  local_start 2029-11-04 01:00:00 (Sun)
  64035021600, #    local_end 2030-03-10 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  64035046800, #    utc_start 2030-03-10 09:00:00 (Sun)
  64055606400, #      utc_end 2030-11-03 08:00:00 (Sun)
  64035025200, #  local_start 2030-03-10 03:00:00 (Sun)
  64055584800, #    local_end 2030-11-03 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {54}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -25200 }
  
  my $last_observance = bless( {
    'format' => 'M%sT',
    'gmtoff' => '-7:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 730576,
      'local_rd_secs' => 10800,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 730576,
      'utc_rd_secs' => 10800,
      'utc_year' => 2002
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -25200,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 730576,
      'local_rd_secs' => 32400,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 730576,
      'utc_rd_secs' => 32400,
      'utc_year' => 2002
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Nov',
      'letter' => 'S',
      'name' => 'Canada',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Mar',
      'letter' => 'D',
      'name' => 'Canada',
      'offset_from_std' => 3600,
      'on' => 'Sun>=8',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_CAMBRIDGE_BAY

    $main::fatpacked{"DateTime/TimeZone/America/Campo_Grande.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_CAMPO_GRANDE';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/southamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Campo_Grande;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Campo_Grande::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60368470708, #      utc_end 1914-01-01 03:38:28 (Thu)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60368457600, #    local_end 1914-01-01 00:00:00 (Thu)
  -13108,
  0,
  'LMT',
      ],
      [
  60368470708, #    utc_start 1914-01-01 03:38:28 (Thu)
  60928729200, #      utc_end 1931-10-03 15:00:00 (Sat)
  60368456308, #  local_start 1913-12-31 23:38:28 (Wed)
  60928714800, #    local_end 1931-10-03 11:00:00 (Sat)
  -14400,
  0,
  '-04',
      ],
      [
  60928729200, #    utc_start 1931-10-03 15:00:00 (Sat)
  60944324400, #      utc_end 1932-04-01 03:00:00 (Fri)
  60928718400, #  local_start 1931-10-03 12:00:00 (Sat)
  60944313600, #    local_end 1932-04-01 00:00:00 (Fri)
  -10800,
  1,
  '-03',
      ],
      [
  60944324400, #    utc_start 1932-04-01 03:00:00 (Fri)
  60960312000, #      utc_end 1932-10-03 04:00:00 (Mon)
  60944310000, #  local_start 1932-03-31 23:00:00 (Thu)
  60960297600, #    local_end 1932-10-03 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  60960312000, #    utc_start 1932-10-03 04:00:00 (Mon)
  60975860400, #      utc_end 1933-04-01 03:00:00 (Sat)
  60960301200, #  local_start 1932-10-03 01:00:00 (Mon)
  60975849600, #    local_end 1933-04-01 00:00:00 (Sat)
  -10800,
  1,
  '-03',
      ],
      [
  60975860400, #    utc_start 1933-04-01 03:00:00 (Sat)
  61501867200, #      utc_end 1949-12-01 04:00:00 (Thu)
  60975846000, #  local_start 1933-03-31 23:00:00 (Fri)
  61501852800, #    local_end 1949-12-01 00:00:00 (Thu)
  -14400,
  0,
  '-04',
      ],
      [
  61501867200, #    utc_start 1949-12-01 04:00:00 (Thu)
  61513617600, #      utc_end 1950-04-16 04:00:00 (Sun)
  61501856400, #  local_start 1949-12-01 01:00:00 (Thu)
  61513606800, #    local_end 1950-04-16 01:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61513617600, #    utc_start 1950-04-16 04:00:00 (Sun)
  61533403200, #      utc_end 1950-12-01 04:00:00 (Fri)
  61513603200, #  local_start 1950-04-16 00:00:00 (Sun)
  61533388800, #    local_end 1950-12-01 00:00:00 (Fri)
  -14400,
  0,
  '-04',
      ],
      [
  61533403200, #    utc_start 1950-12-01 04:00:00 (Fri)
  61543854000, #      utc_end 1951-04-01 03:00:00 (Sun)
  61533392400, #  local_start 1950-12-01 01:00:00 (Fri)
  61543843200, #    local_end 1951-04-01 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61543854000, #    utc_start 1951-04-01 03:00:00 (Sun)
  61564939200, #      utc_end 1951-12-01 04:00:00 (Sat)
  61543839600, #  local_start 1951-03-31 23:00:00 (Sat)
  61564924800, #    local_end 1951-12-01 00:00:00 (Sat)
  -14400,
  0,
  '-04',
      ],
      [
  61564939200, #    utc_start 1951-12-01 04:00:00 (Sat)
  61575476400, #      utc_end 1952-04-01 03:00:00 (Tue)
  61564928400, #  local_start 1951-12-01 01:00:00 (Sat)
  61575465600, #    local_end 1952-04-01 00:00:00 (Tue)
  -10800,
  1,
  '-03',
      ],
      [
  61575476400, #    utc_start 1952-04-01 03:00:00 (Tue)
  61596561600, #      utc_end 1952-12-01 04:00:00 (Mon)
  61575462000, #  local_start 1952-03-31 23:00:00 (Mon)
  61596547200, #    local_end 1952-12-01 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  61596561600, #    utc_start 1952-12-01 04:00:00 (Mon)
  61604334000, #      utc_end 1953-03-01 03:00:00 (Sun)
  61596550800, #  local_start 1952-12-01 01:00:00 (Mon)
  61604323200, #    local_end 1953-03-01 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61604334000, #    utc_start 1953-03-01 03:00:00 (Sun)
  61944321600, #      utc_end 1963-12-09 04:00:00 (Mon)
  61604319600, #  local_start 1953-02-28 23:00:00 (Sat)
  61944307200, #    local_end 1963-12-09 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  61944321600, #    utc_start 1963-12-09 04:00:00 (Mon)
  61951489200, #      utc_end 1964-03-01 03:00:00 (Sun)
  61944310800, #  local_start 1963-12-09 01:00:00 (Mon)
  61951478400, #    local_end 1964-03-01 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61951489200, #    utc_start 1964-03-01 03:00:00 (Sun)
  61980523200, #      utc_end 1965-01-31 04:00:00 (Sun)
  61951474800, #  local_start 1964-02-29 23:00:00 (Sat)
  61980508800, #    local_end 1965-01-31 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  61980523200, #    utc_start 1965-01-31 04:00:00 (Sun)
  61985617200, #      utc_end 1965-03-31 03:00:00 (Wed)
  61980512400, #  local_start 1965-01-31 01:00:00 (Sun)
  61985606400, #    local_end 1965-03-31 00:00:00 (Wed)
  -10800,
  1,
  '-03',
      ],
      [
  61985617200, #    utc_start 1965-03-31 03:00:00 (Wed)
  62006788800, #      utc_end 1965-12-01 04:00:00 (Wed)
  61985602800, #  local_start 1965-03-30 23:00:00 (Tue)
  62006774400, #    local_end 1965-12-01 00:00:00 (Wed)
  -14400,
  0,
  '-04',
      ],
      [
  62006788800, #    utc_start 1965-12-01 04:00:00 (Wed)
  62014561200, #      utc_end 1966-03-01 03:00:00 (Tue)
  62006778000, #  local_start 1965-12-01 01:00:00 (Wed)
  62014550400, #    local_end 1966-03-01 00:00:00 (Tue)
  -10800,
  1,
  '-03',
      ],
      [
  62014561200, #    utc_start 1966-03-01 03:00:00 (Tue)
  62035732800, #      utc_end 1966-11-01 04:00:00 (Tue)
  62014546800, #  local_start 1966-02-28 23:00:00 (Mon)
  62035718400, #    local_end 1966-11-01 00:00:00 (Tue)
  -14400,
  0,
  '-04',
      ],
      [
  62035732800, #    utc_start 1966-11-01 04:00:00 (Tue)
  62046097200, #      utc_end 1967-03-01 03:00:00 (Wed)
  62035722000, #  local_start 1966-11-01 01:00:00 (Tue)
  62046086400, #    local_end 1967-03-01 00:00:00 (Wed)
  -10800,
  1,
  '-03',
      ],
      [
  62046097200, #    utc_start 1967-03-01 03:00:00 (Wed)
  62067268800, #      utc_end 1967-11-01 04:00:00 (Wed)
  62046082800, #  local_start 1967-02-28 23:00:00 (Tue)
  62067254400, #    local_end 1967-11-01 00:00:00 (Wed)
  -14400,
  0,
  '-04',
      ],
      [
  62067268800, #    utc_start 1967-11-01 04:00:00 (Wed)
  62077719600, #      utc_end 1968-03-01 03:00:00 (Fri)
  62067258000, #  local_start 1967-11-01 01:00:00 (Wed)
  62077708800, #    local_end 1968-03-01 00:00:00 (Fri)
  -10800,
  1,
  '-03',
      ],
      [
  62077719600, #    utc_start 1968-03-01 03:00:00 (Fri)
  62635435200, #      utc_end 1985-11-02 04:00:00 (Sat)
  62077705200, #  local_start 1968-02-29 23:00:00 (Thu)
  62635420800, #    local_end 1985-11-02 00:00:00 (Sat)
  -14400,
  0,
  '-04',
      ],
      [
  62635435200, #    utc_start 1985-11-02 04:00:00 (Sat)
  62646922800, #      utc_end 1986-03-15 03:00:00 (Sat)
  62635424400, #  local_start 1985-11-02 01:00:00 (Sat)
  62646912000, #    local_end 1986-03-15 00:00:00 (Sat)
  -10800,
  1,
  '-03',
      ],
      [
  62646922800, #    utc_start 1986-03-15 03:00:00 (Sat)
  62666280000, #      utc_end 1986-10-25 04:00:00 (Sat)
  62646908400, #  local_start 1986-03-14 23:00:00 (Fri)
  62666265600, #    local_end 1986-10-25 00:00:00 (Sat)
  -14400,
  0,
  '-04',
      ],
      [
  62666280000, #    utc_start 1986-10-25 04:00:00 (Sat)
  62675953200, #      utc_end 1987-02-14 03:00:00 (Sat)
  62666269200, #  local_start 1986-10-25 01:00:00 (Sat)
  62675942400, #    local_end 1987-02-14 00:00:00 (Sat)
  -10800,
  1,
  '-03',
      ],
      [
  62675953200, #    utc_start 1987-02-14 03:00:00 (Sat)
  62697816000, #      utc_end 1987-10-25 04:00:00 (Sun)
  62675938800, #  local_start 1987-02-13 23:00:00 (Fri)
  62697801600, #    local_end 1987-10-25 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62697816000, #    utc_start 1987-10-25 04:00:00 (Sun)
  62706884400, #      utc_end 1988-02-07 03:00:00 (Sun)
  62697805200, #  local_start 1987-10-25 01:00:00 (Sun)
  62706873600, #    local_end 1988-02-07 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62706884400, #    utc_start 1988-02-07 03:00:00 (Sun)
  62728660800, #      utc_end 1988-10-16 04:00:00 (Sun)
  62706870000, #  local_start 1988-02-06 23:00:00 (Sat)
  62728646400, #    local_end 1988-10-16 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62728660800, #    utc_start 1988-10-16 04:00:00 (Sun)
  62737729200, #      utc_end 1989-01-29 03:00:00 (Sun)
  62728650000, #  local_start 1988-10-16 01:00:00 (Sun)
  62737718400, #    local_end 1989-01-29 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62737729200, #    utc_start 1989-01-29 03:00:00 (Sun)
  62760110400, #      utc_end 1989-10-15 04:00:00 (Sun)
  62737714800, #  local_start 1989-01-28 23:00:00 (Sat)
  62760096000, #    local_end 1989-10-15 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62760110400, #    utc_start 1989-10-15 04:00:00 (Sun)
  62770388400, #      utc_end 1990-02-11 03:00:00 (Sun)
  62760099600, #  local_start 1989-10-15 01:00:00 (Sun)
  62770377600, #    local_end 1990-02-11 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62770388400, #    utc_start 1990-02-11 03:00:00 (Sun)
  62792164800, #      utc_end 1990-10-21 04:00:00 (Sun)
  62770374000, #  local_start 1990-02-10 23:00:00 (Sat)
  62792150400, #    local_end 1990-10-21 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62792164800, #    utc_start 1990-10-21 04:00:00 (Sun)
  62802442800, #      utc_end 1991-02-17 03:00:00 (Sun)
  62792154000, #  local_start 1990-10-21 01:00:00 (Sun)
  62802432000, #    local_end 1991-02-17 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62802442800, #    utc_start 1991-02-17 03:00:00 (Sun)
  62823614400, #      utc_end 1991-10-20 04:00:00 (Sun)
  62802428400, #  local_start 1991-02-16 23:00:00 (Sat)
  62823600000, #    local_end 1991-10-20 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62823614400, #    utc_start 1991-10-20 04:00:00 (Sun)
  62833287600, #      utc_end 1992-02-09 03:00:00 (Sun)
  62823603600, #  local_start 1991-10-20 01:00:00 (Sun)
  62833276800, #    local_end 1992-02-09 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62833287600, #    utc_start 1992-02-09 03:00:00 (Sun)
  62855668800, #      utc_end 1992-10-25 04:00:00 (Sun)
  62833273200, #  local_start 1992-02-08 23:00:00 (Sat)
  62855654400, #    local_end 1992-10-25 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62855668800, #    utc_start 1992-10-25 04:00:00 (Sun)
  62864132400, #      utc_end 1993-01-31 03:00:00 (Sun)
  62855658000, #  local_start 1992-10-25 01:00:00 (Sun)
  62864121600, #    local_end 1993-01-31 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62864132400, #    utc_start 1993-01-31 03:00:00 (Sun)
  62886513600, #      utc_end 1993-10-17 04:00:00 (Sun)
  62864118000, #  local_start 1993-01-30 23:00:00 (Sat)
  62886499200, #    local_end 1993-10-17 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62886513600, #    utc_start 1993-10-17 04:00:00 (Sun)
  62897396400, #      utc_end 1994-02-20 03:00:00 (Sun)
  62886502800, #  local_start 1993-10-17 01:00:00 (Sun)
  62897385600, #    local_end 1994-02-20 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62897396400, #    utc_start 1994-02-20 03:00:00 (Sun)
  62917963200, #      utc_end 1994-10-16 04:00:00 (Sun)
  62897382000, #  local_start 1994-02-19 23:00:00 (Sat)
  62917948800, #    local_end 1994-10-16 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62917963200, #    utc_start 1994-10-16 04:00:00 (Sun)
  62928846000, #      utc_end 1995-02-19 03:00:00 (Sun)
  62917952400, #  local_start 1994-10-16 01:00:00 (Sun)
  62928835200, #    local_end 1995-02-19 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62928846000, #    utc_start 1995-02-19 03:00:00 (Sun)
  62949412800, #      utc_end 1995-10-15 04:00:00 (Sun)
  62928831600, #  local_start 1995-02-18 23:00:00 (Sat)
  62949398400, #    local_end 1995-10-15 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62949412800, #    utc_start 1995-10-15 04:00:00 (Sun)
  62959690800, #      utc_end 1996-02-11 03:00:00 (Sun)
  62949402000, #  local_start 1995-10-15 01:00:00 (Sun)
  62959680000, #    local_end 1996-02-11 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62959690800, #    utc_start 1996-02-11 03:00:00 (Sun)
  62980257600, #      utc_end 1996-10-06 04:00:00 (Sun)
  62959676400, #  local_start 1996-02-10 23:00:00 (Sat)
  62980243200, #    local_end 1996-10-06 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62980257600, #    utc_start 1996-10-06 04:00:00 (Sun)
  62991745200, #      utc_end 1997-02-16 03:00:00 (Sun)
  62980246800, #  local_start 1996-10-06 01:00:00 (Sun)
  62991734400, #    local_end 1997-02-16 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62991745200, #    utc_start 1997-02-16 03:00:00 (Sun)
  63011793600, #      utc_end 1997-10-06 04:00:00 (Mon)
  62991730800, #  local_start 1997-02-15 23:00:00 (Sat)
  63011779200, #    local_end 1997-10-06 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  63011793600, #    utc_start 1997-10-06 04:00:00 (Mon)
  63024404400, #      utc_end 1998-03-01 03:00:00 (Sun)
  63011782800, #  local_start 1997-10-06 01:00:00 (Mon)
  63024393600, #    local_end 1998-03-01 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63024404400, #    utc_start 1998-03-01 03:00:00 (Sun)
  63043761600, #      utc_end 1998-10-11 04:00:00 (Sun)
  63024390000, #  local_start 1998-02-28 23:00:00 (Sat)
  63043747200, #    local_end 1998-10-11 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63043761600, #    utc_start 1998-10-11 04:00:00 (Sun)
  63055249200, #      utc_end 1999-02-21 03:00:00 (Sun)
  63043750800, #  local_start 1998-10-11 01:00:00 (Sun)
  63055238400, #    local_end 1999-02-21 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63055249200, #    utc_start 1999-02-21 03:00:00 (Sun)
  63074606400, #      utc_end 1999-10-03 04:00:00 (Sun)
  63055234800, #  local_start 1999-02-20 23:00:00 (Sat)
  63074592000, #    local_end 1999-10-03 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63074606400, #    utc_start 1999-10-03 04:00:00 (Sun)
  63087303600, #      utc_end 2000-02-27 03:00:00 (Sun)
  63074595600, #  local_start 1999-10-03 01:00:00 (Sun)
  63087292800, #    local_end 2000-02-27 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63087303600, #    utc_start 2000-02-27 03:00:00 (Sun)
  63106660800, #      utc_end 2000-10-08 04:00:00 (Sun)
  63087289200, #  local_start 2000-02-26 23:00:00 (Sat)
  63106646400, #    local_end 2000-10-08 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63106660800, #    utc_start 2000-10-08 04:00:00 (Sun)
  63118148400, #      utc_end 2001-02-18 03:00:00 (Sun)
  63106650000, #  local_start 2000-10-08 01:00:00 (Sun)
  63118137600, #    local_end 2001-02-18 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63118148400, #    utc_start 2001-02-18 03:00:00 (Sun)
  63138715200, #      utc_end 2001-10-14 04:00:00 (Sun)
  63118134000, #  local_start 2001-02-17 23:00:00 (Sat)
  63138700800, #    local_end 2001-10-14 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63138715200, #    utc_start 2001-10-14 04:00:00 (Sun)
  63149598000, #      utc_end 2002-02-17 03:00:00 (Sun)
  63138704400, #  local_start 2001-10-14 01:00:00 (Sun)
  63149587200, #    local_end 2002-02-17 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63149598000, #    utc_start 2002-02-17 03:00:00 (Sun)
  63171979200, #      utc_end 2002-11-03 04:00:00 (Sun)
  63149583600, #  local_start 2002-02-16 23:00:00 (Sat)
  63171964800, #    local_end 2002-11-03 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63171979200, #    utc_start 2002-11-03 04:00:00 (Sun)
  63181047600, #      utc_end 2003-02-16 03:00:00 (Sun)
  63171968400, #  local_start 2002-11-03 01:00:00 (Sun)
  63181036800, #    local_end 2003-02-16 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63181047600, #    utc_start 2003-02-16 03:00:00 (Sun)
  63202219200, #      utc_end 2003-10-19 04:00:00 (Sun)
  63181033200, #  local_start 2003-02-15 23:00:00 (Sat)
  63202204800, #    local_end 2003-10-19 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63202219200, #    utc_start 2003-10-19 04:00:00 (Sun)
  63212497200, #      utc_end 2004-02-15 03:00:00 (Sun)
  63202208400, #  local_start 2003-10-19 01:00:00 (Sun)
  63212486400, #    local_end 2004-02-15 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63212497200, #    utc_start 2004-02-15 03:00:00 (Sun)
  63235051200, #      utc_end 2004-11-02 04:00:00 (Tue)
  63212482800, #  local_start 2004-02-14 23:00:00 (Sat)
  63235036800, #    local_end 2004-11-02 00:00:00 (Tue)
  -14400,
  0,
  '-04',
      ],
      [
  63235051200, #    utc_start 2004-11-02 04:00:00 (Tue)
  63244551600, #      utc_end 2005-02-20 03:00:00 (Sun)
  63235040400, #  local_start 2004-11-02 01:00:00 (Tue)
  63244540800, #    local_end 2005-02-20 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63244551600, #    utc_start 2005-02-20 03:00:00 (Sun)
  63265118400, #      utc_end 2005-10-16 04:00:00 (Sun)
  63244537200, #  local_start 2005-02-19 23:00:00 (Sat)
  63265104000, #    local_end 2005-10-16 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63265118400, #    utc_start 2005-10-16 04:00:00 (Sun)
  63276001200, #      utc_end 2006-02-19 03:00:00 (Sun)
  63265107600, #  local_start 2005-10-16 01:00:00 (Sun)
  63275990400, #    local_end 2006-02-19 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63276001200, #    utc_start 2006-02-19 03:00:00 (Sun)
  63298382400, #      utc_end 2006-11-05 04:00:00 (Sun)
  63275986800, #  local_start 2006-02-18 23:00:00 (Sat)
  63298368000, #    local_end 2006-11-05 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63298382400, #    utc_start 2006-11-05 04:00:00 (Sun)
  63308055600, #      utc_end 2007-02-25 03:00:00 (Sun)
  63298371600, #  local_start 2006-11-05 01:00:00 (Sun)
  63308044800, #    local_end 2007-02-25 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63308055600, #    utc_start 2007-02-25 03:00:00 (Sun)
  63328017600, #      utc_end 2007-10-14 04:00:00 (Sun)
  63308041200, #  local_start 2007-02-24 23:00:00 (Sat)
  63328003200, #    local_end 2007-10-14 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63328017600, #    utc_start 2007-10-14 04:00:00 (Sun)
  63338900400, #      utc_end 2008-02-17 03:00:00 (Sun)
  63328006800, #  local_start 2007-10-14 01:00:00 (Sun)
  63338889600, #    local_end 2008-02-17 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63338900400, #    utc_start 2008-02-17 03:00:00 (Sun)
  63360072000, #      utc_end 2008-10-19 04:00:00 (Sun)
  63338886000, #  local_start 2008-02-16 23:00:00 (Sat)
  63360057600, #    local_end 2008-10-19 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63360072000, #    utc_start 2008-10-19 04:00:00 (Sun)
  63370350000, #      utc_end 2009-02-15 03:00:00 (Sun)
  63360061200, #  local_start 2008-10-19 01:00:00 (Sun)
  63370339200, #    local_end 2009-02-15 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63370350000, #    utc_start 2009-02-15 03:00:00 (Sun)
  63391521600, #      utc_end 2009-10-18 04:00:00 (Sun)
  63370335600, #  local_start 2009-02-14 23:00:00 (Sat)
  63391507200, #    local_end 2009-10-18 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63391521600, #    utc_start 2009-10-18 04:00:00 (Sun)
  63402404400, #      utc_end 2010-02-21 03:00:00 (Sun)
  63391510800, #  local_start 2009-10-18 01:00:00 (Sun)
  63402393600, #    local_end 2010-02-21 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63402404400, #    utc_start 2010-02-21 03:00:00 (Sun)
  63422971200, #      utc_end 2010-10-17 04:00:00 (Sun)
  63402390000, #  local_start 2010-02-20 23:00:00 (Sat)
  63422956800, #    local_end 2010-10-17 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63422971200, #    utc_start 2010-10-17 04:00:00 (Sun)
  63433854000, #      utc_end 2011-02-20 03:00:00 (Sun)
  63422960400, #  local_start 2010-10-17 01:00:00 (Sun)
  63433843200, #    local_end 2011-02-20 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63433854000, #    utc_start 2011-02-20 03:00:00 (Sun)
  63454420800, #      utc_end 2011-10-16 04:00:00 (Sun)
  63433839600, #  local_start 2011-02-19 23:00:00 (Sat)
  63454406400, #    local_end 2011-10-16 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63454420800, #    utc_start 2011-10-16 04:00:00 (Sun)
  63465908400, #      utc_end 2012-02-26 03:00:00 (Sun)
  63454410000, #  local_start 2011-10-16 01:00:00 (Sun)
  63465897600, #    local_end 2012-02-26 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63465908400, #    utc_start 2012-02-26 03:00:00 (Sun)
  63486475200, #      utc_end 2012-10-21 04:00:00 (Sun)
  63465894000, #  local_start 2012-02-25 23:00:00 (Sat)
  63486460800, #    local_end 2012-10-21 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63486475200, #    utc_start 2012-10-21 04:00:00 (Sun)
  63496753200, #      utc_end 2013-02-17 03:00:00 (Sun)
  63486464400, #  local_start 2012-10-21 01:00:00 (Sun)
  63496742400, #    local_end 2013-02-17 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63496753200, #    utc_start 2013-02-17 03:00:00 (Sun)
  63517924800, #      utc_end 2013-10-20 04:00:00 (Sun)
  63496738800, #  local_start 2013-02-16 23:00:00 (Sat)
  63517910400, #    local_end 2013-10-20 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63517924800, #    utc_start 2013-10-20 04:00:00 (Sun)
  63528202800, #      utc_end 2014-02-16 03:00:00 (Sun)
  63517914000, #  local_start 2013-10-20 01:00:00 (Sun)
  63528192000, #    local_end 2014-02-16 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63528202800, #    utc_start 2014-02-16 03:00:00 (Sun)
  63549374400, #      utc_end 2014-10-19 04:00:00 (Sun)
  63528188400, #  local_start 2014-02-15 23:00:00 (Sat)
  63549360000, #    local_end 2014-10-19 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63549374400, #    utc_start 2014-10-19 04:00:00 (Sun)
  63560257200, #      utc_end 2015-02-22 03:00:00 (Sun)
  63549363600, #  local_start 2014-10-19 01:00:00 (Sun)
  63560246400, #    local_end 2015-02-22 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63560257200, #    utc_start 2015-02-22 03:00:00 (Sun)
  63580824000, #      utc_end 2015-10-18 04:00:00 (Sun)
  63560242800, #  local_start 2015-02-21 23:00:00 (Sat)
  63580809600, #    local_end 2015-10-18 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63580824000, #    utc_start 2015-10-18 04:00:00 (Sun)
  63591706800, #      utc_end 2016-02-21 03:00:00 (Sun)
  63580813200, #  local_start 2015-10-18 01:00:00 (Sun)
  63591696000, #    local_end 2016-02-21 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63591706800, #    utc_start 2016-02-21 03:00:00 (Sun)
  63612273600, #      utc_end 2016-10-16 04:00:00 (Sun)
  63591692400, #  local_start 2016-02-20 23:00:00 (Sat)
  63612259200, #    local_end 2016-10-16 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63612273600, #    utc_start 2016-10-16 04:00:00 (Sun)
  63623156400, #      utc_end 2017-02-19 03:00:00 (Sun)
  63612262800, #  local_start 2016-10-16 01:00:00 (Sun)
  63623145600, #    local_end 2017-02-19 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63623156400, #    utc_start 2017-02-19 03:00:00 (Sun)
  63643723200, #      utc_end 2017-10-15 04:00:00 (Sun)
  63623142000, #  local_start 2017-02-18 23:00:00 (Sat)
  63643708800, #    local_end 2017-10-15 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63643723200, #    utc_start 2017-10-15 04:00:00 (Sun)
  63654606000, #      utc_end 2018-02-18 03:00:00 (Sun)
  63643712400, #  local_start 2017-10-15 01:00:00 (Sun)
  63654595200, #    local_end 2018-02-18 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63654606000, #    utc_start 2018-02-18 03:00:00 (Sun)
  63676987200, #      utc_end 2018-11-04 04:00:00 (Sun)
  63654591600, #  local_start 2018-02-17 23:00:00 (Sat)
  63676972800, #    local_end 2018-11-04 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63676987200, #    utc_start 2018-11-04 04:00:00 (Sun)
  63686055600, #      utc_end 2019-02-17 03:00:00 (Sun)
  63676976400, #  local_start 2018-11-04 01:00:00 (Sun)
  63686044800, #    local_end 2019-02-17 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63686055600, #    utc_start 2019-02-17 03:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #      utc_end
  63686041200, #  local_start 2019-02-16 23:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #    local_end
  -14400,
  0,
  '-04',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {45}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_CAMPO_GRANDE

    $main::fatpacked{"DateTime/TimeZone/America/Cancun.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_CANCUN';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Cancun;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Cancun::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60620940000, #      utc_end 1922-01-01 06:00:00 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60620919176, #    local_end 1922-01-01 00:12:56 (Sun)
  -20824,
  0,
  'LMT',
      ],
      [
  60620940000, #    utc_start 1922-01-01 06:00:00 (Sun)
  62513618400, #      utc_end 1981-12-23 06:00:00 (Wed)
  60620918400, #  local_start 1922-01-01 00:00:00 (Sun)
  62513596800, #    local_end 1981-12-23 00:00:00 (Wed)
  -21600,
  0,
  'CST',
      ],
      [
  62513618400, #    utc_start 1981-12-23 06:00:00 (Wed)
  62964543600, #      utc_end 1996-04-07 07:00:00 (Sun)
  62513600400, #  local_start 1981-12-23 01:00:00 (Wed)
  62964525600, #    local_end 1996-04-07 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62964543600, #    utc_start 1996-04-07 07:00:00 (Sun)
  62982079200, #      utc_end 1996-10-27 06:00:00 (Sun)
  62964529200, #  local_start 1996-04-07 03:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62982079200, #    utc_start 1996-10-27 06:00:00 (Sun)
  62995993200, #      utc_end 1997-04-06 07:00:00 (Sun)
  62982061200, #  local_start 1996-10-27 01:00:00 (Sun)
  62995975200, #    local_end 1997-04-06 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62995993200, #    utc_start 1997-04-06 07:00:00 (Sun)
  63013528800, #      utc_end 1997-10-26 06:00:00 (Sun)
  62995978800, #  local_start 1997-04-06 03:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63013528800, #    utc_start 1997-10-26 06:00:00 (Sun)
  63027442800, #      utc_end 1998-04-05 07:00:00 (Sun)
  63013510800, #  local_start 1997-10-26 01:00:00 (Sun)
  63027424800, #    local_end 1998-04-05 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63027442800, #    utc_start 1998-04-05 07:00:00 (Sun)
  63037720800, #      utc_end 1998-08-02 06:00:00 (Sun)
  63027428400, #  local_start 1998-04-05 03:00:00 (Sun)
  63037706400, #    local_end 1998-08-02 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63037720800, #    utc_start 1998-08-02 06:00:00 (Sun)
  63044982000, #      utc_end 1998-10-25 07:00:00 (Sun)
  63037702800, #  local_start 1998-08-02 01:00:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63044982000, #    utc_start 1998-10-25 07:00:00 (Sun)
  63058896000, #      utc_end 1999-04-04 08:00:00 (Sun)
  63044960400, #  local_start 1998-10-25 01:00:00 (Sun)
  63058874400, #    local_end 1999-04-04 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63058896000, #    utc_start 1999-04-04 08:00:00 (Sun)
  63077036400, #      utc_end 1999-10-31 07:00:00 (Sun)
  63058878000, #  local_start 1999-04-04 03:00:00 (Sun)
  63077018400, #    local_end 1999-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63077036400, #    utc_start 1999-10-31 07:00:00 (Sun)
  63090345600, #      utc_end 2000-04-02 08:00:00 (Sun)
  63077014800, #  local_start 1999-10-31 01:00:00 (Sun)
  63090324000, #    local_end 2000-04-02 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63090345600, #    utc_start 2000-04-02 08:00:00 (Sun)
  63108486000, #      utc_end 2000-10-29 07:00:00 (Sun)
  63090327600, #  local_start 2000-04-02 03:00:00 (Sun)
  63108468000, #    local_end 2000-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63108486000, #    utc_start 2000-10-29 07:00:00 (Sun)
  63124819200, #      utc_end 2001-05-06 08:00:00 (Sun)
  63108464400, #  local_start 2000-10-29 01:00:00 (Sun)
  63124797600, #    local_end 2001-05-06 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63124819200, #    utc_start 2001-05-06 08:00:00 (Sun)
  63137516400, #      utc_end 2001-09-30 07:00:00 (Sun)
  63124801200, #  local_start 2001-05-06 03:00:00 (Sun)
  63137498400, #    local_end 2001-09-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63137516400, #    utc_start 2001-09-30 07:00:00 (Sun)
  63153849600, #      utc_end 2002-04-07 08:00:00 (Sun)
  63137494800, #  local_start 2001-09-30 01:00:00 (Sun)
  63153828000, #    local_end 2002-04-07 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63153849600, #    utc_start 2002-04-07 08:00:00 (Sun)
  63171385200, #      utc_end 2002-10-27 07:00:00 (Sun)
  63153831600, #  local_start 2002-04-07 03:00:00 (Sun)
  63171367200, #    local_end 2002-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63171385200, #    utc_start 2002-10-27 07:00:00 (Sun)
  63185299200, #      utc_end 2003-04-06 08:00:00 (Sun)
  63171363600, #  local_start 2002-10-27 01:00:00 (Sun)
  63185277600, #    local_end 2003-04-06 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63185299200, #    utc_start 2003-04-06 08:00:00 (Sun)
  63202834800, #      utc_end 2003-10-26 07:00:00 (Sun)
  63185281200, #  local_start 2003-04-06 03:00:00 (Sun)
  63202816800, #    local_end 2003-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63202834800, #    utc_start 2003-10-26 07:00:00 (Sun)
  63216748800, #      utc_end 2004-04-04 08:00:00 (Sun)
  63202813200, #  local_start 2003-10-26 01:00:00 (Sun)
  63216727200, #    local_end 2004-04-04 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63216748800, #    utc_start 2004-04-04 08:00:00 (Sun)
  63234889200, #      utc_end 2004-10-31 07:00:00 (Sun)
  63216730800, #  local_start 2004-04-04 03:00:00 (Sun)
  63234871200, #    local_end 2004-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63234889200, #    utc_start 2004-10-31 07:00:00 (Sun)
  63248198400, #      utc_end 2005-04-03 08:00:00 (Sun)
  63234867600, #  local_start 2004-10-31 01:00:00 (Sun)
  63248176800, #    local_end 2005-04-03 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63248198400, #    utc_start 2005-04-03 08:00:00 (Sun)
  63266338800, #      utc_end 2005-10-30 07:00:00 (Sun)
  63248180400, #  local_start 2005-04-03 03:00:00 (Sun)
  63266320800, #    local_end 2005-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63266338800, #    utc_start 2005-10-30 07:00:00 (Sun)
  63279648000, #      utc_end 2006-04-02 08:00:00 (Sun)
  63266317200, #  local_start 2005-10-30 01:00:00 (Sun)
  63279626400, #    local_end 2006-04-02 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63279648000, #    utc_start 2006-04-02 08:00:00 (Sun)
  63297788400, #      utc_end 2006-10-29 07:00:00 (Sun)
  63279630000, #  local_start 2006-04-02 03:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63297788400, #    utc_start 2006-10-29 07:00:00 (Sun)
  63311097600, #      utc_end 2007-04-01 08:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63311076000, #    local_end 2007-04-01 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63311097600, #    utc_start 2007-04-01 08:00:00 (Sun)
  63329238000, #      utc_end 2007-10-28 07:00:00 (Sun)
  63311079600, #  local_start 2007-04-01 03:00:00 (Sun)
  63329220000, #    local_end 2007-10-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63329238000, #    utc_start 2007-10-28 07:00:00 (Sun)
  63343152000, #      utc_end 2008-04-06 08:00:00 (Sun)
  63329216400, #  local_start 2007-10-28 01:00:00 (Sun)
  63343130400, #    local_end 2008-04-06 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63343152000, #    utc_start 2008-04-06 08:00:00 (Sun)
  63360687600, #      utc_end 2008-10-26 07:00:00 (Sun)
  63343134000, #  local_start 2008-04-06 03:00:00 (Sun)
  63360669600, #    local_end 2008-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63360687600, #    utc_start 2008-10-26 07:00:00 (Sun)
  63374601600, #      utc_end 2009-04-05 08:00:00 (Sun)
  63360666000, #  local_start 2008-10-26 01:00:00 (Sun)
  63374580000, #    local_end 2009-04-05 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63374601600, #    utc_start 2009-04-05 08:00:00 (Sun)
  63392137200, #      utc_end 2009-10-25 07:00:00 (Sun)
  63374583600, #  local_start 2009-04-05 03:00:00 (Sun)
  63392119200, #    local_end 2009-10-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63392137200, #    utc_start 2009-10-25 07:00:00 (Sun)
  63406051200, #      utc_end 2010-04-04 08:00:00 (Sun)
  63392115600, #  local_start 2009-10-25 01:00:00 (Sun)
  63406029600, #    local_end 2010-04-04 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63406051200, #    utc_start 2010-04-04 08:00:00 (Sun)
  63424191600, #      utc_end 2010-10-31 07:00:00 (Sun)
  63406033200, #  local_start 2010-04-04 03:00:00 (Sun)
  63424173600, #    local_end 2010-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63424191600, #    utc_start 2010-10-31 07:00:00 (Sun)
  63437500800, #      utc_end 2011-04-03 08:00:00 (Sun)
  63424170000, #  local_start 2010-10-31 01:00:00 (Sun)
  63437479200, #    local_end 2011-04-03 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63437500800, #    utc_start 2011-04-03 08:00:00 (Sun)
  63455641200, #      utc_end 2011-10-30 07:00:00 (Sun)
  63437482800, #  local_start 2011-04-03 03:00:00 (Sun)
  63455623200, #    local_end 2011-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63455641200, #    utc_start 2011-10-30 07:00:00 (Sun)
  63468950400, #      utc_end 2012-04-01 08:00:00 (Sun)
  63455619600, #  local_start 2011-10-30 01:00:00 (Sun)
  63468928800, #    local_end 2012-04-01 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63468950400, #    utc_start 2012-04-01 08:00:00 (Sun)
  63487090800, #      utc_end 2012-10-28 07:00:00 (Sun)
  63468932400, #  local_start 2012-04-01 03:00:00 (Sun)
  63487072800, #    local_end 2012-10-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63487090800, #    utc_start 2012-10-28 07:00:00 (Sun)
  63501004800, #      utc_end 2013-04-07 08:00:00 (Sun)
  63487069200, #  local_start 2012-10-28 01:00:00 (Sun)
  63500983200, #    local_end 2013-04-07 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63501004800, #    utc_start 2013-04-07 08:00:00 (Sun)
  63518540400, #      utc_end 2013-10-27 07:00:00 (Sun)
  63500986800, #  local_start 2013-04-07 03:00:00 (Sun)
  63518522400, #    local_end 2013-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63518540400, #    utc_start 2013-10-27 07:00:00 (Sun)
  63532454400, #      utc_end 2014-04-06 08:00:00 (Sun)
  63518518800, #  local_start 2013-10-27 01:00:00 (Sun)
  63532432800, #    local_end 2014-04-06 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63532454400, #    utc_start 2014-04-06 08:00:00 (Sun)
  63549990000, #      utc_end 2014-10-26 07:00:00 (Sun)
  63532436400, #  local_start 2014-04-06 03:00:00 (Sun)
  63549972000, #    local_end 2014-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63549990000, #    utc_start 2014-10-26 07:00:00 (Sun)
  63558460800, #      utc_end 2015-02-01 08:00:00 (Sun)
  63549968400, #  local_start 2014-10-26 01:00:00 (Sun)
  63558439200, #    local_end 2015-02-01 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63558460800, #    utc_start 2015-02-01 08:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #      utc_end
  63558442800, #  local_start 2015-02-01 03:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  -18000,
  0,
  'EST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {20}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_CANCUN

    $main::fatpacked{"DateTime/TimeZone/America/Caracas.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_CARACAS';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/southamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Caracas;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Caracas::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59611177664, #      utc_end 1890-01-01 04:27:44 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59611161600, #    local_end 1890-01-01 00:00:00 (Wed)
  -16064,
  0,
  'LMT',
      ],
      [
  59611177664, #    utc_start 1890-01-01 04:27:44 (Wed)
  60308944060, #      utc_end 1912-02-12 04:27:40 (Mon)
  59611161604, #  local_start 1890-01-01 00:00:04 (Wed)
  60308928000, #    local_end 1912-02-12 00:00:00 (Mon)
  -16060,
  0,
  'CMT',
      ],
      [
  60308944060, #    utc_start 1912-02-12 04:27:40 (Mon)
  61977933000, #      utc_end 1965-01-01 04:30:00 (Fri)
  60308927860, #  local_start 1912-02-11 23:57:40 (Sun)
  61977916800, #    local_end 1965-01-01 00:00:00 (Fri)
  -16200,
  0,
  '-0430',
      ],
      [
  61977933000, #    utc_start 1965-01-01 04:30:00 (Fri)
  63332866800, #      utc_end 2007-12-09 07:00:00 (Sun)
  61977918600, #  local_start 1965-01-01 00:30:00 (Fri)
  63332852400, #    local_end 2007-12-09 03:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63332866800, #    utc_start 2007-12-09 07:00:00 (Sun)
  63597769200, #      utc_end 2016-05-01 07:00:00 (Sun)
  63332850600, #  local_start 2007-12-09 02:30:00 (Sun)
  63597753000, #    local_end 2016-05-01 02:30:00 (Sun)
  -16200,
  0,
  '-0430',
      ],
      [
  63597769200, #    utc_start 2016-05-01 07:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #      utc_end
  63597754800, #  local_start 2016-05-01 03:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  -14400,
  0,
  '-04',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_CARACAS

    $main::fatpacked{"DateTime/TimeZone/America/Cayenne.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_CAYENNE';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/southamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Cayenne;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Cayenne::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60289414160, #      utc_end 1911-07-01 03:29:20 (Sat)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60289401600, #    local_end 1911-07-01 00:00:00 (Sat)
  -12560,
  0,
  'LMT',
      ],
      [
  60289414160, #    utc_start 1911-07-01 03:29:20 (Sat)
  62064590400, #      utc_end 1967-10-01 04:00:00 (Sun)
  60289399760, #  local_start 1911-06-30 23:29:20 (Fri)
  62064576000, #    local_end 1967-10-01 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62064590400, #    utc_start 1967-10-01 04:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #      utc_end
  62064579600, #  local_start 1967-10-01 01:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  -10800,
  0,
  '-03',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_CAYENNE

    $main::fatpacked{"DateTime/TimeZone/America/Chicago.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_CHICAGO';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Chicago;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Chicago::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59418036000, #      utc_end 1883-11-18 18:00:00 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59418014964, #    local_end 1883-11-18 12:09:24 (Sun)
  -21036,
  0,
  'LMT',
      ],
      [
  59418036000, #    utc_start 1883-11-18 18:00:00 (Sun)
  60502406400, #      utc_end 1918-03-31 08:00:00 (Sun)
  59418014400, #  local_start 1883-11-18 12:00:00 (Sun)
  60502384800, #    local_end 1918-03-31 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  60502406400, #    utc_start 1918-03-31 08:00:00 (Sun)
  60520546800, #      utc_end 1918-10-27 07:00:00 (Sun)
  60502388400, #  local_start 1918-03-31 03:00:00 (Sun)
  60520528800, #    local_end 1918-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  60520546800, #    utc_start 1918-10-27 07:00:00 (Sun)
  60533856000, #      utc_end 1919-03-30 08:00:00 (Sun)
  60520525200, #  local_start 1918-10-27 01:00:00 (Sun)
  60533834400, #    local_end 1919-03-30 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  60533856000, #    utc_start 1919-03-30 08:00:00 (Sun)
  60551996400, #      utc_end 1919-10-26 07:00:00 (Sun)
  60533838000, #  local_start 1919-03-30 03:00:00 (Sun)
  60551978400, #    local_end 1919-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  60551996400, #    utc_start 1919-10-26 07:00:00 (Sun)
  60557781600, #      utc_end 1920-01-01 06:00:00 (Thu)
  60551974800, #  local_start 1919-10-26 01:00:00 (Sun)
  60557760000, #    local_end 1920-01-01 00:00:00 (Thu)
  -21600,
  0,
  'CST',
      ],
      [
  60557781600, #    utc_start 1920-01-01 06:00:00 (Thu)
  60571958400, #      utc_end 1920-06-13 08:00:00 (Sun)
  60557760000, #  local_start 1920-01-01 00:00:00 (Thu)
  60571936800, #    local_end 1920-06-13 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  60571958400, #    utc_start 1920-06-13 08:00:00 (Sun)
  60584050800, #      utc_end 1920-10-31 07:00:00 (Sun)
  60571940400, #  local_start 1920-06-13 03:00:00 (Sun)
  60584032800, #    local_end 1920-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  60584050800, #    utc_start 1920-10-31 07:00:00 (Sun)
  60596755200, #      utc_end 1921-03-27 08:00:00 (Sun)
  60584029200, #  local_start 1920-10-31 01:00:00 (Sun)
  60596733600, #    local_end 1921-03-27 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  60596755200, #    utc_start 1921-03-27 08:00:00 (Sun)
  60615500400, #      utc_end 1921-10-30 07:00:00 (Sun)
  60596737200, #  local_start 1921-03-27 03:00:00 (Sun)
  60615482400, #    local_end 1921-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  60615500400, #    utc_start 1921-10-30 07:00:00 (Sun)
  60631228800, #      utc_end 1922-04-30 08:00:00 (Sun)
  60615478800, #  local_start 1921-10-30 01:00:00 (Sun)
  60631207200, #    local_end 1922-04-30 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  60631228800, #    utc_start 1922-04-30 08:00:00 (Sun)
  60643926000, #      utc_end 1922-09-24 07:00:00 (Sun)
  60631210800, #  local_start 1922-04-30 03:00:00 (Sun)
  60643908000, #    local_end 1922-09-24 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  60643926000, #    utc_start 1922-09-24 07:00:00 (Sun)
  60662678400, #      utc_end 1923-04-29 08:00:00 (Sun)
  60643904400, #  local_start 1922-09-24 01:00:00 (Sun)
  60662656800, #    local_end 1923-04-29 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  60662678400, #    utc_start 1923-04-29 08:00:00 (Sun)
  60675980400, #      utc_end 1923-09-30 07:00:00 (Sun)
  60662660400, #  local_start 1923-04-29 03:00:00 (Sun)
  60675962400, #    local_end 1923-09-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  60675980400, #    utc_start 1923-09-30 07:00:00 (Sun)
  60694128000, #      utc_end 1924-04-27 08:00:00 (Sun)
  60675958800, #  local_start 1923-09-30 01:00:00 (Sun)
  60694106400, #    local_end 1924-04-27 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  60694128000, #    utc_start 1924-04-27 08:00:00 (Sun)
  60707430000, #      utc_end 1924-09-28 07:00:00 (Sun)
  60694110000, #  local_start 1924-04-27 03:00:00 (Sun)
  60707412000, #    local_end 1924-09-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  60707430000, #    utc_start 1924-09-28 07:00:00 (Sun)
  60725577600, #      utc_end 1925-04-26 08:00:00 (Sun)
  60707408400, #  local_start 1924-09-28 01:00:00 (Sun)
  60725556000, #    local_end 1925-04-26 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  60725577600, #    utc_start 1925-04-26 08:00:00 (Sun)
  60738879600, #      utc_end 1925-09-27 07:00:00 (Sun)
  60725559600, #  local_start 1925-04-26 03:00:00 (Sun)
  60738861600, #    local_end 1925-09-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  60738879600, #    utc_start 1925-09-27 07:00:00 (Sun)
  60757027200, #      utc_end 1926-04-25 08:00:00 (Sun)
  60738858000, #  local_start 1925-09-27 01:00:00 (Sun)
  60757005600, #    local_end 1926-04-25 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  60757027200, #    utc_start 1926-04-25 08:00:00 (Sun)
  60770329200, #      utc_end 1926-09-26 07:00:00 (Sun)
  60757009200, #  local_start 1926-04-25 03:00:00 (Sun)
  60770311200, #    local_end 1926-09-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  60770329200, #    utc_start 1926-09-26 07:00:00 (Sun)
  60788476800, #      utc_end 1927-04-24 08:00:00 (Sun)
  60770307600, #  local_start 1926-09-26 01:00:00 (Sun)
  60788455200, #    local_end 1927-04-24 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  60788476800, #    utc_start 1927-04-24 08:00:00 (Sun)
  60801778800, #      utc_end 1927-09-25 07:00:00 (Sun)
  60788458800, #  local_start 1927-04-24 03:00:00 (Sun)
  60801760800, #    local_end 1927-09-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  60801778800, #    utc_start 1927-09-25 07:00:00 (Sun)
  60820531200, #      utc_end 1928-04-29 08:00:00 (Sun)
  60801757200, #  local_start 1927-09-25 01:00:00 (Sun)
  60820509600, #    local_end 1928-04-29 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  60820531200, #    utc_start 1928-04-29 08:00:00 (Sun)
  60833833200, #      utc_end 1928-09-30 07:00:00 (Sun)
  60820513200, #  local_start 1928-04-29 03:00:00 (Sun)
  60833815200, #    local_end 1928-09-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  60833833200, #    utc_start 1928-09-30 07:00:00 (Sun)
  60851980800, #      utc_end 1929-04-28 08:00:00 (Sun)
  60833811600, #  local_start 1928-09-30 01:00:00 (Sun)
  60851959200, #    local_end 1929-04-28 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  60851980800, #    utc_start 1929-04-28 08:00:00 (Sun)
  60865282800, #      utc_end 1929-09-29 07:00:00 (Sun)
  60851962800, #  local_start 1929-04-28 03:00:00 (Sun)
  60865264800, #    local_end 1929-09-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  60865282800, #    utc_start 1929-09-29 07:00:00 (Sun)
  60883430400, #      utc_end 1930-04-27 08:00:00 (Sun)
  60865261200, #  local_start 1929-09-29 01:00:00 (Sun)
  60883408800, #    local_end 1930-04-27 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  60883430400, #    utc_start 1930-04-27 08:00:00 (Sun)
  60896732400, #      utc_end 1930-09-28 07:00:00 (Sun)
  60883412400, #  local_start 1930-04-27 03:00:00 (Sun)
  60896714400, #    local_end 1930-09-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  60896732400, #    utc_start 1930-09-28 07:00:00 (Sun)
  60914880000, #      utc_end 1931-04-26 08:00:00 (Sun)
  60896710800, #  local_start 1930-09-28 01:00:00 (Sun)
  60914858400, #    local_end 1931-04-26 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  60914880000, #    utc_start 1931-04-26 08:00:00 (Sun)
  60928182000, #      utc_end 1931-09-27 07:00:00 (Sun)
  60914862000, #  local_start 1931-04-26 03:00:00 (Sun)
  60928164000, #    local_end 1931-09-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  60928182000, #    utc_start 1931-09-27 07:00:00 (Sun)
  60946329600, #      utc_end 1932-04-24 08:00:00 (Sun)
  60928160400, #  local_start 1931-09-27 01:00:00 (Sun)
  60946308000, #    local_end 1932-04-24 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  60946329600, #    utc_start 1932-04-24 08:00:00 (Sun)
  60959631600, #      utc_end 1932-09-25 07:00:00 (Sun)
  60946311600, #  local_start 1932-04-24 03:00:00 (Sun)
  60959613600, #    local_end 1932-09-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  60959631600, #    utc_start 1932-09-25 07:00:00 (Sun)
  60978384000, #      utc_end 1933-04-30 08:00:00 (Sun)
  60959610000, #  local_start 1932-09-25 01:00:00 (Sun)
  60978362400, #    local_end 1933-04-30 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  60978384000, #    utc_start 1933-04-30 08:00:00 (Sun)
  60991081200, #      utc_end 1933-09-24 07:00:00 (Sun)
  60978366000, #  local_start 1933-04-30 03:00:00 (Sun)
  60991063200, #    local_end 1933-09-24 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  60991081200, #    utc_start 1933-09-24 07:00:00 (Sun)
  61009833600, #      utc_end 1934-04-29 08:00:00 (Sun)
  60991059600, #  local_start 1933-09-24 01:00:00 (Sun)
  61009812000, #    local_end 1934-04-29 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61009833600, #    utc_start 1934-04-29 08:00:00 (Sun)
  61023135600, #      utc_end 1934-09-30 07:00:00 (Sun)
  61009815600, #  local_start 1934-04-29 03:00:00 (Sun)
  61023117600, #    local_end 1934-09-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61023135600, #    utc_start 1934-09-30 07:00:00 (Sun)
  61041283200, #      utc_end 1935-04-28 08:00:00 (Sun)
  61023114000, #  local_start 1934-09-30 01:00:00 (Sun)
  61041261600, #    local_end 1935-04-28 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61041283200, #    utc_start 1935-04-28 08:00:00 (Sun)
  61054585200, #      utc_end 1935-09-29 07:00:00 (Sun)
  61041265200, #  local_start 1935-04-28 03:00:00 (Sun)
  61054567200, #    local_end 1935-09-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61054585200, #    utc_start 1935-09-29 07:00:00 (Sun)
  61067894400, #      utc_end 1936-03-01 08:00:00 (Sun)
  61054563600, #  local_start 1935-09-29 01:00:00 (Sun)
  61067872800, #    local_end 1936-03-01 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61067894400, #    utc_start 1936-03-01 08:00:00 (Sun)
  61090268400, #      utc_end 1936-11-15 07:00:00 (Sun)
  61067876400, #  local_start 1936-03-01 03:00:00 (Sun)
  61090250400, #    local_end 1936-11-15 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  61090268400, #    utc_start 1936-11-15 07:00:00 (Sun)
  61104182400, #      utc_end 1937-04-25 08:00:00 (Sun)
  61090246800, #  local_start 1936-11-15 01:00:00 (Sun)
  61104160800, #    local_end 1937-04-25 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61104182400, #    utc_start 1937-04-25 08:00:00 (Sun)
  61117484400, #      utc_end 1937-09-26 07:00:00 (Sun)
  61104164400, #  local_start 1937-04-25 03:00:00 (Sun)
  61117466400, #    local_end 1937-09-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61117484400, #    utc_start 1937-09-26 07:00:00 (Sun)
  61135632000, #      utc_end 1938-04-24 08:00:00 (Sun)
  61117462800, #  local_start 1937-09-26 01:00:00 (Sun)
  61135610400, #    local_end 1938-04-24 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61135632000, #    utc_start 1938-04-24 08:00:00 (Sun)
  61148934000, #      utc_end 1938-09-25 07:00:00 (Sun)
  61135614000, #  local_start 1938-04-24 03:00:00 (Sun)
  61148916000, #    local_end 1938-09-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61148934000, #    utc_start 1938-09-25 07:00:00 (Sun)
  61167686400, #      utc_end 1939-04-30 08:00:00 (Sun)
  61148912400, #  local_start 1938-09-25 01:00:00 (Sun)
  61167664800, #    local_end 1939-04-30 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61167686400, #    utc_start 1939-04-30 08:00:00 (Sun)
  61180383600, #      utc_end 1939-09-24 07:00:00 (Sun)
  61167668400, #  local_start 1939-04-30 03:00:00 (Sun)
  61180365600, #    local_end 1939-09-24 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61180383600, #    utc_start 1939-09-24 07:00:00 (Sun)
  61199136000, #      utc_end 1940-04-28 08:00:00 (Sun)
  61180362000, #  local_start 1939-09-24 01:00:00 (Sun)
  61199114400, #    local_end 1940-04-28 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61199136000, #    utc_start 1940-04-28 08:00:00 (Sun)
  61212438000, #      utc_end 1940-09-29 07:00:00 (Sun)
  61199118000, #  local_start 1940-04-28 03:00:00 (Sun)
  61212420000, #    local_end 1940-09-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61212438000, #    utc_start 1940-09-29 07:00:00 (Sun)
  61230585600, #      utc_end 1941-04-27 08:00:00 (Sun)
  61212416400, #  local_start 1940-09-29 01:00:00 (Sun)
  61230564000, #    local_end 1941-04-27 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61230585600, #    utc_start 1941-04-27 08:00:00 (Sun)
  61243887600, #      utc_end 1941-09-28 07:00:00 (Sun)
  61230567600, #  local_start 1941-04-27 03:00:00 (Sun)
  61243869600, #    local_end 1941-09-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61243887600, #    utc_start 1941-09-28 07:00:00 (Sun)
  61252092000, #      utc_end 1942-01-01 06:00:00 (Thu)
  61243866000, #  local_start 1941-09-28 01:00:00 (Sun)
  61252070400, #    local_end 1942-01-01 00:00:00 (Thu)
  -21600,
  0,
  'CST',
      ],
      [
  61252092000, #    utc_start 1942-01-01 06:00:00 (Thu)
  61255468800, #      utc_end 1942-02-09 08:00:00 (Mon)
  61252070400, #  local_start 1942-01-01 00:00:00 (Thu)
  61255447200, #    local_end 1942-02-09 02:00:00 (Mon)
  -21600,
  0,
  'CST',
      ],
      [
  61255468800, #    utc_start 1942-02-09 08:00:00 (Mon)
  61366287600, #      utc_end 1945-08-14 23:00:00 (Tue)
  61255450800, #  local_start 1942-02-09 03:00:00 (Mon)
  61366269600, #    local_end 1945-08-14 18:00:00 (Tue)
  -18000,
  1,
  'CWT',
      ],
      [
  61366287600, #    utc_start 1945-08-14 23:00:00 (Tue)
  61370290800, #      utc_end 1945-09-30 07:00:00 (Sun)
  61366269600, #  local_start 1945-08-14 18:00:00 (Tue)
  61370272800, #    local_end 1945-09-30 02:00:00 (Sun)
  -18000,
  1,
  'CPT',
      ],
      [
  61370290800, #    utc_start 1945-09-30 07:00:00 (Sun)
  61378322400, #      utc_end 1946-01-01 06:00:00 (Tue)
  61370269200, #  local_start 1945-09-30 01:00:00 (Sun)
  61378300800, #    local_end 1946-01-01 00:00:00 (Tue)
  -21600,
  0,
  'CST',
      ],
      [
  61378322400, #    utc_start 1946-01-01 06:00:00 (Tue)
  61388438400, #      utc_end 1946-04-28 08:00:00 (Sun)
  61378300800, #  local_start 1946-01-01 00:00:00 (Tue)
  61388416800, #    local_end 1946-04-28 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61388438400, #    utc_start 1946-04-28 08:00:00 (Sun)
  61401740400, #      utc_end 1946-09-29 07:00:00 (Sun)
  61388420400, #  local_start 1946-04-28 03:00:00 (Sun)
  61401722400, #    local_end 1946-09-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61401740400, #    utc_start 1946-09-29 07:00:00 (Sun)
  61419888000, #      utc_end 1947-04-27 08:00:00 (Sun)
  61401718800, #  local_start 1946-09-29 01:00:00 (Sun)
  61419866400, #    local_end 1947-04-27 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61419888000, #    utc_start 1947-04-27 08:00:00 (Sun)
  61433190000, #      utc_end 1947-09-28 07:00:00 (Sun)
  61419870000, #  local_start 1947-04-27 03:00:00 (Sun)
  61433172000, #    local_end 1947-09-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61433190000, #    utc_start 1947-09-28 07:00:00 (Sun)
  61451337600, #      utc_end 1948-04-25 08:00:00 (Sun)
  61433168400, #  local_start 1947-09-28 01:00:00 (Sun)
  61451316000, #    local_end 1948-04-25 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61451337600, #    utc_start 1948-04-25 08:00:00 (Sun)
  61464639600, #      utc_end 1948-09-26 07:00:00 (Sun)
  61451319600, #  local_start 1948-04-25 03:00:00 (Sun)
  61464621600, #    local_end 1948-09-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61464639600, #    utc_start 1948-09-26 07:00:00 (Sun)
  61482787200, #      utc_end 1949-04-24 08:00:00 (Sun)
  61464618000, #  local_start 1948-09-26 01:00:00 (Sun)
  61482765600, #    local_end 1949-04-24 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61482787200, #    utc_start 1949-04-24 08:00:00 (Sun)
  61496089200, #      utc_end 1949-09-25 07:00:00 (Sun)
  61482769200, #  local_start 1949-04-24 03:00:00 (Sun)
  61496071200, #    local_end 1949-09-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61496089200, #    utc_start 1949-09-25 07:00:00 (Sun)
  61514841600, #      utc_end 1950-04-30 08:00:00 (Sun)
  61496067600, #  local_start 1949-09-25 01:00:00 (Sun)
  61514820000, #    local_end 1950-04-30 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61514841600, #    utc_start 1950-04-30 08:00:00 (Sun)
  61527538800, #      utc_end 1950-09-24 07:00:00 (Sun)
  61514823600, #  local_start 1950-04-30 03:00:00 (Sun)
  61527520800, #    local_end 1950-09-24 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61527538800, #    utc_start 1950-09-24 07:00:00 (Sun)
  61546291200, #      utc_end 1951-04-29 08:00:00 (Sun)
  61527517200, #  local_start 1950-09-24 01:00:00 (Sun)
  61546269600, #    local_end 1951-04-29 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61546291200, #    utc_start 1951-04-29 08:00:00 (Sun)
  61559593200, #      utc_end 1951-09-30 07:00:00 (Sun)
  61546273200, #  local_start 1951-04-29 03:00:00 (Sun)
  61559575200, #    local_end 1951-09-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61559593200, #    utc_start 1951-09-30 07:00:00 (Sun)
  61577740800, #      utc_end 1952-04-27 08:00:00 (Sun)
  61559571600, #  local_start 1951-09-30 01:00:00 (Sun)
  61577719200, #    local_end 1952-04-27 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61577740800, #    utc_start 1952-04-27 08:00:00 (Sun)
  61591042800, #      utc_end 1952-09-28 07:00:00 (Sun)
  61577722800, #  local_start 1952-04-27 03:00:00 (Sun)
  61591024800, #    local_end 1952-09-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61591042800, #    utc_start 1952-09-28 07:00:00 (Sun)
  61609190400, #      utc_end 1953-04-26 08:00:00 (Sun)
  61591021200, #  local_start 1952-09-28 01:00:00 (Sun)
  61609168800, #    local_end 1953-04-26 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61609190400, #    utc_start 1953-04-26 08:00:00 (Sun)
  61622492400, #      utc_end 1953-09-27 07:00:00 (Sun)
  61609172400, #  local_start 1953-04-26 03:00:00 (Sun)
  61622474400, #    local_end 1953-09-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61622492400, #    utc_start 1953-09-27 07:00:00 (Sun)
  61640640000, #      utc_end 1954-04-25 08:00:00 (Sun)
  61622470800, #  local_start 1953-09-27 01:00:00 (Sun)
  61640618400, #    local_end 1954-04-25 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61640640000, #    utc_start 1954-04-25 08:00:00 (Sun)
  61653942000, #      utc_end 1954-09-26 07:00:00 (Sun)
  61640622000, #  local_start 1954-04-25 03:00:00 (Sun)
  61653924000, #    local_end 1954-09-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61653942000, #    utc_start 1954-09-26 07:00:00 (Sun)
  61672089600, #      utc_end 1955-04-24 08:00:00 (Sun)
  61653920400, #  local_start 1954-09-26 01:00:00 (Sun)
  61672068000, #    local_end 1955-04-24 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61672089600, #    utc_start 1955-04-24 08:00:00 (Sun)
  61688415600, #      utc_end 1955-10-30 07:00:00 (Sun)
  61672071600, #  local_start 1955-04-24 03:00:00 (Sun)
  61688397600, #    local_end 1955-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61688415600, #    utc_start 1955-10-30 07:00:00 (Sun)
  61704144000, #      utc_end 1956-04-29 08:00:00 (Sun)
  61688394000, #  local_start 1955-10-30 01:00:00 (Sun)
  61704122400, #    local_end 1956-04-29 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61704144000, #    utc_start 1956-04-29 08:00:00 (Sun)
  61719865200, #      utc_end 1956-10-28 07:00:00 (Sun)
  61704126000, #  local_start 1956-04-29 03:00:00 (Sun)
  61719847200, #    local_end 1956-10-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61719865200, #    utc_start 1956-10-28 07:00:00 (Sun)
  61735593600, #      utc_end 1957-04-28 08:00:00 (Sun)
  61719843600, #  local_start 1956-10-28 01:00:00 (Sun)
  61735572000, #    local_end 1957-04-28 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61735593600, #    utc_start 1957-04-28 08:00:00 (Sun)
  61751314800, #      utc_end 1957-10-27 07:00:00 (Sun)
  61735575600, #  local_start 1957-04-28 03:00:00 (Sun)
  61751296800, #    local_end 1957-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61751314800, #    utc_start 1957-10-27 07:00:00 (Sun)
  61767043200, #      utc_end 1958-04-27 08:00:00 (Sun)
  61751293200, #  local_start 1957-10-27 01:00:00 (Sun)
  61767021600, #    local_end 1958-04-27 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61767043200, #    utc_start 1958-04-27 08:00:00 (Sun)
  61782764400, #      utc_end 1958-10-26 07:00:00 (Sun)
  61767025200, #  local_start 1958-04-27 03:00:00 (Sun)
  61782746400, #    local_end 1958-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61782764400, #    utc_start 1958-10-26 07:00:00 (Sun)
  61798492800, #      utc_end 1959-04-26 08:00:00 (Sun)
  61782742800, #  local_start 1958-10-26 01:00:00 (Sun)
  61798471200, #    local_end 1959-04-26 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61798492800, #    utc_start 1959-04-26 08:00:00 (Sun)
  61814214000, #      utc_end 1959-10-25 07:00:00 (Sun)
  61798474800, #  local_start 1959-04-26 03:00:00 (Sun)
  61814196000, #    local_end 1959-10-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61814214000, #    utc_start 1959-10-25 07:00:00 (Sun)
  61829942400, #      utc_end 1960-04-24 08:00:00 (Sun)
  61814192400, #  local_start 1959-10-25 01:00:00 (Sun)
  61829920800, #    local_end 1960-04-24 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61829942400, #    utc_start 1960-04-24 08:00:00 (Sun)
  61846268400, #      utc_end 1960-10-30 07:00:00 (Sun)
  61829924400, #  local_start 1960-04-24 03:00:00 (Sun)
  61846250400, #    local_end 1960-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61846268400, #    utc_start 1960-10-30 07:00:00 (Sun)
  61861996800, #      utc_end 1961-04-30 08:00:00 (Sun)
  61846246800, #  local_start 1960-10-30 01:00:00 (Sun)
  61861975200, #    local_end 1961-04-30 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61861996800, #    utc_start 1961-04-30 08:00:00 (Sun)
  61877718000, #      utc_end 1961-10-29 07:00:00 (Sun)
  61861978800, #  local_start 1961-04-30 03:00:00 (Sun)
  61877700000, #    local_end 1961-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61877718000, #    utc_start 1961-10-29 07:00:00 (Sun)
  61893446400, #      utc_end 1962-04-29 08:00:00 (Sun)
  61877696400, #  local_start 1961-10-29 01:00:00 (Sun)
  61893424800, #    local_end 1962-04-29 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61893446400, #    utc_start 1962-04-29 08:00:00 (Sun)
  61909167600, #      utc_end 1962-10-28 07:00:00 (Sun)
  61893428400, #  local_start 1962-04-29 03:00:00 (Sun)
  61909149600, #    local_end 1962-10-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61909167600, #    utc_start 1962-10-28 07:00:00 (Sun)
  61924896000, #      utc_end 1963-04-28 08:00:00 (Sun)
  61909146000, #  local_start 1962-10-28 01:00:00 (Sun)
  61924874400, #    local_end 1963-04-28 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61924896000, #    utc_start 1963-04-28 08:00:00 (Sun)
  61940617200, #      utc_end 1963-10-27 07:00:00 (Sun)
  61924878000, #  local_start 1963-04-28 03:00:00 (Sun)
  61940599200, #    local_end 1963-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61940617200, #    utc_start 1963-10-27 07:00:00 (Sun)
  61956345600, #      utc_end 1964-04-26 08:00:00 (Sun)
  61940595600, #  local_start 1963-10-27 01:00:00 (Sun)
  61956324000, #    local_end 1964-04-26 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61956345600, #    utc_start 1964-04-26 08:00:00 (Sun)
  61972066800, #      utc_end 1964-10-25 07:00:00 (Sun)
  61956327600, #  local_start 1964-04-26 03:00:00 (Sun)
  61972048800, #    local_end 1964-10-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61972066800, #    utc_start 1964-10-25 07:00:00 (Sun)
  61987795200, #      utc_end 1965-04-25 08:00:00 (Sun)
  61972045200, #  local_start 1964-10-25 01:00:00 (Sun)
  61987773600, #    local_end 1965-04-25 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61987795200, #    utc_start 1965-04-25 08:00:00 (Sun)
  62004121200, #      utc_end 1965-10-31 07:00:00 (Sun)
  61987777200, #  local_start 1965-04-25 03:00:00 (Sun)
  62004103200, #    local_end 1965-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62004121200, #    utc_start 1965-10-31 07:00:00 (Sun)
  62019244800, #      utc_end 1966-04-24 08:00:00 (Sun)
  62004099600, #  local_start 1965-10-31 01:00:00 (Sun)
  62019223200, #    local_end 1966-04-24 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62019244800, #    utc_start 1966-04-24 08:00:00 (Sun)
  62035570800, #      utc_end 1966-10-30 07:00:00 (Sun)
  62019226800, #  local_start 1966-04-24 03:00:00 (Sun)
  62035552800, #    local_end 1966-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62035570800, #    utc_start 1966-10-30 07:00:00 (Sun)
  62041010400, #      utc_end 1967-01-01 06:00:00 (Sun)
  62035549200, #  local_start 1966-10-30 01:00:00 (Sun)
  62040988800, #    local_end 1967-01-01 00:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62041010400, #    utc_start 1967-01-01 06:00:00 (Sun)
  62051299200, #      utc_end 1967-04-30 08:00:00 (Sun)
  62040988800, #  local_start 1967-01-01 00:00:00 (Sun)
  62051277600, #    local_end 1967-04-30 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62051299200, #    utc_start 1967-04-30 08:00:00 (Sun)
  62067020400, #      utc_end 1967-10-29 07:00:00 (Sun)
  62051281200, #  local_start 1967-04-30 03:00:00 (Sun)
  62067002400, #    local_end 1967-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62067020400, #    utc_start 1967-10-29 07:00:00 (Sun)
  62082748800, #      utc_end 1968-04-28 08:00:00 (Sun)
  62066998800, #  local_start 1967-10-29 01:00:00 (Sun)
  62082727200, #    local_end 1968-04-28 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62082748800, #    utc_start 1968-04-28 08:00:00 (Sun)
  62098470000, #      utc_end 1968-10-27 07:00:00 (Sun)
  62082730800, #  local_start 1968-04-28 03:00:00 (Sun)
  62098452000, #    local_end 1968-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62098470000, #    utc_start 1968-10-27 07:00:00 (Sun)
  62114198400, #      utc_end 1969-04-27 08:00:00 (Sun)
  62098448400, #  local_start 1968-10-27 01:00:00 (Sun)
  62114176800, #    local_end 1969-04-27 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62114198400, #    utc_start 1969-04-27 08:00:00 (Sun)
  62129919600, #      utc_end 1969-10-26 07:00:00 (Sun)
  62114180400, #  local_start 1969-04-27 03:00:00 (Sun)
  62129901600, #    local_end 1969-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62129919600, #    utc_start 1969-10-26 07:00:00 (Sun)
  62145648000, #      utc_end 1970-04-26 08:00:00 (Sun)
  62129898000, #  local_start 1969-10-26 01:00:00 (Sun)
  62145626400, #    local_end 1970-04-26 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62145648000, #    utc_start 1970-04-26 08:00:00 (Sun)
  62161369200, #      utc_end 1970-10-25 07:00:00 (Sun)
  62145630000, #  local_start 1970-04-26 03:00:00 (Sun)
  62161351200, #    local_end 1970-10-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62161369200, #    utc_start 1970-10-25 07:00:00 (Sun)
  62177097600, #      utc_end 1971-04-25 08:00:00 (Sun)
  62161347600, #  local_start 1970-10-25 01:00:00 (Sun)
  62177076000, #    local_end 1971-04-25 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62177097600, #    utc_start 1971-04-25 08:00:00 (Sun)
  62193423600, #      utc_end 1971-10-31 07:00:00 (Sun)
  62177079600, #  local_start 1971-04-25 03:00:00 (Sun)
  62193405600, #    local_end 1971-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62193423600, #    utc_start 1971-10-31 07:00:00 (Sun)
  62209152000, #      utc_end 1972-04-30 08:00:00 (Sun)
  62193402000, #  local_start 1971-10-31 01:00:00 (Sun)
  62209130400, #    local_end 1972-04-30 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62209152000, #    utc_start 1972-04-30 08:00:00 (Sun)
  62224873200, #      utc_end 1972-10-29 07:00:00 (Sun)
  62209134000, #  local_start 1972-04-30 03:00:00 (Sun)
  62224855200, #    local_end 1972-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62224873200, #    utc_start 1972-10-29 07:00:00 (Sun)
  62240601600, #      utc_end 1973-04-29 08:00:00 (Sun)
  62224851600, #  local_start 1972-10-29 01:00:00 (Sun)
  62240580000, #    local_end 1973-04-29 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62240601600, #    utc_start 1973-04-29 08:00:00 (Sun)
  62256322800, #      utc_end 1973-10-28 07:00:00 (Sun)
  62240583600, #  local_start 1973-04-29 03:00:00 (Sun)
  62256304800, #    local_end 1973-10-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62256322800, #    utc_start 1973-10-28 07:00:00 (Sun)
  62262374400, #      utc_end 1974-01-06 08:00:00 (Sun)
  62256301200, #  local_start 1973-10-28 01:00:00 (Sun)
  62262352800, #    local_end 1974-01-06 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62262374400, #    utc_start 1974-01-06 08:00:00 (Sun)
  62287772400, #      utc_end 1974-10-27 07:00:00 (Sun)
  62262356400, #  local_start 1974-01-06 03:00:00 (Sun)
  62287754400, #    local_end 1974-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62287772400, #    utc_start 1974-10-27 07:00:00 (Sun)
  62298057600, #      utc_end 1975-02-23 08:00:00 (Sun)
  62287750800, #  local_start 1974-10-27 01:00:00 (Sun)
  62298036000, #    local_end 1975-02-23 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62298057600, #    utc_start 1975-02-23 08:00:00 (Sun)
  62319222000, #      utc_end 1975-10-26 07:00:00 (Sun)
  62298039600, #  local_start 1975-02-23 03:00:00 (Sun)
  62319204000, #    local_end 1975-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62319222000, #    utc_start 1975-10-26 07:00:00 (Sun)
  62334950400, #      utc_end 1976-04-25 08:00:00 (Sun)
  62319200400, #  local_start 1975-10-26 01:00:00 (Sun)
  62334928800, #    local_end 1976-04-25 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62334950400, #    utc_start 1976-04-25 08:00:00 (Sun)
  62351276400, #      utc_end 1976-10-31 07:00:00 (Sun)
  62334932400, #  local_start 1976-04-25 03:00:00 (Sun)
  62351258400, #    local_end 1976-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62351276400, #    utc_start 1976-10-31 07:00:00 (Sun)
  62366400000, #      utc_end 1977-04-24 08:00:00 (Sun)
  62351254800, #  local_start 1976-10-31 01:00:00 (Sun)
  62366378400, #    local_end 1977-04-24 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62366400000, #    utc_start 1977-04-24 08:00:00 (Sun)
  62382726000, #      utc_end 1977-10-30 07:00:00 (Sun)
  62366382000, #  local_start 1977-04-24 03:00:00 (Sun)
  62382708000, #    local_end 1977-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62382726000, #    utc_start 1977-10-30 07:00:00 (Sun)
  62398454400, #      utc_end 1978-04-30 08:00:00 (Sun)
  62382704400, #  local_start 1977-10-30 01:00:00 (Sun)
  62398432800, #    local_end 1978-04-30 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62398454400, #    utc_start 1978-04-30 08:00:00 (Sun)
  62414175600, #      utc_end 1978-10-29 07:00:00 (Sun)
  62398436400, #  local_start 1978-04-30 03:00:00 (Sun)
  62414157600, #    local_end 1978-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62414175600, #    utc_start 1978-10-29 07:00:00 (Sun)
  62429904000, #      utc_end 1979-04-29 08:00:00 (Sun)
  62414154000, #  local_start 1978-10-29 01:00:00 (Sun)
  62429882400, #    local_end 1979-04-29 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62429904000, #    utc_start 1979-04-29 08:00:00 (Sun)
  62445625200, #      utc_end 1979-10-28 07:00:00 (Sun)
  62429886000, #  local_start 1979-04-29 03:00:00 (Sun)
  62445607200, #    local_end 1979-10-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62445625200, #    utc_start 1979-10-28 07:00:00 (Sun)
  62461353600, #      utc_end 1980-04-27 08:00:00 (Sun)
  62445603600, #  local_start 1979-10-28 01:00:00 (Sun)
  62461332000, #    local_end 1980-04-27 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62461353600, #    utc_start 1980-04-27 08:00:00 (Sun)
  62477074800, #      utc_end 1980-10-26 07:00:00 (Sun)
  62461335600, #  local_start 1980-04-27 03:00:00 (Sun)
  62477056800, #    local_end 1980-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62477074800, #    utc_start 1980-10-26 07:00:00 (Sun)
  62492803200, #      utc_end 1981-04-26 08:00:00 (Sun)
  62477053200, #  local_start 1980-10-26 01:00:00 (Sun)
  62492781600, #    local_end 1981-04-26 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62492803200, #    utc_start 1981-04-26 08:00:00 (Sun)
  62508524400, #      utc_end 1981-10-25 07:00:00 (Sun)
  62492785200, #  local_start 1981-04-26 03:00:00 (Sun)
  62508506400, #    local_end 1981-10-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62508524400, #    utc_start 1981-10-25 07:00:00 (Sun)
  62524252800, #      utc_end 1982-04-25 08:00:00 (Sun)
  62508502800, #  local_start 1981-10-25 01:00:00 (Sun)
  62524231200, #    local_end 1982-04-25 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62524252800, #    utc_start 1982-04-25 08:00:00 (Sun)
  62540578800, #      utc_end 1982-10-31 07:00:00 (Sun)
  62524234800, #  local_start 1982-04-25 03:00:00 (Sun)
  62540560800, #    local_end 1982-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62540578800, #    utc_start 1982-10-31 07:00:00 (Sun)
  62555702400, #      utc_end 1983-04-24 08:00:00 (Sun)
  62540557200, #  local_start 1982-10-31 01:00:00 (Sun)
  62555680800, #    local_end 1983-04-24 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62555702400, #    utc_start 1983-04-24 08:00:00 (Sun)
  62572028400, #      utc_end 1983-10-30 07:00:00 (Sun)
  62555684400, #  local_start 1983-04-24 03:00:00 (Sun)
  62572010400, #    local_end 1983-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62572028400, #    utc_start 1983-10-30 07:00:00 (Sun)
  62587756800, #      utc_end 1984-04-29 08:00:00 (Sun)
  62572006800, #  local_start 1983-10-30 01:00:00 (Sun)
  62587735200, #    local_end 1984-04-29 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62587756800, #    utc_start 1984-04-29 08:00:00 (Sun)
  62603478000, #      utc_end 1984-10-28 07:00:00 (Sun)
  62587738800, #  local_start 1984-04-29 03:00:00 (Sun)
  62603460000, #    local_end 1984-10-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62603478000, #    utc_start 1984-10-28 07:00:00 (Sun)
  62619206400, #      utc_end 1985-04-28 08:00:00 (Sun)
  62603456400, #  local_start 1984-10-28 01:00:00 (Sun)
  62619184800, #    local_end 1985-04-28 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62619206400, #    utc_start 1985-04-28 08:00:00 (Sun)
  62634927600, #      utc_end 1985-10-27 07:00:00 (Sun)
  62619188400, #  local_start 1985-04-28 03:00:00 (Sun)
  62634909600, #    local_end 1985-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62634927600, #    utc_start 1985-10-27 07:00:00 (Sun)
  62650656000, #      utc_end 1986-04-27 08:00:00 (Sun)
  62634906000, #  local_start 1985-10-27 01:00:00 (Sun)
  62650634400, #    local_end 1986-04-27 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62650656000, #    utc_start 1986-04-27 08:00:00 (Sun)
  62666377200, #      utc_end 1986-10-26 07:00:00 (Sun)
  62650638000, #  local_start 1986-04-27 03:00:00 (Sun)
  62666359200, #    local_end 1986-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62666377200, #    utc_start 1986-10-26 07:00:00 (Sun)
  62680291200, #      utc_end 1987-04-05 08:00:00 (Sun)
  62666355600, #  local_start 1986-10-26 01:00:00 (Sun)
  62680269600, #    local_end 1987-04-05 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62680291200, #    utc_start 1987-04-05 08:00:00 (Sun)
  62697826800, #      utc_end 1987-10-25 07:00:00 (Sun)
  62680273200, #  local_start 1987-04-05 03:00:00 (Sun)
  62697808800, #    local_end 1987-10-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62697826800, #    utc_start 1987-10-25 07:00:00 (Sun)
  62711740800, #      utc_end 1988-04-03 08:00:00 (Sun)
  62697805200, #  local_start 1987-10-25 01:00:00 (Sun)
  62711719200, #    local_end 1988-04-03 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62711740800, #    utc_start 1988-04-03 08:00:00 (Sun)
  62729881200, #      utc_end 1988-10-30 07:00:00 (Sun)
  62711722800, #  local_start 1988-04-03 03:00:00 (Sun)
  62729863200, #    local_end 1988-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62729881200, #    utc_start 1988-10-30 07:00:00 (Sun)
  62743190400, #      utc_end 1989-04-02 08:00:00 (Sun)
  62729859600, #  local_start 1988-10-30 01:00:00 (Sun)
  62743168800, #    local_end 1989-04-02 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62743190400, #    utc_start 1989-04-02 08:00:00 (Sun)
  62761330800, #      utc_end 1989-10-29 07:00:00 (Sun)
  62743172400, #  local_start 1989-04-02 03:00:00 (Sun)
  62761312800, #    local_end 1989-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62761330800, #    utc_start 1989-10-29 07:00:00 (Sun)
  62774640000, #      utc_end 1990-04-01 08:00:00 (Sun)
  62761309200, #  local_start 1989-10-29 01:00:00 (Sun)
  62774618400, #    local_end 1990-04-01 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62774640000, #    utc_start 1990-04-01 08:00:00 (Sun)
  62792780400, #      utc_end 1990-10-28 07:00:00 (Sun)
  62774622000, #  local_start 1990-04-01 03:00:00 (Sun)
  62792762400, #    local_end 1990-10-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62792780400, #    utc_start 1990-10-28 07:00:00 (Sun)
  62806694400, #      utc_end 1991-04-07 08:00:00 (Sun)
  62792758800, #  local_start 1990-10-28 01:00:00 (Sun)
  62806672800, #    local_end 1991-04-07 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62806694400, #    utc_start 1991-04-07 08:00:00 (Sun)
  62824230000, #      utc_end 1991-10-27 07:00:00 (Sun)
  62806676400, #  local_start 1991-04-07 03:00:00 (Sun)
  62824212000, #    local_end 1991-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62824230000, #    utc_start 1991-10-27 07:00:00 (Sun)
  62838144000, #      utc_end 1992-04-05 08:00:00 (Sun)
  62824208400, #  local_start 1991-10-27 01:00:00 (Sun)
  62838122400, #    local_end 1992-04-05 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62838144000, #    utc_start 1992-04-05 08:00:00 (Sun)
  62855679600, #      utc_end 1992-10-25 07:00:00 (Sun)
  62838126000, #  local_start 1992-04-05 03:00:00 (Sun)
  62855661600, #    local_end 1992-10-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62855679600, #    utc_start 1992-10-25 07:00:00 (Sun)
  62869593600, #      utc_end 1993-04-04 08:00:00 (Sun)
  62855658000, #  local_start 1992-10-25 01:00:00 (Sun)
  62869572000, #    local_end 1993-04-04 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62869593600, #    utc_start 1993-04-04 08:00:00 (Sun)
  62887734000, #      utc_end 1993-10-31 07:00:00 (Sun)
  62869575600, #  local_start 1993-04-04 03:00:00 (Sun)
  62887716000, #    local_end 1993-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62887734000, #    utc_start 1993-10-31 07:00:00 (Sun)
  62901043200, #      utc_end 1994-04-03 08:00:00 (Sun)
  62887712400, #  local_start 1993-10-31 01:00:00 (Sun)
  62901021600, #    local_end 1994-04-03 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62901043200, #    utc_start 1994-04-03 08:00:00 (Sun)
  62919183600, #      utc_end 1994-10-30 07:00:00 (Sun)
  62901025200, #  local_start 1994-04-03 03:00:00 (Sun)
  62919165600, #    local_end 1994-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62919183600, #    utc_start 1994-10-30 07:00:00 (Sun)
  62932492800, #      utc_end 1995-04-02 08:00:00 (Sun)
  62919162000, #  local_start 1994-10-30 01:00:00 (Sun)
  62932471200, #    local_end 1995-04-02 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62932492800, #    utc_start 1995-04-02 08:00:00 (Sun)
  62950633200, #      utc_end 1995-10-29 07:00:00 (Sun)
  62932474800, #  local_start 1995-04-02 03:00:00 (Sun)
  62950615200, #    local_end 1995-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62950633200, #    utc_start 1995-10-29 07:00:00 (Sun)
  62964547200, #      utc_end 1996-04-07 08:00:00 (Sun)
  62950611600, #  local_start 1995-10-29 01:00:00 (Sun)
  62964525600, #    local_end 1996-04-07 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62964547200, #    utc_start 1996-04-07 08:00:00 (Sun)
  62982082800, #      utc_end 1996-10-27 07:00:00 (Sun)
  62964529200, #  local_start 1996-04-07 03:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62982082800, #    utc_start 1996-10-27 07:00:00 (Sun)
  62995996800, #      utc_end 1997-04-06 08:00:00 (Sun)
  62982061200, #  local_start 1996-10-27 01:00:00 (Sun)
  62995975200, #    local_end 1997-04-06 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62995996800, #    utc_start 1997-04-06 08:00:00 (Sun)
  63013532400, #      utc_end 1997-10-26 07:00:00 (Sun)
  62995978800, #  local_start 1997-04-06 03:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63013532400, #    utc_start 1997-10-26 07:00:00 (Sun)
  63027446400, #      utc_end 1998-04-05 08:00:00 (Sun)
  63013510800, #  local_start 1997-10-26 01:00:00 (Sun)
  63027424800, #    local_end 1998-04-05 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63027446400, #    utc_start 1998-04-05 08:00:00 (Sun)
  63044982000, #      utc_end 1998-10-25 07:00:00 (Sun)
  63027428400, #  local_start 1998-04-05 03:00:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63044982000, #    utc_start 1998-10-25 07:00:00 (Sun)
  63058896000, #      utc_end 1999-04-04 08:00:00 (Sun)
  63044960400, #  local_start 1998-10-25 01:00:00 (Sun)
  63058874400, #    local_end 1999-04-04 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63058896000, #    utc_start 1999-04-04 08:00:00 (Sun)
  63077036400, #      utc_end 1999-10-31 07:00:00 (Sun)
  63058878000, #  local_start 1999-04-04 03:00:00 (Sun)
  63077018400, #    local_end 1999-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63077036400, #    utc_start 1999-10-31 07:00:00 (Sun)
  63090345600, #      utc_end 2000-04-02 08:00:00 (Sun)
  63077014800, #  local_start 1999-10-31 01:00:00 (Sun)
  63090324000, #    local_end 2000-04-02 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63090345600, #    utc_start 2000-04-02 08:00:00 (Sun)
  63108486000, #      utc_end 2000-10-29 07:00:00 (Sun)
  63090327600, #  local_start 2000-04-02 03:00:00 (Sun)
  63108468000, #    local_end 2000-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63108486000, #    utc_start 2000-10-29 07:00:00 (Sun)
  63121795200, #      utc_end 2001-04-01 08:00:00 (Sun)
  63108464400, #  local_start 2000-10-29 01:00:00 (Sun)
  63121773600, #    local_end 2001-04-01 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63121795200, #    utc_start 2001-04-01 08:00:00 (Sun)
  63139935600, #      utc_end 2001-10-28 07:00:00 (Sun)
  63121777200, #  local_start 2001-04-01 03:00:00 (Sun)
  63139917600, #    local_end 2001-10-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63139935600, #    utc_start 2001-10-28 07:00:00 (Sun)
  63153849600, #      utc_end 2002-04-07 08:00:00 (Sun)
  63139914000, #  local_start 2001-10-28 01:00:00 (Sun)
  63153828000, #    local_end 2002-04-07 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63153849600, #    utc_start 2002-04-07 08:00:00 (Sun)
  63171385200, #      utc_end 2002-10-27 07:00:00 (Sun)
  63153831600, #  local_start 2002-04-07 03:00:00 (Sun)
  63171367200, #    local_end 2002-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63171385200, #    utc_start 2002-10-27 07:00:00 (Sun)
  63185299200, #      utc_end 2003-04-06 08:00:00 (Sun)
  63171363600, #  local_start 2002-10-27 01:00:00 (Sun)
  63185277600, #    local_end 2003-04-06 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63185299200, #    utc_start 2003-04-06 08:00:00 (Sun)
  63202834800, #      utc_end 2003-10-26 07:00:00 (Sun)
  63185281200, #  local_start 2003-04-06 03:00:00 (Sun)
  63202816800, #    local_end 2003-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63202834800, #    utc_start 2003-10-26 07:00:00 (Sun)
  63216748800, #      utc_end 2004-04-04 08:00:00 (Sun)
  63202813200, #  local_start 2003-10-26 01:00:00 (Sun)
  63216727200, #    local_end 2004-04-04 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63216748800, #    utc_start 2004-04-04 08:00:00 (Sun)
  63234889200, #      utc_end 2004-10-31 07:00:00 (Sun)
  63216730800, #  local_start 2004-04-04 03:00:00 (Sun)
  63234871200, #    local_end 2004-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63234889200, #    utc_start 2004-10-31 07:00:00 (Sun)
  63248198400, #      utc_end 2005-04-03 08:00:00 (Sun)
  63234867600, #  local_start 2004-10-31 01:00:00 (Sun)
  63248176800, #    local_end 2005-04-03 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63248198400, #    utc_start 2005-04-03 08:00:00 (Sun)
  63266338800, #      utc_end 2005-10-30 07:00:00 (Sun)
  63248180400, #  local_start 2005-04-03 03:00:00 (Sun)
  63266320800, #    local_end 2005-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63266338800, #    utc_start 2005-10-30 07:00:00 (Sun)
  63279648000, #      utc_end 2006-04-02 08:00:00 (Sun)
  63266317200, #  local_start 2005-10-30 01:00:00 (Sun)
  63279626400, #    local_end 2006-04-02 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63279648000, #    utc_start 2006-04-02 08:00:00 (Sun)
  63297788400, #      utc_end 2006-10-29 07:00:00 (Sun)
  63279630000, #  local_start 2006-04-02 03:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63297788400, #    utc_start 2006-10-29 07:00:00 (Sun)
  63309283200, #      utc_end 2007-03-11 08:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63309261600, #    local_end 2007-03-11 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63309283200, #    utc_start 2007-03-11 08:00:00 (Sun)
  63329842800, #      utc_end 2007-11-04 07:00:00 (Sun)
  63309265200, #  local_start 2007-03-11 03:00:00 (Sun)
  63329824800, #    local_end 2007-11-04 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63329842800, #    utc_start 2007-11-04 07:00:00 (Sun)
  63340732800, #      utc_end 2008-03-09 08:00:00 (Sun)
  63329821200, #  local_start 2007-11-04 01:00:00 (Sun)
  63340711200, #    local_end 2008-03-09 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63340732800, #    utc_start 2008-03-09 08:00:00 (Sun)
  63361292400, #      utc_end 2008-11-02 07:00:00 (Sun)
  63340714800, #  local_start 2008-03-09 03:00:00 (Sun)
  63361274400, #    local_end 2008-11-02 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63361292400, #    utc_start 2008-11-02 07:00:00 (Sun)
  63372182400, #      utc_end 2009-03-08 08:00:00 (Sun)
  63361270800, #  local_start 2008-11-02 01:00:00 (Sun)
  63372160800, #    local_end 2009-03-08 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63372182400, #    utc_start 2009-03-08 08:00:00 (Sun)
  63392742000, #      utc_end 2009-11-01 07:00:00 (Sun)
  63372164400, #  local_start 2009-03-08 03:00:00 (Sun)
  63392724000, #    local_end 2009-11-01 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63392742000, #    utc_start 2009-11-01 07:00:00 (Sun)
  63404236800, #      utc_end 2010-03-14 08:00:00 (Sun)
  63392720400, #  local_start 2009-11-01 01:00:00 (Sun)
  63404215200, #    local_end 2010-03-14 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63404236800, #    utc_start 2010-03-14 08:00:00 (Sun)
  63424796400, #      utc_end 2010-11-07 07:00:00 (Sun)
  63404218800, #  local_start 2010-03-14 03:00:00 (Sun)
  63424778400, #    local_end 2010-11-07 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63424796400, #    utc_start 2010-11-07 07:00:00 (Sun)
  63435686400, #      utc_end 2011-03-13 08:00:00 (Sun)
  63424774800, #  local_start 2010-11-07 01:00:00 (Sun)
  63435664800, #    local_end 2011-03-13 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63435686400, #    utc_start 2011-03-13 08:00:00 (Sun)
  63456246000, #      utc_end 2011-11-06 07:00:00 (Sun)
  63435668400, #  local_start 2011-03-13 03:00:00 (Sun)
  63456228000, #    local_end 2011-11-06 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63456246000, #    utc_start 2011-11-06 07:00:00 (Sun)
  63467136000, #      utc_end 2012-03-11 08:00:00 (Sun)
  63456224400, #  local_start 2011-11-06 01:00:00 (Sun)
  63467114400, #    local_end 2012-03-11 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63467136000, #    utc_start 2012-03-11 08:00:00 (Sun)
  63487695600, #      utc_end 2012-11-04 07:00:00 (Sun)
  63467118000, #  local_start 2012-03-11 03:00:00 (Sun)
  63487677600, #    local_end 2012-11-04 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63487695600, #    utc_start 2012-11-04 07:00:00 (Sun)
  63498585600, #      utc_end 2013-03-10 08:00:00 (Sun)
  63487674000, #  local_start 2012-11-04 01:00:00 (Sun)
  63498564000, #    local_end 2013-03-10 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63498585600, #    utc_start 2013-03-10 08:00:00 (Sun)
  63519145200, #      utc_end 2013-11-03 07:00:00 (Sun)
  63498567600, #  local_start 2013-03-10 03:00:00 (Sun)
  63519127200, #    local_end 2013-11-03 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63519145200, #    utc_start 2013-11-03 07:00:00 (Sun)
  63530035200, #      utc_end 2014-03-09 08:00:00 (Sun)
  63519123600, #  local_start 2013-11-03 01:00:00 (Sun)
  63530013600, #    local_end 2014-03-09 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63530035200, #    utc_start 2014-03-09 08:00:00 (Sun)
  63550594800, #      utc_end 2014-11-02 07:00:00 (Sun)
  63530017200, #  local_start 2014-03-09 03:00:00 (Sun)
  63550576800, #    local_end 2014-11-02 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63550594800, #    utc_start 2014-11-02 07:00:00 (Sun)
  63561484800, #      utc_end 2015-03-08 08:00:00 (Sun)
  63550573200, #  local_start 2014-11-02 01:00:00 (Sun)
  63561463200, #    local_end 2015-03-08 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63561484800, #    utc_start 2015-03-08 08:00:00 (Sun)
  63582044400, #      utc_end 2015-11-01 07:00:00 (Sun)
  63561466800, #  local_start 2015-03-08 03:00:00 (Sun)
  63582026400, #    local_end 2015-11-01 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63582044400, #    utc_start 2015-11-01 07:00:00 (Sun)
  63593539200, #      utc_end 2016-03-13 08:00:00 (Sun)
  63582022800, #  local_start 2015-11-01 01:00:00 (Sun)
  63593517600, #    local_end 2016-03-13 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63593539200, #    utc_start 2016-03-13 08:00:00 (Sun)
  63614098800, #      utc_end 2016-11-06 07:00:00 (Sun)
  63593521200, #  local_start 2016-03-13 03:00:00 (Sun)
  63614080800, #    local_end 2016-11-06 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63614098800, #    utc_start 2016-11-06 07:00:00 (Sun)
  63624988800, #      utc_end 2017-03-12 08:00:00 (Sun)
  63614077200, #  local_start 2016-11-06 01:00:00 (Sun)
  63624967200, #    local_end 2017-03-12 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63624988800, #    utc_start 2017-03-12 08:00:00 (Sun)
  63645548400, #      utc_end 2017-11-05 07:00:00 (Sun)
  63624970800, #  local_start 2017-03-12 03:00:00 (Sun)
  63645530400, #    local_end 2017-11-05 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63645548400, #    utc_start 2017-11-05 07:00:00 (Sun)
  63656438400, #      utc_end 2018-03-11 08:00:00 (Sun)
  63645526800, #  local_start 2017-11-05 01:00:00 (Sun)
  63656416800, #    local_end 2018-03-11 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63656438400, #    utc_start 2018-03-11 08:00:00 (Sun)
  63676998000, #      utc_end 2018-11-04 07:00:00 (Sun)
  63656420400, #  local_start 2018-03-11 03:00:00 (Sun)
  63676980000, #    local_end 2018-11-04 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63676998000, #    utc_start 2018-11-04 07:00:00 (Sun)
  63687888000, #      utc_end 2019-03-10 08:00:00 (Sun)
  63676976400, #  local_start 2018-11-04 01:00:00 (Sun)
  63687866400, #    local_end 2019-03-10 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63687888000, #    utc_start 2019-03-10 08:00:00 (Sun)
  63708447600, #      utc_end 2019-11-03 07:00:00 (Sun)
  63687870000, #  local_start 2019-03-10 03:00:00 (Sun)
  63708429600, #    local_end 2019-11-03 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63708447600, #    utc_start 2019-11-03 07:00:00 (Sun)
  63719337600, #      utc_end 2020-03-08 08:00:00 (Sun)
  63708426000, #  local_start 2019-11-03 01:00:00 (Sun)
  63719316000, #    local_end 2020-03-08 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63719337600, #    utc_start 2020-03-08 08:00:00 (Sun)
  63739897200, #      utc_end 2020-11-01 07:00:00 (Sun)
  63719319600, #  local_start 2020-03-08 03:00:00 (Sun)
  63739879200, #    local_end 2020-11-01 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63739897200, #    utc_start 2020-11-01 07:00:00 (Sun)
  63751392000, #      utc_end 2021-03-14 08:00:00 (Sun)
  63739875600, #  local_start 2020-11-01 01:00:00 (Sun)
  63751370400, #    local_end 2021-03-14 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63751392000, #    utc_start 2021-03-14 08:00:00 (Sun)
  63771951600, #      utc_end 2021-11-07 07:00:00 (Sun)
  63751374000, #  local_start 2021-03-14 03:00:00 (Sun)
  63771933600, #    local_end 2021-11-07 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63771951600, #    utc_start 2021-11-07 07:00:00 (Sun)
  63782841600, #      utc_end 2022-03-13 08:00:00 (Sun)
  63771930000, #  local_start 2021-11-07 01:00:00 (Sun)
  63782820000, #    local_end 2022-03-13 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63782841600, #    utc_start 2022-03-13 08:00:00 (Sun)
  63803401200, #      utc_end 2022-11-06 07:00:00 (Sun)
  63782823600, #  local_start 2022-03-13 03:00:00 (Sun)
  63803383200, #    local_end 2022-11-06 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63803401200, #    utc_start 2022-11-06 07:00:00 (Sun)
  63814291200, #      utc_end 2023-03-12 08:00:00 (Sun)
  63803379600, #  local_start 2022-11-06 01:00:00 (Sun)
  63814269600, #    local_end 2023-03-12 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63814291200, #    utc_start 2023-03-12 08:00:00 (Sun)
  63834850800, #      utc_end 2023-11-05 07:00:00 (Sun)
  63814273200, #  local_start 2023-03-12 03:00:00 (Sun)
  63834832800, #    local_end 2023-11-05 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63834850800, #    utc_start 2023-11-05 07:00:00 (Sun)
  63845740800, #      utc_end 2024-03-10 08:00:00 (Sun)
  63834829200, #  local_start 2023-11-05 01:00:00 (Sun)
  63845719200, #    local_end 2024-03-10 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63845740800, #    utc_start 2024-03-10 08:00:00 (Sun)
  63866300400, #      utc_end 2024-11-03 07:00:00 (Sun)
  63845722800, #  local_start 2024-03-10 03:00:00 (Sun)
  63866282400, #    local_end 2024-11-03 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63866300400, #    utc_start 2024-11-03 07:00:00 (Sun)
  63877190400, #      utc_end 2025-03-09 08:00:00 (Sun)
  63866278800, #  local_start 2024-11-03 01:00:00 (Sun)
  63877168800, #    local_end 2025-03-09 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63877190400, #    utc_start 2025-03-09 08:00:00 (Sun)
  63897750000, #      utc_end 2025-11-02 07:00:00 (Sun)
  63877172400, #  local_start 2025-03-09 03:00:00 (Sun)
  63897732000, #    local_end 2025-11-02 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63897750000, #    utc_start 2025-11-02 07:00:00 (Sun)
  63908640000, #      utc_end 2026-03-08 08:00:00 (Sun)
  63897728400, #  local_start 2025-11-02 01:00:00 (Sun)
  63908618400, #    local_end 2026-03-08 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63908640000, #    utc_start 2026-03-08 08:00:00 (Sun)
  63929199600, #      utc_end 2026-11-01 07:00:00 (Sun)
  63908622000, #  local_start 2026-03-08 03:00:00 (Sun)
  63929181600, #    local_end 2026-11-01 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63929199600, #    utc_start 2026-11-01 07:00:00 (Sun)
  63940694400, #      utc_end 2027-03-14 08:00:00 (Sun)
  63929178000, #  local_start 2026-11-01 01:00:00 (Sun)
  63940672800, #    local_end 2027-03-14 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63940694400, #    utc_start 2027-03-14 08:00:00 (Sun)
  63961254000, #      utc_end 2027-11-07 07:00:00 (Sun)
  63940676400, #  local_start 2027-03-14 03:00:00 (Sun)
  63961236000, #    local_end 2027-11-07 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63961254000, #    utc_start 2027-11-07 07:00:00 (Sun)
  63972144000, #      utc_end 2028-03-12 08:00:00 (Sun)
  63961232400, #  local_start 2027-11-07 01:00:00 (Sun)
  63972122400, #    local_end 2028-03-12 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63972144000, #    utc_start 2028-03-12 08:00:00 (Sun)
  63992703600, #      utc_end 2028-11-05 07:00:00 (Sun)
  63972126000, #  local_start 2028-03-12 03:00:00 (Sun)
  63992685600, #    local_end 2028-11-05 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63992703600, #    utc_start 2028-11-05 07:00:00 (Sun)
  64003593600, #      utc_end 2029-03-11 08:00:00 (Sun)
  63992682000, #  local_start 2028-11-05 01:00:00 (Sun)
  64003572000, #    local_end 2029-03-11 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  64003593600, #    utc_start 2029-03-11 08:00:00 (Sun)
  64024153200, #      utc_end 2029-11-04 07:00:00 (Sun)
  64003575600, #  local_start 2029-03-11 03:00:00 (Sun)
  64024135200, #    local_end 2029-11-04 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  64024153200, #    utc_start 2029-11-04 07:00:00 (Sun)
  64035043200, #      utc_end 2030-03-10 08:00:00 (Sun)
  64024131600, #  local_start 2029-11-04 01:00:00 (Sun)
  64035021600, #    local_end 2030-03-10 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  64035043200, #    utc_start 2030-03-10 08:00:00 (Sun)
  64055602800, #      utc_end 2030-11-03 07:00:00 (Sun)
  64035025200, #  local_start 2030-03-10 03:00:00 (Sun)
  64055584800, #    local_end 2030-11-03 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {110}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -21600 }
  
  my $last_observance = bless( {
    'format' => 'C%sT',
    'gmtoff' => '-6:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 718067,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 718067,
      'utc_rd_secs' => 0,
      'utc_year' => 1968
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -21600,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 718067,
      'local_rd_secs' => 21600,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 718067,
      'utc_rd_secs' => 21600,
      'utc_year' => 1968
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Nov',
      'letter' => 'S',
      'name' => 'US',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Mar',
      'letter' => 'D',
      'name' => 'US',
      'offset_from_std' => 3600,
      'on' => 'Sun>=8',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_CHICAGO

    $main::fatpacked{"DateTime/TimeZone/America/Chihuahua.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_CHIHUAHUA';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Chihuahua;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Chihuahua::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60620943600, #      utc_end 1922-01-01 07:00:00 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60620918140, #    local_end 1921-12-31 23:55:40 (Sat)
  -25460,
  0,
  'LMT',
      ],
      [
  60620943600, #    utc_start 1922-01-01 07:00:00 (Sun)
  60792616800, #      utc_end 1927-06-11 06:00:00 (Sat)
  60620918400, #  local_start 1922-01-01 00:00:00 (Sun)
  60792591600, #    local_end 1927-06-10 23:00:00 (Fri)
  -25200,
  0,
  'MST',
      ],
      [
  60792616800, #    utc_start 1927-06-11 06:00:00 (Sat)
  60900876000, #      utc_end 1930-11-15 06:00:00 (Sat)
  60792595200, #  local_start 1927-06-11 00:00:00 (Sat)
  60900854400, #    local_end 1930-11-15 00:00:00 (Sat)
  -21600,
  0,
  'CST',
      ],
      [
  60900876000, #    utc_start 1930-11-15 06:00:00 (Sat)
  60915391200, #      utc_end 1931-05-02 06:00:00 (Sat)
  60900850800, #  local_start 1930-11-14 23:00:00 (Fri)
  60915366000, #    local_end 1931-05-01 23:00:00 (Fri)
  -25200,
  0,
  'MST',
      ],
      [
  60915391200, #    utc_start 1931-05-02 06:00:00 (Sat)
  60928524000, #      utc_end 1931-10-01 06:00:00 (Thu)
  60915369600, #  local_start 1931-05-02 00:00:00 (Sat)
  60928502400, #    local_end 1931-10-01 00:00:00 (Thu)
  -21600,
  0,
  'CST',
      ],
      [
  60928524000, #    utc_start 1931-10-01 06:00:00 (Thu)
  60944338800, #      utc_end 1932-04-01 07:00:00 (Fri)
  60928498800, #  local_start 1931-09-30 23:00:00 (Wed)
  60944313600, #    local_end 1932-04-01 00:00:00 (Fri)
  -25200,
  0,
  'MST',
      ],
      [
  60944338800, #    utc_start 1932-04-01 07:00:00 (Fri)
  62956159200, #      utc_end 1996-01-01 06:00:00 (Mon)
  60944317200, #  local_start 1932-04-01 01:00:00 (Fri)
  62956137600, #    local_end 1996-01-01 00:00:00 (Mon)
  -21600,
  0,
  'CST',
      ],
      [
  62956159200, #    utc_start 1996-01-01 06:00:00 (Mon)
  62964547200, #      utc_end 1996-04-07 08:00:00 (Sun)
  62956137600, #  local_start 1996-01-01 00:00:00 (Mon)
  62964525600, #    local_end 1996-04-07 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62964547200, #    utc_start 1996-04-07 08:00:00 (Sun)
  62982082800, #      utc_end 1996-10-27 07:00:00 (Sun)
  62964529200, #  local_start 1996-04-07 03:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62982082800, #    utc_start 1996-10-27 07:00:00 (Sun)
  62995996800, #      utc_end 1997-04-06 08:00:00 (Sun)
  62982061200, #  local_start 1996-10-27 01:00:00 (Sun)
  62995975200, #    local_end 1997-04-06 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62995996800, #    utc_start 1997-04-06 08:00:00 (Sun)
  63013532400, #      utc_end 1997-10-26 07:00:00 (Sun)
  62995978800, #  local_start 1997-04-06 03:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63013532400, #    utc_start 1997-10-26 07:00:00 (Sun)
  63019317600, #      utc_end 1998-01-01 06:00:00 (Thu)
  63013510800, #  local_start 1997-10-26 01:00:00 (Sun)
  63019296000, #    local_end 1998-01-01 00:00:00 (Thu)
  -21600,
  0,
  'CST',
      ],
      [
  63019317600, #    utc_start 1998-01-01 06:00:00 (Thu)
  63027450000, #      utc_end 1998-04-05 09:00:00 (Sun)
  63019296000, #  local_start 1998-01-01 00:00:00 (Thu)
  63027428400, #    local_end 1998-04-05 03:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63027450000, #    utc_start 1998-04-05 09:00:00 (Sun)
  63044985600, #      utc_end 1998-10-25 08:00:00 (Sun)
  63027428400, #  local_start 1998-04-05 03:00:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63044985600, #    utc_start 1998-10-25 08:00:00 (Sun)
  63058899600, #      utc_end 1999-04-04 09:00:00 (Sun)
  63044960400, #  local_start 1998-10-25 01:00:00 (Sun)
  63058874400, #    local_end 1999-04-04 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63058899600, #    utc_start 1999-04-04 09:00:00 (Sun)
  63077040000, #      utc_end 1999-10-31 08:00:00 (Sun)
  63058878000, #  local_start 1999-04-04 03:00:00 (Sun)
  63077018400, #    local_end 1999-10-31 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63077040000, #    utc_start 1999-10-31 08:00:00 (Sun)
  63090349200, #      utc_end 2000-04-02 09:00:00 (Sun)
  63077014800, #  local_start 1999-10-31 01:00:00 (Sun)
  63090324000, #    local_end 2000-04-02 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63090349200, #    utc_start 2000-04-02 09:00:00 (Sun)
  63108489600, #      utc_end 2000-10-29 08:00:00 (Sun)
  63090327600, #  local_start 2000-04-02 03:00:00 (Sun)
  63108468000, #    local_end 2000-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63108489600, #    utc_start 2000-10-29 08:00:00 (Sun)
  63124822800, #      utc_end 2001-05-06 09:00:00 (Sun)
  63108464400, #  local_start 2000-10-29 01:00:00 (Sun)
  63124797600, #    local_end 2001-05-06 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63124822800, #    utc_start 2001-05-06 09:00:00 (Sun)
  63137520000, #      utc_end 2001-09-30 08:00:00 (Sun)
  63124801200, #  local_start 2001-05-06 03:00:00 (Sun)
  63137498400, #    local_end 2001-09-30 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63137520000, #    utc_start 2001-09-30 08:00:00 (Sun)
  63153853200, #      utc_end 2002-04-07 09:00:00 (Sun)
  63137494800, #  local_start 2001-09-30 01:00:00 (Sun)
  63153828000, #    local_end 2002-04-07 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63153853200, #    utc_start 2002-04-07 09:00:00 (Sun)
  63171388800, #      utc_end 2002-10-27 08:00:00 (Sun)
  63153831600, #  local_start 2002-04-07 03:00:00 (Sun)
  63171367200, #    local_end 2002-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63171388800, #    utc_start 2002-10-27 08:00:00 (Sun)
  63185302800, #      utc_end 2003-04-06 09:00:00 (Sun)
  63171363600, #  local_start 2002-10-27 01:00:00 (Sun)
  63185277600, #    local_end 2003-04-06 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63185302800, #    utc_start 2003-04-06 09:00:00 (Sun)
  63202838400, #      utc_end 2003-10-26 08:00:00 (Sun)
  63185281200, #  local_start 2003-04-06 03:00:00 (Sun)
  63202816800, #    local_end 2003-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63202838400, #    utc_start 2003-10-26 08:00:00 (Sun)
  63216752400, #      utc_end 2004-04-04 09:00:00 (Sun)
  63202813200, #  local_start 2003-10-26 01:00:00 (Sun)
  63216727200, #    local_end 2004-04-04 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63216752400, #    utc_start 2004-04-04 09:00:00 (Sun)
  63234892800, #      utc_end 2004-10-31 08:00:00 (Sun)
  63216730800, #  local_start 2004-04-04 03:00:00 (Sun)
  63234871200, #    local_end 2004-10-31 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63234892800, #    utc_start 2004-10-31 08:00:00 (Sun)
  63248202000, #      utc_end 2005-04-03 09:00:00 (Sun)
  63234867600, #  local_start 2004-10-31 01:00:00 (Sun)
  63248176800, #    local_end 2005-04-03 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63248202000, #    utc_start 2005-04-03 09:00:00 (Sun)
  63266342400, #      utc_end 2005-10-30 08:00:00 (Sun)
  63248180400, #  local_start 2005-04-03 03:00:00 (Sun)
  63266320800, #    local_end 2005-10-30 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63266342400, #    utc_start 2005-10-30 08:00:00 (Sun)
  63279651600, #      utc_end 2006-04-02 09:00:00 (Sun)
  63266317200, #  local_start 2005-10-30 01:00:00 (Sun)
  63279626400, #    local_end 2006-04-02 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63279651600, #    utc_start 2006-04-02 09:00:00 (Sun)
  63297792000, #      utc_end 2006-10-29 08:00:00 (Sun)
  63279630000, #  local_start 2006-04-02 03:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63297792000, #    utc_start 2006-10-29 08:00:00 (Sun)
  63311101200, #      utc_end 2007-04-01 09:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63311076000, #    local_end 2007-04-01 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63311101200, #    utc_start 2007-04-01 09:00:00 (Sun)
  63329241600, #      utc_end 2007-10-28 08:00:00 (Sun)
  63311079600, #  local_start 2007-04-01 03:00:00 (Sun)
  63329220000, #    local_end 2007-10-28 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63329241600, #    utc_start 2007-10-28 08:00:00 (Sun)
  63343155600, #      utc_end 2008-04-06 09:00:00 (Sun)
  63329216400, #  local_start 2007-10-28 01:00:00 (Sun)
  63343130400, #    local_end 2008-04-06 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63343155600, #    utc_start 2008-04-06 09:00:00 (Sun)
  63360691200, #      utc_end 2008-10-26 08:00:00 (Sun)
  63343134000, #  local_start 2008-04-06 03:00:00 (Sun)
  63360669600, #    local_end 2008-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63360691200, #    utc_start 2008-10-26 08:00:00 (Sun)
  63374605200, #      utc_end 2009-04-05 09:00:00 (Sun)
  63360666000, #  local_start 2008-10-26 01:00:00 (Sun)
  63374580000, #    local_end 2009-04-05 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63374605200, #    utc_start 2009-04-05 09:00:00 (Sun)
  63392140800, #      utc_end 2009-10-25 08:00:00 (Sun)
  63374583600, #  local_start 2009-04-05 03:00:00 (Sun)
  63392119200, #    local_end 2009-10-25 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63392140800, #    utc_start 2009-10-25 08:00:00 (Sun)
  63406054800, #      utc_end 2010-04-04 09:00:00 (Sun)
  63392115600, #  local_start 2009-10-25 01:00:00 (Sun)
  63406029600, #    local_end 2010-04-04 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63406054800, #    utc_start 2010-04-04 09:00:00 (Sun)
  63424195200, #      utc_end 2010-10-31 08:00:00 (Sun)
  63406033200, #  local_start 2010-04-04 03:00:00 (Sun)
  63424173600, #    local_end 2010-10-31 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63424195200, #    utc_start 2010-10-31 08:00:00 (Sun)
  63437504400, #      utc_end 2011-04-03 09:00:00 (Sun)
  63424170000, #  local_start 2010-10-31 01:00:00 (Sun)
  63437479200, #    local_end 2011-04-03 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63437504400, #    utc_start 2011-04-03 09:00:00 (Sun)
  63455644800, #      utc_end 2011-10-30 08:00:00 (Sun)
  63437482800, #  local_start 2011-04-03 03:00:00 (Sun)
  63455623200, #    local_end 2011-10-30 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63455644800, #    utc_start 2011-10-30 08:00:00 (Sun)
  63468954000, #      utc_end 2012-04-01 09:00:00 (Sun)
  63455619600, #  local_start 2011-10-30 01:00:00 (Sun)
  63468928800, #    local_end 2012-04-01 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63468954000, #    utc_start 2012-04-01 09:00:00 (Sun)
  63487094400, #      utc_end 2012-10-28 08:00:00 (Sun)
  63468932400, #  local_start 2012-04-01 03:00:00 (Sun)
  63487072800, #    local_end 2012-10-28 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63487094400, #    utc_start 2012-10-28 08:00:00 (Sun)
  63501008400, #      utc_end 2013-04-07 09:00:00 (Sun)
  63487069200, #  local_start 2012-10-28 01:00:00 (Sun)
  63500983200, #    local_end 2013-04-07 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63501008400, #    utc_start 2013-04-07 09:00:00 (Sun)
  63518544000, #      utc_end 2013-10-27 08:00:00 (Sun)
  63500986800, #  local_start 2013-04-07 03:00:00 (Sun)
  63518522400, #    local_end 2013-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63518544000, #    utc_start 2013-10-27 08:00:00 (Sun)
  63532458000, #      utc_end 2014-04-06 09:00:00 (Sun)
  63518518800, #  local_start 2013-10-27 01:00:00 (Sun)
  63532432800, #    local_end 2014-04-06 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63532458000, #    utc_start 2014-04-06 09:00:00 (Sun)
  63549993600, #      utc_end 2014-10-26 08:00:00 (Sun)
  63532436400, #  local_start 2014-04-06 03:00:00 (Sun)
  63549972000, #    local_end 2014-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63549993600, #    utc_start 2014-10-26 08:00:00 (Sun)
  63563907600, #      utc_end 2015-04-05 09:00:00 (Sun)
  63549968400, #  local_start 2014-10-26 01:00:00 (Sun)
  63563882400, #    local_end 2015-04-05 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63563907600, #    utc_start 2015-04-05 09:00:00 (Sun)
  63581443200, #      utc_end 2015-10-25 08:00:00 (Sun)
  63563886000, #  local_start 2015-04-05 03:00:00 (Sun)
  63581421600, #    local_end 2015-10-25 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63581443200, #    utc_start 2015-10-25 08:00:00 (Sun)
  63595357200, #      utc_end 2016-04-03 09:00:00 (Sun)
  63581418000, #  local_start 2015-10-25 01:00:00 (Sun)
  63595332000, #    local_end 2016-04-03 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63595357200, #    utc_start 2016-04-03 09:00:00 (Sun)
  63613497600, #      utc_end 2016-10-30 08:00:00 (Sun)
  63595335600, #  local_start 2016-04-03 03:00:00 (Sun)
  63613476000, #    local_end 2016-10-30 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63613497600, #    utc_start 2016-10-30 08:00:00 (Sun)
  63626806800, #      utc_end 2017-04-02 09:00:00 (Sun)
  63613472400, #  local_start 2016-10-30 01:00:00 (Sun)
  63626781600, #    local_end 2017-04-02 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63626806800, #    utc_start 2017-04-02 09:00:00 (Sun)
  63644947200, #      utc_end 2017-10-29 08:00:00 (Sun)
  63626785200, #  local_start 2017-04-02 03:00:00 (Sun)
  63644925600, #    local_end 2017-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63644947200, #    utc_start 2017-10-29 08:00:00 (Sun)
  63658256400, #      utc_end 2018-04-01 09:00:00 (Sun)
  63644922000, #  local_start 2017-10-29 01:00:00 (Sun)
  63658231200, #    local_end 2018-04-01 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63658256400, #    utc_start 2018-04-01 09:00:00 (Sun)
  63676396800, #      utc_end 2018-10-28 08:00:00 (Sun)
  63658234800, #  local_start 2018-04-01 03:00:00 (Sun)
  63676375200, #    local_end 2018-10-28 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63676396800, #    utc_start 2018-10-28 08:00:00 (Sun)
  63690310800, #      utc_end 2019-04-07 09:00:00 (Sun)
  63676371600, #  local_start 2018-10-28 01:00:00 (Sun)
  63690285600, #    local_end 2019-04-07 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63690310800, #    utc_start 2019-04-07 09:00:00 (Sun)
  63707846400, #      utc_end 2019-10-27 08:00:00 (Sun)
  63690289200, #  local_start 2019-04-07 03:00:00 (Sun)
  63707824800, #    local_end 2019-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63707846400, #    utc_start 2019-10-27 08:00:00 (Sun)
  63721760400, #      utc_end 2020-04-05 09:00:00 (Sun)
  63707821200, #  local_start 2019-10-27 01:00:00 (Sun)
  63721735200, #    local_end 2020-04-05 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63721760400, #    utc_start 2020-04-05 09:00:00 (Sun)
  63739296000, #      utc_end 2020-10-25 08:00:00 (Sun)
  63721738800, #  local_start 2020-04-05 03:00:00 (Sun)
  63739274400, #    local_end 2020-10-25 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63739296000, #    utc_start 2020-10-25 08:00:00 (Sun)
  63753210000, #      utc_end 2021-04-04 09:00:00 (Sun)
  63739270800, #  local_start 2020-10-25 01:00:00 (Sun)
  63753184800, #    local_end 2021-04-04 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63753210000, #    utc_start 2021-04-04 09:00:00 (Sun)
  63771350400, #      utc_end 2021-10-31 08:00:00 (Sun)
  63753188400, #  local_start 2021-04-04 03:00:00 (Sun)
  63771328800, #    local_end 2021-10-31 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63771350400, #    utc_start 2021-10-31 08:00:00 (Sun)
  63784659600, #      utc_end 2022-04-03 09:00:00 (Sun)
  63771325200, #  local_start 2021-10-31 01:00:00 (Sun)
  63784634400, #    local_end 2022-04-03 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63784659600, #    utc_start 2022-04-03 09:00:00 (Sun)
  63802800000, #      utc_end 2022-10-30 08:00:00 (Sun)
  63784638000, #  local_start 2022-04-03 03:00:00 (Sun)
  63802778400, #    local_end 2022-10-30 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63802800000, #    utc_start 2022-10-30 08:00:00 (Sun)
  63816109200, #      utc_end 2023-04-02 09:00:00 (Sun)
  63802774800, #  local_start 2022-10-30 01:00:00 (Sun)
  63816084000, #    local_end 2023-04-02 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63816109200, #    utc_start 2023-04-02 09:00:00 (Sun)
  63834249600, #      utc_end 2023-10-29 08:00:00 (Sun)
  63816087600, #  local_start 2023-04-02 03:00:00 (Sun)
  63834228000, #    local_end 2023-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63834249600, #    utc_start 2023-10-29 08:00:00 (Sun)
  63848163600, #      utc_end 2024-04-07 09:00:00 (Sun)
  63834224400, #  local_start 2023-10-29 01:00:00 (Sun)
  63848138400, #    local_end 2024-04-07 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63848163600, #    utc_start 2024-04-07 09:00:00 (Sun)
  63865699200, #      utc_end 2024-10-27 08:00:00 (Sun)
  63848142000, #  local_start 2024-04-07 03:00:00 (Sun)
  63865677600, #    local_end 2024-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63865699200, #    utc_start 2024-10-27 08:00:00 (Sun)
  63879613200, #      utc_end 2025-04-06 09:00:00 (Sun)
  63865674000, #  local_start 2024-10-27 01:00:00 (Sun)
  63879588000, #    local_end 2025-04-06 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63879613200, #    utc_start 2025-04-06 09:00:00 (Sun)
  63897148800, #      utc_end 2025-10-26 08:00:00 (Sun)
  63879591600, #  local_start 2025-04-06 03:00:00 (Sun)
  63897127200, #    local_end 2025-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63897148800, #    utc_start 2025-10-26 08:00:00 (Sun)
  63911062800, #      utc_end 2026-04-05 09:00:00 (Sun)
  63897123600, #  local_start 2025-10-26 01:00:00 (Sun)
  63911037600, #    local_end 2026-04-05 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63911062800, #    utc_start 2026-04-05 09:00:00 (Sun)
  63928598400, #      utc_end 2026-10-25 08:00:00 (Sun)
  63911041200, #  local_start 2026-04-05 03:00:00 (Sun)
  63928576800, #    local_end 2026-10-25 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63928598400, #    utc_start 2026-10-25 08:00:00 (Sun)
  63942512400, #      utc_end 2027-04-04 09:00:00 (Sun)
  63928573200, #  local_start 2026-10-25 01:00:00 (Sun)
  63942487200, #    local_end 2027-04-04 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63942512400, #    utc_start 2027-04-04 09:00:00 (Sun)
  63960652800, #      utc_end 2027-10-31 08:00:00 (Sun)
  63942490800, #  local_start 2027-04-04 03:00:00 (Sun)
  63960631200, #    local_end 2027-10-31 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63960652800, #    utc_start 2027-10-31 08:00:00 (Sun)
  63973962000, #      utc_end 2028-04-02 09:00:00 (Sun)
  63960627600, #  local_start 2027-10-31 01:00:00 (Sun)
  63973936800, #    local_end 2028-04-02 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63973962000, #    utc_start 2028-04-02 09:00:00 (Sun)
  63992102400, #      utc_end 2028-10-29 08:00:00 (Sun)
  63973940400, #  local_start 2028-04-02 03:00:00 (Sun)
  63992080800, #    local_end 2028-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63992102400, #    utc_start 2028-10-29 08:00:00 (Sun)
  64005411600, #      utc_end 2029-04-01 09:00:00 (Sun)
  63992077200, #  local_start 2028-10-29 01:00:00 (Sun)
  64005386400, #    local_end 2029-04-01 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  64005411600, #    utc_start 2029-04-01 09:00:00 (Sun)
  64023552000, #      utc_end 2029-10-28 08:00:00 (Sun)
  64005390000, #  local_start 2029-04-01 03:00:00 (Sun)
  64023530400, #    local_end 2029-10-28 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  64023552000, #    utc_start 2029-10-28 08:00:00 (Sun)
  64037466000, #      utc_end 2030-04-07 09:00:00 (Sun)
  64023526800, #  local_start 2029-10-28 01:00:00 (Sun)
  64037440800, #    local_end 2030-04-07 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  64037466000, #    utc_start 2030-04-07 09:00:00 (Sun)
  64055001600, #      utc_end 2030-10-27 08:00:00 (Sun)
  64037444400, #  local_start 2030-04-07 03:00:00 (Sun)
  64054980000, #    local_end 2030-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {35}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -25200 }
  
  my $last_observance = bless( {
    'format' => 'M%sT',
    'gmtoff' => '-7:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 729484,
      'local_rd_secs' => 10800,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 729484,
      'utc_rd_secs' => 10800,
      'utc_year' => 1999
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -25200,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 729484,
      'local_rd_secs' => 32400,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 729484,
      'utc_rd_secs' => 32400,
      'utc_year' => 1999
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2002',
      'in' => 'Apr',
      'letter' => 'D',
      'name' => 'Mexico',
      'offset_from_std' => 3600,
      'on' => 'Sun>=1',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2002',
      'in' => 'Oct',
      'letter' => 'S',
      'name' => 'Mexico',
      'offset_from_std' => 0,
      'on' => 'lastSun',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_CHIHUAHUA

    $main::fatpacked{"DateTime/TimeZone/America/Costa_Rica.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_COSTA_RICA';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Costa_Rica;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Costa_Rica::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59611181773, #      utc_end 1890-01-01 05:36:13 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59611161600, #    local_end 1890-01-01 00:00:00 (Wed)
  -20173,
  0,
  'LMT',
      ],
      [
  59611181773, #    utc_start 1890-01-01 05:36:13 (Wed)
  60590612173, #      utc_end 1921-01-15 05:36:13 (Sat)
  59611161600, #  local_start 1890-01-01 00:00:00 (Wed)
  60590592000, #    local_end 1921-01-15 00:00:00 (Sat)
  -20173,
  0,
  'SJMT',
      ],
      [
  60590612173, #    utc_start 1921-01-15 05:36:13 (Sat)
  62424453600, #      utc_end 1979-02-25 06:00:00 (Sun)
  60590590573, #  local_start 1921-01-14 23:36:13 (Fri)
  62424432000, #    local_end 1979-02-25 00:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62424453600, #    utc_start 1979-02-25 06:00:00 (Sun)
  62432917200, #      utc_end 1979-06-03 05:00:00 (Sun)
  62424435600, #  local_start 1979-02-25 01:00:00 (Sun)
  62432899200, #    local_end 1979-06-03 00:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62432917200, #    utc_start 1979-06-03 05:00:00 (Sun)
  62455903200, #      utc_end 1980-02-24 06:00:00 (Sun)
  62432895600, #  local_start 1979-06-02 23:00:00 (Sat)
  62455881600, #    local_end 1980-02-24 00:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62455903200, #    utc_start 1980-02-24 06:00:00 (Sun)
  62464366800, #      utc_end 1980-06-01 05:00:00 (Sun)
  62455885200, #  local_start 1980-02-24 01:00:00 (Sun)
  62464348800, #    local_end 1980-06-01 00:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62464366800, #    utc_start 1980-06-01 05:00:00 (Sun)
  62799948000, #      utc_end 1991-01-19 06:00:00 (Sat)
  62464345200, #  local_start 1980-05-31 23:00:00 (Sat)
  62799926400, #    local_end 1991-01-19 00:00:00 (Sat)
  -21600,
  0,
  'CST',
      ],
      [
  62799948000, #    utc_start 1991-01-19 06:00:00 (Sat)
  62814027600, #      utc_end 1991-07-01 05:00:00 (Mon)
  62799930000, #  local_start 1991-01-19 01:00:00 (Sat)
  62814009600, #    local_end 1991-07-01 00:00:00 (Mon)
  -18000,
  1,
  'CDT',
      ],
      [
  62814027600, #    utc_start 1991-07-01 05:00:00 (Mon)
  62831397600, #      utc_end 1992-01-18 06:00:00 (Sat)
  62814006000, #  local_start 1991-06-30 23:00:00 (Sun)
  62831376000, #    local_end 1992-01-18 00:00:00 (Sat)
  -21600,
  0,
  'CST',
      ],
      [
  62831397600, #    utc_start 1992-01-18 06:00:00 (Sat)
  62836318800, #      utc_end 1992-03-15 05:00:00 (Sun)
  62831379600, #  local_start 1992-01-18 01:00:00 (Sat)
  62836300800, #    local_end 1992-03-15 00:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62836318800, #    utc_start 1992-03-15 05:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #      utc_end
  62836297200, #  local_start 1992-03-14 23:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #    local_end
  -21600,
  0,
  'CST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {4}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_COSTA_RICA

    $main::fatpacked{"DateTime/TimeZone/America/Creston.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_CRESTON';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Creston;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Creston::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59421800764, #      utc_end 1884-01-01 07:46:04 (Tue)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59421772800, #    local_end 1884-01-01 00:00:00 (Tue)
  -27964,
  0,
  'LMT',
      ],
      [
  59421800764, #    utc_start 1884-01-01 07:46:04 (Tue)
  60455228400, #      utc_end 1916-10-01 07:00:00 (Sun)
  59421775564, #  local_start 1884-01-01 00:46:04 (Tue)
  60455203200, #    local_end 1916-10-01 00:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  60455228400, #    utc_start 1916-10-01 07:00:00 (Sun)
  60507849600, #      utc_end 1918-06-02 08:00:00 (Sun)
  60455199600, #  local_start 1916-09-30 23:00:00 (Sat)
  60507820800, #    local_end 1918-06-02 00:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  60507849600, #    utc_start 1918-06-02 08:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #      utc_end
  60507824400, #  local_start 1918-06-02 01:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  -25200,
  0,
  'MST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_CRESTON

    $main::fatpacked{"DateTime/TimeZone/America/Cuiaba.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_CUIABA';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/southamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Cuiaba;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Cuiaba::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60368471060, #      utc_end 1914-01-01 03:44:20 (Thu)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60368457600, #    local_end 1914-01-01 00:00:00 (Thu)
  -13460,
  0,
  'LMT',
      ],
      [
  60368471060, #    utc_start 1914-01-01 03:44:20 (Thu)
  60928729200, #      utc_end 1931-10-03 15:00:00 (Sat)
  60368456660, #  local_start 1913-12-31 23:44:20 (Wed)
  60928714800, #    local_end 1931-10-03 11:00:00 (Sat)
  -14400,
  0,
  '-04',
      ],
      [
  60928729200, #    utc_start 1931-10-03 15:00:00 (Sat)
  60944324400, #      utc_end 1932-04-01 03:00:00 (Fri)
  60928718400, #  local_start 1931-10-03 12:00:00 (Sat)
  60944313600, #    local_end 1932-04-01 00:00:00 (Fri)
  -10800,
  1,
  '-03',
      ],
      [
  60944324400, #    utc_start 1932-04-01 03:00:00 (Fri)
  60960312000, #      utc_end 1932-10-03 04:00:00 (Mon)
  60944310000, #  local_start 1932-03-31 23:00:00 (Thu)
  60960297600, #    local_end 1932-10-03 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  60960312000, #    utc_start 1932-10-03 04:00:00 (Mon)
  60975860400, #      utc_end 1933-04-01 03:00:00 (Sat)
  60960301200, #  local_start 1932-10-03 01:00:00 (Mon)
  60975849600, #    local_end 1933-04-01 00:00:00 (Sat)
  -10800,
  1,
  '-03',
      ],
      [
  60975860400, #    utc_start 1933-04-01 03:00:00 (Sat)
  61501867200, #      utc_end 1949-12-01 04:00:00 (Thu)
  60975846000, #  local_start 1933-03-31 23:00:00 (Fri)
  61501852800, #    local_end 1949-12-01 00:00:00 (Thu)
  -14400,
  0,
  '-04',
      ],
      [
  61501867200, #    utc_start 1949-12-01 04:00:00 (Thu)
  61513617600, #      utc_end 1950-04-16 04:00:00 (Sun)
  61501856400, #  local_start 1949-12-01 01:00:00 (Thu)
  61513606800, #    local_end 1950-04-16 01:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61513617600, #    utc_start 1950-04-16 04:00:00 (Sun)
  61533403200, #      utc_end 1950-12-01 04:00:00 (Fri)
  61513603200, #  local_start 1950-04-16 00:00:00 (Sun)
  61533388800, #    local_end 1950-12-01 00:00:00 (Fri)
  -14400,
  0,
  '-04',
      ],
      [
  61533403200, #    utc_start 1950-12-01 04:00:00 (Fri)
  61543854000, #      utc_end 1951-04-01 03:00:00 (Sun)
  61533392400, #  local_start 1950-12-01 01:00:00 (Fri)
  61543843200, #    local_end 1951-04-01 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61543854000, #    utc_start 1951-04-01 03:00:00 (Sun)
  61564939200, #      utc_end 1951-12-01 04:00:00 (Sat)
  61543839600, #  local_start 1951-03-31 23:00:00 (Sat)
  61564924800, #    local_end 1951-12-01 00:00:00 (Sat)
  -14400,
  0,
  '-04',
      ],
      [
  61564939200, #    utc_start 1951-12-01 04:00:00 (Sat)
  61575476400, #      utc_end 1952-04-01 03:00:00 (Tue)
  61564928400, #  local_start 1951-12-01 01:00:00 (Sat)
  61575465600, #    local_end 1952-04-01 00:00:00 (Tue)
  -10800,
  1,
  '-03',
      ],
      [
  61575476400, #    utc_start 1952-04-01 03:00:00 (Tue)
  61596561600, #      utc_end 1952-12-01 04:00:00 (Mon)
  61575462000, #  local_start 1952-03-31 23:00:00 (Mon)
  61596547200, #    local_end 1952-12-01 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  61596561600, #    utc_start 1952-12-01 04:00:00 (Mon)
  61604334000, #      utc_end 1953-03-01 03:00:00 (Sun)
  61596550800, #  local_start 1952-12-01 01:00:00 (Mon)
  61604323200, #    local_end 1953-03-01 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61604334000, #    utc_start 1953-03-01 03:00:00 (Sun)
  61944321600, #      utc_end 1963-12-09 04:00:00 (Mon)
  61604319600, #  local_start 1953-02-28 23:00:00 (Sat)
  61944307200, #    local_end 1963-12-09 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  61944321600, #    utc_start 1963-12-09 04:00:00 (Mon)
  61951489200, #      utc_end 1964-03-01 03:00:00 (Sun)
  61944310800, #  local_start 1963-12-09 01:00:00 (Mon)
  61951478400, #    local_end 1964-03-01 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61951489200, #    utc_start 1964-03-01 03:00:00 (Sun)
  61980523200, #      utc_end 1965-01-31 04:00:00 (Sun)
  61951474800, #  local_start 1964-02-29 23:00:00 (Sat)
  61980508800, #    local_end 1965-01-31 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  61980523200, #    utc_start 1965-01-31 04:00:00 (Sun)
  61985617200, #      utc_end 1965-03-31 03:00:00 (Wed)
  61980512400, #  local_start 1965-01-31 01:00:00 (Sun)
  61985606400, #    local_end 1965-03-31 00:00:00 (Wed)
  -10800,
  1,
  '-03',
      ],
      [
  61985617200, #    utc_start 1965-03-31 03:00:00 (Wed)
  62006788800, #      utc_end 1965-12-01 04:00:00 (Wed)
  61985602800, #  local_start 1965-03-30 23:00:00 (Tue)
  62006774400, #    local_end 1965-12-01 00:00:00 (Wed)
  -14400,
  0,
  '-04',
      ],
      [
  62006788800, #    utc_start 1965-12-01 04:00:00 (Wed)
  62014561200, #      utc_end 1966-03-01 03:00:00 (Tue)
  62006778000, #  local_start 1965-12-01 01:00:00 (Wed)
  62014550400, #    local_end 1966-03-01 00:00:00 (Tue)
  -10800,
  1,
  '-03',
      ],
      [
  62014561200, #    utc_start 1966-03-01 03:00:00 (Tue)
  62035732800, #      utc_end 1966-11-01 04:00:00 (Tue)
  62014546800, #  local_start 1966-02-28 23:00:00 (Mon)
  62035718400, #    local_end 1966-11-01 00:00:00 (Tue)
  -14400,
  0,
  '-04',
      ],
      [
  62035732800, #    utc_start 1966-11-01 04:00:00 (Tue)
  62046097200, #      utc_end 1967-03-01 03:00:00 (Wed)
  62035722000, #  local_start 1966-11-01 01:00:00 (Tue)
  62046086400, #    local_end 1967-03-01 00:00:00 (Wed)
  -10800,
  1,
  '-03',
      ],
      [
  62046097200, #    utc_start 1967-03-01 03:00:00 (Wed)
  62067268800, #      utc_end 1967-11-01 04:00:00 (Wed)
  62046082800, #  local_start 1967-02-28 23:00:00 (Tue)
  62067254400, #    local_end 1967-11-01 00:00:00 (Wed)
  -14400,
  0,
  '-04',
      ],
      [
  62067268800, #    utc_start 1967-11-01 04:00:00 (Wed)
  62077719600, #      utc_end 1968-03-01 03:00:00 (Fri)
  62067258000, #  local_start 1967-11-01 01:00:00 (Wed)
  62077708800, #    local_end 1968-03-01 00:00:00 (Fri)
  -10800,
  1,
  '-03',
      ],
      [
  62077719600, #    utc_start 1968-03-01 03:00:00 (Fri)
  62635435200, #      utc_end 1985-11-02 04:00:00 (Sat)
  62077705200, #  local_start 1968-02-29 23:00:00 (Thu)
  62635420800, #    local_end 1985-11-02 00:00:00 (Sat)
  -14400,
  0,
  '-04',
      ],
      [
  62635435200, #    utc_start 1985-11-02 04:00:00 (Sat)
  62646922800, #      utc_end 1986-03-15 03:00:00 (Sat)
  62635424400, #  local_start 1985-11-02 01:00:00 (Sat)
  62646912000, #    local_end 1986-03-15 00:00:00 (Sat)
  -10800,
  1,
  '-03',
      ],
      [
  62646922800, #    utc_start 1986-03-15 03:00:00 (Sat)
  62666280000, #      utc_end 1986-10-25 04:00:00 (Sat)
  62646908400, #  local_start 1986-03-14 23:00:00 (Fri)
  62666265600, #    local_end 1986-10-25 00:00:00 (Sat)
  -14400,
  0,
  '-04',
      ],
      [
  62666280000, #    utc_start 1986-10-25 04:00:00 (Sat)
  62675953200, #      utc_end 1987-02-14 03:00:00 (Sat)
  62666269200, #  local_start 1986-10-25 01:00:00 (Sat)
  62675942400, #    local_end 1987-02-14 00:00:00 (Sat)
  -10800,
  1,
  '-03',
      ],
      [
  62675953200, #    utc_start 1987-02-14 03:00:00 (Sat)
  62697816000, #      utc_end 1987-10-25 04:00:00 (Sun)
  62675938800, #  local_start 1987-02-13 23:00:00 (Fri)
  62697801600, #    local_end 1987-10-25 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62697816000, #    utc_start 1987-10-25 04:00:00 (Sun)
  62706884400, #      utc_end 1988-02-07 03:00:00 (Sun)
  62697805200, #  local_start 1987-10-25 01:00:00 (Sun)
  62706873600, #    local_end 1988-02-07 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62706884400, #    utc_start 1988-02-07 03:00:00 (Sun)
  62728660800, #      utc_end 1988-10-16 04:00:00 (Sun)
  62706870000, #  local_start 1988-02-06 23:00:00 (Sat)
  62728646400, #    local_end 1988-10-16 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62728660800, #    utc_start 1988-10-16 04:00:00 (Sun)
  62737729200, #      utc_end 1989-01-29 03:00:00 (Sun)
  62728650000, #  local_start 1988-10-16 01:00:00 (Sun)
  62737718400, #    local_end 1989-01-29 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62737729200, #    utc_start 1989-01-29 03:00:00 (Sun)
  62760110400, #      utc_end 1989-10-15 04:00:00 (Sun)
  62737714800, #  local_start 1989-01-28 23:00:00 (Sat)
  62760096000, #    local_end 1989-10-15 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62760110400, #    utc_start 1989-10-15 04:00:00 (Sun)
  62770388400, #      utc_end 1990-02-11 03:00:00 (Sun)
  62760099600, #  local_start 1989-10-15 01:00:00 (Sun)
  62770377600, #    local_end 1990-02-11 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62770388400, #    utc_start 1990-02-11 03:00:00 (Sun)
  62792164800, #      utc_end 1990-10-21 04:00:00 (Sun)
  62770374000, #  local_start 1990-02-10 23:00:00 (Sat)
  62792150400, #    local_end 1990-10-21 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62792164800, #    utc_start 1990-10-21 04:00:00 (Sun)
  62802442800, #      utc_end 1991-02-17 03:00:00 (Sun)
  62792154000, #  local_start 1990-10-21 01:00:00 (Sun)
  62802432000, #    local_end 1991-02-17 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62802442800, #    utc_start 1991-02-17 03:00:00 (Sun)
  62823614400, #      utc_end 1991-10-20 04:00:00 (Sun)
  62802428400, #  local_start 1991-02-16 23:00:00 (Sat)
  62823600000, #    local_end 1991-10-20 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62823614400, #    utc_start 1991-10-20 04:00:00 (Sun)
  62833287600, #      utc_end 1992-02-09 03:00:00 (Sun)
  62823603600, #  local_start 1991-10-20 01:00:00 (Sun)
  62833276800, #    local_end 1992-02-09 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62833287600, #    utc_start 1992-02-09 03:00:00 (Sun)
  62855668800, #      utc_end 1992-10-25 04:00:00 (Sun)
  62833273200, #  local_start 1992-02-08 23:00:00 (Sat)
  62855654400, #    local_end 1992-10-25 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62855668800, #    utc_start 1992-10-25 04:00:00 (Sun)
  62864132400, #      utc_end 1993-01-31 03:00:00 (Sun)
  62855658000, #  local_start 1992-10-25 01:00:00 (Sun)
  62864121600, #    local_end 1993-01-31 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62864132400, #    utc_start 1993-01-31 03:00:00 (Sun)
  62886513600, #      utc_end 1993-10-17 04:00:00 (Sun)
  62864118000, #  local_start 1993-01-30 23:00:00 (Sat)
  62886499200, #    local_end 1993-10-17 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62886513600, #    utc_start 1993-10-17 04:00:00 (Sun)
  62897396400, #      utc_end 1994-02-20 03:00:00 (Sun)
  62886502800, #  local_start 1993-10-17 01:00:00 (Sun)
  62897385600, #    local_end 1994-02-20 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62897396400, #    utc_start 1994-02-20 03:00:00 (Sun)
  62917963200, #      utc_end 1994-10-16 04:00:00 (Sun)
  62897382000, #  local_start 1994-02-19 23:00:00 (Sat)
  62917948800, #    local_end 1994-10-16 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62917963200, #    utc_start 1994-10-16 04:00:00 (Sun)
  62928846000, #      utc_end 1995-02-19 03:00:00 (Sun)
  62917952400, #  local_start 1994-10-16 01:00:00 (Sun)
  62928835200, #    local_end 1995-02-19 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62928846000, #    utc_start 1995-02-19 03:00:00 (Sun)
  62949412800, #      utc_end 1995-10-15 04:00:00 (Sun)
  62928831600, #  local_start 1995-02-18 23:00:00 (Sat)
  62949398400, #    local_end 1995-10-15 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62949412800, #    utc_start 1995-10-15 04:00:00 (Sun)
  62959690800, #      utc_end 1996-02-11 03:00:00 (Sun)
  62949402000, #  local_start 1995-10-15 01:00:00 (Sun)
  62959680000, #    local_end 1996-02-11 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62959690800, #    utc_start 1996-02-11 03:00:00 (Sun)
  62980257600, #      utc_end 1996-10-06 04:00:00 (Sun)
  62959676400, #  local_start 1996-02-10 23:00:00 (Sat)
  62980243200, #    local_end 1996-10-06 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62980257600, #    utc_start 1996-10-06 04:00:00 (Sun)
  62991745200, #      utc_end 1997-02-16 03:00:00 (Sun)
  62980246800, #  local_start 1996-10-06 01:00:00 (Sun)
  62991734400, #    local_end 1997-02-16 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62991745200, #    utc_start 1997-02-16 03:00:00 (Sun)
  63011793600, #      utc_end 1997-10-06 04:00:00 (Mon)
  62991730800, #  local_start 1997-02-15 23:00:00 (Sat)
  63011779200, #    local_end 1997-10-06 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  63011793600, #    utc_start 1997-10-06 04:00:00 (Mon)
  63024404400, #      utc_end 1998-03-01 03:00:00 (Sun)
  63011782800, #  local_start 1997-10-06 01:00:00 (Mon)
  63024393600, #    local_end 1998-03-01 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63024404400, #    utc_start 1998-03-01 03:00:00 (Sun)
  63043761600, #      utc_end 1998-10-11 04:00:00 (Sun)
  63024390000, #  local_start 1998-02-28 23:00:00 (Sat)
  63043747200, #    local_end 1998-10-11 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63043761600, #    utc_start 1998-10-11 04:00:00 (Sun)
  63055249200, #      utc_end 1999-02-21 03:00:00 (Sun)
  63043750800, #  local_start 1998-10-11 01:00:00 (Sun)
  63055238400, #    local_end 1999-02-21 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63055249200, #    utc_start 1999-02-21 03:00:00 (Sun)
  63074606400, #      utc_end 1999-10-03 04:00:00 (Sun)
  63055234800, #  local_start 1999-02-20 23:00:00 (Sat)
  63074592000, #    local_end 1999-10-03 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63074606400, #    utc_start 1999-10-03 04:00:00 (Sun)
  63087303600, #      utc_end 2000-02-27 03:00:00 (Sun)
  63074595600, #  local_start 1999-10-03 01:00:00 (Sun)
  63087292800, #    local_end 2000-02-27 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63087303600, #    utc_start 2000-02-27 03:00:00 (Sun)
  63106660800, #      utc_end 2000-10-08 04:00:00 (Sun)
  63087289200, #  local_start 2000-02-26 23:00:00 (Sat)
  63106646400, #    local_end 2000-10-08 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63106660800, #    utc_start 2000-10-08 04:00:00 (Sun)
  63118148400, #      utc_end 2001-02-18 03:00:00 (Sun)
  63106650000, #  local_start 2000-10-08 01:00:00 (Sun)
  63118137600, #    local_end 2001-02-18 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63118148400, #    utc_start 2001-02-18 03:00:00 (Sun)
  63138715200, #      utc_end 2001-10-14 04:00:00 (Sun)
  63118134000, #  local_start 2001-02-17 23:00:00 (Sat)
  63138700800, #    local_end 2001-10-14 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63138715200, #    utc_start 2001-10-14 04:00:00 (Sun)
  63149598000, #      utc_end 2002-02-17 03:00:00 (Sun)
  63138704400, #  local_start 2001-10-14 01:00:00 (Sun)
  63149587200, #    local_end 2002-02-17 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63149598000, #    utc_start 2002-02-17 03:00:00 (Sun)
  63171979200, #      utc_end 2002-11-03 04:00:00 (Sun)
  63149583600, #  local_start 2002-02-16 23:00:00 (Sat)
  63171964800, #    local_end 2002-11-03 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63171979200, #    utc_start 2002-11-03 04:00:00 (Sun)
  63181047600, #      utc_end 2003-02-16 03:00:00 (Sun)
  63171968400, #  local_start 2002-11-03 01:00:00 (Sun)
  63181036800, #    local_end 2003-02-16 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63181047600, #    utc_start 2003-02-16 03:00:00 (Sun)
  63200059200, #      utc_end 2003-09-24 04:00:00 (Wed)
  63181033200, #  local_start 2003-02-15 23:00:00 (Sat)
  63200044800, #    local_end 2003-09-24 00:00:00 (Wed)
  -14400,
  0,
  '-04',
      ],
      [
  63200059200, #    utc_start 2003-09-24 04:00:00 (Wed)
  63232286400, #      utc_end 2004-10-01 04:00:00 (Fri)
  63200044800, #  local_start 2003-09-24 00:00:00 (Wed)
  63232272000, #    local_end 2004-10-01 00:00:00 (Fri)
  -14400,
  0,
  '-04',
      ],
      [
  63232286400, #    utc_start 2004-10-01 04:00:00 (Fri)
  63235051200, #      utc_end 2004-11-02 04:00:00 (Tue)
  63232272000, #  local_start 2004-10-01 00:00:00 (Fri)
  63235036800, #    local_end 2004-11-02 00:00:00 (Tue)
  -14400,
  0,
  '-04',
      ],
      [
  63235051200, #    utc_start 2004-11-02 04:00:00 (Tue)
  63244551600, #      utc_end 2005-02-20 03:00:00 (Sun)
  63235040400, #  local_start 2004-11-02 01:00:00 (Tue)
  63244540800, #    local_end 2005-02-20 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63244551600, #    utc_start 2005-02-20 03:00:00 (Sun)
  63265118400, #      utc_end 2005-10-16 04:00:00 (Sun)
  63244537200, #  local_start 2005-02-19 23:00:00 (Sat)
  63265104000, #    local_end 2005-10-16 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63265118400, #    utc_start 2005-10-16 04:00:00 (Sun)
  63276001200, #      utc_end 2006-02-19 03:00:00 (Sun)
  63265107600, #  local_start 2005-10-16 01:00:00 (Sun)
  63275990400, #    local_end 2006-02-19 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63276001200, #    utc_start 2006-02-19 03:00:00 (Sun)
  63298382400, #      utc_end 2006-11-05 04:00:00 (Sun)
  63275986800, #  local_start 2006-02-18 23:00:00 (Sat)
  63298368000, #    local_end 2006-11-05 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63298382400, #    utc_start 2006-11-05 04:00:00 (Sun)
  63308055600, #      utc_end 2007-02-25 03:00:00 (Sun)
  63298371600, #  local_start 2006-11-05 01:00:00 (Sun)
  63308044800, #    local_end 2007-02-25 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63308055600, #    utc_start 2007-02-25 03:00:00 (Sun)
  63328017600, #      utc_end 2007-10-14 04:00:00 (Sun)
  63308041200, #  local_start 2007-02-24 23:00:00 (Sat)
  63328003200, #    local_end 2007-10-14 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63328017600, #    utc_start 2007-10-14 04:00:00 (Sun)
  63338900400, #      utc_end 2008-02-17 03:00:00 (Sun)
  63328006800, #  local_start 2007-10-14 01:00:00 (Sun)
  63338889600, #    local_end 2008-02-17 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63338900400, #    utc_start 2008-02-17 03:00:00 (Sun)
  63360072000, #      utc_end 2008-10-19 04:00:00 (Sun)
  63338886000, #  local_start 2008-02-16 23:00:00 (Sat)
  63360057600, #    local_end 2008-10-19 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63360072000, #    utc_start 2008-10-19 04:00:00 (Sun)
  63370350000, #      utc_end 2009-02-15 03:00:00 (Sun)
  63360061200, #  local_start 2008-10-19 01:00:00 (Sun)
  63370339200, #    local_end 2009-02-15 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63370350000, #    utc_start 2009-02-15 03:00:00 (Sun)
  63391521600, #      utc_end 2009-10-18 04:00:00 (Sun)
  63370335600, #  local_start 2009-02-14 23:00:00 (Sat)
  63391507200, #    local_end 2009-10-18 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63391521600, #    utc_start 2009-10-18 04:00:00 (Sun)
  63402404400, #      utc_end 2010-02-21 03:00:00 (Sun)
  63391510800, #  local_start 2009-10-18 01:00:00 (Sun)
  63402393600, #    local_end 2010-02-21 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63402404400, #    utc_start 2010-02-21 03:00:00 (Sun)
  63422971200, #      utc_end 2010-10-17 04:00:00 (Sun)
  63402390000, #  local_start 2010-02-20 23:00:00 (Sat)
  63422956800, #    local_end 2010-10-17 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63422971200, #    utc_start 2010-10-17 04:00:00 (Sun)
  63433854000, #      utc_end 2011-02-20 03:00:00 (Sun)
  63422960400, #  local_start 2010-10-17 01:00:00 (Sun)
  63433843200, #    local_end 2011-02-20 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63433854000, #    utc_start 2011-02-20 03:00:00 (Sun)
  63454420800, #      utc_end 2011-10-16 04:00:00 (Sun)
  63433839600, #  local_start 2011-02-19 23:00:00 (Sat)
  63454406400, #    local_end 2011-10-16 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63454420800, #    utc_start 2011-10-16 04:00:00 (Sun)
  63465908400, #      utc_end 2012-02-26 03:00:00 (Sun)
  63454410000, #  local_start 2011-10-16 01:00:00 (Sun)
  63465897600, #    local_end 2012-02-26 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63465908400, #    utc_start 2012-02-26 03:00:00 (Sun)
  63486475200, #      utc_end 2012-10-21 04:00:00 (Sun)
  63465894000, #  local_start 2012-02-25 23:00:00 (Sat)
  63486460800, #    local_end 2012-10-21 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63486475200, #    utc_start 2012-10-21 04:00:00 (Sun)
  63496753200, #      utc_end 2013-02-17 03:00:00 (Sun)
  63486464400, #  local_start 2012-10-21 01:00:00 (Sun)
  63496742400, #    local_end 2013-02-17 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63496753200, #    utc_start 2013-02-17 03:00:00 (Sun)
  63517924800, #      utc_end 2013-10-20 04:00:00 (Sun)
  63496738800, #  local_start 2013-02-16 23:00:00 (Sat)
  63517910400, #    local_end 2013-10-20 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63517924800, #    utc_start 2013-10-20 04:00:00 (Sun)
  63528202800, #      utc_end 2014-02-16 03:00:00 (Sun)
  63517914000, #  local_start 2013-10-20 01:00:00 (Sun)
  63528192000, #    local_end 2014-02-16 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63528202800, #    utc_start 2014-02-16 03:00:00 (Sun)
  63549374400, #      utc_end 2014-10-19 04:00:00 (Sun)
  63528188400, #  local_start 2014-02-15 23:00:00 (Sat)
  63549360000, #    local_end 2014-10-19 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63549374400, #    utc_start 2014-10-19 04:00:00 (Sun)
  63560257200, #      utc_end 2015-02-22 03:00:00 (Sun)
  63549363600, #  local_start 2014-10-19 01:00:00 (Sun)
  63560246400, #    local_end 2015-02-22 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63560257200, #    utc_start 2015-02-22 03:00:00 (Sun)
  63580824000, #      utc_end 2015-10-18 04:00:00 (Sun)
  63560242800, #  local_start 2015-02-21 23:00:00 (Sat)
  63580809600, #    local_end 2015-10-18 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63580824000, #    utc_start 2015-10-18 04:00:00 (Sun)
  63591706800, #      utc_end 2016-02-21 03:00:00 (Sun)
  63580813200, #  local_start 2015-10-18 01:00:00 (Sun)
  63591696000, #    local_end 2016-02-21 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63591706800, #    utc_start 2016-02-21 03:00:00 (Sun)
  63612273600, #      utc_end 2016-10-16 04:00:00 (Sun)
  63591692400, #  local_start 2016-02-20 23:00:00 (Sat)
  63612259200, #    local_end 2016-10-16 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63612273600, #    utc_start 2016-10-16 04:00:00 (Sun)
  63623156400, #      utc_end 2017-02-19 03:00:00 (Sun)
  63612262800, #  local_start 2016-10-16 01:00:00 (Sun)
  63623145600, #    local_end 2017-02-19 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63623156400, #    utc_start 2017-02-19 03:00:00 (Sun)
  63643723200, #      utc_end 2017-10-15 04:00:00 (Sun)
  63623142000, #  local_start 2017-02-18 23:00:00 (Sat)
  63643708800, #    local_end 2017-10-15 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63643723200, #    utc_start 2017-10-15 04:00:00 (Sun)
  63654606000, #      utc_end 2018-02-18 03:00:00 (Sun)
  63643712400, #  local_start 2017-10-15 01:00:00 (Sun)
  63654595200, #    local_end 2018-02-18 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63654606000, #    utc_start 2018-02-18 03:00:00 (Sun)
  63676987200, #      utc_end 2018-11-04 04:00:00 (Sun)
  63654591600, #  local_start 2018-02-17 23:00:00 (Sat)
  63676972800, #    local_end 2018-11-04 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63676987200, #    utc_start 2018-11-04 04:00:00 (Sun)
  63686055600, #      utc_end 2019-02-17 03:00:00 (Sun)
  63676976400, #  local_start 2018-11-04 01:00:00 (Sun)
  63686044800, #    local_end 2019-02-17 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63686055600, #    utc_start 2019-02-17 03:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #      utc_end
  63686041200, #  local_start 2019-02-16 23:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #    local_end
  -14400,
  0,
  '-04',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {44}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_CUIABA

    $main::fatpacked{"DateTime/TimeZone/America/Curacao.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_CURACAO';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/southamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Curacao;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Curacao::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60308944547, #      utc_end 1912-02-12 04:35:47 (Mon)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60308928000, #    local_end 1912-02-12 00:00:00 (Mon)
  -16547,
  0,
  'LMT',
      ],
      [
  60308944547, #    utc_start 1912-02-12 04:35:47 (Mon)
  61977933000, #      utc_end 1965-01-01 04:30:00 (Fri)
  60308928347, #  local_start 1912-02-12 00:05:47 (Mon)
  61977916800, #    local_end 1965-01-01 00:00:00 (Fri)
  -16200,
  0,
  '-0430',
      ],
      [
  61977933000, #    utc_start 1965-01-01 04:30:00 (Fri)
  DateTime::TimeZone::INFINITY, #      utc_end
  61977918600, #  local_start 1965-01-01 00:30:00 (Fri)
  DateTime::TimeZone::INFINITY, #    local_end
  -14400,
  0,
  'AST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_CURACAO

    $main::fatpacked{"DateTime/TimeZone/America/Danmarkshavn.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_DANMARKSHAVN';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Danmarkshavn;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Danmarkshavn::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60449591680, #      utc_end 1916-07-28 01:14:40 (Fri)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60449587200, #    local_end 1916-07-28 00:00:00 (Fri)
  -4480,
  0,
  'LMT',
      ],
      [
  60449591680, #    utc_start 1916-07-28 01:14:40 (Fri)
  62459528400, #      utc_end 1980-04-06 05:00:00 (Sun)
  60449580880, #  local_start 1916-07-27 22:14:40 (Thu)
  62459517600, #    local_end 1980-04-06 02:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62459528400, #    utc_start 1980-04-06 05:00:00 (Sun)
  62474634000, #      utc_end 1980-09-28 01:00:00 (Sun)
  62459521200, #  local_start 1980-04-06 03:00:00 (Sun)
  62474626800, #    local_end 1980-09-27 23:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  62474634000, #    utc_start 1980-09-28 01:00:00 (Sun)
  62490358800, #      utc_end 1981-03-29 01:00:00 (Sun)
  62474623200, #  local_start 1980-09-27 22:00:00 (Sat)
  62490348000, #    local_end 1981-03-28 22:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  62490358800, #    utc_start 1981-03-29 01:00:00 (Sun)
  62506083600, #      utc_end 1981-09-27 01:00:00 (Sun)
  62490351600, #  local_start 1981-03-28 23:00:00 (Sat)
  62506076400, #    local_end 1981-09-26 23:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  62506083600, #    utc_start 1981-09-27 01:00:00 (Sun)
  62521808400, #      utc_end 1982-03-28 01:00:00 (Sun)
  62506072800, #  local_start 1981-09-26 22:00:00 (Sat)
  62521797600, #    local_end 1982-03-27 22:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  62521808400, #    utc_start 1982-03-28 01:00:00 (Sun)
  62537533200, #      utc_end 1982-09-26 01:00:00 (Sun)
  62521801200, #  local_start 1982-03-27 23:00:00 (Sat)
  62537526000, #    local_end 1982-09-25 23:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  62537533200, #    utc_start 1982-09-26 01:00:00 (Sun)
  62553258000, #      utc_end 1983-03-27 01:00:00 (Sun)
  62537522400, #  local_start 1982-09-25 22:00:00 (Sat)
  62553247200, #    local_end 1983-03-26 22:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  62553258000, #    utc_start 1983-03-27 01:00:00 (Sun)
  62568982800, #      utc_end 1983-09-25 01:00:00 (Sun)
  62553250800, #  local_start 1983-03-26 23:00:00 (Sat)
  62568975600, #    local_end 1983-09-24 23:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  62568982800, #    utc_start 1983-09-25 01:00:00 (Sun)
  62584707600, #      utc_end 1984-03-25 01:00:00 (Sun)
  62568972000, #  local_start 1983-09-24 22:00:00 (Sat)
  62584696800, #    local_end 1984-03-24 22:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  62584707600, #    utc_start 1984-03-25 01:00:00 (Sun)
  62601037200, #      utc_end 1984-09-30 01:00:00 (Sun)
  62584700400, #  local_start 1984-03-24 23:00:00 (Sat)
  62601030000, #    local_end 1984-09-29 23:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  62601037200, #    utc_start 1984-09-30 01:00:00 (Sun)
  62616762000, #      utc_end 1985-03-31 01:00:00 (Sun)
  62601026400, #  local_start 1984-09-29 22:00:00 (Sat)
  62616751200, #    local_end 1985-03-30 22:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  62616762000, #    utc_start 1985-03-31 01:00:00 (Sun)
  62632486800, #      utc_end 1985-09-29 01:00:00 (Sun)
  62616754800, #  local_start 1985-03-30 23:00:00 (Sat)
  62632479600, #    local_end 1985-09-28 23:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  62632486800, #    utc_start 1985-09-29 01:00:00 (Sun)
  62648211600, #      utc_end 1986-03-30 01:00:00 (Sun)
  62632476000, #  local_start 1985-09-28 22:00:00 (Sat)
  62648200800, #    local_end 1986-03-29 22:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  62648211600, #    utc_start 1986-03-30 01:00:00 (Sun)
  62663936400, #      utc_end 1986-09-28 01:00:00 (Sun)
  62648204400, #  local_start 1986-03-29 23:00:00 (Sat)
  62663929200, #    local_end 1986-09-27 23:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  62663936400, #    utc_start 1986-09-28 01:00:00 (Sun)
  62679661200, #      utc_end 1987-03-29 01:00:00 (Sun)
  62663925600, #  local_start 1986-09-27 22:00:00 (Sat)
  62679650400, #    local_end 1987-03-28 22:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  62679661200, #    utc_start 1987-03-29 01:00:00 (Sun)
  62695386000, #      utc_end 1987-09-27 01:00:00 (Sun)
  62679654000, #  local_start 1987-03-28 23:00:00 (Sat)
  62695378800, #    local_end 1987-09-26 23:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  62695386000, #    utc_start 1987-09-27 01:00:00 (Sun)
  62711110800, #      utc_end 1988-03-27 01:00:00 (Sun)
  62695375200, #  local_start 1987-09-26 22:00:00 (Sat)
  62711100000, #    local_end 1988-03-26 22:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  62711110800, #    utc_start 1988-03-27 01:00:00 (Sun)
  62726835600, #      utc_end 1988-09-25 01:00:00 (Sun)
  62711103600, #  local_start 1988-03-26 23:00:00 (Sat)
  62726828400, #    local_end 1988-09-24 23:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  62726835600, #    utc_start 1988-09-25 01:00:00 (Sun)
  62742560400, #      utc_end 1989-03-26 01:00:00 (Sun)
  62726824800, #  local_start 1988-09-24 22:00:00 (Sat)
  62742549600, #    local_end 1989-03-25 22:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  62742560400, #    utc_start 1989-03-26 01:00:00 (Sun)
  62758285200, #      utc_end 1989-09-24 01:00:00 (Sun)
  62742553200, #  local_start 1989-03-25 23:00:00 (Sat)
  62758278000, #    local_end 1989-09-23 23:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  62758285200, #    utc_start 1989-09-24 01:00:00 (Sun)
  62774010000, #      utc_end 1990-03-25 01:00:00 (Sun)
  62758274400, #  local_start 1989-09-23 22:00:00 (Sat)
  62773999200, #    local_end 1990-03-24 22:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  62774010000, #    utc_start 1990-03-25 01:00:00 (Sun)
  62790339600, #      utc_end 1990-09-30 01:00:00 (Sun)
  62774002800, #  local_start 1990-03-24 23:00:00 (Sat)
  62790332400, #    local_end 1990-09-29 23:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  62790339600, #    utc_start 1990-09-30 01:00:00 (Sun)
  62806064400, #      utc_end 1991-03-31 01:00:00 (Sun)
  62790328800, #  local_start 1990-09-29 22:00:00 (Sat)
  62806053600, #    local_end 1991-03-30 22:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  62806064400, #    utc_start 1991-03-31 01:00:00 (Sun)
  62821789200, #      utc_end 1991-09-29 01:00:00 (Sun)
  62806057200, #  local_start 1991-03-30 23:00:00 (Sat)
  62821782000, #    local_end 1991-09-28 23:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  62821789200, #    utc_start 1991-09-29 01:00:00 (Sun)
  62837514000, #      utc_end 1992-03-29 01:00:00 (Sun)
  62821778400, #  local_start 1991-09-28 22:00:00 (Sat)
  62837503200, #    local_end 1992-03-28 22:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  62837514000, #    utc_start 1992-03-29 01:00:00 (Sun)
  62853238800, #      utc_end 1992-09-27 01:00:00 (Sun)
  62837506800, #  local_start 1992-03-28 23:00:00 (Sat)
  62853231600, #    local_end 1992-09-26 23:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  62853238800, #    utc_start 1992-09-27 01:00:00 (Sun)
  62868963600, #      utc_end 1993-03-28 01:00:00 (Sun)
  62853228000, #  local_start 1992-09-26 22:00:00 (Sat)
  62868952800, #    local_end 1993-03-27 22:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  62868963600, #    utc_start 1993-03-28 01:00:00 (Sun)
  62884688400, #      utc_end 1993-09-26 01:00:00 (Sun)
  62868956400, #  local_start 1993-03-27 23:00:00 (Sat)
  62884681200, #    local_end 1993-09-25 23:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  62884688400, #    utc_start 1993-09-26 01:00:00 (Sun)
  62900413200, #      utc_end 1994-03-27 01:00:00 (Sun)
  62884677600, #  local_start 1993-09-25 22:00:00 (Sat)
  62900402400, #    local_end 1994-03-26 22:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  62900413200, #    utc_start 1994-03-27 01:00:00 (Sun)
  62916138000, #      utc_end 1994-09-25 01:00:00 (Sun)
  62900406000, #  local_start 1994-03-26 23:00:00 (Sat)
  62916130800, #    local_end 1994-09-24 23:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  62916138000, #    utc_start 1994-09-25 01:00:00 (Sun)
  62931862800, #      utc_end 1995-03-26 01:00:00 (Sun)
  62916127200, #  local_start 1994-09-24 22:00:00 (Sat)
  62931852000, #    local_end 1995-03-25 22:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  62931862800, #    utc_start 1995-03-26 01:00:00 (Sun)
  62947587600, #      utc_end 1995-09-24 01:00:00 (Sun)
  62931855600, #  local_start 1995-03-25 23:00:00 (Sat)
  62947580400, #    local_end 1995-09-23 23:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  62947587600, #    utc_start 1995-09-24 01:00:00 (Sun)
  62956148400, #      utc_end 1996-01-01 03:00:00 (Mon)
  62947576800, #  local_start 1995-09-23 22:00:00 (Sat)
  62956137600, #    local_end 1996-01-01 00:00:00 (Mon)
  -10800,
  0,
  '-03',
      ],
      [
  62956148400, #    utc_start 1996-01-01 03:00:00 (Mon)
  DateTime::TimeZone::INFINITY, #      utc_end
  62956148400, #  local_start 1996-01-01 03:00:00 (Mon)
  DateTime::TimeZone::INFINITY, #    local_end
  0,
  0,
  'GMT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {16}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_DANMARKSHAVN

    $main::fatpacked{"DateTime/TimeZone/America/Dawson.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_DAWSON';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Dawson;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Dawson::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59946686260, #      utc_end 1900-08-20 09:17:40 (Mon)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59946652800, #    local_end 1900-08-20 00:00:00 (Mon)
  -33460,
  0,
  'LMT',
      ],
      [
  59946686260, #    utc_start 1900-08-20 09:17:40 (Mon)
  60503626800, #      utc_end 1918-04-14 11:00:00 (Sun)
  59946653860, #  local_start 1900-08-20 00:17:40 (Mon)
  60503594400, #    local_end 1918-04-14 02:00:00 (Sun)
  -32400,
  0,
  'YST',
      ],
      [
  60503626800, #    utc_start 1918-04-14 11:00:00 (Sun)
  60520557600, #      utc_end 1918-10-27 10:00:00 (Sun)
  60503598000, #  local_start 1918-04-14 03:00:00 (Sun)
  60520528800, #    local_end 1918-10-27 02:00:00 (Sun)
  -28800,
  1,
  'YDT',
      ],
      [
  60520557600, #    utc_start 1918-10-27 10:00:00 (Sun)
  60538705200, #      utc_end 1919-05-25 11:00:00 (Sun)
  60520525200, #  local_start 1918-10-27 01:00:00 (Sun)
  60538672800, #    local_end 1919-05-25 02:00:00 (Sun)
  -32400,
  0,
  'YST',
      ],
      [
  60538705200, #    utc_start 1919-05-25 11:00:00 (Sun)
  60552518400, #      utc_end 1919-11-01 08:00:00 (Sat)
  60538676400, #  local_start 1919-05-25 03:00:00 (Sun)
  60552489600, #    local_end 1919-11-01 00:00:00 (Sat)
  -28800,
  1,
  'YDT',
      ],
      [
  60552518400, #    utc_start 1919-11-01 08:00:00 (Sat)
  61255479600, #      utc_end 1942-02-09 11:00:00 (Mon)
  60552486000, #  local_start 1919-10-31 23:00:00 (Fri)
  61255447200, #    local_end 1942-02-09 02:00:00 (Mon)
  -32400,
  0,
  'YST',
      ],
      [
  61255479600, #    utc_start 1942-02-09 11:00:00 (Mon)
  61366287600, #      utc_end 1945-08-14 23:00:00 (Tue)
  61255450800, #  local_start 1942-02-09 03:00:00 (Mon)
  61366258800, #    local_end 1945-08-14 15:00:00 (Tue)
  -28800,
  1,
  'YWT',
      ],
      [
  61366287600, #    utc_start 1945-08-14 23:00:00 (Tue)
  61370301600, #      utc_end 1945-09-30 10:00:00 (Sun)
  61366258800, #  local_start 1945-08-14 15:00:00 (Tue)
  61370272800, #    local_end 1945-09-30 02:00:00 (Sun)
  -28800,
  1,
  'YPT',
      ],
      [
  61370301600, #    utc_start 1945-09-30 10:00:00 (Sun)
  61987798800, #      utc_end 1965-04-25 09:00:00 (Sun)
  61370269200, #  local_start 1945-09-30 01:00:00 (Sun)
  61987766400, #    local_end 1965-04-25 00:00:00 (Sun)
  -32400,
  0,
  'YST',
      ],
      [
  61987798800, #    utc_start 1965-04-25 09:00:00 (Sun)
  62004128400, #      utc_end 1965-10-31 09:00:00 (Sun)
  61987773600, #  local_start 1965-04-25 02:00:00 (Sun)
  62004103200, #    local_end 1965-10-31 02:00:00 (Sun)
  -25200,
  1,
  'YDDT',
      ],
      [
  62004128400, #    utc_start 1965-10-31 09:00:00 (Sun)
  62256330000, #      utc_end 1973-10-28 09:00:00 (Sun)
  62004096000, #  local_start 1965-10-31 00:00:00 (Sun)
  62256297600, #    local_end 1973-10-28 00:00:00 (Sun)
  -32400,
  0,
  'YST',
      ],
      [
  62256330000, #    utc_start 1973-10-28 09:00:00 (Sun)
  62451244800, #      utc_end 1980-01-01 08:00:00 (Tue)
  62256301200, #  local_start 1973-10-28 01:00:00 (Sun)
  62451216000, #    local_end 1980-01-01 00:00:00 (Tue)
  -28800,
  0,
  'PST',
      ],
      [
  62451244800, #    utc_start 1980-01-01 08:00:00 (Tue)
  62461360800, #      utc_end 1980-04-27 10:00:00 (Sun)
  62451216000, #  local_start 1980-01-01 00:00:00 (Tue)
  62461332000, #    local_end 1980-04-27 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62461360800, #    utc_start 1980-04-27 10:00:00 (Sun)
  62477082000, #      utc_end 1980-10-26 09:00:00 (Sun)
  62461335600, #  local_start 1980-04-27 03:00:00 (Sun)
  62477056800, #    local_end 1980-10-26 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62477082000, #    utc_start 1980-10-26 09:00:00 (Sun)
  62492810400, #      utc_end 1981-04-26 10:00:00 (Sun)
  62477053200, #  local_start 1980-10-26 01:00:00 (Sun)
  62492781600, #    local_end 1981-04-26 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62492810400, #    utc_start 1981-04-26 10:00:00 (Sun)
  62508531600, #      utc_end 1981-10-25 09:00:00 (Sun)
  62492785200, #  local_start 1981-04-26 03:00:00 (Sun)
  62508506400, #    local_end 1981-10-25 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62508531600, #    utc_start 1981-10-25 09:00:00 (Sun)
  62524260000, #      utc_end 1982-04-25 10:00:00 (Sun)
  62508502800, #  local_start 1981-10-25 01:00:00 (Sun)
  62524231200, #    local_end 1982-04-25 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62524260000, #    utc_start 1982-04-25 10:00:00 (Sun)
  62540586000, #      utc_end 1982-10-31 09:00:00 (Sun)
  62524234800, #  local_start 1982-04-25 03:00:00 (Sun)
  62540560800, #    local_end 1982-10-31 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62540586000, #    utc_start 1982-10-31 09:00:00 (Sun)
  62555709600, #      utc_end 1983-04-24 10:00:00 (Sun)
  62540557200, #  local_start 1982-10-31 01:00:00 (Sun)
  62555680800, #    local_end 1983-04-24 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62555709600, #    utc_start 1983-04-24 10:00:00 (Sun)
  62572035600, #      utc_end 1983-10-30 09:00:00 (Sun)
  62555684400, #  local_start 1983-04-24 03:00:00 (Sun)
  62572010400, #    local_end 1983-10-30 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62572035600, #    utc_start 1983-10-30 09:00:00 (Sun)
  62587764000, #      utc_end 1984-04-29 10:00:00 (Sun)
  62572006800, #  local_start 1983-10-30 01:00:00 (Sun)
  62587735200, #    local_end 1984-04-29 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62587764000, #    utc_start 1984-04-29 10:00:00 (Sun)
  62603485200, #      utc_end 1984-10-28 09:00:00 (Sun)
  62587738800, #  local_start 1984-04-29 03:00:00 (Sun)
  62603460000, #    local_end 1984-10-28 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62603485200, #    utc_start 1984-10-28 09:00:00 (Sun)
  62619213600, #      utc_end 1985-04-28 10:00:00 (Sun)
  62603456400, #  local_start 1984-10-28 01:00:00 (Sun)
  62619184800, #    local_end 1985-04-28 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62619213600, #    utc_start 1985-04-28 10:00:00 (Sun)
  62634934800, #      utc_end 1985-10-27 09:00:00 (Sun)
  62619188400, #  local_start 1985-04-28 03:00:00 (Sun)
  62634909600, #    local_end 1985-10-27 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62634934800, #    utc_start 1985-10-27 09:00:00 (Sun)
  62650663200, #      utc_end 1986-04-27 10:00:00 (Sun)
  62634906000, #  local_start 1985-10-27 01:00:00 (Sun)
  62650634400, #    local_end 1986-04-27 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62650663200, #    utc_start 1986-04-27 10:00:00 (Sun)
  62666384400, #      utc_end 1986-10-26 09:00:00 (Sun)
  62650638000, #  local_start 1986-04-27 03:00:00 (Sun)
  62666359200, #    local_end 1986-10-26 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62666384400, #    utc_start 1986-10-26 09:00:00 (Sun)
  62680298400, #      utc_end 1987-04-05 10:00:00 (Sun)
  62666355600, #  local_start 1986-10-26 01:00:00 (Sun)
  62680269600, #    local_end 1987-04-05 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62680298400, #    utc_start 1987-04-05 10:00:00 (Sun)
  62697834000, #      utc_end 1987-10-25 09:00:00 (Sun)
  62680273200, #  local_start 1987-04-05 03:00:00 (Sun)
  62697808800, #    local_end 1987-10-25 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62697834000, #    utc_start 1987-10-25 09:00:00 (Sun)
  62711748000, #      utc_end 1988-04-03 10:00:00 (Sun)
  62697805200, #  local_start 1987-10-25 01:00:00 (Sun)
  62711719200, #    local_end 1988-04-03 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62711748000, #    utc_start 1988-04-03 10:00:00 (Sun)
  62729888400, #      utc_end 1988-10-30 09:00:00 (Sun)
  62711722800, #  local_start 1988-04-03 03:00:00 (Sun)
  62729863200, #    local_end 1988-10-30 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62729888400, #    utc_start 1988-10-30 09:00:00 (Sun)
  62743197600, #      utc_end 1989-04-02 10:00:00 (Sun)
  62729859600, #  local_start 1988-10-30 01:00:00 (Sun)
  62743168800, #    local_end 1989-04-02 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62743197600, #    utc_start 1989-04-02 10:00:00 (Sun)
  62761338000, #      utc_end 1989-10-29 09:00:00 (Sun)
  62743172400, #  local_start 1989-04-02 03:00:00 (Sun)
  62761312800, #    local_end 1989-10-29 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62761338000, #    utc_start 1989-10-29 09:00:00 (Sun)
  62774647200, #      utc_end 1990-04-01 10:00:00 (Sun)
  62761309200, #  local_start 1989-10-29 01:00:00 (Sun)
  62774618400, #    local_end 1990-04-01 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62774647200, #    utc_start 1990-04-01 10:00:00 (Sun)
  62792787600, #      utc_end 1990-10-28 09:00:00 (Sun)
  62774622000, #  local_start 1990-04-01 03:00:00 (Sun)
  62792762400, #    local_end 1990-10-28 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62792787600, #    utc_start 1990-10-28 09:00:00 (Sun)
  62806701600, #      utc_end 1991-04-07 10:00:00 (Sun)
  62792758800, #  local_start 1990-10-28 01:00:00 (Sun)
  62806672800, #    local_end 1991-04-07 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62806701600, #    utc_start 1991-04-07 10:00:00 (Sun)
  62824237200, #      utc_end 1991-10-27 09:00:00 (Sun)
  62806676400, #  local_start 1991-04-07 03:00:00 (Sun)
  62824212000, #    local_end 1991-10-27 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62824237200, #    utc_start 1991-10-27 09:00:00 (Sun)
  62838151200, #      utc_end 1992-04-05 10:00:00 (Sun)
  62824208400, #  local_start 1991-10-27 01:00:00 (Sun)
  62838122400, #    local_end 1992-04-05 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62838151200, #    utc_start 1992-04-05 10:00:00 (Sun)
  62855686800, #      utc_end 1992-10-25 09:00:00 (Sun)
  62838126000, #  local_start 1992-04-05 03:00:00 (Sun)
  62855661600, #    local_end 1992-10-25 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62855686800, #    utc_start 1992-10-25 09:00:00 (Sun)
  62869600800, #      utc_end 1993-04-04 10:00:00 (Sun)
  62855658000, #  local_start 1992-10-25 01:00:00 (Sun)
  62869572000, #    local_end 1993-04-04 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62869600800, #    utc_start 1993-04-04 10:00:00 (Sun)
  62887741200, #      utc_end 1993-10-31 09:00:00 (Sun)
  62869575600, #  local_start 1993-04-04 03:00:00 (Sun)
  62887716000, #    local_end 1993-10-31 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62887741200, #    utc_start 1993-10-31 09:00:00 (Sun)
  62901050400, #      utc_end 1994-04-03 10:00:00 (Sun)
  62887712400, #  local_start 1993-10-31 01:00:00 (Sun)
  62901021600, #    local_end 1994-04-03 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62901050400, #    utc_start 1994-04-03 10:00:00 (Sun)
  62919190800, #      utc_end 1994-10-30 09:00:00 (Sun)
  62901025200, #  local_start 1994-04-03 03:00:00 (Sun)
  62919165600, #    local_end 1994-10-30 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62919190800, #    utc_start 1994-10-30 09:00:00 (Sun)
  62932500000, #      utc_end 1995-04-02 10:00:00 (Sun)
  62919162000, #  local_start 1994-10-30 01:00:00 (Sun)
  62932471200, #    local_end 1995-04-02 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62932500000, #    utc_start 1995-04-02 10:00:00 (Sun)
  62950640400, #      utc_end 1995-10-29 09:00:00 (Sun)
  62932474800, #  local_start 1995-04-02 03:00:00 (Sun)
  62950615200, #    local_end 1995-10-29 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62950640400, #    utc_start 1995-10-29 09:00:00 (Sun)
  62964554400, #      utc_end 1996-04-07 10:00:00 (Sun)
  62950611600, #  local_start 1995-10-29 01:00:00 (Sun)
  62964525600, #    local_end 1996-04-07 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62964554400, #    utc_start 1996-04-07 10:00:00 (Sun)
  62982090000, #      utc_end 1996-10-27 09:00:00 (Sun)
  62964529200, #  local_start 1996-04-07 03:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62982090000, #    utc_start 1996-10-27 09:00:00 (Sun)
  62996004000, #      utc_end 1997-04-06 10:00:00 (Sun)
  62982061200, #  local_start 1996-10-27 01:00:00 (Sun)
  62995975200, #    local_end 1997-04-06 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62996004000, #    utc_start 1997-04-06 10:00:00 (Sun)
  63013539600, #      utc_end 1997-10-26 09:00:00 (Sun)
  62995978800, #  local_start 1997-04-06 03:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63013539600, #    utc_start 1997-10-26 09:00:00 (Sun)
  63027453600, #      utc_end 1998-04-05 10:00:00 (Sun)
  63013510800, #  local_start 1997-10-26 01:00:00 (Sun)
  63027424800, #    local_end 1998-04-05 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63027453600, #    utc_start 1998-04-05 10:00:00 (Sun)
  63044989200, #      utc_end 1998-10-25 09:00:00 (Sun)
  63027428400, #  local_start 1998-04-05 03:00:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63044989200, #    utc_start 1998-10-25 09:00:00 (Sun)
  63058903200, #      utc_end 1999-04-04 10:00:00 (Sun)
  63044960400, #  local_start 1998-10-25 01:00:00 (Sun)
  63058874400, #    local_end 1999-04-04 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63058903200, #    utc_start 1999-04-04 10:00:00 (Sun)
  63077043600, #      utc_end 1999-10-31 09:00:00 (Sun)
  63058878000, #  local_start 1999-04-04 03:00:00 (Sun)
  63077018400, #    local_end 1999-10-31 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63077043600, #    utc_start 1999-10-31 09:00:00 (Sun)
  63090352800, #      utc_end 2000-04-02 10:00:00 (Sun)
  63077014800, #  local_start 1999-10-31 01:00:00 (Sun)
  63090324000, #    local_end 2000-04-02 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63090352800, #    utc_start 2000-04-02 10:00:00 (Sun)
  63108493200, #      utc_end 2000-10-29 09:00:00 (Sun)
  63090327600, #  local_start 2000-04-02 03:00:00 (Sun)
  63108468000, #    local_end 2000-10-29 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63108493200, #    utc_start 2000-10-29 09:00:00 (Sun)
  63121802400, #      utc_end 2001-04-01 10:00:00 (Sun)
  63108464400, #  local_start 2000-10-29 01:00:00 (Sun)
  63121773600, #    local_end 2001-04-01 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63121802400, #    utc_start 2001-04-01 10:00:00 (Sun)
  63139942800, #      utc_end 2001-10-28 09:00:00 (Sun)
  63121777200, #  local_start 2001-04-01 03:00:00 (Sun)
  63139917600, #    local_end 2001-10-28 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63139942800, #    utc_start 2001-10-28 09:00:00 (Sun)
  63153856800, #      utc_end 2002-04-07 10:00:00 (Sun)
  63139914000, #  local_start 2001-10-28 01:00:00 (Sun)
  63153828000, #    local_end 2002-04-07 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63153856800, #    utc_start 2002-04-07 10:00:00 (Sun)
  63171392400, #      utc_end 2002-10-27 09:00:00 (Sun)
  63153831600, #  local_start 2002-04-07 03:00:00 (Sun)
  63171367200, #    local_end 2002-10-27 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63171392400, #    utc_start 2002-10-27 09:00:00 (Sun)
  63185306400, #      utc_end 2003-04-06 10:00:00 (Sun)
  63171363600, #  local_start 2002-10-27 01:00:00 (Sun)
  63185277600, #    local_end 2003-04-06 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63185306400, #    utc_start 2003-04-06 10:00:00 (Sun)
  63202842000, #      utc_end 2003-10-26 09:00:00 (Sun)
  63185281200, #  local_start 2003-04-06 03:00:00 (Sun)
  63202816800, #    local_end 2003-10-26 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63202842000, #    utc_start 2003-10-26 09:00:00 (Sun)
  63216756000, #      utc_end 2004-04-04 10:00:00 (Sun)
  63202813200, #  local_start 2003-10-26 01:00:00 (Sun)
  63216727200, #    local_end 2004-04-04 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63216756000, #    utc_start 2004-04-04 10:00:00 (Sun)
  63234896400, #      utc_end 2004-10-31 09:00:00 (Sun)
  63216730800, #  local_start 2004-04-04 03:00:00 (Sun)
  63234871200, #    local_end 2004-10-31 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63234896400, #    utc_start 2004-10-31 09:00:00 (Sun)
  63248205600, #      utc_end 2005-04-03 10:00:00 (Sun)
  63234867600, #  local_start 2004-10-31 01:00:00 (Sun)
  63248176800, #    local_end 2005-04-03 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63248205600, #    utc_start 2005-04-03 10:00:00 (Sun)
  63266346000, #      utc_end 2005-10-30 09:00:00 (Sun)
  63248180400, #  local_start 2005-04-03 03:00:00 (Sun)
  63266320800, #    local_end 2005-10-30 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63266346000, #    utc_start 2005-10-30 09:00:00 (Sun)
  63279655200, #      utc_end 2006-04-02 10:00:00 (Sun)
  63266317200, #  local_start 2005-10-30 01:00:00 (Sun)
  63279626400, #    local_end 2006-04-02 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63279655200, #    utc_start 2006-04-02 10:00:00 (Sun)
  63297795600, #      utc_end 2006-10-29 09:00:00 (Sun)
  63279630000, #  local_start 2006-04-02 03:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63297795600, #    utc_start 2006-10-29 09:00:00 (Sun)
  63309290400, #      utc_end 2007-03-11 10:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63309261600, #    local_end 2007-03-11 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63309290400, #    utc_start 2007-03-11 10:00:00 (Sun)
  63329850000, #      utc_end 2007-11-04 09:00:00 (Sun)
  63309265200, #  local_start 2007-03-11 03:00:00 (Sun)
  63329824800, #    local_end 2007-11-04 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63329850000, #    utc_start 2007-11-04 09:00:00 (Sun)
  63340740000, #      utc_end 2008-03-09 10:00:00 (Sun)
  63329821200, #  local_start 2007-11-04 01:00:00 (Sun)
  63340711200, #    local_end 2008-03-09 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63340740000, #    utc_start 2008-03-09 10:00:00 (Sun)
  63361299600, #      utc_end 2008-11-02 09:00:00 (Sun)
  63340714800, #  local_start 2008-03-09 03:00:00 (Sun)
  63361274400, #    local_end 2008-11-02 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63361299600, #    utc_start 2008-11-02 09:00:00 (Sun)
  63372189600, #      utc_end 2009-03-08 10:00:00 (Sun)
  63361270800, #  local_start 2008-11-02 01:00:00 (Sun)
  63372160800, #    local_end 2009-03-08 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63372189600, #    utc_start 2009-03-08 10:00:00 (Sun)
  63392749200, #      utc_end 2009-11-01 09:00:00 (Sun)
  63372164400, #  local_start 2009-03-08 03:00:00 (Sun)
  63392724000, #    local_end 2009-11-01 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63392749200, #    utc_start 2009-11-01 09:00:00 (Sun)
  63404244000, #      utc_end 2010-03-14 10:00:00 (Sun)
  63392720400, #  local_start 2009-11-01 01:00:00 (Sun)
  63404215200, #    local_end 2010-03-14 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63404244000, #    utc_start 2010-03-14 10:00:00 (Sun)
  63424803600, #      utc_end 2010-11-07 09:00:00 (Sun)
  63404218800, #  local_start 2010-03-14 03:00:00 (Sun)
  63424778400, #    local_end 2010-11-07 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63424803600, #    utc_start 2010-11-07 09:00:00 (Sun)
  63435693600, #      utc_end 2011-03-13 10:00:00 (Sun)
  63424774800, #  local_start 2010-11-07 01:00:00 (Sun)
  63435664800, #    local_end 2011-03-13 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63435693600, #    utc_start 2011-03-13 10:00:00 (Sun)
  63456253200, #      utc_end 2011-11-06 09:00:00 (Sun)
  63435668400, #  local_start 2011-03-13 03:00:00 (Sun)
  63456228000, #    local_end 2011-11-06 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63456253200, #    utc_start 2011-11-06 09:00:00 (Sun)
  63467143200, #      utc_end 2012-03-11 10:00:00 (Sun)
  63456224400, #  local_start 2011-11-06 01:00:00 (Sun)
  63467114400, #    local_end 2012-03-11 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63467143200, #    utc_start 2012-03-11 10:00:00 (Sun)
  63487702800, #      utc_end 2012-11-04 09:00:00 (Sun)
  63467118000, #  local_start 2012-03-11 03:00:00 (Sun)
  63487677600, #    local_end 2012-11-04 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63487702800, #    utc_start 2012-11-04 09:00:00 (Sun)
  63498592800, #      utc_end 2013-03-10 10:00:00 (Sun)
  63487674000, #  local_start 2012-11-04 01:00:00 (Sun)
  63498564000, #    local_end 2013-03-10 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63498592800, #    utc_start 2013-03-10 10:00:00 (Sun)
  63519152400, #      utc_end 2013-11-03 09:00:00 (Sun)
  63498567600, #  local_start 2013-03-10 03:00:00 (Sun)
  63519127200, #    local_end 2013-11-03 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63519152400, #    utc_start 2013-11-03 09:00:00 (Sun)
  63530042400, #      utc_end 2014-03-09 10:00:00 (Sun)
  63519123600, #  local_start 2013-11-03 01:00:00 (Sun)
  63530013600, #    local_end 2014-03-09 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63530042400, #    utc_start 2014-03-09 10:00:00 (Sun)
  63550602000, #      utc_end 2014-11-02 09:00:00 (Sun)
  63530017200, #  local_start 2014-03-09 03:00:00 (Sun)
  63550576800, #    local_end 2014-11-02 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63550602000, #    utc_start 2014-11-02 09:00:00 (Sun)
  63561492000, #      utc_end 2015-03-08 10:00:00 (Sun)
  63550573200, #  local_start 2014-11-02 01:00:00 (Sun)
  63561463200, #    local_end 2015-03-08 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63561492000, #    utc_start 2015-03-08 10:00:00 (Sun)
  63582051600, #      utc_end 2015-11-01 09:00:00 (Sun)
  63561466800, #  local_start 2015-03-08 03:00:00 (Sun)
  63582026400, #    local_end 2015-11-01 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63582051600, #    utc_start 2015-11-01 09:00:00 (Sun)
  63593546400, #      utc_end 2016-03-13 10:00:00 (Sun)
  63582022800, #  local_start 2015-11-01 01:00:00 (Sun)
  63593517600, #    local_end 2016-03-13 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63593546400, #    utc_start 2016-03-13 10:00:00 (Sun)
  63614106000, #      utc_end 2016-11-06 09:00:00 (Sun)
  63593521200, #  local_start 2016-03-13 03:00:00 (Sun)
  63614080800, #    local_end 2016-11-06 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63614106000, #    utc_start 2016-11-06 09:00:00 (Sun)
  63624996000, #      utc_end 2017-03-12 10:00:00 (Sun)
  63614077200, #  local_start 2016-11-06 01:00:00 (Sun)
  63624967200, #    local_end 2017-03-12 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63624996000, #    utc_start 2017-03-12 10:00:00 (Sun)
  63645555600, #      utc_end 2017-11-05 09:00:00 (Sun)
  63624970800, #  local_start 2017-03-12 03:00:00 (Sun)
  63645530400, #    local_end 2017-11-05 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63645555600, #    utc_start 2017-11-05 09:00:00 (Sun)
  63656445600, #      utc_end 2018-03-11 10:00:00 (Sun)
  63645526800, #  local_start 2017-11-05 01:00:00 (Sun)
  63656416800, #    local_end 2018-03-11 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63656445600, #    utc_start 2018-03-11 10:00:00 (Sun)
  63677005200, #      utc_end 2018-11-04 09:00:00 (Sun)
  63656420400, #  local_start 2018-03-11 03:00:00 (Sun)
  63676980000, #    local_end 2018-11-04 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63677005200, #    utc_start 2018-11-04 09:00:00 (Sun)
  63687895200, #      utc_end 2019-03-10 10:00:00 (Sun)
  63676976400, #  local_start 2018-11-04 01:00:00 (Sun)
  63687866400, #    local_end 2019-03-10 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63687895200, #    utc_start 2019-03-10 10:00:00 (Sun)
  63708454800, #      utc_end 2019-11-03 09:00:00 (Sun)
  63687870000, #  local_start 2019-03-10 03:00:00 (Sun)
  63708429600, #    local_end 2019-11-03 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63708454800, #    utc_start 2019-11-03 09:00:00 (Sun)
  63719344800, #      utc_end 2020-03-08 10:00:00 (Sun)
  63708426000, #  local_start 2019-11-03 01:00:00 (Sun)
  63719316000, #    local_end 2020-03-08 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63719344800, #    utc_start 2020-03-08 10:00:00 (Sun)
  63739904400, #      utc_end 2020-11-01 09:00:00 (Sun)
  63719319600, #  local_start 2020-03-08 03:00:00 (Sun)
  63739879200, #    local_end 2020-11-01 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63739904400, #    utc_start 2020-11-01 09:00:00 (Sun)
  63751399200, #      utc_end 2021-03-14 10:00:00 (Sun)
  63739875600, #  local_start 2020-11-01 01:00:00 (Sun)
  63751370400, #    local_end 2021-03-14 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63751399200, #    utc_start 2021-03-14 10:00:00 (Sun)
  63771958800, #      utc_end 2021-11-07 09:00:00 (Sun)
  63751374000, #  local_start 2021-03-14 03:00:00 (Sun)
  63771933600, #    local_end 2021-11-07 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63771958800, #    utc_start 2021-11-07 09:00:00 (Sun)
  63782848800, #      utc_end 2022-03-13 10:00:00 (Sun)
  63771930000, #  local_start 2021-11-07 01:00:00 (Sun)
  63782820000, #    local_end 2022-03-13 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63782848800, #    utc_start 2022-03-13 10:00:00 (Sun)
  63803408400, #      utc_end 2022-11-06 09:00:00 (Sun)
  63782823600, #  local_start 2022-03-13 03:00:00 (Sun)
  63803383200, #    local_end 2022-11-06 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63803408400, #    utc_start 2022-11-06 09:00:00 (Sun)
  63814298400, #      utc_end 2023-03-12 10:00:00 (Sun)
  63803379600, #  local_start 2022-11-06 01:00:00 (Sun)
  63814269600, #    local_end 2023-03-12 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63814298400, #    utc_start 2023-03-12 10:00:00 (Sun)
  63834858000, #      utc_end 2023-11-05 09:00:00 (Sun)
  63814273200, #  local_start 2023-03-12 03:00:00 (Sun)
  63834832800, #    local_end 2023-11-05 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63834858000, #    utc_start 2023-11-05 09:00:00 (Sun)
  63845748000, #      utc_end 2024-03-10 10:00:00 (Sun)
  63834829200, #  local_start 2023-11-05 01:00:00 (Sun)
  63845719200, #    local_end 2024-03-10 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63845748000, #    utc_start 2024-03-10 10:00:00 (Sun)
  63866307600, #      utc_end 2024-11-03 09:00:00 (Sun)
  63845722800, #  local_start 2024-03-10 03:00:00 (Sun)
  63866282400, #    local_end 2024-11-03 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63866307600, #    utc_start 2024-11-03 09:00:00 (Sun)
  63877197600, #      utc_end 2025-03-09 10:00:00 (Sun)
  63866278800, #  local_start 2024-11-03 01:00:00 (Sun)
  63877168800, #    local_end 2025-03-09 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63877197600, #    utc_start 2025-03-09 10:00:00 (Sun)
  63897757200, #      utc_end 2025-11-02 09:00:00 (Sun)
  63877172400, #  local_start 2025-03-09 03:00:00 (Sun)
  63897732000, #    local_end 2025-11-02 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63897757200, #    utc_start 2025-11-02 09:00:00 (Sun)
  63908647200, #      utc_end 2026-03-08 10:00:00 (Sun)
  63897728400, #  local_start 2025-11-02 01:00:00 (Sun)
  63908618400, #    local_end 2026-03-08 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63908647200, #    utc_start 2026-03-08 10:00:00 (Sun)
  63929206800, #      utc_end 2026-11-01 09:00:00 (Sun)
  63908622000, #  local_start 2026-03-08 03:00:00 (Sun)
  63929181600, #    local_end 2026-11-01 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63929206800, #    utc_start 2026-11-01 09:00:00 (Sun)
  63940701600, #      utc_end 2027-03-14 10:00:00 (Sun)
  63929178000, #  local_start 2026-11-01 01:00:00 (Sun)
  63940672800, #    local_end 2027-03-14 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63940701600, #    utc_start 2027-03-14 10:00:00 (Sun)
  63961261200, #      utc_end 2027-11-07 09:00:00 (Sun)
  63940676400, #  local_start 2027-03-14 03:00:00 (Sun)
  63961236000, #    local_end 2027-11-07 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63961261200, #    utc_start 2027-11-07 09:00:00 (Sun)
  63972151200, #      utc_end 2028-03-12 10:00:00 (Sun)
  63961232400, #  local_start 2027-11-07 01:00:00 (Sun)
  63972122400, #    local_end 2028-03-12 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63972151200, #    utc_start 2028-03-12 10:00:00 (Sun)
  63992710800, #      utc_end 2028-11-05 09:00:00 (Sun)
  63972126000, #  local_start 2028-03-12 03:00:00 (Sun)
  63992685600, #    local_end 2028-11-05 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63992710800, #    utc_start 2028-11-05 09:00:00 (Sun)
  64003600800, #      utc_end 2029-03-11 10:00:00 (Sun)
  63992682000, #  local_start 2028-11-05 01:00:00 (Sun)
  64003572000, #    local_end 2029-03-11 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  64003600800, #    utc_start 2029-03-11 10:00:00 (Sun)
  64024160400, #      utc_end 2029-11-04 09:00:00 (Sun)
  64003575600, #  local_start 2029-03-11 03:00:00 (Sun)
  64024135200, #    local_end 2029-11-04 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  64024160400, #    utc_start 2029-11-04 09:00:00 (Sun)
  64035050400, #      utc_end 2030-03-10 10:00:00 (Sun)
  64024131600, #  local_start 2029-11-04 01:00:00 (Sun)
  64035021600, #    local_end 2030-03-10 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  64035050400, #    utc_start 2030-03-10 10:00:00 (Sun)
  64055610000, #      utc_end 2030-11-03 09:00:00 (Sun)
  64035025200, #  local_start 2030-03-10 03:00:00 (Sun)
  64055584800, #    local_end 2030-11-03 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {56}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -28800 }
  
  my $last_observance = bless( {
    'format' => 'P%sT',
    'gmtoff' => '-8:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 722815,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 722815,
      'utc_rd_secs' => 0,
      'utc_year' => 1981
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -28800,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 722815,
      'local_rd_secs' => 28800,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 722815,
      'utc_rd_secs' => 28800,
      'utc_year' => 1981
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Nov',
      'letter' => 'S',
      'name' => 'Canada',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Mar',
      'letter' => 'D',
      'name' => 'Canada',
      'offset_from_std' => 3600,
      'on' => 'Sun>=8',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_DAWSON

    $main::fatpacked{"DateTime/TimeZone/America/Dawson_Creek.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_DAWSON_CREEK';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Dawson_Creek;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Dawson_Creek::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59421801656, #      utc_end 1884-01-01 08:00:56 (Tue)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59421772800, #    local_end 1884-01-01 00:00:00 (Tue)
  -28856,
  0,
  'LMT',
      ],
      [
  59421801656, #    utc_start 1884-01-01 08:00:56 (Tue)
  60503623200, #      utc_end 1918-04-14 10:00:00 (Sun)
  59421772856, #  local_start 1884-01-01 00:00:56 (Tue)
  60503594400, #    local_end 1918-04-14 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  60503623200, #    utc_start 1918-04-14 10:00:00 (Sun)
  60520554000, #      utc_end 1918-10-27 09:00:00 (Sun)
  60503598000, #  local_start 1918-04-14 03:00:00 (Sun)
  60520528800, #    local_end 1918-10-27 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  60520554000, #    utc_start 1918-10-27 09:00:00 (Sun)
  61255476000, #      utc_end 1942-02-09 10:00:00 (Mon)
  60520525200, #  local_start 1918-10-27 01:00:00 (Sun)
  61255447200, #    local_end 1942-02-09 02:00:00 (Mon)
  -28800,
  0,
  'PST',
      ],
      [
  61255476000, #    utc_start 1942-02-09 10:00:00 (Mon)
  61366287600, #      utc_end 1945-08-14 23:00:00 (Tue)
  61255450800, #  local_start 1942-02-09 03:00:00 (Mon)
  61366262400, #    local_end 1945-08-14 16:00:00 (Tue)
  -25200,
  1,
  'PWT',
      ],
      [
  61366287600, #    utc_start 1945-08-14 23:00:00 (Tue)
  61370298000, #      utc_end 1945-09-30 09:00:00 (Sun)
  61366262400, #  local_start 1945-08-14 16:00:00 (Tue)
  61370272800, #    local_end 1945-09-30 02:00:00 (Sun)
  -25200,
  1,
  'PPT',
      ],
      [
  61370298000, #    utc_start 1945-09-30 09:00:00 (Sun)
  61409865600, #      utc_end 1947-01-01 08:00:00 (Wed)
  61370269200, #  local_start 1945-09-30 01:00:00 (Sun)
  61409836800, #    local_end 1947-01-01 00:00:00 (Wed)
  -28800,
  0,
  'PST',
      ],
      [
  61409865600, #    utc_start 1947-01-01 08:00:00 (Wed)
  61419895200, #      utc_end 1947-04-27 10:00:00 (Sun)
  61409836800, #  local_start 1947-01-01 00:00:00 (Wed)
  61419866400, #    local_end 1947-04-27 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61419895200, #    utc_start 1947-04-27 10:00:00 (Sun)
  61433197200, #      utc_end 1947-09-28 09:00:00 (Sun)
  61419870000, #  local_start 1947-04-27 03:00:00 (Sun)
  61433172000, #    local_end 1947-09-28 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61433197200, #    utc_start 1947-09-28 09:00:00 (Sun)
  61451344800, #      utc_end 1948-04-25 10:00:00 (Sun)
  61433168400, #  local_start 1947-09-28 01:00:00 (Sun)
  61451316000, #    local_end 1948-04-25 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61451344800, #    utc_start 1948-04-25 10:00:00 (Sun)
  61464646800, #      utc_end 1948-09-26 09:00:00 (Sun)
  61451319600, #  local_start 1948-04-25 03:00:00 (Sun)
  61464621600, #    local_end 1948-09-26 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61464646800, #    utc_start 1948-09-26 09:00:00 (Sun)
  61482794400, #      utc_end 1949-04-24 10:00:00 (Sun)
  61464618000, #  local_start 1948-09-26 01:00:00 (Sun)
  61482765600, #    local_end 1949-04-24 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61482794400, #    utc_start 1949-04-24 10:00:00 (Sun)
  61496096400, #      utc_end 1949-09-25 09:00:00 (Sun)
  61482769200, #  local_start 1949-04-24 03:00:00 (Sun)
  61496071200, #    local_end 1949-09-25 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61496096400, #    utc_start 1949-09-25 09:00:00 (Sun)
  61514848800, #      utc_end 1950-04-30 10:00:00 (Sun)
  61496067600, #  local_start 1949-09-25 01:00:00 (Sun)
  61514820000, #    local_end 1950-04-30 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61514848800, #    utc_start 1950-04-30 10:00:00 (Sun)
  61527546000, #      utc_end 1950-09-24 09:00:00 (Sun)
  61514823600, #  local_start 1950-04-30 03:00:00 (Sun)
  61527520800, #    local_end 1950-09-24 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61527546000, #    utc_start 1950-09-24 09:00:00 (Sun)
  61546298400, #      utc_end 1951-04-29 10:00:00 (Sun)
  61527517200, #  local_start 1950-09-24 01:00:00 (Sun)
  61546269600, #    local_end 1951-04-29 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61546298400, #    utc_start 1951-04-29 10:00:00 (Sun)
  61559600400, #      utc_end 1951-09-30 09:00:00 (Sun)
  61546273200, #  local_start 1951-04-29 03:00:00 (Sun)
  61559575200, #    local_end 1951-09-30 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61559600400, #    utc_start 1951-09-30 09:00:00 (Sun)
  61577748000, #      utc_end 1952-04-27 10:00:00 (Sun)
  61559571600, #  local_start 1951-09-30 01:00:00 (Sun)
  61577719200, #    local_end 1952-04-27 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61577748000, #    utc_start 1952-04-27 10:00:00 (Sun)
  61591050000, #      utc_end 1952-09-28 09:00:00 (Sun)
  61577722800, #  local_start 1952-04-27 03:00:00 (Sun)
  61591024800, #    local_end 1952-09-28 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61591050000, #    utc_start 1952-09-28 09:00:00 (Sun)
  61609197600, #      utc_end 1953-04-26 10:00:00 (Sun)
  61591021200, #  local_start 1952-09-28 01:00:00 (Sun)
  61609168800, #    local_end 1953-04-26 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61609197600, #    utc_start 1953-04-26 10:00:00 (Sun)
  61622499600, #      utc_end 1953-09-27 09:00:00 (Sun)
  61609172400, #  local_start 1953-04-26 03:00:00 (Sun)
  61622474400, #    local_end 1953-09-27 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61622499600, #    utc_start 1953-09-27 09:00:00 (Sun)
  61640647200, #      utc_end 1954-04-25 10:00:00 (Sun)
  61622470800, #  local_start 1953-09-27 01:00:00 (Sun)
  61640618400, #    local_end 1954-04-25 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61640647200, #    utc_start 1954-04-25 10:00:00 (Sun)
  61653949200, #      utc_end 1954-09-26 09:00:00 (Sun)
  61640622000, #  local_start 1954-04-25 03:00:00 (Sun)
  61653924000, #    local_end 1954-09-26 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61653949200, #    utc_start 1954-09-26 09:00:00 (Sun)
  61672096800, #      utc_end 1955-04-24 10:00:00 (Sun)
  61653920400, #  local_start 1954-09-26 01:00:00 (Sun)
  61672068000, #    local_end 1955-04-24 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61672096800, #    utc_start 1955-04-24 10:00:00 (Sun)
  61685398800, #      utc_end 1955-09-25 09:00:00 (Sun)
  61672071600, #  local_start 1955-04-24 03:00:00 (Sun)
  61685373600, #    local_end 1955-09-25 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61685398800, #    utc_start 1955-09-25 09:00:00 (Sun)
  61704151200, #      utc_end 1956-04-29 10:00:00 (Sun)
  61685370000, #  local_start 1955-09-25 01:00:00 (Sun)
  61704122400, #    local_end 1956-04-29 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61704151200, #    utc_start 1956-04-29 10:00:00 (Sun)
  61717453200, #      utc_end 1956-09-30 09:00:00 (Sun)
  61704126000, #  local_start 1956-04-29 03:00:00 (Sun)
  61717428000, #    local_end 1956-09-30 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61717453200, #    utc_start 1956-09-30 09:00:00 (Sun)
  61735600800, #      utc_end 1957-04-28 10:00:00 (Sun)
  61717424400, #  local_start 1956-09-30 01:00:00 (Sun)
  61735572000, #    local_end 1957-04-28 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61735600800, #    utc_start 1957-04-28 10:00:00 (Sun)
  61748902800, #      utc_end 1957-09-29 09:00:00 (Sun)
  61735575600, #  local_start 1957-04-28 03:00:00 (Sun)
  61748877600, #    local_end 1957-09-29 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61748902800, #    utc_start 1957-09-29 09:00:00 (Sun)
  61767050400, #      utc_end 1958-04-27 10:00:00 (Sun)
  61748874000, #  local_start 1957-09-29 01:00:00 (Sun)
  61767021600, #    local_end 1958-04-27 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61767050400, #    utc_start 1958-04-27 10:00:00 (Sun)
  61780352400, #      utc_end 1958-09-28 09:00:00 (Sun)
  61767025200, #  local_start 1958-04-27 03:00:00 (Sun)
  61780327200, #    local_end 1958-09-28 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61780352400, #    utc_start 1958-09-28 09:00:00 (Sun)
  61798500000, #      utc_end 1959-04-26 10:00:00 (Sun)
  61780323600, #  local_start 1958-09-28 01:00:00 (Sun)
  61798471200, #    local_end 1959-04-26 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61798500000, #    utc_start 1959-04-26 10:00:00 (Sun)
  61811802000, #      utc_end 1959-09-27 09:00:00 (Sun)
  61798474800, #  local_start 1959-04-26 03:00:00 (Sun)
  61811776800, #    local_end 1959-09-27 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61811802000, #    utc_start 1959-09-27 09:00:00 (Sun)
  61829949600, #      utc_end 1960-04-24 10:00:00 (Sun)
  61811773200, #  local_start 1959-09-27 01:00:00 (Sun)
  61829920800, #    local_end 1960-04-24 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61829949600, #    utc_start 1960-04-24 10:00:00 (Sun)
  61843251600, #      utc_end 1960-09-25 09:00:00 (Sun)
  61829924400, #  local_start 1960-04-24 03:00:00 (Sun)
  61843226400, #    local_end 1960-09-25 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61843251600, #    utc_start 1960-09-25 09:00:00 (Sun)
  61862004000, #      utc_end 1961-04-30 10:00:00 (Sun)
  61843222800, #  local_start 1960-09-25 01:00:00 (Sun)
  61861975200, #    local_end 1961-04-30 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61862004000, #    utc_start 1961-04-30 10:00:00 (Sun)
  61874701200, #      utc_end 1961-09-24 09:00:00 (Sun)
  61861978800, #  local_start 1961-04-30 03:00:00 (Sun)
  61874676000, #    local_end 1961-09-24 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61874701200, #    utc_start 1961-09-24 09:00:00 (Sun)
  61893453600, #      utc_end 1962-04-29 10:00:00 (Sun)
  61874672400, #  local_start 1961-09-24 01:00:00 (Sun)
  61893424800, #    local_end 1962-04-29 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61893453600, #    utc_start 1962-04-29 10:00:00 (Sun)
  61909174800, #      utc_end 1962-10-28 09:00:00 (Sun)
  61893428400, #  local_start 1962-04-29 03:00:00 (Sun)
  61909149600, #    local_end 1962-10-28 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61909174800, #    utc_start 1962-10-28 09:00:00 (Sun)
  61924903200, #      utc_end 1963-04-28 10:00:00 (Sun)
  61909146000, #  local_start 1962-10-28 01:00:00 (Sun)
  61924874400, #    local_end 1963-04-28 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61924903200, #    utc_start 1963-04-28 10:00:00 (Sun)
  61940624400, #      utc_end 1963-10-27 09:00:00 (Sun)
  61924878000, #  local_start 1963-04-28 03:00:00 (Sun)
  61940599200, #    local_end 1963-10-27 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61940624400, #    utc_start 1963-10-27 09:00:00 (Sun)
  61956352800, #      utc_end 1964-04-26 10:00:00 (Sun)
  61940595600, #  local_start 1963-10-27 01:00:00 (Sun)
  61956324000, #    local_end 1964-04-26 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61956352800, #    utc_start 1964-04-26 10:00:00 (Sun)
  61972074000, #      utc_end 1964-10-25 09:00:00 (Sun)
  61956327600, #  local_start 1964-04-26 03:00:00 (Sun)
  61972048800, #    local_end 1964-10-25 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61972074000, #    utc_start 1964-10-25 09:00:00 (Sun)
  61987802400, #      utc_end 1965-04-25 10:00:00 (Sun)
  61972045200, #  local_start 1964-10-25 01:00:00 (Sun)
  61987773600, #    local_end 1965-04-25 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61987802400, #    utc_start 1965-04-25 10:00:00 (Sun)
  62004128400, #      utc_end 1965-10-31 09:00:00 (Sun)
  61987777200, #  local_start 1965-04-25 03:00:00 (Sun)
  62004103200, #    local_end 1965-10-31 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62004128400, #    utc_start 1965-10-31 09:00:00 (Sun)
  62019252000, #      utc_end 1966-04-24 10:00:00 (Sun)
  62004099600, #  local_start 1965-10-31 01:00:00 (Sun)
  62019223200, #    local_end 1966-04-24 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62019252000, #    utc_start 1966-04-24 10:00:00 (Sun)
  62035578000, #      utc_end 1966-10-30 09:00:00 (Sun)
  62019226800, #  local_start 1966-04-24 03:00:00 (Sun)
  62035552800, #    local_end 1966-10-30 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62035578000, #    utc_start 1966-10-30 09:00:00 (Sun)
  62051306400, #      utc_end 1967-04-30 10:00:00 (Sun)
  62035549200, #  local_start 1966-10-30 01:00:00 (Sun)
  62051277600, #    local_end 1967-04-30 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62051306400, #    utc_start 1967-04-30 10:00:00 (Sun)
  62067027600, #      utc_end 1967-10-29 09:00:00 (Sun)
  62051281200, #  local_start 1967-04-30 03:00:00 (Sun)
  62067002400, #    local_end 1967-10-29 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62067027600, #    utc_start 1967-10-29 09:00:00 (Sun)
  62082756000, #      utc_end 1968-04-28 10:00:00 (Sun)
  62066998800, #  local_start 1967-10-29 01:00:00 (Sun)
  62082727200, #    local_end 1968-04-28 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62082756000, #    utc_start 1968-04-28 10:00:00 (Sun)
  62098477200, #      utc_end 1968-10-27 09:00:00 (Sun)
  62082730800, #  local_start 1968-04-28 03:00:00 (Sun)
  62098452000, #    local_end 1968-10-27 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62098477200, #    utc_start 1968-10-27 09:00:00 (Sun)
  62114205600, #      utc_end 1969-04-27 10:00:00 (Sun)
  62098448400, #  local_start 1968-10-27 01:00:00 (Sun)
  62114176800, #    local_end 1969-04-27 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62114205600, #    utc_start 1969-04-27 10:00:00 (Sun)
  62129926800, #      utc_end 1969-10-26 09:00:00 (Sun)
  62114180400, #  local_start 1969-04-27 03:00:00 (Sun)
  62129901600, #    local_end 1969-10-26 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62129926800, #    utc_start 1969-10-26 09:00:00 (Sun)
  62145655200, #      utc_end 1970-04-26 10:00:00 (Sun)
  62129898000, #  local_start 1969-10-26 01:00:00 (Sun)
  62145626400, #    local_end 1970-04-26 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62145655200, #    utc_start 1970-04-26 10:00:00 (Sun)
  62161376400, #      utc_end 1970-10-25 09:00:00 (Sun)
  62145630000, #  local_start 1970-04-26 03:00:00 (Sun)
  62161351200, #    local_end 1970-10-25 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62161376400, #    utc_start 1970-10-25 09:00:00 (Sun)
  62177104800, #      utc_end 1971-04-25 10:00:00 (Sun)
  62161347600, #  local_start 1970-10-25 01:00:00 (Sun)
  62177076000, #    local_end 1971-04-25 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62177104800, #    utc_start 1971-04-25 10:00:00 (Sun)
  62193430800, #      utc_end 1971-10-31 09:00:00 (Sun)
  62177079600, #  local_start 1971-04-25 03:00:00 (Sun)
  62193405600, #    local_end 1971-10-31 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62193430800, #    utc_start 1971-10-31 09:00:00 (Sun)
  62209159200, #      utc_end 1972-04-30 10:00:00 (Sun)
  62193402000, #  local_start 1971-10-31 01:00:00 (Sun)
  62209130400, #    local_end 1972-04-30 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62209159200, #    utc_start 1972-04-30 10:00:00 (Sun)
  62219696400, #      utc_end 1972-08-30 09:00:00 (Wed)
  62209134000, #  local_start 1972-04-30 03:00:00 (Sun)
  62219671200, #    local_end 1972-08-30 02:00:00 (Wed)
  -25200,
  1,
  'PDT',
      ],
      [
  62219696400, #    utc_start 1972-08-30 09:00:00 (Wed)
  DateTime::TimeZone::INFINITY, #      utc_end
  62219671200, #  local_start 1972-08-30 02:00:00 (Wed)
  DateTime::TimeZone::INFINITY, #    local_end
  -25200,
  0,
  'MST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {29}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_DAWSON_CREEK

    $main::fatpacked{"DateTime/TimeZone/America/Denver.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_DENVER';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Denver;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Denver::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59418039600, #      utc_end 1883-11-18 19:00:00 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59418014404, #    local_end 1883-11-18 12:00:04 (Sun)
  -25196,
  0,
  'LMT',
      ],
      [
  59418039600, #    utc_start 1883-11-18 19:00:00 (Sun)
  60502410000, #      utc_end 1918-03-31 09:00:00 (Sun)
  59418014400, #  local_start 1883-11-18 12:00:00 (Sun)
  60502384800, #    local_end 1918-03-31 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  60502410000, #    utc_start 1918-03-31 09:00:00 (Sun)
  60520550400, #      utc_end 1918-10-27 08:00:00 (Sun)
  60502388400, #  local_start 1918-03-31 03:00:00 (Sun)
  60520528800, #    local_end 1918-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  60520550400, #    utc_start 1918-10-27 08:00:00 (Sun)
  60533859600, #      utc_end 1919-03-30 09:00:00 (Sun)
  60520525200, #  local_start 1918-10-27 01:00:00 (Sun)
  60533834400, #    local_end 1919-03-30 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  60533859600, #    utc_start 1919-03-30 09:00:00 (Sun)
  60552000000, #      utc_end 1919-10-26 08:00:00 (Sun)
  60533838000, #  local_start 1919-03-30 03:00:00 (Sun)
  60551978400, #    local_end 1919-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  60552000000, #    utc_start 1919-10-26 08:00:00 (Sun)
  60557785200, #      utc_end 1920-01-01 07:00:00 (Thu)
  60551974800, #  local_start 1919-10-26 01:00:00 (Sun)
  60557760000, #    local_end 1920-01-01 00:00:00 (Thu)
  -25200,
  0,
  'MST',
      ],
      [
  60557785200, #    utc_start 1920-01-01 07:00:00 (Thu)
  60565309200, #      utc_end 1920-03-28 09:00:00 (Sun)
  60557760000, #  local_start 1920-01-01 00:00:00 (Thu)
  60565284000, #    local_end 1920-03-28 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  60565309200, #    utc_start 1920-03-28 09:00:00 (Sun)
  60584054400, #      utc_end 1920-10-31 08:00:00 (Sun)
  60565287600, #  local_start 1920-03-28 03:00:00 (Sun)
  60584032800, #    local_end 1920-10-31 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  60584054400, #    utc_start 1920-10-31 08:00:00 (Sun)
  60596758800, #      utc_end 1921-03-27 09:00:00 (Sun)
  60584029200, #  local_start 1920-10-31 01:00:00 (Sun)
  60596733600, #    local_end 1921-03-27 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  60596758800, #    utc_start 1921-03-27 09:00:00 (Sun)
  60601593600, #      utc_end 1921-05-22 08:00:00 (Sun)
  60596737200, #  local_start 1921-03-27 03:00:00 (Sun)
  60601572000, #    local_end 1921-05-22 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  60601593600, #    utc_start 1921-05-22 08:00:00 (Sun)
  61252095600, #      utc_end 1942-01-01 07:00:00 (Thu)
  60601568400, #  local_start 1921-05-22 01:00:00 (Sun)
  61252070400, #    local_end 1942-01-01 00:00:00 (Thu)
  -25200,
  0,
  'MST',
      ],
      [
  61252095600, #    utc_start 1942-01-01 07:00:00 (Thu)
  61255472400, #      utc_end 1942-02-09 09:00:00 (Mon)
  61252070400, #  local_start 1942-01-01 00:00:00 (Thu)
  61255447200, #    local_end 1942-02-09 02:00:00 (Mon)
  -25200,
  0,
  'MST',
      ],
      [
  61255472400, #    utc_start 1942-02-09 09:00:00 (Mon)
  61366287600, #      utc_end 1945-08-14 23:00:00 (Tue)
  61255450800, #  local_start 1942-02-09 03:00:00 (Mon)
  61366266000, #    local_end 1945-08-14 17:00:00 (Tue)
  -21600,
  1,
  'MWT',
      ],
      [
  61366287600, #    utc_start 1945-08-14 23:00:00 (Tue)
  61370294400, #      utc_end 1945-09-30 08:00:00 (Sun)
  61366266000, #  local_start 1945-08-14 17:00:00 (Tue)
  61370272800, #    local_end 1945-09-30 02:00:00 (Sun)
  -21600,
  1,
  'MPT',
      ],
      [
  61370294400, #    utc_start 1945-09-30 08:00:00 (Sun)
  61378326000, #      utc_end 1946-01-01 07:00:00 (Tue)
  61370269200, #  local_start 1945-09-30 01:00:00 (Sun)
  61378300800, #    local_end 1946-01-01 00:00:00 (Tue)
  -25200,
  0,
  'MST',
      ],
      [
  61378326000, #    utc_start 1946-01-01 07:00:00 (Tue)
  61987798800, #      utc_end 1965-04-25 09:00:00 (Sun)
  61378300800, #  local_start 1946-01-01 00:00:00 (Tue)
  61987773600, #    local_end 1965-04-25 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  61987798800, #    utc_start 1965-04-25 09:00:00 (Sun)
  62004124800, #      utc_end 1965-10-31 08:00:00 (Sun)
  61987777200, #  local_start 1965-04-25 03:00:00 (Sun)
  62004103200, #    local_end 1965-10-31 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62004124800, #    utc_start 1965-10-31 08:00:00 (Sun)
  62019248400, #      utc_end 1966-04-24 09:00:00 (Sun)
  62004099600, #  local_start 1965-10-31 01:00:00 (Sun)
  62019223200, #    local_end 1966-04-24 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62019248400, #    utc_start 1966-04-24 09:00:00 (Sun)
  62035574400, #      utc_end 1966-10-30 08:00:00 (Sun)
  62019226800, #  local_start 1966-04-24 03:00:00 (Sun)
  62035552800, #    local_end 1966-10-30 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62035574400, #    utc_start 1966-10-30 08:00:00 (Sun)
  62041014000, #      utc_end 1967-01-01 07:00:00 (Sun)
  62035549200, #  local_start 1966-10-30 01:00:00 (Sun)
  62040988800, #    local_end 1967-01-01 00:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62041014000, #    utc_start 1967-01-01 07:00:00 (Sun)
  62051302800, #      utc_end 1967-04-30 09:00:00 (Sun)
  62040988800, #  local_start 1967-01-01 00:00:00 (Sun)
  62051277600, #    local_end 1967-04-30 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62051302800, #    utc_start 1967-04-30 09:00:00 (Sun)
  62067024000, #      utc_end 1967-10-29 08:00:00 (Sun)
  62051281200, #  local_start 1967-04-30 03:00:00 (Sun)
  62067002400, #    local_end 1967-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62067024000, #    utc_start 1967-10-29 08:00:00 (Sun)
  62082752400, #      utc_end 1968-04-28 09:00:00 (Sun)
  62066998800, #  local_start 1967-10-29 01:00:00 (Sun)
  62082727200, #    local_end 1968-04-28 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62082752400, #    utc_start 1968-04-28 09:00:00 (Sun)
  62098473600, #      utc_end 1968-10-27 08:00:00 (Sun)
  62082730800, #  local_start 1968-04-28 03:00:00 (Sun)
  62098452000, #    local_end 1968-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62098473600, #    utc_start 1968-10-27 08:00:00 (Sun)
  62114202000, #      utc_end 1969-04-27 09:00:00 (Sun)
  62098448400, #  local_start 1968-10-27 01:00:00 (Sun)
  62114176800, #    local_end 1969-04-27 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62114202000, #    utc_start 1969-04-27 09:00:00 (Sun)
  62129923200, #      utc_end 1969-10-26 08:00:00 (Sun)
  62114180400, #  local_start 1969-04-27 03:00:00 (Sun)
  62129901600, #    local_end 1969-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62129923200, #    utc_start 1969-10-26 08:00:00 (Sun)
  62145651600, #      utc_end 1970-04-26 09:00:00 (Sun)
  62129898000, #  local_start 1969-10-26 01:00:00 (Sun)
  62145626400, #    local_end 1970-04-26 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62145651600, #    utc_start 1970-04-26 09:00:00 (Sun)
  62161372800, #      utc_end 1970-10-25 08:00:00 (Sun)
  62145630000, #  local_start 1970-04-26 03:00:00 (Sun)
  62161351200, #    local_end 1970-10-25 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62161372800, #    utc_start 1970-10-25 08:00:00 (Sun)
  62177101200, #      utc_end 1971-04-25 09:00:00 (Sun)
  62161347600, #  local_start 1970-10-25 01:00:00 (Sun)
  62177076000, #    local_end 1971-04-25 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62177101200, #    utc_start 1971-04-25 09:00:00 (Sun)
  62193427200, #      utc_end 1971-10-31 08:00:00 (Sun)
  62177079600, #  local_start 1971-04-25 03:00:00 (Sun)
  62193405600, #    local_end 1971-10-31 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62193427200, #    utc_start 1971-10-31 08:00:00 (Sun)
  62209155600, #      utc_end 1972-04-30 09:00:00 (Sun)
  62193402000, #  local_start 1971-10-31 01:00:00 (Sun)
  62209130400, #    local_end 1972-04-30 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62209155600, #    utc_start 1972-04-30 09:00:00 (Sun)
  62224876800, #      utc_end 1972-10-29 08:00:00 (Sun)
  62209134000, #  local_start 1972-04-30 03:00:00 (Sun)
  62224855200, #    local_end 1972-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62224876800, #    utc_start 1972-10-29 08:00:00 (Sun)
  62240605200, #      utc_end 1973-04-29 09:00:00 (Sun)
  62224851600, #  local_start 1972-10-29 01:00:00 (Sun)
  62240580000, #    local_end 1973-04-29 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62240605200, #    utc_start 1973-04-29 09:00:00 (Sun)
  62256326400, #      utc_end 1973-10-28 08:00:00 (Sun)
  62240583600, #  local_start 1973-04-29 03:00:00 (Sun)
  62256304800, #    local_end 1973-10-28 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62256326400, #    utc_start 1973-10-28 08:00:00 (Sun)
  62262378000, #      utc_end 1974-01-06 09:00:00 (Sun)
  62256301200, #  local_start 1973-10-28 01:00:00 (Sun)
  62262352800, #    local_end 1974-01-06 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62262378000, #    utc_start 1974-01-06 09:00:00 (Sun)
  62287776000, #      utc_end 1974-10-27 08:00:00 (Sun)
  62262356400, #  local_start 1974-01-06 03:00:00 (Sun)
  62287754400, #    local_end 1974-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62287776000, #    utc_start 1974-10-27 08:00:00 (Sun)
  62298061200, #      utc_end 1975-02-23 09:00:00 (Sun)
  62287750800, #  local_start 1974-10-27 01:00:00 (Sun)
  62298036000, #    local_end 1975-02-23 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62298061200, #    utc_start 1975-02-23 09:00:00 (Sun)
  62319225600, #      utc_end 1975-10-26 08:00:00 (Sun)
  62298039600, #  local_start 1975-02-23 03:00:00 (Sun)
  62319204000, #    local_end 1975-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62319225600, #    utc_start 1975-10-26 08:00:00 (Sun)
  62334954000, #      utc_end 1976-04-25 09:00:00 (Sun)
  62319200400, #  local_start 1975-10-26 01:00:00 (Sun)
  62334928800, #    local_end 1976-04-25 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62334954000, #    utc_start 1976-04-25 09:00:00 (Sun)
  62351280000, #      utc_end 1976-10-31 08:00:00 (Sun)
  62334932400, #  local_start 1976-04-25 03:00:00 (Sun)
  62351258400, #    local_end 1976-10-31 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62351280000, #    utc_start 1976-10-31 08:00:00 (Sun)
  62366403600, #      utc_end 1977-04-24 09:00:00 (Sun)
  62351254800, #  local_start 1976-10-31 01:00:00 (Sun)
  62366378400, #    local_end 1977-04-24 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62366403600, #    utc_start 1977-04-24 09:00:00 (Sun)
  62382729600, #      utc_end 1977-10-30 08:00:00 (Sun)
  62366382000, #  local_start 1977-04-24 03:00:00 (Sun)
  62382708000, #    local_end 1977-10-30 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62382729600, #    utc_start 1977-10-30 08:00:00 (Sun)
  62398458000, #      utc_end 1978-04-30 09:00:00 (Sun)
  62382704400, #  local_start 1977-10-30 01:00:00 (Sun)
  62398432800, #    local_end 1978-04-30 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62398458000, #    utc_start 1978-04-30 09:00:00 (Sun)
  62414179200, #      utc_end 1978-10-29 08:00:00 (Sun)
  62398436400, #  local_start 1978-04-30 03:00:00 (Sun)
  62414157600, #    local_end 1978-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62414179200, #    utc_start 1978-10-29 08:00:00 (Sun)
  62429907600, #      utc_end 1979-04-29 09:00:00 (Sun)
  62414154000, #  local_start 1978-10-29 01:00:00 (Sun)
  62429882400, #    local_end 1979-04-29 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62429907600, #    utc_start 1979-04-29 09:00:00 (Sun)
  62445628800, #      utc_end 1979-10-28 08:00:00 (Sun)
  62429886000, #  local_start 1979-04-29 03:00:00 (Sun)
  62445607200, #    local_end 1979-10-28 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62445628800, #    utc_start 1979-10-28 08:00:00 (Sun)
  62461357200, #      utc_end 1980-04-27 09:00:00 (Sun)
  62445603600, #  local_start 1979-10-28 01:00:00 (Sun)
  62461332000, #    local_end 1980-04-27 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62461357200, #    utc_start 1980-04-27 09:00:00 (Sun)
  62477078400, #      utc_end 1980-10-26 08:00:00 (Sun)
  62461335600, #  local_start 1980-04-27 03:00:00 (Sun)
  62477056800, #    local_end 1980-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62477078400, #    utc_start 1980-10-26 08:00:00 (Sun)
  62492806800, #      utc_end 1981-04-26 09:00:00 (Sun)
  62477053200, #  local_start 1980-10-26 01:00:00 (Sun)
  62492781600, #    local_end 1981-04-26 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62492806800, #    utc_start 1981-04-26 09:00:00 (Sun)
  62508528000, #      utc_end 1981-10-25 08:00:00 (Sun)
  62492785200, #  local_start 1981-04-26 03:00:00 (Sun)
  62508506400, #    local_end 1981-10-25 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62508528000, #    utc_start 1981-10-25 08:00:00 (Sun)
  62524256400, #      utc_end 1982-04-25 09:00:00 (Sun)
  62508502800, #  local_start 1981-10-25 01:00:00 (Sun)
  62524231200, #    local_end 1982-04-25 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62524256400, #    utc_start 1982-04-25 09:00:00 (Sun)
  62540582400, #      utc_end 1982-10-31 08:00:00 (Sun)
  62524234800, #  local_start 1982-04-25 03:00:00 (Sun)
  62540560800, #    local_end 1982-10-31 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62540582400, #    utc_start 1982-10-31 08:00:00 (Sun)
  62555706000, #      utc_end 1983-04-24 09:00:00 (Sun)
  62540557200, #  local_start 1982-10-31 01:00:00 (Sun)
  62555680800, #    local_end 1983-04-24 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62555706000, #    utc_start 1983-04-24 09:00:00 (Sun)
  62572032000, #      utc_end 1983-10-30 08:00:00 (Sun)
  62555684400, #  local_start 1983-04-24 03:00:00 (Sun)
  62572010400, #    local_end 1983-10-30 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62572032000, #    utc_start 1983-10-30 08:00:00 (Sun)
  62587760400, #      utc_end 1984-04-29 09:00:00 (Sun)
  62572006800, #  local_start 1983-10-30 01:00:00 (Sun)
  62587735200, #    local_end 1984-04-29 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62587760400, #    utc_start 1984-04-29 09:00:00 (Sun)
  62603481600, #      utc_end 1984-10-28 08:00:00 (Sun)
  62587738800, #  local_start 1984-04-29 03:00:00 (Sun)
  62603460000, #    local_end 1984-10-28 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62603481600, #    utc_start 1984-10-28 08:00:00 (Sun)
  62619210000, #      utc_end 1985-04-28 09:00:00 (Sun)
  62603456400, #  local_start 1984-10-28 01:00:00 (Sun)
  62619184800, #    local_end 1985-04-28 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62619210000, #    utc_start 1985-04-28 09:00:00 (Sun)
  62634931200, #      utc_end 1985-10-27 08:00:00 (Sun)
  62619188400, #  local_start 1985-04-28 03:00:00 (Sun)
  62634909600, #    local_end 1985-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62634931200, #    utc_start 1985-10-27 08:00:00 (Sun)
  62650659600, #      utc_end 1986-04-27 09:00:00 (Sun)
  62634906000, #  local_start 1985-10-27 01:00:00 (Sun)
  62650634400, #    local_end 1986-04-27 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62650659600, #    utc_start 1986-04-27 09:00:00 (Sun)
  62666380800, #      utc_end 1986-10-26 08:00:00 (Sun)
  62650638000, #  local_start 1986-04-27 03:00:00 (Sun)
  62666359200, #    local_end 1986-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62666380800, #    utc_start 1986-10-26 08:00:00 (Sun)
  62680294800, #      utc_end 1987-04-05 09:00:00 (Sun)
  62666355600, #  local_start 1986-10-26 01:00:00 (Sun)
  62680269600, #    local_end 1987-04-05 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62680294800, #    utc_start 1987-04-05 09:00:00 (Sun)
  62697830400, #      utc_end 1987-10-25 08:00:00 (Sun)
  62680273200, #  local_start 1987-04-05 03:00:00 (Sun)
  62697808800, #    local_end 1987-10-25 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62697830400, #    utc_start 1987-10-25 08:00:00 (Sun)
  62711744400, #      utc_end 1988-04-03 09:00:00 (Sun)
  62697805200, #  local_start 1987-10-25 01:00:00 (Sun)
  62711719200, #    local_end 1988-04-03 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62711744400, #    utc_start 1988-04-03 09:00:00 (Sun)
  62729884800, #      utc_end 1988-10-30 08:00:00 (Sun)
  62711722800, #  local_start 1988-04-03 03:00:00 (Sun)
  62729863200, #    local_end 1988-10-30 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62729884800, #    utc_start 1988-10-30 08:00:00 (Sun)
  62743194000, #      utc_end 1989-04-02 09:00:00 (Sun)
  62729859600, #  local_start 1988-10-30 01:00:00 (Sun)
  62743168800, #    local_end 1989-04-02 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62743194000, #    utc_start 1989-04-02 09:00:00 (Sun)
  62761334400, #      utc_end 1989-10-29 08:00:00 (Sun)
  62743172400, #  local_start 1989-04-02 03:00:00 (Sun)
  62761312800, #    local_end 1989-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62761334400, #    utc_start 1989-10-29 08:00:00 (Sun)
  62774643600, #      utc_end 1990-04-01 09:00:00 (Sun)
  62761309200, #  local_start 1989-10-29 01:00:00 (Sun)
  62774618400, #    local_end 1990-04-01 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62774643600, #    utc_start 1990-04-01 09:00:00 (Sun)
  62792784000, #      utc_end 1990-10-28 08:00:00 (Sun)
  62774622000, #  local_start 1990-04-01 03:00:00 (Sun)
  62792762400, #    local_end 1990-10-28 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62792784000, #    utc_start 1990-10-28 08:00:00 (Sun)
  62806698000, #      utc_end 1991-04-07 09:00:00 (Sun)
  62792758800, #  local_start 1990-10-28 01:00:00 (Sun)
  62806672800, #    local_end 1991-04-07 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62806698000, #    utc_start 1991-04-07 09:00:00 (Sun)
  62824233600, #      utc_end 1991-10-27 08:00:00 (Sun)
  62806676400, #  local_start 1991-04-07 03:00:00 (Sun)
  62824212000, #    local_end 1991-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62824233600, #    utc_start 1991-10-27 08:00:00 (Sun)
  62838147600, #      utc_end 1992-04-05 09:00:00 (Sun)
  62824208400, #  local_start 1991-10-27 01:00:00 (Sun)
  62838122400, #    local_end 1992-04-05 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62838147600, #    utc_start 1992-04-05 09:00:00 (Sun)
  62855683200, #      utc_end 1992-10-25 08:00:00 (Sun)
  62838126000, #  local_start 1992-04-05 03:00:00 (Sun)
  62855661600, #    local_end 1992-10-25 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62855683200, #    utc_start 1992-10-25 08:00:00 (Sun)
  62869597200, #      utc_end 1993-04-04 09:00:00 (Sun)
  62855658000, #  local_start 1992-10-25 01:00:00 (Sun)
  62869572000, #    local_end 1993-04-04 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62869597200, #    utc_start 1993-04-04 09:00:00 (Sun)
  62887737600, #      utc_end 1993-10-31 08:00:00 (Sun)
  62869575600, #  local_start 1993-04-04 03:00:00 (Sun)
  62887716000, #    local_end 1993-10-31 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62887737600, #    utc_start 1993-10-31 08:00:00 (Sun)
  62901046800, #      utc_end 1994-04-03 09:00:00 (Sun)
  62887712400, #  local_start 1993-10-31 01:00:00 (Sun)
  62901021600, #    local_end 1994-04-03 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62901046800, #    utc_start 1994-04-03 09:00:00 (Sun)
  62919187200, #      utc_end 1994-10-30 08:00:00 (Sun)
  62901025200, #  local_start 1994-04-03 03:00:00 (Sun)
  62919165600, #    local_end 1994-10-30 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62919187200, #    utc_start 1994-10-30 08:00:00 (Sun)
  62932496400, #      utc_end 1995-04-02 09:00:00 (Sun)
  62919162000, #  local_start 1994-10-30 01:00:00 (Sun)
  62932471200, #    local_end 1995-04-02 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62932496400, #    utc_start 1995-04-02 09:00:00 (Sun)
  62950636800, #      utc_end 1995-10-29 08:00:00 (Sun)
  62932474800, #  local_start 1995-04-02 03:00:00 (Sun)
  62950615200, #    local_end 1995-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62950636800, #    utc_start 1995-10-29 08:00:00 (Sun)
  62964550800, #      utc_end 1996-04-07 09:00:00 (Sun)
  62950611600, #  local_start 1995-10-29 01:00:00 (Sun)
  62964525600, #    local_end 1996-04-07 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62964550800, #    utc_start 1996-04-07 09:00:00 (Sun)
  62982086400, #      utc_end 1996-10-27 08:00:00 (Sun)
  62964529200, #  local_start 1996-04-07 03:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62982086400, #    utc_start 1996-10-27 08:00:00 (Sun)
  62996000400, #      utc_end 1997-04-06 09:00:00 (Sun)
  62982061200, #  local_start 1996-10-27 01:00:00 (Sun)
  62995975200, #    local_end 1997-04-06 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62996000400, #    utc_start 1997-04-06 09:00:00 (Sun)
  63013536000, #      utc_end 1997-10-26 08:00:00 (Sun)
  62995978800, #  local_start 1997-04-06 03:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63013536000, #    utc_start 1997-10-26 08:00:00 (Sun)
  63027450000, #      utc_end 1998-04-05 09:00:00 (Sun)
  63013510800, #  local_start 1997-10-26 01:00:00 (Sun)
  63027424800, #    local_end 1998-04-05 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63027450000, #    utc_start 1998-04-05 09:00:00 (Sun)
  63044985600, #      utc_end 1998-10-25 08:00:00 (Sun)
  63027428400, #  local_start 1998-04-05 03:00:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63044985600, #    utc_start 1998-10-25 08:00:00 (Sun)
  63058899600, #      utc_end 1999-04-04 09:00:00 (Sun)
  63044960400, #  local_start 1998-10-25 01:00:00 (Sun)
  63058874400, #    local_end 1999-04-04 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63058899600, #    utc_start 1999-04-04 09:00:00 (Sun)
  63077040000, #      utc_end 1999-10-31 08:00:00 (Sun)
  63058878000, #  local_start 1999-04-04 03:00:00 (Sun)
  63077018400, #    local_end 1999-10-31 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63077040000, #    utc_start 1999-10-31 08:00:00 (Sun)
  63090349200, #      utc_end 2000-04-02 09:00:00 (Sun)
  63077014800, #  local_start 1999-10-31 01:00:00 (Sun)
  63090324000, #    local_end 2000-04-02 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63090349200, #    utc_start 2000-04-02 09:00:00 (Sun)
  63108489600, #      utc_end 2000-10-29 08:00:00 (Sun)
  63090327600, #  local_start 2000-04-02 03:00:00 (Sun)
  63108468000, #    local_end 2000-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63108489600, #    utc_start 2000-10-29 08:00:00 (Sun)
  63121798800, #      utc_end 2001-04-01 09:00:00 (Sun)
  63108464400, #  local_start 2000-10-29 01:00:00 (Sun)
  63121773600, #    local_end 2001-04-01 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63121798800, #    utc_start 2001-04-01 09:00:00 (Sun)
  63139939200, #      utc_end 2001-10-28 08:00:00 (Sun)
  63121777200, #  local_start 2001-04-01 03:00:00 (Sun)
  63139917600, #    local_end 2001-10-28 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63139939200, #    utc_start 2001-10-28 08:00:00 (Sun)
  63153853200, #      utc_end 2002-04-07 09:00:00 (Sun)
  63139914000, #  local_start 2001-10-28 01:00:00 (Sun)
  63153828000, #    local_end 2002-04-07 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63153853200, #    utc_start 2002-04-07 09:00:00 (Sun)
  63171388800, #      utc_end 2002-10-27 08:00:00 (Sun)
  63153831600, #  local_start 2002-04-07 03:00:00 (Sun)
  63171367200, #    local_end 2002-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63171388800, #    utc_start 2002-10-27 08:00:00 (Sun)
  63185302800, #      utc_end 2003-04-06 09:00:00 (Sun)
  63171363600, #  local_start 2002-10-27 01:00:00 (Sun)
  63185277600, #    local_end 2003-04-06 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63185302800, #    utc_start 2003-04-06 09:00:00 (Sun)
  63202838400, #      utc_end 2003-10-26 08:00:00 (Sun)
  63185281200, #  local_start 2003-04-06 03:00:00 (Sun)
  63202816800, #    local_end 2003-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63202838400, #    utc_start 2003-10-26 08:00:00 (Sun)
  63216752400, #      utc_end 2004-04-04 09:00:00 (Sun)
  63202813200, #  local_start 2003-10-26 01:00:00 (Sun)
  63216727200, #    local_end 2004-04-04 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63216752400, #    utc_start 2004-04-04 09:00:00 (Sun)
  63234892800, #      utc_end 2004-10-31 08:00:00 (Sun)
  63216730800, #  local_start 2004-04-04 03:00:00 (Sun)
  63234871200, #    local_end 2004-10-31 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63234892800, #    utc_start 2004-10-31 08:00:00 (Sun)
  63248202000, #      utc_end 2005-04-03 09:00:00 (Sun)
  63234867600, #  local_start 2004-10-31 01:00:00 (Sun)
  63248176800, #    local_end 2005-04-03 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63248202000, #    utc_start 2005-04-03 09:00:00 (Sun)
  63266342400, #      utc_end 2005-10-30 08:00:00 (Sun)
  63248180400, #  local_start 2005-04-03 03:00:00 (Sun)
  63266320800, #    local_end 2005-10-30 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63266342400, #    utc_start 2005-10-30 08:00:00 (Sun)
  63279651600, #      utc_end 2006-04-02 09:00:00 (Sun)
  63266317200, #  local_start 2005-10-30 01:00:00 (Sun)
  63279626400, #    local_end 2006-04-02 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63279651600, #    utc_start 2006-04-02 09:00:00 (Sun)
  63297792000, #      utc_end 2006-10-29 08:00:00 (Sun)
  63279630000, #  local_start 2006-04-02 03:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63297792000, #    utc_start 2006-10-29 08:00:00 (Sun)
  63309286800, #      utc_end 2007-03-11 09:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63309261600, #    local_end 2007-03-11 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63309286800, #    utc_start 2007-03-11 09:00:00 (Sun)
  63329846400, #      utc_end 2007-11-04 08:00:00 (Sun)
  63309265200, #  local_start 2007-03-11 03:00:00 (Sun)
  63329824800, #    local_end 2007-11-04 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63329846400, #    utc_start 2007-11-04 08:00:00 (Sun)
  63340736400, #      utc_end 2008-03-09 09:00:00 (Sun)
  63329821200, #  local_start 2007-11-04 01:00:00 (Sun)
  63340711200, #    local_end 2008-03-09 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63340736400, #    utc_start 2008-03-09 09:00:00 (Sun)
  63361296000, #      utc_end 2008-11-02 08:00:00 (Sun)
  63340714800, #  local_start 2008-03-09 03:00:00 (Sun)
  63361274400, #    local_end 2008-11-02 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63361296000, #    utc_start 2008-11-02 08:00:00 (Sun)
  63372186000, #      utc_end 2009-03-08 09:00:00 (Sun)
  63361270800, #  local_start 2008-11-02 01:00:00 (Sun)
  63372160800, #    local_end 2009-03-08 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63372186000, #    utc_start 2009-03-08 09:00:00 (Sun)
  63392745600, #      utc_end 2009-11-01 08:00:00 (Sun)
  63372164400, #  local_start 2009-03-08 03:00:00 (Sun)
  63392724000, #    local_end 2009-11-01 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63392745600, #    utc_start 2009-11-01 08:00:00 (Sun)
  63404240400, #      utc_end 2010-03-14 09:00:00 (Sun)
  63392720400, #  local_start 2009-11-01 01:00:00 (Sun)
  63404215200, #    local_end 2010-03-14 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63404240400, #    utc_start 2010-03-14 09:00:00 (Sun)
  63424800000, #      utc_end 2010-11-07 08:00:00 (Sun)
  63404218800, #  local_start 2010-03-14 03:00:00 (Sun)
  63424778400, #    local_end 2010-11-07 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63424800000, #    utc_start 2010-11-07 08:00:00 (Sun)
  63435690000, #      utc_end 2011-03-13 09:00:00 (Sun)
  63424774800, #  local_start 2010-11-07 01:00:00 (Sun)
  63435664800, #    local_end 2011-03-13 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63435690000, #    utc_start 2011-03-13 09:00:00 (Sun)
  63456249600, #      utc_end 2011-11-06 08:00:00 (Sun)
  63435668400, #  local_start 2011-03-13 03:00:00 (Sun)
  63456228000, #    local_end 2011-11-06 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63456249600, #    utc_start 2011-11-06 08:00:00 (Sun)
  63467139600, #      utc_end 2012-03-11 09:00:00 (Sun)
  63456224400, #  local_start 2011-11-06 01:00:00 (Sun)
  63467114400, #    local_end 2012-03-11 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63467139600, #    utc_start 2012-03-11 09:00:00 (Sun)
  63487699200, #      utc_end 2012-11-04 08:00:00 (Sun)
  63467118000, #  local_start 2012-03-11 03:00:00 (Sun)
  63487677600, #    local_end 2012-11-04 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63487699200, #    utc_start 2012-11-04 08:00:00 (Sun)
  63498589200, #      utc_end 2013-03-10 09:00:00 (Sun)
  63487674000, #  local_start 2012-11-04 01:00:00 (Sun)
  63498564000, #    local_end 2013-03-10 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63498589200, #    utc_start 2013-03-10 09:00:00 (Sun)
  63519148800, #      utc_end 2013-11-03 08:00:00 (Sun)
  63498567600, #  local_start 2013-03-10 03:00:00 (Sun)
  63519127200, #    local_end 2013-11-03 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63519148800, #    utc_start 2013-11-03 08:00:00 (Sun)
  63530038800, #      utc_end 2014-03-09 09:00:00 (Sun)
  63519123600, #  local_start 2013-11-03 01:00:00 (Sun)
  63530013600, #    local_end 2014-03-09 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63530038800, #    utc_start 2014-03-09 09:00:00 (Sun)
  63550598400, #      utc_end 2014-11-02 08:00:00 (Sun)
  63530017200, #  local_start 2014-03-09 03:00:00 (Sun)
  63550576800, #    local_end 2014-11-02 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63550598400, #    utc_start 2014-11-02 08:00:00 (Sun)
  63561488400, #      utc_end 2015-03-08 09:00:00 (Sun)
  63550573200, #  local_start 2014-11-02 01:00:00 (Sun)
  63561463200, #    local_end 2015-03-08 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63561488400, #    utc_start 2015-03-08 09:00:00 (Sun)
  63582048000, #      utc_end 2015-11-01 08:00:00 (Sun)
  63561466800, #  local_start 2015-03-08 03:00:00 (Sun)
  63582026400, #    local_end 2015-11-01 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63582048000, #    utc_start 2015-11-01 08:00:00 (Sun)
  63593542800, #      utc_end 2016-03-13 09:00:00 (Sun)
  63582022800, #  local_start 2015-11-01 01:00:00 (Sun)
  63593517600, #    local_end 2016-03-13 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63593542800, #    utc_start 2016-03-13 09:00:00 (Sun)
  63614102400, #      utc_end 2016-11-06 08:00:00 (Sun)
  63593521200, #  local_start 2016-03-13 03:00:00 (Sun)
  63614080800, #    local_end 2016-11-06 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63614102400, #    utc_start 2016-11-06 08:00:00 (Sun)
  63624992400, #      utc_end 2017-03-12 09:00:00 (Sun)
  63614077200, #  local_start 2016-11-06 01:00:00 (Sun)
  63624967200, #    local_end 2017-03-12 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63624992400, #    utc_start 2017-03-12 09:00:00 (Sun)
  63645552000, #      utc_end 2017-11-05 08:00:00 (Sun)
  63624970800, #  local_start 2017-03-12 03:00:00 (Sun)
  63645530400, #    local_end 2017-11-05 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63645552000, #    utc_start 2017-11-05 08:00:00 (Sun)
  63656442000, #      utc_end 2018-03-11 09:00:00 (Sun)
  63645526800, #  local_start 2017-11-05 01:00:00 (Sun)
  63656416800, #    local_end 2018-03-11 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63656442000, #    utc_start 2018-03-11 09:00:00 (Sun)
  63677001600, #      utc_end 2018-11-04 08:00:00 (Sun)
  63656420400, #  local_start 2018-03-11 03:00:00 (Sun)
  63676980000, #    local_end 2018-11-04 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63677001600, #    utc_start 2018-11-04 08:00:00 (Sun)
  63687891600, #      utc_end 2019-03-10 09:00:00 (Sun)
  63676976400, #  local_start 2018-11-04 01:00:00 (Sun)
  63687866400, #    local_end 2019-03-10 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63687891600, #    utc_start 2019-03-10 09:00:00 (Sun)
  63708451200, #      utc_end 2019-11-03 08:00:00 (Sun)
  63687870000, #  local_start 2019-03-10 03:00:00 (Sun)
  63708429600, #    local_end 2019-11-03 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63708451200, #    utc_start 2019-11-03 08:00:00 (Sun)
  63719341200, #      utc_end 2020-03-08 09:00:00 (Sun)
  63708426000, #  local_start 2019-11-03 01:00:00 (Sun)
  63719316000, #    local_end 2020-03-08 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63719341200, #    utc_start 2020-03-08 09:00:00 (Sun)
  63739900800, #      utc_end 2020-11-01 08:00:00 (Sun)
  63719319600, #  local_start 2020-03-08 03:00:00 (Sun)
  63739879200, #    local_end 2020-11-01 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63739900800, #    utc_start 2020-11-01 08:00:00 (Sun)
  63751395600, #      utc_end 2021-03-14 09:00:00 (Sun)
  63739875600, #  local_start 2020-11-01 01:00:00 (Sun)
  63751370400, #    local_end 2021-03-14 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63751395600, #    utc_start 2021-03-14 09:00:00 (Sun)
  63771955200, #      utc_end 2021-11-07 08:00:00 (Sun)
  63751374000, #  local_start 2021-03-14 03:00:00 (Sun)
  63771933600, #    local_end 2021-11-07 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63771955200, #    utc_start 2021-11-07 08:00:00 (Sun)
  63782845200, #      utc_end 2022-03-13 09:00:00 (Sun)
  63771930000, #  local_start 2021-11-07 01:00:00 (Sun)
  63782820000, #    local_end 2022-03-13 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63782845200, #    utc_start 2022-03-13 09:00:00 (Sun)
  63803404800, #      utc_end 2022-11-06 08:00:00 (Sun)
  63782823600, #  local_start 2022-03-13 03:00:00 (Sun)
  63803383200, #    local_end 2022-11-06 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63803404800, #    utc_start 2022-11-06 08:00:00 (Sun)
  63814294800, #      utc_end 2023-03-12 09:00:00 (Sun)
  63803379600, #  local_start 2022-11-06 01:00:00 (Sun)
  63814269600, #    local_end 2023-03-12 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63814294800, #    utc_start 2023-03-12 09:00:00 (Sun)
  63834854400, #      utc_end 2023-11-05 08:00:00 (Sun)
  63814273200, #  local_start 2023-03-12 03:00:00 (Sun)
  63834832800, #    local_end 2023-11-05 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63834854400, #    utc_start 2023-11-05 08:00:00 (Sun)
  63845744400, #      utc_end 2024-03-10 09:00:00 (Sun)
  63834829200, #  local_start 2023-11-05 01:00:00 (Sun)
  63845719200, #    local_end 2024-03-10 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63845744400, #    utc_start 2024-03-10 09:00:00 (Sun)
  63866304000, #      utc_end 2024-11-03 08:00:00 (Sun)
  63845722800, #  local_start 2024-03-10 03:00:00 (Sun)
  63866282400, #    local_end 2024-11-03 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63866304000, #    utc_start 2024-11-03 08:00:00 (Sun)
  63877194000, #      utc_end 2025-03-09 09:00:00 (Sun)
  63866278800, #  local_start 2024-11-03 01:00:00 (Sun)
  63877168800, #    local_end 2025-03-09 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63877194000, #    utc_start 2025-03-09 09:00:00 (Sun)
  63897753600, #      utc_end 2025-11-02 08:00:00 (Sun)
  63877172400, #  local_start 2025-03-09 03:00:00 (Sun)
  63897732000, #    local_end 2025-11-02 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63897753600, #    utc_start 2025-11-02 08:00:00 (Sun)
  63908643600, #      utc_end 2026-03-08 09:00:00 (Sun)
  63897728400, #  local_start 2025-11-02 01:00:00 (Sun)
  63908618400, #    local_end 2026-03-08 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63908643600, #    utc_start 2026-03-08 09:00:00 (Sun)
  63929203200, #      utc_end 2026-11-01 08:00:00 (Sun)
  63908622000, #  local_start 2026-03-08 03:00:00 (Sun)
  63929181600, #    local_end 2026-11-01 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63929203200, #    utc_start 2026-11-01 08:00:00 (Sun)
  63940698000, #      utc_end 2027-03-14 09:00:00 (Sun)
  63929178000, #  local_start 2026-11-01 01:00:00 (Sun)
  63940672800, #    local_end 2027-03-14 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63940698000, #    utc_start 2027-03-14 09:00:00 (Sun)
  63961257600, #      utc_end 2027-11-07 08:00:00 (Sun)
  63940676400, #  local_start 2027-03-14 03:00:00 (Sun)
  63961236000, #    local_end 2027-11-07 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63961257600, #    utc_start 2027-11-07 08:00:00 (Sun)
  63972147600, #      utc_end 2028-03-12 09:00:00 (Sun)
  63961232400, #  local_start 2027-11-07 01:00:00 (Sun)
  63972122400, #    local_end 2028-03-12 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63972147600, #    utc_start 2028-03-12 09:00:00 (Sun)
  63992707200, #      utc_end 2028-11-05 08:00:00 (Sun)
  63972126000, #  local_start 2028-03-12 03:00:00 (Sun)
  63992685600, #    local_end 2028-11-05 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63992707200, #    utc_start 2028-11-05 08:00:00 (Sun)
  64003597200, #      utc_end 2029-03-11 09:00:00 (Sun)
  63992682000, #  local_start 2028-11-05 01:00:00 (Sun)
  64003572000, #    local_end 2029-03-11 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  64003597200, #    utc_start 2029-03-11 09:00:00 (Sun)
  64024156800, #      utc_end 2029-11-04 08:00:00 (Sun)
  64003575600, #  local_start 2029-03-11 03:00:00 (Sun)
  64024135200, #    local_end 2029-11-04 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  64024156800, #    utc_start 2029-11-04 08:00:00 (Sun)
  64035046800, #      utc_end 2030-03-10 09:00:00 (Sun)
  64024131600, #  local_start 2029-11-04 01:00:00 (Sun)
  64035021600, #    local_end 2030-03-10 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  64035046800, #    utc_start 2030-03-10 09:00:00 (Sun)
  64055606400, #      utc_end 2030-11-03 08:00:00 (Sun)
  64035025200, #  local_start 2030-03-10 03:00:00 (Sun)
  64055584800, #    local_end 2030-11-03 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {72}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -25200 }
  
  my $last_observance = bless( {
    'format' => 'M%sT',
    'gmtoff' => '-7:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 718067,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 718067,
      'utc_rd_secs' => 0,
      'utc_year' => 1968
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -25200,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 718067,
      'local_rd_secs' => 25200,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 718067,
      'utc_rd_secs' => 25200,
      'utc_year' => 1968
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Nov',
      'letter' => 'S',
      'name' => 'US',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Mar',
      'letter' => 'D',
      'name' => 'US',
      'offset_from_std' => 3600,
      'on' => 'Sun>=8',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_DENVER

    $main::fatpacked{"DateTime/TimeZone/America/Detroit.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_DETROIT';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Detroit;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Detroit::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60084480731, #      utc_end 1905-01-01 05:32:11 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60084460800, #    local_end 1905-01-01 00:00:00 (Sun)
  -19931,
  0,
  'LMT',
      ],
      [
  60084480731, #    utc_start 1905-01-01 05:32:11 (Sun)
  60411600000, #      utc_end 1915-05-15 08:00:00 (Sat)
  60084459131, #  local_start 1904-12-31 23:32:11 (Sat)
  60411578400, #    local_end 1915-05-15 02:00:00 (Sat)
  -21600,
  0,
  'CST',
      ],
      [
  60411600000, #    utc_start 1915-05-15 08:00:00 (Sat)
  61252088400, #      utc_end 1942-01-01 05:00:00 (Thu)
  60411582000, #  local_start 1915-05-15 03:00:00 (Sat)
  61252070400, #    local_end 1942-01-01 00:00:00 (Thu)
  -18000,
  0,
  'EST',
      ],
      [
  61252088400, #    utc_start 1942-01-01 05:00:00 (Thu)
  61255465200, #      utc_end 1942-02-09 07:00:00 (Mon)
  61252070400, #  local_start 1942-01-01 00:00:00 (Thu)
  61255447200, #    local_end 1942-02-09 02:00:00 (Mon)
  -18000,
  0,
  'EST',
      ],
      [
  61255465200, #    utc_start 1942-02-09 07:00:00 (Mon)
  61366287600, #      utc_end 1945-08-14 23:00:00 (Tue)
  61255450800, #  local_start 1942-02-09 03:00:00 (Mon)
  61366273200, #    local_end 1945-08-14 19:00:00 (Tue)
  -14400,
  1,
  'EWT',
      ],
      [
  61366287600, #    utc_start 1945-08-14 23:00:00 (Tue)
  61370287200, #      utc_end 1945-09-30 06:00:00 (Sun)
  61366273200, #  local_start 1945-08-14 19:00:00 (Tue)
  61370272800, #    local_end 1945-09-30 02:00:00 (Sun)
  -14400,
  1,
  'EPT',
      ],
      [
  61370287200, #    utc_start 1945-09-30 06:00:00 (Sun)
  61378318800, #      utc_end 1946-01-01 05:00:00 (Tue)
  61370269200, #  local_start 1945-09-30 01:00:00 (Sun)
  61378300800, #    local_end 1946-01-01 00:00:00 (Tue)
  -18000,
  0,
  'EST',
      ],
      [
  61378318800, #    utc_start 1946-01-01 05:00:00 (Tue)
  61451334000, #      utc_end 1948-04-25 07:00:00 (Sun)
  61378300800, #  local_start 1946-01-01 00:00:00 (Tue)
  61451316000, #    local_end 1948-04-25 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  61451334000, #    utc_start 1948-04-25 07:00:00 (Sun)
  61464636000, #      utc_end 1948-09-26 06:00:00 (Sun)
  61451319600, #  local_start 1948-04-25 03:00:00 (Sun)
  61464621600, #    local_end 1948-09-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  61464636000, #    utc_start 1948-09-26 06:00:00 (Sun)
  62230395600, #      utc_end 1973-01-01 05:00:00 (Mon)
  61464618000, #  local_start 1948-09-26 01:00:00 (Sun)
  62230377600, #    local_end 1973-01-01 00:00:00 (Mon)
  -18000,
  0,
  'EST',
      ],
      [
  62230395600, #    utc_start 1973-01-01 05:00:00 (Mon)
  62240598000, #      utc_end 1973-04-29 07:00:00 (Sun)
  62230377600, #  local_start 1973-01-01 00:00:00 (Mon)
  62240580000, #    local_end 1973-04-29 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62240598000, #    utc_start 1973-04-29 07:00:00 (Sun)
  62256319200, #      utc_end 1973-10-28 06:00:00 (Sun)
  62240583600, #  local_start 1973-04-29 03:00:00 (Sun)
  62256304800, #    local_end 1973-10-28 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62256319200, #    utc_start 1973-10-28 06:00:00 (Sun)
  62262370800, #      utc_end 1974-01-06 07:00:00 (Sun)
  62256301200, #  local_start 1973-10-28 01:00:00 (Sun)
  62262352800, #    local_end 1974-01-06 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62262370800, #    utc_start 1974-01-06 07:00:00 (Sun)
  62287768800, #      utc_end 1974-10-27 06:00:00 (Sun)
  62262356400, #  local_start 1974-01-06 03:00:00 (Sun)
  62287754400, #    local_end 1974-10-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62287768800, #    utc_start 1974-10-27 06:00:00 (Sun)
  62293467600, #      utc_end 1975-01-01 05:00:00 (Wed)
  62287750800, #  local_start 1974-10-27 01:00:00 (Sun)
  62293449600, #    local_end 1975-01-01 00:00:00 (Wed)
  -18000,
  0,
  'EST',
      ],
      [
  62293467600, #    utc_start 1975-01-01 05:00:00 (Wed)
  62303497200, #      utc_end 1975-04-27 07:00:00 (Sun)
  62293449600, #  local_start 1975-01-01 00:00:00 (Wed)
  62303479200, #    local_end 1975-04-27 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62303497200, #    utc_start 1975-04-27 07:00:00 (Sun)
  62319218400, #      utc_end 1975-10-26 06:00:00 (Sun)
  62303482800, #  local_start 1975-04-27 03:00:00 (Sun)
  62319204000, #    local_end 1975-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62319218400, #    utc_start 1975-10-26 06:00:00 (Sun)
  62334946800, #      utc_end 1976-04-25 07:00:00 (Sun)
  62319200400, #  local_start 1975-10-26 01:00:00 (Sun)
  62334928800, #    local_end 1976-04-25 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62334946800, #    utc_start 1976-04-25 07:00:00 (Sun)
  62351272800, #      utc_end 1976-10-31 06:00:00 (Sun)
  62334932400, #  local_start 1976-04-25 03:00:00 (Sun)
  62351258400, #    local_end 1976-10-31 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62351272800, #    utc_start 1976-10-31 06:00:00 (Sun)
  62366396400, #      utc_end 1977-04-24 07:00:00 (Sun)
  62351254800, #  local_start 1976-10-31 01:00:00 (Sun)
  62366378400, #    local_end 1977-04-24 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62366396400, #    utc_start 1977-04-24 07:00:00 (Sun)
  62382722400, #      utc_end 1977-10-30 06:00:00 (Sun)
  62366382000, #  local_start 1977-04-24 03:00:00 (Sun)
  62382708000, #    local_end 1977-10-30 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62382722400, #    utc_start 1977-10-30 06:00:00 (Sun)
  62398450800, #      utc_end 1978-04-30 07:00:00 (Sun)
  62382704400, #  local_start 1977-10-30 01:00:00 (Sun)
  62398432800, #    local_end 1978-04-30 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62398450800, #    utc_start 1978-04-30 07:00:00 (Sun)
  62414172000, #      utc_end 1978-10-29 06:00:00 (Sun)
  62398436400, #  local_start 1978-04-30 03:00:00 (Sun)
  62414157600, #    local_end 1978-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62414172000, #    utc_start 1978-10-29 06:00:00 (Sun)
  62429900400, #      utc_end 1979-04-29 07:00:00 (Sun)
  62414154000, #  local_start 1978-10-29 01:00:00 (Sun)
  62429882400, #    local_end 1979-04-29 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62429900400, #    utc_start 1979-04-29 07:00:00 (Sun)
  62445621600, #      utc_end 1979-10-28 06:00:00 (Sun)
  62429886000, #  local_start 1979-04-29 03:00:00 (Sun)
  62445607200, #    local_end 1979-10-28 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62445621600, #    utc_start 1979-10-28 06:00:00 (Sun)
  62461350000, #      utc_end 1980-04-27 07:00:00 (Sun)
  62445603600, #  local_start 1979-10-28 01:00:00 (Sun)
  62461332000, #    local_end 1980-04-27 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62461350000, #    utc_start 1980-04-27 07:00:00 (Sun)
  62477071200, #      utc_end 1980-10-26 06:00:00 (Sun)
  62461335600, #  local_start 1980-04-27 03:00:00 (Sun)
  62477056800, #    local_end 1980-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62477071200, #    utc_start 1980-10-26 06:00:00 (Sun)
  62492799600, #      utc_end 1981-04-26 07:00:00 (Sun)
  62477053200, #  local_start 1980-10-26 01:00:00 (Sun)
  62492781600, #    local_end 1981-04-26 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62492799600, #    utc_start 1981-04-26 07:00:00 (Sun)
  62508520800, #      utc_end 1981-10-25 06:00:00 (Sun)
  62492785200, #  local_start 1981-04-26 03:00:00 (Sun)
  62508506400, #    local_end 1981-10-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62508520800, #    utc_start 1981-10-25 06:00:00 (Sun)
  62524249200, #      utc_end 1982-04-25 07:00:00 (Sun)
  62508502800, #  local_start 1981-10-25 01:00:00 (Sun)
  62524231200, #    local_end 1982-04-25 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62524249200, #    utc_start 1982-04-25 07:00:00 (Sun)
  62540575200, #      utc_end 1982-10-31 06:00:00 (Sun)
  62524234800, #  local_start 1982-04-25 03:00:00 (Sun)
  62540560800, #    local_end 1982-10-31 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62540575200, #    utc_start 1982-10-31 06:00:00 (Sun)
  62555698800, #      utc_end 1983-04-24 07:00:00 (Sun)
  62540557200, #  local_start 1982-10-31 01:00:00 (Sun)
  62555680800, #    local_end 1983-04-24 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62555698800, #    utc_start 1983-04-24 07:00:00 (Sun)
  62572024800, #      utc_end 1983-10-30 06:00:00 (Sun)
  62555684400, #  local_start 1983-04-24 03:00:00 (Sun)
  62572010400, #    local_end 1983-10-30 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62572024800, #    utc_start 1983-10-30 06:00:00 (Sun)
  62587753200, #      utc_end 1984-04-29 07:00:00 (Sun)
  62572006800, #  local_start 1983-10-30 01:00:00 (Sun)
  62587735200, #    local_end 1984-04-29 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62587753200, #    utc_start 1984-04-29 07:00:00 (Sun)
  62603474400, #      utc_end 1984-10-28 06:00:00 (Sun)
  62587738800, #  local_start 1984-04-29 03:00:00 (Sun)
  62603460000, #    local_end 1984-10-28 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62603474400, #    utc_start 1984-10-28 06:00:00 (Sun)
  62619202800, #      utc_end 1985-04-28 07:00:00 (Sun)
  62603456400, #  local_start 1984-10-28 01:00:00 (Sun)
  62619184800, #    local_end 1985-04-28 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62619202800, #    utc_start 1985-04-28 07:00:00 (Sun)
  62634924000, #      utc_end 1985-10-27 06:00:00 (Sun)
  62619188400, #  local_start 1985-04-28 03:00:00 (Sun)
  62634909600, #    local_end 1985-10-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62634924000, #    utc_start 1985-10-27 06:00:00 (Sun)
  62650652400, #      utc_end 1986-04-27 07:00:00 (Sun)
  62634906000, #  local_start 1985-10-27 01:00:00 (Sun)
  62650634400, #    local_end 1986-04-27 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62650652400, #    utc_start 1986-04-27 07:00:00 (Sun)
  62666373600, #      utc_end 1986-10-26 06:00:00 (Sun)
  62650638000, #  local_start 1986-04-27 03:00:00 (Sun)
  62666359200, #    local_end 1986-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62666373600, #    utc_start 1986-10-26 06:00:00 (Sun)
  62680287600, #      utc_end 1987-04-05 07:00:00 (Sun)
  62666355600, #  local_start 1986-10-26 01:00:00 (Sun)
  62680269600, #    local_end 1987-04-05 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62680287600, #    utc_start 1987-04-05 07:00:00 (Sun)
  62697823200, #      utc_end 1987-10-25 06:00:00 (Sun)
  62680273200, #  local_start 1987-04-05 03:00:00 (Sun)
  62697808800, #    local_end 1987-10-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62697823200, #    utc_start 1987-10-25 06:00:00 (Sun)
  62711737200, #      utc_end 1988-04-03 07:00:00 (Sun)
  62697805200, #  local_start 1987-10-25 01:00:00 (Sun)
  62711719200, #    local_end 1988-04-03 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62711737200, #    utc_start 1988-04-03 07:00:00 (Sun)
  62729877600, #      utc_end 1988-10-30 06:00:00 (Sun)
  62711722800, #  local_start 1988-04-03 03:00:00 (Sun)
  62729863200, #    local_end 1988-10-30 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62729877600, #    utc_start 1988-10-30 06:00:00 (Sun)
  62743186800, #      utc_end 1989-04-02 07:00:00 (Sun)
  62729859600, #  local_start 1988-10-30 01:00:00 (Sun)
  62743168800, #    local_end 1989-04-02 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62743186800, #    utc_start 1989-04-02 07:00:00 (Sun)
  62761327200, #      utc_end 1989-10-29 06:00:00 (Sun)
  62743172400, #  local_start 1989-04-02 03:00:00 (Sun)
  62761312800, #    local_end 1989-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62761327200, #    utc_start 1989-10-29 06:00:00 (Sun)
  62774636400, #      utc_end 1990-04-01 07:00:00 (Sun)
  62761309200, #  local_start 1989-10-29 01:00:00 (Sun)
  62774618400, #    local_end 1990-04-01 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62774636400, #    utc_start 1990-04-01 07:00:00 (Sun)
  62792776800, #      utc_end 1990-10-28 06:00:00 (Sun)
  62774622000, #  local_start 1990-04-01 03:00:00 (Sun)
  62792762400, #    local_end 1990-10-28 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62792776800, #    utc_start 1990-10-28 06:00:00 (Sun)
  62806690800, #      utc_end 1991-04-07 07:00:00 (Sun)
  62792758800, #  local_start 1990-10-28 01:00:00 (Sun)
  62806672800, #    local_end 1991-04-07 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62806690800, #    utc_start 1991-04-07 07:00:00 (Sun)
  62824226400, #      utc_end 1991-10-27 06:00:00 (Sun)
  62806676400, #  local_start 1991-04-07 03:00:00 (Sun)
  62824212000, #    local_end 1991-10-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62824226400, #    utc_start 1991-10-27 06:00:00 (Sun)
  62838140400, #      utc_end 1992-04-05 07:00:00 (Sun)
  62824208400, #  local_start 1991-10-27 01:00:00 (Sun)
  62838122400, #    local_end 1992-04-05 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62838140400, #    utc_start 1992-04-05 07:00:00 (Sun)
  62855676000, #      utc_end 1992-10-25 06:00:00 (Sun)
  62838126000, #  local_start 1992-04-05 03:00:00 (Sun)
  62855661600, #    local_end 1992-10-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62855676000, #    utc_start 1992-10-25 06:00:00 (Sun)
  62869590000, #      utc_end 1993-04-04 07:00:00 (Sun)
  62855658000, #  local_start 1992-10-25 01:00:00 (Sun)
  62869572000, #    local_end 1993-04-04 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62869590000, #    utc_start 1993-04-04 07:00:00 (Sun)
  62887730400, #      utc_end 1993-10-31 06:00:00 (Sun)
  62869575600, #  local_start 1993-04-04 03:00:00 (Sun)
  62887716000, #    local_end 1993-10-31 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62887730400, #    utc_start 1993-10-31 06:00:00 (Sun)
  62901039600, #      utc_end 1994-04-03 07:00:00 (Sun)
  62887712400, #  local_start 1993-10-31 01:00:00 (Sun)
  62901021600, #    local_end 1994-04-03 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62901039600, #    utc_start 1994-04-03 07:00:00 (Sun)
  62919180000, #      utc_end 1994-10-30 06:00:00 (Sun)
  62901025200, #  local_start 1994-04-03 03:00:00 (Sun)
  62919165600, #    local_end 1994-10-30 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62919180000, #    utc_start 1994-10-30 06:00:00 (Sun)
  62932489200, #      utc_end 1995-04-02 07:00:00 (Sun)
  62919162000, #  local_start 1994-10-30 01:00:00 (Sun)
  62932471200, #    local_end 1995-04-02 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62932489200, #    utc_start 1995-04-02 07:00:00 (Sun)
  62950629600, #      utc_end 1995-10-29 06:00:00 (Sun)
  62932474800, #  local_start 1995-04-02 03:00:00 (Sun)
  62950615200, #    local_end 1995-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62950629600, #    utc_start 1995-10-29 06:00:00 (Sun)
  62964543600, #      utc_end 1996-04-07 07:00:00 (Sun)
  62950611600, #  local_start 1995-10-29 01:00:00 (Sun)
  62964525600, #    local_end 1996-04-07 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62964543600, #    utc_start 1996-04-07 07:00:00 (Sun)
  62982079200, #      utc_end 1996-10-27 06:00:00 (Sun)
  62964529200, #  local_start 1996-04-07 03:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62982079200, #    utc_start 1996-10-27 06:00:00 (Sun)
  62995993200, #      utc_end 1997-04-06 07:00:00 (Sun)
  62982061200, #  local_start 1996-10-27 01:00:00 (Sun)
  62995975200, #    local_end 1997-04-06 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62995993200, #    utc_start 1997-04-06 07:00:00 (Sun)
  63013528800, #      utc_end 1997-10-26 06:00:00 (Sun)
  62995978800, #  local_start 1997-04-06 03:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63013528800, #    utc_start 1997-10-26 06:00:00 (Sun)
  63027442800, #      utc_end 1998-04-05 07:00:00 (Sun)
  63013510800, #  local_start 1997-10-26 01:00:00 (Sun)
  63027424800, #    local_end 1998-04-05 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63027442800, #    utc_start 1998-04-05 07:00:00 (Sun)
  63044978400, #      utc_end 1998-10-25 06:00:00 (Sun)
  63027428400, #  local_start 1998-04-05 03:00:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63044978400, #    utc_start 1998-10-25 06:00:00 (Sun)
  63058892400, #      utc_end 1999-04-04 07:00:00 (Sun)
  63044960400, #  local_start 1998-10-25 01:00:00 (Sun)
  63058874400, #    local_end 1999-04-04 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63058892400, #    utc_start 1999-04-04 07:00:00 (Sun)
  63077032800, #      utc_end 1999-10-31 06:00:00 (Sun)
  63058878000, #  local_start 1999-04-04 03:00:00 (Sun)
  63077018400, #    local_end 1999-10-31 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63077032800, #    utc_start 1999-10-31 06:00:00 (Sun)
  63090342000, #      utc_end 2000-04-02 07:00:00 (Sun)
  63077014800, #  local_start 1999-10-31 01:00:00 (Sun)
  63090324000, #    local_end 2000-04-02 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63090342000, #    utc_start 2000-04-02 07:00:00 (Sun)
  63108482400, #      utc_end 2000-10-29 06:00:00 (Sun)
  63090327600, #  local_start 2000-04-02 03:00:00 (Sun)
  63108468000, #    local_end 2000-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63108482400, #    utc_start 2000-10-29 06:00:00 (Sun)
  63121791600, #      utc_end 2001-04-01 07:00:00 (Sun)
  63108464400, #  local_start 2000-10-29 01:00:00 (Sun)
  63121773600, #    local_end 2001-04-01 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63121791600, #    utc_start 2001-04-01 07:00:00 (Sun)
  63139932000, #      utc_end 2001-10-28 06:00:00 (Sun)
  63121777200, #  local_start 2001-04-01 03:00:00 (Sun)
  63139917600, #    local_end 2001-10-28 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63139932000, #    utc_start 2001-10-28 06:00:00 (Sun)
  63153846000, #      utc_end 2002-04-07 07:00:00 (Sun)
  63139914000, #  local_start 2001-10-28 01:00:00 (Sun)
  63153828000, #    local_end 2002-04-07 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63153846000, #    utc_start 2002-04-07 07:00:00 (Sun)
  63171381600, #      utc_end 2002-10-27 06:00:00 (Sun)
  63153831600, #  local_start 2002-04-07 03:00:00 (Sun)
  63171367200, #    local_end 2002-10-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63171381600, #    utc_start 2002-10-27 06:00:00 (Sun)
  63185295600, #      utc_end 2003-04-06 07:00:00 (Sun)
  63171363600, #  local_start 2002-10-27 01:00:00 (Sun)
  63185277600, #    local_end 2003-04-06 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63185295600, #    utc_start 2003-04-06 07:00:00 (Sun)
  63202831200, #      utc_end 2003-10-26 06:00:00 (Sun)
  63185281200, #  local_start 2003-04-06 03:00:00 (Sun)
  63202816800, #    local_end 2003-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63202831200, #    utc_start 2003-10-26 06:00:00 (Sun)
  63216745200, #      utc_end 2004-04-04 07:00:00 (Sun)
  63202813200, #  local_start 2003-10-26 01:00:00 (Sun)
  63216727200, #    local_end 2004-04-04 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63216745200, #    utc_start 2004-04-04 07:00:00 (Sun)
  63234885600, #      utc_end 2004-10-31 06:00:00 (Sun)
  63216730800, #  local_start 2004-04-04 03:00:00 (Sun)
  63234871200, #    local_end 2004-10-31 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63234885600, #    utc_start 2004-10-31 06:00:00 (Sun)
  63248194800, #      utc_end 2005-04-03 07:00:00 (Sun)
  63234867600, #  local_start 2004-10-31 01:00:00 (Sun)
  63248176800, #    local_end 2005-04-03 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63248194800, #    utc_start 2005-04-03 07:00:00 (Sun)
  63266335200, #      utc_end 2005-10-30 06:00:00 (Sun)
  63248180400, #  local_start 2005-04-03 03:00:00 (Sun)
  63266320800, #    local_end 2005-10-30 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63266335200, #    utc_start 2005-10-30 06:00:00 (Sun)
  63279644400, #      utc_end 2006-04-02 07:00:00 (Sun)
  63266317200, #  local_start 2005-10-30 01:00:00 (Sun)
  63279626400, #    local_end 2006-04-02 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63279644400, #    utc_start 2006-04-02 07:00:00 (Sun)
  63297784800, #      utc_end 2006-10-29 06:00:00 (Sun)
  63279630000, #  local_start 2006-04-02 03:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63297784800, #    utc_start 2006-10-29 06:00:00 (Sun)
  63309279600, #      utc_end 2007-03-11 07:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63309261600, #    local_end 2007-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63309279600, #    utc_start 2007-03-11 07:00:00 (Sun)
  63329839200, #      utc_end 2007-11-04 06:00:00 (Sun)
  63309265200, #  local_start 2007-03-11 03:00:00 (Sun)
  63329824800, #    local_end 2007-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63329839200, #    utc_start 2007-11-04 06:00:00 (Sun)
  63340729200, #      utc_end 2008-03-09 07:00:00 (Sun)
  63329821200, #  local_start 2007-11-04 01:00:00 (Sun)
  63340711200, #    local_end 2008-03-09 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63340729200, #    utc_start 2008-03-09 07:00:00 (Sun)
  63361288800, #      utc_end 2008-11-02 06:00:00 (Sun)
  63340714800, #  local_start 2008-03-09 03:00:00 (Sun)
  63361274400, #    local_end 2008-11-02 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63361288800, #    utc_start 2008-11-02 06:00:00 (Sun)
  63372178800, #      utc_end 2009-03-08 07:00:00 (Sun)
  63361270800, #  local_start 2008-11-02 01:00:00 (Sun)
  63372160800, #    local_end 2009-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63372178800, #    utc_start 2009-03-08 07:00:00 (Sun)
  63392738400, #      utc_end 2009-11-01 06:00:00 (Sun)
  63372164400, #  local_start 2009-03-08 03:00:00 (Sun)
  63392724000, #    local_end 2009-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63392738400, #    utc_start 2009-11-01 06:00:00 (Sun)
  63404233200, #      utc_end 2010-03-14 07:00:00 (Sun)
  63392720400, #  local_start 2009-11-01 01:00:00 (Sun)
  63404215200, #    local_end 2010-03-14 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63404233200, #    utc_start 2010-03-14 07:00:00 (Sun)
  63424792800, #      utc_end 2010-11-07 06:00:00 (Sun)
  63404218800, #  local_start 2010-03-14 03:00:00 (Sun)
  63424778400, #    local_end 2010-11-07 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63424792800, #    utc_start 2010-11-07 06:00:00 (Sun)
  63435682800, #      utc_end 2011-03-13 07:00:00 (Sun)
  63424774800, #  local_start 2010-11-07 01:00:00 (Sun)
  63435664800, #    local_end 2011-03-13 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63435682800, #    utc_start 2011-03-13 07:00:00 (Sun)
  63456242400, #      utc_end 2011-11-06 06:00:00 (Sun)
  63435668400, #  local_start 2011-03-13 03:00:00 (Sun)
  63456228000, #    local_end 2011-11-06 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63456242400, #    utc_start 2011-11-06 06:00:00 (Sun)
  63467132400, #      utc_end 2012-03-11 07:00:00 (Sun)
  63456224400, #  local_start 2011-11-06 01:00:00 (Sun)
  63467114400, #    local_end 2012-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63467132400, #    utc_start 2012-03-11 07:00:00 (Sun)
  63487692000, #      utc_end 2012-11-04 06:00:00 (Sun)
  63467118000, #  local_start 2012-03-11 03:00:00 (Sun)
  63487677600, #    local_end 2012-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63487692000, #    utc_start 2012-11-04 06:00:00 (Sun)
  63498582000, #      utc_end 2013-03-10 07:00:00 (Sun)
  63487674000, #  local_start 2012-11-04 01:00:00 (Sun)
  63498564000, #    local_end 2013-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63498582000, #    utc_start 2013-03-10 07:00:00 (Sun)
  63519141600, #      utc_end 2013-11-03 06:00:00 (Sun)
  63498567600, #  local_start 2013-03-10 03:00:00 (Sun)
  63519127200, #    local_end 2013-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63519141600, #    utc_start 2013-11-03 06:00:00 (Sun)
  63530031600, #      utc_end 2014-03-09 07:00:00 (Sun)
  63519123600, #  local_start 2013-11-03 01:00:00 (Sun)
  63530013600, #    local_end 2014-03-09 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63530031600, #    utc_start 2014-03-09 07:00:00 (Sun)
  63550591200, #      utc_end 2014-11-02 06:00:00 (Sun)
  63530017200, #  local_start 2014-03-09 03:00:00 (Sun)
  63550576800, #    local_end 2014-11-02 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63550591200, #    utc_start 2014-11-02 06:00:00 (Sun)
  63561481200, #      utc_end 2015-03-08 07:00:00 (Sun)
  63550573200, #  local_start 2014-11-02 01:00:00 (Sun)
  63561463200, #    local_end 2015-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63561481200, #    utc_start 2015-03-08 07:00:00 (Sun)
  63582040800, #      utc_end 2015-11-01 06:00:00 (Sun)
  63561466800, #  local_start 2015-03-08 03:00:00 (Sun)
  63582026400, #    local_end 2015-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63582040800, #    utc_start 2015-11-01 06:00:00 (Sun)
  63593535600, #      utc_end 2016-03-13 07:00:00 (Sun)
  63582022800, #  local_start 2015-11-01 01:00:00 (Sun)
  63593517600, #    local_end 2016-03-13 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63593535600, #    utc_start 2016-03-13 07:00:00 (Sun)
  63614095200, #      utc_end 2016-11-06 06:00:00 (Sun)
  63593521200, #  local_start 2016-03-13 03:00:00 (Sun)
  63614080800, #    local_end 2016-11-06 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63614095200, #    utc_start 2016-11-06 06:00:00 (Sun)
  63624985200, #      utc_end 2017-03-12 07:00:00 (Sun)
  63614077200, #  local_start 2016-11-06 01:00:00 (Sun)
  63624967200, #    local_end 2017-03-12 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63624985200, #    utc_start 2017-03-12 07:00:00 (Sun)
  63645544800, #      utc_end 2017-11-05 06:00:00 (Sun)
  63624970800, #  local_start 2017-03-12 03:00:00 (Sun)
  63645530400, #    local_end 2017-11-05 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63645544800, #    utc_start 2017-11-05 06:00:00 (Sun)
  63656434800, #      utc_end 2018-03-11 07:00:00 (Sun)
  63645526800, #  local_start 2017-11-05 01:00:00 (Sun)
  63656416800, #    local_end 2018-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63656434800, #    utc_start 2018-03-11 07:00:00 (Sun)
  63676994400, #      utc_end 2018-11-04 06:00:00 (Sun)
  63656420400, #  local_start 2018-03-11 03:00:00 (Sun)
  63676980000, #    local_end 2018-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63676994400, #    utc_start 2018-11-04 06:00:00 (Sun)
  63687884400, #      utc_end 2019-03-10 07:00:00 (Sun)
  63676976400, #  local_start 2018-11-04 01:00:00 (Sun)
  63687866400, #    local_end 2019-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63687884400, #    utc_start 2019-03-10 07:00:00 (Sun)
  63708444000, #      utc_end 2019-11-03 06:00:00 (Sun)
  63687870000, #  local_start 2019-03-10 03:00:00 (Sun)
  63708429600, #    local_end 2019-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63708444000, #    utc_start 2019-11-03 06:00:00 (Sun)
  63719334000, #      utc_end 2020-03-08 07:00:00 (Sun)
  63708426000, #  local_start 2019-11-03 01:00:00 (Sun)
  63719316000, #    local_end 2020-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63719334000, #    utc_start 2020-03-08 07:00:00 (Sun)
  63739893600, #      utc_end 2020-11-01 06:00:00 (Sun)
  63719319600, #  local_start 2020-03-08 03:00:00 (Sun)
  63739879200, #    local_end 2020-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63739893600, #    utc_start 2020-11-01 06:00:00 (Sun)
  63751388400, #      utc_end 2021-03-14 07:00:00 (Sun)
  63739875600, #  local_start 2020-11-01 01:00:00 (Sun)
  63751370400, #    local_end 2021-03-14 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63751388400, #    utc_start 2021-03-14 07:00:00 (Sun)
  63771948000, #      utc_end 2021-11-07 06:00:00 (Sun)
  63751374000, #  local_start 2021-03-14 03:00:00 (Sun)
  63771933600, #    local_end 2021-11-07 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63771948000, #    utc_start 2021-11-07 06:00:00 (Sun)
  63782838000, #      utc_end 2022-03-13 07:00:00 (Sun)
  63771930000, #  local_start 2021-11-07 01:00:00 (Sun)
  63782820000, #    local_end 2022-03-13 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63782838000, #    utc_start 2022-03-13 07:00:00 (Sun)
  63803397600, #      utc_end 2022-11-06 06:00:00 (Sun)
  63782823600, #  local_start 2022-03-13 03:00:00 (Sun)
  63803383200, #    local_end 2022-11-06 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63803397600, #    utc_start 2022-11-06 06:00:00 (Sun)
  63814287600, #      utc_end 2023-03-12 07:00:00 (Sun)
  63803379600, #  local_start 2022-11-06 01:00:00 (Sun)
  63814269600, #    local_end 2023-03-12 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63814287600, #    utc_start 2023-03-12 07:00:00 (Sun)
  63834847200, #      utc_end 2023-11-05 06:00:00 (Sun)
  63814273200, #  local_start 2023-03-12 03:00:00 (Sun)
  63834832800, #    local_end 2023-11-05 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63834847200, #    utc_start 2023-11-05 06:00:00 (Sun)
  63845737200, #      utc_end 2024-03-10 07:00:00 (Sun)
  63834829200, #  local_start 2023-11-05 01:00:00 (Sun)
  63845719200, #    local_end 2024-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63845737200, #    utc_start 2024-03-10 07:00:00 (Sun)
  63866296800, #      utc_end 2024-11-03 06:00:00 (Sun)
  63845722800, #  local_start 2024-03-10 03:00:00 (Sun)
  63866282400, #    local_end 2024-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63866296800, #    utc_start 2024-11-03 06:00:00 (Sun)
  63877186800, #      utc_end 2025-03-09 07:00:00 (Sun)
  63866278800, #  local_start 2024-11-03 01:00:00 (Sun)
  63877168800, #    local_end 2025-03-09 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63877186800, #    utc_start 2025-03-09 07:00:00 (Sun)
  63897746400, #      utc_end 2025-11-02 06:00:00 (Sun)
  63877172400, #  local_start 2025-03-09 03:00:00 (Sun)
  63897732000, #    local_end 2025-11-02 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63897746400, #    utc_start 2025-11-02 06:00:00 (Sun)
  63908636400, #      utc_end 2026-03-08 07:00:00 (Sun)
  63897728400, #  local_start 2025-11-02 01:00:00 (Sun)
  63908618400, #    local_end 2026-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63908636400, #    utc_start 2026-03-08 07:00:00 (Sun)
  63929196000, #      utc_end 2026-11-01 06:00:00 (Sun)
  63908622000, #  local_start 2026-03-08 03:00:00 (Sun)
  63929181600, #    local_end 2026-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63929196000, #    utc_start 2026-11-01 06:00:00 (Sun)
  63940690800, #      utc_end 2027-03-14 07:00:00 (Sun)
  63929178000, #  local_start 2026-11-01 01:00:00 (Sun)
  63940672800, #    local_end 2027-03-14 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63940690800, #    utc_start 2027-03-14 07:00:00 (Sun)
  63961250400, #      utc_end 2027-11-07 06:00:00 (Sun)
  63940676400, #  local_start 2027-03-14 03:00:00 (Sun)
  63961236000, #    local_end 2027-11-07 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63961250400, #    utc_start 2027-11-07 06:00:00 (Sun)
  63972140400, #      utc_end 2028-03-12 07:00:00 (Sun)
  63961232400, #  local_start 2027-11-07 01:00:00 (Sun)
  63972122400, #    local_end 2028-03-12 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63972140400, #    utc_start 2028-03-12 07:00:00 (Sun)
  63992700000, #      utc_end 2028-11-05 06:00:00 (Sun)
  63972126000, #  local_start 2028-03-12 03:00:00 (Sun)
  63992685600, #    local_end 2028-11-05 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63992700000, #    utc_start 2028-11-05 06:00:00 (Sun)
  64003590000, #      utc_end 2029-03-11 07:00:00 (Sun)
  63992682000, #  local_start 2028-11-05 01:00:00 (Sun)
  64003572000, #    local_end 2029-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  64003590000, #    utc_start 2029-03-11 07:00:00 (Sun)
  64024149600, #      utc_end 2029-11-04 06:00:00 (Sun)
  64003575600, #  local_start 2029-03-11 03:00:00 (Sun)
  64024135200, #    local_end 2029-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  64024149600, #    utc_start 2029-11-04 06:00:00 (Sun)
  64035039600, #      utc_end 2030-03-10 07:00:00 (Sun)
  64024131600, #  local_start 2029-11-04 01:00:00 (Sun)
  64035021600, #    local_end 2030-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  64035039600, #    utc_start 2030-03-10 07:00:00 (Sun)
  64055599200, #      utc_end 2030-11-03 06:00:00 (Sun)
  64035025200, #  local_start 2030-03-10 03:00:00 (Sun)
  64055584800, #    local_end 2030-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {61}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -18000 }
  
  my $last_observance = bless( {
    'format' => 'E%sT',
    'gmtoff' => '-5:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 721105,
      'local_rd_secs' => 10800,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 721105,
      'utc_rd_secs' => 10800,
      'utc_year' => 1976
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -18000,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 721105,
      'local_rd_secs' => 25200,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 721105,
      'utc_rd_secs' => 25200,
      'utc_year' => 1976
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Mar',
      'letter' => 'D',
      'name' => 'US',
      'offset_from_std' => 3600,
      'on' => 'Sun>=8',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Nov',
      'letter' => 'S',
      'name' => 'US',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_DETROIT

    $main::fatpacked{"DateTime/TimeZone/America/Edmonton.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_EDMONTON';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Edmonton;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Edmonton::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60137019232, #      utc_end 1906-09-01 07:33:52 (Sat)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60136992000, #    local_end 1906-09-01 00:00:00 (Sat)
  -27232,
  0,
  'LMT',
      ],
      [
  60137019232, #    utc_start 1906-09-01 07:33:52 (Sat)
  60503619600, #      utc_end 1918-04-14 09:00:00 (Sun)
  60136994032, #  local_start 1906-09-01 00:33:52 (Sat)
  60503594400, #    local_end 1918-04-14 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  60503619600, #    utc_start 1918-04-14 09:00:00 (Sun)
  60520550400, #      utc_end 1918-10-27 08:00:00 (Sun)
  60503598000, #  local_start 1918-04-14 03:00:00 (Sun)
  60520528800, #    local_end 1918-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  60520550400, #    utc_start 1918-10-27 08:00:00 (Sun)
  60535069200, #      utc_end 1919-04-13 09:00:00 (Sun)
  60520525200, #  local_start 1918-10-27 01:00:00 (Sun)
  60535044000, #    local_end 1919-04-13 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  60535069200, #    utc_start 1919-04-13 09:00:00 (Sun)
  60538867200, #      utc_end 1919-05-27 08:00:00 (Tue)
  60535047600, #  local_start 1919-04-13 03:00:00 (Sun)
  60538845600, #    local_end 1919-05-27 02:00:00 (Tue)
  -21600,
  1,
  'MDT',
      ],
      [
  60538867200, #    utc_start 1919-05-27 08:00:00 (Tue)
  60567728400, #      utc_end 1920-04-25 09:00:00 (Sun)
  60538842000, #  local_start 1919-05-27 01:00:00 (Tue)
  60567703200, #    local_end 1920-04-25 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  60567728400, #    utc_start 1920-04-25 09:00:00 (Sun)
  60584054400, #      utc_end 1920-10-31 08:00:00 (Sun)
  60567706800, #  local_start 1920-04-25 03:00:00 (Sun)
  60584032800, #    local_end 1920-10-31 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  60584054400, #    utc_start 1920-10-31 08:00:00 (Sun)
  60599178000, #      utc_end 1921-04-24 09:00:00 (Sun)
  60584029200, #  local_start 1920-10-31 01:00:00 (Sun)
  60599152800, #    local_end 1921-04-24 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  60599178000, #    utc_start 1921-04-24 09:00:00 (Sun)
  60612480000, #      utc_end 1921-09-25 08:00:00 (Sun)
  60599156400, #  local_start 1921-04-24 03:00:00 (Sun)
  60612458400, #    local_end 1921-09-25 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  60612480000, #    utc_start 1921-09-25 08:00:00 (Sun)
  60631232400, #      utc_end 1922-04-30 09:00:00 (Sun)
  60612454800, #  local_start 1921-09-25 01:00:00 (Sun)
  60631207200, #    local_end 1922-04-30 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  60631232400, #    utc_start 1922-04-30 09:00:00 (Sun)
  60643929600, #      utc_end 1922-09-24 08:00:00 (Sun)
  60631210800, #  local_start 1922-04-30 03:00:00 (Sun)
  60643908000, #    local_end 1922-09-24 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  60643929600, #    utc_start 1922-09-24 08:00:00 (Sun)
  60662682000, #      utc_end 1923-04-29 09:00:00 (Sun)
  60643904400, #  local_start 1922-09-24 01:00:00 (Sun)
  60662656800, #    local_end 1923-04-29 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  60662682000, #    utc_start 1923-04-29 09:00:00 (Sun)
  60675984000, #      utc_end 1923-09-30 08:00:00 (Sun)
  60662660400, #  local_start 1923-04-29 03:00:00 (Sun)
  60675962400, #    local_end 1923-09-30 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  60675984000, #    utc_start 1923-09-30 08:00:00 (Sun)
  61255472400, #      utc_end 1942-02-09 09:00:00 (Mon)
  60675958800, #  local_start 1923-09-30 01:00:00 (Sun)
  61255447200, #    local_end 1942-02-09 02:00:00 (Mon)
  -25200,
  0,
  'MST',
      ],
      [
  61255472400, #    utc_start 1942-02-09 09:00:00 (Mon)
  61366287600, #      utc_end 1945-08-14 23:00:00 (Tue)
  61255450800, #  local_start 1942-02-09 03:00:00 (Mon)
  61366266000, #    local_end 1945-08-14 17:00:00 (Tue)
  -21600,
  1,
  'MWT',
      ],
      [
  61366287600, #    utc_start 1945-08-14 23:00:00 (Tue)
  61370294400, #      utc_end 1945-09-30 08:00:00 (Sun)
  61366266000, #  local_start 1945-08-14 17:00:00 (Tue)
  61370272800, #    local_end 1945-09-30 02:00:00 (Sun)
  -21600,
  1,
  'MPT',
      ],
      [
  61370294400, #    utc_start 1945-09-30 08:00:00 (Sun)
  61419891600, #      utc_end 1947-04-27 09:00:00 (Sun)
  61370269200, #  local_start 1945-09-30 01:00:00 (Sun)
  61419866400, #    local_end 1947-04-27 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  61419891600, #    utc_start 1947-04-27 09:00:00 (Sun)
  61433193600, #      utc_end 1947-09-28 08:00:00 (Sun)
  61419870000, #  local_start 1947-04-27 03:00:00 (Sun)
  61433172000, #    local_end 1947-09-28 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  61433193600, #    utc_start 1947-09-28 08:00:00 (Sun)
  62051302800, #      utc_end 1967-04-30 09:00:00 (Sun)
  61433168400, #  local_start 1947-09-28 01:00:00 (Sun)
  62051277600, #    local_end 1967-04-30 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62051302800, #    utc_start 1967-04-30 09:00:00 (Sun)
  62067024000, #      utc_end 1967-10-29 08:00:00 (Sun)
  62051281200, #  local_start 1967-04-30 03:00:00 (Sun)
  62067002400, #    local_end 1967-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62067024000, #    utc_start 1967-10-29 08:00:00 (Sun)
  62114202000, #      utc_end 1969-04-27 09:00:00 (Sun)
  62066998800, #  local_start 1967-10-29 01:00:00 (Sun)
  62114176800, #    local_end 1969-04-27 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62114202000, #    utc_start 1969-04-27 09:00:00 (Sun)
  62129923200, #      utc_end 1969-10-26 08:00:00 (Sun)
  62114180400, #  local_start 1969-04-27 03:00:00 (Sun)
  62129901600, #    local_end 1969-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62129923200, #    utc_start 1969-10-26 08:00:00 (Sun)
  62209155600, #      utc_end 1972-04-30 09:00:00 (Sun)
  62129898000, #  local_start 1969-10-26 01:00:00 (Sun)
  62209130400, #    local_end 1972-04-30 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62209155600, #    utc_start 1972-04-30 09:00:00 (Sun)
  62224876800, #      utc_end 1972-10-29 08:00:00 (Sun)
  62209134000, #  local_start 1972-04-30 03:00:00 (Sun)
  62224855200, #    local_end 1972-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62224876800, #    utc_start 1972-10-29 08:00:00 (Sun)
  62240605200, #      utc_end 1973-04-29 09:00:00 (Sun)
  62224851600, #  local_start 1972-10-29 01:00:00 (Sun)
  62240580000, #    local_end 1973-04-29 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62240605200, #    utc_start 1973-04-29 09:00:00 (Sun)
  62256326400, #      utc_end 1973-10-28 08:00:00 (Sun)
  62240583600, #  local_start 1973-04-29 03:00:00 (Sun)
  62256304800, #    local_end 1973-10-28 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62256326400, #    utc_start 1973-10-28 08:00:00 (Sun)
  62272054800, #      utc_end 1974-04-28 09:00:00 (Sun)
  62256301200, #  local_start 1973-10-28 01:00:00 (Sun)
  62272029600, #    local_end 1974-04-28 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62272054800, #    utc_start 1974-04-28 09:00:00 (Sun)
  62287776000, #      utc_end 1974-10-27 08:00:00 (Sun)
  62272033200, #  local_start 1974-04-28 03:00:00 (Sun)
  62287754400, #    local_end 1974-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62287776000, #    utc_start 1974-10-27 08:00:00 (Sun)
  62303504400, #      utc_end 1975-04-27 09:00:00 (Sun)
  62287750800, #  local_start 1974-10-27 01:00:00 (Sun)
  62303479200, #    local_end 1975-04-27 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62303504400, #    utc_start 1975-04-27 09:00:00 (Sun)
  62319225600, #      utc_end 1975-10-26 08:00:00 (Sun)
  62303482800, #  local_start 1975-04-27 03:00:00 (Sun)
  62319204000, #    local_end 1975-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62319225600, #    utc_start 1975-10-26 08:00:00 (Sun)
  62334954000, #      utc_end 1976-04-25 09:00:00 (Sun)
  62319200400, #  local_start 1975-10-26 01:00:00 (Sun)
  62334928800, #    local_end 1976-04-25 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62334954000, #    utc_start 1976-04-25 09:00:00 (Sun)
  62351280000, #      utc_end 1976-10-31 08:00:00 (Sun)
  62334932400, #  local_start 1976-04-25 03:00:00 (Sun)
  62351258400, #    local_end 1976-10-31 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62351280000, #    utc_start 1976-10-31 08:00:00 (Sun)
  62366403600, #      utc_end 1977-04-24 09:00:00 (Sun)
  62351254800, #  local_start 1976-10-31 01:00:00 (Sun)
  62366378400, #    local_end 1977-04-24 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62366403600, #    utc_start 1977-04-24 09:00:00 (Sun)
  62382729600, #      utc_end 1977-10-30 08:00:00 (Sun)
  62366382000, #  local_start 1977-04-24 03:00:00 (Sun)
  62382708000, #    local_end 1977-10-30 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62382729600, #    utc_start 1977-10-30 08:00:00 (Sun)
  62398458000, #      utc_end 1978-04-30 09:00:00 (Sun)
  62382704400, #  local_start 1977-10-30 01:00:00 (Sun)
  62398432800, #    local_end 1978-04-30 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62398458000, #    utc_start 1978-04-30 09:00:00 (Sun)
  62414179200, #      utc_end 1978-10-29 08:00:00 (Sun)
  62398436400, #  local_start 1978-04-30 03:00:00 (Sun)
  62414157600, #    local_end 1978-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62414179200, #    utc_start 1978-10-29 08:00:00 (Sun)
  62429907600, #      utc_end 1979-04-29 09:00:00 (Sun)
  62414154000, #  local_start 1978-10-29 01:00:00 (Sun)
  62429882400, #    local_end 1979-04-29 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62429907600, #    utc_start 1979-04-29 09:00:00 (Sun)
  62445628800, #      utc_end 1979-10-28 08:00:00 (Sun)
  62429886000, #  local_start 1979-04-29 03:00:00 (Sun)
  62445607200, #    local_end 1979-10-28 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62445628800, #    utc_start 1979-10-28 08:00:00 (Sun)
  62461357200, #      utc_end 1980-04-27 09:00:00 (Sun)
  62445603600, #  local_start 1979-10-28 01:00:00 (Sun)
  62461332000, #    local_end 1980-04-27 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62461357200, #    utc_start 1980-04-27 09:00:00 (Sun)
  62477078400, #      utc_end 1980-10-26 08:00:00 (Sun)
  62461335600, #  local_start 1980-04-27 03:00:00 (Sun)
  62477056800, #    local_end 1980-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62477078400, #    utc_start 1980-10-26 08:00:00 (Sun)
  62492806800, #      utc_end 1981-04-26 09:00:00 (Sun)
  62477053200, #  local_start 1980-10-26 01:00:00 (Sun)
  62492781600, #    local_end 1981-04-26 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62492806800, #    utc_start 1981-04-26 09:00:00 (Sun)
  62508528000, #      utc_end 1981-10-25 08:00:00 (Sun)
  62492785200, #  local_start 1981-04-26 03:00:00 (Sun)
  62508506400, #    local_end 1981-10-25 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62508528000, #    utc_start 1981-10-25 08:00:00 (Sun)
  62524256400, #      utc_end 1982-04-25 09:00:00 (Sun)
  62508502800, #  local_start 1981-10-25 01:00:00 (Sun)
  62524231200, #    local_end 1982-04-25 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62524256400, #    utc_start 1982-04-25 09:00:00 (Sun)
  62540582400, #      utc_end 1982-10-31 08:00:00 (Sun)
  62524234800, #  local_start 1982-04-25 03:00:00 (Sun)
  62540560800, #    local_end 1982-10-31 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62540582400, #    utc_start 1982-10-31 08:00:00 (Sun)
  62555706000, #      utc_end 1983-04-24 09:00:00 (Sun)
  62540557200, #  local_start 1982-10-31 01:00:00 (Sun)
  62555680800, #    local_end 1983-04-24 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62555706000, #    utc_start 1983-04-24 09:00:00 (Sun)
  62572032000, #      utc_end 1983-10-30 08:00:00 (Sun)
  62555684400, #  local_start 1983-04-24 03:00:00 (Sun)
  62572010400, #    local_end 1983-10-30 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62572032000, #    utc_start 1983-10-30 08:00:00 (Sun)
  62587760400, #      utc_end 1984-04-29 09:00:00 (Sun)
  62572006800, #  local_start 1983-10-30 01:00:00 (Sun)
  62587735200, #    local_end 1984-04-29 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62587760400, #    utc_start 1984-04-29 09:00:00 (Sun)
  62603481600, #      utc_end 1984-10-28 08:00:00 (Sun)
  62587738800, #  local_start 1984-04-29 03:00:00 (Sun)
  62603460000, #    local_end 1984-10-28 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62603481600, #    utc_start 1984-10-28 08:00:00 (Sun)
  62619210000, #      utc_end 1985-04-28 09:00:00 (Sun)
  62603456400, #  local_start 1984-10-28 01:00:00 (Sun)
  62619184800, #    local_end 1985-04-28 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62619210000, #    utc_start 1985-04-28 09:00:00 (Sun)
  62634931200, #      utc_end 1985-10-27 08:00:00 (Sun)
  62619188400, #  local_start 1985-04-28 03:00:00 (Sun)
  62634909600, #    local_end 1985-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62634931200, #    utc_start 1985-10-27 08:00:00 (Sun)
  62650659600, #      utc_end 1986-04-27 09:00:00 (Sun)
  62634906000, #  local_start 1985-10-27 01:00:00 (Sun)
  62650634400, #    local_end 1986-04-27 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62650659600, #    utc_start 1986-04-27 09:00:00 (Sun)
  62666380800, #      utc_end 1986-10-26 08:00:00 (Sun)
  62650638000, #  local_start 1986-04-27 03:00:00 (Sun)
  62666359200, #    local_end 1986-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62666380800, #    utc_start 1986-10-26 08:00:00 (Sun)
  62672166000, #      utc_end 1987-01-01 07:00:00 (Thu)
  62666355600, #  local_start 1986-10-26 01:00:00 (Sun)
  62672140800, #    local_end 1987-01-01 00:00:00 (Thu)
  -25200,
  0,
  'MST',
      ],
      [
  62672166000, #    utc_start 1987-01-01 07:00:00 (Thu)
  62680294800, #      utc_end 1987-04-05 09:00:00 (Sun)
  62672140800, #  local_start 1987-01-01 00:00:00 (Thu)
  62680269600, #    local_end 1987-04-05 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62680294800, #    utc_start 1987-04-05 09:00:00 (Sun)
  62697830400, #      utc_end 1987-10-25 08:00:00 (Sun)
  62680273200, #  local_start 1987-04-05 03:00:00 (Sun)
  62697808800, #    local_end 1987-10-25 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62697830400, #    utc_start 1987-10-25 08:00:00 (Sun)
  62711744400, #      utc_end 1988-04-03 09:00:00 (Sun)
  62697805200, #  local_start 1987-10-25 01:00:00 (Sun)
  62711719200, #    local_end 1988-04-03 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62711744400, #    utc_start 1988-04-03 09:00:00 (Sun)
  62729884800, #      utc_end 1988-10-30 08:00:00 (Sun)
  62711722800, #  local_start 1988-04-03 03:00:00 (Sun)
  62729863200, #    local_end 1988-10-30 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62729884800, #    utc_start 1988-10-30 08:00:00 (Sun)
  62743194000, #      utc_end 1989-04-02 09:00:00 (Sun)
  62729859600, #  local_start 1988-10-30 01:00:00 (Sun)
  62743168800, #    local_end 1989-04-02 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62743194000, #    utc_start 1989-04-02 09:00:00 (Sun)
  62761334400, #      utc_end 1989-10-29 08:00:00 (Sun)
  62743172400, #  local_start 1989-04-02 03:00:00 (Sun)
  62761312800, #    local_end 1989-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62761334400, #    utc_start 1989-10-29 08:00:00 (Sun)
  62774643600, #      utc_end 1990-04-01 09:00:00 (Sun)
  62761309200, #  local_start 1989-10-29 01:00:00 (Sun)
  62774618400, #    local_end 1990-04-01 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62774643600, #    utc_start 1990-04-01 09:00:00 (Sun)
  62792784000, #      utc_end 1990-10-28 08:00:00 (Sun)
  62774622000, #  local_start 1990-04-01 03:00:00 (Sun)
  62792762400, #    local_end 1990-10-28 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62792784000, #    utc_start 1990-10-28 08:00:00 (Sun)
  62806698000, #      utc_end 1991-04-07 09:00:00 (Sun)
  62792758800, #  local_start 1990-10-28 01:00:00 (Sun)
  62806672800, #    local_end 1991-04-07 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62806698000, #    utc_start 1991-04-07 09:00:00 (Sun)
  62824233600, #      utc_end 1991-10-27 08:00:00 (Sun)
  62806676400, #  local_start 1991-04-07 03:00:00 (Sun)
  62824212000, #    local_end 1991-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62824233600, #    utc_start 1991-10-27 08:00:00 (Sun)
  62838147600, #      utc_end 1992-04-05 09:00:00 (Sun)
  62824208400, #  local_start 1991-10-27 01:00:00 (Sun)
  62838122400, #    local_end 1992-04-05 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62838147600, #    utc_start 1992-04-05 09:00:00 (Sun)
  62855683200, #      utc_end 1992-10-25 08:00:00 (Sun)
  62838126000, #  local_start 1992-04-05 03:00:00 (Sun)
  62855661600, #    local_end 1992-10-25 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62855683200, #    utc_start 1992-10-25 08:00:00 (Sun)
  62869597200, #      utc_end 1993-04-04 09:00:00 (Sun)
  62855658000, #  local_start 1992-10-25 01:00:00 (Sun)
  62869572000, #    local_end 1993-04-04 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62869597200, #    utc_start 1993-04-04 09:00:00 (Sun)
  62887737600, #      utc_end 1993-10-31 08:00:00 (Sun)
  62869575600, #  local_start 1993-04-04 03:00:00 (Sun)
  62887716000, #    local_end 1993-10-31 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62887737600, #    utc_start 1993-10-31 08:00:00 (Sun)
  62901046800, #      utc_end 1994-04-03 09:00:00 (Sun)
  62887712400, #  local_start 1993-10-31 01:00:00 (Sun)
  62901021600, #    local_end 1994-04-03 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62901046800, #    utc_start 1994-04-03 09:00:00 (Sun)
  62919187200, #      utc_end 1994-10-30 08:00:00 (Sun)
  62901025200, #  local_start 1994-04-03 03:00:00 (Sun)
  62919165600, #    local_end 1994-10-30 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62919187200, #    utc_start 1994-10-30 08:00:00 (Sun)
  62932496400, #      utc_end 1995-04-02 09:00:00 (Sun)
  62919162000, #  local_start 1994-10-30 01:00:00 (Sun)
  62932471200, #    local_end 1995-04-02 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62932496400, #    utc_start 1995-04-02 09:00:00 (Sun)
  62950636800, #      utc_end 1995-10-29 08:00:00 (Sun)
  62932474800, #  local_start 1995-04-02 03:00:00 (Sun)
  62950615200, #    local_end 1995-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62950636800, #    utc_start 1995-10-29 08:00:00 (Sun)
  62964550800, #      utc_end 1996-04-07 09:00:00 (Sun)
  62950611600, #  local_start 1995-10-29 01:00:00 (Sun)
  62964525600, #    local_end 1996-04-07 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62964550800, #    utc_start 1996-04-07 09:00:00 (Sun)
  62982086400, #      utc_end 1996-10-27 08:00:00 (Sun)
  62964529200, #  local_start 1996-04-07 03:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62982086400, #    utc_start 1996-10-27 08:00:00 (Sun)
  62996000400, #      utc_end 1997-04-06 09:00:00 (Sun)
  62982061200, #  local_start 1996-10-27 01:00:00 (Sun)
  62995975200, #    local_end 1997-04-06 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62996000400, #    utc_start 1997-04-06 09:00:00 (Sun)
  63013536000, #      utc_end 1997-10-26 08:00:00 (Sun)
  62995978800, #  local_start 1997-04-06 03:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63013536000, #    utc_start 1997-10-26 08:00:00 (Sun)
  63027450000, #      utc_end 1998-04-05 09:00:00 (Sun)
  63013510800, #  local_start 1997-10-26 01:00:00 (Sun)
  63027424800, #    local_end 1998-04-05 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63027450000, #    utc_start 1998-04-05 09:00:00 (Sun)
  63044985600, #      utc_end 1998-10-25 08:00:00 (Sun)
  63027428400, #  local_start 1998-04-05 03:00:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63044985600, #    utc_start 1998-10-25 08:00:00 (Sun)
  63058899600, #      utc_end 1999-04-04 09:00:00 (Sun)
  63044960400, #  local_start 1998-10-25 01:00:00 (Sun)
  63058874400, #    local_end 1999-04-04 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63058899600, #    utc_start 1999-04-04 09:00:00 (Sun)
  63077040000, #      utc_end 1999-10-31 08:00:00 (Sun)
  63058878000, #  local_start 1999-04-04 03:00:00 (Sun)
  63077018400, #    local_end 1999-10-31 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63077040000, #    utc_start 1999-10-31 08:00:00 (Sun)
  63090349200, #      utc_end 2000-04-02 09:00:00 (Sun)
  63077014800, #  local_start 1999-10-31 01:00:00 (Sun)
  63090324000, #    local_end 2000-04-02 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63090349200, #    utc_start 2000-04-02 09:00:00 (Sun)
  63108489600, #      utc_end 2000-10-29 08:00:00 (Sun)
  63090327600, #  local_start 2000-04-02 03:00:00 (Sun)
  63108468000, #    local_end 2000-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63108489600, #    utc_start 2000-10-29 08:00:00 (Sun)
  63121798800, #      utc_end 2001-04-01 09:00:00 (Sun)
  63108464400, #  local_start 2000-10-29 01:00:00 (Sun)
  63121773600, #    local_end 2001-04-01 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63121798800, #    utc_start 2001-04-01 09:00:00 (Sun)
  63139939200, #      utc_end 2001-10-28 08:00:00 (Sun)
  63121777200, #  local_start 2001-04-01 03:00:00 (Sun)
  63139917600, #    local_end 2001-10-28 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63139939200, #    utc_start 2001-10-28 08:00:00 (Sun)
  63153853200, #      utc_end 2002-04-07 09:00:00 (Sun)
  63139914000, #  local_start 2001-10-28 01:00:00 (Sun)
  63153828000, #    local_end 2002-04-07 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63153853200, #    utc_start 2002-04-07 09:00:00 (Sun)
  63171388800, #      utc_end 2002-10-27 08:00:00 (Sun)
  63153831600, #  local_start 2002-04-07 03:00:00 (Sun)
  63171367200, #    local_end 2002-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63171388800, #    utc_start 2002-10-27 08:00:00 (Sun)
  63185302800, #      utc_end 2003-04-06 09:00:00 (Sun)
  63171363600, #  local_start 2002-10-27 01:00:00 (Sun)
  63185277600, #    local_end 2003-04-06 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63185302800, #    utc_start 2003-04-06 09:00:00 (Sun)
  63202838400, #      utc_end 2003-10-26 08:00:00 (Sun)
  63185281200, #  local_start 2003-04-06 03:00:00 (Sun)
  63202816800, #    local_end 2003-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63202838400, #    utc_start 2003-10-26 08:00:00 (Sun)
  63216752400, #      utc_end 2004-04-04 09:00:00 (Sun)
  63202813200, #  local_start 2003-10-26 01:00:00 (Sun)
  63216727200, #    local_end 2004-04-04 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63216752400, #    utc_start 2004-04-04 09:00:00 (Sun)
  63234892800, #      utc_end 2004-10-31 08:00:00 (Sun)
  63216730800, #  local_start 2004-04-04 03:00:00 (Sun)
  63234871200, #    local_end 2004-10-31 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63234892800, #    utc_start 2004-10-31 08:00:00 (Sun)
  63248202000, #      utc_end 2005-04-03 09:00:00 (Sun)
  63234867600, #  local_start 2004-10-31 01:00:00 (Sun)
  63248176800, #    local_end 2005-04-03 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63248202000, #    utc_start 2005-04-03 09:00:00 (Sun)
  63266342400, #      utc_end 2005-10-30 08:00:00 (Sun)
  63248180400, #  local_start 2005-04-03 03:00:00 (Sun)
  63266320800, #    local_end 2005-10-30 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63266342400, #    utc_start 2005-10-30 08:00:00 (Sun)
  63279651600, #      utc_end 2006-04-02 09:00:00 (Sun)
  63266317200, #  local_start 2005-10-30 01:00:00 (Sun)
  63279626400, #    local_end 2006-04-02 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63279651600, #    utc_start 2006-04-02 09:00:00 (Sun)
  63297792000, #      utc_end 2006-10-29 08:00:00 (Sun)
  63279630000, #  local_start 2006-04-02 03:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63297792000, #    utc_start 2006-10-29 08:00:00 (Sun)
  63309286800, #      utc_end 2007-03-11 09:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63309261600, #    local_end 2007-03-11 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63309286800, #    utc_start 2007-03-11 09:00:00 (Sun)
  63329846400, #      utc_end 2007-11-04 08:00:00 (Sun)
  63309265200, #  local_start 2007-03-11 03:00:00 (Sun)
  63329824800, #    local_end 2007-11-04 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63329846400, #    utc_start 2007-11-04 08:00:00 (Sun)
  63340736400, #      utc_end 2008-03-09 09:00:00 (Sun)
  63329821200, #  local_start 2007-11-04 01:00:00 (Sun)
  63340711200, #    local_end 2008-03-09 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63340736400, #    utc_start 2008-03-09 09:00:00 (Sun)
  63361296000, #      utc_end 2008-11-02 08:00:00 (Sun)
  63340714800, #  local_start 2008-03-09 03:00:00 (Sun)
  63361274400, #    local_end 2008-11-02 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63361296000, #    utc_start 2008-11-02 08:00:00 (Sun)
  63372186000, #      utc_end 2009-03-08 09:00:00 (Sun)
  63361270800, #  local_start 2008-11-02 01:00:00 (Sun)
  63372160800, #    local_end 2009-03-08 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63372186000, #    utc_start 2009-03-08 09:00:00 (Sun)
  63392745600, #      utc_end 2009-11-01 08:00:00 (Sun)
  63372164400, #  local_start 2009-03-08 03:00:00 (Sun)
  63392724000, #    local_end 2009-11-01 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63392745600, #    utc_start 2009-11-01 08:00:00 (Sun)
  63404240400, #      utc_end 2010-03-14 09:00:00 (Sun)
  63392720400, #  local_start 2009-11-01 01:00:00 (Sun)
  63404215200, #    local_end 2010-03-14 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63404240400, #    utc_start 2010-03-14 09:00:00 (Sun)
  63424800000, #      utc_end 2010-11-07 08:00:00 (Sun)
  63404218800, #  local_start 2010-03-14 03:00:00 (Sun)
  63424778400, #    local_end 2010-11-07 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63424800000, #    utc_start 2010-11-07 08:00:00 (Sun)
  63435690000, #      utc_end 2011-03-13 09:00:00 (Sun)
  63424774800, #  local_start 2010-11-07 01:00:00 (Sun)
  63435664800, #    local_end 2011-03-13 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63435690000, #    utc_start 2011-03-13 09:00:00 (Sun)
  63456249600, #      utc_end 2011-11-06 08:00:00 (Sun)
  63435668400, #  local_start 2011-03-13 03:00:00 (Sun)
  63456228000, #    local_end 2011-11-06 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63456249600, #    utc_start 2011-11-06 08:00:00 (Sun)
  63467139600, #      utc_end 2012-03-11 09:00:00 (Sun)
  63456224400, #  local_start 2011-11-06 01:00:00 (Sun)
  63467114400, #    local_end 2012-03-11 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63467139600, #    utc_start 2012-03-11 09:00:00 (Sun)
  63487699200, #      utc_end 2012-11-04 08:00:00 (Sun)
  63467118000, #  local_start 2012-03-11 03:00:00 (Sun)
  63487677600, #    local_end 2012-11-04 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63487699200, #    utc_start 2012-11-04 08:00:00 (Sun)
  63498589200, #      utc_end 2013-03-10 09:00:00 (Sun)
  63487674000, #  local_start 2012-11-04 01:00:00 (Sun)
  63498564000, #    local_end 2013-03-10 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63498589200, #    utc_start 2013-03-10 09:00:00 (Sun)
  63519148800, #      utc_end 2013-11-03 08:00:00 (Sun)
  63498567600, #  local_start 2013-03-10 03:00:00 (Sun)
  63519127200, #    local_end 2013-11-03 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63519148800, #    utc_start 2013-11-03 08:00:00 (Sun)
  63530038800, #      utc_end 2014-03-09 09:00:00 (Sun)
  63519123600, #  local_start 2013-11-03 01:00:00 (Sun)
  63530013600, #    local_end 2014-03-09 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63530038800, #    utc_start 2014-03-09 09:00:00 (Sun)
  63550598400, #      utc_end 2014-11-02 08:00:00 (Sun)
  63530017200, #  local_start 2014-03-09 03:00:00 (Sun)
  63550576800, #    local_end 2014-11-02 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63550598400, #    utc_start 2014-11-02 08:00:00 (Sun)
  63561488400, #      utc_end 2015-03-08 09:00:00 (Sun)
  63550573200, #  local_start 2014-11-02 01:00:00 (Sun)
  63561463200, #    local_end 2015-03-08 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63561488400, #    utc_start 2015-03-08 09:00:00 (Sun)
  63582048000, #      utc_end 2015-11-01 08:00:00 (Sun)
  63561466800, #  local_start 2015-03-08 03:00:00 (Sun)
  63582026400, #    local_end 2015-11-01 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63582048000, #    utc_start 2015-11-01 08:00:00 (Sun)
  63593542800, #      utc_end 2016-03-13 09:00:00 (Sun)
  63582022800, #  local_start 2015-11-01 01:00:00 (Sun)
  63593517600, #    local_end 2016-03-13 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63593542800, #    utc_start 2016-03-13 09:00:00 (Sun)
  63614102400, #      utc_end 2016-11-06 08:00:00 (Sun)
  63593521200, #  local_start 2016-03-13 03:00:00 (Sun)
  63614080800, #    local_end 2016-11-06 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63614102400, #    utc_start 2016-11-06 08:00:00 (Sun)
  63624992400, #      utc_end 2017-03-12 09:00:00 (Sun)
  63614077200, #  local_start 2016-11-06 01:00:00 (Sun)
  63624967200, #    local_end 2017-03-12 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63624992400, #    utc_start 2017-03-12 09:00:00 (Sun)
  63645552000, #      utc_end 2017-11-05 08:00:00 (Sun)
  63624970800, #  local_start 2017-03-12 03:00:00 (Sun)
  63645530400, #    local_end 2017-11-05 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63645552000, #    utc_start 2017-11-05 08:00:00 (Sun)
  63656442000, #      utc_end 2018-03-11 09:00:00 (Sun)
  63645526800, #  local_start 2017-11-05 01:00:00 (Sun)
  63656416800, #    local_end 2018-03-11 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63656442000, #    utc_start 2018-03-11 09:00:00 (Sun)
  63677001600, #      utc_end 2018-11-04 08:00:00 (Sun)
  63656420400, #  local_start 2018-03-11 03:00:00 (Sun)
  63676980000, #    local_end 2018-11-04 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63677001600, #    utc_start 2018-11-04 08:00:00 (Sun)
  63687891600, #      utc_end 2019-03-10 09:00:00 (Sun)
  63676976400, #  local_start 2018-11-04 01:00:00 (Sun)
  63687866400, #    local_end 2019-03-10 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63687891600, #    utc_start 2019-03-10 09:00:00 (Sun)
  63708451200, #      utc_end 2019-11-03 08:00:00 (Sun)
  63687870000, #  local_start 2019-03-10 03:00:00 (Sun)
  63708429600, #    local_end 2019-11-03 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63708451200, #    utc_start 2019-11-03 08:00:00 (Sun)
  63719341200, #      utc_end 2020-03-08 09:00:00 (Sun)
  63708426000, #  local_start 2019-11-03 01:00:00 (Sun)
  63719316000, #    local_end 2020-03-08 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63719341200, #    utc_start 2020-03-08 09:00:00 (Sun)
  63739900800, #      utc_end 2020-11-01 08:00:00 (Sun)
  63719319600, #  local_start 2020-03-08 03:00:00 (Sun)
  63739879200, #    local_end 2020-11-01 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63739900800, #    utc_start 2020-11-01 08:00:00 (Sun)
  63751395600, #      utc_end 2021-03-14 09:00:00 (Sun)
  63739875600, #  local_start 2020-11-01 01:00:00 (Sun)
  63751370400, #    local_end 2021-03-14 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63751395600, #    utc_start 2021-03-14 09:00:00 (Sun)
  63771955200, #      utc_end 2021-11-07 08:00:00 (Sun)
  63751374000, #  local_start 2021-03-14 03:00:00 (Sun)
  63771933600, #    local_end 2021-11-07 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63771955200, #    utc_start 2021-11-07 08:00:00 (Sun)
  63782845200, #      utc_end 2022-03-13 09:00:00 (Sun)
  63771930000, #  local_start 2021-11-07 01:00:00 (Sun)
  63782820000, #    local_end 2022-03-13 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63782845200, #    utc_start 2022-03-13 09:00:00 (Sun)
  63803404800, #      utc_end 2022-11-06 08:00:00 (Sun)
  63782823600, #  local_start 2022-03-13 03:00:00 (Sun)
  63803383200, #    local_end 2022-11-06 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63803404800, #    utc_start 2022-11-06 08:00:00 (Sun)
  63814294800, #      utc_end 2023-03-12 09:00:00 (Sun)
  63803379600, #  local_start 2022-11-06 01:00:00 (Sun)
  63814269600, #    local_end 2023-03-12 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63814294800, #    utc_start 2023-03-12 09:00:00 (Sun)
  63834854400, #      utc_end 2023-11-05 08:00:00 (Sun)
  63814273200, #  local_start 2023-03-12 03:00:00 (Sun)
  63834832800, #    local_end 2023-11-05 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63834854400, #    utc_start 2023-11-05 08:00:00 (Sun)
  63845744400, #      utc_end 2024-03-10 09:00:00 (Sun)
  63834829200, #  local_start 2023-11-05 01:00:00 (Sun)
  63845719200, #    local_end 2024-03-10 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63845744400, #    utc_start 2024-03-10 09:00:00 (Sun)
  63866304000, #      utc_end 2024-11-03 08:00:00 (Sun)
  63845722800, #  local_start 2024-03-10 03:00:00 (Sun)
  63866282400, #    local_end 2024-11-03 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63866304000, #    utc_start 2024-11-03 08:00:00 (Sun)
  63877194000, #      utc_end 2025-03-09 09:00:00 (Sun)
  63866278800, #  local_start 2024-11-03 01:00:00 (Sun)
  63877168800, #    local_end 2025-03-09 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63877194000, #    utc_start 2025-03-09 09:00:00 (Sun)
  63897753600, #      utc_end 2025-11-02 08:00:00 (Sun)
  63877172400, #  local_start 2025-03-09 03:00:00 (Sun)
  63897732000, #    local_end 2025-11-02 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63897753600, #    utc_start 2025-11-02 08:00:00 (Sun)
  63908643600, #      utc_end 2026-03-08 09:00:00 (Sun)
  63897728400, #  local_start 2025-11-02 01:00:00 (Sun)
  63908618400, #    local_end 2026-03-08 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63908643600, #    utc_start 2026-03-08 09:00:00 (Sun)
  63929203200, #      utc_end 2026-11-01 08:00:00 (Sun)
  63908622000, #  local_start 2026-03-08 03:00:00 (Sun)
  63929181600, #    local_end 2026-11-01 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63929203200, #    utc_start 2026-11-01 08:00:00 (Sun)
  63940698000, #      utc_end 2027-03-14 09:00:00 (Sun)
  63929178000, #  local_start 2026-11-01 01:00:00 (Sun)
  63940672800, #    local_end 2027-03-14 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63940698000, #    utc_start 2027-03-14 09:00:00 (Sun)
  63961257600, #      utc_end 2027-11-07 08:00:00 (Sun)
  63940676400, #  local_start 2027-03-14 03:00:00 (Sun)
  63961236000, #    local_end 2027-11-07 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63961257600, #    utc_start 2027-11-07 08:00:00 (Sun)
  63972147600, #      utc_end 2028-03-12 09:00:00 (Sun)
  63961232400, #  local_start 2027-11-07 01:00:00 (Sun)
  63972122400, #    local_end 2028-03-12 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63972147600, #    utc_start 2028-03-12 09:00:00 (Sun)
  63992707200, #      utc_end 2028-11-05 08:00:00 (Sun)
  63972126000, #  local_start 2028-03-12 03:00:00 (Sun)
  63992685600, #    local_end 2028-11-05 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63992707200, #    utc_start 2028-11-05 08:00:00 (Sun)
  64003597200, #      utc_end 2029-03-11 09:00:00 (Sun)
  63992682000, #  local_start 2028-11-05 01:00:00 (Sun)
  64003572000, #    local_end 2029-03-11 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  64003597200, #    utc_start 2029-03-11 09:00:00 (Sun)
  64024156800, #      utc_end 2029-11-04 08:00:00 (Sun)
  64003575600, #  local_start 2029-03-11 03:00:00 (Sun)
  64024135200, #    local_end 2029-11-04 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  64024156800, #    utc_start 2029-11-04 08:00:00 (Sun)
  64035046800, #      utc_end 2030-03-10 09:00:00 (Sun)
  64024131600, #  local_start 2029-11-04 01:00:00 (Sun)
  64035021600, #    local_end 2030-03-10 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  64035046800, #    utc_start 2030-03-10 09:00:00 (Sun)
  64055606400, #      utc_end 2030-11-03 08:00:00 (Sun)
  64035025200, #  local_start 2030-03-10 03:00:00 (Sun)
  64055584800, #    local_end 2030-11-03 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {70}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -25200 }
  
  my $last_observance = bless( {
    'format' => 'M%sT',
    'gmtoff' => '-7:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 725372,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 725372,
      'utc_rd_secs' => 0,
      'utc_year' => 1988
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -25200,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 725372,
      'local_rd_secs' => 25200,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 725372,
      'utc_rd_secs' => 25200,
      'utc_year' => 1988
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Nov',
      'letter' => 'S',
      'name' => 'Canada',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Mar',
      'letter' => 'D',
      'name' => 'Canada',
      'offset_from_std' => 3600,
      'on' => 'Sun>=8',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_EDMONTON

    $main::fatpacked{"DateTime/TimeZone/America/Eirunepe.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_EIRUNEPE';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/southamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Eirunepe;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Eirunepe::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60368474368, #      utc_end 1914-01-01 04:39:28 (Thu)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60368457600, #    local_end 1914-01-01 00:00:00 (Thu)
  -16768,
  0,
  'LMT',
      ],
      [
  60368474368, #    utc_start 1914-01-01 04:39:28 (Thu)
  60928732800, #      utc_end 1931-10-03 16:00:00 (Sat)
  60368456368, #  local_start 1913-12-31 23:39:28 (Wed)
  60928714800, #    local_end 1931-10-03 11:00:00 (Sat)
  -18000,
  0,
  '-05',
      ],
      [
  60928732800, #    utc_start 1931-10-03 16:00:00 (Sat)
  60944328000, #      utc_end 1932-04-01 04:00:00 (Fri)
  60928718400, #  local_start 1931-10-03 12:00:00 (Sat)
  60944313600, #    local_end 1932-04-01 00:00:00 (Fri)
  -14400,
  1,
  '-04',
      ],
      [
  60944328000, #    utc_start 1932-04-01 04:00:00 (Fri)
  60960315600, #      utc_end 1932-10-03 05:00:00 (Mon)
  60944310000, #  local_start 1932-03-31 23:00:00 (Thu)
  60960297600, #    local_end 1932-10-03 00:00:00 (Mon)
  -18000,
  0,
  '-05',
      ],
      [
  60960315600, #    utc_start 1932-10-03 05:00:00 (Mon)
  60975864000, #      utc_end 1933-04-01 04:00:00 (Sat)
  60960301200, #  local_start 1932-10-03 01:00:00 (Mon)
  60975849600, #    local_end 1933-04-01 00:00:00 (Sat)
  -14400,
  1,
  '-04',
      ],
      [
  60975864000, #    utc_start 1933-04-01 04:00:00 (Sat)
  61501870800, #      utc_end 1949-12-01 05:00:00 (Thu)
  60975846000, #  local_start 1933-03-31 23:00:00 (Fri)
  61501852800, #    local_end 1949-12-01 00:00:00 (Thu)
  -18000,
  0,
  '-05',
      ],
      [
  61501870800, #    utc_start 1949-12-01 05:00:00 (Thu)
  61513621200, #      utc_end 1950-04-16 05:00:00 (Sun)
  61501856400, #  local_start 1949-12-01 01:00:00 (Thu)
  61513606800, #    local_end 1950-04-16 01:00:00 (Sun)
  -14400,
  1,
  '-04',
      ],
      [
  61513621200, #    utc_start 1950-04-16 05:00:00 (Sun)
  61533406800, #      utc_end 1950-12-01 05:00:00 (Fri)
  61513603200, #  local_start 1950-04-16 00:00:00 (Sun)
  61533388800, #    local_end 1950-12-01 00:00:00 (Fri)
  -18000,
  0,
  '-05',
      ],
      [
  61533406800, #    utc_start 1950-12-01 05:00:00 (Fri)
  61543857600, #      utc_end 1951-04-01 04:00:00 (Sun)
  61533392400, #  local_start 1950-12-01 01:00:00 (Fri)
  61543843200, #    local_end 1951-04-01 00:00:00 (Sun)
  -14400,
  1,
  '-04',
      ],
      [
  61543857600, #    utc_start 1951-04-01 04:00:00 (Sun)
  61564942800, #      utc_end 1951-12-01 05:00:00 (Sat)
  61543839600, #  local_start 1951-03-31 23:00:00 (Sat)
  61564924800, #    local_end 1951-12-01 00:00:00 (Sat)
  -18000,
  0,
  '-05',
      ],
      [
  61564942800, #    utc_start 1951-12-01 05:00:00 (Sat)
  61575480000, #      utc_end 1952-04-01 04:00:00 (Tue)
  61564928400, #  local_start 1951-12-01 01:00:00 (Sat)
  61575465600, #    local_end 1952-04-01 00:00:00 (Tue)
  -14400,
  1,
  '-04',
      ],
      [
  61575480000, #    utc_start 1952-04-01 04:00:00 (Tue)
  61596565200, #      utc_end 1952-12-01 05:00:00 (Mon)
  61575462000, #  local_start 1952-03-31 23:00:00 (Mon)
  61596547200, #    local_end 1952-12-01 00:00:00 (Mon)
  -18000,
  0,
  '-05',
      ],
      [
  61596565200, #    utc_start 1952-12-01 05:00:00 (Mon)
  61604337600, #      utc_end 1953-03-01 04:00:00 (Sun)
  61596550800, #  local_start 1952-12-01 01:00:00 (Mon)
  61604323200, #    local_end 1953-03-01 00:00:00 (Sun)
  -14400,
  1,
  '-04',
      ],
      [
  61604337600, #    utc_start 1953-03-01 04:00:00 (Sun)
  61944325200, #      utc_end 1963-12-09 05:00:00 (Mon)
  61604319600, #  local_start 1953-02-28 23:00:00 (Sat)
  61944307200, #    local_end 1963-12-09 00:00:00 (Mon)
  -18000,
  0,
  '-05',
      ],
      [
  61944325200, #    utc_start 1963-12-09 05:00:00 (Mon)
  61951492800, #      utc_end 1964-03-01 04:00:00 (Sun)
  61944310800, #  local_start 1963-12-09 01:00:00 (Mon)
  61951478400, #    local_end 1964-03-01 00:00:00 (Sun)
  -14400,
  1,
  '-04',
      ],
      [
  61951492800, #    utc_start 1964-03-01 04:00:00 (Sun)
  61980526800, #      utc_end 1965-01-31 05:00:00 (Sun)
  61951474800, #  local_start 1964-02-29 23:00:00 (Sat)
  61980508800, #    local_end 1965-01-31 00:00:00 (Sun)
  -18000,
  0,
  '-05',
      ],
      [
  61980526800, #    utc_start 1965-01-31 05:00:00 (Sun)
  61985620800, #      utc_end 1965-03-31 04:00:00 (Wed)
  61980512400, #  local_start 1965-01-31 01:00:00 (Sun)
  61985606400, #    local_end 1965-03-31 00:00:00 (Wed)
  -14400,
  1,
  '-04',
      ],
      [
  61985620800, #    utc_start 1965-03-31 04:00:00 (Wed)
  62006792400, #      utc_end 1965-12-01 05:00:00 (Wed)
  61985602800, #  local_start 1965-03-30 23:00:00 (Tue)
  62006774400, #    local_end 1965-12-01 00:00:00 (Wed)
  -18000,
  0,
  '-05',
      ],
      [
  62006792400, #    utc_start 1965-12-01 05:00:00 (Wed)
  62014564800, #      utc_end 1966-03-01 04:00:00 (Tue)
  62006778000, #  local_start 1965-12-01 01:00:00 (Wed)
  62014550400, #    local_end 1966-03-01 00:00:00 (Tue)
  -14400,
  1,
  '-04',
      ],
      [
  62014564800, #    utc_start 1966-03-01 04:00:00 (Tue)
  62035736400, #      utc_end 1966-11-01 05:00:00 (Tue)
  62014546800, #  local_start 1966-02-28 23:00:00 (Mon)
  62035718400, #    local_end 1966-11-01 00:00:00 (Tue)
  -18000,
  0,
  '-05',
      ],
      [
  62035736400, #    utc_start 1966-11-01 05:00:00 (Tue)
  62046100800, #      utc_end 1967-03-01 04:00:00 (Wed)
  62035722000, #  local_start 1966-11-01 01:00:00 (Tue)
  62046086400, #    local_end 1967-03-01 00:00:00 (Wed)
  -14400,
  1,
  '-04',
      ],
      [
  62046100800, #    utc_start 1967-03-01 04:00:00 (Wed)
  62067272400, #      utc_end 1967-11-01 05:00:00 (Wed)
  62046082800, #  local_start 1967-02-28 23:00:00 (Tue)
  62067254400, #    local_end 1967-11-01 00:00:00 (Wed)
  -18000,
  0,
  '-05',
      ],
      [
  62067272400, #    utc_start 1967-11-01 05:00:00 (Wed)
  62077723200, #      utc_end 1968-03-01 04:00:00 (Fri)
  62067258000, #  local_start 1967-11-01 01:00:00 (Wed)
  62077708800, #    local_end 1968-03-01 00:00:00 (Fri)
  -14400,
  1,
  '-04',
      ],
      [
  62077723200, #    utc_start 1968-03-01 04:00:00 (Fri)
  62635438800, #      utc_end 1985-11-02 05:00:00 (Sat)
  62077705200, #  local_start 1968-02-29 23:00:00 (Thu)
  62635420800, #    local_end 1985-11-02 00:00:00 (Sat)
  -18000,
  0,
  '-05',
      ],
      [
  62635438800, #    utc_start 1985-11-02 05:00:00 (Sat)
  62646926400, #      utc_end 1986-03-15 04:00:00 (Sat)
  62635424400, #  local_start 1985-11-02 01:00:00 (Sat)
  62646912000, #    local_end 1986-03-15 00:00:00 (Sat)
  -14400,
  1,
  '-04',
      ],
      [
  62646926400, #    utc_start 1986-03-15 04:00:00 (Sat)
  62666283600, #      utc_end 1986-10-25 05:00:00 (Sat)
  62646908400, #  local_start 1986-03-14 23:00:00 (Fri)
  62666265600, #    local_end 1986-10-25 00:00:00 (Sat)
  -18000,
  0,
  '-05',
      ],
      [
  62666283600, #    utc_start 1986-10-25 05:00:00 (Sat)
  62675956800, #      utc_end 1987-02-14 04:00:00 (Sat)
  62666269200, #  local_start 1986-10-25 01:00:00 (Sat)
  62675942400, #    local_end 1987-02-14 00:00:00 (Sat)
  -14400,
  1,
  '-04',
      ],
      [
  62675956800, #    utc_start 1987-02-14 04:00:00 (Sat)
  62697819600, #      utc_end 1987-10-25 05:00:00 (Sun)
  62675938800, #  local_start 1987-02-13 23:00:00 (Fri)
  62697801600, #    local_end 1987-10-25 00:00:00 (Sun)
  -18000,
  0,
  '-05',
      ],
      [
  62697819600, #    utc_start 1987-10-25 05:00:00 (Sun)
  62706888000, #      utc_end 1988-02-07 04:00:00 (Sun)
  62697805200, #  local_start 1987-10-25 01:00:00 (Sun)
  62706873600, #    local_end 1988-02-07 00:00:00 (Sun)
  -14400,
  1,
  '-04',
      ],
      [
  62706888000, #    utc_start 1988-02-07 04:00:00 (Sun)
  62725726800, #      utc_end 1988-09-12 05:00:00 (Mon)
  62706870000, #  local_start 1988-02-06 23:00:00 (Sat)
  62725708800, #    local_end 1988-09-12 00:00:00 (Mon)
  -18000,
  0,
  '-05',
      ],
      [
  62725726800, #    utc_start 1988-09-12 05:00:00 (Mon)
  62884875600, #      utc_end 1993-09-28 05:00:00 (Tue)
  62725708800, #  local_start 1988-09-12 00:00:00 (Mon)
  62884857600, #    local_end 1993-09-28 00:00:00 (Tue)
  -18000,
  0,
  '-05',
      ],
      [
  62884875600, #    utc_start 1993-09-28 05:00:00 (Tue)
  62886517200, #      utc_end 1993-10-17 05:00:00 (Sun)
  62884857600, #  local_start 1993-09-28 00:00:00 (Tue)
  62886499200, #    local_end 1993-10-17 00:00:00 (Sun)
  -18000,
  0,
  '-05',
      ],
      [
  62886517200, #    utc_start 1993-10-17 05:00:00 (Sun)
  62897400000, #      utc_end 1994-02-20 04:00:00 (Sun)
  62886502800, #  local_start 1993-10-17 01:00:00 (Sun)
  62897385600, #    local_end 1994-02-20 00:00:00 (Sun)
  -14400,
  1,
  '-04',
      ],
      [
  62897400000, #    utc_start 1994-02-20 04:00:00 (Sun)
  62915893200, #      utc_end 1994-09-22 05:00:00 (Thu)
  62897382000, #  local_start 1994-02-19 23:00:00 (Sat)
  62915875200, #    local_end 1994-09-22 00:00:00 (Thu)
  -18000,
  0,
  '-05',
      ],
      [
  62915893200, #    utc_start 1994-09-22 05:00:00 (Thu)
  63349966800, #      utc_end 2008-06-24 05:00:00 (Tue)
  62915875200, #  local_start 1994-09-22 00:00:00 (Thu)
  63349948800, #    local_end 2008-06-24 00:00:00 (Tue)
  -18000,
  0,
  '-05',
      ],
      [
  63349966800, #    utc_start 2008-06-24 05:00:00 (Tue)
  63519739200, #      utc_end 2013-11-10 04:00:00 (Sun)
  63349952400, #  local_start 2008-06-24 01:00:00 (Tue)
  63519724800, #    local_end 2013-11-10 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63519739200, #    utc_start 2013-11-10 04:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #      utc_end
  63519721200, #  local_start 2013-11-09 23:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #    local_end
  -18000,
  0,
  '-05',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {15}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_EIRUNEPE

    $main::fatpacked{"DateTime/TimeZone/America/El_Salvador.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_EL_SALVADOR';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::El_Salvador;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::El_Salvador::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60589403808, #      utc_end 1921-01-01 05:56:48 (Sat)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60589382400, #    local_end 1921-01-01 00:00:00 (Sat)
  -21408,
  0,
  'LMT',
      ],
      [
  60589403808, #    utc_start 1921-01-01 05:56:48 (Sat)
  62682703200, #      utc_end 1987-05-03 06:00:00 (Sun)
  60589382208, #  local_start 1920-12-31 23:56:48 (Fri)
  62682681600, #    local_end 1987-05-03 00:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62682703200, #    utc_start 1987-05-03 06:00:00 (Sun)
  62695400400, #      utc_end 1987-09-27 05:00:00 (Sun)
  62682685200, #  local_start 1987-05-03 01:00:00 (Sun)
  62695382400, #    local_end 1987-09-27 00:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62695400400, #    utc_start 1987-09-27 05:00:00 (Sun)
  62714152800, #      utc_end 1988-05-01 06:00:00 (Sun)
  62695378800, #  local_start 1987-09-26 23:00:00 (Sat)
  62714131200, #    local_end 1988-05-01 00:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62714152800, #    utc_start 1988-05-01 06:00:00 (Sun)
  62726850000, #      utc_end 1988-09-25 05:00:00 (Sun)
  62714134800, #  local_start 1988-05-01 01:00:00 (Sun)
  62726832000, #    local_end 1988-09-25 00:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62726850000, #    utc_start 1988-09-25 05:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #      utc_end
  62726828400, #  local_start 1988-09-24 23:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #    local_end
  -21600,
  0,
  'CST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {2}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_EL_SALVADOR

    $main::fatpacked{"DateTime/TimeZone/America/Fort_Nelson.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_FORT_NELSON';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Fort_Nelson;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Fort_Nelson::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59421802247, #      utc_end 1884-01-01 08:10:47 (Tue)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59421772800, #    local_end 1884-01-01 00:00:00 (Tue)
  -29447,
  0,
  'LMT',
      ],
      [
  59421802247, #    utc_start 1884-01-01 08:10:47 (Tue)
  60503623200, #      utc_end 1918-04-14 10:00:00 (Sun)
  59421773447, #  local_start 1884-01-01 00:10:47 (Tue)
  60503594400, #    local_end 1918-04-14 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  60503623200, #    utc_start 1918-04-14 10:00:00 (Sun)
  60520554000, #      utc_end 1918-10-27 09:00:00 (Sun)
  60503598000, #  local_start 1918-04-14 03:00:00 (Sun)
  60520528800, #    local_end 1918-10-27 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  60520554000, #    utc_start 1918-10-27 09:00:00 (Sun)
  61255476000, #      utc_end 1942-02-09 10:00:00 (Mon)
  60520525200, #  local_start 1918-10-27 01:00:00 (Sun)
  61255447200, #    local_end 1942-02-09 02:00:00 (Mon)
  -28800,
  0,
  'PST',
      ],
      [
  61255476000, #    utc_start 1942-02-09 10:00:00 (Mon)
  61366287600, #      utc_end 1945-08-14 23:00:00 (Tue)
  61255450800, #  local_start 1942-02-09 03:00:00 (Mon)
  61366262400, #    local_end 1945-08-14 16:00:00 (Tue)
  -25200,
  1,
  'PWT',
      ],
      [
  61366287600, #    utc_start 1945-08-14 23:00:00 (Tue)
  61370298000, #      utc_end 1945-09-30 09:00:00 (Sun)
  61366262400, #  local_start 1945-08-14 16:00:00 (Tue)
  61370272800, #    local_end 1945-09-30 02:00:00 (Sun)
  -25200,
  1,
  'PPT',
      ],
      [
  61370298000, #    utc_start 1945-09-30 09:00:00 (Sun)
  61378329600, #      utc_end 1946-01-01 08:00:00 (Tue)
  61370269200, #  local_start 1945-09-30 01:00:00 (Sun)
  61378300800, #    local_end 1946-01-01 00:00:00 (Tue)
  -28800,
  0,
  'PST',
      ],
      [
  61378329600, #    utc_start 1946-01-01 08:00:00 (Tue)
  61409865600, #      utc_end 1947-01-01 08:00:00 (Wed)
  61378300800, #  local_start 1946-01-01 00:00:00 (Tue)
  61409836800, #    local_end 1947-01-01 00:00:00 (Wed)
  -28800,
  0,
  'PST',
      ],
      [
  61409865600, #    utc_start 1947-01-01 08:00:00 (Wed)
  61419895200, #      utc_end 1947-04-27 10:00:00 (Sun)
  61409836800, #  local_start 1947-01-01 00:00:00 (Wed)
  61419866400, #    local_end 1947-04-27 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61419895200, #    utc_start 1947-04-27 10:00:00 (Sun)
  61433197200, #      utc_end 1947-09-28 09:00:00 (Sun)
  61419870000, #  local_start 1947-04-27 03:00:00 (Sun)
  61433172000, #    local_end 1947-09-28 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61433197200, #    utc_start 1947-09-28 09:00:00 (Sun)
  61451344800, #      utc_end 1948-04-25 10:00:00 (Sun)
  61433168400, #  local_start 1947-09-28 01:00:00 (Sun)
  61451316000, #    local_end 1948-04-25 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61451344800, #    utc_start 1948-04-25 10:00:00 (Sun)
  61464646800, #      utc_end 1948-09-26 09:00:00 (Sun)
  61451319600, #  local_start 1948-04-25 03:00:00 (Sun)
  61464621600, #    local_end 1948-09-26 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61464646800, #    utc_start 1948-09-26 09:00:00 (Sun)
  61482794400, #      utc_end 1949-04-24 10:00:00 (Sun)
  61464618000, #  local_start 1948-09-26 01:00:00 (Sun)
  61482765600, #    local_end 1949-04-24 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61482794400, #    utc_start 1949-04-24 10:00:00 (Sun)
  61496096400, #      utc_end 1949-09-25 09:00:00 (Sun)
  61482769200, #  local_start 1949-04-24 03:00:00 (Sun)
  61496071200, #    local_end 1949-09-25 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61496096400, #    utc_start 1949-09-25 09:00:00 (Sun)
  61514848800, #      utc_end 1950-04-30 10:00:00 (Sun)
  61496067600, #  local_start 1949-09-25 01:00:00 (Sun)
  61514820000, #    local_end 1950-04-30 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61514848800, #    utc_start 1950-04-30 10:00:00 (Sun)
  61527546000, #      utc_end 1950-09-24 09:00:00 (Sun)
  61514823600, #  local_start 1950-04-30 03:00:00 (Sun)
  61527520800, #    local_end 1950-09-24 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61527546000, #    utc_start 1950-09-24 09:00:00 (Sun)
  61546298400, #      utc_end 1951-04-29 10:00:00 (Sun)
  61527517200, #  local_start 1950-09-24 01:00:00 (Sun)
  61546269600, #    local_end 1951-04-29 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61546298400, #    utc_start 1951-04-29 10:00:00 (Sun)
  61559600400, #      utc_end 1951-09-30 09:00:00 (Sun)
  61546273200, #  local_start 1951-04-29 03:00:00 (Sun)
  61559575200, #    local_end 1951-09-30 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61559600400, #    utc_start 1951-09-30 09:00:00 (Sun)
  61577748000, #      utc_end 1952-04-27 10:00:00 (Sun)
  61559571600, #  local_start 1951-09-30 01:00:00 (Sun)
  61577719200, #    local_end 1952-04-27 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61577748000, #    utc_start 1952-04-27 10:00:00 (Sun)
  61591050000, #      utc_end 1952-09-28 09:00:00 (Sun)
  61577722800, #  local_start 1952-04-27 03:00:00 (Sun)
  61591024800, #    local_end 1952-09-28 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61591050000, #    utc_start 1952-09-28 09:00:00 (Sun)
  61609197600, #      utc_end 1953-04-26 10:00:00 (Sun)
  61591021200, #  local_start 1952-09-28 01:00:00 (Sun)
  61609168800, #    local_end 1953-04-26 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61609197600, #    utc_start 1953-04-26 10:00:00 (Sun)
  61622499600, #      utc_end 1953-09-27 09:00:00 (Sun)
  61609172400, #  local_start 1953-04-26 03:00:00 (Sun)
  61622474400, #    local_end 1953-09-27 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61622499600, #    utc_start 1953-09-27 09:00:00 (Sun)
  61640647200, #      utc_end 1954-04-25 10:00:00 (Sun)
  61622470800, #  local_start 1953-09-27 01:00:00 (Sun)
  61640618400, #    local_end 1954-04-25 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61640647200, #    utc_start 1954-04-25 10:00:00 (Sun)
  61653949200, #      utc_end 1954-09-26 09:00:00 (Sun)
  61640622000, #  local_start 1954-04-25 03:00:00 (Sun)
  61653924000, #    local_end 1954-09-26 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61653949200, #    utc_start 1954-09-26 09:00:00 (Sun)
  61672096800, #      utc_end 1955-04-24 10:00:00 (Sun)
  61653920400, #  local_start 1954-09-26 01:00:00 (Sun)
  61672068000, #    local_end 1955-04-24 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61672096800, #    utc_start 1955-04-24 10:00:00 (Sun)
  61685398800, #      utc_end 1955-09-25 09:00:00 (Sun)
  61672071600, #  local_start 1955-04-24 03:00:00 (Sun)
  61685373600, #    local_end 1955-09-25 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61685398800, #    utc_start 1955-09-25 09:00:00 (Sun)
  61704151200, #      utc_end 1956-04-29 10:00:00 (Sun)
  61685370000, #  local_start 1955-09-25 01:00:00 (Sun)
  61704122400, #    local_end 1956-04-29 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61704151200, #    utc_start 1956-04-29 10:00:00 (Sun)
  61717453200, #      utc_end 1956-09-30 09:00:00 (Sun)
  61704126000, #  local_start 1956-04-29 03:00:00 (Sun)
  61717428000, #    local_end 1956-09-30 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61717453200, #    utc_start 1956-09-30 09:00:00 (Sun)
  61735600800, #      utc_end 1957-04-28 10:00:00 (Sun)
  61717424400, #  local_start 1956-09-30 01:00:00 (Sun)
  61735572000, #    local_end 1957-04-28 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61735600800, #    utc_start 1957-04-28 10:00:00 (Sun)
  61748902800, #      utc_end 1957-09-29 09:00:00 (Sun)
  61735575600, #  local_start 1957-04-28 03:00:00 (Sun)
  61748877600, #    local_end 1957-09-29 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61748902800, #    utc_start 1957-09-29 09:00:00 (Sun)
  61767050400, #      utc_end 1958-04-27 10:00:00 (Sun)
  61748874000, #  local_start 1957-09-29 01:00:00 (Sun)
  61767021600, #    local_end 1958-04-27 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61767050400, #    utc_start 1958-04-27 10:00:00 (Sun)
  61780352400, #      utc_end 1958-09-28 09:00:00 (Sun)
  61767025200, #  local_start 1958-04-27 03:00:00 (Sun)
  61780327200, #    local_end 1958-09-28 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61780352400, #    utc_start 1958-09-28 09:00:00 (Sun)
  61798500000, #      utc_end 1959-04-26 10:00:00 (Sun)
  61780323600, #  local_start 1958-09-28 01:00:00 (Sun)
  61798471200, #    local_end 1959-04-26 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61798500000, #    utc_start 1959-04-26 10:00:00 (Sun)
  61811802000, #      utc_end 1959-09-27 09:00:00 (Sun)
  61798474800, #  local_start 1959-04-26 03:00:00 (Sun)
  61811776800, #    local_end 1959-09-27 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61811802000, #    utc_start 1959-09-27 09:00:00 (Sun)
  61829949600, #      utc_end 1960-04-24 10:00:00 (Sun)
  61811773200, #  local_start 1959-09-27 01:00:00 (Sun)
  61829920800, #    local_end 1960-04-24 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61829949600, #    utc_start 1960-04-24 10:00:00 (Sun)
  61843251600, #      utc_end 1960-09-25 09:00:00 (Sun)
  61829924400, #  local_start 1960-04-24 03:00:00 (Sun)
  61843226400, #    local_end 1960-09-25 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61843251600, #    utc_start 1960-09-25 09:00:00 (Sun)
  61862004000, #      utc_end 1961-04-30 10:00:00 (Sun)
  61843222800, #  local_start 1960-09-25 01:00:00 (Sun)
  61861975200, #    local_end 1961-04-30 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61862004000, #    utc_start 1961-04-30 10:00:00 (Sun)
  61874701200, #      utc_end 1961-09-24 09:00:00 (Sun)
  61861978800, #  local_start 1961-04-30 03:00:00 (Sun)
  61874676000, #    local_end 1961-09-24 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61874701200, #    utc_start 1961-09-24 09:00:00 (Sun)
  61893453600, #      utc_end 1962-04-29 10:00:00 (Sun)
  61874672400, #  local_start 1961-09-24 01:00:00 (Sun)
  61893424800, #    local_end 1962-04-29 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61893453600, #    utc_start 1962-04-29 10:00:00 (Sun)
  61909174800, #      utc_end 1962-10-28 09:00:00 (Sun)
  61893428400, #  local_start 1962-04-29 03:00:00 (Sun)
  61909149600, #    local_end 1962-10-28 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61909174800, #    utc_start 1962-10-28 09:00:00 (Sun)
  61924903200, #      utc_end 1963-04-28 10:00:00 (Sun)
  61909146000, #  local_start 1962-10-28 01:00:00 (Sun)
  61924874400, #    local_end 1963-04-28 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61924903200, #    utc_start 1963-04-28 10:00:00 (Sun)
  61940624400, #      utc_end 1963-10-27 09:00:00 (Sun)
  61924878000, #  local_start 1963-04-28 03:00:00 (Sun)
  61940599200, #    local_end 1963-10-27 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61940624400, #    utc_start 1963-10-27 09:00:00 (Sun)
  61956352800, #      utc_end 1964-04-26 10:00:00 (Sun)
  61940595600, #  local_start 1963-10-27 01:00:00 (Sun)
  61956324000, #    local_end 1964-04-26 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61956352800, #    utc_start 1964-04-26 10:00:00 (Sun)
  61972074000, #      utc_end 1964-10-25 09:00:00 (Sun)
  61956327600, #  local_start 1964-04-26 03:00:00 (Sun)
  61972048800, #    local_end 1964-10-25 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61972074000, #    utc_start 1964-10-25 09:00:00 (Sun)
  61987802400, #      utc_end 1965-04-25 10:00:00 (Sun)
  61972045200, #  local_start 1964-10-25 01:00:00 (Sun)
  61987773600, #    local_end 1965-04-25 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61987802400, #    utc_start 1965-04-25 10:00:00 (Sun)
  62004128400, #      utc_end 1965-10-31 09:00:00 (Sun)
  61987777200, #  local_start 1965-04-25 03:00:00 (Sun)
  62004103200, #    local_end 1965-10-31 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62004128400, #    utc_start 1965-10-31 09:00:00 (Sun)
  62019252000, #      utc_end 1966-04-24 10:00:00 (Sun)
  62004099600, #  local_start 1965-10-31 01:00:00 (Sun)
  62019223200, #    local_end 1966-04-24 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62019252000, #    utc_start 1966-04-24 10:00:00 (Sun)
  62035578000, #      utc_end 1966-10-30 09:00:00 (Sun)
  62019226800, #  local_start 1966-04-24 03:00:00 (Sun)
  62035552800, #    local_end 1966-10-30 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62035578000, #    utc_start 1966-10-30 09:00:00 (Sun)
  62051306400, #      utc_end 1967-04-30 10:00:00 (Sun)
  62035549200, #  local_start 1966-10-30 01:00:00 (Sun)
  62051277600, #    local_end 1967-04-30 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62051306400, #    utc_start 1967-04-30 10:00:00 (Sun)
  62067027600, #      utc_end 1967-10-29 09:00:00 (Sun)
  62051281200, #  local_start 1967-04-30 03:00:00 (Sun)
  62067002400, #    local_end 1967-10-29 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62067027600, #    utc_start 1967-10-29 09:00:00 (Sun)
  62082756000, #      utc_end 1968-04-28 10:00:00 (Sun)
  62066998800, #  local_start 1967-10-29 01:00:00 (Sun)
  62082727200, #    local_end 1968-04-28 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62082756000, #    utc_start 1968-04-28 10:00:00 (Sun)
  62098477200, #      utc_end 1968-10-27 09:00:00 (Sun)
  62082730800, #  local_start 1968-04-28 03:00:00 (Sun)
  62098452000, #    local_end 1968-10-27 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62098477200, #    utc_start 1968-10-27 09:00:00 (Sun)
  62114205600, #      utc_end 1969-04-27 10:00:00 (Sun)
  62098448400, #  local_start 1968-10-27 01:00:00 (Sun)
  62114176800, #    local_end 1969-04-27 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62114205600, #    utc_start 1969-04-27 10:00:00 (Sun)
  62129926800, #      utc_end 1969-10-26 09:00:00 (Sun)
  62114180400, #  local_start 1969-04-27 03:00:00 (Sun)
  62129901600, #    local_end 1969-10-26 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62129926800, #    utc_start 1969-10-26 09:00:00 (Sun)
  62145655200, #      utc_end 1970-04-26 10:00:00 (Sun)
  62129898000, #  local_start 1969-10-26 01:00:00 (Sun)
  62145626400, #    local_end 1970-04-26 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62145655200, #    utc_start 1970-04-26 10:00:00 (Sun)
  62161376400, #      utc_end 1970-10-25 09:00:00 (Sun)
  62145630000, #  local_start 1970-04-26 03:00:00 (Sun)
  62161351200, #    local_end 1970-10-25 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62161376400, #    utc_start 1970-10-25 09:00:00 (Sun)
  62177104800, #      utc_end 1971-04-25 10:00:00 (Sun)
  62161347600, #  local_start 1970-10-25 01:00:00 (Sun)
  62177076000, #    local_end 1971-04-25 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62177104800, #    utc_start 1971-04-25 10:00:00 (Sun)
  62193430800, #      utc_end 1971-10-31 09:00:00 (Sun)
  62177079600, #  local_start 1971-04-25 03:00:00 (Sun)
  62193405600, #    local_end 1971-10-31 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62193430800, #    utc_start 1971-10-31 09:00:00 (Sun)
  62209159200, #      utc_end 1972-04-30 10:00:00 (Sun)
  62193402000, #  local_start 1971-10-31 01:00:00 (Sun)
  62209130400, #    local_end 1972-04-30 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62209159200, #    utc_start 1972-04-30 10:00:00 (Sun)
  62224880400, #      utc_end 1972-10-29 09:00:00 (Sun)
  62209134000, #  local_start 1972-04-30 03:00:00 (Sun)
  62224855200, #    local_end 1972-10-29 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62224880400, #    utc_start 1972-10-29 09:00:00 (Sun)
  62240608800, #      utc_end 1973-04-29 10:00:00 (Sun)
  62224851600, #  local_start 1972-10-29 01:00:00 (Sun)
  62240580000, #    local_end 1973-04-29 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62240608800, #    utc_start 1973-04-29 10:00:00 (Sun)
  62256330000, #      utc_end 1973-10-28 09:00:00 (Sun)
  62240583600, #  local_start 1973-04-29 03:00:00 (Sun)
  62256304800, #    local_end 1973-10-28 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62256330000, #    utc_start 1973-10-28 09:00:00 (Sun)
  62272058400, #      utc_end 1974-04-28 10:00:00 (Sun)
  62256301200, #  local_start 1973-10-28 01:00:00 (Sun)
  62272029600, #    local_end 1974-04-28 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62272058400, #    utc_start 1974-04-28 10:00:00 (Sun)
  62287779600, #      utc_end 1974-10-27 09:00:00 (Sun)
  62272033200, #  local_start 1974-04-28 03:00:00 (Sun)
  62287754400, #    local_end 1974-10-27 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62287779600, #    utc_start 1974-10-27 09:00:00 (Sun)
  62303508000, #      utc_end 1975-04-27 10:00:00 (Sun)
  62287750800, #  local_start 1974-10-27 01:00:00 (Sun)
  62303479200, #    local_end 1975-04-27 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62303508000, #    utc_start 1975-04-27 10:00:00 (Sun)
  62319229200, #      utc_end 1975-10-26 09:00:00 (Sun)
  62303482800, #  local_start 1975-04-27 03:00:00 (Sun)
  62319204000, #    local_end 1975-10-26 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62319229200, #    utc_start 1975-10-26 09:00:00 (Sun)
  62334957600, #      utc_end 1976-04-25 10:00:00 (Sun)
  62319200400, #  local_start 1975-10-26 01:00:00 (Sun)
  62334928800, #    local_end 1976-04-25 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62334957600, #    utc_start 1976-04-25 10:00:00 (Sun)
  62351283600, #      utc_end 1976-10-31 09:00:00 (Sun)
  62334932400, #  local_start 1976-04-25 03:00:00 (Sun)
  62351258400, #    local_end 1976-10-31 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62351283600, #    utc_start 1976-10-31 09:00:00 (Sun)
  62366407200, #      utc_end 1977-04-24 10:00:00 (Sun)
  62351254800, #  local_start 1976-10-31 01:00:00 (Sun)
  62366378400, #    local_end 1977-04-24 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62366407200, #    utc_start 1977-04-24 10:00:00 (Sun)
  62382733200, #      utc_end 1977-10-30 09:00:00 (Sun)
  62366382000, #  local_start 1977-04-24 03:00:00 (Sun)
  62382708000, #    local_end 1977-10-30 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62382733200, #    utc_start 1977-10-30 09:00:00 (Sun)
  62398461600, #      utc_end 1978-04-30 10:00:00 (Sun)
  62382704400, #  local_start 1977-10-30 01:00:00 (Sun)
  62398432800, #    local_end 1978-04-30 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62398461600, #    utc_start 1978-04-30 10:00:00 (Sun)
  62414182800, #      utc_end 1978-10-29 09:00:00 (Sun)
  62398436400, #  local_start 1978-04-30 03:00:00 (Sun)
  62414157600, #    local_end 1978-10-29 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62414182800, #    utc_start 1978-10-29 09:00:00 (Sun)
  62429911200, #      utc_end 1979-04-29 10:00:00 (Sun)
  62414154000, #  local_start 1978-10-29 01:00:00 (Sun)
  62429882400, #    local_end 1979-04-29 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62429911200, #    utc_start 1979-04-29 10:00:00 (Sun)
  62445632400, #      utc_end 1979-10-28 09:00:00 (Sun)
  62429886000, #  local_start 1979-04-29 03:00:00 (Sun)
  62445607200, #    local_end 1979-10-28 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62445632400, #    utc_start 1979-10-28 09:00:00 (Sun)
  62461360800, #      utc_end 1980-04-27 10:00:00 (Sun)
  62445603600, #  local_start 1979-10-28 01:00:00 (Sun)
  62461332000, #    local_end 1980-04-27 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62461360800, #    utc_start 1980-04-27 10:00:00 (Sun)
  62477082000, #      utc_end 1980-10-26 09:00:00 (Sun)
  62461335600, #  local_start 1980-04-27 03:00:00 (Sun)
  62477056800, #    local_end 1980-10-26 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62477082000, #    utc_start 1980-10-26 09:00:00 (Sun)
  62492810400, #      utc_end 1981-04-26 10:00:00 (Sun)
  62477053200, #  local_start 1980-10-26 01:00:00 (Sun)
  62492781600, #    local_end 1981-04-26 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62492810400, #    utc_start 1981-04-26 10:00:00 (Sun)
  62508531600, #      utc_end 1981-10-25 09:00:00 (Sun)
  62492785200, #  local_start 1981-04-26 03:00:00 (Sun)
  62508506400, #    local_end 1981-10-25 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62508531600, #    utc_start 1981-10-25 09:00:00 (Sun)
  62524260000, #      utc_end 1982-04-25 10:00:00 (Sun)
  62508502800, #  local_start 1981-10-25 01:00:00 (Sun)
  62524231200, #    local_end 1982-04-25 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62524260000, #    utc_start 1982-04-25 10:00:00 (Sun)
  62540586000, #      utc_end 1982-10-31 09:00:00 (Sun)
  62524234800, #  local_start 1982-04-25 03:00:00 (Sun)
  62540560800, #    local_end 1982-10-31 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62540586000, #    utc_start 1982-10-31 09:00:00 (Sun)
  62555709600, #      utc_end 1983-04-24 10:00:00 (Sun)
  62540557200, #  local_start 1982-10-31 01:00:00 (Sun)
  62555680800, #    local_end 1983-04-24 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62555709600, #    utc_start 1983-04-24 10:00:00 (Sun)
  62572035600, #      utc_end 1983-10-30 09:00:00 (Sun)
  62555684400, #  local_start 1983-04-24 03:00:00 (Sun)
  62572010400, #    local_end 1983-10-30 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62572035600, #    utc_start 1983-10-30 09:00:00 (Sun)
  62587764000, #      utc_end 1984-04-29 10:00:00 (Sun)
  62572006800, #  local_start 1983-10-30 01:00:00 (Sun)
  62587735200, #    local_end 1984-04-29 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62587764000, #    utc_start 1984-04-29 10:00:00 (Sun)
  62603485200, #      utc_end 1984-10-28 09:00:00 (Sun)
  62587738800, #  local_start 1984-04-29 03:00:00 (Sun)
  62603460000, #    local_end 1984-10-28 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62603485200, #    utc_start 1984-10-28 09:00:00 (Sun)
  62619213600, #      utc_end 1985-04-28 10:00:00 (Sun)
  62603456400, #  local_start 1984-10-28 01:00:00 (Sun)
  62619184800, #    local_end 1985-04-28 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62619213600, #    utc_start 1985-04-28 10:00:00 (Sun)
  62634934800, #      utc_end 1985-10-27 09:00:00 (Sun)
  62619188400, #  local_start 1985-04-28 03:00:00 (Sun)
  62634909600, #    local_end 1985-10-27 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62634934800, #    utc_start 1985-10-27 09:00:00 (Sun)
  62650663200, #      utc_end 1986-04-27 10:00:00 (Sun)
  62634906000, #  local_start 1985-10-27 01:00:00 (Sun)
  62650634400, #    local_end 1986-04-27 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62650663200, #    utc_start 1986-04-27 10:00:00 (Sun)
  62666384400, #      utc_end 1986-10-26 09:00:00 (Sun)
  62650638000, #  local_start 1986-04-27 03:00:00 (Sun)
  62666359200, #    local_end 1986-10-26 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62666384400, #    utc_start 1986-10-26 09:00:00 (Sun)
  62672169600, #      utc_end 1987-01-01 08:00:00 (Thu)
  62666355600, #  local_start 1986-10-26 01:00:00 (Sun)
  62672140800, #    local_end 1987-01-01 00:00:00 (Thu)
  -28800,
  0,
  'PST',
      ],
      [
  62672169600, #    utc_start 1987-01-01 08:00:00 (Thu)
  62680298400, #      utc_end 1987-04-05 10:00:00 (Sun)
  62672140800, #  local_start 1987-01-01 00:00:00 (Thu)
  62680269600, #    local_end 1987-04-05 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62680298400, #    utc_start 1987-04-05 10:00:00 (Sun)
  62697834000, #      utc_end 1987-10-25 09:00:00 (Sun)
  62680273200, #  local_start 1987-04-05 03:00:00 (Sun)
  62697808800, #    local_end 1987-10-25 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62697834000, #    utc_start 1987-10-25 09:00:00 (Sun)
  62711748000, #      utc_end 1988-04-03 10:00:00 (Sun)
  62697805200, #  local_start 1987-10-25 01:00:00 (Sun)
  62711719200, #    local_end 1988-04-03 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62711748000, #    utc_start 1988-04-03 10:00:00 (Sun)
  62729888400, #      utc_end 1988-10-30 09:00:00 (Sun)
  62711722800, #  local_start 1988-04-03 03:00:00 (Sun)
  62729863200, #    local_end 1988-10-30 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62729888400, #    utc_start 1988-10-30 09:00:00 (Sun)
  62743197600, #      utc_end 1989-04-02 10:00:00 (Sun)
  62729859600, #  local_start 1988-10-30 01:00:00 (Sun)
  62743168800, #    local_end 1989-04-02 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62743197600, #    utc_start 1989-04-02 10:00:00 (Sun)
  62761338000, #      utc_end 1989-10-29 09:00:00 (Sun)
  62743172400, #  local_start 1989-04-02 03:00:00 (Sun)
  62761312800, #    local_end 1989-10-29 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62761338000, #    utc_start 1989-10-29 09:00:00 (Sun)
  62774647200, #      utc_end 1990-04-01 10:00:00 (Sun)
  62761309200, #  local_start 1989-10-29 01:00:00 (Sun)
  62774618400, #    local_end 1990-04-01 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62774647200, #    utc_start 1990-04-01 10:00:00 (Sun)
  62792787600, #      utc_end 1990-10-28 09:00:00 (Sun)
  62774622000, #  local_start 1990-04-01 03:00:00 (Sun)
  62792762400, #    local_end 1990-10-28 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62792787600, #    utc_start 1990-10-28 09:00:00 (Sun)
  62806701600, #      utc_end 1991-04-07 10:00:00 (Sun)
  62792758800, #  local_start 1990-10-28 01:00:00 (Sun)
  62806672800, #    local_end 1991-04-07 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62806701600, #    utc_start 1991-04-07 10:00:00 (Sun)
  62824237200, #      utc_end 1991-10-27 09:00:00 (Sun)
  62806676400, #  local_start 1991-04-07 03:00:00 (Sun)
  62824212000, #    local_end 1991-10-27 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62824237200, #    utc_start 1991-10-27 09:00:00 (Sun)
  62838151200, #      utc_end 1992-04-05 10:00:00 (Sun)
  62824208400, #  local_start 1991-10-27 01:00:00 (Sun)
  62838122400, #    local_end 1992-04-05 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62838151200, #    utc_start 1992-04-05 10:00:00 (Sun)
  62855686800, #      utc_end 1992-10-25 09:00:00 (Sun)
  62838126000, #  local_start 1992-04-05 03:00:00 (Sun)
  62855661600, #    local_end 1992-10-25 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62855686800, #    utc_start 1992-10-25 09:00:00 (Sun)
  62869600800, #      utc_end 1993-04-04 10:00:00 (Sun)
  62855658000, #  local_start 1992-10-25 01:00:00 (Sun)
  62869572000, #    local_end 1993-04-04 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62869600800, #    utc_start 1993-04-04 10:00:00 (Sun)
  62887741200, #      utc_end 1993-10-31 09:00:00 (Sun)
  62869575600, #  local_start 1993-04-04 03:00:00 (Sun)
  62887716000, #    local_end 1993-10-31 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62887741200, #    utc_start 1993-10-31 09:00:00 (Sun)
  62901050400, #      utc_end 1994-04-03 10:00:00 (Sun)
  62887712400, #  local_start 1993-10-31 01:00:00 (Sun)
  62901021600, #    local_end 1994-04-03 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62901050400, #    utc_start 1994-04-03 10:00:00 (Sun)
  62919190800, #      utc_end 1994-10-30 09:00:00 (Sun)
  62901025200, #  local_start 1994-04-03 03:00:00 (Sun)
  62919165600, #    local_end 1994-10-30 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62919190800, #    utc_start 1994-10-30 09:00:00 (Sun)
  62932500000, #      utc_end 1995-04-02 10:00:00 (Sun)
  62919162000, #  local_start 1994-10-30 01:00:00 (Sun)
  62932471200, #    local_end 1995-04-02 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62932500000, #    utc_start 1995-04-02 10:00:00 (Sun)
  62950640400, #      utc_end 1995-10-29 09:00:00 (Sun)
  62932474800, #  local_start 1995-04-02 03:00:00 (Sun)
  62950615200, #    local_end 1995-10-29 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62950640400, #    utc_start 1995-10-29 09:00:00 (Sun)
  62964554400, #      utc_end 1996-04-07 10:00:00 (Sun)
  62950611600, #  local_start 1995-10-29 01:00:00 (Sun)
  62964525600, #    local_end 1996-04-07 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62964554400, #    utc_start 1996-04-07 10:00:00 (Sun)
  62982090000, #      utc_end 1996-10-27 09:00:00 (Sun)
  62964529200, #  local_start 1996-04-07 03:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62982090000, #    utc_start 1996-10-27 09:00:00 (Sun)
  62996004000, #      utc_end 1997-04-06 10:00:00 (Sun)
  62982061200, #  local_start 1996-10-27 01:00:00 (Sun)
  62995975200, #    local_end 1997-04-06 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62996004000, #    utc_start 1997-04-06 10:00:00 (Sun)
  63013539600, #      utc_end 1997-10-26 09:00:00 (Sun)
  62995978800, #  local_start 1997-04-06 03:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63013539600, #    utc_start 1997-10-26 09:00:00 (Sun)
  63027453600, #      utc_end 1998-04-05 10:00:00 (Sun)
  63013510800, #  local_start 1997-10-26 01:00:00 (Sun)
  63027424800, #    local_end 1998-04-05 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63027453600, #    utc_start 1998-04-05 10:00:00 (Sun)
  63044989200, #      utc_end 1998-10-25 09:00:00 (Sun)
  63027428400, #  local_start 1998-04-05 03:00:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63044989200, #    utc_start 1998-10-25 09:00:00 (Sun)
  63058903200, #      utc_end 1999-04-04 10:00:00 (Sun)
  63044960400, #  local_start 1998-10-25 01:00:00 (Sun)
  63058874400, #    local_end 1999-04-04 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63058903200, #    utc_start 1999-04-04 10:00:00 (Sun)
  63077043600, #      utc_end 1999-10-31 09:00:00 (Sun)
  63058878000, #  local_start 1999-04-04 03:00:00 (Sun)
  63077018400, #    local_end 1999-10-31 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63077043600, #    utc_start 1999-10-31 09:00:00 (Sun)
  63090352800, #      utc_end 2000-04-02 10:00:00 (Sun)
  63077014800, #  local_start 1999-10-31 01:00:00 (Sun)
  63090324000, #    local_end 2000-04-02 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63090352800, #    utc_start 2000-04-02 10:00:00 (Sun)
  63108493200, #      utc_end 2000-10-29 09:00:00 (Sun)
  63090327600, #  local_start 2000-04-02 03:00:00 (Sun)
  63108468000, #    local_end 2000-10-29 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63108493200, #    utc_start 2000-10-29 09:00:00 (Sun)
  63121802400, #      utc_end 2001-04-01 10:00:00 (Sun)
  63108464400, #  local_start 2000-10-29 01:00:00 (Sun)
  63121773600, #    local_end 2001-04-01 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63121802400, #    utc_start 2001-04-01 10:00:00 (Sun)
  63139942800, #      utc_end 2001-10-28 09:00:00 (Sun)
  63121777200, #  local_start 2001-04-01 03:00:00 (Sun)
  63139917600, #    local_end 2001-10-28 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63139942800, #    utc_start 2001-10-28 09:00:00 (Sun)
  63153856800, #      utc_end 2002-04-07 10:00:00 (Sun)
  63139914000, #  local_start 2001-10-28 01:00:00 (Sun)
  63153828000, #    local_end 2002-04-07 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63153856800, #    utc_start 2002-04-07 10:00:00 (Sun)
  63171392400, #      utc_end 2002-10-27 09:00:00 (Sun)
  63153831600, #  local_start 2002-04-07 03:00:00 (Sun)
  63171367200, #    local_end 2002-10-27 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63171392400, #    utc_start 2002-10-27 09:00:00 (Sun)
  63185306400, #      utc_end 2003-04-06 10:00:00 (Sun)
  63171363600, #  local_start 2002-10-27 01:00:00 (Sun)
  63185277600, #    local_end 2003-04-06 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63185306400, #    utc_start 2003-04-06 10:00:00 (Sun)
  63202842000, #      utc_end 2003-10-26 09:00:00 (Sun)
  63185281200, #  local_start 2003-04-06 03:00:00 (Sun)
  63202816800, #    local_end 2003-10-26 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63202842000, #    utc_start 2003-10-26 09:00:00 (Sun)
  63216756000, #      utc_end 2004-04-04 10:00:00 (Sun)
  63202813200, #  local_start 2003-10-26 01:00:00 (Sun)
  63216727200, #    local_end 2004-04-04 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63216756000, #    utc_start 2004-04-04 10:00:00 (Sun)
  63234896400, #      utc_end 2004-10-31 09:00:00 (Sun)
  63216730800, #  local_start 2004-04-04 03:00:00 (Sun)
  63234871200, #    local_end 2004-10-31 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63234896400, #    utc_start 2004-10-31 09:00:00 (Sun)
  63248205600, #      utc_end 2005-04-03 10:00:00 (Sun)
  63234867600, #  local_start 2004-10-31 01:00:00 (Sun)
  63248176800, #    local_end 2005-04-03 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63248205600, #    utc_start 2005-04-03 10:00:00 (Sun)
  63266346000, #      utc_end 2005-10-30 09:00:00 (Sun)
  63248180400, #  local_start 2005-04-03 03:00:00 (Sun)
  63266320800, #    local_end 2005-10-30 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63266346000, #    utc_start 2005-10-30 09:00:00 (Sun)
  63279655200, #      utc_end 2006-04-02 10:00:00 (Sun)
  63266317200, #  local_start 2005-10-30 01:00:00 (Sun)
  63279626400, #    local_end 2006-04-02 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63279655200, #    utc_start 2006-04-02 10:00:00 (Sun)
  63297795600, #      utc_end 2006-10-29 09:00:00 (Sun)
  63279630000, #  local_start 2006-04-02 03:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63297795600, #    utc_start 2006-10-29 09:00:00 (Sun)
  63309290400, #      utc_end 2007-03-11 10:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63309261600, #    local_end 2007-03-11 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63309290400, #    utc_start 2007-03-11 10:00:00 (Sun)
  63329850000, #      utc_end 2007-11-04 09:00:00 (Sun)
  63309265200, #  local_start 2007-03-11 03:00:00 (Sun)
  63329824800, #    local_end 2007-11-04 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63329850000, #    utc_start 2007-11-04 09:00:00 (Sun)
  63340740000, #      utc_end 2008-03-09 10:00:00 (Sun)
  63329821200, #  local_start 2007-11-04 01:00:00 (Sun)
  63340711200, #    local_end 2008-03-09 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63340740000, #    utc_start 2008-03-09 10:00:00 (Sun)
  63361299600, #      utc_end 2008-11-02 09:00:00 (Sun)
  63340714800, #  local_start 2008-03-09 03:00:00 (Sun)
  63361274400, #    local_end 2008-11-02 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63361299600, #    utc_start 2008-11-02 09:00:00 (Sun)
  63372189600, #      utc_end 2009-03-08 10:00:00 (Sun)
  63361270800, #  local_start 2008-11-02 01:00:00 (Sun)
  63372160800, #    local_end 2009-03-08 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63372189600, #    utc_start 2009-03-08 10:00:00 (Sun)
  63392749200, #      utc_end 2009-11-01 09:00:00 (Sun)
  63372164400, #  local_start 2009-03-08 03:00:00 (Sun)
  63392724000, #    local_end 2009-11-01 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63392749200, #    utc_start 2009-11-01 09:00:00 (Sun)
  63404244000, #      utc_end 2010-03-14 10:00:00 (Sun)
  63392720400, #  local_start 2009-11-01 01:00:00 (Sun)
  63404215200, #    local_end 2010-03-14 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63404244000, #    utc_start 2010-03-14 10:00:00 (Sun)
  63424803600, #      utc_end 2010-11-07 09:00:00 (Sun)
  63404218800, #  local_start 2010-03-14 03:00:00 (Sun)
  63424778400, #    local_end 2010-11-07 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63424803600, #    utc_start 2010-11-07 09:00:00 (Sun)
  63435693600, #      utc_end 2011-03-13 10:00:00 (Sun)
  63424774800, #  local_start 2010-11-07 01:00:00 (Sun)
  63435664800, #    local_end 2011-03-13 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63435693600, #    utc_start 2011-03-13 10:00:00 (Sun)
  63456253200, #      utc_end 2011-11-06 09:00:00 (Sun)
  63435668400, #  local_start 2011-03-13 03:00:00 (Sun)
  63456228000, #    local_end 2011-11-06 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63456253200, #    utc_start 2011-11-06 09:00:00 (Sun)
  63467143200, #      utc_end 2012-03-11 10:00:00 (Sun)
  63456224400, #  local_start 2011-11-06 01:00:00 (Sun)
  63467114400, #    local_end 2012-03-11 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63467143200, #    utc_start 2012-03-11 10:00:00 (Sun)
  63487702800, #      utc_end 2012-11-04 09:00:00 (Sun)
  63467118000, #  local_start 2012-03-11 03:00:00 (Sun)
  63487677600, #    local_end 2012-11-04 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63487702800, #    utc_start 2012-11-04 09:00:00 (Sun)
  63498592800, #      utc_end 2013-03-10 10:00:00 (Sun)
  63487674000, #  local_start 2012-11-04 01:00:00 (Sun)
  63498564000, #    local_end 2013-03-10 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63498592800, #    utc_start 2013-03-10 10:00:00 (Sun)
  63519152400, #      utc_end 2013-11-03 09:00:00 (Sun)
  63498567600, #  local_start 2013-03-10 03:00:00 (Sun)
  63519127200, #    local_end 2013-11-03 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63519152400, #    utc_start 2013-11-03 09:00:00 (Sun)
  63530042400, #      utc_end 2014-03-09 10:00:00 (Sun)
  63519123600, #  local_start 2013-11-03 01:00:00 (Sun)
  63530013600, #    local_end 2014-03-09 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63530042400, #    utc_start 2014-03-09 10:00:00 (Sun)
  63550602000, #      utc_end 2014-11-02 09:00:00 (Sun)
  63530017200, #  local_start 2014-03-09 03:00:00 (Sun)
  63550576800, #    local_end 2014-11-02 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63550602000, #    utc_start 2014-11-02 09:00:00 (Sun)
  63561492000, #      utc_end 2015-03-08 10:00:00 (Sun)
  63550573200, #  local_start 2014-11-02 01:00:00 (Sun)
  63561463200, #    local_end 2015-03-08 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63561492000, #    utc_start 2015-03-08 10:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #      utc_end
  63561466800, #  local_start 2015-03-08 03:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  -25200,
  0,
  'MST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {71}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_FORT_NELSON

    $main::fatpacked{"DateTime/TimeZone/America/Fortaleza.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_FORTALEZA';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/southamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Fortaleza;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Fortaleza::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60368466840, #      utc_end 1914-01-01 02:34:00 (Thu)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60368457600, #    local_end 1914-01-01 00:00:00 (Thu)
  -9240,
  0,
  'LMT',
      ],
      [
  60368466840, #    utc_start 1914-01-01 02:34:00 (Thu)
  60928725600, #      utc_end 1931-10-03 14:00:00 (Sat)
  60368456040, #  local_start 1913-12-31 23:34:00 (Wed)
  60928714800, #    local_end 1931-10-03 11:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  60928725600, #    utc_start 1931-10-03 14:00:00 (Sat)
  60944320800, #      utc_end 1932-04-01 02:00:00 (Fri)
  60928718400, #  local_start 1931-10-03 12:00:00 (Sat)
  60944313600, #    local_end 1932-04-01 00:00:00 (Fri)
  -7200,
  1,
  '-02',
      ],
      [
  60944320800, #    utc_start 1932-04-01 02:00:00 (Fri)
  60960308400, #      utc_end 1932-10-03 03:00:00 (Mon)
  60944310000, #  local_start 1932-03-31 23:00:00 (Thu)
  60960297600, #    local_end 1932-10-03 00:00:00 (Mon)
  -10800,
  0,
  '-03',
      ],
      [
  60960308400, #    utc_start 1932-10-03 03:00:00 (Mon)
  60975856800, #      utc_end 1933-04-01 02:00:00 (Sat)
  60960301200, #  local_start 1932-10-03 01:00:00 (Mon)
  60975849600, #    local_end 1933-04-01 00:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  60975856800, #    utc_start 1933-04-01 02:00:00 (Sat)
  61501863600, #      utc_end 1949-12-01 03:00:00 (Thu)
  60975846000, #  local_start 1933-03-31 23:00:00 (Fri)
  61501852800, #    local_end 1949-12-01 00:00:00 (Thu)
  -10800,
  0,
  '-03',
      ],
      [
  61501863600, #    utc_start 1949-12-01 03:00:00 (Thu)
  61513614000, #      utc_end 1950-04-16 03:00:00 (Sun)
  61501856400, #  local_start 1949-12-01 01:00:00 (Thu)
  61513606800, #    local_end 1950-04-16 01:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  61513614000, #    utc_start 1950-04-16 03:00:00 (Sun)
  61533399600, #      utc_end 1950-12-01 03:00:00 (Fri)
  61513603200, #  local_start 1950-04-16 00:00:00 (Sun)
  61533388800, #    local_end 1950-12-01 00:00:00 (Fri)
  -10800,
  0,
  '-03',
      ],
      [
  61533399600, #    utc_start 1950-12-01 03:00:00 (Fri)
  61543850400, #      utc_end 1951-04-01 02:00:00 (Sun)
  61533392400, #  local_start 1950-12-01 01:00:00 (Fri)
  61543843200, #    local_end 1951-04-01 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  61543850400, #    utc_start 1951-04-01 02:00:00 (Sun)
  61564935600, #      utc_end 1951-12-01 03:00:00 (Sat)
  61543839600, #  local_start 1951-03-31 23:00:00 (Sat)
  61564924800, #    local_end 1951-12-01 00:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  61564935600, #    utc_start 1951-12-01 03:00:00 (Sat)
  61575472800, #      utc_end 1952-04-01 02:00:00 (Tue)
  61564928400, #  local_start 1951-12-01 01:00:00 (Sat)
  61575465600, #    local_end 1952-04-01 00:00:00 (Tue)
  -7200,
  1,
  '-02',
      ],
      [
  61575472800, #    utc_start 1952-04-01 02:00:00 (Tue)
  61596558000, #      utc_end 1952-12-01 03:00:00 (Mon)
  61575462000, #  local_start 1952-03-31 23:00:00 (Mon)
  61596547200, #    local_end 1952-12-01 00:00:00 (Mon)
  -10800,
  0,
  '-03',
      ],
      [
  61596558000, #    utc_start 1952-12-01 03:00:00 (Mon)
  61604330400, #      utc_end 1953-03-01 02:00:00 (Sun)
  61596550800, #  local_start 1952-12-01 01:00:00 (Mon)
  61604323200, #    local_end 1953-03-01 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  61604330400, #    utc_start 1953-03-01 02:00:00 (Sun)
  61944318000, #      utc_end 1963-12-09 03:00:00 (Mon)
  61604319600, #  local_start 1953-02-28 23:00:00 (Sat)
  61944307200, #    local_end 1963-12-09 00:00:00 (Mon)
  -10800,
  0,
  '-03',
      ],
      [
  61944318000, #    utc_start 1963-12-09 03:00:00 (Mon)
  61951485600, #      utc_end 1964-03-01 02:00:00 (Sun)
  61944310800, #  local_start 1963-12-09 01:00:00 (Mon)
  61951478400, #    local_end 1964-03-01 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  61951485600, #    utc_start 1964-03-01 02:00:00 (Sun)
  61980519600, #      utc_end 1965-01-31 03:00:00 (Sun)
  61951474800, #  local_start 1964-02-29 23:00:00 (Sat)
  61980508800, #    local_end 1965-01-31 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  61980519600, #    utc_start 1965-01-31 03:00:00 (Sun)
  61985613600, #      utc_end 1965-03-31 02:00:00 (Wed)
  61980512400, #  local_start 1965-01-31 01:00:00 (Sun)
  61985606400, #    local_end 1965-03-31 00:00:00 (Wed)
  -7200,
  1,
  '-02',
      ],
      [
  61985613600, #    utc_start 1965-03-31 02:00:00 (Wed)
  62006785200, #      utc_end 1965-12-01 03:00:00 (Wed)
  61985602800, #  local_start 1965-03-30 23:00:00 (Tue)
  62006774400, #    local_end 1965-12-01 00:00:00 (Wed)
  -10800,
  0,
  '-03',
      ],
      [
  62006785200, #    utc_start 1965-12-01 03:00:00 (Wed)
  62014557600, #      utc_end 1966-03-01 02:00:00 (Tue)
  62006778000, #  local_start 1965-12-01 01:00:00 (Wed)
  62014550400, #    local_end 1966-03-01 00:00:00 (Tue)
  -7200,
  1,
  '-02',
      ],
      [
  62014557600, #    utc_start 1966-03-01 02:00:00 (Tue)
  62035729200, #      utc_end 1966-11-01 03:00:00 (Tue)
  62014546800, #  local_start 1966-02-28 23:00:00 (Mon)
  62035718400, #    local_end 1966-11-01 00:00:00 (Tue)
  -10800,
  0,
  '-03',
      ],
      [
  62035729200, #    utc_start 1966-11-01 03:00:00 (Tue)
  62046093600, #      utc_end 1967-03-01 02:00:00 (Wed)
  62035722000, #  local_start 1966-11-01 01:00:00 (Tue)
  62046086400, #    local_end 1967-03-01 00:00:00 (Wed)
  -7200,
  1,
  '-02',
      ],
      [
  62046093600, #    utc_start 1967-03-01 02:00:00 (Wed)
  62067265200, #      utc_end 1967-11-01 03:00:00 (Wed)
  62046082800, #  local_start 1967-02-28 23:00:00 (Tue)
  62067254400, #    local_end 1967-11-01 00:00:00 (Wed)
  -10800,
  0,
  '-03',
      ],
      [
  62067265200, #    utc_start 1967-11-01 03:00:00 (Wed)
  62077716000, #      utc_end 1968-03-01 02:00:00 (Fri)
  62067258000, #  local_start 1967-11-01 01:00:00 (Wed)
  62077708800, #    local_end 1968-03-01 00:00:00 (Fri)
  -7200,
  1,
  '-02',
      ],
      [
  62077716000, #    utc_start 1968-03-01 02:00:00 (Fri)
  62635431600, #      utc_end 1985-11-02 03:00:00 (Sat)
  62077705200, #  local_start 1968-02-29 23:00:00 (Thu)
  62635420800, #    local_end 1985-11-02 00:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  62635431600, #    utc_start 1985-11-02 03:00:00 (Sat)
  62646919200, #      utc_end 1986-03-15 02:00:00 (Sat)
  62635424400, #  local_start 1985-11-02 01:00:00 (Sat)
  62646912000, #    local_end 1986-03-15 00:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  62646919200, #    utc_start 1986-03-15 02:00:00 (Sat)
  62666276400, #      utc_end 1986-10-25 03:00:00 (Sat)
  62646908400, #  local_start 1986-03-14 23:00:00 (Fri)
  62666265600, #    local_end 1986-10-25 00:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  62666276400, #    utc_start 1986-10-25 03:00:00 (Sat)
  62675949600, #      utc_end 1987-02-14 02:00:00 (Sat)
  62666269200, #  local_start 1986-10-25 01:00:00 (Sat)
  62675942400, #    local_end 1987-02-14 00:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  62675949600, #    utc_start 1987-02-14 02:00:00 (Sat)
  62697812400, #      utc_end 1987-10-25 03:00:00 (Sun)
  62675938800, #  local_start 1987-02-13 23:00:00 (Fri)
  62697801600, #    local_end 1987-10-25 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62697812400, #    utc_start 1987-10-25 03:00:00 (Sun)
  62706880800, #      utc_end 1988-02-07 02:00:00 (Sun)
  62697805200, #  local_start 1987-10-25 01:00:00 (Sun)
  62706873600, #    local_end 1988-02-07 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62706880800, #    utc_start 1988-02-07 02:00:00 (Sun)
  62728657200, #      utc_end 1988-10-16 03:00:00 (Sun)
  62706870000, #  local_start 1988-02-06 23:00:00 (Sat)
  62728646400, #    local_end 1988-10-16 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62728657200, #    utc_start 1988-10-16 03:00:00 (Sun)
  62737725600, #      utc_end 1989-01-29 02:00:00 (Sun)
  62728650000, #  local_start 1988-10-16 01:00:00 (Sun)
  62737718400, #    local_end 1989-01-29 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62737725600, #    utc_start 1989-01-29 02:00:00 (Sun)
  62760106800, #      utc_end 1989-10-15 03:00:00 (Sun)
  62737714800, #  local_start 1989-01-28 23:00:00 (Sat)
  62760096000, #    local_end 1989-10-15 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62760106800, #    utc_start 1989-10-15 03:00:00 (Sun)
  62770384800, #      utc_end 1990-02-11 02:00:00 (Sun)
  62760099600, #  local_start 1989-10-15 01:00:00 (Sun)
  62770377600, #    local_end 1990-02-11 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62770384800, #    utc_start 1990-02-11 02:00:00 (Sun)
  62789223600, #      utc_end 1990-09-17 03:00:00 (Mon)
  62770374000, #  local_start 1990-02-10 23:00:00 (Sat)
  62789212800, #    local_end 1990-09-17 00:00:00 (Mon)
  -10800,
  0,
  '-03',
      ],
      [
  62789223600, #    utc_start 1990-09-17 03:00:00 (Mon)
  63074343600, #      utc_end 1999-09-30 03:00:00 (Thu)
  62789212800, #  local_start 1990-09-17 00:00:00 (Mon)
  63074332800, #    local_end 1999-09-30 00:00:00 (Thu)
  -10800,
  0,
  '-03',
      ],
      [
  63074343600, #    utc_start 1999-09-30 03:00:00 (Thu)
  63074602800, #      utc_end 1999-10-03 03:00:00 (Sun)
  63074332800, #  local_start 1999-09-30 00:00:00 (Thu)
  63074592000, #    local_end 1999-10-03 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63074602800, #    utc_start 1999-10-03 03:00:00 (Sun)
  63087300000, #      utc_end 2000-02-27 02:00:00 (Sun)
  63074595600, #  local_start 1999-10-03 01:00:00 (Sun)
  63087292800, #    local_end 2000-02-27 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63087300000, #    utc_start 2000-02-27 02:00:00 (Sun)
  63106657200, #      utc_end 2000-10-08 03:00:00 (Sun)
  63087289200, #  local_start 2000-02-26 23:00:00 (Sat)
  63106646400, #    local_end 2000-10-08 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63106657200, #    utc_start 2000-10-08 03:00:00 (Sun)
  63107863200, #      utc_end 2000-10-22 02:00:00 (Sun)
  63106650000, #  local_start 2000-10-08 01:00:00 (Sun)
  63107856000, #    local_end 2000-10-22 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63107863200, #    utc_start 2000-10-22 02:00:00 (Sun)
  63136033200, #      utc_end 2001-09-13 03:00:00 (Thu)
  63107852400, #  local_start 2000-10-21 23:00:00 (Sat)
  63136022400, #    local_end 2001-09-13 00:00:00 (Thu)
  -10800,
  0,
  '-03',
      ],
      [
  63136033200, #    utc_start 2001-09-13 03:00:00 (Thu)
  63138711600, #      utc_end 2001-10-14 03:00:00 (Sun)
  63136022400, #  local_start 2001-09-13 00:00:00 (Thu)
  63138700800, #    local_end 2001-10-14 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63138711600, #    utc_start 2001-10-14 03:00:00 (Sun)
  63149594400, #      utc_end 2002-02-17 02:00:00 (Sun)
  63138704400, #  local_start 2001-10-14 01:00:00 (Sun)
  63149587200, #    local_end 2002-02-17 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63149594400, #    utc_start 2002-02-17 02:00:00 (Sun)
  63169124400, #      utc_end 2002-10-01 03:00:00 (Tue)
  63149583600, #  local_start 2002-02-16 23:00:00 (Sat)
  63169113600, #    local_end 2002-10-01 00:00:00 (Tue)
  -10800,
  0,
  '-03',
      ],
      [
  63169124400, #    utc_start 2002-10-01 03:00:00 (Tue)
  DateTime::TimeZone::INFINITY, #      utc_end
  63169113600, #  local_start 2002-10-01 00:00:00 (Tue)
  DateTime::TimeZone::INFINITY, #    local_end
  -10800,
  0,
  '-03',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {19}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_FORTALEZA

    $main::fatpacked{"DateTime/TimeZone/America/Glace_Bay.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_GLACE_BAY';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Glace_Bay;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Glace_Bay::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60004036788, #      utc_end 1902-06-15 03:59:48 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60004022400, #    local_end 1902-06-15 00:00:00 (Sun)
  -14388,
  0,
  'LMT',
      ],
      [
  60004036788, #    utc_start 1902-06-15 03:59:48 (Sun)
  60503608800, #      utc_end 1918-04-14 06:00:00 (Sun)
  60004022388, #  local_start 1902-06-14 23:59:48 (Sat)
  60503594400, #    local_end 1918-04-14 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  60503608800, #    utc_start 1918-04-14 06:00:00 (Sun)
  60520539600, #      utc_end 1918-10-27 05:00:00 (Sun)
  60503598000, #  local_start 1918-04-14 03:00:00 (Sun)
  60520528800, #    local_end 1918-10-27 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  60520539600, #    utc_start 1918-10-27 05:00:00 (Sun)
  61255461600, #      utc_end 1942-02-09 06:00:00 (Mon)
  60520525200, #  local_start 1918-10-27 01:00:00 (Sun)
  61255447200, #    local_end 1942-02-09 02:00:00 (Mon)
  -14400,
  0,
  'AST',
      ],
      [
  61255461600, #    utc_start 1942-02-09 06:00:00 (Mon)
  61366287600, #      utc_end 1945-08-14 23:00:00 (Tue)
  61255450800, #  local_start 1942-02-09 03:00:00 (Mon)
  61366276800, #    local_end 1945-08-14 20:00:00 (Tue)
  -10800,
  1,
  'AWT',
      ],
      [
  61366287600, #    utc_start 1945-08-14 23:00:00 (Tue)
  61370283600, #      utc_end 1945-09-30 05:00:00 (Sun)
  61366276800, #  local_start 1945-08-14 20:00:00 (Tue)
  61370272800, #    local_end 1945-09-30 02:00:00 (Sun)
  -10800,
  1,
  'APT',
      ],
      [
  61370283600, #    utc_start 1945-09-30 05:00:00 (Sun)
  61599240000, #      utc_end 1953-01-01 04:00:00 (Thu)
  61370269200, #  local_start 1945-09-30 01:00:00 (Sun)
  61599225600, #    local_end 1953-01-01 00:00:00 (Thu)
  -14400,
  0,
  'AST',
      ],
      [
  61599240000, #    utc_start 1953-01-01 04:00:00 (Thu)
  61609183200, #      utc_end 1953-04-26 06:00:00 (Sun)
  61599225600, #  local_start 1953-01-01 00:00:00 (Thu)
  61609168800, #    local_end 1953-04-26 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  61609183200, #    utc_start 1953-04-26 06:00:00 (Sun)
  61622485200, #      utc_end 1953-09-27 05:00:00 (Sun)
  61609172400, #  local_start 1953-04-26 03:00:00 (Sun)
  61622474400, #    local_end 1953-09-27 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  61622485200, #    utc_start 1953-09-27 05:00:00 (Sun)
  61630776000, #      utc_end 1954-01-01 04:00:00 (Fri)
  61622470800, #  local_start 1953-09-27 01:00:00 (Sun)
  61630761600, #    local_end 1954-01-01 00:00:00 (Fri)
  -14400,
  0,
  'AST',
      ],
      [
  61630776000, #    utc_start 1954-01-01 04:00:00 (Fri)
  62198769600, #      utc_end 1972-01-01 04:00:00 (Sat)
  61630761600, #  local_start 1954-01-01 00:00:00 (Fri)
  62198755200, #    local_end 1972-01-01 00:00:00 (Sat)
  -14400,
  0,
  'AST',
      ],
      [
  62198769600, #    utc_start 1972-01-01 04:00:00 (Sat)
  62209144800, #      utc_end 1972-04-30 06:00:00 (Sun)
  62198755200, #  local_start 1972-01-01 00:00:00 (Sat)
  62209130400, #    local_end 1972-04-30 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62209144800, #    utc_start 1972-04-30 06:00:00 (Sun)
  62224866000, #      utc_end 1972-10-29 05:00:00 (Sun)
  62209134000, #  local_start 1972-04-30 03:00:00 (Sun)
  62224855200, #    local_end 1972-10-29 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62224866000, #    utc_start 1972-10-29 05:00:00 (Sun)
  62240594400, #      utc_end 1973-04-29 06:00:00 (Sun)
  62224851600, #  local_start 1972-10-29 01:00:00 (Sun)
  62240580000, #    local_end 1973-04-29 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62240594400, #    utc_start 1973-04-29 06:00:00 (Sun)
  62256315600, #      utc_end 1973-10-28 05:00:00 (Sun)
  62240583600, #  local_start 1973-04-29 03:00:00 (Sun)
  62256304800, #    local_end 1973-10-28 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62256315600, #    utc_start 1973-10-28 05:00:00 (Sun)
  62261928000, #      utc_end 1974-01-01 04:00:00 (Tue)
  62256301200, #  local_start 1973-10-28 01:00:00 (Sun)
  62261913600, #    local_end 1974-01-01 00:00:00 (Tue)
  -14400,
  0,
  'AST',
      ],
      [
  62261928000, #    utc_start 1974-01-01 04:00:00 (Tue)
  62272044000, #      utc_end 1974-04-28 06:00:00 (Sun)
  62261913600, #  local_start 1974-01-01 00:00:00 (Tue)
  62272029600, #    local_end 1974-04-28 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62272044000, #    utc_start 1974-04-28 06:00:00 (Sun)
  62287765200, #      utc_end 1974-10-27 05:00:00 (Sun)
  62272033200, #  local_start 1974-04-28 03:00:00 (Sun)
  62287754400, #    local_end 1974-10-27 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62287765200, #    utc_start 1974-10-27 05:00:00 (Sun)
  62303493600, #      utc_end 1975-04-27 06:00:00 (Sun)
  62287750800, #  local_start 1974-10-27 01:00:00 (Sun)
  62303479200, #    local_end 1975-04-27 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62303493600, #    utc_start 1975-04-27 06:00:00 (Sun)
  62319214800, #      utc_end 1975-10-26 05:00:00 (Sun)
  62303482800, #  local_start 1975-04-27 03:00:00 (Sun)
  62319204000, #    local_end 1975-10-26 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62319214800, #    utc_start 1975-10-26 05:00:00 (Sun)
  62334943200, #      utc_end 1976-04-25 06:00:00 (Sun)
  62319200400, #  local_start 1975-10-26 01:00:00 (Sun)
  62334928800, #    local_end 1976-04-25 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62334943200, #    utc_start 1976-04-25 06:00:00 (Sun)
  62351269200, #      utc_end 1976-10-31 05:00:00 (Sun)
  62334932400, #  local_start 1976-04-25 03:00:00 (Sun)
  62351258400, #    local_end 1976-10-31 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62351269200, #    utc_start 1976-10-31 05:00:00 (Sun)
  62366392800, #      utc_end 1977-04-24 06:00:00 (Sun)
  62351254800, #  local_start 1976-10-31 01:00:00 (Sun)
  62366378400, #    local_end 1977-04-24 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62366392800, #    utc_start 1977-04-24 06:00:00 (Sun)
  62382718800, #      utc_end 1977-10-30 05:00:00 (Sun)
  62366382000, #  local_start 1977-04-24 03:00:00 (Sun)
  62382708000, #    local_end 1977-10-30 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62382718800, #    utc_start 1977-10-30 05:00:00 (Sun)
  62398447200, #      utc_end 1978-04-30 06:00:00 (Sun)
  62382704400, #  local_start 1977-10-30 01:00:00 (Sun)
  62398432800, #    local_end 1978-04-30 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62398447200, #    utc_start 1978-04-30 06:00:00 (Sun)
  62414168400, #      utc_end 1978-10-29 05:00:00 (Sun)
  62398436400, #  local_start 1978-04-30 03:00:00 (Sun)
  62414157600, #    local_end 1978-10-29 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62414168400, #    utc_start 1978-10-29 05:00:00 (Sun)
  62429896800, #      utc_end 1979-04-29 06:00:00 (Sun)
  62414154000, #  local_start 1978-10-29 01:00:00 (Sun)
  62429882400, #    local_end 1979-04-29 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62429896800, #    utc_start 1979-04-29 06:00:00 (Sun)
  62445618000, #      utc_end 1979-10-28 05:00:00 (Sun)
  62429886000, #  local_start 1979-04-29 03:00:00 (Sun)
  62445607200, #    local_end 1979-10-28 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62445618000, #    utc_start 1979-10-28 05:00:00 (Sun)
  62461346400, #      utc_end 1980-04-27 06:00:00 (Sun)
  62445603600, #  local_start 1979-10-28 01:00:00 (Sun)
  62461332000, #    local_end 1980-04-27 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62461346400, #    utc_start 1980-04-27 06:00:00 (Sun)
  62477067600, #      utc_end 1980-10-26 05:00:00 (Sun)
  62461335600, #  local_start 1980-04-27 03:00:00 (Sun)
  62477056800, #    local_end 1980-10-26 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62477067600, #    utc_start 1980-10-26 05:00:00 (Sun)
  62492796000, #      utc_end 1981-04-26 06:00:00 (Sun)
  62477053200, #  local_start 1980-10-26 01:00:00 (Sun)
  62492781600, #    local_end 1981-04-26 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62492796000, #    utc_start 1981-04-26 06:00:00 (Sun)
  62508517200, #      utc_end 1981-10-25 05:00:00 (Sun)
  62492785200, #  local_start 1981-04-26 03:00:00 (Sun)
  62508506400, #    local_end 1981-10-25 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62508517200, #    utc_start 1981-10-25 05:00:00 (Sun)
  62524245600, #      utc_end 1982-04-25 06:00:00 (Sun)
  62508502800, #  local_start 1981-10-25 01:00:00 (Sun)
  62524231200, #    local_end 1982-04-25 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62524245600, #    utc_start 1982-04-25 06:00:00 (Sun)
  62540571600, #      utc_end 1982-10-31 05:00:00 (Sun)
  62524234800, #  local_start 1982-04-25 03:00:00 (Sun)
  62540560800, #    local_end 1982-10-31 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62540571600, #    utc_start 1982-10-31 05:00:00 (Sun)
  62555695200, #      utc_end 1983-04-24 06:00:00 (Sun)
  62540557200, #  local_start 1982-10-31 01:00:00 (Sun)
  62555680800, #    local_end 1983-04-24 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62555695200, #    utc_start 1983-04-24 06:00:00 (Sun)
  62572021200, #      utc_end 1983-10-30 05:00:00 (Sun)
  62555684400, #  local_start 1983-04-24 03:00:00 (Sun)
  62572010400, #    local_end 1983-10-30 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62572021200, #    utc_start 1983-10-30 05:00:00 (Sun)
  62587749600, #      utc_end 1984-04-29 06:00:00 (Sun)
  62572006800, #  local_start 1983-10-30 01:00:00 (Sun)
  62587735200, #    local_end 1984-04-29 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62587749600, #    utc_start 1984-04-29 06:00:00 (Sun)
  62603470800, #      utc_end 1984-10-28 05:00:00 (Sun)
  62587738800, #  local_start 1984-04-29 03:00:00 (Sun)
  62603460000, #    local_end 1984-10-28 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62603470800, #    utc_start 1984-10-28 05:00:00 (Sun)
  62619199200, #      utc_end 1985-04-28 06:00:00 (Sun)
  62603456400, #  local_start 1984-10-28 01:00:00 (Sun)
  62619184800, #    local_end 1985-04-28 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62619199200, #    utc_start 1985-04-28 06:00:00 (Sun)
  62634920400, #      utc_end 1985-10-27 05:00:00 (Sun)
  62619188400, #  local_start 1985-04-28 03:00:00 (Sun)
  62634909600, #    local_end 1985-10-27 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62634920400, #    utc_start 1985-10-27 05:00:00 (Sun)
  62650648800, #      utc_end 1986-04-27 06:00:00 (Sun)
  62634906000, #  local_start 1985-10-27 01:00:00 (Sun)
  62650634400, #    local_end 1986-04-27 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62650648800, #    utc_start 1986-04-27 06:00:00 (Sun)
  62666370000, #      utc_end 1986-10-26 05:00:00 (Sun)
  62650638000, #  local_start 1986-04-27 03:00:00 (Sun)
  62666359200, #    local_end 1986-10-26 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62666370000, #    utc_start 1986-10-26 05:00:00 (Sun)
  62680284000, #      utc_end 1987-04-05 06:00:00 (Sun)
  62666355600, #  local_start 1986-10-26 01:00:00 (Sun)
  62680269600, #    local_end 1987-04-05 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62680284000, #    utc_start 1987-04-05 06:00:00 (Sun)
  62697819600, #      utc_end 1987-10-25 05:00:00 (Sun)
  62680273200, #  local_start 1987-04-05 03:00:00 (Sun)
  62697808800, #    local_end 1987-10-25 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62697819600, #    utc_start 1987-10-25 05:00:00 (Sun)
  62711733600, #      utc_end 1988-04-03 06:00:00 (Sun)
  62697805200, #  local_start 1987-10-25 01:00:00 (Sun)
  62711719200, #    local_end 1988-04-03 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62711733600, #    utc_start 1988-04-03 06:00:00 (Sun)
  62729874000, #      utc_end 1988-10-30 05:00:00 (Sun)
  62711722800, #  local_start 1988-04-03 03:00:00 (Sun)
  62729863200, #    local_end 1988-10-30 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62729874000, #    utc_start 1988-10-30 05:00:00 (Sun)
  62743183200, #      utc_end 1989-04-02 06:00:00 (Sun)
  62729859600, #  local_start 1988-10-30 01:00:00 (Sun)
  62743168800, #    local_end 1989-04-02 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62743183200, #    utc_start 1989-04-02 06:00:00 (Sun)
  62761323600, #      utc_end 1989-10-29 05:00:00 (Sun)
  62743172400, #  local_start 1989-04-02 03:00:00 (Sun)
  62761312800, #    local_end 1989-10-29 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62761323600, #    utc_start 1989-10-29 05:00:00 (Sun)
  62774632800, #      utc_end 1990-04-01 06:00:00 (Sun)
  62761309200, #  local_start 1989-10-29 01:00:00 (Sun)
  62774618400, #    local_end 1990-04-01 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62774632800, #    utc_start 1990-04-01 06:00:00 (Sun)
  62792773200, #      utc_end 1990-10-28 05:00:00 (Sun)
  62774622000, #  local_start 1990-04-01 03:00:00 (Sun)
  62792762400, #    local_end 1990-10-28 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62792773200, #    utc_start 1990-10-28 05:00:00 (Sun)
  62806687200, #      utc_end 1991-04-07 06:00:00 (Sun)
  62792758800, #  local_start 1990-10-28 01:00:00 (Sun)
  62806672800, #    local_end 1991-04-07 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62806687200, #    utc_start 1991-04-07 06:00:00 (Sun)
  62824222800, #      utc_end 1991-10-27 05:00:00 (Sun)
  62806676400, #  local_start 1991-04-07 03:00:00 (Sun)
  62824212000, #    local_end 1991-10-27 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62824222800, #    utc_start 1991-10-27 05:00:00 (Sun)
  62838136800, #      utc_end 1992-04-05 06:00:00 (Sun)
  62824208400, #  local_start 1991-10-27 01:00:00 (Sun)
  62838122400, #    local_end 1992-04-05 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62838136800, #    utc_start 1992-04-05 06:00:00 (Sun)
  62855672400, #      utc_end 1992-10-25 05:00:00 (Sun)
  62838126000, #  local_start 1992-04-05 03:00:00 (Sun)
  62855661600, #    local_end 1992-10-25 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62855672400, #    utc_start 1992-10-25 05:00:00 (Sun)
  62869586400, #      utc_end 1993-04-04 06:00:00 (Sun)
  62855658000, #  local_start 1992-10-25 01:00:00 (Sun)
  62869572000, #    local_end 1993-04-04 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62869586400, #    utc_start 1993-04-04 06:00:00 (Sun)
  62887726800, #      utc_end 1993-10-31 05:00:00 (Sun)
  62869575600, #  local_start 1993-04-04 03:00:00 (Sun)
  62887716000, #    local_end 1993-10-31 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62887726800, #    utc_start 1993-10-31 05:00:00 (Sun)
  62901036000, #      utc_end 1994-04-03 06:00:00 (Sun)
  62887712400, #  local_start 1993-10-31 01:00:00 (Sun)
  62901021600, #    local_end 1994-04-03 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62901036000, #    utc_start 1994-04-03 06:00:00 (Sun)
  62919176400, #      utc_end 1994-10-30 05:00:00 (Sun)
  62901025200, #  local_start 1994-04-03 03:00:00 (Sun)
  62919165600, #    local_end 1994-10-30 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62919176400, #    utc_start 1994-10-30 05:00:00 (Sun)
  62932485600, #      utc_end 1995-04-02 06:00:00 (Sun)
  62919162000, #  local_start 1994-10-30 01:00:00 (Sun)
  62932471200, #    local_end 1995-04-02 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62932485600, #    utc_start 1995-04-02 06:00:00 (Sun)
  62950626000, #      utc_end 1995-10-29 05:00:00 (Sun)
  62932474800, #  local_start 1995-04-02 03:00:00 (Sun)
  62950615200, #    local_end 1995-10-29 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62950626000, #    utc_start 1995-10-29 05:00:00 (Sun)
  62964540000, #      utc_end 1996-04-07 06:00:00 (Sun)
  62950611600, #  local_start 1995-10-29 01:00:00 (Sun)
  62964525600, #    local_end 1996-04-07 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62964540000, #    utc_start 1996-04-07 06:00:00 (Sun)
  62982075600, #      utc_end 1996-10-27 05:00:00 (Sun)
  62964529200, #  local_start 1996-04-07 03:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62982075600, #    utc_start 1996-10-27 05:00:00 (Sun)
  62995989600, #      utc_end 1997-04-06 06:00:00 (Sun)
  62982061200, #  local_start 1996-10-27 01:00:00 (Sun)
  62995975200, #    local_end 1997-04-06 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62995989600, #    utc_start 1997-04-06 06:00:00 (Sun)
  63013525200, #      utc_end 1997-10-26 05:00:00 (Sun)
  62995978800, #  local_start 1997-04-06 03:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63013525200, #    utc_start 1997-10-26 05:00:00 (Sun)
  63027439200, #      utc_end 1998-04-05 06:00:00 (Sun)
  63013510800, #  local_start 1997-10-26 01:00:00 (Sun)
  63027424800, #    local_end 1998-04-05 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63027439200, #    utc_start 1998-04-05 06:00:00 (Sun)
  63044974800, #      utc_end 1998-10-25 05:00:00 (Sun)
  63027428400, #  local_start 1998-04-05 03:00:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63044974800, #    utc_start 1998-10-25 05:00:00 (Sun)
  63058888800, #      utc_end 1999-04-04 06:00:00 (Sun)
  63044960400, #  local_start 1998-10-25 01:00:00 (Sun)
  63058874400, #    local_end 1999-04-04 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63058888800, #    utc_start 1999-04-04 06:00:00 (Sun)
  63077029200, #      utc_end 1999-10-31 05:00:00 (Sun)
  63058878000, #  local_start 1999-04-04 03:00:00 (Sun)
  63077018400, #    local_end 1999-10-31 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63077029200, #    utc_start 1999-10-31 05:00:00 (Sun)
  63090338400, #      utc_end 2000-04-02 06:00:00 (Sun)
  63077014800, #  local_start 1999-10-31 01:00:00 (Sun)
  63090324000, #    local_end 2000-04-02 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63090338400, #    utc_start 2000-04-02 06:00:00 (Sun)
  63108478800, #      utc_end 2000-10-29 05:00:00 (Sun)
  63090327600, #  local_start 2000-04-02 03:00:00 (Sun)
  63108468000, #    local_end 2000-10-29 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63108478800, #    utc_start 2000-10-29 05:00:00 (Sun)
  63121788000, #      utc_end 2001-04-01 06:00:00 (Sun)
  63108464400, #  local_start 2000-10-29 01:00:00 (Sun)
  63121773600, #    local_end 2001-04-01 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63121788000, #    utc_start 2001-04-01 06:00:00 (Sun)
  63139928400, #      utc_end 2001-10-28 05:00:00 (Sun)
  63121777200, #  local_start 2001-04-01 03:00:00 (Sun)
  63139917600, #    local_end 2001-10-28 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63139928400, #    utc_start 2001-10-28 05:00:00 (Sun)
  63153842400, #      utc_end 2002-04-07 06:00:00 (Sun)
  63139914000, #  local_start 2001-10-28 01:00:00 (Sun)
  63153828000, #    local_end 2002-04-07 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63153842400, #    utc_start 2002-04-07 06:00:00 (Sun)
  63171378000, #      utc_end 2002-10-27 05:00:00 (Sun)
  63153831600, #  local_start 2002-04-07 03:00:00 (Sun)
  63171367200, #    local_end 2002-10-27 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63171378000, #    utc_start 2002-10-27 05:00:00 (Sun)
  63185292000, #      utc_end 2003-04-06 06:00:00 (Sun)
  63171363600, #  local_start 2002-10-27 01:00:00 (Sun)
  63185277600, #    local_end 2003-04-06 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63185292000, #    utc_start 2003-04-06 06:00:00 (Sun)
  63202827600, #      utc_end 2003-10-26 05:00:00 (Sun)
  63185281200, #  local_start 2003-04-06 03:00:00 (Sun)
  63202816800, #    local_end 2003-10-26 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63202827600, #    utc_start 2003-10-26 05:00:00 (Sun)
  63216741600, #      utc_end 2004-04-04 06:00:00 (Sun)
  63202813200, #  local_start 2003-10-26 01:00:00 (Sun)
  63216727200, #    local_end 2004-04-04 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63216741600, #    utc_start 2004-04-04 06:00:00 (Sun)
  63234882000, #      utc_end 2004-10-31 05:00:00 (Sun)
  63216730800, #  local_start 2004-04-04 03:00:00 (Sun)
  63234871200, #    local_end 2004-10-31 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63234882000, #    utc_start 2004-10-31 05:00:00 (Sun)
  63248191200, #      utc_end 2005-04-03 06:00:00 (Sun)
  63234867600, #  local_start 2004-10-31 01:00:00 (Sun)
  63248176800, #    local_end 2005-04-03 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63248191200, #    utc_start 2005-04-03 06:00:00 (Sun)
  63266331600, #      utc_end 2005-10-30 05:00:00 (Sun)
  63248180400, #  local_start 2005-04-03 03:00:00 (Sun)
  63266320800, #    local_end 2005-10-30 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63266331600, #    utc_start 2005-10-30 05:00:00 (Sun)
  63279640800, #      utc_end 2006-04-02 06:00:00 (Sun)
  63266317200, #  local_start 2005-10-30 01:00:00 (Sun)
  63279626400, #    local_end 2006-04-02 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63279640800, #    utc_start 2006-04-02 06:00:00 (Sun)
  63297781200, #      utc_end 2006-10-29 05:00:00 (Sun)
  63279630000, #  local_start 2006-04-02 03:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63297781200, #    utc_start 2006-10-29 05:00:00 (Sun)
  63309276000, #      utc_end 2007-03-11 06:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63309261600, #    local_end 2007-03-11 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63309276000, #    utc_start 2007-03-11 06:00:00 (Sun)
  63329835600, #      utc_end 2007-11-04 05:00:00 (Sun)
  63309265200, #  local_start 2007-03-11 03:00:00 (Sun)
  63329824800, #    local_end 2007-11-04 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63329835600, #    utc_start 2007-11-04 05:00:00 (Sun)
  63340725600, #      utc_end 2008-03-09 06:00:00 (Sun)
  63329821200, #  local_start 2007-11-04 01:00:00 (Sun)
  63340711200, #    local_end 2008-03-09 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63340725600, #    utc_start 2008-03-09 06:00:00 (Sun)
  63361285200, #      utc_end 2008-11-02 05:00:00 (Sun)
  63340714800, #  local_start 2008-03-09 03:00:00 (Sun)
  63361274400, #    local_end 2008-11-02 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63361285200, #    utc_start 2008-11-02 05:00:00 (Sun)
  63372175200, #      utc_end 2009-03-08 06:00:00 (Sun)
  63361270800, #  local_start 2008-11-02 01:00:00 (Sun)
  63372160800, #    local_end 2009-03-08 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63372175200, #    utc_start 2009-03-08 06:00:00 (Sun)
  63392734800, #      utc_end 2009-11-01 05:00:00 (Sun)
  63372164400, #  local_start 2009-03-08 03:00:00 (Sun)
  63392724000, #    local_end 2009-11-01 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63392734800, #    utc_start 2009-11-01 05:00:00 (Sun)
  63404229600, #      utc_end 2010-03-14 06:00:00 (Sun)
  63392720400, #  local_start 2009-11-01 01:00:00 (Sun)
  63404215200, #    local_end 2010-03-14 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63404229600, #    utc_start 2010-03-14 06:00:00 (Sun)
  63424789200, #      utc_end 2010-11-07 05:00:00 (Sun)
  63404218800, #  local_start 2010-03-14 03:00:00 (Sun)
  63424778400, #    local_end 2010-11-07 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63424789200, #    utc_start 2010-11-07 05:00:00 (Sun)
  63435679200, #      utc_end 2011-03-13 06:00:00 (Sun)
  63424774800, #  local_start 2010-11-07 01:00:00 (Sun)
  63435664800, #    local_end 2011-03-13 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63435679200, #    utc_start 2011-03-13 06:00:00 (Sun)
  63456238800, #      utc_end 2011-11-06 05:00:00 (Sun)
  63435668400, #  local_start 2011-03-13 03:00:00 (Sun)
  63456228000, #    local_end 2011-11-06 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63456238800, #    utc_start 2011-11-06 05:00:00 (Sun)
  63467128800, #      utc_end 2012-03-11 06:00:00 (Sun)
  63456224400, #  local_start 2011-11-06 01:00:00 (Sun)
  63467114400, #    local_end 2012-03-11 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63467128800, #    utc_start 2012-03-11 06:00:00 (Sun)
  63487688400, #      utc_end 2012-11-04 05:00:00 (Sun)
  63467118000, #  local_start 2012-03-11 03:00:00 (Sun)
  63487677600, #    local_end 2012-11-04 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63487688400, #    utc_start 2012-11-04 05:00:00 (Sun)
  63498578400, #      utc_end 2013-03-10 06:00:00 (Sun)
  63487674000, #  local_start 2012-11-04 01:00:00 (Sun)
  63498564000, #    local_end 2013-03-10 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63498578400, #    utc_start 2013-03-10 06:00:00 (Sun)
  63519138000, #      utc_end 2013-11-03 05:00:00 (Sun)
  63498567600, #  local_start 2013-03-10 03:00:00 (Sun)
  63519127200, #    local_end 2013-11-03 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63519138000, #    utc_start 2013-11-03 05:00:00 (Sun)
  63530028000, #      utc_end 2014-03-09 06:00:00 (Sun)
  63519123600, #  local_start 2013-11-03 01:00:00 (Sun)
  63530013600, #    local_end 2014-03-09 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63530028000, #    utc_start 2014-03-09 06:00:00 (Sun)
  63550587600, #      utc_end 2014-11-02 05:00:00 (Sun)
  63530017200, #  local_start 2014-03-09 03:00:00 (Sun)
  63550576800, #    local_end 2014-11-02 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63550587600, #    utc_start 2014-11-02 05:00:00 (Sun)
  63561477600, #      utc_end 2015-03-08 06:00:00 (Sun)
  63550573200, #  local_start 2014-11-02 01:00:00 (Sun)
  63561463200, #    local_end 2015-03-08 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63561477600, #    utc_start 2015-03-08 06:00:00 (Sun)
  63582037200, #      utc_end 2015-11-01 05:00:00 (Sun)
  63561466800, #  local_start 2015-03-08 03:00:00 (Sun)
  63582026400, #    local_end 2015-11-01 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63582037200, #    utc_start 2015-11-01 05:00:00 (Sun)
  63593532000, #      utc_end 2016-03-13 06:00:00 (Sun)
  63582022800, #  local_start 2015-11-01 01:00:00 (Sun)
  63593517600, #    local_end 2016-03-13 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63593532000, #    utc_start 2016-03-13 06:00:00 (Sun)
  63614091600, #      utc_end 2016-11-06 05:00:00 (Sun)
  63593521200, #  local_start 2016-03-13 03:00:00 (Sun)
  63614080800, #    local_end 2016-11-06 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63614091600, #    utc_start 2016-11-06 05:00:00 (Sun)
  63624981600, #      utc_end 2017-03-12 06:00:00 (Sun)
  63614077200, #  local_start 2016-11-06 01:00:00 (Sun)
  63624967200, #    local_end 2017-03-12 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63624981600, #    utc_start 2017-03-12 06:00:00 (Sun)
  63645541200, #      utc_end 2017-11-05 05:00:00 (Sun)
  63624970800, #  local_start 2017-03-12 03:00:00 (Sun)
  63645530400, #    local_end 2017-11-05 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63645541200, #    utc_start 2017-11-05 05:00:00 (Sun)
  63656431200, #      utc_end 2018-03-11 06:00:00 (Sun)
  63645526800, #  local_start 2017-11-05 01:00:00 (Sun)
  63656416800, #    local_end 2018-03-11 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63656431200, #    utc_start 2018-03-11 06:00:00 (Sun)
  63676990800, #      utc_end 2018-11-04 05:00:00 (Sun)
  63656420400, #  local_start 2018-03-11 03:00:00 (Sun)
  63676980000, #    local_end 2018-11-04 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63676990800, #    utc_start 2018-11-04 05:00:00 (Sun)
  63687880800, #      utc_end 2019-03-10 06:00:00 (Sun)
  63676976400, #  local_start 2018-11-04 01:00:00 (Sun)
  63687866400, #    local_end 2019-03-10 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63687880800, #    utc_start 2019-03-10 06:00:00 (Sun)
  63708440400, #      utc_end 2019-11-03 05:00:00 (Sun)
  63687870000, #  local_start 2019-03-10 03:00:00 (Sun)
  63708429600, #    local_end 2019-11-03 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63708440400, #    utc_start 2019-11-03 05:00:00 (Sun)
  63719330400, #      utc_end 2020-03-08 06:00:00 (Sun)
  63708426000, #  local_start 2019-11-03 01:00:00 (Sun)
  63719316000, #    local_end 2020-03-08 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63719330400, #    utc_start 2020-03-08 06:00:00 (Sun)
  63739890000, #      utc_end 2020-11-01 05:00:00 (Sun)
  63719319600, #  local_start 2020-03-08 03:00:00 (Sun)
  63739879200, #    local_end 2020-11-01 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63739890000, #    utc_start 2020-11-01 05:00:00 (Sun)
  63751384800, #      utc_end 2021-03-14 06:00:00 (Sun)
  63739875600, #  local_start 2020-11-01 01:00:00 (Sun)
  63751370400, #    local_end 2021-03-14 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63751384800, #    utc_start 2021-03-14 06:00:00 (Sun)
  63771944400, #      utc_end 2021-11-07 05:00:00 (Sun)
  63751374000, #  local_start 2021-03-14 03:00:00 (Sun)
  63771933600, #    local_end 2021-11-07 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63771944400, #    utc_start 2021-11-07 05:00:00 (Sun)
  63782834400, #      utc_end 2022-03-13 06:00:00 (Sun)
  63771930000, #  local_start 2021-11-07 01:00:00 (Sun)
  63782820000, #    local_end 2022-03-13 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63782834400, #    utc_start 2022-03-13 06:00:00 (Sun)
  63803394000, #      utc_end 2022-11-06 05:00:00 (Sun)
  63782823600, #  local_start 2022-03-13 03:00:00 (Sun)
  63803383200, #    local_end 2022-11-06 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63803394000, #    utc_start 2022-11-06 05:00:00 (Sun)
  63814284000, #      utc_end 2023-03-12 06:00:00 (Sun)
  63803379600, #  local_start 2022-11-06 01:00:00 (Sun)
  63814269600, #    local_end 2023-03-12 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63814284000, #    utc_start 2023-03-12 06:00:00 (Sun)
  63834843600, #      utc_end 2023-11-05 05:00:00 (Sun)
  63814273200, #  local_start 2023-03-12 03:00:00 (Sun)
  63834832800, #    local_end 2023-11-05 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63834843600, #    utc_start 2023-11-05 05:00:00 (Sun)
  63845733600, #      utc_end 2024-03-10 06:00:00 (Sun)
  63834829200, #  local_start 2023-11-05 01:00:00 (Sun)
  63845719200, #    local_end 2024-03-10 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63845733600, #    utc_start 2024-03-10 06:00:00 (Sun)
  63866293200, #      utc_end 2024-11-03 05:00:00 (Sun)
  63845722800, #  local_start 2024-03-10 03:00:00 (Sun)
  63866282400, #    local_end 2024-11-03 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63866293200, #    utc_start 2024-11-03 05:00:00 (Sun)
  63877183200, #      utc_end 2025-03-09 06:00:00 (Sun)
  63866278800, #  local_start 2024-11-03 01:00:00 (Sun)
  63877168800, #    local_end 2025-03-09 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63877183200, #    utc_start 2025-03-09 06:00:00 (Sun)
  63897742800, #      utc_end 2025-11-02 05:00:00 (Sun)
  63877172400, #  local_start 2025-03-09 03:00:00 (Sun)
  63897732000, #    local_end 2025-11-02 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63897742800, #    utc_start 2025-11-02 05:00:00 (Sun)
  63908632800, #      utc_end 2026-03-08 06:00:00 (Sun)
  63897728400, #  local_start 2025-11-02 01:00:00 (Sun)
  63908618400, #    local_end 2026-03-08 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63908632800, #    utc_start 2026-03-08 06:00:00 (Sun)
  63929192400, #      utc_end 2026-11-01 05:00:00 (Sun)
  63908622000, #  local_start 2026-03-08 03:00:00 (Sun)
  63929181600, #    local_end 2026-11-01 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63929192400, #    utc_start 2026-11-01 05:00:00 (Sun)
  63940687200, #      utc_end 2027-03-14 06:00:00 (Sun)
  63929178000, #  local_start 2026-11-01 01:00:00 (Sun)
  63940672800, #    local_end 2027-03-14 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63940687200, #    utc_start 2027-03-14 06:00:00 (Sun)
  63961246800, #      utc_end 2027-11-07 05:00:00 (Sun)
  63940676400, #  local_start 2027-03-14 03:00:00 (Sun)
  63961236000, #    local_end 2027-11-07 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63961246800, #    utc_start 2027-11-07 05:00:00 (Sun)
  63972136800, #      utc_end 2028-03-12 06:00:00 (Sun)
  63961232400, #  local_start 2027-11-07 01:00:00 (Sun)
  63972122400, #    local_end 2028-03-12 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63972136800, #    utc_start 2028-03-12 06:00:00 (Sun)
  63992696400, #      utc_end 2028-11-05 05:00:00 (Sun)
  63972126000, #  local_start 2028-03-12 03:00:00 (Sun)
  63992685600, #    local_end 2028-11-05 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63992696400, #    utc_start 2028-11-05 05:00:00 (Sun)
  64003586400, #      utc_end 2029-03-11 06:00:00 (Sun)
  63992682000, #  local_start 2028-11-05 01:00:00 (Sun)
  64003572000, #    local_end 2029-03-11 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  64003586400, #    utc_start 2029-03-11 06:00:00 (Sun)
  64024146000, #      utc_end 2029-11-04 05:00:00 (Sun)
  64003575600, #  local_start 2029-03-11 03:00:00 (Sun)
  64024135200, #    local_end 2029-11-04 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  64024146000, #    utc_start 2029-11-04 05:00:00 (Sun)
  64035036000, #      utc_end 2030-03-10 06:00:00 (Sun)
  64024131600, #  local_start 2029-11-04 01:00:00 (Sun)
  64035021600, #    local_end 2030-03-10 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  64035036000, #    utc_start 2030-03-10 06:00:00 (Sun)
  64055595600, #      utc_end 2030-11-03 05:00:00 (Sun)
  64035025200, #  local_start 2030-03-10 03:00:00 (Sun)
  64055584800, #    local_end 2030-11-03 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {63}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -14400 }
  
  my $last_observance = bless( {
    'format' => 'A%sT',
    'gmtoff' => '-4:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 720624,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 720624,
      'utc_rd_secs' => 0,
      'utc_year' => 1975
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -14400,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 720624,
      'local_rd_secs' => 14400,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 720624,
      'utc_rd_secs' => 14400,
      'utc_year' => 1975
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Nov',
      'letter' => 'S',
      'name' => 'Canada',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Mar',
      'letter' => 'D',
      'name' => 'Canada',
      'offset_from_std' => 3600,
      'on' => 'Sun>=8',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_GLACE_BAY

    $main::fatpacked{"DateTime/TimeZone/America/Godthab.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_GODTHAB';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Godthab;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Godthab::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60449599616, #      utc_end 1916-07-28 03:26:56 (Fri)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60449587200, #    local_end 1916-07-28 00:00:00 (Fri)
  -12416,
  0,
  'LMT',
      ],
      [
  60449599616, #    utc_start 1916-07-28 03:26:56 (Fri)
  62459528400, #      utc_end 1980-04-06 05:00:00 (Sun)
  60449588816, #  local_start 1916-07-28 00:26:56 (Fri)
  62459517600, #    local_end 1980-04-06 02:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62459528400, #    utc_start 1980-04-06 05:00:00 (Sun)
  62474634000, #      utc_end 1980-09-28 01:00:00 (Sun)
  62459521200, #  local_start 1980-04-06 03:00:00 (Sun)
  62474626800, #    local_end 1980-09-27 23:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  62474634000, #    utc_start 1980-09-28 01:00:00 (Sun)
  62490358800, #      utc_end 1981-03-29 01:00:00 (Sun)
  62474623200, #  local_start 1980-09-27 22:00:00 (Sat)
  62490348000, #    local_end 1981-03-28 22:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  62490358800, #    utc_start 1981-03-29 01:00:00 (Sun)
  62506083600, #      utc_end 1981-09-27 01:00:00 (Sun)
  62490351600, #  local_start 1981-03-28 23:00:00 (Sat)
  62506076400, #    local_end 1981-09-26 23:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  62506083600, #    utc_start 1981-09-27 01:00:00 (Sun)
  62521808400, #      utc_end 1982-03-28 01:00:00 (Sun)
  62506072800, #  local_start 1981-09-26 22:00:00 (Sat)
  62521797600, #    local_end 1982-03-27 22:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  62521808400, #    utc_start 1982-03-28 01:00:00 (Sun)
  62537533200, #      utc_end 1982-09-26 01:00:00 (Sun)
  62521801200, #  local_start 1982-03-27 23:00:00 (Sat)
  62537526000, #    local_end 1982-09-25 23:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  62537533200, #    utc_start 1982-09-26 01:00:00 (Sun)
  62553258000, #      utc_end 1983-03-27 01:00:00 (Sun)
  62537522400, #  local_start 1982-09-25 22:00:00 (Sat)
  62553247200, #    local_end 1983-03-26 22:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  62553258000, #    utc_start 1983-03-27 01:00:00 (Sun)
  62568982800, #      utc_end 1983-09-25 01:00:00 (Sun)
  62553250800, #  local_start 1983-03-26 23:00:00 (Sat)
  62568975600, #    local_end 1983-09-24 23:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  62568982800, #    utc_start 1983-09-25 01:00:00 (Sun)
  62584707600, #      utc_end 1984-03-25 01:00:00 (Sun)
  62568972000, #  local_start 1983-09-24 22:00:00 (Sat)
  62584696800, #    local_end 1984-03-24 22:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  62584707600, #    utc_start 1984-03-25 01:00:00 (Sun)
  62601037200, #      utc_end 1984-09-30 01:00:00 (Sun)
  62584700400, #  local_start 1984-03-24 23:00:00 (Sat)
  62601030000, #    local_end 1984-09-29 23:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  62601037200, #    utc_start 1984-09-30 01:00:00 (Sun)
  62616762000, #      utc_end 1985-03-31 01:00:00 (Sun)
  62601026400, #  local_start 1984-09-29 22:00:00 (Sat)
  62616751200, #    local_end 1985-03-30 22:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  62616762000, #    utc_start 1985-03-31 01:00:00 (Sun)
  62632486800, #      utc_end 1985-09-29 01:00:00 (Sun)
  62616754800, #  local_start 1985-03-30 23:00:00 (Sat)
  62632479600, #    local_end 1985-09-28 23:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  62632486800, #    utc_start 1985-09-29 01:00:00 (Sun)
  62648211600, #      utc_end 1986-03-30 01:00:00 (Sun)
  62632476000, #  local_start 1985-09-28 22:00:00 (Sat)
  62648200800, #    local_end 1986-03-29 22:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  62648211600, #    utc_start 1986-03-30 01:00:00 (Sun)
  62663936400, #      utc_end 1986-09-28 01:00:00 (Sun)
  62648204400, #  local_start 1986-03-29 23:00:00 (Sat)
  62663929200, #    local_end 1986-09-27 23:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  62663936400, #    utc_start 1986-09-28 01:00:00 (Sun)
  62679661200, #      utc_end 1987-03-29 01:00:00 (Sun)
  62663925600, #  local_start 1986-09-27 22:00:00 (Sat)
  62679650400, #    local_end 1987-03-28 22:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  62679661200, #    utc_start 1987-03-29 01:00:00 (Sun)
  62695386000, #      utc_end 1987-09-27 01:00:00 (Sun)
  62679654000, #  local_start 1987-03-28 23:00:00 (Sat)
  62695378800, #    local_end 1987-09-26 23:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  62695386000, #    utc_start 1987-09-27 01:00:00 (Sun)
  62711110800, #      utc_end 1988-03-27 01:00:00 (Sun)
  62695375200, #  local_start 1987-09-26 22:00:00 (Sat)
  62711100000, #    local_end 1988-03-26 22:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  62711110800, #    utc_start 1988-03-27 01:00:00 (Sun)
  62726835600, #      utc_end 1988-09-25 01:00:00 (Sun)
  62711103600, #  local_start 1988-03-26 23:00:00 (Sat)
  62726828400, #    local_end 1988-09-24 23:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  62726835600, #    utc_start 1988-09-25 01:00:00 (Sun)
  62742560400, #      utc_end 1989-03-26 01:00:00 (Sun)
  62726824800, #  local_start 1988-09-24 22:00:00 (Sat)
  62742549600, #    local_end 1989-03-25 22:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  62742560400, #    utc_start 1989-03-26 01:00:00 (Sun)
  62758285200, #      utc_end 1989-09-24 01:00:00 (Sun)
  62742553200, #  local_start 1989-03-25 23:00:00 (Sat)
  62758278000, #    local_end 1989-09-23 23:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  62758285200, #    utc_start 1989-09-24 01:00:00 (Sun)
  62774010000, #      utc_end 1990-03-25 01:00:00 (Sun)
  62758274400, #  local_start 1989-09-23 22:00:00 (Sat)
  62773999200, #    local_end 1990-03-24 22:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  62774010000, #    utc_start 1990-03-25 01:00:00 (Sun)
  62790339600, #      utc_end 1990-09-30 01:00:00 (Sun)
  62774002800, #  local_start 1990-03-24 23:00:00 (Sat)
  62790332400, #    local_end 1990-09-29 23:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  62790339600, #    utc_start 1990-09-30 01:00:00 (Sun)
  62806064400, #      utc_end 1991-03-31 01:00:00 (Sun)
  62790328800, #  local_start 1990-09-29 22:00:00 (Sat)
  62806053600, #    local_end 1991-03-30 22:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  62806064400, #    utc_start 1991-03-31 01:00:00 (Sun)
  62821789200, #      utc_end 1991-09-29 01:00:00 (Sun)
  62806057200, #  local_start 1991-03-30 23:00:00 (Sat)
  62821782000, #    local_end 1991-09-28 23:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  62821789200, #    utc_start 1991-09-29 01:00:00 (Sun)
  62837514000, #      utc_end 1992-03-29 01:00:00 (Sun)
  62821778400, #  local_start 1991-09-28 22:00:00 (Sat)
  62837503200, #    local_end 1992-03-28 22:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  62837514000, #    utc_start 1992-03-29 01:00:00 (Sun)
  62853238800, #      utc_end 1992-09-27 01:00:00 (Sun)
  62837506800, #  local_start 1992-03-28 23:00:00 (Sat)
  62853231600, #    local_end 1992-09-26 23:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  62853238800, #    utc_start 1992-09-27 01:00:00 (Sun)
  62868963600, #      utc_end 1993-03-28 01:00:00 (Sun)
  62853228000, #  local_start 1992-09-26 22:00:00 (Sat)
  62868952800, #    local_end 1993-03-27 22:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  62868963600, #    utc_start 1993-03-28 01:00:00 (Sun)
  62884688400, #      utc_end 1993-09-26 01:00:00 (Sun)
  62868956400, #  local_start 1993-03-27 23:00:00 (Sat)
  62884681200, #    local_end 1993-09-25 23:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  62884688400, #    utc_start 1993-09-26 01:00:00 (Sun)
  62900413200, #      utc_end 1994-03-27 01:00:00 (Sun)
  62884677600, #  local_start 1993-09-25 22:00:00 (Sat)
  62900402400, #    local_end 1994-03-26 22:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  62900413200, #    utc_start 1994-03-27 01:00:00 (Sun)
  62916138000, #      utc_end 1994-09-25 01:00:00 (Sun)
  62900406000, #  local_start 1994-03-26 23:00:00 (Sat)
  62916130800, #    local_end 1994-09-24 23:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  62916138000, #    utc_start 1994-09-25 01:00:00 (Sun)
  62931862800, #      utc_end 1995-03-26 01:00:00 (Sun)
  62916127200, #  local_start 1994-09-24 22:00:00 (Sat)
  62931852000, #    local_end 1995-03-25 22:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  62931862800, #    utc_start 1995-03-26 01:00:00 (Sun)
  62947587600, #      utc_end 1995-09-24 01:00:00 (Sun)
  62931855600, #  local_start 1995-03-25 23:00:00 (Sat)
  62947580400, #    local_end 1995-09-23 23:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  62947587600, #    utc_start 1995-09-24 01:00:00 (Sun)
  62963917200, #      utc_end 1996-03-31 01:00:00 (Sun)
  62947576800, #  local_start 1995-09-23 22:00:00 (Sat)
  62963906400, #    local_end 1996-03-30 22:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  62963917200, #    utc_start 1996-03-31 01:00:00 (Sun)
  62982061200, #      utc_end 1996-10-27 01:00:00 (Sun)
  62963910000, #  local_start 1996-03-30 23:00:00 (Sat)
  62982054000, #    local_end 1996-10-26 23:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  62982061200, #    utc_start 1996-10-27 01:00:00 (Sun)
  62995366800, #      utc_end 1997-03-30 01:00:00 (Sun)
  62982050400, #  local_start 1996-10-26 22:00:00 (Sat)
  62995356000, #    local_end 1997-03-29 22:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  62995366800, #    utc_start 1997-03-30 01:00:00 (Sun)
  63013510800, #      utc_end 1997-10-26 01:00:00 (Sun)
  62995359600, #  local_start 1997-03-29 23:00:00 (Sat)
  63013503600, #    local_end 1997-10-25 23:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  63013510800, #    utc_start 1997-10-26 01:00:00 (Sun)
  63026816400, #      utc_end 1998-03-29 01:00:00 (Sun)
  63013500000, #  local_start 1997-10-25 22:00:00 (Sat)
  63026805600, #    local_end 1998-03-28 22:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  63026816400, #    utc_start 1998-03-29 01:00:00 (Sun)
  63044960400, #      utc_end 1998-10-25 01:00:00 (Sun)
  63026809200, #  local_start 1998-03-28 23:00:00 (Sat)
  63044953200, #    local_end 1998-10-24 23:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  63044960400, #    utc_start 1998-10-25 01:00:00 (Sun)
  63058266000, #      utc_end 1999-03-28 01:00:00 (Sun)
  63044949600, #  local_start 1998-10-24 22:00:00 (Sat)
  63058255200, #    local_end 1999-03-27 22:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  63058266000, #    utc_start 1999-03-28 01:00:00 (Sun)
  63077014800, #      utc_end 1999-10-31 01:00:00 (Sun)
  63058258800, #  local_start 1999-03-27 23:00:00 (Sat)
  63077007600, #    local_end 1999-10-30 23:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  63077014800, #    utc_start 1999-10-31 01:00:00 (Sun)
  63089715600, #      utc_end 2000-03-26 01:00:00 (Sun)
  63077004000, #  local_start 1999-10-30 22:00:00 (Sat)
  63089704800, #    local_end 2000-03-25 22:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  63089715600, #    utc_start 2000-03-26 01:00:00 (Sun)
  63108464400, #      utc_end 2000-10-29 01:00:00 (Sun)
  63089708400, #  local_start 2000-03-25 23:00:00 (Sat)
  63108457200, #    local_end 2000-10-28 23:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  63108464400, #    utc_start 2000-10-29 01:00:00 (Sun)
  63121165200, #      utc_end 2001-03-25 01:00:00 (Sun)
  63108453600, #  local_start 2000-10-28 22:00:00 (Sat)
  63121154400, #    local_end 2001-03-24 22:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  63121165200, #    utc_start 2001-03-25 01:00:00 (Sun)
  63139914000, #      utc_end 2001-10-28 01:00:00 (Sun)
  63121158000, #  local_start 2001-03-24 23:00:00 (Sat)
  63139906800, #    local_end 2001-10-27 23:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  63139914000, #    utc_start 2001-10-28 01:00:00 (Sun)
  63153219600, #      utc_end 2002-03-31 01:00:00 (Sun)
  63139903200, #  local_start 2001-10-27 22:00:00 (Sat)
  63153208800, #    local_end 2002-03-30 22:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  63153219600, #    utc_start 2002-03-31 01:00:00 (Sun)
  63171363600, #      utc_end 2002-10-27 01:00:00 (Sun)
  63153212400, #  local_start 2002-03-30 23:00:00 (Sat)
  63171356400, #    local_end 2002-10-26 23:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  63171363600, #    utc_start 2002-10-27 01:00:00 (Sun)
  63184669200, #      utc_end 2003-03-30 01:00:00 (Sun)
  63171352800, #  local_start 2002-10-26 22:00:00 (Sat)
  63184658400, #    local_end 2003-03-29 22:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  63184669200, #    utc_start 2003-03-30 01:00:00 (Sun)
  63202813200, #      utc_end 2003-10-26 01:00:00 (Sun)
  63184662000, #  local_start 2003-03-29 23:00:00 (Sat)
  63202806000, #    local_end 2003-10-25 23:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  63202813200, #    utc_start 2003-10-26 01:00:00 (Sun)
  63216118800, #      utc_end 2004-03-28 01:00:00 (Sun)
  63202802400, #  local_start 2003-10-25 22:00:00 (Sat)
  63216108000, #    local_end 2004-03-27 22:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  63216118800, #    utc_start 2004-03-28 01:00:00 (Sun)
  63234867600, #      utc_end 2004-10-31 01:00:00 (Sun)
  63216111600, #  local_start 2004-03-27 23:00:00 (Sat)
  63234860400, #    local_end 2004-10-30 23:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  63234867600, #    utc_start 2004-10-31 01:00:00 (Sun)
  63247568400, #      utc_end 2005-03-27 01:00:00 (Sun)
  63234856800, #  local_start 2004-10-30 22:00:00 (Sat)
  63247557600, #    local_end 2005-03-26 22:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  63247568400, #    utc_start 2005-03-27 01:00:00 (Sun)
  63266317200, #      utc_end 2005-10-30 01:00:00 (Sun)
  63247561200, #  local_start 2005-03-26 23:00:00 (Sat)
  63266310000, #    local_end 2005-10-29 23:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  63266317200, #    utc_start 2005-10-30 01:00:00 (Sun)
  63279018000, #      utc_end 2006-03-26 01:00:00 (Sun)
  63266306400, #  local_start 2005-10-29 22:00:00 (Sat)
  63279007200, #    local_end 2006-03-25 22:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  63279018000, #    utc_start 2006-03-26 01:00:00 (Sun)
  63297766800, #      utc_end 2006-10-29 01:00:00 (Sun)
  63279010800, #  local_start 2006-03-25 23:00:00 (Sat)
  63297759600, #    local_end 2006-10-28 23:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  63297766800, #    utc_start 2006-10-29 01:00:00 (Sun)
  63310467600, #      utc_end 2007-03-25 01:00:00 (Sun)
  63297756000, #  local_start 2006-10-28 22:00:00 (Sat)
  63310456800, #    local_end 2007-03-24 22:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  63310467600, #    utc_start 2007-03-25 01:00:00 (Sun)
  63329216400, #      utc_end 2007-10-28 01:00:00 (Sun)
  63310460400, #  local_start 2007-03-24 23:00:00 (Sat)
  63329209200, #    local_end 2007-10-27 23:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  63329216400, #    utc_start 2007-10-28 01:00:00 (Sun)
  63342522000, #      utc_end 2008-03-30 01:00:00 (Sun)
  63329205600, #  local_start 2007-10-27 22:00:00 (Sat)
  63342511200, #    local_end 2008-03-29 22:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  63342522000, #    utc_start 2008-03-30 01:00:00 (Sun)
  63360666000, #      utc_end 2008-10-26 01:00:00 (Sun)
  63342514800, #  local_start 2008-03-29 23:00:00 (Sat)
  63360658800, #    local_end 2008-10-25 23:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  63360666000, #    utc_start 2008-10-26 01:00:00 (Sun)
  63373971600, #      utc_end 2009-03-29 01:00:00 (Sun)
  63360655200, #  local_start 2008-10-25 22:00:00 (Sat)
  63373960800, #    local_end 2009-03-28 22:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  63373971600, #    utc_start 2009-03-29 01:00:00 (Sun)
  63392115600, #      utc_end 2009-10-25 01:00:00 (Sun)
  63373964400, #  local_start 2009-03-28 23:00:00 (Sat)
  63392108400, #    local_end 2009-10-24 23:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  63392115600, #    utc_start 2009-10-25 01:00:00 (Sun)
  63405421200, #      utc_end 2010-03-28 01:00:00 (Sun)
  63392104800, #  local_start 2009-10-24 22:00:00 (Sat)
  63405410400, #    local_end 2010-03-27 22:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  63405421200, #    utc_start 2010-03-28 01:00:00 (Sun)
  63424170000, #      utc_end 2010-10-31 01:00:00 (Sun)
  63405414000, #  local_start 2010-03-27 23:00:00 (Sat)
  63424162800, #    local_end 2010-10-30 23:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  63424170000, #    utc_start 2010-10-31 01:00:00 (Sun)
  63436870800, #      utc_end 2011-03-27 01:00:00 (Sun)
  63424159200, #  local_start 2010-10-30 22:00:00 (Sat)
  63436860000, #    local_end 2011-03-26 22:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  63436870800, #    utc_start 2011-03-27 01:00:00 (Sun)
  63455619600, #      utc_end 2011-10-30 01:00:00 (Sun)
  63436863600, #  local_start 2011-03-26 23:00:00 (Sat)
  63455612400, #    local_end 2011-10-29 23:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  63455619600, #    utc_start 2011-10-30 01:00:00 (Sun)
  63468320400, #      utc_end 2012-03-25 01:00:00 (Sun)
  63455608800, #  local_start 2011-10-29 22:00:00 (Sat)
  63468309600, #    local_end 2012-03-24 22:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  63468320400, #    utc_start 2012-03-25 01:00:00 (Sun)
  63487069200, #      utc_end 2012-10-28 01:00:00 (Sun)
  63468313200, #  local_start 2012-03-24 23:00:00 (Sat)
  63487062000, #    local_end 2012-10-27 23:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  63487069200, #    utc_start 2012-10-28 01:00:00 (Sun)
  63500374800, #      utc_end 2013-03-31 01:00:00 (Sun)
  63487058400, #  local_start 2012-10-27 22:00:00 (Sat)
  63500364000, #    local_end 2013-03-30 22:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  63500374800, #    utc_start 2013-03-31 01:00:00 (Sun)
  63518518800, #      utc_end 2013-10-27 01:00:00 (Sun)
  63500367600, #  local_start 2013-03-30 23:00:00 (Sat)
  63518511600, #    local_end 2013-10-26 23:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  63518518800, #    utc_start 2013-10-27 01:00:00 (Sun)
  63531824400, #      utc_end 2014-03-30 01:00:00 (Sun)
  63518508000, #  local_start 2013-10-26 22:00:00 (Sat)
  63531813600, #    local_end 2014-03-29 22:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  63531824400, #    utc_start 2014-03-30 01:00:00 (Sun)
  63549968400, #      utc_end 2014-10-26 01:00:00 (Sun)
  63531817200, #  local_start 2014-03-29 23:00:00 (Sat)
  63549961200, #    local_end 2014-10-25 23:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  63549968400, #    utc_start 2014-10-26 01:00:00 (Sun)
  63563274000, #      utc_end 2015-03-29 01:00:00 (Sun)
  63549957600, #  local_start 2014-10-25 22:00:00 (Sat)
  63563263200, #    local_end 2015-03-28 22:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  63563274000, #    utc_start 2015-03-29 01:00:00 (Sun)
  63581418000, #      utc_end 2015-10-25 01:00:00 (Sun)
  63563266800, #  local_start 2015-03-28 23:00:00 (Sat)
  63581410800, #    local_end 2015-10-24 23:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  63581418000, #    utc_start 2015-10-25 01:00:00 (Sun)
  63594723600, #      utc_end 2016-03-27 01:00:00 (Sun)
  63581407200, #  local_start 2015-10-24 22:00:00 (Sat)
  63594712800, #    local_end 2016-03-26 22:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  63594723600, #    utc_start 2016-03-27 01:00:00 (Sun)
  63613472400, #      utc_end 2016-10-30 01:00:00 (Sun)
  63594716400, #  local_start 2016-03-26 23:00:00 (Sat)
  63613465200, #    local_end 2016-10-29 23:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  63613472400, #    utc_start 2016-10-30 01:00:00 (Sun)
  63626173200, #      utc_end 2017-03-26 01:00:00 (Sun)
  63613461600, #  local_start 2016-10-29 22:00:00 (Sat)
  63626162400, #    local_end 2017-03-25 22:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  63626173200, #    utc_start 2017-03-26 01:00:00 (Sun)
  63644922000, #      utc_end 2017-10-29 01:00:00 (Sun)
  63626166000, #  local_start 2017-03-25 23:00:00 (Sat)
  63644914800, #    local_end 2017-10-28 23:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  63644922000, #    utc_start 2017-10-29 01:00:00 (Sun)
  63657622800, #      utc_end 2018-03-25 01:00:00 (Sun)
  63644911200, #  local_start 2017-10-28 22:00:00 (Sat)
  63657612000, #    local_end 2018-03-24 22:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  63657622800, #    utc_start 2018-03-25 01:00:00 (Sun)
  63676371600, #      utc_end 2018-10-28 01:00:00 (Sun)
  63657615600, #  local_start 2018-03-24 23:00:00 (Sat)
  63676364400, #    local_end 2018-10-27 23:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  63676371600, #    utc_start 2018-10-28 01:00:00 (Sun)
  63689677200, #      utc_end 2019-03-31 01:00:00 (Sun)
  63676360800, #  local_start 2018-10-27 22:00:00 (Sat)
  63689666400, #    local_end 2019-03-30 22:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  63689677200, #    utc_start 2019-03-31 01:00:00 (Sun)
  63707821200, #      utc_end 2019-10-27 01:00:00 (Sun)
  63689670000, #  local_start 2019-03-30 23:00:00 (Sat)
  63707814000, #    local_end 2019-10-26 23:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  63707821200, #    utc_start 2019-10-27 01:00:00 (Sun)
  63721126800, #      utc_end 2020-03-29 01:00:00 (Sun)
  63707810400, #  local_start 2019-10-26 22:00:00 (Sat)
  63721116000, #    local_end 2020-03-28 22:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  63721126800, #    utc_start 2020-03-29 01:00:00 (Sun)
  63739270800, #      utc_end 2020-10-25 01:00:00 (Sun)
  63721119600, #  local_start 2020-03-28 23:00:00 (Sat)
  63739263600, #    local_end 2020-10-24 23:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  63739270800, #    utc_start 2020-10-25 01:00:00 (Sun)
  63752576400, #      utc_end 2021-03-28 01:00:00 (Sun)
  63739260000, #  local_start 2020-10-24 22:00:00 (Sat)
  63752565600, #    local_end 2021-03-27 22:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  63752576400, #    utc_start 2021-03-28 01:00:00 (Sun)
  63771325200, #      utc_end 2021-10-31 01:00:00 (Sun)
  63752569200, #  local_start 2021-03-27 23:00:00 (Sat)
  63771318000, #    local_end 2021-10-30 23:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  63771325200, #    utc_start 2021-10-31 01:00:00 (Sun)
  63784026000, #      utc_end 2022-03-27 01:00:00 (Sun)
  63771314400, #  local_start 2021-10-30 22:00:00 (Sat)
  63784015200, #    local_end 2022-03-26 22:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  63784026000, #    utc_start 2022-03-27 01:00:00 (Sun)
  63802774800, #      utc_end 2022-10-30 01:00:00 (Sun)
  63784018800, #  local_start 2022-03-26 23:00:00 (Sat)
  63802767600, #    local_end 2022-10-29 23:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  63802774800, #    utc_start 2022-10-30 01:00:00 (Sun)
  63815475600, #      utc_end 2023-03-26 01:00:00 (Sun)
  63802764000, #  local_start 2022-10-29 22:00:00 (Sat)
  63815464800, #    local_end 2023-03-25 22:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  63815475600, #    utc_start 2023-03-26 01:00:00 (Sun)
  63834224400, #      utc_end 2023-10-29 01:00:00 (Sun)
  63815468400, #  local_start 2023-03-25 23:00:00 (Sat)
  63834217200, #    local_end 2023-10-28 23:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  63834224400, #    utc_start 2023-10-29 01:00:00 (Sun)
  63847530000, #      utc_end 2024-03-31 01:00:00 (Sun)
  63834213600, #  local_start 2023-10-28 22:00:00 (Sat)
  63847519200, #    local_end 2024-03-30 22:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  63847530000, #    utc_start 2024-03-31 01:00:00 (Sun)
  63865674000, #      utc_end 2024-10-27 01:00:00 (Sun)
  63847522800, #  local_start 2024-03-30 23:00:00 (Sat)
  63865666800, #    local_end 2024-10-26 23:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  63865674000, #    utc_start 2024-10-27 01:00:00 (Sun)
  63878979600, #      utc_end 2025-03-30 01:00:00 (Sun)
  63865663200, #  local_start 2024-10-26 22:00:00 (Sat)
  63878968800, #    local_end 2025-03-29 22:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  63878979600, #    utc_start 2025-03-30 01:00:00 (Sun)
  63897123600, #      utc_end 2025-10-26 01:00:00 (Sun)
  63878972400, #  local_start 2025-03-29 23:00:00 (Sat)
  63897116400, #    local_end 2025-10-25 23:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  63897123600, #    utc_start 2025-10-26 01:00:00 (Sun)
  63910429200, #      utc_end 2026-03-29 01:00:00 (Sun)
  63897112800, #  local_start 2025-10-25 22:00:00 (Sat)
  63910418400, #    local_end 2026-03-28 22:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  63910429200, #    utc_start 2026-03-29 01:00:00 (Sun)
  63928573200, #      utc_end 2026-10-25 01:00:00 (Sun)
  63910422000, #  local_start 2026-03-28 23:00:00 (Sat)
  63928566000, #    local_end 2026-10-24 23:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  63928573200, #    utc_start 2026-10-25 01:00:00 (Sun)
  63941878800, #      utc_end 2027-03-28 01:00:00 (Sun)
  63928562400, #  local_start 2026-10-24 22:00:00 (Sat)
  63941868000, #    local_end 2027-03-27 22:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  63941878800, #    utc_start 2027-03-28 01:00:00 (Sun)
  63960627600, #      utc_end 2027-10-31 01:00:00 (Sun)
  63941871600, #  local_start 2027-03-27 23:00:00 (Sat)
  63960620400, #    local_end 2027-10-30 23:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  63960627600, #    utc_start 2027-10-31 01:00:00 (Sun)
  63973328400, #      utc_end 2028-03-26 01:00:00 (Sun)
  63960616800, #  local_start 2027-10-30 22:00:00 (Sat)
  63973317600, #    local_end 2028-03-25 22:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  63973328400, #    utc_start 2028-03-26 01:00:00 (Sun)
  63992077200, #      utc_end 2028-10-29 01:00:00 (Sun)
  63973321200, #  local_start 2028-03-25 23:00:00 (Sat)
  63992070000, #    local_end 2028-10-28 23:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  63992077200, #    utc_start 2028-10-29 01:00:00 (Sun)
  64004778000, #      utc_end 2029-03-25 01:00:00 (Sun)
  63992066400, #  local_start 2028-10-28 22:00:00 (Sat)
  64004767200, #    local_end 2029-03-24 22:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  64004778000, #    utc_start 2029-03-25 01:00:00 (Sun)
  64023526800, #      utc_end 2029-10-28 01:00:00 (Sun)
  64004770800, #  local_start 2029-03-24 23:00:00 (Sat)
  64023519600, #    local_end 2029-10-27 23:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  64023526800, #    utc_start 2029-10-28 01:00:00 (Sun)
  64036832400, #      utc_end 2030-03-31 01:00:00 (Sun)
  64023516000, #  local_start 2029-10-27 22:00:00 (Sat)
  64036821600, #    local_end 2030-03-30 22:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  64036832400, #    utc_start 2030-03-31 01:00:00 (Sun)
  64054976400, #      utc_end 2030-10-27 01:00:00 (Sun)
  64036825200, #  local_start 2030-03-30 23:00:00 (Sat)
  64054969200, #    local_end 2030-10-26 23:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {51}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -10800 }
  
  my $last_observance = bless( {
    'format' => '-03/-02',
    'gmtoff' => '-3:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 722911,
      'local_rd_secs' => 10800,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 722911,
      'utc_rd_secs' => 10800,
      'utc_year' => 1981
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -10800,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 722911,
      'local_rd_secs' => 18000,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 722911,
      'utc_rd_secs' => 18000,
      'utc_year' => 1981
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '1:00u',
      'from' => '1996',
      'in' => 'Oct',
      'letter' => '',
      'name' => 'EU',
      'offset_from_std' => 0,
      'on' => 'lastSun',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '1:00u',
      'from' => '1981',
      'in' => 'Mar',
      'letter' => 'S',
      'name' => 'EU',
      'offset_from_std' => 3600,
      'on' => 'lastSun',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_GODTHAB

    $main::fatpacked{"DateTime/TimeZone/America/Goose_Bay.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_GOOSE_BAY';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Goose_Bay;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Goose_Bay::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59421787300, #      utc_end 1884-01-01 04:01:40 (Tue)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59421772800, #    local_end 1884-01-01 00:00:00 (Tue)
  -14500,
  0,
  'LMT',
      ],
      [
  59421787300, #    utc_start 1884-01-01 04:01:40 (Tue)
  60494700652, #      utc_end 1918-01-01 03:30:52 (Tue)
  59421774648, #  local_start 1884-01-01 00:30:48 (Tue)
  60494688000, #    local_end 1918-01-01 00:00:00 (Tue)
  -12652,
  0,
  'NST',
      ],
      [
  60494700652, #    utc_start 1918-01-01 03:30:52 (Tue)
  60503607052, #      utc_end 1918-04-14 05:30:52 (Sun)
  60494688000, #  local_start 1918-01-01 00:00:00 (Tue)
  60503594400, #    local_end 1918-04-14 02:00:00 (Sun)
  -12652,
  0,
  'NST',
      ],
      [
  60503607052, #    utc_start 1918-04-14 05:30:52 (Sun)
  60520537852, #      utc_end 1918-10-27 04:30:52 (Sun)
  60503598000, #  local_start 1918-04-14 03:00:00 (Sun)
  60520528800, #    local_end 1918-10-27 02:00:00 (Sun)
  -9052,
  1,
  'NDT',
      ],
      [
  60520537852, #    utc_start 1918-10-27 04:30:52 (Sun)
  60526236652, #      utc_end 1919-01-01 03:30:52 (Wed)
  60520525200, #  local_start 1918-10-27 01:00:00 (Sun)
  60526224000, #    local_end 1919-01-01 00:00:00 (Wed)
  -12652,
  0,
  'NST',
      ],
      [
  60526236652, #    utc_start 1919-01-01 03:30:52 (Wed)
  61038761452, #      utc_end 1935-03-30 03:30:52 (Sat)
  60526224000, #  local_start 1919-01-01 00:00:00 (Wed)
  61038748800, #    local_end 1935-03-30 00:00:00 (Sat)
  -12652,
  0,
  'NST',
      ],
      [
  61038761452, #    utc_start 1935-03-30 03:30:52 (Sat)
  61062694200, #      utc_end 1936-01-01 03:30:00 (Wed)
  61038748852, #  local_start 1935-03-30 00:00:52 (Sat)
  61062681600, #    local_end 1936-01-01 00:00:00 (Wed)
  -12600,
  0,
  'NST',
      ],
      [
  61062694200, #    utc_start 1936-01-01 03:30:00 (Wed)
  61074012600, #      utc_end 1936-05-11 03:30:00 (Mon)
  61062681600, #  local_start 1936-01-01 00:00:00 (Wed)
  61074000000, #    local_end 1936-05-11 00:00:00 (Mon)
  -12600,
  0,
  'NST',
      ],
      [
  61074012600, #    utc_start 1936-05-11 03:30:00 (Mon)
  61086709800, #      utc_end 1936-10-05 02:30:00 (Mon)
  61074003600, #  local_start 1936-05-11 01:00:00 (Mon)
  61086700800, #    local_end 1936-10-05 00:00:00 (Mon)
  -9000,
  1,
  'NDT',
      ],
      [
  61086709800, #    utc_start 1936-10-05 02:30:00 (Mon)
  61105462200, #      utc_end 1937-05-10 03:30:00 (Mon)
  61086697200, #  local_start 1936-10-04 23:00:00 (Sun)
  61105449600, #    local_end 1937-05-10 00:00:00 (Mon)
  -12600,
  0,
  'NST',
      ],
      [
  61105462200, #    utc_start 1937-05-10 03:30:00 (Mon)
  61118159400, #      utc_end 1937-10-04 02:30:00 (Mon)
  61105453200, #  local_start 1937-05-10 01:00:00 (Mon)
  61118150400, #    local_end 1937-10-04 00:00:00 (Mon)
  -9000,
  1,
  'NDT',
      ],
      [
  61118159400, #    utc_start 1937-10-04 02:30:00 (Mon)
  61136911800, #      utc_end 1938-05-09 03:30:00 (Mon)
  61118146800, #  local_start 1937-10-03 23:00:00 (Sun)
  61136899200, #    local_end 1938-05-09 00:00:00 (Mon)
  -12600,
  0,
  'NST',
      ],
      [
  61136911800, #    utc_start 1938-05-09 03:30:00 (Mon)
  61149609000, #      utc_end 1938-10-03 02:30:00 (Mon)
  61136902800, #  local_start 1938-05-09 01:00:00 (Mon)
  61149600000, #    local_end 1938-10-03 00:00:00 (Mon)
  -9000,
  1,
  'NDT',
      ],
      [
  61149609000, #    utc_start 1938-10-03 02:30:00 (Mon)
  61168966200, #      utc_end 1939-05-15 03:30:00 (Mon)
  61149596400, #  local_start 1938-10-02 23:00:00 (Sun)
  61168953600, #    local_end 1939-05-15 00:00:00 (Mon)
  -12600,
  0,
  'NST',
      ],
      [
  61168966200, #    utc_start 1939-05-15 03:30:00 (Mon)
  61181058600, #      utc_end 1939-10-02 02:30:00 (Mon)
  61168957200, #  local_start 1939-05-15 01:00:00 (Mon)
  61181049600, #    local_end 1939-10-02 00:00:00 (Mon)
  -9000,
  1,
  'NDT',
      ],
      [
  61181058600, #    utc_start 1939-10-02 02:30:00 (Mon)
  61200415800, #      utc_end 1940-05-13 03:30:00 (Mon)
  61181046000, #  local_start 1939-10-01 23:00:00 (Sun)
  61200403200, #    local_end 1940-05-13 00:00:00 (Mon)
  -12600,
  0,
  'NST',
      ],
      [
  61200415800, #    utc_start 1940-05-13 03:30:00 (Mon)
  61213113000, #      utc_end 1940-10-07 02:30:00 (Mon)
  61200406800, #  local_start 1940-05-13 01:00:00 (Mon)
  61213104000, #    local_end 1940-10-07 00:00:00 (Mon)
  -9000,
  1,
  'NDT',
      ],
      [
  61213113000, #    utc_start 1940-10-07 02:30:00 (Mon)
  61231865400, #      utc_end 1941-05-12 03:30:00 (Mon)
  61213100400, #  local_start 1940-10-06 23:00:00 (Sun)
  61231852800, #    local_end 1941-05-12 00:00:00 (Mon)
  -12600,
  0,
  'NST',
      ],
      [
  61231865400, #    utc_start 1941-05-12 03:30:00 (Mon)
  61244562600, #      utc_end 1941-10-06 02:30:00 (Mon)
  61231856400, #  local_start 1941-05-12 01:00:00 (Mon)
  61244553600, #    local_end 1941-10-06 00:00:00 (Mon)
  -9000,
  1,
  'NDT',
      ],
      [
  61244562600, #    utc_start 1941-10-06 02:30:00 (Mon)
  61263315000, #      utc_end 1942-05-11 03:30:00 (Mon)
  61244550000, #  local_start 1941-10-05 23:00:00 (Sun)
  61263302400, #    local_end 1942-05-11 00:00:00 (Mon)
  -12600,
  0,
  'NST',
      ],
      [
  61263315000, #    utc_start 1942-05-11 03:30:00 (Mon)
  61366287600, #      utc_end 1945-08-14 23:00:00 (Tue)
  61263306000, #  local_start 1942-05-11 01:00:00 (Mon)
  61366278600, #    local_end 1945-08-14 20:30:00 (Tue)
  -9000,
  1,
  'NWT',
      ],
      [
  61366287600, #    utc_start 1945-08-14 23:00:00 (Tue)
  61370281800, #      utc_end 1945-09-30 04:30:00 (Sun)
  61366278600, #  local_start 1945-08-14 20:30:00 (Tue)
  61370272800, #    local_end 1945-09-30 02:00:00 (Sun)
  -9000,
  1,
  'NPT',
      ],
      [
  61370281800, #    utc_start 1945-09-30 04:30:00 (Sun)
  61378313400, #      utc_end 1946-01-01 03:30:00 (Tue)
  61370269200, #  local_start 1945-09-30 01:00:00 (Sun)
  61378300800, #    local_end 1946-01-01 00:00:00 (Tue)
  -12600,
  0,
  'NST',
      ],
      [
  61378313400, #    utc_start 1946-01-01 03:30:00 (Tue)
  61389639000, #      utc_end 1946-05-12 05:30:00 (Sun)
  61378300800, #  local_start 1946-01-01 00:00:00 (Tue)
  61389626400, #    local_end 1946-05-12 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  61389639000, #    utc_start 1946-05-12 05:30:00 (Sun)
  61402336200, #      utc_end 1946-10-06 04:30:00 (Sun)
  61389630000, #  local_start 1946-05-12 03:00:00 (Sun)
  61402327200, #    local_end 1946-10-06 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  61402336200, #    utc_start 1946-10-06 04:30:00 (Sun)
  61421088600, #      utc_end 1947-05-11 05:30:00 (Sun)
  61402323600, #  local_start 1946-10-06 01:00:00 (Sun)
  61421076000, #    local_end 1947-05-11 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  61421088600, #    utc_start 1947-05-11 05:30:00 (Sun)
  61433785800, #      utc_end 1947-10-05 04:30:00 (Sun)
  61421079600, #  local_start 1947-05-11 03:00:00 (Sun)
  61433776800, #    local_end 1947-10-05 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  61433785800, #    utc_start 1947-10-05 04:30:00 (Sun)
  61452538200, #      utc_end 1948-05-09 05:30:00 (Sun)
  61433773200, #  local_start 1947-10-05 01:00:00 (Sun)
  61452525600, #    local_end 1948-05-09 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  61452538200, #    utc_start 1948-05-09 05:30:00 (Sun)
  61465235400, #      utc_end 1948-10-03 04:30:00 (Sun)
  61452529200, #  local_start 1948-05-09 03:00:00 (Sun)
  61465226400, #    local_end 1948-10-03 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  61465235400, #    utc_start 1948-10-03 04:30:00 (Sun)
  61483987800, #      utc_end 1949-05-08 05:30:00 (Sun)
  61465222800, #  local_start 1948-10-03 01:00:00 (Sun)
  61483975200, #    local_end 1949-05-08 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  61483987800, #    utc_start 1949-05-08 05:30:00 (Sun)
  61496685000, #      utc_end 1949-10-02 04:30:00 (Sun)
  61483978800, #  local_start 1949-05-08 03:00:00 (Sun)
  61496676000, #    local_end 1949-10-02 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  61496685000, #    utc_start 1949-10-02 04:30:00 (Sun)
  61516042200, #      utc_end 1950-05-14 05:30:00 (Sun)
  61496672400, #  local_start 1949-10-02 01:00:00 (Sun)
  61516029600, #    local_end 1950-05-14 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  61516042200, #    utc_start 1950-05-14 05:30:00 (Sun)
  61528739400, #      utc_end 1950-10-08 04:30:00 (Sun)
  61516033200, #  local_start 1950-05-14 03:00:00 (Sun)
  61528730400, #    local_end 1950-10-08 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  61528739400, #    utc_start 1950-10-08 04:30:00 (Sun)
  61546282200, #      utc_end 1951-04-29 05:30:00 (Sun)
  61528726800, #  local_start 1950-10-08 01:00:00 (Sun)
  61546269600, #    local_end 1951-04-29 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  61546282200, #    utc_start 1951-04-29 05:30:00 (Sun)
  61559584200, #      utc_end 1951-09-30 04:30:00 (Sun)
  61546273200, #  local_start 1951-04-29 03:00:00 (Sun)
  61559575200, #    local_end 1951-09-30 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  61559584200, #    utc_start 1951-09-30 04:30:00 (Sun)
  61577731800, #      utc_end 1952-04-27 05:30:00 (Sun)
  61559571600, #  local_start 1951-09-30 01:00:00 (Sun)
  61577719200, #    local_end 1952-04-27 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  61577731800, #    utc_start 1952-04-27 05:30:00 (Sun)
  61591033800, #      utc_end 1952-09-28 04:30:00 (Sun)
  61577722800, #  local_start 1952-04-27 03:00:00 (Sun)
  61591024800, #    local_end 1952-09-28 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  61591033800, #    utc_start 1952-09-28 04:30:00 (Sun)
  61609181400, #      utc_end 1953-04-26 05:30:00 (Sun)
  61591021200, #  local_start 1952-09-28 01:00:00 (Sun)
  61609168800, #    local_end 1953-04-26 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  61609181400, #    utc_start 1953-04-26 05:30:00 (Sun)
  61622483400, #      utc_end 1953-09-27 04:30:00 (Sun)
  61609172400, #  local_start 1953-04-26 03:00:00 (Sun)
  61622474400, #    local_end 1953-09-27 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  61622483400, #    utc_start 1953-09-27 04:30:00 (Sun)
  61640631000, #      utc_end 1954-04-25 05:30:00 (Sun)
  61622470800, #  local_start 1953-09-27 01:00:00 (Sun)
  61640618400, #    local_end 1954-04-25 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  61640631000, #    utc_start 1954-04-25 05:30:00 (Sun)
  61653933000, #      utc_end 1954-09-26 04:30:00 (Sun)
  61640622000, #  local_start 1954-04-25 03:00:00 (Sun)
  61653924000, #    local_end 1954-09-26 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  61653933000, #    utc_start 1954-09-26 04:30:00 (Sun)
  61672080600, #      utc_end 1955-04-24 05:30:00 (Sun)
  61653920400, #  local_start 1954-09-26 01:00:00 (Sun)
  61672068000, #    local_end 1955-04-24 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  61672080600, #    utc_start 1955-04-24 05:30:00 (Sun)
  61685382600, #      utc_end 1955-09-25 04:30:00 (Sun)
  61672071600, #  local_start 1955-04-24 03:00:00 (Sun)
  61685373600, #    local_end 1955-09-25 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  61685382600, #    utc_start 1955-09-25 04:30:00 (Sun)
  61704135000, #      utc_end 1956-04-29 05:30:00 (Sun)
  61685370000, #  local_start 1955-09-25 01:00:00 (Sun)
  61704122400, #    local_end 1956-04-29 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  61704135000, #    utc_start 1956-04-29 05:30:00 (Sun)
  61717437000, #      utc_end 1956-09-30 04:30:00 (Sun)
  61704126000, #  local_start 1956-04-29 03:00:00 (Sun)
  61717428000, #    local_end 1956-09-30 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  61717437000, #    utc_start 1956-09-30 04:30:00 (Sun)
  61735584600, #      utc_end 1957-04-28 05:30:00 (Sun)
  61717424400, #  local_start 1956-09-30 01:00:00 (Sun)
  61735572000, #    local_end 1957-04-28 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  61735584600, #    utc_start 1957-04-28 05:30:00 (Sun)
  61748886600, #      utc_end 1957-09-29 04:30:00 (Sun)
  61735575600, #  local_start 1957-04-28 03:00:00 (Sun)
  61748877600, #    local_end 1957-09-29 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  61748886600, #    utc_start 1957-09-29 04:30:00 (Sun)
  61767034200, #      utc_end 1958-04-27 05:30:00 (Sun)
  61748874000, #  local_start 1957-09-29 01:00:00 (Sun)
  61767021600, #    local_end 1958-04-27 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  61767034200, #    utc_start 1958-04-27 05:30:00 (Sun)
  61780336200, #      utc_end 1958-09-28 04:30:00 (Sun)
  61767025200, #  local_start 1958-04-27 03:00:00 (Sun)
  61780327200, #    local_end 1958-09-28 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  61780336200, #    utc_start 1958-09-28 04:30:00 (Sun)
  61798483800, #      utc_end 1959-04-26 05:30:00 (Sun)
  61780323600, #  local_start 1958-09-28 01:00:00 (Sun)
  61798471200, #    local_end 1959-04-26 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  61798483800, #    utc_start 1959-04-26 05:30:00 (Sun)
  61811785800, #      utc_end 1959-09-27 04:30:00 (Sun)
  61798474800, #  local_start 1959-04-26 03:00:00 (Sun)
  61811776800, #    local_end 1959-09-27 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  61811785800, #    utc_start 1959-09-27 04:30:00 (Sun)
  61829933400, #      utc_end 1960-04-24 05:30:00 (Sun)
  61811773200, #  local_start 1959-09-27 01:00:00 (Sun)
  61829920800, #    local_end 1960-04-24 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  61829933400, #    utc_start 1960-04-24 05:30:00 (Sun)
  61846259400, #      utc_end 1960-10-30 04:30:00 (Sun)
  61829924400, #  local_start 1960-04-24 03:00:00 (Sun)
  61846250400, #    local_end 1960-10-30 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  61846259400, #    utc_start 1960-10-30 04:30:00 (Sun)
  61861987800, #      utc_end 1961-04-30 05:30:00 (Sun)
  61846246800, #  local_start 1960-10-30 01:00:00 (Sun)
  61861975200, #    local_end 1961-04-30 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  61861987800, #    utc_start 1961-04-30 05:30:00 (Sun)
  61877709000, #      utc_end 1961-10-29 04:30:00 (Sun)
  61861978800, #  local_start 1961-04-30 03:00:00 (Sun)
  61877700000, #    local_end 1961-10-29 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  61877709000, #    utc_start 1961-10-29 04:30:00 (Sun)
  61893437400, #      utc_end 1962-04-29 05:30:00 (Sun)
  61877696400, #  local_start 1961-10-29 01:00:00 (Sun)
  61893424800, #    local_end 1962-04-29 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  61893437400, #    utc_start 1962-04-29 05:30:00 (Sun)
  61909158600, #      utc_end 1962-10-28 04:30:00 (Sun)
  61893428400, #  local_start 1962-04-29 03:00:00 (Sun)
  61909149600, #    local_end 1962-10-28 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  61909158600, #    utc_start 1962-10-28 04:30:00 (Sun)
  61924887000, #      utc_end 1963-04-28 05:30:00 (Sun)
  61909146000, #  local_start 1962-10-28 01:00:00 (Sun)
  61924874400, #    local_end 1963-04-28 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  61924887000, #    utc_start 1963-04-28 05:30:00 (Sun)
  61940608200, #      utc_end 1963-10-27 04:30:00 (Sun)
  61924878000, #  local_start 1963-04-28 03:00:00 (Sun)
  61940599200, #    local_end 1963-10-27 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  61940608200, #    utc_start 1963-10-27 04:30:00 (Sun)
  61956336600, #      utc_end 1964-04-26 05:30:00 (Sun)
  61940595600, #  local_start 1963-10-27 01:00:00 (Sun)
  61956324000, #    local_end 1964-04-26 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  61956336600, #    utc_start 1964-04-26 05:30:00 (Sun)
  61972057800, #      utc_end 1964-10-25 04:30:00 (Sun)
  61956327600, #  local_start 1964-04-26 03:00:00 (Sun)
  61972048800, #    local_end 1964-10-25 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  61972057800, #    utc_start 1964-10-25 04:30:00 (Sun)
  61987786200, #      utc_end 1965-04-25 05:30:00 (Sun)
  61972045200, #  local_start 1964-10-25 01:00:00 (Sun)
  61987773600, #    local_end 1965-04-25 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  61987786200, #    utc_start 1965-04-25 05:30:00 (Sun)
  62004112200, #      utc_end 1965-10-31 04:30:00 (Sun)
  61987777200, #  local_start 1965-04-25 03:00:00 (Sun)
  62004103200, #    local_end 1965-10-31 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  62004112200, #    utc_start 1965-10-31 04:30:00 (Sun)
  62015779800, #      utc_end 1966-03-15 05:30:00 (Tue)
  62004099600, #  local_start 1965-10-31 01:00:00 (Sun)
  62015767200, #    local_end 1966-03-15 02:00:00 (Tue)
  -12600,
  0,
  'NST',
      ],
      [
  62015779800, #    utc_start 1966-03-15 05:30:00 (Tue)
  62019237600, #      utc_end 1966-04-24 06:00:00 (Sun)
  62015765400, #  local_start 1966-03-15 01:30:00 (Tue)
  62019223200, #    local_end 1966-04-24 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62019237600, #    utc_start 1966-04-24 06:00:00 (Sun)
  62035563600, #      utc_end 1966-10-30 05:00:00 (Sun)
  62019226800, #  local_start 1966-04-24 03:00:00 (Sun)
  62035552800, #    local_end 1966-10-30 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62035563600, #    utc_start 1966-10-30 05:00:00 (Sun)
  62051292000, #      utc_end 1967-04-30 06:00:00 (Sun)
  62035549200, #  local_start 1966-10-30 01:00:00 (Sun)
  62051277600, #    local_end 1967-04-30 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62051292000, #    utc_start 1967-04-30 06:00:00 (Sun)
  62067013200, #      utc_end 1967-10-29 05:00:00 (Sun)
  62051281200, #  local_start 1967-04-30 03:00:00 (Sun)
  62067002400, #    local_end 1967-10-29 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62067013200, #    utc_start 1967-10-29 05:00:00 (Sun)
  62082741600, #      utc_end 1968-04-28 06:00:00 (Sun)
  62066998800, #  local_start 1967-10-29 01:00:00 (Sun)
  62082727200, #    local_end 1968-04-28 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62082741600, #    utc_start 1968-04-28 06:00:00 (Sun)
  62098462800, #      utc_end 1968-10-27 05:00:00 (Sun)
  62082730800, #  local_start 1968-04-28 03:00:00 (Sun)
  62098452000, #    local_end 1968-10-27 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62098462800, #    utc_start 1968-10-27 05:00:00 (Sun)
  62114191200, #      utc_end 1969-04-27 06:00:00 (Sun)
  62098448400, #  local_start 1968-10-27 01:00:00 (Sun)
  62114176800, #    local_end 1969-04-27 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62114191200, #    utc_start 1969-04-27 06:00:00 (Sun)
  62129912400, #      utc_end 1969-10-26 05:00:00 (Sun)
  62114180400, #  local_start 1969-04-27 03:00:00 (Sun)
  62129901600, #    local_end 1969-10-26 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62129912400, #    utc_start 1969-10-26 05:00:00 (Sun)
  62145640800, #      utc_end 1970-04-26 06:00:00 (Sun)
  62129898000, #  local_start 1969-10-26 01:00:00 (Sun)
  62145626400, #    local_end 1970-04-26 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62145640800, #    utc_start 1970-04-26 06:00:00 (Sun)
  62161362000, #      utc_end 1970-10-25 05:00:00 (Sun)
  62145630000, #  local_start 1970-04-26 03:00:00 (Sun)
  62161351200, #    local_end 1970-10-25 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62161362000, #    utc_start 1970-10-25 05:00:00 (Sun)
  62177090400, #      utc_end 1971-04-25 06:00:00 (Sun)
  62161347600, #  local_start 1970-10-25 01:00:00 (Sun)
  62177076000, #    local_end 1971-04-25 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62177090400, #    utc_start 1971-04-25 06:00:00 (Sun)
  62193416400, #      utc_end 1971-10-31 05:00:00 (Sun)
  62177079600, #  local_start 1971-04-25 03:00:00 (Sun)
  62193405600, #    local_end 1971-10-31 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62193416400, #    utc_start 1971-10-31 05:00:00 (Sun)
  62209144800, #      utc_end 1972-04-30 06:00:00 (Sun)
  62193402000, #  local_start 1971-10-31 01:00:00 (Sun)
  62209130400, #    local_end 1972-04-30 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62209144800, #    utc_start 1972-04-30 06:00:00 (Sun)
  62224866000, #      utc_end 1972-10-29 05:00:00 (Sun)
  62209134000, #  local_start 1972-04-30 03:00:00 (Sun)
  62224855200, #    local_end 1972-10-29 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62224866000, #    utc_start 1972-10-29 05:00:00 (Sun)
  62240594400, #      utc_end 1973-04-29 06:00:00 (Sun)
  62224851600, #  local_start 1972-10-29 01:00:00 (Sun)
  62240580000, #    local_end 1973-04-29 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62240594400, #    utc_start 1973-04-29 06:00:00 (Sun)
  62256315600, #      utc_end 1973-10-28 05:00:00 (Sun)
  62240583600, #  local_start 1973-04-29 03:00:00 (Sun)
  62256304800, #    local_end 1973-10-28 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62256315600, #    utc_start 1973-10-28 05:00:00 (Sun)
  62272044000, #      utc_end 1974-04-28 06:00:00 (Sun)
  62256301200, #  local_start 1973-10-28 01:00:00 (Sun)
  62272029600, #    local_end 1974-04-28 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62272044000, #    utc_start 1974-04-28 06:00:00 (Sun)
  62287765200, #      utc_end 1974-10-27 05:00:00 (Sun)
  62272033200, #  local_start 1974-04-28 03:00:00 (Sun)
  62287754400, #    local_end 1974-10-27 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62287765200, #    utc_start 1974-10-27 05:00:00 (Sun)
  62303493600, #      utc_end 1975-04-27 06:00:00 (Sun)
  62287750800, #  local_start 1974-10-27 01:00:00 (Sun)
  62303479200, #    local_end 1975-04-27 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62303493600, #    utc_start 1975-04-27 06:00:00 (Sun)
  62319214800, #      utc_end 1975-10-26 05:00:00 (Sun)
  62303482800, #  local_start 1975-04-27 03:00:00 (Sun)
  62319204000, #    local_end 1975-10-26 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62319214800, #    utc_start 1975-10-26 05:00:00 (Sun)
  62334943200, #      utc_end 1976-04-25 06:00:00 (Sun)
  62319200400, #  local_start 1975-10-26 01:00:00 (Sun)
  62334928800, #    local_end 1976-04-25 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62334943200, #    utc_start 1976-04-25 06:00:00 (Sun)
  62351269200, #      utc_end 1976-10-31 05:00:00 (Sun)
  62334932400, #  local_start 1976-04-25 03:00:00 (Sun)
  62351258400, #    local_end 1976-10-31 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62351269200, #    utc_start 1976-10-31 05:00:00 (Sun)
  62366392800, #      utc_end 1977-04-24 06:00:00 (Sun)
  62351254800, #  local_start 1976-10-31 01:00:00 (Sun)
  62366378400, #    local_end 1977-04-24 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62366392800, #    utc_start 1977-04-24 06:00:00 (Sun)
  62382718800, #      utc_end 1977-10-30 05:00:00 (Sun)
  62366382000, #  local_start 1977-04-24 03:00:00 (Sun)
  62382708000, #    local_end 1977-10-30 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62382718800, #    utc_start 1977-10-30 05:00:00 (Sun)
  62398447200, #      utc_end 1978-04-30 06:00:00 (Sun)
  62382704400, #  local_start 1977-10-30 01:00:00 (Sun)
  62398432800, #    local_end 1978-04-30 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62398447200, #    utc_start 1978-04-30 06:00:00 (Sun)
  62414168400, #      utc_end 1978-10-29 05:00:00 (Sun)
  62398436400, #  local_start 1978-04-30 03:00:00 (Sun)
  62414157600, #    local_end 1978-10-29 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62414168400, #    utc_start 1978-10-29 05:00:00 (Sun)
  62429896800, #      utc_end 1979-04-29 06:00:00 (Sun)
  62414154000, #  local_start 1978-10-29 01:00:00 (Sun)
  62429882400, #    local_end 1979-04-29 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62429896800, #    utc_start 1979-04-29 06:00:00 (Sun)
  62445618000, #      utc_end 1979-10-28 05:00:00 (Sun)
  62429886000, #  local_start 1979-04-29 03:00:00 (Sun)
  62445607200, #    local_end 1979-10-28 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62445618000, #    utc_start 1979-10-28 05:00:00 (Sun)
  62461346400, #      utc_end 1980-04-27 06:00:00 (Sun)
  62445603600, #  local_start 1979-10-28 01:00:00 (Sun)
  62461332000, #    local_end 1980-04-27 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62461346400, #    utc_start 1980-04-27 06:00:00 (Sun)
  62477067600, #      utc_end 1980-10-26 05:00:00 (Sun)
  62461335600, #  local_start 1980-04-27 03:00:00 (Sun)
  62477056800, #    local_end 1980-10-26 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62477067600, #    utc_start 1980-10-26 05:00:00 (Sun)
  62492796000, #      utc_end 1981-04-26 06:00:00 (Sun)
  62477053200, #  local_start 1980-10-26 01:00:00 (Sun)
  62492781600, #    local_end 1981-04-26 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62492796000, #    utc_start 1981-04-26 06:00:00 (Sun)
  62508517200, #      utc_end 1981-10-25 05:00:00 (Sun)
  62492785200, #  local_start 1981-04-26 03:00:00 (Sun)
  62508506400, #    local_end 1981-10-25 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62508517200, #    utc_start 1981-10-25 05:00:00 (Sun)
  62524245600, #      utc_end 1982-04-25 06:00:00 (Sun)
  62508502800, #  local_start 1981-10-25 01:00:00 (Sun)
  62524231200, #    local_end 1982-04-25 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62524245600, #    utc_start 1982-04-25 06:00:00 (Sun)
  62540571600, #      utc_end 1982-10-31 05:00:00 (Sun)
  62524234800, #  local_start 1982-04-25 03:00:00 (Sun)
  62540560800, #    local_end 1982-10-31 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62540571600, #    utc_start 1982-10-31 05:00:00 (Sun)
  62555695200, #      utc_end 1983-04-24 06:00:00 (Sun)
  62540557200, #  local_start 1982-10-31 01:00:00 (Sun)
  62555680800, #    local_end 1983-04-24 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62555695200, #    utc_start 1983-04-24 06:00:00 (Sun)
  62572021200, #      utc_end 1983-10-30 05:00:00 (Sun)
  62555684400, #  local_start 1983-04-24 03:00:00 (Sun)
  62572010400, #    local_end 1983-10-30 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62572021200, #    utc_start 1983-10-30 05:00:00 (Sun)
  62587749600, #      utc_end 1984-04-29 06:00:00 (Sun)
  62572006800, #  local_start 1983-10-30 01:00:00 (Sun)
  62587735200, #    local_end 1984-04-29 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62587749600, #    utc_start 1984-04-29 06:00:00 (Sun)
  62603470800, #      utc_end 1984-10-28 05:00:00 (Sun)
  62587738800, #  local_start 1984-04-29 03:00:00 (Sun)
  62603460000, #    local_end 1984-10-28 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62603470800, #    utc_start 1984-10-28 05:00:00 (Sun)
  62619199200, #      utc_end 1985-04-28 06:00:00 (Sun)
  62603456400, #  local_start 1984-10-28 01:00:00 (Sun)
  62619184800, #    local_end 1985-04-28 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62619199200, #    utc_start 1985-04-28 06:00:00 (Sun)
  62634920400, #      utc_end 1985-10-27 05:00:00 (Sun)
  62619188400, #  local_start 1985-04-28 03:00:00 (Sun)
  62634909600, #    local_end 1985-10-27 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62634920400, #    utc_start 1985-10-27 05:00:00 (Sun)
  62650648800, #      utc_end 1986-04-27 06:00:00 (Sun)
  62634906000, #  local_start 1985-10-27 01:00:00 (Sun)
  62650634400, #    local_end 1986-04-27 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62650648800, #    utc_start 1986-04-27 06:00:00 (Sun)
  62666370000, #      utc_end 1986-10-26 05:00:00 (Sun)
  62650638000, #  local_start 1986-04-27 03:00:00 (Sun)
  62666359200, #    local_end 1986-10-26 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62666370000, #    utc_start 1986-10-26 05:00:00 (Sun)
  62680276860, #      utc_end 1987-04-05 04:01:00 (Sun)
  62666355600, #  local_start 1986-10-26 01:00:00 (Sun)
  62680262460, #    local_end 1987-04-05 00:01:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62680276860, #    utc_start 1987-04-05 04:01:00 (Sun)
  62697812460, #      utc_end 1987-10-25 03:01:00 (Sun)
  62680266060, #  local_start 1987-04-05 01:01:00 (Sun)
  62697801660, #    local_end 1987-10-25 00:01:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62697812460, #    utc_start 1987-10-25 03:01:00 (Sun)
  62711726460, #      utc_end 1988-04-03 04:01:00 (Sun)
  62697798060, #  local_start 1987-10-24 23:01:00 (Sat)
  62711712060, #    local_end 1988-04-03 00:01:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62711726460, #    utc_start 1988-04-03 04:01:00 (Sun)
  62729863260, #      utc_end 1988-10-30 02:01:00 (Sun)
  62711719260, #  local_start 1988-04-03 02:01:00 (Sun)
  62729856060, #    local_end 1988-10-30 00:01:00 (Sun)
  -7200,
  1,
  'ADDT',
      ],
      [
  62729863260, #    utc_start 1988-10-30 02:01:00 (Sun)
  62743176060, #      utc_end 1989-04-02 04:01:00 (Sun)
  62729848860, #  local_start 1988-10-29 22:01:00 (Sat)
  62743161660, #    local_end 1989-04-02 00:01:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62743176060, #    utc_start 1989-04-02 04:01:00 (Sun)
  62761316460, #      utc_end 1989-10-29 03:01:00 (Sun)
  62743165260, #  local_start 1989-04-02 01:01:00 (Sun)
  62761305660, #    local_end 1989-10-29 00:01:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62761316460, #    utc_start 1989-10-29 03:01:00 (Sun)
  62774625660, #      utc_end 1990-04-01 04:01:00 (Sun)
  62761302060, #  local_start 1989-10-28 23:01:00 (Sat)
  62774611260, #    local_end 1990-04-01 00:01:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62774625660, #    utc_start 1990-04-01 04:01:00 (Sun)
  62792766060, #      utc_end 1990-10-28 03:01:00 (Sun)
  62774614860, #  local_start 1990-04-01 01:01:00 (Sun)
  62792755260, #    local_end 1990-10-28 00:01:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62792766060, #    utc_start 1990-10-28 03:01:00 (Sun)
  62806680060, #      utc_end 1991-04-07 04:01:00 (Sun)
  62792751660, #  local_start 1990-10-27 23:01:00 (Sat)
  62806665660, #    local_end 1991-04-07 00:01:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62806680060, #    utc_start 1991-04-07 04:01:00 (Sun)
  62824215660, #      utc_end 1991-10-27 03:01:00 (Sun)
  62806669260, #  local_start 1991-04-07 01:01:00 (Sun)
  62824204860, #    local_end 1991-10-27 00:01:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62824215660, #    utc_start 1991-10-27 03:01:00 (Sun)
  62838129660, #      utc_end 1992-04-05 04:01:00 (Sun)
  62824201260, #  local_start 1991-10-26 23:01:00 (Sat)
  62838115260, #    local_end 1992-04-05 00:01:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62838129660, #    utc_start 1992-04-05 04:01:00 (Sun)
  62855665260, #      utc_end 1992-10-25 03:01:00 (Sun)
  62838118860, #  local_start 1992-04-05 01:01:00 (Sun)
  62855654460, #    local_end 1992-10-25 00:01:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62855665260, #    utc_start 1992-10-25 03:01:00 (Sun)
  62869579260, #      utc_end 1993-04-04 04:01:00 (Sun)
  62855650860, #  local_start 1992-10-24 23:01:00 (Sat)
  62869564860, #    local_end 1993-04-04 00:01:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62869579260, #    utc_start 1993-04-04 04:01:00 (Sun)
  62887719660, #      utc_end 1993-10-31 03:01:00 (Sun)
  62869568460, #  local_start 1993-04-04 01:01:00 (Sun)
  62887708860, #    local_end 1993-10-31 00:01:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62887719660, #    utc_start 1993-10-31 03:01:00 (Sun)
  62901028860, #      utc_end 1994-04-03 04:01:00 (Sun)
  62887705260, #  local_start 1993-10-30 23:01:00 (Sat)
  62901014460, #    local_end 1994-04-03 00:01:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62901028860, #    utc_start 1994-04-03 04:01:00 (Sun)
  62919169260, #      utc_end 1994-10-30 03:01:00 (Sun)
  62901018060, #  local_start 1994-04-03 01:01:00 (Sun)
  62919158460, #    local_end 1994-10-30 00:01:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62919169260, #    utc_start 1994-10-30 03:01:00 (Sun)
  62932478460, #      utc_end 1995-04-02 04:01:00 (Sun)
  62919154860, #  local_start 1994-10-29 23:01:00 (Sat)
  62932464060, #    local_end 1995-04-02 00:01:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62932478460, #    utc_start 1995-04-02 04:01:00 (Sun)
  62950618860, #      utc_end 1995-10-29 03:01:00 (Sun)
  62932467660, #  local_start 1995-04-02 01:01:00 (Sun)
  62950608060, #    local_end 1995-10-29 00:01:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62950618860, #    utc_start 1995-10-29 03:01:00 (Sun)
  62964532860, #      utc_end 1996-04-07 04:01:00 (Sun)
  62950604460, #  local_start 1995-10-28 23:01:00 (Sat)
  62964518460, #    local_end 1996-04-07 00:01:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62964532860, #    utc_start 1996-04-07 04:01:00 (Sun)
  62982068460, #      utc_end 1996-10-27 03:01:00 (Sun)
  62964522060, #  local_start 1996-04-07 01:01:00 (Sun)
  62982057660, #    local_end 1996-10-27 00:01:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62982068460, #    utc_start 1996-10-27 03:01:00 (Sun)
  62995982460, #      utc_end 1997-04-06 04:01:00 (Sun)
  62982054060, #  local_start 1996-10-26 23:01:00 (Sat)
  62995968060, #    local_end 1997-04-06 00:01:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62995982460, #    utc_start 1997-04-06 04:01:00 (Sun)
  63013518060, #      utc_end 1997-10-26 03:01:00 (Sun)
  62995971660, #  local_start 1997-04-06 01:01:00 (Sun)
  63013507260, #    local_end 1997-10-26 00:01:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63013518060, #    utc_start 1997-10-26 03:01:00 (Sun)
  63027432060, #      utc_end 1998-04-05 04:01:00 (Sun)
  63013503660, #  local_start 1997-10-25 23:01:00 (Sat)
  63027417660, #    local_end 1998-04-05 00:01:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63027432060, #    utc_start 1998-04-05 04:01:00 (Sun)
  63044967660, #      utc_end 1998-10-25 03:01:00 (Sun)
  63027421260, #  local_start 1998-04-05 01:01:00 (Sun)
  63044956860, #    local_end 1998-10-25 00:01:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63044967660, #    utc_start 1998-10-25 03:01:00 (Sun)
  63058881660, #      utc_end 1999-04-04 04:01:00 (Sun)
  63044953260, #  local_start 1998-10-24 23:01:00 (Sat)
  63058867260, #    local_end 1999-04-04 00:01:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63058881660, #    utc_start 1999-04-04 04:01:00 (Sun)
  63077022060, #      utc_end 1999-10-31 03:01:00 (Sun)
  63058870860, #  local_start 1999-04-04 01:01:00 (Sun)
  63077011260, #    local_end 1999-10-31 00:01:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63077022060, #    utc_start 1999-10-31 03:01:00 (Sun)
  63090331260, #      utc_end 2000-04-02 04:01:00 (Sun)
  63077007660, #  local_start 1999-10-30 23:01:00 (Sat)
  63090316860, #    local_end 2000-04-02 00:01:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63090331260, #    utc_start 2000-04-02 04:01:00 (Sun)
  63108471660, #      utc_end 2000-10-29 03:01:00 (Sun)
  63090320460, #  local_start 2000-04-02 01:01:00 (Sun)
  63108460860, #    local_end 2000-10-29 00:01:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63108471660, #    utc_start 2000-10-29 03:01:00 (Sun)
  63121780860, #      utc_end 2001-04-01 04:01:00 (Sun)
  63108457260, #  local_start 2000-10-28 23:01:00 (Sat)
  63121766460, #    local_end 2001-04-01 00:01:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63121780860, #    utc_start 2001-04-01 04:01:00 (Sun)
  63139921260, #      utc_end 2001-10-28 03:01:00 (Sun)
  63121770060, #  local_start 2001-04-01 01:01:00 (Sun)
  63139910460, #    local_end 2001-10-28 00:01:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63139921260, #    utc_start 2001-10-28 03:01:00 (Sun)
  63153835260, #      utc_end 2002-04-07 04:01:00 (Sun)
  63139906860, #  local_start 2001-10-27 23:01:00 (Sat)
  63153820860, #    local_end 2002-04-07 00:01:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63153835260, #    utc_start 2002-04-07 04:01:00 (Sun)
  63171370860, #      utc_end 2002-10-27 03:01:00 (Sun)
  63153824460, #  local_start 2002-04-07 01:01:00 (Sun)
  63171360060, #    local_end 2002-10-27 00:01:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63171370860, #    utc_start 2002-10-27 03:01:00 (Sun)
  63185284860, #      utc_end 2003-04-06 04:01:00 (Sun)
  63171356460, #  local_start 2002-10-26 23:01:00 (Sat)
  63185270460, #    local_end 2003-04-06 00:01:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63185284860, #    utc_start 2003-04-06 04:01:00 (Sun)
  63202820460, #      utc_end 2003-10-26 03:01:00 (Sun)
  63185274060, #  local_start 2003-04-06 01:01:00 (Sun)
  63202809660, #    local_end 2003-10-26 00:01:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63202820460, #    utc_start 2003-10-26 03:01:00 (Sun)
  63216734460, #      utc_end 2004-04-04 04:01:00 (Sun)
  63202806060, #  local_start 2003-10-25 23:01:00 (Sat)
  63216720060, #    local_end 2004-04-04 00:01:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63216734460, #    utc_start 2004-04-04 04:01:00 (Sun)
  63234874860, #      utc_end 2004-10-31 03:01:00 (Sun)
  63216723660, #  local_start 2004-04-04 01:01:00 (Sun)
  63234864060, #    local_end 2004-10-31 00:01:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63234874860, #    utc_start 2004-10-31 03:01:00 (Sun)
  63248184060, #      utc_end 2005-04-03 04:01:00 (Sun)
  63234860460, #  local_start 2004-10-30 23:01:00 (Sat)
  63248169660, #    local_end 2005-04-03 00:01:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63248184060, #    utc_start 2005-04-03 04:01:00 (Sun)
  63266324460, #      utc_end 2005-10-30 03:01:00 (Sun)
  63248173260, #  local_start 2005-04-03 01:01:00 (Sun)
  63266313660, #    local_end 2005-10-30 00:01:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63266324460, #    utc_start 2005-10-30 03:01:00 (Sun)
  63279633660, #      utc_end 2006-04-02 04:01:00 (Sun)
  63266310060, #  local_start 2005-10-29 23:01:00 (Sat)
  63279619260, #    local_end 2006-04-02 00:01:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63279633660, #    utc_start 2006-04-02 04:01:00 (Sun)
  63297774060, #      utc_end 2006-10-29 03:01:00 (Sun)
  63279622860, #  local_start 2006-04-02 01:01:00 (Sun)
  63297763260, #    local_end 2006-10-29 00:01:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63297774060, #    utc_start 2006-10-29 03:01:00 (Sun)
  63309268860, #      utc_end 2007-03-11 04:01:00 (Sun)
  63297759660, #  local_start 2006-10-28 23:01:00 (Sat)
  63309254460, #    local_end 2007-03-11 00:01:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63309268860, #    utc_start 2007-03-11 04:01:00 (Sun)
  63329828460, #      utc_end 2007-11-04 03:01:00 (Sun)
  63309258060, #  local_start 2007-03-11 01:01:00 (Sun)
  63329817660, #    local_end 2007-11-04 00:01:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63329828460, #    utc_start 2007-11-04 03:01:00 (Sun)
  63340718460, #      utc_end 2008-03-09 04:01:00 (Sun)
  63329814060, #  local_start 2007-11-03 23:01:00 (Sat)
  63340704060, #    local_end 2008-03-09 00:01:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63340718460, #    utc_start 2008-03-09 04:01:00 (Sun)
  63361278060, #      utc_end 2008-11-02 03:01:00 (Sun)
  63340707660, #  local_start 2008-03-09 01:01:00 (Sun)
  63361267260, #    local_end 2008-11-02 00:01:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63361278060, #    utc_start 2008-11-02 03:01:00 (Sun)
  63372168060, #      utc_end 2009-03-08 04:01:00 (Sun)
  63361263660, #  local_start 2008-11-01 23:01:00 (Sat)
  63372153660, #    local_end 2009-03-08 00:01:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63372168060, #    utc_start 2009-03-08 04:01:00 (Sun)
  63392727660, #      utc_end 2009-11-01 03:01:00 (Sun)
  63372157260, #  local_start 2009-03-08 01:01:00 (Sun)
  63392716860, #    local_end 2009-11-01 00:01:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63392727660, #    utc_start 2009-11-01 03:01:00 (Sun)
  63404222460, #      utc_end 2010-03-14 04:01:00 (Sun)
  63392713260, #  local_start 2009-10-31 23:01:00 (Sat)
  63404208060, #    local_end 2010-03-14 00:01:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63404222460, #    utc_start 2010-03-14 04:01:00 (Sun)
  63424782060, #      utc_end 2010-11-07 03:01:00 (Sun)
  63404211660, #  local_start 2010-03-14 01:01:00 (Sun)
  63424771260, #    local_end 2010-11-07 00:01:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63424782060, #    utc_start 2010-11-07 03:01:00 (Sun)
  63435672060, #      utc_end 2011-03-13 04:01:00 (Sun)
  63424767660, #  local_start 2010-11-06 23:01:00 (Sat)
  63435657660, #    local_end 2011-03-13 00:01:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63435672060, #    utc_start 2011-03-13 04:01:00 (Sun)
  63455799600, #      utc_end 2011-11-01 03:00:00 (Tue)
  63435661260, #  local_start 2011-03-13 01:01:00 (Sun)
  63455788800, #    local_end 2011-11-01 00:00:00 (Tue)
  -10800,
  1,
  'ADT',
      ],
      [
  63455799600, #    utc_start 2011-11-01 03:00:00 (Tue)
  63456238800, #      utc_end 2011-11-06 05:00:00 (Sun)
  63455788800, #  local_start 2011-11-01 00:00:00 (Tue)
  63456228000, #    local_end 2011-11-06 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63456238800, #    utc_start 2011-11-06 05:00:00 (Sun)
  63467128800, #      utc_end 2012-03-11 06:00:00 (Sun)
  63456224400, #  local_start 2011-11-06 01:00:00 (Sun)
  63467114400, #    local_end 2012-03-11 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63467128800, #    utc_start 2012-03-11 06:00:00 (Sun)
  63487688400, #      utc_end 2012-11-04 05:00:00 (Sun)
  63467118000, #  local_start 2012-03-11 03:00:00 (Sun)
  63487677600, #    local_end 2012-11-04 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63487688400, #    utc_start 2012-11-04 05:00:00 (Sun)
  63498578400, #      utc_end 2013-03-10 06:00:00 (Sun)
  63487674000, #  local_start 2012-11-04 01:00:00 (Sun)
  63498564000, #    local_end 2013-03-10 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63498578400, #    utc_start 2013-03-10 06:00:00 (Sun)
  63519138000, #      utc_end 2013-11-03 05:00:00 (Sun)
  63498567600, #  local_start 2013-03-10 03:00:00 (Sun)
  63519127200, #    local_end 2013-11-03 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63519138000, #    utc_start 2013-11-03 05:00:00 (Sun)
  63530028000, #      utc_end 2014-03-09 06:00:00 (Sun)
  63519123600, #  local_start 2013-11-03 01:00:00 (Sun)
  63530013600, #    local_end 2014-03-09 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63530028000, #    utc_start 2014-03-09 06:00:00 (Sun)
  63550587600, #      utc_end 2014-11-02 05:00:00 (Sun)
  63530017200, #  local_start 2014-03-09 03:00:00 (Sun)
  63550576800, #    local_end 2014-11-02 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63550587600, #    utc_start 2014-11-02 05:00:00 (Sun)
  63561477600, #      utc_end 2015-03-08 06:00:00 (Sun)
  63550573200, #  local_start 2014-11-02 01:00:00 (Sun)
  63561463200, #    local_end 2015-03-08 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63561477600, #    utc_start 2015-03-08 06:00:00 (Sun)
  63582037200, #      utc_end 2015-11-01 05:00:00 (Sun)
  63561466800, #  local_start 2015-03-08 03:00:00 (Sun)
  63582026400, #    local_end 2015-11-01 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63582037200, #    utc_start 2015-11-01 05:00:00 (Sun)
  63593532000, #      utc_end 2016-03-13 06:00:00 (Sun)
  63582022800, #  local_start 2015-11-01 01:00:00 (Sun)
  63593517600, #    local_end 2016-03-13 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63593532000, #    utc_start 2016-03-13 06:00:00 (Sun)
  63614091600, #      utc_end 2016-11-06 05:00:00 (Sun)
  63593521200, #  local_start 2016-03-13 03:00:00 (Sun)
  63614080800, #    local_end 2016-11-06 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63614091600, #    utc_start 2016-11-06 05:00:00 (Sun)
  63624981600, #      utc_end 2017-03-12 06:00:00 (Sun)
  63614077200, #  local_start 2016-11-06 01:00:00 (Sun)
  63624967200, #    local_end 2017-03-12 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63624981600, #    utc_start 2017-03-12 06:00:00 (Sun)
  63645541200, #      utc_end 2017-11-05 05:00:00 (Sun)
  63624970800, #  local_start 2017-03-12 03:00:00 (Sun)
  63645530400, #    local_end 2017-11-05 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63645541200, #    utc_start 2017-11-05 05:00:00 (Sun)
  63656431200, #      utc_end 2018-03-11 06:00:00 (Sun)
  63645526800, #  local_start 2017-11-05 01:00:00 (Sun)
  63656416800, #    local_end 2018-03-11 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63656431200, #    utc_start 2018-03-11 06:00:00 (Sun)
  63676990800, #      utc_end 2018-11-04 05:00:00 (Sun)
  63656420400, #  local_start 2018-03-11 03:00:00 (Sun)
  63676980000, #    local_end 2018-11-04 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63676990800, #    utc_start 2018-11-04 05:00:00 (Sun)
  63687880800, #      utc_end 2019-03-10 06:00:00 (Sun)
  63676976400, #  local_start 2018-11-04 01:00:00 (Sun)
  63687866400, #    local_end 2019-03-10 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63687880800, #    utc_start 2019-03-10 06:00:00 (Sun)
  63708440400, #      utc_end 2019-11-03 05:00:00 (Sun)
  63687870000, #  local_start 2019-03-10 03:00:00 (Sun)
  63708429600, #    local_end 2019-11-03 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63708440400, #    utc_start 2019-11-03 05:00:00 (Sun)
  63719330400, #      utc_end 2020-03-08 06:00:00 (Sun)
  63708426000, #  local_start 2019-11-03 01:00:00 (Sun)
  63719316000, #    local_end 2020-03-08 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63719330400, #    utc_start 2020-03-08 06:00:00 (Sun)
  63739890000, #      utc_end 2020-11-01 05:00:00 (Sun)
  63719319600, #  local_start 2020-03-08 03:00:00 (Sun)
  63739879200, #    local_end 2020-11-01 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63739890000, #    utc_start 2020-11-01 05:00:00 (Sun)
  63751384800, #      utc_end 2021-03-14 06:00:00 (Sun)
  63739875600, #  local_start 2020-11-01 01:00:00 (Sun)
  63751370400, #    local_end 2021-03-14 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63751384800, #    utc_start 2021-03-14 06:00:00 (Sun)
  63771944400, #      utc_end 2021-11-07 05:00:00 (Sun)
  63751374000, #  local_start 2021-03-14 03:00:00 (Sun)
  63771933600, #    local_end 2021-11-07 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63771944400, #    utc_start 2021-11-07 05:00:00 (Sun)
  63782834400, #      utc_end 2022-03-13 06:00:00 (Sun)
  63771930000, #  local_start 2021-11-07 01:00:00 (Sun)
  63782820000, #    local_end 2022-03-13 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63782834400, #    utc_start 2022-03-13 06:00:00 (Sun)
  63803394000, #      utc_end 2022-11-06 05:00:00 (Sun)
  63782823600, #  local_start 2022-03-13 03:00:00 (Sun)
  63803383200, #    local_end 2022-11-06 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63803394000, #    utc_start 2022-11-06 05:00:00 (Sun)
  63814284000, #      utc_end 2023-03-12 06:00:00 (Sun)
  63803379600, #  local_start 2022-11-06 01:00:00 (Sun)
  63814269600, #    local_end 2023-03-12 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63814284000, #    utc_start 2023-03-12 06:00:00 (Sun)
  63834843600, #      utc_end 2023-11-05 05:00:00 (Sun)
  63814273200, #  local_start 2023-03-12 03:00:00 (Sun)
  63834832800, #    local_end 2023-11-05 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63834843600, #    utc_start 2023-11-05 05:00:00 (Sun)
  63845733600, #      utc_end 2024-03-10 06:00:00 (Sun)
  63834829200, #  local_start 2023-11-05 01:00:00 (Sun)
  63845719200, #    local_end 2024-03-10 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63845733600, #    utc_start 2024-03-10 06:00:00 (Sun)
  63866293200, #      utc_end 2024-11-03 05:00:00 (Sun)
  63845722800, #  local_start 2024-03-10 03:00:00 (Sun)
  63866282400, #    local_end 2024-11-03 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63866293200, #    utc_start 2024-11-03 05:00:00 (Sun)
  63877183200, #      utc_end 2025-03-09 06:00:00 (Sun)
  63866278800, #  local_start 2024-11-03 01:00:00 (Sun)
  63877168800, #    local_end 2025-03-09 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63877183200, #    utc_start 2025-03-09 06:00:00 (Sun)
  63897742800, #      utc_end 2025-11-02 05:00:00 (Sun)
  63877172400, #  local_start 2025-03-09 03:00:00 (Sun)
  63897732000, #    local_end 2025-11-02 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63897742800, #    utc_start 2025-11-02 05:00:00 (Sun)
  63908632800, #      utc_end 2026-03-08 06:00:00 (Sun)
  63897728400, #  local_start 2025-11-02 01:00:00 (Sun)
  63908618400, #    local_end 2026-03-08 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63908632800, #    utc_start 2026-03-08 06:00:00 (Sun)
  63929192400, #      utc_end 2026-11-01 05:00:00 (Sun)
  63908622000, #  local_start 2026-03-08 03:00:00 (Sun)
  63929181600, #    local_end 2026-11-01 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63929192400, #    utc_start 2026-11-01 05:00:00 (Sun)
  63940687200, #      utc_end 2027-03-14 06:00:00 (Sun)
  63929178000, #  local_start 2026-11-01 01:00:00 (Sun)
  63940672800, #    local_end 2027-03-14 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63940687200, #    utc_start 2027-03-14 06:00:00 (Sun)
  63961246800, #      utc_end 2027-11-07 05:00:00 (Sun)
  63940676400, #  local_start 2027-03-14 03:00:00 (Sun)
  63961236000, #    local_end 2027-11-07 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63961246800, #    utc_start 2027-11-07 05:00:00 (Sun)
  63972136800, #      utc_end 2028-03-12 06:00:00 (Sun)
  63961232400, #  local_start 2027-11-07 01:00:00 (Sun)
  63972122400, #    local_end 2028-03-12 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63972136800, #    utc_start 2028-03-12 06:00:00 (Sun)
  63992696400, #      utc_end 2028-11-05 05:00:00 (Sun)
  63972126000, #  local_start 2028-03-12 03:00:00 (Sun)
  63992685600, #    local_end 2028-11-05 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63992696400, #    utc_start 2028-11-05 05:00:00 (Sun)
  64003586400, #      utc_end 2029-03-11 06:00:00 (Sun)
  63992682000, #  local_start 2028-11-05 01:00:00 (Sun)
  64003572000, #    local_end 2029-03-11 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  64003586400, #    utc_start 2029-03-11 06:00:00 (Sun)
  64024146000, #      utc_end 2029-11-04 05:00:00 (Sun)
  64003575600, #  local_start 2029-03-11 03:00:00 (Sun)
  64024135200, #    local_end 2029-11-04 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  64024146000, #    utc_start 2029-11-04 05:00:00 (Sun)
  64035036000, #      utc_end 2030-03-10 06:00:00 (Sun)
  64024131600, #  local_start 2029-11-04 01:00:00 (Sun)
  64035021600, #    local_end 2030-03-10 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  64035036000, #    utc_start 2030-03-10 06:00:00 (Sun)
  64055595600, #      utc_end 2030-11-03 05:00:00 (Sun)
  64035025200, #  local_start 2030-03-10 03:00:00 (Sun)
  64055584800, #    local_end 2030-11-03 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {95}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -14400 }
  
  my $last_observance = bless( {
    'format' => 'A%sT',
    'gmtoff' => '-4:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 734442,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 734442,
      'utc_rd_secs' => 0,
      'utc_year' => 2012
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -14400,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 734442,
      'local_rd_secs' => 10800,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 734442,
      'utc_rd_secs' => 10800,
      'utc_year' => 2012
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Nov',
      'letter' => 'S',
      'name' => 'Canada',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Mar',
      'letter' => 'D',
      'name' => 'Canada',
      'offset_from_std' => 3600,
      'on' => 'Sun>=8',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_GOOSE_BAY

    $main::fatpacked{"DateTime/TimeZone/America/Grand_Turk.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_GRAND_TURK';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Grand_Turk;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Grand_Turk::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59611178672, #      utc_end 1890-01-01 04:44:32 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59611161600, #    local_end 1890-01-01 00:00:00 (Wed)
  -17072,
  0,
  'LMT',
      ],
      [
  59611178672, #    utc_start 1890-01-01 04:44:32 (Wed)
  60307996030, #      utc_end 1912-02-01 05:07:10 (Thu)
  59611160242, #  local_start 1889-12-31 23:37:22 (Tue)
  60307977600, #    local_end 1912-02-01 00:00:00 (Thu)
  -18430,
  0,
  'KMT',
      ],
      [
  60307996030, #    utc_start 1912-02-01 05:07:10 (Thu)
  62419698000, #      utc_end 1979-01-01 05:00:00 (Mon)
  60307978030, #  local_start 1912-02-01 00:07:10 (Thu)
  62419680000, #    local_end 1979-01-01 00:00:00 (Mon)
  -18000,
  0,
  'EST',
      ],
      [
  62419698000, #    utc_start 1979-01-01 05:00:00 (Mon)
  62429900400, #      utc_end 1979-04-29 07:00:00 (Sun)
  62419680000, #  local_start 1979-01-01 00:00:00 (Mon)
  62429882400, #    local_end 1979-04-29 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62429900400, #    utc_start 1979-04-29 07:00:00 (Sun)
  62445621600, #      utc_end 1979-10-28 06:00:00 (Sun)
  62429886000, #  local_start 1979-04-29 03:00:00 (Sun)
  62445607200, #    local_end 1979-10-28 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62445621600, #    utc_start 1979-10-28 06:00:00 (Sun)
  62461350000, #      utc_end 1980-04-27 07:00:00 (Sun)
  62445603600, #  local_start 1979-10-28 01:00:00 (Sun)
  62461332000, #    local_end 1980-04-27 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62461350000, #    utc_start 1980-04-27 07:00:00 (Sun)
  62477071200, #      utc_end 1980-10-26 06:00:00 (Sun)
  62461335600, #  local_start 1980-04-27 03:00:00 (Sun)
  62477056800, #    local_end 1980-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62477071200, #    utc_start 1980-10-26 06:00:00 (Sun)
  62492799600, #      utc_end 1981-04-26 07:00:00 (Sun)
  62477053200, #  local_start 1980-10-26 01:00:00 (Sun)
  62492781600, #    local_end 1981-04-26 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62492799600, #    utc_start 1981-04-26 07:00:00 (Sun)
  62508520800, #      utc_end 1981-10-25 06:00:00 (Sun)
  62492785200, #  local_start 1981-04-26 03:00:00 (Sun)
  62508506400, #    local_end 1981-10-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62508520800, #    utc_start 1981-10-25 06:00:00 (Sun)
  62524249200, #      utc_end 1982-04-25 07:00:00 (Sun)
  62508502800, #  local_start 1981-10-25 01:00:00 (Sun)
  62524231200, #    local_end 1982-04-25 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62524249200, #    utc_start 1982-04-25 07:00:00 (Sun)
  62540575200, #      utc_end 1982-10-31 06:00:00 (Sun)
  62524234800, #  local_start 1982-04-25 03:00:00 (Sun)
  62540560800, #    local_end 1982-10-31 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62540575200, #    utc_start 1982-10-31 06:00:00 (Sun)
  62555698800, #      utc_end 1983-04-24 07:00:00 (Sun)
  62540557200, #  local_start 1982-10-31 01:00:00 (Sun)
  62555680800, #    local_end 1983-04-24 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62555698800, #    utc_start 1983-04-24 07:00:00 (Sun)
  62572024800, #      utc_end 1983-10-30 06:00:00 (Sun)
  62555684400, #  local_start 1983-04-24 03:00:00 (Sun)
  62572010400, #    local_end 1983-10-30 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62572024800, #    utc_start 1983-10-30 06:00:00 (Sun)
  62587753200, #      utc_end 1984-04-29 07:00:00 (Sun)
  62572006800, #  local_start 1983-10-30 01:00:00 (Sun)
  62587735200, #    local_end 1984-04-29 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62587753200, #    utc_start 1984-04-29 07:00:00 (Sun)
  62603474400, #      utc_end 1984-10-28 06:00:00 (Sun)
  62587738800, #  local_start 1984-04-29 03:00:00 (Sun)
  62603460000, #    local_end 1984-10-28 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62603474400, #    utc_start 1984-10-28 06:00:00 (Sun)
  62619202800, #      utc_end 1985-04-28 07:00:00 (Sun)
  62603456400, #  local_start 1984-10-28 01:00:00 (Sun)
  62619184800, #    local_end 1985-04-28 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62619202800, #    utc_start 1985-04-28 07:00:00 (Sun)
  62634924000, #      utc_end 1985-10-27 06:00:00 (Sun)
  62619188400, #  local_start 1985-04-28 03:00:00 (Sun)
  62634909600, #    local_end 1985-10-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62634924000, #    utc_start 1985-10-27 06:00:00 (Sun)
  62650652400, #      utc_end 1986-04-27 07:00:00 (Sun)
  62634906000, #  local_start 1985-10-27 01:00:00 (Sun)
  62650634400, #    local_end 1986-04-27 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62650652400, #    utc_start 1986-04-27 07:00:00 (Sun)
  62666373600, #      utc_end 1986-10-26 06:00:00 (Sun)
  62650638000, #  local_start 1986-04-27 03:00:00 (Sun)
  62666359200, #    local_end 1986-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62666373600, #    utc_start 1986-10-26 06:00:00 (Sun)
  62680287600, #      utc_end 1987-04-05 07:00:00 (Sun)
  62666355600, #  local_start 1986-10-26 01:00:00 (Sun)
  62680269600, #    local_end 1987-04-05 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62680287600, #    utc_start 1987-04-05 07:00:00 (Sun)
  62697823200, #      utc_end 1987-10-25 06:00:00 (Sun)
  62680273200, #  local_start 1987-04-05 03:00:00 (Sun)
  62697808800, #    local_end 1987-10-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62697823200, #    utc_start 1987-10-25 06:00:00 (Sun)
  62711737200, #      utc_end 1988-04-03 07:00:00 (Sun)
  62697805200, #  local_start 1987-10-25 01:00:00 (Sun)
  62711719200, #    local_end 1988-04-03 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62711737200, #    utc_start 1988-04-03 07:00:00 (Sun)
  62729877600, #      utc_end 1988-10-30 06:00:00 (Sun)
  62711722800, #  local_start 1988-04-03 03:00:00 (Sun)
  62729863200, #    local_end 1988-10-30 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62729877600, #    utc_start 1988-10-30 06:00:00 (Sun)
  62743186800, #      utc_end 1989-04-02 07:00:00 (Sun)
  62729859600, #  local_start 1988-10-30 01:00:00 (Sun)
  62743168800, #    local_end 1989-04-02 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62743186800, #    utc_start 1989-04-02 07:00:00 (Sun)
  62761327200, #      utc_end 1989-10-29 06:00:00 (Sun)
  62743172400, #  local_start 1989-04-02 03:00:00 (Sun)
  62761312800, #    local_end 1989-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62761327200, #    utc_start 1989-10-29 06:00:00 (Sun)
  62774636400, #      utc_end 1990-04-01 07:00:00 (Sun)
  62761309200, #  local_start 1989-10-29 01:00:00 (Sun)
  62774618400, #    local_end 1990-04-01 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62774636400, #    utc_start 1990-04-01 07:00:00 (Sun)
  62792776800, #      utc_end 1990-10-28 06:00:00 (Sun)
  62774622000, #  local_start 1990-04-01 03:00:00 (Sun)
  62792762400, #    local_end 1990-10-28 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62792776800, #    utc_start 1990-10-28 06:00:00 (Sun)
  62806690800, #      utc_end 1991-04-07 07:00:00 (Sun)
  62792758800, #  local_start 1990-10-28 01:00:00 (Sun)
  62806672800, #    local_end 1991-04-07 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62806690800, #    utc_start 1991-04-07 07:00:00 (Sun)
  62824226400, #      utc_end 1991-10-27 06:00:00 (Sun)
  62806676400, #  local_start 1991-04-07 03:00:00 (Sun)
  62824212000, #    local_end 1991-10-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62824226400, #    utc_start 1991-10-27 06:00:00 (Sun)
  62838140400, #      utc_end 1992-04-05 07:00:00 (Sun)
  62824208400, #  local_start 1991-10-27 01:00:00 (Sun)
  62838122400, #    local_end 1992-04-05 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62838140400, #    utc_start 1992-04-05 07:00:00 (Sun)
  62855676000, #      utc_end 1992-10-25 06:00:00 (Sun)
  62838126000, #  local_start 1992-04-05 03:00:00 (Sun)
  62855661600, #    local_end 1992-10-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62855676000, #    utc_start 1992-10-25 06:00:00 (Sun)
  62869590000, #      utc_end 1993-04-04 07:00:00 (Sun)
  62855658000, #  local_start 1992-10-25 01:00:00 (Sun)
  62869572000, #    local_end 1993-04-04 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62869590000, #    utc_start 1993-04-04 07:00:00 (Sun)
  62887730400, #      utc_end 1993-10-31 06:00:00 (Sun)
  62869575600, #  local_start 1993-04-04 03:00:00 (Sun)
  62887716000, #    local_end 1993-10-31 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62887730400, #    utc_start 1993-10-31 06:00:00 (Sun)
  62901039600, #      utc_end 1994-04-03 07:00:00 (Sun)
  62887712400, #  local_start 1993-10-31 01:00:00 (Sun)
  62901021600, #    local_end 1994-04-03 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62901039600, #    utc_start 1994-04-03 07:00:00 (Sun)
  62919180000, #      utc_end 1994-10-30 06:00:00 (Sun)
  62901025200, #  local_start 1994-04-03 03:00:00 (Sun)
  62919165600, #    local_end 1994-10-30 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62919180000, #    utc_start 1994-10-30 06:00:00 (Sun)
  62932489200, #      utc_end 1995-04-02 07:00:00 (Sun)
  62919162000, #  local_start 1994-10-30 01:00:00 (Sun)
  62932471200, #    local_end 1995-04-02 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62932489200, #    utc_start 1995-04-02 07:00:00 (Sun)
  62950629600, #      utc_end 1995-10-29 06:00:00 (Sun)
  62932474800, #  local_start 1995-04-02 03:00:00 (Sun)
  62950615200, #    local_end 1995-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62950629600, #    utc_start 1995-10-29 06:00:00 (Sun)
  62964543600, #      utc_end 1996-04-07 07:00:00 (Sun)
  62950611600, #  local_start 1995-10-29 01:00:00 (Sun)
  62964525600, #    local_end 1996-04-07 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62964543600, #    utc_start 1996-04-07 07:00:00 (Sun)
  62982079200, #      utc_end 1996-10-27 06:00:00 (Sun)
  62964529200, #  local_start 1996-04-07 03:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62982079200, #    utc_start 1996-10-27 06:00:00 (Sun)
  62995993200, #      utc_end 1997-04-06 07:00:00 (Sun)
  62982061200, #  local_start 1996-10-27 01:00:00 (Sun)
  62995975200, #    local_end 1997-04-06 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62995993200, #    utc_start 1997-04-06 07:00:00 (Sun)
  63013528800, #      utc_end 1997-10-26 06:00:00 (Sun)
  62995978800, #  local_start 1997-04-06 03:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63013528800, #    utc_start 1997-10-26 06:00:00 (Sun)
  63027442800, #      utc_end 1998-04-05 07:00:00 (Sun)
  63013510800, #  local_start 1997-10-26 01:00:00 (Sun)
  63027424800, #    local_end 1998-04-05 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63027442800, #    utc_start 1998-04-05 07:00:00 (Sun)
  63044978400, #      utc_end 1998-10-25 06:00:00 (Sun)
  63027428400, #  local_start 1998-04-05 03:00:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63044978400, #    utc_start 1998-10-25 06:00:00 (Sun)
  63058892400, #      utc_end 1999-04-04 07:00:00 (Sun)
  63044960400, #  local_start 1998-10-25 01:00:00 (Sun)
  63058874400, #    local_end 1999-04-04 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63058892400, #    utc_start 1999-04-04 07:00:00 (Sun)
  63077032800, #      utc_end 1999-10-31 06:00:00 (Sun)
  63058878000, #  local_start 1999-04-04 03:00:00 (Sun)
  63077018400, #    local_end 1999-10-31 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63077032800, #    utc_start 1999-10-31 06:00:00 (Sun)
  63090342000, #      utc_end 2000-04-02 07:00:00 (Sun)
  63077014800, #  local_start 1999-10-31 01:00:00 (Sun)
  63090324000, #    local_end 2000-04-02 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63090342000, #    utc_start 2000-04-02 07:00:00 (Sun)
  63108482400, #      utc_end 2000-10-29 06:00:00 (Sun)
  63090327600, #  local_start 2000-04-02 03:00:00 (Sun)
  63108468000, #    local_end 2000-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63108482400, #    utc_start 2000-10-29 06:00:00 (Sun)
  63121791600, #      utc_end 2001-04-01 07:00:00 (Sun)
  63108464400, #  local_start 2000-10-29 01:00:00 (Sun)
  63121773600, #    local_end 2001-04-01 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63121791600, #    utc_start 2001-04-01 07:00:00 (Sun)
  63139932000, #      utc_end 2001-10-28 06:00:00 (Sun)
  63121777200, #  local_start 2001-04-01 03:00:00 (Sun)
  63139917600, #    local_end 2001-10-28 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63139932000, #    utc_start 2001-10-28 06:00:00 (Sun)
  63153846000, #      utc_end 2002-04-07 07:00:00 (Sun)
  63139914000, #  local_start 2001-10-28 01:00:00 (Sun)
  63153828000, #    local_end 2002-04-07 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63153846000, #    utc_start 2002-04-07 07:00:00 (Sun)
  63171381600, #      utc_end 2002-10-27 06:00:00 (Sun)
  63153831600, #  local_start 2002-04-07 03:00:00 (Sun)
  63171367200, #    local_end 2002-10-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63171381600, #    utc_start 2002-10-27 06:00:00 (Sun)
  63185295600, #      utc_end 2003-04-06 07:00:00 (Sun)
  63171363600, #  local_start 2002-10-27 01:00:00 (Sun)
  63185277600, #    local_end 2003-04-06 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63185295600, #    utc_start 2003-04-06 07:00:00 (Sun)
  63202831200, #      utc_end 2003-10-26 06:00:00 (Sun)
  63185281200, #  local_start 2003-04-06 03:00:00 (Sun)
  63202816800, #    local_end 2003-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63202831200, #    utc_start 2003-10-26 06:00:00 (Sun)
  63216745200, #      utc_end 2004-04-04 07:00:00 (Sun)
  63202813200, #  local_start 2003-10-26 01:00:00 (Sun)
  63216727200, #    local_end 2004-04-04 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63216745200, #    utc_start 2004-04-04 07:00:00 (Sun)
  63234885600, #      utc_end 2004-10-31 06:00:00 (Sun)
  63216730800, #  local_start 2004-04-04 03:00:00 (Sun)
  63234871200, #    local_end 2004-10-31 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63234885600, #    utc_start 2004-10-31 06:00:00 (Sun)
  63248194800, #      utc_end 2005-04-03 07:00:00 (Sun)
  63234867600, #  local_start 2004-10-31 01:00:00 (Sun)
  63248176800, #    local_end 2005-04-03 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63248194800, #    utc_start 2005-04-03 07:00:00 (Sun)
  63266335200, #      utc_end 2005-10-30 06:00:00 (Sun)
  63248180400, #  local_start 2005-04-03 03:00:00 (Sun)
  63266320800, #    local_end 2005-10-30 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63266335200, #    utc_start 2005-10-30 06:00:00 (Sun)
  63279644400, #      utc_end 2006-04-02 07:00:00 (Sun)
  63266317200, #  local_start 2005-10-30 01:00:00 (Sun)
  63279626400, #    local_end 2006-04-02 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63279644400, #    utc_start 2006-04-02 07:00:00 (Sun)
  63297784800, #      utc_end 2006-10-29 06:00:00 (Sun)
  63279630000, #  local_start 2006-04-02 03:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63297784800, #    utc_start 2006-10-29 06:00:00 (Sun)
  63309279600, #      utc_end 2007-03-11 07:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63309261600, #    local_end 2007-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63309279600, #    utc_start 2007-03-11 07:00:00 (Sun)
  63329839200, #      utc_end 2007-11-04 06:00:00 (Sun)
  63309265200, #  local_start 2007-03-11 03:00:00 (Sun)
  63329824800, #    local_end 2007-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63329839200, #    utc_start 2007-11-04 06:00:00 (Sun)
  63340729200, #      utc_end 2008-03-09 07:00:00 (Sun)
  63329821200, #  local_start 2007-11-04 01:00:00 (Sun)
  63340711200, #    local_end 2008-03-09 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63340729200, #    utc_start 2008-03-09 07:00:00 (Sun)
  63361288800, #      utc_end 2008-11-02 06:00:00 (Sun)
  63340714800, #  local_start 2008-03-09 03:00:00 (Sun)
  63361274400, #    local_end 2008-11-02 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63361288800, #    utc_start 2008-11-02 06:00:00 (Sun)
  63372178800, #      utc_end 2009-03-08 07:00:00 (Sun)
  63361270800, #  local_start 2008-11-02 01:00:00 (Sun)
  63372160800, #    local_end 2009-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63372178800, #    utc_start 2009-03-08 07:00:00 (Sun)
  63392738400, #      utc_end 2009-11-01 06:00:00 (Sun)
  63372164400, #  local_start 2009-03-08 03:00:00 (Sun)
  63392724000, #    local_end 2009-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63392738400, #    utc_start 2009-11-01 06:00:00 (Sun)
  63404233200, #      utc_end 2010-03-14 07:00:00 (Sun)
  63392720400, #  local_start 2009-11-01 01:00:00 (Sun)
  63404215200, #    local_end 2010-03-14 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63404233200, #    utc_start 2010-03-14 07:00:00 (Sun)
  63424792800, #      utc_end 2010-11-07 06:00:00 (Sun)
  63404218800, #  local_start 2010-03-14 03:00:00 (Sun)
  63424778400, #    local_end 2010-11-07 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63424792800, #    utc_start 2010-11-07 06:00:00 (Sun)
  63435682800, #      utc_end 2011-03-13 07:00:00 (Sun)
  63424774800, #  local_start 2010-11-07 01:00:00 (Sun)
  63435664800, #    local_end 2011-03-13 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63435682800, #    utc_start 2011-03-13 07:00:00 (Sun)
  63456242400, #      utc_end 2011-11-06 06:00:00 (Sun)
  63435668400, #  local_start 2011-03-13 03:00:00 (Sun)
  63456228000, #    local_end 2011-11-06 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63456242400, #    utc_start 2011-11-06 06:00:00 (Sun)
  63467132400, #      utc_end 2012-03-11 07:00:00 (Sun)
  63456224400, #  local_start 2011-11-06 01:00:00 (Sun)
  63467114400, #    local_end 2012-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63467132400, #    utc_start 2012-03-11 07:00:00 (Sun)
  63487692000, #      utc_end 2012-11-04 06:00:00 (Sun)
  63467118000, #  local_start 2012-03-11 03:00:00 (Sun)
  63487677600, #    local_end 2012-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63487692000, #    utc_start 2012-11-04 06:00:00 (Sun)
  63498582000, #      utc_end 2013-03-10 07:00:00 (Sun)
  63487674000, #  local_start 2012-11-04 01:00:00 (Sun)
  63498564000, #    local_end 2013-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63498582000, #    utc_start 2013-03-10 07:00:00 (Sun)
  63519141600, #      utc_end 2013-11-03 06:00:00 (Sun)
  63498567600, #  local_start 2013-03-10 03:00:00 (Sun)
  63519127200, #    local_end 2013-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63519141600, #    utc_start 2013-11-03 06:00:00 (Sun)
  63530031600, #      utc_end 2014-03-09 07:00:00 (Sun)
  63519123600, #  local_start 2013-11-03 01:00:00 (Sun)
  63530013600, #    local_end 2014-03-09 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63530031600, #    utc_start 2014-03-09 07:00:00 (Sun)
  63550591200, #      utc_end 2014-11-02 06:00:00 (Sun)
  63530017200, #  local_start 2014-03-09 03:00:00 (Sun)
  63550576800, #    local_end 2014-11-02 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63550591200, #    utc_start 2014-11-02 06:00:00 (Sun)
  63561481200, #      utc_end 2015-03-08 07:00:00 (Sun)
  63550573200, #  local_start 2014-11-02 01:00:00 (Sun)
  63561463200, #    local_end 2015-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63561481200, #    utc_start 2015-03-08 07:00:00 (Sun)
  63582040800, #      utc_end 2015-11-01 06:00:00 (Sun)
  63561466800, #  local_start 2015-03-08 03:00:00 (Sun)
  63582026400, #    local_end 2015-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63582040800, #    utc_start 2015-11-01 06:00:00 (Sun)
  63656434800, #      utc_end 2018-03-11 07:00:00 (Sun)
  63582026400, #  local_start 2015-11-01 02:00:00 (Sun)
  63656420400, #    local_end 2018-03-11 03:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63656434800, #    utc_start 2018-03-11 07:00:00 (Sun)
  63676994400, #      utc_end 2018-11-04 06:00:00 (Sun)
  63656420400, #  local_start 2018-03-11 03:00:00 (Sun)
  63676980000, #    local_end 2018-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63676994400, #    utc_start 2018-11-04 06:00:00 (Sun)
  63687884400, #      utc_end 2019-03-10 07:00:00 (Sun)
  63676976400, #  local_start 2018-11-04 01:00:00 (Sun)
  63687866400, #    local_end 2019-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63687884400, #    utc_start 2019-03-10 07:00:00 (Sun)
  63708444000, #      utc_end 2019-11-03 06:00:00 (Sun)
  63687870000, #  local_start 2019-03-10 03:00:00 (Sun)
  63708429600, #    local_end 2019-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63708444000, #    utc_start 2019-11-03 06:00:00 (Sun)
  63719334000, #      utc_end 2020-03-08 07:00:00 (Sun)
  63708426000, #  local_start 2019-11-03 01:00:00 (Sun)
  63719316000, #    local_end 2020-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63719334000, #    utc_start 2020-03-08 07:00:00 (Sun)
  63739893600, #      utc_end 2020-11-01 06:00:00 (Sun)
  63719319600, #  local_start 2020-03-08 03:00:00 (Sun)
  63739879200, #    local_end 2020-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63739893600, #    utc_start 2020-11-01 06:00:00 (Sun)
  63751388400, #      utc_end 2021-03-14 07:00:00 (Sun)
  63739875600, #  local_start 2020-11-01 01:00:00 (Sun)
  63751370400, #    local_end 2021-03-14 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63751388400, #    utc_start 2021-03-14 07:00:00 (Sun)
  63771948000, #      utc_end 2021-11-07 06:00:00 (Sun)
  63751374000, #  local_start 2021-03-14 03:00:00 (Sun)
  63771933600, #    local_end 2021-11-07 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63771948000, #    utc_start 2021-11-07 06:00:00 (Sun)
  63782838000, #      utc_end 2022-03-13 07:00:00 (Sun)
  63771930000, #  local_start 2021-11-07 01:00:00 (Sun)
  63782820000, #    local_end 2022-03-13 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63782838000, #    utc_start 2022-03-13 07:00:00 (Sun)
  63803397600, #      utc_end 2022-11-06 06:00:00 (Sun)
  63782823600, #  local_start 2022-03-13 03:00:00 (Sun)
  63803383200, #    local_end 2022-11-06 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63803397600, #    utc_start 2022-11-06 06:00:00 (Sun)
  63814287600, #      utc_end 2023-03-12 07:00:00 (Sun)
  63803379600, #  local_start 2022-11-06 01:00:00 (Sun)
  63814269600, #    local_end 2023-03-12 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63814287600, #    utc_start 2023-03-12 07:00:00 (Sun)
  63834847200, #      utc_end 2023-11-05 06:00:00 (Sun)
  63814273200, #  local_start 2023-03-12 03:00:00 (Sun)
  63834832800, #    local_end 2023-11-05 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63834847200, #    utc_start 2023-11-05 06:00:00 (Sun)
  63845737200, #      utc_end 2024-03-10 07:00:00 (Sun)
  63834829200, #  local_start 2023-11-05 01:00:00 (Sun)
  63845719200, #    local_end 2024-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63845737200, #    utc_start 2024-03-10 07:00:00 (Sun)
  63866296800, #      utc_end 2024-11-03 06:00:00 (Sun)
  63845722800, #  local_start 2024-03-10 03:00:00 (Sun)
  63866282400, #    local_end 2024-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63866296800, #    utc_start 2024-11-03 06:00:00 (Sun)
  63877186800, #      utc_end 2025-03-09 07:00:00 (Sun)
  63866278800, #  local_start 2024-11-03 01:00:00 (Sun)
  63877168800, #    local_end 2025-03-09 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63877186800, #    utc_start 2025-03-09 07:00:00 (Sun)
  63897746400, #      utc_end 2025-11-02 06:00:00 (Sun)
  63877172400, #  local_start 2025-03-09 03:00:00 (Sun)
  63897732000, #    local_end 2025-11-02 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63897746400, #    utc_start 2025-11-02 06:00:00 (Sun)
  63908636400, #      utc_end 2026-03-08 07:00:00 (Sun)
  63897728400, #  local_start 2025-11-02 01:00:00 (Sun)
  63908618400, #    local_end 2026-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63908636400, #    utc_start 2026-03-08 07:00:00 (Sun)
  63929196000, #      utc_end 2026-11-01 06:00:00 (Sun)
  63908622000, #  local_start 2026-03-08 03:00:00 (Sun)
  63929181600, #    local_end 2026-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63929196000, #    utc_start 2026-11-01 06:00:00 (Sun)
  63940690800, #      utc_end 2027-03-14 07:00:00 (Sun)
  63929178000, #  local_start 2026-11-01 01:00:00 (Sun)
  63940672800, #    local_end 2027-03-14 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63940690800, #    utc_start 2027-03-14 07:00:00 (Sun)
  63961250400, #      utc_end 2027-11-07 06:00:00 (Sun)
  63940676400, #  local_start 2027-03-14 03:00:00 (Sun)
  63961236000, #    local_end 2027-11-07 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63961250400, #    utc_start 2027-11-07 06:00:00 (Sun)
  63972140400, #      utc_end 2028-03-12 07:00:00 (Sun)
  63961232400, #  local_start 2027-11-07 01:00:00 (Sun)
  63972122400, #    local_end 2028-03-12 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63972140400, #    utc_start 2028-03-12 07:00:00 (Sun)
  63992700000, #      utc_end 2028-11-05 06:00:00 (Sun)
  63972126000, #  local_start 2028-03-12 03:00:00 (Sun)
  63992685600, #    local_end 2028-11-05 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63992700000, #    utc_start 2028-11-05 06:00:00 (Sun)
  64003590000, #      utc_end 2029-03-11 07:00:00 (Sun)
  63992682000, #  local_start 2028-11-05 01:00:00 (Sun)
  64003572000, #    local_end 2029-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  64003590000, #    utc_start 2029-03-11 07:00:00 (Sun)
  64024149600, #      utc_end 2029-11-04 06:00:00 (Sun)
  64003575600, #  local_start 2029-03-11 03:00:00 (Sun)
  64024135200, #    local_end 2029-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  64024149600, #    utc_start 2029-11-04 06:00:00 (Sun)
  64035039600, #      utc_end 2030-03-10 07:00:00 (Sun)
  64024131600, #  local_start 2029-11-04 01:00:00 (Sun)
  64035021600, #    local_end 2030-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  64035039600, #    utc_start 2030-03-10 07:00:00 (Sun)
  64055599200, #      utc_end 2030-11-03 06:00:00 (Sun)
  64035025200, #  local_start 2030-03-10 03:00:00 (Sun)
  64055584800, #    local_end 2030-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {50}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -18000 }
  
  my $last_observance = bless( {
    'format' => 'E%sT',
    'gmtoff' => '-5:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 736764,
      'local_rd_secs' => 10800,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 736764,
      'utc_rd_secs' => 10800,
      'utc_year' => 2019
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -18000,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 736764,
      'local_rd_secs' => 25200,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 736764,
      'utc_rd_secs' => 25200,
      'utc_year' => 2019
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Nov',
      'letter' => 'S',
      'name' => 'US',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Mar',
      'letter' => 'D',
      'name' => 'US',
      'offset_from_std' => 3600,
      'on' => 'Sun>=8',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_GRAND_TURK

    $main::fatpacked{"DateTime/TimeZone/America/Guatemala.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_GUATEMALA';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Guatemala;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Guatemala::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60518642524, #      utc_end 1918-10-05 06:02:04 (Sat)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60518620800, #    local_end 1918-10-05 00:00:00 (Sat)
  -21724,
  0,
  'LMT',
      ],
      [
  60518642524, #    utc_start 1918-10-05 06:02:04 (Sat)
  62258738400, #      utc_end 1973-11-25 06:00:00 (Sun)
  60518620924, #  local_start 1918-10-05 00:02:04 (Sat)
  62258716800, #    local_end 1973-11-25 00:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62258738400, #    utc_start 1973-11-25 06:00:00 (Sun)
  62266597200, #      utc_end 1974-02-24 05:00:00 (Sun)
  62258720400, #  local_start 1973-11-25 01:00:00 (Sun)
  62266579200, #    local_end 1974-02-24 00:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62266597200, #    utc_start 1974-02-24 05:00:00 (Sun)
  62558028000, #      utc_end 1983-05-21 06:00:00 (Sat)
  62266575600, #  local_start 1974-02-23 23:00:00 (Sat)
  62558006400, #    local_end 1983-05-21 00:00:00 (Sat)
  -21600,
  0,
  'CST',
      ],
      [
  62558028000, #    utc_start 1983-05-21 06:00:00 (Sat)
  62568738000, #      utc_end 1983-09-22 05:00:00 (Thu)
  62558010000, #  local_start 1983-05-21 01:00:00 (Sat)
  62568720000, #    local_end 1983-09-22 00:00:00 (Thu)
  -18000,
  1,
  'CDT',
      ],
      [
  62568738000, #    utc_start 1983-09-22 05:00:00 (Thu)
  62805391200, #      utc_end 1991-03-23 06:00:00 (Sat)
  62568716400, #  local_start 1983-09-21 23:00:00 (Wed)
  62805369600, #    local_end 1991-03-23 00:00:00 (Sat)
  -21600,
  0,
  'CST',
      ],
      [
  62805391200, #    utc_start 1991-03-23 06:00:00 (Sat)
  62819902800, #      utc_end 1991-09-07 05:00:00 (Sat)
  62805373200, #  local_start 1991-03-23 01:00:00 (Sat)
  62819884800, #    local_end 1991-09-07 00:00:00 (Sat)
  -18000,
  1,
  'CDT',
      ],
      [
  62819902800, #    utc_start 1991-09-07 05:00:00 (Sat)
  63282060000, #      utc_end 2006-04-30 06:00:00 (Sun)
  62819881200, #  local_start 1991-09-06 23:00:00 (Fri)
  63282038400, #    local_end 2006-04-30 00:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63282060000, #    utc_start 2006-04-30 06:00:00 (Sun)
  63295362000, #      utc_end 2006-10-01 05:00:00 (Sun)
  63282042000, #  local_start 2006-04-30 01:00:00 (Sun)
  63295344000, #    local_end 2006-10-01 00:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63295362000, #    utc_start 2006-10-01 05:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #      utc_end
  63295340400, #  local_start 2006-09-30 23:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #    local_end
  -21600,
  0,
  'CST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {4}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_GUATEMALA

    $main::fatpacked{"DateTime/TimeZone/America/Guayaquil.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_GUAYAQUIL';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/southamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Guayaquil;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Guayaquil::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59611180760, #      utc_end 1890-01-01 05:19:20 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59611161600, #    local_end 1890-01-01 00:00:00 (Wed)
  -19160,
  0,
  'LMT',
      ],
      [
  59611180760, #    utc_start 1890-01-01 05:19:20 (Wed)
  60904934040, #      utc_end 1931-01-01 05:14:00 (Thu)
  59611161920, #  local_start 1890-01-01 00:05:20 (Wed)
  60904915200, #    local_end 1931-01-01 00:00:00 (Thu)
  -18840,
  0,
  'QMT',
      ],
      [
  60904934040, #    utc_start 1931-01-01 05:14:00 (Thu)
  62858610000, #      utc_end 1992-11-28 05:00:00 (Sat)
  60904916040, #  local_start 1931-01-01 00:14:00 (Thu)
  62858592000, #    local_end 1992-11-28 00:00:00 (Sat)
  -18000,
  0,
  '-05',
      ],
      [
  62858610000, #    utc_start 1992-11-28 05:00:00 (Sat)
  62864568000, #      utc_end 1993-02-05 04:00:00 (Fri)
  62858595600, #  local_start 1992-11-28 01:00:00 (Sat)
  62864553600, #    local_end 1993-02-05 00:00:00 (Fri)
  -14400,
  1,
  '-04',
      ],
      [
  62864568000, #    utc_start 1993-02-05 04:00:00 (Fri)
  DateTime::TimeZone::INFINITY, #      utc_end
  62864550000, #  local_start 1993-02-04 23:00:00 (Thu)
  DateTime::TimeZone::INFINITY, #    local_end
  -18000,
  0,
  '-05',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {1}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_GUAYAQUIL

    $main::fatpacked{"DateTime/TimeZone/America/Guyana.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_GUYANA';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/southamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Guyana;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Guyana::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60405105160, #      utc_end 1915-03-01 03:52:40 (Mon)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60405091200, #    local_end 1915-03-01 00:00:00 (Mon)
  -13960,
  0,
  'LMT',
      ],
      [
  60405105160, #    utc_start 1915-03-01 03:52:40 (Mon)
  62311693500, #      utc_end 1975-07-31 03:45:00 (Thu)
  60405091660, #  local_start 1915-03-01 00:07:40 (Mon)
  62311680000, #    local_end 1975-07-31 00:00:00 (Thu)
  -13500,
  0,
  '-0345',
      ],
      [
  62311693500, #    utc_start 1975-07-31 03:45:00 (Thu)
  62798382000, #      utc_end 1991-01-01 03:00:00 (Tue)
  62311682700, #  local_start 1975-07-31 00:45:00 (Thu)
  62798371200, #    local_end 1991-01-01 00:00:00 (Tue)
  -10800,
  0,
  '-03',
      ],
      [
  62798382000, #    utc_start 1991-01-01 03:00:00 (Tue)
  DateTime::TimeZone::INFINITY, #      utc_end
  62798367600, #  local_start 1990-12-31 23:00:00 (Mon)
  DateTime::TimeZone::INFINITY, #    local_end
  -14400,
  0,
  '-04',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_GUYANA

    $main::fatpacked{"DateTime/TimeZone/America/Halifax.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_HALIFAX';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Halifax;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Halifax::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60004037664, #      utc_end 1902-06-15 04:14:24 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60004022400, #    local_end 1902-06-15 00:00:00 (Sun)
  -15264,
  0,
  'LMT',
      ],
      [
  60004037664, #    utc_start 1902-06-15 04:14:24 (Sun)
  60439406400, #      utc_end 1916-04-01 04:00:00 (Sat)
  60004023264, #  local_start 1902-06-15 00:14:24 (Sun)
  60439392000, #    local_end 1916-04-01 00:00:00 (Sat)
  -14400,
  0,
  'AST',
      ],
      [
  60439406400, #    utc_start 1916-04-01 04:00:00 (Sat)
  60455214000, #      utc_end 1916-10-01 03:00:00 (Sun)
  60439395600, #  local_start 1916-04-01 01:00:00 (Sat)
  60455203200, #    local_end 1916-10-01 00:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  60455214000, #    utc_start 1916-10-01 03:00:00 (Sun)
  60494702400, #      utc_end 1918-01-01 04:00:00 (Tue)
  60455199600, #  local_start 1916-09-30 23:00:00 (Sat)
  60494688000, #    local_end 1918-01-01 00:00:00 (Tue)
  -14400,
  0,
  'AST',
      ],
      [
  60494702400, #    utc_start 1918-01-01 04:00:00 (Tue)
  60503608800, #      utc_end 1918-04-14 06:00:00 (Sun)
  60494688000, #  local_start 1918-01-01 00:00:00 (Tue)
  60503594400, #    local_end 1918-04-14 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  60503608800, #    utc_start 1918-04-14 06:00:00 (Sun)
  60520539600, #      utc_end 1918-10-27 05:00:00 (Sun)
  60503598000, #  local_start 1918-04-14 03:00:00 (Sun)
  60520528800, #    local_end 1918-10-27 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  60520539600, #    utc_start 1918-10-27 05:00:00 (Sun)
  60526238400, #      utc_end 1919-01-01 04:00:00 (Wed)
  60520525200, #  local_start 1918-10-27 01:00:00 (Sun)
  60526224000, #    local_end 1919-01-01 00:00:00 (Wed)
  -14400,
  0,
  'AST',
      ],
      [
  60526238400, #    utc_start 1919-01-01 04:00:00 (Wed)
  60568920000, #      utc_end 1920-05-09 04:00:00 (Sun)
  60526224000, #  local_start 1919-01-01 00:00:00 (Wed)
  60568905600, #    local_end 1920-05-09 00:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  60568920000, #    utc_start 1920-05-09 04:00:00 (Sun)
  60578593200, #      utc_end 1920-08-29 03:00:00 (Sun)
  60568909200, #  local_start 1920-05-09 01:00:00 (Sun)
  60578582400, #    local_end 1920-08-29 00:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  60578593200, #    utc_start 1920-08-29 03:00:00 (Sun)
  60600196800, #      utc_end 1921-05-06 04:00:00 (Fri)
  60578578800, #  local_start 1920-08-28 23:00:00 (Sat)
  60600182400, #    local_end 1921-05-06 00:00:00 (Fri)
  -14400,
  0,
  'AST',
      ],
      [
  60600196800, #    utc_start 1921-05-06 04:00:00 (Fri)
  60610734000, #      utc_end 1921-09-05 03:00:00 (Mon)
  60600186000, #  local_start 1921-05-06 01:00:00 (Fri)
  60610723200, #    local_end 1921-09-05 00:00:00 (Mon)
  -10800,
  1,
  'ADT',
      ],
      [
  60610734000, #    utc_start 1921-09-05 03:00:00 (Mon)
  60631214400, #      utc_end 1922-04-30 04:00:00 (Sun)
  60610719600, #  local_start 1921-09-04 23:00:00 (Sun)
  60631200000, #    local_end 1922-04-30 00:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  60631214400, #    utc_start 1922-04-30 04:00:00 (Sun)
  60642270000, #      utc_end 1922-09-05 03:00:00 (Tue)
  60631203600, #  local_start 1922-04-30 01:00:00 (Sun)
  60642259200, #    local_end 1922-09-05 00:00:00 (Tue)
  -10800,
  1,
  'ADT',
      ],
      [
  60642270000, #    utc_start 1922-09-05 03:00:00 (Tue)
  60663268800, #      utc_end 1923-05-06 04:00:00 (Sun)
  60642255600, #  local_start 1922-09-04 23:00:00 (Mon)
  60663254400, #    local_end 1923-05-06 00:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  60663268800, #    utc_start 1923-05-06 04:00:00 (Sun)
  60673719600, #      utc_end 1923-09-04 03:00:00 (Tue)
  60663258000, #  local_start 1923-05-06 01:00:00 (Sun)
  60673708800, #    local_end 1923-09-04 00:00:00 (Tue)
  -10800,
  1,
  'ADT',
      ],
      [
  60673719600, #    utc_start 1923-09-04 03:00:00 (Tue)
  60694718400, #      utc_end 1924-05-04 04:00:00 (Sun)
  60673705200, #  local_start 1923-09-03 23:00:00 (Mon)
  60694704000, #    local_end 1924-05-04 00:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  60694718400, #    utc_start 1924-05-04 04:00:00 (Sun)
  60706292400, #      utc_end 1924-09-15 03:00:00 (Mon)
  60694707600, #  local_start 1924-05-04 01:00:00 (Sun)
  60706281600, #    local_end 1924-09-15 00:00:00 (Mon)
  -10800,
  1,
  'ADT',
      ],
      [
  60706292400, #    utc_start 1924-09-15 03:00:00 (Mon)
  60726168000, #      utc_end 1925-05-03 04:00:00 (Sun)
  60706278000, #  local_start 1924-09-14 23:00:00 (Sun)
  60726153600, #    local_end 1925-05-03 00:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  60726168000, #    utc_start 1925-05-03 04:00:00 (Sun)
  60738951600, #      utc_end 1925-09-28 03:00:00 (Mon)
  60726157200, #  local_start 1925-05-03 01:00:00 (Sun)
  60738940800, #    local_end 1925-09-28 00:00:00 (Mon)
  -10800,
  1,
  'ADT',
      ],
      [
  60738951600, #    utc_start 1925-09-28 03:00:00 (Mon)
  60758827200, #      utc_end 1926-05-16 04:00:00 (Sun)
  60738937200, #  local_start 1925-09-27 23:00:00 (Sun)
  60758812800, #    local_end 1926-05-16 00:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  60758827200, #    utc_start 1926-05-16 04:00:00 (Sun)
  60769191600, #      utc_end 1926-09-13 03:00:00 (Mon)
  60758816400, #  local_start 1926-05-16 01:00:00 (Sun)
  60769180800, #    local_end 1926-09-13 00:00:00 (Mon)
  -10800,
  1,
  'ADT',
      ],
      [
  60769191600, #    utc_start 1926-09-13 03:00:00 (Mon)
  60789067200, #      utc_end 1927-05-01 04:00:00 (Sun)
  60769177200, #  local_start 1926-09-12 23:00:00 (Sun)
  60789052800, #    local_end 1927-05-01 00:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  60789067200, #    utc_start 1927-05-01 04:00:00 (Sun)
  60801850800, #      utc_end 1927-09-26 03:00:00 (Mon)
  60789056400, #  local_start 1927-05-01 01:00:00 (Sun)
  60801840000, #    local_end 1927-09-26 00:00:00 (Mon)
  -10800,
  1,
  'ADT',
      ],
      [
  60801850800, #    utc_start 1927-09-26 03:00:00 (Mon)
  60821726400, #      utc_end 1928-05-13 04:00:00 (Sun)
  60801836400, #  local_start 1927-09-25 23:00:00 (Sun)
  60821712000, #    local_end 1928-05-13 00:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  60821726400, #    utc_start 1928-05-13 04:00:00 (Sun)
  60832004400, #      utc_end 1928-09-09 03:00:00 (Sun)
  60821715600, #  local_start 1928-05-13 01:00:00 (Sun)
  60831993600, #    local_end 1928-09-09 00:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  60832004400, #    utc_start 1928-09-09 03:00:00 (Sun)
  60853176000, #      utc_end 1929-05-12 04:00:00 (Sun)
  60831990000, #  local_start 1928-09-08 23:00:00 (Sat)
  60853161600, #    local_end 1929-05-12 00:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  60853176000, #    utc_start 1929-05-12 04:00:00 (Sun)
  60863022000, #      utc_end 1929-09-03 03:00:00 (Tue)
  60853165200, #  local_start 1929-05-12 01:00:00 (Sun)
  60863011200, #    local_end 1929-09-03 00:00:00 (Tue)
  -10800,
  1,
  'ADT',
      ],
      [
  60863022000, #    utc_start 1929-09-03 03:00:00 (Tue)
  60884625600, #      utc_end 1930-05-11 04:00:00 (Sun)
  60863007600, #  local_start 1929-09-02 23:00:00 (Mon)
  60884611200, #    local_end 1930-05-11 00:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  60884625600, #    utc_start 1930-05-11 04:00:00 (Sun)
  60895594800, #      utc_end 1930-09-15 03:00:00 (Mon)
  60884614800, #  local_start 1930-05-11 01:00:00 (Sun)
  60895584000, #    local_end 1930-09-15 00:00:00 (Mon)
  -10800,
  1,
  'ADT',
      ],
      [
  60895594800, #    utc_start 1930-09-15 03:00:00 (Mon)
  60916075200, #      utc_end 1931-05-10 04:00:00 (Sun)
  60895580400, #  local_start 1930-09-14 23:00:00 (Sun)
  60916060800, #    local_end 1931-05-10 00:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  60916075200, #    utc_start 1931-05-10 04:00:00 (Sun)
  60928254000, #      utc_end 1931-09-28 03:00:00 (Mon)
  60916064400, #  local_start 1931-05-10 01:00:00 (Sun)
  60928243200, #    local_end 1931-09-28 00:00:00 (Mon)
  -10800,
  1,
  'ADT',
      ],
      [
  60928254000, #    utc_start 1931-09-28 03:00:00 (Mon)
  60946920000, #      utc_end 1932-05-01 04:00:00 (Sun)
  60928239600, #  local_start 1931-09-27 23:00:00 (Sun)
  60946905600, #    local_end 1932-05-01 00:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  60946920000, #    utc_start 1932-05-01 04:00:00 (Sun)
  60959703600, #      utc_end 1932-09-26 03:00:00 (Mon)
  60946909200, #  local_start 1932-05-01 01:00:00 (Sun)
  60959692800, #    local_end 1932-09-26 00:00:00 (Mon)
  -10800,
  1,
  'ADT',
      ],
      [
  60959703600, #    utc_start 1932-09-26 03:00:00 (Mon)
  60978369600, #      utc_end 1933-04-30 04:00:00 (Sun)
  60959689200, #  local_start 1932-09-25 23:00:00 (Sun)
  60978355200, #    local_end 1933-04-30 00:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  60978369600, #    utc_start 1933-04-30 04:00:00 (Sun)
  60991758000, #      utc_end 1933-10-02 03:00:00 (Mon)
  60978358800, #  local_start 1933-04-30 01:00:00 (Sun)
  60991747200, #    local_end 1933-10-02 00:00:00 (Mon)
  -10800,
  1,
  'ADT',
      ],
      [
  60991758000, #    utc_start 1933-10-02 03:00:00 (Mon)
  61011633600, #      utc_end 1934-05-20 04:00:00 (Sun)
  60991743600, #  local_start 1933-10-01 23:00:00 (Sun)
  61011619200, #    local_end 1934-05-20 00:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  61011633600, #    utc_start 1934-05-20 04:00:00 (Sun)
  61021911600, #      utc_end 1934-09-16 03:00:00 (Sun)
  61011622800, #  local_start 1934-05-20 01:00:00 (Sun)
  61021900800, #    local_end 1934-09-16 00:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  61021911600, #    utc_start 1934-09-16 03:00:00 (Sun)
  61044292800, #      utc_end 1935-06-02 04:00:00 (Sun)
  61021897200, #  local_start 1934-09-15 23:00:00 (Sat)
  61044278400, #    local_end 1935-06-02 00:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  61044292800, #    utc_start 1935-06-02 04:00:00 (Sun)
  61054657200, #      utc_end 1935-09-30 03:00:00 (Mon)
  61044282000, #  local_start 1935-06-02 01:00:00 (Sun)
  61054646400, #    local_end 1935-09-30 00:00:00 (Mon)
  -10800,
  1,
  'ADT',
      ],
      [
  61054657200, #    utc_start 1935-09-30 03:00:00 (Mon)
  61075828800, #      utc_end 1936-06-01 04:00:00 (Mon)
  61054642800, #  local_start 1935-09-29 23:00:00 (Sun)
  61075814400, #    local_end 1936-06-01 00:00:00 (Mon)
  -14400,
  0,
  'AST',
      ],
      [
  61075828800, #    utc_start 1936-06-01 04:00:00 (Mon)
  61084897200, #      utc_end 1936-09-14 03:00:00 (Mon)
  61075818000, #  local_start 1936-06-01 01:00:00 (Mon)
  61084886400, #    local_end 1936-09-14 00:00:00 (Mon)
  -10800,
  1,
  'ADT',
      ],
      [
  61084897200, #    utc_start 1936-09-14 03:00:00 (Mon)
  61104772800, #      utc_end 1937-05-02 04:00:00 (Sun)
  61084882800, #  local_start 1936-09-13 23:00:00 (Sun)
  61104758400, #    local_end 1937-05-02 00:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  61104772800, #    utc_start 1937-05-02 04:00:00 (Sun)
  61117556400, #      utc_end 1937-09-27 03:00:00 (Mon)
  61104762000, #  local_start 1937-05-02 01:00:00 (Sun)
  61117545600, #    local_end 1937-09-27 00:00:00 (Mon)
  -10800,
  1,
  'ADT',
      ],
      [
  61117556400, #    utc_start 1937-09-27 03:00:00 (Mon)
  61136222400, #      utc_end 1938-05-01 04:00:00 (Sun)
  61117542000, #  local_start 1937-09-26 23:00:00 (Sun)
  61136208000, #    local_end 1938-05-01 00:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  61136222400, #    utc_start 1938-05-01 04:00:00 (Sun)
  61149006000, #      utc_end 1938-09-26 03:00:00 (Mon)
  61136211600, #  local_start 1938-05-01 01:00:00 (Sun)
  61148995200, #    local_end 1938-09-26 00:00:00 (Mon)
  -10800,
  1,
  'ADT',
      ],
      [
  61149006000, #    utc_start 1938-09-26 03:00:00 (Mon)
  61170091200, #      utc_end 1939-05-28 04:00:00 (Sun)
  61148991600, #  local_start 1938-09-25 23:00:00 (Sun)
  61170076800, #    local_end 1939-05-28 00:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  61170091200, #    utc_start 1939-05-28 04:00:00 (Sun)
  61180455600, #      utc_end 1939-09-25 03:00:00 (Mon)
  61170080400, #  local_start 1939-05-28 01:00:00 (Sun)
  61180444800, #    local_end 1939-09-25 00:00:00 (Mon)
  -10800,
  1,
  'ADT',
      ],
      [
  61180455600, #    utc_start 1939-09-25 03:00:00 (Mon)
  61199726400, #      utc_end 1940-05-05 04:00:00 (Sun)
  61180441200, #  local_start 1939-09-24 23:00:00 (Sun)
  61199712000, #    local_end 1940-05-05 00:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  61199726400, #    utc_start 1940-05-05 04:00:00 (Sun)
  61212510000, #      utc_end 1940-09-30 03:00:00 (Mon)
  61199715600, #  local_start 1940-05-05 01:00:00 (Sun)
  61212499200, #    local_end 1940-09-30 00:00:00 (Mon)
  -10800,
  1,
  'ADT',
      ],
      [
  61212510000, #    utc_start 1940-09-30 03:00:00 (Mon)
  61231176000, #      utc_end 1941-05-04 04:00:00 (Sun)
  61212495600, #  local_start 1940-09-29 23:00:00 (Sun)
  61231161600, #    local_end 1941-05-04 00:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  61231176000, #    utc_start 1941-05-04 04:00:00 (Sun)
  61243959600, #      utc_end 1941-09-29 03:00:00 (Mon)
  61231165200, #  local_start 1941-05-04 01:00:00 (Sun)
  61243948800, #    local_end 1941-09-29 00:00:00 (Mon)
  -10800,
  1,
  'ADT',
      ],
      [
  61243959600, #    utc_start 1941-09-29 03:00:00 (Mon)
  61255461600, #      utc_end 1942-02-09 06:00:00 (Mon)
  61243945200, #  local_start 1941-09-28 23:00:00 (Sun)
  61255447200, #    local_end 1942-02-09 02:00:00 (Mon)
  -14400,
  0,
  'AST',
      ],
      [
  61255461600, #    utc_start 1942-02-09 06:00:00 (Mon)
  61366287600, #      utc_end 1945-08-14 23:00:00 (Tue)
  61255450800, #  local_start 1942-02-09 03:00:00 (Mon)
  61366276800, #    local_end 1945-08-14 20:00:00 (Tue)
  -10800,
  1,
  'AWT',
      ],
      [
  61366287600, #    utc_start 1945-08-14 23:00:00 (Tue)
  61370283600, #      utc_end 1945-09-30 05:00:00 (Sun)
  61366276800, #  local_start 1945-08-14 20:00:00 (Tue)
  61370272800, #    local_end 1945-09-30 02:00:00 (Sun)
  -10800,
  1,
  'APT',
      ],
      [
  61370283600, #    utc_start 1945-09-30 05:00:00 (Sun)
  61378315200, #      utc_end 1946-01-01 04:00:00 (Tue)
  61370269200, #  local_start 1945-09-30 01:00:00 (Sun)
  61378300800, #    local_end 1946-01-01 00:00:00 (Tue)
  -14400,
  0,
  'AST',
      ],
      [
  61378315200, #    utc_start 1946-01-01 04:00:00 (Tue)
  61388431200, #      utc_end 1946-04-28 06:00:00 (Sun)
  61378300800, #  local_start 1946-01-01 00:00:00 (Tue)
  61388416800, #    local_end 1946-04-28 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  61388431200, #    utc_start 1946-04-28 06:00:00 (Sun)
  61401733200, #      utc_end 1946-09-29 05:00:00 (Sun)
  61388420400, #  local_start 1946-04-28 03:00:00 (Sun)
  61401722400, #    local_end 1946-09-29 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  61401733200, #    utc_start 1946-09-29 05:00:00 (Sun)
  61419880800, #      utc_end 1947-04-27 06:00:00 (Sun)
  61401718800, #  local_start 1946-09-29 01:00:00 (Sun)
  61419866400, #    local_end 1947-04-27 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  61419880800, #    utc_start 1947-04-27 06:00:00 (Sun)
  61433182800, #      utc_end 1947-09-28 05:00:00 (Sun)
  61419870000, #  local_start 1947-04-27 03:00:00 (Sun)
  61433172000, #    local_end 1947-09-28 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  61433182800, #    utc_start 1947-09-28 05:00:00 (Sun)
  61451330400, #      utc_end 1948-04-25 06:00:00 (Sun)
  61433168400, #  local_start 1947-09-28 01:00:00 (Sun)
  61451316000, #    local_end 1948-04-25 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  61451330400, #    utc_start 1948-04-25 06:00:00 (Sun)
  61464632400, #      utc_end 1948-09-26 05:00:00 (Sun)
  61451319600, #  local_start 1948-04-25 03:00:00 (Sun)
  61464621600, #    local_end 1948-09-26 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  61464632400, #    utc_start 1948-09-26 05:00:00 (Sun)
  61482780000, #      utc_end 1949-04-24 06:00:00 (Sun)
  61464618000, #  local_start 1948-09-26 01:00:00 (Sun)
  61482765600, #    local_end 1949-04-24 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  61482780000, #    utc_start 1949-04-24 06:00:00 (Sun)
  61496082000, #      utc_end 1949-09-25 05:00:00 (Sun)
  61482769200, #  local_start 1949-04-24 03:00:00 (Sun)
  61496071200, #    local_end 1949-09-25 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  61496082000, #    utc_start 1949-09-25 05:00:00 (Sun)
  61546284000, #      utc_end 1951-04-29 06:00:00 (Sun)
  61496067600, #  local_start 1949-09-25 01:00:00 (Sun)
  61546269600, #    local_end 1951-04-29 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  61546284000, #    utc_start 1951-04-29 06:00:00 (Sun)
  61559586000, #      utc_end 1951-09-30 05:00:00 (Sun)
  61546273200, #  local_start 1951-04-29 03:00:00 (Sun)
  61559575200, #    local_end 1951-09-30 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  61559586000, #    utc_start 1951-09-30 05:00:00 (Sun)
  61577733600, #      utc_end 1952-04-27 06:00:00 (Sun)
  61559571600, #  local_start 1951-09-30 01:00:00 (Sun)
  61577719200, #    local_end 1952-04-27 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  61577733600, #    utc_start 1952-04-27 06:00:00 (Sun)
  61591035600, #      utc_end 1952-09-28 05:00:00 (Sun)
  61577722800, #  local_start 1952-04-27 03:00:00 (Sun)
  61591024800, #    local_end 1952-09-28 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  61591035600, #    utc_start 1952-09-28 05:00:00 (Sun)
  61609183200, #      utc_end 1953-04-26 06:00:00 (Sun)
  61591021200, #  local_start 1952-09-28 01:00:00 (Sun)
  61609168800, #    local_end 1953-04-26 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  61609183200, #    utc_start 1953-04-26 06:00:00 (Sun)
  61622485200, #      utc_end 1953-09-27 05:00:00 (Sun)
  61609172400, #  local_start 1953-04-26 03:00:00 (Sun)
  61622474400, #    local_end 1953-09-27 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  61622485200, #    utc_start 1953-09-27 05:00:00 (Sun)
  61640632800, #      utc_end 1954-04-25 06:00:00 (Sun)
  61622470800, #  local_start 1953-09-27 01:00:00 (Sun)
  61640618400, #    local_end 1954-04-25 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  61640632800, #    utc_start 1954-04-25 06:00:00 (Sun)
  61653934800, #      utc_end 1954-09-26 05:00:00 (Sun)
  61640622000, #  local_start 1954-04-25 03:00:00 (Sun)
  61653924000, #    local_end 1954-09-26 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  61653934800, #    utc_start 1954-09-26 05:00:00 (Sun)
  61704136800, #      utc_end 1956-04-29 06:00:00 (Sun)
  61653920400, #  local_start 1954-09-26 01:00:00 (Sun)
  61704122400, #    local_end 1956-04-29 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  61704136800, #    utc_start 1956-04-29 06:00:00 (Sun)
  61717438800, #      utc_end 1956-09-30 05:00:00 (Sun)
  61704126000, #  local_start 1956-04-29 03:00:00 (Sun)
  61717428000, #    local_end 1956-09-30 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  61717438800, #    utc_start 1956-09-30 05:00:00 (Sun)
  61735586400, #      utc_end 1957-04-28 06:00:00 (Sun)
  61717424400, #  local_start 1956-09-30 01:00:00 (Sun)
  61735572000, #    local_end 1957-04-28 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  61735586400, #    utc_start 1957-04-28 06:00:00 (Sun)
  61748888400, #      utc_end 1957-09-29 05:00:00 (Sun)
  61735575600, #  local_start 1957-04-28 03:00:00 (Sun)
  61748877600, #    local_end 1957-09-29 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  61748888400, #    utc_start 1957-09-29 05:00:00 (Sun)
  61767036000, #      utc_end 1958-04-27 06:00:00 (Sun)
  61748874000, #  local_start 1957-09-29 01:00:00 (Sun)
  61767021600, #    local_end 1958-04-27 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  61767036000, #    utc_start 1958-04-27 06:00:00 (Sun)
  61780338000, #      utc_end 1958-09-28 05:00:00 (Sun)
  61767025200, #  local_start 1958-04-27 03:00:00 (Sun)
  61780327200, #    local_end 1958-09-28 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  61780338000, #    utc_start 1958-09-28 05:00:00 (Sun)
  61798485600, #      utc_end 1959-04-26 06:00:00 (Sun)
  61780323600, #  local_start 1958-09-28 01:00:00 (Sun)
  61798471200, #    local_end 1959-04-26 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  61798485600, #    utc_start 1959-04-26 06:00:00 (Sun)
  61811787600, #      utc_end 1959-09-27 05:00:00 (Sun)
  61798474800, #  local_start 1959-04-26 03:00:00 (Sun)
  61811776800, #    local_end 1959-09-27 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  61811787600, #    utc_start 1959-09-27 05:00:00 (Sun)
  61893439200, #      utc_end 1962-04-29 06:00:00 (Sun)
  61811773200, #  local_start 1959-09-27 01:00:00 (Sun)
  61893424800, #    local_end 1962-04-29 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  61893439200, #    utc_start 1962-04-29 06:00:00 (Sun)
  61909160400, #      utc_end 1962-10-28 05:00:00 (Sun)
  61893428400, #  local_start 1962-04-29 03:00:00 (Sun)
  61909149600, #    local_end 1962-10-28 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  61909160400, #    utc_start 1962-10-28 05:00:00 (Sun)
  61924888800, #      utc_end 1963-04-28 06:00:00 (Sun)
  61909146000, #  local_start 1962-10-28 01:00:00 (Sun)
  61924874400, #    local_end 1963-04-28 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  61924888800, #    utc_start 1963-04-28 06:00:00 (Sun)
  61940610000, #      utc_end 1963-10-27 05:00:00 (Sun)
  61924878000, #  local_start 1963-04-28 03:00:00 (Sun)
  61940599200, #    local_end 1963-10-27 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  61940610000, #    utc_start 1963-10-27 05:00:00 (Sun)
  61956338400, #      utc_end 1964-04-26 06:00:00 (Sun)
  61940595600, #  local_start 1963-10-27 01:00:00 (Sun)
  61956324000, #    local_end 1964-04-26 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  61956338400, #    utc_start 1964-04-26 06:00:00 (Sun)
  61972059600, #      utc_end 1964-10-25 05:00:00 (Sun)
  61956327600, #  local_start 1964-04-26 03:00:00 (Sun)
  61972048800, #    local_end 1964-10-25 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  61972059600, #    utc_start 1964-10-25 05:00:00 (Sun)
  61987788000, #      utc_end 1965-04-25 06:00:00 (Sun)
  61972045200, #  local_start 1964-10-25 01:00:00 (Sun)
  61987773600, #    local_end 1965-04-25 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  61987788000, #    utc_start 1965-04-25 06:00:00 (Sun)
  62004114000, #      utc_end 1965-10-31 05:00:00 (Sun)
  61987777200, #  local_start 1965-04-25 03:00:00 (Sun)
  62004103200, #    local_end 1965-10-31 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62004114000, #    utc_start 1965-10-31 05:00:00 (Sun)
  62019237600, #      utc_end 1966-04-24 06:00:00 (Sun)
  62004099600, #  local_start 1965-10-31 01:00:00 (Sun)
  62019223200, #    local_end 1966-04-24 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62019237600, #    utc_start 1966-04-24 06:00:00 (Sun)
  62035563600, #      utc_end 1966-10-30 05:00:00 (Sun)
  62019226800, #  local_start 1966-04-24 03:00:00 (Sun)
  62035552800, #    local_end 1966-10-30 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62035563600, #    utc_start 1966-10-30 05:00:00 (Sun)
  62051292000, #      utc_end 1967-04-30 06:00:00 (Sun)
  62035549200, #  local_start 1966-10-30 01:00:00 (Sun)
  62051277600, #    local_end 1967-04-30 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62051292000, #    utc_start 1967-04-30 06:00:00 (Sun)
  62067013200, #      utc_end 1967-10-29 05:00:00 (Sun)
  62051281200, #  local_start 1967-04-30 03:00:00 (Sun)
  62067002400, #    local_end 1967-10-29 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62067013200, #    utc_start 1967-10-29 05:00:00 (Sun)
  62082741600, #      utc_end 1968-04-28 06:00:00 (Sun)
  62066998800, #  local_start 1967-10-29 01:00:00 (Sun)
  62082727200, #    local_end 1968-04-28 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62082741600, #    utc_start 1968-04-28 06:00:00 (Sun)
  62098462800, #      utc_end 1968-10-27 05:00:00 (Sun)
  62082730800, #  local_start 1968-04-28 03:00:00 (Sun)
  62098452000, #    local_end 1968-10-27 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62098462800, #    utc_start 1968-10-27 05:00:00 (Sun)
  62114191200, #      utc_end 1969-04-27 06:00:00 (Sun)
  62098448400, #  local_start 1968-10-27 01:00:00 (Sun)
  62114176800, #    local_end 1969-04-27 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62114191200, #    utc_start 1969-04-27 06:00:00 (Sun)
  62129912400, #      utc_end 1969-10-26 05:00:00 (Sun)
  62114180400, #  local_start 1969-04-27 03:00:00 (Sun)
  62129901600, #    local_end 1969-10-26 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62129912400, #    utc_start 1969-10-26 05:00:00 (Sun)
  62145640800, #      utc_end 1970-04-26 06:00:00 (Sun)
  62129898000, #  local_start 1969-10-26 01:00:00 (Sun)
  62145626400, #    local_end 1970-04-26 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62145640800, #    utc_start 1970-04-26 06:00:00 (Sun)
  62161362000, #      utc_end 1970-10-25 05:00:00 (Sun)
  62145630000, #  local_start 1970-04-26 03:00:00 (Sun)
  62161351200, #    local_end 1970-10-25 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62161362000, #    utc_start 1970-10-25 05:00:00 (Sun)
  62177090400, #      utc_end 1971-04-25 06:00:00 (Sun)
  62161347600, #  local_start 1970-10-25 01:00:00 (Sun)
  62177076000, #    local_end 1971-04-25 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62177090400, #    utc_start 1971-04-25 06:00:00 (Sun)
  62193416400, #      utc_end 1971-10-31 05:00:00 (Sun)
  62177079600, #  local_start 1971-04-25 03:00:00 (Sun)
  62193405600, #    local_end 1971-10-31 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62193416400, #    utc_start 1971-10-31 05:00:00 (Sun)
  62209144800, #      utc_end 1972-04-30 06:00:00 (Sun)
  62193402000, #  local_start 1971-10-31 01:00:00 (Sun)
  62209130400, #    local_end 1972-04-30 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62209144800, #    utc_start 1972-04-30 06:00:00 (Sun)
  62224866000, #      utc_end 1972-10-29 05:00:00 (Sun)
  62209134000, #  local_start 1972-04-30 03:00:00 (Sun)
  62224855200, #    local_end 1972-10-29 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62224866000, #    utc_start 1972-10-29 05:00:00 (Sun)
  62240594400, #      utc_end 1973-04-29 06:00:00 (Sun)
  62224851600, #  local_start 1972-10-29 01:00:00 (Sun)
  62240580000, #    local_end 1973-04-29 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62240594400, #    utc_start 1973-04-29 06:00:00 (Sun)
  62256315600, #      utc_end 1973-10-28 05:00:00 (Sun)
  62240583600, #  local_start 1973-04-29 03:00:00 (Sun)
  62256304800, #    local_end 1973-10-28 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62256315600, #    utc_start 1973-10-28 05:00:00 (Sun)
  62261928000, #      utc_end 1974-01-01 04:00:00 (Tue)
  62256301200, #  local_start 1973-10-28 01:00:00 (Sun)
  62261913600, #    local_end 1974-01-01 00:00:00 (Tue)
  -14400,
  0,
  'AST',
      ],
      [
  62261928000, #    utc_start 1974-01-01 04:00:00 (Tue)
  62272044000, #      utc_end 1974-04-28 06:00:00 (Sun)
  62261913600, #  local_start 1974-01-01 00:00:00 (Tue)
  62272029600, #    local_end 1974-04-28 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62272044000, #    utc_start 1974-04-28 06:00:00 (Sun)
  62287765200, #      utc_end 1974-10-27 05:00:00 (Sun)
  62272033200, #  local_start 1974-04-28 03:00:00 (Sun)
  62287754400, #    local_end 1974-10-27 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62287765200, #    utc_start 1974-10-27 05:00:00 (Sun)
  62303493600, #      utc_end 1975-04-27 06:00:00 (Sun)
  62287750800, #  local_start 1974-10-27 01:00:00 (Sun)
  62303479200, #    local_end 1975-04-27 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62303493600, #    utc_start 1975-04-27 06:00:00 (Sun)
  62319214800, #      utc_end 1975-10-26 05:00:00 (Sun)
  62303482800, #  local_start 1975-04-27 03:00:00 (Sun)
  62319204000, #    local_end 1975-10-26 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62319214800, #    utc_start 1975-10-26 05:00:00 (Sun)
  62334943200, #      utc_end 1976-04-25 06:00:00 (Sun)
  62319200400, #  local_start 1975-10-26 01:00:00 (Sun)
  62334928800, #    local_end 1976-04-25 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62334943200, #    utc_start 1976-04-25 06:00:00 (Sun)
  62351269200, #      utc_end 1976-10-31 05:00:00 (Sun)
  62334932400, #  local_start 1976-04-25 03:00:00 (Sun)
  62351258400, #    local_end 1976-10-31 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62351269200, #    utc_start 1976-10-31 05:00:00 (Sun)
  62366392800, #      utc_end 1977-04-24 06:00:00 (Sun)
  62351254800, #  local_start 1976-10-31 01:00:00 (Sun)
  62366378400, #    local_end 1977-04-24 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62366392800, #    utc_start 1977-04-24 06:00:00 (Sun)
  62382718800, #      utc_end 1977-10-30 05:00:00 (Sun)
  62366382000, #  local_start 1977-04-24 03:00:00 (Sun)
  62382708000, #    local_end 1977-10-30 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62382718800, #    utc_start 1977-10-30 05:00:00 (Sun)
  62398447200, #      utc_end 1978-04-30 06:00:00 (Sun)
  62382704400, #  local_start 1977-10-30 01:00:00 (Sun)
  62398432800, #    local_end 1978-04-30 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62398447200, #    utc_start 1978-04-30 06:00:00 (Sun)
  62414168400, #      utc_end 1978-10-29 05:00:00 (Sun)
  62398436400, #  local_start 1978-04-30 03:00:00 (Sun)
  62414157600, #    local_end 1978-10-29 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62414168400, #    utc_start 1978-10-29 05:00:00 (Sun)
  62429896800, #      utc_end 1979-04-29 06:00:00 (Sun)
  62414154000, #  local_start 1978-10-29 01:00:00 (Sun)
  62429882400, #    local_end 1979-04-29 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62429896800, #    utc_start 1979-04-29 06:00:00 (Sun)
  62445618000, #      utc_end 1979-10-28 05:00:00 (Sun)
  62429886000, #  local_start 1979-04-29 03:00:00 (Sun)
  62445607200, #    local_end 1979-10-28 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62445618000, #    utc_start 1979-10-28 05:00:00 (Sun)
  62461346400, #      utc_end 1980-04-27 06:00:00 (Sun)
  62445603600, #  local_start 1979-10-28 01:00:00 (Sun)
  62461332000, #    local_end 1980-04-27 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62461346400, #    utc_start 1980-04-27 06:00:00 (Sun)
  62477067600, #      utc_end 1980-10-26 05:00:00 (Sun)
  62461335600, #  local_start 1980-04-27 03:00:00 (Sun)
  62477056800, #    local_end 1980-10-26 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62477067600, #    utc_start 1980-10-26 05:00:00 (Sun)
  62492796000, #      utc_end 1981-04-26 06:00:00 (Sun)
  62477053200, #  local_start 1980-10-26 01:00:00 (Sun)
  62492781600, #    local_end 1981-04-26 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62492796000, #    utc_start 1981-04-26 06:00:00 (Sun)
  62508517200, #      utc_end 1981-10-25 05:00:00 (Sun)
  62492785200, #  local_start 1981-04-26 03:00:00 (Sun)
  62508506400, #    local_end 1981-10-25 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62508517200, #    utc_start 1981-10-25 05:00:00 (Sun)
  62524245600, #      utc_end 1982-04-25 06:00:00 (Sun)
  62508502800, #  local_start 1981-10-25 01:00:00 (Sun)
  62524231200, #    local_end 1982-04-25 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62524245600, #    utc_start 1982-04-25 06:00:00 (Sun)
  62540571600, #      utc_end 1982-10-31 05:00:00 (Sun)
  62524234800, #  local_start 1982-04-25 03:00:00 (Sun)
  62540560800, #    local_end 1982-10-31 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62540571600, #    utc_start 1982-10-31 05:00:00 (Sun)
  62555695200, #      utc_end 1983-04-24 06:00:00 (Sun)
  62540557200, #  local_start 1982-10-31 01:00:00 (Sun)
  62555680800, #    local_end 1983-04-24 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62555695200, #    utc_start 1983-04-24 06:00:00 (Sun)
  62572021200, #      utc_end 1983-10-30 05:00:00 (Sun)
  62555684400, #  local_start 1983-04-24 03:00:00 (Sun)
  62572010400, #    local_end 1983-10-30 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62572021200, #    utc_start 1983-10-30 05:00:00 (Sun)
  62587749600, #      utc_end 1984-04-29 06:00:00 (Sun)
  62572006800, #  local_start 1983-10-30 01:00:00 (Sun)
  62587735200, #    local_end 1984-04-29 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62587749600, #    utc_start 1984-04-29 06:00:00 (Sun)
  62603470800, #      utc_end 1984-10-28 05:00:00 (Sun)
  62587738800, #  local_start 1984-04-29 03:00:00 (Sun)
  62603460000, #    local_end 1984-10-28 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62603470800, #    utc_start 1984-10-28 05:00:00 (Sun)
  62619199200, #      utc_end 1985-04-28 06:00:00 (Sun)
  62603456400, #  local_start 1984-10-28 01:00:00 (Sun)
  62619184800, #    local_end 1985-04-28 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62619199200, #    utc_start 1985-04-28 06:00:00 (Sun)
  62634920400, #      utc_end 1985-10-27 05:00:00 (Sun)
  62619188400, #  local_start 1985-04-28 03:00:00 (Sun)
  62634909600, #    local_end 1985-10-27 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62634920400, #    utc_start 1985-10-27 05:00:00 (Sun)
  62650648800, #      utc_end 1986-04-27 06:00:00 (Sun)
  62634906000, #  local_start 1985-10-27 01:00:00 (Sun)
  62650634400, #    local_end 1986-04-27 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62650648800, #    utc_start 1986-04-27 06:00:00 (Sun)
  62666370000, #      utc_end 1986-10-26 05:00:00 (Sun)
  62650638000, #  local_start 1986-04-27 03:00:00 (Sun)
  62666359200, #    local_end 1986-10-26 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62666370000, #    utc_start 1986-10-26 05:00:00 (Sun)
  62680284000, #      utc_end 1987-04-05 06:00:00 (Sun)
  62666355600, #  local_start 1986-10-26 01:00:00 (Sun)
  62680269600, #    local_end 1987-04-05 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62680284000, #    utc_start 1987-04-05 06:00:00 (Sun)
  62697819600, #      utc_end 1987-10-25 05:00:00 (Sun)
  62680273200, #  local_start 1987-04-05 03:00:00 (Sun)
  62697808800, #    local_end 1987-10-25 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62697819600, #    utc_start 1987-10-25 05:00:00 (Sun)
  62711733600, #      utc_end 1988-04-03 06:00:00 (Sun)
  62697805200, #  local_start 1987-10-25 01:00:00 (Sun)
  62711719200, #    local_end 1988-04-03 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62711733600, #    utc_start 1988-04-03 06:00:00 (Sun)
  62729874000, #      utc_end 1988-10-30 05:00:00 (Sun)
  62711722800, #  local_start 1988-04-03 03:00:00 (Sun)
  62729863200, #    local_end 1988-10-30 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62729874000, #    utc_start 1988-10-30 05:00:00 (Sun)
  62743183200, #      utc_end 1989-04-02 06:00:00 (Sun)
  62729859600, #  local_start 1988-10-30 01:00:00 (Sun)
  62743168800, #    local_end 1989-04-02 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62743183200, #    utc_start 1989-04-02 06:00:00 (Sun)
  62761323600, #      utc_end 1989-10-29 05:00:00 (Sun)
  62743172400, #  local_start 1989-04-02 03:00:00 (Sun)
  62761312800, #    local_end 1989-10-29 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62761323600, #    utc_start 1989-10-29 05:00:00 (Sun)
  62774632800, #      utc_end 1990-04-01 06:00:00 (Sun)
  62761309200, #  local_start 1989-10-29 01:00:00 (Sun)
  62774618400, #    local_end 1990-04-01 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62774632800, #    utc_start 1990-04-01 06:00:00 (Sun)
  62792773200, #      utc_end 1990-10-28 05:00:00 (Sun)
  62774622000, #  local_start 1990-04-01 03:00:00 (Sun)
  62792762400, #    local_end 1990-10-28 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62792773200, #    utc_start 1990-10-28 05:00:00 (Sun)
  62806687200, #      utc_end 1991-04-07 06:00:00 (Sun)
  62792758800, #  local_start 1990-10-28 01:00:00 (Sun)
  62806672800, #    local_end 1991-04-07 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62806687200, #    utc_start 1991-04-07 06:00:00 (Sun)
  62824222800, #      utc_end 1991-10-27 05:00:00 (Sun)
  62806676400, #  local_start 1991-04-07 03:00:00 (Sun)
  62824212000, #    local_end 1991-10-27 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62824222800, #    utc_start 1991-10-27 05:00:00 (Sun)
  62838136800, #      utc_end 1992-04-05 06:00:00 (Sun)
  62824208400, #  local_start 1991-10-27 01:00:00 (Sun)
  62838122400, #    local_end 1992-04-05 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62838136800, #    utc_start 1992-04-05 06:00:00 (Sun)
  62855672400, #      utc_end 1992-10-25 05:00:00 (Sun)
  62838126000, #  local_start 1992-04-05 03:00:00 (Sun)
  62855661600, #    local_end 1992-10-25 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62855672400, #    utc_start 1992-10-25 05:00:00 (Sun)
  62869586400, #      utc_end 1993-04-04 06:00:00 (Sun)
  62855658000, #  local_start 1992-10-25 01:00:00 (Sun)
  62869572000, #    local_end 1993-04-04 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62869586400, #    utc_start 1993-04-04 06:00:00 (Sun)
  62887726800, #      utc_end 1993-10-31 05:00:00 (Sun)
  62869575600, #  local_start 1993-04-04 03:00:00 (Sun)
  62887716000, #    local_end 1993-10-31 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62887726800, #    utc_start 1993-10-31 05:00:00 (Sun)
  62901036000, #      utc_end 1994-04-03 06:00:00 (Sun)
  62887712400, #  local_start 1993-10-31 01:00:00 (Sun)
  62901021600, #    local_end 1994-04-03 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62901036000, #    utc_start 1994-04-03 06:00:00 (Sun)
  62919176400, #      utc_end 1994-10-30 05:00:00 (Sun)
  62901025200, #  local_start 1994-04-03 03:00:00 (Sun)
  62919165600, #    local_end 1994-10-30 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62919176400, #    utc_start 1994-10-30 05:00:00 (Sun)
  62932485600, #      utc_end 1995-04-02 06:00:00 (Sun)
  62919162000, #  local_start 1994-10-30 01:00:00 (Sun)
  62932471200, #    local_end 1995-04-02 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62932485600, #    utc_start 1995-04-02 06:00:00 (Sun)
  62950626000, #      utc_end 1995-10-29 05:00:00 (Sun)
  62932474800, #  local_start 1995-04-02 03:00:00 (Sun)
  62950615200, #    local_end 1995-10-29 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62950626000, #    utc_start 1995-10-29 05:00:00 (Sun)
  62964540000, #      utc_end 1996-04-07 06:00:00 (Sun)
  62950611600, #  local_start 1995-10-29 01:00:00 (Sun)
  62964525600, #    local_end 1996-04-07 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62964540000, #    utc_start 1996-04-07 06:00:00 (Sun)
  62982075600, #      utc_end 1996-10-27 05:00:00 (Sun)
  62964529200, #  local_start 1996-04-07 03:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62982075600, #    utc_start 1996-10-27 05:00:00 (Sun)
  62995989600, #      utc_end 1997-04-06 06:00:00 (Sun)
  62982061200, #  local_start 1996-10-27 01:00:00 (Sun)
  62995975200, #    local_end 1997-04-06 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62995989600, #    utc_start 1997-04-06 06:00:00 (Sun)
  63013525200, #      utc_end 1997-10-26 05:00:00 (Sun)
  62995978800, #  local_start 1997-04-06 03:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63013525200, #    utc_start 1997-10-26 05:00:00 (Sun)
  63027439200, #      utc_end 1998-04-05 06:00:00 (Sun)
  63013510800, #  local_start 1997-10-26 01:00:00 (Sun)
  63027424800, #    local_end 1998-04-05 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63027439200, #    utc_start 1998-04-05 06:00:00 (Sun)
  63044974800, #      utc_end 1998-10-25 05:00:00 (Sun)
  63027428400, #  local_start 1998-04-05 03:00:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63044974800, #    utc_start 1998-10-25 05:00:00 (Sun)
  63058888800, #      utc_end 1999-04-04 06:00:00 (Sun)
  63044960400, #  local_start 1998-10-25 01:00:00 (Sun)
  63058874400, #    local_end 1999-04-04 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63058888800, #    utc_start 1999-04-04 06:00:00 (Sun)
  63077029200, #      utc_end 1999-10-31 05:00:00 (Sun)
  63058878000, #  local_start 1999-04-04 03:00:00 (Sun)
  63077018400, #    local_end 1999-10-31 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63077029200, #    utc_start 1999-10-31 05:00:00 (Sun)
  63090338400, #      utc_end 2000-04-02 06:00:00 (Sun)
  63077014800, #  local_start 1999-10-31 01:00:00 (Sun)
  63090324000, #    local_end 2000-04-02 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63090338400, #    utc_start 2000-04-02 06:00:00 (Sun)
  63108478800, #      utc_end 2000-10-29 05:00:00 (Sun)
  63090327600, #  local_start 2000-04-02 03:00:00 (Sun)
  63108468000, #    local_end 2000-10-29 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63108478800, #    utc_start 2000-10-29 05:00:00 (Sun)
  63121788000, #      utc_end 2001-04-01 06:00:00 (Sun)
  63108464400, #  local_start 2000-10-29 01:00:00 (Sun)
  63121773600, #    local_end 2001-04-01 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63121788000, #    utc_start 2001-04-01 06:00:00 (Sun)
  63139928400, #      utc_end 2001-10-28 05:00:00 (Sun)
  63121777200, #  local_start 2001-04-01 03:00:00 (Sun)
  63139917600, #    local_end 2001-10-28 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63139928400, #    utc_start 2001-10-28 05:00:00 (Sun)
  63153842400, #      utc_end 2002-04-07 06:00:00 (Sun)
  63139914000, #  local_start 2001-10-28 01:00:00 (Sun)
  63153828000, #    local_end 2002-04-07 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63153842400, #    utc_start 2002-04-07 06:00:00 (Sun)
  63171378000, #      utc_end 2002-10-27 05:00:00 (Sun)
  63153831600, #  local_start 2002-04-07 03:00:00 (Sun)
  63171367200, #    local_end 2002-10-27 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63171378000, #    utc_start 2002-10-27 05:00:00 (Sun)
  63185292000, #      utc_end 2003-04-06 06:00:00 (Sun)
  63171363600, #  local_start 2002-10-27 01:00:00 (Sun)
  63185277600, #    local_end 2003-04-06 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63185292000, #    utc_start 2003-04-06 06:00:00 (Sun)
  63202827600, #      utc_end 2003-10-26 05:00:00 (Sun)
  63185281200, #  local_start 2003-04-06 03:00:00 (Sun)
  63202816800, #    local_end 2003-10-26 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63202827600, #    utc_start 2003-10-26 05:00:00 (Sun)
  63216741600, #      utc_end 2004-04-04 06:00:00 (Sun)
  63202813200, #  local_start 2003-10-26 01:00:00 (Sun)
  63216727200, #    local_end 2004-04-04 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63216741600, #    utc_start 2004-04-04 06:00:00 (Sun)
  63234882000, #      utc_end 2004-10-31 05:00:00 (Sun)
  63216730800, #  local_start 2004-04-04 03:00:00 (Sun)
  63234871200, #    local_end 2004-10-31 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63234882000, #    utc_start 2004-10-31 05:00:00 (Sun)
  63248191200, #      utc_end 2005-04-03 06:00:00 (Sun)
  63234867600, #  local_start 2004-10-31 01:00:00 (Sun)
  63248176800, #    local_end 2005-04-03 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63248191200, #    utc_start 2005-04-03 06:00:00 (Sun)
  63266331600, #      utc_end 2005-10-30 05:00:00 (Sun)
  63248180400, #  local_start 2005-04-03 03:00:00 (Sun)
  63266320800, #    local_end 2005-10-30 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63266331600, #    utc_start 2005-10-30 05:00:00 (Sun)
  63279640800, #      utc_end 2006-04-02 06:00:00 (Sun)
  63266317200, #  local_start 2005-10-30 01:00:00 (Sun)
  63279626400, #    local_end 2006-04-02 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63279640800, #    utc_start 2006-04-02 06:00:00 (Sun)
  63297781200, #      utc_end 2006-10-29 05:00:00 (Sun)
  63279630000, #  local_start 2006-04-02 03:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63297781200, #    utc_start 2006-10-29 05:00:00 (Sun)
  63309276000, #      utc_end 2007-03-11 06:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63309261600, #    local_end 2007-03-11 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63309276000, #    utc_start 2007-03-11 06:00:00 (Sun)
  63329835600, #      utc_end 2007-11-04 05:00:00 (Sun)
  63309265200, #  local_start 2007-03-11 03:00:00 (Sun)
  63329824800, #    local_end 2007-11-04 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63329835600, #    utc_start 2007-11-04 05:00:00 (Sun)
  63340725600, #      utc_end 2008-03-09 06:00:00 (Sun)
  63329821200, #  local_start 2007-11-04 01:00:00 (Sun)
  63340711200, #    local_end 2008-03-09 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63340725600, #    utc_start 2008-03-09 06:00:00 (Sun)
  63361285200, #      utc_end 2008-11-02 05:00:00 (Sun)
  63340714800, #  local_start 2008-03-09 03:00:00 (Sun)
  63361274400, #    local_end 2008-11-02 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63361285200, #    utc_start 2008-11-02 05:00:00 (Sun)
  63372175200, #      utc_end 2009-03-08 06:00:00 (Sun)
  63361270800, #  local_start 2008-11-02 01:00:00 (Sun)
  63372160800, #    local_end 2009-03-08 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63372175200, #    utc_start 2009-03-08 06:00:00 (Sun)
  63392734800, #      utc_end 2009-11-01 05:00:00 (Sun)
  63372164400, #  local_start 2009-03-08 03:00:00 (Sun)
  63392724000, #    local_end 2009-11-01 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63392734800, #    utc_start 2009-11-01 05:00:00 (Sun)
  63404229600, #      utc_end 2010-03-14 06:00:00 (Sun)
  63392720400, #  local_start 2009-11-01 01:00:00 (Sun)
  63404215200, #    local_end 2010-03-14 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63404229600, #    utc_start 2010-03-14 06:00:00 (Sun)
  63424789200, #      utc_end 2010-11-07 05:00:00 (Sun)
  63404218800, #  local_start 2010-03-14 03:00:00 (Sun)
  63424778400, #    local_end 2010-11-07 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63424789200, #    utc_start 2010-11-07 05:00:00 (Sun)
  63435679200, #      utc_end 2011-03-13 06:00:00 (Sun)
  63424774800, #  local_start 2010-11-07 01:00:00 (Sun)
  63435664800, #    local_end 2011-03-13 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63435679200, #    utc_start 2011-03-13 06:00:00 (Sun)
  63456238800, #      utc_end 2011-11-06 05:00:00 (Sun)
  63435668400, #  local_start 2011-03-13 03:00:00 (Sun)
  63456228000, #    local_end 2011-11-06 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63456238800, #    utc_start 2011-11-06 05:00:00 (Sun)
  63467128800, #      utc_end 2012-03-11 06:00:00 (Sun)
  63456224400, #  local_start 2011-11-06 01:00:00 (Sun)
  63467114400, #    local_end 2012-03-11 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63467128800, #    utc_start 2012-03-11 06:00:00 (Sun)
  63487688400, #      utc_end 2012-11-04 05:00:00 (Sun)
  63467118000, #  local_start 2012-03-11 03:00:00 (Sun)
  63487677600, #    local_end 2012-11-04 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63487688400, #    utc_start 2012-11-04 05:00:00 (Sun)
  63498578400, #      utc_end 2013-03-10 06:00:00 (Sun)
  63487674000, #  local_start 2012-11-04 01:00:00 (Sun)
  63498564000, #    local_end 2013-03-10 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63498578400, #    utc_start 2013-03-10 06:00:00 (Sun)
  63519138000, #      utc_end 2013-11-03 05:00:00 (Sun)
  63498567600, #  local_start 2013-03-10 03:00:00 (Sun)
  63519127200, #    local_end 2013-11-03 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63519138000, #    utc_start 2013-11-03 05:00:00 (Sun)
  63530028000, #      utc_end 2014-03-09 06:00:00 (Sun)
  63519123600, #  local_start 2013-11-03 01:00:00 (Sun)
  63530013600, #    local_end 2014-03-09 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63530028000, #    utc_start 2014-03-09 06:00:00 (Sun)
  63550587600, #      utc_end 2014-11-02 05:00:00 (Sun)
  63530017200, #  local_start 2014-03-09 03:00:00 (Sun)
  63550576800, #    local_end 2014-11-02 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63550587600, #    utc_start 2014-11-02 05:00:00 (Sun)
  63561477600, #      utc_end 2015-03-08 06:00:00 (Sun)
  63550573200, #  local_start 2014-11-02 01:00:00 (Sun)
  63561463200, #    local_end 2015-03-08 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63561477600, #    utc_start 2015-03-08 06:00:00 (Sun)
  63582037200, #      utc_end 2015-11-01 05:00:00 (Sun)
  63561466800, #  local_start 2015-03-08 03:00:00 (Sun)
  63582026400, #    local_end 2015-11-01 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63582037200, #    utc_start 2015-11-01 05:00:00 (Sun)
  63593532000, #      utc_end 2016-03-13 06:00:00 (Sun)
  63582022800, #  local_start 2015-11-01 01:00:00 (Sun)
  63593517600, #    local_end 2016-03-13 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63593532000, #    utc_start 2016-03-13 06:00:00 (Sun)
  63614091600, #      utc_end 2016-11-06 05:00:00 (Sun)
  63593521200, #  local_start 2016-03-13 03:00:00 (Sun)
  63614080800, #    local_end 2016-11-06 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63614091600, #    utc_start 2016-11-06 05:00:00 (Sun)
  63624981600, #      utc_end 2017-03-12 06:00:00 (Sun)
  63614077200, #  local_start 2016-11-06 01:00:00 (Sun)
  63624967200, #    local_end 2017-03-12 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63624981600, #    utc_start 2017-03-12 06:00:00 (Sun)
  63645541200, #      utc_end 2017-11-05 05:00:00 (Sun)
  63624970800, #  local_start 2017-03-12 03:00:00 (Sun)
  63645530400, #    local_end 2017-11-05 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63645541200, #    utc_start 2017-11-05 05:00:00 (Sun)
  63656431200, #      utc_end 2018-03-11 06:00:00 (Sun)
  63645526800, #  local_start 2017-11-05 01:00:00 (Sun)
  63656416800, #    local_end 2018-03-11 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63656431200, #    utc_start 2018-03-11 06:00:00 (Sun)
  63676990800, #      utc_end 2018-11-04 05:00:00 (Sun)
  63656420400, #  local_start 2018-03-11 03:00:00 (Sun)
  63676980000, #    local_end 2018-11-04 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63676990800, #    utc_start 2018-11-04 05:00:00 (Sun)
  63687880800, #      utc_end 2019-03-10 06:00:00 (Sun)
  63676976400, #  local_start 2018-11-04 01:00:00 (Sun)
  63687866400, #    local_end 2019-03-10 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63687880800, #    utc_start 2019-03-10 06:00:00 (Sun)
  63708440400, #      utc_end 2019-11-03 05:00:00 (Sun)
  63687870000, #  local_start 2019-03-10 03:00:00 (Sun)
  63708429600, #    local_end 2019-11-03 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63708440400, #    utc_start 2019-11-03 05:00:00 (Sun)
  63719330400, #      utc_end 2020-03-08 06:00:00 (Sun)
  63708426000, #  local_start 2019-11-03 01:00:00 (Sun)
  63719316000, #    local_end 2020-03-08 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63719330400, #    utc_start 2020-03-08 06:00:00 (Sun)
  63739890000, #      utc_end 2020-11-01 05:00:00 (Sun)
  63719319600, #  local_start 2020-03-08 03:00:00 (Sun)
  63739879200, #    local_end 2020-11-01 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63739890000, #    utc_start 2020-11-01 05:00:00 (Sun)
  63751384800, #      utc_end 2021-03-14 06:00:00 (Sun)
  63739875600, #  local_start 2020-11-01 01:00:00 (Sun)
  63751370400, #    local_end 2021-03-14 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63751384800, #    utc_start 2021-03-14 06:00:00 (Sun)
  63771944400, #      utc_end 2021-11-07 05:00:00 (Sun)
  63751374000, #  local_start 2021-03-14 03:00:00 (Sun)
  63771933600, #    local_end 2021-11-07 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63771944400, #    utc_start 2021-11-07 05:00:00 (Sun)
  63782834400, #      utc_end 2022-03-13 06:00:00 (Sun)
  63771930000, #  local_start 2021-11-07 01:00:00 (Sun)
  63782820000, #    local_end 2022-03-13 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63782834400, #    utc_start 2022-03-13 06:00:00 (Sun)
  63803394000, #      utc_end 2022-11-06 05:00:00 (Sun)
  63782823600, #  local_start 2022-03-13 03:00:00 (Sun)
  63803383200, #    local_end 2022-11-06 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63803394000, #    utc_start 2022-11-06 05:00:00 (Sun)
  63814284000, #      utc_end 2023-03-12 06:00:00 (Sun)
  63803379600, #  local_start 2022-11-06 01:00:00 (Sun)
  63814269600, #    local_end 2023-03-12 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63814284000, #    utc_start 2023-03-12 06:00:00 (Sun)
  63834843600, #      utc_end 2023-11-05 05:00:00 (Sun)
  63814273200, #  local_start 2023-03-12 03:00:00 (Sun)
  63834832800, #    local_end 2023-11-05 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63834843600, #    utc_start 2023-11-05 05:00:00 (Sun)
  63845733600, #      utc_end 2024-03-10 06:00:00 (Sun)
  63834829200, #  local_start 2023-11-05 01:00:00 (Sun)
  63845719200, #    local_end 2024-03-10 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63845733600, #    utc_start 2024-03-10 06:00:00 (Sun)
  63866293200, #      utc_end 2024-11-03 05:00:00 (Sun)
  63845722800, #  local_start 2024-03-10 03:00:00 (Sun)
  63866282400, #    local_end 2024-11-03 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63866293200, #    utc_start 2024-11-03 05:00:00 (Sun)
  63877183200, #      utc_end 2025-03-09 06:00:00 (Sun)
  63866278800, #  local_start 2024-11-03 01:00:00 (Sun)
  63877168800, #    local_end 2025-03-09 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63877183200, #    utc_start 2025-03-09 06:00:00 (Sun)
  63897742800, #      utc_end 2025-11-02 05:00:00 (Sun)
  63877172400, #  local_start 2025-03-09 03:00:00 (Sun)
  63897732000, #    local_end 2025-11-02 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63897742800, #    utc_start 2025-11-02 05:00:00 (Sun)
  63908632800, #      utc_end 2026-03-08 06:00:00 (Sun)
  63897728400, #  local_start 2025-11-02 01:00:00 (Sun)
  63908618400, #    local_end 2026-03-08 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63908632800, #    utc_start 2026-03-08 06:00:00 (Sun)
  63929192400, #      utc_end 2026-11-01 05:00:00 (Sun)
  63908622000, #  local_start 2026-03-08 03:00:00 (Sun)
  63929181600, #    local_end 2026-11-01 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63929192400, #    utc_start 2026-11-01 05:00:00 (Sun)
  63940687200, #      utc_end 2027-03-14 06:00:00 (Sun)
  63929178000, #  local_start 2026-11-01 01:00:00 (Sun)
  63940672800, #    local_end 2027-03-14 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63940687200, #    utc_start 2027-03-14 06:00:00 (Sun)
  63961246800, #      utc_end 2027-11-07 05:00:00 (Sun)
  63940676400, #  local_start 2027-03-14 03:00:00 (Sun)
  63961236000, #    local_end 2027-11-07 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63961246800, #    utc_start 2027-11-07 05:00:00 (Sun)
  63972136800, #      utc_end 2028-03-12 06:00:00 (Sun)
  63961232400, #  local_start 2027-11-07 01:00:00 (Sun)
  63972122400, #    local_end 2028-03-12 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63972136800, #    utc_start 2028-03-12 06:00:00 (Sun)
  63992696400, #      utc_end 2028-11-05 05:00:00 (Sun)
  63972126000, #  local_start 2028-03-12 03:00:00 (Sun)
  63992685600, #    local_end 2028-11-05 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63992696400, #    utc_start 2028-11-05 05:00:00 (Sun)
  64003586400, #      utc_end 2029-03-11 06:00:00 (Sun)
  63992682000, #  local_start 2028-11-05 01:00:00 (Sun)
  64003572000, #    local_end 2029-03-11 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  64003586400, #    utc_start 2029-03-11 06:00:00 (Sun)
  64024146000, #      utc_end 2029-11-04 05:00:00 (Sun)
  64003575600, #  local_start 2029-03-11 03:00:00 (Sun)
  64024135200, #    local_end 2029-11-04 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  64024146000, #    utc_start 2029-11-04 05:00:00 (Sun)
  64035036000, #      utc_end 2030-03-10 06:00:00 (Sun)
  64024131600, #  local_start 2029-11-04 01:00:00 (Sun)
  64035021600, #    local_end 2030-03-10 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  64035036000, #    utc_start 2030-03-10 06:00:00 (Sun)
  64055595600, #      utc_end 2030-11-03 05:00:00 (Sun)
  64035025200, #  local_start 2030-03-10 03:00:00 (Sun)
  64055584800, #    local_end 2030-11-03 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {107}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -14400 }
  
  my $last_observance = bless( {
    'format' => 'A%sT',
    'gmtoff' => '-4:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 720624,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 720624,
      'utc_rd_secs' => 0,
      'utc_year' => 1975
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -14400,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 720624,
      'local_rd_secs' => 14400,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 720624,
      'utc_rd_secs' => 14400,
      'utc_year' => 1975
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Mar',
      'letter' => 'D',
      'name' => 'Canada',
      'offset_from_std' => 3600,
      'on' => 'Sun>=8',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Nov',
      'letter' => 'S',
      'name' => 'Canada',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_HALIFAX

    $main::fatpacked{"DateTime/TimeZone/America/Havana.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_HAVANA';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Havana;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Havana::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59611181368, #      utc_end 1890-01-01 05:29:28 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59611161600, #    local_end 1890-01-01 00:00:00 (Wed)
  -19768,
  0,
  'LMT',
      ],
      [
  59611181368, #    utc_start 1890-01-01 05:29:28 (Wed)
  60732869376, #      utc_end 1925-07-19 17:29:36 (Sun)
  59611161592, #  local_start 1889-12-31 23:59:52 (Tue)
  60732849600, #    local_end 1925-07-19 12:00:00 (Sun)
  -19776,
  0,
  'HMT',
      ],
      [
  60732869376, #    utc_start 1925-07-19 17:29:36 (Sun)
  60824149200, #      utc_end 1928-06-10 05:00:00 (Sun)
  60732851376, #  local_start 1925-07-19 12:29:36 (Sun)
  60824131200, #    local_end 1928-06-10 00:00:00 (Sun)
  -18000,
  0,
  'CST',
      ],
      [
  60824149200, #    utc_start 1928-06-10 05:00:00 (Sun)
  60834686400, #      utc_end 1928-10-10 04:00:00 (Wed)
  60824134800, #  local_start 1928-06-10 01:00:00 (Sun)
  60834672000, #    local_end 1928-10-10 00:00:00 (Wed)
  -14400,
  1,
  'CDT',
      ],
      [
  60834686400, #    utc_start 1928-10-10 04:00:00 (Wed)
  61202149200, #      utc_end 1940-06-02 05:00:00 (Sun)
  60834668400, #  local_start 1928-10-09 23:00:00 (Tue)
  61202131200, #    local_end 1940-06-02 00:00:00 (Sun)
  -18000,
  0,
  'CST',
      ],
      [
  61202149200, #    utc_start 1940-06-02 05:00:00 (Sun)
  61210008000, #      utc_end 1940-09-01 04:00:00 (Sun)
  61202134800, #  local_start 1940-06-02 01:00:00 (Sun)
  61209993600, #    local_end 1940-09-01 00:00:00 (Sun)
  -14400,
  1,
  'CDT',
      ],
      [
  61210008000, #    utc_start 1940-09-01 04:00:00 (Sun)
  61233598800, #      utc_end 1941-06-01 05:00:00 (Sun)
  61209990000, #  local_start 1940-08-31 23:00:00 (Sat)
  61233580800, #    local_end 1941-06-01 00:00:00 (Sun)
  -18000,
  0,
  'CST',
      ],
      [
  61233598800, #    utc_start 1941-06-01 05:00:00 (Sun)
  61242062400, #      utc_end 1941-09-07 04:00:00 (Sun)
  61233584400, #  local_start 1941-06-01 01:00:00 (Sun)
  61242048000, #    local_end 1941-09-07 00:00:00 (Sun)
  -14400,
  1,
  'CDT',
      ],
      [
  61242062400, #    utc_start 1941-09-07 04:00:00 (Sun)
  61265653200, #      utc_end 1942-06-07 05:00:00 (Sun)
  61242044400, #  local_start 1941-09-06 23:00:00 (Sat)
  61265635200, #    local_end 1942-06-07 00:00:00 (Sun)
  -18000,
  0,
  'CST',
      ],
      [
  61265653200, #    utc_start 1942-06-07 05:00:00 (Sun)
  61273512000, #      utc_end 1942-09-06 04:00:00 (Sun)
  61265638800, #  local_start 1942-06-07 01:00:00 (Sun)
  61273497600, #    local_end 1942-09-06 00:00:00 (Sun)
  -14400,
  1,
  'CDT',
      ],
      [
  61273512000, #    utc_start 1942-09-06 04:00:00 (Sun)
  61360002000, #      utc_end 1945-06-03 05:00:00 (Sun)
  61273494000, #  local_start 1942-09-05 23:00:00 (Sat)
  61359984000, #    local_end 1945-06-03 00:00:00 (Sun)
  -18000,
  0,
  'CST',
      ],
      [
  61360002000, #    utc_start 1945-06-03 05:00:00 (Sun)
  61367860800, #      utc_end 1945-09-02 04:00:00 (Sun)
  61359987600, #  local_start 1945-06-03 01:00:00 (Sun)
  61367846400, #    local_end 1945-09-02 00:00:00 (Sun)
  -14400,
  1,
  'CDT',
      ],
      [
  61367860800, #    utc_start 1945-09-02 04:00:00 (Sun)
  61391451600, #      utc_end 1946-06-02 05:00:00 (Sun)
  61367842800, #  local_start 1945-09-01 23:00:00 (Sat)
  61391433600, #    local_end 1946-06-02 00:00:00 (Sun)
  -18000,
  0,
  'CST',
      ],
      [
  61391451600, #    utc_start 1946-06-02 05:00:00 (Sun)
  61399310400, #      utc_end 1946-09-01 04:00:00 (Sun)
  61391437200, #  local_start 1946-06-02 01:00:00 (Sun)
  61399296000, #    local_end 1946-09-01 00:00:00 (Sun)
  -14400,
  1,
  'CDT',
      ],
      [
  61399310400, #    utc_start 1946-09-01 04:00:00 (Sun)
  61990981200, #      utc_end 1965-06-01 05:00:00 (Tue)
  61399292400, #  local_start 1946-08-31 23:00:00 (Sat)
  61990963200, #    local_end 1965-06-01 00:00:00 (Tue)
  -18000,
  0,
  'CST',
      ],
      [
  61990981200, #    utc_start 1965-06-01 05:00:00 (Tue)
  62001432000, #      utc_end 1965-09-30 04:00:00 (Thu)
  61990966800, #  local_start 1965-06-01 01:00:00 (Tue)
  62001417600, #    local_end 1965-09-30 00:00:00 (Thu)
  -14400,
  1,
  'CDT',
      ],
      [
  62001432000, #    utc_start 1965-09-30 04:00:00 (Thu)
  62022258000, #      utc_end 1966-05-29 05:00:00 (Sun)
  62001414000, #  local_start 1965-09-29 23:00:00 (Wed)
  62022240000, #    local_end 1966-05-29 00:00:00 (Sun)
  -18000,
  0,
  'CST',
      ],
      [
  62022258000, #    utc_start 1966-05-29 05:00:00 (Sun)
  62033140800, #      utc_end 1966-10-02 04:00:00 (Sun)
  62022243600, #  local_start 1966-05-29 01:00:00 (Sun)
  62033126400, #    local_end 1966-10-02 00:00:00 (Sun)
  -14400,
  1,
  'CDT',
      ],
      [
  62033140800, #    utc_start 1966-10-02 04:00:00 (Sun)
  62049387600, #      utc_end 1967-04-08 05:00:00 (Sat)
  62033122800, #  local_start 1966-10-01 23:00:00 (Sat)
  62049369600, #    local_end 1967-04-08 00:00:00 (Sat)
  -18000,
  0,
  'CST',
      ],
      [
  62049387600, #    utc_start 1967-04-08 05:00:00 (Sat)
  62062776000, #      utc_end 1967-09-10 04:00:00 (Sun)
  62049373200, #  local_start 1967-04-08 01:00:00 (Sat)
  62062761600, #    local_end 1967-09-10 00:00:00 (Sun)
  -14400,
  1,
  'CDT',
      ],
      [
  62062776000, #    utc_start 1967-09-10 04:00:00 (Sun)
  62081528400, #      utc_end 1968-04-14 05:00:00 (Sun)
  62062758000, #  local_start 1967-09-09 23:00:00 (Sat)
  62081510400, #    local_end 1968-04-14 00:00:00 (Sun)
  -18000,
  0,
  'CST',
      ],
      [
  62081528400, #    utc_start 1968-04-14 05:00:00 (Sun)
  62094225600, #      utc_end 1968-09-08 04:00:00 (Sun)
  62081514000, #  local_start 1968-04-14 01:00:00 (Sun)
  62094211200, #    local_end 1968-09-08 00:00:00 (Sun)
  -14400,
  1,
  'CDT',
      ],
      [
  62094225600, #    utc_start 1968-09-08 04:00:00 (Sun)
  62114187600, #      utc_end 1969-04-27 05:00:00 (Sun)
  62094207600, #  local_start 1968-09-07 23:00:00 (Sat)
  62114169600, #    local_end 1969-04-27 00:00:00 (Sun)
  -18000,
  0,
  'CST',
      ],
      [
  62114187600, #    utc_start 1969-04-27 05:00:00 (Sun)
  62129908800, #      utc_end 1969-10-26 04:00:00 (Sun)
  62114173200, #  local_start 1969-04-27 01:00:00 (Sun)
  62129894400, #    local_end 1969-10-26 00:00:00 (Sun)
  -14400,
  1,
  'CDT',
      ],
      [
  62129908800, #    utc_start 1969-10-26 04:00:00 (Sun)
  62145637200, #      utc_end 1970-04-26 05:00:00 (Sun)
  62129890800, #  local_start 1969-10-25 23:00:00 (Sat)
  62145619200, #    local_end 1970-04-26 00:00:00 (Sun)
  -18000,
  0,
  'CST',
      ],
      [
  62145637200, #    utc_start 1970-04-26 05:00:00 (Sun)
  62161358400, #      utc_end 1970-10-25 04:00:00 (Sun)
  62145622800, #  local_start 1970-04-26 01:00:00 (Sun)
  62161344000, #    local_end 1970-10-25 00:00:00 (Sun)
  -14400,
  1,
  'CDT',
      ],
      [
  62161358400, #    utc_start 1970-10-25 04:00:00 (Sun)
  62177086800, #      utc_end 1971-04-25 05:00:00 (Sun)
  62161340400, #  local_start 1970-10-24 23:00:00 (Sat)
  62177068800, #    local_end 1971-04-25 00:00:00 (Sun)
  -18000,
  0,
  'CST',
      ],
      [
  62177086800, #    utc_start 1971-04-25 05:00:00 (Sun)
  62193412800, #      utc_end 1971-10-31 04:00:00 (Sun)
  62177072400, #  local_start 1971-04-25 01:00:00 (Sun)
  62193398400, #    local_end 1971-10-31 00:00:00 (Sun)
  -14400,
  1,
  'CDT',
      ],
      [
  62193412800, #    utc_start 1971-10-31 04:00:00 (Sun)
  62209141200, #      utc_end 1972-04-30 05:00:00 (Sun)
  62193394800, #  local_start 1971-10-30 23:00:00 (Sat)
  62209123200, #    local_end 1972-04-30 00:00:00 (Sun)
  -18000,
  0,
  'CST',
      ],
      [
  62209141200, #    utc_start 1972-04-30 05:00:00 (Sun)
  62223048000, #      utc_end 1972-10-08 04:00:00 (Sun)
  62209126800, #  local_start 1972-04-30 01:00:00 (Sun)
  62223033600, #    local_end 1972-10-08 00:00:00 (Sun)
  -14400,
  1,
  'CDT',
      ],
      [
  62223048000, #    utc_start 1972-10-08 04:00:00 (Sun)
  62240590800, #      utc_end 1973-04-29 05:00:00 (Sun)
  62223030000, #  local_start 1972-10-07 23:00:00 (Sat)
  62240572800, #    local_end 1973-04-29 00:00:00 (Sun)
  -18000,
  0,
  'CST',
      ],
      [
  62240590800, #    utc_start 1973-04-29 05:00:00 (Sun)
  62254584000, #      utc_end 1973-10-08 04:00:00 (Mon)
  62240576400, #  local_start 1973-04-29 01:00:00 (Sun)
  62254569600, #    local_end 1973-10-08 00:00:00 (Mon)
  -14400,
  1,
  'CDT',
      ],
      [
  62254584000, #    utc_start 1973-10-08 04:00:00 (Mon)
  62272040400, #      utc_end 1974-04-28 05:00:00 (Sun)
  62254566000, #  local_start 1973-10-07 23:00:00 (Sun)
  62272022400, #    local_end 1974-04-28 00:00:00 (Sun)
  -18000,
  0,
  'CST',
      ],
      [
  62272040400, #    utc_start 1974-04-28 05:00:00 (Sun)
  62286120000, #      utc_end 1974-10-08 04:00:00 (Tue)
  62272026000, #  local_start 1974-04-28 01:00:00 (Sun)
  62286105600, #    local_end 1974-10-08 00:00:00 (Tue)
  -14400,
  1,
  'CDT',
      ],
      [
  62286120000, #    utc_start 1974-10-08 04:00:00 (Tue)
  62303490000, #      utc_end 1975-04-27 05:00:00 (Sun)
  62286102000, #  local_start 1974-10-07 23:00:00 (Mon)
  62303472000, #    local_end 1975-04-27 00:00:00 (Sun)
  -18000,
  0,
  'CST',
      ],
      [
  62303490000, #    utc_start 1975-04-27 05:00:00 (Sun)
  62319211200, #      utc_end 1975-10-26 04:00:00 (Sun)
  62303475600, #  local_start 1975-04-27 01:00:00 (Sun)
  62319196800, #    local_end 1975-10-26 00:00:00 (Sun)
  -14400,
  1,
  'CDT',
      ],
      [
  62319211200, #    utc_start 1975-10-26 04:00:00 (Sun)
  62334939600, #      utc_end 1976-04-25 05:00:00 (Sun)
  62319193200, #  local_start 1975-10-25 23:00:00 (Sat)
  62334921600, #    local_end 1976-04-25 00:00:00 (Sun)
  -18000,
  0,
  'CST',
      ],
      [
  62334939600, #    utc_start 1976-04-25 05:00:00 (Sun)
  62351265600, #      utc_end 1976-10-31 04:00:00 (Sun)
  62334925200, #  local_start 1976-04-25 01:00:00 (Sun)
  62351251200, #    local_end 1976-10-31 00:00:00 (Sun)
  -14400,
  1,
  'CDT',
      ],
      [
  62351265600, #    utc_start 1976-10-31 04:00:00 (Sun)
  62366389200, #      utc_end 1977-04-24 05:00:00 (Sun)
  62351247600, #  local_start 1976-10-30 23:00:00 (Sat)
  62366371200, #    local_end 1977-04-24 00:00:00 (Sun)
  -18000,
  0,
  'CST',
      ],
      [
  62366389200, #    utc_start 1977-04-24 05:00:00 (Sun)
  62382715200, #      utc_end 1977-10-30 04:00:00 (Sun)
  62366374800, #  local_start 1977-04-24 01:00:00 (Sun)
  62382700800, #    local_end 1977-10-30 00:00:00 (Sun)
  -14400,
  1,
  'CDT',
      ],
      [
  62382715200, #    utc_start 1977-10-30 04:00:00 (Sun)
  62399048400, #      utc_end 1978-05-07 05:00:00 (Sun)
  62382697200, #  local_start 1977-10-29 23:00:00 (Sat)
  62399030400, #    local_end 1978-05-07 00:00:00 (Sun)
  -18000,
  0,
  'CST',
      ],
      [
  62399048400, #    utc_start 1978-05-07 05:00:00 (Sun)
  62412350400, #      utc_end 1978-10-08 04:00:00 (Sun)
  62399034000, #  local_start 1978-05-07 01:00:00 (Sun)
  62412336000, #    local_end 1978-10-08 00:00:00 (Sun)
  -14400,
  1,
  'CDT',
      ],
      [
  62412350400, #    utc_start 1978-10-08 04:00:00 (Sun)
  62426264400, #      utc_end 1979-03-18 05:00:00 (Sun)
  62412332400, #  local_start 1978-10-07 23:00:00 (Sat)
  62426246400, #    local_end 1979-03-18 00:00:00 (Sun)
  -18000,
  0,
  'CST',
      ],
      [
  62426264400, #    utc_start 1979-03-18 05:00:00 (Sun)
  62444404800, #      utc_end 1979-10-14 04:00:00 (Sun)
  62426250000, #  local_start 1979-03-18 01:00:00 (Sun)
  62444390400, #    local_end 1979-10-14 00:00:00 (Sun)
  -14400,
  1,
  'CDT',
      ],
      [
  62444404800, #    utc_start 1979-10-14 04:00:00 (Sun)
  62457714000, #      utc_end 1980-03-16 05:00:00 (Sun)
  62444386800, #  local_start 1979-10-13 23:00:00 (Sat)
  62457696000, #    local_end 1980-03-16 00:00:00 (Sun)
  -18000,
  0,
  'CST',
      ],
      [
  62457714000, #    utc_start 1980-03-16 05:00:00 (Sun)
  62475854400, #      utc_end 1980-10-12 04:00:00 (Sun)
  62457699600, #  local_start 1980-03-16 01:00:00 (Sun)
  62475840000, #    local_end 1980-10-12 00:00:00 (Sun)
  -14400,
  1,
  'CDT',
      ],
      [
  62475854400, #    utc_start 1980-10-12 04:00:00 (Sun)
  62494002000, #      utc_end 1981-05-10 05:00:00 (Sun)
  62475836400, #  local_start 1980-10-11 23:00:00 (Sat)
  62493984000, #    local_end 1981-05-10 00:00:00 (Sun)
  -18000,
  0,
  'CST',
      ],
      [
  62494002000, #    utc_start 1981-05-10 05:00:00 (Sun)
  62507304000, #      utc_end 1981-10-11 04:00:00 (Sun)
  62493987600, #  local_start 1981-05-10 01:00:00 (Sun)
  62507289600, #    local_end 1981-10-11 00:00:00 (Sun)
  -14400,
  1,
  'CDT',
      ],
      [
  62507304000, #    utc_start 1981-10-11 04:00:00 (Sun)
  62525451600, #      utc_end 1982-05-09 05:00:00 (Sun)
  62507286000, #  local_start 1981-10-10 23:00:00 (Sat)
  62525433600, #    local_end 1982-05-09 00:00:00 (Sun)
  -18000,
  0,
  'CST',
      ],
      [
  62525451600, #    utc_start 1982-05-09 05:00:00 (Sun)
  62538753600, #      utc_end 1982-10-10 04:00:00 (Sun)
  62525437200, #  local_start 1982-05-09 01:00:00 (Sun)
  62538739200, #    local_end 1982-10-10 00:00:00 (Sun)
  -14400,
  1,
  'CDT',
      ],
      [
  62538753600, #    utc_start 1982-10-10 04:00:00 (Sun)
  62556901200, #      utc_end 1983-05-08 05:00:00 (Sun)
  62538735600, #  local_start 1982-10-09 23:00:00 (Sat)
  62556883200, #    local_end 1983-05-08 00:00:00 (Sun)
  -18000,
  0,
  'CST',
      ],
      [
  62556901200, #    utc_start 1983-05-08 05:00:00 (Sun)
  62570203200, #      utc_end 1983-10-09 04:00:00 (Sun)
  62556886800, #  local_start 1983-05-08 01:00:00 (Sun)
  62570188800, #    local_end 1983-10-09 00:00:00 (Sun)
  -14400,
  1,
  'CDT',
      ],
      [
  62570203200, #    utc_start 1983-10-09 04:00:00 (Sun)
  62588350800, #      utc_end 1984-05-06 05:00:00 (Sun)
  62570185200, #  local_start 1983-10-08 23:00:00 (Sat)
  62588332800, #    local_end 1984-05-06 00:00:00 (Sun)
  -18000,
  0,
  'CST',
      ],
      [
  62588350800, #    utc_start 1984-05-06 05:00:00 (Sun)
  62602257600, #      utc_end 1984-10-14 04:00:00 (Sun)
  62588336400, #  local_start 1984-05-06 01:00:00 (Sun)
  62602243200, #    local_end 1984-10-14 00:00:00 (Sun)
  -14400,
  1,
  'CDT',
      ],
      [
  62602257600, #    utc_start 1984-10-14 04:00:00 (Sun)
  62619800400, #      utc_end 1985-05-05 05:00:00 (Sun)
  62602239600, #  local_start 1984-10-13 23:00:00 (Sat)
  62619782400, #    local_end 1985-05-05 00:00:00 (Sun)
  -18000,
  0,
  'CST',
      ],
      [
  62619800400, #    utc_start 1985-05-05 05:00:00 (Sun)
  62633707200, #      utc_end 1985-10-13 04:00:00 (Sun)
  62619786000, #  local_start 1985-05-05 01:00:00 (Sun)
  62633692800, #    local_end 1985-10-13 00:00:00 (Sun)
  -14400,
  1,
  'CDT',
      ],
      [
  62633707200, #    utc_start 1985-10-13 04:00:00 (Sun)
  62647016400, #      utc_end 1986-03-16 05:00:00 (Sun)
  62633689200, #  local_start 1985-10-12 23:00:00 (Sat)
  62646998400, #    local_end 1986-03-16 00:00:00 (Sun)
  -18000,
  0,
  'CST',
      ],
      [
  62647016400, #    utc_start 1986-03-16 05:00:00 (Sun)
  62665156800, #      utc_end 1986-10-12 04:00:00 (Sun)
  62647002000, #  local_start 1986-03-16 01:00:00 (Sun)
  62665142400, #    local_end 1986-10-12 00:00:00 (Sun)
  -14400,
  1,
  'CDT',
      ],
      [
  62665156800, #    utc_start 1986-10-12 04:00:00 (Sun)
  62678466000, #      utc_end 1987-03-15 05:00:00 (Sun)
  62665138800, #  local_start 1986-10-11 23:00:00 (Sat)
  62678448000, #    local_end 1987-03-15 00:00:00 (Sun)
  -18000,
  0,
  'CST',
      ],
      [
  62678466000, #    utc_start 1987-03-15 05:00:00 (Sun)
  62696606400, #      utc_end 1987-10-11 04:00:00 (Sun)
  62678451600, #  local_start 1987-03-15 01:00:00 (Sun)
  62696592000, #    local_end 1987-10-11 00:00:00 (Sun)
  -14400,
  1,
  'CDT',
      ],
      [
  62696606400, #    utc_start 1987-10-11 04:00:00 (Sun)
  62710520400, #      utc_end 1988-03-20 05:00:00 (Sun)
  62696588400, #  local_start 1987-10-10 23:00:00 (Sat)
  62710502400, #    local_end 1988-03-20 00:00:00 (Sun)
  -18000,
  0,
  'CST',
      ],
      [
  62710520400, #    utc_start 1988-03-20 05:00:00 (Sun)
  62728056000, #      utc_end 1988-10-09 04:00:00 (Sun)
  62710506000, #  local_start 1988-03-20 01:00:00 (Sun)
  62728041600, #    local_end 1988-10-09 00:00:00 (Sun)
  -14400,
  1,
  'CDT',
      ],
      [
  62728056000, #    utc_start 1988-10-09 04:00:00 (Sun)
  62741970000, #      utc_end 1989-03-19 05:00:00 (Sun)
  62728038000, #  local_start 1988-10-08 23:00:00 (Sat)
  62741952000, #    local_end 1989-03-19 00:00:00 (Sun)
  -18000,
  0,
  'CST',
      ],
      [
  62741970000, #    utc_start 1989-03-19 05:00:00 (Sun)
  62759505600, #      utc_end 1989-10-08 04:00:00 (Sun)
  62741955600, #  local_start 1989-03-19 01:00:00 (Sun)
  62759491200, #    local_end 1989-10-08 00:00:00 (Sun)
  -14400,
  1,
  'CDT',
      ],
      [
  62759505600, #    utc_start 1989-10-08 04:00:00 (Sun)
  62774629200, #      utc_end 1990-04-01 05:00:00 (Sun)
  62759487600, #  local_start 1989-10-07 23:00:00 (Sat)
  62774611200, #    local_end 1990-04-01 00:00:00 (Sun)
  -18000,
  0,
  'CST',
      ],
      [
  62774629200, #    utc_start 1990-04-01 05:00:00 (Sun)
  62791560000, #      utc_end 1990-10-14 04:00:00 (Sun)
  62774614800, #  local_start 1990-04-01 01:00:00 (Sun)
  62791545600, #    local_end 1990-10-14 00:00:00 (Sun)
  -14400,
  1,
  'CDT',
      ],
      [
  62791560000, #    utc_start 1990-10-14 04:00:00 (Sun)
  62806683600, #      utc_end 1991-04-07 05:00:00 (Sun)
  62791542000, #  local_start 1990-10-13 23:00:00 (Sat)
  62806665600, #    local_end 1991-04-07 00:00:00 (Sun)
  -18000,
  0,
  'CST',
      ],
      [
  62806683600, #    utc_start 1991-04-07 05:00:00 (Sun)
  62823013200, #      utc_end 1991-10-13 05:00:00 (Sun)
  62806669200, #  local_start 1991-04-07 01:00:00 (Sun)
  62822998800, #    local_end 1991-10-13 01:00:00 (Sun)
  -14400,
  1,
  'CDT',
      ],
      [
  62823013200, #    utc_start 1991-10-13 05:00:00 (Sun)
  62838133200, #      utc_end 1992-04-05 05:00:00 (Sun)
  62822995200, #  local_start 1991-10-13 00:00:00 (Sun)
  62838115200, #    local_end 1992-04-05 00:00:00 (Sun)
  -18000,
  0,
  'CST',
      ],
      [
  62838133200, #    utc_start 1992-04-05 05:00:00 (Sun)
  62854462800, #      utc_end 1992-10-11 05:00:00 (Sun)
  62838118800, #  local_start 1992-04-05 01:00:00 (Sun)
  62854448400, #    local_end 1992-10-11 01:00:00 (Sun)
  -14400,
  1,
  'CDT',
      ],
      [
  62854462800, #    utc_start 1992-10-11 05:00:00 (Sun)
  62869582800, #      utc_end 1993-04-04 05:00:00 (Sun)
  62854444800, #  local_start 1992-10-11 00:00:00 (Sun)
  62869564800, #    local_end 1993-04-04 00:00:00 (Sun)
  -18000,
  0,
  'CST',
      ],
      [
  62869582800, #    utc_start 1993-04-04 05:00:00 (Sun)
  62885912400, #      utc_end 1993-10-10 05:00:00 (Sun)
  62869568400, #  local_start 1993-04-04 01:00:00 (Sun)
  62885898000, #    local_end 1993-10-10 01:00:00 (Sun)
  -14400,
  1,
  'CDT',
      ],
      [
  62885912400, #    utc_start 1993-10-10 05:00:00 (Sun)
  62901032400, #      utc_end 1994-04-03 05:00:00 (Sun)
  62885894400, #  local_start 1993-10-10 00:00:00 (Sun)
  62901014400, #    local_end 1994-04-03 00:00:00 (Sun)
  -18000,
  0,
  'CST',
      ],
      [
  62901032400, #    utc_start 1994-04-03 05:00:00 (Sun)
  62917362000, #      utc_end 1994-10-09 05:00:00 (Sun)
  62901018000, #  local_start 1994-04-03 01:00:00 (Sun)
  62917347600, #    local_end 1994-10-09 01:00:00 (Sun)
  -14400,
  1,
  'CDT',
      ],
      [
  62917362000, #    utc_start 1994-10-09 05:00:00 (Sun)
  62932482000, #      utc_end 1995-04-02 05:00:00 (Sun)
  62917344000, #  local_start 1994-10-09 00:00:00 (Sun)
  62932464000, #    local_end 1995-04-02 00:00:00 (Sun)
  -18000,
  0,
  'CST',
      ],
      [
  62932482000, #    utc_start 1995-04-02 05:00:00 (Sun)
  62948811600, #      utc_end 1995-10-08 05:00:00 (Sun)
  62932467600, #  local_start 1995-04-02 01:00:00 (Sun)
  62948797200, #    local_end 1995-10-08 01:00:00 (Sun)
  -14400,
  1,
  'CDT',
      ],
      [
  62948811600, #    utc_start 1995-10-08 05:00:00 (Sun)
  62964536400, #      utc_end 1996-04-07 05:00:00 (Sun)
  62948793600, #  local_start 1995-10-08 00:00:00 (Sun)
  62964518400, #    local_end 1996-04-07 00:00:00 (Sun)
  -18000,
  0,
  'CST',
      ],
      [
  62964536400, #    utc_start 1996-04-07 05:00:00 (Sun)
  62980261200, #      utc_end 1996-10-06 05:00:00 (Sun)
  62964522000, #  local_start 1996-04-07 01:00:00 (Sun)
  62980246800, #    local_end 1996-10-06 01:00:00 (Sun)
  -14400,
  1,
  'CDT',
      ],
      [
  62980261200, #    utc_start 1996-10-06 05:00:00 (Sun)
  62995986000, #      utc_end 1997-04-06 05:00:00 (Sun)
  62980243200, #  local_start 1996-10-06 00:00:00 (Sun)
  62995968000, #    local_end 1997-04-06 00:00:00 (Sun)
  -18000,
  0,
  'CST',
      ],
      [
  62995986000, #    utc_start 1997-04-06 05:00:00 (Sun)
  63012315600, #      utc_end 1997-10-12 05:00:00 (Sun)
  62995971600, #  local_start 1997-04-06 01:00:00 (Sun)
  63012301200, #    local_end 1997-10-12 01:00:00 (Sun)
  -14400,
  1,
  'CDT',
      ],
      [
  63012315600, #    utc_start 1997-10-12 05:00:00 (Sun)
  63026830800, #      utc_end 1998-03-29 05:00:00 (Sun)
  63012297600, #  local_start 1997-10-12 00:00:00 (Sun)
  63026812800, #    local_end 1998-03-29 00:00:00 (Sun)
  -18000,
  0,
  'CST',
      ],
      [
  63026830800, #    utc_start 1998-03-29 05:00:00 (Sun)
  63044974800, #      utc_end 1998-10-25 05:00:00 (Sun)
  63026816400, #  local_start 1998-03-29 01:00:00 (Sun)
  63044960400, #    local_end 1998-10-25 01:00:00 (Sun)
  -14400,
  1,
  'CDT',
      ],
      [
  63044974800, #    utc_start 1998-10-25 05:00:00 (Sun)
  63058280400, #      utc_end 1999-03-28 05:00:00 (Sun)
  63044956800, #  local_start 1998-10-25 00:00:00 (Sun)
  63058262400, #    local_end 1999-03-28 00:00:00 (Sun)
  -18000,
  0,
  'CST',
      ],
      [
  63058280400, #    utc_start 1999-03-28 05:00:00 (Sun)
  63077029200, #      utc_end 1999-10-31 05:00:00 (Sun)
  63058266000, #  local_start 1999-03-28 01:00:00 (Sun)
  63077014800, #    local_end 1999-10-31 01:00:00 (Sun)
  -14400,
  1,
  'CDT',
      ],
      [
  63077029200, #    utc_start 1999-10-31 05:00:00 (Sun)
  63090334800, #      utc_end 2000-04-02 05:00:00 (Sun)
  63077011200, #  local_start 1999-10-31 00:00:00 (Sun)
  63090316800, #    local_end 2000-04-02 00:00:00 (Sun)
  -18000,
  0,
  'CST',
      ],
      [
  63090334800, #    utc_start 2000-04-02 05:00:00 (Sun)
  63108478800, #      utc_end 2000-10-29 05:00:00 (Sun)
  63090320400, #  local_start 2000-04-02 01:00:00 (Sun)
  63108464400, #    local_end 2000-10-29 01:00:00 (Sun)
  -14400,
  1,
  'CDT',
      ],
      [
  63108478800, #    utc_start 2000-10-29 05:00:00 (Sun)
  63121784400, #      utc_end 2001-04-01 05:00:00 (Sun)
  63108460800, #  local_start 2000-10-29 00:00:00 (Sun)
  63121766400, #    local_end 2001-04-01 00:00:00 (Sun)
  -18000,
  0,
  'CST',
      ],
      [
  63121784400, #    utc_start 2001-04-01 05:00:00 (Sun)
  63139928400, #      utc_end 2001-10-28 05:00:00 (Sun)
  63121770000, #  local_start 2001-04-01 01:00:00 (Sun)
  63139914000, #    local_end 2001-10-28 01:00:00 (Sun)
  -14400,
  1,
  'CDT',
      ],
      [
  63139928400, #    utc_start 2001-10-28 05:00:00 (Sun)
  63153838800, #      utc_end 2002-04-07 05:00:00 (Sun)
  63139910400, #  local_start 2001-10-28 00:00:00 (Sun)
  63153820800, #    local_end 2002-04-07 00:00:00 (Sun)
  -18000,
  0,
  'CST',
      ],
      [
  63153838800, #    utc_start 2002-04-07 05:00:00 (Sun)
  63171378000, #      utc_end 2002-10-27 05:00:00 (Sun)
  63153824400, #  local_start 2002-04-07 01:00:00 (Sun)
  63171363600, #    local_end 2002-10-27 01:00:00 (Sun)
  -14400,
  1,
  'CDT',
      ],
      [
  63171378000, #    utc_start 2002-10-27 05:00:00 (Sun)
  63185288400, #      utc_end 2003-04-06 05:00:00 (Sun)
  63171360000, #  local_start 2002-10-27 00:00:00 (Sun)
  63185270400, #    local_end 2003-04-06 00:00:00 (Sun)
  -18000,
  0,
  'CST',
      ],
      [
  63185288400, #    utc_start 2003-04-06 05:00:00 (Sun)
  63202827600, #      utc_end 2003-10-26 05:00:00 (Sun)
  63185274000, #  local_start 2003-04-06 01:00:00 (Sun)
  63202813200, #    local_end 2003-10-26 01:00:00 (Sun)
  -14400,
  1,
  'CDT',
      ],
      [
  63202827600, #    utc_start 2003-10-26 05:00:00 (Sun)
  63216133200, #      utc_end 2004-03-28 05:00:00 (Sun)
  63202809600, #  local_start 2003-10-26 00:00:00 (Sun)
  63216115200, #    local_end 2004-03-28 00:00:00 (Sun)
  -18000,
  0,
  'CST',
      ],
      [
  63216133200, #    utc_start 2004-03-28 05:00:00 (Sun)
  63297781200, #      utc_end 2006-10-29 05:00:00 (Sun)
  63216118800, #  local_start 2004-03-28 01:00:00 (Sun)
  63297766800, #    local_end 2006-10-29 01:00:00 (Sun)
  -14400,
  1,
  'CDT',
      ],
      [
  63297781200, #    utc_start 2006-10-29 05:00:00 (Sun)
  63309272400, #      utc_end 2007-03-11 05:00:00 (Sun)
  63297763200, #  local_start 2006-10-29 00:00:00 (Sun)
  63309254400, #    local_end 2007-03-11 00:00:00 (Sun)
  -18000,
  0,
  'CST',
      ],
      [
  63309272400, #    utc_start 2007-03-11 05:00:00 (Sun)
  63329230800, #      utc_end 2007-10-28 05:00:00 (Sun)
  63309258000, #  local_start 2007-03-11 01:00:00 (Sun)
  63329216400, #    local_end 2007-10-28 01:00:00 (Sun)
  -14400,
  1,
  'CDT',
      ],
      [
  63329230800, #    utc_start 2007-10-28 05:00:00 (Sun)
  63341326800, #      utc_end 2008-03-16 05:00:00 (Sun)
  63329212800, #  local_start 2007-10-28 00:00:00 (Sun)
  63341308800, #    local_end 2008-03-16 00:00:00 (Sun)
  -18000,
  0,
  'CST',
      ],
      [
  63341326800, #    utc_start 2008-03-16 05:00:00 (Sun)
  63360680400, #      utc_end 2008-10-26 05:00:00 (Sun)
  63341312400, #  local_start 2008-03-16 01:00:00 (Sun)
  63360666000, #    local_end 2008-10-26 01:00:00 (Sun)
  -14400,
  1,
  'CDT',
      ],
      [
  63360680400, #    utc_start 2008-10-26 05:00:00 (Sun)
  63372171600, #      utc_end 2009-03-08 05:00:00 (Sun)
  63360662400, #  local_start 2008-10-26 00:00:00 (Sun)
  63372153600, #    local_end 2009-03-08 00:00:00 (Sun)
  -18000,
  0,
  'CST',
      ],
      [
  63372171600, #    utc_start 2009-03-08 05:00:00 (Sun)
  63392130000, #      utc_end 2009-10-25 05:00:00 (Sun)
  63372157200, #  local_start 2009-03-08 01:00:00 (Sun)
  63392115600, #    local_end 2009-10-25 01:00:00 (Sun)
  -14400,
  1,
  'CDT',
      ],
      [
  63392130000, #    utc_start 2009-10-25 05:00:00 (Sun)
  63404226000, #      utc_end 2010-03-14 05:00:00 (Sun)
  63392112000, #  local_start 2009-10-25 00:00:00 (Sun)
  63404208000, #    local_end 2010-03-14 00:00:00 (Sun)
  -18000,
  0,
  'CST',
      ],
      [
  63404226000, #    utc_start 2010-03-14 05:00:00 (Sun)
  63424184400, #      utc_end 2010-10-31 05:00:00 (Sun)
  63404211600, #  local_start 2010-03-14 01:00:00 (Sun)
  63424170000, #    local_end 2010-10-31 01:00:00 (Sun)
  -14400,
  1,
  'CDT',
      ],
      [
  63424184400, #    utc_start 2010-10-31 05:00:00 (Sun)
  63436280400, #      utc_end 2011-03-20 05:00:00 (Sun)
  63424166400, #  local_start 2010-10-31 00:00:00 (Sun)
  63436262400, #    local_end 2011-03-20 00:00:00 (Sun)
  -18000,
  0,
  'CST',
      ],
      [
  63436280400, #    utc_start 2011-03-20 05:00:00 (Sun)
  63456843600, #      utc_end 2011-11-13 05:00:00 (Sun)
  63436266000, #  local_start 2011-03-20 01:00:00 (Sun)
  63456829200, #    local_end 2011-11-13 01:00:00 (Sun)
  -14400,
  1,
  'CDT',
      ],
      [
  63456843600, #    utc_start 2011-11-13 05:00:00 (Sun)
  63468939600, #      utc_end 2012-04-01 05:00:00 (Sun)
  63456825600, #  local_start 2011-11-13 00:00:00 (Sun)
  63468921600, #    local_end 2012-04-01 00:00:00 (Sun)
  -18000,
  0,
  'CST',
      ],
      [
  63468939600, #    utc_start 2012-04-01 05:00:00 (Sun)
  63487688400, #      utc_end 2012-11-04 05:00:00 (Sun)
  63468925200, #  local_start 2012-04-01 01:00:00 (Sun)
  63487674000, #    local_end 2012-11-04 01:00:00 (Sun)
  -14400,
  1,
  'CDT',
      ],
      [
  63487688400, #    utc_start 2012-11-04 05:00:00 (Sun)
  63498574800, #      utc_end 2013-03-10 05:00:00 (Sun)
  63487670400, #  local_start 2012-11-04 00:00:00 (Sun)
  63498556800, #    local_end 2013-03-10 00:00:00 (Sun)
  -18000,
  0,
  'CST',
      ],
      [
  63498574800, #    utc_start 2013-03-10 05:00:00 (Sun)
  63519138000, #      utc_end 2013-11-03 05:00:00 (Sun)
  63498560400, #  local_start 2013-03-10 01:00:00 (Sun)
  63519123600, #    local_end 2013-11-03 01:00:00 (Sun)
  -14400,
  1,
  'CDT',
      ],
      [
  63519138000, #    utc_start 2013-11-03 05:00:00 (Sun)
  63530024400, #      utc_end 2014-03-09 05:00:00 (Sun)
  63519120000, #  local_start 2013-11-03 00:00:00 (Sun)
  63530006400, #    local_end 2014-03-09 00:00:00 (Sun)
  -18000,
  0,
  'CST',
      ],
      [
  63530024400, #    utc_start 2014-03-09 05:00:00 (Sun)
  63550587600, #      utc_end 2014-11-02 05:00:00 (Sun)
  63530010000, #  local_start 2014-03-09 01:00:00 (Sun)
  63550573200, #    local_end 2014-11-02 01:00:00 (Sun)
  -14400,
  1,
  'CDT',
      ],
      [
  63550587600, #    utc_start 2014-11-02 05:00:00 (Sun)
  63561474000, #      utc_end 2015-03-08 05:00:00 (Sun)
  63550569600, #  local_start 2014-11-02 00:00:00 (Sun)
  63561456000, #    local_end 2015-03-08 00:00:00 (Sun)
  -18000,
  0,
  'CST',
      ],
      [
  63561474000, #    utc_start 2015-03-08 05:00:00 (Sun)
  63582037200, #      utc_end 2015-11-01 05:00:00 (Sun)
  63561459600, #  local_start 2015-03-08 01:00:00 (Sun)
  63582022800, #    local_end 2015-11-01 01:00:00 (Sun)
  -14400,
  1,
  'CDT',
      ],
      [
  63582037200, #    utc_start 2015-11-01 05:00:00 (Sun)
  63593528400, #      utc_end 2016-03-13 05:00:00 (Sun)
  63582019200, #  local_start 2015-11-01 00:00:00 (Sun)
  63593510400, #    local_end 2016-03-13 00:00:00 (Sun)
  -18000,
  0,
  'CST',
      ],
      [
  63593528400, #    utc_start 2016-03-13 05:00:00 (Sun)
  63614091600, #      utc_end 2016-11-06 05:00:00 (Sun)
  63593514000, #  local_start 2016-03-13 01:00:00 (Sun)
  63614077200, #    local_end 2016-11-06 01:00:00 (Sun)
  -14400,
  1,
  'CDT',
      ],
      [
  63614091600, #    utc_start 2016-11-06 05:00:00 (Sun)
  63624978000, #      utc_end 2017-03-12 05:00:00 (Sun)
  63614073600, #  local_start 2016-11-06 00:00:00 (Sun)
  63624960000, #    local_end 2017-03-12 00:00:00 (Sun)
  -18000,
  0,
  'CST',
      ],
      [
  63624978000, #    utc_start 2017-03-12 05:00:00 (Sun)
  63645541200, #      utc_end 2017-11-05 05:00:00 (Sun)
  63624963600, #  local_start 2017-03-12 01:00:00 (Sun)
  63645526800, #    local_end 2017-11-05 01:00:00 (Sun)
  -14400,
  1,
  'CDT',
      ],
      [
  63645541200, #    utc_start 2017-11-05 05:00:00 (Sun)
  63656427600, #      utc_end 2018-03-11 05:00:00 (Sun)
  63645523200, #  local_start 2017-11-05 00:00:00 (Sun)
  63656409600, #    local_end 2018-03-11 00:00:00 (Sun)
  -18000,
  0,
  'CST',
      ],
      [
  63656427600, #    utc_start 2018-03-11 05:00:00 (Sun)
  63676990800, #      utc_end 2018-11-04 05:00:00 (Sun)
  63656413200, #  local_start 2018-03-11 01:00:00 (Sun)
  63676976400, #    local_end 2018-11-04 01:00:00 (Sun)
  -14400,
  1,
  'CDT',
      ],
      [
  63676990800, #    utc_start 2018-11-04 05:00:00 (Sun)
  63687877200, #      utc_end 2019-03-10 05:00:00 (Sun)
  63676972800, #  local_start 2018-11-04 00:00:00 (Sun)
  63687859200, #    local_end 2019-03-10 00:00:00 (Sun)
  -18000,
  0,
  'CST',
      ],
      [
  63687877200, #    utc_start 2019-03-10 05:00:00 (Sun)
  63708440400, #      utc_end 2019-11-03 05:00:00 (Sun)
  63687862800, #  local_start 2019-03-10 01:00:00 (Sun)
  63708426000, #    local_end 2019-11-03 01:00:00 (Sun)
  -14400,
  1,
  'CDT',
      ],
      [
  63708440400, #    utc_start 2019-11-03 05:00:00 (Sun)
  63719326800, #      utc_end 2020-03-08 05:00:00 (Sun)
  63708422400, #  local_start 2019-11-03 00:00:00 (Sun)
  63719308800, #    local_end 2020-03-08 00:00:00 (Sun)
  -18000,
  0,
  'CST',
      ],
      [
  63719326800, #    utc_start 2020-03-08 05:00:00 (Sun)
  63739890000, #      utc_end 2020-11-01 05:00:00 (Sun)
  63719312400, #  local_start 2020-03-08 01:00:00 (Sun)
  63739875600, #    local_end 2020-11-01 01:00:00 (Sun)
  -14400,
  1,
  'CDT',
      ],
      [
  63739890000, #    utc_start 2020-11-01 05:00:00 (Sun)
  63751381200, #      utc_end 2021-03-14 05:00:00 (Sun)
  63739872000, #  local_start 2020-11-01 00:00:00 (Sun)
  63751363200, #    local_end 2021-03-14 00:00:00 (Sun)
  -18000,
  0,
  'CST',
      ],
      [
  63751381200, #    utc_start 2021-03-14 05:00:00 (Sun)
  63771944400, #      utc_end 2021-11-07 05:00:00 (Sun)
  63751366800, #  local_start 2021-03-14 01:00:00 (Sun)
  63771930000, #    local_end 2021-11-07 01:00:00 (Sun)
  -14400,
  1,
  'CDT',
      ],
      [
  63771944400, #    utc_start 2021-11-07 05:00:00 (Sun)
  63782830800, #      utc_end 2022-03-13 05:00:00 (Sun)
  63771926400, #  local_start 2021-11-07 00:00:00 (Sun)
  63782812800, #    local_end 2022-03-13 00:00:00 (Sun)
  -18000,
  0,
  'CST',
      ],
      [
  63782830800, #    utc_start 2022-03-13 05:00:00 (Sun)
  63803394000, #      utc_end 2022-11-06 05:00:00 (Sun)
  63782816400, #  local_start 2022-03-13 01:00:00 (Sun)
  63803379600, #    local_end 2022-11-06 01:00:00 (Sun)
  -14400,
  1,
  'CDT',
      ],
      [
  63803394000, #    utc_start 2022-11-06 05:00:00 (Sun)
  63814280400, #      utc_end 2023-03-12 05:00:00 (Sun)
  63803376000, #  local_start 2022-11-06 00:00:00 (Sun)
  63814262400, #    local_end 2023-03-12 00:00:00 (Sun)
  -18000,
  0,
  'CST',
      ],
      [
  63814280400, #    utc_start 2023-03-12 05:00:00 (Sun)
  63834843600, #      utc_end 2023-11-05 05:00:00 (Sun)
  63814266000, #  local_start 2023-03-12 01:00:00 (Sun)
  63834829200, #    local_end 2023-11-05 01:00:00 (Sun)
  -14400,
  1,
  'CDT',
      ],
      [
  63834843600, #    utc_start 2023-11-05 05:00:00 (Sun)
  63845730000, #      utc_end 2024-03-10 05:00:00 (Sun)
  63834825600, #  local_start 2023-11-05 00:00:00 (Sun)
  63845712000, #    local_end 2024-03-10 00:00:00 (Sun)
  -18000,
  0,
  'CST',
      ],
      [
  63845730000, #    utc_start 2024-03-10 05:00:00 (Sun)
  63866293200, #      utc_end 2024-11-03 05:00:00 (Sun)
  63845715600, #  local_start 2024-03-10 01:00:00 (Sun)
  63866278800, #    local_end 2024-11-03 01:00:00 (Sun)
  -14400,
  1,
  'CDT',
      ],
      [
  63866293200, #    utc_start 2024-11-03 05:00:00 (Sun)
  63877179600, #      utc_end 2025-03-09 05:00:00 (Sun)
  63866275200, #  local_start 2024-11-03 00:00:00 (Sun)
  63877161600, #    local_end 2025-03-09 00:00:00 (Sun)
  -18000,
  0,
  'CST',
      ],
      [
  63877179600, #    utc_start 2025-03-09 05:00:00 (Sun)
  63897742800, #      utc_end 2025-11-02 05:00:00 (Sun)
  63877165200, #  local_start 2025-03-09 01:00:00 (Sun)
  63897728400, #    local_end 2025-11-02 01:00:00 (Sun)
  -14400,
  1,
  'CDT',
      ],
      [
  63897742800, #    utc_start 2025-11-02 05:00:00 (Sun)
  63908629200, #      utc_end 2026-03-08 05:00:00 (Sun)
  63897724800, #  local_start 2025-11-02 00:00:00 (Sun)
  63908611200, #    local_end 2026-03-08 00:00:00 (Sun)
  -18000,
  0,
  'CST',
      ],
      [
  63908629200, #    utc_start 2026-03-08 05:00:00 (Sun)
  63929192400, #      utc_end 2026-11-01 05:00:00 (Sun)
  63908614800, #  local_start 2026-03-08 01:00:00 (Sun)
  63929178000, #    local_end 2026-11-01 01:00:00 (Sun)
  -14400,
  1,
  'CDT',
      ],
      [
  63929192400, #    utc_start 2026-11-01 05:00:00 (Sun)
  63940683600, #      utc_end 2027-03-14 05:00:00 (Sun)
  63929174400, #  local_start 2026-11-01 00:00:00 (Sun)
  63940665600, #    local_end 2027-03-14 00:00:00 (Sun)
  -18000,
  0,
  'CST',
      ],
      [
  63940683600, #    utc_start 2027-03-14 05:00:00 (Sun)
  63961246800, #      utc_end 2027-11-07 05:00:00 (Sun)
  63940669200, #  local_start 2027-03-14 01:00:00 (Sun)
  63961232400, #    local_end 2027-11-07 01:00:00 (Sun)
  -14400,
  1,
  'CDT',
      ],
      [
  63961246800, #    utc_start 2027-11-07 05:00:00 (Sun)
  63972133200, #      utc_end 2028-03-12 05:00:00 (Sun)
  63961228800, #  local_start 2027-11-07 00:00:00 (Sun)
  63972115200, #    local_end 2028-03-12 00:00:00 (Sun)
  -18000,
  0,
  'CST',
      ],
      [
  63972133200, #    utc_start 2028-03-12 05:00:00 (Sun)
  63992696400, #      utc_end 2028-11-05 05:00:00 (Sun)
  63972118800, #  local_start 2028-03-12 01:00:00 (Sun)
  63992682000, #    local_end 2028-11-05 01:00:00 (Sun)
  -14400,
  1,
  'CDT',
      ],
      [
  63992696400, #    utc_start 2028-11-05 05:00:00 (Sun)
  64003582800, #      utc_end 2029-03-11 05:00:00 (Sun)
  63992678400, #  local_start 2028-11-05 00:00:00 (Sun)
  64003564800, #    local_end 2029-03-11 00:00:00 (Sun)
  -18000,
  0,
  'CST',
      ],
      [
  64003582800, #    utc_start 2029-03-11 05:00:00 (Sun)
  64024146000, #      utc_end 2029-11-04 05:00:00 (Sun)
  64003568400, #  local_start 2029-03-11 01:00:00 (Sun)
  64024131600, #    local_end 2029-11-04 01:00:00 (Sun)
  -14400,
  1,
  'CDT',
      ],
      [
  64024146000, #    utc_start 2029-11-04 05:00:00 (Sun)
  64035032400, #      utc_end 2030-03-10 05:00:00 (Sun)
  64024128000, #  local_start 2029-11-04 00:00:00 (Sun)
  64035014400, #    local_end 2030-03-10 00:00:00 (Sun)
  -18000,
  0,
  'CST',
      ],
      [
  64035032400, #    utc_start 2030-03-10 05:00:00 (Sun)
  64055595600, #      utc_end 2030-11-03 05:00:00 (Sun)
  64035018000, #  local_start 2030-03-10 01:00:00 (Sun)
  64055581200, #    local_end 2030-11-03 01:00:00 (Sun)
  -14400,
  1,
  'CDT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {70}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -18000 }
  
  my $last_observance = bless( {
    'format' => 'C%sT',
    'gmtoff' => '-5:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 702926,
      'local_rd_secs' => 44976,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 702926,
      'utc_rd_secs' => 44976,
      'utc_year' => 1926
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -18000,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 702926,
      'local_rd_secs' => 62976,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 702926,
      'utc_rd_secs' => 62976,
      'utc_year' => 1926
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '0:00s',
      'from' => '2013',
      'in' => 'Mar',
      'letter' => 'D',
      'name' => 'Cuba',
      'offset_from_std' => 3600,
      'on' => 'Sun>=8',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '0:00s',
      'from' => '2012',
      'in' => 'Nov',
      'letter' => 'S',
      'name' => 'Cuba',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_HAVANA

    $main::fatpacked{"DateTime/TimeZone/America/Hermosillo.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_HERMOSILLO';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Hermosillo;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Hermosillo::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60620943600, #      utc_end 1922-01-01 07:00:00 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60620916968, #    local_end 1921-12-31 23:36:08 (Sat)
  -26632,
  0,
  'LMT',
      ],
      [
  60620943600, #    utc_start 1922-01-01 07:00:00 (Sun)
  60792616800, #      utc_end 1927-06-11 06:00:00 (Sat)
  60620918400, #  local_start 1922-01-01 00:00:00 (Sun)
  60792591600, #    local_end 1927-06-10 23:00:00 (Fri)
  -25200,
  0,
  'MST',
      ],
      [
  60792616800, #    utc_start 1927-06-11 06:00:00 (Sat)
  60900876000, #      utc_end 1930-11-15 06:00:00 (Sat)
  60792595200, #  local_start 1927-06-11 00:00:00 (Sat)
  60900854400, #    local_end 1930-11-15 00:00:00 (Sat)
  -21600,
  0,
  'CST',
      ],
      [
  60900876000, #    utc_start 1930-11-15 06:00:00 (Sat)
  60915391200, #      utc_end 1931-05-02 06:00:00 (Sat)
  60900850800, #  local_start 1930-11-14 23:00:00 (Fri)
  60915366000, #    local_end 1931-05-01 23:00:00 (Fri)
  -25200,
  0,
  'MST',
      ],
      [
  60915391200, #    utc_start 1931-05-02 06:00:00 (Sat)
  60928524000, #      utc_end 1931-10-01 06:00:00 (Thu)
  60915369600, #  local_start 1931-05-02 00:00:00 (Sat)
  60928502400, #    local_end 1931-10-01 00:00:00 (Thu)
  -21600,
  0,
  'CST',
      ],
      [
  60928524000, #    utc_start 1931-10-01 06:00:00 (Thu)
  60944338800, #      utc_end 1932-04-01 07:00:00 (Fri)
  60928498800, #  local_start 1931-09-30 23:00:00 (Wed)
  60944313600, #    local_end 1932-04-01 00:00:00 (Fri)
  -25200,
  0,
  'MST',
      ],
      [
  60944338800, #    utc_start 1932-04-01 07:00:00 (Fri)
  61261855200, #      utc_end 1942-04-24 06:00:00 (Fri)
  60944317200, #  local_start 1932-04-01 01:00:00 (Fri)
  61261833600, #    local_end 1942-04-24 00:00:00 (Fri)
  -21600,
  0,
  'CST',
      ],
      [
  61261855200, #    utc_start 1942-04-24 06:00:00 (Fri)
  61474143600, #      utc_end 1949-01-14 07:00:00 (Fri)
  61261830000, #  local_start 1942-04-23 23:00:00 (Thu)
  61474118400, #    local_end 1949-01-14 00:00:00 (Fri)
  -25200,
  0,
  'MST',
      ],
      [
  61474143600, #    utc_start 1949-01-14 07:00:00 (Fri)
  62135712000, #      utc_end 1970-01-01 08:00:00 (Thu)
  61474114800, #  local_start 1949-01-13 23:00:00 (Thu)
  62135683200, #    local_end 1970-01-01 00:00:00 (Thu)
  -28800,
  0,
  'PST',
      ],
      [
  62135712000, #    utc_start 1970-01-01 08:00:00 (Thu)
  62964550800, #      utc_end 1996-04-07 09:00:00 (Sun)
  62135686800, #  local_start 1970-01-01 01:00:00 (Thu)
  62964525600, #    local_end 1996-04-07 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62964550800, #    utc_start 1996-04-07 09:00:00 (Sun)
  62982086400, #      utc_end 1996-10-27 08:00:00 (Sun)
  62964529200, #  local_start 1996-04-07 03:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62982086400, #    utc_start 1996-10-27 08:00:00 (Sun)
  62996000400, #      utc_end 1997-04-06 09:00:00 (Sun)
  62982061200, #  local_start 1996-10-27 01:00:00 (Sun)
  62995975200, #    local_end 1997-04-06 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62996000400, #    utc_start 1997-04-06 09:00:00 (Sun)
  63013536000, #      utc_end 1997-10-26 08:00:00 (Sun)
  62995978800, #  local_start 1997-04-06 03:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63013536000, #    utc_start 1997-10-26 08:00:00 (Sun)
  63027450000, #      utc_end 1998-04-05 09:00:00 (Sun)
  63013510800, #  local_start 1997-10-26 01:00:00 (Sun)
  63027424800, #    local_end 1998-04-05 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63027450000, #    utc_start 1998-04-05 09:00:00 (Sun)
  63044985600, #      utc_end 1998-10-25 08:00:00 (Sun)
  63027428400, #  local_start 1998-04-05 03:00:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63044985600, #    utc_start 1998-10-25 08:00:00 (Sun)
  63050857200, #      utc_end 1999-01-01 07:00:00 (Fri)
  63044960400, #  local_start 1998-10-25 01:00:00 (Sun)
  63050832000, #    local_end 1999-01-01 00:00:00 (Fri)
  -25200,
  0,
  'MST',
      ],
      [
  63050857200, #    utc_start 1999-01-01 07:00:00 (Fri)
  DateTime::TimeZone::INFINITY, #      utc_end
  63050832000, #  local_start 1999-01-01 00:00:00 (Fri)
  DateTime::TimeZone::INFINITY, #    local_end
  -25200,
  0,
  'MST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {3}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_HERMOSILLO

    $main::fatpacked{"DateTime/TimeZone/America/Indiana/Indianapolis.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_INDIANA_INDIANAPOLIS';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Indiana::Indianapolis;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Indiana::Indianapolis::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59418036000, #      utc_end 1883-11-18 18:00:00 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59418015322, #    local_end 1883-11-18 12:15:22 (Sun)
  -20678,
  0,
  'LMT',
      ],
      [
  59418036000, #    utc_start 1883-11-18 18:00:00 (Sun)
  60502406400, #      utc_end 1918-03-31 08:00:00 (Sun)
  59418014400, #  local_start 1883-11-18 12:00:00 (Sun)
  60502384800, #    local_end 1918-03-31 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  60502406400, #    utc_start 1918-03-31 08:00:00 (Sun)
  60520546800, #      utc_end 1918-10-27 07:00:00 (Sun)
  60502388400, #  local_start 1918-03-31 03:00:00 (Sun)
  60520528800, #    local_end 1918-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  60520546800, #    utc_start 1918-10-27 07:00:00 (Sun)
  60533856000, #      utc_end 1919-03-30 08:00:00 (Sun)
  60520525200, #  local_start 1918-10-27 01:00:00 (Sun)
  60533834400, #    local_end 1919-03-30 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  60533856000, #    utc_start 1919-03-30 08:00:00 (Sun)
  60551996400, #      utc_end 1919-10-26 07:00:00 (Sun)
  60533838000, #  local_start 1919-03-30 03:00:00 (Sun)
  60551978400, #    local_end 1919-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  60551996400, #    utc_start 1919-10-26 07:00:00 (Sun)
  60557781600, #      utc_end 1920-01-01 06:00:00 (Thu)
  60551974800, #  local_start 1919-10-26 01:00:00 (Sun)
  60557760000, #    local_end 1920-01-01 00:00:00 (Thu)
  -21600,
  0,
  'CST',
      ],
      [
  60557781600, #    utc_start 1920-01-01 06:00:00 (Thu)
  61235424000, #      utc_end 1941-06-22 08:00:00 (Sun)
  60557760000, #  local_start 1920-01-01 00:00:00 (Thu)
  61235402400, #    local_end 1941-06-22 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61235424000, #    utc_start 1941-06-22 08:00:00 (Sun)
  61243887600, #      utc_end 1941-09-28 07:00:00 (Sun)
  61235406000, #  local_start 1941-06-22 03:00:00 (Sun)
  61243869600, #    local_end 1941-09-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61243887600, #    utc_start 1941-09-28 07:00:00 (Sun)
  61252092000, #      utc_end 1942-01-01 06:00:00 (Thu)
  61243866000, #  local_start 1941-09-28 01:00:00 (Sun)
  61252070400, #    local_end 1942-01-01 00:00:00 (Thu)
  -21600,
  0,
  'CST',
      ],
      [
  61252092000, #    utc_start 1942-01-01 06:00:00 (Thu)
  61255468800, #      utc_end 1942-02-09 08:00:00 (Mon)
  61252070400, #  local_start 1942-01-01 00:00:00 (Thu)
  61255447200, #    local_end 1942-02-09 02:00:00 (Mon)
  -21600,
  0,
  'CST',
      ],
      [
  61255468800, #    utc_start 1942-02-09 08:00:00 (Mon)
  61366287600, #      utc_end 1945-08-14 23:00:00 (Tue)
  61255450800, #  local_start 1942-02-09 03:00:00 (Mon)
  61366269600, #    local_end 1945-08-14 18:00:00 (Tue)
  -18000,
  1,
  'CWT',
      ],
      [
  61366287600, #    utc_start 1945-08-14 23:00:00 (Tue)
  61370290800, #      utc_end 1945-09-30 07:00:00 (Sun)
  61366269600, #  local_start 1945-08-14 18:00:00 (Tue)
  61370272800, #    local_end 1945-09-30 02:00:00 (Sun)
  -18000,
  1,
  'CPT',
      ],
      [
  61370290800, #    utc_start 1945-09-30 07:00:00 (Sun)
  61378322400, #      utc_end 1946-01-01 06:00:00 (Tue)
  61370269200, #  local_start 1945-09-30 01:00:00 (Sun)
  61378300800, #    local_end 1946-01-01 00:00:00 (Tue)
  -21600,
  0,
  'CST',
      ],
      [
  61378322400, #    utc_start 1946-01-01 06:00:00 (Tue)
  61388438400, #      utc_end 1946-04-28 08:00:00 (Sun)
  61378300800, #  local_start 1946-01-01 00:00:00 (Tue)
  61388416800, #    local_end 1946-04-28 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61388438400, #    utc_start 1946-04-28 08:00:00 (Sun)
  61401740400, #      utc_end 1946-09-29 07:00:00 (Sun)
  61388420400, #  local_start 1946-04-28 03:00:00 (Sun)
  61401722400, #    local_end 1946-09-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61401740400, #    utc_start 1946-09-29 07:00:00 (Sun)
  61419888000, #      utc_end 1947-04-27 08:00:00 (Sun)
  61401718800, #  local_start 1946-09-29 01:00:00 (Sun)
  61419866400, #    local_end 1947-04-27 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61419888000, #    utc_start 1947-04-27 08:00:00 (Sun)
  61433190000, #      utc_end 1947-09-28 07:00:00 (Sun)
  61419870000, #  local_start 1947-04-27 03:00:00 (Sun)
  61433172000, #    local_end 1947-09-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61433190000, #    utc_start 1947-09-28 07:00:00 (Sun)
  61451337600, #      utc_end 1948-04-25 08:00:00 (Sun)
  61433168400, #  local_start 1947-09-28 01:00:00 (Sun)
  61451316000, #    local_end 1948-04-25 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61451337600, #    utc_start 1948-04-25 08:00:00 (Sun)
  61464639600, #      utc_end 1948-09-26 07:00:00 (Sun)
  61451319600, #  local_start 1948-04-25 03:00:00 (Sun)
  61464621600, #    local_end 1948-09-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61464639600, #    utc_start 1948-09-26 07:00:00 (Sun)
  61482787200, #      utc_end 1949-04-24 08:00:00 (Sun)
  61464618000, #  local_start 1948-09-26 01:00:00 (Sun)
  61482765600, #    local_end 1949-04-24 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61482787200, #    utc_start 1949-04-24 08:00:00 (Sun)
  61496089200, #      utc_end 1949-09-25 07:00:00 (Sun)
  61482769200, #  local_start 1949-04-24 03:00:00 (Sun)
  61496071200, #    local_end 1949-09-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61496089200, #    utc_start 1949-09-25 07:00:00 (Sun)
  61514841600, #      utc_end 1950-04-30 08:00:00 (Sun)
  61496067600, #  local_start 1949-09-25 01:00:00 (Sun)
  61514820000, #    local_end 1950-04-30 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61514841600, #    utc_start 1950-04-30 08:00:00 (Sun)
  61527538800, #      utc_end 1950-09-24 07:00:00 (Sun)
  61514823600, #  local_start 1950-04-30 03:00:00 (Sun)
  61527520800, #    local_end 1950-09-24 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61527538800, #    utc_start 1950-09-24 07:00:00 (Sun)
  61546291200, #      utc_end 1951-04-29 08:00:00 (Sun)
  61527517200, #  local_start 1950-09-24 01:00:00 (Sun)
  61546269600, #    local_end 1951-04-29 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61546291200, #    utc_start 1951-04-29 08:00:00 (Sun)
  61559593200, #      utc_end 1951-09-30 07:00:00 (Sun)
  61546273200, #  local_start 1951-04-29 03:00:00 (Sun)
  61559575200, #    local_end 1951-09-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61559593200, #    utc_start 1951-09-30 07:00:00 (Sun)
  61577740800, #      utc_end 1952-04-27 08:00:00 (Sun)
  61559571600, #  local_start 1951-09-30 01:00:00 (Sun)
  61577719200, #    local_end 1952-04-27 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61577740800, #    utc_start 1952-04-27 08:00:00 (Sun)
  61591042800, #      utc_end 1952-09-28 07:00:00 (Sun)
  61577722800, #  local_start 1952-04-27 03:00:00 (Sun)
  61591024800, #    local_end 1952-09-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61591042800, #    utc_start 1952-09-28 07:00:00 (Sun)
  61609190400, #      utc_end 1953-04-26 08:00:00 (Sun)
  61591021200, #  local_start 1952-09-28 01:00:00 (Sun)
  61609168800, #    local_end 1953-04-26 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61609190400, #    utc_start 1953-04-26 08:00:00 (Sun)
  61622492400, #      utc_end 1953-09-27 07:00:00 (Sun)
  61609172400, #  local_start 1953-04-26 03:00:00 (Sun)
  61622474400, #    local_end 1953-09-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61622492400, #    utc_start 1953-09-27 07:00:00 (Sun)
  61640640000, #      utc_end 1954-04-25 08:00:00 (Sun)
  61622470800, #  local_start 1953-09-27 01:00:00 (Sun)
  61640618400, #    local_end 1954-04-25 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61640640000, #    utc_start 1954-04-25 08:00:00 (Sun)
  61653942000, #      utc_end 1954-09-26 07:00:00 (Sun)
  61640622000, #  local_start 1954-04-25 03:00:00 (Sun)
  61653924000, #    local_end 1954-09-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61653942000, #    utc_start 1954-09-26 07:00:00 (Sun)
  61672089600, #      utc_end 1955-04-24 08:00:00 (Sun)
  61653920400, #  local_start 1954-09-26 01:00:00 (Sun)
  61672068000, #    local_end 1955-04-24 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61672089600, #    utc_start 1955-04-24 08:00:00 (Sun)
  61748895600, #      utc_end 1957-09-29 07:00:00 (Sun)
  61672071600, #  local_start 1955-04-24 03:00:00 (Sun)
  61748877600, #    local_end 1957-09-29 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  61748895600, #    utc_start 1957-09-29 07:00:00 (Sun)
  61767043200, #      utc_end 1958-04-27 08:00:00 (Sun)
  61748874000, #  local_start 1957-09-29 01:00:00 (Sun)
  61767021600, #    local_end 1958-04-27 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61767043200, #    utc_start 1958-04-27 08:00:00 (Sun)
  62104165200, #      utc_end 1969-01-01 05:00:00 (Wed)
  61767025200, #  local_start 1958-04-27 03:00:00 (Sun)
  62104147200, #    local_end 1969-01-01 00:00:00 (Wed)
  -18000,
  0,
  'EST',
      ],
      [
  62104165200, #    utc_start 1969-01-01 05:00:00 (Wed)
  62114194800, #      utc_end 1969-04-27 07:00:00 (Sun)
  62104147200, #  local_start 1969-01-01 00:00:00 (Wed)
  62114176800, #    local_end 1969-04-27 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62114194800, #    utc_start 1969-04-27 07:00:00 (Sun)
  62129916000, #      utc_end 1969-10-26 06:00:00 (Sun)
  62114180400, #  local_start 1969-04-27 03:00:00 (Sun)
  62129901600, #    local_end 1969-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62129916000, #    utc_start 1969-10-26 06:00:00 (Sun)
  62145644400, #      utc_end 1970-04-26 07:00:00 (Sun)
  62129898000, #  local_start 1969-10-26 01:00:00 (Sun)
  62145626400, #    local_end 1970-04-26 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62145644400, #    utc_start 1970-04-26 07:00:00 (Sun)
  62161365600, #      utc_end 1970-10-25 06:00:00 (Sun)
  62145630000, #  local_start 1970-04-26 03:00:00 (Sun)
  62161351200, #    local_end 1970-10-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62161365600, #    utc_start 1970-10-25 06:00:00 (Sun)
  62167237200, #      utc_end 1971-01-01 05:00:00 (Fri)
  62161347600, #  local_start 1970-10-25 01:00:00 (Sun)
  62167219200, #    local_end 1971-01-01 00:00:00 (Fri)
  -18000,
  0,
  'EST',
      ],
      [
  62167237200, #    utc_start 1971-01-01 05:00:00 (Fri)
  63271774800, #      utc_end 2006-01-01 05:00:00 (Sun)
  62167219200, #  local_start 1971-01-01 00:00:00 (Fri)
  63271756800, #    local_end 2006-01-01 00:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63271774800, #    utc_start 2006-01-01 05:00:00 (Sun)
  63279644400, #      utc_end 2006-04-02 07:00:00 (Sun)
  63271756800, #  local_start 2006-01-01 00:00:00 (Sun)
  63279626400, #    local_end 2006-04-02 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63279644400, #    utc_start 2006-04-02 07:00:00 (Sun)
  63297784800, #      utc_end 2006-10-29 06:00:00 (Sun)
  63279630000, #  local_start 2006-04-02 03:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63297784800, #    utc_start 2006-10-29 06:00:00 (Sun)
  63309279600, #      utc_end 2007-03-11 07:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63309261600, #    local_end 2007-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63309279600, #    utc_start 2007-03-11 07:00:00 (Sun)
  63329839200, #      utc_end 2007-11-04 06:00:00 (Sun)
  63309265200, #  local_start 2007-03-11 03:00:00 (Sun)
  63329824800, #    local_end 2007-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63329839200, #    utc_start 2007-11-04 06:00:00 (Sun)
  63340729200, #      utc_end 2008-03-09 07:00:00 (Sun)
  63329821200, #  local_start 2007-11-04 01:00:00 (Sun)
  63340711200, #    local_end 2008-03-09 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63340729200, #    utc_start 2008-03-09 07:00:00 (Sun)
  63361288800, #      utc_end 2008-11-02 06:00:00 (Sun)
  63340714800, #  local_start 2008-03-09 03:00:00 (Sun)
  63361274400, #    local_end 2008-11-02 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63361288800, #    utc_start 2008-11-02 06:00:00 (Sun)
  63372178800, #      utc_end 2009-03-08 07:00:00 (Sun)
  63361270800, #  local_start 2008-11-02 01:00:00 (Sun)
  63372160800, #    local_end 2009-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63372178800, #    utc_start 2009-03-08 07:00:00 (Sun)
  63392738400, #      utc_end 2009-11-01 06:00:00 (Sun)
  63372164400, #  local_start 2009-03-08 03:00:00 (Sun)
  63392724000, #    local_end 2009-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63392738400, #    utc_start 2009-11-01 06:00:00 (Sun)
  63404233200, #      utc_end 2010-03-14 07:00:00 (Sun)
  63392720400, #  local_start 2009-11-01 01:00:00 (Sun)
  63404215200, #    local_end 2010-03-14 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63404233200, #    utc_start 2010-03-14 07:00:00 (Sun)
  63424792800, #      utc_end 2010-11-07 06:00:00 (Sun)
  63404218800, #  local_start 2010-03-14 03:00:00 (Sun)
  63424778400, #    local_end 2010-11-07 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63424792800, #    utc_start 2010-11-07 06:00:00 (Sun)
  63435682800, #      utc_end 2011-03-13 07:00:00 (Sun)
  63424774800, #  local_start 2010-11-07 01:00:00 (Sun)
  63435664800, #    local_end 2011-03-13 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63435682800, #    utc_start 2011-03-13 07:00:00 (Sun)
  63456242400, #      utc_end 2011-11-06 06:00:00 (Sun)
  63435668400, #  local_start 2011-03-13 03:00:00 (Sun)
  63456228000, #    local_end 2011-11-06 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63456242400, #    utc_start 2011-11-06 06:00:00 (Sun)
  63467132400, #      utc_end 2012-03-11 07:00:00 (Sun)
  63456224400, #  local_start 2011-11-06 01:00:00 (Sun)
  63467114400, #    local_end 2012-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63467132400, #    utc_start 2012-03-11 07:00:00 (Sun)
  63487692000, #      utc_end 2012-11-04 06:00:00 (Sun)
  63467118000, #  local_start 2012-03-11 03:00:00 (Sun)
  63487677600, #    local_end 2012-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63487692000, #    utc_start 2012-11-04 06:00:00 (Sun)
  63498582000, #      utc_end 2013-03-10 07:00:00 (Sun)
  63487674000, #  local_start 2012-11-04 01:00:00 (Sun)
  63498564000, #    local_end 2013-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63498582000, #    utc_start 2013-03-10 07:00:00 (Sun)
  63519141600, #      utc_end 2013-11-03 06:00:00 (Sun)
  63498567600, #  local_start 2013-03-10 03:00:00 (Sun)
  63519127200, #    local_end 2013-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63519141600, #    utc_start 2013-11-03 06:00:00 (Sun)
  63530031600, #      utc_end 2014-03-09 07:00:00 (Sun)
  63519123600, #  local_start 2013-11-03 01:00:00 (Sun)
  63530013600, #    local_end 2014-03-09 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63530031600, #    utc_start 2014-03-09 07:00:00 (Sun)
  63550591200, #      utc_end 2014-11-02 06:00:00 (Sun)
  63530017200, #  local_start 2014-03-09 03:00:00 (Sun)
  63550576800, #    local_end 2014-11-02 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63550591200, #    utc_start 2014-11-02 06:00:00 (Sun)
  63561481200, #      utc_end 2015-03-08 07:00:00 (Sun)
  63550573200, #  local_start 2014-11-02 01:00:00 (Sun)
  63561463200, #    local_end 2015-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63561481200, #    utc_start 2015-03-08 07:00:00 (Sun)
  63582040800, #      utc_end 2015-11-01 06:00:00 (Sun)
  63561466800, #  local_start 2015-03-08 03:00:00 (Sun)
  63582026400, #    local_end 2015-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63582040800, #    utc_start 2015-11-01 06:00:00 (Sun)
  63593535600, #      utc_end 2016-03-13 07:00:00 (Sun)
  63582022800, #  local_start 2015-11-01 01:00:00 (Sun)
  63593517600, #    local_end 2016-03-13 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63593535600, #    utc_start 2016-03-13 07:00:00 (Sun)
  63614095200, #      utc_end 2016-11-06 06:00:00 (Sun)
  63593521200, #  local_start 2016-03-13 03:00:00 (Sun)
  63614080800, #    local_end 2016-11-06 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63614095200, #    utc_start 2016-11-06 06:00:00 (Sun)
  63624985200, #      utc_end 2017-03-12 07:00:00 (Sun)
  63614077200, #  local_start 2016-11-06 01:00:00 (Sun)
  63624967200, #    local_end 2017-03-12 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63624985200, #    utc_start 2017-03-12 07:00:00 (Sun)
  63645544800, #      utc_end 2017-11-05 06:00:00 (Sun)
  63624970800, #  local_start 2017-03-12 03:00:00 (Sun)
  63645530400, #    local_end 2017-11-05 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63645544800, #    utc_start 2017-11-05 06:00:00 (Sun)
  63656434800, #      utc_end 2018-03-11 07:00:00 (Sun)
  63645526800, #  local_start 2017-11-05 01:00:00 (Sun)
  63656416800, #    local_end 2018-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63656434800, #    utc_start 2018-03-11 07:00:00 (Sun)
  63676994400, #      utc_end 2018-11-04 06:00:00 (Sun)
  63656420400, #  local_start 2018-03-11 03:00:00 (Sun)
  63676980000, #    local_end 2018-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63676994400, #    utc_start 2018-11-04 06:00:00 (Sun)
  63687884400, #      utc_end 2019-03-10 07:00:00 (Sun)
  63676976400, #  local_start 2018-11-04 01:00:00 (Sun)
  63687866400, #    local_end 2019-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63687884400, #    utc_start 2019-03-10 07:00:00 (Sun)
  63708444000, #      utc_end 2019-11-03 06:00:00 (Sun)
  63687870000, #  local_start 2019-03-10 03:00:00 (Sun)
  63708429600, #    local_end 2019-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63708444000, #    utc_start 2019-11-03 06:00:00 (Sun)
  63719334000, #      utc_end 2020-03-08 07:00:00 (Sun)
  63708426000, #  local_start 2019-11-03 01:00:00 (Sun)
  63719316000, #    local_end 2020-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63719334000, #    utc_start 2020-03-08 07:00:00 (Sun)
  63739893600, #      utc_end 2020-11-01 06:00:00 (Sun)
  63719319600, #  local_start 2020-03-08 03:00:00 (Sun)
  63739879200, #    local_end 2020-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63739893600, #    utc_start 2020-11-01 06:00:00 (Sun)
  63751388400, #      utc_end 2021-03-14 07:00:00 (Sun)
  63739875600, #  local_start 2020-11-01 01:00:00 (Sun)
  63751370400, #    local_end 2021-03-14 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63751388400, #    utc_start 2021-03-14 07:00:00 (Sun)
  63771948000, #      utc_end 2021-11-07 06:00:00 (Sun)
  63751374000, #  local_start 2021-03-14 03:00:00 (Sun)
  63771933600, #    local_end 2021-11-07 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63771948000, #    utc_start 2021-11-07 06:00:00 (Sun)
  63782838000, #      utc_end 2022-03-13 07:00:00 (Sun)
  63771930000, #  local_start 2021-11-07 01:00:00 (Sun)
  63782820000, #    local_end 2022-03-13 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63782838000, #    utc_start 2022-03-13 07:00:00 (Sun)
  63803397600, #      utc_end 2022-11-06 06:00:00 (Sun)
  63782823600, #  local_start 2022-03-13 03:00:00 (Sun)
  63803383200, #    local_end 2022-11-06 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63803397600, #    utc_start 2022-11-06 06:00:00 (Sun)
  63814287600, #      utc_end 2023-03-12 07:00:00 (Sun)
  63803379600, #  local_start 2022-11-06 01:00:00 (Sun)
  63814269600, #    local_end 2023-03-12 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63814287600, #    utc_start 2023-03-12 07:00:00 (Sun)
  63834847200, #      utc_end 2023-11-05 06:00:00 (Sun)
  63814273200, #  local_start 2023-03-12 03:00:00 (Sun)
  63834832800, #    local_end 2023-11-05 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63834847200, #    utc_start 2023-11-05 06:00:00 (Sun)
  63845737200, #      utc_end 2024-03-10 07:00:00 (Sun)
  63834829200, #  local_start 2023-11-05 01:00:00 (Sun)
  63845719200, #    local_end 2024-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63845737200, #    utc_start 2024-03-10 07:00:00 (Sun)
  63866296800, #      utc_end 2024-11-03 06:00:00 (Sun)
  63845722800, #  local_start 2024-03-10 03:00:00 (Sun)
  63866282400, #    local_end 2024-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63866296800, #    utc_start 2024-11-03 06:00:00 (Sun)
  63877186800, #      utc_end 2025-03-09 07:00:00 (Sun)
  63866278800, #  local_start 2024-11-03 01:00:00 (Sun)
  63877168800, #    local_end 2025-03-09 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63877186800, #    utc_start 2025-03-09 07:00:00 (Sun)
  63897746400, #      utc_end 2025-11-02 06:00:00 (Sun)
  63877172400, #  local_start 2025-03-09 03:00:00 (Sun)
  63897732000, #    local_end 2025-11-02 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63897746400, #    utc_start 2025-11-02 06:00:00 (Sun)
  63908636400, #      utc_end 2026-03-08 07:00:00 (Sun)
  63897728400, #  local_start 2025-11-02 01:00:00 (Sun)
  63908618400, #    local_end 2026-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63908636400, #    utc_start 2026-03-08 07:00:00 (Sun)
  63929196000, #      utc_end 2026-11-01 06:00:00 (Sun)
  63908622000, #  local_start 2026-03-08 03:00:00 (Sun)
  63929181600, #    local_end 2026-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63929196000, #    utc_start 2026-11-01 06:00:00 (Sun)
  63940690800, #      utc_end 2027-03-14 07:00:00 (Sun)
  63929178000, #  local_start 2026-11-01 01:00:00 (Sun)
  63940672800, #    local_end 2027-03-14 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63940690800, #    utc_start 2027-03-14 07:00:00 (Sun)
  63961250400, #      utc_end 2027-11-07 06:00:00 (Sun)
  63940676400, #  local_start 2027-03-14 03:00:00 (Sun)
  63961236000, #    local_end 2027-11-07 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63961250400, #    utc_start 2027-11-07 06:00:00 (Sun)
  63972140400, #      utc_end 2028-03-12 07:00:00 (Sun)
  63961232400, #  local_start 2027-11-07 01:00:00 (Sun)
  63972122400, #    local_end 2028-03-12 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63972140400, #    utc_start 2028-03-12 07:00:00 (Sun)
  63992700000, #      utc_end 2028-11-05 06:00:00 (Sun)
  63972126000, #  local_start 2028-03-12 03:00:00 (Sun)
  63992685600, #    local_end 2028-11-05 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63992700000, #    utc_start 2028-11-05 06:00:00 (Sun)
  64003590000, #      utc_end 2029-03-11 07:00:00 (Sun)
  63992682000, #  local_start 2028-11-05 01:00:00 (Sun)
  64003572000, #    local_end 2029-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  64003590000, #    utc_start 2029-03-11 07:00:00 (Sun)
  64024149600, #      utc_end 2029-11-04 06:00:00 (Sun)
  64003575600, #  local_start 2029-03-11 03:00:00 (Sun)
  64024135200, #    local_end 2029-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  64024149600, #    utc_start 2029-11-04 06:00:00 (Sun)
  64035039600, #      utc_end 2030-03-10 07:00:00 (Sun)
  64024131600, #  local_start 2029-11-04 01:00:00 (Sun)
  64035021600, #    local_end 2030-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  64035039600, #    utc_start 2030-03-10 07:00:00 (Sun)
  64055599200, #      utc_end 2030-11-03 06:00:00 (Sun)
  64035025200, #  local_start 2030-03-10 03:00:00 (Sun)
  64055584800, #    local_end 2030-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {41}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -18000 }
  
  my $last_observance = bless( {
    'format' => 'E%sT',
    'gmtoff' => '-5:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 732312,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 732312,
      'utc_rd_secs' => 0,
      'utc_year' => 2007
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -18000,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 732312,
      'local_rd_secs' => 18000,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 732312,
      'utc_rd_secs' => 18000,
      'utc_year' => 2007
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Mar',
      'letter' => 'D',
      'name' => 'US',
      'offset_from_std' => 3600,
      'on' => 'Sun>=8',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Nov',
      'letter' => 'S',
      'name' => 'US',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_INDIANA_INDIANAPOLIS

    $main::fatpacked{"DateTime/TimeZone/America/Indiana/Knox.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_INDIANA_KNOX';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Indiana::Knox;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Indiana::Knox::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59418036000, #      utc_end 1883-11-18 18:00:00 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59418015210, #    local_end 1883-11-18 12:13:30 (Sun)
  -20790,
  0,
  'LMT',
      ],
      [
  59418036000, #    utc_start 1883-11-18 18:00:00 (Sun)
  60502406400, #      utc_end 1918-03-31 08:00:00 (Sun)
  59418014400, #  local_start 1883-11-18 12:00:00 (Sun)
  60502384800, #    local_end 1918-03-31 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  60502406400, #    utc_start 1918-03-31 08:00:00 (Sun)
  60520546800, #      utc_end 1918-10-27 07:00:00 (Sun)
  60502388400, #  local_start 1918-03-31 03:00:00 (Sun)
  60520528800, #    local_end 1918-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  60520546800, #    utc_start 1918-10-27 07:00:00 (Sun)
  60533856000, #      utc_end 1919-03-30 08:00:00 (Sun)
  60520525200, #  local_start 1918-10-27 01:00:00 (Sun)
  60533834400, #    local_end 1919-03-30 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  60533856000, #    utc_start 1919-03-30 08:00:00 (Sun)
  60551996400, #      utc_end 1919-10-26 07:00:00 (Sun)
  60533838000, #  local_start 1919-03-30 03:00:00 (Sun)
  60551978400, #    local_end 1919-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  60551996400, #    utc_start 1919-10-26 07:00:00 (Sun)
  61255468800, #      utc_end 1942-02-09 08:00:00 (Mon)
  60551974800, #  local_start 1919-10-26 01:00:00 (Sun)
  61255447200, #    local_end 1942-02-09 02:00:00 (Mon)
  -21600,
  0,
  'CST',
      ],
      [
  61255468800, #    utc_start 1942-02-09 08:00:00 (Mon)
  61366287600, #      utc_end 1945-08-14 23:00:00 (Tue)
  61255450800, #  local_start 1942-02-09 03:00:00 (Mon)
  61366269600, #    local_end 1945-08-14 18:00:00 (Tue)
  -18000,
  1,
  'CWT',
      ],
      [
  61366287600, #    utc_start 1945-08-14 23:00:00 (Tue)
  61370290800, #      utc_end 1945-09-30 07:00:00 (Sun)
  61366269600, #  local_start 1945-08-14 18:00:00 (Tue)
  61370272800, #    local_end 1945-09-30 02:00:00 (Sun)
  -18000,
  1,
  'CPT',
      ],
      [
  61370290800, #    utc_start 1945-09-30 07:00:00 (Sun)
  61409858400, #      utc_end 1947-01-01 06:00:00 (Wed)
  61370269200, #  local_start 1945-09-30 01:00:00 (Sun)
  61409836800, #    local_end 1947-01-01 00:00:00 (Wed)
  -21600,
  0,
  'CST',
      ],
      [
  61409858400, #    utc_start 1947-01-01 06:00:00 (Wed)
  61419888000, #      utc_end 1947-04-27 08:00:00 (Sun)
  61409836800, #  local_start 1947-01-01 00:00:00 (Wed)
  61419866400, #    local_end 1947-04-27 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61419888000, #    utc_start 1947-04-27 08:00:00 (Sun)
  61433190000, #      utc_end 1947-09-28 07:00:00 (Sun)
  61419870000, #  local_start 1947-04-27 03:00:00 (Sun)
  61433172000, #    local_end 1947-09-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61433190000, #    utc_start 1947-09-28 07:00:00 (Sun)
  61451337600, #      utc_end 1948-04-25 08:00:00 (Sun)
  61433168400, #  local_start 1947-09-28 01:00:00 (Sun)
  61451316000, #    local_end 1948-04-25 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61451337600, #    utc_start 1948-04-25 08:00:00 (Sun)
  61464639600, #      utc_end 1948-09-26 07:00:00 (Sun)
  61451319600, #  local_start 1948-04-25 03:00:00 (Sun)
  61464621600, #    local_end 1948-09-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61464639600, #    utc_start 1948-09-26 07:00:00 (Sun)
  61482787200, #      utc_end 1949-04-24 08:00:00 (Sun)
  61464618000, #  local_start 1948-09-26 01:00:00 (Sun)
  61482765600, #    local_end 1949-04-24 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61482787200, #    utc_start 1949-04-24 08:00:00 (Sun)
  61496089200, #      utc_end 1949-09-25 07:00:00 (Sun)
  61482769200, #  local_start 1949-04-24 03:00:00 (Sun)
  61496071200, #    local_end 1949-09-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61496089200, #    utc_start 1949-09-25 07:00:00 (Sun)
  61514841600, #      utc_end 1950-04-30 08:00:00 (Sun)
  61496067600, #  local_start 1949-09-25 01:00:00 (Sun)
  61514820000, #    local_end 1950-04-30 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61514841600, #    utc_start 1950-04-30 08:00:00 (Sun)
  61527538800, #      utc_end 1950-09-24 07:00:00 (Sun)
  61514823600, #  local_start 1950-04-30 03:00:00 (Sun)
  61527520800, #    local_end 1950-09-24 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61527538800, #    utc_start 1950-09-24 07:00:00 (Sun)
  61546291200, #      utc_end 1951-04-29 08:00:00 (Sun)
  61527517200, #  local_start 1950-09-24 01:00:00 (Sun)
  61546269600, #    local_end 1951-04-29 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61546291200, #    utc_start 1951-04-29 08:00:00 (Sun)
  61559593200, #      utc_end 1951-09-30 07:00:00 (Sun)
  61546273200, #  local_start 1951-04-29 03:00:00 (Sun)
  61559575200, #    local_end 1951-09-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61559593200, #    utc_start 1951-09-30 07:00:00 (Sun)
  61577740800, #      utc_end 1952-04-27 08:00:00 (Sun)
  61559571600, #  local_start 1951-09-30 01:00:00 (Sun)
  61577719200, #    local_end 1952-04-27 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61577740800, #    utc_start 1952-04-27 08:00:00 (Sun)
  61591042800, #      utc_end 1952-09-28 07:00:00 (Sun)
  61577722800, #  local_start 1952-04-27 03:00:00 (Sun)
  61591024800, #    local_end 1952-09-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61591042800, #    utc_start 1952-09-28 07:00:00 (Sun)
  61609190400, #      utc_end 1953-04-26 08:00:00 (Sun)
  61591021200, #  local_start 1952-09-28 01:00:00 (Sun)
  61609168800, #    local_end 1953-04-26 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61609190400, #    utc_start 1953-04-26 08:00:00 (Sun)
  61622492400, #      utc_end 1953-09-27 07:00:00 (Sun)
  61609172400, #  local_start 1953-04-26 03:00:00 (Sun)
  61622474400, #    local_end 1953-09-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61622492400, #    utc_start 1953-09-27 07:00:00 (Sun)
  61640640000, #      utc_end 1954-04-25 08:00:00 (Sun)
  61622470800, #  local_start 1953-09-27 01:00:00 (Sun)
  61640618400, #    local_end 1954-04-25 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61640640000, #    utc_start 1954-04-25 08:00:00 (Sun)
  61653942000, #      utc_end 1954-09-26 07:00:00 (Sun)
  61640622000, #  local_start 1954-04-25 03:00:00 (Sun)
  61653924000, #    local_end 1954-09-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61653942000, #    utc_start 1954-09-26 07:00:00 (Sun)
  61672089600, #      utc_end 1955-04-24 08:00:00 (Sun)
  61653920400, #  local_start 1954-09-26 01:00:00 (Sun)
  61672068000, #    local_end 1955-04-24 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61672089600, #    utc_start 1955-04-24 08:00:00 (Sun)
  61688415600, #      utc_end 1955-10-30 07:00:00 (Sun)
  61672071600, #  local_start 1955-04-24 03:00:00 (Sun)
  61688397600, #    local_end 1955-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61688415600, #    utc_start 1955-10-30 07:00:00 (Sun)
  61704144000, #      utc_end 1956-04-29 08:00:00 (Sun)
  61688394000, #  local_start 1955-10-30 01:00:00 (Sun)
  61704122400, #    local_end 1956-04-29 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61704144000, #    utc_start 1956-04-29 08:00:00 (Sun)
  61719865200, #      utc_end 1956-10-28 07:00:00 (Sun)
  61704126000, #  local_start 1956-04-29 03:00:00 (Sun)
  61719847200, #    local_end 1956-10-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61719865200, #    utc_start 1956-10-28 07:00:00 (Sun)
  61735593600, #      utc_end 1957-04-28 08:00:00 (Sun)
  61719843600, #  local_start 1956-10-28 01:00:00 (Sun)
  61735572000, #    local_end 1957-04-28 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61735593600, #    utc_start 1957-04-28 08:00:00 (Sun)
  61748895600, #      utc_end 1957-09-29 07:00:00 (Sun)
  61735575600, #  local_start 1957-04-28 03:00:00 (Sun)
  61748877600, #    local_end 1957-09-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61748895600, #    utc_start 1957-09-29 07:00:00 (Sun)
  61767043200, #      utc_end 1958-04-27 08:00:00 (Sun)
  61748874000, #  local_start 1957-09-29 01:00:00 (Sun)
  61767021600, #    local_end 1958-04-27 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61767043200, #    utc_start 1958-04-27 08:00:00 (Sun)
  61780345200, #      utc_end 1958-09-28 07:00:00 (Sun)
  61767025200, #  local_start 1958-04-27 03:00:00 (Sun)
  61780327200, #    local_end 1958-09-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61780345200, #    utc_start 1958-09-28 07:00:00 (Sun)
  61798492800, #      utc_end 1959-04-26 08:00:00 (Sun)
  61780323600, #  local_start 1958-09-28 01:00:00 (Sun)
  61798471200, #    local_end 1959-04-26 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61798492800, #    utc_start 1959-04-26 08:00:00 (Sun)
  61814214000, #      utc_end 1959-10-25 07:00:00 (Sun)
  61798474800, #  local_start 1959-04-26 03:00:00 (Sun)
  61814196000, #    local_end 1959-10-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61814214000, #    utc_start 1959-10-25 07:00:00 (Sun)
  61829942400, #      utc_end 1960-04-24 08:00:00 (Sun)
  61814192400, #  local_start 1959-10-25 01:00:00 (Sun)
  61829920800, #    local_end 1960-04-24 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61829942400, #    utc_start 1960-04-24 08:00:00 (Sun)
  61846268400, #      utc_end 1960-10-30 07:00:00 (Sun)
  61829924400, #  local_start 1960-04-24 03:00:00 (Sun)
  61846250400, #    local_end 1960-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61846268400, #    utc_start 1960-10-30 07:00:00 (Sun)
  61861996800, #      utc_end 1961-04-30 08:00:00 (Sun)
  61846246800, #  local_start 1960-10-30 01:00:00 (Sun)
  61861975200, #    local_end 1961-04-30 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61861996800, #    utc_start 1961-04-30 08:00:00 (Sun)
  61877718000, #      utc_end 1961-10-29 07:00:00 (Sun)
  61861978800, #  local_start 1961-04-30 03:00:00 (Sun)
  61877700000, #    local_end 1961-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61877718000, #    utc_start 1961-10-29 07:00:00 (Sun)
  61893446400, #      utc_end 1962-04-29 08:00:00 (Sun)
  61877696400, #  local_start 1961-10-29 01:00:00 (Sun)
  61893424800, #    local_end 1962-04-29 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61893446400, #    utc_start 1962-04-29 08:00:00 (Sun)
  61940617200, #      utc_end 1963-10-27 07:00:00 (Sun)
  61893428400, #  local_start 1962-04-29 03:00:00 (Sun)
  61940599200, #    local_end 1963-10-27 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  61940617200, #    utc_start 1963-10-27 07:00:00 (Sun)
  62051299200, #      utc_end 1967-04-30 08:00:00 (Sun)
  61940595600, #  local_start 1963-10-27 01:00:00 (Sun)
  62051277600, #    local_end 1967-04-30 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62051299200, #    utc_start 1967-04-30 08:00:00 (Sun)
  62067020400, #      utc_end 1967-10-29 07:00:00 (Sun)
  62051281200, #  local_start 1967-04-30 03:00:00 (Sun)
  62067002400, #    local_end 1967-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62067020400, #    utc_start 1967-10-29 07:00:00 (Sun)
  62082748800, #      utc_end 1968-04-28 08:00:00 (Sun)
  62066998800, #  local_start 1967-10-29 01:00:00 (Sun)
  62082727200, #    local_end 1968-04-28 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62082748800, #    utc_start 1968-04-28 08:00:00 (Sun)
  62098470000, #      utc_end 1968-10-27 07:00:00 (Sun)
  62082730800, #  local_start 1968-04-28 03:00:00 (Sun)
  62098452000, #    local_end 1968-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62098470000, #    utc_start 1968-10-27 07:00:00 (Sun)
  62114198400, #      utc_end 1969-04-27 08:00:00 (Sun)
  62098448400, #  local_start 1968-10-27 01:00:00 (Sun)
  62114176800, #    local_end 1969-04-27 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62114198400, #    utc_start 1969-04-27 08:00:00 (Sun)
  62129919600, #      utc_end 1969-10-26 07:00:00 (Sun)
  62114180400, #  local_start 1969-04-27 03:00:00 (Sun)
  62129901600, #    local_end 1969-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62129919600, #    utc_start 1969-10-26 07:00:00 (Sun)
  62145648000, #      utc_end 1970-04-26 08:00:00 (Sun)
  62129898000, #  local_start 1969-10-26 01:00:00 (Sun)
  62145626400, #    local_end 1970-04-26 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62145648000, #    utc_start 1970-04-26 08:00:00 (Sun)
  62161369200, #      utc_end 1970-10-25 07:00:00 (Sun)
  62145630000, #  local_start 1970-04-26 03:00:00 (Sun)
  62161351200, #    local_end 1970-10-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62161369200, #    utc_start 1970-10-25 07:00:00 (Sun)
  62177097600, #      utc_end 1971-04-25 08:00:00 (Sun)
  62161347600, #  local_start 1970-10-25 01:00:00 (Sun)
  62177076000, #    local_end 1971-04-25 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62177097600, #    utc_start 1971-04-25 08:00:00 (Sun)
  62193423600, #      utc_end 1971-10-31 07:00:00 (Sun)
  62177079600, #  local_start 1971-04-25 03:00:00 (Sun)
  62193405600, #    local_end 1971-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62193423600, #    utc_start 1971-10-31 07:00:00 (Sun)
  62209152000, #      utc_end 1972-04-30 08:00:00 (Sun)
  62193402000, #  local_start 1971-10-31 01:00:00 (Sun)
  62209130400, #    local_end 1972-04-30 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62209152000, #    utc_start 1972-04-30 08:00:00 (Sun)
  62224873200, #      utc_end 1972-10-29 07:00:00 (Sun)
  62209134000, #  local_start 1972-04-30 03:00:00 (Sun)
  62224855200, #    local_end 1972-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62224873200, #    utc_start 1972-10-29 07:00:00 (Sun)
  62240601600, #      utc_end 1973-04-29 08:00:00 (Sun)
  62224851600, #  local_start 1972-10-29 01:00:00 (Sun)
  62240580000, #    local_end 1973-04-29 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62240601600, #    utc_start 1973-04-29 08:00:00 (Sun)
  62256322800, #      utc_end 1973-10-28 07:00:00 (Sun)
  62240583600, #  local_start 1973-04-29 03:00:00 (Sun)
  62256304800, #    local_end 1973-10-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62256322800, #    utc_start 1973-10-28 07:00:00 (Sun)
  62262374400, #      utc_end 1974-01-06 08:00:00 (Sun)
  62256301200, #  local_start 1973-10-28 01:00:00 (Sun)
  62262352800, #    local_end 1974-01-06 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62262374400, #    utc_start 1974-01-06 08:00:00 (Sun)
  62287772400, #      utc_end 1974-10-27 07:00:00 (Sun)
  62262356400, #  local_start 1974-01-06 03:00:00 (Sun)
  62287754400, #    local_end 1974-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62287772400, #    utc_start 1974-10-27 07:00:00 (Sun)
  62298057600, #      utc_end 1975-02-23 08:00:00 (Sun)
  62287750800, #  local_start 1974-10-27 01:00:00 (Sun)
  62298036000, #    local_end 1975-02-23 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62298057600, #    utc_start 1975-02-23 08:00:00 (Sun)
  62319222000, #      utc_end 1975-10-26 07:00:00 (Sun)
  62298039600, #  local_start 1975-02-23 03:00:00 (Sun)
  62319204000, #    local_end 1975-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62319222000, #    utc_start 1975-10-26 07:00:00 (Sun)
  62334950400, #      utc_end 1976-04-25 08:00:00 (Sun)
  62319200400, #  local_start 1975-10-26 01:00:00 (Sun)
  62334928800, #    local_end 1976-04-25 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62334950400, #    utc_start 1976-04-25 08:00:00 (Sun)
  62351276400, #      utc_end 1976-10-31 07:00:00 (Sun)
  62334932400, #  local_start 1976-04-25 03:00:00 (Sun)
  62351258400, #    local_end 1976-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62351276400, #    utc_start 1976-10-31 07:00:00 (Sun)
  62366400000, #      utc_end 1977-04-24 08:00:00 (Sun)
  62351254800, #  local_start 1976-10-31 01:00:00 (Sun)
  62366378400, #    local_end 1977-04-24 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62366400000, #    utc_start 1977-04-24 08:00:00 (Sun)
  62382726000, #      utc_end 1977-10-30 07:00:00 (Sun)
  62366382000, #  local_start 1977-04-24 03:00:00 (Sun)
  62382708000, #    local_end 1977-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62382726000, #    utc_start 1977-10-30 07:00:00 (Sun)
  62398454400, #      utc_end 1978-04-30 08:00:00 (Sun)
  62382704400, #  local_start 1977-10-30 01:00:00 (Sun)
  62398432800, #    local_end 1978-04-30 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62398454400, #    utc_start 1978-04-30 08:00:00 (Sun)
  62414175600, #      utc_end 1978-10-29 07:00:00 (Sun)
  62398436400, #  local_start 1978-04-30 03:00:00 (Sun)
  62414157600, #    local_end 1978-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62414175600, #    utc_start 1978-10-29 07:00:00 (Sun)
  62429904000, #      utc_end 1979-04-29 08:00:00 (Sun)
  62414154000, #  local_start 1978-10-29 01:00:00 (Sun)
  62429882400, #    local_end 1979-04-29 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62429904000, #    utc_start 1979-04-29 08:00:00 (Sun)
  62445625200, #      utc_end 1979-10-28 07:00:00 (Sun)
  62429886000, #  local_start 1979-04-29 03:00:00 (Sun)
  62445607200, #    local_end 1979-10-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62445625200, #    utc_start 1979-10-28 07:00:00 (Sun)
  62461353600, #      utc_end 1980-04-27 08:00:00 (Sun)
  62445603600, #  local_start 1979-10-28 01:00:00 (Sun)
  62461332000, #    local_end 1980-04-27 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62461353600, #    utc_start 1980-04-27 08:00:00 (Sun)
  62477074800, #      utc_end 1980-10-26 07:00:00 (Sun)
  62461335600, #  local_start 1980-04-27 03:00:00 (Sun)
  62477056800, #    local_end 1980-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62477074800, #    utc_start 1980-10-26 07:00:00 (Sun)
  62492803200, #      utc_end 1981-04-26 08:00:00 (Sun)
  62477053200, #  local_start 1980-10-26 01:00:00 (Sun)
  62492781600, #    local_end 1981-04-26 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62492803200, #    utc_start 1981-04-26 08:00:00 (Sun)
  62508524400, #      utc_end 1981-10-25 07:00:00 (Sun)
  62492785200, #  local_start 1981-04-26 03:00:00 (Sun)
  62508506400, #    local_end 1981-10-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62508524400, #    utc_start 1981-10-25 07:00:00 (Sun)
  62524252800, #      utc_end 1982-04-25 08:00:00 (Sun)
  62508502800, #  local_start 1981-10-25 01:00:00 (Sun)
  62524231200, #    local_end 1982-04-25 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62524252800, #    utc_start 1982-04-25 08:00:00 (Sun)
  62540578800, #      utc_end 1982-10-31 07:00:00 (Sun)
  62524234800, #  local_start 1982-04-25 03:00:00 (Sun)
  62540560800, #    local_end 1982-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62540578800, #    utc_start 1982-10-31 07:00:00 (Sun)
  62555702400, #      utc_end 1983-04-24 08:00:00 (Sun)
  62540557200, #  local_start 1982-10-31 01:00:00 (Sun)
  62555680800, #    local_end 1983-04-24 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62555702400, #    utc_start 1983-04-24 08:00:00 (Sun)
  62572028400, #      utc_end 1983-10-30 07:00:00 (Sun)
  62555684400, #  local_start 1983-04-24 03:00:00 (Sun)
  62572010400, #    local_end 1983-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62572028400, #    utc_start 1983-10-30 07:00:00 (Sun)
  62587756800, #      utc_end 1984-04-29 08:00:00 (Sun)
  62572006800, #  local_start 1983-10-30 01:00:00 (Sun)
  62587735200, #    local_end 1984-04-29 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62587756800, #    utc_start 1984-04-29 08:00:00 (Sun)
  62603478000, #      utc_end 1984-10-28 07:00:00 (Sun)
  62587738800, #  local_start 1984-04-29 03:00:00 (Sun)
  62603460000, #    local_end 1984-10-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62603478000, #    utc_start 1984-10-28 07:00:00 (Sun)
  62619206400, #      utc_end 1985-04-28 08:00:00 (Sun)
  62603456400, #  local_start 1984-10-28 01:00:00 (Sun)
  62619184800, #    local_end 1985-04-28 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62619206400, #    utc_start 1985-04-28 08:00:00 (Sun)
  62634927600, #      utc_end 1985-10-27 07:00:00 (Sun)
  62619188400, #  local_start 1985-04-28 03:00:00 (Sun)
  62634909600, #    local_end 1985-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62634927600, #    utc_start 1985-10-27 07:00:00 (Sun)
  62650656000, #      utc_end 1986-04-27 08:00:00 (Sun)
  62634906000, #  local_start 1985-10-27 01:00:00 (Sun)
  62650634400, #    local_end 1986-04-27 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62650656000, #    utc_start 1986-04-27 08:00:00 (Sun)
  62666377200, #      utc_end 1986-10-26 07:00:00 (Sun)
  62650638000, #  local_start 1986-04-27 03:00:00 (Sun)
  62666359200, #    local_end 1986-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62666377200, #    utc_start 1986-10-26 07:00:00 (Sun)
  62680291200, #      utc_end 1987-04-05 08:00:00 (Sun)
  62666355600, #  local_start 1986-10-26 01:00:00 (Sun)
  62680269600, #    local_end 1987-04-05 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62680291200, #    utc_start 1987-04-05 08:00:00 (Sun)
  62697826800, #      utc_end 1987-10-25 07:00:00 (Sun)
  62680273200, #  local_start 1987-04-05 03:00:00 (Sun)
  62697808800, #    local_end 1987-10-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62697826800, #    utc_start 1987-10-25 07:00:00 (Sun)
  62711740800, #      utc_end 1988-04-03 08:00:00 (Sun)
  62697805200, #  local_start 1987-10-25 01:00:00 (Sun)
  62711719200, #    local_end 1988-04-03 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62711740800, #    utc_start 1988-04-03 08:00:00 (Sun)
  62729881200, #      utc_end 1988-10-30 07:00:00 (Sun)
  62711722800, #  local_start 1988-04-03 03:00:00 (Sun)
  62729863200, #    local_end 1988-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62729881200, #    utc_start 1988-10-30 07:00:00 (Sun)
  62743190400, #      utc_end 1989-04-02 08:00:00 (Sun)
  62729859600, #  local_start 1988-10-30 01:00:00 (Sun)
  62743168800, #    local_end 1989-04-02 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62743190400, #    utc_start 1989-04-02 08:00:00 (Sun)
  62761330800, #      utc_end 1989-10-29 07:00:00 (Sun)
  62743172400, #  local_start 1989-04-02 03:00:00 (Sun)
  62761312800, #    local_end 1989-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62761330800, #    utc_start 1989-10-29 07:00:00 (Sun)
  62774640000, #      utc_end 1990-04-01 08:00:00 (Sun)
  62761309200, #  local_start 1989-10-29 01:00:00 (Sun)
  62774618400, #    local_end 1990-04-01 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62774640000, #    utc_start 1990-04-01 08:00:00 (Sun)
  62792780400, #      utc_end 1990-10-28 07:00:00 (Sun)
  62774622000, #  local_start 1990-04-01 03:00:00 (Sun)
  62792762400, #    local_end 1990-10-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62792780400, #    utc_start 1990-10-28 07:00:00 (Sun)
  62806694400, #      utc_end 1991-04-07 08:00:00 (Sun)
  62792758800, #  local_start 1990-10-28 01:00:00 (Sun)
  62806672800, #    local_end 1991-04-07 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62806694400, #    utc_start 1991-04-07 08:00:00 (Sun)
  62824230000, #      utc_end 1991-10-27 07:00:00 (Sun)
  62806676400, #  local_start 1991-04-07 03:00:00 (Sun)
  62824212000, #    local_end 1991-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62824230000, #    utc_start 1991-10-27 07:00:00 (Sun)
  63279644400, #      utc_end 2006-04-02 07:00:00 (Sun)
  62824212000, #  local_start 1991-10-27 02:00:00 (Sun)
  63279626400, #    local_end 2006-04-02 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63279644400, #    utc_start 2006-04-02 07:00:00 (Sun)
  63297788400, #      utc_end 2006-10-29 07:00:00 (Sun)
  63279626400, #  local_start 2006-04-02 02:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63297788400, #    utc_start 2006-10-29 07:00:00 (Sun)
  63309283200, #      utc_end 2007-03-11 08:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63309261600, #    local_end 2007-03-11 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63309283200, #    utc_start 2007-03-11 08:00:00 (Sun)
  63329842800, #      utc_end 2007-11-04 07:00:00 (Sun)
  63309265200, #  local_start 2007-03-11 03:00:00 (Sun)
  63329824800, #    local_end 2007-11-04 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63329842800, #    utc_start 2007-11-04 07:00:00 (Sun)
  63340732800, #      utc_end 2008-03-09 08:00:00 (Sun)
  63329821200, #  local_start 2007-11-04 01:00:00 (Sun)
  63340711200, #    local_end 2008-03-09 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63340732800, #    utc_start 2008-03-09 08:00:00 (Sun)
  63361292400, #      utc_end 2008-11-02 07:00:00 (Sun)
  63340714800, #  local_start 2008-03-09 03:00:00 (Sun)
  63361274400, #    local_end 2008-11-02 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63361292400, #    utc_start 2008-11-02 07:00:00 (Sun)
  63372182400, #      utc_end 2009-03-08 08:00:00 (Sun)
  63361270800, #  local_start 2008-11-02 01:00:00 (Sun)
  63372160800, #    local_end 2009-03-08 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63372182400, #    utc_start 2009-03-08 08:00:00 (Sun)
  63392742000, #      utc_end 2009-11-01 07:00:00 (Sun)
  63372164400, #  local_start 2009-03-08 03:00:00 (Sun)
  63392724000, #    local_end 2009-11-01 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63392742000, #    utc_start 2009-11-01 07:00:00 (Sun)
  63404236800, #      utc_end 2010-03-14 08:00:00 (Sun)
  63392720400, #  local_start 2009-11-01 01:00:00 (Sun)
  63404215200, #    local_end 2010-03-14 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63404236800, #    utc_start 2010-03-14 08:00:00 (Sun)
  63424796400, #      utc_end 2010-11-07 07:00:00 (Sun)
  63404218800, #  local_start 2010-03-14 03:00:00 (Sun)
  63424778400, #    local_end 2010-11-07 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63424796400, #    utc_start 2010-11-07 07:00:00 (Sun)
  63435686400, #      utc_end 2011-03-13 08:00:00 (Sun)
  63424774800, #  local_start 2010-11-07 01:00:00 (Sun)
  63435664800, #    local_end 2011-03-13 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63435686400, #    utc_start 2011-03-13 08:00:00 (Sun)
  63456246000, #      utc_end 2011-11-06 07:00:00 (Sun)
  63435668400, #  local_start 2011-03-13 03:00:00 (Sun)
  63456228000, #    local_end 2011-11-06 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63456246000, #    utc_start 2011-11-06 07:00:00 (Sun)
  63467136000, #      utc_end 2012-03-11 08:00:00 (Sun)
  63456224400, #  local_start 2011-11-06 01:00:00 (Sun)
  63467114400, #    local_end 2012-03-11 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63467136000, #    utc_start 2012-03-11 08:00:00 (Sun)
  63487695600, #      utc_end 2012-11-04 07:00:00 (Sun)
  63467118000, #  local_start 2012-03-11 03:00:00 (Sun)
  63487677600, #    local_end 2012-11-04 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63487695600, #    utc_start 2012-11-04 07:00:00 (Sun)
  63498585600, #      utc_end 2013-03-10 08:00:00 (Sun)
  63487674000, #  local_start 2012-11-04 01:00:00 (Sun)
  63498564000, #    local_end 2013-03-10 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63498585600, #    utc_start 2013-03-10 08:00:00 (Sun)
  63519145200, #      utc_end 2013-11-03 07:00:00 (Sun)
  63498567600, #  local_start 2013-03-10 03:00:00 (Sun)
  63519127200, #    local_end 2013-11-03 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63519145200, #    utc_start 2013-11-03 07:00:00 (Sun)
  63530035200, #      utc_end 2014-03-09 08:00:00 (Sun)
  63519123600, #  local_start 2013-11-03 01:00:00 (Sun)
  63530013600, #    local_end 2014-03-09 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63530035200, #    utc_start 2014-03-09 08:00:00 (Sun)
  63550594800, #      utc_end 2014-11-02 07:00:00 (Sun)
  63530017200, #  local_start 2014-03-09 03:00:00 (Sun)
  63550576800, #    local_end 2014-11-02 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63550594800, #    utc_start 2014-11-02 07:00:00 (Sun)
  63561484800, #      utc_end 2015-03-08 08:00:00 (Sun)
  63550573200, #  local_start 2014-11-02 01:00:00 (Sun)
  63561463200, #    local_end 2015-03-08 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63561484800, #    utc_start 2015-03-08 08:00:00 (Sun)
  63582044400, #      utc_end 2015-11-01 07:00:00 (Sun)
  63561466800, #  local_start 2015-03-08 03:00:00 (Sun)
  63582026400, #    local_end 2015-11-01 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63582044400, #    utc_start 2015-11-01 07:00:00 (Sun)
  63593539200, #      utc_end 2016-03-13 08:00:00 (Sun)
  63582022800, #  local_start 2015-11-01 01:00:00 (Sun)
  63593517600, #    local_end 2016-03-13 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63593539200, #    utc_start 2016-03-13 08:00:00 (Sun)
  63614098800, #      utc_end 2016-11-06 07:00:00 (Sun)
  63593521200, #  local_start 2016-03-13 03:00:00 (Sun)
  63614080800, #    local_end 2016-11-06 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63614098800, #    utc_start 2016-11-06 07:00:00 (Sun)
  63624988800, #      utc_end 2017-03-12 08:00:00 (Sun)
  63614077200, #  local_start 2016-11-06 01:00:00 (Sun)
  63624967200, #    local_end 2017-03-12 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63624988800, #    utc_start 2017-03-12 08:00:00 (Sun)
  63645548400, #      utc_end 2017-11-05 07:00:00 (Sun)
  63624970800, #  local_start 2017-03-12 03:00:00 (Sun)
  63645530400, #    local_end 2017-11-05 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63645548400, #    utc_start 2017-11-05 07:00:00 (Sun)
  63656438400, #      utc_end 2018-03-11 08:00:00 (Sun)
  63645526800, #  local_start 2017-11-05 01:00:00 (Sun)
  63656416800, #    local_end 2018-03-11 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63656438400, #    utc_start 2018-03-11 08:00:00 (Sun)
  63676998000, #      utc_end 2018-11-04 07:00:00 (Sun)
  63656420400, #  local_start 2018-03-11 03:00:00 (Sun)
  63676980000, #    local_end 2018-11-04 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63676998000, #    utc_start 2018-11-04 07:00:00 (Sun)
  63687888000, #      utc_end 2019-03-10 08:00:00 (Sun)
  63676976400, #  local_start 2018-11-04 01:00:00 (Sun)
  63687866400, #    local_end 2019-03-10 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63687888000, #    utc_start 2019-03-10 08:00:00 (Sun)
  63708447600, #      utc_end 2019-11-03 07:00:00 (Sun)
  63687870000, #  local_start 2019-03-10 03:00:00 (Sun)
  63708429600, #    local_end 2019-11-03 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63708447600, #    utc_start 2019-11-03 07:00:00 (Sun)
  63719337600, #      utc_end 2020-03-08 08:00:00 (Sun)
  63708426000, #  local_start 2019-11-03 01:00:00 (Sun)
  63719316000, #    local_end 2020-03-08 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63719337600, #    utc_start 2020-03-08 08:00:00 (Sun)
  63739897200, #      utc_end 2020-11-01 07:00:00 (Sun)
  63719319600, #  local_start 2020-03-08 03:00:00 (Sun)
  63739879200, #    local_end 2020-11-01 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63739897200, #    utc_start 2020-11-01 07:00:00 (Sun)
  63751392000, #      utc_end 2021-03-14 08:00:00 (Sun)
  63739875600, #  local_start 2020-11-01 01:00:00 (Sun)
  63751370400, #    local_end 2021-03-14 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63751392000, #    utc_start 2021-03-14 08:00:00 (Sun)
  63771951600, #      utc_end 2021-11-07 07:00:00 (Sun)
  63751374000, #  local_start 2021-03-14 03:00:00 (Sun)
  63771933600, #    local_end 2021-11-07 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63771951600, #    utc_start 2021-11-07 07:00:00 (Sun)
  63782841600, #      utc_end 2022-03-13 08:00:00 (Sun)
  63771930000, #  local_start 2021-11-07 01:00:00 (Sun)
  63782820000, #    local_end 2022-03-13 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63782841600, #    utc_start 2022-03-13 08:00:00 (Sun)
  63803401200, #      utc_end 2022-11-06 07:00:00 (Sun)
  63782823600, #  local_start 2022-03-13 03:00:00 (Sun)
  63803383200, #    local_end 2022-11-06 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63803401200, #    utc_start 2022-11-06 07:00:00 (Sun)
  63814291200, #      utc_end 2023-03-12 08:00:00 (Sun)
  63803379600, #  local_start 2022-11-06 01:00:00 (Sun)
  63814269600, #    local_end 2023-03-12 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63814291200, #    utc_start 2023-03-12 08:00:00 (Sun)
  63834850800, #      utc_end 2023-11-05 07:00:00 (Sun)
  63814273200, #  local_start 2023-03-12 03:00:00 (Sun)
  63834832800, #    local_end 2023-11-05 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63834850800, #    utc_start 2023-11-05 07:00:00 (Sun)
  63845740800, #      utc_end 2024-03-10 08:00:00 (Sun)
  63834829200, #  local_start 2023-11-05 01:00:00 (Sun)
  63845719200, #    local_end 2024-03-10 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63845740800, #    utc_start 2024-03-10 08:00:00 (Sun)
  63866300400, #      utc_end 2024-11-03 07:00:00 (Sun)
  63845722800, #  local_start 2024-03-10 03:00:00 (Sun)
  63866282400, #    local_end 2024-11-03 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63866300400, #    utc_start 2024-11-03 07:00:00 (Sun)
  63877190400, #      utc_end 2025-03-09 08:00:00 (Sun)
  63866278800, #  local_start 2024-11-03 01:00:00 (Sun)
  63877168800, #    local_end 2025-03-09 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63877190400, #    utc_start 2025-03-09 08:00:00 (Sun)
  63897750000, #      utc_end 2025-11-02 07:00:00 (Sun)
  63877172400, #  local_start 2025-03-09 03:00:00 (Sun)
  63897732000, #    local_end 2025-11-02 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63897750000, #    utc_start 2025-11-02 07:00:00 (Sun)
  63908640000, #      utc_end 2026-03-08 08:00:00 (Sun)
  63897728400, #  local_start 2025-11-02 01:00:00 (Sun)
  63908618400, #    local_end 2026-03-08 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63908640000, #    utc_start 2026-03-08 08:00:00 (Sun)
  63929199600, #      utc_end 2026-11-01 07:00:00 (Sun)
  63908622000, #  local_start 2026-03-08 03:00:00 (Sun)
  63929181600, #    local_end 2026-11-01 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63929199600, #    utc_start 2026-11-01 07:00:00 (Sun)
  63940694400, #      utc_end 2027-03-14 08:00:00 (Sun)
  63929178000, #  local_start 2026-11-01 01:00:00 (Sun)
  63940672800, #    local_end 2027-03-14 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63940694400, #    utc_start 2027-03-14 08:00:00 (Sun)
  63961254000, #      utc_end 2027-11-07 07:00:00 (Sun)
  63940676400, #  local_start 2027-03-14 03:00:00 (Sun)
  63961236000, #    local_end 2027-11-07 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63961254000, #    utc_start 2027-11-07 07:00:00 (Sun)
  63972144000, #      utc_end 2028-03-12 08:00:00 (Sun)
  63961232400, #  local_start 2027-11-07 01:00:00 (Sun)
  63972122400, #    local_end 2028-03-12 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63972144000, #    utc_start 2028-03-12 08:00:00 (Sun)
  63992703600, #      utc_end 2028-11-05 07:00:00 (Sun)
  63972126000, #  local_start 2028-03-12 03:00:00 (Sun)
  63992685600, #    local_end 2028-11-05 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63992703600, #    utc_start 2028-11-05 07:00:00 (Sun)
  64003593600, #      utc_end 2029-03-11 08:00:00 (Sun)
  63992682000, #  local_start 2028-11-05 01:00:00 (Sun)
  64003572000, #    local_end 2029-03-11 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  64003593600, #    utc_start 2029-03-11 08:00:00 (Sun)
  64024153200, #      utc_end 2029-11-04 07:00:00 (Sun)
  64003575600, #  local_start 2029-03-11 03:00:00 (Sun)
  64024135200, #    local_end 2029-11-04 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  64024153200, #    utc_start 2029-11-04 07:00:00 (Sun)
  64035043200, #      utc_end 2030-03-10 08:00:00 (Sun)
  64024131600, #  local_start 2029-11-04 01:00:00 (Sun)
  64035021600, #    local_end 2030-03-10 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  64035043200, #    utc_start 2030-03-10 08:00:00 (Sun)
  64055602800, #      utc_end 2030-11-03 07:00:00 (Sun)
  64035025200, #  local_start 2030-03-10 03:00:00 (Sun)
  64055584800, #    local_end 2030-11-03 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {69}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -21600 }
  
  my $last_observance = bless( {
    'format' => 'C%sT',
    'gmtoff' => '-6:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 732403,
      'local_rd_secs' => 7200,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 732403,
      'utc_rd_secs' => 7200,
      'utc_year' => 2007
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -21600,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 732403,
      'local_rd_secs' => 25200,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 732403,
      'utc_rd_secs' => 25200,
      'utc_year' => 2007
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Nov',
      'letter' => 'S',
      'name' => 'US',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Mar',
      'letter' => 'D',
      'name' => 'US',
      'offset_from_std' => 3600,
      'on' => 'Sun>=8',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_INDIANA_KNOX

    $main::fatpacked{"DateTime/TimeZone/America/Indiana/Marengo.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_INDIANA_MARENGO';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Indiana::Marengo;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Indiana::Marengo::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59418036000, #      utc_end 1883-11-18 18:00:00 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59418015277, #    local_end 1883-11-18 12:14:37 (Sun)
  -20723,
  0,
  'LMT',
      ],
      [
  59418036000, #    utc_start 1883-11-18 18:00:00 (Sun)
  60502406400, #      utc_end 1918-03-31 08:00:00 (Sun)
  59418014400, #  local_start 1883-11-18 12:00:00 (Sun)
  60502384800, #    local_end 1918-03-31 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  60502406400, #    utc_start 1918-03-31 08:00:00 (Sun)
  60520546800, #      utc_end 1918-10-27 07:00:00 (Sun)
  60502388400, #  local_start 1918-03-31 03:00:00 (Sun)
  60520528800, #    local_end 1918-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  60520546800, #    utc_start 1918-10-27 07:00:00 (Sun)
  60533856000, #      utc_end 1919-03-30 08:00:00 (Sun)
  60520525200, #  local_start 1918-10-27 01:00:00 (Sun)
  60533834400, #    local_end 1919-03-30 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  60533856000, #    utc_start 1919-03-30 08:00:00 (Sun)
  60551996400, #      utc_end 1919-10-26 07:00:00 (Sun)
  60533838000, #  local_start 1919-03-30 03:00:00 (Sun)
  60551978400, #    local_end 1919-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  60551996400, #    utc_start 1919-10-26 07:00:00 (Sun)
  61255468800, #      utc_end 1942-02-09 08:00:00 (Mon)
  60551974800, #  local_start 1919-10-26 01:00:00 (Sun)
  61255447200, #    local_end 1942-02-09 02:00:00 (Mon)
  -21600,
  0,
  'CST',
      ],
      [
  61255468800, #    utc_start 1942-02-09 08:00:00 (Mon)
  61366287600, #      utc_end 1945-08-14 23:00:00 (Tue)
  61255450800, #  local_start 1942-02-09 03:00:00 (Mon)
  61366269600, #    local_end 1945-08-14 18:00:00 (Tue)
  -18000,
  1,
  'CWT',
      ],
      [
  61366287600, #    utc_start 1945-08-14 23:00:00 (Tue)
  61370290800, #      utc_end 1945-09-30 07:00:00 (Sun)
  61366269600, #  local_start 1945-08-14 18:00:00 (Tue)
  61370272800, #    local_end 1945-09-30 02:00:00 (Sun)
  -18000,
  1,
  'CPT',
      ],
      [
  61370290800, #    utc_start 1945-09-30 07:00:00 (Sun)
  61536088800, #      utc_end 1951-01-01 06:00:00 (Mon)
  61370269200, #  local_start 1945-09-30 01:00:00 (Sun)
  61536067200, #    local_end 1951-01-01 00:00:00 (Mon)
  -21600,
  0,
  'CST',
      ],
      [
  61536088800, #    utc_start 1951-01-01 06:00:00 (Mon)
  61546291200, #      utc_end 1951-04-29 08:00:00 (Sun)
  61536067200, #  local_start 1951-01-01 00:00:00 (Mon)
  61546269600, #    local_end 1951-04-29 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61546291200, #    utc_start 1951-04-29 08:00:00 (Sun)
  61559593200, #      utc_end 1951-09-30 07:00:00 (Sun)
  61546273200, #  local_start 1951-04-29 03:00:00 (Sun)
  61559575200, #    local_end 1951-09-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61559593200, #    utc_start 1951-09-30 07:00:00 (Sun)
  61640640000, #      utc_end 1954-04-25 08:00:00 (Sun)
  61559571600, #  local_start 1951-09-30 01:00:00 (Sun)
  61640618400, #    local_end 1954-04-25 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61640640000, #    utc_start 1954-04-25 08:00:00 (Sun)
  61653942000, #      utc_end 1954-09-26 07:00:00 (Sun)
  61640622000, #  local_start 1954-04-25 03:00:00 (Sun)
  61653924000, #    local_end 1954-09-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61653942000, #    utc_start 1954-09-26 07:00:00 (Sun)
  61672089600, #      utc_end 1955-04-24 08:00:00 (Sun)
  61653920400, #  local_start 1954-09-26 01:00:00 (Sun)
  61672068000, #    local_end 1955-04-24 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61672089600, #    utc_start 1955-04-24 08:00:00 (Sun)
  61685391600, #      utc_end 1955-09-25 07:00:00 (Sun)
  61672071600, #  local_start 1955-04-24 03:00:00 (Sun)
  61685373600, #    local_end 1955-09-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61685391600, #    utc_start 1955-09-25 07:00:00 (Sun)
  61704144000, #      utc_end 1956-04-29 08:00:00 (Sun)
  61685370000, #  local_start 1955-09-25 01:00:00 (Sun)
  61704122400, #    local_end 1956-04-29 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61704144000, #    utc_start 1956-04-29 08:00:00 (Sun)
  61717446000, #      utc_end 1956-09-30 07:00:00 (Sun)
  61704126000, #  local_start 1956-04-29 03:00:00 (Sun)
  61717428000, #    local_end 1956-09-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61717446000, #    utc_start 1956-09-30 07:00:00 (Sun)
  61735593600, #      utc_end 1957-04-28 08:00:00 (Sun)
  61717424400, #  local_start 1956-09-30 01:00:00 (Sun)
  61735572000, #    local_end 1957-04-28 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61735593600, #    utc_start 1957-04-28 08:00:00 (Sun)
  61748895600, #      utc_end 1957-09-29 07:00:00 (Sun)
  61735575600, #  local_start 1957-04-28 03:00:00 (Sun)
  61748877600, #    local_end 1957-09-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61748895600, #    utc_start 1957-09-29 07:00:00 (Sun)
  61767043200, #      utc_end 1958-04-27 08:00:00 (Sun)
  61748874000, #  local_start 1957-09-29 01:00:00 (Sun)
  61767021600, #    local_end 1958-04-27 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61767043200, #    utc_start 1958-04-27 08:00:00 (Sun)
  61780345200, #      utc_end 1958-09-28 07:00:00 (Sun)
  61767025200, #  local_start 1958-04-27 03:00:00 (Sun)
  61780327200, #    local_end 1958-09-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61780345200, #    utc_start 1958-09-28 07:00:00 (Sun)
  61798492800, #      utc_end 1959-04-26 08:00:00 (Sun)
  61780323600, #  local_start 1958-09-28 01:00:00 (Sun)
  61798471200, #    local_end 1959-04-26 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61798492800, #    utc_start 1959-04-26 08:00:00 (Sun)
  61811794800, #      utc_end 1959-09-27 07:00:00 (Sun)
  61798474800, #  local_start 1959-04-26 03:00:00 (Sun)
  61811776800, #    local_end 1959-09-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61811794800, #    utc_start 1959-09-27 07:00:00 (Sun)
  61829942400, #      utc_end 1960-04-24 08:00:00 (Sun)
  61811773200, #  local_start 1959-09-27 01:00:00 (Sun)
  61829920800, #    local_end 1960-04-24 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61829942400, #    utc_start 1960-04-24 08:00:00 (Sun)
  61843244400, #      utc_end 1960-09-25 07:00:00 (Sun)
  61829924400, #  local_start 1960-04-24 03:00:00 (Sun)
  61843226400, #    local_end 1960-09-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61843244400, #    utc_start 1960-09-25 07:00:00 (Sun)
  61861996800, #      utc_end 1961-04-30 08:00:00 (Sun)
  61843222800, #  local_start 1960-09-25 01:00:00 (Sun)
  61861975200, #    local_end 1961-04-30 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61861996800, #    utc_start 1961-04-30 08:00:00 (Sun)
  62104165200, #      utc_end 1969-01-01 05:00:00 (Wed)
  61861978800, #  local_start 1961-04-30 03:00:00 (Sun)
  62104147200, #    local_end 1969-01-01 00:00:00 (Wed)
  -18000,
  0,
  'EST',
      ],
      [
  62104165200, #    utc_start 1969-01-01 05:00:00 (Wed)
  62114194800, #      utc_end 1969-04-27 07:00:00 (Sun)
  62104147200, #  local_start 1969-01-01 00:00:00 (Wed)
  62114176800, #    local_end 1969-04-27 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62114194800, #    utc_start 1969-04-27 07:00:00 (Sun)
  62129916000, #      utc_end 1969-10-26 06:00:00 (Sun)
  62114180400, #  local_start 1969-04-27 03:00:00 (Sun)
  62129901600, #    local_end 1969-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62129916000, #    utc_start 1969-10-26 06:00:00 (Sun)
  62145644400, #      utc_end 1970-04-26 07:00:00 (Sun)
  62129898000, #  local_start 1969-10-26 01:00:00 (Sun)
  62145626400, #    local_end 1970-04-26 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62145644400, #    utc_start 1970-04-26 07:00:00 (Sun)
  62161365600, #      utc_end 1970-10-25 06:00:00 (Sun)
  62145630000, #  local_start 1970-04-26 03:00:00 (Sun)
  62161351200, #    local_end 1970-10-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62161365600, #    utc_start 1970-10-25 06:00:00 (Sun)
  62177094000, #      utc_end 1971-04-25 07:00:00 (Sun)
  62161347600, #  local_start 1970-10-25 01:00:00 (Sun)
  62177076000, #    local_end 1971-04-25 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62177094000, #    utc_start 1971-04-25 07:00:00 (Sun)
  62193420000, #      utc_end 1971-10-31 06:00:00 (Sun)
  62177079600, #  local_start 1971-04-25 03:00:00 (Sun)
  62193405600, #    local_end 1971-10-31 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62193420000, #    utc_start 1971-10-31 06:00:00 (Sun)
  62209148400, #      utc_end 1972-04-30 07:00:00 (Sun)
  62193402000, #  local_start 1971-10-31 01:00:00 (Sun)
  62209130400, #    local_end 1972-04-30 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62209148400, #    utc_start 1972-04-30 07:00:00 (Sun)
  62224869600, #      utc_end 1972-10-29 06:00:00 (Sun)
  62209134000, #  local_start 1972-04-30 03:00:00 (Sun)
  62224855200, #    local_end 1972-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62224869600, #    utc_start 1972-10-29 06:00:00 (Sun)
  62240598000, #      utc_end 1973-04-29 07:00:00 (Sun)
  62224851600, #  local_start 1972-10-29 01:00:00 (Sun)
  62240580000, #    local_end 1973-04-29 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62240598000, #    utc_start 1973-04-29 07:00:00 (Sun)
  62256319200, #      utc_end 1973-10-28 06:00:00 (Sun)
  62240583600, #  local_start 1973-04-29 03:00:00 (Sun)
  62256304800, #    local_end 1973-10-28 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62256319200, #    utc_start 1973-10-28 06:00:00 (Sun)
  62262370800, #      utc_end 1974-01-06 07:00:00 (Sun)
  62256301200, #  local_start 1973-10-28 01:00:00 (Sun)
  62262352800, #    local_end 1974-01-06 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62262370800, #    utc_start 1974-01-06 07:00:00 (Sun)
  62287772400, #      utc_end 1974-10-27 07:00:00 (Sun)
  62262352800, #  local_start 1974-01-06 02:00:00 (Sun)
  62287754400, #    local_end 1974-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62287772400, #    utc_start 1974-10-27 07:00:00 (Sun)
  62298054000, #      utc_end 1975-02-23 07:00:00 (Sun)
  62287754400, #  local_start 1974-10-27 02:00:00 (Sun)
  62298036000, #    local_end 1975-02-23 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62298054000, #    utc_start 1975-02-23 07:00:00 (Sun)
  62319218400, #      utc_end 1975-10-26 06:00:00 (Sun)
  62298039600, #  local_start 1975-02-23 03:00:00 (Sun)
  62319204000, #    local_end 1975-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62319218400, #    utc_start 1975-10-26 06:00:00 (Sun)
  62325003600, #      utc_end 1976-01-01 05:00:00 (Thu)
  62319200400, #  local_start 1975-10-26 01:00:00 (Sun)
  62324985600, #    local_end 1976-01-01 00:00:00 (Thu)
  -18000,
  0,
  'EST',
      ],
      [
  62325003600, #    utc_start 1976-01-01 05:00:00 (Thu)
  63271774800, #      utc_end 2006-01-01 05:00:00 (Sun)
  62324985600, #  local_start 1976-01-01 00:00:00 (Thu)
  63271756800, #    local_end 2006-01-01 00:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63271774800, #    utc_start 2006-01-01 05:00:00 (Sun)
  63279644400, #      utc_end 2006-04-02 07:00:00 (Sun)
  63271756800, #  local_start 2006-01-01 00:00:00 (Sun)
  63279626400, #    local_end 2006-04-02 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63279644400, #    utc_start 2006-04-02 07:00:00 (Sun)
  63297784800, #      utc_end 2006-10-29 06:00:00 (Sun)
  63279630000, #  local_start 2006-04-02 03:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63297784800, #    utc_start 2006-10-29 06:00:00 (Sun)
  63309279600, #      utc_end 2007-03-11 07:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63309261600, #    local_end 2007-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63309279600, #    utc_start 2007-03-11 07:00:00 (Sun)
  63329839200, #      utc_end 2007-11-04 06:00:00 (Sun)
  63309265200, #  local_start 2007-03-11 03:00:00 (Sun)
  63329824800, #    local_end 2007-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63329839200, #    utc_start 2007-11-04 06:00:00 (Sun)
  63340729200, #      utc_end 2008-03-09 07:00:00 (Sun)
  63329821200, #  local_start 2007-11-04 01:00:00 (Sun)
  63340711200, #    local_end 2008-03-09 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63340729200, #    utc_start 2008-03-09 07:00:00 (Sun)
  63361288800, #      utc_end 2008-11-02 06:00:00 (Sun)
  63340714800, #  local_start 2008-03-09 03:00:00 (Sun)
  63361274400, #    local_end 2008-11-02 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63361288800, #    utc_start 2008-11-02 06:00:00 (Sun)
  63372178800, #      utc_end 2009-03-08 07:00:00 (Sun)
  63361270800, #  local_start 2008-11-02 01:00:00 (Sun)
  63372160800, #    local_end 2009-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63372178800, #    utc_start 2009-03-08 07:00:00 (Sun)
  63392738400, #      utc_end 2009-11-01 06:00:00 (Sun)
  63372164400, #  local_start 2009-03-08 03:00:00 (Sun)
  63392724000, #    local_end 2009-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63392738400, #    utc_start 2009-11-01 06:00:00 (Sun)
  63404233200, #      utc_end 2010-03-14 07:00:00 (Sun)
  63392720400, #  local_start 2009-11-01 01:00:00 (Sun)
  63404215200, #    local_end 2010-03-14 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63404233200, #    utc_start 2010-03-14 07:00:00 (Sun)
  63424792800, #      utc_end 2010-11-07 06:00:00 (Sun)
  63404218800, #  local_start 2010-03-14 03:00:00 (Sun)
  63424778400, #    local_end 2010-11-07 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63424792800, #    utc_start 2010-11-07 06:00:00 (Sun)
  63435682800, #      utc_end 2011-03-13 07:00:00 (Sun)
  63424774800, #  local_start 2010-11-07 01:00:00 (Sun)
  63435664800, #    local_end 2011-03-13 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63435682800, #    utc_start 2011-03-13 07:00:00 (Sun)
  63456242400, #      utc_end 2011-11-06 06:00:00 (Sun)
  63435668400, #  local_start 2011-03-13 03:00:00 (Sun)
  63456228000, #    local_end 2011-11-06 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63456242400, #    utc_start 2011-11-06 06:00:00 (Sun)
  63467132400, #      utc_end 2012-03-11 07:00:00 (Sun)
  63456224400, #  local_start 2011-11-06 01:00:00 (Sun)
  63467114400, #    local_end 2012-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63467132400, #    utc_start 2012-03-11 07:00:00 (Sun)
  63487692000, #      utc_end 2012-11-04 06:00:00 (Sun)
  63467118000, #  local_start 2012-03-11 03:00:00 (Sun)
  63487677600, #    local_end 2012-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63487692000, #    utc_start 2012-11-04 06:00:00 (Sun)
  63498582000, #      utc_end 2013-03-10 07:00:00 (Sun)
  63487674000, #  local_start 2012-11-04 01:00:00 (Sun)
  63498564000, #    local_end 2013-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63498582000, #    utc_start 2013-03-10 07:00:00 (Sun)
  63519141600, #      utc_end 2013-11-03 06:00:00 (Sun)
  63498567600, #  local_start 2013-03-10 03:00:00 (Sun)
  63519127200, #    local_end 2013-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63519141600, #    utc_start 2013-11-03 06:00:00 (Sun)
  63530031600, #      utc_end 2014-03-09 07:00:00 (Sun)
  63519123600, #  local_start 2013-11-03 01:00:00 (Sun)
  63530013600, #    local_end 2014-03-09 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63530031600, #    utc_start 2014-03-09 07:00:00 (Sun)
  63550591200, #      utc_end 2014-11-02 06:00:00 (Sun)
  63530017200, #  local_start 2014-03-09 03:00:00 (Sun)
  63550576800, #    local_end 2014-11-02 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63550591200, #    utc_start 2014-11-02 06:00:00 (Sun)
  63561481200, #      utc_end 2015-03-08 07:00:00 (Sun)
  63550573200, #  local_start 2014-11-02 01:00:00 (Sun)
  63561463200, #    local_end 2015-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63561481200, #    utc_start 2015-03-08 07:00:00 (Sun)
  63582040800, #      utc_end 2015-11-01 06:00:00 (Sun)
  63561466800, #  local_start 2015-03-08 03:00:00 (Sun)
  63582026400, #    local_end 2015-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63582040800, #    utc_start 2015-11-01 06:00:00 (Sun)
  63593535600, #      utc_end 2016-03-13 07:00:00 (Sun)
  63582022800, #  local_start 2015-11-01 01:00:00 (Sun)
  63593517600, #    local_end 2016-03-13 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63593535600, #    utc_start 2016-03-13 07:00:00 (Sun)
  63614095200, #      utc_end 2016-11-06 06:00:00 (Sun)
  63593521200, #  local_start 2016-03-13 03:00:00 (Sun)
  63614080800, #    local_end 2016-11-06 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63614095200, #    utc_start 2016-11-06 06:00:00 (Sun)
  63624985200, #      utc_end 2017-03-12 07:00:00 (Sun)
  63614077200, #  local_start 2016-11-06 01:00:00 (Sun)
  63624967200, #    local_end 2017-03-12 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63624985200, #    utc_start 2017-03-12 07:00:00 (Sun)
  63645544800, #      utc_end 2017-11-05 06:00:00 (Sun)
  63624970800, #  local_start 2017-03-12 03:00:00 (Sun)
  63645530400, #    local_end 2017-11-05 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63645544800, #    utc_start 2017-11-05 06:00:00 (Sun)
  63656434800, #      utc_end 2018-03-11 07:00:00 (Sun)
  63645526800, #  local_start 2017-11-05 01:00:00 (Sun)
  63656416800, #    local_end 2018-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63656434800, #    utc_start 2018-03-11 07:00:00 (Sun)
  63676994400, #      utc_end 2018-11-04 06:00:00 (Sun)
  63656420400, #  local_start 2018-03-11 03:00:00 (Sun)
  63676980000, #    local_end 2018-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63676994400, #    utc_start 2018-11-04 06:00:00 (Sun)
  63687884400, #      utc_end 2019-03-10 07:00:00 (Sun)
  63676976400, #  local_start 2018-11-04 01:00:00 (Sun)
  63687866400, #    local_end 2019-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63687884400, #    utc_start 2019-03-10 07:00:00 (Sun)
  63708444000, #      utc_end 2019-11-03 06:00:00 (Sun)
  63687870000, #  local_start 2019-03-10 03:00:00 (Sun)
  63708429600, #    local_end 2019-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63708444000, #    utc_start 2019-11-03 06:00:00 (Sun)
  63719334000, #      utc_end 2020-03-08 07:00:00 (Sun)
  63708426000, #  local_start 2019-11-03 01:00:00 (Sun)
  63719316000, #    local_end 2020-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63719334000, #    utc_start 2020-03-08 07:00:00 (Sun)
  63739893600, #      utc_end 2020-11-01 06:00:00 (Sun)
  63719319600, #  local_start 2020-03-08 03:00:00 (Sun)
  63739879200, #    local_end 2020-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63739893600, #    utc_start 2020-11-01 06:00:00 (Sun)
  63751388400, #      utc_end 2021-03-14 07:00:00 (Sun)
  63739875600, #  local_start 2020-11-01 01:00:00 (Sun)
  63751370400, #    local_end 2021-03-14 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63751388400, #    utc_start 2021-03-14 07:00:00 (Sun)
  63771948000, #      utc_end 2021-11-07 06:00:00 (Sun)
  63751374000, #  local_start 2021-03-14 03:00:00 (Sun)
  63771933600, #    local_end 2021-11-07 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63771948000, #    utc_start 2021-11-07 06:00:00 (Sun)
  63782838000, #      utc_end 2022-03-13 07:00:00 (Sun)
  63771930000, #  local_start 2021-11-07 01:00:00 (Sun)
  63782820000, #    local_end 2022-03-13 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63782838000, #    utc_start 2022-03-13 07:00:00 (Sun)
  63803397600, #      utc_end 2022-11-06 06:00:00 (Sun)
  63782823600, #  local_start 2022-03-13 03:00:00 (Sun)
  63803383200, #    local_end 2022-11-06 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63803397600, #    utc_start 2022-11-06 06:00:00 (Sun)
  63814287600, #      utc_end 2023-03-12 07:00:00 (Sun)
  63803379600, #  local_start 2022-11-06 01:00:00 (Sun)
  63814269600, #    local_end 2023-03-12 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63814287600, #    utc_start 2023-03-12 07:00:00 (Sun)
  63834847200, #      utc_end 2023-11-05 06:00:00 (Sun)
  63814273200, #  local_start 2023-03-12 03:00:00 (Sun)
  63834832800, #    local_end 2023-11-05 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63834847200, #    utc_start 2023-11-05 06:00:00 (Sun)
  63845737200, #      utc_end 2024-03-10 07:00:00 (Sun)
  63834829200, #  local_start 2023-11-05 01:00:00 (Sun)
  63845719200, #    local_end 2024-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63845737200, #    utc_start 2024-03-10 07:00:00 (Sun)
  63866296800, #      utc_end 2024-11-03 06:00:00 (Sun)
  63845722800, #  local_start 2024-03-10 03:00:00 (Sun)
  63866282400, #    local_end 2024-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63866296800, #    utc_start 2024-11-03 06:00:00 (Sun)
  63877186800, #      utc_end 2025-03-09 07:00:00 (Sun)
  63866278800, #  local_start 2024-11-03 01:00:00 (Sun)
  63877168800, #    local_end 2025-03-09 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63877186800, #    utc_start 2025-03-09 07:00:00 (Sun)
  63897746400, #      utc_end 2025-11-02 06:00:00 (Sun)
  63877172400, #  local_start 2025-03-09 03:00:00 (Sun)
  63897732000, #    local_end 2025-11-02 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63897746400, #    utc_start 2025-11-02 06:00:00 (Sun)
  63908636400, #      utc_end 2026-03-08 07:00:00 (Sun)
  63897728400, #  local_start 2025-11-02 01:00:00 (Sun)
  63908618400, #    local_end 2026-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63908636400, #    utc_start 2026-03-08 07:00:00 (Sun)
  63929196000, #      utc_end 2026-11-01 06:00:00 (Sun)
  63908622000, #  local_start 2026-03-08 03:00:00 (Sun)
  63929181600, #    local_end 2026-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63929196000, #    utc_start 2026-11-01 06:00:00 (Sun)
  63940690800, #      utc_end 2027-03-14 07:00:00 (Sun)
  63929178000, #  local_start 2026-11-01 01:00:00 (Sun)
  63940672800, #    local_end 2027-03-14 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63940690800, #    utc_start 2027-03-14 07:00:00 (Sun)
  63961250400, #      utc_end 2027-11-07 06:00:00 (Sun)
  63940676400, #  local_start 2027-03-14 03:00:00 (Sun)
  63961236000, #    local_end 2027-11-07 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63961250400, #    utc_start 2027-11-07 06:00:00 (Sun)
  63972140400, #      utc_end 2028-03-12 07:00:00 (Sun)
  63961232400, #  local_start 2027-11-07 01:00:00 (Sun)
  63972122400, #    local_end 2028-03-12 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63972140400, #    utc_start 2028-03-12 07:00:00 (Sun)
  63992700000, #      utc_end 2028-11-05 06:00:00 (Sun)
  63972126000, #  local_start 2028-03-12 03:00:00 (Sun)
  63992685600, #    local_end 2028-11-05 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63992700000, #    utc_start 2028-11-05 06:00:00 (Sun)
  64003590000, #      utc_end 2029-03-11 07:00:00 (Sun)
  63992682000, #  local_start 2028-11-05 01:00:00 (Sun)
  64003572000, #    local_end 2029-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  64003590000, #    utc_start 2029-03-11 07:00:00 (Sun)
  64024149600, #      utc_end 2029-11-04 06:00:00 (Sun)
  64003575600, #  local_start 2029-03-11 03:00:00 (Sun)
  64024135200, #    local_end 2029-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  64024149600, #    utc_start 2029-11-04 06:00:00 (Sun)
  64035039600, #      utc_end 2030-03-10 07:00:00 (Sun)
  64024131600, #  local_start 2029-11-04 01:00:00 (Sun)
  64035021600, #    local_end 2030-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  64035039600, #    utc_start 2030-03-10 07:00:00 (Sun)
  64055599200, #      utc_end 2030-11-03 06:00:00 (Sun)
  64035025200, #  local_start 2030-03-10 03:00:00 (Sun)
  64055584800, #    local_end 2030-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {44}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -18000 }
  
  my $last_observance = bless( {
    'format' => 'E%sT',
    'gmtoff' => '-5:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 732312,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 732312,
      'utc_rd_secs' => 0,
      'utc_year' => 2007
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -18000,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 732312,
      'local_rd_secs' => 18000,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 732312,
      'utc_rd_secs' => 18000,
      'utc_year' => 2007
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Nov',
      'letter' => 'S',
      'name' => 'US',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Mar',
      'letter' => 'D',
      'name' => 'US',
      'offset_from_std' => 3600,
      'on' => 'Sun>=8',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_INDIANA_MARENGO

    $main::fatpacked{"DateTime/TimeZone/America/Indiana/Petersburg.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_INDIANA_PETERSBURG';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Indiana::Petersburg;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Indiana::Petersburg::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59418036000, #      utc_end 1883-11-18 18:00:00 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59418015053, #    local_end 1883-11-18 12:10:53 (Sun)
  -20947,
  0,
  'LMT',
      ],
      [
  59418036000, #    utc_start 1883-11-18 18:00:00 (Sun)
  60502406400, #      utc_end 1918-03-31 08:00:00 (Sun)
  59418014400, #  local_start 1883-11-18 12:00:00 (Sun)
  60502384800, #    local_end 1918-03-31 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  60502406400, #    utc_start 1918-03-31 08:00:00 (Sun)
  60520546800, #      utc_end 1918-10-27 07:00:00 (Sun)
  60502388400, #  local_start 1918-03-31 03:00:00 (Sun)
  60520528800, #    local_end 1918-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  60520546800, #    utc_start 1918-10-27 07:00:00 (Sun)
  60533856000, #      utc_end 1919-03-30 08:00:00 (Sun)
  60520525200, #  local_start 1918-10-27 01:00:00 (Sun)
  60533834400, #    local_end 1919-03-30 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  60533856000, #    utc_start 1919-03-30 08:00:00 (Sun)
  60551996400, #      utc_end 1919-10-26 07:00:00 (Sun)
  60533838000, #  local_start 1919-03-30 03:00:00 (Sun)
  60551978400, #    local_end 1919-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  60551996400, #    utc_start 1919-10-26 07:00:00 (Sun)
  61255468800, #      utc_end 1942-02-09 08:00:00 (Mon)
  60551974800, #  local_start 1919-10-26 01:00:00 (Sun)
  61255447200, #    local_end 1942-02-09 02:00:00 (Mon)
  -21600,
  0,
  'CST',
      ],
      [
  61255468800, #    utc_start 1942-02-09 08:00:00 (Mon)
  61366287600, #      utc_end 1945-08-14 23:00:00 (Tue)
  61255450800, #  local_start 1942-02-09 03:00:00 (Mon)
  61366269600, #    local_end 1945-08-14 18:00:00 (Tue)
  -18000,
  1,
  'CWT',
      ],
      [
  61366287600, #    utc_start 1945-08-14 23:00:00 (Tue)
  61370290800, #      utc_end 1945-09-30 07:00:00 (Sun)
  61366269600, #  local_start 1945-08-14 18:00:00 (Tue)
  61370272800, #    local_end 1945-09-30 02:00:00 (Sun)
  -18000,
  1,
  'CPT',
      ],
      [
  61370290800, #    utc_start 1945-09-30 07:00:00 (Sun)
  61662319200, #      utc_end 1955-01-01 06:00:00 (Sat)
  61370269200, #  local_start 1945-09-30 01:00:00 (Sun)
  61662297600, #    local_end 1955-01-01 00:00:00 (Sat)
  -21600,
  0,
  'CST',
      ],
      [
  61662319200, #    utc_start 1955-01-01 06:00:00 (Sat)
  61672687200, #      utc_end 1955-05-01 06:00:00 (Sun)
  61662297600, #  local_start 1955-01-01 00:00:00 (Sat)
  61672665600, #    local_end 1955-05-01 00:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61672687200, #    utc_start 1955-05-01 06:00:00 (Sun)
  61685391600, #      utc_end 1955-09-25 07:00:00 (Sun)
  61672669200, #  local_start 1955-05-01 01:00:00 (Sun)
  61685373600, #    local_end 1955-09-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61685391600, #    utc_start 1955-09-25 07:00:00 (Sun)
  61704144000, #      utc_end 1956-04-29 08:00:00 (Sun)
  61685370000, #  local_start 1955-09-25 01:00:00 (Sun)
  61704122400, #    local_end 1956-04-29 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61704144000, #    utc_start 1956-04-29 08:00:00 (Sun)
  61717446000, #      utc_end 1956-09-30 07:00:00 (Sun)
  61704126000, #  local_start 1956-04-29 03:00:00 (Sun)
  61717428000, #    local_end 1956-09-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61717446000, #    utc_start 1956-09-30 07:00:00 (Sun)
  61735593600, #      utc_end 1957-04-28 08:00:00 (Sun)
  61717424400, #  local_start 1956-09-30 01:00:00 (Sun)
  61735572000, #    local_end 1957-04-28 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61735593600, #    utc_start 1957-04-28 08:00:00 (Sun)
  61748895600, #      utc_end 1957-09-29 07:00:00 (Sun)
  61735575600, #  local_start 1957-04-28 03:00:00 (Sun)
  61748877600, #    local_end 1957-09-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61748895600, #    utc_start 1957-09-29 07:00:00 (Sun)
  61767043200, #      utc_end 1958-04-27 08:00:00 (Sun)
  61748874000, #  local_start 1957-09-29 01:00:00 (Sun)
  61767021600, #    local_end 1958-04-27 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61767043200, #    utc_start 1958-04-27 08:00:00 (Sun)
  61780345200, #      utc_end 1958-09-28 07:00:00 (Sun)
  61767025200, #  local_start 1958-04-27 03:00:00 (Sun)
  61780327200, #    local_end 1958-09-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61780345200, #    utc_start 1958-09-28 07:00:00 (Sun)
  61798492800, #      utc_end 1959-04-26 08:00:00 (Sun)
  61780323600, #  local_start 1958-09-28 01:00:00 (Sun)
  61798471200, #    local_end 1959-04-26 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61798492800, #    utc_start 1959-04-26 08:00:00 (Sun)
  61811794800, #      utc_end 1959-09-27 07:00:00 (Sun)
  61798474800, #  local_start 1959-04-26 03:00:00 (Sun)
  61811776800, #    local_end 1959-09-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61811794800, #    utc_start 1959-09-27 07:00:00 (Sun)
  61829942400, #      utc_end 1960-04-24 08:00:00 (Sun)
  61811773200, #  local_start 1959-09-27 01:00:00 (Sun)
  61829920800, #    local_end 1960-04-24 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61829942400, #    utc_start 1960-04-24 08:00:00 (Sun)
  61843244400, #      utc_end 1960-09-25 07:00:00 (Sun)
  61829924400, #  local_start 1960-04-24 03:00:00 (Sun)
  61843226400, #    local_end 1960-09-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61843244400, #    utc_start 1960-09-25 07:00:00 (Sun)
  61861996800, #      utc_end 1961-04-30 08:00:00 (Sun)
  61843222800, #  local_start 1960-09-25 01:00:00 (Sun)
  61861975200, #    local_end 1961-04-30 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61861996800, #    utc_start 1961-04-30 08:00:00 (Sun)
  61877718000, #      utc_end 1961-10-29 07:00:00 (Sun)
  61861978800, #  local_start 1961-04-30 03:00:00 (Sun)
  61877700000, #    local_end 1961-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61877718000, #    utc_start 1961-10-29 07:00:00 (Sun)
  61893446400, #      utc_end 1962-04-29 08:00:00 (Sun)
  61877696400, #  local_start 1961-10-29 01:00:00 (Sun)
  61893424800, #    local_end 1962-04-29 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61893446400, #    utc_start 1962-04-29 08:00:00 (Sun)
  61909167600, #      utc_end 1962-10-28 07:00:00 (Sun)
  61893428400, #  local_start 1962-04-29 03:00:00 (Sun)
  61909149600, #    local_end 1962-10-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61909167600, #    utc_start 1962-10-28 07:00:00 (Sun)
  61924896000, #      utc_end 1963-04-28 08:00:00 (Sun)
  61909146000, #  local_start 1962-10-28 01:00:00 (Sun)
  61924874400, #    local_end 1963-04-28 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61924896000, #    utc_start 1963-04-28 08:00:00 (Sun)
  61940617200, #      utc_end 1963-10-27 07:00:00 (Sun)
  61924878000, #  local_start 1963-04-28 03:00:00 (Sun)
  61940599200, #    local_end 1963-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61940617200, #    utc_start 1963-10-27 07:00:00 (Sun)
  61956345600, #      utc_end 1964-04-26 08:00:00 (Sun)
  61940595600, #  local_start 1963-10-27 01:00:00 (Sun)
  61956324000, #    local_end 1964-04-26 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61956345600, #    utc_start 1964-04-26 08:00:00 (Sun)
  61972066800, #      utc_end 1964-10-25 07:00:00 (Sun)
  61956327600, #  local_start 1964-04-26 03:00:00 (Sun)
  61972048800, #    local_end 1964-10-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61972066800, #    utc_start 1964-10-25 07:00:00 (Sun)
  61987795200, #      utc_end 1965-04-25 08:00:00 (Sun)
  61972045200, #  local_start 1964-10-25 01:00:00 (Sun)
  61987773600, #    local_end 1965-04-25 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61987795200, #    utc_start 1965-04-25 08:00:00 (Sun)
  62035570800, #      utc_end 1966-10-30 07:00:00 (Sun)
  61987777200, #  local_start 1965-04-25 03:00:00 (Sun)
  62035552800, #    local_end 1966-10-30 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62035570800, #    utc_start 1966-10-30 07:00:00 (Sun)
  62051299200, #      utc_end 1967-04-30 08:00:00 (Sun)
  62035549200, #  local_start 1966-10-30 01:00:00 (Sun)
  62051277600, #    local_end 1967-04-30 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62051299200, #    utc_start 1967-04-30 08:00:00 (Sun)
  62067020400, #      utc_end 1967-10-29 07:00:00 (Sun)
  62051281200, #  local_start 1967-04-30 03:00:00 (Sun)
  62067002400, #    local_end 1967-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62067020400, #    utc_start 1967-10-29 07:00:00 (Sun)
  62082748800, #      utc_end 1968-04-28 08:00:00 (Sun)
  62066998800, #  local_start 1967-10-29 01:00:00 (Sun)
  62082727200, #    local_end 1968-04-28 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62082748800, #    utc_start 1968-04-28 08:00:00 (Sun)
  62098470000, #      utc_end 1968-10-27 07:00:00 (Sun)
  62082730800, #  local_start 1968-04-28 03:00:00 (Sun)
  62098452000, #    local_end 1968-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62098470000, #    utc_start 1968-10-27 07:00:00 (Sun)
  62114198400, #      utc_end 1969-04-27 08:00:00 (Sun)
  62098448400, #  local_start 1968-10-27 01:00:00 (Sun)
  62114176800, #    local_end 1969-04-27 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62114198400, #    utc_start 1969-04-27 08:00:00 (Sun)
  62129919600, #      utc_end 1969-10-26 07:00:00 (Sun)
  62114180400, #  local_start 1969-04-27 03:00:00 (Sun)
  62129901600, #    local_end 1969-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62129919600, #    utc_start 1969-10-26 07:00:00 (Sun)
  62145648000, #      utc_end 1970-04-26 08:00:00 (Sun)
  62129898000, #  local_start 1969-10-26 01:00:00 (Sun)
  62145626400, #    local_end 1970-04-26 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62145648000, #    utc_start 1970-04-26 08:00:00 (Sun)
  62161369200, #      utc_end 1970-10-25 07:00:00 (Sun)
  62145630000, #  local_start 1970-04-26 03:00:00 (Sun)
  62161351200, #    local_end 1970-10-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62161369200, #    utc_start 1970-10-25 07:00:00 (Sun)
  62177097600, #      utc_end 1971-04-25 08:00:00 (Sun)
  62161347600, #  local_start 1970-10-25 01:00:00 (Sun)
  62177076000, #    local_end 1971-04-25 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62177097600, #    utc_start 1971-04-25 08:00:00 (Sun)
  62193423600, #      utc_end 1971-10-31 07:00:00 (Sun)
  62177079600, #  local_start 1971-04-25 03:00:00 (Sun)
  62193405600, #    local_end 1971-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62193423600, #    utc_start 1971-10-31 07:00:00 (Sun)
  62209152000, #      utc_end 1972-04-30 08:00:00 (Sun)
  62193402000, #  local_start 1971-10-31 01:00:00 (Sun)
  62209130400, #    local_end 1972-04-30 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62209152000, #    utc_start 1972-04-30 08:00:00 (Sun)
  62224873200, #      utc_end 1972-10-29 07:00:00 (Sun)
  62209134000, #  local_start 1972-04-30 03:00:00 (Sun)
  62224855200, #    local_end 1972-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62224873200, #    utc_start 1972-10-29 07:00:00 (Sun)
  62240601600, #      utc_end 1973-04-29 08:00:00 (Sun)
  62224851600, #  local_start 1972-10-29 01:00:00 (Sun)
  62240580000, #    local_end 1973-04-29 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62240601600, #    utc_start 1973-04-29 08:00:00 (Sun)
  62256322800, #      utc_end 1973-10-28 07:00:00 (Sun)
  62240583600, #  local_start 1973-04-29 03:00:00 (Sun)
  62256304800, #    local_end 1973-10-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62256322800, #    utc_start 1973-10-28 07:00:00 (Sun)
  62262374400, #      utc_end 1974-01-06 08:00:00 (Sun)
  62256301200, #  local_start 1973-10-28 01:00:00 (Sun)
  62262352800, #    local_end 1974-01-06 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62262374400, #    utc_start 1974-01-06 08:00:00 (Sun)
  62287772400, #      utc_end 1974-10-27 07:00:00 (Sun)
  62262356400, #  local_start 1974-01-06 03:00:00 (Sun)
  62287754400, #    local_end 1974-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62287772400, #    utc_start 1974-10-27 07:00:00 (Sun)
  62298057600, #      utc_end 1975-02-23 08:00:00 (Sun)
  62287750800, #  local_start 1974-10-27 01:00:00 (Sun)
  62298036000, #    local_end 1975-02-23 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62298057600, #    utc_start 1975-02-23 08:00:00 (Sun)
  62319222000, #      utc_end 1975-10-26 07:00:00 (Sun)
  62298039600, #  local_start 1975-02-23 03:00:00 (Sun)
  62319204000, #    local_end 1975-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62319222000, #    utc_start 1975-10-26 07:00:00 (Sun)
  62334950400, #      utc_end 1976-04-25 08:00:00 (Sun)
  62319200400, #  local_start 1975-10-26 01:00:00 (Sun)
  62334928800, #    local_end 1976-04-25 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62334950400, #    utc_start 1976-04-25 08:00:00 (Sun)
  62351276400, #      utc_end 1976-10-31 07:00:00 (Sun)
  62334932400, #  local_start 1976-04-25 03:00:00 (Sun)
  62351258400, #    local_end 1976-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62351276400, #    utc_start 1976-10-31 07:00:00 (Sun)
  62366400000, #      utc_end 1977-04-24 08:00:00 (Sun)
  62351254800, #  local_start 1976-10-31 01:00:00 (Sun)
  62366378400, #    local_end 1977-04-24 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62366400000, #    utc_start 1977-04-24 08:00:00 (Sun)
  62382726000, #      utc_end 1977-10-30 07:00:00 (Sun)
  62366382000, #  local_start 1977-04-24 03:00:00 (Sun)
  62382708000, #    local_end 1977-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62382726000, #    utc_start 1977-10-30 07:00:00 (Sun)
  63279644400, #      utc_end 2006-04-02 07:00:00 (Sun)
  62382708000, #  local_start 1977-10-30 02:00:00 (Sun)
  63279626400, #    local_end 2006-04-02 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63279644400, #    utc_start 2006-04-02 07:00:00 (Sun)
  63297788400, #      utc_end 2006-10-29 07:00:00 (Sun)
  63279626400, #  local_start 2006-04-02 02:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63297788400, #    utc_start 2006-10-29 07:00:00 (Sun)
  63309283200, #      utc_end 2007-03-11 08:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63309261600, #    local_end 2007-03-11 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63309283200, #    utc_start 2007-03-11 08:00:00 (Sun)
  63329842800, #      utc_end 2007-11-04 07:00:00 (Sun)
  63309265200, #  local_start 2007-03-11 03:00:00 (Sun)
  63329824800, #    local_end 2007-11-04 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63329842800, #    utc_start 2007-11-04 07:00:00 (Sun)
  63340729200, #      utc_end 2008-03-09 07:00:00 (Sun)
  63329824800, #  local_start 2007-11-04 02:00:00 (Sun)
  63340711200, #    local_end 2008-03-09 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63340729200, #    utc_start 2008-03-09 07:00:00 (Sun)
  63361288800, #      utc_end 2008-11-02 06:00:00 (Sun)
  63340714800, #  local_start 2008-03-09 03:00:00 (Sun)
  63361274400, #    local_end 2008-11-02 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63361288800, #    utc_start 2008-11-02 06:00:00 (Sun)
  63372178800, #      utc_end 2009-03-08 07:00:00 (Sun)
  63361270800, #  local_start 2008-11-02 01:00:00 (Sun)
  63372160800, #    local_end 2009-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63372178800, #    utc_start 2009-03-08 07:00:00 (Sun)
  63392738400, #      utc_end 2009-11-01 06:00:00 (Sun)
  63372164400, #  local_start 2009-03-08 03:00:00 (Sun)
  63392724000, #    local_end 2009-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63392738400, #    utc_start 2009-11-01 06:00:00 (Sun)
  63404233200, #      utc_end 2010-03-14 07:00:00 (Sun)
  63392720400, #  local_start 2009-11-01 01:00:00 (Sun)
  63404215200, #    local_end 2010-03-14 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63404233200, #    utc_start 2010-03-14 07:00:00 (Sun)
  63424792800, #      utc_end 2010-11-07 06:00:00 (Sun)
  63404218800, #  local_start 2010-03-14 03:00:00 (Sun)
  63424778400, #    local_end 2010-11-07 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63424792800, #    utc_start 2010-11-07 06:00:00 (Sun)
  63435682800, #      utc_end 2011-03-13 07:00:00 (Sun)
  63424774800, #  local_start 2010-11-07 01:00:00 (Sun)
  63435664800, #    local_end 2011-03-13 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63435682800, #    utc_start 2011-03-13 07:00:00 (Sun)
  63456242400, #      utc_end 2011-11-06 06:00:00 (Sun)
  63435668400, #  local_start 2011-03-13 03:00:00 (Sun)
  63456228000, #    local_end 2011-11-06 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63456242400, #    utc_start 2011-11-06 06:00:00 (Sun)
  63467132400, #      utc_end 2012-03-11 07:00:00 (Sun)
  63456224400, #  local_start 2011-11-06 01:00:00 (Sun)
  63467114400, #    local_end 2012-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63467132400, #    utc_start 2012-03-11 07:00:00 (Sun)
  63487692000, #      utc_end 2012-11-04 06:00:00 (Sun)
  63467118000, #  local_start 2012-03-11 03:00:00 (Sun)
  63487677600, #    local_end 2012-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63487692000, #    utc_start 2012-11-04 06:00:00 (Sun)
  63498582000, #      utc_end 2013-03-10 07:00:00 (Sun)
  63487674000, #  local_start 2012-11-04 01:00:00 (Sun)
  63498564000, #    local_end 2013-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63498582000, #    utc_start 2013-03-10 07:00:00 (Sun)
  63519141600, #      utc_end 2013-11-03 06:00:00 (Sun)
  63498567600, #  local_start 2013-03-10 03:00:00 (Sun)
  63519127200, #    local_end 2013-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63519141600, #    utc_start 2013-11-03 06:00:00 (Sun)
  63530031600, #      utc_end 2014-03-09 07:00:00 (Sun)
  63519123600, #  local_start 2013-11-03 01:00:00 (Sun)
  63530013600, #    local_end 2014-03-09 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63530031600, #    utc_start 2014-03-09 07:00:00 (Sun)
  63550591200, #      utc_end 2014-11-02 06:00:00 (Sun)
  63530017200, #  local_start 2014-03-09 03:00:00 (Sun)
  63550576800, #    local_end 2014-11-02 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63550591200, #    utc_start 2014-11-02 06:00:00 (Sun)
  63561481200, #      utc_end 2015-03-08 07:00:00 (Sun)
  63550573200, #  local_start 2014-11-02 01:00:00 (Sun)
  63561463200, #    local_end 2015-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63561481200, #    utc_start 2015-03-08 07:00:00 (Sun)
  63582040800, #      utc_end 2015-11-01 06:00:00 (Sun)
  63561466800, #  local_start 2015-03-08 03:00:00 (Sun)
  63582026400, #    local_end 2015-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63582040800, #    utc_start 2015-11-01 06:00:00 (Sun)
  63593535600, #      utc_end 2016-03-13 07:00:00 (Sun)
  63582022800, #  local_start 2015-11-01 01:00:00 (Sun)
  63593517600, #    local_end 2016-03-13 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63593535600, #    utc_start 2016-03-13 07:00:00 (Sun)
  63614095200, #      utc_end 2016-11-06 06:00:00 (Sun)
  63593521200, #  local_start 2016-03-13 03:00:00 (Sun)
  63614080800, #    local_end 2016-11-06 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63614095200, #    utc_start 2016-11-06 06:00:00 (Sun)
  63624985200, #      utc_end 2017-03-12 07:00:00 (Sun)
  63614077200, #  local_start 2016-11-06 01:00:00 (Sun)
  63624967200, #    local_end 2017-03-12 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63624985200, #    utc_start 2017-03-12 07:00:00 (Sun)
  63645544800, #      utc_end 2017-11-05 06:00:00 (Sun)
  63624970800, #  local_start 2017-03-12 03:00:00 (Sun)
  63645530400, #    local_end 2017-11-05 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63645544800, #    utc_start 2017-11-05 06:00:00 (Sun)
  63656434800, #      utc_end 2018-03-11 07:00:00 (Sun)
  63645526800, #  local_start 2017-11-05 01:00:00 (Sun)
  63656416800, #    local_end 2018-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63656434800, #    utc_start 2018-03-11 07:00:00 (Sun)
  63676994400, #      utc_end 2018-11-04 06:00:00 (Sun)
  63656420400, #  local_start 2018-03-11 03:00:00 (Sun)
  63676980000, #    local_end 2018-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63676994400, #    utc_start 2018-11-04 06:00:00 (Sun)
  63687884400, #      utc_end 2019-03-10 07:00:00 (Sun)
  63676976400, #  local_start 2018-11-04 01:00:00 (Sun)
  63687866400, #    local_end 2019-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63687884400, #    utc_start 2019-03-10 07:00:00 (Sun)
  63708444000, #      utc_end 2019-11-03 06:00:00 (Sun)
  63687870000, #  local_start 2019-03-10 03:00:00 (Sun)
  63708429600, #    local_end 2019-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63708444000, #    utc_start 2019-11-03 06:00:00 (Sun)
  63719334000, #      utc_end 2020-03-08 07:00:00 (Sun)
  63708426000, #  local_start 2019-11-03 01:00:00 (Sun)
  63719316000, #    local_end 2020-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63719334000, #    utc_start 2020-03-08 07:00:00 (Sun)
  63739893600, #      utc_end 2020-11-01 06:00:00 (Sun)
  63719319600, #  local_start 2020-03-08 03:00:00 (Sun)
  63739879200, #    local_end 2020-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63739893600, #    utc_start 2020-11-01 06:00:00 (Sun)
  63751388400, #      utc_end 2021-03-14 07:00:00 (Sun)
  63739875600, #  local_start 2020-11-01 01:00:00 (Sun)
  63751370400, #    local_end 2021-03-14 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63751388400, #    utc_start 2021-03-14 07:00:00 (Sun)
  63771948000, #      utc_end 2021-11-07 06:00:00 (Sun)
  63751374000, #  local_start 2021-03-14 03:00:00 (Sun)
  63771933600, #    local_end 2021-11-07 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63771948000, #    utc_start 2021-11-07 06:00:00 (Sun)
  63782838000, #      utc_end 2022-03-13 07:00:00 (Sun)
  63771930000, #  local_start 2021-11-07 01:00:00 (Sun)
  63782820000, #    local_end 2022-03-13 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63782838000, #    utc_start 2022-03-13 07:00:00 (Sun)
  63803397600, #      utc_end 2022-11-06 06:00:00 (Sun)
  63782823600, #  local_start 2022-03-13 03:00:00 (Sun)
  63803383200, #    local_end 2022-11-06 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63803397600, #    utc_start 2022-11-06 06:00:00 (Sun)
  63814287600, #      utc_end 2023-03-12 07:00:00 (Sun)
  63803379600, #  local_start 2022-11-06 01:00:00 (Sun)
  63814269600, #    local_end 2023-03-12 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63814287600, #    utc_start 2023-03-12 07:00:00 (Sun)
  63834847200, #      utc_end 2023-11-05 06:00:00 (Sun)
  63814273200, #  local_start 2023-03-12 03:00:00 (Sun)
  63834832800, #    local_end 2023-11-05 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63834847200, #    utc_start 2023-11-05 06:00:00 (Sun)
  63845737200, #      utc_end 2024-03-10 07:00:00 (Sun)
  63834829200, #  local_start 2023-11-05 01:00:00 (Sun)
  63845719200, #    local_end 2024-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63845737200, #    utc_start 2024-03-10 07:00:00 (Sun)
  63866296800, #      utc_end 2024-11-03 06:00:00 (Sun)
  63845722800, #  local_start 2024-03-10 03:00:00 (Sun)
  63866282400, #    local_end 2024-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63866296800, #    utc_start 2024-11-03 06:00:00 (Sun)
  63877186800, #      utc_end 2025-03-09 07:00:00 (Sun)
  63866278800, #  local_start 2024-11-03 01:00:00 (Sun)
  63877168800, #    local_end 2025-03-09 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63877186800, #    utc_start 2025-03-09 07:00:00 (Sun)
  63897746400, #      utc_end 2025-11-02 06:00:00 (Sun)
  63877172400, #  local_start 2025-03-09 03:00:00 (Sun)
  63897732000, #    local_end 2025-11-02 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63897746400, #    utc_start 2025-11-02 06:00:00 (Sun)
  63908636400, #      utc_end 2026-03-08 07:00:00 (Sun)
  63897728400, #  local_start 2025-11-02 01:00:00 (Sun)
  63908618400, #    local_end 2026-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63908636400, #    utc_start 2026-03-08 07:00:00 (Sun)
  63929196000, #      utc_end 2026-11-01 06:00:00 (Sun)
  63908622000, #  local_start 2026-03-08 03:00:00 (Sun)
  63929181600, #    local_end 2026-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63929196000, #    utc_start 2026-11-01 06:00:00 (Sun)
  63940690800, #      utc_end 2027-03-14 07:00:00 (Sun)
  63929178000, #  local_start 2026-11-01 01:00:00 (Sun)
  63940672800, #    local_end 2027-03-14 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63940690800, #    utc_start 2027-03-14 07:00:00 (Sun)
  63961250400, #      utc_end 2027-11-07 06:00:00 (Sun)
  63940676400, #  local_start 2027-03-14 03:00:00 (Sun)
  63961236000, #    local_end 2027-11-07 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63961250400, #    utc_start 2027-11-07 06:00:00 (Sun)
  63972140400, #      utc_end 2028-03-12 07:00:00 (Sun)
  63961232400, #  local_start 2027-11-07 01:00:00 (Sun)
  63972122400, #    local_end 2028-03-12 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63972140400, #    utc_start 2028-03-12 07:00:00 (Sun)
  63992700000, #      utc_end 2028-11-05 06:00:00 (Sun)
  63972126000, #  local_start 2028-03-12 03:00:00 (Sun)
  63992685600, #    local_end 2028-11-05 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63992700000, #    utc_start 2028-11-05 06:00:00 (Sun)
  64003590000, #      utc_end 2029-03-11 07:00:00 (Sun)
  63992682000, #  local_start 2028-11-05 01:00:00 (Sun)
  64003572000, #    local_end 2029-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  64003590000, #    utc_start 2029-03-11 07:00:00 (Sun)
  64024149600, #      utc_end 2029-11-04 06:00:00 (Sun)
  64003575600, #  local_start 2029-03-11 03:00:00 (Sun)
  64024135200, #    local_end 2029-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  64024149600, #    utc_start 2029-11-04 06:00:00 (Sun)
  64035039600, #      utc_end 2030-03-10 07:00:00 (Sun)
  64024131600, #  local_start 2029-11-04 01:00:00 (Sun)
  64035021600, #    local_end 2030-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  64035039600, #    utc_start 2030-03-10 07:00:00 (Sun)
  64055599200, #      utc_end 2030-11-03 06:00:00 (Sun)
  64035025200, #  local_start 2030-03-10 03:00:00 (Sun)
  64055584800, #    local_end 2030-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {50}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -18000 }
  
  my $last_observance = bless( {
    'format' => 'E%sT',
    'gmtoff' => '-5:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 732984,
      'local_rd_secs' => 7200,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 732984,
      'utc_rd_secs' => 7200,
      'utc_year' => 2008
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -18000,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 732984,
      'local_rd_secs' => 25200,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 732984,
      'utc_rd_secs' => 25200,
      'utc_year' => 2008
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Mar',
      'letter' => 'D',
      'name' => 'US',
      'offset_from_std' => 3600,
      'on' => 'Sun>=8',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Nov',
      'letter' => 'S',
      'name' => 'US',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_INDIANA_PETERSBURG

    $main::fatpacked{"DateTime/TimeZone/America/Indiana/Tell_City.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_INDIANA_TELL_CITY';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Indiana::Tell_City;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Indiana::Tell_City::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59418036000, #      utc_end 1883-11-18 18:00:00 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59418015177, #    local_end 1883-11-18 12:12:57 (Sun)
  -20823,
  0,
  'LMT',
      ],
      [
  59418036000, #    utc_start 1883-11-18 18:00:00 (Sun)
  60502406400, #      utc_end 1918-03-31 08:00:00 (Sun)
  59418014400, #  local_start 1883-11-18 12:00:00 (Sun)
  60502384800, #    local_end 1918-03-31 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  60502406400, #    utc_start 1918-03-31 08:00:00 (Sun)
  60520546800, #      utc_end 1918-10-27 07:00:00 (Sun)
  60502388400, #  local_start 1918-03-31 03:00:00 (Sun)
  60520528800, #    local_end 1918-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  60520546800, #    utc_start 1918-10-27 07:00:00 (Sun)
  60533856000, #      utc_end 1919-03-30 08:00:00 (Sun)
  60520525200, #  local_start 1918-10-27 01:00:00 (Sun)
  60533834400, #    local_end 1919-03-30 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  60533856000, #    utc_start 1919-03-30 08:00:00 (Sun)
  60551996400, #      utc_end 1919-10-26 07:00:00 (Sun)
  60533838000, #  local_start 1919-03-30 03:00:00 (Sun)
  60551978400, #    local_end 1919-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  60551996400, #    utc_start 1919-10-26 07:00:00 (Sun)
  61255468800, #      utc_end 1942-02-09 08:00:00 (Mon)
  60551974800, #  local_start 1919-10-26 01:00:00 (Sun)
  61255447200, #    local_end 1942-02-09 02:00:00 (Mon)
  -21600,
  0,
  'CST',
      ],
      [
  61255468800, #    utc_start 1942-02-09 08:00:00 (Mon)
  61366287600, #      utc_end 1945-08-14 23:00:00 (Tue)
  61255450800, #  local_start 1942-02-09 03:00:00 (Mon)
  61366269600, #    local_end 1945-08-14 18:00:00 (Tue)
  -18000,
  1,
  'CWT',
      ],
      [
  61366287600, #    utc_start 1945-08-14 23:00:00 (Tue)
  61370290800, #      utc_end 1945-09-30 07:00:00 (Sun)
  61366269600, #  local_start 1945-08-14 18:00:00 (Tue)
  61370272800, #    local_end 1945-09-30 02:00:00 (Sun)
  -18000,
  1,
  'CPT',
      ],
      [
  61370290800, #    utc_start 1945-09-30 07:00:00 (Sun)
  61378322400, #      utc_end 1946-01-01 06:00:00 (Tue)
  61370269200, #  local_start 1945-09-30 01:00:00 (Sun)
  61378300800, #    local_end 1946-01-01 00:00:00 (Tue)
  -21600,
  0,
  'CST',
      ],
      [
  61378322400, #    utc_start 1946-01-01 06:00:00 (Tue)
  61388438400, #      utc_end 1946-04-28 08:00:00 (Sun)
  61378300800, #  local_start 1946-01-01 00:00:00 (Tue)
  61388416800, #    local_end 1946-04-28 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61388438400, #    utc_start 1946-04-28 08:00:00 (Sun)
  61401740400, #      utc_end 1946-09-29 07:00:00 (Sun)
  61388420400, #  local_start 1946-04-28 03:00:00 (Sun)
  61401722400, #    local_end 1946-09-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61401740400, #    utc_start 1946-09-29 07:00:00 (Sun)
  61609190400, #      utc_end 1953-04-26 08:00:00 (Sun)
  61401718800, #  local_start 1946-09-29 01:00:00 (Sun)
  61609168800, #    local_end 1953-04-26 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61609190400, #    utc_start 1953-04-26 08:00:00 (Sun)
  61622492400, #      utc_end 1953-09-27 07:00:00 (Sun)
  61609172400, #  local_start 1953-04-26 03:00:00 (Sun)
  61622474400, #    local_end 1953-09-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61622492400, #    utc_start 1953-09-27 07:00:00 (Sun)
  61640640000, #      utc_end 1954-04-25 08:00:00 (Sun)
  61622470800, #  local_start 1953-09-27 01:00:00 (Sun)
  61640618400, #    local_end 1954-04-25 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61640640000, #    utc_start 1954-04-25 08:00:00 (Sun)
  61653942000, #      utc_end 1954-09-26 07:00:00 (Sun)
  61640622000, #  local_start 1954-04-25 03:00:00 (Sun)
  61653924000, #    local_end 1954-09-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61653942000, #    utc_start 1954-09-26 07:00:00 (Sun)
  61672687200, #      utc_end 1955-05-01 06:00:00 (Sun)
  61653920400, #  local_start 1954-09-26 01:00:00 (Sun)
  61672665600, #    local_end 1955-05-01 00:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61672687200, #    utc_start 1955-05-01 06:00:00 (Sun)
  61685391600, #      utc_end 1955-09-25 07:00:00 (Sun)
  61672669200, #  local_start 1955-05-01 01:00:00 (Sun)
  61685373600, #    local_end 1955-09-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61685391600, #    utc_start 1955-09-25 07:00:00 (Sun)
  61704144000, #      utc_end 1956-04-29 08:00:00 (Sun)
  61685370000, #  local_start 1955-09-25 01:00:00 (Sun)
  61704122400, #    local_end 1956-04-29 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61704144000, #    utc_start 1956-04-29 08:00:00 (Sun)
  61717446000, #      utc_end 1956-09-30 07:00:00 (Sun)
  61704126000, #  local_start 1956-04-29 03:00:00 (Sun)
  61717428000, #    local_end 1956-09-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61717446000, #    utc_start 1956-09-30 07:00:00 (Sun)
  61735593600, #      utc_end 1957-04-28 08:00:00 (Sun)
  61717424400, #  local_start 1956-09-30 01:00:00 (Sun)
  61735572000, #    local_end 1957-04-28 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61735593600, #    utc_start 1957-04-28 08:00:00 (Sun)
  61748895600, #      utc_end 1957-09-29 07:00:00 (Sun)
  61735575600, #  local_start 1957-04-28 03:00:00 (Sun)
  61748877600, #    local_end 1957-09-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61748895600, #    utc_start 1957-09-29 07:00:00 (Sun)
  61767043200, #      utc_end 1958-04-27 08:00:00 (Sun)
  61748874000, #  local_start 1957-09-29 01:00:00 (Sun)
  61767021600, #    local_end 1958-04-27 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61767043200, #    utc_start 1958-04-27 08:00:00 (Sun)
  61780345200, #      utc_end 1958-09-28 07:00:00 (Sun)
  61767025200, #  local_start 1958-04-27 03:00:00 (Sun)
  61780327200, #    local_end 1958-09-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61780345200, #    utc_start 1958-09-28 07:00:00 (Sun)
  61798492800, #      utc_end 1959-04-26 08:00:00 (Sun)
  61780323600, #  local_start 1958-09-28 01:00:00 (Sun)
  61798471200, #    local_end 1959-04-26 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61798492800, #    utc_start 1959-04-26 08:00:00 (Sun)
  61811794800, #      utc_end 1959-09-27 07:00:00 (Sun)
  61798474800, #  local_start 1959-04-26 03:00:00 (Sun)
  61811776800, #    local_end 1959-09-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61811794800, #    utc_start 1959-09-27 07:00:00 (Sun)
  61829942400, #      utc_end 1960-04-24 08:00:00 (Sun)
  61811773200, #  local_start 1959-09-27 01:00:00 (Sun)
  61829920800, #    local_end 1960-04-24 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61829942400, #    utc_start 1960-04-24 08:00:00 (Sun)
  61846268400, #      utc_end 1960-10-30 07:00:00 (Sun)
  61829924400, #  local_start 1960-04-24 03:00:00 (Sun)
  61846250400, #    local_end 1960-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61846268400, #    utc_start 1960-10-30 07:00:00 (Sun)
  61861996800, #      utc_end 1961-04-30 08:00:00 (Sun)
  61846246800, #  local_start 1960-10-30 01:00:00 (Sun)
  61861975200, #    local_end 1961-04-30 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61861996800, #    utc_start 1961-04-30 08:00:00 (Sun)
  61874694000, #      utc_end 1961-09-24 07:00:00 (Sun)
  61861978800, #  local_start 1961-04-30 03:00:00 (Sun)
  61874676000, #    local_end 1961-09-24 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61874694000, #    utc_start 1961-09-24 07:00:00 (Sun)
  61893446400, #      utc_end 1962-04-29 08:00:00 (Sun)
  61874672400, #  local_start 1961-09-24 01:00:00 (Sun)
  61893424800, #    local_end 1962-04-29 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61893446400, #    utc_start 1962-04-29 08:00:00 (Sun)
  61909167600, #      utc_end 1962-10-28 07:00:00 (Sun)
  61893428400, #  local_start 1962-04-29 03:00:00 (Sun)
  61909149600, #    local_end 1962-10-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61909167600, #    utc_start 1962-10-28 07:00:00 (Sun)
  61924896000, #      utc_end 1963-04-28 08:00:00 (Sun)
  61909146000, #  local_start 1962-10-28 01:00:00 (Sun)
  61924874400, #    local_end 1963-04-28 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61924896000, #    utc_start 1963-04-28 08:00:00 (Sun)
  61940617200, #      utc_end 1963-10-27 07:00:00 (Sun)
  61924878000, #  local_start 1963-04-28 03:00:00 (Sun)
  61940599200, #    local_end 1963-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61940617200, #    utc_start 1963-10-27 07:00:00 (Sun)
  61956345600, #      utc_end 1964-04-26 08:00:00 (Sun)
  61940595600, #  local_start 1963-10-27 01:00:00 (Sun)
  61956324000, #    local_end 1964-04-26 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61956345600, #    utc_start 1964-04-26 08:00:00 (Sun)
  62104165200, #      utc_end 1969-01-01 05:00:00 (Wed)
  61956327600, #  local_start 1964-04-26 03:00:00 (Sun)
  62104147200, #    local_end 1969-01-01 00:00:00 (Wed)
  -18000,
  0,
  'EST',
      ],
      [
  62104165200, #    utc_start 1969-01-01 05:00:00 (Wed)
  62114194800, #      utc_end 1969-04-27 07:00:00 (Sun)
  62104147200, #  local_start 1969-01-01 00:00:00 (Wed)
  62114176800, #    local_end 1969-04-27 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62114194800, #    utc_start 1969-04-27 07:00:00 (Sun)
  62129916000, #      utc_end 1969-10-26 06:00:00 (Sun)
  62114180400, #  local_start 1969-04-27 03:00:00 (Sun)
  62129901600, #    local_end 1969-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62129916000, #    utc_start 1969-10-26 06:00:00 (Sun)
  62145644400, #      utc_end 1970-04-26 07:00:00 (Sun)
  62129898000, #  local_start 1969-10-26 01:00:00 (Sun)
  62145626400, #    local_end 1970-04-26 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62145644400, #    utc_start 1970-04-26 07:00:00 (Sun)
  62161365600, #      utc_end 1970-10-25 06:00:00 (Sun)
  62145630000, #  local_start 1970-04-26 03:00:00 (Sun)
  62161351200, #    local_end 1970-10-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62161365600, #    utc_start 1970-10-25 06:00:00 (Sun)
  62167237200, #      utc_end 1971-01-01 05:00:00 (Fri)
  62161347600, #  local_start 1970-10-25 01:00:00 (Sun)
  62167219200, #    local_end 1971-01-01 00:00:00 (Fri)
  -18000,
  0,
  'EST',
      ],
      [
  62167237200, #    utc_start 1971-01-01 05:00:00 (Fri)
  63279644400, #      utc_end 2006-04-02 07:00:00 (Sun)
  62167219200, #  local_start 1971-01-01 00:00:00 (Fri)
  63279626400, #    local_end 2006-04-02 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63279644400, #    utc_start 2006-04-02 07:00:00 (Sun)
  63297788400, #      utc_end 2006-10-29 07:00:00 (Sun)
  63279626400, #  local_start 2006-04-02 02:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63297788400, #    utc_start 2006-10-29 07:00:00 (Sun)
  63309283200, #      utc_end 2007-03-11 08:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63309261600, #    local_end 2007-03-11 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63309283200, #    utc_start 2007-03-11 08:00:00 (Sun)
  63329842800, #      utc_end 2007-11-04 07:00:00 (Sun)
  63309265200, #  local_start 2007-03-11 03:00:00 (Sun)
  63329824800, #    local_end 2007-11-04 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63329842800, #    utc_start 2007-11-04 07:00:00 (Sun)
  63340732800, #      utc_end 2008-03-09 08:00:00 (Sun)
  63329821200, #  local_start 2007-11-04 01:00:00 (Sun)
  63340711200, #    local_end 2008-03-09 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63340732800, #    utc_start 2008-03-09 08:00:00 (Sun)
  63361292400, #      utc_end 2008-11-02 07:00:00 (Sun)
  63340714800, #  local_start 2008-03-09 03:00:00 (Sun)
  63361274400, #    local_end 2008-11-02 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63361292400, #    utc_start 2008-11-02 07:00:00 (Sun)
  63372182400, #      utc_end 2009-03-08 08:00:00 (Sun)
  63361270800, #  local_start 2008-11-02 01:00:00 (Sun)
  63372160800, #    local_end 2009-03-08 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63372182400, #    utc_start 2009-03-08 08:00:00 (Sun)
  63392742000, #      utc_end 2009-11-01 07:00:00 (Sun)
  63372164400, #  local_start 2009-03-08 03:00:00 (Sun)
  63392724000, #    local_end 2009-11-01 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63392742000, #    utc_start 2009-11-01 07:00:00 (Sun)
  63404236800, #      utc_end 2010-03-14 08:00:00 (Sun)
  63392720400, #  local_start 2009-11-01 01:00:00 (Sun)
  63404215200, #    local_end 2010-03-14 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63404236800, #    utc_start 2010-03-14 08:00:00 (Sun)
  63424796400, #      utc_end 2010-11-07 07:00:00 (Sun)
  63404218800, #  local_start 2010-03-14 03:00:00 (Sun)
  63424778400, #    local_end 2010-11-07 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63424796400, #    utc_start 2010-11-07 07:00:00 (Sun)
  63435686400, #      utc_end 2011-03-13 08:00:00 (Sun)
  63424774800, #  local_start 2010-11-07 01:00:00 (Sun)
  63435664800, #    local_end 2011-03-13 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63435686400, #    utc_start 2011-03-13 08:00:00 (Sun)
  63456246000, #      utc_end 2011-11-06 07:00:00 (Sun)
  63435668400, #  local_start 2011-03-13 03:00:00 (Sun)
  63456228000, #    local_end 2011-11-06 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63456246000, #    utc_start 2011-11-06 07:00:00 (Sun)
  63467136000, #      utc_end 2012-03-11 08:00:00 (Sun)
  63456224400, #  local_start 2011-11-06 01:00:00 (Sun)
  63467114400, #    local_end 2012-03-11 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63467136000, #    utc_start 2012-03-11 08:00:00 (Sun)
  63487695600, #      utc_end 2012-11-04 07:00:00 (Sun)
  63467118000, #  local_start 2012-03-11 03:00:00 (Sun)
  63487677600, #    local_end 2012-11-04 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63487695600, #    utc_start 2012-11-04 07:00:00 (Sun)
  63498585600, #      utc_end 2013-03-10 08:00:00 (Sun)
  63487674000, #  local_start 2012-11-04 01:00:00 (Sun)
  63498564000, #    local_end 2013-03-10 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63498585600, #    utc_start 2013-03-10 08:00:00 (Sun)
  63519145200, #      utc_end 2013-11-03 07:00:00 (Sun)
  63498567600, #  local_start 2013-03-10 03:00:00 (Sun)
  63519127200, #    local_end 2013-11-03 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63519145200, #    utc_start 2013-11-03 07:00:00 (Sun)
  63530035200, #      utc_end 2014-03-09 08:00:00 (Sun)
  63519123600, #  local_start 2013-11-03 01:00:00 (Sun)
  63530013600, #    local_end 2014-03-09 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63530035200, #    utc_start 2014-03-09 08:00:00 (Sun)
  63550594800, #      utc_end 2014-11-02 07:00:00 (Sun)
  63530017200, #  local_start 2014-03-09 03:00:00 (Sun)
  63550576800, #    local_end 2014-11-02 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63550594800, #    utc_start 2014-11-02 07:00:00 (Sun)
  63561484800, #      utc_end 2015-03-08 08:00:00 (Sun)
  63550573200, #  local_start 2014-11-02 01:00:00 (Sun)
  63561463200, #    local_end 2015-03-08 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63561484800, #    utc_start 2015-03-08 08:00:00 (Sun)
  63582044400, #      utc_end 2015-11-01 07:00:00 (Sun)
  63561466800, #  local_start 2015-03-08 03:00:00 (Sun)
  63582026400, #    local_end 2015-11-01 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63582044400, #    utc_start 2015-11-01 07:00:00 (Sun)
  63593539200, #      utc_end 2016-03-13 08:00:00 (Sun)
  63582022800, #  local_start 2015-11-01 01:00:00 (Sun)
  63593517600, #    local_end 2016-03-13 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63593539200, #    utc_start 2016-03-13 08:00:00 (Sun)
  63614098800, #      utc_end 2016-11-06 07:00:00 (Sun)
  63593521200, #  local_start 2016-03-13 03:00:00 (Sun)
  63614080800, #    local_end 2016-11-06 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63614098800, #    utc_start 2016-11-06 07:00:00 (Sun)
  63624988800, #      utc_end 2017-03-12 08:00:00 (Sun)
  63614077200, #  local_start 2016-11-06 01:00:00 (Sun)
  63624967200, #    local_end 2017-03-12 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63624988800, #    utc_start 2017-03-12 08:00:00 (Sun)
  63645548400, #      utc_end 2017-11-05 07:00:00 (Sun)
  63624970800, #  local_start 2017-03-12 03:00:00 (Sun)
  63645530400, #    local_end 2017-11-05 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63645548400, #    utc_start 2017-11-05 07:00:00 (Sun)
  63656438400, #      utc_end 2018-03-11 08:00:00 (Sun)
  63645526800, #  local_start 2017-11-05 01:00:00 (Sun)
  63656416800, #    local_end 2018-03-11 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63656438400, #    utc_start 2018-03-11 08:00:00 (Sun)
  63676998000, #      utc_end 2018-11-04 07:00:00 (Sun)
  63656420400, #  local_start 2018-03-11 03:00:00 (Sun)
  63676980000, #    local_end 2018-11-04 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63676998000, #    utc_start 2018-11-04 07:00:00 (Sun)
  63687888000, #      utc_end 2019-03-10 08:00:00 (Sun)
  63676976400, #  local_start 2018-11-04 01:00:00 (Sun)
  63687866400, #    local_end 2019-03-10 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63687888000, #    utc_start 2019-03-10 08:00:00 (Sun)
  63708447600, #      utc_end 2019-11-03 07:00:00 (Sun)
  63687870000, #  local_start 2019-03-10 03:00:00 (Sun)
  63708429600, #    local_end 2019-11-03 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63708447600, #    utc_start 2019-11-03 07:00:00 (Sun)
  63719337600, #      utc_end 2020-03-08 08:00:00 (Sun)
  63708426000, #  local_start 2019-11-03 01:00:00 (Sun)
  63719316000, #    local_end 2020-03-08 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63719337600, #    utc_start 2020-03-08 08:00:00 (Sun)
  63739897200, #      utc_end 2020-11-01 07:00:00 (Sun)
  63719319600, #  local_start 2020-03-08 03:00:00 (Sun)
  63739879200, #    local_end 2020-11-01 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63739897200, #    utc_start 2020-11-01 07:00:00 (Sun)
  63751392000, #      utc_end 2021-03-14 08:00:00 (Sun)
  63739875600, #  local_start 2020-11-01 01:00:00 (Sun)
  63751370400, #    local_end 2021-03-14 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63751392000, #    utc_start 2021-03-14 08:00:00 (Sun)
  63771951600, #      utc_end 2021-11-07 07:00:00 (Sun)
  63751374000, #  local_start 2021-03-14 03:00:00 (Sun)
  63771933600, #    local_end 2021-11-07 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63771951600, #    utc_start 2021-11-07 07:00:00 (Sun)
  63782841600, #      utc_end 2022-03-13 08:00:00 (Sun)
  63771930000, #  local_start 2021-11-07 01:00:00 (Sun)
  63782820000, #    local_end 2022-03-13 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63782841600, #    utc_start 2022-03-13 08:00:00 (Sun)
  63803401200, #      utc_end 2022-11-06 07:00:00 (Sun)
  63782823600, #  local_start 2022-03-13 03:00:00 (Sun)
  63803383200, #    local_end 2022-11-06 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63803401200, #    utc_start 2022-11-06 07:00:00 (Sun)
  63814291200, #      utc_end 2023-03-12 08:00:00 (Sun)
  63803379600, #  local_start 2022-11-06 01:00:00 (Sun)
  63814269600, #    local_end 2023-03-12 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63814291200, #    utc_start 2023-03-12 08:00:00 (Sun)
  63834850800, #      utc_end 2023-11-05 07:00:00 (Sun)
  63814273200, #  local_start 2023-03-12 03:00:00 (Sun)
  63834832800, #    local_end 2023-11-05 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63834850800, #    utc_start 2023-11-05 07:00:00 (Sun)
  63845740800, #      utc_end 2024-03-10 08:00:00 (Sun)
  63834829200, #  local_start 2023-11-05 01:00:00 (Sun)
  63845719200, #    local_end 2024-03-10 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63845740800, #    utc_start 2024-03-10 08:00:00 (Sun)
  63866300400, #      utc_end 2024-11-03 07:00:00 (Sun)
  63845722800, #  local_start 2024-03-10 03:00:00 (Sun)
  63866282400, #    local_end 2024-11-03 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63866300400, #    utc_start 2024-11-03 07:00:00 (Sun)
  63877190400, #      utc_end 2025-03-09 08:00:00 (Sun)
  63866278800, #  local_start 2024-11-03 01:00:00 (Sun)
  63877168800, #    local_end 2025-03-09 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63877190400, #    utc_start 2025-03-09 08:00:00 (Sun)
  63897750000, #      utc_end 2025-11-02 07:00:00 (Sun)
  63877172400, #  local_start 2025-03-09 03:00:00 (Sun)
  63897732000, #    local_end 2025-11-02 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63897750000, #    utc_start 2025-11-02 07:00:00 (Sun)
  63908640000, #      utc_end 2026-03-08 08:00:00 (Sun)
  63897728400, #  local_start 2025-11-02 01:00:00 (Sun)
  63908618400, #    local_end 2026-03-08 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63908640000, #    utc_start 2026-03-08 08:00:00 (Sun)
  63929199600, #      utc_end 2026-11-01 07:00:00 (Sun)
  63908622000, #  local_start 2026-03-08 03:00:00 (Sun)
  63929181600, #    local_end 2026-11-01 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63929199600, #    utc_start 2026-11-01 07:00:00 (Sun)
  63940694400, #      utc_end 2027-03-14 08:00:00 (Sun)
  63929178000, #  local_start 2026-11-01 01:00:00 (Sun)
  63940672800, #    local_end 2027-03-14 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63940694400, #    utc_start 2027-03-14 08:00:00 (Sun)
  63961254000, #      utc_end 2027-11-07 07:00:00 (Sun)
  63940676400, #  local_start 2027-03-14 03:00:00 (Sun)
  63961236000, #    local_end 2027-11-07 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63961254000, #    utc_start 2027-11-07 07:00:00 (Sun)
  63972144000, #      utc_end 2028-03-12 08:00:00 (Sun)
  63961232400, #  local_start 2027-11-07 01:00:00 (Sun)
  63972122400, #    local_end 2028-03-12 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63972144000, #    utc_start 2028-03-12 08:00:00 (Sun)
  63992703600, #      utc_end 2028-11-05 07:00:00 (Sun)
  63972126000, #  local_start 2028-03-12 03:00:00 (Sun)
  63992685600, #    local_end 2028-11-05 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63992703600, #    utc_start 2028-11-05 07:00:00 (Sun)
  64003593600, #      utc_end 2029-03-11 08:00:00 (Sun)
  63992682000, #  local_start 2028-11-05 01:00:00 (Sun)
  64003572000, #    local_end 2029-03-11 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  64003593600, #    utc_start 2029-03-11 08:00:00 (Sun)
  64024153200, #      utc_end 2029-11-04 07:00:00 (Sun)
  64003575600, #  local_start 2029-03-11 03:00:00 (Sun)
  64024135200, #    local_end 2029-11-04 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  64024153200, #    utc_start 2029-11-04 07:00:00 (Sun)
  64035043200, #      utc_end 2030-03-10 08:00:00 (Sun)
  64024131600, #  local_start 2029-11-04 01:00:00 (Sun)
  64035021600, #    local_end 2030-03-10 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  64035043200, #    utc_start 2030-03-10 08:00:00 (Sun)
  64055602800, #      utc_end 2030-11-03 07:00:00 (Sun)
  64035025200, #  local_start 2030-03-10 03:00:00 (Sun)
  64055584800, #    local_end 2030-11-03 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {43}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -21600 }
  
  my $last_observance = bless( {
    'format' => 'C%sT',
    'gmtoff' => '-6:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 732403,
      'local_rd_secs' => 7200,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 732403,
      'utc_rd_secs' => 7200,
      'utc_year' => 2007
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -21600,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 732403,
      'local_rd_secs' => 25200,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 732403,
      'utc_rd_secs' => 25200,
      'utc_year' => 2007
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Nov',
      'letter' => 'S',
      'name' => 'US',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Mar',
      'letter' => 'D',
      'name' => 'US',
      'offset_from_std' => 3600,
      'on' => 'Sun>=8',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_INDIANA_TELL_CITY

    $main::fatpacked{"DateTime/TimeZone/America/Indiana/Vevay.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_INDIANA_VEVAY';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Indiana::Vevay;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Indiana::Vevay::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59418036000, #      utc_end 1883-11-18 18:00:00 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59418015584, #    local_end 1883-11-18 12:19:44 (Sun)
  -20416,
  0,
  'LMT',
      ],
      [
  59418036000, #    utc_start 1883-11-18 18:00:00 (Sun)
  60502406400, #      utc_end 1918-03-31 08:00:00 (Sun)
  59418014400, #  local_start 1883-11-18 12:00:00 (Sun)
  60502384800, #    local_end 1918-03-31 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  60502406400, #    utc_start 1918-03-31 08:00:00 (Sun)
  60520546800, #      utc_end 1918-10-27 07:00:00 (Sun)
  60502388400, #  local_start 1918-03-31 03:00:00 (Sun)
  60520528800, #    local_end 1918-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  60520546800, #    utc_start 1918-10-27 07:00:00 (Sun)
  60533856000, #      utc_end 1919-03-30 08:00:00 (Sun)
  60520525200, #  local_start 1918-10-27 01:00:00 (Sun)
  60533834400, #    local_end 1919-03-30 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  60533856000, #    utc_start 1919-03-30 08:00:00 (Sun)
  60551996400, #      utc_end 1919-10-26 07:00:00 (Sun)
  60533838000, #  local_start 1919-03-30 03:00:00 (Sun)
  60551978400, #    local_end 1919-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  60551996400, #    utc_start 1919-10-26 07:00:00 (Sun)
  61255468800, #      utc_end 1942-02-09 08:00:00 (Mon)
  60551974800, #  local_start 1919-10-26 01:00:00 (Sun)
  61255447200, #    local_end 1942-02-09 02:00:00 (Mon)
  -21600,
  0,
  'CST',
      ],
      [
  61255468800, #    utc_start 1942-02-09 08:00:00 (Mon)
  61366287600, #      utc_end 1945-08-14 23:00:00 (Tue)
  61255450800, #  local_start 1942-02-09 03:00:00 (Mon)
  61366269600, #    local_end 1945-08-14 18:00:00 (Tue)
  -18000,
  1,
  'CWT',
      ],
      [
  61366287600, #    utc_start 1945-08-14 23:00:00 (Tue)
  61370290800, #      utc_end 1945-09-30 07:00:00 (Sun)
  61366269600, #  local_start 1945-08-14 18:00:00 (Tue)
  61370272800, #    local_end 1945-09-30 02:00:00 (Sun)
  -18000,
  1,
  'CPT',
      ],
      [
  61370290800, #    utc_start 1945-09-30 07:00:00 (Sun)
  61640640000, #      utc_end 1954-04-25 08:00:00 (Sun)
  61370269200, #  local_start 1945-09-30 01:00:00 (Sun)
  61640618400, #    local_end 1954-04-25 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61640640000, #    utc_start 1954-04-25 08:00:00 (Sun)
  62104165200, #      utc_end 1969-01-01 05:00:00 (Wed)
  61640622000, #  local_start 1954-04-25 03:00:00 (Sun)
  62104147200, #    local_end 1969-01-01 00:00:00 (Wed)
  -18000,
  0,
  'EST',
      ],
      [
  62104165200, #    utc_start 1969-01-01 05:00:00 (Wed)
  62114194800, #      utc_end 1969-04-27 07:00:00 (Sun)
  62104147200, #  local_start 1969-01-01 00:00:00 (Wed)
  62114176800, #    local_end 1969-04-27 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62114194800, #    utc_start 1969-04-27 07:00:00 (Sun)
  62129916000, #      utc_end 1969-10-26 06:00:00 (Sun)
  62114180400, #  local_start 1969-04-27 03:00:00 (Sun)
  62129901600, #    local_end 1969-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62129916000, #    utc_start 1969-10-26 06:00:00 (Sun)
  62145644400, #      utc_end 1970-04-26 07:00:00 (Sun)
  62129898000, #  local_start 1969-10-26 01:00:00 (Sun)
  62145626400, #    local_end 1970-04-26 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62145644400, #    utc_start 1970-04-26 07:00:00 (Sun)
  62161365600, #      utc_end 1970-10-25 06:00:00 (Sun)
  62145630000, #  local_start 1970-04-26 03:00:00 (Sun)
  62161351200, #    local_end 1970-10-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62161365600, #    utc_start 1970-10-25 06:00:00 (Sun)
  62177094000, #      utc_end 1971-04-25 07:00:00 (Sun)
  62161347600, #  local_start 1970-10-25 01:00:00 (Sun)
  62177076000, #    local_end 1971-04-25 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62177094000, #    utc_start 1971-04-25 07:00:00 (Sun)
  62193420000, #      utc_end 1971-10-31 06:00:00 (Sun)
  62177079600, #  local_start 1971-04-25 03:00:00 (Sun)
  62193405600, #    local_end 1971-10-31 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62193420000, #    utc_start 1971-10-31 06:00:00 (Sun)
  62209148400, #      utc_end 1972-04-30 07:00:00 (Sun)
  62193402000, #  local_start 1971-10-31 01:00:00 (Sun)
  62209130400, #    local_end 1972-04-30 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62209148400, #    utc_start 1972-04-30 07:00:00 (Sun)
  62224869600, #      utc_end 1972-10-29 06:00:00 (Sun)
  62209134000, #  local_start 1972-04-30 03:00:00 (Sun)
  62224855200, #    local_end 1972-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62224869600, #    utc_start 1972-10-29 06:00:00 (Sun)
  62230395600, #      utc_end 1973-01-01 05:00:00 (Mon)
  62224851600, #  local_start 1972-10-29 01:00:00 (Sun)
  62230377600, #    local_end 1973-01-01 00:00:00 (Mon)
  -18000,
  0,
  'EST',
      ],
      [
  62230395600, #    utc_start 1973-01-01 05:00:00 (Mon)
  63271774800, #      utc_end 2006-01-01 05:00:00 (Sun)
  62230377600, #  local_start 1973-01-01 00:00:00 (Mon)
  63271756800, #    local_end 2006-01-01 00:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63271774800, #    utc_start 2006-01-01 05:00:00 (Sun)
  63279644400, #      utc_end 2006-04-02 07:00:00 (Sun)
  63271756800, #  local_start 2006-01-01 00:00:00 (Sun)
  63279626400, #    local_end 2006-04-02 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63279644400, #    utc_start 2006-04-02 07:00:00 (Sun)
  63297784800, #      utc_end 2006-10-29 06:00:00 (Sun)
  63279630000, #  local_start 2006-04-02 03:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63297784800, #    utc_start 2006-10-29 06:00:00 (Sun)
  63309279600, #      utc_end 2007-03-11 07:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63309261600, #    local_end 2007-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63309279600, #    utc_start 2007-03-11 07:00:00 (Sun)
  63329839200, #      utc_end 2007-11-04 06:00:00 (Sun)
  63309265200, #  local_start 2007-03-11 03:00:00 (Sun)
  63329824800, #    local_end 2007-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63329839200, #    utc_start 2007-11-04 06:00:00 (Sun)
  63340729200, #      utc_end 2008-03-09 07:00:00 (Sun)
  63329821200, #  local_start 2007-11-04 01:00:00 (Sun)
  63340711200, #    local_end 2008-03-09 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63340729200, #    utc_start 2008-03-09 07:00:00 (Sun)
  63361288800, #      utc_end 2008-11-02 06:00:00 (Sun)
  63340714800, #  local_start 2008-03-09 03:00:00 (Sun)
  63361274400, #    local_end 2008-11-02 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63361288800, #    utc_start 2008-11-02 06:00:00 (Sun)
  63372178800, #      utc_end 2009-03-08 07:00:00 (Sun)
  63361270800, #  local_start 2008-11-02 01:00:00 (Sun)
  63372160800, #    local_end 2009-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63372178800, #    utc_start 2009-03-08 07:00:00 (Sun)
  63392738400, #      utc_end 2009-11-01 06:00:00 (Sun)
  63372164400, #  local_start 2009-03-08 03:00:00 (Sun)
  63392724000, #    local_end 2009-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63392738400, #    utc_start 2009-11-01 06:00:00 (Sun)
  63404233200, #      utc_end 2010-03-14 07:00:00 (Sun)
  63392720400, #  local_start 2009-11-01 01:00:00 (Sun)
  63404215200, #    local_end 2010-03-14 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63404233200, #    utc_start 2010-03-14 07:00:00 (Sun)
  63424792800, #      utc_end 2010-11-07 06:00:00 (Sun)
  63404218800, #  local_start 2010-03-14 03:00:00 (Sun)
  63424778400, #    local_end 2010-11-07 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63424792800, #    utc_start 2010-11-07 06:00:00 (Sun)
  63435682800, #      utc_end 2011-03-13 07:00:00 (Sun)
  63424774800, #  local_start 2010-11-07 01:00:00 (Sun)
  63435664800, #    local_end 2011-03-13 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63435682800, #    utc_start 2011-03-13 07:00:00 (Sun)
  63456242400, #      utc_end 2011-11-06 06:00:00 (Sun)
  63435668400, #  local_start 2011-03-13 03:00:00 (Sun)
  63456228000, #    local_end 2011-11-06 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63456242400, #    utc_start 2011-11-06 06:00:00 (Sun)
  63467132400, #      utc_end 2012-03-11 07:00:00 (Sun)
  63456224400, #  local_start 2011-11-06 01:00:00 (Sun)
  63467114400, #    local_end 2012-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63467132400, #    utc_start 2012-03-11 07:00:00 (Sun)
  63487692000, #      utc_end 2012-11-04 06:00:00 (Sun)
  63467118000, #  local_start 2012-03-11 03:00:00 (Sun)
  63487677600, #    local_end 2012-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63487692000, #    utc_start 2012-11-04 06:00:00 (Sun)
  63498582000, #      utc_end 2013-03-10 07:00:00 (Sun)
  63487674000, #  local_start 2012-11-04 01:00:00 (Sun)
  63498564000, #    local_end 2013-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63498582000, #    utc_start 2013-03-10 07:00:00 (Sun)
  63519141600, #      utc_end 2013-11-03 06:00:00 (Sun)
  63498567600, #  local_start 2013-03-10 03:00:00 (Sun)
  63519127200, #    local_end 2013-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63519141600, #    utc_start 2013-11-03 06:00:00 (Sun)
  63530031600, #      utc_end 2014-03-09 07:00:00 (Sun)
  63519123600, #  local_start 2013-11-03 01:00:00 (Sun)
  63530013600, #    local_end 2014-03-09 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63530031600, #    utc_start 2014-03-09 07:00:00 (Sun)
  63550591200, #      utc_end 2014-11-02 06:00:00 (Sun)
  63530017200, #  local_start 2014-03-09 03:00:00 (Sun)
  63550576800, #    local_end 2014-11-02 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63550591200, #    utc_start 2014-11-02 06:00:00 (Sun)
  63561481200, #      utc_end 2015-03-08 07:00:00 (Sun)
  63550573200, #  local_start 2014-11-02 01:00:00 (Sun)
  63561463200, #    local_end 2015-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63561481200, #    utc_start 2015-03-08 07:00:00 (Sun)
  63582040800, #      utc_end 2015-11-01 06:00:00 (Sun)
  63561466800, #  local_start 2015-03-08 03:00:00 (Sun)
  63582026400, #    local_end 2015-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63582040800, #    utc_start 2015-11-01 06:00:00 (Sun)
  63593535600, #      utc_end 2016-03-13 07:00:00 (Sun)
  63582022800, #  local_start 2015-11-01 01:00:00 (Sun)
  63593517600, #    local_end 2016-03-13 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63593535600, #    utc_start 2016-03-13 07:00:00 (Sun)
  63614095200, #      utc_end 2016-11-06 06:00:00 (Sun)
  63593521200, #  local_start 2016-03-13 03:00:00 (Sun)
  63614080800, #    local_end 2016-11-06 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63614095200, #    utc_start 2016-11-06 06:00:00 (Sun)
  63624985200, #      utc_end 2017-03-12 07:00:00 (Sun)
  63614077200, #  local_start 2016-11-06 01:00:00 (Sun)
  63624967200, #    local_end 2017-03-12 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63624985200, #    utc_start 2017-03-12 07:00:00 (Sun)
  63645544800, #      utc_end 2017-11-05 06:00:00 (Sun)
  63624970800, #  local_start 2017-03-12 03:00:00 (Sun)
  63645530400, #    local_end 2017-11-05 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63645544800, #    utc_start 2017-11-05 06:00:00 (Sun)
  63656434800, #      utc_end 2018-03-11 07:00:00 (Sun)
  63645526800, #  local_start 2017-11-05 01:00:00 (Sun)
  63656416800, #    local_end 2018-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63656434800, #    utc_start 2018-03-11 07:00:00 (Sun)
  63676994400, #      utc_end 2018-11-04 06:00:00 (Sun)
  63656420400, #  local_start 2018-03-11 03:00:00 (Sun)
  63676980000, #    local_end 2018-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63676994400, #    utc_start 2018-11-04 06:00:00 (Sun)
  63687884400, #      utc_end 2019-03-10 07:00:00 (Sun)
  63676976400, #  local_start 2018-11-04 01:00:00 (Sun)
  63687866400, #    local_end 2019-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63687884400, #    utc_start 2019-03-10 07:00:00 (Sun)
  63708444000, #      utc_end 2019-11-03 06:00:00 (Sun)
  63687870000, #  local_start 2019-03-10 03:00:00 (Sun)
  63708429600, #    local_end 2019-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63708444000, #    utc_start 2019-11-03 06:00:00 (Sun)
  63719334000, #      utc_end 2020-03-08 07:00:00 (Sun)
  63708426000, #  local_start 2019-11-03 01:00:00 (Sun)
  63719316000, #    local_end 2020-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63719334000, #    utc_start 2020-03-08 07:00:00 (Sun)
  63739893600, #      utc_end 2020-11-01 06:00:00 (Sun)
  63719319600, #  local_start 2020-03-08 03:00:00 (Sun)
  63739879200, #    local_end 2020-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63739893600, #    utc_start 2020-11-01 06:00:00 (Sun)
  63751388400, #      utc_end 2021-03-14 07:00:00 (Sun)
  63739875600, #  local_start 2020-11-01 01:00:00 (Sun)
  63751370400, #    local_end 2021-03-14 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63751388400, #    utc_start 2021-03-14 07:00:00 (Sun)
  63771948000, #      utc_end 2021-11-07 06:00:00 (Sun)
  63751374000, #  local_start 2021-03-14 03:00:00 (Sun)
  63771933600, #    local_end 2021-11-07 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63771948000, #    utc_start 2021-11-07 06:00:00 (Sun)
  63782838000, #      utc_end 2022-03-13 07:00:00 (Sun)
  63771930000, #  local_start 2021-11-07 01:00:00 (Sun)
  63782820000, #    local_end 2022-03-13 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63782838000, #    utc_start 2022-03-13 07:00:00 (Sun)
  63803397600, #      utc_end 2022-11-06 06:00:00 (Sun)
  63782823600, #  local_start 2022-03-13 03:00:00 (Sun)
  63803383200, #    local_end 2022-11-06 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63803397600, #    utc_start 2022-11-06 06:00:00 (Sun)
  63814287600, #      utc_end 2023-03-12 07:00:00 (Sun)
  63803379600, #  local_start 2022-11-06 01:00:00 (Sun)
  63814269600, #    local_end 2023-03-12 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63814287600, #    utc_start 2023-03-12 07:00:00 (Sun)
  63834847200, #      utc_end 2023-11-05 06:00:00 (Sun)
  63814273200, #  local_start 2023-03-12 03:00:00 (Sun)
  63834832800, #    local_end 2023-11-05 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63834847200, #    utc_start 2023-11-05 06:00:00 (Sun)
  63845737200, #      utc_end 2024-03-10 07:00:00 (Sun)
  63834829200, #  local_start 2023-11-05 01:00:00 (Sun)
  63845719200, #    local_end 2024-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63845737200, #    utc_start 2024-03-10 07:00:00 (Sun)
  63866296800, #      utc_end 2024-11-03 06:00:00 (Sun)
  63845722800, #  local_start 2024-03-10 03:00:00 (Sun)
  63866282400, #    local_end 2024-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63866296800, #    utc_start 2024-11-03 06:00:00 (Sun)
  63877186800, #      utc_end 2025-03-09 07:00:00 (Sun)
  63866278800, #  local_start 2024-11-03 01:00:00 (Sun)
  63877168800, #    local_end 2025-03-09 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63877186800, #    utc_start 2025-03-09 07:00:00 (Sun)
  63897746400, #      utc_end 2025-11-02 06:00:00 (Sun)
  63877172400, #  local_start 2025-03-09 03:00:00 (Sun)
  63897732000, #    local_end 2025-11-02 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63897746400, #    utc_start 2025-11-02 06:00:00 (Sun)
  63908636400, #      utc_end 2026-03-08 07:00:00 (Sun)
  63897728400, #  local_start 2025-11-02 01:00:00 (Sun)
  63908618400, #    local_end 2026-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63908636400, #    utc_start 2026-03-08 07:00:00 (Sun)
  63929196000, #      utc_end 2026-11-01 06:00:00 (Sun)
  63908622000, #  local_start 2026-03-08 03:00:00 (Sun)
  63929181600, #    local_end 2026-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63929196000, #    utc_start 2026-11-01 06:00:00 (Sun)
  63940690800, #      utc_end 2027-03-14 07:00:00 (Sun)
  63929178000, #  local_start 2026-11-01 01:00:00 (Sun)
  63940672800, #    local_end 2027-03-14 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63940690800, #    utc_start 2027-03-14 07:00:00 (Sun)
  63961250400, #      utc_end 2027-11-07 06:00:00 (Sun)
  63940676400, #  local_start 2027-03-14 03:00:00 (Sun)
  63961236000, #    local_end 2027-11-07 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63961250400, #    utc_start 2027-11-07 06:00:00 (Sun)
  63972140400, #      utc_end 2028-03-12 07:00:00 (Sun)
  63961232400, #  local_start 2027-11-07 01:00:00 (Sun)
  63972122400, #    local_end 2028-03-12 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63972140400, #    utc_start 2028-03-12 07:00:00 (Sun)
  63992700000, #      utc_end 2028-11-05 06:00:00 (Sun)
  63972126000, #  local_start 2028-03-12 03:00:00 (Sun)
  63992685600, #    local_end 2028-11-05 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63992700000, #    utc_start 2028-11-05 06:00:00 (Sun)
  64003590000, #      utc_end 2029-03-11 07:00:00 (Sun)
  63992682000, #  local_start 2028-11-05 01:00:00 (Sun)
  64003572000, #    local_end 2029-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  64003590000, #    utc_start 2029-03-11 07:00:00 (Sun)
  64024149600, #      utc_end 2029-11-04 06:00:00 (Sun)
  64003575600, #  local_start 2029-03-11 03:00:00 (Sun)
  64024135200, #    local_end 2029-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  64024149600, #    utc_start 2029-11-04 06:00:00 (Sun)
  64035039600, #      utc_end 2030-03-10 07:00:00 (Sun)
  64024131600, #  local_start 2029-11-04 01:00:00 (Sun)
  64035021600, #    local_end 2030-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  64035039600, #    utc_start 2030-03-10 07:00:00 (Sun)
  64055599200, #      utc_end 2030-11-03 06:00:00 (Sun)
  64035025200, #  local_start 2030-03-10 03:00:00 (Sun)
  64055584800, #    local_end 2030-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {33}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -18000 }
  
  my $last_observance = bless( {
    'format' => 'E%sT',
    'gmtoff' => '-5:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 732312,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 732312,
      'utc_rd_secs' => 0,
      'utc_year' => 2007
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -18000,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 732312,
      'local_rd_secs' => 18000,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 732312,
      'utc_rd_secs' => 18000,
      'utc_year' => 2007
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Nov',
      'letter' => 'S',
      'name' => 'US',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Mar',
      'letter' => 'D',
      'name' => 'US',
      'offset_from_std' => 3600,
      'on' => 'Sun>=8',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_INDIANA_VEVAY

    $main::fatpacked{"DateTime/TimeZone/America/Indiana/Vincennes.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_INDIANA_VINCENNES';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Indiana::Vincennes;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Indiana::Vincennes::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59418036000, #      utc_end 1883-11-18 18:00:00 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59418014993, #    local_end 1883-11-18 12:09:53 (Sun)
  -21007,
  0,
  'LMT',
      ],
      [
  59418036000, #    utc_start 1883-11-18 18:00:00 (Sun)
  60502406400, #      utc_end 1918-03-31 08:00:00 (Sun)
  59418014400, #  local_start 1883-11-18 12:00:00 (Sun)
  60502384800, #    local_end 1918-03-31 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  60502406400, #    utc_start 1918-03-31 08:00:00 (Sun)
  60520546800, #      utc_end 1918-10-27 07:00:00 (Sun)
  60502388400, #  local_start 1918-03-31 03:00:00 (Sun)
  60520528800, #    local_end 1918-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  60520546800, #    utc_start 1918-10-27 07:00:00 (Sun)
  60533856000, #      utc_end 1919-03-30 08:00:00 (Sun)
  60520525200, #  local_start 1918-10-27 01:00:00 (Sun)
  60533834400, #    local_end 1919-03-30 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  60533856000, #    utc_start 1919-03-30 08:00:00 (Sun)
  60551996400, #      utc_end 1919-10-26 07:00:00 (Sun)
  60533838000, #  local_start 1919-03-30 03:00:00 (Sun)
  60551978400, #    local_end 1919-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  60551996400, #    utc_start 1919-10-26 07:00:00 (Sun)
  61255468800, #      utc_end 1942-02-09 08:00:00 (Mon)
  60551974800, #  local_start 1919-10-26 01:00:00 (Sun)
  61255447200, #    local_end 1942-02-09 02:00:00 (Mon)
  -21600,
  0,
  'CST',
      ],
      [
  61255468800, #    utc_start 1942-02-09 08:00:00 (Mon)
  61366287600, #      utc_end 1945-08-14 23:00:00 (Tue)
  61255450800, #  local_start 1942-02-09 03:00:00 (Mon)
  61366269600, #    local_end 1945-08-14 18:00:00 (Tue)
  -18000,
  1,
  'CWT',
      ],
      [
  61366287600, #    utc_start 1945-08-14 23:00:00 (Tue)
  61370290800, #      utc_end 1945-09-30 07:00:00 (Sun)
  61366269600, #  local_start 1945-08-14 18:00:00 (Tue)
  61370272800, #    local_end 1945-09-30 02:00:00 (Sun)
  -18000,
  1,
  'CPT',
      ],
      [
  61370290800, #    utc_start 1945-09-30 07:00:00 (Sun)
  61378322400, #      utc_end 1946-01-01 06:00:00 (Tue)
  61370269200, #  local_start 1945-09-30 01:00:00 (Sun)
  61378300800, #    local_end 1946-01-01 00:00:00 (Tue)
  -21600,
  0,
  'CST',
      ],
      [
  61378322400, #    utc_start 1946-01-01 06:00:00 (Tue)
  61388438400, #      utc_end 1946-04-28 08:00:00 (Sun)
  61378300800, #  local_start 1946-01-01 00:00:00 (Tue)
  61388416800, #    local_end 1946-04-28 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61388438400, #    utc_start 1946-04-28 08:00:00 (Sun)
  61401740400, #      utc_end 1946-09-29 07:00:00 (Sun)
  61388420400, #  local_start 1946-04-28 03:00:00 (Sun)
  61401722400, #    local_end 1946-09-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61401740400, #    utc_start 1946-09-29 07:00:00 (Sun)
  61609190400, #      utc_end 1953-04-26 08:00:00 (Sun)
  61401718800, #  local_start 1946-09-29 01:00:00 (Sun)
  61609168800, #    local_end 1953-04-26 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61609190400, #    utc_start 1953-04-26 08:00:00 (Sun)
  61622492400, #      utc_end 1953-09-27 07:00:00 (Sun)
  61609172400, #  local_start 1953-04-26 03:00:00 (Sun)
  61622474400, #    local_end 1953-09-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61622492400, #    utc_start 1953-09-27 07:00:00 (Sun)
  61640640000, #      utc_end 1954-04-25 08:00:00 (Sun)
  61622470800, #  local_start 1953-09-27 01:00:00 (Sun)
  61640618400, #    local_end 1954-04-25 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61640640000, #    utc_start 1954-04-25 08:00:00 (Sun)
  61653942000, #      utc_end 1954-09-26 07:00:00 (Sun)
  61640622000, #  local_start 1954-04-25 03:00:00 (Sun)
  61653924000, #    local_end 1954-09-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61653942000, #    utc_start 1954-09-26 07:00:00 (Sun)
  61672687200, #      utc_end 1955-05-01 06:00:00 (Sun)
  61653920400, #  local_start 1954-09-26 01:00:00 (Sun)
  61672665600, #    local_end 1955-05-01 00:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61672687200, #    utc_start 1955-05-01 06:00:00 (Sun)
  61685391600, #      utc_end 1955-09-25 07:00:00 (Sun)
  61672669200, #  local_start 1955-05-01 01:00:00 (Sun)
  61685373600, #    local_end 1955-09-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61685391600, #    utc_start 1955-09-25 07:00:00 (Sun)
  61704144000, #      utc_end 1956-04-29 08:00:00 (Sun)
  61685370000, #  local_start 1955-09-25 01:00:00 (Sun)
  61704122400, #    local_end 1956-04-29 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61704144000, #    utc_start 1956-04-29 08:00:00 (Sun)
  61717446000, #      utc_end 1956-09-30 07:00:00 (Sun)
  61704126000, #  local_start 1956-04-29 03:00:00 (Sun)
  61717428000, #    local_end 1956-09-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61717446000, #    utc_start 1956-09-30 07:00:00 (Sun)
  61735593600, #      utc_end 1957-04-28 08:00:00 (Sun)
  61717424400, #  local_start 1956-09-30 01:00:00 (Sun)
  61735572000, #    local_end 1957-04-28 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61735593600, #    utc_start 1957-04-28 08:00:00 (Sun)
  61748895600, #      utc_end 1957-09-29 07:00:00 (Sun)
  61735575600, #  local_start 1957-04-28 03:00:00 (Sun)
  61748877600, #    local_end 1957-09-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61748895600, #    utc_start 1957-09-29 07:00:00 (Sun)
  61767043200, #      utc_end 1958-04-27 08:00:00 (Sun)
  61748874000, #  local_start 1957-09-29 01:00:00 (Sun)
  61767021600, #    local_end 1958-04-27 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61767043200, #    utc_start 1958-04-27 08:00:00 (Sun)
  61780345200, #      utc_end 1958-09-28 07:00:00 (Sun)
  61767025200, #  local_start 1958-04-27 03:00:00 (Sun)
  61780327200, #    local_end 1958-09-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61780345200, #    utc_start 1958-09-28 07:00:00 (Sun)
  61798492800, #      utc_end 1959-04-26 08:00:00 (Sun)
  61780323600, #  local_start 1958-09-28 01:00:00 (Sun)
  61798471200, #    local_end 1959-04-26 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61798492800, #    utc_start 1959-04-26 08:00:00 (Sun)
  61811794800, #      utc_end 1959-09-27 07:00:00 (Sun)
  61798474800, #  local_start 1959-04-26 03:00:00 (Sun)
  61811776800, #    local_end 1959-09-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61811794800, #    utc_start 1959-09-27 07:00:00 (Sun)
  61829942400, #      utc_end 1960-04-24 08:00:00 (Sun)
  61811773200, #  local_start 1959-09-27 01:00:00 (Sun)
  61829920800, #    local_end 1960-04-24 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61829942400, #    utc_start 1960-04-24 08:00:00 (Sun)
  61846268400, #      utc_end 1960-10-30 07:00:00 (Sun)
  61829924400, #  local_start 1960-04-24 03:00:00 (Sun)
  61846250400, #    local_end 1960-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61846268400, #    utc_start 1960-10-30 07:00:00 (Sun)
  61861996800, #      utc_end 1961-04-30 08:00:00 (Sun)
  61846246800, #  local_start 1960-10-30 01:00:00 (Sun)
  61861975200, #    local_end 1961-04-30 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61861996800, #    utc_start 1961-04-30 08:00:00 (Sun)
  61874694000, #      utc_end 1961-09-24 07:00:00 (Sun)
  61861978800, #  local_start 1961-04-30 03:00:00 (Sun)
  61874676000, #    local_end 1961-09-24 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61874694000, #    utc_start 1961-09-24 07:00:00 (Sun)
  61893446400, #      utc_end 1962-04-29 08:00:00 (Sun)
  61874672400, #  local_start 1961-09-24 01:00:00 (Sun)
  61893424800, #    local_end 1962-04-29 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61893446400, #    utc_start 1962-04-29 08:00:00 (Sun)
  61909167600, #      utc_end 1962-10-28 07:00:00 (Sun)
  61893428400, #  local_start 1962-04-29 03:00:00 (Sun)
  61909149600, #    local_end 1962-10-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61909167600, #    utc_start 1962-10-28 07:00:00 (Sun)
  61924896000, #      utc_end 1963-04-28 08:00:00 (Sun)
  61909146000, #  local_start 1962-10-28 01:00:00 (Sun)
  61924874400, #    local_end 1963-04-28 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61924896000, #    utc_start 1963-04-28 08:00:00 (Sun)
  61940617200, #      utc_end 1963-10-27 07:00:00 (Sun)
  61924878000, #  local_start 1963-04-28 03:00:00 (Sun)
  61940599200, #    local_end 1963-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61940617200, #    utc_start 1963-10-27 07:00:00 (Sun)
  61956345600, #      utc_end 1964-04-26 08:00:00 (Sun)
  61940595600, #  local_start 1963-10-27 01:00:00 (Sun)
  61956324000, #    local_end 1964-04-26 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61956345600, #    utc_start 1964-04-26 08:00:00 (Sun)
  62104165200, #      utc_end 1969-01-01 05:00:00 (Wed)
  61956327600, #  local_start 1964-04-26 03:00:00 (Sun)
  62104147200, #    local_end 1969-01-01 00:00:00 (Wed)
  -18000,
  0,
  'EST',
      ],
      [
  62104165200, #    utc_start 1969-01-01 05:00:00 (Wed)
  62114194800, #      utc_end 1969-04-27 07:00:00 (Sun)
  62104147200, #  local_start 1969-01-01 00:00:00 (Wed)
  62114176800, #    local_end 1969-04-27 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62114194800, #    utc_start 1969-04-27 07:00:00 (Sun)
  62129916000, #      utc_end 1969-10-26 06:00:00 (Sun)
  62114180400, #  local_start 1969-04-27 03:00:00 (Sun)
  62129901600, #    local_end 1969-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62129916000, #    utc_start 1969-10-26 06:00:00 (Sun)
  62145644400, #      utc_end 1970-04-26 07:00:00 (Sun)
  62129898000, #  local_start 1969-10-26 01:00:00 (Sun)
  62145626400, #    local_end 1970-04-26 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62145644400, #    utc_start 1970-04-26 07:00:00 (Sun)
  62161365600, #      utc_end 1970-10-25 06:00:00 (Sun)
  62145630000, #  local_start 1970-04-26 03:00:00 (Sun)
  62161351200, #    local_end 1970-10-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62161365600, #    utc_start 1970-10-25 06:00:00 (Sun)
  62167237200, #      utc_end 1971-01-01 05:00:00 (Fri)
  62161347600, #  local_start 1970-10-25 01:00:00 (Sun)
  62167219200, #    local_end 1971-01-01 00:00:00 (Fri)
  -18000,
  0,
  'EST',
      ],
      [
  62167237200, #    utc_start 1971-01-01 05:00:00 (Fri)
  63279644400, #      utc_end 2006-04-02 07:00:00 (Sun)
  62167219200, #  local_start 1971-01-01 00:00:00 (Fri)
  63279626400, #    local_end 2006-04-02 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63279644400, #    utc_start 2006-04-02 07:00:00 (Sun)
  63297788400, #      utc_end 2006-10-29 07:00:00 (Sun)
  63279626400, #  local_start 2006-04-02 02:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63297788400, #    utc_start 2006-10-29 07:00:00 (Sun)
  63309283200, #      utc_end 2007-03-11 08:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63309261600, #    local_end 2007-03-11 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63309283200, #    utc_start 2007-03-11 08:00:00 (Sun)
  63329842800, #      utc_end 2007-11-04 07:00:00 (Sun)
  63309265200, #  local_start 2007-03-11 03:00:00 (Sun)
  63329824800, #    local_end 2007-11-04 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63329842800, #    utc_start 2007-11-04 07:00:00 (Sun)
  63340729200, #      utc_end 2008-03-09 07:00:00 (Sun)
  63329824800, #  local_start 2007-11-04 02:00:00 (Sun)
  63340711200, #    local_end 2008-03-09 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63340729200, #    utc_start 2008-03-09 07:00:00 (Sun)
  63361288800, #      utc_end 2008-11-02 06:00:00 (Sun)
  63340714800, #  local_start 2008-03-09 03:00:00 (Sun)
  63361274400, #    local_end 2008-11-02 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63361288800, #    utc_start 2008-11-02 06:00:00 (Sun)
  63372178800, #      utc_end 2009-03-08 07:00:00 (Sun)
  63361270800, #  local_start 2008-11-02 01:00:00 (Sun)
  63372160800, #    local_end 2009-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63372178800, #    utc_start 2009-03-08 07:00:00 (Sun)
  63392738400, #      utc_end 2009-11-01 06:00:00 (Sun)
  63372164400, #  local_start 2009-03-08 03:00:00 (Sun)
  63392724000, #    local_end 2009-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63392738400, #    utc_start 2009-11-01 06:00:00 (Sun)
  63404233200, #      utc_end 2010-03-14 07:00:00 (Sun)
  63392720400, #  local_start 2009-11-01 01:00:00 (Sun)
  63404215200, #    local_end 2010-03-14 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63404233200, #    utc_start 2010-03-14 07:00:00 (Sun)
  63424792800, #      utc_end 2010-11-07 06:00:00 (Sun)
  63404218800, #  local_start 2010-03-14 03:00:00 (Sun)
  63424778400, #    local_end 2010-11-07 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63424792800, #    utc_start 2010-11-07 06:00:00 (Sun)
  63435682800, #      utc_end 2011-03-13 07:00:00 (Sun)
  63424774800, #  local_start 2010-11-07 01:00:00 (Sun)
  63435664800, #    local_end 2011-03-13 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63435682800, #    utc_start 2011-03-13 07:00:00 (Sun)
  63456242400, #      utc_end 2011-11-06 06:00:00 (Sun)
  63435668400, #  local_start 2011-03-13 03:00:00 (Sun)
  63456228000, #    local_end 2011-11-06 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63456242400, #    utc_start 2011-11-06 06:00:00 (Sun)
  63467132400, #      utc_end 2012-03-11 07:00:00 (Sun)
  63456224400, #  local_start 2011-11-06 01:00:00 (Sun)
  63467114400, #    local_end 2012-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63467132400, #    utc_start 2012-03-11 07:00:00 (Sun)
  63487692000, #      utc_end 2012-11-04 06:00:00 (Sun)
  63467118000, #  local_start 2012-03-11 03:00:00 (Sun)
  63487677600, #    local_end 2012-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63487692000, #    utc_start 2012-11-04 06:00:00 (Sun)
  63498582000, #      utc_end 2013-03-10 07:00:00 (Sun)
  63487674000, #  local_start 2012-11-04 01:00:00 (Sun)
  63498564000, #    local_end 2013-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63498582000, #    utc_start 2013-03-10 07:00:00 (Sun)
  63519141600, #      utc_end 2013-11-03 06:00:00 (Sun)
  63498567600, #  local_start 2013-03-10 03:00:00 (Sun)
  63519127200, #    local_end 2013-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63519141600, #    utc_start 2013-11-03 06:00:00 (Sun)
  63530031600, #      utc_end 2014-03-09 07:00:00 (Sun)
  63519123600, #  local_start 2013-11-03 01:00:00 (Sun)
  63530013600, #    local_end 2014-03-09 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63530031600, #    utc_start 2014-03-09 07:00:00 (Sun)
  63550591200, #      utc_end 2014-11-02 06:00:00 (Sun)
  63530017200, #  local_start 2014-03-09 03:00:00 (Sun)
  63550576800, #    local_end 2014-11-02 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63550591200, #    utc_start 2014-11-02 06:00:00 (Sun)
  63561481200, #      utc_end 2015-03-08 07:00:00 (Sun)
  63550573200, #  local_start 2014-11-02 01:00:00 (Sun)
  63561463200, #    local_end 2015-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63561481200, #    utc_start 2015-03-08 07:00:00 (Sun)
  63582040800, #      utc_end 2015-11-01 06:00:00 (Sun)
  63561466800, #  local_start 2015-03-08 03:00:00 (Sun)
  63582026400, #    local_end 2015-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63582040800, #    utc_start 2015-11-01 06:00:00 (Sun)
  63593535600, #      utc_end 2016-03-13 07:00:00 (Sun)
  63582022800, #  local_start 2015-11-01 01:00:00 (Sun)
  63593517600, #    local_end 2016-03-13 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63593535600, #    utc_start 2016-03-13 07:00:00 (Sun)
  63614095200, #      utc_end 2016-11-06 06:00:00 (Sun)
  63593521200, #  local_start 2016-03-13 03:00:00 (Sun)
  63614080800, #    local_end 2016-11-06 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63614095200, #    utc_start 2016-11-06 06:00:00 (Sun)
  63624985200, #      utc_end 2017-03-12 07:00:00 (Sun)
  63614077200, #  local_start 2016-11-06 01:00:00 (Sun)
  63624967200, #    local_end 2017-03-12 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63624985200, #    utc_start 2017-03-12 07:00:00 (Sun)
  63645544800, #      utc_end 2017-11-05 06:00:00 (Sun)
  63624970800, #  local_start 2017-03-12 03:00:00 (Sun)
  63645530400, #    local_end 2017-11-05 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63645544800, #    utc_start 2017-11-05 06:00:00 (Sun)
  63656434800, #      utc_end 2018-03-11 07:00:00 (Sun)
  63645526800, #  local_start 2017-11-05 01:00:00 (Sun)
  63656416800, #    local_end 2018-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63656434800, #    utc_start 2018-03-11 07:00:00 (Sun)
  63676994400, #      utc_end 2018-11-04 06:00:00 (Sun)
  63656420400, #  local_start 2018-03-11 03:00:00 (Sun)
  63676980000, #    local_end 2018-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63676994400, #    utc_start 2018-11-04 06:00:00 (Sun)
  63687884400, #      utc_end 2019-03-10 07:00:00 (Sun)
  63676976400, #  local_start 2018-11-04 01:00:00 (Sun)
  63687866400, #    local_end 2019-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63687884400, #    utc_start 2019-03-10 07:00:00 (Sun)
  63708444000, #      utc_end 2019-11-03 06:00:00 (Sun)
  63687870000, #  local_start 2019-03-10 03:00:00 (Sun)
  63708429600, #    local_end 2019-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63708444000, #    utc_start 2019-11-03 06:00:00 (Sun)
  63719334000, #      utc_end 2020-03-08 07:00:00 (Sun)
  63708426000, #  local_start 2019-11-03 01:00:00 (Sun)
  63719316000, #    local_end 2020-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63719334000, #    utc_start 2020-03-08 07:00:00 (Sun)
  63739893600, #      utc_end 2020-11-01 06:00:00 (Sun)
  63719319600, #  local_start 2020-03-08 03:00:00 (Sun)
  63739879200, #    local_end 2020-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63739893600, #    utc_start 2020-11-01 06:00:00 (Sun)
  63751388400, #      utc_end 2021-03-14 07:00:00 (Sun)
  63739875600, #  local_start 2020-11-01 01:00:00 (Sun)
  63751370400, #    local_end 2021-03-14 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63751388400, #    utc_start 2021-03-14 07:00:00 (Sun)
  63771948000, #      utc_end 2021-11-07 06:00:00 (Sun)
  63751374000, #  local_start 2021-03-14 03:00:00 (Sun)
  63771933600, #    local_end 2021-11-07 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63771948000, #    utc_start 2021-11-07 06:00:00 (Sun)
  63782838000, #      utc_end 2022-03-13 07:00:00 (Sun)
  63771930000, #  local_start 2021-11-07 01:00:00 (Sun)
  63782820000, #    local_end 2022-03-13 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63782838000, #    utc_start 2022-03-13 07:00:00 (Sun)
  63803397600, #      utc_end 2022-11-06 06:00:00 (Sun)
  63782823600, #  local_start 2022-03-13 03:00:00 (Sun)
  63803383200, #    local_end 2022-11-06 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63803397600, #    utc_start 2022-11-06 06:00:00 (Sun)
  63814287600, #      utc_end 2023-03-12 07:00:00 (Sun)
  63803379600, #  local_start 2022-11-06 01:00:00 (Sun)
  63814269600, #    local_end 2023-03-12 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63814287600, #    utc_start 2023-03-12 07:00:00 (Sun)
  63834847200, #      utc_end 2023-11-05 06:00:00 (Sun)
  63814273200, #  local_start 2023-03-12 03:00:00 (Sun)
  63834832800, #    local_end 2023-11-05 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63834847200, #    utc_start 2023-11-05 06:00:00 (Sun)
  63845737200, #      utc_end 2024-03-10 07:00:00 (Sun)
  63834829200, #  local_start 2023-11-05 01:00:00 (Sun)
  63845719200, #    local_end 2024-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63845737200, #    utc_start 2024-03-10 07:00:00 (Sun)
  63866296800, #      utc_end 2024-11-03 06:00:00 (Sun)
  63845722800, #  local_start 2024-03-10 03:00:00 (Sun)
  63866282400, #    local_end 2024-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63866296800, #    utc_start 2024-11-03 06:00:00 (Sun)
  63877186800, #      utc_end 2025-03-09 07:00:00 (Sun)
  63866278800, #  local_start 2024-11-03 01:00:00 (Sun)
  63877168800, #    local_end 2025-03-09 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63877186800, #    utc_start 2025-03-09 07:00:00 (Sun)
  63897746400, #      utc_end 2025-11-02 06:00:00 (Sun)
  63877172400, #  local_start 2025-03-09 03:00:00 (Sun)
  63897732000, #    local_end 2025-11-02 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63897746400, #    utc_start 2025-11-02 06:00:00 (Sun)
  63908636400, #      utc_end 2026-03-08 07:00:00 (Sun)
  63897728400, #  local_start 2025-11-02 01:00:00 (Sun)
  63908618400, #    local_end 2026-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63908636400, #    utc_start 2026-03-08 07:00:00 (Sun)
  63929196000, #      utc_end 2026-11-01 06:00:00 (Sun)
  63908622000, #  local_start 2026-03-08 03:00:00 (Sun)
  63929181600, #    local_end 2026-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63929196000, #    utc_start 2026-11-01 06:00:00 (Sun)
  63940690800, #      utc_end 2027-03-14 07:00:00 (Sun)
  63929178000, #  local_start 2026-11-01 01:00:00 (Sun)
  63940672800, #    local_end 2027-03-14 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63940690800, #    utc_start 2027-03-14 07:00:00 (Sun)
  63961250400, #      utc_end 2027-11-07 06:00:00 (Sun)
  63940676400, #  local_start 2027-03-14 03:00:00 (Sun)
  63961236000, #    local_end 2027-11-07 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63961250400, #    utc_start 2027-11-07 06:00:00 (Sun)
  63972140400, #      utc_end 2028-03-12 07:00:00 (Sun)
  63961232400, #  local_start 2027-11-07 01:00:00 (Sun)
  63972122400, #    local_end 2028-03-12 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63972140400, #    utc_start 2028-03-12 07:00:00 (Sun)
  63992700000, #      utc_end 2028-11-05 06:00:00 (Sun)
  63972126000, #  local_start 2028-03-12 03:00:00 (Sun)
  63992685600, #    local_end 2028-11-05 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63992700000, #    utc_start 2028-11-05 06:00:00 (Sun)
  64003590000, #      utc_end 2029-03-11 07:00:00 (Sun)
  63992682000, #  local_start 2028-11-05 01:00:00 (Sun)
  64003572000, #    local_end 2029-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  64003590000, #    utc_start 2029-03-11 07:00:00 (Sun)
  64024149600, #      utc_end 2029-11-04 06:00:00 (Sun)
  64003575600, #  local_start 2029-03-11 03:00:00 (Sun)
  64024135200, #    local_end 2029-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  64024149600, #    utc_start 2029-11-04 06:00:00 (Sun)
  64035039600, #      utc_end 2030-03-10 07:00:00 (Sun)
  64024131600, #  local_start 2029-11-04 01:00:00 (Sun)
  64035021600, #    local_end 2030-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  64035039600, #    utc_start 2030-03-10 07:00:00 (Sun)
  64055599200, #      utc_end 2030-11-03 06:00:00 (Sun)
  64035025200, #  local_start 2030-03-10 03:00:00 (Sun)
  64055584800, #    local_end 2030-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {43}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -18000 }
  
  my $last_observance = bless( {
    'format' => 'E%sT',
    'gmtoff' => '-5:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 732984,
      'local_rd_secs' => 7200,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 732984,
      'utc_rd_secs' => 7200,
      'utc_year' => 2008
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -18000,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 732984,
      'local_rd_secs' => 25200,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 732984,
      'utc_rd_secs' => 25200,
      'utc_year' => 2008
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Nov',
      'letter' => 'S',
      'name' => 'US',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Mar',
      'letter' => 'D',
      'name' => 'US',
      'offset_from_std' => 3600,
      'on' => 'Sun>=8',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_INDIANA_VINCENNES

    $main::fatpacked{"DateTime/TimeZone/America/Indiana/Winamac.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_INDIANA_WINAMAC';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Indiana::Winamac;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Indiana::Winamac::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59418036000, #      utc_end 1883-11-18 18:00:00 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59418015215, #    local_end 1883-11-18 12:13:35 (Sun)
  -20785,
  0,
  'LMT',
      ],
      [
  59418036000, #    utc_start 1883-11-18 18:00:00 (Sun)
  60502406400, #      utc_end 1918-03-31 08:00:00 (Sun)
  59418014400, #  local_start 1883-11-18 12:00:00 (Sun)
  60502384800, #    local_end 1918-03-31 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  60502406400, #    utc_start 1918-03-31 08:00:00 (Sun)
  60520546800, #      utc_end 1918-10-27 07:00:00 (Sun)
  60502388400, #  local_start 1918-03-31 03:00:00 (Sun)
  60520528800, #    local_end 1918-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  60520546800, #    utc_start 1918-10-27 07:00:00 (Sun)
  60533856000, #      utc_end 1919-03-30 08:00:00 (Sun)
  60520525200, #  local_start 1918-10-27 01:00:00 (Sun)
  60533834400, #    local_end 1919-03-30 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  60533856000, #    utc_start 1919-03-30 08:00:00 (Sun)
  60551996400, #      utc_end 1919-10-26 07:00:00 (Sun)
  60533838000, #  local_start 1919-03-30 03:00:00 (Sun)
  60551978400, #    local_end 1919-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  60551996400, #    utc_start 1919-10-26 07:00:00 (Sun)
  61255468800, #      utc_end 1942-02-09 08:00:00 (Mon)
  60551974800, #  local_start 1919-10-26 01:00:00 (Sun)
  61255447200, #    local_end 1942-02-09 02:00:00 (Mon)
  -21600,
  0,
  'CST',
      ],
      [
  61255468800, #    utc_start 1942-02-09 08:00:00 (Mon)
  61366287600, #      utc_end 1945-08-14 23:00:00 (Tue)
  61255450800, #  local_start 1942-02-09 03:00:00 (Mon)
  61366269600, #    local_end 1945-08-14 18:00:00 (Tue)
  -18000,
  1,
  'CWT',
      ],
      [
  61366287600, #    utc_start 1945-08-14 23:00:00 (Tue)
  61370290800, #      utc_end 1945-09-30 07:00:00 (Sun)
  61366269600, #  local_start 1945-08-14 18:00:00 (Tue)
  61370272800, #    local_end 1945-09-30 02:00:00 (Sun)
  -18000,
  1,
  'CPT',
      ],
      [
  61370290800, #    utc_start 1945-09-30 07:00:00 (Sun)
  61378322400, #      utc_end 1946-01-01 06:00:00 (Tue)
  61370269200, #  local_start 1945-09-30 01:00:00 (Sun)
  61378300800, #    local_end 1946-01-01 00:00:00 (Tue)
  -21600,
  0,
  'CST',
      ],
      [
  61378322400, #    utc_start 1946-01-01 06:00:00 (Tue)
  61388438400, #      utc_end 1946-04-28 08:00:00 (Sun)
  61378300800, #  local_start 1946-01-01 00:00:00 (Tue)
  61388416800, #    local_end 1946-04-28 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61388438400, #    utc_start 1946-04-28 08:00:00 (Sun)
  61401740400, #      utc_end 1946-09-29 07:00:00 (Sun)
  61388420400, #  local_start 1946-04-28 03:00:00 (Sun)
  61401722400, #    local_end 1946-09-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61401740400, #    utc_start 1946-09-29 07:00:00 (Sun)
  61419888000, #      utc_end 1947-04-27 08:00:00 (Sun)
  61401718800, #  local_start 1946-09-29 01:00:00 (Sun)
  61419866400, #    local_end 1947-04-27 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61419888000, #    utc_start 1947-04-27 08:00:00 (Sun)
  61433190000, #      utc_end 1947-09-28 07:00:00 (Sun)
  61419870000, #  local_start 1947-04-27 03:00:00 (Sun)
  61433172000, #    local_end 1947-09-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61433190000, #    utc_start 1947-09-28 07:00:00 (Sun)
  61451337600, #      utc_end 1948-04-25 08:00:00 (Sun)
  61433168400, #  local_start 1947-09-28 01:00:00 (Sun)
  61451316000, #    local_end 1948-04-25 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61451337600, #    utc_start 1948-04-25 08:00:00 (Sun)
  61464639600, #      utc_end 1948-09-26 07:00:00 (Sun)
  61451319600, #  local_start 1948-04-25 03:00:00 (Sun)
  61464621600, #    local_end 1948-09-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61464639600, #    utc_start 1948-09-26 07:00:00 (Sun)
  61482787200, #      utc_end 1949-04-24 08:00:00 (Sun)
  61464618000, #  local_start 1948-09-26 01:00:00 (Sun)
  61482765600, #    local_end 1949-04-24 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61482787200, #    utc_start 1949-04-24 08:00:00 (Sun)
  61496089200, #      utc_end 1949-09-25 07:00:00 (Sun)
  61482769200, #  local_start 1949-04-24 03:00:00 (Sun)
  61496071200, #    local_end 1949-09-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61496089200, #    utc_start 1949-09-25 07:00:00 (Sun)
  61514841600, #      utc_end 1950-04-30 08:00:00 (Sun)
  61496067600, #  local_start 1949-09-25 01:00:00 (Sun)
  61514820000, #    local_end 1950-04-30 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61514841600, #    utc_start 1950-04-30 08:00:00 (Sun)
  61527538800, #      utc_end 1950-09-24 07:00:00 (Sun)
  61514823600, #  local_start 1950-04-30 03:00:00 (Sun)
  61527520800, #    local_end 1950-09-24 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61527538800, #    utc_start 1950-09-24 07:00:00 (Sun)
  61546291200, #      utc_end 1951-04-29 08:00:00 (Sun)
  61527517200, #  local_start 1950-09-24 01:00:00 (Sun)
  61546269600, #    local_end 1951-04-29 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61546291200, #    utc_start 1951-04-29 08:00:00 (Sun)
  61559593200, #      utc_end 1951-09-30 07:00:00 (Sun)
  61546273200, #  local_start 1951-04-29 03:00:00 (Sun)
  61559575200, #    local_end 1951-09-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61559593200, #    utc_start 1951-09-30 07:00:00 (Sun)
  61577740800, #      utc_end 1952-04-27 08:00:00 (Sun)
  61559571600, #  local_start 1951-09-30 01:00:00 (Sun)
  61577719200, #    local_end 1952-04-27 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61577740800, #    utc_start 1952-04-27 08:00:00 (Sun)
  61591042800, #      utc_end 1952-09-28 07:00:00 (Sun)
  61577722800, #  local_start 1952-04-27 03:00:00 (Sun)
  61591024800, #    local_end 1952-09-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61591042800, #    utc_start 1952-09-28 07:00:00 (Sun)
  61609190400, #      utc_end 1953-04-26 08:00:00 (Sun)
  61591021200, #  local_start 1952-09-28 01:00:00 (Sun)
  61609168800, #    local_end 1953-04-26 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61609190400, #    utc_start 1953-04-26 08:00:00 (Sun)
  61622492400, #      utc_end 1953-09-27 07:00:00 (Sun)
  61609172400, #  local_start 1953-04-26 03:00:00 (Sun)
  61622474400, #    local_end 1953-09-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61622492400, #    utc_start 1953-09-27 07:00:00 (Sun)
  61640640000, #      utc_end 1954-04-25 08:00:00 (Sun)
  61622470800, #  local_start 1953-09-27 01:00:00 (Sun)
  61640618400, #    local_end 1954-04-25 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61640640000, #    utc_start 1954-04-25 08:00:00 (Sun)
  61653942000, #      utc_end 1954-09-26 07:00:00 (Sun)
  61640622000, #  local_start 1954-04-25 03:00:00 (Sun)
  61653924000, #    local_end 1954-09-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61653942000, #    utc_start 1954-09-26 07:00:00 (Sun)
  61672089600, #      utc_end 1955-04-24 08:00:00 (Sun)
  61653920400, #  local_start 1954-09-26 01:00:00 (Sun)
  61672068000, #    local_end 1955-04-24 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61672089600, #    utc_start 1955-04-24 08:00:00 (Sun)
  61688415600, #      utc_end 1955-10-30 07:00:00 (Sun)
  61672071600, #  local_start 1955-04-24 03:00:00 (Sun)
  61688397600, #    local_end 1955-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61688415600, #    utc_start 1955-10-30 07:00:00 (Sun)
  61704144000, #      utc_end 1956-04-29 08:00:00 (Sun)
  61688394000, #  local_start 1955-10-30 01:00:00 (Sun)
  61704122400, #    local_end 1956-04-29 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61704144000, #    utc_start 1956-04-29 08:00:00 (Sun)
  61719865200, #      utc_end 1956-10-28 07:00:00 (Sun)
  61704126000, #  local_start 1956-04-29 03:00:00 (Sun)
  61719847200, #    local_end 1956-10-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61719865200, #    utc_start 1956-10-28 07:00:00 (Sun)
  61735593600, #      utc_end 1957-04-28 08:00:00 (Sun)
  61719843600, #  local_start 1956-10-28 01:00:00 (Sun)
  61735572000, #    local_end 1957-04-28 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61735593600, #    utc_start 1957-04-28 08:00:00 (Sun)
  61748895600, #      utc_end 1957-09-29 07:00:00 (Sun)
  61735575600, #  local_start 1957-04-28 03:00:00 (Sun)
  61748877600, #    local_end 1957-09-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61748895600, #    utc_start 1957-09-29 07:00:00 (Sun)
  61767043200, #      utc_end 1958-04-27 08:00:00 (Sun)
  61748874000, #  local_start 1957-09-29 01:00:00 (Sun)
  61767021600, #    local_end 1958-04-27 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61767043200, #    utc_start 1958-04-27 08:00:00 (Sun)
  61780345200, #      utc_end 1958-09-28 07:00:00 (Sun)
  61767025200, #  local_start 1958-04-27 03:00:00 (Sun)
  61780327200, #    local_end 1958-09-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61780345200, #    utc_start 1958-09-28 07:00:00 (Sun)
  61798492800, #      utc_end 1959-04-26 08:00:00 (Sun)
  61780323600, #  local_start 1958-09-28 01:00:00 (Sun)
  61798471200, #    local_end 1959-04-26 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61798492800, #    utc_start 1959-04-26 08:00:00 (Sun)
  61811794800, #      utc_end 1959-09-27 07:00:00 (Sun)
  61798474800, #  local_start 1959-04-26 03:00:00 (Sun)
  61811776800, #    local_end 1959-09-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61811794800, #    utc_start 1959-09-27 07:00:00 (Sun)
  61829942400, #      utc_end 1960-04-24 08:00:00 (Sun)
  61811773200, #  local_start 1959-09-27 01:00:00 (Sun)
  61829920800, #    local_end 1960-04-24 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61829942400, #    utc_start 1960-04-24 08:00:00 (Sun)
  61843244400, #      utc_end 1960-09-25 07:00:00 (Sun)
  61829924400, #  local_start 1960-04-24 03:00:00 (Sun)
  61843226400, #    local_end 1960-09-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61843244400, #    utc_start 1960-09-25 07:00:00 (Sun)
  61861996800, #      utc_end 1961-04-30 08:00:00 (Sun)
  61843222800, #  local_start 1960-09-25 01:00:00 (Sun)
  61861975200, #    local_end 1961-04-30 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61861996800, #    utc_start 1961-04-30 08:00:00 (Sun)
  62104165200, #      utc_end 1969-01-01 05:00:00 (Wed)
  61861978800, #  local_start 1961-04-30 03:00:00 (Sun)
  62104147200, #    local_end 1969-01-01 00:00:00 (Wed)
  -18000,
  0,
  'EST',
      ],
      [
  62104165200, #    utc_start 1969-01-01 05:00:00 (Wed)
  62114194800, #      utc_end 1969-04-27 07:00:00 (Sun)
  62104147200, #  local_start 1969-01-01 00:00:00 (Wed)
  62114176800, #    local_end 1969-04-27 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62114194800, #    utc_start 1969-04-27 07:00:00 (Sun)
  62129916000, #      utc_end 1969-10-26 06:00:00 (Sun)
  62114180400, #  local_start 1969-04-27 03:00:00 (Sun)
  62129901600, #    local_end 1969-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62129916000, #    utc_start 1969-10-26 06:00:00 (Sun)
  62145644400, #      utc_end 1970-04-26 07:00:00 (Sun)
  62129898000, #  local_start 1969-10-26 01:00:00 (Sun)
  62145626400, #    local_end 1970-04-26 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62145644400, #    utc_start 1970-04-26 07:00:00 (Sun)
  62161365600, #      utc_end 1970-10-25 06:00:00 (Sun)
  62145630000, #  local_start 1970-04-26 03:00:00 (Sun)
  62161351200, #    local_end 1970-10-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62161365600, #    utc_start 1970-10-25 06:00:00 (Sun)
  62167237200, #      utc_end 1971-01-01 05:00:00 (Fri)
  62161347600, #  local_start 1970-10-25 01:00:00 (Sun)
  62167219200, #    local_end 1971-01-01 00:00:00 (Fri)
  -18000,
  0,
  'EST',
      ],
      [
  62167237200, #    utc_start 1971-01-01 05:00:00 (Fri)
  63279644400, #      utc_end 2006-04-02 07:00:00 (Sun)
  62167219200, #  local_start 1971-01-01 00:00:00 (Fri)
  63279626400, #    local_end 2006-04-02 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63279644400, #    utc_start 2006-04-02 07:00:00 (Sun)
  63297788400, #      utc_end 2006-10-29 07:00:00 (Sun)
  63279626400, #  local_start 2006-04-02 02:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63297788400, #    utc_start 2006-10-29 07:00:00 (Sun)
  63309283200, #      utc_end 2007-03-11 08:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63309261600, #    local_end 2007-03-11 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63309283200, #    utc_start 2007-03-11 08:00:00 (Sun)
  63329839200, #      utc_end 2007-11-04 06:00:00 (Sun)
  63309268800, #  local_start 2007-03-11 04:00:00 (Sun)
  63329824800, #    local_end 2007-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63329839200, #    utc_start 2007-11-04 06:00:00 (Sun)
  63340729200, #      utc_end 2008-03-09 07:00:00 (Sun)
  63329821200, #  local_start 2007-11-04 01:00:00 (Sun)
  63340711200, #    local_end 2008-03-09 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63340729200, #    utc_start 2008-03-09 07:00:00 (Sun)
  63361288800, #      utc_end 2008-11-02 06:00:00 (Sun)
  63340714800, #  local_start 2008-03-09 03:00:00 (Sun)
  63361274400, #    local_end 2008-11-02 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63361288800, #    utc_start 2008-11-02 06:00:00 (Sun)
  63372178800, #      utc_end 2009-03-08 07:00:00 (Sun)
  63361270800, #  local_start 2008-11-02 01:00:00 (Sun)
  63372160800, #    local_end 2009-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63372178800, #    utc_start 2009-03-08 07:00:00 (Sun)
  63392738400, #      utc_end 2009-11-01 06:00:00 (Sun)
  63372164400, #  local_start 2009-03-08 03:00:00 (Sun)
  63392724000, #    local_end 2009-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63392738400, #    utc_start 2009-11-01 06:00:00 (Sun)
  63404233200, #      utc_end 2010-03-14 07:00:00 (Sun)
  63392720400, #  local_start 2009-11-01 01:00:00 (Sun)
  63404215200, #    local_end 2010-03-14 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63404233200, #    utc_start 2010-03-14 07:00:00 (Sun)
  63424792800, #      utc_end 2010-11-07 06:00:00 (Sun)
  63404218800, #  local_start 2010-03-14 03:00:00 (Sun)
  63424778400, #    local_end 2010-11-07 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63424792800, #    utc_start 2010-11-07 06:00:00 (Sun)
  63435682800, #      utc_end 2011-03-13 07:00:00 (Sun)
  63424774800, #  local_start 2010-11-07 01:00:00 (Sun)
  63435664800, #    local_end 2011-03-13 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63435682800, #    utc_start 2011-03-13 07:00:00 (Sun)
  63456242400, #      utc_end 2011-11-06 06:00:00 (Sun)
  63435668400, #  local_start 2011-03-13 03:00:00 (Sun)
  63456228000, #    local_end 2011-11-06 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63456242400, #    utc_start 2011-11-06 06:00:00 (Sun)
  63467132400, #      utc_end 2012-03-11 07:00:00 (Sun)
  63456224400, #  local_start 2011-11-06 01:00:00 (Sun)
  63467114400, #    local_end 2012-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63467132400, #    utc_start 2012-03-11 07:00:00 (Sun)
  63487692000, #      utc_end 2012-11-04 06:00:00 (Sun)
  63467118000, #  local_start 2012-03-11 03:00:00 (Sun)
  63487677600, #    local_end 2012-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63487692000, #    utc_start 2012-11-04 06:00:00 (Sun)
  63498582000, #      utc_end 2013-03-10 07:00:00 (Sun)
  63487674000, #  local_start 2012-11-04 01:00:00 (Sun)
  63498564000, #    local_end 2013-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63498582000, #    utc_start 2013-03-10 07:00:00 (Sun)
  63519141600, #      utc_end 2013-11-03 06:00:00 (Sun)
  63498567600, #  local_start 2013-03-10 03:00:00 (Sun)
  63519127200, #    local_end 2013-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63519141600, #    utc_start 2013-11-03 06:00:00 (Sun)
  63530031600, #      utc_end 2014-03-09 07:00:00 (Sun)
  63519123600, #  local_start 2013-11-03 01:00:00 (Sun)
  63530013600, #    local_end 2014-03-09 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63530031600, #    utc_start 2014-03-09 07:00:00 (Sun)
  63550591200, #      utc_end 2014-11-02 06:00:00 (Sun)
  63530017200, #  local_start 2014-03-09 03:00:00 (Sun)
  63550576800, #    local_end 2014-11-02 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63550591200, #    utc_start 2014-11-02 06:00:00 (Sun)
  63561481200, #      utc_end 2015-03-08 07:00:00 (Sun)
  63550573200, #  local_start 2014-11-02 01:00:00 (Sun)
  63561463200, #    local_end 2015-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63561481200, #    utc_start 2015-03-08 07:00:00 (Sun)
  63582040800, #      utc_end 2015-11-01 06:00:00 (Sun)
  63561466800, #  local_start 2015-03-08 03:00:00 (Sun)
  63582026400, #    local_end 2015-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63582040800, #    utc_start 2015-11-01 06:00:00 (Sun)
  63593535600, #      utc_end 2016-03-13 07:00:00 (Sun)
  63582022800, #  local_start 2015-11-01 01:00:00 (Sun)
  63593517600, #    local_end 2016-03-13 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63593535600, #    utc_start 2016-03-13 07:00:00 (Sun)
  63614095200, #      utc_end 2016-11-06 06:00:00 (Sun)
  63593521200, #  local_start 2016-03-13 03:00:00 (Sun)
  63614080800, #    local_end 2016-11-06 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63614095200, #    utc_start 2016-11-06 06:00:00 (Sun)
  63624985200, #      utc_end 2017-03-12 07:00:00 (Sun)
  63614077200, #  local_start 2016-11-06 01:00:00 (Sun)
  63624967200, #    local_end 2017-03-12 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63624985200, #    utc_start 2017-03-12 07:00:00 (Sun)
  63645544800, #      utc_end 2017-11-05 06:00:00 (Sun)
  63624970800, #  local_start 2017-03-12 03:00:00 (Sun)
  63645530400, #    local_end 2017-11-05 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63645544800, #    utc_start 2017-11-05 06:00:00 (Sun)
  63656434800, #      utc_end 2018-03-11 07:00:00 (Sun)
  63645526800, #  local_start 2017-11-05 01:00:00 (Sun)
  63656416800, #    local_end 2018-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63656434800, #    utc_start 2018-03-11 07:00:00 (Sun)
  63676994400, #      utc_end 2018-11-04 06:00:00 (Sun)
  63656420400, #  local_start 2018-03-11 03:00:00 (Sun)
  63676980000, #    local_end 2018-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63676994400, #    utc_start 2018-11-04 06:00:00 (Sun)
  63687884400, #      utc_end 2019-03-10 07:00:00 (Sun)
  63676976400, #  local_start 2018-11-04 01:00:00 (Sun)
  63687866400, #    local_end 2019-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63687884400, #    utc_start 2019-03-10 07:00:00 (Sun)
  63708444000, #      utc_end 2019-11-03 06:00:00 (Sun)
  63687870000, #  local_start 2019-03-10 03:00:00 (Sun)
  63708429600, #    local_end 2019-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63708444000, #    utc_start 2019-11-03 06:00:00 (Sun)
  63719334000, #      utc_end 2020-03-08 07:00:00 (Sun)
  63708426000, #  local_start 2019-11-03 01:00:00 (Sun)
  63719316000, #    local_end 2020-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63719334000, #    utc_start 2020-03-08 07:00:00 (Sun)
  63739893600, #      utc_end 2020-11-01 06:00:00 (Sun)
  63719319600, #  local_start 2020-03-08 03:00:00 (Sun)
  63739879200, #    local_end 2020-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63739893600, #    utc_start 2020-11-01 06:00:00 (Sun)
  63751388400, #      utc_end 2021-03-14 07:00:00 (Sun)
  63739875600, #  local_start 2020-11-01 01:00:00 (Sun)
  63751370400, #    local_end 2021-03-14 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63751388400, #    utc_start 2021-03-14 07:00:00 (Sun)
  63771948000, #      utc_end 2021-11-07 06:00:00 (Sun)
  63751374000, #  local_start 2021-03-14 03:00:00 (Sun)
  63771933600, #    local_end 2021-11-07 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63771948000, #    utc_start 2021-11-07 06:00:00 (Sun)
  63782838000, #      utc_end 2022-03-13 07:00:00 (Sun)
  63771930000, #  local_start 2021-11-07 01:00:00 (Sun)
  63782820000, #    local_end 2022-03-13 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63782838000, #    utc_start 2022-03-13 07:00:00 (Sun)
  63803397600, #      utc_end 2022-11-06 06:00:00 (Sun)
  63782823600, #  local_start 2022-03-13 03:00:00 (Sun)
  63803383200, #    local_end 2022-11-06 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63803397600, #    utc_start 2022-11-06 06:00:00 (Sun)
  63814287600, #      utc_end 2023-03-12 07:00:00 (Sun)
  63803379600, #  local_start 2022-11-06 01:00:00 (Sun)
  63814269600, #    local_end 2023-03-12 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63814287600, #    utc_start 2023-03-12 07:00:00 (Sun)
  63834847200, #      utc_end 2023-11-05 06:00:00 (Sun)
  63814273200, #  local_start 2023-03-12 03:00:00 (Sun)
  63834832800, #    local_end 2023-11-05 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63834847200, #    utc_start 2023-11-05 06:00:00 (Sun)
  63845737200, #      utc_end 2024-03-10 07:00:00 (Sun)
  63834829200, #  local_start 2023-11-05 01:00:00 (Sun)
  63845719200, #    local_end 2024-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63845737200, #    utc_start 2024-03-10 07:00:00 (Sun)
  63866296800, #      utc_end 2024-11-03 06:00:00 (Sun)
  63845722800, #  local_start 2024-03-10 03:00:00 (Sun)
  63866282400, #    local_end 2024-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63866296800, #    utc_start 2024-11-03 06:00:00 (Sun)
  63877186800, #      utc_end 2025-03-09 07:00:00 (Sun)
  63866278800, #  local_start 2024-11-03 01:00:00 (Sun)
  63877168800, #    local_end 2025-03-09 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63877186800, #    utc_start 2025-03-09 07:00:00 (Sun)
  63897746400, #      utc_end 2025-11-02 06:00:00 (Sun)
  63877172400, #  local_start 2025-03-09 03:00:00 (Sun)
  63897732000, #    local_end 2025-11-02 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63897746400, #    utc_start 2025-11-02 06:00:00 (Sun)
  63908636400, #      utc_end 2026-03-08 07:00:00 (Sun)
  63897728400, #  local_start 2025-11-02 01:00:00 (Sun)
  63908618400, #    local_end 2026-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63908636400, #    utc_start 2026-03-08 07:00:00 (Sun)
  63929196000, #      utc_end 2026-11-01 06:00:00 (Sun)
  63908622000, #  local_start 2026-03-08 03:00:00 (Sun)
  63929181600, #    local_end 2026-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63929196000, #    utc_start 2026-11-01 06:00:00 (Sun)
  63940690800, #      utc_end 2027-03-14 07:00:00 (Sun)
  63929178000, #  local_start 2026-11-01 01:00:00 (Sun)
  63940672800, #    local_end 2027-03-14 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63940690800, #    utc_start 2027-03-14 07:00:00 (Sun)
  63961250400, #      utc_end 2027-11-07 06:00:00 (Sun)
  63940676400, #  local_start 2027-03-14 03:00:00 (Sun)
  63961236000, #    local_end 2027-11-07 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63961250400, #    utc_start 2027-11-07 06:00:00 (Sun)
  63972140400, #      utc_end 2028-03-12 07:00:00 (Sun)
  63961232400, #  local_start 2027-11-07 01:00:00 (Sun)
  63972122400, #    local_end 2028-03-12 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63972140400, #    utc_start 2028-03-12 07:00:00 (Sun)
  63992700000, #      utc_end 2028-11-05 06:00:00 (Sun)
  63972126000, #  local_start 2028-03-12 03:00:00 (Sun)
  63992685600, #    local_end 2028-11-05 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63992700000, #    utc_start 2028-11-05 06:00:00 (Sun)
  64003590000, #      utc_end 2029-03-11 07:00:00 (Sun)
  63992682000, #  local_start 2028-11-05 01:00:00 (Sun)
  64003572000, #    local_end 2029-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  64003590000, #    utc_start 2029-03-11 07:00:00 (Sun)
  64024149600, #      utc_end 2029-11-04 06:00:00 (Sun)
  64003575600, #  local_start 2029-03-11 03:00:00 (Sun)
  64024135200, #    local_end 2029-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  64024149600, #    utc_start 2029-11-04 06:00:00 (Sun)
  64035039600, #      utc_end 2030-03-10 07:00:00 (Sun)
  64024131600, #  local_start 2029-11-04 01:00:00 (Sun)
  64035021600, #    local_end 2030-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  64035039600, #    utc_start 2030-03-10 07:00:00 (Sun)
  64055599200, #      utc_end 2030-11-03 06:00:00 (Sun)
  64035025200, #  local_start 2030-03-10 03:00:00 (Sun)
  64055584800, #    local_end 2030-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {46}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -18000 }
  
  my $last_observance = bless( {
    'format' => 'E%sT',
    'gmtoff' => '-5:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 732746,
      'local_rd_secs' => 14400,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 732746,
      'utc_rd_secs' => 14400,
      'utc_year' => 2008
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -18000,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 732746,
      'local_rd_secs' => 28800,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 732746,
      'utc_rd_secs' => 28800,
      'utc_year' => 2008
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Mar',
      'letter' => 'D',
      'name' => 'US',
      'offset_from_std' => 3600,
      'on' => 'Sun>=8',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Nov',
      'letter' => 'S',
      'name' => 'US',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_INDIANA_WINAMAC

    $main::fatpacked{"DateTime/TimeZone/America/Inuvik.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_INUVIK';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Inuvik;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Inuvik::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  61599225600, #      utc_end 1953-01-01 00:00:00 (Thu)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  61599225600, #    local_end 1953-01-01 00:00:00 (Thu)
  0,
  0,
  '-00',
      ],
      [
  61599225600, #    utc_start 1953-01-01 00:00:00 (Thu)
  61987795200, #      utc_end 1965-04-25 08:00:00 (Sun)
  61599196800, #  local_start 1952-12-31 16:00:00 (Wed)
  61987766400, #    local_end 1965-04-25 00:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61987795200, #    utc_start 1965-04-25 08:00:00 (Sun)
  62004124800, #      utc_end 1965-10-31 08:00:00 (Sun)
  61987773600, #  local_start 1965-04-25 02:00:00 (Sun)
  62004103200, #    local_end 1965-10-31 02:00:00 (Sun)
  -21600,
  1,
  'PDDT',
      ],
      [
  62004124800, #    utc_start 1965-10-31 08:00:00 (Sun)
  62429911200, #      utc_end 1979-04-29 10:00:00 (Sun)
  62004096000, #  local_start 1965-10-31 00:00:00 (Sun)
  62429882400, #    local_end 1979-04-29 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62429911200, #    utc_start 1979-04-29 10:00:00 (Sun)
  62451241200, #      utc_end 1980-01-01 07:00:00 (Tue)
  62429886000, #  local_start 1979-04-29 03:00:00 (Sun)
  62451216000, #    local_end 1980-01-01 00:00:00 (Tue)
  -25200,
  0,
  'MST',
      ],
      [
  62451241200, #    utc_start 1980-01-01 07:00:00 (Tue)
  62461357200, #      utc_end 1980-04-27 09:00:00 (Sun)
  62451216000, #  local_start 1980-01-01 00:00:00 (Tue)
  62461332000, #    local_end 1980-04-27 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62461357200, #    utc_start 1980-04-27 09:00:00 (Sun)
  62477078400, #      utc_end 1980-10-26 08:00:00 (Sun)
  62461335600, #  local_start 1980-04-27 03:00:00 (Sun)
  62477056800, #    local_end 1980-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62477078400, #    utc_start 1980-10-26 08:00:00 (Sun)
  62492806800, #      utc_end 1981-04-26 09:00:00 (Sun)
  62477053200, #  local_start 1980-10-26 01:00:00 (Sun)
  62492781600, #    local_end 1981-04-26 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62492806800, #    utc_start 1981-04-26 09:00:00 (Sun)
  62508528000, #      utc_end 1981-10-25 08:00:00 (Sun)
  62492785200, #  local_start 1981-04-26 03:00:00 (Sun)
  62508506400, #    local_end 1981-10-25 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62508528000, #    utc_start 1981-10-25 08:00:00 (Sun)
  62524256400, #      utc_end 1982-04-25 09:00:00 (Sun)
  62508502800, #  local_start 1981-10-25 01:00:00 (Sun)
  62524231200, #    local_end 1982-04-25 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62524256400, #    utc_start 1982-04-25 09:00:00 (Sun)
  62540582400, #      utc_end 1982-10-31 08:00:00 (Sun)
  62524234800, #  local_start 1982-04-25 03:00:00 (Sun)
  62540560800, #    local_end 1982-10-31 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62540582400, #    utc_start 1982-10-31 08:00:00 (Sun)
  62555706000, #      utc_end 1983-04-24 09:00:00 (Sun)
  62540557200, #  local_start 1982-10-31 01:00:00 (Sun)
  62555680800, #    local_end 1983-04-24 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62555706000, #    utc_start 1983-04-24 09:00:00 (Sun)
  62572032000, #      utc_end 1983-10-30 08:00:00 (Sun)
  62555684400, #  local_start 1983-04-24 03:00:00 (Sun)
  62572010400, #    local_end 1983-10-30 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62572032000, #    utc_start 1983-10-30 08:00:00 (Sun)
  62587760400, #      utc_end 1984-04-29 09:00:00 (Sun)
  62572006800, #  local_start 1983-10-30 01:00:00 (Sun)
  62587735200, #    local_end 1984-04-29 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62587760400, #    utc_start 1984-04-29 09:00:00 (Sun)
  62603481600, #      utc_end 1984-10-28 08:00:00 (Sun)
  62587738800, #  local_start 1984-04-29 03:00:00 (Sun)
  62603460000, #    local_end 1984-10-28 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62603481600, #    utc_start 1984-10-28 08:00:00 (Sun)
  62619210000, #      utc_end 1985-04-28 09:00:00 (Sun)
  62603456400, #  local_start 1984-10-28 01:00:00 (Sun)
  62619184800, #    local_end 1985-04-28 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62619210000, #    utc_start 1985-04-28 09:00:00 (Sun)
  62634931200, #      utc_end 1985-10-27 08:00:00 (Sun)
  62619188400, #  local_start 1985-04-28 03:00:00 (Sun)
  62634909600, #    local_end 1985-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62634931200, #    utc_start 1985-10-27 08:00:00 (Sun)
  62650659600, #      utc_end 1986-04-27 09:00:00 (Sun)
  62634906000, #  local_start 1985-10-27 01:00:00 (Sun)
  62650634400, #    local_end 1986-04-27 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62650659600, #    utc_start 1986-04-27 09:00:00 (Sun)
  62666380800, #      utc_end 1986-10-26 08:00:00 (Sun)
  62650638000, #  local_start 1986-04-27 03:00:00 (Sun)
  62666359200, #    local_end 1986-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62666380800, #    utc_start 1986-10-26 08:00:00 (Sun)
  62680294800, #      utc_end 1987-04-05 09:00:00 (Sun)
  62666355600, #  local_start 1986-10-26 01:00:00 (Sun)
  62680269600, #    local_end 1987-04-05 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62680294800, #    utc_start 1987-04-05 09:00:00 (Sun)
  62697830400, #      utc_end 1987-10-25 08:00:00 (Sun)
  62680273200, #  local_start 1987-04-05 03:00:00 (Sun)
  62697808800, #    local_end 1987-10-25 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62697830400, #    utc_start 1987-10-25 08:00:00 (Sun)
  62711744400, #      utc_end 1988-04-03 09:00:00 (Sun)
  62697805200, #  local_start 1987-10-25 01:00:00 (Sun)
  62711719200, #    local_end 1988-04-03 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62711744400, #    utc_start 1988-04-03 09:00:00 (Sun)
  62729884800, #      utc_end 1988-10-30 08:00:00 (Sun)
  62711722800, #  local_start 1988-04-03 03:00:00 (Sun)
  62729863200, #    local_end 1988-10-30 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62729884800, #    utc_start 1988-10-30 08:00:00 (Sun)
  62743194000, #      utc_end 1989-04-02 09:00:00 (Sun)
  62729859600, #  local_start 1988-10-30 01:00:00 (Sun)
  62743168800, #    local_end 1989-04-02 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62743194000, #    utc_start 1989-04-02 09:00:00 (Sun)
  62761334400, #      utc_end 1989-10-29 08:00:00 (Sun)
  62743172400, #  local_start 1989-04-02 03:00:00 (Sun)
  62761312800, #    local_end 1989-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62761334400, #    utc_start 1989-10-29 08:00:00 (Sun)
  62774643600, #      utc_end 1990-04-01 09:00:00 (Sun)
  62761309200, #  local_start 1989-10-29 01:00:00 (Sun)
  62774618400, #    local_end 1990-04-01 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62774643600, #    utc_start 1990-04-01 09:00:00 (Sun)
  62792784000, #      utc_end 1990-10-28 08:00:00 (Sun)
  62774622000, #  local_start 1990-04-01 03:00:00 (Sun)
  62792762400, #    local_end 1990-10-28 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62792784000, #    utc_start 1990-10-28 08:00:00 (Sun)
  62806698000, #      utc_end 1991-04-07 09:00:00 (Sun)
  62792758800, #  local_start 1990-10-28 01:00:00 (Sun)
  62806672800, #    local_end 1991-04-07 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62806698000, #    utc_start 1991-04-07 09:00:00 (Sun)
  62824233600, #      utc_end 1991-10-27 08:00:00 (Sun)
  62806676400, #  local_start 1991-04-07 03:00:00 (Sun)
  62824212000, #    local_end 1991-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62824233600, #    utc_start 1991-10-27 08:00:00 (Sun)
  62838147600, #      utc_end 1992-04-05 09:00:00 (Sun)
  62824208400, #  local_start 1991-10-27 01:00:00 (Sun)
  62838122400, #    local_end 1992-04-05 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62838147600, #    utc_start 1992-04-05 09:00:00 (Sun)
  62855683200, #      utc_end 1992-10-25 08:00:00 (Sun)
  62838126000, #  local_start 1992-04-05 03:00:00 (Sun)
  62855661600, #    local_end 1992-10-25 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62855683200, #    utc_start 1992-10-25 08:00:00 (Sun)
  62869597200, #      utc_end 1993-04-04 09:00:00 (Sun)
  62855658000, #  local_start 1992-10-25 01:00:00 (Sun)
  62869572000, #    local_end 1993-04-04 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62869597200, #    utc_start 1993-04-04 09:00:00 (Sun)
  62887737600, #      utc_end 1993-10-31 08:00:00 (Sun)
  62869575600, #  local_start 1993-04-04 03:00:00 (Sun)
  62887716000, #    local_end 1993-10-31 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62887737600, #    utc_start 1993-10-31 08:00:00 (Sun)
  62901046800, #      utc_end 1994-04-03 09:00:00 (Sun)
  62887712400, #  local_start 1993-10-31 01:00:00 (Sun)
  62901021600, #    local_end 1994-04-03 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62901046800, #    utc_start 1994-04-03 09:00:00 (Sun)
  62919187200, #      utc_end 1994-10-30 08:00:00 (Sun)
  62901025200, #  local_start 1994-04-03 03:00:00 (Sun)
  62919165600, #    local_end 1994-10-30 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62919187200, #    utc_start 1994-10-30 08:00:00 (Sun)
  62932496400, #      utc_end 1995-04-02 09:00:00 (Sun)
  62919162000, #  local_start 1994-10-30 01:00:00 (Sun)
  62932471200, #    local_end 1995-04-02 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62932496400, #    utc_start 1995-04-02 09:00:00 (Sun)
  62950636800, #      utc_end 1995-10-29 08:00:00 (Sun)
  62932474800, #  local_start 1995-04-02 03:00:00 (Sun)
  62950615200, #    local_end 1995-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62950636800, #    utc_start 1995-10-29 08:00:00 (Sun)
  62964550800, #      utc_end 1996-04-07 09:00:00 (Sun)
  62950611600, #  local_start 1995-10-29 01:00:00 (Sun)
  62964525600, #    local_end 1996-04-07 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62964550800, #    utc_start 1996-04-07 09:00:00 (Sun)
  62982086400, #      utc_end 1996-10-27 08:00:00 (Sun)
  62964529200, #  local_start 1996-04-07 03:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62982086400, #    utc_start 1996-10-27 08:00:00 (Sun)
  62996000400, #      utc_end 1997-04-06 09:00:00 (Sun)
  62982061200, #  local_start 1996-10-27 01:00:00 (Sun)
  62995975200, #    local_end 1997-04-06 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62996000400, #    utc_start 1997-04-06 09:00:00 (Sun)
  63013536000, #      utc_end 1997-10-26 08:00:00 (Sun)
  62995978800, #  local_start 1997-04-06 03:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63013536000, #    utc_start 1997-10-26 08:00:00 (Sun)
  63027450000, #      utc_end 1998-04-05 09:00:00 (Sun)
  63013510800, #  local_start 1997-10-26 01:00:00 (Sun)
  63027424800, #    local_end 1998-04-05 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63027450000, #    utc_start 1998-04-05 09:00:00 (Sun)
  63044985600, #      utc_end 1998-10-25 08:00:00 (Sun)
  63027428400, #  local_start 1998-04-05 03:00:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63044985600, #    utc_start 1998-10-25 08:00:00 (Sun)
  63058899600, #      utc_end 1999-04-04 09:00:00 (Sun)
  63044960400, #  local_start 1998-10-25 01:00:00 (Sun)
  63058874400, #    local_end 1999-04-04 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63058899600, #    utc_start 1999-04-04 09:00:00 (Sun)
  63077040000, #      utc_end 1999-10-31 08:00:00 (Sun)
  63058878000, #  local_start 1999-04-04 03:00:00 (Sun)
  63077018400, #    local_end 1999-10-31 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63077040000, #    utc_start 1999-10-31 08:00:00 (Sun)
  63090349200, #      utc_end 2000-04-02 09:00:00 (Sun)
  63077014800, #  local_start 1999-10-31 01:00:00 (Sun)
  63090324000, #    local_end 2000-04-02 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63090349200, #    utc_start 2000-04-02 09:00:00 (Sun)
  63108489600, #      utc_end 2000-10-29 08:00:00 (Sun)
  63090327600, #  local_start 2000-04-02 03:00:00 (Sun)
  63108468000, #    local_end 2000-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63108489600, #    utc_start 2000-10-29 08:00:00 (Sun)
  63121798800, #      utc_end 2001-04-01 09:00:00 (Sun)
  63108464400, #  local_start 2000-10-29 01:00:00 (Sun)
  63121773600, #    local_end 2001-04-01 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63121798800, #    utc_start 2001-04-01 09:00:00 (Sun)
  63139939200, #      utc_end 2001-10-28 08:00:00 (Sun)
  63121777200, #  local_start 2001-04-01 03:00:00 (Sun)
  63139917600, #    local_end 2001-10-28 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63139939200, #    utc_start 2001-10-28 08:00:00 (Sun)
  63153853200, #      utc_end 2002-04-07 09:00:00 (Sun)
  63139914000, #  local_start 2001-10-28 01:00:00 (Sun)
  63153828000, #    local_end 2002-04-07 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63153853200, #    utc_start 2002-04-07 09:00:00 (Sun)
  63171388800, #      utc_end 2002-10-27 08:00:00 (Sun)
  63153831600, #  local_start 2002-04-07 03:00:00 (Sun)
  63171367200, #    local_end 2002-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63171388800, #    utc_start 2002-10-27 08:00:00 (Sun)
  63185302800, #      utc_end 2003-04-06 09:00:00 (Sun)
  63171363600, #  local_start 2002-10-27 01:00:00 (Sun)
  63185277600, #    local_end 2003-04-06 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63185302800, #    utc_start 2003-04-06 09:00:00 (Sun)
  63202838400, #      utc_end 2003-10-26 08:00:00 (Sun)
  63185281200, #  local_start 2003-04-06 03:00:00 (Sun)
  63202816800, #    local_end 2003-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63202838400, #    utc_start 2003-10-26 08:00:00 (Sun)
  63216752400, #      utc_end 2004-04-04 09:00:00 (Sun)
  63202813200, #  local_start 2003-10-26 01:00:00 (Sun)
  63216727200, #    local_end 2004-04-04 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63216752400, #    utc_start 2004-04-04 09:00:00 (Sun)
  63234892800, #      utc_end 2004-10-31 08:00:00 (Sun)
  63216730800, #  local_start 2004-04-04 03:00:00 (Sun)
  63234871200, #    local_end 2004-10-31 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63234892800, #    utc_start 2004-10-31 08:00:00 (Sun)
  63248202000, #      utc_end 2005-04-03 09:00:00 (Sun)
  63234867600, #  local_start 2004-10-31 01:00:00 (Sun)
  63248176800, #    local_end 2005-04-03 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63248202000, #    utc_start 2005-04-03 09:00:00 (Sun)
  63266342400, #      utc_end 2005-10-30 08:00:00 (Sun)
  63248180400, #  local_start 2005-04-03 03:00:00 (Sun)
  63266320800, #    local_end 2005-10-30 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63266342400, #    utc_start 2005-10-30 08:00:00 (Sun)
  63279651600, #      utc_end 2006-04-02 09:00:00 (Sun)
  63266317200, #  local_start 2005-10-30 01:00:00 (Sun)
  63279626400, #    local_end 2006-04-02 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63279651600, #    utc_start 2006-04-02 09:00:00 (Sun)
  63297792000, #      utc_end 2006-10-29 08:00:00 (Sun)
  63279630000, #  local_start 2006-04-02 03:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63297792000, #    utc_start 2006-10-29 08:00:00 (Sun)
  63309286800, #      utc_end 2007-03-11 09:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63309261600, #    local_end 2007-03-11 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63309286800, #    utc_start 2007-03-11 09:00:00 (Sun)
  63329846400, #      utc_end 2007-11-04 08:00:00 (Sun)
  63309265200, #  local_start 2007-03-11 03:00:00 (Sun)
  63329824800, #    local_end 2007-11-04 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63329846400, #    utc_start 2007-11-04 08:00:00 (Sun)
  63340736400, #      utc_end 2008-03-09 09:00:00 (Sun)
  63329821200, #  local_start 2007-11-04 01:00:00 (Sun)
  63340711200, #    local_end 2008-03-09 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63340736400, #    utc_start 2008-03-09 09:00:00 (Sun)
  63361296000, #      utc_end 2008-11-02 08:00:00 (Sun)
  63340714800, #  local_start 2008-03-09 03:00:00 (Sun)
  63361274400, #    local_end 2008-11-02 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63361296000, #    utc_start 2008-11-02 08:00:00 (Sun)
  63372186000, #      utc_end 2009-03-08 09:00:00 (Sun)
  63361270800, #  local_start 2008-11-02 01:00:00 (Sun)
  63372160800, #    local_end 2009-03-08 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63372186000, #    utc_start 2009-03-08 09:00:00 (Sun)
  63392745600, #      utc_end 2009-11-01 08:00:00 (Sun)
  63372164400, #  local_start 2009-03-08 03:00:00 (Sun)
  63392724000, #    local_end 2009-11-01 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63392745600, #    utc_start 2009-11-01 08:00:00 (Sun)
  63404240400, #      utc_end 2010-03-14 09:00:00 (Sun)
  63392720400, #  local_start 2009-11-01 01:00:00 (Sun)
  63404215200, #    local_end 2010-03-14 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63404240400, #    utc_start 2010-03-14 09:00:00 (Sun)
  63424800000, #      utc_end 2010-11-07 08:00:00 (Sun)
  63404218800, #  local_start 2010-03-14 03:00:00 (Sun)
  63424778400, #    local_end 2010-11-07 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63424800000, #    utc_start 2010-11-07 08:00:00 (Sun)
  63435690000, #      utc_end 2011-03-13 09:00:00 (Sun)
  63424774800, #  local_start 2010-11-07 01:00:00 (Sun)
  63435664800, #    local_end 2011-03-13 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63435690000, #    utc_start 2011-03-13 09:00:00 (Sun)
  63456249600, #      utc_end 2011-11-06 08:00:00 (Sun)
  63435668400, #  local_start 2011-03-13 03:00:00 (Sun)
  63456228000, #    local_end 2011-11-06 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63456249600, #    utc_start 2011-11-06 08:00:00 (Sun)
  63467139600, #      utc_end 2012-03-11 09:00:00 (Sun)
  63456224400, #  local_start 2011-11-06 01:00:00 (Sun)
  63467114400, #    local_end 2012-03-11 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63467139600, #    utc_start 2012-03-11 09:00:00 (Sun)
  63487699200, #      utc_end 2012-11-04 08:00:00 (Sun)
  63467118000, #  local_start 2012-03-11 03:00:00 (Sun)
  63487677600, #    local_end 2012-11-04 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63487699200, #    utc_start 2012-11-04 08:00:00 (Sun)
  63498589200, #      utc_end 2013-03-10 09:00:00 (Sun)
  63487674000, #  local_start 2012-11-04 01:00:00 (Sun)
  63498564000, #    local_end 2013-03-10 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63498589200, #    utc_start 2013-03-10 09:00:00 (Sun)
  63519148800, #      utc_end 2013-11-03 08:00:00 (Sun)
  63498567600, #  local_start 2013-03-10 03:00:00 (Sun)
  63519127200, #    local_end 2013-11-03 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63519148800, #    utc_start 2013-11-03 08:00:00 (Sun)
  63530038800, #      utc_end 2014-03-09 09:00:00 (Sun)
  63519123600, #  local_start 2013-11-03 01:00:00 (Sun)
  63530013600, #    local_end 2014-03-09 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63530038800, #    utc_start 2014-03-09 09:00:00 (Sun)
  63550598400, #      utc_end 2014-11-02 08:00:00 (Sun)
  63530017200, #  local_start 2014-03-09 03:00:00 (Sun)
  63550576800, #    local_end 2014-11-02 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63550598400, #    utc_start 2014-11-02 08:00:00 (Sun)
  63561488400, #      utc_end 2015-03-08 09:00:00 (Sun)
  63550573200, #  local_start 2014-11-02 01:00:00 (Sun)
  63561463200, #    local_end 2015-03-08 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63561488400, #    utc_start 2015-03-08 09:00:00 (Sun)
  63582048000, #      utc_end 2015-11-01 08:00:00 (Sun)
  63561466800, #  local_start 2015-03-08 03:00:00 (Sun)
  63582026400, #    local_end 2015-11-01 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63582048000, #    utc_start 2015-11-01 08:00:00 (Sun)
  63593542800, #      utc_end 2016-03-13 09:00:00 (Sun)
  63582022800, #  local_start 2015-11-01 01:00:00 (Sun)
  63593517600, #    local_end 2016-03-13 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63593542800, #    utc_start 2016-03-13 09:00:00 (Sun)
  63614102400, #      utc_end 2016-11-06 08:00:00 (Sun)
  63593521200, #  local_start 2016-03-13 03:00:00 (Sun)
  63614080800, #    local_end 2016-11-06 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63614102400, #    utc_start 2016-11-06 08:00:00 (Sun)
  63624992400, #      utc_end 2017-03-12 09:00:00 (Sun)
  63614077200, #  local_start 2016-11-06 01:00:00 (Sun)
  63624967200, #    local_end 2017-03-12 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63624992400, #    utc_start 2017-03-12 09:00:00 (Sun)
  63645552000, #      utc_end 2017-11-05 08:00:00 (Sun)
  63624970800, #  local_start 2017-03-12 03:00:00 (Sun)
  63645530400, #    local_end 2017-11-05 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63645552000, #    utc_start 2017-11-05 08:00:00 (Sun)
  63656442000, #      utc_end 2018-03-11 09:00:00 (Sun)
  63645526800, #  local_start 2017-11-05 01:00:00 (Sun)
  63656416800, #    local_end 2018-03-11 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63656442000, #    utc_start 2018-03-11 09:00:00 (Sun)
  63677001600, #      utc_end 2018-11-04 08:00:00 (Sun)
  63656420400, #  local_start 2018-03-11 03:00:00 (Sun)
  63676980000, #    local_end 2018-11-04 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63677001600, #    utc_start 2018-11-04 08:00:00 (Sun)
  63687891600, #      utc_end 2019-03-10 09:00:00 (Sun)
  63676976400, #  local_start 2018-11-04 01:00:00 (Sun)
  63687866400, #    local_end 2019-03-10 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63687891600, #    utc_start 2019-03-10 09:00:00 (Sun)
  63708451200, #      utc_end 2019-11-03 08:00:00 (Sun)
  63687870000, #  local_start 2019-03-10 03:00:00 (Sun)
  63708429600, #    local_end 2019-11-03 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63708451200, #    utc_start 2019-11-03 08:00:00 (Sun)
  63719341200, #      utc_end 2020-03-08 09:00:00 (Sun)
  63708426000, #  local_start 2019-11-03 01:00:00 (Sun)
  63719316000, #    local_end 2020-03-08 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63719341200, #    utc_start 2020-03-08 09:00:00 (Sun)
  63739900800, #      utc_end 2020-11-01 08:00:00 (Sun)
  63719319600, #  local_start 2020-03-08 03:00:00 (Sun)
  63739879200, #    local_end 2020-11-01 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63739900800, #    utc_start 2020-11-01 08:00:00 (Sun)
  63751395600, #      utc_end 2021-03-14 09:00:00 (Sun)
  63739875600, #  local_start 2020-11-01 01:00:00 (Sun)
  63751370400, #    local_end 2021-03-14 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63751395600, #    utc_start 2021-03-14 09:00:00 (Sun)
  63771955200, #      utc_end 2021-11-07 08:00:00 (Sun)
  63751374000, #  local_start 2021-03-14 03:00:00 (Sun)
  63771933600, #    local_end 2021-11-07 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63771955200, #    utc_start 2021-11-07 08:00:00 (Sun)
  63782845200, #      utc_end 2022-03-13 09:00:00 (Sun)
  63771930000, #  local_start 2021-11-07 01:00:00 (Sun)
  63782820000, #    local_end 2022-03-13 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63782845200, #    utc_start 2022-03-13 09:00:00 (Sun)
  63803404800, #      utc_end 2022-11-06 08:00:00 (Sun)
  63782823600, #  local_start 2022-03-13 03:00:00 (Sun)
  63803383200, #    local_end 2022-11-06 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63803404800, #    utc_start 2022-11-06 08:00:00 (Sun)
  63814294800, #      utc_end 2023-03-12 09:00:00 (Sun)
  63803379600, #  local_start 2022-11-06 01:00:00 (Sun)
  63814269600, #    local_end 2023-03-12 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63814294800, #    utc_start 2023-03-12 09:00:00 (Sun)
  63834854400, #      utc_end 2023-11-05 08:00:00 (Sun)
  63814273200, #  local_start 2023-03-12 03:00:00 (Sun)
  63834832800, #    local_end 2023-11-05 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63834854400, #    utc_start 2023-11-05 08:00:00 (Sun)
  63845744400, #      utc_end 2024-03-10 09:00:00 (Sun)
  63834829200, #  local_start 2023-11-05 01:00:00 (Sun)
  63845719200, #    local_end 2024-03-10 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63845744400, #    utc_start 2024-03-10 09:00:00 (Sun)
  63866304000, #      utc_end 2024-11-03 08:00:00 (Sun)
  63845722800, #  local_start 2024-03-10 03:00:00 (Sun)
  63866282400, #    local_end 2024-11-03 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63866304000, #    utc_start 2024-11-03 08:00:00 (Sun)
  63877194000, #      utc_end 2025-03-09 09:00:00 (Sun)
  63866278800, #  local_start 2024-11-03 01:00:00 (Sun)
  63877168800, #    local_end 2025-03-09 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63877194000, #    utc_start 2025-03-09 09:00:00 (Sun)
  63897753600, #      utc_end 2025-11-02 08:00:00 (Sun)
  63877172400, #  local_start 2025-03-09 03:00:00 (Sun)
  63897732000, #    local_end 2025-11-02 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63897753600, #    utc_start 2025-11-02 08:00:00 (Sun)
  63908643600, #      utc_end 2026-03-08 09:00:00 (Sun)
  63897728400, #  local_start 2025-11-02 01:00:00 (Sun)
  63908618400, #    local_end 2026-03-08 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63908643600, #    utc_start 2026-03-08 09:00:00 (Sun)
  63929203200, #      utc_end 2026-11-01 08:00:00 (Sun)
  63908622000, #  local_start 2026-03-08 03:00:00 (Sun)
  63929181600, #    local_end 2026-11-01 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63929203200, #    utc_start 2026-11-01 08:00:00 (Sun)
  63940698000, #      utc_end 2027-03-14 09:00:00 (Sun)
  63929178000, #  local_start 2026-11-01 01:00:00 (Sun)
  63940672800, #    local_end 2027-03-14 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63940698000, #    utc_start 2027-03-14 09:00:00 (Sun)
  63961257600, #      utc_end 2027-11-07 08:00:00 (Sun)
  63940676400, #  local_start 2027-03-14 03:00:00 (Sun)
  63961236000, #    local_end 2027-11-07 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63961257600, #    utc_start 2027-11-07 08:00:00 (Sun)
  63972147600, #      utc_end 2028-03-12 09:00:00 (Sun)
  63961232400, #  local_start 2027-11-07 01:00:00 (Sun)
  63972122400, #    local_end 2028-03-12 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63972147600, #    utc_start 2028-03-12 09:00:00 (Sun)
  63992707200, #      utc_end 2028-11-05 08:00:00 (Sun)
  63972126000, #  local_start 2028-03-12 03:00:00 (Sun)
  63992685600, #    local_end 2028-11-05 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63992707200, #    utc_start 2028-11-05 08:00:00 (Sun)
  64003597200, #      utc_end 2029-03-11 09:00:00 (Sun)
  63992682000, #  local_start 2028-11-05 01:00:00 (Sun)
  64003572000, #    local_end 2029-03-11 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  64003597200, #    utc_start 2029-03-11 09:00:00 (Sun)
  64024156800, #      utc_end 2029-11-04 08:00:00 (Sun)
  64003575600, #  local_start 2029-03-11 03:00:00 (Sun)
  64024135200, #    local_end 2029-11-04 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  64024156800, #    utc_start 2029-11-04 08:00:00 (Sun)
  64035046800, #      utc_end 2030-03-10 09:00:00 (Sun)
  64024131600, #  local_start 2029-11-04 01:00:00 (Sun)
  64035021600, #    local_end 2030-03-10 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  64035046800, #    utc_start 2030-03-10 09:00:00 (Sun)
  64055606400, #      utc_end 2030-11-03 08:00:00 (Sun)
  64035025200, #  local_start 2030-03-10 03:00:00 (Sun)
  64055584800, #    local_end 2030-11-03 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {52}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -25200 }
  
  my $last_observance = bless( {
    'format' => 'M%sT',
    'gmtoff' => '-7:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 722815,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 722815,
      'utc_rd_secs' => 0,
      'utc_year' => 1981
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -25200,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 722815,
      'local_rd_secs' => 25200,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 722815,
      'utc_rd_secs' => 25200,
      'utc_year' => 1981
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Nov',
      'letter' => 'S',
      'name' => 'Canada',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Mar',
      'letter' => 'D',
      'name' => 'Canada',
      'offset_from_std' => 3600,
      'on' => 'Sun>=8',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_INUVIK

    $main::fatpacked{"DateTime/TimeZone/America/Iqaluit.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_IQALUIT';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Iqaluit;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Iqaluit::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  61270387200, #      utc_end 1942-08-01 00:00:00 (Sat)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  61270387200, #    local_end 1942-08-01 00:00:00 (Sat)
  0,
  0,
  '-00',
      ],
      [
  61270387200, #    utc_start 1942-08-01 00:00:00 (Sat)
  61366287600, #      utc_end 1945-08-14 23:00:00 (Tue)
  61270372800, #  local_start 1942-07-31 20:00:00 (Fri)
  61366273200, #    local_end 1945-08-14 19:00:00 (Tue)
  -14400,
  1,
  'EWT',
      ],
      [
  61366287600, #    utc_start 1945-08-14 23:00:00 (Tue)
  61370287200, #      utc_end 1945-09-30 06:00:00 (Sun)
  61366273200, #  local_start 1945-08-14 19:00:00 (Tue)
  61370272800, #    local_end 1945-09-30 02:00:00 (Sun)
  -14400,
  1,
  'EPT',
      ],
      [
  61370287200, #    utc_start 1945-09-30 06:00:00 (Sun)
  61987784400, #      utc_end 1965-04-25 05:00:00 (Sun)
  61370269200, #  local_start 1945-09-30 01:00:00 (Sun)
  61987766400, #    local_end 1965-04-25 00:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  61987784400, #    utc_start 1965-04-25 05:00:00 (Sun)
  62004114000, #      utc_end 1965-10-31 05:00:00 (Sun)
  61987773600, #  local_start 1965-04-25 02:00:00 (Sun)
  62004103200, #    local_end 1965-10-31 02:00:00 (Sun)
  -10800,
  1,
  'EDDT',
      ],
      [
  62004114000, #    utc_start 1965-10-31 05:00:00 (Sun)
  62461350000, #      utc_end 1980-04-27 07:00:00 (Sun)
  62004096000, #  local_start 1965-10-31 00:00:00 (Sun)
  62461332000, #    local_end 1980-04-27 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62461350000, #    utc_start 1980-04-27 07:00:00 (Sun)
  62477071200, #      utc_end 1980-10-26 06:00:00 (Sun)
  62461335600, #  local_start 1980-04-27 03:00:00 (Sun)
  62477056800, #    local_end 1980-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62477071200, #    utc_start 1980-10-26 06:00:00 (Sun)
  62492799600, #      utc_end 1981-04-26 07:00:00 (Sun)
  62477053200, #  local_start 1980-10-26 01:00:00 (Sun)
  62492781600, #    local_end 1981-04-26 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62492799600, #    utc_start 1981-04-26 07:00:00 (Sun)
  62508520800, #      utc_end 1981-10-25 06:00:00 (Sun)
  62492785200, #  local_start 1981-04-26 03:00:00 (Sun)
  62508506400, #    local_end 1981-10-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62508520800, #    utc_start 1981-10-25 06:00:00 (Sun)
  62524249200, #      utc_end 1982-04-25 07:00:00 (Sun)
  62508502800, #  local_start 1981-10-25 01:00:00 (Sun)
  62524231200, #    local_end 1982-04-25 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62524249200, #    utc_start 1982-04-25 07:00:00 (Sun)
  62540575200, #      utc_end 1982-10-31 06:00:00 (Sun)
  62524234800, #  local_start 1982-04-25 03:00:00 (Sun)
  62540560800, #    local_end 1982-10-31 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62540575200, #    utc_start 1982-10-31 06:00:00 (Sun)
  62555698800, #      utc_end 1983-04-24 07:00:00 (Sun)
  62540557200, #  local_start 1982-10-31 01:00:00 (Sun)
  62555680800, #    local_end 1983-04-24 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62555698800, #    utc_start 1983-04-24 07:00:00 (Sun)
  62572024800, #      utc_end 1983-10-30 06:00:00 (Sun)
  62555684400, #  local_start 1983-04-24 03:00:00 (Sun)
  62572010400, #    local_end 1983-10-30 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62572024800, #    utc_start 1983-10-30 06:00:00 (Sun)
  62587753200, #      utc_end 1984-04-29 07:00:00 (Sun)
  62572006800, #  local_start 1983-10-30 01:00:00 (Sun)
  62587735200, #    local_end 1984-04-29 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62587753200, #    utc_start 1984-04-29 07:00:00 (Sun)
  62603474400, #      utc_end 1984-10-28 06:00:00 (Sun)
  62587738800, #  local_start 1984-04-29 03:00:00 (Sun)
  62603460000, #    local_end 1984-10-28 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62603474400, #    utc_start 1984-10-28 06:00:00 (Sun)
  62619202800, #      utc_end 1985-04-28 07:00:00 (Sun)
  62603456400, #  local_start 1984-10-28 01:00:00 (Sun)
  62619184800, #    local_end 1985-04-28 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62619202800, #    utc_start 1985-04-28 07:00:00 (Sun)
  62634924000, #      utc_end 1985-10-27 06:00:00 (Sun)
  62619188400, #  local_start 1985-04-28 03:00:00 (Sun)
  62634909600, #    local_end 1985-10-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62634924000, #    utc_start 1985-10-27 06:00:00 (Sun)
  62650652400, #      utc_end 1986-04-27 07:00:00 (Sun)
  62634906000, #  local_start 1985-10-27 01:00:00 (Sun)
  62650634400, #    local_end 1986-04-27 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62650652400, #    utc_start 1986-04-27 07:00:00 (Sun)
  62666373600, #      utc_end 1986-10-26 06:00:00 (Sun)
  62650638000, #  local_start 1986-04-27 03:00:00 (Sun)
  62666359200, #    local_end 1986-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62666373600, #    utc_start 1986-10-26 06:00:00 (Sun)
  62680287600, #      utc_end 1987-04-05 07:00:00 (Sun)
  62666355600, #  local_start 1986-10-26 01:00:00 (Sun)
  62680269600, #    local_end 1987-04-05 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62680287600, #    utc_start 1987-04-05 07:00:00 (Sun)
  62697823200, #      utc_end 1987-10-25 06:00:00 (Sun)
  62680273200, #  local_start 1987-04-05 03:00:00 (Sun)
  62697808800, #    local_end 1987-10-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62697823200, #    utc_start 1987-10-25 06:00:00 (Sun)
  62711737200, #      utc_end 1988-04-03 07:00:00 (Sun)
  62697805200, #  local_start 1987-10-25 01:00:00 (Sun)
  62711719200, #    local_end 1988-04-03 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62711737200, #    utc_start 1988-04-03 07:00:00 (Sun)
  62729877600, #      utc_end 1988-10-30 06:00:00 (Sun)
  62711722800, #  local_start 1988-04-03 03:00:00 (Sun)
  62729863200, #    local_end 1988-10-30 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62729877600, #    utc_start 1988-10-30 06:00:00 (Sun)
  62743186800, #      utc_end 1989-04-02 07:00:00 (Sun)
  62729859600, #  local_start 1988-10-30 01:00:00 (Sun)
  62743168800, #    local_end 1989-04-02 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62743186800, #    utc_start 1989-04-02 07:00:00 (Sun)
  62761327200, #      utc_end 1989-10-29 06:00:00 (Sun)
  62743172400, #  local_start 1989-04-02 03:00:00 (Sun)
  62761312800, #    local_end 1989-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62761327200, #    utc_start 1989-10-29 06:00:00 (Sun)
  62774636400, #      utc_end 1990-04-01 07:00:00 (Sun)
  62761309200, #  local_start 1989-10-29 01:00:00 (Sun)
  62774618400, #    local_end 1990-04-01 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62774636400, #    utc_start 1990-04-01 07:00:00 (Sun)
  62792776800, #      utc_end 1990-10-28 06:00:00 (Sun)
  62774622000, #  local_start 1990-04-01 03:00:00 (Sun)
  62792762400, #    local_end 1990-10-28 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62792776800, #    utc_start 1990-10-28 06:00:00 (Sun)
  62806690800, #      utc_end 1991-04-07 07:00:00 (Sun)
  62792758800, #  local_start 1990-10-28 01:00:00 (Sun)
  62806672800, #    local_end 1991-04-07 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62806690800, #    utc_start 1991-04-07 07:00:00 (Sun)
  62824226400, #      utc_end 1991-10-27 06:00:00 (Sun)
  62806676400, #  local_start 1991-04-07 03:00:00 (Sun)
  62824212000, #    local_end 1991-10-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62824226400, #    utc_start 1991-10-27 06:00:00 (Sun)
  62838140400, #      utc_end 1992-04-05 07:00:00 (Sun)
  62824208400, #  local_start 1991-10-27 01:00:00 (Sun)
  62838122400, #    local_end 1992-04-05 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62838140400, #    utc_start 1992-04-05 07:00:00 (Sun)
  62855676000, #      utc_end 1992-10-25 06:00:00 (Sun)
  62838126000, #  local_start 1992-04-05 03:00:00 (Sun)
  62855661600, #    local_end 1992-10-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62855676000, #    utc_start 1992-10-25 06:00:00 (Sun)
  62869590000, #      utc_end 1993-04-04 07:00:00 (Sun)
  62855658000, #  local_start 1992-10-25 01:00:00 (Sun)
  62869572000, #    local_end 1993-04-04 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62869590000, #    utc_start 1993-04-04 07:00:00 (Sun)
  62887730400, #      utc_end 1993-10-31 06:00:00 (Sun)
  62869575600, #  local_start 1993-04-04 03:00:00 (Sun)
  62887716000, #    local_end 1993-10-31 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62887730400, #    utc_start 1993-10-31 06:00:00 (Sun)
  62901039600, #      utc_end 1994-04-03 07:00:00 (Sun)
  62887712400, #  local_start 1993-10-31 01:00:00 (Sun)
  62901021600, #    local_end 1994-04-03 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62901039600, #    utc_start 1994-04-03 07:00:00 (Sun)
  62919180000, #      utc_end 1994-10-30 06:00:00 (Sun)
  62901025200, #  local_start 1994-04-03 03:00:00 (Sun)
  62919165600, #    local_end 1994-10-30 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62919180000, #    utc_start 1994-10-30 06:00:00 (Sun)
  62932489200, #      utc_end 1995-04-02 07:00:00 (Sun)
  62919162000, #  local_start 1994-10-30 01:00:00 (Sun)
  62932471200, #    local_end 1995-04-02 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62932489200, #    utc_start 1995-04-02 07:00:00 (Sun)
  62950629600, #      utc_end 1995-10-29 06:00:00 (Sun)
  62932474800, #  local_start 1995-04-02 03:00:00 (Sun)
  62950615200, #    local_end 1995-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62950629600, #    utc_start 1995-10-29 06:00:00 (Sun)
  62964543600, #      utc_end 1996-04-07 07:00:00 (Sun)
  62950611600, #  local_start 1995-10-29 01:00:00 (Sun)
  62964525600, #    local_end 1996-04-07 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62964543600, #    utc_start 1996-04-07 07:00:00 (Sun)
  62982079200, #      utc_end 1996-10-27 06:00:00 (Sun)
  62964529200, #  local_start 1996-04-07 03:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62982079200, #    utc_start 1996-10-27 06:00:00 (Sun)
  62995993200, #      utc_end 1997-04-06 07:00:00 (Sun)
  62982061200, #  local_start 1996-10-27 01:00:00 (Sun)
  62995975200, #    local_end 1997-04-06 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62995993200, #    utc_start 1997-04-06 07:00:00 (Sun)
  63013528800, #      utc_end 1997-10-26 06:00:00 (Sun)
  62995978800, #  local_start 1997-04-06 03:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63013528800, #    utc_start 1997-10-26 06:00:00 (Sun)
  63027442800, #      utc_end 1998-04-05 07:00:00 (Sun)
  63013510800, #  local_start 1997-10-26 01:00:00 (Sun)
  63027424800, #    local_end 1998-04-05 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63027442800, #    utc_start 1998-04-05 07:00:00 (Sun)
  63044978400, #      utc_end 1998-10-25 06:00:00 (Sun)
  63027428400, #  local_start 1998-04-05 03:00:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63044978400, #    utc_start 1998-10-25 06:00:00 (Sun)
  63058892400, #      utc_end 1999-04-04 07:00:00 (Sun)
  63044960400, #  local_start 1998-10-25 01:00:00 (Sun)
  63058874400, #    local_end 1999-04-04 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63058892400, #    utc_start 1999-04-04 07:00:00 (Sun)
  63077032800, #      utc_end 1999-10-31 06:00:00 (Sun)
  63058878000, #  local_start 1999-04-04 03:00:00 (Sun)
  63077018400, #    local_end 1999-10-31 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63077032800, #    utc_start 1999-10-31 06:00:00 (Sun)
  63090345600, #      utc_end 2000-04-02 08:00:00 (Sun)
  63077011200, #  local_start 1999-10-31 00:00:00 (Sun)
  63090324000, #    local_end 2000-04-02 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63090345600, #    utc_start 2000-04-02 08:00:00 (Sun)
  63108486000, #      utc_end 2000-10-29 07:00:00 (Sun)
  63090327600, #  local_start 2000-04-02 03:00:00 (Sun)
  63108468000, #    local_end 2000-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63108486000, #    utc_start 2000-10-29 07:00:00 (Sun)
  63121791600, #      utc_end 2001-04-01 07:00:00 (Sun)
  63108468000, #  local_start 2000-10-29 02:00:00 (Sun)
  63121773600, #    local_end 2001-04-01 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63121791600, #    utc_start 2001-04-01 07:00:00 (Sun)
  63139932000, #      utc_end 2001-10-28 06:00:00 (Sun)
  63121777200, #  local_start 2001-04-01 03:00:00 (Sun)
  63139917600, #    local_end 2001-10-28 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63139932000, #    utc_start 2001-10-28 06:00:00 (Sun)
  63153846000, #      utc_end 2002-04-07 07:00:00 (Sun)
  63139914000, #  local_start 2001-10-28 01:00:00 (Sun)
  63153828000, #    local_end 2002-04-07 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63153846000, #    utc_start 2002-04-07 07:00:00 (Sun)
  63171381600, #      utc_end 2002-10-27 06:00:00 (Sun)
  63153831600, #  local_start 2002-04-07 03:00:00 (Sun)
  63171367200, #    local_end 2002-10-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63171381600, #    utc_start 2002-10-27 06:00:00 (Sun)
  63185295600, #      utc_end 2003-04-06 07:00:00 (Sun)
  63171363600, #  local_start 2002-10-27 01:00:00 (Sun)
  63185277600, #    local_end 2003-04-06 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63185295600, #    utc_start 2003-04-06 07:00:00 (Sun)
  63202831200, #      utc_end 2003-10-26 06:00:00 (Sun)
  63185281200, #  local_start 2003-04-06 03:00:00 (Sun)
  63202816800, #    local_end 2003-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63202831200, #    utc_start 2003-10-26 06:00:00 (Sun)
  63216745200, #      utc_end 2004-04-04 07:00:00 (Sun)
  63202813200, #  local_start 2003-10-26 01:00:00 (Sun)
  63216727200, #    local_end 2004-04-04 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63216745200, #    utc_start 2004-04-04 07:00:00 (Sun)
  63234885600, #      utc_end 2004-10-31 06:00:00 (Sun)
  63216730800, #  local_start 2004-04-04 03:00:00 (Sun)
  63234871200, #    local_end 2004-10-31 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63234885600, #    utc_start 2004-10-31 06:00:00 (Sun)
  63248194800, #      utc_end 2005-04-03 07:00:00 (Sun)
  63234867600, #  local_start 2004-10-31 01:00:00 (Sun)
  63248176800, #    local_end 2005-04-03 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63248194800, #    utc_start 2005-04-03 07:00:00 (Sun)
  63266335200, #      utc_end 2005-10-30 06:00:00 (Sun)
  63248180400, #  local_start 2005-04-03 03:00:00 (Sun)
  63266320800, #    local_end 2005-10-30 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63266335200, #    utc_start 2005-10-30 06:00:00 (Sun)
  63279644400, #      utc_end 2006-04-02 07:00:00 (Sun)
  63266317200, #  local_start 2005-10-30 01:00:00 (Sun)
  63279626400, #    local_end 2006-04-02 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63279644400, #    utc_start 2006-04-02 07:00:00 (Sun)
  63297784800, #      utc_end 2006-10-29 06:00:00 (Sun)
  63279630000, #  local_start 2006-04-02 03:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63297784800, #    utc_start 2006-10-29 06:00:00 (Sun)
  63309279600, #      utc_end 2007-03-11 07:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63309261600, #    local_end 2007-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63309279600, #    utc_start 2007-03-11 07:00:00 (Sun)
  63329839200, #      utc_end 2007-11-04 06:00:00 (Sun)
  63309265200, #  local_start 2007-03-11 03:00:00 (Sun)
  63329824800, #    local_end 2007-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63329839200, #    utc_start 2007-11-04 06:00:00 (Sun)
  63340729200, #      utc_end 2008-03-09 07:00:00 (Sun)
  63329821200, #  local_start 2007-11-04 01:00:00 (Sun)
  63340711200, #    local_end 2008-03-09 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63340729200, #    utc_start 2008-03-09 07:00:00 (Sun)
  63361288800, #      utc_end 2008-11-02 06:00:00 (Sun)
  63340714800, #  local_start 2008-03-09 03:00:00 (Sun)
  63361274400, #    local_end 2008-11-02 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63361288800, #    utc_start 2008-11-02 06:00:00 (Sun)
  63372178800, #      utc_end 2009-03-08 07:00:00 (Sun)
  63361270800, #  local_start 2008-11-02 01:00:00 (Sun)
  63372160800, #    local_end 2009-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63372178800, #    utc_start 2009-03-08 07:00:00 (Sun)
  63392738400, #      utc_end 2009-11-01 06:00:00 (Sun)
  63372164400, #  local_start 2009-03-08 03:00:00 (Sun)
  63392724000, #    local_end 2009-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63392738400, #    utc_start 2009-11-01 06:00:00 (Sun)
  63404233200, #      utc_end 2010-03-14 07:00:00 (Sun)
  63392720400, #  local_start 2009-11-01 01:00:00 (Sun)
  63404215200, #    local_end 2010-03-14 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63404233200, #    utc_start 2010-03-14 07:00:00 (Sun)
  63424792800, #      utc_end 2010-11-07 06:00:00 (Sun)
  63404218800, #  local_start 2010-03-14 03:00:00 (Sun)
  63424778400, #    local_end 2010-11-07 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63424792800, #    utc_start 2010-11-07 06:00:00 (Sun)
  63435682800, #      utc_end 2011-03-13 07:00:00 (Sun)
  63424774800, #  local_start 2010-11-07 01:00:00 (Sun)
  63435664800, #    local_end 2011-03-13 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63435682800, #    utc_start 2011-03-13 07:00:00 (Sun)
  63456242400, #      utc_end 2011-11-06 06:00:00 (Sun)
  63435668400, #  local_start 2011-03-13 03:00:00 (Sun)
  63456228000, #    local_end 2011-11-06 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63456242400, #    utc_start 2011-11-06 06:00:00 (Sun)
  63467132400, #      utc_end 2012-03-11 07:00:00 (Sun)
  63456224400, #  local_start 2011-11-06 01:00:00 (Sun)
  63467114400, #    local_end 2012-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63467132400, #    utc_start 2012-03-11 07:00:00 (Sun)
  63487692000, #      utc_end 2012-11-04 06:00:00 (Sun)
  63467118000, #  local_start 2012-03-11 03:00:00 (Sun)
  63487677600, #    local_end 2012-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63487692000, #    utc_start 2012-11-04 06:00:00 (Sun)
  63498582000, #      utc_end 2013-03-10 07:00:00 (Sun)
  63487674000, #  local_start 2012-11-04 01:00:00 (Sun)
  63498564000, #    local_end 2013-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63498582000, #    utc_start 2013-03-10 07:00:00 (Sun)
  63519141600, #      utc_end 2013-11-03 06:00:00 (Sun)
  63498567600, #  local_start 2013-03-10 03:00:00 (Sun)
  63519127200, #    local_end 2013-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63519141600, #    utc_start 2013-11-03 06:00:00 (Sun)
  63530031600, #      utc_end 2014-03-09 07:00:00 (Sun)
  63519123600, #  local_start 2013-11-03 01:00:00 (Sun)
  63530013600, #    local_end 2014-03-09 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63530031600, #    utc_start 2014-03-09 07:00:00 (Sun)
  63550591200, #      utc_end 2014-11-02 06:00:00 (Sun)
  63530017200, #  local_start 2014-03-09 03:00:00 (Sun)
  63550576800, #    local_end 2014-11-02 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63550591200, #    utc_start 2014-11-02 06:00:00 (Sun)
  63561481200, #      utc_end 2015-03-08 07:00:00 (Sun)
  63550573200, #  local_start 2014-11-02 01:00:00 (Sun)
  63561463200, #    local_end 2015-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63561481200, #    utc_start 2015-03-08 07:00:00 (Sun)
  63582040800, #      utc_end 2015-11-01 06:00:00 (Sun)
  63561466800, #  local_start 2015-03-08 03:00:00 (Sun)
  63582026400, #    local_end 2015-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63582040800, #    utc_start 2015-11-01 06:00:00 (Sun)
  63593535600, #      utc_end 2016-03-13 07:00:00 (Sun)
  63582022800, #  local_start 2015-11-01 01:00:00 (Sun)
  63593517600, #    local_end 2016-03-13 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63593535600, #    utc_start 2016-03-13 07:00:00 (Sun)
  63614095200, #      utc_end 2016-11-06 06:00:00 (Sun)
  63593521200, #  local_start 2016-03-13 03:00:00 (Sun)
  63614080800, #    local_end 2016-11-06 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63614095200, #    utc_start 2016-11-06 06:00:00 (Sun)
  63624985200, #      utc_end 2017-03-12 07:00:00 (Sun)
  63614077200, #  local_start 2016-11-06 01:00:00 (Sun)
  63624967200, #    local_end 2017-03-12 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63624985200, #    utc_start 2017-03-12 07:00:00 (Sun)
  63645544800, #      utc_end 2017-11-05 06:00:00 (Sun)
  63624970800, #  local_start 2017-03-12 03:00:00 (Sun)
  63645530400, #    local_end 2017-11-05 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63645544800, #    utc_start 2017-11-05 06:00:00 (Sun)
  63656434800, #      utc_end 2018-03-11 07:00:00 (Sun)
  63645526800, #  local_start 2017-11-05 01:00:00 (Sun)
  63656416800, #    local_end 2018-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63656434800, #    utc_start 2018-03-11 07:00:00 (Sun)
  63676994400, #      utc_end 2018-11-04 06:00:00 (Sun)
  63656420400, #  local_start 2018-03-11 03:00:00 (Sun)
  63676980000, #    local_end 2018-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63676994400, #    utc_start 2018-11-04 06:00:00 (Sun)
  63687884400, #      utc_end 2019-03-10 07:00:00 (Sun)
  63676976400, #  local_start 2018-11-04 01:00:00 (Sun)
  63687866400, #    local_end 2019-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63687884400, #    utc_start 2019-03-10 07:00:00 (Sun)
  63708444000, #      utc_end 2019-11-03 06:00:00 (Sun)
  63687870000, #  local_start 2019-03-10 03:00:00 (Sun)
  63708429600, #    local_end 2019-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63708444000, #    utc_start 2019-11-03 06:00:00 (Sun)
  63719334000, #      utc_end 2020-03-08 07:00:00 (Sun)
  63708426000, #  local_start 2019-11-03 01:00:00 (Sun)
  63719316000, #    local_end 2020-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63719334000, #    utc_start 2020-03-08 07:00:00 (Sun)
  63739893600, #      utc_end 2020-11-01 06:00:00 (Sun)
  63719319600, #  local_start 2020-03-08 03:00:00 (Sun)
  63739879200, #    local_end 2020-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63739893600, #    utc_start 2020-11-01 06:00:00 (Sun)
  63751388400, #      utc_end 2021-03-14 07:00:00 (Sun)
  63739875600, #  local_start 2020-11-01 01:00:00 (Sun)
  63751370400, #    local_end 2021-03-14 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63751388400, #    utc_start 2021-03-14 07:00:00 (Sun)
  63771948000, #      utc_end 2021-11-07 06:00:00 (Sun)
  63751374000, #  local_start 2021-03-14 03:00:00 (Sun)
  63771933600, #    local_end 2021-11-07 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63771948000, #    utc_start 2021-11-07 06:00:00 (Sun)
  63782838000, #      utc_end 2022-03-13 07:00:00 (Sun)
  63771930000, #  local_start 2021-11-07 01:00:00 (Sun)
  63782820000, #    local_end 2022-03-13 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63782838000, #    utc_start 2022-03-13 07:00:00 (Sun)
  63803397600, #      utc_end 2022-11-06 06:00:00 (Sun)
  63782823600, #  local_start 2022-03-13 03:00:00 (Sun)
  63803383200, #    local_end 2022-11-06 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63803397600, #    utc_start 2022-11-06 06:00:00 (Sun)
  63814287600, #      utc_end 2023-03-12 07:00:00 (Sun)
  63803379600, #  local_start 2022-11-06 01:00:00 (Sun)
  63814269600, #    local_end 2023-03-12 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63814287600, #    utc_start 2023-03-12 07:00:00 (Sun)
  63834847200, #      utc_end 2023-11-05 06:00:00 (Sun)
  63814273200, #  local_start 2023-03-12 03:00:00 (Sun)
  63834832800, #    local_end 2023-11-05 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63834847200, #    utc_start 2023-11-05 06:00:00 (Sun)
  63845737200, #      utc_end 2024-03-10 07:00:00 (Sun)
  63834829200, #  local_start 2023-11-05 01:00:00 (Sun)
  63845719200, #    local_end 2024-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63845737200, #    utc_start 2024-03-10 07:00:00 (Sun)
  63866296800, #      utc_end 2024-11-03 06:00:00 (Sun)
  63845722800, #  local_start 2024-03-10 03:00:00 (Sun)
  63866282400, #    local_end 2024-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63866296800, #    utc_start 2024-11-03 06:00:00 (Sun)
  63877186800, #      utc_end 2025-03-09 07:00:00 (Sun)
  63866278800, #  local_start 2024-11-03 01:00:00 (Sun)
  63877168800, #    local_end 2025-03-09 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63877186800, #    utc_start 2025-03-09 07:00:00 (Sun)
  63897746400, #      utc_end 2025-11-02 06:00:00 (Sun)
  63877172400, #  local_start 2025-03-09 03:00:00 (Sun)
  63897732000, #    local_end 2025-11-02 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63897746400, #    utc_start 2025-11-02 06:00:00 (Sun)
  63908636400, #      utc_end 2026-03-08 07:00:00 (Sun)
  63897728400, #  local_start 2025-11-02 01:00:00 (Sun)
  63908618400, #    local_end 2026-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63908636400, #    utc_start 2026-03-08 07:00:00 (Sun)
  63929196000, #      utc_end 2026-11-01 06:00:00 (Sun)
  63908622000, #  local_start 2026-03-08 03:00:00 (Sun)
  63929181600, #    local_end 2026-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63929196000, #    utc_start 2026-11-01 06:00:00 (Sun)
  63940690800, #      utc_end 2027-03-14 07:00:00 (Sun)
  63929178000, #  local_start 2026-11-01 01:00:00 (Sun)
  63940672800, #    local_end 2027-03-14 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63940690800, #    utc_start 2027-03-14 07:00:00 (Sun)
  63961250400, #      utc_end 2027-11-07 06:00:00 (Sun)
  63940676400, #  local_start 2027-03-14 03:00:00 (Sun)
  63961236000, #    local_end 2027-11-07 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63961250400, #    utc_start 2027-11-07 06:00:00 (Sun)
  63972140400, #      utc_end 2028-03-12 07:00:00 (Sun)
  63961232400, #  local_start 2027-11-07 01:00:00 (Sun)
  63972122400, #    local_end 2028-03-12 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63972140400, #    utc_start 2028-03-12 07:00:00 (Sun)
  63992700000, #      utc_end 2028-11-05 06:00:00 (Sun)
  63972126000, #  local_start 2028-03-12 03:00:00 (Sun)
  63992685600, #    local_end 2028-11-05 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63992700000, #    utc_start 2028-11-05 06:00:00 (Sun)
  64003590000, #      utc_end 2029-03-11 07:00:00 (Sun)
  63992682000, #  local_start 2028-11-05 01:00:00 (Sun)
  64003572000, #    local_end 2029-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  64003590000, #    utc_start 2029-03-11 07:00:00 (Sun)
  64024149600, #      utc_end 2029-11-04 06:00:00 (Sun)
  64003575600, #  local_start 2029-03-11 03:00:00 (Sun)
  64024135200, #    local_end 2029-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  64024149600, #    utc_start 2029-11-04 06:00:00 (Sun)
  64035039600, #      utc_end 2030-03-10 07:00:00 (Sun)
  64024131600, #  local_start 2029-11-04 01:00:00 (Sun)
  64035021600, #    local_end 2030-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  64035039600, #    utc_start 2030-03-10 07:00:00 (Sun)
  64055599200, #      utc_end 2030-11-03 06:00:00 (Sun)
  64035025200, #  local_start 2030-03-10 03:00:00 (Sun)
  64055584800, #    local_end 2030-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {54}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -18000 }
  
  my $last_observance = bless( {
    'format' => 'E%sT',
    'gmtoff' => '-5:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 730422,
      'local_rd_secs' => 7200,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 730422,
      'utc_rd_secs' => 7200,
      'utc_year' => 2001
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -18000,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 730422,
      'local_rd_secs' => 25200,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 730422,
      'utc_rd_secs' => 25200,
      'utc_year' => 2001
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Nov',
      'letter' => 'S',
      'name' => 'Canada',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Mar',
      'letter' => 'D',
      'name' => 'Canada',
      'offset_from_std' => 3600,
      'on' => 'Sun>=8',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_IQALUIT

    $main::fatpacked{"DateTime/TimeZone/America/Jamaica.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_JAMAICA';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Jamaica;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Jamaica::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59611180030, #      utc_end 1890-01-01 05:07:10 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59611161600, #    local_end 1890-01-01 00:00:00 (Wed)
  -18430,
  0,
  'LMT',
      ],
      [
  59611180030, #    utc_start 1890-01-01 05:07:10 (Wed)
  60307996030, #      utc_end 1912-02-01 05:07:10 (Thu)
  59611161600, #  local_start 1890-01-01 00:00:00 (Wed)
  60307977600, #    local_end 1912-02-01 00:00:00 (Thu)
  -18430,
  0,
  'KMT',
      ],
      [
  60307996030, #    utc_start 1912-02-01 05:07:10 (Thu)
  62261931600, #      utc_end 1974-01-01 05:00:00 (Tue)
  60307978030, #  local_start 1912-02-01 00:07:10 (Thu)
  62261913600, #    local_end 1974-01-01 00:00:00 (Tue)
  -18000,
  0,
  'EST',
      ],
      [
  62261931600, #    utc_start 1974-01-01 05:00:00 (Tue)
  62262370800, #      utc_end 1974-01-06 07:00:00 (Sun)
  62261913600, #  local_start 1974-01-01 00:00:00 (Tue)
  62262352800, #    local_end 1974-01-06 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62262370800, #    utc_start 1974-01-06 07:00:00 (Sun)
  62287768800, #      utc_end 1974-10-27 06:00:00 (Sun)
  62262356400, #  local_start 1974-01-06 03:00:00 (Sun)
  62287754400, #    local_end 1974-10-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62287768800, #    utc_start 1974-10-27 06:00:00 (Sun)
  62298054000, #      utc_end 1975-02-23 07:00:00 (Sun)
  62287750800, #  local_start 1974-10-27 01:00:00 (Sun)
  62298036000, #    local_end 1975-02-23 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62298054000, #    utc_start 1975-02-23 07:00:00 (Sun)
  62319218400, #      utc_end 1975-10-26 06:00:00 (Sun)
  62298039600, #  local_start 1975-02-23 03:00:00 (Sun)
  62319204000, #    local_end 1975-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62319218400, #    utc_start 1975-10-26 06:00:00 (Sun)
  62334946800, #      utc_end 1976-04-25 07:00:00 (Sun)
  62319200400, #  local_start 1975-10-26 01:00:00 (Sun)
  62334928800, #    local_end 1976-04-25 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62334946800, #    utc_start 1976-04-25 07:00:00 (Sun)
  62351272800, #      utc_end 1976-10-31 06:00:00 (Sun)
  62334932400, #  local_start 1976-04-25 03:00:00 (Sun)
  62351258400, #    local_end 1976-10-31 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62351272800, #    utc_start 1976-10-31 06:00:00 (Sun)
  62366396400, #      utc_end 1977-04-24 07:00:00 (Sun)
  62351254800, #  local_start 1976-10-31 01:00:00 (Sun)
  62366378400, #    local_end 1977-04-24 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62366396400, #    utc_start 1977-04-24 07:00:00 (Sun)
  62382722400, #      utc_end 1977-10-30 06:00:00 (Sun)
  62366382000, #  local_start 1977-04-24 03:00:00 (Sun)
  62382708000, #    local_end 1977-10-30 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62382722400, #    utc_start 1977-10-30 06:00:00 (Sun)
  62398450800, #      utc_end 1978-04-30 07:00:00 (Sun)
  62382704400, #  local_start 1977-10-30 01:00:00 (Sun)
  62398432800, #    local_end 1978-04-30 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62398450800, #    utc_start 1978-04-30 07:00:00 (Sun)
  62414172000, #      utc_end 1978-10-29 06:00:00 (Sun)
  62398436400, #  local_start 1978-04-30 03:00:00 (Sun)
  62414157600, #    local_end 1978-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62414172000, #    utc_start 1978-10-29 06:00:00 (Sun)
  62429900400, #      utc_end 1979-04-29 07:00:00 (Sun)
  62414154000, #  local_start 1978-10-29 01:00:00 (Sun)
  62429882400, #    local_end 1979-04-29 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62429900400, #    utc_start 1979-04-29 07:00:00 (Sun)
  62445621600, #      utc_end 1979-10-28 06:00:00 (Sun)
  62429886000, #  local_start 1979-04-29 03:00:00 (Sun)
  62445607200, #    local_end 1979-10-28 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62445621600, #    utc_start 1979-10-28 06:00:00 (Sun)
  62461350000, #      utc_end 1980-04-27 07:00:00 (Sun)
  62445603600, #  local_start 1979-10-28 01:00:00 (Sun)
  62461332000, #    local_end 1980-04-27 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62461350000, #    utc_start 1980-04-27 07:00:00 (Sun)
  62477071200, #      utc_end 1980-10-26 06:00:00 (Sun)
  62461335600, #  local_start 1980-04-27 03:00:00 (Sun)
  62477056800, #    local_end 1980-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62477071200, #    utc_start 1980-10-26 06:00:00 (Sun)
  62492799600, #      utc_end 1981-04-26 07:00:00 (Sun)
  62477053200, #  local_start 1980-10-26 01:00:00 (Sun)
  62492781600, #    local_end 1981-04-26 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62492799600, #    utc_start 1981-04-26 07:00:00 (Sun)
  62508520800, #      utc_end 1981-10-25 06:00:00 (Sun)
  62492785200, #  local_start 1981-04-26 03:00:00 (Sun)
  62508506400, #    local_end 1981-10-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62508520800, #    utc_start 1981-10-25 06:00:00 (Sun)
  62524249200, #      utc_end 1982-04-25 07:00:00 (Sun)
  62508502800, #  local_start 1981-10-25 01:00:00 (Sun)
  62524231200, #    local_end 1982-04-25 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62524249200, #    utc_start 1982-04-25 07:00:00 (Sun)
  62540575200, #      utc_end 1982-10-31 06:00:00 (Sun)
  62524234800, #  local_start 1982-04-25 03:00:00 (Sun)
  62540560800, #    local_end 1982-10-31 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62540575200, #    utc_start 1982-10-31 06:00:00 (Sun)
  62555698800, #      utc_end 1983-04-24 07:00:00 (Sun)
  62540557200, #  local_start 1982-10-31 01:00:00 (Sun)
  62555680800, #    local_end 1983-04-24 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62555698800, #    utc_start 1983-04-24 07:00:00 (Sun)
  62572024800, #      utc_end 1983-10-30 06:00:00 (Sun)
  62555684400, #  local_start 1983-04-24 03:00:00 (Sun)
  62572010400, #    local_end 1983-10-30 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62572024800, #    utc_start 1983-10-30 06:00:00 (Sun)
  62577464400, #      utc_end 1984-01-01 05:00:00 (Sun)
  62572006800, #  local_start 1983-10-30 01:00:00 (Sun)
  62577446400, #    local_end 1984-01-01 00:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62577464400, #    utc_start 1984-01-01 05:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #      utc_end
  62577446400, #  local_start 1984-01-01 00:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  -18000,
  0,
  'EST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {10}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_JAMAICA

    $main::fatpacked{"DateTime/TimeZone/America/Juneau.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_JUNEAU';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Juneau;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Juneau::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  58910459473, #      utc_end 1867-10-19 00:31:13 (Sat)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  58910513612, #    local_end 1867-10-19 15:33:32 (Sat)
  54139,
  0,
  'LMT',
      ],
      [
  58910459473, #    utc_start 1867-10-19 00:31:13 (Sat)
  59946728261, #      utc_end 1900-08-20 20:57:41 (Mon)
  58910427212, #  local_start 1867-10-18 15:33:32 (Fri)
  59946696000, #    local_end 1900-08-20 12:00:00 (Mon)
  -32261,
  0,
  'LMT',
      ],
      [
  59946728261, #    utc_start 1900-08-20 20:57:41 (Mon)
  61252099200, #      utc_end 1942-01-01 08:00:00 (Thu)
  59946699461, #  local_start 1900-08-20 12:57:41 (Mon)
  61252070400, #    local_end 1942-01-01 00:00:00 (Thu)
  -28800,
  0,
  'PST',
      ],
      [
  61252099200, #    utc_start 1942-01-01 08:00:00 (Thu)
  61255476000, #      utc_end 1942-02-09 10:00:00 (Mon)
  61252070400, #  local_start 1942-01-01 00:00:00 (Thu)
  61255447200, #    local_end 1942-02-09 02:00:00 (Mon)
  -28800,
  0,
  'PST',
      ],
      [
  61255476000, #    utc_start 1942-02-09 10:00:00 (Mon)
  61366287600, #      utc_end 1945-08-14 23:00:00 (Tue)
  61255450800, #  local_start 1942-02-09 03:00:00 (Mon)
  61366262400, #    local_end 1945-08-14 16:00:00 (Tue)
  -25200,
  1,
  'PWT',
      ],
      [
  61366287600, #    utc_start 1945-08-14 23:00:00 (Tue)
  61370298000, #      utc_end 1945-09-30 09:00:00 (Sun)
  61366262400, #  local_start 1945-08-14 16:00:00 (Tue)
  61370272800, #    local_end 1945-09-30 02:00:00 (Sun)
  -25200,
  1,
  'PPT',
      ],
      [
  61370298000, #    utc_start 1945-09-30 09:00:00 (Sun)
  61378329600, #      utc_end 1946-01-01 08:00:00 (Tue)
  61370269200, #  local_start 1945-09-30 01:00:00 (Sun)
  61378300800, #    local_end 1946-01-01 00:00:00 (Tue)
  -28800,
  0,
  'PST',
      ],
      [
  61378329600, #    utc_start 1946-01-01 08:00:00 (Tue)
  62104176000, #      utc_end 1969-01-01 08:00:00 (Wed)
  61378300800, #  local_start 1946-01-01 00:00:00 (Tue)
  62104147200, #    local_end 1969-01-01 00:00:00 (Wed)
  -28800,
  0,
  'PST',
      ],
      [
  62104176000, #    utc_start 1969-01-01 08:00:00 (Wed)
  62114205600, #      utc_end 1969-04-27 10:00:00 (Sun)
  62104147200, #  local_start 1969-01-01 00:00:00 (Wed)
  62114176800, #    local_end 1969-04-27 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62114205600, #    utc_start 1969-04-27 10:00:00 (Sun)
  62129926800, #      utc_end 1969-10-26 09:00:00 (Sun)
  62114180400, #  local_start 1969-04-27 03:00:00 (Sun)
  62129901600, #    local_end 1969-10-26 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62129926800, #    utc_start 1969-10-26 09:00:00 (Sun)
  62145655200, #      utc_end 1970-04-26 10:00:00 (Sun)
  62129898000, #  local_start 1969-10-26 01:00:00 (Sun)
  62145626400, #    local_end 1970-04-26 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62145655200, #    utc_start 1970-04-26 10:00:00 (Sun)
  62161376400, #      utc_end 1970-10-25 09:00:00 (Sun)
  62145630000, #  local_start 1970-04-26 03:00:00 (Sun)
  62161351200, #    local_end 1970-10-25 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62161376400, #    utc_start 1970-10-25 09:00:00 (Sun)
  62177104800, #      utc_end 1971-04-25 10:00:00 (Sun)
  62161347600, #  local_start 1970-10-25 01:00:00 (Sun)
  62177076000, #    local_end 1971-04-25 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62177104800, #    utc_start 1971-04-25 10:00:00 (Sun)
  62193430800, #      utc_end 1971-10-31 09:00:00 (Sun)
  62177079600, #  local_start 1971-04-25 03:00:00 (Sun)
  62193405600, #    local_end 1971-10-31 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62193430800, #    utc_start 1971-10-31 09:00:00 (Sun)
  62209159200, #      utc_end 1972-04-30 10:00:00 (Sun)
  62193402000, #  local_start 1971-10-31 01:00:00 (Sun)
  62209130400, #    local_end 1972-04-30 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62209159200, #    utc_start 1972-04-30 10:00:00 (Sun)
  62224880400, #      utc_end 1972-10-29 09:00:00 (Sun)
  62209134000, #  local_start 1972-04-30 03:00:00 (Sun)
  62224855200, #    local_end 1972-10-29 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62224880400, #    utc_start 1972-10-29 09:00:00 (Sun)
  62240608800, #      utc_end 1973-04-29 10:00:00 (Sun)
  62224851600, #  local_start 1972-10-29 01:00:00 (Sun)
  62240580000, #    local_end 1973-04-29 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62240608800, #    utc_start 1973-04-29 10:00:00 (Sun)
  62256330000, #      utc_end 1973-10-28 09:00:00 (Sun)
  62240583600, #  local_start 1973-04-29 03:00:00 (Sun)
  62256304800, #    local_end 1973-10-28 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62256330000, #    utc_start 1973-10-28 09:00:00 (Sun)
  62262381600, #      utc_end 1974-01-06 10:00:00 (Sun)
  62256301200, #  local_start 1973-10-28 01:00:00 (Sun)
  62262352800, #    local_end 1974-01-06 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62262381600, #    utc_start 1974-01-06 10:00:00 (Sun)
  62287779600, #      utc_end 1974-10-27 09:00:00 (Sun)
  62262356400, #  local_start 1974-01-06 03:00:00 (Sun)
  62287754400, #    local_end 1974-10-27 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62287779600, #    utc_start 1974-10-27 09:00:00 (Sun)
  62298064800, #      utc_end 1975-02-23 10:00:00 (Sun)
  62287750800, #  local_start 1974-10-27 01:00:00 (Sun)
  62298036000, #    local_end 1975-02-23 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62298064800, #    utc_start 1975-02-23 10:00:00 (Sun)
  62319229200, #      utc_end 1975-10-26 09:00:00 (Sun)
  62298039600, #  local_start 1975-02-23 03:00:00 (Sun)
  62319204000, #    local_end 1975-10-26 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62319229200, #    utc_start 1975-10-26 09:00:00 (Sun)
  62334957600, #      utc_end 1976-04-25 10:00:00 (Sun)
  62319200400, #  local_start 1975-10-26 01:00:00 (Sun)
  62334928800, #    local_end 1976-04-25 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62334957600, #    utc_start 1976-04-25 10:00:00 (Sun)
  62351283600, #      utc_end 1976-10-31 09:00:00 (Sun)
  62334932400, #  local_start 1976-04-25 03:00:00 (Sun)
  62351258400, #    local_end 1976-10-31 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62351283600, #    utc_start 1976-10-31 09:00:00 (Sun)
  62366407200, #      utc_end 1977-04-24 10:00:00 (Sun)
  62351254800, #  local_start 1976-10-31 01:00:00 (Sun)
  62366378400, #    local_end 1977-04-24 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62366407200, #    utc_start 1977-04-24 10:00:00 (Sun)
  62382733200, #      utc_end 1977-10-30 09:00:00 (Sun)
  62366382000, #  local_start 1977-04-24 03:00:00 (Sun)
  62382708000, #    local_end 1977-10-30 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62382733200, #    utc_start 1977-10-30 09:00:00 (Sun)
  62398461600, #      utc_end 1978-04-30 10:00:00 (Sun)
  62382704400, #  local_start 1977-10-30 01:00:00 (Sun)
  62398432800, #    local_end 1978-04-30 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62398461600, #    utc_start 1978-04-30 10:00:00 (Sun)
  62414182800, #      utc_end 1978-10-29 09:00:00 (Sun)
  62398436400, #  local_start 1978-04-30 03:00:00 (Sun)
  62414157600, #    local_end 1978-10-29 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62414182800, #    utc_start 1978-10-29 09:00:00 (Sun)
  62429911200, #      utc_end 1979-04-29 10:00:00 (Sun)
  62414154000, #  local_start 1978-10-29 01:00:00 (Sun)
  62429882400, #    local_end 1979-04-29 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62429911200, #    utc_start 1979-04-29 10:00:00 (Sun)
  62445632400, #      utc_end 1979-10-28 09:00:00 (Sun)
  62429886000, #  local_start 1979-04-29 03:00:00 (Sun)
  62445607200, #    local_end 1979-10-28 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62445632400, #    utc_start 1979-10-28 09:00:00 (Sun)
  62461360800, #      utc_end 1980-04-27 10:00:00 (Sun)
  62445603600, #  local_start 1979-10-28 01:00:00 (Sun)
  62461332000, #    local_end 1980-04-27 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62461360800, #    utc_start 1980-04-27 10:00:00 (Sun)
  62477085600, #      utc_end 1980-10-26 10:00:00 (Sun)
  62461332000, #  local_start 1980-04-27 02:00:00 (Sun)
  62477056800, #    local_end 1980-10-26 02:00:00 (Sun)
  -28800,
  1,
  'YDT',
      ],
      [
  62477085600, #    utc_start 1980-10-26 10:00:00 (Sun)
  62492810400, #      utc_end 1981-04-26 10:00:00 (Sun)
  62477056800, #  local_start 1980-10-26 02:00:00 (Sun)
  62492781600, #    local_end 1981-04-26 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62492810400, #    utc_start 1981-04-26 10:00:00 (Sun)
  62508531600, #      utc_end 1981-10-25 09:00:00 (Sun)
  62492785200, #  local_start 1981-04-26 03:00:00 (Sun)
  62508506400, #    local_end 1981-10-25 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62508531600, #    utc_start 1981-10-25 09:00:00 (Sun)
  62524260000, #      utc_end 1982-04-25 10:00:00 (Sun)
  62508502800, #  local_start 1981-10-25 01:00:00 (Sun)
  62524231200, #    local_end 1982-04-25 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62524260000, #    utc_start 1982-04-25 10:00:00 (Sun)
  62540586000, #      utc_end 1982-10-31 09:00:00 (Sun)
  62524234800, #  local_start 1982-04-25 03:00:00 (Sun)
  62540560800, #    local_end 1982-10-31 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62540586000, #    utc_start 1982-10-31 09:00:00 (Sun)
  62555709600, #      utc_end 1983-04-24 10:00:00 (Sun)
  62540557200, #  local_start 1982-10-31 01:00:00 (Sun)
  62555680800, #    local_end 1983-04-24 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62555709600, #    utc_start 1983-04-24 10:00:00 (Sun)
  62572035600, #      utc_end 1983-10-30 09:00:00 (Sun)
  62555684400, #  local_start 1983-04-24 03:00:00 (Sun)
  62572010400, #    local_end 1983-10-30 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62572035600, #    utc_start 1983-10-30 09:00:00 (Sun)
  62574714000, #      utc_end 1983-11-30 09:00:00 (Wed)
  62572003200, #  local_start 1983-10-30 00:00:00 (Sun)
  62574681600, #    local_end 1983-11-30 00:00:00 (Wed)
  -32400,
  0,
  'YST',
      ],
      [
  62574714000, #    utc_start 1983-11-30 09:00:00 (Wed)
  62587767600, #      utc_end 1984-04-29 11:00:00 (Sun)
  62574681600, #  local_start 1983-11-30 00:00:00 (Wed)
  62587735200, #    local_end 1984-04-29 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62587767600, #    utc_start 1984-04-29 11:00:00 (Sun)
  62603488800, #      utc_end 1984-10-28 10:00:00 (Sun)
  62587738800, #  local_start 1984-04-29 03:00:00 (Sun)
  62603460000, #    local_end 1984-10-28 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  62603488800, #    utc_start 1984-10-28 10:00:00 (Sun)
  62619217200, #      utc_end 1985-04-28 11:00:00 (Sun)
  62603456400, #  local_start 1984-10-28 01:00:00 (Sun)
  62619184800, #    local_end 1985-04-28 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62619217200, #    utc_start 1985-04-28 11:00:00 (Sun)
  62634938400, #      utc_end 1985-10-27 10:00:00 (Sun)
  62619188400, #  local_start 1985-04-28 03:00:00 (Sun)
  62634909600, #    local_end 1985-10-27 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  62634938400, #    utc_start 1985-10-27 10:00:00 (Sun)
  62650666800, #      utc_end 1986-04-27 11:00:00 (Sun)
  62634906000, #  local_start 1985-10-27 01:00:00 (Sun)
  62650634400, #    local_end 1986-04-27 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62650666800, #    utc_start 1986-04-27 11:00:00 (Sun)
  62666388000, #      utc_end 1986-10-26 10:00:00 (Sun)
  62650638000, #  local_start 1986-04-27 03:00:00 (Sun)
  62666359200, #    local_end 1986-10-26 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  62666388000, #    utc_start 1986-10-26 10:00:00 (Sun)
  62680302000, #      utc_end 1987-04-05 11:00:00 (Sun)
  62666355600, #  local_start 1986-10-26 01:00:00 (Sun)
  62680269600, #    local_end 1987-04-05 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62680302000, #    utc_start 1987-04-05 11:00:00 (Sun)
  62697837600, #      utc_end 1987-10-25 10:00:00 (Sun)
  62680273200, #  local_start 1987-04-05 03:00:00 (Sun)
  62697808800, #    local_end 1987-10-25 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  62697837600, #    utc_start 1987-10-25 10:00:00 (Sun)
  62711751600, #      utc_end 1988-04-03 11:00:00 (Sun)
  62697805200, #  local_start 1987-10-25 01:00:00 (Sun)
  62711719200, #    local_end 1988-04-03 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62711751600, #    utc_start 1988-04-03 11:00:00 (Sun)
  62729892000, #      utc_end 1988-10-30 10:00:00 (Sun)
  62711722800, #  local_start 1988-04-03 03:00:00 (Sun)
  62729863200, #    local_end 1988-10-30 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  62729892000, #    utc_start 1988-10-30 10:00:00 (Sun)
  62743201200, #      utc_end 1989-04-02 11:00:00 (Sun)
  62729859600, #  local_start 1988-10-30 01:00:00 (Sun)
  62743168800, #    local_end 1989-04-02 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62743201200, #    utc_start 1989-04-02 11:00:00 (Sun)
  62761341600, #      utc_end 1989-10-29 10:00:00 (Sun)
  62743172400, #  local_start 1989-04-02 03:00:00 (Sun)
  62761312800, #    local_end 1989-10-29 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  62761341600, #    utc_start 1989-10-29 10:00:00 (Sun)
  62774650800, #      utc_end 1990-04-01 11:00:00 (Sun)
  62761309200, #  local_start 1989-10-29 01:00:00 (Sun)
  62774618400, #    local_end 1990-04-01 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62774650800, #    utc_start 1990-04-01 11:00:00 (Sun)
  62792791200, #      utc_end 1990-10-28 10:00:00 (Sun)
  62774622000, #  local_start 1990-04-01 03:00:00 (Sun)
  62792762400, #    local_end 1990-10-28 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  62792791200, #    utc_start 1990-10-28 10:00:00 (Sun)
  62806705200, #      utc_end 1991-04-07 11:00:00 (Sun)
  62792758800, #  local_start 1990-10-28 01:00:00 (Sun)
  62806672800, #    local_end 1991-04-07 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62806705200, #    utc_start 1991-04-07 11:00:00 (Sun)
  62824240800, #      utc_end 1991-10-27 10:00:00 (Sun)
  62806676400, #  local_start 1991-04-07 03:00:00 (Sun)
  62824212000, #    local_end 1991-10-27 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  62824240800, #    utc_start 1991-10-27 10:00:00 (Sun)
  62838154800, #      utc_end 1992-04-05 11:00:00 (Sun)
  62824208400, #  local_start 1991-10-27 01:00:00 (Sun)
  62838122400, #    local_end 1992-04-05 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62838154800, #    utc_start 1992-04-05 11:00:00 (Sun)
  62855690400, #      utc_end 1992-10-25 10:00:00 (Sun)
  62838126000, #  local_start 1992-04-05 03:00:00 (Sun)
  62855661600, #    local_end 1992-10-25 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  62855690400, #    utc_start 1992-10-25 10:00:00 (Sun)
  62869604400, #      utc_end 1993-04-04 11:00:00 (Sun)
  62855658000, #  local_start 1992-10-25 01:00:00 (Sun)
  62869572000, #    local_end 1993-04-04 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62869604400, #    utc_start 1993-04-04 11:00:00 (Sun)
  62887744800, #      utc_end 1993-10-31 10:00:00 (Sun)
  62869575600, #  local_start 1993-04-04 03:00:00 (Sun)
  62887716000, #    local_end 1993-10-31 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  62887744800, #    utc_start 1993-10-31 10:00:00 (Sun)
  62901054000, #      utc_end 1994-04-03 11:00:00 (Sun)
  62887712400, #  local_start 1993-10-31 01:00:00 (Sun)
  62901021600, #    local_end 1994-04-03 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62901054000, #    utc_start 1994-04-03 11:00:00 (Sun)
  62919194400, #      utc_end 1994-10-30 10:00:00 (Sun)
  62901025200, #  local_start 1994-04-03 03:00:00 (Sun)
  62919165600, #    local_end 1994-10-30 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  62919194400, #    utc_start 1994-10-30 10:00:00 (Sun)
  62932503600, #      utc_end 1995-04-02 11:00:00 (Sun)
  62919162000, #  local_start 1994-10-30 01:00:00 (Sun)
  62932471200, #    local_end 1995-04-02 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62932503600, #    utc_start 1995-04-02 11:00:00 (Sun)
  62950644000, #      utc_end 1995-10-29 10:00:00 (Sun)
  62932474800, #  local_start 1995-04-02 03:00:00 (Sun)
  62950615200, #    local_end 1995-10-29 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  62950644000, #    utc_start 1995-10-29 10:00:00 (Sun)
  62964558000, #      utc_end 1996-04-07 11:00:00 (Sun)
  62950611600, #  local_start 1995-10-29 01:00:00 (Sun)
  62964525600, #    local_end 1996-04-07 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62964558000, #    utc_start 1996-04-07 11:00:00 (Sun)
  62982093600, #      utc_end 1996-10-27 10:00:00 (Sun)
  62964529200, #  local_start 1996-04-07 03:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  62982093600, #    utc_start 1996-10-27 10:00:00 (Sun)
  62996007600, #      utc_end 1997-04-06 11:00:00 (Sun)
  62982061200, #  local_start 1996-10-27 01:00:00 (Sun)
  62995975200, #    local_end 1997-04-06 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62996007600, #    utc_start 1997-04-06 11:00:00 (Sun)
  63013543200, #      utc_end 1997-10-26 10:00:00 (Sun)
  62995978800, #  local_start 1997-04-06 03:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63013543200, #    utc_start 1997-10-26 10:00:00 (Sun)
  63027457200, #      utc_end 1998-04-05 11:00:00 (Sun)
  63013510800, #  local_start 1997-10-26 01:00:00 (Sun)
  63027424800, #    local_end 1998-04-05 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63027457200, #    utc_start 1998-04-05 11:00:00 (Sun)
  63044992800, #      utc_end 1998-10-25 10:00:00 (Sun)
  63027428400, #  local_start 1998-04-05 03:00:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63044992800, #    utc_start 1998-10-25 10:00:00 (Sun)
  63058906800, #      utc_end 1999-04-04 11:00:00 (Sun)
  63044960400, #  local_start 1998-10-25 01:00:00 (Sun)
  63058874400, #    local_end 1999-04-04 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63058906800, #    utc_start 1999-04-04 11:00:00 (Sun)
  63077047200, #      utc_end 1999-10-31 10:00:00 (Sun)
  63058878000, #  local_start 1999-04-04 03:00:00 (Sun)
  63077018400, #    local_end 1999-10-31 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63077047200, #    utc_start 1999-10-31 10:00:00 (Sun)
  63090356400, #      utc_end 2000-04-02 11:00:00 (Sun)
  63077014800, #  local_start 1999-10-31 01:00:00 (Sun)
  63090324000, #    local_end 2000-04-02 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63090356400, #    utc_start 2000-04-02 11:00:00 (Sun)
  63108496800, #      utc_end 2000-10-29 10:00:00 (Sun)
  63090327600, #  local_start 2000-04-02 03:00:00 (Sun)
  63108468000, #    local_end 2000-10-29 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63108496800, #    utc_start 2000-10-29 10:00:00 (Sun)
  63121806000, #      utc_end 2001-04-01 11:00:00 (Sun)
  63108464400, #  local_start 2000-10-29 01:00:00 (Sun)
  63121773600, #    local_end 2001-04-01 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63121806000, #    utc_start 2001-04-01 11:00:00 (Sun)
  63139946400, #      utc_end 2001-10-28 10:00:00 (Sun)
  63121777200, #  local_start 2001-04-01 03:00:00 (Sun)
  63139917600, #    local_end 2001-10-28 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63139946400, #    utc_start 2001-10-28 10:00:00 (Sun)
  63153860400, #      utc_end 2002-04-07 11:00:00 (Sun)
  63139914000, #  local_start 2001-10-28 01:00:00 (Sun)
  63153828000, #    local_end 2002-04-07 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63153860400, #    utc_start 2002-04-07 11:00:00 (Sun)
  63171396000, #      utc_end 2002-10-27 10:00:00 (Sun)
  63153831600, #  local_start 2002-04-07 03:00:00 (Sun)
  63171367200, #    local_end 2002-10-27 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63171396000, #    utc_start 2002-10-27 10:00:00 (Sun)
  63185310000, #      utc_end 2003-04-06 11:00:00 (Sun)
  63171363600, #  local_start 2002-10-27 01:00:00 (Sun)
  63185277600, #    local_end 2003-04-06 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63185310000, #    utc_start 2003-04-06 11:00:00 (Sun)
  63202845600, #      utc_end 2003-10-26 10:00:00 (Sun)
  63185281200, #  local_start 2003-04-06 03:00:00 (Sun)
  63202816800, #    local_end 2003-10-26 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63202845600, #    utc_start 2003-10-26 10:00:00 (Sun)
  63216759600, #      utc_end 2004-04-04 11:00:00 (Sun)
  63202813200, #  local_start 2003-10-26 01:00:00 (Sun)
  63216727200, #    local_end 2004-04-04 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63216759600, #    utc_start 2004-04-04 11:00:00 (Sun)
  63234900000, #      utc_end 2004-10-31 10:00:00 (Sun)
  63216730800, #  local_start 2004-04-04 03:00:00 (Sun)
  63234871200, #    local_end 2004-10-31 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63234900000, #    utc_start 2004-10-31 10:00:00 (Sun)
  63248209200, #      utc_end 2005-04-03 11:00:00 (Sun)
  63234867600, #  local_start 2004-10-31 01:00:00 (Sun)
  63248176800, #    local_end 2005-04-03 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63248209200, #    utc_start 2005-04-03 11:00:00 (Sun)
  63266349600, #      utc_end 2005-10-30 10:00:00 (Sun)
  63248180400, #  local_start 2005-04-03 03:00:00 (Sun)
  63266320800, #    local_end 2005-10-30 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63266349600, #    utc_start 2005-10-30 10:00:00 (Sun)
  63279658800, #      utc_end 2006-04-02 11:00:00 (Sun)
  63266317200, #  local_start 2005-10-30 01:00:00 (Sun)
  63279626400, #    local_end 2006-04-02 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63279658800, #    utc_start 2006-04-02 11:00:00 (Sun)
  63297799200, #      utc_end 2006-10-29 10:00:00 (Sun)
  63279630000, #  local_start 2006-04-02 03:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63297799200, #    utc_start 2006-10-29 10:00:00 (Sun)
  63309294000, #      utc_end 2007-03-11 11:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63309261600, #    local_end 2007-03-11 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63309294000, #    utc_start 2007-03-11 11:00:00 (Sun)
  63329853600, #      utc_end 2007-11-04 10:00:00 (Sun)
  63309265200, #  local_start 2007-03-11 03:00:00 (Sun)
  63329824800, #    local_end 2007-11-04 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63329853600, #    utc_start 2007-11-04 10:00:00 (Sun)
  63340743600, #      utc_end 2008-03-09 11:00:00 (Sun)
  63329821200, #  local_start 2007-11-04 01:00:00 (Sun)
  63340711200, #    local_end 2008-03-09 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63340743600, #    utc_start 2008-03-09 11:00:00 (Sun)
  63361303200, #      utc_end 2008-11-02 10:00:00 (Sun)
  63340714800, #  local_start 2008-03-09 03:00:00 (Sun)
  63361274400, #    local_end 2008-11-02 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63361303200, #    utc_start 2008-11-02 10:00:00 (Sun)
  63372193200, #      utc_end 2009-03-08 11:00:00 (Sun)
  63361270800, #  local_start 2008-11-02 01:00:00 (Sun)
  63372160800, #    local_end 2009-03-08 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63372193200, #    utc_start 2009-03-08 11:00:00 (Sun)
  63392752800, #      utc_end 2009-11-01 10:00:00 (Sun)
  63372164400, #  local_start 2009-03-08 03:00:00 (Sun)
  63392724000, #    local_end 2009-11-01 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63392752800, #    utc_start 2009-11-01 10:00:00 (Sun)
  63404247600, #      utc_end 2010-03-14 11:00:00 (Sun)
  63392720400, #  local_start 2009-11-01 01:00:00 (Sun)
  63404215200, #    local_end 2010-03-14 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63404247600, #    utc_start 2010-03-14 11:00:00 (Sun)
  63424807200, #      utc_end 2010-11-07 10:00:00 (Sun)
  63404218800, #  local_start 2010-03-14 03:00:00 (Sun)
  63424778400, #    local_end 2010-11-07 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63424807200, #    utc_start 2010-11-07 10:00:00 (Sun)
  63435697200, #      utc_end 2011-03-13 11:00:00 (Sun)
  63424774800, #  local_start 2010-11-07 01:00:00 (Sun)
  63435664800, #    local_end 2011-03-13 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63435697200, #    utc_start 2011-03-13 11:00:00 (Sun)
  63456256800, #      utc_end 2011-11-06 10:00:00 (Sun)
  63435668400, #  local_start 2011-03-13 03:00:00 (Sun)
  63456228000, #    local_end 2011-11-06 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63456256800, #    utc_start 2011-11-06 10:00:00 (Sun)
  63467146800, #      utc_end 2012-03-11 11:00:00 (Sun)
  63456224400, #  local_start 2011-11-06 01:00:00 (Sun)
  63467114400, #    local_end 2012-03-11 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63467146800, #    utc_start 2012-03-11 11:00:00 (Sun)
  63487706400, #      utc_end 2012-11-04 10:00:00 (Sun)
  63467118000, #  local_start 2012-03-11 03:00:00 (Sun)
  63487677600, #    local_end 2012-11-04 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63487706400, #    utc_start 2012-11-04 10:00:00 (Sun)
  63498596400, #      utc_end 2013-03-10 11:00:00 (Sun)
  63487674000, #  local_start 2012-11-04 01:00:00 (Sun)
  63498564000, #    local_end 2013-03-10 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63498596400, #    utc_start 2013-03-10 11:00:00 (Sun)
  63519156000, #      utc_end 2013-11-03 10:00:00 (Sun)
  63498567600, #  local_start 2013-03-10 03:00:00 (Sun)
  63519127200, #    local_end 2013-11-03 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63519156000, #    utc_start 2013-11-03 10:00:00 (Sun)
  63530046000, #      utc_end 2014-03-09 11:00:00 (Sun)
  63519123600, #  local_start 2013-11-03 01:00:00 (Sun)
  63530013600, #    local_end 2014-03-09 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63530046000, #    utc_start 2014-03-09 11:00:00 (Sun)
  63550605600, #      utc_end 2014-11-02 10:00:00 (Sun)
  63530017200, #  local_start 2014-03-09 03:00:00 (Sun)
  63550576800, #    local_end 2014-11-02 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63550605600, #    utc_start 2014-11-02 10:00:00 (Sun)
  63561495600, #      utc_end 2015-03-08 11:00:00 (Sun)
  63550573200, #  local_start 2014-11-02 01:00:00 (Sun)
  63561463200, #    local_end 2015-03-08 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63561495600, #    utc_start 2015-03-08 11:00:00 (Sun)
  63582055200, #      utc_end 2015-11-01 10:00:00 (Sun)
  63561466800, #  local_start 2015-03-08 03:00:00 (Sun)
  63582026400, #    local_end 2015-11-01 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63582055200, #    utc_start 2015-11-01 10:00:00 (Sun)
  63593550000, #      utc_end 2016-03-13 11:00:00 (Sun)
  63582022800, #  local_start 2015-11-01 01:00:00 (Sun)
  63593517600, #    local_end 2016-03-13 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63593550000, #    utc_start 2016-03-13 11:00:00 (Sun)
  63614109600, #      utc_end 2016-11-06 10:00:00 (Sun)
  63593521200, #  local_start 2016-03-13 03:00:00 (Sun)
  63614080800, #    local_end 2016-11-06 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63614109600, #    utc_start 2016-11-06 10:00:00 (Sun)
  63624999600, #      utc_end 2017-03-12 11:00:00 (Sun)
  63614077200, #  local_start 2016-11-06 01:00:00 (Sun)
  63624967200, #    local_end 2017-03-12 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63624999600, #    utc_start 2017-03-12 11:00:00 (Sun)
  63645559200, #      utc_end 2017-11-05 10:00:00 (Sun)
  63624970800, #  local_start 2017-03-12 03:00:00 (Sun)
  63645530400, #    local_end 2017-11-05 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63645559200, #    utc_start 2017-11-05 10:00:00 (Sun)
  63656449200, #      utc_end 2018-03-11 11:00:00 (Sun)
  63645526800, #  local_start 2017-11-05 01:00:00 (Sun)
  63656416800, #    local_end 2018-03-11 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63656449200, #    utc_start 2018-03-11 11:00:00 (Sun)
  63677008800, #      utc_end 2018-11-04 10:00:00 (Sun)
  63656420400, #  local_start 2018-03-11 03:00:00 (Sun)
  63676980000, #    local_end 2018-11-04 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63677008800, #    utc_start 2018-11-04 10:00:00 (Sun)
  63687898800, #      utc_end 2019-03-10 11:00:00 (Sun)
  63676976400, #  local_start 2018-11-04 01:00:00 (Sun)
  63687866400, #    local_end 2019-03-10 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63687898800, #    utc_start 2019-03-10 11:00:00 (Sun)
  63708458400, #      utc_end 2019-11-03 10:00:00 (Sun)
  63687870000, #  local_start 2019-03-10 03:00:00 (Sun)
  63708429600, #    local_end 2019-11-03 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63708458400, #    utc_start 2019-11-03 10:00:00 (Sun)
  63719348400, #      utc_end 2020-03-08 11:00:00 (Sun)
  63708426000, #  local_start 2019-11-03 01:00:00 (Sun)
  63719316000, #    local_end 2020-03-08 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63719348400, #    utc_start 2020-03-08 11:00:00 (Sun)
  63739908000, #      utc_end 2020-11-01 10:00:00 (Sun)
  63719319600, #  local_start 2020-03-08 03:00:00 (Sun)
  63739879200, #    local_end 2020-11-01 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63739908000, #    utc_start 2020-11-01 10:00:00 (Sun)
  63751402800, #      utc_end 2021-03-14 11:00:00 (Sun)
  63739875600, #  local_start 2020-11-01 01:00:00 (Sun)
  63751370400, #    local_end 2021-03-14 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63751402800, #    utc_start 2021-03-14 11:00:00 (Sun)
  63771962400, #      utc_end 2021-11-07 10:00:00 (Sun)
  63751374000, #  local_start 2021-03-14 03:00:00 (Sun)
  63771933600, #    local_end 2021-11-07 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63771962400, #    utc_start 2021-11-07 10:00:00 (Sun)
  63782852400, #      utc_end 2022-03-13 11:00:00 (Sun)
  63771930000, #  local_start 2021-11-07 01:00:00 (Sun)
  63782820000, #    local_end 2022-03-13 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63782852400, #    utc_start 2022-03-13 11:00:00 (Sun)
  63803412000, #      utc_end 2022-11-06 10:00:00 (Sun)
  63782823600, #  local_start 2022-03-13 03:00:00 (Sun)
  63803383200, #    local_end 2022-11-06 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63803412000, #    utc_start 2022-11-06 10:00:00 (Sun)
  63814302000, #      utc_end 2023-03-12 11:00:00 (Sun)
  63803379600, #  local_start 2022-11-06 01:00:00 (Sun)
  63814269600, #    local_end 2023-03-12 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63814302000, #    utc_start 2023-03-12 11:00:00 (Sun)
  63834861600, #      utc_end 2023-11-05 10:00:00 (Sun)
  63814273200, #  local_start 2023-03-12 03:00:00 (Sun)
  63834832800, #    local_end 2023-11-05 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63834861600, #    utc_start 2023-11-05 10:00:00 (Sun)
  63845751600, #      utc_end 2024-03-10 11:00:00 (Sun)
  63834829200, #  local_start 2023-11-05 01:00:00 (Sun)
  63845719200, #    local_end 2024-03-10 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63845751600, #    utc_start 2024-03-10 11:00:00 (Sun)
  63866311200, #      utc_end 2024-11-03 10:00:00 (Sun)
  63845722800, #  local_start 2024-03-10 03:00:00 (Sun)
  63866282400, #    local_end 2024-11-03 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63866311200, #    utc_start 2024-11-03 10:00:00 (Sun)
  63877201200, #      utc_end 2025-03-09 11:00:00 (Sun)
  63866278800, #  local_start 2024-11-03 01:00:00 (Sun)
  63877168800, #    local_end 2025-03-09 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63877201200, #    utc_start 2025-03-09 11:00:00 (Sun)
  63897760800, #      utc_end 2025-11-02 10:00:00 (Sun)
  63877172400, #  local_start 2025-03-09 03:00:00 (Sun)
  63897732000, #    local_end 2025-11-02 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63897760800, #    utc_start 2025-11-02 10:00:00 (Sun)
  63908650800, #      utc_end 2026-03-08 11:00:00 (Sun)
  63897728400, #  local_start 2025-11-02 01:00:00 (Sun)
  63908618400, #    local_end 2026-03-08 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63908650800, #    utc_start 2026-03-08 11:00:00 (Sun)
  63929210400, #      utc_end 2026-11-01 10:00:00 (Sun)
  63908622000, #  local_start 2026-03-08 03:00:00 (Sun)
  63929181600, #    local_end 2026-11-01 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63929210400, #    utc_start 2026-11-01 10:00:00 (Sun)
  63940705200, #      utc_end 2027-03-14 11:00:00 (Sun)
  63929178000, #  local_start 2026-11-01 01:00:00 (Sun)
  63940672800, #    local_end 2027-03-14 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63940705200, #    utc_start 2027-03-14 11:00:00 (Sun)
  63961264800, #      utc_end 2027-11-07 10:00:00 (Sun)
  63940676400, #  local_start 2027-03-14 03:00:00 (Sun)
  63961236000, #    local_end 2027-11-07 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63961264800, #    utc_start 2027-11-07 10:00:00 (Sun)
  63972154800, #      utc_end 2028-03-12 11:00:00 (Sun)
  63961232400, #  local_start 2027-11-07 01:00:00 (Sun)
  63972122400, #    local_end 2028-03-12 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63972154800, #    utc_start 2028-03-12 11:00:00 (Sun)
  63992714400, #      utc_end 2028-11-05 10:00:00 (Sun)
  63972126000, #  local_start 2028-03-12 03:00:00 (Sun)
  63992685600, #    local_end 2028-11-05 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63992714400, #    utc_start 2028-11-05 10:00:00 (Sun)
  64003604400, #      utc_end 2029-03-11 11:00:00 (Sun)
  63992682000, #  local_start 2028-11-05 01:00:00 (Sun)
  64003572000, #    local_end 2029-03-11 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  64003604400, #    utc_start 2029-03-11 11:00:00 (Sun)
  64024164000, #      utc_end 2029-11-04 10:00:00 (Sun)
  64003575600, #  local_start 2029-03-11 03:00:00 (Sun)
  64024135200, #    local_end 2029-11-04 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  64024164000, #    utc_start 2029-11-04 10:00:00 (Sun)
  64035054000, #      utc_end 2030-03-10 11:00:00 (Sun)
  64024131600, #  local_start 2029-11-04 01:00:00 (Sun)
  64035021600, #    local_end 2030-03-10 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  64035054000, #    utc_start 2030-03-10 11:00:00 (Sun)
  64055613600, #      utc_end 2030-11-03 10:00:00 (Sun)
  64035025200, #  local_start 2030-03-10 03:00:00 (Sun)
  64055584800, #    local_end 2030-11-03 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {64}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -32400 }
  
  my $last_observance = bless( {
    'format' => 'AK%sT',
    'gmtoff' => '-9:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 724244,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 724244,
      'utc_rd_secs' => 0,
      'utc_year' => 1984
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -32400,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 724244,
      'local_rd_secs' => 32400,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 724244,
      'utc_rd_secs' => 32400,
      'utc_year' => 1984
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Mar',
      'letter' => 'D',
      'name' => 'US',
      'offset_from_std' => 3600,
      'on' => 'Sun>=8',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Nov',
      'letter' => 'S',
      'name' => 'US',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_JUNEAU

    $main::fatpacked{"DateTime/TimeZone/America/Kentucky/Louisville.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_KENTUCKY_LOUISVILLE';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Kentucky::Louisville;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Kentucky::Louisville::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59418036000, #      utc_end 1883-11-18 18:00:00 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59418015418, #    local_end 1883-11-18 12:16:58 (Sun)
  -20582,
  0,
  'LMT',
      ],
      [
  59418036000, #    utc_start 1883-11-18 18:00:00 (Sun)
  60502406400, #      utc_end 1918-03-31 08:00:00 (Sun)
  59418014400, #  local_start 1883-11-18 12:00:00 (Sun)
  60502384800, #    local_end 1918-03-31 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  60502406400, #    utc_start 1918-03-31 08:00:00 (Sun)
  60520546800, #      utc_end 1918-10-27 07:00:00 (Sun)
  60502388400, #  local_start 1918-03-31 03:00:00 (Sun)
  60520528800, #    local_end 1918-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  60520546800, #    utc_start 1918-10-27 07:00:00 (Sun)
  60533856000, #      utc_end 1919-03-30 08:00:00 (Sun)
  60520525200, #  local_start 1918-10-27 01:00:00 (Sun)
  60533834400, #    local_end 1919-03-30 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  60533856000, #    utc_start 1919-03-30 08:00:00 (Sun)
  60551996400, #      utc_end 1919-10-26 07:00:00 (Sun)
  60533838000, #  local_start 1919-03-30 03:00:00 (Sun)
  60551978400, #    local_end 1919-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  60551996400, #    utc_start 1919-10-26 07:00:00 (Sun)
  60589404000, #      utc_end 1921-01-01 06:00:00 (Sat)
  60551974800, #  local_start 1919-10-26 01:00:00 (Sun)
  60589382400, #    local_end 1921-01-01 00:00:00 (Sat)
  -21600,
  0,
  'CST',
      ],
      [
  60589404000, #    utc_start 1921-01-01 06:00:00 (Sat)
  60599779200, #      utc_end 1921-05-01 08:00:00 (Sun)
  60589382400, #  local_start 1921-01-01 00:00:00 (Sat)
  60599757600, #    local_end 1921-05-01 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  60599779200, #    utc_start 1921-05-01 08:00:00 (Sun)
  60610402800, #      utc_end 1921-09-01 07:00:00 (Thu)
  60599761200, #  local_start 1921-05-01 03:00:00 (Sun)
  60610384800, #    local_end 1921-09-01 02:00:00 (Thu)
  -18000,
  1,
  'CDT',
      ],
      [
  60610402800, #    utc_start 1921-09-01 07:00:00 (Thu)
  61230585600, #      utc_end 1941-04-27 08:00:00 (Sun)
  60610381200, #  local_start 1921-09-01 01:00:00 (Thu)
  61230564000, #    local_end 1941-04-27 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61230585600, #    utc_start 1941-04-27 08:00:00 (Sun)
  61243887600, #      utc_end 1941-09-28 07:00:00 (Sun)
  61230567600, #  local_start 1941-04-27 03:00:00 (Sun)
  61243869600, #    local_end 1941-09-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61243887600, #    utc_start 1941-09-28 07:00:00 (Sun)
  61252092000, #      utc_end 1942-01-01 06:00:00 (Thu)
  61243866000, #  local_start 1941-09-28 01:00:00 (Sun)
  61252070400, #    local_end 1942-01-01 00:00:00 (Thu)
  -21600,
  0,
  'CST',
      ],
      [
  61252092000, #    utc_start 1942-01-01 06:00:00 (Thu)
  61255468800, #      utc_end 1942-02-09 08:00:00 (Mon)
  61252070400, #  local_start 1942-01-01 00:00:00 (Thu)
  61255447200, #    local_end 1942-02-09 02:00:00 (Mon)
  -21600,
  0,
  'CST',
      ],
      [
  61255468800, #    utc_start 1942-02-09 08:00:00 (Mon)
  61366287600, #      utc_end 1945-08-14 23:00:00 (Tue)
  61255450800, #  local_start 1942-02-09 03:00:00 (Mon)
  61366269600, #    local_end 1945-08-14 18:00:00 (Tue)
  -18000,
  1,
  'CWT',
      ],
      [
  61366287600, #    utc_start 1945-08-14 23:00:00 (Tue)
  61370290800, #      utc_end 1945-09-30 07:00:00 (Sun)
  61366269600, #  local_start 1945-08-14 18:00:00 (Tue)
  61370272800, #    local_end 1945-09-30 02:00:00 (Sun)
  -18000,
  1,
  'CPT',
      ],
      [
  61370290800, #    utc_start 1945-09-30 07:00:00 (Sun)
  61378322400, #      utc_end 1946-01-01 06:00:00 (Tue)
  61370269200, #  local_start 1945-09-30 01:00:00 (Sun)
  61378300800, #    local_end 1946-01-01 00:00:00 (Tue)
  -21600,
  0,
  'CST',
      ],
      [
  61378322400, #    utc_start 1946-01-01 06:00:00 (Tue)
  61391458800, #      utc_end 1946-06-02 07:00:00 (Sun)
  61378304400, #  local_start 1946-01-01 01:00:00 (Tue)
  61391440800, #    local_end 1946-06-02 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61391458800, #    utc_start 1946-06-02 07:00:00 (Sun)
  61419888000, #      utc_end 1947-04-27 08:00:00 (Sun)
  61391437200, #  local_start 1946-06-02 01:00:00 (Sun)
  61419866400, #    local_end 1947-04-27 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61419888000, #    utc_start 1947-04-27 08:00:00 (Sun)
  61527538800, #      utc_end 1950-09-24 07:00:00 (Sun)
  61419870000, #  local_start 1947-04-27 03:00:00 (Sun)
  61527520800, #    local_end 1950-09-24 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61527538800, #    utc_start 1950-09-24 07:00:00 (Sun)
  61546291200, #      utc_end 1951-04-29 08:00:00 (Sun)
  61527517200, #  local_start 1950-09-24 01:00:00 (Sun)
  61546269600, #    local_end 1951-04-29 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61546291200, #    utc_start 1951-04-29 08:00:00 (Sun)
  61559593200, #      utc_end 1951-09-30 07:00:00 (Sun)
  61546273200, #  local_start 1951-04-29 03:00:00 (Sun)
  61559575200, #    local_end 1951-09-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61559593200, #    utc_start 1951-09-30 07:00:00 (Sun)
  61577740800, #      utc_end 1952-04-27 08:00:00 (Sun)
  61559571600, #  local_start 1951-09-30 01:00:00 (Sun)
  61577719200, #    local_end 1952-04-27 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61577740800, #    utc_start 1952-04-27 08:00:00 (Sun)
  61591042800, #      utc_end 1952-09-28 07:00:00 (Sun)
  61577722800, #  local_start 1952-04-27 03:00:00 (Sun)
  61591024800, #    local_end 1952-09-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61591042800, #    utc_start 1952-09-28 07:00:00 (Sun)
  61609190400, #      utc_end 1953-04-26 08:00:00 (Sun)
  61591021200, #  local_start 1952-09-28 01:00:00 (Sun)
  61609168800, #    local_end 1953-04-26 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61609190400, #    utc_start 1953-04-26 08:00:00 (Sun)
  61622492400, #      utc_end 1953-09-27 07:00:00 (Sun)
  61609172400, #  local_start 1953-04-26 03:00:00 (Sun)
  61622474400, #    local_end 1953-09-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61622492400, #    utc_start 1953-09-27 07:00:00 (Sun)
  61640640000, #      utc_end 1954-04-25 08:00:00 (Sun)
  61622470800, #  local_start 1953-09-27 01:00:00 (Sun)
  61640618400, #    local_end 1954-04-25 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61640640000, #    utc_start 1954-04-25 08:00:00 (Sun)
  61653942000, #      utc_end 1954-09-26 07:00:00 (Sun)
  61640622000, #  local_start 1954-04-25 03:00:00 (Sun)
  61653924000, #    local_end 1954-09-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61653942000, #    utc_start 1954-09-26 07:00:00 (Sun)
  61672089600, #      utc_end 1955-04-24 08:00:00 (Sun)
  61653920400, #  local_start 1954-09-26 01:00:00 (Sun)
  61672068000, #    local_end 1955-04-24 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61672089600, #    utc_start 1955-04-24 08:00:00 (Sun)
  61685391600, #      utc_end 1955-09-25 07:00:00 (Sun)
  61672071600, #  local_start 1955-04-24 03:00:00 (Sun)
  61685373600, #    local_end 1955-09-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61685391600, #    utc_start 1955-09-25 07:00:00 (Sun)
  61704144000, #      utc_end 1956-04-29 08:00:00 (Sun)
  61685370000, #  local_start 1955-09-25 01:00:00 (Sun)
  61704122400, #    local_end 1956-04-29 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61704144000, #    utc_start 1956-04-29 08:00:00 (Sun)
  61719865200, #      utc_end 1956-10-28 07:00:00 (Sun)
  61704126000, #  local_start 1956-04-29 03:00:00 (Sun)
  61719847200, #    local_end 1956-10-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61719865200, #    utc_start 1956-10-28 07:00:00 (Sun)
  61735593600, #      utc_end 1957-04-28 08:00:00 (Sun)
  61719843600, #  local_start 1956-10-28 01:00:00 (Sun)
  61735572000, #    local_end 1957-04-28 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61735593600, #    utc_start 1957-04-28 08:00:00 (Sun)
  61751314800, #      utc_end 1957-10-27 07:00:00 (Sun)
  61735575600, #  local_start 1957-04-28 03:00:00 (Sun)
  61751296800, #    local_end 1957-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61751314800, #    utc_start 1957-10-27 07:00:00 (Sun)
  61767043200, #      utc_end 1958-04-27 08:00:00 (Sun)
  61751293200, #  local_start 1957-10-27 01:00:00 (Sun)
  61767021600, #    local_end 1958-04-27 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61767043200, #    utc_start 1958-04-27 08:00:00 (Sun)
  61782764400, #      utc_end 1958-10-26 07:00:00 (Sun)
  61767025200, #  local_start 1958-04-27 03:00:00 (Sun)
  61782746400, #    local_end 1958-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61782764400, #    utc_start 1958-10-26 07:00:00 (Sun)
  61798492800, #      utc_end 1959-04-26 08:00:00 (Sun)
  61782742800, #  local_start 1958-10-26 01:00:00 (Sun)
  61798471200, #    local_end 1959-04-26 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61798492800, #    utc_start 1959-04-26 08:00:00 (Sun)
  61814214000, #      utc_end 1959-10-25 07:00:00 (Sun)
  61798474800, #  local_start 1959-04-26 03:00:00 (Sun)
  61814196000, #    local_end 1959-10-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61814214000, #    utc_start 1959-10-25 07:00:00 (Sun)
  61829942400, #      utc_end 1960-04-24 08:00:00 (Sun)
  61814192400, #  local_start 1959-10-25 01:00:00 (Sun)
  61829920800, #    local_end 1960-04-24 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61829942400, #    utc_start 1960-04-24 08:00:00 (Sun)
  61846268400, #      utc_end 1960-10-30 07:00:00 (Sun)
  61829924400, #  local_start 1960-04-24 03:00:00 (Sun)
  61846250400, #    local_end 1960-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61846268400, #    utc_start 1960-10-30 07:00:00 (Sun)
  61861996800, #      utc_end 1961-04-30 08:00:00 (Sun)
  61846246800, #  local_start 1960-10-30 01:00:00 (Sun)
  61861975200, #    local_end 1961-04-30 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61861996800, #    utc_start 1961-04-30 08:00:00 (Sun)
  61869250800, #      utc_end 1961-07-23 07:00:00 (Sun)
  61861978800, #  local_start 1961-04-30 03:00:00 (Sun)
  61869232800, #    local_end 1961-07-23 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61869250800, #    utc_start 1961-07-23 07:00:00 (Sun)
  62072542800, #      utc_end 1968-01-01 05:00:00 (Mon)
  61869232800, #  local_start 1961-07-23 02:00:00 (Sun)
  62072524800, #    local_end 1968-01-01 00:00:00 (Mon)
  -18000,
  0,
  'EST',
      ],
      [
  62072542800, #    utc_start 1968-01-01 05:00:00 (Mon)
  62082745200, #      utc_end 1968-04-28 07:00:00 (Sun)
  62072524800, #  local_start 1968-01-01 00:00:00 (Mon)
  62082727200, #    local_end 1968-04-28 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62082745200, #    utc_start 1968-04-28 07:00:00 (Sun)
  62098466400, #      utc_end 1968-10-27 06:00:00 (Sun)
  62082730800, #  local_start 1968-04-28 03:00:00 (Sun)
  62098452000, #    local_end 1968-10-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62098466400, #    utc_start 1968-10-27 06:00:00 (Sun)
  62114194800, #      utc_end 1969-04-27 07:00:00 (Sun)
  62098448400, #  local_start 1968-10-27 01:00:00 (Sun)
  62114176800, #    local_end 1969-04-27 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62114194800, #    utc_start 1969-04-27 07:00:00 (Sun)
  62129916000, #      utc_end 1969-10-26 06:00:00 (Sun)
  62114180400, #  local_start 1969-04-27 03:00:00 (Sun)
  62129901600, #    local_end 1969-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62129916000, #    utc_start 1969-10-26 06:00:00 (Sun)
  62145644400, #      utc_end 1970-04-26 07:00:00 (Sun)
  62129898000, #  local_start 1969-10-26 01:00:00 (Sun)
  62145626400, #    local_end 1970-04-26 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62145644400, #    utc_start 1970-04-26 07:00:00 (Sun)
  62161365600, #      utc_end 1970-10-25 06:00:00 (Sun)
  62145630000, #  local_start 1970-04-26 03:00:00 (Sun)
  62161351200, #    local_end 1970-10-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62161365600, #    utc_start 1970-10-25 06:00:00 (Sun)
  62177094000, #      utc_end 1971-04-25 07:00:00 (Sun)
  62161347600, #  local_start 1970-10-25 01:00:00 (Sun)
  62177076000, #    local_end 1971-04-25 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62177094000, #    utc_start 1971-04-25 07:00:00 (Sun)
  62193420000, #      utc_end 1971-10-31 06:00:00 (Sun)
  62177079600, #  local_start 1971-04-25 03:00:00 (Sun)
  62193405600, #    local_end 1971-10-31 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62193420000, #    utc_start 1971-10-31 06:00:00 (Sun)
  62209148400, #      utc_end 1972-04-30 07:00:00 (Sun)
  62193402000, #  local_start 1971-10-31 01:00:00 (Sun)
  62209130400, #    local_end 1972-04-30 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62209148400, #    utc_start 1972-04-30 07:00:00 (Sun)
  62224869600, #      utc_end 1972-10-29 06:00:00 (Sun)
  62209134000, #  local_start 1972-04-30 03:00:00 (Sun)
  62224855200, #    local_end 1972-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62224869600, #    utc_start 1972-10-29 06:00:00 (Sun)
  62240598000, #      utc_end 1973-04-29 07:00:00 (Sun)
  62224851600, #  local_start 1972-10-29 01:00:00 (Sun)
  62240580000, #    local_end 1973-04-29 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62240598000, #    utc_start 1973-04-29 07:00:00 (Sun)
  62256319200, #      utc_end 1973-10-28 06:00:00 (Sun)
  62240583600, #  local_start 1973-04-29 03:00:00 (Sun)
  62256304800, #    local_end 1973-10-28 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62256319200, #    utc_start 1973-10-28 06:00:00 (Sun)
  62262370800, #      utc_end 1974-01-06 07:00:00 (Sun)
  62256301200, #  local_start 1973-10-28 01:00:00 (Sun)
  62262352800, #    local_end 1974-01-06 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62262370800, #    utc_start 1974-01-06 07:00:00 (Sun)
  62287772400, #      utc_end 1974-10-27 07:00:00 (Sun)
  62262352800, #  local_start 1974-01-06 02:00:00 (Sun)
  62287754400, #    local_end 1974-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62287772400, #    utc_start 1974-10-27 07:00:00 (Sun)
  62298054000, #      utc_end 1975-02-23 07:00:00 (Sun)
  62287754400, #  local_start 1974-10-27 02:00:00 (Sun)
  62298036000, #    local_end 1975-02-23 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62298054000, #    utc_start 1975-02-23 07:00:00 (Sun)
  62319218400, #      utc_end 1975-10-26 06:00:00 (Sun)
  62298039600, #  local_start 1975-02-23 03:00:00 (Sun)
  62319204000, #    local_end 1975-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62319218400, #    utc_start 1975-10-26 06:00:00 (Sun)
  62334946800, #      utc_end 1976-04-25 07:00:00 (Sun)
  62319200400, #  local_start 1975-10-26 01:00:00 (Sun)
  62334928800, #    local_end 1976-04-25 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62334946800, #    utc_start 1976-04-25 07:00:00 (Sun)
  62351272800, #      utc_end 1976-10-31 06:00:00 (Sun)
  62334932400, #  local_start 1976-04-25 03:00:00 (Sun)
  62351258400, #    local_end 1976-10-31 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62351272800, #    utc_start 1976-10-31 06:00:00 (Sun)
  62366396400, #      utc_end 1977-04-24 07:00:00 (Sun)
  62351254800, #  local_start 1976-10-31 01:00:00 (Sun)
  62366378400, #    local_end 1977-04-24 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62366396400, #    utc_start 1977-04-24 07:00:00 (Sun)
  62382722400, #      utc_end 1977-10-30 06:00:00 (Sun)
  62366382000, #  local_start 1977-04-24 03:00:00 (Sun)
  62382708000, #    local_end 1977-10-30 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62382722400, #    utc_start 1977-10-30 06:00:00 (Sun)
  62398450800, #      utc_end 1978-04-30 07:00:00 (Sun)
  62382704400, #  local_start 1977-10-30 01:00:00 (Sun)
  62398432800, #    local_end 1978-04-30 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62398450800, #    utc_start 1978-04-30 07:00:00 (Sun)
  62414172000, #      utc_end 1978-10-29 06:00:00 (Sun)
  62398436400, #  local_start 1978-04-30 03:00:00 (Sun)
  62414157600, #    local_end 1978-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62414172000, #    utc_start 1978-10-29 06:00:00 (Sun)
  62429900400, #      utc_end 1979-04-29 07:00:00 (Sun)
  62414154000, #  local_start 1978-10-29 01:00:00 (Sun)
  62429882400, #    local_end 1979-04-29 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62429900400, #    utc_start 1979-04-29 07:00:00 (Sun)
  62445621600, #      utc_end 1979-10-28 06:00:00 (Sun)
  62429886000, #  local_start 1979-04-29 03:00:00 (Sun)
  62445607200, #    local_end 1979-10-28 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62445621600, #    utc_start 1979-10-28 06:00:00 (Sun)
  62461350000, #      utc_end 1980-04-27 07:00:00 (Sun)
  62445603600, #  local_start 1979-10-28 01:00:00 (Sun)
  62461332000, #    local_end 1980-04-27 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62461350000, #    utc_start 1980-04-27 07:00:00 (Sun)
  62477071200, #      utc_end 1980-10-26 06:00:00 (Sun)
  62461335600, #  local_start 1980-04-27 03:00:00 (Sun)
  62477056800, #    local_end 1980-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62477071200, #    utc_start 1980-10-26 06:00:00 (Sun)
  62492799600, #      utc_end 1981-04-26 07:00:00 (Sun)
  62477053200, #  local_start 1980-10-26 01:00:00 (Sun)
  62492781600, #    local_end 1981-04-26 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62492799600, #    utc_start 1981-04-26 07:00:00 (Sun)
  62508520800, #      utc_end 1981-10-25 06:00:00 (Sun)
  62492785200, #  local_start 1981-04-26 03:00:00 (Sun)
  62508506400, #    local_end 1981-10-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62508520800, #    utc_start 1981-10-25 06:00:00 (Sun)
  62524249200, #      utc_end 1982-04-25 07:00:00 (Sun)
  62508502800, #  local_start 1981-10-25 01:00:00 (Sun)
  62524231200, #    local_end 1982-04-25 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62524249200, #    utc_start 1982-04-25 07:00:00 (Sun)
  62540575200, #      utc_end 1982-10-31 06:00:00 (Sun)
  62524234800, #  local_start 1982-04-25 03:00:00 (Sun)
  62540560800, #    local_end 1982-10-31 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62540575200, #    utc_start 1982-10-31 06:00:00 (Sun)
  62555698800, #      utc_end 1983-04-24 07:00:00 (Sun)
  62540557200, #  local_start 1982-10-31 01:00:00 (Sun)
  62555680800, #    local_end 1983-04-24 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62555698800, #    utc_start 1983-04-24 07:00:00 (Sun)
  62572024800, #      utc_end 1983-10-30 06:00:00 (Sun)
  62555684400, #  local_start 1983-04-24 03:00:00 (Sun)
  62572010400, #    local_end 1983-10-30 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62572024800, #    utc_start 1983-10-30 06:00:00 (Sun)
  62587753200, #      utc_end 1984-04-29 07:00:00 (Sun)
  62572006800, #  local_start 1983-10-30 01:00:00 (Sun)
  62587735200, #    local_end 1984-04-29 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62587753200, #    utc_start 1984-04-29 07:00:00 (Sun)
  62603474400, #      utc_end 1984-10-28 06:00:00 (Sun)
  62587738800, #  local_start 1984-04-29 03:00:00 (Sun)
  62603460000, #    local_end 1984-10-28 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62603474400, #    utc_start 1984-10-28 06:00:00 (Sun)
  62619202800, #      utc_end 1985-04-28 07:00:00 (Sun)
  62603456400, #  local_start 1984-10-28 01:00:00 (Sun)
  62619184800, #    local_end 1985-04-28 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62619202800, #    utc_start 1985-04-28 07:00:00 (Sun)
  62634924000, #      utc_end 1985-10-27 06:00:00 (Sun)
  62619188400, #  local_start 1985-04-28 03:00:00 (Sun)
  62634909600, #    local_end 1985-10-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62634924000, #    utc_start 1985-10-27 06:00:00 (Sun)
  62650652400, #      utc_end 1986-04-27 07:00:00 (Sun)
  62634906000, #  local_start 1985-10-27 01:00:00 (Sun)
  62650634400, #    local_end 1986-04-27 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62650652400, #    utc_start 1986-04-27 07:00:00 (Sun)
  62666373600, #      utc_end 1986-10-26 06:00:00 (Sun)
  62650638000, #  local_start 1986-04-27 03:00:00 (Sun)
  62666359200, #    local_end 1986-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62666373600, #    utc_start 1986-10-26 06:00:00 (Sun)
  62680287600, #      utc_end 1987-04-05 07:00:00 (Sun)
  62666355600, #  local_start 1986-10-26 01:00:00 (Sun)
  62680269600, #    local_end 1987-04-05 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62680287600, #    utc_start 1987-04-05 07:00:00 (Sun)
  62697823200, #      utc_end 1987-10-25 06:00:00 (Sun)
  62680273200, #  local_start 1987-04-05 03:00:00 (Sun)
  62697808800, #    local_end 1987-10-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62697823200, #    utc_start 1987-10-25 06:00:00 (Sun)
  62711737200, #      utc_end 1988-04-03 07:00:00 (Sun)
  62697805200, #  local_start 1987-10-25 01:00:00 (Sun)
  62711719200, #    local_end 1988-04-03 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62711737200, #    utc_start 1988-04-03 07:00:00 (Sun)
  62729877600, #      utc_end 1988-10-30 06:00:00 (Sun)
  62711722800, #  local_start 1988-04-03 03:00:00 (Sun)
  62729863200, #    local_end 1988-10-30 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62729877600, #    utc_start 1988-10-30 06:00:00 (Sun)
  62743186800, #      utc_end 1989-04-02 07:00:00 (Sun)
  62729859600, #  local_start 1988-10-30 01:00:00 (Sun)
  62743168800, #    local_end 1989-04-02 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62743186800, #    utc_start 1989-04-02 07:00:00 (Sun)
  62761327200, #      utc_end 1989-10-29 06:00:00 (Sun)
  62743172400, #  local_start 1989-04-02 03:00:00 (Sun)
  62761312800, #    local_end 1989-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62761327200, #    utc_start 1989-10-29 06:00:00 (Sun)
  62774636400, #      utc_end 1990-04-01 07:00:00 (Sun)
  62761309200, #  local_start 1989-10-29 01:00:00 (Sun)
  62774618400, #    local_end 1990-04-01 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62774636400, #    utc_start 1990-04-01 07:00:00 (Sun)
  62792776800, #      utc_end 1990-10-28 06:00:00 (Sun)
  62774622000, #  local_start 1990-04-01 03:00:00 (Sun)
  62792762400, #    local_end 1990-10-28 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62792776800, #    utc_start 1990-10-28 06:00:00 (Sun)
  62806690800, #      utc_end 1991-04-07 07:00:00 (Sun)
  62792758800, #  local_start 1990-10-28 01:00:00 (Sun)
  62806672800, #    local_end 1991-04-07 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62806690800, #    utc_start 1991-04-07 07:00:00 (Sun)
  62824226400, #      utc_end 1991-10-27 06:00:00 (Sun)
  62806676400, #  local_start 1991-04-07 03:00:00 (Sun)
  62824212000, #    local_end 1991-10-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62824226400, #    utc_start 1991-10-27 06:00:00 (Sun)
  62838140400, #      utc_end 1992-04-05 07:00:00 (Sun)
  62824208400, #  local_start 1991-10-27 01:00:00 (Sun)
  62838122400, #    local_end 1992-04-05 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62838140400, #    utc_start 1992-04-05 07:00:00 (Sun)
  62855676000, #      utc_end 1992-10-25 06:00:00 (Sun)
  62838126000, #  local_start 1992-04-05 03:00:00 (Sun)
  62855661600, #    local_end 1992-10-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62855676000, #    utc_start 1992-10-25 06:00:00 (Sun)
  62869590000, #      utc_end 1993-04-04 07:00:00 (Sun)
  62855658000, #  local_start 1992-10-25 01:00:00 (Sun)
  62869572000, #    local_end 1993-04-04 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62869590000, #    utc_start 1993-04-04 07:00:00 (Sun)
  62887730400, #      utc_end 1993-10-31 06:00:00 (Sun)
  62869575600, #  local_start 1993-04-04 03:00:00 (Sun)
  62887716000, #    local_end 1993-10-31 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62887730400, #    utc_start 1993-10-31 06:00:00 (Sun)
  62901039600, #      utc_end 1994-04-03 07:00:00 (Sun)
  62887712400, #  local_start 1993-10-31 01:00:00 (Sun)
  62901021600, #    local_end 1994-04-03 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62901039600, #    utc_start 1994-04-03 07:00:00 (Sun)
  62919180000, #      utc_end 1994-10-30 06:00:00 (Sun)
  62901025200, #  local_start 1994-04-03 03:00:00 (Sun)
  62919165600, #    local_end 1994-10-30 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62919180000, #    utc_start 1994-10-30 06:00:00 (Sun)
  62932489200, #      utc_end 1995-04-02 07:00:00 (Sun)
  62919162000, #  local_start 1994-10-30 01:00:00 (Sun)
  62932471200, #    local_end 1995-04-02 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62932489200, #    utc_start 1995-04-02 07:00:00 (Sun)
  62950629600, #      utc_end 1995-10-29 06:00:00 (Sun)
  62932474800, #  local_start 1995-04-02 03:00:00 (Sun)
  62950615200, #    local_end 1995-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62950629600, #    utc_start 1995-10-29 06:00:00 (Sun)
  62964543600, #      utc_end 1996-04-07 07:00:00 (Sun)
  62950611600, #  local_start 1995-10-29 01:00:00 (Sun)
  62964525600, #    local_end 1996-04-07 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62964543600, #    utc_start 1996-04-07 07:00:00 (Sun)
  62982079200, #      utc_end 1996-10-27 06:00:00 (Sun)
  62964529200, #  local_start 1996-04-07 03:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62982079200, #    utc_start 1996-10-27 06:00:00 (Sun)
  62995993200, #      utc_end 1997-04-06 07:00:00 (Sun)
  62982061200, #  local_start 1996-10-27 01:00:00 (Sun)
  62995975200, #    local_end 1997-04-06 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62995993200, #    utc_start 1997-04-06 07:00:00 (Sun)
  63013528800, #      utc_end 1997-10-26 06:00:00 (Sun)
  62995978800, #  local_start 1997-04-06 03:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63013528800, #    utc_start 1997-10-26 06:00:00 (Sun)
  63027442800, #      utc_end 1998-04-05 07:00:00 (Sun)
  63013510800, #  local_start 1997-10-26 01:00:00 (Sun)
  63027424800, #    local_end 1998-04-05 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63027442800, #    utc_start 1998-04-05 07:00:00 (Sun)
  63044978400, #      utc_end 1998-10-25 06:00:00 (Sun)
  63027428400, #  local_start 1998-04-05 03:00:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63044978400, #    utc_start 1998-10-25 06:00:00 (Sun)
  63058892400, #      utc_end 1999-04-04 07:00:00 (Sun)
  63044960400, #  local_start 1998-10-25 01:00:00 (Sun)
  63058874400, #    local_end 1999-04-04 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63058892400, #    utc_start 1999-04-04 07:00:00 (Sun)
  63077032800, #      utc_end 1999-10-31 06:00:00 (Sun)
  63058878000, #  local_start 1999-04-04 03:00:00 (Sun)
  63077018400, #    local_end 1999-10-31 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63077032800, #    utc_start 1999-10-31 06:00:00 (Sun)
  63090342000, #      utc_end 2000-04-02 07:00:00 (Sun)
  63077014800, #  local_start 1999-10-31 01:00:00 (Sun)
  63090324000, #    local_end 2000-04-02 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63090342000, #    utc_start 2000-04-02 07:00:00 (Sun)
  63108482400, #      utc_end 2000-10-29 06:00:00 (Sun)
  63090327600, #  local_start 2000-04-02 03:00:00 (Sun)
  63108468000, #    local_end 2000-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63108482400, #    utc_start 2000-10-29 06:00:00 (Sun)
  63121791600, #      utc_end 2001-04-01 07:00:00 (Sun)
  63108464400, #  local_start 2000-10-29 01:00:00 (Sun)
  63121773600, #    local_end 2001-04-01 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63121791600, #    utc_start 2001-04-01 07:00:00 (Sun)
  63139932000, #      utc_end 2001-10-28 06:00:00 (Sun)
  63121777200, #  local_start 2001-04-01 03:00:00 (Sun)
  63139917600, #    local_end 2001-10-28 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63139932000, #    utc_start 2001-10-28 06:00:00 (Sun)
  63153846000, #      utc_end 2002-04-07 07:00:00 (Sun)
  63139914000, #  local_start 2001-10-28 01:00:00 (Sun)
  63153828000, #    local_end 2002-04-07 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63153846000, #    utc_start 2002-04-07 07:00:00 (Sun)
  63171381600, #      utc_end 2002-10-27 06:00:00 (Sun)
  63153831600, #  local_start 2002-04-07 03:00:00 (Sun)
  63171367200, #    local_end 2002-10-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63171381600, #    utc_start 2002-10-27 06:00:00 (Sun)
  63185295600, #      utc_end 2003-04-06 07:00:00 (Sun)
  63171363600, #  local_start 2002-10-27 01:00:00 (Sun)
  63185277600, #    local_end 2003-04-06 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63185295600, #    utc_start 2003-04-06 07:00:00 (Sun)
  63202831200, #      utc_end 2003-10-26 06:00:00 (Sun)
  63185281200, #  local_start 2003-04-06 03:00:00 (Sun)
  63202816800, #    local_end 2003-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63202831200, #    utc_start 2003-10-26 06:00:00 (Sun)
  63216745200, #      utc_end 2004-04-04 07:00:00 (Sun)
  63202813200, #  local_start 2003-10-26 01:00:00 (Sun)
  63216727200, #    local_end 2004-04-04 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63216745200, #    utc_start 2004-04-04 07:00:00 (Sun)
  63234885600, #      utc_end 2004-10-31 06:00:00 (Sun)
  63216730800, #  local_start 2004-04-04 03:00:00 (Sun)
  63234871200, #    local_end 2004-10-31 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63234885600, #    utc_start 2004-10-31 06:00:00 (Sun)
  63248194800, #      utc_end 2005-04-03 07:00:00 (Sun)
  63234867600, #  local_start 2004-10-31 01:00:00 (Sun)
  63248176800, #    local_end 2005-04-03 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63248194800, #    utc_start 2005-04-03 07:00:00 (Sun)
  63266335200, #      utc_end 2005-10-30 06:00:00 (Sun)
  63248180400, #  local_start 2005-04-03 03:00:00 (Sun)
  63266320800, #    local_end 2005-10-30 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63266335200, #    utc_start 2005-10-30 06:00:00 (Sun)
  63279644400, #      utc_end 2006-04-02 07:00:00 (Sun)
  63266317200, #  local_start 2005-10-30 01:00:00 (Sun)
  63279626400, #    local_end 2006-04-02 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63279644400, #    utc_start 2006-04-02 07:00:00 (Sun)
  63297784800, #      utc_end 2006-10-29 06:00:00 (Sun)
  63279630000, #  local_start 2006-04-02 03:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63297784800, #    utc_start 2006-10-29 06:00:00 (Sun)
  63309279600, #      utc_end 2007-03-11 07:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63309261600, #    local_end 2007-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63309279600, #    utc_start 2007-03-11 07:00:00 (Sun)
  63329839200, #      utc_end 2007-11-04 06:00:00 (Sun)
  63309265200, #  local_start 2007-03-11 03:00:00 (Sun)
  63329824800, #    local_end 2007-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63329839200, #    utc_start 2007-11-04 06:00:00 (Sun)
  63340729200, #      utc_end 2008-03-09 07:00:00 (Sun)
  63329821200, #  local_start 2007-11-04 01:00:00 (Sun)
  63340711200, #    local_end 2008-03-09 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63340729200, #    utc_start 2008-03-09 07:00:00 (Sun)
  63361288800, #      utc_end 2008-11-02 06:00:00 (Sun)
  63340714800, #  local_start 2008-03-09 03:00:00 (Sun)
  63361274400, #    local_end 2008-11-02 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63361288800, #    utc_start 2008-11-02 06:00:00 (Sun)
  63372178800, #      utc_end 2009-03-08 07:00:00 (Sun)
  63361270800, #  local_start 2008-11-02 01:00:00 (Sun)
  63372160800, #    local_end 2009-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63372178800, #    utc_start 2009-03-08 07:00:00 (Sun)
  63392738400, #      utc_end 2009-11-01 06:00:00 (Sun)
  63372164400, #  local_start 2009-03-08 03:00:00 (Sun)
  63392724000, #    local_end 2009-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63392738400, #    utc_start 2009-11-01 06:00:00 (Sun)
  63404233200, #      utc_end 2010-03-14 07:00:00 (Sun)
  63392720400, #  local_start 2009-11-01 01:00:00 (Sun)
  63404215200, #    local_end 2010-03-14 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63404233200, #    utc_start 2010-03-14 07:00:00 (Sun)
  63424792800, #      utc_end 2010-11-07 06:00:00 (Sun)
  63404218800, #  local_start 2010-03-14 03:00:00 (Sun)
  63424778400, #    local_end 2010-11-07 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63424792800, #    utc_start 2010-11-07 06:00:00 (Sun)
  63435682800, #      utc_end 2011-03-13 07:00:00 (Sun)
  63424774800, #  local_start 2010-11-07 01:00:00 (Sun)
  63435664800, #    local_end 2011-03-13 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63435682800, #    utc_start 2011-03-13 07:00:00 (Sun)
  63456242400, #      utc_end 2011-11-06 06:00:00 (Sun)
  63435668400, #  local_start 2011-03-13 03:00:00 (Sun)
  63456228000, #    local_end 2011-11-06 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63456242400, #    utc_start 2011-11-06 06:00:00 (Sun)
  63467132400, #      utc_end 2012-03-11 07:00:00 (Sun)
  63456224400, #  local_start 2011-11-06 01:00:00 (Sun)
  63467114400, #    local_end 2012-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63467132400, #    utc_start 2012-03-11 07:00:00 (Sun)
  63487692000, #      utc_end 2012-11-04 06:00:00 (Sun)
  63467118000, #  local_start 2012-03-11 03:00:00 (Sun)
  63487677600, #    local_end 2012-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63487692000, #    utc_start 2012-11-04 06:00:00 (Sun)
  63498582000, #      utc_end 2013-03-10 07:00:00 (Sun)
  63487674000, #  local_start 2012-11-04 01:00:00 (Sun)
  63498564000, #    local_end 2013-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63498582000, #    utc_start 2013-03-10 07:00:00 (Sun)
  63519141600, #      utc_end 2013-11-03 06:00:00 (Sun)
  63498567600, #  local_start 2013-03-10 03:00:00 (Sun)
  63519127200, #    local_end 2013-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63519141600, #    utc_start 2013-11-03 06:00:00 (Sun)
  63530031600, #      utc_end 2014-03-09 07:00:00 (Sun)
  63519123600, #  local_start 2013-11-03 01:00:00 (Sun)
  63530013600, #    local_end 2014-03-09 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63530031600, #    utc_start 2014-03-09 07:00:00 (Sun)
  63550591200, #      utc_end 2014-11-02 06:00:00 (Sun)
  63530017200, #  local_start 2014-03-09 03:00:00 (Sun)
  63550576800, #    local_end 2014-11-02 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63550591200, #    utc_start 2014-11-02 06:00:00 (Sun)
  63561481200, #      utc_end 2015-03-08 07:00:00 (Sun)
  63550573200, #  local_start 2014-11-02 01:00:00 (Sun)
  63561463200, #    local_end 2015-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63561481200, #    utc_start 2015-03-08 07:00:00 (Sun)
  63582040800, #      utc_end 2015-11-01 06:00:00 (Sun)
  63561466800, #  local_start 2015-03-08 03:00:00 (Sun)
  63582026400, #    local_end 2015-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63582040800, #    utc_start 2015-11-01 06:00:00 (Sun)
  63593535600, #      utc_end 2016-03-13 07:00:00 (Sun)
  63582022800, #  local_start 2015-11-01 01:00:00 (Sun)
  63593517600, #    local_end 2016-03-13 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63593535600, #    utc_start 2016-03-13 07:00:00 (Sun)
  63614095200, #      utc_end 2016-11-06 06:00:00 (Sun)
  63593521200, #  local_start 2016-03-13 03:00:00 (Sun)
  63614080800, #    local_end 2016-11-06 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63614095200, #    utc_start 2016-11-06 06:00:00 (Sun)
  63624985200, #      utc_end 2017-03-12 07:00:00 (Sun)
  63614077200, #  local_start 2016-11-06 01:00:00 (Sun)
  63624967200, #    local_end 2017-03-12 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63624985200, #    utc_start 2017-03-12 07:00:00 (Sun)
  63645544800, #      utc_end 2017-11-05 06:00:00 (Sun)
  63624970800, #  local_start 2017-03-12 03:00:00 (Sun)
  63645530400, #    local_end 2017-11-05 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63645544800, #    utc_start 2017-11-05 06:00:00 (Sun)
  63656434800, #      utc_end 2018-03-11 07:00:00 (Sun)
  63645526800, #  local_start 2017-11-05 01:00:00 (Sun)
  63656416800, #    local_end 2018-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63656434800, #    utc_start 2018-03-11 07:00:00 (Sun)
  63676994400, #      utc_end 2018-11-04 06:00:00 (Sun)
  63656420400, #  local_start 2018-03-11 03:00:00 (Sun)
  63676980000, #    local_end 2018-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63676994400, #    utc_start 2018-11-04 06:00:00 (Sun)
  63687884400, #      utc_end 2019-03-10 07:00:00 (Sun)
  63676976400, #  local_start 2018-11-04 01:00:00 (Sun)
  63687866400, #    local_end 2019-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63687884400, #    utc_start 2019-03-10 07:00:00 (Sun)
  63708444000, #      utc_end 2019-11-03 06:00:00 (Sun)
  63687870000, #  local_start 2019-03-10 03:00:00 (Sun)
  63708429600, #    local_end 2019-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63708444000, #    utc_start 2019-11-03 06:00:00 (Sun)
  63719334000, #      utc_end 2020-03-08 07:00:00 (Sun)
  63708426000, #  local_start 2019-11-03 01:00:00 (Sun)
  63719316000, #    local_end 2020-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63719334000, #    utc_start 2020-03-08 07:00:00 (Sun)
  63739893600, #      utc_end 2020-11-01 06:00:00 (Sun)
  63719319600, #  local_start 2020-03-08 03:00:00 (Sun)
  63739879200, #    local_end 2020-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63739893600, #    utc_start 2020-11-01 06:00:00 (Sun)
  63751388400, #      utc_end 2021-03-14 07:00:00 (Sun)
  63739875600, #  local_start 2020-11-01 01:00:00 (Sun)
  63751370400, #    local_end 2021-03-14 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63751388400, #    utc_start 2021-03-14 07:00:00 (Sun)
  63771948000, #      utc_end 2021-11-07 06:00:00 (Sun)
  63751374000, #  local_start 2021-03-14 03:00:00 (Sun)
  63771933600, #    local_end 2021-11-07 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63771948000, #    utc_start 2021-11-07 06:00:00 (Sun)
  63782838000, #      utc_end 2022-03-13 07:00:00 (Sun)
  63771930000, #  local_start 2021-11-07 01:00:00 (Sun)
  63782820000, #    local_end 2022-03-13 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63782838000, #    utc_start 2022-03-13 07:00:00 (Sun)
  63803397600, #      utc_end 2022-11-06 06:00:00 (Sun)
  63782823600, #  local_start 2022-03-13 03:00:00 (Sun)
  63803383200, #    local_end 2022-11-06 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63803397600, #    utc_start 2022-11-06 06:00:00 (Sun)
  63814287600, #      utc_end 2023-03-12 07:00:00 (Sun)
  63803379600, #  local_start 2022-11-06 01:00:00 (Sun)
  63814269600, #    local_end 2023-03-12 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63814287600, #    utc_start 2023-03-12 07:00:00 (Sun)
  63834847200, #      utc_end 2023-11-05 06:00:00 (Sun)
  63814273200, #  local_start 2023-03-12 03:00:00 (Sun)
  63834832800, #    local_end 2023-11-05 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63834847200, #    utc_start 2023-11-05 06:00:00 (Sun)
  63845737200, #      utc_end 2024-03-10 07:00:00 (Sun)
  63834829200, #  local_start 2023-11-05 01:00:00 (Sun)
  63845719200, #    local_end 2024-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63845737200, #    utc_start 2024-03-10 07:00:00 (Sun)
  63866296800, #      utc_end 2024-11-03 06:00:00 (Sun)
  63845722800, #  local_start 2024-03-10 03:00:00 (Sun)
  63866282400, #    local_end 2024-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63866296800, #    utc_start 2024-11-03 06:00:00 (Sun)
  63877186800, #      utc_end 2025-03-09 07:00:00 (Sun)
  63866278800, #  local_start 2024-11-03 01:00:00 (Sun)
  63877168800, #    local_end 2025-03-09 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63877186800, #    utc_start 2025-03-09 07:00:00 (Sun)
  63897746400, #      utc_end 2025-11-02 06:00:00 (Sun)
  63877172400, #  local_start 2025-03-09 03:00:00 (Sun)
  63897732000, #    local_end 2025-11-02 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63897746400, #    utc_start 2025-11-02 06:00:00 (Sun)
  63908636400, #      utc_end 2026-03-08 07:00:00 (Sun)
  63897728400, #  local_start 2025-11-02 01:00:00 (Sun)
  63908618400, #    local_end 2026-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63908636400, #    utc_start 2026-03-08 07:00:00 (Sun)
  63929196000, #      utc_end 2026-11-01 06:00:00 (Sun)
  63908622000, #  local_start 2026-03-08 03:00:00 (Sun)
  63929181600, #    local_end 2026-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63929196000, #    utc_start 2026-11-01 06:00:00 (Sun)
  63940690800, #      utc_end 2027-03-14 07:00:00 (Sun)
  63929178000, #  local_start 2026-11-01 01:00:00 (Sun)
  63940672800, #    local_end 2027-03-14 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63940690800, #    utc_start 2027-03-14 07:00:00 (Sun)
  63961250400, #      utc_end 2027-11-07 06:00:00 (Sun)
  63940676400, #  local_start 2027-03-14 03:00:00 (Sun)
  63961236000, #    local_end 2027-11-07 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63961250400, #    utc_start 2027-11-07 06:00:00 (Sun)
  63972140400, #      utc_end 2028-03-12 07:00:00 (Sun)
  63961232400, #  local_start 2027-11-07 01:00:00 (Sun)
  63972122400, #    local_end 2028-03-12 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63972140400, #    utc_start 2028-03-12 07:00:00 (Sun)
  63992700000, #      utc_end 2028-11-05 06:00:00 (Sun)
  63972126000, #  local_start 2028-03-12 03:00:00 (Sun)
  63992685600, #    local_end 2028-11-05 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63992700000, #    utc_start 2028-11-05 06:00:00 (Sun)
  64003590000, #      utc_end 2029-03-11 07:00:00 (Sun)
  63992682000, #  local_start 2028-11-05 01:00:00 (Sun)
  64003572000, #    local_end 2029-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  64003590000, #    utc_start 2029-03-11 07:00:00 (Sun)
  64024149600, #      utc_end 2029-11-04 06:00:00 (Sun)
  64003575600, #  local_start 2029-03-11 03:00:00 (Sun)
  64024135200, #    local_end 2029-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  64024149600, #    utc_start 2029-11-04 06:00:00 (Sun)
  64035039600, #      utc_end 2030-03-10 07:00:00 (Sun)
  64024131600, #  local_start 2029-11-04 01:00:00 (Sun)
  64035021600, #    local_end 2030-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  64035039600, #    utc_start 2030-03-10 07:00:00 (Sun)
  64055599200, #      utc_end 2030-11-03 06:00:00 (Sun)
  64035025200, #  local_start 2030-03-10 03:00:00 (Sun)
  64055584800, #    local_end 2030-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {82}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -18000 }
  
  my $last_observance = bless( {
    'format' => 'E%sT',
    'gmtoff' => '-5:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 720923,
      'local_rd_secs' => 7200,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 720923,
      'utc_rd_secs' => 7200,
      'utc_year' => 1975
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -18000,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 720923,
      'local_rd_secs' => 25200,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 720923,
      'utc_rd_secs' => 25200,
      'utc_year' => 1975
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Nov',
      'letter' => 'S',
      'name' => 'US',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Mar',
      'letter' => 'D',
      'name' => 'US',
      'offset_from_std' => 3600,
      'on' => 'Sun>=8',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_KENTUCKY_LOUISVILLE

    $main::fatpacked{"DateTime/TimeZone/America/Kentucky/Monticello.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_KENTUCKY_MONTICELLO';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Kentucky::Monticello;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Kentucky::Monticello::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59418036000, #      utc_end 1883-11-18 18:00:00 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59418015636, #    local_end 1883-11-18 12:20:36 (Sun)
  -20364,
  0,
  'LMT',
      ],
      [
  59418036000, #    utc_start 1883-11-18 18:00:00 (Sun)
  60502406400, #      utc_end 1918-03-31 08:00:00 (Sun)
  59418014400, #  local_start 1883-11-18 12:00:00 (Sun)
  60502384800, #    local_end 1918-03-31 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  60502406400, #    utc_start 1918-03-31 08:00:00 (Sun)
  60520546800, #      utc_end 1918-10-27 07:00:00 (Sun)
  60502388400, #  local_start 1918-03-31 03:00:00 (Sun)
  60520528800, #    local_end 1918-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  60520546800, #    utc_start 1918-10-27 07:00:00 (Sun)
  60533856000, #      utc_end 1919-03-30 08:00:00 (Sun)
  60520525200, #  local_start 1918-10-27 01:00:00 (Sun)
  60533834400, #    local_end 1919-03-30 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  60533856000, #    utc_start 1919-03-30 08:00:00 (Sun)
  60551996400, #      utc_end 1919-10-26 07:00:00 (Sun)
  60533838000, #  local_start 1919-03-30 03:00:00 (Sun)
  60551978400, #    local_end 1919-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  60551996400, #    utc_start 1919-10-26 07:00:00 (Sun)
  61255468800, #      utc_end 1942-02-09 08:00:00 (Mon)
  60551974800, #  local_start 1919-10-26 01:00:00 (Sun)
  61255447200, #    local_end 1942-02-09 02:00:00 (Mon)
  -21600,
  0,
  'CST',
      ],
      [
  61255468800, #    utc_start 1942-02-09 08:00:00 (Mon)
  61366287600, #      utc_end 1945-08-14 23:00:00 (Tue)
  61255450800, #  local_start 1942-02-09 03:00:00 (Mon)
  61366269600, #    local_end 1945-08-14 18:00:00 (Tue)
  -18000,
  1,
  'CWT',
      ],
      [
  61366287600, #    utc_start 1945-08-14 23:00:00 (Tue)
  61370290800, #      utc_end 1945-09-30 07:00:00 (Sun)
  61366269600, #  local_start 1945-08-14 18:00:00 (Tue)
  61370272800, #    local_end 1945-09-30 02:00:00 (Sun)
  -18000,
  1,
  'CPT',
      ],
      [
  61370290800, #    utc_start 1945-09-30 07:00:00 (Sun)
  61378322400, #      utc_end 1946-01-01 06:00:00 (Tue)
  61370269200, #  local_start 1945-09-30 01:00:00 (Sun)
  61378300800, #    local_end 1946-01-01 00:00:00 (Tue)
  -21600,
  0,
  'CST',
      ],
      [
  61378322400, #    utc_start 1946-01-01 06:00:00 (Tue)
  62072546400, #      utc_end 1968-01-01 06:00:00 (Mon)
  61378300800, #  local_start 1946-01-01 00:00:00 (Tue)
  62072524800, #    local_end 1968-01-01 00:00:00 (Mon)
  -21600,
  0,
  'CST',
      ],
      [
  62072546400, #    utc_start 1968-01-01 06:00:00 (Mon)
  62082748800, #      utc_end 1968-04-28 08:00:00 (Sun)
  62072524800, #  local_start 1968-01-01 00:00:00 (Mon)
  62082727200, #    local_end 1968-04-28 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62082748800, #    utc_start 1968-04-28 08:00:00 (Sun)
  62098470000, #      utc_end 1968-10-27 07:00:00 (Sun)
  62082730800, #  local_start 1968-04-28 03:00:00 (Sun)
  62098452000, #    local_end 1968-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62098470000, #    utc_start 1968-10-27 07:00:00 (Sun)
  62114198400, #      utc_end 1969-04-27 08:00:00 (Sun)
  62098448400, #  local_start 1968-10-27 01:00:00 (Sun)
  62114176800, #    local_end 1969-04-27 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62114198400, #    utc_start 1969-04-27 08:00:00 (Sun)
  62129919600, #      utc_end 1969-10-26 07:00:00 (Sun)
  62114180400, #  local_start 1969-04-27 03:00:00 (Sun)
  62129901600, #    local_end 1969-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62129919600, #    utc_start 1969-10-26 07:00:00 (Sun)
  62145648000, #      utc_end 1970-04-26 08:00:00 (Sun)
  62129898000, #  local_start 1969-10-26 01:00:00 (Sun)
  62145626400, #    local_end 1970-04-26 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62145648000, #    utc_start 1970-04-26 08:00:00 (Sun)
  62161369200, #      utc_end 1970-10-25 07:00:00 (Sun)
  62145630000, #  local_start 1970-04-26 03:00:00 (Sun)
  62161351200, #    local_end 1970-10-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62161369200, #    utc_start 1970-10-25 07:00:00 (Sun)
  62177097600, #      utc_end 1971-04-25 08:00:00 (Sun)
  62161347600, #  local_start 1970-10-25 01:00:00 (Sun)
  62177076000, #    local_end 1971-04-25 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62177097600, #    utc_start 1971-04-25 08:00:00 (Sun)
  62193423600, #      utc_end 1971-10-31 07:00:00 (Sun)
  62177079600, #  local_start 1971-04-25 03:00:00 (Sun)
  62193405600, #    local_end 1971-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62193423600, #    utc_start 1971-10-31 07:00:00 (Sun)
  62209152000, #      utc_end 1972-04-30 08:00:00 (Sun)
  62193402000, #  local_start 1971-10-31 01:00:00 (Sun)
  62209130400, #    local_end 1972-04-30 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62209152000, #    utc_start 1972-04-30 08:00:00 (Sun)
  62224873200, #      utc_end 1972-10-29 07:00:00 (Sun)
  62209134000, #  local_start 1972-04-30 03:00:00 (Sun)
  62224855200, #    local_end 1972-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62224873200, #    utc_start 1972-10-29 07:00:00 (Sun)
  62240601600, #      utc_end 1973-04-29 08:00:00 (Sun)
  62224851600, #  local_start 1972-10-29 01:00:00 (Sun)
  62240580000, #    local_end 1973-04-29 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62240601600, #    utc_start 1973-04-29 08:00:00 (Sun)
  62256322800, #      utc_end 1973-10-28 07:00:00 (Sun)
  62240583600, #  local_start 1973-04-29 03:00:00 (Sun)
  62256304800, #    local_end 1973-10-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62256322800, #    utc_start 1973-10-28 07:00:00 (Sun)
  62262374400, #      utc_end 1974-01-06 08:00:00 (Sun)
  62256301200, #  local_start 1973-10-28 01:00:00 (Sun)
  62262352800, #    local_end 1974-01-06 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62262374400, #    utc_start 1974-01-06 08:00:00 (Sun)
  62287772400, #      utc_end 1974-10-27 07:00:00 (Sun)
  62262356400, #  local_start 1974-01-06 03:00:00 (Sun)
  62287754400, #    local_end 1974-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62287772400, #    utc_start 1974-10-27 07:00:00 (Sun)
  62298057600, #      utc_end 1975-02-23 08:00:00 (Sun)
  62287750800, #  local_start 1974-10-27 01:00:00 (Sun)
  62298036000, #    local_end 1975-02-23 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62298057600, #    utc_start 1975-02-23 08:00:00 (Sun)
  62319222000, #      utc_end 1975-10-26 07:00:00 (Sun)
  62298039600, #  local_start 1975-02-23 03:00:00 (Sun)
  62319204000, #    local_end 1975-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62319222000, #    utc_start 1975-10-26 07:00:00 (Sun)
  62334950400, #      utc_end 1976-04-25 08:00:00 (Sun)
  62319200400, #  local_start 1975-10-26 01:00:00 (Sun)
  62334928800, #    local_end 1976-04-25 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62334950400, #    utc_start 1976-04-25 08:00:00 (Sun)
  62351276400, #      utc_end 1976-10-31 07:00:00 (Sun)
  62334932400, #  local_start 1976-04-25 03:00:00 (Sun)
  62351258400, #    local_end 1976-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62351276400, #    utc_start 1976-10-31 07:00:00 (Sun)
  62366400000, #      utc_end 1977-04-24 08:00:00 (Sun)
  62351254800, #  local_start 1976-10-31 01:00:00 (Sun)
  62366378400, #    local_end 1977-04-24 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62366400000, #    utc_start 1977-04-24 08:00:00 (Sun)
  62382726000, #      utc_end 1977-10-30 07:00:00 (Sun)
  62366382000, #  local_start 1977-04-24 03:00:00 (Sun)
  62382708000, #    local_end 1977-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62382726000, #    utc_start 1977-10-30 07:00:00 (Sun)
  62398454400, #      utc_end 1978-04-30 08:00:00 (Sun)
  62382704400, #  local_start 1977-10-30 01:00:00 (Sun)
  62398432800, #    local_end 1978-04-30 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62398454400, #    utc_start 1978-04-30 08:00:00 (Sun)
  62414175600, #      utc_end 1978-10-29 07:00:00 (Sun)
  62398436400, #  local_start 1978-04-30 03:00:00 (Sun)
  62414157600, #    local_end 1978-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62414175600, #    utc_start 1978-10-29 07:00:00 (Sun)
  62429904000, #      utc_end 1979-04-29 08:00:00 (Sun)
  62414154000, #  local_start 1978-10-29 01:00:00 (Sun)
  62429882400, #    local_end 1979-04-29 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62429904000, #    utc_start 1979-04-29 08:00:00 (Sun)
  62445625200, #      utc_end 1979-10-28 07:00:00 (Sun)
  62429886000, #  local_start 1979-04-29 03:00:00 (Sun)
  62445607200, #    local_end 1979-10-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62445625200, #    utc_start 1979-10-28 07:00:00 (Sun)
  62461353600, #      utc_end 1980-04-27 08:00:00 (Sun)
  62445603600, #  local_start 1979-10-28 01:00:00 (Sun)
  62461332000, #    local_end 1980-04-27 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62461353600, #    utc_start 1980-04-27 08:00:00 (Sun)
  62477074800, #      utc_end 1980-10-26 07:00:00 (Sun)
  62461335600, #  local_start 1980-04-27 03:00:00 (Sun)
  62477056800, #    local_end 1980-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62477074800, #    utc_start 1980-10-26 07:00:00 (Sun)
  62492803200, #      utc_end 1981-04-26 08:00:00 (Sun)
  62477053200, #  local_start 1980-10-26 01:00:00 (Sun)
  62492781600, #    local_end 1981-04-26 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62492803200, #    utc_start 1981-04-26 08:00:00 (Sun)
  62508524400, #      utc_end 1981-10-25 07:00:00 (Sun)
  62492785200, #  local_start 1981-04-26 03:00:00 (Sun)
  62508506400, #    local_end 1981-10-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62508524400, #    utc_start 1981-10-25 07:00:00 (Sun)
  62524252800, #      utc_end 1982-04-25 08:00:00 (Sun)
  62508502800, #  local_start 1981-10-25 01:00:00 (Sun)
  62524231200, #    local_end 1982-04-25 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62524252800, #    utc_start 1982-04-25 08:00:00 (Sun)
  62540578800, #      utc_end 1982-10-31 07:00:00 (Sun)
  62524234800, #  local_start 1982-04-25 03:00:00 (Sun)
  62540560800, #    local_end 1982-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62540578800, #    utc_start 1982-10-31 07:00:00 (Sun)
  62555702400, #      utc_end 1983-04-24 08:00:00 (Sun)
  62540557200, #  local_start 1982-10-31 01:00:00 (Sun)
  62555680800, #    local_end 1983-04-24 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62555702400, #    utc_start 1983-04-24 08:00:00 (Sun)
  62572028400, #      utc_end 1983-10-30 07:00:00 (Sun)
  62555684400, #  local_start 1983-04-24 03:00:00 (Sun)
  62572010400, #    local_end 1983-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62572028400, #    utc_start 1983-10-30 07:00:00 (Sun)
  62587756800, #      utc_end 1984-04-29 08:00:00 (Sun)
  62572006800, #  local_start 1983-10-30 01:00:00 (Sun)
  62587735200, #    local_end 1984-04-29 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62587756800, #    utc_start 1984-04-29 08:00:00 (Sun)
  62603478000, #      utc_end 1984-10-28 07:00:00 (Sun)
  62587738800, #  local_start 1984-04-29 03:00:00 (Sun)
  62603460000, #    local_end 1984-10-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62603478000, #    utc_start 1984-10-28 07:00:00 (Sun)
  62619206400, #      utc_end 1985-04-28 08:00:00 (Sun)
  62603456400, #  local_start 1984-10-28 01:00:00 (Sun)
  62619184800, #    local_end 1985-04-28 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62619206400, #    utc_start 1985-04-28 08:00:00 (Sun)
  62634927600, #      utc_end 1985-10-27 07:00:00 (Sun)
  62619188400, #  local_start 1985-04-28 03:00:00 (Sun)
  62634909600, #    local_end 1985-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62634927600, #    utc_start 1985-10-27 07:00:00 (Sun)
  62650656000, #      utc_end 1986-04-27 08:00:00 (Sun)
  62634906000, #  local_start 1985-10-27 01:00:00 (Sun)
  62650634400, #    local_end 1986-04-27 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62650656000, #    utc_start 1986-04-27 08:00:00 (Sun)
  62666377200, #      utc_end 1986-10-26 07:00:00 (Sun)
  62650638000, #  local_start 1986-04-27 03:00:00 (Sun)
  62666359200, #    local_end 1986-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62666377200, #    utc_start 1986-10-26 07:00:00 (Sun)
  62680291200, #      utc_end 1987-04-05 08:00:00 (Sun)
  62666355600, #  local_start 1986-10-26 01:00:00 (Sun)
  62680269600, #    local_end 1987-04-05 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62680291200, #    utc_start 1987-04-05 08:00:00 (Sun)
  62697826800, #      utc_end 1987-10-25 07:00:00 (Sun)
  62680273200, #  local_start 1987-04-05 03:00:00 (Sun)
  62697808800, #    local_end 1987-10-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62697826800, #    utc_start 1987-10-25 07:00:00 (Sun)
  62711740800, #      utc_end 1988-04-03 08:00:00 (Sun)
  62697805200, #  local_start 1987-10-25 01:00:00 (Sun)
  62711719200, #    local_end 1988-04-03 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62711740800, #    utc_start 1988-04-03 08:00:00 (Sun)
  62729881200, #      utc_end 1988-10-30 07:00:00 (Sun)
  62711722800, #  local_start 1988-04-03 03:00:00 (Sun)
  62729863200, #    local_end 1988-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62729881200, #    utc_start 1988-10-30 07:00:00 (Sun)
  62743190400, #      utc_end 1989-04-02 08:00:00 (Sun)
  62729859600, #  local_start 1988-10-30 01:00:00 (Sun)
  62743168800, #    local_end 1989-04-02 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62743190400, #    utc_start 1989-04-02 08:00:00 (Sun)
  62761330800, #      utc_end 1989-10-29 07:00:00 (Sun)
  62743172400, #  local_start 1989-04-02 03:00:00 (Sun)
  62761312800, #    local_end 1989-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62761330800, #    utc_start 1989-10-29 07:00:00 (Sun)
  62774640000, #      utc_end 1990-04-01 08:00:00 (Sun)
  62761309200, #  local_start 1989-10-29 01:00:00 (Sun)
  62774618400, #    local_end 1990-04-01 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62774640000, #    utc_start 1990-04-01 08:00:00 (Sun)
  62792780400, #      utc_end 1990-10-28 07:00:00 (Sun)
  62774622000, #  local_start 1990-04-01 03:00:00 (Sun)
  62792762400, #    local_end 1990-10-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62792780400, #    utc_start 1990-10-28 07:00:00 (Sun)
  62806694400, #      utc_end 1991-04-07 08:00:00 (Sun)
  62792758800, #  local_start 1990-10-28 01:00:00 (Sun)
  62806672800, #    local_end 1991-04-07 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62806694400, #    utc_start 1991-04-07 08:00:00 (Sun)
  62824230000, #      utc_end 1991-10-27 07:00:00 (Sun)
  62806676400, #  local_start 1991-04-07 03:00:00 (Sun)
  62824212000, #    local_end 1991-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62824230000, #    utc_start 1991-10-27 07:00:00 (Sun)
  62838144000, #      utc_end 1992-04-05 08:00:00 (Sun)
  62824208400, #  local_start 1991-10-27 01:00:00 (Sun)
  62838122400, #    local_end 1992-04-05 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62838144000, #    utc_start 1992-04-05 08:00:00 (Sun)
  62855679600, #      utc_end 1992-10-25 07:00:00 (Sun)
  62838126000, #  local_start 1992-04-05 03:00:00 (Sun)
  62855661600, #    local_end 1992-10-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62855679600, #    utc_start 1992-10-25 07:00:00 (Sun)
  62869593600, #      utc_end 1993-04-04 08:00:00 (Sun)
  62855658000, #  local_start 1992-10-25 01:00:00 (Sun)
  62869572000, #    local_end 1993-04-04 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62869593600, #    utc_start 1993-04-04 08:00:00 (Sun)
  62887734000, #      utc_end 1993-10-31 07:00:00 (Sun)
  62869575600, #  local_start 1993-04-04 03:00:00 (Sun)
  62887716000, #    local_end 1993-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62887734000, #    utc_start 1993-10-31 07:00:00 (Sun)
  62901043200, #      utc_end 1994-04-03 08:00:00 (Sun)
  62887712400, #  local_start 1993-10-31 01:00:00 (Sun)
  62901021600, #    local_end 1994-04-03 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62901043200, #    utc_start 1994-04-03 08:00:00 (Sun)
  62919183600, #      utc_end 1994-10-30 07:00:00 (Sun)
  62901025200, #  local_start 1994-04-03 03:00:00 (Sun)
  62919165600, #    local_end 1994-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62919183600, #    utc_start 1994-10-30 07:00:00 (Sun)
  62932492800, #      utc_end 1995-04-02 08:00:00 (Sun)
  62919162000, #  local_start 1994-10-30 01:00:00 (Sun)
  62932471200, #    local_end 1995-04-02 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62932492800, #    utc_start 1995-04-02 08:00:00 (Sun)
  62950633200, #      utc_end 1995-10-29 07:00:00 (Sun)
  62932474800, #  local_start 1995-04-02 03:00:00 (Sun)
  62950615200, #    local_end 1995-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62950633200, #    utc_start 1995-10-29 07:00:00 (Sun)
  62964547200, #      utc_end 1996-04-07 08:00:00 (Sun)
  62950611600, #  local_start 1995-10-29 01:00:00 (Sun)
  62964525600, #    local_end 1996-04-07 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62964547200, #    utc_start 1996-04-07 08:00:00 (Sun)
  62982082800, #      utc_end 1996-10-27 07:00:00 (Sun)
  62964529200, #  local_start 1996-04-07 03:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62982082800, #    utc_start 1996-10-27 07:00:00 (Sun)
  62995996800, #      utc_end 1997-04-06 08:00:00 (Sun)
  62982061200, #  local_start 1996-10-27 01:00:00 (Sun)
  62995975200, #    local_end 1997-04-06 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62995996800, #    utc_start 1997-04-06 08:00:00 (Sun)
  63013532400, #      utc_end 1997-10-26 07:00:00 (Sun)
  62995978800, #  local_start 1997-04-06 03:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63013532400, #    utc_start 1997-10-26 07:00:00 (Sun)
  63027446400, #      utc_end 1998-04-05 08:00:00 (Sun)
  63013510800, #  local_start 1997-10-26 01:00:00 (Sun)
  63027424800, #    local_end 1998-04-05 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63027446400, #    utc_start 1998-04-05 08:00:00 (Sun)
  63044982000, #      utc_end 1998-10-25 07:00:00 (Sun)
  63027428400, #  local_start 1998-04-05 03:00:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63044982000, #    utc_start 1998-10-25 07:00:00 (Sun)
  63058896000, #      utc_end 1999-04-04 08:00:00 (Sun)
  63044960400, #  local_start 1998-10-25 01:00:00 (Sun)
  63058874400, #    local_end 1999-04-04 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63058896000, #    utc_start 1999-04-04 08:00:00 (Sun)
  63077036400, #      utc_end 1999-10-31 07:00:00 (Sun)
  63058878000, #  local_start 1999-04-04 03:00:00 (Sun)
  63077018400, #    local_end 1999-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63077036400, #    utc_start 1999-10-31 07:00:00 (Sun)
  63090345600, #      utc_end 2000-04-02 08:00:00 (Sun)
  63077014800, #  local_start 1999-10-31 01:00:00 (Sun)
  63090324000, #    local_end 2000-04-02 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63090345600, #    utc_start 2000-04-02 08:00:00 (Sun)
  63108486000, #      utc_end 2000-10-29 07:00:00 (Sun)
  63090327600, #  local_start 2000-04-02 03:00:00 (Sun)
  63108468000, #    local_end 2000-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63108486000, #    utc_start 2000-10-29 07:00:00 (Sun)
  63121791600, #      utc_end 2001-04-01 07:00:00 (Sun)
  63108468000, #  local_start 2000-10-29 02:00:00 (Sun)
  63121773600, #    local_end 2001-04-01 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63121791600, #    utc_start 2001-04-01 07:00:00 (Sun)
  63139932000, #      utc_end 2001-10-28 06:00:00 (Sun)
  63121777200, #  local_start 2001-04-01 03:00:00 (Sun)
  63139917600, #    local_end 2001-10-28 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63139932000, #    utc_start 2001-10-28 06:00:00 (Sun)
  63153846000, #      utc_end 2002-04-07 07:00:00 (Sun)
  63139914000, #  local_start 2001-10-28 01:00:00 (Sun)
  63153828000, #    local_end 2002-04-07 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63153846000, #    utc_start 2002-04-07 07:00:00 (Sun)
  63171381600, #      utc_end 2002-10-27 06:00:00 (Sun)
  63153831600, #  local_start 2002-04-07 03:00:00 (Sun)
  63171367200, #    local_end 2002-10-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63171381600, #    utc_start 2002-10-27 06:00:00 (Sun)
  63185295600, #      utc_end 2003-04-06 07:00:00 (Sun)
  63171363600, #  local_start 2002-10-27 01:00:00 (Sun)
  63185277600, #    local_end 2003-04-06 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63185295600, #    utc_start 2003-04-06 07:00:00 (Sun)
  63202831200, #      utc_end 2003-10-26 06:00:00 (Sun)
  63185281200, #  local_start 2003-04-06 03:00:00 (Sun)
  63202816800, #    local_end 2003-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63202831200, #    utc_start 2003-10-26 06:00:00 (Sun)
  63216745200, #      utc_end 2004-04-04 07:00:00 (Sun)
  63202813200, #  local_start 2003-10-26 01:00:00 (Sun)
  63216727200, #    local_end 2004-04-04 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63216745200, #    utc_start 2004-04-04 07:00:00 (Sun)
  63234885600, #      utc_end 2004-10-31 06:00:00 (Sun)
  63216730800, #  local_start 2004-04-04 03:00:00 (Sun)
  63234871200, #    local_end 2004-10-31 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63234885600, #    utc_start 2004-10-31 06:00:00 (Sun)
  63248194800, #      utc_end 2005-04-03 07:00:00 (Sun)
  63234867600, #  local_start 2004-10-31 01:00:00 (Sun)
  63248176800, #    local_end 2005-04-03 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63248194800, #    utc_start 2005-04-03 07:00:00 (Sun)
  63266335200, #      utc_end 2005-10-30 06:00:00 (Sun)
  63248180400, #  local_start 2005-04-03 03:00:00 (Sun)
  63266320800, #    local_end 2005-10-30 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63266335200, #    utc_start 2005-10-30 06:00:00 (Sun)
  63279644400, #      utc_end 2006-04-02 07:00:00 (Sun)
  63266317200, #  local_start 2005-10-30 01:00:00 (Sun)
  63279626400, #    local_end 2006-04-02 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63279644400, #    utc_start 2006-04-02 07:00:00 (Sun)
  63297784800, #      utc_end 2006-10-29 06:00:00 (Sun)
  63279630000, #  local_start 2006-04-02 03:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63297784800, #    utc_start 2006-10-29 06:00:00 (Sun)
  63309279600, #      utc_end 2007-03-11 07:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63309261600, #    local_end 2007-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63309279600, #    utc_start 2007-03-11 07:00:00 (Sun)
  63329839200, #      utc_end 2007-11-04 06:00:00 (Sun)
  63309265200, #  local_start 2007-03-11 03:00:00 (Sun)
  63329824800, #    local_end 2007-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63329839200, #    utc_start 2007-11-04 06:00:00 (Sun)
  63340729200, #      utc_end 2008-03-09 07:00:00 (Sun)
  63329821200, #  local_start 2007-11-04 01:00:00 (Sun)
  63340711200, #    local_end 2008-03-09 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63340729200, #    utc_start 2008-03-09 07:00:00 (Sun)
  63361288800, #      utc_end 2008-11-02 06:00:00 (Sun)
  63340714800, #  local_start 2008-03-09 03:00:00 (Sun)
  63361274400, #    local_end 2008-11-02 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63361288800, #    utc_start 2008-11-02 06:00:00 (Sun)
  63372178800, #      utc_end 2009-03-08 07:00:00 (Sun)
  63361270800, #  local_start 2008-11-02 01:00:00 (Sun)
  63372160800, #    local_end 2009-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63372178800, #    utc_start 2009-03-08 07:00:00 (Sun)
  63392738400, #      utc_end 2009-11-01 06:00:00 (Sun)
  63372164400, #  local_start 2009-03-08 03:00:00 (Sun)
  63392724000, #    local_end 2009-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63392738400, #    utc_start 2009-11-01 06:00:00 (Sun)
  63404233200, #      utc_end 2010-03-14 07:00:00 (Sun)
  63392720400, #  local_start 2009-11-01 01:00:00 (Sun)
  63404215200, #    local_end 2010-03-14 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63404233200, #    utc_start 2010-03-14 07:00:00 (Sun)
  63424792800, #      utc_end 2010-11-07 06:00:00 (Sun)
  63404218800, #  local_start 2010-03-14 03:00:00 (Sun)
  63424778400, #    local_end 2010-11-07 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63424792800, #    utc_start 2010-11-07 06:00:00 (Sun)
  63435682800, #      utc_end 2011-03-13 07:00:00 (Sun)
  63424774800, #  local_start 2010-11-07 01:00:00 (Sun)
  63435664800, #    local_end 2011-03-13 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63435682800, #    utc_start 2011-03-13 07:00:00 (Sun)
  63456242400, #      utc_end 2011-11-06 06:00:00 (Sun)
  63435668400, #  local_start 2011-03-13 03:00:00 (Sun)
  63456228000, #    local_end 2011-11-06 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63456242400, #    utc_start 2011-11-06 06:00:00 (Sun)
  63467132400, #      utc_end 2012-03-11 07:00:00 (Sun)
  63456224400, #  local_start 2011-11-06 01:00:00 (Sun)
  63467114400, #    local_end 2012-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63467132400, #    utc_start 2012-03-11 07:00:00 (Sun)
  63487692000, #      utc_end 2012-11-04 06:00:00 (Sun)
  63467118000, #  local_start 2012-03-11 03:00:00 (Sun)
  63487677600, #    local_end 2012-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63487692000, #    utc_start 2012-11-04 06:00:00 (Sun)
  63498582000, #      utc_end 2013-03-10 07:00:00 (Sun)
  63487674000, #  local_start 2012-11-04 01:00:00 (Sun)
  63498564000, #    local_end 2013-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63498582000, #    utc_start 2013-03-10 07:00:00 (Sun)
  63519141600, #      utc_end 2013-11-03 06:00:00 (Sun)
  63498567600, #  local_start 2013-03-10 03:00:00 (Sun)
  63519127200, #    local_end 2013-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63519141600, #    utc_start 2013-11-03 06:00:00 (Sun)
  63530031600, #      utc_end 2014-03-09 07:00:00 (Sun)
  63519123600, #  local_start 2013-11-03 01:00:00 (Sun)
  63530013600, #    local_end 2014-03-09 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63530031600, #    utc_start 2014-03-09 07:00:00 (Sun)
  63550591200, #      utc_end 2014-11-02 06:00:00 (Sun)
  63530017200, #  local_start 2014-03-09 03:00:00 (Sun)
  63550576800, #    local_end 2014-11-02 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63550591200, #    utc_start 2014-11-02 06:00:00 (Sun)
  63561481200, #      utc_end 2015-03-08 07:00:00 (Sun)
  63550573200, #  local_start 2014-11-02 01:00:00 (Sun)
  63561463200, #    local_end 2015-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63561481200, #    utc_start 2015-03-08 07:00:00 (Sun)
  63582040800, #      utc_end 2015-11-01 06:00:00 (Sun)
  63561466800, #  local_start 2015-03-08 03:00:00 (Sun)
  63582026400, #    local_end 2015-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63582040800, #    utc_start 2015-11-01 06:00:00 (Sun)
  63593535600, #      utc_end 2016-03-13 07:00:00 (Sun)
  63582022800, #  local_start 2015-11-01 01:00:00 (Sun)
  63593517600, #    local_end 2016-03-13 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63593535600, #    utc_start 2016-03-13 07:00:00 (Sun)
  63614095200, #      utc_end 2016-11-06 06:00:00 (Sun)
  63593521200, #  local_start 2016-03-13 03:00:00 (Sun)
  63614080800, #    local_end 2016-11-06 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63614095200, #    utc_start 2016-11-06 06:00:00 (Sun)
  63624985200, #      utc_end 2017-03-12 07:00:00 (Sun)
  63614077200, #  local_start 2016-11-06 01:00:00 (Sun)
  63624967200, #    local_end 2017-03-12 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63624985200, #    utc_start 2017-03-12 07:00:00 (Sun)
  63645544800, #      utc_end 2017-11-05 06:00:00 (Sun)
  63624970800, #  local_start 2017-03-12 03:00:00 (Sun)
  63645530400, #    local_end 2017-11-05 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63645544800, #    utc_start 2017-11-05 06:00:00 (Sun)
  63656434800, #      utc_end 2018-03-11 07:00:00 (Sun)
  63645526800, #  local_start 2017-11-05 01:00:00 (Sun)
  63656416800, #    local_end 2018-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63656434800, #    utc_start 2018-03-11 07:00:00 (Sun)
  63676994400, #      utc_end 2018-11-04 06:00:00 (Sun)
  63656420400, #  local_start 2018-03-11 03:00:00 (Sun)
  63676980000, #    local_end 2018-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63676994400, #    utc_start 2018-11-04 06:00:00 (Sun)
  63687884400, #      utc_end 2019-03-10 07:00:00 (Sun)
  63676976400, #  local_start 2018-11-04 01:00:00 (Sun)
  63687866400, #    local_end 2019-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63687884400, #    utc_start 2019-03-10 07:00:00 (Sun)
  63708444000, #      utc_end 2019-11-03 06:00:00 (Sun)
  63687870000, #  local_start 2019-03-10 03:00:00 (Sun)
  63708429600, #    local_end 2019-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63708444000, #    utc_start 2019-11-03 06:00:00 (Sun)
  63719334000, #      utc_end 2020-03-08 07:00:00 (Sun)
  63708426000, #  local_start 2019-11-03 01:00:00 (Sun)
  63719316000, #    local_end 2020-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63719334000, #    utc_start 2020-03-08 07:00:00 (Sun)
  63739893600, #      utc_end 2020-11-01 06:00:00 (Sun)
  63719319600, #  local_start 2020-03-08 03:00:00 (Sun)
  63739879200, #    local_end 2020-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63739893600, #    utc_start 2020-11-01 06:00:00 (Sun)
  63751388400, #      utc_end 2021-03-14 07:00:00 (Sun)
  63739875600, #  local_start 2020-11-01 01:00:00 (Sun)
  63751370400, #    local_end 2021-03-14 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63751388400, #    utc_start 2021-03-14 07:00:00 (Sun)
  63771948000, #      utc_end 2021-11-07 06:00:00 (Sun)
  63751374000, #  local_start 2021-03-14 03:00:00 (Sun)
  63771933600, #    local_end 2021-11-07 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63771948000, #    utc_start 2021-11-07 06:00:00 (Sun)
  63782838000, #      utc_end 2022-03-13 07:00:00 (Sun)
  63771930000, #  local_start 2021-11-07 01:00:00 (Sun)
  63782820000, #    local_end 2022-03-13 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63782838000, #    utc_start 2022-03-13 07:00:00 (Sun)
  63803397600, #      utc_end 2022-11-06 06:00:00 (Sun)
  63782823600, #  local_start 2022-03-13 03:00:00 (Sun)
  63803383200, #    local_end 2022-11-06 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63803397600, #    utc_start 2022-11-06 06:00:00 (Sun)
  63814287600, #      utc_end 2023-03-12 07:00:00 (Sun)
  63803379600, #  local_start 2022-11-06 01:00:00 (Sun)
  63814269600, #    local_end 2023-03-12 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63814287600, #    utc_start 2023-03-12 07:00:00 (Sun)
  63834847200, #      utc_end 2023-11-05 06:00:00 (Sun)
  63814273200, #  local_start 2023-03-12 03:00:00 (Sun)
  63834832800, #    local_end 2023-11-05 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63834847200, #    utc_start 2023-11-05 06:00:00 (Sun)
  63845737200, #      utc_end 2024-03-10 07:00:00 (Sun)
  63834829200, #  local_start 2023-11-05 01:00:00 (Sun)
  63845719200, #    local_end 2024-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63845737200, #    utc_start 2024-03-10 07:00:00 (Sun)
  63866296800, #      utc_end 2024-11-03 06:00:00 (Sun)
  63845722800, #  local_start 2024-03-10 03:00:00 (Sun)
  63866282400, #    local_end 2024-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63866296800, #    utc_start 2024-11-03 06:00:00 (Sun)
  63877186800, #      utc_end 2025-03-09 07:00:00 (Sun)
  63866278800, #  local_start 2024-11-03 01:00:00 (Sun)
  63877168800, #    local_end 2025-03-09 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63877186800, #    utc_start 2025-03-09 07:00:00 (Sun)
  63897746400, #      utc_end 2025-11-02 06:00:00 (Sun)
  63877172400, #  local_start 2025-03-09 03:00:00 (Sun)
  63897732000, #    local_end 2025-11-02 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63897746400, #    utc_start 2025-11-02 06:00:00 (Sun)
  63908636400, #      utc_end 2026-03-08 07:00:00 (Sun)
  63897728400, #  local_start 2025-11-02 01:00:00 (Sun)
  63908618400, #    local_end 2026-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63908636400, #    utc_start 2026-03-08 07:00:00 (Sun)
  63929196000, #      utc_end 2026-11-01 06:00:00 (Sun)
  63908622000, #  local_start 2026-03-08 03:00:00 (Sun)
  63929181600, #    local_end 2026-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63929196000, #    utc_start 2026-11-01 06:00:00 (Sun)
  63940690800, #      utc_end 2027-03-14 07:00:00 (Sun)
  63929178000, #  local_start 2026-11-01 01:00:00 (Sun)
  63940672800, #    local_end 2027-03-14 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63940690800, #    utc_start 2027-03-14 07:00:00 (Sun)
  63961250400, #      utc_end 2027-11-07 06:00:00 (Sun)
  63940676400, #  local_start 2027-03-14 03:00:00 (Sun)
  63961236000, #    local_end 2027-11-07 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63961250400, #    utc_start 2027-11-07 06:00:00 (Sun)
  63972140400, #      utc_end 2028-03-12 07:00:00 (Sun)
  63961232400, #  local_start 2027-11-07 01:00:00 (Sun)
  63972122400, #    local_end 2028-03-12 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63972140400, #    utc_start 2028-03-12 07:00:00 (Sun)
  63992700000, #      utc_end 2028-11-05 06:00:00 (Sun)
  63972126000, #  local_start 2028-03-12 03:00:00 (Sun)
  63992685600, #    local_end 2028-11-05 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63992700000, #    utc_start 2028-11-05 06:00:00 (Sun)
  64003590000, #      utc_end 2029-03-11 07:00:00 (Sun)
  63992682000, #  local_start 2028-11-05 01:00:00 (Sun)
  64003572000, #    local_end 2029-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  64003590000, #    utc_start 2029-03-11 07:00:00 (Sun)
  64024149600, #      utc_end 2029-11-04 06:00:00 (Sun)
  64003575600, #  local_start 2029-03-11 03:00:00 (Sun)
  64024135200, #    local_end 2029-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  64024149600, #    utc_start 2029-11-04 06:00:00 (Sun)
  64035039600, #      utc_end 2030-03-10 07:00:00 (Sun)
  64024131600, #  local_start 2029-11-04 01:00:00 (Sun)
  64035021600, #    local_end 2030-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  64035039600, #    utc_start 2030-03-10 07:00:00 (Sun)
  64055599200, #      utc_end 2030-11-03 06:00:00 (Sun)
  64035025200, #  local_start 2030-03-10 03:00:00 (Sun)
  64055584800, #    local_end 2030-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {67}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -18000 }
  
  my $last_observance = bless( {
    'format' => 'E%sT',
    'gmtoff' => '-5:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 730422,
      'local_rd_secs' => 7200,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 730422,
      'utc_rd_secs' => 7200,
      'utc_year' => 2001
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -18000,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 730422,
      'local_rd_secs' => 25200,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 730422,
      'utc_rd_secs' => 25200,
      'utc_year' => 2001
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Nov',
      'letter' => 'S',
      'name' => 'US',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Mar',
      'letter' => 'D',
      'name' => 'US',
      'offset_from_std' => 3600,
      'on' => 'Sun>=8',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_KENTUCKY_MONTICELLO

    $main::fatpacked{"DateTime/TimeZone/America/La_Paz.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_LA_PAZ';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/southamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::La_Paz;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::La_Paz::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59611177956, #      utc_end 1890-01-01 04:32:36 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59611161600, #    local_end 1890-01-01 00:00:00 (Wed)
  -16356,
  0,
  'LMT',
      ],
      [
  59611177956, #    utc_start 1890-01-01 04:32:36 (Wed)
  60929728356, #      utc_end 1931-10-15 04:32:36 (Thu)
  59611161600, #  local_start 1890-01-01 00:00:00 (Wed)
  60929712000, #    local_end 1931-10-15 00:00:00 (Thu)
  -16356,
  0,
  'CMT',
      ],
      [
  60929728356, #    utc_start 1931-10-15 04:32:36 (Thu)
  60943375956, #      utc_end 1932-03-21 03:32:36 (Mon)
  60929715600, #  local_start 1931-10-15 01:00:00 (Thu)
  60943363200, #    local_end 1932-03-21 00:00:00 (Mon)
  -12756,
  1,
  'BST',
      ],
      [
  60943375956, #    utc_start 1932-03-21 03:32:36 (Mon)
  DateTime::TimeZone::INFINITY, #      utc_end
  60943361556, #  local_start 1932-03-20 23:32:36 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  -14400,
  0,
  '-04',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {1}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_LA_PAZ

    $main::fatpacked{"DateTime/TimeZone/America/Lima.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_LIMA';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/southamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Lima;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Lima::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59611180092, #      utc_end 1890-01-01 05:08:12 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59611161600, #    local_end 1890-01-01 00:00:00 (Wed)
  -18492,
  0,
  'LMT',
      ],
      [
  59611180092, #    utc_start 1890-01-01 05:08:12 (Wed)
  60197144916, #      utc_end 1908-07-28 05:08:36 (Tue)
  59611161576, #  local_start 1889-12-31 23:59:36 (Tue)
  60197126400, #    local_end 1908-07-28 00:00:00 (Tue)
  -18516,
  0,
  'LMT',
      ],
      [
  60197144916, #    utc_start 1908-07-28 05:08:36 (Tue)
  61125858000, #      utc_end 1938-01-01 05:00:00 (Sat)
  60197126916, #  local_start 1908-07-28 00:08:36 (Tue)
  61125840000, #    local_end 1938-01-01 00:00:00 (Sat)
  -18000,
  0,
  '-05',
      ],
      [
  61125858000, #    utc_start 1938-01-01 05:00:00 (Sat)
  61133630400, #      utc_end 1938-04-01 04:00:00 (Fri)
  61125843600, #  local_start 1938-01-01 01:00:00 (Sat)
  61133616000, #    local_end 1938-04-01 00:00:00 (Fri)
  -14400,
  1,
  '-04',
      ],
      [
  61133630400, #    utc_start 1938-04-01 04:00:00 (Fri)
  61148926800, #      utc_end 1938-09-25 05:00:00 (Sun)
  61133612400, #  local_start 1938-03-31 23:00:00 (Thu)
  61148908800, #    local_end 1938-09-25 00:00:00 (Sun)
  -18000,
  0,
  '-05',
      ],
      [
  61148926800, #    utc_start 1938-09-25 05:00:00 (Sun)
  61164648000, #      utc_end 1939-03-26 04:00:00 (Sun)
  61148912400, #  local_start 1938-09-25 01:00:00 (Sun)
  61164633600, #    local_end 1939-03-26 00:00:00 (Sun)
  -14400,
  1,
  '-04',
      ],
      [
  61164648000, #    utc_start 1939-03-26 04:00:00 (Sun)
  61180376400, #      utc_end 1939-09-24 05:00:00 (Sun)
  61164630000, #  local_start 1939-03-25 23:00:00 (Sat)
  61180358400, #    local_end 1939-09-24 00:00:00 (Sun)
  -18000,
  0,
  '-05',
      ],
      [
  61180376400, #    utc_start 1939-09-24 05:00:00 (Sun)
  61196097600, #      utc_end 1940-03-24 04:00:00 (Sun)
  61180362000, #  local_start 1939-09-24 01:00:00 (Sun)
  61196083200, #    local_end 1940-03-24 00:00:00 (Sun)
  -14400,
  1,
  '-04',
      ],
      [
  61196097600, #    utc_start 1940-03-24 04:00:00 (Sun)
  62640622800, #      utc_end 1986-01-01 05:00:00 (Wed)
  61196079600, #  local_start 1940-03-23 23:00:00 (Sat)
  62640604800, #    local_end 1986-01-01 00:00:00 (Wed)
  -18000,
  0,
  '-05',
      ],
      [
  62640622800, #    utc_start 1986-01-01 05:00:00 (Wed)
  62648395200, #      utc_end 1986-04-01 04:00:00 (Tue)
  62640608400, #  local_start 1986-01-01 01:00:00 (Wed)
  62648380800, #    local_end 1986-04-01 00:00:00 (Tue)
  -14400,
  1,
  '-04',
      ],
      [
  62648395200, #    utc_start 1986-04-01 04:00:00 (Tue)
  62672158800, #      utc_end 1987-01-01 05:00:00 (Thu)
  62648377200, #  local_start 1986-03-31 23:00:00 (Mon)
  62672140800, #    local_end 1987-01-01 00:00:00 (Thu)
  -18000,
  0,
  '-05',
      ],
      [
  62672158800, #    utc_start 1987-01-01 05:00:00 (Thu)
  62679931200, #      utc_end 1987-04-01 04:00:00 (Wed)
  62672144400, #  local_start 1987-01-01 01:00:00 (Thu)
  62679916800, #    local_end 1987-04-01 00:00:00 (Wed)
  -14400,
  1,
  '-04',
      ],
      [
  62679931200, #    utc_start 1987-04-01 04:00:00 (Wed)
  62766853200, #      utc_end 1990-01-01 05:00:00 (Mon)
  62679913200, #  local_start 1987-03-31 23:00:00 (Tue)
  62766835200, #    local_end 1990-01-01 00:00:00 (Mon)
  -18000,
  0,
  '-05',
      ],
      [
  62766853200, #    utc_start 1990-01-01 05:00:00 (Mon)
  62774625600, #      utc_end 1990-04-01 04:00:00 (Sun)
  62766838800, #  local_start 1990-01-01 01:00:00 (Mon)
  62774611200, #    local_end 1990-04-01 00:00:00 (Sun)
  -14400,
  1,
  '-04',
      ],
      [
  62774625600, #    utc_start 1990-04-01 04:00:00 (Sun)
  62893083600, #      utc_end 1994-01-01 05:00:00 (Sat)
  62774607600, #  local_start 1990-03-31 23:00:00 (Sat)
  62893065600, #    local_end 1994-01-01 00:00:00 (Sat)
  -18000,
  0,
  '-05',
      ],
      [
  62893083600, #    utc_start 1994-01-01 05:00:00 (Sat)
  62900856000, #      utc_end 1994-04-01 04:00:00 (Fri)
  62893069200, #  local_start 1994-01-01 01:00:00 (Sat)
  62900841600, #    local_end 1994-04-01 00:00:00 (Fri)
  -14400,
  1,
  '-04',
      ],
      [
  62900856000, #    utc_start 1994-04-01 04:00:00 (Fri)
  DateTime::TimeZone::INFINITY, #      utc_end
  62900838000, #  local_start 1994-03-31 23:00:00 (Thu)
  DateTime::TimeZone::INFINITY, #    local_end
  -18000,
  0,
  '-05',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {7}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_LIMA

    $main::fatpacked{"DateTime/TimeZone/America/Los_Angeles.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_LOS_ANGELES';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Los_Angeles;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Los_Angeles::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59418043200, #      utc_end 1883-11-18 20:00:00 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59418014822, #    local_end 1883-11-18 12:07:02 (Sun)
  -28378,
  0,
  'LMT',
      ],
      [
  59418043200, #    utc_start 1883-11-18 20:00:00 (Sun)
  60502413600, #      utc_end 1918-03-31 10:00:00 (Sun)
  59418014400, #  local_start 1883-11-18 12:00:00 (Sun)
  60502384800, #    local_end 1918-03-31 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  60502413600, #    utc_start 1918-03-31 10:00:00 (Sun)
  60520554000, #      utc_end 1918-10-27 09:00:00 (Sun)
  60502388400, #  local_start 1918-03-31 03:00:00 (Sun)
  60520528800, #    local_end 1918-10-27 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  60520554000, #    utc_start 1918-10-27 09:00:00 (Sun)
  60533863200, #      utc_end 1919-03-30 10:00:00 (Sun)
  60520525200, #  local_start 1918-10-27 01:00:00 (Sun)
  60533834400, #    local_end 1919-03-30 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  60533863200, #    utc_start 1919-03-30 10:00:00 (Sun)
  60552003600, #      utc_end 1919-10-26 09:00:00 (Sun)
  60533838000, #  local_start 1919-03-30 03:00:00 (Sun)
  60551978400, #    local_end 1919-10-26 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  60552003600, #    utc_start 1919-10-26 09:00:00 (Sun)
  61255476000, #      utc_end 1942-02-09 10:00:00 (Mon)
  60551974800, #  local_start 1919-10-26 01:00:00 (Sun)
  61255447200, #    local_end 1942-02-09 02:00:00 (Mon)
  -28800,
  0,
  'PST',
      ],
      [
  61255476000, #    utc_start 1942-02-09 10:00:00 (Mon)
  61366287600, #      utc_end 1945-08-14 23:00:00 (Tue)
  61255450800, #  local_start 1942-02-09 03:00:00 (Mon)
  61366262400, #    local_end 1945-08-14 16:00:00 (Tue)
  -25200,
  1,
  'PWT',
      ],
      [
  61366287600, #    utc_start 1945-08-14 23:00:00 (Tue)
  61370298000, #      utc_end 1945-09-30 09:00:00 (Sun)
  61366262400, #  local_start 1945-08-14 16:00:00 (Tue)
  61370272800, #    local_end 1945-09-30 02:00:00 (Sun)
  -25200,
  1,
  'PPT',
      ],
      [
  61370298000, #    utc_start 1945-09-30 09:00:00 (Sun)
  61378329600, #      utc_end 1946-01-01 08:00:00 (Tue)
  61370269200, #  local_start 1945-09-30 01:00:00 (Sun)
  61378300800, #    local_end 1946-01-01 00:00:00 (Tue)
  -28800,
  0,
  'PST',
      ],
      [
  61378329600, #    utc_start 1946-01-01 08:00:00 (Tue)
  61447716060, #      utc_end 1948-03-14 10:01:00 (Sun)
  61378300800, #  local_start 1946-01-01 00:00:00 (Tue)
  61447687260, #    local_end 1948-03-14 02:01:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61447716060, #    utc_start 1948-03-14 10:01:00 (Sun)
  61473027600, #      utc_end 1949-01-01 09:00:00 (Sat)
  61447690860, #  local_start 1948-03-14 03:01:00 (Sun)
  61473002400, #    local_end 1949-01-01 02:00:00 (Sat)
  -25200,
  1,
  'PDT',
      ],
      [
  61473027600, #    utc_start 1949-01-01 09:00:00 (Sat)
  61514845200, #      utc_end 1950-04-30 09:00:00 (Sun)
  61472998800, #  local_start 1949-01-01 01:00:00 (Sat)
  61514816400, #    local_end 1950-04-30 01:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61514845200, #    utc_start 1950-04-30 09:00:00 (Sun)
  61527546000, #      utc_end 1950-09-24 09:00:00 (Sun)
  61514820000, #  local_start 1950-04-30 02:00:00 (Sun)
  61527520800, #    local_end 1950-09-24 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61527546000, #    utc_start 1950-09-24 09:00:00 (Sun)
  61546294800, #      utc_end 1951-04-29 09:00:00 (Sun)
  61527517200, #  local_start 1950-09-24 01:00:00 (Sun)
  61546266000, #    local_end 1951-04-29 01:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61546294800, #    utc_start 1951-04-29 09:00:00 (Sun)
  61559600400, #      utc_end 1951-09-30 09:00:00 (Sun)
  61546269600, #  local_start 1951-04-29 02:00:00 (Sun)
  61559575200, #    local_end 1951-09-30 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61559600400, #    utc_start 1951-09-30 09:00:00 (Sun)
  61577744400, #      utc_end 1952-04-27 09:00:00 (Sun)
  61559571600, #  local_start 1951-09-30 01:00:00 (Sun)
  61577715600, #    local_end 1952-04-27 01:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61577744400, #    utc_start 1952-04-27 09:00:00 (Sun)
  61591050000, #      utc_end 1952-09-28 09:00:00 (Sun)
  61577719200, #  local_start 1952-04-27 02:00:00 (Sun)
  61591024800, #    local_end 1952-09-28 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61591050000, #    utc_start 1952-09-28 09:00:00 (Sun)
  61609194000, #      utc_end 1953-04-26 09:00:00 (Sun)
  61591021200, #  local_start 1952-09-28 01:00:00 (Sun)
  61609165200, #    local_end 1953-04-26 01:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61609194000, #    utc_start 1953-04-26 09:00:00 (Sun)
  61622499600, #      utc_end 1953-09-27 09:00:00 (Sun)
  61609168800, #  local_start 1953-04-26 02:00:00 (Sun)
  61622474400, #    local_end 1953-09-27 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61622499600, #    utc_start 1953-09-27 09:00:00 (Sun)
  61640643600, #      utc_end 1954-04-25 09:00:00 (Sun)
  61622470800, #  local_start 1953-09-27 01:00:00 (Sun)
  61640614800, #    local_end 1954-04-25 01:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61640643600, #    utc_start 1954-04-25 09:00:00 (Sun)
  61653949200, #      utc_end 1954-09-26 09:00:00 (Sun)
  61640618400, #  local_start 1954-04-25 02:00:00 (Sun)
  61653924000, #    local_end 1954-09-26 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61653949200, #    utc_start 1954-09-26 09:00:00 (Sun)
  61672093200, #      utc_end 1955-04-24 09:00:00 (Sun)
  61653920400, #  local_start 1954-09-26 01:00:00 (Sun)
  61672064400, #    local_end 1955-04-24 01:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61672093200, #    utc_start 1955-04-24 09:00:00 (Sun)
  61685398800, #      utc_end 1955-09-25 09:00:00 (Sun)
  61672068000, #  local_start 1955-04-24 02:00:00 (Sun)
  61685373600, #    local_end 1955-09-25 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61685398800, #    utc_start 1955-09-25 09:00:00 (Sun)
  61704147600, #      utc_end 1956-04-29 09:00:00 (Sun)
  61685370000, #  local_start 1955-09-25 01:00:00 (Sun)
  61704118800, #    local_end 1956-04-29 01:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61704147600, #    utc_start 1956-04-29 09:00:00 (Sun)
  61717453200, #      utc_end 1956-09-30 09:00:00 (Sun)
  61704122400, #  local_start 1956-04-29 02:00:00 (Sun)
  61717428000, #    local_end 1956-09-30 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61717453200, #    utc_start 1956-09-30 09:00:00 (Sun)
  61735597200, #      utc_end 1957-04-28 09:00:00 (Sun)
  61717424400, #  local_start 1956-09-30 01:00:00 (Sun)
  61735568400, #    local_end 1957-04-28 01:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61735597200, #    utc_start 1957-04-28 09:00:00 (Sun)
  61748902800, #      utc_end 1957-09-29 09:00:00 (Sun)
  61735572000, #  local_start 1957-04-28 02:00:00 (Sun)
  61748877600, #    local_end 1957-09-29 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61748902800, #    utc_start 1957-09-29 09:00:00 (Sun)
  61767046800, #      utc_end 1958-04-27 09:00:00 (Sun)
  61748874000, #  local_start 1957-09-29 01:00:00 (Sun)
  61767018000, #    local_end 1958-04-27 01:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61767046800, #    utc_start 1958-04-27 09:00:00 (Sun)
  61780352400, #      utc_end 1958-09-28 09:00:00 (Sun)
  61767021600, #  local_start 1958-04-27 02:00:00 (Sun)
  61780327200, #    local_end 1958-09-28 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61780352400, #    utc_start 1958-09-28 09:00:00 (Sun)
  61798496400, #      utc_end 1959-04-26 09:00:00 (Sun)
  61780323600, #  local_start 1958-09-28 01:00:00 (Sun)
  61798467600, #    local_end 1959-04-26 01:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61798496400, #    utc_start 1959-04-26 09:00:00 (Sun)
  61811802000, #      utc_end 1959-09-27 09:00:00 (Sun)
  61798471200, #  local_start 1959-04-26 02:00:00 (Sun)
  61811776800, #    local_end 1959-09-27 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61811802000, #    utc_start 1959-09-27 09:00:00 (Sun)
  61829946000, #      utc_end 1960-04-24 09:00:00 (Sun)
  61811773200, #  local_start 1959-09-27 01:00:00 (Sun)
  61829917200, #    local_end 1960-04-24 01:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61829946000, #    utc_start 1960-04-24 09:00:00 (Sun)
  61843251600, #      utc_end 1960-09-25 09:00:00 (Sun)
  61829920800, #  local_start 1960-04-24 02:00:00 (Sun)
  61843226400, #    local_end 1960-09-25 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61843251600, #    utc_start 1960-09-25 09:00:00 (Sun)
  61862000400, #      utc_end 1961-04-30 09:00:00 (Sun)
  61843222800, #  local_start 1960-09-25 01:00:00 (Sun)
  61861971600, #    local_end 1961-04-30 01:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61862000400, #    utc_start 1961-04-30 09:00:00 (Sun)
  61874701200, #      utc_end 1961-09-24 09:00:00 (Sun)
  61861975200, #  local_start 1961-04-30 02:00:00 (Sun)
  61874676000, #    local_end 1961-09-24 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61874701200, #    utc_start 1961-09-24 09:00:00 (Sun)
  61893450000, #      utc_end 1962-04-29 09:00:00 (Sun)
  61874672400, #  local_start 1961-09-24 01:00:00 (Sun)
  61893421200, #    local_end 1962-04-29 01:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61893450000, #    utc_start 1962-04-29 09:00:00 (Sun)
  61909174800, #      utc_end 1962-10-28 09:00:00 (Sun)
  61893424800, #  local_start 1962-04-29 02:00:00 (Sun)
  61909149600, #    local_end 1962-10-28 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61909174800, #    utc_start 1962-10-28 09:00:00 (Sun)
  61924899600, #      utc_end 1963-04-28 09:00:00 (Sun)
  61909146000, #  local_start 1962-10-28 01:00:00 (Sun)
  61924870800, #    local_end 1963-04-28 01:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61924899600, #    utc_start 1963-04-28 09:00:00 (Sun)
  61940624400, #      utc_end 1963-10-27 09:00:00 (Sun)
  61924874400, #  local_start 1963-04-28 02:00:00 (Sun)
  61940599200, #    local_end 1963-10-27 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61940624400, #    utc_start 1963-10-27 09:00:00 (Sun)
  61956349200, #      utc_end 1964-04-26 09:00:00 (Sun)
  61940595600, #  local_start 1963-10-27 01:00:00 (Sun)
  61956320400, #    local_end 1964-04-26 01:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61956349200, #    utc_start 1964-04-26 09:00:00 (Sun)
  61972074000, #      utc_end 1964-10-25 09:00:00 (Sun)
  61956324000, #  local_start 1964-04-26 02:00:00 (Sun)
  61972048800, #    local_end 1964-10-25 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61972074000, #    utc_start 1964-10-25 09:00:00 (Sun)
  61987798800, #      utc_end 1965-04-25 09:00:00 (Sun)
  61972045200, #  local_start 1964-10-25 01:00:00 (Sun)
  61987770000, #    local_end 1965-04-25 01:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61987798800, #    utc_start 1965-04-25 09:00:00 (Sun)
  62004128400, #      utc_end 1965-10-31 09:00:00 (Sun)
  61987773600, #  local_start 1965-04-25 02:00:00 (Sun)
  62004103200, #    local_end 1965-10-31 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62004128400, #    utc_start 1965-10-31 09:00:00 (Sun)
  62019248400, #      utc_end 1966-04-24 09:00:00 (Sun)
  62004099600, #  local_start 1965-10-31 01:00:00 (Sun)
  62019219600, #    local_end 1966-04-24 01:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62019248400, #    utc_start 1966-04-24 09:00:00 (Sun)
  62035578000, #      utc_end 1966-10-30 09:00:00 (Sun)
  62019223200, #  local_start 1966-04-24 02:00:00 (Sun)
  62035552800, #    local_end 1966-10-30 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62035578000, #    utc_start 1966-10-30 09:00:00 (Sun)
  62041017600, #      utc_end 1967-01-01 08:00:00 (Sun)
  62035549200, #  local_start 1966-10-30 01:00:00 (Sun)
  62040988800, #    local_end 1967-01-01 00:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62041017600, #    utc_start 1967-01-01 08:00:00 (Sun)
  62051306400, #      utc_end 1967-04-30 10:00:00 (Sun)
  62040988800, #  local_start 1967-01-01 00:00:00 (Sun)
  62051277600, #    local_end 1967-04-30 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62051306400, #    utc_start 1967-04-30 10:00:00 (Sun)
  62067027600, #      utc_end 1967-10-29 09:00:00 (Sun)
  62051281200, #  local_start 1967-04-30 03:00:00 (Sun)
  62067002400, #    local_end 1967-10-29 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62067027600, #    utc_start 1967-10-29 09:00:00 (Sun)
  62082756000, #      utc_end 1968-04-28 10:00:00 (Sun)
  62066998800, #  local_start 1967-10-29 01:00:00 (Sun)
  62082727200, #    local_end 1968-04-28 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62082756000, #    utc_start 1968-04-28 10:00:00 (Sun)
  62098477200, #      utc_end 1968-10-27 09:00:00 (Sun)
  62082730800, #  local_start 1968-04-28 03:00:00 (Sun)
  62098452000, #    local_end 1968-10-27 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62098477200, #    utc_start 1968-10-27 09:00:00 (Sun)
  62114205600, #      utc_end 1969-04-27 10:00:00 (Sun)
  62098448400, #  local_start 1968-10-27 01:00:00 (Sun)
  62114176800, #    local_end 1969-04-27 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62114205600, #    utc_start 1969-04-27 10:00:00 (Sun)
  62129926800, #      utc_end 1969-10-26 09:00:00 (Sun)
  62114180400, #  local_start 1969-04-27 03:00:00 (Sun)
  62129901600, #    local_end 1969-10-26 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62129926800, #    utc_start 1969-10-26 09:00:00 (Sun)
  62145655200, #      utc_end 1970-04-26 10:00:00 (Sun)
  62129898000, #  local_start 1969-10-26 01:00:00 (Sun)
  62145626400, #    local_end 1970-04-26 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62145655200, #    utc_start 1970-04-26 10:00:00 (Sun)
  62161376400, #      utc_end 1970-10-25 09:00:00 (Sun)
  62145630000, #  local_start 1970-04-26 03:00:00 (Sun)
  62161351200, #    local_end 1970-10-25 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62161376400, #    utc_start 1970-10-25 09:00:00 (Sun)
  62177104800, #      utc_end 1971-04-25 10:00:00 (Sun)
  62161347600, #  local_start 1970-10-25 01:00:00 (Sun)
  62177076000, #    local_end 1971-04-25 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62177104800, #    utc_start 1971-04-25 10:00:00 (Sun)
  62193430800, #      utc_end 1971-10-31 09:00:00 (Sun)
  62177079600, #  local_start 1971-04-25 03:00:00 (Sun)
  62193405600, #    local_end 1971-10-31 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62193430800, #    utc_start 1971-10-31 09:00:00 (Sun)
  62209159200, #      utc_end 1972-04-30 10:00:00 (Sun)
  62193402000, #  local_start 1971-10-31 01:00:00 (Sun)
  62209130400, #    local_end 1972-04-30 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62209159200, #    utc_start 1972-04-30 10:00:00 (Sun)
  62224880400, #      utc_end 1972-10-29 09:00:00 (Sun)
  62209134000, #  local_start 1972-04-30 03:00:00 (Sun)
  62224855200, #    local_end 1972-10-29 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62224880400, #    utc_start 1972-10-29 09:00:00 (Sun)
  62240608800, #      utc_end 1973-04-29 10:00:00 (Sun)
  62224851600, #  local_start 1972-10-29 01:00:00 (Sun)
  62240580000, #    local_end 1973-04-29 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62240608800, #    utc_start 1973-04-29 10:00:00 (Sun)
  62256330000, #      utc_end 1973-10-28 09:00:00 (Sun)
  62240583600, #  local_start 1973-04-29 03:00:00 (Sun)
  62256304800, #    local_end 1973-10-28 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62256330000, #    utc_start 1973-10-28 09:00:00 (Sun)
  62262381600, #      utc_end 1974-01-06 10:00:00 (Sun)
  62256301200, #  local_start 1973-10-28 01:00:00 (Sun)
  62262352800, #    local_end 1974-01-06 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62262381600, #    utc_start 1974-01-06 10:00:00 (Sun)
  62287779600, #      utc_end 1974-10-27 09:00:00 (Sun)
  62262356400, #  local_start 1974-01-06 03:00:00 (Sun)
  62287754400, #    local_end 1974-10-27 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62287779600, #    utc_start 1974-10-27 09:00:00 (Sun)
  62298064800, #      utc_end 1975-02-23 10:00:00 (Sun)
  62287750800, #  local_start 1974-10-27 01:00:00 (Sun)
  62298036000, #    local_end 1975-02-23 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62298064800, #    utc_start 1975-02-23 10:00:00 (Sun)
  62319229200, #      utc_end 1975-10-26 09:00:00 (Sun)
  62298039600, #  local_start 1975-02-23 03:00:00 (Sun)
  62319204000, #    local_end 1975-10-26 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62319229200, #    utc_start 1975-10-26 09:00:00 (Sun)
  62334957600, #      utc_end 1976-04-25 10:00:00 (Sun)
  62319200400, #  local_start 1975-10-26 01:00:00 (Sun)
  62334928800, #    local_end 1976-04-25 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62334957600, #    utc_start 1976-04-25 10:00:00 (Sun)
  62351283600, #      utc_end 1976-10-31 09:00:00 (Sun)
  62334932400, #  local_start 1976-04-25 03:00:00 (Sun)
  62351258400, #    local_end 1976-10-31 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62351283600, #    utc_start 1976-10-31 09:00:00 (Sun)
  62366407200, #      utc_end 1977-04-24 10:00:00 (Sun)
  62351254800, #  local_start 1976-10-31 01:00:00 (Sun)
  62366378400, #    local_end 1977-04-24 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62366407200, #    utc_start 1977-04-24 10:00:00 (Sun)
  62382733200, #      utc_end 1977-10-30 09:00:00 (Sun)
  62366382000, #  local_start 1977-04-24 03:00:00 (Sun)
  62382708000, #    local_end 1977-10-30 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62382733200, #    utc_start 1977-10-30 09:00:00 (Sun)
  62398461600, #      utc_end 1978-04-30 10:00:00 (Sun)
  62382704400, #  local_start 1977-10-30 01:00:00 (Sun)
  62398432800, #    local_end 1978-04-30 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62398461600, #    utc_start 1978-04-30 10:00:00 (Sun)
  62414182800, #      utc_end 1978-10-29 09:00:00 (Sun)
  62398436400, #  local_start 1978-04-30 03:00:00 (Sun)
  62414157600, #    local_end 1978-10-29 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62414182800, #    utc_start 1978-10-29 09:00:00 (Sun)
  62429911200, #      utc_end 1979-04-29 10:00:00 (Sun)
  62414154000, #  local_start 1978-10-29 01:00:00 (Sun)
  62429882400, #    local_end 1979-04-29 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62429911200, #    utc_start 1979-04-29 10:00:00 (Sun)
  62445632400, #      utc_end 1979-10-28 09:00:00 (Sun)
  62429886000, #  local_start 1979-04-29 03:00:00 (Sun)
  62445607200, #    local_end 1979-10-28 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62445632400, #    utc_start 1979-10-28 09:00:00 (Sun)
  62461360800, #      utc_end 1980-04-27 10:00:00 (Sun)
  62445603600, #  local_start 1979-10-28 01:00:00 (Sun)
  62461332000, #    local_end 1980-04-27 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62461360800, #    utc_start 1980-04-27 10:00:00 (Sun)
  62477082000, #      utc_end 1980-10-26 09:00:00 (Sun)
  62461335600, #  local_start 1980-04-27 03:00:00 (Sun)
  62477056800, #    local_end 1980-10-26 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62477082000, #    utc_start 1980-10-26 09:00:00 (Sun)
  62492810400, #      utc_end 1981-04-26 10:00:00 (Sun)
  62477053200, #  local_start 1980-10-26 01:00:00 (Sun)
  62492781600, #    local_end 1981-04-26 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62492810400, #    utc_start 1981-04-26 10:00:00 (Sun)
  62508531600, #      utc_end 1981-10-25 09:00:00 (Sun)
  62492785200, #  local_start 1981-04-26 03:00:00 (Sun)
  62508506400, #    local_end 1981-10-25 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62508531600, #    utc_start 1981-10-25 09:00:00 (Sun)
  62524260000, #      utc_end 1982-04-25 10:00:00 (Sun)
  62508502800, #  local_start 1981-10-25 01:00:00 (Sun)
  62524231200, #    local_end 1982-04-25 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62524260000, #    utc_start 1982-04-25 10:00:00 (Sun)
  62540586000, #      utc_end 1982-10-31 09:00:00 (Sun)
  62524234800, #  local_start 1982-04-25 03:00:00 (Sun)
  62540560800, #    local_end 1982-10-31 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62540586000, #    utc_start 1982-10-31 09:00:00 (Sun)
  62555709600, #      utc_end 1983-04-24 10:00:00 (Sun)
  62540557200, #  local_start 1982-10-31 01:00:00 (Sun)
  62555680800, #    local_end 1983-04-24 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62555709600, #    utc_start 1983-04-24 10:00:00 (Sun)
  62572035600, #      utc_end 1983-10-30 09:00:00 (Sun)
  62555684400, #  local_start 1983-04-24 03:00:00 (Sun)
  62572010400, #    local_end 1983-10-30 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62572035600, #    utc_start 1983-10-30 09:00:00 (Sun)
  62587764000, #      utc_end 1984-04-29 10:00:00 (Sun)
  62572006800, #  local_start 1983-10-30 01:00:00 (Sun)
  62587735200, #    local_end 1984-04-29 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62587764000, #    utc_start 1984-04-29 10:00:00 (Sun)
  62603485200, #      utc_end 1984-10-28 09:00:00 (Sun)
  62587738800, #  local_start 1984-04-29 03:00:00 (Sun)
  62603460000, #    local_end 1984-10-28 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62603485200, #    utc_start 1984-10-28 09:00:00 (Sun)
  62619213600, #      utc_end 1985-04-28 10:00:00 (Sun)
  62603456400, #  local_start 1984-10-28 01:00:00 (Sun)
  62619184800, #    local_end 1985-04-28 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62619213600, #    utc_start 1985-04-28 10:00:00 (Sun)
  62634934800, #      utc_end 1985-10-27 09:00:00 (Sun)
  62619188400, #  local_start 1985-04-28 03:00:00 (Sun)
  62634909600, #    local_end 1985-10-27 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62634934800, #    utc_start 1985-10-27 09:00:00 (Sun)
  62650663200, #      utc_end 1986-04-27 10:00:00 (Sun)
  62634906000, #  local_start 1985-10-27 01:00:00 (Sun)
  62650634400, #    local_end 1986-04-27 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62650663200, #    utc_start 1986-04-27 10:00:00 (Sun)
  62666384400, #      utc_end 1986-10-26 09:00:00 (Sun)
  62650638000, #  local_start 1986-04-27 03:00:00 (Sun)
  62666359200, #    local_end 1986-10-26 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62666384400, #    utc_start 1986-10-26 09:00:00 (Sun)
  62680298400, #      utc_end 1987-04-05 10:00:00 (Sun)
  62666355600, #  local_start 1986-10-26 01:00:00 (Sun)
  62680269600, #    local_end 1987-04-05 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62680298400, #    utc_start 1987-04-05 10:00:00 (Sun)
  62697834000, #      utc_end 1987-10-25 09:00:00 (Sun)
  62680273200, #  local_start 1987-04-05 03:00:00 (Sun)
  62697808800, #    local_end 1987-10-25 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62697834000, #    utc_start 1987-10-25 09:00:00 (Sun)
  62711748000, #      utc_end 1988-04-03 10:00:00 (Sun)
  62697805200, #  local_start 1987-10-25 01:00:00 (Sun)
  62711719200, #    local_end 1988-04-03 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62711748000, #    utc_start 1988-04-03 10:00:00 (Sun)
  62729888400, #      utc_end 1988-10-30 09:00:00 (Sun)
  62711722800, #  local_start 1988-04-03 03:00:00 (Sun)
  62729863200, #    local_end 1988-10-30 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62729888400, #    utc_start 1988-10-30 09:00:00 (Sun)
  62743197600, #      utc_end 1989-04-02 10:00:00 (Sun)
  62729859600, #  local_start 1988-10-30 01:00:00 (Sun)
  62743168800, #    local_end 1989-04-02 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62743197600, #    utc_start 1989-04-02 10:00:00 (Sun)
  62761338000, #      utc_end 1989-10-29 09:00:00 (Sun)
  62743172400, #  local_start 1989-04-02 03:00:00 (Sun)
  62761312800, #    local_end 1989-10-29 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62761338000, #    utc_start 1989-10-29 09:00:00 (Sun)
  62774647200, #      utc_end 1990-04-01 10:00:00 (Sun)
  62761309200, #  local_start 1989-10-29 01:00:00 (Sun)
  62774618400, #    local_end 1990-04-01 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62774647200, #    utc_start 1990-04-01 10:00:00 (Sun)
  62792787600, #      utc_end 1990-10-28 09:00:00 (Sun)
  62774622000, #  local_start 1990-04-01 03:00:00 (Sun)
  62792762400, #    local_end 1990-10-28 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62792787600, #    utc_start 1990-10-28 09:00:00 (Sun)
  62806701600, #      utc_end 1991-04-07 10:00:00 (Sun)
  62792758800, #  local_start 1990-10-28 01:00:00 (Sun)
  62806672800, #    local_end 1991-04-07 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62806701600, #    utc_start 1991-04-07 10:00:00 (Sun)
  62824237200, #      utc_end 1991-10-27 09:00:00 (Sun)
  62806676400, #  local_start 1991-04-07 03:00:00 (Sun)
  62824212000, #    local_end 1991-10-27 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62824237200, #    utc_start 1991-10-27 09:00:00 (Sun)
  62838151200, #      utc_end 1992-04-05 10:00:00 (Sun)
  62824208400, #  local_start 1991-10-27 01:00:00 (Sun)
  62838122400, #    local_end 1992-04-05 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62838151200, #    utc_start 1992-04-05 10:00:00 (Sun)
  62855686800, #      utc_end 1992-10-25 09:00:00 (Sun)
  62838126000, #  local_start 1992-04-05 03:00:00 (Sun)
  62855661600, #    local_end 1992-10-25 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62855686800, #    utc_start 1992-10-25 09:00:00 (Sun)
  62869600800, #      utc_end 1993-04-04 10:00:00 (Sun)
  62855658000, #  local_start 1992-10-25 01:00:00 (Sun)
  62869572000, #    local_end 1993-04-04 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62869600800, #    utc_start 1993-04-04 10:00:00 (Sun)
  62887741200, #      utc_end 1993-10-31 09:00:00 (Sun)
  62869575600, #  local_start 1993-04-04 03:00:00 (Sun)
  62887716000, #    local_end 1993-10-31 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62887741200, #    utc_start 1993-10-31 09:00:00 (Sun)
  62901050400, #      utc_end 1994-04-03 10:00:00 (Sun)
  62887712400, #  local_start 1993-10-31 01:00:00 (Sun)
  62901021600, #    local_end 1994-04-03 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62901050400, #    utc_start 1994-04-03 10:00:00 (Sun)
  62919190800, #      utc_end 1994-10-30 09:00:00 (Sun)
  62901025200, #  local_start 1994-04-03 03:00:00 (Sun)
  62919165600, #    local_end 1994-10-30 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62919190800, #    utc_start 1994-10-30 09:00:00 (Sun)
  62932500000, #      utc_end 1995-04-02 10:00:00 (Sun)
  62919162000, #  local_start 1994-10-30 01:00:00 (Sun)
  62932471200, #    local_end 1995-04-02 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62932500000, #    utc_start 1995-04-02 10:00:00 (Sun)
  62950640400, #      utc_end 1995-10-29 09:00:00 (Sun)
  62932474800, #  local_start 1995-04-02 03:00:00 (Sun)
  62950615200, #    local_end 1995-10-29 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62950640400, #    utc_start 1995-10-29 09:00:00 (Sun)
  62964554400, #      utc_end 1996-04-07 10:00:00 (Sun)
  62950611600, #  local_start 1995-10-29 01:00:00 (Sun)
  62964525600, #    local_end 1996-04-07 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62964554400, #    utc_start 1996-04-07 10:00:00 (Sun)
  62982090000, #      utc_end 1996-10-27 09:00:00 (Sun)
  62964529200, #  local_start 1996-04-07 03:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62982090000, #    utc_start 1996-10-27 09:00:00 (Sun)
  62996004000, #      utc_end 1997-04-06 10:00:00 (Sun)
  62982061200, #  local_start 1996-10-27 01:00:00 (Sun)
  62995975200, #    local_end 1997-04-06 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62996004000, #    utc_start 1997-04-06 10:00:00 (Sun)
  63013539600, #      utc_end 1997-10-26 09:00:00 (Sun)
  62995978800, #  local_start 1997-04-06 03:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63013539600, #    utc_start 1997-10-26 09:00:00 (Sun)
  63027453600, #      utc_end 1998-04-05 10:00:00 (Sun)
  63013510800, #  local_start 1997-10-26 01:00:00 (Sun)
  63027424800, #    local_end 1998-04-05 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63027453600, #    utc_start 1998-04-05 10:00:00 (Sun)
  63044989200, #      utc_end 1998-10-25 09:00:00 (Sun)
  63027428400, #  local_start 1998-04-05 03:00:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63044989200, #    utc_start 1998-10-25 09:00:00 (Sun)
  63058903200, #      utc_end 1999-04-04 10:00:00 (Sun)
  63044960400, #  local_start 1998-10-25 01:00:00 (Sun)
  63058874400, #    local_end 1999-04-04 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63058903200, #    utc_start 1999-04-04 10:00:00 (Sun)
  63077043600, #      utc_end 1999-10-31 09:00:00 (Sun)
  63058878000, #  local_start 1999-04-04 03:00:00 (Sun)
  63077018400, #    local_end 1999-10-31 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63077043600, #    utc_start 1999-10-31 09:00:00 (Sun)
  63090352800, #      utc_end 2000-04-02 10:00:00 (Sun)
  63077014800, #  local_start 1999-10-31 01:00:00 (Sun)
  63090324000, #    local_end 2000-04-02 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63090352800, #    utc_start 2000-04-02 10:00:00 (Sun)
  63108493200, #      utc_end 2000-10-29 09:00:00 (Sun)
  63090327600, #  local_start 2000-04-02 03:00:00 (Sun)
  63108468000, #    local_end 2000-10-29 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63108493200, #    utc_start 2000-10-29 09:00:00 (Sun)
  63121802400, #      utc_end 2001-04-01 10:00:00 (Sun)
  63108464400, #  local_start 2000-10-29 01:00:00 (Sun)
  63121773600, #    local_end 2001-04-01 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63121802400, #    utc_start 2001-04-01 10:00:00 (Sun)
  63139942800, #      utc_end 2001-10-28 09:00:00 (Sun)
  63121777200, #  local_start 2001-04-01 03:00:00 (Sun)
  63139917600, #    local_end 2001-10-28 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63139942800, #    utc_start 2001-10-28 09:00:00 (Sun)
  63153856800, #      utc_end 2002-04-07 10:00:00 (Sun)
  63139914000, #  local_start 2001-10-28 01:00:00 (Sun)
  63153828000, #    local_end 2002-04-07 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63153856800, #    utc_start 2002-04-07 10:00:00 (Sun)
  63171392400, #      utc_end 2002-10-27 09:00:00 (Sun)
  63153831600, #  local_start 2002-04-07 03:00:00 (Sun)
  63171367200, #    local_end 2002-10-27 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63171392400, #    utc_start 2002-10-27 09:00:00 (Sun)
  63185306400, #      utc_end 2003-04-06 10:00:00 (Sun)
  63171363600, #  local_start 2002-10-27 01:00:00 (Sun)
  63185277600, #    local_end 2003-04-06 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63185306400, #    utc_start 2003-04-06 10:00:00 (Sun)
  63202842000, #      utc_end 2003-10-26 09:00:00 (Sun)
  63185281200, #  local_start 2003-04-06 03:00:00 (Sun)
  63202816800, #    local_end 2003-10-26 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63202842000, #    utc_start 2003-10-26 09:00:00 (Sun)
  63216756000, #      utc_end 2004-04-04 10:00:00 (Sun)
  63202813200, #  local_start 2003-10-26 01:00:00 (Sun)
  63216727200, #    local_end 2004-04-04 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63216756000, #    utc_start 2004-04-04 10:00:00 (Sun)
  63234896400, #      utc_end 2004-10-31 09:00:00 (Sun)
  63216730800, #  local_start 2004-04-04 03:00:00 (Sun)
  63234871200, #    local_end 2004-10-31 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63234896400, #    utc_start 2004-10-31 09:00:00 (Sun)
  63248205600, #      utc_end 2005-04-03 10:00:00 (Sun)
  63234867600, #  local_start 2004-10-31 01:00:00 (Sun)
  63248176800, #    local_end 2005-04-03 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63248205600, #    utc_start 2005-04-03 10:00:00 (Sun)
  63266346000, #      utc_end 2005-10-30 09:00:00 (Sun)
  63248180400, #  local_start 2005-04-03 03:00:00 (Sun)
  63266320800, #    local_end 2005-10-30 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63266346000, #    utc_start 2005-10-30 09:00:00 (Sun)
  63279655200, #      utc_end 2006-04-02 10:00:00 (Sun)
  63266317200, #  local_start 2005-10-30 01:00:00 (Sun)
  63279626400, #    local_end 2006-04-02 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63279655200, #    utc_start 2006-04-02 10:00:00 (Sun)
  63297795600, #      utc_end 2006-10-29 09:00:00 (Sun)
  63279630000, #  local_start 2006-04-02 03:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63297795600, #    utc_start 2006-10-29 09:00:00 (Sun)
  63309290400, #      utc_end 2007-03-11 10:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63309261600, #    local_end 2007-03-11 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63309290400, #    utc_start 2007-03-11 10:00:00 (Sun)
  63329850000, #      utc_end 2007-11-04 09:00:00 (Sun)
  63309265200, #  local_start 2007-03-11 03:00:00 (Sun)
  63329824800, #    local_end 2007-11-04 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63329850000, #    utc_start 2007-11-04 09:00:00 (Sun)
  63340740000, #      utc_end 2008-03-09 10:00:00 (Sun)
  63329821200, #  local_start 2007-11-04 01:00:00 (Sun)
  63340711200, #    local_end 2008-03-09 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63340740000, #    utc_start 2008-03-09 10:00:00 (Sun)
  63361299600, #      utc_end 2008-11-02 09:00:00 (Sun)
  63340714800, #  local_start 2008-03-09 03:00:00 (Sun)
  63361274400, #    local_end 2008-11-02 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63361299600, #    utc_start 2008-11-02 09:00:00 (Sun)
  63372189600, #      utc_end 2009-03-08 10:00:00 (Sun)
  63361270800, #  local_start 2008-11-02 01:00:00 (Sun)
  63372160800, #    local_end 2009-03-08 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63372189600, #    utc_start 2009-03-08 10:00:00 (Sun)
  63392749200, #      utc_end 2009-11-01 09:00:00 (Sun)
  63372164400, #  local_start 2009-03-08 03:00:00 (Sun)
  63392724000, #    local_end 2009-11-01 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63392749200, #    utc_start 2009-11-01 09:00:00 (Sun)
  63404244000, #      utc_end 2010-03-14 10:00:00 (Sun)
  63392720400, #  local_start 2009-11-01 01:00:00 (Sun)
  63404215200, #    local_end 2010-03-14 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63404244000, #    utc_start 2010-03-14 10:00:00 (Sun)
  63424803600, #      utc_end 2010-11-07 09:00:00 (Sun)
  63404218800, #  local_start 2010-03-14 03:00:00 (Sun)
  63424778400, #    local_end 2010-11-07 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63424803600, #    utc_start 2010-11-07 09:00:00 (Sun)
  63435693600, #      utc_end 2011-03-13 10:00:00 (Sun)
  63424774800, #  local_start 2010-11-07 01:00:00 (Sun)
  63435664800, #    local_end 2011-03-13 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63435693600, #    utc_start 2011-03-13 10:00:00 (Sun)
  63456253200, #      utc_end 2011-11-06 09:00:00 (Sun)
  63435668400, #  local_start 2011-03-13 03:00:00 (Sun)
  63456228000, #    local_end 2011-11-06 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63456253200, #    utc_start 2011-11-06 09:00:00 (Sun)
  63467143200, #      utc_end 2012-03-11 10:00:00 (Sun)
  63456224400, #  local_start 2011-11-06 01:00:00 (Sun)
  63467114400, #    local_end 2012-03-11 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63467143200, #    utc_start 2012-03-11 10:00:00 (Sun)
  63487702800, #      utc_end 2012-11-04 09:00:00 (Sun)
  63467118000, #  local_start 2012-03-11 03:00:00 (Sun)
  63487677600, #    local_end 2012-11-04 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63487702800, #    utc_start 2012-11-04 09:00:00 (Sun)
  63498592800, #      utc_end 2013-03-10 10:00:00 (Sun)
  63487674000, #  local_start 2012-11-04 01:00:00 (Sun)
  63498564000, #    local_end 2013-03-10 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63498592800, #    utc_start 2013-03-10 10:00:00 (Sun)
  63519152400, #      utc_end 2013-11-03 09:00:00 (Sun)
  63498567600, #  local_start 2013-03-10 03:00:00 (Sun)
  63519127200, #    local_end 2013-11-03 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63519152400, #    utc_start 2013-11-03 09:00:00 (Sun)
  63530042400, #      utc_end 2014-03-09 10:00:00 (Sun)
  63519123600, #  local_start 2013-11-03 01:00:00 (Sun)
  63530013600, #    local_end 2014-03-09 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63530042400, #    utc_start 2014-03-09 10:00:00 (Sun)
  63550602000, #      utc_end 2014-11-02 09:00:00 (Sun)
  63530017200, #  local_start 2014-03-09 03:00:00 (Sun)
  63550576800, #    local_end 2014-11-02 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63550602000, #    utc_start 2014-11-02 09:00:00 (Sun)
  63561492000, #      utc_end 2015-03-08 10:00:00 (Sun)
  63550573200, #  local_start 2014-11-02 01:00:00 (Sun)
  63561463200, #    local_end 2015-03-08 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63561492000, #    utc_start 2015-03-08 10:00:00 (Sun)
  63582051600, #      utc_end 2015-11-01 09:00:00 (Sun)
  63561466800, #  local_start 2015-03-08 03:00:00 (Sun)
  63582026400, #    local_end 2015-11-01 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63582051600, #    utc_start 2015-11-01 09:00:00 (Sun)
  63593546400, #      utc_end 2016-03-13 10:00:00 (Sun)
  63582022800, #  local_start 2015-11-01 01:00:00 (Sun)
  63593517600, #    local_end 2016-03-13 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63593546400, #    utc_start 2016-03-13 10:00:00 (Sun)
  63614106000, #      utc_end 2016-11-06 09:00:00 (Sun)
  63593521200, #  local_start 2016-03-13 03:00:00 (Sun)
  63614080800, #    local_end 2016-11-06 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63614106000, #    utc_start 2016-11-06 09:00:00 (Sun)
  63624996000, #      utc_end 2017-03-12 10:00:00 (Sun)
  63614077200, #  local_start 2016-11-06 01:00:00 (Sun)
  63624967200, #    local_end 2017-03-12 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63624996000, #    utc_start 2017-03-12 10:00:00 (Sun)
  63645555600, #      utc_end 2017-11-05 09:00:00 (Sun)
  63624970800, #  local_start 2017-03-12 03:00:00 (Sun)
  63645530400, #    local_end 2017-11-05 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63645555600, #    utc_start 2017-11-05 09:00:00 (Sun)
  63656445600, #      utc_end 2018-03-11 10:00:00 (Sun)
  63645526800, #  local_start 2017-11-05 01:00:00 (Sun)
  63656416800, #    local_end 2018-03-11 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63656445600, #    utc_start 2018-03-11 10:00:00 (Sun)
  63677005200, #      utc_end 2018-11-04 09:00:00 (Sun)
  63656420400, #  local_start 2018-03-11 03:00:00 (Sun)
  63676980000, #    local_end 2018-11-04 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63677005200, #    utc_start 2018-11-04 09:00:00 (Sun)
  63687895200, #      utc_end 2019-03-10 10:00:00 (Sun)
  63676976400, #  local_start 2018-11-04 01:00:00 (Sun)
  63687866400, #    local_end 2019-03-10 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63687895200, #    utc_start 2019-03-10 10:00:00 (Sun)
  63708454800, #      utc_end 2019-11-03 09:00:00 (Sun)
  63687870000, #  local_start 2019-03-10 03:00:00 (Sun)
  63708429600, #    local_end 2019-11-03 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63708454800, #    utc_start 2019-11-03 09:00:00 (Sun)
  63719344800, #      utc_end 2020-03-08 10:00:00 (Sun)
  63708426000, #  local_start 2019-11-03 01:00:00 (Sun)
  63719316000, #    local_end 2020-03-08 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63719344800, #    utc_start 2020-03-08 10:00:00 (Sun)
  63739904400, #      utc_end 2020-11-01 09:00:00 (Sun)
  63719319600, #  local_start 2020-03-08 03:00:00 (Sun)
  63739879200, #    local_end 2020-11-01 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63739904400, #    utc_start 2020-11-01 09:00:00 (Sun)
  63751399200, #      utc_end 2021-03-14 10:00:00 (Sun)
  63739875600, #  local_start 2020-11-01 01:00:00 (Sun)
  63751370400, #    local_end 2021-03-14 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63751399200, #    utc_start 2021-03-14 10:00:00 (Sun)
  63771958800, #      utc_end 2021-11-07 09:00:00 (Sun)
  63751374000, #  local_start 2021-03-14 03:00:00 (Sun)
  63771933600, #    local_end 2021-11-07 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63771958800, #    utc_start 2021-11-07 09:00:00 (Sun)
  63782848800, #      utc_end 2022-03-13 10:00:00 (Sun)
  63771930000, #  local_start 2021-11-07 01:00:00 (Sun)
  63782820000, #    local_end 2022-03-13 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63782848800, #    utc_start 2022-03-13 10:00:00 (Sun)
  63803408400, #      utc_end 2022-11-06 09:00:00 (Sun)
  63782823600, #  local_start 2022-03-13 03:00:00 (Sun)
  63803383200, #    local_end 2022-11-06 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63803408400, #    utc_start 2022-11-06 09:00:00 (Sun)
  63814298400, #      utc_end 2023-03-12 10:00:00 (Sun)
  63803379600, #  local_start 2022-11-06 01:00:00 (Sun)
  63814269600, #    local_end 2023-03-12 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63814298400, #    utc_start 2023-03-12 10:00:00 (Sun)
  63834858000, #      utc_end 2023-11-05 09:00:00 (Sun)
  63814273200, #  local_start 2023-03-12 03:00:00 (Sun)
  63834832800, #    local_end 2023-11-05 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63834858000, #    utc_start 2023-11-05 09:00:00 (Sun)
  63845748000, #      utc_end 2024-03-10 10:00:00 (Sun)
  63834829200, #  local_start 2023-11-05 01:00:00 (Sun)
  63845719200, #    local_end 2024-03-10 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63845748000, #    utc_start 2024-03-10 10:00:00 (Sun)
  63866307600, #      utc_end 2024-11-03 09:00:00 (Sun)
  63845722800, #  local_start 2024-03-10 03:00:00 (Sun)
  63866282400, #    local_end 2024-11-03 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63866307600, #    utc_start 2024-11-03 09:00:00 (Sun)
  63877197600, #      utc_end 2025-03-09 10:00:00 (Sun)
  63866278800, #  local_start 2024-11-03 01:00:00 (Sun)
  63877168800, #    local_end 2025-03-09 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63877197600, #    utc_start 2025-03-09 10:00:00 (Sun)
  63897757200, #      utc_end 2025-11-02 09:00:00 (Sun)
  63877172400, #  local_start 2025-03-09 03:00:00 (Sun)
  63897732000, #    local_end 2025-11-02 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63897757200, #    utc_start 2025-11-02 09:00:00 (Sun)
  63908647200, #      utc_end 2026-03-08 10:00:00 (Sun)
  63897728400, #  local_start 2025-11-02 01:00:00 (Sun)
  63908618400, #    local_end 2026-03-08 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63908647200, #    utc_start 2026-03-08 10:00:00 (Sun)
  63929206800, #      utc_end 2026-11-01 09:00:00 (Sun)
  63908622000, #  local_start 2026-03-08 03:00:00 (Sun)
  63929181600, #    local_end 2026-11-01 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63929206800, #    utc_start 2026-11-01 09:00:00 (Sun)
  63940701600, #      utc_end 2027-03-14 10:00:00 (Sun)
  63929178000, #  local_start 2026-11-01 01:00:00 (Sun)
  63940672800, #    local_end 2027-03-14 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63940701600, #    utc_start 2027-03-14 10:00:00 (Sun)
  63961261200, #      utc_end 2027-11-07 09:00:00 (Sun)
  63940676400, #  local_start 2027-03-14 03:00:00 (Sun)
  63961236000, #    local_end 2027-11-07 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63961261200, #    utc_start 2027-11-07 09:00:00 (Sun)
  63972151200, #      utc_end 2028-03-12 10:00:00 (Sun)
  63961232400, #  local_start 2027-11-07 01:00:00 (Sun)
  63972122400, #    local_end 2028-03-12 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63972151200, #    utc_start 2028-03-12 10:00:00 (Sun)
  63992710800, #      utc_end 2028-11-05 09:00:00 (Sun)
  63972126000, #  local_start 2028-03-12 03:00:00 (Sun)
  63992685600, #    local_end 2028-11-05 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63992710800, #    utc_start 2028-11-05 09:00:00 (Sun)
  64003600800, #      utc_end 2029-03-11 10:00:00 (Sun)
  63992682000, #  local_start 2028-11-05 01:00:00 (Sun)
  64003572000, #    local_end 2029-03-11 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  64003600800, #    utc_start 2029-03-11 10:00:00 (Sun)
  64024160400, #      utc_end 2029-11-04 09:00:00 (Sun)
  64003575600, #  local_start 2029-03-11 03:00:00 (Sun)
  64024135200, #    local_end 2029-11-04 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  64024160400, #    utc_start 2029-11-04 09:00:00 (Sun)
  64035050400, #      utc_end 2030-03-10 10:00:00 (Sun)
  64024131600, #  local_start 2029-11-04 01:00:00 (Sun)
  64035021600, #    local_end 2030-03-10 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  64035050400, #    utc_start 2030-03-10 10:00:00 (Sun)
  64055610000, #      utc_end 2030-11-03 09:00:00 (Sun)
  64035025200, #  local_start 2030-03-10 03:00:00 (Sun)
  64055584800, #    local_end 2030-11-03 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {86}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -28800 }
  
  my $last_observance = bless( {
    'format' => 'P%sT',
    'gmtoff' => '-8:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 718067,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 718067,
      'utc_rd_secs' => 0,
      'utc_year' => 1968
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -28800,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 718067,
      'local_rd_secs' => 28800,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 718067,
      'utc_rd_secs' => 28800,
      'utc_year' => 1968
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Nov',
      'letter' => 'S',
      'name' => 'US',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Mar',
      'letter' => 'D',
      'name' => 'US',
      'offset_from_std' => 3600,
      'on' => 'Sun>=8',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_LOS_ANGELES

    $main::fatpacked{"DateTime/TimeZone/America/Maceio.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_MACEIO';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/southamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Maceio;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Maceio::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60368466172, #      utc_end 1914-01-01 02:22:52 (Thu)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60368457600, #    local_end 1914-01-01 00:00:00 (Thu)
  -8572,
  0,
  'LMT',
      ],
      [
  60368466172, #    utc_start 1914-01-01 02:22:52 (Thu)
  60928725600, #      utc_end 1931-10-03 14:00:00 (Sat)
  60368455372, #  local_start 1913-12-31 23:22:52 (Wed)
  60928714800, #    local_end 1931-10-03 11:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  60928725600, #    utc_start 1931-10-03 14:00:00 (Sat)
  60944320800, #      utc_end 1932-04-01 02:00:00 (Fri)
  60928718400, #  local_start 1931-10-03 12:00:00 (Sat)
  60944313600, #    local_end 1932-04-01 00:00:00 (Fri)
  -7200,
  1,
  '-02',
      ],
      [
  60944320800, #    utc_start 1932-04-01 02:00:00 (Fri)
  60960308400, #      utc_end 1932-10-03 03:00:00 (Mon)
  60944310000, #  local_start 1932-03-31 23:00:00 (Thu)
  60960297600, #    local_end 1932-10-03 00:00:00 (Mon)
  -10800,
  0,
  '-03',
      ],
      [
  60960308400, #    utc_start 1932-10-03 03:00:00 (Mon)
  60975856800, #      utc_end 1933-04-01 02:00:00 (Sat)
  60960301200, #  local_start 1932-10-03 01:00:00 (Mon)
  60975849600, #    local_end 1933-04-01 00:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  60975856800, #    utc_start 1933-04-01 02:00:00 (Sat)
  61501863600, #      utc_end 1949-12-01 03:00:00 (Thu)
  60975846000, #  local_start 1933-03-31 23:00:00 (Fri)
  61501852800, #    local_end 1949-12-01 00:00:00 (Thu)
  -10800,
  0,
  '-03',
      ],
      [
  61501863600, #    utc_start 1949-12-01 03:00:00 (Thu)
  61513614000, #      utc_end 1950-04-16 03:00:00 (Sun)
  61501856400, #  local_start 1949-12-01 01:00:00 (Thu)
  61513606800, #    local_end 1950-04-16 01:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  61513614000, #    utc_start 1950-04-16 03:00:00 (Sun)
  61533399600, #      utc_end 1950-12-01 03:00:00 (Fri)
  61513603200, #  local_start 1950-04-16 00:00:00 (Sun)
  61533388800, #    local_end 1950-12-01 00:00:00 (Fri)
  -10800,
  0,
  '-03',
      ],
      [
  61533399600, #    utc_start 1950-12-01 03:00:00 (Fri)
  61543850400, #      utc_end 1951-04-01 02:00:00 (Sun)
  61533392400, #  local_start 1950-12-01 01:00:00 (Fri)
  61543843200, #    local_end 1951-04-01 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  61543850400, #    utc_start 1951-04-01 02:00:00 (Sun)
  61564935600, #      utc_end 1951-12-01 03:00:00 (Sat)
  61543839600, #  local_start 1951-03-31 23:00:00 (Sat)
  61564924800, #    local_end 1951-12-01 00:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  61564935600, #    utc_start 1951-12-01 03:00:00 (Sat)
  61575472800, #      utc_end 1952-04-01 02:00:00 (Tue)
  61564928400, #  local_start 1951-12-01 01:00:00 (Sat)
  61575465600, #    local_end 1952-04-01 00:00:00 (Tue)
  -7200,
  1,
  '-02',
      ],
      [
  61575472800, #    utc_start 1952-04-01 02:00:00 (Tue)
  61596558000, #      utc_end 1952-12-01 03:00:00 (Mon)
  61575462000, #  local_start 1952-03-31 23:00:00 (Mon)
  61596547200, #    local_end 1952-12-01 00:00:00 (Mon)
  -10800,
  0,
  '-03',
      ],
      [
  61596558000, #    utc_start 1952-12-01 03:00:00 (Mon)
  61604330400, #      utc_end 1953-03-01 02:00:00 (Sun)
  61596550800, #  local_start 1952-12-01 01:00:00 (Mon)
  61604323200, #    local_end 1953-03-01 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  61604330400, #    utc_start 1953-03-01 02:00:00 (Sun)
  61944318000, #      utc_end 1963-12-09 03:00:00 (Mon)
  61604319600, #  local_start 1953-02-28 23:00:00 (Sat)
  61944307200, #    local_end 1963-12-09 00:00:00 (Mon)
  -10800,
  0,
  '-03',
      ],
      [
  61944318000, #    utc_start 1963-12-09 03:00:00 (Mon)
  61951485600, #      utc_end 1964-03-01 02:00:00 (Sun)
  61944310800, #  local_start 1963-12-09 01:00:00 (Mon)
  61951478400, #    local_end 1964-03-01 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  61951485600, #    utc_start 1964-03-01 02:00:00 (Sun)
  61980519600, #      utc_end 1965-01-31 03:00:00 (Sun)
  61951474800, #  local_start 1964-02-29 23:00:00 (Sat)
  61980508800, #    local_end 1965-01-31 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  61980519600, #    utc_start 1965-01-31 03:00:00 (Sun)
  61985613600, #      utc_end 1965-03-31 02:00:00 (Wed)
  61980512400, #  local_start 1965-01-31 01:00:00 (Sun)
  61985606400, #    local_end 1965-03-31 00:00:00 (Wed)
  -7200,
  1,
  '-02',
      ],
      [
  61985613600, #    utc_start 1965-03-31 02:00:00 (Wed)
  62006785200, #      utc_end 1965-12-01 03:00:00 (Wed)
  61985602800, #  local_start 1965-03-30 23:00:00 (Tue)
  62006774400, #    local_end 1965-12-01 00:00:00 (Wed)
  -10800,
  0,
  '-03',
      ],
      [
  62006785200, #    utc_start 1965-12-01 03:00:00 (Wed)
  62014557600, #      utc_end 1966-03-01 02:00:00 (Tue)
  62006778000, #  local_start 1965-12-01 01:00:00 (Wed)
  62014550400, #    local_end 1966-03-01 00:00:00 (Tue)
  -7200,
  1,
  '-02',
      ],
      [
  62014557600, #    utc_start 1966-03-01 02:00:00 (Tue)
  62035729200, #      utc_end 1966-11-01 03:00:00 (Tue)
  62014546800, #  local_start 1966-02-28 23:00:00 (Mon)
  62035718400, #    local_end 1966-11-01 00:00:00 (Tue)
  -10800,
  0,
  '-03',
      ],
      [
  62035729200, #    utc_start 1966-11-01 03:00:00 (Tue)
  62046093600, #      utc_end 1967-03-01 02:00:00 (Wed)
  62035722000, #  local_start 1966-11-01 01:00:00 (Tue)
  62046086400, #    local_end 1967-03-01 00:00:00 (Wed)
  -7200,
  1,
  '-02',
      ],
      [
  62046093600, #    utc_start 1967-03-01 02:00:00 (Wed)
  62067265200, #      utc_end 1967-11-01 03:00:00 (Wed)
  62046082800, #  local_start 1967-02-28 23:00:00 (Tue)
  62067254400, #    local_end 1967-11-01 00:00:00 (Wed)
  -10800,
  0,
  '-03',
      ],
      [
  62067265200, #    utc_start 1967-11-01 03:00:00 (Wed)
  62077716000, #      utc_end 1968-03-01 02:00:00 (Fri)
  62067258000, #  local_start 1967-11-01 01:00:00 (Wed)
  62077708800, #    local_end 1968-03-01 00:00:00 (Fri)
  -7200,
  1,
  '-02',
      ],
      [
  62077716000, #    utc_start 1968-03-01 02:00:00 (Fri)
  62635431600, #      utc_end 1985-11-02 03:00:00 (Sat)
  62077705200, #  local_start 1968-02-29 23:00:00 (Thu)
  62635420800, #    local_end 1985-11-02 00:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  62635431600, #    utc_start 1985-11-02 03:00:00 (Sat)
  62646919200, #      utc_end 1986-03-15 02:00:00 (Sat)
  62635424400, #  local_start 1985-11-02 01:00:00 (Sat)
  62646912000, #    local_end 1986-03-15 00:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  62646919200, #    utc_start 1986-03-15 02:00:00 (Sat)
  62666276400, #      utc_end 1986-10-25 03:00:00 (Sat)
  62646908400, #  local_start 1986-03-14 23:00:00 (Fri)
  62666265600, #    local_end 1986-10-25 00:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  62666276400, #    utc_start 1986-10-25 03:00:00 (Sat)
  62675949600, #      utc_end 1987-02-14 02:00:00 (Sat)
  62666269200, #  local_start 1986-10-25 01:00:00 (Sat)
  62675942400, #    local_end 1987-02-14 00:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  62675949600, #    utc_start 1987-02-14 02:00:00 (Sat)
  62697812400, #      utc_end 1987-10-25 03:00:00 (Sun)
  62675938800, #  local_start 1987-02-13 23:00:00 (Fri)
  62697801600, #    local_end 1987-10-25 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62697812400, #    utc_start 1987-10-25 03:00:00 (Sun)
  62706880800, #      utc_end 1988-02-07 02:00:00 (Sun)
  62697805200, #  local_start 1987-10-25 01:00:00 (Sun)
  62706873600, #    local_end 1988-02-07 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62706880800, #    utc_start 1988-02-07 02:00:00 (Sun)
  62728657200, #      utc_end 1988-10-16 03:00:00 (Sun)
  62706870000, #  local_start 1988-02-06 23:00:00 (Sat)
  62728646400, #    local_end 1988-10-16 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62728657200, #    utc_start 1988-10-16 03:00:00 (Sun)
  62737725600, #      utc_end 1989-01-29 02:00:00 (Sun)
  62728650000, #  local_start 1988-10-16 01:00:00 (Sun)
  62737718400, #    local_end 1989-01-29 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62737725600, #    utc_start 1989-01-29 02:00:00 (Sun)
  62760106800, #      utc_end 1989-10-15 03:00:00 (Sun)
  62737714800, #  local_start 1989-01-28 23:00:00 (Sat)
  62760096000, #    local_end 1989-10-15 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62760106800, #    utc_start 1989-10-15 03:00:00 (Sun)
  62770384800, #      utc_end 1990-02-11 02:00:00 (Sun)
  62760099600, #  local_start 1989-10-15 01:00:00 (Sun)
  62770377600, #    local_end 1990-02-11 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62770384800, #    utc_start 1990-02-11 02:00:00 (Sun)
  62789223600, #      utc_end 1990-09-17 03:00:00 (Mon)
  62770374000, #  local_start 1990-02-10 23:00:00 (Sat)
  62789212800, #    local_end 1990-09-17 00:00:00 (Mon)
  -10800,
  0,
  '-03',
      ],
      [
  62789223600, #    utc_start 1990-09-17 03:00:00 (Mon)
  62949236400, #      utc_end 1995-10-13 03:00:00 (Fri)
  62789212800, #  local_start 1990-09-17 00:00:00 (Mon)
  62949225600, #    local_end 1995-10-13 00:00:00 (Fri)
  -10800,
  0,
  '-03',
      ],
      [
  62949236400, #    utc_start 1995-10-13 03:00:00 (Fri)
  62949409200, #      utc_end 1995-10-15 03:00:00 (Sun)
  62949225600, #  local_start 1995-10-13 00:00:00 (Fri)
  62949398400, #    local_end 1995-10-15 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62949409200, #    utc_start 1995-10-15 03:00:00 (Sun)
  62959687200, #      utc_end 1996-02-11 02:00:00 (Sun)
  62949402000, #  local_start 1995-10-15 01:00:00 (Sun)
  62959680000, #    local_end 1996-02-11 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62959687200, #    utc_start 1996-02-11 02:00:00 (Sun)
  62977489200, #      utc_end 1996-09-04 03:00:00 (Wed)
  62959676400, #  local_start 1996-02-10 23:00:00 (Sat)
  62977478400, #    local_end 1996-09-04 00:00:00 (Wed)
  -10800,
  0,
  '-03',
      ],
      [
  62977489200, #    utc_start 1996-09-04 03:00:00 (Wed)
  63074343600, #      utc_end 1999-09-30 03:00:00 (Thu)
  62977478400, #  local_start 1996-09-04 00:00:00 (Wed)
  63074332800, #    local_end 1999-09-30 00:00:00 (Thu)
  -10800,
  0,
  '-03',
      ],
      [
  63074343600, #    utc_start 1999-09-30 03:00:00 (Thu)
  63074602800, #      utc_end 1999-10-03 03:00:00 (Sun)
  63074332800, #  local_start 1999-09-30 00:00:00 (Thu)
  63074592000, #    local_end 1999-10-03 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63074602800, #    utc_start 1999-10-03 03:00:00 (Sun)
  63087300000, #      utc_end 2000-02-27 02:00:00 (Sun)
  63074595600, #  local_start 1999-10-03 01:00:00 (Sun)
  63087292800, #    local_end 2000-02-27 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63087300000, #    utc_start 2000-02-27 02:00:00 (Sun)
  63106657200, #      utc_end 2000-10-08 03:00:00 (Sun)
  63087289200, #  local_start 2000-02-26 23:00:00 (Sat)
  63106646400, #    local_end 2000-10-08 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63106657200, #    utc_start 2000-10-08 03:00:00 (Sun)
  63107863200, #      utc_end 2000-10-22 02:00:00 (Sun)
  63106650000, #  local_start 2000-10-08 01:00:00 (Sun)
  63107856000, #    local_end 2000-10-22 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63107863200, #    utc_start 2000-10-22 02:00:00 (Sun)
  63136033200, #      utc_end 2001-09-13 03:00:00 (Thu)
  63107852400, #  local_start 2000-10-21 23:00:00 (Sat)
  63136022400, #    local_end 2001-09-13 00:00:00 (Thu)
  -10800,
  0,
  '-03',
      ],
      [
  63136033200, #    utc_start 2001-09-13 03:00:00 (Thu)
  63138711600, #      utc_end 2001-10-14 03:00:00 (Sun)
  63136022400, #  local_start 2001-09-13 00:00:00 (Thu)
  63138700800, #    local_end 2001-10-14 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63138711600, #    utc_start 2001-10-14 03:00:00 (Sun)
  63149594400, #      utc_end 2002-02-17 02:00:00 (Sun)
  63138704400, #  local_start 2001-10-14 01:00:00 (Sun)
  63149587200, #    local_end 2002-02-17 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63149594400, #    utc_start 2002-02-17 02:00:00 (Sun)
  63169124400, #      utc_end 2002-10-01 03:00:00 (Tue)
  63149583600, #  local_start 2002-02-16 23:00:00 (Sat)
  63169113600, #    local_end 2002-10-01 00:00:00 (Tue)
  -10800,
  0,
  '-03',
      ],
      [
  63169124400, #    utc_start 2002-10-01 03:00:00 (Tue)
  DateTime::TimeZone::INFINITY, #      utc_end
  63169113600, #  local_start 2002-10-01 00:00:00 (Tue)
  DateTime::TimeZone::INFINITY, #    local_end
  -10800,
  0,
  '-03',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {20}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_MACEIO

    $main::fatpacked{"DateTime/TimeZone/America/Managua.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_MANAGUA';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Managua;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Managua::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59611182308, #      utc_end 1890-01-01 05:45:08 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59611161600, #    local_end 1890-01-01 00:00:00 (Wed)
  -20708,
  0,
  'LMT',
      ],
      [
  59611182308, #    utc_start 1890-01-01 05:45:08 (Wed)
  61014577512, #      utc_end 1934-06-23 05:45:12 (Sat)
  59611161596, #  local_start 1889-12-31 23:59:56 (Tue)
  61014556800, #    local_end 1934-06-23 00:00:00 (Sat)
  -20712,
  0,
  'MMT',
      ],
      [
  61014577512, #    utc_start 1934-06-23 05:45:12 (Sat)
  62240767200, #      utc_end 1973-05-01 06:00:00 (Tue)
  61014555912, #  local_start 1934-06-22 23:45:12 (Fri)
  62240745600, #    local_end 1973-05-01 00:00:00 (Tue)
  -21600,
  0,
  'CST',
      ],
      [
  62240767200, #    utc_start 1973-05-01 06:00:00 (Tue)
  62297442000, #      utc_end 1975-02-16 05:00:00 (Sun)
  62240749200, #  local_start 1973-05-01 01:00:00 (Tue)
  62297424000, #    local_end 1975-02-16 00:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62297442000, #    utc_start 1975-02-16 05:00:00 (Sun)
  62426268000, #      utc_end 1979-03-18 06:00:00 (Sun)
  62297420400, #  local_start 1975-02-15 23:00:00 (Sat)
  62426246400, #    local_end 1979-03-18 00:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62426268000, #    utc_start 1979-03-18 06:00:00 (Sun)
  62434818000, #      utc_end 1979-06-25 05:00:00 (Mon)
  62426250000, #  local_start 1979-03-18 01:00:00 (Sun)
  62434800000, #    local_end 1979-06-25 00:00:00 (Mon)
  -18000,
  1,
  'CDT',
      ],
      [
  62434818000, #    utc_start 1979-06-25 05:00:00 (Mon)
  62457717600, #      utc_end 1980-03-16 06:00:00 (Sun)
  62434796400, #  local_start 1979-06-24 23:00:00 (Sun)
  62457696000, #    local_end 1980-03-16 00:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62457717600, #    utc_start 1980-03-16 06:00:00 (Sun)
  62466267600, #      utc_end 1980-06-23 05:00:00 (Mon)
  62457699600, #  local_start 1980-03-16 01:00:00 (Sun)
  62466249600, #    local_end 1980-06-23 00:00:00 (Mon)
  -18000,
  1,
  'CDT',
      ],
      [
  62466267600, #    utc_start 1980-06-23 05:00:00 (Mon)
  62829943200, #      utc_end 1992-01-01 10:00:00 (Wed)
  62466246000, #  local_start 1980-06-22 23:00:00 (Sun)
  62829921600, #    local_end 1992-01-01 04:00:00 (Wed)
  -21600,
  0,
  'CST',
      ],
      [
  62829943200, #    utc_start 1992-01-01 10:00:00 (Wed)
  62852994000, #      utc_end 1992-09-24 05:00:00 (Thu)
  62829925200, #  local_start 1992-01-01 05:00:00 (Wed)
  62852976000, #    local_end 1992-09-24 00:00:00 (Thu)
  -18000,
  0,
  'EST',
      ],
      [
  62852994000, #    utc_start 1992-09-24 05:00:00 (Thu)
  62861551200, #      utc_end 1993-01-01 06:00:00 (Fri)
  62852972400, #  local_start 1992-09-23 23:00:00 (Wed)
  62861529600, #    local_end 1993-01-01 00:00:00 (Fri)
  -21600,
  0,
  'CST',
      ],
      [
  62861551200, #    utc_start 1993-01-01 06:00:00 (Fri)
  62987778000, #      utc_end 1997-01-01 05:00:00 (Wed)
  62861533200, #  local_start 1993-01-01 01:00:00 (Fri)
  62987760000, #    local_end 1997-01-01 00:00:00 (Wed)
  -18000,
  0,
  'EST',
      ],
      [
  62987778000, #    utc_start 1997-01-01 05:00:00 (Wed)
  63248796000, #      utc_end 2005-04-10 06:00:00 (Sun)
  62987756400, #  local_start 1996-12-31 23:00:00 (Tue)
  63248774400, #    local_end 2005-04-10 00:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63248796000, #    utc_start 2005-04-10 06:00:00 (Sun)
  63263912400, #      utc_end 2005-10-02 05:00:00 (Sun)
  63248778000, #  local_start 2005-04-10 01:00:00 (Sun)
  63263894400, #    local_end 2005-10-02 00:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63263912400, #    utc_start 2005-10-02 05:00:00 (Sun)
  63282067200, #      utc_end 2006-04-30 08:00:00 (Sun)
  63263890800, #  local_start 2005-10-01 23:00:00 (Sat)
  63282045600, #    local_end 2006-04-30 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63282067200, #    utc_start 2006-04-30 08:00:00 (Sun)
  63295365600, #      utc_end 2006-10-01 06:00:00 (Sun)
  63282049200, #  local_start 2006-04-30 03:00:00 (Sun)
  63295347600, #    local_end 2006-10-01 01:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63295365600, #    utc_start 2006-10-01 06:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #      utc_end
  63295344000, #  local_start 2006-10-01 00:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  -21600,
  0,
  'CST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {4}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_MANAGUA

    $main::fatpacked{"DateTime/TimeZone/America/Manaus.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_MANAUS';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/southamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Manaus;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Manaus::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60368472004, #      utc_end 1914-01-01 04:00:04 (Thu)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60368457600, #    local_end 1914-01-01 00:00:00 (Thu)
  -14404,
  0,
  'LMT',
      ],
      [
  60368472004, #    utc_start 1914-01-01 04:00:04 (Thu)
  60928729200, #      utc_end 1931-10-03 15:00:00 (Sat)
  60368457604, #  local_start 1914-01-01 00:00:04 (Thu)
  60928714800, #    local_end 1931-10-03 11:00:00 (Sat)
  -14400,
  0,
  '-04',
      ],
      [
  60928729200, #    utc_start 1931-10-03 15:00:00 (Sat)
  60944324400, #      utc_end 1932-04-01 03:00:00 (Fri)
  60928718400, #  local_start 1931-10-03 12:00:00 (Sat)
  60944313600, #    local_end 1932-04-01 00:00:00 (Fri)
  -10800,
  1,
  '-03',
      ],
      [
  60944324400, #    utc_start 1932-04-01 03:00:00 (Fri)
  60960312000, #      utc_end 1932-10-03 04:00:00 (Mon)
  60944310000, #  local_start 1932-03-31 23:00:00 (Thu)
  60960297600, #    local_end 1932-10-03 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  60960312000, #    utc_start 1932-10-03 04:00:00 (Mon)
  60975860400, #      utc_end 1933-04-01 03:00:00 (Sat)
  60960301200, #  local_start 1932-10-03 01:00:00 (Mon)
  60975849600, #    local_end 1933-04-01 00:00:00 (Sat)
  -10800,
  1,
  '-03',
      ],
      [
  60975860400, #    utc_start 1933-04-01 03:00:00 (Sat)
  61501867200, #      utc_end 1949-12-01 04:00:00 (Thu)
  60975846000, #  local_start 1933-03-31 23:00:00 (Fri)
  61501852800, #    local_end 1949-12-01 00:00:00 (Thu)
  -14400,
  0,
  '-04',
      ],
      [
  61501867200, #    utc_start 1949-12-01 04:00:00 (Thu)
  61513617600, #      utc_end 1950-04-16 04:00:00 (Sun)
  61501856400, #  local_start 1949-12-01 01:00:00 (Thu)
  61513606800, #    local_end 1950-04-16 01:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61513617600, #    utc_start 1950-04-16 04:00:00 (Sun)
  61533403200, #      utc_end 1950-12-01 04:00:00 (Fri)
  61513603200, #  local_start 1950-04-16 00:00:00 (Sun)
  61533388800, #    local_end 1950-12-01 00:00:00 (Fri)
  -14400,
  0,
  '-04',
      ],
      [
  61533403200, #    utc_start 1950-12-01 04:00:00 (Fri)
  61543854000, #      utc_end 1951-04-01 03:00:00 (Sun)
  61533392400, #  local_start 1950-12-01 01:00:00 (Fri)
  61543843200, #    local_end 1951-04-01 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61543854000, #    utc_start 1951-04-01 03:00:00 (Sun)
  61564939200, #      utc_end 1951-12-01 04:00:00 (Sat)
  61543839600, #  local_start 1951-03-31 23:00:00 (Sat)
  61564924800, #    local_end 1951-12-01 00:00:00 (Sat)
  -14400,
  0,
  '-04',
      ],
      [
  61564939200, #    utc_start 1951-12-01 04:00:00 (Sat)
  61575476400, #      utc_end 1952-04-01 03:00:00 (Tue)
  61564928400, #  local_start 1951-12-01 01:00:00 (Sat)
  61575465600, #    local_end 1952-04-01 00:00:00 (Tue)
  -10800,
  1,
  '-03',
      ],
      [
  61575476400, #    utc_start 1952-04-01 03:00:00 (Tue)
  61596561600, #      utc_end 1952-12-01 04:00:00 (Mon)
  61575462000, #  local_start 1952-03-31 23:00:00 (Mon)
  61596547200, #    local_end 1952-12-01 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  61596561600, #    utc_start 1952-12-01 04:00:00 (Mon)
  61604334000, #      utc_end 1953-03-01 03:00:00 (Sun)
  61596550800, #  local_start 1952-12-01 01:00:00 (Mon)
  61604323200, #    local_end 1953-03-01 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61604334000, #    utc_start 1953-03-01 03:00:00 (Sun)
  61944321600, #      utc_end 1963-12-09 04:00:00 (Mon)
  61604319600, #  local_start 1953-02-28 23:00:00 (Sat)
  61944307200, #    local_end 1963-12-09 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  61944321600, #    utc_start 1963-12-09 04:00:00 (Mon)
  61951489200, #      utc_end 1964-03-01 03:00:00 (Sun)
  61944310800, #  local_start 1963-12-09 01:00:00 (Mon)
  61951478400, #    local_end 1964-03-01 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61951489200, #    utc_start 1964-03-01 03:00:00 (Sun)
  61980523200, #      utc_end 1965-01-31 04:00:00 (Sun)
  61951474800, #  local_start 1964-02-29 23:00:00 (Sat)
  61980508800, #    local_end 1965-01-31 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  61980523200, #    utc_start 1965-01-31 04:00:00 (Sun)
  61985617200, #      utc_end 1965-03-31 03:00:00 (Wed)
  61980512400, #  local_start 1965-01-31 01:00:00 (Sun)
  61985606400, #    local_end 1965-03-31 00:00:00 (Wed)
  -10800,
  1,
  '-03',
      ],
      [
  61985617200, #    utc_start 1965-03-31 03:00:00 (Wed)
  62006788800, #      utc_end 1965-12-01 04:00:00 (Wed)
  61985602800, #  local_start 1965-03-30 23:00:00 (Tue)
  62006774400, #    local_end 1965-12-01 00:00:00 (Wed)
  -14400,
  0,
  '-04',
      ],
      [
  62006788800, #    utc_start 1965-12-01 04:00:00 (Wed)
  62014561200, #      utc_end 1966-03-01 03:00:00 (Tue)
  62006778000, #  local_start 1965-12-01 01:00:00 (Wed)
  62014550400, #    local_end 1966-03-01 00:00:00 (Tue)
  -10800,
  1,
  '-03',
      ],
      [
  62014561200, #    utc_start 1966-03-01 03:00:00 (Tue)
  62035732800, #      utc_end 1966-11-01 04:00:00 (Tue)
  62014546800, #  local_start 1966-02-28 23:00:00 (Mon)
  62035718400, #    local_end 1966-11-01 00:00:00 (Tue)
  -14400,
  0,
  '-04',
      ],
      [
  62035732800, #    utc_start 1966-11-01 04:00:00 (Tue)
  62046097200, #      utc_end 1967-03-01 03:00:00 (Wed)
  62035722000, #  local_start 1966-11-01 01:00:00 (Tue)
  62046086400, #    local_end 1967-03-01 00:00:00 (Wed)
  -10800,
  1,
  '-03',
      ],
      [
  62046097200, #    utc_start 1967-03-01 03:00:00 (Wed)
  62067268800, #      utc_end 1967-11-01 04:00:00 (Wed)
  62046082800, #  local_start 1967-02-28 23:00:00 (Tue)
  62067254400, #    local_end 1967-11-01 00:00:00 (Wed)
  -14400,
  0,
  '-04',
      ],
      [
  62067268800, #    utc_start 1967-11-01 04:00:00 (Wed)
  62077719600, #      utc_end 1968-03-01 03:00:00 (Fri)
  62067258000, #  local_start 1967-11-01 01:00:00 (Wed)
  62077708800, #    local_end 1968-03-01 00:00:00 (Fri)
  -10800,
  1,
  '-03',
      ],
      [
  62077719600, #    utc_start 1968-03-01 03:00:00 (Fri)
  62635435200, #      utc_end 1985-11-02 04:00:00 (Sat)
  62077705200, #  local_start 1968-02-29 23:00:00 (Thu)
  62635420800, #    local_end 1985-11-02 00:00:00 (Sat)
  -14400,
  0,
  '-04',
      ],
      [
  62635435200, #    utc_start 1985-11-02 04:00:00 (Sat)
  62646922800, #      utc_end 1986-03-15 03:00:00 (Sat)
  62635424400, #  local_start 1985-11-02 01:00:00 (Sat)
  62646912000, #    local_end 1986-03-15 00:00:00 (Sat)
  -10800,
  1,
  '-03',
      ],
      [
  62646922800, #    utc_start 1986-03-15 03:00:00 (Sat)
  62666280000, #      utc_end 1986-10-25 04:00:00 (Sat)
  62646908400, #  local_start 1986-03-14 23:00:00 (Fri)
  62666265600, #    local_end 1986-10-25 00:00:00 (Sat)
  -14400,
  0,
  '-04',
      ],
      [
  62666280000, #    utc_start 1986-10-25 04:00:00 (Sat)
  62675953200, #      utc_end 1987-02-14 03:00:00 (Sat)
  62666269200, #  local_start 1986-10-25 01:00:00 (Sat)
  62675942400, #    local_end 1987-02-14 00:00:00 (Sat)
  -10800,
  1,
  '-03',
      ],
      [
  62675953200, #    utc_start 1987-02-14 03:00:00 (Sat)
  62697816000, #      utc_end 1987-10-25 04:00:00 (Sun)
  62675938800, #  local_start 1987-02-13 23:00:00 (Fri)
  62697801600, #    local_end 1987-10-25 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62697816000, #    utc_start 1987-10-25 04:00:00 (Sun)
  62706884400, #      utc_end 1988-02-07 03:00:00 (Sun)
  62697805200, #  local_start 1987-10-25 01:00:00 (Sun)
  62706873600, #    local_end 1988-02-07 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62706884400, #    utc_start 1988-02-07 03:00:00 (Sun)
  62725723200, #      utc_end 1988-09-12 04:00:00 (Mon)
  62706870000, #  local_start 1988-02-06 23:00:00 (Sat)
  62725708800, #    local_end 1988-09-12 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  62725723200, #    utc_start 1988-09-12 04:00:00 (Mon)
  62884872000, #      utc_end 1993-09-28 04:00:00 (Tue)
  62725708800, #  local_start 1988-09-12 00:00:00 (Mon)
  62884857600, #    local_end 1993-09-28 00:00:00 (Tue)
  -14400,
  0,
  '-04',
      ],
      [
  62884872000, #    utc_start 1993-09-28 04:00:00 (Tue)
  62886513600, #      utc_end 1993-10-17 04:00:00 (Sun)
  62884857600, #  local_start 1993-09-28 00:00:00 (Tue)
  62886499200, #    local_end 1993-10-17 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62886513600, #    utc_start 1993-10-17 04:00:00 (Sun)
  62897396400, #      utc_end 1994-02-20 03:00:00 (Sun)
  62886502800, #  local_start 1993-10-17 01:00:00 (Sun)
  62897385600, #    local_end 1994-02-20 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62897396400, #    utc_start 1994-02-20 03:00:00 (Sun)
  62915889600, #      utc_end 1994-09-22 04:00:00 (Thu)
  62897382000, #  local_start 1994-02-19 23:00:00 (Sat)
  62915875200, #    local_end 1994-09-22 00:00:00 (Thu)
  -14400,
  0,
  '-04',
      ],
      [
  62915889600, #    utc_start 1994-09-22 04:00:00 (Thu)
  DateTime::TimeZone::INFINITY, #      utc_end
  62915875200, #  local_start 1994-09-22 00:00:00 (Thu)
  DateTime::TimeZone::INFINITY, #    local_end
  -14400,
  0,
  '-04',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {15}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_MANAUS

    $main::fatpacked{"DateTime/TimeZone/America/Martinique.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_MARTINIQUE';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Martinique;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Martinique::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59611176260, #      utc_end 1890-01-01 04:04:20 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59611161600, #    local_end 1890-01-01 00:00:00 (Wed)
  -14660,
  0,
  'LMT',
      ],
      [
  59611176260, #    utc_start 1890-01-01 04:04:20 (Wed)
  60284145860, #      utc_end 1911-05-01 04:04:20 (Mon)
  59611161600, #  local_start 1890-01-01 00:00:00 (Wed)
  60284131200, #    local_end 1911-05-01 00:00:00 (Mon)
  -14660,
  0,
  'FFMT',
      ],
      [
  60284145860, #    utc_start 1911-05-01 04:04:20 (Mon)
  62459524800, #      utc_end 1980-04-06 04:00:00 (Sun)
  60284131460, #  local_start 1911-05-01 00:04:20 (Mon)
  62459510400, #    local_end 1980-04-06 00:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62459524800, #    utc_start 1980-04-06 04:00:00 (Sun)
  62474641200, #      utc_end 1980-09-28 03:00:00 (Sun)
  62459514000, #  local_start 1980-04-06 01:00:00 (Sun)
  62474630400, #    local_end 1980-09-28 00:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62474641200, #    utc_start 1980-09-28 03:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #      utc_end
  62474626800, #  local_start 1980-09-27 23:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #    local_end
  -14400,
  0,
  'AST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {1}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_MARTINIQUE

    $main::fatpacked{"DateTime/TimeZone/America/Matamoros.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_MATAMOROS';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Matamoros;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Matamoros::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60620940000, #      utc_end 1922-01-01 06:00:00 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60620916000, #    local_end 1921-12-31 23:20:00 (Sat)
  -24000,
  0,
  'LMT',
      ],
      [
  60620940000, #    utc_start 1922-01-01 06:00:00 (Sun)
  62703698400, #      utc_end 1988-01-01 06:00:00 (Fri)
  60620918400, #  local_start 1922-01-01 00:00:00 (Sun)
  62703676800, #    local_end 1988-01-01 00:00:00 (Fri)
  -21600,
  0,
  'CST',
      ],
      [
  62703698400, #    utc_start 1988-01-01 06:00:00 (Fri)
  62711740800, #      utc_end 1988-04-03 08:00:00 (Sun)
  62703676800, #  local_start 1988-01-01 00:00:00 (Fri)
  62711719200, #    local_end 1988-04-03 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62711740800, #    utc_start 1988-04-03 08:00:00 (Sun)
  62729881200, #      utc_end 1988-10-30 07:00:00 (Sun)
  62711722800, #  local_start 1988-04-03 03:00:00 (Sun)
  62729863200, #    local_end 1988-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62729881200, #    utc_start 1988-10-30 07:00:00 (Sun)
  62735320800, #      utc_end 1989-01-01 06:00:00 (Sun)
  62729859600, #  local_start 1988-10-30 01:00:00 (Sun)
  62735299200, #    local_end 1989-01-01 00:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62735320800, #    utc_start 1989-01-01 06:00:00 (Sun)
  62964547200, #      utc_end 1996-04-07 08:00:00 (Sun)
  62735299200, #  local_start 1989-01-01 00:00:00 (Sun)
  62964525600, #    local_end 1996-04-07 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62964547200, #    utc_start 1996-04-07 08:00:00 (Sun)
  62982082800, #      utc_end 1996-10-27 07:00:00 (Sun)
  62964529200, #  local_start 1996-04-07 03:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62982082800, #    utc_start 1996-10-27 07:00:00 (Sun)
  62995996800, #      utc_end 1997-04-06 08:00:00 (Sun)
  62982061200, #  local_start 1996-10-27 01:00:00 (Sun)
  62995975200, #    local_end 1997-04-06 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62995996800, #    utc_start 1997-04-06 08:00:00 (Sun)
  63013532400, #      utc_end 1997-10-26 07:00:00 (Sun)
  62995978800, #  local_start 1997-04-06 03:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63013532400, #    utc_start 1997-10-26 07:00:00 (Sun)
  63027446400, #      utc_end 1998-04-05 08:00:00 (Sun)
  63013510800, #  local_start 1997-10-26 01:00:00 (Sun)
  63027424800, #    local_end 1998-04-05 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63027446400, #    utc_start 1998-04-05 08:00:00 (Sun)
  63044982000, #      utc_end 1998-10-25 07:00:00 (Sun)
  63027428400, #  local_start 1998-04-05 03:00:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63044982000, #    utc_start 1998-10-25 07:00:00 (Sun)
  63058896000, #      utc_end 1999-04-04 08:00:00 (Sun)
  63044960400, #  local_start 1998-10-25 01:00:00 (Sun)
  63058874400, #    local_end 1999-04-04 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63058896000, #    utc_start 1999-04-04 08:00:00 (Sun)
  63077036400, #      utc_end 1999-10-31 07:00:00 (Sun)
  63058878000, #  local_start 1999-04-04 03:00:00 (Sun)
  63077018400, #    local_end 1999-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63077036400, #    utc_start 1999-10-31 07:00:00 (Sun)
  63090345600, #      utc_end 2000-04-02 08:00:00 (Sun)
  63077014800, #  local_start 1999-10-31 01:00:00 (Sun)
  63090324000, #    local_end 2000-04-02 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63090345600, #    utc_start 2000-04-02 08:00:00 (Sun)
  63108486000, #      utc_end 2000-10-29 07:00:00 (Sun)
  63090327600, #  local_start 2000-04-02 03:00:00 (Sun)
  63108468000, #    local_end 2000-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63108486000, #    utc_start 2000-10-29 07:00:00 (Sun)
  63124819200, #      utc_end 2001-05-06 08:00:00 (Sun)
  63108464400, #  local_start 2000-10-29 01:00:00 (Sun)
  63124797600, #    local_end 2001-05-06 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63124819200, #    utc_start 2001-05-06 08:00:00 (Sun)
  63137516400, #      utc_end 2001-09-30 07:00:00 (Sun)
  63124801200, #  local_start 2001-05-06 03:00:00 (Sun)
  63137498400, #    local_end 2001-09-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63137516400, #    utc_start 2001-09-30 07:00:00 (Sun)
  63153849600, #      utc_end 2002-04-07 08:00:00 (Sun)
  63137494800, #  local_start 2001-09-30 01:00:00 (Sun)
  63153828000, #    local_end 2002-04-07 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63153849600, #    utc_start 2002-04-07 08:00:00 (Sun)
  63171385200, #      utc_end 2002-10-27 07:00:00 (Sun)
  63153831600, #  local_start 2002-04-07 03:00:00 (Sun)
  63171367200, #    local_end 2002-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63171385200, #    utc_start 2002-10-27 07:00:00 (Sun)
  63185299200, #      utc_end 2003-04-06 08:00:00 (Sun)
  63171363600, #  local_start 2002-10-27 01:00:00 (Sun)
  63185277600, #    local_end 2003-04-06 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63185299200, #    utc_start 2003-04-06 08:00:00 (Sun)
  63202834800, #      utc_end 2003-10-26 07:00:00 (Sun)
  63185281200, #  local_start 2003-04-06 03:00:00 (Sun)
  63202816800, #    local_end 2003-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63202834800, #    utc_start 2003-10-26 07:00:00 (Sun)
  63216748800, #      utc_end 2004-04-04 08:00:00 (Sun)
  63202813200, #  local_start 2003-10-26 01:00:00 (Sun)
  63216727200, #    local_end 2004-04-04 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63216748800, #    utc_start 2004-04-04 08:00:00 (Sun)
  63234889200, #      utc_end 2004-10-31 07:00:00 (Sun)
  63216730800, #  local_start 2004-04-04 03:00:00 (Sun)
  63234871200, #    local_end 2004-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63234889200, #    utc_start 2004-10-31 07:00:00 (Sun)
  63248198400, #      utc_end 2005-04-03 08:00:00 (Sun)
  63234867600, #  local_start 2004-10-31 01:00:00 (Sun)
  63248176800, #    local_end 2005-04-03 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63248198400, #    utc_start 2005-04-03 08:00:00 (Sun)
  63266338800, #      utc_end 2005-10-30 07:00:00 (Sun)
  63248180400, #  local_start 2005-04-03 03:00:00 (Sun)
  63266320800, #    local_end 2005-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63266338800, #    utc_start 2005-10-30 07:00:00 (Sun)
  63279648000, #      utc_end 2006-04-02 08:00:00 (Sun)
  63266317200, #  local_start 2005-10-30 01:00:00 (Sun)
  63279626400, #    local_end 2006-04-02 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63279648000, #    utc_start 2006-04-02 08:00:00 (Sun)
  63297788400, #      utc_end 2006-10-29 07:00:00 (Sun)
  63279630000, #  local_start 2006-04-02 03:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63297788400, #    utc_start 2006-10-29 07:00:00 (Sun)
  63311097600, #      utc_end 2007-04-01 08:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63311076000, #    local_end 2007-04-01 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63311097600, #    utc_start 2007-04-01 08:00:00 (Sun)
  63329238000, #      utc_end 2007-10-28 07:00:00 (Sun)
  63311079600, #  local_start 2007-04-01 03:00:00 (Sun)
  63329220000, #    local_end 2007-10-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63329238000, #    utc_start 2007-10-28 07:00:00 (Sun)
  63343152000, #      utc_end 2008-04-06 08:00:00 (Sun)
  63329216400, #  local_start 2007-10-28 01:00:00 (Sun)
  63343130400, #    local_end 2008-04-06 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63343152000, #    utc_start 2008-04-06 08:00:00 (Sun)
  63360687600, #      utc_end 2008-10-26 07:00:00 (Sun)
  63343134000, #  local_start 2008-04-06 03:00:00 (Sun)
  63360669600, #    local_end 2008-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63360687600, #    utc_start 2008-10-26 07:00:00 (Sun)
  63374601600, #      utc_end 2009-04-05 08:00:00 (Sun)
  63360666000, #  local_start 2008-10-26 01:00:00 (Sun)
  63374580000, #    local_end 2009-04-05 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63374601600, #    utc_start 2009-04-05 08:00:00 (Sun)
  63392137200, #      utc_end 2009-10-25 07:00:00 (Sun)
  63374583600, #  local_start 2009-04-05 03:00:00 (Sun)
  63392119200, #    local_end 2009-10-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63392137200, #    utc_start 2009-10-25 07:00:00 (Sun)
  63398008800, #      utc_end 2010-01-01 06:00:00 (Fri)
  63392115600, #  local_start 2009-10-25 01:00:00 (Sun)
  63397987200, #    local_end 2010-01-01 00:00:00 (Fri)
  -21600,
  0,
  'CST',
      ],
      [
  63398008800, #    utc_start 2010-01-01 06:00:00 (Fri)
  63404236800, #      utc_end 2010-03-14 08:00:00 (Sun)
  63397987200, #  local_start 2010-01-01 00:00:00 (Fri)
  63404215200, #    local_end 2010-03-14 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63404236800, #    utc_start 2010-03-14 08:00:00 (Sun)
  63424796400, #      utc_end 2010-11-07 07:00:00 (Sun)
  63404218800, #  local_start 2010-03-14 03:00:00 (Sun)
  63424778400, #    local_end 2010-11-07 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63424796400, #    utc_start 2010-11-07 07:00:00 (Sun)
  63435686400, #      utc_end 2011-03-13 08:00:00 (Sun)
  63424774800, #  local_start 2010-11-07 01:00:00 (Sun)
  63435664800, #    local_end 2011-03-13 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63435686400, #    utc_start 2011-03-13 08:00:00 (Sun)
  63456246000, #      utc_end 2011-11-06 07:00:00 (Sun)
  63435668400, #  local_start 2011-03-13 03:00:00 (Sun)
  63456228000, #    local_end 2011-11-06 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63456246000, #    utc_start 2011-11-06 07:00:00 (Sun)
  63467136000, #      utc_end 2012-03-11 08:00:00 (Sun)
  63456224400, #  local_start 2011-11-06 01:00:00 (Sun)
  63467114400, #    local_end 2012-03-11 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63467136000, #    utc_start 2012-03-11 08:00:00 (Sun)
  63487695600, #      utc_end 2012-11-04 07:00:00 (Sun)
  63467118000, #  local_start 2012-03-11 03:00:00 (Sun)
  63487677600, #    local_end 2012-11-04 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63487695600, #    utc_start 2012-11-04 07:00:00 (Sun)
  63498585600, #      utc_end 2013-03-10 08:00:00 (Sun)
  63487674000, #  local_start 2012-11-04 01:00:00 (Sun)
  63498564000, #    local_end 2013-03-10 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63498585600, #    utc_start 2013-03-10 08:00:00 (Sun)
  63519145200, #      utc_end 2013-11-03 07:00:00 (Sun)
  63498567600, #  local_start 2013-03-10 03:00:00 (Sun)
  63519127200, #    local_end 2013-11-03 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63519145200, #    utc_start 2013-11-03 07:00:00 (Sun)
  63530035200, #      utc_end 2014-03-09 08:00:00 (Sun)
  63519123600, #  local_start 2013-11-03 01:00:00 (Sun)
  63530013600, #    local_end 2014-03-09 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63530035200, #    utc_start 2014-03-09 08:00:00 (Sun)
  63550594800, #      utc_end 2014-11-02 07:00:00 (Sun)
  63530017200, #  local_start 2014-03-09 03:00:00 (Sun)
  63550576800, #    local_end 2014-11-02 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63550594800, #    utc_start 2014-11-02 07:00:00 (Sun)
  63561484800, #      utc_end 2015-03-08 08:00:00 (Sun)
  63550573200, #  local_start 2014-11-02 01:00:00 (Sun)
  63561463200, #    local_end 2015-03-08 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63561484800, #    utc_start 2015-03-08 08:00:00 (Sun)
  63582044400, #      utc_end 2015-11-01 07:00:00 (Sun)
  63561466800, #  local_start 2015-03-08 03:00:00 (Sun)
  63582026400, #    local_end 2015-11-01 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63582044400, #    utc_start 2015-11-01 07:00:00 (Sun)
  63593539200, #      utc_end 2016-03-13 08:00:00 (Sun)
  63582022800, #  local_start 2015-11-01 01:00:00 (Sun)
  63593517600, #    local_end 2016-03-13 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63593539200, #    utc_start 2016-03-13 08:00:00 (Sun)
  63614098800, #      utc_end 2016-11-06 07:00:00 (Sun)
  63593521200, #  local_start 2016-03-13 03:00:00 (Sun)
  63614080800, #    local_end 2016-11-06 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63614098800, #    utc_start 2016-11-06 07:00:00 (Sun)
  63624988800, #      utc_end 2017-03-12 08:00:00 (Sun)
  63614077200, #  local_start 2016-11-06 01:00:00 (Sun)
  63624967200, #    local_end 2017-03-12 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63624988800, #    utc_start 2017-03-12 08:00:00 (Sun)
  63645548400, #      utc_end 2017-11-05 07:00:00 (Sun)
  63624970800, #  local_start 2017-03-12 03:00:00 (Sun)
  63645530400, #    local_end 2017-11-05 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63645548400, #    utc_start 2017-11-05 07:00:00 (Sun)
  63656438400, #      utc_end 2018-03-11 08:00:00 (Sun)
  63645526800, #  local_start 2017-11-05 01:00:00 (Sun)
  63656416800, #    local_end 2018-03-11 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63656438400, #    utc_start 2018-03-11 08:00:00 (Sun)
  63676998000, #      utc_end 2018-11-04 07:00:00 (Sun)
  63656420400, #  local_start 2018-03-11 03:00:00 (Sun)
  63676980000, #    local_end 2018-11-04 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63676998000, #    utc_start 2018-11-04 07:00:00 (Sun)
  63687888000, #      utc_end 2019-03-10 08:00:00 (Sun)
  63676976400, #  local_start 2018-11-04 01:00:00 (Sun)
  63687866400, #    local_end 2019-03-10 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63687888000, #    utc_start 2019-03-10 08:00:00 (Sun)
  63708447600, #      utc_end 2019-11-03 07:00:00 (Sun)
  63687870000, #  local_start 2019-03-10 03:00:00 (Sun)
  63708429600, #    local_end 2019-11-03 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63708447600, #    utc_start 2019-11-03 07:00:00 (Sun)
  63719337600, #      utc_end 2020-03-08 08:00:00 (Sun)
  63708426000, #  local_start 2019-11-03 01:00:00 (Sun)
  63719316000, #    local_end 2020-03-08 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63719337600, #    utc_start 2020-03-08 08:00:00 (Sun)
  63739897200, #      utc_end 2020-11-01 07:00:00 (Sun)
  63719319600, #  local_start 2020-03-08 03:00:00 (Sun)
  63739879200, #    local_end 2020-11-01 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63739897200, #    utc_start 2020-11-01 07:00:00 (Sun)
  63751392000, #      utc_end 2021-03-14 08:00:00 (Sun)
  63739875600, #  local_start 2020-11-01 01:00:00 (Sun)
  63751370400, #    local_end 2021-03-14 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63751392000, #    utc_start 2021-03-14 08:00:00 (Sun)
  63771951600, #      utc_end 2021-11-07 07:00:00 (Sun)
  63751374000, #  local_start 2021-03-14 03:00:00 (Sun)
  63771933600, #    local_end 2021-11-07 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63771951600, #    utc_start 2021-11-07 07:00:00 (Sun)
  63782841600, #      utc_end 2022-03-13 08:00:00 (Sun)
  63771930000, #  local_start 2021-11-07 01:00:00 (Sun)
  63782820000, #    local_end 2022-03-13 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63782841600, #    utc_start 2022-03-13 08:00:00 (Sun)
  63803401200, #      utc_end 2022-11-06 07:00:00 (Sun)
  63782823600, #  local_start 2022-03-13 03:00:00 (Sun)
  63803383200, #    local_end 2022-11-06 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63803401200, #    utc_start 2022-11-06 07:00:00 (Sun)
  63814291200, #      utc_end 2023-03-12 08:00:00 (Sun)
  63803379600, #  local_start 2022-11-06 01:00:00 (Sun)
  63814269600, #    local_end 2023-03-12 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63814291200, #    utc_start 2023-03-12 08:00:00 (Sun)
  63834850800, #      utc_end 2023-11-05 07:00:00 (Sun)
  63814273200, #  local_start 2023-03-12 03:00:00 (Sun)
  63834832800, #    local_end 2023-11-05 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63834850800, #    utc_start 2023-11-05 07:00:00 (Sun)
  63845740800, #      utc_end 2024-03-10 08:00:00 (Sun)
  63834829200, #  local_start 2023-11-05 01:00:00 (Sun)
  63845719200, #    local_end 2024-03-10 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63845740800, #    utc_start 2024-03-10 08:00:00 (Sun)
  63866300400, #      utc_end 2024-11-03 07:00:00 (Sun)
  63845722800, #  local_start 2024-03-10 03:00:00 (Sun)
  63866282400, #    local_end 2024-11-03 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63866300400, #    utc_start 2024-11-03 07:00:00 (Sun)
  63877190400, #      utc_end 2025-03-09 08:00:00 (Sun)
  63866278800, #  local_start 2024-11-03 01:00:00 (Sun)
  63877168800, #    local_end 2025-03-09 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63877190400, #    utc_start 2025-03-09 08:00:00 (Sun)
  63897750000, #      utc_end 2025-11-02 07:00:00 (Sun)
  63877172400, #  local_start 2025-03-09 03:00:00 (Sun)
  63897732000, #    local_end 2025-11-02 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63897750000, #    utc_start 2025-11-02 07:00:00 (Sun)
  63908640000, #      utc_end 2026-03-08 08:00:00 (Sun)
  63897728400, #  local_start 2025-11-02 01:00:00 (Sun)
  63908618400, #    local_end 2026-03-08 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63908640000, #    utc_start 2026-03-08 08:00:00 (Sun)
  63929199600, #      utc_end 2026-11-01 07:00:00 (Sun)
  63908622000, #  local_start 2026-03-08 03:00:00 (Sun)
  63929181600, #    local_end 2026-11-01 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63929199600, #    utc_start 2026-11-01 07:00:00 (Sun)
  63940694400, #      utc_end 2027-03-14 08:00:00 (Sun)
  63929178000, #  local_start 2026-11-01 01:00:00 (Sun)
  63940672800, #    local_end 2027-03-14 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63940694400, #    utc_start 2027-03-14 08:00:00 (Sun)
  63961254000, #      utc_end 2027-11-07 07:00:00 (Sun)
  63940676400, #  local_start 2027-03-14 03:00:00 (Sun)
  63961236000, #    local_end 2027-11-07 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63961254000, #    utc_start 2027-11-07 07:00:00 (Sun)
  63972144000, #      utc_end 2028-03-12 08:00:00 (Sun)
  63961232400, #  local_start 2027-11-07 01:00:00 (Sun)
  63972122400, #    local_end 2028-03-12 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63972144000, #    utc_start 2028-03-12 08:00:00 (Sun)
  63992703600, #      utc_end 2028-11-05 07:00:00 (Sun)
  63972126000, #  local_start 2028-03-12 03:00:00 (Sun)
  63992685600, #    local_end 2028-11-05 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63992703600, #    utc_start 2028-11-05 07:00:00 (Sun)
  64003593600, #      utc_end 2029-03-11 08:00:00 (Sun)
  63992682000, #  local_start 2028-11-05 01:00:00 (Sun)
  64003572000, #    local_end 2029-03-11 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  64003593600, #    utc_start 2029-03-11 08:00:00 (Sun)
  64024153200, #      utc_end 2029-11-04 07:00:00 (Sun)
  64003575600, #  local_start 2029-03-11 03:00:00 (Sun)
  64024135200, #    local_end 2029-11-04 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  64024153200, #    utc_start 2029-11-04 07:00:00 (Sun)
  64035043200, #      utc_end 2030-03-10 08:00:00 (Sun)
  64024131600, #  local_start 2029-11-04 01:00:00 (Sun)
  64035021600, #    local_end 2030-03-10 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  64035043200, #    utc_start 2030-03-10 08:00:00 (Sun)
  64055602800, #      utc_end 2030-11-03 07:00:00 (Sun)
  64035025200, #  local_start 2030-03-10 03:00:00 (Sun)
  64055584800, #    local_end 2030-11-03 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {36}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -21600 }
  
  my $last_observance = bless( {
    'format' => 'C%sT',
    'gmtoff' => '-6:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 733773,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 733773,
      'utc_rd_secs' => 0,
      'utc_year' => 2011
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -21600,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 733773,
      'local_rd_secs' => 21600,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 733773,
      'utc_rd_secs' => 21600,
      'utc_year' => 2011
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Nov',
      'letter' => 'S',
      'name' => 'US',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Mar',
      'letter' => 'D',
      'name' => 'US',
      'offset_from_std' => 3600,
      'on' => 'Sun>=8',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_MATAMOROS

    $main::fatpacked{"DateTime/TimeZone/America/Mazatlan.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_MAZATLAN';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Mazatlan;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Mazatlan::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60620943600, #      utc_end 1922-01-01 07:00:00 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60620918060, #    local_end 1921-12-31 23:54:20 (Sat)
  -25540,
  0,
  'LMT',
      ],
      [
  60620943600, #    utc_start 1922-01-01 07:00:00 (Sun)
  60792616800, #      utc_end 1927-06-11 06:00:00 (Sat)
  60620918400, #  local_start 1922-01-01 00:00:00 (Sun)
  60792591600, #    local_end 1927-06-10 23:00:00 (Fri)
  -25200,
  0,
  'MST',
      ],
      [
  60792616800, #    utc_start 1927-06-11 06:00:00 (Sat)
  60900876000, #      utc_end 1930-11-15 06:00:00 (Sat)
  60792595200, #  local_start 1927-06-11 00:00:00 (Sat)
  60900854400, #    local_end 1930-11-15 00:00:00 (Sat)
  -21600,
  0,
  'CST',
      ],
      [
  60900876000, #    utc_start 1930-11-15 06:00:00 (Sat)
  60915391200, #      utc_end 1931-05-02 06:00:00 (Sat)
  60900850800, #  local_start 1930-11-14 23:00:00 (Fri)
  60915366000, #    local_end 1931-05-01 23:00:00 (Fri)
  -25200,
  0,
  'MST',
      ],
      [
  60915391200, #    utc_start 1931-05-02 06:00:00 (Sat)
  60928524000, #      utc_end 1931-10-01 06:00:00 (Thu)
  60915369600, #  local_start 1931-05-02 00:00:00 (Sat)
  60928502400, #    local_end 1931-10-01 00:00:00 (Thu)
  -21600,
  0,
  'CST',
      ],
      [
  60928524000, #    utc_start 1931-10-01 06:00:00 (Thu)
  60944338800, #      utc_end 1932-04-01 07:00:00 (Fri)
  60928498800, #  local_start 1931-09-30 23:00:00 (Wed)
  60944313600, #    local_end 1932-04-01 00:00:00 (Fri)
  -25200,
  0,
  'MST',
      ],
      [
  60944338800, #    utc_start 1932-04-01 07:00:00 (Fri)
  61261855200, #      utc_end 1942-04-24 06:00:00 (Fri)
  60944317200, #  local_start 1932-04-01 01:00:00 (Fri)
  61261833600, #    local_end 1942-04-24 00:00:00 (Fri)
  -21600,
  0,
  'CST',
      ],
      [
  61261855200, #    utc_start 1942-04-24 06:00:00 (Fri)
  61474143600, #      utc_end 1949-01-14 07:00:00 (Fri)
  61261830000, #  local_start 1942-04-23 23:00:00 (Thu)
  61474118400, #    local_end 1949-01-14 00:00:00 (Fri)
  -25200,
  0,
  'MST',
      ],
      [
  61474143600, #    utc_start 1949-01-14 07:00:00 (Fri)
  62135712000, #      utc_end 1970-01-01 08:00:00 (Thu)
  61474114800, #  local_start 1949-01-13 23:00:00 (Thu)
  62135683200, #    local_end 1970-01-01 00:00:00 (Thu)
  -28800,
  0,
  'PST',
      ],
      [
  62135712000, #    utc_start 1970-01-01 08:00:00 (Thu)
  62964550800, #      utc_end 1996-04-07 09:00:00 (Sun)
  62135686800, #  local_start 1970-01-01 01:00:00 (Thu)
  62964525600, #    local_end 1996-04-07 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62964550800, #    utc_start 1996-04-07 09:00:00 (Sun)
  62982086400, #      utc_end 1996-10-27 08:00:00 (Sun)
  62964529200, #  local_start 1996-04-07 03:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62982086400, #    utc_start 1996-10-27 08:00:00 (Sun)
  62996000400, #      utc_end 1997-04-06 09:00:00 (Sun)
  62982061200, #  local_start 1996-10-27 01:00:00 (Sun)
  62995975200, #    local_end 1997-04-06 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62996000400, #    utc_start 1997-04-06 09:00:00 (Sun)
  63013536000, #      utc_end 1997-10-26 08:00:00 (Sun)
  62995978800, #  local_start 1997-04-06 03:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63013536000, #    utc_start 1997-10-26 08:00:00 (Sun)
  63027450000, #      utc_end 1998-04-05 09:00:00 (Sun)
  63013510800, #  local_start 1997-10-26 01:00:00 (Sun)
  63027424800, #    local_end 1998-04-05 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63027450000, #    utc_start 1998-04-05 09:00:00 (Sun)
  63044985600, #      utc_end 1998-10-25 08:00:00 (Sun)
  63027428400, #  local_start 1998-04-05 03:00:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63044985600, #    utc_start 1998-10-25 08:00:00 (Sun)
  63058899600, #      utc_end 1999-04-04 09:00:00 (Sun)
  63044960400, #  local_start 1998-10-25 01:00:00 (Sun)
  63058874400, #    local_end 1999-04-04 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63058899600, #    utc_start 1999-04-04 09:00:00 (Sun)
  63077040000, #      utc_end 1999-10-31 08:00:00 (Sun)
  63058878000, #  local_start 1999-04-04 03:00:00 (Sun)
  63077018400, #    local_end 1999-10-31 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63077040000, #    utc_start 1999-10-31 08:00:00 (Sun)
  63090349200, #      utc_end 2000-04-02 09:00:00 (Sun)
  63077014800, #  local_start 1999-10-31 01:00:00 (Sun)
  63090324000, #    local_end 2000-04-02 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63090349200, #    utc_start 2000-04-02 09:00:00 (Sun)
  63108489600, #      utc_end 2000-10-29 08:00:00 (Sun)
  63090327600, #  local_start 2000-04-02 03:00:00 (Sun)
  63108468000, #    local_end 2000-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63108489600, #    utc_start 2000-10-29 08:00:00 (Sun)
  63124822800, #      utc_end 2001-05-06 09:00:00 (Sun)
  63108464400, #  local_start 2000-10-29 01:00:00 (Sun)
  63124797600, #    local_end 2001-05-06 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63124822800, #    utc_start 2001-05-06 09:00:00 (Sun)
  63137520000, #      utc_end 2001-09-30 08:00:00 (Sun)
  63124801200, #  local_start 2001-05-06 03:00:00 (Sun)
  63137498400, #    local_end 2001-09-30 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63137520000, #    utc_start 2001-09-30 08:00:00 (Sun)
  63153853200, #      utc_end 2002-04-07 09:00:00 (Sun)
  63137494800, #  local_start 2001-09-30 01:00:00 (Sun)
  63153828000, #    local_end 2002-04-07 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63153853200, #    utc_start 2002-04-07 09:00:00 (Sun)
  63171388800, #      utc_end 2002-10-27 08:00:00 (Sun)
  63153831600, #  local_start 2002-04-07 03:00:00 (Sun)
  63171367200, #    local_end 2002-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63171388800, #    utc_start 2002-10-27 08:00:00 (Sun)
  63185302800, #      utc_end 2003-04-06 09:00:00 (Sun)
  63171363600, #  local_start 2002-10-27 01:00:00 (Sun)
  63185277600, #    local_end 2003-04-06 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63185302800, #    utc_start 2003-04-06 09:00:00 (Sun)
  63202838400, #      utc_end 2003-10-26 08:00:00 (Sun)
  63185281200, #  local_start 2003-04-06 03:00:00 (Sun)
  63202816800, #    local_end 2003-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63202838400, #    utc_start 2003-10-26 08:00:00 (Sun)
  63216752400, #      utc_end 2004-04-04 09:00:00 (Sun)
  63202813200, #  local_start 2003-10-26 01:00:00 (Sun)
  63216727200, #    local_end 2004-04-04 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63216752400, #    utc_start 2004-04-04 09:00:00 (Sun)
  63234892800, #      utc_end 2004-10-31 08:00:00 (Sun)
  63216730800, #  local_start 2004-04-04 03:00:00 (Sun)
  63234871200, #    local_end 2004-10-31 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63234892800, #    utc_start 2004-10-31 08:00:00 (Sun)
  63248202000, #      utc_end 2005-04-03 09:00:00 (Sun)
  63234867600, #  local_start 2004-10-31 01:00:00 (Sun)
  63248176800, #    local_end 2005-04-03 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63248202000, #    utc_start 2005-04-03 09:00:00 (Sun)
  63266342400, #      utc_end 2005-10-30 08:00:00 (Sun)
  63248180400, #  local_start 2005-04-03 03:00:00 (Sun)
  63266320800, #    local_end 2005-10-30 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63266342400, #    utc_start 2005-10-30 08:00:00 (Sun)
  63279651600, #      utc_end 2006-04-02 09:00:00 (Sun)
  63266317200, #  local_start 2005-10-30 01:00:00 (Sun)
  63279626400, #    local_end 2006-04-02 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63279651600, #    utc_start 2006-04-02 09:00:00 (Sun)
  63297792000, #      utc_end 2006-10-29 08:00:00 (Sun)
  63279630000, #  local_start 2006-04-02 03:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63297792000, #    utc_start 2006-10-29 08:00:00 (Sun)
  63311101200, #      utc_end 2007-04-01 09:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63311076000, #    local_end 2007-04-01 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63311101200, #    utc_start 2007-04-01 09:00:00 (Sun)
  63329241600, #      utc_end 2007-10-28 08:00:00 (Sun)
  63311079600, #  local_start 2007-04-01 03:00:00 (Sun)
  63329220000, #    local_end 2007-10-28 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63329241600, #    utc_start 2007-10-28 08:00:00 (Sun)
  63343155600, #      utc_end 2008-04-06 09:00:00 (Sun)
  63329216400, #  local_start 2007-10-28 01:00:00 (Sun)
  63343130400, #    local_end 2008-04-06 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63343155600, #    utc_start 2008-04-06 09:00:00 (Sun)
  63360691200, #      utc_end 2008-10-26 08:00:00 (Sun)
  63343134000, #  local_start 2008-04-06 03:00:00 (Sun)
  63360669600, #    local_end 2008-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63360691200, #    utc_start 2008-10-26 08:00:00 (Sun)
  63374605200, #      utc_end 2009-04-05 09:00:00 (Sun)
  63360666000, #  local_start 2008-10-26 01:00:00 (Sun)
  63374580000, #    local_end 2009-04-05 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63374605200, #    utc_start 2009-04-05 09:00:00 (Sun)
  63392140800, #      utc_end 2009-10-25 08:00:00 (Sun)
  63374583600, #  local_start 2009-04-05 03:00:00 (Sun)
  63392119200, #    local_end 2009-10-25 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63392140800, #    utc_start 2009-10-25 08:00:00 (Sun)
  63406054800, #      utc_end 2010-04-04 09:00:00 (Sun)
  63392115600, #  local_start 2009-10-25 01:00:00 (Sun)
  63406029600, #    local_end 2010-04-04 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63406054800, #    utc_start 2010-04-04 09:00:00 (Sun)
  63424195200, #      utc_end 2010-10-31 08:00:00 (Sun)
  63406033200, #  local_start 2010-04-04 03:00:00 (Sun)
  63424173600, #    local_end 2010-10-31 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63424195200, #    utc_start 2010-10-31 08:00:00 (Sun)
  63437504400, #      utc_end 2011-04-03 09:00:00 (Sun)
  63424170000, #  local_start 2010-10-31 01:00:00 (Sun)
  63437479200, #    local_end 2011-04-03 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63437504400, #    utc_start 2011-04-03 09:00:00 (Sun)
  63455644800, #      utc_end 2011-10-30 08:00:00 (Sun)
  63437482800, #  local_start 2011-04-03 03:00:00 (Sun)
  63455623200, #    local_end 2011-10-30 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63455644800, #    utc_start 2011-10-30 08:00:00 (Sun)
  63468954000, #      utc_end 2012-04-01 09:00:00 (Sun)
  63455619600, #  local_start 2011-10-30 01:00:00 (Sun)
  63468928800, #    local_end 2012-04-01 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63468954000, #    utc_start 2012-04-01 09:00:00 (Sun)
  63487094400, #      utc_end 2012-10-28 08:00:00 (Sun)
  63468932400, #  local_start 2012-04-01 03:00:00 (Sun)
  63487072800, #    local_end 2012-10-28 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63487094400, #    utc_start 2012-10-28 08:00:00 (Sun)
  63501008400, #      utc_end 2013-04-07 09:00:00 (Sun)
  63487069200, #  local_start 2012-10-28 01:00:00 (Sun)
  63500983200, #    local_end 2013-04-07 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63501008400, #    utc_start 2013-04-07 09:00:00 (Sun)
  63518544000, #      utc_end 2013-10-27 08:00:00 (Sun)
  63500986800, #  local_start 2013-04-07 03:00:00 (Sun)
  63518522400, #    local_end 2013-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63518544000, #    utc_start 2013-10-27 08:00:00 (Sun)
  63532458000, #      utc_end 2014-04-06 09:00:00 (Sun)
  63518518800, #  local_start 2013-10-27 01:00:00 (Sun)
  63532432800, #    local_end 2014-04-06 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63532458000, #    utc_start 2014-04-06 09:00:00 (Sun)
  63549993600, #      utc_end 2014-10-26 08:00:00 (Sun)
  63532436400, #  local_start 2014-04-06 03:00:00 (Sun)
  63549972000, #    local_end 2014-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63549993600, #    utc_start 2014-10-26 08:00:00 (Sun)
  63563907600, #      utc_end 2015-04-05 09:00:00 (Sun)
  63549968400, #  local_start 2014-10-26 01:00:00 (Sun)
  63563882400, #    local_end 2015-04-05 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63563907600, #    utc_start 2015-04-05 09:00:00 (Sun)
  63581443200, #      utc_end 2015-10-25 08:00:00 (Sun)
  63563886000, #  local_start 2015-04-05 03:00:00 (Sun)
  63581421600, #    local_end 2015-10-25 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63581443200, #    utc_start 2015-10-25 08:00:00 (Sun)
  63595357200, #      utc_end 2016-04-03 09:00:00 (Sun)
  63581418000, #  local_start 2015-10-25 01:00:00 (Sun)
  63595332000, #    local_end 2016-04-03 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63595357200, #    utc_start 2016-04-03 09:00:00 (Sun)
  63613497600, #      utc_end 2016-10-30 08:00:00 (Sun)
  63595335600, #  local_start 2016-04-03 03:00:00 (Sun)
  63613476000, #    local_end 2016-10-30 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63613497600, #    utc_start 2016-10-30 08:00:00 (Sun)
  63626806800, #      utc_end 2017-04-02 09:00:00 (Sun)
  63613472400, #  local_start 2016-10-30 01:00:00 (Sun)
  63626781600, #    local_end 2017-04-02 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63626806800, #    utc_start 2017-04-02 09:00:00 (Sun)
  63644947200, #      utc_end 2017-10-29 08:00:00 (Sun)
  63626785200, #  local_start 2017-04-02 03:00:00 (Sun)
  63644925600, #    local_end 2017-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63644947200, #    utc_start 2017-10-29 08:00:00 (Sun)
  63658256400, #      utc_end 2018-04-01 09:00:00 (Sun)
  63644922000, #  local_start 2017-10-29 01:00:00 (Sun)
  63658231200, #    local_end 2018-04-01 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63658256400, #    utc_start 2018-04-01 09:00:00 (Sun)
  63676396800, #      utc_end 2018-10-28 08:00:00 (Sun)
  63658234800, #  local_start 2018-04-01 03:00:00 (Sun)
  63676375200, #    local_end 2018-10-28 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63676396800, #    utc_start 2018-10-28 08:00:00 (Sun)
  63690310800, #      utc_end 2019-04-07 09:00:00 (Sun)
  63676371600, #  local_start 2018-10-28 01:00:00 (Sun)
  63690285600, #    local_end 2019-04-07 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63690310800, #    utc_start 2019-04-07 09:00:00 (Sun)
  63707846400, #      utc_end 2019-10-27 08:00:00 (Sun)
  63690289200, #  local_start 2019-04-07 03:00:00 (Sun)
  63707824800, #    local_end 2019-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63707846400, #    utc_start 2019-10-27 08:00:00 (Sun)
  63721760400, #      utc_end 2020-04-05 09:00:00 (Sun)
  63707821200, #  local_start 2019-10-27 01:00:00 (Sun)
  63721735200, #    local_end 2020-04-05 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63721760400, #    utc_start 2020-04-05 09:00:00 (Sun)
  63739296000, #      utc_end 2020-10-25 08:00:00 (Sun)
  63721738800, #  local_start 2020-04-05 03:00:00 (Sun)
  63739274400, #    local_end 2020-10-25 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63739296000, #    utc_start 2020-10-25 08:00:00 (Sun)
  63753210000, #      utc_end 2021-04-04 09:00:00 (Sun)
  63739270800, #  local_start 2020-10-25 01:00:00 (Sun)
  63753184800, #    local_end 2021-04-04 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63753210000, #    utc_start 2021-04-04 09:00:00 (Sun)
  63771350400, #      utc_end 2021-10-31 08:00:00 (Sun)
  63753188400, #  local_start 2021-04-04 03:00:00 (Sun)
  63771328800, #    local_end 2021-10-31 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63771350400, #    utc_start 2021-10-31 08:00:00 (Sun)
  63784659600, #      utc_end 2022-04-03 09:00:00 (Sun)
  63771325200, #  local_start 2021-10-31 01:00:00 (Sun)
  63784634400, #    local_end 2022-04-03 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63784659600, #    utc_start 2022-04-03 09:00:00 (Sun)
  63802800000, #      utc_end 2022-10-30 08:00:00 (Sun)
  63784638000, #  local_start 2022-04-03 03:00:00 (Sun)
  63802778400, #    local_end 2022-10-30 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63802800000, #    utc_start 2022-10-30 08:00:00 (Sun)
  63816109200, #      utc_end 2023-04-02 09:00:00 (Sun)
  63802774800, #  local_start 2022-10-30 01:00:00 (Sun)
  63816084000, #    local_end 2023-04-02 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63816109200, #    utc_start 2023-04-02 09:00:00 (Sun)
  63834249600, #      utc_end 2023-10-29 08:00:00 (Sun)
  63816087600, #  local_start 2023-04-02 03:00:00 (Sun)
  63834228000, #    local_end 2023-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63834249600, #    utc_start 2023-10-29 08:00:00 (Sun)
  63848163600, #      utc_end 2024-04-07 09:00:00 (Sun)
  63834224400, #  local_start 2023-10-29 01:00:00 (Sun)
  63848138400, #    local_end 2024-04-07 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63848163600, #    utc_start 2024-04-07 09:00:00 (Sun)
  63865699200, #      utc_end 2024-10-27 08:00:00 (Sun)
  63848142000, #  local_start 2024-04-07 03:00:00 (Sun)
  63865677600, #    local_end 2024-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63865699200, #    utc_start 2024-10-27 08:00:00 (Sun)
  63879613200, #      utc_end 2025-04-06 09:00:00 (Sun)
  63865674000, #  local_start 2024-10-27 01:00:00 (Sun)
  63879588000, #    local_end 2025-04-06 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63879613200, #    utc_start 2025-04-06 09:00:00 (Sun)
  63897148800, #      utc_end 2025-10-26 08:00:00 (Sun)
  63879591600, #  local_start 2025-04-06 03:00:00 (Sun)
  63897127200, #    local_end 2025-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63897148800, #    utc_start 2025-10-26 08:00:00 (Sun)
  63911062800, #      utc_end 2026-04-05 09:00:00 (Sun)
  63897123600, #  local_start 2025-10-26 01:00:00 (Sun)
  63911037600, #    local_end 2026-04-05 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63911062800, #    utc_start 2026-04-05 09:00:00 (Sun)
  63928598400, #      utc_end 2026-10-25 08:00:00 (Sun)
  63911041200, #  local_start 2026-04-05 03:00:00 (Sun)
  63928576800, #    local_end 2026-10-25 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63928598400, #    utc_start 2026-10-25 08:00:00 (Sun)
  63942512400, #      utc_end 2027-04-04 09:00:00 (Sun)
  63928573200, #  local_start 2026-10-25 01:00:00 (Sun)
  63942487200, #    local_end 2027-04-04 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63942512400, #    utc_start 2027-04-04 09:00:00 (Sun)
  63960652800, #      utc_end 2027-10-31 08:00:00 (Sun)
  63942490800, #  local_start 2027-04-04 03:00:00 (Sun)
  63960631200, #    local_end 2027-10-31 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63960652800, #    utc_start 2027-10-31 08:00:00 (Sun)
  63973962000, #      utc_end 2028-04-02 09:00:00 (Sun)
  63960627600, #  local_start 2027-10-31 01:00:00 (Sun)
  63973936800, #    local_end 2028-04-02 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63973962000, #    utc_start 2028-04-02 09:00:00 (Sun)
  63992102400, #      utc_end 2028-10-29 08:00:00 (Sun)
  63973940400, #  local_start 2028-04-02 03:00:00 (Sun)
  63992080800, #    local_end 2028-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63992102400, #    utc_start 2028-10-29 08:00:00 (Sun)
  64005411600, #      utc_end 2029-04-01 09:00:00 (Sun)
  63992077200, #  local_start 2028-10-29 01:00:00 (Sun)
  64005386400, #    local_end 2029-04-01 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  64005411600, #    utc_start 2029-04-01 09:00:00 (Sun)
  64023552000, #      utc_end 2029-10-28 08:00:00 (Sun)
  64005390000, #  local_start 2029-04-01 03:00:00 (Sun)
  64023530400, #    local_end 2029-10-28 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  64023552000, #    utc_start 2029-10-28 08:00:00 (Sun)
  64037466000, #      utc_end 2030-04-07 09:00:00 (Sun)
  64023526800, #  local_start 2029-10-28 01:00:00 (Sun)
  64037440800, #    local_end 2030-04-07 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  64037466000, #    utc_start 2030-04-07 09:00:00 (Sun)
  64055001600, #      utc_end 2030-10-27 08:00:00 (Sun)
  64037444400, #  local_start 2030-04-07 03:00:00 (Sun)
  64054980000, #    local_end 2030-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {35}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -25200 }
  
  my $last_observance = bless( {
    'format' => 'M%sT',
    'gmtoff' => '-7:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 719163,
      'local_rd_secs' => 3600,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 719163,
      'utc_rd_secs' => 3600,
      'utc_year' => 1971
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -25200,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 719163,
      'local_rd_secs' => 28800,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 719163,
      'utc_rd_secs' => 28800,
      'utc_year' => 1971
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2002',
      'in' => 'Oct',
      'letter' => 'S',
      'name' => 'Mexico',
      'offset_from_std' => 0,
      'on' => 'lastSun',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2002',
      'in' => 'Apr',
      'letter' => 'D',
      'name' => 'Mexico',
      'offset_from_std' => 3600,
      'on' => 'Sun>=1',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_MAZATLAN

    $main::fatpacked{"DateTime/TimeZone/America/Menominee.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_MENOMINEE';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Menominee;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Menominee::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59475923427, #      utc_end 1885-09-18 17:50:27 (Fri)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59475902400, #    local_end 1885-09-18 12:00:00 (Fri)
  -21027,
  0,
  'LMT',
      ],
      [
  59475923427, #    utc_start 1885-09-18 17:50:27 (Fri)
  60502406400, #      utc_end 1918-03-31 08:00:00 (Sun)
  59475901827, #  local_start 1885-09-18 11:50:27 (Fri)
  60502384800, #    local_end 1918-03-31 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  60502406400, #    utc_start 1918-03-31 08:00:00 (Sun)
  60520546800, #      utc_end 1918-10-27 07:00:00 (Sun)
  60502388400, #  local_start 1918-03-31 03:00:00 (Sun)
  60520528800, #    local_end 1918-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  60520546800, #    utc_start 1918-10-27 07:00:00 (Sun)
  60533856000, #      utc_end 1919-03-30 08:00:00 (Sun)
  60520525200, #  local_start 1918-10-27 01:00:00 (Sun)
  60533834400, #    local_end 1919-03-30 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  60533856000, #    utc_start 1919-03-30 08:00:00 (Sun)
  60551996400, #      utc_end 1919-10-26 07:00:00 (Sun)
  60533838000, #  local_start 1919-03-30 03:00:00 (Sun)
  60551978400, #    local_end 1919-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  60551996400, #    utc_start 1919-10-26 07:00:00 (Sun)
  61255468800, #      utc_end 1942-02-09 08:00:00 (Mon)
  60551974800, #  local_start 1919-10-26 01:00:00 (Sun)
  61255447200, #    local_end 1942-02-09 02:00:00 (Mon)
  -21600,
  0,
  'CST',
      ],
      [
  61255468800, #    utc_start 1942-02-09 08:00:00 (Mon)
  61366287600, #      utc_end 1945-08-14 23:00:00 (Tue)
  61255450800, #  local_start 1942-02-09 03:00:00 (Mon)
  61366269600, #    local_end 1945-08-14 18:00:00 (Tue)
  -18000,
  1,
  'CWT',
      ],
      [
  61366287600, #    utc_start 1945-08-14 23:00:00 (Tue)
  61370290800, #      utc_end 1945-09-30 07:00:00 (Sun)
  61366269600, #  local_start 1945-08-14 18:00:00 (Tue)
  61370272800, #    local_end 1945-09-30 02:00:00 (Sun)
  -18000,
  1,
  'CPT',
      ],
      [
  61370290800, #    utc_start 1945-09-30 07:00:00 (Sun)
  61378322400, #      utc_end 1946-01-01 06:00:00 (Tue)
  61370269200, #  local_start 1945-09-30 01:00:00 (Sun)
  61378300800, #    local_end 1946-01-01 00:00:00 (Tue)
  -21600,
  0,
  'CST',
      ],
      [
  61378322400, #    utc_start 1946-01-01 06:00:00 (Tue)
  61388438400, #      utc_end 1946-04-28 08:00:00 (Sun)
  61378300800, #  local_start 1946-01-01 00:00:00 (Tue)
  61388416800, #    local_end 1946-04-28 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61388438400, #    utc_start 1946-04-28 08:00:00 (Sun)
  61401740400, #      utc_end 1946-09-29 07:00:00 (Sun)
  61388420400, #  local_start 1946-04-28 03:00:00 (Sun)
  61401722400, #    local_end 1946-09-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61401740400, #    utc_start 1946-09-29 07:00:00 (Sun)
  62019244800, #      utc_end 1966-04-24 08:00:00 (Sun)
  61401718800, #  local_start 1946-09-29 01:00:00 (Sun)
  62019223200, #    local_end 1966-04-24 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62019244800, #    utc_start 1966-04-24 08:00:00 (Sun)
  62035570800, #      utc_end 1966-10-30 07:00:00 (Sun)
  62019226800, #  local_start 1966-04-24 03:00:00 (Sun)
  62035552800, #    local_end 1966-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62035570800, #    utc_start 1966-10-30 07:00:00 (Sun)
  62114198400, #      utc_end 1969-04-27 08:00:00 (Sun)
  62035549200, #  local_start 1966-10-30 01:00:00 (Sun)
  62114176800, #    local_end 1969-04-27 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62114198400, #    utc_start 1969-04-27 08:00:00 (Sun)
  62240598000, #      utc_end 1973-04-29 07:00:00 (Sun)
  62114180400, #  local_start 1969-04-27 03:00:00 (Sun)
  62240580000, #    local_end 1973-04-29 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62240598000, #    utc_start 1973-04-29 07:00:00 (Sun)
  62256322800, #      utc_end 1973-10-28 07:00:00 (Sun)
  62240580000, #  local_start 1973-04-29 02:00:00 (Sun)
  62256304800, #    local_end 1973-10-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62256322800, #    utc_start 1973-10-28 07:00:00 (Sun)
  62262374400, #      utc_end 1974-01-06 08:00:00 (Sun)
  62256301200, #  local_start 1973-10-28 01:00:00 (Sun)
  62262352800, #    local_end 1974-01-06 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62262374400, #    utc_start 1974-01-06 08:00:00 (Sun)
  62287772400, #      utc_end 1974-10-27 07:00:00 (Sun)
  62262356400, #  local_start 1974-01-06 03:00:00 (Sun)
  62287754400, #    local_end 1974-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62287772400, #    utc_start 1974-10-27 07:00:00 (Sun)
  62298057600, #      utc_end 1975-02-23 08:00:00 (Sun)
  62287750800, #  local_start 1974-10-27 01:00:00 (Sun)
  62298036000, #    local_end 1975-02-23 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62298057600, #    utc_start 1975-02-23 08:00:00 (Sun)
  62319222000, #      utc_end 1975-10-26 07:00:00 (Sun)
  62298039600, #  local_start 1975-02-23 03:00:00 (Sun)
  62319204000, #    local_end 1975-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62319222000, #    utc_start 1975-10-26 07:00:00 (Sun)
  62334950400, #      utc_end 1976-04-25 08:00:00 (Sun)
  62319200400, #  local_start 1975-10-26 01:00:00 (Sun)
  62334928800, #    local_end 1976-04-25 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62334950400, #    utc_start 1976-04-25 08:00:00 (Sun)
  62351276400, #      utc_end 1976-10-31 07:00:00 (Sun)
  62334932400, #  local_start 1976-04-25 03:00:00 (Sun)
  62351258400, #    local_end 1976-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62351276400, #    utc_start 1976-10-31 07:00:00 (Sun)
  62366400000, #      utc_end 1977-04-24 08:00:00 (Sun)
  62351254800, #  local_start 1976-10-31 01:00:00 (Sun)
  62366378400, #    local_end 1977-04-24 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62366400000, #    utc_start 1977-04-24 08:00:00 (Sun)
  62382726000, #      utc_end 1977-10-30 07:00:00 (Sun)
  62366382000, #  local_start 1977-04-24 03:00:00 (Sun)
  62382708000, #    local_end 1977-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62382726000, #    utc_start 1977-10-30 07:00:00 (Sun)
  62398454400, #      utc_end 1978-04-30 08:00:00 (Sun)
  62382704400, #  local_start 1977-10-30 01:00:00 (Sun)
  62398432800, #    local_end 1978-04-30 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62398454400, #    utc_start 1978-04-30 08:00:00 (Sun)
  62414175600, #      utc_end 1978-10-29 07:00:00 (Sun)
  62398436400, #  local_start 1978-04-30 03:00:00 (Sun)
  62414157600, #    local_end 1978-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62414175600, #    utc_start 1978-10-29 07:00:00 (Sun)
  62429904000, #      utc_end 1979-04-29 08:00:00 (Sun)
  62414154000, #  local_start 1978-10-29 01:00:00 (Sun)
  62429882400, #    local_end 1979-04-29 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62429904000, #    utc_start 1979-04-29 08:00:00 (Sun)
  62445625200, #      utc_end 1979-10-28 07:00:00 (Sun)
  62429886000, #  local_start 1979-04-29 03:00:00 (Sun)
  62445607200, #    local_end 1979-10-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62445625200, #    utc_start 1979-10-28 07:00:00 (Sun)
  62461353600, #      utc_end 1980-04-27 08:00:00 (Sun)
  62445603600, #  local_start 1979-10-28 01:00:00 (Sun)
  62461332000, #    local_end 1980-04-27 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62461353600, #    utc_start 1980-04-27 08:00:00 (Sun)
  62477074800, #      utc_end 1980-10-26 07:00:00 (Sun)
  62461335600, #  local_start 1980-04-27 03:00:00 (Sun)
  62477056800, #    local_end 1980-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62477074800, #    utc_start 1980-10-26 07:00:00 (Sun)
  62492803200, #      utc_end 1981-04-26 08:00:00 (Sun)
  62477053200, #  local_start 1980-10-26 01:00:00 (Sun)
  62492781600, #    local_end 1981-04-26 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62492803200, #    utc_start 1981-04-26 08:00:00 (Sun)
  62508524400, #      utc_end 1981-10-25 07:00:00 (Sun)
  62492785200, #  local_start 1981-04-26 03:00:00 (Sun)
  62508506400, #    local_end 1981-10-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62508524400, #    utc_start 1981-10-25 07:00:00 (Sun)
  62524252800, #      utc_end 1982-04-25 08:00:00 (Sun)
  62508502800, #  local_start 1981-10-25 01:00:00 (Sun)
  62524231200, #    local_end 1982-04-25 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62524252800, #    utc_start 1982-04-25 08:00:00 (Sun)
  62540578800, #      utc_end 1982-10-31 07:00:00 (Sun)
  62524234800, #  local_start 1982-04-25 03:00:00 (Sun)
  62540560800, #    local_end 1982-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62540578800, #    utc_start 1982-10-31 07:00:00 (Sun)
  62555702400, #      utc_end 1983-04-24 08:00:00 (Sun)
  62540557200, #  local_start 1982-10-31 01:00:00 (Sun)
  62555680800, #    local_end 1983-04-24 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62555702400, #    utc_start 1983-04-24 08:00:00 (Sun)
  62572028400, #      utc_end 1983-10-30 07:00:00 (Sun)
  62555684400, #  local_start 1983-04-24 03:00:00 (Sun)
  62572010400, #    local_end 1983-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62572028400, #    utc_start 1983-10-30 07:00:00 (Sun)
  62587756800, #      utc_end 1984-04-29 08:00:00 (Sun)
  62572006800, #  local_start 1983-10-30 01:00:00 (Sun)
  62587735200, #    local_end 1984-04-29 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62587756800, #    utc_start 1984-04-29 08:00:00 (Sun)
  62603478000, #      utc_end 1984-10-28 07:00:00 (Sun)
  62587738800, #  local_start 1984-04-29 03:00:00 (Sun)
  62603460000, #    local_end 1984-10-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62603478000, #    utc_start 1984-10-28 07:00:00 (Sun)
  62619206400, #      utc_end 1985-04-28 08:00:00 (Sun)
  62603456400, #  local_start 1984-10-28 01:00:00 (Sun)
  62619184800, #    local_end 1985-04-28 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62619206400, #    utc_start 1985-04-28 08:00:00 (Sun)
  62634927600, #      utc_end 1985-10-27 07:00:00 (Sun)
  62619188400, #  local_start 1985-04-28 03:00:00 (Sun)
  62634909600, #    local_end 1985-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62634927600, #    utc_start 1985-10-27 07:00:00 (Sun)
  62650656000, #      utc_end 1986-04-27 08:00:00 (Sun)
  62634906000, #  local_start 1985-10-27 01:00:00 (Sun)
  62650634400, #    local_end 1986-04-27 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62650656000, #    utc_start 1986-04-27 08:00:00 (Sun)
  62666377200, #      utc_end 1986-10-26 07:00:00 (Sun)
  62650638000, #  local_start 1986-04-27 03:00:00 (Sun)
  62666359200, #    local_end 1986-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62666377200, #    utc_start 1986-10-26 07:00:00 (Sun)
  62680291200, #      utc_end 1987-04-05 08:00:00 (Sun)
  62666355600, #  local_start 1986-10-26 01:00:00 (Sun)
  62680269600, #    local_end 1987-04-05 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62680291200, #    utc_start 1987-04-05 08:00:00 (Sun)
  62697826800, #      utc_end 1987-10-25 07:00:00 (Sun)
  62680273200, #  local_start 1987-04-05 03:00:00 (Sun)
  62697808800, #    local_end 1987-10-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62697826800, #    utc_start 1987-10-25 07:00:00 (Sun)
  62711740800, #      utc_end 1988-04-03 08:00:00 (Sun)
  62697805200, #  local_start 1987-10-25 01:00:00 (Sun)
  62711719200, #    local_end 1988-04-03 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62711740800, #    utc_start 1988-04-03 08:00:00 (Sun)
  62729881200, #      utc_end 1988-10-30 07:00:00 (Sun)
  62711722800, #  local_start 1988-04-03 03:00:00 (Sun)
  62729863200, #    local_end 1988-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62729881200, #    utc_start 1988-10-30 07:00:00 (Sun)
  62743190400, #      utc_end 1989-04-02 08:00:00 (Sun)
  62729859600, #  local_start 1988-10-30 01:00:00 (Sun)
  62743168800, #    local_end 1989-04-02 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62743190400, #    utc_start 1989-04-02 08:00:00 (Sun)
  62761330800, #      utc_end 1989-10-29 07:00:00 (Sun)
  62743172400, #  local_start 1989-04-02 03:00:00 (Sun)
  62761312800, #    local_end 1989-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62761330800, #    utc_start 1989-10-29 07:00:00 (Sun)
  62774640000, #      utc_end 1990-04-01 08:00:00 (Sun)
  62761309200, #  local_start 1989-10-29 01:00:00 (Sun)
  62774618400, #    local_end 1990-04-01 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62774640000, #    utc_start 1990-04-01 08:00:00 (Sun)
  62792780400, #      utc_end 1990-10-28 07:00:00 (Sun)
  62774622000, #  local_start 1990-04-01 03:00:00 (Sun)
  62792762400, #    local_end 1990-10-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62792780400, #    utc_start 1990-10-28 07:00:00 (Sun)
  62806694400, #      utc_end 1991-04-07 08:00:00 (Sun)
  62792758800, #  local_start 1990-10-28 01:00:00 (Sun)
  62806672800, #    local_end 1991-04-07 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62806694400, #    utc_start 1991-04-07 08:00:00 (Sun)
  62824230000, #      utc_end 1991-10-27 07:00:00 (Sun)
  62806676400, #  local_start 1991-04-07 03:00:00 (Sun)
  62824212000, #    local_end 1991-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62824230000, #    utc_start 1991-10-27 07:00:00 (Sun)
  62838144000, #      utc_end 1992-04-05 08:00:00 (Sun)
  62824208400, #  local_start 1991-10-27 01:00:00 (Sun)
  62838122400, #    local_end 1992-04-05 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62838144000, #    utc_start 1992-04-05 08:00:00 (Sun)
  62855679600, #      utc_end 1992-10-25 07:00:00 (Sun)
  62838126000, #  local_start 1992-04-05 03:00:00 (Sun)
  62855661600, #    local_end 1992-10-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62855679600, #    utc_start 1992-10-25 07:00:00 (Sun)
  62869593600, #      utc_end 1993-04-04 08:00:00 (Sun)
  62855658000, #  local_start 1992-10-25 01:00:00 (Sun)
  62869572000, #    local_end 1993-04-04 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62869593600, #    utc_start 1993-04-04 08:00:00 (Sun)
  62887734000, #      utc_end 1993-10-31 07:00:00 (Sun)
  62869575600, #  local_start 1993-04-04 03:00:00 (Sun)
  62887716000, #    local_end 1993-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62887734000, #    utc_start 1993-10-31 07:00:00 (Sun)
  62901043200, #      utc_end 1994-04-03 08:00:00 (Sun)
  62887712400, #  local_start 1993-10-31 01:00:00 (Sun)
  62901021600, #    local_end 1994-04-03 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62901043200, #    utc_start 1994-04-03 08:00:00 (Sun)
  62919183600, #      utc_end 1994-10-30 07:00:00 (Sun)
  62901025200, #  local_start 1994-04-03 03:00:00 (Sun)
  62919165600, #    local_end 1994-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62919183600, #    utc_start 1994-10-30 07:00:00 (Sun)
  62932492800, #      utc_end 1995-04-02 08:00:00 (Sun)
  62919162000, #  local_start 1994-10-30 01:00:00 (Sun)
  62932471200, #    local_end 1995-04-02 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62932492800, #    utc_start 1995-04-02 08:00:00 (Sun)
  62950633200, #      utc_end 1995-10-29 07:00:00 (Sun)
  62932474800, #  local_start 1995-04-02 03:00:00 (Sun)
  62950615200, #    local_end 1995-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62950633200, #    utc_start 1995-10-29 07:00:00 (Sun)
  62964547200, #      utc_end 1996-04-07 08:00:00 (Sun)
  62950611600, #  local_start 1995-10-29 01:00:00 (Sun)
  62964525600, #    local_end 1996-04-07 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62964547200, #    utc_start 1996-04-07 08:00:00 (Sun)
  62982082800, #      utc_end 1996-10-27 07:00:00 (Sun)
  62964529200, #  local_start 1996-04-07 03:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62982082800, #    utc_start 1996-10-27 07:00:00 (Sun)
  62995996800, #      utc_end 1997-04-06 08:00:00 (Sun)
  62982061200, #  local_start 1996-10-27 01:00:00 (Sun)
  62995975200, #    local_end 1997-04-06 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62995996800, #    utc_start 1997-04-06 08:00:00 (Sun)
  63013532400, #      utc_end 1997-10-26 07:00:00 (Sun)
  62995978800, #  local_start 1997-04-06 03:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63013532400, #    utc_start 1997-10-26 07:00:00 (Sun)
  63027446400, #      utc_end 1998-04-05 08:00:00 (Sun)
  63013510800, #  local_start 1997-10-26 01:00:00 (Sun)
  63027424800, #    local_end 1998-04-05 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63027446400, #    utc_start 1998-04-05 08:00:00 (Sun)
  63044982000, #      utc_end 1998-10-25 07:00:00 (Sun)
  63027428400, #  local_start 1998-04-05 03:00:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63044982000, #    utc_start 1998-10-25 07:00:00 (Sun)
  63058896000, #      utc_end 1999-04-04 08:00:00 (Sun)
  63044960400, #  local_start 1998-10-25 01:00:00 (Sun)
  63058874400, #    local_end 1999-04-04 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63058896000, #    utc_start 1999-04-04 08:00:00 (Sun)
  63077036400, #      utc_end 1999-10-31 07:00:00 (Sun)
  63058878000, #  local_start 1999-04-04 03:00:00 (Sun)
  63077018400, #    local_end 1999-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63077036400, #    utc_start 1999-10-31 07:00:00 (Sun)
  63090345600, #      utc_end 2000-04-02 08:00:00 (Sun)
  63077014800, #  local_start 1999-10-31 01:00:00 (Sun)
  63090324000, #    local_end 2000-04-02 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63090345600, #    utc_start 2000-04-02 08:00:00 (Sun)
  63108486000, #      utc_end 2000-10-29 07:00:00 (Sun)
  63090327600, #  local_start 2000-04-02 03:00:00 (Sun)
  63108468000, #    local_end 2000-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63108486000, #    utc_start 2000-10-29 07:00:00 (Sun)
  63121795200, #      utc_end 2001-04-01 08:00:00 (Sun)
  63108464400, #  local_start 2000-10-29 01:00:00 (Sun)
  63121773600, #    local_end 2001-04-01 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63121795200, #    utc_start 2001-04-01 08:00:00 (Sun)
  63139935600, #      utc_end 2001-10-28 07:00:00 (Sun)
  63121777200, #  local_start 2001-04-01 03:00:00 (Sun)
  63139917600, #    local_end 2001-10-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63139935600, #    utc_start 2001-10-28 07:00:00 (Sun)
  63153849600, #      utc_end 2002-04-07 08:00:00 (Sun)
  63139914000, #  local_start 2001-10-28 01:00:00 (Sun)
  63153828000, #    local_end 2002-04-07 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63153849600, #    utc_start 2002-04-07 08:00:00 (Sun)
  63171385200, #      utc_end 2002-10-27 07:00:00 (Sun)
  63153831600, #  local_start 2002-04-07 03:00:00 (Sun)
  63171367200, #    local_end 2002-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63171385200, #    utc_start 2002-10-27 07:00:00 (Sun)
  63185299200, #      utc_end 2003-04-06 08:00:00 (Sun)
  63171363600, #  local_start 2002-10-27 01:00:00 (Sun)
  63185277600, #    local_end 2003-04-06 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63185299200, #    utc_start 2003-04-06 08:00:00 (Sun)
  63202834800, #      utc_end 2003-10-26 07:00:00 (Sun)
  63185281200, #  local_start 2003-04-06 03:00:00 (Sun)
  63202816800, #    local_end 2003-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63202834800, #    utc_start 2003-10-26 07:00:00 (Sun)
  63216748800, #      utc_end 2004-04-04 08:00:00 (Sun)
  63202813200, #  local_start 2003-10-26 01:00:00 (Sun)
  63216727200, #    local_end 2004-04-04 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63216748800, #    utc_start 2004-04-04 08:00:00 (Sun)
  63234889200, #      utc_end 2004-10-31 07:00:00 (Sun)
  63216730800, #  local_start 2004-04-04 03:00:00 (Sun)
  63234871200, #    local_end 2004-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63234889200, #    utc_start 2004-10-31 07:00:00 (Sun)
  63248198400, #      utc_end 2005-04-03 08:00:00 (Sun)
  63234867600, #  local_start 2004-10-31 01:00:00 (Sun)
  63248176800, #    local_end 2005-04-03 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63248198400, #    utc_start 2005-04-03 08:00:00 (Sun)
  63266338800, #      utc_end 2005-10-30 07:00:00 (Sun)
  63248180400, #  local_start 2005-04-03 03:00:00 (Sun)
  63266320800, #    local_end 2005-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63266338800, #    utc_start 2005-10-30 07:00:00 (Sun)
  63279648000, #      utc_end 2006-04-02 08:00:00 (Sun)
  63266317200, #  local_start 2005-10-30 01:00:00 (Sun)
  63279626400, #    local_end 2006-04-02 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63279648000, #    utc_start 2006-04-02 08:00:00 (Sun)
  63297788400, #      utc_end 2006-10-29 07:00:00 (Sun)
  63279630000, #  local_start 2006-04-02 03:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63297788400, #    utc_start 2006-10-29 07:00:00 (Sun)
  63309283200, #      utc_end 2007-03-11 08:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63309261600, #    local_end 2007-03-11 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63309283200, #    utc_start 2007-03-11 08:00:00 (Sun)
  63329842800, #      utc_end 2007-11-04 07:00:00 (Sun)
  63309265200, #  local_start 2007-03-11 03:00:00 (Sun)
  63329824800, #    local_end 2007-11-04 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63329842800, #    utc_start 2007-11-04 07:00:00 (Sun)
  63340732800, #      utc_end 2008-03-09 08:00:00 (Sun)
  63329821200, #  local_start 2007-11-04 01:00:00 (Sun)
  63340711200, #    local_end 2008-03-09 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63340732800, #    utc_start 2008-03-09 08:00:00 (Sun)
  63361292400, #      utc_end 2008-11-02 07:00:00 (Sun)
  63340714800, #  local_start 2008-03-09 03:00:00 (Sun)
  63361274400, #    local_end 2008-11-02 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63361292400, #    utc_start 2008-11-02 07:00:00 (Sun)
  63372182400, #      utc_end 2009-03-08 08:00:00 (Sun)
  63361270800, #  local_start 2008-11-02 01:00:00 (Sun)
  63372160800, #    local_end 2009-03-08 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63372182400, #    utc_start 2009-03-08 08:00:00 (Sun)
  63392742000, #      utc_end 2009-11-01 07:00:00 (Sun)
  63372164400, #  local_start 2009-03-08 03:00:00 (Sun)
  63392724000, #    local_end 2009-11-01 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63392742000, #    utc_start 2009-11-01 07:00:00 (Sun)
  63404236800, #      utc_end 2010-03-14 08:00:00 (Sun)
  63392720400, #  local_start 2009-11-01 01:00:00 (Sun)
  63404215200, #    local_end 2010-03-14 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63404236800, #    utc_start 2010-03-14 08:00:00 (Sun)
  63424796400, #      utc_end 2010-11-07 07:00:00 (Sun)
  63404218800, #  local_start 2010-03-14 03:00:00 (Sun)
  63424778400, #    local_end 2010-11-07 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63424796400, #    utc_start 2010-11-07 07:00:00 (Sun)
  63435686400, #      utc_end 2011-03-13 08:00:00 (Sun)
  63424774800, #  local_start 2010-11-07 01:00:00 (Sun)
  63435664800, #    local_end 2011-03-13 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63435686400, #    utc_start 2011-03-13 08:00:00 (Sun)
  63456246000, #      utc_end 2011-11-06 07:00:00 (Sun)
  63435668400, #  local_start 2011-03-13 03:00:00 (Sun)
  63456228000, #    local_end 2011-11-06 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63456246000, #    utc_start 2011-11-06 07:00:00 (Sun)
  63467136000, #      utc_end 2012-03-11 08:00:00 (Sun)
  63456224400, #  local_start 2011-11-06 01:00:00 (Sun)
  63467114400, #    local_end 2012-03-11 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63467136000, #    utc_start 2012-03-11 08:00:00 (Sun)
  63487695600, #      utc_end 2012-11-04 07:00:00 (Sun)
  63467118000, #  local_start 2012-03-11 03:00:00 (Sun)
  63487677600, #    local_end 2012-11-04 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63487695600, #    utc_start 2012-11-04 07:00:00 (Sun)
  63498585600, #      utc_end 2013-03-10 08:00:00 (Sun)
  63487674000, #  local_start 2012-11-04 01:00:00 (Sun)
  63498564000, #    local_end 2013-03-10 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63498585600, #    utc_start 2013-03-10 08:00:00 (Sun)
  63519145200, #      utc_end 2013-11-03 07:00:00 (Sun)
  63498567600, #  local_start 2013-03-10 03:00:00 (Sun)
  63519127200, #    local_end 2013-11-03 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63519145200, #    utc_start 2013-11-03 07:00:00 (Sun)
  63530035200, #      utc_end 2014-03-09 08:00:00 (Sun)
  63519123600, #  local_start 2013-11-03 01:00:00 (Sun)
  63530013600, #    local_end 2014-03-09 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63530035200, #    utc_start 2014-03-09 08:00:00 (Sun)
  63550594800, #      utc_end 2014-11-02 07:00:00 (Sun)
  63530017200, #  local_start 2014-03-09 03:00:00 (Sun)
  63550576800, #    local_end 2014-11-02 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63550594800, #    utc_start 2014-11-02 07:00:00 (Sun)
  63561484800, #      utc_end 2015-03-08 08:00:00 (Sun)
  63550573200, #  local_start 2014-11-02 01:00:00 (Sun)
  63561463200, #    local_end 2015-03-08 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63561484800, #    utc_start 2015-03-08 08:00:00 (Sun)
  63582044400, #      utc_end 2015-11-01 07:00:00 (Sun)
  63561466800, #  local_start 2015-03-08 03:00:00 (Sun)
  63582026400, #    local_end 2015-11-01 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63582044400, #    utc_start 2015-11-01 07:00:00 (Sun)
  63593539200, #      utc_end 2016-03-13 08:00:00 (Sun)
  63582022800, #  local_start 2015-11-01 01:00:00 (Sun)
  63593517600, #    local_end 2016-03-13 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63593539200, #    utc_start 2016-03-13 08:00:00 (Sun)
  63614098800, #      utc_end 2016-11-06 07:00:00 (Sun)
  63593521200, #  local_start 2016-03-13 03:00:00 (Sun)
  63614080800, #    local_end 2016-11-06 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63614098800, #    utc_start 2016-11-06 07:00:00 (Sun)
  63624988800, #      utc_end 2017-03-12 08:00:00 (Sun)
  63614077200, #  local_start 2016-11-06 01:00:00 (Sun)
  63624967200, #    local_end 2017-03-12 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63624988800, #    utc_start 2017-03-12 08:00:00 (Sun)
  63645548400, #      utc_end 2017-11-05 07:00:00 (Sun)
  63624970800, #  local_start 2017-03-12 03:00:00 (Sun)
  63645530400, #    local_end 2017-11-05 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63645548400, #    utc_start 2017-11-05 07:00:00 (Sun)
  63656438400, #      utc_end 2018-03-11 08:00:00 (Sun)
  63645526800, #  local_start 2017-11-05 01:00:00 (Sun)
  63656416800, #    local_end 2018-03-11 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63656438400, #    utc_start 2018-03-11 08:00:00 (Sun)
  63676998000, #      utc_end 2018-11-04 07:00:00 (Sun)
  63656420400, #  local_start 2018-03-11 03:00:00 (Sun)
  63676980000, #    local_end 2018-11-04 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63676998000, #    utc_start 2018-11-04 07:00:00 (Sun)
  63687888000, #      utc_end 2019-03-10 08:00:00 (Sun)
  63676976400, #  local_start 2018-11-04 01:00:00 (Sun)
  63687866400, #    local_end 2019-03-10 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63687888000, #    utc_start 2019-03-10 08:00:00 (Sun)
  63708447600, #      utc_end 2019-11-03 07:00:00 (Sun)
  63687870000, #  local_start 2019-03-10 03:00:00 (Sun)
  63708429600, #    local_end 2019-11-03 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63708447600, #    utc_start 2019-11-03 07:00:00 (Sun)
  63719337600, #      utc_end 2020-03-08 08:00:00 (Sun)
  63708426000, #  local_start 2019-11-03 01:00:00 (Sun)
  63719316000, #    local_end 2020-03-08 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63719337600, #    utc_start 2020-03-08 08:00:00 (Sun)
  63739897200, #      utc_end 2020-11-01 07:00:00 (Sun)
  63719319600, #  local_start 2020-03-08 03:00:00 (Sun)
  63739879200, #    local_end 2020-11-01 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63739897200, #    utc_start 2020-11-01 07:00:00 (Sun)
  63751392000, #      utc_end 2021-03-14 08:00:00 (Sun)
  63739875600, #  local_start 2020-11-01 01:00:00 (Sun)
  63751370400, #    local_end 2021-03-14 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63751392000, #    utc_start 2021-03-14 08:00:00 (Sun)
  63771951600, #      utc_end 2021-11-07 07:00:00 (Sun)
  63751374000, #  local_start 2021-03-14 03:00:00 (Sun)
  63771933600, #    local_end 2021-11-07 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63771951600, #    utc_start 2021-11-07 07:00:00 (Sun)
  63782841600, #      utc_end 2022-03-13 08:00:00 (Sun)
  63771930000, #  local_start 2021-11-07 01:00:00 (Sun)
  63782820000, #    local_end 2022-03-13 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63782841600, #    utc_start 2022-03-13 08:00:00 (Sun)
  63803401200, #      utc_end 2022-11-06 07:00:00 (Sun)
  63782823600, #  local_start 2022-03-13 03:00:00 (Sun)
  63803383200, #    local_end 2022-11-06 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63803401200, #    utc_start 2022-11-06 07:00:00 (Sun)
  63814291200, #      utc_end 2023-03-12 08:00:00 (Sun)
  63803379600, #  local_start 2022-11-06 01:00:00 (Sun)
  63814269600, #    local_end 2023-03-12 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63814291200, #    utc_start 2023-03-12 08:00:00 (Sun)
  63834850800, #      utc_end 2023-11-05 07:00:00 (Sun)
  63814273200, #  local_start 2023-03-12 03:00:00 (Sun)
  63834832800, #    local_end 2023-11-05 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63834850800, #    utc_start 2023-11-05 07:00:00 (Sun)
  63845740800, #      utc_end 2024-03-10 08:00:00 (Sun)
  63834829200, #  local_start 2023-11-05 01:00:00 (Sun)
  63845719200, #    local_end 2024-03-10 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63845740800, #    utc_start 2024-03-10 08:00:00 (Sun)
  63866300400, #      utc_end 2024-11-03 07:00:00 (Sun)
  63845722800, #  local_start 2024-03-10 03:00:00 (Sun)
  63866282400, #    local_end 2024-11-03 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63866300400, #    utc_start 2024-11-03 07:00:00 (Sun)
  63877190400, #      utc_end 2025-03-09 08:00:00 (Sun)
  63866278800, #  local_start 2024-11-03 01:00:00 (Sun)
  63877168800, #    local_end 2025-03-09 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63877190400, #    utc_start 2025-03-09 08:00:00 (Sun)
  63897750000, #      utc_end 2025-11-02 07:00:00 (Sun)
  63877172400, #  local_start 2025-03-09 03:00:00 (Sun)
  63897732000, #    local_end 2025-11-02 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63897750000, #    utc_start 2025-11-02 07:00:00 (Sun)
  63908640000, #      utc_end 2026-03-08 08:00:00 (Sun)
  63897728400, #  local_start 2025-11-02 01:00:00 (Sun)
  63908618400, #    local_end 2026-03-08 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63908640000, #    utc_start 2026-03-08 08:00:00 (Sun)
  63929199600, #      utc_end 2026-11-01 07:00:00 (Sun)
  63908622000, #  local_start 2026-03-08 03:00:00 (Sun)
  63929181600, #    local_end 2026-11-01 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63929199600, #    utc_start 2026-11-01 07:00:00 (Sun)
  63940694400, #      utc_end 2027-03-14 08:00:00 (Sun)
  63929178000, #  local_start 2026-11-01 01:00:00 (Sun)
  63940672800, #    local_end 2027-03-14 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63940694400, #    utc_start 2027-03-14 08:00:00 (Sun)
  63961254000, #      utc_end 2027-11-07 07:00:00 (Sun)
  63940676400, #  local_start 2027-03-14 03:00:00 (Sun)
  63961236000, #    local_end 2027-11-07 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63961254000, #    utc_start 2027-11-07 07:00:00 (Sun)
  63972144000, #      utc_end 2028-03-12 08:00:00 (Sun)
  63961232400, #  local_start 2027-11-07 01:00:00 (Sun)
  63972122400, #    local_end 2028-03-12 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63972144000, #    utc_start 2028-03-12 08:00:00 (Sun)
  63992703600, #      utc_end 2028-11-05 07:00:00 (Sun)
  63972126000, #  local_start 2028-03-12 03:00:00 (Sun)
  63992685600, #    local_end 2028-11-05 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63992703600, #    utc_start 2028-11-05 07:00:00 (Sun)
  64003593600, #      utc_end 2029-03-11 08:00:00 (Sun)
  63992682000, #  local_start 2028-11-05 01:00:00 (Sun)
  64003572000, #    local_end 2029-03-11 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  64003593600, #    utc_start 2029-03-11 08:00:00 (Sun)
  64024153200, #      utc_end 2029-11-04 07:00:00 (Sun)
  64003575600, #  local_start 2029-03-11 03:00:00 (Sun)
  64024135200, #    local_end 2029-11-04 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  64024153200, #    utc_start 2029-11-04 07:00:00 (Sun)
  64035043200, #      utc_end 2030-03-10 08:00:00 (Sun)
  64024131600, #  local_start 2029-11-04 01:00:00 (Sun)
  64035021600, #    local_end 2030-03-10 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  64035043200, #    utc_start 2030-03-10 08:00:00 (Sun)
  64055602800, #      utc_end 2030-11-03 07:00:00 (Sun)
  64035025200, #  local_start 2030-03-10 03:00:00 (Sun)
  64055584800, #    local_end 2030-11-03 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {64}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -21600 }
  
  my $last_observance = bless( {
    'format' => 'C%sT',
    'gmtoff' => '-6:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 720377,
      'local_rd_secs' => 7200,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 720377,
      'utc_rd_secs' => 7200,
      'utc_year' => 1974
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -21600,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 720377,
      'local_rd_secs' => 25200,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 720377,
      'utc_rd_secs' => 25200,
      'utc_year' => 1974
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Mar',
      'letter' => 'D',
      'name' => 'US',
      'offset_from_std' => 3600,
      'on' => 'Sun>=8',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Nov',
      'letter' => 'S',
      'name' => 'US',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_MENOMINEE

    $main::fatpacked{"DateTime/TimeZone/America/Merida.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_MERIDA';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Merida;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Merida::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60620940000, #      utc_end 1922-01-01 06:00:00 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60620918492, #    local_end 1922-01-01 00:01:32 (Sun)
  -21508,
  0,
  'LMT',
      ],
      [
  60620940000, #    utc_start 1922-01-01 06:00:00 (Sun)
  62513618400, #      utc_end 1981-12-23 06:00:00 (Wed)
  60620918400, #  local_start 1922-01-01 00:00:00 (Sun)
  62513596800, #    local_end 1981-12-23 00:00:00 (Wed)
  -21600,
  0,
  'CST',
      ],
      [
  62513618400, #    utc_start 1981-12-23 06:00:00 (Wed)
  62543336400, #      utc_end 1982-12-02 05:00:00 (Thu)
  62513600400, #  local_start 1981-12-23 01:00:00 (Wed)
  62543318400, #    local_end 1982-12-02 00:00:00 (Thu)
  -18000,
  0,
  'EST',
      ],
      [
  62543336400, #    utc_start 1982-12-02 05:00:00 (Thu)
  62964547200, #      utc_end 1996-04-07 08:00:00 (Sun)
  62543314800, #  local_start 1982-12-01 23:00:00 (Wed)
  62964525600, #    local_end 1996-04-07 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62964547200, #    utc_start 1996-04-07 08:00:00 (Sun)
  62982082800, #      utc_end 1996-10-27 07:00:00 (Sun)
  62964529200, #  local_start 1996-04-07 03:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62982082800, #    utc_start 1996-10-27 07:00:00 (Sun)
  62995996800, #      utc_end 1997-04-06 08:00:00 (Sun)
  62982061200, #  local_start 1996-10-27 01:00:00 (Sun)
  62995975200, #    local_end 1997-04-06 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62995996800, #    utc_start 1997-04-06 08:00:00 (Sun)
  63013532400, #      utc_end 1997-10-26 07:00:00 (Sun)
  62995978800, #  local_start 1997-04-06 03:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63013532400, #    utc_start 1997-10-26 07:00:00 (Sun)
  63027446400, #      utc_end 1998-04-05 08:00:00 (Sun)
  63013510800, #  local_start 1997-10-26 01:00:00 (Sun)
  63027424800, #    local_end 1998-04-05 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63027446400, #    utc_start 1998-04-05 08:00:00 (Sun)
  63044982000, #      utc_end 1998-10-25 07:00:00 (Sun)
  63027428400, #  local_start 1998-04-05 03:00:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63044982000, #    utc_start 1998-10-25 07:00:00 (Sun)
  63058896000, #      utc_end 1999-04-04 08:00:00 (Sun)
  63044960400, #  local_start 1998-10-25 01:00:00 (Sun)
  63058874400, #    local_end 1999-04-04 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63058896000, #    utc_start 1999-04-04 08:00:00 (Sun)
  63077036400, #      utc_end 1999-10-31 07:00:00 (Sun)
  63058878000, #  local_start 1999-04-04 03:00:00 (Sun)
  63077018400, #    local_end 1999-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63077036400, #    utc_start 1999-10-31 07:00:00 (Sun)
  63090345600, #      utc_end 2000-04-02 08:00:00 (Sun)
  63077014800, #  local_start 1999-10-31 01:00:00 (Sun)
  63090324000, #    local_end 2000-04-02 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63090345600, #    utc_start 2000-04-02 08:00:00 (Sun)
  63108486000, #      utc_end 2000-10-29 07:00:00 (Sun)
  63090327600, #  local_start 2000-04-02 03:00:00 (Sun)
  63108468000, #    local_end 2000-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63108486000, #    utc_start 2000-10-29 07:00:00 (Sun)
  63124819200, #      utc_end 2001-05-06 08:00:00 (Sun)
  63108464400, #  local_start 2000-10-29 01:00:00 (Sun)
  63124797600, #    local_end 2001-05-06 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63124819200, #    utc_start 2001-05-06 08:00:00 (Sun)
  63137516400, #      utc_end 2001-09-30 07:00:00 (Sun)
  63124801200, #  local_start 2001-05-06 03:00:00 (Sun)
  63137498400, #    local_end 2001-09-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63137516400, #    utc_start 2001-09-30 07:00:00 (Sun)
  63153849600, #      utc_end 2002-04-07 08:00:00 (Sun)
  63137494800, #  local_start 2001-09-30 01:00:00 (Sun)
  63153828000, #    local_end 2002-04-07 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63153849600, #    utc_start 2002-04-07 08:00:00 (Sun)
  63171385200, #      utc_end 2002-10-27 07:00:00 (Sun)
  63153831600, #  local_start 2002-04-07 03:00:00 (Sun)
  63171367200, #    local_end 2002-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63171385200, #    utc_start 2002-10-27 07:00:00 (Sun)
  63185299200, #      utc_end 2003-04-06 08:00:00 (Sun)
  63171363600, #  local_start 2002-10-27 01:00:00 (Sun)
  63185277600, #    local_end 2003-04-06 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63185299200, #    utc_start 2003-04-06 08:00:00 (Sun)
  63202834800, #      utc_end 2003-10-26 07:00:00 (Sun)
  63185281200, #  local_start 2003-04-06 03:00:00 (Sun)
  63202816800, #    local_end 2003-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63202834800, #    utc_start 2003-10-26 07:00:00 (Sun)
  63216748800, #      utc_end 2004-04-04 08:00:00 (Sun)
  63202813200, #  local_start 2003-10-26 01:00:00 (Sun)
  63216727200, #    local_end 2004-04-04 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63216748800, #    utc_start 2004-04-04 08:00:00 (Sun)
  63234889200, #      utc_end 2004-10-31 07:00:00 (Sun)
  63216730800, #  local_start 2004-04-04 03:00:00 (Sun)
  63234871200, #    local_end 2004-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63234889200, #    utc_start 2004-10-31 07:00:00 (Sun)
  63248198400, #      utc_end 2005-04-03 08:00:00 (Sun)
  63234867600, #  local_start 2004-10-31 01:00:00 (Sun)
  63248176800, #    local_end 2005-04-03 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63248198400, #    utc_start 2005-04-03 08:00:00 (Sun)
  63266338800, #      utc_end 2005-10-30 07:00:00 (Sun)
  63248180400, #  local_start 2005-04-03 03:00:00 (Sun)
  63266320800, #    local_end 2005-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63266338800, #    utc_start 2005-10-30 07:00:00 (Sun)
  63279648000, #      utc_end 2006-04-02 08:00:00 (Sun)
  63266317200, #  local_start 2005-10-30 01:00:00 (Sun)
  63279626400, #    local_end 2006-04-02 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63279648000, #    utc_start 2006-04-02 08:00:00 (Sun)
  63297788400, #      utc_end 2006-10-29 07:00:00 (Sun)
  63279630000, #  local_start 2006-04-02 03:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63297788400, #    utc_start 2006-10-29 07:00:00 (Sun)
  63311097600, #      utc_end 2007-04-01 08:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63311076000, #    local_end 2007-04-01 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63311097600, #    utc_start 2007-04-01 08:00:00 (Sun)
  63329238000, #      utc_end 2007-10-28 07:00:00 (Sun)
  63311079600, #  local_start 2007-04-01 03:00:00 (Sun)
  63329220000, #    local_end 2007-10-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63329238000, #    utc_start 2007-10-28 07:00:00 (Sun)
  63343152000, #      utc_end 2008-04-06 08:00:00 (Sun)
  63329216400, #  local_start 2007-10-28 01:00:00 (Sun)
  63343130400, #    local_end 2008-04-06 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63343152000, #    utc_start 2008-04-06 08:00:00 (Sun)
  63360687600, #      utc_end 2008-10-26 07:00:00 (Sun)
  63343134000, #  local_start 2008-04-06 03:00:00 (Sun)
  63360669600, #    local_end 2008-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63360687600, #    utc_start 2008-10-26 07:00:00 (Sun)
  63374601600, #      utc_end 2009-04-05 08:00:00 (Sun)
  63360666000, #  local_start 2008-10-26 01:00:00 (Sun)
  63374580000, #    local_end 2009-04-05 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63374601600, #    utc_start 2009-04-05 08:00:00 (Sun)
  63392137200, #      utc_end 2009-10-25 07:00:00 (Sun)
  63374583600, #  local_start 2009-04-05 03:00:00 (Sun)
  63392119200, #    local_end 2009-10-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63392137200, #    utc_start 2009-10-25 07:00:00 (Sun)
  63406051200, #      utc_end 2010-04-04 08:00:00 (Sun)
  63392115600, #  local_start 2009-10-25 01:00:00 (Sun)
  63406029600, #    local_end 2010-04-04 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63406051200, #    utc_start 2010-04-04 08:00:00 (Sun)
  63424191600, #      utc_end 2010-10-31 07:00:00 (Sun)
  63406033200, #  local_start 2010-04-04 03:00:00 (Sun)
  63424173600, #    local_end 2010-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63424191600, #    utc_start 2010-10-31 07:00:00 (Sun)
  63437500800, #      utc_end 2011-04-03 08:00:00 (Sun)
  63424170000, #  local_start 2010-10-31 01:00:00 (Sun)
  63437479200, #    local_end 2011-04-03 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63437500800, #    utc_start 2011-04-03 08:00:00 (Sun)
  63455641200, #      utc_end 2011-10-30 07:00:00 (Sun)
  63437482800, #  local_start 2011-04-03 03:00:00 (Sun)
  63455623200, #    local_end 2011-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63455641200, #    utc_start 2011-10-30 07:00:00 (Sun)
  63468950400, #      utc_end 2012-04-01 08:00:00 (Sun)
  63455619600, #  local_start 2011-10-30 01:00:00 (Sun)
  63468928800, #    local_end 2012-04-01 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63468950400, #    utc_start 2012-04-01 08:00:00 (Sun)
  63487090800, #      utc_end 2012-10-28 07:00:00 (Sun)
  63468932400, #  local_start 2012-04-01 03:00:00 (Sun)
  63487072800, #    local_end 2012-10-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63487090800, #    utc_start 2012-10-28 07:00:00 (Sun)
  63501004800, #      utc_end 2013-04-07 08:00:00 (Sun)
  63487069200, #  local_start 2012-10-28 01:00:00 (Sun)
  63500983200, #    local_end 2013-04-07 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63501004800, #    utc_start 2013-04-07 08:00:00 (Sun)
  63518540400, #      utc_end 2013-10-27 07:00:00 (Sun)
  63500986800, #  local_start 2013-04-07 03:00:00 (Sun)
  63518522400, #    local_end 2013-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63518540400, #    utc_start 2013-10-27 07:00:00 (Sun)
  63532454400, #      utc_end 2014-04-06 08:00:00 (Sun)
  63518518800, #  local_start 2013-10-27 01:00:00 (Sun)
  63532432800, #    local_end 2014-04-06 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63532454400, #    utc_start 2014-04-06 08:00:00 (Sun)
  63549990000, #      utc_end 2014-10-26 07:00:00 (Sun)
  63532436400, #  local_start 2014-04-06 03:00:00 (Sun)
  63549972000, #    local_end 2014-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63549990000, #    utc_start 2014-10-26 07:00:00 (Sun)
  63563904000, #      utc_end 2015-04-05 08:00:00 (Sun)
  63549968400, #  local_start 2014-10-26 01:00:00 (Sun)
  63563882400, #    local_end 2015-04-05 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63563904000, #    utc_start 2015-04-05 08:00:00 (Sun)
  63581439600, #      utc_end 2015-10-25 07:00:00 (Sun)
  63563886000, #  local_start 2015-04-05 03:00:00 (Sun)
  63581421600, #    local_end 2015-10-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63581439600, #    utc_start 2015-10-25 07:00:00 (Sun)
  63595353600, #      utc_end 2016-04-03 08:00:00 (Sun)
  63581418000, #  local_start 2015-10-25 01:00:00 (Sun)
  63595332000, #    local_end 2016-04-03 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63595353600, #    utc_start 2016-04-03 08:00:00 (Sun)
  63613494000, #      utc_end 2016-10-30 07:00:00 (Sun)
  63595335600, #  local_start 2016-04-03 03:00:00 (Sun)
  63613476000, #    local_end 2016-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63613494000, #    utc_start 2016-10-30 07:00:00 (Sun)
  63626803200, #      utc_end 2017-04-02 08:00:00 (Sun)
  63613472400, #  local_start 2016-10-30 01:00:00 (Sun)
  63626781600, #    local_end 2017-04-02 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63626803200, #    utc_start 2017-04-02 08:00:00 (Sun)
  63644943600, #      utc_end 2017-10-29 07:00:00 (Sun)
  63626785200, #  local_start 2017-04-02 03:00:00 (Sun)
  63644925600, #    local_end 2017-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63644943600, #    utc_start 2017-10-29 07:00:00 (Sun)
  63658252800, #      utc_end 2018-04-01 08:00:00 (Sun)
  63644922000, #  local_start 2017-10-29 01:00:00 (Sun)
  63658231200, #    local_end 2018-04-01 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63658252800, #    utc_start 2018-04-01 08:00:00 (Sun)
  63676393200, #      utc_end 2018-10-28 07:00:00 (Sun)
  63658234800, #  local_start 2018-04-01 03:00:00 (Sun)
  63676375200, #    local_end 2018-10-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63676393200, #    utc_start 2018-10-28 07:00:00 (Sun)
  63690307200, #      utc_end 2019-04-07 08:00:00 (Sun)
  63676371600, #  local_start 2018-10-28 01:00:00 (Sun)
  63690285600, #    local_end 2019-04-07 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63690307200, #    utc_start 2019-04-07 08:00:00 (Sun)
  63707842800, #      utc_end 2019-10-27 07:00:00 (Sun)
  63690289200, #  local_start 2019-04-07 03:00:00 (Sun)
  63707824800, #    local_end 2019-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63707842800, #    utc_start 2019-10-27 07:00:00 (Sun)
  63721756800, #      utc_end 2020-04-05 08:00:00 (Sun)
  63707821200, #  local_start 2019-10-27 01:00:00 (Sun)
  63721735200, #    local_end 2020-04-05 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63721756800, #    utc_start 2020-04-05 08:00:00 (Sun)
  63739292400, #      utc_end 2020-10-25 07:00:00 (Sun)
  63721738800, #  local_start 2020-04-05 03:00:00 (Sun)
  63739274400, #    local_end 2020-10-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63739292400, #    utc_start 2020-10-25 07:00:00 (Sun)
  63753206400, #      utc_end 2021-04-04 08:00:00 (Sun)
  63739270800, #  local_start 2020-10-25 01:00:00 (Sun)
  63753184800, #    local_end 2021-04-04 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63753206400, #    utc_start 2021-04-04 08:00:00 (Sun)
  63771346800, #      utc_end 2021-10-31 07:00:00 (Sun)
  63753188400, #  local_start 2021-04-04 03:00:00 (Sun)
  63771328800, #    local_end 2021-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63771346800, #    utc_start 2021-10-31 07:00:00 (Sun)
  63784656000, #      utc_end 2022-04-03 08:00:00 (Sun)
  63771325200, #  local_start 2021-10-31 01:00:00 (Sun)
  63784634400, #    local_end 2022-04-03 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63784656000, #    utc_start 2022-04-03 08:00:00 (Sun)
  63802796400, #      utc_end 2022-10-30 07:00:00 (Sun)
  63784638000, #  local_start 2022-04-03 03:00:00 (Sun)
  63802778400, #    local_end 2022-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63802796400, #    utc_start 2022-10-30 07:00:00 (Sun)
  63816105600, #      utc_end 2023-04-02 08:00:00 (Sun)
  63802774800, #  local_start 2022-10-30 01:00:00 (Sun)
  63816084000, #    local_end 2023-04-02 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63816105600, #    utc_start 2023-04-02 08:00:00 (Sun)
  63834246000, #      utc_end 2023-10-29 07:00:00 (Sun)
  63816087600, #  local_start 2023-04-02 03:00:00 (Sun)
  63834228000, #    local_end 2023-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63834246000, #    utc_start 2023-10-29 07:00:00 (Sun)
  63848160000, #      utc_end 2024-04-07 08:00:00 (Sun)
  63834224400, #  local_start 2023-10-29 01:00:00 (Sun)
  63848138400, #    local_end 2024-04-07 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63848160000, #    utc_start 2024-04-07 08:00:00 (Sun)
  63865695600, #      utc_end 2024-10-27 07:00:00 (Sun)
  63848142000, #  local_start 2024-04-07 03:00:00 (Sun)
  63865677600, #    local_end 2024-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63865695600, #    utc_start 2024-10-27 07:00:00 (Sun)
  63879609600, #      utc_end 2025-04-06 08:00:00 (Sun)
  63865674000, #  local_start 2024-10-27 01:00:00 (Sun)
  63879588000, #    local_end 2025-04-06 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63879609600, #    utc_start 2025-04-06 08:00:00 (Sun)
  63897145200, #      utc_end 2025-10-26 07:00:00 (Sun)
  63879591600, #  local_start 2025-04-06 03:00:00 (Sun)
  63897127200, #    local_end 2025-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63897145200, #    utc_start 2025-10-26 07:00:00 (Sun)
  63911059200, #      utc_end 2026-04-05 08:00:00 (Sun)
  63897123600, #  local_start 2025-10-26 01:00:00 (Sun)
  63911037600, #    local_end 2026-04-05 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63911059200, #    utc_start 2026-04-05 08:00:00 (Sun)
  63928594800, #      utc_end 2026-10-25 07:00:00 (Sun)
  63911041200, #  local_start 2026-04-05 03:00:00 (Sun)
  63928576800, #    local_end 2026-10-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63928594800, #    utc_start 2026-10-25 07:00:00 (Sun)
  63942508800, #      utc_end 2027-04-04 08:00:00 (Sun)
  63928573200, #  local_start 2026-10-25 01:00:00 (Sun)
  63942487200, #    local_end 2027-04-04 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63942508800, #    utc_start 2027-04-04 08:00:00 (Sun)
  63960649200, #      utc_end 2027-10-31 07:00:00 (Sun)
  63942490800, #  local_start 2027-04-04 03:00:00 (Sun)
  63960631200, #    local_end 2027-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63960649200, #    utc_start 2027-10-31 07:00:00 (Sun)
  63973958400, #      utc_end 2028-04-02 08:00:00 (Sun)
  63960627600, #  local_start 2027-10-31 01:00:00 (Sun)
  63973936800, #    local_end 2028-04-02 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63973958400, #    utc_start 2028-04-02 08:00:00 (Sun)
  63992098800, #      utc_end 2028-10-29 07:00:00 (Sun)
  63973940400, #  local_start 2028-04-02 03:00:00 (Sun)
  63992080800, #    local_end 2028-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63992098800, #    utc_start 2028-10-29 07:00:00 (Sun)
  64005408000, #      utc_end 2029-04-01 08:00:00 (Sun)
  63992077200, #  local_start 2028-10-29 01:00:00 (Sun)
  64005386400, #    local_end 2029-04-01 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  64005408000, #    utc_start 2029-04-01 08:00:00 (Sun)
  64023548400, #      utc_end 2029-10-28 07:00:00 (Sun)
  64005390000, #  local_start 2029-04-01 03:00:00 (Sun)
  64023530400, #    local_end 2029-10-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  64023548400, #    utc_start 2029-10-28 07:00:00 (Sun)
  64037462400, #      utc_end 2030-04-07 08:00:00 (Sun)
  64023526800, #  local_start 2029-10-28 01:00:00 (Sun)
  64037440800, #    local_end 2030-04-07 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  64037462400, #    utc_start 2030-04-07 08:00:00 (Sun)
  64054998000, #      utc_end 2030-10-27 07:00:00 (Sun)
  64037444400, #  local_start 2030-04-07 03:00:00 (Sun)
  64054980000, #    local_end 2030-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {35}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -21600 }
  
  my $last_observance = bless( {
    'format' => 'C%sT',
    'gmtoff' => '-6:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 723880,
      'local_rd_secs' => 82800,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 723880,
      'utc_rd_secs' => 82800,
      'utc_year' => 1983
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -21600,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 723881,
      'local_rd_secs' => 18000,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 723881,
      'utc_rd_secs' => 18000,
      'utc_year' => 1983
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2002',
      'in' => 'Apr',
      'letter' => 'D',
      'name' => 'Mexico',
      'offset_from_std' => 3600,
      'on' => 'Sun>=1',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2002',
      'in' => 'Oct',
      'letter' => 'S',
      'name' => 'Mexico',
      'offset_from_std' => 0,
      'on' => 'lastSun',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_MERIDA

    $main::fatpacked{"DateTime/TimeZone/America/Metlakatla.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_METLAKATLA';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Metlakatla;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Metlakatla::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  58910459473, #      utc_end 1867-10-19 00:31:13 (Sat)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  58910514295, #    local_end 1867-10-19 15:44:55 (Sat)
  54822,
  0,
  'LMT',
      ],
      [
  58910459473, #    utc_start 1867-10-19 00:31:13 (Sat)
  59946727578, #      utc_end 1900-08-20 20:46:18 (Mon)
  58910427895, #  local_start 1867-10-18 15:44:55 (Fri)
  59946696000, #    local_end 1900-08-20 12:00:00 (Mon)
  -31578,
  0,
  'LMT',
      ],
      [
  59946727578, #    utc_start 1900-08-20 20:46:18 (Mon)
  61252099200, #      utc_end 1942-01-01 08:00:00 (Thu)
  59946698778, #  local_start 1900-08-20 12:46:18 (Mon)
  61252070400, #    local_end 1942-01-01 00:00:00 (Thu)
  -28800,
  0,
  'PST',
      ],
      [
  61252099200, #    utc_start 1942-01-01 08:00:00 (Thu)
  61255476000, #      utc_end 1942-02-09 10:00:00 (Mon)
  61252070400, #  local_start 1942-01-01 00:00:00 (Thu)
  61255447200, #    local_end 1942-02-09 02:00:00 (Mon)
  -28800,
  0,
  'PST',
      ],
      [
  61255476000, #    utc_start 1942-02-09 10:00:00 (Mon)
  61366287600, #      utc_end 1945-08-14 23:00:00 (Tue)
  61255450800, #  local_start 1942-02-09 03:00:00 (Mon)
  61366262400, #    local_end 1945-08-14 16:00:00 (Tue)
  -25200,
  1,
  'PWT',
      ],
      [
  61366287600, #    utc_start 1945-08-14 23:00:00 (Tue)
  61370298000, #      utc_end 1945-09-30 09:00:00 (Sun)
  61366262400, #  local_start 1945-08-14 16:00:00 (Tue)
  61370272800, #    local_end 1945-09-30 02:00:00 (Sun)
  -25200,
  1,
  'PPT',
      ],
      [
  61370298000, #    utc_start 1945-09-30 09:00:00 (Sun)
  61378329600, #      utc_end 1946-01-01 08:00:00 (Tue)
  61370269200, #  local_start 1945-09-30 01:00:00 (Sun)
  61378300800, #    local_end 1946-01-01 00:00:00 (Tue)
  -28800,
  0,
  'PST',
      ],
      [
  61378329600, #    utc_start 1946-01-01 08:00:00 (Tue)
  62104176000, #      utc_end 1969-01-01 08:00:00 (Wed)
  61378300800, #  local_start 1946-01-01 00:00:00 (Tue)
  62104147200, #    local_end 1969-01-01 00:00:00 (Wed)
  -28800,
  0,
  'PST',
      ],
      [
  62104176000, #    utc_start 1969-01-01 08:00:00 (Wed)
  62114205600, #      utc_end 1969-04-27 10:00:00 (Sun)
  62104147200, #  local_start 1969-01-01 00:00:00 (Wed)
  62114176800, #    local_end 1969-04-27 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62114205600, #    utc_start 1969-04-27 10:00:00 (Sun)
  62129926800, #      utc_end 1969-10-26 09:00:00 (Sun)
  62114180400, #  local_start 1969-04-27 03:00:00 (Sun)
  62129901600, #    local_end 1969-10-26 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62129926800, #    utc_start 1969-10-26 09:00:00 (Sun)
  62145655200, #      utc_end 1970-04-26 10:00:00 (Sun)
  62129898000, #  local_start 1969-10-26 01:00:00 (Sun)
  62145626400, #    local_end 1970-04-26 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62145655200, #    utc_start 1970-04-26 10:00:00 (Sun)
  62161376400, #      utc_end 1970-10-25 09:00:00 (Sun)
  62145630000, #  local_start 1970-04-26 03:00:00 (Sun)
  62161351200, #    local_end 1970-10-25 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62161376400, #    utc_start 1970-10-25 09:00:00 (Sun)
  62177104800, #      utc_end 1971-04-25 10:00:00 (Sun)
  62161347600, #  local_start 1970-10-25 01:00:00 (Sun)
  62177076000, #    local_end 1971-04-25 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62177104800, #    utc_start 1971-04-25 10:00:00 (Sun)
  62193430800, #      utc_end 1971-10-31 09:00:00 (Sun)
  62177079600, #  local_start 1971-04-25 03:00:00 (Sun)
  62193405600, #    local_end 1971-10-31 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62193430800, #    utc_start 1971-10-31 09:00:00 (Sun)
  62209159200, #      utc_end 1972-04-30 10:00:00 (Sun)
  62193402000, #  local_start 1971-10-31 01:00:00 (Sun)
  62209130400, #    local_end 1972-04-30 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62209159200, #    utc_start 1972-04-30 10:00:00 (Sun)
  62224880400, #      utc_end 1972-10-29 09:00:00 (Sun)
  62209134000, #  local_start 1972-04-30 03:00:00 (Sun)
  62224855200, #    local_end 1972-10-29 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62224880400, #    utc_start 1972-10-29 09:00:00 (Sun)
  62240608800, #      utc_end 1973-04-29 10:00:00 (Sun)
  62224851600, #  local_start 1972-10-29 01:00:00 (Sun)
  62240580000, #    local_end 1973-04-29 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62240608800, #    utc_start 1973-04-29 10:00:00 (Sun)
  62256330000, #      utc_end 1973-10-28 09:00:00 (Sun)
  62240583600, #  local_start 1973-04-29 03:00:00 (Sun)
  62256304800, #    local_end 1973-10-28 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62256330000, #    utc_start 1973-10-28 09:00:00 (Sun)
  62262381600, #      utc_end 1974-01-06 10:00:00 (Sun)
  62256301200, #  local_start 1973-10-28 01:00:00 (Sun)
  62262352800, #    local_end 1974-01-06 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62262381600, #    utc_start 1974-01-06 10:00:00 (Sun)
  62287779600, #      utc_end 1974-10-27 09:00:00 (Sun)
  62262356400, #  local_start 1974-01-06 03:00:00 (Sun)
  62287754400, #    local_end 1974-10-27 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62287779600, #    utc_start 1974-10-27 09:00:00 (Sun)
  62298064800, #      utc_end 1975-02-23 10:00:00 (Sun)
  62287750800, #  local_start 1974-10-27 01:00:00 (Sun)
  62298036000, #    local_end 1975-02-23 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62298064800, #    utc_start 1975-02-23 10:00:00 (Sun)
  62319229200, #      utc_end 1975-10-26 09:00:00 (Sun)
  62298039600, #  local_start 1975-02-23 03:00:00 (Sun)
  62319204000, #    local_end 1975-10-26 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62319229200, #    utc_start 1975-10-26 09:00:00 (Sun)
  62334957600, #      utc_end 1976-04-25 10:00:00 (Sun)
  62319200400, #  local_start 1975-10-26 01:00:00 (Sun)
  62334928800, #    local_end 1976-04-25 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62334957600, #    utc_start 1976-04-25 10:00:00 (Sun)
  62351283600, #      utc_end 1976-10-31 09:00:00 (Sun)
  62334932400, #  local_start 1976-04-25 03:00:00 (Sun)
  62351258400, #    local_end 1976-10-31 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62351283600, #    utc_start 1976-10-31 09:00:00 (Sun)
  62366407200, #      utc_end 1977-04-24 10:00:00 (Sun)
  62351254800, #  local_start 1976-10-31 01:00:00 (Sun)
  62366378400, #    local_end 1977-04-24 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62366407200, #    utc_start 1977-04-24 10:00:00 (Sun)
  62382733200, #      utc_end 1977-10-30 09:00:00 (Sun)
  62366382000, #  local_start 1977-04-24 03:00:00 (Sun)
  62382708000, #    local_end 1977-10-30 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62382733200, #    utc_start 1977-10-30 09:00:00 (Sun)
  62398461600, #      utc_end 1978-04-30 10:00:00 (Sun)
  62382704400, #  local_start 1977-10-30 01:00:00 (Sun)
  62398432800, #    local_end 1978-04-30 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62398461600, #    utc_start 1978-04-30 10:00:00 (Sun)
  62414182800, #      utc_end 1978-10-29 09:00:00 (Sun)
  62398436400, #  local_start 1978-04-30 03:00:00 (Sun)
  62414157600, #    local_end 1978-10-29 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62414182800, #    utc_start 1978-10-29 09:00:00 (Sun)
  62429911200, #      utc_end 1979-04-29 10:00:00 (Sun)
  62414154000, #  local_start 1978-10-29 01:00:00 (Sun)
  62429882400, #    local_end 1979-04-29 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62429911200, #    utc_start 1979-04-29 10:00:00 (Sun)
  62445632400, #      utc_end 1979-10-28 09:00:00 (Sun)
  62429886000, #  local_start 1979-04-29 03:00:00 (Sun)
  62445607200, #    local_end 1979-10-28 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62445632400, #    utc_start 1979-10-28 09:00:00 (Sun)
  62461360800, #      utc_end 1980-04-27 10:00:00 (Sun)
  62445603600, #  local_start 1979-10-28 01:00:00 (Sun)
  62461332000, #    local_end 1980-04-27 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62461360800, #    utc_start 1980-04-27 10:00:00 (Sun)
  62477082000, #      utc_end 1980-10-26 09:00:00 (Sun)
  62461335600, #  local_start 1980-04-27 03:00:00 (Sun)
  62477056800, #    local_end 1980-10-26 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62477082000, #    utc_start 1980-10-26 09:00:00 (Sun)
  62492810400, #      utc_end 1981-04-26 10:00:00 (Sun)
  62477053200, #  local_start 1980-10-26 01:00:00 (Sun)
  62492781600, #    local_end 1981-04-26 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62492810400, #    utc_start 1981-04-26 10:00:00 (Sun)
  62508531600, #      utc_end 1981-10-25 09:00:00 (Sun)
  62492785200, #  local_start 1981-04-26 03:00:00 (Sun)
  62508506400, #    local_end 1981-10-25 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62508531600, #    utc_start 1981-10-25 09:00:00 (Sun)
  62524260000, #      utc_end 1982-04-25 10:00:00 (Sun)
  62508502800, #  local_start 1981-10-25 01:00:00 (Sun)
  62524231200, #    local_end 1982-04-25 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62524260000, #    utc_start 1982-04-25 10:00:00 (Sun)
  62540586000, #      utc_end 1982-10-31 09:00:00 (Sun)
  62524234800, #  local_start 1982-04-25 03:00:00 (Sun)
  62540560800, #    local_end 1982-10-31 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62540586000, #    utc_start 1982-10-31 09:00:00 (Sun)
  62555709600, #      utc_end 1983-04-24 10:00:00 (Sun)
  62540557200, #  local_start 1982-10-31 01:00:00 (Sun)
  62555680800, #    local_end 1983-04-24 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62555709600, #    utc_start 1983-04-24 10:00:00 (Sun)
  62572035600, #      utc_end 1983-10-30 09:00:00 (Sun)
  62555684400, #  local_start 1983-04-24 03:00:00 (Sun)
  62572010400, #    local_end 1983-10-30 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62572035600, #    utc_start 1983-10-30 09:00:00 (Sun)
  63582055200, #      utc_end 2015-11-01 10:00:00 (Sun)
  62572006800, #  local_start 1983-10-30 01:00:00 (Sun)
  63582026400, #    local_end 2015-11-01 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63582055200, #    utc_start 2015-11-01 10:00:00 (Sun)
  63593550000, #      utc_end 2016-03-13 11:00:00 (Sun)
  63582022800, #  local_start 2015-11-01 01:00:00 (Sun)
  63593517600, #    local_end 2016-03-13 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63593550000, #    utc_start 2016-03-13 11:00:00 (Sun)
  63614109600, #      utc_end 2016-11-06 10:00:00 (Sun)
  63593521200, #  local_start 2016-03-13 03:00:00 (Sun)
  63614080800, #    local_end 2016-11-06 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63614109600, #    utc_start 2016-11-06 10:00:00 (Sun)
  63624999600, #      utc_end 2017-03-12 11:00:00 (Sun)
  63614077200, #  local_start 2016-11-06 01:00:00 (Sun)
  63624967200, #    local_end 2017-03-12 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63624999600, #    utc_start 2017-03-12 11:00:00 (Sun)
  63645559200, #      utc_end 2017-11-05 10:00:00 (Sun)
  63624970800, #  local_start 2017-03-12 03:00:00 (Sun)
  63645530400, #    local_end 2017-11-05 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63645559200, #    utc_start 2017-11-05 10:00:00 (Sun)
  63656449200, #      utc_end 2018-03-11 11:00:00 (Sun)
  63645526800, #  local_start 2017-11-05 01:00:00 (Sun)
  63656416800, #    local_end 2018-03-11 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63656449200, #    utc_start 2018-03-11 11:00:00 (Sun)
  63677008800, #      utc_end 2018-11-04 10:00:00 (Sun)
  63656420400, #  local_start 2018-03-11 03:00:00 (Sun)
  63676980000, #    local_end 2018-11-04 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63677008800, #    utc_start 2018-11-04 10:00:00 (Sun)
  63683661600, #      utc_end 2019-01-20 10:00:00 (Sun)
  63676980000, #  local_start 2018-11-04 02:00:00 (Sun)
  63683632800, #    local_end 2019-01-20 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63683661600, #    utc_start 2019-01-20 10:00:00 (Sun)
  63687898800, #      utc_end 2019-03-10 11:00:00 (Sun)
  63683629200, #  local_start 2019-01-20 01:00:00 (Sun)
  63687866400, #    local_end 2019-03-10 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63687898800, #    utc_start 2019-03-10 11:00:00 (Sun)
  63708458400, #      utc_end 2019-11-03 10:00:00 (Sun)
  63687870000, #  local_start 2019-03-10 03:00:00 (Sun)
  63708429600, #    local_end 2019-11-03 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63708458400, #    utc_start 2019-11-03 10:00:00 (Sun)
  63719348400, #      utc_end 2020-03-08 11:00:00 (Sun)
  63708426000, #  local_start 2019-11-03 01:00:00 (Sun)
  63719316000, #    local_end 2020-03-08 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63719348400, #    utc_start 2020-03-08 11:00:00 (Sun)
  63739908000, #      utc_end 2020-11-01 10:00:00 (Sun)
  63719319600, #  local_start 2020-03-08 03:00:00 (Sun)
  63739879200, #    local_end 2020-11-01 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63739908000, #    utc_start 2020-11-01 10:00:00 (Sun)
  63751402800, #      utc_end 2021-03-14 11:00:00 (Sun)
  63739875600, #  local_start 2020-11-01 01:00:00 (Sun)
  63751370400, #    local_end 2021-03-14 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63751402800, #    utc_start 2021-03-14 11:00:00 (Sun)
  63771962400, #      utc_end 2021-11-07 10:00:00 (Sun)
  63751374000, #  local_start 2021-03-14 03:00:00 (Sun)
  63771933600, #    local_end 2021-11-07 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63771962400, #    utc_start 2021-11-07 10:00:00 (Sun)
  63782852400, #      utc_end 2022-03-13 11:00:00 (Sun)
  63771930000, #  local_start 2021-11-07 01:00:00 (Sun)
  63782820000, #    local_end 2022-03-13 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63782852400, #    utc_start 2022-03-13 11:00:00 (Sun)
  63803412000, #      utc_end 2022-11-06 10:00:00 (Sun)
  63782823600, #  local_start 2022-03-13 03:00:00 (Sun)
  63803383200, #    local_end 2022-11-06 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63803412000, #    utc_start 2022-11-06 10:00:00 (Sun)
  63814302000, #      utc_end 2023-03-12 11:00:00 (Sun)
  63803379600, #  local_start 2022-11-06 01:00:00 (Sun)
  63814269600, #    local_end 2023-03-12 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63814302000, #    utc_start 2023-03-12 11:00:00 (Sun)
  63834861600, #      utc_end 2023-11-05 10:00:00 (Sun)
  63814273200, #  local_start 2023-03-12 03:00:00 (Sun)
  63834832800, #    local_end 2023-11-05 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63834861600, #    utc_start 2023-11-05 10:00:00 (Sun)
  63845751600, #      utc_end 2024-03-10 11:00:00 (Sun)
  63834829200, #  local_start 2023-11-05 01:00:00 (Sun)
  63845719200, #    local_end 2024-03-10 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63845751600, #    utc_start 2024-03-10 11:00:00 (Sun)
  63866311200, #      utc_end 2024-11-03 10:00:00 (Sun)
  63845722800, #  local_start 2024-03-10 03:00:00 (Sun)
  63866282400, #    local_end 2024-11-03 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63866311200, #    utc_start 2024-11-03 10:00:00 (Sun)
  63877201200, #      utc_end 2025-03-09 11:00:00 (Sun)
  63866278800, #  local_start 2024-11-03 01:00:00 (Sun)
  63877168800, #    local_end 2025-03-09 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63877201200, #    utc_start 2025-03-09 11:00:00 (Sun)
  63897760800, #      utc_end 2025-11-02 10:00:00 (Sun)
  63877172400, #  local_start 2025-03-09 03:00:00 (Sun)
  63897732000, #    local_end 2025-11-02 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63897760800, #    utc_start 2025-11-02 10:00:00 (Sun)
  63908650800, #      utc_end 2026-03-08 11:00:00 (Sun)
  63897728400, #  local_start 2025-11-02 01:00:00 (Sun)
  63908618400, #    local_end 2026-03-08 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63908650800, #    utc_start 2026-03-08 11:00:00 (Sun)
  63929210400, #      utc_end 2026-11-01 10:00:00 (Sun)
  63908622000, #  local_start 2026-03-08 03:00:00 (Sun)
  63929181600, #    local_end 2026-11-01 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63929210400, #    utc_start 2026-11-01 10:00:00 (Sun)
  63940705200, #      utc_end 2027-03-14 11:00:00 (Sun)
  63929178000, #  local_start 2026-11-01 01:00:00 (Sun)
  63940672800, #    local_end 2027-03-14 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63940705200, #    utc_start 2027-03-14 11:00:00 (Sun)
  63961264800, #      utc_end 2027-11-07 10:00:00 (Sun)
  63940676400, #  local_start 2027-03-14 03:00:00 (Sun)
  63961236000, #    local_end 2027-11-07 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63961264800, #    utc_start 2027-11-07 10:00:00 (Sun)
  63972154800, #      utc_end 2028-03-12 11:00:00 (Sun)
  63961232400, #  local_start 2027-11-07 01:00:00 (Sun)
  63972122400, #    local_end 2028-03-12 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63972154800, #    utc_start 2028-03-12 11:00:00 (Sun)
  63992714400, #      utc_end 2028-11-05 10:00:00 (Sun)
  63972126000, #  local_start 2028-03-12 03:00:00 (Sun)
  63992685600, #    local_end 2028-11-05 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63992714400, #    utc_start 2028-11-05 10:00:00 (Sun)
  64003604400, #      utc_end 2029-03-11 11:00:00 (Sun)
  63992682000, #  local_start 2028-11-05 01:00:00 (Sun)
  64003572000, #    local_end 2029-03-11 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  64003604400, #    utc_start 2029-03-11 11:00:00 (Sun)
  64024164000, #      utc_end 2029-11-04 10:00:00 (Sun)
  64003575600, #  local_start 2029-03-11 03:00:00 (Sun)
  64024135200, #    local_end 2029-11-04 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  64024164000, #    utc_start 2029-11-04 10:00:00 (Sun)
  64035054000, #      utc_end 2030-03-10 11:00:00 (Sun)
  64024131600, #  local_start 2029-11-04 01:00:00 (Sun)
  64035021600, #    local_end 2030-03-10 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  64035054000, #    utc_start 2030-03-10 11:00:00 (Sun)
  64055613600, #      utc_end 2030-11-03 10:00:00 (Sun)
  64035025200, #  local_start 2030-03-10 03:00:00 (Sun)
  64055584800, #    local_end 2030-11-03 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {32}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -32400 }
  
  my $last_observance = bless( {
    'format' => 'AK%sT',
    'gmtoff' => '-9:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 737079,
      'local_rd_secs' => 3600,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 737079,
      'utc_rd_secs' => 3600,
      'utc_year' => 2020
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -32400,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 737079,
      'local_rd_secs' => 36000,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 737079,
      'utc_rd_secs' => 36000,
      'utc_year' => 2020
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Mar',
      'letter' => 'D',
      'name' => 'US',
      'offset_from_std' => 3600,
      'on' => 'Sun>=8',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Nov',
      'letter' => 'S',
      'name' => 'US',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_METLAKATLA

    $main::fatpacked{"DateTime/TimeZone/America/Mexico_City.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_MEXICO_CITY';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Mexico_City;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Mexico_City::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60620943600, #      utc_end 1922-01-01 07:00:00 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60620919804, #    local_end 1922-01-01 00:23:24 (Sun)
  -23796,
  0,
  'LMT',
      ],
      [
  60620943600, #    utc_start 1922-01-01 07:00:00 (Sun)
  60792616800, #      utc_end 1927-06-11 06:00:00 (Sat)
  60620918400, #  local_start 1922-01-01 00:00:00 (Sun)
  60792591600, #    local_end 1927-06-10 23:00:00 (Fri)
  -25200,
  0,
  'MST',
      ],
      [
  60792616800, #    utc_start 1927-06-11 06:00:00 (Sat)
  60900876000, #      utc_end 1930-11-15 06:00:00 (Sat)
  60792595200, #  local_start 1927-06-11 00:00:00 (Sat)
  60900854400, #    local_end 1930-11-15 00:00:00 (Sat)
  -21600,
  0,
  'CST',
      ],
      [
  60900876000, #    utc_start 1930-11-15 06:00:00 (Sat)
  60915391200, #      utc_end 1931-05-02 06:00:00 (Sat)
  60900850800, #  local_start 1930-11-14 23:00:00 (Fri)
  60915366000, #    local_end 1931-05-01 23:00:00 (Fri)
  -25200,
  0,
  'MST',
      ],
      [
  60915391200, #    utc_start 1931-05-02 06:00:00 (Sat)
  60928524000, #      utc_end 1931-10-01 06:00:00 (Thu)
  60915369600, #  local_start 1931-05-02 00:00:00 (Sat)
  60928502400, #    local_end 1931-10-01 00:00:00 (Thu)
  -21600,
  0,
  'CST',
      ],
      [
  60928524000, #    utc_start 1931-10-01 06:00:00 (Thu)
  60944338800, #      utc_end 1932-04-01 07:00:00 (Fri)
  60928498800, #  local_start 1931-09-30 23:00:00 (Wed)
  60944313600, #    local_end 1932-04-01 00:00:00 (Fri)
  -25200,
  0,
  'MST',
      ],
      [
  60944338800, #    utc_start 1932-04-01 07:00:00 (Fri)
  61160421600, #      utc_end 1939-02-05 06:00:00 (Sun)
  60944317200, #  local_start 1932-04-01 01:00:00 (Fri)
  61160400000, #    local_end 1939-02-05 00:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61160421600, #    utc_start 1939-02-05 06:00:00 (Sun)
  61172514000, #      utc_end 1939-06-25 05:00:00 (Sun)
  61160403600, #  local_start 1939-02-05 01:00:00 (Sun)
  61172496000, #    local_end 1939-06-25 00:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61172514000, #    utc_start 1939-06-25 05:00:00 (Sun)
  61218568800, #      utc_end 1940-12-09 06:00:00 (Mon)
  61172492400, #  local_start 1939-06-24 23:00:00 (Sat)
  61218547200, #    local_end 1940-12-09 00:00:00 (Mon)
  -21600,
  0,
  'CST',
      ],
      [
  61218568800, #    utc_start 1940-12-09 06:00:00 (Mon)
  61228328400, #      utc_end 1941-04-01 05:00:00 (Tue)
  61218550800, #  local_start 1940-12-09 01:00:00 (Mon)
  61228310400, #    local_end 1941-04-01 00:00:00 (Tue)
  -18000,
  1,
  'CDT',
      ],
      [
  61228328400, #    utc_start 1941-04-01 05:00:00 (Tue)
  61313781600, #      utc_end 1943-12-16 06:00:00 (Thu)
  61228306800, #  local_start 1941-03-31 23:00:00 (Mon)
  61313760000, #    local_end 1943-12-16 00:00:00 (Thu)
  -21600,
  0,
  'CST',
      ],
      [
  61313781600, #    utc_start 1943-12-16 06:00:00 (Thu)
  61325614800, #      utc_end 1944-05-01 05:00:00 (Mon)
  61313763600, #  local_start 1943-12-16 01:00:00 (Thu)
  61325596800, #    local_end 1944-05-01 00:00:00 (Mon)
  -18000,
  1,
  'CWT',
      ],
      [
  61325614800, #    utc_start 1944-05-01 05:00:00 (Mon)
  61508181600, #      utc_end 1950-02-12 06:00:00 (Sun)
  61325593200, #  local_start 1944-04-30 23:00:00 (Sun)
  61508160000, #    local_end 1950-02-12 00:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61508181600, #    utc_start 1950-02-12 06:00:00 (Sun)
  61522693200, #      utc_end 1950-07-30 05:00:00 (Sun)
  61508163600, #  local_start 1950-02-12 01:00:00 (Sun)
  61522675200, #    local_end 1950-07-30 00:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61522693200, #    utc_start 1950-07-30 05:00:00 (Sun)
  62964547200, #      utc_end 1996-04-07 08:00:00 (Sun)
  61522671600, #  local_start 1950-07-29 23:00:00 (Sat)
  62964525600, #    local_end 1996-04-07 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62964547200, #    utc_start 1996-04-07 08:00:00 (Sun)
  62982082800, #      utc_end 1996-10-27 07:00:00 (Sun)
  62964529200, #  local_start 1996-04-07 03:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62982082800, #    utc_start 1996-10-27 07:00:00 (Sun)
  62995996800, #      utc_end 1997-04-06 08:00:00 (Sun)
  62982061200, #  local_start 1996-10-27 01:00:00 (Sun)
  62995975200, #    local_end 1997-04-06 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62995996800, #    utc_start 1997-04-06 08:00:00 (Sun)
  63013532400, #      utc_end 1997-10-26 07:00:00 (Sun)
  62995978800, #  local_start 1997-04-06 03:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63013532400, #    utc_start 1997-10-26 07:00:00 (Sun)
  63027446400, #      utc_end 1998-04-05 08:00:00 (Sun)
  63013510800, #  local_start 1997-10-26 01:00:00 (Sun)
  63027424800, #    local_end 1998-04-05 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63027446400, #    utc_start 1998-04-05 08:00:00 (Sun)
  63044982000, #      utc_end 1998-10-25 07:00:00 (Sun)
  63027428400, #  local_start 1998-04-05 03:00:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63044982000, #    utc_start 1998-10-25 07:00:00 (Sun)
  63058896000, #      utc_end 1999-04-04 08:00:00 (Sun)
  63044960400, #  local_start 1998-10-25 01:00:00 (Sun)
  63058874400, #    local_end 1999-04-04 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63058896000, #    utc_start 1999-04-04 08:00:00 (Sun)
  63077036400, #      utc_end 1999-10-31 07:00:00 (Sun)
  63058878000, #  local_start 1999-04-04 03:00:00 (Sun)
  63077018400, #    local_end 1999-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63077036400, #    utc_start 1999-10-31 07:00:00 (Sun)
  63090345600, #      utc_end 2000-04-02 08:00:00 (Sun)
  63077014800, #  local_start 1999-10-31 01:00:00 (Sun)
  63090324000, #    local_end 2000-04-02 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63090345600, #    utc_start 2000-04-02 08:00:00 (Sun)
  63108486000, #      utc_end 2000-10-29 07:00:00 (Sun)
  63090327600, #  local_start 2000-04-02 03:00:00 (Sun)
  63108468000, #    local_end 2000-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63108486000, #    utc_start 2000-10-29 07:00:00 (Sun)
  63124819200, #      utc_end 2001-05-06 08:00:00 (Sun)
  63108464400, #  local_start 2000-10-29 01:00:00 (Sun)
  63124797600, #    local_end 2001-05-06 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63124819200, #    utc_start 2001-05-06 08:00:00 (Sun)
  63137516400, #      utc_end 2001-09-30 07:00:00 (Sun)
  63124801200, #  local_start 2001-05-06 03:00:00 (Sun)
  63137498400, #    local_end 2001-09-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63137516400, #    utc_start 2001-09-30 07:00:00 (Sun)
  63149868000, #      utc_end 2002-02-20 06:00:00 (Wed)
  63137494800, #  local_start 2001-09-30 01:00:00 (Sun)
  63149846400, #    local_end 2002-02-20 00:00:00 (Wed)
  -21600,
  0,
  'CST',
      ],
      [
  63149868000, #    utc_start 2002-02-20 06:00:00 (Wed)
  63153849600, #      utc_end 2002-04-07 08:00:00 (Sun)
  63149846400, #  local_start 2002-02-20 00:00:00 (Wed)
  63153828000, #    local_end 2002-04-07 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63153849600, #    utc_start 2002-04-07 08:00:00 (Sun)
  63171385200, #      utc_end 2002-10-27 07:00:00 (Sun)
  63153831600, #  local_start 2002-04-07 03:00:00 (Sun)
  63171367200, #    local_end 2002-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63171385200, #    utc_start 2002-10-27 07:00:00 (Sun)
  63185299200, #      utc_end 2003-04-06 08:00:00 (Sun)
  63171363600, #  local_start 2002-10-27 01:00:00 (Sun)
  63185277600, #    local_end 2003-04-06 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63185299200, #    utc_start 2003-04-06 08:00:00 (Sun)
  63202834800, #      utc_end 2003-10-26 07:00:00 (Sun)
  63185281200, #  local_start 2003-04-06 03:00:00 (Sun)
  63202816800, #    local_end 2003-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63202834800, #    utc_start 2003-10-26 07:00:00 (Sun)
  63216748800, #      utc_end 2004-04-04 08:00:00 (Sun)
  63202813200, #  local_start 2003-10-26 01:00:00 (Sun)
  63216727200, #    local_end 2004-04-04 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63216748800, #    utc_start 2004-04-04 08:00:00 (Sun)
  63234889200, #      utc_end 2004-10-31 07:00:00 (Sun)
  63216730800, #  local_start 2004-04-04 03:00:00 (Sun)
  63234871200, #    local_end 2004-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63234889200, #    utc_start 2004-10-31 07:00:00 (Sun)
  63248198400, #      utc_end 2005-04-03 08:00:00 (Sun)
  63234867600, #  local_start 2004-10-31 01:00:00 (Sun)
  63248176800, #    local_end 2005-04-03 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63248198400, #    utc_start 2005-04-03 08:00:00 (Sun)
  63266338800, #      utc_end 2005-10-30 07:00:00 (Sun)
  63248180400, #  local_start 2005-04-03 03:00:00 (Sun)
  63266320800, #    local_end 2005-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63266338800, #    utc_start 2005-10-30 07:00:00 (Sun)
  63279648000, #      utc_end 2006-04-02 08:00:00 (Sun)
  63266317200, #  local_start 2005-10-30 01:00:00 (Sun)
  63279626400, #    local_end 2006-04-02 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63279648000, #    utc_start 2006-04-02 08:00:00 (Sun)
  63297788400, #      utc_end 2006-10-29 07:00:00 (Sun)
  63279630000, #  local_start 2006-04-02 03:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63297788400, #    utc_start 2006-10-29 07:00:00 (Sun)
  63311097600, #      utc_end 2007-04-01 08:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63311076000, #    local_end 2007-04-01 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63311097600, #    utc_start 2007-04-01 08:00:00 (Sun)
  63329238000, #      utc_end 2007-10-28 07:00:00 (Sun)
  63311079600, #  local_start 2007-04-01 03:00:00 (Sun)
  63329220000, #    local_end 2007-10-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63329238000, #    utc_start 2007-10-28 07:00:00 (Sun)
  63343152000, #      utc_end 2008-04-06 08:00:00 (Sun)
  63329216400, #  local_start 2007-10-28 01:00:00 (Sun)
  63343130400, #    local_end 2008-04-06 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63343152000, #    utc_start 2008-04-06 08:00:00 (Sun)
  63360687600, #      utc_end 2008-10-26 07:00:00 (Sun)
  63343134000, #  local_start 2008-04-06 03:00:00 (Sun)
  63360669600, #    local_end 2008-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63360687600, #    utc_start 2008-10-26 07:00:00 (Sun)
  63374601600, #      utc_end 2009-04-05 08:00:00 (Sun)
  63360666000, #  local_start 2008-10-26 01:00:00 (Sun)
  63374580000, #    local_end 2009-04-05 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63374601600, #    utc_start 2009-04-05 08:00:00 (Sun)
  63392137200, #      utc_end 2009-10-25 07:00:00 (Sun)
  63374583600, #  local_start 2009-04-05 03:00:00 (Sun)
  63392119200, #    local_end 2009-10-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63392137200, #    utc_start 2009-10-25 07:00:00 (Sun)
  63406051200, #      utc_end 2010-04-04 08:00:00 (Sun)
  63392115600, #  local_start 2009-10-25 01:00:00 (Sun)
  63406029600, #    local_end 2010-04-04 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63406051200, #    utc_start 2010-04-04 08:00:00 (Sun)
  63424191600, #      utc_end 2010-10-31 07:00:00 (Sun)
  63406033200, #  local_start 2010-04-04 03:00:00 (Sun)
  63424173600, #    local_end 2010-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63424191600, #    utc_start 2010-10-31 07:00:00 (Sun)
  63437500800, #      utc_end 2011-04-03 08:00:00 (Sun)
  63424170000, #  local_start 2010-10-31 01:00:00 (Sun)
  63437479200, #    local_end 2011-04-03 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63437500800, #    utc_start 2011-04-03 08:00:00 (Sun)
  63455641200, #      utc_end 2011-10-30 07:00:00 (Sun)
  63437482800, #  local_start 2011-04-03 03:00:00 (Sun)
  63455623200, #    local_end 2011-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63455641200, #    utc_start 2011-10-30 07:00:00 (Sun)
  63468950400, #      utc_end 2012-04-01 08:00:00 (Sun)
  63455619600, #  local_start 2011-10-30 01:00:00 (Sun)
  63468928800, #    local_end 2012-04-01 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63468950400, #    utc_start 2012-04-01 08:00:00 (Sun)
  63487090800, #      utc_end 2012-10-28 07:00:00 (Sun)
  63468932400, #  local_start 2012-04-01 03:00:00 (Sun)
  63487072800, #    local_end 2012-10-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63487090800, #    utc_start 2012-10-28 07:00:00 (Sun)
  63501004800, #      utc_end 2013-04-07 08:00:00 (Sun)
  63487069200, #  local_start 2012-10-28 01:00:00 (Sun)
  63500983200, #    local_end 2013-04-07 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63501004800, #    utc_start 2013-04-07 08:00:00 (Sun)
  63518540400, #      utc_end 2013-10-27 07:00:00 (Sun)
  63500986800, #  local_start 2013-04-07 03:00:00 (Sun)
  63518522400, #    local_end 2013-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63518540400, #    utc_start 2013-10-27 07:00:00 (Sun)
  63532454400, #      utc_end 2014-04-06 08:00:00 (Sun)
  63518518800, #  local_start 2013-10-27 01:00:00 (Sun)
  63532432800, #    local_end 2014-04-06 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63532454400, #    utc_start 2014-04-06 08:00:00 (Sun)
  63549990000, #      utc_end 2014-10-26 07:00:00 (Sun)
  63532436400, #  local_start 2014-04-06 03:00:00 (Sun)
  63549972000, #    local_end 2014-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63549990000, #    utc_start 2014-10-26 07:00:00 (Sun)
  63563904000, #      utc_end 2015-04-05 08:00:00 (Sun)
  63549968400, #  local_start 2014-10-26 01:00:00 (Sun)
  63563882400, #    local_end 2015-04-05 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63563904000, #    utc_start 2015-04-05 08:00:00 (Sun)
  63581439600, #      utc_end 2015-10-25 07:00:00 (Sun)
  63563886000, #  local_start 2015-04-05 03:00:00 (Sun)
  63581421600, #    local_end 2015-10-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63581439600, #    utc_start 2015-10-25 07:00:00 (Sun)
  63595353600, #      utc_end 2016-04-03 08:00:00 (Sun)
  63581418000, #  local_start 2015-10-25 01:00:00 (Sun)
  63595332000, #    local_end 2016-04-03 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63595353600, #    utc_start 2016-04-03 08:00:00 (Sun)
  63613494000, #      utc_end 2016-10-30 07:00:00 (Sun)
  63595335600, #  local_start 2016-04-03 03:00:00 (Sun)
  63613476000, #    local_end 2016-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63613494000, #    utc_start 2016-10-30 07:00:00 (Sun)
  63626803200, #      utc_end 2017-04-02 08:00:00 (Sun)
  63613472400, #  local_start 2016-10-30 01:00:00 (Sun)
  63626781600, #    local_end 2017-04-02 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63626803200, #    utc_start 2017-04-02 08:00:00 (Sun)
  63644943600, #      utc_end 2017-10-29 07:00:00 (Sun)
  63626785200, #  local_start 2017-04-02 03:00:00 (Sun)
  63644925600, #    local_end 2017-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63644943600, #    utc_start 2017-10-29 07:00:00 (Sun)
  63658252800, #      utc_end 2018-04-01 08:00:00 (Sun)
  63644922000, #  local_start 2017-10-29 01:00:00 (Sun)
  63658231200, #    local_end 2018-04-01 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63658252800, #    utc_start 2018-04-01 08:00:00 (Sun)
  63676393200, #      utc_end 2018-10-28 07:00:00 (Sun)
  63658234800, #  local_start 2018-04-01 03:00:00 (Sun)
  63676375200, #    local_end 2018-10-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63676393200, #    utc_start 2018-10-28 07:00:00 (Sun)
  63690307200, #      utc_end 2019-04-07 08:00:00 (Sun)
  63676371600, #  local_start 2018-10-28 01:00:00 (Sun)
  63690285600, #    local_end 2019-04-07 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63690307200, #    utc_start 2019-04-07 08:00:00 (Sun)
  63707842800, #      utc_end 2019-10-27 07:00:00 (Sun)
  63690289200, #  local_start 2019-04-07 03:00:00 (Sun)
  63707824800, #    local_end 2019-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63707842800, #    utc_start 2019-10-27 07:00:00 (Sun)
  63721756800, #      utc_end 2020-04-05 08:00:00 (Sun)
  63707821200, #  local_start 2019-10-27 01:00:00 (Sun)
  63721735200, #    local_end 2020-04-05 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63721756800, #    utc_start 2020-04-05 08:00:00 (Sun)
  63739292400, #      utc_end 2020-10-25 07:00:00 (Sun)
  63721738800, #  local_start 2020-04-05 03:00:00 (Sun)
  63739274400, #    local_end 2020-10-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63739292400, #    utc_start 2020-10-25 07:00:00 (Sun)
  63753206400, #      utc_end 2021-04-04 08:00:00 (Sun)
  63739270800, #  local_start 2020-10-25 01:00:00 (Sun)
  63753184800, #    local_end 2021-04-04 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63753206400, #    utc_start 2021-04-04 08:00:00 (Sun)
  63771346800, #      utc_end 2021-10-31 07:00:00 (Sun)
  63753188400, #  local_start 2021-04-04 03:00:00 (Sun)
  63771328800, #    local_end 2021-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63771346800, #    utc_start 2021-10-31 07:00:00 (Sun)
  63784656000, #      utc_end 2022-04-03 08:00:00 (Sun)
  63771325200, #  local_start 2021-10-31 01:00:00 (Sun)
  63784634400, #    local_end 2022-04-03 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63784656000, #    utc_start 2022-04-03 08:00:00 (Sun)
  63802796400, #      utc_end 2022-10-30 07:00:00 (Sun)
  63784638000, #  local_start 2022-04-03 03:00:00 (Sun)
  63802778400, #    local_end 2022-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63802796400, #    utc_start 2022-10-30 07:00:00 (Sun)
  63816105600, #      utc_end 2023-04-02 08:00:00 (Sun)
  63802774800, #  local_start 2022-10-30 01:00:00 (Sun)
  63816084000, #    local_end 2023-04-02 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63816105600, #    utc_start 2023-04-02 08:00:00 (Sun)
  63834246000, #      utc_end 2023-10-29 07:00:00 (Sun)
  63816087600, #  local_start 2023-04-02 03:00:00 (Sun)
  63834228000, #    local_end 2023-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63834246000, #    utc_start 2023-10-29 07:00:00 (Sun)
  63848160000, #      utc_end 2024-04-07 08:00:00 (Sun)
  63834224400, #  local_start 2023-10-29 01:00:00 (Sun)
  63848138400, #    local_end 2024-04-07 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63848160000, #    utc_start 2024-04-07 08:00:00 (Sun)
  63865695600, #      utc_end 2024-10-27 07:00:00 (Sun)
  63848142000, #  local_start 2024-04-07 03:00:00 (Sun)
  63865677600, #    local_end 2024-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63865695600, #    utc_start 2024-10-27 07:00:00 (Sun)
  63879609600, #      utc_end 2025-04-06 08:00:00 (Sun)
  63865674000, #  local_start 2024-10-27 01:00:00 (Sun)
  63879588000, #    local_end 2025-04-06 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63879609600, #    utc_start 2025-04-06 08:00:00 (Sun)
  63897145200, #      utc_end 2025-10-26 07:00:00 (Sun)
  63879591600, #  local_start 2025-04-06 03:00:00 (Sun)
  63897127200, #    local_end 2025-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63897145200, #    utc_start 2025-10-26 07:00:00 (Sun)
  63911059200, #      utc_end 2026-04-05 08:00:00 (Sun)
  63897123600, #  local_start 2025-10-26 01:00:00 (Sun)
  63911037600, #    local_end 2026-04-05 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63911059200, #    utc_start 2026-04-05 08:00:00 (Sun)
  63928594800, #      utc_end 2026-10-25 07:00:00 (Sun)
  63911041200, #  local_start 2026-04-05 03:00:00 (Sun)
  63928576800, #    local_end 2026-10-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63928594800, #    utc_start 2026-10-25 07:00:00 (Sun)
  63942508800, #      utc_end 2027-04-04 08:00:00 (Sun)
  63928573200, #  local_start 2026-10-25 01:00:00 (Sun)
  63942487200, #    local_end 2027-04-04 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63942508800, #    utc_start 2027-04-04 08:00:00 (Sun)
  63960649200, #      utc_end 2027-10-31 07:00:00 (Sun)
  63942490800, #  local_start 2027-04-04 03:00:00 (Sun)
  63960631200, #    local_end 2027-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63960649200, #    utc_start 2027-10-31 07:00:00 (Sun)
  63973958400, #      utc_end 2028-04-02 08:00:00 (Sun)
  63960627600, #  local_start 2027-10-31 01:00:00 (Sun)
  63973936800, #    local_end 2028-04-02 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63973958400, #    utc_start 2028-04-02 08:00:00 (Sun)
  63992098800, #      utc_end 2028-10-29 07:00:00 (Sun)
  63973940400, #  local_start 2028-04-02 03:00:00 (Sun)
  63992080800, #    local_end 2028-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63992098800, #    utc_start 2028-10-29 07:00:00 (Sun)
  64005408000, #      utc_end 2029-04-01 08:00:00 (Sun)
  63992077200, #  local_start 2028-10-29 01:00:00 (Sun)
  64005386400, #    local_end 2029-04-01 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  64005408000, #    utc_start 2029-04-01 08:00:00 (Sun)
  64023548400, #      utc_end 2029-10-28 07:00:00 (Sun)
  64005390000, #  local_start 2029-04-01 03:00:00 (Sun)
  64023530400, #    local_end 2029-10-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  64023548400, #    utc_start 2029-10-28 07:00:00 (Sun)
  64037462400, #      utc_end 2030-04-07 08:00:00 (Sun)
  64023526800, #  local_start 2029-10-28 01:00:00 (Sun)
  64037440800, #    local_end 2030-04-07 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  64037462400, #    utc_start 2030-04-07 08:00:00 (Sun)
  64054998000, #      utc_end 2030-10-27 07:00:00 (Sun)
  64037444400, #  local_start 2030-04-07 03:00:00 (Sun)
  64054980000, #    local_end 2030-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {39}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -21600 }
  
  my $last_observance = bless( {
    'format' => 'C%sT',
    'gmtoff' => '-6:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 730901,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 730901,
      'utc_rd_secs' => 0,
      'utc_year' => 2003
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -21600,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 730901,
      'local_rd_secs' => 21600,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 730901,
      'utc_rd_secs' => 21600,
      'utc_year' => 2003
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2002',
      'in' => 'Oct',
      'letter' => 'S',
      'name' => 'Mexico',
      'offset_from_std' => 0,
      'on' => 'lastSun',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2002',
      'in' => 'Apr',
      'letter' => 'D',
      'name' => 'Mexico',
      'offset_from_std' => 3600,
      'on' => 'Sun>=1',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_MEXICO_CITY

    $main::fatpacked{"DateTime/TimeZone/America/Miquelon.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_MIQUELON';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Miquelon;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Miquelon::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60285354280, #      utc_end 1911-05-15 03:44:40 (Mon)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60285340800, #    local_end 1911-05-15 00:00:00 (Mon)
  -13480,
  0,
  'LMT',
      ],
      [
  60285354280, #    utc_start 1911-05-15 03:44:40 (Mon)
  62461684800, #      utc_end 1980-05-01 04:00:00 (Thu)
  60285339880, #  local_start 1911-05-14 23:44:40 (Sun)
  62461670400, #    local_end 1980-05-01 00:00:00 (Thu)
  -14400,
  0,
  'AST',
      ],
      [
  62461684800, #    utc_start 1980-05-01 04:00:00 (Thu)
  62672151600, #      utc_end 1987-01-01 03:00:00 (Thu)
  62461674000, #  local_start 1980-05-01 01:00:00 (Thu)
  62672140800, #    local_end 1987-01-01 00:00:00 (Thu)
  -10800,
  0,
  '-03',
      ],
      [
  62672151600, #    utc_start 1987-01-01 03:00:00 (Thu)
  62680280400, #      utc_end 1987-04-05 05:00:00 (Sun)
  62672140800, #  local_start 1987-01-01 00:00:00 (Thu)
  62680269600, #    local_end 1987-04-05 02:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62680280400, #    utc_start 1987-04-05 05:00:00 (Sun)
  62697816000, #      utc_end 1987-10-25 04:00:00 (Sun)
  62680273200, #  local_start 1987-04-05 03:00:00 (Sun)
  62697808800, #    local_end 1987-10-25 02:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62697816000, #    utc_start 1987-10-25 04:00:00 (Sun)
  62711730000, #      utc_end 1988-04-03 05:00:00 (Sun)
  62697805200, #  local_start 1987-10-25 01:00:00 (Sun)
  62711719200, #    local_end 1988-04-03 02:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62711730000, #    utc_start 1988-04-03 05:00:00 (Sun)
  62729870400, #      utc_end 1988-10-30 04:00:00 (Sun)
  62711722800, #  local_start 1988-04-03 03:00:00 (Sun)
  62729863200, #    local_end 1988-10-30 02:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62729870400, #    utc_start 1988-10-30 04:00:00 (Sun)
  62743179600, #      utc_end 1989-04-02 05:00:00 (Sun)
  62729859600, #  local_start 1988-10-30 01:00:00 (Sun)
  62743168800, #    local_end 1989-04-02 02:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62743179600, #    utc_start 1989-04-02 05:00:00 (Sun)
  62761320000, #      utc_end 1989-10-29 04:00:00 (Sun)
  62743172400, #  local_start 1989-04-02 03:00:00 (Sun)
  62761312800, #    local_end 1989-10-29 02:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62761320000, #    utc_start 1989-10-29 04:00:00 (Sun)
  62774629200, #      utc_end 1990-04-01 05:00:00 (Sun)
  62761309200, #  local_start 1989-10-29 01:00:00 (Sun)
  62774618400, #    local_end 1990-04-01 02:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62774629200, #    utc_start 1990-04-01 05:00:00 (Sun)
  62792769600, #      utc_end 1990-10-28 04:00:00 (Sun)
  62774622000, #  local_start 1990-04-01 03:00:00 (Sun)
  62792762400, #    local_end 1990-10-28 02:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62792769600, #    utc_start 1990-10-28 04:00:00 (Sun)
  62806683600, #      utc_end 1991-04-07 05:00:00 (Sun)
  62792758800, #  local_start 1990-10-28 01:00:00 (Sun)
  62806672800, #    local_end 1991-04-07 02:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62806683600, #    utc_start 1991-04-07 05:00:00 (Sun)
  62824219200, #      utc_end 1991-10-27 04:00:00 (Sun)
  62806676400, #  local_start 1991-04-07 03:00:00 (Sun)
  62824212000, #    local_end 1991-10-27 02:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62824219200, #    utc_start 1991-10-27 04:00:00 (Sun)
  62838133200, #      utc_end 1992-04-05 05:00:00 (Sun)
  62824208400, #  local_start 1991-10-27 01:00:00 (Sun)
  62838122400, #    local_end 1992-04-05 02:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62838133200, #    utc_start 1992-04-05 05:00:00 (Sun)
  62855668800, #      utc_end 1992-10-25 04:00:00 (Sun)
  62838126000, #  local_start 1992-04-05 03:00:00 (Sun)
  62855661600, #    local_end 1992-10-25 02:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62855668800, #    utc_start 1992-10-25 04:00:00 (Sun)
  62869582800, #      utc_end 1993-04-04 05:00:00 (Sun)
  62855658000, #  local_start 1992-10-25 01:00:00 (Sun)
  62869572000, #    local_end 1993-04-04 02:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62869582800, #    utc_start 1993-04-04 05:00:00 (Sun)
  62887723200, #      utc_end 1993-10-31 04:00:00 (Sun)
  62869575600, #  local_start 1993-04-04 03:00:00 (Sun)
  62887716000, #    local_end 1993-10-31 02:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62887723200, #    utc_start 1993-10-31 04:00:00 (Sun)
  62901032400, #      utc_end 1994-04-03 05:00:00 (Sun)
  62887712400, #  local_start 1993-10-31 01:00:00 (Sun)
  62901021600, #    local_end 1994-04-03 02:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62901032400, #    utc_start 1994-04-03 05:00:00 (Sun)
  62919172800, #      utc_end 1994-10-30 04:00:00 (Sun)
  62901025200, #  local_start 1994-04-03 03:00:00 (Sun)
  62919165600, #    local_end 1994-10-30 02:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62919172800, #    utc_start 1994-10-30 04:00:00 (Sun)
  62932482000, #      utc_end 1995-04-02 05:00:00 (Sun)
  62919162000, #  local_start 1994-10-30 01:00:00 (Sun)
  62932471200, #    local_end 1995-04-02 02:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62932482000, #    utc_start 1995-04-02 05:00:00 (Sun)
  62950622400, #      utc_end 1995-10-29 04:00:00 (Sun)
  62932474800, #  local_start 1995-04-02 03:00:00 (Sun)
  62950615200, #    local_end 1995-10-29 02:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62950622400, #    utc_start 1995-10-29 04:00:00 (Sun)
  62964536400, #      utc_end 1996-04-07 05:00:00 (Sun)
  62950611600, #  local_start 1995-10-29 01:00:00 (Sun)
  62964525600, #    local_end 1996-04-07 02:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62964536400, #    utc_start 1996-04-07 05:00:00 (Sun)
  62982072000, #      utc_end 1996-10-27 04:00:00 (Sun)
  62964529200, #  local_start 1996-04-07 03:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62982072000, #    utc_start 1996-10-27 04:00:00 (Sun)
  62995986000, #      utc_end 1997-04-06 05:00:00 (Sun)
  62982061200, #  local_start 1996-10-27 01:00:00 (Sun)
  62995975200, #    local_end 1997-04-06 02:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62995986000, #    utc_start 1997-04-06 05:00:00 (Sun)
  63013521600, #      utc_end 1997-10-26 04:00:00 (Sun)
  62995978800, #  local_start 1997-04-06 03:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63013521600, #    utc_start 1997-10-26 04:00:00 (Sun)
  63027435600, #      utc_end 1998-04-05 05:00:00 (Sun)
  63013510800, #  local_start 1997-10-26 01:00:00 (Sun)
  63027424800, #    local_end 1998-04-05 02:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63027435600, #    utc_start 1998-04-05 05:00:00 (Sun)
  63044971200, #      utc_end 1998-10-25 04:00:00 (Sun)
  63027428400, #  local_start 1998-04-05 03:00:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63044971200, #    utc_start 1998-10-25 04:00:00 (Sun)
  63058885200, #      utc_end 1999-04-04 05:00:00 (Sun)
  63044960400, #  local_start 1998-10-25 01:00:00 (Sun)
  63058874400, #    local_end 1999-04-04 02:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63058885200, #    utc_start 1999-04-04 05:00:00 (Sun)
  63077025600, #      utc_end 1999-10-31 04:00:00 (Sun)
  63058878000, #  local_start 1999-04-04 03:00:00 (Sun)
  63077018400, #    local_end 1999-10-31 02:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63077025600, #    utc_start 1999-10-31 04:00:00 (Sun)
  63090334800, #      utc_end 2000-04-02 05:00:00 (Sun)
  63077014800, #  local_start 1999-10-31 01:00:00 (Sun)
  63090324000, #    local_end 2000-04-02 02:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63090334800, #    utc_start 2000-04-02 05:00:00 (Sun)
  63108475200, #      utc_end 2000-10-29 04:00:00 (Sun)
  63090327600, #  local_start 2000-04-02 03:00:00 (Sun)
  63108468000, #    local_end 2000-10-29 02:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63108475200, #    utc_start 2000-10-29 04:00:00 (Sun)
  63121784400, #      utc_end 2001-04-01 05:00:00 (Sun)
  63108464400, #  local_start 2000-10-29 01:00:00 (Sun)
  63121773600, #    local_end 2001-04-01 02:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63121784400, #    utc_start 2001-04-01 05:00:00 (Sun)
  63139924800, #      utc_end 2001-10-28 04:00:00 (Sun)
  63121777200, #  local_start 2001-04-01 03:00:00 (Sun)
  63139917600, #    local_end 2001-10-28 02:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63139924800, #    utc_start 2001-10-28 04:00:00 (Sun)
  63153838800, #      utc_end 2002-04-07 05:00:00 (Sun)
  63139914000, #  local_start 2001-10-28 01:00:00 (Sun)
  63153828000, #    local_end 2002-04-07 02:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63153838800, #    utc_start 2002-04-07 05:00:00 (Sun)
  63171374400, #      utc_end 2002-10-27 04:00:00 (Sun)
  63153831600, #  local_start 2002-04-07 03:00:00 (Sun)
  63171367200, #    local_end 2002-10-27 02:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63171374400, #    utc_start 2002-10-27 04:00:00 (Sun)
  63185288400, #      utc_end 2003-04-06 05:00:00 (Sun)
  63171363600, #  local_start 2002-10-27 01:00:00 (Sun)
  63185277600, #    local_end 2003-04-06 02:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63185288400, #    utc_start 2003-04-06 05:00:00 (Sun)
  63202824000, #      utc_end 2003-10-26 04:00:00 (Sun)
  63185281200, #  local_start 2003-04-06 03:00:00 (Sun)
  63202816800, #    local_end 2003-10-26 02:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63202824000, #    utc_start 2003-10-26 04:00:00 (Sun)
  63216738000, #      utc_end 2004-04-04 05:00:00 (Sun)
  63202813200, #  local_start 2003-10-26 01:00:00 (Sun)
  63216727200, #    local_end 2004-04-04 02:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63216738000, #    utc_start 2004-04-04 05:00:00 (Sun)
  63234878400, #      utc_end 2004-10-31 04:00:00 (Sun)
  63216730800, #  local_start 2004-04-04 03:00:00 (Sun)
  63234871200, #    local_end 2004-10-31 02:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63234878400, #    utc_start 2004-10-31 04:00:00 (Sun)
  63248187600, #      utc_end 2005-04-03 05:00:00 (Sun)
  63234867600, #  local_start 2004-10-31 01:00:00 (Sun)
  63248176800, #    local_end 2005-04-03 02:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63248187600, #    utc_start 2005-04-03 05:00:00 (Sun)
  63266328000, #      utc_end 2005-10-30 04:00:00 (Sun)
  63248180400, #  local_start 2005-04-03 03:00:00 (Sun)
  63266320800, #    local_end 2005-10-30 02:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63266328000, #    utc_start 2005-10-30 04:00:00 (Sun)
  63279637200, #      utc_end 2006-04-02 05:00:00 (Sun)
  63266317200, #  local_start 2005-10-30 01:00:00 (Sun)
  63279626400, #    local_end 2006-04-02 02:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63279637200, #    utc_start 2006-04-02 05:00:00 (Sun)
  63297777600, #      utc_end 2006-10-29 04:00:00 (Sun)
  63279630000, #  local_start 2006-04-02 03:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63297777600, #    utc_start 2006-10-29 04:00:00 (Sun)
  63309272400, #      utc_end 2007-03-11 05:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63309261600, #    local_end 2007-03-11 02:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63309272400, #    utc_start 2007-03-11 05:00:00 (Sun)
  63329832000, #      utc_end 2007-11-04 04:00:00 (Sun)
  63309265200, #  local_start 2007-03-11 03:00:00 (Sun)
  63329824800, #    local_end 2007-11-04 02:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63329832000, #    utc_start 2007-11-04 04:00:00 (Sun)
  63340722000, #      utc_end 2008-03-09 05:00:00 (Sun)
  63329821200, #  local_start 2007-11-04 01:00:00 (Sun)
  63340711200, #    local_end 2008-03-09 02:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63340722000, #    utc_start 2008-03-09 05:00:00 (Sun)
  63361281600, #      utc_end 2008-11-02 04:00:00 (Sun)
  63340714800, #  local_start 2008-03-09 03:00:00 (Sun)
  63361274400, #    local_end 2008-11-02 02:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63361281600, #    utc_start 2008-11-02 04:00:00 (Sun)
  63372171600, #      utc_end 2009-03-08 05:00:00 (Sun)
  63361270800, #  local_start 2008-11-02 01:00:00 (Sun)
  63372160800, #    local_end 2009-03-08 02:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63372171600, #    utc_start 2009-03-08 05:00:00 (Sun)
  63392731200, #      utc_end 2009-11-01 04:00:00 (Sun)
  63372164400, #  local_start 2009-03-08 03:00:00 (Sun)
  63392724000, #    local_end 2009-11-01 02:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63392731200, #    utc_start 2009-11-01 04:00:00 (Sun)
  63404226000, #      utc_end 2010-03-14 05:00:00 (Sun)
  63392720400, #  local_start 2009-11-01 01:00:00 (Sun)
  63404215200, #    local_end 2010-03-14 02:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63404226000, #    utc_start 2010-03-14 05:00:00 (Sun)
  63424785600, #      utc_end 2010-11-07 04:00:00 (Sun)
  63404218800, #  local_start 2010-03-14 03:00:00 (Sun)
  63424778400, #    local_end 2010-11-07 02:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63424785600, #    utc_start 2010-11-07 04:00:00 (Sun)
  63435675600, #      utc_end 2011-03-13 05:00:00 (Sun)
  63424774800, #  local_start 2010-11-07 01:00:00 (Sun)
  63435664800, #    local_end 2011-03-13 02:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63435675600, #    utc_start 2011-03-13 05:00:00 (Sun)
  63456235200, #      utc_end 2011-11-06 04:00:00 (Sun)
  63435668400, #  local_start 2011-03-13 03:00:00 (Sun)
  63456228000, #    local_end 2011-11-06 02:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63456235200, #    utc_start 2011-11-06 04:00:00 (Sun)
  63467125200, #      utc_end 2012-03-11 05:00:00 (Sun)
  63456224400, #  local_start 2011-11-06 01:00:00 (Sun)
  63467114400, #    local_end 2012-03-11 02:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63467125200, #    utc_start 2012-03-11 05:00:00 (Sun)
  63487684800, #      utc_end 2012-11-04 04:00:00 (Sun)
  63467118000, #  local_start 2012-03-11 03:00:00 (Sun)
  63487677600, #    local_end 2012-11-04 02:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63487684800, #    utc_start 2012-11-04 04:00:00 (Sun)
  63498574800, #      utc_end 2013-03-10 05:00:00 (Sun)
  63487674000, #  local_start 2012-11-04 01:00:00 (Sun)
  63498564000, #    local_end 2013-03-10 02:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63498574800, #    utc_start 2013-03-10 05:00:00 (Sun)
  63519134400, #      utc_end 2013-11-03 04:00:00 (Sun)
  63498567600, #  local_start 2013-03-10 03:00:00 (Sun)
  63519127200, #    local_end 2013-11-03 02:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63519134400, #    utc_start 2013-11-03 04:00:00 (Sun)
  63530024400, #      utc_end 2014-03-09 05:00:00 (Sun)
  63519123600, #  local_start 2013-11-03 01:00:00 (Sun)
  63530013600, #    local_end 2014-03-09 02:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63530024400, #    utc_start 2014-03-09 05:00:00 (Sun)
  63550584000, #      utc_end 2014-11-02 04:00:00 (Sun)
  63530017200, #  local_start 2014-03-09 03:00:00 (Sun)
  63550576800, #    local_end 2014-11-02 02:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63550584000, #    utc_start 2014-11-02 04:00:00 (Sun)
  63561474000, #      utc_end 2015-03-08 05:00:00 (Sun)
  63550573200, #  local_start 2014-11-02 01:00:00 (Sun)
  63561463200, #    local_end 2015-03-08 02:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63561474000, #    utc_start 2015-03-08 05:00:00 (Sun)
  63582033600, #      utc_end 2015-11-01 04:00:00 (Sun)
  63561466800, #  local_start 2015-03-08 03:00:00 (Sun)
  63582026400, #    local_end 2015-11-01 02:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63582033600, #    utc_start 2015-11-01 04:00:00 (Sun)
  63593528400, #      utc_end 2016-03-13 05:00:00 (Sun)
  63582022800, #  local_start 2015-11-01 01:00:00 (Sun)
  63593517600, #    local_end 2016-03-13 02:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63593528400, #    utc_start 2016-03-13 05:00:00 (Sun)
  63614088000, #      utc_end 2016-11-06 04:00:00 (Sun)
  63593521200, #  local_start 2016-03-13 03:00:00 (Sun)
  63614080800, #    local_end 2016-11-06 02:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63614088000, #    utc_start 2016-11-06 04:00:00 (Sun)
  63624978000, #      utc_end 2017-03-12 05:00:00 (Sun)
  63614077200, #  local_start 2016-11-06 01:00:00 (Sun)
  63624967200, #    local_end 2017-03-12 02:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63624978000, #    utc_start 2017-03-12 05:00:00 (Sun)
  63645537600, #      utc_end 2017-11-05 04:00:00 (Sun)
  63624970800, #  local_start 2017-03-12 03:00:00 (Sun)
  63645530400, #    local_end 2017-11-05 02:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63645537600, #    utc_start 2017-11-05 04:00:00 (Sun)
  63656427600, #      utc_end 2018-03-11 05:00:00 (Sun)
  63645526800, #  local_start 2017-11-05 01:00:00 (Sun)
  63656416800, #    local_end 2018-03-11 02:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63656427600, #    utc_start 2018-03-11 05:00:00 (Sun)
  63676987200, #      utc_end 2018-11-04 04:00:00 (Sun)
  63656420400, #  local_start 2018-03-11 03:00:00 (Sun)
  63676980000, #    local_end 2018-11-04 02:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63676987200, #    utc_start 2018-11-04 04:00:00 (Sun)
  63687877200, #      utc_end 2019-03-10 05:00:00 (Sun)
  63676976400, #  local_start 2018-11-04 01:00:00 (Sun)
  63687866400, #    local_end 2019-03-10 02:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63687877200, #    utc_start 2019-03-10 05:00:00 (Sun)
  63708436800, #      utc_end 2019-11-03 04:00:00 (Sun)
  63687870000, #  local_start 2019-03-10 03:00:00 (Sun)
  63708429600, #    local_end 2019-11-03 02:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63708436800, #    utc_start 2019-11-03 04:00:00 (Sun)
  63719326800, #      utc_end 2020-03-08 05:00:00 (Sun)
  63708426000, #  local_start 2019-11-03 01:00:00 (Sun)
  63719316000, #    local_end 2020-03-08 02:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63719326800, #    utc_start 2020-03-08 05:00:00 (Sun)
  63739886400, #      utc_end 2020-11-01 04:00:00 (Sun)
  63719319600, #  local_start 2020-03-08 03:00:00 (Sun)
  63739879200, #    local_end 2020-11-01 02:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63739886400, #    utc_start 2020-11-01 04:00:00 (Sun)
  63751381200, #      utc_end 2021-03-14 05:00:00 (Sun)
  63739875600, #  local_start 2020-11-01 01:00:00 (Sun)
  63751370400, #    local_end 2021-03-14 02:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63751381200, #    utc_start 2021-03-14 05:00:00 (Sun)
  63771940800, #      utc_end 2021-11-07 04:00:00 (Sun)
  63751374000, #  local_start 2021-03-14 03:00:00 (Sun)
  63771933600, #    local_end 2021-11-07 02:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63771940800, #    utc_start 2021-11-07 04:00:00 (Sun)
  63782830800, #      utc_end 2022-03-13 05:00:00 (Sun)
  63771930000, #  local_start 2021-11-07 01:00:00 (Sun)
  63782820000, #    local_end 2022-03-13 02:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63782830800, #    utc_start 2022-03-13 05:00:00 (Sun)
  63803390400, #      utc_end 2022-11-06 04:00:00 (Sun)
  63782823600, #  local_start 2022-03-13 03:00:00 (Sun)
  63803383200, #    local_end 2022-11-06 02:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63803390400, #    utc_start 2022-11-06 04:00:00 (Sun)
  63814280400, #      utc_end 2023-03-12 05:00:00 (Sun)
  63803379600, #  local_start 2022-11-06 01:00:00 (Sun)
  63814269600, #    local_end 2023-03-12 02:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63814280400, #    utc_start 2023-03-12 05:00:00 (Sun)
  63834840000, #      utc_end 2023-11-05 04:00:00 (Sun)
  63814273200, #  local_start 2023-03-12 03:00:00 (Sun)
  63834832800, #    local_end 2023-11-05 02:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63834840000, #    utc_start 2023-11-05 04:00:00 (Sun)
  63845730000, #      utc_end 2024-03-10 05:00:00 (Sun)
  63834829200, #  local_start 2023-11-05 01:00:00 (Sun)
  63845719200, #    local_end 2024-03-10 02:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63845730000, #    utc_start 2024-03-10 05:00:00 (Sun)
  63866289600, #      utc_end 2024-11-03 04:00:00 (Sun)
  63845722800, #  local_start 2024-03-10 03:00:00 (Sun)
  63866282400, #    local_end 2024-11-03 02:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63866289600, #    utc_start 2024-11-03 04:00:00 (Sun)
  63877179600, #      utc_end 2025-03-09 05:00:00 (Sun)
  63866278800, #  local_start 2024-11-03 01:00:00 (Sun)
  63877168800, #    local_end 2025-03-09 02:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63877179600, #    utc_start 2025-03-09 05:00:00 (Sun)
  63897739200, #      utc_end 2025-11-02 04:00:00 (Sun)
  63877172400, #  local_start 2025-03-09 03:00:00 (Sun)
  63897732000, #    local_end 2025-11-02 02:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63897739200, #    utc_start 2025-11-02 04:00:00 (Sun)
  63908629200, #      utc_end 2026-03-08 05:00:00 (Sun)
  63897728400, #  local_start 2025-11-02 01:00:00 (Sun)
  63908618400, #    local_end 2026-03-08 02:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63908629200, #    utc_start 2026-03-08 05:00:00 (Sun)
  63929188800, #      utc_end 2026-11-01 04:00:00 (Sun)
  63908622000, #  local_start 2026-03-08 03:00:00 (Sun)
  63929181600, #    local_end 2026-11-01 02:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63929188800, #    utc_start 2026-11-01 04:00:00 (Sun)
  63940683600, #      utc_end 2027-03-14 05:00:00 (Sun)
  63929178000, #  local_start 2026-11-01 01:00:00 (Sun)
  63940672800, #    local_end 2027-03-14 02:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63940683600, #    utc_start 2027-03-14 05:00:00 (Sun)
  63961243200, #      utc_end 2027-11-07 04:00:00 (Sun)
  63940676400, #  local_start 2027-03-14 03:00:00 (Sun)
  63961236000, #    local_end 2027-11-07 02:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63961243200, #    utc_start 2027-11-07 04:00:00 (Sun)
  63972133200, #      utc_end 2028-03-12 05:00:00 (Sun)
  63961232400, #  local_start 2027-11-07 01:00:00 (Sun)
  63972122400, #    local_end 2028-03-12 02:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63972133200, #    utc_start 2028-03-12 05:00:00 (Sun)
  63992692800, #      utc_end 2028-11-05 04:00:00 (Sun)
  63972126000, #  local_start 2028-03-12 03:00:00 (Sun)
  63992685600, #    local_end 2028-11-05 02:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63992692800, #    utc_start 2028-11-05 04:00:00 (Sun)
  64003582800, #      utc_end 2029-03-11 05:00:00 (Sun)
  63992682000, #  local_start 2028-11-05 01:00:00 (Sun)
  64003572000, #    local_end 2029-03-11 02:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  64003582800, #    utc_start 2029-03-11 05:00:00 (Sun)
  64024142400, #      utc_end 2029-11-04 04:00:00 (Sun)
  64003575600, #  local_start 2029-03-11 03:00:00 (Sun)
  64024135200, #    local_end 2029-11-04 02:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  64024142400, #    utc_start 2029-11-04 04:00:00 (Sun)
  64035032400, #      utc_end 2030-03-10 05:00:00 (Sun)
  64024131600, #  local_start 2029-11-04 01:00:00 (Sun)
  64035021600, #    local_end 2030-03-10 02:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  64035032400, #    utc_start 2030-03-10 05:00:00 (Sun)
  64055592000, #      utc_end 2030-11-03 04:00:00 (Sun)
  64035025200, #  local_start 2030-03-10 03:00:00 (Sun)
  64055584800, #    local_end 2030-11-03 02:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {44}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -10800 }
  
  my $last_observance = bless( {
    'format' => '-03/-02',
    'gmtoff' => '-3:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 725372,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 725372,
      'utc_rd_secs' => 0,
      'utc_year' => 1988
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -10800,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 725372,
      'local_rd_secs' => 10800,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 725372,
      'utc_rd_secs' => 10800,
      'utc_year' => 1988
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Mar',
      'letter' => 'D',
      'name' => 'Canada',
      'offset_from_std' => 3600,
      'on' => 'Sun>=8',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Nov',
      'letter' => 'S',
      'name' => 'Canada',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_MIQUELON

    $main::fatpacked{"DateTime/TimeZone/America/Moncton.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_MONCTON';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Moncton;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Moncton::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59419801148, #      utc_end 1883-12-09 04:19:08 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59419785600, #    local_end 1883-12-09 00:00:00 (Sun)
  -15548,
  0,
  'LMT',
      ],
      [
  59419801148, #    utc_start 1883-12-09 04:19:08 (Sun)
  60004040400, #      utc_end 1902-06-15 05:00:00 (Sun)
  59419783148, #  local_start 1883-12-08 23:19:08 (Sat)
  60004022400, #    local_end 1902-06-15 00:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  60004040400, #    utc_start 1902-06-15 05:00:00 (Sun)
  60503608800, #      utc_end 1918-04-14 06:00:00 (Sun)
  60004026000, #  local_start 1902-06-15 01:00:00 (Sun)
  60503594400, #    local_end 1918-04-14 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  60503608800, #    utc_start 1918-04-14 06:00:00 (Sun)
  60520539600, #      utc_end 1918-10-27 05:00:00 (Sun)
  60503598000, #  local_start 1918-04-14 03:00:00 (Sun)
  60520528800, #    local_end 1918-10-27 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  60520539600, #    utc_start 1918-10-27 05:00:00 (Sun)
  60968088000, #      utc_end 1933-01-01 04:00:00 (Sun)
  60520525200, #  local_start 1918-10-27 01:00:00 (Sun)
  60968073600, #    local_end 1933-01-01 00:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  60968088000, #    utc_start 1933-01-01 04:00:00 (Sun)
  60982002000, #      utc_end 1933-06-11 05:00:00 (Sun)
  60968073600, #  local_start 1933-01-01 00:00:00 (Sun)
  60981987600, #    local_end 1933-06-11 01:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  60982002000, #    utc_start 1933-06-11 05:00:00 (Sun)
  60989860800, #      utc_end 1933-09-10 04:00:00 (Sun)
  60981991200, #  local_start 1933-06-11 02:00:00 (Sun)
  60989850000, #    local_end 1933-09-10 01:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  60989860800, #    utc_start 1933-09-10 04:00:00 (Sun)
  61013451600, #      utc_end 1934-06-10 05:00:00 (Sun)
  60989846400, #  local_start 1933-09-10 00:00:00 (Sun)
  61013437200, #    local_end 1934-06-10 01:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  61013451600, #    utc_start 1934-06-10 05:00:00 (Sun)
  61021310400, #      utc_end 1934-09-09 04:00:00 (Sun)
  61013440800, #  local_start 1934-06-10 02:00:00 (Sun)
  61021299600, #    local_end 1934-09-09 01:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  61021310400, #    utc_start 1934-09-09 04:00:00 (Sun)
  61044901200, #      utc_end 1935-06-09 05:00:00 (Sun)
  61021296000, #  local_start 1934-09-09 00:00:00 (Sun)
  61044886800, #    local_end 1935-06-09 01:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  61044901200, #    utc_start 1935-06-09 05:00:00 (Sun)
  61052760000, #      utc_end 1935-09-08 04:00:00 (Sun)
  61044890400, #  local_start 1935-06-09 02:00:00 (Sun)
  61052749200, #    local_end 1935-09-08 01:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  61052760000, #    utc_start 1935-09-08 04:00:00 (Sun)
  61076350800, #      utc_end 1936-06-07 05:00:00 (Sun)
  61052745600, #  local_start 1935-09-08 00:00:00 (Sun)
  61076336400, #    local_end 1936-06-07 01:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  61076350800, #    utc_start 1936-06-07 05:00:00 (Sun)
  61084209600, #      utc_end 1936-09-06 04:00:00 (Sun)
  61076340000, #  local_start 1936-06-07 02:00:00 (Sun)
  61084198800, #    local_end 1936-09-06 01:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  61084209600, #    utc_start 1936-09-06 04:00:00 (Sun)
  61107800400, #      utc_end 1937-06-06 05:00:00 (Sun)
  61084195200, #  local_start 1936-09-06 00:00:00 (Sun)
  61107786000, #    local_end 1937-06-06 01:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  61107800400, #    utc_start 1937-06-06 05:00:00 (Sun)
  61115659200, #      utc_end 1937-09-05 04:00:00 (Sun)
  61107789600, #  local_start 1937-06-06 02:00:00 (Sun)
  61115648400, #    local_end 1937-09-05 01:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  61115659200, #    utc_start 1937-09-05 04:00:00 (Sun)
  61139250000, #      utc_end 1938-06-05 05:00:00 (Sun)
  61115644800, #  local_start 1937-09-05 00:00:00 (Sun)
  61139235600, #    local_end 1938-06-05 01:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  61139250000, #    utc_start 1938-06-05 05:00:00 (Sun)
  61147108800, #      utc_end 1938-09-04 04:00:00 (Sun)
  61139239200, #  local_start 1938-06-05 02:00:00 (Sun)
  61147098000, #    local_end 1938-09-04 01:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  61147108800, #    utc_start 1938-09-04 04:00:00 (Sun)
  61170008400, #      utc_end 1939-05-27 05:00:00 (Sat)
  61147094400, #  local_start 1938-09-04 00:00:00 (Sun)
  61169994000, #    local_end 1939-05-27 01:00:00 (Sat)
  -14400,
  0,
  'AST',
      ],
      [
  61170008400, #    utc_start 1939-05-27 05:00:00 (Sat)
  61180286400, #      utc_end 1939-09-23 04:00:00 (Sat)
  61169997600, #  local_start 1939-05-27 02:00:00 (Sat)
  61180275600, #    local_end 1939-09-23 01:00:00 (Sat)
  -10800,
  1,
  'ADT',
      ],
      [
  61180286400, #    utc_start 1939-09-23 04:00:00 (Sat)
  61200939600, #      utc_end 1940-05-19 05:00:00 (Sun)
  61180272000, #  local_start 1939-09-23 00:00:00 (Sat)
  61200925200, #    local_end 1940-05-19 01:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  61200939600, #    utc_start 1940-05-19 05:00:00 (Sun)
  61211736000, #      utc_end 1940-09-21 04:00:00 (Sat)
  61200928800, #  local_start 1940-05-19 02:00:00 (Sun)
  61211725200, #    local_end 1940-09-21 01:00:00 (Sat)
  -10800,
  1,
  'ADT',
      ],
      [
  61211736000, #    utc_start 1940-09-21 04:00:00 (Sat)
  61231179600, #      utc_end 1941-05-04 05:00:00 (Sun)
  61211721600, #  local_start 1940-09-21 00:00:00 (Sat)
  61231165200, #    local_end 1941-05-04 01:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  61231179600, #    utc_start 1941-05-04 05:00:00 (Sun)
  61243790400, #      utc_end 1941-09-27 04:00:00 (Sat)
  61231168800, #  local_start 1941-05-04 02:00:00 (Sun)
  61243779600, #    local_end 1941-09-27 01:00:00 (Sat)
  -10800,
  1,
  'ADT',
      ],
      [
  61243790400, #    utc_start 1941-09-27 04:00:00 (Sat)
  61252084800, #      utc_end 1942-01-01 04:00:00 (Thu)
  61243776000, #  local_start 1941-09-27 00:00:00 (Sat)
  61252070400, #    local_end 1942-01-01 00:00:00 (Thu)
  -14400,
  0,
  'AST',
      ],
      [
  61252084800, #    utc_start 1942-01-01 04:00:00 (Thu)
  61255461600, #      utc_end 1942-02-09 06:00:00 (Mon)
  61252070400, #  local_start 1942-01-01 00:00:00 (Thu)
  61255447200, #    local_end 1942-02-09 02:00:00 (Mon)
  -14400,
  0,
  'AST',
      ],
      [
  61255461600, #    utc_start 1942-02-09 06:00:00 (Mon)
  61366287600, #      utc_end 1945-08-14 23:00:00 (Tue)
  61255450800, #  local_start 1942-02-09 03:00:00 (Mon)
  61366276800, #    local_end 1945-08-14 20:00:00 (Tue)
  -10800,
  1,
  'AWT',
      ],
      [
  61366287600, #    utc_start 1945-08-14 23:00:00 (Tue)
  61370283600, #      utc_end 1945-09-30 05:00:00 (Sun)
  61366276800, #  local_start 1945-08-14 20:00:00 (Tue)
  61370272800, #    local_end 1945-09-30 02:00:00 (Sun)
  -10800,
  1,
  'APT',
      ],
      [
  61370283600, #    utc_start 1945-09-30 05:00:00 (Sun)
  61378315200, #      utc_end 1946-01-01 04:00:00 (Tue)
  61370269200, #  local_start 1945-09-30 01:00:00 (Sun)
  61378300800, #    local_end 1946-01-01 00:00:00 (Tue)
  -14400,
  0,
  'AST',
      ],
      [
  61378315200, #    utc_start 1946-01-01 04:00:00 (Tue)
  61388431200, #      utc_end 1946-04-28 06:00:00 (Sun)
  61378300800, #  local_start 1946-01-01 00:00:00 (Tue)
  61388416800, #    local_end 1946-04-28 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  61388431200, #    utc_start 1946-04-28 06:00:00 (Sun)
  61401733200, #      utc_end 1946-09-29 05:00:00 (Sun)
  61388420400, #  local_start 1946-04-28 03:00:00 (Sun)
  61401722400, #    local_end 1946-09-29 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  61401733200, #    utc_start 1946-09-29 05:00:00 (Sun)
  61419880800, #      utc_end 1947-04-27 06:00:00 (Sun)
  61401718800, #  local_start 1946-09-29 01:00:00 (Sun)
  61419866400, #    local_end 1947-04-27 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  61419880800, #    utc_start 1947-04-27 06:00:00 (Sun)
  61433182800, #      utc_end 1947-09-28 05:00:00 (Sun)
  61419870000, #  local_start 1947-04-27 03:00:00 (Sun)
  61433172000, #    local_end 1947-09-28 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  61433182800, #    utc_start 1947-09-28 05:00:00 (Sun)
  61451330400, #      utc_end 1948-04-25 06:00:00 (Sun)
  61433168400, #  local_start 1947-09-28 01:00:00 (Sun)
  61451316000, #    local_end 1948-04-25 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  61451330400, #    utc_start 1948-04-25 06:00:00 (Sun)
  61464632400, #      utc_end 1948-09-26 05:00:00 (Sun)
  61451319600, #  local_start 1948-04-25 03:00:00 (Sun)
  61464621600, #    local_end 1948-09-26 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  61464632400, #    utc_start 1948-09-26 05:00:00 (Sun)
  61482780000, #      utc_end 1949-04-24 06:00:00 (Sun)
  61464618000, #  local_start 1948-09-26 01:00:00 (Sun)
  61482765600, #    local_end 1949-04-24 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  61482780000, #    utc_start 1949-04-24 06:00:00 (Sun)
  61496082000, #      utc_end 1949-09-25 05:00:00 (Sun)
  61482769200, #  local_start 1949-04-24 03:00:00 (Sun)
  61496071200, #    local_end 1949-09-25 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  61496082000, #    utc_start 1949-09-25 05:00:00 (Sun)
  61514834400, #      utc_end 1950-04-30 06:00:00 (Sun)
  61496067600, #  local_start 1949-09-25 01:00:00 (Sun)
  61514820000, #    local_end 1950-04-30 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  61514834400, #    utc_start 1950-04-30 06:00:00 (Sun)
  61527531600, #      utc_end 1950-09-24 05:00:00 (Sun)
  61514823600, #  local_start 1950-04-30 03:00:00 (Sun)
  61527520800, #    local_end 1950-09-24 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  61527531600, #    utc_start 1950-09-24 05:00:00 (Sun)
  61546284000, #      utc_end 1951-04-29 06:00:00 (Sun)
  61527517200, #  local_start 1950-09-24 01:00:00 (Sun)
  61546269600, #    local_end 1951-04-29 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  61546284000, #    utc_start 1951-04-29 06:00:00 (Sun)
  61559586000, #      utc_end 1951-09-30 05:00:00 (Sun)
  61546273200, #  local_start 1951-04-29 03:00:00 (Sun)
  61559575200, #    local_end 1951-09-30 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  61559586000, #    utc_start 1951-09-30 05:00:00 (Sun)
  61577733600, #      utc_end 1952-04-27 06:00:00 (Sun)
  61559571600, #  local_start 1951-09-30 01:00:00 (Sun)
  61577719200, #    local_end 1952-04-27 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  61577733600, #    utc_start 1952-04-27 06:00:00 (Sun)
  61591035600, #      utc_end 1952-09-28 05:00:00 (Sun)
  61577722800, #  local_start 1952-04-27 03:00:00 (Sun)
  61591024800, #    local_end 1952-09-28 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  61591035600, #    utc_start 1952-09-28 05:00:00 (Sun)
  61609183200, #      utc_end 1953-04-26 06:00:00 (Sun)
  61591021200, #  local_start 1952-09-28 01:00:00 (Sun)
  61609168800, #    local_end 1953-04-26 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  61609183200, #    utc_start 1953-04-26 06:00:00 (Sun)
  61622485200, #      utc_end 1953-09-27 05:00:00 (Sun)
  61609172400, #  local_start 1953-04-26 03:00:00 (Sun)
  61622474400, #    local_end 1953-09-27 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  61622485200, #    utc_start 1953-09-27 05:00:00 (Sun)
  61640632800, #      utc_end 1954-04-25 06:00:00 (Sun)
  61622470800, #  local_start 1953-09-27 01:00:00 (Sun)
  61640618400, #    local_end 1954-04-25 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  61640632800, #    utc_start 1954-04-25 06:00:00 (Sun)
  61653934800, #      utc_end 1954-09-26 05:00:00 (Sun)
  61640622000, #  local_start 1954-04-25 03:00:00 (Sun)
  61653924000, #    local_end 1954-09-26 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  61653934800, #    utc_start 1954-09-26 05:00:00 (Sun)
  61672082400, #      utc_end 1955-04-24 06:00:00 (Sun)
  61653920400, #  local_start 1954-09-26 01:00:00 (Sun)
  61672068000, #    local_end 1955-04-24 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  61672082400, #    utc_start 1955-04-24 06:00:00 (Sun)
  61685384400, #      utc_end 1955-09-25 05:00:00 (Sun)
  61672071600, #  local_start 1955-04-24 03:00:00 (Sun)
  61685373600, #    local_end 1955-09-25 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  61685384400, #    utc_start 1955-09-25 05:00:00 (Sun)
  61704136800, #      utc_end 1956-04-29 06:00:00 (Sun)
  61685370000, #  local_start 1955-09-25 01:00:00 (Sun)
  61704122400, #    local_end 1956-04-29 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  61704136800, #    utc_start 1956-04-29 06:00:00 (Sun)
  61717438800, #      utc_end 1956-09-30 05:00:00 (Sun)
  61704126000, #  local_start 1956-04-29 03:00:00 (Sun)
  61717428000, #    local_end 1956-09-30 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  61717438800, #    utc_start 1956-09-30 05:00:00 (Sun)
  61735586400, #      utc_end 1957-04-28 06:00:00 (Sun)
  61717424400, #  local_start 1956-09-30 01:00:00 (Sun)
  61735572000, #    local_end 1957-04-28 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  61735586400, #    utc_start 1957-04-28 06:00:00 (Sun)
  61751307600, #      utc_end 1957-10-27 05:00:00 (Sun)
  61735575600, #  local_start 1957-04-28 03:00:00 (Sun)
  61751296800, #    local_end 1957-10-27 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  61751307600, #    utc_start 1957-10-27 05:00:00 (Sun)
  61767036000, #      utc_end 1958-04-27 06:00:00 (Sun)
  61751293200, #  local_start 1957-10-27 01:00:00 (Sun)
  61767021600, #    local_end 1958-04-27 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  61767036000, #    utc_start 1958-04-27 06:00:00 (Sun)
  61782757200, #      utc_end 1958-10-26 05:00:00 (Sun)
  61767025200, #  local_start 1958-04-27 03:00:00 (Sun)
  61782746400, #    local_end 1958-10-26 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  61782757200, #    utc_start 1958-10-26 05:00:00 (Sun)
  61798485600, #      utc_end 1959-04-26 06:00:00 (Sun)
  61782742800, #  local_start 1958-10-26 01:00:00 (Sun)
  61798471200, #    local_end 1959-04-26 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  61798485600, #    utc_start 1959-04-26 06:00:00 (Sun)
  61814206800, #      utc_end 1959-10-25 05:00:00 (Sun)
  61798474800, #  local_start 1959-04-26 03:00:00 (Sun)
  61814196000, #    local_end 1959-10-25 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  61814206800, #    utc_start 1959-10-25 05:00:00 (Sun)
  61829935200, #      utc_end 1960-04-24 06:00:00 (Sun)
  61814192400, #  local_start 1959-10-25 01:00:00 (Sun)
  61829920800, #    local_end 1960-04-24 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  61829935200, #    utc_start 1960-04-24 06:00:00 (Sun)
  61846261200, #      utc_end 1960-10-30 05:00:00 (Sun)
  61829924400, #  local_start 1960-04-24 03:00:00 (Sun)
  61846250400, #    local_end 1960-10-30 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  61846261200, #    utc_start 1960-10-30 05:00:00 (Sun)
  61861989600, #      utc_end 1961-04-30 06:00:00 (Sun)
  61846246800, #  local_start 1960-10-30 01:00:00 (Sun)
  61861975200, #    local_end 1961-04-30 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  61861989600, #    utc_start 1961-04-30 06:00:00 (Sun)
  61877710800, #      utc_end 1961-10-29 05:00:00 (Sun)
  61861978800, #  local_start 1961-04-30 03:00:00 (Sun)
  61877700000, #    local_end 1961-10-29 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  61877710800, #    utc_start 1961-10-29 05:00:00 (Sun)
  61893439200, #      utc_end 1962-04-29 06:00:00 (Sun)
  61877696400, #  local_start 1961-10-29 01:00:00 (Sun)
  61893424800, #    local_end 1962-04-29 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  61893439200, #    utc_start 1962-04-29 06:00:00 (Sun)
  61909160400, #      utc_end 1962-10-28 05:00:00 (Sun)
  61893428400, #  local_start 1962-04-29 03:00:00 (Sun)
  61909149600, #    local_end 1962-10-28 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  61909160400, #    utc_start 1962-10-28 05:00:00 (Sun)
  61924888800, #      utc_end 1963-04-28 06:00:00 (Sun)
  61909146000, #  local_start 1962-10-28 01:00:00 (Sun)
  61924874400, #    local_end 1963-04-28 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  61924888800, #    utc_start 1963-04-28 06:00:00 (Sun)
  61940610000, #      utc_end 1963-10-27 05:00:00 (Sun)
  61924878000, #  local_start 1963-04-28 03:00:00 (Sun)
  61940599200, #    local_end 1963-10-27 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  61940610000, #    utc_start 1963-10-27 05:00:00 (Sun)
  61956338400, #      utc_end 1964-04-26 06:00:00 (Sun)
  61940595600, #  local_start 1963-10-27 01:00:00 (Sun)
  61956324000, #    local_end 1964-04-26 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  61956338400, #    utc_start 1964-04-26 06:00:00 (Sun)
  61972059600, #      utc_end 1964-10-25 05:00:00 (Sun)
  61956327600, #  local_start 1964-04-26 03:00:00 (Sun)
  61972048800, #    local_end 1964-10-25 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  61972059600, #    utc_start 1964-10-25 05:00:00 (Sun)
  61987788000, #      utc_end 1965-04-25 06:00:00 (Sun)
  61972045200, #  local_start 1964-10-25 01:00:00 (Sun)
  61987773600, #    local_end 1965-04-25 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  61987788000, #    utc_start 1965-04-25 06:00:00 (Sun)
  62004114000, #      utc_end 1965-10-31 05:00:00 (Sun)
  61987777200, #  local_start 1965-04-25 03:00:00 (Sun)
  62004103200, #    local_end 1965-10-31 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62004114000, #    utc_start 1965-10-31 05:00:00 (Sun)
  62019237600, #      utc_end 1966-04-24 06:00:00 (Sun)
  62004099600, #  local_start 1965-10-31 01:00:00 (Sun)
  62019223200, #    local_end 1966-04-24 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62019237600, #    utc_start 1966-04-24 06:00:00 (Sun)
  62035563600, #      utc_end 1966-10-30 05:00:00 (Sun)
  62019226800, #  local_start 1966-04-24 03:00:00 (Sun)
  62035552800, #    local_end 1966-10-30 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62035563600, #    utc_start 1966-10-30 05:00:00 (Sun)
  62051292000, #      utc_end 1967-04-30 06:00:00 (Sun)
  62035549200, #  local_start 1966-10-30 01:00:00 (Sun)
  62051277600, #    local_end 1967-04-30 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62051292000, #    utc_start 1967-04-30 06:00:00 (Sun)
  62067013200, #      utc_end 1967-10-29 05:00:00 (Sun)
  62051281200, #  local_start 1967-04-30 03:00:00 (Sun)
  62067002400, #    local_end 1967-10-29 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62067013200, #    utc_start 1967-10-29 05:00:00 (Sun)
  62082741600, #      utc_end 1968-04-28 06:00:00 (Sun)
  62066998800, #  local_start 1967-10-29 01:00:00 (Sun)
  62082727200, #    local_end 1968-04-28 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62082741600, #    utc_start 1968-04-28 06:00:00 (Sun)
  62098462800, #      utc_end 1968-10-27 05:00:00 (Sun)
  62082730800, #  local_start 1968-04-28 03:00:00 (Sun)
  62098452000, #    local_end 1968-10-27 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62098462800, #    utc_start 1968-10-27 05:00:00 (Sun)
  62114191200, #      utc_end 1969-04-27 06:00:00 (Sun)
  62098448400, #  local_start 1968-10-27 01:00:00 (Sun)
  62114176800, #    local_end 1969-04-27 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62114191200, #    utc_start 1969-04-27 06:00:00 (Sun)
  62129912400, #      utc_end 1969-10-26 05:00:00 (Sun)
  62114180400, #  local_start 1969-04-27 03:00:00 (Sun)
  62129901600, #    local_end 1969-10-26 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62129912400, #    utc_start 1969-10-26 05:00:00 (Sun)
  62145640800, #      utc_end 1970-04-26 06:00:00 (Sun)
  62129898000, #  local_start 1969-10-26 01:00:00 (Sun)
  62145626400, #    local_end 1970-04-26 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62145640800, #    utc_start 1970-04-26 06:00:00 (Sun)
  62161362000, #      utc_end 1970-10-25 05:00:00 (Sun)
  62145630000, #  local_start 1970-04-26 03:00:00 (Sun)
  62161351200, #    local_end 1970-10-25 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62161362000, #    utc_start 1970-10-25 05:00:00 (Sun)
  62177090400, #      utc_end 1971-04-25 06:00:00 (Sun)
  62161347600, #  local_start 1970-10-25 01:00:00 (Sun)
  62177076000, #    local_end 1971-04-25 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62177090400, #    utc_start 1971-04-25 06:00:00 (Sun)
  62193416400, #      utc_end 1971-10-31 05:00:00 (Sun)
  62177079600, #  local_start 1971-04-25 03:00:00 (Sun)
  62193405600, #    local_end 1971-10-31 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62193416400, #    utc_start 1971-10-31 05:00:00 (Sun)
  62209144800, #      utc_end 1972-04-30 06:00:00 (Sun)
  62193402000, #  local_start 1971-10-31 01:00:00 (Sun)
  62209130400, #    local_end 1972-04-30 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62209144800, #    utc_start 1972-04-30 06:00:00 (Sun)
  62224866000, #      utc_end 1972-10-29 05:00:00 (Sun)
  62209134000, #  local_start 1972-04-30 03:00:00 (Sun)
  62224855200, #    local_end 1972-10-29 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62224866000, #    utc_start 1972-10-29 05:00:00 (Sun)
  62230392000, #      utc_end 1973-01-01 04:00:00 (Mon)
  62224851600, #  local_start 1972-10-29 01:00:00 (Sun)
  62230377600, #    local_end 1973-01-01 00:00:00 (Mon)
  -14400,
  0,
  'AST',
      ],
      [
  62230392000, #    utc_start 1973-01-01 04:00:00 (Mon)
  62272044000, #      utc_end 1974-04-28 06:00:00 (Sun)
  62230377600, #  local_start 1973-01-01 00:00:00 (Mon)
  62272029600, #    local_end 1974-04-28 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62272044000, #    utc_start 1974-04-28 06:00:00 (Sun)
  62287765200, #      utc_end 1974-10-27 05:00:00 (Sun)
  62272033200, #  local_start 1974-04-28 03:00:00 (Sun)
  62287754400, #    local_end 1974-10-27 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62287765200, #    utc_start 1974-10-27 05:00:00 (Sun)
  62303493600, #      utc_end 1975-04-27 06:00:00 (Sun)
  62287750800, #  local_start 1974-10-27 01:00:00 (Sun)
  62303479200, #    local_end 1975-04-27 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62303493600, #    utc_start 1975-04-27 06:00:00 (Sun)
  62319214800, #      utc_end 1975-10-26 05:00:00 (Sun)
  62303482800, #  local_start 1975-04-27 03:00:00 (Sun)
  62319204000, #    local_end 1975-10-26 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62319214800, #    utc_start 1975-10-26 05:00:00 (Sun)
  62334943200, #      utc_end 1976-04-25 06:00:00 (Sun)
  62319200400, #  local_start 1975-10-26 01:00:00 (Sun)
  62334928800, #    local_end 1976-04-25 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62334943200, #    utc_start 1976-04-25 06:00:00 (Sun)
  62351269200, #      utc_end 1976-10-31 05:00:00 (Sun)
  62334932400, #  local_start 1976-04-25 03:00:00 (Sun)
  62351258400, #    local_end 1976-10-31 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62351269200, #    utc_start 1976-10-31 05:00:00 (Sun)
  62366392800, #      utc_end 1977-04-24 06:00:00 (Sun)
  62351254800, #  local_start 1976-10-31 01:00:00 (Sun)
  62366378400, #    local_end 1977-04-24 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62366392800, #    utc_start 1977-04-24 06:00:00 (Sun)
  62382718800, #      utc_end 1977-10-30 05:00:00 (Sun)
  62366382000, #  local_start 1977-04-24 03:00:00 (Sun)
  62382708000, #    local_end 1977-10-30 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62382718800, #    utc_start 1977-10-30 05:00:00 (Sun)
  62398447200, #      utc_end 1978-04-30 06:00:00 (Sun)
  62382704400, #  local_start 1977-10-30 01:00:00 (Sun)
  62398432800, #    local_end 1978-04-30 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62398447200, #    utc_start 1978-04-30 06:00:00 (Sun)
  62414168400, #      utc_end 1978-10-29 05:00:00 (Sun)
  62398436400, #  local_start 1978-04-30 03:00:00 (Sun)
  62414157600, #    local_end 1978-10-29 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62414168400, #    utc_start 1978-10-29 05:00:00 (Sun)
  62429896800, #      utc_end 1979-04-29 06:00:00 (Sun)
  62414154000, #  local_start 1978-10-29 01:00:00 (Sun)
  62429882400, #    local_end 1979-04-29 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62429896800, #    utc_start 1979-04-29 06:00:00 (Sun)
  62445618000, #      utc_end 1979-10-28 05:00:00 (Sun)
  62429886000, #  local_start 1979-04-29 03:00:00 (Sun)
  62445607200, #    local_end 1979-10-28 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62445618000, #    utc_start 1979-10-28 05:00:00 (Sun)
  62461346400, #      utc_end 1980-04-27 06:00:00 (Sun)
  62445603600, #  local_start 1979-10-28 01:00:00 (Sun)
  62461332000, #    local_end 1980-04-27 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62461346400, #    utc_start 1980-04-27 06:00:00 (Sun)
  62477067600, #      utc_end 1980-10-26 05:00:00 (Sun)
  62461335600, #  local_start 1980-04-27 03:00:00 (Sun)
  62477056800, #    local_end 1980-10-26 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62477067600, #    utc_start 1980-10-26 05:00:00 (Sun)
  62492796000, #      utc_end 1981-04-26 06:00:00 (Sun)
  62477053200, #  local_start 1980-10-26 01:00:00 (Sun)
  62492781600, #    local_end 1981-04-26 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62492796000, #    utc_start 1981-04-26 06:00:00 (Sun)
  62508517200, #      utc_end 1981-10-25 05:00:00 (Sun)
  62492785200, #  local_start 1981-04-26 03:00:00 (Sun)
  62508506400, #    local_end 1981-10-25 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62508517200, #    utc_start 1981-10-25 05:00:00 (Sun)
  62524245600, #      utc_end 1982-04-25 06:00:00 (Sun)
  62508502800, #  local_start 1981-10-25 01:00:00 (Sun)
  62524231200, #    local_end 1982-04-25 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62524245600, #    utc_start 1982-04-25 06:00:00 (Sun)
  62540571600, #      utc_end 1982-10-31 05:00:00 (Sun)
  62524234800, #  local_start 1982-04-25 03:00:00 (Sun)
  62540560800, #    local_end 1982-10-31 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62540571600, #    utc_start 1982-10-31 05:00:00 (Sun)
  62555695200, #      utc_end 1983-04-24 06:00:00 (Sun)
  62540557200, #  local_start 1982-10-31 01:00:00 (Sun)
  62555680800, #    local_end 1983-04-24 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62555695200, #    utc_start 1983-04-24 06:00:00 (Sun)
  62572021200, #      utc_end 1983-10-30 05:00:00 (Sun)
  62555684400, #  local_start 1983-04-24 03:00:00 (Sun)
  62572010400, #    local_end 1983-10-30 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62572021200, #    utc_start 1983-10-30 05:00:00 (Sun)
  62587749600, #      utc_end 1984-04-29 06:00:00 (Sun)
  62572006800, #  local_start 1983-10-30 01:00:00 (Sun)
  62587735200, #    local_end 1984-04-29 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62587749600, #    utc_start 1984-04-29 06:00:00 (Sun)
  62603470800, #      utc_end 1984-10-28 05:00:00 (Sun)
  62587738800, #  local_start 1984-04-29 03:00:00 (Sun)
  62603460000, #    local_end 1984-10-28 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62603470800, #    utc_start 1984-10-28 05:00:00 (Sun)
  62619199200, #      utc_end 1985-04-28 06:00:00 (Sun)
  62603456400, #  local_start 1984-10-28 01:00:00 (Sun)
  62619184800, #    local_end 1985-04-28 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62619199200, #    utc_start 1985-04-28 06:00:00 (Sun)
  62634920400, #      utc_end 1985-10-27 05:00:00 (Sun)
  62619188400, #  local_start 1985-04-28 03:00:00 (Sun)
  62634909600, #    local_end 1985-10-27 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62634920400, #    utc_start 1985-10-27 05:00:00 (Sun)
  62650648800, #      utc_end 1986-04-27 06:00:00 (Sun)
  62634906000, #  local_start 1985-10-27 01:00:00 (Sun)
  62650634400, #    local_end 1986-04-27 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62650648800, #    utc_start 1986-04-27 06:00:00 (Sun)
  62666370000, #      utc_end 1986-10-26 05:00:00 (Sun)
  62650638000, #  local_start 1986-04-27 03:00:00 (Sun)
  62666359200, #    local_end 1986-10-26 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62666370000, #    utc_start 1986-10-26 05:00:00 (Sun)
  62680284000, #      utc_end 1987-04-05 06:00:00 (Sun)
  62666355600, #  local_start 1986-10-26 01:00:00 (Sun)
  62680269600, #    local_end 1987-04-05 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62680284000, #    utc_start 1987-04-05 06:00:00 (Sun)
  62697819600, #      utc_end 1987-10-25 05:00:00 (Sun)
  62680273200, #  local_start 1987-04-05 03:00:00 (Sun)
  62697808800, #    local_end 1987-10-25 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62697819600, #    utc_start 1987-10-25 05:00:00 (Sun)
  62711733600, #      utc_end 1988-04-03 06:00:00 (Sun)
  62697805200, #  local_start 1987-10-25 01:00:00 (Sun)
  62711719200, #    local_end 1988-04-03 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62711733600, #    utc_start 1988-04-03 06:00:00 (Sun)
  62729874000, #      utc_end 1988-10-30 05:00:00 (Sun)
  62711722800, #  local_start 1988-04-03 03:00:00 (Sun)
  62729863200, #    local_end 1988-10-30 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62729874000, #    utc_start 1988-10-30 05:00:00 (Sun)
  62743183200, #      utc_end 1989-04-02 06:00:00 (Sun)
  62729859600, #  local_start 1988-10-30 01:00:00 (Sun)
  62743168800, #    local_end 1989-04-02 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62743183200, #    utc_start 1989-04-02 06:00:00 (Sun)
  62761323600, #      utc_end 1989-10-29 05:00:00 (Sun)
  62743172400, #  local_start 1989-04-02 03:00:00 (Sun)
  62761312800, #    local_end 1989-10-29 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62761323600, #    utc_start 1989-10-29 05:00:00 (Sun)
  62774632800, #      utc_end 1990-04-01 06:00:00 (Sun)
  62761309200, #  local_start 1989-10-29 01:00:00 (Sun)
  62774618400, #    local_end 1990-04-01 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62774632800, #    utc_start 1990-04-01 06:00:00 (Sun)
  62792773200, #      utc_end 1990-10-28 05:00:00 (Sun)
  62774622000, #  local_start 1990-04-01 03:00:00 (Sun)
  62792762400, #    local_end 1990-10-28 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62792773200, #    utc_start 1990-10-28 05:00:00 (Sun)
  62806687200, #      utc_end 1991-04-07 06:00:00 (Sun)
  62792758800, #  local_start 1990-10-28 01:00:00 (Sun)
  62806672800, #    local_end 1991-04-07 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62806687200, #    utc_start 1991-04-07 06:00:00 (Sun)
  62824222800, #      utc_end 1991-10-27 05:00:00 (Sun)
  62806676400, #  local_start 1991-04-07 03:00:00 (Sun)
  62824212000, #    local_end 1991-10-27 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62824222800, #    utc_start 1991-10-27 05:00:00 (Sun)
  62838136800, #      utc_end 1992-04-05 06:00:00 (Sun)
  62824208400, #  local_start 1991-10-27 01:00:00 (Sun)
  62838122400, #    local_end 1992-04-05 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62838136800, #    utc_start 1992-04-05 06:00:00 (Sun)
  62855672400, #      utc_end 1992-10-25 05:00:00 (Sun)
  62838126000, #  local_start 1992-04-05 03:00:00 (Sun)
  62855661600, #    local_end 1992-10-25 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62855672400, #    utc_start 1992-10-25 05:00:00 (Sun)
  62861544000, #      utc_end 1993-01-01 04:00:00 (Fri)
  62855658000, #  local_start 1992-10-25 01:00:00 (Sun)
  62861529600, #    local_end 1993-01-01 00:00:00 (Fri)
  -14400,
  0,
  'AST',
      ],
      [
  62861544000, #    utc_start 1993-01-01 04:00:00 (Fri)
  62869579260, #      utc_end 1993-04-04 04:01:00 (Sun)
  62861529600, #  local_start 1993-01-01 00:00:00 (Fri)
  62869564860, #    local_end 1993-04-04 00:01:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62869579260, #    utc_start 1993-04-04 04:01:00 (Sun)
  62887719660, #      utc_end 1993-10-31 03:01:00 (Sun)
  62869568460, #  local_start 1993-04-04 01:01:00 (Sun)
  62887708860, #    local_end 1993-10-31 00:01:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62887719660, #    utc_start 1993-10-31 03:01:00 (Sun)
  62901028860, #      utc_end 1994-04-03 04:01:00 (Sun)
  62887705260, #  local_start 1993-10-30 23:01:00 (Sat)
  62901014460, #    local_end 1994-04-03 00:01:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62901028860, #    utc_start 1994-04-03 04:01:00 (Sun)
  62919169260, #      utc_end 1994-10-30 03:01:00 (Sun)
  62901018060, #  local_start 1994-04-03 01:01:00 (Sun)
  62919158460, #    local_end 1994-10-30 00:01:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62919169260, #    utc_start 1994-10-30 03:01:00 (Sun)
  62932478460, #      utc_end 1995-04-02 04:01:00 (Sun)
  62919154860, #  local_start 1994-10-29 23:01:00 (Sat)
  62932464060, #    local_end 1995-04-02 00:01:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62932478460, #    utc_start 1995-04-02 04:01:00 (Sun)
  62950618860, #      utc_end 1995-10-29 03:01:00 (Sun)
  62932467660, #  local_start 1995-04-02 01:01:00 (Sun)
  62950608060, #    local_end 1995-10-29 00:01:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62950618860, #    utc_start 1995-10-29 03:01:00 (Sun)
  62964532860, #      utc_end 1996-04-07 04:01:00 (Sun)
  62950604460, #  local_start 1995-10-28 23:01:00 (Sat)
  62964518460, #    local_end 1996-04-07 00:01:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62964532860, #    utc_start 1996-04-07 04:01:00 (Sun)
  62982068460, #      utc_end 1996-10-27 03:01:00 (Sun)
  62964522060, #  local_start 1996-04-07 01:01:00 (Sun)
  62982057660, #    local_end 1996-10-27 00:01:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62982068460, #    utc_start 1996-10-27 03:01:00 (Sun)
  62995982460, #      utc_end 1997-04-06 04:01:00 (Sun)
  62982054060, #  local_start 1996-10-26 23:01:00 (Sat)
  62995968060, #    local_end 1997-04-06 00:01:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62995982460, #    utc_start 1997-04-06 04:01:00 (Sun)
  63013518060, #      utc_end 1997-10-26 03:01:00 (Sun)
  62995971660, #  local_start 1997-04-06 01:01:00 (Sun)
  63013507260, #    local_end 1997-10-26 00:01:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63013518060, #    utc_start 1997-10-26 03:01:00 (Sun)
  63027432060, #      utc_end 1998-04-05 04:01:00 (Sun)
  63013503660, #  local_start 1997-10-25 23:01:00 (Sat)
  63027417660, #    local_end 1998-04-05 00:01:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63027432060, #    utc_start 1998-04-05 04:01:00 (Sun)
  63044967660, #      utc_end 1998-10-25 03:01:00 (Sun)
  63027421260, #  local_start 1998-04-05 01:01:00 (Sun)
  63044956860, #    local_end 1998-10-25 00:01:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63044967660, #    utc_start 1998-10-25 03:01:00 (Sun)
  63058881660, #      utc_end 1999-04-04 04:01:00 (Sun)
  63044953260, #  local_start 1998-10-24 23:01:00 (Sat)
  63058867260, #    local_end 1999-04-04 00:01:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63058881660, #    utc_start 1999-04-04 04:01:00 (Sun)
  63077022060, #      utc_end 1999-10-31 03:01:00 (Sun)
  63058870860, #  local_start 1999-04-04 01:01:00 (Sun)
  63077011260, #    local_end 1999-10-31 00:01:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63077022060, #    utc_start 1999-10-31 03:01:00 (Sun)
  63090331260, #      utc_end 2000-04-02 04:01:00 (Sun)
  63077007660, #  local_start 1999-10-30 23:01:00 (Sat)
  63090316860, #    local_end 2000-04-02 00:01:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63090331260, #    utc_start 2000-04-02 04:01:00 (Sun)
  63108471660, #      utc_end 2000-10-29 03:01:00 (Sun)
  63090320460, #  local_start 2000-04-02 01:01:00 (Sun)
  63108460860, #    local_end 2000-10-29 00:01:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63108471660, #    utc_start 2000-10-29 03:01:00 (Sun)
  63121780860, #      utc_end 2001-04-01 04:01:00 (Sun)
  63108457260, #  local_start 2000-10-28 23:01:00 (Sat)
  63121766460, #    local_end 2001-04-01 00:01:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63121780860, #    utc_start 2001-04-01 04:01:00 (Sun)
  63139921260, #      utc_end 2001-10-28 03:01:00 (Sun)
  63121770060, #  local_start 2001-04-01 01:01:00 (Sun)
  63139910460, #    local_end 2001-10-28 00:01:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63139921260, #    utc_start 2001-10-28 03:01:00 (Sun)
  63153835260, #      utc_end 2002-04-07 04:01:00 (Sun)
  63139906860, #  local_start 2001-10-27 23:01:00 (Sat)
  63153820860, #    local_end 2002-04-07 00:01:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63153835260, #    utc_start 2002-04-07 04:01:00 (Sun)
  63171370860, #      utc_end 2002-10-27 03:01:00 (Sun)
  63153824460, #  local_start 2002-04-07 01:01:00 (Sun)
  63171360060, #    local_end 2002-10-27 00:01:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63171370860, #    utc_start 2002-10-27 03:01:00 (Sun)
  63185284860, #      utc_end 2003-04-06 04:01:00 (Sun)
  63171356460, #  local_start 2002-10-26 23:01:00 (Sat)
  63185270460, #    local_end 2003-04-06 00:01:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63185284860, #    utc_start 2003-04-06 04:01:00 (Sun)
  63202820460, #      utc_end 2003-10-26 03:01:00 (Sun)
  63185274060, #  local_start 2003-04-06 01:01:00 (Sun)
  63202809660, #    local_end 2003-10-26 00:01:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63202820460, #    utc_start 2003-10-26 03:01:00 (Sun)
  63216734460, #      utc_end 2004-04-04 04:01:00 (Sun)
  63202806060, #  local_start 2003-10-25 23:01:00 (Sat)
  63216720060, #    local_end 2004-04-04 00:01:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63216734460, #    utc_start 2004-04-04 04:01:00 (Sun)
  63234874860, #      utc_end 2004-10-31 03:01:00 (Sun)
  63216723660, #  local_start 2004-04-04 01:01:00 (Sun)
  63234864060, #    local_end 2004-10-31 00:01:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63234874860, #    utc_start 2004-10-31 03:01:00 (Sun)
  63248184060, #      utc_end 2005-04-03 04:01:00 (Sun)
  63234860460, #  local_start 2004-10-30 23:01:00 (Sat)
  63248169660, #    local_end 2005-04-03 00:01:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63248184060, #    utc_start 2005-04-03 04:01:00 (Sun)
  63266324460, #      utc_end 2005-10-30 03:01:00 (Sun)
  63248173260, #  local_start 2005-04-03 01:01:00 (Sun)
  63266313660, #    local_end 2005-10-30 00:01:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63266324460, #    utc_start 2005-10-30 03:01:00 (Sun)
  63279633660, #      utc_end 2006-04-02 04:01:00 (Sun)
  63266310060, #  local_start 2005-10-29 23:01:00 (Sat)
  63279619260, #    local_end 2006-04-02 00:01:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63279633660, #    utc_start 2006-04-02 04:01:00 (Sun)
  63297774060, #      utc_end 2006-10-29 03:01:00 (Sun)
  63279622860, #  local_start 2006-04-02 01:01:00 (Sun)
  63297763260, #    local_end 2006-10-29 00:01:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63297774060, #    utc_start 2006-10-29 03:01:00 (Sun)
  63303307200, #      utc_end 2007-01-01 04:00:00 (Mon)
  63297759660, #  local_start 2006-10-28 23:01:00 (Sat)
  63303292800, #    local_end 2007-01-01 00:00:00 (Mon)
  -14400,
  0,
  'AST',
      ],
      [
  63303307200, #    utc_start 2007-01-01 04:00:00 (Mon)
  63309276000, #      utc_end 2007-03-11 06:00:00 (Sun)
  63303292800, #  local_start 2007-01-01 00:00:00 (Mon)
  63309261600, #    local_end 2007-03-11 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63309276000, #    utc_start 2007-03-11 06:00:00 (Sun)
  63329835600, #      utc_end 2007-11-04 05:00:00 (Sun)
  63309265200, #  local_start 2007-03-11 03:00:00 (Sun)
  63329824800, #    local_end 2007-11-04 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63329835600, #    utc_start 2007-11-04 05:00:00 (Sun)
  63340725600, #      utc_end 2008-03-09 06:00:00 (Sun)
  63329821200, #  local_start 2007-11-04 01:00:00 (Sun)
  63340711200, #    local_end 2008-03-09 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63340725600, #    utc_start 2008-03-09 06:00:00 (Sun)
  63361285200, #      utc_end 2008-11-02 05:00:00 (Sun)
  63340714800, #  local_start 2008-03-09 03:00:00 (Sun)
  63361274400, #    local_end 2008-11-02 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63361285200, #    utc_start 2008-11-02 05:00:00 (Sun)
  63372175200, #      utc_end 2009-03-08 06:00:00 (Sun)
  63361270800, #  local_start 2008-11-02 01:00:00 (Sun)
  63372160800, #    local_end 2009-03-08 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63372175200, #    utc_start 2009-03-08 06:00:00 (Sun)
  63392734800, #      utc_end 2009-11-01 05:00:00 (Sun)
  63372164400, #  local_start 2009-03-08 03:00:00 (Sun)
  63392724000, #    local_end 2009-11-01 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63392734800, #    utc_start 2009-11-01 05:00:00 (Sun)
  63404229600, #      utc_end 2010-03-14 06:00:00 (Sun)
  63392720400, #  local_start 2009-11-01 01:00:00 (Sun)
  63404215200, #    local_end 2010-03-14 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63404229600, #    utc_start 2010-03-14 06:00:00 (Sun)
  63424789200, #      utc_end 2010-11-07 05:00:00 (Sun)
  63404218800, #  local_start 2010-03-14 03:00:00 (Sun)
  63424778400, #    local_end 2010-11-07 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63424789200, #    utc_start 2010-11-07 05:00:00 (Sun)
  63435679200, #      utc_end 2011-03-13 06:00:00 (Sun)
  63424774800, #  local_start 2010-11-07 01:00:00 (Sun)
  63435664800, #    local_end 2011-03-13 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63435679200, #    utc_start 2011-03-13 06:00:00 (Sun)
  63456238800, #      utc_end 2011-11-06 05:00:00 (Sun)
  63435668400, #  local_start 2011-03-13 03:00:00 (Sun)
  63456228000, #    local_end 2011-11-06 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63456238800, #    utc_start 2011-11-06 05:00:00 (Sun)
  63467128800, #      utc_end 2012-03-11 06:00:00 (Sun)
  63456224400, #  local_start 2011-11-06 01:00:00 (Sun)
  63467114400, #    local_end 2012-03-11 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63467128800, #    utc_start 2012-03-11 06:00:00 (Sun)
  63487688400, #      utc_end 2012-11-04 05:00:00 (Sun)
  63467118000, #  local_start 2012-03-11 03:00:00 (Sun)
  63487677600, #    local_end 2012-11-04 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63487688400, #    utc_start 2012-11-04 05:00:00 (Sun)
  63498578400, #      utc_end 2013-03-10 06:00:00 (Sun)
  63487674000, #  local_start 2012-11-04 01:00:00 (Sun)
  63498564000, #    local_end 2013-03-10 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63498578400, #    utc_start 2013-03-10 06:00:00 (Sun)
  63519138000, #      utc_end 2013-11-03 05:00:00 (Sun)
  63498567600, #  local_start 2013-03-10 03:00:00 (Sun)
  63519127200, #    local_end 2013-11-03 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63519138000, #    utc_start 2013-11-03 05:00:00 (Sun)
  63530028000, #      utc_end 2014-03-09 06:00:00 (Sun)
  63519123600, #  local_start 2013-11-03 01:00:00 (Sun)
  63530013600, #    local_end 2014-03-09 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63530028000, #    utc_start 2014-03-09 06:00:00 (Sun)
  63550587600, #      utc_end 2014-11-02 05:00:00 (Sun)
  63530017200, #  local_start 2014-03-09 03:00:00 (Sun)
  63550576800, #    local_end 2014-11-02 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63550587600, #    utc_start 2014-11-02 05:00:00 (Sun)
  63561477600, #      utc_end 2015-03-08 06:00:00 (Sun)
  63550573200, #  local_start 2014-11-02 01:00:00 (Sun)
  63561463200, #    local_end 2015-03-08 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63561477600, #    utc_start 2015-03-08 06:00:00 (Sun)
  63582037200, #      utc_end 2015-11-01 05:00:00 (Sun)
  63561466800, #  local_start 2015-03-08 03:00:00 (Sun)
  63582026400, #    local_end 2015-11-01 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63582037200, #    utc_start 2015-11-01 05:00:00 (Sun)
  63593532000, #      utc_end 2016-03-13 06:00:00 (Sun)
  63582022800, #  local_start 2015-11-01 01:00:00 (Sun)
  63593517600, #    local_end 2016-03-13 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63593532000, #    utc_start 2016-03-13 06:00:00 (Sun)
  63614091600, #      utc_end 2016-11-06 05:00:00 (Sun)
  63593521200, #  local_start 2016-03-13 03:00:00 (Sun)
  63614080800, #    local_end 2016-11-06 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63614091600, #    utc_start 2016-11-06 05:00:00 (Sun)
  63624981600, #      utc_end 2017-03-12 06:00:00 (Sun)
  63614077200, #  local_start 2016-11-06 01:00:00 (Sun)
  63624967200, #    local_end 2017-03-12 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63624981600, #    utc_start 2017-03-12 06:00:00 (Sun)
  63645541200, #      utc_end 2017-11-05 05:00:00 (Sun)
  63624970800, #  local_start 2017-03-12 03:00:00 (Sun)
  63645530400, #    local_end 2017-11-05 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63645541200, #    utc_start 2017-11-05 05:00:00 (Sun)
  63656431200, #      utc_end 2018-03-11 06:00:00 (Sun)
  63645526800, #  local_start 2017-11-05 01:00:00 (Sun)
  63656416800, #    local_end 2018-03-11 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63656431200, #    utc_start 2018-03-11 06:00:00 (Sun)
  63676990800, #      utc_end 2018-11-04 05:00:00 (Sun)
  63656420400, #  local_start 2018-03-11 03:00:00 (Sun)
  63676980000, #    local_end 2018-11-04 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63676990800, #    utc_start 2018-11-04 05:00:00 (Sun)
  63687880800, #      utc_end 2019-03-10 06:00:00 (Sun)
  63676976400, #  local_start 2018-11-04 01:00:00 (Sun)
  63687866400, #    local_end 2019-03-10 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63687880800, #    utc_start 2019-03-10 06:00:00 (Sun)
  63708440400, #      utc_end 2019-11-03 05:00:00 (Sun)
  63687870000, #  local_start 2019-03-10 03:00:00 (Sun)
  63708429600, #    local_end 2019-11-03 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63708440400, #    utc_start 2019-11-03 05:00:00 (Sun)
  63719330400, #      utc_end 2020-03-08 06:00:00 (Sun)
  63708426000, #  local_start 2019-11-03 01:00:00 (Sun)
  63719316000, #    local_end 2020-03-08 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63719330400, #    utc_start 2020-03-08 06:00:00 (Sun)
  63739890000, #      utc_end 2020-11-01 05:00:00 (Sun)
  63719319600, #  local_start 2020-03-08 03:00:00 (Sun)
  63739879200, #    local_end 2020-11-01 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63739890000, #    utc_start 2020-11-01 05:00:00 (Sun)
  63751384800, #      utc_end 2021-03-14 06:00:00 (Sun)
  63739875600, #  local_start 2020-11-01 01:00:00 (Sun)
  63751370400, #    local_end 2021-03-14 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63751384800, #    utc_start 2021-03-14 06:00:00 (Sun)
  63771944400, #      utc_end 2021-11-07 05:00:00 (Sun)
  63751374000, #  local_start 2021-03-14 03:00:00 (Sun)
  63771933600, #    local_end 2021-11-07 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63771944400, #    utc_start 2021-11-07 05:00:00 (Sun)
  63782834400, #      utc_end 2022-03-13 06:00:00 (Sun)
  63771930000, #  local_start 2021-11-07 01:00:00 (Sun)
  63782820000, #    local_end 2022-03-13 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63782834400, #    utc_start 2022-03-13 06:00:00 (Sun)
  63803394000, #      utc_end 2022-11-06 05:00:00 (Sun)
  63782823600, #  local_start 2022-03-13 03:00:00 (Sun)
  63803383200, #    local_end 2022-11-06 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63803394000, #    utc_start 2022-11-06 05:00:00 (Sun)
  63814284000, #      utc_end 2023-03-12 06:00:00 (Sun)
  63803379600, #  local_start 2022-11-06 01:00:00 (Sun)
  63814269600, #    local_end 2023-03-12 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63814284000, #    utc_start 2023-03-12 06:00:00 (Sun)
  63834843600, #      utc_end 2023-11-05 05:00:00 (Sun)
  63814273200, #  local_start 2023-03-12 03:00:00 (Sun)
  63834832800, #    local_end 2023-11-05 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63834843600, #    utc_start 2023-11-05 05:00:00 (Sun)
  63845733600, #      utc_end 2024-03-10 06:00:00 (Sun)
  63834829200, #  local_start 2023-11-05 01:00:00 (Sun)
  63845719200, #    local_end 2024-03-10 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63845733600, #    utc_start 2024-03-10 06:00:00 (Sun)
  63866293200, #      utc_end 2024-11-03 05:00:00 (Sun)
  63845722800, #  local_start 2024-03-10 03:00:00 (Sun)
  63866282400, #    local_end 2024-11-03 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63866293200, #    utc_start 2024-11-03 05:00:00 (Sun)
  63877183200, #      utc_end 2025-03-09 06:00:00 (Sun)
  63866278800, #  local_start 2024-11-03 01:00:00 (Sun)
  63877168800, #    local_end 2025-03-09 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63877183200, #    utc_start 2025-03-09 06:00:00 (Sun)
  63897742800, #      utc_end 2025-11-02 05:00:00 (Sun)
  63877172400, #  local_start 2025-03-09 03:00:00 (Sun)
  63897732000, #    local_end 2025-11-02 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63897742800, #    utc_start 2025-11-02 05:00:00 (Sun)
  63908632800, #      utc_end 2026-03-08 06:00:00 (Sun)
  63897728400, #  local_start 2025-11-02 01:00:00 (Sun)
  63908618400, #    local_end 2026-03-08 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63908632800, #    utc_start 2026-03-08 06:00:00 (Sun)
  63929192400, #      utc_end 2026-11-01 05:00:00 (Sun)
  63908622000, #  local_start 2026-03-08 03:00:00 (Sun)
  63929181600, #    local_end 2026-11-01 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63929192400, #    utc_start 2026-11-01 05:00:00 (Sun)
  63940687200, #      utc_end 2027-03-14 06:00:00 (Sun)
  63929178000, #  local_start 2026-11-01 01:00:00 (Sun)
  63940672800, #    local_end 2027-03-14 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63940687200, #    utc_start 2027-03-14 06:00:00 (Sun)
  63961246800, #      utc_end 2027-11-07 05:00:00 (Sun)
  63940676400, #  local_start 2027-03-14 03:00:00 (Sun)
  63961236000, #    local_end 2027-11-07 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63961246800, #    utc_start 2027-11-07 05:00:00 (Sun)
  63972136800, #      utc_end 2028-03-12 06:00:00 (Sun)
  63961232400, #  local_start 2027-11-07 01:00:00 (Sun)
  63972122400, #    local_end 2028-03-12 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63972136800, #    utc_start 2028-03-12 06:00:00 (Sun)
  63992696400, #      utc_end 2028-11-05 05:00:00 (Sun)
  63972126000, #  local_start 2028-03-12 03:00:00 (Sun)
  63992685600, #    local_end 2028-11-05 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63992696400, #    utc_start 2028-11-05 05:00:00 (Sun)
  64003586400, #      utc_end 2029-03-11 06:00:00 (Sun)
  63992682000, #  local_start 2028-11-05 01:00:00 (Sun)
  64003572000, #    local_end 2029-03-11 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  64003586400, #    utc_start 2029-03-11 06:00:00 (Sun)
  64024146000, #      utc_end 2029-11-04 05:00:00 (Sun)
  64003575600, #  local_start 2029-03-11 03:00:00 (Sun)
  64024135200, #    local_end 2029-11-04 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  64024146000, #    utc_start 2029-11-04 05:00:00 (Sun)
  64035036000, #      utc_end 2030-03-10 06:00:00 (Sun)
  64024131600, #  local_start 2029-11-04 01:00:00 (Sun)
  64035021600, #    local_end 2030-03-10 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  64035036000, #    utc_start 2030-03-10 06:00:00 (Sun)
  64055595600, #      utc_end 2030-11-03 05:00:00 (Sun)
  64035025200, #  local_start 2030-03-10 03:00:00 (Sun)
  64055584800, #    local_end 2030-11-03 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {96}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -14400 }
  
  my $last_observance = bless( {
    'format' => 'A%sT',
    'gmtoff' => '-4:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 732677,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 732677,
      'utc_rd_secs' => 0,
      'utc_year' => 2008
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -14400,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 732677,
      'local_rd_secs' => 14400,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 732677,
      'utc_rd_secs' => 14400,
      'utc_year' => 2008
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Mar',
      'letter' => 'D',
      'name' => 'Canada',
      'offset_from_std' => 3600,
      'on' => 'Sun>=8',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Nov',
      'letter' => 'S',
      'name' => 'Canada',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_MONCTON

    $main::fatpacked{"DateTime/TimeZone/America/Monterrey.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_MONTERREY';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Monterrey;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Monterrey::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60620940000, #      utc_end 1922-01-01 06:00:00 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60620915924, #    local_end 1921-12-31 23:18:44 (Sat)
  -24076,
  0,
  'LMT',
      ],
      [
  60620940000, #    utc_start 1922-01-01 06:00:00 (Sun)
  62703698400, #      utc_end 1988-01-01 06:00:00 (Fri)
  60620918400, #  local_start 1922-01-01 00:00:00 (Sun)
  62703676800, #    local_end 1988-01-01 00:00:00 (Fri)
  -21600,
  0,
  'CST',
      ],
      [
  62703698400, #    utc_start 1988-01-01 06:00:00 (Fri)
  62711740800, #      utc_end 1988-04-03 08:00:00 (Sun)
  62703676800, #  local_start 1988-01-01 00:00:00 (Fri)
  62711719200, #    local_end 1988-04-03 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62711740800, #    utc_start 1988-04-03 08:00:00 (Sun)
  62729881200, #      utc_end 1988-10-30 07:00:00 (Sun)
  62711722800, #  local_start 1988-04-03 03:00:00 (Sun)
  62729863200, #    local_end 1988-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62729881200, #    utc_start 1988-10-30 07:00:00 (Sun)
  62735320800, #      utc_end 1989-01-01 06:00:00 (Sun)
  62729859600, #  local_start 1988-10-30 01:00:00 (Sun)
  62735299200, #    local_end 1989-01-01 00:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62735320800, #    utc_start 1989-01-01 06:00:00 (Sun)
  62964547200, #      utc_end 1996-04-07 08:00:00 (Sun)
  62735299200, #  local_start 1989-01-01 00:00:00 (Sun)
  62964525600, #    local_end 1996-04-07 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62964547200, #    utc_start 1996-04-07 08:00:00 (Sun)
  62982082800, #      utc_end 1996-10-27 07:00:00 (Sun)
  62964529200, #  local_start 1996-04-07 03:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62982082800, #    utc_start 1996-10-27 07:00:00 (Sun)
  62995996800, #      utc_end 1997-04-06 08:00:00 (Sun)
  62982061200, #  local_start 1996-10-27 01:00:00 (Sun)
  62995975200, #    local_end 1997-04-06 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62995996800, #    utc_start 1997-04-06 08:00:00 (Sun)
  63013532400, #      utc_end 1997-10-26 07:00:00 (Sun)
  62995978800, #  local_start 1997-04-06 03:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63013532400, #    utc_start 1997-10-26 07:00:00 (Sun)
  63027446400, #      utc_end 1998-04-05 08:00:00 (Sun)
  63013510800, #  local_start 1997-10-26 01:00:00 (Sun)
  63027424800, #    local_end 1998-04-05 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63027446400, #    utc_start 1998-04-05 08:00:00 (Sun)
  63044982000, #      utc_end 1998-10-25 07:00:00 (Sun)
  63027428400, #  local_start 1998-04-05 03:00:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63044982000, #    utc_start 1998-10-25 07:00:00 (Sun)
  63058896000, #      utc_end 1999-04-04 08:00:00 (Sun)
  63044960400, #  local_start 1998-10-25 01:00:00 (Sun)
  63058874400, #    local_end 1999-04-04 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63058896000, #    utc_start 1999-04-04 08:00:00 (Sun)
  63077036400, #      utc_end 1999-10-31 07:00:00 (Sun)
  63058878000, #  local_start 1999-04-04 03:00:00 (Sun)
  63077018400, #    local_end 1999-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63077036400, #    utc_start 1999-10-31 07:00:00 (Sun)
  63090345600, #      utc_end 2000-04-02 08:00:00 (Sun)
  63077014800, #  local_start 1999-10-31 01:00:00 (Sun)
  63090324000, #    local_end 2000-04-02 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63090345600, #    utc_start 2000-04-02 08:00:00 (Sun)
  63108486000, #      utc_end 2000-10-29 07:00:00 (Sun)
  63090327600, #  local_start 2000-04-02 03:00:00 (Sun)
  63108468000, #    local_end 2000-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63108486000, #    utc_start 2000-10-29 07:00:00 (Sun)
  63124819200, #      utc_end 2001-05-06 08:00:00 (Sun)
  63108464400, #  local_start 2000-10-29 01:00:00 (Sun)
  63124797600, #    local_end 2001-05-06 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63124819200, #    utc_start 2001-05-06 08:00:00 (Sun)
  63137516400, #      utc_end 2001-09-30 07:00:00 (Sun)
  63124801200, #  local_start 2001-05-06 03:00:00 (Sun)
  63137498400, #    local_end 2001-09-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63137516400, #    utc_start 2001-09-30 07:00:00 (Sun)
  63153849600, #      utc_end 2002-04-07 08:00:00 (Sun)
  63137494800, #  local_start 2001-09-30 01:00:00 (Sun)
  63153828000, #    local_end 2002-04-07 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63153849600, #    utc_start 2002-04-07 08:00:00 (Sun)
  63171385200, #      utc_end 2002-10-27 07:00:00 (Sun)
  63153831600, #  local_start 2002-04-07 03:00:00 (Sun)
  63171367200, #    local_end 2002-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63171385200, #    utc_start 2002-10-27 07:00:00 (Sun)
  63185299200, #      utc_end 2003-04-06 08:00:00 (Sun)
  63171363600, #  local_start 2002-10-27 01:00:00 (Sun)
  63185277600, #    local_end 2003-04-06 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63185299200, #    utc_start 2003-04-06 08:00:00 (Sun)
  63202834800, #      utc_end 2003-10-26 07:00:00 (Sun)
  63185281200, #  local_start 2003-04-06 03:00:00 (Sun)
  63202816800, #    local_end 2003-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63202834800, #    utc_start 2003-10-26 07:00:00 (Sun)
  63216748800, #      utc_end 2004-04-04 08:00:00 (Sun)
  63202813200, #  local_start 2003-10-26 01:00:00 (Sun)
  63216727200, #    local_end 2004-04-04 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63216748800, #    utc_start 2004-04-04 08:00:00 (Sun)
  63234889200, #      utc_end 2004-10-31 07:00:00 (Sun)
  63216730800, #  local_start 2004-04-04 03:00:00 (Sun)
  63234871200, #    local_end 2004-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63234889200, #    utc_start 2004-10-31 07:00:00 (Sun)
  63248198400, #      utc_end 2005-04-03 08:00:00 (Sun)
  63234867600, #  local_start 2004-10-31 01:00:00 (Sun)
  63248176800, #    local_end 2005-04-03 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63248198400, #    utc_start 2005-04-03 08:00:00 (Sun)
  63266338800, #      utc_end 2005-10-30 07:00:00 (Sun)
  63248180400, #  local_start 2005-04-03 03:00:00 (Sun)
  63266320800, #    local_end 2005-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63266338800, #    utc_start 2005-10-30 07:00:00 (Sun)
  63279648000, #      utc_end 2006-04-02 08:00:00 (Sun)
  63266317200, #  local_start 2005-10-30 01:00:00 (Sun)
  63279626400, #    local_end 2006-04-02 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63279648000, #    utc_start 2006-04-02 08:00:00 (Sun)
  63297788400, #      utc_end 2006-10-29 07:00:00 (Sun)
  63279630000, #  local_start 2006-04-02 03:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63297788400, #    utc_start 2006-10-29 07:00:00 (Sun)
  63311097600, #      utc_end 2007-04-01 08:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63311076000, #    local_end 2007-04-01 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63311097600, #    utc_start 2007-04-01 08:00:00 (Sun)
  63329238000, #      utc_end 2007-10-28 07:00:00 (Sun)
  63311079600, #  local_start 2007-04-01 03:00:00 (Sun)
  63329220000, #    local_end 2007-10-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63329238000, #    utc_start 2007-10-28 07:00:00 (Sun)
  63343152000, #      utc_end 2008-04-06 08:00:00 (Sun)
  63329216400, #  local_start 2007-10-28 01:00:00 (Sun)
  63343130400, #    local_end 2008-04-06 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63343152000, #    utc_start 2008-04-06 08:00:00 (Sun)
  63360687600, #      utc_end 2008-10-26 07:00:00 (Sun)
  63343134000, #  local_start 2008-04-06 03:00:00 (Sun)
  63360669600, #    local_end 2008-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63360687600, #    utc_start 2008-10-26 07:00:00 (Sun)
  63374601600, #      utc_end 2009-04-05 08:00:00 (Sun)
  63360666000, #  local_start 2008-10-26 01:00:00 (Sun)
  63374580000, #    local_end 2009-04-05 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63374601600, #    utc_start 2009-04-05 08:00:00 (Sun)
  63392137200, #      utc_end 2009-10-25 07:00:00 (Sun)
  63374583600, #  local_start 2009-04-05 03:00:00 (Sun)
  63392119200, #    local_end 2009-10-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63392137200, #    utc_start 2009-10-25 07:00:00 (Sun)
  63406051200, #      utc_end 2010-04-04 08:00:00 (Sun)
  63392115600, #  local_start 2009-10-25 01:00:00 (Sun)
  63406029600, #    local_end 2010-04-04 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63406051200, #    utc_start 2010-04-04 08:00:00 (Sun)
  63424191600, #      utc_end 2010-10-31 07:00:00 (Sun)
  63406033200, #  local_start 2010-04-04 03:00:00 (Sun)
  63424173600, #    local_end 2010-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63424191600, #    utc_start 2010-10-31 07:00:00 (Sun)
  63437500800, #      utc_end 2011-04-03 08:00:00 (Sun)
  63424170000, #  local_start 2010-10-31 01:00:00 (Sun)
  63437479200, #    local_end 2011-04-03 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63437500800, #    utc_start 2011-04-03 08:00:00 (Sun)
  63455641200, #      utc_end 2011-10-30 07:00:00 (Sun)
  63437482800, #  local_start 2011-04-03 03:00:00 (Sun)
  63455623200, #    local_end 2011-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63455641200, #    utc_start 2011-10-30 07:00:00 (Sun)
  63468950400, #      utc_end 2012-04-01 08:00:00 (Sun)
  63455619600, #  local_start 2011-10-30 01:00:00 (Sun)
  63468928800, #    local_end 2012-04-01 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63468950400, #    utc_start 2012-04-01 08:00:00 (Sun)
  63487090800, #      utc_end 2012-10-28 07:00:00 (Sun)
  63468932400, #  local_start 2012-04-01 03:00:00 (Sun)
  63487072800, #    local_end 2012-10-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63487090800, #    utc_start 2012-10-28 07:00:00 (Sun)
  63501004800, #      utc_end 2013-04-07 08:00:00 (Sun)
  63487069200, #  local_start 2012-10-28 01:00:00 (Sun)
  63500983200, #    local_end 2013-04-07 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63501004800, #    utc_start 2013-04-07 08:00:00 (Sun)
  63518540400, #      utc_end 2013-10-27 07:00:00 (Sun)
  63500986800, #  local_start 2013-04-07 03:00:00 (Sun)
  63518522400, #    local_end 2013-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63518540400, #    utc_start 2013-10-27 07:00:00 (Sun)
  63532454400, #      utc_end 2014-04-06 08:00:00 (Sun)
  63518518800, #  local_start 2013-10-27 01:00:00 (Sun)
  63532432800, #    local_end 2014-04-06 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63532454400, #    utc_start 2014-04-06 08:00:00 (Sun)
  63549990000, #      utc_end 2014-10-26 07:00:00 (Sun)
  63532436400, #  local_start 2014-04-06 03:00:00 (Sun)
  63549972000, #    local_end 2014-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63549990000, #    utc_start 2014-10-26 07:00:00 (Sun)
  63563904000, #      utc_end 2015-04-05 08:00:00 (Sun)
  63549968400, #  local_start 2014-10-26 01:00:00 (Sun)
  63563882400, #    local_end 2015-04-05 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63563904000, #    utc_start 2015-04-05 08:00:00 (Sun)
  63581439600, #      utc_end 2015-10-25 07:00:00 (Sun)
  63563886000, #  local_start 2015-04-05 03:00:00 (Sun)
  63581421600, #    local_end 2015-10-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63581439600, #    utc_start 2015-10-25 07:00:00 (Sun)
  63595353600, #      utc_end 2016-04-03 08:00:00 (Sun)
  63581418000, #  local_start 2015-10-25 01:00:00 (Sun)
  63595332000, #    local_end 2016-04-03 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63595353600, #    utc_start 2016-04-03 08:00:00 (Sun)
  63613494000, #      utc_end 2016-10-30 07:00:00 (Sun)
  63595335600, #  local_start 2016-04-03 03:00:00 (Sun)
  63613476000, #    local_end 2016-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63613494000, #    utc_start 2016-10-30 07:00:00 (Sun)
  63626803200, #      utc_end 2017-04-02 08:00:00 (Sun)
  63613472400, #  local_start 2016-10-30 01:00:00 (Sun)
  63626781600, #    local_end 2017-04-02 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63626803200, #    utc_start 2017-04-02 08:00:00 (Sun)
  63644943600, #      utc_end 2017-10-29 07:00:00 (Sun)
  63626785200, #  local_start 2017-04-02 03:00:00 (Sun)
  63644925600, #    local_end 2017-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63644943600, #    utc_start 2017-10-29 07:00:00 (Sun)
  63658252800, #      utc_end 2018-04-01 08:00:00 (Sun)
  63644922000, #  local_start 2017-10-29 01:00:00 (Sun)
  63658231200, #    local_end 2018-04-01 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63658252800, #    utc_start 2018-04-01 08:00:00 (Sun)
  63676393200, #      utc_end 2018-10-28 07:00:00 (Sun)
  63658234800, #  local_start 2018-04-01 03:00:00 (Sun)
  63676375200, #    local_end 2018-10-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63676393200, #    utc_start 2018-10-28 07:00:00 (Sun)
  63690307200, #      utc_end 2019-04-07 08:00:00 (Sun)
  63676371600, #  local_start 2018-10-28 01:00:00 (Sun)
  63690285600, #    local_end 2019-04-07 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63690307200, #    utc_start 2019-04-07 08:00:00 (Sun)
  63707842800, #      utc_end 2019-10-27 07:00:00 (Sun)
  63690289200, #  local_start 2019-04-07 03:00:00 (Sun)
  63707824800, #    local_end 2019-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63707842800, #    utc_start 2019-10-27 07:00:00 (Sun)
  63721756800, #      utc_end 2020-04-05 08:00:00 (Sun)
  63707821200, #  local_start 2019-10-27 01:00:00 (Sun)
  63721735200, #    local_end 2020-04-05 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63721756800, #    utc_start 2020-04-05 08:00:00 (Sun)
  63739292400, #      utc_end 2020-10-25 07:00:00 (Sun)
  63721738800, #  local_start 2020-04-05 03:00:00 (Sun)
  63739274400, #    local_end 2020-10-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63739292400, #    utc_start 2020-10-25 07:00:00 (Sun)
  63753206400, #      utc_end 2021-04-04 08:00:00 (Sun)
  63739270800, #  local_start 2020-10-25 01:00:00 (Sun)
  63753184800, #    local_end 2021-04-04 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63753206400, #    utc_start 2021-04-04 08:00:00 (Sun)
  63771346800, #      utc_end 2021-10-31 07:00:00 (Sun)
  63753188400, #  local_start 2021-04-04 03:00:00 (Sun)
  63771328800, #    local_end 2021-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63771346800, #    utc_start 2021-10-31 07:00:00 (Sun)
  63784656000, #      utc_end 2022-04-03 08:00:00 (Sun)
  63771325200, #  local_start 2021-10-31 01:00:00 (Sun)
  63784634400, #    local_end 2022-04-03 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63784656000, #    utc_start 2022-04-03 08:00:00 (Sun)
  63802796400, #      utc_end 2022-10-30 07:00:00 (Sun)
  63784638000, #  local_start 2022-04-03 03:00:00 (Sun)
  63802778400, #    local_end 2022-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63802796400, #    utc_start 2022-10-30 07:00:00 (Sun)
  63816105600, #      utc_end 2023-04-02 08:00:00 (Sun)
  63802774800, #  local_start 2022-10-30 01:00:00 (Sun)
  63816084000, #    local_end 2023-04-02 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63816105600, #    utc_start 2023-04-02 08:00:00 (Sun)
  63834246000, #      utc_end 2023-10-29 07:00:00 (Sun)
  63816087600, #  local_start 2023-04-02 03:00:00 (Sun)
  63834228000, #    local_end 2023-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63834246000, #    utc_start 2023-10-29 07:00:00 (Sun)
  63848160000, #      utc_end 2024-04-07 08:00:00 (Sun)
  63834224400, #  local_start 2023-10-29 01:00:00 (Sun)
  63848138400, #    local_end 2024-04-07 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63848160000, #    utc_start 2024-04-07 08:00:00 (Sun)
  63865695600, #      utc_end 2024-10-27 07:00:00 (Sun)
  63848142000, #  local_start 2024-04-07 03:00:00 (Sun)
  63865677600, #    local_end 2024-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63865695600, #    utc_start 2024-10-27 07:00:00 (Sun)
  63879609600, #      utc_end 2025-04-06 08:00:00 (Sun)
  63865674000, #  local_start 2024-10-27 01:00:00 (Sun)
  63879588000, #    local_end 2025-04-06 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63879609600, #    utc_start 2025-04-06 08:00:00 (Sun)
  63897145200, #      utc_end 2025-10-26 07:00:00 (Sun)
  63879591600, #  local_start 2025-04-06 03:00:00 (Sun)
  63897127200, #    local_end 2025-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63897145200, #    utc_start 2025-10-26 07:00:00 (Sun)
  63911059200, #      utc_end 2026-04-05 08:00:00 (Sun)
  63897123600, #  local_start 2025-10-26 01:00:00 (Sun)
  63911037600, #    local_end 2026-04-05 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63911059200, #    utc_start 2026-04-05 08:00:00 (Sun)
  63928594800, #      utc_end 2026-10-25 07:00:00 (Sun)
  63911041200, #  local_start 2026-04-05 03:00:00 (Sun)
  63928576800, #    local_end 2026-10-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63928594800, #    utc_start 2026-10-25 07:00:00 (Sun)
  63942508800, #      utc_end 2027-04-04 08:00:00 (Sun)
  63928573200, #  local_start 2026-10-25 01:00:00 (Sun)
  63942487200, #    local_end 2027-04-04 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63942508800, #    utc_start 2027-04-04 08:00:00 (Sun)
  63960649200, #      utc_end 2027-10-31 07:00:00 (Sun)
  63942490800, #  local_start 2027-04-04 03:00:00 (Sun)
  63960631200, #    local_end 2027-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63960649200, #    utc_start 2027-10-31 07:00:00 (Sun)
  63973958400, #      utc_end 2028-04-02 08:00:00 (Sun)
  63960627600, #  local_start 2027-10-31 01:00:00 (Sun)
  63973936800, #    local_end 2028-04-02 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63973958400, #    utc_start 2028-04-02 08:00:00 (Sun)
  63992098800, #      utc_end 2028-10-29 07:00:00 (Sun)
  63973940400, #  local_start 2028-04-02 03:00:00 (Sun)
  63992080800, #    local_end 2028-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63992098800, #    utc_start 2028-10-29 07:00:00 (Sun)
  64005408000, #      utc_end 2029-04-01 08:00:00 (Sun)
  63992077200, #  local_start 2028-10-29 01:00:00 (Sun)
  64005386400, #    local_end 2029-04-01 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  64005408000, #    utc_start 2029-04-01 08:00:00 (Sun)
  64023548400, #      utc_end 2029-10-28 07:00:00 (Sun)
  64005390000, #  local_start 2029-04-01 03:00:00 (Sun)
  64023530400, #    local_end 2029-10-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  64023548400, #    utc_start 2029-10-28 07:00:00 (Sun)
  64037462400, #      utc_end 2030-04-07 08:00:00 (Sun)
  64023526800, #  local_start 2029-10-28 01:00:00 (Sun)
  64037440800, #    local_end 2030-04-07 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  64037462400, #    utc_start 2030-04-07 08:00:00 (Sun)
  64054998000, #      utc_end 2030-10-27 07:00:00 (Sun)
  64037444400, #  local_start 2030-04-07 03:00:00 (Sun)
  64054980000, #    local_end 2030-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {36}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -21600 }
  
  my $last_observance = bless( {
    'format' => 'C%sT',
    'gmtoff' => '-6:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 726103,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 726103,
      'utc_rd_secs' => 0,
      'utc_year' => 1990
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -21600,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 726103,
      'local_rd_secs' => 21600,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 726103,
      'utc_rd_secs' => 21600,
      'utc_year' => 1990
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2002',
      'in' => 'Oct',
      'letter' => 'S',
      'name' => 'Mexico',
      'offset_from_std' => 0,
      'on' => 'lastSun',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2002',
      'in' => 'Apr',
      'letter' => 'D',
      'name' => 'Mexico',
      'offset_from_std' => 3600,
      'on' => 'Sun>=1',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_MONTERREY

    $main::fatpacked{"DateTime/TimeZone/America/Montevideo.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_MONTEVIDEO';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/southamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Montevideo;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Montevideo::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60192992691, #      utc_end 1908-06-10 03:44:51 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60192979200, #    local_end 1908-06-10 00:00:00 (Wed)
  -13491,
  0,
  'LMT',
      ],
      [
  60192992691, #    utc_start 1908-06-10 03:44:51 (Wed)
  60568227891, #      utc_end 1920-05-01 03:44:51 (Sat)
  60192979200, #  local_start 1908-06-10 00:00:00 (Wed)
  60568214400, #    local_end 1920-05-01 00:00:00 (Sat)
  -13491,
  0,
  'MMT',
      ],
      [
  60568227891, #    utc_start 1920-05-01 03:44:51 (Sat)
  60676056000, #      utc_end 1923-10-01 04:00:00 (Mon)
  60568213491, #  local_start 1920-04-30 23:44:51 (Fri)
  60676041600, #    local_end 1923-10-01 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  60676056000, #    utc_start 1923-10-01 04:00:00 (Mon)
  60691863600, #      utc_end 1924-04-01 03:00:00 (Tue)
  60676045200, #  local_start 1923-10-01 01:00:00 (Mon)
  60691852800, #    local_end 1924-04-01 00:00:00 (Tue)
  -10800,
  1,
  '-03',
      ],
      [
  60691863600, #    utc_start 1924-04-01 03:00:00 (Tue)
  60707676600, #      utc_end 1924-10-01 03:30:00 (Wed)
  60691851000, #  local_start 1924-03-31 23:30:00 (Mon)
  60707664000, #    local_end 1924-10-01 00:00:00 (Wed)
  -12600,
  0,
  '-0330',
      ],
      [
  60707676600, #    utc_start 1924-10-01 03:30:00 (Wed)
  60723399600, #      utc_end 1925-04-01 03:00:00 (Wed)
  60707665800, #  local_start 1924-10-01 00:30:00 (Wed)
  60723388800, #    local_end 1925-04-01 00:00:00 (Wed)
  -10800,
  1,
  '-03',
      ],
      [
  60723399600, #    utc_start 1925-04-01 03:00:00 (Wed)
  60739212600, #      utc_end 1925-10-01 03:30:00 (Thu)
  60723387000, #  local_start 1925-03-31 23:30:00 (Tue)
  60739200000, #    local_end 1925-10-01 00:00:00 (Thu)
  -12600,
  0,
  '-0330',
      ],
      [
  60739212600, #    utc_start 1925-10-01 03:30:00 (Thu)
  60754935600, #      utc_end 1926-04-01 03:00:00 (Thu)
  60739201800, #  local_start 1925-10-01 00:30:00 (Thu)
  60754924800, #    local_end 1926-04-01 00:00:00 (Thu)
  -10800,
  1,
  '-03',
      ],
      [
  60754935600, #    utc_start 1926-04-01 03:00:00 (Thu)
  60994092600, #      utc_end 1933-10-29 03:30:00 (Sun)
  60754923000, #  local_start 1926-03-31 23:30:00 (Wed)
  60994080000, #    local_end 1933-10-29 00:00:00 (Sun)
  -12600,
  0,
  '-0330',
      ],
      [
  60994092600, #    utc_start 1933-10-29 03:30:00 (Sun)
  61007396400, #      utc_end 1934-04-01 03:00:00 (Sun)
  60994081800, #  local_start 1933-10-29 00:30:00 (Sun)
  61007385600, #    local_end 1934-04-01 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61007396400, #    utc_start 1934-04-01 03:00:00 (Sun)
  61025542200, #      utc_end 1934-10-28 03:30:00 (Sun)
  61007383800, #  local_start 1934-03-31 23:30:00 (Sat)
  61025529600, #    local_end 1934-10-28 00:00:00 (Sun)
  -12600,
  0,
  '-0330',
      ],
      [
  61025542200, #    utc_start 1934-10-28 03:30:00 (Sun)
  61038846000, #      utc_end 1935-03-31 03:00:00 (Sun)
  61025531400, #  local_start 1934-10-28 00:30:00 (Sun)
  61038835200, #    local_end 1935-03-31 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61038846000, #    utc_start 1935-03-31 03:00:00 (Sun)
  61056991800, #      utc_end 1935-10-27 03:30:00 (Sun)
  61038833400, #  local_start 1935-03-30 23:30:00 (Sat)
  61056979200, #    local_end 1935-10-27 00:00:00 (Sun)
  -12600,
  0,
  '-0330',
      ],
      [
  61056991800, #    utc_start 1935-10-27 03:30:00 (Sun)
  61070295600, #      utc_end 1936-03-29 03:00:00 (Sun)
  61056981000, #  local_start 1935-10-27 00:30:00 (Sun)
  61070284800, #    local_end 1936-03-29 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61070295600, #    utc_start 1936-03-29 03:00:00 (Sun)
  61088441400, #      utc_end 1936-10-25 03:30:00 (Sun)
  61070283000, #  local_start 1936-03-28 23:30:00 (Sat)
  61088428800, #    local_end 1936-10-25 00:00:00 (Sun)
  -12600,
  0,
  '-0330',
      ],
      [
  61088441400, #    utc_start 1936-10-25 03:30:00 (Sun)
  61101745200, #      utc_end 1937-03-28 03:00:00 (Sun)
  61088430600, #  local_start 1936-10-25 00:30:00 (Sun)
  61101734400, #    local_end 1937-03-28 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61101745200, #    utc_start 1937-03-28 03:00:00 (Sun)
  61120495800, #      utc_end 1937-10-31 03:30:00 (Sun)
  61101732600, #  local_start 1937-03-27 23:30:00 (Sat)
  61120483200, #    local_end 1937-10-31 00:00:00 (Sun)
  -12600,
  0,
  '-0330',
      ],
      [
  61120495800, #    utc_start 1937-10-31 03:30:00 (Sun)
  61133194800, #      utc_end 1938-03-27 03:00:00 (Sun)
  61120485000, #  local_start 1937-10-31 00:30:00 (Sun)
  61133184000, #    local_end 1938-03-27 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61133194800, #    utc_start 1938-03-27 03:00:00 (Sun)
  61151945400, #      utc_end 1938-10-30 03:30:00 (Sun)
  61133182200, #  local_start 1938-03-26 23:30:00 (Sat)
  61151932800, #    local_end 1938-10-30 00:00:00 (Sun)
  -12600,
  0,
  '-0330',
      ],
      [
  61151945400, #    utc_start 1938-10-30 03:30:00 (Sun)
  61164644400, #      utc_end 1939-03-26 03:00:00 (Sun)
  61151934600, #  local_start 1938-10-30 00:30:00 (Sun)
  61164633600, #    local_end 1939-03-26 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61164644400, #    utc_start 1939-03-26 03:00:00 (Sun)
  61180975800, #      utc_end 1939-10-01 03:30:00 (Sun)
  61164631800, #  local_start 1939-03-25 23:30:00 (Sat)
  61180963200, #    local_end 1939-10-01 00:00:00 (Sun)
  -12600,
  0,
  '-0330',
      ],
      [
  61180975800, #    utc_start 1939-10-01 03:30:00 (Sun)
  61196698800, #      utc_end 1940-03-31 03:00:00 (Sun)
  61180965000, #  local_start 1939-10-01 00:30:00 (Sun)
  61196688000, #    local_end 1940-03-31 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61196698800, #    utc_start 1940-03-31 03:00:00 (Sun)
  61214844600, #      utc_end 1940-10-27 03:30:00 (Sun)
  61196686200, #  local_start 1940-03-30 23:30:00 (Sat)
  61214832000, #    local_end 1940-10-27 00:00:00 (Sun)
  -12600,
  0,
  '-0330',
      ],
      [
  61214844600, #    utc_start 1940-10-27 03:30:00 (Sun)
  61228148400, #      utc_end 1941-03-30 03:00:00 (Sun)
  61214833800, #  local_start 1940-10-27 00:30:00 (Sun)
  61228137600, #    local_end 1941-03-30 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61228148400, #    utc_start 1941-03-30 03:00:00 (Sun)
  61238863800, #      utc_end 1941-08-01 03:30:00 (Fri)
  61228135800, #  local_start 1941-03-29 23:30:00 (Sat)
  61238851200, #    local_end 1941-08-01 00:00:00 (Fri)
  -12600,
  0,
  '-0330',
      ],
      [
  61238863800, #    utc_start 1941-08-01 03:30:00 (Fri)
  61282062000, #      utc_end 1942-12-14 03:00:00 (Mon)
  61238853000, #  local_start 1941-08-01 00:30:00 (Fri)
  61282051200, #    local_end 1942-12-14 00:00:00 (Mon)
  -10800,
  1,
  '-03',
      ],
      [
  61282062000, #    utc_start 1942-12-14 03:00:00 (Mon)
  61289836200, #      utc_end 1943-03-14 02:30:00 (Sun)
  61282053000, #  local_start 1942-12-14 00:30:00 (Mon)
  61289827200, #    local_end 1943-03-14 00:00:00 (Sun)
  -9000,
  1,
  '-0230',
      ],
      [
  61289836200, #    utc_start 1943-03-14 02:30:00 (Sun)
  61800894000, #      utc_end 1959-05-24 03:00:00 (Sun)
  61289825400, #  local_start 1943-03-13 23:30:00 (Sat)
  61800883200, #    local_end 1959-05-24 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  61800894000, #    utc_start 1959-05-24 03:00:00 (Sun)
  61816012200, #      utc_end 1959-11-15 02:30:00 (Sun)
  61800885000, #  local_start 1959-05-24 00:30:00 (Sun)
  61816003200, #    local_end 1959-11-15 00:00:00 (Sun)
  -9000,
  1,
  '-0230',
      ],
      [
  61816012200, #    utc_start 1959-11-15 02:30:00 (Sun)
  61820074800, #      utc_end 1960-01-01 03:00:00 (Fri)
  61816001400, #  local_start 1959-11-14 23:30:00 (Sat)
  61820064000, #    local_end 1960-01-01 00:00:00 (Fri)
  -10800,
  0,
  '-03',
      ],
      [
  61820074800, #    utc_start 1960-01-01 03:00:00 (Fri)
  61821457200, #      utc_end 1960-01-17 03:00:00 (Sun)
  61820064000, #  local_start 1960-01-01 00:00:00 (Fri)
  61821446400, #    local_end 1960-01-17 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  61821457200, #    utc_start 1960-01-17 03:00:00 (Sun)
  61825687200, #      utc_end 1960-03-06 02:00:00 (Sun)
  61821450000, #  local_start 1960-01-17 01:00:00 (Sun)
  61825680000, #    local_end 1960-03-06 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  61825687200, #    utc_start 1960-03-06 02:00:00 (Sun)
  61985962800, #      utc_end 1965-04-04 03:00:00 (Sun)
  61825676400, #  local_start 1960-03-05 23:00:00 (Sat)
  61985952000, #    local_end 1965-04-04 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  61985962800, #    utc_start 1965-04-04 03:00:00 (Sun)
  62001079200, #      utc_end 1965-09-26 02:00:00 (Sun)
  61985955600, #  local_start 1965-04-04 01:00:00 (Sun)
  62001072000, #    local_end 1965-09-26 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62001079200, #    utc_start 1965-09-26 02:00:00 (Sun)
  62072535600, #      utc_end 1968-01-01 03:00:00 (Mon)
  62001068400, #  local_start 1965-09-25 23:00:00 (Sat)
  62072524800, #    local_end 1968-01-01 00:00:00 (Mon)
  -10800,
  0,
  '-03',
      ],
      [
  62072535600, #    utc_start 1968-01-01 03:00:00 (Mon)
  62085236400, #      utc_end 1968-05-27 03:00:00 (Mon)
  62072524800, #  local_start 1968-01-01 00:00:00 (Mon)
  62085225600, #    local_end 1968-05-27 00:00:00 (Mon)
  -10800,
  0,
  '-03',
      ],
      [
  62085236400, #    utc_start 1968-05-27 03:00:00 (Mon)
  62101477800, #      utc_end 1968-12-01 02:30:00 (Sun)
  62085227400, #  local_start 1968-05-27 00:30:00 (Mon)
  62101468800, #    local_end 1968-12-01 00:00:00 (Sun)
  -9000,
  1,
  '-0230',
      ],
      [
  62101477800, #    utc_start 1968-12-01 02:30:00 (Sun)
  62135694000, #      utc_end 1970-01-01 03:00:00 (Thu)
  62101467000, #  local_start 1968-11-30 23:30:00 (Sat)
  62135683200, #    local_end 1970-01-01 00:00:00 (Thu)
  -10800,
  0,
  '-03',
      ],
      [
  62135694000, #    utc_start 1970-01-01 03:00:00 (Thu)
  62145543600, #      utc_end 1970-04-25 03:00:00 (Sat)
  62135683200, #  local_start 1970-01-01 00:00:00 (Thu)
  62145532800, #    local_end 1970-04-25 00:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  62145543600, #    utc_start 1970-04-25 03:00:00 (Sat)
  62149860000, #      utc_end 1970-06-14 02:00:00 (Sun)
  62145536400, #  local_start 1970-04-25 01:00:00 (Sat)
  62149852800, #    local_end 1970-06-14 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62149860000, #    utc_start 1970-06-14 02:00:00 (Sun)
  62208529200, #      utc_end 1972-04-23 03:00:00 (Sun)
  62149849200, #  local_start 1970-06-13 23:00:00 (Sat)
  62208518400, #    local_end 1972-04-23 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62208529200, #    utc_start 1972-04-23 03:00:00 (Sun)
  62215783200, #      utc_end 1972-07-16 02:00:00 (Sun)
  62208522000, #  local_start 1972-04-23 01:00:00 (Sun)
  62215776000, #    local_end 1972-07-16 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62215783200, #    utc_start 1972-07-16 02:00:00 (Sun)
  62261924400, #      utc_end 1974-01-01 03:00:00 (Tue)
  62215772400, #  local_start 1972-07-15 23:00:00 (Sat)
  62261913600, #    local_end 1974-01-01 00:00:00 (Tue)
  -10800,
  0,
  '-03',
      ],
      [
  62261924400, #    utc_start 1974-01-01 03:00:00 (Tue)
  62262961200, #      utc_end 1974-01-13 03:00:00 (Sun)
  62261913600, #  local_start 1974-01-01 00:00:00 (Tue)
  62262950400, #    local_end 1974-01-13 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62262961200, #    utc_start 1974-01-13 03:00:00 (Sun)
  62267794200, #      utc_end 1974-03-10 01:30:00 (Sun)
  62262955800, #  local_start 1974-01-13 01:30:00 (Sun)
  62267788800, #    local_end 1974-03-10 00:00:00 (Sun)
  -5400,
  1,
  '-0130',
      ],
      [
  62267794200, #    utc_start 1974-03-10 01:30:00 (Sun)
  62282917800, #      utc_end 1974-09-01 02:30:00 (Sun)
  62267785200, #  local_start 1974-03-09 23:00:00 (Sat)
  62282908800, #    local_end 1974-09-01 00:00:00 (Sun)
  -9000,
  1,
  '-0230',
      ],
      [
  62282917800, #    utc_start 1974-09-01 02:30:00 (Sun)
  62292596400, #      utc_end 1974-12-22 03:00:00 (Sun)
  62282907000, #  local_start 1974-08-31 23:30:00 (Sat)
  62292585600, #    local_end 1974-12-22 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62292596400, #    utc_start 1974-12-22 03:00:00 (Sun)
  62301060000, #      utc_end 1975-03-30 02:00:00 (Sun)
  62292589200, #  local_start 1974-12-22 01:00:00 (Sun)
  62301052800, #    local_end 1975-03-30 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62301060000, #    utc_start 1975-03-30 02:00:00 (Sun)
  62355495600, #      utc_end 1976-12-19 03:00:00 (Sun)
  62301049200, #  local_start 1975-03-29 23:00:00 (Sat)
  62355484800, #    local_end 1976-12-19 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62355495600, #    utc_start 1976-12-19 03:00:00 (Sun)
  62362144800, #      utc_end 1977-03-06 02:00:00 (Sun)
  62355488400, #  local_start 1976-12-19 01:00:00 (Sun)
  62362137600, #    local_end 1977-03-06 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62362144800, #    utc_start 1977-03-06 02:00:00 (Sun)
  62385735600, #      utc_end 1977-12-04 03:00:00 (Sun)
  62362134000, #  local_start 1977-03-05 23:00:00 (Sat)
  62385724800, #    local_end 1977-12-04 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62385735600, #    utc_start 1977-12-04 03:00:00 (Sun)
  62393594400, #      utc_end 1978-03-05 02:00:00 (Sun)
  62385728400, #  local_start 1977-12-04 01:00:00 (Sun)
  62393587200, #    local_end 1978-03-05 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62393594400, #    utc_start 1978-03-05 02:00:00 (Sun)
  62418394800, #      utc_end 1978-12-17 03:00:00 (Sun)
  62393583600, #  local_start 1978-03-04 23:00:00 (Sat)
  62418384000, #    local_end 1978-12-17 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62418394800, #    utc_start 1978-12-17 03:00:00 (Sun)
  62425044000, #      utc_end 1979-03-04 02:00:00 (Sun)
  62418387600, #  local_start 1978-12-17 01:00:00 (Sun)
  62425036800, #    local_end 1979-03-04 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62425044000, #    utc_start 1979-03-04 02:00:00 (Sun)
  62429886000, #      utc_end 1979-04-29 03:00:00 (Sun)
  62425033200, #  local_start 1979-03-03 23:00:00 (Sat)
  62429875200, #    local_end 1979-04-29 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62429886000, #    utc_start 1979-04-29 03:00:00 (Sun)
  62457703200, #      utc_end 1980-03-16 02:00:00 (Sun)
  62429878800, #  local_start 1979-04-29 01:00:00 (Sun)
  62457696000, #    local_end 1980-03-16 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62457703200, #    utc_start 1980-03-16 02:00:00 (Sun)
  62702132400, #      utc_end 1987-12-14 03:00:00 (Mon)
  62457692400, #  local_start 1980-03-15 23:00:00 (Sat)
  62702121600, #    local_end 1987-12-14 00:00:00 (Mon)
  -10800,
  0,
  '-03',
      ],
      [
  62702132400, #    utc_start 1987-12-14 03:00:00 (Mon)
  62708695200, #      utc_end 1988-02-28 02:00:00 (Sun)
  62702125200, #  local_start 1987-12-14 01:00:00 (Mon)
  62708688000, #    local_end 1988-02-28 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62708695200, #    utc_start 1988-02-28 02:00:00 (Sun)
  62733495600, #      utc_end 1988-12-11 03:00:00 (Sun)
  62708684400, #  local_start 1988-02-27 23:00:00 (Sat)
  62733484800, #    local_end 1988-12-11 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62733495600, #    utc_start 1988-12-11 03:00:00 (Sun)
  62740749600, #      utc_end 1989-03-05 02:00:00 (Sun)
  62733488400, #  local_start 1988-12-11 01:00:00 (Sun)
  62740742400, #    local_end 1989-03-05 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62740749600, #    utc_start 1989-03-05 02:00:00 (Sun)
  62761316400, #      utc_end 1989-10-29 03:00:00 (Sun)
  62740738800, #  local_start 1989-03-04 23:00:00 (Sat)
  62761305600, #    local_end 1989-10-29 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62761316400, #    utc_start 1989-10-29 03:00:00 (Sun)
  62771594400, #      utc_end 1990-02-25 02:00:00 (Sun)
  62761309200, #  local_start 1989-10-29 01:00:00 (Sun)
  62771587200, #    local_end 1990-02-25 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62771594400, #    utc_start 1990-02-25 02:00:00 (Sun)
  62792161200, #      utc_end 1990-10-21 03:00:00 (Sun)
  62771583600, #  local_start 1990-02-24 23:00:00 (Sat)
  62792150400, #    local_end 1990-10-21 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62792161200, #    utc_start 1990-10-21 03:00:00 (Sun)
  62803648800, #      utc_end 1991-03-03 02:00:00 (Sun)
  62792154000, #  local_start 1990-10-21 01:00:00 (Sun)
  62803641600, #    local_end 1991-03-03 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62803648800, #    utc_start 1991-03-03 02:00:00 (Sun)
  62824215600, #      utc_end 1991-10-27 03:00:00 (Sun)
  62803638000, #  local_start 1991-03-02 23:00:00 (Sat)
  62824204800, #    local_end 1991-10-27 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62824215600, #    utc_start 1991-10-27 03:00:00 (Sun)
  62835098400, #      utc_end 1992-03-01 02:00:00 (Sun)
  62824208400, #  local_start 1991-10-27 01:00:00 (Sun)
  62835091200, #    local_end 1992-03-01 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62835098400, #    utc_start 1992-03-01 02:00:00 (Sun)
  62855060400, #      utc_end 1992-10-18 03:00:00 (Sun)
  62835087600, #  local_start 1992-02-29 23:00:00 (Sat)
  62855049600, #    local_end 1992-10-18 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62855060400, #    utc_start 1992-10-18 03:00:00 (Sun)
  62866548000, #      utc_end 1993-02-28 02:00:00 (Sun)
  62855053200, #  local_start 1992-10-18 01:00:00 (Sun)
  62866540800, #    local_end 1993-02-28 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62866548000, #    utc_start 1993-02-28 02:00:00 (Sun)
  63231246000, #      utc_end 2004-09-19 03:00:00 (Sun)
  62866537200, #  local_start 1993-02-27 23:00:00 (Sat)
  63231235200, #    local_end 2004-09-19 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63231246000, #    utc_start 2004-09-19 03:00:00 (Sun)
  63247579200, #      utc_end 2005-03-27 04:00:00 (Sun)
  63231238800, #  local_start 2004-09-19 01:00:00 (Sun)
  63247572000, #    local_end 2005-03-27 02:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63247579200, #    utc_start 2005-03-27 04:00:00 (Sun)
  63264517200, #      utc_end 2005-10-09 05:00:00 (Sun)
  63247568400, #  local_start 2005-03-27 01:00:00 (Sun)
  63264506400, #    local_end 2005-10-09 02:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63264517200, #    utc_start 2005-10-09 05:00:00 (Sun)
  63277819200, #      utc_end 2006-03-12 04:00:00 (Sun)
  63264510000, #  local_start 2005-10-09 03:00:00 (Sun)
  63277812000, #    local_end 2006-03-12 02:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63277819200, #    utc_start 2006-03-12 04:00:00 (Sun)
  63295362000, #      utc_end 2006-10-01 05:00:00 (Sun)
  63277808400, #  local_start 2006-03-12 01:00:00 (Sun)
  63295351200, #    local_end 2006-10-01 02:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63295362000, #    utc_start 2006-10-01 05:00:00 (Sun)
  63309268800, #      utc_end 2007-03-11 04:00:00 (Sun)
  63295354800, #  local_start 2006-10-01 03:00:00 (Sun)
  63309261600, #    local_end 2007-03-11 02:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63309268800, #    utc_start 2007-03-11 04:00:00 (Sun)
  63327416400, #      utc_end 2007-10-07 05:00:00 (Sun)
  63309258000, #  local_start 2007-03-11 01:00:00 (Sun)
  63327405600, #    local_end 2007-10-07 02:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63327416400, #    utc_start 2007-10-07 05:00:00 (Sun)
  63340718400, #      utc_end 2008-03-09 04:00:00 (Sun)
  63327409200, #  local_start 2007-10-07 03:00:00 (Sun)
  63340711200, #    local_end 2008-03-09 02:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63340718400, #    utc_start 2008-03-09 04:00:00 (Sun)
  63358866000, #      utc_end 2008-10-05 05:00:00 (Sun)
  63340707600, #  local_start 2008-03-09 01:00:00 (Sun)
  63358855200, #    local_end 2008-10-05 02:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63358866000, #    utc_start 2008-10-05 05:00:00 (Sun)
  63372168000, #      utc_end 2009-03-08 04:00:00 (Sun)
  63358858800, #  local_start 2008-10-05 03:00:00 (Sun)
  63372160800, #    local_end 2009-03-08 02:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63372168000, #    utc_start 2009-03-08 04:00:00 (Sun)
  63390315600, #      utc_end 2009-10-04 05:00:00 (Sun)
  63372157200, #  local_start 2009-03-08 01:00:00 (Sun)
  63390304800, #    local_end 2009-10-04 02:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63390315600, #    utc_start 2009-10-04 05:00:00 (Sun)
  63404222400, #      utc_end 2010-03-14 04:00:00 (Sun)
  63390308400, #  local_start 2009-10-04 03:00:00 (Sun)
  63404215200, #    local_end 2010-03-14 02:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63404222400, #    utc_start 2010-03-14 04:00:00 (Sun)
  63421765200, #      utc_end 2010-10-03 05:00:00 (Sun)
  63404211600, #  local_start 2010-03-14 01:00:00 (Sun)
  63421754400, #    local_end 2010-10-03 02:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63421765200, #    utc_start 2010-10-03 05:00:00 (Sun)
  63435672000, #      utc_end 2011-03-13 04:00:00 (Sun)
  63421758000, #  local_start 2010-10-03 03:00:00 (Sun)
  63435664800, #    local_end 2011-03-13 02:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63435672000, #    utc_start 2011-03-13 04:00:00 (Sun)
  63453214800, #      utc_end 2011-10-02 05:00:00 (Sun)
  63435661200, #  local_start 2011-03-13 01:00:00 (Sun)
  63453204000, #    local_end 2011-10-02 02:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63453214800, #    utc_start 2011-10-02 05:00:00 (Sun)
  63467121600, #      utc_end 2012-03-11 04:00:00 (Sun)
  63453207600, #  local_start 2011-10-02 03:00:00 (Sun)
  63467114400, #    local_end 2012-03-11 02:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63467121600, #    utc_start 2012-03-11 04:00:00 (Sun)
  63485269200, #      utc_end 2012-10-07 05:00:00 (Sun)
  63467110800, #  local_start 2012-03-11 01:00:00 (Sun)
  63485258400, #    local_end 2012-10-07 02:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63485269200, #    utc_start 2012-10-07 05:00:00 (Sun)
  63498571200, #      utc_end 2013-03-10 04:00:00 (Sun)
  63485262000, #  local_start 2012-10-07 03:00:00 (Sun)
  63498564000, #    local_end 2013-03-10 02:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63498571200, #    utc_start 2013-03-10 04:00:00 (Sun)
  63516718800, #      utc_end 2013-10-06 05:00:00 (Sun)
  63498560400, #  local_start 2013-03-10 01:00:00 (Sun)
  63516708000, #    local_end 2013-10-06 02:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63516718800, #    utc_start 2013-10-06 05:00:00 (Sun)
  63530020800, #      utc_end 2014-03-09 04:00:00 (Sun)
  63516711600, #  local_start 2013-10-06 03:00:00 (Sun)
  63530013600, #    local_end 2014-03-09 02:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63530020800, #    utc_start 2014-03-09 04:00:00 (Sun)
  63548168400, #      utc_end 2014-10-05 05:00:00 (Sun)
  63530010000, #  local_start 2014-03-09 01:00:00 (Sun)
  63548157600, #    local_end 2014-10-05 02:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63548168400, #    utc_start 2014-10-05 05:00:00 (Sun)
  63561470400, #      utc_end 2015-03-08 04:00:00 (Sun)
  63548161200, #  local_start 2014-10-05 03:00:00 (Sun)
  63561463200, #    local_end 2015-03-08 02:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63561470400, #    utc_start 2015-03-08 04:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #      utc_end
  63561459600, #  local_start 2015-03-08 01:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  -10800,
  0,
  '-03',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {43}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_MONTEVIDEO

    $main::fatpacked{"DateTime/TimeZone/America/Nassau.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_NASSAU';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Nassau;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Nassau::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60310588170, #      utc_end 1912-03-02 05:09:30 (Sat)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60310569600, #    local_end 1912-03-02 00:00:00 (Sat)
  -18570,
  0,
  'LMT',
      ],
      [
  60310588170, #    utc_start 1912-03-02 05:09:30 (Sat)
  61956342000, #      utc_end 1964-04-26 07:00:00 (Sun)
  60310570170, #  local_start 1912-03-02 00:09:30 (Sat)
  61956324000, #    local_end 1964-04-26 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  61956342000, #    utc_start 1964-04-26 07:00:00 (Sun)
  61972063200, #      utc_end 1964-10-25 06:00:00 (Sun)
  61956327600, #  local_start 1964-04-26 03:00:00 (Sun)
  61972048800, #    local_end 1964-10-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  61972063200, #    utc_start 1964-10-25 06:00:00 (Sun)
  61987791600, #      utc_end 1965-04-25 07:00:00 (Sun)
  61972045200, #  local_start 1964-10-25 01:00:00 (Sun)
  61987773600, #    local_end 1965-04-25 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  61987791600, #    utc_start 1965-04-25 07:00:00 (Sun)
  62004117600, #      utc_end 1965-10-31 06:00:00 (Sun)
  61987777200, #  local_start 1965-04-25 03:00:00 (Sun)
  62004103200, #    local_end 1965-10-31 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62004117600, #    utc_start 1965-10-31 06:00:00 (Sun)
  62019241200, #      utc_end 1966-04-24 07:00:00 (Sun)
  62004099600, #  local_start 1965-10-31 01:00:00 (Sun)
  62019223200, #    local_end 1966-04-24 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62019241200, #    utc_start 1966-04-24 07:00:00 (Sun)
  62035567200, #      utc_end 1966-10-30 06:00:00 (Sun)
  62019226800, #  local_start 1966-04-24 03:00:00 (Sun)
  62035552800, #    local_end 1966-10-30 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62035567200, #    utc_start 1966-10-30 06:00:00 (Sun)
  62051295600, #      utc_end 1967-04-30 07:00:00 (Sun)
  62035549200, #  local_start 1966-10-30 01:00:00 (Sun)
  62051277600, #    local_end 1967-04-30 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62051295600, #    utc_start 1967-04-30 07:00:00 (Sun)
  62067016800, #      utc_end 1967-10-29 06:00:00 (Sun)
  62051281200, #  local_start 1967-04-30 03:00:00 (Sun)
  62067002400, #    local_end 1967-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62067016800, #    utc_start 1967-10-29 06:00:00 (Sun)
  62082745200, #      utc_end 1968-04-28 07:00:00 (Sun)
  62066998800, #  local_start 1967-10-29 01:00:00 (Sun)
  62082727200, #    local_end 1968-04-28 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62082745200, #    utc_start 1968-04-28 07:00:00 (Sun)
  62098466400, #      utc_end 1968-10-27 06:00:00 (Sun)
  62082730800, #  local_start 1968-04-28 03:00:00 (Sun)
  62098452000, #    local_end 1968-10-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62098466400, #    utc_start 1968-10-27 06:00:00 (Sun)
  62114194800, #      utc_end 1969-04-27 07:00:00 (Sun)
  62098448400, #  local_start 1968-10-27 01:00:00 (Sun)
  62114176800, #    local_end 1969-04-27 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62114194800, #    utc_start 1969-04-27 07:00:00 (Sun)
  62129916000, #      utc_end 1969-10-26 06:00:00 (Sun)
  62114180400, #  local_start 1969-04-27 03:00:00 (Sun)
  62129901600, #    local_end 1969-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62129916000, #    utc_start 1969-10-26 06:00:00 (Sun)
  62145644400, #      utc_end 1970-04-26 07:00:00 (Sun)
  62129898000, #  local_start 1969-10-26 01:00:00 (Sun)
  62145626400, #    local_end 1970-04-26 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62145644400, #    utc_start 1970-04-26 07:00:00 (Sun)
  62161365600, #      utc_end 1970-10-25 06:00:00 (Sun)
  62145630000, #  local_start 1970-04-26 03:00:00 (Sun)
  62161351200, #    local_end 1970-10-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62161365600, #    utc_start 1970-10-25 06:00:00 (Sun)
  62177094000, #      utc_end 1971-04-25 07:00:00 (Sun)
  62161347600, #  local_start 1970-10-25 01:00:00 (Sun)
  62177076000, #    local_end 1971-04-25 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62177094000, #    utc_start 1971-04-25 07:00:00 (Sun)
  62193420000, #      utc_end 1971-10-31 06:00:00 (Sun)
  62177079600, #  local_start 1971-04-25 03:00:00 (Sun)
  62193405600, #    local_end 1971-10-31 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62193420000, #    utc_start 1971-10-31 06:00:00 (Sun)
  62209148400, #      utc_end 1972-04-30 07:00:00 (Sun)
  62193402000, #  local_start 1971-10-31 01:00:00 (Sun)
  62209130400, #    local_end 1972-04-30 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62209148400, #    utc_start 1972-04-30 07:00:00 (Sun)
  62224869600, #      utc_end 1972-10-29 06:00:00 (Sun)
  62209134000, #  local_start 1972-04-30 03:00:00 (Sun)
  62224855200, #    local_end 1972-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62224869600, #    utc_start 1972-10-29 06:00:00 (Sun)
  62240598000, #      utc_end 1973-04-29 07:00:00 (Sun)
  62224851600, #  local_start 1972-10-29 01:00:00 (Sun)
  62240580000, #    local_end 1973-04-29 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62240598000, #    utc_start 1973-04-29 07:00:00 (Sun)
  62256319200, #      utc_end 1973-10-28 06:00:00 (Sun)
  62240583600, #  local_start 1973-04-29 03:00:00 (Sun)
  62256304800, #    local_end 1973-10-28 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62256319200, #    utc_start 1973-10-28 06:00:00 (Sun)
  62272047600, #      utc_end 1974-04-28 07:00:00 (Sun)
  62256301200, #  local_start 1973-10-28 01:00:00 (Sun)
  62272029600, #    local_end 1974-04-28 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62272047600, #    utc_start 1974-04-28 07:00:00 (Sun)
  62287768800, #      utc_end 1974-10-27 06:00:00 (Sun)
  62272033200, #  local_start 1974-04-28 03:00:00 (Sun)
  62287754400, #    local_end 1974-10-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62287768800, #    utc_start 1974-10-27 06:00:00 (Sun)
  62303497200, #      utc_end 1975-04-27 07:00:00 (Sun)
  62287750800, #  local_start 1974-10-27 01:00:00 (Sun)
  62303479200, #    local_end 1975-04-27 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62303497200, #    utc_start 1975-04-27 07:00:00 (Sun)
  62319218400, #      utc_end 1975-10-26 06:00:00 (Sun)
  62303482800, #  local_start 1975-04-27 03:00:00 (Sun)
  62319204000, #    local_end 1975-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62319218400, #    utc_start 1975-10-26 06:00:00 (Sun)
  62325003600, #      utc_end 1976-01-01 05:00:00 (Thu)
  62319200400, #  local_start 1975-10-26 01:00:00 (Sun)
  62324985600, #    local_end 1976-01-01 00:00:00 (Thu)
  -18000,
  0,
  'EST',
      ],
      [
  62325003600, #    utc_start 1976-01-01 05:00:00 (Thu)
  62334946800, #      utc_end 1976-04-25 07:00:00 (Sun)
  62324985600, #  local_start 1976-01-01 00:00:00 (Thu)
  62334928800, #    local_end 1976-04-25 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62334946800, #    utc_start 1976-04-25 07:00:00 (Sun)
  62351272800, #      utc_end 1976-10-31 06:00:00 (Sun)
  62334932400, #  local_start 1976-04-25 03:00:00 (Sun)
  62351258400, #    local_end 1976-10-31 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62351272800, #    utc_start 1976-10-31 06:00:00 (Sun)
  62366396400, #      utc_end 1977-04-24 07:00:00 (Sun)
  62351254800, #  local_start 1976-10-31 01:00:00 (Sun)
  62366378400, #    local_end 1977-04-24 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62366396400, #    utc_start 1977-04-24 07:00:00 (Sun)
  62382722400, #      utc_end 1977-10-30 06:00:00 (Sun)
  62366382000, #  local_start 1977-04-24 03:00:00 (Sun)
  62382708000, #    local_end 1977-10-30 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62382722400, #    utc_start 1977-10-30 06:00:00 (Sun)
  62398450800, #      utc_end 1978-04-30 07:00:00 (Sun)
  62382704400, #  local_start 1977-10-30 01:00:00 (Sun)
  62398432800, #    local_end 1978-04-30 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62398450800, #    utc_start 1978-04-30 07:00:00 (Sun)
  62414172000, #      utc_end 1978-10-29 06:00:00 (Sun)
  62398436400, #  local_start 1978-04-30 03:00:00 (Sun)
  62414157600, #    local_end 1978-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62414172000, #    utc_start 1978-10-29 06:00:00 (Sun)
  62429900400, #      utc_end 1979-04-29 07:00:00 (Sun)
  62414154000, #  local_start 1978-10-29 01:00:00 (Sun)
  62429882400, #    local_end 1979-04-29 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62429900400, #    utc_start 1979-04-29 07:00:00 (Sun)
  62445621600, #      utc_end 1979-10-28 06:00:00 (Sun)
  62429886000, #  local_start 1979-04-29 03:00:00 (Sun)
  62445607200, #    local_end 1979-10-28 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62445621600, #    utc_start 1979-10-28 06:00:00 (Sun)
  62461350000, #      utc_end 1980-04-27 07:00:00 (Sun)
  62445603600, #  local_start 1979-10-28 01:00:00 (Sun)
  62461332000, #    local_end 1980-04-27 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62461350000, #    utc_start 1980-04-27 07:00:00 (Sun)
  62477071200, #      utc_end 1980-10-26 06:00:00 (Sun)
  62461335600, #  local_start 1980-04-27 03:00:00 (Sun)
  62477056800, #    local_end 1980-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62477071200, #    utc_start 1980-10-26 06:00:00 (Sun)
  62492799600, #      utc_end 1981-04-26 07:00:00 (Sun)
  62477053200, #  local_start 1980-10-26 01:00:00 (Sun)
  62492781600, #    local_end 1981-04-26 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62492799600, #    utc_start 1981-04-26 07:00:00 (Sun)
  62508520800, #      utc_end 1981-10-25 06:00:00 (Sun)
  62492785200, #  local_start 1981-04-26 03:00:00 (Sun)
  62508506400, #    local_end 1981-10-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62508520800, #    utc_start 1981-10-25 06:00:00 (Sun)
  62524249200, #      utc_end 1982-04-25 07:00:00 (Sun)
  62508502800, #  local_start 1981-10-25 01:00:00 (Sun)
  62524231200, #    local_end 1982-04-25 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62524249200, #    utc_start 1982-04-25 07:00:00 (Sun)
  62540575200, #      utc_end 1982-10-31 06:00:00 (Sun)
  62524234800, #  local_start 1982-04-25 03:00:00 (Sun)
  62540560800, #    local_end 1982-10-31 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62540575200, #    utc_start 1982-10-31 06:00:00 (Sun)
  62555698800, #      utc_end 1983-04-24 07:00:00 (Sun)
  62540557200, #  local_start 1982-10-31 01:00:00 (Sun)
  62555680800, #    local_end 1983-04-24 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62555698800, #    utc_start 1983-04-24 07:00:00 (Sun)
  62572024800, #      utc_end 1983-10-30 06:00:00 (Sun)
  62555684400, #  local_start 1983-04-24 03:00:00 (Sun)
  62572010400, #    local_end 1983-10-30 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62572024800, #    utc_start 1983-10-30 06:00:00 (Sun)
  62587753200, #      utc_end 1984-04-29 07:00:00 (Sun)
  62572006800, #  local_start 1983-10-30 01:00:00 (Sun)
  62587735200, #    local_end 1984-04-29 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62587753200, #    utc_start 1984-04-29 07:00:00 (Sun)
  62603474400, #      utc_end 1984-10-28 06:00:00 (Sun)
  62587738800, #  local_start 1984-04-29 03:00:00 (Sun)
  62603460000, #    local_end 1984-10-28 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62603474400, #    utc_start 1984-10-28 06:00:00 (Sun)
  62619202800, #      utc_end 1985-04-28 07:00:00 (Sun)
  62603456400, #  local_start 1984-10-28 01:00:00 (Sun)
  62619184800, #    local_end 1985-04-28 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62619202800, #    utc_start 1985-04-28 07:00:00 (Sun)
  62634924000, #      utc_end 1985-10-27 06:00:00 (Sun)
  62619188400, #  local_start 1985-04-28 03:00:00 (Sun)
  62634909600, #    local_end 1985-10-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62634924000, #    utc_start 1985-10-27 06:00:00 (Sun)
  62650652400, #      utc_end 1986-04-27 07:00:00 (Sun)
  62634906000, #  local_start 1985-10-27 01:00:00 (Sun)
  62650634400, #    local_end 1986-04-27 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62650652400, #    utc_start 1986-04-27 07:00:00 (Sun)
  62666373600, #      utc_end 1986-10-26 06:00:00 (Sun)
  62650638000, #  local_start 1986-04-27 03:00:00 (Sun)
  62666359200, #    local_end 1986-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62666373600, #    utc_start 1986-10-26 06:00:00 (Sun)
  62680287600, #      utc_end 1987-04-05 07:00:00 (Sun)
  62666355600, #  local_start 1986-10-26 01:00:00 (Sun)
  62680269600, #    local_end 1987-04-05 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62680287600, #    utc_start 1987-04-05 07:00:00 (Sun)
  62697823200, #      utc_end 1987-10-25 06:00:00 (Sun)
  62680273200, #  local_start 1987-04-05 03:00:00 (Sun)
  62697808800, #    local_end 1987-10-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62697823200, #    utc_start 1987-10-25 06:00:00 (Sun)
  62711737200, #      utc_end 1988-04-03 07:00:00 (Sun)
  62697805200, #  local_start 1987-10-25 01:00:00 (Sun)
  62711719200, #    local_end 1988-04-03 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62711737200, #    utc_start 1988-04-03 07:00:00 (Sun)
  62729877600, #      utc_end 1988-10-30 06:00:00 (Sun)
  62711722800, #  local_start 1988-04-03 03:00:00 (Sun)
  62729863200, #    local_end 1988-10-30 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62729877600, #    utc_start 1988-10-30 06:00:00 (Sun)
  62743186800, #      utc_end 1989-04-02 07:00:00 (Sun)
  62729859600, #  local_start 1988-10-30 01:00:00 (Sun)
  62743168800, #    local_end 1989-04-02 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62743186800, #    utc_start 1989-04-02 07:00:00 (Sun)
  62761327200, #      utc_end 1989-10-29 06:00:00 (Sun)
  62743172400, #  local_start 1989-04-02 03:00:00 (Sun)
  62761312800, #    local_end 1989-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62761327200, #    utc_start 1989-10-29 06:00:00 (Sun)
  62774636400, #      utc_end 1990-04-01 07:00:00 (Sun)
  62761309200, #  local_start 1989-10-29 01:00:00 (Sun)
  62774618400, #    local_end 1990-04-01 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62774636400, #    utc_start 1990-04-01 07:00:00 (Sun)
  62792776800, #      utc_end 1990-10-28 06:00:00 (Sun)
  62774622000, #  local_start 1990-04-01 03:00:00 (Sun)
  62792762400, #    local_end 1990-10-28 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62792776800, #    utc_start 1990-10-28 06:00:00 (Sun)
  62806690800, #      utc_end 1991-04-07 07:00:00 (Sun)
  62792758800, #  local_start 1990-10-28 01:00:00 (Sun)
  62806672800, #    local_end 1991-04-07 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62806690800, #    utc_start 1991-04-07 07:00:00 (Sun)
  62824226400, #      utc_end 1991-10-27 06:00:00 (Sun)
  62806676400, #  local_start 1991-04-07 03:00:00 (Sun)
  62824212000, #    local_end 1991-10-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62824226400, #    utc_start 1991-10-27 06:00:00 (Sun)
  62838140400, #      utc_end 1992-04-05 07:00:00 (Sun)
  62824208400, #  local_start 1991-10-27 01:00:00 (Sun)
  62838122400, #    local_end 1992-04-05 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62838140400, #    utc_start 1992-04-05 07:00:00 (Sun)
  62855676000, #      utc_end 1992-10-25 06:00:00 (Sun)
  62838126000, #  local_start 1992-04-05 03:00:00 (Sun)
  62855661600, #    local_end 1992-10-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62855676000, #    utc_start 1992-10-25 06:00:00 (Sun)
  62869590000, #      utc_end 1993-04-04 07:00:00 (Sun)
  62855658000, #  local_start 1992-10-25 01:00:00 (Sun)
  62869572000, #    local_end 1993-04-04 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62869590000, #    utc_start 1993-04-04 07:00:00 (Sun)
  62887730400, #      utc_end 1993-10-31 06:00:00 (Sun)
  62869575600, #  local_start 1993-04-04 03:00:00 (Sun)
  62887716000, #    local_end 1993-10-31 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62887730400, #    utc_start 1993-10-31 06:00:00 (Sun)
  62901039600, #      utc_end 1994-04-03 07:00:00 (Sun)
  62887712400, #  local_start 1993-10-31 01:00:00 (Sun)
  62901021600, #    local_end 1994-04-03 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62901039600, #    utc_start 1994-04-03 07:00:00 (Sun)
  62919180000, #      utc_end 1994-10-30 06:00:00 (Sun)
  62901025200, #  local_start 1994-04-03 03:00:00 (Sun)
  62919165600, #    local_end 1994-10-30 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62919180000, #    utc_start 1994-10-30 06:00:00 (Sun)
  62932489200, #      utc_end 1995-04-02 07:00:00 (Sun)
  62919162000, #  local_start 1994-10-30 01:00:00 (Sun)
  62932471200, #    local_end 1995-04-02 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62932489200, #    utc_start 1995-04-02 07:00:00 (Sun)
  62950629600, #      utc_end 1995-10-29 06:00:00 (Sun)
  62932474800, #  local_start 1995-04-02 03:00:00 (Sun)
  62950615200, #    local_end 1995-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62950629600, #    utc_start 1995-10-29 06:00:00 (Sun)
  62964543600, #      utc_end 1996-04-07 07:00:00 (Sun)
  62950611600, #  local_start 1995-10-29 01:00:00 (Sun)
  62964525600, #    local_end 1996-04-07 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62964543600, #    utc_start 1996-04-07 07:00:00 (Sun)
  62982079200, #      utc_end 1996-10-27 06:00:00 (Sun)
  62964529200, #  local_start 1996-04-07 03:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62982079200, #    utc_start 1996-10-27 06:00:00 (Sun)
  62995993200, #      utc_end 1997-04-06 07:00:00 (Sun)
  62982061200, #  local_start 1996-10-27 01:00:00 (Sun)
  62995975200, #    local_end 1997-04-06 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62995993200, #    utc_start 1997-04-06 07:00:00 (Sun)
  63013528800, #      utc_end 1997-10-26 06:00:00 (Sun)
  62995978800, #  local_start 1997-04-06 03:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63013528800, #    utc_start 1997-10-26 06:00:00 (Sun)
  63027442800, #      utc_end 1998-04-05 07:00:00 (Sun)
  63013510800, #  local_start 1997-10-26 01:00:00 (Sun)
  63027424800, #    local_end 1998-04-05 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63027442800, #    utc_start 1998-04-05 07:00:00 (Sun)
  63044978400, #      utc_end 1998-10-25 06:00:00 (Sun)
  63027428400, #  local_start 1998-04-05 03:00:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63044978400, #    utc_start 1998-10-25 06:00:00 (Sun)
  63058892400, #      utc_end 1999-04-04 07:00:00 (Sun)
  63044960400, #  local_start 1998-10-25 01:00:00 (Sun)
  63058874400, #    local_end 1999-04-04 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63058892400, #    utc_start 1999-04-04 07:00:00 (Sun)
  63077032800, #      utc_end 1999-10-31 06:00:00 (Sun)
  63058878000, #  local_start 1999-04-04 03:00:00 (Sun)
  63077018400, #    local_end 1999-10-31 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63077032800, #    utc_start 1999-10-31 06:00:00 (Sun)
  63090342000, #      utc_end 2000-04-02 07:00:00 (Sun)
  63077014800, #  local_start 1999-10-31 01:00:00 (Sun)
  63090324000, #    local_end 2000-04-02 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63090342000, #    utc_start 2000-04-02 07:00:00 (Sun)
  63108482400, #      utc_end 2000-10-29 06:00:00 (Sun)
  63090327600, #  local_start 2000-04-02 03:00:00 (Sun)
  63108468000, #    local_end 2000-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63108482400, #    utc_start 2000-10-29 06:00:00 (Sun)
  63121791600, #      utc_end 2001-04-01 07:00:00 (Sun)
  63108464400, #  local_start 2000-10-29 01:00:00 (Sun)
  63121773600, #    local_end 2001-04-01 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63121791600, #    utc_start 2001-04-01 07:00:00 (Sun)
  63139932000, #      utc_end 2001-10-28 06:00:00 (Sun)
  63121777200, #  local_start 2001-04-01 03:00:00 (Sun)
  63139917600, #    local_end 2001-10-28 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63139932000, #    utc_start 2001-10-28 06:00:00 (Sun)
  63153846000, #      utc_end 2002-04-07 07:00:00 (Sun)
  63139914000, #  local_start 2001-10-28 01:00:00 (Sun)
  63153828000, #    local_end 2002-04-07 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63153846000, #    utc_start 2002-04-07 07:00:00 (Sun)
  63171381600, #      utc_end 2002-10-27 06:00:00 (Sun)
  63153831600, #  local_start 2002-04-07 03:00:00 (Sun)
  63171367200, #    local_end 2002-10-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63171381600, #    utc_start 2002-10-27 06:00:00 (Sun)
  63185295600, #      utc_end 2003-04-06 07:00:00 (Sun)
  63171363600, #  local_start 2002-10-27 01:00:00 (Sun)
  63185277600, #    local_end 2003-04-06 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63185295600, #    utc_start 2003-04-06 07:00:00 (Sun)
  63202831200, #      utc_end 2003-10-26 06:00:00 (Sun)
  63185281200, #  local_start 2003-04-06 03:00:00 (Sun)
  63202816800, #    local_end 2003-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63202831200, #    utc_start 2003-10-26 06:00:00 (Sun)
  63216745200, #      utc_end 2004-04-04 07:00:00 (Sun)
  63202813200, #  local_start 2003-10-26 01:00:00 (Sun)
  63216727200, #    local_end 2004-04-04 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63216745200, #    utc_start 2004-04-04 07:00:00 (Sun)
  63234885600, #      utc_end 2004-10-31 06:00:00 (Sun)
  63216730800, #  local_start 2004-04-04 03:00:00 (Sun)
  63234871200, #    local_end 2004-10-31 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63234885600, #    utc_start 2004-10-31 06:00:00 (Sun)
  63248194800, #      utc_end 2005-04-03 07:00:00 (Sun)
  63234867600, #  local_start 2004-10-31 01:00:00 (Sun)
  63248176800, #    local_end 2005-04-03 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63248194800, #    utc_start 2005-04-03 07:00:00 (Sun)
  63266335200, #      utc_end 2005-10-30 06:00:00 (Sun)
  63248180400, #  local_start 2005-04-03 03:00:00 (Sun)
  63266320800, #    local_end 2005-10-30 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63266335200, #    utc_start 2005-10-30 06:00:00 (Sun)
  63279644400, #      utc_end 2006-04-02 07:00:00 (Sun)
  63266317200, #  local_start 2005-10-30 01:00:00 (Sun)
  63279626400, #    local_end 2006-04-02 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63279644400, #    utc_start 2006-04-02 07:00:00 (Sun)
  63297784800, #      utc_end 2006-10-29 06:00:00 (Sun)
  63279630000, #  local_start 2006-04-02 03:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63297784800, #    utc_start 2006-10-29 06:00:00 (Sun)
  63309279600, #      utc_end 2007-03-11 07:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63309261600, #    local_end 2007-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63309279600, #    utc_start 2007-03-11 07:00:00 (Sun)
  63329839200, #      utc_end 2007-11-04 06:00:00 (Sun)
  63309265200, #  local_start 2007-03-11 03:00:00 (Sun)
  63329824800, #    local_end 2007-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63329839200, #    utc_start 2007-11-04 06:00:00 (Sun)
  63340729200, #      utc_end 2008-03-09 07:00:00 (Sun)
  63329821200, #  local_start 2007-11-04 01:00:00 (Sun)
  63340711200, #    local_end 2008-03-09 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63340729200, #    utc_start 2008-03-09 07:00:00 (Sun)
  63361288800, #      utc_end 2008-11-02 06:00:00 (Sun)
  63340714800, #  local_start 2008-03-09 03:00:00 (Sun)
  63361274400, #    local_end 2008-11-02 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63361288800, #    utc_start 2008-11-02 06:00:00 (Sun)
  63372178800, #      utc_end 2009-03-08 07:00:00 (Sun)
  63361270800, #  local_start 2008-11-02 01:00:00 (Sun)
  63372160800, #    local_end 2009-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63372178800, #    utc_start 2009-03-08 07:00:00 (Sun)
  63392738400, #      utc_end 2009-11-01 06:00:00 (Sun)
  63372164400, #  local_start 2009-03-08 03:00:00 (Sun)
  63392724000, #    local_end 2009-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63392738400, #    utc_start 2009-11-01 06:00:00 (Sun)
  63404233200, #      utc_end 2010-03-14 07:00:00 (Sun)
  63392720400, #  local_start 2009-11-01 01:00:00 (Sun)
  63404215200, #    local_end 2010-03-14 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63404233200, #    utc_start 2010-03-14 07:00:00 (Sun)
  63424792800, #      utc_end 2010-11-07 06:00:00 (Sun)
  63404218800, #  local_start 2010-03-14 03:00:00 (Sun)
  63424778400, #    local_end 2010-11-07 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63424792800, #    utc_start 2010-11-07 06:00:00 (Sun)
  63435682800, #      utc_end 2011-03-13 07:00:00 (Sun)
  63424774800, #  local_start 2010-11-07 01:00:00 (Sun)
  63435664800, #    local_end 2011-03-13 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63435682800, #    utc_start 2011-03-13 07:00:00 (Sun)
  63456242400, #      utc_end 2011-11-06 06:00:00 (Sun)
  63435668400, #  local_start 2011-03-13 03:00:00 (Sun)
  63456228000, #    local_end 2011-11-06 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63456242400, #    utc_start 2011-11-06 06:00:00 (Sun)
  63467132400, #      utc_end 2012-03-11 07:00:00 (Sun)
  63456224400, #  local_start 2011-11-06 01:00:00 (Sun)
  63467114400, #    local_end 2012-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63467132400, #    utc_start 2012-03-11 07:00:00 (Sun)
  63487692000, #      utc_end 2012-11-04 06:00:00 (Sun)
  63467118000, #  local_start 2012-03-11 03:00:00 (Sun)
  63487677600, #    local_end 2012-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63487692000, #    utc_start 2012-11-04 06:00:00 (Sun)
  63498582000, #      utc_end 2013-03-10 07:00:00 (Sun)
  63487674000, #  local_start 2012-11-04 01:00:00 (Sun)
  63498564000, #    local_end 2013-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63498582000, #    utc_start 2013-03-10 07:00:00 (Sun)
  63519141600, #      utc_end 2013-11-03 06:00:00 (Sun)
  63498567600, #  local_start 2013-03-10 03:00:00 (Sun)
  63519127200, #    local_end 2013-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63519141600, #    utc_start 2013-11-03 06:00:00 (Sun)
  63530031600, #      utc_end 2014-03-09 07:00:00 (Sun)
  63519123600, #  local_start 2013-11-03 01:00:00 (Sun)
  63530013600, #    local_end 2014-03-09 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63530031600, #    utc_start 2014-03-09 07:00:00 (Sun)
  63550591200, #      utc_end 2014-11-02 06:00:00 (Sun)
  63530017200, #  local_start 2014-03-09 03:00:00 (Sun)
  63550576800, #    local_end 2014-11-02 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63550591200, #    utc_start 2014-11-02 06:00:00 (Sun)
  63561481200, #      utc_end 2015-03-08 07:00:00 (Sun)
  63550573200, #  local_start 2014-11-02 01:00:00 (Sun)
  63561463200, #    local_end 2015-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63561481200, #    utc_start 2015-03-08 07:00:00 (Sun)
  63582040800, #      utc_end 2015-11-01 06:00:00 (Sun)
  63561466800, #  local_start 2015-03-08 03:00:00 (Sun)
  63582026400, #    local_end 2015-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63582040800, #    utc_start 2015-11-01 06:00:00 (Sun)
  63593535600, #      utc_end 2016-03-13 07:00:00 (Sun)
  63582022800, #  local_start 2015-11-01 01:00:00 (Sun)
  63593517600, #    local_end 2016-03-13 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63593535600, #    utc_start 2016-03-13 07:00:00 (Sun)
  63614095200, #      utc_end 2016-11-06 06:00:00 (Sun)
  63593521200, #  local_start 2016-03-13 03:00:00 (Sun)
  63614080800, #    local_end 2016-11-06 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63614095200, #    utc_start 2016-11-06 06:00:00 (Sun)
  63624985200, #      utc_end 2017-03-12 07:00:00 (Sun)
  63614077200, #  local_start 2016-11-06 01:00:00 (Sun)
  63624967200, #    local_end 2017-03-12 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63624985200, #    utc_start 2017-03-12 07:00:00 (Sun)
  63645544800, #      utc_end 2017-11-05 06:00:00 (Sun)
  63624970800, #  local_start 2017-03-12 03:00:00 (Sun)
  63645530400, #    local_end 2017-11-05 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63645544800, #    utc_start 2017-11-05 06:00:00 (Sun)
  63656434800, #      utc_end 2018-03-11 07:00:00 (Sun)
  63645526800, #  local_start 2017-11-05 01:00:00 (Sun)
  63656416800, #    local_end 2018-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63656434800, #    utc_start 2018-03-11 07:00:00 (Sun)
  63676994400, #      utc_end 2018-11-04 06:00:00 (Sun)
  63656420400, #  local_start 2018-03-11 03:00:00 (Sun)
  63676980000, #    local_end 2018-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63676994400, #    utc_start 2018-11-04 06:00:00 (Sun)
  63687884400, #      utc_end 2019-03-10 07:00:00 (Sun)
  63676976400, #  local_start 2018-11-04 01:00:00 (Sun)
  63687866400, #    local_end 2019-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63687884400, #    utc_start 2019-03-10 07:00:00 (Sun)
  63708444000, #      utc_end 2019-11-03 06:00:00 (Sun)
  63687870000, #  local_start 2019-03-10 03:00:00 (Sun)
  63708429600, #    local_end 2019-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63708444000, #    utc_start 2019-11-03 06:00:00 (Sun)
  63719334000, #      utc_end 2020-03-08 07:00:00 (Sun)
  63708426000, #  local_start 2019-11-03 01:00:00 (Sun)
  63719316000, #    local_end 2020-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63719334000, #    utc_start 2020-03-08 07:00:00 (Sun)
  63739893600, #      utc_end 2020-11-01 06:00:00 (Sun)
  63719319600, #  local_start 2020-03-08 03:00:00 (Sun)
  63739879200, #    local_end 2020-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63739893600, #    utc_start 2020-11-01 06:00:00 (Sun)
  63751388400, #      utc_end 2021-03-14 07:00:00 (Sun)
  63739875600, #  local_start 2020-11-01 01:00:00 (Sun)
  63751370400, #    local_end 2021-03-14 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63751388400, #    utc_start 2021-03-14 07:00:00 (Sun)
  63771948000, #      utc_end 2021-11-07 06:00:00 (Sun)
  63751374000, #  local_start 2021-03-14 03:00:00 (Sun)
  63771933600, #    local_end 2021-11-07 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63771948000, #    utc_start 2021-11-07 06:00:00 (Sun)
  63782838000, #      utc_end 2022-03-13 07:00:00 (Sun)
  63771930000, #  local_start 2021-11-07 01:00:00 (Sun)
  63782820000, #    local_end 2022-03-13 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63782838000, #    utc_start 2022-03-13 07:00:00 (Sun)
  63803397600, #      utc_end 2022-11-06 06:00:00 (Sun)
  63782823600, #  local_start 2022-03-13 03:00:00 (Sun)
  63803383200, #    local_end 2022-11-06 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63803397600, #    utc_start 2022-11-06 06:00:00 (Sun)
  63814287600, #      utc_end 2023-03-12 07:00:00 (Sun)
  63803379600, #  local_start 2022-11-06 01:00:00 (Sun)
  63814269600, #    local_end 2023-03-12 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63814287600, #    utc_start 2023-03-12 07:00:00 (Sun)
  63834847200, #      utc_end 2023-11-05 06:00:00 (Sun)
  63814273200, #  local_start 2023-03-12 03:00:00 (Sun)
  63834832800, #    local_end 2023-11-05 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63834847200, #    utc_start 2023-11-05 06:00:00 (Sun)
  63845737200, #      utc_end 2024-03-10 07:00:00 (Sun)
  63834829200, #  local_start 2023-11-05 01:00:00 (Sun)
  63845719200, #    local_end 2024-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63845737200, #    utc_start 2024-03-10 07:00:00 (Sun)
  63866296800, #      utc_end 2024-11-03 06:00:00 (Sun)
  63845722800, #  local_start 2024-03-10 03:00:00 (Sun)
  63866282400, #    local_end 2024-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63866296800, #    utc_start 2024-11-03 06:00:00 (Sun)
  63877186800, #      utc_end 2025-03-09 07:00:00 (Sun)
  63866278800, #  local_start 2024-11-03 01:00:00 (Sun)
  63877168800, #    local_end 2025-03-09 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63877186800, #    utc_start 2025-03-09 07:00:00 (Sun)
  63897746400, #      utc_end 2025-11-02 06:00:00 (Sun)
  63877172400, #  local_start 2025-03-09 03:00:00 (Sun)
  63897732000, #    local_end 2025-11-02 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63897746400, #    utc_start 2025-11-02 06:00:00 (Sun)
  63908636400, #      utc_end 2026-03-08 07:00:00 (Sun)
  63897728400, #  local_start 2025-11-02 01:00:00 (Sun)
  63908618400, #    local_end 2026-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63908636400, #    utc_start 2026-03-08 07:00:00 (Sun)
  63929196000, #      utc_end 2026-11-01 06:00:00 (Sun)
  63908622000, #  local_start 2026-03-08 03:00:00 (Sun)
  63929181600, #    local_end 2026-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63929196000, #    utc_start 2026-11-01 06:00:00 (Sun)
  63940690800, #      utc_end 2027-03-14 07:00:00 (Sun)
  63929178000, #  local_start 2026-11-01 01:00:00 (Sun)
  63940672800, #    local_end 2027-03-14 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63940690800, #    utc_start 2027-03-14 07:00:00 (Sun)
  63961250400, #      utc_end 2027-11-07 06:00:00 (Sun)
  63940676400, #  local_start 2027-03-14 03:00:00 (Sun)
  63961236000, #    local_end 2027-11-07 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63961250400, #    utc_start 2027-11-07 06:00:00 (Sun)
  63972140400, #      utc_end 2028-03-12 07:00:00 (Sun)
  63961232400, #  local_start 2027-11-07 01:00:00 (Sun)
  63972122400, #    local_end 2028-03-12 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63972140400, #    utc_start 2028-03-12 07:00:00 (Sun)
  63992700000, #      utc_end 2028-11-05 06:00:00 (Sun)
  63972126000, #  local_start 2028-03-12 03:00:00 (Sun)
  63992685600, #    local_end 2028-11-05 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63992700000, #    utc_start 2028-11-05 06:00:00 (Sun)
  64003590000, #      utc_end 2029-03-11 07:00:00 (Sun)
  63992682000, #  local_start 2028-11-05 01:00:00 (Sun)
  64003572000, #    local_end 2029-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  64003590000, #    utc_start 2029-03-11 07:00:00 (Sun)
  64024149600, #      utc_end 2029-11-04 06:00:00 (Sun)
  64003575600, #  local_start 2029-03-11 03:00:00 (Sun)
  64024135200, #    local_end 2029-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  64024149600, #    utc_start 2029-11-04 06:00:00 (Sun)
  64035039600, #      utc_end 2030-03-10 07:00:00 (Sun)
  64024131600, #  local_start 2029-11-04 01:00:00 (Sun)
  64035021600, #    local_end 2030-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  64035039600, #    utc_start 2030-03-10 07:00:00 (Sun)
  64055599200, #      utc_end 2030-11-03 06:00:00 (Sun)
  64035025200, #  local_start 2030-03-10 03:00:00 (Sun)
  64055584800, #    local_end 2030-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {67}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -18000 }
  
  my $last_observance = bless( {
    'format' => 'E%sT',
    'gmtoff' => '-5:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 721354,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 721354,
      'utc_rd_secs' => 0,
      'utc_year' => 1977
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -18000,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 721354,
      'local_rd_secs' => 18000,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 721354,
      'utc_rd_secs' => 18000,
      'utc_year' => 1977
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Mar',
      'letter' => 'D',
      'name' => 'US',
      'offset_from_std' => 3600,
      'on' => 'Sun>=8',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Nov',
      'letter' => 'S',
      'name' => 'US',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_NASSAU

    $main::fatpacked{"DateTime/TimeZone/America/New_York.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_NEW_YORK';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::New_York;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::New_York::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59418032400, #      utc_end 1883-11-18 17:00:00 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59418014638, #    local_end 1883-11-18 12:03:58 (Sun)
  -17762,
  0,
  'LMT',
      ],
      [
  59418032400, #    utc_start 1883-11-18 17:00:00 (Sun)
  60502402800, #      utc_end 1918-03-31 07:00:00 (Sun)
  59418014400, #  local_start 1883-11-18 12:00:00 (Sun)
  60502384800, #    local_end 1918-03-31 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  60502402800, #    utc_start 1918-03-31 07:00:00 (Sun)
  60520543200, #      utc_end 1918-10-27 06:00:00 (Sun)
  60502388400, #  local_start 1918-03-31 03:00:00 (Sun)
  60520528800, #    local_end 1918-10-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  60520543200, #    utc_start 1918-10-27 06:00:00 (Sun)
  60533852400, #      utc_end 1919-03-30 07:00:00 (Sun)
  60520525200, #  local_start 1918-10-27 01:00:00 (Sun)
  60533834400, #    local_end 1919-03-30 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  60533852400, #    utc_start 1919-03-30 07:00:00 (Sun)
  60551992800, #      utc_end 1919-10-26 06:00:00 (Sun)
  60533838000, #  local_start 1919-03-30 03:00:00 (Sun)
  60551978400, #    local_end 1919-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  60551992800, #    utc_start 1919-10-26 06:00:00 (Sun)
  60557778000, #      utc_end 1920-01-01 05:00:00 (Thu)
  60551974800, #  local_start 1919-10-26 01:00:00 (Sun)
  60557760000, #    local_end 1920-01-01 00:00:00 (Thu)
  -18000,
  0,
  'EST',
      ],
      [
  60557778000, #    utc_start 1920-01-01 05:00:00 (Thu)
  60565302000, #      utc_end 1920-03-28 07:00:00 (Sun)
  60557760000, #  local_start 1920-01-01 00:00:00 (Thu)
  60565284000, #    local_end 1920-03-28 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  60565302000, #    utc_start 1920-03-28 07:00:00 (Sun)
  60584047200, #      utc_end 1920-10-31 06:00:00 (Sun)
  60565287600, #  local_start 1920-03-28 03:00:00 (Sun)
  60584032800, #    local_end 1920-10-31 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  60584047200, #    utc_start 1920-10-31 06:00:00 (Sun)
  60599170800, #      utc_end 1921-04-24 07:00:00 (Sun)
  60584029200, #  local_start 1920-10-31 01:00:00 (Sun)
  60599152800, #    local_end 1921-04-24 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  60599170800, #    utc_start 1921-04-24 07:00:00 (Sun)
  60612472800, #      utc_end 1921-09-25 06:00:00 (Sun)
  60599156400, #  local_start 1921-04-24 03:00:00 (Sun)
  60612458400, #    local_end 1921-09-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  60612472800, #    utc_start 1921-09-25 06:00:00 (Sun)
  60631225200, #      utc_end 1922-04-30 07:00:00 (Sun)
  60612454800, #  local_start 1921-09-25 01:00:00 (Sun)
  60631207200, #    local_end 1922-04-30 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  60631225200, #    utc_start 1922-04-30 07:00:00 (Sun)
  60643922400, #      utc_end 1922-09-24 06:00:00 (Sun)
  60631210800, #  local_start 1922-04-30 03:00:00 (Sun)
  60643908000, #    local_end 1922-09-24 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  60643922400, #    utc_start 1922-09-24 06:00:00 (Sun)
  60662674800, #      utc_end 1923-04-29 07:00:00 (Sun)
  60643904400, #  local_start 1922-09-24 01:00:00 (Sun)
  60662656800, #    local_end 1923-04-29 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  60662674800, #    utc_start 1923-04-29 07:00:00 (Sun)
  60675976800, #      utc_end 1923-09-30 06:00:00 (Sun)
  60662660400, #  local_start 1923-04-29 03:00:00 (Sun)
  60675962400, #    local_end 1923-09-30 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  60675976800, #    utc_start 1923-09-30 06:00:00 (Sun)
  60694124400, #      utc_end 1924-04-27 07:00:00 (Sun)
  60675958800, #  local_start 1923-09-30 01:00:00 (Sun)
  60694106400, #    local_end 1924-04-27 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  60694124400, #    utc_start 1924-04-27 07:00:00 (Sun)
  60707426400, #      utc_end 1924-09-28 06:00:00 (Sun)
  60694110000, #  local_start 1924-04-27 03:00:00 (Sun)
  60707412000, #    local_end 1924-09-28 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  60707426400, #    utc_start 1924-09-28 06:00:00 (Sun)
  60725574000, #      utc_end 1925-04-26 07:00:00 (Sun)
  60707408400, #  local_start 1924-09-28 01:00:00 (Sun)
  60725556000, #    local_end 1925-04-26 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  60725574000, #    utc_start 1925-04-26 07:00:00 (Sun)
  60738876000, #      utc_end 1925-09-27 06:00:00 (Sun)
  60725559600, #  local_start 1925-04-26 03:00:00 (Sun)
  60738861600, #    local_end 1925-09-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  60738876000, #    utc_start 1925-09-27 06:00:00 (Sun)
  60757023600, #      utc_end 1926-04-25 07:00:00 (Sun)
  60738858000, #  local_start 1925-09-27 01:00:00 (Sun)
  60757005600, #    local_end 1926-04-25 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  60757023600, #    utc_start 1926-04-25 07:00:00 (Sun)
  60770325600, #      utc_end 1926-09-26 06:00:00 (Sun)
  60757009200, #  local_start 1926-04-25 03:00:00 (Sun)
  60770311200, #    local_end 1926-09-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  60770325600, #    utc_start 1926-09-26 06:00:00 (Sun)
  60788473200, #      utc_end 1927-04-24 07:00:00 (Sun)
  60770307600, #  local_start 1926-09-26 01:00:00 (Sun)
  60788455200, #    local_end 1927-04-24 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  60788473200, #    utc_start 1927-04-24 07:00:00 (Sun)
  60801775200, #      utc_end 1927-09-25 06:00:00 (Sun)
  60788458800, #  local_start 1927-04-24 03:00:00 (Sun)
  60801760800, #    local_end 1927-09-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  60801775200, #    utc_start 1927-09-25 06:00:00 (Sun)
  60820527600, #      utc_end 1928-04-29 07:00:00 (Sun)
  60801757200, #  local_start 1927-09-25 01:00:00 (Sun)
  60820509600, #    local_end 1928-04-29 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  60820527600, #    utc_start 1928-04-29 07:00:00 (Sun)
  60833829600, #      utc_end 1928-09-30 06:00:00 (Sun)
  60820513200, #  local_start 1928-04-29 03:00:00 (Sun)
  60833815200, #    local_end 1928-09-30 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  60833829600, #    utc_start 1928-09-30 06:00:00 (Sun)
  60851977200, #      utc_end 1929-04-28 07:00:00 (Sun)
  60833811600, #  local_start 1928-09-30 01:00:00 (Sun)
  60851959200, #    local_end 1929-04-28 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  60851977200, #    utc_start 1929-04-28 07:00:00 (Sun)
  60865279200, #      utc_end 1929-09-29 06:00:00 (Sun)
  60851962800, #  local_start 1929-04-28 03:00:00 (Sun)
  60865264800, #    local_end 1929-09-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  60865279200, #    utc_start 1929-09-29 06:00:00 (Sun)
  60883426800, #      utc_end 1930-04-27 07:00:00 (Sun)
  60865261200, #  local_start 1929-09-29 01:00:00 (Sun)
  60883408800, #    local_end 1930-04-27 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  60883426800, #    utc_start 1930-04-27 07:00:00 (Sun)
  60896728800, #      utc_end 1930-09-28 06:00:00 (Sun)
  60883412400, #  local_start 1930-04-27 03:00:00 (Sun)
  60896714400, #    local_end 1930-09-28 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  60896728800, #    utc_start 1930-09-28 06:00:00 (Sun)
  60914876400, #      utc_end 1931-04-26 07:00:00 (Sun)
  60896710800, #  local_start 1930-09-28 01:00:00 (Sun)
  60914858400, #    local_end 1931-04-26 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  60914876400, #    utc_start 1931-04-26 07:00:00 (Sun)
  60928178400, #      utc_end 1931-09-27 06:00:00 (Sun)
  60914862000, #  local_start 1931-04-26 03:00:00 (Sun)
  60928164000, #    local_end 1931-09-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  60928178400, #    utc_start 1931-09-27 06:00:00 (Sun)
  60946326000, #      utc_end 1932-04-24 07:00:00 (Sun)
  60928160400, #  local_start 1931-09-27 01:00:00 (Sun)
  60946308000, #    local_end 1932-04-24 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  60946326000, #    utc_start 1932-04-24 07:00:00 (Sun)
  60959628000, #      utc_end 1932-09-25 06:00:00 (Sun)
  60946311600, #  local_start 1932-04-24 03:00:00 (Sun)
  60959613600, #    local_end 1932-09-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  60959628000, #    utc_start 1932-09-25 06:00:00 (Sun)
  60978380400, #      utc_end 1933-04-30 07:00:00 (Sun)
  60959610000, #  local_start 1932-09-25 01:00:00 (Sun)
  60978362400, #    local_end 1933-04-30 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  60978380400, #    utc_start 1933-04-30 07:00:00 (Sun)
  60991077600, #      utc_end 1933-09-24 06:00:00 (Sun)
  60978366000, #  local_start 1933-04-30 03:00:00 (Sun)
  60991063200, #    local_end 1933-09-24 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  60991077600, #    utc_start 1933-09-24 06:00:00 (Sun)
  61009830000, #      utc_end 1934-04-29 07:00:00 (Sun)
  60991059600, #  local_start 1933-09-24 01:00:00 (Sun)
  61009812000, #    local_end 1934-04-29 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  61009830000, #    utc_start 1934-04-29 07:00:00 (Sun)
  61023132000, #      utc_end 1934-09-30 06:00:00 (Sun)
  61009815600, #  local_start 1934-04-29 03:00:00 (Sun)
  61023117600, #    local_end 1934-09-30 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  61023132000, #    utc_start 1934-09-30 06:00:00 (Sun)
  61041279600, #      utc_end 1935-04-28 07:00:00 (Sun)
  61023114000, #  local_start 1934-09-30 01:00:00 (Sun)
  61041261600, #    local_end 1935-04-28 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  61041279600, #    utc_start 1935-04-28 07:00:00 (Sun)
  61054581600, #      utc_end 1935-09-29 06:00:00 (Sun)
  61041265200, #  local_start 1935-04-28 03:00:00 (Sun)
  61054567200, #    local_end 1935-09-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  61054581600, #    utc_start 1935-09-29 06:00:00 (Sun)
  61072729200, #      utc_end 1936-04-26 07:00:00 (Sun)
  61054563600, #  local_start 1935-09-29 01:00:00 (Sun)
  61072711200, #    local_end 1936-04-26 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  61072729200, #    utc_start 1936-04-26 07:00:00 (Sun)
  61086031200, #      utc_end 1936-09-27 06:00:00 (Sun)
  61072714800, #  local_start 1936-04-26 03:00:00 (Sun)
  61086016800, #    local_end 1936-09-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  61086031200, #    utc_start 1936-09-27 06:00:00 (Sun)
  61104178800, #      utc_end 1937-04-25 07:00:00 (Sun)
  61086013200, #  local_start 1936-09-27 01:00:00 (Sun)
  61104160800, #    local_end 1937-04-25 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  61104178800, #    utc_start 1937-04-25 07:00:00 (Sun)
  61117480800, #      utc_end 1937-09-26 06:00:00 (Sun)
  61104164400, #  local_start 1937-04-25 03:00:00 (Sun)
  61117466400, #    local_end 1937-09-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  61117480800, #    utc_start 1937-09-26 06:00:00 (Sun)
  61135628400, #      utc_end 1938-04-24 07:00:00 (Sun)
  61117462800, #  local_start 1937-09-26 01:00:00 (Sun)
  61135610400, #    local_end 1938-04-24 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  61135628400, #    utc_start 1938-04-24 07:00:00 (Sun)
  61148930400, #      utc_end 1938-09-25 06:00:00 (Sun)
  61135614000, #  local_start 1938-04-24 03:00:00 (Sun)
  61148916000, #    local_end 1938-09-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  61148930400, #    utc_start 1938-09-25 06:00:00 (Sun)
  61167682800, #      utc_end 1939-04-30 07:00:00 (Sun)
  61148912400, #  local_start 1938-09-25 01:00:00 (Sun)
  61167664800, #    local_end 1939-04-30 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  61167682800, #    utc_start 1939-04-30 07:00:00 (Sun)
  61180380000, #      utc_end 1939-09-24 06:00:00 (Sun)
  61167668400, #  local_start 1939-04-30 03:00:00 (Sun)
  61180365600, #    local_end 1939-09-24 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  61180380000, #    utc_start 1939-09-24 06:00:00 (Sun)
  61199132400, #      utc_end 1940-04-28 07:00:00 (Sun)
  61180362000, #  local_start 1939-09-24 01:00:00 (Sun)
  61199114400, #    local_end 1940-04-28 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  61199132400, #    utc_start 1940-04-28 07:00:00 (Sun)
  61212434400, #      utc_end 1940-09-29 06:00:00 (Sun)
  61199118000, #  local_start 1940-04-28 03:00:00 (Sun)
  61212420000, #    local_end 1940-09-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  61212434400, #    utc_start 1940-09-29 06:00:00 (Sun)
  61230582000, #      utc_end 1941-04-27 07:00:00 (Sun)
  61212416400, #  local_start 1940-09-29 01:00:00 (Sun)
  61230564000, #    local_end 1941-04-27 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  61230582000, #    utc_start 1941-04-27 07:00:00 (Sun)
  61243884000, #      utc_end 1941-09-28 06:00:00 (Sun)
  61230567600, #  local_start 1941-04-27 03:00:00 (Sun)
  61243869600, #    local_end 1941-09-28 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  61243884000, #    utc_start 1941-09-28 06:00:00 (Sun)
  61252088400, #      utc_end 1942-01-01 05:00:00 (Thu)
  61243866000, #  local_start 1941-09-28 01:00:00 (Sun)
  61252070400, #    local_end 1942-01-01 00:00:00 (Thu)
  -18000,
  0,
  'EST',
      ],
      [
  61252088400, #    utc_start 1942-01-01 05:00:00 (Thu)
  61255465200, #      utc_end 1942-02-09 07:00:00 (Mon)
  61252070400, #  local_start 1942-01-01 00:00:00 (Thu)
  61255447200, #    local_end 1942-02-09 02:00:00 (Mon)
  -18000,
  0,
  'EST',
      ],
      [
  61255465200, #    utc_start 1942-02-09 07:00:00 (Mon)
  61366287600, #      utc_end 1945-08-14 23:00:00 (Tue)
  61255450800, #  local_start 1942-02-09 03:00:00 (Mon)
  61366273200, #    local_end 1945-08-14 19:00:00 (Tue)
  -14400,
  1,
  'EWT',
      ],
      [
  61366287600, #    utc_start 1945-08-14 23:00:00 (Tue)
  61370287200, #      utc_end 1945-09-30 06:00:00 (Sun)
  61366273200, #  local_start 1945-08-14 19:00:00 (Tue)
  61370272800, #    local_end 1945-09-30 02:00:00 (Sun)
  -14400,
  1,
  'EPT',
      ],
      [
  61370287200, #    utc_start 1945-09-30 06:00:00 (Sun)
  61378318800, #      utc_end 1946-01-01 05:00:00 (Tue)
  61370269200, #  local_start 1945-09-30 01:00:00 (Sun)
  61378300800, #    local_end 1946-01-01 00:00:00 (Tue)
  -18000,
  0,
  'EST',
      ],
      [
  61378318800, #    utc_start 1946-01-01 05:00:00 (Tue)
  61388434800, #      utc_end 1946-04-28 07:00:00 (Sun)
  61378300800, #  local_start 1946-01-01 00:00:00 (Tue)
  61388416800, #    local_end 1946-04-28 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  61388434800, #    utc_start 1946-04-28 07:00:00 (Sun)
  61401736800, #      utc_end 1946-09-29 06:00:00 (Sun)
  61388420400, #  local_start 1946-04-28 03:00:00 (Sun)
  61401722400, #    local_end 1946-09-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  61401736800, #    utc_start 1946-09-29 06:00:00 (Sun)
  61419884400, #      utc_end 1947-04-27 07:00:00 (Sun)
  61401718800, #  local_start 1946-09-29 01:00:00 (Sun)
  61419866400, #    local_end 1947-04-27 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  61419884400, #    utc_start 1947-04-27 07:00:00 (Sun)
  61433186400, #      utc_end 1947-09-28 06:00:00 (Sun)
  61419870000, #  local_start 1947-04-27 03:00:00 (Sun)
  61433172000, #    local_end 1947-09-28 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  61433186400, #    utc_start 1947-09-28 06:00:00 (Sun)
  61451334000, #      utc_end 1948-04-25 07:00:00 (Sun)
  61433168400, #  local_start 1947-09-28 01:00:00 (Sun)
  61451316000, #    local_end 1948-04-25 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  61451334000, #    utc_start 1948-04-25 07:00:00 (Sun)
  61464636000, #      utc_end 1948-09-26 06:00:00 (Sun)
  61451319600, #  local_start 1948-04-25 03:00:00 (Sun)
  61464621600, #    local_end 1948-09-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  61464636000, #    utc_start 1948-09-26 06:00:00 (Sun)
  61482783600, #      utc_end 1949-04-24 07:00:00 (Sun)
  61464618000, #  local_start 1948-09-26 01:00:00 (Sun)
  61482765600, #    local_end 1949-04-24 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  61482783600, #    utc_start 1949-04-24 07:00:00 (Sun)
  61496085600, #      utc_end 1949-09-25 06:00:00 (Sun)
  61482769200, #  local_start 1949-04-24 03:00:00 (Sun)
  61496071200, #    local_end 1949-09-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  61496085600, #    utc_start 1949-09-25 06:00:00 (Sun)
  61514838000, #      utc_end 1950-04-30 07:00:00 (Sun)
  61496067600, #  local_start 1949-09-25 01:00:00 (Sun)
  61514820000, #    local_end 1950-04-30 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  61514838000, #    utc_start 1950-04-30 07:00:00 (Sun)
  61527535200, #      utc_end 1950-09-24 06:00:00 (Sun)
  61514823600, #  local_start 1950-04-30 03:00:00 (Sun)
  61527520800, #    local_end 1950-09-24 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  61527535200, #    utc_start 1950-09-24 06:00:00 (Sun)
  61546287600, #      utc_end 1951-04-29 07:00:00 (Sun)
  61527517200, #  local_start 1950-09-24 01:00:00 (Sun)
  61546269600, #    local_end 1951-04-29 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  61546287600, #    utc_start 1951-04-29 07:00:00 (Sun)
  61559589600, #      utc_end 1951-09-30 06:00:00 (Sun)
  61546273200, #  local_start 1951-04-29 03:00:00 (Sun)
  61559575200, #    local_end 1951-09-30 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  61559589600, #    utc_start 1951-09-30 06:00:00 (Sun)
  61577737200, #      utc_end 1952-04-27 07:00:00 (Sun)
  61559571600, #  local_start 1951-09-30 01:00:00 (Sun)
  61577719200, #    local_end 1952-04-27 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  61577737200, #    utc_start 1952-04-27 07:00:00 (Sun)
  61591039200, #      utc_end 1952-09-28 06:00:00 (Sun)
  61577722800, #  local_start 1952-04-27 03:00:00 (Sun)
  61591024800, #    local_end 1952-09-28 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  61591039200, #    utc_start 1952-09-28 06:00:00 (Sun)
  61609186800, #      utc_end 1953-04-26 07:00:00 (Sun)
  61591021200, #  local_start 1952-09-28 01:00:00 (Sun)
  61609168800, #    local_end 1953-04-26 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  61609186800, #    utc_start 1953-04-26 07:00:00 (Sun)
  61622488800, #      utc_end 1953-09-27 06:00:00 (Sun)
  61609172400, #  local_start 1953-04-26 03:00:00 (Sun)
  61622474400, #    local_end 1953-09-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  61622488800, #    utc_start 1953-09-27 06:00:00 (Sun)
  61640636400, #      utc_end 1954-04-25 07:00:00 (Sun)
  61622470800, #  local_start 1953-09-27 01:00:00 (Sun)
  61640618400, #    local_end 1954-04-25 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  61640636400, #    utc_start 1954-04-25 07:00:00 (Sun)
  61653938400, #      utc_end 1954-09-26 06:00:00 (Sun)
  61640622000, #  local_start 1954-04-25 03:00:00 (Sun)
  61653924000, #    local_end 1954-09-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  61653938400, #    utc_start 1954-09-26 06:00:00 (Sun)
  61672086000, #      utc_end 1955-04-24 07:00:00 (Sun)
  61653920400, #  local_start 1954-09-26 01:00:00 (Sun)
  61672068000, #    local_end 1955-04-24 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  61672086000, #    utc_start 1955-04-24 07:00:00 (Sun)
  61688412000, #      utc_end 1955-10-30 06:00:00 (Sun)
  61672071600, #  local_start 1955-04-24 03:00:00 (Sun)
  61688397600, #    local_end 1955-10-30 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  61688412000, #    utc_start 1955-10-30 06:00:00 (Sun)
  61704140400, #      utc_end 1956-04-29 07:00:00 (Sun)
  61688394000, #  local_start 1955-10-30 01:00:00 (Sun)
  61704122400, #    local_end 1956-04-29 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  61704140400, #    utc_start 1956-04-29 07:00:00 (Sun)
  61719861600, #      utc_end 1956-10-28 06:00:00 (Sun)
  61704126000, #  local_start 1956-04-29 03:00:00 (Sun)
  61719847200, #    local_end 1956-10-28 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  61719861600, #    utc_start 1956-10-28 06:00:00 (Sun)
  61735590000, #      utc_end 1957-04-28 07:00:00 (Sun)
  61719843600, #  local_start 1956-10-28 01:00:00 (Sun)
  61735572000, #    local_end 1957-04-28 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  61735590000, #    utc_start 1957-04-28 07:00:00 (Sun)
  61751311200, #      utc_end 1957-10-27 06:00:00 (Sun)
  61735575600, #  local_start 1957-04-28 03:00:00 (Sun)
  61751296800, #    local_end 1957-10-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  61751311200, #    utc_start 1957-10-27 06:00:00 (Sun)
  61767039600, #      utc_end 1958-04-27 07:00:00 (Sun)
  61751293200, #  local_start 1957-10-27 01:00:00 (Sun)
  61767021600, #    local_end 1958-04-27 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  61767039600, #    utc_start 1958-04-27 07:00:00 (Sun)
  61782760800, #      utc_end 1958-10-26 06:00:00 (Sun)
  61767025200, #  local_start 1958-04-27 03:00:00 (Sun)
  61782746400, #    local_end 1958-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  61782760800, #    utc_start 1958-10-26 06:00:00 (Sun)
  61798489200, #      utc_end 1959-04-26 07:00:00 (Sun)
  61782742800, #  local_start 1958-10-26 01:00:00 (Sun)
  61798471200, #    local_end 1959-04-26 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  61798489200, #    utc_start 1959-04-26 07:00:00 (Sun)
  61814210400, #      utc_end 1959-10-25 06:00:00 (Sun)
  61798474800, #  local_start 1959-04-26 03:00:00 (Sun)
  61814196000, #    local_end 1959-10-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  61814210400, #    utc_start 1959-10-25 06:00:00 (Sun)
  61829938800, #      utc_end 1960-04-24 07:00:00 (Sun)
  61814192400, #  local_start 1959-10-25 01:00:00 (Sun)
  61829920800, #    local_end 1960-04-24 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  61829938800, #    utc_start 1960-04-24 07:00:00 (Sun)
  61846264800, #      utc_end 1960-10-30 06:00:00 (Sun)
  61829924400, #  local_start 1960-04-24 03:00:00 (Sun)
  61846250400, #    local_end 1960-10-30 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  61846264800, #    utc_start 1960-10-30 06:00:00 (Sun)
  61861993200, #      utc_end 1961-04-30 07:00:00 (Sun)
  61846246800, #  local_start 1960-10-30 01:00:00 (Sun)
  61861975200, #    local_end 1961-04-30 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  61861993200, #    utc_start 1961-04-30 07:00:00 (Sun)
  61877714400, #      utc_end 1961-10-29 06:00:00 (Sun)
  61861978800, #  local_start 1961-04-30 03:00:00 (Sun)
  61877700000, #    local_end 1961-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  61877714400, #    utc_start 1961-10-29 06:00:00 (Sun)
  61893442800, #      utc_end 1962-04-29 07:00:00 (Sun)
  61877696400, #  local_start 1961-10-29 01:00:00 (Sun)
  61893424800, #    local_end 1962-04-29 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  61893442800, #    utc_start 1962-04-29 07:00:00 (Sun)
  61909164000, #      utc_end 1962-10-28 06:00:00 (Sun)
  61893428400, #  local_start 1962-04-29 03:00:00 (Sun)
  61909149600, #    local_end 1962-10-28 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  61909164000, #    utc_start 1962-10-28 06:00:00 (Sun)
  61924892400, #      utc_end 1963-04-28 07:00:00 (Sun)
  61909146000, #  local_start 1962-10-28 01:00:00 (Sun)
  61924874400, #    local_end 1963-04-28 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  61924892400, #    utc_start 1963-04-28 07:00:00 (Sun)
  61940613600, #      utc_end 1963-10-27 06:00:00 (Sun)
  61924878000, #  local_start 1963-04-28 03:00:00 (Sun)
  61940599200, #    local_end 1963-10-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  61940613600, #    utc_start 1963-10-27 06:00:00 (Sun)
  61956342000, #      utc_end 1964-04-26 07:00:00 (Sun)
  61940595600, #  local_start 1963-10-27 01:00:00 (Sun)
  61956324000, #    local_end 1964-04-26 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  61956342000, #    utc_start 1964-04-26 07:00:00 (Sun)
  61972063200, #      utc_end 1964-10-25 06:00:00 (Sun)
  61956327600, #  local_start 1964-04-26 03:00:00 (Sun)
  61972048800, #    local_end 1964-10-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  61972063200, #    utc_start 1964-10-25 06:00:00 (Sun)
  61987791600, #      utc_end 1965-04-25 07:00:00 (Sun)
  61972045200, #  local_start 1964-10-25 01:00:00 (Sun)
  61987773600, #    local_end 1965-04-25 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  61987791600, #    utc_start 1965-04-25 07:00:00 (Sun)
  62004117600, #      utc_end 1965-10-31 06:00:00 (Sun)
  61987777200, #  local_start 1965-04-25 03:00:00 (Sun)
  62004103200, #    local_end 1965-10-31 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62004117600, #    utc_start 1965-10-31 06:00:00 (Sun)
  62019241200, #      utc_end 1966-04-24 07:00:00 (Sun)
  62004099600, #  local_start 1965-10-31 01:00:00 (Sun)
  62019223200, #    local_end 1966-04-24 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62019241200, #    utc_start 1966-04-24 07:00:00 (Sun)
  62035567200, #      utc_end 1966-10-30 06:00:00 (Sun)
  62019226800, #  local_start 1966-04-24 03:00:00 (Sun)
  62035552800, #    local_end 1966-10-30 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62035567200, #    utc_start 1966-10-30 06:00:00 (Sun)
  62041006800, #      utc_end 1967-01-01 05:00:00 (Sun)
  62035549200, #  local_start 1966-10-30 01:00:00 (Sun)
  62040988800, #    local_end 1967-01-01 00:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62041006800, #    utc_start 1967-01-01 05:00:00 (Sun)
  62051295600, #      utc_end 1967-04-30 07:00:00 (Sun)
  62040988800, #  local_start 1967-01-01 00:00:00 (Sun)
  62051277600, #    local_end 1967-04-30 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62051295600, #    utc_start 1967-04-30 07:00:00 (Sun)
  62067016800, #      utc_end 1967-10-29 06:00:00 (Sun)
  62051281200, #  local_start 1967-04-30 03:00:00 (Sun)
  62067002400, #    local_end 1967-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62067016800, #    utc_start 1967-10-29 06:00:00 (Sun)
  62082745200, #      utc_end 1968-04-28 07:00:00 (Sun)
  62066998800, #  local_start 1967-10-29 01:00:00 (Sun)
  62082727200, #    local_end 1968-04-28 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62082745200, #    utc_start 1968-04-28 07:00:00 (Sun)
  62098466400, #      utc_end 1968-10-27 06:00:00 (Sun)
  62082730800, #  local_start 1968-04-28 03:00:00 (Sun)
  62098452000, #    local_end 1968-10-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62098466400, #    utc_start 1968-10-27 06:00:00 (Sun)
  62114194800, #      utc_end 1969-04-27 07:00:00 (Sun)
  62098448400, #  local_start 1968-10-27 01:00:00 (Sun)
  62114176800, #    local_end 1969-04-27 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62114194800, #    utc_start 1969-04-27 07:00:00 (Sun)
  62129916000, #      utc_end 1969-10-26 06:00:00 (Sun)
  62114180400, #  local_start 1969-04-27 03:00:00 (Sun)
  62129901600, #    local_end 1969-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62129916000, #    utc_start 1969-10-26 06:00:00 (Sun)
  62145644400, #      utc_end 1970-04-26 07:00:00 (Sun)
  62129898000, #  local_start 1969-10-26 01:00:00 (Sun)
  62145626400, #    local_end 1970-04-26 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62145644400, #    utc_start 1970-04-26 07:00:00 (Sun)
  62161365600, #      utc_end 1970-10-25 06:00:00 (Sun)
  62145630000, #  local_start 1970-04-26 03:00:00 (Sun)
  62161351200, #    local_end 1970-10-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62161365600, #    utc_start 1970-10-25 06:00:00 (Sun)
  62177094000, #      utc_end 1971-04-25 07:00:00 (Sun)
  62161347600, #  local_start 1970-10-25 01:00:00 (Sun)
  62177076000, #    local_end 1971-04-25 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62177094000, #    utc_start 1971-04-25 07:00:00 (Sun)
  62193420000, #      utc_end 1971-10-31 06:00:00 (Sun)
  62177079600, #  local_start 1971-04-25 03:00:00 (Sun)
  62193405600, #    local_end 1971-10-31 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62193420000, #    utc_start 1971-10-31 06:00:00 (Sun)
  62209148400, #      utc_end 1972-04-30 07:00:00 (Sun)
  62193402000, #  local_start 1971-10-31 01:00:00 (Sun)
  62209130400, #    local_end 1972-04-30 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62209148400, #    utc_start 1972-04-30 07:00:00 (Sun)
  62224869600, #      utc_end 1972-10-29 06:00:00 (Sun)
  62209134000, #  local_start 1972-04-30 03:00:00 (Sun)
  62224855200, #    local_end 1972-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62224869600, #    utc_start 1972-10-29 06:00:00 (Sun)
  62240598000, #      utc_end 1973-04-29 07:00:00 (Sun)
  62224851600, #  local_start 1972-10-29 01:00:00 (Sun)
  62240580000, #    local_end 1973-04-29 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62240598000, #    utc_start 1973-04-29 07:00:00 (Sun)
  62256319200, #      utc_end 1973-10-28 06:00:00 (Sun)
  62240583600, #  local_start 1973-04-29 03:00:00 (Sun)
  62256304800, #    local_end 1973-10-28 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62256319200, #    utc_start 1973-10-28 06:00:00 (Sun)
  62262370800, #      utc_end 1974-01-06 07:00:00 (Sun)
  62256301200, #  local_start 1973-10-28 01:00:00 (Sun)
  62262352800, #    local_end 1974-01-06 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62262370800, #    utc_start 1974-01-06 07:00:00 (Sun)
  62287768800, #      utc_end 1974-10-27 06:00:00 (Sun)
  62262356400, #  local_start 1974-01-06 03:00:00 (Sun)
  62287754400, #    local_end 1974-10-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62287768800, #    utc_start 1974-10-27 06:00:00 (Sun)
  62298054000, #      utc_end 1975-02-23 07:00:00 (Sun)
  62287750800, #  local_start 1974-10-27 01:00:00 (Sun)
  62298036000, #    local_end 1975-02-23 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62298054000, #    utc_start 1975-02-23 07:00:00 (Sun)
  62319218400, #      utc_end 1975-10-26 06:00:00 (Sun)
  62298039600, #  local_start 1975-02-23 03:00:00 (Sun)
  62319204000, #    local_end 1975-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62319218400, #    utc_start 1975-10-26 06:00:00 (Sun)
  62334946800, #      utc_end 1976-04-25 07:00:00 (Sun)
  62319200400, #  local_start 1975-10-26 01:00:00 (Sun)
  62334928800, #    local_end 1976-04-25 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62334946800, #    utc_start 1976-04-25 07:00:00 (Sun)
  62351272800, #      utc_end 1976-10-31 06:00:00 (Sun)
  62334932400, #  local_start 1976-04-25 03:00:00 (Sun)
  62351258400, #    local_end 1976-10-31 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62351272800, #    utc_start 1976-10-31 06:00:00 (Sun)
  62366396400, #      utc_end 1977-04-24 07:00:00 (Sun)
  62351254800, #  local_start 1976-10-31 01:00:00 (Sun)
  62366378400, #    local_end 1977-04-24 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62366396400, #    utc_start 1977-04-24 07:00:00 (Sun)
  62382722400, #      utc_end 1977-10-30 06:00:00 (Sun)
  62366382000, #  local_start 1977-04-24 03:00:00 (Sun)
  62382708000, #    local_end 1977-10-30 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62382722400, #    utc_start 1977-10-30 06:00:00 (Sun)
  62398450800, #      utc_end 1978-04-30 07:00:00 (Sun)
  62382704400, #  local_start 1977-10-30 01:00:00 (Sun)
  62398432800, #    local_end 1978-04-30 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62398450800, #    utc_start 1978-04-30 07:00:00 (Sun)
  62414172000, #      utc_end 1978-10-29 06:00:00 (Sun)
  62398436400, #  local_start 1978-04-30 03:00:00 (Sun)
  62414157600, #    local_end 1978-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62414172000, #    utc_start 1978-10-29 06:00:00 (Sun)
  62429900400, #      utc_end 1979-04-29 07:00:00 (Sun)
  62414154000, #  local_start 1978-10-29 01:00:00 (Sun)
  62429882400, #    local_end 1979-04-29 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62429900400, #    utc_start 1979-04-29 07:00:00 (Sun)
  62445621600, #      utc_end 1979-10-28 06:00:00 (Sun)
  62429886000, #  local_start 1979-04-29 03:00:00 (Sun)
  62445607200, #    local_end 1979-10-28 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62445621600, #    utc_start 1979-10-28 06:00:00 (Sun)
  62461350000, #      utc_end 1980-04-27 07:00:00 (Sun)
  62445603600, #  local_start 1979-10-28 01:00:00 (Sun)
  62461332000, #    local_end 1980-04-27 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62461350000, #    utc_start 1980-04-27 07:00:00 (Sun)
  62477071200, #      utc_end 1980-10-26 06:00:00 (Sun)
  62461335600, #  local_start 1980-04-27 03:00:00 (Sun)
  62477056800, #    local_end 1980-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62477071200, #    utc_start 1980-10-26 06:00:00 (Sun)
  62492799600, #      utc_end 1981-04-26 07:00:00 (Sun)
  62477053200, #  local_start 1980-10-26 01:00:00 (Sun)
  62492781600, #    local_end 1981-04-26 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62492799600, #    utc_start 1981-04-26 07:00:00 (Sun)
  62508520800, #      utc_end 1981-10-25 06:00:00 (Sun)
  62492785200, #  local_start 1981-04-26 03:00:00 (Sun)
  62508506400, #    local_end 1981-10-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62508520800, #    utc_start 1981-10-25 06:00:00 (Sun)
  62524249200, #      utc_end 1982-04-25 07:00:00 (Sun)
  62508502800, #  local_start 1981-10-25 01:00:00 (Sun)
  62524231200, #    local_end 1982-04-25 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62524249200, #    utc_start 1982-04-25 07:00:00 (Sun)
  62540575200, #      utc_end 1982-10-31 06:00:00 (Sun)
  62524234800, #  local_start 1982-04-25 03:00:00 (Sun)
  62540560800, #    local_end 1982-10-31 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62540575200, #    utc_start 1982-10-31 06:00:00 (Sun)
  62555698800, #      utc_end 1983-04-24 07:00:00 (Sun)
  62540557200, #  local_start 1982-10-31 01:00:00 (Sun)
  62555680800, #    local_end 1983-04-24 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62555698800, #    utc_start 1983-04-24 07:00:00 (Sun)
  62572024800, #      utc_end 1983-10-30 06:00:00 (Sun)
  62555684400, #  local_start 1983-04-24 03:00:00 (Sun)
  62572010400, #    local_end 1983-10-30 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62572024800, #    utc_start 1983-10-30 06:00:00 (Sun)
  62587753200, #      utc_end 1984-04-29 07:00:00 (Sun)
  62572006800, #  local_start 1983-10-30 01:00:00 (Sun)
  62587735200, #    local_end 1984-04-29 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62587753200, #    utc_start 1984-04-29 07:00:00 (Sun)
  62603474400, #      utc_end 1984-10-28 06:00:00 (Sun)
  62587738800, #  local_start 1984-04-29 03:00:00 (Sun)
  62603460000, #    local_end 1984-10-28 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62603474400, #    utc_start 1984-10-28 06:00:00 (Sun)
  62619202800, #      utc_end 1985-04-28 07:00:00 (Sun)
  62603456400, #  local_start 1984-10-28 01:00:00 (Sun)
  62619184800, #    local_end 1985-04-28 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62619202800, #    utc_start 1985-04-28 07:00:00 (Sun)
  62634924000, #      utc_end 1985-10-27 06:00:00 (Sun)
  62619188400, #  local_start 1985-04-28 03:00:00 (Sun)
  62634909600, #    local_end 1985-10-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62634924000, #    utc_start 1985-10-27 06:00:00 (Sun)
  62650652400, #      utc_end 1986-04-27 07:00:00 (Sun)
  62634906000, #  local_start 1985-10-27 01:00:00 (Sun)
  62650634400, #    local_end 1986-04-27 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62650652400, #    utc_start 1986-04-27 07:00:00 (Sun)
  62666373600, #      utc_end 1986-10-26 06:00:00 (Sun)
  62650638000, #  local_start 1986-04-27 03:00:00 (Sun)
  62666359200, #    local_end 1986-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62666373600, #    utc_start 1986-10-26 06:00:00 (Sun)
  62680287600, #      utc_end 1987-04-05 07:00:00 (Sun)
  62666355600, #  local_start 1986-10-26 01:00:00 (Sun)
  62680269600, #    local_end 1987-04-05 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62680287600, #    utc_start 1987-04-05 07:00:00 (Sun)
  62697823200, #      utc_end 1987-10-25 06:00:00 (Sun)
  62680273200, #  local_start 1987-04-05 03:00:00 (Sun)
  62697808800, #    local_end 1987-10-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62697823200, #    utc_start 1987-10-25 06:00:00 (Sun)
  62711737200, #      utc_end 1988-04-03 07:00:00 (Sun)
  62697805200, #  local_start 1987-10-25 01:00:00 (Sun)
  62711719200, #    local_end 1988-04-03 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62711737200, #    utc_start 1988-04-03 07:00:00 (Sun)
  62729877600, #      utc_end 1988-10-30 06:00:00 (Sun)
  62711722800, #  local_start 1988-04-03 03:00:00 (Sun)
  62729863200, #    local_end 1988-10-30 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62729877600, #    utc_start 1988-10-30 06:00:00 (Sun)
  62743186800, #      utc_end 1989-04-02 07:00:00 (Sun)
  62729859600, #  local_start 1988-10-30 01:00:00 (Sun)
  62743168800, #    local_end 1989-04-02 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62743186800, #    utc_start 1989-04-02 07:00:00 (Sun)
  62761327200, #      utc_end 1989-10-29 06:00:00 (Sun)
  62743172400, #  local_start 1989-04-02 03:00:00 (Sun)
  62761312800, #    local_end 1989-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62761327200, #    utc_start 1989-10-29 06:00:00 (Sun)
  62774636400, #      utc_end 1990-04-01 07:00:00 (Sun)
  62761309200, #  local_start 1989-10-29 01:00:00 (Sun)
  62774618400, #    local_end 1990-04-01 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62774636400, #    utc_start 1990-04-01 07:00:00 (Sun)
  62792776800, #      utc_end 1990-10-28 06:00:00 (Sun)
  62774622000, #  local_start 1990-04-01 03:00:00 (Sun)
  62792762400, #    local_end 1990-10-28 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62792776800, #    utc_start 1990-10-28 06:00:00 (Sun)
  62806690800, #      utc_end 1991-04-07 07:00:00 (Sun)
  62792758800, #  local_start 1990-10-28 01:00:00 (Sun)
  62806672800, #    local_end 1991-04-07 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62806690800, #    utc_start 1991-04-07 07:00:00 (Sun)
  62824226400, #      utc_end 1991-10-27 06:00:00 (Sun)
  62806676400, #  local_start 1991-04-07 03:00:00 (Sun)
  62824212000, #    local_end 1991-10-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62824226400, #    utc_start 1991-10-27 06:00:00 (Sun)
  62838140400, #      utc_end 1992-04-05 07:00:00 (Sun)
  62824208400, #  local_start 1991-10-27 01:00:00 (Sun)
  62838122400, #    local_end 1992-04-05 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62838140400, #    utc_start 1992-04-05 07:00:00 (Sun)
  62855676000, #      utc_end 1992-10-25 06:00:00 (Sun)
  62838126000, #  local_start 1992-04-05 03:00:00 (Sun)
  62855661600, #    local_end 1992-10-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62855676000, #    utc_start 1992-10-25 06:00:00 (Sun)
  62869590000, #      utc_end 1993-04-04 07:00:00 (Sun)
  62855658000, #  local_start 1992-10-25 01:00:00 (Sun)
  62869572000, #    local_end 1993-04-04 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62869590000, #    utc_start 1993-04-04 07:00:00 (Sun)
  62887730400, #      utc_end 1993-10-31 06:00:00 (Sun)
  62869575600, #  local_start 1993-04-04 03:00:00 (Sun)
  62887716000, #    local_end 1993-10-31 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62887730400, #    utc_start 1993-10-31 06:00:00 (Sun)
  62901039600, #      utc_end 1994-04-03 07:00:00 (Sun)
  62887712400, #  local_start 1993-10-31 01:00:00 (Sun)
  62901021600, #    local_end 1994-04-03 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62901039600, #    utc_start 1994-04-03 07:00:00 (Sun)
  62919180000, #      utc_end 1994-10-30 06:00:00 (Sun)
  62901025200, #  local_start 1994-04-03 03:00:00 (Sun)
  62919165600, #    local_end 1994-10-30 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62919180000, #    utc_start 1994-10-30 06:00:00 (Sun)
  62932489200, #      utc_end 1995-04-02 07:00:00 (Sun)
  62919162000, #  local_start 1994-10-30 01:00:00 (Sun)
  62932471200, #    local_end 1995-04-02 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62932489200, #    utc_start 1995-04-02 07:00:00 (Sun)
  62950629600, #      utc_end 1995-10-29 06:00:00 (Sun)
  62932474800, #  local_start 1995-04-02 03:00:00 (Sun)
  62950615200, #    local_end 1995-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62950629600, #    utc_start 1995-10-29 06:00:00 (Sun)
  62964543600, #      utc_end 1996-04-07 07:00:00 (Sun)
  62950611600, #  local_start 1995-10-29 01:00:00 (Sun)
  62964525600, #    local_end 1996-04-07 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62964543600, #    utc_start 1996-04-07 07:00:00 (Sun)
  62982079200, #      utc_end 1996-10-27 06:00:00 (Sun)
  62964529200, #  local_start 1996-04-07 03:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62982079200, #    utc_start 1996-10-27 06:00:00 (Sun)
  62995993200, #      utc_end 1997-04-06 07:00:00 (Sun)
  62982061200, #  local_start 1996-10-27 01:00:00 (Sun)
  62995975200, #    local_end 1997-04-06 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62995993200, #    utc_start 1997-04-06 07:00:00 (Sun)
  63013528800, #      utc_end 1997-10-26 06:00:00 (Sun)
  62995978800, #  local_start 1997-04-06 03:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63013528800, #    utc_start 1997-10-26 06:00:00 (Sun)
  63027442800, #      utc_end 1998-04-05 07:00:00 (Sun)
  63013510800, #  local_start 1997-10-26 01:00:00 (Sun)
  63027424800, #    local_end 1998-04-05 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63027442800, #    utc_start 1998-04-05 07:00:00 (Sun)
  63044978400, #      utc_end 1998-10-25 06:00:00 (Sun)
  63027428400, #  local_start 1998-04-05 03:00:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63044978400, #    utc_start 1998-10-25 06:00:00 (Sun)
  63058892400, #      utc_end 1999-04-04 07:00:00 (Sun)
  63044960400, #  local_start 1998-10-25 01:00:00 (Sun)
  63058874400, #    local_end 1999-04-04 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63058892400, #    utc_start 1999-04-04 07:00:00 (Sun)
  63077032800, #      utc_end 1999-10-31 06:00:00 (Sun)
  63058878000, #  local_start 1999-04-04 03:00:00 (Sun)
  63077018400, #    local_end 1999-10-31 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63077032800, #    utc_start 1999-10-31 06:00:00 (Sun)
  63090342000, #      utc_end 2000-04-02 07:00:00 (Sun)
  63077014800, #  local_start 1999-10-31 01:00:00 (Sun)
  63090324000, #    local_end 2000-04-02 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63090342000, #    utc_start 2000-04-02 07:00:00 (Sun)
  63108482400, #      utc_end 2000-10-29 06:00:00 (Sun)
  63090327600, #  local_start 2000-04-02 03:00:00 (Sun)
  63108468000, #    local_end 2000-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63108482400, #    utc_start 2000-10-29 06:00:00 (Sun)
  63121791600, #      utc_end 2001-04-01 07:00:00 (Sun)
  63108464400, #  local_start 2000-10-29 01:00:00 (Sun)
  63121773600, #    local_end 2001-04-01 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63121791600, #    utc_start 2001-04-01 07:00:00 (Sun)
  63139932000, #      utc_end 2001-10-28 06:00:00 (Sun)
  63121777200, #  local_start 2001-04-01 03:00:00 (Sun)
  63139917600, #    local_end 2001-10-28 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63139932000, #    utc_start 2001-10-28 06:00:00 (Sun)
  63153846000, #      utc_end 2002-04-07 07:00:00 (Sun)
  63139914000, #  local_start 2001-10-28 01:00:00 (Sun)
  63153828000, #    local_end 2002-04-07 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63153846000, #    utc_start 2002-04-07 07:00:00 (Sun)
  63171381600, #      utc_end 2002-10-27 06:00:00 (Sun)
  63153831600, #  local_start 2002-04-07 03:00:00 (Sun)
  63171367200, #    local_end 2002-10-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63171381600, #    utc_start 2002-10-27 06:00:00 (Sun)
  63185295600, #      utc_end 2003-04-06 07:00:00 (Sun)
  63171363600, #  local_start 2002-10-27 01:00:00 (Sun)
  63185277600, #    local_end 2003-04-06 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63185295600, #    utc_start 2003-04-06 07:00:00 (Sun)
  63202831200, #      utc_end 2003-10-26 06:00:00 (Sun)
  63185281200, #  local_start 2003-04-06 03:00:00 (Sun)
  63202816800, #    local_end 2003-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63202831200, #    utc_start 2003-10-26 06:00:00 (Sun)
  63216745200, #      utc_end 2004-04-04 07:00:00 (Sun)
  63202813200, #  local_start 2003-10-26 01:00:00 (Sun)
  63216727200, #    local_end 2004-04-04 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63216745200, #    utc_start 2004-04-04 07:00:00 (Sun)
  63234885600, #      utc_end 2004-10-31 06:00:00 (Sun)
  63216730800, #  local_start 2004-04-04 03:00:00 (Sun)
  63234871200, #    local_end 2004-10-31 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63234885600, #    utc_start 2004-10-31 06:00:00 (Sun)
  63248194800, #      utc_end 2005-04-03 07:00:00 (Sun)
  63234867600, #  local_start 2004-10-31 01:00:00 (Sun)
  63248176800, #    local_end 2005-04-03 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63248194800, #    utc_start 2005-04-03 07:00:00 (Sun)
  63266335200, #      utc_end 2005-10-30 06:00:00 (Sun)
  63248180400, #  local_start 2005-04-03 03:00:00 (Sun)
  63266320800, #    local_end 2005-10-30 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63266335200, #    utc_start 2005-10-30 06:00:00 (Sun)
  63279644400, #      utc_end 2006-04-02 07:00:00 (Sun)
  63266317200, #  local_start 2005-10-30 01:00:00 (Sun)
  63279626400, #    local_end 2006-04-02 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63279644400, #    utc_start 2006-04-02 07:00:00 (Sun)
  63297784800, #      utc_end 2006-10-29 06:00:00 (Sun)
  63279630000, #  local_start 2006-04-02 03:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63297784800, #    utc_start 2006-10-29 06:00:00 (Sun)
  63309279600, #      utc_end 2007-03-11 07:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63309261600, #    local_end 2007-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63309279600, #    utc_start 2007-03-11 07:00:00 (Sun)
  63329839200, #      utc_end 2007-11-04 06:00:00 (Sun)
  63309265200, #  local_start 2007-03-11 03:00:00 (Sun)
  63329824800, #    local_end 2007-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63329839200, #    utc_start 2007-11-04 06:00:00 (Sun)
  63340729200, #      utc_end 2008-03-09 07:00:00 (Sun)
  63329821200, #  local_start 2007-11-04 01:00:00 (Sun)
  63340711200, #    local_end 2008-03-09 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63340729200, #    utc_start 2008-03-09 07:00:00 (Sun)
  63361288800, #      utc_end 2008-11-02 06:00:00 (Sun)
  63340714800, #  local_start 2008-03-09 03:00:00 (Sun)
  63361274400, #    local_end 2008-11-02 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63361288800, #    utc_start 2008-11-02 06:00:00 (Sun)
  63372178800, #      utc_end 2009-03-08 07:00:00 (Sun)
  63361270800, #  local_start 2008-11-02 01:00:00 (Sun)
  63372160800, #    local_end 2009-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63372178800, #    utc_start 2009-03-08 07:00:00 (Sun)
  63392738400, #      utc_end 2009-11-01 06:00:00 (Sun)
  63372164400, #  local_start 2009-03-08 03:00:00 (Sun)
  63392724000, #    local_end 2009-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63392738400, #    utc_start 2009-11-01 06:00:00 (Sun)
  63404233200, #      utc_end 2010-03-14 07:00:00 (Sun)
  63392720400, #  local_start 2009-11-01 01:00:00 (Sun)
  63404215200, #    local_end 2010-03-14 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63404233200, #    utc_start 2010-03-14 07:00:00 (Sun)
  63424792800, #      utc_end 2010-11-07 06:00:00 (Sun)
  63404218800, #  local_start 2010-03-14 03:00:00 (Sun)
  63424778400, #    local_end 2010-11-07 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63424792800, #    utc_start 2010-11-07 06:00:00 (Sun)
  63435682800, #      utc_end 2011-03-13 07:00:00 (Sun)
  63424774800, #  local_start 2010-11-07 01:00:00 (Sun)
  63435664800, #    local_end 2011-03-13 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63435682800, #    utc_start 2011-03-13 07:00:00 (Sun)
  63456242400, #      utc_end 2011-11-06 06:00:00 (Sun)
  63435668400, #  local_start 2011-03-13 03:00:00 (Sun)
  63456228000, #    local_end 2011-11-06 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63456242400, #    utc_start 2011-11-06 06:00:00 (Sun)
  63467132400, #      utc_end 2012-03-11 07:00:00 (Sun)
  63456224400, #  local_start 2011-11-06 01:00:00 (Sun)
  63467114400, #    local_end 2012-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63467132400, #    utc_start 2012-03-11 07:00:00 (Sun)
  63487692000, #      utc_end 2012-11-04 06:00:00 (Sun)
  63467118000, #  local_start 2012-03-11 03:00:00 (Sun)
  63487677600, #    local_end 2012-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63487692000, #    utc_start 2012-11-04 06:00:00 (Sun)
  63498582000, #      utc_end 2013-03-10 07:00:00 (Sun)
  63487674000, #  local_start 2012-11-04 01:00:00 (Sun)
  63498564000, #    local_end 2013-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63498582000, #    utc_start 2013-03-10 07:00:00 (Sun)
  63519141600, #      utc_end 2013-11-03 06:00:00 (Sun)
  63498567600, #  local_start 2013-03-10 03:00:00 (Sun)
  63519127200, #    local_end 2013-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63519141600, #    utc_start 2013-11-03 06:00:00 (Sun)
  63530031600, #      utc_end 2014-03-09 07:00:00 (Sun)
  63519123600, #  local_start 2013-11-03 01:00:00 (Sun)
  63530013600, #    local_end 2014-03-09 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63530031600, #    utc_start 2014-03-09 07:00:00 (Sun)
  63550591200, #      utc_end 2014-11-02 06:00:00 (Sun)
  63530017200, #  local_start 2014-03-09 03:00:00 (Sun)
  63550576800, #    local_end 2014-11-02 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63550591200, #    utc_start 2014-11-02 06:00:00 (Sun)
  63561481200, #      utc_end 2015-03-08 07:00:00 (Sun)
  63550573200, #  local_start 2014-11-02 01:00:00 (Sun)
  63561463200, #    local_end 2015-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63561481200, #    utc_start 2015-03-08 07:00:00 (Sun)
  63582040800, #      utc_end 2015-11-01 06:00:00 (Sun)
  63561466800, #  local_start 2015-03-08 03:00:00 (Sun)
  63582026400, #    local_end 2015-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63582040800, #    utc_start 2015-11-01 06:00:00 (Sun)
  63593535600, #      utc_end 2016-03-13 07:00:00 (Sun)
  63582022800, #  local_start 2015-11-01 01:00:00 (Sun)
  63593517600, #    local_end 2016-03-13 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63593535600, #    utc_start 2016-03-13 07:00:00 (Sun)
  63614095200, #      utc_end 2016-11-06 06:00:00 (Sun)
  63593521200, #  local_start 2016-03-13 03:00:00 (Sun)
  63614080800, #    local_end 2016-11-06 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63614095200, #    utc_start 2016-11-06 06:00:00 (Sun)
  63624985200, #      utc_end 2017-03-12 07:00:00 (Sun)
  63614077200, #  local_start 2016-11-06 01:00:00 (Sun)
  63624967200, #    local_end 2017-03-12 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63624985200, #    utc_start 2017-03-12 07:00:00 (Sun)
  63645544800, #      utc_end 2017-11-05 06:00:00 (Sun)
  63624970800, #  local_start 2017-03-12 03:00:00 (Sun)
  63645530400, #    local_end 2017-11-05 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63645544800, #    utc_start 2017-11-05 06:00:00 (Sun)
  63656434800, #      utc_end 2018-03-11 07:00:00 (Sun)
  63645526800, #  local_start 2017-11-05 01:00:00 (Sun)
  63656416800, #    local_end 2018-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63656434800, #    utc_start 2018-03-11 07:00:00 (Sun)
  63676994400, #      utc_end 2018-11-04 06:00:00 (Sun)
  63656420400, #  local_start 2018-03-11 03:00:00 (Sun)
  63676980000, #    local_end 2018-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63676994400, #    utc_start 2018-11-04 06:00:00 (Sun)
  63687884400, #      utc_end 2019-03-10 07:00:00 (Sun)
  63676976400, #  local_start 2018-11-04 01:00:00 (Sun)
  63687866400, #    local_end 2019-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63687884400, #    utc_start 2019-03-10 07:00:00 (Sun)
  63708444000, #      utc_end 2019-11-03 06:00:00 (Sun)
  63687870000, #  local_start 2019-03-10 03:00:00 (Sun)
  63708429600, #    local_end 2019-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63708444000, #    utc_start 2019-11-03 06:00:00 (Sun)
  63719334000, #      utc_end 2020-03-08 07:00:00 (Sun)
  63708426000, #  local_start 2019-11-03 01:00:00 (Sun)
  63719316000, #    local_end 2020-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63719334000, #    utc_start 2020-03-08 07:00:00 (Sun)
  63739893600, #      utc_end 2020-11-01 06:00:00 (Sun)
  63719319600, #  local_start 2020-03-08 03:00:00 (Sun)
  63739879200, #    local_end 2020-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63739893600, #    utc_start 2020-11-01 06:00:00 (Sun)
  63751388400, #      utc_end 2021-03-14 07:00:00 (Sun)
  63739875600, #  local_start 2020-11-01 01:00:00 (Sun)
  63751370400, #    local_end 2021-03-14 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63751388400, #    utc_start 2021-03-14 07:00:00 (Sun)
  63771948000, #      utc_end 2021-11-07 06:00:00 (Sun)
  63751374000, #  local_start 2021-03-14 03:00:00 (Sun)
  63771933600, #    local_end 2021-11-07 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63771948000, #    utc_start 2021-11-07 06:00:00 (Sun)
  63782838000, #      utc_end 2022-03-13 07:00:00 (Sun)
  63771930000, #  local_start 2021-11-07 01:00:00 (Sun)
  63782820000, #    local_end 2022-03-13 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63782838000, #    utc_start 2022-03-13 07:00:00 (Sun)
  63803397600, #      utc_end 2022-11-06 06:00:00 (Sun)
  63782823600, #  local_start 2022-03-13 03:00:00 (Sun)
  63803383200, #    local_end 2022-11-06 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63803397600, #    utc_start 2022-11-06 06:00:00 (Sun)
  63814287600, #      utc_end 2023-03-12 07:00:00 (Sun)
  63803379600, #  local_start 2022-11-06 01:00:00 (Sun)
  63814269600, #    local_end 2023-03-12 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63814287600, #    utc_start 2023-03-12 07:00:00 (Sun)
  63834847200, #      utc_end 2023-11-05 06:00:00 (Sun)
  63814273200, #  local_start 2023-03-12 03:00:00 (Sun)
  63834832800, #    local_end 2023-11-05 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63834847200, #    utc_start 2023-11-05 06:00:00 (Sun)
  63845737200, #      utc_end 2024-03-10 07:00:00 (Sun)
  63834829200, #  local_start 2023-11-05 01:00:00 (Sun)
  63845719200, #    local_end 2024-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63845737200, #    utc_start 2024-03-10 07:00:00 (Sun)
  63866296800, #      utc_end 2024-11-03 06:00:00 (Sun)
  63845722800, #  local_start 2024-03-10 03:00:00 (Sun)
  63866282400, #    local_end 2024-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63866296800, #    utc_start 2024-11-03 06:00:00 (Sun)
  63877186800, #      utc_end 2025-03-09 07:00:00 (Sun)
  63866278800, #  local_start 2024-11-03 01:00:00 (Sun)
  63877168800, #    local_end 2025-03-09 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63877186800, #    utc_start 2025-03-09 07:00:00 (Sun)
  63897746400, #      utc_end 2025-11-02 06:00:00 (Sun)
  63877172400, #  local_start 2025-03-09 03:00:00 (Sun)
  63897732000, #    local_end 2025-11-02 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63897746400, #    utc_start 2025-11-02 06:00:00 (Sun)
  63908636400, #      utc_end 2026-03-08 07:00:00 (Sun)
  63897728400, #  local_start 2025-11-02 01:00:00 (Sun)
  63908618400, #    local_end 2026-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63908636400, #    utc_start 2026-03-08 07:00:00 (Sun)
  63929196000, #      utc_end 2026-11-01 06:00:00 (Sun)
  63908622000, #  local_start 2026-03-08 03:00:00 (Sun)
  63929181600, #    local_end 2026-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63929196000, #    utc_start 2026-11-01 06:00:00 (Sun)
  63940690800, #      utc_end 2027-03-14 07:00:00 (Sun)
  63929178000, #  local_start 2026-11-01 01:00:00 (Sun)
  63940672800, #    local_end 2027-03-14 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63940690800, #    utc_start 2027-03-14 07:00:00 (Sun)
  63961250400, #      utc_end 2027-11-07 06:00:00 (Sun)
  63940676400, #  local_start 2027-03-14 03:00:00 (Sun)
  63961236000, #    local_end 2027-11-07 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63961250400, #    utc_start 2027-11-07 06:00:00 (Sun)
  63972140400, #      utc_end 2028-03-12 07:00:00 (Sun)
  63961232400, #  local_start 2027-11-07 01:00:00 (Sun)
  63972122400, #    local_end 2028-03-12 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63972140400, #    utc_start 2028-03-12 07:00:00 (Sun)
  63992700000, #      utc_end 2028-11-05 06:00:00 (Sun)
  63972126000, #  local_start 2028-03-12 03:00:00 (Sun)
  63992685600, #    local_end 2028-11-05 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63992700000, #    utc_start 2028-11-05 06:00:00 (Sun)
  64003590000, #      utc_end 2029-03-11 07:00:00 (Sun)
  63992682000, #  local_start 2028-11-05 01:00:00 (Sun)
  64003572000, #    local_end 2029-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  64003590000, #    utc_start 2029-03-11 07:00:00 (Sun)
  64024149600, #      utc_end 2029-11-04 06:00:00 (Sun)
  64003575600, #  local_start 2029-03-11 03:00:00 (Sun)
  64024135200, #    local_end 2029-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  64024149600, #    utc_start 2029-11-04 06:00:00 (Sun)
  64035039600, #      utc_end 2030-03-10 07:00:00 (Sun)
  64024131600, #  local_start 2029-11-04 01:00:00 (Sun)
  64035021600, #    local_end 2030-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  64035039600, #    utc_start 2030-03-10 07:00:00 (Sun)
  64055599200, #      utc_end 2030-11-03 06:00:00 (Sun)
  64035025200, #  local_start 2030-03-10 03:00:00 (Sun)
  64055584800, #    local_end 2030-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {111}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -18000 }
  
  my $last_observance = bless( {
    'format' => 'E%sT',
    'gmtoff' => '-5:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 718067,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 718067,
      'utc_rd_secs' => 0,
      'utc_year' => 1968
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -18000,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 718067,
      'local_rd_secs' => 18000,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 718067,
      'utc_rd_secs' => 18000,
      'utc_year' => 1968
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Mar',
      'letter' => 'D',
      'name' => 'US',
      'offset_from_std' => 3600,
      'on' => 'Sun>=8',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Nov',
      'letter' => 'S',
      'name' => 'US',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_NEW_YORK

    $main::fatpacked{"DateTime/TimeZone/America/Nipigon.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_NIPIGON';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Nipigon;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Nipigon::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59768949184, #      utc_end 1895-01-01 05:53:04 (Tue)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59768928000, #    local_end 1895-01-01 00:00:00 (Tue)
  -21184,
  0,
  'LMT',
      ],
      [
  59768949184, #    utc_start 1895-01-01 05:53:04 (Tue)
  60503612400, #      utc_end 1918-04-14 07:00:00 (Sun)
  59768931184, #  local_start 1895-01-01 00:53:04 (Tue)
  60503594400, #    local_end 1918-04-14 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  60503612400, #    utc_start 1918-04-14 07:00:00 (Sun)
  60520543200, #      utc_end 1918-10-27 06:00:00 (Sun)
  60503598000, #  local_start 1918-04-14 03:00:00 (Sun)
  60520528800, #    local_end 1918-10-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  60520543200, #    utc_start 1918-10-27 06:00:00 (Sun)
  61212430800, #      utc_end 1940-09-29 05:00:00 (Sun)
  60520525200, #  local_start 1918-10-27 01:00:00 (Sun)
  61212412800, #    local_end 1940-09-29 00:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  61212430800, #    utc_start 1940-09-29 05:00:00 (Sun)
  61255465200, #      utc_end 1942-02-09 07:00:00 (Mon)
  61212416400, #  local_start 1940-09-29 01:00:00 (Sun)
  61255450800, #    local_end 1942-02-09 03:00:00 (Mon)
  -14400,
  1,
  'EDT',
      ],
      [
  61255465200, #    utc_start 1942-02-09 07:00:00 (Mon)
  61366287600, #      utc_end 1945-08-14 23:00:00 (Tue)
  61255450800, #  local_start 1942-02-09 03:00:00 (Mon)
  61366273200, #    local_end 1945-08-14 19:00:00 (Tue)
  -14400,
  1,
  'EWT',
      ],
      [
  61366287600, #    utc_start 1945-08-14 23:00:00 (Tue)
  61370287200, #      utc_end 1945-09-30 06:00:00 (Sun)
  61366273200, #  local_start 1945-08-14 19:00:00 (Tue)
  61370272800, #    local_end 1945-09-30 02:00:00 (Sun)
  -14400,
  1,
  'EPT',
      ],
      [
  61370287200, #    utc_start 1945-09-30 06:00:00 (Sun)
  62272047600, #      utc_end 1974-04-28 07:00:00 (Sun)
  61370269200, #  local_start 1945-09-30 01:00:00 (Sun)
  62272029600, #    local_end 1974-04-28 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62272047600, #    utc_start 1974-04-28 07:00:00 (Sun)
  62287768800, #      utc_end 1974-10-27 06:00:00 (Sun)
  62272033200, #  local_start 1974-04-28 03:00:00 (Sun)
  62287754400, #    local_end 1974-10-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62287768800, #    utc_start 1974-10-27 06:00:00 (Sun)
  62303497200, #      utc_end 1975-04-27 07:00:00 (Sun)
  62287750800, #  local_start 1974-10-27 01:00:00 (Sun)
  62303479200, #    local_end 1975-04-27 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62303497200, #    utc_start 1975-04-27 07:00:00 (Sun)
  62319218400, #      utc_end 1975-10-26 06:00:00 (Sun)
  62303482800, #  local_start 1975-04-27 03:00:00 (Sun)
  62319204000, #    local_end 1975-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62319218400, #    utc_start 1975-10-26 06:00:00 (Sun)
  62334946800, #      utc_end 1976-04-25 07:00:00 (Sun)
  62319200400, #  local_start 1975-10-26 01:00:00 (Sun)
  62334928800, #    local_end 1976-04-25 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62334946800, #    utc_start 1976-04-25 07:00:00 (Sun)
  62351272800, #      utc_end 1976-10-31 06:00:00 (Sun)
  62334932400, #  local_start 1976-04-25 03:00:00 (Sun)
  62351258400, #    local_end 1976-10-31 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62351272800, #    utc_start 1976-10-31 06:00:00 (Sun)
  62366396400, #      utc_end 1977-04-24 07:00:00 (Sun)
  62351254800, #  local_start 1976-10-31 01:00:00 (Sun)
  62366378400, #    local_end 1977-04-24 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62366396400, #    utc_start 1977-04-24 07:00:00 (Sun)
  62382722400, #      utc_end 1977-10-30 06:00:00 (Sun)
  62366382000, #  local_start 1977-04-24 03:00:00 (Sun)
  62382708000, #    local_end 1977-10-30 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62382722400, #    utc_start 1977-10-30 06:00:00 (Sun)
  62398450800, #      utc_end 1978-04-30 07:00:00 (Sun)
  62382704400, #  local_start 1977-10-30 01:00:00 (Sun)
  62398432800, #    local_end 1978-04-30 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62398450800, #    utc_start 1978-04-30 07:00:00 (Sun)
  62414172000, #      utc_end 1978-10-29 06:00:00 (Sun)
  62398436400, #  local_start 1978-04-30 03:00:00 (Sun)
  62414157600, #    local_end 1978-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62414172000, #    utc_start 1978-10-29 06:00:00 (Sun)
  62429900400, #      utc_end 1979-04-29 07:00:00 (Sun)
  62414154000, #  local_start 1978-10-29 01:00:00 (Sun)
  62429882400, #    local_end 1979-04-29 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62429900400, #    utc_start 1979-04-29 07:00:00 (Sun)
  62445621600, #      utc_end 1979-10-28 06:00:00 (Sun)
  62429886000, #  local_start 1979-04-29 03:00:00 (Sun)
  62445607200, #    local_end 1979-10-28 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62445621600, #    utc_start 1979-10-28 06:00:00 (Sun)
  62461350000, #      utc_end 1980-04-27 07:00:00 (Sun)
  62445603600, #  local_start 1979-10-28 01:00:00 (Sun)
  62461332000, #    local_end 1980-04-27 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62461350000, #    utc_start 1980-04-27 07:00:00 (Sun)
  62477071200, #      utc_end 1980-10-26 06:00:00 (Sun)
  62461335600, #  local_start 1980-04-27 03:00:00 (Sun)
  62477056800, #    local_end 1980-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62477071200, #    utc_start 1980-10-26 06:00:00 (Sun)
  62492799600, #      utc_end 1981-04-26 07:00:00 (Sun)
  62477053200, #  local_start 1980-10-26 01:00:00 (Sun)
  62492781600, #    local_end 1981-04-26 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62492799600, #    utc_start 1981-04-26 07:00:00 (Sun)
  62508520800, #      utc_end 1981-10-25 06:00:00 (Sun)
  62492785200, #  local_start 1981-04-26 03:00:00 (Sun)
  62508506400, #    local_end 1981-10-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62508520800, #    utc_start 1981-10-25 06:00:00 (Sun)
  62524249200, #      utc_end 1982-04-25 07:00:00 (Sun)
  62508502800, #  local_start 1981-10-25 01:00:00 (Sun)
  62524231200, #    local_end 1982-04-25 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62524249200, #    utc_start 1982-04-25 07:00:00 (Sun)
  62540575200, #      utc_end 1982-10-31 06:00:00 (Sun)
  62524234800, #  local_start 1982-04-25 03:00:00 (Sun)
  62540560800, #    local_end 1982-10-31 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62540575200, #    utc_start 1982-10-31 06:00:00 (Sun)
  62555698800, #      utc_end 1983-04-24 07:00:00 (Sun)
  62540557200, #  local_start 1982-10-31 01:00:00 (Sun)
  62555680800, #    local_end 1983-04-24 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62555698800, #    utc_start 1983-04-24 07:00:00 (Sun)
  62572024800, #      utc_end 1983-10-30 06:00:00 (Sun)
  62555684400, #  local_start 1983-04-24 03:00:00 (Sun)
  62572010400, #    local_end 1983-10-30 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62572024800, #    utc_start 1983-10-30 06:00:00 (Sun)
  62587753200, #      utc_end 1984-04-29 07:00:00 (Sun)
  62572006800, #  local_start 1983-10-30 01:00:00 (Sun)
  62587735200, #    local_end 1984-04-29 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62587753200, #    utc_start 1984-04-29 07:00:00 (Sun)
  62603474400, #      utc_end 1984-10-28 06:00:00 (Sun)
  62587738800, #  local_start 1984-04-29 03:00:00 (Sun)
  62603460000, #    local_end 1984-10-28 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62603474400, #    utc_start 1984-10-28 06:00:00 (Sun)
  62619202800, #      utc_end 1985-04-28 07:00:00 (Sun)
  62603456400, #  local_start 1984-10-28 01:00:00 (Sun)
  62619184800, #    local_end 1985-04-28 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62619202800, #    utc_start 1985-04-28 07:00:00 (Sun)
  62634924000, #      utc_end 1985-10-27 06:00:00 (Sun)
  62619188400, #  local_start 1985-04-28 03:00:00 (Sun)
  62634909600, #    local_end 1985-10-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62634924000, #    utc_start 1985-10-27 06:00:00 (Sun)
  62650652400, #      utc_end 1986-04-27 07:00:00 (Sun)
  62634906000, #  local_start 1985-10-27 01:00:00 (Sun)
  62650634400, #    local_end 1986-04-27 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62650652400, #    utc_start 1986-04-27 07:00:00 (Sun)
  62666373600, #      utc_end 1986-10-26 06:00:00 (Sun)
  62650638000, #  local_start 1986-04-27 03:00:00 (Sun)
  62666359200, #    local_end 1986-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62666373600, #    utc_start 1986-10-26 06:00:00 (Sun)
  62680287600, #      utc_end 1987-04-05 07:00:00 (Sun)
  62666355600, #  local_start 1986-10-26 01:00:00 (Sun)
  62680269600, #    local_end 1987-04-05 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62680287600, #    utc_start 1987-04-05 07:00:00 (Sun)
  62697823200, #      utc_end 1987-10-25 06:00:00 (Sun)
  62680273200, #  local_start 1987-04-05 03:00:00 (Sun)
  62697808800, #    local_end 1987-10-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62697823200, #    utc_start 1987-10-25 06:00:00 (Sun)
  62711737200, #      utc_end 1988-04-03 07:00:00 (Sun)
  62697805200, #  local_start 1987-10-25 01:00:00 (Sun)
  62711719200, #    local_end 1988-04-03 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62711737200, #    utc_start 1988-04-03 07:00:00 (Sun)
  62729877600, #      utc_end 1988-10-30 06:00:00 (Sun)
  62711722800, #  local_start 1988-04-03 03:00:00 (Sun)
  62729863200, #    local_end 1988-10-30 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62729877600, #    utc_start 1988-10-30 06:00:00 (Sun)
  62743186800, #      utc_end 1989-04-02 07:00:00 (Sun)
  62729859600, #  local_start 1988-10-30 01:00:00 (Sun)
  62743168800, #    local_end 1989-04-02 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62743186800, #    utc_start 1989-04-02 07:00:00 (Sun)
  62761327200, #      utc_end 1989-10-29 06:00:00 (Sun)
  62743172400, #  local_start 1989-04-02 03:00:00 (Sun)
  62761312800, #    local_end 1989-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62761327200, #    utc_start 1989-10-29 06:00:00 (Sun)
  62774636400, #      utc_end 1990-04-01 07:00:00 (Sun)
  62761309200, #  local_start 1989-10-29 01:00:00 (Sun)
  62774618400, #    local_end 1990-04-01 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62774636400, #    utc_start 1990-04-01 07:00:00 (Sun)
  62792776800, #      utc_end 1990-10-28 06:00:00 (Sun)
  62774622000, #  local_start 1990-04-01 03:00:00 (Sun)
  62792762400, #    local_end 1990-10-28 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62792776800, #    utc_start 1990-10-28 06:00:00 (Sun)
  62806690800, #      utc_end 1991-04-07 07:00:00 (Sun)
  62792758800, #  local_start 1990-10-28 01:00:00 (Sun)
  62806672800, #    local_end 1991-04-07 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62806690800, #    utc_start 1991-04-07 07:00:00 (Sun)
  62824226400, #      utc_end 1991-10-27 06:00:00 (Sun)
  62806676400, #  local_start 1991-04-07 03:00:00 (Sun)
  62824212000, #    local_end 1991-10-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62824226400, #    utc_start 1991-10-27 06:00:00 (Sun)
  62838140400, #      utc_end 1992-04-05 07:00:00 (Sun)
  62824208400, #  local_start 1991-10-27 01:00:00 (Sun)
  62838122400, #    local_end 1992-04-05 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62838140400, #    utc_start 1992-04-05 07:00:00 (Sun)
  62855676000, #      utc_end 1992-10-25 06:00:00 (Sun)
  62838126000, #  local_start 1992-04-05 03:00:00 (Sun)
  62855661600, #    local_end 1992-10-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62855676000, #    utc_start 1992-10-25 06:00:00 (Sun)
  62869590000, #      utc_end 1993-04-04 07:00:00 (Sun)
  62855658000, #  local_start 1992-10-25 01:00:00 (Sun)
  62869572000, #    local_end 1993-04-04 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62869590000, #    utc_start 1993-04-04 07:00:00 (Sun)
  62887730400, #      utc_end 1993-10-31 06:00:00 (Sun)
  62869575600, #  local_start 1993-04-04 03:00:00 (Sun)
  62887716000, #    local_end 1993-10-31 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62887730400, #    utc_start 1993-10-31 06:00:00 (Sun)
  62901039600, #      utc_end 1994-04-03 07:00:00 (Sun)
  62887712400, #  local_start 1993-10-31 01:00:00 (Sun)
  62901021600, #    local_end 1994-04-03 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62901039600, #    utc_start 1994-04-03 07:00:00 (Sun)
  62919180000, #      utc_end 1994-10-30 06:00:00 (Sun)
  62901025200, #  local_start 1994-04-03 03:00:00 (Sun)
  62919165600, #    local_end 1994-10-30 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62919180000, #    utc_start 1994-10-30 06:00:00 (Sun)
  62932489200, #      utc_end 1995-04-02 07:00:00 (Sun)
  62919162000, #  local_start 1994-10-30 01:00:00 (Sun)
  62932471200, #    local_end 1995-04-02 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62932489200, #    utc_start 1995-04-02 07:00:00 (Sun)
  62950629600, #      utc_end 1995-10-29 06:00:00 (Sun)
  62932474800, #  local_start 1995-04-02 03:00:00 (Sun)
  62950615200, #    local_end 1995-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62950629600, #    utc_start 1995-10-29 06:00:00 (Sun)
  62964543600, #      utc_end 1996-04-07 07:00:00 (Sun)
  62950611600, #  local_start 1995-10-29 01:00:00 (Sun)
  62964525600, #    local_end 1996-04-07 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62964543600, #    utc_start 1996-04-07 07:00:00 (Sun)
  62982079200, #      utc_end 1996-10-27 06:00:00 (Sun)
  62964529200, #  local_start 1996-04-07 03:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62982079200, #    utc_start 1996-10-27 06:00:00 (Sun)
  62995993200, #      utc_end 1997-04-06 07:00:00 (Sun)
  62982061200, #  local_start 1996-10-27 01:00:00 (Sun)
  62995975200, #    local_end 1997-04-06 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62995993200, #    utc_start 1997-04-06 07:00:00 (Sun)
  63013528800, #      utc_end 1997-10-26 06:00:00 (Sun)
  62995978800, #  local_start 1997-04-06 03:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63013528800, #    utc_start 1997-10-26 06:00:00 (Sun)
  63027442800, #      utc_end 1998-04-05 07:00:00 (Sun)
  63013510800, #  local_start 1997-10-26 01:00:00 (Sun)
  63027424800, #    local_end 1998-04-05 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63027442800, #    utc_start 1998-04-05 07:00:00 (Sun)
  63044978400, #      utc_end 1998-10-25 06:00:00 (Sun)
  63027428400, #  local_start 1998-04-05 03:00:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63044978400, #    utc_start 1998-10-25 06:00:00 (Sun)
  63058892400, #      utc_end 1999-04-04 07:00:00 (Sun)
  63044960400, #  local_start 1998-10-25 01:00:00 (Sun)
  63058874400, #    local_end 1999-04-04 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63058892400, #    utc_start 1999-04-04 07:00:00 (Sun)
  63077032800, #      utc_end 1999-10-31 06:00:00 (Sun)
  63058878000, #  local_start 1999-04-04 03:00:00 (Sun)
  63077018400, #    local_end 1999-10-31 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63077032800, #    utc_start 1999-10-31 06:00:00 (Sun)
  63090342000, #      utc_end 2000-04-02 07:00:00 (Sun)
  63077014800, #  local_start 1999-10-31 01:00:00 (Sun)
  63090324000, #    local_end 2000-04-02 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63090342000, #    utc_start 2000-04-02 07:00:00 (Sun)
  63108482400, #      utc_end 2000-10-29 06:00:00 (Sun)
  63090327600, #  local_start 2000-04-02 03:00:00 (Sun)
  63108468000, #    local_end 2000-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63108482400, #    utc_start 2000-10-29 06:00:00 (Sun)
  63121791600, #      utc_end 2001-04-01 07:00:00 (Sun)
  63108464400, #  local_start 2000-10-29 01:00:00 (Sun)
  63121773600, #    local_end 2001-04-01 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63121791600, #    utc_start 2001-04-01 07:00:00 (Sun)
  63139932000, #      utc_end 2001-10-28 06:00:00 (Sun)
  63121777200, #  local_start 2001-04-01 03:00:00 (Sun)
  63139917600, #    local_end 2001-10-28 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63139932000, #    utc_start 2001-10-28 06:00:00 (Sun)
  63153846000, #      utc_end 2002-04-07 07:00:00 (Sun)
  63139914000, #  local_start 2001-10-28 01:00:00 (Sun)
  63153828000, #    local_end 2002-04-07 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63153846000, #    utc_start 2002-04-07 07:00:00 (Sun)
  63171381600, #      utc_end 2002-10-27 06:00:00 (Sun)
  63153831600, #  local_start 2002-04-07 03:00:00 (Sun)
  63171367200, #    local_end 2002-10-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63171381600, #    utc_start 2002-10-27 06:00:00 (Sun)
  63185295600, #      utc_end 2003-04-06 07:00:00 (Sun)
  63171363600, #  local_start 2002-10-27 01:00:00 (Sun)
  63185277600, #    local_end 2003-04-06 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63185295600, #    utc_start 2003-04-06 07:00:00 (Sun)
  63202831200, #      utc_end 2003-10-26 06:00:00 (Sun)
  63185281200, #  local_start 2003-04-06 03:00:00 (Sun)
  63202816800, #    local_end 2003-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63202831200, #    utc_start 2003-10-26 06:00:00 (Sun)
  63216745200, #      utc_end 2004-04-04 07:00:00 (Sun)
  63202813200, #  local_start 2003-10-26 01:00:00 (Sun)
  63216727200, #    local_end 2004-04-04 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63216745200, #    utc_start 2004-04-04 07:00:00 (Sun)
  63234885600, #      utc_end 2004-10-31 06:00:00 (Sun)
  63216730800, #  local_start 2004-04-04 03:00:00 (Sun)
  63234871200, #    local_end 2004-10-31 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63234885600, #    utc_start 2004-10-31 06:00:00 (Sun)
  63248194800, #      utc_end 2005-04-03 07:00:00 (Sun)
  63234867600, #  local_start 2004-10-31 01:00:00 (Sun)
  63248176800, #    local_end 2005-04-03 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63248194800, #    utc_start 2005-04-03 07:00:00 (Sun)
  63266335200, #      utc_end 2005-10-30 06:00:00 (Sun)
  63248180400, #  local_start 2005-04-03 03:00:00 (Sun)
  63266320800, #    local_end 2005-10-30 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63266335200, #    utc_start 2005-10-30 06:00:00 (Sun)
  63279644400, #      utc_end 2006-04-02 07:00:00 (Sun)
  63266317200, #  local_start 2005-10-30 01:00:00 (Sun)
  63279626400, #    local_end 2006-04-02 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63279644400, #    utc_start 2006-04-02 07:00:00 (Sun)
  63297784800, #      utc_end 2006-10-29 06:00:00 (Sun)
  63279630000, #  local_start 2006-04-02 03:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63297784800, #    utc_start 2006-10-29 06:00:00 (Sun)
  63309279600, #      utc_end 2007-03-11 07:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63309261600, #    local_end 2007-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63309279600, #    utc_start 2007-03-11 07:00:00 (Sun)
  63329839200, #      utc_end 2007-11-04 06:00:00 (Sun)
  63309265200, #  local_start 2007-03-11 03:00:00 (Sun)
  63329824800, #    local_end 2007-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63329839200, #    utc_start 2007-11-04 06:00:00 (Sun)
  63340729200, #      utc_end 2008-03-09 07:00:00 (Sun)
  63329821200, #  local_start 2007-11-04 01:00:00 (Sun)
  63340711200, #    local_end 2008-03-09 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63340729200, #    utc_start 2008-03-09 07:00:00 (Sun)
  63361288800, #      utc_end 2008-11-02 06:00:00 (Sun)
  63340714800, #  local_start 2008-03-09 03:00:00 (Sun)
  63361274400, #    local_end 2008-11-02 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63361288800, #    utc_start 2008-11-02 06:00:00 (Sun)
  63372178800, #      utc_end 2009-03-08 07:00:00 (Sun)
  63361270800, #  local_start 2008-11-02 01:00:00 (Sun)
  63372160800, #    local_end 2009-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63372178800, #    utc_start 2009-03-08 07:00:00 (Sun)
  63392738400, #      utc_end 2009-11-01 06:00:00 (Sun)
  63372164400, #  local_start 2009-03-08 03:00:00 (Sun)
  63392724000, #    local_end 2009-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63392738400, #    utc_start 2009-11-01 06:00:00 (Sun)
  63404233200, #      utc_end 2010-03-14 07:00:00 (Sun)
  63392720400, #  local_start 2009-11-01 01:00:00 (Sun)
  63404215200, #    local_end 2010-03-14 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63404233200, #    utc_start 2010-03-14 07:00:00 (Sun)
  63424792800, #      utc_end 2010-11-07 06:00:00 (Sun)
  63404218800, #  local_start 2010-03-14 03:00:00 (Sun)
  63424778400, #    local_end 2010-11-07 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63424792800, #    utc_start 2010-11-07 06:00:00 (Sun)
  63435682800, #      utc_end 2011-03-13 07:00:00 (Sun)
  63424774800, #  local_start 2010-11-07 01:00:00 (Sun)
  63435664800, #    local_end 2011-03-13 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63435682800, #    utc_start 2011-03-13 07:00:00 (Sun)
  63456242400, #      utc_end 2011-11-06 06:00:00 (Sun)
  63435668400, #  local_start 2011-03-13 03:00:00 (Sun)
  63456228000, #    local_end 2011-11-06 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63456242400, #    utc_start 2011-11-06 06:00:00 (Sun)
  63467132400, #      utc_end 2012-03-11 07:00:00 (Sun)
  63456224400, #  local_start 2011-11-06 01:00:00 (Sun)
  63467114400, #    local_end 2012-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63467132400, #    utc_start 2012-03-11 07:00:00 (Sun)
  63487692000, #      utc_end 2012-11-04 06:00:00 (Sun)
  63467118000, #  local_start 2012-03-11 03:00:00 (Sun)
  63487677600, #    local_end 2012-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63487692000, #    utc_start 2012-11-04 06:00:00 (Sun)
  63498582000, #      utc_end 2013-03-10 07:00:00 (Sun)
  63487674000, #  local_start 2012-11-04 01:00:00 (Sun)
  63498564000, #    local_end 2013-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63498582000, #    utc_start 2013-03-10 07:00:00 (Sun)
  63519141600, #      utc_end 2013-11-03 06:00:00 (Sun)
  63498567600, #  local_start 2013-03-10 03:00:00 (Sun)
  63519127200, #    local_end 2013-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63519141600, #    utc_start 2013-11-03 06:00:00 (Sun)
  63530031600, #      utc_end 2014-03-09 07:00:00 (Sun)
  63519123600, #  local_start 2013-11-03 01:00:00 (Sun)
  63530013600, #    local_end 2014-03-09 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63530031600, #    utc_start 2014-03-09 07:00:00 (Sun)
  63550591200, #      utc_end 2014-11-02 06:00:00 (Sun)
  63530017200, #  local_start 2014-03-09 03:00:00 (Sun)
  63550576800, #    local_end 2014-11-02 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63550591200, #    utc_start 2014-11-02 06:00:00 (Sun)
  63561481200, #      utc_end 2015-03-08 07:00:00 (Sun)
  63550573200, #  local_start 2014-11-02 01:00:00 (Sun)
  63561463200, #    local_end 2015-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63561481200, #    utc_start 2015-03-08 07:00:00 (Sun)
  63582040800, #      utc_end 2015-11-01 06:00:00 (Sun)
  63561466800, #  local_start 2015-03-08 03:00:00 (Sun)
  63582026400, #    local_end 2015-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63582040800, #    utc_start 2015-11-01 06:00:00 (Sun)
  63593535600, #      utc_end 2016-03-13 07:00:00 (Sun)
  63582022800, #  local_start 2015-11-01 01:00:00 (Sun)
  63593517600, #    local_end 2016-03-13 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63593535600, #    utc_start 2016-03-13 07:00:00 (Sun)
  63614095200, #      utc_end 2016-11-06 06:00:00 (Sun)
  63593521200, #  local_start 2016-03-13 03:00:00 (Sun)
  63614080800, #    local_end 2016-11-06 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63614095200, #    utc_start 2016-11-06 06:00:00 (Sun)
  63624985200, #      utc_end 2017-03-12 07:00:00 (Sun)
  63614077200, #  local_start 2016-11-06 01:00:00 (Sun)
  63624967200, #    local_end 2017-03-12 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63624985200, #    utc_start 2017-03-12 07:00:00 (Sun)
  63645544800, #      utc_end 2017-11-05 06:00:00 (Sun)
  63624970800, #  local_start 2017-03-12 03:00:00 (Sun)
  63645530400, #    local_end 2017-11-05 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63645544800, #    utc_start 2017-11-05 06:00:00 (Sun)
  63656434800, #      utc_end 2018-03-11 07:00:00 (Sun)
  63645526800, #  local_start 2017-11-05 01:00:00 (Sun)
  63656416800, #    local_end 2018-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63656434800, #    utc_start 2018-03-11 07:00:00 (Sun)
  63676994400, #      utc_end 2018-11-04 06:00:00 (Sun)
  63656420400, #  local_start 2018-03-11 03:00:00 (Sun)
  63676980000, #    local_end 2018-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63676994400, #    utc_start 2018-11-04 06:00:00 (Sun)
  63687884400, #      utc_end 2019-03-10 07:00:00 (Sun)
  63676976400, #  local_start 2018-11-04 01:00:00 (Sun)
  63687866400, #    local_end 2019-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63687884400, #    utc_start 2019-03-10 07:00:00 (Sun)
  63708444000, #      utc_end 2019-11-03 06:00:00 (Sun)
  63687870000, #  local_start 2019-03-10 03:00:00 (Sun)
  63708429600, #    local_end 2019-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63708444000, #    utc_start 2019-11-03 06:00:00 (Sun)
  63719334000, #      utc_end 2020-03-08 07:00:00 (Sun)
  63708426000, #  local_start 2019-11-03 01:00:00 (Sun)
  63719316000, #    local_end 2020-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63719334000, #    utc_start 2020-03-08 07:00:00 (Sun)
  63739893600, #      utc_end 2020-11-01 06:00:00 (Sun)
  63719319600, #  local_start 2020-03-08 03:00:00 (Sun)
  63739879200, #    local_end 2020-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63739893600, #    utc_start 2020-11-01 06:00:00 (Sun)
  63751388400, #      utc_end 2021-03-14 07:00:00 (Sun)
  63739875600, #  local_start 2020-11-01 01:00:00 (Sun)
  63751370400, #    local_end 2021-03-14 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63751388400, #    utc_start 2021-03-14 07:00:00 (Sun)
  63771948000, #      utc_end 2021-11-07 06:00:00 (Sun)
  63751374000, #  local_start 2021-03-14 03:00:00 (Sun)
  63771933600, #    local_end 2021-11-07 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63771948000, #    utc_start 2021-11-07 06:00:00 (Sun)
  63782838000, #      utc_end 2022-03-13 07:00:00 (Sun)
  63771930000, #  local_start 2021-11-07 01:00:00 (Sun)
  63782820000, #    local_end 2022-03-13 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63782838000, #    utc_start 2022-03-13 07:00:00 (Sun)
  63803397600, #      utc_end 2022-11-06 06:00:00 (Sun)
  63782823600, #  local_start 2022-03-13 03:00:00 (Sun)
  63803383200, #    local_end 2022-11-06 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63803397600, #    utc_start 2022-11-06 06:00:00 (Sun)
  63814287600, #      utc_end 2023-03-12 07:00:00 (Sun)
  63803379600, #  local_start 2022-11-06 01:00:00 (Sun)
  63814269600, #    local_end 2023-03-12 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63814287600, #    utc_start 2023-03-12 07:00:00 (Sun)
  63834847200, #      utc_end 2023-11-05 06:00:00 (Sun)
  63814273200, #  local_start 2023-03-12 03:00:00 (Sun)
  63834832800, #    local_end 2023-11-05 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63834847200, #    utc_start 2023-11-05 06:00:00 (Sun)
  63845737200, #      utc_end 2024-03-10 07:00:00 (Sun)
  63834829200, #  local_start 2023-11-05 01:00:00 (Sun)
  63845719200, #    local_end 2024-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63845737200, #    utc_start 2024-03-10 07:00:00 (Sun)
  63866296800, #      utc_end 2024-11-03 06:00:00 (Sun)
  63845722800, #  local_start 2024-03-10 03:00:00 (Sun)
  63866282400, #    local_end 2024-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63866296800, #    utc_start 2024-11-03 06:00:00 (Sun)
  63877186800, #      utc_end 2025-03-09 07:00:00 (Sun)
  63866278800, #  local_start 2024-11-03 01:00:00 (Sun)
  63877168800, #    local_end 2025-03-09 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63877186800, #    utc_start 2025-03-09 07:00:00 (Sun)
  63897746400, #      utc_end 2025-11-02 06:00:00 (Sun)
  63877172400, #  local_start 2025-03-09 03:00:00 (Sun)
  63897732000, #    local_end 2025-11-02 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63897746400, #    utc_start 2025-11-02 06:00:00 (Sun)
  63908636400, #      utc_end 2026-03-08 07:00:00 (Sun)
  63897728400, #  local_start 2025-11-02 01:00:00 (Sun)
  63908618400, #    local_end 2026-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63908636400, #    utc_start 2026-03-08 07:00:00 (Sun)
  63929196000, #      utc_end 2026-11-01 06:00:00 (Sun)
  63908622000, #  local_start 2026-03-08 03:00:00 (Sun)
  63929181600, #    local_end 2026-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63929196000, #    utc_start 2026-11-01 06:00:00 (Sun)
  63940690800, #      utc_end 2027-03-14 07:00:00 (Sun)
  63929178000, #  local_start 2026-11-01 01:00:00 (Sun)
  63940672800, #    local_end 2027-03-14 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63940690800, #    utc_start 2027-03-14 07:00:00 (Sun)
  63961250400, #      utc_end 2027-11-07 06:00:00 (Sun)
  63940676400, #  local_start 2027-03-14 03:00:00 (Sun)
  63961236000, #    local_end 2027-11-07 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63961250400, #    utc_start 2027-11-07 06:00:00 (Sun)
  63972140400, #      utc_end 2028-03-12 07:00:00 (Sun)
  63961232400, #  local_start 2027-11-07 01:00:00 (Sun)
  63972122400, #    local_end 2028-03-12 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63972140400, #    utc_start 2028-03-12 07:00:00 (Sun)
  63992700000, #      utc_end 2028-11-05 06:00:00 (Sun)
  63972126000, #  local_start 2028-03-12 03:00:00 (Sun)
  63992685600, #    local_end 2028-11-05 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63992700000, #    utc_start 2028-11-05 06:00:00 (Sun)
  64003590000, #      utc_end 2029-03-11 07:00:00 (Sun)
  63992682000, #  local_start 2028-11-05 01:00:00 (Sun)
  64003572000, #    local_end 2029-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  64003590000, #    utc_start 2029-03-11 07:00:00 (Sun)
  64024149600, #      utc_end 2029-11-04 06:00:00 (Sun)
  64003575600, #  local_start 2029-03-11 03:00:00 (Sun)
  64024135200, #    local_end 2029-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  64024149600, #    utc_start 2029-11-04 06:00:00 (Sun)
  64035039600, #      utc_end 2030-03-10 07:00:00 (Sun)
  64024131600, #  local_start 2029-11-04 01:00:00 (Sun)
  64035021600, #    local_end 2030-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  64035039600, #    utc_start 2030-03-10 07:00:00 (Sun)
  64055599200, #      utc_end 2030-11-03 06:00:00 (Sun)
  64035025200, #  local_start 2030-03-10 03:00:00 (Sun)
  64055584800, #    local_end 2030-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {61}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -18000 }
  
  my $last_observance = bless( {
    'format' => 'E%sT',
    'gmtoff' => '-5:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 708975,
      'local_rd_secs' => 10800,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 708975,
      'utc_rd_secs' => 10800,
      'utc_year' => 1943
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -18000,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 708975,
      'local_rd_secs' => 25200,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 708975,
      'utc_rd_secs' => 25200,
      'utc_year' => 1943
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Nov',
      'letter' => 'S',
      'name' => 'Canada',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Mar',
      'letter' => 'D',
      'name' => 'Canada',
      'offset_from_std' => 3600,
      'on' => 'Sun>=8',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_NIPIGON

    $main::fatpacked{"DateTime/TimeZone/America/Nome.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_NOME';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Nome;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Nome::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  58910459473, #      utc_end 1867-10-19 00:31:13 (Sat)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  58910506175, #    local_end 1867-10-19 13:29:35 (Sat)
  46702,
  0,
  'LMT',
      ],
      [
  58910459473, #    utc_start 1867-10-19 00:31:13 (Sat)
  59946735698, #      utc_end 1900-08-20 23:01:38 (Mon)
  58910419775, #  local_start 1867-10-18 13:29:35 (Fri)
  59946696000, #    local_end 1900-08-20 12:00:00 (Mon)
  -39698,
  0,
  'LMT',
      ],
      [
  59946735698, #    utc_start 1900-08-20 23:01:38 (Mon)
  61252110000, #      utc_end 1942-01-01 11:00:00 (Thu)
  59946696098, #  local_start 1900-08-20 12:01:38 (Mon)
  61252070400, #    local_end 1942-01-01 00:00:00 (Thu)
  -39600,
  0,
  'NST',
      ],
      [
  61252110000, #    utc_start 1942-01-01 11:00:00 (Thu)
  61255486800, #      utc_end 1942-02-09 13:00:00 (Mon)
  61252070400, #  local_start 1942-01-01 00:00:00 (Thu)
  61255447200, #    local_end 1942-02-09 02:00:00 (Mon)
  -39600,
  0,
  'NST',
      ],
      [
  61255486800, #    utc_start 1942-02-09 13:00:00 (Mon)
  61366287600, #      utc_end 1945-08-14 23:00:00 (Tue)
  61255450800, #  local_start 1942-02-09 03:00:00 (Mon)
  61366251600, #    local_end 1945-08-14 13:00:00 (Tue)
  -36000,
  1,
  'NWT',
      ],
      [
  61366287600, #    utc_start 1945-08-14 23:00:00 (Tue)
  61370308800, #      utc_end 1945-09-30 12:00:00 (Sun)
  61366251600, #  local_start 1945-08-14 13:00:00 (Tue)
  61370272800, #    local_end 1945-09-30 02:00:00 (Sun)
  -36000,
  1,
  'NPT',
      ],
      [
  61370308800, #    utc_start 1945-09-30 12:00:00 (Sun)
  61378340400, #      utc_end 1946-01-01 11:00:00 (Tue)
  61370269200, #  local_start 1945-09-30 01:00:00 (Sun)
  61378300800, #    local_end 1946-01-01 00:00:00 (Tue)
  -39600,
  0,
  'NST',
      ],
      [
  61378340400, #    utc_start 1946-01-01 11:00:00 (Tue)
  62048804400, #      utc_end 1967-04-01 11:00:00 (Sat)
  61378300800, #  local_start 1946-01-01 00:00:00 (Tue)
  62048764800, #    local_end 1967-04-01 00:00:00 (Sat)
  -39600,
  0,
  'NST',
      ],
      [
  62048804400, #    utc_start 1967-04-01 11:00:00 (Sat)
  62104186800, #      utc_end 1969-01-01 11:00:00 (Wed)
  62048764800, #  local_start 1967-04-01 00:00:00 (Sat)
  62104147200, #    local_end 1969-01-01 00:00:00 (Wed)
  -39600,
  0,
  'BST',
      ],
      [
  62104186800, #    utc_start 1969-01-01 11:00:00 (Wed)
  62114216400, #      utc_end 1969-04-27 13:00:00 (Sun)
  62104147200, #  local_start 1969-01-01 00:00:00 (Wed)
  62114176800, #    local_end 1969-04-27 02:00:00 (Sun)
  -39600,
  0,
  'BST',
      ],
      [
  62114216400, #    utc_start 1969-04-27 13:00:00 (Sun)
  62129937600, #      utc_end 1969-10-26 12:00:00 (Sun)
  62114180400, #  local_start 1969-04-27 03:00:00 (Sun)
  62129901600, #    local_end 1969-10-26 02:00:00 (Sun)
  -36000,
  1,
  'BDT',
      ],
      [
  62129937600, #    utc_start 1969-10-26 12:00:00 (Sun)
  62145666000, #      utc_end 1970-04-26 13:00:00 (Sun)
  62129898000, #  local_start 1969-10-26 01:00:00 (Sun)
  62145626400, #    local_end 1970-04-26 02:00:00 (Sun)
  -39600,
  0,
  'BST',
      ],
      [
  62145666000, #    utc_start 1970-04-26 13:00:00 (Sun)
  62161387200, #      utc_end 1970-10-25 12:00:00 (Sun)
  62145630000, #  local_start 1970-04-26 03:00:00 (Sun)
  62161351200, #    local_end 1970-10-25 02:00:00 (Sun)
  -36000,
  1,
  'BDT',
      ],
      [
  62161387200, #    utc_start 1970-10-25 12:00:00 (Sun)
  62177115600, #      utc_end 1971-04-25 13:00:00 (Sun)
  62161347600, #  local_start 1970-10-25 01:00:00 (Sun)
  62177076000, #    local_end 1971-04-25 02:00:00 (Sun)
  -39600,
  0,
  'BST',
      ],
      [
  62177115600, #    utc_start 1971-04-25 13:00:00 (Sun)
  62193441600, #      utc_end 1971-10-31 12:00:00 (Sun)
  62177079600, #  local_start 1971-04-25 03:00:00 (Sun)
  62193405600, #    local_end 1971-10-31 02:00:00 (Sun)
  -36000,
  1,
  'BDT',
      ],
      [
  62193441600, #    utc_start 1971-10-31 12:00:00 (Sun)
  62209170000, #      utc_end 1972-04-30 13:00:00 (Sun)
  62193402000, #  local_start 1971-10-31 01:00:00 (Sun)
  62209130400, #    local_end 1972-04-30 02:00:00 (Sun)
  -39600,
  0,
  'BST',
      ],
      [
  62209170000, #    utc_start 1972-04-30 13:00:00 (Sun)
  62224891200, #      utc_end 1972-10-29 12:00:00 (Sun)
  62209134000, #  local_start 1972-04-30 03:00:00 (Sun)
  62224855200, #    local_end 1972-10-29 02:00:00 (Sun)
  -36000,
  1,
  'BDT',
      ],
      [
  62224891200, #    utc_start 1972-10-29 12:00:00 (Sun)
  62240619600, #      utc_end 1973-04-29 13:00:00 (Sun)
  62224851600, #  local_start 1972-10-29 01:00:00 (Sun)
  62240580000, #    local_end 1973-04-29 02:00:00 (Sun)
  -39600,
  0,
  'BST',
      ],
      [
  62240619600, #    utc_start 1973-04-29 13:00:00 (Sun)
  62256340800, #      utc_end 1973-10-28 12:00:00 (Sun)
  62240583600, #  local_start 1973-04-29 03:00:00 (Sun)
  62256304800, #    local_end 1973-10-28 02:00:00 (Sun)
  -36000,
  1,
  'BDT',
      ],
      [
  62256340800, #    utc_start 1973-10-28 12:00:00 (Sun)
  62262392400, #      utc_end 1974-01-06 13:00:00 (Sun)
  62256301200, #  local_start 1973-10-28 01:00:00 (Sun)
  62262352800, #    local_end 1974-01-06 02:00:00 (Sun)
  -39600,
  0,
  'BST',
      ],
      [
  62262392400, #    utc_start 1974-01-06 13:00:00 (Sun)
  62287790400, #      utc_end 1974-10-27 12:00:00 (Sun)
  62262356400, #  local_start 1974-01-06 03:00:00 (Sun)
  62287754400, #    local_end 1974-10-27 02:00:00 (Sun)
  -36000,
  1,
  'BDT',
      ],
      [
  62287790400, #    utc_start 1974-10-27 12:00:00 (Sun)
  62298075600, #      utc_end 1975-02-23 13:00:00 (Sun)
  62287750800, #  local_start 1974-10-27 01:00:00 (Sun)
  62298036000, #    local_end 1975-02-23 02:00:00 (Sun)
  -39600,
  0,
  'BST',
      ],
      [
  62298075600, #    utc_start 1975-02-23 13:00:00 (Sun)
  62319240000, #      utc_end 1975-10-26 12:00:00 (Sun)
  62298039600, #  local_start 1975-02-23 03:00:00 (Sun)
  62319204000, #    local_end 1975-10-26 02:00:00 (Sun)
  -36000,
  1,
  'BDT',
      ],
      [
  62319240000, #    utc_start 1975-10-26 12:00:00 (Sun)
  62334968400, #      utc_end 1976-04-25 13:00:00 (Sun)
  62319200400, #  local_start 1975-10-26 01:00:00 (Sun)
  62334928800, #    local_end 1976-04-25 02:00:00 (Sun)
  -39600,
  0,
  'BST',
      ],
      [
  62334968400, #    utc_start 1976-04-25 13:00:00 (Sun)
  62351294400, #      utc_end 1976-10-31 12:00:00 (Sun)
  62334932400, #  local_start 1976-04-25 03:00:00 (Sun)
  62351258400, #    local_end 1976-10-31 02:00:00 (Sun)
  -36000,
  1,
  'BDT',
      ],
      [
  62351294400, #    utc_start 1976-10-31 12:00:00 (Sun)
  62366418000, #      utc_end 1977-04-24 13:00:00 (Sun)
  62351254800, #  local_start 1976-10-31 01:00:00 (Sun)
  62366378400, #    local_end 1977-04-24 02:00:00 (Sun)
  -39600,
  0,
  'BST',
      ],
      [
  62366418000, #    utc_start 1977-04-24 13:00:00 (Sun)
  62382744000, #      utc_end 1977-10-30 12:00:00 (Sun)
  62366382000, #  local_start 1977-04-24 03:00:00 (Sun)
  62382708000, #    local_end 1977-10-30 02:00:00 (Sun)
  -36000,
  1,
  'BDT',
      ],
      [
  62382744000, #    utc_start 1977-10-30 12:00:00 (Sun)
  62398472400, #      utc_end 1978-04-30 13:00:00 (Sun)
  62382704400, #  local_start 1977-10-30 01:00:00 (Sun)
  62398432800, #    local_end 1978-04-30 02:00:00 (Sun)
  -39600,
  0,
  'BST',
      ],
      [
  62398472400, #    utc_start 1978-04-30 13:00:00 (Sun)
  62414193600, #      utc_end 1978-10-29 12:00:00 (Sun)
  62398436400, #  local_start 1978-04-30 03:00:00 (Sun)
  62414157600, #    local_end 1978-10-29 02:00:00 (Sun)
  -36000,
  1,
  'BDT',
      ],
      [
  62414193600, #    utc_start 1978-10-29 12:00:00 (Sun)
  62429922000, #      utc_end 1979-04-29 13:00:00 (Sun)
  62414154000, #  local_start 1978-10-29 01:00:00 (Sun)
  62429882400, #    local_end 1979-04-29 02:00:00 (Sun)
  -39600,
  0,
  'BST',
      ],
      [
  62429922000, #    utc_start 1979-04-29 13:00:00 (Sun)
  62445643200, #      utc_end 1979-10-28 12:00:00 (Sun)
  62429886000, #  local_start 1979-04-29 03:00:00 (Sun)
  62445607200, #    local_end 1979-10-28 02:00:00 (Sun)
  -36000,
  1,
  'BDT',
      ],
      [
  62445643200, #    utc_start 1979-10-28 12:00:00 (Sun)
  62461371600, #      utc_end 1980-04-27 13:00:00 (Sun)
  62445603600, #  local_start 1979-10-28 01:00:00 (Sun)
  62461332000, #    local_end 1980-04-27 02:00:00 (Sun)
  -39600,
  0,
  'BST',
      ],
      [
  62461371600, #    utc_start 1980-04-27 13:00:00 (Sun)
  62477092800, #      utc_end 1980-10-26 12:00:00 (Sun)
  62461335600, #  local_start 1980-04-27 03:00:00 (Sun)
  62477056800, #    local_end 1980-10-26 02:00:00 (Sun)
  -36000,
  1,
  'BDT',
      ],
      [
  62477092800, #    utc_start 1980-10-26 12:00:00 (Sun)
  62492821200, #      utc_end 1981-04-26 13:00:00 (Sun)
  62477053200, #  local_start 1980-10-26 01:00:00 (Sun)
  62492781600, #    local_end 1981-04-26 02:00:00 (Sun)
  -39600,
  0,
  'BST',
      ],
      [
  62492821200, #    utc_start 1981-04-26 13:00:00 (Sun)
  62508542400, #      utc_end 1981-10-25 12:00:00 (Sun)
  62492785200, #  local_start 1981-04-26 03:00:00 (Sun)
  62508506400, #    local_end 1981-10-25 02:00:00 (Sun)
  -36000,
  1,
  'BDT',
      ],
      [
  62508542400, #    utc_start 1981-10-25 12:00:00 (Sun)
  62524270800, #      utc_end 1982-04-25 13:00:00 (Sun)
  62508502800, #  local_start 1981-10-25 01:00:00 (Sun)
  62524231200, #    local_end 1982-04-25 02:00:00 (Sun)
  -39600,
  0,
  'BST',
      ],
      [
  62524270800, #    utc_start 1982-04-25 13:00:00 (Sun)
  62540596800, #      utc_end 1982-10-31 12:00:00 (Sun)
  62524234800, #  local_start 1982-04-25 03:00:00 (Sun)
  62540560800, #    local_end 1982-10-31 02:00:00 (Sun)
  -36000,
  1,
  'BDT',
      ],
      [
  62540596800, #    utc_start 1982-10-31 12:00:00 (Sun)
  62555720400, #      utc_end 1983-04-24 13:00:00 (Sun)
  62540557200, #  local_start 1982-10-31 01:00:00 (Sun)
  62555680800, #    local_end 1983-04-24 02:00:00 (Sun)
  -39600,
  0,
  'BST',
      ],
      [
  62555720400, #    utc_start 1983-04-24 13:00:00 (Sun)
  62572046400, #      utc_end 1983-10-30 12:00:00 (Sun)
  62555684400, #  local_start 1983-04-24 03:00:00 (Sun)
  62572010400, #    local_end 1983-10-30 02:00:00 (Sun)
  -36000,
  1,
  'BDT',
      ],
      [
  62572046400, #    utc_start 1983-10-30 12:00:00 (Sun)
  62574714000, #      utc_end 1983-11-30 09:00:00 (Wed)
  62572014000, #  local_start 1983-10-30 03:00:00 (Sun)
  62574681600, #    local_end 1983-11-30 00:00:00 (Wed)
  -32400,
  0,
  'YST',
      ],
      [
  62574714000, #    utc_start 1983-11-30 09:00:00 (Wed)
  62587767600, #      utc_end 1984-04-29 11:00:00 (Sun)
  62574681600, #  local_start 1983-11-30 00:00:00 (Wed)
  62587735200, #    local_end 1984-04-29 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62587767600, #    utc_start 1984-04-29 11:00:00 (Sun)
  62603488800, #      utc_end 1984-10-28 10:00:00 (Sun)
  62587738800, #  local_start 1984-04-29 03:00:00 (Sun)
  62603460000, #    local_end 1984-10-28 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  62603488800, #    utc_start 1984-10-28 10:00:00 (Sun)
  62619217200, #      utc_end 1985-04-28 11:00:00 (Sun)
  62603456400, #  local_start 1984-10-28 01:00:00 (Sun)
  62619184800, #    local_end 1985-04-28 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62619217200, #    utc_start 1985-04-28 11:00:00 (Sun)
  62634938400, #      utc_end 1985-10-27 10:00:00 (Sun)
  62619188400, #  local_start 1985-04-28 03:00:00 (Sun)
  62634909600, #    local_end 1985-10-27 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  62634938400, #    utc_start 1985-10-27 10:00:00 (Sun)
  62650666800, #      utc_end 1986-04-27 11:00:00 (Sun)
  62634906000, #  local_start 1985-10-27 01:00:00 (Sun)
  62650634400, #    local_end 1986-04-27 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62650666800, #    utc_start 1986-04-27 11:00:00 (Sun)
  62666388000, #      utc_end 1986-10-26 10:00:00 (Sun)
  62650638000, #  local_start 1986-04-27 03:00:00 (Sun)
  62666359200, #    local_end 1986-10-26 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  62666388000, #    utc_start 1986-10-26 10:00:00 (Sun)
  62680302000, #      utc_end 1987-04-05 11:00:00 (Sun)
  62666355600, #  local_start 1986-10-26 01:00:00 (Sun)
  62680269600, #    local_end 1987-04-05 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62680302000, #    utc_start 1987-04-05 11:00:00 (Sun)
  62697837600, #      utc_end 1987-10-25 10:00:00 (Sun)
  62680273200, #  local_start 1987-04-05 03:00:00 (Sun)
  62697808800, #    local_end 1987-10-25 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  62697837600, #    utc_start 1987-10-25 10:00:00 (Sun)
  62711751600, #      utc_end 1988-04-03 11:00:00 (Sun)
  62697805200, #  local_start 1987-10-25 01:00:00 (Sun)
  62711719200, #    local_end 1988-04-03 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62711751600, #    utc_start 1988-04-03 11:00:00 (Sun)
  62729892000, #      utc_end 1988-10-30 10:00:00 (Sun)
  62711722800, #  local_start 1988-04-03 03:00:00 (Sun)
  62729863200, #    local_end 1988-10-30 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  62729892000, #    utc_start 1988-10-30 10:00:00 (Sun)
  62743201200, #      utc_end 1989-04-02 11:00:00 (Sun)
  62729859600, #  local_start 1988-10-30 01:00:00 (Sun)
  62743168800, #    local_end 1989-04-02 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62743201200, #    utc_start 1989-04-02 11:00:00 (Sun)
  62761341600, #      utc_end 1989-10-29 10:00:00 (Sun)
  62743172400, #  local_start 1989-04-02 03:00:00 (Sun)
  62761312800, #    local_end 1989-10-29 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  62761341600, #    utc_start 1989-10-29 10:00:00 (Sun)
  62774650800, #      utc_end 1990-04-01 11:00:00 (Sun)
  62761309200, #  local_start 1989-10-29 01:00:00 (Sun)
  62774618400, #    local_end 1990-04-01 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62774650800, #    utc_start 1990-04-01 11:00:00 (Sun)
  62792791200, #      utc_end 1990-10-28 10:00:00 (Sun)
  62774622000, #  local_start 1990-04-01 03:00:00 (Sun)
  62792762400, #    local_end 1990-10-28 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  62792791200, #    utc_start 1990-10-28 10:00:00 (Sun)
  62806705200, #      utc_end 1991-04-07 11:00:00 (Sun)
  62792758800, #  local_start 1990-10-28 01:00:00 (Sun)
  62806672800, #    local_end 1991-04-07 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62806705200, #    utc_start 1991-04-07 11:00:00 (Sun)
  62824240800, #      utc_end 1991-10-27 10:00:00 (Sun)
  62806676400, #  local_start 1991-04-07 03:00:00 (Sun)
  62824212000, #    local_end 1991-10-27 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  62824240800, #    utc_start 1991-10-27 10:00:00 (Sun)
  62838154800, #      utc_end 1992-04-05 11:00:00 (Sun)
  62824208400, #  local_start 1991-10-27 01:00:00 (Sun)
  62838122400, #    local_end 1992-04-05 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62838154800, #    utc_start 1992-04-05 11:00:00 (Sun)
  62855690400, #      utc_end 1992-10-25 10:00:00 (Sun)
  62838126000, #  local_start 1992-04-05 03:00:00 (Sun)
  62855661600, #    local_end 1992-10-25 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  62855690400, #    utc_start 1992-10-25 10:00:00 (Sun)
  62869604400, #      utc_end 1993-04-04 11:00:00 (Sun)
  62855658000, #  local_start 1992-10-25 01:00:00 (Sun)
  62869572000, #    local_end 1993-04-04 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62869604400, #    utc_start 1993-04-04 11:00:00 (Sun)
  62887744800, #      utc_end 1993-10-31 10:00:00 (Sun)
  62869575600, #  local_start 1993-04-04 03:00:00 (Sun)
  62887716000, #    local_end 1993-10-31 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  62887744800, #    utc_start 1993-10-31 10:00:00 (Sun)
  62901054000, #      utc_end 1994-04-03 11:00:00 (Sun)
  62887712400, #  local_start 1993-10-31 01:00:00 (Sun)
  62901021600, #    local_end 1994-04-03 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62901054000, #    utc_start 1994-04-03 11:00:00 (Sun)
  62919194400, #      utc_end 1994-10-30 10:00:00 (Sun)
  62901025200, #  local_start 1994-04-03 03:00:00 (Sun)
  62919165600, #    local_end 1994-10-30 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  62919194400, #    utc_start 1994-10-30 10:00:00 (Sun)
  62932503600, #      utc_end 1995-04-02 11:00:00 (Sun)
  62919162000, #  local_start 1994-10-30 01:00:00 (Sun)
  62932471200, #    local_end 1995-04-02 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62932503600, #    utc_start 1995-04-02 11:00:00 (Sun)
  62950644000, #      utc_end 1995-10-29 10:00:00 (Sun)
  62932474800, #  local_start 1995-04-02 03:00:00 (Sun)
  62950615200, #    local_end 1995-10-29 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  62950644000, #    utc_start 1995-10-29 10:00:00 (Sun)
  62964558000, #      utc_end 1996-04-07 11:00:00 (Sun)
  62950611600, #  local_start 1995-10-29 01:00:00 (Sun)
  62964525600, #    local_end 1996-04-07 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62964558000, #    utc_start 1996-04-07 11:00:00 (Sun)
  62982093600, #      utc_end 1996-10-27 10:00:00 (Sun)
  62964529200, #  local_start 1996-04-07 03:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  62982093600, #    utc_start 1996-10-27 10:00:00 (Sun)
  62996007600, #      utc_end 1997-04-06 11:00:00 (Sun)
  62982061200, #  local_start 1996-10-27 01:00:00 (Sun)
  62995975200, #    local_end 1997-04-06 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62996007600, #    utc_start 1997-04-06 11:00:00 (Sun)
  63013543200, #      utc_end 1997-10-26 10:00:00 (Sun)
  62995978800, #  local_start 1997-04-06 03:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63013543200, #    utc_start 1997-10-26 10:00:00 (Sun)
  63027457200, #      utc_end 1998-04-05 11:00:00 (Sun)
  63013510800, #  local_start 1997-10-26 01:00:00 (Sun)
  63027424800, #    local_end 1998-04-05 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63027457200, #    utc_start 1998-04-05 11:00:00 (Sun)
  63044992800, #      utc_end 1998-10-25 10:00:00 (Sun)
  63027428400, #  local_start 1998-04-05 03:00:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63044992800, #    utc_start 1998-10-25 10:00:00 (Sun)
  63058906800, #      utc_end 1999-04-04 11:00:00 (Sun)
  63044960400, #  local_start 1998-10-25 01:00:00 (Sun)
  63058874400, #    local_end 1999-04-04 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63058906800, #    utc_start 1999-04-04 11:00:00 (Sun)
  63077047200, #      utc_end 1999-10-31 10:00:00 (Sun)
  63058878000, #  local_start 1999-04-04 03:00:00 (Sun)
  63077018400, #    local_end 1999-10-31 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63077047200, #    utc_start 1999-10-31 10:00:00 (Sun)
  63090356400, #      utc_end 2000-04-02 11:00:00 (Sun)
  63077014800, #  local_start 1999-10-31 01:00:00 (Sun)
  63090324000, #    local_end 2000-04-02 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63090356400, #    utc_start 2000-04-02 11:00:00 (Sun)
  63108496800, #      utc_end 2000-10-29 10:00:00 (Sun)
  63090327600, #  local_start 2000-04-02 03:00:00 (Sun)
  63108468000, #    local_end 2000-10-29 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63108496800, #    utc_start 2000-10-29 10:00:00 (Sun)
  63121806000, #      utc_end 2001-04-01 11:00:00 (Sun)
  63108464400, #  local_start 2000-10-29 01:00:00 (Sun)
  63121773600, #    local_end 2001-04-01 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63121806000, #    utc_start 2001-04-01 11:00:00 (Sun)
  63139946400, #      utc_end 2001-10-28 10:00:00 (Sun)
  63121777200, #  local_start 2001-04-01 03:00:00 (Sun)
  63139917600, #    local_end 2001-10-28 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63139946400, #    utc_start 2001-10-28 10:00:00 (Sun)
  63153860400, #      utc_end 2002-04-07 11:00:00 (Sun)
  63139914000, #  local_start 2001-10-28 01:00:00 (Sun)
  63153828000, #    local_end 2002-04-07 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63153860400, #    utc_start 2002-04-07 11:00:00 (Sun)
  63171396000, #      utc_end 2002-10-27 10:00:00 (Sun)
  63153831600, #  local_start 2002-04-07 03:00:00 (Sun)
  63171367200, #    local_end 2002-10-27 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63171396000, #    utc_start 2002-10-27 10:00:00 (Sun)
  63185310000, #      utc_end 2003-04-06 11:00:00 (Sun)
  63171363600, #  local_start 2002-10-27 01:00:00 (Sun)
  63185277600, #    local_end 2003-04-06 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63185310000, #    utc_start 2003-04-06 11:00:00 (Sun)
  63202845600, #      utc_end 2003-10-26 10:00:00 (Sun)
  63185281200, #  local_start 2003-04-06 03:00:00 (Sun)
  63202816800, #    local_end 2003-10-26 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63202845600, #    utc_start 2003-10-26 10:00:00 (Sun)
  63216759600, #      utc_end 2004-04-04 11:00:00 (Sun)
  63202813200, #  local_start 2003-10-26 01:00:00 (Sun)
  63216727200, #    local_end 2004-04-04 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63216759600, #    utc_start 2004-04-04 11:00:00 (Sun)
  63234900000, #      utc_end 2004-10-31 10:00:00 (Sun)
  63216730800, #  local_start 2004-04-04 03:00:00 (Sun)
  63234871200, #    local_end 2004-10-31 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63234900000, #    utc_start 2004-10-31 10:00:00 (Sun)
  63248209200, #      utc_end 2005-04-03 11:00:00 (Sun)
  63234867600, #  local_start 2004-10-31 01:00:00 (Sun)
  63248176800, #    local_end 2005-04-03 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63248209200, #    utc_start 2005-04-03 11:00:00 (Sun)
  63266349600, #      utc_end 2005-10-30 10:00:00 (Sun)
  63248180400, #  local_start 2005-04-03 03:00:00 (Sun)
  63266320800, #    local_end 2005-10-30 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63266349600, #    utc_start 2005-10-30 10:00:00 (Sun)
  63279658800, #      utc_end 2006-04-02 11:00:00 (Sun)
  63266317200, #  local_start 2005-10-30 01:00:00 (Sun)
  63279626400, #    local_end 2006-04-02 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63279658800, #    utc_start 2006-04-02 11:00:00 (Sun)
  63297799200, #      utc_end 2006-10-29 10:00:00 (Sun)
  63279630000, #  local_start 2006-04-02 03:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63297799200, #    utc_start 2006-10-29 10:00:00 (Sun)
  63309294000, #      utc_end 2007-03-11 11:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63309261600, #    local_end 2007-03-11 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63309294000, #    utc_start 2007-03-11 11:00:00 (Sun)
  63329853600, #      utc_end 2007-11-04 10:00:00 (Sun)
  63309265200, #  local_start 2007-03-11 03:00:00 (Sun)
  63329824800, #    local_end 2007-11-04 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63329853600, #    utc_start 2007-11-04 10:00:00 (Sun)
  63340743600, #      utc_end 2008-03-09 11:00:00 (Sun)
  63329821200, #  local_start 2007-11-04 01:00:00 (Sun)
  63340711200, #    local_end 2008-03-09 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63340743600, #    utc_start 2008-03-09 11:00:00 (Sun)
  63361303200, #      utc_end 2008-11-02 10:00:00 (Sun)
  63340714800, #  local_start 2008-03-09 03:00:00 (Sun)
  63361274400, #    local_end 2008-11-02 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63361303200, #    utc_start 2008-11-02 10:00:00 (Sun)
  63372193200, #      utc_end 2009-03-08 11:00:00 (Sun)
  63361270800, #  local_start 2008-11-02 01:00:00 (Sun)
  63372160800, #    local_end 2009-03-08 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63372193200, #    utc_start 2009-03-08 11:00:00 (Sun)
  63392752800, #      utc_end 2009-11-01 10:00:00 (Sun)
  63372164400, #  local_start 2009-03-08 03:00:00 (Sun)
  63392724000, #    local_end 2009-11-01 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63392752800, #    utc_start 2009-11-01 10:00:00 (Sun)
  63404247600, #      utc_end 2010-03-14 11:00:00 (Sun)
  63392720400, #  local_start 2009-11-01 01:00:00 (Sun)
  63404215200, #    local_end 2010-03-14 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63404247600, #    utc_start 2010-03-14 11:00:00 (Sun)
  63424807200, #      utc_end 2010-11-07 10:00:00 (Sun)
  63404218800, #  local_start 2010-03-14 03:00:00 (Sun)
  63424778400, #    local_end 2010-11-07 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63424807200, #    utc_start 2010-11-07 10:00:00 (Sun)
  63435697200, #      utc_end 2011-03-13 11:00:00 (Sun)
  63424774800, #  local_start 2010-11-07 01:00:00 (Sun)
  63435664800, #    local_end 2011-03-13 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63435697200, #    utc_start 2011-03-13 11:00:00 (Sun)
  63456256800, #      utc_end 2011-11-06 10:00:00 (Sun)
  63435668400, #  local_start 2011-03-13 03:00:00 (Sun)
  63456228000, #    local_end 2011-11-06 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63456256800, #    utc_start 2011-11-06 10:00:00 (Sun)
  63467146800, #      utc_end 2012-03-11 11:00:00 (Sun)
  63456224400, #  local_start 2011-11-06 01:00:00 (Sun)
  63467114400, #    local_end 2012-03-11 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63467146800, #    utc_start 2012-03-11 11:00:00 (Sun)
  63487706400, #      utc_end 2012-11-04 10:00:00 (Sun)
  63467118000, #  local_start 2012-03-11 03:00:00 (Sun)
  63487677600, #    local_end 2012-11-04 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63487706400, #    utc_start 2012-11-04 10:00:00 (Sun)
  63498596400, #      utc_end 2013-03-10 11:00:00 (Sun)
  63487674000, #  local_start 2012-11-04 01:00:00 (Sun)
  63498564000, #    local_end 2013-03-10 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63498596400, #    utc_start 2013-03-10 11:00:00 (Sun)
  63519156000, #      utc_end 2013-11-03 10:00:00 (Sun)
  63498567600, #  local_start 2013-03-10 03:00:00 (Sun)
  63519127200, #    local_end 2013-11-03 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63519156000, #    utc_start 2013-11-03 10:00:00 (Sun)
  63530046000, #      utc_end 2014-03-09 11:00:00 (Sun)
  63519123600, #  local_start 2013-11-03 01:00:00 (Sun)
  63530013600, #    local_end 2014-03-09 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63530046000, #    utc_start 2014-03-09 11:00:00 (Sun)
  63550605600, #      utc_end 2014-11-02 10:00:00 (Sun)
  63530017200, #  local_start 2014-03-09 03:00:00 (Sun)
  63550576800, #    local_end 2014-11-02 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63550605600, #    utc_start 2014-11-02 10:00:00 (Sun)
  63561495600, #      utc_end 2015-03-08 11:00:00 (Sun)
  63550573200, #  local_start 2014-11-02 01:00:00 (Sun)
  63561463200, #    local_end 2015-03-08 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63561495600, #    utc_start 2015-03-08 11:00:00 (Sun)
  63582055200, #      utc_end 2015-11-01 10:00:00 (Sun)
  63561466800, #  local_start 2015-03-08 03:00:00 (Sun)
  63582026400, #    local_end 2015-11-01 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63582055200, #    utc_start 2015-11-01 10:00:00 (Sun)
  63593550000, #      utc_end 2016-03-13 11:00:00 (Sun)
  63582022800, #  local_start 2015-11-01 01:00:00 (Sun)
  63593517600, #    local_end 2016-03-13 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63593550000, #    utc_start 2016-03-13 11:00:00 (Sun)
  63614109600, #      utc_end 2016-11-06 10:00:00 (Sun)
  63593521200, #  local_start 2016-03-13 03:00:00 (Sun)
  63614080800, #    local_end 2016-11-06 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63614109600, #    utc_start 2016-11-06 10:00:00 (Sun)
  63624999600, #      utc_end 2017-03-12 11:00:00 (Sun)
  63614077200, #  local_start 2016-11-06 01:00:00 (Sun)
  63624967200, #    local_end 2017-03-12 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63624999600, #    utc_start 2017-03-12 11:00:00 (Sun)
  63645559200, #      utc_end 2017-11-05 10:00:00 (Sun)
  63624970800, #  local_start 2017-03-12 03:00:00 (Sun)
  63645530400, #    local_end 2017-11-05 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63645559200, #    utc_start 2017-11-05 10:00:00 (Sun)
  63656449200, #      utc_end 2018-03-11 11:00:00 (Sun)
  63645526800, #  local_start 2017-11-05 01:00:00 (Sun)
  63656416800, #    local_end 2018-03-11 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63656449200, #    utc_start 2018-03-11 11:00:00 (Sun)
  63677008800, #      utc_end 2018-11-04 10:00:00 (Sun)
  63656420400, #  local_start 2018-03-11 03:00:00 (Sun)
  63676980000, #    local_end 2018-11-04 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63677008800, #    utc_start 2018-11-04 10:00:00 (Sun)
  63687898800, #      utc_end 2019-03-10 11:00:00 (Sun)
  63676976400, #  local_start 2018-11-04 01:00:00 (Sun)
  63687866400, #    local_end 2019-03-10 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63687898800, #    utc_start 2019-03-10 11:00:00 (Sun)
  63708458400, #      utc_end 2019-11-03 10:00:00 (Sun)
  63687870000, #  local_start 2019-03-10 03:00:00 (Sun)
  63708429600, #    local_end 2019-11-03 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63708458400, #    utc_start 2019-11-03 10:00:00 (Sun)
  63719348400, #      utc_end 2020-03-08 11:00:00 (Sun)
  63708426000, #  local_start 2019-11-03 01:00:00 (Sun)
  63719316000, #    local_end 2020-03-08 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63719348400, #    utc_start 2020-03-08 11:00:00 (Sun)
  63739908000, #      utc_end 2020-11-01 10:00:00 (Sun)
  63719319600, #  local_start 2020-03-08 03:00:00 (Sun)
  63739879200, #    local_end 2020-11-01 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63739908000, #    utc_start 2020-11-01 10:00:00 (Sun)
  63751402800, #      utc_end 2021-03-14 11:00:00 (Sun)
  63739875600, #  local_start 2020-11-01 01:00:00 (Sun)
  63751370400, #    local_end 2021-03-14 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63751402800, #    utc_start 2021-03-14 11:00:00 (Sun)
  63771962400, #      utc_end 2021-11-07 10:00:00 (Sun)
  63751374000, #  local_start 2021-03-14 03:00:00 (Sun)
  63771933600, #    local_end 2021-11-07 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63771962400, #    utc_start 2021-11-07 10:00:00 (Sun)
  63782852400, #      utc_end 2022-03-13 11:00:00 (Sun)
  63771930000, #  local_start 2021-11-07 01:00:00 (Sun)
  63782820000, #    local_end 2022-03-13 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63782852400, #    utc_start 2022-03-13 11:00:00 (Sun)
  63803412000, #      utc_end 2022-11-06 10:00:00 (Sun)
  63782823600, #  local_start 2022-03-13 03:00:00 (Sun)
  63803383200, #    local_end 2022-11-06 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63803412000, #    utc_start 2022-11-06 10:00:00 (Sun)
  63814302000, #      utc_end 2023-03-12 11:00:00 (Sun)
  63803379600, #  local_start 2022-11-06 01:00:00 (Sun)
  63814269600, #    local_end 2023-03-12 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63814302000, #    utc_start 2023-03-12 11:00:00 (Sun)
  63834861600, #      utc_end 2023-11-05 10:00:00 (Sun)
  63814273200, #  local_start 2023-03-12 03:00:00 (Sun)
  63834832800, #    local_end 2023-11-05 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63834861600, #    utc_start 2023-11-05 10:00:00 (Sun)
  63845751600, #      utc_end 2024-03-10 11:00:00 (Sun)
  63834829200, #  local_start 2023-11-05 01:00:00 (Sun)
  63845719200, #    local_end 2024-03-10 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63845751600, #    utc_start 2024-03-10 11:00:00 (Sun)
  63866311200, #      utc_end 2024-11-03 10:00:00 (Sun)
  63845722800, #  local_start 2024-03-10 03:00:00 (Sun)
  63866282400, #    local_end 2024-11-03 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63866311200, #    utc_start 2024-11-03 10:00:00 (Sun)
  63877201200, #      utc_end 2025-03-09 11:00:00 (Sun)
  63866278800, #  local_start 2024-11-03 01:00:00 (Sun)
  63877168800, #    local_end 2025-03-09 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63877201200, #    utc_start 2025-03-09 11:00:00 (Sun)
  63897760800, #      utc_end 2025-11-02 10:00:00 (Sun)
  63877172400, #  local_start 2025-03-09 03:00:00 (Sun)
  63897732000, #    local_end 2025-11-02 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63897760800, #    utc_start 2025-11-02 10:00:00 (Sun)
  63908650800, #      utc_end 2026-03-08 11:00:00 (Sun)
  63897728400, #  local_start 2025-11-02 01:00:00 (Sun)
  63908618400, #    local_end 2026-03-08 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63908650800, #    utc_start 2026-03-08 11:00:00 (Sun)
  63929210400, #      utc_end 2026-11-01 10:00:00 (Sun)
  63908622000, #  local_start 2026-03-08 03:00:00 (Sun)
  63929181600, #    local_end 2026-11-01 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63929210400, #    utc_start 2026-11-01 10:00:00 (Sun)
  63940705200, #      utc_end 2027-03-14 11:00:00 (Sun)
  63929178000, #  local_start 2026-11-01 01:00:00 (Sun)
  63940672800, #    local_end 2027-03-14 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63940705200, #    utc_start 2027-03-14 11:00:00 (Sun)
  63961264800, #      utc_end 2027-11-07 10:00:00 (Sun)
  63940676400, #  local_start 2027-03-14 03:00:00 (Sun)
  63961236000, #    local_end 2027-11-07 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63961264800, #    utc_start 2027-11-07 10:00:00 (Sun)
  63972154800, #      utc_end 2028-03-12 11:00:00 (Sun)
  63961232400, #  local_start 2027-11-07 01:00:00 (Sun)
  63972122400, #    local_end 2028-03-12 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63972154800, #    utc_start 2028-03-12 11:00:00 (Sun)
  63992714400, #      utc_end 2028-11-05 10:00:00 (Sun)
  63972126000, #  local_start 2028-03-12 03:00:00 (Sun)
  63992685600, #    local_end 2028-11-05 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63992714400, #    utc_start 2028-11-05 10:00:00 (Sun)
  64003604400, #      utc_end 2029-03-11 11:00:00 (Sun)
  63992682000, #  local_start 2028-11-05 01:00:00 (Sun)
  64003572000, #    local_end 2029-03-11 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  64003604400, #    utc_start 2029-03-11 11:00:00 (Sun)
  64024164000, #      utc_end 2029-11-04 10:00:00 (Sun)
  64003575600, #  local_start 2029-03-11 03:00:00 (Sun)
  64024135200, #    local_end 2029-11-04 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  64024164000, #    utc_start 2029-11-04 10:00:00 (Sun)
  64035054000, #      utc_end 2030-03-10 11:00:00 (Sun)
  64024131600, #  local_start 2029-11-04 01:00:00 (Sun)
  64035021600, #    local_end 2030-03-10 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  64035054000, #    utc_start 2030-03-10 11:00:00 (Sun)
  64055613600, #      utc_end 2030-11-03 10:00:00 (Sun)
  64035025200, #  local_start 2030-03-10 03:00:00 (Sun)
  64055584800, #    local_end 2030-11-03 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {64}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -32400 }
  
  my $last_observance = bless( {
    'format' => 'AK%sT',
    'gmtoff' => '-9:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 724244,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 724244,
      'utc_rd_secs' => 0,
      'utc_year' => 1984
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -32400,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 724244,
      'local_rd_secs' => 32400,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 724244,
      'utc_rd_secs' => 32400,
      'utc_year' => 1984
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Mar',
      'letter' => 'D',
      'name' => 'US',
      'offset_from_std' => 3600,
      'on' => 'Sun>=8',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Nov',
      'letter' => 'S',
      'name' => 'US',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_NOME

    $main::fatpacked{"DateTime/TimeZone/America/Noronha.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_NORONHA';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/southamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Noronha;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Noronha::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60368465380, #      utc_end 1914-01-01 02:09:40 (Thu)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60368457600, #    local_end 1914-01-01 00:00:00 (Thu)
  -7780,
  0,
  'LMT',
      ],
      [
  60368465380, #    utc_start 1914-01-01 02:09:40 (Thu)
  60928722000, #      utc_end 1931-10-03 13:00:00 (Sat)
  60368458180, #  local_start 1914-01-01 00:09:40 (Thu)
  60928714800, #    local_end 1931-10-03 11:00:00 (Sat)
  -7200,
  0,
  '-02',
      ],
      [
  60928722000, #    utc_start 1931-10-03 13:00:00 (Sat)
  60944317200, #      utc_end 1932-04-01 01:00:00 (Fri)
  60928718400, #  local_start 1931-10-03 12:00:00 (Sat)
  60944313600, #    local_end 1932-04-01 00:00:00 (Fri)
  -3600,
  1,
  '-01',
      ],
      [
  60944317200, #    utc_start 1932-04-01 01:00:00 (Fri)
  60960304800, #      utc_end 1932-10-03 02:00:00 (Mon)
  60944310000, #  local_start 1932-03-31 23:00:00 (Thu)
  60960297600, #    local_end 1932-10-03 00:00:00 (Mon)
  -7200,
  0,
  '-02',
      ],
      [
  60960304800, #    utc_start 1932-10-03 02:00:00 (Mon)
  60975853200, #      utc_end 1933-04-01 01:00:00 (Sat)
  60960301200, #  local_start 1932-10-03 01:00:00 (Mon)
  60975849600, #    local_end 1933-04-01 00:00:00 (Sat)
  -3600,
  1,
  '-01',
      ],
      [
  60975853200, #    utc_start 1933-04-01 01:00:00 (Sat)
  61501860000, #      utc_end 1949-12-01 02:00:00 (Thu)
  60975846000, #  local_start 1933-03-31 23:00:00 (Fri)
  61501852800, #    local_end 1949-12-01 00:00:00 (Thu)
  -7200,
  0,
  '-02',
      ],
      [
  61501860000, #    utc_start 1949-12-01 02:00:00 (Thu)
  61513610400, #      utc_end 1950-04-16 02:00:00 (Sun)
  61501856400, #  local_start 1949-12-01 01:00:00 (Thu)
  61513606800, #    local_end 1950-04-16 01:00:00 (Sun)
  -3600,
  1,
  '-01',
      ],
      [
  61513610400, #    utc_start 1950-04-16 02:00:00 (Sun)
  61533396000, #      utc_end 1950-12-01 02:00:00 (Fri)
  61513603200, #  local_start 1950-04-16 00:00:00 (Sun)
  61533388800, #    local_end 1950-12-01 00:00:00 (Fri)
  -7200,
  0,
  '-02',
      ],
      [
  61533396000, #    utc_start 1950-12-01 02:00:00 (Fri)
  61543846800, #      utc_end 1951-04-01 01:00:00 (Sun)
  61533392400, #  local_start 1950-12-01 01:00:00 (Fri)
  61543843200, #    local_end 1951-04-01 00:00:00 (Sun)
  -3600,
  1,
  '-01',
      ],
      [
  61543846800, #    utc_start 1951-04-01 01:00:00 (Sun)
  61564932000, #      utc_end 1951-12-01 02:00:00 (Sat)
  61543839600, #  local_start 1951-03-31 23:00:00 (Sat)
  61564924800, #    local_end 1951-12-01 00:00:00 (Sat)
  -7200,
  0,
  '-02',
      ],
      [
  61564932000, #    utc_start 1951-12-01 02:00:00 (Sat)
  61575469200, #      utc_end 1952-04-01 01:00:00 (Tue)
  61564928400, #  local_start 1951-12-01 01:00:00 (Sat)
  61575465600, #    local_end 1952-04-01 00:00:00 (Tue)
  -3600,
  1,
  '-01',
      ],
      [
  61575469200, #    utc_start 1952-04-01 01:00:00 (Tue)
  61596554400, #      utc_end 1952-12-01 02:00:00 (Mon)
  61575462000, #  local_start 1952-03-31 23:00:00 (Mon)
  61596547200, #    local_end 1952-12-01 00:00:00 (Mon)
  -7200,
  0,
  '-02',
      ],
      [
  61596554400, #    utc_start 1952-12-01 02:00:00 (Mon)
  61604326800, #      utc_end 1953-03-01 01:00:00 (Sun)
  61596550800, #  local_start 1952-12-01 01:00:00 (Mon)
  61604323200, #    local_end 1953-03-01 00:00:00 (Sun)
  -3600,
  1,
  '-01',
      ],
      [
  61604326800, #    utc_start 1953-03-01 01:00:00 (Sun)
  61944314400, #      utc_end 1963-12-09 02:00:00 (Mon)
  61604319600, #  local_start 1953-02-28 23:00:00 (Sat)
  61944307200, #    local_end 1963-12-09 00:00:00 (Mon)
  -7200,
  0,
  '-02',
      ],
      [
  61944314400, #    utc_start 1963-12-09 02:00:00 (Mon)
  61951482000, #      utc_end 1964-03-01 01:00:00 (Sun)
  61944310800, #  local_start 1963-12-09 01:00:00 (Mon)
  61951478400, #    local_end 1964-03-01 00:00:00 (Sun)
  -3600,
  1,
  '-01',
      ],
      [
  61951482000, #    utc_start 1964-03-01 01:00:00 (Sun)
  61980516000, #      utc_end 1965-01-31 02:00:00 (Sun)
  61951474800, #  local_start 1964-02-29 23:00:00 (Sat)
  61980508800, #    local_end 1965-01-31 00:00:00 (Sun)
  -7200,
  0,
  '-02',
      ],
      [
  61980516000, #    utc_start 1965-01-31 02:00:00 (Sun)
  61985610000, #      utc_end 1965-03-31 01:00:00 (Wed)
  61980512400, #  local_start 1965-01-31 01:00:00 (Sun)
  61985606400, #    local_end 1965-03-31 00:00:00 (Wed)
  -3600,
  1,
  '-01',
      ],
      [
  61985610000, #    utc_start 1965-03-31 01:00:00 (Wed)
  62006781600, #      utc_end 1965-12-01 02:00:00 (Wed)
  61985602800, #  local_start 1965-03-30 23:00:00 (Tue)
  62006774400, #    local_end 1965-12-01 00:00:00 (Wed)
  -7200,
  0,
  '-02',
      ],
      [
  62006781600, #    utc_start 1965-12-01 02:00:00 (Wed)
  62014554000, #      utc_end 1966-03-01 01:00:00 (Tue)
  62006778000, #  local_start 1965-12-01 01:00:00 (Wed)
  62014550400, #    local_end 1966-03-01 00:00:00 (Tue)
  -3600,
  1,
  '-01',
      ],
      [
  62014554000, #    utc_start 1966-03-01 01:00:00 (Tue)
  62035725600, #      utc_end 1966-11-01 02:00:00 (Tue)
  62014546800, #  local_start 1966-02-28 23:00:00 (Mon)
  62035718400, #    local_end 1966-11-01 00:00:00 (Tue)
  -7200,
  0,
  '-02',
      ],
      [
  62035725600, #    utc_start 1966-11-01 02:00:00 (Tue)
  62046090000, #      utc_end 1967-03-01 01:00:00 (Wed)
  62035722000, #  local_start 1966-11-01 01:00:00 (Tue)
  62046086400, #    local_end 1967-03-01 00:00:00 (Wed)
  -3600,
  1,
  '-01',
      ],
      [
  62046090000, #    utc_start 1967-03-01 01:00:00 (Wed)
  62067261600, #      utc_end 1967-11-01 02:00:00 (Wed)
  62046082800, #  local_start 1967-02-28 23:00:00 (Tue)
  62067254400, #    local_end 1967-11-01 00:00:00 (Wed)
  -7200,
  0,
  '-02',
      ],
      [
  62067261600, #    utc_start 1967-11-01 02:00:00 (Wed)
  62077712400, #      utc_end 1968-03-01 01:00:00 (Fri)
  62067258000, #  local_start 1967-11-01 01:00:00 (Wed)
  62077708800, #    local_end 1968-03-01 00:00:00 (Fri)
  -3600,
  1,
  '-01',
      ],
      [
  62077712400, #    utc_start 1968-03-01 01:00:00 (Fri)
  62635428000, #      utc_end 1985-11-02 02:00:00 (Sat)
  62077705200, #  local_start 1968-02-29 23:00:00 (Thu)
  62635420800, #    local_end 1985-11-02 00:00:00 (Sat)
  -7200,
  0,
  '-02',
      ],
      [
  62635428000, #    utc_start 1985-11-02 02:00:00 (Sat)
  62646915600, #      utc_end 1986-03-15 01:00:00 (Sat)
  62635424400, #  local_start 1985-11-02 01:00:00 (Sat)
  62646912000, #    local_end 1986-03-15 00:00:00 (Sat)
  -3600,
  1,
  '-01',
      ],
      [
  62646915600, #    utc_start 1986-03-15 01:00:00 (Sat)
  62666272800, #      utc_end 1986-10-25 02:00:00 (Sat)
  62646908400, #  local_start 1986-03-14 23:00:00 (Fri)
  62666265600, #    local_end 1986-10-25 00:00:00 (Sat)
  -7200,
  0,
  '-02',
      ],
      [
  62666272800, #    utc_start 1986-10-25 02:00:00 (Sat)
  62675946000, #      utc_end 1987-02-14 01:00:00 (Sat)
  62666269200, #  local_start 1986-10-25 01:00:00 (Sat)
  62675942400, #    local_end 1987-02-14 00:00:00 (Sat)
  -3600,
  1,
  '-01',
      ],
      [
  62675946000, #    utc_start 1987-02-14 01:00:00 (Sat)
  62697808800, #      utc_end 1987-10-25 02:00:00 (Sun)
  62675938800, #  local_start 1987-02-13 23:00:00 (Fri)
  62697801600, #    local_end 1987-10-25 00:00:00 (Sun)
  -7200,
  0,
  '-02',
      ],
      [
  62697808800, #    utc_start 1987-10-25 02:00:00 (Sun)
  62706877200, #      utc_end 1988-02-07 01:00:00 (Sun)
  62697805200, #  local_start 1987-10-25 01:00:00 (Sun)
  62706873600, #    local_end 1988-02-07 00:00:00 (Sun)
  -3600,
  1,
  '-01',
      ],
      [
  62706877200, #    utc_start 1988-02-07 01:00:00 (Sun)
  62728653600, #      utc_end 1988-10-16 02:00:00 (Sun)
  62706870000, #  local_start 1988-02-06 23:00:00 (Sat)
  62728646400, #    local_end 1988-10-16 00:00:00 (Sun)
  -7200,
  0,
  '-02',
      ],
      [
  62728653600, #    utc_start 1988-10-16 02:00:00 (Sun)
  62737722000, #      utc_end 1989-01-29 01:00:00 (Sun)
  62728650000, #  local_start 1988-10-16 01:00:00 (Sun)
  62737718400, #    local_end 1989-01-29 00:00:00 (Sun)
  -3600,
  1,
  '-01',
      ],
      [
  62737722000, #    utc_start 1989-01-29 01:00:00 (Sun)
  62760103200, #      utc_end 1989-10-15 02:00:00 (Sun)
  62737714800, #  local_start 1989-01-28 23:00:00 (Sat)
  62760096000, #    local_end 1989-10-15 00:00:00 (Sun)
  -7200,
  0,
  '-02',
      ],
      [
  62760103200, #    utc_start 1989-10-15 02:00:00 (Sun)
  62770381200, #      utc_end 1990-02-11 01:00:00 (Sun)
  62760099600, #  local_start 1989-10-15 01:00:00 (Sun)
  62770377600, #    local_end 1990-02-11 00:00:00 (Sun)
  -3600,
  1,
  '-01',
      ],
      [
  62770381200, #    utc_start 1990-02-11 01:00:00 (Sun)
  62789220000, #      utc_end 1990-09-17 02:00:00 (Mon)
  62770374000, #  local_start 1990-02-10 23:00:00 (Sat)
  62789212800, #    local_end 1990-09-17 00:00:00 (Mon)
  -7200,
  0,
  '-02',
      ],
      [
  62789220000, #    utc_start 1990-09-17 02:00:00 (Mon)
  63074340000, #      utc_end 1999-09-30 02:00:00 (Thu)
  62789212800, #  local_start 1990-09-17 00:00:00 (Mon)
  63074332800, #    local_end 1999-09-30 00:00:00 (Thu)
  -7200,
  0,
  '-02',
      ],
      [
  63074340000, #    utc_start 1999-09-30 02:00:00 (Thu)
  63074599200, #      utc_end 1999-10-03 02:00:00 (Sun)
  63074332800, #  local_start 1999-09-30 00:00:00 (Thu)
  63074592000, #    local_end 1999-10-03 00:00:00 (Sun)
  -7200,
  0,
  '-02',
      ],
      [
  63074599200, #    utc_start 1999-10-03 02:00:00 (Sun)
  63087296400, #      utc_end 2000-02-27 01:00:00 (Sun)
  63074595600, #  local_start 1999-10-03 01:00:00 (Sun)
  63087292800, #    local_end 2000-02-27 00:00:00 (Sun)
  -3600,
  1,
  '-01',
      ],
      [
  63087296400, #    utc_start 2000-02-27 01:00:00 (Sun)
  63106653600, #      utc_end 2000-10-08 02:00:00 (Sun)
  63087289200, #  local_start 2000-02-26 23:00:00 (Sat)
  63106646400, #    local_end 2000-10-08 00:00:00 (Sun)
  -7200,
  0,
  '-02',
      ],
      [
  63106653600, #    utc_start 2000-10-08 02:00:00 (Sun)
  63107254800, #      utc_end 2000-10-15 01:00:00 (Sun)
  63106650000, #  local_start 2000-10-08 01:00:00 (Sun)
  63107251200, #    local_end 2000-10-15 00:00:00 (Sun)
  -3600,
  1,
  '-01',
      ],
      [
  63107254800, #    utc_start 2000-10-15 01:00:00 (Sun)
  63136029600, #      utc_end 2001-09-13 02:00:00 (Thu)
  63107247600, #  local_start 2000-10-14 23:00:00 (Sat)
  63136022400, #    local_end 2001-09-13 00:00:00 (Thu)
  -7200,
  0,
  '-02',
      ],
      [
  63136029600, #    utc_start 2001-09-13 02:00:00 (Thu)
  63138708000, #      utc_end 2001-10-14 02:00:00 (Sun)
  63136022400, #  local_start 2001-09-13 00:00:00 (Thu)
  63138700800, #    local_end 2001-10-14 00:00:00 (Sun)
  -7200,
  0,
  '-02',
      ],
      [
  63138708000, #    utc_start 2001-10-14 02:00:00 (Sun)
  63149590800, #      utc_end 2002-02-17 01:00:00 (Sun)
  63138704400, #  local_start 2001-10-14 01:00:00 (Sun)
  63149587200, #    local_end 2002-02-17 00:00:00 (Sun)
  -3600,
  1,
  '-01',
      ],
      [
  63149590800, #    utc_start 2002-02-17 01:00:00 (Sun)
  63169120800, #      utc_end 2002-10-01 02:00:00 (Tue)
  63149583600, #  local_start 2002-02-16 23:00:00 (Sat)
  63169113600, #    local_end 2002-10-01 00:00:00 (Tue)
  -7200,
  0,
  '-02',
      ],
      [
  63169120800, #    utc_start 2002-10-01 02:00:00 (Tue)
  DateTime::TimeZone::INFINITY, #      utc_end
  63169113600, #  local_start 2002-10-01 00:00:00 (Tue)
  DateTime::TimeZone::INFINITY, #    local_end
  -7200,
  0,
  '-02',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {19}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_NORONHA

    $main::fatpacked{"DateTime/TimeZone/America/North_Dakota/Beulah.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_NORTH_DAKOTA_BEULAH';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::North_Dakota::Beulah;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::North_Dakota::Beulah::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59418039600, #      utc_end 1883-11-18 19:00:00 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59418015173, #    local_end 1883-11-18 12:12:53 (Sun)
  -24427,
  0,
  'LMT',
      ],
      [
  59418039600, #    utc_start 1883-11-18 19:00:00 (Sun)
  60502410000, #      utc_end 1918-03-31 09:00:00 (Sun)
  59418014400, #  local_start 1883-11-18 12:00:00 (Sun)
  60502384800, #    local_end 1918-03-31 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  60502410000, #    utc_start 1918-03-31 09:00:00 (Sun)
  60520550400, #      utc_end 1918-10-27 08:00:00 (Sun)
  60502388400, #  local_start 1918-03-31 03:00:00 (Sun)
  60520528800, #    local_end 1918-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  60520550400, #    utc_start 1918-10-27 08:00:00 (Sun)
  60533859600, #      utc_end 1919-03-30 09:00:00 (Sun)
  60520525200, #  local_start 1918-10-27 01:00:00 (Sun)
  60533834400, #    local_end 1919-03-30 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  60533859600, #    utc_start 1919-03-30 09:00:00 (Sun)
  60552000000, #      utc_end 1919-10-26 08:00:00 (Sun)
  60533838000, #  local_start 1919-03-30 03:00:00 (Sun)
  60551978400, #    local_end 1919-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  60552000000, #    utc_start 1919-10-26 08:00:00 (Sun)
  61255472400, #      utc_end 1942-02-09 09:00:00 (Mon)
  60551974800, #  local_start 1919-10-26 01:00:00 (Sun)
  61255447200, #    local_end 1942-02-09 02:00:00 (Mon)
  -25200,
  0,
  'MST',
      ],
      [
  61255472400, #    utc_start 1942-02-09 09:00:00 (Mon)
  61366287600, #      utc_end 1945-08-14 23:00:00 (Tue)
  61255450800, #  local_start 1942-02-09 03:00:00 (Mon)
  61366266000, #    local_end 1945-08-14 17:00:00 (Tue)
  -21600,
  1,
  'MWT',
      ],
      [
  61366287600, #    utc_start 1945-08-14 23:00:00 (Tue)
  61370294400, #      utc_end 1945-09-30 08:00:00 (Sun)
  61366266000, #  local_start 1945-08-14 17:00:00 (Tue)
  61370272800, #    local_end 1945-09-30 02:00:00 (Sun)
  -21600,
  1,
  'MPT',
      ],
      [
  61370294400, #    utc_start 1945-09-30 08:00:00 (Sun)
  62051302800, #      utc_end 1967-04-30 09:00:00 (Sun)
  61370269200, #  local_start 1945-09-30 01:00:00 (Sun)
  62051277600, #    local_end 1967-04-30 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62051302800, #    utc_start 1967-04-30 09:00:00 (Sun)
  62067024000, #      utc_end 1967-10-29 08:00:00 (Sun)
  62051281200, #  local_start 1967-04-30 03:00:00 (Sun)
  62067002400, #    local_end 1967-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62067024000, #    utc_start 1967-10-29 08:00:00 (Sun)
  62082752400, #      utc_end 1968-04-28 09:00:00 (Sun)
  62066998800, #  local_start 1967-10-29 01:00:00 (Sun)
  62082727200, #    local_end 1968-04-28 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62082752400, #    utc_start 1968-04-28 09:00:00 (Sun)
  62098473600, #      utc_end 1968-10-27 08:00:00 (Sun)
  62082730800, #  local_start 1968-04-28 03:00:00 (Sun)
  62098452000, #    local_end 1968-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62098473600, #    utc_start 1968-10-27 08:00:00 (Sun)
  62114202000, #      utc_end 1969-04-27 09:00:00 (Sun)
  62098448400, #  local_start 1968-10-27 01:00:00 (Sun)
  62114176800, #    local_end 1969-04-27 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62114202000, #    utc_start 1969-04-27 09:00:00 (Sun)
  62129923200, #      utc_end 1969-10-26 08:00:00 (Sun)
  62114180400, #  local_start 1969-04-27 03:00:00 (Sun)
  62129901600, #    local_end 1969-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62129923200, #    utc_start 1969-10-26 08:00:00 (Sun)
  62145651600, #      utc_end 1970-04-26 09:00:00 (Sun)
  62129898000, #  local_start 1969-10-26 01:00:00 (Sun)
  62145626400, #    local_end 1970-04-26 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62145651600, #    utc_start 1970-04-26 09:00:00 (Sun)
  62161372800, #      utc_end 1970-10-25 08:00:00 (Sun)
  62145630000, #  local_start 1970-04-26 03:00:00 (Sun)
  62161351200, #    local_end 1970-10-25 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62161372800, #    utc_start 1970-10-25 08:00:00 (Sun)
  62177101200, #      utc_end 1971-04-25 09:00:00 (Sun)
  62161347600, #  local_start 1970-10-25 01:00:00 (Sun)
  62177076000, #    local_end 1971-04-25 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62177101200, #    utc_start 1971-04-25 09:00:00 (Sun)
  62193427200, #      utc_end 1971-10-31 08:00:00 (Sun)
  62177079600, #  local_start 1971-04-25 03:00:00 (Sun)
  62193405600, #    local_end 1971-10-31 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62193427200, #    utc_start 1971-10-31 08:00:00 (Sun)
  62209155600, #      utc_end 1972-04-30 09:00:00 (Sun)
  62193402000, #  local_start 1971-10-31 01:00:00 (Sun)
  62209130400, #    local_end 1972-04-30 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62209155600, #    utc_start 1972-04-30 09:00:00 (Sun)
  62224876800, #      utc_end 1972-10-29 08:00:00 (Sun)
  62209134000, #  local_start 1972-04-30 03:00:00 (Sun)
  62224855200, #    local_end 1972-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62224876800, #    utc_start 1972-10-29 08:00:00 (Sun)
  62240605200, #      utc_end 1973-04-29 09:00:00 (Sun)
  62224851600, #  local_start 1972-10-29 01:00:00 (Sun)
  62240580000, #    local_end 1973-04-29 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62240605200, #    utc_start 1973-04-29 09:00:00 (Sun)
  62256326400, #      utc_end 1973-10-28 08:00:00 (Sun)
  62240583600, #  local_start 1973-04-29 03:00:00 (Sun)
  62256304800, #    local_end 1973-10-28 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62256326400, #    utc_start 1973-10-28 08:00:00 (Sun)
  62262378000, #      utc_end 1974-01-06 09:00:00 (Sun)
  62256301200, #  local_start 1973-10-28 01:00:00 (Sun)
  62262352800, #    local_end 1974-01-06 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62262378000, #    utc_start 1974-01-06 09:00:00 (Sun)
  62287776000, #      utc_end 1974-10-27 08:00:00 (Sun)
  62262356400, #  local_start 1974-01-06 03:00:00 (Sun)
  62287754400, #    local_end 1974-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62287776000, #    utc_start 1974-10-27 08:00:00 (Sun)
  62298061200, #      utc_end 1975-02-23 09:00:00 (Sun)
  62287750800, #  local_start 1974-10-27 01:00:00 (Sun)
  62298036000, #    local_end 1975-02-23 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62298061200, #    utc_start 1975-02-23 09:00:00 (Sun)
  62319225600, #      utc_end 1975-10-26 08:00:00 (Sun)
  62298039600, #  local_start 1975-02-23 03:00:00 (Sun)
  62319204000, #    local_end 1975-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62319225600, #    utc_start 1975-10-26 08:00:00 (Sun)
  62334954000, #      utc_end 1976-04-25 09:00:00 (Sun)
  62319200400, #  local_start 1975-10-26 01:00:00 (Sun)
  62334928800, #    local_end 1976-04-25 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62334954000, #    utc_start 1976-04-25 09:00:00 (Sun)
  62351280000, #      utc_end 1976-10-31 08:00:00 (Sun)
  62334932400, #  local_start 1976-04-25 03:00:00 (Sun)
  62351258400, #    local_end 1976-10-31 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62351280000, #    utc_start 1976-10-31 08:00:00 (Sun)
  62366403600, #      utc_end 1977-04-24 09:00:00 (Sun)
  62351254800, #  local_start 1976-10-31 01:00:00 (Sun)
  62366378400, #    local_end 1977-04-24 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62366403600, #    utc_start 1977-04-24 09:00:00 (Sun)
  62382729600, #      utc_end 1977-10-30 08:00:00 (Sun)
  62366382000, #  local_start 1977-04-24 03:00:00 (Sun)
  62382708000, #    local_end 1977-10-30 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62382729600, #    utc_start 1977-10-30 08:00:00 (Sun)
  62398458000, #      utc_end 1978-04-30 09:00:00 (Sun)
  62382704400, #  local_start 1977-10-30 01:00:00 (Sun)
  62398432800, #    local_end 1978-04-30 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62398458000, #    utc_start 1978-04-30 09:00:00 (Sun)
  62414179200, #      utc_end 1978-10-29 08:00:00 (Sun)
  62398436400, #  local_start 1978-04-30 03:00:00 (Sun)
  62414157600, #    local_end 1978-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62414179200, #    utc_start 1978-10-29 08:00:00 (Sun)
  62429907600, #      utc_end 1979-04-29 09:00:00 (Sun)
  62414154000, #  local_start 1978-10-29 01:00:00 (Sun)
  62429882400, #    local_end 1979-04-29 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62429907600, #    utc_start 1979-04-29 09:00:00 (Sun)
  62445628800, #      utc_end 1979-10-28 08:00:00 (Sun)
  62429886000, #  local_start 1979-04-29 03:00:00 (Sun)
  62445607200, #    local_end 1979-10-28 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62445628800, #    utc_start 1979-10-28 08:00:00 (Sun)
  62461357200, #      utc_end 1980-04-27 09:00:00 (Sun)
  62445603600, #  local_start 1979-10-28 01:00:00 (Sun)
  62461332000, #    local_end 1980-04-27 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62461357200, #    utc_start 1980-04-27 09:00:00 (Sun)
  62477078400, #      utc_end 1980-10-26 08:00:00 (Sun)
  62461335600, #  local_start 1980-04-27 03:00:00 (Sun)
  62477056800, #    local_end 1980-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62477078400, #    utc_start 1980-10-26 08:00:00 (Sun)
  62492806800, #      utc_end 1981-04-26 09:00:00 (Sun)
  62477053200, #  local_start 1980-10-26 01:00:00 (Sun)
  62492781600, #    local_end 1981-04-26 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62492806800, #    utc_start 1981-04-26 09:00:00 (Sun)
  62508528000, #      utc_end 1981-10-25 08:00:00 (Sun)
  62492785200, #  local_start 1981-04-26 03:00:00 (Sun)
  62508506400, #    local_end 1981-10-25 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62508528000, #    utc_start 1981-10-25 08:00:00 (Sun)
  62524256400, #      utc_end 1982-04-25 09:00:00 (Sun)
  62508502800, #  local_start 1981-10-25 01:00:00 (Sun)
  62524231200, #    local_end 1982-04-25 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62524256400, #    utc_start 1982-04-25 09:00:00 (Sun)
  62540582400, #      utc_end 1982-10-31 08:00:00 (Sun)
  62524234800, #  local_start 1982-04-25 03:00:00 (Sun)
  62540560800, #    local_end 1982-10-31 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62540582400, #    utc_start 1982-10-31 08:00:00 (Sun)
  62555706000, #      utc_end 1983-04-24 09:00:00 (Sun)
  62540557200, #  local_start 1982-10-31 01:00:00 (Sun)
  62555680800, #    local_end 1983-04-24 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62555706000, #    utc_start 1983-04-24 09:00:00 (Sun)
  62572032000, #      utc_end 1983-10-30 08:00:00 (Sun)
  62555684400, #  local_start 1983-04-24 03:00:00 (Sun)
  62572010400, #    local_end 1983-10-30 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62572032000, #    utc_start 1983-10-30 08:00:00 (Sun)
  62587760400, #      utc_end 1984-04-29 09:00:00 (Sun)
  62572006800, #  local_start 1983-10-30 01:00:00 (Sun)
  62587735200, #    local_end 1984-04-29 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62587760400, #    utc_start 1984-04-29 09:00:00 (Sun)
  62603481600, #      utc_end 1984-10-28 08:00:00 (Sun)
  62587738800, #  local_start 1984-04-29 03:00:00 (Sun)
  62603460000, #    local_end 1984-10-28 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62603481600, #    utc_start 1984-10-28 08:00:00 (Sun)
  62619210000, #      utc_end 1985-04-28 09:00:00 (Sun)
  62603456400, #  local_start 1984-10-28 01:00:00 (Sun)
  62619184800, #    local_end 1985-04-28 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62619210000, #    utc_start 1985-04-28 09:00:00 (Sun)
  62634931200, #      utc_end 1985-10-27 08:00:00 (Sun)
  62619188400, #  local_start 1985-04-28 03:00:00 (Sun)
  62634909600, #    local_end 1985-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62634931200, #    utc_start 1985-10-27 08:00:00 (Sun)
  62650659600, #      utc_end 1986-04-27 09:00:00 (Sun)
  62634906000, #  local_start 1985-10-27 01:00:00 (Sun)
  62650634400, #    local_end 1986-04-27 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62650659600, #    utc_start 1986-04-27 09:00:00 (Sun)
  62666380800, #      utc_end 1986-10-26 08:00:00 (Sun)
  62650638000, #  local_start 1986-04-27 03:00:00 (Sun)
  62666359200, #    local_end 1986-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62666380800, #    utc_start 1986-10-26 08:00:00 (Sun)
  62680294800, #      utc_end 1987-04-05 09:00:00 (Sun)
  62666355600, #  local_start 1986-10-26 01:00:00 (Sun)
  62680269600, #    local_end 1987-04-05 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62680294800, #    utc_start 1987-04-05 09:00:00 (Sun)
  62697830400, #      utc_end 1987-10-25 08:00:00 (Sun)
  62680273200, #  local_start 1987-04-05 03:00:00 (Sun)
  62697808800, #    local_end 1987-10-25 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62697830400, #    utc_start 1987-10-25 08:00:00 (Sun)
  62711744400, #      utc_end 1988-04-03 09:00:00 (Sun)
  62697805200, #  local_start 1987-10-25 01:00:00 (Sun)
  62711719200, #    local_end 1988-04-03 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62711744400, #    utc_start 1988-04-03 09:00:00 (Sun)
  62729884800, #      utc_end 1988-10-30 08:00:00 (Sun)
  62711722800, #  local_start 1988-04-03 03:00:00 (Sun)
  62729863200, #    local_end 1988-10-30 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62729884800, #    utc_start 1988-10-30 08:00:00 (Sun)
  62743194000, #      utc_end 1989-04-02 09:00:00 (Sun)
  62729859600, #  local_start 1988-10-30 01:00:00 (Sun)
  62743168800, #    local_end 1989-04-02 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62743194000, #    utc_start 1989-04-02 09:00:00 (Sun)
  62761334400, #      utc_end 1989-10-29 08:00:00 (Sun)
  62743172400, #  local_start 1989-04-02 03:00:00 (Sun)
  62761312800, #    local_end 1989-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62761334400, #    utc_start 1989-10-29 08:00:00 (Sun)
  62774643600, #      utc_end 1990-04-01 09:00:00 (Sun)
  62761309200, #  local_start 1989-10-29 01:00:00 (Sun)
  62774618400, #    local_end 1990-04-01 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62774643600, #    utc_start 1990-04-01 09:00:00 (Sun)
  62792784000, #      utc_end 1990-10-28 08:00:00 (Sun)
  62774622000, #  local_start 1990-04-01 03:00:00 (Sun)
  62792762400, #    local_end 1990-10-28 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62792784000, #    utc_start 1990-10-28 08:00:00 (Sun)
  62806698000, #      utc_end 1991-04-07 09:00:00 (Sun)
  62792758800, #  local_start 1990-10-28 01:00:00 (Sun)
  62806672800, #    local_end 1991-04-07 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62806698000, #    utc_start 1991-04-07 09:00:00 (Sun)
  62824233600, #      utc_end 1991-10-27 08:00:00 (Sun)
  62806676400, #  local_start 1991-04-07 03:00:00 (Sun)
  62824212000, #    local_end 1991-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62824233600, #    utc_start 1991-10-27 08:00:00 (Sun)
  62838147600, #      utc_end 1992-04-05 09:00:00 (Sun)
  62824208400, #  local_start 1991-10-27 01:00:00 (Sun)
  62838122400, #    local_end 1992-04-05 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62838147600, #    utc_start 1992-04-05 09:00:00 (Sun)
  62855683200, #      utc_end 1992-10-25 08:00:00 (Sun)
  62838126000, #  local_start 1992-04-05 03:00:00 (Sun)
  62855661600, #    local_end 1992-10-25 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62855683200, #    utc_start 1992-10-25 08:00:00 (Sun)
  62869597200, #      utc_end 1993-04-04 09:00:00 (Sun)
  62855658000, #  local_start 1992-10-25 01:00:00 (Sun)
  62869572000, #    local_end 1993-04-04 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62869597200, #    utc_start 1993-04-04 09:00:00 (Sun)
  62887737600, #      utc_end 1993-10-31 08:00:00 (Sun)
  62869575600, #  local_start 1993-04-04 03:00:00 (Sun)
  62887716000, #    local_end 1993-10-31 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62887737600, #    utc_start 1993-10-31 08:00:00 (Sun)
  62901046800, #      utc_end 1994-04-03 09:00:00 (Sun)
  62887712400, #  local_start 1993-10-31 01:00:00 (Sun)
  62901021600, #    local_end 1994-04-03 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62901046800, #    utc_start 1994-04-03 09:00:00 (Sun)
  62919187200, #      utc_end 1994-10-30 08:00:00 (Sun)
  62901025200, #  local_start 1994-04-03 03:00:00 (Sun)
  62919165600, #    local_end 1994-10-30 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62919187200, #    utc_start 1994-10-30 08:00:00 (Sun)
  62932496400, #      utc_end 1995-04-02 09:00:00 (Sun)
  62919162000, #  local_start 1994-10-30 01:00:00 (Sun)
  62932471200, #    local_end 1995-04-02 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62932496400, #    utc_start 1995-04-02 09:00:00 (Sun)
  62950636800, #      utc_end 1995-10-29 08:00:00 (Sun)
  62932474800, #  local_start 1995-04-02 03:00:00 (Sun)
  62950615200, #    local_end 1995-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62950636800, #    utc_start 1995-10-29 08:00:00 (Sun)
  62964550800, #      utc_end 1996-04-07 09:00:00 (Sun)
  62950611600, #  local_start 1995-10-29 01:00:00 (Sun)
  62964525600, #    local_end 1996-04-07 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62964550800, #    utc_start 1996-04-07 09:00:00 (Sun)
  62982086400, #      utc_end 1996-10-27 08:00:00 (Sun)
  62964529200, #  local_start 1996-04-07 03:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62982086400, #    utc_start 1996-10-27 08:00:00 (Sun)
  62996000400, #      utc_end 1997-04-06 09:00:00 (Sun)
  62982061200, #  local_start 1996-10-27 01:00:00 (Sun)
  62995975200, #    local_end 1997-04-06 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62996000400, #    utc_start 1997-04-06 09:00:00 (Sun)
  63013536000, #      utc_end 1997-10-26 08:00:00 (Sun)
  62995978800, #  local_start 1997-04-06 03:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63013536000, #    utc_start 1997-10-26 08:00:00 (Sun)
  63027450000, #      utc_end 1998-04-05 09:00:00 (Sun)
  63013510800, #  local_start 1997-10-26 01:00:00 (Sun)
  63027424800, #    local_end 1998-04-05 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63027450000, #    utc_start 1998-04-05 09:00:00 (Sun)
  63044985600, #      utc_end 1998-10-25 08:00:00 (Sun)
  63027428400, #  local_start 1998-04-05 03:00:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63044985600, #    utc_start 1998-10-25 08:00:00 (Sun)
  63058899600, #      utc_end 1999-04-04 09:00:00 (Sun)
  63044960400, #  local_start 1998-10-25 01:00:00 (Sun)
  63058874400, #    local_end 1999-04-04 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63058899600, #    utc_start 1999-04-04 09:00:00 (Sun)
  63077040000, #      utc_end 1999-10-31 08:00:00 (Sun)
  63058878000, #  local_start 1999-04-04 03:00:00 (Sun)
  63077018400, #    local_end 1999-10-31 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63077040000, #    utc_start 1999-10-31 08:00:00 (Sun)
  63090349200, #      utc_end 2000-04-02 09:00:00 (Sun)
  63077014800, #  local_start 1999-10-31 01:00:00 (Sun)
  63090324000, #    local_end 2000-04-02 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63090349200, #    utc_start 2000-04-02 09:00:00 (Sun)
  63108489600, #      utc_end 2000-10-29 08:00:00 (Sun)
  63090327600, #  local_start 2000-04-02 03:00:00 (Sun)
  63108468000, #    local_end 2000-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63108489600, #    utc_start 2000-10-29 08:00:00 (Sun)
  63121798800, #      utc_end 2001-04-01 09:00:00 (Sun)
  63108464400, #  local_start 2000-10-29 01:00:00 (Sun)
  63121773600, #    local_end 2001-04-01 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63121798800, #    utc_start 2001-04-01 09:00:00 (Sun)
  63139939200, #      utc_end 2001-10-28 08:00:00 (Sun)
  63121777200, #  local_start 2001-04-01 03:00:00 (Sun)
  63139917600, #    local_end 2001-10-28 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63139939200, #    utc_start 2001-10-28 08:00:00 (Sun)
  63153853200, #      utc_end 2002-04-07 09:00:00 (Sun)
  63139914000, #  local_start 2001-10-28 01:00:00 (Sun)
  63153828000, #    local_end 2002-04-07 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63153853200, #    utc_start 2002-04-07 09:00:00 (Sun)
  63171388800, #      utc_end 2002-10-27 08:00:00 (Sun)
  63153831600, #  local_start 2002-04-07 03:00:00 (Sun)
  63171367200, #    local_end 2002-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63171388800, #    utc_start 2002-10-27 08:00:00 (Sun)
  63185302800, #      utc_end 2003-04-06 09:00:00 (Sun)
  63171363600, #  local_start 2002-10-27 01:00:00 (Sun)
  63185277600, #    local_end 2003-04-06 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63185302800, #    utc_start 2003-04-06 09:00:00 (Sun)
  63202838400, #      utc_end 2003-10-26 08:00:00 (Sun)
  63185281200, #  local_start 2003-04-06 03:00:00 (Sun)
  63202816800, #    local_end 2003-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63202838400, #    utc_start 2003-10-26 08:00:00 (Sun)
  63216752400, #      utc_end 2004-04-04 09:00:00 (Sun)
  63202813200, #  local_start 2003-10-26 01:00:00 (Sun)
  63216727200, #    local_end 2004-04-04 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63216752400, #    utc_start 2004-04-04 09:00:00 (Sun)
  63234892800, #      utc_end 2004-10-31 08:00:00 (Sun)
  63216730800, #  local_start 2004-04-04 03:00:00 (Sun)
  63234871200, #    local_end 2004-10-31 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63234892800, #    utc_start 2004-10-31 08:00:00 (Sun)
  63248202000, #      utc_end 2005-04-03 09:00:00 (Sun)
  63234867600, #  local_start 2004-10-31 01:00:00 (Sun)
  63248176800, #    local_end 2005-04-03 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63248202000, #    utc_start 2005-04-03 09:00:00 (Sun)
  63266342400, #      utc_end 2005-10-30 08:00:00 (Sun)
  63248180400, #  local_start 2005-04-03 03:00:00 (Sun)
  63266320800, #    local_end 2005-10-30 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63266342400, #    utc_start 2005-10-30 08:00:00 (Sun)
  63279651600, #      utc_end 2006-04-02 09:00:00 (Sun)
  63266317200, #  local_start 2005-10-30 01:00:00 (Sun)
  63279626400, #    local_end 2006-04-02 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63279651600, #    utc_start 2006-04-02 09:00:00 (Sun)
  63297792000, #      utc_end 2006-10-29 08:00:00 (Sun)
  63279630000, #  local_start 2006-04-02 03:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63297792000, #    utc_start 2006-10-29 08:00:00 (Sun)
  63309286800, #      utc_end 2007-03-11 09:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63309261600, #    local_end 2007-03-11 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63309286800, #    utc_start 2007-03-11 09:00:00 (Sun)
  63329846400, #      utc_end 2007-11-04 08:00:00 (Sun)
  63309265200, #  local_start 2007-03-11 03:00:00 (Sun)
  63329824800, #    local_end 2007-11-04 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63329846400, #    utc_start 2007-11-04 08:00:00 (Sun)
  63340736400, #      utc_end 2008-03-09 09:00:00 (Sun)
  63329821200, #  local_start 2007-11-04 01:00:00 (Sun)
  63340711200, #    local_end 2008-03-09 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63340736400, #    utc_start 2008-03-09 09:00:00 (Sun)
  63361296000, #      utc_end 2008-11-02 08:00:00 (Sun)
  63340714800, #  local_start 2008-03-09 03:00:00 (Sun)
  63361274400, #    local_end 2008-11-02 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63361296000, #    utc_start 2008-11-02 08:00:00 (Sun)
  63372186000, #      utc_end 2009-03-08 09:00:00 (Sun)
  63361270800, #  local_start 2008-11-02 01:00:00 (Sun)
  63372160800, #    local_end 2009-03-08 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63372186000, #    utc_start 2009-03-08 09:00:00 (Sun)
  63392745600, #      utc_end 2009-11-01 08:00:00 (Sun)
  63372164400, #  local_start 2009-03-08 03:00:00 (Sun)
  63392724000, #    local_end 2009-11-01 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63392745600, #    utc_start 2009-11-01 08:00:00 (Sun)
  63404240400, #      utc_end 2010-03-14 09:00:00 (Sun)
  63392720400, #  local_start 2009-11-01 01:00:00 (Sun)
  63404215200, #    local_end 2010-03-14 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63404240400, #    utc_start 2010-03-14 09:00:00 (Sun)
  63424800000, #      utc_end 2010-11-07 08:00:00 (Sun)
  63404218800, #  local_start 2010-03-14 03:00:00 (Sun)
  63424778400, #    local_end 2010-11-07 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63424800000, #    utc_start 2010-11-07 08:00:00 (Sun)
  63435686400, #      utc_end 2011-03-13 08:00:00 (Sun)
  63424778400, #  local_start 2010-11-07 02:00:00 (Sun)
  63435664800, #    local_end 2011-03-13 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63435686400, #    utc_start 2011-03-13 08:00:00 (Sun)
  63456246000, #      utc_end 2011-11-06 07:00:00 (Sun)
  63435668400, #  local_start 2011-03-13 03:00:00 (Sun)
  63456228000, #    local_end 2011-11-06 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63456246000, #    utc_start 2011-11-06 07:00:00 (Sun)
  63467136000, #      utc_end 2012-03-11 08:00:00 (Sun)
  63456224400, #  local_start 2011-11-06 01:00:00 (Sun)
  63467114400, #    local_end 2012-03-11 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63467136000, #    utc_start 2012-03-11 08:00:00 (Sun)
  63487695600, #      utc_end 2012-11-04 07:00:00 (Sun)
  63467118000, #  local_start 2012-03-11 03:00:00 (Sun)
  63487677600, #    local_end 2012-11-04 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63487695600, #    utc_start 2012-11-04 07:00:00 (Sun)
  63498585600, #      utc_end 2013-03-10 08:00:00 (Sun)
  63487674000, #  local_start 2012-11-04 01:00:00 (Sun)
  63498564000, #    local_end 2013-03-10 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63498585600, #    utc_start 2013-03-10 08:00:00 (Sun)
  63519145200, #      utc_end 2013-11-03 07:00:00 (Sun)
  63498567600, #  local_start 2013-03-10 03:00:00 (Sun)
  63519127200, #    local_end 2013-11-03 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63519145200, #    utc_start 2013-11-03 07:00:00 (Sun)
  63530035200, #      utc_end 2014-03-09 08:00:00 (Sun)
  63519123600, #  local_start 2013-11-03 01:00:00 (Sun)
  63530013600, #    local_end 2014-03-09 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63530035200, #    utc_start 2014-03-09 08:00:00 (Sun)
  63550594800, #      utc_end 2014-11-02 07:00:00 (Sun)
  63530017200, #  local_start 2014-03-09 03:00:00 (Sun)
  63550576800, #    local_end 2014-11-02 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63550594800, #    utc_start 2014-11-02 07:00:00 (Sun)
  63561484800, #      utc_end 2015-03-08 08:00:00 (Sun)
  63550573200, #  local_start 2014-11-02 01:00:00 (Sun)
  63561463200, #    local_end 2015-03-08 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63561484800, #    utc_start 2015-03-08 08:00:00 (Sun)
  63582044400, #      utc_end 2015-11-01 07:00:00 (Sun)
  63561466800, #  local_start 2015-03-08 03:00:00 (Sun)
  63582026400, #    local_end 2015-11-01 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63582044400, #    utc_start 2015-11-01 07:00:00 (Sun)
  63593539200, #      utc_end 2016-03-13 08:00:00 (Sun)
  63582022800, #  local_start 2015-11-01 01:00:00 (Sun)
  63593517600, #    local_end 2016-03-13 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63593539200, #    utc_start 2016-03-13 08:00:00 (Sun)
  63614098800, #      utc_end 2016-11-06 07:00:00 (Sun)
  63593521200, #  local_start 2016-03-13 03:00:00 (Sun)
  63614080800, #    local_end 2016-11-06 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63614098800, #    utc_start 2016-11-06 07:00:00 (Sun)
  63624988800, #      utc_end 2017-03-12 08:00:00 (Sun)
  63614077200, #  local_start 2016-11-06 01:00:00 (Sun)
  63624967200, #    local_end 2017-03-12 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63624988800, #    utc_start 2017-03-12 08:00:00 (Sun)
  63645548400, #      utc_end 2017-11-05 07:00:00 (Sun)
  63624970800, #  local_start 2017-03-12 03:00:00 (Sun)
  63645530400, #    local_end 2017-11-05 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63645548400, #    utc_start 2017-11-05 07:00:00 (Sun)
  63656438400, #      utc_end 2018-03-11 08:00:00 (Sun)
  63645526800, #  local_start 2017-11-05 01:00:00 (Sun)
  63656416800, #    local_end 2018-03-11 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63656438400, #    utc_start 2018-03-11 08:00:00 (Sun)
  63676998000, #      utc_end 2018-11-04 07:00:00 (Sun)
  63656420400, #  local_start 2018-03-11 03:00:00 (Sun)
  63676980000, #    local_end 2018-11-04 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63676998000, #    utc_start 2018-11-04 07:00:00 (Sun)
  63687888000, #      utc_end 2019-03-10 08:00:00 (Sun)
  63676976400, #  local_start 2018-11-04 01:00:00 (Sun)
  63687866400, #    local_end 2019-03-10 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63687888000, #    utc_start 2019-03-10 08:00:00 (Sun)
  63708447600, #      utc_end 2019-11-03 07:00:00 (Sun)
  63687870000, #  local_start 2019-03-10 03:00:00 (Sun)
  63708429600, #    local_end 2019-11-03 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63708447600, #    utc_start 2019-11-03 07:00:00 (Sun)
  63719337600, #      utc_end 2020-03-08 08:00:00 (Sun)
  63708426000, #  local_start 2019-11-03 01:00:00 (Sun)
  63719316000, #    local_end 2020-03-08 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63719337600, #    utc_start 2020-03-08 08:00:00 (Sun)
  63739897200, #      utc_end 2020-11-01 07:00:00 (Sun)
  63719319600, #  local_start 2020-03-08 03:00:00 (Sun)
  63739879200, #    local_end 2020-11-01 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63739897200, #    utc_start 2020-11-01 07:00:00 (Sun)
  63751392000, #      utc_end 2021-03-14 08:00:00 (Sun)
  63739875600, #  local_start 2020-11-01 01:00:00 (Sun)
  63751370400, #    local_end 2021-03-14 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63751392000, #    utc_start 2021-03-14 08:00:00 (Sun)
  63771951600, #      utc_end 2021-11-07 07:00:00 (Sun)
  63751374000, #  local_start 2021-03-14 03:00:00 (Sun)
  63771933600, #    local_end 2021-11-07 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63771951600, #    utc_start 2021-11-07 07:00:00 (Sun)
  63782841600, #      utc_end 2022-03-13 08:00:00 (Sun)
  63771930000, #  local_start 2021-11-07 01:00:00 (Sun)
  63782820000, #    local_end 2022-03-13 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63782841600, #    utc_start 2022-03-13 08:00:00 (Sun)
  63803401200, #      utc_end 2022-11-06 07:00:00 (Sun)
  63782823600, #  local_start 2022-03-13 03:00:00 (Sun)
  63803383200, #    local_end 2022-11-06 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63803401200, #    utc_start 2022-11-06 07:00:00 (Sun)
  63814291200, #      utc_end 2023-03-12 08:00:00 (Sun)
  63803379600, #  local_start 2022-11-06 01:00:00 (Sun)
  63814269600, #    local_end 2023-03-12 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63814291200, #    utc_start 2023-03-12 08:00:00 (Sun)
  63834850800, #      utc_end 2023-11-05 07:00:00 (Sun)
  63814273200, #  local_start 2023-03-12 03:00:00 (Sun)
  63834832800, #    local_end 2023-11-05 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63834850800, #    utc_start 2023-11-05 07:00:00 (Sun)
  63845740800, #      utc_end 2024-03-10 08:00:00 (Sun)
  63834829200, #  local_start 2023-11-05 01:00:00 (Sun)
  63845719200, #    local_end 2024-03-10 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63845740800, #    utc_start 2024-03-10 08:00:00 (Sun)
  63866300400, #      utc_end 2024-11-03 07:00:00 (Sun)
  63845722800, #  local_start 2024-03-10 03:00:00 (Sun)
  63866282400, #    local_end 2024-11-03 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63866300400, #    utc_start 2024-11-03 07:00:00 (Sun)
  63877190400, #      utc_end 2025-03-09 08:00:00 (Sun)
  63866278800, #  local_start 2024-11-03 01:00:00 (Sun)
  63877168800, #    local_end 2025-03-09 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63877190400, #    utc_start 2025-03-09 08:00:00 (Sun)
  63897750000, #      utc_end 2025-11-02 07:00:00 (Sun)
  63877172400, #  local_start 2025-03-09 03:00:00 (Sun)
  63897732000, #    local_end 2025-11-02 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63897750000, #    utc_start 2025-11-02 07:00:00 (Sun)
  63908640000, #      utc_end 2026-03-08 08:00:00 (Sun)
  63897728400, #  local_start 2025-11-02 01:00:00 (Sun)
  63908618400, #    local_end 2026-03-08 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63908640000, #    utc_start 2026-03-08 08:00:00 (Sun)
  63929199600, #      utc_end 2026-11-01 07:00:00 (Sun)
  63908622000, #  local_start 2026-03-08 03:00:00 (Sun)
  63929181600, #    local_end 2026-11-01 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63929199600, #    utc_start 2026-11-01 07:00:00 (Sun)
  63940694400, #      utc_end 2027-03-14 08:00:00 (Sun)
  63929178000, #  local_start 2026-11-01 01:00:00 (Sun)
  63940672800, #    local_end 2027-03-14 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63940694400, #    utc_start 2027-03-14 08:00:00 (Sun)
  63961254000, #      utc_end 2027-11-07 07:00:00 (Sun)
  63940676400, #  local_start 2027-03-14 03:00:00 (Sun)
  63961236000, #    local_end 2027-11-07 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63961254000, #    utc_start 2027-11-07 07:00:00 (Sun)
  63972144000, #      utc_end 2028-03-12 08:00:00 (Sun)
  63961232400, #  local_start 2027-11-07 01:00:00 (Sun)
  63972122400, #    local_end 2028-03-12 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63972144000, #    utc_start 2028-03-12 08:00:00 (Sun)
  63992703600, #      utc_end 2028-11-05 07:00:00 (Sun)
  63972126000, #  local_start 2028-03-12 03:00:00 (Sun)
  63992685600, #    local_end 2028-11-05 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63992703600, #    utc_start 2028-11-05 07:00:00 (Sun)
  64003593600, #      utc_end 2029-03-11 08:00:00 (Sun)
  63992682000, #  local_start 2028-11-05 01:00:00 (Sun)
  64003572000, #    local_end 2029-03-11 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  64003593600, #    utc_start 2029-03-11 08:00:00 (Sun)
  64024153200, #      utc_end 2029-11-04 07:00:00 (Sun)
  64003575600, #  local_start 2029-03-11 03:00:00 (Sun)
  64024135200, #    local_end 2029-11-04 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  64024153200, #    utc_start 2029-11-04 07:00:00 (Sun)
  64035043200, #      utc_end 2030-03-10 08:00:00 (Sun)
  64024131600, #  local_start 2029-11-04 01:00:00 (Sun)
  64035021600, #    local_end 2030-03-10 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  64035043200, #    utc_start 2030-03-10 08:00:00 (Sun)
  64055602800, #      utc_end 2030-11-03 07:00:00 (Sun)
  64035025200, #  local_start 2030-03-10 03:00:00 (Sun)
  64055584800, #    local_end 2030-11-03 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {68}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -21600 }
  
  my $last_observance = bless( {
    'format' => 'C%sT',
    'gmtoff' => '-6:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 734083,
      'local_rd_secs' => 7200,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 734083,
      'utc_rd_secs' => 7200,
      'utc_year' => 2011
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -21600,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 734083,
      'local_rd_secs' => 28800,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 734083,
      'utc_rd_secs' => 28800,
      'utc_year' => 2011
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Nov',
      'letter' => 'S',
      'name' => 'US',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Mar',
      'letter' => 'D',
      'name' => 'US',
      'offset_from_std' => 3600,
      'on' => 'Sun>=8',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_NORTH_DAKOTA_BEULAH

    $main::fatpacked{"DateTime/TimeZone/America/North_Dakota/Center.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_NORTH_DAKOTA_CENTER';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::North_Dakota::Center;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::North_Dakota::Center::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59418039600, #      utc_end 1883-11-18 19:00:00 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59418015288, #    local_end 1883-11-18 12:14:48 (Sun)
  -24312,
  0,
  'LMT',
      ],
      [
  59418039600, #    utc_start 1883-11-18 19:00:00 (Sun)
  60502410000, #      utc_end 1918-03-31 09:00:00 (Sun)
  59418014400, #  local_start 1883-11-18 12:00:00 (Sun)
  60502384800, #    local_end 1918-03-31 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  60502410000, #    utc_start 1918-03-31 09:00:00 (Sun)
  60520550400, #      utc_end 1918-10-27 08:00:00 (Sun)
  60502388400, #  local_start 1918-03-31 03:00:00 (Sun)
  60520528800, #    local_end 1918-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  60520550400, #    utc_start 1918-10-27 08:00:00 (Sun)
  60533859600, #      utc_end 1919-03-30 09:00:00 (Sun)
  60520525200, #  local_start 1918-10-27 01:00:00 (Sun)
  60533834400, #    local_end 1919-03-30 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  60533859600, #    utc_start 1919-03-30 09:00:00 (Sun)
  60552000000, #      utc_end 1919-10-26 08:00:00 (Sun)
  60533838000, #  local_start 1919-03-30 03:00:00 (Sun)
  60551978400, #    local_end 1919-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  60552000000, #    utc_start 1919-10-26 08:00:00 (Sun)
  61255472400, #      utc_end 1942-02-09 09:00:00 (Mon)
  60551974800, #  local_start 1919-10-26 01:00:00 (Sun)
  61255447200, #    local_end 1942-02-09 02:00:00 (Mon)
  -25200,
  0,
  'MST',
      ],
      [
  61255472400, #    utc_start 1942-02-09 09:00:00 (Mon)
  61366287600, #      utc_end 1945-08-14 23:00:00 (Tue)
  61255450800, #  local_start 1942-02-09 03:00:00 (Mon)
  61366266000, #    local_end 1945-08-14 17:00:00 (Tue)
  -21600,
  1,
  'MWT',
      ],
      [
  61366287600, #    utc_start 1945-08-14 23:00:00 (Tue)
  61370294400, #      utc_end 1945-09-30 08:00:00 (Sun)
  61366266000, #  local_start 1945-08-14 17:00:00 (Tue)
  61370272800, #    local_end 1945-09-30 02:00:00 (Sun)
  -21600,
  1,
  'MPT',
      ],
      [
  61370294400, #    utc_start 1945-09-30 08:00:00 (Sun)
  62051302800, #      utc_end 1967-04-30 09:00:00 (Sun)
  61370269200, #  local_start 1945-09-30 01:00:00 (Sun)
  62051277600, #    local_end 1967-04-30 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62051302800, #    utc_start 1967-04-30 09:00:00 (Sun)
  62067024000, #      utc_end 1967-10-29 08:00:00 (Sun)
  62051281200, #  local_start 1967-04-30 03:00:00 (Sun)
  62067002400, #    local_end 1967-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62067024000, #    utc_start 1967-10-29 08:00:00 (Sun)
  62082752400, #      utc_end 1968-04-28 09:00:00 (Sun)
  62066998800, #  local_start 1967-10-29 01:00:00 (Sun)
  62082727200, #    local_end 1968-04-28 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62082752400, #    utc_start 1968-04-28 09:00:00 (Sun)
  62098473600, #      utc_end 1968-10-27 08:00:00 (Sun)
  62082730800, #  local_start 1968-04-28 03:00:00 (Sun)
  62098452000, #    local_end 1968-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62098473600, #    utc_start 1968-10-27 08:00:00 (Sun)
  62114202000, #      utc_end 1969-04-27 09:00:00 (Sun)
  62098448400, #  local_start 1968-10-27 01:00:00 (Sun)
  62114176800, #    local_end 1969-04-27 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62114202000, #    utc_start 1969-04-27 09:00:00 (Sun)
  62129923200, #      utc_end 1969-10-26 08:00:00 (Sun)
  62114180400, #  local_start 1969-04-27 03:00:00 (Sun)
  62129901600, #    local_end 1969-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62129923200, #    utc_start 1969-10-26 08:00:00 (Sun)
  62145651600, #      utc_end 1970-04-26 09:00:00 (Sun)
  62129898000, #  local_start 1969-10-26 01:00:00 (Sun)
  62145626400, #    local_end 1970-04-26 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62145651600, #    utc_start 1970-04-26 09:00:00 (Sun)
  62161372800, #      utc_end 1970-10-25 08:00:00 (Sun)
  62145630000, #  local_start 1970-04-26 03:00:00 (Sun)
  62161351200, #    local_end 1970-10-25 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62161372800, #    utc_start 1970-10-25 08:00:00 (Sun)
  62177101200, #      utc_end 1971-04-25 09:00:00 (Sun)
  62161347600, #  local_start 1970-10-25 01:00:00 (Sun)
  62177076000, #    local_end 1971-04-25 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62177101200, #    utc_start 1971-04-25 09:00:00 (Sun)
  62193427200, #      utc_end 1971-10-31 08:00:00 (Sun)
  62177079600, #  local_start 1971-04-25 03:00:00 (Sun)
  62193405600, #    local_end 1971-10-31 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62193427200, #    utc_start 1971-10-31 08:00:00 (Sun)
  62209155600, #      utc_end 1972-04-30 09:00:00 (Sun)
  62193402000, #  local_start 1971-10-31 01:00:00 (Sun)
  62209130400, #    local_end 1972-04-30 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62209155600, #    utc_start 1972-04-30 09:00:00 (Sun)
  62224876800, #      utc_end 1972-10-29 08:00:00 (Sun)
  62209134000, #  local_start 1972-04-30 03:00:00 (Sun)
  62224855200, #    local_end 1972-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62224876800, #    utc_start 1972-10-29 08:00:00 (Sun)
  62240605200, #      utc_end 1973-04-29 09:00:00 (Sun)
  62224851600, #  local_start 1972-10-29 01:00:00 (Sun)
  62240580000, #    local_end 1973-04-29 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62240605200, #    utc_start 1973-04-29 09:00:00 (Sun)
  62256326400, #      utc_end 1973-10-28 08:00:00 (Sun)
  62240583600, #  local_start 1973-04-29 03:00:00 (Sun)
  62256304800, #    local_end 1973-10-28 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62256326400, #    utc_start 1973-10-28 08:00:00 (Sun)
  62262378000, #      utc_end 1974-01-06 09:00:00 (Sun)
  62256301200, #  local_start 1973-10-28 01:00:00 (Sun)
  62262352800, #    local_end 1974-01-06 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62262378000, #    utc_start 1974-01-06 09:00:00 (Sun)
  62287776000, #      utc_end 1974-10-27 08:00:00 (Sun)
  62262356400, #  local_start 1974-01-06 03:00:00 (Sun)
  62287754400, #    local_end 1974-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62287776000, #    utc_start 1974-10-27 08:00:00 (Sun)
  62298061200, #      utc_end 1975-02-23 09:00:00 (Sun)
  62287750800, #  local_start 1974-10-27 01:00:00 (Sun)
  62298036000, #    local_end 1975-02-23 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62298061200, #    utc_start 1975-02-23 09:00:00 (Sun)
  62319225600, #      utc_end 1975-10-26 08:00:00 (Sun)
  62298039600, #  local_start 1975-02-23 03:00:00 (Sun)
  62319204000, #    local_end 1975-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62319225600, #    utc_start 1975-10-26 08:00:00 (Sun)
  62334954000, #      utc_end 1976-04-25 09:00:00 (Sun)
  62319200400, #  local_start 1975-10-26 01:00:00 (Sun)
  62334928800, #    local_end 1976-04-25 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62334954000, #    utc_start 1976-04-25 09:00:00 (Sun)
  62351280000, #      utc_end 1976-10-31 08:00:00 (Sun)
  62334932400, #  local_start 1976-04-25 03:00:00 (Sun)
  62351258400, #    local_end 1976-10-31 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62351280000, #    utc_start 1976-10-31 08:00:00 (Sun)
  62366403600, #      utc_end 1977-04-24 09:00:00 (Sun)
  62351254800, #  local_start 1976-10-31 01:00:00 (Sun)
  62366378400, #    local_end 1977-04-24 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62366403600, #    utc_start 1977-04-24 09:00:00 (Sun)
  62382729600, #      utc_end 1977-10-30 08:00:00 (Sun)
  62366382000, #  local_start 1977-04-24 03:00:00 (Sun)
  62382708000, #    local_end 1977-10-30 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62382729600, #    utc_start 1977-10-30 08:00:00 (Sun)
  62398458000, #      utc_end 1978-04-30 09:00:00 (Sun)
  62382704400, #  local_start 1977-10-30 01:00:00 (Sun)
  62398432800, #    local_end 1978-04-30 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62398458000, #    utc_start 1978-04-30 09:00:00 (Sun)
  62414179200, #      utc_end 1978-10-29 08:00:00 (Sun)
  62398436400, #  local_start 1978-04-30 03:00:00 (Sun)
  62414157600, #    local_end 1978-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62414179200, #    utc_start 1978-10-29 08:00:00 (Sun)
  62429907600, #      utc_end 1979-04-29 09:00:00 (Sun)
  62414154000, #  local_start 1978-10-29 01:00:00 (Sun)
  62429882400, #    local_end 1979-04-29 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62429907600, #    utc_start 1979-04-29 09:00:00 (Sun)
  62445628800, #      utc_end 1979-10-28 08:00:00 (Sun)
  62429886000, #  local_start 1979-04-29 03:00:00 (Sun)
  62445607200, #    local_end 1979-10-28 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62445628800, #    utc_start 1979-10-28 08:00:00 (Sun)
  62461357200, #      utc_end 1980-04-27 09:00:00 (Sun)
  62445603600, #  local_start 1979-10-28 01:00:00 (Sun)
  62461332000, #    local_end 1980-04-27 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62461357200, #    utc_start 1980-04-27 09:00:00 (Sun)
  62477078400, #      utc_end 1980-10-26 08:00:00 (Sun)
  62461335600, #  local_start 1980-04-27 03:00:00 (Sun)
  62477056800, #    local_end 1980-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62477078400, #    utc_start 1980-10-26 08:00:00 (Sun)
  62492806800, #      utc_end 1981-04-26 09:00:00 (Sun)
  62477053200, #  local_start 1980-10-26 01:00:00 (Sun)
  62492781600, #    local_end 1981-04-26 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62492806800, #    utc_start 1981-04-26 09:00:00 (Sun)
  62508528000, #      utc_end 1981-10-25 08:00:00 (Sun)
  62492785200, #  local_start 1981-04-26 03:00:00 (Sun)
  62508506400, #    local_end 1981-10-25 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62508528000, #    utc_start 1981-10-25 08:00:00 (Sun)
  62524256400, #      utc_end 1982-04-25 09:00:00 (Sun)
  62508502800, #  local_start 1981-10-25 01:00:00 (Sun)
  62524231200, #    local_end 1982-04-25 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62524256400, #    utc_start 1982-04-25 09:00:00 (Sun)
  62540582400, #      utc_end 1982-10-31 08:00:00 (Sun)
  62524234800, #  local_start 1982-04-25 03:00:00 (Sun)
  62540560800, #    local_end 1982-10-31 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62540582400, #    utc_start 1982-10-31 08:00:00 (Sun)
  62555706000, #      utc_end 1983-04-24 09:00:00 (Sun)
  62540557200, #  local_start 1982-10-31 01:00:00 (Sun)
  62555680800, #    local_end 1983-04-24 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62555706000, #    utc_start 1983-04-24 09:00:00 (Sun)
  62572032000, #      utc_end 1983-10-30 08:00:00 (Sun)
  62555684400, #  local_start 1983-04-24 03:00:00 (Sun)
  62572010400, #    local_end 1983-10-30 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62572032000, #    utc_start 1983-10-30 08:00:00 (Sun)
  62587760400, #      utc_end 1984-04-29 09:00:00 (Sun)
  62572006800, #  local_start 1983-10-30 01:00:00 (Sun)
  62587735200, #    local_end 1984-04-29 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62587760400, #    utc_start 1984-04-29 09:00:00 (Sun)
  62603481600, #      utc_end 1984-10-28 08:00:00 (Sun)
  62587738800, #  local_start 1984-04-29 03:00:00 (Sun)
  62603460000, #    local_end 1984-10-28 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62603481600, #    utc_start 1984-10-28 08:00:00 (Sun)
  62619210000, #      utc_end 1985-04-28 09:00:00 (Sun)
  62603456400, #  local_start 1984-10-28 01:00:00 (Sun)
  62619184800, #    local_end 1985-04-28 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62619210000, #    utc_start 1985-04-28 09:00:00 (Sun)
  62634931200, #      utc_end 1985-10-27 08:00:00 (Sun)
  62619188400, #  local_start 1985-04-28 03:00:00 (Sun)
  62634909600, #    local_end 1985-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62634931200, #    utc_start 1985-10-27 08:00:00 (Sun)
  62650659600, #      utc_end 1986-04-27 09:00:00 (Sun)
  62634906000, #  local_start 1985-10-27 01:00:00 (Sun)
  62650634400, #    local_end 1986-04-27 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62650659600, #    utc_start 1986-04-27 09:00:00 (Sun)
  62666380800, #      utc_end 1986-10-26 08:00:00 (Sun)
  62650638000, #  local_start 1986-04-27 03:00:00 (Sun)
  62666359200, #    local_end 1986-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62666380800, #    utc_start 1986-10-26 08:00:00 (Sun)
  62680294800, #      utc_end 1987-04-05 09:00:00 (Sun)
  62666355600, #  local_start 1986-10-26 01:00:00 (Sun)
  62680269600, #    local_end 1987-04-05 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62680294800, #    utc_start 1987-04-05 09:00:00 (Sun)
  62697830400, #      utc_end 1987-10-25 08:00:00 (Sun)
  62680273200, #  local_start 1987-04-05 03:00:00 (Sun)
  62697808800, #    local_end 1987-10-25 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62697830400, #    utc_start 1987-10-25 08:00:00 (Sun)
  62711744400, #      utc_end 1988-04-03 09:00:00 (Sun)
  62697805200, #  local_start 1987-10-25 01:00:00 (Sun)
  62711719200, #    local_end 1988-04-03 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62711744400, #    utc_start 1988-04-03 09:00:00 (Sun)
  62729884800, #      utc_end 1988-10-30 08:00:00 (Sun)
  62711722800, #  local_start 1988-04-03 03:00:00 (Sun)
  62729863200, #    local_end 1988-10-30 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62729884800, #    utc_start 1988-10-30 08:00:00 (Sun)
  62743194000, #      utc_end 1989-04-02 09:00:00 (Sun)
  62729859600, #  local_start 1988-10-30 01:00:00 (Sun)
  62743168800, #    local_end 1989-04-02 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62743194000, #    utc_start 1989-04-02 09:00:00 (Sun)
  62761334400, #      utc_end 1989-10-29 08:00:00 (Sun)
  62743172400, #  local_start 1989-04-02 03:00:00 (Sun)
  62761312800, #    local_end 1989-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62761334400, #    utc_start 1989-10-29 08:00:00 (Sun)
  62774643600, #      utc_end 1990-04-01 09:00:00 (Sun)
  62761309200, #  local_start 1989-10-29 01:00:00 (Sun)
  62774618400, #    local_end 1990-04-01 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62774643600, #    utc_start 1990-04-01 09:00:00 (Sun)
  62792784000, #      utc_end 1990-10-28 08:00:00 (Sun)
  62774622000, #  local_start 1990-04-01 03:00:00 (Sun)
  62792762400, #    local_end 1990-10-28 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62792784000, #    utc_start 1990-10-28 08:00:00 (Sun)
  62806698000, #      utc_end 1991-04-07 09:00:00 (Sun)
  62792758800, #  local_start 1990-10-28 01:00:00 (Sun)
  62806672800, #    local_end 1991-04-07 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62806698000, #    utc_start 1991-04-07 09:00:00 (Sun)
  62824233600, #      utc_end 1991-10-27 08:00:00 (Sun)
  62806676400, #  local_start 1991-04-07 03:00:00 (Sun)
  62824212000, #    local_end 1991-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62824233600, #    utc_start 1991-10-27 08:00:00 (Sun)
  62838147600, #      utc_end 1992-04-05 09:00:00 (Sun)
  62824208400, #  local_start 1991-10-27 01:00:00 (Sun)
  62838122400, #    local_end 1992-04-05 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62838147600, #    utc_start 1992-04-05 09:00:00 (Sun)
  62855683200, #      utc_end 1992-10-25 08:00:00 (Sun)
  62838126000, #  local_start 1992-04-05 03:00:00 (Sun)
  62855661600, #    local_end 1992-10-25 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62855683200, #    utc_start 1992-10-25 08:00:00 (Sun)
  62869593600, #      utc_end 1993-04-04 08:00:00 (Sun)
  62855661600, #  local_start 1992-10-25 02:00:00 (Sun)
  62869572000, #    local_end 1993-04-04 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62869593600, #    utc_start 1993-04-04 08:00:00 (Sun)
  62887734000, #      utc_end 1993-10-31 07:00:00 (Sun)
  62869575600, #  local_start 1993-04-04 03:00:00 (Sun)
  62887716000, #    local_end 1993-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62887734000, #    utc_start 1993-10-31 07:00:00 (Sun)
  62901043200, #      utc_end 1994-04-03 08:00:00 (Sun)
  62887712400, #  local_start 1993-10-31 01:00:00 (Sun)
  62901021600, #    local_end 1994-04-03 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62901043200, #    utc_start 1994-04-03 08:00:00 (Sun)
  62919183600, #      utc_end 1994-10-30 07:00:00 (Sun)
  62901025200, #  local_start 1994-04-03 03:00:00 (Sun)
  62919165600, #    local_end 1994-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62919183600, #    utc_start 1994-10-30 07:00:00 (Sun)
  62932492800, #      utc_end 1995-04-02 08:00:00 (Sun)
  62919162000, #  local_start 1994-10-30 01:00:00 (Sun)
  62932471200, #    local_end 1995-04-02 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62932492800, #    utc_start 1995-04-02 08:00:00 (Sun)
  62950633200, #      utc_end 1995-10-29 07:00:00 (Sun)
  62932474800, #  local_start 1995-04-02 03:00:00 (Sun)
  62950615200, #    local_end 1995-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62950633200, #    utc_start 1995-10-29 07:00:00 (Sun)
  62964547200, #      utc_end 1996-04-07 08:00:00 (Sun)
  62950611600, #  local_start 1995-10-29 01:00:00 (Sun)
  62964525600, #    local_end 1996-04-07 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62964547200, #    utc_start 1996-04-07 08:00:00 (Sun)
  62982082800, #      utc_end 1996-10-27 07:00:00 (Sun)
  62964529200, #  local_start 1996-04-07 03:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62982082800, #    utc_start 1996-10-27 07:00:00 (Sun)
  62995996800, #      utc_end 1997-04-06 08:00:00 (Sun)
  62982061200, #  local_start 1996-10-27 01:00:00 (Sun)
  62995975200, #    local_end 1997-04-06 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62995996800, #    utc_start 1997-04-06 08:00:00 (Sun)
  63013532400, #      utc_end 1997-10-26 07:00:00 (Sun)
  62995978800, #  local_start 1997-04-06 03:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63013532400, #    utc_start 1997-10-26 07:00:00 (Sun)
  63027446400, #      utc_end 1998-04-05 08:00:00 (Sun)
  63013510800, #  local_start 1997-10-26 01:00:00 (Sun)
  63027424800, #    local_end 1998-04-05 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63027446400, #    utc_start 1998-04-05 08:00:00 (Sun)
  63044982000, #      utc_end 1998-10-25 07:00:00 (Sun)
  63027428400, #  local_start 1998-04-05 03:00:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63044982000, #    utc_start 1998-10-25 07:00:00 (Sun)
  63058896000, #      utc_end 1999-04-04 08:00:00 (Sun)
  63044960400, #  local_start 1998-10-25 01:00:00 (Sun)
  63058874400, #    local_end 1999-04-04 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63058896000, #    utc_start 1999-04-04 08:00:00 (Sun)
  63077036400, #      utc_end 1999-10-31 07:00:00 (Sun)
  63058878000, #  local_start 1999-04-04 03:00:00 (Sun)
  63077018400, #    local_end 1999-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63077036400, #    utc_start 1999-10-31 07:00:00 (Sun)
  63090345600, #      utc_end 2000-04-02 08:00:00 (Sun)
  63077014800, #  local_start 1999-10-31 01:00:00 (Sun)
  63090324000, #    local_end 2000-04-02 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63090345600, #    utc_start 2000-04-02 08:00:00 (Sun)
  63108486000, #      utc_end 2000-10-29 07:00:00 (Sun)
  63090327600, #  local_start 2000-04-02 03:00:00 (Sun)
  63108468000, #    local_end 2000-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63108486000, #    utc_start 2000-10-29 07:00:00 (Sun)
  63121795200, #      utc_end 2001-04-01 08:00:00 (Sun)
  63108464400, #  local_start 2000-10-29 01:00:00 (Sun)
  63121773600, #    local_end 2001-04-01 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63121795200, #    utc_start 2001-04-01 08:00:00 (Sun)
  63139935600, #      utc_end 2001-10-28 07:00:00 (Sun)
  63121777200, #  local_start 2001-04-01 03:00:00 (Sun)
  63139917600, #    local_end 2001-10-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63139935600, #    utc_start 2001-10-28 07:00:00 (Sun)
  63153849600, #      utc_end 2002-04-07 08:00:00 (Sun)
  63139914000, #  local_start 2001-10-28 01:00:00 (Sun)
  63153828000, #    local_end 2002-04-07 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63153849600, #    utc_start 2002-04-07 08:00:00 (Sun)
  63171385200, #      utc_end 2002-10-27 07:00:00 (Sun)
  63153831600, #  local_start 2002-04-07 03:00:00 (Sun)
  63171367200, #    local_end 2002-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63171385200, #    utc_start 2002-10-27 07:00:00 (Sun)
  63185299200, #      utc_end 2003-04-06 08:00:00 (Sun)
  63171363600, #  local_start 2002-10-27 01:00:00 (Sun)
  63185277600, #    local_end 2003-04-06 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63185299200, #    utc_start 2003-04-06 08:00:00 (Sun)
  63202834800, #      utc_end 2003-10-26 07:00:00 (Sun)
  63185281200, #  local_start 2003-04-06 03:00:00 (Sun)
  63202816800, #    local_end 2003-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63202834800, #    utc_start 2003-10-26 07:00:00 (Sun)
  63216748800, #      utc_end 2004-04-04 08:00:00 (Sun)
  63202813200, #  local_start 2003-10-26 01:00:00 (Sun)
  63216727200, #    local_end 2004-04-04 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63216748800, #    utc_start 2004-04-04 08:00:00 (Sun)
  63234889200, #      utc_end 2004-10-31 07:00:00 (Sun)
  63216730800, #  local_start 2004-04-04 03:00:00 (Sun)
  63234871200, #    local_end 2004-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63234889200, #    utc_start 2004-10-31 07:00:00 (Sun)
  63248198400, #      utc_end 2005-04-03 08:00:00 (Sun)
  63234867600, #  local_start 2004-10-31 01:00:00 (Sun)
  63248176800, #    local_end 2005-04-03 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63248198400, #    utc_start 2005-04-03 08:00:00 (Sun)
  63266338800, #      utc_end 2005-10-30 07:00:00 (Sun)
  63248180400, #  local_start 2005-04-03 03:00:00 (Sun)
  63266320800, #    local_end 2005-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63266338800, #    utc_start 2005-10-30 07:00:00 (Sun)
  63279648000, #      utc_end 2006-04-02 08:00:00 (Sun)
  63266317200, #  local_start 2005-10-30 01:00:00 (Sun)
  63279626400, #    local_end 2006-04-02 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63279648000, #    utc_start 2006-04-02 08:00:00 (Sun)
  63297788400, #      utc_end 2006-10-29 07:00:00 (Sun)
  63279630000, #  local_start 2006-04-02 03:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63297788400, #    utc_start 2006-10-29 07:00:00 (Sun)
  63309283200, #      utc_end 2007-03-11 08:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63309261600, #    local_end 2007-03-11 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63309283200, #    utc_start 2007-03-11 08:00:00 (Sun)
  63329842800, #      utc_end 2007-11-04 07:00:00 (Sun)
  63309265200, #  local_start 2007-03-11 03:00:00 (Sun)
  63329824800, #    local_end 2007-11-04 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63329842800, #    utc_start 2007-11-04 07:00:00 (Sun)
  63340732800, #      utc_end 2008-03-09 08:00:00 (Sun)
  63329821200, #  local_start 2007-11-04 01:00:00 (Sun)
  63340711200, #    local_end 2008-03-09 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63340732800, #    utc_start 2008-03-09 08:00:00 (Sun)
  63361292400, #      utc_end 2008-11-02 07:00:00 (Sun)
  63340714800, #  local_start 2008-03-09 03:00:00 (Sun)
  63361274400, #    local_end 2008-11-02 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63361292400, #    utc_start 2008-11-02 07:00:00 (Sun)
  63372182400, #      utc_end 2009-03-08 08:00:00 (Sun)
  63361270800, #  local_start 2008-11-02 01:00:00 (Sun)
  63372160800, #    local_end 2009-03-08 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63372182400, #    utc_start 2009-03-08 08:00:00 (Sun)
  63392742000, #      utc_end 2009-11-01 07:00:00 (Sun)
  63372164400, #  local_start 2009-03-08 03:00:00 (Sun)
  63392724000, #    local_end 2009-11-01 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63392742000, #    utc_start 2009-11-01 07:00:00 (Sun)
  63404236800, #      utc_end 2010-03-14 08:00:00 (Sun)
  63392720400, #  local_start 2009-11-01 01:00:00 (Sun)
  63404215200, #    local_end 2010-03-14 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63404236800, #    utc_start 2010-03-14 08:00:00 (Sun)
  63424796400, #      utc_end 2010-11-07 07:00:00 (Sun)
  63404218800, #  local_start 2010-03-14 03:00:00 (Sun)
  63424778400, #    local_end 2010-11-07 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63424796400, #    utc_start 2010-11-07 07:00:00 (Sun)
  63435686400, #      utc_end 2011-03-13 08:00:00 (Sun)
  63424774800, #  local_start 2010-11-07 01:00:00 (Sun)
  63435664800, #    local_end 2011-03-13 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63435686400, #    utc_start 2011-03-13 08:00:00 (Sun)
  63456246000, #      utc_end 2011-11-06 07:00:00 (Sun)
  63435668400, #  local_start 2011-03-13 03:00:00 (Sun)
  63456228000, #    local_end 2011-11-06 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63456246000, #    utc_start 2011-11-06 07:00:00 (Sun)
  63467136000, #      utc_end 2012-03-11 08:00:00 (Sun)
  63456224400, #  local_start 2011-11-06 01:00:00 (Sun)
  63467114400, #    local_end 2012-03-11 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63467136000, #    utc_start 2012-03-11 08:00:00 (Sun)
  63487695600, #      utc_end 2012-11-04 07:00:00 (Sun)
  63467118000, #  local_start 2012-03-11 03:00:00 (Sun)
  63487677600, #    local_end 2012-11-04 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63487695600, #    utc_start 2012-11-04 07:00:00 (Sun)
  63498585600, #      utc_end 2013-03-10 08:00:00 (Sun)
  63487674000, #  local_start 2012-11-04 01:00:00 (Sun)
  63498564000, #    local_end 2013-03-10 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63498585600, #    utc_start 2013-03-10 08:00:00 (Sun)
  63519145200, #      utc_end 2013-11-03 07:00:00 (Sun)
  63498567600, #  local_start 2013-03-10 03:00:00 (Sun)
  63519127200, #    local_end 2013-11-03 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63519145200, #    utc_start 2013-11-03 07:00:00 (Sun)
  63530035200, #      utc_end 2014-03-09 08:00:00 (Sun)
  63519123600, #  local_start 2013-11-03 01:00:00 (Sun)
  63530013600, #    local_end 2014-03-09 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63530035200, #    utc_start 2014-03-09 08:00:00 (Sun)
  63550594800, #      utc_end 2014-11-02 07:00:00 (Sun)
  63530017200, #  local_start 2014-03-09 03:00:00 (Sun)
  63550576800, #    local_end 2014-11-02 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63550594800, #    utc_start 2014-11-02 07:00:00 (Sun)
  63561484800, #      utc_end 2015-03-08 08:00:00 (Sun)
  63550573200, #  local_start 2014-11-02 01:00:00 (Sun)
  63561463200, #    local_end 2015-03-08 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63561484800, #    utc_start 2015-03-08 08:00:00 (Sun)
  63582044400, #      utc_end 2015-11-01 07:00:00 (Sun)
  63561466800, #  local_start 2015-03-08 03:00:00 (Sun)
  63582026400, #    local_end 2015-11-01 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63582044400, #    utc_start 2015-11-01 07:00:00 (Sun)
  63593539200, #      utc_end 2016-03-13 08:00:00 (Sun)
  63582022800, #  local_start 2015-11-01 01:00:00 (Sun)
  63593517600, #    local_end 2016-03-13 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63593539200, #    utc_start 2016-03-13 08:00:00 (Sun)
  63614098800, #      utc_end 2016-11-06 07:00:00 (Sun)
  63593521200, #  local_start 2016-03-13 03:00:00 (Sun)
  63614080800, #    local_end 2016-11-06 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63614098800, #    utc_start 2016-11-06 07:00:00 (Sun)
  63624988800, #      utc_end 2017-03-12 08:00:00 (Sun)
  63614077200, #  local_start 2016-11-06 01:00:00 (Sun)
  63624967200, #    local_end 2017-03-12 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63624988800, #    utc_start 2017-03-12 08:00:00 (Sun)
  63645548400, #      utc_end 2017-11-05 07:00:00 (Sun)
  63624970800, #  local_start 2017-03-12 03:00:00 (Sun)
  63645530400, #    local_end 2017-11-05 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63645548400, #    utc_start 2017-11-05 07:00:00 (Sun)
  63656438400, #      utc_end 2018-03-11 08:00:00 (Sun)
  63645526800, #  local_start 2017-11-05 01:00:00 (Sun)
  63656416800, #    local_end 2018-03-11 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63656438400, #    utc_start 2018-03-11 08:00:00 (Sun)
  63676998000, #      utc_end 2018-11-04 07:00:00 (Sun)
  63656420400, #  local_start 2018-03-11 03:00:00 (Sun)
  63676980000, #    local_end 2018-11-04 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63676998000, #    utc_start 2018-11-04 07:00:00 (Sun)
  63687888000, #      utc_end 2019-03-10 08:00:00 (Sun)
  63676976400, #  local_start 2018-11-04 01:00:00 (Sun)
  63687866400, #    local_end 2019-03-10 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63687888000, #    utc_start 2019-03-10 08:00:00 (Sun)
  63708447600, #      utc_end 2019-11-03 07:00:00 (Sun)
  63687870000, #  local_start 2019-03-10 03:00:00 (Sun)
  63708429600, #    local_end 2019-11-03 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63708447600, #    utc_start 2019-11-03 07:00:00 (Sun)
  63719337600, #      utc_end 2020-03-08 08:00:00 (Sun)
  63708426000, #  local_start 2019-11-03 01:00:00 (Sun)
  63719316000, #    local_end 2020-03-08 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63719337600, #    utc_start 2020-03-08 08:00:00 (Sun)
  63739897200, #      utc_end 2020-11-01 07:00:00 (Sun)
  63719319600, #  local_start 2020-03-08 03:00:00 (Sun)
  63739879200, #    local_end 2020-11-01 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63739897200, #    utc_start 2020-11-01 07:00:00 (Sun)
  63751392000, #      utc_end 2021-03-14 08:00:00 (Sun)
  63739875600, #  local_start 2020-11-01 01:00:00 (Sun)
  63751370400, #    local_end 2021-03-14 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63751392000, #    utc_start 2021-03-14 08:00:00 (Sun)
  63771951600, #      utc_end 2021-11-07 07:00:00 (Sun)
  63751374000, #  local_start 2021-03-14 03:00:00 (Sun)
  63771933600, #    local_end 2021-11-07 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63771951600, #    utc_start 2021-11-07 07:00:00 (Sun)
  63782841600, #      utc_end 2022-03-13 08:00:00 (Sun)
  63771930000, #  local_start 2021-11-07 01:00:00 (Sun)
  63782820000, #    local_end 2022-03-13 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63782841600, #    utc_start 2022-03-13 08:00:00 (Sun)
  63803401200, #      utc_end 2022-11-06 07:00:00 (Sun)
  63782823600, #  local_start 2022-03-13 03:00:00 (Sun)
  63803383200, #    local_end 2022-11-06 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63803401200, #    utc_start 2022-11-06 07:00:00 (Sun)
  63814291200, #      utc_end 2023-03-12 08:00:00 (Sun)
  63803379600, #  local_start 2022-11-06 01:00:00 (Sun)
  63814269600, #    local_end 2023-03-12 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63814291200, #    utc_start 2023-03-12 08:00:00 (Sun)
  63834850800, #      utc_end 2023-11-05 07:00:00 (Sun)
  63814273200, #  local_start 2023-03-12 03:00:00 (Sun)
  63834832800, #    local_end 2023-11-05 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63834850800, #    utc_start 2023-11-05 07:00:00 (Sun)
  63845740800, #      utc_end 2024-03-10 08:00:00 (Sun)
  63834829200, #  local_start 2023-11-05 01:00:00 (Sun)
  63845719200, #    local_end 2024-03-10 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63845740800, #    utc_start 2024-03-10 08:00:00 (Sun)
  63866300400, #      utc_end 2024-11-03 07:00:00 (Sun)
  63845722800, #  local_start 2024-03-10 03:00:00 (Sun)
  63866282400, #    local_end 2024-11-03 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63866300400, #    utc_start 2024-11-03 07:00:00 (Sun)
  63877190400, #      utc_end 2025-03-09 08:00:00 (Sun)
  63866278800, #  local_start 2024-11-03 01:00:00 (Sun)
  63877168800, #    local_end 2025-03-09 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63877190400, #    utc_start 2025-03-09 08:00:00 (Sun)
  63897750000, #      utc_end 2025-11-02 07:00:00 (Sun)
  63877172400, #  local_start 2025-03-09 03:00:00 (Sun)
  63897732000, #    local_end 2025-11-02 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63897750000, #    utc_start 2025-11-02 07:00:00 (Sun)
  63908640000, #      utc_end 2026-03-08 08:00:00 (Sun)
  63897728400, #  local_start 2025-11-02 01:00:00 (Sun)
  63908618400, #    local_end 2026-03-08 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63908640000, #    utc_start 2026-03-08 08:00:00 (Sun)
  63929199600, #      utc_end 2026-11-01 07:00:00 (Sun)
  63908622000, #  local_start 2026-03-08 03:00:00 (Sun)
  63929181600, #    local_end 2026-11-01 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63929199600, #    utc_start 2026-11-01 07:00:00 (Sun)
  63940694400, #      utc_end 2027-03-14 08:00:00 (Sun)
  63929178000, #  local_start 2026-11-01 01:00:00 (Sun)
  63940672800, #    local_end 2027-03-14 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63940694400, #    utc_start 2027-03-14 08:00:00 (Sun)
  63961254000, #      utc_end 2027-11-07 07:00:00 (Sun)
  63940676400, #  local_start 2027-03-14 03:00:00 (Sun)
  63961236000, #    local_end 2027-11-07 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63961254000, #    utc_start 2027-11-07 07:00:00 (Sun)
  63972144000, #      utc_end 2028-03-12 08:00:00 (Sun)
  63961232400, #  local_start 2027-11-07 01:00:00 (Sun)
  63972122400, #    local_end 2028-03-12 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63972144000, #    utc_start 2028-03-12 08:00:00 (Sun)
  63992703600, #      utc_end 2028-11-05 07:00:00 (Sun)
  63972126000, #  local_start 2028-03-12 03:00:00 (Sun)
  63992685600, #    local_end 2028-11-05 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63992703600, #    utc_start 2028-11-05 07:00:00 (Sun)
  64003593600, #      utc_end 2029-03-11 08:00:00 (Sun)
  63992682000, #  local_start 2028-11-05 01:00:00 (Sun)
  64003572000, #    local_end 2029-03-11 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  64003593600, #    utc_start 2029-03-11 08:00:00 (Sun)
  64024153200, #      utc_end 2029-11-04 07:00:00 (Sun)
  64003575600, #  local_start 2029-03-11 03:00:00 (Sun)
  64024135200, #    local_end 2029-11-04 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  64024153200, #    utc_start 2029-11-04 07:00:00 (Sun)
  64035043200, #      utc_end 2030-03-10 08:00:00 (Sun)
  64024131600, #  local_start 2029-11-04 01:00:00 (Sun)
  64035021600, #    local_end 2030-03-10 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  64035043200, #    utc_start 2030-03-10 08:00:00 (Sun)
  64055602800, #      utc_end 2030-11-03 07:00:00 (Sun)
  64035025200, #  local_start 2030-03-10 03:00:00 (Sun)
  64055584800, #    local_end 2030-11-03 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {68}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -21600 }
  
  my $last_observance = bless( {
    'format' => 'C%sT',
    'gmtoff' => '-6:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 727496,
      'local_rd_secs' => 7200,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 727496,
      'utc_rd_secs' => 7200,
      'utc_year' => 1993
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -21600,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 727496,
      'local_rd_secs' => 28800,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 727496,
      'utc_rd_secs' => 28800,
      'utc_year' => 1993
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Nov',
      'letter' => 'S',
      'name' => 'US',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Mar',
      'letter' => 'D',
      'name' => 'US',
      'offset_from_std' => 3600,
      'on' => 'Sun>=8',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_NORTH_DAKOTA_CENTER

    $main::fatpacked{"DateTime/TimeZone/America/North_Dakota/New_Salem.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_NORTH_DAKOTA_NEW_SALEM';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::North_Dakota::New_Salem;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::North_Dakota::New_Salem::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59418039600, #      utc_end 1883-11-18 19:00:00 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59418015261, #    local_end 1883-11-18 12:14:21 (Sun)
  -24339,
  0,
  'LMT',
      ],
      [
  59418039600, #    utc_start 1883-11-18 19:00:00 (Sun)
  60502410000, #      utc_end 1918-03-31 09:00:00 (Sun)
  59418014400, #  local_start 1883-11-18 12:00:00 (Sun)
  60502384800, #    local_end 1918-03-31 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  60502410000, #    utc_start 1918-03-31 09:00:00 (Sun)
  60520550400, #      utc_end 1918-10-27 08:00:00 (Sun)
  60502388400, #  local_start 1918-03-31 03:00:00 (Sun)
  60520528800, #    local_end 1918-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  60520550400, #    utc_start 1918-10-27 08:00:00 (Sun)
  60533859600, #      utc_end 1919-03-30 09:00:00 (Sun)
  60520525200, #  local_start 1918-10-27 01:00:00 (Sun)
  60533834400, #    local_end 1919-03-30 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  60533859600, #    utc_start 1919-03-30 09:00:00 (Sun)
  60552000000, #      utc_end 1919-10-26 08:00:00 (Sun)
  60533838000, #  local_start 1919-03-30 03:00:00 (Sun)
  60551978400, #    local_end 1919-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  60552000000, #    utc_start 1919-10-26 08:00:00 (Sun)
  61255472400, #      utc_end 1942-02-09 09:00:00 (Mon)
  60551974800, #  local_start 1919-10-26 01:00:00 (Sun)
  61255447200, #    local_end 1942-02-09 02:00:00 (Mon)
  -25200,
  0,
  'MST',
      ],
      [
  61255472400, #    utc_start 1942-02-09 09:00:00 (Mon)
  61366287600, #      utc_end 1945-08-14 23:00:00 (Tue)
  61255450800, #  local_start 1942-02-09 03:00:00 (Mon)
  61366266000, #    local_end 1945-08-14 17:00:00 (Tue)
  -21600,
  1,
  'MWT',
      ],
      [
  61366287600, #    utc_start 1945-08-14 23:00:00 (Tue)
  61370294400, #      utc_end 1945-09-30 08:00:00 (Sun)
  61366266000, #  local_start 1945-08-14 17:00:00 (Tue)
  61370272800, #    local_end 1945-09-30 02:00:00 (Sun)
  -21600,
  1,
  'MPT',
      ],
      [
  61370294400, #    utc_start 1945-09-30 08:00:00 (Sun)
  62051302800, #      utc_end 1967-04-30 09:00:00 (Sun)
  61370269200, #  local_start 1945-09-30 01:00:00 (Sun)
  62051277600, #    local_end 1967-04-30 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62051302800, #    utc_start 1967-04-30 09:00:00 (Sun)
  62067024000, #      utc_end 1967-10-29 08:00:00 (Sun)
  62051281200, #  local_start 1967-04-30 03:00:00 (Sun)
  62067002400, #    local_end 1967-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62067024000, #    utc_start 1967-10-29 08:00:00 (Sun)
  62082752400, #      utc_end 1968-04-28 09:00:00 (Sun)
  62066998800, #  local_start 1967-10-29 01:00:00 (Sun)
  62082727200, #    local_end 1968-04-28 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62082752400, #    utc_start 1968-04-28 09:00:00 (Sun)
  62098473600, #      utc_end 1968-10-27 08:00:00 (Sun)
  62082730800, #  local_start 1968-04-28 03:00:00 (Sun)
  62098452000, #    local_end 1968-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62098473600, #    utc_start 1968-10-27 08:00:00 (Sun)
  62114202000, #      utc_end 1969-04-27 09:00:00 (Sun)
  62098448400, #  local_start 1968-10-27 01:00:00 (Sun)
  62114176800, #    local_end 1969-04-27 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62114202000, #    utc_start 1969-04-27 09:00:00 (Sun)
  62129923200, #      utc_end 1969-10-26 08:00:00 (Sun)
  62114180400, #  local_start 1969-04-27 03:00:00 (Sun)
  62129901600, #    local_end 1969-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62129923200, #    utc_start 1969-10-26 08:00:00 (Sun)
  62145651600, #      utc_end 1970-04-26 09:00:00 (Sun)
  62129898000, #  local_start 1969-10-26 01:00:00 (Sun)
  62145626400, #    local_end 1970-04-26 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62145651600, #    utc_start 1970-04-26 09:00:00 (Sun)
  62161372800, #      utc_end 1970-10-25 08:00:00 (Sun)
  62145630000, #  local_start 1970-04-26 03:00:00 (Sun)
  62161351200, #    local_end 1970-10-25 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62161372800, #    utc_start 1970-10-25 08:00:00 (Sun)
  62177101200, #      utc_end 1971-04-25 09:00:00 (Sun)
  62161347600, #  local_start 1970-10-25 01:00:00 (Sun)
  62177076000, #    local_end 1971-04-25 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62177101200, #    utc_start 1971-04-25 09:00:00 (Sun)
  62193427200, #      utc_end 1971-10-31 08:00:00 (Sun)
  62177079600, #  local_start 1971-04-25 03:00:00 (Sun)
  62193405600, #    local_end 1971-10-31 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62193427200, #    utc_start 1971-10-31 08:00:00 (Sun)
  62209155600, #      utc_end 1972-04-30 09:00:00 (Sun)
  62193402000, #  local_start 1971-10-31 01:00:00 (Sun)
  62209130400, #    local_end 1972-04-30 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62209155600, #    utc_start 1972-04-30 09:00:00 (Sun)
  62224876800, #      utc_end 1972-10-29 08:00:00 (Sun)
  62209134000, #  local_start 1972-04-30 03:00:00 (Sun)
  62224855200, #    local_end 1972-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62224876800, #    utc_start 1972-10-29 08:00:00 (Sun)
  62240605200, #      utc_end 1973-04-29 09:00:00 (Sun)
  62224851600, #  local_start 1972-10-29 01:00:00 (Sun)
  62240580000, #    local_end 1973-04-29 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62240605200, #    utc_start 1973-04-29 09:00:00 (Sun)
  62256326400, #      utc_end 1973-10-28 08:00:00 (Sun)
  62240583600, #  local_start 1973-04-29 03:00:00 (Sun)
  62256304800, #    local_end 1973-10-28 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62256326400, #    utc_start 1973-10-28 08:00:00 (Sun)
  62262378000, #      utc_end 1974-01-06 09:00:00 (Sun)
  62256301200, #  local_start 1973-10-28 01:00:00 (Sun)
  62262352800, #    local_end 1974-01-06 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62262378000, #    utc_start 1974-01-06 09:00:00 (Sun)
  62287776000, #      utc_end 1974-10-27 08:00:00 (Sun)
  62262356400, #  local_start 1974-01-06 03:00:00 (Sun)
  62287754400, #    local_end 1974-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62287776000, #    utc_start 1974-10-27 08:00:00 (Sun)
  62298061200, #      utc_end 1975-02-23 09:00:00 (Sun)
  62287750800, #  local_start 1974-10-27 01:00:00 (Sun)
  62298036000, #    local_end 1975-02-23 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62298061200, #    utc_start 1975-02-23 09:00:00 (Sun)
  62319225600, #      utc_end 1975-10-26 08:00:00 (Sun)
  62298039600, #  local_start 1975-02-23 03:00:00 (Sun)
  62319204000, #    local_end 1975-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62319225600, #    utc_start 1975-10-26 08:00:00 (Sun)
  62334954000, #      utc_end 1976-04-25 09:00:00 (Sun)
  62319200400, #  local_start 1975-10-26 01:00:00 (Sun)
  62334928800, #    local_end 1976-04-25 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62334954000, #    utc_start 1976-04-25 09:00:00 (Sun)
  62351280000, #      utc_end 1976-10-31 08:00:00 (Sun)
  62334932400, #  local_start 1976-04-25 03:00:00 (Sun)
  62351258400, #    local_end 1976-10-31 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62351280000, #    utc_start 1976-10-31 08:00:00 (Sun)
  62366403600, #      utc_end 1977-04-24 09:00:00 (Sun)
  62351254800, #  local_start 1976-10-31 01:00:00 (Sun)
  62366378400, #    local_end 1977-04-24 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62366403600, #    utc_start 1977-04-24 09:00:00 (Sun)
  62382729600, #      utc_end 1977-10-30 08:00:00 (Sun)
  62366382000, #  local_start 1977-04-24 03:00:00 (Sun)
  62382708000, #    local_end 1977-10-30 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62382729600, #    utc_start 1977-10-30 08:00:00 (Sun)
  62398458000, #      utc_end 1978-04-30 09:00:00 (Sun)
  62382704400, #  local_start 1977-10-30 01:00:00 (Sun)
  62398432800, #    local_end 1978-04-30 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62398458000, #    utc_start 1978-04-30 09:00:00 (Sun)
  62414179200, #      utc_end 1978-10-29 08:00:00 (Sun)
  62398436400, #  local_start 1978-04-30 03:00:00 (Sun)
  62414157600, #    local_end 1978-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62414179200, #    utc_start 1978-10-29 08:00:00 (Sun)
  62429907600, #      utc_end 1979-04-29 09:00:00 (Sun)
  62414154000, #  local_start 1978-10-29 01:00:00 (Sun)
  62429882400, #    local_end 1979-04-29 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62429907600, #    utc_start 1979-04-29 09:00:00 (Sun)
  62445628800, #      utc_end 1979-10-28 08:00:00 (Sun)
  62429886000, #  local_start 1979-04-29 03:00:00 (Sun)
  62445607200, #    local_end 1979-10-28 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62445628800, #    utc_start 1979-10-28 08:00:00 (Sun)
  62461357200, #      utc_end 1980-04-27 09:00:00 (Sun)
  62445603600, #  local_start 1979-10-28 01:00:00 (Sun)
  62461332000, #    local_end 1980-04-27 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62461357200, #    utc_start 1980-04-27 09:00:00 (Sun)
  62477078400, #      utc_end 1980-10-26 08:00:00 (Sun)
  62461335600, #  local_start 1980-04-27 03:00:00 (Sun)
  62477056800, #    local_end 1980-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62477078400, #    utc_start 1980-10-26 08:00:00 (Sun)
  62492806800, #      utc_end 1981-04-26 09:00:00 (Sun)
  62477053200, #  local_start 1980-10-26 01:00:00 (Sun)
  62492781600, #    local_end 1981-04-26 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62492806800, #    utc_start 1981-04-26 09:00:00 (Sun)
  62508528000, #      utc_end 1981-10-25 08:00:00 (Sun)
  62492785200, #  local_start 1981-04-26 03:00:00 (Sun)
  62508506400, #    local_end 1981-10-25 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62508528000, #    utc_start 1981-10-25 08:00:00 (Sun)
  62524256400, #      utc_end 1982-04-25 09:00:00 (Sun)
  62508502800, #  local_start 1981-10-25 01:00:00 (Sun)
  62524231200, #    local_end 1982-04-25 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62524256400, #    utc_start 1982-04-25 09:00:00 (Sun)
  62540582400, #      utc_end 1982-10-31 08:00:00 (Sun)
  62524234800, #  local_start 1982-04-25 03:00:00 (Sun)
  62540560800, #    local_end 1982-10-31 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62540582400, #    utc_start 1982-10-31 08:00:00 (Sun)
  62555706000, #      utc_end 1983-04-24 09:00:00 (Sun)
  62540557200, #  local_start 1982-10-31 01:00:00 (Sun)
  62555680800, #    local_end 1983-04-24 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62555706000, #    utc_start 1983-04-24 09:00:00 (Sun)
  62572032000, #      utc_end 1983-10-30 08:00:00 (Sun)
  62555684400, #  local_start 1983-04-24 03:00:00 (Sun)
  62572010400, #    local_end 1983-10-30 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62572032000, #    utc_start 1983-10-30 08:00:00 (Sun)
  62587760400, #      utc_end 1984-04-29 09:00:00 (Sun)
  62572006800, #  local_start 1983-10-30 01:00:00 (Sun)
  62587735200, #    local_end 1984-04-29 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62587760400, #    utc_start 1984-04-29 09:00:00 (Sun)
  62603481600, #      utc_end 1984-10-28 08:00:00 (Sun)
  62587738800, #  local_start 1984-04-29 03:00:00 (Sun)
  62603460000, #    local_end 1984-10-28 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62603481600, #    utc_start 1984-10-28 08:00:00 (Sun)
  62619210000, #      utc_end 1985-04-28 09:00:00 (Sun)
  62603456400, #  local_start 1984-10-28 01:00:00 (Sun)
  62619184800, #    local_end 1985-04-28 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62619210000, #    utc_start 1985-04-28 09:00:00 (Sun)
  62634931200, #      utc_end 1985-10-27 08:00:00 (Sun)
  62619188400, #  local_start 1985-04-28 03:00:00 (Sun)
  62634909600, #    local_end 1985-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62634931200, #    utc_start 1985-10-27 08:00:00 (Sun)
  62650659600, #      utc_end 1986-04-27 09:00:00 (Sun)
  62634906000, #  local_start 1985-10-27 01:00:00 (Sun)
  62650634400, #    local_end 1986-04-27 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62650659600, #    utc_start 1986-04-27 09:00:00 (Sun)
  62666380800, #      utc_end 1986-10-26 08:00:00 (Sun)
  62650638000, #  local_start 1986-04-27 03:00:00 (Sun)
  62666359200, #    local_end 1986-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62666380800, #    utc_start 1986-10-26 08:00:00 (Sun)
  62680294800, #      utc_end 1987-04-05 09:00:00 (Sun)
  62666355600, #  local_start 1986-10-26 01:00:00 (Sun)
  62680269600, #    local_end 1987-04-05 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62680294800, #    utc_start 1987-04-05 09:00:00 (Sun)
  62697830400, #      utc_end 1987-10-25 08:00:00 (Sun)
  62680273200, #  local_start 1987-04-05 03:00:00 (Sun)
  62697808800, #    local_end 1987-10-25 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62697830400, #    utc_start 1987-10-25 08:00:00 (Sun)
  62711744400, #      utc_end 1988-04-03 09:00:00 (Sun)
  62697805200, #  local_start 1987-10-25 01:00:00 (Sun)
  62711719200, #    local_end 1988-04-03 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62711744400, #    utc_start 1988-04-03 09:00:00 (Sun)
  62729884800, #      utc_end 1988-10-30 08:00:00 (Sun)
  62711722800, #  local_start 1988-04-03 03:00:00 (Sun)
  62729863200, #    local_end 1988-10-30 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62729884800, #    utc_start 1988-10-30 08:00:00 (Sun)
  62743194000, #      utc_end 1989-04-02 09:00:00 (Sun)
  62729859600, #  local_start 1988-10-30 01:00:00 (Sun)
  62743168800, #    local_end 1989-04-02 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62743194000, #    utc_start 1989-04-02 09:00:00 (Sun)
  62761334400, #      utc_end 1989-10-29 08:00:00 (Sun)
  62743172400, #  local_start 1989-04-02 03:00:00 (Sun)
  62761312800, #    local_end 1989-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62761334400, #    utc_start 1989-10-29 08:00:00 (Sun)
  62774643600, #      utc_end 1990-04-01 09:00:00 (Sun)
  62761309200, #  local_start 1989-10-29 01:00:00 (Sun)
  62774618400, #    local_end 1990-04-01 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62774643600, #    utc_start 1990-04-01 09:00:00 (Sun)
  62792784000, #      utc_end 1990-10-28 08:00:00 (Sun)
  62774622000, #  local_start 1990-04-01 03:00:00 (Sun)
  62792762400, #    local_end 1990-10-28 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62792784000, #    utc_start 1990-10-28 08:00:00 (Sun)
  62806698000, #      utc_end 1991-04-07 09:00:00 (Sun)
  62792758800, #  local_start 1990-10-28 01:00:00 (Sun)
  62806672800, #    local_end 1991-04-07 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62806698000, #    utc_start 1991-04-07 09:00:00 (Sun)
  62824233600, #      utc_end 1991-10-27 08:00:00 (Sun)
  62806676400, #  local_start 1991-04-07 03:00:00 (Sun)
  62824212000, #    local_end 1991-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62824233600, #    utc_start 1991-10-27 08:00:00 (Sun)
  62838147600, #      utc_end 1992-04-05 09:00:00 (Sun)
  62824208400, #  local_start 1991-10-27 01:00:00 (Sun)
  62838122400, #    local_end 1992-04-05 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62838147600, #    utc_start 1992-04-05 09:00:00 (Sun)
  62855683200, #      utc_end 1992-10-25 08:00:00 (Sun)
  62838126000, #  local_start 1992-04-05 03:00:00 (Sun)
  62855661600, #    local_end 1992-10-25 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62855683200, #    utc_start 1992-10-25 08:00:00 (Sun)
  62869597200, #      utc_end 1993-04-04 09:00:00 (Sun)
  62855658000, #  local_start 1992-10-25 01:00:00 (Sun)
  62869572000, #    local_end 1993-04-04 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62869597200, #    utc_start 1993-04-04 09:00:00 (Sun)
  62887737600, #      utc_end 1993-10-31 08:00:00 (Sun)
  62869575600, #  local_start 1993-04-04 03:00:00 (Sun)
  62887716000, #    local_end 1993-10-31 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62887737600, #    utc_start 1993-10-31 08:00:00 (Sun)
  62901046800, #      utc_end 1994-04-03 09:00:00 (Sun)
  62887712400, #  local_start 1993-10-31 01:00:00 (Sun)
  62901021600, #    local_end 1994-04-03 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62901046800, #    utc_start 1994-04-03 09:00:00 (Sun)
  62919187200, #      utc_end 1994-10-30 08:00:00 (Sun)
  62901025200, #  local_start 1994-04-03 03:00:00 (Sun)
  62919165600, #    local_end 1994-10-30 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62919187200, #    utc_start 1994-10-30 08:00:00 (Sun)
  62932496400, #      utc_end 1995-04-02 09:00:00 (Sun)
  62919162000, #  local_start 1994-10-30 01:00:00 (Sun)
  62932471200, #    local_end 1995-04-02 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62932496400, #    utc_start 1995-04-02 09:00:00 (Sun)
  62950636800, #      utc_end 1995-10-29 08:00:00 (Sun)
  62932474800, #  local_start 1995-04-02 03:00:00 (Sun)
  62950615200, #    local_end 1995-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62950636800, #    utc_start 1995-10-29 08:00:00 (Sun)
  62964550800, #      utc_end 1996-04-07 09:00:00 (Sun)
  62950611600, #  local_start 1995-10-29 01:00:00 (Sun)
  62964525600, #    local_end 1996-04-07 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62964550800, #    utc_start 1996-04-07 09:00:00 (Sun)
  62982086400, #      utc_end 1996-10-27 08:00:00 (Sun)
  62964529200, #  local_start 1996-04-07 03:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62982086400, #    utc_start 1996-10-27 08:00:00 (Sun)
  62996000400, #      utc_end 1997-04-06 09:00:00 (Sun)
  62982061200, #  local_start 1996-10-27 01:00:00 (Sun)
  62995975200, #    local_end 1997-04-06 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62996000400, #    utc_start 1997-04-06 09:00:00 (Sun)
  63013536000, #      utc_end 1997-10-26 08:00:00 (Sun)
  62995978800, #  local_start 1997-04-06 03:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63013536000, #    utc_start 1997-10-26 08:00:00 (Sun)
  63027450000, #      utc_end 1998-04-05 09:00:00 (Sun)
  63013510800, #  local_start 1997-10-26 01:00:00 (Sun)
  63027424800, #    local_end 1998-04-05 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63027450000, #    utc_start 1998-04-05 09:00:00 (Sun)
  63044985600, #      utc_end 1998-10-25 08:00:00 (Sun)
  63027428400, #  local_start 1998-04-05 03:00:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63044985600, #    utc_start 1998-10-25 08:00:00 (Sun)
  63058899600, #      utc_end 1999-04-04 09:00:00 (Sun)
  63044960400, #  local_start 1998-10-25 01:00:00 (Sun)
  63058874400, #    local_end 1999-04-04 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63058899600, #    utc_start 1999-04-04 09:00:00 (Sun)
  63077040000, #      utc_end 1999-10-31 08:00:00 (Sun)
  63058878000, #  local_start 1999-04-04 03:00:00 (Sun)
  63077018400, #    local_end 1999-10-31 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63077040000, #    utc_start 1999-10-31 08:00:00 (Sun)
  63090349200, #      utc_end 2000-04-02 09:00:00 (Sun)
  63077014800, #  local_start 1999-10-31 01:00:00 (Sun)
  63090324000, #    local_end 2000-04-02 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63090349200, #    utc_start 2000-04-02 09:00:00 (Sun)
  63108489600, #      utc_end 2000-10-29 08:00:00 (Sun)
  63090327600, #  local_start 2000-04-02 03:00:00 (Sun)
  63108468000, #    local_end 2000-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63108489600, #    utc_start 2000-10-29 08:00:00 (Sun)
  63121798800, #      utc_end 2001-04-01 09:00:00 (Sun)
  63108464400, #  local_start 2000-10-29 01:00:00 (Sun)
  63121773600, #    local_end 2001-04-01 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63121798800, #    utc_start 2001-04-01 09:00:00 (Sun)
  63139939200, #      utc_end 2001-10-28 08:00:00 (Sun)
  63121777200, #  local_start 2001-04-01 03:00:00 (Sun)
  63139917600, #    local_end 2001-10-28 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63139939200, #    utc_start 2001-10-28 08:00:00 (Sun)
  63153853200, #      utc_end 2002-04-07 09:00:00 (Sun)
  63139914000, #  local_start 2001-10-28 01:00:00 (Sun)
  63153828000, #    local_end 2002-04-07 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63153853200, #    utc_start 2002-04-07 09:00:00 (Sun)
  63171388800, #      utc_end 2002-10-27 08:00:00 (Sun)
  63153831600, #  local_start 2002-04-07 03:00:00 (Sun)
  63171367200, #    local_end 2002-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63171388800, #    utc_start 2002-10-27 08:00:00 (Sun)
  63185302800, #      utc_end 2003-04-06 09:00:00 (Sun)
  63171363600, #  local_start 2002-10-27 01:00:00 (Sun)
  63185277600, #    local_end 2003-04-06 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63185302800, #    utc_start 2003-04-06 09:00:00 (Sun)
  63202838400, #      utc_end 2003-10-26 08:00:00 (Sun)
  63185281200, #  local_start 2003-04-06 03:00:00 (Sun)
  63202816800, #    local_end 2003-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63202838400, #    utc_start 2003-10-26 08:00:00 (Sun)
  63216748800, #      utc_end 2004-04-04 08:00:00 (Sun)
  63202816800, #  local_start 2003-10-26 02:00:00 (Sun)
  63216727200, #    local_end 2004-04-04 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63216748800, #    utc_start 2004-04-04 08:00:00 (Sun)
  63234889200, #      utc_end 2004-10-31 07:00:00 (Sun)
  63216730800, #  local_start 2004-04-04 03:00:00 (Sun)
  63234871200, #    local_end 2004-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63234889200, #    utc_start 2004-10-31 07:00:00 (Sun)
  63248198400, #      utc_end 2005-04-03 08:00:00 (Sun)
  63234867600, #  local_start 2004-10-31 01:00:00 (Sun)
  63248176800, #    local_end 2005-04-03 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63248198400, #    utc_start 2005-04-03 08:00:00 (Sun)
  63266338800, #      utc_end 2005-10-30 07:00:00 (Sun)
  63248180400, #  local_start 2005-04-03 03:00:00 (Sun)
  63266320800, #    local_end 2005-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63266338800, #    utc_start 2005-10-30 07:00:00 (Sun)
  63279648000, #      utc_end 2006-04-02 08:00:00 (Sun)
  63266317200, #  local_start 2005-10-30 01:00:00 (Sun)
  63279626400, #    local_end 2006-04-02 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63279648000, #    utc_start 2006-04-02 08:00:00 (Sun)
  63297788400, #      utc_end 2006-10-29 07:00:00 (Sun)
  63279630000, #  local_start 2006-04-02 03:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63297788400, #    utc_start 2006-10-29 07:00:00 (Sun)
  63309283200, #      utc_end 2007-03-11 08:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63309261600, #    local_end 2007-03-11 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63309283200, #    utc_start 2007-03-11 08:00:00 (Sun)
  63329842800, #      utc_end 2007-11-04 07:00:00 (Sun)
  63309265200, #  local_start 2007-03-11 03:00:00 (Sun)
  63329824800, #    local_end 2007-11-04 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63329842800, #    utc_start 2007-11-04 07:00:00 (Sun)
  63340732800, #      utc_end 2008-03-09 08:00:00 (Sun)
  63329821200, #  local_start 2007-11-04 01:00:00 (Sun)
  63340711200, #    local_end 2008-03-09 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63340732800, #    utc_start 2008-03-09 08:00:00 (Sun)
  63361292400, #      utc_end 2008-11-02 07:00:00 (Sun)
  63340714800, #  local_start 2008-03-09 03:00:00 (Sun)
  63361274400, #    local_end 2008-11-02 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63361292400, #    utc_start 2008-11-02 07:00:00 (Sun)
  63372182400, #      utc_end 2009-03-08 08:00:00 (Sun)
  63361270800, #  local_start 2008-11-02 01:00:00 (Sun)
  63372160800, #    local_end 2009-03-08 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63372182400, #    utc_start 2009-03-08 08:00:00 (Sun)
  63392742000, #      utc_end 2009-11-01 07:00:00 (Sun)
  63372164400, #  local_start 2009-03-08 03:00:00 (Sun)
  63392724000, #    local_end 2009-11-01 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63392742000, #    utc_start 2009-11-01 07:00:00 (Sun)
  63404236800, #      utc_end 2010-03-14 08:00:00 (Sun)
  63392720400, #  local_start 2009-11-01 01:00:00 (Sun)
  63404215200, #    local_end 2010-03-14 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63404236800, #    utc_start 2010-03-14 08:00:00 (Sun)
  63424796400, #      utc_end 2010-11-07 07:00:00 (Sun)
  63404218800, #  local_start 2010-03-14 03:00:00 (Sun)
  63424778400, #    local_end 2010-11-07 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63424796400, #    utc_start 2010-11-07 07:00:00 (Sun)
  63435686400, #      utc_end 2011-03-13 08:00:00 (Sun)
  63424774800, #  local_start 2010-11-07 01:00:00 (Sun)
  63435664800, #    local_end 2011-03-13 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63435686400, #    utc_start 2011-03-13 08:00:00 (Sun)
  63456246000, #      utc_end 2011-11-06 07:00:00 (Sun)
  63435668400, #  local_start 2011-03-13 03:00:00 (Sun)
  63456228000, #    local_end 2011-11-06 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63456246000, #    utc_start 2011-11-06 07:00:00 (Sun)
  63467136000, #      utc_end 2012-03-11 08:00:00 (Sun)
  63456224400, #  local_start 2011-11-06 01:00:00 (Sun)
  63467114400, #    local_end 2012-03-11 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63467136000, #    utc_start 2012-03-11 08:00:00 (Sun)
  63487695600, #      utc_end 2012-11-04 07:00:00 (Sun)
  63467118000, #  local_start 2012-03-11 03:00:00 (Sun)
  63487677600, #    local_end 2012-11-04 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63487695600, #    utc_start 2012-11-04 07:00:00 (Sun)
  63498585600, #      utc_end 2013-03-10 08:00:00 (Sun)
  63487674000, #  local_start 2012-11-04 01:00:00 (Sun)
  63498564000, #    local_end 2013-03-10 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63498585600, #    utc_start 2013-03-10 08:00:00 (Sun)
  63519145200, #      utc_end 2013-11-03 07:00:00 (Sun)
  63498567600, #  local_start 2013-03-10 03:00:00 (Sun)
  63519127200, #    local_end 2013-11-03 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63519145200, #    utc_start 2013-11-03 07:00:00 (Sun)
  63530035200, #      utc_end 2014-03-09 08:00:00 (Sun)
  63519123600, #  local_start 2013-11-03 01:00:00 (Sun)
  63530013600, #    local_end 2014-03-09 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63530035200, #    utc_start 2014-03-09 08:00:00 (Sun)
  63550594800, #      utc_end 2014-11-02 07:00:00 (Sun)
  63530017200, #  local_start 2014-03-09 03:00:00 (Sun)
  63550576800, #    local_end 2014-11-02 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63550594800, #    utc_start 2014-11-02 07:00:00 (Sun)
  63561484800, #      utc_end 2015-03-08 08:00:00 (Sun)
  63550573200, #  local_start 2014-11-02 01:00:00 (Sun)
  63561463200, #    local_end 2015-03-08 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63561484800, #    utc_start 2015-03-08 08:00:00 (Sun)
  63582044400, #      utc_end 2015-11-01 07:00:00 (Sun)
  63561466800, #  local_start 2015-03-08 03:00:00 (Sun)
  63582026400, #    local_end 2015-11-01 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63582044400, #    utc_start 2015-11-01 07:00:00 (Sun)
  63593539200, #      utc_end 2016-03-13 08:00:00 (Sun)
  63582022800, #  local_start 2015-11-01 01:00:00 (Sun)
  63593517600, #    local_end 2016-03-13 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63593539200, #    utc_start 2016-03-13 08:00:00 (Sun)
  63614098800, #      utc_end 2016-11-06 07:00:00 (Sun)
  63593521200, #  local_start 2016-03-13 03:00:00 (Sun)
  63614080800, #    local_end 2016-11-06 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63614098800, #    utc_start 2016-11-06 07:00:00 (Sun)
  63624988800, #      utc_end 2017-03-12 08:00:00 (Sun)
  63614077200, #  local_start 2016-11-06 01:00:00 (Sun)
  63624967200, #    local_end 2017-03-12 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63624988800, #    utc_start 2017-03-12 08:00:00 (Sun)
  63645548400, #      utc_end 2017-11-05 07:00:00 (Sun)
  63624970800, #  local_start 2017-03-12 03:00:00 (Sun)
  63645530400, #    local_end 2017-11-05 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63645548400, #    utc_start 2017-11-05 07:00:00 (Sun)
  63656438400, #      utc_end 2018-03-11 08:00:00 (Sun)
  63645526800, #  local_start 2017-11-05 01:00:00 (Sun)
  63656416800, #    local_end 2018-03-11 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63656438400, #    utc_start 2018-03-11 08:00:00 (Sun)
  63676998000, #      utc_end 2018-11-04 07:00:00 (Sun)
  63656420400, #  local_start 2018-03-11 03:00:00 (Sun)
  63676980000, #    local_end 2018-11-04 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63676998000, #    utc_start 2018-11-04 07:00:00 (Sun)
  63687888000, #      utc_end 2019-03-10 08:00:00 (Sun)
  63676976400, #  local_start 2018-11-04 01:00:00 (Sun)
  63687866400, #    local_end 2019-03-10 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63687888000, #    utc_start 2019-03-10 08:00:00 (Sun)
  63708447600, #      utc_end 2019-11-03 07:00:00 (Sun)
  63687870000, #  local_start 2019-03-10 03:00:00 (Sun)
  63708429600, #    local_end 2019-11-03 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63708447600, #    utc_start 2019-11-03 07:00:00 (Sun)
  63719337600, #      utc_end 2020-03-08 08:00:00 (Sun)
  63708426000, #  local_start 2019-11-03 01:00:00 (Sun)
  63719316000, #    local_end 2020-03-08 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63719337600, #    utc_start 2020-03-08 08:00:00 (Sun)
  63739897200, #      utc_end 2020-11-01 07:00:00 (Sun)
  63719319600, #  local_start 2020-03-08 03:00:00 (Sun)
  63739879200, #    local_end 2020-11-01 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63739897200, #    utc_start 2020-11-01 07:00:00 (Sun)
  63751392000, #      utc_end 2021-03-14 08:00:00 (Sun)
  63739875600, #  local_start 2020-11-01 01:00:00 (Sun)
  63751370400, #    local_end 2021-03-14 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63751392000, #    utc_start 2021-03-14 08:00:00 (Sun)
  63771951600, #      utc_end 2021-11-07 07:00:00 (Sun)
  63751374000, #  local_start 2021-03-14 03:00:00 (Sun)
  63771933600, #    local_end 2021-11-07 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63771951600, #    utc_start 2021-11-07 07:00:00 (Sun)
  63782841600, #      utc_end 2022-03-13 08:00:00 (Sun)
  63771930000, #  local_start 2021-11-07 01:00:00 (Sun)
  63782820000, #    local_end 2022-03-13 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63782841600, #    utc_start 2022-03-13 08:00:00 (Sun)
  63803401200, #      utc_end 2022-11-06 07:00:00 (Sun)
  63782823600, #  local_start 2022-03-13 03:00:00 (Sun)
  63803383200, #    local_end 2022-11-06 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63803401200, #    utc_start 2022-11-06 07:00:00 (Sun)
  63814291200, #      utc_end 2023-03-12 08:00:00 (Sun)
  63803379600, #  local_start 2022-11-06 01:00:00 (Sun)
  63814269600, #    local_end 2023-03-12 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63814291200, #    utc_start 2023-03-12 08:00:00 (Sun)
  63834850800, #      utc_end 2023-11-05 07:00:00 (Sun)
  63814273200, #  local_start 2023-03-12 03:00:00 (Sun)
  63834832800, #    local_end 2023-11-05 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63834850800, #    utc_start 2023-11-05 07:00:00 (Sun)
  63845740800, #      utc_end 2024-03-10 08:00:00 (Sun)
  63834829200, #  local_start 2023-11-05 01:00:00 (Sun)
  63845719200, #    local_end 2024-03-10 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63845740800, #    utc_start 2024-03-10 08:00:00 (Sun)
  63866300400, #      utc_end 2024-11-03 07:00:00 (Sun)
  63845722800, #  local_start 2024-03-10 03:00:00 (Sun)
  63866282400, #    local_end 2024-11-03 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63866300400, #    utc_start 2024-11-03 07:00:00 (Sun)
  63877190400, #      utc_end 2025-03-09 08:00:00 (Sun)
  63866278800, #  local_start 2024-11-03 01:00:00 (Sun)
  63877168800, #    local_end 2025-03-09 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63877190400, #    utc_start 2025-03-09 08:00:00 (Sun)
  63897750000, #      utc_end 2025-11-02 07:00:00 (Sun)
  63877172400, #  local_start 2025-03-09 03:00:00 (Sun)
  63897732000, #    local_end 2025-11-02 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63897750000, #    utc_start 2025-11-02 07:00:00 (Sun)
  63908640000, #      utc_end 2026-03-08 08:00:00 (Sun)
  63897728400, #  local_start 2025-11-02 01:00:00 (Sun)
  63908618400, #    local_end 2026-03-08 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63908640000, #    utc_start 2026-03-08 08:00:00 (Sun)
  63929199600, #      utc_end 2026-11-01 07:00:00 (Sun)
  63908622000, #  local_start 2026-03-08 03:00:00 (Sun)
  63929181600, #    local_end 2026-11-01 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63929199600, #    utc_start 2026-11-01 07:00:00 (Sun)
  63940694400, #      utc_end 2027-03-14 08:00:00 (Sun)
  63929178000, #  local_start 2026-11-01 01:00:00 (Sun)
  63940672800, #    local_end 2027-03-14 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63940694400, #    utc_start 2027-03-14 08:00:00 (Sun)
  63961254000, #      utc_end 2027-11-07 07:00:00 (Sun)
  63940676400, #  local_start 2027-03-14 03:00:00 (Sun)
  63961236000, #    local_end 2027-11-07 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63961254000, #    utc_start 2027-11-07 07:00:00 (Sun)
  63972144000, #      utc_end 2028-03-12 08:00:00 (Sun)
  63961232400, #  local_start 2027-11-07 01:00:00 (Sun)
  63972122400, #    local_end 2028-03-12 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63972144000, #    utc_start 2028-03-12 08:00:00 (Sun)
  63992703600, #      utc_end 2028-11-05 07:00:00 (Sun)
  63972126000, #  local_start 2028-03-12 03:00:00 (Sun)
  63992685600, #    local_end 2028-11-05 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63992703600, #    utc_start 2028-11-05 07:00:00 (Sun)
  64003593600, #      utc_end 2029-03-11 08:00:00 (Sun)
  63992682000, #  local_start 2028-11-05 01:00:00 (Sun)
  64003572000, #    local_end 2029-03-11 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  64003593600, #    utc_start 2029-03-11 08:00:00 (Sun)
  64024153200, #      utc_end 2029-11-04 07:00:00 (Sun)
  64003575600, #  local_start 2029-03-11 03:00:00 (Sun)
  64024135200, #    local_end 2029-11-04 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  64024153200, #    utc_start 2029-11-04 07:00:00 (Sun)
  64035043200, #      utc_end 2030-03-10 08:00:00 (Sun)
  64024131600, #  local_start 2029-11-04 01:00:00 (Sun)
  64035021600, #    local_end 2030-03-10 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  64035043200, #    utc_start 2030-03-10 08:00:00 (Sun)
  64055602800, #      utc_end 2030-11-03 07:00:00 (Sun)
  64035025200, #  local_start 2030-03-10 03:00:00 (Sun)
  64055584800, #    local_end 2030-11-03 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {68}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -21600 }
  
  my $last_observance = bless( {
    'format' => 'C%sT',
    'gmtoff' => '-6:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 731514,
      'local_rd_secs' => 7200,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 731514,
      'utc_rd_secs' => 7200,
      'utc_year' => 2004
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -21600,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 731514,
      'local_rd_secs' => 28800,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 731514,
      'utc_rd_secs' => 28800,
      'utc_year' => 2004
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Nov',
      'letter' => 'S',
      'name' => 'US',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Mar',
      'letter' => 'D',
      'name' => 'US',
      'offset_from_std' => 3600,
      'on' => 'Sun>=8',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_NORTH_DAKOTA_NEW_SALEM

    $main::fatpacked{"DateTime/TimeZone/America/Ojinaga.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_OJINAGA';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Ojinaga;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Ojinaga::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60620943600, #      utc_end 1922-01-01 07:00:00 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60620918540, #    local_end 1922-01-01 00:02:20 (Sun)
  -25060,
  0,
  'LMT',
      ],
      [
  60620943600, #    utc_start 1922-01-01 07:00:00 (Sun)
  60792616800, #      utc_end 1927-06-11 06:00:00 (Sat)
  60620918400, #  local_start 1922-01-01 00:00:00 (Sun)
  60792591600, #    local_end 1927-06-10 23:00:00 (Fri)
  -25200,
  0,
  'MST',
      ],
      [
  60792616800, #    utc_start 1927-06-11 06:00:00 (Sat)
  60900876000, #      utc_end 1930-11-15 06:00:00 (Sat)
  60792595200, #  local_start 1927-06-11 00:00:00 (Sat)
  60900854400, #    local_end 1930-11-15 00:00:00 (Sat)
  -21600,
  0,
  'CST',
      ],
      [
  60900876000, #    utc_start 1930-11-15 06:00:00 (Sat)
  60915391200, #      utc_end 1931-05-02 06:00:00 (Sat)
  60900850800, #  local_start 1930-11-14 23:00:00 (Fri)
  60915366000, #    local_end 1931-05-01 23:00:00 (Fri)
  -25200,
  0,
  'MST',
      ],
      [
  60915391200, #    utc_start 1931-05-02 06:00:00 (Sat)
  60928524000, #      utc_end 1931-10-01 06:00:00 (Thu)
  60915369600, #  local_start 1931-05-02 00:00:00 (Sat)
  60928502400, #    local_end 1931-10-01 00:00:00 (Thu)
  -21600,
  0,
  'CST',
      ],
      [
  60928524000, #    utc_start 1931-10-01 06:00:00 (Thu)
  60944338800, #      utc_end 1932-04-01 07:00:00 (Fri)
  60928498800, #  local_start 1931-09-30 23:00:00 (Wed)
  60944313600, #    local_end 1932-04-01 00:00:00 (Fri)
  -25200,
  0,
  'MST',
      ],
      [
  60944338800, #    utc_start 1932-04-01 07:00:00 (Fri)
  62956159200, #      utc_end 1996-01-01 06:00:00 (Mon)
  60944317200, #  local_start 1932-04-01 01:00:00 (Fri)
  62956137600, #    local_end 1996-01-01 00:00:00 (Mon)
  -21600,
  0,
  'CST',
      ],
      [
  62956159200, #    utc_start 1996-01-01 06:00:00 (Mon)
  62964547200, #      utc_end 1996-04-07 08:00:00 (Sun)
  62956137600, #  local_start 1996-01-01 00:00:00 (Mon)
  62964525600, #    local_end 1996-04-07 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62964547200, #    utc_start 1996-04-07 08:00:00 (Sun)
  62982082800, #      utc_end 1996-10-27 07:00:00 (Sun)
  62964529200, #  local_start 1996-04-07 03:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62982082800, #    utc_start 1996-10-27 07:00:00 (Sun)
  62995996800, #      utc_end 1997-04-06 08:00:00 (Sun)
  62982061200, #  local_start 1996-10-27 01:00:00 (Sun)
  62995975200, #    local_end 1997-04-06 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62995996800, #    utc_start 1997-04-06 08:00:00 (Sun)
  63013532400, #      utc_end 1997-10-26 07:00:00 (Sun)
  62995978800, #  local_start 1997-04-06 03:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63013532400, #    utc_start 1997-10-26 07:00:00 (Sun)
  63019317600, #      utc_end 1998-01-01 06:00:00 (Thu)
  63013510800, #  local_start 1997-10-26 01:00:00 (Sun)
  63019296000, #    local_end 1998-01-01 00:00:00 (Thu)
  -21600,
  0,
  'CST',
      ],
      [
  63019317600, #    utc_start 1998-01-01 06:00:00 (Thu)
  63027450000, #      utc_end 1998-04-05 09:00:00 (Sun)
  63019296000, #  local_start 1998-01-01 00:00:00 (Thu)
  63027428400, #    local_end 1998-04-05 03:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63027450000, #    utc_start 1998-04-05 09:00:00 (Sun)
  63044985600, #      utc_end 1998-10-25 08:00:00 (Sun)
  63027428400, #  local_start 1998-04-05 03:00:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63044985600, #    utc_start 1998-10-25 08:00:00 (Sun)
  63058899600, #      utc_end 1999-04-04 09:00:00 (Sun)
  63044960400, #  local_start 1998-10-25 01:00:00 (Sun)
  63058874400, #    local_end 1999-04-04 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63058899600, #    utc_start 1999-04-04 09:00:00 (Sun)
  63077040000, #      utc_end 1999-10-31 08:00:00 (Sun)
  63058878000, #  local_start 1999-04-04 03:00:00 (Sun)
  63077018400, #    local_end 1999-10-31 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63077040000, #    utc_start 1999-10-31 08:00:00 (Sun)
  63090349200, #      utc_end 2000-04-02 09:00:00 (Sun)
  63077014800, #  local_start 1999-10-31 01:00:00 (Sun)
  63090324000, #    local_end 2000-04-02 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63090349200, #    utc_start 2000-04-02 09:00:00 (Sun)
  63108489600, #      utc_end 2000-10-29 08:00:00 (Sun)
  63090327600, #  local_start 2000-04-02 03:00:00 (Sun)
  63108468000, #    local_end 2000-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63108489600, #    utc_start 2000-10-29 08:00:00 (Sun)
  63124822800, #      utc_end 2001-05-06 09:00:00 (Sun)
  63108464400, #  local_start 2000-10-29 01:00:00 (Sun)
  63124797600, #    local_end 2001-05-06 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63124822800, #    utc_start 2001-05-06 09:00:00 (Sun)
  63137520000, #      utc_end 2001-09-30 08:00:00 (Sun)
  63124801200, #  local_start 2001-05-06 03:00:00 (Sun)
  63137498400, #    local_end 2001-09-30 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63137520000, #    utc_start 2001-09-30 08:00:00 (Sun)
  63153853200, #      utc_end 2002-04-07 09:00:00 (Sun)
  63137494800, #  local_start 2001-09-30 01:00:00 (Sun)
  63153828000, #    local_end 2002-04-07 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63153853200, #    utc_start 2002-04-07 09:00:00 (Sun)
  63171388800, #      utc_end 2002-10-27 08:00:00 (Sun)
  63153831600, #  local_start 2002-04-07 03:00:00 (Sun)
  63171367200, #    local_end 2002-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63171388800, #    utc_start 2002-10-27 08:00:00 (Sun)
  63185302800, #      utc_end 2003-04-06 09:00:00 (Sun)
  63171363600, #  local_start 2002-10-27 01:00:00 (Sun)
  63185277600, #    local_end 2003-04-06 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63185302800, #    utc_start 2003-04-06 09:00:00 (Sun)
  63202838400, #      utc_end 2003-10-26 08:00:00 (Sun)
  63185281200, #  local_start 2003-04-06 03:00:00 (Sun)
  63202816800, #    local_end 2003-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63202838400, #    utc_start 2003-10-26 08:00:00 (Sun)
  63216752400, #      utc_end 2004-04-04 09:00:00 (Sun)
  63202813200, #  local_start 2003-10-26 01:00:00 (Sun)
  63216727200, #    local_end 2004-04-04 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63216752400, #    utc_start 2004-04-04 09:00:00 (Sun)
  63234892800, #      utc_end 2004-10-31 08:00:00 (Sun)
  63216730800, #  local_start 2004-04-04 03:00:00 (Sun)
  63234871200, #    local_end 2004-10-31 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63234892800, #    utc_start 2004-10-31 08:00:00 (Sun)
  63248202000, #      utc_end 2005-04-03 09:00:00 (Sun)
  63234867600, #  local_start 2004-10-31 01:00:00 (Sun)
  63248176800, #    local_end 2005-04-03 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63248202000, #    utc_start 2005-04-03 09:00:00 (Sun)
  63266342400, #      utc_end 2005-10-30 08:00:00 (Sun)
  63248180400, #  local_start 2005-04-03 03:00:00 (Sun)
  63266320800, #    local_end 2005-10-30 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63266342400, #    utc_start 2005-10-30 08:00:00 (Sun)
  63279651600, #      utc_end 2006-04-02 09:00:00 (Sun)
  63266317200, #  local_start 2005-10-30 01:00:00 (Sun)
  63279626400, #    local_end 2006-04-02 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63279651600, #    utc_start 2006-04-02 09:00:00 (Sun)
  63297792000, #      utc_end 2006-10-29 08:00:00 (Sun)
  63279630000, #  local_start 2006-04-02 03:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63297792000, #    utc_start 2006-10-29 08:00:00 (Sun)
  63311101200, #      utc_end 2007-04-01 09:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63311076000, #    local_end 2007-04-01 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63311101200, #    utc_start 2007-04-01 09:00:00 (Sun)
  63329241600, #      utc_end 2007-10-28 08:00:00 (Sun)
  63311079600, #  local_start 2007-04-01 03:00:00 (Sun)
  63329220000, #    local_end 2007-10-28 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63329241600, #    utc_start 2007-10-28 08:00:00 (Sun)
  63343155600, #      utc_end 2008-04-06 09:00:00 (Sun)
  63329216400, #  local_start 2007-10-28 01:00:00 (Sun)
  63343130400, #    local_end 2008-04-06 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63343155600, #    utc_start 2008-04-06 09:00:00 (Sun)
  63360691200, #      utc_end 2008-10-26 08:00:00 (Sun)
  63343134000, #  local_start 2008-04-06 03:00:00 (Sun)
  63360669600, #    local_end 2008-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63360691200, #    utc_start 2008-10-26 08:00:00 (Sun)
  63374605200, #      utc_end 2009-04-05 09:00:00 (Sun)
  63360666000, #  local_start 2008-10-26 01:00:00 (Sun)
  63374580000, #    local_end 2009-04-05 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63374605200, #    utc_start 2009-04-05 09:00:00 (Sun)
  63392140800, #      utc_end 2009-10-25 08:00:00 (Sun)
  63374583600, #  local_start 2009-04-05 03:00:00 (Sun)
  63392119200, #    local_end 2009-10-25 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63392140800, #    utc_start 2009-10-25 08:00:00 (Sun)
  63398012400, #      utc_end 2010-01-01 07:00:00 (Fri)
  63392115600, #  local_start 2009-10-25 01:00:00 (Sun)
  63397987200, #    local_end 2010-01-01 00:00:00 (Fri)
  -25200,
  0,
  'MST',
      ],
      [
  63398012400, #    utc_start 2010-01-01 07:00:00 (Fri)
  63404240400, #      utc_end 2010-03-14 09:00:00 (Sun)
  63397987200, #  local_start 2010-01-01 00:00:00 (Fri)
  63404215200, #    local_end 2010-03-14 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63404240400, #    utc_start 2010-03-14 09:00:00 (Sun)
  63424800000, #      utc_end 2010-11-07 08:00:00 (Sun)
  63404218800, #  local_start 2010-03-14 03:00:00 (Sun)
  63424778400, #    local_end 2010-11-07 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63424800000, #    utc_start 2010-11-07 08:00:00 (Sun)
  63435690000, #      utc_end 2011-03-13 09:00:00 (Sun)
  63424774800, #  local_start 2010-11-07 01:00:00 (Sun)
  63435664800, #    local_end 2011-03-13 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63435690000, #    utc_start 2011-03-13 09:00:00 (Sun)
  63456249600, #      utc_end 2011-11-06 08:00:00 (Sun)
  63435668400, #  local_start 2011-03-13 03:00:00 (Sun)
  63456228000, #    local_end 2011-11-06 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63456249600, #    utc_start 2011-11-06 08:00:00 (Sun)
  63467139600, #      utc_end 2012-03-11 09:00:00 (Sun)
  63456224400, #  local_start 2011-11-06 01:00:00 (Sun)
  63467114400, #    local_end 2012-03-11 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63467139600, #    utc_start 2012-03-11 09:00:00 (Sun)
  63487699200, #      utc_end 2012-11-04 08:00:00 (Sun)
  63467118000, #  local_start 2012-03-11 03:00:00 (Sun)
  63487677600, #    local_end 2012-11-04 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63487699200, #    utc_start 2012-11-04 08:00:00 (Sun)
  63498589200, #      utc_end 2013-03-10 09:00:00 (Sun)
  63487674000, #  local_start 2012-11-04 01:00:00 (Sun)
  63498564000, #    local_end 2013-03-10 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63498589200, #    utc_start 2013-03-10 09:00:00 (Sun)
  63519148800, #      utc_end 2013-11-03 08:00:00 (Sun)
  63498567600, #  local_start 2013-03-10 03:00:00 (Sun)
  63519127200, #    local_end 2013-11-03 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63519148800, #    utc_start 2013-11-03 08:00:00 (Sun)
  63530038800, #      utc_end 2014-03-09 09:00:00 (Sun)
  63519123600, #  local_start 2013-11-03 01:00:00 (Sun)
  63530013600, #    local_end 2014-03-09 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63530038800, #    utc_start 2014-03-09 09:00:00 (Sun)
  63550598400, #      utc_end 2014-11-02 08:00:00 (Sun)
  63530017200, #  local_start 2014-03-09 03:00:00 (Sun)
  63550576800, #    local_end 2014-11-02 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63550598400, #    utc_start 2014-11-02 08:00:00 (Sun)
  63561488400, #      utc_end 2015-03-08 09:00:00 (Sun)
  63550573200, #  local_start 2014-11-02 01:00:00 (Sun)
  63561463200, #    local_end 2015-03-08 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63561488400, #    utc_start 2015-03-08 09:00:00 (Sun)
  63582048000, #      utc_end 2015-11-01 08:00:00 (Sun)
  63561466800, #  local_start 2015-03-08 03:00:00 (Sun)
  63582026400, #    local_end 2015-11-01 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63582048000, #    utc_start 2015-11-01 08:00:00 (Sun)
  63593542800, #      utc_end 2016-03-13 09:00:00 (Sun)
  63582022800, #  local_start 2015-11-01 01:00:00 (Sun)
  63593517600, #    local_end 2016-03-13 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63593542800, #    utc_start 2016-03-13 09:00:00 (Sun)
  63614102400, #      utc_end 2016-11-06 08:00:00 (Sun)
  63593521200, #  local_start 2016-03-13 03:00:00 (Sun)
  63614080800, #    local_end 2016-11-06 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63614102400, #    utc_start 2016-11-06 08:00:00 (Sun)
  63624992400, #      utc_end 2017-03-12 09:00:00 (Sun)
  63614077200, #  local_start 2016-11-06 01:00:00 (Sun)
  63624967200, #    local_end 2017-03-12 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63624992400, #    utc_start 2017-03-12 09:00:00 (Sun)
  63645552000, #      utc_end 2017-11-05 08:00:00 (Sun)
  63624970800, #  local_start 2017-03-12 03:00:00 (Sun)
  63645530400, #    local_end 2017-11-05 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63645552000, #    utc_start 2017-11-05 08:00:00 (Sun)
  63656442000, #      utc_end 2018-03-11 09:00:00 (Sun)
  63645526800, #  local_start 2017-11-05 01:00:00 (Sun)
  63656416800, #    local_end 2018-03-11 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63656442000, #    utc_start 2018-03-11 09:00:00 (Sun)
  63677001600, #      utc_end 2018-11-04 08:00:00 (Sun)
  63656420400, #  local_start 2018-03-11 03:00:00 (Sun)
  63676980000, #    local_end 2018-11-04 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63677001600, #    utc_start 2018-11-04 08:00:00 (Sun)
  63687891600, #      utc_end 2019-03-10 09:00:00 (Sun)
  63676976400, #  local_start 2018-11-04 01:00:00 (Sun)
  63687866400, #    local_end 2019-03-10 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63687891600, #    utc_start 2019-03-10 09:00:00 (Sun)
  63708451200, #      utc_end 2019-11-03 08:00:00 (Sun)
  63687870000, #  local_start 2019-03-10 03:00:00 (Sun)
  63708429600, #    local_end 2019-11-03 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63708451200, #    utc_start 2019-11-03 08:00:00 (Sun)
  63719341200, #      utc_end 2020-03-08 09:00:00 (Sun)
  63708426000, #  local_start 2019-11-03 01:00:00 (Sun)
  63719316000, #    local_end 2020-03-08 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63719341200, #    utc_start 2020-03-08 09:00:00 (Sun)
  63739900800, #      utc_end 2020-11-01 08:00:00 (Sun)
  63719319600, #  local_start 2020-03-08 03:00:00 (Sun)
  63739879200, #    local_end 2020-11-01 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63739900800, #    utc_start 2020-11-01 08:00:00 (Sun)
  63751395600, #      utc_end 2021-03-14 09:00:00 (Sun)
  63739875600, #  local_start 2020-11-01 01:00:00 (Sun)
  63751370400, #    local_end 2021-03-14 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63751395600, #    utc_start 2021-03-14 09:00:00 (Sun)
  63771955200, #      utc_end 2021-11-07 08:00:00 (Sun)
  63751374000, #  local_start 2021-03-14 03:00:00 (Sun)
  63771933600, #    local_end 2021-11-07 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63771955200, #    utc_start 2021-11-07 08:00:00 (Sun)
  63782845200, #      utc_end 2022-03-13 09:00:00 (Sun)
  63771930000, #  local_start 2021-11-07 01:00:00 (Sun)
  63782820000, #    local_end 2022-03-13 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63782845200, #    utc_start 2022-03-13 09:00:00 (Sun)
  63803404800, #      utc_end 2022-11-06 08:00:00 (Sun)
  63782823600, #  local_start 2022-03-13 03:00:00 (Sun)
  63803383200, #    local_end 2022-11-06 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63803404800, #    utc_start 2022-11-06 08:00:00 (Sun)
  63814294800, #      utc_end 2023-03-12 09:00:00 (Sun)
  63803379600, #  local_start 2022-11-06 01:00:00 (Sun)
  63814269600, #    local_end 2023-03-12 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63814294800, #    utc_start 2023-03-12 09:00:00 (Sun)
  63834854400, #      utc_end 2023-11-05 08:00:00 (Sun)
  63814273200, #  local_start 2023-03-12 03:00:00 (Sun)
  63834832800, #    local_end 2023-11-05 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63834854400, #    utc_start 2023-11-05 08:00:00 (Sun)
  63845744400, #      utc_end 2024-03-10 09:00:00 (Sun)
  63834829200, #  local_start 2023-11-05 01:00:00 (Sun)
  63845719200, #    local_end 2024-03-10 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63845744400, #    utc_start 2024-03-10 09:00:00 (Sun)
  63866304000, #      utc_end 2024-11-03 08:00:00 (Sun)
  63845722800, #  local_start 2024-03-10 03:00:00 (Sun)
  63866282400, #    local_end 2024-11-03 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63866304000, #    utc_start 2024-11-03 08:00:00 (Sun)
  63877194000, #      utc_end 2025-03-09 09:00:00 (Sun)
  63866278800, #  local_start 2024-11-03 01:00:00 (Sun)
  63877168800, #    local_end 2025-03-09 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63877194000, #    utc_start 2025-03-09 09:00:00 (Sun)
  63897753600, #      utc_end 2025-11-02 08:00:00 (Sun)
  63877172400, #  local_start 2025-03-09 03:00:00 (Sun)
  63897732000, #    local_end 2025-11-02 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63897753600, #    utc_start 2025-11-02 08:00:00 (Sun)
  63908643600, #      utc_end 2026-03-08 09:00:00 (Sun)
  63897728400, #  local_start 2025-11-02 01:00:00 (Sun)
  63908618400, #    local_end 2026-03-08 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63908643600, #    utc_start 2026-03-08 09:00:00 (Sun)
  63929203200, #      utc_end 2026-11-01 08:00:00 (Sun)
  63908622000, #  local_start 2026-03-08 03:00:00 (Sun)
  63929181600, #    local_end 2026-11-01 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63929203200, #    utc_start 2026-11-01 08:00:00 (Sun)
  63940698000, #      utc_end 2027-03-14 09:00:00 (Sun)
  63929178000, #  local_start 2026-11-01 01:00:00 (Sun)
  63940672800, #    local_end 2027-03-14 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63940698000, #    utc_start 2027-03-14 09:00:00 (Sun)
  63961257600, #      utc_end 2027-11-07 08:00:00 (Sun)
  63940676400, #  local_start 2027-03-14 03:00:00 (Sun)
  63961236000, #    local_end 2027-11-07 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63961257600, #    utc_start 2027-11-07 08:00:00 (Sun)
  63972147600, #      utc_end 2028-03-12 09:00:00 (Sun)
  63961232400, #  local_start 2027-11-07 01:00:00 (Sun)
  63972122400, #    local_end 2028-03-12 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63972147600, #    utc_start 2028-03-12 09:00:00 (Sun)
  63992707200, #      utc_end 2028-11-05 08:00:00 (Sun)
  63972126000, #  local_start 2028-03-12 03:00:00 (Sun)
  63992685600, #    local_end 2028-11-05 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63992707200, #    utc_start 2028-11-05 08:00:00 (Sun)
  64003597200, #      utc_end 2029-03-11 09:00:00 (Sun)
  63992682000, #  local_start 2028-11-05 01:00:00 (Sun)
  64003572000, #    local_end 2029-03-11 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  64003597200, #    utc_start 2029-03-11 09:00:00 (Sun)
  64024156800, #      utc_end 2029-11-04 08:00:00 (Sun)
  64003575600, #  local_start 2029-03-11 03:00:00 (Sun)
  64024135200, #    local_end 2029-11-04 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  64024156800, #    utc_start 2029-11-04 08:00:00 (Sun)
  64035046800, #      utc_end 2030-03-10 09:00:00 (Sun)
  64024131600, #  local_start 2029-11-04 01:00:00 (Sun)
  64035021600, #    local_end 2030-03-10 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  64035046800, #    utc_start 2030-03-10 09:00:00 (Sun)
  64055606400, #      utc_end 2030-11-03 08:00:00 (Sun)
  64035025200, #  local_start 2030-03-10 03:00:00 (Sun)
  64055584800, #    local_end 2030-11-03 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {35}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -25200 }
  
  my $last_observance = bless( {
    'format' => 'M%sT',
    'gmtoff' => '-7:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 733773,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 733773,
      'utc_rd_secs' => 0,
      'utc_year' => 2011
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -25200,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 733773,
      'local_rd_secs' => 25200,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 733773,
      'utc_rd_secs' => 25200,
      'utc_year' => 2011
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Mar',
      'letter' => 'D',
      'name' => 'US',
      'offset_from_std' => 3600,
      'on' => 'Sun>=8',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Nov',
      'letter' => 'S',
      'name' => 'US',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_OJINAGA

    $main::fatpacked{"DateTime/TimeZone/America/Panama.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_PANAMA';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Panama;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Panama::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59611180688, #      utc_end 1890-01-01 05:18:08 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59611161600, #    local_end 1890-01-01 00:00:00 (Wed)
  -19088,
  0,
  'LMT',
      ],
      [
  59611180688, #    utc_start 1890-01-01 05:18:08 (Wed)
  60188764776, #      utc_end 1908-04-22 05:19:36 (Wed)
  59611161512, #  local_start 1889-12-31 23:58:32 (Tue)
  60188745600, #    local_end 1908-04-22 00:00:00 (Wed)
  -19176,
  0,
  'CMT',
      ],
      [
  60188764776, #    utc_start 1908-04-22 05:19:36 (Wed)
  DateTime::TimeZone::INFINITY, #      utc_end
  60188746776, #  local_start 1908-04-22 00:19:36 (Wed)
  DateTime::TimeZone::INFINITY, #    local_end
  -18000,
  0,
  'EST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_PANAMA

    $main::fatpacked{"DateTime/TimeZone/America/Pangnirtung.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_PANGNIRTUNG';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Pangnirtung;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Pangnirtung::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60589382400, #      utc_end 1921-01-01 00:00:00 (Sat)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60589382400, #    local_end 1921-01-01 00:00:00 (Sat)
  0,
  0,
  '-00',
      ],
      [
  60589382400, #    utc_start 1921-01-01 00:00:00 (Sat)
  61255461600, #      utc_end 1942-02-09 06:00:00 (Mon)
  60589368000, #  local_start 1920-12-31 20:00:00 (Fri)
  61255447200, #    local_end 1942-02-09 02:00:00 (Mon)
  -14400,
  0,
  'AST',
      ],
      [
  61255461600, #    utc_start 1942-02-09 06:00:00 (Mon)
  61366287600, #      utc_end 1945-08-14 23:00:00 (Tue)
  61255450800, #  local_start 1942-02-09 03:00:00 (Mon)
  61366276800, #    local_end 1945-08-14 20:00:00 (Tue)
  -10800,
  1,
  'AWT',
      ],
      [
  61366287600, #    utc_start 1945-08-14 23:00:00 (Tue)
  61370283600, #      utc_end 1945-09-30 05:00:00 (Sun)
  61366276800, #  local_start 1945-08-14 20:00:00 (Tue)
  61370272800, #    local_end 1945-09-30 02:00:00 (Sun)
  -10800,
  1,
  'APT',
      ],
      [
  61370283600, #    utc_start 1945-09-30 05:00:00 (Sun)
  61987780800, #      utc_end 1965-04-25 04:00:00 (Sun)
  61370269200, #  local_start 1945-09-30 01:00:00 (Sun)
  61987766400, #    local_end 1965-04-25 00:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  61987780800, #    utc_start 1965-04-25 04:00:00 (Sun)
  62004110400, #      utc_end 1965-10-31 04:00:00 (Sun)
  61987773600, #  local_start 1965-04-25 02:00:00 (Sun)
  62004103200, #    local_end 1965-10-31 02:00:00 (Sun)
  -7200,
  1,
  'ADDT',
      ],
      [
  62004110400, #    utc_start 1965-10-31 04:00:00 (Sun)
  62461346400, #      utc_end 1980-04-27 06:00:00 (Sun)
  62004096000, #  local_start 1965-10-31 00:00:00 (Sun)
  62461332000, #    local_end 1980-04-27 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62461346400, #    utc_start 1980-04-27 06:00:00 (Sun)
  62477067600, #      utc_end 1980-10-26 05:00:00 (Sun)
  62461335600, #  local_start 1980-04-27 03:00:00 (Sun)
  62477056800, #    local_end 1980-10-26 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62477067600, #    utc_start 1980-10-26 05:00:00 (Sun)
  62492796000, #      utc_end 1981-04-26 06:00:00 (Sun)
  62477053200, #  local_start 1980-10-26 01:00:00 (Sun)
  62492781600, #    local_end 1981-04-26 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62492796000, #    utc_start 1981-04-26 06:00:00 (Sun)
  62508517200, #      utc_end 1981-10-25 05:00:00 (Sun)
  62492785200, #  local_start 1981-04-26 03:00:00 (Sun)
  62508506400, #    local_end 1981-10-25 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62508517200, #    utc_start 1981-10-25 05:00:00 (Sun)
  62524245600, #      utc_end 1982-04-25 06:00:00 (Sun)
  62508502800, #  local_start 1981-10-25 01:00:00 (Sun)
  62524231200, #    local_end 1982-04-25 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62524245600, #    utc_start 1982-04-25 06:00:00 (Sun)
  62540571600, #      utc_end 1982-10-31 05:00:00 (Sun)
  62524234800, #  local_start 1982-04-25 03:00:00 (Sun)
  62540560800, #    local_end 1982-10-31 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62540571600, #    utc_start 1982-10-31 05:00:00 (Sun)
  62555695200, #      utc_end 1983-04-24 06:00:00 (Sun)
  62540557200, #  local_start 1982-10-31 01:00:00 (Sun)
  62555680800, #    local_end 1983-04-24 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62555695200, #    utc_start 1983-04-24 06:00:00 (Sun)
  62572021200, #      utc_end 1983-10-30 05:00:00 (Sun)
  62555684400, #  local_start 1983-04-24 03:00:00 (Sun)
  62572010400, #    local_end 1983-10-30 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62572021200, #    utc_start 1983-10-30 05:00:00 (Sun)
  62587749600, #      utc_end 1984-04-29 06:00:00 (Sun)
  62572006800, #  local_start 1983-10-30 01:00:00 (Sun)
  62587735200, #    local_end 1984-04-29 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62587749600, #    utc_start 1984-04-29 06:00:00 (Sun)
  62603470800, #      utc_end 1984-10-28 05:00:00 (Sun)
  62587738800, #  local_start 1984-04-29 03:00:00 (Sun)
  62603460000, #    local_end 1984-10-28 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62603470800, #    utc_start 1984-10-28 05:00:00 (Sun)
  62619199200, #      utc_end 1985-04-28 06:00:00 (Sun)
  62603456400, #  local_start 1984-10-28 01:00:00 (Sun)
  62619184800, #    local_end 1985-04-28 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62619199200, #    utc_start 1985-04-28 06:00:00 (Sun)
  62634920400, #      utc_end 1985-10-27 05:00:00 (Sun)
  62619188400, #  local_start 1985-04-28 03:00:00 (Sun)
  62634909600, #    local_end 1985-10-27 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62634920400, #    utc_start 1985-10-27 05:00:00 (Sun)
  62650648800, #      utc_end 1986-04-27 06:00:00 (Sun)
  62634906000, #  local_start 1985-10-27 01:00:00 (Sun)
  62650634400, #    local_end 1986-04-27 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62650648800, #    utc_start 1986-04-27 06:00:00 (Sun)
  62666370000, #      utc_end 1986-10-26 05:00:00 (Sun)
  62650638000, #  local_start 1986-04-27 03:00:00 (Sun)
  62666359200, #    local_end 1986-10-26 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62666370000, #    utc_start 1986-10-26 05:00:00 (Sun)
  62680284000, #      utc_end 1987-04-05 06:00:00 (Sun)
  62666355600, #  local_start 1986-10-26 01:00:00 (Sun)
  62680269600, #    local_end 1987-04-05 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62680284000, #    utc_start 1987-04-05 06:00:00 (Sun)
  62697819600, #      utc_end 1987-10-25 05:00:00 (Sun)
  62680273200, #  local_start 1987-04-05 03:00:00 (Sun)
  62697808800, #    local_end 1987-10-25 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62697819600, #    utc_start 1987-10-25 05:00:00 (Sun)
  62711733600, #      utc_end 1988-04-03 06:00:00 (Sun)
  62697805200, #  local_start 1987-10-25 01:00:00 (Sun)
  62711719200, #    local_end 1988-04-03 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62711733600, #    utc_start 1988-04-03 06:00:00 (Sun)
  62729874000, #      utc_end 1988-10-30 05:00:00 (Sun)
  62711722800, #  local_start 1988-04-03 03:00:00 (Sun)
  62729863200, #    local_end 1988-10-30 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62729874000, #    utc_start 1988-10-30 05:00:00 (Sun)
  62743183200, #      utc_end 1989-04-02 06:00:00 (Sun)
  62729859600, #  local_start 1988-10-30 01:00:00 (Sun)
  62743168800, #    local_end 1989-04-02 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62743183200, #    utc_start 1989-04-02 06:00:00 (Sun)
  62761323600, #      utc_end 1989-10-29 05:00:00 (Sun)
  62743172400, #  local_start 1989-04-02 03:00:00 (Sun)
  62761312800, #    local_end 1989-10-29 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62761323600, #    utc_start 1989-10-29 05:00:00 (Sun)
  62774632800, #      utc_end 1990-04-01 06:00:00 (Sun)
  62761309200, #  local_start 1989-10-29 01:00:00 (Sun)
  62774618400, #    local_end 1990-04-01 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62774632800, #    utc_start 1990-04-01 06:00:00 (Sun)
  62792773200, #      utc_end 1990-10-28 05:00:00 (Sun)
  62774622000, #  local_start 1990-04-01 03:00:00 (Sun)
  62792762400, #    local_end 1990-10-28 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62792773200, #    utc_start 1990-10-28 05:00:00 (Sun)
  62806687200, #      utc_end 1991-04-07 06:00:00 (Sun)
  62792758800, #  local_start 1990-10-28 01:00:00 (Sun)
  62806672800, #    local_end 1991-04-07 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62806687200, #    utc_start 1991-04-07 06:00:00 (Sun)
  62824222800, #      utc_end 1991-10-27 05:00:00 (Sun)
  62806676400, #  local_start 1991-04-07 03:00:00 (Sun)
  62824212000, #    local_end 1991-10-27 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62824222800, #    utc_start 1991-10-27 05:00:00 (Sun)
  62838136800, #      utc_end 1992-04-05 06:00:00 (Sun)
  62824208400, #  local_start 1991-10-27 01:00:00 (Sun)
  62838122400, #    local_end 1992-04-05 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62838136800, #    utc_start 1992-04-05 06:00:00 (Sun)
  62855672400, #      utc_end 1992-10-25 05:00:00 (Sun)
  62838126000, #  local_start 1992-04-05 03:00:00 (Sun)
  62855661600, #    local_end 1992-10-25 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62855672400, #    utc_start 1992-10-25 05:00:00 (Sun)
  62869586400, #      utc_end 1993-04-04 06:00:00 (Sun)
  62855658000, #  local_start 1992-10-25 01:00:00 (Sun)
  62869572000, #    local_end 1993-04-04 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62869586400, #    utc_start 1993-04-04 06:00:00 (Sun)
  62887726800, #      utc_end 1993-10-31 05:00:00 (Sun)
  62869575600, #  local_start 1993-04-04 03:00:00 (Sun)
  62887716000, #    local_end 1993-10-31 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62887726800, #    utc_start 1993-10-31 05:00:00 (Sun)
  62901036000, #      utc_end 1994-04-03 06:00:00 (Sun)
  62887712400, #  local_start 1993-10-31 01:00:00 (Sun)
  62901021600, #    local_end 1994-04-03 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62901036000, #    utc_start 1994-04-03 06:00:00 (Sun)
  62919176400, #      utc_end 1994-10-30 05:00:00 (Sun)
  62901025200, #  local_start 1994-04-03 03:00:00 (Sun)
  62919165600, #    local_end 1994-10-30 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62919176400, #    utc_start 1994-10-30 05:00:00 (Sun)
  62932485600, #      utc_end 1995-04-02 06:00:00 (Sun)
  62919162000, #  local_start 1994-10-30 01:00:00 (Sun)
  62932471200, #    local_end 1995-04-02 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62932485600, #    utc_start 1995-04-02 06:00:00 (Sun)
  62950629600, #      utc_end 1995-10-29 06:00:00 (Sun)
  62932471200, #  local_start 1995-04-02 02:00:00 (Sun)
  62950615200, #    local_end 1995-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62950629600, #    utc_start 1995-10-29 06:00:00 (Sun)
  62964543600, #      utc_end 1996-04-07 07:00:00 (Sun)
  62950611600, #  local_start 1995-10-29 01:00:00 (Sun)
  62964525600, #    local_end 1996-04-07 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62964543600, #    utc_start 1996-04-07 07:00:00 (Sun)
  62982079200, #      utc_end 1996-10-27 06:00:00 (Sun)
  62964529200, #  local_start 1996-04-07 03:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62982079200, #    utc_start 1996-10-27 06:00:00 (Sun)
  62995993200, #      utc_end 1997-04-06 07:00:00 (Sun)
  62982061200, #  local_start 1996-10-27 01:00:00 (Sun)
  62995975200, #    local_end 1997-04-06 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62995993200, #    utc_start 1997-04-06 07:00:00 (Sun)
  63013528800, #      utc_end 1997-10-26 06:00:00 (Sun)
  62995978800, #  local_start 1997-04-06 03:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63013528800, #    utc_start 1997-10-26 06:00:00 (Sun)
  63027442800, #      utc_end 1998-04-05 07:00:00 (Sun)
  63013510800, #  local_start 1997-10-26 01:00:00 (Sun)
  63027424800, #    local_end 1998-04-05 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63027442800, #    utc_start 1998-04-05 07:00:00 (Sun)
  63044978400, #      utc_end 1998-10-25 06:00:00 (Sun)
  63027428400, #  local_start 1998-04-05 03:00:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63044978400, #    utc_start 1998-10-25 06:00:00 (Sun)
  63058892400, #      utc_end 1999-04-04 07:00:00 (Sun)
  63044960400, #  local_start 1998-10-25 01:00:00 (Sun)
  63058874400, #    local_end 1999-04-04 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63058892400, #    utc_start 1999-04-04 07:00:00 (Sun)
  63077032800, #      utc_end 1999-10-31 06:00:00 (Sun)
  63058878000, #  local_start 1999-04-04 03:00:00 (Sun)
  63077018400, #    local_end 1999-10-31 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63077032800, #    utc_start 1999-10-31 06:00:00 (Sun)
  63090345600, #      utc_end 2000-04-02 08:00:00 (Sun)
  63077011200, #  local_start 1999-10-31 00:00:00 (Sun)
  63090324000, #    local_end 2000-04-02 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63090345600, #    utc_start 2000-04-02 08:00:00 (Sun)
  63108486000, #      utc_end 2000-10-29 07:00:00 (Sun)
  63090327600, #  local_start 2000-04-02 03:00:00 (Sun)
  63108468000, #    local_end 2000-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63108486000, #    utc_start 2000-10-29 07:00:00 (Sun)
  63121791600, #      utc_end 2001-04-01 07:00:00 (Sun)
  63108468000, #  local_start 2000-10-29 02:00:00 (Sun)
  63121773600, #    local_end 2001-04-01 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63121791600, #    utc_start 2001-04-01 07:00:00 (Sun)
  63139932000, #      utc_end 2001-10-28 06:00:00 (Sun)
  63121777200, #  local_start 2001-04-01 03:00:00 (Sun)
  63139917600, #    local_end 2001-10-28 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63139932000, #    utc_start 2001-10-28 06:00:00 (Sun)
  63153846000, #      utc_end 2002-04-07 07:00:00 (Sun)
  63139914000, #  local_start 2001-10-28 01:00:00 (Sun)
  63153828000, #    local_end 2002-04-07 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63153846000, #    utc_start 2002-04-07 07:00:00 (Sun)
  63171381600, #      utc_end 2002-10-27 06:00:00 (Sun)
  63153831600, #  local_start 2002-04-07 03:00:00 (Sun)
  63171367200, #    local_end 2002-10-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63171381600, #    utc_start 2002-10-27 06:00:00 (Sun)
  63185295600, #      utc_end 2003-04-06 07:00:00 (Sun)
  63171363600, #  local_start 2002-10-27 01:00:00 (Sun)
  63185277600, #    local_end 2003-04-06 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63185295600, #    utc_start 2003-04-06 07:00:00 (Sun)
  63202831200, #      utc_end 2003-10-26 06:00:00 (Sun)
  63185281200, #  local_start 2003-04-06 03:00:00 (Sun)
  63202816800, #    local_end 2003-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63202831200, #    utc_start 2003-10-26 06:00:00 (Sun)
  63216745200, #      utc_end 2004-04-04 07:00:00 (Sun)
  63202813200, #  local_start 2003-10-26 01:00:00 (Sun)
  63216727200, #    local_end 2004-04-04 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63216745200, #    utc_start 2004-04-04 07:00:00 (Sun)
  63234885600, #      utc_end 2004-10-31 06:00:00 (Sun)
  63216730800, #  local_start 2004-04-04 03:00:00 (Sun)
  63234871200, #    local_end 2004-10-31 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63234885600, #    utc_start 2004-10-31 06:00:00 (Sun)
  63248194800, #      utc_end 2005-04-03 07:00:00 (Sun)
  63234867600, #  local_start 2004-10-31 01:00:00 (Sun)
  63248176800, #    local_end 2005-04-03 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63248194800, #    utc_start 2005-04-03 07:00:00 (Sun)
  63266335200, #      utc_end 2005-10-30 06:00:00 (Sun)
  63248180400, #  local_start 2005-04-03 03:00:00 (Sun)
  63266320800, #    local_end 2005-10-30 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63266335200, #    utc_start 2005-10-30 06:00:00 (Sun)
  63279644400, #      utc_end 2006-04-02 07:00:00 (Sun)
  63266317200, #  local_start 2005-10-30 01:00:00 (Sun)
  63279626400, #    local_end 2006-04-02 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63279644400, #    utc_start 2006-04-02 07:00:00 (Sun)
  63297784800, #      utc_end 2006-10-29 06:00:00 (Sun)
  63279630000, #  local_start 2006-04-02 03:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63297784800, #    utc_start 2006-10-29 06:00:00 (Sun)
  63309279600, #      utc_end 2007-03-11 07:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63309261600, #    local_end 2007-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63309279600, #    utc_start 2007-03-11 07:00:00 (Sun)
  63329839200, #      utc_end 2007-11-04 06:00:00 (Sun)
  63309265200, #  local_start 2007-03-11 03:00:00 (Sun)
  63329824800, #    local_end 2007-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63329839200, #    utc_start 2007-11-04 06:00:00 (Sun)
  63340729200, #      utc_end 2008-03-09 07:00:00 (Sun)
  63329821200, #  local_start 2007-11-04 01:00:00 (Sun)
  63340711200, #    local_end 2008-03-09 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63340729200, #    utc_start 2008-03-09 07:00:00 (Sun)
  63361288800, #      utc_end 2008-11-02 06:00:00 (Sun)
  63340714800, #  local_start 2008-03-09 03:00:00 (Sun)
  63361274400, #    local_end 2008-11-02 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63361288800, #    utc_start 2008-11-02 06:00:00 (Sun)
  63372178800, #      utc_end 2009-03-08 07:00:00 (Sun)
  63361270800, #  local_start 2008-11-02 01:00:00 (Sun)
  63372160800, #    local_end 2009-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63372178800, #    utc_start 2009-03-08 07:00:00 (Sun)
  63392738400, #      utc_end 2009-11-01 06:00:00 (Sun)
  63372164400, #  local_start 2009-03-08 03:00:00 (Sun)
  63392724000, #    local_end 2009-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63392738400, #    utc_start 2009-11-01 06:00:00 (Sun)
  63404233200, #      utc_end 2010-03-14 07:00:00 (Sun)
  63392720400, #  local_start 2009-11-01 01:00:00 (Sun)
  63404215200, #    local_end 2010-03-14 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63404233200, #    utc_start 2010-03-14 07:00:00 (Sun)
  63424792800, #      utc_end 2010-11-07 06:00:00 (Sun)
  63404218800, #  local_start 2010-03-14 03:00:00 (Sun)
  63424778400, #    local_end 2010-11-07 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63424792800, #    utc_start 2010-11-07 06:00:00 (Sun)
  63435682800, #      utc_end 2011-03-13 07:00:00 (Sun)
  63424774800, #  local_start 2010-11-07 01:00:00 (Sun)
  63435664800, #    local_end 2011-03-13 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63435682800, #    utc_start 2011-03-13 07:00:00 (Sun)
  63456242400, #      utc_end 2011-11-06 06:00:00 (Sun)
  63435668400, #  local_start 2011-03-13 03:00:00 (Sun)
  63456228000, #    local_end 2011-11-06 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63456242400, #    utc_start 2011-11-06 06:00:00 (Sun)
  63467132400, #      utc_end 2012-03-11 07:00:00 (Sun)
  63456224400, #  local_start 2011-11-06 01:00:00 (Sun)
  63467114400, #    local_end 2012-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63467132400, #    utc_start 2012-03-11 07:00:00 (Sun)
  63487692000, #      utc_end 2012-11-04 06:00:00 (Sun)
  63467118000, #  local_start 2012-03-11 03:00:00 (Sun)
  63487677600, #    local_end 2012-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63487692000, #    utc_start 2012-11-04 06:00:00 (Sun)
  63498582000, #      utc_end 2013-03-10 07:00:00 (Sun)
  63487674000, #  local_start 2012-11-04 01:00:00 (Sun)
  63498564000, #    local_end 2013-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63498582000, #    utc_start 2013-03-10 07:00:00 (Sun)
  63519141600, #      utc_end 2013-11-03 06:00:00 (Sun)
  63498567600, #  local_start 2013-03-10 03:00:00 (Sun)
  63519127200, #    local_end 2013-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63519141600, #    utc_start 2013-11-03 06:00:00 (Sun)
  63530031600, #      utc_end 2014-03-09 07:00:00 (Sun)
  63519123600, #  local_start 2013-11-03 01:00:00 (Sun)
  63530013600, #    local_end 2014-03-09 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63530031600, #    utc_start 2014-03-09 07:00:00 (Sun)
  63550591200, #      utc_end 2014-11-02 06:00:00 (Sun)
  63530017200, #  local_start 2014-03-09 03:00:00 (Sun)
  63550576800, #    local_end 2014-11-02 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63550591200, #    utc_start 2014-11-02 06:00:00 (Sun)
  63561481200, #      utc_end 2015-03-08 07:00:00 (Sun)
  63550573200, #  local_start 2014-11-02 01:00:00 (Sun)
  63561463200, #    local_end 2015-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63561481200, #    utc_start 2015-03-08 07:00:00 (Sun)
  63582040800, #      utc_end 2015-11-01 06:00:00 (Sun)
  63561466800, #  local_start 2015-03-08 03:00:00 (Sun)
  63582026400, #    local_end 2015-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63582040800, #    utc_start 2015-11-01 06:00:00 (Sun)
  63593535600, #      utc_end 2016-03-13 07:00:00 (Sun)
  63582022800, #  local_start 2015-11-01 01:00:00 (Sun)
  63593517600, #    local_end 2016-03-13 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63593535600, #    utc_start 2016-03-13 07:00:00 (Sun)
  63614095200, #      utc_end 2016-11-06 06:00:00 (Sun)
  63593521200, #  local_start 2016-03-13 03:00:00 (Sun)
  63614080800, #    local_end 2016-11-06 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63614095200, #    utc_start 2016-11-06 06:00:00 (Sun)
  63624985200, #      utc_end 2017-03-12 07:00:00 (Sun)
  63614077200, #  local_start 2016-11-06 01:00:00 (Sun)
  63624967200, #    local_end 2017-03-12 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63624985200, #    utc_start 2017-03-12 07:00:00 (Sun)
  63645544800, #      utc_end 2017-11-05 06:00:00 (Sun)
  63624970800, #  local_start 2017-03-12 03:00:00 (Sun)
  63645530400, #    local_end 2017-11-05 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63645544800, #    utc_start 2017-11-05 06:00:00 (Sun)
  63656434800, #      utc_end 2018-03-11 07:00:00 (Sun)
  63645526800, #  local_start 2017-11-05 01:00:00 (Sun)
  63656416800, #    local_end 2018-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63656434800, #    utc_start 2018-03-11 07:00:00 (Sun)
  63676994400, #      utc_end 2018-11-04 06:00:00 (Sun)
  63656420400, #  local_start 2018-03-11 03:00:00 (Sun)
  63676980000, #    local_end 2018-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63676994400, #    utc_start 2018-11-04 06:00:00 (Sun)
  63687884400, #      utc_end 2019-03-10 07:00:00 (Sun)
  63676976400, #  local_start 2018-11-04 01:00:00 (Sun)
  63687866400, #    local_end 2019-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63687884400, #    utc_start 2019-03-10 07:00:00 (Sun)
  63708444000, #      utc_end 2019-11-03 06:00:00 (Sun)
  63687870000, #  local_start 2019-03-10 03:00:00 (Sun)
  63708429600, #    local_end 2019-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63708444000, #    utc_start 2019-11-03 06:00:00 (Sun)
  63719334000, #      utc_end 2020-03-08 07:00:00 (Sun)
  63708426000, #  local_start 2019-11-03 01:00:00 (Sun)
  63719316000, #    local_end 2020-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63719334000, #    utc_start 2020-03-08 07:00:00 (Sun)
  63739893600, #      utc_end 2020-11-01 06:00:00 (Sun)
  63719319600, #  local_start 2020-03-08 03:00:00 (Sun)
  63739879200, #    local_end 2020-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63739893600, #    utc_start 2020-11-01 06:00:00 (Sun)
  63751388400, #      utc_end 2021-03-14 07:00:00 (Sun)
  63739875600, #  local_start 2020-11-01 01:00:00 (Sun)
  63751370400, #    local_end 2021-03-14 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63751388400, #    utc_start 2021-03-14 07:00:00 (Sun)
  63771948000, #      utc_end 2021-11-07 06:00:00 (Sun)
  63751374000, #  local_start 2021-03-14 03:00:00 (Sun)
  63771933600, #    local_end 2021-11-07 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63771948000, #    utc_start 2021-11-07 06:00:00 (Sun)
  63782838000, #      utc_end 2022-03-13 07:00:00 (Sun)
  63771930000, #  local_start 2021-11-07 01:00:00 (Sun)
  63782820000, #    local_end 2022-03-13 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63782838000, #    utc_start 2022-03-13 07:00:00 (Sun)
  63803397600, #      utc_end 2022-11-06 06:00:00 (Sun)
  63782823600, #  local_start 2022-03-13 03:00:00 (Sun)
  63803383200, #    local_end 2022-11-06 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63803397600, #    utc_start 2022-11-06 06:00:00 (Sun)
  63814287600, #      utc_end 2023-03-12 07:00:00 (Sun)
  63803379600, #  local_start 2022-11-06 01:00:00 (Sun)
  63814269600, #    local_end 2023-03-12 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63814287600, #    utc_start 2023-03-12 07:00:00 (Sun)
  63834847200, #      utc_end 2023-11-05 06:00:00 (Sun)
  63814273200, #  local_start 2023-03-12 03:00:00 (Sun)
  63834832800, #    local_end 2023-11-05 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63834847200, #    utc_start 2023-11-05 06:00:00 (Sun)
  63845737200, #      utc_end 2024-03-10 07:00:00 (Sun)
  63834829200, #  local_start 2023-11-05 01:00:00 (Sun)
  63845719200, #    local_end 2024-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63845737200, #    utc_start 2024-03-10 07:00:00 (Sun)
  63866296800, #      utc_end 2024-11-03 06:00:00 (Sun)
  63845722800, #  local_start 2024-03-10 03:00:00 (Sun)
  63866282400, #    local_end 2024-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63866296800, #    utc_start 2024-11-03 06:00:00 (Sun)
  63877186800, #      utc_end 2025-03-09 07:00:00 (Sun)
  63866278800, #  local_start 2024-11-03 01:00:00 (Sun)
  63877168800, #    local_end 2025-03-09 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63877186800, #    utc_start 2025-03-09 07:00:00 (Sun)
  63897746400, #      utc_end 2025-11-02 06:00:00 (Sun)
  63877172400, #  local_start 2025-03-09 03:00:00 (Sun)
  63897732000, #    local_end 2025-11-02 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63897746400, #    utc_start 2025-11-02 06:00:00 (Sun)
  63908636400, #      utc_end 2026-03-08 07:00:00 (Sun)
  63897728400, #  local_start 2025-11-02 01:00:00 (Sun)
  63908618400, #    local_end 2026-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63908636400, #    utc_start 2026-03-08 07:00:00 (Sun)
  63929196000, #      utc_end 2026-11-01 06:00:00 (Sun)
  63908622000, #  local_start 2026-03-08 03:00:00 (Sun)
  63929181600, #    local_end 2026-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63929196000, #    utc_start 2026-11-01 06:00:00 (Sun)
  63940690800, #      utc_end 2027-03-14 07:00:00 (Sun)
  63929178000, #  local_start 2026-11-01 01:00:00 (Sun)
  63940672800, #    local_end 2027-03-14 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63940690800, #    utc_start 2027-03-14 07:00:00 (Sun)
  63961250400, #      utc_end 2027-11-07 06:00:00 (Sun)
  63940676400, #  local_start 2027-03-14 03:00:00 (Sun)
  63961236000, #    local_end 2027-11-07 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63961250400, #    utc_start 2027-11-07 06:00:00 (Sun)
  63972140400, #      utc_end 2028-03-12 07:00:00 (Sun)
  63961232400, #  local_start 2027-11-07 01:00:00 (Sun)
  63972122400, #    local_end 2028-03-12 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63972140400, #    utc_start 2028-03-12 07:00:00 (Sun)
  63992700000, #      utc_end 2028-11-05 06:00:00 (Sun)
  63972126000, #  local_start 2028-03-12 03:00:00 (Sun)
  63992685600, #    local_end 2028-11-05 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63992700000, #    utc_start 2028-11-05 06:00:00 (Sun)
  64003590000, #      utc_end 2029-03-11 07:00:00 (Sun)
  63992682000, #  local_start 2028-11-05 01:00:00 (Sun)
  64003572000, #    local_end 2029-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  64003590000, #    utc_start 2029-03-11 07:00:00 (Sun)
  64024149600, #      utc_end 2029-11-04 06:00:00 (Sun)
  64003575600, #  local_start 2029-03-11 03:00:00 (Sun)
  64024135200, #    local_end 2029-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  64024149600, #    utc_start 2029-11-04 06:00:00 (Sun)
  64035039600, #      utc_end 2030-03-10 07:00:00 (Sun)
  64024131600, #  local_start 2029-11-04 01:00:00 (Sun)
  64035021600, #    local_end 2030-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  64035039600, #    utc_start 2030-03-10 07:00:00 (Sun)
  64055599200, #      utc_end 2030-11-03 06:00:00 (Sun)
  64035025200, #  local_start 2030-03-10 03:00:00 (Sun)
  64055584800, #    local_end 2030-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {54}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -18000 }
  
  my $last_observance = bless( {
    'format' => 'E%sT',
    'gmtoff' => '-5:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 730422,
      'local_rd_secs' => 7200,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 730422,
      'utc_rd_secs' => 7200,
      'utc_year' => 2001
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -18000,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 730422,
      'local_rd_secs' => 25200,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 730422,
      'utc_rd_secs' => 25200,
      'utc_year' => 2001
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Nov',
      'letter' => 'S',
      'name' => 'Canada',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Mar',
      'letter' => 'D',
      'name' => 'Canada',
      'offset_from_std' => 3600,
      'on' => 'Sun>=8',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_PANGNIRTUNG

    $main::fatpacked{"DateTime/TimeZone/America/Paramaribo.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_PARAMARIBO';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/southamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Paramaribo;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Paramaribo::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60273776440, #      utc_end 1911-01-01 03:40:40 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60273763200, #    local_end 1911-01-01 00:00:00 (Sun)
  -13240,
  0,
  'LMT',
      ],
      [
  60273776440, #    utc_start 1911-01-01 03:40:40 (Sun)
  61031158852, #      utc_end 1935-01-01 03:40:52 (Tue)
  60273763188, #  local_start 1910-12-31 23:59:48 (Sat)
  61031145600, #    local_end 1935-01-01 00:00:00 (Tue)
  -13252,
  0,
  'PMT',
      ],
      [
  61031158852, #    utc_start 1935-01-01 03:40:52 (Tue)
  61370365236, #      utc_end 1945-10-01 03:40:36 (Mon)
  61031145616, #  local_start 1935-01-01 00:00:16 (Tue)
  61370352000, #    local_end 1945-10-01 00:00:00 (Mon)
  -13236,
  0,
  'PMT',
      ],
      [
  61370365236, #    utc_start 1945-10-01 03:40:36 (Mon)
  62601132600, #      utc_end 1984-10-01 03:30:00 (Mon)
  61370352636, #  local_start 1945-10-01 00:10:36 (Mon)
  62601120000, #    local_end 1984-10-01 00:00:00 (Mon)
  -12600,
  0,
  '-0330',
      ],
      [
  62601132600, #    utc_start 1984-10-01 03:30:00 (Mon)
  DateTime::TimeZone::INFINITY, #      utc_end
  62601121800, #  local_start 1984-10-01 00:30:00 (Mon)
  DateTime::TimeZone::INFINITY, #    local_end
  -10800,
  0,
  '-03',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_PARAMARIBO

    $main::fatpacked{"DateTime/TimeZone/America/Phoenix.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_PHOENIX';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Phoenix;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Phoenix::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59418039600, #      utc_end 1883-11-18 19:00:00 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59418012702, #    local_end 1883-11-18 11:31:42 (Sun)
  -26898,
  0,
  'LMT',
      ],
      [
  59418039600, #    utc_start 1883-11-18 19:00:00 (Sun)
  60502410000, #      utc_end 1918-03-31 09:00:00 (Sun)
  59418014400, #  local_start 1883-11-18 12:00:00 (Sun)
  60502384800, #    local_end 1918-03-31 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  60502410000, #    utc_start 1918-03-31 09:00:00 (Sun)
  60520550400, #      utc_end 1918-10-27 08:00:00 (Sun)
  60502388400, #  local_start 1918-03-31 03:00:00 (Sun)
  60520528800, #    local_end 1918-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  60520550400, #    utc_start 1918-10-27 08:00:00 (Sun)
  60533859600, #      utc_end 1919-03-30 09:00:00 (Sun)
  60520525200, #  local_start 1918-10-27 01:00:00 (Sun)
  60533834400, #    local_end 1919-03-30 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  60533859600, #    utc_start 1919-03-30 09:00:00 (Sun)
  60552000000, #      utc_end 1919-10-26 08:00:00 (Sun)
  60533838000, #  local_start 1919-03-30 03:00:00 (Sun)
  60551978400, #    local_end 1919-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  60552000000, #    utc_start 1919-10-26 08:00:00 (Sun)
  61255472400, #      utc_end 1942-02-09 09:00:00 (Mon)
  60551974800, #  local_start 1919-10-26 01:00:00 (Sun)
  61255447200, #    local_end 1942-02-09 02:00:00 (Mon)
  -25200,
  0,
  'MST',
      ],
      [
  61255472400, #    utc_start 1942-02-09 09:00:00 (Mon)
  61315164060, #      utc_end 1944-01-01 06:01:00 (Sat)
  61255450800, #  local_start 1942-02-09 03:00:00 (Mon)
  61315142460, #    local_end 1944-01-01 00:01:00 (Sat)
  -21600,
  1,
  'MWT',
      ],
      [
  61315164060, #    utc_start 1944-01-01 06:01:00 (Sat)
  61323030060, #      utc_end 1944-04-01 07:01:00 (Sat)
  61315138860, #  local_start 1943-12-31 23:01:00 (Fri)
  61323004860, #    local_end 1944-04-01 00:01:00 (Sat)
  -25200,
  0,
  'MST',
      ],
      [
  61323030060, #    utc_start 1944-04-01 07:01:00 (Sat)
  61338837660, #      utc_end 1944-10-01 06:01:00 (Sun)
  61323008460, #  local_start 1944-04-01 01:01:00 (Sat)
  61338816060, #    local_end 1944-10-01 00:01:00 (Sun)
  -21600,
  1,
  'MWT',
      ],
      [
  61338837660, #    utc_start 1944-10-01 06:01:00 (Sun)
  62041014000, #      utc_end 1967-01-01 07:00:00 (Sun)
  61338812460, #  local_start 1944-09-30 23:01:00 (Sat)
  62040988800, #    local_end 1967-01-01 00:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62041014000, #    utc_start 1967-01-01 07:00:00 (Sun)
  62051302800, #      utc_end 1967-04-30 09:00:00 (Sun)
  62040988800, #  local_start 1967-01-01 00:00:00 (Sun)
  62051277600, #    local_end 1967-04-30 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62051302800, #    utc_start 1967-04-30 09:00:00 (Sun)
  62067024000, #      utc_end 1967-10-29 08:00:00 (Sun)
  62051281200, #  local_start 1967-04-30 03:00:00 (Sun)
  62067002400, #    local_end 1967-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62067024000, #    utc_start 1967-10-29 08:00:00 (Sun)
  62079462000, #      utc_end 1968-03-21 07:00:00 (Thu)
  62066998800, #  local_start 1967-10-29 01:00:00 (Sun)
  62079436800, #    local_end 1968-03-21 00:00:00 (Thu)
  -25200,
  0,
  'MST',
      ],
      [
  62079462000, #    utc_start 1968-03-21 07:00:00 (Thu)
  DateTime::TimeZone::INFINITY, #      utc_end
  62079436800, #  local_start 1968-03-21 00:00:00 (Thu)
  DateTime::TimeZone::INFINITY, #    local_end
  -25200,
  0,
  'MST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {5}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_PHOENIX

    $main::fatpacked{"DateTime/TimeZone/America/Port_au_Prince.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_PORT_AU_PRINCE';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Port_au_Prince;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Port_au_Prince::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59611178960, #      utc_end 1890-01-01 04:49:20 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59611161600, #    local_end 1890-01-01 00:00:00 (Wed)
  -17360,
  0,
  'LMT',
      ],
      [
  59611178960, #    utc_start 1890-01-01 04:49:20 (Wed)
  60465199740, #      utc_end 1917-01-24 16:49:00 (Wed)
  59611161620, #  local_start 1890-01-01 00:00:20 (Wed)
  60465182400, #    local_end 1917-01-24 12:00:00 (Wed)
  -17340,
  0,
  'PPMT',
      ],
      [
  60465199740, #    utc_start 1917-01-24 16:49:00 (Wed)
  62556901200, #      utc_end 1983-05-08 05:00:00 (Sun)
  60465181740, #  local_start 1917-01-24 11:49:00 (Wed)
  62556883200, #    local_end 1983-05-08 00:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62556901200, #    utc_start 1983-05-08 05:00:00 (Sun)
  62572017600, #      utc_end 1983-10-30 04:00:00 (Sun)
  62556886800, #  local_start 1983-05-08 01:00:00 (Sun)
  62572003200, #    local_end 1983-10-30 00:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62572017600, #    utc_start 1983-10-30 04:00:00 (Sun)
  62587746000, #      utc_end 1984-04-29 05:00:00 (Sun)
  62571999600, #  local_start 1983-10-29 23:00:00 (Sat)
  62587728000, #    local_end 1984-04-29 00:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62587746000, #    utc_start 1984-04-29 05:00:00 (Sun)
  62603467200, #      utc_end 1984-10-28 04:00:00 (Sun)
  62587731600, #  local_start 1984-04-29 01:00:00 (Sun)
  62603452800, #    local_end 1984-10-28 00:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62603467200, #    utc_start 1984-10-28 04:00:00 (Sun)
  62619195600, #      utc_end 1985-04-28 05:00:00 (Sun)
  62603449200, #  local_start 1984-10-27 23:00:00 (Sat)
  62619177600, #    local_end 1985-04-28 00:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62619195600, #    utc_start 1985-04-28 05:00:00 (Sun)
  62634916800, #      utc_end 1985-10-27 04:00:00 (Sun)
  62619181200, #  local_start 1985-04-28 01:00:00 (Sun)
  62634902400, #    local_end 1985-10-27 00:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62634916800, #    utc_start 1985-10-27 04:00:00 (Sun)
  62650645200, #      utc_end 1986-04-27 05:00:00 (Sun)
  62634898800, #  local_start 1985-10-26 23:00:00 (Sat)
  62650627200, #    local_end 1986-04-27 00:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62650645200, #    utc_start 1986-04-27 05:00:00 (Sun)
  62666366400, #      utc_end 1986-10-26 04:00:00 (Sun)
  62650630800, #  local_start 1986-04-27 01:00:00 (Sun)
  62666352000, #    local_end 1986-10-26 00:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62666366400, #    utc_start 1986-10-26 04:00:00 (Sun)
  62682094800, #      utc_end 1987-04-26 05:00:00 (Sun)
  62666348400, #  local_start 1986-10-25 23:00:00 (Sat)
  62682076800, #    local_end 1987-04-26 00:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62682094800, #    utc_start 1987-04-26 05:00:00 (Sun)
  62697816000, #      utc_end 1987-10-25 04:00:00 (Sun)
  62682080400, #  local_start 1987-04-26 01:00:00 (Sun)
  62697801600, #    local_end 1987-10-25 00:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62697816000, #    utc_start 1987-10-25 04:00:00 (Sun)
  62711733600, #      utc_end 1988-04-03 06:00:00 (Sun)
  62697798000, #  local_start 1987-10-24 23:00:00 (Sat)
  62711715600, #    local_end 1988-04-03 01:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62711733600, #    utc_start 1988-04-03 06:00:00 (Sun)
  62729877600, #      utc_end 1988-10-30 06:00:00 (Sun)
  62711719200, #  local_start 1988-04-03 02:00:00 (Sun)
  62729863200, #    local_end 1988-10-30 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62729877600, #    utc_start 1988-10-30 06:00:00 (Sun)
  62743183200, #      utc_end 1989-04-02 06:00:00 (Sun)
  62729859600, #  local_start 1988-10-30 01:00:00 (Sun)
  62743165200, #    local_end 1989-04-02 01:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62743183200, #    utc_start 1989-04-02 06:00:00 (Sun)
  62761327200, #      utc_end 1989-10-29 06:00:00 (Sun)
  62743168800, #  local_start 1989-04-02 02:00:00 (Sun)
  62761312800, #    local_end 1989-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62761327200, #    utc_start 1989-10-29 06:00:00 (Sun)
  62774632800, #      utc_end 1990-04-01 06:00:00 (Sun)
  62761309200, #  local_start 1989-10-29 01:00:00 (Sun)
  62774614800, #    local_end 1990-04-01 01:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62774632800, #    utc_start 1990-04-01 06:00:00 (Sun)
  62792776800, #      utc_end 1990-10-28 06:00:00 (Sun)
  62774618400, #  local_start 1990-04-01 02:00:00 (Sun)
  62792762400, #    local_end 1990-10-28 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62792776800, #    utc_start 1990-10-28 06:00:00 (Sun)
  62806687200, #      utc_end 1991-04-07 06:00:00 (Sun)
  62792758800, #  local_start 1990-10-28 01:00:00 (Sun)
  62806669200, #    local_end 1991-04-07 01:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62806687200, #    utc_start 1991-04-07 06:00:00 (Sun)
  62824226400, #      utc_end 1991-10-27 06:00:00 (Sun)
  62806672800, #  local_start 1991-04-07 02:00:00 (Sun)
  62824212000, #    local_end 1991-10-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62824226400, #    utc_start 1991-10-27 06:00:00 (Sun)
  62838136800, #      utc_end 1992-04-05 06:00:00 (Sun)
  62824208400, #  local_start 1991-10-27 01:00:00 (Sun)
  62838118800, #    local_end 1992-04-05 01:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62838136800, #    utc_start 1992-04-05 06:00:00 (Sun)
  62855676000, #      utc_end 1992-10-25 06:00:00 (Sun)
  62838122400, #  local_start 1992-04-05 02:00:00 (Sun)
  62855661600, #    local_end 1992-10-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62855676000, #    utc_start 1992-10-25 06:00:00 (Sun)
  62869586400, #      utc_end 1993-04-04 06:00:00 (Sun)
  62855658000, #  local_start 1992-10-25 01:00:00 (Sun)
  62869568400, #    local_end 1993-04-04 01:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62869586400, #    utc_start 1993-04-04 06:00:00 (Sun)
  62887730400, #      utc_end 1993-10-31 06:00:00 (Sun)
  62869572000, #  local_start 1993-04-04 02:00:00 (Sun)
  62887716000, #    local_end 1993-10-31 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62887730400, #    utc_start 1993-10-31 06:00:00 (Sun)
  62901036000, #      utc_end 1994-04-03 06:00:00 (Sun)
  62887712400, #  local_start 1993-10-31 01:00:00 (Sun)
  62901018000, #    local_end 1994-04-03 01:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62901036000, #    utc_start 1994-04-03 06:00:00 (Sun)
  62919180000, #      utc_end 1994-10-30 06:00:00 (Sun)
  62901021600, #  local_start 1994-04-03 02:00:00 (Sun)
  62919165600, #    local_end 1994-10-30 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62919180000, #    utc_start 1994-10-30 06:00:00 (Sun)
  62932485600, #      utc_end 1995-04-02 06:00:00 (Sun)
  62919162000, #  local_start 1994-10-30 01:00:00 (Sun)
  62932467600, #    local_end 1995-04-02 01:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62932485600, #    utc_start 1995-04-02 06:00:00 (Sun)
  62950629600, #      utc_end 1995-10-29 06:00:00 (Sun)
  62932471200, #  local_start 1995-04-02 02:00:00 (Sun)
  62950615200, #    local_end 1995-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62950629600, #    utc_start 1995-10-29 06:00:00 (Sun)
  62964540000, #      utc_end 1996-04-07 06:00:00 (Sun)
  62950611600, #  local_start 1995-10-29 01:00:00 (Sun)
  62964522000, #    local_end 1996-04-07 01:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62964540000, #    utc_start 1996-04-07 06:00:00 (Sun)
  62982079200, #      utc_end 1996-10-27 06:00:00 (Sun)
  62964525600, #  local_start 1996-04-07 02:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62982079200, #    utc_start 1996-10-27 06:00:00 (Sun)
  62995989600, #      utc_end 1997-04-06 06:00:00 (Sun)
  62982061200, #  local_start 1996-10-27 01:00:00 (Sun)
  62995971600, #    local_end 1997-04-06 01:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62995989600, #    utc_start 1997-04-06 06:00:00 (Sun)
  63013528800, #      utc_end 1997-10-26 06:00:00 (Sun)
  62995975200, #  local_start 1997-04-06 02:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63013528800, #    utc_start 1997-10-26 06:00:00 (Sun)
  63248187600, #      utc_end 2005-04-03 05:00:00 (Sun)
  63013510800, #  local_start 1997-10-26 01:00:00 (Sun)
  63248169600, #    local_end 2005-04-03 00:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63248187600, #    utc_start 2005-04-03 05:00:00 (Sun)
  63266328000, #      utc_end 2005-10-30 04:00:00 (Sun)
  63248173200, #  local_start 2005-04-03 01:00:00 (Sun)
  63266313600, #    local_end 2005-10-30 00:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63266328000, #    utc_start 2005-10-30 04:00:00 (Sun)
  63279637200, #      utc_end 2006-04-02 05:00:00 (Sun)
  63266310000, #  local_start 2005-10-29 23:00:00 (Sat)
  63279619200, #    local_end 2006-04-02 00:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63279637200, #    utc_start 2006-04-02 05:00:00 (Sun)
  63297777600, #      utc_end 2006-10-29 04:00:00 (Sun)
  63279622800, #  local_start 2006-04-02 01:00:00 (Sun)
  63297763200, #    local_end 2006-10-29 00:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63297777600, #    utc_start 2006-10-29 04:00:00 (Sun)
  63467132400, #      utc_end 2012-03-11 07:00:00 (Sun)
  63297759600, #  local_start 2006-10-28 23:00:00 (Sat)
  63467114400, #    local_end 2012-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63467132400, #    utc_start 2012-03-11 07:00:00 (Sun)
  63487692000, #      utc_end 2012-11-04 06:00:00 (Sun)
  63467118000, #  local_start 2012-03-11 03:00:00 (Sun)
  63487677600, #    local_end 2012-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63487692000, #    utc_start 2012-11-04 06:00:00 (Sun)
  63498582000, #      utc_end 2013-03-10 07:00:00 (Sun)
  63487674000, #  local_start 2012-11-04 01:00:00 (Sun)
  63498564000, #    local_end 2013-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63498582000, #    utc_start 2013-03-10 07:00:00 (Sun)
  63519141600, #      utc_end 2013-11-03 06:00:00 (Sun)
  63498567600, #  local_start 2013-03-10 03:00:00 (Sun)
  63519127200, #    local_end 2013-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63519141600, #    utc_start 2013-11-03 06:00:00 (Sun)
  63530031600, #      utc_end 2014-03-09 07:00:00 (Sun)
  63519123600, #  local_start 2013-11-03 01:00:00 (Sun)
  63530013600, #    local_end 2014-03-09 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63530031600, #    utc_start 2014-03-09 07:00:00 (Sun)
  63550591200, #      utc_end 2014-11-02 06:00:00 (Sun)
  63530017200, #  local_start 2014-03-09 03:00:00 (Sun)
  63550576800, #    local_end 2014-11-02 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63550591200, #    utc_start 2014-11-02 06:00:00 (Sun)
  63561481200, #      utc_end 2015-03-08 07:00:00 (Sun)
  63550573200, #  local_start 2014-11-02 01:00:00 (Sun)
  63561463200, #    local_end 2015-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63561481200, #    utc_start 2015-03-08 07:00:00 (Sun)
  63582040800, #      utc_end 2015-11-01 06:00:00 (Sun)
  63561466800, #  local_start 2015-03-08 03:00:00 (Sun)
  63582026400, #    local_end 2015-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63582040800, #    utc_start 2015-11-01 06:00:00 (Sun)
  63624985200, #      utc_end 2017-03-12 07:00:00 (Sun)
  63582022800, #  local_start 2015-11-01 01:00:00 (Sun)
  63624967200, #    local_end 2017-03-12 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63624985200, #    utc_start 2017-03-12 07:00:00 (Sun)
  63645544800, #      utc_end 2017-11-05 06:00:00 (Sun)
  63624970800, #  local_start 2017-03-12 03:00:00 (Sun)
  63645530400, #    local_end 2017-11-05 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63645544800, #    utc_start 2017-11-05 06:00:00 (Sun)
  63656434800, #      utc_end 2018-03-11 07:00:00 (Sun)
  63645526800, #  local_start 2017-11-05 01:00:00 (Sun)
  63656416800, #    local_end 2018-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63656434800, #    utc_start 2018-03-11 07:00:00 (Sun)
  63676994400, #      utc_end 2018-11-04 06:00:00 (Sun)
  63656420400, #  local_start 2018-03-11 03:00:00 (Sun)
  63676980000, #    local_end 2018-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63676994400, #    utc_start 2018-11-04 06:00:00 (Sun)
  63687884400, #      utc_end 2019-03-10 07:00:00 (Sun)
  63676976400, #  local_start 2018-11-04 01:00:00 (Sun)
  63687866400, #    local_end 2019-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63687884400, #    utc_start 2019-03-10 07:00:00 (Sun)
  63708444000, #      utc_end 2019-11-03 06:00:00 (Sun)
  63687870000, #  local_start 2019-03-10 03:00:00 (Sun)
  63708429600, #    local_end 2019-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63708444000, #    utc_start 2019-11-03 06:00:00 (Sun)
  63719334000, #      utc_end 2020-03-08 07:00:00 (Sun)
  63708426000, #  local_start 2019-11-03 01:00:00 (Sun)
  63719316000, #    local_end 2020-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63719334000, #    utc_start 2020-03-08 07:00:00 (Sun)
  63739893600, #      utc_end 2020-11-01 06:00:00 (Sun)
  63719319600, #  local_start 2020-03-08 03:00:00 (Sun)
  63739879200, #    local_end 2020-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63739893600, #    utc_start 2020-11-01 06:00:00 (Sun)
  63751388400, #      utc_end 2021-03-14 07:00:00 (Sun)
  63739875600, #  local_start 2020-11-01 01:00:00 (Sun)
  63751370400, #    local_end 2021-03-14 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63751388400, #    utc_start 2021-03-14 07:00:00 (Sun)
  63771948000, #      utc_end 2021-11-07 06:00:00 (Sun)
  63751374000, #  local_start 2021-03-14 03:00:00 (Sun)
  63771933600, #    local_end 2021-11-07 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63771948000, #    utc_start 2021-11-07 06:00:00 (Sun)
  63782838000, #      utc_end 2022-03-13 07:00:00 (Sun)
  63771930000, #  local_start 2021-11-07 01:00:00 (Sun)
  63782820000, #    local_end 2022-03-13 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63782838000, #    utc_start 2022-03-13 07:00:00 (Sun)
  63803397600, #      utc_end 2022-11-06 06:00:00 (Sun)
  63782823600, #  local_start 2022-03-13 03:00:00 (Sun)
  63803383200, #    local_end 2022-11-06 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63803397600, #    utc_start 2022-11-06 06:00:00 (Sun)
  63814287600, #      utc_end 2023-03-12 07:00:00 (Sun)
  63803379600, #  local_start 2022-11-06 01:00:00 (Sun)
  63814269600, #    local_end 2023-03-12 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63814287600, #    utc_start 2023-03-12 07:00:00 (Sun)
  63834847200, #      utc_end 2023-11-05 06:00:00 (Sun)
  63814273200, #  local_start 2023-03-12 03:00:00 (Sun)
  63834832800, #    local_end 2023-11-05 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63834847200, #    utc_start 2023-11-05 06:00:00 (Sun)
  63845737200, #      utc_end 2024-03-10 07:00:00 (Sun)
  63834829200, #  local_start 2023-11-05 01:00:00 (Sun)
  63845719200, #    local_end 2024-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63845737200, #    utc_start 2024-03-10 07:00:00 (Sun)
  63866296800, #      utc_end 2024-11-03 06:00:00 (Sun)
  63845722800, #  local_start 2024-03-10 03:00:00 (Sun)
  63866282400, #    local_end 2024-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63866296800, #    utc_start 2024-11-03 06:00:00 (Sun)
  63877186800, #      utc_end 2025-03-09 07:00:00 (Sun)
  63866278800, #  local_start 2024-11-03 01:00:00 (Sun)
  63877168800, #    local_end 2025-03-09 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63877186800, #    utc_start 2025-03-09 07:00:00 (Sun)
  63897746400, #      utc_end 2025-11-02 06:00:00 (Sun)
  63877172400, #  local_start 2025-03-09 03:00:00 (Sun)
  63897732000, #    local_end 2025-11-02 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63897746400, #    utc_start 2025-11-02 06:00:00 (Sun)
  63908636400, #      utc_end 2026-03-08 07:00:00 (Sun)
  63897728400, #  local_start 2025-11-02 01:00:00 (Sun)
  63908618400, #    local_end 2026-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63908636400, #    utc_start 2026-03-08 07:00:00 (Sun)
  63929196000, #      utc_end 2026-11-01 06:00:00 (Sun)
  63908622000, #  local_start 2026-03-08 03:00:00 (Sun)
  63929181600, #    local_end 2026-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63929196000, #    utc_start 2026-11-01 06:00:00 (Sun)
  63940690800, #      utc_end 2027-03-14 07:00:00 (Sun)
  63929178000, #  local_start 2026-11-01 01:00:00 (Sun)
  63940672800, #    local_end 2027-03-14 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63940690800, #    utc_start 2027-03-14 07:00:00 (Sun)
  63961250400, #      utc_end 2027-11-07 06:00:00 (Sun)
  63940676400, #  local_start 2027-03-14 03:00:00 (Sun)
  63961236000, #    local_end 2027-11-07 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63961250400, #    utc_start 2027-11-07 06:00:00 (Sun)
  63972140400, #      utc_end 2028-03-12 07:00:00 (Sun)
  63961232400, #  local_start 2027-11-07 01:00:00 (Sun)
  63972122400, #    local_end 2028-03-12 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63972140400, #    utc_start 2028-03-12 07:00:00 (Sun)
  63992700000, #      utc_end 2028-11-05 06:00:00 (Sun)
  63972126000, #  local_start 2028-03-12 03:00:00 (Sun)
  63992685600, #    local_end 2028-11-05 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63992700000, #    utc_start 2028-11-05 06:00:00 (Sun)
  64003590000, #      utc_end 2029-03-11 07:00:00 (Sun)
  63992682000, #  local_start 2028-11-05 01:00:00 (Sun)
  64003572000, #    local_end 2029-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  64003590000, #    utc_start 2029-03-11 07:00:00 (Sun)
  64024149600, #      utc_end 2029-11-04 06:00:00 (Sun)
  64003575600, #  local_start 2029-03-11 03:00:00 (Sun)
  64024135200, #    local_end 2029-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  64024149600, #    utc_start 2029-11-04 06:00:00 (Sun)
  64035039600, #      utc_end 2030-03-10 07:00:00 (Sun)
  64024131600, #  local_start 2029-11-04 01:00:00 (Sun)
  64035021600, #    local_end 2030-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  64035039600, #    utc_start 2030-03-10 07:00:00 (Sun)
  64055599200, #      utc_end 2030-11-03 06:00:00 (Sun)
  64035025200, #  local_start 2030-03-10 03:00:00 (Sun)
  64055584800, #    local_end 2030-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {35}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -18000 }
  
  my $last_observance = bless( {
    'format' => 'E%sT',
    'gmtoff' => '-5:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 699828,
      'local_rd_secs' => 42540,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 699828,
      'utc_rd_secs' => 42540,
      'utc_year' => 1918
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -18000,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 699828,
      'local_rd_secs' => 60540,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 699828,
      'utc_rd_secs' => 60540,
      'utc_year' => 1918
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2017',
      'in' => 'Nov',
      'letter' => 'S',
      'name' => 'Haiti',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2017',
      'in' => 'Mar',
      'letter' => 'D',
      'name' => 'Haiti',
      'offset_from_std' => 3600,
      'on' => 'Sun>=8',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_PORT_AU_PRINCE

    $main::fatpacked{"DateTime/TimeZone/America/Port_of_Spain.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_PORT_OF_SPAIN';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/southamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Port_of_Spain;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Port_of_Spain::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60310584364, #      utc_end 1912-03-02 04:06:04 (Sat)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60310569600, #    local_end 1912-03-02 00:00:00 (Sat)
  -14764,
  0,
  'LMT',
      ],
      [
  60310584364, #    utc_start 1912-03-02 04:06:04 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  60310569964, #  local_start 1912-03-02 00:06:04 (Sat)
  DateTime::TimeZone::INFINITY, #    local_end
  -14400,
  0,
  'AST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_PORT_OF_SPAIN

    $main::fatpacked{"DateTime/TimeZone/America/Porto_Velho.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_PORTO_VELHO';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/southamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Porto_Velho;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Porto_Velho::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60368472936, #      utc_end 1914-01-01 04:15:36 (Thu)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60368457600, #    local_end 1914-01-01 00:00:00 (Thu)
  -15336,
  0,
  'LMT',
      ],
      [
  60368472936, #    utc_start 1914-01-01 04:15:36 (Thu)
  60928729200, #      utc_end 1931-10-03 15:00:00 (Sat)
  60368458536, #  local_start 1914-01-01 00:15:36 (Thu)
  60928714800, #    local_end 1931-10-03 11:00:00 (Sat)
  -14400,
  0,
  '-04',
      ],
      [
  60928729200, #    utc_start 1931-10-03 15:00:00 (Sat)
  60944324400, #      utc_end 1932-04-01 03:00:00 (Fri)
  60928718400, #  local_start 1931-10-03 12:00:00 (Sat)
  60944313600, #    local_end 1932-04-01 00:00:00 (Fri)
  -10800,
  1,
  '-03',
      ],
      [
  60944324400, #    utc_start 1932-04-01 03:00:00 (Fri)
  60960312000, #      utc_end 1932-10-03 04:00:00 (Mon)
  60944310000, #  local_start 1932-03-31 23:00:00 (Thu)
  60960297600, #    local_end 1932-10-03 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  60960312000, #    utc_start 1932-10-03 04:00:00 (Mon)
  60975860400, #      utc_end 1933-04-01 03:00:00 (Sat)
  60960301200, #  local_start 1932-10-03 01:00:00 (Mon)
  60975849600, #    local_end 1933-04-01 00:00:00 (Sat)
  -10800,
  1,
  '-03',
      ],
      [
  60975860400, #    utc_start 1933-04-01 03:00:00 (Sat)
  61501867200, #      utc_end 1949-12-01 04:00:00 (Thu)
  60975846000, #  local_start 1933-03-31 23:00:00 (Fri)
  61501852800, #    local_end 1949-12-01 00:00:00 (Thu)
  -14400,
  0,
  '-04',
      ],
      [
  61501867200, #    utc_start 1949-12-01 04:00:00 (Thu)
  61513617600, #      utc_end 1950-04-16 04:00:00 (Sun)
  61501856400, #  local_start 1949-12-01 01:00:00 (Thu)
  61513606800, #    local_end 1950-04-16 01:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61513617600, #    utc_start 1950-04-16 04:00:00 (Sun)
  61533403200, #      utc_end 1950-12-01 04:00:00 (Fri)
  61513603200, #  local_start 1950-04-16 00:00:00 (Sun)
  61533388800, #    local_end 1950-12-01 00:00:00 (Fri)
  -14400,
  0,
  '-04',
      ],
      [
  61533403200, #    utc_start 1950-12-01 04:00:00 (Fri)
  61543854000, #      utc_end 1951-04-01 03:00:00 (Sun)
  61533392400, #  local_start 1950-12-01 01:00:00 (Fri)
  61543843200, #    local_end 1951-04-01 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61543854000, #    utc_start 1951-04-01 03:00:00 (Sun)
  61564939200, #      utc_end 1951-12-01 04:00:00 (Sat)
  61543839600, #  local_start 1951-03-31 23:00:00 (Sat)
  61564924800, #    local_end 1951-12-01 00:00:00 (Sat)
  -14400,
  0,
  '-04',
      ],
      [
  61564939200, #    utc_start 1951-12-01 04:00:00 (Sat)
  61575476400, #      utc_end 1952-04-01 03:00:00 (Tue)
  61564928400, #  local_start 1951-12-01 01:00:00 (Sat)
  61575465600, #    local_end 1952-04-01 00:00:00 (Tue)
  -10800,
  1,
  '-03',
      ],
      [
  61575476400, #    utc_start 1952-04-01 03:00:00 (Tue)
  61596561600, #      utc_end 1952-12-01 04:00:00 (Mon)
  61575462000, #  local_start 1952-03-31 23:00:00 (Mon)
  61596547200, #    local_end 1952-12-01 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  61596561600, #    utc_start 1952-12-01 04:00:00 (Mon)
  61604334000, #      utc_end 1953-03-01 03:00:00 (Sun)
  61596550800, #  local_start 1952-12-01 01:00:00 (Mon)
  61604323200, #    local_end 1953-03-01 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61604334000, #    utc_start 1953-03-01 03:00:00 (Sun)
  61944321600, #      utc_end 1963-12-09 04:00:00 (Mon)
  61604319600, #  local_start 1953-02-28 23:00:00 (Sat)
  61944307200, #    local_end 1963-12-09 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  61944321600, #    utc_start 1963-12-09 04:00:00 (Mon)
  61951489200, #      utc_end 1964-03-01 03:00:00 (Sun)
  61944310800, #  local_start 1963-12-09 01:00:00 (Mon)
  61951478400, #    local_end 1964-03-01 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61951489200, #    utc_start 1964-03-01 03:00:00 (Sun)
  61980523200, #      utc_end 1965-01-31 04:00:00 (Sun)
  61951474800, #  local_start 1964-02-29 23:00:00 (Sat)
  61980508800, #    local_end 1965-01-31 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  61980523200, #    utc_start 1965-01-31 04:00:00 (Sun)
  61985617200, #      utc_end 1965-03-31 03:00:00 (Wed)
  61980512400, #  local_start 1965-01-31 01:00:00 (Sun)
  61985606400, #    local_end 1965-03-31 00:00:00 (Wed)
  -10800,
  1,
  '-03',
      ],
      [
  61985617200, #    utc_start 1965-03-31 03:00:00 (Wed)
  62006788800, #      utc_end 1965-12-01 04:00:00 (Wed)
  61985602800, #  local_start 1965-03-30 23:00:00 (Tue)
  62006774400, #    local_end 1965-12-01 00:00:00 (Wed)
  -14400,
  0,
  '-04',
      ],
      [
  62006788800, #    utc_start 1965-12-01 04:00:00 (Wed)
  62014561200, #      utc_end 1966-03-01 03:00:00 (Tue)
  62006778000, #  local_start 1965-12-01 01:00:00 (Wed)
  62014550400, #    local_end 1966-03-01 00:00:00 (Tue)
  -10800,
  1,
  '-03',
      ],
      [
  62014561200, #    utc_start 1966-03-01 03:00:00 (Tue)
  62035732800, #      utc_end 1966-11-01 04:00:00 (Tue)
  62014546800, #  local_start 1966-02-28 23:00:00 (Mon)
  62035718400, #    local_end 1966-11-01 00:00:00 (Tue)
  -14400,
  0,
  '-04',
      ],
      [
  62035732800, #    utc_start 1966-11-01 04:00:00 (Tue)
  62046097200, #      utc_end 1967-03-01 03:00:00 (Wed)
  62035722000, #  local_start 1966-11-01 01:00:00 (Tue)
  62046086400, #    local_end 1967-03-01 00:00:00 (Wed)
  -10800,
  1,
  '-03',
      ],
      [
  62046097200, #    utc_start 1967-03-01 03:00:00 (Wed)
  62067268800, #      utc_end 1967-11-01 04:00:00 (Wed)
  62046082800, #  local_start 1967-02-28 23:00:00 (Tue)
  62067254400, #    local_end 1967-11-01 00:00:00 (Wed)
  -14400,
  0,
  '-04',
      ],
      [
  62067268800, #    utc_start 1967-11-01 04:00:00 (Wed)
  62077719600, #      utc_end 1968-03-01 03:00:00 (Fri)
  62067258000, #  local_start 1967-11-01 01:00:00 (Wed)
  62077708800, #    local_end 1968-03-01 00:00:00 (Fri)
  -10800,
  1,
  '-03',
      ],
      [
  62077719600, #    utc_start 1968-03-01 03:00:00 (Fri)
  62635435200, #      utc_end 1985-11-02 04:00:00 (Sat)
  62077705200, #  local_start 1968-02-29 23:00:00 (Thu)
  62635420800, #    local_end 1985-11-02 00:00:00 (Sat)
  -14400,
  0,
  '-04',
      ],
      [
  62635435200, #    utc_start 1985-11-02 04:00:00 (Sat)
  62646922800, #      utc_end 1986-03-15 03:00:00 (Sat)
  62635424400, #  local_start 1985-11-02 01:00:00 (Sat)
  62646912000, #    local_end 1986-03-15 00:00:00 (Sat)
  -10800,
  1,
  '-03',
      ],
      [
  62646922800, #    utc_start 1986-03-15 03:00:00 (Sat)
  62666280000, #      utc_end 1986-10-25 04:00:00 (Sat)
  62646908400, #  local_start 1986-03-14 23:00:00 (Fri)
  62666265600, #    local_end 1986-10-25 00:00:00 (Sat)
  -14400,
  0,
  '-04',
      ],
      [
  62666280000, #    utc_start 1986-10-25 04:00:00 (Sat)
  62675953200, #      utc_end 1987-02-14 03:00:00 (Sat)
  62666269200, #  local_start 1986-10-25 01:00:00 (Sat)
  62675942400, #    local_end 1987-02-14 00:00:00 (Sat)
  -10800,
  1,
  '-03',
      ],
      [
  62675953200, #    utc_start 1987-02-14 03:00:00 (Sat)
  62697816000, #      utc_end 1987-10-25 04:00:00 (Sun)
  62675938800, #  local_start 1987-02-13 23:00:00 (Fri)
  62697801600, #    local_end 1987-10-25 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62697816000, #    utc_start 1987-10-25 04:00:00 (Sun)
  62706884400, #      utc_end 1988-02-07 03:00:00 (Sun)
  62697805200, #  local_start 1987-10-25 01:00:00 (Sun)
  62706873600, #    local_end 1988-02-07 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62706884400, #    utc_start 1988-02-07 03:00:00 (Sun)
  62725723200, #      utc_end 1988-09-12 04:00:00 (Mon)
  62706870000, #  local_start 1988-02-06 23:00:00 (Sat)
  62725708800, #    local_end 1988-09-12 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  62725723200, #    utc_start 1988-09-12 04:00:00 (Mon)
  DateTime::TimeZone::INFINITY, #      utc_end
  62725708800, #  local_start 1988-09-12 00:00:00 (Mon)
  DateTime::TimeZone::INFINITY, #    local_end
  -14400,
  0,
  '-04',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {14}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_PORTO_VELHO

    $main::fatpacked{"DateTime/TimeZone/America/Puerto_Rico.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_PUERTO_RICO';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Puerto_Rico;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Puerto_Rico::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59902647865, #      utc_end 1899-03-28 16:24:25 (Tue)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59902632000, #    local_end 1899-03-28 12:00:00 (Tue)
  -15865,
  0,
  'LMT',
      ],
      [
  59902647865, #    utc_start 1899-03-28 16:24:25 (Tue)
  61262625600, #      utc_end 1942-05-03 04:00:00 (Sun)
  59902633465, #  local_start 1899-03-28 12:24:25 (Tue)
  61262611200, #    local_end 1942-05-03 00:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  61262625600, #    utc_start 1942-05-03 04:00:00 (Sun)
  61366287600, #      utc_end 1945-08-14 23:00:00 (Tue)
  61262614800, #  local_start 1942-05-03 01:00:00 (Sun)
  61366276800, #    local_end 1945-08-14 20:00:00 (Tue)
  -10800,
  1,
  'AWT',
      ],
      [
  61366287600, #    utc_start 1945-08-14 23:00:00 (Tue)
  61370283600, #      utc_end 1945-09-30 05:00:00 (Sun)
  61366276800, #  local_start 1945-08-14 20:00:00 (Tue)
  61370272800, #    local_end 1945-09-30 02:00:00 (Sun)
  -10800,
  1,
  'APT',
      ],
      [
  61370283600, #    utc_start 1945-09-30 05:00:00 (Sun)
  61378315200, #      utc_end 1946-01-01 04:00:00 (Tue)
  61370269200, #  local_start 1945-09-30 01:00:00 (Sun)
  61378300800, #    local_end 1946-01-01 00:00:00 (Tue)
  -14400,
  0,
  'AST',
      ],
      [
  61378315200, #    utc_start 1946-01-01 04:00:00 (Tue)
  DateTime::TimeZone::INFINITY, #      utc_end
  61378300800, #  local_start 1946-01-01 00:00:00 (Tue)
  DateTime::TimeZone::INFINITY, #    local_end
  -14400,
  0,
  'AST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {2}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_PUERTO_RICO

    $main::fatpacked{"DateTime/TimeZone/America/Punta_Arenas.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_PUNTA_ARENAS';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/southamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Punta_Arenas;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Punta_Arenas::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59611178620, #      utc_end 1890-01-01 04:43:40 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59611161600, #    local_end 1890-01-01 00:00:00 (Wed)
  -17020,
  0,
  'LMT',
      ],
      [
  59611178620, #    utc_start 1890-01-01 04:43:40 (Wed)
  60243021766, #      utc_end 1910-01-10 04:42:46 (Mon)
  59611161654, #  local_start 1890-01-01 00:00:54 (Wed)
  60243004800, #    local_end 1910-01-10 00:00:00 (Mon)
  -16966,
  0,
  'SMT',
      ],
      [
  60243021766, #    utc_start 1910-01-10 04:42:46 (Mon)
  60447272400, #      utc_end 1916-07-01 05:00:00 (Sat)
  60243003766, #  local_start 1910-01-09 23:42:46 (Sun)
  60447254400, #    local_end 1916-07-01 00:00:00 (Sat)
  -18000,
  0,
  '-05',
      ],
      [
  60447272400, #    utc_start 1916-07-01 05:00:00 (Sat)
  60516477766, #      utc_end 1918-09-10 04:42:46 (Tue)
  60447255434, #  local_start 1916-07-01 00:17:14 (Sat)
  60516460800, #    local_end 1918-09-10 00:00:00 (Tue)
  -16966,
  0,
  'SMT',
      ],
      [
  60516477766, #    utc_start 1918-09-10 04:42:46 (Tue)
  60541876800, #      utc_end 1919-07-01 04:00:00 (Tue)
  60516463366, #  local_start 1918-09-10 00:42:46 (Tue)
  60541862400, #    local_end 1919-07-01 00:00:00 (Tue)
  -14400,
  0,
  '-04',
      ],
      [
  60541876800, #    utc_start 1919-07-01 04:00:00 (Tue)
  60799696966, #      utc_end 1927-09-01 04:42:46 (Thu)
  60541859834, #  local_start 1919-06-30 23:17:14 (Mon)
  60799680000, #    local_end 1927-09-01 00:00:00 (Thu)
  -16966,
  0,
  'SMT',
      ],
      [
  60799696966, #    utc_start 1927-09-01 04:42:46 (Thu)
  60818097600, #      utc_end 1928-04-01 04:00:00 (Sun)
  60799682566, #  local_start 1927-09-01 00:42:46 (Thu)
  60818083200, #    local_end 1928-04-01 00:00:00 (Sun)
  -14400,
  1,
  '-04',
      ],
      [
  60818097600, #    utc_start 1928-04-01 04:00:00 (Sun)
  60831320400, #      utc_end 1928-09-01 05:00:00 (Sat)
  60818079600, #  local_start 1928-03-31 23:00:00 (Sat)
  60831302400, #    local_end 1928-09-01 00:00:00 (Sat)
  -18000,
  0,
  '-05',
      ],
      [
  60831320400, #    utc_start 1928-09-01 05:00:00 (Sat)
  60849633600, #      utc_end 1929-04-01 04:00:00 (Mon)
  60831306000, #  local_start 1928-09-01 01:00:00 (Sat)
  60849619200, #    local_end 1929-04-01 00:00:00 (Mon)
  -14400,
  1,
  '-04',
      ],
      [
  60849633600, #    utc_start 1929-04-01 04:00:00 (Mon)
  60862856400, #      utc_end 1929-09-01 05:00:00 (Sun)
  60849615600, #  local_start 1929-03-31 23:00:00 (Sun)
  60862838400, #    local_end 1929-09-01 00:00:00 (Sun)
  -18000,
  0,
  '-05',
      ],
      [
  60862856400, #    utc_start 1929-09-01 05:00:00 (Sun)
  60881169600, #      utc_end 1930-04-01 04:00:00 (Tue)
  60862842000, #  local_start 1929-09-01 01:00:00 (Sun)
  60881155200, #    local_end 1930-04-01 00:00:00 (Tue)
  -14400,
  1,
  '-04',
      ],
      [
  60881169600, #    utc_start 1930-04-01 04:00:00 (Tue)
  60894392400, #      utc_end 1930-09-01 05:00:00 (Mon)
  60881151600, #  local_start 1930-03-31 23:00:00 (Mon)
  60894374400, #    local_end 1930-09-01 00:00:00 (Mon)
  -18000,
  0,
  '-05',
      ],
      [
  60894392400, #    utc_start 1930-09-01 05:00:00 (Mon)
  60912705600, #      utc_end 1931-04-01 04:00:00 (Wed)
  60894378000, #  local_start 1930-09-01 01:00:00 (Mon)
  60912691200, #    local_end 1931-04-01 00:00:00 (Wed)
  -14400,
  1,
  '-04',
      ],
      [
  60912705600, #    utc_start 1931-04-01 04:00:00 (Wed)
  60925928400, #      utc_end 1931-09-01 05:00:00 (Tue)
  60912687600, #  local_start 1931-03-31 23:00:00 (Tue)
  60925910400, #    local_end 1931-09-01 00:00:00 (Tue)
  -18000,
  0,
  '-05',
      ],
      [
  60925928400, #    utc_start 1931-09-01 05:00:00 (Tue)
  60944328000, #      utc_end 1932-04-01 04:00:00 (Fri)
  60925914000, #  local_start 1931-09-01 01:00:00 (Tue)
  60944313600, #    local_end 1932-04-01 00:00:00 (Fri)
  -14400,
  1,
  '-04',
      ],
      [
  60944328000, #    utc_start 1932-04-01 04:00:00 (Fri)
  60957550800, #      utc_end 1932-09-01 05:00:00 (Thu)
  60944310000, #  local_start 1932-03-31 23:00:00 (Thu)
  60957532800, #    local_end 1932-09-01 00:00:00 (Thu)
  -18000,
  0,
  '-05',
      ],
      [
  60957550800, #    utc_start 1932-09-01 05:00:00 (Thu)
  61265131200, #      utc_end 1942-06-01 04:00:00 (Mon)
  60957536400, #  local_start 1932-09-01 01:00:00 (Thu)
  61265116800, #    local_end 1942-06-01 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  61265131200, #    utc_start 1942-06-01 04:00:00 (Mon)
  61270405200, #      utc_end 1942-08-01 05:00:00 (Sat)
  61265113200, #  local_start 1942-05-31 23:00:00 (Sun)
  61270387200, #    local_end 1942-08-01 00:00:00 (Sat)
  -18000,
  0,
  '-05',
      ],
      [
  61270405200, #    utc_start 1942-08-01 05:00:00 (Sat)
  61417627200, #      utc_end 1947-04-01 04:00:00 (Tue)
  61270390800, #  local_start 1942-08-01 01:00:00 (Sat)
  61417612800, #    local_end 1947-04-01 00:00:00 (Tue)
  -14400,
  0,
  '-04',
      ],
      [
  61417627200, #    utc_start 1947-04-01 04:00:00 (Tue)
  61422033600, #      utc_end 1947-05-22 04:00:00 (Thu)
  61417609200, #  local_start 1947-03-31 23:00:00 (Mon)
  61422015600, #    local_end 1947-05-21 23:00:00 (Wed)
  -18000,
  0,
  '-05',
      ],
      [
  61422033600, #    utc_start 1947-05-22 04:00:00 (Thu)
  62099064000, #      utc_end 1968-11-03 04:00:00 (Sun)
  61422019200, #  local_start 1947-05-22 00:00:00 (Thu)
  62099049600, #    local_end 1968-11-03 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62099064000, #    utc_start 1968-11-03 04:00:00 (Sun)
  62111761200, #      utc_end 1969-03-30 03:00:00 (Sun)
  62099053200, #  local_start 1968-11-03 01:00:00 (Sun)
  62111750400, #    local_end 1969-03-30 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62111761200, #    utc_start 1969-03-30 03:00:00 (Sun)
  62132328000, #      utc_end 1969-11-23 04:00:00 (Sun)
  62111746800, #  local_start 1969-03-29 23:00:00 (Sat)
  62132313600, #    local_end 1969-11-23 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62132328000, #    utc_start 1969-11-23 04:00:00 (Sun)
  62143210800, #      utc_end 1970-03-29 03:00:00 (Sun)
  62132317200, #  local_start 1969-11-23 01:00:00 (Sun)
  62143200000, #    local_end 1970-03-29 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62143210800, #    utc_start 1970-03-29 03:00:00 (Sun)
  62160148800, #      utc_end 1970-10-11 04:00:00 (Sun)
  62143196400, #  local_start 1970-03-28 23:00:00 (Sat)
  62160134400, #    local_end 1970-10-11 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62160148800, #    utc_start 1970-10-11 04:00:00 (Sun)
  62173450800, #      utc_end 1971-03-14 03:00:00 (Sun)
  62160138000, #  local_start 1970-10-11 01:00:00 (Sun)
  62173440000, #    local_end 1971-03-14 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62173450800, #    utc_start 1971-03-14 03:00:00 (Sun)
  62191598400, #      utc_end 1971-10-10 04:00:00 (Sun)
  62173436400, #  local_start 1971-03-13 23:00:00 (Sat)
  62191584000, #    local_end 1971-10-10 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62191598400, #    utc_start 1971-10-10 04:00:00 (Sun)
  62204900400, #      utc_end 1972-03-12 03:00:00 (Sun)
  62191587600, #  local_start 1971-10-10 01:00:00 (Sun)
  62204889600, #    local_end 1972-03-12 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62204900400, #    utc_start 1972-03-12 03:00:00 (Sun)
  62223652800, #      utc_end 1972-10-15 04:00:00 (Sun)
  62204886000, #  local_start 1972-03-11 23:00:00 (Sat)
  62223638400, #    local_end 1972-10-15 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62223652800, #    utc_start 1972-10-15 04:00:00 (Sun)
  62236350000, #      utc_end 1973-03-11 03:00:00 (Sun)
  62223642000, #  local_start 1972-10-15 01:00:00 (Sun)
  62236339200, #    local_end 1973-03-11 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62236350000, #    utc_start 1973-03-11 03:00:00 (Sun)
  62253892800, #      utc_end 1973-09-30 04:00:00 (Sun)
  62236335600, #  local_start 1973-03-10 23:00:00 (Sat)
  62253878400, #    local_end 1973-09-30 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62253892800, #    utc_start 1973-09-30 04:00:00 (Sun)
  62267799600, #      utc_end 1974-03-10 03:00:00 (Sun)
  62253882000, #  local_start 1973-09-30 01:00:00 (Sun)
  62267788800, #    local_end 1974-03-10 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62267799600, #    utc_start 1974-03-10 03:00:00 (Sun)
  62286552000, #      utc_end 1974-10-13 04:00:00 (Sun)
  62267785200, #  local_start 1974-03-09 23:00:00 (Sat)
  62286537600, #    local_end 1974-10-13 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62286552000, #    utc_start 1974-10-13 04:00:00 (Sun)
  62299249200, #      utc_end 1975-03-09 03:00:00 (Sun)
  62286541200, #  local_start 1974-10-13 01:00:00 (Sun)
  62299238400, #    local_end 1975-03-09 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62299249200, #    utc_start 1975-03-09 03:00:00 (Sun)
  62318001600, #      utc_end 1975-10-12 04:00:00 (Sun)
  62299234800, #  local_start 1975-03-08 23:00:00 (Sat)
  62317987200, #    local_end 1975-10-12 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62318001600, #    utc_start 1975-10-12 04:00:00 (Sun)
  62331303600, #      utc_end 1976-03-14 03:00:00 (Sun)
  62317990800, #  local_start 1975-10-12 01:00:00 (Sun)
  62331292800, #    local_end 1976-03-14 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62331303600, #    utc_start 1976-03-14 03:00:00 (Sun)
  62349451200, #      utc_end 1976-10-10 04:00:00 (Sun)
  62331289200, #  local_start 1976-03-13 23:00:00 (Sat)
  62349436800, #    local_end 1976-10-10 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62349451200, #    utc_start 1976-10-10 04:00:00 (Sun)
  62362753200, #      utc_end 1977-03-13 03:00:00 (Sun)
  62349440400, #  local_start 1976-10-10 01:00:00 (Sun)
  62362742400, #    local_end 1977-03-13 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62362753200, #    utc_start 1977-03-13 03:00:00 (Sun)
  62380900800, #      utc_end 1977-10-09 04:00:00 (Sun)
  62362738800, #  local_start 1977-03-12 23:00:00 (Sat)
  62380886400, #    local_end 1977-10-09 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62380900800, #    utc_start 1977-10-09 04:00:00 (Sun)
  62394202800, #      utc_end 1978-03-12 03:00:00 (Sun)
  62380890000, #  local_start 1977-10-09 01:00:00 (Sun)
  62394192000, #    local_end 1978-03-12 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62394202800, #    utc_start 1978-03-12 03:00:00 (Sun)
  62412955200, #      utc_end 1978-10-15 04:00:00 (Sun)
  62394188400, #  local_start 1978-03-11 23:00:00 (Sat)
  62412940800, #    local_end 1978-10-15 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62412955200, #    utc_start 1978-10-15 04:00:00 (Sun)
  62425652400, #      utc_end 1979-03-11 03:00:00 (Sun)
  62412944400, #  local_start 1978-10-15 01:00:00 (Sun)
  62425641600, #    local_end 1979-03-11 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62425652400, #    utc_start 1979-03-11 03:00:00 (Sun)
  62444404800, #      utc_end 1979-10-14 04:00:00 (Sun)
  62425638000, #  local_start 1979-03-10 23:00:00 (Sat)
  62444390400, #    local_end 1979-10-14 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62444404800, #    utc_start 1979-10-14 04:00:00 (Sun)
  62457102000, #      utc_end 1980-03-09 03:00:00 (Sun)
  62444394000, #  local_start 1979-10-14 01:00:00 (Sun)
  62457091200, #    local_end 1980-03-09 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62457102000, #    utc_start 1980-03-09 03:00:00 (Sun)
  62475854400, #      utc_end 1980-10-12 04:00:00 (Sun)
  62457087600, #  local_start 1980-03-08 23:00:00 (Sat)
  62475840000, #    local_end 1980-10-12 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62475854400, #    utc_start 1980-10-12 04:00:00 (Sun)
  62489156400, #      utc_end 1981-03-15 03:00:00 (Sun)
  62475843600, #  local_start 1980-10-12 01:00:00 (Sun)
  62489145600, #    local_end 1981-03-15 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62489156400, #    utc_start 1981-03-15 03:00:00 (Sun)
  62507304000, #      utc_end 1981-10-11 04:00:00 (Sun)
  62489142000, #  local_start 1981-03-14 23:00:00 (Sat)
  62507289600, #    local_end 1981-10-11 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62507304000, #    utc_start 1981-10-11 04:00:00 (Sun)
  62520606000, #      utc_end 1982-03-14 03:00:00 (Sun)
  62507293200, #  local_start 1981-10-11 01:00:00 (Sun)
  62520595200, #    local_end 1982-03-14 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62520606000, #    utc_start 1982-03-14 03:00:00 (Sun)
  62538753600, #      utc_end 1982-10-10 04:00:00 (Sun)
  62520591600, #  local_start 1982-03-13 23:00:00 (Sat)
  62538739200, #    local_end 1982-10-10 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62538753600, #    utc_start 1982-10-10 04:00:00 (Sun)
  62552055600, #      utc_end 1983-03-13 03:00:00 (Sun)
  62538742800, #  local_start 1982-10-10 01:00:00 (Sun)
  62552044800, #    local_end 1983-03-13 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62552055600, #    utc_start 1983-03-13 03:00:00 (Sun)
  62570203200, #      utc_end 1983-10-09 04:00:00 (Sun)
  62552041200, #  local_start 1983-03-12 23:00:00 (Sat)
  62570188800, #    local_end 1983-10-09 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62570203200, #    utc_start 1983-10-09 04:00:00 (Sun)
  62583505200, #      utc_end 1984-03-11 03:00:00 (Sun)
  62570192400, #  local_start 1983-10-09 01:00:00 (Sun)
  62583494400, #    local_end 1984-03-11 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62583505200, #    utc_start 1984-03-11 03:00:00 (Sun)
  62602257600, #      utc_end 1984-10-14 04:00:00 (Sun)
  62583490800, #  local_start 1984-03-10 23:00:00 (Sat)
  62602243200, #    local_end 1984-10-14 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62602257600, #    utc_start 1984-10-14 04:00:00 (Sun)
  62614954800, #      utc_end 1985-03-10 03:00:00 (Sun)
  62602246800, #  local_start 1984-10-14 01:00:00 (Sun)
  62614944000, #    local_end 1985-03-10 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62614954800, #    utc_start 1985-03-10 03:00:00 (Sun)
  62633707200, #      utc_end 1985-10-13 04:00:00 (Sun)
  62614940400, #  local_start 1985-03-09 23:00:00 (Sat)
  62633692800, #    local_end 1985-10-13 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62633707200, #    utc_start 1985-10-13 04:00:00 (Sun)
  62646404400, #      utc_end 1986-03-09 03:00:00 (Sun)
  62633696400, #  local_start 1985-10-13 01:00:00 (Sun)
  62646393600, #    local_end 1986-03-09 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62646404400, #    utc_start 1986-03-09 03:00:00 (Sun)
  62665156800, #      utc_end 1986-10-12 04:00:00 (Sun)
  62646390000, #  local_start 1986-03-08 23:00:00 (Sat)
  62665142400, #    local_end 1986-10-12 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62665156800, #    utc_start 1986-10-12 04:00:00 (Sun)
  62680878000, #      utc_end 1987-04-12 03:00:00 (Sun)
  62665146000, #  local_start 1986-10-12 01:00:00 (Sun)
  62680867200, #    local_end 1987-04-12 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62680878000, #    utc_start 1987-04-12 03:00:00 (Sun)
  62696606400, #      utc_end 1987-10-11 04:00:00 (Sun)
  62680863600, #  local_start 1987-04-11 23:00:00 (Sat)
  62696592000, #    local_end 1987-10-11 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62696606400, #    utc_start 1987-10-11 04:00:00 (Sun)
  62709908400, #      utc_end 1988-03-13 03:00:00 (Sun)
  62696595600, #  local_start 1987-10-11 01:00:00 (Sun)
  62709897600, #    local_end 1988-03-13 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62709908400, #    utc_start 1988-03-13 03:00:00 (Sun)
  62728056000, #      utc_end 1988-10-09 04:00:00 (Sun)
  62709894000, #  local_start 1988-03-12 23:00:00 (Sat)
  62728041600, #    local_end 1988-10-09 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62728056000, #    utc_start 1988-10-09 04:00:00 (Sun)
  62741358000, #      utc_end 1989-03-12 03:00:00 (Sun)
  62728045200, #  local_start 1988-10-09 01:00:00 (Sun)
  62741347200, #    local_end 1989-03-12 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62741358000, #    utc_start 1989-03-12 03:00:00 (Sun)
  62760110400, #      utc_end 1989-10-15 04:00:00 (Sun)
  62741343600, #  local_start 1989-03-11 23:00:00 (Sat)
  62760096000, #    local_end 1989-10-15 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62760110400, #    utc_start 1989-10-15 04:00:00 (Sun)
  62772807600, #      utc_end 1990-03-11 03:00:00 (Sun)
  62760099600, #  local_start 1989-10-15 01:00:00 (Sun)
  62772796800, #    local_end 1990-03-11 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62772807600, #    utc_start 1990-03-11 03:00:00 (Sun)
  62789140800, #      utc_end 1990-09-16 04:00:00 (Sun)
  62772793200, #  local_start 1990-03-10 23:00:00 (Sat)
  62789126400, #    local_end 1990-09-16 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62789140800, #    utc_start 1990-09-16 04:00:00 (Sun)
  62804257200, #      utc_end 1991-03-10 03:00:00 (Sun)
  62789130000, #  local_start 1990-09-16 01:00:00 (Sun)
  62804246400, #    local_end 1991-03-10 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62804257200, #    utc_start 1991-03-10 03:00:00 (Sun)
  62823009600, #      utc_end 1991-10-13 04:00:00 (Sun)
  62804242800, #  local_start 1991-03-09 23:00:00 (Sat)
  62822995200, #    local_end 1991-10-13 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62823009600, #    utc_start 1991-10-13 04:00:00 (Sun)
  62836311600, #      utc_end 1992-03-15 03:00:00 (Sun)
  62822998800, #  local_start 1991-10-13 01:00:00 (Sun)
  62836300800, #    local_end 1992-03-15 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62836311600, #    utc_start 1992-03-15 03:00:00 (Sun)
  62854459200, #      utc_end 1992-10-11 04:00:00 (Sun)
  62836297200, #  local_start 1992-03-14 23:00:00 (Sat)
  62854444800, #    local_end 1992-10-11 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62854459200, #    utc_start 1992-10-11 04:00:00 (Sun)
  62867761200, #      utc_end 1993-03-14 03:00:00 (Sun)
  62854448400, #  local_start 1992-10-11 01:00:00 (Sun)
  62867750400, #    local_end 1993-03-14 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62867761200, #    utc_start 1993-03-14 03:00:00 (Sun)
  62885908800, #      utc_end 1993-10-10 04:00:00 (Sun)
  62867746800, #  local_start 1993-03-13 23:00:00 (Sat)
  62885894400, #    local_end 1993-10-10 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62885908800, #    utc_start 1993-10-10 04:00:00 (Sun)
  62899210800, #      utc_end 1994-03-13 03:00:00 (Sun)
  62885898000, #  local_start 1993-10-10 01:00:00 (Sun)
  62899200000, #    local_end 1994-03-13 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62899210800, #    utc_start 1994-03-13 03:00:00 (Sun)
  62917358400, #      utc_end 1994-10-09 04:00:00 (Sun)
  62899196400, #  local_start 1994-03-12 23:00:00 (Sat)
  62917344000, #    local_end 1994-10-09 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62917358400, #    utc_start 1994-10-09 04:00:00 (Sun)
  62930660400, #      utc_end 1995-03-12 03:00:00 (Sun)
  62917347600, #  local_start 1994-10-09 01:00:00 (Sun)
  62930649600, #    local_end 1995-03-12 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62930660400, #    utc_start 1995-03-12 03:00:00 (Sun)
  62949412800, #      utc_end 1995-10-15 04:00:00 (Sun)
  62930646000, #  local_start 1995-03-11 23:00:00 (Sat)
  62949398400, #    local_end 1995-10-15 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62949412800, #    utc_start 1995-10-15 04:00:00 (Sun)
  62962110000, #      utc_end 1996-03-10 03:00:00 (Sun)
  62949402000, #  local_start 1995-10-15 01:00:00 (Sun)
  62962099200, #    local_end 1996-03-10 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62962110000, #    utc_start 1996-03-10 03:00:00 (Sun)
  62980862400, #      utc_end 1996-10-13 04:00:00 (Sun)
  62962095600, #  local_start 1996-03-09 23:00:00 (Sat)
  62980848000, #    local_end 1996-10-13 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62980862400, #    utc_start 1996-10-13 04:00:00 (Sun)
  62995374000, #      utc_end 1997-03-30 03:00:00 (Sun)
  62980851600, #  local_start 1996-10-13 01:00:00 (Sun)
  62995363200, #    local_end 1997-03-30 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62995374000, #    utc_start 1997-03-30 03:00:00 (Sun)
  63012312000, #      utc_end 1997-10-12 04:00:00 (Sun)
  62995359600, #  local_start 1997-03-29 23:00:00 (Sat)
  63012297600, #    local_end 1997-10-12 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63012312000, #    utc_start 1997-10-12 04:00:00 (Sun)
  63025614000, #      utc_end 1998-03-15 03:00:00 (Sun)
  63012301200, #  local_start 1997-10-12 01:00:00 (Sun)
  63025603200, #    local_end 1998-03-15 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63025614000, #    utc_start 1998-03-15 03:00:00 (Sun)
  63042552000, #      utc_end 1998-09-27 04:00:00 (Sun)
  63025599600, #  local_start 1998-03-14 23:00:00 (Sat)
  63042537600, #    local_end 1998-09-27 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63042552000, #    utc_start 1998-09-27 04:00:00 (Sun)
  63058878000, #      utc_end 1999-04-04 03:00:00 (Sun)
  63042541200, #  local_start 1998-09-27 01:00:00 (Sun)
  63058867200, #    local_end 1999-04-04 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63058878000, #    utc_start 1999-04-04 03:00:00 (Sun)
  63075211200, #      utc_end 1999-10-10 04:00:00 (Sun)
  63058863600, #  local_start 1999-04-03 23:00:00 (Sat)
  63075196800, #    local_end 1999-10-10 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63075211200, #    utc_start 1999-10-10 04:00:00 (Sun)
  63088513200, #      utc_end 2000-03-12 03:00:00 (Sun)
  63075200400, #  local_start 1999-10-10 01:00:00 (Sun)
  63088502400, #    local_end 2000-03-12 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63088513200, #    utc_start 2000-03-12 03:00:00 (Sun)
  63107265600, #      utc_end 2000-10-15 04:00:00 (Sun)
  63088498800, #  local_start 2000-03-11 23:00:00 (Sat)
  63107251200, #    local_end 2000-10-15 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63107265600, #    utc_start 2000-10-15 04:00:00 (Sun)
  63119962800, #      utc_end 2001-03-11 03:00:00 (Sun)
  63107254800, #  local_start 2000-10-15 01:00:00 (Sun)
  63119952000, #    local_end 2001-03-11 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63119962800, #    utc_start 2001-03-11 03:00:00 (Sun)
  63138715200, #      utc_end 2001-10-14 04:00:00 (Sun)
  63119948400, #  local_start 2001-03-10 23:00:00 (Sat)
  63138700800, #    local_end 2001-10-14 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63138715200, #    utc_start 2001-10-14 04:00:00 (Sun)
  63151412400, #      utc_end 2002-03-10 03:00:00 (Sun)
  63138704400, #  local_start 2001-10-14 01:00:00 (Sun)
  63151401600, #    local_end 2002-03-10 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63151412400, #    utc_start 2002-03-10 03:00:00 (Sun)
  63170164800, #      utc_end 2002-10-13 04:00:00 (Sun)
  63151398000, #  local_start 2002-03-09 23:00:00 (Sat)
  63170150400, #    local_end 2002-10-13 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63170164800, #    utc_start 2002-10-13 04:00:00 (Sun)
  63182862000, #      utc_end 2003-03-09 03:00:00 (Sun)
  63170154000, #  local_start 2002-10-13 01:00:00 (Sun)
  63182851200, #    local_end 2003-03-09 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63182862000, #    utc_start 2003-03-09 03:00:00 (Sun)
  63201614400, #      utc_end 2003-10-12 04:00:00 (Sun)
  63182847600, #  local_start 2003-03-08 23:00:00 (Sat)
  63201600000, #    local_end 2003-10-12 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63201614400, #    utc_start 2003-10-12 04:00:00 (Sun)
  63214916400, #      utc_end 2004-03-14 03:00:00 (Sun)
  63201603600, #  local_start 2003-10-12 01:00:00 (Sun)
  63214905600, #    local_end 2004-03-14 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63214916400, #    utc_start 2004-03-14 03:00:00 (Sun)
  63233064000, #      utc_end 2004-10-10 04:00:00 (Sun)
  63214902000, #  local_start 2004-03-13 23:00:00 (Sat)
  63233049600, #    local_end 2004-10-10 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63233064000, #    utc_start 2004-10-10 04:00:00 (Sun)
  63246366000, #      utc_end 2005-03-13 03:00:00 (Sun)
  63233053200, #  local_start 2004-10-10 01:00:00 (Sun)
  63246355200, #    local_end 2005-03-13 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63246366000, #    utc_start 2005-03-13 03:00:00 (Sun)
  63264513600, #      utc_end 2005-10-09 04:00:00 (Sun)
  63246351600, #  local_start 2005-03-12 23:00:00 (Sat)
  63264499200, #    local_end 2005-10-09 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63264513600, #    utc_start 2005-10-09 04:00:00 (Sun)
  63277815600, #      utc_end 2006-03-12 03:00:00 (Sun)
  63264502800, #  local_start 2005-10-09 01:00:00 (Sun)
  63277804800, #    local_end 2006-03-12 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63277815600, #    utc_start 2006-03-12 03:00:00 (Sun)
  63296568000, #      utc_end 2006-10-15 04:00:00 (Sun)
  63277801200, #  local_start 2006-03-11 23:00:00 (Sat)
  63296553600, #    local_end 2006-10-15 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63296568000, #    utc_start 2006-10-15 04:00:00 (Sun)
  63309265200, #      utc_end 2007-03-11 03:00:00 (Sun)
  63296557200, #  local_start 2006-10-15 01:00:00 (Sun)
  63309254400, #    local_end 2007-03-11 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63309265200, #    utc_start 2007-03-11 03:00:00 (Sun)
  63328017600, #      utc_end 2007-10-14 04:00:00 (Sun)
  63309250800, #  local_start 2007-03-10 23:00:00 (Sat)
  63328003200, #    local_end 2007-10-14 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63328017600, #    utc_start 2007-10-14 04:00:00 (Sun)
  63342529200, #      utc_end 2008-03-30 03:00:00 (Sun)
  63328006800, #  local_start 2007-10-14 01:00:00 (Sun)
  63342518400, #    local_end 2008-03-30 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63342529200, #    utc_start 2008-03-30 03:00:00 (Sun)
  63359467200, #      utc_end 2008-10-12 04:00:00 (Sun)
  63342514800, #  local_start 2008-03-29 23:00:00 (Sat)
  63359452800, #    local_end 2008-10-12 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63359467200, #    utc_start 2008-10-12 04:00:00 (Sun)
  63372769200, #      utc_end 2009-03-15 03:00:00 (Sun)
  63359456400, #  local_start 2008-10-12 01:00:00 (Sun)
  63372758400, #    local_end 2009-03-15 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63372769200, #    utc_start 2009-03-15 03:00:00 (Sun)
  63390916800, #      utc_end 2009-10-11 04:00:00 (Sun)
  63372754800, #  local_start 2009-03-14 23:00:00 (Sat)
  63390902400, #    local_end 2009-10-11 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63390916800, #    utc_start 2009-10-11 04:00:00 (Sun)
  63406033200, #      utc_end 2010-04-04 03:00:00 (Sun)
  63390906000, #  local_start 2009-10-11 01:00:00 (Sun)
  63406022400, #    local_end 2010-04-04 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63406033200, #    utc_start 2010-04-04 03:00:00 (Sun)
  63422366400, #      utc_end 2010-10-10 04:00:00 (Sun)
  63406018800, #  local_start 2010-04-03 23:00:00 (Sat)
  63422352000, #    local_end 2010-10-10 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63422366400, #    utc_start 2010-10-10 04:00:00 (Sun)
  63440506800, #      utc_end 2011-05-08 03:00:00 (Sun)
  63422355600, #  local_start 2010-10-10 01:00:00 (Sun)
  63440496000, #    local_end 2011-05-08 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63440506800, #    utc_start 2011-05-08 03:00:00 (Sun)
  63449582400, #      utc_end 2011-08-21 04:00:00 (Sun)
  63440492400, #  local_start 2011-05-07 23:00:00 (Sat)
  63449568000, #    local_end 2011-08-21 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63449582400, #    utc_start 2011-08-21 04:00:00 (Sun)
  63471351600, #      utc_end 2012-04-29 03:00:00 (Sun)
  63449571600, #  local_start 2011-08-21 01:00:00 (Sun)
  63471340800, #    local_end 2012-04-29 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63471351600, #    utc_start 2012-04-29 03:00:00 (Sun)
  63482241600, #      utc_end 2012-09-02 04:00:00 (Sun)
  63471337200, #  local_start 2012-04-28 23:00:00 (Sat)
  63482227200, #    local_end 2012-09-02 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63482241600, #    utc_start 2012-09-02 04:00:00 (Sun)
  63502801200, #      utc_end 2013-04-28 03:00:00 (Sun)
  63482230800, #  local_start 2012-09-02 01:00:00 (Sun)
  63502790400, #    local_end 2013-04-28 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63502801200, #    utc_start 2013-04-28 03:00:00 (Sun)
  63514296000, #      utc_end 2013-09-08 04:00:00 (Sun)
  63502786800, #  local_start 2013-04-27 23:00:00 (Sat)
  63514281600, #    local_end 2013-09-08 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63514296000, #    utc_start 2013-09-08 04:00:00 (Sun)
  63534250800, #      utc_end 2014-04-27 03:00:00 (Sun)
  63514285200, #  local_start 2013-09-08 01:00:00 (Sun)
  63534240000, #    local_end 2014-04-27 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63534250800, #    utc_start 2014-04-27 03:00:00 (Sun)
  63545745600, #      utc_end 2014-09-07 04:00:00 (Sun)
  63534236400, #  local_start 2014-04-26 23:00:00 (Sat)
  63545731200, #    local_end 2014-09-07 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63545745600, #    utc_start 2014-09-07 04:00:00 (Sun)
  63598964400, #      utc_end 2016-05-15 03:00:00 (Sun)
  63545734800, #  local_start 2014-09-07 01:00:00 (Sun)
  63598953600, #    local_end 2016-05-15 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63598964400, #    utc_start 2016-05-15 03:00:00 (Sun)
  63606830400, #      utc_end 2016-08-14 04:00:00 (Sun)
  63598950000, #  local_start 2016-05-14 23:00:00 (Sat)
  63606816000, #    local_end 2016-08-14 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63606830400, #    utc_start 2016-08-14 04:00:00 (Sun)
  63616503600, #      utc_end 2016-12-04 03:00:00 (Sun)
  63606819600, #  local_start 2016-08-14 01:00:00 (Sun)
  63616492800, #    local_end 2016-12-04 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63616503600, #    utc_start 2016-12-04 03:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #      utc_end
  63616492800, #  local_start 2016-12-04 00:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  -10800,
  0,
  '-03',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {53}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_PUNTA_ARENAS

    $main::fatpacked{"DateTime/TimeZone/America/Rainy_River.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_RAINY_RIVER';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Rainy_River;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Rainy_River::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59768950696, #      utc_end 1895-01-01 06:18:16 (Tue)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59768928000, #    local_end 1895-01-01 00:00:00 (Tue)
  -22696,
  0,
  'LMT',
      ],
      [
  59768950696, #    utc_start 1895-01-01 06:18:16 (Tue)
  60503616000, #      utc_end 1918-04-14 08:00:00 (Sun)
  59768929096, #  local_start 1895-01-01 00:18:16 (Tue)
  60503594400, #    local_end 1918-04-14 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  60503616000, #    utc_start 1918-04-14 08:00:00 (Sun)
  60520546800, #      utc_end 1918-10-27 07:00:00 (Sun)
  60503598000, #  local_start 1918-04-14 03:00:00 (Sun)
  60520528800, #    local_end 1918-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  60520546800, #    utc_start 1918-10-27 07:00:00 (Sun)
  61212434400, #      utc_end 1940-09-29 06:00:00 (Sun)
  60520525200, #  local_start 1918-10-27 01:00:00 (Sun)
  61212412800, #    local_end 1940-09-29 00:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61212434400, #    utc_start 1940-09-29 06:00:00 (Sun)
  61255468800, #      utc_end 1942-02-09 08:00:00 (Mon)
  61212416400, #  local_start 1940-09-29 01:00:00 (Sun)
  61255450800, #    local_end 1942-02-09 03:00:00 (Mon)
  -18000,
  1,
  'CDT',
      ],
      [
  61255468800, #    utc_start 1942-02-09 08:00:00 (Mon)
  61366287600, #      utc_end 1945-08-14 23:00:00 (Tue)
  61255450800, #  local_start 1942-02-09 03:00:00 (Mon)
  61366269600, #    local_end 1945-08-14 18:00:00 (Tue)
  -18000,
  1,
  'CWT',
      ],
      [
  61366287600, #    utc_start 1945-08-14 23:00:00 (Tue)
  61370290800, #      utc_end 1945-09-30 07:00:00 (Sun)
  61366269600, #  local_start 1945-08-14 18:00:00 (Tue)
  61370272800, #    local_end 1945-09-30 02:00:00 (Sun)
  -18000,
  1,
  'CPT',
      ],
      [
  61370290800, #    utc_start 1945-09-30 07:00:00 (Sun)
  62272051200, #      utc_end 1974-04-28 08:00:00 (Sun)
  61370269200, #  local_start 1945-09-30 01:00:00 (Sun)
  62272029600, #    local_end 1974-04-28 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62272051200, #    utc_start 1974-04-28 08:00:00 (Sun)
  62287772400, #      utc_end 1974-10-27 07:00:00 (Sun)
  62272033200, #  local_start 1974-04-28 03:00:00 (Sun)
  62287754400, #    local_end 1974-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62287772400, #    utc_start 1974-10-27 07:00:00 (Sun)
  62303500800, #      utc_end 1975-04-27 08:00:00 (Sun)
  62287750800, #  local_start 1974-10-27 01:00:00 (Sun)
  62303479200, #    local_end 1975-04-27 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62303500800, #    utc_start 1975-04-27 08:00:00 (Sun)
  62319222000, #      utc_end 1975-10-26 07:00:00 (Sun)
  62303482800, #  local_start 1975-04-27 03:00:00 (Sun)
  62319204000, #    local_end 1975-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62319222000, #    utc_start 1975-10-26 07:00:00 (Sun)
  62334950400, #      utc_end 1976-04-25 08:00:00 (Sun)
  62319200400, #  local_start 1975-10-26 01:00:00 (Sun)
  62334928800, #    local_end 1976-04-25 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62334950400, #    utc_start 1976-04-25 08:00:00 (Sun)
  62351276400, #      utc_end 1976-10-31 07:00:00 (Sun)
  62334932400, #  local_start 1976-04-25 03:00:00 (Sun)
  62351258400, #    local_end 1976-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62351276400, #    utc_start 1976-10-31 07:00:00 (Sun)
  62366400000, #      utc_end 1977-04-24 08:00:00 (Sun)
  62351254800, #  local_start 1976-10-31 01:00:00 (Sun)
  62366378400, #    local_end 1977-04-24 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62366400000, #    utc_start 1977-04-24 08:00:00 (Sun)
  62382726000, #      utc_end 1977-10-30 07:00:00 (Sun)
  62366382000, #  local_start 1977-04-24 03:00:00 (Sun)
  62382708000, #    local_end 1977-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62382726000, #    utc_start 1977-10-30 07:00:00 (Sun)
  62398454400, #      utc_end 1978-04-30 08:00:00 (Sun)
  62382704400, #  local_start 1977-10-30 01:00:00 (Sun)
  62398432800, #    local_end 1978-04-30 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62398454400, #    utc_start 1978-04-30 08:00:00 (Sun)
  62414175600, #      utc_end 1978-10-29 07:00:00 (Sun)
  62398436400, #  local_start 1978-04-30 03:00:00 (Sun)
  62414157600, #    local_end 1978-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62414175600, #    utc_start 1978-10-29 07:00:00 (Sun)
  62429904000, #      utc_end 1979-04-29 08:00:00 (Sun)
  62414154000, #  local_start 1978-10-29 01:00:00 (Sun)
  62429882400, #    local_end 1979-04-29 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62429904000, #    utc_start 1979-04-29 08:00:00 (Sun)
  62445625200, #      utc_end 1979-10-28 07:00:00 (Sun)
  62429886000, #  local_start 1979-04-29 03:00:00 (Sun)
  62445607200, #    local_end 1979-10-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62445625200, #    utc_start 1979-10-28 07:00:00 (Sun)
  62461353600, #      utc_end 1980-04-27 08:00:00 (Sun)
  62445603600, #  local_start 1979-10-28 01:00:00 (Sun)
  62461332000, #    local_end 1980-04-27 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62461353600, #    utc_start 1980-04-27 08:00:00 (Sun)
  62477074800, #      utc_end 1980-10-26 07:00:00 (Sun)
  62461335600, #  local_start 1980-04-27 03:00:00 (Sun)
  62477056800, #    local_end 1980-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62477074800, #    utc_start 1980-10-26 07:00:00 (Sun)
  62492803200, #      utc_end 1981-04-26 08:00:00 (Sun)
  62477053200, #  local_start 1980-10-26 01:00:00 (Sun)
  62492781600, #    local_end 1981-04-26 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62492803200, #    utc_start 1981-04-26 08:00:00 (Sun)
  62508524400, #      utc_end 1981-10-25 07:00:00 (Sun)
  62492785200, #  local_start 1981-04-26 03:00:00 (Sun)
  62508506400, #    local_end 1981-10-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62508524400, #    utc_start 1981-10-25 07:00:00 (Sun)
  62524252800, #      utc_end 1982-04-25 08:00:00 (Sun)
  62508502800, #  local_start 1981-10-25 01:00:00 (Sun)
  62524231200, #    local_end 1982-04-25 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62524252800, #    utc_start 1982-04-25 08:00:00 (Sun)
  62540578800, #      utc_end 1982-10-31 07:00:00 (Sun)
  62524234800, #  local_start 1982-04-25 03:00:00 (Sun)
  62540560800, #    local_end 1982-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62540578800, #    utc_start 1982-10-31 07:00:00 (Sun)
  62555702400, #      utc_end 1983-04-24 08:00:00 (Sun)
  62540557200, #  local_start 1982-10-31 01:00:00 (Sun)
  62555680800, #    local_end 1983-04-24 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62555702400, #    utc_start 1983-04-24 08:00:00 (Sun)
  62572028400, #      utc_end 1983-10-30 07:00:00 (Sun)
  62555684400, #  local_start 1983-04-24 03:00:00 (Sun)
  62572010400, #    local_end 1983-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62572028400, #    utc_start 1983-10-30 07:00:00 (Sun)
  62587756800, #      utc_end 1984-04-29 08:00:00 (Sun)
  62572006800, #  local_start 1983-10-30 01:00:00 (Sun)
  62587735200, #    local_end 1984-04-29 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62587756800, #    utc_start 1984-04-29 08:00:00 (Sun)
  62603478000, #      utc_end 1984-10-28 07:00:00 (Sun)
  62587738800, #  local_start 1984-04-29 03:00:00 (Sun)
  62603460000, #    local_end 1984-10-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62603478000, #    utc_start 1984-10-28 07:00:00 (Sun)
  62619206400, #      utc_end 1985-04-28 08:00:00 (Sun)
  62603456400, #  local_start 1984-10-28 01:00:00 (Sun)
  62619184800, #    local_end 1985-04-28 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62619206400, #    utc_start 1985-04-28 08:00:00 (Sun)
  62634927600, #      utc_end 1985-10-27 07:00:00 (Sun)
  62619188400, #  local_start 1985-04-28 03:00:00 (Sun)
  62634909600, #    local_end 1985-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62634927600, #    utc_start 1985-10-27 07:00:00 (Sun)
  62650656000, #      utc_end 1986-04-27 08:00:00 (Sun)
  62634906000, #  local_start 1985-10-27 01:00:00 (Sun)
  62650634400, #    local_end 1986-04-27 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62650656000, #    utc_start 1986-04-27 08:00:00 (Sun)
  62666377200, #      utc_end 1986-10-26 07:00:00 (Sun)
  62650638000, #  local_start 1986-04-27 03:00:00 (Sun)
  62666359200, #    local_end 1986-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62666377200, #    utc_start 1986-10-26 07:00:00 (Sun)
  62680291200, #      utc_end 1987-04-05 08:00:00 (Sun)
  62666355600, #  local_start 1986-10-26 01:00:00 (Sun)
  62680269600, #    local_end 1987-04-05 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62680291200, #    utc_start 1987-04-05 08:00:00 (Sun)
  62697826800, #      utc_end 1987-10-25 07:00:00 (Sun)
  62680273200, #  local_start 1987-04-05 03:00:00 (Sun)
  62697808800, #    local_end 1987-10-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62697826800, #    utc_start 1987-10-25 07:00:00 (Sun)
  62711740800, #      utc_end 1988-04-03 08:00:00 (Sun)
  62697805200, #  local_start 1987-10-25 01:00:00 (Sun)
  62711719200, #    local_end 1988-04-03 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62711740800, #    utc_start 1988-04-03 08:00:00 (Sun)
  62729881200, #      utc_end 1988-10-30 07:00:00 (Sun)
  62711722800, #  local_start 1988-04-03 03:00:00 (Sun)
  62729863200, #    local_end 1988-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62729881200, #    utc_start 1988-10-30 07:00:00 (Sun)
  62743190400, #      utc_end 1989-04-02 08:00:00 (Sun)
  62729859600, #  local_start 1988-10-30 01:00:00 (Sun)
  62743168800, #    local_end 1989-04-02 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62743190400, #    utc_start 1989-04-02 08:00:00 (Sun)
  62761330800, #      utc_end 1989-10-29 07:00:00 (Sun)
  62743172400, #  local_start 1989-04-02 03:00:00 (Sun)
  62761312800, #    local_end 1989-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62761330800, #    utc_start 1989-10-29 07:00:00 (Sun)
  62774640000, #      utc_end 1990-04-01 08:00:00 (Sun)
  62761309200, #  local_start 1989-10-29 01:00:00 (Sun)
  62774618400, #    local_end 1990-04-01 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62774640000, #    utc_start 1990-04-01 08:00:00 (Sun)
  62792780400, #      utc_end 1990-10-28 07:00:00 (Sun)
  62774622000, #  local_start 1990-04-01 03:00:00 (Sun)
  62792762400, #    local_end 1990-10-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62792780400, #    utc_start 1990-10-28 07:00:00 (Sun)
  62806694400, #      utc_end 1991-04-07 08:00:00 (Sun)
  62792758800, #  local_start 1990-10-28 01:00:00 (Sun)
  62806672800, #    local_end 1991-04-07 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62806694400, #    utc_start 1991-04-07 08:00:00 (Sun)
  62824230000, #      utc_end 1991-10-27 07:00:00 (Sun)
  62806676400, #  local_start 1991-04-07 03:00:00 (Sun)
  62824212000, #    local_end 1991-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62824230000, #    utc_start 1991-10-27 07:00:00 (Sun)
  62838144000, #      utc_end 1992-04-05 08:00:00 (Sun)
  62824208400, #  local_start 1991-10-27 01:00:00 (Sun)
  62838122400, #    local_end 1992-04-05 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62838144000, #    utc_start 1992-04-05 08:00:00 (Sun)
  62855679600, #      utc_end 1992-10-25 07:00:00 (Sun)
  62838126000, #  local_start 1992-04-05 03:00:00 (Sun)
  62855661600, #    local_end 1992-10-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62855679600, #    utc_start 1992-10-25 07:00:00 (Sun)
  62869593600, #      utc_end 1993-04-04 08:00:00 (Sun)
  62855658000, #  local_start 1992-10-25 01:00:00 (Sun)
  62869572000, #    local_end 1993-04-04 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62869593600, #    utc_start 1993-04-04 08:00:00 (Sun)
  62887734000, #      utc_end 1993-10-31 07:00:00 (Sun)
  62869575600, #  local_start 1993-04-04 03:00:00 (Sun)
  62887716000, #    local_end 1993-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62887734000, #    utc_start 1993-10-31 07:00:00 (Sun)
  62901043200, #      utc_end 1994-04-03 08:00:00 (Sun)
  62887712400, #  local_start 1993-10-31 01:00:00 (Sun)
  62901021600, #    local_end 1994-04-03 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62901043200, #    utc_start 1994-04-03 08:00:00 (Sun)
  62919183600, #      utc_end 1994-10-30 07:00:00 (Sun)
  62901025200, #  local_start 1994-04-03 03:00:00 (Sun)
  62919165600, #    local_end 1994-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62919183600, #    utc_start 1994-10-30 07:00:00 (Sun)
  62932492800, #      utc_end 1995-04-02 08:00:00 (Sun)
  62919162000, #  local_start 1994-10-30 01:00:00 (Sun)
  62932471200, #    local_end 1995-04-02 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62932492800, #    utc_start 1995-04-02 08:00:00 (Sun)
  62950633200, #      utc_end 1995-10-29 07:00:00 (Sun)
  62932474800, #  local_start 1995-04-02 03:00:00 (Sun)
  62950615200, #    local_end 1995-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62950633200, #    utc_start 1995-10-29 07:00:00 (Sun)
  62964547200, #      utc_end 1996-04-07 08:00:00 (Sun)
  62950611600, #  local_start 1995-10-29 01:00:00 (Sun)
  62964525600, #    local_end 1996-04-07 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62964547200, #    utc_start 1996-04-07 08:00:00 (Sun)
  62982082800, #      utc_end 1996-10-27 07:00:00 (Sun)
  62964529200, #  local_start 1996-04-07 03:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62982082800, #    utc_start 1996-10-27 07:00:00 (Sun)
  62995996800, #      utc_end 1997-04-06 08:00:00 (Sun)
  62982061200, #  local_start 1996-10-27 01:00:00 (Sun)
  62995975200, #    local_end 1997-04-06 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62995996800, #    utc_start 1997-04-06 08:00:00 (Sun)
  63013532400, #      utc_end 1997-10-26 07:00:00 (Sun)
  62995978800, #  local_start 1997-04-06 03:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63013532400, #    utc_start 1997-10-26 07:00:00 (Sun)
  63027446400, #      utc_end 1998-04-05 08:00:00 (Sun)
  63013510800, #  local_start 1997-10-26 01:00:00 (Sun)
  63027424800, #    local_end 1998-04-05 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63027446400, #    utc_start 1998-04-05 08:00:00 (Sun)
  63044982000, #      utc_end 1998-10-25 07:00:00 (Sun)
  63027428400, #  local_start 1998-04-05 03:00:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63044982000, #    utc_start 1998-10-25 07:00:00 (Sun)
  63058896000, #      utc_end 1999-04-04 08:00:00 (Sun)
  63044960400, #  local_start 1998-10-25 01:00:00 (Sun)
  63058874400, #    local_end 1999-04-04 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63058896000, #    utc_start 1999-04-04 08:00:00 (Sun)
  63077036400, #      utc_end 1999-10-31 07:00:00 (Sun)
  63058878000, #  local_start 1999-04-04 03:00:00 (Sun)
  63077018400, #    local_end 1999-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63077036400, #    utc_start 1999-10-31 07:00:00 (Sun)
  63090345600, #      utc_end 2000-04-02 08:00:00 (Sun)
  63077014800, #  local_start 1999-10-31 01:00:00 (Sun)
  63090324000, #    local_end 2000-04-02 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63090345600, #    utc_start 2000-04-02 08:00:00 (Sun)
  63108486000, #      utc_end 2000-10-29 07:00:00 (Sun)
  63090327600, #  local_start 2000-04-02 03:00:00 (Sun)
  63108468000, #    local_end 2000-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63108486000, #    utc_start 2000-10-29 07:00:00 (Sun)
  63121795200, #      utc_end 2001-04-01 08:00:00 (Sun)
  63108464400, #  local_start 2000-10-29 01:00:00 (Sun)
  63121773600, #    local_end 2001-04-01 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63121795200, #    utc_start 2001-04-01 08:00:00 (Sun)
  63139935600, #      utc_end 2001-10-28 07:00:00 (Sun)
  63121777200, #  local_start 2001-04-01 03:00:00 (Sun)
  63139917600, #    local_end 2001-10-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63139935600, #    utc_start 2001-10-28 07:00:00 (Sun)
  63153849600, #      utc_end 2002-04-07 08:00:00 (Sun)
  63139914000, #  local_start 2001-10-28 01:00:00 (Sun)
  63153828000, #    local_end 2002-04-07 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63153849600, #    utc_start 2002-04-07 08:00:00 (Sun)
  63171385200, #      utc_end 2002-10-27 07:00:00 (Sun)
  63153831600, #  local_start 2002-04-07 03:00:00 (Sun)
  63171367200, #    local_end 2002-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63171385200, #    utc_start 2002-10-27 07:00:00 (Sun)
  63185299200, #      utc_end 2003-04-06 08:00:00 (Sun)
  63171363600, #  local_start 2002-10-27 01:00:00 (Sun)
  63185277600, #    local_end 2003-04-06 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63185299200, #    utc_start 2003-04-06 08:00:00 (Sun)
  63202834800, #      utc_end 2003-10-26 07:00:00 (Sun)
  63185281200, #  local_start 2003-04-06 03:00:00 (Sun)
  63202816800, #    local_end 2003-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63202834800, #    utc_start 2003-10-26 07:00:00 (Sun)
  63216748800, #      utc_end 2004-04-04 08:00:00 (Sun)
  63202813200, #  local_start 2003-10-26 01:00:00 (Sun)
  63216727200, #    local_end 2004-04-04 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63216748800, #    utc_start 2004-04-04 08:00:00 (Sun)
  63234889200, #      utc_end 2004-10-31 07:00:00 (Sun)
  63216730800, #  local_start 2004-04-04 03:00:00 (Sun)
  63234871200, #    local_end 2004-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63234889200, #    utc_start 2004-10-31 07:00:00 (Sun)
  63248198400, #      utc_end 2005-04-03 08:00:00 (Sun)
  63234867600, #  local_start 2004-10-31 01:00:00 (Sun)
  63248176800, #    local_end 2005-04-03 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63248198400, #    utc_start 2005-04-03 08:00:00 (Sun)
  63266338800, #      utc_end 2005-10-30 07:00:00 (Sun)
  63248180400, #  local_start 2005-04-03 03:00:00 (Sun)
  63266320800, #    local_end 2005-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63266338800, #    utc_start 2005-10-30 07:00:00 (Sun)
  63279648000, #      utc_end 2006-04-02 08:00:00 (Sun)
  63266317200, #  local_start 2005-10-30 01:00:00 (Sun)
  63279626400, #    local_end 2006-04-02 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63279648000, #    utc_start 2006-04-02 08:00:00 (Sun)
  63297788400, #      utc_end 2006-10-29 07:00:00 (Sun)
  63279630000, #  local_start 2006-04-02 03:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63297788400, #    utc_start 2006-10-29 07:00:00 (Sun)
  63309283200, #      utc_end 2007-03-11 08:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63309261600, #    local_end 2007-03-11 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63309283200, #    utc_start 2007-03-11 08:00:00 (Sun)
  63329842800, #      utc_end 2007-11-04 07:00:00 (Sun)
  63309265200, #  local_start 2007-03-11 03:00:00 (Sun)
  63329824800, #    local_end 2007-11-04 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63329842800, #    utc_start 2007-11-04 07:00:00 (Sun)
  63340732800, #      utc_end 2008-03-09 08:00:00 (Sun)
  63329821200, #  local_start 2007-11-04 01:00:00 (Sun)
  63340711200, #    local_end 2008-03-09 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63340732800, #    utc_start 2008-03-09 08:00:00 (Sun)
  63361292400, #      utc_end 2008-11-02 07:00:00 (Sun)
  63340714800, #  local_start 2008-03-09 03:00:00 (Sun)
  63361274400, #    local_end 2008-11-02 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63361292400, #    utc_start 2008-11-02 07:00:00 (Sun)
  63372182400, #      utc_end 2009-03-08 08:00:00 (Sun)
  63361270800, #  local_start 2008-11-02 01:00:00 (Sun)
  63372160800, #    local_end 2009-03-08 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63372182400, #    utc_start 2009-03-08 08:00:00 (Sun)
  63392742000, #      utc_end 2009-11-01 07:00:00 (Sun)
  63372164400, #  local_start 2009-03-08 03:00:00 (Sun)
  63392724000, #    local_end 2009-11-01 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63392742000, #    utc_start 2009-11-01 07:00:00 (Sun)
  63404236800, #      utc_end 2010-03-14 08:00:00 (Sun)
  63392720400, #  local_start 2009-11-01 01:00:00 (Sun)
  63404215200, #    local_end 2010-03-14 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63404236800, #    utc_start 2010-03-14 08:00:00 (Sun)
  63424796400, #      utc_end 2010-11-07 07:00:00 (Sun)
  63404218800, #  local_start 2010-03-14 03:00:00 (Sun)
  63424778400, #    local_end 2010-11-07 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63424796400, #    utc_start 2010-11-07 07:00:00 (Sun)
  63435686400, #      utc_end 2011-03-13 08:00:00 (Sun)
  63424774800, #  local_start 2010-11-07 01:00:00 (Sun)
  63435664800, #    local_end 2011-03-13 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63435686400, #    utc_start 2011-03-13 08:00:00 (Sun)
  63456246000, #      utc_end 2011-11-06 07:00:00 (Sun)
  63435668400, #  local_start 2011-03-13 03:00:00 (Sun)
  63456228000, #    local_end 2011-11-06 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63456246000, #    utc_start 2011-11-06 07:00:00 (Sun)
  63467136000, #      utc_end 2012-03-11 08:00:00 (Sun)
  63456224400, #  local_start 2011-11-06 01:00:00 (Sun)
  63467114400, #    local_end 2012-03-11 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63467136000, #    utc_start 2012-03-11 08:00:00 (Sun)
  63487695600, #      utc_end 2012-11-04 07:00:00 (Sun)
  63467118000, #  local_start 2012-03-11 03:00:00 (Sun)
  63487677600, #    local_end 2012-11-04 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63487695600, #    utc_start 2012-11-04 07:00:00 (Sun)
  63498585600, #      utc_end 2013-03-10 08:00:00 (Sun)
  63487674000, #  local_start 2012-11-04 01:00:00 (Sun)
  63498564000, #    local_end 2013-03-10 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63498585600, #    utc_start 2013-03-10 08:00:00 (Sun)
  63519145200, #      utc_end 2013-11-03 07:00:00 (Sun)
  63498567600, #  local_start 2013-03-10 03:00:00 (Sun)
  63519127200, #    local_end 2013-11-03 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63519145200, #    utc_start 2013-11-03 07:00:00 (Sun)
  63530035200, #      utc_end 2014-03-09 08:00:00 (Sun)
  63519123600, #  local_start 2013-11-03 01:00:00 (Sun)
  63530013600, #    local_end 2014-03-09 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63530035200, #    utc_start 2014-03-09 08:00:00 (Sun)
  63550594800, #      utc_end 2014-11-02 07:00:00 (Sun)
  63530017200, #  local_start 2014-03-09 03:00:00 (Sun)
  63550576800, #    local_end 2014-11-02 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63550594800, #    utc_start 2014-11-02 07:00:00 (Sun)
  63561484800, #      utc_end 2015-03-08 08:00:00 (Sun)
  63550573200, #  local_start 2014-11-02 01:00:00 (Sun)
  63561463200, #    local_end 2015-03-08 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63561484800, #    utc_start 2015-03-08 08:00:00 (Sun)
  63582044400, #      utc_end 2015-11-01 07:00:00 (Sun)
  63561466800, #  local_start 2015-03-08 03:00:00 (Sun)
  63582026400, #    local_end 2015-11-01 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63582044400, #    utc_start 2015-11-01 07:00:00 (Sun)
  63593539200, #      utc_end 2016-03-13 08:00:00 (Sun)
  63582022800, #  local_start 2015-11-01 01:00:00 (Sun)
  63593517600, #    local_end 2016-03-13 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63593539200, #    utc_start 2016-03-13 08:00:00 (Sun)
  63614098800, #      utc_end 2016-11-06 07:00:00 (Sun)
  63593521200, #  local_start 2016-03-13 03:00:00 (Sun)
  63614080800, #    local_end 2016-11-06 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63614098800, #    utc_start 2016-11-06 07:00:00 (Sun)
  63624988800, #      utc_end 2017-03-12 08:00:00 (Sun)
  63614077200, #  local_start 2016-11-06 01:00:00 (Sun)
  63624967200, #    local_end 2017-03-12 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63624988800, #    utc_start 2017-03-12 08:00:00 (Sun)
  63645548400, #      utc_end 2017-11-05 07:00:00 (Sun)
  63624970800, #  local_start 2017-03-12 03:00:00 (Sun)
  63645530400, #    local_end 2017-11-05 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63645548400, #    utc_start 2017-11-05 07:00:00 (Sun)
  63656438400, #      utc_end 2018-03-11 08:00:00 (Sun)
  63645526800, #  local_start 2017-11-05 01:00:00 (Sun)
  63656416800, #    local_end 2018-03-11 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63656438400, #    utc_start 2018-03-11 08:00:00 (Sun)
  63676998000, #      utc_end 2018-11-04 07:00:00 (Sun)
  63656420400, #  local_start 2018-03-11 03:00:00 (Sun)
  63676980000, #    local_end 2018-11-04 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63676998000, #    utc_start 2018-11-04 07:00:00 (Sun)
  63687888000, #      utc_end 2019-03-10 08:00:00 (Sun)
  63676976400, #  local_start 2018-11-04 01:00:00 (Sun)
  63687866400, #    local_end 2019-03-10 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63687888000, #    utc_start 2019-03-10 08:00:00 (Sun)
  63708447600, #      utc_end 2019-11-03 07:00:00 (Sun)
  63687870000, #  local_start 2019-03-10 03:00:00 (Sun)
  63708429600, #    local_end 2019-11-03 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63708447600, #    utc_start 2019-11-03 07:00:00 (Sun)
  63719337600, #      utc_end 2020-03-08 08:00:00 (Sun)
  63708426000, #  local_start 2019-11-03 01:00:00 (Sun)
  63719316000, #    local_end 2020-03-08 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63719337600, #    utc_start 2020-03-08 08:00:00 (Sun)
  63739897200, #      utc_end 2020-11-01 07:00:00 (Sun)
  63719319600, #  local_start 2020-03-08 03:00:00 (Sun)
  63739879200, #    local_end 2020-11-01 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63739897200, #    utc_start 2020-11-01 07:00:00 (Sun)
  63751392000, #      utc_end 2021-03-14 08:00:00 (Sun)
  63739875600, #  local_start 2020-11-01 01:00:00 (Sun)
  63751370400, #    local_end 2021-03-14 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63751392000, #    utc_start 2021-03-14 08:00:00 (Sun)
  63771951600, #      utc_end 2021-11-07 07:00:00 (Sun)
  63751374000, #  local_start 2021-03-14 03:00:00 (Sun)
  63771933600, #    local_end 2021-11-07 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63771951600, #    utc_start 2021-11-07 07:00:00 (Sun)
  63782841600, #      utc_end 2022-03-13 08:00:00 (Sun)
  63771930000, #  local_start 2021-11-07 01:00:00 (Sun)
  63782820000, #    local_end 2022-03-13 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63782841600, #    utc_start 2022-03-13 08:00:00 (Sun)
  63803401200, #      utc_end 2022-11-06 07:00:00 (Sun)
  63782823600, #  local_start 2022-03-13 03:00:00 (Sun)
  63803383200, #    local_end 2022-11-06 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63803401200, #    utc_start 2022-11-06 07:00:00 (Sun)
  63814291200, #      utc_end 2023-03-12 08:00:00 (Sun)
  63803379600, #  local_start 2022-11-06 01:00:00 (Sun)
  63814269600, #    local_end 2023-03-12 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63814291200, #    utc_start 2023-03-12 08:00:00 (Sun)
  63834850800, #      utc_end 2023-11-05 07:00:00 (Sun)
  63814273200, #  local_start 2023-03-12 03:00:00 (Sun)
  63834832800, #    local_end 2023-11-05 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63834850800, #    utc_start 2023-11-05 07:00:00 (Sun)
  63845740800, #      utc_end 2024-03-10 08:00:00 (Sun)
  63834829200, #  local_start 2023-11-05 01:00:00 (Sun)
  63845719200, #    local_end 2024-03-10 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63845740800, #    utc_start 2024-03-10 08:00:00 (Sun)
  63866300400, #      utc_end 2024-11-03 07:00:00 (Sun)
  63845722800, #  local_start 2024-03-10 03:00:00 (Sun)
  63866282400, #    local_end 2024-11-03 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63866300400, #    utc_start 2024-11-03 07:00:00 (Sun)
  63877190400, #      utc_end 2025-03-09 08:00:00 (Sun)
  63866278800, #  local_start 2024-11-03 01:00:00 (Sun)
  63877168800, #    local_end 2025-03-09 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63877190400, #    utc_start 2025-03-09 08:00:00 (Sun)
  63897750000, #      utc_end 2025-11-02 07:00:00 (Sun)
  63877172400, #  local_start 2025-03-09 03:00:00 (Sun)
  63897732000, #    local_end 2025-11-02 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63897750000, #    utc_start 2025-11-02 07:00:00 (Sun)
  63908640000, #      utc_end 2026-03-08 08:00:00 (Sun)
  63897728400, #  local_start 2025-11-02 01:00:00 (Sun)
  63908618400, #    local_end 2026-03-08 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63908640000, #    utc_start 2026-03-08 08:00:00 (Sun)
  63929199600, #      utc_end 2026-11-01 07:00:00 (Sun)
  63908622000, #  local_start 2026-03-08 03:00:00 (Sun)
  63929181600, #    local_end 2026-11-01 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63929199600, #    utc_start 2026-11-01 07:00:00 (Sun)
  63940694400, #      utc_end 2027-03-14 08:00:00 (Sun)
  63929178000, #  local_start 2026-11-01 01:00:00 (Sun)
  63940672800, #    local_end 2027-03-14 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63940694400, #    utc_start 2027-03-14 08:00:00 (Sun)
  63961254000, #      utc_end 2027-11-07 07:00:00 (Sun)
  63940676400, #  local_start 2027-03-14 03:00:00 (Sun)
  63961236000, #    local_end 2027-11-07 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63961254000, #    utc_start 2027-11-07 07:00:00 (Sun)
  63972144000, #      utc_end 2028-03-12 08:00:00 (Sun)
  63961232400, #  local_start 2027-11-07 01:00:00 (Sun)
  63972122400, #    local_end 2028-03-12 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63972144000, #    utc_start 2028-03-12 08:00:00 (Sun)
  63992703600, #      utc_end 2028-11-05 07:00:00 (Sun)
  63972126000, #  local_start 2028-03-12 03:00:00 (Sun)
  63992685600, #    local_end 2028-11-05 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63992703600, #    utc_start 2028-11-05 07:00:00 (Sun)
  64003593600, #      utc_end 2029-03-11 08:00:00 (Sun)
  63992682000, #  local_start 2028-11-05 01:00:00 (Sun)
  64003572000, #    local_end 2029-03-11 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  64003593600, #    utc_start 2029-03-11 08:00:00 (Sun)
  64024153200, #      utc_end 2029-11-04 07:00:00 (Sun)
  64003575600, #  local_start 2029-03-11 03:00:00 (Sun)
  64024135200, #    local_end 2029-11-04 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  64024153200, #    utc_start 2029-11-04 07:00:00 (Sun)
  64035043200, #      utc_end 2030-03-10 08:00:00 (Sun)
  64024131600, #  local_start 2029-11-04 01:00:00 (Sun)
  64035021600, #    local_end 2030-03-10 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  64035043200, #    utc_start 2030-03-10 08:00:00 (Sun)
  64055602800, #      utc_end 2030-11-03 07:00:00 (Sun)
  64035025200, #  local_start 2030-03-10 03:00:00 (Sun)
  64055584800, #    local_end 2030-11-03 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {61}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -21600 }
  
  my $last_observance = bless( {
    'format' => 'C%sT',
    'gmtoff' => '-6:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 708975,
      'local_rd_secs' => 10800,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 708975,
      'utc_rd_secs' => 10800,
      'utc_year' => 1943
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -21600,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 708975,
      'local_rd_secs' => 28800,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 708975,
      'utc_rd_secs' => 28800,
      'utc_year' => 1943
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Nov',
      'letter' => 'S',
      'name' => 'Canada',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Mar',
      'letter' => 'D',
      'name' => 'Canada',
      'offset_from_std' => 3600,
      'on' => 'Sun>=8',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_RAINY_RIVER

    $main::fatpacked{"DateTime/TimeZone/America/Rankin_Inlet.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_RANKIN_INLET';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Rankin_Inlet;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Rankin_Inlet::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  61725456000, #      utc_end 1957-01-01 00:00:00 (Tue)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  61725456000, #    local_end 1957-01-01 00:00:00 (Tue)
  0,
  0,
  '-00',
      ],
      [
  61725456000, #    utc_start 1957-01-01 00:00:00 (Tue)
  61987788000, #      utc_end 1965-04-25 06:00:00 (Sun)
  61725434400, #  local_start 1956-12-31 18:00:00 (Mon)
  61987766400, #    local_end 1965-04-25 00:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61987788000, #    utc_start 1965-04-25 06:00:00 (Sun)
  62004117600, #      utc_end 1965-10-31 06:00:00 (Sun)
  61987773600, #  local_start 1965-04-25 02:00:00 (Sun)
  62004103200, #    local_end 1965-10-31 02:00:00 (Sun)
  -14400,
  1,
  'CDDT',
      ],
      [
  62004117600, #    utc_start 1965-10-31 06:00:00 (Sun)
  62461353600, #      utc_end 1980-04-27 08:00:00 (Sun)
  62004096000, #  local_start 1965-10-31 00:00:00 (Sun)
  62461332000, #    local_end 1980-04-27 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62461353600, #    utc_start 1980-04-27 08:00:00 (Sun)
  62477074800, #      utc_end 1980-10-26 07:00:00 (Sun)
  62461335600, #  local_start 1980-04-27 03:00:00 (Sun)
  62477056800, #    local_end 1980-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62477074800, #    utc_start 1980-10-26 07:00:00 (Sun)
  62492803200, #      utc_end 1981-04-26 08:00:00 (Sun)
  62477053200, #  local_start 1980-10-26 01:00:00 (Sun)
  62492781600, #    local_end 1981-04-26 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62492803200, #    utc_start 1981-04-26 08:00:00 (Sun)
  62508524400, #      utc_end 1981-10-25 07:00:00 (Sun)
  62492785200, #  local_start 1981-04-26 03:00:00 (Sun)
  62508506400, #    local_end 1981-10-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62508524400, #    utc_start 1981-10-25 07:00:00 (Sun)
  62524252800, #      utc_end 1982-04-25 08:00:00 (Sun)
  62508502800, #  local_start 1981-10-25 01:00:00 (Sun)
  62524231200, #    local_end 1982-04-25 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62524252800, #    utc_start 1982-04-25 08:00:00 (Sun)
  62540578800, #      utc_end 1982-10-31 07:00:00 (Sun)
  62524234800, #  local_start 1982-04-25 03:00:00 (Sun)
  62540560800, #    local_end 1982-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62540578800, #    utc_start 1982-10-31 07:00:00 (Sun)
  62555702400, #      utc_end 1983-04-24 08:00:00 (Sun)
  62540557200, #  local_start 1982-10-31 01:00:00 (Sun)
  62555680800, #    local_end 1983-04-24 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62555702400, #    utc_start 1983-04-24 08:00:00 (Sun)
  62572028400, #      utc_end 1983-10-30 07:00:00 (Sun)
  62555684400, #  local_start 1983-04-24 03:00:00 (Sun)
  62572010400, #    local_end 1983-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62572028400, #    utc_start 1983-10-30 07:00:00 (Sun)
  62587756800, #      utc_end 1984-04-29 08:00:00 (Sun)
  62572006800, #  local_start 1983-10-30 01:00:00 (Sun)
  62587735200, #    local_end 1984-04-29 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62587756800, #    utc_start 1984-04-29 08:00:00 (Sun)
  62603478000, #      utc_end 1984-10-28 07:00:00 (Sun)
  62587738800, #  local_start 1984-04-29 03:00:00 (Sun)
  62603460000, #    local_end 1984-10-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62603478000, #    utc_start 1984-10-28 07:00:00 (Sun)
  62619206400, #      utc_end 1985-04-28 08:00:00 (Sun)
  62603456400, #  local_start 1984-10-28 01:00:00 (Sun)
  62619184800, #    local_end 1985-04-28 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62619206400, #    utc_start 1985-04-28 08:00:00 (Sun)
  62634927600, #      utc_end 1985-10-27 07:00:00 (Sun)
  62619188400, #  local_start 1985-04-28 03:00:00 (Sun)
  62634909600, #    local_end 1985-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62634927600, #    utc_start 1985-10-27 07:00:00 (Sun)
  62650656000, #      utc_end 1986-04-27 08:00:00 (Sun)
  62634906000, #  local_start 1985-10-27 01:00:00 (Sun)
  62650634400, #    local_end 1986-04-27 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62650656000, #    utc_start 1986-04-27 08:00:00 (Sun)
  62666377200, #      utc_end 1986-10-26 07:00:00 (Sun)
  62650638000, #  local_start 1986-04-27 03:00:00 (Sun)
  62666359200, #    local_end 1986-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62666377200, #    utc_start 1986-10-26 07:00:00 (Sun)
  62680291200, #      utc_end 1987-04-05 08:00:00 (Sun)
  62666355600, #  local_start 1986-10-26 01:00:00 (Sun)
  62680269600, #    local_end 1987-04-05 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62680291200, #    utc_start 1987-04-05 08:00:00 (Sun)
  62697826800, #      utc_end 1987-10-25 07:00:00 (Sun)
  62680273200, #  local_start 1987-04-05 03:00:00 (Sun)
  62697808800, #    local_end 1987-10-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62697826800, #    utc_start 1987-10-25 07:00:00 (Sun)
  62711740800, #      utc_end 1988-04-03 08:00:00 (Sun)
  62697805200, #  local_start 1987-10-25 01:00:00 (Sun)
  62711719200, #    local_end 1988-04-03 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62711740800, #    utc_start 1988-04-03 08:00:00 (Sun)
  62729881200, #      utc_end 1988-10-30 07:00:00 (Sun)
  62711722800, #  local_start 1988-04-03 03:00:00 (Sun)
  62729863200, #    local_end 1988-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62729881200, #    utc_start 1988-10-30 07:00:00 (Sun)
  62743190400, #      utc_end 1989-04-02 08:00:00 (Sun)
  62729859600, #  local_start 1988-10-30 01:00:00 (Sun)
  62743168800, #    local_end 1989-04-02 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62743190400, #    utc_start 1989-04-02 08:00:00 (Sun)
  62761330800, #      utc_end 1989-10-29 07:00:00 (Sun)
  62743172400, #  local_start 1989-04-02 03:00:00 (Sun)
  62761312800, #    local_end 1989-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62761330800, #    utc_start 1989-10-29 07:00:00 (Sun)
  62774640000, #      utc_end 1990-04-01 08:00:00 (Sun)
  62761309200, #  local_start 1989-10-29 01:00:00 (Sun)
  62774618400, #    local_end 1990-04-01 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62774640000, #    utc_start 1990-04-01 08:00:00 (Sun)
  62792780400, #      utc_end 1990-10-28 07:00:00 (Sun)
  62774622000, #  local_start 1990-04-01 03:00:00 (Sun)
  62792762400, #    local_end 1990-10-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62792780400, #    utc_start 1990-10-28 07:00:00 (Sun)
  62806694400, #      utc_end 1991-04-07 08:00:00 (Sun)
  62792758800, #  local_start 1990-10-28 01:00:00 (Sun)
  62806672800, #    local_end 1991-04-07 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62806694400, #    utc_start 1991-04-07 08:00:00 (Sun)
  62824230000, #      utc_end 1991-10-27 07:00:00 (Sun)
  62806676400, #  local_start 1991-04-07 03:00:00 (Sun)
  62824212000, #    local_end 1991-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62824230000, #    utc_start 1991-10-27 07:00:00 (Sun)
  62838144000, #      utc_end 1992-04-05 08:00:00 (Sun)
  62824208400, #  local_start 1991-10-27 01:00:00 (Sun)
  62838122400, #    local_end 1992-04-05 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62838144000, #    utc_start 1992-04-05 08:00:00 (Sun)
  62855679600, #      utc_end 1992-10-25 07:00:00 (Sun)
  62838126000, #  local_start 1992-04-05 03:00:00 (Sun)
  62855661600, #    local_end 1992-10-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62855679600, #    utc_start 1992-10-25 07:00:00 (Sun)
  62869593600, #      utc_end 1993-04-04 08:00:00 (Sun)
  62855658000, #  local_start 1992-10-25 01:00:00 (Sun)
  62869572000, #    local_end 1993-04-04 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62869593600, #    utc_start 1993-04-04 08:00:00 (Sun)
  62887734000, #      utc_end 1993-10-31 07:00:00 (Sun)
  62869575600, #  local_start 1993-04-04 03:00:00 (Sun)
  62887716000, #    local_end 1993-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62887734000, #    utc_start 1993-10-31 07:00:00 (Sun)
  62901043200, #      utc_end 1994-04-03 08:00:00 (Sun)
  62887712400, #  local_start 1993-10-31 01:00:00 (Sun)
  62901021600, #    local_end 1994-04-03 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62901043200, #    utc_start 1994-04-03 08:00:00 (Sun)
  62919183600, #      utc_end 1994-10-30 07:00:00 (Sun)
  62901025200, #  local_start 1994-04-03 03:00:00 (Sun)
  62919165600, #    local_end 1994-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62919183600, #    utc_start 1994-10-30 07:00:00 (Sun)
  62932492800, #      utc_end 1995-04-02 08:00:00 (Sun)
  62919162000, #  local_start 1994-10-30 01:00:00 (Sun)
  62932471200, #    local_end 1995-04-02 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62932492800, #    utc_start 1995-04-02 08:00:00 (Sun)
  62950633200, #      utc_end 1995-10-29 07:00:00 (Sun)
  62932474800, #  local_start 1995-04-02 03:00:00 (Sun)
  62950615200, #    local_end 1995-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62950633200, #    utc_start 1995-10-29 07:00:00 (Sun)
  62964547200, #      utc_end 1996-04-07 08:00:00 (Sun)
  62950611600, #  local_start 1995-10-29 01:00:00 (Sun)
  62964525600, #    local_end 1996-04-07 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62964547200, #    utc_start 1996-04-07 08:00:00 (Sun)
  62982082800, #      utc_end 1996-10-27 07:00:00 (Sun)
  62964529200, #  local_start 1996-04-07 03:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62982082800, #    utc_start 1996-10-27 07:00:00 (Sun)
  62995996800, #      utc_end 1997-04-06 08:00:00 (Sun)
  62982061200, #  local_start 1996-10-27 01:00:00 (Sun)
  62995975200, #    local_end 1997-04-06 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62995996800, #    utc_start 1997-04-06 08:00:00 (Sun)
  63013532400, #      utc_end 1997-10-26 07:00:00 (Sun)
  62995978800, #  local_start 1997-04-06 03:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63013532400, #    utc_start 1997-10-26 07:00:00 (Sun)
  63027446400, #      utc_end 1998-04-05 08:00:00 (Sun)
  63013510800, #  local_start 1997-10-26 01:00:00 (Sun)
  63027424800, #    local_end 1998-04-05 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63027446400, #    utc_start 1998-04-05 08:00:00 (Sun)
  63044982000, #      utc_end 1998-10-25 07:00:00 (Sun)
  63027428400, #  local_start 1998-04-05 03:00:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63044982000, #    utc_start 1998-10-25 07:00:00 (Sun)
  63058896000, #      utc_end 1999-04-04 08:00:00 (Sun)
  63044960400, #  local_start 1998-10-25 01:00:00 (Sun)
  63058874400, #    local_end 1999-04-04 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63058896000, #    utc_start 1999-04-04 08:00:00 (Sun)
  63077036400, #      utc_end 1999-10-31 07:00:00 (Sun)
  63058878000, #  local_start 1999-04-04 03:00:00 (Sun)
  63077018400, #    local_end 1999-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63077036400, #    utc_start 1999-10-31 07:00:00 (Sun)
  63090345600, #      utc_end 2000-04-02 08:00:00 (Sun)
  63077014800, #  local_start 1999-10-31 01:00:00 (Sun)
  63090324000, #    local_end 2000-04-02 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63090345600, #    utc_start 2000-04-02 08:00:00 (Sun)
  63108486000, #      utc_end 2000-10-29 07:00:00 (Sun)
  63090327600, #  local_start 2000-04-02 03:00:00 (Sun)
  63108468000, #    local_end 2000-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63108486000, #    utc_start 2000-10-29 07:00:00 (Sun)
  63121795200, #      utc_end 2001-04-01 08:00:00 (Sun)
  63108468000, #  local_start 2000-10-29 02:00:00 (Sun)
  63121777200, #    local_end 2001-04-01 03:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63121795200, #    utc_start 2001-04-01 08:00:00 (Sun)
  63139935600, #      utc_end 2001-10-28 07:00:00 (Sun)
  63121777200, #  local_start 2001-04-01 03:00:00 (Sun)
  63139917600, #    local_end 2001-10-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63139935600, #    utc_start 2001-10-28 07:00:00 (Sun)
  63153849600, #      utc_end 2002-04-07 08:00:00 (Sun)
  63139914000, #  local_start 2001-10-28 01:00:00 (Sun)
  63153828000, #    local_end 2002-04-07 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63153849600, #    utc_start 2002-04-07 08:00:00 (Sun)
  63171385200, #      utc_end 2002-10-27 07:00:00 (Sun)
  63153831600, #  local_start 2002-04-07 03:00:00 (Sun)
  63171367200, #    local_end 2002-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63171385200, #    utc_start 2002-10-27 07:00:00 (Sun)
  63185299200, #      utc_end 2003-04-06 08:00:00 (Sun)
  63171363600, #  local_start 2002-10-27 01:00:00 (Sun)
  63185277600, #    local_end 2003-04-06 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63185299200, #    utc_start 2003-04-06 08:00:00 (Sun)
  63202834800, #      utc_end 2003-10-26 07:00:00 (Sun)
  63185281200, #  local_start 2003-04-06 03:00:00 (Sun)
  63202816800, #    local_end 2003-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63202834800, #    utc_start 2003-10-26 07:00:00 (Sun)
  63216748800, #      utc_end 2004-04-04 08:00:00 (Sun)
  63202813200, #  local_start 2003-10-26 01:00:00 (Sun)
  63216727200, #    local_end 2004-04-04 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63216748800, #    utc_start 2004-04-04 08:00:00 (Sun)
  63234889200, #      utc_end 2004-10-31 07:00:00 (Sun)
  63216730800, #  local_start 2004-04-04 03:00:00 (Sun)
  63234871200, #    local_end 2004-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63234889200, #    utc_start 2004-10-31 07:00:00 (Sun)
  63248198400, #      utc_end 2005-04-03 08:00:00 (Sun)
  63234867600, #  local_start 2004-10-31 01:00:00 (Sun)
  63248176800, #    local_end 2005-04-03 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63248198400, #    utc_start 2005-04-03 08:00:00 (Sun)
  63266338800, #      utc_end 2005-10-30 07:00:00 (Sun)
  63248180400, #  local_start 2005-04-03 03:00:00 (Sun)
  63266320800, #    local_end 2005-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63266338800, #    utc_start 2005-10-30 07:00:00 (Sun)
  63279648000, #      utc_end 2006-04-02 08:00:00 (Sun)
  63266317200, #  local_start 2005-10-30 01:00:00 (Sun)
  63279626400, #    local_end 2006-04-02 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63279648000, #    utc_start 2006-04-02 08:00:00 (Sun)
  63297788400, #      utc_end 2006-10-29 07:00:00 (Sun)
  63279630000, #  local_start 2006-04-02 03:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63297788400, #    utc_start 2006-10-29 07:00:00 (Sun)
  63309283200, #      utc_end 2007-03-11 08:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63309261600, #    local_end 2007-03-11 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63309283200, #    utc_start 2007-03-11 08:00:00 (Sun)
  63329842800, #      utc_end 2007-11-04 07:00:00 (Sun)
  63309265200, #  local_start 2007-03-11 03:00:00 (Sun)
  63329824800, #    local_end 2007-11-04 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63329842800, #    utc_start 2007-11-04 07:00:00 (Sun)
  63340732800, #      utc_end 2008-03-09 08:00:00 (Sun)
  63329821200, #  local_start 2007-11-04 01:00:00 (Sun)
  63340711200, #    local_end 2008-03-09 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63340732800, #    utc_start 2008-03-09 08:00:00 (Sun)
  63361292400, #      utc_end 2008-11-02 07:00:00 (Sun)
  63340714800, #  local_start 2008-03-09 03:00:00 (Sun)
  63361274400, #    local_end 2008-11-02 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63361292400, #    utc_start 2008-11-02 07:00:00 (Sun)
  63372182400, #      utc_end 2009-03-08 08:00:00 (Sun)
  63361270800, #  local_start 2008-11-02 01:00:00 (Sun)
  63372160800, #    local_end 2009-03-08 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63372182400, #    utc_start 2009-03-08 08:00:00 (Sun)
  63392742000, #      utc_end 2009-11-01 07:00:00 (Sun)
  63372164400, #  local_start 2009-03-08 03:00:00 (Sun)
  63392724000, #    local_end 2009-11-01 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63392742000, #    utc_start 2009-11-01 07:00:00 (Sun)
  63404236800, #      utc_end 2010-03-14 08:00:00 (Sun)
  63392720400, #  local_start 2009-11-01 01:00:00 (Sun)
  63404215200, #    local_end 2010-03-14 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63404236800, #    utc_start 2010-03-14 08:00:00 (Sun)
  63424796400, #      utc_end 2010-11-07 07:00:00 (Sun)
  63404218800, #  local_start 2010-03-14 03:00:00 (Sun)
  63424778400, #    local_end 2010-11-07 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63424796400, #    utc_start 2010-11-07 07:00:00 (Sun)
  63435686400, #      utc_end 2011-03-13 08:00:00 (Sun)
  63424774800, #  local_start 2010-11-07 01:00:00 (Sun)
  63435664800, #    local_end 2011-03-13 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63435686400, #    utc_start 2011-03-13 08:00:00 (Sun)
  63456246000, #      utc_end 2011-11-06 07:00:00 (Sun)
  63435668400, #  local_start 2011-03-13 03:00:00 (Sun)
  63456228000, #    local_end 2011-11-06 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63456246000, #    utc_start 2011-11-06 07:00:00 (Sun)
  63467136000, #      utc_end 2012-03-11 08:00:00 (Sun)
  63456224400, #  local_start 2011-11-06 01:00:00 (Sun)
  63467114400, #    local_end 2012-03-11 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63467136000, #    utc_start 2012-03-11 08:00:00 (Sun)
  63487695600, #      utc_end 2012-11-04 07:00:00 (Sun)
  63467118000, #  local_start 2012-03-11 03:00:00 (Sun)
  63487677600, #    local_end 2012-11-04 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63487695600, #    utc_start 2012-11-04 07:00:00 (Sun)
  63498585600, #      utc_end 2013-03-10 08:00:00 (Sun)
  63487674000, #  local_start 2012-11-04 01:00:00 (Sun)
  63498564000, #    local_end 2013-03-10 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63498585600, #    utc_start 2013-03-10 08:00:00 (Sun)
  63519145200, #      utc_end 2013-11-03 07:00:00 (Sun)
  63498567600, #  local_start 2013-03-10 03:00:00 (Sun)
  63519127200, #    local_end 2013-11-03 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63519145200, #    utc_start 2013-11-03 07:00:00 (Sun)
  63530035200, #      utc_end 2014-03-09 08:00:00 (Sun)
  63519123600, #  local_start 2013-11-03 01:00:00 (Sun)
  63530013600, #    local_end 2014-03-09 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63530035200, #    utc_start 2014-03-09 08:00:00 (Sun)
  63550594800, #      utc_end 2014-11-02 07:00:00 (Sun)
  63530017200, #  local_start 2014-03-09 03:00:00 (Sun)
  63550576800, #    local_end 2014-11-02 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63550594800, #    utc_start 2014-11-02 07:00:00 (Sun)
  63561484800, #      utc_end 2015-03-08 08:00:00 (Sun)
  63550573200, #  local_start 2014-11-02 01:00:00 (Sun)
  63561463200, #    local_end 2015-03-08 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63561484800, #    utc_start 2015-03-08 08:00:00 (Sun)
  63582044400, #      utc_end 2015-11-01 07:00:00 (Sun)
  63561466800, #  local_start 2015-03-08 03:00:00 (Sun)
  63582026400, #    local_end 2015-11-01 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63582044400, #    utc_start 2015-11-01 07:00:00 (Sun)
  63593539200, #      utc_end 2016-03-13 08:00:00 (Sun)
  63582022800, #  local_start 2015-11-01 01:00:00 (Sun)
  63593517600, #    local_end 2016-03-13 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63593539200, #    utc_start 2016-03-13 08:00:00 (Sun)
  63614098800, #      utc_end 2016-11-06 07:00:00 (Sun)
  63593521200, #  local_start 2016-03-13 03:00:00 (Sun)
  63614080800, #    local_end 2016-11-06 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63614098800, #    utc_start 2016-11-06 07:00:00 (Sun)
  63624988800, #      utc_end 2017-03-12 08:00:00 (Sun)
  63614077200, #  local_start 2016-11-06 01:00:00 (Sun)
  63624967200, #    local_end 2017-03-12 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63624988800, #    utc_start 2017-03-12 08:00:00 (Sun)
  63645548400, #      utc_end 2017-11-05 07:00:00 (Sun)
  63624970800, #  local_start 2017-03-12 03:00:00 (Sun)
  63645530400, #    local_end 2017-11-05 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63645548400, #    utc_start 2017-11-05 07:00:00 (Sun)
  63656438400, #      utc_end 2018-03-11 08:00:00 (Sun)
  63645526800, #  local_start 2017-11-05 01:00:00 (Sun)
  63656416800, #    local_end 2018-03-11 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63656438400, #    utc_start 2018-03-11 08:00:00 (Sun)
  63676998000, #      utc_end 2018-11-04 07:00:00 (Sun)
  63656420400, #  local_start 2018-03-11 03:00:00 (Sun)
  63676980000, #    local_end 2018-11-04 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63676998000, #    utc_start 2018-11-04 07:00:00 (Sun)
  63687888000, #      utc_end 2019-03-10 08:00:00 (Sun)
  63676976400, #  local_start 2018-11-04 01:00:00 (Sun)
  63687866400, #    local_end 2019-03-10 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63687888000, #    utc_start 2019-03-10 08:00:00 (Sun)
  63708447600, #      utc_end 2019-11-03 07:00:00 (Sun)
  63687870000, #  local_start 2019-03-10 03:00:00 (Sun)
  63708429600, #    local_end 2019-11-03 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63708447600, #    utc_start 2019-11-03 07:00:00 (Sun)
  63719337600, #      utc_end 2020-03-08 08:00:00 (Sun)
  63708426000, #  local_start 2019-11-03 01:00:00 (Sun)
  63719316000, #    local_end 2020-03-08 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63719337600, #    utc_start 2020-03-08 08:00:00 (Sun)
  63739897200, #      utc_end 2020-11-01 07:00:00 (Sun)
  63719319600, #  local_start 2020-03-08 03:00:00 (Sun)
  63739879200, #    local_end 2020-11-01 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63739897200, #    utc_start 2020-11-01 07:00:00 (Sun)
  63751392000, #      utc_end 2021-03-14 08:00:00 (Sun)
  63739875600, #  local_start 2020-11-01 01:00:00 (Sun)
  63751370400, #    local_end 2021-03-14 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63751392000, #    utc_start 2021-03-14 08:00:00 (Sun)
  63771951600, #      utc_end 2021-11-07 07:00:00 (Sun)
  63751374000, #  local_start 2021-03-14 03:00:00 (Sun)
  63771933600, #    local_end 2021-11-07 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63771951600, #    utc_start 2021-11-07 07:00:00 (Sun)
  63782841600, #      utc_end 2022-03-13 08:00:00 (Sun)
  63771930000, #  local_start 2021-11-07 01:00:00 (Sun)
  63782820000, #    local_end 2022-03-13 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63782841600, #    utc_start 2022-03-13 08:00:00 (Sun)
  63803401200, #      utc_end 2022-11-06 07:00:00 (Sun)
  63782823600, #  local_start 2022-03-13 03:00:00 (Sun)
  63803383200, #    local_end 2022-11-06 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63803401200, #    utc_start 2022-11-06 07:00:00 (Sun)
  63814291200, #      utc_end 2023-03-12 08:00:00 (Sun)
  63803379600, #  local_start 2022-11-06 01:00:00 (Sun)
  63814269600, #    local_end 2023-03-12 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63814291200, #    utc_start 2023-03-12 08:00:00 (Sun)
  63834850800, #      utc_end 2023-11-05 07:00:00 (Sun)
  63814273200, #  local_start 2023-03-12 03:00:00 (Sun)
  63834832800, #    local_end 2023-11-05 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63834850800, #    utc_start 2023-11-05 07:00:00 (Sun)
  63845740800, #      utc_end 2024-03-10 08:00:00 (Sun)
  63834829200, #  local_start 2023-11-05 01:00:00 (Sun)
  63845719200, #    local_end 2024-03-10 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63845740800, #    utc_start 2024-03-10 08:00:00 (Sun)
  63866300400, #      utc_end 2024-11-03 07:00:00 (Sun)
  63845722800, #  local_start 2024-03-10 03:00:00 (Sun)
  63866282400, #    local_end 2024-11-03 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63866300400, #    utc_start 2024-11-03 07:00:00 (Sun)
  63877190400, #      utc_end 2025-03-09 08:00:00 (Sun)
  63866278800, #  local_start 2024-11-03 01:00:00 (Sun)
  63877168800, #    local_end 2025-03-09 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63877190400, #    utc_start 2025-03-09 08:00:00 (Sun)
  63897750000, #      utc_end 2025-11-02 07:00:00 (Sun)
  63877172400, #  local_start 2025-03-09 03:00:00 (Sun)
  63897732000, #    local_end 2025-11-02 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63897750000, #    utc_start 2025-11-02 07:00:00 (Sun)
  63908640000, #      utc_end 2026-03-08 08:00:00 (Sun)
  63897728400, #  local_start 2025-11-02 01:00:00 (Sun)
  63908618400, #    local_end 2026-03-08 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63908640000, #    utc_start 2026-03-08 08:00:00 (Sun)
  63929199600, #      utc_end 2026-11-01 07:00:00 (Sun)
  63908622000, #  local_start 2026-03-08 03:00:00 (Sun)
  63929181600, #    local_end 2026-11-01 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63929199600, #    utc_start 2026-11-01 07:00:00 (Sun)
  63940694400, #      utc_end 2027-03-14 08:00:00 (Sun)
  63929178000, #  local_start 2026-11-01 01:00:00 (Sun)
  63940672800, #    local_end 2027-03-14 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63940694400, #    utc_start 2027-03-14 08:00:00 (Sun)
  63961254000, #      utc_end 2027-11-07 07:00:00 (Sun)
  63940676400, #  local_start 2027-03-14 03:00:00 (Sun)
  63961236000, #    local_end 2027-11-07 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63961254000, #    utc_start 2027-11-07 07:00:00 (Sun)
  63972144000, #      utc_end 2028-03-12 08:00:00 (Sun)
  63961232400, #  local_start 2027-11-07 01:00:00 (Sun)
  63972122400, #    local_end 2028-03-12 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63972144000, #    utc_start 2028-03-12 08:00:00 (Sun)
  63992703600, #      utc_end 2028-11-05 07:00:00 (Sun)
  63972126000, #  local_start 2028-03-12 03:00:00 (Sun)
  63992685600, #    local_end 2028-11-05 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63992703600, #    utc_start 2028-11-05 07:00:00 (Sun)
  64003593600, #      utc_end 2029-03-11 08:00:00 (Sun)
  63992682000, #  local_start 2028-11-05 01:00:00 (Sun)
  64003572000, #    local_end 2029-03-11 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  64003593600, #    utc_start 2029-03-11 08:00:00 (Sun)
  64024153200, #      utc_end 2029-11-04 07:00:00 (Sun)
  64003575600, #  local_start 2029-03-11 03:00:00 (Sun)
  64024135200, #    local_end 2029-11-04 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  64024153200, #    utc_start 2029-11-04 07:00:00 (Sun)
  64035043200, #      utc_end 2030-03-10 08:00:00 (Sun)
  64024131600, #  local_start 2029-11-04 01:00:00 (Sun)
  64035021600, #    local_end 2030-03-10 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  64035043200, #    utc_start 2030-03-10 08:00:00 (Sun)
  64055602800, #      utc_end 2030-11-03 07:00:00 (Sun)
  64035025200, #  local_start 2030-03-10 03:00:00 (Sun)
  64055584800, #    local_end 2030-11-03 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {52}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -21600 }
  
  my $last_observance = bless( {
    'format' => 'C%sT',
    'gmtoff' => '-6:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 730576,
      'local_rd_secs' => 10800,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 730576,
      'utc_rd_secs' => 10800,
      'utc_year' => 2002
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -21600,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 730576,
      'local_rd_secs' => 28800,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 730576,
      'utc_rd_secs' => 28800,
      'utc_year' => 2002
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Mar',
      'letter' => 'D',
      'name' => 'Canada',
      'offset_from_std' => 3600,
      'on' => 'Sun>=8',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Nov',
      'letter' => 'S',
      'name' => 'Canada',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_RANKIN_INLET

    $main::fatpacked{"DateTime/TimeZone/America/Recife.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_RECIFE';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/southamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Recife;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Recife::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60368465976, #      utc_end 1914-01-01 02:19:36 (Thu)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60368457600, #    local_end 1914-01-01 00:00:00 (Thu)
  -8376,
  0,
  'LMT',
      ],
      [
  60368465976, #    utc_start 1914-01-01 02:19:36 (Thu)
  60928725600, #      utc_end 1931-10-03 14:00:00 (Sat)
  60368455176, #  local_start 1913-12-31 23:19:36 (Wed)
  60928714800, #    local_end 1931-10-03 11:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  60928725600, #    utc_start 1931-10-03 14:00:00 (Sat)
  60944320800, #      utc_end 1932-04-01 02:00:00 (Fri)
  60928718400, #  local_start 1931-10-03 12:00:00 (Sat)
  60944313600, #    local_end 1932-04-01 00:00:00 (Fri)
  -7200,
  1,
  '-02',
      ],
      [
  60944320800, #    utc_start 1932-04-01 02:00:00 (Fri)
  60960308400, #      utc_end 1932-10-03 03:00:00 (Mon)
  60944310000, #  local_start 1932-03-31 23:00:00 (Thu)
  60960297600, #    local_end 1932-10-03 00:00:00 (Mon)
  -10800,
  0,
  '-03',
      ],
      [
  60960308400, #    utc_start 1932-10-03 03:00:00 (Mon)
  60975856800, #      utc_end 1933-04-01 02:00:00 (Sat)
  60960301200, #  local_start 1932-10-03 01:00:00 (Mon)
  60975849600, #    local_end 1933-04-01 00:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  60975856800, #    utc_start 1933-04-01 02:00:00 (Sat)
  61501863600, #      utc_end 1949-12-01 03:00:00 (Thu)
  60975846000, #  local_start 1933-03-31 23:00:00 (Fri)
  61501852800, #    local_end 1949-12-01 00:00:00 (Thu)
  -10800,
  0,
  '-03',
      ],
      [
  61501863600, #    utc_start 1949-12-01 03:00:00 (Thu)
  61513614000, #      utc_end 1950-04-16 03:00:00 (Sun)
  61501856400, #  local_start 1949-12-01 01:00:00 (Thu)
  61513606800, #    local_end 1950-04-16 01:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  61513614000, #    utc_start 1950-04-16 03:00:00 (Sun)
  61533399600, #      utc_end 1950-12-01 03:00:00 (Fri)
  61513603200, #  local_start 1950-04-16 00:00:00 (Sun)
  61533388800, #    local_end 1950-12-01 00:00:00 (Fri)
  -10800,
  0,
  '-03',
      ],
      [
  61533399600, #    utc_start 1950-12-01 03:00:00 (Fri)
  61543850400, #      utc_end 1951-04-01 02:00:00 (Sun)
  61533392400, #  local_start 1950-12-01 01:00:00 (Fri)
  61543843200, #    local_end 1951-04-01 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  61543850400, #    utc_start 1951-04-01 02:00:00 (Sun)
  61564935600, #      utc_end 1951-12-01 03:00:00 (Sat)
  61543839600, #  local_start 1951-03-31 23:00:00 (Sat)
  61564924800, #    local_end 1951-12-01 00:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  61564935600, #    utc_start 1951-12-01 03:00:00 (Sat)
  61575472800, #      utc_end 1952-04-01 02:00:00 (Tue)
  61564928400, #  local_start 1951-12-01 01:00:00 (Sat)
  61575465600, #    local_end 1952-04-01 00:00:00 (Tue)
  -7200,
  1,
  '-02',
      ],
      [
  61575472800, #    utc_start 1952-04-01 02:00:00 (Tue)
  61596558000, #      utc_end 1952-12-01 03:00:00 (Mon)
  61575462000, #  local_start 1952-03-31 23:00:00 (Mon)
  61596547200, #    local_end 1952-12-01 00:00:00 (Mon)
  -10800,
  0,
  '-03',
      ],
      [
  61596558000, #    utc_start 1952-12-01 03:00:00 (Mon)
  61604330400, #      utc_end 1953-03-01 02:00:00 (Sun)
  61596550800, #  local_start 1952-12-01 01:00:00 (Mon)
  61604323200, #    local_end 1953-03-01 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  61604330400, #    utc_start 1953-03-01 02:00:00 (Sun)
  61944318000, #      utc_end 1963-12-09 03:00:00 (Mon)
  61604319600, #  local_start 1953-02-28 23:00:00 (Sat)
  61944307200, #    local_end 1963-12-09 00:00:00 (Mon)
  -10800,
  0,
  '-03',
      ],
      [
  61944318000, #    utc_start 1963-12-09 03:00:00 (Mon)
  61951485600, #      utc_end 1964-03-01 02:00:00 (Sun)
  61944310800, #  local_start 1963-12-09 01:00:00 (Mon)
  61951478400, #    local_end 1964-03-01 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  61951485600, #    utc_start 1964-03-01 02:00:00 (Sun)
  61980519600, #      utc_end 1965-01-31 03:00:00 (Sun)
  61951474800, #  local_start 1964-02-29 23:00:00 (Sat)
  61980508800, #    local_end 1965-01-31 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  61980519600, #    utc_start 1965-01-31 03:00:00 (Sun)
  61985613600, #      utc_end 1965-03-31 02:00:00 (Wed)
  61980512400, #  local_start 1965-01-31 01:00:00 (Sun)
  61985606400, #    local_end 1965-03-31 00:00:00 (Wed)
  -7200,
  1,
  '-02',
      ],
      [
  61985613600, #    utc_start 1965-03-31 02:00:00 (Wed)
  62006785200, #      utc_end 1965-12-01 03:00:00 (Wed)
  61985602800, #  local_start 1965-03-30 23:00:00 (Tue)
  62006774400, #    local_end 1965-12-01 00:00:00 (Wed)
  -10800,
  0,
  '-03',
      ],
      [
  62006785200, #    utc_start 1965-12-01 03:00:00 (Wed)
  62014557600, #      utc_end 1966-03-01 02:00:00 (Tue)
  62006778000, #  local_start 1965-12-01 01:00:00 (Wed)
  62014550400, #    local_end 1966-03-01 00:00:00 (Tue)
  -7200,
  1,
  '-02',
      ],
      [
  62014557600, #    utc_start 1966-03-01 02:00:00 (Tue)
  62035729200, #      utc_end 1966-11-01 03:00:00 (Tue)
  62014546800, #  local_start 1966-02-28 23:00:00 (Mon)
  62035718400, #    local_end 1966-11-01 00:00:00 (Tue)
  -10800,
  0,
  '-03',
      ],
      [
  62035729200, #    utc_start 1966-11-01 03:00:00 (Tue)
  62046093600, #      utc_end 1967-03-01 02:00:00 (Wed)
  62035722000, #  local_start 1966-11-01 01:00:00 (Tue)
  62046086400, #    local_end 1967-03-01 00:00:00 (Wed)
  -7200,
  1,
  '-02',
      ],
      [
  62046093600, #    utc_start 1967-03-01 02:00:00 (Wed)
  62067265200, #      utc_end 1967-11-01 03:00:00 (Wed)
  62046082800, #  local_start 1967-02-28 23:00:00 (Tue)
  62067254400, #    local_end 1967-11-01 00:00:00 (Wed)
  -10800,
  0,
  '-03',
      ],
      [
  62067265200, #    utc_start 1967-11-01 03:00:00 (Wed)
  62077716000, #      utc_end 1968-03-01 02:00:00 (Fri)
  62067258000, #  local_start 1967-11-01 01:00:00 (Wed)
  62077708800, #    local_end 1968-03-01 00:00:00 (Fri)
  -7200,
  1,
  '-02',
      ],
      [
  62077716000, #    utc_start 1968-03-01 02:00:00 (Fri)
  62635431600, #      utc_end 1985-11-02 03:00:00 (Sat)
  62077705200, #  local_start 1968-02-29 23:00:00 (Thu)
  62635420800, #    local_end 1985-11-02 00:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  62635431600, #    utc_start 1985-11-02 03:00:00 (Sat)
  62646919200, #      utc_end 1986-03-15 02:00:00 (Sat)
  62635424400, #  local_start 1985-11-02 01:00:00 (Sat)
  62646912000, #    local_end 1986-03-15 00:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  62646919200, #    utc_start 1986-03-15 02:00:00 (Sat)
  62666276400, #      utc_end 1986-10-25 03:00:00 (Sat)
  62646908400, #  local_start 1986-03-14 23:00:00 (Fri)
  62666265600, #    local_end 1986-10-25 00:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  62666276400, #    utc_start 1986-10-25 03:00:00 (Sat)
  62675949600, #      utc_end 1987-02-14 02:00:00 (Sat)
  62666269200, #  local_start 1986-10-25 01:00:00 (Sat)
  62675942400, #    local_end 1987-02-14 00:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  62675949600, #    utc_start 1987-02-14 02:00:00 (Sat)
  62697812400, #      utc_end 1987-10-25 03:00:00 (Sun)
  62675938800, #  local_start 1987-02-13 23:00:00 (Fri)
  62697801600, #    local_end 1987-10-25 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62697812400, #    utc_start 1987-10-25 03:00:00 (Sun)
  62706880800, #      utc_end 1988-02-07 02:00:00 (Sun)
  62697805200, #  local_start 1987-10-25 01:00:00 (Sun)
  62706873600, #    local_end 1988-02-07 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62706880800, #    utc_start 1988-02-07 02:00:00 (Sun)
  62728657200, #      utc_end 1988-10-16 03:00:00 (Sun)
  62706870000, #  local_start 1988-02-06 23:00:00 (Sat)
  62728646400, #    local_end 1988-10-16 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62728657200, #    utc_start 1988-10-16 03:00:00 (Sun)
  62737725600, #      utc_end 1989-01-29 02:00:00 (Sun)
  62728650000, #  local_start 1988-10-16 01:00:00 (Sun)
  62737718400, #    local_end 1989-01-29 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62737725600, #    utc_start 1989-01-29 02:00:00 (Sun)
  62760106800, #      utc_end 1989-10-15 03:00:00 (Sun)
  62737714800, #  local_start 1989-01-28 23:00:00 (Sat)
  62760096000, #    local_end 1989-10-15 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62760106800, #    utc_start 1989-10-15 03:00:00 (Sun)
  62770384800, #      utc_end 1990-02-11 02:00:00 (Sun)
  62760099600, #  local_start 1989-10-15 01:00:00 (Sun)
  62770377600, #    local_end 1990-02-11 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62770384800, #    utc_start 1990-02-11 02:00:00 (Sun)
  62789223600, #      utc_end 1990-09-17 03:00:00 (Mon)
  62770374000, #  local_start 1990-02-10 23:00:00 (Sat)
  62789212800, #    local_end 1990-09-17 00:00:00 (Mon)
  -10800,
  0,
  '-03',
      ],
      [
  62789223600, #    utc_start 1990-09-17 03:00:00 (Mon)
  63074343600, #      utc_end 1999-09-30 03:00:00 (Thu)
  62789212800, #  local_start 1990-09-17 00:00:00 (Mon)
  63074332800, #    local_end 1999-09-30 00:00:00 (Thu)
  -10800,
  0,
  '-03',
      ],
      [
  63074343600, #    utc_start 1999-09-30 03:00:00 (Thu)
  63074602800, #      utc_end 1999-10-03 03:00:00 (Sun)
  63074332800, #  local_start 1999-09-30 00:00:00 (Thu)
  63074592000, #    local_end 1999-10-03 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63074602800, #    utc_start 1999-10-03 03:00:00 (Sun)
  63087300000, #      utc_end 2000-02-27 02:00:00 (Sun)
  63074595600, #  local_start 1999-10-03 01:00:00 (Sun)
  63087292800, #    local_end 2000-02-27 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63087300000, #    utc_start 2000-02-27 02:00:00 (Sun)
  63106657200, #      utc_end 2000-10-08 03:00:00 (Sun)
  63087289200, #  local_start 2000-02-26 23:00:00 (Sat)
  63106646400, #    local_end 2000-10-08 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63106657200, #    utc_start 2000-10-08 03:00:00 (Sun)
  63107258400, #      utc_end 2000-10-15 02:00:00 (Sun)
  63106650000, #  local_start 2000-10-08 01:00:00 (Sun)
  63107251200, #    local_end 2000-10-15 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63107258400, #    utc_start 2000-10-15 02:00:00 (Sun)
  63136033200, #      utc_end 2001-09-13 03:00:00 (Thu)
  63107247600, #  local_start 2000-10-14 23:00:00 (Sat)
  63136022400, #    local_end 2001-09-13 00:00:00 (Thu)
  -10800,
  0,
  '-03',
      ],
      [
  63136033200, #    utc_start 2001-09-13 03:00:00 (Thu)
  63138711600, #      utc_end 2001-10-14 03:00:00 (Sun)
  63136022400, #  local_start 2001-09-13 00:00:00 (Thu)
  63138700800, #    local_end 2001-10-14 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63138711600, #    utc_start 2001-10-14 03:00:00 (Sun)
  63149594400, #      utc_end 2002-02-17 02:00:00 (Sun)
  63138704400, #  local_start 2001-10-14 01:00:00 (Sun)
  63149587200, #    local_end 2002-02-17 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63149594400, #    utc_start 2002-02-17 02:00:00 (Sun)
  63169124400, #      utc_end 2002-10-01 03:00:00 (Tue)
  63149583600, #  local_start 2002-02-16 23:00:00 (Sat)
  63169113600, #    local_end 2002-10-01 00:00:00 (Tue)
  -10800,
  0,
  '-03',
      ],
      [
  63169124400, #    utc_start 2002-10-01 03:00:00 (Tue)
  DateTime::TimeZone::INFINITY, #      utc_end
  63169113600, #  local_start 2002-10-01 00:00:00 (Tue)
  DateTime::TimeZone::INFINITY, #    local_end
  -10800,
  0,
  '-03',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {19}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_RECIFE

    $main::fatpacked{"DateTime/TimeZone/America/Regina.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_REGINA';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Regina;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Regina::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60105481116, #      utc_end 1905-09-01 06:58:36 (Fri)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60105456000, #    local_end 1905-09-01 00:00:00 (Fri)
  -25116,
  0,
  'LMT',
      ],
      [
  60105481116, #    utc_start 1905-09-01 06:58:36 (Fri)
  60503619600, #      utc_end 1918-04-14 09:00:00 (Sun)
  60105455916, #  local_start 1905-08-31 23:58:36 (Thu)
  60503594400, #    local_end 1918-04-14 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  60503619600, #    utc_start 1918-04-14 09:00:00 (Sun)
  60520550400, #      utc_end 1918-10-27 08:00:00 (Sun)
  60503598000, #  local_start 1918-04-14 03:00:00 (Sun)
  60520528800, #    local_end 1918-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  60520550400, #    utc_start 1918-10-27 08:00:00 (Sun)
  60884031600, #      utc_end 1930-05-04 07:00:00 (Sun)
  60520525200, #  local_start 1918-10-27 01:00:00 (Sun)
  60884006400, #    local_end 1930-05-04 00:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  60884031600, #    utc_start 1930-05-04 07:00:00 (Sun)
  60897333600, #      utc_end 1930-10-05 06:00:00 (Sun)
  60884010000, #  local_start 1930-05-04 01:00:00 (Sun)
  60897312000, #    local_end 1930-10-05 00:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  60897333600, #    utc_start 1930-10-05 06:00:00 (Sun)
  60915481200, #      utc_end 1931-05-03 07:00:00 (Sun)
  60897308400, #  local_start 1930-10-04 23:00:00 (Sat)
  60915456000, #    local_end 1931-05-03 00:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  60915481200, #    utc_start 1931-05-03 07:00:00 (Sun)
  60928783200, #      utc_end 1931-10-04 06:00:00 (Sun)
  60915459600, #  local_start 1931-05-03 01:00:00 (Sun)
  60928761600, #    local_end 1931-10-04 00:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  60928783200, #    utc_start 1931-10-04 06:00:00 (Sun)
  60946930800, #      utc_end 1932-05-01 07:00:00 (Sun)
  60928758000, #  local_start 1931-10-03 23:00:00 (Sat)
  60946905600, #    local_end 1932-05-01 00:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  60946930800, #    utc_start 1932-05-01 07:00:00 (Sun)
  60960232800, #      utc_end 1932-10-02 06:00:00 (Sun)
  60946909200, #  local_start 1932-05-01 01:00:00 (Sun)
  60960211200, #    local_end 1932-10-02 00:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  60960232800, #    utc_start 1932-10-02 06:00:00 (Sun)
  60978985200, #      utc_end 1933-05-07 07:00:00 (Sun)
  60960207600, #  local_start 1932-10-01 23:00:00 (Sat)
  60978960000, #    local_end 1933-05-07 00:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  60978985200, #    utc_start 1933-05-07 07:00:00 (Sun)
  60991682400, #      utc_end 1933-10-01 06:00:00 (Sun)
  60978963600, #  local_start 1933-05-07 01:00:00 (Sun)
  60991660800, #    local_end 1933-10-01 00:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  60991682400, #    utc_start 1933-10-01 06:00:00 (Sun)
  61010434800, #      utc_end 1934-05-06 07:00:00 (Sun)
  60991657200, #  local_start 1933-09-30 23:00:00 (Sat)
  61010409600, #    local_end 1934-05-06 00:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  61010434800, #    utc_start 1934-05-06 07:00:00 (Sun)
  61023736800, #      utc_end 1934-10-07 06:00:00 (Sun)
  61010413200, #  local_start 1934-05-06 01:00:00 (Sun)
  61023715200, #    local_end 1934-10-07 00:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  61023736800, #    utc_start 1934-10-07 06:00:00 (Sun)
  61102969200, #      utc_end 1937-04-11 07:00:00 (Sun)
  61023711600, #  local_start 1934-10-06 23:00:00 (Sat)
  61102944000, #    local_end 1937-04-11 00:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  61102969200, #    utc_start 1937-04-11 07:00:00 (Sun)
  61118690400, #      utc_end 1937-10-10 06:00:00 (Sun)
  61102947600, #  local_start 1937-04-11 01:00:00 (Sun)
  61118668800, #    local_end 1937-10-10 00:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  61118690400, #    utc_start 1937-10-10 06:00:00 (Sun)
  61134418800, #      utc_end 1938-04-10 07:00:00 (Sun)
  61118665200, #  local_start 1937-10-09 23:00:00 (Sat)
  61134393600, #    local_end 1938-04-10 00:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  61134418800, #    utc_start 1938-04-10 07:00:00 (Sun)
  61149535200, #      utc_end 1938-10-02 06:00:00 (Sun)
  61134397200, #  local_start 1938-04-10 01:00:00 (Sun)
  61149513600, #    local_end 1938-10-02 00:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  61149535200, #    utc_start 1938-10-02 06:00:00 (Sun)
  61165868400, #      utc_end 1939-04-09 07:00:00 (Sun)
  61149510000, #  local_start 1938-10-01 23:00:00 (Sat)
  61165843200, #    local_end 1939-04-09 00:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  61165868400, #    utc_start 1939-04-09 07:00:00 (Sun)
  61181589600, #      utc_end 1939-10-08 06:00:00 (Sun)
  61165846800, #  local_start 1939-04-09 01:00:00 (Sun)
  61181568000, #    local_end 1939-10-08 00:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  61181589600, #    utc_start 1939-10-08 06:00:00 (Sun)
  61197922800, #      utc_end 1940-04-14 07:00:00 (Sun)
  61181564400, #  local_start 1939-10-07 23:00:00 (Sat)
  61197897600, #    local_end 1940-04-14 00:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  61197922800, #    utc_start 1940-04-14 07:00:00 (Sun)
  61213644000, #      utc_end 1940-10-13 06:00:00 (Sun)
  61197901200, #  local_start 1940-04-14 01:00:00 (Sun)
  61213622400, #    local_end 1940-10-13 00:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  61213644000, #    utc_start 1940-10-13 06:00:00 (Sun)
  61229372400, #      utc_end 1941-04-13 07:00:00 (Sun)
  61213618800, #  local_start 1940-10-12 23:00:00 (Sat)
  61229347200, #    local_end 1941-04-13 00:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  61229372400, #    utc_start 1941-04-13 07:00:00 (Sun)
  61245093600, #      utc_end 1941-10-12 06:00:00 (Sun)
  61229350800, #  local_start 1941-04-13 01:00:00 (Sun)
  61245072000, #    local_end 1941-10-12 00:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  61245093600, #    utc_start 1941-10-12 06:00:00 (Sun)
  61255472400, #      utc_end 1942-02-09 09:00:00 (Mon)
  61245068400, #  local_start 1941-10-11 23:00:00 (Sat)
  61255447200, #    local_end 1942-02-09 02:00:00 (Mon)
  -25200,
  0,
  'MST',
      ],
      [
  61255472400, #    utc_start 1942-02-09 09:00:00 (Mon)
  61366287600, #      utc_end 1945-08-14 23:00:00 (Tue)
  61255450800, #  local_start 1942-02-09 03:00:00 (Mon)
  61366266000, #    local_end 1945-08-14 17:00:00 (Tue)
  -21600,
  1,
  'MWT',
      ],
      [
  61366287600, #    utc_start 1945-08-14 23:00:00 (Tue)
  61370294400, #      utc_end 1945-09-30 08:00:00 (Sun)
  61366266000, #  local_start 1945-08-14 17:00:00 (Tue)
  61370272800, #    local_end 1945-09-30 02:00:00 (Sun)
  -21600,
  1,
  'MPT',
      ],
      [
  61370294400, #    utc_start 1945-09-30 08:00:00 (Sun)
  61387232400, #      utc_end 1946-04-14 09:00:00 (Sun)
  61370269200, #  local_start 1945-09-30 01:00:00 (Sun)
  61387207200, #    local_end 1946-04-14 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  61387232400, #    utc_start 1946-04-14 09:00:00 (Sun)
  61402953600, #      utc_end 1946-10-13 08:00:00 (Sun)
  61387210800, #  local_start 1946-04-14 03:00:00 (Sun)
  61402932000, #    local_end 1946-10-13 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  61402953600, #    utc_start 1946-10-13 08:00:00 (Sun)
  61419891600, #      utc_end 1947-04-27 09:00:00 (Sun)
  61402928400, #  local_start 1946-10-13 01:00:00 (Sun)
  61419866400, #    local_end 1947-04-27 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  61419891600, #    utc_start 1947-04-27 09:00:00 (Sun)
  61433193600, #      utc_end 1947-09-28 08:00:00 (Sun)
  61419870000, #  local_start 1947-04-27 03:00:00 (Sun)
  61433172000, #    local_end 1947-09-28 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  61433193600, #    utc_start 1947-09-28 08:00:00 (Sun)
  61451341200, #      utc_end 1948-04-25 09:00:00 (Sun)
  61433168400, #  local_start 1947-09-28 01:00:00 (Sun)
  61451316000, #    local_end 1948-04-25 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  61451341200, #    utc_start 1948-04-25 09:00:00 (Sun)
  61464643200, #      utc_end 1948-09-26 08:00:00 (Sun)
  61451319600, #  local_start 1948-04-25 03:00:00 (Sun)
  61464621600, #    local_end 1948-09-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  61464643200, #    utc_start 1948-09-26 08:00:00 (Sun)
  61482790800, #      utc_end 1949-04-24 09:00:00 (Sun)
  61464618000, #  local_start 1948-09-26 01:00:00 (Sun)
  61482765600, #    local_end 1949-04-24 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  61482790800, #    utc_start 1949-04-24 09:00:00 (Sun)
  61496092800, #      utc_end 1949-09-25 08:00:00 (Sun)
  61482769200, #  local_start 1949-04-24 03:00:00 (Sun)
  61496071200, #    local_end 1949-09-25 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  61496092800, #    utc_start 1949-09-25 08:00:00 (Sun)
  61514845200, #      utc_end 1950-04-30 09:00:00 (Sun)
  61496067600, #  local_start 1949-09-25 01:00:00 (Sun)
  61514820000, #    local_end 1950-04-30 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  61514845200, #    utc_start 1950-04-30 09:00:00 (Sun)
  61527542400, #      utc_end 1950-09-24 08:00:00 (Sun)
  61514823600, #  local_start 1950-04-30 03:00:00 (Sun)
  61527520800, #    local_end 1950-09-24 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  61527542400, #    utc_start 1950-09-24 08:00:00 (Sun)
  61546294800, #      utc_end 1951-04-29 09:00:00 (Sun)
  61527517200, #  local_start 1950-09-24 01:00:00 (Sun)
  61546269600, #    local_end 1951-04-29 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  61546294800, #    utc_start 1951-04-29 09:00:00 (Sun)
  61559596800, #      utc_end 1951-09-30 08:00:00 (Sun)
  61546273200, #  local_start 1951-04-29 03:00:00 (Sun)
  61559575200, #    local_end 1951-09-30 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  61559596800, #    utc_start 1951-09-30 08:00:00 (Sun)
  61577744400, #      utc_end 1952-04-27 09:00:00 (Sun)
  61559571600, #  local_start 1951-09-30 01:00:00 (Sun)
  61577719200, #    local_end 1952-04-27 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  61577744400, #    utc_start 1952-04-27 09:00:00 (Sun)
  61591046400, #      utc_end 1952-09-28 08:00:00 (Sun)
  61577722800, #  local_start 1952-04-27 03:00:00 (Sun)
  61591024800, #    local_end 1952-09-28 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  61591046400, #    utc_start 1952-09-28 08:00:00 (Sun)
  61609194000, #      utc_end 1953-04-26 09:00:00 (Sun)
  61591021200, #  local_start 1952-09-28 01:00:00 (Sun)
  61609168800, #    local_end 1953-04-26 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  61609194000, #    utc_start 1953-04-26 09:00:00 (Sun)
  61622496000, #      utc_end 1953-09-27 08:00:00 (Sun)
  61609172400, #  local_start 1953-04-26 03:00:00 (Sun)
  61622474400, #    local_end 1953-09-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  61622496000, #    utc_start 1953-09-27 08:00:00 (Sun)
  61640643600, #      utc_end 1954-04-25 09:00:00 (Sun)
  61622470800, #  local_start 1953-09-27 01:00:00 (Sun)
  61640618400, #    local_end 1954-04-25 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  61640643600, #    utc_start 1954-04-25 09:00:00 (Sun)
  61653945600, #      utc_end 1954-09-26 08:00:00 (Sun)
  61640622000, #  local_start 1954-04-25 03:00:00 (Sun)
  61653924000, #    local_end 1954-09-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  61653945600, #    utc_start 1954-09-26 08:00:00 (Sun)
  61672093200, #      utc_end 1955-04-24 09:00:00 (Sun)
  61653920400, #  local_start 1954-09-26 01:00:00 (Sun)
  61672068000, #    local_end 1955-04-24 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  61672093200, #    utc_start 1955-04-24 09:00:00 (Sun)
  61685395200, #      utc_end 1955-09-25 08:00:00 (Sun)
  61672071600, #  local_start 1955-04-24 03:00:00 (Sun)
  61685373600, #    local_end 1955-09-25 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  61685395200, #    utc_start 1955-09-25 08:00:00 (Sun)
  61704147600, #      utc_end 1956-04-29 09:00:00 (Sun)
  61685370000, #  local_start 1955-09-25 01:00:00 (Sun)
  61704122400, #    local_end 1956-04-29 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  61704147600, #    utc_start 1956-04-29 09:00:00 (Sun)
  61717449600, #      utc_end 1956-09-30 08:00:00 (Sun)
  61704126000, #  local_start 1956-04-29 03:00:00 (Sun)
  61717428000, #    local_end 1956-09-30 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  61717449600, #    utc_start 1956-09-30 08:00:00 (Sun)
  61735597200, #      utc_end 1957-04-28 09:00:00 (Sun)
  61717424400, #  local_start 1956-09-30 01:00:00 (Sun)
  61735572000, #    local_end 1957-04-28 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  61735597200, #    utc_start 1957-04-28 09:00:00 (Sun)
  61748899200, #      utc_end 1957-09-29 08:00:00 (Sun)
  61735575600, #  local_start 1957-04-28 03:00:00 (Sun)
  61748877600, #    local_end 1957-09-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  61748899200, #    utc_start 1957-09-29 08:00:00 (Sun)
  61798496400, #      utc_end 1959-04-26 09:00:00 (Sun)
  61748874000, #  local_start 1957-09-29 01:00:00 (Sun)
  61798471200, #    local_end 1959-04-26 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  61798496400, #    utc_start 1959-04-26 09:00:00 (Sun)
  61814217600, #      utc_end 1959-10-25 08:00:00 (Sun)
  61798474800, #  local_start 1959-04-26 03:00:00 (Sun)
  61814196000, #    local_end 1959-10-25 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  61814217600, #    utc_start 1959-10-25 08:00:00 (Sun)
  61829946000, #      utc_end 1960-04-24 09:00:00 (Sun)
  61814192400, #  local_start 1959-10-25 01:00:00 (Sun)
  61829920800, #    local_end 1960-04-24 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  61829946000, #    utc_start 1960-04-24 09:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #      utc_end
  61829924400, #  local_start 1960-04-24 03:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  -21600,
  0,
  'CST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {26}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_REGINA

    $main::fatpacked{"DateTime/TimeZone/America/Resolute.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_RESOLUTE';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Resolute;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Resolute::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  61430745600, #      utc_end 1947-08-31 00:00:00 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  61430745600, #    local_end 1947-08-31 00:00:00 (Sun)
  0,
  0,
  '-00',
      ],
      [
  61430745600, #    utc_start 1947-08-31 00:00:00 (Sun)
  61987788000, #      utc_end 1965-04-25 06:00:00 (Sun)
  61430724000, #  local_start 1947-08-30 18:00:00 (Sat)
  61987766400, #    local_end 1965-04-25 00:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61987788000, #    utc_start 1965-04-25 06:00:00 (Sun)
  62004117600, #      utc_end 1965-10-31 06:00:00 (Sun)
  61987773600, #  local_start 1965-04-25 02:00:00 (Sun)
  62004103200, #    local_end 1965-10-31 02:00:00 (Sun)
  -14400,
  1,
  'CDDT',
      ],
      [
  62004117600, #    utc_start 1965-10-31 06:00:00 (Sun)
  62461353600, #      utc_end 1980-04-27 08:00:00 (Sun)
  62004096000, #  local_start 1965-10-31 00:00:00 (Sun)
  62461332000, #    local_end 1980-04-27 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62461353600, #    utc_start 1980-04-27 08:00:00 (Sun)
  62477074800, #      utc_end 1980-10-26 07:00:00 (Sun)
  62461335600, #  local_start 1980-04-27 03:00:00 (Sun)
  62477056800, #    local_end 1980-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62477074800, #    utc_start 1980-10-26 07:00:00 (Sun)
  62492803200, #      utc_end 1981-04-26 08:00:00 (Sun)
  62477053200, #  local_start 1980-10-26 01:00:00 (Sun)
  62492781600, #    local_end 1981-04-26 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62492803200, #    utc_start 1981-04-26 08:00:00 (Sun)
  62508524400, #      utc_end 1981-10-25 07:00:00 (Sun)
  62492785200, #  local_start 1981-04-26 03:00:00 (Sun)
  62508506400, #    local_end 1981-10-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62508524400, #    utc_start 1981-10-25 07:00:00 (Sun)
  62524252800, #      utc_end 1982-04-25 08:00:00 (Sun)
  62508502800, #  local_start 1981-10-25 01:00:00 (Sun)
  62524231200, #    local_end 1982-04-25 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62524252800, #    utc_start 1982-04-25 08:00:00 (Sun)
  62540578800, #      utc_end 1982-10-31 07:00:00 (Sun)
  62524234800, #  local_start 1982-04-25 03:00:00 (Sun)
  62540560800, #    local_end 1982-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62540578800, #    utc_start 1982-10-31 07:00:00 (Sun)
  62555702400, #      utc_end 1983-04-24 08:00:00 (Sun)
  62540557200, #  local_start 1982-10-31 01:00:00 (Sun)
  62555680800, #    local_end 1983-04-24 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62555702400, #    utc_start 1983-04-24 08:00:00 (Sun)
  62572028400, #      utc_end 1983-10-30 07:00:00 (Sun)
  62555684400, #  local_start 1983-04-24 03:00:00 (Sun)
  62572010400, #    local_end 1983-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62572028400, #    utc_start 1983-10-30 07:00:00 (Sun)
  62587756800, #      utc_end 1984-04-29 08:00:00 (Sun)
  62572006800, #  local_start 1983-10-30 01:00:00 (Sun)
  62587735200, #    local_end 1984-04-29 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62587756800, #    utc_start 1984-04-29 08:00:00 (Sun)
  62603478000, #      utc_end 1984-10-28 07:00:00 (Sun)
  62587738800, #  local_start 1984-04-29 03:00:00 (Sun)
  62603460000, #    local_end 1984-10-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62603478000, #    utc_start 1984-10-28 07:00:00 (Sun)
  62619206400, #      utc_end 1985-04-28 08:00:00 (Sun)
  62603456400, #  local_start 1984-10-28 01:00:00 (Sun)
  62619184800, #    local_end 1985-04-28 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62619206400, #    utc_start 1985-04-28 08:00:00 (Sun)
  62634927600, #      utc_end 1985-10-27 07:00:00 (Sun)
  62619188400, #  local_start 1985-04-28 03:00:00 (Sun)
  62634909600, #    local_end 1985-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62634927600, #    utc_start 1985-10-27 07:00:00 (Sun)
  62650656000, #      utc_end 1986-04-27 08:00:00 (Sun)
  62634906000, #  local_start 1985-10-27 01:00:00 (Sun)
  62650634400, #    local_end 1986-04-27 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62650656000, #    utc_start 1986-04-27 08:00:00 (Sun)
  62666377200, #      utc_end 1986-10-26 07:00:00 (Sun)
  62650638000, #  local_start 1986-04-27 03:00:00 (Sun)
  62666359200, #    local_end 1986-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62666377200, #    utc_start 1986-10-26 07:00:00 (Sun)
  62680291200, #      utc_end 1987-04-05 08:00:00 (Sun)
  62666355600, #  local_start 1986-10-26 01:00:00 (Sun)
  62680269600, #    local_end 1987-04-05 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62680291200, #    utc_start 1987-04-05 08:00:00 (Sun)
  62697826800, #      utc_end 1987-10-25 07:00:00 (Sun)
  62680273200, #  local_start 1987-04-05 03:00:00 (Sun)
  62697808800, #    local_end 1987-10-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62697826800, #    utc_start 1987-10-25 07:00:00 (Sun)
  62711740800, #      utc_end 1988-04-03 08:00:00 (Sun)
  62697805200, #  local_start 1987-10-25 01:00:00 (Sun)
  62711719200, #    local_end 1988-04-03 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62711740800, #    utc_start 1988-04-03 08:00:00 (Sun)
  62729881200, #      utc_end 1988-10-30 07:00:00 (Sun)
  62711722800, #  local_start 1988-04-03 03:00:00 (Sun)
  62729863200, #    local_end 1988-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62729881200, #    utc_start 1988-10-30 07:00:00 (Sun)
  62743190400, #      utc_end 1989-04-02 08:00:00 (Sun)
  62729859600, #  local_start 1988-10-30 01:00:00 (Sun)
  62743168800, #    local_end 1989-04-02 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62743190400, #    utc_start 1989-04-02 08:00:00 (Sun)
  62761330800, #      utc_end 1989-10-29 07:00:00 (Sun)
  62743172400, #  local_start 1989-04-02 03:00:00 (Sun)
  62761312800, #    local_end 1989-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62761330800, #    utc_start 1989-10-29 07:00:00 (Sun)
  62774640000, #      utc_end 1990-04-01 08:00:00 (Sun)
  62761309200, #  local_start 1989-10-29 01:00:00 (Sun)
  62774618400, #    local_end 1990-04-01 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62774640000, #    utc_start 1990-04-01 08:00:00 (Sun)
  62792780400, #      utc_end 1990-10-28 07:00:00 (Sun)
  62774622000, #  local_start 1990-04-01 03:00:00 (Sun)
  62792762400, #    local_end 1990-10-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62792780400, #    utc_start 1990-10-28 07:00:00 (Sun)
  62806694400, #      utc_end 1991-04-07 08:00:00 (Sun)
  62792758800, #  local_start 1990-10-28 01:00:00 (Sun)
  62806672800, #    local_end 1991-04-07 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62806694400, #    utc_start 1991-04-07 08:00:00 (Sun)
  62824230000, #      utc_end 1991-10-27 07:00:00 (Sun)
  62806676400, #  local_start 1991-04-07 03:00:00 (Sun)
  62824212000, #    local_end 1991-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62824230000, #    utc_start 1991-10-27 07:00:00 (Sun)
  62838144000, #      utc_end 1992-04-05 08:00:00 (Sun)
  62824208400, #  local_start 1991-10-27 01:00:00 (Sun)
  62838122400, #    local_end 1992-04-05 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62838144000, #    utc_start 1992-04-05 08:00:00 (Sun)
  62855679600, #      utc_end 1992-10-25 07:00:00 (Sun)
  62838126000, #  local_start 1992-04-05 03:00:00 (Sun)
  62855661600, #    local_end 1992-10-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62855679600, #    utc_start 1992-10-25 07:00:00 (Sun)
  62869593600, #      utc_end 1993-04-04 08:00:00 (Sun)
  62855658000, #  local_start 1992-10-25 01:00:00 (Sun)
  62869572000, #    local_end 1993-04-04 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62869593600, #    utc_start 1993-04-04 08:00:00 (Sun)
  62887734000, #      utc_end 1993-10-31 07:00:00 (Sun)
  62869575600, #  local_start 1993-04-04 03:00:00 (Sun)
  62887716000, #    local_end 1993-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62887734000, #    utc_start 1993-10-31 07:00:00 (Sun)
  62901043200, #      utc_end 1994-04-03 08:00:00 (Sun)
  62887712400, #  local_start 1993-10-31 01:00:00 (Sun)
  62901021600, #    local_end 1994-04-03 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62901043200, #    utc_start 1994-04-03 08:00:00 (Sun)
  62919183600, #      utc_end 1994-10-30 07:00:00 (Sun)
  62901025200, #  local_start 1994-04-03 03:00:00 (Sun)
  62919165600, #    local_end 1994-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62919183600, #    utc_start 1994-10-30 07:00:00 (Sun)
  62932492800, #      utc_end 1995-04-02 08:00:00 (Sun)
  62919162000, #  local_start 1994-10-30 01:00:00 (Sun)
  62932471200, #    local_end 1995-04-02 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62932492800, #    utc_start 1995-04-02 08:00:00 (Sun)
  62950633200, #      utc_end 1995-10-29 07:00:00 (Sun)
  62932474800, #  local_start 1995-04-02 03:00:00 (Sun)
  62950615200, #    local_end 1995-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62950633200, #    utc_start 1995-10-29 07:00:00 (Sun)
  62964547200, #      utc_end 1996-04-07 08:00:00 (Sun)
  62950611600, #  local_start 1995-10-29 01:00:00 (Sun)
  62964525600, #    local_end 1996-04-07 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62964547200, #    utc_start 1996-04-07 08:00:00 (Sun)
  62982082800, #      utc_end 1996-10-27 07:00:00 (Sun)
  62964529200, #  local_start 1996-04-07 03:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62982082800, #    utc_start 1996-10-27 07:00:00 (Sun)
  62995996800, #      utc_end 1997-04-06 08:00:00 (Sun)
  62982061200, #  local_start 1996-10-27 01:00:00 (Sun)
  62995975200, #    local_end 1997-04-06 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62995996800, #    utc_start 1997-04-06 08:00:00 (Sun)
  63013532400, #      utc_end 1997-10-26 07:00:00 (Sun)
  62995978800, #  local_start 1997-04-06 03:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63013532400, #    utc_start 1997-10-26 07:00:00 (Sun)
  63027446400, #      utc_end 1998-04-05 08:00:00 (Sun)
  63013510800, #  local_start 1997-10-26 01:00:00 (Sun)
  63027424800, #    local_end 1998-04-05 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63027446400, #    utc_start 1998-04-05 08:00:00 (Sun)
  63044982000, #      utc_end 1998-10-25 07:00:00 (Sun)
  63027428400, #  local_start 1998-04-05 03:00:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63044982000, #    utc_start 1998-10-25 07:00:00 (Sun)
  63058896000, #      utc_end 1999-04-04 08:00:00 (Sun)
  63044960400, #  local_start 1998-10-25 01:00:00 (Sun)
  63058874400, #    local_end 1999-04-04 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63058896000, #    utc_start 1999-04-04 08:00:00 (Sun)
  63077036400, #      utc_end 1999-10-31 07:00:00 (Sun)
  63058878000, #  local_start 1999-04-04 03:00:00 (Sun)
  63077018400, #    local_end 1999-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63077036400, #    utc_start 1999-10-31 07:00:00 (Sun)
  63090345600, #      utc_end 2000-04-02 08:00:00 (Sun)
  63077014800, #  local_start 1999-10-31 01:00:00 (Sun)
  63090324000, #    local_end 2000-04-02 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63090345600, #    utc_start 2000-04-02 08:00:00 (Sun)
  63108486000, #      utc_end 2000-10-29 07:00:00 (Sun)
  63090327600, #  local_start 2000-04-02 03:00:00 (Sun)
  63108468000, #    local_end 2000-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63108486000, #    utc_start 2000-10-29 07:00:00 (Sun)
  63121795200, #      utc_end 2001-04-01 08:00:00 (Sun)
  63108468000, #  local_start 2000-10-29 02:00:00 (Sun)
  63121777200, #    local_end 2001-04-01 03:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63121795200, #    utc_start 2001-04-01 08:00:00 (Sun)
  63139935600, #      utc_end 2001-10-28 07:00:00 (Sun)
  63121777200, #  local_start 2001-04-01 03:00:00 (Sun)
  63139917600, #    local_end 2001-10-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63139935600, #    utc_start 2001-10-28 07:00:00 (Sun)
  63153849600, #      utc_end 2002-04-07 08:00:00 (Sun)
  63139914000, #  local_start 2001-10-28 01:00:00 (Sun)
  63153828000, #    local_end 2002-04-07 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63153849600, #    utc_start 2002-04-07 08:00:00 (Sun)
  63171385200, #      utc_end 2002-10-27 07:00:00 (Sun)
  63153831600, #  local_start 2002-04-07 03:00:00 (Sun)
  63171367200, #    local_end 2002-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63171385200, #    utc_start 2002-10-27 07:00:00 (Sun)
  63185299200, #      utc_end 2003-04-06 08:00:00 (Sun)
  63171363600, #  local_start 2002-10-27 01:00:00 (Sun)
  63185277600, #    local_end 2003-04-06 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63185299200, #    utc_start 2003-04-06 08:00:00 (Sun)
  63202834800, #      utc_end 2003-10-26 07:00:00 (Sun)
  63185281200, #  local_start 2003-04-06 03:00:00 (Sun)
  63202816800, #    local_end 2003-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63202834800, #    utc_start 2003-10-26 07:00:00 (Sun)
  63216748800, #      utc_end 2004-04-04 08:00:00 (Sun)
  63202813200, #  local_start 2003-10-26 01:00:00 (Sun)
  63216727200, #    local_end 2004-04-04 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63216748800, #    utc_start 2004-04-04 08:00:00 (Sun)
  63234889200, #      utc_end 2004-10-31 07:00:00 (Sun)
  63216730800, #  local_start 2004-04-04 03:00:00 (Sun)
  63234871200, #    local_end 2004-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63234889200, #    utc_start 2004-10-31 07:00:00 (Sun)
  63248198400, #      utc_end 2005-04-03 08:00:00 (Sun)
  63234867600, #  local_start 2004-10-31 01:00:00 (Sun)
  63248176800, #    local_end 2005-04-03 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63248198400, #    utc_start 2005-04-03 08:00:00 (Sun)
  63266338800, #      utc_end 2005-10-30 07:00:00 (Sun)
  63248180400, #  local_start 2005-04-03 03:00:00 (Sun)
  63266320800, #    local_end 2005-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63266338800, #    utc_start 2005-10-30 07:00:00 (Sun)
  63279648000, #      utc_end 2006-04-02 08:00:00 (Sun)
  63266317200, #  local_start 2005-10-30 01:00:00 (Sun)
  63279626400, #    local_end 2006-04-02 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63279648000, #    utc_start 2006-04-02 08:00:00 (Sun)
  63297788400, #      utc_end 2006-10-29 07:00:00 (Sun)
  63279630000, #  local_start 2006-04-02 03:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63297788400, #    utc_start 2006-10-29 07:00:00 (Sun)
  63309283200, #      utc_end 2007-03-11 08:00:00 (Sun)
  63297770400, #  local_start 2006-10-29 02:00:00 (Sun)
  63309265200, #    local_end 2007-03-11 03:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63309283200, #    utc_start 2007-03-11 08:00:00 (Sun)
  63329842800, #      utc_end 2007-11-04 07:00:00 (Sun)
  63309265200, #  local_start 2007-03-11 03:00:00 (Sun)
  63329824800, #    local_end 2007-11-04 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63329842800, #    utc_start 2007-11-04 07:00:00 (Sun)
  63340732800, #      utc_end 2008-03-09 08:00:00 (Sun)
  63329821200, #  local_start 2007-11-04 01:00:00 (Sun)
  63340711200, #    local_end 2008-03-09 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63340732800, #    utc_start 2008-03-09 08:00:00 (Sun)
  63361292400, #      utc_end 2008-11-02 07:00:00 (Sun)
  63340714800, #  local_start 2008-03-09 03:00:00 (Sun)
  63361274400, #    local_end 2008-11-02 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63361292400, #    utc_start 2008-11-02 07:00:00 (Sun)
  63372182400, #      utc_end 2009-03-08 08:00:00 (Sun)
  63361270800, #  local_start 2008-11-02 01:00:00 (Sun)
  63372160800, #    local_end 2009-03-08 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63372182400, #    utc_start 2009-03-08 08:00:00 (Sun)
  63392742000, #      utc_end 2009-11-01 07:00:00 (Sun)
  63372164400, #  local_start 2009-03-08 03:00:00 (Sun)
  63392724000, #    local_end 2009-11-01 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63392742000, #    utc_start 2009-11-01 07:00:00 (Sun)
  63404236800, #      utc_end 2010-03-14 08:00:00 (Sun)
  63392720400, #  local_start 2009-11-01 01:00:00 (Sun)
  63404215200, #    local_end 2010-03-14 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63404236800, #    utc_start 2010-03-14 08:00:00 (Sun)
  63424796400, #      utc_end 2010-11-07 07:00:00 (Sun)
  63404218800, #  local_start 2010-03-14 03:00:00 (Sun)
  63424778400, #    local_end 2010-11-07 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63424796400, #    utc_start 2010-11-07 07:00:00 (Sun)
  63435686400, #      utc_end 2011-03-13 08:00:00 (Sun)
  63424774800, #  local_start 2010-11-07 01:00:00 (Sun)
  63435664800, #    local_end 2011-03-13 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63435686400, #    utc_start 2011-03-13 08:00:00 (Sun)
  63456246000, #      utc_end 2011-11-06 07:00:00 (Sun)
  63435668400, #  local_start 2011-03-13 03:00:00 (Sun)
  63456228000, #    local_end 2011-11-06 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63456246000, #    utc_start 2011-11-06 07:00:00 (Sun)
  63467136000, #      utc_end 2012-03-11 08:00:00 (Sun)
  63456224400, #  local_start 2011-11-06 01:00:00 (Sun)
  63467114400, #    local_end 2012-03-11 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63467136000, #    utc_start 2012-03-11 08:00:00 (Sun)
  63487695600, #      utc_end 2012-11-04 07:00:00 (Sun)
  63467118000, #  local_start 2012-03-11 03:00:00 (Sun)
  63487677600, #    local_end 2012-11-04 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63487695600, #    utc_start 2012-11-04 07:00:00 (Sun)
  63498585600, #      utc_end 2013-03-10 08:00:00 (Sun)
  63487674000, #  local_start 2012-11-04 01:00:00 (Sun)
  63498564000, #    local_end 2013-03-10 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63498585600, #    utc_start 2013-03-10 08:00:00 (Sun)
  63519145200, #      utc_end 2013-11-03 07:00:00 (Sun)
  63498567600, #  local_start 2013-03-10 03:00:00 (Sun)
  63519127200, #    local_end 2013-11-03 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63519145200, #    utc_start 2013-11-03 07:00:00 (Sun)
  63530035200, #      utc_end 2014-03-09 08:00:00 (Sun)
  63519123600, #  local_start 2013-11-03 01:00:00 (Sun)
  63530013600, #    local_end 2014-03-09 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63530035200, #    utc_start 2014-03-09 08:00:00 (Sun)
  63550594800, #      utc_end 2014-11-02 07:00:00 (Sun)
  63530017200, #  local_start 2014-03-09 03:00:00 (Sun)
  63550576800, #    local_end 2014-11-02 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63550594800, #    utc_start 2014-11-02 07:00:00 (Sun)
  63561484800, #      utc_end 2015-03-08 08:00:00 (Sun)
  63550573200, #  local_start 2014-11-02 01:00:00 (Sun)
  63561463200, #    local_end 2015-03-08 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63561484800, #    utc_start 2015-03-08 08:00:00 (Sun)
  63582044400, #      utc_end 2015-11-01 07:00:00 (Sun)
  63561466800, #  local_start 2015-03-08 03:00:00 (Sun)
  63582026400, #    local_end 2015-11-01 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63582044400, #    utc_start 2015-11-01 07:00:00 (Sun)
  63593539200, #      utc_end 2016-03-13 08:00:00 (Sun)
  63582022800, #  local_start 2015-11-01 01:00:00 (Sun)
  63593517600, #    local_end 2016-03-13 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63593539200, #    utc_start 2016-03-13 08:00:00 (Sun)
  63614098800, #      utc_end 2016-11-06 07:00:00 (Sun)
  63593521200, #  local_start 2016-03-13 03:00:00 (Sun)
  63614080800, #    local_end 2016-11-06 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63614098800, #    utc_start 2016-11-06 07:00:00 (Sun)
  63624988800, #      utc_end 2017-03-12 08:00:00 (Sun)
  63614077200, #  local_start 2016-11-06 01:00:00 (Sun)
  63624967200, #    local_end 2017-03-12 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63624988800, #    utc_start 2017-03-12 08:00:00 (Sun)
  63645548400, #      utc_end 2017-11-05 07:00:00 (Sun)
  63624970800, #  local_start 2017-03-12 03:00:00 (Sun)
  63645530400, #    local_end 2017-11-05 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63645548400, #    utc_start 2017-11-05 07:00:00 (Sun)
  63656438400, #      utc_end 2018-03-11 08:00:00 (Sun)
  63645526800, #  local_start 2017-11-05 01:00:00 (Sun)
  63656416800, #    local_end 2018-03-11 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63656438400, #    utc_start 2018-03-11 08:00:00 (Sun)
  63676998000, #      utc_end 2018-11-04 07:00:00 (Sun)
  63656420400, #  local_start 2018-03-11 03:00:00 (Sun)
  63676980000, #    local_end 2018-11-04 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63676998000, #    utc_start 2018-11-04 07:00:00 (Sun)
  63687888000, #      utc_end 2019-03-10 08:00:00 (Sun)
  63676976400, #  local_start 2018-11-04 01:00:00 (Sun)
  63687866400, #    local_end 2019-03-10 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63687888000, #    utc_start 2019-03-10 08:00:00 (Sun)
  63708447600, #      utc_end 2019-11-03 07:00:00 (Sun)
  63687870000, #  local_start 2019-03-10 03:00:00 (Sun)
  63708429600, #    local_end 2019-11-03 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63708447600, #    utc_start 2019-11-03 07:00:00 (Sun)
  63719337600, #      utc_end 2020-03-08 08:00:00 (Sun)
  63708426000, #  local_start 2019-11-03 01:00:00 (Sun)
  63719316000, #    local_end 2020-03-08 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63719337600, #    utc_start 2020-03-08 08:00:00 (Sun)
  63739897200, #      utc_end 2020-11-01 07:00:00 (Sun)
  63719319600, #  local_start 2020-03-08 03:00:00 (Sun)
  63739879200, #    local_end 2020-11-01 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63739897200, #    utc_start 2020-11-01 07:00:00 (Sun)
  63751392000, #      utc_end 2021-03-14 08:00:00 (Sun)
  63739875600, #  local_start 2020-11-01 01:00:00 (Sun)
  63751370400, #    local_end 2021-03-14 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63751392000, #    utc_start 2021-03-14 08:00:00 (Sun)
  63771951600, #      utc_end 2021-11-07 07:00:00 (Sun)
  63751374000, #  local_start 2021-03-14 03:00:00 (Sun)
  63771933600, #    local_end 2021-11-07 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63771951600, #    utc_start 2021-11-07 07:00:00 (Sun)
  63782841600, #      utc_end 2022-03-13 08:00:00 (Sun)
  63771930000, #  local_start 2021-11-07 01:00:00 (Sun)
  63782820000, #    local_end 2022-03-13 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63782841600, #    utc_start 2022-03-13 08:00:00 (Sun)
  63803401200, #      utc_end 2022-11-06 07:00:00 (Sun)
  63782823600, #  local_start 2022-03-13 03:00:00 (Sun)
  63803383200, #    local_end 2022-11-06 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63803401200, #    utc_start 2022-11-06 07:00:00 (Sun)
  63814291200, #      utc_end 2023-03-12 08:00:00 (Sun)
  63803379600, #  local_start 2022-11-06 01:00:00 (Sun)
  63814269600, #    local_end 2023-03-12 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63814291200, #    utc_start 2023-03-12 08:00:00 (Sun)
  63834850800, #      utc_end 2023-11-05 07:00:00 (Sun)
  63814273200, #  local_start 2023-03-12 03:00:00 (Sun)
  63834832800, #    local_end 2023-11-05 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63834850800, #    utc_start 2023-11-05 07:00:00 (Sun)
  63845740800, #      utc_end 2024-03-10 08:00:00 (Sun)
  63834829200, #  local_start 2023-11-05 01:00:00 (Sun)
  63845719200, #    local_end 2024-03-10 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63845740800, #    utc_start 2024-03-10 08:00:00 (Sun)
  63866300400, #      utc_end 2024-11-03 07:00:00 (Sun)
  63845722800, #  local_start 2024-03-10 03:00:00 (Sun)
  63866282400, #    local_end 2024-11-03 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63866300400, #    utc_start 2024-11-03 07:00:00 (Sun)
  63877190400, #      utc_end 2025-03-09 08:00:00 (Sun)
  63866278800, #  local_start 2024-11-03 01:00:00 (Sun)
  63877168800, #    local_end 2025-03-09 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63877190400, #    utc_start 2025-03-09 08:00:00 (Sun)
  63897750000, #      utc_end 2025-11-02 07:00:00 (Sun)
  63877172400, #  local_start 2025-03-09 03:00:00 (Sun)
  63897732000, #    local_end 2025-11-02 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63897750000, #    utc_start 2025-11-02 07:00:00 (Sun)
  63908640000, #      utc_end 2026-03-08 08:00:00 (Sun)
  63897728400, #  local_start 2025-11-02 01:00:00 (Sun)
  63908618400, #    local_end 2026-03-08 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63908640000, #    utc_start 2026-03-08 08:00:00 (Sun)
  63929199600, #      utc_end 2026-11-01 07:00:00 (Sun)
  63908622000, #  local_start 2026-03-08 03:00:00 (Sun)
  63929181600, #    local_end 2026-11-01 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63929199600, #    utc_start 2026-11-01 07:00:00 (Sun)
  63940694400, #      utc_end 2027-03-14 08:00:00 (Sun)
  63929178000, #  local_start 2026-11-01 01:00:00 (Sun)
  63940672800, #    local_end 2027-03-14 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63940694400, #    utc_start 2027-03-14 08:00:00 (Sun)
  63961254000, #      utc_end 2027-11-07 07:00:00 (Sun)
  63940676400, #  local_start 2027-03-14 03:00:00 (Sun)
  63961236000, #    local_end 2027-11-07 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63961254000, #    utc_start 2027-11-07 07:00:00 (Sun)
  63972144000, #      utc_end 2028-03-12 08:00:00 (Sun)
  63961232400, #  local_start 2027-11-07 01:00:00 (Sun)
  63972122400, #    local_end 2028-03-12 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63972144000, #    utc_start 2028-03-12 08:00:00 (Sun)
  63992703600, #      utc_end 2028-11-05 07:00:00 (Sun)
  63972126000, #  local_start 2028-03-12 03:00:00 (Sun)
  63992685600, #    local_end 2028-11-05 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63992703600, #    utc_start 2028-11-05 07:00:00 (Sun)
  64003593600, #      utc_end 2029-03-11 08:00:00 (Sun)
  63992682000, #  local_start 2028-11-05 01:00:00 (Sun)
  64003572000, #    local_end 2029-03-11 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  64003593600, #    utc_start 2029-03-11 08:00:00 (Sun)
  64024153200, #      utc_end 2029-11-04 07:00:00 (Sun)
  64003575600, #  local_start 2029-03-11 03:00:00 (Sun)
  64024135200, #    local_end 2029-11-04 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  64024153200, #    utc_start 2029-11-04 07:00:00 (Sun)
  64035043200, #      utc_end 2030-03-10 08:00:00 (Sun)
  64024131600, #  local_start 2029-11-04 01:00:00 (Sun)
  64035021600, #    local_end 2030-03-10 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  64035043200, #    utc_start 2030-03-10 08:00:00 (Sun)
  64055602800, #      utc_end 2030-11-03 07:00:00 (Sun)
  64035025200, #  local_start 2030-03-10 03:00:00 (Sun)
  64055584800, #    local_end 2030-11-03 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {52}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -21600 }
  
  my $last_observance = bless( {
    'format' => 'C%sT',
    'gmtoff' => '-6:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 732746,
      'local_rd_secs' => 10800,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 732746,
      'utc_rd_secs' => 10800,
      'utc_year' => 2008
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -21600,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 732746,
      'local_rd_secs' => 28800,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 732746,
      'utc_rd_secs' => 28800,
      'utc_year' => 2008
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Mar',
      'letter' => 'D',
      'name' => 'Canada',
      'offset_from_std' => 3600,
      'on' => 'Sun>=8',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Nov',
      'letter' => 'S',
      'name' => 'Canada',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_RESOLUTE

    $main::fatpacked{"DateTime/TimeZone/America/Rio_Branco.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_RIO_BRANCO';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/southamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Rio_Branco;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Rio_Branco::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60368473872, #      utc_end 1914-01-01 04:31:12 (Thu)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60368457600, #    local_end 1914-01-01 00:00:00 (Thu)
  -16272,
  0,
  'LMT',
      ],
      [
  60368473872, #    utc_start 1914-01-01 04:31:12 (Thu)
  60928732800, #      utc_end 1931-10-03 16:00:00 (Sat)
  60368455872, #  local_start 1913-12-31 23:31:12 (Wed)
  60928714800, #    local_end 1931-10-03 11:00:00 (Sat)
  -18000,
  0,
  '-05',
      ],
      [
  60928732800, #    utc_start 1931-10-03 16:00:00 (Sat)
  60944328000, #      utc_end 1932-04-01 04:00:00 (Fri)
  60928718400, #  local_start 1931-10-03 12:00:00 (Sat)
  60944313600, #    local_end 1932-04-01 00:00:00 (Fri)
  -14400,
  1,
  '-04',
      ],
      [
  60944328000, #    utc_start 1932-04-01 04:00:00 (Fri)
  60960315600, #      utc_end 1932-10-03 05:00:00 (Mon)
  60944310000, #  local_start 1932-03-31 23:00:00 (Thu)
  60960297600, #    local_end 1932-10-03 00:00:00 (Mon)
  -18000,
  0,
  '-05',
      ],
      [
  60960315600, #    utc_start 1932-10-03 05:00:00 (Mon)
  60975864000, #      utc_end 1933-04-01 04:00:00 (Sat)
  60960301200, #  local_start 1932-10-03 01:00:00 (Mon)
  60975849600, #    local_end 1933-04-01 00:00:00 (Sat)
  -14400,
  1,
  '-04',
      ],
      [
  60975864000, #    utc_start 1933-04-01 04:00:00 (Sat)
  61501870800, #      utc_end 1949-12-01 05:00:00 (Thu)
  60975846000, #  local_start 1933-03-31 23:00:00 (Fri)
  61501852800, #    local_end 1949-12-01 00:00:00 (Thu)
  -18000,
  0,
  '-05',
      ],
      [
  61501870800, #    utc_start 1949-12-01 05:00:00 (Thu)
  61513621200, #      utc_end 1950-04-16 05:00:00 (Sun)
  61501856400, #  local_start 1949-12-01 01:00:00 (Thu)
  61513606800, #    local_end 1950-04-16 01:00:00 (Sun)
  -14400,
  1,
  '-04',
      ],
      [
  61513621200, #    utc_start 1950-04-16 05:00:00 (Sun)
  61533406800, #      utc_end 1950-12-01 05:00:00 (Fri)
  61513603200, #  local_start 1950-04-16 00:00:00 (Sun)
  61533388800, #    local_end 1950-12-01 00:00:00 (Fri)
  -18000,
  0,
  '-05',
      ],
      [
  61533406800, #    utc_start 1950-12-01 05:00:00 (Fri)
  61543857600, #      utc_end 1951-04-01 04:00:00 (Sun)
  61533392400, #  local_start 1950-12-01 01:00:00 (Fri)
  61543843200, #    local_end 1951-04-01 00:00:00 (Sun)
  -14400,
  1,
  '-04',
      ],
      [
  61543857600, #    utc_start 1951-04-01 04:00:00 (Sun)
  61564942800, #      utc_end 1951-12-01 05:00:00 (Sat)
  61543839600, #  local_start 1951-03-31 23:00:00 (Sat)
  61564924800, #    local_end 1951-12-01 00:00:00 (Sat)
  -18000,
  0,
  '-05',
      ],
      [
  61564942800, #    utc_start 1951-12-01 05:00:00 (Sat)
  61575480000, #      utc_end 1952-04-01 04:00:00 (Tue)
  61564928400, #  local_start 1951-12-01 01:00:00 (Sat)
  61575465600, #    local_end 1952-04-01 00:00:00 (Tue)
  -14400,
  1,
  '-04',
      ],
      [
  61575480000, #    utc_start 1952-04-01 04:00:00 (Tue)
  61596565200, #      utc_end 1952-12-01 05:00:00 (Mon)
  61575462000, #  local_start 1952-03-31 23:00:00 (Mon)
  61596547200, #    local_end 1952-12-01 00:00:00 (Mon)
  -18000,
  0,
  '-05',
      ],
      [
  61596565200, #    utc_start 1952-12-01 05:00:00 (Mon)
  61604337600, #      utc_end 1953-03-01 04:00:00 (Sun)
  61596550800, #  local_start 1952-12-01 01:00:00 (Mon)
  61604323200, #    local_end 1953-03-01 00:00:00 (Sun)
  -14400,
  1,
  '-04',
      ],
      [
  61604337600, #    utc_start 1953-03-01 04:00:00 (Sun)
  61944325200, #      utc_end 1963-12-09 05:00:00 (Mon)
  61604319600, #  local_start 1953-02-28 23:00:00 (Sat)
  61944307200, #    local_end 1963-12-09 00:00:00 (Mon)
  -18000,
  0,
  '-05',
      ],
      [
  61944325200, #    utc_start 1963-12-09 05:00:00 (Mon)
  61951492800, #      utc_end 1964-03-01 04:00:00 (Sun)
  61944310800, #  local_start 1963-12-09 01:00:00 (Mon)
  61951478400, #    local_end 1964-03-01 00:00:00 (Sun)
  -14400,
  1,
  '-04',
      ],
      [
  61951492800, #    utc_start 1964-03-01 04:00:00 (Sun)
  61980526800, #      utc_end 1965-01-31 05:00:00 (Sun)
  61951474800, #  local_start 1964-02-29 23:00:00 (Sat)
  61980508800, #    local_end 1965-01-31 00:00:00 (Sun)
  -18000,
  0,
  '-05',
      ],
      [
  61980526800, #    utc_start 1965-01-31 05:00:00 (Sun)
  61985620800, #      utc_end 1965-03-31 04:00:00 (Wed)
  61980512400, #  local_start 1965-01-31 01:00:00 (Sun)
  61985606400, #    local_end 1965-03-31 00:00:00 (Wed)
  -14400,
  1,
  '-04',
      ],
      [
  61985620800, #    utc_start 1965-03-31 04:00:00 (Wed)
  62006792400, #      utc_end 1965-12-01 05:00:00 (Wed)
  61985602800, #  local_start 1965-03-30 23:00:00 (Tue)
  62006774400, #    local_end 1965-12-01 00:00:00 (Wed)
  -18000,
  0,
  '-05',
      ],
      [
  62006792400, #    utc_start 1965-12-01 05:00:00 (Wed)
  62014564800, #      utc_end 1966-03-01 04:00:00 (Tue)
  62006778000, #  local_start 1965-12-01 01:00:00 (Wed)
  62014550400, #    local_end 1966-03-01 00:00:00 (Tue)
  -14400,
  1,
  '-04',
      ],
      [
  62014564800, #    utc_start 1966-03-01 04:00:00 (Tue)
  62035736400, #      utc_end 1966-11-01 05:00:00 (Tue)
  62014546800, #  local_start 1966-02-28 23:00:00 (Mon)
  62035718400, #    local_end 1966-11-01 00:00:00 (Tue)
  -18000,
  0,
  '-05',
      ],
      [
  62035736400, #    utc_start 1966-11-01 05:00:00 (Tue)
  62046100800, #      utc_end 1967-03-01 04:00:00 (Wed)
  62035722000, #  local_start 1966-11-01 01:00:00 (Tue)
  62046086400, #    local_end 1967-03-01 00:00:00 (Wed)
  -14400,
  1,
  '-04',
      ],
      [
  62046100800, #    utc_start 1967-03-01 04:00:00 (Wed)
  62067272400, #      utc_end 1967-11-01 05:00:00 (Wed)
  62046082800, #  local_start 1967-02-28 23:00:00 (Tue)
  62067254400, #    local_end 1967-11-01 00:00:00 (Wed)
  -18000,
  0,
  '-05',
      ],
      [
  62067272400, #    utc_start 1967-11-01 05:00:00 (Wed)
  62077723200, #      utc_end 1968-03-01 04:00:00 (Fri)
  62067258000, #  local_start 1967-11-01 01:00:00 (Wed)
  62077708800, #    local_end 1968-03-01 00:00:00 (Fri)
  -14400,
  1,
  '-04',
      ],
      [
  62077723200, #    utc_start 1968-03-01 04:00:00 (Fri)
  62635438800, #      utc_end 1985-11-02 05:00:00 (Sat)
  62077705200, #  local_start 1968-02-29 23:00:00 (Thu)
  62635420800, #    local_end 1985-11-02 00:00:00 (Sat)
  -18000,
  0,
  '-05',
      ],
      [
  62635438800, #    utc_start 1985-11-02 05:00:00 (Sat)
  62646926400, #      utc_end 1986-03-15 04:00:00 (Sat)
  62635424400, #  local_start 1985-11-02 01:00:00 (Sat)
  62646912000, #    local_end 1986-03-15 00:00:00 (Sat)
  -14400,
  1,
  '-04',
      ],
      [
  62646926400, #    utc_start 1986-03-15 04:00:00 (Sat)
  62666283600, #      utc_end 1986-10-25 05:00:00 (Sat)
  62646908400, #  local_start 1986-03-14 23:00:00 (Fri)
  62666265600, #    local_end 1986-10-25 00:00:00 (Sat)
  -18000,
  0,
  '-05',
      ],
      [
  62666283600, #    utc_start 1986-10-25 05:00:00 (Sat)
  62675956800, #      utc_end 1987-02-14 04:00:00 (Sat)
  62666269200, #  local_start 1986-10-25 01:00:00 (Sat)
  62675942400, #    local_end 1987-02-14 00:00:00 (Sat)
  -14400,
  1,
  '-04',
      ],
      [
  62675956800, #    utc_start 1987-02-14 04:00:00 (Sat)
  62697819600, #      utc_end 1987-10-25 05:00:00 (Sun)
  62675938800, #  local_start 1987-02-13 23:00:00 (Fri)
  62697801600, #    local_end 1987-10-25 00:00:00 (Sun)
  -18000,
  0,
  '-05',
      ],
      [
  62697819600, #    utc_start 1987-10-25 05:00:00 (Sun)
  62706888000, #      utc_end 1988-02-07 04:00:00 (Sun)
  62697805200, #  local_start 1987-10-25 01:00:00 (Sun)
  62706873600, #    local_end 1988-02-07 00:00:00 (Sun)
  -14400,
  1,
  '-04',
      ],
      [
  62706888000, #    utc_start 1988-02-07 04:00:00 (Sun)
  62725726800, #      utc_end 1988-09-12 05:00:00 (Mon)
  62706870000, #  local_start 1988-02-06 23:00:00 (Sat)
  62725708800, #    local_end 1988-09-12 00:00:00 (Mon)
  -18000,
  0,
  '-05',
      ],
      [
  62725726800, #    utc_start 1988-09-12 05:00:00 (Mon)
  63349966800, #      utc_end 2008-06-24 05:00:00 (Tue)
  62725708800, #  local_start 1988-09-12 00:00:00 (Mon)
  63349948800, #    local_end 2008-06-24 00:00:00 (Tue)
  -18000,
  0,
  '-05',
      ],
      [
  63349966800, #    utc_start 2008-06-24 05:00:00 (Tue)
  63519739200, #      utc_end 2013-11-10 04:00:00 (Sun)
  63349952400, #  local_start 2008-06-24 01:00:00 (Tue)
  63519724800, #    local_end 2013-11-10 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63519739200, #    utc_start 2013-11-10 04:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #      utc_end
  63519721200, #  local_start 2013-11-09 23:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #    local_end
  -18000,
  0,
  '-05',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {14}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_RIO_BRANCO

    $main::fatpacked{"DateTime/TimeZone/America/Santarem.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_SANTAREM';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/southamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Santarem;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Santarem::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60368470728, #      utc_end 1914-01-01 03:38:48 (Thu)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60368457600, #    local_end 1914-01-01 00:00:00 (Thu)
  -13128,
  0,
  'LMT',
      ],
      [
  60368470728, #    utc_start 1914-01-01 03:38:48 (Thu)
  60928729200, #      utc_end 1931-10-03 15:00:00 (Sat)
  60368456328, #  local_start 1913-12-31 23:38:48 (Wed)
  60928714800, #    local_end 1931-10-03 11:00:00 (Sat)
  -14400,
  0,
  '-04',
      ],
      [
  60928729200, #    utc_start 1931-10-03 15:00:00 (Sat)
  60944324400, #      utc_end 1932-04-01 03:00:00 (Fri)
  60928718400, #  local_start 1931-10-03 12:00:00 (Sat)
  60944313600, #    local_end 1932-04-01 00:00:00 (Fri)
  -10800,
  1,
  '-03',
      ],
      [
  60944324400, #    utc_start 1932-04-01 03:00:00 (Fri)
  60960312000, #      utc_end 1932-10-03 04:00:00 (Mon)
  60944310000, #  local_start 1932-03-31 23:00:00 (Thu)
  60960297600, #    local_end 1932-10-03 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  60960312000, #    utc_start 1932-10-03 04:00:00 (Mon)
  60975860400, #      utc_end 1933-04-01 03:00:00 (Sat)
  60960301200, #  local_start 1932-10-03 01:00:00 (Mon)
  60975849600, #    local_end 1933-04-01 00:00:00 (Sat)
  -10800,
  1,
  '-03',
      ],
      [
  60975860400, #    utc_start 1933-04-01 03:00:00 (Sat)
  61501867200, #      utc_end 1949-12-01 04:00:00 (Thu)
  60975846000, #  local_start 1933-03-31 23:00:00 (Fri)
  61501852800, #    local_end 1949-12-01 00:00:00 (Thu)
  -14400,
  0,
  '-04',
      ],
      [
  61501867200, #    utc_start 1949-12-01 04:00:00 (Thu)
  61513617600, #      utc_end 1950-04-16 04:00:00 (Sun)
  61501856400, #  local_start 1949-12-01 01:00:00 (Thu)
  61513606800, #    local_end 1950-04-16 01:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61513617600, #    utc_start 1950-04-16 04:00:00 (Sun)
  61533403200, #      utc_end 1950-12-01 04:00:00 (Fri)
  61513603200, #  local_start 1950-04-16 00:00:00 (Sun)
  61533388800, #    local_end 1950-12-01 00:00:00 (Fri)
  -14400,
  0,
  '-04',
      ],
      [
  61533403200, #    utc_start 1950-12-01 04:00:00 (Fri)
  61543854000, #      utc_end 1951-04-01 03:00:00 (Sun)
  61533392400, #  local_start 1950-12-01 01:00:00 (Fri)
  61543843200, #    local_end 1951-04-01 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61543854000, #    utc_start 1951-04-01 03:00:00 (Sun)
  61564939200, #      utc_end 1951-12-01 04:00:00 (Sat)
  61543839600, #  local_start 1951-03-31 23:00:00 (Sat)
  61564924800, #    local_end 1951-12-01 00:00:00 (Sat)
  -14400,
  0,
  '-04',
      ],
      [
  61564939200, #    utc_start 1951-12-01 04:00:00 (Sat)
  61575476400, #      utc_end 1952-04-01 03:00:00 (Tue)
  61564928400, #  local_start 1951-12-01 01:00:00 (Sat)
  61575465600, #    local_end 1952-04-01 00:00:00 (Tue)
  -10800,
  1,
  '-03',
      ],
      [
  61575476400, #    utc_start 1952-04-01 03:00:00 (Tue)
  61596561600, #      utc_end 1952-12-01 04:00:00 (Mon)
  61575462000, #  local_start 1952-03-31 23:00:00 (Mon)
  61596547200, #    local_end 1952-12-01 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  61596561600, #    utc_start 1952-12-01 04:00:00 (Mon)
  61604334000, #      utc_end 1953-03-01 03:00:00 (Sun)
  61596550800, #  local_start 1952-12-01 01:00:00 (Mon)
  61604323200, #    local_end 1953-03-01 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61604334000, #    utc_start 1953-03-01 03:00:00 (Sun)
  61944321600, #      utc_end 1963-12-09 04:00:00 (Mon)
  61604319600, #  local_start 1953-02-28 23:00:00 (Sat)
  61944307200, #    local_end 1963-12-09 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  61944321600, #    utc_start 1963-12-09 04:00:00 (Mon)
  61951489200, #      utc_end 1964-03-01 03:00:00 (Sun)
  61944310800, #  local_start 1963-12-09 01:00:00 (Mon)
  61951478400, #    local_end 1964-03-01 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61951489200, #    utc_start 1964-03-01 03:00:00 (Sun)
  61980523200, #      utc_end 1965-01-31 04:00:00 (Sun)
  61951474800, #  local_start 1964-02-29 23:00:00 (Sat)
  61980508800, #    local_end 1965-01-31 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  61980523200, #    utc_start 1965-01-31 04:00:00 (Sun)
  61985617200, #      utc_end 1965-03-31 03:00:00 (Wed)
  61980512400, #  local_start 1965-01-31 01:00:00 (Sun)
  61985606400, #    local_end 1965-03-31 00:00:00 (Wed)
  -10800,
  1,
  '-03',
      ],
      [
  61985617200, #    utc_start 1965-03-31 03:00:00 (Wed)
  62006788800, #      utc_end 1965-12-01 04:00:00 (Wed)
  61985602800, #  local_start 1965-03-30 23:00:00 (Tue)
  62006774400, #    local_end 1965-12-01 00:00:00 (Wed)
  -14400,
  0,
  '-04',
      ],
      [
  62006788800, #    utc_start 1965-12-01 04:00:00 (Wed)
  62014561200, #      utc_end 1966-03-01 03:00:00 (Tue)
  62006778000, #  local_start 1965-12-01 01:00:00 (Wed)
  62014550400, #    local_end 1966-03-01 00:00:00 (Tue)
  -10800,
  1,
  '-03',
      ],
      [
  62014561200, #    utc_start 1966-03-01 03:00:00 (Tue)
  62035732800, #      utc_end 1966-11-01 04:00:00 (Tue)
  62014546800, #  local_start 1966-02-28 23:00:00 (Mon)
  62035718400, #    local_end 1966-11-01 00:00:00 (Tue)
  -14400,
  0,
  '-04',
      ],
      [
  62035732800, #    utc_start 1966-11-01 04:00:00 (Tue)
  62046097200, #      utc_end 1967-03-01 03:00:00 (Wed)
  62035722000, #  local_start 1966-11-01 01:00:00 (Tue)
  62046086400, #    local_end 1967-03-01 00:00:00 (Wed)
  -10800,
  1,
  '-03',
      ],
      [
  62046097200, #    utc_start 1967-03-01 03:00:00 (Wed)
  62067268800, #      utc_end 1967-11-01 04:00:00 (Wed)
  62046082800, #  local_start 1967-02-28 23:00:00 (Tue)
  62067254400, #    local_end 1967-11-01 00:00:00 (Wed)
  -14400,
  0,
  '-04',
      ],
      [
  62067268800, #    utc_start 1967-11-01 04:00:00 (Wed)
  62077719600, #      utc_end 1968-03-01 03:00:00 (Fri)
  62067258000, #  local_start 1967-11-01 01:00:00 (Wed)
  62077708800, #    local_end 1968-03-01 00:00:00 (Fri)
  -10800,
  1,
  '-03',
      ],
      [
  62077719600, #    utc_start 1968-03-01 03:00:00 (Fri)
  62635435200, #      utc_end 1985-11-02 04:00:00 (Sat)
  62077705200, #  local_start 1968-02-29 23:00:00 (Thu)
  62635420800, #    local_end 1985-11-02 00:00:00 (Sat)
  -14400,
  0,
  '-04',
      ],
      [
  62635435200, #    utc_start 1985-11-02 04:00:00 (Sat)
  62646922800, #      utc_end 1986-03-15 03:00:00 (Sat)
  62635424400, #  local_start 1985-11-02 01:00:00 (Sat)
  62646912000, #    local_end 1986-03-15 00:00:00 (Sat)
  -10800,
  1,
  '-03',
      ],
      [
  62646922800, #    utc_start 1986-03-15 03:00:00 (Sat)
  62666280000, #      utc_end 1986-10-25 04:00:00 (Sat)
  62646908400, #  local_start 1986-03-14 23:00:00 (Fri)
  62666265600, #    local_end 1986-10-25 00:00:00 (Sat)
  -14400,
  0,
  '-04',
      ],
      [
  62666280000, #    utc_start 1986-10-25 04:00:00 (Sat)
  62675953200, #      utc_end 1987-02-14 03:00:00 (Sat)
  62666269200, #  local_start 1986-10-25 01:00:00 (Sat)
  62675942400, #    local_end 1987-02-14 00:00:00 (Sat)
  -10800,
  1,
  '-03',
      ],
      [
  62675953200, #    utc_start 1987-02-14 03:00:00 (Sat)
  62697816000, #      utc_end 1987-10-25 04:00:00 (Sun)
  62675938800, #  local_start 1987-02-13 23:00:00 (Fri)
  62697801600, #    local_end 1987-10-25 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62697816000, #    utc_start 1987-10-25 04:00:00 (Sun)
  62706884400, #      utc_end 1988-02-07 03:00:00 (Sun)
  62697805200, #  local_start 1987-10-25 01:00:00 (Sun)
  62706873600, #    local_end 1988-02-07 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62706884400, #    utc_start 1988-02-07 03:00:00 (Sun)
  62725723200, #      utc_end 1988-09-12 04:00:00 (Mon)
  62706870000, #  local_start 1988-02-06 23:00:00 (Sat)
  62725708800, #    local_end 1988-09-12 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  62725723200, #    utc_start 1988-09-12 04:00:00 (Mon)
  63349963200, #      utc_end 2008-06-24 04:00:00 (Tue)
  62725708800, #  local_start 1988-09-12 00:00:00 (Mon)
  63349948800, #    local_end 2008-06-24 00:00:00 (Tue)
  -14400,
  0,
  '-04',
      ],
      [
  63349963200, #    utc_start 2008-06-24 04:00:00 (Tue)
  DateTime::TimeZone::INFINITY, #      utc_end
  63349952400, #  local_start 2008-06-24 01:00:00 (Tue)
  DateTime::TimeZone::INFINITY, #    local_end
  -10800,
  0,
  '-03',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {14}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_SANTAREM

    $main::fatpacked{"DateTime/TimeZone/America/Santiago.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_SANTIAGO';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/southamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Santiago;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Santiago::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59611178566, #      utc_end 1890-01-01 04:42:46 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59611161600, #    local_end 1890-01-01 00:00:00 (Wed)
  -16966,
  0,
  'LMT',
      ],
      [
  59611178566, #    utc_start 1890-01-01 04:42:46 (Wed)
  60243021766, #      utc_end 1910-01-10 04:42:46 (Mon)
  59611161600, #  local_start 1890-01-01 00:00:00 (Wed)
  60243004800, #    local_end 1910-01-10 00:00:00 (Mon)
  -16966,
  0,
  'SMT',
      ],
      [
  60243021766, #    utc_start 1910-01-10 04:42:46 (Mon)
  60447272400, #      utc_end 1916-07-01 05:00:00 (Sat)
  60243003766, #  local_start 1910-01-09 23:42:46 (Sun)
  60447254400, #    local_end 1916-07-01 00:00:00 (Sat)
  -18000,
  0,
  '-05',
      ],
      [
  60447272400, #    utc_start 1916-07-01 05:00:00 (Sat)
  60516477766, #      utc_end 1918-09-10 04:42:46 (Tue)
  60447255434, #  local_start 1916-07-01 00:17:14 (Sat)
  60516460800, #    local_end 1918-09-10 00:00:00 (Tue)
  -16966,
  0,
  'SMT',
      ],
      [
  60516477766, #    utc_start 1918-09-10 04:42:46 (Tue)
  60541876800, #      utc_end 1919-07-01 04:00:00 (Tue)
  60516463366, #  local_start 1918-09-10 00:42:46 (Tue)
  60541862400, #    local_end 1919-07-01 00:00:00 (Tue)
  -14400,
  0,
  '-04',
      ],
      [
  60541876800, #    utc_start 1919-07-01 04:00:00 (Tue)
  60799696966, #      utc_end 1927-09-01 04:42:46 (Thu)
  60541859834, #  local_start 1919-06-30 23:17:14 (Mon)
  60799680000, #    local_end 1927-09-01 00:00:00 (Thu)
  -16966,
  0,
  'SMT',
      ],
      [
  60799696966, #    utc_start 1927-09-01 04:42:46 (Thu)
  60818097600, #      utc_end 1928-04-01 04:00:00 (Sun)
  60799682566, #  local_start 1927-09-01 00:42:46 (Thu)
  60818083200, #    local_end 1928-04-01 00:00:00 (Sun)
  -14400,
  1,
  '-04',
      ],
      [
  60818097600, #    utc_start 1928-04-01 04:00:00 (Sun)
  60831320400, #      utc_end 1928-09-01 05:00:00 (Sat)
  60818079600, #  local_start 1928-03-31 23:00:00 (Sat)
  60831302400, #    local_end 1928-09-01 00:00:00 (Sat)
  -18000,
  0,
  '-05',
      ],
      [
  60831320400, #    utc_start 1928-09-01 05:00:00 (Sat)
  60849633600, #      utc_end 1929-04-01 04:00:00 (Mon)
  60831306000, #  local_start 1928-09-01 01:00:00 (Sat)
  60849619200, #    local_end 1929-04-01 00:00:00 (Mon)
  -14400,
  1,
  '-04',
      ],
      [
  60849633600, #    utc_start 1929-04-01 04:00:00 (Mon)
  60862856400, #      utc_end 1929-09-01 05:00:00 (Sun)
  60849615600, #  local_start 1929-03-31 23:00:00 (Sun)
  60862838400, #    local_end 1929-09-01 00:00:00 (Sun)
  -18000,
  0,
  '-05',
      ],
      [
  60862856400, #    utc_start 1929-09-01 05:00:00 (Sun)
  60881169600, #      utc_end 1930-04-01 04:00:00 (Tue)
  60862842000, #  local_start 1929-09-01 01:00:00 (Sun)
  60881155200, #    local_end 1930-04-01 00:00:00 (Tue)
  -14400,
  1,
  '-04',
      ],
      [
  60881169600, #    utc_start 1930-04-01 04:00:00 (Tue)
  60894392400, #      utc_end 1930-09-01 05:00:00 (Mon)
  60881151600, #  local_start 1930-03-31 23:00:00 (Mon)
  60894374400, #    local_end 1930-09-01 00:00:00 (Mon)
  -18000,
  0,
  '-05',
      ],
      [
  60894392400, #    utc_start 1930-09-01 05:00:00 (Mon)
  60912705600, #      utc_end 1931-04-01 04:00:00 (Wed)
  60894378000, #  local_start 1930-09-01 01:00:00 (Mon)
  60912691200, #    local_end 1931-04-01 00:00:00 (Wed)
  -14400,
  1,
  '-04',
      ],
      [
  60912705600, #    utc_start 1931-04-01 04:00:00 (Wed)
  60925928400, #      utc_end 1931-09-01 05:00:00 (Tue)
  60912687600, #  local_start 1931-03-31 23:00:00 (Tue)
  60925910400, #    local_end 1931-09-01 00:00:00 (Tue)
  -18000,
  0,
  '-05',
      ],
      [
  60925928400, #    utc_start 1931-09-01 05:00:00 (Tue)
  60944328000, #      utc_end 1932-04-01 04:00:00 (Fri)
  60925914000, #  local_start 1931-09-01 01:00:00 (Tue)
  60944313600, #    local_end 1932-04-01 00:00:00 (Fri)
  -14400,
  1,
  '-04',
      ],
      [
  60944328000, #    utc_start 1932-04-01 04:00:00 (Fri)
  60957550800, #      utc_end 1932-09-01 05:00:00 (Thu)
  60944310000, #  local_start 1932-03-31 23:00:00 (Thu)
  60957532800, #    local_end 1932-09-01 00:00:00 (Thu)
  -18000,
  0,
  '-05',
      ],
      [
  60957550800, #    utc_start 1932-09-01 05:00:00 (Thu)
  61265131200, #      utc_end 1942-06-01 04:00:00 (Mon)
  60957536400, #  local_start 1932-09-01 01:00:00 (Thu)
  61265116800, #    local_end 1942-06-01 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  61265131200, #    utc_start 1942-06-01 04:00:00 (Mon)
  61270405200, #      utc_end 1942-08-01 05:00:00 (Sat)
  61265113200, #  local_start 1942-05-31 23:00:00 (Sun)
  61270387200, #    local_end 1942-08-01 00:00:00 (Sat)
  -18000,
  0,
  '-05',
      ],
      [
  61270405200, #    utc_start 1942-08-01 05:00:00 (Sat)
  61395163200, #      utc_end 1946-07-15 04:00:00 (Mon)
  61270390800, #  local_start 1942-08-01 01:00:00 (Sat)
  61395148800, #    local_end 1946-07-15 00:00:00 (Mon)
  -14400,
  0,
  '-04',
      ],
      [
  61395163200, #    utc_start 1946-07-15 04:00:00 (Mon)
  61399306800, #      utc_end 1946-09-01 03:00:00 (Sun)
  61395152400, #  local_start 1946-07-15 01:00:00 (Mon)
  61399296000, #    local_end 1946-09-01 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61399306800, #    utc_start 1946-09-01 03:00:00 (Sun)
  61417627200, #      utc_end 1947-04-01 04:00:00 (Tue)
  61399292400, #  local_start 1946-08-31 23:00:00 (Sat)
  61417612800, #    local_end 1947-04-01 00:00:00 (Tue)
  -14400,
  0,
  '-04',
      ],
      [
  61417627200, #    utc_start 1947-04-01 04:00:00 (Tue)
  61422033600, #      utc_end 1947-05-22 04:00:00 (Thu)
  61417609200, #  local_start 1947-03-31 23:00:00 (Mon)
  61422015600, #    local_end 1947-05-21 23:00:00 (Wed)
  -18000,
  0,
  '-05',
      ],
      [
  61422033600, #    utc_start 1947-05-22 04:00:00 (Thu)
  62099064000, #      utc_end 1968-11-03 04:00:00 (Sun)
  61422019200, #  local_start 1947-05-22 00:00:00 (Thu)
  62099049600, #    local_end 1968-11-03 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62099064000, #    utc_start 1968-11-03 04:00:00 (Sun)
  62111761200, #      utc_end 1969-03-30 03:00:00 (Sun)
  62099053200, #  local_start 1968-11-03 01:00:00 (Sun)
  62111750400, #    local_end 1969-03-30 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62111761200, #    utc_start 1969-03-30 03:00:00 (Sun)
  62132328000, #      utc_end 1969-11-23 04:00:00 (Sun)
  62111746800, #  local_start 1969-03-29 23:00:00 (Sat)
  62132313600, #    local_end 1969-11-23 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62132328000, #    utc_start 1969-11-23 04:00:00 (Sun)
  62143210800, #      utc_end 1970-03-29 03:00:00 (Sun)
  62132317200, #  local_start 1969-11-23 01:00:00 (Sun)
  62143200000, #    local_end 1970-03-29 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62143210800, #    utc_start 1970-03-29 03:00:00 (Sun)
  62160148800, #      utc_end 1970-10-11 04:00:00 (Sun)
  62143196400, #  local_start 1970-03-28 23:00:00 (Sat)
  62160134400, #    local_end 1970-10-11 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62160148800, #    utc_start 1970-10-11 04:00:00 (Sun)
  62173450800, #      utc_end 1971-03-14 03:00:00 (Sun)
  62160138000, #  local_start 1970-10-11 01:00:00 (Sun)
  62173440000, #    local_end 1971-03-14 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62173450800, #    utc_start 1971-03-14 03:00:00 (Sun)
  62191598400, #      utc_end 1971-10-10 04:00:00 (Sun)
  62173436400, #  local_start 1971-03-13 23:00:00 (Sat)
  62191584000, #    local_end 1971-10-10 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62191598400, #    utc_start 1971-10-10 04:00:00 (Sun)
  62204900400, #      utc_end 1972-03-12 03:00:00 (Sun)
  62191587600, #  local_start 1971-10-10 01:00:00 (Sun)
  62204889600, #    local_end 1972-03-12 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62204900400, #    utc_start 1972-03-12 03:00:00 (Sun)
  62223652800, #      utc_end 1972-10-15 04:00:00 (Sun)
  62204886000, #  local_start 1972-03-11 23:00:00 (Sat)
  62223638400, #    local_end 1972-10-15 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62223652800, #    utc_start 1972-10-15 04:00:00 (Sun)
  62236350000, #      utc_end 1973-03-11 03:00:00 (Sun)
  62223642000, #  local_start 1972-10-15 01:00:00 (Sun)
  62236339200, #    local_end 1973-03-11 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62236350000, #    utc_start 1973-03-11 03:00:00 (Sun)
  62253892800, #      utc_end 1973-09-30 04:00:00 (Sun)
  62236335600, #  local_start 1973-03-10 23:00:00 (Sat)
  62253878400, #    local_end 1973-09-30 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62253892800, #    utc_start 1973-09-30 04:00:00 (Sun)
  62267799600, #      utc_end 1974-03-10 03:00:00 (Sun)
  62253882000, #  local_start 1973-09-30 01:00:00 (Sun)
  62267788800, #    local_end 1974-03-10 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62267799600, #    utc_start 1974-03-10 03:00:00 (Sun)
  62286552000, #      utc_end 1974-10-13 04:00:00 (Sun)
  62267785200, #  local_start 1974-03-09 23:00:00 (Sat)
  62286537600, #    local_end 1974-10-13 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62286552000, #    utc_start 1974-10-13 04:00:00 (Sun)
  62299249200, #      utc_end 1975-03-09 03:00:00 (Sun)
  62286541200, #  local_start 1974-10-13 01:00:00 (Sun)
  62299238400, #    local_end 1975-03-09 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62299249200, #    utc_start 1975-03-09 03:00:00 (Sun)
  62318001600, #      utc_end 1975-10-12 04:00:00 (Sun)
  62299234800, #  local_start 1975-03-08 23:00:00 (Sat)
  62317987200, #    local_end 1975-10-12 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62318001600, #    utc_start 1975-10-12 04:00:00 (Sun)
  62331303600, #      utc_end 1976-03-14 03:00:00 (Sun)
  62317990800, #  local_start 1975-10-12 01:00:00 (Sun)
  62331292800, #    local_end 1976-03-14 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62331303600, #    utc_start 1976-03-14 03:00:00 (Sun)
  62349451200, #      utc_end 1976-10-10 04:00:00 (Sun)
  62331289200, #  local_start 1976-03-13 23:00:00 (Sat)
  62349436800, #    local_end 1976-10-10 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62349451200, #    utc_start 1976-10-10 04:00:00 (Sun)
  62362753200, #      utc_end 1977-03-13 03:00:00 (Sun)
  62349440400, #  local_start 1976-10-10 01:00:00 (Sun)
  62362742400, #    local_end 1977-03-13 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62362753200, #    utc_start 1977-03-13 03:00:00 (Sun)
  62380900800, #      utc_end 1977-10-09 04:00:00 (Sun)
  62362738800, #  local_start 1977-03-12 23:00:00 (Sat)
  62380886400, #    local_end 1977-10-09 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62380900800, #    utc_start 1977-10-09 04:00:00 (Sun)
  62394202800, #      utc_end 1978-03-12 03:00:00 (Sun)
  62380890000, #  local_start 1977-10-09 01:00:00 (Sun)
  62394192000, #    local_end 1978-03-12 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62394202800, #    utc_start 1978-03-12 03:00:00 (Sun)
  62412955200, #      utc_end 1978-10-15 04:00:00 (Sun)
  62394188400, #  local_start 1978-03-11 23:00:00 (Sat)
  62412940800, #    local_end 1978-10-15 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62412955200, #    utc_start 1978-10-15 04:00:00 (Sun)
  62425652400, #      utc_end 1979-03-11 03:00:00 (Sun)
  62412944400, #  local_start 1978-10-15 01:00:00 (Sun)
  62425641600, #    local_end 1979-03-11 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62425652400, #    utc_start 1979-03-11 03:00:00 (Sun)
  62444404800, #      utc_end 1979-10-14 04:00:00 (Sun)
  62425638000, #  local_start 1979-03-10 23:00:00 (Sat)
  62444390400, #    local_end 1979-10-14 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62444404800, #    utc_start 1979-10-14 04:00:00 (Sun)
  62457102000, #      utc_end 1980-03-09 03:00:00 (Sun)
  62444394000, #  local_start 1979-10-14 01:00:00 (Sun)
  62457091200, #    local_end 1980-03-09 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62457102000, #    utc_start 1980-03-09 03:00:00 (Sun)
  62475854400, #      utc_end 1980-10-12 04:00:00 (Sun)
  62457087600, #  local_start 1980-03-08 23:00:00 (Sat)
  62475840000, #    local_end 1980-10-12 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62475854400, #    utc_start 1980-10-12 04:00:00 (Sun)
  62489156400, #      utc_end 1981-03-15 03:00:00 (Sun)
  62475843600, #  local_start 1980-10-12 01:00:00 (Sun)
  62489145600, #    local_end 1981-03-15 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62489156400, #    utc_start 1981-03-15 03:00:00 (Sun)
  62507304000, #      utc_end 1981-10-11 04:00:00 (Sun)
  62489142000, #  local_start 1981-03-14 23:00:00 (Sat)
  62507289600, #    local_end 1981-10-11 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62507304000, #    utc_start 1981-10-11 04:00:00 (Sun)
  62520606000, #      utc_end 1982-03-14 03:00:00 (Sun)
  62507293200, #  local_start 1981-10-11 01:00:00 (Sun)
  62520595200, #    local_end 1982-03-14 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62520606000, #    utc_start 1982-03-14 03:00:00 (Sun)
  62538753600, #      utc_end 1982-10-10 04:00:00 (Sun)
  62520591600, #  local_start 1982-03-13 23:00:00 (Sat)
  62538739200, #    local_end 1982-10-10 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62538753600, #    utc_start 1982-10-10 04:00:00 (Sun)
  62552055600, #      utc_end 1983-03-13 03:00:00 (Sun)
  62538742800, #  local_start 1982-10-10 01:00:00 (Sun)
  62552044800, #    local_end 1983-03-13 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62552055600, #    utc_start 1983-03-13 03:00:00 (Sun)
  62570203200, #      utc_end 1983-10-09 04:00:00 (Sun)
  62552041200, #  local_start 1983-03-12 23:00:00 (Sat)
  62570188800, #    local_end 1983-10-09 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62570203200, #    utc_start 1983-10-09 04:00:00 (Sun)
  62583505200, #      utc_end 1984-03-11 03:00:00 (Sun)
  62570192400, #  local_start 1983-10-09 01:00:00 (Sun)
  62583494400, #    local_end 1984-03-11 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62583505200, #    utc_start 1984-03-11 03:00:00 (Sun)
  62602257600, #      utc_end 1984-10-14 04:00:00 (Sun)
  62583490800, #  local_start 1984-03-10 23:00:00 (Sat)
  62602243200, #    local_end 1984-10-14 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62602257600, #    utc_start 1984-10-14 04:00:00 (Sun)
  62614954800, #      utc_end 1985-03-10 03:00:00 (Sun)
  62602246800, #  local_start 1984-10-14 01:00:00 (Sun)
  62614944000, #    local_end 1985-03-10 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62614954800, #    utc_start 1985-03-10 03:00:00 (Sun)
  62633707200, #      utc_end 1985-10-13 04:00:00 (Sun)
  62614940400, #  local_start 1985-03-09 23:00:00 (Sat)
  62633692800, #    local_end 1985-10-13 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62633707200, #    utc_start 1985-10-13 04:00:00 (Sun)
  62646404400, #      utc_end 1986-03-09 03:00:00 (Sun)
  62633696400, #  local_start 1985-10-13 01:00:00 (Sun)
  62646393600, #    local_end 1986-03-09 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62646404400, #    utc_start 1986-03-09 03:00:00 (Sun)
  62665156800, #      utc_end 1986-10-12 04:00:00 (Sun)
  62646390000, #  local_start 1986-03-08 23:00:00 (Sat)
  62665142400, #    local_end 1986-10-12 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62665156800, #    utc_start 1986-10-12 04:00:00 (Sun)
  62680878000, #      utc_end 1987-04-12 03:00:00 (Sun)
  62665146000, #  local_start 1986-10-12 01:00:00 (Sun)
  62680867200, #    local_end 1987-04-12 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62680878000, #    utc_start 1987-04-12 03:00:00 (Sun)
  62696606400, #      utc_end 1987-10-11 04:00:00 (Sun)
  62680863600, #  local_start 1987-04-11 23:00:00 (Sat)
  62696592000, #    local_end 1987-10-11 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62696606400, #    utc_start 1987-10-11 04:00:00 (Sun)
  62709908400, #      utc_end 1988-03-13 03:00:00 (Sun)
  62696595600, #  local_start 1987-10-11 01:00:00 (Sun)
  62709897600, #    local_end 1988-03-13 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62709908400, #    utc_start 1988-03-13 03:00:00 (Sun)
  62728056000, #      utc_end 1988-10-09 04:00:00 (Sun)
  62709894000, #  local_start 1988-03-12 23:00:00 (Sat)
  62728041600, #    local_end 1988-10-09 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62728056000, #    utc_start 1988-10-09 04:00:00 (Sun)
  62741358000, #      utc_end 1989-03-12 03:00:00 (Sun)
  62728045200, #  local_start 1988-10-09 01:00:00 (Sun)
  62741347200, #    local_end 1989-03-12 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62741358000, #    utc_start 1989-03-12 03:00:00 (Sun)
  62760110400, #      utc_end 1989-10-15 04:00:00 (Sun)
  62741343600, #  local_start 1989-03-11 23:00:00 (Sat)
  62760096000, #    local_end 1989-10-15 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62760110400, #    utc_start 1989-10-15 04:00:00 (Sun)
  62772807600, #      utc_end 1990-03-11 03:00:00 (Sun)
  62760099600, #  local_start 1989-10-15 01:00:00 (Sun)
  62772796800, #    local_end 1990-03-11 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62772807600, #    utc_start 1990-03-11 03:00:00 (Sun)
  62789140800, #      utc_end 1990-09-16 04:00:00 (Sun)
  62772793200, #  local_start 1990-03-10 23:00:00 (Sat)
  62789126400, #    local_end 1990-09-16 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62789140800, #    utc_start 1990-09-16 04:00:00 (Sun)
  62804257200, #      utc_end 1991-03-10 03:00:00 (Sun)
  62789130000, #  local_start 1990-09-16 01:00:00 (Sun)
  62804246400, #    local_end 1991-03-10 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62804257200, #    utc_start 1991-03-10 03:00:00 (Sun)
  62823009600, #      utc_end 1991-10-13 04:00:00 (Sun)
  62804242800, #  local_start 1991-03-09 23:00:00 (Sat)
  62822995200, #    local_end 1991-10-13 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62823009600, #    utc_start 1991-10-13 04:00:00 (Sun)
  62836311600, #      utc_end 1992-03-15 03:00:00 (Sun)
  62822998800, #  local_start 1991-10-13 01:00:00 (Sun)
  62836300800, #    local_end 1992-03-15 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62836311600, #    utc_start 1992-03-15 03:00:00 (Sun)
  62854459200, #      utc_end 1992-10-11 04:00:00 (Sun)
  62836297200, #  local_start 1992-03-14 23:00:00 (Sat)
  62854444800, #    local_end 1992-10-11 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62854459200, #    utc_start 1992-10-11 04:00:00 (Sun)
  62867761200, #      utc_end 1993-03-14 03:00:00 (Sun)
  62854448400, #  local_start 1992-10-11 01:00:00 (Sun)
  62867750400, #    local_end 1993-03-14 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62867761200, #    utc_start 1993-03-14 03:00:00 (Sun)
  62885908800, #      utc_end 1993-10-10 04:00:00 (Sun)
  62867746800, #  local_start 1993-03-13 23:00:00 (Sat)
  62885894400, #    local_end 1993-10-10 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62885908800, #    utc_start 1993-10-10 04:00:00 (Sun)
  62899210800, #      utc_end 1994-03-13 03:00:00 (Sun)
  62885898000, #  local_start 1993-10-10 01:00:00 (Sun)
  62899200000, #    local_end 1994-03-13 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62899210800, #    utc_start 1994-03-13 03:00:00 (Sun)
  62917358400, #      utc_end 1994-10-09 04:00:00 (Sun)
  62899196400, #  local_start 1994-03-12 23:00:00 (Sat)
  62917344000, #    local_end 1994-10-09 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62917358400, #    utc_start 1994-10-09 04:00:00 (Sun)
  62930660400, #      utc_end 1995-03-12 03:00:00 (Sun)
  62917347600, #  local_start 1994-10-09 01:00:00 (Sun)
  62930649600, #    local_end 1995-03-12 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62930660400, #    utc_start 1995-03-12 03:00:00 (Sun)
  62949412800, #      utc_end 1995-10-15 04:00:00 (Sun)
  62930646000, #  local_start 1995-03-11 23:00:00 (Sat)
  62949398400, #    local_end 1995-10-15 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62949412800, #    utc_start 1995-10-15 04:00:00 (Sun)
  62962110000, #      utc_end 1996-03-10 03:00:00 (Sun)
  62949402000, #  local_start 1995-10-15 01:00:00 (Sun)
  62962099200, #    local_end 1996-03-10 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62962110000, #    utc_start 1996-03-10 03:00:00 (Sun)
  62980862400, #      utc_end 1996-10-13 04:00:00 (Sun)
  62962095600, #  local_start 1996-03-09 23:00:00 (Sat)
  62980848000, #    local_end 1996-10-13 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62980862400, #    utc_start 1996-10-13 04:00:00 (Sun)
  62995374000, #      utc_end 1997-03-30 03:00:00 (Sun)
  62980851600, #  local_start 1996-10-13 01:00:00 (Sun)
  62995363200, #    local_end 1997-03-30 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62995374000, #    utc_start 1997-03-30 03:00:00 (Sun)
  63012312000, #      utc_end 1997-10-12 04:00:00 (Sun)
  62995359600, #  local_start 1997-03-29 23:00:00 (Sat)
  63012297600, #    local_end 1997-10-12 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63012312000, #    utc_start 1997-10-12 04:00:00 (Sun)
  63025614000, #      utc_end 1998-03-15 03:00:00 (Sun)
  63012301200, #  local_start 1997-10-12 01:00:00 (Sun)
  63025603200, #    local_end 1998-03-15 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63025614000, #    utc_start 1998-03-15 03:00:00 (Sun)
  63042552000, #      utc_end 1998-09-27 04:00:00 (Sun)
  63025599600, #  local_start 1998-03-14 23:00:00 (Sat)
  63042537600, #    local_end 1998-09-27 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63042552000, #    utc_start 1998-09-27 04:00:00 (Sun)
  63058878000, #      utc_end 1999-04-04 03:00:00 (Sun)
  63042541200, #  local_start 1998-09-27 01:00:00 (Sun)
  63058867200, #    local_end 1999-04-04 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63058878000, #    utc_start 1999-04-04 03:00:00 (Sun)
  63075211200, #      utc_end 1999-10-10 04:00:00 (Sun)
  63058863600, #  local_start 1999-04-03 23:00:00 (Sat)
  63075196800, #    local_end 1999-10-10 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63075211200, #    utc_start 1999-10-10 04:00:00 (Sun)
  63088513200, #      utc_end 2000-03-12 03:00:00 (Sun)
  63075200400, #  local_start 1999-10-10 01:00:00 (Sun)
  63088502400, #    local_end 2000-03-12 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63088513200, #    utc_start 2000-03-12 03:00:00 (Sun)
  63107265600, #      utc_end 2000-10-15 04:00:00 (Sun)
  63088498800, #  local_start 2000-03-11 23:00:00 (Sat)
  63107251200, #    local_end 2000-10-15 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63107265600, #    utc_start 2000-10-15 04:00:00 (Sun)
  63119962800, #      utc_end 2001-03-11 03:00:00 (Sun)
  63107254800, #  local_start 2000-10-15 01:00:00 (Sun)
  63119952000, #    local_end 2001-03-11 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63119962800, #    utc_start 2001-03-11 03:00:00 (Sun)
  63138715200, #      utc_end 2001-10-14 04:00:00 (Sun)
  63119948400, #  local_start 2001-03-10 23:00:00 (Sat)
  63138700800, #    local_end 2001-10-14 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63138715200, #    utc_start 2001-10-14 04:00:00 (Sun)
  63151412400, #      utc_end 2002-03-10 03:00:00 (Sun)
  63138704400, #  local_start 2001-10-14 01:00:00 (Sun)
  63151401600, #    local_end 2002-03-10 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63151412400, #    utc_start 2002-03-10 03:00:00 (Sun)
  63170164800, #      utc_end 2002-10-13 04:00:00 (Sun)
  63151398000, #  local_start 2002-03-09 23:00:00 (Sat)
  63170150400, #    local_end 2002-10-13 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63170164800, #    utc_start 2002-10-13 04:00:00 (Sun)
  63182862000, #      utc_end 2003-03-09 03:00:00 (Sun)
  63170154000, #  local_start 2002-10-13 01:00:00 (Sun)
  63182851200, #    local_end 2003-03-09 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63182862000, #    utc_start 2003-03-09 03:00:00 (Sun)
  63201614400, #      utc_end 2003-10-12 04:00:00 (Sun)
  63182847600, #  local_start 2003-03-08 23:00:00 (Sat)
  63201600000, #    local_end 2003-10-12 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63201614400, #    utc_start 2003-10-12 04:00:00 (Sun)
  63214916400, #      utc_end 2004-03-14 03:00:00 (Sun)
  63201603600, #  local_start 2003-10-12 01:00:00 (Sun)
  63214905600, #    local_end 2004-03-14 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63214916400, #    utc_start 2004-03-14 03:00:00 (Sun)
  63233064000, #      utc_end 2004-10-10 04:00:00 (Sun)
  63214902000, #  local_start 2004-03-13 23:00:00 (Sat)
  63233049600, #    local_end 2004-10-10 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63233064000, #    utc_start 2004-10-10 04:00:00 (Sun)
  63246366000, #      utc_end 2005-03-13 03:00:00 (Sun)
  63233053200, #  local_start 2004-10-10 01:00:00 (Sun)
  63246355200, #    local_end 2005-03-13 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63246366000, #    utc_start 2005-03-13 03:00:00 (Sun)
  63264513600, #      utc_end 2005-10-09 04:00:00 (Sun)
  63246351600, #  local_start 2005-03-12 23:00:00 (Sat)
  63264499200, #    local_end 2005-10-09 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63264513600, #    utc_start 2005-10-09 04:00:00 (Sun)
  63277815600, #      utc_end 2006-03-12 03:00:00 (Sun)
  63264502800, #  local_start 2005-10-09 01:00:00 (Sun)
  63277804800, #    local_end 2006-03-12 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63277815600, #    utc_start 2006-03-12 03:00:00 (Sun)
  63296568000, #      utc_end 2006-10-15 04:00:00 (Sun)
  63277801200, #  local_start 2006-03-11 23:00:00 (Sat)
  63296553600, #    local_end 2006-10-15 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63296568000, #    utc_start 2006-10-15 04:00:00 (Sun)
  63309265200, #      utc_end 2007-03-11 03:00:00 (Sun)
  63296557200, #  local_start 2006-10-15 01:00:00 (Sun)
  63309254400, #    local_end 2007-03-11 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63309265200, #    utc_start 2007-03-11 03:00:00 (Sun)
  63328017600, #      utc_end 2007-10-14 04:00:00 (Sun)
  63309250800, #  local_start 2007-03-10 23:00:00 (Sat)
  63328003200, #    local_end 2007-10-14 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63328017600, #    utc_start 2007-10-14 04:00:00 (Sun)
  63342529200, #      utc_end 2008-03-30 03:00:00 (Sun)
  63328006800, #  local_start 2007-10-14 01:00:00 (Sun)
  63342518400, #    local_end 2008-03-30 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63342529200, #    utc_start 2008-03-30 03:00:00 (Sun)
  63359467200, #      utc_end 2008-10-12 04:00:00 (Sun)
  63342514800, #  local_start 2008-03-29 23:00:00 (Sat)
  63359452800, #    local_end 2008-10-12 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63359467200, #    utc_start 2008-10-12 04:00:00 (Sun)
  63372769200, #      utc_end 2009-03-15 03:00:00 (Sun)
  63359456400, #  local_start 2008-10-12 01:00:00 (Sun)
  63372758400, #    local_end 2009-03-15 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63372769200, #    utc_start 2009-03-15 03:00:00 (Sun)
  63390916800, #      utc_end 2009-10-11 04:00:00 (Sun)
  63372754800, #  local_start 2009-03-14 23:00:00 (Sat)
  63390902400, #    local_end 2009-10-11 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63390916800, #    utc_start 2009-10-11 04:00:00 (Sun)
  63406033200, #      utc_end 2010-04-04 03:00:00 (Sun)
  63390906000, #  local_start 2009-10-11 01:00:00 (Sun)
  63406022400, #    local_end 2010-04-04 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63406033200, #    utc_start 2010-04-04 03:00:00 (Sun)
  63422366400, #      utc_end 2010-10-10 04:00:00 (Sun)
  63406018800, #  local_start 2010-04-03 23:00:00 (Sat)
  63422352000, #    local_end 2010-10-10 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63422366400, #    utc_start 2010-10-10 04:00:00 (Sun)
  63440506800, #      utc_end 2011-05-08 03:00:00 (Sun)
  63422355600, #  local_start 2010-10-10 01:00:00 (Sun)
  63440496000, #    local_end 2011-05-08 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63440506800, #    utc_start 2011-05-08 03:00:00 (Sun)
  63449582400, #      utc_end 2011-08-21 04:00:00 (Sun)
  63440492400, #  local_start 2011-05-07 23:00:00 (Sat)
  63449568000, #    local_end 2011-08-21 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63449582400, #    utc_start 2011-08-21 04:00:00 (Sun)
  63471351600, #      utc_end 2012-04-29 03:00:00 (Sun)
  63449571600, #  local_start 2011-08-21 01:00:00 (Sun)
  63471340800, #    local_end 2012-04-29 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63471351600, #    utc_start 2012-04-29 03:00:00 (Sun)
  63482241600, #      utc_end 2012-09-02 04:00:00 (Sun)
  63471337200, #  local_start 2012-04-28 23:00:00 (Sat)
  63482227200, #    local_end 2012-09-02 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63482241600, #    utc_start 2012-09-02 04:00:00 (Sun)
  63502801200, #      utc_end 2013-04-28 03:00:00 (Sun)
  63482230800, #  local_start 2012-09-02 01:00:00 (Sun)
  63502790400, #    local_end 2013-04-28 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63502801200, #    utc_start 2013-04-28 03:00:00 (Sun)
  63514296000, #      utc_end 2013-09-08 04:00:00 (Sun)
  63502786800, #  local_start 2013-04-27 23:00:00 (Sat)
  63514281600, #    local_end 2013-09-08 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63514296000, #    utc_start 2013-09-08 04:00:00 (Sun)
  63534250800, #      utc_end 2014-04-27 03:00:00 (Sun)
  63514285200, #  local_start 2013-09-08 01:00:00 (Sun)
  63534240000, #    local_end 2014-04-27 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63534250800, #    utc_start 2014-04-27 03:00:00 (Sun)
  63545745600, #      utc_end 2014-09-07 04:00:00 (Sun)
  63534236400, #  local_start 2014-04-26 23:00:00 (Sat)
  63545731200, #    local_end 2014-09-07 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63545745600, #    utc_start 2014-09-07 04:00:00 (Sun)
  63598964400, #      utc_end 2016-05-15 03:00:00 (Sun)
  63545734800, #  local_start 2014-09-07 01:00:00 (Sun)
  63598953600, #    local_end 2016-05-15 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63598964400, #    utc_start 2016-05-15 03:00:00 (Sun)
  63606830400, #      utc_end 2016-08-14 04:00:00 (Sun)
  63598950000, #  local_start 2016-05-14 23:00:00 (Sat)
  63606816000, #    local_end 2016-08-14 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63606830400, #    utc_start 2016-08-14 04:00:00 (Sun)
  63630414000, #      utc_end 2017-05-14 03:00:00 (Sun)
  63606819600, #  local_start 2016-08-14 01:00:00 (Sun)
  63630403200, #    local_end 2017-05-14 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63630414000, #    utc_start 2017-05-14 03:00:00 (Sun)
  63638280000, #      utc_end 2017-08-13 04:00:00 (Sun)
  63630399600, #  local_start 2017-05-13 23:00:00 (Sat)
  63638265600, #    local_end 2017-08-13 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63638280000, #    utc_start 2017-08-13 04:00:00 (Sun)
  63661863600, #      utc_end 2018-05-13 03:00:00 (Sun)
  63638269200, #  local_start 2017-08-13 01:00:00 (Sun)
  63661852800, #    local_end 2018-05-13 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63661863600, #    utc_start 2018-05-13 03:00:00 (Sun)
  63669729600, #      utc_end 2018-08-12 04:00:00 (Sun)
  63661849200, #  local_start 2018-05-12 23:00:00 (Sat)
  63669715200, #    local_end 2018-08-12 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63669729600, #    utc_start 2018-08-12 04:00:00 (Sun)
  63690289200, #      utc_end 2019-04-07 03:00:00 (Sun)
  63669718800, #  local_start 2018-08-12 01:00:00 (Sun)
  63690278400, #    local_end 2019-04-07 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63690289200, #    utc_start 2019-04-07 03:00:00 (Sun)
  63703598400, #      utc_end 2019-09-08 04:00:00 (Sun)
  63690274800, #  local_start 2019-04-06 23:00:00 (Sat)
  63703584000, #    local_end 2019-09-08 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63703598400, #    utc_start 2019-09-08 04:00:00 (Sun)
  63721738800, #      utc_end 2020-04-05 03:00:00 (Sun)
  63703587600, #  local_start 2019-09-08 01:00:00 (Sun)
  63721728000, #    local_end 2020-04-05 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63721738800, #    utc_start 2020-04-05 03:00:00 (Sun)
  63735048000, #      utc_end 2020-09-06 04:00:00 (Sun)
  63721724400, #  local_start 2020-04-04 23:00:00 (Sat)
  63735033600, #    local_end 2020-09-06 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63735048000, #    utc_start 2020-09-06 04:00:00 (Sun)
  63753188400, #      utc_end 2021-04-04 03:00:00 (Sun)
  63735037200, #  local_start 2020-09-06 01:00:00 (Sun)
  63753177600, #    local_end 2021-04-04 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63753188400, #    utc_start 2021-04-04 03:00:00 (Sun)
  63766497600, #      utc_end 2021-09-05 04:00:00 (Sun)
  63753174000, #  local_start 2021-04-03 23:00:00 (Sat)
  63766483200, #    local_end 2021-09-05 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63766497600, #    utc_start 2021-09-05 04:00:00 (Sun)
  63784638000, #      utc_end 2022-04-03 03:00:00 (Sun)
  63766486800, #  local_start 2021-09-05 01:00:00 (Sun)
  63784627200, #    local_end 2022-04-03 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63784638000, #    utc_start 2022-04-03 03:00:00 (Sun)
  63797947200, #      utc_end 2022-09-04 04:00:00 (Sun)
  63784623600, #  local_start 2022-04-02 23:00:00 (Sat)
  63797932800, #    local_end 2022-09-04 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63797947200, #    utc_start 2022-09-04 04:00:00 (Sun)
  63816087600, #      utc_end 2023-04-02 03:00:00 (Sun)
  63797936400, #  local_start 2022-09-04 01:00:00 (Sun)
  63816076800, #    local_end 2023-04-02 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63816087600, #    utc_start 2023-04-02 03:00:00 (Sun)
  63829396800, #      utc_end 2023-09-03 04:00:00 (Sun)
  63816073200, #  local_start 2023-04-01 23:00:00 (Sat)
  63829382400, #    local_end 2023-09-03 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63829396800, #    utc_start 2023-09-03 04:00:00 (Sun)
  63848142000, #      utc_end 2024-04-07 03:00:00 (Sun)
  63829386000, #  local_start 2023-09-03 01:00:00 (Sun)
  63848131200, #    local_end 2024-04-07 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63848142000, #    utc_start 2024-04-07 03:00:00 (Sun)
  63861451200, #      utc_end 2024-09-08 04:00:00 (Sun)
  63848127600, #  local_start 2024-04-06 23:00:00 (Sat)
  63861436800, #    local_end 2024-09-08 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63861451200, #    utc_start 2024-09-08 04:00:00 (Sun)
  63879591600, #      utc_end 2025-04-06 03:00:00 (Sun)
  63861440400, #  local_start 2024-09-08 01:00:00 (Sun)
  63879580800, #    local_end 2025-04-06 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63879591600, #    utc_start 2025-04-06 03:00:00 (Sun)
  63892900800, #      utc_end 2025-09-07 04:00:00 (Sun)
  63879577200, #  local_start 2025-04-05 23:00:00 (Sat)
  63892886400, #    local_end 2025-09-07 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63892900800, #    utc_start 2025-09-07 04:00:00 (Sun)
  63911041200, #      utc_end 2026-04-05 03:00:00 (Sun)
  63892890000, #  local_start 2025-09-07 01:00:00 (Sun)
  63911030400, #    local_end 2026-04-05 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63911041200, #    utc_start 2026-04-05 03:00:00 (Sun)
  63924350400, #      utc_end 2026-09-06 04:00:00 (Sun)
  63911026800, #  local_start 2026-04-04 23:00:00 (Sat)
  63924336000, #    local_end 2026-09-06 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63924350400, #    utc_start 2026-09-06 04:00:00 (Sun)
  63942490800, #      utc_end 2027-04-04 03:00:00 (Sun)
  63924339600, #  local_start 2026-09-06 01:00:00 (Sun)
  63942480000, #    local_end 2027-04-04 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63942490800, #    utc_start 2027-04-04 03:00:00 (Sun)
  63955800000, #      utc_end 2027-09-05 04:00:00 (Sun)
  63942476400, #  local_start 2027-04-03 23:00:00 (Sat)
  63955785600, #    local_end 2027-09-05 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63955800000, #    utc_start 2027-09-05 04:00:00 (Sun)
  63973940400, #      utc_end 2028-04-02 03:00:00 (Sun)
  63955789200, #  local_start 2027-09-05 01:00:00 (Sun)
  63973929600, #    local_end 2028-04-02 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63973940400, #    utc_start 2028-04-02 03:00:00 (Sun)
  63987249600, #      utc_end 2028-09-03 04:00:00 (Sun)
  63973926000, #  local_start 2028-04-01 23:00:00 (Sat)
  63987235200, #    local_end 2028-09-03 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63987249600, #    utc_start 2028-09-03 04:00:00 (Sun)
  64005994800, #      utc_end 2029-04-08 03:00:00 (Sun)
  63987238800, #  local_start 2028-09-03 01:00:00 (Sun)
  64005984000, #    local_end 2029-04-08 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  64005994800, #    utc_start 2029-04-08 03:00:00 (Sun)
  64018699200, #      utc_end 2029-09-02 04:00:00 (Sun)
  64005980400, #  local_start 2029-04-07 23:00:00 (Sat)
  64018684800, #    local_end 2029-09-02 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  64018699200, #    utc_start 2029-09-02 04:00:00 (Sun)
  64037444400, #      utc_end 2030-04-07 03:00:00 (Sun)
  64018688400, #  local_start 2029-09-02 01:00:00 (Sun)
  64037433600, #    local_end 2030-04-07 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  64037444400, #    utc_start 2030-04-07 03:00:00 (Sun)
  64050753600, #      utc_end 2030-09-08 04:00:00 (Sun)
  64037430000, #  local_start 2030-04-06 23:00:00 (Sat)
  64050739200, #    local_end 2030-09-08 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {68}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -14400 }
  
  my $last_observance = bless( {
    'format' => '-04/-03',
    'gmtoff' => '-4:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 710903,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 710903,
      'utc_rd_secs' => 0,
      'utc_year' => 1948
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -14400,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 710903,
      'local_rd_secs' => 14400,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 710903,
      'utc_rd_secs' => 14400,
      'utc_year' => 1948
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '3:00u',
      'from' => '2019',
      'in' => 'Apr',
      'letter' => '',
      'name' => 'Chile',
      'offset_from_std' => 0,
      'on' => 'Sun>=2',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '4:00u',
      'from' => '2019',
      'in' => 'Sep',
      'letter' => '',
      'name' => 'Chile',
      'offset_from_std' => 3600,
      'on' => 'Sun>=2',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_SANTIAGO

    $main::fatpacked{"DateTime/TimeZone/America/Santo_Domingo.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_SANTO_DOMINGO';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Santo_Domingo;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Santo_Domingo::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59611178376, #      utc_end 1890-01-01 04:39:36 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59611161600, #    local_end 1890-01-01 00:00:00 (Wed)
  -16776,
  0,
  'LMT',
      ],
      [
  59611178376, #    utc_start 1890-01-01 04:39:36 (Wed)
  60975909600, #      utc_end 1933-04-01 16:40:00 (Sat)
  59611161576, #  local_start 1889-12-31 23:59:36 (Tue)
  60975892800, #    local_end 1933-04-01 12:00:00 (Sat)
  -16800,
  0,
  'SDMT',
      ],
      [
  60975909600, #    utc_start 1933-04-01 16:40:00 (Sat)
  62035563600, #      utc_end 1966-10-30 05:00:00 (Sun)
  60975891600, #  local_start 1933-04-01 11:40:00 (Sat)
  62035545600, #    local_end 1966-10-30 00:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62035563600, #    utc_start 1966-10-30 05:00:00 (Sun)
  62046014400, #      utc_end 1967-02-28 04:00:00 (Tue)
  62035549200, #  local_start 1966-10-30 01:00:00 (Sun)
  62046000000, #    local_end 1967-02-28 00:00:00 (Tue)
  -14400,
  1,
  'EDT',
      ],
      [
  62046014400, #    utc_start 1967-02-28 04:00:00 (Tue)
  62129912400, #      utc_end 1969-10-26 05:00:00 (Sun)
  62045996400, #  local_start 1967-02-27 23:00:00 (Mon)
  62129894400, #    local_end 1969-10-26 00:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62129912400, #    utc_start 1969-10-26 05:00:00 (Sun)
  62140105800, #      utc_end 1970-02-21 04:30:00 (Sat)
  62129896200, #  local_start 1969-10-26 00:30:00 (Sun)
  62140089600, #    local_end 1970-02-21 00:00:00 (Sat)
  -16200,
  1,
  '-0430',
      ],
      [
  62140105800, #    utc_start 1970-02-21 04:30:00 (Sat)
  62161362000, #      utc_end 1970-10-25 05:00:00 (Sun)
  62140087800, #  local_start 1970-02-20 23:30:00 (Fri)
  62161344000, #    local_end 1970-10-25 00:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62161362000, #    utc_start 1970-10-25 05:00:00 (Sun)
  62168877000, #      utc_end 1971-01-20 04:30:00 (Wed)
  62161345800, #  local_start 1970-10-25 00:30:00 (Sun)
  62168860800, #    local_end 1971-01-20 00:00:00 (Wed)
  -16200,
  1,
  '-0430',
      ],
      [
  62168877000, #    utc_start 1971-01-20 04:30:00 (Wed)
  62193416400, #      utc_end 1971-10-31 05:00:00 (Sun)
  62168859000, #  local_start 1971-01-19 23:30:00 (Tue)
  62193398400, #    local_end 1971-10-31 00:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62193416400, #    utc_start 1971-10-31 05:00:00 (Sun)
  62200499400, #      utc_end 1972-01-21 04:30:00 (Fri)
  62193400200, #  local_start 1971-10-31 00:30:00 (Sun)
  62200483200, #    local_end 1972-01-21 00:00:00 (Fri)
  -16200,
  1,
  '-0430',
      ],
      [
  62200499400, #    utc_start 1972-01-21 04:30:00 (Fri)
  62224866000, #      utc_end 1972-10-29 05:00:00 (Sun)
  62200481400, #  local_start 1972-01-20 23:30:00 (Thu)
  62224848000, #    local_end 1972-10-29 00:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62224866000, #    utc_start 1972-10-29 05:00:00 (Sun)
  62232121800, #      utc_end 1973-01-21 04:30:00 (Sun)
  62224849800, #  local_start 1972-10-29 00:30:00 (Sun)
  62232105600, #    local_end 1973-01-21 00:00:00 (Sun)
  -16200,
  1,
  '-0430',
      ],
      [
  62232121800, #    utc_start 1973-01-21 04:30:00 (Sun)
  62256315600, #      utc_end 1973-10-28 05:00:00 (Sun)
  62232103800, #  local_start 1973-01-20 23:30:00 (Sat)
  62256297600, #    local_end 1973-10-28 00:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62256315600, #    utc_start 1973-10-28 05:00:00 (Sun)
  62263657800, #      utc_end 1974-01-21 04:30:00 (Mon)
  62256299400, #  local_start 1973-10-28 00:30:00 (Sun)
  62263641600, #    local_end 1974-01-21 00:00:00 (Mon)
  -16200,
  1,
  '-0430',
      ],
      [
  62263657800, #    utc_start 1974-01-21 04:30:00 (Mon)
  62287765200, #      utc_end 1974-10-27 05:00:00 (Sun)
  62263639800, #  local_start 1974-01-20 23:30:00 (Sun)
  62287747200, #    local_end 1974-10-27 00:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62287765200, #    utc_start 1974-10-27 05:00:00 (Sun)
  63108482400, #      utc_end 2000-10-29 06:00:00 (Sun)
  62287750800, #  local_start 1974-10-27 01:00:00 (Sun)
  63108468000, #    local_end 2000-10-29 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63108482400, #    utc_start 2000-10-29 06:00:00 (Sun)
  63111506400, #      utc_end 2000-12-03 06:00:00 (Sun)
  63108464400, #  local_start 2000-10-29 01:00:00 (Sun)
  63111488400, #    local_end 2000-12-03 01:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63111506400, #    utc_start 2000-12-03 06:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #      utc_end
  63111492000, #  local_start 2000-12-03 02:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  -14400,
  0,
  'AST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {6}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_SANTO_DOMINGO

    $main::fatpacked{"DateTime/TimeZone/America/Sao_Paulo.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_SAO_PAULO';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/southamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Sao_Paulo;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Sao_Paulo::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60368468788, #      utc_end 1914-01-01 03:06:28 (Thu)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60368457600, #    local_end 1914-01-01 00:00:00 (Thu)
  -11188,
  0,
  'LMT',
      ],
      [
  60368468788, #    utc_start 1914-01-01 03:06:28 (Thu)
  60928725600, #      utc_end 1931-10-03 14:00:00 (Sat)
  60368457988, #  local_start 1914-01-01 00:06:28 (Thu)
  60928714800, #    local_end 1931-10-03 11:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  60928725600, #    utc_start 1931-10-03 14:00:00 (Sat)
  60944320800, #      utc_end 1932-04-01 02:00:00 (Fri)
  60928718400, #  local_start 1931-10-03 12:00:00 (Sat)
  60944313600, #    local_end 1932-04-01 00:00:00 (Fri)
  -7200,
  1,
  '-02',
      ],
      [
  60944320800, #    utc_start 1932-04-01 02:00:00 (Fri)
  60960308400, #      utc_end 1932-10-03 03:00:00 (Mon)
  60944310000, #  local_start 1932-03-31 23:00:00 (Thu)
  60960297600, #    local_end 1932-10-03 00:00:00 (Mon)
  -10800,
  0,
  '-03',
      ],
      [
  60960308400, #    utc_start 1932-10-03 03:00:00 (Mon)
  60975856800, #      utc_end 1933-04-01 02:00:00 (Sat)
  60960301200, #  local_start 1932-10-03 01:00:00 (Mon)
  60975849600, #    local_end 1933-04-01 00:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  60975856800, #    utc_start 1933-04-01 02:00:00 (Sat)
  61501863600, #      utc_end 1949-12-01 03:00:00 (Thu)
  60975846000, #  local_start 1933-03-31 23:00:00 (Fri)
  61501852800, #    local_end 1949-12-01 00:00:00 (Thu)
  -10800,
  0,
  '-03',
      ],
      [
  61501863600, #    utc_start 1949-12-01 03:00:00 (Thu)
  61513614000, #      utc_end 1950-04-16 03:00:00 (Sun)
  61501856400, #  local_start 1949-12-01 01:00:00 (Thu)
  61513606800, #    local_end 1950-04-16 01:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  61513614000, #    utc_start 1950-04-16 03:00:00 (Sun)
  61533399600, #      utc_end 1950-12-01 03:00:00 (Fri)
  61513603200, #  local_start 1950-04-16 00:00:00 (Sun)
  61533388800, #    local_end 1950-12-01 00:00:00 (Fri)
  -10800,
  0,
  '-03',
      ],
      [
  61533399600, #    utc_start 1950-12-01 03:00:00 (Fri)
  61543850400, #      utc_end 1951-04-01 02:00:00 (Sun)
  61533392400, #  local_start 1950-12-01 01:00:00 (Fri)
  61543843200, #    local_end 1951-04-01 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  61543850400, #    utc_start 1951-04-01 02:00:00 (Sun)
  61564935600, #      utc_end 1951-12-01 03:00:00 (Sat)
  61543839600, #  local_start 1951-03-31 23:00:00 (Sat)
  61564924800, #    local_end 1951-12-01 00:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  61564935600, #    utc_start 1951-12-01 03:00:00 (Sat)
  61575472800, #      utc_end 1952-04-01 02:00:00 (Tue)
  61564928400, #  local_start 1951-12-01 01:00:00 (Sat)
  61575465600, #    local_end 1952-04-01 00:00:00 (Tue)
  -7200,
  1,
  '-02',
      ],
      [
  61575472800, #    utc_start 1952-04-01 02:00:00 (Tue)
  61596558000, #      utc_end 1952-12-01 03:00:00 (Mon)
  61575462000, #  local_start 1952-03-31 23:00:00 (Mon)
  61596547200, #    local_end 1952-12-01 00:00:00 (Mon)
  -10800,
  0,
  '-03',
      ],
      [
  61596558000, #    utc_start 1952-12-01 03:00:00 (Mon)
  61604330400, #      utc_end 1953-03-01 02:00:00 (Sun)
  61596550800, #  local_start 1952-12-01 01:00:00 (Mon)
  61604323200, #    local_end 1953-03-01 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  61604330400, #    utc_start 1953-03-01 02:00:00 (Sun)
  61940257200, #      utc_end 1963-10-23 03:00:00 (Wed)
  61604319600, #  local_start 1953-02-28 23:00:00 (Sat)
  61940246400, #    local_end 1963-10-23 00:00:00 (Wed)
  -10800,
  0,
  '-03',
      ],
      [
  61940257200, #    utc_start 1963-10-23 03:00:00 (Wed)
  61946301600, #      utc_end 1964-01-01 02:00:00 (Wed)
  61940250000, #  local_start 1963-10-23 01:00:00 (Wed)
  61946294400, #    local_end 1964-01-01 00:00:00 (Wed)
  -7200,
  1,
  '-02',
      ],
      [
  61946301600, #    utc_start 1964-01-01 02:00:00 (Wed)
  61951485600, #      utc_end 1964-03-01 02:00:00 (Sun)
  61946294400, #  local_start 1964-01-01 00:00:00 (Wed)
  61951478400, #    local_end 1964-03-01 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  61951485600, #    utc_start 1964-03-01 02:00:00 (Sun)
  61980519600, #      utc_end 1965-01-31 03:00:00 (Sun)
  61951474800, #  local_start 1964-02-29 23:00:00 (Sat)
  61980508800, #    local_end 1965-01-31 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  61980519600, #    utc_start 1965-01-31 03:00:00 (Sun)
  61985613600, #      utc_end 1965-03-31 02:00:00 (Wed)
  61980512400, #  local_start 1965-01-31 01:00:00 (Sun)
  61985606400, #    local_end 1965-03-31 00:00:00 (Wed)
  -7200,
  1,
  '-02',
      ],
      [
  61985613600, #    utc_start 1965-03-31 02:00:00 (Wed)
  62006785200, #      utc_end 1965-12-01 03:00:00 (Wed)
  61985602800, #  local_start 1965-03-30 23:00:00 (Tue)
  62006774400, #    local_end 1965-12-01 00:00:00 (Wed)
  -10800,
  0,
  '-03',
      ],
      [
  62006785200, #    utc_start 1965-12-01 03:00:00 (Wed)
  62014557600, #      utc_end 1966-03-01 02:00:00 (Tue)
  62006778000, #  local_start 1965-12-01 01:00:00 (Wed)
  62014550400, #    local_end 1966-03-01 00:00:00 (Tue)
  -7200,
  1,
  '-02',
      ],
      [
  62014557600, #    utc_start 1966-03-01 02:00:00 (Tue)
  62035729200, #      utc_end 1966-11-01 03:00:00 (Tue)
  62014546800, #  local_start 1966-02-28 23:00:00 (Mon)
  62035718400, #    local_end 1966-11-01 00:00:00 (Tue)
  -10800,
  0,
  '-03',
      ],
      [
  62035729200, #    utc_start 1966-11-01 03:00:00 (Tue)
  62046093600, #      utc_end 1967-03-01 02:00:00 (Wed)
  62035722000, #  local_start 1966-11-01 01:00:00 (Tue)
  62046086400, #    local_end 1967-03-01 00:00:00 (Wed)
  -7200,
  1,
  '-02',
      ],
      [
  62046093600, #    utc_start 1967-03-01 02:00:00 (Wed)
  62067265200, #      utc_end 1967-11-01 03:00:00 (Wed)
  62046082800, #  local_start 1967-02-28 23:00:00 (Tue)
  62067254400, #    local_end 1967-11-01 00:00:00 (Wed)
  -10800,
  0,
  '-03',
      ],
      [
  62067265200, #    utc_start 1967-11-01 03:00:00 (Wed)
  62077716000, #      utc_end 1968-03-01 02:00:00 (Fri)
  62067258000, #  local_start 1967-11-01 01:00:00 (Wed)
  62077708800, #    local_end 1968-03-01 00:00:00 (Fri)
  -7200,
  1,
  '-02',
      ],
      [
  62077716000, #    utc_start 1968-03-01 02:00:00 (Fri)
  62635431600, #      utc_end 1985-11-02 03:00:00 (Sat)
  62077705200, #  local_start 1968-02-29 23:00:00 (Thu)
  62635420800, #    local_end 1985-11-02 00:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  62635431600, #    utc_start 1985-11-02 03:00:00 (Sat)
  62646919200, #      utc_end 1986-03-15 02:00:00 (Sat)
  62635424400, #  local_start 1985-11-02 01:00:00 (Sat)
  62646912000, #    local_end 1986-03-15 00:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  62646919200, #    utc_start 1986-03-15 02:00:00 (Sat)
  62666276400, #      utc_end 1986-10-25 03:00:00 (Sat)
  62646908400, #  local_start 1986-03-14 23:00:00 (Fri)
  62666265600, #    local_end 1986-10-25 00:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  62666276400, #    utc_start 1986-10-25 03:00:00 (Sat)
  62675949600, #      utc_end 1987-02-14 02:00:00 (Sat)
  62666269200, #  local_start 1986-10-25 01:00:00 (Sat)
  62675942400, #    local_end 1987-02-14 00:00:00 (Sat)
  -7200,
  1,
  '-02',
      ],
      [
  62675949600, #    utc_start 1987-02-14 02:00:00 (Sat)
  62697812400, #      utc_end 1987-10-25 03:00:00 (Sun)
  62675938800, #  local_start 1987-02-13 23:00:00 (Fri)
  62697801600, #    local_end 1987-10-25 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62697812400, #    utc_start 1987-10-25 03:00:00 (Sun)
  62706880800, #      utc_end 1988-02-07 02:00:00 (Sun)
  62697805200, #  local_start 1987-10-25 01:00:00 (Sun)
  62706873600, #    local_end 1988-02-07 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62706880800, #    utc_start 1988-02-07 02:00:00 (Sun)
  62728657200, #      utc_end 1988-10-16 03:00:00 (Sun)
  62706870000, #  local_start 1988-02-06 23:00:00 (Sat)
  62728646400, #    local_end 1988-10-16 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62728657200, #    utc_start 1988-10-16 03:00:00 (Sun)
  62737725600, #      utc_end 1989-01-29 02:00:00 (Sun)
  62728650000, #  local_start 1988-10-16 01:00:00 (Sun)
  62737718400, #    local_end 1989-01-29 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62737725600, #    utc_start 1989-01-29 02:00:00 (Sun)
  62760106800, #      utc_end 1989-10-15 03:00:00 (Sun)
  62737714800, #  local_start 1989-01-28 23:00:00 (Sat)
  62760096000, #    local_end 1989-10-15 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62760106800, #    utc_start 1989-10-15 03:00:00 (Sun)
  62770384800, #      utc_end 1990-02-11 02:00:00 (Sun)
  62760099600, #  local_start 1989-10-15 01:00:00 (Sun)
  62770377600, #    local_end 1990-02-11 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62770384800, #    utc_start 1990-02-11 02:00:00 (Sun)
  62792161200, #      utc_end 1990-10-21 03:00:00 (Sun)
  62770374000, #  local_start 1990-02-10 23:00:00 (Sat)
  62792150400, #    local_end 1990-10-21 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62792161200, #    utc_start 1990-10-21 03:00:00 (Sun)
  62802439200, #      utc_end 1991-02-17 02:00:00 (Sun)
  62792154000, #  local_start 1990-10-21 01:00:00 (Sun)
  62802432000, #    local_end 1991-02-17 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62802439200, #    utc_start 1991-02-17 02:00:00 (Sun)
  62823610800, #      utc_end 1991-10-20 03:00:00 (Sun)
  62802428400, #  local_start 1991-02-16 23:00:00 (Sat)
  62823600000, #    local_end 1991-10-20 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62823610800, #    utc_start 1991-10-20 03:00:00 (Sun)
  62833284000, #      utc_end 1992-02-09 02:00:00 (Sun)
  62823603600, #  local_start 1991-10-20 01:00:00 (Sun)
  62833276800, #    local_end 1992-02-09 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62833284000, #    utc_start 1992-02-09 02:00:00 (Sun)
  62855665200, #      utc_end 1992-10-25 03:00:00 (Sun)
  62833273200, #  local_start 1992-02-08 23:00:00 (Sat)
  62855654400, #    local_end 1992-10-25 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62855665200, #    utc_start 1992-10-25 03:00:00 (Sun)
  62864128800, #      utc_end 1993-01-31 02:00:00 (Sun)
  62855658000, #  local_start 1992-10-25 01:00:00 (Sun)
  62864121600, #    local_end 1993-01-31 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62864128800, #    utc_start 1993-01-31 02:00:00 (Sun)
  62886510000, #      utc_end 1993-10-17 03:00:00 (Sun)
  62864118000, #  local_start 1993-01-30 23:00:00 (Sat)
  62886499200, #    local_end 1993-10-17 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62886510000, #    utc_start 1993-10-17 03:00:00 (Sun)
  62897392800, #      utc_end 1994-02-20 02:00:00 (Sun)
  62886502800, #  local_start 1993-10-17 01:00:00 (Sun)
  62897385600, #    local_end 1994-02-20 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62897392800, #    utc_start 1994-02-20 02:00:00 (Sun)
  62917959600, #      utc_end 1994-10-16 03:00:00 (Sun)
  62897382000, #  local_start 1994-02-19 23:00:00 (Sat)
  62917948800, #    local_end 1994-10-16 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62917959600, #    utc_start 1994-10-16 03:00:00 (Sun)
  62928842400, #      utc_end 1995-02-19 02:00:00 (Sun)
  62917952400, #  local_start 1994-10-16 01:00:00 (Sun)
  62928835200, #    local_end 1995-02-19 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62928842400, #    utc_start 1995-02-19 02:00:00 (Sun)
  62949409200, #      utc_end 1995-10-15 03:00:00 (Sun)
  62928831600, #  local_start 1995-02-18 23:00:00 (Sat)
  62949398400, #    local_end 1995-10-15 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62949409200, #    utc_start 1995-10-15 03:00:00 (Sun)
  62959687200, #      utc_end 1996-02-11 02:00:00 (Sun)
  62949402000, #  local_start 1995-10-15 01:00:00 (Sun)
  62959680000, #    local_end 1996-02-11 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62959687200, #    utc_start 1996-02-11 02:00:00 (Sun)
  62980254000, #      utc_end 1996-10-06 03:00:00 (Sun)
  62959676400, #  local_start 1996-02-10 23:00:00 (Sat)
  62980243200, #    local_end 1996-10-06 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62980254000, #    utc_start 1996-10-06 03:00:00 (Sun)
  62991741600, #      utc_end 1997-02-16 02:00:00 (Sun)
  62980246800, #  local_start 1996-10-06 01:00:00 (Sun)
  62991734400, #    local_end 1997-02-16 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62991741600, #    utc_start 1997-02-16 02:00:00 (Sun)
  63011790000, #      utc_end 1997-10-06 03:00:00 (Mon)
  62991730800, #  local_start 1997-02-15 23:00:00 (Sat)
  63011779200, #    local_end 1997-10-06 00:00:00 (Mon)
  -10800,
  0,
  '-03',
      ],
      [
  63011790000, #    utc_start 1997-10-06 03:00:00 (Mon)
  63024400800, #      utc_end 1998-03-01 02:00:00 (Sun)
  63011782800, #  local_start 1997-10-06 01:00:00 (Mon)
  63024393600, #    local_end 1998-03-01 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63024400800, #    utc_start 1998-03-01 02:00:00 (Sun)
  63043758000, #      utc_end 1998-10-11 03:00:00 (Sun)
  63024390000, #  local_start 1998-02-28 23:00:00 (Sat)
  63043747200, #    local_end 1998-10-11 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63043758000, #    utc_start 1998-10-11 03:00:00 (Sun)
  63055245600, #      utc_end 1999-02-21 02:00:00 (Sun)
  63043750800, #  local_start 1998-10-11 01:00:00 (Sun)
  63055238400, #    local_end 1999-02-21 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63055245600, #    utc_start 1999-02-21 02:00:00 (Sun)
  63074602800, #      utc_end 1999-10-03 03:00:00 (Sun)
  63055234800, #  local_start 1999-02-20 23:00:00 (Sat)
  63074592000, #    local_end 1999-10-03 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63074602800, #    utc_start 1999-10-03 03:00:00 (Sun)
  63087300000, #      utc_end 2000-02-27 02:00:00 (Sun)
  63074595600, #  local_start 1999-10-03 01:00:00 (Sun)
  63087292800, #    local_end 2000-02-27 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63087300000, #    utc_start 2000-02-27 02:00:00 (Sun)
  63106657200, #      utc_end 2000-10-08 03:00:00 (Sun)
  63087289200, #  local_start 2000-02-26 23:00:00 (Sat)
  63106646400, #    local_end 2000-10-08 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63106657200, #    utc_start 2000-10-08 03:00:00 (Sun)
  63118144800, #      utc_end 2001-02-18 02:00:00 (Sun)
  63106650000, #  local_start 2000-10-08 01:00:00 (Sun)
  63118137600, #    local_end 2001-02-18 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63118144800, #    utc_start 2001-02-18 02:00:00 (Sun)
  63138711600, #      utc_end 2001-10-14 03:00:00 (Sun)
  63118134000, #  local_start 2001-02-17 23:00:00 (Sat)
  63138700800, #    local_end 2001-10-14 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63138711600, #    utc_start 2001-10-14 03:00:00 (Sun)
  63149594400, #      utc_end 2002-02-17 02:00:00 (Sun)
  63138704400, #  local_start 2001-10-14 01:00:00 (Sun)
  63149587200, #    local_end 2002-02-17 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63149594400, #    utc_start 2002-02-17 02:00:00 (Sun)
  63171975600, #      utc_end 2002-11-03 03:00:00 (Sun)
  63149583600, #  local_start 2002-02-16 23:00:00 (Sat)
  63171964800, #    local_end 2002-11-03 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63171975600, #    utc_start 2002-11-03 03:00:00 (Sun)
  63181044000, #      utc_end 2003-02-16 02:00:00 (Sun)
  63171968400, #  local_start 2002-11-03 01:00:00 (Sun)
  63181036800, #    local_end 2003-02-16 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63181044000, #    utc_start 2003-02-16 02:00:00 (Sun)
  63202215600, #      utc_end 2003-10-19 03:00:00 (Sun)
  63181033200, #  local_start 2003-02-15 23:00:00 (Sat)
  63202204800, #    local_end 2003-10-19 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63202215600, #    utc_start 2003-10-19 03:00:00 (Sun)
  63212493600, #      utc_end 2004-02-15 02:00:00 (Sun)
  63202208400, #  local_start 2003-10-19 01:00:00 (Sun)
  63212486400, #    local_end 2004-02-15 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63212493600, #    utc_start 2004-02-15 02:00:00 (Sun)
  63235047600, #      utc_end 2004-11-02 03:00:00 (Tue)
  63212482800, #  local_start 2004-02-14 23:00:00 (Sat)
  63235036800, #    local_end 2004-11-02 00:00:00 (Tue)
  -10800,
  0,
  '-03',
      ],
      [
  63235047600, #    utc_start 2004-11-02 03:00:00 (Tue)
  63244548000, #      utc_end 2005-02-20 02:00:00 (Sun)
  63235040400, #  local_start 2004-11-02 01:00:00 (Tue)
  63244540800, #    local_end 2005-02-20 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63244548000, #    utc_start 2005-02-20 02:00:00 (Sun)
  63265114800, #      utc_end 2005-10-16 03:00:00 (Sun)
  63244537200, #  local_start 2005-02-19 23:00:00 (Sat)
  63265104000, #    local_end 2005-10-16 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63265114800, #    utc_start 2005-10-16 03:00:00 (Sun)
  63275997600, #      utc_end 2006-02-19 02:00:00 (Sun)
  63265107600, #  local_start 2005-10-16 01:00:00 (Sun)
  63275990400, #    local_end 2006-02-19 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63275997600, #    utc_start 2006-02-19 02:00:00 (Sun)
  63298378800, #      utc_end 2006-11-05 03:00:00 (Sun)
  63275986800, #  local_start 2006-02-18 23:00:00 (Sat)
  63298368000, #    local_end 2006-11-05 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63298378800, #    utc_start 2006-11-05 03:00:00 (Sun)
  63308052000, #      utc_end 2007-02-25 02:00:00 (Sun)
  63298371600, #  local_start 2006-11-05 01:00:00 (Sun)
  63308044800, #    local_end 2007-02-25 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63308052000, #    utc_start 2007-02-25 02:00:00 (Sun)
  63328014000, #      utc_end 2007-10-14 03:00:00 (Sun)
  63308041200, #  local_start 2007-02-24 23:00:00 (Sat)
  63328003200, #    local_end 2007-10-14 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63328014000, #    utc_start 2007-10-14 03:00:00 (Sun)
  63338896800, #      utc_end 2008-02-17 02:00:00 (Sun)
  63328006800, #  local_start 2007-10-14 01:00:00 (Sun)
  63338889600, #    local_end 2008-02-17 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63338896800, #    utc_start 2008-02-17 02:00:00 (Sun)
  63360068400, #      utc_end 2008-10-19 03:00:00 (Sun)
  63338886000, #  local_start 2008-02-16 23:00:00 (Sat)
  63360057600, #    local_end 2008-10-19 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63360068400, #    utc_start 2008-10-19 03:00:00 (Sun)
  63370346400, #      utc_end 2009-02-15 02:00:00 (Sun)
  63360061200, #  local_start 2008-10-19 01:00:00 (Sun)
  63370339200, #    local_end 2009-02-15 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63370346400, #    utc_start 2009-02-15 02:00:00 (Sun)
  63391518000, #      utc_end 2009-10-18 03:00:00 (Sun)
  63370335600, #  local_start 2009-02-14 23:00:00 (Sat)
  63391507200, #    local_end 2009-10-18 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63391518000, #    utc_start 2009-10-18 03:00:00 (Sun)
  63402400800, #      utc_end 2010-02-21 02:00:00 (Sun)
  63391510800, #  local_start 2009-10-18 01:00:00 (Sun)
  63402393600, #    local_end 2010-02-21 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63402400800, #    utc_start 2010-02-21 02:00:00 (Sun)
  63422967600, #      utc_end 2010-10-17 03:00:00 (Sun)
  63402390000, #  local_start 2010-02-20 23:00:00 (Sat)
  63422956800, #    local_end 2010-10-17 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63422967600, #    utc_start 2010-10-17 03:00:00 (Sun)
  63433850400, #      utc_end 2011-02-20 02:00:00 (Sun)
  63422960400, #  local_start 2010-10-17 01:00:00 (Sun)
  63433843200, #    local_end 2011-02-20 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63433850400, #    utc_start 2011-02-20 02:00:00 (Sun)
  63454417200, #      utc_end 2011-10-16 03:00:00 (Sun)
  63433839600, #  local_start 2011-02-19 23:00:00 (Sat)
  63454406400, #    local_end 2011-10-16 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63454417200, #    utc_start 2011-10-16 03:00:00 (Sun)
  63465904800, #      utc_end 2012-02-26 02:00:00 (Sun)
  63454410000, #  local_start 2011-10-16 01:00:00 (Sun)
  63465897600, #    local_end 2012-02-26 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63465904800, #    utc_start 2012-02-26 02:00:00 (Sun)
  63486471600, #      utc_end 2012-10-21 03:00:00 (Sun)
  63465894000, #  local_start 2012-02-25 23:00:00 (Sat)
  63486460800, #    local_end 2012-10-21 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63486471600, #    utc_start 2012-10-21 03:00:00 (Sun)
  63496749600, #      utc_end 2013-02-17 02:00:00 (Sun)
  63486464400, #  local_start 2012-10-21 01:00:00 (Sun)
  63496742400, #    local_end 2013-02-17 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63496749600, #    utc_start 2013-02-17 02:00:00 (Sun)
  63517921200, #      utc_end 2013-10-20 03:00:00 (Sun)
  63496738800, #  local_start 2013-02-16 23:00:00 (Sat)
  63517910400, #    local_end 2013-10-20 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63517921200, #    utc_start 2013-10-20 03:00:00 (Sun)
  63528199200, #      utc_end 2014-02-16 02:00:00 (Sun)
  63517914000, #  local_start 2013-10-20 01:00:00 (Sun)
  63528192000, #    local_end 2014-02-16 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63528199200, #    utc_start 2014-02-16 02:00:00 (Sun)
  63549370800, #      utc_end 2014-10-19 03:00:00 (Sun)
  63528188400, #  local_start 2014-02-15 23:00:00 (Sat)
  63549360000, #    local_end 2014-10-19 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63549370800, #    utc_start 2014-10-19 03:00:00 (Sun)
  63560253600, #      utc_end 2015-02-22 02:00:00 (Sun)
  63549363600, #  local_start 2014-10-19 01:00:00 (Sun)
  63560246400, #    local_end 2015-02-22 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63560253600, #    utc_start 2015-02-22 02:00:00 (Sun)
  63580820400, #      utc_end 2015-10-18 03:00:00 (Sun)
  63560242800, #  local_start 2015-02-21 23:00:00 (Sat)
  63580809600, #    local_end 2015-10-18 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63580820400, #    utc_start 2015-10-18 03:00:00 (Sun)
  63591703200, #      utc_end 2016-02-21 02:00:00 (Sun)
  63580813200, #  local_start 2015-10-18 01:00:00 (Sun)
  63591696000, #    local_end 2016-02-21 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63591703200, #    utc_start 2016-02-21 02:00:00 (Sun)
  63612270000, #      utc_end 2016-10-16 03:00:00 (Sun)
  63591692400, #  local_start 2016-02-20 23:00:00 (Sat)
  63612259200, #    local_end 2016-10-16 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63612270000, #    utc_start 2016-10-16 03:00:00 (Sun)
  63623152800, #      utc_end 2017-02-19 02:00:00 (Sun)
  63612262800, #  local_start 2016-10-16 01:00:00 (Sun)
  63623145600, #    local_end 2017-02-19 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63623152800, #    utc_start 2017-02-19 02:00:00 (Sun)
  63643719600, #      utc_end 2017-10-15 03:00:00 (Sun)
  63623142000, #  local_start 2017-02-18 23:00:00 (Sat)
  63643708800, #    local_end 2017-10-15 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63643719600, #    utc_start 2017-10-15 03:00:00 (Sun)
  63654602400, #      utc_end 2018-02-18 02:00:00 (Sun)
  63643712400, #  local_start 2017-10-15 01:00:00 (Sun)
  63654595200, #    local_end 2018-02-18 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63654602400, #    utc_start 2018-02-18 02:00:00 (Sun)
  63676983600, #      utc_end 2018-11-04 03:00:00 (Sun)
  63654591600, #  local_start 2018-02-17 23:00:00 (Sat)
  63676972800, #    local_end 2018-11-04 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  63676983600, #    utc_start 2018-11-04 03:00:00 (Sun)
  63686052000, #      utc_end 2019-02-17 02:00:00 (Sun)
  63676976400, #  local_start 2018-11-04 01:00:00 (Sun)
  63686044800, #    local_end 2019-02-17 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  63686052000, #    utc_start 2019-02-17 02:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #      utc_end
  63686041200, #  local_start 2019-02-16 23:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #    local_end
  -10800,
  0,
  '-03',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {46}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_SAO_PAULO

    $main::fatpacked{"DateTime/TimeZone/America/Scoresbysund.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_SCORESBYSUND';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Scoresbysund;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Scoresbysund::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60449592472, #      utc_end 1916-07-28 01:27:52 (Fri)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60449587200, #    local_end 1916-07-28 00:00:00 (Fri)
  -5272,
  0,
  'LMT',
      ],
      [
  60449592472, #    utc_start 1916-07-28 01:27:52 (Fri)
  62459524800, #      utc_end 1980-04-06 04:00:00 (Sun)
  60449585272, #  local_start 1916-07-27 23:27:52 (Thu)
  62459517600, #    local_end 1980-04-06 02:00:00 (Sun)
  -7200,
  0,
  '-02',
      ],
      [
  62459524800, #    utc_start 1980-04-06 04:00:00 (Sun)
  62474644800, #      utc_end 1980-09-28 04:00:00 (Sun)
  62459521200, #  local_start 1980-04-06 03:00:00 (Sun)
  62474641200, #    local_end 1980-09-28 03:00:00 (Sun)
  -3600,
  1,
  '-01',
      ],
      [
  62474644800, #    utc_start 1980-09-28 04:00:00 (Sun)
  62490362400, #      utc_end 1981-03-29 02:00:00 (Sun)
  62474637600, #  local_start 1980-09-28 02:00:00 (Sun)
  62490355200, #    local_end 1981-03-29 00:00:00 (Sun)
  -7200,
  0,
  '-02',
      ],
      [
  62490362400, #    utc_start 1981-03-29 02:00:00 (Sun)
  62506083600, #      utc_end 1981-09-27 01:00:00 (Sun)
  62490362400, #  local_start 1981-03-29 02:00:00 (Sun)
  62506083600, #    local_end 1981-09-27 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  62506083600, #    utc_start 1981-09-27 01:00:00 (Sun)
  62521808400, #      utc_end 1982-03-28 01:00:00 (Sun)
  62506080000, #  local_start 1981-09-27 00:00:00 (Sun)
  62521804800, #    local_end 1982-03-28 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  62521808400, #    utc_start 1982-03-28 01:00:00 (Sun)
  62537533200, #      utc_end 1982-09-26 01:00:00 (Sun)
  62521808400, #  local_start 1982-03-28 01:00:00 (Sun)
  62537533200, #    local_end 1982-09-26 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  62537533200, #    utc_start 1982-09-26 01:00:00 (Sun)
  62553258000, #      utc_end 1983-03-27 01:00:00 (Sun)
  62537529600, #  local_start 1982-09-26 00:00:00 (Sun)
  62553254400, #    local_end 1983-03-27 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  62553258000, #    utc_start 1983-03-27 01:00:00 (Sun)
  62568982800, #      utc_end 1983-09-25 01:00:00 (Sun)
  62553258000, #  local_start 1983-03-27 01:00:00 (Sun)
  62568982800, #    local_end 1983-09-25 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  62568982800, #    utc_start 1983-09-25 01:00:00 (Sun)
  62584707600, #      utc_end 1984-03-25 01:00:00 (Sun)
  62568979200, #  local_start 1983-09-25 00:00:00 (Sun)
  62584704000, #    local_end 1984-03-25 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  62584707600, #    utc_start 1984-03-25 01:00:00 (Sun)
  62601037200, #      utc_end 1984-09-30 01:00:00 (Sun)
  62584707600, #  local_start 1984-03-25 01:00:00 (Sun)
  62601037200, #    local_end 1984-09-30 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  62601037200, #    utc_start 1984-09-30 01:00:00 (Sun)
  62616762000, #      utc_end 1985-03-31 01:00:00 (Sun)
  62601033600, #  local_start 1984-09-30 00:00:00 (Sun)
  62616758400, #    local_end 1985-03-31 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  62616762000, #    utc_start 1985-03-31 01:00:00 (Sun)
  62632486800, #      utc_end 1985-09-29 01:00:00 (Sun)
  62616762000, #  local_start 1985-03-31 01:00:00 (Sun)
  62632486800, #    local_end 1985-09-29 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  62632486800, #    utc_start 1985-09-29 01:00:00 (Sun)
  62648211600, #      utc_end 1986-03-30 01:00:00 (Sun)
  62632483200, #  local_start 1985-09-29 00:00:00 (Sun)
  62648208000, #    local_end 1986-03-30 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  62648211600, #    utc_start 1986-03-30 01:00:00 (Sun)
  62663936400, #      utc_end 1986-09-28 01:00:00 (Sun)
  62648211600, #  local_start 1986-03-30 01:00:00 (Sun)
  62663936400, #    local_end 1986-09-28 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  62663936400, #    utc_start 1986-09-28 01:00:00 (Sun)
  62679661200, #      utc_end 1987-03-29 01:00:00 (Sun)
  62663932800, #  local_start 1986-09-28 00:00:00 (Sun)
  62679657600, #    local_end 1987-03-29 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  62679661200, #    utc_start 1987-03-29 01:00:00 (Sun)
  62695386000, #      utc_end 1987-09-27 01:00:00 (Sun)
  62679661200, #  local_start 1987-03-29 01:00:00 (Sun)
  62695386000, #    local_end 1987-09-27 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  62695386000, #    utc_start 1987-09-27 01:00:00 (Sun)
  62711110800, #      utc_end 1988-03-27 01:00:00 (Sun)
  62695382400, #  local_start 1987-09-27 00:00:00 (Sun)
  62711107200, #    local_end 1988-03-27 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  62711110800, #    utc_start 1988-03-27 01:00:00 (Sun)
  62726835600, #      utc_end 1988-09-25 01:00:00 (Sun)
  62711110800, #  local_start 1988-03-27 01:00:00 (Sun)
  62726835600, #    local_end 1988-09-25 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  62726835600, #    utc_start 1988-09-25 01:00:00 (Sun)
  62742560400, #      utc_end 1989-03-26 01:00:00 (Sun)
  62726832000, #  local_start 1988-09-25 00:00:00 (Sun)
  62742556800, #    local_end 1989-03-26 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  62742560400, #    utc_start 1989-03-26 01:00:00 (Sun)
  62758285200, #      utc_end 1989-09-24 01:00:00 (Sun)
  62742560400, #  local_start 1989-03-26 01:00:00 (Sun)
  62758285200, #    local_end 1989-09-24 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  62758285200, #    utc_start 1989-09-24 01:00:00 (Sun)
  62774010000, #      utc_end 1990-03-25 01:00:00 (Sun)
  62758281600, #  local_start 1989-09-24 00:00:00 (Sun)
  62774006400, #    local_end 1990-03-25 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  62774010000, #    utc_start 1990-03-25 01:00:00 (Sun)
  62790339600, #      utc_end 1990-09-30 01:00:00 (Sun)
  62774010000, #  local_start 1990-03-25 01:00:00 (Sun)
  62790339600, #    local_end 1990-09-30 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  62790339600, #    utc_start 1990-09-30 01:00:00 (Sun)
  62806064400, #      utc_end 1991-03-31 01:00:00 (Sun)
  62790336000, #  local_start 1990-09-30 00:00:00 (Sun)
  62806060800, #    local_end 1991-03-31 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  62806064400, #    utc_start 1991-03-31 01:00:00 (Sun)
  62821789200, #      utc_end 1991-09-29 01:00:00 (Sun)
  62806064400, #  local_start 1991-03-31 01:00:00 (Sun)
  62821789200, #    local_end 1991-09-29 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  62821789200, #    utc_start 1991-09-29 01:00:00 (Sun)
  62837514000, #      utc_end 1992-03-29 01:00:00 (Sun)
  62821785600, #  local_start 1991-09-29 00:00:00 (Sun)
  62837510400, #    local_end 1992-03-29 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  62837514000, #    utc_start 1992-03-29 01:00:00 (Sun)
  62853238800, #      utc_end 1992-09-27 01:00:00 (Sun)
  62837514000, #  local_start 1992-03-29 01:00:00 (Sun)
  62853238800, #    local_end 1992-09-27 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  62853238800, #    utc_start 1992-09-27 01:00:00 (Sun)
  62868963600, #      utc_end 1993-03-28 01:00:00 (Sun)
  62853235200, #  local_start 1992-09-27 00:00:00 (Sun)
  62868960000, #    local_end 1993-03-28 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  62868963600, #    utc_start 1993-03-28 01:00:00 (Sun)
  62884688400, #      utc_end 1993-09-26 01:00:00 (Sun)
  62868963600, #  local_start 1993-03-28 01:00:00 (Sun)
  62884688400, #    local_end 1993-09-26 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  62884688400, #    utc_start 1993-09-26 01:00:00 (Sun)
  62900413200, #      utc_end 1994-03-27 01:00:00 (Sun)
  62884684800, #  local_start 1993-09-26 00:00:00 (Sun)
  62900409600, #    local_end 1994-03-27 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  62900413200, #    utc_start 1994-03-27 01:00:00 (Sun)
  62916138000, #      utc_end 1994-09-25 01:00:00 (Sun)
  62900413200, #  local_start 1994-03-27 01:00:00 (Sun)
  62916138000, #    local_end 1994-09-25 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  62916138000, #    utc_start 1994-09-25 01:00:00 (Sun)
  62931862800, #      utc_end 1995-03-26 01:00:00 (Sun)
  62916134400, #  local_start 1994-09-25 00:00:00 (Sun)
  62931859200, #    local_end 1995-03-26 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  62931862800, #    utc_start 1995-03-26 01:00:00 (Sun)
  62947587600, #      utc_end 1995-09-24 01:00:00 (Sun)
  62931862800, #  local_start 1995-03-26 01:00:00 (Sun)
  62947587600, #    local_end 1995-09-24 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  62947587600, #    utc_start 1995-09-24 01:00:00 (Sun)
  62963917200, #      utc_end 1996-03-31 01:00:00 (Sun)
  62947584000, #  local_start 1995-09-24 00:00:00 (Sun)
  62963913600, #    local_end 1996-03-31 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  62963917200, #    utc_start 1996-03-31 01:00:00 (Sun)
  62982061200, #      utc_end 1996-10-27 01:00:00 (Sun)
  62963917200, #  local_start 1996-03-31 01:00:00 (Sun)
  62982061200, #    local_end 1996-10-27 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  62982061200, #    utc_start 1996-10-27 01:00:00 (Sun)
  62995366800, #      utc_end 1997-03-30 01:00:00 (Sun)
  62982057600, #  local_start 1996-10-27 00:00:00 (Sun)
  62995363200, #    local_end 1997-03-30 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  62995366800, #    utc_start 1997-03-30 01:00:00 (Sun)
  63013510800, #      utc_end 1997-10-26 01:00:00 (Sun)
  62995366800, #  local_start 1997-03-30 01:00:00 (Sun)
  63013510800, #    local_end 1997-10-26 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63013510800, #    utc_start 1997-10-26 01:00:00 (Sun)
  63026816400, #      utc_end 1998-03-29 01:00:00 (Sun)
  63013507200, #  local_start 1997-10-26 00:00:00 (Sun)
  63026812800, #    local_end 1998-03-29 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  63026816400, #    utc_start 1998-03-29 01:00:00 (Sun)
  63044960400, #      utc_end 1998-10-25 01:00:00 (Sun)
  63026816400, #  local_start 1998-03-29 01:00:00 (Sun)
  63044960400, #    local_end 1998-10-25 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63044960400, #    utc_start 1998-10-25 01:00:00 (Sun)
  63058266000, #      utc_end 1999-03-28 01:00:00 (Sun)
  63044956800, #  local_start 1998-10-25 00:00:00 (Sun)
  63058262400, #    local_end 1999-03-28 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  63058266000, #    utc_start 1999-03-28 01:00:00 (Sun)
  63077014800, #      utc_end 1999-10-31 01:00:00 (Sun)
  63058266000, #  local_start 1999-03-28 01:00:00 (Sun)
  63077014800, #    local_end 1999-10-31 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63077014800, #    utc_start 1999-10-31 01:00:00 (Sun)
  63089715600, #      utc_end 2000-03-26 01:00:00 (Sun)
  63077011200, #  local_start 1999-10-31 00:00:00 (Sun)
  63089712000, #    local_end 2000-03-26 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  63089715600, #    utc_start 2000-03-26 01:00:00 (Sun)
  63108464400, #      utc_end 2000-10-29 01:00:00 (Sun)
  63089715600, #  local_start 2000-03-26 01:00:00 (Sun)
  63108464400, #    local_end 2000-10-29 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63108464400, #    utc_start 2000-10-29 01:00:00 (Sun)
  63121165200, #      utc_end 2001-03-25 01:00:00 (Sun)
  63108460800, #  local_start 2000-10-29 00:00:00 (Sun)
  63121161600, #    local_end 2001-03-25 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  63121165200, #    utc_start 2001-03-25 01:00:00 (Sun)
  63139914000, #      utc_end 2001-10-28 01:00:00 (Sun)
  63121165200, #  local_start 2001-03-25 01:00:00 (Sun)
  63139914000, #    local_end 2001-10-28 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63139914000, #    utc_start 2001-10-28 01:00:00 (Sun)
  63153219600, #      utc_end 2002-03-31 01:00:00 (Sun)
  63139910400, #  local_start 2001-10-28 00:00:00 (Sun)
  63153216000, #    local_end 2002-03-31 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  63153219600, #    utc_start 2002-03-31 01:00:00 (Sun)
  63171363600, #      utc_end 2002-10-27 01:00:00 (Sun)
  63153219600, #  local_start 2002-03-31 01:00:00 (Sun)
  63171363600, #    local_end 2002-10-27 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63171363600, #    utc_start 2002-10-27 01:00:00 (Sun)
  63184669200, #      utc_end 2003-03-30 01:00:00 (Sun)
  63171360000, #  local_start 2002-10-27 00:00:00 (Sun)
  63184665600, #    local_end 2003-03-30 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  63184669200, #    utc_start 2003-03-30 01:00:00 (Sun)
  63202813200, #      utc_end 2003-10-26 01:00:00 (Sun)
  63184669200, #  local_start 2003-03-30 01:00:00 (Sun)
  63202813200, #    local_end 2003-10-26 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63202813200, #    utc_start 2003-10-26 01:00:00 (Sun)
  63216118800, #      utc_end 2004-03-28 01:00:00 (Sun)
  63202809600, #  local_start 2003-10-26 00:00:00 (Sun)
  63216115200, #    local_end 2004-03-28 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  63216118800, #    utc_start 2004-03-28 01:00:00 (Sun)
  63234867600, #      utc_end 2004-10-31 01:00:00 (Sun)
  63216118800, #  local_start 2004-03-28 01:00:00 (Sun)
  63234867600, #    local_end 2004-10-31 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63234867600, #    utc_start 2004-10-31 01:00:00 (Sun)
  63247568400, #      utc_end 2005-03-27 01:00:00 (Sun)
  63234864000, #  local_start 2004-10-31 00:00:00 (Sun)
  63247564800, #    local_end 2005-03-27 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  63247568400, #    utc_start 2005-03-27 01:00:00 (Sun)
  63266317200, #      utc_end 2005-10-30 01:00:00 (Sun)
  63247568400, #  local_start 2005-03-27 01:00:00 (Sun)
  63266317200, #    local_end 2005-10-30 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63266317200, #    utc_start 2005-10-30 01:00:00 (Sun)
  63279018000, #      utc_end 2006-03-26 01:00:00 (Sun)
  63266313600, #  local_start 2005-10-30 00:00:00 (Sun)
  63279014400, #    local_end 2006-03-26 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  63279018000, #    utc_start 2006-03-26 01:00:00 (Sun)
  63297766800, #      utc_end 2006-10-29 01:00:00 (Sun)
  63279018000, #  local_start 2006-03-26 01:00:00 (Sun)
  63297766800, #    local_end 2006-10-29 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63297766800, #    utc_start 2006-10-29 01:00:00 (Sun)
  63310467600, #      utc_end 2007-03-25 01:00:00 (Sun)
  63297763200, #  local_start 2006-10-29 00:00:00 (Sun)
  63310464000, #    local_end 2007-03-25 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  63310467600, #    utc_start 2007-03-25 01:00:00 (Sun)
  63329216400, #      utc_end 2007-10-28 01:00:00 (Sun)
  63310467600, #  local_start 2007-03-25 01:00:00 (Sun)
  63329216400, #    local_end 2007-10-28 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63329216400, #    utc_start 2007-10-28 01:00:00 (Sun)
  63342522000, #      utc_end 2008-03-30 01:00:00 (Sun)
  63329212800, #  local_start 2007-10-28 00:00:00 (Sun)
  63342518400, #    local_end 2008-03-30 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  63342522000, #    utc_start 2008-03-30 01:00:00 (Sun)
  63360666000, #      utc_end 2008-10-26 01:00:00 (Sun)
  63342522000, #  local_start 2008-03-30 01:00:00 (Sun)
  63360666000, #    local_end 2008-10-26 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63360666000, #    utc_start 2008-10-26 01:00:00 (Sun)
  63373971600, #      utc_end 2009-03-29 01:00:00 (Sun)
  63360662400, #  local_start 2008-10-26 00:00:00 (Sun)
  63373968000, #    local_end 2009-03-29 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  63373971600, #    utc_start 2009-03-29 01:00:00 (Sun)
  63392115600, #      utc_end 2009-10-25 01:00:00 (Sun)
  63373971600, #  local_start 2009-03-29 01:00:00 (Sun)
  63392115600, #    local_end 2009-10-25 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63392115600, #    utc_start 2009-10-25 01:00:00 (Sun)
  63405421200, #      utc_end 2010-03-28 01:00:00 (Sun)
  63392112000, #  local_start 2009-10-25 00:00:00 (Sun)
  63405417600, #    local_end 2010-03-28 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  63405421200, #    utc_start 2010-03-28 01:00:00 (Sun)
  63424170000, #      utc_end 2010-10-31 01:00:00 (Sun)
  63405421200, #  local_start 2010-03-28 01:00:00 (Sun)
  63424170000, #    local_end 2010-10-31 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63424170000, #    utc_start 2010-10-31 01:00:00 (Sun)
  63436870800, #      utc_end 2011-03-27 01:00:00 (Sun)
  63424166400, #  local_start 2010-10-31 00:00:00 (Sun)
  63436867200, #    local_end 2011-03-27 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  63436870800, #    utc_start 2011-03-27 01:00:00 (Sun)
  63455619600, #      utc_end 2011-10-30 01:00:00 (Sun)
  63436870800, #  local_start 2011-03-27 01:00:00 (Sun)
  63455619600, #    local_end 2011-10-30 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63455619600, #    utc_start 2011-10-30 01:00:00 (Sun)
  63468320400, #      utc_end 2012-03-25 01:00:00 (Sun)
  63455616000, #  local_start 2011-10-30 00:00:00 (Sun)
  63468316800, #    local_end 2012-03-25 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  63468320400, #    utc_start 2012-03-25 01:00:00 (Sun)
  63487069200, #      utc_end 2012-10-28 01:00:00 (Sun)
  63468320400, #  local_start 2012-03-25 01:00:00 (Sun)
  63487069200, #    local_end 2012-10-28 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63487069200, #    utc_start 2012-10-28 01:00:00 (Sun)
  63500374800, #      utc_end 2013-03-31 01:00:00 (Sun)
  63487065600, #  local_start 2012-10-28 00:00:00 (Sun)
  63500371200, #    local_end 2013-03-31 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  63500374800, #    utc_start 2013-03-31 01:00:00 (Sun)
  63518518800, #      utc_end 2013-10-27 01:00:00 (Sun)
  63500374800, #  local_start 2013-03-31 01:00:00 (Sun)
  63518518800, #    local_end 2013-10-27 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63518518800, #    utc_start 2013-10-27 01:00:00 (Sun)
  63531824400, #      utc_end 2014-03-30 01:00:00 (Sun)
  63518515200, #  local_start 2013-10-27 00:00:00 (Sun)
  63531820800, #    local_end 2014-03-30 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  63531824400, #    utc_start 2014-03-30 01:00:00 (Sun)
  63549968400, #      utc_end 2014-10-26 01:00:00 (Sun)
  63531824400, #  local_start 2014-03-30 01:00:00 (Sun)
  63549968400, #    local_end 2014-10-26 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63549968400, #    utc_start 2014-10-26 01:00:00 (Sun)
  63563274000, #      utc_end 2015-03-29 01:00:00 (Sun)
  63549964800, #  local_start 2014-10-26 00:00:00 (Sun)
  63563270400, #    local_end 2015-03-29 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  63563274000, #    utc_start 2015-03-29 01:00:00 (Sun)
  63581418000, #      utc_end 2015-10-25 01:00:00 (Sun)
  63563274000, #  local_start 2015-03-29 01:00:00 (Sun)
  63581418000, #    local_end 2015-10-25 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63581418000, #    utc_start 2015-10-25 01:00:00 (Sun)
  63594723600, #      utc_end 2016-03-27 01:00:00 (Sun)
  63581414400, #  local_start 2015-10-25 00:00:00 (Sun)
  63594720000, #    local_end 2016-03-27 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  63594723600, #    utc_start 2016-03-27 01:00:00 (Sun)
  63613472400, #      utc_end 2016-10-30 01:00:00 (Sun)
  63594723600, #  local_start 2016-03-27 01:00:00 (Sun)
  63613472400, #    local_end 2016-10-30 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63613472400, #    utc_start 2016-10-30 01:00:00 (Sun)
  63626173200, #      utc_end 2017-03-26 01:00:00 (Sun)
  63613468800, #  local_start 2016-10-30 00:00:00 (Sun)
  63626169600, #    local_end 2017-03-26 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  63626173200, #    utc_start 2017-03-26 01:00:00 (Sun)
  63644922000, #      utc_end 2017-10-29 01:00:00 (Sun)
  63626173200, #  local_start 2017-03-26 01:00:00 (Sun)
  63644922000, #    local_end 2017-10-29 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63644922000, #    utc_start 2017-10-29 01:00:00 (Sun)
  63657622800, #      utc_end 2018-03-25 01:00:00 (Sun)
  63644918400, #  local_start 2017-10-29 00:00:00 (Sun)
  63657619200, #    local_end 2018-03-25 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  63657622800, #    utc_start 2018-03-25 01:00:00 (Sun)
  63676371600, #      utc_end 2018-10-28 01:00:00 (Sun)
  63657622800, #  local_start 2018-03-25 01:00:00 (Sun)
  63676371600, #    local_end 2018-10-28 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63676371600, #    utc_start 2018-10-28 01:00:00 (Sun)
  63689677200, #      utc_end 2019-03-31 01:00:00 (Sun)
  63676368000, #  local_start 2018-10-28 00:00:00 (Sun)
  63689673600, #    local_end 2019-03-31 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  63689677200, #    utc_start 2019-03-31 01:00:00 (Sun)
  63707821200, #      utc_end 2019-10-27 01:00:00 (Sun)
  63689677200, #  local_start 2019-03-31 01:00:00 (Sun)
  63707821200, #    local_end 2019-10-27 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63707821200, #    utc_start 2019-10-27 01:00:00 (Sun)
  63721126800, #      utc_end 2020-03-29 01:00:00 (Sun)
  63707817600, #  local_start 2019-10-27 00:00:00 (Sun)
  63721123200, #    local_end 2020-03-29 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  63721126800, #    utc_start 2020-03-29 01:00:00 (Sun)
  63739270800, #      utc_end 2020-10-25 01:00:00 (Sun)
  63721126800, #  local_start 2020-03-29 01:00:00 (Sun)
  63739270800, #    local_end 2020-10-25 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63739270800, #    utc_start 2020-10-25 01:00:00 (Sun)
  63752576400, #      utc_end 2021-03-28 01:00:00 (Sun)
  63739267200, #  local_start 2020-10-25 00:00:00 (Sun)
  63752572800, #    local_end 2021-03-28 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  63752576400, #    utc_start 2021-03-28 01:00:00 (Sun)
  63771325200, #      utc_end 2021-10-31 01:00:00 (Sun)
  63752576400, #  local_start 2021-03-28 01:00:00 (Sun)
  63771325200, #    local_end 2021-10-31 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63771325200, #    utc_start 2021-10-31 01:00:00 (Sun)
  63784026000, #      utc_end 2022-03-27 01:00:00 (Sun)
  63771321600, #  local_start 2021-10-31 00:00:00 (Sun)
  63784022400, #    local_end 2022-03-27 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  63784026000, #    utc_start 2022-03-27 01:00:00 (Sun)
  63802774800, #      utc_end 2022-10-30 01:00:00 (Sun)
  63784026000, #  local_start 2022-03-27 01:00:00 (Sun)
  63802774800, #    local_end 2022-10-30 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63802774800, #    utc_start 2022-10-30 01:00:00 (Sun)
  63815475600, #      utc_end 2023-03-26 01:00:00 (Sun)
  63802771200, #  local_start 2022-10-30 00:00:00 (Sun)
  63815472000, #    local_end 2023-03-26 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  63815475600, #    utc_start 2023-03-26 01:00:00 (Sun)
  63834224400, #      utc_end 2023-10-29 01:00:00 (Sun)
  63815475600, #  local_start 2023-03-26 01:00:00 (Sun)
  63834224400, #    local_end 2023-10-29 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63834224400, #    utc_start 2023-10-29 01:00:00 (Sun)
  63847530000, #      utc_end 2024-03-31 01:00:00 (Sun)
  63834220800, #  local_start 2023-10-29 00:00:00 (Sun)
  63847526400, #    local_end 2024-03-31 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  63847530000, #    utc_start 2024-03-31 01:00:00 (Sun)
  63865674000, #      utc_end 2024-10-27 01:00:00 (Sun)
  63847530000, #  local_start 2024-03-31 01:00:00 (Sun)
  63865674000, #    local_end 2024-10-27 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63865674000, #    utc_start 2024-10-27 01:00:00 (Sun)
  63878979600, #      utc_end 2025-03-30 01:00:00 (Sun)
  63865670400, #  local_start 2024-10-27 00:00:00 (Sun)
  63878976000, #    local_end 2025-03-30 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  63878979600, #    utc_start 2025-03-30 01:00:00 (Sun)
  63897123600, #      utc_end 2025-10-26 01:00:00 (Sun)
  63878979600, #  local_start 2025-03-30 01:00:00 (Sun)
  63897123600, #    local_end 2025-10-26 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63897123600, #    utc_start 2025-10-26 01:00:00 (Sun)
  63910429200, #      utc_end 2026-03-29 01:00:00 (Sun)
  63897120000, #  local_start 2025-10-26 00:00:00 (Sun)
  63910425600, #    local_end 2026-03-29 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  63910429200, #    utc_start 2026-03-29 01:00:00 (Sun)
  63928573200, #      utc_end 2026-10-25 01:00:00 (Sun)
  63910429200, #  local_start 2026-03-29 01:00:00 (Sun)
  63928573200, #    local_end 2026-10-25 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63928573200, #    utc_start 2026-10-25 01:00:00 (Sun)
  63941878800, #      utc_end 2027-03-28 01:00:00 (Sun)
  63928569600, #  local_start 2026-10-25 00:00:00 (Sun)
  63941875200, #    local_end 2027-03-28 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  63941878800, #    utc_start 2027-03-28 01:00:00 (Sun)
  63960627600, #      utc_end 2027-10-31 01:00:00 (Sun)
  63941878800, #  local_start 2027-03-28 01:00:00 (Sun)
  63960627600, #    local_end 2027-10-31 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63960627600, #    utc_start 2027-10-31 01:00:00 (Sun)
  63973328400, #      utc_end 2028-03-26 01:00:00 (Sun)
  63960624000, #  local_start 2027-10-31 00:00:00 (Sun)
  63973324800, #    local_end 2028-03-26 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  63973328400, #    utc_start 2028-03-26 01:00:00 (Sun)
  63992077200, #      utc_end 2028-10-29 01:00:00 (Sun)
  63973328400, #  local_start 2028-03-26 01:00:00 (Sun)
  63992077200, #    local_end 2028-10-29 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63992077200, #    utc_start 2028-10-29 01:00:00 (Sun)
  64004778000, #      utc_end 2029-03-25 01:00:00 (Sun)
  63992073600, #  local_start 2028-10-29 00:00:00 (Sun)
  64004774400, #    local_end 2029-03-25 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  64004778000, #    utc_start 2029-03-25 01:00:00 (Sun)
  64023526800, #      utc_end 2029-10-28 01:00:00 (Sun)
  64004778000, #  local_start 2029-03-25 01:00:00 (Sun)
  64023526800, #    local_end 2029-10-28 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  64023526800, #    utc_start 2029-10-28 01:00:00 (Sun)
  64036832400, #      utc_end 2030-03-31 01:00:00 (Sun)
  64023523200, #  local_start 2029-10-28 00:00:00 (Sun)
  64036828800, #    local_end 2030-03-31 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  64036832400, #    utc_start 2030-03-31 01:00:00 (Sun)
  64054976400, #      utc_end 2030-10-27 01:00:00 (Sun)
  64036832400, #  local_start 2030-03-31 01:00:00 (Sun)
  64054976400, #    local_end 2030-10-27 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {51}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -3600 }
  
  my $last_observance = bless( {
    'format' => '-01/+00',
    'gmtoff' => '-1:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 723268,
      'local_rd_secs' => 7200,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 723268,
      'utc_rd_secs' => 7200,
      'utc_year' => 1982
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -3600,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 723268,
      'local_rd_secs' => 7200,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 723268,
      'utc_rd_secs' => 7200,
      'utc_year' => 1982
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '1:00u',
      'from' => '1981',
      'in' => 'Mar',
      'letter' => 'S',
      'name' => 'EU',
      'offset_from_std' => 3600,
      'on' => 'lastSun',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '1:00u',
      'from' => '1996',
      'in' => 'Oct',
      'letter' => '',
      'name' => 'EU',
      'offset_from_std' => 0,
      'on' => 'lastSun',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_SCORESBYSUND

    $main::fatpacked{"DateTime/TimeZone/America/Sitka.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_SITKA';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Sitka;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Sitka::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  58910459473, #      utc_end 1867-10-19 00:31:13 (Sat)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  58910513400, #    local_end 1867-10-19 15:30:00 (Sat)
  53927,
  0,
  'LMT',
      ],
      [
  58910459473, #    utc_start 1867-10-19 00:31:13 (Sat)
  59946728473, #      utc_end 1900-08-20 21:01:13 (Mon)
  58910427000, #  local_start 1867-10-18 15:30:00 (Fri)
  59946696000, #    local_end 1900-08-20 12:00:00 (Mon)
  -32473,
  0,
  'LMT',
      ],
      [
  59946728473, #    utc_start 1900-08-20 21:01:13 (Mon)
  61252099200, #      utc_end 1942-01-01 08:00:00 (Thu)
  59946699673, #  local_start 1900-08-20 13:01:13 (Mon)
  61252070400, #    local_end 1942-01-01 00:00:00 (Thu)
  -28800,
  0,
  'PST',
      ],
      [
  61252099200, #    utc_start 1942-01-01 08:00:00 (Thu)
  61255476000, #      utc_end 1942-02-09 10:00:00 (Mon)
  61252070400, #  local_start 1942-01-01 00:00:00 (Thu)
  61255447200, #    local_end 1942-02-09 02:00:00 (Mon)
  -28800,
  0,
  'PST',
      ],
      [
  61255476000, #    utc_start 1942-02-09 10:00:00 (Mon)
  61366287600, #      utc_end 1945-08-14 23:00:00 (Tue)
  61255450800, #  local_start 1942-02-09 03:00:00 (Mon)
  61366262400, #    local_end 1945-08-14 16:00:00 (Tue)
  -25200,
  1,
  'PWT',
      ],
      [
  61366287600, #    utc_start 1945-08-14 23:00:00 (Tue)
  61370298000, #      utc_end 1945-09-30 09:00:00 (Sun)
  61366262400, #  local_start 1945-08-14 16:00:00 (Tue)
  61370272800, #    local_end 1945-09-30 02:00:00 (Sun)
  -25200,
  1,
  'PPT',
      ],
      [
  61370298000, #    utc_start 1945-09-30 09:00:00 (Sun)
  61378329600, #      utc_end 1946-01-01 08:00:00 (Tue)
  61370269200, #  local_start 1945-09-30 01:00:00 (Sun)
  61378300800, #    local_end 1946-01-01 00:00:00 (Tue)
  -28800,
  0,
  'PST',
      ],
      [
  61378329600, #    utc_start 1946-01-01 08:00:00 (Tue)
  62104176000, #      utc_end 1969-01-01 08:00:00 (Wed)
  61378300800, #  local_start 1946-01-01 00:00:00 (Tue)
  62104147200, #    local_end 1969-01-01 00:00:00 (Wed)
  -28800,
  0,
  'PST',
      ],
      [
  62104176000, #    utc_start 1969-01-01 08:00:00 (Wed)
  62114205600, #      utc_end 1969-04-27 10:00:00 (Sun)
  62104147200, #  local_start 1969-01-01 00:00:00 (Wed)
  62114176800, #    local_end 1969-04-27 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62114205600, #    utc_start 1969-04-27 10:00:00 (Sun)
  62129926800, #      utc_end 1969-10-26 09:00:00 (Sun)
  62114180400, #  local_start 1969-04-27 03:00:00 (Sun)
  62129901600, #    local_end 1969-10-26 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62129926800, #    utc_start 1969-10-26 09:00:00 (Sun)
  62145655200, #      utc_end 1970-04-26 10:00:00 (Sun)
  62129898000, #  local_start 1969-10-26 01:00:00 (Sun)
  62145626400, #    local_end 1970-04-26 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62145655200, #    utc_start 1970-04-26 10:00:00 (Sun)
  62161376400, #      utc_end 1970-10-25 09:00:00 (Sun)
  62145630000, #  local_start 1970-04-26 03:00:00 (Sun)
  62161351200, #    local_end 1970-10-25 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62161376400, #    utc_start 1970-10-25 09:00:00 (Sun)
  62177104800, #      utc_end 1971-04-25 10:00:00 (Sun)
  62161347600, #  local_start 1970-10-25 01:00:00 (Sun)
  62177076000, #    local_end 1971-04-25 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62177104800, #    utc_start 1971-04-25 10:00:00 (Sun)
  62193430800, #      utc_end 1971-10-31 09:00:00 (Sun)
  62177079600, #  local_start 1971-04-25 03:00:00 (Sun)
  62193405600, #    local_end 1971-10-31 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62193430800, #    utc_start 1971-10-31 09:00:00 (Sun)
  62209159200, #      utc_end 1972-04-30 10:00:00 (Sun)
  62193402000, #  local_start 1971-10-31 01:00:00 (Sun)
  62209130400, #    local_end 1972-04-30 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62209159200, #    utc_start 1972-04-30 10:00:00 (Sun)
  62224880400, #      utc_end 1972-10-29 09:00:00 (Sun)
  62209134000, #  local_start 1972-04-30 03:00:00 (Sun)
  62224855200, #    local_end 1972-10-29 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62224880400, #    utc_start 1972-10-29 09:00:00 (Sun)
  62240608800, #      utc_end 1973-04-29 10:00:00 (Sun)
  62224851600, #  local_start 1972-10-29 01:00:00 (Sun)
  62240580000, #    local_end 1973-04-29 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62240608800, #    utc_start 1973-04-29 10:00:00 (Sun)
  62256330000, #      utc_end 1973-10-28 09:00:00 (Sun)
  62240583600, #  local_start 1973-04-29 03:00:00 (Sun)
  62256304800, #    local_end 1973-10-28 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62256330000, #    utc_start 1973-10-28 09:00:00 (Sun)
  62262381600, #      utc_end 1974-01-06 10:00:00 (Sun)
  62256301200, #  local_start 1973-10-28 01:00:00 (Sun)
  62262352800, #    local_end 1974-01-06 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62262381600, #    utc_start 1974-01-06 10:00:00 (Sun)
  62287779600, #      utc_end 1974-10-27 09:00:00 (Sun)
  62262356400, #  local_start 1974-01-06 03:00:00 (Sun)
  62287754400, #    local_end 1974-10-27 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62287779600, #    utc_start 1974-10-27 09:00:00 (Sun)
  62298064800, #      utc_end 1975-02-23 10:00:00 (Sun)
  62287750800, #  local_start 1974-10-27 01:00:00 (Sun)
  62298036000, #    local_end 1975-02-23 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62298064800, #    utc_start 1975-02-23 10:00:00 (Sun)
  62319229200, #      utc_end 1975-10-26 09:00:00 (Sun)
  62298039600, #  local_start 1975-02-23 03:00:00 (Sun)
  62319204000, #    local_end 1975-10-26 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62319229200, #    utc_start 1975-10-26 09:00:00 (Sun)
  62334957600, #      utc_end 1976-04-25 10:00:00 (Sun)
  62319200400, #  local_start 1975-10-26 01:00:00 (Sun)
  62334928800, #    local_end 1976-04-25 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62334957600, #    utc_start 1976-04-25 10:00:00 (Sun)
  62351283600, #      utc_end 1976-10-31 09:00:00 (Sun)
  62334932400, #  local_start 1976-04-25 03:00:00 (Sun)
  62351258400, #    local_end 1976-10-31 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62351283600, #    utc_start 1976-10-31 09:00:00 (Sun)
  62366407200, #      utc_end 1977-04-24 10:00:00 (Sun)
  62351254800, #  local_start 1976-10-31 01:00:00 (Sun)
  62366378400, #    local_end 1977-04-24 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62366407200, #    utc_start 1977-04-24 10:00:00 (Sun)
  62382733200, #      utc_end 1977-10-30 09:00:00 (Sun)
  62366382000, #  local_start 1977-04-24 03:00:00 (Sun)
  62382708000, #    local_end 1977-10-30 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62382733200, #    utc_start 1977-10-30 09:00:00 (Sun)
  62398461600, #      utc_end 1978-04-30 10:00:00 (Sun)
  62382704400, #  local_start 1977-10-30 01:00:00 (Sun)
  62398432800, #    local_end 1978-04-30 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62398461600, #    utc_start 1978-04-30 10:00:00 (Sun)
  62414182800, #      utc_end 1978-10-29 09:00:00 (Sun)
  62398436400, #  local_start 1978-04-30 03:00:00 (Sun)
  62414157600, #    local_end 1978-10-29 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62414182800, #    utc_start 1978-10-29 09:00:00 (Sun)
  62429911200, #      utc_end 1979-04-29 10:00:00 (Sun)
  62414154000, #  local_start 1978-10-29 01:00:00 (Sun)
  62429882400, #    local_end 1979-04-29 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62429911200, #    utc_start 1979-04-29 10:00:00 (Sun)
  62445632400, #      utc_end 1979-10-28 09:00:00 (Sun)
  62429886000, #  local_start 1979-04-29 03:00:00 (Sun)
  62445607200, #    local_end 1979-10-28 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62445632400, #    utc_start 1979-10-28 09:00:00 (Sun)
  62461360800, #      utc_end 1980-04-27 10:00:00 (Sun)
  62445603600, #  local_start 1979-10-28 01:00:00 (Sun)
  62461332000, #    local_end 1980-04-27 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62461360800, #    utc_start 1980-04-27 10:00:00 (Sun)
  62477082000, #      utc_end 1980-10-26 09:00:00 (Sun)
  62461335600, #  local_start 1980-04-27 03:00:00 (Sun)
  62477056800, #    local_end 1980-10-26 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62477082000, #    utc_start 1980-10-26 09:00:00 (Sun)
  62492810400, #      utc_end 1981-04-26 10:00:00 (Sun)
  62477053200, #  local_start 1980-10-26 01:00:00 (Sun)
  62492781600, #    local_end 1981-04-26 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62492810400, #    utc_start 1981-04-26 10:00:00 (Sun)
  62508531600, #      utc_end 1981-10-25 09:00:00 (Sun)
  62492785200, #  local_start 1981-04-26 03:00:00 (Sun)
  62508506400, #    local_end 1981-10-25 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62508531600, #    utc_start 1981-10-25 09:00:00 (Sun)
  62524260000, #      utc_end 1982-04-25 10:00:00 (Sun)
  62508502800, #  local_start 1981-10-25 01:00:00 (Sun)
  62524231200, #    local_end 1982-04-25 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62524260000, #    utc_start 1982-04-25 10:00:00 (Sun)
  62540586000, #      utc_end 1982-10-31 09:00:00 (Sun)
  62524234800, #  local_start 1982-04-25 03:00:00 (Sun)
  62540560800, #    local_end 1982-10-31 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62540586000, #    utc_start 1982-10-31 09:00:00 (Sun)
  62555709600, #      utc_end 1983-04-24 10:00:00 (Sun)
  62540557200, #  local_start 1982-10-31 01:00:00 (Sun)
  62555680800, #    local_end 1983-04-24 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62555709600, #    utc_start 1983-04-24 10:00:00 (Sun)
  62572035600, #      utc_end 1983-10-30 09:00:00 (Sun)
  62555684400, #  local_start 1983-04-24 03:00:00 (Sun)
  62572010400, #    local_end 1983-10-30 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62572035600, #    utc_start 1983-10-30 09:00:00 (Sun)
  62574714000, #      utc_end 1983-11-30 09:00:00 (Wed)
  62572003200, #  local_start 1983-10-30 00:00:00 (Sun)
  62574681600, #    local_end 1983-11-30 00:00:00 (Wed)
  -32400,
  0,
  'YST',
      ],
      [
  62574714000, #    utc_start 1983-11-30 09:00:00 (Wed)
  62587767600, #      utc_end 1984-04-29 11:00:00 (Sun)
  62574681600, #  local_start 1983-11-30 00:00:00 (Wed)
  62587735200, #    local_end 1984-04-29 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62587767600, #    utc_start 1984-04-29 11:00:00 (Sun)
  62603488800, #      utc_end 1984-10-28 10:00:00 (Sun)
  62587738800, #  local_start 1984-04-29 03:00:00 (Sun)
  62603460000, #    local_end 1984-10-28 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  62603488800, #    utc_start 1984-10-28 10:00:00 (Sun)
  62619217200, #      utc_end 1985-04-28 11:00:00 (Sun)
  62603456400, #  local_start 1984-10-28 01:00:00 (Sun)
  62619184800, #    local_end 1985-04-28 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62619217200, #    utc_start 1985-04-28 11:00:00 (Sun)
  62634938400, #      utc_end 1985-10-27 10:00:00 (Sun)
  62619188400, #  local_start 1985-04-28 03:00:00 (Sun)
  62634909600, #    local_end 1985-10-27 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  62634938400, #    utc_start 1985-10-27 10:00:00 (Sun)
  62650666800, #      utc_end 1986-04-27 11:00:00 (Sun)
  62634906000, #  local_start 1985-10-27 01:00:00 (Sun)
  62650634400, #    local_end 1986-04-27 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62650666800, #    utc_start 1986-04-27 11:00:00 (Sun)
  62666388000, #      utc_end 1986-10-26 10:00:00 (Sun)
  62650638000, #  local_start 1986-04-27 03:00:00 (Sun)
  62666359200, #    local_end 1986-10-26 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  62666388000, #    utc_start 1986-10-26 10:00:00 (Sun)
  62680302000, #      utc_end 1987-04-05 11:00:00 (Sun)
  62666355600, #  local_start 1986-10-26 01:00:00 (Sun)
  62680269600, #    local_end 1987-04-05 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62680302000, #    utc_start 1987-04-05 11:00:00 (Sun)
  62697837600, #      utc_end 1987-10-25 10:00:00 (Sun)
  62680273200, #  local_start 1987-04-05 03:00:00 (Sun)
  62697808800, #    local_end 1987-10-25 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  62697837600, #    utc_start 1987-10-25 10:00:00 (Sun)
  62711751600, #      utc_end 1988-04-03 11:00:00 (Sun)
  62697805200, #  local_start 1987-10-25 01:00:00 (Sun)
  62711719200, #    local_end 1988-04-03 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62711751600, #    utc_start 1988-04-03 11:00:00 (Sun)
  62729892000, #      utc_end 1988-10-30 10:00:00 (Sun)
  62711722800, #  local_start 1988-04-03 03:00:00 (Sun)
  62729863200, #    local_end 1988-10-30 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  62729892000, #    utc_start 1988-10-30 10:00:00 (Sun)
  62743201200, #      utc_end 1989-04-02 11:00:00 (Sun)
  62729859600, #  local_start 1988-10-30 01:00:00 (Sun)
  62743168800, #    local_end 1989-04-02 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62743201200, #    utc_start 1989-04-02 11:00:00 (Sun)
  62761341600, #      utc_end 1989-10-29 10:00:00 (Sun)
  62743172400, #  local_start 1989-04-02 03:00:00 (Sun)
  62761312800, #    local_end 1989-10-29 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  62761341600, #    utc_start 1989-10-29 10:00:00 (Sun)
  62774650800, #      utc_end 1990-04-01 11:00:00 (Sun)
  62761309200, #  local_start 1989-10-29 01:00:00 (Sun)
  62774618400, #    local_end 1990-04-01 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62774650800, #    utc_start 1990-04-01 11:00:00 (Sun)
  62792791200, #      utc_end 1990-10-28 10:00:00 (Sun)
  62774622000, #  local_start 1990-04-01 03:00:00 (Sun)
  62792762400, #    local_end 1990-10-28 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  62792791200, #    utc_start 1990-10-28 10:00:00 (Sun)
  62806705200, #      utc_end 1991-04-07 11:00:00 (Sun)
  62792758800, #  local_start 1990-10-28 01:00:00 (Sun)
  62806672800, #    local_end 1991-04-07 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62806705200, #    utc_start 1991-04-07 11:00:00 (Sun)
  62824240800, #      utc_end 1991-10-27 10:00:00 (Sun)
  62806676400, #  local_start 1991-04-07 03:00:00 (Sun)
  62824212000, #    local_end 1991-10-27 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  62824240800, #    utc_start 1991-10-27 10:00:00 (Sun)
  62838154800, #      utc_end 1992-04-05 11:00:00 (Sun)
  62824208400, #  local_start 1991-10-27 01:00:00 (Sun)
  62838122400, #    local_end 1992-04-05 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62838154800, #    utc_start 1992-04-05 11:00:00 (Sun)
  62855690400, #      utc_end 1992-10-25 10:00:00 (Sun)
  62838126000, #  local_start 1992-04-05 03:00:00 (Sun)
  62855661600, #    local_end 1992-10-25 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  62855690400, #    utc_start 1992-10-25 10:00:00 (Sun)
  62869604400, #      utc_end 1993-04-04 11:00:00 (Sun)
  62855658000, #  local_start 1992-10-25 01:00:00 (Sun)
  62869572000, #    local_end 1993-04-04 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62869604400, #    utc_start 1993-04-04 11:00:00 (Sun)
  62887744800, #      utc_end 1993-10-31 10:00:00 (Sun)
  62869575600, #  local_start 1993-04-04 03:00:00 (Sun)
  62887716000, #    local_end 1993-10-31 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  62887744800, #    utc_start 1993-10-31 10:00:00 (Sun)
  62901054000, #      utc_end 1994-04-03 11:00:00 (Sun)
  62887712400, #  local_start 1993-10-31 01:00:00 (Sun)
  62901021600, #    local_end 1994-04-03 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62901054000, #    utc_start 1994-04-03 11:00:00 (Sun)
  62919194400, #      utc_end 1994-10-30 10:00:00 (Sun)
  62901025200, #  local_start 1994-04-03 03:00:00 (Sun)
  62919165600, #    local_end 1994-10-30 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  62919194400, #    utc_start 1994-10-30 10:00:00 (Sun)
  62932503600, #      utc_end 1995-04-02 11:00:00 (Sun)
  62919162000, #  local_start 1994-10-30 01:00:00 (Sun)
  62932471200, #    local_end 1995-04-02 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62932503600, #    utc_start 1995-04-02 11:00:00 (Sun)
  62950644000, #      utc_end 1995-10-29 10:00:00 (Sun)
  62932474800, #  local_start 1995-04-02 03:00:00 (Sun)
  62950615200, #    local_end 1995-10-29 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  62950644000, #    utc_start 1995-10-29 10:00:00 (Sun)
  62964558000, #      utc_end 1996-04-07 11:00:00 (Sun)
  62950611600, #  local_start 1995-10-29 01:00:00 (Sun)
  62964525600, #    local_end 1996-04-07 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62964558000, #    utc_start 1996-04-07 11:00:00 (Sun)
  62982093600, #      utc_end 1996-10-27 10:00:00 (Sun)
  62964529200, #  local_start 1996-04-07 03:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  62982093600, #    utc_start 1996-10-27 10:00:00 (Sun)
  62996007600, #      utc_end 1997-04-06 11:00:00 (Sun)
  62982061200, #  local_start 1996-10-27 01:00:00 (Sun)
  62995975200, #    local_end 1997-04-06 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62996007600, #    utc_start 1997-04-06 11:00:00 (Sun)
  63013543200, #      utc_end 1997-10-26 10:00:00 (Sun)
  62995978800, #  local_start 1997-04-06 03:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63013543200, #    utc_start 1997-10-26 10:00:00 (Sun)
  63027457200, #      utc_end 1998-04-05 11:00:00 (Sun)
  63013510800, #  local_start 1997-10-26 01:00:00 (Sun)
  63027424800, #    local_end 1998-04-05 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63027457200, #    utc_start 1998-04-05 11:00:00 (Sun)
  63044992800, #      utc_end 1998-10-25 10:00:00 (Sun)
  63027428400, #  local_start 1998-04-05 03:00:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63044992800, #    utc_start 1998-10-25 10:00:00 (Sun)
  63058906800, #      utc_end 1999-04-04 11:00:00 (Sun)
  63044960400, #  local_start 1998-10-25 01:00:00 (Sun)
  63058874400, #    local_end 1999-04-04 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63058906800, #    utc_start 1999-04-04 11:00:00 (Sun)
  63077047200, #      utc_end 1999-10-31 10:00:00 (Sun)
  63058878000, #  local_start 1999-04-04 03:00:00 (Sun)
  63077018400, #    local_end 1999-10-31 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63077047200, #    utc_start 1999-10-31 10:00:00 (Sun)
  63090356400, #      utc_end 2000-04-02 11:00:00 (Sun)
  63077014800, #  local_start 1999-10-31 01:00:00 (Sun)
  63090324000, #    local_end 2000-04-02 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63090356400, #    utc_start 2000-04-02 11:00:00 (Sun)
  63108496800, #      utc_end 2000-10-29 10:00:00 (Sun)
  63090327600, #  local_start 2000-04-02 03:00:00 (Sun)
  63108468000, #    local_end 2000-10-29 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63108496800, #    utc_start 2000-10-29 10:00:00 (Sun)
  63121806000, #      utc_end 2001-04-01 11:00:00 (Sun)
  63108464400, #  local_start 2000-10-29 01:00:00 (Sun)
  63121773600, #    local_end 2001-04-01 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63121806000, #    utc_start 2001-04-01 11:00:00 (Sun)
  63139946400, #      utc_end 2001-10-28 10:00:00 (Sun)
  63121777200, #  local_start 2001-04-01 03:00:00 (Sun)
  63139917600, #    local_end 2001-10-28 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63139946400, #    utc_start 2001-10-28 10:00:00 (Sun)
  63153860400, #      utc_end 2002-04-07 11:00:00 (Sun)
  63139914000, #  local_start 2001-10-28 01:00:00 (Sun)
  63153828000, #    local_end 2002-04-07 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63153860400, #    utc_start 2002-04-07 11:00:00 (Sun)
  63171396000, #      utc_end 2002-10-27 10:00:00 (Sun)
  63153831600, #  local_start 2002-04-07 03:00:00 (Sun)
  63171367200, #    local_end 2002-10-27 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63171396000, #    utc_start 2002-10-27 10:00:00 (Sun)
  63185310000, #      utc_end 2003-04-06 11:00:00 (Sun)
  63171363600, #  local_start 2002-10-27 01:00:00 (Sun)
  63185277600, #    local_end 2003-04-06 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63185310000, #    utc_start 2003-04-06 11:00:00 (Sun)
  63202845600, #      utc_end 2003-10-26 10:00:00 (Sun)
  63185281200, #  local_start 2003-04-06 03:00:00 (Sun)
  63202816800, #    local_end 2003-10-26 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63202845600, #    utc_start 2003-10-26 10:00:00 (Sun)
  63216759600, #      utc_end 2004-04-04 11:00:00 (Sun)
  63202813200, #  local_start 2003-10-26 01:00:00 (Sun)
  63216727200, #    local_end 2004-04-04 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63216759600, #    utc_start 2004-04-04 11:00:00 (Sun)
  63234900000, #      utc_end 2004-10-31 10:00:00 (Sun)
  63216730800, #  local_start 2004-04-04 03:00:00 (Sun)
  63234871200, #    local_end 2004-10-31 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63234900000, #    utc_start 2004-10-31 10:00:00 (Sun)
  63248209200, #      utc_end 2005-04-03 11:00:00 (Sun)
  63234867600, #  local_start 2004-10-31 01:00:00 (Sun)
  63248176800, #    local_end 2005-04-03 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63248209200, #    utc_start 2005-04-03 11:00:00 (Sun)
  63266349600, #      utc_end 2005-10-30 10:00:00 (Sun)
  63248180400, #  local_start 2005-04-03 03:00:00 (Sun)
  63266320800, #    local_end 2005-10-30 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63266349600, #    utc_start 2005-10-30 10:00:00 (Sun)
  63279658800, #      utc_end 2006-04-02 11:00:00 (Sun)
  63266317200, #  local_start 2005-10-30 01:00:00 (Sun)
  63279626400, #    local_end 2006-04-02 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63279658800, #    utc_start 2006-04-02 11:00:00 (Sun)
  63297799200, #      utc_end 2006-10-29 10:00:00 (Sun)
  63279630000, #  local_start 2006-04-02 03:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63297799200, #    utc_start 2006-10-29 10:00:00 (Sun)
  63309294000, #      utc_end 2007-03-11 11:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63309261600, #    local_end 2007-03-11 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63309294000, #    utc_start 2007-03-11 11:00:00 (Sun)
  63329853600, #      utc_end 2007-11-04 10:00:00 (Sun)
  63309265200, #  local_start 2007-03-11 03:00:00 (Sun)
  63329824800, #    local_end 2007-11-04 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63329853600, #    utc_start 2007-11-04 10:00:00 (Sun)
  63340743600, #      utc_end 2008-03-09 11:00:00 (Sun)
  63329821200, #  local_start 2007-11-04 01:00:00 (Sun)
  63340711200, #    local_end 2008-03-09 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63340743600, #    utc_start 2008-03-09 11:00:00 (Sun)
  63361303200, #      utc_end 2008-11-02 10:00:00 (Sun)
  63340714800, #  local_start 2008-03-09 03:00:00 (Sun)
  63361274400, #    local_end 2008-11-02 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63361303200, #    utc_start 2008-11-02 10:00:00 (Sun)
  63372193200, #      utc_end 2009-03-08 11:00:00 (Sun)
  63361270800, #  local_start 2008-11-02 01:00:00 (Sun)
  63372160800, #    local_end 2009-03-08 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63372193200, #    utc_start 2009-03-08 11:00:00 (Sun)
  63392752800, #      utc_end 2009-11-01 10:00:00 (Sun)
  63372164400, #  local_start 2009-03-08 03:00:00 (Sun)
  63392724000, #    local_end 2009-11-01 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63392752800, #    utc_start 2009-11-01 10:00:00 (Sun)
  63404247600, #      utc_end 2010-03-14 11:00:00 (Sun)
  63392720400, #  local_start 2009-11-01 01:00:00 (Sun)
  63404215200, #    local_end 2010-03-14 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63404247600, #    utc_start 2010-03-14 11:00:00 (Sun)
  63424807200, #      utc_end 2010-11-07 10:00:00 (Sun)
  63404218800, #  local_start 2010-03-14 03:00:00 (Sun)
  63424778400, #    local_end 2010-11-07 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63424807200, #    utc_start 2010-11-07 10:00:00 (Sun)
  63435697200, #      utc_end 2011-03-13 11:00:00 (Sun)
  63424774800, #  local_start 2010-11-07 01:00:00 (Sun)
  63435664800, #    local_end 2011-03-13 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63435697200, #    utc_start 2011-03-13 11:00:00 (Sun)
  63456256800, #      utc_end 2011-11-06 10:00:00 (Sun)
  63435668400, #  local_start 2011-03-13 03:00:00 (Sun)
  63456228000, #    local_end 2011-11-06 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63456256800, #    utc_start 2011-11-06 10:00:00 (Sun)
  63467146800, #      utc_end 2012-03-11 11:00:00 (Sun)
  63456224400, #  local_start 2011-11-06 01:00:00 (Sun)
  63467114400, #    local_end 2012-03-11 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63467146800, #    utc_start 2012-03-11 11:00:00 (Sun)
  63487706400, #      utc_end 2012-11-04 10:00:00 (Sun)
  63467118000, #  local_start 2012-03-11 03:00:00 (Sun)
  63487677600, #    local_end 2012-11-04 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63487706400, #    utc_start 2012-11-04 10:00:00 (Sun)
  63498596400, #      utc_end 2013-03-10 11:00:00 (Sun)
  63487674000, #  local_start 2012-11-04 01:00:00 (Sun)
  63498564000, #    local_end 2013-03-10 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63498596400, #    utc_start 2013-03-10 11:00:00 (Sun)
  63519156000, #      utc_end 2013-11-03 10:00:00 (Sun)
  63498567600, #  local_start 2013-03-10 03:00:00 (Sun)
  63519127200, #    local_end 2013-11-03 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63519156000, #    utc_start 2013-11-03 10:00:00 (Sun)
  63530046000, #      utc_end 2014-03-09 11:00:00 (Sun)
  63519123600, #  local_start 2013-11-03 01:00:00 (Sun)
  63530013600, #    local_end 2014-03-09 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63530046000, #    utc_start 2014-03-09 11:00:00 (Sun)
  63550605600, #      utc_end 2014-11-02 10:00:00 (Sun)
  63530017200, #  local_start 2014-03-09 03:00:00 (Sun)
  63550576800, #    local_end 2014-11-02 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63550605600, #    utc_start 2014-11-02 10:00:00 (Sun)
  63561495600, #      utc_end 2015-03-08 11:00:00 (Sun)
  63550573200, #  local_start 2014-11-02 01:00:00 (Sun)
  63561463200, #    local_end 2015-03-08 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63561495600, #    utc_start 2015-03-08 11:00:00 (Sun)
  63582055200, #      utc_end 2015-11-01 10:00:00 (Sun)
  63561466800, #  local_start 2015-03-08 03:00:00 (Sun)
  63582026400, #    local_end 2015-11-01 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63582055200, #    utc_start 2015-11-01 10:00:00 (Sun)
  63593550000, #      utc_end 2016-03-13 11:00:00 (Sun)
  63582022800, #  local_start 2015-11-01 01:00:00 (Sun)
  63593517600, #    local_end 2016-03-13 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63593550000, #    utc_start 2016-03-13 11:00:00 (Sun)
  63614109600, #      utc_end 2016-11-06 10:00:00 (Sun)
  63593521200, #  local_start 2016-03-13 03:00:00 (Sun)
  63614080800, #    local_end 2016-11-06 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63614109600, #    utc_start 2016-11-06 10:00:00 (Sun)
  63624999600, #      utc_end 2017-03-12 11:00:00 (Sun)
  63614077200, #  local_start 2016-11-06 01:00:00 (Sun)
  63624967200, #    local_end 2017-03-12 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63624999600, #    utc_start 2017-03-12 11:00:00 (Sun)
  63645559200, #      utc_end 2017-11-05 10:00:00 (Sun)
  63624970800, #  local_start 2017-03-12 03:00:00 (Sun)
  63645530400, #    local_end 2017-11-05 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63645559200, #    utc_start 2017-11-05 10:00:00 (Sun)
  63656449200, #      utc_end 2018-03-11 11:00:00 (Sun)
  63645526800, #  local_start 2017-11-05 01:00:00 (Sun)
  63656416800, #    local_end 2018-03-11 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63656449200, #    utc_start 2018-03-11 11:00:00 (Sun)
  63677008800, #      utc_end 2018-11-04 10:00:00 (Sun)
  63656420400, #  local_start 2018-03-11 03:00:00 (Sun)
  63676980000, #    local_end 2018-11-04 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63677008800, #    utc_start 2018-11-04 10:00:00 (Sun)
  63687898800, #      utc_end 2019-03-10 11:00:00 (Sun)
  63676976400, #  local_start 2018-11-04 01:00:00 (Sun)
  63687866400, #    local_end 2019-03-10 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63687898800, #    utc_start 2019-03-10 11:00:00 (Sun)
  63708458400, #      utc_end 2019-11-03 10:00:00 (Sun)
  63687870000, #  local_start 2019-03-10 03:00:00 (Sun)
  63708429600, #    local_end 2019-11-03 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63708458400, #    utc_start 2019-11-03 10:00:00 (Sun)
  63719348400, #      utc_end 2020-03-08 11:00:00 (Sun)
  63708426000, #  local_start 2019-11-03 01:00:00 (Sun)
  63719316000, #    local_end 2020-03-08 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63719348400, #    utc_start 2020-03-08 11:00:00 (Sun)
  63739908000, #      utc_end 2020-11-01 10:00:00 (Sun)
  63719319600, #  local_start 2020-03-08 03:00:00 (Sun)
  63739879200, #    local_end 2020-11-01 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63739908000, #    utc_start 2020-11-01 10:00:00 (Sun)
  63751402800, #      utc_end 2021-03-14 11:00:00 (Sun)
  63739875600, #  local_start 2020-11-01 01:00:00 (Sun)
  63751370400, #    local_end 2021-03-14 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63751402800, #    utc_start 2021-03-14 11:00:00 (Sun)
  63771962400, #      utc_end 2021-11-07 10:00:00 (Sun)
  63751374000, #  local_start 2021-03-14 03:00:00 (Sun)
  63771933600, #    local_end 2021-11-07 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63771962400, #    utc_start 2021-11-07 10:00:00 (Sun)
  63782852400, #      utc_end 2022-03-13 11:00:00 (Sun)
  63771930000, #  local_start 2021-11-07 01:00:00 (Sun)
  63782820000, #    local_end 2022-03-13 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63782852400, #    utc_start 2022-03-13 11:00:00 (Sun)
  63803412000, #      utc_end 2022-11-06 10:00:00 (Sun)
  63782823600, #  local_start 2022-03-13 03:00:00 (Sun)
  63803383200, #    local_end 2022-11-06 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63803412000, #    utc_start 2022-11-06 10:00:00 (Sun)
  63814302000, #      utc_end 2023-03-12 11:00:00 (Sun)
  63803379600, #  local_start 2022-11-06 01:00:00 (Sun)
  63814269600, #    local_end 2023-03-12 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63814302000, #    utc_start 2023-03-12 11:00:00 (Sun)
  63834861600, #      utc_end 2023-11-05 10:00:00 (Sun)
  63814273200, #  local_start 2023-03-12 03:00:00 (Sun)
  63834832800, #    local_end 2023-11-05 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63834861600, #    utc_start 2023-11-05 10:00:00 (Sun)
  63845751600, #      utc_end 2024-03-10 11:00:00 (Sun)
  63834829200, #  local_start 2023-11-05 01:00:00 (Sun)
  63845719200, #    local_end 2024-03-10 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63845751600, #    utc_start 2024-03-10 11:00:00 (Sun)
  63866311200, #      utc_end 2024-11-03 10:00:00 (Sun)
  63845722800, #  local_start 2024-03-10 03:00:00 (Sun)
  63866282400, #    local_end 2024-11-03 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63866311200, #    utc_start 2024-11-03 10:00:00 (Sun)
  63877201200, #      utc_end 2025-03-09 11:00:00 (Sun)
  63866278800, #  local_start 2024-11-03 01:00:00 (Sun)
  63877168800, #    local_end 2025-03-09 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63877201200, #    utc_start 2025-03-09 11:00:00 (Sun)
  63897760800, #      utc_end 2025-11-02 10:00:00 (Sun)
  63877172400, #  local_start 2025-03-09 03:00:00 (Sun)
  63897732000, #    local_end 2025-11-02 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63897760800, #    utc_start 2025-11-02 10:00:00 (Sun)
  63908650800, #      utc_end 2026-03-08 11:00:00 (Sun)
  63897728400, #  local_start 2025-11-02 01:00:00 (Sun)
  63908618400, #    local_end 2026-03-08 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63908650800, #    utc_start 2026-03-08 11:00:00 (Sun)
  63929210400, #      utc_end 2026-11-01 10:00:00 (Sun)
  63908622000, #  local_start 2026-03-08 03:00:00 (Sun)
  63929181600, #    local_end 2026-11-01 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63929210400, #    utc_start 2026-11-01 10:00:00 (Sun)
  63940705200, #      utc_end 2027-03-14 11:00:00 (Sun)
  63929178000, #  local_start 2026-11-01 01:00:00 (Sun)
  63940672800, #    local_end 2027-03-14 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63940705200, #    utc_start 2027-03-14 11:00:00 (Sun)
  63961264800, #      utc_end 2027-11-07 10:00:00 (Sun)
  63940676400, #  local_start 2027-03-14 03:00:00 (Sun)
  63961236000, #    local_end 2027-11-07 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63961264800, #    utc_start 2027-11-07 10:00:00 (Sun)
  63972154800, #      utc_end 2028-03-12 11:00:00 (Sun)
  63961232400, #  local_start 2027-11-07 01:00:00 (Sun)
  63972122400, #    local_end 2028-03-12 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63972154800, #    utc_start 2028-03-12 11:00:00 (Sun)
  63992714400, #      utc_end 2028-11-05 10:00:00 (Sun)
  63972126000, #  local_start 2028-03-12 03:00:00 (Sun)
  63992685600, #    local_end 2028-11-05 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63992714400, #    utc_start 2028-11-05 10:00:00 (Sun)
  64003604400, #      utc_end 2029-03-11 11:00:00 (Sun)
  63992682000, #  local_start 2028-11-05 01:00:00 (Sun)
  64003572000, #    local_end 2029-03-11 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  64003604400, #    utc_start 2029-03-11 11:00:00 (Sun)
  64024164000, #      utc_end 2029-11-04 10:00:00 (Sun)
  64003575600, #  local_start 2029-03-11 03:00:00 (Sun)
  64024135200, #    local_end 2029-11-04 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  64024164000, #    utc_start 2029-11-04 10:00:00 (Sun)
  64035054000, #      utc_end 2030-03-10 11:00:00 (Sun)
  64024131600, #  local_start 2029-11-04 01:00:00 (Sun)
  64035021600, #    local_end 2030-03-10 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  64035054000, #    utc_start 2030-03-10 11:00:00 (Sun)
  64055613600, #      utc_end 2030-11-03 10:00:00 (Sun)
  64035025200, #  local_start 2030-03-10 03:00:00 (Sun)
  64055584800, #    local_end 2030-11-03 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {64}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -32400 }
  
  my $last_observance = bless( {
    'format' => 'AK%sT',
    'gmtoff' => '-9:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 724244,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 724244,
      'utc_rd_secs' => 0,
      'utc_year' => 1984
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -32400,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 724244,
      'local_rd_secs' => 32400,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 724244,
      'utc_rd_secs' => 32400,
      'utc_year' => 1984
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Nov',
      'letter' => 'S',
      'name' => 'US',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Mar',
      'letter' => 'D',
      'name' => 'US',
      'offset_from_std' => 3600,
      'on' => 'Sun>=8',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_SITKA

    $main::fatpacked{"DateTime/TimeZone/America/St_Johns.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_ST_JOHNS';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::St_Johns;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::St_Johns::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59421785452, #      utc_end 1884-01-01 03:30:52 (Tue)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59421772800, #    local_end 1884-01-01 00:00:00 (Tue)
  -12652,
  0,
  'LMT',
      ],
      [
  59421785452, #    utc_start 1884-01-01 03:30:52 (Tue)
  60471552652, #      utc_end 1917-04-08 05:30:52 (Sun)
  59421772800, #  local_start 1884-01-01 00:00:00 (Tue)
  60471540000, #    local_end 1917-04-08 02:00:00 (Sun)
  -12652,
  0,
  'NST',
      ],
      [
  60471552652, #    utc_start 1917-04-08 05:30:52 (Sun)
  60485545852, #      utc_end 1917-09-17 04:30:52 (Mon)
  60471543600, #  local_start 1917-04-08 03:00:00 (Sun)
  60485536800, #    local_end 1917-09-17 02:00:00 (Mon)
  -9052,
  1,
  'NDT',
      ],
      [
  60485545852, #    utc_start 1917-09-17 04:30:52 (Mon)
  60494700652, #      utc_end 1918-01-01 03:30:52 (Tue)
  60485533200, #  local_start 1917-09-17 01:00:00 (Mon)
  60494688000, #    local_end 1918-01-01 00:00:00 (Tue)
  -12652,
  0,
  'NST',
      ],
      [
  60494700652, #    utc_start 1918-01-01 03:30:52 (Tue)
  60503607052, #      utc_end 1918-04-14 05:30:52 (Sun)
  60494688000, #  local_start 1918-01-01 00:00:00 (Tue)
  60503594400, #    local_end 1918-04-14 02:00:00 (Sun)
  -12652,
  0,
  'NST',
      ],
      [
  60503607052, #    utc_start 1918-04-14 05:30:52 (Sun)
  60520537852, #      utc_end 1918-10-27 04:30:52 (Sun)
  60503598000, #  local_start 1918-04-14 03:00:00 (Sun)
  60520528800, #    local_end 1918-10-27 02:00:00 (Sun)
  -9052,
  1,
  'NDT',
      ],
      [
  60520537852, #    utc_start 1918-10-27 04:30:52 (Sun)
  60526236652, #      utc_end 1919-01-01 03:30:52 (Wed)
  60520525200, #  local_start 1918-10-27 01:00:00 (Sun)
  60526224000, #    local_end 1919-01-01 00:00:00 (Wed)
  -12652,
  0,
  'NST',
      ],
      [
  60526236652, #    utc_start 1919-01-01 03:30:52 (Wed)
  60537033052, #      utc_end 1919-05-06 02:30:52 (Tue)
  60526224000, #  local_start 1919-01-01 00:00:00 (Wed)
  60537020400, #    local_end 1919-05-05 23:00:00 (Mon)
  -12652,
  0,
  'NST',
      ],
      [
  60537033052, #    utc_start 1919-05-06 02:30:52 (Tue)
  60545583052, #      utc_end 1919-08-13 01:30:52 (Wed)
  60537024000, #  local_start 1919-05-06 00:00:00 (Tue)
  60545574000, #    local_end 1919-08-12 23:00:00 (Tue)
  -9052,
  1,
  'NDT',
      ],
      [
  60545583052, #    utc_start 1919-08-13 01:30:52 (Wed)
  60568396252, #      utc_end 1920-05-03 02:30:52 (Mon)
  60545570400, #  local_start 1919-08-12 22:00:00 (Tue)
  60568383600, #    local_end 1920-05-02 23:00:00 (Sun)
  -12652,
  0,
  'NST',
      ],
      [
  60568396252, #    utc_start 1920-05-03 02:30:52 (Mon)
  60584117452, #      utc_end 1920-11-01 01:30:52 (Mon)
  60568387200, #  local_start 1920-05-03 00:00:00 (Mon)
  60584108400, #    local_end 1920-10-31 23:00:00 (Sun)
  -9052,
  1,
  'NDT',
      ],
      [
  60584117452, #    utc_start 1920-11-01 01:30:52 (Mon)
  60599845852, #      utc_end 1921-05-02 02:30:52 (Mon)
  60584104800, #  local_start 1920-10-31 22:00:00 (Sun)
  60599833200, #    local_end 1921-05-01 23:00:00 (Sun)
  -12652,
  0,
  'NST',
      ],
      [
  60599845852, #    utc_start 1921-05-02 02:30:52 (Mon)
  60615567052, #      utc_end 1921-10-31 01:30:52 (Mon)
  60599836800, #  local_start 1921-05-02 00:00:00 (Mon)
  60615558000, #    local_end 1921-10-30 23:00:00 (Sun)
  -9052,
  1,
  'NDT',
      ],
      [
  60615567052, #    utc_start 1921-10-31 01:30:52 (Mon)
  60631900252, #      utc_end 1922-05-08 02:30:52 (Mon)
  60615554400, #  local_start 1921-10-30 22:00:00 (Sun)
  60631887600, #    local_end 1922-05-07 23:00:00 (Sun)
  -12652,
  0,
  'NST',
      ],
      [
  60631900252, #    utc_start 1922-05-08 02:30:52 (Mon)
  60647016652, #      utc_end 1922-10-30 01:30:52 (Mon)
  60631891200, #  local_start 1922-05-08 00:00:00 (Mon)
  60647007600, #    local_end 1922-10-29 23:00:00 (Sun)
  -9052,
  1,
  'NDT',
      ],
      [
  60647016652, #    utc_start 1922-10-30 01:30:52 (Mon)
  60663349852, #      utc_end 1923-05-07 02:30:52 (Mon)
  60647004000, #  local_start 1922-10-29 22:00:00 (Sun)
  60663337200, #    local_end 1923-05-06 23:00:00 (Sun)
  -12652,
  0,
  'NST',
      ],
      [
  60663349852, #    utc_start 1923-05-07 02:30:52 (Mon)
  60678466252, #      utc_end 1923-10-29 01:30:52 (Mon)
  60663340800, #  local_start 1923-05-07 00:00:00 (Mon)
  60678457200, #    local_end 1923-10-28 23:00:00 (Sun)
  -9052,
  1,
  'NDT',
      ],
      [
  60678466252, #    utc_start 1923-10-29 01:30:52 (Mon)
  60694799452, #      utc_end 1924-05-05 02:30:52 (Mon)
  60678453600, #  local_start 1923-10-28 22:00:00 (Sun)
  60694786800, #    local_end 1924-05-04 23:00:00 (Sun)
  -12652,
  0,
  'NST',
      ],
      [
  60694799452, #    utc_start 1924-05-05 02:30:52 (Mon)
  60709915852, #      utc_end 1924-10-27 01:30:52 (Mon)
  60694790400, #  local_start 1924-05-05 00:00:00 (Mon)
  60709906800, #    local_end 1924-10-26 23:00:00 (Sun)
  -9052,
  1,
  'NDT',
      ],
      [
  60709915852, #    utc_start 1924-10-27 01:30:52 (Mon)
  60726249052, #      utc_end 1925-05-04 02:30:52 (Mon)
  60709903200, #  local_start 1924-10-26 22:00:00 (Sun)
  60726236400, #    local_end 1925-05-03 23:00:00 (Sun)
  -12652,
  0,
  'NST',
      ],
      [
  60726249052, #    utc_start 1925-05-04 02:30:52 (Mon)
  60741365452, #      utc_end 1925-10-26 01:30:52 (Mon)
  60726240000, #  local_start 1925-05-04 00:00:00 (Mon)
  60741356400, #    local_end 1925-10-25 23:00:00 (Sun)
  -9052,
  1,
  'NDT',
      ],
      [
  60741365452, #    utc_start 1925-10-26 01:30:52 (Mon)
  60757698652, #      utc_end 1926-05-03 02:30:52 (Mon)
  60741352800, #  local_start 1925-10-25 22:00:00 (Sun)
  60757686000, #    local_end 1926-05-02 23:00:00 (Sun)
  -12652,
  0,
  'NST',
      ],
      [
  60757698652, #    utc_start 1926-05-03 02:30:52 (Mon)
  60773419852, #      utc_end 1926-11-01 01:30:52 (Mon)
  60757689600, #  local_start 1926-05-03 00:00:00 (Mon)
  60773410800, #    local_end 1926-10-31 23:00:00 (Sun)
  -9052,
  1,
  'NDT',
      ],
      [
  60773419852, #    utc_start 1926-11-01 01:30:52 (Mon)
  60789148252, #      utc_end 1927-05-02 02:30:52 (Mon)
  60773407200, #  local_start 1926-10-31 22:00:00 (Sun)
  60789135600, #    local_end 1927-05-01 23:00:00 (Sun)
  -12652,
  0,
  'NST',
      ],
      [
  60789148252, #    utc_start 1927-05-02 02:30:52 (Mon)
  60804869452, #      utc_end 1927-10-31 01:30:52 (Mon)
  60789139200, #  local_start 1927-05-02 00:00:00 (Mon)
  60804860400, #    local_end 1927-10-30 23:00:00 (Sun)
  -9052,
  1,
  'NDT',
      ],
      [
  60804869452, #    utc_start 1927-10-31 01:30:52 (Mon)
  60821202652, #      utc_end 1928-05-07 02:30:52 (Mon)
  60804856800, #  local_start 1927-10-30 22:00:00 (Sun)
  60821190000, #    local_end 1928-05-06 23:00:00 (Sun)
  -12652,
  0,
  'NST',
      ],
      [
  60821202652, #    utc_start 1928-05-07 02:30:52 (Mon)
  60836319052, #      utc_end 1928-10-29 01:30:52 (Mon)
  60821193600, #  local_start 1928-05-07 00:00:00 (Mon)
  60836310000, #    local_end 1928-10-28 23:00:00 (Sun)
  -9052,
  1,
  'NDT',
      ],
      [
  60836319052, #    utc_start 1928-10-29 01:30:52 (Mon)
  60852652252, #      utc_end 1929-05-06 02:30:52 (Mon)
  60836306400, #  local_start 1928-10-28 22:00:00 (Sun)
  60852639600, #    local_end 1929-05-05 23:00:00 (Sun)
  -12652,
  0,
  'NST',
      ],
      [
  60852652252, #    utc_start 1929-05-06 02:30:52 (Mon)
  60867768652, #      utc_end 1929-10-28 01:30:52 (Mon)
  60852643200, #  local_start 1929-05-06 00:00:00 (Mon)
  60867759600, #    local_end 1929-10-27 23:00:00 (Sun)
  -9052,
  1,
  'NDT',
      ],
      [
  60867768652, #    utc_start 1929-10-28 01:30:52 (Mon)
  60884101852, #      utc_end 1930-05-05 02:30:52 (Mon)
  60867756000, #  local_start 1929-10-27 22:00:00 (Sun)
  60884089200, #    local_end 1930-05-04 23:00:00 (Sun)
  -12652,
  0,
  'NST',
      ],
      [
  60884101852, #    utc_start 1930-05-05 02:30:52 (Mon)
  60899218252, #      utc_end 1930-10-27 01:30:52 (Mon)
  60884092800, #  local_start 1930-05-05 00:00:00 (Mon)
  60899209200, #    local_end 1930-10-26 23:00:00 (Sun)
  -9052,
  1,
  'NDT',
      ],
      [
  60899218252, #    utc_start 1930-10-27 01:30:52 (Mon)
  60915551452, #      utc_end 1931-05-04 02:30:52 (Mon)
  60899205600, #  local_start 1930-10-26 22:00:00 (Sun)
  60915538800, #    local_end 1931-05-03 23:00:00 (Sun)
  -12652,
  0,
  'NST',
      ],
      [
  60915551452, #    utc_start 1931-05-04 02:30:52 (Mon)
  60930667852, #      utc_end 1931-10-26 01:30:52 (Mon)
  60915542400, #  local_start 1931-05-04 00:00:00 (Mon)
  60930658800, #    local_end 1931-10-25 23:00:00 (Sun)
  -9052,
  1,
  'NDT',
      ],
      [
  60930667852, #    utc_start 1931-10-26 01:30:52 (Mon)
  60947001052, #      utc_end 1932-05-02 02:30:52 (Mon)
  60930655200, #  local_start 1931-10-25 22:00:00 (Sun)
  60946988400, #    local_end 1932-05-01 23:00:00 (Sun)
  -12652,
  0,
  'NST',
      ],
      [
  60947001052, #    utc_start 1932-05-02 02:30:52 (Mon)
  60962722252, #      utc_end 1932-10-31 01:30:52 (Mon)
  60946992000, #  local_start 1932-05-02 00:00:00 (Mon)
  60962713200, #    local_end 1932-10-30 23:00:00 (Sun)
  -9052,
  1,
  'NDT',
      ],
      [
  60962722252, #    utc_start 1932-10-31 01:30:52 (Mon)
  60979055452, #      utc_end 1933-05-08 02:30:52 (Mon)
  60962709600, #  local_start 1932-10-30 22:00:00 (Sun)
  60979042800, #    local_end 1933-05-07 23:00:00 (Sun)
  -12652,
  0,
  'NST',
      ],
      [
  60979055452, #    utc_start 1933-05-08 02:30:52 (Mon)
  60994171852, #      utc_end 1933-10-30 01:30:52 (Mon)
  60979046400, #  local_start 1933-05-08 00:00:00 (Mon)
  60994162800, #    local_end 1933-10-29 23:00:00 (Sun)
  -9052,
  1,
  'NDT',
      ],
      [
  60994171852, #    utc_start 1933-10-30 01:30:52 (Mon)
  61010505052, #      utc_end 1934-05-07 02:30:52 (Mon)
  60994159200, #  local_start 1933-10-29 22:00:00 (Sun)
  61010492400, #    local_end 1934-05-06 23:00:00 (Sun)
  -12652,
  0,
  'NST',
      ],
      [
  61010505052, #    utc_start 1934-05-07 02:30:52 (Mon)
  61025621452, #      utc_end 1934-10-29 01:30:52 (Mon)
  61010496000, #  local_start 1934-05-07 00:00:00 (Mon)
  61025612400, #    local_end 1934-10-28 23:00:00 (Sun)
  -9052,
  1,
  'NDT',
      ],
      [
  61025621452, #    utc_start 1934-10-29 01:30:52 (Mon)
  61038761452, #      utc_end 1935-03-30 03:30:52 (Sat)
  61025608800, #  local_start 1934-10-28 22:00:00 (Sun)
  61038748800, #    local_end 1935-03-30 00:00:00 (Sat)
  -12652,
  0,
  'NST',
      ],
      [
  61038761452, #    utc_start 1935-03-30 03:30:52 (Sat)
  61041954600, #      utc_end 1935-05-06 02:30:00 (Mon)
  61038748852, #  local_start 1935-03-30 00:00:52 (Sat)
  61041942000, #    local_end 1935-05-05 23:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  61041954600, #    utc_start 1935-05-06 02:30:00 (Mon)
  61057071000, #      utc_end 1935-10-28 01:30:00 (Mon)
  61041945600, #  local_start 1935-05-06 00:00:00 (Mon)
  61057062000, #    local_end 1935-10-27 23:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  61057071000, #    utc_start 1935-10-28 01:30:00 (Mon)
  61074012600, #      utc_end 1936-05-11 03:30:00 (Mon)
  61057058400, #  local_start 1935-10-27 22:00:00 (Sun)
  61074000000, #    local_end 1936-05-11 00:00:00 (Mon)
  -12600,
  0,
  'NST',
      ],
      [
  61074012600, #    utc_start 1936-05-11 03:30:00 (Mon)
  61086709800, #      utc_end 1936-10-05 02:30:00 (Mon)
  61074003600, #  local_start 1936-05-11 01:00:00 (Mon)
  61086700800, #    local_end 1936-10-05 00:00:00 (Mon)
  -9000,
  1,
  'NDT',
      ],
      [
  61086709800, #    utc_start 1936-10-05 02:30:00 (Mon)
  61105462200, #      utc_end 1937-05-10 03:30:00 (Mon)
  61086697200, #  local_start 1936-10-04 23:00:00 (Sun)
  61105449600, #    local_end 1937-05-10 00:00:00 (Mon)
  -12600,
  0,
  'NST',
      ],
      [
  61105462200, #    utc_start 1937-05-10 03:30:00 (Mon)
  61118159400, #      utc_end 1937-10-04 02:30:00 (Mon)
  61105453200, #  local_start 1937-05-10 01:00:00 (Mon)
  61118150400, #    local_end 1937-10-04 00:00:00 (Mon)
  -9000,
  1,
  'NDT',
      ],
      [
  61118159400, #    utc_start 1937-10-04 02:30:00 (Mon)
  61136911800, #      utc_end 1938-05-09 03:30:00 (Mon)
  61118146800, #  local_start 1937-10-03 23:00:00 (Sun)
  61136899200, #    local_end 1938-05-09 00:00:00 (Mon)
  -12600,
  0,
  'NST',
      ],
      [
  61136911800, #    utc_start 1938-05-09 03:30:00 (Mon)
  61149609000, #      utc_end 1938-10-03 02:30:00 (Mon)
  61136902800, #  local_start 1938-05-09 01:00:00 (Mon)
  61149600000, #    local_end 1938-10-03 00:00:00 (Mon)
  -9000,
  1,
  'NDT',
      ],
      [
  61149609000, #    utc_start 1938-10-03 02:30:00 (Mon)
  61168966200, #      utc_end 1939-05-15 03:30:00 (Mon)
  61149596400, #  local_start 1938-10-02 23:00:00 (Sun)
  61168953600, #    local_end 1939-05-15 00:00:00 (Mon)
  -12600,
  0,
  'NST',
      ],
      [
  61168966200, #    utc_start 1939-05-15 03:30:00 (Mon)
  61181058600, #      utc_end 1939-10-02 02:30:00 (Mon)
  61168957200, #  local_start 1939-05-15 01:00:00 (Mon)
  61181049600, #    local_end 1939-10-02 00:00:00 (Mon)
  -9000,
  1,
  'NDT',
      ],
      [
  61181058600, #    utc_start 1939-10-02 02:30:00 (Mon)
  61200415800, #      utc_end 1940-05-13 03:30:00 (Mon)
  61181046000, #  local_start 1939-10-01 23:00:00 (Sun)
  61200403200, #    local_end 1940-05-13 00:00:00 (Mon)
  -12600,
  0,
  'NST',
      ],
      [
  61200415800, #    utc_start 1940-05-13 03:30:00 (Mon)
  61213113000, #      utc_end 1940-10-07 02:30:00 (Mon)
  61200406800, #  local_start 1940-05-13 01:00:00 (Mon)
  61213104000, #    local_end 1940-10-07 00:00:00 (Mon)
  -9000,
  1,
  'NDT',
      ],
      [
  61213113000, #    utc_start 1940-10-07 02:30:00 (Mon)
  61231865400, #      utc_end 1941-05-12 03:30:00 (Mon)
  61213100400, #  local_start 1940-10-06 23:00:00 (Sun)
  61231852800, #    local_end 1941-05-12 00:00:00 (Mon)
  -12600,
  0,
  'NST',
      ],
      [
  61231865400, #    utc_start 1941-05-12 03:30:00 (Mon)
  61244562600, #      utc_end 1941-10-06 02:30:00 (Mon)
  61231856400, #  local_start 1941-05-12 01:00:00 (Mon)
  61244553600, #    local_end 1941-10-06 00:00:00 (Mon)
  -9000,
  1,
  'NDT',
      ],
      [
  61244562600, #    utc_start 1941-10-06 02:30:00 (Mon)
  61263315000, #      utc_end 1942-05-11 03:30:00 (Mon)
  61244550000, #  local_start 1941-10-05 23:00:00 (Sun)
  61263302400, #    local_end 1942-05-11 00:00:00 (Mon)
  -12600,
  0,
  'NST',
      ],
      [
  61263315000, #    utc_start 1942-05-11 03:30:00 (Mon)
  61366287600, #      utc_end 1945-08-14 23:00:00 (Tue)
  61263306000, #  local_start 1942-05-11 01:00:00 (Mon)
  61366278600, #    local_end 1945-08-14 20:30:00 (Tue)
  -9000,
  1,
  'NWT',
      ],
      [
  61366287600, #    utc_start 1945-08-14 23:00:00 (Tue)
  61370281800, #      utc_end 1945-09-30 04:30:00 (Sun)
  61366278600, #  local_start 1945-08-14 20:30:00 (Tue)
  61370272800, #    local_end 1945-09-30 02:00:00 (Sun)
  -9000,
  1,
  'NPT',
      ],
      [
  61370281800, #    utc_start 1945-09-30 04:30:00 (Sun)
  61378313400, #      utc_end 1946-01-01 03:30:00 (Tue)
  61370269200, #  local_start 1945-09-30 01:00:00 (Sun)
  61378300800, #    local_end 1946-01-01 00:00:00 (Tue)
  -12600,
  0,
  'NST',
      ],
      [
  61378313400, #    utc_start 1946-01-01 03:30:00 (Tue)
  61389639000, #      utc_end 1946-05-12 05:30:00 (Sun)
  61378300800, #  local_start 1946-01-01 00:00:00 (Tue)
  61389626400, #    local_end 1946-05-12 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  61389639000, #    utc_start 1946-05-12 05:30:00 (Sun)
  61402336200, #      utc_end 1946-10-06 04:30:00 (Sun)
  61389630000, #  local_start 1946-05-12 03:00:00 (Sun)
  61402327200, #    local_end 1946-10-06 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  61402336200, #    utc_start 1946-10-06 04:30:00 (Sun)
  61421088600, #      utc_end 1947-05-11 05:30:00 (Sun)
  61402323600, #  local_start 1946-10-06 01:00:00 (Sun)
  61421076000, #    local_end 1947-05-11 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  61421088600, #    utc_start 1947-05-11 05:30:00 (Sun)
  61433785800, #      utc_end 1947-10-05 04:30:00 (Sun)
  61421079600, #  local_start 1947-05-11 03:00:00 (Sun)
  61433776800, #    local_end 1947-10-05 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  61433785800, #    utc_start 1947-10-05 04:30:00 (Sun)
  61452538200, #      utc_end 1948-05-09 05:30:00 (Sun)
  61433773200, #  local_start 1947-10-05 01:00:00 (Sun)
  61452525600, #    local_end 1948-05-09 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  61452538200, #    utc_start 1948-05-09 05:30:00 (Sun)
  61465235400, #      utc_end 1948-10-03 04:30:00 (Sun)
  61452529200, #  local_start 1948-05-09 03:00:00 (Sun)
  61465226400, #    local_end 1948-10-03 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  61465235400, #    utc_start 1948-10-03 04:30:00 (Sun)
  61483987800, #      utc_end 1949-05-08 05:30:00 (Sun)
  61465222800, #  local_start 1948-10-03 01:00:00 (Sun)
  61483975200, #    local_end 1949-05-08 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  61483987800, #    utc_start 1949-05-08 05:30:00 (Sun)
  61496685000, #      utc_end 1949-10-02 04:30:00 (Sun)
  61483978800, #  local_start 1949-05-08 03:00:00 (Sun)
  61496676000, #    local_end 1949-10-02 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  61496685000, #    utc_start 1949-10-02 04:30:00 (Sun)
  61516042200, #      utc_end 1950-05-14 05:30:00 (Sun)
  61496672400, #  local_start 1949-10-02 01:00:00 (Sun)
  61516029600, #    local_end 1950-05-14 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  61516042200, #    utc_start 1950-05-14 05:30:00 (Sun)
  61528739400, #      utc_end 1950-10-08 04:30:00 (Sun)
  61516033200, #  local_start 1950-05-14 03:00:00 (Sun)
  61528730400, #    local_end 1950-10-08 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  61528739400, #    utc_start 1950-10-08 04:30:00 (Sun)
  61546282200, #      utc_end 1951-04-29 05:30:00 (Sun)
  61528726800, #  local_start 1950-10-08 01:00:00 (Sun)
  61546269600, #    local_end 1951-04-29 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  61546282200, #    utc_start 1951-04-29 05:30:00 (Sun)
  61559584200, #      utc_end 1951-09-30 04:30:00 (Sun)
  61546273200, #  local_start 1951-04-29 03:00:00 (Sun)
  61559575200, #    local_end 1951-09-30 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  61559584200, #    utc_start 1951-09-30 04:30:00 (Sun)
  61577731800, #      utc_end 1952-04-27 05:30:00 (Sun)
  61559571600, #  local_start 1951-09-30 01:00:00 (Sun)
  61577719200, #    local_end 1952-04-27 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  61577731800, #    utc_start 1952-04-27 05:30:00 (Sun)
  61591033800, #      utc_end 1952-09-28 04:30:00 (Sun)
  61577722800, #  local_start 1952-04-27 03:00:00 (Sun)
  61591024800, #    local_end 1952-09-28 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  61591033800, #    utc_start 1952-09-28 04:30:00 (Sun)
  61609181400, #      utc_end 1953-04-26 05:30:00 (Sun)
  61591021200, #  local_start 1952-09-28 01:00:00 (Sun)
  61609168800, #    local_end 1953-04-26 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  61609181400, #    utc_start 1953-04-26 05:30:00 (Sun)
  61622483400, #      utc_end 1953-09-27 04:30:00 (Sun)
  61609172400, #  local_start 1953-04-26 03:00:00 (Sun)
  61622474400, #    local_end 1953-09-27 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  61622483400, #    utc_start 1953-09-27 04:30:00 (Sun)
  61640631000, #      utc_end 1954-04-25 05:30:00 (Sun)
  61622470800, #  local_start 1953-09-27 01:00:00 (Sun)
  61640618400, #    local_end 1954-04-25 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  61640631000, #    utc_start 1954-04-25 05:30:00 (Sun)
  61653933000, #      utc_end 1954-09-26 04:30:00 (Sun)
  61640622000, #  local_start 1954-04-25 03:00:00 (Sun)
  61653924000, #    local_end 1954-09-26 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  61653933000, #    utc_start 1954-09-26 04:30:00 (Sun)
  61672080600, #      utc_end 1955-04-24 05:30:00 (Sun)
  61653920400, #  local_start 1954-09-26 01:00:00 (Sun)
  61672068000, #    local_end 1955-04-24 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  61672080600, #    utc_start 1955-04-24 05:30:00 (Sun)
  61685382600, #      utc_end 1955-09-25 04:30:00 (Sun)
  61672071600, #  local_start 1955-04-24 03:00:00 (Sun)
  61685373600, #    local_end 1955-09-25 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  61685382600, #    utc_start 1955-09-25 04:30:00 (Sun)
  61704135000, #      utc_end 1956-04-29 05:30:00 (Sun)
  61685370000, #  local_start 1955-09-25 01:00:00 (Sun)
  61704122400, #    local_end 1956-04-29 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  61704135000, #    utc_start 1956-04-29 05:30:00 (Sun)
  61717437000, #      utc_end 1956-09-30 04:30:00 (Sun)
  61704126000, #  local_start 1956-04-29 03:00:00 (Sun)
  61717428000, #    local_end 1956-09-30 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  61717437000, #    utc_start 1956-09-30 04:30:00 (Sun)
  61735584600, #      utc_end 1957-04-28 05:30:00 (Sun)
  61717424400, #  local_start 1956-09-30 01:00:00 (Sun)
  61735572000, #    local_end 1957-04-28 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  61735584600, #    utc_start 1957-04-28 05:30:00 (Sun)
  61748886600, #      utc_end 1957-09-29 04:30:00 (Sun)
  61735575600, #  local_start 1957-04-28 03:00:00 (Sun)
  61748877600, #    local_end 1957-09-29 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  61748886600, #    utc_start 1957-09-29 04:30:00 (Sun)
  61767034200, #      utc_end 1958-04-27 05:30:00 (Sun)
  61748874000, #  local_start 1957-09-29 01:00:00 (Sun)
  61767021600, #    local_end 1958-04-27 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  61767034200, #    utc_start 1958-04-27 05:30:00 (Sun)
  61780336200, #      utc_end 1958-09-28 04:30:00 (Sun)
  61767025200, #  local_start 1958-04-27 03:00:00 (Sun)
  61780327200, #    local_end 1958-09-28 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  61780336200, #    utc_start 1958-09-28 04:30:00 (Sun)
  61798483800, #      utc_end 1959-04-26 05:30:00 (Sun)
  61780323600, #  local_start 1958-09-28 01:00:00 (Sun)
  61798471200, #    local_end 1959-04-26 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  61798483800, #    utc_start 1959-04-26 05:30:00 (Sun)
  61811785800, #      utc_end 1959-09-27 04:30:00 (Sun)
  61798474800, #  local_start 1959-04-26 03:00:00 (Sun)
  61811776800, #    local_end 1959-09-27 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  61811785800, #    utc_start 1959-09-27 04:30:00 (Sun)
  61829933400, #      utc_end 1960-04-24 05:30:00 (Sun)
  61811773200, #  local_start 1959-09-27 01:00:00 (Sun)
  61829920800, #    local_end 1960-04-24 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  61829933400, #    utc_start 1960-04-24 05:30:00 (Sun)
  61846259400, #      utc_end 1960-10-30 04:30:00 (Sun)
  61829924400, #  local_start 1960-04-24 03:00:00 (Sun)
  61846250400, #    local_end 1960-10-30 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  61846259400, #    utc_start 1960-10-30 04:30:00 (Sun)
  61861987800, #      utc_end 1961-04-30 05:30:00 (Sun)
  61846246800, #  local_start 1960-10-30 01:00:00 (Sun)
  61861975200, #    local_end 1961-04-30 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  61861987800, #    utc_start 1961-04-30 05:30:00 (Sun)
  61877709000, #      utc_end 1961-10-29 04:30:00 (Sun)
  61861978800, #  local_start 1961-04-30 03:00:00 (Sun)
  61877700000, #    local_end 1961-10-29 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  61877709000, #    utc_start 1961-10-29 04:30:00 (Sun)
  61893437400, #      utc_end 1962-04-29 05:30:00 (Sun)
  61877696400, #  local_start 1961-10-29 01:00:00 (Sun)
  61893424800, #    local_end 1962-04-29 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  61893437400, #    utc_start 1962-04-29 05:30:00 (Sun)
  61909158600, #      utc_end 1962-10-28 04:30:00 (Sun)
  61893428400, #  local_start 1962-04-29 03:00:00 (Sun)
  61909149600, #    local_end 1962-10-28 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  61909158600, #    utc_start 1962-10-28 04:30:00 (Sun)
  61924887000, #      utc_end 1963-04-28 05:30:00 (Sun)
  61909146000, #  local_start 1962-10-28 01:00:00 (Sun)
  61924874400, #    local_end 1963-04-28 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  61924887000, #    utc_start 1963-04-28 05:30:00 (Sun)
  61940608200, #      utc_end 1963-10-27 04:30:00 (Sun)
  61924878000, #  local_start 1963-04-28 03:00:00 (Sun)
  61940599200, #    local_end 1963-10-27 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  61940608200, #    utc_start 1963-10-27 04:30:00 (Sun)
  61956336600, #      utc_end 1964-04-26 05:30:00 (Sun)
  61940595600, #  local_start 1963-10-27 01:00:00 (Sun)
  61956324000, #    local_end 1964-04-26 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  61956336600, #    utc_start 1964-04-26 05:30:00 (Sun)
  61972057800, #      utc_end 1964-10-25 04:30:00 (Sun)
  61956327600, #  local_start 1964-04-26 03:00:00 (Sun)
  61972048800, #    local_end 1964-10-25 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  61972057800, #    utc_start 1964-10-25 04:30:00 (Sun)
  61987786200, #      utc_end 1965-04-25 05:30:00 (Sun)
  61972045200, #  local_start 1964-10-25 01:00:00 (Sun)
  61987773600, #    local_end 1965-04-25 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  61987786200, #    utc_start 1965-04-25 05:30:00 (Sun)
  62004112200, #      utc_end 1965-10-31 04:30:00 (Sun)
  61987777200, #  local_start 1965-04-25 03:00:00 (Sun)
  62004103200, #    local_end 1965-10-31 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  62004112200, #    utc_start 1965-10-31 04:30:00 (Sun)
  62019235800, #      utc_end 1966-04-24 05:30:00 (Sun)
  62004099600, #  local_start 1965-10-31 01:00:00 (Sun)
  62019223200, #    local_end 1966-04-24 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  62019235800, #    utc_start 1966-04-24 05:30:00 (Sun)
  62035561800, #      utc_end 1966-10-30 04:30:00 (Sun)
  62019226800, #  local_start 1966-04-24 03:00:00 (Sun)
  62035552800, #    local_end 1966-10-30 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  62035561800, #    utc_start 1966-10-30 04:30:00 (Sun)
  62051290200, #      utc_end 1967-04-30 05:30:00 (Sun)
  62035549200, #  local_start 1966-10-30 01:00:00 (Sun)
  62051277600, #    local_end 1967-04-30 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  62051290200, #    utc_start 1967-04-30 05:30:00 (Sun)
  62067011400, #      utc_end 1967-10-29 04:30:00 (Sun)
  62051281200, #  local_start 1967-04-30 03:00:00 (Sun)
  62067002400, #    local_end 1967-10-29 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  62067011400, #    utc_start 1967-10-29 04:30:00 (Sun)
  62082739800, #      utc_end 1968-04-28 05:30:00 (Sun)
  62066998800, #  local_start 1967-10-29 01:00:00 (Sun)
  62082727200, #    local_end 1968-04-28 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  62082739800, #    utc_start 1968-04-28 05:30:00 (Sun)
  62098461000, #      utc_end 1968-10-27 04:30:00 (Sun)
  62082730800, #  local_start 1968-04-28 03:00:00 (Sun)
  62098452000, #    local_end 1968-10-27 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  62098461000, #    utc_start 1968-10-27 04:30:00 (Sun)
  62114189400, #      utc_end 1969-04-27 05:30:00 (Sun)
  62098448400, #  local_start 1968-10-27 01:00:00 (Sun)
  62114176800, #    local_end 1969-04-27 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  62114189400, #    utc_start 1969-04-27 05:30:00 (Sun)
  62129910600, #      utc_end 1969-10-26 04:30:00 (Sun)
  62114180400, #  local_start 1969-04-27 03:00:00 (Sun)
  62129901600, #    local_end 1969-10-26 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  62129910600, #    utc_start 1969-10-26 04:30:00 (Sun)
  62145639000, #      utc_end 1970-04-26 05:30:00 (Sun)
  62129898000, #  local_start 1969-10-26 01:00:00 (Sun)
  62145626400, #    local_end 1970-04-26 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  62145639000, #    utc_start 1970-04-26 05:30:00 (Sun)
  62161360200, #      utc_end 1970-10-25 04:30:00 (Sun)
  62145630000, #  local_start 1970-04-26 03:00:00 (Sun)
  62161351200, #    local_end 1970-10-25 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  62161360200, #    utc_start 1970-10-25 04:30:00 (Sun)
  62177088600, #      utc_end 1971-04-25 05:30:00 (Sun)
  62161347600, #  local_start 1970-10-25 01:00:00 (Sun)
  62177076000, #    local_end 1971-04-25 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  62177088600, #    utc_start 1971-04-25 05:30:00 (Sun)
  62193414600, #      utc_end 1971-10-31 04:30:00 (Sun)
  62177079600, #  local_start 1971-04-25 03:00:00 (Sun)
  62193405600, #    local_end 1971-10-31 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  62193414600, #    utc_start 1971-10-31 04:30:00 (Sun)
  62209143000, #      utc_end 1972-04-30 05:30:00 (Sun)
  62193402000, #  local_start 1971-10-31 01:00:00 (Sun)
  62209130400, #    local_end 1972-04-30 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  62209143000, #    utc_start 1972-04-30 05:30:00 (Sun)
  62224864200, #      utc_end 1972-10-29 04:30:00 (Sun)
  62209134000, #  local_start 1972-04-30 03:00:00 (Sun)
  62224855200, #    local_end 1972-10-29 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  62224864200, #    utc_start 1972-10-29 04:30:00 (Sun)
  62240592600, #      utc_end 1973-04-29 05:30:00 (Sun)
  62224851600, #  local_start 1972-10-29 01:00:00 (Sun)
  62240580000, #    local_end 1973-04-29 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  62240592600, #    utc_start 1973-04-29 05:30:00 (Sun)
  62256313800, #      utc_end 1973-10-28 04:30:00 (Sun)
  62240583600, #  local_start 1973-04-29 03:00:00 (Sun)
  62256304800, #    local_end 1973-10-28 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  62256313800, #    utc_start 1973-10-28 04:30:00 (Sun)
  62272042200, #      utc_end 1974-04-28 05:30:00 (Sun)
  62256301200, #  local_start 1973-10-28 01:00:00 (Sun)
  62272029600, #    local_end 1974-04-28 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  62272042200, #    utc_start 1974-04-28 05:30:00 (Sun)
  62287763400, #      utc_end 1974-10-27 04:30:00 (Sun)
  62272033200, #  local_start 1974-04-28 03:00:00 (Sun)
  62287754400, #    local_end 1974-10-27 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  62287763400, #    utc_start 1974-10-27 04:30:00 (Sun)
  62303491800, #      utc_end 1975-04-27 05:30:00 (Sun)
  62287750800, #  local_start 1974-10-27 01:00:00 (Sun)
  62303479200, #    local_end 1975-04-27 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  62303491800, #    utc_start 1975-04-27 05:30:00 (Sun)
  62319213000, #      utc_end 1975-10-26 04:30:00 (Sun)
  62303482800, #  local_start 1975-04-27 03:00:00 (Sun)
  62319204000, #    local_end 1975-10-26 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  62319213000, #    utc_start 1975-10-26 04:30:00 (Sun)
  62334941400, #      utc_end 1976-04-25 05:30:00 (Sun)
  62319200400, #  local_start 1975-10-26 01:00:00 (Sun)
  62334928800, #    local_end 1976-04-25 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  62334941400, #    utc_start 1976-04-25 05:30:00 (Sun)
  62351267400, #      utc_end 1976-10-31 04:30:00 (Sun)
  62334932400, #  local_start 1976-04-25 03:00:00 (Sun)
  62351258400, #    local_end 1976-10-31 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  62351267400, #    utc_start 1976-10-31 04:30:00 (Sun)
  62366391000, #      utc_end 1977-04-24 05:30:00 (Sun)
  62351254800, #  local_start 1976-10-31 01:00:00 (Sun)
  62366378400, #    local_end 1977-04-24 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  62366391000, #    utc_start 1977-04-24 05:30:00 (Sun)
  62382717000, #      utc_end 1977-10-30 04:30:00 (Sun)
  62366382000, #  local_start 1977-04-24 03:00:00 (Sun)
  62382708000, #    local_end 1977-10-30 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  62382717000, #    utc_start 1977-10-30 04:30:00 (Sun)
  62398445400, #      utc_end 1978-04-30 05:30:00 (Sun)
  62382704400, #  local_start 1977-10-30 01:00:00 (Sun)
  62398432800, #    local_end 1978-04-30 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  62398445400, #    utc_start 1978-04-30 05:30:00 (Sun)
  62414166600, #      utc_end 1978-10-29 04:30:00 (Sun)
  62398436400, #  local_start 1978-04-30 03:00:00 (Sun)
  62414157600, #    local_end 1978-10-29 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  62414166600, #    utc_start 1978-10-29 04:30:00 (Sun)
  62429895000, #      utc_end 1979-04-29 05:30:00 (Sun)
  62414154000, #  local_start 1978-10-29 01:00:00 (Sun)
  62429882400, #    local_end 1979-04-29 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  62429895000, #    utc_start 1979-04-29 05:30:00 (Sun)
  62445616200, #      utc_end 1979-10-28 04:30:00 (Sun)
  62429886000, #  local_start 1979-04-29 03:00:00 (Sun)
  62445607200, #    local_end 1979-10-28 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  62445616200, #    utc_start 1979-10-28 04:30:00 (Sun)
  62461344600, #      utc_end 1980-04-27 05:30:00 (Sun)
  62445603600, #  local_start 1979-10-28 01:00:00 (Sun)
  62461332000, #    local_end 1980-04-27 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  62461344600, #    utc_start 1980-04-27 05:30:00 (Sun)
  62477065800, #      utc_end 1980-10-26 04:30:00 (Sun)
  62461335600, #  local_start 1980-04-27 03:00:00 (Sun)
  62477056800, #    local_end 1980-10-26 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  62477065800, #    utc_start 1980-10-26 04:30:00 (Sun)
  62492794200, #      utc_end 1981-04-26 05:30:00 (Sun)
  62477053200, #  local_start 1980-10-26 01:00:00 (Sun)
  62492781600, #    local_end 1981-04-26 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  62492794200, #    utc_start 1981-04-26 05:30:00 (Sun)
  62508515400, #      utc_end 1981-10-25 04:30:00 (Sun)
  62492785200, #  local_start 1981-04-26 03:00:00 (Sun)
  62508506400, #    local_end 1981-10-25 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  62508515400, #    utc_start 1981-10-25 04:30:00 (Sun)
  62524243800, #      utc_end 1982-04-25 05:30:00 (Sun)
  62508502800, #  local_start 1981-10-25 01:00:00 (Sun)
  62524231200, #    local_end 1982-04-25 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  62524243800, #    utc_start 1982-04-25 05:30:00 (Sun)
  62540569800, #      utc_end 1982-10-31 04:30:00 (Sun)
  62524234800, #  local_start 1982-04-25 03:00:00 (Sun)
  62540560800, #    local_end 1982-10-31 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  62540569800, #    utc_start 1982-10-31 04:30:00 (Sun)
  62555693400, #      utc_end 1983-04-24 05:30:00 (Sun)
  62540557200, #  local_start 1982-10-31 01:00:00 (Sun)
  62555680800, #    local_end 1983-04-24 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  62555693400, #    utc_start 1983-04-24 05:30:00 (Sun)
  62572019400, #      utc_end 1983-10-30 04:30:00 (Sun)
  62555684400, #  local_start 1983-04-24 03:00:00 (Sun)
  62572010400, #    local_end 1983-10-30 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  62572019400, #    utc_start 1983-10-30 04:30:00 (Sun)
  62587747800, #      utc_end 1984-04-29 05:30:00 (Sun)
  62572006800, #  local_start 1983-10-30 01:00:00 (Sun)
  62587735200, #    local_end 1984-04-29 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  62587747800, #    utc_start 1984-04-29 05:30:00 (Sun)
  62603469000, #      utc_end 1984-10-28 04:30:00 (Sun)
  62587738800, #  local_start 1984-04-29 03:00:00 (Sun)
  62603460000, #    local_end 1984-10-28 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  62603469000, #    utc_start 1984-10-28 04:30:00 (Sun)
  62619197400, #      utc_end 1985-04-28 05:30:00 (Sun)
  62603456400, #  local_start 1984-10-28 01:00:00 (Sun)
  62619184800, #    local_end 1985-04-28 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  62619197400, #    utc_start 1985-04-28 05:30:00 (Sun)
  62634918600, #      utc_end 1985-10-27 04:30:00 (Sun)
  62619188400, #  local_start 1985-04-28 03:00:00 (Sun)
  62634909600, #    local_end 1985-10-27 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  62634918600, #    utc_start 1985-10-27 04:30:00 (Sun)
  62650647000, #      utc_end 1986-04-27 05:30:00 (Sun)
  62634906000, #  local_start 1985-10-27 01:00:00 (Sun)
  62650634400, #    local_end 1986-04-27 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  62650647000, #    utc_start 1986-04-27 05:30:00 (Sun)
  62666368200, #      utc_end 1986-10-26 04:30:00 (Sun)
  62650638000, #  local_start 1986-04-27 03:00:00 (Sun)
  62666359200, #    local_end 1986-10-26 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  62666368200, #    utc_start 1986-10-26 04:30:00 (Sun)
  62680275060, #      utc_end 1987-04-05 03:31:00 (Sun)
  62666355600, #  local_start 1986-10-26 01:00:00 (Sun)
  62680262460, #    local_end 1987-04-05 00:01:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  62680275060, #    utc_start 1987-04-05 03:31:00 (Sun)
  62697810660, #      utc_end 1987-10-25 02:31:00 (Sun)
  62680266060, #  local_start 1987-04-05 01:01:00 (Sun)
  62697801660, #    local_end 1987-10-25 00:01:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  62697810660, #    utc_start 1987-10-25 02:31:00 (Sun)
  62711724660, #      utc_end 1988-04-03 03:31:00 (Sun)
  62697798060, #  local_start 1987-10-24 23:01:00 (Sat)
  62711712060, #    local_end 1988-04-03 00:01:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  62711724660, #    utc_start 1988-04-03 03:31:00 (Sun)
  62729861460, #      utc_end 1988-10-30 01:31:00 (Sun)
  62711719260, #  local_start 1988-04-03 02:01:00 (Sun)
  62729856060, #    local_end 1988-10-30 00:01:00 (Sun)
  -5400,
  1,
  'NDDT',
      ],
      [
  62729861460, #    utc_start 1988-10-30 01:31:00 (Sun)
  62743174260, #      utc_end 1989-04-02 03:31:00 (Sun)
  62729848860, #  local_start 1988-10-29 22:01:00 (Sat)
  62743161660, #    local_end 1989-04-02 00:01:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  62743174260, #    utc_start 1989-04-02 03:31:00 (Sun)
  62761314660, #      utc_end 1989-10-29 02:31:00 (Sun)
  62743165260, #  local_start 1989-04-02 01:01:00 (Sun)
  62761305660, #    local_end 1989-10-29 00:01:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  62761314660, #    utc_start 1989-10-29 02:31:00 (Sun)
  62774623860, #      utc_end 1990-04-01 03:31:00 (Sun)
  62761302060, #  local_start 1989-10-28 23:01:00 (Sat)
  62774611260, #    local_end 1990-04-01 00:01:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  62774623860, #    utc_start 1990-04-01 03:31:00 (Sun)
  62792764260, #      utc_end 1990-10-28 02:31:00 (Sun)
  62774614860, #  local_start 1990-04-01 01:01:00 (Sun)
  62792755260, #    local_end 1990-10-28 00:01:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  62792764260, #    utc_start 1990-10-28 02:31:00 (Sun)
  62806678260, #      utc_end 1991-04-07 03:31:00 (Sun)
  62792751660, #  local_start 1990-10-27 23:01:00 (Sat)
  62806665660, #    local_end 1991-04-07 00:01:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  62806678260, #    utc_start 1991-04-07 03:31:00 (Sun)
  62824213860, #      utc_end 1991-10-27 02:31:00 (Sun)
  62806669260, #  local_start 1991-04-07 01:01:00 (Sun)
  62824204860, #    local_end 1991-10-27 00:01:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  62824213860, #    utc_start 1991-10-27 02:31:00 (Sun)
  62838127860, #      utc_end 1992-04-05 03:31:00 (Sun)
  62824201260, #  local_start 1991-10-26 23:01:00 (Sat)
  62838115260, #    local_end 1992-04-05 00:01:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  62838127860, #    utc_start 1992-04-05 03:31:00 (Sun)
  62855663460, #      utc_end 1992-10-25 02:31:00 (Sun)
  62838118860, #  local_start 1992-04-05 01:01:00 (Sun)
  62855654460, #    local_end 1992-10-25 00:01:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  62855663460, #    utc_start 1992-10-25 02:31:00 (Sun)
  62869577460, #      utc_end 1993-04-04 03:31:00 (Sun)
  62855650860, #  local_start 1992-10-24 23:01:00 (Sat)
  62869564860, #    local_end 1993-04-04 00:01:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  62869577460, #    utc_start 1993-04-04 03:31:00 (Sun)
  62887717860, #      utc_end 1993-10-31 02:31:00 (Sun)
  62869568460, #  local_start 1993-04-04 01:01:00 (Sun)
  62887708860, #    local_end 1993-10-31 00:01:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  62887717860, #    utc_start 1993-10-31 02:31:00 (Sun)
  62901027060, #      utc_end 1994-04-03 03:31:00 (Sun)
  62887705260, #  local_start 1993-10-30 23:01:00 (Sat)
  62901014460, #    local_end 1994-04-03 00:01:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  62901027060, #    utc_start 1994-04-03 03:31:00 (Sun)
  62919167460, #      utc_end 1994-10-30 02:31:00 (Sun)
  62901018060, #  local_start 1994-04-03 01:01:00 (Sun)
  62919158460, #    local_end 1994-10-30 00:01:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  62919167460, #    utc_start 1994-10-30 02:31:00 (Sun)
  62932476660, #      utc_end 1995-04-02 03:31:00 (Sun)
  62919154860, #  local_start 1994-10-29 23:01:00 (Sat)
  62932464060, #    local_end 1995-04-02 00:01:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  62932476660, #    utc_start 1995-04-02 03:31:00 (Sun)
  62950617060, #      utc_end 1995-10-29 02:31:00 (Sun)
  62932467660, #  local_start 1995-04-02 01:01:00 (Sun)
  62950608060, #    local_end 1995-10-29 00:01:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  62950617060, #    utc_start 1995-10-29 02:31:00 (Sun)
  62964531060, #      utc_end 1996-04-07 03:31:00 (Sun)
  62950604460, #  local_start 1995-10-28 23:01:00 (Sat)
  62964518460, #    local_end 1996-04-07 00:01:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  62964531060, #    utc_start 1996-04-07 03:31:00 (Sun)
  62982066660, #      utc_end 1996-10-27 02:31:00 (Sun)
  62964522060, #  local_start 1996-04-07 01:01:00 (Sun)
  62982057660, #    local_end 1996-10-27 00:01:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  62982066660, #    utc_start 1996-10-27 02:31:00 (Sun)
  62995980660, #      utc_end 1997-04-06 03:31:00 (Sun)
  62982054060, #  local_start 1996-10-26 23:01:00 (Sat)
  62995968060, #    local_end 1997-04-06 00:01:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  62995980660, #    utc_start 1997-04-06 03:31:00 (Sun)
  63013516260, #      utc_end 1997-10-26 02:31:00 (Sun)
  62995971660, #  local_start 1997-04-06 01:01:00 (Sun)
  63013507260, #    local_end 1997-10-26 00:01:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  63013516260, #    utc_start 1997-10-26 02:31:00 (Sun)
  63027430260, #      utc_end 1998-04-05 03:31:00 (Sun)
  63013503660, #  local_start 1997-10-25 23:01:00 (Sat)
  63027417660, #    local_end 1998-04-05 00:01:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  63027430260, #    utc_start 1998-04-05 03:31:00 (Sun)
  63044965860, #      utc_end 1998-10-25 02:31:00 (Sun)
  63027421260, #  local_start 1998-04-05 01:01:00 (Sun)
  63044956860, #    local_end 1998-10-25 00:01:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  63044965860, #    utc_start 1998-10-25 02:31:00 (Sun)
  63058879860, #      utc_end 1999-04-04 03:31:00 (Sun)
  63044953260, #  local_start 1998-10-24 23:01:00 (Sat)
  63058867260, #    local_end 1999-04-04 00:01:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  63058879860, #    utc_start 1999-04-04 03:31:00 (Sun)
  63077020260, #      utc_end 1999-10-31 02:31:00 (Sun)
  63058870860, #  local_start 1999-04-04 01:01:00 (Sun)
  63077011260, #    local_end 1999-10-31 00:01:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  63077020260, #    utc_start 1999-10-31 02:31:00 (Sun)
  63090329460, #      utc_end 2000-04-02 03:31:00 (Sun)
  63077007660, #  local_start 1999-10-30 23:01:00 (Sat)
  63090316860, #    local_end 2000-04-02 00:01:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  63090329460, #    utc_start 2000-04-02 03:31:00 (Sun)
  63108469860, #      utc_end 2000-10-29 02:31:00 (Sun)
  63090320460, #  local_start 2000-04-02 01:01:00 (Sun)
  63108460860, #    local_end 2000-10-29 00:01:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  63108469860, #    utc_start 2000-10-29 02:31:00 (Sun)
  63121779060, #      utc_end 2001-04-01 03:31:00 (Sun)
  63108457260, #  local_start 2000-10-28 23:01:00 (Sat)
  63121766460, #    local_end 2001-04-01 00:01:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  63121779060, #    utc_start 2001-04-01 03:31:00 (Sun)
  63139919460, #      utc_end 2001-10-28 02:31:00 (Sun)
  63121770060, #  local_start 2001-04-01 01:01:00 (Sun)
  63139910460, #    local_end 2001-10-28 00:01:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  63139919460, #    utc_start 2001-10-28 02:31:00 (Sun)
  63153833460, #      utc_end 2002-04-07 03:31:00 (Sun)
  63139906860, #  local_start 2001-10-27 23:01:00 (Sat)
  63153820860, #    local_end 2002-04-07 00:01:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  63153833460, #    utc_start 2002-04-07 03:31:00 (Sun)
  63171369060, #      utc_end 2002-10-27 02:31:00 (Sun)
  63153824460, #  local_start 2002-04-07 01:01:00 (Sun)
  63171360060, #    local_end 2002-10-27 00:01:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  63171369060, #    utc_start 2002-10-27 02:31:00 (Sun)
  63185283060, #      utc_end 2003-04-06 03:31:00 (Sun)
  63171356460, #  local_start 2002-10-26 23:01:00 (Sat)
  63185270460, #    local_end 2003-04-06 00:01:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  63185283060, #    utc_start 2003-04-06 03:31:00 (Sun)
  63202818660, #      utc_end 2003-10-26 02:31:00 (Sun)
  63185274060, #  local_start 2003-04-06 01:01:00 (Sun)
  63202809660, #    local_end 2003-10-26 00:01:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  63202818660, #    utc_start 2003-10-26 02:31:00 (Sun)
  63216732660, #      utc_end 2004-04-04 03:31:00 (Sun)
  63202806060, #  local_start 2003-10-25 23:01:00 (Sat)
  63216720060, #    local_end 2004-04-04 00:01:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  63216732660, #    utc_start 2004-04-04 03:31:00 (Sun)
  63234873060, #      utc_end 2004-10-31 02:31:00 (Sun)
  63216723660, #  local_start 2004-04-04 01:01:00 (Sun)
  63234864060, #    local_end 2004-10-31 00:01:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  63234873060, #    utc_start 2004-10-31 02:31:00 (Sun)
  63248182260, #      utc_end 2005-04-03 03:31:00 (Sun)
  63234860460, #  local_start 2004-10-30 23:01:00 (Sat)
  63248169660, #    local_end 2005-04-03 00:01:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  63248182260, #    utc_start 2005-04-03 03:31:00 (Sun)
  63266322660, #      utc_end 2005-10-30 02:31:00 (Sun)
  63248173260, #  local_start 2005-04-03 01:01:00 (Sun)
  63266313660, #    local_end 2005-10-30 00:01:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  63266322660, #    utc_start 2005-10-30 02:31:00 (Sun)
  63279631860, #      utc_end 2006-04-02 03:31:00 (Sun)
  63266310060, #  local_start 2005-10-29 23:01:00 (Sat)
  63279619260, #    local_end 2006-04-02 00:01:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  63279631860, #    utc_start 2006-04-02 03:31:00 (Sun)
  63297772260, #      utc_end 2006-10-29 02:31:00 (Sun)
  63279622860, #  local_start 2006-04-02 01:01:00 (Sun)
  63297763260, #    local_end 2006-10-29 00:01:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  63297772260, #    utc_start 2006-10-29 02:31:00 (Sun)
  63309267060, #      utc_end 2007-03-11 03:31:00 (Sun)
  63297759660, #  local_start 2006-10-28 23:01:00 (Sat)
  63309254460, #    local_end 2007-03-11 00:01:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  63309267060, #    utc_start 2007-03-11 03:31:00 (Sun)
  63329826660, #      utc_end 2007-11-04 02:31:00 (Sun)
  63309258060, #  local_start 2007-03-11 01:01:00 (Sun)
  63329817660, #    local_end 2007-11-04 00:01:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  63329826660, #    utc_start 2007-11-04 02:31:00 (Sun)
  63340716660, #      utc_end 2008-03-09 03:31:00 (Sun)
  63329814060, #  local_start 2007-11-03 23:01:00 (Sat)
  63340704060, #    local_end 2008-03-09 00:01:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  63340716660, #    utc_start 2008-03-09 03:31:00 (Sun)
  63361276260, #      utc_end 2008-11-02 02:31:00 (Sun)
  63340707660, #  local_start 2008-03-09 01:01:00 (Sun)
  63361267260, #    local_end 2008-11-02 00:01:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  63361276260, #    utc_start 2008-11-02 02:31:00 (Sun)
  63372166260, #      utc_end 2009-03-08 03:31:00 (Sun)
  63361263660, #  local_start 2008-11-01 23:01:00 (Sat)
  63372153660, #    local_end 2009-03-08 00:01:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  63372166260, #    utc_start 2009-03-08 03:31:00 (Sun)
  63392725860, #      utc_end 2009-11-01 02:31:00 (Sun)
  63372157260, #  local_start 2009-03-08 01:01:00 (Sun)
  63392716860, #    local_end 2009-11-01 00:01:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  63392725860, #    utc_start 2009-11-01 02:31:00 (Sun)
  63404220660, #      utc_end 2010-03-14 03:31:00 (Sun)
  63392713260, #  local_start 2009-10-31 23:01:00 (Sat)
  63404208060, #    local_end 2010-03-14 00:01:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  63404220660, #    utc_start 2010-03-14 03:31:00 (Sun)
  63424780260, #      utc_end 2010-11-07 02:31:00 (Sun)
  63404211660, #  local_start 2010-03-14 01:01:00 (Sun)
  63424771260, #    local_end 2010-11-07 00:01:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  63424780260, #    utc_start 2010-11-07 02:31:00 (Sun)
  63435670260, #      utc_end 2011-03-13 03:31:00 (Sun)
  63424767660, #  local_start 2010-11-06 23:01:00 (Sat)
  63435657660, #    local_end 2011-03-13 00:01:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  63435670260, #    utc_start 2011-03-13 03:31:00 (Sun)
  63455797800, #      utc_end 2011-11-01 02:30:00 (Tue)
  63435661260, #  local_start 2011-03-13 01:01:00 (Sun)
  63455788800, #    local_end 2011-11-01 00:00:00 (Tue)
  -9000,
  1,
  'NDT',
      ],
      [
  63455797800, #    utc_start 2011-11-01 02:30:00 (Tue)
  63456237000, #      utc_end 2011-11-06 04:30:00 (Sun)
  63455788800, #  local_start 2011-11-01 00:00:00 (Tue)
  63456228000, #    local_end 2011-11-06 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  63456237000, #    utc_start 2011-11-06 04:30:00 (Sun)
  63467127000, #      utc_end 2012-03-11 05:30:00 (Sun)
  63456224400, #  local_start 2011-11-06 01:00:00 (Sun)
  63467114400, #    local_end 2012-03-11 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  63467127000, #    utc_start 2012-03-11 05:30:00 (Sun)
  63487686600, #      utc_end 2012-11-04 04:30:00 (Sun)
  63467118000, #  local_start 2012-03-11 03:00:00 (Sun)
  63487677600, #    local_end 2012-11-04 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  63487686600, #    utc_start 2012-11-04 04:30:00 (Sun)
  63498576600, #      utc_end 2013-03-10 05:30:00 (Sun)
  63487674000, #  local_start 2012-11-04 01:00:00 (Sun)
  63498564000, #    local_end 2013-03-10 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  63498576600, #    utc_start 2013-03-10 05:30:00 (Sun)
  63519136200, #      utc_end 2013-11-03 04:30:00 (Sun)
  63498567600, #  local_start 2013-03-10 03:00:00 (Sun)
  63519127200, #    local_end 2013-11-03 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  63519136200, #    utc_start 2013-11-03 04:30:00 (Sun)
  63530026200, #      utc_end 2014-03-09 05:30:00 (Sun)
  63519123600, #  local_start 2013-11-03 01:00:00 (Sun)
  63530013600, #    local_end 2014-03-09 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  63530026200, #    utc_start 2014-03-09 05:30:00 (Sun)
  63550585800, #      utc_end 2014-11-02 04:30:00 (Sun)
  63530017200, #  local_start 2014-03-09 03:00:00 (Sun)
  63550576800, #    local_end 2014-11-02 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  63550585800, #    utc_start 2014-11-02 04:30:00 (Sun)
  63561475800, #      utc_end 2015-03-08 05:30:00 (Sun)
  63550573200, #  local_start 2014-11-02 01:00:00 (Sun)
  63561463200, #    local_end 2015-03-08 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  63561475800, #    utc_start 2015-03-08 05:30:00 (Sun)
  63582035400, #      utc_end 2015-11-01 04:30:00 (Sun)
  63561466800, #  local_start 2015-03-08 03:00:00 (Sun)
  63582026400, #    local_end 2015-11-01 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  63582035400, #    utc_start 2015-11-01 04:30:00 (Sun)
  63593530200, #      utc_end 2016-03-13 05:30:00 (Sun)
  63582022800, #  local_start 2015-11-01 01:00:00 (Sun)
  63593517600, #    local_end 2016-03-13 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  63593530200, #    utc_start 2016-03-13 05:30:00 (Sun)
  63614089800, #      utc_end 2016-11-06 04:30:00 (Sun)
  63593521200, #  local_start 2016-03-13 03:00:00 (Sun)
  63614080800, #    local_end 2016-11-06 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  63614089800, #    utc_start 2016-11-06 04:30:00 (Sun)
  63624979800, #      utc_end 2017-03-12 05:30:00 (Sun)
  63614077200, #  local_start 2016-11-06 01:00:00 (Sun)
  63624967200, #    local_end 2017-03-12 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  63624979800, #    utc_start 2017-03-12 05:30:00 (Sun)
  63645539400, #      utc_end 2017-11-05 04:30:00 (Sun)
  63624970800, #  local_start 2017-03-12 03:00:00 (Sun)
  63645530400, #    local_end 2017-11-05 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  63645539400, #    utc_start 2017-11-05 04:30:00 (Sun)
  63656429400, #      utc_end 2018-03-11 05:30:00 (Sun)
  63645526800, #  local_start 2017-11-05 01:00:00 (Sun)
  63656416800, #    local_end 2018-03-11 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  63656429400, #    utc_start 2018-03-11 05:30:00 (Sun)
  63676989000, #      utc_end 2018-11-04 04:30:00 (Sun)
  63656420400, #  local_start 2018-03-11 03:00:00 (Sun)
  63676980000, #    local_end 2018-11-04 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  63676989000, #    utc_start 2018-11-04 04:30:00 (Sun)
  63687879000, #      utc_end 2019-03-10 05:30:00 (Sun)
  63676976400, #  local_start 2018-11-04 01:00:00 (Sun)
  63687866400, #    local_end 2019-03-10 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  63687879000, #    utc_start 2019-03-10 05:30:00 (Sun)
  63708438600, #      utc_end 2019-11-03 04:30:00 (Sun)
  63687870000, #  local_start 2019-03-10 03:00:00 (Sun)
  63708429600, #    local_end 2019-11-03 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  63708438600, #    utc_start 2019-11-03 04:30:00 (Sun)
  63719328600, #      utc_end 2020-03-08 05:30:00 (Sun)
  63708426000, #  local_start 2019-11-03 01:00:00 (Sun)
  63719316000, #    local_end 2020-03-08 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  63719328600, #    utc_start 2020-03-08 05:30:00 (Sun)
  63739888200, #      utc_end 2020-11-01 04:30:00 (Sun)
  63719319600, #  local_start 2020-03-08 03:00:00 (Sun)
  63739879200, #    local_end 2020-11-01 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  63739888200, #    utc_start 2020-11-01 04:30:00 (Sun)
  63751383000, #      utc_end 2021-03-14 05:30:00 (Sun)
  63739875600, #  local_start 2020-11-01 01:00:00 (Sun)
  63751370400, #    local_end 2021-03-14 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  63751383000, #    utc_start 2021-03-14 05:30:00 (Sun)
  63771942600, #      utc_end 2021-11-07 04:30:00 (Sun)
  63751374000, #  local_start 2021-03-14 03:00:00 (Sun)
  63771933600, #    local_end 2021-11-07 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  63771942600, #    utc_start 2021-11-07 04:30:00 (Sun)
  63782832600, #      utc_end 2022-03-13 05:30:00 (Sun)
  63771930000, #  local_start 2021-11-07 01:00:00 (Sun)
  63782820000, #    local_end 2022-03-13 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  63782832600, #    utc_start 2022-03-13 05:30:00 (Sun)
  63803392200, #      utc_end 2022-11-06 04:30:00 (Sun)
  63782823600, #  local_start 2022-03-13 03:00:00 (Sun)
  63803383200, #    local_end 2022-11-06 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  63803392200, #    utc_start 2022-11-06 04:30:00 (Sun)
  63814282200, #      utc_end 2023-03-12 05:30:00 (Sun)
  63803379600, #  local_start 2022-11-06 01:00:00 (Sun)
  63814269600, #    local_end 2023-03-12 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  63814282200, #    utc_start 2023-03-12 05:30:00 (Sun)
  63834841800, #      utc_end 2023-11-05 04:30:00 (Sun)
  63814273200, #  local_start 2023-03-12 03:00:00 (Sun)
  63834832800, #    local_end 2023-11-05 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  63834841800, #    utc_start 2023-11-05 04:30:00 (Sun)
  63845731800, #      utc_end 2024-03-10 05:30:00 (Sun)
  63834829200, #  local_start 2023-11-05 01:00:00 (Sun)
  63845719200, #    local_end 2024-03-10 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  63845731800, #    utc_start 2024-03-10 05:30:00 (Sun)
  63866291400, #      utc_end 2024-11-03 04:30:00 (Sun)
  63845722800, #  local_start 2024-03-10 03:00:00 (Sun)
  63866282400, #    local_end 2024-11-03 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  63866291400, #    utc_start 2024-11-03 04:30:00 (Sun)
  63877181400, #      utc_end 2025-03-09 05:30:00 (Sun)
  63866278800, #  local_start 2024-11-03 01:00:00 (Sun)
  63877168800, #    local_end 2025-03-09 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  63877181400, #    utc_start 2025-03-09 05:30:00 (Sun)
  63897741000, #      utc_end 2025-11-02 04:30:00 (Sun)
  63877172400, #  local_start 2025-03-09 03:00:00 (Sun)
  63897732000, #    local_end 2025-11-02 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  63897741000, #    utc_start 2025-11-02 04:30:00 (Sun)
  63908631000, #      utc_end 2026-03-08 05:30:00 (Sun)
  63897728400, #  local_start 2025-11-02 01:00:00 (Sun)
  63908618400, #    local_end 2026-03-08 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  63908631000, #    utc_start 2026-03-08 05:30:00 (Sun)
  63929190600, #      utc_end 2026-11-01 04:30:00 (Sun)
  63908622000, #  local_start 2026-03-08 03:00:00 (Sun)
  63929181600, #    local_end 2026-11-01 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  63929190600, #    utc_start 2026-11-01 04:30:00 (Sun)
  63940685400, #      utc_end 2027-03-14 05:30:00 (Sun)
  63929178000, #  local_start 2026-11-01 01:00:00 (Sun)
  63940672800, #    local_end 2027-03-14 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  63940685400, #    utc_start 2027-03-14 05:30:00 (Sun)
  63961245000, #      utc_end 2027-11-07 04:30:00 (Sun)
  63940676400, #  local_start 2027-03-14 03:00:00 (Sun)
  63961236000, #    local_end 2027-11-07 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  63961245000, #    utc_start 2027-11-07 04:30:00 (Sun)
  63972135000, #      utc_end 2028-03-12 05:30:00 (Sun)
  63961232400, #  local_start 2027-11-07 01:00:00 (Sun)
  63972122400, #    local_end 2028-03-12 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  63972135000, #    utc_start 2028-03-12 05:30:00 (Sun)
  63992694600, #      utc_end 2028-11-05 04:30:00 (Sun)
  63972126000, #  local_start 2028-03-12 03:00:00 (Sun)
  63992685600, #    local_end 2028-11-05 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  63992694600, #    utc_start 2028-11-05 04:30:00 (Sun)
  64003584600, #      utc_end 2029-03-11 05:30:00 (Sun)
  63992682000, #  local_start 2028-11-05 01:00:00 (Sun)
  64003572000, #    local_end 2029-03-11 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  64003584600, #    utc_start 2029-03-11 05:30:00 (Sun)
  64024144200, #      utc_end 2029-11-04 04:30:00 (Sun)
  64003575600, #  local_start 2029-03-11 03:00:00 (Sun)
  64024135200, #    local_end 2029-11-04 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
      [
  64024144200, #    utc_start 2029-11-04 04:30:00 (Sun)
  64035034200, #      utc_end 2030-03-10 05:30:00 (Sun)
  64024131600, #  local_start 2029-11-04 01:00:00 (Sun)
  64035021600, #    local_end 2030-03-10 02:00:00 (Sun)
  -12600,
  0,
  'NST',
      ],
      [
  64035034200, #    utc_start 2030-03-10 05:30:00 (Sun)
  64055593800, #      utc_end 2030-11-03 04:30:00 (Sun)
  64035025200, #  local_start 2030-03-10 03:00:00 (Sun)
  64055584800, #    local_end 2030-11-03 02:00:00 (Sun)
  -9000,
  1,
  'NDT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {113}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -12600 }
  
  my $last_observance = bless( {
    'format' => 'N%sT',
    'gmtoff' => '-3:30',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 734442,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 734442,
      'utc_rd_secs' => 0,
      'utc_year' => 2012
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -12600,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 734442,
      'local_rd_secs' => 9000,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 734442,
      'utc_rd_secs' => 9000,
      'utc_year' => 2012
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Mar',
      'letter' => 'D',
      'name' => 'Canada',
      'offset_from_std' => 3600,
      'on' => 'Sun>=8',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Nov',
      'letter' => 'S',
      'name' => 'Canada',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_ST_JOHNS

    $main::fatpacked{"DateTime/TimeZone/America/Swift_Current.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_SWIFT_CURRENT';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Swift_Current;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Swift_Current::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60105481880, #      utc_end 1905-09-01 07:11:20 (Fri)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60105456000, #    local_end 1905-09-01 00:00:00 (Fri)
  -25880,
  0,
  'LMT',
      ],
      [
  60105481880, #    utc_start 1905-09-01 07:11:20 (Fri)
  60503619600, #      utc_end 1918-04-14 09:00:00 (Sun)
  60105456680, #  local_start 1905-09-01 00:11:20 (Fri)
  60503594400, #    local_end 1918-04-14 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  60503619600, #    utc_start 1918-04-14 09:00:00 (Sun)
  60520550400, #      utc_end 1918-10-27 08:00:00 (Sun)
  60503598000, #  local_start 1918-04-14 03:00:00 (Sun)
  60520528800, #    local_end 1918-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  60520550400, #    utc_start 1918-10-27 08:00:00 (Sun)
  61255472400, #      utc_end 1942-02-09 09:00:00 (Mon)
  60520525200, #  local_start 1918-10-27 01:00:00 (Sun)
  61255447200, #    local_end 1942-02-09 02:00:00 (Mon)
  -25200,
  0,
  'MST',
      ],
      [
  61255472400, #    utc_start 1942-02-09 09:00:00 (Mon)
  61366287600, #      utc_end 1945-08-14 23:00:00 (Tue)
  61255450800, #  local_start 1942-02-09 03:00:00 (Mon)
  61366266000, #    local_end 1945-08-14 17:00:00 (Tue)
  -21600,
  1,
  'MWT',
      ],
      [
  61366287600, #    utc_start 1945-08-14 23:00:00 (Tue)
  61370294400, #      utc_end 1945-09-30 08:00:00 (Sun)
  61366266000, #  local_start 1945-08-14 17:00:00 (Tue)
  61370272800, #    local_end 1945-09-30 02:00:00 (Sun)
  -21600,
  1,
  'MPT',
      ],
      [
  61370294400, #    utc_start 1945-09-30 08:00:00 (Sun)
  61388442000, #      utc_end 1946-04-28 09:00:00 (Sun)
  61370269200, #  local_start 1945-09-30 01:00:00 (Sun)
  61388416800, #    local_end 1946-04-28 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  61388442000, #    utc_start 1946-04-28 09:00:00 (Sun)
  61402953600, #      utc_end 1946-10-13 08:00:00 (Sun)
  61388420400, #  local_start 1946-04-28 03:00:00 (Sun)
  61402932000, #    local_end 1946-10-13 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  61402953600, #    utc_start 1946-10-13 08:00:00 (Sun)
  61419891600, #      utc_end 1947-04-27 09:00:00 (Sun)
  61402928400, #  local_start 1946-10-13 01:00:00 (Sun)
  61419866400, #    local_end 1947-04-27 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  61419891600, #    utc_start 1947-04-27 09:00:00 (Sun)
  61433193600, #      utc_end 1947-09-28 08:00:00 (Sun)
  61419870000, #  local_start 1947-04-27 03:00:00 (Sun)
  61433172000, #    local_end 1947-09-28 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  61433193600, #    utc_start 1947-09-28 08:00:00 (Sun)
  61451341200, #      utc_end 1948-04-25 09:00:00 (Sun)
  61433168400, #  local_start 1947-09-28 01:00:00 (Sun)
  61451316000, #    local_end 1948-04-25 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  61451341200, #    utc_start 1948-04-25 09:00:00 (Sun)
  61464643200, #      utc_end 1948-09-26 08:00:00 (Sun)
  61451319600, #  local_start 1948-04-25 03:00:00 (Sun)
  61464621600, #    local_end 1948-09-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  61464643200, #    utc_start 1948-09-26 08:00:00 (Sun)
  61482790800, #      utc_end 1949-04-24 09:00:00 (Sun)
  61464618000, #  local_start 1948-09-26 01:00:00 (Sun)
  61482765600, #    local_end 1949-04-24 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  61482790800, #    utc_start 1949-04-24 09:00:00 (Sun)
  61496092800, #      utc_end 1949-09-25 08:00:00 (Sun)
  61482769200, #  local_start 1949-04-24 03:00:00 (Sun)
  61496071200, #    local_end 1949-09-25 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  61496092800, #    utc_start 1949-09-25 08:00:00 (Sun)
  61504556400, #      utc_end 1950-01-01 07:00:00 (Sun)
  61496067600, #  local_start 1949-09-25 01:00:00 (Sun)
  61504531200, #    local_end 1950-01-01 00:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  61504556400, #    utc_start 1950-01-01 07:00:00 (Sun)
  61735597200, #      utc_end 1957-04-28 09:00:00 (Sun)
  61504531200, #  local_start 1950-01-01 00:00:00 (Sun)
  61735572000, #    local_end 1957-04-28 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  61735597200, #    utc_start 1957-04-28 09:00:00 (Sun)
  61751318400, #      utc_end 1957-10-27 08:00:00 (Sun)
  61735575600, #  local_start 1957-04-28 03:00:00 (Sun)
  61751296800, #    local_end 1957-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  61751318400, #    utc_start 1957-10-27 08:00:00 (Sun)
  61798496400, #      utc_end 1959-04-26 09:00:00 (Sun)
  61751293200, #  local_start 1957-10-27 01:00:00 (Sun)
  61798471200, #    local_end 1959-04-26 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  61798496400, #    utc_start 1959-04-26 09:00:00 (Sun)
  61814217600, #      utc_end 1959-10-25 08:00:00 (Sun)
  61798474800, #  local_start 1959-04-26 03:00:00 (Sun)
  61814196000, #    local_end 1959-10-25 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  61814217600, #    utc_start 1959-10-25 08:00:00 (Sun)
  61829946000, #      utc_end 1960-04-24 09:00:00 (Sun)
  61814192400, #  local_start 1959-10-25 01:00:00 (Sun)
  61829920800, #    local_end 1960-04-24 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  61829946000, #    utc_start 1960-04-24 09:00:00 (Sun)
  61843248000, #      utc_end 1960-09-25 08:00:00 (Sun)
  61829924400, #  local_start 1960-04-24 03:00:00 (Sun)
  61843226400, #    local_end 1960-09-25 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  61843248000, #    utc_start 1960-09-25 08:00:00 (Sun)
  61862000400, #      utc_end 1961-04-30 09:00:00 (Sun)
  61843222800, #  local_start 1960-09-25 01:00:00 (Sun)
  61861975200, #    local_end 1961-04-30 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  61862000400, #    utc_start 1961-04-30 09:00:00 (Sun)
  61874697600, #      utc_end 1961-09-24 08:00:00 (Sun)
  61861978800, #  local_start 1961-04-30 03:00:00 (Sun)
  61874676000, #    local_end 1961-09-24 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  61874697600, #    utc_start 1961-09-24 08:00:00 (Sun)
  62209155600, #      utc_end 1972-04-30 09:00:00 (Sun)
  61874672400, #  local_start 1961-09-24 01:00:00 (Sun)
  62209130400, #    local_end 1972-04-30 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62209155600, #    utc_start 1972-04-30 09:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #      utc_end
  62209134000, #  local_start 1972-04-30 03:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  -21600,
  0,
  'CST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {11}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_SWIFT_CURRENT

    $main::fatpacked{"DateTime/TimeZone/America/Tegucigalpa.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_TEGUCIGALPA';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Tegucigalpa;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Tegucigalpa::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60597179332, #      utc_end 1921-04-01 05:48:52 (Fri)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60597158400, #    local_end 1921-04-01 00:00:00 (Fri)
  -20932,
  0,
  'LMT',
      ],
      [
  60597179332, #    utc_start 1921-04-01 05:48:52 (Fri)
  62682703200, #      utc_end 1987-05-03 06:00:00 (Sun)
  60597157732, #  local_start 1921-03-31 23:48:52 (Thu)
  62682681600, #    local_end 1987-05-03 00:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62682703200, #    utc_start 1987-05-03 06:00:00 (Sun)
  62695400400, #      utc_end 1987-09-27 05:00:00 (Sun)
  62682685200, #  local_start 1987-05-03 01:00:00 (Sun)
  62695382400, #    local_end 1987-09-27 00:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62695400400, #    utc_start 1987-09-27 05:00:00 (Sun)
  62714152800, #      utc_end 1988-05-01 06:00:00 (Sun)
  62695378800, #  local_start 1987-09-26 23:00:00 (Sat)
  62714131200, #    local_end 1988-05-01 00:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62714152800, #    utc_start 1988-05-01 06:00:00 (Sun)
  62726850000, #      utc_end 1988-09-25 05:00:00 (Sun)
  62714134800, #  local_start 1988-05-01 01:00:00 (Sun)
  62726832000, #    local_end 1988-09-25 00:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62726850000, #    utc_start 1988-09-25 05:00:00 (Sun)
  63282664800, #      utc_end 2006-05-07 06:00:00 (Sun)
  62726828400, #  local_start 1988-09-24 23:00:00 (Sat)
  63282643200, #    local_end 2006-05-07 00:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63282664800, #    utc_start 2006-05-07 06:00:00 (Sun)
  63290610000, #      utc_end 2006-08-07 05:00:00 (Mon)
  63282646800, #  local_start 2006-05-07 01:00:00 (Sun)
  63290592000, #    local_end 2006-08-07 00:00:00 (Mon)
  -18000,
  1,
  'CDT',
      ],
      [
  63290610000, #    utc_start 2006-08-07 05:00:00 (Mon)
  DateTime::TimeZone::INFINITY, #      utc_end
  63290588400, #  local_start 2006-08-06 23:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  -21600,
  0,
  'CST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {3}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_TEGUCIGALPA

    $main::fatpacked{"DateTime/TimeZone/America/Thule.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_THULE';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Thule;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Thule::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60449603708, #      utc_end 1916-07-28 04:35:08 (Fri)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60449587200, #    local_end 1916-07-28 00:00:00 (Fri)
  -16508,
  0,
  'LMT',
      ],
      [
  60449603708, #    utc_start 1916-07-28 04:35:08 (Fri)
  62806082400, #      utc_end 1991-03-31 06:00:00 (Sun)
  60449589308, #  local_start 1916-07-28 00:35:08 (Fri)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62806082400, #    utc_start 1991-03-31 06:00:00 (Sun)
  62821803600, #      utc_end 1991-09-29 05:00:00 (Sun)
  62806071600, #  local_start 1991-03-31 03:00:00 (Sun)
  62821792800, #    local_end 1991-09-29 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62821803600, #    utc_start 1991-09-29 05:00:00 (Sun)
  62837532000, #      utc_end 1992-03-29 06:00:00 (Sun)
  62821789200, #  local_start 1991-09-29 01:00:00 (Sun)
  62837517600, #    local_end 1992-03-29 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62837532000, #    utc_start 1992-03-29 06:00:00 (Sun)
  62853253200, #      utc_end 1992-09-27 05:00:00 (Sun)
  62837521200, #  local_start 1992-03-29 03:00:00 (Sun)
  62853242400, #    local_end 1992-09-27 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62853253200, #    utc_start 1992-09-27 05:00:00 (Sun)
  62869586400, #      utc_end 1993-04-04 06:00:00 (Sun)
  62853238800, #  local_start 1992-09-27 01:00:00 (Sun)
  62869572000, #    local_end 1993-04-04 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62869586400, #    utc_start 1993-04-04 06:00:00 (Sun)
  62887726800, #      utc_end 1993-10-31 05:00:00 (Sun)
  62869575600, #  local_start 1993-04-04 03:00:00 (Sun)
  62887716000, #    local_end 1993-10-31 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62887726800, #    utc_start 1993-10-31 05:00:00 (Sun)
  62901036000, #      utc_end 1994-04-03 06:00:00 (Sun)
  62887712400, #  local_start 1993-10-31 01:00:00 (Sun)
  62901021600, #    local_end 1994-04-03 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62901036000, #    utc_start 1994-04-03 06:00:00 (Sun)
  62919176400, #      utc_end 1994-10-30 05:00:00 (Sun)
  62901025200, #  local_start 1994-04-03 03:00:00 (Sun)
  62919165600, #    local_end 1994-10-30 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62919176400, #    utc_start 1994-10-30 05:00:00 (Sun)
  62932485600, #      utc_end 1995-04-02 06:00:00 (Sun)
  62919162000, #  local_start 1994-10-30 01:00:00 (Sun)
  62932471200, #    local_end 1995-04-02 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62932485600, #    utc_start 1995-04-02 06:00:00 (Sun)
  62950626000, #      utc_end 1995-10-29 05:00:00 (Sun)
  62932474800, #  local_start 1995-04-02 03:00:00 (Sun)
  62950615200, #    local_end 1995-10-29 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62950626000, #    utc_start 1995-10-29 05:00:00 (Sun)
  62964540000, #      utc_end 1996-04-07 06:00:00 (Sun)
  62950611600, #  local_start 1995-10-29 01:00:00 (Sun)
  62964525600, #    local_end 1996-04-07 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62964540000, #    utc_start 1996-04-07 06:00:00 (Sun)
  62982075600, #      utc_end 1996-10-27 05:00:00 (Sun)
  62964529200, #  local_start 1996-04-07 03:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62982075600, #    utc_start 1996-10-27 05:00:00 (Sun)
  62995989600, #      utc_end 1997-04-06 06:00:00 (Sun)
  62982061200, #  local_start 1996-10-27 01:00:00 (Sun)
  62995975200, #    local_end 1997-04-06 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62995989600, #    utc_start 1997-04-06 06:00:00 (Sun)
  63013525200, #      utc_end 1997-10-26 05:00:00 (Sun)
  62995978800, #  local_start 1997-04-06 03:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63013525200, #    utc_start 1997-10-26 05:00:00 (Sun)
  63027439200, #      utc_end 1998-04-05 06:00:00 (Sun)
  63013510800, #  local_start 1997-10-26 01:00:00 (Sun)
  63027424800, #    local_end 1998-04-05 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63027439200, #    utc_start 1998-04-05 06:00:00 (Sun)
  63044974800, #      utc_end 1998-10-25 05:00:00 (Sun)
  63027428400, #  local_start 1998-04-05 03:00:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63044974800, #    utc_start 1998-10-25 05:00:00 (Sun)
  63058888800, #      utc_end 1999-04-04 06:00:00 (Sun)
  63044960400, #  local_start 1998-10-25 01:00:00 (Sun)
  63058874400, #    local_end 1999-04-04 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63058888800, #    utc_start 1999-04-04 06:00:00 (Sun)
  63077029200, #      utc_end 1999-10-31 05:00:00 (Sun)
  63058878000, #  local_start 1999-04-04 03:00:00 (Sun)
  63077018400, #    local_end 1999-10-31 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63077029200, #    utc_start 1999-10-31 05:00:00 (Sun)
  63090338400, #      utc_end 2000-04-02 06:00:00 (Sun)
  63077014800, #  local_start 1999-10-31 01:00:00 (Sun)
  63090324000, #    local_end 2000-04-02 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63090338400, #    utc_start 2000-04-02 06:00:00 (Sun)
  63108478800, #      utc_end 2000-10-29 05:00:00 (Sun)
  63090327600, #  local_start 2000-04-02 03:00:00 (Sun)
  63108468000, #    local_end 2000-10-29 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63108478800, #    utc_start 2000-10-29 05:00:00 (Sun)
  63121788000, #      utc_end 2001-04-01 06:00:00 (Sun)
  63108464400, #  local_start 2000-10-29 01:00:00 (Sun)
  63121773600, #    local_end 2001-04-01 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63121788000, #    utc_start 2001-04-01 06:00:00 (Sun)
  63139928400, #      utc_end 2001-10-28 05:00:00 (Sun)
  63121777200, #  local_start 2001-04-01 03:00:00 (Sun)
  63139917600, #    local_end 2001-10-28 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63139928400, #    utc_start 2001-10-28 05:00:00 (Sun)
  63153842400, #      utc_end 2002-04-07 06:00:00 (Sun)
  63139914000, #  local_start 2001-10-28 01:00:00 (Sun)
  63153828000, #    local_end 2002-04-07 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63153842400, #    utc_start 2002-04-07 06:00:00 (Sun)
  63171378000, #      utc_end 2002-10-27 05:00:00 (Sun)
  63153831600, #  local_start 2002-04-07 03:00:00 (Sun)
  63171367200, #    local_end 2002-10-27 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63171378000, #    utc_start 2002-10-27 05:00:00 (Sun)
  63185292000, #      utc_end 2003-04-06 06:00:00 (Sun)
  63171363600, #  local_start 2002-10-27 01:00:00 (Sun)
  63185277600, #    local_end 2003-04-06 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63185292000, #    utc_start 2003-04-06 06:00:00 (Sun)
  63202827600, #      utc_end 2003-10-26 05:00:00 (Sun)
  63185281200, #  local_start 2003-04-06 03:00:00 (Sun)
  63202816800, #    local_end 2003-10-26 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63202827600, #    utc_start 2003-10-26 05:00:00 (Sun)
  63216741600, #      utc_end 2004-04-04 06:00:00 (Sun)
  63202813200, #  local_start 2003-10-26 01:00:00 (Sun)
  63216727200, #    local_end 2004-04-04 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63216741600, #    utc_start 2004-04-04 06:00:00 (Sun)
  63234882000, #      utc_end 2004-10-31 05:00:00 (Sun)
  63216730800, #  local_start 2004-04-04 03:00:00 (Sun)
  63234871200, #    local_end 2004-10-31 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63234882000, #    utc_start 2004-10-31 05:00:00 (Sun)
  63248191200, #      utc_end 2005-04-03 06:00:00 (Sun)
  63234867600, #  local_start 2004-10-31 01:00:00 (Sun)
  63248176800, #    local_end 2005-04-03 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63248191200, #    utc_start 2005-04-03 06:00:00 (Sun)
  63266331600, #      utc_end 2005-10-30 05:00:00 (Sun)
  63248180400, #  local_start 2005-04-03 03:00:00 (Sun)
  63266320800, #    local_end 2005-10-30 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63266331600, #    utc_start 2005-10-30 05:00:00 (Sun)
  63279640800, #      utc_end 2006-04-02 06:00:00 (Sun)
  63266317200, #  local_start 2005-10-30 01:00:00 (Sun)
  63279626400, #    local_end 2006-04-02 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63279640800, #    utc_start 2006-04-02 06:00:00 (Sun)
  63297781200, #      utc_end 2006-10-29 05:00:00 (Sun)
  63279630000, #  local_start 2006-04-02 03:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63297781200, #    utc_start 2006-10-29 05:00:00 (Sun)
  63309276000, #      utc_end 2007-03-11 06:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63309261600, #    local_end 2007-03-11 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63309276000, #    utc_start 2007-03-11 06:00:00 (Sun)
  63329835600, #      utc_end 2007-11-04 05:00:00 (Sun)
  63309265200, #  local_start 2007-03-11 03:00:00 (Sun)
  63329824800, #    local_end 2007-11-04 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63329835600, #    utc_start 2007-11-04 05:00:00 (Sun)
  63340725600, #      utc_end 2008-03-09 06:00:00 (Sun)
  63329821200, #  local_start 2007-11-04 01:00:00 (Sun)
  63340711200, #    local_end 2008-03-09 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63340725600, #    utc_start 2008-03-09 06:00:00 (Sun)
  63361285200, #      utc_end 2008-11-02 05:00:00 (Sun)
  63340714800, #  local_start 2008-03-09 03:00:00 (Sun)
  63361274400, #    local_end 2008-11-02 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63361285200, #    utc_start 2008-11-02 05:00:00 (Sun)
  63372175200, #      utc_end 2009-03-08 06:00:00 (Sun)
  63361270800, #  local_start 2008-11-02 01:00:00 (Sun)
  63372160800, #    local_end 2009-03-08 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63372175200, #    utc_start 2009-03-08 06:00:00 (Sun)
  63392734800, #      utc_end 2009-11-01 05:00:00 (Sun)
  63372164400, #  local_start 2009-03-08 03:00:00 (Sun)
  63392724000, #    local_end 2009-11-01 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63392734800, #    utc_start 2009-11-01 05:00:00 (Sun)
  63404229600, #      utc_end 2010-03-14 06:00:00 (Sun)
  63392720400, #  local_start 2009-11-01 01:00:00 (Sun)
  63404215200, #    local_end 2010-03-14 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63404229600, #    utc_start 2010-03-14 06:00:00 (Sun)
  63424789200, #      utc_end 2010-11-07 05:00:00 (Sun)
  63404218800, #  local_start 2010-03-14 03:00:00 (Sun)
  63424778400, #    local_end 2010-11-07 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63424789200, #    utc_start 2010-11-07 05:00:00 (Sun)
  63435679200, #      utc_end 2011-03-13 06:00:00 (Sun)
  63424774800, #  local_start 2010-11-07 01:00:00 (Sun)
  63435664800, #    local_end 2011-03-13 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63435679200, #    utc_start 2011-03-13 06:00:00 (Sun)
  63456238800, #      utc_end 2011-11-06 05:00:00 (Sun)
  63435668400, #  local_start 2011-03-13 03:00:00 (Sun)
  63456228000, #    local_end 2011-11-06 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63456238800, #    utc_start 2011-11-06 05:00:00 (Sun)
  63467128800, #      utc_end 2012-03-11 06:00:00 (Sun)
  63456224400, #  local_start 2011-11-06 01:00:00 (Sun)
  63467114400, #    local_end 2012-03-11 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63467128800, #    utc_start 2012-03-11 06:00:00 (Sun)
  63487688400, #      utc_end 2012-11-04 05:00:00 (Sun)
  63467118000, #  local_start 2012-03-11 03:00:00 (Sun)
  63487677600, #    local_end 2012-11-04 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63487688400, #    utc_start 2012-11-04 05:00:00 (Sun)
  63498578400, #      utc_end 2013-03-10 06:00:00 (Sun)
  63487674000, #  local_start 2012-11-04 01:00:00 (Sun)
  63498564000, #    local_end 2013-03-10 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63498578400, #    utc_start 2013-03-10 06:00:00 (Sun)
  63519138000, #      utc_end 2013-11-03 05:00:00 (Sun)
  63498567600, #  local_start 2013-03-10 03:00:00 (Sun)
  63519127200, #    local_end 2013-11-03 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63519138000, #    utc_start 2013-11-03 05:00:00 (Sun)
  63530028000, #      utc_end 2014-03-09 06:00:00 (Sun)
  63519123600, #  local_start 2013-11-03 01:00:00 (Sun)
  63530013600, #    local_end 2014-03-09 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63530028000, #    utc_start 2014-03-09 06:00:00 (Sun)
  63550587600, #      utc_end 2014-11-02 05:00:00 (Sun)
  63530017200, #  local_start 2014-03-09 03:00:00 (Sun)
  63550576800, #    local_end 2014-11-02 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63550587600, #    utc_start 2014-11-02 05:00:00 (Sun)
  63561477600, #      utc_end 2015-03-08 06:00:00 (Sun)
  63550573200, #  local_start 2014-11-02 01:00:00 (Sun)
  63561463200, #    local_end 2015-03-08 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63561477600, #    utc_start 2015-03-08 06:00:00 (Sun)
  63582037200, #      utc_end 2015-11-01 05:00:00 (Sun)
  63561466800, #  local_start 2015-03-08 03:00:00 (Sun)
  63582026400, #    local_end 2015-11-01 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63582037200, #    utc_start 2015-11-01 05:00:00 (Sun)
  63593532000, #      utc_end 2016-03-13 06:00:00 (Sun)
  63582022800, #  local_start 2015-11-01 01:00:00 (Sun)
  63593517600, #    local_end 2016-03-13 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63593532000, #    utc_start 2016-03-13 06:00:00 (Sun)
  63614091600, #      utc_end 2016-11-06 05:00:00 (Sun)
  63593521200, #  local_start 2016-03-13 03:00:00 (Sun)
  63614080800, #    local_end 2016-11-06 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63614091600, #    utc_start 2016-11-06 05:00:00 (Sun)
  63624981600, #      utc_end 2017-03-12 06:00:00 (Sun)
  63614077200, #  local_start 2016-11-06 01:00:00 (Sun)
  63624967200, #    local_end 2017-03-12 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63624981600, #    utc_start 2017-03-12 06:00:00 (Sun)
  63645541200, #      utc_end 2017-11-05 05:00:00 (Sun)
  63624970800, #  local_start 2017-03-12 03:00:00 (Sun)
  63645530400, #    local_end 2017-11-05 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63645541200, #    utc_start 2017-11-05 05:00:00 (Sun)
  63656431200, #      utc_end 2018-03-11 06:00:00 (Sun)
  63645526800, #  local_start 2017-11-05 01:00:00 (Sun)
  63656416800, #    local_end 2018-03-11 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63656431200, #    utc_start 2018-03-11 06:00:00 (Sun)
  63676990800, #      utc_end 2018-11-04 05:00:00 (Sun)
  63656420400, #  local_start 2018-03-11 03:00:00 (Sun)
  63676980000, #    local_end 2018-11-04 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63676990800, #    utc_start 2018-11-04 05:00:00 (Sun)
  63687880800, #      utc_end 2019-03-10 06:00:00 (Sun)
  63676976400, #  local_start 2018-11-04 01:00:00 (Sun)
  63687866400, #    local_end 2019-03-10 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63687880800, #    utc_start 2019-03-10 06:00:00 (Sun)
  63708440400, #      utc_end 2019-11-03 05:00:00 (Sun)
  63687870000, #  local_start 2019-03-10 03:00:00 (Sun)
  63708429600, #    local_end 2019-11-03 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63708440400, #    utc_start 2019-11-03 05:00:00 (Sun)
  63719330400, #      utc_end 2020-03-08 06:00:00 (Sun)
  63708426000, #  local_start 2019-11-03 01:00:00 (Sun)
  63719316000, #    local_end 2020-03-08 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63719330400, #    utc_start 2020-03-08 06:00:00 (Sun)
  63739890000, #      utc_end 2020-11-01 05:00:00 (Sun)
  63719319600, #  local_start 2020-03-08 03:00:00 (Sun)
  63739879200, #    local_end 2020-11-01 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63739890000, #    utc_start 2020-11-01 05:00:00 (Sun)
  63751384800, #      utc_end 2021-03-14 06:00:00 (Sun)
  63739875600, #  local_start 2020-11-01 01:00:00 (Sun)
  63751370400, #    local_end 2021-03-14 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63751384800, #    utc_start 2021-03-14 06:00:00 (Sun)
  63771944400, #      utc_end 2021-11-07 05:00:00 (Sun)
  63751374000, #  local_start 2021-03-14 03:00:00 (Sun)
  63771933600, #    local_end 2021-11-07 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63771944400, #    utc_start 2021-11-07 05:00:00 (Sun)
  63782834400, #      utc_end 2022-03-13 06:00:00 (Sun)
  63771930000, #  local_start 2021-11-07 01:00:00 (Sun)
  63782820000, #    local_end 2022-03-13 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63782834400, #    utc_start 2022-03-13 06:00:00 (Sun)
  63803394000, #      utc_end 2022-11-06 05:00:00 (Sun)
  63782823600, #  local_start 2022-03-13 03:00:00 (Sun)
  63803383200, #    local_end 2022-11-06 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63803394000, #    utc_start 2022-11-06 05:00:00 (Sun)
  63814284000, #      utc_end 2023-03-12 06:00:00 (Sun)
  63803379600, #  local_start 2022-11-06 01:00:00 (Sun)
  63814269600, #    local_end 2023-03-12 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63814284000, #    utc_start 2023-03-12 06:00:00 (Sun)
  63834843600, #      utc_end 2023-11-05 05:00:00 (Sun)
  63814273200, #  local_start 2023-03-12 03:00:00 (Sun)
  63834832800, #    local_end 2023-11-05 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63834843600, #    utc_start 2023-11-05 05:00:00 (Sun)
  63845733600, #      utc_end 2024-03-10 06:00:00 (Sun)
  63834829200, #  local_start 2023-11-05 01:00:00 (Sun)
  63845719200, #    local_end 2024-03-10 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63845733600, #    utc_start 2024-03-10 06:00:00 (Sun)
  63866293200, #      utc_end 2024-11-03 05:00:00 (Sun)
  63845722800, #  local_start 2024-03-10 03:00:00 (Sun)
  63866282400, #    local_end 2024-11-03 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63866293200, #    utc_start 2024-11-03 05:00:00 (Sun)
  63877183200, #      utc_end 2025-03-09 06:00:00 (Sun)
  63866278800, #  local_start 2024-11-03 01:00:00 (Sun)
  63877168800, #    local_end 2025-03-09 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63877183200, #    utc_start 2025-03-09 06:00:00 (Sun)
  63897742800, #      utc_end 2025-11-02 05:00:00 (Sun)
  63877172400, #  local_start 2025-03-09 03:00:00 (Sun)
  63897732000, #    local_end 2025-11-02 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63897742800, #    utc_start 2025-11-02 05:00:00 (Sun)
  63908632800, #      utc_end 2026-03-08 06:00:00 (Sun)
  63897728400, #  local_start 2025-11-02 01:00:00 (Sun)
  63908618400, #    local_end 2026-03-08 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63908632800, #    utc_start 2026-03-08 06:00:00 (Sun)
  63929192400, #      utc_end 2026-11-01 05:00:00 (Sun)
  63908622000, #  local_start 2026-03-08 03:00:00 (Sun)
  63929181600, #    local_end 2026-11-01 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63929192400, #    utc_start 2026-11-01 05:00:00 (Sun)
  63940687200, #      utc_end 2027-03-14 06:00:00 (Sun)
  63929178000, #  local_start 2026-11-01 01:00:00 (Sun)
  63940672800, #    local_end 2027-03-14 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63940687200, #    utc_start 2027-03-14 06:00:00 (Sun)
  63961246800, #      utc_end 2027-11-07 05:00:00 (Sun)
  63940676400, #  local_start 2027-03-14 03:00:00 (Sun)
  63961236000, #    local_end 2027-11-07 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63961246800, #    utc_start 2027-11-07 05:00:00 (Sun)
  63972136800, #      utc_end 2028-03-12 06:00:00 (Sun)
  63961232400, #  local_start 2027-11-07 01:00:00 (Sun)
  63972122400, #    local_end 2028-03-12 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63972136800, #    utc_start 2028-03-12 06:00:00 (Sun)
  63992696400, #      utc_end 2028-11-05 05:00:00 (Sun)
  63972126000, #  local_start 2028-03-12 03:00:00 (Sun)
  63992685600, #    local_end 2028-11-05 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63992696400, #    utc_start 2028-11-05 05:00:00 (Sun)
  64003586400, #      utc_end 2029-03-11 06:00:00 (Sun)
  63992682000, #  local_start 2028-11-05 01:00:00 (Sun)
  64003572000, #    local_end 2029-03-11 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  64003586400, #    utc_start 2029-03-11 06:00:00 (Sun)
  64024146000, #      utc_end 2029-11-04 05:00:00 (Sun)
  64003575600, #  local_start 2029-03-11 03:00:00 (Sun)
  64024135200, #    local_end 2029-11-04 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  64024146000, #    utc_start 2029-11-04 05:00:00 (Sun)
  64035036000, #      utc_end 2030-03-10 06:00:00 (Sun)
  64024131600, #  local_start 2029-11-04 01:00:00 (Sun)
  64035021600, #    local_end 2030-03-10 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  64035036000, #    utc_start 2030-03-10 06:00:00 (Sun)
  64055595600, #      utc_end 2030-11-03 05:00:00 (Sun)
  64035025200, #  local_start 2030-03-10 03:00:00 (Sun)
  64055584800, #    local_end 2030-11-03 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {40}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -14400 }
  
  my $last_observance = bless( {
    'format' => 'A%sT',
    'gmtoff' => '-4:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 699648,
      'local_rd_secs' => 2108,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 699648,
      'utc_rd_secs' => 2108,
      'utc_year' => 1917
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -14400,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 699648,
      'local_rd_secs' => 16508,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 699648,
      'utc_rd_secs' => 16508,
      'utc_year' => 1917
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Nov',
      'letter' => 'S',
      'name' => 'Thule',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Mar',
      'letter' => 'D',
      'name' => 'Thule',
      'offset_from_std' => 3600,
      'on' => 'Sun>=8',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_THULE

    $main::fatpacked{"DateTime/TimeZone/America/Thunder_Bay.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_THUNDER_BAY';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Thunder_Bay;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Thunder_Bay::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59768949420, #      utc_end 1895-01-01 05:57:00 (Tue)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59768928000, #    local_end 1895-01-01 00:00:00 (Tue)
  -21420,
  0,
  'LMT',
      ],
      [
  59768949420, #    utc_start 1895-01-01 05:57:00 (Tue)
  60242248800, #      utc_end 1910-01-01 06:00:00 (Sat)
  59768927820, #  local_start 1894-12-31 23:57:00 (Mon)
  60242227200, #    local_end 1910-01-01 00:00:00 (Sat)
  -21600,
  0,
  'CST',
      ],
      [
  60242248800, #    utc_start 1910-01-01 06:00:00 (Sat)
  61252088400, #      utc_end 1942-01-01 05:00:00 (Thu)
  60242230800, #  local_start 1910-01-01 01:00:00 (Sat)
  61252070400, #    local_end 1942-01-01 00:00:00 (Thu)
  -18000,
  0,
  'EST',
      ],
      [
  61252088400, #    utc_start 1942-01-01 05:00:00 (Thu)
  61255465200, #      utc_end 1942-02-09 07:00:00 (Mon)
  61252070400, #  local_start 1942-01-01 00:00:00 (Thu)
  61255447200, #    local_end 1942-02-09 02:00:00 (Mon)
  -18000,
  0,
  'EST',
      ],
      [
  61255465200, #    utc_start 1942-02-09 07:00:00 (Mon)
  61366287600, #      utc_end 1945-08-14 23:00:00 (Tue)
  61255450800, #  local_start 1942-02-09 03:00:00 (Mon)
  61366273200, #    local_end 1945-08-14 19:00:00 (Tue)
  -14400,
  1,
  'EWT',
      ],
      [
  61366287600, #    utc_start 1945-08-14 23:00:00 (Tue)
  61370287200, #      utc_end 1945-09-30 06:00:00 (Sun)
  61366273200, #  local_start 1945-08-14 19:00:00 (Tue)
  61370272800, #    local_end 1945-09-30 02:00:00 (Sun)
  -14400,
  1,
  'EPT',
      ],
      [
  61370287200, #    utc_start 1945-09-30 06:00:00 (Sun)
  62135701200, #      utc_end 1970-01-01 05:00:00 (Thu)
  61370269200, #  local_start 1945-09-30 01:00:00 (Sun)
  62135683200, #    local_end 1970-01-01 00:00:00 (Thu)
  -18000,
  0,
  'EST',
      ],
      [
  62135701200, #    utc_start 1970-01-01 05:00:00 (Thu)
  62145644400, #      utc_end 1970-04-26 07:00:00 (Sun)
  62135683200, #  local_start 1970-01-01 00:00:00 (Thu)
  62145626400, #    local_end 1970-04-26 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62145644400, #    utc_start 1970-04-26 07:00:00 (Sun)
  62161365600, #      utc_end 1970-10-25 06:00:00 (Sun)
  62145630000, #  local_start 1970-04-26 03:00:00 (Sun)
  62161351200, #    local_end 1970-10-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62161365600, #    utc_start 1970-10-25 06:00:00 (Sun)
  62177094000, #      utc_end 1971-04-25 07:00:00 (Sun)
  62161347600, #  local_start 1970-10-25 01:00:00 (Sun)
  62177076000, #    local_end 1971-04-25 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62177094000, #    utc_start 1971-04-25 07:00:00 (Sun)
  62193420000, #      utc_end 1971-10-31 06:00:00 (Sun)
  62177079600, #  local_start 1971-04-25 03:00:00 (Sun)
  62193405600, #    local_end 1971-10-31 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62193420000, #    utc_start 1971-10-31 06:00:00 (Sun)
  62209148400, #      utc_end 1972-04-30 07:00:00 (Sun)
  62193402000, #  local_start 1971-10-31 01:00:00 (Sun)
  62209130400, #    local_end 1972-04-30 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62209148400, #    utc_start 1972-04-30 07:00:00 (Sun)
  62224869600, #      utc_end 1972-10-29 06:00:00 (Sun)
  62209134000, #  local_start 1972-04-30 03:00:00 (Sun)
  62224855200, #    local_end 1972-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62224869600, #    utc_start 1972-10-29 06:00:00 (Sun)
  62230395600, #      utc_end 1973-01-01 05:00:00 (Mon)
  62224851600, #  local_start 1972-10-29 01:00:00 (Sun)
  62230377600, #    local_end 1973-01-01 00:00:00 (Mon)
  -18000,
  0,
  'EST',
      ],
      [
  62230395600, #    utc_start 1973-01-01 05:00:00 (Mon)
  62261931600, #      utc_end 1974-01-01 05:00:00 (Tue)
  62230377600, #  local_start 1973-01-01 00:00:00 (Mon)
  62261913600, #    local_end 1974-01-01 00:00:00 (Tue)
  -18000,
  0,
  'EST',
      ],
      [
  62261931600, #    utc_start 1974-01-01 05:00:00 (Tue)
  62272047600, #      utc_end 1974-04-28 07:00:00 (Sun)
  62261913600, #  local_start 1974-01-01 00:00:00 (Tue)
  62272029600, #    local_end 1974-04-28 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62272047600, #    utc_start 1974-04-28 07:00:00 (Sun)
  62287768800, #      utc_end 1974-10-27 06:00:00 (Sun)
  62272033200, #  local_start 1974-04-28 03:00:00 (Sun)
  62287754400, #    local_end 1974-10-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62287768800, #    utc_start 1974-10-27 06:00:00 (Sun)
  62303497200, #      utc_end 1975-04-27 07:00:00 (Sun)
  62287750800, #  local_start 1974-10-27 01:00:00 (Sun)
  62303479200, #    local_end 1975-04-27 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62303497200, #    utc_start 1975-04-27 07:00:00 (Sun)
  62319218400, #      utc_end 1975-10-26 06:00:00 (Sun)
  62303482800, #  local_start 1975-04-27 03:00:00 (Sun)
  62319204000, #    local_end 1975-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62319218400, #    utc_start 1975-10-26 06:00:00 (Sun)
  62334946800, #      utc_end 1976-04-25 07:00:00 (Sun)
  62319200400, #  local_start 1975-10-26 01:00:00 (Sun)
  62334928800, #    local_end 1976-04-25 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62334946800, #    utc_start 1976-04-25 07:00:00 (Sun)
  62351272800, #      utc_end 1976-10-31 06:00:00 (Sun)
  62334932400, #  local_start 1976-04-25 03:00:00 (Sun)
  62351258400, #    local_end 1976-10-31 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62351272800, #    utc_start 1976-10-31 06:00:00 (Sun)
  62366396400, #      utc_end 1977-04-24 07:00:00 (Sun)
  62351254800, #  local_start 1976-10-31 01:00:00 (Sun)
  62366378400, #    local_end 1977-04-24 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62366396400, #    utc_start 1977-04-24 07:00:00 (Sun)
  62382722400, #      utc_end 1977-10-30 06:00:00 (Sun)
  62366382000, #  local_start 1977-04-24 03:00:00 (Sun)
  62382708000, #    local_end 1977-10-30 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62382722400, #    utc_start 1977-10-30 06:00:00 (Sun)
  62398450800, #      utc_end 1978-04-30 07:00:00 (Sun)
  62382704400, #  local_start 1977-10-30 01:00:00 (Sun)
  62398432800, #    local_end 1978-04-30 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62398450800, #    utc_start 1978-04-30 07:00:00 (Sun)
  62414172000, #      utc_end 1978-10-29 06:00:00 (Sun)
  62398436400, #  local_start 1978-04-30 03:00:00 (Sun)
  62414157600, #    local_end 1978-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62414172000, #    utc_start 1978-10-29 06:00:00 (Sun)
  62429900400, #      utc_end 1979-04-29 07:00:00 (Sun)
  62414154000, #  local_start 1978-10-29 01:00:00 (Sun)
  62429882400, #    local_end 1979-04-29 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62429900400, #    utc_start 1979-04-29 07:00:00 (Sun)
  62445621600, #      utc_end 1979-10-28 06:00:00 (Sun)
  62429886000, #  local_start 1979-04-29 03:00:00 (Sun)
  62445607200, #    local_end 1979-10-28 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62445621600, #    utc_start 1979-10-28 06:00:00 (Sun)
  62461350000, #      utc_end 1980-04-27 07:00:00 (Sun)
  62445603600, #  local_start 1979-10-28 01:00:00 (Sun)
  62461332000, #    local_end 1980-04-27 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62461350000, #    utc_start 1980-04-27 07:00:00 (Sun)
  62477071200, #      utc_end 1980-10-26 06:00:00 (Sun)
  62461335600, #  local_start 1980-04-27 03:00:00 (Sun)
  62477056800, #    local_end 1980-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62477071200, #    utc_start 1980-10-26 06:00:00 (Sun)
  62492799600, #      utc_end 1981-04-26 07:00:00 (Sun)
  62477053200, #  local_start 1980-10-26 01:00:00 (Sun)
  62492781600, #    local_end 1981-04-26 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62492799600, #    utc_start 1981-04-26 07:00:00 (Sun)
  62508520800, #      utc_end 1981-10-25 06:00:00 (Sun)
  62492785200, #  local_start 1981-04-26 03:00:00 (Sun)
  62508506400, #    local_end 1981-10-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62508520800, #    utc_start 1981-10-25 06:00:00 (Sun)
  62524249200, #      utc_end 1982-04-25 07:00:00 (Sun)
  62508502800, #  local_start 1981-10-25 01:00:00 (Sun)
  62524231200, #    local_end 1982-04-25 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62524249200, #    utc_start 1982-04-25 07:00:00 (Sun)
  62540575200, #      utc_end 1982-10-31 06:00:00 (Sun)
  62524234800, #  local_start 1982-04-25 03:00:00 (Sun)
  62540560800, #    local_end 1982-10-31 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62540575200, #    utc_start 1982-10-31 06:00:00 (Sun)
  62555698800, #      utc_end 1983-04-24 07:00:00 (Sun)
  62540557200, #  local_start 1982-10-31 01:00:00 (Sun)
  62555680800, #    local_end 1983-04-24 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62555698800, #    utc_start 1983-04-24 07:00:00 (Sun)
  62572024800, #      utc_end 1983-10-30 06:00:00 (Sun)
  62555684400, #  local_start 1983-04-24 03:00:00 (Sun)
  62572010400, #    local_end 1983-10-30 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62572024800, #    utc_start 1983-10-30 06:00:00 (Sun)
  62587753200, #      utc_end 1984-04-29 07:00:00 (Sun)
  62572006800, #  local_start 1983-10-30 01:00:00 (Sun)
  62587735200, #    local_end 1984-04-29 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62587753200, #    utc_start 1984-04-29 07:00:00 (Sun)
  62603474400, #      utc_end 1984-10-28 06:00:00 (Sun)
  62587738800, #  local_start 1984-04-29 03:00:00 (Sun)
  62603460000, #    local_end 1984-10-28 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62603474400, #    utc_start 1984-10-28 06:00:00 (Sun)
  62619202800, #      utc_end 1985-04-28 07:00:00 (Sun)
  62603456400, #  local_start 1984-10-28 01:00:00 (Sun)
  62619184800, #    local_end 1985-04-28 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62619202800, #    utc_start 1985-04-28 07:00:00 (Sun)
  62634924000, #      utc_end 1985-10-27 06:00:00 (Sun)
  62619188400, #  local_start 1985-04-28 03:00:00 (Sun)
  62634909600, #    local_end 1985-10-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62634924000, #    utc_start 1985-10-27 06:00:00 (Sun)
  62650652400, #      utc_end 1986-04-27 07:00:00 (Sun)
  62634906000, #  local_start 1985-10-27 01:00:00 (Sun)
  62650634400, #    local_end 1986-04-27 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62650652400, #    utc_start 1986-04-27 07:00:00 (Sun)
  62666373600, #      utc_end 1986-10-26 06:00:00 (Sun)
  62650638000, #  local_start 1986-04-27 03:00:00 (Sun)
  62666359200, #    local_end 1986-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62666373600, #    utc_start 1986-10-26 06:00:00 (Sun)
  62680287600, #      utc_end 1987-04-05 07:00:00 (Sun)
  62666355600, #  local_start 1986-10-26 01:00:00 (Sun)
  62680269600, #    local_end 1987-04-05 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62680287600, #    utc_start 1987-04-05 07:00:00 (Sun)
  62697823200, #      utc_end 1987-10-25 06:00:00 (Sun)
  62680273200, #  local_start 1987-04-05 03:00:00 (Sun)
  62697808800, #    local_end 1987-10-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62697823200, #    utc_start 1987-10-25 06:00:00 (Sun)
  62711737200, #      utc_end 1988-04-03 07:00:00 (Sun)
  62697805200, #  local_start 1987-10-25 01:00:00 (Sun)
  62711719200, #    local_end 1988-04-03 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62711737200, #    utc_start 1988-04-03 07:00:00 (Sun)
  62729877600, #      utc_end 1988-10-30 06:00:00 (Sun)
  62711722800, #  local_start 1988-04-03 03:00:00 (Sun)
  62729863200, #    local_end 1988-10-30 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62729877600, #    utc_start 1988-10-30 06:00:00 (Sun)
  62743186800, #      utc_end 1989-04-02 07:00:00 (Sun)
  62729859600, #  local_start 1988-10-30 01:00:00 (Sun)
  62743168800, #    local_end 1989-04-02 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62743186800, #    utc_start 1989-04-02 07:00:00 (Sun)
  62761327200, #      utc_end 1989-10-29 06:00:00 (Sun)
  62743172400, #  local_start 1989-04-02 03:00:00 (Sun)
  62761312800, #    local_end 1989-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62761327200, #    utc_start 1989-10-29 06:00:00 (Sun)
  62774636400, #      utc_end 1990-04-01 07:00:00 (Sun)
  62761309200, #  local_start 1989-10-29 01:00:00 (Sun)
  62774618400, #    local_end 1990-04-01 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62774636400, #    utc_start 1990-04-01 07:00:00 (Sun)
  62792776800, #      utc_end 1990-10-28 06:00:00 (Sun)
  62774622000, #  local_start 1990-04-01 03:00:00 (Sun)
  62792762400, #    local_end 1990-10-28 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62792776800, #    utc_start 1990-10-28 06:00:00 (Sun)
  62806690800, #      utc_end 1991-04-07 07:00:00 (Sun)
  62792758800, #  local_start 1990-10-28 01:00:00 (Sun)
  62806672800, #    local_end 1991-04-07 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62806690800, #    utc_start 1991-04-07 07:00:00 (Sun)
  62824226400, #      utc_end 1991-10-27 06:00:00 (Sun)
  62806676400, #  local_start 1991-04-07 03:00:00 (Sun)
  62824212000, #    local_end 1991-10-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62824226400, #    utc_start 1991-10-27 06:00:00 (Sun)
  62838140400, #      utc_end 1992-04-05 07:00:00 (Sun)
  62824208400, #  local_start 1991-10-27 01:00:00 (Sun)
  62838122400, #    local_end 1992-04-05 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62838140400, #    utc_start 1992-04-05 07:00:00 (Sun)
  62855676000, #      utc_end 1992-10-25 06:00:00 (Sun)
  62838126000, #  local_start 1992-04-05 03:00:00 (Sun)
  62855661600, #    local_end 1992-10-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62855676000, #    utc_start 1992-10-25 06:00:00 (Sun)
  62869590000, #      utc_end 1993-04-04 07:00:00 (Sun)
  62855658000, #  local_start 1992-10-25 01:00:00 (Sun)
  62869572000, #    local_end 1993-04-04 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62869590000, #    utc_start 1993-04-04 07:00:00 (Sun)
  62887730400, #      utc_end 1993-10-31 06:00:00 (Sun)
  62869575600, #  local_start 1993-04-04 03:00:00 (Sun)
  62887716000, #    local_end 1993-10-31 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62887730400, #    utc_start 1993-10-31 06:00:00 (Sun)
  62901039600, #      utc_end 1994-04-03 07:00:00 (Sun)
  62887712400, #  local_start 1993-10-31 01:00:00 (Sun)
  62901021600, #    local_end 1994-04-03 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62901039600, #    utc_start 1994-04-03 07:00:00 (Sun)
  62919180000, #      utc_end 1994-10-30 06:00:00 (Sun)
  62901025200, #  local_start 1994-04-03 03:00:00 (Sun)
  62919165600, #    local_end 1994-10-30 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62919180000, #    utc_start 1994-10-30 06:00:00 (Sun)
  62932489200, #      utc_end 1995-04-02 07:00:00 (Sun)
  62919162000, #  local_start 1994-10-30 01:00:00 (Sun)
  62932471200, #    local_end 1995-04-02 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62932489200, #    utc_start 1995-04-02 07:00:00 (Sun)
  62950629600, #      utc_end 1995-10-29 06:00:00 (Sun)
  62932474800, #  local_start 1995-04-02 03:00:00 (Sun)
  62950615200, #    local_end 1995-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62950629600, #    utc_start 1995-10-29 06:00:00 (Sun)
  62964543600, #      utc_end 1996-04-07 07:00:00 (Sun)
  62950611600, #  local_start 1995-10-29 01:00:00 (Sun)
  62964525600, #    local_end 1996-04-07 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62964543600, #    utc_start 1996-04-07 07:00:00 (Sun)
  62982079200, #      utc_end 1996-10-27 06:00:00 (Sun)
  62964529200, #  local_start 1996-04-07 03:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62982079200, #    utc_start 1996-10-27 06:00:00 (Sun)
  62995993200, #      utc_end 1997-04-06 07:00:00 (Sun)
  62982061200, #  local_start 1996-10-27 01:00:00 (Sun)
  62995975200, #    local_end 1997-04-06 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62995993200, #    utc_start 1997-04-06 07:00:00 (Sun)
  63013528800, #      utc_end 1997-10-26 06:00:00 (Sun)
  62995978800, #  local_start 1997-04-06 03:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63013528800, #    utc_start 1997-10-26 06:00:00 (Sun)
  63027442800, #      utc_end 1998-04-05 07:00:00 (Sun)
  63013510800, #  local_start 1997-10-26 01:00:00 (Sun)
  63027424800, #    local_end 1998-04-05 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63027442800, #    utc_start 1998-04-05 07:00:00 (Sun)
  63044978400, #      utc_end 1998-10-25 06:00:00 (Sun)
  63027428400, #  local_start 1998-04-05 03:00:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63044978400, #    utc_start 1998-10-25 06:00:00 (Sun)
  63058892400, #      utc_end 1999-04-04 07:00:00 (Sun)
  63044960400, #  local_start 1998-10-25 01:00:00 (Sun)
  63058874400, #    local_end 1999-04-04 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63058892400, #    utc_start 1999-04-04 07:00:00 (Sun)
  63077032800, #      utc_end 1999-10-31 06:00:00 (Sun)
  63058878000, #  local_start 1999-04-04 03:00:00 (Sun)
  63077018400, #    local_end 1999-10-31 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63077032800, #    utc_start 1999-10-31 06:00:00 (Sun)
  63090342000, #      utc_end 2000-04-02 07:00:00 (Sun)
  63077014800, #  local_start 1999-10-31 01:00:00 (Sun)
  63090324000, #    local_end 2000-04-02 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63090342000, #    utc_start 2000-04-02 07:00:00 (Sun)
  63108482400, #      utc_end 2000-10-29 06:00:00 (Sun)
  63090327600, #  local_start 2000-04-02 03:00:00 (Sun)
  63108468000, #    local_end 2000-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63108482400, #    utc_start 2000-10-29 06:00:00 (Sun)
  63121791600, #      utc_end 2001-04-01 07:00:00 (Sun)
  63108464400, #  local_start 2000-10-29 01:00:00 (Sun)
  63121773600, #    local_end 2001-04-01 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63121791600, #    utc_start 2001-04-01 07:00:00 (Sun)
  63139932000, #      utc_end 2001-10-28 06:00:00 (Sun)
  63121777200, #  local_start 2001-04-01 03:00:00 (Sun)
  63139917600, #    local_end 2001-10-28 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63139932000, #    utc_start 2001-10-28 06:00:00 (Sun)
  63153846000, #      utc_end 2002-04-07 07:00:00 (Sun)
  63139914000, #  local_start 2001-10-28 01:00:00 (Sun)
  63153828000, #    local_end 2002-04-07 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63153846000, #    utc_start 2002-04-07 07:00:00 (Sun)
  63171381600, #      utc_end 2002-10-27 06:00:00 (Sun)
  63153831600, #  local_start 2002-04-07 03:00:00 (Sun)
  63171367200, #    local_end 2002-10-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63171381600, #    utc_start 2002-10-27 06:00:00 (Sun)
  63185295600, #      utc_end 2003-04-06 07:00:00 (Sun)
  63171363600, #  local_start 2002-10-27 01:00:00 (Sun)
  63185277600, #    local_end 2003-04-06 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63185295600, #    utc_start 2003-04-06 07:00:00 (Sun)
  63202831200, #      utc_end 2003-10-26 06:00:00 (Sun)
  63185281200, #  local_start 2003-04-06 03:00:00 (Sun)
  63202816800, #    local_end 2003-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63202831200, #    utc_start 2003-10-26 06:00:00 (Sun)
  63216745200, #      utc_end 2004-04-04 07:00:00 (Sun)
  63202813200, #  local_start 2003-10-26 01:00:00 (Sun)
  63216727200, #    local_end 2004-04-04 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63216745200, #    utc_start 2004-04-04 07:00:00 (Sun)
  63234885600, #      utc_end 2004-10-31 06:00:00 (Sun)
  63216730800, #  local_start 2004-04-04 03:00:00 (Sun)
  63234871200, #    local_end 2004-10-31 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63234885600, #    utc_start 2004-10-31 06:00:00 (Sun)
  63248194800, #      utc_end 2005-04-03 07:00:00 (Sun)
  63234867600, #  local_start 2004-10-31 01:00:00 (Sun)
  63248176800, #    local_end 2005-04-03 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63248194800, #    utc_start 2005-04-03 07:00:00 (Sun)
  63266335200, #      utc_end 2005-10-30 06:00:00 (Sun)
  63248180400, #  local_start 2005-04-03 03:00:00 (Sun)
  63266320800, #    local_end 2005-10-30 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63266335200, #    utc_start 2005-10-30 06:00:00 (Sun)
  63279644400, #      utc_end 2006-04-02 07:00:00 (Sun)
  63266317200, #  local_start 2005-10-30 01:00:00 (Sun)
  63279626400, #    local_end 2006-04-02 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63279644400, #    utc_start 2006-04-02 07:00:00 (Sun)
  63297784800, #      utc_end 2006-10-29 06:00:00 (Sun)
  63279630000, #  local_start 2006-04-02 03:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63297784800, #    utc_start 2006-10-29 06:00:00 (Sun)
  63309279600, #      utc_end 2007-03-11 07:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63309261600, #    local_end 2007-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63309279600, #    utc_start 2007-03-11 07:00:00 (Sun)
  63329839200, #      utc_end 2007-11-04 06:00:00 (Sun)
  63309265200, #  local_start 2007-03-11 03:00:00 (Sun)
  63329824800, #    local_end 2007-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63329839200, #    utc_start 2007-11-04 06:00:00 (Sun)
  63340729200, #      utc_end 2008-03-09 07:00:00 (Sun)
  63329821200, #  local_start 2007-11-04 01:00:00 (Sun)
  63340711200, #    local_end 2008-03-09 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63340729200, #    utc_start 2008-03-09 07:00:00 (Sun)
  63361288800, #      utc_end 2008-11-02 06:00:00 (Sun)
  63340714800, #  local_start 2008-03-09 03:00:00 (Sun)
  63361274400, #    local_end 2008-11-02 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63361288800, #    utc_start 2008-11-02 06:00:00 (Sun)
  63372178800, #      utc_end 2009-03-08 07:00:00 (Sun)
  63361270800, #  local_start 2008-11-02 01:00:00 (Sun)
  63372160800, #    local_end 2009-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63372178800, #    utc_start 2009-03-08 07:00:00 (Sun)
  63392738400, #      utc_end 2009-11-01 06:00:00 (Sun)
  63372164400, #  local_start 2009-03-08 03:00:00 (Sun)
  63392724000, #    local_end 2009-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63392738400, #    utc_start 2009-11-01 06:00:00 (Sun)
  63404233200, #      utc_end 2010-03-14 07:00:00 (Sun)
  63392720400, #  local_start 2009-11-01 01:00:00 (Sun)
  63404215200, #    local_end 2010-03-14 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63404233200, #    utc_start 2010-03-14 07:00:00 (Sun)
  63424792800, #      utc_end 2010-11-07 06:00:00 (Sun)
  63404218800, #  local_start 2010-03-14 03:00:00 (Sun)
  63424778400, #    local_end 2010-11-07 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63424792800, #    utc_start 2010-11-07 06:00:00 (Sun)
  63435682800, #      utc_end 2011-03-13 07:00:00 (Sun)
  63424774800, #  local_start 2010-11-07 01:00:00 (Sun)
  63435664800, #    local_end 2011-03-13 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63435682800, #    utc_start 2011-03-13 07:00:00 (Sun)
  63456242400, #      utc_end 2011-11-06 06:00:00 (Sun)
  63435668400, #  local_start 2011-03-13 03:00:00 (Sun)
  63456228000, #    local_end 2011-11-06 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63456242400, #    utc_start 2011-11-06 06:00:00 (Sun)
  63467132400, #      utc_end 2012-03-11 07:00:00 (Sun)
  63456224400, #  local_start 2011-11-06 01:00:00 (Sun)
  63467114400, #    local_end 2012-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63467132400, #    utc_start 2012-03-11 07:00:00 (Sun)
  63487692000, #      utc_end 2012-11-04 06:00:00 (Sun)
  63467118000, #  local_start 2012-03-11 03:00:00 (Sun)
  63487677600, #    local_end 2012-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63487692000, #    utc_start 2012-11-04 06:00:00 (Sun)
  63498582000, #      utc_end 2013-03-10 07:00:00 (Sun)
  63487674000, #  local_start 2012-11-04 01:00:00 (Sun)
  63498564000, #    local_end 2013-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63498582000, #    utc_start 2013-03-10 07:00:00 (Sun)
  63519141600, #      utc_end 2013-11-03 06:00:00 (Sun)
  63498567600, #  local_start 2013-03-10 03:00:00 (Sun)
  63519127200, #    local_end 2013-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63519141600, #    utc_start 2013-11-03 06:00:00 (Sun)
  63530031600, #      utc_end 2014-03-09 07:00:00 (Sun)
  63519123600, #  local_start 2013-11-03 01:00:00 (Sun)
  63530013600, #    local_end 2014-03-09 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63530031600, #    utc_start 2014-03-09 07:00:00 (Sun)
  63550591200, #      utc_end 2014-11-02 06:00:00 (Sun)
  63530017200, #  local_start 2014-03-09 03:00:00 (Sun)
  63550576800, #    local_end 2014-11-02 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63550591200, #    utc_start 2014-11-02 06:00:00 (Sun)
  63561481200, #      utc_end 2015-03-08 07:00:00 (Sun)
  63550573200, #  local_start 2014-11-02 01:00:00 (Sun)
  63561463200, #    local_end 2015-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63561481200, #    utc_start 2015-03-08 07:00:00 (Sun)
  63582040800, #      utc_end 2015-11-01 06:00:00 (Sun)
  63561466800, #  local_start 2015-03-08 03:00:00 (Sun)
  63582026400, #    local_end 2015-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63582040800, #    utc_start 2015-11-01 06:00:00 (Sun)
  63593535600, #      utc_end 2016-03-13 07:00:00 (Sun)
  63582022800, #  local_start 2015-11-01 01:00:00 (Sun)
  63593517600, #    local_end 2016-03-13 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63593535600, #    utc_start 2016-03-13 07:00:00 (Sun)
  63614095200, #      utc_end 2016-11-06 06:00:00 (Sun)
  63593521200, #  local_start 2016-03-13 03:00:00 (Sun)
  63614080800, #    local_end 2016-11-06 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63614095200, #    utc_start 2016-11-06 06:00:00 (Sun)
  63624985200, #      utc_end 2017-03-12 07:00:00 (Sun)
  63614077200, #  local_start 2016-11-06 01:00:00 (Sun)
  63624967200, #    local_end 2017-03-12 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63624985200, #    utc_start 2017-03-12 07:00:00 (Sun)
  63645544800, #      utc_end 2017-11-05 06:00:00 (Sun)
  63624970800, #  local_start 2017-03-12 03:00:00 (Sun)
  63645530400, #    local_end 2017-11-05 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63645544800, #    utc_start 2017-11-05 06:00:00 (Sun)
  63656434800, #      utc_end 2018-03-11 07:00:00 (Sun)
  63645526800, #  local_start 2017-11-05 01:00:00 (Sun)
  63656416800, #    local_end 2018-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63656434800, #    utc_start 2018-03-11 07:00:00 (Sun)
  63676994400, #      utc_end 2018-11-04 06:00:00 (Sun)
  63656420400, #  local_start 2018-03-11 03:00:00 (Sun)
  63676980000, #    local_end 2018-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63676994400, #    utc_start 2018-11-04 06:00:00 (Sun)
  63687884400, #      utc_end 2019-03-10 07:00:00 (Sun)
  63676976400, #  local_start 2018-11-04 01:00:00 (Sun)
  63687866400, #    local_end 2019-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63687884400, #    utc_start 2019-03-10 07:00:00 (Sun)
  63708444000, #      utc_end 2019-11-03 06:00:00 (Sun)
  63687870000, #  local_start 2019-03-10 03:00:00 (Sun)
  63708429600, #    local_end 2019-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63708444000, #    utc_start 2019-11-03 06:00:00 (Sun)
  63719334000, #      utc_end 2020-03-08 07:00:00 (Sun)
  63708426000, #  local_start 2019-11-03 01:00:00 (Sun)
  63719316000, #    local_end 2020-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63719334000, #    utc_start 2020-03-08 07:00:00 (Sun)
  63739893600, #      utc_end 2020-11-01 06:00:00 (Sun)
  63719319600, #  local_start 2020-03-08 03:00:00 (Sun)
  63739879200, #    local_end 2020-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63739893600, #    utc_start 2020-11-01 06:00:00 (Sun)
  63751388400, #      utc_end 2021-03-14 07:00:00 (Sun)
  63739875600, #  local_start 2020-11-01 01:00:00 (Sun)
  63751370400, #    local_end 2021-03-14 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63751388400, #    utc_start 2021-03-14 07:00:00 (Sun)
  63771948000, #      utc_end 2021-11-07 06:00:00 (Sun)
  63751374000, #  local_start 2021-03-14 03:00:00 (Sun)
  63771933600, #    local_end 2021-11-07 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63771948000, #    utc_start 2021-11-07 06:00:00 (Sun)
  63782838000, #      utc_end 2022-03-13 07:00:00 (Sun)
  63771930000, #  local_start 2021-11-07 01:00:00 (Sun)
  63782820000, #    local_end 2022-03-13 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63782838000, #    utc_start 2022-03-13 07:00:00 (Sun)
  63803397600, #      utc_end 2022-11-06 06:00:00 (Sun)
  63782823600, #  local_start 2022-03-13 03:00:00 (Sun)
  63803383200, #    local_end 2022-11-06 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63803397600, #    utc_start 2022-11-06 06:00:00 (Sun)
  63814287600, #      utc_end 2023-03-12 07:00:00 (Sun)
  63803379600, #  local_start 2022-11-06 01:00:00 (Sun)
  63814269600, #    local_end 2023-03-12 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63814287600, #    utc_start 2023-03-12 07:00:00 (Sun)
  63834847200, #      utc_end 2023-11-05 06:00:00 (Sun)
  63814273200, #  local_start 2023-03-12 03:00:00 (Sun)
  63834832800, #    local_end 2023-11-05 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63834847200, #    utc_start 2023-11-05 06:00:00 (Sun)
  63845737200, #      utc_end 2024-03-10 07:00:00 (Sun)
  63834829200, #  local_start 2023-11-05 01:00:00 (Sun)
  63845719200, #    local_end 2024-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63845737200, #    utc_start 2024-03-10 07:00:00 (Sun)
  63866296800, #      utc_end 2024-11-03 06:00:00 (Sun)
  63845722800, #  local_start 2024-03-10 03:00:00 (Sun)
  63866282400, #    local_end 2024-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63866296800, #    utc_start 2024-11-03 06:00:00 (Sun)
  63877186800, #      utc_end 2025-03-09 07:00:00 (Sun)
  63866278800, #  local_start 2024-11-03 01:00:00 (Sun)
  63877168800, #    local_end 2025-03-09 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63877186800, #    utc_start 2025-03-09 07:00:00 (Sun)
  63897746400, #      utc_end 2025-11-02 06:00:00 (Sun)
  63877172400, #  local_start 2025-03-09 03:00:00 (Sun)
  63897732000, #    local_end 2025-11-02 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63897746400, #    utc_start 2025-11-02 06:00:00 (Sun)
  63908636400, #      utc_end 2026-03-08 07:00:00 (Sun)
  63897728400, #  local_start 2025-11-02 01:00:00 (Sun)
  63908618400, #    local_end 2026-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63908636400, #    utc_start 2026-03-08 07:00:00 (Sun)
  63929196000, #      utc_end 2026-11-01 06:00:00 (Sun)
  63908622000, #  local_start 2026-03-08 03:00:00 (Sun)
  63929181600, #    local_end 2026-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63929196000, #    utc_start 2026-11-01 06:00:00 (Sun)
  63940690800, #      utc_end 2027-03-14 07:00:00 (Sun)
  63929178000, #  local_start 2026-11-01 01:00:00 (Sun)
  63940672800, #    local_end 2027-03-14 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63940690800, #    utc_start 2027-03-14 07:00:00 (Sun)
  63961250400, #      utc_end 2027-11-07 06:00:00 (Sun)
  63940676400, #  local_start 2027-03-14 03:00:00 (Sun)
  63961236000, #    local_end 2027-11-07 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63961250400, #    utc_start 2027-11-07 06:00:00 (Sun)
  63972140400, #      utc_end 2028-03-12 07:00:00 (Sun)
  63961232400, #  local_start 2027-11-07 01:00:00 (Sun)
  63972122400, #    local_end 2028-03-12 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63972140400, #    utc_start 2028-03-12 07:00:00 (Sun)
  63992700000, #      utc_end 2028-11-05 06:00:00 (Sun)
  63972126000, #  local_start 2028-03-12 03:00:00 (Sun)
  63992685600, #    local_end 2028-11-05 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63992700000, #    utc_start 2028-11-05 06:00:00 (Sun)
  64003590000, #      utc_end 2029-03-11 07:00:00 (Sun)
  63992682000, #  local_start 2028-11-05 01:00:00 (Sun)
  64003572000, #    local_end 2029-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  64003590000, #    utc_start 2029-03-11 07:00:00 (Sun)
  64024149600, #      utc_end 2029-11-04 06:00:00 (Sun)
  64003575600, #  local_start 2029-03-11 03:00:00 (Sun)
  64024135200, #    local_end 2029-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  64024149600, #    utc_start 2029-11-04 06:00:00 (Sun)
  64035039600, #      utc_end 2030-03-10 07:00:00 (Sun)
  64024131600, #  local_start 2029-11-04 01:00:00 (Sun)
  64035021600, #    local_end 2030-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  64035039600, #    utc_start 2030-03-10 07:00:00 (Sun)
  64055599200, #      utc_end 2030-11-03 06:00:00 (Sun)
  64035025200, #  local_start 2030-03-10 03:00:00 (Sun)
  64055584800, #    local_end 2030-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {62}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -18000 }
  
  my $last_observance = bless( {
    'format' => 'E%sT',
    'gmtoff' => '-5:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 720624,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 720624,
      'utc_rd_secs' => 0,
      'utc_year' => 1975
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -18000,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 720624,
      'local_rd_secs' => 18000,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 720624,
      'utc_rd_secs' => 18000,
      'utc_year' => 1975
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Nov',
      'letter' => 'S',
      'name' => 'Canada',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Mar',
      'letter' => 'D',
      'name' => 'Canada',
      'offset_from_std' => 3600,
      'on' => 'Sun>=8',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_THUNDER_BAY

    $main::fatpacked{"DateTime/TimeZone/America/Tijuana.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_TIJUANA';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Tijuana;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Tijuana::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60620947200, #      utc_end 1922-01-01 08:00:00 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60620919116, #    local_end 1922-01-01 00:11:56 (Sun)
  -28084,
  0,
  'LMT',
      ],
      [
  60620947200, #    utc_start 1922-01-01 08:00:00 (Sun)
  60684015600, #      utc_end 1924-01-01 07:00:00 (Tue)
  60620922000, #  local_start 1922-01-01 01:00:00 (Sun)
  60683990400, #    local_end 1924-01-01 00:00:00 (Tue)
  -25200,
  0,
  'MST',
      ],
      [
  60684015600, #    utc_start 1924-01-01 07:00:00 (Tue)
  60792620400, #      utc_end 1927-06-11 07:00:00 (Sat)
  60683986800, #  local_start 1923-12-31 23:00:00 (Mon)
  60792591600, #    local_end 1927-06-10 23:00:00 (Fri)
  -28800,
  0,
  'PST',
      ],
      [
  60792620400, #    utc_start 1927-06-11 07:00:00 (Sat)
  60900879600, #      utc_end 1930-11-15 07:00:00 (Sat)
  60792595200, #  local_start 1927-06-11 00:00:00 (Sat)
  60900854400, #    local_end 1930-11-15 00:00:00 (Sat)
  -25200,
  0,
  'MST',
      ],
      [
  60900879600, #    utc_start 1930-11-15 07:00:00 (Sat)
  60912720000, #      utc_end 1931-04-01 08:00:00 (Wed)
  60900850800, #  local_start 1930-11-14 23:00:00 (Fri)
  60912691200, #    local_end 1931-04-01 00:00:00 (Wed)
  -28800,
  0,
  'PST',
      ],
      [
  60912720000, #    utc_start 1931-04-01 08:00:00 (Wed)
  60928441200, #      utc_end 1931-09-30 07:00:00 (Wed)
  60912694800, #  local_start 1931-04-01 01:00:00 (Wed)
  60928416000, #    local_end 1931-09-30 00:00:00 (Wed)
  -25200,
  1,
  'PDT',
      ],
      [
  60928441200, #    utc_start 1931-09-30 07:00:00 (Wed)
  61261862400, #      utc_end 1942-04-24 08:00:00 (Fri)
  60928412400, #  local_start 1931-09-29 23:00:00 (Tue)
  61261833600, #    local_end 1942-04-24 00:00:00 (Fri)
  -28800,
  0,
  'PST',
      ],
      [
  61261862400, #    utc_start 1942-04-24 08:00:00 (Fri)
  61366287600, #      utc_end 1945-08-14 23:00:00 (Tue)
  61261837200, #  local_start 1942-04-24 01:00:00 (Fri)
  61366262400, #    local_end 1945-08-14 16:00:00 (Tue)
  -25200,
  1,
  'PWT',
      ],
      [
  61366287600, #    utc_start 1945-08-14 23:00:00 (Tue)
  61374006000, #      utc_end 1945-11-12 07:00:00 (Mon)
  61366262400, #  local_start 1945-08-14 16:00:00 (Tue)
  61373980800, #    local_end 1945-11-12 00:00:00 (Mon)
  -25200,
  1,
  'PPT',
      ],
      [
  61374006000, #    utc_start 1945-11-12 07:00:00 (Mon)
  61449609600, #      utc_end 1948-04-05 08:00:00 (Mon)
  61373977200, #  local_start 1945-11-11 23:00:00 (Sun)
  61449580800, #    local_end 1948-04-05 00:00:00 (Mon)
  -28800,
  0,
  'PST',
      ],
      [
  61449609600, #    utc_start 1948-04-05 08:00:00 (Mon)
  61474143600, #      utc_end 1949-01-14 07:00:00 (Fri)
  61449584400, #  local_start 1948-04-05 01:00:00 (Mon)
  61474118400, #    local_end 1949-01-14 00:00:00 (Fri)
  -25200,
  1,
  'PDT',
      ],
      [
  61474143600, #    utc_start 1949-01-14 07:00:00 (Fri)
  61630790400, #      utc_end 1954-01-01 08:00:00 (Fri)
  61474114800, #  local_start 1949-01-13 23:00:00 (Thu)
  61630761600, #    local_end 1954-01-01 00:00:00 (Fri)
  -28800,
  0,
  'PST',
      ],
      [
  61630790400, #    utc_start 1954-01-01 08:00:00 (Fri)
  61640643600, #      utc_end 1954-04-25 09:00:00 (Sun)
  61630761600, #  local_start 1954-01-01 00:00:00 (Fri)
  61640614800, #    local_end 1954-04-25 01:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61640643600, #    utc_start 1954-04-25 09:00:00 (Sun)
  61653949200, #      utc_end 1954-09-26 09:00:00 (Sun)
  61640618400, #  local_start 1954-04-25 02:00:00 (Sun)
  61653924000, #    local_end 1954-09-26 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61653949200, #    utc_start 1954-09-26 09:00:00 (Sun)
  61672093200, #      utc_end 1955-04-24 09:00:00 (Sun)
  61653920400, #  local_start 1954-09-26 01:00:00 (Sun)
  61672064400, #    local_end 1955-04-24 01:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61672093200, #    utc_start 1955-04-24 09:00:00 (Sun)
  61685398800, #      utc_end 1955-09-25 09:00:00 (Sun)
  61672068000, #  local_start 1955-04-24 02:00:00 (Sun)
  61685373600, #    local_end 1955-09-25 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61685398800, #    utc_start 1955-09-25 09:00:00 (Sun)
  61704147600, #      utc_end 1956-04-29 09:00:00 (Sun)
  61685370000, #  local_start 1955-09-25 01:00:00 (Sun)
  61704118800, #    local_end 1956-04-29 01:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61704147600, #    utc_start 1956-04-29 09:00:00 (Sun)
  61717453200, #      utc_end 1956-09-30 09:00:00 (Sun)
  61704122400, #  local_start 1956-04-29 02:00:00 (Sun)
  61717428000, #    local_end 1956-09-30 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61717453200, #    utc_start 1956-09-30 09:00:00 (Sun)
  61735597200, #      utc_end 1957-04-28 09:00:00 (Sun)
  61717424400, #  local_start 1956-09-30 01:00:00 (Sun)
  61735568400, #    local_end 1957-04-28 01:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61735597200, #    utc_start 1957-04-28 09:00:00 (Sun)
  61748902800, #      utc_end 1957-09-29 09:00:00 (Sun)
  61735572000, #  local_start 1957-04-28 02:00:00 (Sun)
  61748877600, #    local_end 1957-09-29 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61748902800, #    utc_start 1957-09-29 09:00:00 (Sun)
  61767046800, #      utc_end 1958-04-27 09:00:00 (Sun)
  61748874000, #  local_start 1957-09-29 01:00:00 (Sun)
  61767018000, #    local_end 1958-04-27 01:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61767046800, #    utc_start 1958-04-27 09:00:00 (Sun)
  61780352400, #      utc_end 1958-09-28 09:00:00 (Sun)
  61767021600, #  local_start 1958-04-27 02:00:00 (Sun)
  61780327200, #    local_end 1958-09-28 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61780352400, #    utc_start 1958-09-28 09:00:00 (Sun)
  61798496400, #      utc_end 1959-04-26 09:00:00 (Sun)
  61780323600, #  local_start 1958-09-28 01:00:00 (Sun)
  61798467600, #    local_end 1959-04-26 01:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61798496400, #    utc_start 1959-04-26 09:00:00 (Sun)
  61811802000, #      utc_end 1959-09-27 09:00:00 (Sun)
  61798471200, #  local_start 1959-04-26 02:00:00 (Sun)
  61811776800, #    local_end 1959-09-27 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61811802000, #    utc_start 1959-09-27 09:00:00 (Sun)
  61829946000, #      utc_end 1960-04-24 09:00:00 (Sun)
  61811773200, #  local_start 1959-09-27 01:00:00 (Sun)
  61829917200, #    local_end 1960-04-24 01:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61829946000, #    utc_start 1960-04-24 09:00:00 (Sun)
  61843251600, #      utc_end 1960-09-25 09:00:00 (Sun)
  61829920800, #  local_start 1960-04-24 02:00:00 (Sun)
  61843226400, #    local_end 1960-09-25 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61843251600, #    utc_start 1960-09-25 09:00:00 (Sun)
  61851715200, #      utc_end 1961-01-01 08:00:00 (Sun)
  61843222800, #  local_start 1960-09-25 01:00:00 (Sun)
  61851686400, #    local_end 1961-01-01 00:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61851715200, #    utc_start 1961-01-01 08:00:00 (Sun)
  62325014400, #      utc_end 1976-01-01 08:00:00 (Thu)
  61851686400, #  local_start 1961-01-01 00:00:00 (Sun)
  62324985600, #    local_end 1976-01-01 00:00:00 (Thu)
  -28800,
  0,
  'PST',
      ],
      [
  62325014400, #    utc_start 1976-01-01 08:00:00 (Thu)
  62334957600, #      utc_end 1976-04-25 10:00:00 (Sun)
  62324985600, #  local_start 1976-01-01 00:00:00 (Thu)
  62334928800, #    local_end 1976-04-25 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62334957600, #    utc_start 1976-04-25 10:00:00 (Sun)
  62351283600, #      utc_end 1976-10-31 09:00:00 (Sun)
  62334932400, #  local_start 1976-04-25 03:00:00 (Sun)
  62351258400, #    local_end 1976-10-31 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62351283600, #    utc_start 1976-10-31 09:00:00 (Sun)
  62366407200, #      utc_end 1977-04-24 10:00:00 (Sun)
  62351254800, #  local_start 1976-10-31 01:00:00 (Sun)
  62366378400, #    local_end 1977-04-24 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62366407200, #    utc_start 1977-04-24 10:00:00 (Sun)
  62382733200, #      utc_end 1977-10-30 09:00:00 (Sun)
  62366382000, #  local_start 1977-04-24 03:00:00 (Sun)
  62382708000, #    local_end 1977-10-30 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62382733200, #    utc_start 1977-10-30 09:00:00 (Sun)
  62398461600, #      utc_end 1978-04-30 10:00:00 (Sun)
  62382704400, #  local_start 1977-10-30 01:00:00 (Sun)
  62398432800, #    local_end 1978-04-30 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62398461600, #    utc_start 1978-04-30 10:00:00 (Sun)
  62414182800, #      utc_end 1978-10-29 09:00:00 (Sun)
  62398436400, #  local_start 1978-04-30 03:00:00 (Sun)
  62414157600, #    local_end 1978-10-29 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62414182800, #    utc_start 1978-10-29 09:00:00 (Sun)
  62429911200, #      utc_end 1979-04-29 10:00:00 (Sun)
  62414154000, #  local_start 1978-10-29 01:00:00 (Sun)
  62429882400, #    local_end 1979-04-29 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62429911200, #    utc_start 1979-04-29 10:00:00 (Sun)
  62445632400, #      utc_end 1979-10-28 09:00:00 (Sun)
  62429886000, #  local_start 1979-04-29 03:00:00 (Sun)
  62445607200, #    local_end 1979-10-28 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62445632400, #    utc_start 1979-10-28 09:00:00 (Sun)
  62461360800, #      utc_end 1980-04-27 10:00:00 (Sun)
  62445603600, #  local_start 1979-10-28 01:00:00 (Sun)
  62461332000, #    local_end 1980-04-27 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62461360800, #    utc_start 1980-04-27 10:00:00 (Sun)
  62477082000, #      utc_end 1980-10-26 09:00:00 (Sun)
  62461335600, #  local_start 1980-04-27 03:00:00 (Sun)
  62477056800, #    local_end 1980-10-26 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62477082000, #    utc_start 1980-10-26 09:00:00 (Sun)
  62492810400, #      utc_end 1981-04-26 10:00:00 (Sun)
  62477053200, #  local_start 1980-10-26 01:00:00 (Sun)
  62492781600, #    local_end 1981-04-26 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62492810400, #    utc_start 1981-04-26 10:00:00 (Sun)
  62508531600, #      utc_end 1981-10-25 09:00:00 (Sun)
  62492785200, #  local_start 1981-04-26 03:00:00 (Sun)
  62508506400, #    local_end 1981-10-25 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62508531600, #    utc_start 1981-10-25 09:00:00 (Sun)
  62524260000, #      utc_end 1982-04-25 10:00:00 (Sun)
  62508502800, #  local_start 1981-10-25 01:00:00 (Sun)
  62524231200, #    local_end 1982-04-25 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62524260000, #    utc_start 1982-04-25 10:00:00 (Sun)
  62540586000, #      utc_end 1982-10-31 09:00:00 (Sun)
  62524234800, #  local_start 1982-04-25 03:00:00 (Sun)
  62540560800, #    local_end 1982-10-31 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62540586000, #    utc_start 1982-10-31 09:00:00 (Sun)
  62555709600, #      utc_end 1983-04-24 10:00:00 (Sun)
  62540557200, #  local_start 1982-10-31 01:00:00 (Sun)
  62555680800, #    local_end 1983-04-24 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62555709600, #    utc_start 1983-04-24 10:00:00 (Sun)
  62572035600, #      utc_end 1983-10-30 09:00:00 (Sun)
  62555684400, #  local_start 1983-04-24 03:00:00 (Sun)
  62572010400, #    local_end 1983-10-30 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62572035600, #    utc_start 1983-10-30 09:00:00 (Sun)
  62587764000, #      utc_end 1984-04-29 10:00:00 (Sun)
  62572006800, #  local_start 1983-10-30 01:00:00 (Sun)
  62587735200, #    local_end 1984-04-29 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62587764000, #    utc_start 1984-04-29 10:00:00 (Sun)
  62603485200, #      utc_end 1984-10-28 09:00:00 (Sun)
  62587738800, #  local_start 1984-04-29 03:00:00 (Sun)
  62603460000, #    local_end 1984-10-28 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62603485200, #    utc_start 1984-10-28 09:00:00 (Sun)
  62619213600, #      utc_end 1985-04-28 10:00:00 (Sun)
  62603456400, #  local_start 1984-10-28 01:00:00 (Sun)
  62619184800, #    local_end 1985-04-28 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62619213600, #    utc_start 1985-04-28 10:00:00 (Sun)
  62634934800, #      utc_end 1985-10-27 09:00:00 (Sun)
  62619188400, #  local_start 1985-04-28 03:00:00 (Sun)
  62634909600, #    local_end 1985-10-27 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62634934800, #    utc_start 1985-10-27 09:00:00 (Sun)
  62650663200, #      utc_end 1986-04-27 10:00:00 (Sun)
  62634906000, #  local_start 1985-10-27 01:00:00 (Sun)
  62650634400, #    local_end 1986-04-27 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62650663200, #    utc_start 1986-04-27 10:00:00 (Sun)
  62666384400, #      utc_end 1986-10-26 09:00:00 (Sun)
  62650638000, #  local_start 1986-04-27 03:00:00 (Sun)
  62666359200, #    local_end 1986-10-26 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62666384400, #    utc_start 1986-10-26 09:00:00 (Sun)
  62680298400, #      utc_end 1987-04-05 10:00:00 (Sun)
  62666355600, #  local_start 1986-10-26 01:00:00 (Sun)
  62680269600, #    local_end 1987-04-05 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62680298400, #    utc_start 1987-04-05 10:00:00 (Sun)
  62697834000, #      utc_end 1987-10-25 09:00:00 (Sun)
  62680273200, #  local_start 1987-04-05 03:00:00 (Sun)
  62697808800, #    local_end 1987-10-25 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62697834000, #    utc_start 1987-10-25 09:00:00 (Sun)
  62711748000, #      utc_end 1988-04-03 10:00:00 (Sun)
  62697805200, #  local_start 1987-10-25 01:00:00 (Sun)
  62711719200, #    local_end 1988-04-03 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62711748000, #    utc_start 1988-04-03 10:00:00 (Sun)
  62729888400, #      utc_end 1988-10-30 09:00:00 (Sun)
  62711722800, #  local_start 1988-04-03 03:00:00 (Sun)
  62729863200, #    local_end 1988-10-30 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62729888400, #    utc_start 1988-10-30 09:00:00 (Sun)
  62743197600, #      utc_end 1989-04-02 10:00:00 (Sun)
  62729859600, #  local_start 1988-10-30 01:00:00 (Sun)
  62743168800, #    local_end 1989-04-02 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62743197600, #    utc_start 1989-04-02 10:00:00 (Sun)
  62761338000, #      utc_end 1989-10-29 09:00:00 (Sun)
  62743172400, #  local_start 1989-04-02 03:00:00 (Sun)
  62761312800, #    local_end 1989-10-29 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62761338000, #    utc_start 1989-10-29 09:00:00 (Sun)
  62774647200, #      utc_end 1990-04-01 10:00:00 (Sun)
  62761309200, #  local_start 1989-10-29 01:00:00 (Sun)
  62774618400, #    local_end 1990-04-01 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62774647200, #    utc_start 1990-04-01 10:00:00 (Sun)
  62792787600, #      utc_end 1990-10-28 09:00:00 (Sun)
  62774622000, #  local_start 1990-04-01 03:00:00 (Sun)
  62792762400, #    local_end 1990-10-28 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62792787600, #    utc_start 1990-10-28 09:00:00 (Sun)
  62806701600, #      utc_end 1991-04-07 10:00:00 (Sun)
  62792758800, #  local_start 1990-10-28 01:00:00 (Sun)
  62806672800, #    local_end 1991-04-07 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62806701600, #    utc_start 1991-04-07 10:00:00 (Sun)
  62824237200, #      utc_end 1991-10-27 09:00:00 (Sun)
  62806676400, #  local_start 1991-04-07 03:00:00 (Sun)
  62824212000, #    local_end 1991-10-27 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62824237200, #    utc_start 1991-10-27 09:00:00 (Sun)
  62838151200, #      utc_end 1992-04-05 10:00:00 (Sun)
  62824208400, #  local_start 1991-10-27 01:00:00 (Sun)
  62838122400, #    local_end 1992-04-05 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62838151200, #    utc_start 1992-04-05 10:00:00 (Sun)
  62855686800, #      utc_end 1992-10-25 09:00:00 (Sun)
  62838126000, #  local_start 1992-04-05 03:00:00 (Sun)
  62855661600, #    local_end 1992-10-25 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62855686800, #    utc_start 1992-10-25 09:00:00 (Sun)
  62869600800, #      utc_end 1993-04-04 10:00:00 (Sun)
  62855658000, #  local_start 1992-10-25 01:00:00 (Sun)
  62869572000, #    local_end 1993-04-04 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62869600800, #    utc_start 1993-04-04 10:00:00 (Sun)
  62887741200, #      utc_end 1993-10-31 09:00:00 (Sun)
  62869575600, #  local_start 1993-04-04 03:00:00 (Sun)
  62887716000, #    local_end 1993-10-31 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62887741200, #    utc_start 1993-10-31 09:00:00 (Sun)
  62901050400, #      utc_end 1994-04-03 10:00:00 (Sun)
  62887712400, #  local_start 1993-10-31 01:00:00 (Sun)
  62901021600, #    local_end 1994-04-03 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62901050400, #    utc_start 1994-04-03 10:00:00 (Sun)
  62919190800, #      utc_end 1994-10-30 09:00:00 (Sun)
  62901025200, #  local_start 1994-04-03 03:00:00 (Sun)
  62919165600, #    local_end 1994-10-30 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62919190800, #    utc_start 1994-10-30 09:00:00 (Sun)
  62932500000, #      utc_end 1995-04-02 10:00:00 (Sun)
  62919162000, #  local_start 1994-10-30 01:00:00 (Sun)
  62932471200, #    local_end 1995-04-02 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62932500000, #    utc_start 1995-04-02 10:00:00 (Sun)
  62950640400, #      utc_end 1995-10-29 09:00:00 (Sun)
  62932474800, #  local_start 1995-04-02 03:00:00 (Sun)
  62950615200, #    local_end 1995-10-29 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62950640400, #    utc_start 1995-10-29 09:00:00 (Sun)
  62956166400, #      utc_end 1996-01-01 08:00:00 (Mon)
  62950611600, #  local_start 1995-10-29 01:00:00 (Sun)
  62956137600, #    local_end 1996-01-01 00:00:00 (Mon)
  -28800,
  0,
  'PST',
      ],
      [
  62956166400, #    utc_start 1996-01-01 08:00:00 (Mon)
  62964554400, #      utc_end 1996-04-07 10:00:00 (Sun)
  62956137600, #  local_start 1996-01-01 00:00:00 (Mon)
  62964525600, #    local_end 1996-04-07 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62964554400, #    utc_start 1996-04-07 10:00:00 (Sun)
  62982090000, #      utc_end 1996-10-27 09:00:00 (Sun)
  62964529200, #  local_start 1996-04-07 03:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62982090000, #    utc_start 1996-10-27 09:00:00 (Sun)
  62996004000, #      utc_end 1997-04-06 10:00:00 (Sun)
  62982061200, #  local_start 1996-10-27 01:00:00 (Sun)
  62995975200, #    local_end 1997-04-06 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62996004000, #    utc_start 1997-04-06 10:00:00 (Sun)
  63013539600, #      utc_end 1997-10-26 09:00:00 (Sun)
  62995978800, #  local_start 1997-04-06 03:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63013539600, #    utc_start 1997-10-26 09:00:00 (Sun)
  63027453600, #      utc_end 1998-04-05 10:00:00 (Sun)
  63013510800, #  local_start 1997-10-26 01:00:00 (Sun)
  63027424800, #    local_end 1998-04-05 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63027453600, #    utc_start 1998-04-05 10:00:00 (Sun)
  63044989200, #      utc_end 1998-10-25 09:00:00 (Sun)
  63027428400, #  local_start 1998-04-05 03:00:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63044989200, #    utc_start 1998-10-25 09:00:00 (Sun)
  63058903200, #      utc_end 1999-04-04 10:00:00 (Sun)
  63044960400, #  local_start 1998-10-25 01:00:00 (Sun)
  63058874400, #    local_end 1999-04-04 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63058903200, #    utc_start 1999-04-04 10:00:00 (Sun)
  63077043600, #      utc_end 1999-10-31 09:00:00 (Sun)
  63058878000, #  local_start 1999-04-04 03:00:00 (Sun)
  63077018400, #    local_end 1999-10-31 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63077043600, #    utc_start 1999-10-31 09:00:00 (Sun)
  63090352800, #      utc_end 2000-04-02 10:00:00 (Sun)
  63077014800, #  local_start 1999-10-31 01:00:00 (Sun)
  63090324000, #    local_end 2000-04-02 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63090352800, #    utc_start 2000-04-02 10:00:00 (Sun)
  63108493200, #      utc_end 2000-10-29 09:00:00 (Sun)
  63090327600, #  local_start 2000-04-02 03:00:00 (Sun)
  63108468000, #    local_end 2000-10-29 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63108493200, #    utc_start 2000-10-29 09:00:00 (Sun)
  63114019200, #      utc_end 2001-01-01 08:00:00 (Mon)
  63108464400, #  local_start 2000-10-29 01:00:00 (Sun)
  63113990400, #    local_end 2001-01-01 00:00:00 (Mon)
  -28800,
  0,
  'PST',
      ],
      [
  63114019200, #    utc_start 2001-01-01 08:00:00 (Mon)
  63121802400, #      utc_end 2001-04-01 10:00:00 (Sun)
  63113990400, #  local_start 2001-01-01 00:00:00 (Mon)
  63121773600, #    local_end 2001-04-01 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63121802400, #    utc_start 2001-04-01 10:00:00 (Sun)
  63139942800, #      utc_end 2001-10-28 09:00:00 (Sun)
  63121777200, #  local_start 2001-04-01 03:00:00 (Sun)
  63139917600, #    local_end 2001-10-28 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63139942800, #    utc_start 2001-10-28 09:00:00 (Sun)
  63149875200, #      utc_end 2002-02-20 08:00:00 (Wed)
  63139914000, #  local_start 2001-10-28 01:00:00 (Sun)
  63149846400, #    local_end 2002-02-20 00:00:00 (Wed)
  -28800,
  0,
  'PST',
      ],
      [
  63149875200, #    utc_start 2002-02-20 08:00:00 (Wed)
  63153856800, #      utc_end 2002-04-07 10:00:00 (Sun)
  63149846400, #  local_start 2002-02-20 00:00:00 (Wed)
  63153828000, #    local_end 2002-04-07 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63153856800, #    utc_start 2002-04-07 10:00:00 (Sun)
  63171392400, #      utc_end 2002-10-27 09:00:00 (Sun)
  63153831600, #  local_start 2002-04-07 03:00:00 (Sun)
  63171367200, #    local_end 2002-10-27 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63171392400, #    utc_start 2002-10-27 09:00:00 (Sun)
  63185306400, #      utc_end 2003-04-06 10:00:00 (Sun)
  63171363600, #  local_start 2002-10-27 01:00:00 (Sun)
  63185277600, #    local_end 2003-04-06 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63185306400, #    utc_start 2003-04-06 10:00:00 (Sun)
  63202842000, #      utc_end 2003-10-26 09:00:00 (Sun)
  63185281200, #  local_start 2003-04-06 03:00:00 (Sun)
  63202816800, #    local_end 2003-10-26 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63202842000, #    utc_start 2003-10-26 09:00:00 (Sun)
  63216756000, #      utc_end 2004-04-04 10:00:00 (Sun)
  63202813200, #  local_start 2003-10-26 01:00:00 (Sun)
  63216727200, #    local_end 2004-04-04 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63216756000, #    utc_start 2004-04-04 10:00:00 (Sun)
  63234896400, #      utc_end 2004-10-31 09:00:00 (Sun)
  63216730800, #  local_start 2004-04-04 03:00:00 (Sun)
  63234871200, #    local_end 2004-10-31 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63234896400, #    utc_start 2004-10-31 09:00:00 (Sun)
  63248205600, #      utc_end 2005-04-03 10:00:00 (Sun)
  63234867600, #  local_start 2004-10-31 01:00:00 (Sun)
  63248176800, #    local_end 2005-04-03 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63248205600, #    utc_start 2005-04-03 10:00:00 (Sun)
  63266346000, #      utc_end 2005-10-30 09:00:00 (Sun)
  63248180400, #  local_start 2005-04-03 03:00:00 (Sun)
  63266320800, #    local_end 2005-10-30 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63266346000, #    utc_start 2005-10-30 09:00:00 (Sun)
  63279655200, #      utc_end 2006-04-02 10:00:00 (Sun)
  63266317200, #  local_start 2005-10-30 01:00:00 (Sun)
  63279626400, #    local_end 2006-04-02 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63279655200, #    utc_start 2006-04-02 10:00:00 (Sun)
  63297795600, #      utc_end 2006-10-29 09:00:00 (Sun)
  63279630000, #  local_start 2006-04-02 03:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63297795600, #    utc_start 2006-10-29 09:00:00 (Sun)
  63311104800, #      utc_end 2007-04-01 10:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63311076000, #    local_end 2007-04-01 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63311104800, #    utc_start 2007-04-01 10:00:00 (Sun)
  63329245200, #      utc_end 2007-10-28 09:00:00 (Sun)
  63311079600, #  local_start 2007-04-01 03:00:00 (Sun)
  63329220000, #    local_end 2007-10-28 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63329245200, #    utc_start 2007-10-28 09:00:00 (Sun)
  63343159200, #      utc_end 2008-04-06 10:00:00 (Sun)
  63329216400, #  local_start 2007-10-28 01:00:00 (Sun)
  63343130400, #    local_end 2008-04-06 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63343159200, #    utc_start 2008-04-06 10:00:00 (Sun)
  63360694800, #      utc_end 2008-10-26 09:00:00 (Sun)
  63343134000, #  local_start 2008-04-06 03:00:00 (Sun)
  63360669600, #    local_end 2008-10-26 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63360694800, #    utc_start 2008-10-26 09:00:00 (Sun)
  63374608800, #      utc_end 2009-04-05 10:00:00 (Sun)
  63360666000, #  local_start 2008-10-26 01:00:00 (Sun)
  63374580000, #    local_end 2009-04-05 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63374608800, #    utc_start 2009-04-05 10:00:00 (Sun)
  63392144400, #      utc_end 2009-10-25 09:00:00 (Sun)
  63374583600, #  local_start 2009-04-05 03:00:00 (Sun)
  63392119200, #    local_end 2009-10-25 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63392144400, #    utc_start 2009-10-25 09:00:00 (Sun)
  63398016000, #      utc_end 2010-01-01 08:00:00 (Fri)
  63392115600, #  local_start 2009-10-25 01:00:00 (Sun)
  63397987200, #    local_end 2010-01-01 00:00:00 (Fri)
  -28800,
  0,
  'PST',
      ],
      [
  63398016000, #    utc_start 2010-01-01 08:00:00 (Fri)
  63404244000, #      utc_end 2010-03-14 10:00:00 (Sun)
  63397987200, #  local_start 2010-01-01 00:00:00 (Fri)
  63404215200, #    local_end 2010-03-14 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63404244000, #    utc_start 2010-03-14 10:00:00 (Sun)
  63424803600, #      utc_end 2010-11-07 09:00:00 (Sun)
  63404218800, #  local_start 2010-03-14 03:00:00 (Sun)
  63424778400, #    local_end 2010-11-07 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63424803600, #    utc_start 2010-11-07 09:00:00 (Sun)
  63435693600, #      utc_end 2011-03-13 10:00:00 (Sun)
  63424774800, #  local_start 2010-11-07 01:00:00 (Sun)
  63435664800, #    local_end 2011-03-13 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63435693600, #    utc_start 2011-03-13 10:00:00 (Sun)
  63456253200, #      utc_end 2011-11-06 09:00:00 (Sun)
  63435668400, #  local_start 2011-03-13 03:00:00 (Sun)
  63456228000, #    local_end 2011-11-06 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63456253200, #    utc_start 2011-11-06 09:00:00 (Sun)
  63467143200, #      utc_end 2012-03-11 10:00:00 (Sun)
  63456224400, #  local_start 2011-11-06 01:00:00 (Sun)
  63467114400, #    local_end 2012-03-11 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63467143200, #    utc_start 2012-03-11 10:00:00 (Sun)
  63487702800, #      utc_end 2012-11-04 09:00:00 (Sun)
  63467118000, #  local_start 2012-03-11 03:00:00 (Sun)
  63487677600, #    local_end 2012-11-04 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63487702800, #    utc_start 2012-11-04 09:00:00 (Sun)
  63498592800, #      utc_end 2013-03-10 10:00:00 (Sun)
  63487674000, #  local_start 2012-11-04 01:00:00 (Sun)
  63498564000, #    local_end 2013-03-10 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63498592800, #    utc_start 2013-03-10 10:00:00 (Sun)
  63519152400, #      utc_end 2013-11-03 09:00:00 (Sun)
  63498567600, #  local_start 2013-03-10 03:00:00 (Sun)
  63519127200, #    local_end 2013-11-03 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63519152400, #    utc_start 2013-11-03 09:00:00 (Sun)
  63530042400, #      utc_end 2014-03-09 10:00:00 (Sun)
  63519123600, #  local_start 2013-11-03 01:00:00 (Sun)
  63530013600, #    local_end 2014-03-09 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63530042400, #    utc_start 2014-03-09 10:00:00 (Sun)
  63550602000, #      utc_end 2014-11-02 09:00:00 (Sun)
  63530017200, #  local_start 2014-03-09 03:00:00 (Sun)
  63550576800, #    local_end 2014-11-02 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63550602000, #    utc_start 2014-11-02 09:00:00 (Sun)
  63561492000, #      utc_end 2015-03-08 10:00:00 (Sun)
  63550573200, #  local_start 2014-11-02 01:00:00 (Sun)
  63561463200, #    local_end 2015-03-08 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63561492000, #    utc_start 2015-03-08 10:00:00 (Sun)
  63582051600, #      utc_end 2015-11-01 09:00:00 (Sun)
  63561466800, #  local_start 2015-03-08 03:00:00 (Sun)
  63582026400, #    local_end 2015-11-01 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63582051600, #    utc_start 2015-11-01 09:00:00 (Sun)
  63593546400, #      utc_end 2016-03-13 10:00:00 (Sun)
  63582022800, #  local_start 2015-11-01 01:00:00 (Sun)
  63593517600, #    local_end 2016-03-13 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63593546400, #    utc_start 2016-03-13 10:00:00 (Sun)
  63614106000, #      utc_end 2016-11-06 09:00:00 (Sun)
  63593521200, #  local_start 2016-03-13 03:00:00 (Sun)
  63614080800, #    local_end 2016-11-06 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63614106000, #    utc_start 2016-11-06 09:00:00 (Sun)
  63624996000, #      utc_end 2017-03-12 10:00:00 (Sun)
  63614077200, #  local_start 2016-11-06 01:00:00 (Sun)
  63624967200, #    local_end 2017-03-12 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63624996000, #    utc_start 2017-03-12 10:00:00 (Sun)
  63645555600, #      utc_end 2017-11-05 09:00:00 (Sun)
  63624970800, #  local_start 2017-03-12 03:00:00 (Sun)
  63645530400, #    local_end 2017-11-05 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63645555600, #    utc_start 2017-11-05 09:00:00 (Sun)
  63656445600, #      utc_end 2018-03-11 10:00:00 (Sun)
  63645526800, #  local_start 2017-11-05 01:00:00 (Sun)
  63656416800, #    local_end 2018-03-11 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63656445600, #    utc_start 2018-03-11 10:00:00 (Sun)
  63677005200, #      utc_end 2018-11-04 09:00:00 (Sun)
  63656420400, #  local_start 2018-03-11 03:00:00 (Sun)
  63676980000, #    local_end 2018-11-04 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63677005200, #    utc_start 2018-11-04 09:00:00 (Sun)
  63687895200, #      utc_end 2019-03-10 10:00:00 (Sun)
  63676976400, #  local_start 2018-11-04 01:00:00 (Sun)
  63687866400, #    local_end 2019-03-10 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63687895200, #    utc_start 2019-03-10 10:00:00 (Sun)
  63708454800, #      utc_end 2019-11-03 09:00:00 (Sun)
  63687870000, #  local_start 2019-03-10 03:00:00 (Sun)
  63708429600, #    local_end 2019-11-03 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63708454800, #    utc_start 2019-11-03 09:00:00 (Sun)
  63719344800, #      utc_end 2020-03-08 10:00:00 (Sun)
  63708426000, #  local_start 2019-11-03 01:00:00 (Sun)
  63719316000, #    local_end 2020-03-08 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63719344800, #    utc_start 2020-03-08 10:00:00 (Sun)
  63739904400, #      utc_end 2020-11-01 09:00:00 (Sun)
  63719319600, #  local_start 2020-03-08 03:00:00 (Sun)
  63739879200, #    local_end 2020-11-01 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63739904400, #    utc_start 2020-11-01 09:00:00 (Sun)
  63751399200, #      utc_end 2021-03-14 10:00:00 (Sun)
  63739875600, #  local_start 2020-11-01 01:00:00 (Sun)
  63751370400, #    local_end 2021-03-14 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63751399200, #    utc_start 2021-03-14 10:00:00 (Sun)
  63771958800, #      utc_end 2021-11-07 09:00:00 (Sun)
  63751374000, #  local_start 2021-03-14 03:00:00 (Sun)
  63771933600, #    local_end 2021-11-07 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63771958800, #    utc_start 2021-11-07 09:00:00 (Sun)
  63782848800, #      utc_end 2022-03-13 10:00:00 (Sun)
  63771930000, #  local_start 2021-11-07 01:00:00 (Sun)
  63782820000, #    local_end 2022-03-13 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63782848800, #    utc_start 2022-03-13 10:00:00 (Sun)
  63803408400, #      utc_end 2022-11-06 09:00:00 (Sun)
  63782823600, #  local_start 2022-03-13 03:00:00 (Sun)
  63803383200, #    local_end 2022-11-06 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63803408400, #    utc_start 2022-11-06 09:00:00 (Sun)
  63814298400, #      utc_end 2023-03-12 10:00:00 (Sun)
  63803379600, #  local_start 2022-11-06 01:00:00 (Sun)
  63814269600, #    local_end 2023-03-12 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63814298400, #    utc_start 2023-03-12 10:00:00 (Sun)
  63834858000, #      utc_end 2023-11-05 09:00:00 (Sun)
  63814273200, #  local_start 2023-03-12 03:00:00 (Sun)
  63834832800, #    local_end 2023-11-05 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63834858000, #    utc_start 2023-11-05 09:00:00 (Sun)
  63845748000, #      utc_end 2024-03-10 10:00:00 (Sun)
  63834829200, #  local_start 2023-11-05 01:00:00 (Sun)
  63845719200, #    local_end 2024-03-10 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63845748000, #    utc_start 2024-03-10 10:00:00 (Sun)
  63866307600, #      utc_end 2024-11-03 09:00:00 (Sun)
  63845722800, #  local_start 2024-03-10 03:00:00 (Sun)
  63866282400, #    local_end 2024-11-03 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63866307600, #    utc_start 2024-11-03 09:00:00 (Sun)
  63877197600, #      utc_end 2025-03-09 10:00:00 (Sun)
  63866278800, #  local_start 2024-11-03 01:00:00 (Sun)
  63877168800, #    local_end 2025-03-09 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63877197600, #    utc_start 2025-03-09 10:00:00 (Sun)
  63897757200, #      utc_end 2025-11-02 09:00:00 (Sun)
  63877172400, #  local_start 2025-03-09 03:00:00 (Sun)
  63897732000, #    local_end 2025-11-02 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63897757200, #    utc_start 2025-11-02 09:00:00 (Sun)
  63908647200, #      utc_end 2026-03-08 10:00:00 (Sun)
  63897728400, #  local_start 2025-11-02 01:00:00 (Sun)
  63908618400, #    local_end 2026-03-08 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63908647200, #    utc_start 2026-03-08 10:00:00 (Sun)
  63929206800, #      utc_end 2026-11-01 09:00:00 (Sun)
  63908622000, #  local_start 2026-03-08 03:00:00 (Sun)
  63929181600, #    local_end 2026-11-01 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63929206800, #    utc_start 2026-11-01 09:00:00 (Sun)
  63940701600, #      utc_end 2027-03-14 10:00:00 (Sun)
  63929178000, #  local_start 2026-11-01 01:00:00 (Sun)
  63940672800, #    local_end 2027-03-14 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63940701600, #    utc_start 2027-03-14 10:00:00 (Sun)
  63961261200, #      utc_end 2027-11-07 09:00:00 (Sun)
  63940676400, #  local_start 2027-03-14 03:00:00 (Sun)
  63961236000, #    local_end 2027-11-07 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63961261200, #    utc_start 2027-11-07 09:00:00 (Sun)
  63972151200, #      utc_end 2028-03-12 10:00:00 (Sun)
  63961232400, #  local_start 2027-11-07 01:00:00 (Sun)
  63972122400, #    local_end 2028-03-12 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63972151200, #    utc_start 2028-03-12 10:00:00 (Sun)
  63992710800, #      utc_end 2028-11-05 09:00:00 (Sun)
  63972126000, #  local_start 2028-03-12 03:00:00 (Sun)
  63992685600, #    local_end 2028-11-05 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63992710800, #    utc_start 2028-11-05 09:00:00 (Sun)
  64003600800, #      utc_end 2029-03-11 10:00:00 (Sun)
  63992682000, #  local_start 2028-11-05 01:00:00 (Sun)
  64003572000, #    local_end 2029-03-11 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  64003600800, #    utc_start 2029-03-11 10:00:00 (Sun)
  64024160400, #      utc_end 2029-11-04 09:00:00 (Sun)
  64003575600, #  local_start 2029-03-11 03:00:00 (Sun)
  64024135200, #    local_end 2029-11-04 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  64024160400, #    utc_start 2029-11-04 09:00:00 (Sun)
  64035050400, #      utc_end 2030-03-10 10:00:00 (Sun)
  64024131600, #  local_start 2029-11-04 01:00:00 (Sun)
  64035021600, #    local_end 2030-03-10 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  64035050400, #    utc_start 2030-03-10 10:00:00 (Sun)
  64055610000, #      utc_end 2030-11-03 09:00:00 (Sun)
  64035025200, #  local_start 2030-03-10 03:00:00 (Sun)
  64055584800, #    local_end 2030-11-03 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {66}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -28800 }
  
  my $last_observance = bless( {
    'format' => 'P%sT',
    'gmtoff' => '-8:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 733773,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 733773,
      'utc_rd_secs' => 0,
      'utc_year' => 2011
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -28800,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 733773,
      'local_rd_secs' => 28800,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 733773,
      'utc_rd_secs' => 28800,
      'utc_year' => 2011
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Mar',
      'letter' => 'D',
      'name' => 'US',
      'offset_from_std' => 3600,
      'on' => 'Sun>=8',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Nov',
      'letter' => 'S',
      'name' => 'US',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_TIJUANA

    $main::fatpacked{"DateTime/TimeZone/America/Toronto.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_TORONTO';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Toronto;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Toronto::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59768947052, #      utc_end 1895-01-01 05:17:32 (Tue)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59768928000, #    local_end 1895-01-01 00:00:00 (Tue)
  -19052,
  0,
  'LMT',
      ],
      [
  59768947052, #    utc_start 1895-01-01 05:17:32 (Tue)
  60503612400, #      utc_end 1918-04-14 07:00:00 (Sun)
  59768929052, #  local_start 1895-01-01 00:17:32 (Tue)
  60503594400, #    local_end 1918-04-14 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  60503612400, #    utc_start 1918-04-14 07:00:00 (Sun)
  60520543200, #      utc_end 1918-10-27 06:00:00 (Sun)
  60503598000, #  local_start 1918-04-14 03:00:00 (Sun)
  60520528800, #    local_end 1918-10-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  60520543200, #    utc_start 1918-10-27 06:00:00 (Sun)
  60526242000, #      utc_end 1919-01-01 05:00:00 (Wed)
  60520525200, #  local_start 1918-10-27 01:00:00 (Sun)
  60526224000, #    local_end 1919-01-01 00:00:00 (Wed)
  -18000,
  0,
  'EST',
      ],
      [
  60526242000, #    utc_start 1919-01-01 05:00:00 (Wed)
  60533929800, #      utc_end 1919-03-31 04:30:00 (Mon)
  60526224000, #  local_start 1919-01-01 00:00:00 (Wed)
  60533911800, #    local_end 1919-03-30 23:30:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  60533929800, #    utc_start 1919-03-31 04:30:00 (Mon)
  60551985600, #      utc_end 1919-10-26 04:00:00 (Sun)
  60533915400, #  local_start 1919-03-31 00:30:00 (Mon)
  60551971200, #    local_end 1919-10-26 00:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  60551985600, #    utc_start 1919-10-26 04:00:00 (Sun)
  60568326000, #      utc_end 1920-05-02 07:00:00 (Sun)
  60551967600, #  local_start 1919-10-25 23:00:00 (Sat)
  60568308000, #    local_end 1920-05-02 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  60568326000, #    utc_start 1920-05-02 07:00:00 (Sun)
  60581016000, #      utc_end 1920-09-26 04:00:00 (Sun)
  60568311600, #  local_start 1920-05-02 03:00:00 (Sun)
  60581001600, #    local_end 1920-09-26 00:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  60581016000, #    utc_start 1920-09-26 04:00:00 (Sun)
  60600985200, #      utc_end 1921-05-15 07:00:00 (Sun)
  60580998000, #  local_start 1920-09-25 23:00:00 (Sat)
  60600967200, #    local_end 1921-05-15 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  60600985200, #    utc_start 1921-05-15 07:00:00 (Sun)
  60611608800, #      utc_end 1921-09-15 06:00:00 (Thu)
  60600970800, #  local_start 1921-05-15 03:00:00 (Sun)
  60611594400, #    local_end 1921-09-15 02:00:00 (Thu)
  -14400,
  1,
  'EDT',
      ],
      [
  60611608800, #    utc_start 1921-09-15 06:00:00 (Thu)
  60632434800, #      utc_end 1922-05-14 07:00:00 (Sun)
  60611590800, #  local_start 1921-09-15 01:00:00 (Thu)
  60632416800, #    local_end 1922-05-14 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  60632434800, #    utc_start 1922-05-14 07:00:00 (Sun)
  60643317600, #      utc_end 1922-09-17 06:00:00 (Sun)
  60632420400, #  local_start 1922-05-14 03:00:00 (Sun)
  60643303200, #    local_end 1922-09-17 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  60643317600, #    utc_start 1922-09-17 06:00:00 (Sun)
  60663884400, #      utc_end 1923-05-13 07:00:00 (Sun)
  60643299600, #  local_start 1922-09-17 01:00:00 (Sun)
  60663866400, #    local_end 1923-05-13 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  60663884400, #    utc_start 1923-05-13 07:00:00 (Sun)
  60674767200, #      utc_end 1923-09-16 06:00:00 (Sun)
  60663870000, #  local_start 1923-05-13 03:00:00 (Sun)
  60674752800, #    local_end 1923-09-16 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  60674767200, #    utc_start 1923-09-16 06:00:00 (Sun)
  60694729200, #      utc_end 1924-05-04 07:00:00 (Sun)
  60674749200, #  local_start 1923-09-16 01:00:00 (Sun)
  60694711200, #    local_end 1924-05-04 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  60694729200, #    utc_start 1924-05-04 07:00:00 (Sun)
  60706821600, #      utc_end 1924-09-21 06:00:00 (Sun)
  60694714800, #  local_start 1924-05-04 03:00:00 (Sun)
  60706807200, #    local_end 1924-09-21 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  60706821600, #    utc_start 1924-09-21 06:00:00 (Sun)
  60726178800, #      utc_end 1925-05-03 07:00:00 (Sun)
  60706803600, #  local_start 1924-09-21 01:00:00 (Sun)
  60726160800, #    local_end 1925-05-03 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  60726178800, #    utc_start 1925-05-03 07:00:00 (Sun)
  60738271200, #      utc_end 1925-09-20 06:00:00 (Sun)
  60726164400, #  local_start 1925-05-03 03:00:00 (Sun)
  60738256800, #    local_end 1925-09-20 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  60738271200, #    utc_start 1925-09-20 06:00:00 (Sun)
  60757628400, #      utc_end 1926-05-02 07:00:00 (Sun)
  60738253200, #  local_start 1925-09-20 01:00:00 (Sun)
  60757610400, #    local_end 1926-05-02 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  60757628400, #    utc_start 1926-05-02 07:00:00 (Sun)
  60769720800, #      utc_end 1926-09-19 06:00:00 (Sun)
  60757614000, #  local_start 1926-05-02 03:00:00 (Sun)
  60769706400, #    local_end 1926-09-19 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  60769720800, #    utc_start 1926-09-19 06:00:00 (Sun)
  60789078000, #      utc_end 1927-05-01 07:00:00 (Sun)
  60769702800, #  local_start 1926-09-19 01:00:00 (Sun)
  60789060000, #    local_end 1927-05-01 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  60789078000, #    utc_start 1927-05-01 07:00:00 (Sun)
  60801775200, #      utc_end 1927-09-25 06:00:00 (Sun)
  60789063600, #  local_start 1927-05-01 03:00:00 (Sun)
  60801760800, #    local_end 1927-09-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  60801775200, #    utc_start 1927-09-25 06:00:00 (Sun)
  60820527600, #      utc_end 1928-04-29 07:00:00 (Sun)
  60801757200, #  local_start 1927-09-25 01:00:00 (Sun)
  60820509600, #    local_end 1928-04-29 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  60820527600, #    utc_start 1928-04-29 07:00:00 (Sun)
  60833829600, #      utc_end 1928-09-30 06:00:00 (Sun)
  60820513200, #  local_start 1928-04-29 03:00:00 (Sun)
  60833815200, #    local_end 1928-09-30 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  60833829600, #    utc_start 1928-09-30 06:00:00 (Sun)
  60851977200, #      utc_end 1929-04-28 07:00:00 (Sun)
  60833811600, #  local_start 1928-09-30 01:00:00 (Sun)
  60851959200, #    local_end 1929-04-28 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  60851977200, #    utc_start 1929-04-28 07:00:00 (Sun)
  60865279200, #      utc_end 1929-09-29 06:00:00 (Sun)
  60851962800, #  local_start 1929-04-28 03:00:00 (Sun)
  60865264800, #    local_end 1929-09-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  60865279200, #    utc_start 1929-09-29 06:00:00 (Sun)
  60883426800, #      utc_end 1930-04-27 07:00:00 (Sun)
  60865261200, #  local_start 1929-09-29 01:00:00 (Sun)
  60883408800, #    local_end 1930-04-27 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  60883426800, #    utc_start 1930-04-27 07:00:00 (Sun)
  60896728800, #      utc_end 1930-09-28 06:00:00 (Sun)
  60883412400, #  local_start 1930-04-27 03:00:00 (Sun)
  60896714400, #    local_end 1930-09-28 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  60896728800, #    utc_start 1930-09-28 06:00:00 (Sun)
  60914876400, #      utc_end 1931-04-26 07:00:00 (Sun)
  60896710800, #  local_start 1930-09-28 01:00:00 (Sun)
  60914858400, #    local_end 1931-04-26 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  60914876400, #    utc_start 1931-04-26 07:00:00 (Sun)
  60928178400, #      utc_end 1931-09-27 06:00:00 (Sun)
  60914862000, #  local_start 1931-04-26 03:00:00 (Sun)
  60928164000, #    local_end 1931-09-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  60928178400, #    utc_start 1931-09-27 06:00:00 (Sun)
  60946930800, #      utc_end 1932-05-01 07:00:00 (Sun)
  60928160400, #  local_start 1931-09-27 01:00:00 (Sun)
  60946912800, #    local_end 1932-05-01 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  60946930800, #    utc_start 1932-05-01 07:00:00 (Sun)
  60959628000, #      utc_end 1932-09-25 06:00:00 (Sun)
  60946916400, #  local_start 1932-05-01 03:00:00 (Sun)
  60959613600, #    local_end 1932-09-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  60959628000, #    utc_start 1932-09-25 06:00:00 (Sun)
  60978380400, #      utc_end 1933-04-30 07:00:00 (Sun)
  60959610000, #  local_start 1932-09-25 01:00:00 (Sun)
  60978362400, #    local_end 1933-04-30 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  60978380400, #    utc_start 1933-04-30 07:00:00 (Sun)
  60991682400, #      utc_end 1933-10-01 06:00:00 (Sun)
  60978366000, #  local_start 1933-04-30 03:00:00 (Sun)
  60991668000, #    local_end 1933-10-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  60991682400, #    utc_start 1933-10-01 06:00:00 (Sun)
  61009830000, #      utc_end 1934-04-29 07:00:00 (Sun)
  60991664400, #  local_start 1933-10-01 01:00:00 (Sun)
  61009812000, #    local_end 1934-04-29 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  61009830000, #    utc_start 1934-04-29 07:00:00 (Sun)
  61023132000, #      utc_end 1934-09-30 06:00:00 (Sun)
  61009815600, #  local_start 1934-04-29 03:00:00 (Sun)
  61023117600, #    local_end 1934-09-30 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  61023132000, #    utc_start 1934-09-30 06:00:00 (Sun)
  61041279600, #      utc_end 1935-04-28 07:00:00 (Sun)
  61023114000, #  local_start 1934-09-30 01:00:00 (Sun)
  61041261600, #    local_end 1935-04-28 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  61041279600, #    utc_start 1935-04-28 07:00:00 (Sun)
  61054581600, #      utc_end 1935-09-29 06:00:00 (Sun)
  61041265200, #  local_start 1935-04-28 03:00:00 (Sun)
  61054567200, #    local_end 1935-09-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  61054581600, #    utc_start 1935-09-29 06:00:00 (Sun)
  61072729200, #      utc_end 1936-04-26 07:00:00 (Sun)
  61054563600, #  local_start 1935-09-29 01:00:00 (Sun)
  61072711200, #    local_end 1936-04-26 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  61072729200, #    utc_start 1936-04-26 07:00:00 (Sun)
  61086031200, #      utc_end 1936-09-27 06:00:00 (Sun)
  61072714800, #  local_start 1936-04-26 03:00:00 (Sun)
  61086016800, #    local_end 1936-09-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  61086031200, #    utc_start 1936-09-27 06:00:00 (Sun)
  61104178800, #      utc_end 1937-04-25 07:00:00 (Sun)
  61086013200, #  local_start 1936-09-27 01:00:00 (Sun)
  61104160800, #    local_end 1937-04-25 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  61104178800, #    utc_start 1937-04-25 07:00:00 (Sun)
  61117480800, #      utc_end 1937-09-26 06:00:00 (Sun)
  61104164400, #  local_start 1937-04-25 03:00:00 (Sun)
  61117466400, #    local_end 1937-09-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  61117480800, #    utc_start 1937-09-26 06:00:00 (Sun)
  61135628400, #      utc_end 1938-04-24 07:00:00 (Sun)
  61117462800, #  local_start 1937-09-26 01:00:00 (Sun)
  61135610400, #    local_end 1938-04-24 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  61135628400, #    utc_start 1938-04-24 07:00:00 (Sun)
  61148930400, #      utc_end 1938-09-25 06:00:00 (Sun)
  61135614000, #  local_start 1938-04-24 03:00:00 (Sun)
  61148916000, #    local_end 1938-09-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  61148930400, #    utc_start 1938-09-25 06:00:00 (Sun)
  61167682800, #      utc_end 1939-04-30 07:00:00 (Sun)
  61148912400, #  local_start 1938-09-25 01:00:00 (Sun)
  61167664800, #    local_end 1939-04-30 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  61167682800, #    utc_start 1939-04-30 07:00:00 (Sun)
  61180380000, #      utc_end 1939-09-24 06:00:00 (Sun)
  61167668400, #  local_start 1939-04-30 03:00:00 (Sun)
  61180365600, #    local_end 1939-09-24 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  61180380000, #    utc_start 1939-09-24 06:00:00 (Sun)
  61199132400, #      utc_end 1940-04-28 07:00:00 (Sun)
  61180362000, #  local_start 1939-09-24 01:00:00 (Sun)
  61199114400, #    local_end 1940-04-28 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  61199132400, #    utc_start 1940-04-28 07:00:00 (Sun)
  61255465200, #      utc_end 1942-02-09 07:00:00 (Mon)
  61199118000, #  local_start 1940-04-28 03:00:00 (Sun)
  61255450800, #    local_end 1942-02-09 03:00:00 (Mon)
  -14400,
  1,
  'EDT',
      ],
      [
  61255465200, #    utc_start 1942-02-09 07:00:00 (Mon)
  61366287600, #      utc_end 1945-08-14 23:00:00 (Tue)
  61255450800, #  local_start 1942-02-09 03:00:00 (Mon)
  61366273200, #    local_end 1945-08-14 19:00:00 (Tue)
  -14400,
  1,
  'EWT',
      ],
      [
  61366287600, #    utc_start 1945-08-14 23:00:00 (Tue)
  61370287200, #      utc_end 1945-09-30 06:00:00 (Sun)
  61366273200, #  local_start 1945-08-14 19:00:00 (Tue)
  61370272800, #    local_end 1945-09-30 02:00:00 (Sun)
  -14400,
  1,
  'EPT',
      ],
      [
  61370287200, #    utc_start 1945-09-30 06:00:00 (Sun)
  61378318800, #      utc_end 1946-01-01 05:00:00 (Tue)
  61370269200, #  local_start 1945-09-30 01:00:00 (Sun)
  61378300800, #    local_end 1946-01-01 00:00:00 (Tue)
  -18000,
  0,
  'EST',
      ],
      [
  61378318800, #    utc_start 1946-01-01 05:00:00 (Tue)
  61388434800, #      utc_end 1946-04-28 07:00:00 (Sun)
  61378300800, #  local_start 1946-01-01 00:00:00 (Tue)
  61388416800, #    local_end 1946-04-28 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  61388434800, #    utc_start 1946-04-28 07:00:00 (Sun)
  61401736800, #      utc_end 1946-09-29 06:00:00 (Sun)
  61388420400, #  local_start 1946-04-28 03:00:00 (Sun)
  61401722400, #    local_end 1946-09-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  61401736800, #    utc_start 1946-09-29 06:00:00 (Sun)
  61419877200, #      utc_end 1947-04-27 05:00:00 (Sun)
  61401718800, #  local_start 1946-09-29 01:00:00 (Sun)
  61419859200, #    local_end 1947-04-27 00:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  61419877200, #    utc_start 1947-04-27 05:00:00 (Sun)
  61433179200, #      utc_end 1947-09-28 04:00:00 (Sun)
  61419862800, #  local_start 1947-04-27 01:00:00 (Sun)
  61433164800, #    local_end 1947-09-28 00:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  61433179200, #    utc_start 1947-09-28 04:00:00 (Sun)
  61451326800, #      utc_end 1948-04-25 05:00:00 (Sun)
  61433161200, #  local_start 1947-09-27 23:00:00 (Sat)
  61451308800, #    local_end 1948-04-25 00:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  61451326800, #    utc_start 1948-04-25 05:00:00 (Sun)
  61464628800, #      utc_end 1948-09-26 04:00:00 (Sun)
  61451312400, #  local_start 1948-04-25 01:00:00 (Sun)
  61464614400, #    local_end 1948-09-26 00:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  61464628800, #    utc_start 1948-09-26 04:00:00 (Sun)
  61482776400, #      utc_end 1949-04-24 05:00:00 (Sun)
  61464610800, #  local_start 1948-09-25 23:00:00 (Sat)
  61482758400, #    local_end 1949-04-24 00:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  61482776400, #    utc_start 1949-04-24 05:00:00 (Sun)
  61501521600, #      utc_end 1949-11-27 04:00:00 (Sun)
  61482762000, #  local_start 1949-04-24 01:00:00 (Sun)
  61501507200, #    local_end 1949-11-27 00:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  61501521600, #    utc_start 1949-11-27 04:00:00 (Sun)
  61514838000, #      utc_end 1950-04-30 07:00:00 (Sun)
  61501503600, #  local_start 1949-11-26 23:00:00 (Sat)
  61514820000, #    local_end 1950-04-30 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  61514838000, #    utc_start 1950-04-30 07:00:00 (Sun)
  61532978400, #      utc_end 1950-11-26 06:00:00 (Sun)
  61514823600, #  local_start 1950-04-30 03:00:00 (Sun)
  61532964000, #    local_end 1950-11-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  61532978400, #    utc_start 1950-11-26 06:00:00 (Sun)
  61546287600, #      utc_end 1951-04-29 07:00:00 (Sun)
  61532960400, #  local_start 1950-11-26 01:00:00 (Sun)
  61546269600, #    local_end 1951-04-29 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  61546287600, #    utc_start 1951-04-29 07:00:00 (Sun)
  61559589600, #      utc_end 1951-09-30 06:00:00 (Sun)
  61546273200, #  local_start 1951-04-29 03:00:00 (Sun)
  61559575200, #    local_end 1951-09-30 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  61559589600, #    utc_start 1951-09-30 06:00:00 (Sun)
  61577737200, #      utc_end 1952-04-27 07:00:00 (Sun)
  61559571600, #  local_start 1951-09-30 01:00:00 (Sun)
  61577719200, #    local_end 1952-04-27 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  61577737200, #    utc_start 1952-04-27 07:00:00 (Sun)
  61591039200, #      utc_end 1952-09-28 06:00:00 (Sun)
  61577722800, #  local_start 1952-04-27 03:00:00 (Sun)
  61591024800, #    local_end 1952-09-28 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  61591039200, #    utc_start 1952-09-28 06:00:00 (Sun)
  61609186800, #      utc_end 1953-04-26 07:00:00 (Sun)
  61591021200, #  local_start 1952-09-28 01:00:00 (Sun)
  61609168800, #    local_end 1953-04-26 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  61609186800, #    utc_start 1953-04-26 07:00:00 (Sun)
  61622488800, #      utc_end 1953-09-27 06:00:00 (Sun)
  61609172400, #  local_start 1953-04-26 03:00:00 (Sun)
  61622474400, #    local_end 1953-09-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  61622488800, #    utc_start 1953-09-27 06:00:00 (Sun)
  61640636400, #      utc_end 1954-04-25 07:00:00 (Sun)
  61622470800, #  local_start 1953-09-27 01:00:00 (Sun)
  61640618400, #    local_end 1954-04-25 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  61640636400, #    utc_start 1954-04-25 07:00:00 (Sun)
  61653938400, #      utc_end 1954-09-26 06:00:00 (Sun)
  61640622000, #  local_start 1954-04-25 03:00:00 (Sun)
  61653924000, #    local_end 1954-09-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  61653938400, #    utc_start 1954-09-26 06:00:00 (Sun)
  61672086000, #      utc_end 1955-04-24 07:00:00 (Sun)
  61653920400, #  local_start 1954-09-26 01:00:00 (Sun)
  61672068000, #    local_end 1955-04-24 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  61672086000, #    utc_start 1955-04-24 07:00:00 (Sun)
  61685388000, #      utc_end 1955-09-25 06:00:00 (Sun)
  61672071600, #  local_start 1955-04-24 03:00:00 (Sun)
  61685373600, #    local_end 1955-09-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  61685388000, #    utc_start 1955-09-25 06:00:00 (Sun)
  61704140400, #      utc_end 1956-04-29 07:00:00 (Sun)
  61685370000, #  local_start 1955-09-25 01:00:00 (Sun)
  61704122400, #    local_end 1956-04-29 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  61704140400, #    utc_start 1956-04-29 07:00:00 (Sun)
  61717442400, #      utc_end 1956-09-30 06:00:00 (Sun)
  61704126000, #  local_start 1956-04-29 03:00:00 (Sun)
  61717428000, #    local_end 1956-09-30 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  61717442400, #    utc_start 1956-09-30 06:00:00 (Sun)
  61735590000, #      utc_end 1957-04-28 07:00:00 (Sun)
  61717424400, #  local_start 1956-09-30 01:00:00 (Sun)
  61735572000, #    local_end 1957-04-28 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  61735590000, #    utc_start 1957-04-28 07:00:00 (Sun)
  61751311200, #      utc_end 1957-10-27 06:00:00 (Sun)
  61735575600, #  local_start 1957-04-28 03:00:00 (Sun)
  61751296800, #    local_end 1957-10-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  61751311200, #    utc_start 1957-10-27 06:00:00 (Sun)
  61767039600, #      utc_end 1958-04-27 07:00:00 (Sun)
  61751293200, #  local_start 1957-10-27 01:00:00 (Sun)
  61767021600, #    local_end 1958-04-27 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  61767039600, #    utc_start 1958-04-27 07:00:00 (Sun)
  61782760800, #      utc_end 1958-10-26 06:00:00 (Sun)
  61767025200, #  local_start 1958-04-27 03:00:00 (Sun)
  61782746400, #    local_end 1958-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  61782760800, #    utc_start 1958-10-26 06:00:00 (Sun)
  61798489200, #      utc_end 1959-04-26 07:00:00 (Sun)
  61782742800, #  local_start 1958-10-26 01:00:00 (Sun)
  61798471200, #    local_end 1959-04-26 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  61798489200, #    utc_start 1959-04-26 07:00:00 (Sun)
  61814210400, #      utc_end 1959-10-25 06:00:00 (Sun)
  61798474800, #  local_start 1959-04-26 03:00:00 (Sun)
  61814196000, #    local_end 1959-10-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  61814210400, #    utc_start 1959-10-25 06:00:00 (Sun)
  61829938800, #      utc_end 1960-04-24 07:00:00 (Sun)
  61814192400, #  local_start 1959-10-25 01:00:00 (Sun)
  61829920800, #    local_end 1960-04-24 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  61829938800, #    utc_start 1960-04-24 07:00:00 (Sun)
  61846264800, #      utc_end 1960-10-30 06:00:00 (Sun)
  61829924400, #  local_start 1960-04-24 03:00:00 (Sun)
  61846250400, #    local_end 1960-10-30 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  61846264800, #    utc_start 1960-10-30 06:00:00 (Sun)
  61861993200, #      utc_end 1961-04-30 07:00:00 (Sun)
  61846246800, #  local_start 1960-10-30 01:00:00 (Sun)
  61861975200, #    local_end 1961-04-30 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  61861993200, #    utc_start 1961-04-30 07:00:00 (Sun)
  61877714400, #      utc_end 1961-10-29 06:00:00 (Sun)
  61861978800, #  local_start 1961-04-30 03:00:00 (Sun)
  61877700000, #    local_end 1961-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  61877714400, #    utc_start 1961-10-29 06:00:00 (Sun)
  61893442800, #      utc_end 1962-04-29 07:00:00 (Sun)
  61877696400, #  local_start 1961-10-29 01:00:00 (Sun)
  61893424800, #    local_end 1962-04-29 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  61893442800, #    utc_start 1962-04-29 07:00:00 (Sun)
  61909164000, #      utc_end 1962-10-28 06:00:00 (Sun)
  61893428400, #  local_start 1962-04-29 03:00:00 (Sun)
  61909149600, #    local_end 1962-10-28 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  61909164000, #    utc_start 1962-10-28 06:00:00 (Sun)
  61924892400, #      utc_end 1963-04-28 07:00:00 (Sun)
  61909146000, #  local_start 1962-10-28 01:00:00 (Sun)
  61924874400, #    local_end 1963-04-28 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  61924892400, #    utc_start 1963-04-28 07:00:00 (Sun)
  61940613600, #      utc_end 1963-10-27 06:00:00 (Sun)
  61924878000, #  local_start 1963-04-28 03:00:00 (Sun)
  61940599200, #    local_end 1963-10-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  61940613600, #    utc_start 1963-10-27 06:00:00 (Sun)
  61956342000, #      utc_end 1964-04-26 07:00:00 (Sun)
  61940595600, #  local_start 1963-10-27 01:00:00 (Sun)
  61956324000, #    local_end 1964-04-26 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  61956342000, #    utc_start 1964-04-26 07:00:00 (Sun)
  61972063200, #      utc_end 1964-10-25 06:00:00 (Sun)
  61956327600, #  local_start 1964-04-26 03:00:00 (Sun)
  61972048800, #    local_end 1964-10-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  61972063200, #    utc_start 1964-10-25 06:00:00 (Sun)
  61987791600, #      utc_end 1965-04-25 07:00:00 (Sun)
  61972045200, #  local_start 1964-10-25 01:00:00 (Sun)
  61987773600, #    local_end 1965-04-25 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  61987791600, #    utc_start 1965-04-25 07:00:00 (Sun)
  62004117600, #      utc_end 1965-10-31 06:00:00 (Sun)
  61987777200, #  local_start 1965-04-25 03:00:00 (Sun)
  62004103200, #    local_end 1965-10-31 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62004117600, #    utc_start 1965-10-31 06:00:00 (Sun)
  62019241200, #      utc_end 1966-04-24 07:00:00 (Sun)
  62004099600, #  local_start 1965-10-31 01:00:00 (Sun)
  62019223200, #    local_end 1966-04-24 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62019241200, #    utc_start 1966-04-24 07:00:00 (Sun)
  62035567200, #      utc_end 1966-10-30 06:00:00 (Sun)
  62019226800, #  local_start 1966-04-24 03:00:00 (Sun)
  62035552800, #    local_end 1966-10-30 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62035567200, #    utc_start 1966-10-30 06:00:00 (Sun)
  62051295600, #      utc_end 1967-04-30 07:00:00 (Sun)
  62035549200, #  local_start 1966-10-30 01:00:00 (Sun)
  62051277600, #    local_end 1967-04-30 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62051295600, #    utc_start 1967-04-30 07:00:00 (Sun)
  62067016800, #      utc_end 1967-10-29 06:00:00 (Sun)
  62051281200, #  local_start 1967-04-30 03:00:00 (Sun)
  62067002400, #    local_end 1967-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62067016800, #    utc_start 1967-10-29 06:00:00 (Sun)
  62082745200, #      utc_end 1968-04-28 07:00:00 (Sun)
  62066998800, #  local_start 1967-10-29 01:00:00 (Sun)
  62082727200, #    local_end 1968-04-28 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62082745200, #    utc_start 1968-04-28 07:00:00 (Sun)
  62098466400, #      utc_end 1968-10-27 06:00:00 (Sun)
  62082730800, #  local_start 1968-04-28 03:00:00 (Sun)
  62098452000, #    local_end 1968-10-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62098466400, #    utc_start 1968-10-27 06:00:00 (Sun)
  62114194800, #      utc_end 1969-04-27 07:00:00 (Sun)
  62098448400, #  local_start 1968-10-27 01:00:00 (Sun)
  62114176800, #    local_end 1969-04-27 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62114194800, #    utc_start 1969-04-27 07:00:00 (Sun)
  62129916000, #      utc_end 1969-10-26 06:00:00 (Sun)
  62114180400, #  local_start 1969-04-27 03:00:00 (Sun)
  62129901600, #    local_end 1969-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62129916000, #    utc_start 1969-10-26 06:00:00 (Sun)
  62145644400, #      utc_end 1970-04-26 07:00:00 (Sun)
  62129898000, #  local_start 1969-10-26 01:00:00 (Sun)
  62145626400, #    local_end 1970-04-26 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62145644400, #    utc_start 1970-04-26 07:00:00 (Sun)
  62161365600, #      utc_end 1970-10-25 06:00:00 (Sun)
  62145630000, #  local_start 1970-04-26 03:00:00 (Sun)
  62161351200, #    local_end 1970-10-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62161365600, #    utc_start 1970-10-25 06:00:00 (Sun)
  62177094000, #      utc_end 1971-04-25 07:00:00 (Sun)
  62161347600, #  local_start 1970-10-25 01:00:00 (Sun)
  62177076000, #    local_end 1971-04-25 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62177094000, #    utc_start 1971-04-25 07:00:00 (Sun)
  62193420000, #      utc_end 1971-10-31 06:00:00 (Sun)
  62177079600, #  local_start 1971-04-25 03:00:00 (Sun)
  62193405600, #    local_end 1971-10-31 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62193420000, #    utc_start 1971-10-31 06:00:00 (Sun)
  62209148400, #      utc_end 1972-04-30 07:00:00 (Sun)
  62193402000, #  local_start 1971-10-31 01:00:00 (Sun)
  62209130400, #    local_end 1972-04-30 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62209148400, #    utc_start 1972-04-30 07:00:00 (Sun)
  62224869600, #      utc_end 1972-10-29 06:00:00 (Sun)
  62209134000, #  local_start 1972-04-30 03:00:00 (Sun)
  62224855200, #    local_end 1972-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62224869600, #    utc_start 1972-10-29 06:00:00 (Sun)
  62240598000, #      utc_end 1973-04-29 07:00:00 (Sun)
  62224851600, #  local_start 1972-10-29 01:00:00 (Sun)
  62240580000, #    local_end 1973-04-29 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62240598000, #    utc_start 1973-04-29 07:00:00 (Sun)
  62256319200, #      utc_end 1973-10-28 06:00:00 (Sun)
  62240583600, #  local_start 1973-04-29 03:00:00 (Sun)
  62256304800, #    local_end 1973-10-28 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62256319200, #    utc_start 1973-10-28 06:00:00 (Sun)
  62261931600, #      utc_end 1974-01-01 05:00:00 (Tue)
  62256301200, #  local_start 1973-10-28 01:00:00 (Sun)
  62261913600, #    local_end 1974-01-01 00:00:00 (Tue)
  -18000,
  0,
  'EST',
      ],
      [
  62261931600, #    utc_start 1974-01-01 05:00:00 (Tue)
  62272047600, #      utc_end 1974-04-28 07:00:00 (Sun)
  62261913600, #  local_start 1974-01-01 00:00:00 (Tue)
  62272029600, #    local_end 1974-04-28 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62272047600, #    utc_start 1974-04-28 07:00:00 (Sun)
  62287768800, #      utc_end 1974-10-27 06:00:00 (Sun)
  62272033200, #  local_start 1974-04-28 03:00:00 (Sun)
  62287754400, #    local_end 1974-10-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62287768800, #    utc_start 1974-10-27 06:00:00 (Sun)
  62303497200, #      utc_end 1975-04-27 07:00:00 (Sun)
  62287750800, #  local_start 1974-10-27 01:00:00 (Sun)
  62303479200, #    local_end 1975-04-27 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62303497200, #    utc_start 1975-04-27 07:00:00 (Sun)
  62319218400, #      utc_end 1975-10-26 06:00:00 (Sun)
  62303482800, #  local_start 1975-04-27 03:00:00 (Sun)
  62319204000, #    local_end 1975-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62319218400, #    utc_start 1975-10-26 06:00:00 (Sun)
  62334946800, #      utc_end 1976-04-25 07:00:00 (Sun)
  62319200400, #  local_start 1975-10-26 01:00:00 (Sun)
  62334928800, #    local_end 1976-04-25 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62334946800, #    utc_start 1976-04-25 07:00:00 (Sun)
  62351272800, #      utc_end 1976-10-31 06:00:00 (Sun)
  62334932400, #  local_start 1976-04-25 03:00:00 (Sun)
  62351258400, #    local_end 1976-10-31 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62351272800, #    utc_start 1976-10-31 06:00:00 (Sun)
  62366396400, #      utc_end 1977-04-24 07:00:00 (Sun)
  62351254800, #  local_start 1976-10-31 01:00:00 (Sun)
  62366378400, #    local_end 1977-04-24 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62366396400, #    utc_start 1977-04-24 07:00:00 (Sun)
  62382722400, #      utc_end 1977-10-30 06:00:00 (Sun)
  62366382000, #  local_start 1977-04-24 03:00:00 (Sun)
  62382708000, #    local_end 1977-10-30 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62382722400, #    utc_start 1977-10-30 06:00:00 (Sun)
  62398450800, #      utc_end 1978-04-30 07:00:00 (Sun)
  62382704400, #  local_start 1977-10-30 01:00:00 (Sun)
  62398432800, #    local_end 1978-04-30 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62398450800, #    utc_start 1978-04-30 07:00:00 (Sun)
  62414172000, #      utc_end 1978-10-29 06:00:00 (Sun)
  62398436400, #  local_start 1978-04-30 03:00:00 (Sun)
  62414157600, #    local_end 1978-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62414172000, #    utc_start 1978-10-29 06:00:00 (Sun)
  62429900400, #      utc_end 1979-04-29 07:00:00 (Sun)
  62414154000, #  local_start 1978-10-29 01:00:00 (Sun)
  62429882400, #    local_end 1979-04-29 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62429900400, #    utc_start 1979-04-29 07:00:00 (Sun)
  62445621600, #      utc_end 1979-10-28 06:00:00 (Sun)
  62429886000, #  local_start 1979-04-29 03:00:00 (Sun)
  62445607200, #    local_end 1979-10-28 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62445621600, #    utc_start 1979-10-28 06:00:00 (Sun)
  62461350000, #      utc_end 1980-04-27 07:00:00 (Sun)
  62445603600, #  local_start 1979-10-28 01:00:00 (Sun)
  62461332000, #    local_end 1980-04-27 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62461350000, #    utc_start 1980-04-27 07:00:00 (Sun)
  62477071200, #      utc_end 1980-10-26 06:00:00 (Sun)
  62461335600, #  local_start 1980-04-27 03:00:00 (Sun)
  62477056800, #    local_end 1980-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62477071200, #    utc_start 1980-10-26 06:00:00 (Sun)
  62492799600, #      utc_end 1981-04-26 07:00:00 (Sun)
  62477053200, #  local_start 1980-10-26 01:00:00 (Sun)
  62492781600, #    local_end 1981-04-26 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62492799600, #    utc_start 1981-04-26 07:00:00 (Sun)
  62508520800, #      utc_end 1981-10-25 06:00:00 (Sun)
  62492785200, #  local_start 1981-04-26 03:00:00 (Sun)
  62508506400, #    local_end 1981-10-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62508520800, #    utc_start 1981-10-25 06:00:00 (Sun)
  62524249200, #      utc_end 1982-04-25 07:00:00 (Sun)
  62508502800, #  local_start 1981-10-25 01:00:00 (Sun)
  62524231200, #    local_end 1982-04-25 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62524249200, #    utc_start 1982-04-25 07:00:00 (Sun)
  62540575200, #      utc_end 1982-10-31 06:00:00 (Sun)
  62524234800, #  local_start 1982-04-25 03:00:00 (Sun)
  62540560800, #    local_end 1982-10-31 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62540575200, #    utc_start 1982-10-31 06:00:00 (Sun)
  62555698800, #      utc_end 1983-04-24 07:00:00 (Sun)
  62540557200, #  local_start 1982-10-31 01:00:00 (Sun)
  62555680800, #    local_end 1983-04-24 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62555698800, #    utc_start 1983-04-24 07:00:00 (Sun)
  62572024800, #      utc_end 1983-10-30 06:00:00 (Sun)
  62555684400, #  local_start 1983-04-24 03:00:00 (Sun)
  62572010400, #    local_end 1983-10-30 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62572024800, #    utc_start 1983-10-30 06:00:00 (Sun)
  62587753200, #      utc_end 1984-04-29 07:00:00 (Sun)
  62572006800, #  local_start 1983-10-30 01:00:00 (Sun)
  62587735200, #    local_end 1984-04-29 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62587753200, #    utc_start 1984-04-29 07:00:00 (Sun)
  62603474400, #      utc_end 1984-10-28 06:00:00 (Sun)
  62587738800, #  local_start 1984-04-29 03:00:00 (Sun)
  62603460000, #    local_end 1984-10-28 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62603474400, #    utc_start 1984-10-28 06:00:00 (Sun)
  62619202800, #      utc_end 1985-04-28 07:00:00 (Sun)
  62603456400, #  local_start 1984-10-28 01:00:00 (Sun)
  62619184800, #    local_end 1985-04-28 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62619202800, #    utc_start 1985-04-28 07:00:00 (Sun)
  62634924000, #      utc_end 1985-10-27 06:00:00 (Sun)
  62619188400, #  local_start 1985-04-28 03:00:00 (Sun)
  62634909600, #    local_end 1985-10-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62634924000, #    utc_start 1985-10-27 06:00:00 (Sun)
  62650652400, #      utc_end 1986-04-27 07:00:00 (Sun)
  62634906000, #  local_start 1985-10-27 01:00:00 (Sun)
  62650634400, #    local_end 1986-04-27 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62650652400, #    utc_start 1986-04-27 07:00:00 (Sun)
  62666373600, #      utc_end 1986-10-26 06:00:00 (Sun)
  62650638000, #  local_start 1986-04-27 03:00:00 (Sun)
  62666359200, #    local_end 1986-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62666373600, #    utc_start 1986-10-26 06:00:00 (Sun)
  62680287600, #      utc_end 1987-04-05 07:00:00 (Sun)
  62666355600, #  local_start 1986-10-26 01:00:00 (Sun)
  62680269600, #    local_end 1987-04-05 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62680287600, #    utc_start 1987-04-05 07:00:00 (Sun)
  62697823200, #      utc_end 1987-10-25 06:00:00 (Sun)
  62680273200, #  local_start 1987-04-05 03:00:00 (Sun)
  62697808800, #    local_end 1987-10-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62697823200, #    utc_start 1987-10-25 06:00:00 (Sun)
  62711737200, #      utc_end 1988-04-03 07:00:00 (Sun)
  62697805200, #  local_start 1987-10-25 01:00:00 (Sun)
  62711719200, #    local_end 1988-04-03 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62711737200, #    utc_start 1988-04-03 07:00:00 (Sun)
  62729877600, #      utc_end 1988-10-30 06:00:00 (Sun)
  62711722800, #  local_start 1988-04-03 03:00:00 (Sun)
  62729863200, #    local_end 1988-10-30 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62729877600, #    utc_start 1988-10-30 06:00:00 (Sun)
  62743186800, #      utc_end 1989-04-02 07:00:00 (Sun)
  62729859600, #  local_start 1988-10-30 01:00:00 (Sun)
  62743168800, #    local_end 1989-04-02 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62743186800, #    utc_start 1989-04-02 07:00:00 (Sun)
  62761327200, #      utc_end 1989-10-29 06:00:00 (Sun)
  62743172400, #  local_start 1989-04-02 03:00:00 (Sun)
  62761312800, #    local_end 1989-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62761327200, #    utc_start 1989-10-29 06:00:00 (Sun)
  62774636400, #      utc_end 1990-04-01 07:00:00 (Sun)
  62761309200, #  local_start 1989-10-29 01:00:00 (Sun)
  62774618400, #    local_end 1990-04-01 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62774636400, #    utc_start 1990-04-01 07:00:00 (Sun)
  62792776800, #      utc_end 1990-10-28 06:00:00 (Sun)
  62774622000, #  local_start 1990-04-01 03:00:00 (Sun)
  62792762400, #    local_end 1990-10-28 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62792776800, #    utc_start 1990-10-28 06:00:00 (Sun)
  62806690800, #      utc_end 1991-04-07 07:00:00 (Sun)
  62792758800, #  local_start 1990-10-28 01:00:00 (Sun)
  62806672800, #    local_end 1991-04-07 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62806690800, #    utc_start 1991-04-07 07:00:00 (Sun)
  62824226400, #      utc_end 1991-10-27 06:00:00 (Sun)
  62806676400, #  local_start 1991-04-07 03:00:00 (Sun)
  62824212000, #    local_end 1991-10-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62824226400, #    utc_start 1991-10-27 06:00:00 (Sun)
  62838140400, #      utc_end 1992-04-05 07:00:00 (Sun)
  62824208400, #  local_start 1991-10-27 01:00:00 (Sun)
  62838122400, #    local_end 1992-04-05 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62838140400, #    utc_start 1992-04-05 07:00:00 (Sun)
  62855676000, #      utc_end 1992-10-25 06:00:00 (Sun)
  62838126000, #  local_start 1992-04-05 03:00:00 (Sun)
  62855661600, #    local_end 1992-10-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62855676000, #    utc_start 1992-10-25 06:00:00 (Sun)
  62869590000, #      utc_end 1993-04-04 07:00:00 (Sun)
  62855658000, #  local_start 1992-10-25 01:00:00 (Sun)
  62869572000, #    local_end 1993-04-04 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62869590000, #    utc_start 1993-04-04 07:00:00 (Sun)
  62887730400, #      utc_end 1993-10-31 06:00:00 (Sun)
  62869575600, #  local_start 1993-04-04 03:00:00 (Sun)
  62887716000, #    local_end 1993-10-31 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62887730400, #    utc_start 1993-10-31 06:00:00 (Sun)
  62901039600, #      utc_end 1994-04-03 07:00:00 (Sun)
  62887712400, #  local_start 1993-10-31 01:00:00 (Sun)
  62901021600, #    local_end 1994-04-03 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62901039600, #    utc_start 1994-04-03 07:00:00 (Sun)
  62919180000, #      utc_end 1994-10-30 06:00:00 (Sun)
  62901025200, #  local_start 1994-04-03 03:00:00 (Sun)
  62919165600, #    local_end 1994-10-30 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62919180000, #    utc_start 1994-10-30 06:00:00 (Sun)
  62932489200, #      utc_end 1995-04-02 07:00:00 (Sun)
  62919162000, #  local_start 1994-10-30 01:00:00 (Sun)
  62932471200, #    local_end 1995-04-02 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62932489200, #    utc_start 1995-04-02 07:00:00 (Sun)
  62950629600, #      utc_end 1995-10-29 06:00:00 (Sun)
  62932474800, #  local_start 1995-04-02 03:00:00 (Sun)
  62950615200, #    local_end 1995-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62950629600, #    utc_start 1995-10-29 06:00:00 (Sun)
  62964543600, #      utc_end 1996-04-07 07:00:00 (Sun)
  62950611600, #  local_start 1995-10-29 01:00:00 (Sun)
  62964525600, #    local_end 1996-04-07 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62964543600, #    utc_start 1996-04-07 07:00:00 (Sun)
  62982079200, #      utc_end 1996-10-27 06:00:00 (Sun)
  62964529200, #  local_start 1996-04-07 03:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62982079200, #    utc_start 1996-10-27 06:00:00 (Sun)
  62995993200, #      utc_end 1997-04-06 07:00:00 (Sun)
  62982061200, #  local_start 1996-10-27 01:00:00 (Sun)
  62995975200, #    local_end 1997-04-06 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62995993200, #    utc_start 1997-04-06 07:00:00 (Sun)
  63013528800, #      utc_end 1997-10-26 06:00:00 (Sun)
  62995978800, #  local_start 1997-04-06 03:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63013528800, #    utc_start 1997-10-26 06:00:00 (Sun)
  63027442800, #      utc_end 1998-04-05 07:00:00 (Sun)
  63013510800, #  local_start 1997-10-26 01:00:00 (Sun)
  63027424800, #    local_end 1998-04-05 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63027442800, #    utc_start 1998-04-05 07:00:00 (Sun)
  63044978400, #      utc_end 1998-10-25 06:00:00 (Sun)
  63027428400, #  local_start 1998-04-05 03:00:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63044978400, #    utc_start 1998-10-25 06:00:00 (Sun)
  63058892400, #      utc_end 1999-04-04 07:00:00 (Sun)
  63044960400, #  local_start 1998-10-25 01:00:00 (Sun)
  63058874400, #    local_end 1999-04-04 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63058892400, #    utc_start 1999-04-04 07:00:00 (Sun)
  63077032800, #      utc_end 1999-10-31 06:00:00 (Sun)
  63058878000, #  local_start 1999-04-04 03:00:00 (Sun)
  63077018400, #    local_end 1999-10-31 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63077032800, #    utc_start 1999-10-31 06:00:00 (Sun)
  63090342000, #      utc_end 2000-04-02 07:00:00 (Sun)
  63077014800, #  local_start 1999-10-31 01:00:00 (Sun)
  63090324000, #    local_end 2000-04-02 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63090342000, #    utc_start 2000-04-02 07:00:00 (Sun)
  63108482400, #      utc_end 2000-10-29 06:00:00 (Sun)
  63090327600, #  local_start 2000-04-02 03:00:00 (Sun)
  63108468000, #    local_end 2000-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63108482400, #    utc_start 2000-10-29 06:00:00 (Sun)
  63121791600, #      utc_end 2001-04-01 07:00:00 (Sun)
  63108464400, #  local_start 2000-10-29 01:00:00 (Sun)
  63121773600, #    local_end 2001-04-01 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63121791600, #    utc_start 2001-04-01 07:00:00 (Sun)
  63139932000, #      utc_end 2001-10-28 06:00:00 (Sun)
  63121777200, #  local_start 2001-04-01 03:00:00 (Sun)
  63139917600, #    local_end 2001-10-28 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63139932000, #    utc_start 2001-10-28 06:00:00 (Sun)
  63153846000, #      utc_end 2002-04-07 07:00:00 (Sun)
  63139914000, #  local_start 2001-10-28 01:00:00 (Sun)
  63153828000, #    local_end 2002-04-07 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63153846000, #    utc_start 2002-04-07 07:00:00 (Sun)
  63171381600, #      utc_end 2002-10-27 06:00:00 (Sun)
  63153831600, #  local_start 2002-04-07 03:00:00 (Sun)
  63171367200, #    local_end 2002-10-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63171381600, #    utc_start 2002-10-27 06:00:00 (Sun)
  63185295600, #      utc_end 2003-04-06 07:00:00 (Sun)
  63171363600, #  local_start 2002-10-27 01:00:00 (Sun)
  63185277600, #    local_end 2003-04-06 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63185295600, #    utc_start 2003-04-06 07:00:00 (Sun)
  63202831200, #      utc_end 2003-10-26 06:00:00 (Sun)
  63185281200, #  local_start 2003-04-06 03:00:00 (Sun)
  63202816800, #    local_end 2003-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63202831200, #    utc_start 2003-10-26 06:00:00 (Sun)
  63216745200, #      utc_end 2004-04-04 07:00:00 (Sun)
  63202813200, #  local_start 2003-10-26 01:00:00 (Sun)
  63216727200, #    local_end 2004-04-04 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63216745200, #    utc_start 2004-04-04 07:00:00 (Sun)
  63234885600, #      utc_end 2004-10-31 06:00:00 (Sun)
  63216730800, #  local_start 2004-04-04 03:00:00 (Sun)
  63234871200, #    local_end 2004-10-31 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63234885600, #    utc_start 2004-10-31 06:00:00 (Sun)
  63248194800, #      utc_end 2005-04-03 07:00:00 (Sun)
  63234867600, #  local_start 2004-10-31 01:00:00 (Sun)
  63248176800, #    local_end 2005-04-03 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63248194800, #    utc_start 2005-04-03 07:00:00 (Sun)
  63266335200, #      utc_end 2005-10-30 06:00:00 (Sun)
  63248180400, #  local_start 2005-04-03 03:00:00 (Sun)
  63266320800, #    local_end 2005-10-30 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63266335200, #    utc_start 2005-10-30 06:00:00 (Sun)
  63279644400, #      utc_end 2006-04-02 07:00:00 (Sun)
  63266317200, #  local_start 2005-10-30 01:00:00 (Sun)
  63279626400, #    local_end 2006-04-02 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63279644400, #    utc_start 2006-04-02 07:00:00 (Sun)
  63297784800, #      utc_end 2006-10-29 06:00:00 (Sun)
  63279630000, #  local_start 2006-04-02 03:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63297784800, #    utc_start 2006-10-29 06:00:00 (Sun)
  63309279600, #      utc_end 2007-03-11 07:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63309261600, #    local_end 2007-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63309279600, #    utc_start 2007-03-11 07:00:00 (Sun)
  63329839200, #      utc_end 2007-11-04 06:00:00 (Sun)
  63309265200, #  local_start 2007-03-11 03:00:00 (Sun)
  63329824800, #    local_end 2007-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63329839200, #    utc_start 2007-11-04 06:00:00 (Sun)
  63340729200, #      utc_end 2008-03-09 07:00:00 (Sun)
  63329821200, #  local_start 2007-11-04 01:00:00 (Sun)
  63340711200, #    local_end 2008-03-09 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63340729200, #    utc_start 2008-03-09 07:00:00 (Sun)
  63361288800, #      utc_end 2008-11-02 06:00:00 (Sun)
  63340714800, #  local_start 2008-03-09 03:00:00 (Sun)
  63361274400, #    local_end 2008-11-02 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63361288800, #    utc_start 2008-11-02 06:00:00 (Sun)
  63372178800, #      utc_end 2009-03-08 07:00:00 (Sun)
  63361270800, #  local_start 2008-11-02 01:00:00 (Sun)
  63372160800, #    local_end 2009-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63372178800, #    utc_start 2009-03-08 07:00:00 (Sun)
  63392738400, #      utc_end 2009-11-01 06:00:00 (Sun)
  63372164400, #  local_start 2009-03-08 03:00:00 (Sun)
  63392724000, #    local_end 2009-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63392738400, #    utc_start 2009-11-01 06:00:00 (Sun)
  63404233200, #      utc_end 2010-03-14 07:00:00 (Sun)
  63392720400, #  local_start 2009-11-01 01:00:00 (Sun)
  63404215200, #    local_end 2010-03-14 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63404233200, #    utc_start 2010-03-14 07:00:00 (Sun)
  63424792800, #      utc_end 2010-11-07 06:00:00 (Sun)
  63404218800, #  local_start 2010-03-14 03:00:00 (Sun)
  63424778400, #    local_end 2010-11-07 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63424792800, #    utc_start 2010-11-07 06:00:00 (Sun)
  63435682800, #      utc_end 2011-03-13 07:00:00 (Sun)
  63424774800, #  local_start 2010-11-07 01:00:00 (Sun)
  63435664800, #    local_end 2011-03-13 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63435682800, #    utc_start 2011-03-13 07:00:00 (Sun)
  63456242400, #      utc_end 2011-11-06 06:00:00 (Sun)
  63435668400, #  local_start 2011-03-13 03:00:00 (Sun)
  63456228000, #    local_end 2011-11-06 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63456242400, #    utc_start 2011-11-06 06:00:00 (Sun)
  63467132400, #      utc_end 2012-03-11 07:00:00 (Sun)
  63456224400, #  local_start 2011-11-06 01:00:00 (Sun)
  63467114400, #    local_end 2012-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63467132400, #    utc_start 2012-03-11 07:00:00 (Sun)
  63487692000, #      utc_end 2012-11-04 06:00:00 (Sun)
  63467118000, #  local_start 2012-03-11 03:00:00 (Sun)
  63487677600, #    local_end 2012-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63487692000, #    utc_start 2012-11-04 06:00:00 (Sun)
  63498582000, #      utc_end 2013-03-10 07:00:00 (Sun)
  63487674000, #  local_start 2012-11-04 01:00:00 (Sun)
  63498564000, #    local_end 2013-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63498582000, #    utc_start 2013-03-10 07:00:00 (Sun)
  63519141600, #      utc_end 2013-11-03 06:00:00 (Sun)
  63498567600, #  local_start 2013-03-10 03:00:00 (Sun)
  63519127200, #    local_end 2013-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63519141600, #    utc_start 2013-11-03 06:00:00 (Sun)
  63530031600, #      utc_end 2014-03-09 07:00:00 (Sun)
  63519123600, #  local_start 2013-11-03 01:00:00 (Sun)
  63530013600, #    local_end 2014-03-09 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63530031600, #    utc_start 2014-03-09 07:00:00 (Sun)
  63550591200, #      utc_end 2014-11-02 06:00:00 (Sun)
  63530017200, #  local_start 2014-03-09 03:00:00 (Sun)
  63550576800, #    local_end 2014-11-02 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63550591200, #    utc_start 2014-11-02 06:00:00 (Sun)
  63561481200, #      utc_end 2015-03-08 07:00:00 (Sun)
  63550573200, #  local_start 2014-11-02 01:00:00 (Sun)
  63561463200, #    local_end 2015-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63561481200, #    utc_start 2015-03-08 07:00:00 (Sun)
  63582040800, #      utc_end 2015-11-01 06:00:00 (Sun)
  63561466800, #  local_start 2015-03-08 03:00:00 (Sun)
  63582026400, #    local_end 2015-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63582040800, #    utc_start 2015-11-01 06:00:00 (Sun)
  63593535600, #      utc_end 2016-03-13 07:00:00 (Sun)
  63582022800, #  local_start 2015-11-01 01:00:00 (Sun)
  63593517600, #    local_end 2016-03-13 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63593535600, #    utc_start 2016-03-13 07:00:00 (Sun)
  63614095200, #      utc_end 2016-11-06 06:00:00 (Sun)
  63593521200, #  local_start 2016-03-13 03:00:00 (Sun)
  63614080800, #    local_end 2016-11-06 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63614095200, #    utc_start 2016-11-06 06:00:00 (Sun)
  63624985200, #      utc_end 2017-03-12 07:00:00 (Sun)
  63614077200, #  local_start 2016-11-06 01:00:00 (Sun)
  63624967200, #    local_end 2017-03-12 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63624985200, #    utc_start 2017-03-12 07:00:00 (Sun)
  63645544800, #      utc_end 2017-11-05 06:00:00 (Sun)
  63624970800, #  local_start 2017-03-12 03:00:00 (Sun)
  63645530400, #    local_end 2017-11-05 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63645544800, #    utc_start 2017-11-05 06:00:00 (Sun)
  63656434800, #      utc_end 2018-03-11 07:00:00 (Sun)
  63645526800, #  local_start 2017-11-05 01:00:00 (Sun)
  63656416800, #    local_end 2018-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63656434800, #    utc_start 2018-03-11 07:00:00 (Sun)
  63676994400, #      utc_end 2018-11-04 06:00:00 (Sun)
  63656420400, #  local_start 2018-03-11 03:00:00 (Sun)
  63676980000, #    local_end 2018-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63676994400, #    utc_start 2018-11-04 06:00:00 (Sun)
  63687884400, #      utc_end 2019-03-10 07:00:00 (Sun)
  63676976400, #  local_start 2018-11-04 01:00:00 (Sun)
  63687866400, #    local_end 2019-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63687884400, #    utc_start 2019-03-10 07:00:00 (Sun)
  63708444000, #      utc_end 2019-11-03 06:00:00 (Sun)
  63687870000, #  local_start 2019-03-10 03:00:00 (Sun)
  63708429600, #    local_end 2019-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63708444000, #    utc_start 2019-11-03 06:00:00 (Sun)
  63719334000, #      utc_end 2020-03-08 07:00:00 (Sun)
  63708426000, #  local_start 2019-11-03 01:00:00 (Sun)
  63719316000, #    local_end 2020-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63719334000, #    utc_start 2020-03-08 07:00:00 (Sun)
  63739893600, #      utc_end 2020-11-01 06:00:00 (Sun)
  63719319600, #  local_start 2020-03-08 03:00:00 (Sun)
  63739879200, #    local_end 2020-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63739893600, #    utc_start 2020-11-01 06:00:00 (Sun)
  63751388400, #      utc_end 2021-03-14 07:00:00 (Sun)
  63739875600, #  local_start 2020-11-01 01:00:00 (Sun)
  63751370400, #    local_end 2021-03-14 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63751388400, #    utc_start 2021-03-14 07:00:00 (Sun)
  63771948000, #      utc_end 2021-11-07 06:00:00 (Sun)
  63751374000, #  local_start 2021-03-14 03:00:00 (Sun)
  63771933600, #    local_end 2021-11-07 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63771948000, #    utc_start 2021-11-07 06:00:00 (Sun)
  63782838000, #      utc_end 2022-03-13 07:00:00 (Sun)
  63771930000, #  local_start 2021-11-07 01:00:00 (Sun)
  63782820000, #    local_end 2022-03-13 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63782838000, #    utc_start 2022-03-13 07:00:00 (Sun)
  63803397600, #      utc_end 2022-11-06 06:00:00 (Sun)
  63782823600, #  local_start 2022-03-13 03:00:00 (Sun)
  63803383200, #    local_end 2022-11-06 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63803397600, #    utc_start 2022-11-06 06:00:00 (Sun)
  63814287600, #      utc_end 2023-03-12 07:00:00 (Sun)
  63803379600, #  local_start 2022-11-06 01:00:00 (Sun)
  63814269600, #    local_end 2023-03-12 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63814287600, #    utc_start 2023-03-12 07:00:00 (Sun)
  63834847200, #      utc_end 2023-11-05 06:00:00 (Sun)
  63814273200, #  local_start 2023-03-12 03:00:00 (Sun)
  63834832800, #    local_end 2023-11-05 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63834847200, #    utc_start 2023-11-05 06:00:00 (Sun)
  63845737200, #      utc_end 2024-03-10 07:00:00 (Sun)
  63834829200, #  local_start 2023-11-05 01:00:00 (Sun)
  63845719200, #    local_end 2024-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63845737200, #    utc_start 2024-03-10 07:00:00 (Sun)
  63866296800, #      utc_end 2024-11-03 06:00:00 (Sun)
  63845722800, #  local_start 2024-03-10 03:00:00 (Sun)
  63866282400, #    local_end 2024-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63866296800, #    utc_start 2024-11-03 06:00:00 (Sun)
  63877186800, #      utc_end 2025-03-09 07:00:00 (Sun)
  63866278800, #  local_start 2024-11-03 01:00:00 (Sun)
  63877168800, #    local_end 2025-03-09 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63877186800, #    utc_start 2025-03-09 07:00:00 (Sun)
  63897746400, #      utc_end 2025-11-02 06:00:00 (Sun)
  63877172400, #  local_start 2025-03-09 03:00:00 (Sun)
  63897732000, #    local_end 2025-11-02 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63897746400, #    utc_start 2025-11-02 06:00:00 (Sun)
  63908636400, #      utc_end 2026-03-08 07:00:00 (Sun)
  63897728400, #  local_start 2025-11-02 01:00:00 (Sun)
  63908618400, #    local_end 2026-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63908636400, #    utc_start 2026-03-08 07:00:00 (Sun)
  63929196000, #      utc_end 2026-11-01 06:00:00 (Sun)
  63908622000, #  local_start 2026-03-08 03:00:00 (Sun)
  63929181600, #    local_end 2026-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63929196000, #    utc_start 2026-11-01 06:00:00 (Sun)
  63940690800, #      utc_end 2027-03-14 07:00:00 (Sun)
  63929178000, #  local_start 2026-11-01 01:00:00 (Sun)
  63940672800, #    local_end 2027-03-14 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63940690800, #    utc_start 2027-03-14 07:00:00 (Sun)
  63961250400, #      utc_end 2027-11-07 06:00:00 (Sun)
  63940676400, #  local_start 2027-03-14 03:00:00 (Sun)
  63961236000, #    local_end 2027-11-07 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63961250400, #    utc_start 2027-11-07 06:00:00 (Sun)
  63972140400, #      utc_end 2028-03-12 07:00:00 (Sun)
  63961232400, #  local_start 2027-11-07 01:00:00 (Sun)
  63972122400, #    local_end 2028-03-12 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63972140400, #    utc_start 2028-03-12 07:00:00 (Sun)
  63992700000, #      utc_end 2028-11-05 06:00:00 (Sun)
  63972126000, #  local_start 2028-03-12 03:00:00 (Sun)
  63992685600, #    local_end 2028-11-05 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63992700000, #    utc_start 2028-11-05 06:00:00 (Sun)
  64003590000, #      utc_end 2029-03-11 07:00:00 (Sun)
  63992682000, #  local_start 2028-11-05 01:00:00 (Sun)
  64003572000, #    local_end 2029-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  64003590000, #    utc_start 2029-03-11 07:00:00 (Sun)
  64024149600, #      utc_end 2029-11-04 06:00:00 (Sun)
  64003575600, #  local_start 2029-03-11 03:00:00 (Sun)
  64024135200, #    local_end 2029-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  64024149600, #    utc_start 2029-11-04 06:00:00 (Sun)
  64035039600, #      utc_end 2030-03-10 07:00:00 (Sun)
  64024131600, #  local_start 2029-11-04 01:00:00 (Sun)
  64035021600, #    local_end 2030-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  64035039600, #    utc_start 2030-03-10 07:00:00 (Sun)
  64055599200, #      utc_end 2030-11-03 06:00:00 (Sun)
  64035025200, #  local_start 2030-03-10 03:00:00 (Sun)
  64055584800, #    local_end 2030-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {110}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -18000 }
  
  my $last_observance = bless( {
    'format' => 'E%sT',
    'gmtoff' => '-5:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 720624,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 720624,
      'utc_rd_secs' => 0,
      'utc_year' => 1975
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -18000,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 720624,
      'local_rd_secs' => 18000,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 720624,
      'utc_rd_secs' => 18000,
      'utc_year' => 1975
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Nov',
      'letter' => 'S',
      'name' => 'Canada',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Mar',
      'letter' => 'D',
      'name' => 'Canada',
      'offset_from_std' => 3600,
      'on' => 'Sun>=8',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_TORONTO

    $main::fatpacked{"DateTime/TimeZone/America/Vancouver.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_VANCOUVER';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Vancouver;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Vancouver::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59421802348, #      utc_end 1884-01-01 08:12:28 (Tue)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59421772800, #    local_end 1884-01-01 00:00:00 (Tue)
  -29548,
  0,
  'LMT',
      ],
      [
  59421802348, #    utc_start 1884-01-01 08:12:28 (Tue)
  60503623200, #      utc_end 1918-04-14 10:00:00 (Sun)
  59421773548, #  local_start 1884-01-01 00:12:28 (Tue)
  60503594400, #    local_end 1918-04-14 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  60503623200, #    utc_start 1918-04-14 10:00:00 (Sun)
  60520554000, #      utc_end 1918-10-27 09:00:00 (Sun)
  60503598000, #  local_start 1918-04-14 03:00:00 (Sun)
  60520528800, #    local_end 1918-10-27 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  60520554000, #    utc_start 1918-10-27 09:00:00 (Sun)
  61255476000, #      utc_end 1942-02-09 10:00:00 (Mon)
  60520525200, #  local_start 1918-10-27 01:00:00 (Sun)
  61255447200, #    local_end 1942-02-09 02:00:00 (Mon)
  -28800,
  0,
  'PST',
      ],
      [
  61255476000, #    utc_start 1942-02-09 10:00:00 (Mon)
  61366287600, #      utc_end 1945-08-14 23:00:00 (Tue)
  61255450800, #  local_start 1942-02-09 03:00:00 (Mon)
  61366262400, #    local_end 1945-08-14 16:00:00 (Tue)
  -25200,
  1,
  'PWT',
      ],
      [
  61366287600, #    utc_start 1945-08-14 23:00:00 (Tue)
  61370298000, #      utc_end 1945-09-30 09:00:00 (Sun)
  61366262400, #  local_start 1945-08-14 16:00:00 (Tue)
  61370272800, #    local_end 1945-09-30 02:00:00 (Sun)
  -25200,
  1,
  'PPT',
      ],
      [
  61370298000, #    utc_start 1945-09-30 09:00:00 (Sun)
  61388445600, #      utc_end 1946-04-28 10:00:00 (Sun)
  61370269200, #  local_start 1945-09-30 01:00:00 (Sun)
  61388416800, #    local_end 1946-04-28 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61388445600, #    utc_start 1946-04-28 10:00:00 (Sun)
  61402957200, #      utc_end 1946-10-13 09:00:00 (Sun)
  61388420400, #  local_start 1946-04-28 03:00:00 (Sun)
  61402932000, #    local_end 1946-10-13 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61402957200, #    utc_start 1946-10-13 09:00:00 (Sun)
  61419895200, #      utc_end 1947-04-27 10:00:00 (Sun)
  61402928400, #  local_start 1946-10-13 01:00:00 (Sun)
  61419866400, #    local_end 1947-04-27 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61419895200, #    utc_start 1947-04-27 10:00:00 (Sun)
  61433197200, #      utc_end 1947-09-28 09:00:00 (Sun)
  61419870000, #  local_start 1947-04-27 03:00:00 (Sun)
  61433172000, #    local_end 1947-09-28 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61433197200, #    utc_start 1947-09-28 09:00:00 (Sun)
  61451344800, #      utc_end 1948-04-25 10:00:00 (Sun)
  61433168400, #  local_start 1947-09-28 01:00:00 (Sun)
  61451316000, #    local_end 1948-04-25 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61451344800, #    utc_start 1948-04-25 10:00:00 (Sun)
  61464646800, #      utc_end 1948-09-26 09:00:00 (Sun)
  61451319600, #  local_start 1948-04-25 03:00:00 (Sun)
  61464621600, #    local_end 1948-09-26 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61464646800, #    utc_start 1948-09-26 09:00:00 (Sun)
  61482794400, #      utc_end 1949-04-24 10:00:00 (Sun)
  61464618000, #  local_start 1948-09-26 01:00:00 (Sun)
  61482765600, #    local_end 1949-04-24 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61482794400, #    utc_start 1949-04-24 10:00:00 (Sun)
  61496096400, #      utc_end 1949-09-25 09:00:00 (Sun)
  61482769200, #  local_start 1949-04-24 03:00:00 (Sun)
  61496071200, #    local_end 1949-09-25 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61496096400, #    utc_start 1949-09-25 09:00:00 (Sun)
  61514848800, #      utc_end 1950-04-30 10:00:00 (Sun)
  61496067600, #  local_start 1949-09-25 01:00:00 (Sun)
  61514820000, #    local_end 1950-04-30 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61514848800, #    utc_start 1950-04-30 10:00:00 (Sun)
  61527546000, #      utc_end 1950-09-24 09:00:00 (Sun)
  61514823600, #  local_start 1950-04-30 03:00:00 (Sun)
  61527520800, #    local_end 1950-09-24 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61527546000, #    utc_start 1950-09-24 09:00:00 (Sun)
  61546298400, #      utc_end 1951-04-29 10:00:00 (Sun)
  61527517200, #  local_start 1950-09-24 01:00:00 (Sun)
  61546269600, #    local_end 1951-04-29 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61546298400, #    utc_start 1951-04-29 10:00:00 (Sun)
  61559600400, #      utc_end 1951-09-30 09:00:00 (Sun)
  61546273200, #  local_start 1951-04-29 03:00:00 (Sun)
  61559575200, #    local_end 1951-09-30 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61559600400, #    utc_start 1951-09-30 09:00:00 (Sun)
  61577748000, #      utc_end 1952-04-27 10:00:00 (Sun)
  61559571600, #  local_start 1951-09-30 01:00:00 (Sun)
  61577719200, #    local_end 1952-04-27 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61577748000, #    utc_start 1952-04-27 10:00:00 (Sun)
  61591050000, #      utc_end 1952-09-28 09:00:00 (Sun)
  61577722800, #  local_start 1952-04-27 03:00:00 (Sun)
  61591024800, #    local_end 1952-09-28 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61591050000, #    utc_start 1952-09-28 09:00:00 (Sun)
  61609197600, #      utc_end 1953-04-26 10:00:00 (Sun)
  61591021200, #  local_start 1952-09-28 01:00:00 (Sun)
  61609168800, #    local_end 1953-04-26 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61609197600, #    utc_start 1953-04-26 10:00:00 (Sun)
  61622499600, #      utc_end 1953-09-27 09:00:00 (Sun)
  61609172400, #  local_start 1953-04-26 03:00:00 (Sun)
  61622474400, #    local_end 1953-09-27 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61622499600, #    utc_start 1953-09-27 09:00:00 (Sun)
  61640647200, #      utc_end 1954-04-25 10:00:00 (Sun)
  61622470800, #  local_start 1953-09-27 01:00:00 (Sun)
  61640618400, #    local_end 1954-04-25 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61640647200, #    utc_start 1954-04-25 10:00:00 (Sun)
  61653949200, #      utc_end 1954-09-26 09:00:00 (Sun)
  61640622000, #  local_start 1954-04-25 03:00:00 (Sun)
  61653924000, #    local_end 1954-09-26 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61653949200, #    utc_start 1954-09-26 09:00:00 (Sun)
  61672096800, #      utc_end 1955-04-24 10:00:00 (Sun)
  61653920400, #  local_start 1954-09-26 01:00:00 (Sun)
  61672068000, #    local_end 1955-04-24 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61672096800, #    utc_start 1955-04-24 10:00:00 (Sun)
  61685398800, #      utc_end 1955-09-25 09:00:00 (Sun)
  61672071600, #  local_start 1955-04-24 03:00:00 (Sun)
  61685373600, #    local_end 1955-09-25 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61685398800, #    utc_start 1955-09-25 09:00:00 (Sun)
  61704151200, #      utc_end 1956-04-29 10:00:00 (Sun)
  61685370000, #  local_start 1955-09-25 01:00:00 (Sun)
  61704122400, #    local_end 1956-04-29 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61704151200, #    utc_start 1956-04-29 10:00:00 (Sun)
  61717453200, #      utc_end 1956-09-30 09:00:00 (Sun)
  61704126000, #  local_start 1956-04-29 03:00:00 (Sun)
  61717428000, #    local_end 1956-09-30 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61717453200, #    utc_start 1956-09-30 09:00:00 (Sun)
  61735600800, #      utc_end 1957-04-28 10:00:00 (Sun)
  61717424400, #  local_start 1956-09-30 01:00:00 (Sun)
  61735572000, #    local_end 1957-04-28 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61735600800, #    utc_start 1957-04-28 10:00:00 (Sun)
  61748902800, #      utc_end 1957-09-29 09:00:00 (Sun)
  61735575600, #  local_start 1957-04-28 03:00:00 (Sun)
  61748877600, #    local_end 1957-09-29 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61748902800, #    utc_start 1957-09-29 09:00:00 (Sun)
  61767050400, #      utc_end 1958-04-27 10:00:00 (Sun)
  61748874000, #  local_start 1957-09-29 01:00:00 (Sun)
  61767021600, #    local_end 1958-04-27 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61767050400, #    utc_start 1958-04-27 10:00:00 (Sun)
  61780352400, #      utc_end 1958-09-28 09:00:00 (Sun)
  61767025200, #  local_start 1958-04-27 03:00:00 (Sun)
  61780327200, #    local_end 1958-09-28 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61780352400, #    utc_start 1958-09-28 09:00:00 (Sun)
  61798500000, #      utc_end 1959-04-26 10:00:00 (Sun)
  61780323600, #  local_start 1958-09-28 01:00:00 (Sun)
  61798471200, #    local_end 1959-04-26 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61798500000, #    utc_start 1959-04-26 10:00:00 (Sun)
  61811802000, #      utc_end 1959-09-27 09:00:00 (Sun)
  61798474800, #  local_start 1959-04-26 03:00:00 (Sun)
  61811776800, #    local_end 1959-09-27 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61811802000, #    utc_start 1959-09-27 09:00:00 (Sun)
  61829949600, #      utc_end 1960-04-24 10:00:00 (Sun)
  61811773200, #  local_start 1959-09-27 01:00:00 (Sun)
  61829920800, #    local_end 1960-04-24 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61829949600, #    utc_start 1960-04-24 10:00:00 (Sun)
  61843251600, #      utc_end 1960-09-25 09:00:00 (Sun)
  61829924400, #  local_start 1960-04-24 03:00:00 (Sun)
  61843226400, #    local_end 1960-09-25 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61843251600, #    utc_start 1960-09-25 09:00:00 (Sun)
  61862004000, #      utc_end 1961-04-30 10:00:00 (Sun)
  61843222800, #  local_start 1960-09-25 01:00:00 (Sun)
  61861975200, #    local_end 1961-04-30 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61862004000, #    utc_start 1961-04-30 10:00:00 (Sun)
  61874701200, #      utc_end 1961-09-24 09:00:00 (Sun)
  61861978800, #  local_start 1961-04-30 03:00:00 (Sun)
  61874676000, #    local_end 1961-09-24 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61874701200, #    utc_start 1961-09-24 09:00:00 (Sun)
  61893453600, #      utc_end 1962-04-29 10:00:00 (Sun)
  61874672400, #  local_start 1961-09-24 01:00:00 (Sun)
  61893424800, #    local_end 1962-04-29 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61893453600, #    utc_start 1962-04-29 10:00:00 (Sun)
  61909174800, #      utc_end 1962-10-28 09:00:00 (Sun)
  61893428400, #  local_start 1962-04-29 03:00:00 (Sun)
  61909149600, #    local_end 1962-10-28 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61909174800, #    utc_start 1962-10-28 09:00:00 (Sun)
  61924903200, #      utc_end 1963-04-28 10:00:00 (Sun)
  61909146000, #  local_start 1962-10-28 01:00:00 (Sun)
  61924874400, #    local_end 1963-04-28 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61924903200, #    utc_start 1963-04-28 10:00:00 (Sun)
  61940624400, #      utc_end 1963-10-27 09:00:00 (Sun)
  61924878000, #  local_start 1963-04-28 03:00:00 (Sun)
  61940599200, #    local_end 1963-10-27 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61940624400, #    utc_start 1963-10-27 09:00:00 (Sun)
  61956352800, #      utc_end 1964-04-26 10:00:00 (Sun)
  61940595600, #  local_start 1963-10-27 01:00:00 (Sun)
  61956324000, #    local_end 1964-04-26 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61956352800, #    utc_start 1964-04-26 10:00:00 (Sun)
  61972074000, #      utc_end 1964-10-25 09:00:00 (Sun)
  61956327600, #  local_start 1964-04-26 03:00:00 (Sun)
  61972048800, #    local_end 1964-10-25 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  61972074000, #    utc_start 1964-10-25 09:00:00 (Sun)
  61987802400, #      utc_end 1965-04-25 10:00:00 (Sun)
  61972045200, #  local_start 1964-10-25 01:00:00 (Sun)
  61987773600, #    local_end 1965-04-25 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  61987802400, #    utc_start 1965-04-25 10:00:00 (Sun)
  62004128400, #      utc_end 1965-10-31 09:00:00 (Sun)
  61987777200, #  local_start 1965-04-25 03:00:00 (Sun)
  62004103200, #    local_end 1965-10-31 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62004128400, #    utc_start 1965-10-31 09:00:00 (Sun)
  62019252000, #      utc_end 1966-04-24 10:00:00 (Sun)
  62004099600, #  local_start 1965-10-31 01:00:00 (Sun)
  62019223200, #    local_end 1966-04-24 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62019252000, #    utc_start 1966-04-24 10:00:00 (Sun)
  62035578000, #      utc_end 1966-10-30 09:00:00 (Sun)
  62019226800, #  local_start 1966-04-24 03:00:00 (Sun)
  62035552800, #    local_end 1966-10-30 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62035578000, #    utc_start 1966-10-30 09:00:00 (Sun)
  62051306400, #      utc_end 1967-04-30 10:00:00 (Sun)
  62035549200, #  local_start 1966-10-30 01:00:00 (Sun)
  62051277600, #    local_end 1967-04-30 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62051306400, #    utc_start 1967-04-30 10:00:00 (Sun)
  62067027600, #      utc_end 1967-10-29 09:00:00 (Sun)
  62051281200, #  local_start 1967-04-30 03:00:00 (Sun)
  62067002400, #    local_end 1967-10-29 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62067027600, #    utc_start 1967-10-29 09:00:00 (Sun)
  62082756000, #      utc_end 1968-04-28 10:00:00 (Sun)
  62066998800, #  local_start 1967-10-29 01:00:00 (Sun)
  62082727200, #    local_end 1968-04-28 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62082756000, #    utc_start 1968-04-28 10:00:00 (Sun)
  62098477200, #      utc_end 1968-10-27 09:00:00 (Sun)
  62082730800, #  local_start 1968-04-28 03:00:00 (Sun)
  62098452000, #    local_end 1968-10-27 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62098477200, #    utc_start 1968-10-27 09:00:00 (Sun)
  62114205600, #      utc_end 1969-04-27 10:00:00 (Sun)
  62098448400, #  local_start 1968-10-27 01:00:00 (Sun)
  62114176800, #    local_end 1969-04-27 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62114205600, #    utc_start 1969-04-27 10:00:00 (Sun)
  62129926800, #      utc_end 1969-10-26 09:00:00 (Sun)
  62114180400, #  local_start 1969-04-27 03:00:00 (Sun)
  62129901600, #    local_end 1969-10-26 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62129926800, #    utc_start 1969-10-26 09:00:00 (Sun)
  62145655200, #      utc_end 1970-04-26 10:00:00 (Sun)
  62129898000, #  local_start 1969-10-26 01:00:00 (Sun)
  62145626400, #    local_end 1970-04-26 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62145655200, #    utc_start 1970-04-26 10:00:00 (Sun)
  62161376400, #      utc_end 1970-10-25 09:00:00 (Sun)
  62145630000, #  local_start 1970-04-26 03:00:00 (Sun)
  62161351200, #    local_end 1970-10-25 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62161376400, #    utc_start 1970-10-25 09:00:00 (Sun)
  62177104800, #      utc_end 1971-04-25 10:00:00 (Sun)
  62161347600, #  local_start 1970-10-25 01:00:00 (Sun)
  62177076000, #    local_end 1971-04-25 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62177104800, #    utc_start 1971-04-25 10:00:00 (Sun)
  62193430800, #      utc_end 1971-10-31 09:00:00 (Sun)
  62177079600, #  local_start 1971-04-25 03:00:00 (Sun)
  62193405600, #    local_end 1971-10-31 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62193430800, #    utc_start 1971-10-31 09:00:00 (Sun)
  62209159200, #      utc_end 1972-04-30 10:00:00 (Sun)
  62193402000, #  local_start 1971-10-31 01:00:00 (Sun)
  62209130400, #    local_end 1972-04-30 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62209159200, #    utc_start 1972-04-30 10:00:00 (Sun)
  62224880400, #      utc_end 1972-10-29 09:00:00 (Sun)
  62209134000, #  local_start 1972-04-30 03:00:00 (Sun)
  62224855200, #    local_end 1972-10-29 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62224880400, #    utc_start 1972-10-29 09:00:00 (Sun)
  62240608800, #      utc_end 1973-04-29 10:00:00 (Sun)
  62224851600, #  local_start 1972-10-29 01:00:00 (Sun)
  62240580000, #    local_end 1973-04-29 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62240608800, #    utc_start 1973-04-29 10:00:00 (Sun)
  62256330000, #      utc_end 1973-10-28 09:00:00 (Sun)
  62240583600, #  local_start 1973-04-29 03:00:00 (Sun)
  62256304800, #    local_end 1973-10-28 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62256330000, #    utc_start 1973-10-28 09:00:00 (Sun)
  62272058400, #      utc_end 1974-04-28 10:00:00 (Sun)
  62256301200, #  local_start 1973-10-28 01:00:00 (Sun)
  62272029600, #    local_end 1974-04-28 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62272058400, #    utc_start 1974-04-28 10:00:00 (Sun)
  62287779600, #      utc_end 1974-10-27 09:00:00 (Sun)
  62272033200, #  local_start 1974-04-28 03:00:00 (Sun)
  62287754400, #    local_end 1974-10-27 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62287779600, #    utc_start 1974-10-27 09:00:00 (Sun)
  62303508000, #      utc_end 1975-04-27 10:00:00 (Sun)
  62287750800, #  local_start 1974-10-27 01:00:00 (Sun)
  62303479200, #    local_end 1975-04-27 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62303508000, #    utc_start 1975-04-27 10:00:00 (Sun)
  62319229200, #      utc_end 1975-10-26 09:00:00 (Sun)
  62303482800, #  local_start 1975-04-27 03:00:00 (Sun)
  62319204000, #    local_end 1975-10-26 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62319229200, #    utc_start 1975-10-26 09:00:00 (Sun)
  62334957600, #      utc_end 1976-04-25 10:00:00 (Sun)
  62319200400, #  local_start 1975-10-26 01:00:00 (Sun)
  62334928800, #    local_end 1976-04-25 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62334957600, #    utc_start 1976-04-25 10:00:00 (Sun)
  62351283600, #      utc_end 1976-10-31 09:00:00 (Sun)
  62334932400, #  local_start 1976-04-25 03:00:00 (Sun)
  62351258400, #    local_end 1976-10-31 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62351283600, #    utc_start 1976-10-31 09:00:00 (Sun)
  62366407200, #      utc_end 1977-04-24 10:00:00 (Sun)
  62351254800, #  local_start 1976-10-31 01:00:00 (Sun)
  62366378400, #    local_end 1977-04-24 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62366407200, #    utc_start 1977-04-24 10:00:00 (Sun)
  62382733200, #      utc_end 1977-10-30 09:00:00 (Sun)
  62366382000, #  local_start 1977-04-24 03:00:00 (Sun)
  62382708000, #    local_end 1977-10-30 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62382733200, #    utc_start 1977-10-30 09:00:00 (Sun)
  62398461600, #      utc_end 1978-04-30 10:00:00 (Sun)
  62382704400, #  local_start 1977-10-30 01:00:00 (Sun)
  62398432800, #    local_end 1978-04-30 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62398461600, #    utc_start 1978-04-30 10:00:00 (Sun)
  62414182800, #      utc_end 1978-10-29 09:00:00 (Sun)
  62398436400, #  local_start 1978-04-30 03:00:00 (Sun)
  62414157600, #    local_end 1978-10-29 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62414182800, #    utc_start 1978-10-29 09:00:00 (Sun)
  62429911200, #      utc_end 1979-04-29 10:00:00 (Sun)
  62414154000, #  local_start 1978-10-29 01:00:00 (Sun)
  62429882400, #    local_end 1979-04-29 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62429911200, #    utc_start 1979-04-29 10:00:00 (Sun)
  62445632400, #      utc_end 1979-10-28 09:00:00 (Sun)
  62429886000, #  local_start 1979-04-29 03:00:00 (Sun)
  62445607200, #    local_end 1979-10-28 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62445632400, #    utc_start 1979-10-28 09:00:00 (Sun)
  62461360800, #      utc_end 1980-04-27 10:00:00 (Sun)
  62445603600, #  local_start 1979-10-28 01:00:00 (Sun)
  62461332000, #    local_end 1980-04-27 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62461360800, #    utc_start 1980-04-27 10:00:00 (Sun)
  62477082000, #      utc_end 1980-10-26 09:00:00 (Sun)
  62461335600, #  local_start 1980-04-27 03:00:00 (Sun)
  62477056800, #    local_end 1980-10-26 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62477082000, #    utc_start 1980-10-26 09:00:00 (Sun)
  62492810400, #      utc_end 1981-04-26 10:00:00 (Sun)
  62477053200, #  local_start 1980-10-26 01:00:00 (Sun)
  62492781600, #    local_end 1981-04-26 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62492810400, #    utc_start 1981-04-26 10:00:00 (Sun)
  62508531600, #      utc_end 1981-10-25 09:00:00 (Sun)
  62492785200, #  local_start 1981-04-26 03:00:00 (Sun)
  62508506400, #    local_end 1981-10-25 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62508531600, #    utc_start 1981-10-25 09:00:00 (Sun)
  62524260000, #      utc_end 1982-04-25 10:00:00 (Sun)
  62508502800, #  local_start 1981-10-25 01:00:00 (Sun)
  62524231200, #    local_end 1982-04-25 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62524260000, #    utc_start 1982-04-25 10:00:00 (Sun)
  62540586000, #      utc_end 1982-10-31 09:00:00 (Sun)
  62524234800, #  local_start 1982-04-25 03:00:00 (Sun)
  62540560800, #    local_end 1982-10-31 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62540586000, #    utc_start 1982-10-31 09:00:00 (Sun)
  62555709600, #      utc_end 1983-04-24 10:00:00 (Sun)
  62540557200, #  local_start 1982-10-31 01:00:00 (Sun)
  62555680800, #    local_end 1983-04-24 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62555709600, #    utc_start 1983-04-24 10:00:00 (Sun)
  62572035600, #      utc_end 1983-10-30 09:00:00 (Sun)
  62555684400, #  local_start 1983-04-24 03:00:00 (Sun)
  62572010400, #    local_end 1983-10-30 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62572035600, #    utc_start 1983-10-30 09:00:00 (Sun)
  62587764000, #      utc_end 1984-04-29 10:00:00 (Sun)
  62572006800, #  local_start 1983-10-30 01:00:00 (Sun)
  62587735200, #    local_end 1984-04-29 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62587764000, #    utc_start 1984-04-29 10:00:00 (Sun)
  62603485200, #      utc_end 1984-10-28 09:00:00 (Sun)
  62587738800, #  local_start 1984-04-29 03:00:00 (Sun)
  62603460000, #    local_end 1984-10-28 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62603485200, #    utc_start 1984-10-28 09:00:00 (Sun)
  62619213600, #      utc_end 1985-04-28 10:00:00 (Sun)
  62603456400, #  local_start 1984-10-28 01:00:00 (Sun)
  62619184800, #    local_end 1985-04-28 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62619213600, #    utc_start 1985-04-28 10:00:00 (Sun)
  62634934800, #      utc_end 1985-10-27 09:00:00 (Sun)
  62619188400, #  local_start 1985-04-28 03:00:00 (Sun)
  62634909600, #    local_end 1985-10-27 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62634934800, #    utc_start 1985-10-27 09:00:00 (Sun)
  62650663200, #      utc_end 1986-04-27 10:00:00 (Sun)
  62634906000, #  local_start 1985-10-27 01:00:00 (Sun)
  62650634400, #    local_end 1986-04-27 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62650663200, #    utc_start 1986-04-27 10:00:00 (Sun)
  62666384400, #      utc_end 1986-10-26 09:00:00 (Sun)
  62650638000, #  local_start 1986-04-27 03:00:00 (Sun)
  62666359200, #    local_end 1986-10-26 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62666384400, #    utc_start 1986-10-26 09:00:00 (Sun)
  62672169600, #      utc_end 1987-01-01 08:00:00 (Thu)
  62666355600, #  local_start 1986-10-26 01:00:00 (Sun)
  62672140800, #    local_end 1987-01-01 00:00:00 (Thu)
  -28800,
  0,
  'PST',
      ],
      [
  62672169600, #    utc_start 1987-01-01 08:00:00 (Thu)
  62680298400, #      utc_end 1987-04-05 10:00:00 (Sun)
  62672140800, #  local_start 1987-01-01 00:00:00 (Thu)
  62680269600, #    local_end 1987-04-05 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62680298400, #    utc_start 1987-04-05 10:00:00 (Sun)
  62697834000, #      utc_end 1987-10-25 09:00:00 (Sun)
  62680273200, #  local_start 1987-04-05 03:00:00 (Sun)
  62697808800, #    local_end 1987-10-25 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62697834000, #    utc_start 1987-10-25 09:00:00 (Sun)
  62711748000, #      utc_end 1988-04-03 10:00:00 (Sun)
  62697805200, #  local_start 1987-10-25 01:00:00 (Sun)
  62711719200, #    local_end 1988-04-03 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62711748000, #    utc_start 1988-04-03 10:00:00 (Sun)
  62729888400, #      utc_end 1988-10-30 09:00:00 (Sun)
  62711722800, #  local_start 1988-04-03 03:00:00 (Sun)
  62729863200, #    local_end 1988-10-30 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62729888400, #    utc_start 1988-10-30 09:00:00 (Sun)
  62743197600, #      utc_end 1989-04-02 10:00:00 (Sun)
  62729859600, #  local_start 1988-10-30 01:00:00 (Sun)
  62743168800, #    local_end 1989-04-02 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62743197600, #    utc_start 1989-04-02 10:00:00 (Sun)
  62761338000, #      utc_end 1989-10-29 09:00:00 (Sun)
  62743172400, #  local_start 1989-04-02 03:00:00 (Sun)
  62761312800, #    local_end 1989-10-29 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62761338000, #    utc_start 1989-10-29 09:00:00 (Sun)
  62774647200, #      utc_end 1990-04-01 10:00:00 (Sun)
  62761309200, #  local_start 1989-10-29 01:00:00 (Sun)
  62774618400, #    local_end 1990-04-01 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62774647200, #    utc_start 1990-04-01 10:00:00 (Sun)
  62792787600, #      utc_end 1990-10-28 09:00:00 (Sun)
  62774622000, #  local_start 1990-04-01 03:00:00 (Sun)
  62792762400, #    local_end 1990-10-28 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62792787600, #    utc_start 1990-10-28 09:00:00 (Sun)
  62806701600, #      utc_end 1991-04-07 10:00:00 (Sun)
  62792758800, #  local_start 1990-10-28 01:00:00 (Sun)
  62806672800, #    local_end 1991-04-07 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62806701600, #    utc_start 1991-04-07 10:00:00 (Sun)
  62824237200, #      utc_end 1991-10-27 09:00:00 (Sun)
  62806676400, #  local_start 1991-04-07 03:00:00 (Sun)
  62824212000, #    local_end 1991-10-27 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62824237200, #    utc_start 1991-10-27 09:00:00 (Sun)
  62838151200, #      utc_end 1992-04-05 10:00:00 (Sun)
  62824208400, #  local_start 1991-10-27 01:00:00 (Sun)
  62838122400, #    local_end 1992-04-05 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62838151200, #    utc_start 1992-04-05 10:00:00 (Sun)
  62855686800, #      utc_end 1992-10-25 09:00:00 (Sun)
  62838126000, #  local_start 1992-04-05 03:00:00 (Sun)
  62855661600, #    local_end 1992-10-25 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62855686800, #    utc_start 1992-10-25 09:00:00 (Sun)
  62869600800, #      utc_end 1993-04-04 10:00:00 (Sun)
  62855658000, #  local_start 1992-10-25 01:00:00 (Sun)
  62869572000, #    local_end 1993-04-04 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62869600800, #    utc_start 1993-04-04 10:00:00 (Sun)
  62887741200, #      utc_end 1993-10-31 09:00:00 (Sun)
  62869575600, #  local_start 1993-04-04 03:00:00 (Sun)
  62887716000, #    local_end 1993-10-31 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62887741200, #    utc_start 1993-10-31 09:00:00 (Sun)
  62901050400, #      utc_end 1994-04-03 10:00:00 (Sun)
  62887712400, #  local_start 1993-10-31 01:00:00 (Sun)
  62901021600, #    local_end 1994-04-03 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62901050400, #    utc_start 1994-04-03 10:00:00 (Sun)
  62919190800, #      utc_end 1994-10-30 09:00:00 (Sun)
  62901025200, #  local_start 1994-04-03 03:00:00 (Sun)
  62919165600, #    local_end 1994-10-30 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62919190800, #    utc_start 1994-10-30 09:00:00 (Sun)
  62932500000, #      utc_end 1995-04-02 10:00:00 (Sun)
  62919162000, #  local_start 1994-10-30 01:00:00 (Sun)
  62932471200, #    local_end 1995-04-02 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62932500000, #    utc_start 1995-04-02 10:00:00 (Sun)
  62950640400, #      utc_end 1995-10-29 09:00:00 (Sun)
  62932474800, #  local_start 1995-04-02 03:00:00 (Sun)
  62950615200, #    local_end 1995-10-29 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62950640400, #    utc_start 1995-10-29 09:00:00 (Sun)
  62964554400, #      utc_end 1996-04-07 10:00:00 (Sun)
  62950611600, #  local_start 1995-10-29 01:00:00 (Sun)
  62964525600, #    local_end 1996-04-07 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62964554400, #    utc_start 1996-04-07 10:00:00 (Sun)
  62982090000, #      utc_end 1996-10-27 09:00:00 (Sun)
  62964529200, #  local_start 1996-04-07 03:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62982090000, #    utc_start 1996-10-27 09:00:00 (Sun)
  62996004000, #      utc_end 1997-04-06 10:00:00 (Sun)
  62982061200, #  local_start 1996-10-27 01:00:00 (Sun)
  62995975200, #    local_end 1997-04-06 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62996004000, #    utc_start 1997-04-06 10:00:00 (Sun)
  63013539600, #      utc_end 1997-10-26 09:00:00 (Sun)
  62995978800, #  local_start 1997-04-06 03:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63013539600, #    utc_start 1997-10-26 09:00:00 (Sun)
  63027453600, #      utc_end 1998-04-05 10:00:00 (Sun)
  63013510800, #  local_start 1997-10-26 01:00:00 (Sun)
  63027424800, #    local_end 1998-04-05 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63027453600, #    utc_start 1998-04-05 10:00:00 (Sun)
  63044989200, #      utc_end 1998-10-25 09:00:00 (Sun)
  63027428400, #  local_start 1998-04-05 03:00:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63044989200, #    utc_start 1998-10-25 09:00:00 (Sun)
  63058903200, #      utc_end 1999-04-04 10:00:00 (Sun)
  63044960400, #  local_start 1998-10-25 01:00:00 (Sun)
  63058874400, #    local_end 1999-04-04 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63058903200, #    utc_start 1999-04-04 10:00:00 (Sun)
  63077043600, #      utc_end 1999-10-31 09:00:00 (Sun)
  63058878000, #  local_start 1999-04-04 03:00:00 (Sun)
  63077018400, #    local_end 1999-10-31 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63077043600, #    utc_start 1999-10-31 09:00:00 (Sun)
  63090352800, #      utc_end 2000-04-02 10:00:00 (Sun)
  63077014800, #  local_start 1999-10-31 01:00:00 (Sun)
  63090324000, #    local_end 2000-04-02 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63090352800, #    utc_start 2000-04-02 10:00:00 (Sun)
  63108493200, #      utc_end 2000-10-29 09:00:00 (Sun)
  63090327600, #  local_start 2000-04-02 03:00:00 (Sun)
  63108468000, #    local_end 2000-10-29 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63108493200, #    utc_start 2000-10-29 09:00:00 (Sun)
  63121802400, #      utc_end 2001-04-01 10:00:00 (Sun)
  63108464400, #  local_start 2000-10-29 01:00:00 (Sun)
  63121773600, #    local_end 2001-04-01 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63121802400, #    utc_start 2001-04-01 10:00:00 (Sun)
  63139942800, #      utc_end 2001-10-28 09:00:00 (Sun)
  63121777200, #  local_start 2001-04-01 03:00:00 (Sun)
  63139917600, #    local_end 2001-10-28 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63139942800, #    utc_start 2001-10-28 09:00:00 (Sun)
  63153856800, #      utc_end 2002-04-07 10:00:00 (Sun)
  63139914000, #  local_start 2001-10-28 01:00:00 (Sun)
  63153828000, #    local_end 2002-04-07 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63153856800, #    utc_start 2002-04-07 10:00:00 (Sun)
  63171392400, #      utc_end 2002-10-27 09:00:00 (Sun)
  63153831600, #  local_start 2002-04-07 03:00:00 (Sun)
  63171367200, #    local_end 2002-10-27 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63171392400, #    utc_start 2002-10-27 09:00:00 (Sun)
  63185306400, #      utc_end 2003-04-06 10:00:00 (Sun)
  63171363600, #  local_start 2002-10-27 01:00:00 (Sun)
  63185277600, #    local_end 2003-04-06 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63185306400, #    utc_start 2003-04-06 10:00:00 (Sun)
  63202842000, #      utc_end 2003-10-26 09:00:00 (Sun)
  63185281200, #  local_start 2003-04-06 03:00:00 (Sun)
  63202816800, #    local_end 2003-10-26 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63202842000, #    utc_start 2003-10-26 09:00:00 (Sun)
  63216756000, #      utc_end 2004-04-04 10:00:00 (Sun)
  63202813200, #  local_start 2003-10-26 01:00:00 (Sun)
  63216727200, #    local_end 2004-04-04 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63216756000, #    utc_start 2004-04-04 10:00:00 (Sun)
  63234896400, #      utc_end 2004-10-31 09:00:00 (Sun)
  63216730800, #  local_start 2004-04-04 03:00:00 (Sun)
  63234871200, #    local_end 2004-10-31 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63234896400, #    utc_start 2004-10-31 09:00:00 (Sun)
  63248205600, #      utc_end 2005-04-03 10:00:00 (Sun)
  63234867600, #  local_start 2004-10-31 01:00:00 (Sun)
  63248176800, #    local_end 2005-04-03 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63248205600, #    utc_start 2005-04-03 10:00:00 (Sun)
  63266346000, #      utc_end 2005-10-30 09:00:00 (Sun)
  63248180400, #  local_start 2005-04-03 03:00:00 (Sun)
  63266320800, #    local_end 2005-10-30 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63266346000, #    utc_start 2005-10-30 09:00:00 (Sun)
  63279655200, #      utc_end 2006-04-02 10:00:00 (Sun)
  63266317200, #  local_start 2005-10-30 01:00:00 (Sun)
  63279626400, #    local_end 2006-04-02 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63279655200, #    utc_start 2006-04-02 10:00:00 (Sun)
  63297795600, #      utc_end 2006-10-29 09:00:00 (Sun)
  63279630000, #  local_start 2006-04-02 03:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63297795600, #    utc_start 2006-10-29 09:00:00 (Sun)
  63309290400, #      utc_end 2007-03-11 10:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63309261600, #    local_end 2007-03-11 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63309290400, #    utc_start 2007-03-11 10:00:00 (Sun)
  63329850000, #      utc_end 2007-11-04 09:00:00 (Sun)
  63309265200, #  local_start 2007-03-11 03:00:00 (Sun)
  63329824800, #    local_end 2007-11-04 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63329850000, #    utc_start 2007-11-04 09:00:00 (Sun)
  63340740000, #      utc_end 2008-03-09 10:00:00 (Sun)
  63329821200, #  local_start 2007-11-04 01:00:00 (Sun)
  63340711200, #    local_end 2008-03-09 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63340740000, #    utc_start 2008-03-09 10:00:00 (Sun)
  63361299600, #      utc_end 2008-11-02 09:00:00 (Sun)
  63340714800, #  local_start 2008-03-09 03:00:00 (Sun)
  63361274400, #    local_end 2008-11-02 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63361299600, #    utc_start 2008-11-02 09:00:00 (Sun)
  63372189600, #      utc_end 2009-03-08 10:00:00 (Sun)
  63361270800, #  local_start 2008-11-02 01:00:00 (Sun)
  63372160800, #    local_end 2009-03-08 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63372189600, #    utc_start 2009-03-08 10:00:00 (Sun)
  63392749200, #      utc_end 2009-11-01 09:00:00 (Sun)
  63372164400, #  local_start 2009-03-08 03:00:00 (Sun)
  63392724000, #    local_end 2009-11-01 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63392749200, #    utc_start 2009-11-01 09:00:00 (Sun)
  63404244000, #      utc_end 2010-03-14 10:00:00 (Sun)
  63392720400, #  local_start 2009-11-01 01:00:00 (Sun)
  63404215200, #    local_end 2010-03-14 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63404244000, #    utc_start 2010-03-14 10:00:00 (Sun)
  63424803600, #      utc_end 2010-11-07 09:00:00 (Sun)
  63404218800, #  local_start 2010-03-14 03:00:00 (Sun)
  63424778400, #    local_end 2010-11-07 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63424803600, #    utc_start 2010-11-07 09:00:00 (Sun)
  63435693600, #      utc_end 2011-03-13 10:00:00 (Sun)
  63424774800, #  local_start 2010-11-07 01:00:00 (Sun)
  63435664800, #    local_end 2011-03-13 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63435693600, #    utc_start 2011-03-13 10:00:00 (Sun)
  63456253200, #      utc_end 2011-11-06 09:00:00 (Sun)
  63435668400, #  local_start 2011-03-13 03:00:00 (Sun)
  63456228000, #    local_end 2011-11-06 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63456253200, #    utc_start 2011-11-06 09:00:00 (Sun)
  63467143200, #      utc_end 2012-03-11 10:00:00 (Sun)
  63456224400, #  local_start 2011-11-06 01:00:00 (Sun)
  63467114400, #    local_end 2012-03-11 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63467143200, #    utc_start 2012-03-11 10:00:00 (Sun)
  63487702800, #      utc_end 2012-11-04 09:00:00 (Sun)
  63467118000, #  local_start 2012-03-11 03:00:00 (Sun)
  63487677600, #    local_end 2012-11-04 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63487702800, #    utc_start 2012-11-04 09:00:00 (Sun)
  63498592800, #      utc_end 2013-03-10 10:00:00 (Sun)
  63487674000, #  local_start 2012-11-04 01:00:00 (Sun)
  63498564000, #    local_end 2013-03-10 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63498592800, #    utc_start 2013-03-10 10:00:00 (Sun)
  63519152400, #      utc_end 2013-11-03 09:00:00 (Sun)
  63498567600, #  local_start 2013-03-10 03:00:00 (Sun)
  63519127200, #    local_end 2013-11-03 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63519152400, #    utc_start 2013-11-03 09:00:00 (Sun)
  63530042400, #      utc_end 2014-03-09 10:00:00 (Sun)
  63519123600, #  local_start 2013-11-03 01:00:00 (Sun)
  63530013600, #    local_end 2014-03-09 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63530042400, #    utc_start 2014-03-09 10:00:00 (Sun)
  63550602000, #      utc_end 2014-11-02 09:00:00 (Sun)
  63530017200, #  local_start 2014-03-09 03:00:00 (Sun)
  63550576800, #    local_end 2014-11-02 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63550602000, #    utc_start 2014-11-02 09:00:00 (Sun)
  63561492000, #      utc_end 2015-03-08 10:00:00 (Sun)
  63550573200, #  local_start 2014-11-02 01:00:00 (Sun)
  63561463200, #    local_end 2015-03-08 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63561492000, #    utc_start 2015-03-08 10:00:00 (Sun)
  63582051600, #      utc_end 2015-11-01 09:00:00 (Sun)
  63561466800, #  local_start 2015-03-08 03:00:00 (Sun)
  63582026400, #    local_end 2015-11-01 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63582051600, #    utc_start 2015-11-01 09:00:00 (Sun)
  63593546400, #      utc_end 2016-03-13 10:00:00 (Sun)
  63582022800, #  local_start 2015-11-01 01:00:00 (Sun)
  63593517600, #    local_end 2016-03-13 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63593546400, #    utc_start 2016-03-13 10:00:00 (Sun)
  63614106000, #      utc_end 2016-11-06 09:00:00 (Sun)
  63593521200, #  local_start 2016-03-13 03:00:00 (Sun)
  63614080800, #    local_end 2016-11-06 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63614106000, #    utc_start 2016-11-06 09:00:00 (Sun)
  63624996000, #      utc_end 2017-03-12 10:00:00 (Sun)
  63614077200, #  local_start 2016-11-06 01:00:00 (Sun)
  63624967200, #    local_end 2017-03-12 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63624996000, #    utc_start 2017-03-12 10:00:00 (Sun)
  63645555600, #      utc_end 2017-11-05 09:00:00 (Sun)
  63624970800, #  local_start 2017-03-12 03:00:00 (Sun)
  63645530400, #    local_end 2017-11-05 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63645555600, #    utc_start 2017-11-05 09:00:00 (Sun)
  63656445600, #      utc_end 2018-03-11 10:00:00 (Sun)
  63645526800, #  local_start 2017-11-05 01:00:00 (Sun)
  63656416800, #    local_end 2018-03-11 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63656445600, #    utc_start 2018-03-11 10:00:00 (Sun)
  63677005200, #      utc_end 2018-11-04 09:00:00 (Sun)
  63656420400, #  local_start 2018-03-11 03:00:00 (Sun)
  63676980000, #    local_end 2018-11-04 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63677005200, #    utc_start 2018-11-04 09:00:00 (Sun)
  63687895200, #      utc_end 2019-03-10 10:00:00 (Sun)
  63676976400, #  local_start 2018-11-04 01:00:00 (Sun)
  63687866400, #    local_end 2019-03-10 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63687895200, #    utc_start 2019-03-10 10:00:00 (Sun)
  63708454800, #      utc_end 2019-11-03 09:00:00 (Sun)
  63687870000, #  local_start 2019-03-10 03:00:00 (Sun)
  63708429600, #    local_end 2019-11-03 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63708454800, #    utc_start 2019-11-03 09:00:00 (Sun)
  63719344800, #      utc_end 2020-03-08 10:00:00 (Sun)
  63708426000, #  local_start 2019-11-03 01:00:00 (Sun)
  63719316000, #    local_end 2020-03-08 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63719344800, #    utc_start 2020-03-08 10:00:00 (Sun)
  63739904400, #      utc_end 2020-11-01 09:00:00 (Sun)
  63719319600, #  local_start 2020-03-08 03:00:00 (Sun)
  63739879200, #    local_end 2020-11-01 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63739904400, #    utc_start 2020-11-01 09:00:00 (Sun)
  63751399200, #      utc_end 2021-03-14 10:00:00 (Sun)
  63739875600, #  local_start 2020-11-01 01:00:00 (Sun)
  63751370400, #    local_end 2021-03-14 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63751399200, #    utc_start 2021-03-14 10:00:00 (Sun)
  63771958800, #      utc_end 2021-11-07 09:00:00 (Sun)
  63751374000, #  local_start 2021-03-14 03:00:00 (Sun)
  63771933600, #    local_end 2021-11-07 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63771958800, #    utc_start 2021-11-07 09:00:00 (Sun)
  63782848800, #      utc_end 2022-03-13 10:00:00 (Sun)
  63771930000, #  local_start 2021-11-07 01:00:00 (Sun)
  63782820000, #    local_end 2022-03-13 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63782848800, #    utc_start 2022-03-13 10:00:00 (Sun)
  63803408400, #      utc_end 2022-11-06 09:00:00 (Sun)
  63782823600, #  local_start 2022-03-13 03:00:00 (Sun)
  63803383200, #    local_end 2022-11-06 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63803408400, #    utc_start 2022-11-06 09:00:00 (Sun)
  63814298400, #      utc_end 2023-03-12 10:00:00 (Sun)
  63803379600, #  local_start 2022-11-06 01:00:00 (Sun)
  63814269600, #    local_end 2023-03-12 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63814298400, #    utc_start 2023-03-12 10:00:00 (Sun)
  63834858000, #      utc_end 2023-11-05 09:00:00 (Sun)
  63814273200, #  local_start 2023-03-12 03:00:00 (Sun)
  63834832800, #    local_end 2023-11-05 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63834858000, #    utc_start 2023-11-05 09:00:00 (Sun)
  63845748000, #      utc_end 2024-03-10 10:00:00 (Sun)
  63834829200, #  local_start 2023-11-05 01:00:00 (Sun)
  63845719200, #    local_end 2024-03-10 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63845748000, #    utc_start 2024-03-10 10:00:00 (Sun)
  63866307600, #      utc_end 2024-11-03 09:00:00 (Sun)
  63845722800, #  local_start 2024-03-10 03:00:00 (Sun)
  63866282400, #    local_end 2024-11-03 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63866307600, #    utc_start 2024-11-03 09:00:00 (Sun)
  63877197600, #      utc_end 2025-03-09 10:00:00 (Sun)
  63866278800, #  local_start 2024-11-03 01:00:00 (Sun)
  63877168800, #    local_end 2025-03-09 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63877197600, #    utc_start 2025-03-09 10:00:00 (Sun)
  63897757200, #      utc_end 2025-11-02 09:00:00 (Sun)
  63877172400, #  local_start 2025-03-09 03:00:00 (Sun)
  63897732000, #    local_end 2025-11-02 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63897757200, #    utc_start 2025-11-02 09:00:00 (Sun)
  63908647200, #      utc_end 2026-03-08 10:00:00 (Sun)
  63897728400, #  local_start 2025-11-02 01:00:00 (Sun)
  63908618400, #    local_end 2026-03-08 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63908647200, #    utc_start 2026-03-08 10:00:00 (Sun)
  63929206800, #      utc_end 2026-11-01 09:00:00 (Sun)
  63908622000, #  local_start 2026-03-08 03:00:00 (Sun)
  63929181600, #    local_end 2026-11-01 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63929206800, #    utc_start 2026-11-01 09:00:00 (Sun)
  63940701600, #      utc_end 2027-03-14 10:00:00 (Sun)
  63929178000, #  local_start 2026-11-01 01:00:00 (Sun)
  63940672800, #    local_end 2027-03-14 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63940701600, #    utc_start 2027-03-14 10:00:00 (Sun)
  63961261200, #      utc_end 2027-11-07 09:00:00 (Sun)
  63940676400, #  local_start 2027-03-14 03:00:00 (Sun)
  63961236000, #    local_end 2027-11-07 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63961261200, #    utc_start 2027-11-07 09:00:00 (Sun)
  63972151200, #      utc_end 2028-03-12 10:00:00 (Sun)
  63961232400, #  local_start 2027-11-07 01:00:00 (Sun)
  63972122400, #    local_end 2028-03-12 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63972151200, #    utc_start 2028-03-12 10:00:00 (Sun)
  63992710800, #      utc_end 2028-11-05 09:00:00 (Sun)
  63972126000, #  local_start 2028-03-12 03:00:00 (Sun)
  63992685600, #    local_end 2028-11-05 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63992710800, #    utc_start 2028-11-05 09:00:00 (Sun)
  64003600800, #      utc_end 2029-03-11 10:00:00 (Sun)
  63992682000, #  local_start 2028-11-05 01:00:00 (Sun)
  64003572000, #    local_end 2029-03-11 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  64003600800, #    utc_start 2029-03-11 10:00:00 (Sun)
  64024160400, #      utc_end 2029-11-04 09:00:00 (Sun)
  64003575600, #  local_start 2029-03-11 03:00:00 (Sun)
  64024135200, #    local_end 2029-11-04 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  64024160400, #    utc_start 2029-11-04 09:00:00 (Sun)
  64035050400, #      utc_end 2030-03-10 10:00:00 (Sun)
  64024131600, #  local_start 2029-11-04 01:00:00 (Sun)
  64035021600, #    local_end 2030-03-10 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  64035050400, #    utc_start 2030-03-10 10:00:00 (Sun)
  64055610000, #      utc_end 2030-11-03 09:00:00 (Sun)
  64035025200, #  local_start 2030-03-10 03:00:00 (Sun)
  64055584800, #    local_end 2030-11-03 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {88}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -28800 }
  
  my $last_observance = bless( {
    'format' => 'P%sT',
    'gmtoff' => '-8:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 725372,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 725372,
      'utc_rd_secs' => 0,
      'utc_year' => 1988
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -28800,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 725372,
      'local_rd_secs' => 28800,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 725372,
      'utc_rd_secs' => 28800,
      'utc_year' => 1988
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Mar',
      'letter' => 'D',
      'name' => 'Canada',
      'offset_from_std' => 3600,
      'on' => 'Sun>=8',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Nov',
      'letter' => 'S',
      'name' => 'Canada',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_VANCOUVER

    $main::fatpacked{"DateTime/TimeZone/America/Whitehorse.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_WHITEHORSE';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Whitehorse;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Whitehorse::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59946685212, #      utc_end 1900-08-20 09:00:12 (Mon)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59946652800, #    local_end 1900-08-20 00:00:00 (Mon)
  -32412,
  0,
  'LMT',
      ],
      [
  59946685212, #    utc_start 1900-08-20 09:00:12 (Mon)
  60503626800, #      utc_end 1918-04-14 11:00:00 (Sun)
  59946652812, #  local_start 1900-08-20 00:00:12 (Mon)
  60503594400, #    local_end 1918-04-14 02:00:00 (Sun)
  -32400,
  0,
  'YST',
      ],
      [
  60503626800, #    utc_start 1918-04-14 11:00:00 (Sun)
  60520557600, #      utc_end 1918-10-27 10:00:00 (Sun)
  60503598000, #  local_start 1918-04-14 03:00:00 (Sun)
  60520528800, #    local_end 1918-10-27 02:00:00 (Sun)
  -28800,
  1,
  'YDT',
      ],
      [
  60520557600, #    utc_start 1918-10-27 10:00:00 (Sun)
  60538705200, #      utc_end 1919-05-25 11:00:00 (Sun)
  60520525200, #  local_start 1918-10-27 01:00:00 (Sun)
  60538672800, #    local_end 1919-05-25 02:00:00 (Sun)
  -32400,
  0,
  'YST',
      ],
      [
  60538705200, #    utc_start 1919-05-25 11:00:00 (Sun)
  60552518400, #      utc_end 1919-11-01 08:00:00 (Sat)
  60538676400, #  local_start 1919-05-25 03:00:00 (Sun)
  60552489600, #    local_end 1919-11-01 00:00:00 (Sat)
  -28800,
  1,
  'YDT',
      ],
      [
  60552518400, #    utc_start 1919-11-01 08:00:00 (Sat)
  61255479600, #      utc_end 1942-02-09 11:00:00 (Mon)
  60552486000, #  local_start 1919-10-31 23:00:00 (Fri)
  61255447200, #    local_end 1942-02-09 02:00:00 (Mon)
  -32400,
  0,
  'YST',
      ],
      [
  61255479600, #    utc_start 1942-02-09 11:00:00 (Mon)
  61366287600, #      utc_end 1945-08-14 23:00:00 (Tue)
  61255450800, #  local_start 1942-02-09 03:00:00 (Mon)
  61366258800, #    local_end 1945-08-14 15:00:00 (Tue)
  -28800,
  1,
  'YWT',
      ],
      [
  61366287600, #    utc_start 1945-08-14 23:00:00 (Tue)
  61370301600, #      utc_end 1945-09-30 10:00:00 (Sun)
  61366258800, #  local_start 1945-08-14 15:00:00 (Tue)
  61370272800, #    local_end 1945-09-30 02:00:00 (Sun)
  -28800,
  1,
  'YPT',
      ],
      [
  61370301600, #    utc_start 1945-09-30 10:00:00 (Sun)
  61987798800, #      utc_end 1965-04-25 09:00:00 (Sun)
  61370269200, #  local_start 1945-09-30 01:00:00 (Sun)
  61987766400, #    local_end 1965-04-25 00:00:00 (Sun)
  -32400,
  0,
  'YST',
      ],
      [
  61987798800, #    utc_start 1965-04-25 09:00:00 (Sun)
  62004128400, #      utc_end 1965-10-31 09:00:00 (Sun)
  61987773600, #  local_start 1965-04-25 02:00:00 (Sun)
  62004103200, #    local_end 1965-10-31 02:00:00 (Sun)
  -25200,
  1,
  'YDDT',
      ],
      [
  62004128400, #    utc_start 1965-10-31 09:00:00 (Sun)
  62053722000, #      utc_end 1967-05-28 09:00:00 (Sun)
  62004096000, #  local_start 1965-10-31 00:00:00 (Sun)
  62053689600, #    local_end 1967-05-28 00:00:00 (Sun)
  -32400,
  0,
  'YST',
      ],
      [
  62053722000, #    utc_start 1967-05-28 09:00:00 (Sun)
  62451244800, #      utc_end 1980-01-01 08:00:00 (Tue)
  62053693200, #  local_start 1967-05-28 01:00:00 (Sun)
  62451216000, #    local_end 1980-01-01 00:00:00 (Tue)
  -28800,
  0,
  'PST',
      ],
      [
  62451244800, #    utc_start 1980-01-01 08:00:00 (Tue)
  62461360800, #      utc_end 1980-04-27 10:00:00 (Sun)
  62451216000, #  local_start 1980-01-01 00:00:00 (Tue)
  62461332000, #    local_end 1980-04-27 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62461360800, #    utc_start 1980-04-27 10:00:00 (Sun)
  62477082000, #      utc_end 1980-10-26 09:00:00 (Sun)
  62461335600, #  local_start 1980-04-27 03:00:00 (Sun)
  62477056800, #    local_end 1980-10-26 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62477082000, #    utc_start 1980-10-26 09:00:00 (Sun)
  62492810400, #      utc_end 1981-04-26 10:00:00 (Sun)
  62477053200, #  local_start 1980-10-26 01:00:00 (Sun)
  62492781600, #    local_end 1981-04-26 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62492810400, #    utc_start 1981-04-26 10:00:00 (Sun)
  62508531600, #      utc_end 1981-10-25 09:00:00 (Sun)
  62492785200, #  local_start 1981-04-26 03:00:00 (Sun)
  62508506400, #    local_end 1981-10-25 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62508531600, #    utc_start 1981-10-25 09:00:00 (Sun)
  62524260000, #      utc_end 1982-04-25 10:00:00 (Sun)
  62508502800, #  local_start 1981-10-25 01:00:00 (Sun)
  62524231200, #    local_end 1982-04-25 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62524260000, #    utc_start 1982-04-25 10:00:00 (Sun)
  62540586000, #      utc_end 1982-10-31 09:00:00 (Sun)
  62524234800, #  local_start 1982-04-25 03:00:00 (Sun)
  62540560800, #    local_end 1982-10-31 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62540586000, #    utc_start 1982-10-31 09:00:00 (Sun)
  62555709600, #      utc_end 1983-04-24 10:00:00 (Sun)
  62540557200, #  local_start 1982-10-31 01:00:00 (Sun)
  62555680800, #    local_end 1983-04-24 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62555709600, #    utc_start 1983-04-24 10:00:00 (Sun)
  62572035600, #      utc_end 1983-10-30 09:00:00 (Sun)
  62555684400, #  local_start 1983-04-24 03:00:00 (Sun)
  62572010400, #    local_end 1983-10-30 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62572035600, #    utc_start 1983-10-30 09:00:00 (Sun)
  62587764000, #      utc_end 1984-04-29 10:00:00 (Sun)
  62572006800, #  local_start 1983-10-30 01:00:00 (Sun)
  62587735200, #    local_end 1984-04-29 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62587764000, #    utc_start 1984-04-29 10:00:00 (Sun)
  62603485200, #      utc_end 1984-10-28 09:00:00 (Sun)
  62587738800, #  local_start 1984-04-29 03:00:00 (Sun)
  62603460000, #    local_end 1984-10-28 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62603485200, #    utc_start 1984-10-28 09:00:00 (Sun)
  62619213600, #      utc_end 1985-04-28 10:00:00 (Sun)
  62603456400, #  local_start 1984-10-28 01:00:00 (Sun)
  62619184800, #    local_end 1985-04-28 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62619213600, #    utc_start 1985-04-28 10:00:00 (Sun)
  62634934800, #      utc_end 1985-10-27 09:00:00 (Sun)
  62619188400, #  local_start 1985-04-28 03:00:00 (Sun)
  62634909600, #    local_end 1985-10-27 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62634934800, #    utc_start 1985-10-27 09:00:00 (Sun)
  62650663200, #      utc_end 1986-04-27 10:00:00 (Sun)
  62634906000, #  local_start 1985-10-27 01:00:00 (Sun)
  62650634400, #    local_end 1986-04-27 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62650663200, #    utc_start 1986-04-27 10:00:00 (Sun)
  62666384400, #      utc_end 1986-10-26 09:00:00 (Sun)
  62650638000, #  local_start 1986-04-27 03:00:00 (Sun)
  62666359200, #    local_end 1986-10-26 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62666384400, #    utc_start 1986-10-26 09:00:00 (Sun)
  62680298400, #      utc_end 1987-04-05 10:00:00 (Sun)
  62666355600, #  local_start 1986-10-26 01:00:00 (Sun)
  62680269600, #    local_end 1987-04-05 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62680298400, #    utc_start 1987-04-05 10:00:00 (Sun)
  62697834000, #      utc_end 1987-10-25 09:00:00 (Sun)
  62680273200, #  local_start 1987-04-05 03:00:00 (Sun)
  62697808800, #    local_end 1987-10-25 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62697834000, #    utc_start 1987-10-25 09:00:00 (Sun)
  62711748000, #      utc_end 1988-04-03 10:00:00 (Sun)
  62697805200, #  local_start 1987-10-25 01:00:00 (Sun)
  62711719200, #    local_end 1988-04-03 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62711748000, #    utc_start 1988-04-03 10:00:00 (Sun)
  62729888400, #      utc_end 1988-10-30 09:00:00 (Sun)
  62711722800, #  local_start 1988-04-03 03:00:00 (Sun)
  62729863200, #    local_end 1988-10-30 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62729888400, #    utc_start 1988-10-30 09:00:00 (Sun)
  62743197600, #      utc_end 1989-04-02 10:00:00 (Sun)
  62729859600, #  local_start 1988-10-30 01:00:00 (Sun)
  62743168800, #    local_end 1989-04-02 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62743197600, #    utc_start 1989-04-02 10:00:00 (Sun)
  62761338000, #      utc_end 1989-10-29 09:00:00 (Sun)
  62743172400, #  local_start 1989-04-02 03:00:00 (Sun)
  62761312800, #    local_end 1989-10-29 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62761338000, #    utc_start 1989-10-29 09:00:00 (Sun)
  62774647200, #      utc_end 1990-04-01 10:00:00 (Sun)
  62761309200, #  local_start 1989-10-29 01:00:00 (Sun)
  62774618400, #    local_end 1990-04-01 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62774647200, #    utc_start 1990-04-01 10:00:00 (Sun)
  62792787600, #      utc_end 1990-10-28 09:00:00 (Sun)
  62774622000, #  local_start 1990-04-01 03:00:00 (Sun)
  62792762400, #    local_end 1990-10-28 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62792787600, #    utc_start 1990-10-28 09:00:00 (Sun)
  62806701600, #      utc_end 1991-04-07 10:00:00 (Sun)
  62792758800, #  local_start 1990-10-28 01:00:00 (Sun)
  62806672800, #    local_end 1991-04-07 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62806701600, #    utc_start 1991-04-07 10:00:00 (Sun)
  62824237200, #      utc_end 1991-10-27 09:00:00 (Sun)
  62806676400, #  local_start 1991-04-07 03:00:00 (Sun)
  62824212000, #    local_end 1991-10-27 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62824237200, #    utc_start 1991-10-27 09:00:00 (Sun)
  62838151200, #      utc_end 1992-04-05 10:00:00 (Sun)
  62824208400, #  local_start 1991-10-27 01:00:00 (Sun)
  62838122400, #    local_end 1992-04-05 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62838151200, #    utc_start 1992-04-05 10:00:00 (Sun)
  62855686800, #      utc_end 1992-10-25 09:00:00 (Sun)
  62838126000, #  local_start 1992-04-05 03:00:00 (Sun)
  62855661600, #    local_end 1992-10-25 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62855686800, #    utc_start 1992-10-25 09:00:00 (Sun)
  62869600800, #      utc_end 1993-04-04 10:00:00 (Sun)
  62855658000, #  local_start 1992-10-25 01:00:00 (Sun)
  62869572000, #    local_end 1993-04-04 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62869600800, #    utc_start 1993-04-04 10:00:00 (Sun)
  62887741200, #      utc_end 1993-10-31 09:00:00 (Sun)
  62869575600, #  local_start 1993-04-04 03:00:00 (Sun)
  62887716000, #    local_end 1993-10-31 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62887741200, #    utc_start 1993-10-31 09:00:00 (Sun)
  62901050400, #      utc_end 1994-04-03 10:00:00 (Sun)
  62887712400, #  local_start 1993-10-31 01:00:00 (Sun)
  62901021600, #    local_end 1994-04-03 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62901050400, #    utc_start 1994-04-03 10:00:00 (Sun)
  62919190800, #      utc_end 1994-10-30 09:00:00 (Sun)
  62901025200, #  local_start 1994-04-03 03:00:00 (Sun)
  62919165600, #    local_end 1994-10-30 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62919190800, #    utc_start 1994-10-30 09:00:00 (Sun)
  62932500000, #      utc_end 1995-04-02 10:00:00 (Sun)
  62919162000, #  local_start 1994-10-30 01:00:00 (Sun)
  62932471200, #    local_end 1995-04-02 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62932500000, #    utc_start 1995-04-02 10:00:00 (Sun)
  62950640400, #      utc_end 1995-10-29 09:00:00 (Sun)
  62932474800, #  local_start 1995-04-02 03:00:00 (Sun)
  62950615200, #    local_end 1995-10-29 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62950640400, #    utc_start 1995-10-29 09:00:00 (Sun)
  62964554400, #      utc_end 1996-04-07 10:00:00 (Sun)
  62950611600, #  local_start 1995-10-29 01:00:00 (Sun)
  62964525600, #    local_end 1996-04-07 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62964554400, #    utc_start 1996-04-07 10:00:00 (Sun)
  62982090000, #      utc_end 1996-10-27 09:00:00 (Sun)
  62964529200, #  local_start 1996-04-07 03:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62982090000, #    utc_start 1996-10-27 09:00:00 (Sun)
  62996004000, #      utc_end 1997-04-06 10:00:00 (Sun)
  62982061200, #  local_start 1996-10-27 01:00:00 (Sun)
  62995975200, #    local_end 1997-04-06 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62996004000, #    utc_start 1997-04-06 10:00:00 (Sun)
  63013539600, #      utc_end 1997-10-26 09:00:00 (Sun)
  62995978800, #  local_start 1997-04-06 03:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63013539600, #    utc_start 1997-10-26 09:00:00 (Sun)
  63027453600, #      utc_end 1998-04-05 10:00:00 (Sun)
  63013510800, #  local_start 1997-10-26 01:00:00 (Sun)
  63027424800, #    local_end 1998-04-05 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63027453600, #    utc_start 1998-04-05 10:00:00 (Sun)
  63044989200, #      utc_end 1998-10-25 09:00:00 (Sun)
  63027428400, #  local_start 1998-04-05 03:00:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63044989200, #    utc_start 1998-10-25 09:00:00 (Sun)
  63058903200, #      utc_end 1999-04-04 10:00:00 (Sun)
  63044960400, #  local_start 1998-10-25 01:00:00 (Sun)
  63058874400, #    local_end 1999-04-04 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63058903200, #    utc_start 1999-04-04 10:00:00 (Sun)
  63077043600, #      utc_end 1999-10-31 09:00:00 (Sun)
  63058878000, #  local_start 1999-04-04 03:00:00 (Sun)
  63077018400, #    local_end 1999-10-31 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63077043600, #    utc_start 1999-10-31 09:00:00 (Sun)
  63090352800, #      utc_end 2000-04-02 10:00:00 (Sun)
  63077014800, #  local_start 1999-10-31 01:00:00 (Sun)
  63090324000, #    local_end 2000-04-02 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63090352800, #    utc_start 2000-04-02 10:00:00 (Sun)
  63108493200, #      utc_end 2000-10-29 09:00:00 (Sun)
  63090327600, #  local_start 2000-04-02 03:00:00 (Sun)
  63108468000, #    local_end 2000-10-29 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63108493200, #    utc_start 2000-10-29 09:00:00 (Sun)
  63121802400, #      utc_end 2001-04-01 10:00:00 (Sun)
  63108464400, #  local_start 2000-10-29 01:00:00 (Sun)
  63121773600, #    local_end 2001-04-01 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63121802400, #    utc_start 2001-04-01 10:00:00 (Sun)
  63139942800, #      utc_end 2001-10-28 09:00:00 (Sun)
  63121777200, #  local_start 2001-04-01 03:00:00 (Sun)
  63139917600, #    local_end 2001-10-28 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63139942800, #    utc_start 2001-10-28 09:00:00 (Sun)
  63153856800, #      utc_end 2002-04-07 10:00:00 (Sun)
  63139914000, #  local_start 2001-10-28 01:00:00 (Sun)
  63153828000, #    local_end 2002-04-07 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63153856800, #    utc_start 2002-04-07 10:00:00 (Sun)
  63171392400, #      utc_end 2002-10-27 09:00:00 (Sun)
  63153831600, #  local_start 2002-04-07 03:00:00 (Sun)
  63171367200, #    local_end 2002-10-27 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63171392400, #    utc_start 2002-10-27 09:00:00 (Sun)
  63185306400, #      utc_end 2003-04-06 10:00:00 (Sun)
  63171363600, #  local_start 2002-10-27 01:00:00 (Sun)
  63185277600, #    local_end 2003-04-06 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63185306400, #    utc_start 2003-04-06 10:00:00 (Sun)
  63202842000, #      utc_end 2003-10-26 09:00:00 (Sun)
  63185281200, #  local_start 2003-04-06 03:00:00 (Sun)
  63202816800, #    local_end 2003-10-26 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63202842000, #    utc_start 2003-10-26 09:00:00 (Sun)
  63216756000, #      utc_end 2004-04-04 10:00:00 (Sun)
  63202813200, #  local_start 2003-10-26 01:00:00 (Sun)
  63216727200, #    local_end 2004-04-04 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63216756000, #    utc_start 2004-04-04 10:00:00 (Sun)
  63234896400, #      utc_end 2004-10-31 09:00:00 (Sun)
  63216730800, #  local_start 2004-04-04 03:00:00 (Sun)
  63234871200, #    local_end 2004-10-31 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63234896400, #    utc_start 2004-10-31 09:00:00 (Sun)
  63248205600, #      utc_end 2005-04-03 10:00:00 (Sun)
  63234867600, #  local_start 2004-10-31 01:00:00 (Sun)
  63248176800, #    local_end 2005-04-03 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63248205600, #    utc_start 2005-04-03 10:00:00 (Sun)
  63266346000, #      utc_end 2005-10-30 09:00:00 (Sun)
  63248180400, #  local_start 2005-04-03 03:00:00 (Sun)
  63266320800, #    local_end 2005-10-30 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63266346000, #    utc_start 2005-10-30 09:00:00 (Sun)
  63279655200, #      utc_end 2006-04-02 10:00:00 (Sun)
  63266317200, #  local_start 2005-10-30 01:00:00 (Sun)
  63279626400, #    local_end 2006-04-02 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63279655200, #    utc_start 2006-04-02 10:00:00 (Sun)
  63297795600, #      utc_end 2006-10-29 09:00:00 (Sun)
  63279630000, #  local_start 2006-04-02 03:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63297795600, #    utc_start 2006-10-29 09:00:00 (Sun)
  63309290400, #      utc_end 2007-03-11 10:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63309261600, #    local_end 2007-03-11 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63309290400, #    utc_start 2007-03-11 10:00:00 (Sun)
  63329850000, #      utc_end 2007-11-04 09:00:00 (Sun)
  63309265200, #  local_start 2007-03-11 03:00:00 (Sun)
  63329824800, #    local_end 2007-11-04 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63329850000, #    utc_start 2007-11-04 09:00:00 (Sun)
  63340740000, #      utc_end 2008-03-09 10:00:00 (Sun)
  63329821200, #  local_start 2007-11-04 01:00:00 (Sun)
  63340711200, #    local_end 2008-03-09 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63340740000, #    utc_start 2008-03-09 10:00:00 (Sun)
  63361299600, #      utc_end 2008-11-02 09:00:00 (Sun)
  63340714800, #  local_start 2008-03-09 03:00:00 (Sun)
  63361274400, #    local_end 2008-11-02 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63361299600, #    utc_start 2008-11-02 09:00:00 (Sun)
  63372189600, #      utc_end 2009-03-08 10:00:00 (Sun)
  63361270800, #  local_start 2008-11-02 01:00:00 (Sun)
  63372160800, #    local_end 2009-03-08 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63372189600, #    utc_start 2009-03-08 10:00:00 (Sun)
  63392749200, #      utc_end 2009-11-01 09:00:00 (Sun)
  63372164400, #  local_start 2009-03-08 03:00:00 (Sun)
  63392724000, #    local_end 2009-11-01 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63392749200, #    utc_start 2009-11-01 09:00:00 (Sun)
  63404244000, #      utc_end 2010-03-14 10:00:00 (Sun)
  63392720400, #  local_start 2009-11-01 01:00:00 (Sun)
  63404215200, #    local_end 2010-03-14 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63404244000, #    utc_start 2010-03-14 10:00:00 (Sun)
  63424803600, #      utc_end 2010-11-07 09:00:00 (Sun)
  63404218800, #  local_start 2010-03-14 03:00:00 (Sun)
  63424778400, #    local_end 2010-11-07 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63424803600, #    utc_start 2010-11-07 09:00:00 (Sun)
  63435693600, #      utc_end 2011-03-13 10:00:00 (Sun)
  63424774800, #  local_start 2010-11-07 01:00:00 (Sun)
  63435664800, #    local_end 2011-03-13 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63435693600, #    utc_start 2011-03-13 10:00:00 (Sun)
  63456253200, #      utc_end 2011-11-06 09:00:00 (Sun)
  63435668400, #  local_start 2011-03-13 03:00:00 (Sun)
  63456228000, #    local_end 2011-11-06 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63456253200, #    utc_start 2011-11-06 09:00:00 (Sun)
  63467143200, #      utc_end 2012-03-11 10:00:00 (Sun)
  63456224400, #  local_start 2011-11-06 01:00:00 (Sun)
  63467114400, #    local_end 2012-03-11 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63467143200, #    utc_start 2012-03-11 10:00:00 (Sun)
  63487702800, #      utc_end 2012-11-04 09:00:00 (Sun)
  63467118000, #  local_start 2012-03-11 03:00:00 (Sun)
  63487677600, #    local_end 2012-11-04 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63487702800, #    utc_start 2012-11-04 09:00:00 (Sun)
  63498592800, #      utc_end 2013-03-10 10:00:00 (Sun)
  63487674000, #  local_start 2012-11-04 01:00:00 (Sun)
  63498564000, #    local_end 2013-03-10 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63498592800, #    utc_start 2013-03-10 10:00:00 (Sun)
  63519152400, #      utc_end 2013-11-03 09:00:00 (Sun)
  63498567600, #  local_start 2013-03-10 03:00:00 (Sun)
  63519127200, #    local_end 2013-11-03 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63519152400, #    utc_start 2013-11-03 09:00:00 (Sun)
  63530042400, #      utc_end 2014-03-09 10:00:00 (Sun)
  63519123600, #  local_start 2013-11-03 01:00:00 (Sun)
  63530013600, #    local_end 2014-03-09 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63530042400, #    utc_start 2014-03-09 10:00:00 (Sun)
  63550602000, #      utc_end 2014-11-02 09:00:00 (Sun)
  63530017200, #  local_start 2014-03-09 03:00:00 (Sun)
  63550576800, #    local_end 2014-11-02 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63550602000, #    utc_start 2014-11-02 09:00:00 (Sun)
  63561492000, #      utc_end 2015-03-08 10:00:00 (Sun)
  63550573200, #  local_start 2014-11-02 01:00:00 (Sun)
  63561463200, #    local_end 2015-03-08 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63561492000, #    utc_start 2015-03-08 10:00:00 (Sun)
  63582051600, #      utc_end 2015-11-01 09:00:00 (Sun)
  63561466800, #  local_start 2015-03-08 03:00:00 (Sun)
  63582026400, #    local_end 2015-11-01 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63582051600, #    utc_start 2015-11-01 09:00:00 (Sun)
  63593546400, #      utc_end 2016-03-13 10:00:00 (Sun)
  63582022800, #  local_start 2015-11-01 01:00:00 (Sun)
  63593517600, #    local_end 2016-03-13 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63593546400, #    utc_start 2016-03-13 10:00:00 (Sun)
  63614106000, #      utc_end 2016-11-06 09:00:00 (Sun)
  63593521200, #  local_start 2016-03-13 03:00:00 (Sun)
  63614080800, #    local_end 2016-11-06 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63614106000, #    utc_start 2016-11-06 09:00:00 (Sun)
  63624996000, #      utc_end 2017-03-12 10:00:00 (Sun)
  63614077200, #  local_start 2016-11-06 01:00:00 (Sun)
  63624967200, #    local_end 2017-03-12 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63624996000, #    utc_start 2017-03-12 10:00:00 (Sun)
  63645555600, #      utc_end 2017-11-05 09:00:00 (Sun)
  63624970800, #  local_start 2017-03-12 03:00:00 (Sun)
  63645530400, #    local_end 2017-11-05 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63645555600, #    utc_start 2017-11-05 09:00:00 (Sun)
  63656445600, #      utc_end 2018-03-11 10:00:00 (Sun)
  63645526800, #  local_start 2017-11-05 01:00:00 (Sun)
  63656416800, #    local_end 2018-03-11 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63656445600, #    utc_start 2018-03-11 10:00:00 (Sun)
  63677005200, #      utc_end 2018-11-04 09:00:00 (Sun)
  63656420400, #  local_start 2018-03-11 03:00:00 (Sun)
  63676980000, #    local_end 2018-11-04 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63677005200, #    utc_start 2018-11-04 09:00:00 (Sun)
  63687895200, #      utc_end 2019-03-10 10:00:00 (Sun)
  63676976400, #  local_start 2018-11-04 01:00:00 (Sun)
  63687866400, #    local_end 2019-03-10 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63687895200, #    utc_start 2019-03-10 10:00:00 (Sun)
  63708454800, #      utc_end 2019-11-03 09:00:00 (Sun)
  63687870000, #  local_start 2019-03-10 03:00:00 (Sun)
  63708429600, #    local_end 2019-11-03 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63708454800, #    utc_start 2019-11-03 09:00:00 (Sun)
  63719344800, #      utc_end 2020-03-08 10:00:00 (Sun)
  63708426000, #  local_start 2019-11-03 01:00:00 (Sun)
  63719316000, #    local_end 2020-03-08 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63719344800, #    utc_start 2020-03-08 10:00:00 (Sun)
  63739904400, #      utc_end 2020-11-01 09:00:00 (Sun)
  63719319600, #  local_start 2020-03-08 03:00:00 (Sun)
  63739879200, #    local_end 2020-11-01 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63739904400, #    utc_start 2020-11-01 09:00:00 (Sun)
  63751399200, #      utc_end 2021-03-14 10:00:00 (Sun)
  63739875600, #  local_start 2020-11-01 01:00:00 (Sun)
  63751370400, #    local_end 2021-03-14 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63751399200, #    utc_start 2021-03-14 10:00:00 (Sun)
  63771958800, #      utc_end 2021-11-07 09:00:00 (Sun)
  63751374000, #  local_start 2021-03-14 03:00:00 (Sun)
  63771933600, #    local_end 2021-11-07 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63771958800, #    utc_start 2021-11-07 09:00:00 (Sun)
  63782848800, #      utc_end 2022-03-13 10:00:00 (Sun)
  63771930000, #  local_start 2021-11-07 01:00:00 (Sun)
  63782820000, #    local_end 2022-03-13 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63782848800, #    utc_start 2022-03-13 10:00:00 (Sun)
  63803408400, #      utc_end 2022-11-06 09:00:00 (Sun)
  63782823600, #  local_start 2022-03-13 03:00:00 (Sun)
  63803383200, #    local_end 2022-11-06 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63803408400, #    utc_start 2022-11-06 09:00:00 (Sun)
  63814298400, #      utc_end 2023-03-12 10:00:00 (Sun)
  63803379600, #  local_start 2022-11-06 01:00:00 (Sun)
  63814269600, #    local_end 2023-03-12 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63814298400, #    utc_start 2023-03-12 10:00:00 (Sun)
  63834858000, #      utc_end 2023-11-05 09:00:00 (Sun)
  63814273200, #  local_start 2023-03-12 03:00:00 (Sun)
  63834832800, #    local_end 2023-11-05 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63834858000, #    utc_start 2023-11-05 09:00:00 (Sun)
  63845748000, #      utc_end 2024-03-10 10:00:00 (Sun)
  63834829200, #  local_start 2023-11-05 01:00:00 (Sun)
  63845719200, #    local_end 2024-03-10 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63845748000, #    utc_start 2024-03-10 10:00:00 (Sun)
  63866307600, #      utc_end 2024-11-03 09:00:00 (Sun)
  63845722800, #  local_start 2024-03-10 03:00:00 (Sun)
  63866282400, #    local_end 2024-11-03 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63866307600, #    utc_start 2024-11-03 09:00:00 (Sun)
  63877197600, #      utc_end 2025-03-09 10:00:00 (Sun)
  63866278800, #  local_start 2024-11-03 01:00:00 (Sun)
  63877168800, #    local_end 2025-03-09 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63877197600, #    utc_start 2025-03-09 10:00:00 (Sun)
  63897757200, #      utc_end 2025-11-02 09:00:00 (Sun)
  63877172400, #  local_start 2025-03-09 03:00:00 (Sun)
  63897732000, #    local_end 2025-11-02 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63897757200, #    utc_start 2025-11-02 09:00:00 (Sun)
  63908647200, #      utc_end 2026-03-08 10:00:00 (Sun)
  63897728400, #  local_start 2025-11-02 01:00:00 (Sun)
  63908618400, #    local_end 2026-03-08 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63908647200, #    utc_start 2026-03-08 10:00:00 (Sun)
  63929206800, #      utc_end 2026-11-01 09:00:00 (Sun)
  63908622000, #  local_start 2026-03-08 03:00:00 (Sun)
  63929181600, #    local_end 2026-11-01 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63929206800, #    utc_start 2026-11-01 09:00:00 (Sun)
  63940701600, #      utc_end 2027-03-14 10:00:00 (Sun)
  63929178000, #  local_start 2026-11-01 01:00:00 (Sun)
  63940672800, #    local_end 2027-03-14 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63940701600, #    utc_start 2027-03-14 10:00:00 (Sun)
  63961261200, #      utc_end 2027-11-07 09:00:00 (Sun)
  63940676400, #  local_start 2027-03-14 03:00:00 (Sun)
  63961236000, #    local_end 2027-11-07 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63961261200, #    utc_start 2027-11-07 09:00:00 (Sun)
  63972151200, #      utc_end 2028-03-12 10:00:00 (Sun)
  63961232400, #  local_start 2027-11-07 01:00:00 (Sun)
  63972122400, #    local_end 2028-03-12 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63972151200, #    utc_start 2028-03-12 10:00:00 (Sun)
  63992710800, #      utc_end 2028-11-05 09:00:00 (Sun)
  63972126000, #  local_start 2028-03-12 03:00:00 (Sun)
  63992685600, #    local_end 2028-11-05 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63992710800, #    utc_start 2028-11-05 09:00:00 (Sun)
  64003600800, #      utc_end 2029-03-11 10:00:00 (Sun)
  63992682000, #  local_start 2028-11-05 01:00:00 (Sun)
  64003572000, #    local_end 2029-03-11 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  64003600800, #    utc_start 2029-03-11 10:00:00 (Sun)
  64024160400, #      utc_end 2029-11-04 09:00:00 (Sun)
  64003575600, #  local_start 2029-03-11 03:00:00 (Sun)
  64024135200, #    local_end 2029-11-04 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  64024160400, #    utc_start 2029-11-04 09:00:00 (Sun)
  64035050400, #      utc_end 2030-03-10 10:00:00 (Sun)
  64024131600, #  local_start 2029-11-04 01:00:00 (Sun)
  64035021600, #    local_end 2030-03-10 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  64035050400, #    utc_start 2030-03-10 10:00:00 (Sun)
  64055610000, #      utc_end 2030-11-03 09:00:00 (Sun)
  64035025200, #  local_start 2030-03-10 03:00:00 (Sun)
  64055584800, #    local_end 2030-11-03 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {56}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -28800 }
  
  my $last_observance = bless( {
    'format' => 'P%sT',
    'gmtoff' => '-8:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 722815,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 722815,
      'utc_rd_secs' => 0,
      'utc_year' => 1981
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -28800,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 722815,
      'local_rd_secs' => 28800,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 722815,
      'utc_rd_secs' => 28800,
      'utc_year' => 1981
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Nov',
      'letter' => 'S',
      'name' => 'Canada',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Mar',
      'letter' => 'D',
      'name' => 'Canada',
      'offset_from_std' => 3600,
      'on' => 'Sun>=8',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_WHITEHORSE

    $main::fatpacked{"DateTime/TimeZone/America/Winnipeg.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_WINNIPEG';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Winnipeg;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Winnipeg::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59533424916, #      utc_end 1887-07-16 06:28:36 (Sat)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59533401600, #    local_end 1887-07-16 00:00:00 (Sat)
  -23316,
  0,
  'LMT',
      ],
      [
  59533424916, #    utc_start 1887-07-16 06:28:36 (Sat)
  60441314400, #      utc_end 1916-04-23 06:00:00 (Sun)
  59533403316, #  local_start 1887-07-16 00:28:36 (Sat)
  60441292800, #    local_end 1916-04-23 00:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  60441314400, #    utc_start 1916-04-23 06:00:00 (Sun)
  60454011600, #      utc_end 1916-09-17 05:00:00 (Sun)
  60441296400, #  local_start 1916-04-23 01:00:00 (Sun)
  60453993600, #    local_end 1916-09-17 00:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  60454011600, #    utc_start 1916-09-17 05:00:00 (Sun)
  60503616000, #      utc_end 1918-04-14 08:00:00 (Sun)
  60453990000, #  local_start 1916-09-16 23:00:00 (Sat)
  60503594400, #    local_end 1918-04-14 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  60503616000, #    utc_start 1918-04-14 08:00:00 (Sun)
  60520546800, #      utc_end 1918-10-27 07:00:00 (Sun)
  60503598000, #  local_start 1918-04-14 03:00:00 (Sun)
  60520528800, #    local_end 1918-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  60520546800, #    utc_start 1918-10-27 07:00:00 (Sun)
  61105996800, #      utc_end 1937-05-16 08:00:00 (Sun)
  60520525200, #  local_start 1918-10-27 01:00:00 (Sun)
  61105975200, #    local_end 1937-05-16 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61105996800, #    utc_start 1937-05-16 08:00:00 (Sun)
  61117484400, #      utc_end 1937-09-26 07:00:00 (Sun)
  61105978800, #  local_start 1937-05-16 03:00:00 (Sun)
  61117466400, #    local_end 1937-09-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61117484400, #    utc_start 1937-09-26 07:00:00 (Sun)
  61255468800, #      utc_end 1942-02-09 08:00:00 (Mon)
  61117462800, #  local_start 1937-09-26 01:00:00 (Sun)
  61255447200, #    local_end 1942-02-09 02:00:00 (Mon)
  -21600,
  0,
  'CST',
      ],
      [
  61255468800, #    utc_start 1942-02-09 08:00:00 (Mon)
  61366287600, #      utc_end 1945-08-14 23:00:00 (Tue)
  61255450800, #  local_start 1942-02-09 03:00:00 (Mon)
  61366269600, #    local_end 1945-08-14 18:00:00 (Tue)
  -18000,
  1,
  'CWT',
      ],
      [
  61366287600, #    utc_start 1945-08-14 23:00:00 (Tue)
  61370290800, #      utc_end 1945-09-30 07:00:00 (Sun)
  61366269600, #  local_start 1945-08-14 18:00:00 (Tue)
  61370272800, #    local_end 1945-09-30 02:00:00 (Sun)
  -18000,
  1,
  'CPT',
      ],
      [
  61370290800, #    utc_start 1945-09-30 07:00:00 (Sun)
  61389648000, #      utc_end 1946-05-12 08:00:00 (Sun)
  61370269200, #  local_start 1945-09-30 01:00:00 (Sun)
  61389626400, #    local_end 1946-05-12 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61389648000, #    utc_start 1946-05-12 08:00:00 (Sun)
  61402950000, #      utc_end 1946-10-13 07:00:00 (Sun)
  61389630000, #  local_start 1946-05-12 03:00:00 (Sun)
  61402932000, #    local_end 1946-10-13 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61402950000, #    utc_start 1946-10-13 07:00:00 (Sun)
  61419888000, #      utc_end 1947-04-27 08:00:00 (Sun)
  61402928400, #  local_start 1946-10-13 01:00:00 (Sun)
  61419866400, #    local_end 1947-04-27 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61419888000, #    utc_start 1947-04-27 08:00:00 (Sun)
  61433190000, #      utc_end 1947-09-28 07:00:00 (Sun)
  61419870000, #  local_start 1947-04-27 03:00:00 (Sun)
  61433172000, #    local_end 1947-09-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61433190000, #    utc_start 1947-09-28 07:00:00 (Sun)
  61451337600, #      utc_end 1948-04-25 08:00:00 (Sun)
  61433168400, #  local_start 1947-09-28 01:00:00 (Sun)
  61451316000, #    local_end 1948-04-25 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61451337600, #    utc_start 1948-04-25 08:00:00 (Sun)
  61464639600, #      utc_end 1948-09-26 07:00:00 (Sun)
  61451319600, #  local_start 1948-04-25 03:00:00 (Sun)
  61464621600, #    local_end 1948-09-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61464639600, #    utc_start 1948-09-26 07:00:00 (Sun)
  61482787200, #      utc_end 1949-04-24 08:00:00 (Sun)
  61464618000, #  local_start 1948-09-26 01:00:00 (Sun)
  61482765600, #    local_end 1949-04-24 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61482787200, #    utc_start 1949-04-24 08:00:00 (Sun)
  61496089200, #      utc_end 1949-09-25 07:00:00 (Sun)
  61482769200, #  local_start 1949-04-24 03:00:00 (Sun)
  61496071200, #    local_end 1949-09-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61496089200, #    utc_start 1949-09-25 07:00:00 (Sun)
  61514928000, #      utc_end 1950-05-01 08:00:00 (Mon)
  61496067600, #  local_start 1949-09-25 01:00:00 (Sun)
  61514906400, #    local_end 1950-05-01 02:00:00 (Mon)
  -21600,
  0,
  'CST',
      ],
      [
  61514928000, #    utc_start 1950-05-01 08:00:00 (Mon)
  61528057200, #      utc_end 1950-09-30 07:00:00 (Sat)
  61514910000, #  local_start 1950-05-01 03:00:00 (Mon)
  61528039200, #    local_end 1950-09-30 02:00:00 (Sat)
  -18000,
  1,
  'CDT',
      ],
      [
  61528057200, #    utc_start 1950-09-30 07:00:00 (Sat)
  61546291200, #      utc_end 1951-04-29 08:00:00 (Sun)
  61528035600, #  local_start 1950-09-30 01:00:00 (Sat)
  61546269600, #    local_end 1951-04-29 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61546291200, #    utc_start 1951-04-29 08:00:00 (Sun)
  61559593200, #      utc_end 1951-09-30 07:00:00 (Sun)
  61546273200, #  local_start 1951-04-29 03:00:00 (Sun)
  61559575200, #    local_end 1951-09-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61559593200, #    utc_start 1951-09-30 07:00:00 (Sun)
  61577740800, #      utc_end 1952-04-27 08:00:00 (Sun)
  61559571600, #  local_start 1951-09-30 01:00:00 (Sun)
  61577719200, #    local_end 1952-04-27 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61577740800, #    utc_start 1952-04-27 08:00:00 (Sun)
  61591042800, #      utc_end 1952-09-28 07:00:00 (Sun)
  61577722800, #  local_start 1952-04-27 03:00:00 (Sun)
  61591024800, #    local_end 1952-09-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61591042800, #    utc_start 1952-09-28 07:00:00 (Sun)
  61609190400, #      utc_end 1953-04-26 08:00:00 (Sun)
  61591021200, #  local_start 1952-09-28 01:00:00 (Sun)
  61609168800, #    local_end 1953-04-26 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61609190400, #    utc_start 1953-04-26 08:00:00 (Sun)
  61622492400, #      utc_end 1953-09-27 07:00:00 (Sun)
  61609172400, #  local_start 1953-04-26 03:00:00 (Sun)
  61622474400, #    local_end 1953-09-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61622492400, #    utc_start 1953-09-27 07:00:00 (Sun)
  61640640000, #      utc_end 1954-04-25 08:00:00 (Sun)
  61622470800, #  local_start 1953-09-27 01:00:00 (Sun)
  61640618400, #    local_end 1954-04-25 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61640640000, #    utc_start 1954-04-25 08:00:00 (Sun)
  61653942000, #      utc_end 1954-09-26 07:00:00 (Sun)
  61640622000, #  local_start 1954-04-25 03:00:00 (Sun)
  61653924000, #    local_end 1954-09-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61653942000, #    utc_start 1954-09-26 07:00:00 (Sun)
  61672089600, #      utc_end 1955-04-24 08:00:00 (Sun)
  61653920400, #  local_start 1954-09-26 01:00:00 (Sun)
  61672068000, #    local_end 1955-04-24 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61672089600, #    utc_start 1955-04-24 08:00:00 (Sun)
  61685391600, #      utc_end 1955-09-25 07:00:00 (Sun)
  61672071600, #  local_start 1955-04-24 03:00:00 (Sun)
  61685373600, #    local_end 1955-09-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61685391600, #    utc_start 1955-09-25 07:00:00 (Sun)
  61704144000, #      utc_end 1956-04-29 08:00:00 (Sun)
  61685370000, #  local_start 1955-09-25 01:00:00 (Sun)
  61704122400, #    local_end 1956-04-29 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61704144000, #    utc_start 1956-04-29 08:00:00 (Sun)
  61717446000, #      utc_end 1956-09-30 07:00:00 (Sun)
  61704126000, #  local_start 1956-04-29 03:00:00 (Sun)
  61717428000, #    local_end 1956-09-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61717446000, #    utc_start 1956-09-30 07:00:00 (Sun)
  61735593600, #      utc_end 1957-04-28 08:00:00 (Sun)
  61717424400, #  local_start 1956-09-30 01:00:00 (Sun)
  61735572000, #    local_end 1957-04-28 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61735593600, #    utc_start 1957-04-28 08:00:00 (Sun)
  61748895600, #      utc_end 1957-09-29 07:00:00 (Sun)
  61735575600, #  local_start 1957-04-28 03:00:00 (Sun)
  61748877600, #    local_end 1957-09-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61748895600, #    utc_start 1957-09-29 07:00:00 (Sun)
  61767043200, #      utc_end 1958-04-27 08:00:00 (Sun)
  61748874000, #  local_start 1957-09-29 01:00:00 (Sun)
  61767021600, #    local_end 1958-04-27 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61767043200, #    utc_start 1958-04-27 08:00:00 (Sun)
  61780345200, #      utc_end 1958-09-28 07:00:00 (Sun)
  61767025200, #  local_start 1958-04-27 03:00:00 (Sun)
  61780327200, #    local_end 1958-09-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61780345200, #    utc_start 1958-09-28 07:00:00 (Sun)
  61798492800, #      utc_end 1959-04-26 08:00:00 (Sun)
  61780323600, #  local_start 1958-09-28 01:00:00 (Sun)
  61798471200, #    local_end 1959-04-26 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61798492800, #    utc_start 1959-04-26 08:00:00 (Sun)
  61814214000, #      utc_end 1959-10-25 07:00:00 (Sun)
  61798474800, #  local_start 1959-04-26 03:00:00 (Sun)
  61814196000, #    local_end 1959-10-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61814214000, #    utc_start 1959-10-25 07:00:00 (Sun)
  61829942400, #      utc_end 1960-04-24 08:00:00 (Sun)
  61814192400, #  local_start 1959-10-25 01:00:00 (Sun)
  61829920800, #    local_end 1960-04-24 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61829942400, #    utc_start 1960-04-24 08:00:00 (Sun)
  61843244400, #      utc_end 1960-09-25 07:00:00 (Sun)
  61829924400, #  local_start 1960-04-24 03:00:00 (Sun)
  61843226400, #    local_end 1960-09-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61843244400, #    utc_start 1960-09-25 07:00:00 (Sun)
  61924896000, #      utc_end 1963-04-28 08:00:00 (Sun)
  61843222800, #  local_start 1960-09-25 01:00:00 (Sun)
  61924874400, #    local_end 1963-04-28 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  61924896000, #    utc_start 1963-04-28 08:00:00 (Sun)
  61937593200, #      utc_end 1963-09-22 07:00:00 (Sun)
  61924878000, #  local_start 1963-04-28 03:00:00 (Sun)
  61937575200, #    local_end 1963-09-22 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  61937593200, #    utc_start 1963-09-22 07:00:00 (Sun)
  62019244800, #      utc_end 1966-04-24 08:00:00 (Sun)
  61937571600, #  local_start 1963-09-22 01:00:00 (Sun)
  62019223200, #    local_end 1966-04-24 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62019244800, #    utc_start 1966-04-24 08:00:00 (Sun)
  62035574400, #      utc_end 1966-10-30 08:00:00 (Sun)
  62019226800, #  local_start 1966-04-24 03:00:00 (Sun)
  62035556400, #    local_end 1966-10-30 03:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62035574400, #    utc_start 1966-10-30 08:00:00 (Sun)
  62051299200, #      utc_end 1967-04-30 08:00:00 (Sun)
  62035552800, #  local_start 1966-10-30 02:00:00 (Sun)
  62051277600, #    local_end 1967-04-30 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62051299200, #    utc_start 1967-04-30 08:00:00 (Sun)
  62067024000, #      utc_end 1967-10-29 08:00:00 (Sun)
  62051281200, #  local_start 1967-04-30 03:00:00 (Sun)
  62067006000, #    local_end 1967-10-29 03:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62067024000, #    utc_start 1967-10-29 08:00:00 (Sun)
  62082748800, #      utc_end 1968-04-28 08:00:00 (Sun)
  62067002400, #  local_start 1967-10-29 02:00:00 (Sun)
  62082727200, #    local_end 1968-04-28 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62082748800, #    utc_start 1968-04-28 08:00:00 (Sun)
  62098473600, #      utc_end 1968-10-27 08:00:00 (Sun)
  62082730800, #  local_start 1968-04-28 03:00:00 (Sun)
  62098455600, #    local_end 1968-10-27 03:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62098473600, #    utc_start 1968-10-27 08:00:00 (Sun)
  62114198400, #      utc_end 1969-04-27 08:00:00 (Sun)
  62098452000, #  local_start 1968-10-27 02:00:00 (Sun)
  62114176800, #    local_end 1969-04-27 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62114198400, #    utc_start 1969-04-27 08:00:00 (Sun)
  62129923200, #      utc_end 1969-10-26 08:00:00 (Sun)
  62114180400, #  local_start 1969-04-27 03:00:00 (Sun)
  62129905200, #    local_end 1969-10-26 03:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62129923200, #    utc_start 1969-10-26 08:00:00 (Sun)
  62145648000, #      utc_end 1970-04-26 08:00:00 (Sun)
  62129901600, #  local_start 1969-10-26 02:00:00 (Sun)
  62145626400, #    local_end 1970-04-26 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62145648000, #    utc_start 1970-04-26 08:00:00 (Sun)
  62161372800, #      utc_end 1970-10-25 08:00:00 (Sun)
  62145630000, #  local_start 1970-04-26 03:00:00 (Sun)
  62161354800, #    local_end 1970-10-25 03:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62161372800, #    utc_start 1970-10-25 08:00:00 (Sun)
  62177097600, #      utc_end 1971-04-25 08:00:00 (Sun)
  62161351200, #  local_start 1970-10-25 02:00:00 (Sun)
  62177076000, #    local_end 1971-04-25 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62177097600, #    utc_start 1971-04-25 08:00:00 (Sun)
  62193427200, #      utc_end 1971-10-31 08:00:00 (Sun)
  62177079600, #  local_start 1971-04-25 03:00:00 (Sun)
  62193409200, #    local_end 1971-10-31 03:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62193427200, #    utc_start 1971-10-31 08:00:00 (Sun)
  62209152000, #      utc_end 1972-04-30 08:00:00 (Sun)
  62193405600, #  local_start 1971-10-31 02:00:00 (Sun)
  62209130400, #    local_end 1972-04-30 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62209152000, #    utc_start 1972-04-30 08:00:00 (Sun)
  62224876800, #      utc_end 1972-10-29 08:00:00 (Sun)
  62209134000, #  local_start 1972-04-30 03:00:00 (Sun)
  62224858800, #    local_end 1972-10-29 03:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62224876800, #    utc_start 1972-10-29 08:00:00 (Sun)
  62240601600, #      utc_end 1973-04-29 08:00:00 (Sun)
  62224855200, #  local_start 1972-10-29 02:00:00 (Sun)
  62240580000, #    local_end 1973-04-29 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62240601600, #    utc_start 1973-04-29 08:00:00 (Sun)
  62256326400, #      utc_end 1973-10-28 08:00:00 (Sun)
  62240583600, #  local_start 1973-04-29 03:00:00 (Sun)
  62256308400, #    local_end 1973-10-28 03:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62256326400, #    utc_start 1973-10-28 08:00:00 (Sun)
  62272051200, #      utc_end 1974-04-28 08:00:00 (Sun)
  62256304800, #  local_start 1973-10-28 02:00:00 (Sun)
  62272029600, #    local_end 1974-04-28 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62272051200, #    utc_start 1974-04-28 08:00:00 (Sun)
  62287776000, #      utc_end 1974-10-27 08:00:00 (Sun)
  62272033200, #  local_start 1974-04-28 03:00:00 (Sun)
  62287758000, #    local_end 1974-10-27 03:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62287776000, #    utc_start 1974-10-27 08:00:00 (Sun)
  62303500800, #      utc_end 1975-04-27 08:00:00 (Sun)
  62287754400, #  local_start 1974-10-27 02:00:00 (Sun)
  62303479200, #    local_end 1975-04-27 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62303500800, #    utc_start 1975-04-27 08:00:00 (Sun)
  62319225600, #      utc_end 1975-10-26 08:00:00 (Sun)
  62303482800, #  local_start 1975-04-27 03:00:00 (Sun)
  62319207600, #    local_end 1975-10-26 03:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62319225600, #    utc_start 1975-10-26 08:00:00 (Sun)
  62334950400, #      utc_end 1976-04-25 08:00:00 (Sun)
  62319204000, #  local_start 1975-10-26 02:00:00 (Sun)
  62334928800, #    local_end 1976-04-25 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62334950400, #    utc_start 1976-04-25 08:00:00 (Sun)
  62351280000, #      utc_end 1976-10-31 08:00:00 (Sun)
  62334932400, #  local_start 1976-04-25 03:00:00 (Sun)
  62351262000, #    local_end 1976-10-31 03:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62351280000, #    utc_start 1976-10-31 08:00:00 (Sun)
  62366400000, #      utc_end 1977-04-24 08:00:00 (Sun)
  62351258400, #  local_start 1976-10-31 02:00:00 (Sun)
  62366378400, #    local_end 1977-04-24 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62366400000, #    utc_start 1977-04-24 08:00:00 (Sun)
  62382729600, #      utc_end 1977-10-30 08:00:00 (Sun)
  62366382000, #  local_start 1977-04-24 03:00:00 (Sun)
  62382711600, #    local_end 1977-10-30 03:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62382729600, #    utc_start 1977-10-30 08:00:00 (Sun)
  62398454400, #      utc_end 1978-04-30 08:00:00 (Sun)
  62382708000, #  local_start 1977-10-30 02:00:00 (Sun)
  62398432800, #    local_end 1978-04-30 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62398454400, #    utc_start 1978-04-30 08:00:00 (Sun)
  62414179200, #      utc_end 1978-10-29 08:00:00 (Sun)
  62398436400, #  local_start 1978-04-30 03:00:00 (Sun)
  62414161200, #    local_end 1978-10-29 03:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62414179200, #    utc_start 1978-10-29 08:00:00 (Sun)
  62429904000, #      utc_end 1979-04-29 08:00:00 (Sun)
  62414157600, #  local_start 1978-10-29 02:00:00 (Sun)
  62429882400, #    local_end 1979-04-29 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62429904000, #    utc_start 1979-04-29 08:00:00 (Sun)
  62445628800, #      utc_end 1979-10-28 08:00:00 (Sun)
  62429886000, #  local_start 1979-04-29 03:00:00 (Sun)
  62445610800, #    local_end 1979-10-28 03:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62445628800, #    utc_start 1979-10-28 08:00:00 (Sun)
  62461353600, #      utc_end 1980-04-27 08:00:00 (Sun)
  62445607200, #  local_start 1979-10-28 02:00:00 (Sun)
  62461332000, #    local_end 1980-04-27 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62461353600, #    utc_start 1980-04-27 08:00:00 (Sun)
  62477078400, #      utc_end 1980-10-26 08:00:00 (Sun)
  62461335600, #  local_start 1980-04-27 03:00:00 (Sun)
  62477060400, #    local_end 1980-10-26 03:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62477078400, #    utc_start 1980-10-26 08:00:00 (Sun)
  62492803200, #      utc_end 1981-04-26 08:00:00 (Sun)
  62477056800, #  local_start 1980-10-26 02:00:00 (Sun)
  62492781600, #    local_end 1981-04-26 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62492803200, #    utc_start 1981-04-26 08:00:00 (Sun)
  62508528000, #      utc_end 1981-10-25 08:00:00 (Sun)
  62492785200, #  local_start 1981-04-26 03:00:00 (Sun)
  62508510000, #    local_end 1981-10-25 03:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62508528000, #    utc_start 1981-10-25 08:00:00 (Sun)
  62524252800, #      utc_end 1982-04-25 08:00:00 (Sun)
  62508506400, #  local_start 1981-10-25 02:00:00 (Sun)
  62524231200, #    local_end 1982-04-25 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62524252800, #    utc_start 1982-04-25 08:00:00 (Sun)
  62540582400, #      utc_end 1982-10-31 08:00:00 (Sun)
  62524234800, #  local_start 1982-04-25 03:00:00 (Sun)
  62540564400, #    local_end 1982-10-31 03:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62540582400, #    utc_start 1982-10-31 08:00:00 (Sun)
  62555702400, #      utc_end 1983-04-24 08:00:00 (Sun)
  62540560800, #  local_start 1982-10-31 02:00:00 (Sun)
  62555680800, #    local_end 1983-04-24 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62555702400, #    utc_start 1983-04-24 08:00:00 (Sun)
  62572032000, #      utc_end 1983-10-30 08:00:00 (Sun)
  62555684400, #  local_start 1983-04-24 03:00:00 (Sun)
  62572014000, #    local_end 1983-10-30 03:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62572032000, #    utc_start 1983-10-30 08:00:00 (Sun)
  62587756800, #      utc_end 1984-04-29 08:00:00 (Sun)
  62572010400, #  local_start 1983-10-30 02:00:00 (Sun)
  62587735200, #    local_end 1984-04-29 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62587756800, #    utc_start 1984-04-29 08:00:00 (Sun)
  62603481600, #      utc_end 1984-10-28 08:00:00 (Sun)
  62587738800, #  local_start 1984-04-29 03:00:00 (Sun)
  62603463600, #    local_end 1984-10-28 03:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62603481600, #    utc_start 1984-10-28 08:00:00 (Sun)
  62619206400, #      utc_end 1985-04-28 08:00:00 (Sun)
  62603460000, #  local_start 1984-10-28 02:00:00 (Sun)
  62619184800, #    local_end 1985-04-28 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62619206400, #    utc_start 1985-04-28 08:00:00 (Sun)
  62634931200, #      utc_end 1985-10-27 08:00:00 (Sun)
  62619188400, #  local_start 1985-04-28 03:00:00 (Sun)
  62634913200, #    local_end 1985-10-27 03:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62634931200, #    utc_start 1985-10-27 08:00:00 (Sun)
  62650656000, #      utc_end 1986-04-27 08:00:00 (Sun)
  62634909600, #  local_start 1985-10-27 02:00:00 (Sun)
  62650634400, #    local_end 1986-04-27 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62650656000, #    utc_start 1986-04-27 08:00:00 (Sun)
  62666380800, #      utc_end 1986-10-26 08:00:00 (Sun)
  62650638000, #  local_start 1986-04-27 03:00:00 (Sun)
  62666362800, #    local_end 1986-10-26 03:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62666380800, #    utc_start 1986-10-26 08:00:00 (Sun)
  62680291200, #      utc_end 1987-04-05 08:00:00 (Sun)
  62666359200, #  local_start 1986-10-26 02:00:00 (Sun)
  62680269600, #    local_end 1987-04-05 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62680291200, #    utc_start 1987-04-05 08:00:00 (Sun)
  62697830400, #      utc_end 1987-10-25 08:00:00 (Sun)
  62680273200, #  local_start 1987-04-05 03:00:00 (Sun)
  62697812400, #    local_end 1987-10-25 03:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62697830400, #    utc_start 1987-10-25 08:00:00 (Sun)
  62711740800, #      utc_end 1988-04-03 08:00:00 (Sun)
  62697808800, #  local_start 1987-10-25 02:00:00 (Sun)
  62711719200, #    local_end 1988-04-03 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62711740800, #    utc_start 1988-04-03 08:00:00 (Sun)
  62729884800, #      utc_end 1988-10-30 08:00:00 (Sun)
  62711722800, #  local_start 1988-04-03 03:00:00 (Sun)
  62729866800, #    local_end 1988-10-30 03:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62729884800, #    utc_start 1988-10-30 08:00:00 (Sun)
  62743190400, #      utc_end 1989-04-02 08:00:00 (Sun)
  62729863200, #  local_start 1988-10-30 02:00:00 (Sun)
  62743168800, #    local_end 1989-04-02 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62743190400, #    utc_start 1989-04-02 08:00:00 (Sun)
  62761334400, #      utc_end 1989-10-29 08:00:00 (Sun)
  62743172400, #  local_start 1989-04-02 03:00:00 (Sun)
  62761316400, #    local_end 1989-10-29 03:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62761334400, #    utc_start 1989-10-29 08:00:00 (Sun)
  62774640000, #      utc_end 1990-04-01 08:00:00 (Sun)
  62761312800, #  local_start 1989-10-29 02:00:00 (Sun)
  62774618400, #    local_end 1990-04-01 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62774640000, #    utc_start 1990-04-01 08:00:00 (Sun)
  62792784000, #      utc_end 1990-10-28 08:00:00 (Sun)
  62774622000, #  local_start 1990-04-01 03:00:00 (Sun)
  62792766000, #    local_end 1990-10-28 03:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62792784000, #    utc_start 1990-10-28 08:00:00 (Sun)
  62806694400, #      utc_end 1991-04-07 08:00:00 (Sun)
  62792762400, #  local_start 1990-10-28 02:00:00 (Sun)
  62806672800, #    local_end 1991-04-07 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62806694400, #    utc_start 1991-04-07 08:00:00 (Sun)
  62824233600, #      utc_end 1991-10-27 08:00:00 (Sun)
  62806676400, #  local_start 1991-04-07 03:00:00 (Sun)
  62824215600, #    local_end 1991-10-27 03:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62824233600, #    utc_start 1991-10-27 08:00:00 (Sun)
  62838144000, #      utc_end 1992-04-05 08:00:00 (Sun)
  62824212000, #  local_start 1991-10-27 02:00:00 (Sun)
  62838122400, #    local_end 1992-04-05 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62838144000, #    utc_start 1992-04-05 08:00:00 (Sun)
  62855683200, #      utc_end 1992-10-25 08:00:00 (Sun)
  62838126000, #  local_start 1992-04-05 03:00:00 (Sun)
  62855665200, #    local_end 1992-10-25 03:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62855683200, #    utc_start 1992-10-25 08:00:00 (Sun)
  62869593600, #      utc_end 1993-04-04 08:00:00 (Sun)
  62855661600, #  local_start 1992-10-25 02:00:00 (Sun)
  62869572000, #    local_end 1993-04-04 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62869593600, #    utc_start 1993-04-04 08:00:00 (Sun)
  62887737600, #      utc_end 1993-10-31 08:00:00 (Sun)
  62869575600, #  local_start 1993-04-04 03:00:00 (Sun)
  62887719600, #    local_end 1993-10-31 03:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62887737600, #    utc_start 1993-10-31 08:00:00 (Sun)
  62901043200, #      utc_end 1994-04-03 08:00:00 (Sun)
  62887716000, #  local_start 1993-10-31 02:00:00 (Sun)
  62901021600, #    local_end 1994-04-03 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62901043200, #    utc_start 1994-04-03 08:00:00 (Sun)
  62919187200, #      utc_end 1994-10-30 08:00:00 (Sun)
  62901025200, #  local_start 1994-04-03 03:00:00 (Sun)
  62919169200, #    local_end 1994-10-30 03:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62919187200, #    utc_start 1994-10-30 08:00:00 (Sun)
  62932492800, #      utc_end 1995-04-02 08:00:00 (Sun)
  62919165600, #  local_start 1994-10-30 02:00:00 (Sun)
  62932471200, #    local_end 1995-04-02 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62932492800, #    utc_start 1995-04-02 08:00:00 (Sun)
  62950636800, #      utc_end 1995-10-29 08:00:00 (Sun)
  62932474800, #  local_start 1995-04-02 03:00:00 (Sun)
  62950618800, #    local_end 1995-10-29 03:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62950636800, #    utc_start 1995-10-29 08:00:00 (Sun)
  62964547200, #      utc_end 1996-04-07 08:00:00 (Sun)
  62950615200, #  local_start 1995-10-29 02:00:00 (Sun)
  62964525600, #    local_end 1996-04-07 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62964547200, #    utc_start 1996-04-07 08:00:00 (Sun)
  62982086400, #      utc_end 1996-10-27 08:00:00 (Sun)
  62964529200, #  local_start 1996-04-07 03:00:00 (Sun)
  62982068400, #    local_end 1996-10-27 03:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62982086400, #    utc_start 1996-10-27 08:00:00 (Sun)
  62995996800, #      utc_end 1997-04-06 08:00:00 (Sun)
  62982064800, #  local_start 1996-10-27 02:00:00 (Sun)
  62995975200, #    local_end 1997-04-06 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62995996800, #    utc_start 1997-04-06 08:00:00 (Sun)
  63013536000, #      utc_end 1997-10-26 08:00:00 (Sun)
  62995978800, #  local_start 1997-04-06 03:00:00 (Sun)
  63013518000, #    local_end 1997-10-26 03:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63013536000, #    utc_start 1997-10-26 08:00:00 (Sun)
  63027446400, #      utc_end 1998-04-05 08:00:00 (Sun)
  63013514400, #  local_start 1997-10-26 02:00:00 (Sun)
  63027424800, #    local_end 1998-04-05 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63027446400, #    utc_start 1998-04-05 08:00:00 (Sun)
  63044985600, #      utc_end 1998-10-25 08:00:00 (Sun)
  63027428400, #  local_start 1998-04-05 03:00:00 (Sun)
  63044967600, #    local_end 1998-10-25 03:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63044985600, #    utc_start 1998-10-25 08:00:00 (Sun)
  63058896000, #      utc_end 1999-04-04 08:00:00 (Sun)
  63044964000, #  local_start 1998-10-25 02:00:00 (Sun)
  63058874400, #    local_end 1999-04-04 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63058896000, #    utc_start 1999-04-04 08:00:00 (Sun)
  63077040000, #      utc_end 1999-10-31 08:00:00 (Sun)
  63058878000, #  local_start 1999-04-04 03:00:00 (Sun)
  63077022000, #    local_end 1999-10-31 03:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63077040000, #    utc_start 1999-10-31 08:00:00 (Sun)
  63090345600, #      utc_end 2000-04-02 08:00:00 (Sun)
  63077018400, #  local_start 1999-10-31 02:00:00 (Sun)
  63090324000, #    local_end 2000-04-02 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63090345600, #    utc_start 2000-04-02 08:00:00 (Sun)
  63108489600, #      utc_end 2000-10-29 08:00:00 (Sun)
  63090327600, #  local_start 2000-04-02 03:00:00 (Sun)
  63108471600, #    local_end 2000-10-29 03:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63108489600, #    utc_start 2000-10-29 08:00:00 (Sun)
  63121795200, #      utc_end 2001-04-01 08:00:00 (Sun)
  63108468000, #  local_start 2000-10-29 02:00:00 (Sun)
  63121773600, #    local_end 2001-04-01 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63121795200, #    utc_start 2001-04-01 08:00:00 (Sun)
  63139939200, #      utc_end 2001-10-28 08:00:00 (Sun)
  63121777200, #  local_start 2001-04-01 03:00:00 (Sun)
  63139921200, #    local_end 2001-10-28 03:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63139939200, #    utc_start 2001-10-28 08:00:00 (Sun)
  63153849600, #      utc_end 2002-04-07 08:00:00 (Sun)
  63139917600, #  local_start 2001-10-28 02:00:00 (Sun)
  63153828000, #    local_end 2002-04-07 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63153849600, #    utc_start 2002-04-07 08:00:00 (Sun)
  63171388800, #      utc_end 2002-10-27 08:00:00 (Sun)
  63153831600, #  local_start 2002-04-07 03:00:00 (Sun)
  63171370800, #    local_end 2002-10-27 03:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63171388800, #    utc_start 2002-10-27 08:00:00 (Sun)
  63185299200, #      utc_end 2003-04-06 08:00:00 (Sun)
  63171367200, #  local_start 2002-10-27 02:00:00 (Sun)
  63185277600, #    local_end 2003-04-06 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63185299200, #    utc_start 2003-04-06 08:00:00 (Sun)
  63202838400, #      utc_end 2003-10-26 08:00:00 (Sun)
  63185281200, #  local_start 2003-04-06 03:00:00 (Sun)
  63202820400, #    local_end 2003-10-26 03:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63202838400, #    utc_start 2003-10-26 08:00:00 (Sun)
  63216748800, #      utc_end 2004-04-04 08:00:00 (Sun)
  63202816800, #  local_start 2003-10-26 02:00:00 (Sun)
  63216727200, #    local_end 2004-04-04 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63216748800, #    utc_start 2004-04-04 08:00:00 (Sun)
  63234892800, #      utc_end 2004-10-31 08:00:00 (Sun)
  63216730800, #  local_start 2004-04-04 03:00:00 (Sun)
  63234874800, #    local_end 2004-10-31 03:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63234892800, #    utc_start 2004-10-31 08:00:00 (Sun)
  63248198400, #      utc_end 2005-04-03 08:00:00 (Sun)
  63234871200, #  local_start 2004-10-31 02:00:00 (Sun)
  63248176800, #    local_end 2005-04-03 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63248198400, #    utc_start 2005-04-03 08:00:00 (Sun)
  63266342400, #      utc_end 2005-10-30 08:00:00 (Sun)
  63248180400, #  local_start 2005-04-03 03:00:00 (Sun)
  63266324400, #    local_end 2005-10-30 03:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63266342400, #    utc_start 2005-10-30 08:00:00 (Sun)
  63271778400, #      utc_end 2006-01-01 06:00:00 (Sun)
  63266320800, #  local_start 2005-10-30 02:00:00 (Sun)
  63271756800, #    local_end 2006-01-01 00:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63271778400, #    utc_start 2006-01-01 06:00:00 (Sun)
  63279648000, #      utc_end 2006-04-02 08:00:00 (Sun)
  63271756800, #  local_start 2006-01-01 00:00:00 (Sun)
  63279626400, #    local_end 2006-04-02 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63279648000, #    utc_start 2006-04-02 08:00:00 (Sun)
  63297788400, #      utc_end 2006-10-29 07:00:00 (Sun)
  63279630000, #  local_start 2006-04-02 03:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63297788400, #    utc_start 2006-10-29 07:00:00 (Sun)
  63309283200, #      utc_end 2007-03-11 08:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63309261600, #    local_end 2007-03-11 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63309283200, #    utc_start 2007-03-11 08:00:00 (Sun)
  63329842800, #      utc_end 2007-11-04 07:00:00 (Sun)
  63309265200, #  local_start 2007-03-11 03:00:00 (Sun)
  63329824800, #    local_end 2007-11-04 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63329842800, #    utc_start 2007-11-04 07:00:00 (Sun)
  63340732800, #      utc_end 2008-03-09 08:00:00 (Sun)
  63329821200, #  local_start 2007-11-04 01:00:00 (Sun)
  63340711200, #    local_end 2008-03-09 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63340732800, #    utc_start 2008-03-09 08:00:00 (Sun)
  63361292400, #      utc_end 2008-11-02 07:00:00 (Sun)
  63340714800, #  local_start 2008-03-09 03:00:00 (Sun)
  63361274400, #    local_end 2008-11-02 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63361292400, #    utc_start 2008-11-02 07:00:00 (Sun)
  63372182400, #      utc_end 2009-03-08 08:00:00 (Sun)
  63361270800, #  local_start 2008-11-02 01:00:00 (Sun)
  63372160800, #    local_end 2009-03-08 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63372182400, #    utc_start 2009-03-08 08:00:00 (Sun)
  63392742000, #      utc_end 2009-11-01 07:00:00 (Sun)
  63372164400, #  local_start 2009-03-08 03:00:00 (Sun)
  63392724000, #    local_end 2009-11-01 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63392742000, #    utc_start 2009-11-01 07:00:00 (Sun)
  63404236800, #      utc_end 2010-03-14 08:00:00 (Sun)
  63392720400, #  local_start 2009-11-01 01:00:00 (Sun)
  63404215200, #    local_end 2010-03-14 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63404236800, #    utc_start 2010-03-14 08:00:00 (Sun)
  63424796400, #      utc_end 2010-11-07 07:00:00 (Sun)
  63404218800, #  local_start 2010-03-14 03:00:00 (Sun)
  63424778400, #    local_end 2010-11-07 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63424796400, #    utc_start 2010-11-07 07:00:00 (Sun)
  63435686400, #      utc_end 2011-03-13 08:00:00 (Sun)
  63424774800, #  local_start 2010-11-07 01:00:00 (Sun)
  63435664800, #    local_end 2011-03-13 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63435686400, #    utc_start 2011-03-13 08:00:00 (Sun)
  63456246000, #      utc_end 2011-11-06 07:00:00 (Sun)
  63435668400, #  local_start 2011-03-13 03:00:00 (Sun)
  63456228000, #    local_end 2011-11-06 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63456246000, #    utc_start 2011-11-06 07:00:00 (Sun)
  63467136000, #      utc_end 2012-03-11 08:00:00 (Sun)
  63456224400, #  local_start 2011-11-06 01:00:00 (Sun)
  63467114400, #    local_end 2012-03-11 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63467136000, #    utc_start 2012-03-11 08:00:00 (Sun)
  63487695600, #      utc_end 2012-11-04 07:00:00 (Sun)
  63467118000, #  local_start 2012-03-11 03:00:00 (Sun)
  63487677600, #    local_end 2012-11-04 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63487695600, #    utc_start 2012-11-04 07:00:00 (Sun)
  63498585600, #      utc_end 2013-03-10 08:00:00 (Sun)
  63487674000, #  local_start 2012-11-04 01:00:00 (Sun)
  63498564000, #    local_end 2013-03-10 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63498585600, #    utc_start 2013-03-10 08:00:00 (Sun)
  63519145200, #      utc_end 2013-11-03 07:00:00 (Sun)
  63498567600, #  local_start 2013-03-10 03:00:00 (Sun)
  63519127200, #    local_end 2013-11-03 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63519145200, #    utc_start 2013-11-03 07:00:00 (Sun)
  63530035200, #      utc_end 2014-03-09 08:00:00 (Sun)
  63519123600, #  local_start 2013-11-03 01:00:00 (Sun)
  63530013600, #    local_end 2014-03-09 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63530035200, #    utc_start 2014-03-09 08:00:00 (Sun)
  63550594800, #      utc_end 2014-11-02 07:00:00 (Sun)
  63530017200, #  local_start 2014-03-09 03:00:00 (Sun)
  63550576800, #    local_end 2014-11-02 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63550594800, #    utc_start 2014-11-02 07:00:00 (Sun)
  63561484800, #      utc_end 2015-03-08 08:00:00 (Sun)
  63550573200, #  local_start 2014-11-02 01:00:00 (Sun)
  63561463200, #    local_end 2015-03-08 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63561484800, #    utc_start 2015-03-08 08:00:00 (Sun)
  63582044400, #      utc_end 2015-11-01 07:00:00 (Sun)
  63561466800, #  local_start 2015-03-08 03:00:00 (Sun)
  63582026400, #    local_end 2015-11-01 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63582044400, #    utc_start 2015-11-01 07:00:00 (Sun)
  63593539200, #      utc_end 2016-03-13 08:00:00 (Sun)
  63582022800, #  local_start 2015-11-01 01:00:00 (Sun)
  63593517600, #    local_end 2016-03-13 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63593539200, #    utc_start 2016-03-13 08:00:00 (Sun)
  63614098800, #      utc_end 2016-11-06 07:00:00 (Sun)
  63593521200, #  local_start 2016-03-13 03:00:00 (Sun)
  63614080800, #    local_end 2016-11-06 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63614098800, #    utc_start 2016-11-06 07:00:00 (Sun)
  63624988800, #      utc_end 2017-03-12 08:00:00 (Sun)
  63614077200, #  local_start 2016-11-06 01:00:00 (Sun)
  63624967200, #    local_end 2017-03-12 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63624988800, #    utc_start 2017-03-12 08:00:00 (Sun)
  63645548400, #      utc_end 2017-11-05 07:00:00 (Sun)
  63624970800, #  local_start 2017-03-12 03:00:00 (Sun)
  63645530400, #    local_end 2017-11-05 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63645548400, #    utc_start 2017-11-05 07:00:00 (Sun)
  63656438400, #      utc_end 2018-03-11 08:00:00 (Sun)
  63645526800, #  local_start 2017-11-05 01:00:00 (Sun)
  63656416800, #    local_end 2018-03-11 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63656438400, #    utc_start 2018-03-11 08:00:00 (Sun)
  63676998000, #      utc_end 2018-11-04 07:00:00 (Sun)
  63656420400, #  local_start 2018-03-11 03:00:00 (Sun)
  63676980000, #    local_end 2018-11-04 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63676998000, #    utc_start 2018-11-04 07:00:00 (Sun)
  63687888000, #      utc_end 2019-03-10 08:00:00 (Sun)
  63676976400, #  local_start 2018-11-04 01:00:00 (Sun)
  63687866400, #    local_end 2019-03-10 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63687888000, #    utc_start 2019-03-10 08:00:00 (Sun)
  63708447600, #      utc_end 2019-11-03 07:00:00 (Sun)
  63687870000, #  local_start 2019-03-10 03:00:00 (Sun)
  63708429600, #    local_end 2019-11-03 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63708447600, #    utc_start 2019-11-03 07:00:00 (Sun)
  63719337600, #      utc_end 2020-03-08 08:00:00 (Sun)
  63708426000, #  local_start 2019-11-03 01:00:00 (Sun)
  63719316000, #    local_end 2020-03-08 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63719337600, #    utc_start 2020-03-08 08:00:00 (Sun)
  63739897200, #      utc_end 2020-11-01 07:00:00 (Sun)
  63719319600, #  local_start 2020-03-08 03:00:00 (Sun)
  63739879200, #    local_end 2020-11-01 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63739897200, #    utc_start 2020-11-01 07:00:00 (Sun)
  63751392000, #      utc_end 2021-03-14 08:00:00 (Sun)
  63739875600, #  local_start 2020-11-01 01:00:00 (Sun)
  63751370400, #    local_end 2021-03-14 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63751392000, #    utc_start 2021-03-14 08:00:00 (Sun)
  63771951600, #      utc_end 2021-11-07 07:00:00 (Sun)
  63751374000, #  local_start 2021-03-14 03:00:00 (Sun)
  63771933600, #    local_end 2021-11-07 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63771951600, #    utc_start 2021-11-07 07:00:00 (Sun)
  63782841600, #      utc_end 2022-03-13 08:00:00 (Sun)
  63771930000, #  local_start 2021-11-07 01:00:00 (Sun)
  63782820000, #    local_end 2022-03-13 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63782841600, #    utc_start 2022-03-13 08:00:00 (Sun)
  63803401200, #      utc_end 2022-11-06 07:00:00 (Sun)
  63782823600, #  local_start 2022-03-13 03:00:00 (Sun)
  63803383200, #    local_end 2022-11-06 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63803401200, #    utc_start 2022-11-06 07:00:00 (Sun)
  63814291200, #      utc_end 2023-03-12 08:00:00 (Sun)
  63803379600, #  local_start 2022-11-06 01:00:00 (Sun)
  63814269600, #    local_end 2023-03-12 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63814291200, #    utc_start 2023-03-12 08:00:00 (Sun)
  63834850800, #      utc_end 2023-11-05 07:00:00 (Sun)
  63814273200, #  local_start 2023-03-12 03:00:00 (Sun)
  63834832800, #    local_end 2023-11-05 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63834850800, #    utc_start 2023-11-05 07:00:00 (Sun)
  63845740800, #      utc_end 2024-03-10 08:00:00 (Sun)
  63834829200, #  local_start 2023-11-05 01:00:00 (Sun)
  63845719200, #    local_end 2024-03-10 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63845740800, #    utc_start 2024-03-10 08:00:00 (Sun)
  63866300400, #      utc_end 2024-11-03 07:00:00 (Sun)
  63845722800, #  local_start 2024-03-10 03:00:00 (Sun)
  63866282400, #    local_end 2024-11-03 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63866300400, #    utc_start 2024-11-03 07:00:00 (Sun)
  63877190400, #      utc_end 2025-03-09 08:00:00 (Sun)
  63866278800, #  local_start 2024-11-03 01:00:00 (Sun)
  63877168800, #    local_end 2025-03-09 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63877190400, #    utc_start 2025-03-09 08:00:00 (Sun)
  63897750000, #      utc_end 2025-11-02 07:00:00 (Sun)
  63877172400, #  local_start 2025-03-09 03:00:00 (Sun)
  63897732000, #    local_end 2025-11-02 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63897750000, #    utc_start 2025-11-02 07:00:00 (Sun)
  63908640000, #      utc_end 2026-03-08 08:00:00 (Sun)
  63897728400, #  local_start 2025-11-02 01:00:00 (Sun)
  63908618400, #    local_end 2026-03-08 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63908640000, #    utc_start 2026-03-08 08:00:00 (Sun)
  63929199600, #      utc_end 2026-11-01 07:00:00 (Sun)
  63908622000, #  local_start 2026-03-08 03:00:00 (Sun)
  63929181600, #    local_end 2026-11-01 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63929199600, #    utc_start 2026-11-01 07:00:00 (Sun)
  63940694400, #      utc_end 2027-03-14 08:00:00 (Sun)
  63929178000, #  local_start 2026-11-01 01:00:00 (Sun)
  63940672800, #    local_end 2027-03-14 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63940694400, #    utc_start 2027-03-14 08:00:00 (Sun)
  63961254000, #      utc_end 2027-11-07 07:00:00 (Sun)
  63940676400, #  local_start 2027-03-14 03:00:00 (Sun)
  63961236000, #    local_end 2027-11-07 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63961254000, #    utc_start 2027-11-07 07:00:00 (Sun)
  63972144000, #      utc_end 2028-03-12 08:00:00 (Sun)
  63961232400, #  local_start 2027-11-07 01:00:00 (Sun)
  63972122400, #    local_end 2028-03-12 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63972144000, #    utc_start 2028-03-12 08:00:00 (Sun)
  63992703600, #      utc_end 2028-11-05 07:00:00 (Sun)
  63972126000, #  local_start 2028-03-12 03:00:00 (Sun)
  63992685600, #    local_end 2028-11-05 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63992703600, #    utc_start 2028-11-05 07:00:00 (Sun)
  64003593600, #      utc_end 2029-03-11 08:00:00 (Sun)
  63992682000, #  local_start 2028-11-05 01:00:00 (Sun)
  64003572000, #    local_end 2029-03-11 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  64003593600, #    utc_start 2029-03-11 08:00:00 (Sun)
  64024153200, #      utc_end 2029-11-04 07:00:00 (Sun)
  64003575600, #  local_start 2029-03-11 03:00:00 (Sun)
  64024135200, #    local_end 2029-11-04 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  64024153200, #    utc_start 2029-11-04 07:00:00 (Sun)
  64035043200, #      utc_end 2030-03-10 08:00:00 (Sun)
  64024131600, #  local_start 2029-11-04 01:00:00 (Sun)
  64035021600, #    local_end 2030-03-10 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  64035043200, #    utc_start 2030-03-10 08:00:00 (Sun)
  64055602800, #      utc_end 2030-11-03 07:00:00 (Sun)
  64035025200, #  local_start 2030-03-10 03:00:00 (Sun)
  64055584800, #    local_end 2030-11-03 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {86}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -21600 }
  
  my $last_observance = bless( {
    'format' => 'C%sT',
    'gmtoff' => '-6:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 732312,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 732312,
      'utc_rd_secs' => 0,
      'utc_year' => 2007
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -21600,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 732312,
      'local_rd_secs' => 21600,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 732312,
      'utc_rd_secs' => 21600,
      'utc_year' => 2007
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Mar',
      'letter' => 'D',
      'name' => 'Canada',
      'offset_from_std' => 3600,
      'on' => 'Sun>=8',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Nov',
      'letter' => 'S',
      'name' => 'Canada',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_WINNIPEG

    $main::fatpacked{"DateTime/TimeZone/America/Yakutat.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_YAKUTAT';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Yakutat;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Yakutat::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  58910459473, #      utc_end 1867-10-19 00:31:13 (Sat)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  58910512338, #    local_end 1867-10-19 15:12:18 (Sat)
  52865,
  0,
  'LMT',
      ],
      [
  58910459473, #    utc_start 1867-10-19 00:31:13 (Sat)
  59946729535, #      utc_end 1900-08-20 21:18:55 (Mon)
  58910425938, #  local_start 1867-10-18 15:12:18 (Fri)
  59946696000, #    local_end 1900-08-20 12:00:00 (Mon)
  -33535,
  0,
  'LMT',
      ],
      [
  59946729535, #    utc_start 1900-08-20 21:18:55 (Mon)
  61252102800, #      utc_end 1942-01-01 09:00:00 (Thu)
  59946697135, #  local_start 1900-08-20 12:18:55 (Mon)
  61252070400, #    local_end 1942-01-01 00:00:00 (Thu)
  -32400,
  0,
  'YST',
      ],
      [
  61252102800, #    utc_start 1942-01-01 09:00:00 (Thu)
  61255479600, #      utc_end 1942-02-09 11:00:00 (Mon)
  61252070400, #  local_start 1942-01-01 00:00:00 (Thu)
  61255447200, #    local_end 1942-02-09 02:00:00 (Mon)
  -32400,
  0,
  'YST',
      ],
      [
  61255479600, #    utc_start 1942-02-09 11:00:00 (Mon)
  61366287600, #      utc_end 1945-08-14 23:00:00 (Tue)
  61255450800, #  local_start 1942-02-09 03:00:00 (Mon)
  61366258800, #    local_end 1945-08-14 15:00:00 (Tue)
  -28800,
  1,
  'YWT',
      ],
      [
  61366287600, #    utc_start 1945-08-14 23:00:00 (Tue)
  61370301600, #      utc_end 1945-09-30 10:00:00 (Sun)
  61366258800, #  local_start 1945-08-14 15:00:00 (Tue)
  61370272800, #    local_end 1945-09-30 02:00:00 (Sun)
  -28800,
  1,
  'YPT',
      ],
      [
  61370301600, #    utc_start 1945-09-30 10:00:00 (Sun)
  61378333200, #      utc_end 1946-01-01 09:00:00 (Tue)
  61370269200, #  local_start 1945-09-30 01:00:00 (Sun)
  61378300800, #    local_end 1946-01-01 00:00:00 (Tue)
  -32400,
  0,
  'YST',
      ],
      [
  61378333200, #    utc_start 1946-01-01 09:00:00 (Tue)
  62104179600, #      utc_end 1969-01-01 09:00:00 (Wed)
  61378300800, #  local_start 1946-01-01 00:00:00 (Tue)
  62104147200, #    local_end 1969-01-01 00:00:00 (Wed)
  -32400,
  0,
  'YST',
      ],
      [
  62104179600, #    utc_start 1969-01-01 09:00:00 (Wed)
  62114209200, #      utc_end 1969-04-27 11:00:00 (Sun)
  62104147200, #  local_start 1969-01-01 00:00:00 (Wed)
  62114176800, #    local_end 1969-04-27 02:00:00 (Sun)
  -32400,
  0,
  'YST',
      ],
      [
  62114209200, #    utc_start 1969-04-27 11:00:00 (Sun)
  62129930400, #      utc_end 1969-10-26 10:00:00 (Sun)
  62114180400, #  local_start 1969-04-27 03:00:00 (Sun)
  62129901600, #    local_end 1969-10-26 02:00:00 (Sun)
  -28800,
  1,
  'YDT',
      ],
      [
  62129930400, #    utc_start 1969-10-26 10:00:00 (Sun)
  62145658800, #      utc_end 1970-04-26 11:00:00 (Sun)
  62129898000, #  local_start 1969-10-26 01:00:00 (Sun)
  62145626400, #    local_end 1970-04-26 02:00:00 (Sun)
  -32400,
  0,
  'YST',
      ],
      [
  62145658800, #    utc_start 1970-04-26 11:00:00 (Sun)
  62161380000, #      utc_end 1970-10-25 10:00:00 (Sun)
  62145630000, #  local_start 1970-04-26 03:00:00 (Sun)
  62161351200, #    local_end 1970-10-25 02:00:00 (Sun)
  -28800,
  1,
  'YDT',
      ],
      [
  62161380000, #    utc_start 1970-10-25 10:00:00 (Sun)
  62177108400, #      utc_end 1971-04-25 11:00:00 (Sun)
  62161347600, #  local_start 1970-10-25 01:00:00 (Sun)
  62177076000, #    local_end 1971-04-25 02:00:00 (Sun)
  -32400,
  0,
  'YST',
      ],
      [
  62177108400, #    utc_start 1971-04-25 11:00:00 (Sun)
  62193434400, #      utc_end 1971-10-31 10:00:00 (Sun)
  62177079600, #  local_start 1971-04-25 03:00:00 (Sun)
  62193405600, #    local_end 1971-10-31 02:00:00 (Sun)
  -28800,
  1,
  'YDT',
      ],
      [
  62193434400, #    utc_start 1971-10-31 10:00:00 (Sun)
  62209162800, #      utc_end 1972-04-30 11:00:00 (Sun)
  62193402000, #  local_start 1971-10-31 01:00:00 (Sun)
  62209130400, #    local_end 1972-04-30 02:00:00 (Sun)
  -32400,
  0,
  'YST',
      ],
      [
  62209162800, #    utc_start 1972-04-30 11:00:00 (Sun)
  62224884000, #      utc_end 1972-10-29 10:00:00 (Sun)
  62209134000, #  local_start 1972-04-30 03:00:00 (Sun)
  62224855200, #    local_end 1972-10-29 02:00:00 (Sun)
  -28800,
  1,
  'YDT',
      ],
      [
  62224884000, #    utc_start 1972-10-29 10:00:00 (Sun)
  62240612400, #      utc_end 1973-04-29 11:00:00 (Sun)
  62224851600, #  local_start 1972-10-29 01:00:00 (Sun)
  62240580000, #    local_end 1973-04-29 02:00:00 (Sun)
  -32400,
  0,
  'YST',
      ],
      [
  62240612400, #    utc_start 1973-04-29 11:00:00 (Sun)
  62256333600, #      utc_end 1973-10-28 10:00:00 (Sun)
  62240583600, #  local_start 1973-04-29 03:00:00 (Sun)
  62256304800, #    local_end 1973-10-28 02:00:00 (Sun)
  -28800,
  1,
  'YDT',
      ],
      [
  62256333600, #    utc_start 1973-10-28 10:00:00 (Sun)
  62262385200, #      utc_end 1974-01-06 11:00:00 (Sun)
  62256301200, #  local_start 1973-10-28 01:00:00 (Sun)
  62262352800, #    local_end 1974-01-06 02:00:00 (Sun)
  -32400,
  0,
  'YST',
      ],
      [
  62262385200, #    utc_start 1974-01-06 11:00:00 (Sun)
  62287783200, #      utc_end 1974-10-27 10:00:00 (Sun)
  62262356400, #  local_start 1974-01-06 03:00:00 (Sun)
  62287754400, #    local_end 1974-10-27 02:00:00 (Sun)
  -28800,
  1,
  'YDT',
      ],
      [
  62287783200, #    utc_start 1974-10-27 10:00:00 (Sun)
  62298068400, #      utc_end 1975-02-23 11:00:00 (Sun)
  62287750800, #  local_start 1974-10-27 01:00:00 (Sun)
  62298036000, #    local_end 1975-02-23 02:00:00 (Sun)
  -32400,
  0,
  'YST',
      ],
      [
  62298068400, #    utc_start 1975-02-23 11:00:00 (Sun)
  62319232800, #      utc_end 1975-10-26 10:00:00 (Sun)
  62298039600, #  local_start 1975-02-23 03:00:00 (Sun)
  62319204000, #    local_end 1975-10-26 02:00:00 (Sun)
  -28800,
  1,
  'YDT',
      ],
      [
  62319232800, #    utc_start 1975-10-26 10:00:00 (Sun)
  62334961200, #      utc_end 1976-04-25 11:00:00 (Sun)
  62319200400, #  local_start 1975-10-26 01:00:00 (Sun)
  62334928800, #    local_end 1976-04-25 02:00:00 (Sun)
  -32400,
  0,
  'YST',
      ],
      [
  62334961200, #    utc_start 1976-04-25 11:00:00 (Sun)
  62351287200, #      utc_end 1976-10-31 10:00:00 (Sun)
  62334932400, #  local_start 1976-04-25 03:00:00 (Sun)
  62351258400, #    local_end 1976-10-31 02:00:00 (Sun)
  -28800,
  1,
  'YDT',
      ],
      [
  62351287200, #    utc_start 1976-10-31 10:00:00 (Sun)
  62366410800, #      utc_end 1977-04-24 11:00:00 (Sun)
  62351254800, #  local_start 1976-10-31 01:00:00 (Sun)
  62366378400, #    local_end 1977-04-24 02:00:00 (Sun)
  -32400,
  0,
  'YST',
      ],
      [
  62366410800, #    utc_start 1977-04-24 11:00:00 (Sun)
  62382736800, #      utc_end 1977-10-30 10:00:00 (Sun)
  62366382000, #  local_start 1977-04-24 03:00:00 (Sun)
  62382708000, #    local_end 1977-10-30 02:00:00 (Sun)
  -28800,
  1,
  'YDT',
      ],
      [
  62382736800, #    utc_start 1977-10-30 10:00:00 (Sun)
  62398465200, #      utc_end 1978-04-30 11:00:00 (Sun)
  62382704400, #  local_start 1977-10-30 01:00:00 (Sun)
  62398432800, #    local_end 1978-04-30 02:00:00 (Sun)
  -32400,
  0,
  'YST',
      ],
      [
  62398465200, #    utc_start 1978-04-30 11:00:00 (Sun)
  62414186400, #      utc_end 1978-10-29 10:00:00 (Sun)
  62398436400, #  local_start 1978-04-30 03:00:00 (Sun)
  62414157600, #    local_end 1978-10-29 02:00:00 (Sun)
  -28800,
  1,
  'YDT',
      ],
      [
  62414186400, #    utc_start 1978-10-29 10:00:00 (Sun)
  62429914800, #      utc_end 1979-04-29 11:00:00 (Sun)
  62414154000, #  local_start 1978-10-29 01:00:00 (Sun)
  62429882400, #    local_end 1979-04-29 02:00:00 (Sun)
  -32400,
  0,
  'YST',
      ],
      [
  62429914800, #    utc_start 1979-04-29 11:00:00 (Sun)
  62445636000, #      utc_end 1979-10-28 10:00:00 (Sun)
  62429886000, #  local_start 1979-04-29 03:00:00 (Sun)
  62445607200, #    local_end 1979-10-28 02:00:00 (Sun)
  -28800,
  1,
  'YDT',
      ],
      [
  62445636000, #    utc_start 1979-10-28 10:00:00 (Sun)
  62461364400, #      utc_end 1980-04-27 11:00:00 (Sun)
  62445603600, #  local_start 1979-10-28 01:00:00 (Sun)
  62461332000, #    local_end 1980-04-27 02:00:00 (Sun)
  -32400,
  0,
  'YST',
      ],
      [
  62461364400, #    utc_start 1980-04-27 11:00:00 (Sun)
  62477085600, #      utc_end 1980-10-26 10:00:00 (Sun)
  62461335600, #  local_start 1980-04-27 03:00:00 (Sun)
  62477056800, #    local_end 1980-10-26 02:00:00 (Sun)
  -28800,
  1,
  'YDT',
      ],
      [
  62477085600, #    utc_start 1980-10-26 10:00:00 (Sun)
  62492814000, #      utc_end 1981-04-26 11:00:00 (Sun)
  62477053200, #  local_start 1980-10-26 01:00:00 (Sun)
  62492781600, #    local_end 1981-04-26 02:00:00 (Sun)
  -32400,
  0,
  'YST',
      ],
      [
  62492814000, #    utc_start 1981-04-26 11:00:00 (Sun)
  62508535200, #      utc_end 1981-10-25 10:00:00 (Sun)
  62492785200, #  local_start 1981-04-26 03:00:00 (Sun)
  62508506400, #    local_end 1981-10-25 02:00:00 (Sun)
  -28800,
  1,
  'YDT',
      ],
      [
  62508535200, #    utc_start 1981-10-25 10:00:00 (Sun)
  62524263600, #      utc_end 1982-04-25 11:00:00 (Sun)
  62508502800, #  local_start 1981-10-25 01:00:00 (Sun)
  62524231200, #    local_end 1982-04-25 02:00:00 (Sun)
  -32400,
  0,
  'YST',
      ],
      [
  62524263600, #    utc_start 1982-04-25 11:00:00 (Sun)
  62540589600, #      utc_end 1982-10-31 10:00:00 (Sun)
  62524234800, #  local_start 1982-04-25 03:00:00 (Sun)
  62540560800, #    local_end 1982-10-31 02:00:00 (Sun)
  -28800,
  1,
  'YDT',
      ],
      [
  62540589600, #    utc_start 1982-10-31 10:00:00 (Sun)
  62555713200, #      utc_end 1983-04-24 11:00:00 (Sun)
  62540557200, #  local_start 1982-10-31 01:00:00 (Sun)
  62555680800, #    local_end 1983-04-24 02:00:00 (Sun)
  -32400,
  0,
  'YST',
      ],
      [
  62555713200, #    utc_start 1983-04-24 11:00:00 (Sun)
  62572039200, #      utc_end 1983-10-30 10:00:00 (Sun)
  62555684400, #  local_start 1983-04-24 03:00:00 (Sun)
  62572010400, #    local_end 1983-10-30 02:00:00 (Sun)
  -28800,
  1,
  'YDT',
      ],
      [
  62572039200, #    utc_start 1983-10-30 10:00:00 (Sun)
  62574714000, #      utc_end 1983-11-30 09:00:00 (Wed)
  62572006800, #  local_start 1983-10-30 01:00:00 (Sun)
  62574681600, #    local_end 1983-11-30 00:00:00 (Wed)
  -32400,
  0,
  'YST',
      ],
      [
  62574714000, #    utc_start 1983-11-30 09:00:00 (Wed)
  62587767600, #      utc_end 1984-04-29 11:00:00 (Sun)
  62574681600, #  local_start 1983-11-30 00:00:00 (Wed)
  62587735200, #    local_end 1984-04-29 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62587767600, #    utc_start 1984-04-29 11:00:00 (Sun)
  62603488800, #      utc_end 1984-10-28 10:00:00 (Sun)
  62587738800, #  local_start 1984-04-29 03:00:00 (Sun)
  62603460000, #    local_end 1984-10-28 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  62603488800, #    utc_start 1984-10-28 10:00:00 (Sun)
  62619217200, #      utc_end 1985-04-28 11:00:00 (Sun)
  62603456400, #  local_start 1984-10-28 01:00:00 (Sun)
  62619184800, #    local_end 1985-04-28 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62619217200, #    utc_start 1985-04-28 11:00:00 (Sun)
  62634938400, #      utc_end 1985-10-27 10:00:00 (Sun)
  62619188400, #  local_start 1985-04-28 03:00:00 (Sun)
  62634909600, #    local_end 1985-10-27 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  62634938400, #    utc_start 1985-10-27 10:00:00 (Sun)
  62650666800, #      utc_end 1986-04-27 11:00:00 (Sun)
  62634906000, #  local_start 1985-10-27 01:00:00 (Sun)
  62650634400, #    local_end 1986-04-27 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62650666800, #    utc_start 1986-04-27 11:00:00 (Sun)
  62666388000, #      utc_end 1986-10-26 10:00:00 (Sun)
  62650638000, #  local_start 1986-04-27 03:00:00 (Sun)
  62666359200, #    local_end 1986-10-26 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  62666388000, #    utc_start 1986-10-26 10:00:00 (Sun)
  62680302000, #      utc_end 1987-04-05 11:00:00 (Sun)
  62666355600, #  local_start 1986-10-26 01:00:00 (Sun)
  62680269600, #    local_end 1987-04-05 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62680302000, #    utc_start 1987-04-05 11:00:00 (Sun)
  62697837600, #      utc_end 1987-10-25 10:00:00 (Sun)
  62680273200, #  local_start 1987-04-05 03:00:00 (Sun)
  62697808800, #    local_end 1987-10-25 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  62697837600, #    utc_start 1987-10-25 10:00:00 (Sun)
  62711751600, #      utc_end 1988-04-03 11:00:00 (Sun)
  62697805200, #  local_start 1987-10-25 01:00:00 (Sun)
  62711719200, #    local_end 1988-04-03 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62711751600, #    utc_start 1988-04-03 11:00:00 (Sun)
  62729892000, #      utc_end 1988-10-30 10:00:00 (Sun)
  62711722800, #  local_start 1988-04-03 03:00:00 (Sun)
  62729863200, #    local_end 1988-10-30 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  62729892000, #    utc_start 1988-10-30 10:00:00 (Sun)
  62743201200, #      utc_end 1989-04-02 11:00:00 (Sun)
  62729859600, #  local_start 1988-10-30 01:00:00 (Sun)
  62743168800, #    local_end 1989-04-02 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62743201200, #    utc_start 1989-04-02 11:00:00 (Sun)
  62761341600, #      utc_end 1989-10-29 10:00:00 (Sun)
  62743172400, #  local_start 1989-04-02 03:00:00 (Sun)
  62761312800, #    local_end 1989-10-29 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  62761341600, #    utc_start 1989-10-29 10:00:00 (Sun)
  62774650800, #      utc_end 1990-04-01 11:00:00 (Sun)
  62761309200, #  local_start 1989-10-29 01:00:00 (Sun)
  62774618400, #    local_end 1990-04-01 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62774650800, #    utc_start 1990-04-01 11:00:00 (Sun)
  62792791200, #      utc_end 1990-10-28 10:00:00 (Sun)
  62774622000, #  local_start 1990-04-01 03:00:00 (Sun)
  62792762400, #    local_end 1990-10-28 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  62792791200, #    utc_start 1990-10-28 10:00:00 (Sun)
  62806705200, #      utc_end 1991-04-07 11:00:00 (Sun)
  62792758800, #  local_start 1990-10-28 01:00:00 (Sun)
  62806672800, #    local_end 1991-04-07 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62806705200, #    utc_start 1991-04-07 11:00:00 (Sun)
  62824240800, #      utc_end 1991-10-27 10:00:00 (Sun)
  62806676400, #  local_start 1991-04-07 03:00:00 (Sun)
  62824212000, #    local_end 1991-10-27 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  62824240800, #    utc_start 1991-10-27 10:00:00 (Sun)
  62838154800, #      utc_end 1992-04-05 11:00:00 (Sun)
  62824208400, #  local_start 1991-10-27 01:00:00 (Sun)
  62838122400, #    local_end 1992-04-05 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62838154800, #    utc_start 1992-04-05 11:00:00 (Sun)
  62855690400, #      utc_end 1992-10-25 10:00:00 (Sun)
  62838126000, #  local_start 1992-04-05 03:00:00 (Sun)
  62855661600, #    local_end 1992-10-25 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  62855690400, #    utc_start 1992-10-25 10:00:00 (Sun)
  62869604400, #      utc_end 1993-04-04 11:00:00 (Sun)
  62855658000, #  local_start 1992-10-25 01:00:00 (Sun)
  62869572000, #    local_end 1993-04-04 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62869604400, #    utc_start 1993-04-04 11:00:00 (Sun)
  62887744800, #      utc_end 1993-10-31 10:00:00 (Sun)
  62869575600, #  local_start 1993-04-04 03:00:00 (Sun)
  62887716000, #    local_end 1993-10-31 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  62887744800, #    utc_start 1993-10-31 10:00:00 (Sun)
  62901054000, #      utc_end 1994-04-03 11:00:00 (Sun)
  62887712400, #  local_start 1993-10-31 01:00:00 (Sun)
  62901021600, #    local_end 1994-04-03 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62901054000, #    utc_start 1994-04-03 11:00:00 (Sun)
  62919194400, #      utc_end 1994-10-30 10:00:00 (Sun)
  62901025200, #  local_start 1994-04-03 03:00:00 (Sun)
  62919165600, #    local_end 1994-10-30 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  62919194400, #    utc_start 1994-10-30 10:00:00 (Sun)
  62932503600, #      utc_end 1995-04-02 11:00:00 (Sun)
  62919162000, #  local_start 1994-10-30 01:00:00 (Sun)
  62932471200, #    local_end 1995-04-02 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62932503600, #    utc_start 1995-04-02 11:00:00 (Sun)
  62950644000, #      utc_end 1995-10-29 10:00:00 (Sun)
  62932474800, #  local_start 1995-04-02 03:00:00 (Sun)
  62950615200, #    local_end 1995-10-29 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  62950644000, #    utc_start 1995-10-29 10:00:00 (Sun)
  62964558000, #      utc_end 1996-04-07 11:00:00 (Sun)
  62950611600, #  local_start 1995-10-29 01:00:00 (Sun)
  62964525600, #    local_end 1996-04-07 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62964558000, #    utc_start 1996-04-07 11:00:00 (Sun)
  62982093600, #      utc_end 1996-10-27 10:00:00 (Sun)
  62964529200, #  local_start 1996-04-07 03:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  62982093600, #    utc_start 1996-10-27 10:00:00 (Sun)
  62996007600, #      utc_end 1997-04-06 11:00:00 (Sun)
  62982061200, #  local_start 1996-10-27 01:00:00 (Sun)
  62995975200, #    local_end 1997-04-06 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  62996007600, #    utc_start 1997-04-06 11:00:00 (Sun)
  63013543200, #      utc_end 1997-10-26 10:00:00 (Sun)
  62995978800, #  local_start 1997-04-06 03:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63013543200, #    utc_start 1997-10-26 10:00:00 (Sun)
  63027457200, #      utc_end 1998-04-05 11:00:00 (Sun)
  63013510800, #  local_start 1997-10-26 01:00:00 (Sun)
  63027424800, #    local_end 1998-04-05 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63027457200, #    utc_start 1998-04-05 11:00:00 (Sun)
  63044992800, #      utc_end 1998-10-25 10:00:00 (Sun)
  63027428400, #  local_start 1998-04-05 03:00:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63044992800, #    utc_start 1998-10-25 10:00:00 (Sun)
  63058906800, #      utc_end 1999-04-04 11:00:00 (Sun)
  63044960400, #  local_start 1998-10-25 01:00:00 (Sun)
  63058874400, #    local_end 1999-04-04 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63058906800, #    utc_start 1999-04-04 11:00:00 (Sun)
  63077047200, #      utc_end 1999-10-31 10:00:00 (Sun)
  63058878000, #  local_start 1999-04-04 03:00:00 (Sun)
  63077018400, #    local_end 1999-10-31 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63077047200, #    utc_start 1999-10-31 10:00:00 (Sun)
  63090356400, #      utc_end 2000-04-02 11:00:00 (Sun)
  63077014800, #  local_start 1999-10-31 01:00:00 (Sun)
  63090324000, #    local_end 2000-04-02 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63090356400, #    utc_start 2000-04-02 11:00:00 (Sun)
  63108496800, #      utc_end 2000-10-29 10:00:00 (Sun)
  63090327600, #  local_start 2000-04-02 03:00:00 (Sun)
  63108468000, #    local_end 2000-10-29 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63108496800, #    utc_start 2000-10-29 10:00:00 (Sun)
  63121806000, #      utc_end 2001-04-01 11:00:00 (Sun)
  63108464400, #  local_start 2000-10-29 01:00:00 (Sun)
  63121773600, #    local_end 2001-04-01 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63121806000, #    utc_start 2001-04-01 11:00:00 (Sun)
  63139946400, #      utc_end 2001-10-28 10:00:00 (Sun)
  63121777200, #  local_start 2001-04-01 03:00:00 (Sun)
  63139917600, #    local_end 2001-10-28 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63139946400, #    utc_start 2001-10-28 10:00:00 (Sun)
  63153860400, #      utc_end 2002-04-07 11:00:00 (Sun)
  63139914000, #  local_start 2001-10-28 01:00:00 (Sun)
  63153828000, #    local_end 2002-04-07 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63153860400, #    utc_start 2002-04-07 11:00:00 (Sun)
  63171396000, #      utc_end 2002-10-27 10:00:00 (Sun)
  63153831600, #  local_start 2002-04-07 03:00:00 (Sun)
  63171367200, #    local_end 2002-10-27 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63171396000, #    utc_start 2002-10-27 10:00:00 (Sun)
  63185310000, #      utc_end 2003-04-06 11:00:00 (Sun)
  63171363600, #  local_start 2002-10-27 01:00:00 (Sun)
  63185277600, #    local_end 2003-04-06 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63185310000, #    utc_start 2003-04-06 11:00:00 (Sun)
  63202845600, #      utc_end 2003-10-26 10:00:00 (Sun)
  63185281200, #  local_start 2003-04-06 03:00:00 (Sun)
  63202816800, #    local_end 2003-10-26 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63202845600, #    utc_start 2003-10-26 10:00:00 (Sun)
  63216759600, #      utc_end 2004-04-04 11:00:00 (Sun)
  63202813200, #  local_start 2003-10-26 01:00:00 (Sun)
  63216727200, #    local_end 2004-04-04 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63216759600, #    utc_start 2004-04-04 11:00:00 (Sun)
  63234900000, #      utc_end 2004-10-31 10:00:00 (Sun)
  63216730800, #  local_start 2004-04-04 03:00:00 (Sun)
  63234871200, #    local_end 2004-10-31 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63234900000, #    utc_start 2004-10-31 10:00:00 (Sun)
  63248209200, #      utc_end 2005-04-03 11:00:00 (Sun)
  63234867600, #  local_start 2004-10-31 01:00:00 (Sun)
  63248176800, #    local_end 2005-04-03 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63248209200, #    utc_start 2005-04-03 11:00:00 (Sun)
  63266349600, #      utc_end 2005-10-30 10:00:00 (Sun)
  63248180400, #  local_start 2005-04-03 03:00:00 (Sun)
  63266320800, #    local_end 2005-10-30 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63266349600, #    utc_start 2005-10-30 10:00:00 (Sun)
  63279658800, #      utc_end 2006-04-02 11:00:00 (Sun)
  63266317200, #  local_start 2005-10-30 01:00:00 (Sun)
  63279626400, #    local_end 2006-04-02 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63279658800, #    utc_start 2006-04-02 11:00:00 (Sun)
  63297799200, #      utc_end 2006-10-29 10:00:00 (Sun)
  63279630000, #  local_start 2006-04-02 03:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63297799200, #    utc_start 2006-10-29 10:00:00 (Sun)
  63309294000, #      utc_end 2007-03-11 11:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63309261600, #    local_end 2007-03-11 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63309294000, #    utc_start 2007-03-11 11:00:00 (Sun)
  63329853600, #      utc_end 2007-11-04 10:00:00 (Sun)
  63309265200, #  local_start 2007-03-11 03:00:00 (Sun)
  63329824800, #    local_end 2007-11-04 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63329853600, #    utc_start 2007-11-04 10:00:00 (Sun)
  63340743600, #      utc_end 2008-03-09 11:00:00 (Sun)
  63329821200, #  local_start 2007-11-04 01:00:00 (Sun)
  63340711200, #    local_end 2008-03-09 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63340743600, #    utc_start 2008-03-09 11:00:00 (Sun)
  63361303200, #      utc_end 2008-11-02 10:00:00 (Sun)
  63340714800, #  local_start 2008-03-09 03:00:00 (Sun)
  63361274400, #    local_end 2008-11-02 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63361303200, #    utc_start 2008-11-02 10:00:00 (Sun)
  63372193200, #      utc_end 2009-03-08 11:00:00 (Sun)
  63361270800, #  local_start 2008-11-02 01:00:00 (Sun)
  63372160800, #    local_end 2009-03-08 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63372193200, #    utc_start 2009-03-08 11:00:00 (Sun)
  63392752800, #      utc_end 2009-11-01 10:00:00 (Sun)
  63372164400, #  local_start 2009-03-08 03:00:00 (Sun)
  63392724000, #    local_end 2009-11-01 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63392752800, #    utc_start 2009-11-01 10:00:00 (Sun)
  63404247600, #      utc_end 2010-03-14 11:00:00 (Sun)
  63392720400, #  local_start 2009-11-01 01:00:00 (Sun)
  63404215200, #    local_end 2010-03-14 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63404247600, #    utc_start 2010-03-14 11:00:00 (Sun)
  63424807200, #      utc_end 2010-11-07 10:00:00 (Sun)
  63404218800, #  local_start 2010-03-14 03:00:00 (Sun)
  63424778400, #    local_end 2010-11-07 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63424807200, #    utc_start 2010-11-07 10:00:00 (Sun)
  63435697200, #      utc_end 2011-03-13 11:00:00 (Sun)
  63424774800, #  local_start 2010-11-07 01:00:00 (Sun)
  63435664800, #    local_end 2011-03-13 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63435697200, #    utc_start 2011-03-13 11:00:00 (Sun)
  63456256800, #      utc_end 2011-11-06 10:00:00 (Sun)
  63435668400, #  local_start 2011-03-13 03:00:00 (Sun)
  63456228000, #    local_end 2011-11-06 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63456256800, #    utc_start 2011-11-06 10:00:00 (Sun)
  63467146800, #      utc_end 2012-03-11 11:00:00 (Sun)
  63456224400, #  local_start 2011-11-06 01:00:00 (Sun)
  63467114400, #    local_end 2012-03-11 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63467146800, #    utc_start 2012-03-11 11:00:00 (Sun)
  63487706400, #      utc_end 2012-11-04 10:00:00 (Sun)
  63467118000, #  local_start 2012-03-11 03:00:00 (Sun)
  63487677600, #    local_end 2012-11-04 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63487706400, #    utc_start 2012-11-04 10:00:00 (Sun)
  63498596400, #      utc_end 2013-03-10 11:00:00 (Sun)
  63487674000, #  local_start 2012-11-04 01:00:00 (Sun)
  63498564000, #    local_end 2013-03-10 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63498596400, #    utc_start 2013-03-10 11:00:00 (Sun)
  63519156000, #      utc_end 2013-11-03 10:00:00 (Sun)
  63498567600, #  local_start 2013-03-10 03:00:00 (Sun)
  63519127200, #    local_end 2013-11-03 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63519156000, #    utc_start 2013-11-03 10:00:00 (Sun)
  63530046000, #      utc_end 2014-03-09 11:00:00 (Sun)
  63519123600, #  local_start 2013-11-03 01:00:00 (Sun)
  63530013600, #    local_end 2014-03-09 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63530046000, #    utc_start 2014-03-09 11:00:00 (Sun)
  63550605600, #      utc_end 2014-11-02 10:00:00 (Sun)
  63530017200, #  local_start 2014-03-09 03:00:00 (Sun)
  63550576800, #    local_end 2014-11-02 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63550605600, #    utc_start 2014-11-02 10:00:00 (Sun)
  63561495600, #      utc_end 2015-03-08 11:00:00 (Sun)
  63550573200, #  local_start 2014-11-02 01:00:00 (Sun)
  63561463200, #    local_end 2015-03-08 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63561495600, #    utc_start 2015-03-08 11:00:00 (Sun)
  63582055200, #      utc_end 2015-11-01 10:00:00 (Sun)
  63561466800, #  local_start 2015-03-08 03:00:00 (Sun)
  63582026400, #    local_end 2015-11-01 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63582055200, #    utc_start 2015-11-01 10:00:00 (Sun)
  63593550000, #      utc_end 2016-03-13 11:00:00 (Sun)
  63582022800, #  local_start 2015-11-01 01:00:00 (Sun)
  63593517600, #    local_end 2016-03-13 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63593550000, #    utc_start 2016-03-13 11:00:00 (Sun)
  63614109600, #      utc_end 2016-11-06 10:00:00 (Sun)
  63593521200, #  local_start 2016-03-13 03:00:00 (Sun)
  63614080800, #    local_end 2016-11-06 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63614109600, #    utc_start 2016-11-06 10:00:00 (Sun)
  63624999600, #      utc_end 2017-03-12 11:00:00 (Sun)
  63614077200, #  local_start 2016-11-06 01:00:00 (Sun)
  63624967200, #    local_end 2017-03-12 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63624999600, #    utc_start 2017-03-12 11:00:00 (Sun)
  63645559200, #      utc_end 2017-11-05 10:00:00 (Sun)
  63624970800, #  local_start 2017-03-12 03:00:00 (Sun)
  63645530400, #    local_end 2017-11-05 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63645559200, #    utc_start 2017-11-05 10:00:00 (Sun)
  63656449200, #      utc_end 2018-03-11 11:00:00 (Sun)
  63645526800, #  local_start 2017-11-05 01:00:00 (Sun)
  63656416800, #    local_end 2018-03-11 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63656449200, #    utc_start 2018-03-11 11:00:00 (Sun)
  63677008800, #      utc_end 2018-11-04 10:00:00 (Sun)
  63656420400, #  local_start 2018-03-11 03:00:00 (Sun)
  63676980000, #    local_end 2018-11-04 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63677008800, #    utc_start 2018-11-04 10:00:00 (Sun)
  63687898800, #      utc_end 2019-03-10 11:00:00 (Sun)
  63676976400, #  local_start 2018-11-04 01:00:00 (Sun)
  63687866400, #    local_end 2019-03-10 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63687898800, #    utc_start 2019-03-10 11:00:00 (Sun)
  63708458400, #      utc_end 2019-11-03 10:00:00 (Sun)
  63687870000, #  local_start 2019-03-10 03:00:00 (Sun)
  63708429600, #    local_end 2019-11-03 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63708458400, #    utc_start 2019-11-03 10:00:00 (Sun)
  63719348400, #      utc_end 2020-03-08 11:00:00 (Sun)
  63708426000, #  local_start 2019-11-03 01:00:00 (Sun)
  63719316000, #    local_end 2020-03-08 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63719348400, #    utc_start 2020-03-08 11:00:00 (Sun)
  63739908000, #      utc_end 2020-11-01 10:00:00 (Sun)
  63719319600, #  local_start 2020-03-08 03:00:00 (Sun)
  63739879200, #    local_end 2020-11-01 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63739908000, #    utc_start 2020-11-01 10:00:00 (Sun)
  63751402800, #      utc_end 2021-03-14 11:00:00 (Sun)
  63739875600, #  local_start 2020-11-01 01:00:00 (Sun)
  63751370400, #    local_end 2021-03-14 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63751402800, #    utc_start 2021-03-14 11:00:00 (Sun)
  63771962400, #      utc_end 2021-11-07 10:00:00 (Sun)
  63751374000, #  local_start 2021-03-14 03:00:00 (Sun)
  63771933600, #    local_end 2021-11-07 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63771962400, #    utc_start 2021-11-07 10:00:00 (Sun)
  63782852400, #      utc_end 2022-03-13 11:00:00 (Sun)
  63771930000, #  local_start 2021-11-07 01:00:00 (Sun)
  63782820000, #    local_end 2022-03-13 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63782852400, #    utc_start 2022-03-13 11:00:00 (Sun)
  63803412000, #      utc_end 2022-11-06 10:00:00 (Sun)
  63782823600, #  local_start 2022-03-13 03:00:00 (Sun)
  63803383200, #    local_end 2022-11-06 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63803412000, #    utc_start 2022-11-06 10:00:00 (Sun)
  63814302000, #      utc_end 2023-03-12 11:00:00 (Sun)
  63803379600, #  local_start 2022-11-06 01:00:00 (Sun)
  63814269600, #    local_end 2023-03-12 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63814302000, #    utc_start 2023-03-12 11:00:00 (Sun)
  63834861600, #      utc_end 2023-11-05 10:00:00 (Sun)
  63814273200, #  local_start 2023-03-12 03:00:00 (Sun)
  63834832800, #    local_end 2023-11-05 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63834861600, #    utc_start 2023-11-05 10:00:00 (Sun)
  63845751600, #      utc_end 2024-03-10 11:00:00 (Sun)
  63834829200, #  local_start 2023-11-05 01:00:00 (Sun)
  63845719200, #    local_end 2024-03-10 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63845751600, #    utc_start 2024-03-10 11:00:00 (Sun)
  63866311200, #      utc_end 2024-11-03 10:00:00 (Sun)
  63845722800, #  local_start 2024-03-10 03:00:00 (Sun)
  63866282400, #    local_end 2024-11-03 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63866311200, #    utc_start 2024-11-03 10:00:00 (Sun)
  63877201200, #      utc_end 2025-03-09 11:00:00 (Sun)
  63866278800, #  local_start 2024-11-03 01:00:00 (Sun)
  63877168800, #    local_end 2025-03-09 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63877201200, #    utc_start 2025-03-09 11:00:00 (Sun)
  63897760800, #      utc_end 2025-11-02 10:00:00 (Sun)
  63877172400, #  local_start 2025-03-09 03:00:00 (Sun)
  63897732000, #    local_end 2025-11-02 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63897760800, #    utc_start 2025-11-02 10:00:00 (Sun)
  63908650800, #      utc_end 2026-03-08 11:00:00 (Sun)
  63897728400, #  local_start 2025-11-02 01:00:00 (Sun)
  63908618400, #    local_end 2026-03-08 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63908650800, #    utc_start 2026-03-08 11:00:00 (Sun)
  63929210400, #      utc_end 2026-11-01 10:00:00 (Sun)
  63908622000, #  local_start 2026-03-08 03:00:00 (Sun)
  63929181600, #    local_end 2026-11-01 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63929210400, #    utc_start 2026-11-01 10:00:00 (Sun)
  63940705200, #      utc_end 2027-03-14 11:00:00 (Sun)
  63929178000, #  local_start 2026-11-01 01:00:00 (Sun)
  63940672800, #    local_end 2027-03-14 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63940705200, #    utc_start 2027-03-14 11:00:00 (Sun)
  63961264800, #      utc_end 2027-11-07 10:00:00 (Sun)
  63940676400, #  local_start 2027-03-14 03:00:00 (Sun)
  63961236000, #    local_end 2027-11-07 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63961264800, #    utc_start 2027-11-07 10:00:00 (Sun)
  63972154800, #      utc_end 2028-03-12 11:00:00 (Sun)
  63961232400, #  local_start 2027-11-07 01:00:00 (Sun)
  63972122400, #    local_end 2028-03-12 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  63972154800, #    utc_start 2028-03-12 11:00:00 (Sun)
  63992714400, #      utc_end 2028-11-05 10:00:00 (Sun)
  63972126000, #  local_start 2028-03-12 03:00:00 (Sun)
  63992685600, #    local_end 2028-11-05 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  63992714400, #    utc_start 2028-11-05 10:00:00 (Sun)
  64003604400, #      utc_end 2029-03-11 11:00:00 (Sun)
  63992682000, #  local_start 2028-11-05 01:00:00 (Sun)
  64003572000, #    local_end 2029-03-11 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  64003604400, #    utc_start 2029-03-11 11:00:00 (Sun)
  64024164000, #      utc_end 2029-11-04 10:00:00 (Sun)
  64003575600, #  local_start 2029-03-11 03:00:00 (Sun)
  64024135200, #    local_end 2029-11-04 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
      [
  64024164000, #    utc_start 2029-11-04 10:00:00 (Sun)
  64035054000, #      utc_end 2030-03-10 11:00:00 (Sun)
  64024131600, #  local_start 2029-11-04 01:00:00 (Sun)
  64035021600, #    local_end 2030-03-10 02:00:00 (Sun)
  -32400,
  0,
  'AKST',
      ],
      [
  64035054000, #    utc_start 2030-03-10 11:00:00 (Sun)
  64055613600, #      utc_end 2030-11-03 10:00:00 (Sun)
  64035025200, #  local_start 2030-03-10 03:00:00 (Sun)
  64055584800, #    local_end 2030-11-03 02:00:00 (Sun)
  -28800,
  1,
  'AKDT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {64}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -32400 }
  
  my $last_observance = bless( {
    'format' => 'AK%sT',
    'gmtoff' => '-9:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 724244,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 724244,
      'utc_rd_secs' => 0,
      'utc_year' => 1984
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -32400,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 724244,
      'local_rd_secs' => 32400,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 724244,
      'utc_rd_secs' => 32400,
      'utc_year' => 1984
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Nov',
      'letter' => 'S',
      'name' => 'US',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Mar',
      'letter' => 'D',
      'name' => 'US',
      'offset_from_std' => 3600,
      'on' => 'Sun>=8',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_YAKUTAT

    $main::fatpacked{"DateTime/TimeZone/America/Yellowknife.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AMERICA_YELLOWKNIFE';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::America::Yellowknife;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::America::Yellowknife::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  61031145600, #      utc_end 1935-01-01 00:00:00 (Tue)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  61031145600, #    local_end 1935-01-01 00:00:00 (Tue)
  0,
  0,
  '-00',
      ],
      [
  61031145600, #    utc_start 1935-01-01 00:00:00 (Tue)
  61255472400, #      utc_end 1942-02-09 09:00:00 (Mon)
  61031120400, #  local_start 1934-12-31 17:00:00 (Mon)
  61255447200, #    local_end 1942-02-09 02:00:00 (Mon)
  -25200,
  0,
  'MST',
      ],
      [
  61255472400, #    utc_start 1942-02-09 09:00:00 (Mon)
  61366287600, #      utc_end 1945-08-14 23:00:00 (Tue)
  61255450800, #  local_start 1942-02-09 03:00:00 (Mon)
  61366266000, #    local_end 1945-08-14 17:00:00 (Tue)
  -21600,
  1,
  'MWT',
      ],
      [
  61366287600, #    utc_start 1945-08-14 23:00:00 (Tue)
  61370294400, #      utc_end 1945-09-30 08:00:00 (Sun)
  61366266000, #  local_start 1945-08-14 17:00:00 (Tue)
  61370272800, #    local_end 1945-09-30 02:00:00 (Sun)
  -21600,
  1,
  'MPT',
      ],
      [
  61370294400, #    utc_start 1945-09-30 08:00:00 (Sun)
  61987791600, #      utc_end 1965-04-25 07:00:00 (Sun)
  61370269200, #  local_start 1945-09-30 01:00:00 (Sun)
  61987766400, #    local_end 1965-04-25 00:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  61987791600, #    utc_start 1965-04-25 07:00:00 (Sun)
  62004121200, #      utc_end 1965-10-31 07:00:00 (Sun)
  61987773600, #  local_start 1965-04-25 02:00:00 (Sun)
  62004103200, #    local_end 1965-10-31 02:00:00 (Sun)
  -18000,
  1,
  'MDDT',
      ],
      [
  62004121200, #    utc_start 1965-10-31 07:00:00 (Sun)
  62451241200, #      utc_end 1980-01-01 07:00:00 (Tue)
  62004096000, #  local_start 1965-10-31 00:00:00 (Sun)
  62451216000, #    local_end 1980-01-01 00:00:00 (Tue)
  -25200,
  0,
  'MST',
      ],
      [
  62451241200, #    utc_start 1980-01-01 07:00:00 (Tue)
  62461357200, #      utc_end 1980-04-27 09:00:00 (Sun)
  62451216000, #  local_start 1980-01-01 00:00:00 (Tue)
  62461332000, #    local_end 1980-04-27 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62461357200, #    utc_start 1980-04-27 09:00:00 (Sun)
  62477078400, #      utc_end 1980-10-26 08:00:00 (Sun)
  62461335600, #  local_start 1980-04-27 03:00:00 (Sun)
  62477056800, #    local_end 1980-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62477078400, #    utc_start 1980-10-26 08:00:00 (Sun)
  62492806800, #      utc_end 1981-04-26 09:00:00 (Sun)
  62477053200, #  local_start 1980-10-26 01:00:00 (Sun)
  62492781600, #    local_end 1981-04-26 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62492806800, #    utc_start 1981-04-26 09:00:00 (Sun)
  62508528000, #      utc_end 1981-10-25 08:00:00 (Sun)
  62492785200, #  local_start 1981-04-26 03:00:00 (Sun)
  62508506400, #    local_end 1981-10-25 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62508528000, #    utc_start 1981-10-25 08:00:00 (Sun)
  62524256400, #      utc_end 1982-04-25 09:00:00 (Sun)
  62508502800, #  local_start 1981-10-25 01:00:00 (Sun)
  62524231200, #    local_end 1982-04-25 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62524256400, #    utc_start 1982-04-25 09:00:00 (Sun)
  62540582400, #      utc_end 1982-10-31 08:00:00 (Sun)
  62524234800, #  local_start 1982-04-25 03:00:00 (Sun)
  62540560800, #    local_end 1982-10-31 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62540582400, #    utc_start 1982-10-31 08:00:00 (Sun)
  62555706000, #      utc_end 1983-04-24 09:00:00 (Sun)
  62540557200, #  local_start 1982-10-31 01:00:00 (Sun)
  62555680800, #    local_end 1983-04-24 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62555706000, #    utc_start 1983-04-24 09:00:00 (Sun)
  62572032000, #      utc_end 1983-10-30 08:00:00 (Sun)
  62555684400, #  local_start 1983-04-24 03:00:00 (Sun)
  62572010400, #    local_end 1983-10-30 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62572032000, #    utc_start 1983-10-30 08:00:00 (Sun)
  62587760400, #      utc_end 1984-04-29 09:00:00 (Sun)
  62572006800, #  local_start 1983-10-30 01:00:00 (Sun)
  62587735200, #    local_end 1984-04-29 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62587760400, #    utc_start 1984-04-29 09:00:00 (Sun)
  62603481600, #      utc_end 1984-10-28 08:00:00 (Sun)
  62587738800, #  local_start 1984-04-29 03:00:00 (Sun)
  62603460000, #    local_end 1984-10-28 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62603481600, #    utc_start 1984-10-28 08:00:00 (Sun)
  62619210000, #      utc_end 1985-04-28 09:00:00 (Sun)
  62603456400, #  local_start 1984-10-28 01:00:00 (Sun)
  62619184800, #    local_end 1985-04-28 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62619210000, #    utc_start 1985-04-28 09:00:00 (Sun)
  62634931200, #      utc_end 1985-10-27 08:00:00 (Sun)
  62619188400, #  local_start 1985-04-28 03:00:00 (Sun)
  62634909600, #    local_end 1985-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62634931200, #    utc_start 1985-10-27 08:00:00 (Sun)
  62650659600, #      utc_end 1986-04-27 09:00:00 (Sun)
  62634906000, #  local_start 1985-10-27 01:00:00 (Sun)
  62650634400, #    local_end 1986-04-27 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62650659600, #    utc_start 1986-04-27 09:00:00 (Sun)
  62666380800, #      utc_end 1986-10-26 08:00:00 (Sun)
  62650638000, #  local_start 1986-04-27 03:00:00 (Sun)
  62666359200, #    local_end 1986-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62666380800, #    utc_start 1986-10-26 08:00:00 (Sun)
  62680294800, #      utc_end 1987-04-05 09:00:00 (Sun)
  62666355600, #  local_start 1986-10-26 01:00:00 (Sun)
  62680269600, #    local_end 1987-04-05 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62680294800, #    utc_start 1987-04-05 09:00:00 (Sun)
  62697830400, #      utc_end 1987-10-25 08:00:00 (Sun)
  62680273200, #  local_start 1987-04-05 03:00:00 (Sun)
  62697808800, #    local_end 1987-10-25 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62697830400, #    utc_start 1987-10-25 08:00:00 (Sun)
  62711744400, #      utc_end 1988-04-03 09:00:00 (Sun)
  62697805200, #  local_start 1987-10-25 01:00:00 (Sun)
  62711719200, #    local_end 1988-04-03 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62711744400, #    utc_start 1988-04-03 09:00:00 (Sun)
  62729884800, #      utc_end 1988-10-30 08:00:00 (Sun)
  62711722800, #  local_start 1988-04-03 03:00:00 (Sun)
  62729863200, #    local_end 1988-10-30 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62729884800, #    utc_start 1988-10-30 08:00:00 (Sun)
  62743194000, #      utc_end 1989-04-02 09:00:00 (Sun)
  62729859600, #  local_start 1988-10-30 01:00:00 (Sun)
  62743168800, #    local_end 1989-04-02 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62743194000, #    utc_start 1989-04-02 09:00:00 (Sun)
  62761334400, #      utc_end 1989-10-29 08:00:00 (Sun)
  62743172400, #  local_start 1989-04-02 03:00:00 (Sun)
  62761312800, #    local_end 1989-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62761334400, #    utc_start 1989-10-29 08:00:00 (Sun)
  62774643600, #      utc_end 1990-04-01 09:00:00 (Sun)
  62761309200, #  local_start 1989-10-29 01:00:00 (Sun)
  62774618400, #    local_end 1990-04-01 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62774643600, #    utc_start 1990-04-01 09:00:00 (Sun)
  62792784000, #      utc_end 1990-10-28 08:00:00 (Sun)
  62774622000, #  local_start 1990-04-01 03:00:00 (Sun)
  62792762400, #    local_end 1990-10-28 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62792784000, #    utc_start 1990-10-28 08:00:00 (Sun)
  62806698000, #      utc_end 1991-04-07 09:00:00 (Sun)
  62792758800, #  local_start 1990-10-28 01:00:00 (Sun)
  62806672800, #    local_end 1991-04-07 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62806698000, #    utc_start 1991-04-07 09:00:00 (Sun)
  62824233600, #      utc_end 1991-10-27 08:00:00 (Sun)
  62806676400, #  local_start 1991-04-07 03:00:00 (Sun)
  62824212000, #    local_end 1991-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62824233600, #    utc_start 1991-10-27 08:00:00 (Sun)
  62838147600, #      utc_end 1992-04-05 09:00:00 (Sun)
  62824208400, #  local_start 1991-10-27 01:00:00 (Sun)
  62838122400, #    local_end 1992-04-05 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62838147600, #    utc_start 1992-04-05 09:00:00 (Sun)
  62855683200, #      utc_end 1992-10-25 08:00:00 (Sun)
  62838126000, #  local_start 1992-04-05 03:00:00 (Sun)
  62855661600, #    local_end 1992-10-25 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62855683200, #    utc_start 1992-10-25 08:00:00 (Sun)
  62869597200, #      utc_end 1993-04-04 09:00:00 (Sun)
  62855658000, #  local_start 1992-10-25 01:00:00 (Sun)
  62869572000, #    local_end 1993-04-04 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62869597200, #    utc_start 1993-04-04 09:00:00 (Sun)
  62887737600, #      utc_end 1993-10-31 08:00:00 (Sun)
  62869575600, #  local_start 1993-04-04 03:00:00 (Sun)
  62887716000, #    local_end 1993-10-31 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62887737600, #    utc_start 1993-10-31 08:00:00 (Sun)
  62901046800, #      utc_end 1994-04-03 09:00:00 (Sun)
  62887712400, #  local_start 1993-10-31 01:00:00 (Sun)
  62901021600, #    local_end 1994-04-03 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62901046800, #    utc_start 1994-04-03 09:00:00 (Sun)
  62919187200, #      utc_end 1994-10-30 08:00:00 (Sun)
  62901025200, #  local_start 1994-04-03 03:00:00 (Sun)
  62919165600, #    local_end 1994-10-30 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62919187200, #    utc_start 1994-10-30 08:00:00 (Sun)
  62932496400, #      utc_end 1995-04-02 09:00:00 (Sun)
  62919162000, #  local_start 1994-10-30 01:00:00 (Sun)
  62932471200, #    local_end 1995-04-02 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62932496400, #    utc_start 1995-04-02 09:00:00 (Sun)
  62950636800, #      utc_end 1995-10-29 08:00:00 (Sun)
  62932474800, #  local_start 1995-04-02 03:00:00 (Sun)
  62950615200, #    local_end 1995-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62950636800, #    utc_start 1995-10-29 08:00:00 (Sun)
  62964550800, #      utc_end 1996-04-07 09:00:00 (Sun)
  62950611600, #  local_start 1995-10-29 01:00:00 (Sun)
  62964525600, #    local_end 1996-04-07 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62964550800, #    utc_start 1996-04-07 09:00:00 (Sun)
  62982086400, #      utc_end 1996-10-27 08:00:00 (Sun)
  62964529200, #  local_start 1996-04-07 03:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62982086400, #    utc_start 1996-10-27 08:00:00 (Sun)
  62996000400, #      utc_end 1997-04-06 09:00:00 (Sun)
  62982061200, #  local_start 1996-10-27 01:00:00 (Sun)
  62995975200, #    local_end 1997-04-06 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62996000400, #    utc_start 1997-04-06 09:00:00 (Sun)
  63013536000, #      utc_end 1997-10-26 08:00:00 (Sun)
  62995978800, #  local_start 1997-04-06 03:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63013536000, #    utc_start 1997-10-26 08:00:00 (Sun)
  63027450000, #      utc_end 1998-04-05 09:00:00 (Sun)
  63013510800, #  local_start 1997-10-26 01:00:00 (Sun)
  63027424800, #    local_end 1998-04-05 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63027450000, #    utc_start 1998-04-05 09:00:00 (Sun)
  63044985600, #      utc_end 1998-10-25 08:00:00 (Sun)
  63027428400, #  local_start 1998-04-05 03:00:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63044985600, #    utc_start 1998-10-25 08:00:00 (Sun)
  63058899600, #      utc_end 1999-04-04 09:00:00 (Sun)
  63044960400, #  local_start 1998-10-25 01:00:00 (Sun)
  63058874400, #    local_end 1999-04-04 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63058899600, #    utc_start 1999-04-04 09:00:00 (Sun)
  63077040000, #      utc_end 1999-10-31 08:00:00 (Sun)
  63058878000, #  local_start 1999-04-04 03:00:00 (Sun)
  63077018400, #    local_end 1999-10-31 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63077040000, #    utc_start 1999-10-31 08:00:00 (Sun)
  63090349200, #      utc_end 2000-04-02 09:00:00 (Sun)
  63077014800, #  local_start 1999-10-31 01:00:00 (Sun)
  63090324000, #    local_end 2000-04-02 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63090349200, #    utc_start 2000-04-02 09:00:00 (Sun)
  63108489600, #      utc_end 2000-10-29 08:00:00 (Sun)
  63090327600, #  local_start 2000-04-02 03:00:00 (Sun)
  63108468000, #    local_end 2000-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63108489600, #    utc_start 2000-10-29 08:00:00 (Sun)
  63121798800, #      utc_end 2001-04-01 09:00:00 (Sun)
  63108464400, #  local_start 2000-10-29 01:00:00 (Sun)
  63121773600, #    local_end 2001-04-01 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63121798800, #    utc_start 2001-04-01 09:00:00 (Sun)
  63139939200, #      utc_end 2001-10-28 08:00:00 (Sun)
  63121777200, #  local_start 2001-04-01 03:00:00 (Sun)
  63139917600, #    local_end 2001-10-28 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63139939200, #    utc_start 2001-10-28 08:00:00 (Sun)
  63153853200, #      utc_end 2002-04-07 09:00:00 (Sun)
  63139914000, #  local_start 2001-10-28 01:00:00 (Sun)
  63153828000, #    local_end 2002-04-07 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63153853200, #    utc_start 2002-04-07 09:00:00 (Sun)
  63171388800, #      utc_end 2002-10-27 08:00:00 (Sun)
  63153831600, #  local_start 2002-04-07 03:00:00 (Sun)
  63171367200, #    local_end 2002-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63171388800, #    utc_start 2002-10-27 08:00:00 (Sun)
  63185302800, #      utc_end 2003-04-06 09:00:00 (Sun)
  63171363600, #  local_start 2002-10-27 01:00:00 (Sun)
  63185277600, #    local_end 2003-04-06 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63185302800, #    utc_start 2003-04-06 09:00:00 (Sun)
  63202838400, #      utc_end 2003-10-26 08:00:00 (Sun)
  63185281200, #  local_start 2003-04-06 03:00:00 (Sun)
  63202816800, #    local_end 2003-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63202838400, #    utc_start 2003-10-26 08:00:00 (Sun)
  63216752400, #      utc_end 2004-04-04 09:00:00 (Sun)
  63202813200, #  local_start 2003-10-26 01:00:00 (Sun)
  63216727200, #    local_end 2004-04-04 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63216752400, #    utc_start 2004-04-04 09:00:00 (Sun)
  63234892800, #      utc_end 2004-10-31 08:00:00 (Sun)
  63216730800, #  local_start 2004-04-04 03:00:00 (Sun)
  63234871200, #    local_end 2004-10-31 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63234892800, #    utc_start 2004-10-31 08:00:00 (Sun)
  63248202000, #      utc_end 2005-04-03 09:00:00 (Sun)
  63234867600, #  local_start 2004-10-31 01:00:00 (Sun)
  63248176800, #    local_end 2005-04-03 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63248202000, #    utc_start 2005-04-03 09:00:00 (Sun)
  63266342400, #      utc_end 2005-10-30 08:00:00 (Sun)
  63248180400, #  local_start 2005-04-03 03:00:00 (Sun)
  63266320800, #    local_end 2005-10-30 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63266342400, #    utc_start 2005-10-30 08:00:00 (Sun)
  63279651600, #      utc_end 2006-04-02 09:00:00 (Sun)
  63266317200, #  local_start 2005-10-30 01:00:00 (Sun)
  63279626400, #    local_end 2006-04-02 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63279651600, #    utc_start 2006-04-02 09:00:00 (Sun)
  63297792000, #      utc_end 2006-10-29 08:00:00 (Sun)
  63279630000, #  local_start 2006-04-02 03:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63297792000, #    utc_start 2006-10-29 08:00:00 (Sun)
  63309286800, #      utc_end 2007-03-11 09:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63309261600, #    local_end 2007-03-11 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63309286800, #    utc_start 2007-03-11 09:00:00 (Sun)
  63329846400, #      utc_end 2007-11-04 08:00:00 (Sun)
  63309265200, #  local_start 2007-03-11 03:00:00 (Sun)
  63329824800, #    local_end 2007-11-04 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63329846400, #    utc_start 2007-11-04 08:00:00 (Sun)
  63340736400, #      utc_end 2008-03-09 09:00:00 (Sun)
  63329821200, #  local_start 2007-11-04 01:00:00 (Sun)
  63340711200, #    local_end 2008-03-09 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63340736400, #    utc_start 2008-03-09 09:00:00 (Sun)
  63361296000, #      utc_end 2008-11-02 08:00:00 (Sun)
  63340714800, #  local_start 2008-03-09 03:00:00 (Sun)
  63361274400, #    local_end 2008-11-02 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63361296000, #    utc_start 2008-11-02 08:00:00 (Sun)
  63372186000, #      utc_end 2009-03-08 09:00:00 (Sun)
  63361270800, #  local_start 2008-11-02 01:00:00 (Sun)
  63372160800, #    local_end 2009-03-08 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63372186000, #    utc_start 2009-03-08 09:00:00 (Sun)
  63392745600, #      utc_end 2009-11-01 08:00:00 (Sun)
  63372164400, #  local_start 2009-03-08 03:00:00 (Sun)
  63392724000, #    local_end 2009-11-01 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63392745600, #    utc_start 2009-11-01 08:00:00 (Sun)
  63404240400, #      utc_end 2010-03-14 09:00:00 (Sun)
  63392720400, #  local_start 2009-11-01 01:00:00 (Sun)
  63404215200, #    local_end 2010-03-14 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63404240400, #    utc_start 2010-03-14 09:00:00 (Sun)
  63424800000, #      utc_end 2010-11-07 08:00:00 (Sun)
  63404218800, #  local_start 2010-03-14 03:00:00 (Sun)
  63424778400, #    local_end 2010-11-07 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63424800000, #    utc_start 2010-11-07 08:00:00 (Sun)
  63435690000, #      utc_end 2011-03-13 09:00:00 (Sun)
  63424774800, #  local_start 2010-11-07 01:00:00 (Sun)
  63435664800, #    local_end 2011-03-13 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63435690000, #    utc_start 2011-03-13 09:00:00 (Sun)
  63456249600, #      utc_end 2011-11-06 08:00:00 (Sun)
  63435668400, #  local_start 2011-03-13 03:00:00 (Sun)
  63456228000, #    local_end 2011-11-06 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63456249600, #    utc_start 2011-11-06 08:00:00 (Sun)
  63467139600, #      utc_end 2012-03-11 09:00:00 (Sun)
  63456224400, #  local_start 2011-11-06 01:00:00 (Sun)
  63467114400, #    local_end 2012-03-11 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63467139600, #    utc_start 2012-03-11 09:00:00 (Sun)
  63487699200, #      utc_end 2012-11-04 08:00:00 (Sun)
  63467118000, #  local_start 2012-03-11 03:00:00 (Sun)
  63487677600, #    local_end 2012-11-04 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63487699200, #    utc_start 2012-11-04 08:00:00 (Sun)
  63498589200, #      utc_end 2013-03-10 09:00:00 (Sun)
  63487674000, #  local_start 2012-11-04 01:00:00 (Sun)
  63498564000, #    local_end 2013-03-10 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63498589200, #    utc_start 2013-03-10 09:00:00 (Sun)
  63519148800, #      utc_end 2013-11-03 08:00:00 (Sun)
  63498567600, #  local_start 2013-03-10 03:00:00 (Sun)
  63519127200, #    local_end 2013-11-03 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63519148800, #    utc_start 2013-11-03 08:00:00 (Sun)
  63530038800, #      utc_end 2014-03-09 09:00:00 (Sun)
  63519123600, #  local_start 2013-11-03 01:00:00 (Sun)
  63530013600, #    local_end 2014-03-09 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63530038800, #    utc_start 2014-03-09 09:00:00 (Sun)
  63550598400, #      utc_end 2014-11-02 08:00:00 (Sun)
  63530017200, #  local_start 2014-03-09 03:00:00 (Sun)
  63550576800, #    local_end 2014-11-02 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63550598400, #    utc_start 2014-11-02 08:00:00 (Sun)
  63561488400, #      utc_end 2015-03-08 09:00:00 (Sun)
  63550573200, #  local_start 2014-11-02 01:00:00 (Sun)
  63561463200, #    local_end 2015-03-08 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63561488400, #    utc_start 2015-03-08 09:00:00 (Sun)
  63582048000, #      utc_end 2015-11-01 08:00:00 (Sun)
  63561466800, #  local_start 2015-03-08 03:00:00 (Sun)
  63582026400, #    local_end 2015-11-01 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63582048000, #    utc_start 2015-11-01 08:00:00 (Sun)
  63593542800, #      utc_end 2016-03-13 09:00:00 (Sun)
  63582022800, #  local_start 2015-11-01 01:00:00 (Sun)
  63593517600, #    local_end 2016-03-13 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63593542800, #    utc_start 2016-03-13 09:00:00 (Sun)
  63614102400, #      utc_end 2016-11-06 08:00:00 (Sun)
  63593521200, #  local_start 2016-03-13 03:00:00 (Sun)
  63614080800, #    local_end 2016-11-06 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63614102400, #    utc_start 2016-11-06 08:00:00 (Sun)
  63624992400, #      utc_end 2017-03-12 09:00:00 (Sun)
  63614077200, #  local_start 2016-11-06 01:00:00 (Sun)
  63624967200, #    local_end 2017-03-12 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63624992400, #    utc_start 2017-03-12 09:00:00 (Sun)
  63645552000, #      utc_end 2017-11-05 08:00:00 (Sun)
  63624970800, #  local_start 2017-03-12 03:00:00 (Sun)
  63645530400, #    local_end 2017-11-05 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63645552000, #    utc_start 2017-11-05 08:00:00 (Sun)
  63656442000, #      utc_end 2018-03-11 09:00:00 (Sun)
  63645526800, #  local_start 2017-11-05 01:00:00 (Sun)
  63656416800, #    local_end 2018-03-11 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63656442000, #    utc_start 2018-03-11 09:00:00 (Sun)
  63677001600, #      utc_end 2018-11-04 08:00:00 (Sun)
  63656420400, #  local_start 2018-03-11 03:00:00 (Sun)
  63676980000, #    local_end 2018-11-04 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63677001600, #    utc_start 2018-11-04 08:00:00 (Sun)
  63687891600, #      utc_end 2019-03-10 09:00:00 (Sun)
  63676976400, #  local_start 2018-11-04 01:00:00 (Sun)
  63687866400, #    local_end 2019-03-10 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63687891600, #    utc_start 2019-03-10 09:00:00 (Sun)
  63708451200, #      utc_end 2019-11-03 08:00:00 (Sun)
  63687870000, #  local_start 2019-03-10 03:00:00 (Sun)
  63708429600, #    local_end 2019-11-03 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63708451200, #    utc_start 2019-11-03 08:00:00 (Sun)
  63719341200, #      utc_end 2020-03-08 09:00:00 (Sun)
  63708426000, #  local_start 2019-11-03 01:00:00 (Sun)
  63719316000, #    local_end 2020-03-08 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63719341200, #    utc_start 2020-03-08 09:00:00 (Sun)
  63739900800, #      utc_end 2020-11-01 08:00:00 (Sun)
  63719319600, #  local_start 2020-03-08 03:00:00 (Sun)
  63739879200, #    local_end 2020-11-01 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63739900800, #    utc_start 2020-11-01 08:00:00 (Sun)
  63751395600, #      utc_end 2021-03-14 09:00:00 (Sun)
  63739875600, #  local_start 2020-11-01 01:00:00 (Sun)
  63751370400, #    local_end 2021-03-14 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63751395600, #    utc_start 2021-03-14 09:00:00 (Sun)
  63771955200, #      utc_end 2021-11-07 08:00:00 (Sun)
  63751374000, #  local_start 2021-03-14 03:00:00 (Sun)
  63771933600, #    local_end 2021-11-07 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63771955200, #    utc_start 2021-11-07 08:00:00 (Sun)
  63782845200, #      utc_end 2022-03-13 09:00:00 (Sun)
  63771930000, #  local_start 2021-11-07 01:00:00 (Sun)
  63782820000, #    local_end 2022-03-13 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63782845200, #    utc_start 2022-03-13 09:00:00 (Sun)
  63803404800, #      utc_end 2022-11-06 08:00:00 (Sun)
  63782823600, #  local_start 2022-03-13 03:00:00 (Sun)
  63803383200, #    local_end 2022-11-06 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63803404800, #    utc_start 2022-11-06 08:00:00 (Sun)
  63814294800, #      utc_end 2023-03-12 09:00:00 (Sun)
  63803379600, #  local_start 2022-11-06 01:00:00 (Sun)
  63814269600, #    local_end 2023-03-12 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63814294800, #    utc_start 2023-03-12 09:00:00 (Sun)
  63834854400, #      utc_end 2023-11-05 08:00:00 (Sun)
  63814273200, #  local_start 2023-03-12 03:00:00 (Sun)
  63834832800, #    local_end 2023-11-05 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63834854400, #    utc_start 2023-11-05 08:00:00 (Sun)
  63845744400, #      utc_end 2024-03-10 09:00:00 (Sun)
  63834829200, #  local_start 2023-11-05 01:00:00 (Sun)
  63845719200, #    local_end 2024-03-10 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63845744400, #    utc_start 2024-03-10 09:00:00 (Sun)
  63866304000, #      utc_end 2024-11-03 08:00:00 (Sun)
  63845722800, #  local_start 2024-03-10 03:00:00 (Sun)
  63866282400, #    local_end 2024-11-03 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63866304000, #    utc_start 2024-11-03 08:00:00 (Sun)
  63877194000, #      utc_end 2025-03-09 09:00:00 (Sun)
  63866278800, #  local_start 2024-11-03 01:00:00 (Sun)
  63877168800, #    local_end 2025-03-09 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63877194000, #    utc_start 2025-03-09 09:00:00 (Sun)
  63897753600, #      utc_end 2025-11-02 08:00:00 (Sun)
  63877172400, #  local_start 2025-03-09 03:00:00 (Sun)
  63897732000, #    local_end 2025-11-02 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63897753600, #    utc_start 2025-11-02 08:00:00 (Sun)
  63908643600, #      utc_end 2026-03-08 09:00:00 (Sun)
  63897728400, #  local_start 2025-11-02 01:00:00 (Sun)
  63908618400, #    local_end 2026-03-08 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63908643600, #    utc_start 2026-03-08 09:00:00 (Sun)
  63929203200, #      utc_end 2026-11-01 08:00:00 (Sun)
  63908622000, #  local_start 2026-03-08 03:00:00 (Sun)
  63929181600, #    local_end 2026-11-01 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63929203200, #    utc_start 2026-11-01 08:00:00 (Sun)
  63940698000, #      utc_end 2027-03-14 09:00:00 (Sun)
  63929178000, #  local_start 2026-11-01 01:00:00 (Sun)
  63940672800, #    local_end 2027-03-14 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63940698000, #    utc_start 2027-03-14 09:00:00 (Sun)
  63961257600, #      utc_end 2027-11-07 08:00:00 (Sun)
  63940676400, #  local_start 2027-03-14 03:00:00 (Sun)
  63961236000, #    local_end 2027-11-07 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63961257600, #    utc_start 2027-11-07 08:00:00 (Sun)
  63972147600, #      utc_end 2028-03-12 09:00:00 (Sun)
  63961232400, #  local_start 2027-11-07 01:00:00 (Sun)
  63972122400, #    local_end 2028-03-12 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63972147600, #    utc_start 2028-03-12 09:00:00 (Sun)
  63992707200, #      utc_end 2028-11-05 08:00:00 (Sun)
  63972126000, #  local_start 2028-03-12 03:00:00 (Sun)
  63992685600, #    local_end 2028-11-05 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63992707200, #    utc_start 2028-11-05 08:00:00 (Sun)
  64003597200, #      utc_end 2029-03-11 09:00:00 (Sun)
  63992682000, #  local_start 2028-11-05 01:00:00 (Sun)
  64003572000, #    local_end 2029-03-11 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  64003597200, #    utc_start 2029-03-11 09:00:00 (Sun)
  64024156800, #      utc_end 2029-11-04 08:00:00 (Sun)
  64003575600, #  local_start 2029-03-11 03:00:00 (Sun)
  64024135200, #    local_end 2029-11-04 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  64024156800, #    utc_start 2029-11-04 08:00:00 (Sun)
  64035046800, #      utc_end 2030-03-10 09:00:00 (Sun)
  64024131600, #  local_start 2029-11-04 01:00:00 (Sun)
  64035021600, #    local_end 2030-03-10 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  64035046800, #    utc_start 2030-03-10 09:00:00 (Sun)
  64055606400, #      utc_end 2030-11-03 08:00:00 (Sun)
  64035025200, #  local_start 2030-03-10 03:00:00 (Sun)
  64055584800, #    local_end 2030-11-03 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {54}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -25200 }
  
  my $last_observance = bless( {
    'format' => 'M%sT',
    'gmtoff' => '-7:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 722815,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 722815,
      'utc_rd_secs' => 0,
      'utc_year' => 1981
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -25200,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 722815,
      'local_rd_secs' => 25200,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 722815,
      'utc_rd_secs' => 25200,
      'utc_year' => 1981
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Mar',
      'letter' => 'D',
      'name' => 'Canada',
      'offset_from_std' => 3600,
      'on' => 'Sun>=8',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Nov',
      'letter' => 'S',
      'name' => 'Canada',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AMERICA_YELLOWKNIFE

    $main::fatpacked{"DateTime/TimeZone/Antarctica/Casey.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ANTARCTICA_CASEY';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/antarctica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Antarctica::Casey;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Antarctica::Casey::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  62104147200, #      utc_end 1969-01-01 00:00:00 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  62104147200, #    local_end 1969-01-01 00:00:00 (Wed)
  0,
  0,
  '-00',
      ],
      [
  62104147200, #    utc_start 1969-01-01 00:00:00 (Wed)
  63391485600, #      utc_end 2009-10-17 18:00:00 (Sat)
  62104176000, #  local_start 1969-01-01 08:00:00 (Wed)
  63391514400, #    local_end 2009-10-18 02:00:00 (Sun)
  28800,
  0,
  '+08',
      ],
      [
  63391485600, #    utc_start 2009-10-17 18:00:00 (Sat)
  63403398000, #      utc_end 2010-03-04 15:00:00 (Thu)
  63391525200, #  local_start 2009-10-18 05:00:00 (Sun)
  63403437600, #    local_end 2010-03-05 02:00:00 (Fri)
  39600,
  0,
  '+11',
      ],
      [
  63403398000, #    utc_start 2010-03-04 15:00:00 (Thu)
  63455421600, #      utc_end 2011-10-27 18:00:00 (Thu)
  63403426800, #  local_start 2010-03-04 23:00:00 (Thu)
  63455450400, #    local_end 2011-10-28 02:00:00 (Fri)
  28800,
  0,
  '+08',
      ],
      [
  63455421600, #    utc_start 2011-10-27 18:00:00 (Thu)
  63465526800, #      utc_end 2012-02-21 17:00:00 (Tue)
  63455461200, #  local_start 2011-10-28 05:00:00 (Fri)
  63465566400, #    local_end 2012-02-22 04:00:00 (Wed)
  39600,
  0,
  '+11',
      ],
      [
  63465526800, #    utc_start 2012-02-21 17:00:00 (Tue)
  63612748800, #      utc_end 2016-10-21 16:00:00 (Fri)
  63465555600, #  local_start 2012-02-22 01:00:00 (Wed)
  63612777600, #    local_end 2016-10-22 00:00:00 (Sat)
  28800,
  0,
  '+08',
      ],
      [
  63612748800, #    utc_start 2016-10-21 16:00:00 (Fri)
  63656384400, #      utc_end 2018-03-10 17:00:00 (Sat)
  63612788400, #  local_start 2016-10-22 03:00:00 (Sat)
  63656424000, #    local_end 2018-03-11 04:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  63656384400, #    utc_start 2018-03-10 17:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  63656413200, #  local_start 2018-03-11 01:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  28800,
  0,
  '+08',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ANTARCTICA_CASEY

    $main::fatpacked{"DateTime/TimeZone/Antarctica/Davis.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ANTARCTICA_DAVIS';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/antarctica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Antarctica::Davis;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Antarctica::Davis::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  61726492800, #      utc_end 1957-01-13 00:00:00 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  61726492800, #    local_end 1957-01-13 00:00:00 (Sun)
  0,
  0,
  '-00',
      ],
      [
  61726492800, #    utc_start 1957-01-13 00:00:00 (Sun)
  61972621200, #      utc_end 1964-10-31 17:00:00 (Sat)
  61726518000, #  local_start 1957-01-13 07:00:00 (Sun)
  61972646400, #    local_end 1964-11-01 00:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  61972621200, #    utc_start 1964-10-31 17:00:00 (Sat)
  62106825600, #      utc_end 1969-02-01 00:00:00 (Sat)
  61972621200, #  local_start 1964-10-31 17:00:00 (Sat)
  62106825600, #    local_end 1969-02-01 00:00:00 (Sat)
  0,
  0,
  '-00',
      ],
      [
  62106825600, #    utc_start 1969-02-01 00:00:00 (Sat)
  63391489200, #      utc_end 2009-10-17 19:00:00 (Sat)
  62106850800, #  local_start 1969-02-01 07:00:00 (Sat)
  63391514400, #    local_end 2009-10-18 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  63391489200, #    utc_start 2009-10-17 19:00:00 (Sat)
  63403934400, #      utc_end 2010-03-10 20:00:00 (Wed)
  63391507200, #  local_start 2009-10-18 00:00:00 (Sun)
  63403952400, #    local_end 2010-03-11 01:00:00 (Thu)
  18000,
  0,
  '+05',
      ],
      [
  63403934400, #    utc_start 2010-03-10 20:00:00 (Wed)
  63455425200, #      utc_end 2011-10-27 19:00:00 (Thu)
  63403959600, #  local_start 2010-03-11 03:00:00 (Thu)
  63455450400, #    local_end 2011-10-28 02:00:00 (Fri)
  25200,
  0,
  '+07',
      ],
      [
  63455425200, #    utc_start 2011-10-27 19:00:00 (Thu)
  63465537600, #      utc_end 2012-02-21 20:00:00 (Tue)
  63455443200, #  local_start 2011-10-28 00:00:00 (Fri)
  63465555600, #    local_end 2012-02-22 01:00:00 (Wed)
  18000,
  0,
  '+05',
      ],
      [
  63465537600, #    utc_start 2012-02-21 20:00:00 (Tue)
  DateTime::TimeZone::INFINITY, #      utc_end
  63465562800, #  local_start 2012-02-22 03:00:00 (Wed)
  DateTime::TimeZone::INFINITY, #    local_end
  25200,
  0,
  '+07',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ANTARCTICA_DAVIS

    $main::fatpacked{"DateTime/TimeZone/Antarctica/DumontDUrville.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ANTARCTICA_DUMONTDURVILLE';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/antarctica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Antarctica::DumontDUrville;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Antarctica::DumontDUrville::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  61409836800, #      utc_end 1947-01-01 00:00:00 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  61409836800, #    local_end 1947-01-01 00:00:00 (Wed)
  0,
  0,
  '-00',
      ],
      [
  61409836800, #    utc_start 1947-01-01 00:00:00 (Wed)
  61568690400, #      utc_end 1952-01-13 14:00:00 (Sun)
  61409872800, #  local_start 1947-01-01 10:00:00 (Wed)
  61568726400, #    local_end 1952-01-14 00:00:00 (Mon)
  36000,
  0,
  '+10',
      ],
      [
  61568690400, #    utc_start 1952-01-13 14:00:00 (Sun)
  61720185600, #      utc_end 1956-11-01 00:00:00 (Thu)
  61568690400, #  local_start 1952-01-13 14:00:00 (Sun)
  61720185600, #    local_end 1956-11-01 00:00:00 (Thu)
  0,
  0,
  '-00',
      ],
      [
  61720185600, #    utc_start 1956-11-01 00:00:00 (Thu)
  DateTime::TimeZone::INFINITY, #      utc_end
  61720221600, #  local_start 1956-11-01 10:00:00 (Thu)
  DateTime::TimeZone::INFINITY, #    local_end
  36000,
  0,
  '+10',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ANTARCTICA_DUMONTDURVILLE

    $main::fatpacked{"DateTime/TimeZone/Antarctica/Macquarie.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ANTARCTICA_MACQUARIE';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/australasia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Antarctica::Macquarie;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Antarctica::Macquarie::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59921424000, #      utc_end 1899-11-01 00:00:00 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59921424000, #    local_end 1899-11-01 00:00:00 (Wed)
  0,
  0,
  '-00',
      ],
      [
  59921424000, #    utc_start 1899-11-01 00:00:00 (Wed)
  60455174400, #      utc_end 1916-09-30 16:00:00 (Sat)
  59921460000, #  local_start 1899-11-01 10:00:00 (Wed)
  60455210400, #    local_end 1916-10-01 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  60455174400, #    utc_start 1916-09-30 16:00:00 (Sat)
  60465790800, #      utc_end 1917-01-31 13:00:00 (Wed)
  60455214000, #  local_start 1916-10-01 03:00:00 (Sun)
  60465830400, #    local_end 1917-02-01 00:00:00 (Thu)
  39600,
  1,
  'AEDT',
      ],
      [
  60465790800, #    utc_start 1917-01-31 13:00:00 (Wed)
  60470290800, #      utc_end 1917-03-24 15:00:00 (Sat)
  60465830400, #  local_start 1917-02-01 00:00:00 (Thu)
  60470330400, #    local_end 1917-03-25 02:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  60470290800, #    utc_start 1917-03-24 15:00:00 (Sat)
  60533964000, #      utc_end 1919-03-31 14:00:00 (Mon)
  60470326800, #  local_start 1917-03-25 01:00:00 (Sun)
  60534000000, #    local_end 1919-04-01 00:00:00 (Tue)
  36000,
  0,
  'AEST',
      ],
      [
  60533964000, #    utc_start 1919-03-31 14:00:00 (Mon)
  61448630400, #      utc_end 1948-03-25 00:00:00 (Thu)
  60533964000, #  local_start 1919-03-31 14:00:00 (Mon)
  61448630400, #    local_end 1948-03-25 00:00:00 (Thu)
  0,
  0,
  '-00',
      ],
      [
  61448630400, #    utc_start 1948-03-25 00:00:00 (Thu)
  62040952800, #      utc_end 1966-12-31 14:00:00 (Sat)
  61448666400, #  local_start 1948-03-25 10:00:00 (Thu)
  62040988800, #    local_end 1967-01-01 00:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62040952800, #    utc_start 1966-12-31 14:00:00 (Sat)
  62064547200, #      utc_end 1967-09-30 16:00:00 (Sat)
  62040988800, #  local_start 1967-01-01 00:00:00 (Sun)
  62064583200, #    local_end 1967-10-01 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62064547200, #    utc_start 1967-09-30 16:00:00 (Sat)
  62080272000, #      utc_end 1968-03-30 16:00:00 (Sat)
  62064586800, #  local_start 1967-10-01 03:00:00 (Sun)
  62080311600, #    local_end 1968-03-31 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62080272000, #    utc_start 1968-03-30 16:00:00 (Sat)
  62098416000, #      utc_end 1968-10-26 16:00:00 (Sat)
  62080308000, #  local_start 1968-03-31 02:00:00 (Sun)
  62098452000, #    local_end 1968-10-27 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62098416000, #    utc_start 1968-10-26 16:00:00 (Sat)
  62109907200, #      utc_end 1969-03-08 16:00:00 (Sat)
  62098455600, #  local_start 1968-10-27 03:00:00 (Sun)
  62109946800, #    local_end 1969-03-09 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62109907200, #    utc_start 1969-03-08 16:00:00 (Sat)
  62129865600, #      utc_end 1969-10-25 16:00:00 (Sat)
  62109943200, #  local_start 1969-03-09 02:00:00 (Sun)
  62129901600, #    local_end 1969-10-26 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62129865600, #    utc_start 1969-10-25 16:00:00 (Sat)
  62141356800, #      utc_end 1970-03-07 16:00:00 (Sat)
  62129905200, #  local_start 1969-10-26 03:00:00 (Sun)
  62141396400, #    local_end 1970-03-08 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62141356800, #    utc_start 1970-03-07 16:00:00 (Sat)
  62161315200, #      utc_end 1970-10-24 16:00:00 (Sat)
  62141392800, #  local_start 1970-03-08 02:00:00 (Sun)
  62161351200, #    local_end 1970-10-25 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62161315200, #    utc_start 1970-10-24 16:00:00 (Sat)
  62173411200, #      utc_end 1971-03-13 16:00:00 (Sat)
  62161354800, #  local_start 1970-10-25 03:00:00 (Sun)
  62173450800, #    local_end 1971-03-14 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62173411200, #    utc_start 1971-03-13 16:00:00 (Sat)
  62193369600, #      utc_end 1971-10-30 16:00:00 (Sat)
  62173447200, #  local_start 1971-03-14 02:00:00 (Sun)
  62193405600, #    local_end 1971-10-31 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62193369600, #    utc_start 1971-10-30 16:00:00 (Sat)
  62203651200, #      utc_end 1972-02-26 16:00:00 (Sat)
  62193409200, #  local_start 1971-10-31 03:00:00 (Sun)
  62203690800, #    local_end 1972-02-27 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62203651200, #    utc_start 1972-02-26 16:00:00 (Sat)
  62224819200, #      utc_end 1972-10-28 16:00:00 (Sat)
  62203687200, #  local_start 1972-02-27 02:00:00 (Sun)
  62224855200, #    local_end 1972-10-29 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62224819200, #    utc_start 1972-10-28 16:00:00 (Sat)
  62235705600, #      utc_end 1973-03-03 16:00:00 (Sat)
  62224858800, #  local_start 1972-10-29 03:00:00 (Sun)
  62235745200, #    local_end 1973-03-04 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62235705600, #    utc_start 1973-03-03 16:00:00 (Sat)
  62256268800, #      utc_end 1973-10-27 16:00:00 (Sat)
  62235741600, #  local_start 1973-03-04 02:00:00 (Sun)
  62256304800, #    local_end 1973-10-28 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62256268800, #    utc_start 1973-10-27 16:00:00 (Sat)
  62267155200, #      utc_end 1974-03-02 16:00:00 (Sat)
  62256308400, #  local_start 1973-10-28 03:00:00 (Sun)
  62267194800, #    local_end 1974-03-03 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62267155200, #    utc_start 1974-03-02 16:00:00 (Sat)
  62287718400, #      utc_end 1974-10-26 16:00:00 (Sat)
  62267191200, #  local_start 1974-03-03 02:00:00 (Sun)
  62287754400, #    local_end 1974-10-27 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62287718400, #    utc_start 1974-10-26 16:00:00 (Sat)
  62298604800, #      utc_end 1975-03-01 16:00:00 (Sat)
  62287758000, #  local_start 1974-10-27 03:00:00 (Sun)
  62298644400, #    local_end 1975-03-02 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62298604800, #    utc_start 1975-03-01 16:00:00 (Sat)
  62319168000, #      utc_end 1975-10-25 16:00:00 (Sat)
  62298640800, #  local_start 1975-03-02 02:00:00 (Sun)
  62319204000, #    local_end 1975-10-26 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62319168000, #    utc_start 1975-10-25 16:00:00 (Sat)
  62330659200, #      utc_end 1976-03-06 16:00:00 (Sat)
  62319207600, #  local_start 1975-10-26 03:00:00 (Sun)
  62330698800, #    local_end 1976-03-07 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62330659200, #    utc_start 1976-03-06 16:00:00 (Sat)
  62351222400, #      utc_end 1976-10-30 16:00:00 (Sat)
  62330695200, #  local_start 1976-03-07 02:00:00 (Sun)
  62351258400, #    local_end 1976-10-31 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62351222400, #    utc_start 1976-10-30 16:00:00 (Sat)
  62362108800, #      utc_end 1977-03-05 16:00:00 (Sat)
  62351262000, #  local_start 1976-10-31 03:00:00 (Sun)
  62362148400, #    local_end 1977-03-06 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62362108800, #    utc_start 1977-03-05 16:00:00 (Sat)
  62382672000, #      utc_end 1977-10-29 16:00:00 (Sat)
  62362144800, #  local_start 1977-03-06 02:00:00 (Sun)
  62382708000, #    local_end 1977-10-30 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62382672000, #    utc_start 1977-10-29 16:00:00 (Sat)
  62393558400, #      utc_end 1978-03-04 16:00:00 (Sat)
  62382711600, #  local_start 1977-10-30 03:00:00 (Sun)
  62393598000, #    local_end 1978-03-05 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62393558400, #    utc_start 1978-03-04 16:00:00 (Sat)
  62414121600, #      utc_end 1978-10-28 16:00:00 (Sat)
  62393594400, #  local_start 1978-03-05 02:00:00 (Sun)
  62414157600, #    local_end 1978-10-29 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62414121600, #    utc_start 1978-10-28 16:00:00 (Sat)
  62425008000, #      utc_end 1979-03-03 16:00:00 (Sat)
  62414161200, #  local_start 1978-10-29 03:00:00 (Sun)
  62425047600, #    local_end 1979-03-04 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62425008000, #    utc_start 1979-03-03 16:00:00 (Sat)
  62445571200, #      utc_end 1979-10-27 16:00:00 (Sat)
  62425044000, #  local_start 1979-03-04 02:00:00 (Sun)
  62445607200, #    local_end 1979-10-28 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62445571200, #    utc_start 1979-10-27 16:00:00 (Sat)
  62456457600, #      utc_end 1980-03-01 16:00:00 (Sat)
  62445610800, #  local_start 1979-10-28 03:00:00 (Sun)
  62456497200, #    local_end 1980-03-02 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62456457600, #    utc_start 1980-03-01 16:00:00 (Sat)
  62477020800, #      utc_end 1980-10-25 16:00:00 (Sat)
  62456493600, #  local_start 1980-03-02 02:00:00 (Sun)
  62477056800, #    local_end 1980-10-26 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62477020800, #    utc_start 1980-10-25 16:00:00 (Sat)
  62487907200, #      utc_end 1981-02-28 16:00:00 (Sat)
  62477060400, #  local_start 1980-10-26 03:00:00 (Sun)
  62487946800, #    local_end 1981-03-01 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62487907200, #    utc_start 1981-02-28 16:00:00 (Sat)
  62508470400, #      utc_end 1981-10-24 16:00:00 (Sat)
  62487943200, #  local_start 1981-03-01 02:00:00 (Sun)
  62508506400, #    local_end 1981-10-25 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62508470400, #    utc_start 1981-10-24 16:00:00 (Sat)
  62521776000, #      utc_end 1982-03-27 16:00:00 (Sat)
  62508510000, #  local_start 1981-10-25 03:00:00 (Sun)
  62521815600, #    local_end 1982-03-28 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62521776000, #    utc_start 1982-03-27 16:00:00 (Sat)
  62540524800, #      utc_end 1982-10-30 16:00:00 (Sat)
  62521812000, #  local_start 1982-03-28 02:00:00 (Sun)
  62540560800, #    local_end 1982-10-31 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62540524800, #    utc_start 1982-10-30 16:00:00 (Sat)
  62553225600, #      utc_end 1983-03-26 16:00:00 (Sat)
  62540564400, #  local_start 1982-10-31 03:00:00 (Sun)
  62553265200, #    local_end 1983-03-27 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62553225600, #    utc_start 1983-03-26 16:00:00 (Sat)
  62571974400, #      utc_end 1983-10-29 16:00:00 (Sat)
  62553261600, #  local_start 1983-03-27 02:00:00 (Sun)
  62572010400, #    local_end 1983-10-30 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62571974400, #    utc_start 1983-10-29 16:00:00 (Sat)
  62582860800, #      utc_end 1984-03-03 16:00:00 (Sat)
  62572014000, #  local_start 1983-10-30 03:00:00 (Sun)
  62582900400, #    local_end 1984-03-04 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62582860800, #    utc_start 1984-03-03 16:00:00 (Sat)
  62603424000, #      utc_end 1984-10-27 16:00:00 (Sat)
  62582896800, #  local_start 1984-03-04 02:00:00 (Sun)
  62603460000, #    local_end 1984-10-28 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62603424000, #    utc_start 1984-10-27 16:00:00 (Sat)
  62614310400, #      utc_end 1985-03-02 16:00:00 (Sat)
  62603463600, #  local_start 1984-10-28 03:00:00 (Sun)
  62614350000, #    local_end 1985-03-03 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62614310400, #    utc_start 1985-03-02 16:00:00 (Sat)
  62634873600, #      utc_end 1985-10-26 16:00:00 (Sat)
  62614346400, #  local_start 1985-03-03 02:00:00 (Sun)
  62634909600, #    local_end 1985-10-27 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62634873600, #    utc_start 1985-10-26 16:00:00 (Sat)
  62645760000, #      utc_end 1986-03-01 16:00:00 (Sat)
  62634913200, #  local_start 1985-10-27 03:00:00 (Sun)
  62645799600, #    local_end 1986-03-02 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62645760000, #    utc_start 1986-03-01 16:00:00 (Sat)
  62665718400, #      utc_end 1986-10-18 16:00:00 (Sat)
  62645796000, #  local_start 1986-03-02 02:00:00 (Sun)
  62665754400, #    local_end 1986-10-19 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62665718400, #    utc_start 1986-10-18 16:00:00 (Sat)
  62678419200, #      utc_end 1987-03-14 16:00:00 (Sat)
  62665758000, #  local_start 1986-10-19 03:00:00 (Sun)
  62678458800, #    local_end 1987-03-15 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62678419200, #    utc_start 1987-03-14 16:00:00 (Sat)
  62697772800, #      utc_end 1987-10-24 16:00:00 (Sat)
  62678455200, #  local_start 1987-03-15 02:00:00 (Sun)
  62697808800, #    local_end 1987-10-25 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62697772800, #    utc_start 1987-10-24 16:00:00 (Sat)
  62710473600, #      utc_end 1988-03-19 16:00:00 (Sat)
  62697812400, #  local_start 1987-10-25 03:00:00 (Sun)
  62710513200, #    local_end 1988-03-20 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62710473600, #    utc_start 1988-03-19 16:00:00 (Sat)
  62729827200, #      utc_end 1988-10-29 16:00:00 (Sat)
  62710509600, #  local_start 1988-03-20 02:00:00 (Sun)
  62729863200, #    local_end 1988-10-30 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62729827200, #    utc_start 1988-10-29 16:00:00 (Sat)
  62741923200, #      utc_end 1989-03-18 16:00:00 (Sat)
  62729866800, #  local_start 1988-10-30 03:00:00 (Sun)
  62741962800, #    local_end 1989-03-19 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62741923200, #    utc_start 1989-03-18 16:00:00 (Sat)
  62761276800, #      utc_end 1989-10-28 16:00:00 (Sat)
  62741959200, #  local_start 1989-03-19 02:00:00 (Sun)
  62761312800, #    local_end 1989-10-29 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62761276800, #    utc_start 1989-10-28 16:00:00 (Sat)
  62773372800, #      utc_end 1990-03-17 16:00:00 (Sat)
  62761316400, #  local_start 1989-10-29 03:00:00 (Sun)
  62773412400, #    local_end 1990-03-18 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62773372800, #    utc_start 1990-03-17 16:00:00 (Sat)
  62792726400, #      utc_end 1990-10-27 16:00:00 (Sat)
  62773408800, #  local_start 1990-03-18 02:00:00 (Sun)
  62792762400, #    local_end 1990-10-28 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62792726400, #    utc_start 1990-10-27 16:00:00 (Sat)
  62806032000, #      utc_end 1991-03-30 16:00:00 (Sat)
  62792766000, #  local_start 1990-10-28 03:00:00 (Sun)
  62806071600, #    local_end 1991-03-31 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62806032000, #    utc_start 1991-03-30 16:00:00 (Sat)
  62822361600, #      utc_end 1991-10-05 16:00:00 (Sat)
  62806068000, #  local_start 1991-03-31 02:00:00 (Sun)
  62822397600, #    local_end 1991-10-06 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62822361600, #    utc_start 1991-10-05 16:00:00 (Sat)
  62837481600, #      utc_end 1992-03-28 16:00:00 (Sat)
  62822401200, #  local_start 1991-10-06 03:00:00 (Sun)
  62837521200, #    local_end 1992-03-29 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62837481600, #    utc_start 1992-03-28 16:00:00 (Sat)
  62853811200, #      utc_end 1992-10-03 16:00:00 (Sat)
  62837517600, #  local_start 1992-03-29 02:00:00 (Sun)
  62853847200, #    local_end 1992-10-04 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62853811200, #    utc_start 1992-10-03 16:00:00 (Sat)
  62868931200, #      utc_end 1993-03-27 16:00:00 (Sat)
  62853850800, #  local_start 1992-10-04 03:00:00 (Sun)
  62868970800, #    local_end 1993-03-28 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62868931200, #    utc_start 1993-03-27 16:00:00 (Sat)
  62885260800, #      utc_end 1993-10-02 16:00:00 (Sat)
  62868967200, #  local_start 1993-03-28 02:00:00 (Sun)
  62885296800, #    local_end 1993-10-03 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62885260800, #    utc_start 1993-10-02 16:00:00 (Sat)
  62900380800, #      utc_end 1994-03-26 16:00:00 (Sat)
  62885300400, #  local_start 1993-10-03 03:00:00 (Sun)
  62900420400, #    local_end 1994-03-27 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62900380800, #    utc_start 1994-03-26 16:00:00 (Sat)
  62916710400, #      utc_end 1994-10-01 16:00:00 (Sat)
  62900416800, #  local_start 1994-03-27 02:00:00 (Sun)
  62916746400, #    local_end 1994-10-02 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62916710400, #    utc_start 1994-10-01 16:00:00 (Sat)
  62931830400, #      utc_end 1995-03-25 16:00:00 (Sat)
  62916750000, #  local_start 1994-10-02 03:00:00 (Sun)
  62931870000, #    local_end 1995-03-26 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62931830400, #    utc_start 1995-03-25 16:00:00 (Sat)
  62948160000, #      utc_end 1995-09-30 16:00:00 (Sat)
  62931866400, #  local_start 1995-03-26 02:00:00 (Sun)
  62948196000, #    local_end 1995-10-01 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62948160000, #    utc_start 1995-09-30 16:00:00 (Sat)
  62963884800, #      utc_end 1996-03-30 16:00:00 (Sat)
  62948199600, #  local_start 1995-10-01 03:00:00 (Sun)
  62963924400, #    local_end 1996-03-31 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62963884800, #    utc_start 1996-03-30 16:00:00 (Sat)
  62980214400, #      utc_end 1996-10-05 16:00:00 (Sat)
  62963920800, #  local_start 1996-03-31 02:00:00 (Sun)
  62980250400, #    local_end 1996-10-06 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62980214400, #    utc_start 1996-10-05 16:00:00 (Sat)
  62995334400, #      utc_end 1997-03-29 16:00:00 (Sat)
  62980254000, #  local_start 1996-10-06 03:00:00 (Sun)
  62995374000, #    local_end 1997-03-30 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62995334400, #    utc_start 1997-03-29 16:00:00 (Sat)
  63011664000, #      utc_end 1997-10-04 16:00:00 (Sat)
  62995370400, #  local_start 1997-03-30 02:00:00 (Sun)
  63011700000, #    local_end 1997-10-05 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63011664000, #    utc_start 1997-10-04 16:00:00 (Sat)
  63026784000, #      utc_end 1998-03-28 16:00:00 (Sat)
  63011703600, #  local_start 1997-10-05 03:00:00 (Sun)
  63026823600, #    local_end 1998-03-29 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63026784000, #    utc_start 1998-03-28 16:00:00 (Sat)
  63043113600, #      utc_end 1998-10-03 16:00:00 (Sat)
  63026820000, #  local_start 1998-03-29 02:00:00 (Sun)
  63043149600, #    local_end 1998-10-04 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63043113600, #    utc_start 1998-10-03 16:00:00 (Sat)
  63058233600, #      utc_end 1999-03-27 16:00:00 (Sat)
  63043153200, #  local_start 1998-10-04 03:00:00 (Sun)
  63058273200, #    local_end 1999-03-28 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63058233600, #    utc_start 1999-03-27 16:00:00 (Sat)
  63074563200, #      utc_end 1999-10-02 16:00:00 (Sat)
  63058269600, #  local_start 1999-03-28 02:00:00 (Sun)
  63074599200, #    local_end 1999-10-03 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63074563200, #    utc_start 1999-10-02 16:00:00 (Sat)
  63089683200, #      utc_end 2000-03-25 16:00:00 (Sat)
  63074602800, #  local_start 1999-10-03 03:00:00 (Sun)
  63089722800, #    local_end 2000-03-26 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63089683200, #    utc_start 2000-03-25 16:00:00 (Sat)
  63102988800, #      utc_end 2000-08-26 16:00:00 (Sat)
  63089719200, #  local_start 2000-03-26 02:00:00 (Sun)
  63103024800, #    local_end 2000-08-27 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63102988800, #    utc_start 2000-08-26 16:00:00 (Sat)
  63121132800, #      utc_end 2001-03-24 16:00:00 (Sat)
  63103028400, #  local_start 2000-08-27 03:00:00 (Sun)
  63121172400, #    local_end 2001-03-25 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63121132800, #    utc_start 2001-03-24 16:00:00 (Sat)
  63138067200, #      utc_end 2001-10-06 16:00:00 (Sat)
  63121168800, #  local_start 2001-03-25 02:00:00 (Sun)
  63138103200, #    local_end 2001-10-07 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63138067200, #    utc_start 2001-10-06 16:00:00 (Sat)
  63153187200, #      utc_end 2002-03-30 16:00:00 (Sat)
  63138106800, #  local_start 2001-10-07 03:00:00 (Sun)
  63153226800, #    local_end 2002-03-31 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63153187200, #    utc_start 2002-03-30 16:00:00 (Sat)
  63169516800, #      utc_end 2002-10-05 16:00:00 (Sat)
  63153223200, #  local_start 2002-03-31 02:00:00 (Sun)
  63169552800, #    local_end 2002-10-06 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63169516800, #    utc_start 2002-10-05 16:00:00 (Sat)
  63184636800, #      utc_end 2003-03-29 16:00:00 (Sat)
  63169556400, #  local_start 2002-10-06 03:00:00 (Sun)
  63184676400, #    local_end 2003-03-30 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63184636800, #    utc_start 2003-03-29 16:00:00 (Sat)
  63200966400, #      utc_end 2003-10-04 16:00:00 (Sat)
  63184672800, #  local_start 2003-03-30 02:00:00 (Sun)
  63201002400, #    local_end 2003-10-05 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63200966400, #    utc_start 2003-10-04 16:00:00 (Sat)
  63216086400, #      utc_end 2004-03-27 16:00:00 (Sat)
  63201006000, #  local_start 2003-10-05 03:00:00 (Sun)
  63216126000, #    local_end 2004-03-28 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63216086400, #    utc_start 2004-03-27 16:00:00 (Sat)
  63232416000, #      utc_end 2004-10-02 16:00:00 (Sat)
  63216122400, #  local_start 2004-03-28 02:00:00 (Sun)
  63232452000, #    local_end 2004-10-03 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63232416000, #    utc_start 2004-10-02 16:00:00 (Sat)
  63247536000, #      utc_end 2005-03-26 16:00:00 (Sat)
  63232455600, #  local_start 2004-10-03 03:00:00 (Sun)
  63247575600, #    local_end 2005-03-27 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63247536000, #    utc_start 2005-03-26 16:00:00 (Sat)
  63263865600, #      utc_end 2005-10-01 16:00:00 (Sat)
  63247572000, #  local_start 2005-03-27 02:00:00 (Sun)
  63263901600, #    local_end 2005-10-02 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63263865600, #    utc_start 2005-10-01 16:00:00 (Sat)
  63279590400, #      utc_end 2006-04-01 16:00:00 (Sat)
  63263905200, #  local_start 2005-10-02 03:00:00 (Sun)
  63279630000, #    local_end 2006-04-02 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63279590400, #    utc_start 2006-04-01 16:00:00 (Sat)
  63295315200, #      utc_end 2006-09-30 16:00:00 (Sat)
  63279626400, #  local_start 2006-04-02 02:00:00 (Sun)
  63295351200, #    local_end 2006-10-01 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63295315200, #    utc_start 2006-09-30 16:00:00 (Sat)
  63310435200, #      utc_end 2007-03-24 16:00:00 (Sat)
  63295354800, #  local_start 2006-10-01 03:00:00 (Sun)
  63310474800, #    local_end 2007-03-25 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63310435200, #    utc_start 2007-03-24 16:00:00 (Sat)
  63327369600, #      utc_end 2007-10-06 16:00:00 (Sat)
  63310471200, #  local_start 2007-03-25 02:00:00 (Sun)
  63327405600, #    local_end 2007-10-07 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63327369600, #    utc_start 2007-10-06 16:00:00 (Sat)
  63343094400, #      utc_end 2008-04-05 16:00:00 (Sat)
  63327409200, #  local_start 2007-10-07 03:00:00 (Sun)
  63343134000, #    local_end 2008-04-06 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63343094400, #    utc_start 2008-04-05 16:00:00 (Sat)
  63358819200, #      utc_end 2008-10-04 16:00:00 (Sat)
  63343130400, #  local_start 2008-04-06 02:00:00 (Sun)
  63358855200, #    local_end 2008-10-05 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63358819200, #    utc_start 2008-10-04 16:00:00 (Sat)
  63374544000, #      utc_end 2009-04-04 16:00:00 (Sat)
  63358858800, #  local_start 2008-10-05 03:00:00 (Sun)
  63374583600, #    local_end 2009-04-05 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63374544000, #    utc_start 2009-04-04 16:00:00 (Sat)
  63390268800, #      utc_end 2009-10-03 16:00:00 (Sat)
  63374580000, #  local_start 2009-04-05 02:00:00 (Sun)
  63390304800, #    local_end 2009-10-04 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63390268800, #    utc_start 2009-10-03 16:00:00 (Sat)
  63405993600, #      utc_end 2010-04-03 16:00:00 (Sat)
  63390308400, #  local_start 2009-10-04 03:00:00 (Sun)
  63406033200, #    local_end 2010-04-04 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63405993600, #    utc_start 2010-04-03 16:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  63406033200, #  local_start 2010-04-04 03:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  39600,
  0,
  '+11',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {45}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ANTARCTICA_MACQUARIE

    $main::fatpacked{"DateTime/TimeZone/Antarctica/Mawson.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ANTARCTICA_MAWSON';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/antarctica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Antarctica::Mawson;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Antarctica::Mawson::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  61634476800, #      utc_end 1954-02-13 00:00:00 (Sat)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  61634476800, #    local_end 1954-02-13 00:00:00 (Sat)
  0,
  0,
  '-00',
      ],
      [
  61634476800, #    utc_start 1954-02-13 00:00:00 (Sat)
  63391492800, #      utc_end 2009-10-17 20:00:00 (Sat)
  61634498400, #  local_start 1954-02-13 06:00:00 (Sat)
  63391514400, #    local_end 2009-10-18 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  63391492800, #    utc_start 2009-10-17 20:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  63391510800, #  local_start 2009-10-18 01:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  18000,
  0,
  '+05',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ANTARCTICA_MAWSON

    $main::fatpacked{"DateTime/TimeZone/Antarctica/Palmer.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ANTARCTICA_PALMER';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/southamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Antarctica::Palmer;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Antarctica::Palmer::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  61977916800, #      utc_end 1965-01-01 00:00:00 (Fri)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  61977916800, #    local_end 1965-01-01 00:00:00 (Fri)
  0,
  0,
  '-00',
      ],
      [
  61977916800, #    utc_start 1965-01-01 00:00:00 (Fri)
  61983025200, #      utc_end 1965-03-01 03:00:00 (Mon)
  61977906000, #  local_start 1964-12-31 21:00:00 (Thu)
  61983014400, #    local_end 1965-03-01 00:00:00 (Mon)
  -10800,
  1,
  '-03',
      ],
      [
  61983025200, #    utc_start 1965-03-01 03:00:00 (Mon)
  62002728000, #      utc_end 1965-10-15 04:00:00 (Fri)
  61983010800, #  local_start 1965-02-28 23:00:00 (Sun)
  62002713600, #    local_end 1965-10-15 00:00:00 (Fri)
  -14400,
  0,
  '-04',
      ],
      [
  62002728000, #    utc_start 1965-10-15 04:00:00 (Fri)
  62014561200, #      utc_end 1966-03-01 03:00:00 (Tue)
  62002717200, #  local_start 1965-10-15 01:00:00 (Fri)
  62014550400, #    local_end 1966-03-01 00:00:00 (Tue)
  -10800,
  1,
  '-03',
      ],
      [
  62014561200, #    utc_start 1966-03-01 03:00:00 (Tue)
  62034264000, #      utc_end 1966-10-15 04:00:00 (Sat)
  62014546800, #  local_start 1966-02-28 23:00:00 (Mon)
  62034249600, #    local_end 1966-10-15 00:00:00 (Sat)
  -14400,
  0,
  '-04',
      ],
      [
  62034264000, #    utc_start 1966-10-15 04:00:00 (Sat)
  62048862000, #      utc_end 1967-04-02 03:00:00 (Sun)
  62034253200, #  local_start 1966-10-15 01:00:00 (Sat)
  62048851200, #    local_end 1967-04-02 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62048862000, #    utc_start 1967-04-02 03:00:00 (Sun)
  62064590400, #      utc_end 1967-10-01 04:00:00 (Sun)
  62048847600, #  local_start 1967-04-01 23:00:00 (Sat)
  62064576000, #    local_end 1967-10-01 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62064590400, #    utc_start 1967-10-01 04:00:00 (Sun)
  62080916400, #      utc_end 1968-04-07 03:00:00 (Sun)
  62064579600, #  local_start 1967-10-01 01:00:00 (Sun)
  62080905600, #    local_end 1968-04-07 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62080916400, #    utc_start 1968-04-07 03:00:00 (Sun)
  62096644800, #      utc_end 1968-10-06 04:00:00 (Sun)
  62080902000, #  local_start 1968-04-06 23:00:00 (Sat)
  62096630400, #    local_end 1968-10-06 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62096644800, #    utc_start 1968-10-06 04:00:00 (Sun)
  62112366000, #      utc_end 1969-04-06 03:00:00 (Sun)
  62096634000, #  local_start 1968-10-06 01:00:00 (Sun)
  62112355200, #    local_end 1969-04-06 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62112366000, #    utc_start 1969-04-06 03:00:00 (Sun)
  62128094400, #      utc_end 1969-10-05 04:00:00 (Sun)
  62112351600, #  local_start 1969-04-05 23:00:00 (Sat)
  62128080000, #    local_end 1969-10-05 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62128094400, #    utc_start 1969-10-05 04:00:00 (Sun)
  62263825200, #      utc_end 1974-01-23 03:00:00 (Wed)
  62128083600, #  local_start 1969-10-05 01:00:00 (Sun)
  62263814400, #    local_end 1974-01-23 00:00:00 (Wed)
  -10800,
  0,
  '-03',
      ],
      [
  62263825200, #    utc_start 1974-01-23 03:00:00 (Wed)
  62272288800, #      utc_end 1974-05-01 02:00:00 (Wed)
  62263818000, #  local_start 1974-01-23 01:00:00 (Wed)
  62272281600, #    local_end 1974-05-01 00:00:00 (Wed)
  -7200,
  1,
  '-02',
      ],
      [
  62272288800, #    utc_start 1974-05-01 02:00:00 (Wed)
  62524753200, #      utc_end 1982-05-01 03:00:00 (Sat)
  62272278000, #  local_start 1974-04-30 23:00:00 (Tue)
  62524742400, #    local_end 1982-05-01 00:00:00 (Sat)
  -10800,
  0,
  '-03',
      ],
      [
  62524753200, #    utc_start 1982-05-01 03:00:00 (Sat)
  62538753600, #      utc_end 1982-10-10 04:00:00 (Sun)
  62524738800, #  local_start 1982-04-30 23:00:00 (Fri)
  62538739200, #    local_end 1982-10-10 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62538753600, #    utc_start 1982-10-10 04:00:00 (Sun)
  62552055600, #      utc_end 1983-03-13 03:00:00 (Sun)
  62538742800, #  local_start 1982-10-10 01:00:00 (Sun)
  62552044800, #    local_end 1983-03-13 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62552055600, #    utc_start 1983-03-13 03:00:00 (Sun)
  62570203200, #      utc_end 1983-10-09 04:00:00 (Sun)
  62552041200, #  local_start 1983-03-12 23:00:00 (Sat)
  62570188800, #    local_end 1983-10-09 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62570203200, #    utc_start 1983-10-09 04:00:00 (Sun)
  62583505200, #      utc_end 1984-03-11 03:00:00 (Sun)
  62570192400, #  local_start 1983-10-09 01:00:00 (Sun)
  62583494400, #    local_end 1984-03-11 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62583505200, #    utc_start 1984-03-11 03:00:00 (Sun)
  62602257600, #      utc_end 1984-10-14 04:00:00 (Sun)
  62583490800, #  local_start 1984-03-10 23:00:00 (Sat)
  62602243200, #    local_end 1984-10-14 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62602257600, #    utc_start 1984-10-14 04:00:00 (Sun)
  62614954800, #      utc_end 1985-03-10 03:00:00 (Sun)
  62602246800, #  local_start 1984-10-14 01:00:00 (Sun)
  62614944000, #    local_end 1985-03-10 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62614954800, #    utc_start 1985-03-10 03:00:00 (Sun)
  62633707200, #      utc_end 1985-10-13 04:00:00 (Sun)
  62614940400, #  local_start 1985-03-09 23:00:00 (Sat)
  62633692800, #    local_end 1985-10-13 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62633707200, #    utc_start 1985-10-13 04:00:00 (Sun)
  62646404400, #      utc_end 1986-03-09 03:00:00 (Sun)
  62633696400, #  local_start 1985-10-13 01:00:00 (Sun)
  62646393600, #    local_end 1986-03-09 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62646404400, #    utc_start 1986-03-09 03:00:00 (Sun)
  62665156800, #      utc_end 1986-10-12 04:00:00 (Sun)
  62646390000, #  local_start 1986-03-08 23:00:00 (Sat)
  62665142400, #    local_end 1986-10-12 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62665156800, #    utc_start 1986-10-12 04:00:00 (Sun)
  62680878000, #      utc_end 1987-04-12 03:00:00 (Sun)
  62665146000, #  local_start 1986-10-12 01:00:00 (Sun)
  62680867200, #    local_end 1987-04-12 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62680878000, #    utc_start 1987-04-12 03:00:00 (Sun)
  62696606400, #      utc_end 1987-10-11 04:00:00 (Sun)
  62680863600, #  local_start 1987-04-11 23:00:00 (Sat)
  62696592000, #    local_end 1987-10-11 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62696606400, #    utc_start 1987-10-11 04:00:00 (Sun)
  62709908400, #      utc_end 1988-03-13 03:00:00 (Sun)
  62696595600, #  local_start 1987-10-11 01:00:00 (Sun)
  62709897600, #    local_end 1988-03-13 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62709908400, #    utc_start 1988-03-13 03:00:00 (Sun)
  62728056000, #      utc_end 1988-10-09 04:00:00 (Sun)
  62709894000, #  local_start 1988-03-12 23:00:00 (Sat)
  62728041600, #    local_end 1988-10-09 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62728056000, #    utc_start 1988-10-09 04:00:00 (Sun)
  62741358000, #      utc_end 1989-03-12 03:00:00 (Sun)
  62728045200, #  local_start 1988-10-09 01:00:00 (Sun)
  62741347200, #    local_end 1989-03-12 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62741358000, #    utc_start 1989-03-12 03:00:00 (Sun)
  62760110400, #      utc_end 1989-10-15 04:00:00 (Sun)
  62741343600, #  local_start 1989-03-11 23:00:00 (Sat)
  62760096000, #    local_end 1989-10-15 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62760110400, #    utc_start 1989-10-15 04:00:00 (Sun)
  62772807600, #      utc_end 1990-03-11 03:00:00 (Sun)
  62760099600, #  local_start 1989-10-15 01:00:00 (Sun)
  62772796800, #    local_end 1990-03-11 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62772807600, #    utc_start 1990-03-11 03:00:00 (Sun)
  62789140800, #      utc_end 1990-09-16 04:00:00 (Sun)
  62772793200, #  local_start 1990-03-10 23:00:00 (Sat)
  62789126400, #    local_end 1990-09-16 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62789140800, #    utc_start 1990-09-16 04:00:00 (Sun)
  62804257200, #      utc_end 1991-03-10 03:00:00 (Sun)
  62789130000, #  local_start 1990-09-16 01:00:00 (Sun)
  62804246400, #    local_end 1991-03-10 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62804257200, #    utc_start 1991-03-10 03:00:00 (Sun)
  62823009600, #      utc_end 1991-10-13 04:00:00 (Sun)
  62804242800, #  local_start 1991-03-09 23:00:00 (Sat)
  62822995200, #    local_end 1991-10-13 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62823009600, #    utc_start 1991-10-13 04:00:00 (Sun)
  62836311600, #      utc_end 1992-03-15 03:00:00 (Sun)
  62822998800, #  local_start 1991-10-13 01:00:00 (Sun)
  62836300800, #    local_end 1992-03-15 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62836311600, #    utc_start 1992-03-15 03:00:00 (Sun)
  62854459200, #      utc_end 1992-10-11 04:00:00 (Sun)
  62836297200, #  local_start 1992-03-14 23:00:00 (Sat)
  62854444800, #    local_end 1992-10-11 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62854459200, #    utc_start 1992-10-11 04:00:00 (Sun)
  62867761200, #      utc_end 1993-03-14 03:00:00 (Sun)
  62854448400, #  local_start 1992-10-11 01:00:00 (Sun)
  62867750400, #    local_end 1993-03-14 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62867761200, #    utc_start 1993-03-14 03:00:00 (Sun)
  62885908800, #      utc_end 1993-10-10 04:00:00 (Sun)
  62867746800, #  local_start 1993-03-13 23:00:00 (Sat)
  62885894400, #    local_end 1993-10-10 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62885908800, #    utc_start 1993-10-10 04:00:00 (Sun)
  62899210800, #      utc_end 1994-03-13 03:00:00 (Sun)
  62885898000, #  local_start 1993-10-10 01:00:00 (Sun)
  62899200000, #    local_end 1994-03-13 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62899210800, #    utc_start 1994-03-13 03:00:00 (Sun)
  62917358400, #      utc_end 1994-10-09 04:00:00 (Sun)
  62899196400, #  local_start 1994-03-12 23:00:00 (Sat)
  62917344000, #    local_end 1994-10-09 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62917358400, #    utc_start 1994-10-09 04:00:00 (Sun)
  62930660400, #      utc_end 1995-03-12 03:00:00 (Sun)
  62917347600, #  local_start 1994-10-09 01:00:00 (Sun)
  62930649600, #    local_end 1995-03-12 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62930660400, #    utc_start 1995-03-12 03:00:00 (Sun)
  62949412800, #      utc_end 1995-10-15 04:00:00 (Sun)
  62930646000, #  local_start 1995-03-11 23:00:00 (Sat)
  62949398400, #    local_end 1995-10-15 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62949412800, #    utc_start 1995-10-15 04:00:00 (Sun)
  62962110000, #      utc_end 1996-03-10 03:00:00 (Sun)
  62949402000, #  local_start 1995-10-15 01:00:00 (Sun)
  62962099200, #    local_end 1996-03-10 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62962110000, #    utc_start 1996-03-10 03:00:00 (Sun)
  62980862400, #      utc_end 1996-10-13 04:00:00 (Sun)
  62962095600, #  local_start 1996-03-09 23:00:00 (Sat)
  62980848000, #    local_end 1996-10-13 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62980862400, #    utc_start 1996-10-13 04:00:00 (Sun)
  62995374000, #      utc_end 1997-03-30 03:00:00 (Sun)
  62980851600, #  local_start 1996-10-13 01:00:00 (Sun)
  62995363200, #    local_end 1997-03-30 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62995374000, #    utc_start 1997-03-30 03:00:00 (Sun)
  63012312000, #      utc_end 1997-10-12 04:00:00 (Sun)
  62995359600, #  local_start 1997-03-29 23:00:00 (Sat)
  63012297600, #    local_end 1997-10-12 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63012312000, #    utc_start 1997-10-12 04:00:00 (Sun)
  63025614000, #      utc_end 1998-03-15 03:00:00 (Sun)
  63012301200, #  local_start 1997-10-12 01:00:00 (Sun)
  63025603200, #    local_end 1998-03-15 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63025614000, #    utc_start 1998-03-15 03:00:00 (Sun)
  63042552000, #      utc_end 1998-09-27 04:00:00 (Sun)
  63025599600, #  local_start 1998-03-14 23:00:00 (Sat)
  63042537600, #    local_end 1998-09-27 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63042552000, #    utc_start 1998-09-27 04:00:00 (Sun)
  63058878000, #      utc_end 1999-04-04 03:00:00 (Sun)
  63042541200, #  local_start 1998-09-27 01:00:00 (Sun)
  63058867200, #    local_end 1999-04-04 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63058878000, #    utc_start 1999-04-04 03:00:00 (Sun)
  63075211200, #      utc_end 1999-10-10 04:00:00 (Sun)
  63058863600, #  local_start 1999-04-03 23:00:00 (Sat)
  63075196800, #    local_end 1999-10-10 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63075211200, #    utc_start 1999-10-10 04:00:00 (Sun)
  63088513200, #      utc_end 2000-03-12 03:00:00 (Sun)
  63075200400, #  local_start 1999-10-10 01:00:00 (Sun)
  63088502400, #    local_end 2000-03-12 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63088513200, #    utc_start 2000-03-12 03:00:00 (Sun)
  63107265600, #      utc_end 2000-10-15 04:00:00 (Sun)
  63088498800, #  local_start 2000-03-11 23:00:00 (Sat)
  63107251200, #    local_end 2000-10-15 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63107265600, #    utc_start 2000-10-15 04:00:00 (Sun)
  63119962800, #      utc_end 2001-03-11 03:00:00 (Sun)
  63107254800, #  local_start 2000-10-15 01:00:00 (Sun)
  63119952000, #    local_end 2001-03-11 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63119962800, #    utc_start 2001-03-11 03:00:00 (Sun)
  63138715200, #      utc_end 2001-10-14 04:00:00 (Sun)
  63119948400, #  local_start 2001-03-10 23:00:00 (Sat)
  63138700800, #    local_end 2001-10-14 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63138715200, #    utc_start 2001-10-14 04:00:00 (Sun)
  63151412400, #      utc_end 2002-03-10 03:00:00 (Sun)
  63138704400, #  local_start 2001-10-14 01:00:00 (Sun)
  63151401600, #    local_end 2002-03-10 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63151412400, #    utc_start 2002-03-10 03:00:00 (Sun)
  63170164800, #      utc_end 2002-10-13 04:00:00 (Sun)
  63151398000, #  local_start 2002-03-09 23:00:00 (Sat)
  63170150400, #    local_end 2002-10-13 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63170164800, #    utc_start 2002-10-13 04:00:00 (Sun)
  63182862000, #      utc_end 2003-03-09 03:00:00 (Sun)
  63170154000, #  local_start 2002-10-13 01:00:00 (Sun)
  63182851200, #    local_end 2003-03-09 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63182862000, #    utc_start 2003-03-09 03:00:00 (Sun)
  63201614400, #      utc_end 2003-10-12 04:00:00 (Sun)
  63182847600, #  local_start 2003-03-08 23:00:00 (Sat)
  63201600000, #    local_end 2003-10-12 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63201614400, #    utc_start 2003-10-12 04:00:00 (Sun)
  63214916400, #      utc_end 2004-03-14 03:00:00 (Sun)
  63201603600, #  local_start 2003-10-12 01:00:00 (Sun)
  63214905600, #    local_end 2004-03-14 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63214916400, #    utc_start 2004-03-14 03:00:00 (Sun)
  63233064000, #      utc_end 2004-10-10 04:00:00 (Sun)
  63214902000, #  local_start 2004-03-13 23:00:00 (Sat)
  63233049600, #    local_end 2004-10-10 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63233064000, #    utc_start 2004-10-10 04:00:00 (Sun)
  63246366000, #      utc_end 2005-03-13 03:00:00 (Sun)
  63233053200, #  local_start 2004-10-10 01:00:00 (Sun)
  63246355200, #    local_end 2005-03-13 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63246366000, #    utc_start 2005-03-13 03:00:00 (Sun)
  63264513600, #      utc_end 2005-10-09 04:00:00 (Sun)
  63246351600, #  local_start 2005-03-12 23:00:00 (Sat)
  63264499200, #    local_end 2005-10-09 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63264513600, #    utc_start 2005-10-09 04:00:00 (Sun)
  63277815600, #      utc_end 2006-03-12 03:00:00 (Sun)
  63264502800, #  local_start 2005-10-09 01:00:00 (Sun)
  63277804800, #    local_end 2006-03-12 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63277815600, #    utc_start 2006-03-12 03:00:00 (Sun)
  63296568000, #      utc_end 2006-10-15 04:00:00 (Sun)
  63277801200, #  local_start 2006-03-11 23:00:00 (Sat)
  63296553600, #    local_end 2006-10-15 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63296568000, #    utc_start 2006-10-15 04:00:00 (Sun)
  63309265200, #      utc_end 2007-03-11 03:00:00 (Sun)
  63296557200, #  local_start 2006-10-15 01:00:00 (Sun)
  63309254400, #    local_end 2007-03-11 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63309265200, #    utc_start 2007-03-11 03:00:00 (Sun)
  63328017600, #      utc_end 2007-10-14 04:00:00 (Sun)
  63309250800, #  local_start 2007-03-10 23:00:00 (Sat)
  63328003200, #    local_end 2007-10-14 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63328017600, #    utc_start 2007-10-14 04:00:00 (Sun)
  63342529200, #      utc_end 2008-03-30 03:00:00 (Sun)
  63328006800, #  local_start 2007-10-14 01:00:00 (Sun)
  63342518400, #    local_end 2008-03-30 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63342529200, #    utc_start 2008-03-30 03:00:00 (Sun)
  63359467200, #      utc_end 2008-10-12 04:00:00 (Sun)
  63342514800, #  local_start 2008-03-29 23:00:00 (Sat)
  63359452800, #    local_end 2008-10-12 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63359467200, #    utc_start 2008-10-12 04:00:00 (Sun)
  63372769200, #      utc_end 2009-03-15 03:00:00 (Sun)
  63359456400, #  local_start 2008-10-12 01:00:00 (Sun)
  63372758400, #    local_end 2009-03-15 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63372769200, #    utc_start 2009-03-15 03:00:00 (Sun)
  63390916800, #      utc_end 2009-10-11 04:00:00 (Sun)
  63372754800, #  local_start 2009-03-14 23:00:00 (Sat)
  63390902400, #    local_end 2009-10-11 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63390916800, #    utc_start 2009-10-11 04:00:00 (Sun)
  63406033200, #      utc_end 2010-04-04 03:00:00 (Sun)
  63390906000, #  local_start 2009-10-11 01:00:00 (Sun)
  63406022400, #    local_end 2010-04-04 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63406033200, #    utc_start 2010-04-04 03:00:00 (Sun)
  63422366400, #      utc_end 2010-10-10 04:00:00 (Sun)
  63406018800, #  local_start 2010-04-03 23:00:00 (Sat)
  63422352000, #    local_end 2010-10-10 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63422366400, #    utc_start 2010-10-10 04:00:00 (Sun)
  63440506800, #      utc_end 2011-05-08 03:00:00 (Sun)
  63422355600, #  local_start 2010-10-10 01:00:00 (Sun)
  63440496000, #    local_end 2011-05-08 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63440506800, #    utc_start 2011-05-08 03:00:00 (Sun)
  63449582400, #      utc_end 2011-08-21 04:00:00 (Sun)
  63440492400, #  local_start 2011-05-07 23:00:00 (Sat)
  63449568000, #    local_end 2011-08-21 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63449582400, #    utc_start 2011-08-21 04:00:00 (Sun)
  63471351600, #      utc_end 2012-04-29 03:00:00 (Sun)
  63449571600, #  local_start 2011-08-21 01:00:00 (Sun)
  63471340800, #    local_end 2012-04-29 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63471351600, #    utc_start 2012-04-29 03:00:00 (Sun)
  63482241600, #      utc_end 2012-09-02 04:00:00 (Sun)
  63471337200, #  local_start 2012-04-28 23:00:00 (Sat)
  63482227200, #    local_end 2012-09-02 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63482241600, #    utc_start 2012-09-02 04:00:00 (Sun)
  63502801200, #      utc_end 2013-04-28 03:00:00 (Sun)
  63482230800, #  local_start 2012-09-02 01:00:00 (Sun)
  63502790400, #    local_end 2013-04-28 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63502801200, #    utc_start 2013-04-28 03:00:00 (Sun)
  63514296000, #      utc_end 2013-09-08 04:00:00 (Sun)
  63502786800, #  local_start 2013-04-27 23:00:00 (Sat)
  63514281600, #    local_end 2013-09-08 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63514296000, #    utc_start 2013-09-08 04:00:00 (Sun)
  63534250800, #      utc_end 2014-04-27 03:00:00 (Sun)
  63514285200, #  local_start 2013-09-08 01:00:00 (Sun)
  63534240000, #    local_end 2014-04-27 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63534250800, #    utc_start 2014-04-27 03:00:00 (Sun)
  63545745600, #      utc_end 2014-09-07 04:00:00 (Sun)
  63534236400, #  local_start 2014-04-26 23:00:00 (Sat)
  63545731200, #    local_end 2014-09-07 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63545745600, #    utc_start 2014-09-07 04:00:00 (Sun)
  63598964400, #      utc_end 2016-05-15 03:00:00 (Sun)
  63545734800, #  local_start 2014-09-07 01:00:00 (Sun)
  63598953600, #    local_end 2016-05-15 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63598964400, #    utc_start 2016-05-15 03:00:00 (Sun)
  63606830400, #      utc_end 2016-08-14 04:00:00 (Sun)
  63598950000, #  local_start 2016-05-14 23:00:00 (Sat)
  63606816000, #    local_end 2016-08-14 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63606830400, #    utc_start 2016-08-14 04:00:00 (Sun)
  63616503600, #      utc_end 2016-12-04 03:00:00 (Sun)
  63606819600, #  local_start 2016-08-14 01:00:00 (Sun)
  63616492800, #    local_end 2016-12-04 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63616503600, #    utc_start 2016-12-04 03:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #      utc_end
  63616492800, #  local_start 2016-12-04 00:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  -10800,
  0,
  '-03',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {40}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ANTARCTICA_PALMER

    $main::fatpacked{"DateTime/TimeZone/Antarctica/Rothera.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ANTARCTICA_ROTHERA';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/antarctica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Antarctica::Rothera;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Antarctica::Rothera::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  62353929600, #      utc_end 1976-12-01 00:00:00 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  62353929600, #    local_end 1976-12-01 00:00:00 (Wed)
  0,
  0,
  '-00',
      ],
      [
  62353929600, #    utc_start 1976-12-01 00:00:00 (Wed)
  DateTime::TimeZone::INFINITY, #      utc_end
  62353918800, #  local_start 1976-11-30 21:00:00 (Tue)
  DateTime::TimeZone::INFINITY, #    local_end
  -10800,
  0,
  '-03',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ANTARCTICA_ROTHERA

    $main::fatpacked{"DateTime/TimeZone/Antarctica/Syowa.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ANTARCTICA_SYOWA';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/antarctica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Antarctica::Syowa;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Antarctica::Syowa::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  61727875200, #      utc_end 1957-01-29 00:00:00 (Tue)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  61727875200, #    local_end 1957-01-29 00:00:00 (Tue)
  0,
  0,
  '-00',
      ],
      [
  61727875200, #    utc_start 1957-01-29 00:00:00 (Tue)
  DateTime::TimeZone::INFINITY, #      utc_end
  61727886000, #  local_start 1957-01-29 03:00:00 (Tue)
  DateTime::TimeZone::INFINITY, #    local_end
  10800,
  0,
  '+03',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ANTARCTICA_SYOWA

    $main::fatpacked{"DateTime/TimeZone/Antarctica/Troll.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ANTARCTICA_TROLL';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/antarctica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Antarctica::Troll;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Antarctica::Troll::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  63243849600, #      utc_end 2005-02-12 00:00:00 (Sat)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  63243849600, #    local_end 2005-02-12 00:00:00 (Sat)
  0,
  0,
  '-00',
      ],
      [
  63243849600, #    utc_start 2005-02-12 00:00:00 (Sat)
  63247568400, #      utc_end 2005-03-27 01:00:00 (Sun)
  63243849600, #  local_start 2005-02-12 00:00:00 (Sat)
  63247568400, #    local_end 2005-03-27 01:00:00 (Sun)
  0,
  0,
  '+00',
      ],
      [
  63247568400, #    utc_start 2005-03-27 01:00:00 (Sun)
  63266317200, #      utc_end 2005-10-30 01:00:00 (Sun)
  63247575600, #  local_start 2005-03-27 03:00:00 (Sun)
  63266324400, #    local_end 2005-10-30 03:00:00 (Sun)
  7200,
  1,
  '+02',
      ],
      [
  63266317200, #    utc_start 2005-10-30 01:00:00 (Sun)
  63279018000, #      utc_end 2006-03-26 01:00:00 (Sun)
  63266317200, #  local_start 2005-10-30 01:00:00 (Sun)
  63279018000, #    local_end 2006-03-26 01:00:00 (Sun)
  0,
  0,
  '+00',
      ],
      [
  63279018000, #    utc_start 2006-03-26 01:00:00 (Sun)
  63297766800, #      utc_end 2006-10-29 01:00:00 (Sun)
  63279025200, #  local_start 2006-03-26 03:00:00 (Sun)
  63297774000, #    local_end 2006-10-29 03:00:00 (Sun)
  7200,
  1,
  '+02',
      ],
      [
  63297766800, #    utc_start 2006-10-29 01:00:00 (Sun)
  63310467600, #      utc_end 2007-03-25 01:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63310467600, #    local_end 2007-03-25 01:00:00 (Sun)
  0,
  0,
  '+00',
      ],
      [
  63310467600, #    utc_start 2007-03-25 01:00:00 (Sun)
  63329216400, #      utc_end 2007-10-28 01:00:00 (Sun)
  63310474800, #  local_start 2007-03-25 03:00:00 (Sun)
  63329223600, #    local_end 2007-10-28 03:00:00 (Sun)
  7200,
  1,
  '+02',
      ],
      [
  63329216400, #    utc_start 2007-10-28 01:00:00 (Sun)
  63342522000, #      utc_end 2008-03-30 01:00:00 (Sun)
  63329216400, #  local_start 2007-10-28 01:00:00 (Sun)
  63342522000, #    local_end 2008-03-30 01:00:00 (Sun)
  0,
  0,
  '+00',
      ],
      [
  63342522000, #    utc_start 2008-03-30 01:00:00 (Sun)
  63360666000, #      utc_end 2008-10-26 01:00:00 (Sun)
  63342529200, #  local_start 2008-03-30 03:00:00 (Sun)
  63360673200, #    local_end 2008-10-26 03:00:00 (Sun)
  7200,
  1,
  '+02',
      ],
      [
  63360666000, #    utc_start 2008-10-26 01:00:00 (Sun)
  63373971600, #      utc_end 2009-03-29 01:00:00 (Sun)
  63360666000, #  local_start 2008-10-26 01:00:00 (Sun)
  63373971600, #    local_end 2009-03-29 01:00:00 (Sun)
  0,
  0,
  '+00',
      ],
      [
  63373971600, #    utc_start 2009-03-29 01:00:00 (Sun)
  63392115600, #      utc_end 2009-10-25 01:00:00 (Sun)
  63373978800, #  local_start 2009-03-29 03:00:00 (Sun)
  63392122800, #    local_end 2009-10-25 03:00:00 (Sun)
  7200,
  1,
  '+02',
      ],
      [
  63392115600, #    utc_start 2009-10-25 01:00:00 (Sun)
  63405421200, #      utc_end 2010-03-28 01:00:00 (Sun)
  63392115600, #  local_start 2009-10-25 01:00:00 (Sun)
  63405421200, #    local_end 2010-03-28 01:00:00 (Sun)
  0,
  0,
  '+00',
      ],
      [
  63405421200, #    utc_start 2010-03-28 01:00:00 (Sun)
  63424170000, #      utc_end 2010-10-31 01:00:00 (Sun)
  63405428400, #  local_start 2010-03-28 03:00:00 (Sun)
  63424177200, #    local_end 2010-10-31 03:00:00 (Sun)
  7200,
  1,
  '+02',
      ],
      [
  63424170000, #    utc_start 2010-10-31 01:00:00 (Sun)
  63436870800, #      utc_end 2011-03-27 01:00:00 (Sun)
  63424170000, #  local_start 2010-10-31 01:00:00 (Sun)
  63436870800, #    local_end 2011-03-27 01:00:00 (Sun)
  0,
  0,
  '+00',
      ],
      [
  63436870800, #    utc_start 2011-03-27 01:00:00 (Sun)
  63455619600, #      utc_end 2011-10-30 01:00:00 (Sun)
  63436878000, #  local_start 2011-03-27 03:00:00 (Sun)
  63455626800, #    local_end 2011-10-30 03:00:00 (Sun)
  7200,
  1,
  '+02',
      ],
      [
  63455619600, #    utc_start 2011-10-30 01:00:00 (Sun)
  63468320400, #      utc_end 2012-03-25 01:00:00 (Sun)
  63455619600, #  local_start 2011-10-30 01:00:00 (Sun)
  63468320400, #    local_end 2012-03-25 01:00:00 (Sun)
  0,
  0,
  '+00',
      ],
      [
  63468320400, #    utc_start 2012-03-25 01:00:00 (Sun)
  63487069200, #      utc_end 2012-10-28 01:00:00 (Sun)
  63468327600, #  local_start 2012-03-25 03:00:00 (Sun)
  63487076400, #    local_end 2012-10-28 03:00:00 (Sun)
  7200,
  1,
  '+02',
      ],
      [
  63487069200, #    utc_start 2012-10-28 01:00:00 (Sun)
  63500374800, #      utc_end 2013-03-31 01:00:00 (Sun)
  63487069200, #  local_start 2012-10-28 01:00:00 (Sun)
  63500374800, #    local_end 2013-03-31 01:00:00 (Sun)
  0,
  0,
  '+00',
      ],
      [
  63500374800, #    utc_start 2013-03-31 01:00:00 (Sun)
  63518518800, #      utc_end 2013-10-27 01:00:00 (Sun)
  63500382000, #  local_start 2013-03-31 03:00:00 (Sun)
  63518526000, #    local_end 2013-10-27 03:00:00 (Sun)
  7200,
  1,
  '+02',
      ],
      [
  63518518800, #    utc_start 2013-10-27 01:00:00 (Sun)
  63531824400, #      utc_end 2014-03-30 01:00:00 (Sun)
  63518518800, #  local_start 2013-10-27 01:00:00 (Sun)
  63531824400, #    local_end 2014-03-30 01:00:00 (Sun)
  0,
  0,
  '+00',
      ],
      [
  63531824400, #    utc_start 2014-03-30 01:00:00 (Sun)
  63549968400, #      utc_end 2014-10-26 01:00:00 (Sun)
  63531831600, #  local_start 2014-03-30 03:00:00 (Sun)
  63549975600, #    local_end 2014-10-26 03:00:00 (Sun)
  7200,
  1,
  '+02',
      ],
      [
  63549968400, #    utc_start 2014-10-26 01:00:00 (Sun)
  63563274000, #      utc_end 2015-03-29 01:00:00 (Sun)
  63549968400, #  local_start 2014-10-26 01:00:00 (Sun)
  63563274000, #    local_end 2015-03-29 01:00:00 (Sun)
  0,
  0,
  '+00',
      ],
      [
  63563274000, #    utc_start 2015-03-29 01:00:00 (Sun)
  63581418000, #      utc_end 2015-10-25 01:00:00 (Sun)
  63563281200, #  local_start 2015-03-29 03:00:00 (Sun)
  63581425200, #    local_end 2015-10-25 03:00:00 (Sun)
  7200,
  1,
  '+02',
      ],
      [
  63581418000, #    utc_start 2015-10-25 01:00:00 (Sun)
  63594723600, #      utc_end 2016-03-27 01:00:00 (Sun)
  63581418000, #  local_start 2015-10-25 01:00:00 (Sun)
  63594723600, #    local_end 2016-03-27 01:00:00 (Sun)
  0,
  0,
  '+00',
      ],
      [
  63594723600, #    utc_start 2016-03-27 01:00:00 (Sun)
  63613472400, #      utc_end 2016-10-30 01:00:00 (Sun)
  63594730800, #  local_start 2016-03-27 03:00:00 (Sun)
  63613479600, #    local_end 2016-10-30 03:00:00 (Sun)
  7200,
  1,
  '+02',
      ],
      [
  63613472400, #    utc_start 2016-10-30 01:00:00 (Sun)
  63626173200, #      utc_end 2017-03-26 01:00:00 (Sun)
  63613472400, #  local_start 2016-10-30 01:00:00 (Sun)
  63626173200, #    local_end 2017-03-26 01:00:00 (Sun)
  0,
  0,
  '+00',
      ],
      [
  63626173200, #    utc_start 2017-03-26 01:00:00 (Sun)
  63644922000, #      utc_end 2017-10-29 01:00:00 (Sun)
  63626180400, #  local_start 2017-03-26 03:00:00 (Sun)
  63644929200, #    local_end 2017-10-29 03:00:00 (Sun)
  7200,
  1,
  '+02',
      ],
      [
  63644922000, #    utc_start 2017-10-29 01:00:00 (Sun)
  63657622800, #      utc_end 2018-03-25 01:00:00 (Sun)
  63644922000, #  local_start 2017-10-29 01:00:00 (Sun)
  63657622800, #    local_end 2018-03-25 01:00:00 (Sun)
  0,
  0,
  '+00',
      ],
      [
  63657622800, #    utc_start 2018-03-25 01:00:00 (Sun)
  63676371600, #      utc_end 2018-10-28 01:00:00 (Sun)
  63657630000, #  local_start 2018-03-25 03:00:00 (Sun)
  63676378800, #    local_end 2018-10-28 03:00:00 (Sun)
  7200,
  1,
  '+02',
      ],
      [
  63676371600, #    utc_start 2018-10-28 01:00:00 (Sun)
  63689677200, #      utc_end 2019-03-31 01:00:00 (Sun)
  63676371600, #  local_start 2018-10-28 01:00:00 (Sun)
  63689677200, #    local_end 2019-03-31 01:00:00 (Sun)
  0,
  0,
  '+00',
      ],
      [
  63689677200, #    utc_start 2019-03-31 01:00:00 (Sun)
  63707821200, #      utc_end 2019-10-27 01:00:00 (Sun)
  63689684400, #  local_start 2019-03-31 03:00:00 (Sun)
  63707828400, #    local_end 2019-10-27 03:00:00 (Sun)
  7200,
  1,
  '+02',
      ],
      [
  63707821200, #    utc_start 2019-10-27 01:00:00 (Sun)
  63721126800, #      utc_end 2020-03-29 01:00:00 (Sun)
  63707821200, #  local_start 2019-10-27 01:00:00 (Sun)
  63721126800, #    local_end 2020-03-29 01:00:00 (Sun)
  0,
  0,
  '+00',
      ],
      [
  63721126800, #    utc_start 2020-03-29 01:00:00 (Sun)
  63739270800, #      utc_end 2020-10-25 01:00:00 (Sun)
  63721134000, #  local_start 2020-03-29 03:00:00 (Sun)
  63739278000, #    local_end 2020-10-25 03:00:00 (Sun)
  7200,
  1,
  '+02',
      ],
      [
  63739270800, #    utc_start 2020-10-25 01:00:00 (Sun)
  63752576400, #      utc_end 2021-03-28 01:00:00 (Sun)
  63739270800, #  local_start 2020-10-25 01:00:00 (Sun)
  63752576400, #    local_end 2021-03-28 01:00:00 (Sun)
  0,
  0,
  '+00',
      ],
      [
  63752576400, #    utc_start 2021-03-28 01:00:00 (Sun)
  63771325200, #      utc_end 2021-10-31 01:00:00 (Sun)
  63752583600, #  local_start 2021-03-28 03:00:00 (Sun)
  63771332400, #    local_end 2021-10-31 03:00:00 (Sun)
  7200,
  1,
  '+02',
      ],
      [
  63771325200, #    utc_start 2021-10-31 01:00:00 (Sun)
  63784026000, #      utc_end 2022-03-27 01:00:00 (Sun)
  63771325200, #  local_start 2021-10-31 01:00:00 (Sun)
  63784026000, #    local_end 2022-03-27 01:00:00 (Sun)
  0,
  0,
  '+00',
      ],
      [
  63784026000, #    utc_start 2022-03-27 01:00:00 (Sun)
  63802774800, #      utc_end 2022-10-30 01:00:00 (Sun)
  63784033200, #  local_start 2022-03-27 03:00:00 (Sun)
  63802782000, #    local_end 2022-10-30 03:00:00 (Sun)
  7200,
  1,
  '+02',
      ],
      [
  63802774800, #    utc_start 2022-10-30 01:00:00 (Sun)
  63815475600, #      utc_end 2023-03-26 01:00:00 (Sun)
  63802774800, #  local_start 2022-10-30 01:00:00 (Sun)
  63815475600, #    local_end 2023-03-26 01:00:00 (Sun)
  0,
  0,
  '+00',
      ],
      [
  63815475600, #    utc_start 2023-03-26 01:00:00 (Sun)
  63834224400, #      utc_end 2023-10-29 01:00:00 (Sun)
  63815482800, #  local_start 2023-03-26 03:00:00 (Sun)
  63834231600, #    local_end 2023-10-29 03:00:00 (Sun)
  7200,
  1,
  '+02',
      ],
      [
  63834224400, #    utc_start 2023-10-29 01:00:00 (Sun)
  63847530000, #      utc_end 2024-03-31 01:00:00 (Sun)
  63834224400, #  local_start 2023-10-29 01:00:00 (Sun)
  63847530000, #    local_end 2024-03-31 01:00:00 (Sun)
  0,
  0,
  '+00',
      ],
      [
  63847530000, #    utc_start 2024-03-31 01:00:00 (Sun)
  63865674000, #      utc_end 2024-10-27 01:00:00 (Sun)
  63847537200, #  local_start 2024-03-31 03:00:00 (Sun)
  63865681200, #    local_end 2024-10-27 03:00:00 (Sun)
  7200,
  1,
  '+02',
      ],
      [
  63865674000, #    utc_start 2024-10-27 01:00:00 (Sun)
  63878979600, #      utc_end 2025-03-30 01:00:00 (Sun)
  63865674000, #  local_start 2024-10-27 01:00:00 (Sun)
  63878979600, #    local_end 2025-03-30 01:00:00 (Sun)
  0,
  0,
  '+00',
      ],
      [
  63878979600, #    utc_start 2025-03-30 01:00:00 (Sun)
  63897123600, #      utc_end 2025-10-26 01:00:00 (Sun)
  63878986800, #  local_start 2025-03-30 03:00:00 (Sun)
  63897130800, #    local_end 2025-10-26 03:00:00 (Sun)
  7200,
  1,
  '+02',
      ],
      [
  63897123600, #    utc_start 2025-10-26 01:00:00 (Sun)
  63910429200, #      utc_end 2026-03-29 01:00:00 (Sun)
  63897123600, #  local_start 2025-10-26 01:00:00 (Sun)
  63910429200, #    local_end 2026-03-29 01:00:00 (Sun)
  0,
  0,
  '+00',
      ],
      [
  63910429200, #    utc_start 2026-03-29 01:00:00 (Sun)
  63928573200, #      utc_end 2026-10-25 01:00:00 (Sun)
  63910436400, #  local_start 2026-03-29 03:00:00 (Sun)
  63928580400, #    local_end 2026-10-25 03:00:00 (Sun)
  7200,
  1,
  '+02',
      ],
      [
  63928573200, #    utc_start 2026-10-25 01:00:00 (Sun)
  63941878800, #      utc_end 2027-03-28 01:00:00 (Sun)
  63928573200, #  local_start 2026-10-25 01:00:00 (Sun)
  63941878800, #    local_end 2027-03-28 01:00:00 (Sun)
  0,
  0,
  '+00',
      ],
      [
  63941878800, #    utc_start 2027-03-28 01:00:00 (Sun)
  63960627600, #      utc_end 2027-10-31 01:00:00 (Sun)
  63941886000, #  local_start 2027-03-28 03:00:00 (Sun)
  63960634800, #    local_end 2027-10-31 03:00:00 (Sun)
  7200,
  1,
  '+02',
      ],
      [
  63960627600, #    utc_start 2027-10-31 01:00:00 (Sun)
  63973328400, #      utc_end 2028-03-26 01:00:00 (Sun)
  63960627600, #  local_start 2027-10-31 01:00:00 (Sun)
  63973328400, #    local_end 2028-03-26 01:00:00 (Sun)
  0,
  0,
  '+00',
      ],
      [
  63973328400, #    utc_start 2028-03-26 01:00:00 (Sun)
  63992077200, #      utc_end 2028-10-29 01:00:00 (Sun)
  63973335600, #  local_start 2028-03-26 03:00:00 (Sun)
  63992084400, #    local_end 2028-10-29 03:00:00 (Sun)
  7200,
  1,
  '+02',
      ],
      [
  63992077200, #    utc_start 2028-10-29 01:00:00 (Sun)
  64004778000, #      utc_end 2029-03-25 01:00:00 (Sun)
  63992077200, #  local_start 2028-10-29 01:00:00 (Sun)
  64004778000, #    local_end 2029-03-25 01:00:00 (Sun)
  0,
  0,
  '+00',
      ],
      [
  64004778000, #    utc_start 2029-03-25 01:00:00 (Sun)
  64023526800, #      utc_end 2029-10-28 01:00:00 (Sun)
  64004785200, #  local_start 2029-03-25 03:00:00 (Sun)
  64023534000, #    local_end 2029-10-28 03:00:00 (Sun)
  7200,
  1,
  '+02',
      ],
      [
  64023526800, #    utc_start 2029-10-28 01:00:00 (Sun)
  64036832400, #      utc_end 2030-03-31 01:00:00 (Sun)
  64023526800, #  local_start 2029-10-28 01:00:00 (Sun)
  64036832400, #    local_end 2030-03-31 01:00:00 (Sun)
  0,
  0,
  '+00',
      ],
      [
  64036832400, #    utc_start 2030-03-31 01:00:00 (Sun)
  64054976400, #      utc_end 2030-10-27 01:00:00 (Sun)
  64036839600, #  local_start 2030-03-31 03:00:00 (Sun)
  64054983600, #    local_end 2030-10-27 03:00:00 (Sun)
  7200,
  1,
  '+02',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {26}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { 0 }
  
  my $last_observance = bless( {
    'format' => '%s',
    'gmtoff' => '0:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 731989,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 731989,
      'utc_rd_secs' => 0,
      'utc_year' => 2006
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => 0,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 731989,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 731989,
      'utc_rd_secs' => 0,
      'utc_year' => 2006
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '1:00u',
      'from' => '2005',
      'in' => 'Mar',
      'letter' => '+02',
      'name' => 'Troll',
      'offset_from_std' => 7200,
      'on' => 'lastSun',
      'save' => '2:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '1:00u',
      'from' => '2004',
      'in' => 'Oct',
      'letter' => '+00',
      'name' => 'Troll',
      'offset_from_std' => 0,
      'on' => 'lastSun',
      'save' => '0:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_ANTARCTICA_TROLL

    $main::fatpacked{"DateTime/TimeZone/Antarctica/Vostok.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ANTARCTICA_VOSTOK';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/antarctica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Antarctica::Vostok;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Antarctica::Vostok::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  61755609600, #      utc_end 1957-12-16 00:00:00 (Mon)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  61755609600, #    local_end 1957-12-16 00:00:00 (Mon)
  0,
  0,
  '-00',
      ],
      [
  61755609600, #    utc_start 1957-12-16 00:00:00 (Mon)
  DateTime::TimeZone::INFINITY, #      utc_end
  61755631200, #  local_start 1957-12-16 06:00:00 (Mon)
  DateTime::TimeZone::INFINITY, #    local_end
  21600,
  0,
  '+06',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ANTARCTICA_VOSTOK

    $main::fatpacked{"DateTime/TimeZone/Asia/Almaty.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_ALMATY';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/asia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Almaty;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Almaty::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60694512732, #      utc_end 1924-05-01 18:52:12 (Thu)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60694531200, #    local_end 1924-05-02 00:00:00 (Fri)
  18468,
  0,
  'LMT',
      ],
      [
  60694512732, #    utc_start 1924-05-01 18:52:12 (Thu)
  60888135600, #      utc_end 1930-06-20 19:00:00 (Fri)
  60694530732, #  local_start 1924-05-01 23:52:12 (Thu)
  60888153600, #    local_end 1930-06-21 00:00:00 (Sat)
  18000,
  0,
  '+05',
      ],
      [
  60888135600, #    utc_start 1930-06-20 19:00:00 (Fri)
  62490592800, #      utc_end 1981-03-31 18:00:00 (Tue)
  60888157200, #  local_start 1930-06-21 01:00:00 (Sat)
  62490614400, #    local_end 1981-04-01 00:00:00 (Wed)
  21600,
  0,
  '+06',
      ],
      [
  62490592800, #    utc_start 1981-03-31 18:00:00 (Tue)
  62506400400, #      utc_end 1981-09-30 17:00:00 (Wed)
  62490618000, #  local_start 1981-04-01 01:00:00 (Wed)
  62506425600, #    local_end 1981-10-01 00:00:00 (Thu)
  25200,
  1,
  '+07',
      ],
      [
  62506400400, #    utc_start 1981-09-30 17:00:00 (Wed)
  62522128800, #      utc_end 1982-03-31 18:00:00 (Wed)
  62506422000, #  local_start 1981-09-30 23:00:00 (Wed)
  62522150400, #    local_end 1982-04-01 00:00:00 (Thu)
  21600,
  0,
  '+06',
      ],
      [
  62522128800, #    utc_start 1982-03-31 18:00:00 (Wed)
  62537936400, #      utc_end 1982-09-30 17:00:00 (Thu)
  62522154000, #  local_start 1982-04-01 01:00:00 (Thu)
  62537961600, #    local_end 1982-10-01 00:00:00 (Fri)
  25200,
  1,
  '+07',
      ],
      [
  62537936400, #    utc_start 1982-09-30 17:00:00 (Thu)
  62553664800, #      utc_end 1983-03-31 18:00:00 (Thu)
  62537958000, #  local_start 1982-09-30 23:00:00 (Thu)
  62553686400, #    local_end 1983-04-01 00:00:00 (Fri)
  21600,
  0,
  '+06',
      ],
      [
  62553664800, #    utc_start 1983-03-31 18:00:00 (Thu)
  62569472400, #      utc_end 1983-09-30 17:00:00 (Fri)
  62553690000, #  local_start 1983-04-01 01:00:00 (Fri)
  62569497600, #    local_end 1983-10-01 00:00:00 (Sat)
  25200,
  1,
  '+07',
      ],
      [
  62569472400, #    utc_start 1983-09-30 17:00:00 (Fri)
  62585287200, #      utc_end 1984-03-31 18:00:00 (Sat)
  62569494000, #  local_start 1983-09-30 23:00:00 (Fri)
  62585308800, #    local_end 1984-04-01 00:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  62585287200, #    utc_start 1984-03-31 18:00:00 (Sat)
  62601019200, #      utc_end 1984-09-29 20:00:00 (Sat)
  62585312400, #  local_start 1984-04-01 01:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  62601019200, #    utc_start 1984-09-29 20:00:00 (Sat)
  62616744000, #      utc_end 1985-03-30 20:00:00 (Sat)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  62616744000, #    utc_start 1985-03-30 20:00:00 (Sat)
  62632468800, #      utc_end 1985-09-28 20:00:00 (Sat)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  62632468800, #    utc_start 1985-09-28 20:00:00 (Sat)
  62648193600, #      utc_end 1986-03-29 20:00:00 (Sat)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  62648193600, #    utc_start 1986-03-29 20:00:00 (Sat)
  62663918400, #      utc_end 1986-09-27 20:00:00 (Sat)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  62663918400, #    utc_start 1986-09-27 20:00:00 (Sat)
  62679643200, #      utc_end 1987-03-28 20:00:00 (Sat)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  62679643200, #    utc_start 1987-03-28 20:00:00 (Sat)
  62695368000, #      utc_end 1987-09-26 20:00:00 (Sat)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  62695368000, #    utc_start 1987-09-26 20:00:00 (Sat)
  62711092800, #      utc_end 1988-03-26 20:00:00 (Sat)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  62711092800, #    utc_start 1988-03-26 20:00:00 (Sat)
  62726817600, #      utc_end 1988-09-24 20:00:00 (Sat)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  62726817600, #    utc_start 1988-09-24 20:00:00 (Sat)
  62742542400, #      utc_end 1989-03-25 20:00:00 (Sat)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  62742542400, #    utc_start 1989-03-25 20:00:00 (Sat)
  62758267200, #      utc_end 1989-09-23 20:00:00 (Sat)
  62742567600, #  local_start 1989-03-26 03:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  62758267200, #    utc_start 1989-09-23 20:00:00 (Sat)
  62773992000, #      utc_end 1990-03-24 20:00:00 (Sat)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  62773992000, #    utc_start 1990-03-24 20:00:00 (Sat)
  62790321600, #      utc_end 1990-09-29 20:00:00 (Sat)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  62790321600, #    utc_start 1990-09-29 20:00:00 (Sat)
  62806046400, #      utc_end 1991-03-30 20:00:00 (Sat)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  62806046400, #    utc_start 1991-03-30 20:00:00 (Sat)
  62821774800, #      utc_end 1991-09-28 21:00:00 (Sat)
  62806068000, #  local_start 1991-03-31 02:00:00 (Sun)
  62821796400, #    local_end 1991-09-29 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62821774800, #    utc_start 1991-09-28 21:00:00 (Sat)
  62831451600, #      utc_end 1992-01-18 21:00:00 (Sat)
  62821792800, #  local_start 1991-09-29 02:00:00 (Sun)
  62831469600, #    local_end 1992-01-19 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62831451600, #    utc_start 1992-01-18 21:00:00 (Sat)
  62837496000, #      utc_end 1992-03-28 20:00:00 (Sat)
  62831473200, #  local_start 1992-01-19 03:00:00 (Sun)
  62837517600, #    local_end 1992-03-29 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  62837496000, #    utc_start 1992-03-28 20:00:00 (Sat)
  62853220800, #      utc_end 1992-09-26 20:00:00 (Sat)
  62837521200, #  local_start 1992-03-29 03:00:00 (Sun)
  62853246000, #    local_end 1992-09-27 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  62853220800, #    utc_start 1992-09-26 20:00:00 (Sat)
  62868945600, #      utc_end 1993-03-27 20:00:00 (Sat)
  62853242400, #  local_start 1992-09-27 02:00:00 (Sun)
  62868967200, #    local_end 1993-03-28 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  62868945600, #    utc_start 1993-03-27 20:00:00 (Sat)
  62884670400, #      utc_end 1993-09-25 20:00:00 (Sat)
  62868970800, #  local_start 1993-03-28 03:00:00 (Sun)
  62884695600, #    local_end 1993-09-26 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  62884670400, #    utc_start 1993-09-25 20:00:00 (Sat)
  62900395200, #      utc_end 1994-03-26 20:00:00 (Sat)
  62884692000, #  local_start 1993-09-26 02:00:00 (Sun)
  62900416800, #    local_end 1994-03-27 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  62900395200, #    utc_start 1994-03-26 20:00:00 (Sat)
  62916120000, #      utc_end 1994-09-24 20:00:00 (Sat)
  62900420400, #  local_start 1994-03-27 03:00:00 (Sun)
  62916145200, #    local_end 1994-09-25 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  62916120000, #    utc_start 1994-09-24 20:00:00 (Sat)
  62931844800, #      utc_end 1995-03-25 20:00:00 (Sat)
  62916141600, #  local_start 1994-09-25 02:00:00 (Sun)
  62931866400, #    local_end 1995-03-26 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  62931844800, #    utc_start 1995-03-25 20:00:00 (Sat)
  62947569600, #      utc_end 1995-09-23 20:00:00 (Sat)
  62931870000, #  local_start 1995-03-26 03:00:00 (Sun)
  62947594800, #    local_end 1995-09-24 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  62947569600, #    utc_start 1995-09-23 20:00:00 (Sat)
  62963899200, #      utc_end 1996-03-30 20:00:00 (Sat)
  62947591200, #  local_start 1995-09-24 02:00:00 (Sun)
  62963920800, #    local_end 1996-03-31 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  62963899200, #    utc_start 1996-03-30 20:00:00 (Sat)
  62982043200, #      utc_end 1996-10-26 20:00:00 (Sat)
  62963924400, #  local_start 1996-03-31 03:00:00 (Sun)
  62982068400, #    local_end 1996-10-27 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  62982043200, #    utc_start 1996-10-26 20:00:00 (Sat)
  62995348800, #      utc_end 1997-03-29 20:00:00 (Sat)
  62982064800, #  local_start 1996-10-27 02:00:00 (Sun)
  62995370400, #    local_end 1997-03-30 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  62995348800, #    utc_start 1997-03-29 20:00:00 (Sat)
  63013492800, #      utc_end 1997-10-25 20:00:00 (Sat)
  62995374000, #  local_start 1997-03-30 03:00:00 (Sun)
  63013518000, #    local_end 1997-10-26 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  63013492800, #    utc_start 1997-10-25 20:00:00 (Sat)
  63026798400, #      utc_end 1998-03-28 20:00:00 (Sat)
  63013514400, #  local_start 1997-10-26 02:00:00 (Sun)
  63026820000, #    local_end 1998-03-29 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  63026798400, #    utc_start 1998-03-28 20:00:00 (Sat)
  63044942400, #      utc_end 1998-10-24 20:00:00 (Sat)
  63026823600, #  local_start 1998-03-29 03:00:00 (Sun)
  63044967600, #    local_end 1998-10-25 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  63044942400, #    utc_start 1998-10-24 20:00:00 (Sat)
  63058248000, #      utc_end 1999-03-27 20:00:00 (Sat)
  63044964000, #  local_start 1998-10-25 02:00:00 (Sun)
  63058269600, #    local_end 1999-03-28 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  63058248000, #    utc_start 1999-03-27 20:00:00 (Sat)
  63076996800, #      utc_end 1999-10-30 20:00:00 (Sat)
  63058273200, #  local_start 1999-03-28 03:00:00 (Sun)
  63077022000, #    local_end 1999-10-31 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  63076996800, #    utc_start 1999-10-30 20:00:00 (Sat)
  63089697600, #      utc_end 2000-03-25 20:00:00 (Sat)
  63077018400, #  local_start 1999-10-31 02:00:00 (Sun)
  63089719200, #    local_end 2000-03-26 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  63089697600, #    utc_start 2000-03-25 20:00:00 (Sat)
  63108446400, #      utc_end 2000-10-28 20:00:00 (Sat)
  63089722800, #  local_start 2000-03-26 03:00:00 (Sun)
  63108471600, #    local_end 2000-10-29 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  63108446400, #    utc_start 2000-10-28 20:00:00 (Sat)
  63121147200, #      utc_end 2001-03-24 20:00:00 (Sat)
  63108468000, #  local_start 2000-10-29 02:00:00 (Sun)
  63121168800, #    local_end 2001-03-25 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  63121147200, #    utc_start 2001-03-24 20:00:00 (Sat)
  63139896000, #      utc_end 2001-10-27 20:00:00 (Sat)
  63121172400, #  local_start 2001-03-25 03:00:00 (Sun)
  63139921200, #    local_end 2001-10-28 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  63139896000, #    utc_start 2001-10-27 20:00:00 (Sat)
  63153201600, #      utc_end 2002-03-30 20:00:00 (Sat)
  63139917600, #  local_start 2001-10-28 02:00:00 (Sun)
  63153223200, #    local_end 2002-03-31 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  63153201600, #    utc_start 2002-03-30 20:00:00 (Sat)
  63171345600, #      utc_end 2002-10-26 20:00:00 (Sat)
  63153226800, #  local_start 2002-03-31 03:00:00 (Sun)
  63171370800, #    local_end 2002-10-27 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  63171345600, #    utc_start 2002-10-26 20:00:00 (Sat)
  63184651200, #      utc_end 2003-03-29 20:00:00 (Sat)
  63171367200, #  local_start 2002-10-27 02:00:00 (Sun)
  63184672800, #    local_end 2003-03-30 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  63184651200, #    utc_start 2003-03-29 20:00:00 (Sat)
  63202795200, #      utc_end 2003-10-25 20:00:00 (Sat)
  63184676400, #  local_start 2003-03-30 03:00:00 (Sun)
  63202820400, #    local_end 2003-10-26 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  63202795200, #    utc_start 2003-10-25 20:00:00 (Sat)
  63216100800, #      utc_end 2004-03-27 20:00:00 (Sat)
  63202816800, #  local_start 2003-10-26 02:00:00 (Sun)
  63216122400, #    local_end 2004-03-28 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  63216100800, #    utc_start 2004-03-27 20:00:00 (Sat)
  63234849600, #      utc_end 2004-10-30 20:00:00 (Sat)
  63216126000, #  local_start 2004-03-28 03:00:00 (Sun)
  63234874800, #    local_end 2004-10-31 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  63234849600, #    utc_start 2004-10-30 20:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  63234871200, #  local_start 2004-10-31 02:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  21600,
  0,
  '+06',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {24}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_ALMATY

    $main::fatpacked{"DateTime/TimeZone/Asia/Amman.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_AMMAN';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/asia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Amman;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Amman::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60904906576, #      utc_end 1930-12-31 21:36:16 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60904915200, #    local_end 1931-01-01 00:00:00 (Thu)
  8624,
  0,
  'LMT',
      ],
      [
  60904906576, #    utc_start 1930-12-31 21:36:16 (Wed)
  62243848800, #      utc_end 1973-06-05 22:00:00 (Tue)
  60904913776, #  local_start 1930-12-31 23:36:16 (Wed)
  62243856000, #    local_end 1973-06-06 00:00:00 (Wed)
  7200,
  0,
  'EET',
      ],
      [
  62243848800, #    utc_start 1973-06-05 22:00:00 (Tue)
  62253954000, #      utc_end 1973-09-30 21:00:00 (Sun)
  62243859600, #  local_start 1973-06-06 01:00:00 (Wed)
  62253964800, #    local_end 1973-10-01 00:00:00 (Mon)
  10800,
  1,
  'EEST',
      ],
      [
  62253954000, #    utc_start 1973-09-30 21:00:00 (Sun)
  62272274400, #      utc_end 1974-04-30 22:00:00 (Tue)
  62253961200, #  local_start 1973-09-30 23:00:00 (Sun)
  62272281600, #    local_end 1974-05-01 00:00:00 (Wed)
  7200,
  0,
  'EET',
      ],
      [
  62272274400, #    utc_start 1974-04-30 22:00:00 (Tue)
  62285490000, #      utc_end 1974-09-30 21:00:00 (Mon)
  62272285200, #  local_start 1974-05-01 01:00:00 (Wed)
  62285500800, #    local_end 1974-10-01 00:00:00 (Tue)
  10800,
  1,
  'EEST',
      ],
      [
  62285490000, #    utc_start 1974-09-30 21:00:00 (Mon)
  62303810400, #      utc_end 1975-04-30 22:00:00 (Wed)
  62285497200, #  local_start 1974-09-30 23:00:00 (Mon)
  62303817600, #    local_end 1975-05-01 00:00:00 (Thu)
  7200,
  0,
  'EET',
      ],
      [
  62303810400, #    utc_start 1975-04-30 22:00:00 (Wed)
  62317026000, #      utc_end 1975-09-30 21:00:00 (Tue)
  62303821200, #  local_start 1975-05-01 01:00:00 (Thu)
  62317036800, #    local_end 1975-10-01 00:00:00 (Wed)
  10800,
  1,
  'EEST',
      ],
      [
  62317026000, #    utc_start 1975-09-30 21:00:00 (Tue)
  62335432800, #      utc_end 1976-04-30 22:00:00 (Fri)
  62317033200, #  local_start 1975-09-30 23:00:00 (Tue)
  62335440000, #    local_end 1976-05-01 00:00:00 (Sat)
  7200,
  0,
  'EET',
      ],
      [
  62335432800, #    utc_start 1976-04-30 22:00:00 (Fri)
  62351326800, #      utc_end 1976-10-31 21:00:00 (Sun)
  62335443600, #  local_start 1976-05-01 01:00:00 (Sat)
  62351337600, #    local_end 1976-11-01 00:00:00 (Mon)
  10800,
  1,
  'EEST',
      ],
      [
  62351326800, #    utc_start 1976-10-31 21:00:00 (Sun)
  62366968800, #      utc_end 1977-04-30 22:00:00 (Sat)
  62351334000, #  local_start 1976-10-31 23:00:00 (Sun)
  62366976000, #    local_end 1977-05-01 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62366968800, #    utc_start 1977-04-30 22:00:00 (Sat)
  62380184400, #      utc_end 1977-09-30 21:00:00 (Fri)
  62366979600, #  local_start 1977-05-01 01:00:00 (Sun)
  62380195200, #    local_end 1977-10-01 00:00:00 (Sat)
  10800,
  1,
  'EEST',
      ],
      [
  62380184400, #    utc_start 1977-09-30 21:00:00 (Fri)
  62398418400, #      utc_end 1978-04-29 22:00:00 (Sat)
  62380191600, #  local_start 1977-09-30 23:00:00 (Fri)
  62398425600, #    local_end 1978-04-30 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62398418400, #    utc_start 1978-04-29 22:00:00 (Sat)
  62411634000, #      utc_end 1978-09-29 21:00:00 (Fri)
  62398429200, #  local_start 1978-04-30 01:00:00 (Sun)
  62411644800, #    local_end 1978-09-30 00:00:00 (Sat)
  10800,
  1,
  'EEST',
      ],
      [
  62411634000, #    utc_start 1978-09-29 21:00:00 (Fri)
  62616837600, #      utc_end 1985-03-31 22:00:00 (Sun)
  62411641200, #  local_start 1978-09-29 23:00:00 (Fri)
  62616844800, #    local_end 1985-04-01 00:00:00 (Mon)
  7200,
  0,
  'EET',
      ],
      [
  62616837600, #    utc_start 1985-03-31 22:00:00 (Sun)
  62632645200, #      utc_end 1985-09-30 21:00:00 (Mon)
  62616848400, #  local_start 1985-04-01 01:00:00 (Mon)
  62632656000, #    local_end 1985-10-01 00:00:00 (Tue)
  10800,
  1,
  'EEST',
      ],
      [
  62632645200, #    utc_start 1985-09-30 21:00:00 (Mon)
  62648632800, #      utc_end 1986-04-03 22:00:00 (Thu)
  62632652400, #  local_start 1985-09-30 23:00:00 (Mon)
  62648640000, #    local_end 1986-04-04 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  62648632800, #    utc_start 1986-04-03 22:00:00 (Thu)
  62664354000, #      utc_end 1986-10-02 21:00:00 (Thu)
  62648643600, #  local_start 1986-04-04 01:00:00 (Fri)
  62664364800, #    local_end 1986-10-03 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  62664354000, #    utc_start 1986-10-02 21:00:00 (Thu)
  62680082400, #      utc_end 1987-04-02 22:00:00 (Thu)
  62664361200, #  local_start 1986-10-02 23:00:00 (Thu)
  62680089600, #    local_end 1987-04-03 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  62680082400, #    utc_start 1987-04-02 22:00:00 (Thu)
  62695803600, #      utc_end 1987-10-01 21:00:00 (Thu)
  62680093200, #  local_start 1987-04-03 01:00:00 (Fri)
  62695814400, #    local_end 1987-10-02 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  62695803600, #    utc_start 1987-10-01 21:00:00 (Thu)
  62711532000, #      utc_end 1988-03-31 22:00:00 (Thu)
  62695810800, #  local_start 1987-10-01 23:00:00 (Thu)
  62711539200, #    local_end 1988-04-01 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  62711532000, #    utc_start 1988-03-31 22:00:00 (Thu)
  62727858000, #      utc_end 1988-10-06 21:00:00 (Thu)
  62711542800, #  local_start 1988-04-01 01:00:00 (Fri)
  62727868800, #    local_end 1988-10-07 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  62727858000, #    utc_start 1988-10-06 21:00:00 (Thu)
  62746264800, #      utc_end 1989-05-07 22:00:00 (Sun)
  62727865200, #  local_start 1988-10-06 23:00:00 (Thu)
  62746272000, #    local_end 1989-05-08 00:00:00 (Mon)
  7200,
  0,
  'EET',
      ],
      [
  62746264800, #    utc_start 1989-05-07 22:00:00 (Sun)
  62759307600, #      utc_end 1989-10-05 21:00:00 (Thu)
  62746275600, #  local_start 1989-05-08 01:00:00 (Mon)
  62759318400, #    local_end 1989-10-06 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  62759307600, #    utc_start 1989-10-05 21:00:00 (Thu)
  62776850400, #      utc_end 1990-04-26 22:00:00 (Thu)
  62759314800, #  local_start 1989-10-05 23:00:00 (Thu)
  62776857600, #    local_end 1990-04-27 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  62776850400, #    utc_start 1990-04-26 22:00:00 (Thu)
  62790757200, #      utc_end 1990-10-04 21:00:00 (Thu)
  62776861200, #  local_start 1990-04-27 01:00:00 (Fri)
  62790768000, #    local_end 1990-10-05 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  62790757200, #    utc_start 1990-10-04 21:00:00 (Thu)
  62807522400, #      utc_end 1991-04-16 22:00:00 (Tue)
  62790764400, #  local_start 1990-10-04 23:00:00 (Thu)
  62807529600, #    local_end 1991-04-17 00:00:00 (Wed)
  7200,
  0,
  'EET',
      ],
      [
  62807522400, #    utc_start 1991-04-16 22:00:00 (Tue)
  62821602000, #      utc_end 1991-09-26 21:00:00 (Thu)
  62807533200, #  local_start 1991-04-17 01:00:00 (Wed)
  62821612800, #    local_end 1991-09-27 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  62821602000, #    utc_start 1991-09-26 21:00:00 (Thu)
  62838540000, #      utc_end 1992-04-09 22:00:00 (Thu)
  62821609200, #  local_start 1991-09-26 23:00:00 (Thu)
  62838547200, #    local_end 1992-04-10 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  62838540000, #    utc_start 1992-04-09 22:00:00 (Thu)
  62853656400, #      utc_end 1992-10-01 21:00:00 (Thu)
  62838550800, #  local_start 1992-04-10 01:00:00 (Fri)
  62853667200, #    local_end 1992-10-02 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  62853656400, #    utc_start 1992-10-01 21:00:00 (Thu)
  62869384800, #      utc_end 1993-04-01 22:00:00 (Thu)
  62853663600, #  local_start 1992-10-01 23:00:00 (Thu)
  62869392000, #    local_end 1993-04-02 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  62869384800, #    utc_start 1993-04-01 22:00:00 (Thu)
  62885106000, #      utc_end 1993-09-30 21:00:00 (Thu)
  62869395600, #  local_start 1993-04-02 01:00:00 (Fri)
  62885116800, #    local_end 1993-10-01 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  62885106000, #    utc_start 1993-09-30 21:00:00 (Thu)
  62900834400, #      utc_end 1994-03-31 22:00:00 (Thu)
  62885113200, #  local_start 1993-09-30 23:00:00 (Thu)
  62900841600, #    local_end 1994-04-01 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  62900834400, #    utc_start 1994-03-31 22:00:00 (Thu)
  62915346000, #      utc_end 1994-09-15 21:00:00 (Thu)
  62900845200, #  local_start 1994-04-01 01:00:00 (Fri)
  62915356800, #    local_end 1994-09-16 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  62915346000, #    utc_start 1994-09-15 21:00:00 (Thu)
  62932888800, #      utc_end 1995-04-06 22:00:00 (Thu)
  62915353200, #  local_start 1994-09-15 23:00:00 (Thu)
  62932896000, #    local_end 1995-04-07 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  62932888800, #    utc_start 1995-04-06 22:00:00 (Thu)
  62946799200, #      utc_end 1995-09-14 22:00:00 (Thu)
  62932899600, #  local_start 1995-04-07 01:00:00 (Fri)
  62946810000, #    local_end 1995-09-15 01:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  62946799200, #    utc_start 1995-09-14 22:00:00 (Thu)
  62964338400, #      utc_end 1996-04-04 22:00:00 (Thu)
  62946806400, #  local_start 1995-09-15 00:00:00 (Fri)
  62964345600, #    local_end 1996-04-05 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  62964338400, #    utc_start 1996-04-04 22:00:00 (Thu)
  62978853600, #      utc_end 1996-09-19 22:00:00 (Thu)
  62964349200, #  local_start 1996-04-05 01:00:00 (Fri)
  62978864400, #    local_end 1996-09-20 01:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  62978853600, #    utc_start 1996-09-19 22:00:00 (Thu)
  62995788000, #      utc_end 1997-04-03 22:00:00 (Thu)
  62978860800, #  local_start 1996-09-20 00:00:00 (Fri)
  62995795200, #    local_end 1997-04-04 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  62995788000, #    utc_start 1997-04-03 22:00:00 (Thu)
  63010303200, #      utc_end 1997-09-18 22:00:00 (Thu)
  62995798800, #  local_start 1997-04-04 01:00:00 (Fri)
  63010314000, #    local_end 1997-09-19 01:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63010303200, #    utc_start 1997-09-18 22:00:00 (Thu)
  63027237600, #      utc_end 1998-04-02 22:00:00 (Thu)
  63010310400, #  local_start 1997-09-19 00:00:00 (Fri)
  63027244800, #    local_end 1998-04-03 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63027237600, #    utc_start 1998-04-02 22:00:00 (Thu)
  63041752800, #      utc_end 1998-09-17 22:00:00 (Thu)
  63027248400, #  local_start 1998-04-03 01:00:00 (Fri)
  63041763600, #    local_end 1998-09-18 01:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63041752800, #    utc_start 1998-09-17 22:00:00 (Thu)
  63066463200, #      utc_end 1999-06-30 22:00:00 (Wed)
  63041760000, #  local_start 1998-09-18 00:00:00 (Fri)
  63066470400, #    local_end 1999-07-01 00:00:00 (Thu)
  7200,
  0,
  'EET',
      ],
      [
  63066463200, #    utc_start 1999-06-30 22:00:00 (Wed)
  63073807200, #      utc_end 1999-09-23 22:00:00 (Thu)
  63066474000, #  local_start 1999-07-01 01:00:00 (Thu)
  63073818000, #    local_end 1999-09-24 01:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63073807200, #    utc_start 1999-09-23 22:00:00 (Thu)
  63090050400, #      utc_end 2000-03-29 22:00:00 (Wed)
  63073814400, #  local_start 1999-09-24 00:00:00 (Fri)
  63090057600, #    local_end 2000-03-30 00:00:00 (Thu)
  7200,
  0,
  'EET',
      ],
      [
  63090050400, #    utc_start 2000-03-29 22:00:00 (Wed)
  63105861600, #      utc_end 2000-09-28 22:00:00 (Thu)
  63090061200, #  local_start 2000-03-30 01:00:00 (Thu)
  63105872400, #    local_end 2000-09-29 01:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63105861600, #    utc_start 2000-09-28 22:00:00 (Thu)
  63121500000, #      utc_end 2001-03-28 22:00:00 (Wed)
  63105868800, #  local_start 2000-09-29 00:00:00 (Fri)
  63121507200, #    local_end 2001-03-29 00:00:00 (Thu)
  7200,
  0,
  'EET',
      ],
      [
  63121500000, #    utc_start 2001-03-28 22:00:00 (Wed)
  63137311200, #      utc_end 2001-09-27 22:00:00 (Thu)
  63121510800, #  local_start 2001-03-29 01:00:00 (Thu)
  63137322000, #    local_end 2001-09-28 01:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63137311200, #    utc_start 2001-09-27 22:00:00 (Thu)
  63153036000, #      utc_end 2002-03-28 22:00:00 (Thu)
  63137318400, #  local_start 2001-09-28 00:00:00 (Fri)
  63153043200, #    local_end 2002-03-29 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63153036000, #    utc_start 2002-03-28 22:00:00 (Thu)
  63168760800, #      utc_end 2002-09-26 22:00:00 (Thu)
  63153046800, #  local_start 2002-03-29 01:00:00 (Fri)
  63168771600, #    local_end 2002-09-27 01:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63168760800, #    utc_start 2002-09-26 22:00:00 (Thu)
  63184485600, #      utc_end 2003-03-27 22:00:00 (Thu)
  63168768000, #  local_start 2002-09-27 00:00:00 (Fri)
  63184492800, #    local_end 2003-03-28 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63184485600, #    utc_start 2003-03-27 22:00:00 (Thu)
  63202629600, #      utc_end 2003-10-23 22:00:00 (Thu)
  63184496400, #  local_start 2003-03-28 01:00:00 (Fri)
  63202640400, #    local_end 2003-10-24 01:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63202629600, #    utc_start 2003-10-23 22:00:00 (Thu)
  63215935200, #      utc_end 2004-03-25 22:00:00 (Thu)
  63202636800, #  local_start 2003-10-24 00:00:00 (Fri)
  63215942400, #    local_end 2004-03-26 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63215935200, #    utc_start 2004-03-25 22:00:00 (Thu)
  63233474400, #      utc_end 2004-10-14 22:00:00 (Thu)
  63215946000, #  local_start 2004-03-26 01:00:00 (Fri)
  63233485200, #    local_end 2004-10-15 01:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63233474400, #    utc_start 2004-10-14 22:00:00 (Thu)
  63247989600, #      utc_end 2005-03-31 22:00:00 (Thu)
  63233481600, #  local_start 2004-10-15 00:00:00 (Fri)
  63247996800, #    local_end 2005-04-01 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63247989600, #    utc_start 2005-03-31 22:00:00 (Thu)
  63263714400, #      utc_end 2005-09-29 22:00:00 (Thu)
  63248000400, #  local_start 2005-04-01 01:00:00 (Fri)
  63263725200, #    local_end 2005-09-30 01:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63263714400, #    utc_start 2005-09-29 22:00:00 (Thu)
  63279439200, #      utc_end 2006-03-30 22:00:00 (Thu)
  63263721600, #  local_start 2005-09-30 00:00:00 (Fri)
  63279446400, #    local_end 2006-03-31 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63279439200, #    utc_start 2006-03-30 22:00:00 (Thu)
  63297583200, #      utc_end 2006-10-26 22:00:00 (Thu)
  63279450000, #  local_start 2006-03-31 01:00:00 (Fri)
  63297594000, #    local_end 2006-10-27 01:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63297583200, #    utc_start 2006-10-26 22:00:00 (Thu)
  63310888800, #      utc_end 2007-03-29 22:00:00 (Thu)
  63297590400, #  local_start 2006-10-27 00:00:00 (Fri)
  63310896000, #    local_end 2007-03-30 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63310888800, #    utc_start 2007-03-29 22:00:00 (Thu)
  63329032800, #      utc_end 2007-10-25 22:00:00 (Thu)
  63310899600, #  local_start 2007-03-30 01:00:00 (Fri)
  63329043600, #    local_end 2007-10-26 01:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63329032800, #    utc_start 2007-10-25 22:00:00 (Thu)
  63342338400, #      utc_end 2008-03-27 22:00:00 (Thu)
  63329040000, #  local_start 2007-10-26 00:00:00 (Fri)
  63342345600, #    local_end 2008-03-28 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63342338400, #    utc_start 2008-03-27 22:00:00 (Thu)
  63361087200, #      utc_end 2008-10-30 22:00:00 (Thu)
  63342349200, #  local_start 2008-03-28 01:00:00 (Fri)
  63361098000, #    local_end 2008-10-31 01:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63361087200, #    utc_start 2008-10-30 22:00:00 (Thu)
  63373788000, #      utc_end 2009-03-26 22:00:00 (Thu)
  63361094400, #  local_start 2008-10-31 00:00:00 (Fri)
  63373795200, #    local_end 2009-03-27 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63373788000, #    utc_start 2009-03-26 22:00:00 (Thu)
  63392536800, #      utc_end 2009-10-29 22:00:00 (Thu)
  63373798800, #  local_start 2009-03-27 01:00:00 (Fri)
  63392547600, #    local_end 2009-10-30 01:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63392536800, #    utc_start 2009-10-29 22:00:00 (Thu)
  63405237600, #      utc_end 2010-03-25 22:00:00 (Thu)
  63392544000, #  local_start 2009-10-30 00:00:00 (Fri)
  63405244800, #    local_end 2010-03-26 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63405237600, #    utc_start 2010-03-25 22:00:00 (Thu)
  63423986400, #      utc_end 2010-10-28 22:00:00 (Thu)
  63405248400, #  local_start 2010-03-26 01:00:00 (Fri)
  63423997200, #    local_end 2010-10-29 01:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63423986400, #    utc_start 2010-10-28 22:00:00 (Thu)
  63437292000, #      utc_end 2011-03-31 22:00:00 (Thu)
  63423993600, #  local_start 2010-10-29 00:00:00 (Fri)
  63437299200, #    local_end 2011-04-01 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63437292000, #    utc_start 2011-03-31 22:00:00 (Thu)
  63455436000, #      utc_end 2011-10-27 22:00:00 (Thu)
  63437302800, #  local_start 2011-04-01 01:00:00 (Fri)
  63455446800, #    local_end 2011-10-28 01:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63455436000, #    utc_start 2011-10-27 22:00:00 (Thu)
  63468741600, #      utc_end 2012-03-29 22:00:00 (Thu)
  63455443200, #  local_start 2011-10-28 00:00:00 (Fri)
  63468748800, #    local_end 2012-03-30 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63468741600, #    utc_start 2012-03-29 22:00:00 (Thu)
  63523170000, #      utc_end 2013-12-19 21:00:00 (Thu)
  63468752400, #  local_start 2012-03-30 01:00:00 (Fri)
  63523180800, #    local_end 2013-12-20 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63523170000, #    utc_start 2013-12-19 21:00:00 (Thu)
  63531640800, #      utc_end 2014-03-27 22:00:00 (Thu)
  63523177200, #  local_start 2013-12-19 23:00:00 (Thu)
  63531648000, #    local_end 2014-03-28 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63531640800, #    utc_start 2014-03-27 22:00:00 (Thu)
  63550389600, #      utc_end 2014-10-30 22:00:00 (Thu)
  63531651600, #  local_start 2014-03-28 01:00:00 (Fri)
  63550400400, #    local_end 2014-10-31 01:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63550389600, #    utc_start 2014-10-30 22:00:00 (Thu)
  63563090400, #      utc_end 2015-03-26 22:00:00 (Thu)
  63550396800, #  local_start 2014-10-31 00:00:00 (Fri)
  63563097600, #    local_end 2015-03-27 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63563090400, #    utc_start 2015-03-26 22:00:00 (Thu)
  63581839200, #      utc_end 2015-10-29 22:00:00 (Thu)
  63563101200, #  local_start 2015-03-27 01:00:00 (Fri)
  63581850000, #    local_end 2015-10-30 01:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63581839200, #    utc_start 2015-10-29 22:00:00 (Thu)
  63595144800, #      utc_end 2016-03-31 22:00:00 (Thu)
  63581846400, #  local_start 2015-10-30 00:00:00 (Fri)
  63595152000, #    local_end 2016-04-01 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63595144800, #    utc_start 2016-03-31 22:00:00 (Thu)
  63613288800, #      utc_end 2016-10-27 22:00:00 (Thu)
  63595155600, #  local_start 2016-04-01 01:00:00 (Fri)
  63613299600, #    local_end 2016-10-28 01:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63613288800, #    utc_start 2016-10-27 22:00:00 (Thu)
  63626594400, #      utc_end 2017-03-30 22:00:00 (Thu)
  63613296000, #  local_start 2016-10-28 00:00:00 (Fri)
  63626601600, #    local_end 2017-03-31 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63626594400, #    utc_start 2017-03-30 22:00:00 (Thu)
  63644738400, #      utc_end 2017-10-26 22:00:00 (Thu)
  63626605200, #  local_start 2017-03-31 01:00:00 (Fri)
  63644749200, #    local_end 2017-10-27 01:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63644738400, #    utc_start 2017-10-26 22:00:00 (Thu)
  63658044000, #      utc_end 2018-03-29 22:00:00 (Thu)
  63644745600, #  local_start 2017-10-27 00:00:00 (Fri)
  63658051200, #    local_end 2018-03-30 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63658044000, #    utc_start 2018-03-29 22:00:00 (Thu)
  63676188000, #      utc_end 2018-10-25 22:00:00 (Thu)
  63658054800, #  local_start 2018-03-30 01:00:00 (Fri)
  63676198800, #    local_end 2018-10-26 01:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63676188000, #    utc_start 2018-10-25 22:00:00 (Thu)
  63689493600, #      utc_end 2019-03-28 22:00:00 (Thu)
  63676195200, #  local_start 2018-10-26 00:00:00 (Fri)
  63689500800, #    local_end 2019-03-29 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63689493600, #    utc_start 2019-03-28 22:00:00 (Thu)
  63707637600, #      utc_end 2019-10-24 22:00:00 (Thu)
  63689504400, #  local_start 2019-03-29 01:00:00 (Fri)
  63707648400, #    local_end 2019-10-25 01:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63707637600, #    utc_start 2019-10-24 22:00:00 (Thu)
  63720943200, #      utc_end 2020-03-26 22:00:00 (Thu)
  63707644800, #  local_start 2019-10-25 00:00:00 (Fri)
  63720950400, #    local_end 2020-03-27 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63720943200, #    utc_start 2020-03-26 22:00:00 (Thu)
  63739692000, #      utc_end 2020-10-29 22:00:00 (Thu)
  63720954000, #  local_start 2020-03-27 01:00:00 (Fri)
  63739702800, #    local_end 2020-10-30 01:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63739692000, #    utc_start 2020-10-29 22:00:00 (Thu)
  63752392800, #      utc_end 2021-03-25 22:00:00 (Thu)
  63739699200, #  local_start 2020-10-30 00:00:00 (Fri)
  63752400000, #    local_end 2021-03-26 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63752392800, #    utc_start 2021-03-25 22:00:00 (Thu)
  63771141600, #      utc_end 2021-10-28 22:00:00 (Thu)
  63752403600, #  local_start 2021-03-26 01:00:00 (Fri)
  63771152400, #    local_end 2021-10-29 01:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63771141600, #    utc_start 2021-10-28 22:00:00 (Thu)
  63784447200, #      utc_end 2022-03-31 22:00:00 (Thu)
  63771148800, #  local_start 2021-10-29 00:00:00 (Fri)
  63784454400, #    local_end 2022-04-01 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63784447200, #    utc_start 2022-03-31 22:00:00 (Thu)
  63802591200, #      utc_end 2022-10-27 22:00:00 (Thu)
  63784458000, #  local_start 2022-04-01 01:00:00 (Fri)
  63802602000, #    local_end 2022-10-28 01:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63802591200, #    utc_start 2022-10-27 22:00:00 (Thu)
  63815896800, #      utc_end 2023-03-30 22:00:00 (Thu)
  63802598400, #  local_start 2022-10-28 00:00:00 (Fri)
  63815904000, #    local_end 2023-03-31 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63815896800, #    utc_start 2023-03-30 22:00:00 (Thu)
  63834040800, #      utc_end 2023-10-26 22:00:00 (Thu)
  63815907600, #  local_start 2023-03-31 01:00:00 (Fri)
  63834051600, #    local_end 2023-10-27 01:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63834040800, #    utc_start 2023-10-26 22:00:00 (Thu)
  63847346400, #      utc_end 2024-03-28 22:00:00 (Thu)
  63834048000, #  local_start 2023-10-27 00:00:00 (Fri)
  63847353600, #    local_end 2024-03-29 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63847346400, #    utc_start 2024-03-28 22:00:00 (Thu)
  63865490400, #      utc_end 2024-10-24 22:00:00 (Thu)
  63847357200, #  local_start 2024-03-29 01:00:00 (Fri)
  63865501200, #    local_end 2024-10-25 01:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63865490400, #    utc_start 2024-10-24 22:00:00 (Thu)
  63878796000, #      utc_end 2025-03-27 22:00:00 (Thu)
  63865497600, #  local_start 2024-10-25 00:00:00 (Fri)
  63878803200, #    local_end 2025-03-28 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63878796000, #    utc_start 2025-03-27 22:00:00 (Thu)
  63897544800, #      utc_end 2025-10-30 22:00:00 (Thu)
  63878806800, #  local_start 2025-03-28 01:00:00 (Fri)
  63897555600, #    local_end 2025-10-31 01:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63897544800, #    utc_start 2025-10-30 22:00:00 (Thu)
  63910245600, #      utc_end 2026-03-26 22:00:00 (Thu)
  63897552000, #  local_start 2025-10-31 00:00:00 (Fri)
  63910252800, #    local_end 2026-03-27 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63910245600, #    utc_start 2026-03-26 22:00:00 (Thu)
  63928994400, #      utc_end 2026-10-29 22:00:00 (Thu)
  63910256400, #  local_start 2026-03-27 01:00:00 (Fri)
  63929005200, #    local_end 2026-10-30 01:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63928994400, #    utc_start 2026-10-29 22:00:00 (Thu)
  63941695200, #      utc_end 2027-03-25 22:00:00 (Thu)
  63929001600, #  local_start 2026-10-30 00:00:00 (Fri)
  63941702400, #    local_end 2027-03-26 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63941695200, #    utc_start 2027-03-25 22:00:00 (Thu)
  63960444000, #      utc_end 2027-10-28 22:00:00 (Thu)
  63941706000, #  local_start 2027-03-26 01:00:00 (Fri)
  63960454800, #    local_end 2027-10-29 01:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63960444000, #    utc_start 2027-10-28 22:00:00 (Thu)
  63973749600, #      utc_end 2028-03-30 22:00:00 (Thu)
  63960451200, #  local_start 2027-10-29 00:00:00 (Fri)
  63973756800, #    local_end 2028-03-31 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63973749600, #    utc_start 2028-03-30 22:00:00 (Thu)
  63991893600, #      utc_end 2028-10-26 22:00:00 (Thu)
  63973760400, #  local_start 2028-03-31 01:00:00 (Fri)
  63991904400, #    local_end 2028-10-27 01:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63991893600, #    utc_start 2028-10-26 22:00:00 (Thu)
  64005199200, #      utc_end 2029-03-29 22:00:00 (Thu)
  63991900800, #  local_start 2028-10-27 00:00:00 (Fri)
  64005206400, #    local_end 2029-03-30 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  64005199200, #    utc_start 2029-03-29 22:00:00 (Thu)
  64023343200, #      utc_end 2029-10-25 22:00:00 (Thu)
  64005210000, #  local_start 2029-03-30 01:00:00 (Fri)
  64023354000, #    local_end 2029-10-26 01:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  64023343200, #    utc_start 2029-10-25 22:00:00 (Thu)
  64036648800, #      utc_end 2030-03-28 22:00:00 (Thu)
  64023350400, #  local_start 2029-10-26 00:00:00 (Fri)
  64036656000, #    local_end 2030-03-29 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  64036648800, #    utc_start 2030-03-28 22:00:00 (Thu)
  64054792800, #      utc_end 2030-10-24 22:00:00 (Thu)
  64036659600, #  local_start 2030-03-29 01:00:00 (Fri)
  64054803600, #    local_end 2030-10-25 01:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {51}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { 7200 }
  
  my $last_observance = bless( {
    'format' => 'EE%sT',
    'gmtoff' => '2:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 704917,
      'local_rd_secs' => 84976,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 704917,
      'utc_rd_secs' => 84976,
      'utc_year' => 1931
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => 7200,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 704917,
      'local_rd_secs' => 77776,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 704917,
      'utc_rd_secs' => 77776,
      'utc_year' => 1931
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '24:00',
      'from' => '2014',
      'in' => 'Mar',
      'letter' => 'S',
      'name' => 'Jordan',
      'offset_from_std' => 3600,
      'on' => 'lastThu',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '0:00s',
      'from' => '2014',
      'in' => 'Oct',
      'letter' => '',
      'name' => 'Jordan',
      'offset_from_std' => 0,
      'on' => 'lastFri',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_AMMAN

    $main::fatpacked{"DateTime/TimeZone/Asia/Anadyr.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_ANADYR';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Anadyr;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Anadyr::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60694488604, #      utc_end 1924-05-01 12:10:04 (Thu)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60694531200, #    local_end 1924-05-02 00:00:00 (Fri)
  42596,
  0,
  'LMT',
      ],
      [
  60694488604, #    utc_start 1924-05-01 12:10:04 (Thu)
  60888110400, #      utc_end 1930-06-20 12:00:00 (Fri)
  60694531804, #  local_start 1924-05-02 00:10:04 (Fri)
  60888153600, #    local_end 1930-06-21 00:00:00 (Sat)
  43200,
  0,
  '+12',
      ],
      [
  60888110400, #    utc_start 1930-06-20 12:00:00 (Fri)
  62490567600, #      utc_end 1981-03-31 11:00:00 (Tue)
  60888157200, #  local_start 1930-06-21 01:00:00 (Sat)
  62490614400, #    local_end 1981-04-01 00:00:00 (Wed)
  46800,
  0,
  '+13',
      ],
      [
  62490567600, #    utc_start 1981-03-31 11:00:00 (Tue)
  62506375200, #      utc_end 1981-09-30 10:00:00 (Wed)
  62490618000, #  local_start 1981-04-01 01:00:00 (Wed)
  62506425600, #    local_end 1981-10-01 00:00:00 (Thu)
  50400,
  1,
  '+14',
      ],
      [
  62506375200, #    utc_start 1981-09-30 10:00:00 (Wed)
  62522103600, #      utc_end 1982-03-31 11:00:00 (Wed)
  62506422000, #  local_start 1981-09-30 23:00:00 (Wed)
  62522150400, #    local_end 1982-04-01 00:00:00 (Thu)
  46800,
  0,
  '+13',
      ],
      [
  62522103600, #    utc_start 1982-03-31 11:00:00 (Wed)
  62537914800, #      utc_end 1982-09-30 11:00:00 (Thu)
  62522150400, #  local_start 1982-04-01 00:00:00 (Thu)
  62537961600, #    local_end 1982-10-01 00:00:00 (Fri)
  46800,
  1,
  '+13',
      ],
      [
  62537914800, #    utc_start 1982-09-30 11:00:00 (Thu)
  62553643200, #      utc_end 1983-03-31 12:00:00 (Thu)
  62537958000, #  local_start 1982-09-30 23:00:00 (Thu)
  62553686400, #    local_end 1983-04-01 00:00:00 (Fri)
  43200,
  0,
  '+12',
      ],
      [
  62553643200, #    utc_start 1983-03-31 12:00:00 (Thu)
  62569450800, #      utc_end 1983-09-30 11:00:00 (Fri)
  62553690000, #  local_start 1983-04-01 01:00:00 (Fri)
  62569497600, #    local_end 1983-10-01 00:00:00 (Sat)
  46800,
  1,
  '+13',
      ],
      [
  62569450800, #    utc_start 1983-09-30 11:00:00 (Fri)
  62585265600, #      utc_end 1984-03-31 12:00:00 (Sat)
  62569494000, #  local_start 1983-09-30 23:00:00 (Fri)
  62585308800, #    local_end 1984-04-01 00:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  62585265600, #    utc_start 1984-03-31 12:00:00 (Sat)
  62600997600, #      utc_end 1984-09-29 14:00:00 (Sat)
  62585312400, #  local_start 1984-04-01 01:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  62600997600, #    utc_start 1984-09-29 14:00:00 (Sat)
  62616722400, #      utc_end 1985-03-30 14:00:00 (Sat)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  62616722400, #    utc_start 1985-03-30 14:00:00 (Sat)
  62632447200, #      utc_end 1985-09-28 14:00:00 (Sat)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  62632447200, #    utc_start 1985-09-28 14:00:00 (Sat)
  62648172000, #      utc_end 1986-03-29 14:00:00 (Sat)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  62648172000, #    utc_start 1986-03-29 14:00:00 (Sat)
  62663896800, #      utc_end 1986-09-27 14:00:00 (Sat)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  62663896800, #    utc_start 1986-09-27 14:00:00 (Sat)
  62679621600, #      utc_end 1987-03-28 14:00:00 (Sat)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  62679621600, #    utc_start 1987-03-28 14:00:00 (Sat)
  62695346400, #      utc_end 1987-09-26 14:00:00 (Sat)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  62695346400, #    utc_start 1987-09-26 14:00:00 (Sat)
  62711071200, #      utc_end 1988-03-26 14:00:00 (Sat)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  62711071200, #    utc_start 1988-03-26 14:00:00 (Sat)
  62726796000, #      utc_end 1988-09-24 14:00:00 (Sat)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  62726796000, #    utc_start 1988-09-24 14:00:00 (Sat)
  62742520800, #      utc_end 1989-03-25 14:00:00 (Sat)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  62742520800, #    utc_start 1989-03-25 14:00:00 (Sat)
  62758245600, #      utc_end 1989-09-23 14:00:00 (Sat)
  62742567600, #  local_start 1989-03-26 03:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  62758245600, #    utc_start 1989-09-23 14:00:00 (Sat)
  62773970400, #      utc_end 1990-03-24 14:00:00 (Sat)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  62773970400, #    utc_start 1990-03-24 14:00:00 (Sat)
  62790300000, #      utc_end 1990-09-29 14:00:00 (Sat)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  62790300000, #    utc_start 1990-09-29 14:00:00 (Sat)
  62806024800, #      utc_end 1991-03-30 14:00:00 (Sat)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  62806024800, #    utc_start 1991-03-30 14:00:00 (Sat)
  62821753200, #      utc_end 1991-09-28 15:00:00 (Sat)
  62806068000, #  local_start 1991-03-31 02:00:00 (Sun)
  62821796400, #    local_end 1991-09-29 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  62821753200, #    utc_start 1991-09-28 15:00:00 (Sat)
  62831430000, #      utc_end 1992-01-18 15:00:00 (Sat)
  62821792800, #  local_start 1991-09-29 02:00:00 (Sun)
  62831469600, #    local_end 1992-01-19 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62831430000, #    utc_start 1992-01-18 15:00:00 (Sat)
  62837474400, #      utc_end 1992-03-28 14:00:00 (Sat)
  62831473200, #  local_start 1992-01-19 03:00:00 (Sun)
  62837517600, #    local_end 1992-03-29 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  62837474400, #    utc_start 1992-03-28 14:00:00 (Sat)
  62853199200, #      utc_end 1992-09-26 14:00:00 (Sat)
  62837521200, #  local_start 1992-03-29 03:00:00 (Sun)
  62853246000, #    local_end 1992-09-27 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  62853199200, #    utc_start 1992-09-26 14:00:00 (Sat)
  62868924000, #      utc_end 1993-03-27 14:00:00 (Sat)
  62853242400, #  local_start 1992-09-27 02:00:00 (Sun)
  62868967200, #    local_end 1993-03-28 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  62868924000, #    utc_start 1993-03-27 14:00:00 (Sat)
  62884648800, #      utc_end 1993-09-25 14:00:00 (Sat)
  62868970800, #  local_start 1993-03-28 03:00:00 (Sun)
  62884695600, #    local_end 1993-09-26 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  62884648800, #    utc_start 1993-09-25 14:00:00 (Sat)
  62900373600, #      utc_end 1994-03-26 14:00:00 (Sat)
  62884692000, #  local_start 1993-09-26 02:00:00 (Sun)
  62900416800, #    local_end 1994-03-27 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  62900373600, #    utc_start 1994-03-26 14:00:00 (Sat)
  62916098400, #      utc_end 1994-09-24 14:00:00 (Sat)
  62900420400, #  local_start 1994-03-27 03:00:00 (Sun)
  62916145200, #    local_end 1994-09-25 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  62916098400, #    utc_start 1994-09-24 14:00:00 (Sat)
  62931823200, #      utc_end 1995-03-25 14:00:00 (Sat)
  62916141600, #  local_start 1994-09-25 02:00:00 (Sun)
  62931866400, #    local_end 1995-03-26 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  62931823200, #    utc_start 1995-03-25 14:00:00 (Sat)
  62947548000, #      utc_end 1995-09-23 14:00:00 (Sat)
  62931870000, #  local_start 1995-03-26 03:00:00 (Sun)
  62947594800, #    local_end 1995-09-24 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  62947548000, #    utc_start 1995-09-23 14:00:00 (Sat)
  62963877600, #      utc_end 1996-03-30 14:00:00 (Sat)
  62947591200, #  local_start 1995-09-24 02:00:00 (Sun)
  62963920800, #    local_end 1996-03-31 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  62963877600, #    utc_start 1996-03-30 14:00:00 (Sat)
  62982021600, #      utc_end 1996-10-26 14:00:00 (Sat)
  62963924400, #  local_start 1996-03-31 03:00:00 (Sun)
  62982068400, #    local_end 1996-10-27 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  62982021600, #    utc_start 1996-10-26 14:00:00 (Sat)
  62995327200, #      utc_end 1997-03-29 14:00:00 (Sat)
  62982064800, #  local_start 1996-10-27 02:00:00 (Sun)
  62995370400, #    local_end 1997-03-30 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  62995327200, #    utc_start 1997-03-29 14:00:00 (Sat)
  63013471200, #      utc_end 1997-10-25 14:00:00 (Sat)
  62995374000, #  local_start 1997-03-30 03:00:00 (Sun)
  63013518000, #    local_end 1997-10-26 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  63013471200, #    utc_start 1997-10-25 14:00:00 (Sat)
  63026776800, #      utc_end 1998-03-28 14:00:00 (Sat)
  63013514400, #  local_start 1997-10-26 02:00:00 (Sun)
  63026820000, #    local_end 1998-03-29 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  63026776800, #    utc_start 1998-03-28 14:00:00 (Sat)
  63044920800, #      utc_end 1998-10-24 14:00:00 (Sat)
  63026823600, #  local_start 1998-03-29 03:00:00 (Sun)
  63044967600, #    local_end 1998-10-25 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  63044920800, #    utc_start 1998-10-24 14:00:00 (Sat)
  63058226400, #      utc_end 1999-03-27 14:00:00 (Sat)
  63044964000, #  local_start 1998-10-25 02:00:00 (Sun)
  63058269600, #    local_end 1999-03-28 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  63058226400, #    utc_start 1999-03-27 14:00:00 (Sat)
  63076975200, #      utc_end 1999-10-30 14:00:00 (Sat)
  63058273200, #  local_start 1999-03-28 03:00:00 (Sun)
  63077022000, #    local_end 1999-10-31 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  63076975200, #    utc_start 1999-10-30 14:00:00 (Sat)
  63089676000, #      utc_end 2000-03-25 14:00:00 (Sat)
  63077018400, #  local_start 1999-10-31 02:00:00 (Sun)
  63089719200, #    local_end 2000-03-26 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  63089676000, #    utc_start 2000-03-25 14:00:00 (Sat)
  63108424800, #      utc_end 2000-10-28 14:00:00 (Sat)
  63089722800, #  local_start 2000-03-26 03:00:00 (Sun)
  63108471600, #    local_end 2000-10-29 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  63108424800, #    utc_start 2000-10-28 14:00:00 (Sat)
  63121125600, #      utc_end 2001-03-24 14:00:00 (Sat)
  63108468000, #  local_start 2000-10-29 02:00:00 (Sun)
  63121168800, #    local_end 2001-03-25 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  63121125600, #    utc_start 2001-03-24 14:00:00 (Sat)
  63139874400, #      utc_end 2001-10-27 14:00:00 (Sat)
  63121172400, #  local_start 2001-03-25 03:00:00 (Sun)
  63139921200, #    local_end 2001-10-28 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  63139874400, #    utc_start 2001-10-27 14:00:00 (Sat)
  63153180000, #      utc_end 2002-03-30 14:00:00 (Sat)
  63139917600, #  local_start 2001-10-28 02:00:00 (Sun)
  63153223200, #    local_end 2002-03-31 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  63153180000, #    utc_start 2002-03-30 14:00:00 (Sat)
  63171324000, #      utc_end 2002-10-26 14:00:00 (Sat)
  63153226800, #  local_start 2002-03-31 03:00:00 (Sun)
  63171370800, #    local_end 2002-10-27 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  63171324000, #    utc_start 2002-10-26 14:00:00 (Sat)
  63184629600, #      utc_end 2003-03-29 14:00:00 (Sat)
  63171367200, #  local_start 2002-10-27 02:00:00 (Sun)
  63184672800, #    local_end 2003-03-30 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  63184629600, #    utc_start 2003-03-29 14:00:00 (Sat)
  63202773600, #      utc_end 2003-10-25 14:00:00 (Sat)
  63184676400, #  local_start 2003-03-30 03:00:00 (Sun)
  63202820400, #    local_end 2003-10-26 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  63202773600, #    utc_start 2003-10-25 14:00:00 (Sat)
  63216079200, #      utc_end 2004-03-27 14:00:00 (Sat)
  63202816800, #  local_start 2003-10-26 02:00:00 (Sun)
  63216122400, #    local_end 2004-03-28 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  63216079200, #    utc_start 2004-03-27 14:00:00 (Sat)
  63234828000, #      utc_end 2004-10-30 14:00:00 (Sat)
  63216126000, #  local_start 2004-03-28 03:00:00 (Sun)
  63234874800, #    local_end 2004-10-31 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  63234828000, #    utc_start 2004-10-30 14:00:00 (Sat)
  63247528800, #      utc_end 2005-03-26 14:00:00 (Sat)
  63234871200, #  local_start 2004-10-31 02:00:00 (Sun)
  63247572000, #    local_end 2005-03-27 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  63247528800, #    utc_start 2005-03-26 14:00:00 (Sat)
  63266277600, #      utc_end 2005-10-29 14:00:00 (Sat)
  63247575600, #  local_start 2005-03-27 03:00:00 (Sun)
  63266324400, #    local_end 2005-10-30 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  63266277600, #    utc_start 2005-10-29 14:00:00 (Sat)
  63278978400, #      utc_end 2006-03-25 14:00:00 (Sat)
  63266320800, #  local_start 2005-10-30 02:00:00 (Sun)
  63279021600, #    local_end 2006-03-26 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  63278978400, #    utc_start 2006-03-25 14:00:00 (Sat)
  63297727200, #      utc_end 2006-10-28 14:00:00 (Sat)
  63279025200, #  local_start 2006-03-26 03:00:00 (Sun)
  63297774000, #    local_end 2006-10-29 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  63297727200, #    utc_start 2006-10-28 14:00:00 (Sat)
  63310428000, #      utc_end 2007-03-24 14:00:00 (Sat)
  63297770400, #  local_start 2006-10-29 02:00:00 (Sun)
  63310471200, #    local_end 2007-03-25 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  63310428000, #    utc_start 2007-03-24 14:00:00 (Sat)
  63329176800, #      utc_end 2007-10-27 14:00:00 (Sat)
  63310474800, #  local_start 2007-03-25 03:00:00 (Sun)
  63329223600, #    local_end 2007-10-28 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  63329176800, #    utc_start 2007-10-27 14:00:00 (Sat)
  63342482400, #      utc_end 2008-03-29 14:00:00 (Sat)
  63329220000, #  local_start 2007-10-28 02:00:00 (Sun)
  63342525600, #    local_end 2008-03-30 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  63342482400, #    utc_start 2008-03-29 14:00:00 (Sat)
  63360626400, #      utc_end 2008-10-25 14:00:00 (Sat)
  63342529200, #  local_start 2008-03-30 03:00:00 (Sun)
  63360673200, #    local_end 2008-10-26 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  63360626400, #    utc_start 2008-10-25 14:00:00 (Sat)
  63373932000, #      utc_end 2009-03-28 14:00:00 (Sat)
  63360669600, #  local_start 2008-10-26 02:00:00 (Sun)
  63373975200, #    local_end 2009-03-29 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  63373932000, #    utc_start 2009-03-28 14:00:00 (Sat)
  63392076000, #      utc_end 2009-10-24 14:00:00 (Sat)
  63373978800, #  local_start 2009-03-29 03:00:00 (Sun)
  63392122800, #    local_end 2009-10-25 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  63392076000, #    utc_start 2009-10-24 14:00:00 (Sat)
  63405381600, #      utc_end 2010-03-27 14:00:00 (Sat)
  63392119200, #  local_start 2009-10-25 02:00:00 (Sun)
  63405424800, #    local_end 2010-03-28 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  63405381600, #    utc_start 2010-03-27 14:00:00 (Sat)
  63424134000, #      utc_end 2010-10-30 15:00:00 (Sat)
  63405424800, #  local_start 2010-03-28 02:00:00 (Sun)
  63424177200, #    local_end 2010-10-31 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  63424134000, #    utc_start 2010-10-30 15:00:00 (Sat)
  63436834800, #      utc_end 2011-03-26 15:00:00 (Sat)
  63424173600, #  local_start 2010-10-31 02:00:00 (Sun)
  63436874400, #    local_end 2011-03-27 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  63436834800, #    utc_start 2011-03-26 15:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  63436878000, #  local_start 2011-03-27 03:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  43200,
  0,
  '+12',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {30}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_ANADYR

    $main::fatpacked{"DateTime/TimeZone/Asia/Aqtau.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_AQTAU';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/asia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Aqtau;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Aqtau::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60694519136, #      utc_end 1924-05-01 20:38:56 (Thu)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60694531200, #    local_end 1924-05-02 00:00:00 (Fri)
  12064,
  0,
  'LMT',
      ],
      [
  60694519136, #    utc_start 1924-05-01 20:38:56 (Thu)
  60888139200, #      utc_end 1930-06-20 20:00:00 (Fri)
  60694533536, #  local_start 1924-05-02 00:38:56 (Fri)
  60888153600, #    local_end 1930-06-21 00:00:00 (Sat)
  14400,
  0,
  '+04',
      ],
      [
  60888139200, #    utc_start 1930-06-20 20:00:00 (Fri)
  62506407600, #      utc_end 1981-09-30 19:00:00 (Wed)
  60888157200, #  local_start 1930-06-21 01:00:00 (Sat)
  62506425600, #    local_end 1981-10-01 00:00:00 (Thu)
  18000,
  0,
  '+05',
      ],
      [
  62506407600, #    utc_start 1981-09-30 19:00:00 (Wed)
  62522128800, #      utc_end 1982-03-31 18:00:00 (Wed)
  62506429200, #  local_start 1981-10-01 01:00:00 (Thu)
  62522150400, #    local_end 1982-04-01 00:00:00 (Thu)
  21600,
  0,
  '+06',
      ],
      [
  62522128800, #    utc_start 1982-03-31 18:00:00 (Wed)
  62537940000, #      utc_end 1982-09-30 18:00:00 (Thu)
  62522150400, #  local_start 1982-04-01 00:00:00 (Thu)
  62537961600, #    local_end 1982-10-01 00:00:00 (Fri)
  21600,
  1,
  '+06',
      ],
      [
  62537940000, #    utc_start 1982-09-30 18:00:00 (Thu)
  62553668400, #      utc_end 1983-03-31 19:00:00 (Thu)
  62537958000, #  local_start 1982-09-30 23:00:00 (Thu)
  62553686400, #    local_end 1983-04-01 00:00:00 (Fri)
  18000,
  0,
  '+05',
      ],
      [
  62553668400, #    utc_start 1983-03-31 19:00:00 (Thu)
  62569476000, #      utc_end 1983-09-30 18:00:00 (Fri)
  62553690000, #  local_start 1983-04-01 01:00:00 (Fri)
  62569497600, #    local_end 1983-10-01 00:00:00 (Sat)
  21600,
  1,
  '+06',
      ],
      [
  62569476000, #    utc_start 1983-09-30 18:00:00 (Fri)
  62585290800, #      utc_end 1984-03-31 19:00:00 (Sat)
  62569494000, #  local_start 1983-09-30 23:00:00 (Fri)
  62585308800, #    local_end 1984-04-01 00:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62585290800, #    utc_start 1984-03-31 19:00:00 (Sat)
  62601022800, #      utc_end 1984-09-29 21:00:00 (Sat)
  62585312400, #  local_start 1984-04-01 01:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62601022800, #    utc_start 1984-09-29 21:00:00 (Sat)
  62616747600, #      utc_end 1985-03-30 21:00:00 (Sat)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62616747600, #    utc_start 1985-03-30 21:00:00 (Sat)
  62632472400, #      utc_end 1985-09-28 21:00:00 (Sat)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62632472400, #    utc_start 1985-09-28 21:00:00 (Sat)
  62648197200, #      utc_end 1986-03-29 21:00:00 (Sat)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62648197200, #    utc_start 1986-03-29 21:00:00 (Sat)
  62663922000, #      utc_end 1986-09-27 21:00:00 (Sat)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62663922000, #    utc_start 1986-09-27 21:00:00 (Sat)
  62679646800, #      utc_end 1987-03-28 21:00:00 (Sat)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62679646800, #    utc_start 1987-03-28 21:00:00 (Sat)
  62695371600, #      utc_end 1987-09-26 21:00:00 (Sat)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62695371600, #    utc_start 1987-09-26 21:00:00 (Sat)
  62711096400, #      utc_end 1988-03-26 21:00:00 (Sat)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62711096400, #    utc_start 1988-03-26 21:00:00 (Sat)
  62726821200, #      utc_end 1988-09-24 21:00:00 (Sat)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62726821200, #    utc_start 1988-09-24 21:00:00 (Sat)
  62742546000, #      utc_end 1989-03-25 21:00:00 (Sat)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62742546000, #    utc_start 1989-03-25 21:00:00 (Sat)
  62758270800, #      utc_end 1989-09-23 21:00:00 (Sat)
  62742567600, #  local_start 1989-03-26 03:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62758270800, #    utc_start 1989-09-23 21:00:00 (Sat)
  62773995600, #      utc_end 1990-03-24 21:00:00 (Sat)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62773995600, #    utc_start 1990-03-24 21:00:00 (Sat)
  62790325200, #      utc_end 1990-09-29 21:00:00 (Sat)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62790325200, #    utc_start 1990-09-29 21:00:00 (Sat)
  62806050000, #      utc_end 1991-03-30 21:00:00 (Sat)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62806050000, #    utc_start 1991-03-30 21:00:00 (Sat)
  62821778400, #      utc_end 1991-09-28 22:00:00 (Sat)
  62806068000, #  local_start 1991-03-31 02:00:00 (Sun)
  62821796400, #    local_end 1991-09-29 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62821778400, #    utc_start 1991-09-28 22:00:00 (Sat)
  62831455200, #      utc_end 1992-01-18 22:00:00 (Sat)
  62821792800, #  local_start 1991-09-29 02:00:00 (Sun)
  62831469600, #    local_end 1992-01-19 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62831455200, #    utc_start 1992-01-18 22:00:00 (Sat)
  62837499600, #      utc_end 1992-03-28 21:00:00 (Sat)
  62831473200, #  local_start 1992-01-19 03:00:00 (Sun)
  62837517600, #    local_end 1992-03-29 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62837499600, #    utc_start 1992-03-28 21:00:00 (Sat)
  62853224400, #      utc_end 1992-09-26 21:00:00 (Sat)
  62837521200, #  local_start 1992-03-29 03:00:00 (Sun)
  62853246000, #    local_end 1992-09-27 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62853224400, #    utc_start 1992-09-26 21:00:00 (Sat)
  62868949200, #      utc_end 1993-03-27 21:00:00 (Sat)
  62853242400, #  local_start 1992-09-27 02:00:00 (Sun)
  62868967200, #    local_end 1993-03-28 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62868949200, #    utc_start 1993-03-27 21:00:00 (Sat)
  62884674000, #      utc_end 1993-09-25 21:00:00 (Sat)
  62868970800, #  local_start 1993-03-28 03:00:00 (Sun)
  62884695600, #    local_end 1993-09-26 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62884674000, #    utc_start 1993-09-25 21:00:00 (Sat)
  62900398800, #      utc_end 1994-03-26 21:00:00 (Sat)
  62884692000, #  local_start 1993-09-26 02:00:00 (Sun)
  62900416800, #    local_end 1994-03-27 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62900398800, #    utc_start 1994-03-26 21:00:00 (Sat)
  62916123600, #      utc_end 1994-09-24 21:00:00 (Sat)
  62900420400, #  local_start 1994-03-27 03:00:00 (Sun)
  62916145200, #    local_end 1994-09-25 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62916123600, #    utc_start 1994-09-24 21:00:00 (Sat)
  62931852000, #      utc_end 1995-03-25 22:00:00 (Sat)
  62916138000, #  local_start 1994-09-25 01:00:00 (Sun)
  62931866400, #    local_end 1995-03-26 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62931852000, #    utc_start 1995-03-25 22:00:00 (Sat)
  62947576800, #      utc_end 1995-09-23 22:00:00 (Sat)
  62931870000, #  local_start 1995-03-26 03:00:00 (Sun)
  62947594800, #    local_end 1995-09-24 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62947576800, #    utc_start 1995-09-23 22:00:00 (Sat)
  62963906400, #      utc_end 1996-03-30 22:00:00 (Sat)
  62947591200, #  local_start 1995-09-24 02:00:00 (Sun)
  62963920800, #    local_end 1996-03-31 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62963906400, #    utc_start 1996-03-30 22:00:00 (Sat)
  62982050400, #      utc_end 1996-10-26 22:00:00 (Sat)
  62963924400, #  local_start 1996-03-31 03:00:00 (Sun)
  62982068400, #    local_end 1996-10-27 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62982050400, #    utc_start 1996-10-26 22:00:00 (Sat)
  62995356000, #      utc_end 1997-03-29 22:00:00 (Sat)
  62982064800, #  local_start 1996-10-27 02:00:00 (Sun)
  62995370400, #    local_end 1997-03-30 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62995356000, #    utc_start 1997-03-29 22:00:00 (Sat)
  63013500000, #      utc_end 1997-10-25 22:00:00 (Sat)
  62995374000, #  local_start 1997-03-30 03:00:00 (Sun)
  63013518000, #    local_end 1997-10-26 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63013500000, #    utc_start 1997-10-25 22:00:00 (Sat)
  63026805600, #      utc_end 1998-03-28 22:00:00 (Sat)
  63013514400, #  local_start 1997-10-26 02:00:00 (Sun)
  63026820000, #    local_end 1998-03-29 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63026805600, #    utc_start 1998-03-28 22:00:00 (Sat)
  63044949600, #      utc_end 1998-10-24 22:00:00 (Sat)
  63026823600, #  local_start 1998-03-29 03:00:00 (Sun)
  63044967600, #    local_end 1998-10-25 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63044949600, #    utc_start 1998-10-24 22:00:00 (Sat)
  63058255200, #      utc_end 1999-03-27 22:00:00 (Sat)
  63044964000, #  local_start 1998-10-25 02:00:00 (Sun)
  63058269600, #    local_end 1999-03-28 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63058255200, #    utc_start 1999-03-27 22:00:00 (Sat)
  63077004000, #      utc_end 1999-10-30 22:00:00 (Sat)
  63058273200, #  local_start 1999-03-28 03:00:00 (Sun)
  63077022000, #    local_end 1999-10-31 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63077004000, #    utc_start 1999-10-30 22:00:00 (Sat)
  63089704800, #      utc_end 2000-03-25 22:00:00 (Sat)
  63077018400, #  local_start 1999-10-31 02:00:00 (Sun)
  63089719200, #    local_end 2000-03-26 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63089704800, #    utc_start 2000-03-25 22:00:00 (Sat)
  63108453600, #      utc_end 2000-10-28 22:00:00 (Sat)
  63089722800, #  local_start 2000-03-26 03:00:00 (Sun)
  63108471600, #    local_end 2000-10-29 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63108453600, #    utc_start 2000-10-28 22:00:00 (Sat)
  63121154400, #      utc_end 2001-03-24 22:00:00 (Sat)
  63108468000, #  local_start 2000-10-29 02:00:00 (Sun)
  63121168800, #    local_end 2001-03-25 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63121154400, #    utc_start 2001-03-24 22:00:00 (Sat)
  63139903200, #      utc_end 2001-10-27 22:00:00 (Sat)
  63121172400, #  local_start 2001-03-25 03:00:00 (Sun)
  63139921200, #    local_end 2001-10-28 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63139903200, #    utc_start 2001-10-27 22:00:00 (Sat)
  63153208800, #      utc_end 2002-03-30 22:00:00 (Sat)
  63139917600, #  local_start 2001-10-28 02:00:00 (Sun)
  63153223200, #    local_end 2002-03-31 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63153208800, #    utc_start 2002-03-30 22:00:00 (Sat)
  63171352800, #      utc_end 2002-10-26 22:00:00 (Sat)
  63153226800, #  local_start 2002-03-31 03:00:00 (Sun)
  63171370800, #    local_end 2002-10-27 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63171352800, #    utc_start 2002-10-26 22:00:00 (Sat)
  63184658400, #      utc_end 2003-03-29 22:00:00 (Sat)
  63171367200, #  local_start 2002-10-27 02:00:00 (Sun)
  63184672800, #    local_end 2003-03-30 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63184658400, #    utc_start 2003-03-29 22:00:00 (Sat)
  63202802400, #      utc_end 2003-10-25 22:00:00 (Sat)
  63184676400, #  local_start 2003-03-30 03:00:00 (Sun)
  63202820400, #    local_end 2003-10-26 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63202802400, #    utc_start 2003-10-25 22:00:00 (Sat)
  63216108000, #      utc_end 2004-03-27 22:00:00 (Sat)
  63202816800, #  local_start 2003-10-26 02:00:00 (Sun)
  63216122400, #    local_end 2004-03-28 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63216108000, #    utc_start 2004-03-27 22:00:00 (Sat)
  63234856800, #      utc_end 2004-10-30 22:00:00 (Sat)
  63216126000, #  local_start 2004-03-28 03:00:00 (Sun)
  63234874800, #    local_end 2004-10-31 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63234856800, #    utc_start 2004-10-30 22:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  63234874800, #  local_start 2004-10-31 03:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  18000,
  0,
  '+05',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {23}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_AQTAU

    $main::fatpacked{"DateTime/TimeZone/Asia/Aqtobe.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_AQTOBE';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/asia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Aqtobe;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Aqtobe::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60694517480, #      utc_end 1924-05-01 20:11:20 (Thu)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60694531200, #    local_end 1924-05-02 00:00:00 (Fri)
  13720,
  0,
  'LMT',
      ],
      [
  60694517480, #    utc_start 1924-05-01 20:11:20 (Thu)
  60888139200, #      utc_end 1930-06-20 20:00:00 (Fri)
  60694531880, #  local_start 1924-05-02 00:11:20 (Fri)
  60888153600, #    local_end 1930-06-21 00:00:00 (Sat)
  14400,
  0,
  '+04',
      ],
      [
  60888139200, #    utc_start 1930-06-20 20:00:00 (Fri)
  62490596400, #      utc_end 1981-03-31 19:00:00 (Tue)
  60888157200, #  local_start 1930-06-21 01:00:00 (Sat)
  62490614400, #    local_end 1981-04-01 00:00:00 (Wed)
  18000,
  0,
  '+05',
      ],
      [
  62490596400, #    utc_start 1981-03-31 19:00:00 (Tue)
  62506404000, #      utc_end 1981-09-30 18:00:00 (Wed)
  62490618000, #  local_start 1981-04-01 01:00:00 (Wed)
  62506425600, #    local_end 1981-10-01 00:00:00 (Thu)
  21600,
  1,
  '+06',
      ],
      [
  62506404000, #    utc_start 1981-09-30 18:00:00 (Wed)
  62522128800, #      utc_end 1982-03-31 18:00:00 (Wed)
  62506425600, #  local_start 1981-10-01 00:00:00 (Thu)
  62522150400, #    local_end 1982-04-01 00:00:00 (Thu)
  21600,
  0,
  '+06',
      ],
      [
  62522128800, #    utc_start 1982-03-31 18:00:00 (Wed)
  62537940000, #      utc_end 1982-09-30 18:00:00 (Thu)
  62522150400, #  local_start 1982-04-01 00:00:00 (Thu)
  62537961600, #    local_end 1982-10-01 00:00:00 (Fri)
  21600,
  1,
  '+06',
      ],
      [
  62537940000, #    utc_start 1982-09-30 18:00:00 (Thu)
  62553668400, #      utc_end 1983-03-31 19:00:00 (Thu)
  62537958000, #  local_start 1982-09-30 23:00:00 (Thu)
  62553686400, #    local_end 1983-04-01 00:00:00 (Fri)
  18000,
  0,
  '+05',
      ],
      [
  62553668400, #    utc_start 1983-03-31 19:00:00 (Thu)
  62569476000, #      utc_end 1983-09-30 18:00:00 (Fri)
  62553690000, #  local_start 1983-04-01 01:00:00 (Fri)
  62569497600, #    local_end 1983-10-01 00:00:00 (Sat)
  21600,
  1,
  '+06',
      ],
      [
  62569476000, #    utc_start 1983-09-30 18:00:00 (Fri)
  62585290800, #      utc_end 1984-03-31 19:00:00 (Sat)
  62569494000, #  local_start 1983-09-30 23:00:00 (Fri)
  62585308800, #    local_end 1984-04-01 00:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62585290800, #    utc_start 1984-03-31 19:00:00 (Sat)
  62601022800, #      utc_end 1984-09-29 21:00:00 (Sat)
  62585312400, #  local_start 1984-04-01 01:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62601022800, #    utc_start 1984-09-29 21:00:00 (Sat)
  62616747600, #      utc_end 1985-03-30 21:00:00 (Sat)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62616747600, #    utc_start 1985-03-30 21:00:00 (Sat)
  62632472400, #      utc_end 1985-09-28 21:00:00 (Sat)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62632472400, #    utc_start 1985-09-28 21:00:00 (Sat)
  62648197200, #      utc_end 1986-03-29 21:00:00 (Sat)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62648197200, #    utc_start 1986-03-29 21:00:00 (Sat)
  62663922000, #      utc_end 1986-09-27 21:00:00 (Sat)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62663922000, #    utc_start 1986-09-27 21:00:00 (Sat)
  62679646800, #      utc_end 1987-03-28 21:00:00 (Sat)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62679646800, #    utc_start 1987-03-28 21:00:00 (Sat)
  62695371600, #      utc_end 1987-09-26 21:00:00 (Sat)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62695371600, #    utc_start 1987-09-26 21:00:00 (Sat)
  62711096400, #      utc_end 1988-03-26 21:00:00 (Sat)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62711096400, #    utc_start 1988-03-26 21:00:00 (Sat)
  62726821200, #      utc_end 1988-09-24 21:00:00 (Sat)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62726821200, #    utc_start 1988-09-24 21:00:00 (Sat)
  62742546000, #      utc_end 1989-03-25 21:00:00 (Sat)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62742546000, #    utc_start 1989-03-25 21:00:00 (Sat)
  62758270800, #      utc_end 1989-09-23 21:00:00 (Sat)
  62742567600, #  local_start 1989-03-26 03:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62758270800, #    utc_start 1989-09-23 21:00:00 (Sat)
  62773995600, #      utc_end 1990-03-24 21:00:00 (Sat)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62773995600, #    utc_start 1990-03-24 21:00:00 (Sat)
  62790325200, #      utc_end 1990-09-29 21:00:00 (Sat)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62790325200, #    utc_start 1990-09-29 21:00:00 (Sat)
  62806050000, #      utc_end 1991-03-30 21:00:00 (Sat)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62806050000, #    utc_start 1991-03-30 21:00:00 (Sat)
  62821778400, #      utc_end 1991-09-28 22:00:00 (Sat)
  62806068000, #  local_start 1991-03-31 02:00:00 (Sun)
  62821796400, #    local_end 1991-09-29 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62821778400, #    utc_start 1991-09-28 22:00:00 (Sat)
  62831455200, #      utc_end 1992-01-18 22:00:00 (Sat)
  62821792800, #  local_start 1991-09-29 02:00:00 (Sun)
  62831469600, #    local_end 1992-01-19 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62831455200, #    utc_start 1992-01-18 22:00:00 (Sat)
  62837499600, #      utc_end 1992-03-28 21:00:00 (Sat)
  62831473200, #  local_start 1992-01-19 03:00:00 (Sun)
  62837517600, #    local_end 1992-03-29 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62837499600, #    utc_start 1992-03-28 21:00:00 (Sat)
  62853224400, #      utc_end 1992-09-26 21:00:00 (Sat)
  62837521200, #  local_start 1992-03-29 03:00:00 (Sun)
  62853246000, #    local_end 1992-09-27 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62853224400, #    utc_start 1992-09-26 21:00:00 (Sat)
  62868949200, #      utc_end 1993-03-27 21:00:00 (Sat)
  62853242400, #  local_start 1992-09-27 02:00:00 (Sun)
  62868967200, #    local_end 1993-03-28 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62868949200, #    utc_start 1993-03-27 21:00:00 (Sat)
  62884674000, #      utc_end 1993-09-25 21:00:00 (Sat)
  62868970800, #  local_start 1993-03-28 03:00:00 (Sun)
  62884695600, #    local_end 1993-09-26 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62884674000, #    utc_start 1993-09-25 21:00:00 (Sat)
  62900398800, #      utc_end 1994-03-26 21:00:00 (Sat)
  62884692000, #  local_start 1993-09-26 02:00:00 (Sun)
  62900416800, #    local_end 1994-03-27 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62900398800, #    utc_start 1994-03-26 21:00:00 (Sat)
  62916123600, #      utc_end 1994-09-24 21:00:00 (Sat)
  62900420400, #  local_start 1994-03-27 03:00:00 (Sun)
  62916145200, #    local_end 1994-09-25 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62916123600, #    utc_start 1994-09-24 21:00:00 (Sat)
  62931848400, #      utc_end 1995-03-25 21:00:00 (Sat)
  62916141600, #  local_start 1994-09-25 02:00:00 (Sun)
  62931866400, #    local_end 1995-03-26 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62931848400, #    utc_start 1995-03-25 21:00:00 (Sat)
  62947573200, #      utc_end 1995-09-23 21:00:00 (Sat)
  62931870000, #  local_start 1995-03-26 03:00:00 (Sun)
  62947594800, #    local_end 1995-09-24 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62947573200, #    utc_start 1995-09-23 21:00:00 (Sat)
  62963902800, #      utc_end 1996-03-30 21:00:00 (Sat)
  62947591200, #  local_start 1995-09-24 02:00:00 (Sun)
  62963920800, #    local_end 1996-03-31 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62963902800, #    utc_start 1996-03-30 21:00:00 (Sat)
  62982046800, #      utc_end 1996-10-26 21:00:00 (Sat)
  62963924400, #  local_start 1996-03-31 03:00:00 (Sun)
  62982068400, #    local_end 1996-10-27 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62982046800, #    utc_start 1996-10-26 21:00:00 (Sat)
  62995352400, #      utc_end 1997-03-29 21:00:00 (Sat)
  62982064800, #  local_start 1996-10-27 02:00:00 (Sun)
  62995370400, #    local_end 1997-03-30 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62995352400, #    utc_start 1997-03-29 21:00:00 (Sat)
  63013496400, #      utc_end 1997-10-25 21:00:00 (Sat)
  62995374000, #  local_start 1997-03-30 03:00:00 (Sun)
  63013518000, #    local_end 1997-10-26 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  63013496400, #    utc_start 1997-10-25 21:00:00 (Sat)
  63026802000, #      utc_end 1998-03-28 21:00:00 (Sat)
  63013514400, #  local_start 1997-10-26 02:00:00 (Sun)
  63026820000, #    local_end 1998-03-29 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  63026802000, #    utc_start 1998-03-28 21:00:00 (Sat)
  63044946000, #      utc_end 1998-10-24 21:00:00 (Sat)
  63026823600, #  local_start 1998-03-29 03:00:00 (Sun)
  63044967600, #    local_end 1998-10-25 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  63044946000, #    utc_start 1998-10-24 21:00:00 (Sat)
  63058251600, #      utc_end 1999-03-27 21:00:00 (Sat)
  63044964000, #  local_start 1998-10-25 02:00:00 (Sun)
  63058269600, #    local_end 1999-03-28 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  63058251600, #    utc_start 1999-03-27 21:00:00 (Sat)
  63077000400, #      utc_end 1999-10-30 21:00:00 (Sat)
  63058273200, #  local_start 1999-03-28 03:00:00 (Sun)
  63077022000, #    local_end 1999-10-31 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  63077000400, #    utc_start 1999-10-30 21:00:00 (Sat)
  63089701200, #      utc_end 2000-03-25 21:00:00 (Sat)
  63077018400, #  local_start 1999-10-31 02:00:00 (Sun)
  63089719200, #    local_end 2000-03-26 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  63089701200, #    utc_start 2000-03-25 21:00:00 (Sat)
  63108450000, #      utc_end 2000-10-28 21:00:00 (Sat)
  63089722800, #  local_start 2000-03-26 03:00:00 (Sun)
  63108471600, #    local_end 2000-10-29 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  63108450000, #    utc_start 2000-10-28 21:00:00 (Sat)
  63121150800, #      utc_end 2001-03-24 21:00:00 (Sat)
  63108468000, #  local_start 2000-10-29 02:00:00 (Sun)
  63121168800, #    local_end 2001-03-25 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  63121150800, #    utc_start 2001-03-24 21:00:00 (Sat)
  63139899600, #      utc_end 2001-10-27 21:00:00 (Sat)
  63121172400, #  local_start 2001-03-25 03:00:00 (Sun)
  63139921200, #    local_end 2001-10-28 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  63139899600, #    utc_start 2001-10-27 21:00:00 (Sat)
  63153205200, #      utc_end 2002-03-30 21:00:00 (Sat)
  63139917600, #  local_start 2001-10-28 02:00:00 (Sun)
  63153223200, #    local_end 2002-03-31 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  63153205200, #    utc_start 2002-03-30 21:00:00 (Sat)
  63171349200, #      utc_end 2002-10-26 21:00:00 (Sat)
  63153226800, #  local_start 2002-03-31 03:00:00 (Sun)
  63171370800, #    local_end 2002-10-27 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  63171349200, #    utc_start 2002-10-26 21:00:00 (Sat)
  63184654800, #      utc_end 2003-03-29 21:00:00 (Sat)
  63171367200, #  local_start 2002-10-27 02:00:00 (Sun)
  63184672800, #    local_end 2003-03-30 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  63184654800, #    utc_start 2003-03-29 21:00:00 (Sat)
  63202798800, #      utc_end 2003-10-25 21:00:00 (Sat)
  63184676400, #  local_start 2003-03-30 03:00:00 (Sun)
  63202820400, #    local_end 2003-10-26 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  63202798800, #    utc_start 2003-10-25 21:00:00 (Sat)
  63216104400, #      utc_end 2004-03-27 21:00:00 (Sat)
  63202816800, #  local_start 2003-10-26 02:00:00 (Sun)
  63216122400, #    local_end 2004-03-28 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  63216104400, #    utc_start 2004-03-27 21:00:00 (Sat)
  63234853200, #      utc_end 2004-10-30 21:00:00 (Sat)
  63216126000, #  local_start 2004-03-28 03:00:00 (Sun)
  63234874800, #    local_end 2004-10-31 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  63234853200, #    utc_start 2004-10-30 21:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  63234871200, #  local_start 2004-10-31 02:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  18000,
  0,
  '+05',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {24}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_AQTOBE

    $main::fatpacked{"DateTime/TimeZone/Asia/Ashgabat.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_ASHGABAT';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/asia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Ashgabat;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Ashgabat::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60694517188, #      utc_end 1924-05-01 20:06:28 (Thu)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60694531200, #    local_end 1924-05-02 00:00:00 (Fri)
  14012,
  0,
  'LMT',
      ],
      [
  60694517188, #    utc_start 1924-05-01 20:06:28 (Thu)
  60888139200, #      utc_end 1930-06-20 20:00:00 (Fri)
  60694531588, #  local_start 1924-05-02 00:06:28 (Fri)
  60888153600, #    local_end 1930-06-21 00:00:00 (Sat)
  14400,
  0,
  '+04',
      ],
      [
  60888139200, #    utc_start 1930-06-20 20:00:00 (Fri)
  62490596400, #      utc_end 1981-03-31 19:00:00 (Tue)
  60888157200, #  local_start 1930-06-21 01:00:00 (Sat)
  62490614400, #    local_end 1981-04-01 00:00:00 (Wed)
  18000,
  0,
  '+05',
      ],
      [
  62490596400, #    utc_start 1981-03-31 19:00:00 (Tue)
  62506404000, #      utc_end 1981-09-30 18:00:00 (Wed)
  62490618000, #  local_start 1981-04-01 01:00:00 (Wed)
  62506425600, #    local_end 1981-10-01 00:00:00 (Thu)
  21600,
  1,
  '+06',
      ],
      [
  62506404000, #    utc_start 1981-09-30 18:00:00 (Wed)
  62522132400, #      utc_end 1982-03-31 19:00:00 (Wed)
  62506422000, #  local_start 1981-09-30 23:00:00 (Wed)
  62522150400, #    local_end 1982-04-01 00:00:00 (Thu)
  18000,
  0,
  '+05',
      ],
      [
  62522132400, #    utc_start 1982-03-31 19:00:00 (Wed)
  62537940000, #      utc_end 1982-09-30 18:00:00 (Thu)
  62522154000, #  local_start 1982-04-01 01:00:00 (Thu)
  62537961600, #    local_end 1982-10-01 00:00:00 (Fri)
  21600,
  1,
  '+06',
      ],
      [
  62537940000, #    utc_start 1982-09-30 18:00:00 (Thu)
  62553668400, #      utc_end 1983-03-31 19:00:00 (Thu)
  62537958000, #  local_start 1982-09-30 23:00:00 (Thu)
  62553686400, #    local_end 1983-04-01 00:00:00 (Fri)
  18000,
  0,
  '+05',
      ],
      [
  62553668400, #    utc_start 1983-03-31 19:00:00 (Thu)
  62569476000, #      utc_end 1983-09-30 18:00:00 (Fri)
  62553690000, #  local_start 1983-04-01 01:00:00 (Fri)
  62569497600, #    local_end 1983-10-01 00:00:00 (Sat)
  21600,
  1,
  '+06',
      ],
      [
  62569476000, #    utc_start 1983-09-30 18:00:00 (Fri)
  62585290800, #      utc_end 1984-03-31 19:00:00 (Sat)
  62569494000, #  local_start 1983-09-30 23:00:00 (Fri)
  62585308800, #    local_end 1984-04-01 00:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62585290800, #    utc_start 1984-03-31 19:00:00 (Sat)
  62601022800, #      utc_end 1984-09-29 21:00:00 (Sat)
  62585312400, #  local_start 1984-04-01 01:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62601022800, #    utc_start 1984-09-29 21:00:00 (Sat)
  62616747600, #      utc_end 1985-03-30 21:00:00 (Sat)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62616747600, #    utc_start 1985-03-30 21:00:00 (Sat)
  62632472400, #      utc_end 1985-09-28 21:00:00 (Sat)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62632472400, #    utc_start 1985-09-28 21:00:00 (Sat)
  62648197200, #      utc_end 1986-03-29 21:00:00 (Sat)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62648197200, #    utc_start 1986-03-29 21:00:00 (Sat)
  62663922000, #      utc_end 1986-09-27 21:00:00 (Sat)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62663922000, #    utc_start 1986-09-27 21:00:00 (Sat)
  62679646800, #      utc_end 1987-03-28 21:00:00 (Sat)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62679646800, #    utc_start 1987-03-28 21:00:00 (Sat)
  62695371600, #      utc_end 1987-09-26 21:00:00 (Sat)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62695371600, #    utc_start 1987-09-26 21:00:00 (Sat)
  62711096400, #      utc_end 1988-03-26 21:00:00 (Sat)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62711096400, #    utc_start 1988-03-26 21:00:00 (Sat)
  62726821200, #      utc_end 1988-09-24 21:00:00 (Sat)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62726821200, #    utc_start 1988-09-24 21:00:00 (Sat)
  62742546000, #      utc_end 1989-03-25 21:00:00 (Sat)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62742546000, #    utc_start 1989-03-25 21:00:00 (Sat)
  62758270800, #      utc_end 1989-09-23 21:00:00 (Sat)
  62742567600, #  local_start 1989-03-26 03:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62758270800, #    utc_start 1989-09-23 21:00:00 (Sat)
  62773995600, #      utc_end 1990-03-24 21:00:00 (Sat)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62773995600, #    utc_start 1990-03-24 21:00:00 (Sat)
  62790325200, #      utc_end 1990-09-29 21:00:00 (Sat)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62790325200, #    utc_start 1990-09-29 21:00:00 (Sat)
  62806050000, #      utc_end 1991-03-30 21:00:00 (Sat)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62806050000, #    utc_start 1991-03-30 21:00:00 (Sat)
  62821778400, #      utc_end 1991-09-28 22:00:00 (Sat)
  62806068000, #  local_start 1991-03-31 02:00:00 (Sun)
  62821796400, #    local_end 1991-09-29 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62821778400, #    utc_start 1991-09-28 22:00:00 (Sat)
  62831455200, #      utc_end 1992-01-18 22:00:00 (Sat)
  62821792800, #  local_start 1991-09-29 02:00:00 (Sun)
  62831469600, #    local_end 1992-01-19 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62831455200, #    utc_start 1992-01-18 22:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  62831473200, #  local_start 1992-01-19 03:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  18000,
  0,
  '+05',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {11}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_ASHGABAT

    $main::fatpacked{"DateTime/TimeZone/Asia/Atyrau.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_ATYRAU';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/asia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Atyrau;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Atyrau::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60694518736, #      utc_end 1924-05-01 20:32:16 (Thu)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60694531200, #    local_end 1924-05-02 00:00:00 (Fri)
  12464,
  0,
  'LMT',
      ],
      [
  60694518736, #    utc_start 1924-05-01 20:32:16 (Thu)
  60888142800, #      utc_end 1930-06-20 21:00:00 (Fri)
  60694529536, #  local_start 1924-05-01 23:32:16 (Thu)
  60888153600, #    local_end 1930-06-21 00:00:00 (Sat)
  10800,
  0,
  '+03',
      ],
      [
  60888142800, #    utc_start 1930-06-20 21:00:00 (Fri)
  62506407600, #      utc_end 1981-09-30 19:00:00 (Wed)
  60888160800, #  local_start 1930-06-21 02:00:00 (Sat)
  62506425600, #    local_end 1981-10-01 00:00:00 (Thu)
  18000,
  0,
  '+05',
      ],
      [
  62506407600, #    utc_start 1981-09-30 19:00:00 (Wed)
  62522128800, #      utc_end 1982-03-31 18:00:00 (Wed)
  62506429200, #  local_start 1981-10-01 01:00:00 (Thu)
  62522150400, #    local_end 1982-04-01 00:00:00 (Thu)
  21600,
  0,
  '+06',
      ],
      [
  62522128800, #    utc_start 1982-03-31 18:00:00 (Wed)
  62537940000, #      utc_end 1982-09-30 18:00:00 (Thu)
  62522150400, #  local_start 1982-04-01 00:00:00 (Thu)
  62537961600, #    local_end 1982-10-01 00:00:00 (Fri)
  21600,
  1,
  '+06',
      ],
      [
  62537940000, #    utc_start 1982-09-30 18:00:00 (Thu)
  62553668400, #      utc_end 1983-03-31 19:00:00 (Thu)
  62537958000, #  local_start 1982-09-30 23:00:00 (Thu)
  62553686400, #    local_end 1983-04-01 00:00:00 (Fri)
  18000,
  0,
  '+05',
      ],
      [
  62553668400, #    utc_start 1983-03-31 19:00:00 (Thu)
  62569476000, #      utc_end 1983-09-30 18:00:00 (Fri)
  62553690000, #  local_start 1983-04-01 01:00:00 (Fri)
  62569497600, #    local_end 1983-10-01 00:00:00 (Sat)
  21600,
  1,
  '+06',
      ],
      [
  62569476000, #    utc_start 1983-09-30 18:00:00 (Fri)
  62585290800, #      utc_end 1984-03-31 19:00:00 (Sat)
  62569494000, #  local_start 1983-09-30 23:00:00 (Fri)
  62585308800, #    local_end 1984-04-01 00:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62585290800, #    utc_start 1984-03-31 19:00:00 (Sat)
  62601022800, #      utc_end 1984-09-29 21:00:00 (Sat)
  62585312400, #  local_start 1984-04-01 01:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62601022800, #    utc_start 1984-09-29 21:00:00 (Sat)
  62616747600, #      utc_end 1985-03-30 21:00:00 (Sat)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62616747600, #    utc_start 1985-03-30 21:00:00 (Sat)
  62632472400, #      utc_end 1985-09-28 21:00:00 (Sat)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62632472400, #    utc_start 1985-09-28 21:00:00 (Sat)
  62648197200, #      utc_end 1986-03-29 21:00:00 (Sat)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62648197200, #    utc_start 1986-03-29 21:00:00 (Sat)
  62663922000, #      utc_end 1986-09-27 21:00:00 (Sat)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62663922000, #    utc_start 1986-09-27 21:00:00 (Sat)
  62679646800, #      utc_end 1987-03-28 21:00:00 (Sat)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62679646800, #    utc_start 1987-03-28 21:00:00 (Sat)
  62695371600, #      utc_end 1987-09-26 21:00:00 (Sat)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62695371600, #    utc_start 1987-09-26 21:00:00 (Sat)
  62711096400, #      utc_end 1988-03-26 21:00:00 (Sat)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62711096400, #    utc_start 1988-03-26 21:00:00 (Sat)
  62726821200, #      utc_end 1988-09-24 21:00:00 (Sat)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62726821200, #    utc_start 1988-09-24 21:00:00 (Sat)
  62742546000, #      utc_end 1989-03-25 21:00:00 (Sat)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62742546000, #    utc_start 1989-03-25 21:00:00 (Sat)
  62758270800, #      utc_end 1989-09-23 21:00:00 (Sat)
  62742567600, #  local_start 1989-03-26 03:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62758270800, #    utc_start 1989-09-23 21:00:00 (Sat)
  62773995600, #      utc_end 1990-03-24 21:00:00 (Sat)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62773995600, #    utc_start 1990-03-24 21:00:00 (Sat)
  62790325200, #      utc_end 1990-09-29 21:00:00 (Sat)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62790325200, #    utc_start 1990-09-29 21:00:00 (Sat)
  62806050000, #      utc_end 1991-03-30 21:00:00 (Sat)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62806050000, #    utc_start 1991-03-30 21:00:00 (Sat)
  62821778400, #      utc_end 1991-09-28 22:00:00 (Sat)
  62806068000, #  local_start 1991-03-31 02:00:00 (Sun)
  62821796400, #    local_end 1991-09-29 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62821778400, #    utc_start 1991-09-28 22:00:00 (Sat)
  62831455200, #      utc_end 1992-01-18 22:00:00 (Sat)
  62821792800, #  local_start 1991-09-29 02:00:00 (Sun)
  62831469600, #    local_end 1992-01-19 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62831455200, #    utc_start 1992-01-18 22:00:00 (Sat)
  62837499600, #      utc_end 1992-03-28 21:00:00 (Sat)
  62831473200, #  local_start 1992-01-19 03:00:00 (Sun)
  62837517600, #    local_end 1992-03-29 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62837499600, #    utc_start 1992-03-28 21:00:00 (Sat)
  62853224400, #      utc_end 1992-09-26 21:00:00 (Sat)
  62837521200, #  local_start 1992-03-29 03:00:00 (Sun)
  62853246000, #    local_end 1992-09-27 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62853224400, #    utc_start 1992-09-26 21:00:00 (Sat)
  62868949200, #      utc_end 1993-03-27 21:00:00 (Sat)
  62853242400, #  local_start 1992-09-27 02:00:00 (Sun)
  62868967200, #    local_end 1993-03-28 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62868949200, #    utc_start 1993-03-27 21:00:00 (Sat)
  62884674000, #      utc_end 1993-09-25 21:00:00 (Sat)
  62868970800, #  local_start 1993-03-28 03:00:00 (Sun)
  62884695600, #    local_end 1993-09-26 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62884674000, #    utc_start 1993-09-25 21:00:00 (Sat)
  62900398800, #      utc_end 1994-03-26 21:00:00 (Sat)
  62884692000, #  local_start 1993-09-26 02:00:00 (Sun)
  62900416800, #    local_end 1994-03-27 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62900398800, #    utc_start 1994-03-26 21:00:00 (Sat)
  62916123600, #      utc_end 1994-09-24 21:00:00 (Sat)
  62900420400, #  local_start 1994-03-27 03:00:00 (Sun)
  62916145200, #    local_end 1994-09-25 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62916123600, #    utc_start 1994-09-24 21:00:00 (Sat)
  62931848400, #      utc_end 1995-03-25 21:00:00 (Sat)
  62916141600, #  local_start 1994-09-25 02:00:00 (Sun)
  62931866400, #    local_end 1995-03-26 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62931848400, #    utc_start 1995-03-25 21:00:00 (Sat)
  62947573200, #      utc_end 1995-09-23 21:00:00 (Sat)
  62931870000, #  local_start 1995-03-26 03:00:00 (Sun)
  62947594800, #    local_end 1995-09-24 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62947573200, #    utc_start 1995-09-23 21:00:00 (Sat)
  62963902800, #      utc_end 1996-03-30 21:00:00 (Sat)
  62947591200, #  local_start 1995-09-24 02:00:00 (Sun)
  62963920800, #    local_end 1996-03-31 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62963902800, #    utc_start 1996-03-30 21:00:00 (Sat)
  62982046800, #      utc_end 1996-10-26 21:00:00 (Sat)
  62963924400, #  local_start 1996-03-31 03:00:00 (Sun)
  62982068400, #    local_end 1996-10-27 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62982046800, #    utc_start 1996-10-26 21:00:00 (Sat)
  62995352400, #      utc_end 1997-03-29 21:00:00 (Sat)
  62982064800, #  local_start 1996-10-27 02:00:00 (Sun)
  62995370400, #    local_end 1997-03-30 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62995352400, #    utc_start 1997-03-29 21:00:00 (Sat)
  63013496400, #      utc_end 1997-10-25 21:00:00 (Sat)
  62995374000, #  local_start 1997-03-30 03:00:00 (Sun)
  63013518000, #    local_end 1997-10-26 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  63013496400, #    utc_start 1997-10-25 21:00:00 (Sat)
  63026802000, #      utc_end 1998-03-28 21:00:00 (Sat)
  63013514400, #  local_start 1997-10-26 02:00:00 (Sun)
  63026820000, #    local_end 1998-03-29 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  63026802000, #    utc_start 1998-03-28 21:00:00 (Sat)
  63044946000, #      utc_end 1998-10-24 21:00:00 (Sat)
  63026823600, #  local_start 1998-03-29 03:00:00 (Sun)
  63044967600, #    local_end 1998-10-25 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  63044946000, #    utc_start 1998-10-24 21:00:00 (Sat)
  63058251600, #      utc_end 1999-03-27 21:00:00 (Sat)
  63044964000, #  local_start 1998-10-25 02:00:00 (Sun)
  63058269600, #    local_end 1999-03-28 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  63058251600, #    utc_start 1999-03-27 21:00:00 (Sat)
  63077004000, #      utc_end 1999-10-30 22:00:00 (Sat)
  63058269600, #  local_start 1999-03-28 02:00:00 (Sun)
  63077022000, #    local_end 1999-10-31 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63077004000, #    utc_start 1999-10-30 22:00:00 (Sat)
  63089704800, #      utc_end 2000-03-25 22:00:00 (Sat)
  63077018400, #  local_start 1999-10-31 02:00:00 (Sun)
  63089719200, #    local_end 2000-03-26 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63089704800, #    utc_start 2000-03-25 22:00:00 (Sat)
  63108453600, #      utc_end 2000-10-28 22:00:00 (Sat)
  63089722800, #  local_start 2000-03-26 03:00:00 (Sun)
  63108471600, #    local_end 2000-10-29 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63108453600, #    utc_start 2000-10-28 22:00:00 (Sat)
  63121154400, #      utc_end 2001-03-24 22:00:00 (Sat)
  63108468000, #  local_start 2000-10-29 02:00:00 (Sun)
  63121168800, #    local_end 2001-03-25 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63121154400, #    utc_start 2001-03-24 22:00:00 (Sat)
  63139903200, #      utc_end 2001-10-27 22:00:00 (Sat)
  63121172400, #  local_start 2001-03-25 03:00:00 (Sun)
  63139921200, #    local_end 2001-10-28 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63139903200, #    utc_start 2001-10-27 22:00:00 (Sat)
  63153208800, #      utc_end 2002-03-30 22:00:00 (Sat)
  63139917600, #  local_start 2001-10-28 02:00:00 (Sun)
  63153223200, #    local_end 2002-03-31 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63153208800, #    utc_start 2002-03-30 22:00:00 (Sat)
  63171352800, #      utc_end 2002-10-26 22:00:00 (Sat)
  63153226800, #  local_start 2002-03-31 03:00:00 (Sun)
  63171370800, #    local_end 2002-10-27 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63171352800, #    utc_start 2002-10-26 22:00:00 (Sat)
  63184658400, #      utc_end 2003-03-29 22:00:00 (Sat)
  63171367200, #  local_start 2002-10-27 02:00:00 (Sun)
  63184672800, #    local_end 2003-03-30 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63184658400, #    utc_start 2003-03-29 22:00:00 (Sat)
  63202802400, #      utc_end 2003-10-25 22:00:00 (Sat)
  63184676400, #  local_start 2003-03-30 03:00:00 (Sun)
  63202820400, #    local_end 2003-10-26 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63202802400, #    utc_start 2003-10-25 22:00:00 (Sat)
  63216108000, #      utc_end 2004-03-27 22:00:00 (Sat)
  63202816800, #  local_start 2003-10-26 02:00:00 (Sun)
  63216122400, #    local_end 2004-03-28 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63216108000, #    utc_start 2004-03-27 22:00:00 (Sat)
  63234856800, #      utc_end 2004-10-30 22:00:00 (Sat)
  63216126000, #  local_start 2004-03-28 03:00:00 (Sun)
  63234874800, #    local_end 2004-10-31 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63234856800, #    utc_start 2004-10-30 22:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  63234874800, #  local_start 2004-10-31 03:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  18000,
  0,
  '+05',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {23}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_ATYRAU

    $main::fatpacked{"DateTime/TimeZone/Asia/Baghdad.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_BAGHDAD';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/asia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Baghdad;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Baghdad::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59611150940, #      utc_end 1889-12-31 21:02:20 (Tue)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59611161600, #    local_end 1890-01-01 00:00:00 (Wed)
  10660,
  0,
  'LMT',
      ],
      [
  59611150940, #    utc_start 1889-12-31 21:02:20 (Tue)
  60494677344, #      utc_end 1917-12-31 21:02:24 (Mon)
  59611161596, #  local_start 1889-12-31 23:59:56 (Tue)
  60494688000, #    local_end 1918-01-01 00:00:00 (Tue)
  10656,
  0,
  'BMT',
      ],
      [
  60494677344, #    utc_start 1917-12-31 21:02:24 (Mon)
  62524731600, #      utc_end 1982-04-30 21:00:00 (Fri)
  60494688144, #  local_start 1918-01-01 00:02:24 (Tue)
  62524742400, #    local_end 1982-05-01 00:00:00 (Sat)
  10800,
  0,
  '+03',
      ],
      [
  62524731600, #    utc_start 1982-04-30 21:00:00 (Fri)
  62537947200, #      utc_end 1982-09-30 20:00:00 (Thu)
  62524746000, #  local_start 1982-05-01 01:00:00 (Sat)
  62537961600, #    local_end 1982-10-01 00:00:00 (Fri)
  14400,
  1,
  '+04',
      ],
      [
  62537947200, #    utc_start 1982-09-30 20:00:00 (Thu)
  62553589200, #      utc_end 1983-03-30 21:00:00 (Wed)
  62537958000, #  local_start 1982-09-30 23:00:00 (Thu)
  62553600000, #    local_end 1983-03-31 00:00:00 (Thu)
  10800,
  0,
  '+03',
      ],
      [
  62553589200, #    utc_start 1983-03-30 21:00:00 (Wed)
  62569483200, #      utc_end 1983-09-30 20:00:00 (Fri)
  62553603600, #  local_start 1983-03-31 01:00:00 (Thu)
  62569497600, #    local_end 1983-10-01 00:00:00 (Sat)
  14400,
  1,
  '+04',
      ],
      [
  62569483200, #    utc_start 1983-09-30 20:00:00 (Fri)
  62585298000, #      utc_end 1984-03-31 21:00:00 (Sat)
  62569494000, #  local_start 1983-09-30 23:00:00 (Fri)
  62585308800, #    local_end 1984-04-01 00:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  62585298000, #    utc_start 1984-03-31 21:00:00 (Sat)
  62601105600, #      utc_end 1984-09-30 20:00:00 (Sun)
  62585312400, #  local_start 1984-04-01 01:00:00 (Sun)
  62601120000, #    local_end 1984-10-01 00:00:00 (Mon)
  14400,
  1,
  '+04',
      ],
      [
  62601105600, #    utc_start 1984-09-30 20:00:00 (Sun)
  62616834000, #      utc_end 1985-03-31 21:00:00 (Sun)
  62601116400, #  local_start 1984-09-30 23:00:00 (Sun)
  62616844800, #    local_end 1985-04-01 00:00:00 (Mon)
  10800,
  0,
  '+03',
      ],
      [
  62616834000, #    utc_start 1985-03-31 21:00:00 (Sun)
  62632476000, #      utc_end 1985-09-28 22:00:00 (Sat)
  62616848400, #  local_start 1985-04-01 01:00:00 (Mon)
  62632490400, #    local_end 1985-09-29 02:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  62632476000, #    utc_start 1985-09-28 22:00:00 (Sat)
  62648200800, #      utc_end 1986-03-29 22:00:00 (Sat)
  62632486800, #  local_start 1985-09-29 01:00:00 (Sun)
  62648211600, #    local_end 1986-03-30 01:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  62648200800, #    utc_start 1986-03-29 22:00:00 (Sat)
  62663925600, #      utc_end 1986-09-27 22:00:00 (Sat)
  62648215200, #  local_start 1986-03-30 02:00:00 (Sun)
  62663940000, #    local_end 1986-09-28 02:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  62663925600, #    utc_start 1986-09-27 22:00:00 (Sat)
  62679650400, #      utc_end 1987-03-28 22:00:00 (Sat)
  62663936400, #  local_start 1986-09-28 01:00:00 (Sun)
  62679661200, #    local_end 1987-03-29 01:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  62679650400, #    utc_start 1987-03-28 22:00:00 (Sat)
  62695375200, #      utc_end 1987-09-26 22:00:00 (Sat)
  62679664800, #  local_start 1987-03-29 02:00:00 (Sun)
  62695389600, #    local_end 1987-09-27 02:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  62695375200, #    utc_start 1987-09-26 22:00:00 (Sat)
  62711100000, #      utc_end 1988-03-26 22:00:00 (Sat)
  62695386000, #  local_start 1987-09-27 01:00:00 (Sun)
  62711110800, #    local_end 1988-03-27 01:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  62711100000, #    utc_start 1988-03-26 22:00:00 (Sat)
  62726824800, #      utc_end 1988-09-24 22:00:00 (Sat)
  62711114400, #  local_start 1988-03-27 02:00:00 (Sun)
  62726839200, #    local_end 1988-09-25 02:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  62726824800, #    utc_start 1988-09-24 22:00:00 (Sat)
  62742549600, #      utc_end 1989-03-25 22:00:00 (Sat)
  62726835600, #  local_start 1988-09-25 01:00:00 (Sun)
  62742560400, #    local_end 1989-03-26 01:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  62742549600, #    utc_start 1989-03-25 22:00:00 (Sat)
  62758274400, #      utc_end 1989-09-23 22:00:00 (Sat)
  62742564000, #  local_start 1989-03-26 02:00:00 (Sun)
  62758288800, #    local_end 1989-09-24 02:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  62758274400, #    utc_start 1989-09-23 22:00:00 (Sat)
  62773999200, #      utc_end 1990-03-24 22:00:00 (Sat)
  62758285200, #  local_start 1989-09-24 01:00:00 (Sun)
  62774010000, #    local_end 1990-03-25 01:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  62773999200, #    utc_start 1990-03-24 22:00:00 (Sat)
  62790328800, #      utc_end 1990-09-29 22:00:00 (Sat)
  62774013600, #  local_start 1990-03-25 02:00:00 (Sun)
  62790343200, #    local_end 1990-09-30 02:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  62790328800, #    utc_start 1990-09-29 22:00:00 (Sat)
  62806147200, #      utc_end 1991-04-01 00:00:00 (Mon)
  62790339600, #  local_start 1990-09-30 01:00:00 (Sun)
  62806158000, #    local_end 1991-04-01 03:00:00 (Mon)
  10800,
  0,
  '+03',
      ],
      [
  62806147200, #    utc_start 1991-04-01 00:00:00 (Mon)
  62821958400, #      utc_end 1991-10-01 00:00:00 (Tue)
  62806161600, #  local_start 1991-04-01 04:00:00 (Mon)
  62821972800, #    local_end 1991-10-01 04:00:00 (Tue)
  14400,
  1,
  '+04',
      ],
      [
  62821958400, #    utc_start 1991-10-01 00:00:00 (Tue)
  62837769600, #      utc_end 1992-04-01 00:00:00 (Wed)
  62821969200, #  local_start 1991-10-01 03:00:00 (Tue)
  62837780400, #    local_end 1992-04-01 03:00:00 (Wed)
  10800,
  0,
  '+03',
      ],
      [
  62837769600, #    utc_start 1992-04-01 00:00:00 (Wed)
  62853580800, #      utc_end 1992-10-01 00:00:00 (Thu)
  62837784000, #  local_start 1992-04-01 04:00:00 (Wed)
  62853595200, #    local_end 1992-10-01 04:00:00 (Thu)
  14400,
  1,
  '+04',
      ],
      [
  62853580800, #    utc_start 1992-10-01 00:00:00 (Thu)
  62869305600, #      utc_end 1993-04-01 00:00:00 (Thu)
  62853591600, #  local_start 1992-10-01 03:00:00 (Thu)
  62869316400, #    local_end 1993-04-01 03:00:00 (Thu)
  10800,
  0,
  '+03',
      ],
      [
  62869305600, #    utc_start 1993-04-01 00:00:00 (Thu)
  62885116800, #      utc_end 1993-10-01 00:00:00 (Fri)
  62869320000, #  local_start 1993-04-01 04:00:00 (Thu)
  62885131200, #    local_end 1993-10-01 04:00:00 (Fri)
  14400,
  1,
  '+04',
      ],
      [
  62885116800, #    utc_start 1993-10-01 00:00:00 (Fri)
  62900841600, #      utc_end 1994-04-01 00:00:00 (Fri)
  62885127600, #  local_start 1993-10-01 03:00:00 (Fri)
  62900852400, #    local_end 1994-04-01 03:00:00 (Fri)
  10800,
  0,
  '+03',
      ],
      [
  62900841600, #    utc_start 1994-04-01 00:00:00 (Fri)
  62916652800, #      utc_end 1994-10-01 00:00:00 (Sat)
  62900856000, #  local_start 1994-04-01 04:00:00 (Fri)
  62916667200, #    local_end 1994-10-01 04:00:00 (Sat)
  14400,
  1,
  '+04',
      ],
      [
  62916652800, #    utc_start 1994-10-01 00:00:00 (Sat)
  62932377600, #      utc_end 1995-04-01 00:00:00 (Sat)
  62916663600, #  local_start 1994-10-01 03:00:00 (Sat)
  62932388400, #    local_end 1995-04-01 03:00:00 (Sat)
  10800,
  0,
  '+03',
      ],
      [
  62932377600, #    utc_start 1995-04-01 00:00:00 (Sat)
  62948188800, #      utc_end 1995-10-01 00:00:00 (Sun)
  62932392000, #  local_start 1995-04-01 04:00:00 (Sat)
  62948203200, #    local_end 1995-10-01 04:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  62948188800, #    utc_start 1995-10-01 00:00:00 (Sun)
  62964000000, #      utc_end 1996-04-01 00:00:00 (Mon)
  62948199600, #  local_start 1995-10-01 03:00:00 (Sun)
  62964010800, #    local_end 1996-04-01 03:00:00 (Mon)
  10800,
  0,
  '+03',
      ],
      [
  62964000000, #    utc_start 1996-04-01 00:00:00 (Mon)
  62979811200, #      utc_end 1996-10-01 00:00:00 (Tue)
  62964014400, #  local_start 1996-04-01 04:00:00 (Mon)
  62979825600, #    local_end 1996-10-01 04:00:00 (Tue)
  14400,
  1,
  '+04',
      ],
      [
  62979811200, #    utc_start 1996-10-01 00:00:00 (Tue)
  62995536000, #      utc_end 1997-04-01 00:00:00 (Tue)
  62979822000, #  local_start 1996-10-01 03:00:00 (Tue)
  62995546800, #    local_end 1997-04-01 03:00:00 (Tue)
  10800,
  0,
  '+03',
      ],
      [
  62995536000, #    utc_start 1997-04-01 00:00:00 (Tue)
  63011347200, #      utc_end 1997-10-01 00:00:00 (Wed)
  62995550400, #  local_start 1997-04-01 04:00:00 (Tue)
  63011361600, #    local_end 1997-10-01 04:00:00 (Wed)
  14400,
  1,
  '+04',
      ],
      [
  63011347200, #    utc_start 1997-10-01 00:00:00 (Wed)
  63027072000, #      utc_end 1998-04-01 00:00:00 (Wed)
  63011358000, #  local_start 1997-10-01 03:00:00 (Wed)
  63027082800, #    local_end 1998-04-01 03:00:00 (Wed)
  10800,
  0,
  '+03',
      ],
      [
  63027072000, #    utc_start 1998-04-01 00:00:00 (Wed)
  63042883200, #      utc_end 1998-10-01 00:00:00 (Thu)
  63027086400, #  local_start 1998-04-01 04:00:00 (Wed)
  63042897600, #    local_end 1998-10-01 04:00:00 (Thu)
  14400,
  1,
  '+04',
      ],
      [
  63042883200, #    utc_start 1998-10-01 00:00:00 (Thu)
  63058608000, #      utc_end 1999-04-01 00:00:00 (Thu)
  63042894000, #  local_start 1998-10-01 03:00:00 (Thu)
  63058618800, #    local_end 1999-04-01 03:00:00 (Thu)
  10800,
  0,
  '+03',
      ],
      [
  63058608000, #    utc_start 1999-04-01 00:00:00 (Thu)
  63074419200, #      utc_end 1999-10-01 00:00:00 (Fri)
  63058622400, #  local_start 1999-04-01 04:00:00 (Thu)
  63074433600, #    local_end 1999-10-01 04:00:00 (Fri)
  14400,
  1,
  '+04',
      ],
      [
  63074419200, #    utc_start 1999-10-01 00:00:00 (Fri)
  63090230400, #      utc_end 2000-04-01 00:00:00 (Sat)
  63074430000, #  local_start 1999-10-01 03:00:00 (Fri)
  63090241200, #    local_end 2000-04-01 03:00:00 (Sat)
  10800,
  0,
  '+03',
      ],
      [
  63090230400, #    utc_start 2000-04-01 00:00:00 (Sat)
  63106041600, #      utc_end 2000-10-01 00:00:00 (Sun)
  63090244800, #  local_start 2000-04-01 04:00:00 (Sat)
  63106056000, #    local_end 2000-10-01 04:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63106041600, #    utc_start 2000-10-01 00:00:00 (Sun)
  63121766400, #      utc_end 2001-04-01 00:00:00 (Sun)
  63106052400, #  local_start 2000-10-01 03:00:00 (Sun)
  63121777200, #    local_end 2001-04-01 03:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63121766400, #    utc_start 2001-04-01 00:00:00 (Sun)
  63137577600, #      utc_end 2001-10-01 00:00:00 (Mon)
  63121780800, #  local_start 2001-04-01 04:00:00 (Sun)
  63137592000, #    local_end 2001-10-01 04:00:00 (Mon)
  14400,
  1,
  '+04',
      ],
      [
  63137577600, #    utc_start 2001-10-01 00:00:00 (Mon)
  63153302400, #      utc_end 2002-04-01 00:00:00 (Mon)
  63137588400, #  local_start 2001-10-01 03:00:00 (Mon)
  63153313200, #    local_end 2002-04-01 03:00:00 (Mon)
  10800,
  0,
  '+03',
      ],
      [
  63153302400, #    utc_start 2002-04-01 00:00:00 (Mon)
  63169113600, #      utc_end 2002-10-01 00:00:00 (Tue)
  63153316800, #  local_start 2002-04-01 04:00:00 (Mon)
  63169128000, #    local_end 2002-10-01 04:00:00 (Tue)
  14400,
  1,
  '+04',
      ],
      [
  63169113600, #    utc_start 2002-10-01 00:00:00 (Tue)
  63184838400, #      utc_end 2003-04-01 00:00:00 (Tue)
  63169124400, #  local_start 2002-10-01 03:00:00 (Tue)
  63184849200, #    local_end 2003-04-01 03:00:00 (Tue)
  10800,
  0,
  '+03',
      ],
      [
  63184838400, #    utc_start 2003-04-01 00:00:00 (Tue)
  63200649600, #      utc_end 2003-10-01 00:00:00 (Wed)
  63184852800, #  local_start 2003-04-01 04:00:00 (Tue)
  63200664000, #    local_end 2003-10-01 04:00:00 (Wed)
  14400,
  1,
  '+04',
      ],
      [
  63200649600, #    utc_start 2003-10-01 00:00:00 (Wed)
  63216460800, #      utc_end 2004-04-01 00:00:00 (Thu)
  63200660400, #  local_start 2003-10-01 03:00:00 (Wed)
  63216471600, #    local_end 2004-04-01 03:00:00 (Thu)
  10800,
  0,
  '+03',
      ],
      [
  63216460800, #    utc_start 2004-04-01 00:00:00 (Thu)
  63232272000, #      utc_end 2004-10-01 00:00:00 (Fri)
  63216475200, #  local_start 2004-04-01 04:00:00 (Thu)
  63232286400, #    local_end 2004-10-01 04:00:00 (Fri)
  14400,
  1,
  '+04',
      ],
      [
  63232272000, #    utc_start 2004-10-01 00:00:00 (Fri)
  63247996800, #      utc_end 2005-04-01 00:00:00 (Fri)
  63232282800, #  local_start 2004-10-01 03:00:00 (Fri)
  63248007600, #    local_end 2005-04-01 03:00:00 (Fri)
  10800,
  0,
  '+03',
      ],
      [
  63247996800, #    utc_start 2005-04-01 00:00:00 (Fri)
  63263808000, #      utc_end 2005-10-01 00:00:00 (Sat)
  63248011200, #  local_start 2005-04-01 04:00:00 (Fri)
  63263822400, #    local_end 2005-10-01 04:00:00 (Sat)
  14400,
  1,
  '+04',
      ],
      [
  63263808000, #    utc_start 2005-10-01 00:00:00 (Sat)
  63279532800, #      utc_end 2006-04-01 00:00:00 (Sat)
  63263818800, #  local_start 2005-10-01 03:00:00 (Sat)
  63279543600, #    local_end 2006-04-01 03:00:00 (Sat)
  10800,
  0,
  '+03',
      ],
      [
  63279532800, #    utc_start 2006-04-01 00:00:00 (Sat)
  63295344000, #      utc_end 2006-10-01 00:00:00 (Sun)
  63279547200, #  local_start 2006-04-01 04:00:00 (Sat)
  63295358400, #    local_end 2006-10-01 04:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63295344000, #    utc_start 2006-10-01 00:00:00 (Sun)
  63311068800, #      utc_end 2007-04-01 00:00:00 (Sun)
  63295354800, #  local_start 2006-10-01 03:00:00 (Sun)
  63311079600, #    local_end 2007-04-01 03:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63311068800, #    utc_start 2007-04-01 00:00:00 (Sun)
  63326880000, #      utc_end 2007-10-01 00:00:00 (Mon)
  63311083200, #  local_start 2007-04-01 04:00:00 (Sun)
  63326894400, #    local_end 2007-10-01 04:00:00 (Mon)
  14400,
  1,
  '+04',
      ],
      [
  63326880000, #    utc_start 2007-10-01 00:00:00 (Mon)
  DateTime::TimeZone::INFINITY, #      utc_end
  63326890800, #  local_start 2007-10-01 03:00:00 (Mon)
  DateTime::TimeZone::INFINITY, #    local_end
  10800,
  0,
  '+03',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {26}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_BAGHDAD

    $main::fatpacked{"DateTime/TimeZone/Asia/Baku.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_BAKU';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/asia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Baku;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Baku::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60694519236, #      utc_end 1924-05-01 20:40:36 (Thu)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60694531200, #    local_end 1924-05-02 00:00:00 (Fri)
  11964,
  0,
  'LMT',
      ],
      [
  60694519236, #    utc_start 1924-05-01 20:40:36 (Thu)
  61730542800, #      utc_end 1957-02-28 21:00:00 (Thu)
  60694530036, #  local_start 1924-05-01 23:40:36 (Thu)
  61730553600, #    local_end 1957-03-01 00:00:00 (Fri)
  10800,
  0,
  '+03',
      ],
      [
  61730542800, #    utc_start 1957-02-28 21:00:00 (Thu)
  62490600000, #      utc_end 1981-03-31 20:00:00 (Tue)
  61730557200, #  local_start 1957-03-01 01:00:00 (Fri)
  62490614400, #    local_end 1981-04-01 00:00:00 (Wed)
  14400,
  0,
  '+04',
      ],
      [
  62490600000, #    utc_start 1981-03-31 20:00:00 (Tue)
  62506407600, #      utc_end 1981-09-30 19:00:00 (Wed)
  62490618000, #  local_start 1981-04-01 01:00:00 (Wed)
  62506425600, #    local_end 1981-10-01 00:00:00 (Thu)
  18000,
  1,
  '+05',
      ],
      [
  62506407600, #    utc_start 1981-09-30 19:00:00 (Wed)
  62522136000, #      utc_end 1982-03-31 20:00:00 (Wed)
  62506422000, #  local_start 1981-09-30 23:00:00 (Wed)
  62522150400, #    local_end 1982-04-01 00:00:00 (Thu)
  14400,
  0,
  '+04',
      ],
      [
  62522136000, #    utc_start 1982-03-31 20:00:00 (Wed)
  62537943600, #      utc_end 1982-09-30 19:00:00 (Thu)
  62522154000, #  local_start 1982-04-01 01:00:00 (Thu)
  62537961600, #    local_end 1982-10-01 00:00:00 (Fri)
  18000,
  1,
  '+05',
      ],
      [
  62537943600, #    utc_start 1982-09-30 19:00:00 (Thu)
  62553672000, #      utc_end 1983-03-31 20:00:00 (Thu)
  62537958000, #  local_start 1982-09-30 23:00:00 (Thu)
  62553686400, #    local_end 1983-04-01 00:00:00 (Fri)
  14400,
  0,
  '+04',
      ],
      [
  62553672000, #    utc_start 1983-03-31 20:00:00 (Thu)
  62569479600, #      utc_end 1983-09-30 19:00:00 (Fri)
  62553690000, #  local_start 1983-04-01 01:00:00 (Fri)
  62569497600, #    local_end 1983-10-01 00:00:00 (Sat)
  18000,
  1,
  '+05',
      ],
      [
  62569479600, #    utc_start 1983-09-30 19:00:00 (Fri)
  62585294400, #      utc_end 1984-03-31 20:00:00 (Sat)
  62569494000, #  local_start 1983-09-30 23:00:00 (Fri)
  62585308800, #    local_end 1984-04-01 00:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62585294400, #    utc_start 1984-03-31 20:00:00 (Sat)
  62601026400, #      utc_end 1984-09-29 22:00:00 (Sat)
  62585312400, #  local_start 1984-04-01 01:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62601026400, #    utc_start 1984-09-29 22:00:00 (Sat)
  62616751200, #      utc_end 1985-03-30 22:00:00 (Sat)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62616751200, #    utc_start 1985-03-30 22:00:00 (Sat)
  62632476000, #      utc_end 1985-09-28 22:00:00 (Sat)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62632476000, #    utc_start 1985-09-28 22:00:00 (Sat)
  62648200800, #      utc_end 1986-03-29 22:00:00 (Sat)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62648200800, #    utc_start 1986-03-29 22:00:00 (Sat)
  62663925600, #      utc_end 1986-09-27 22:00:00 (Sat)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62663925600, #    utc_start 1986-09-27 22:00:00 (Sat)
  62679650400, #      utc_end 1987-03-28 22:00:00 (Sat)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62679650400, #    utc_start 1987-03-28 22:00:00 (Sat)
  62695375200, #      utc_end 1987-09-26 22:00:00 (Sat)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62695375200, #    utc_start 1987-09-26 22:00:00 (Sat)
  62711100000, #      utc_end 1988-03-26 22:00:00 (Sat)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62711100000, #    utc_start 1988-03-26 22:00:00 (Sat)
  62726824800, #      utc_end 1988-09-24 22:00:00 (Sat)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62726824800, #    utc_start 1988-09-24 22:00:00 (Sat)
  62742549600, #      utc_end 1989-03-25 22:00:00 (Sat)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62742549600, #    utc_start 1989-03-25 22:00:00 (Sat)
  62758274400, #      utc_end 1989-09-23 22:00:00 (Sat)
  62742567600, #  local_start 1989-03-26 03:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62758274400, #    utc_start 1989-09-23 22:00:00 (Sat)
  62773999200, #      utc_end 1990-03-24 22:00:00 (Sat)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62773999200, #    utc_start 1990-03-24 22:00:00 (Sat)
  62790328800, #      utc_end 1990-09-29 22:00:00 (Sat)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62790328800, #    utc_start 1990-09-29 22:00:00 (Sat)
  62806053600, #      utc_end 1991-03-30 22:00:00 (Sat)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62806053600, #    utc_start 1991-03-30 22:00:00 (Sat)
  62821782000, #      utc_end 1991-09-28 23:00:00 (Sat)
  62806068000, #  local_start 1991-03-31 02:00:00 (Sun)
  62821796400, #    local_end 1991-09-29 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  62821782000, #    utc_start 1991-09-28 23:00:00 (Sat)
  62837506800, #      utc_end 1992-03-28 23:00:00 (Sat)
  62821792800, #  local_start 1991-09-29 02:00:00 (Sun)
  62837517600, #    local_end 1992-03-29 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  62837506800, #    utc_start 1992-03-28 23:00:00 (Sat)
  62853231600, #      utc_end 1992-09-26 23:00:00 (Sat)
  62837521200, #  local_start 1992-03-29 03:00:00 (Sun)
  62853246000, #    local_end 1992-09-27 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  62853231600, #    utc_start 1992-09-26 23:00:00 (Sat)
  62956123200, #      utc_end 1995-12-31 20:00:00 (Sun)
  62853246000, #  local_start 1992-09-27 03:00:00 (Sun)
  62956137600, #    local_end 1996-01-01 00:00:00 (Mon)
  14400,
  0,
  '+04',
      ],
      [
  62956123200, #    utc_start 1995-12-31 20:00:00 (Sun)
  62963917200, #      utc_end 1996-03-31 01:00:00 (Sun)
  62956137600, #  local_start 1996-01-01 00:00:00 (Mon)
  62963931600, #    local_end 1996-03-31 05:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62963917200, #    utc_start 1996-03-31 01:00:00 (Sun)
  62982061200, #      utc_end 1996-10-27 01:00:00 (Sun)
  62963935200, #  local_start 1996-03-31 06:00:00 (Sun)
  62982079200, #    local_end 1996-10-27 06:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62982061200, #    utc_start 1996-10-27 01:00:00 (Sun)
  62987745600, #      utc_end 1996-12-31 20:00:00 (Tue)
  62982075600, #  local_start 1996-10-27 05:00:00 (Sun)
  62987760000, #    local_end 1997-01-01 00:00:00 (Wed)
  14400,
  0,
  '+04',
      ],
      [
  62987745600, #    utc_start 1996-12-31 20:00:00 (Tue)
  62995363200, #      utc_end 1997-03-30 00:00:00 (Sun)
  62987760000, #  local_start 1997-01-01 00:00:00 (Wed)
  62995377600, #    local_end 1997-03-30 04:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62995363200, #    utc_start 1997-03-30 00:00:00 (Sun)
  63013507200, #      utc_end 1997-10-26 00:00:00 (Sun)
  62995381200, #  local_start 1997-03-30 05:00:00 (Sun)
  63013525200, #    local_end 1997-10-26 05:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63013507200, #    utc_start 1997-10-26 00:00:00 (Sun)
  63026812800, #      utc_end 1998-03-29 00:00:00 (Sun)
  63013521600, #  local_start 1997-10-26 04:00:00 (Sun)
  63026827200, #    local_end 1998-03-29 04:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63026812800, #    utc_start 1998-03-29 00:00:00 (Sun)
  63044956800, #      utc_end 1998-10-25 00:00:00 (Sun)
  63026830800, #  local_start 1998-03-29 05:00:00 (Sun)
  63044974800, #    local_end 1998-10-25 05:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63044956800, #    utc_start 1998-10-25 00:00:00 (Sun)
  63058262400, #      utc_end 1999-03-28 00:00:00 (Sun)
  63044971200, #  local_start 1998-10-25 04:00:00 (Sun)
  63058276800, #    local_end 1999-03-28 04:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63058262400, #    utc_start 1999-03-28 00:00:00 (Sun)
  63077011200, #      utc_end 1999-10-31 00:00:00 (Sun)
  63058280400, #  local_start 1999-03-28 05:00:00 (Sun)
  63077029200, #    local_end 1999-10-31 05:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63077011200, #    utc_start 1999-10-31 00:00:00 (Sun)
  63089712000, #      utc_end 2000-03-26 00:00:00 (Sun)
  63077025600, #  local_start 1999-10-31 04:00:00 (Sun)
  63089726400, #    local_end 2000-03-26 04:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63089712000, #    utc_start 2000-03-26 00:00:00 (Sun)
  63108460800, #      utc_end 2000-10-29 00:00:00 (Sun)
  63089730000, #  local_start 2000-03-26 05:00:00 (Sun)
  63108478800, #    local_end 2000-10-29 05:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63108460800, #    utc_start 2000-10-29 00:00:00 (Sun)
  63121161600, #      utc_end 2001-03-25 00:00:00 (Sun)
  63108475200, #  local_start 2000-10-29 04:00:00 (Sun)
  63121176000, #    local_end 2001-03-25 04:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63121161600, #    utc_start 2001-03-25 00:00:00 (Sun)
  63139910400, #      utc_end 2001-10-28 00:00:00 (Sun)
  63121179600, #  local_start 2001-03-25 05:00:00 (Sun)
  63139928400, #    local_end 2001-10-28 05:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63139910400, #    utc_start 2001-10-28 00:00:00 (Sun)
  63153216000, #      utc_end 2002-03-31 00:00:00 (Sun)
  63139924800, #  local_start 2001-10-28 04:00:00 (Sun)
  63153230400, #    local_end 2002-03-31 04:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63153216000, #    utc_start 2002-03-31 00:00:00 (Sun)
  63171360000, #      utc_end 2002-10-27 00:00:00 (Sun)
  63153234000, #  local_start 2002-03-31 05:00:00 (Sun)
  63171378000, #    local_end 2002-10-27 05:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63171360000, #    utc_start 2002-10-27 00:00:00 (Sun)
  63184665600, #      utc_end 2003-03-30 00:00:00 (Sun)
  63171374400, #  local_start 2002-10-27 04:00:00 (Sun)
  63184680000, #    local_end 2003-03-30 04:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63184665600, #    utc_start 2003-03-30 00:00:00 (Sun)
  63202809600, #      utc_end 2003-10-26 00:00:00 (Sun)
  63184683600, #  local_start 2003-03-30 05:00:00 (Sun)
  63202827600, #    local_end 2003-10-26 05:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63202809600, #    utc_start 2003-10-26 00:00:00 (Sun)
  63216115200, #      utc_end 2004-03-28 00:00:00 (Sun)
  63202824000, #  local_start 2003-10-26 04:00:00 (Sun)
  63216129600, #    local_end 2004-03-28 04:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63216115200, #    utc_start 2004-03-28 00:00:00 (Sun)
  63234864000, #      utc_end 2004-10-31 00:00:00 (Sun)
  63216133200, #  local_start 2004-03-28 05:00:00 (Sun)
  63234882000, #    local_end 2004-10-31 05:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63234864000, #    utc_start 2004-10-31 00:00:00 (Sun)
  63247564800, #      utc_end 2005-03-27 00:00:00 (Sun)
  63234878400, #  local_start 2004-10-31 04:00:00 (Sun)
  63247579200, #    local_end 2005-03-27 04:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63247564800, #    utc_start 2005-03-27 00:00:00 (Sun)
  63266313600, #      utc_end 2005-10-30 00:00:00 (Sun)
  63247582800, #  local_start 2005-03-27 05:00:00 (Sun)
  63266331600, #    local_end 2005-10-30 05:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63266313600, #    utc_start 2005-10-30 00:00:00 (Sun)
  63279014400, #      utc_end 2006-03-26 00:00:00 (Sun)
  63266328000, #  local_start 2005-10-30 04:00:00 (Sun)
  63279028800, #    local_end 2006-03-26 04:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63279014400, #    utc_start 2006-03-26 00:00:00 (Sun)
  63297763200, #      utc_end 2006-10-29 00:00:00 (Sun)
  63279032400, #  local_start 2006-03-26 05:00:00 (Sun)
  63297781200, #    local_end 2006-10-29 05:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63297763200, #    utc_start 2006-10-29 00:00:00 (Sun)
  63310464000, #      utc_end 2007-03-25 00:00:00 (Sun)
  63297777600, #  local_start 2006-10-29 04:00:00 (Sun)
  63310478400, #    local_end 2007-03-25 04:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63310464000, #    utc_start 2007-03-25 00:00:00 (Sun)
  63329212800, #      utc_end 2007-10-28 00:00:00 (Sun)
  63310482000, #  local_start 2007-03-25 05:00:00 (Sun)
  63329230800, #    local_end 2007-10-28 05:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63329212800, #    utc_start 2007-10-28 00:00:00 (Sun)
  63342518400, #      utc_end 2008-03-30 00:00:00 (Sun)
  63329227200, #  local_start 2007-10-28 04:00:00 (Sun)
  63342532800, #    local_end 2008-03-30 04:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63342518400, #    utc_start 2008-03-30 00:00:00 (Sun)
  63360662400, #      utc_end 2008-10-26 00:00:00 (Sun)
  63342536400, #  local_start 2008-03-30 05:00:00 (Sun)
  63360680400, #    local_end 2008-10-26 05:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63360662400, #    utc_start 2008-10-26 00:00:00 (Sun)
  63373968000, #      utc_end 2009-03-29 00:00:00 (Sun)
  63360676800, #  local_start 2008-10-26 04:00:00 (Sun)
  63373982400, #    local_end 2009-03-29 04:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63373968000, #    utc_start 2009-03-29 00:00:00 (Sun)
  63392112000, #      utc_end 2009-10-25 00:00:00 (Sun)
  63373986000, #  local_start 2009-03-29 05:00:00 (Sun)
  63392130000, #    local_end 2009-10-25 05:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63392112000, #    utc_start 2009-10-25 00:00:00 (Sun)
  63405417600, #      utc_end 2010-03-28 00:00:00 (Sun)
  63392126400, #  local_start 2009-10-25 04:00:00 (Sun)
  63405432000, #    local_end 2010-03-28 04:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63405417600, #    utc_start 2010-03-28 00:00:00 (Sun)
  63424166400, #      utc_end 2010-10-31 00:00:00 (Sun)
  63405435600, #  local_start 2010-03-28 05:00:00 (Sun)
  63424184400, #    local_end 2010-10-31 05:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63424166400, #    utc_start 2010-10-31 00:00:00 (Sun)
  63436867200, #      utc_end 2011-03-27 00:00:00 (Sun)
  63424180800, #  local_start 2010-10-31 04:00:00 (Sun)
  63436881600, #    local_end 2011-03-27 04:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63436867200, #    utc_start 2011-03-27 00:00:00 (Sun)
  63455616000, #      utc_end 2011-10-30 00:00:00 (Sun)
  63436885200, #  local_start 2011-03-27 05:00:00 (Sun)
  63455634000, #    local_end 2011-10-30 05:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63455616000, #    utc_start 2011-10-30 00:00:00 (Sun)
  63468316800, #      utc_end 2012-03-25 00:00:00 (Sun)
  63455630400, #  local_start 2011-10-30 04:00:00 (Sun)
  63468331200, #    local_end 2012-03-25 04:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63468316800, #    utc_start 2012-03-25 00:00:00 (Sun)
  63487065600, #      utc_end 2012-10-28 00:00:00 (Sun)
  63468334800, #  local_start 2012-03-25 05:00:00 (Sun)
  63487083600, #    local_end 2012-10-28 05:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63487065600, #    utc_start 2012-10-28 00:00:00 (Sun)
  63500371200, #      utc_end 2013-03-31 00:00:00 (Sun)
  63487080000, #  local_start 2012-10-28 04:00:00 (Sun)
  63500385600, #    local_end 2013-03-31 04:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63500371200, #    utc_start 2013-03-31 00:00:00 (Sun)
  63518515200, #      utc_end 2013-10-27 00:00:00 (Sun)
  63500389200, #  local_start 2013-03-31 05:00:00 (Sun)
  63518533200, #    local_end 2013-10-27 05:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63518515200, #    utc_start 2013-10-27 00:00:00 (Sun)
  63531820800, #      utc_end 2014-03-30 00:00:00 (Sun)
  63518529600, #  local_start 2013-10-27 04:00:00 (Sun)
  63531835200, #    local_end 2014-03-30 04:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63531820800, #    utc_start 2014-03-30 00:00:00 (Sun)
  63549964800, #      utc_end 2014-10-26 00:00:00 (Sun)
  63531838800, #  local_start 2014-03-30 05:00:00 (Sun)
  63549982800, #    local_end 2014-10-26 05:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63549964800, #    utc_start 2014-10-26 00:00:00 (Sun)
  63563270400, #      utc_end 2015-03-29 00:00:00 (Sun)
  63549979200, #  local_start 2014-10-26 04:00:00 (Sun)
  63563284800, #    local_end 2015-03-29 04:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63563270400, #    utc_start 2015-03-29 00:00:00 (Sun)
  63581414400, #      utc_end 2015-10-25 00:00:00 (Sun)
  63563288400, #  local_start 2015-03-29 05:00:00 (Sun)
  63581432400, #    local_end 2015-10-25 05:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63581414400, #    utc_start 2015-10-25 00:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #      utc_end
  63581428800, #  local_start 2015-10-25 04:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  14400,
  0,
  '+04',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {32}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_BAKU

    $main::fatpacked{"DateTime/TimeZone/Asia/Bangkok.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_BANGKOK';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/asia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Bangkok;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Bangkok::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59295518276, #      utc_end 1879-12-31 17:17:56 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59295542400, #    local_end 1880-01-01 00:00:00 (Thu)
  24124,
  0,
  'LMT',
      ],
      [
  59295518276, #    utc_start 1879-12-31 17:17:56 (Wed)
  60565598276, #      utc_end 1920-03-31 17:17:56 (Wed)
  59295542400, #  local_start 1880-01-01 00:00:00 (Thu)
  60565622400, #    local_end 1920-04-01 00:00:00 (Thu)
  24124,
  0,
  'BMT',
      ],
      [
  60565598276, #    utc_start 1920-03-31 17:17:56 (Wed)
  DateTime::TimeZone::INFINITY, #      utc_end
  60565623476, #  local_start 1920-04-01 00:17:56 (Thu)
  DateTime::TimeZone::INFINITY, #    local_end
  25200,
  0,
  '+07',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_BANGKOK

    $main::fatpacked{"DateTime/TimeZone/Asia/Barnaul.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_BARNAUL';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Barnaul;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Barnaul::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60555839100, #      utc_end 1919-12-09 18:25:00 (Tue)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60555859200, #    local_end 1919-12-10 00:00:00 (Wed)
  20100,
  0,
  'LMT',
      ],
      [
  60555839100, #    utc_start 1919-12-09 18:25:00 (Tue)
  60888132000, #      utc_end 1930-06-20 18:00:00 (Fri)
  60555860700, #  local_start 1919-12-10 00:25:00 (Wed)
  60888153600, #    local_end 1930-06-21 00:00:00 (Sat)
  21600,
  0,
  '+06',
      ],
      [
  60888132000, #    utc_start 1930-06-20 18:00:00 (Fri)
  62490589200, #      utc_end 1981-03-31 17:00:00 (Tue)
  60888157200, #  local_start 1930-06-21 01:00:00 (Sat)
  62490614400, #    local_end 1981-04-01 00:00:00 (Wed)
  25200,
  0,
  '+07',
      ],
      [
  62490589200, #    utc_start 1981-03-31 17:00:00 (Tue)
  62506396800, #      utc_end 1981-09-30 16:00:00 (Wed)
  62490618000, #  local_start 1981-04-01 01:00:00 (Wed)
  62506425600, #    local_end 1981-10-01 00:00:00 (Thu)
  28800,
  1,
  '+08',
      ],
      [
  62506396800, #    utc_start 1981-09-30 16:00:00 (Wed)
  62522125200, #      utc_end 1982-03-31 17:00:00 (Wed)
  62506422000, #  local_start 1981-09-30 23:00:00 (Wed)
  62522150400, #    local_end 1982-04-01 00:00:00 (Thu)
  25200,
  0,
  '+07',
      ],
      [
  62522125200, #    utc_start 1982-03-31 17:00:00 (Wed)
  62537932800, #      utc_end 1982-09-30 16:00:00 (Thu)
  62522154000, #  local_start 1982-04-01 01:00:00 (Thu)
  62537961600, #    local_end 1982-10-01 00:00:00 (Fri)
  28800,
  1,
  '+08',
      ],
      [
  62537932800, #    utc_start 1982-09-30 16:00:00 (Thu)
  62553661200, #      utc_end 1983-03-31 17:00:00 (Thu)
  62537958000, #  local_start 1982-09-30 23:00:00 (Thu)
  62553686400, #    local_end 1983-04-01 00:00:00 (Fri)
  25200,
  0,
  '+07',
      ],
      [
  62553661200, #    utc_start 1983-03-31 17:00:00 (Thu)
  62569468800, #      utc_end 1983-09-30 16:00:00 (Fri)
  62553690000, #  local_start 1983-04-01 01:00:00 (Fri)
  62569497600, #    local_end 1983-10-01 00:00:00 (Sat)
  28800,
  1,
  '+08',
      ],
      [
  62569468800, #    utc_start 1983-09-30 16:00:00 (Fri)
  62585283600, #      utc_end 1984-03-31 17:00:00 (Sat)
  62569494000, #  local_start 1983-09-30 23:00:00 (Fri)
  62585308800, #    local_end 1984-04-01 00:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62585283600, #    utc_start 1984-03-31 17:00:00 (Sat)
  62601015600, #      utc_end 1984-09-29 19:00:00 (Sat)
  62585312400, #  local_start 1984-04-01 01:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62601015600, #    utc_start 1984-09-29 19:00:00 (Sat)
  62616740400, #      utc_end 1985-03-30 19:00:00 (Sat)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62616740400, #    utc_start 1985-03-30 19:00:00 (Sat)
  62632465200, #      utc_end 1985-09-28 19:00:00 (Sat)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62632465200, #    utc_start 1985-09-28 19:00:00 (Sat)
  62648190000, #      utc_end 1986-03-29 19:00:00 (Sat)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62648190000, #    utc_start 1986-03-29 19:00:00 (Sat)
  62663914800, #      utc_end 1986-09-27 19:00:00 (Sat)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62663914800, #    utc_start 1986-09-27 19:00:00 (Sat)
  62679639600, #      utc_end 1987-03-28 19:00:00 (Sat)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62679639600, #    utc_start 1987-03-28 19:00:00 (Sat)
  62695364400, #      utc_end 1987-09-26 19:00:00 (Sat)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62695364400, #    utc_start 1987-09-26 19:00:00 (Sat)
  62711089200, #      utc_end 1988-03-26 19:00:00 (Sat)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62711089200, #    utc_start 1988-03-26 19:00:00 (Sat)
  62726814000, #      utc_end 1988-09-24 19:00:00 (Sat)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62726814000, #    utc_start 1988-09-24 19:00:00 (Sat)
  62742538800, #      utc_end 1989-03-25 19:00:00 (Sat)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62742538800, #    utc_start 1989-03-25 19:00:00 (Sat)
  62758263600, #      utc_end 1989-09-23 19:00:00 (Sat)
  62742567600, #  local_start 1989-03-26 03:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62758263600, #    utc_start 1989-09-23 19:00:00 (Sat)
  62773988400, #      utc_end 1990-03-24 19:00:00 (Sat)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62773988400, #    utc_start 1990-03-24 19:00:00 (Sat)
  62790318000, #      utc_end 1990-09-29 19:00:00 (Sat)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62790318000, #    utc_start 1990-09-29 19:00:00 (Sat)
  62806042800, #      utc_end 1991-03-30 19:00:00 (Sat)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62806042800, #    utc_start 1991-03-30 19:00:00 (Sat)
  62821771200, #      utc_end 1991-09-28 20:00:00 (Sat)
  62806068000, #  local_start 1991-03-31 02:00:00 (Sun)
  62821796400, #    local_end 1991-09-29 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  62821771200, #    utc_start 1991-09-28 20:00:00 (Sat)
  62831448000, #      utc_end 1992-01-18 20:00:00 (Sat)
  62821792800, #  local_start 1991-09-29 02:00:00 (Sun)
  62831469600, #    local_end 1992-01-19 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  62831448000, #    utc_start 1992-01-18 20:00:00 (Sat)
  62837492400, #      utc_end 1992-03-28 19:00:00 (Sat)
  62831473200, #  local_start 1992-01-19 03:00:00 (Sun)
  62837517600, #    local_end 1992-03-29 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62837492400, #    utc_start 1992-03-28 19:00:00 (Sat)
  62853217200, #      utc_end 1992-09-26 19:00:00 (Sat)
  62837521200, #  local_start 1992-03-29 03:00:00 (Sun)
  62853246000, #    local_end 1992-09-27 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62853217200, #    utc_start 1992-09-26 19:00:00 (Sat)
  62868942000, #      utc_end 1993-03-27 19:00:00 (Sat)
  62853242400, #  local_start 1992-09-27 02:00:00 (Sun)
  62868967200, #    local_end 1993-03-28 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62868942000, #    utc_start 1993-03-27 19:00:00 (Sat)
  62884666800, #      utc_end 1993-09-25 19:00:00 (Sat)
  62868970800, #  local_start 1993-03-28 03:00:00 (Sun)
  62884695600, #    local_end 1993-09-26 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62884666800, #    utc_start 1993-09-25 19:00:00 (Sat)
  62900391600, #      utc_end 1994-03-26 19:00:00 (Sat)
  62884692000, #  local_start 1993-09-26 02:00:00 (Sun)
  62900416800, #    local_end 1994-03-27 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62900391600, #    utc_start 1994-03-26 19:00:00 (Sat)
  62916116400, #      utc_end 1994-09-24 19:00:00 (Sat)
  62900420400, #  local_start 1994-03-27 03:00:00 (Sun)
  62916145200, #    local_end 1994-09-25 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62916116400, #    utc_start 1994-09-24 19:00:00 (Sat)
  62931841200, #      utc_end 1995-03-25 19:00:00 (Sat)
  62916141600, #  local_start 1994-09-25 02:00:00 (Sun)
  62931866400, #    local_end 1995-03-26 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62931841200, #    utc_start 1995-03-25 19:00:00 (Sat)
  62937273600, #      utc_end 1995-05-27 16:00:00 (Sat)
  62931870000, #  local_start 1995-03-26 03:00:00 (Sun)
  62937302400, #    local_end 1995-05-28 00:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62937273600, #    utc_start 1995-05-27 16:00:00 (Sat)
  62947569600, #      utc_end 1995-09-23 20:00:00 (Sat)
  62937298800, #  local_start 1995-05-27 23:00:00 (Sat)
  62947594800, #    local_end 1995-09-24 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  62947569600, #    utc_start 1995-09-23 20:00:00 (Sat)
  62963899200, #      utc_end 1996-03-30 20:00:00 (Sat)
  62947591200, #  local_start 1995-09-24 02:00:00 (Sun)
  62963920800, #    local_end 1996-03-31 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  62963899200, #    utc_start 1996-03-30 20:00:00 (Sat)
  62982043200, #      utc_end 1996-10-26 20:00:00 (Sat)
  62963924400, #  local_start 1996-03-31 03:00:00 (Sun)
  62982068400, #    local_end 1996-10-27 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  62982043200, #    utc_start 1996-10-26 20:00:00 (Sat)
  62995348800, #      utc_end 1997-03-29 20:00:00 (Sat)
  62982064800, #  local_start 1996-10-27 02:00:00 (Sun)
  62995370400, #    local_end 1997-03-30 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  62995348800, #    utc_start 1997-03-29 20:00:00 (Sat)
  63013492800, #      utc_end 1997-10-25 20:00:00 (Sat)
  62995374000, #  local_start 1997-03-30 03:00:00 (Sun)
  63013518000, #    local_end 1997-10-26 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  63013492800, #    utc_start 1997-10-25 20:00:00 (Sat)
  63026798400, #      utc_end 1998-03-28 20:00:00 (Sat)
  63013514400, #  local_start 1997-10-26 02:00:00 (Sun)
  63026820000, #    local_end 1998-03-29 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  63026798400, #    utc_start 1998-03-28 20:00:00 (Sat)
  63044942400, #      utc_end 1998-10-24 20:00:00 (Sat)
  63026823600, #  local_start 1998-03-29 03:00:00 (Sun)
  63044967600, #    local_end 1998-10-25 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  63044942400, #    utc_start 1998-10-24 20:00:00 (Sat)
  63058248000, #      utc_end 1999-03-27 20:00:00 (Sat)
  63044964000, #  local_start 1998-10-25 02:00:00 (Sun)
  63058269600, #    local_end 1999-03-28 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  63058248000, #    utc_start 1999-03-27 20:00:00 (Sat)
  63076996800, #      utc_end 1999-10-30 20:00:00 (Sat)
  63058273200, #  local_start 1999-03-28 03:00:00 (Sun)
  63077022000, #    local_end 1999-10-31 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  63076996800, #    utc_start 1999-10-30 20:00:00 (Sat)
  63089697600, #      utc_end 2000-03-25 20:00:00 (Sat)
  63077018400, #  local_start 1999-10-31 02:00:00 (Sun)
  63089719200, #    local_end 2000-03-26 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  63089697600, #    utc_start 2000-03-25 20:00:00 (Sat)
  63108446400, #      utc_end 2000-10-28 20:00:00 (Sat)
  63089722800, #  local_start 2000-03-26 03:00:00 (Sun)
  63108471600, #    local_end 2000-10-29 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  63108446400, #    utc_start 2000-10-28 20:00:00 (Sat)
  63121147200, #      utc_end 2001-03-24 20:00:00 (Sat)
  63108468000, #  local_start 2000-10-29 02:00:00 (Sun)
  63121168800, #    local_end 2001-03-25 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  63121147200, #    utc_start 2001-03-24 20:00:00 (Sat)
  63139896000, #      utc_end 2001-10-27 20:00:00 (Sat)
  63121172400, #  local_start 2001-03-25 03:00:00 (Sun)
  63139921200, #    local_end 2001-10-28 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  63139896000, #    utc_start 2001-10-27 20:00:00 (Sat)
  63153201600, #      utc_end 2002-03-30 20:00:00 (Sat)
  63139917600, #  local_start 2001-10-28 02:00:00 (Sun)
  63153223200, #    local_end 2002-03-31 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  63153201600, #    utc_start 2002-03-30 20:00:00 (Sat)
  63171345600, #      utc_end 2002-10-26 20:00:00 (Sat)
  63153226800, #  local_start 2002-03-31 03:00:00 (Sun)
  63171370800, #    local_end 2002-10-27 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  63171345600, #    utc_start 2002-10-26 20:00:00 (Sat)
  63184651200, #      utc_end 2003-03-29 20:00:00 (Sat)
  63171367200, #  local_start 2002-10-27 02:00:00 (Sun)
  63184672800, #    local_end 2003-03-30 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  63184651200, #    utc_start 2003-03-29 20:00:00 (Sat)
  63202795200, #      utc_end 2003-10-25 20:00:00 (Sat)
  63184676400, #  local_start 2003-03-30 03:00:00 (Sun)
  63202820400, #    local_end 2003-10-26 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  63202795200, #    utc_start 2003-10-25 20:00:00 (Sat)
  63216100800, #      utc_end 2004-03-27 20:00:00 (Sat)
  63202816800, #  local_start 2003-10-26 02:00:00 (Sun)
  63216122400, #    local_end 2004-03-28 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  63216100800, #    utc_start 2004-03-27 20:00:00 (Sat)
  63234849600, #      utc_end 2004-10-30 20:00:00 (Sat)
  63216126000, #  local_start 2004-03-28 03:00:00 (Sun)
  63234874800, #    local_end 2004-10-31 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  63234849600, #    utc_start 2004-10-30 20:00:00 (Sat)
  63247550400, #      utc_end 2005-03-26 20:00:00 (Sat)
  63234871200, #  local_start 2004-10-31 02:00:00 (Sun)
  63247572000, #    local_end 2005-03-27 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  63247550400, #    utc_start 2005-03-26 20:00:00 (Sat)
  63266299200, #      utc_end 2005-10-29 20:00:00 (Sat)
  63247575600, #  local_start 2005-03-27 03:00:00 (Sun)
  63266324400, #    local_end 2005-10-30 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  63266299200, #    utc_start 2005-10-29 20:00:00 (Sat)
  63279000000, #      utc_end 2006-03-25 20:00:00 (Sat)
  63266320800, #  local_start 2005-10-30 02:00:00 (Sun)
  63279021600, #    local_end 2006-03-26 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  63279000000, #    utc_start 2006-03-25 20:00:00 (Sat)
  63297748800, #      utc_end 2006-10-28 20:00:00 (Sat)
  63279025200, #  local_start 2006-03-26 03:00:00 (Sun)
  63297774000, #    local_end 2006-10-29 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  63297748800, #    utc_start 2006-10-28 20:00:00 (Sat)
  63310449600, #      utc_end 2007-03-24 20:00:00 (Sat)
  63297770400, #  local_start 2006-10-29 02:00:00 (Sun)
  63310471200, #    local_end 2007-03-25 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  63310449600, #    utc_start 2007-03-24 20:00:00 (Sat)
  63329198400, #      utc_end 2007-10-27 20:00:00 (Sat)
  63310474800, #  local_start 2007-03-25 03:00:00 (Sun)
  63329223600, #    local_end 2007-10-28 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  63329198400, #    utc_start 2007-10-27 20:00:00 (Sat)
  63342504000, #      utc_end 2008-03-29 20:00:00 (Sat)
  63329220000, #  local_start 2007-10-28 02:00:00 (Sun)
  63342525600, #    local_end 2008-03-30 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  63342504000, #    utc_start 2008-03-29 20:00:00 (Sat)
  63360648000, #      utc_end 2008-10-25 20:00:00 (Sat)
  63342529200, #  local_start 2008-03-30 03:00:00 (Sun)
  63360673200, #    local_end 2008-10-26 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  63360648000, #    utc_start 2008-10-25 20:00:00 (Sat)
  63373953600, #      utc_end 2009-03-28 20:00:00 (Sat)
  63360669600, #  local_start 2008-10-26 02:00:00 (Sun)
  63373975200, #    local_end 2009-03-29 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  63373953600, #    utc_start 2009-03-28 20:00:00 (Sat)
  63392097600, #      utc_end 2009-10-24 20:00:00 (Sat)
  63373978800, #  local_start 2009-03-29 03:00:00 (Sun)
  63392122800, #    local_end 2009-10-25 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  63392097600, #    utc_start 2009-10-24 20:00:00 (Sat)
  63405403200, #      utc_end 2010-03-27 20:00:00 (Sat)
  63392119200, #  local_start 2009-10-25 02:00:00 (Sun)
  63405424800, #    local_end 2010-03-28 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  63405403200, #    utc_start 2010-03-27 20:00:00 (Sat)
  63424152000, #      utc_end 2010-10-30 20:00:00 (Sat)
  63405428400, #  local_start 2010-03-28 03:00:00 (Sun)
  63424177200, #    local_end 2010-10-31 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  63424152000, #    utc_start 2010-10-30 20:00:00 (Sat)
  63436852800, #      utc_end 2011-03-26 20:00:00 (Sat)
  63424173600, #  local_start 2010-10-31 02:00:00 (Sun)
  63436874400, #    local_end 2011-03-27 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  63436852800, #    utc_start 2011-03-26 20:00:00 (Sat)
  63549946800, #      utc_end 2014-10-25 19:00:00 (Sat)
  63436878000, #  local_start 2011-03-27 03:00:00 (Sun)
  63549972000, #    local_end 2014-10-26 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  63549946800, #    utc_start 2014-10-25 19:00:00 (Sat)
  63594705600, #      utc_end 2016-03-26 20:00:00 (Sat)
  63549968400, #  local_start 2014-10-26 01:00:00 (Sun)
  63594727200, #    local_end 2016-03-27 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  63594705600, #    utc_start 2016-03-26 20:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  63594730800, #  local_start 2016-03-27 03:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  25200,
  0,
  '+07',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {31}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_BARNAUL

    $main::fatpacked{"DateTime/TimeZone/Asia/Beirut.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_BEIRUT';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/asia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Beirut;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Beirut::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59295533880, #      utc_end 1879-12-31 21:38:00 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59295542400, #    local_end 1880-01-01 00:00:00 (Thu)
  8520,
  0,
  'LMT',
      ],
      [
  59295533880, #    utc_start 1879-12-31 21:38:00 (Wed)
  60565269600, #      utc_end 1920-03-27 22:00:00 (Sat)
  59295541080, #  local_start 1879-12-31 23:38:00 (Wed)
  60565276800, #    local_end 1920-03-28 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  60565269600, #    utc_start 1920-03-27 22:00:00 (Sat)
  60583496400, #      utc_end 1920-10-24 21:00:00 (Sun)
  60565280400, #  local_start 1920-03-28 01:00:00 (Sun)
  60583507200, #    local_end 1920-10-25 00:00:00 (Mon)
  10800,
  1,
  'EEST',
      ],
      [
  60583496400, #    utc_start 1920-10-24 21:00:00 (Sun)
  60597324000, #      utc_end 1921-04-02 22:00:00 (Sat)
  60583503600, #  local_start 1920-10-24 23:00:00 (Sun)
  60597331200, #    local_end 1921-04-03 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  60597324000, #    utc_start 1921-04-02 22:00:00 (Sat)
  60613131600, #      utc_end 1921-10-02 21:00:00 (Sun)
  60597334800, #  local_start 1921-04-03 01:00:00 (Sun)
  60613142400, #    local_end 1921-10-03 00:00:00 (Mon)
  10800,
  1,
  'EEST',
      ],
      [
  60613131600, #    utc_start 1921-10-02 21:00:00 (Sun)
  60628168800, #      utc_end 1922-03-25 22:00:00 (Sat)
  60613138800, #  local_start 1921-10-02 23:00:00 (Sun)
  60628176000, #    local_end 1922-03-26 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  60628168800, #    utc_start 1922-03-25 22:00:00 (Sat)
  60645099600, #      utc_end 1922-10-07 21:00:00 (Sat)
  60628179600, #  local_start 1922-03-26 01:00:00 (Sun)
  60645110400, #    local_end 1922-10-08 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  60645099600, #    utc_start 1922-10-07 21:00:00 (Sat)
  60662037600, #      utc_end 1923-04-21 22:00:00 (Sat)
  60645106800, #  local_start 1922-10-07 23:00:00 (Sat)
  60662044800, #    local_end 1923-04-22 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  60662037600, #    utc_start 1923-04-21 22:00:00 (Sat)
  60674734800, #      utc_end 1923-09-15 21:00:00 (Sat)
  60662048400, #  local_start 1923-04-22 01:00:00 (Sun)
  60674745600, #    local_end 1923-09-16 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  60674734800, #    utc_start 1923-09-15 21:00:00 (Sat)
  61735816800, #      utc_end 1957-04-30 22:00:00 (Tue)
  60674742000, #  local_start 1923-09-15 23:00:00 (Sat)
  61735824000, #    local_end 1957-05-01 00:00:00 (Wed)
  7200,
  0,
  'EET',
      ],
      [
  61735816800, #    utc_start 1957-04-30 22:00:00 (Tue)
  61749032400, #      utc_end 1957-09-30 21:00:00 (Mon)
  61735827600, #  local_start 1957-05-01 01:00:00 (Wed)
  61749043200, #    local_end 1957-10-01 00:00:00 (Tue)
  10800,
  1,
  'EEST',
      ],
      [
  61749032400, #    utc_start 1957-09-30 21:00:00 (Mon)
  61767352800, #      utc_end 1958-04-30 22:00:00 (Wed)
  61749039600, #  local_start 1957-09-30 23:00:00 (Mon)
  61767360000, #    local_end 1958-05-01 00:00:00 (Thu)
  7200,
  0,
  'EET',
      ],
      [
  61767352800, #    utc_start 1958-04-30 22:00:00 (Wed)
  61780568400, #      utc_end 1958-09-30 21:00:00 (Tue)
  61767363600, #  local_start 1958-05-01 01:00:00 (Thu)
  61780579200, #    local_end 1958-10-01 00:00:00 (Wed)
  10800,
  1,
  'EEST',
      ],
      [
  61780568400, #    utc_start 1958-09-30 21:00:00 (Tue)
  61798888800, #      utc_end 1959-04-30 22:00:00 (Thu)
  61780575600, #  local_start 1958-09-30 23:00:00 (Tue)
  61798896000, #    local_end 1959-05-01 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  61798888800, #    utc_start 1959-04-30 22:00:00 (Thu)
  61812104400, #      utc_end 1959-09-30 21:00:00 (Wed)
  61798899600, #  local_start 1959-05-01 01:00:00 (Fri)
  61812115200, #    local_end 1959-10-01 00:00:00 (Thu)
  10800,
  1,
  'EEST',
      ],
      [
  61812104400, #    utc_start 1959-09-30 21:00:00 (Wed)
  61830511200, #      utc_end 1960-04-30 22:00:00 (Sat)
  61812111600, #  local_start 1959-09-30 23:00:00 (Wed)
  61830518400, #    local_end 1960-05-01 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  61830511200, #    utc_start 1960-04-30 22:00:00 (Sat)
  61843726800, #      utc_end 1960-09-30 21:00:00 (Fri)
  61830522000, #  local_start 1960-05-01 01:00:00 (Sun)
  61843737600, #    local_end 1960-10-01 00:00:00 (Sat)
  10800,
  1,
  'EEST',
      ],
      [
  61843726800, #    utc_start 1960-09-30 21:00:00 (Fri)
  61862047200, #      utc_end 1961-04-30 22:00:00 (Sun)
  61843734000, #  local_start 1960-09-30 23:00:00 (Fri)
  61862054400, #    local_end 1961-05-01 00:00:00 (Mon)
  7200,
  0,
  'EET',
      ],
      [
  61862047200, #    utc_start 1961-04-30 22:00:00 (Sun)
  61875262800, #      utc_end 1961-09-30 21:00:00 (Sat)
  61862058000, #  local_start 1961-05-01 01:00:00 (Mon)
  61875273600, #    local_end 1961-10-01 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  61875262800, #    utc_start 1961-09-30 21:00:00 (Sat)
  62213695200, #      utc_end 1972-06-21 22:00:00 (Wed)
  61875270000, #  local_start 1961-09-30 23:00:00 (Sat)
  62213702400, #    local_end 1972-06-22 00:00:00 (Thu)
  7200,
  0,
  'EET',
      ],
      [
  62213695200, #    utc_start 1972-06-21 22:00:00 (Wed)
  62222418000, #      utc_end 1972-09-30 21:00:00 (Sat)
  62213706000, #  local_start 1972-06-22 01:00:00 (Thu)
  62222428800, #    local_end 1972-10-01 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62222418000, #    utc_start 1972-09-30 21:00:00 (Sat)
  62240738400, #      utc_end 1973-04-30 22:00:00 (Mon)
  62222425200, #  local_start 1972-09-30 23:00:00 (Sat)
  62240745600, #    local_end 1973-05-01 00:00:00 (Tue)
  7200,
  0,
  'EET',
      ],
      [
  62240738400, #    utc_start 1973-04-30 22:00:00 (Mon)
  62253954000, #      utc_end 1973-09-30 21:00:00 (Sun)
  62240749200, #  local_start 1973-05-01 01:00:00 (Tue)
  62253964800, #    local_end 1973-10-01 00:00:00 (Mon)
  10800,
  1,
  'EEST',
      ],
      [
  62253954000, #    utc_start 1973-09-30 21:00:00 (Sun)
  62272274400, #      utc_end 1974-04-30 22:00:00 (Tue)
  62253961200, #  local_start 1973-09-30 23:00:00 (Sun)
  62272281600, #    local_end 1974-05-01 00:00:00 (Wed)
  7200,
  0,
  'EET',
      ],
      [
  62272274400, #    utc_start 1974-04-30 22:00:00 (Tue)
  62285490000, #      utc_end 1974-09-30 21:00:00 (Mon)
  62272285200, #  local_start 1974-05-01 01:00:00 (Wed)
  62285500800, #    local_end 1974-10-01 00:00:00 (Tue)
  10800,
  1,
  'EEST',
      ],
      [
  62285490000, #    utc_start 1974-09-30 21:00:00 (Mon)
  62303810400, #      utc_end 1975-04-30 22:00:00 (Wed)
  62285497200, #  local_start 1974-09-30 23:00:00 (Mon)
  62303817600, #    local_end 1975-05-01 00:00:00 (Thu)
  7200,
  0,
  'EET',
      ],
      [
  62303810400, #    utc_start 1975-04-30 22:00:00 (Wed)
  62317026000, #      utc_end 1975-09-30 21:00:00 (Tue)
  62303821200, #  local_start 1975-05-01 01:00:00 (Thu)
  62317036800, #    local_end 1975-10-01 00:00:00 (Wed)
  10800,
  1,
  'EEST',
      ],
      [
  62317026000, #    utc_start 1975-09-30 21:00:00 (Tue)
  62335432800, #      utc_end 1976-04-30 22:00:00 (Fri)
  62317033200, #  local_start 1975-09-30 23:00:00 (Tue)
  62335440000, #    local_end 1976-05-01 00:00:00 (Sat)
  7200,
  0,
  'EET',
      ],
      [
  62335432800, #    utc_start 1976-04-30 22:00:00 (Fri)
  62348648400, #      utc_end 1976-09-30 21:00:00 (Thu)
  62335443600, #  local_start 1976-05-01 01:00:00 (Sat)
  62348659200, #    local_end 1976-10-01 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  62348648400, #    utc_start 1976-09-30 21:00:00 (Thu)
  62366968800, #      utc_end 1977-04-30 22:00:00 (Sat)
  62348655600, #  local_start 1976-09-30 23:00:00 (Thu)
  62366976000, #    local_end 1977-05-01 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62366968800, #    utc_start 1977-04-30 22:00:00 (Sat)
  62380184400, #      utc_end 1977-09-30 21:00:00 (Fri)
  62366979600, #  local_start 1977-05-01 01:00:00 (Sun)
  62380195200, #    local_end 1977-10-01 00:00:00 (Sat)
  10800,
  1,
  'EEST',
      ],
      [
  62380184400, #    utc_start 1977-09-30 21:00:00 (Fri)
  62398418400, #      utc_end 1978-04-29 22:00:00 (Sat)
  62380191600, #  local_start 1977-09-30 23:00:00 (Fri)
  62398425600, #    local_end 1978-04-30 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62398418400, #    utc_start 1978-04-29 22:00:00 (Sat)
  62411634000, #      utc_end 1978-09-29 21:00:00 (Fri)
  62398429200, #  local_start 1978-04-30 01:00:00 (Sun)
  62411644800, #    local_end 1978-09-30 00:00:00 (Sat)
  10800,
  1,
  'EEST',
      ],
      [
  62411634000, #    utc_start 1978-09-29 21:00:00 (Fri)
  62587893600, #      utc_end 1984-04-30 22:00:00 (Mon)
  62411641200, #  local_start 1978-09-29 23:00:00 (Fri)
  62587900800, #    local_end 1984-05-01 00:00:00 (Tue)
  7200,
  0,
  'EET',
      ],
      [
  62587893600, #    utc_start 1984-04-30 22:00:00 (Mon)
  62602405200, #      utc_end 1984-10-15 21:00:00 (Mon)
  62587904400, #  local_start 1984-05-01 01:00:00 (Tue)
  62602416000, #    local_end 1984-10-16 00:00:00 (Tue)
  10800,
  1,
  'EEST',
      ],
      [
  62602405200, #    utc_start 1984-10-15 21:00:00 (Mon)
  62619429600, #      utc_end 1985-04-30 22:00:00 (Tue)
  62602412400, #  local_start 1984-10-15 23:00:00 (Mon)
  62619436800, #    local_end 1985-05-01 00:00:00 (Wed)
  7200,
  0,
  'EET',
      ],
      [
  62619429600, #    utc_start 1985-04-30 22:00:00 (Tue)
  62633941200, #      utc_end 1985-10-15 21:00:00 (Tue)
  62619440400, #  local_start 1985-05-01 01:00:00 (Wed)
  62633952000, #    local_end 1985-10-16 00:00:00 (Wed)
  10800,
  1,
  'EEST',
      ],
      [
  62633941200, #    utc_start 1985-10-15 21:00:00 (Tue)
  62650965600, #      utc_end 1986-04-30 22:00:00 (Wed)
  62633948400, #  local_start 1985-10-15 23:00:00 (Tue)
  62650972800, #    local_end 1986-05-01 00:00:00 (Thu)
  7200,
  0,
  'EET',
      ],
      [
  62650965600, #    utc_start 1986-04-30 22:00:00 (Wed)
  62665477200, #      utc_end 1986-10-15 21:00:00 (Wed)
  62650976400, #  local_start 1986-05-01 01:00:00 (Thu)
  62665488000, #    local_end 1986-10-16 00:00:00 (Thu)
  10800,
  1,
  'EEST',
      ],
      [
  62665477200, #    utc_start 1986-10-15 21:00:00 (Wed)
  62682501600, #      utc_end 1987-04-30 22:00:00 (Thu)
  62665484400, #  local_start 1986-10-15 23:00:00 (Wed)
  62682508800, #    local_end 1987-05-01 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  62682501600, #    utc_start 1987-04-30 22:00:00 (Thu)
  62697013200, #      utc_end 1987-10-15 21:00:00 (Thu)
  62682512400, #  local_start 1987-05-01 01:00:00 (Fri)
  62697024000, #    local_end 1987-10-16 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  62697013200, #    utc_start 1987-10-15 21:00:00 (Thu)
  62716802400, #      utc_end 1988-05-31 22:00:00 (Tue)
  62697020400, #  local_start 1987-10-15 23:00:00 (Thu)
  62716809600, #    local_end 1988-06-01 00:00:00 (Wed)
  7200,
  0,
  'EET',
      ],
      [
  62716802400, #    utc_start 1988-05-31 22:00:00 (Tue)
  62728635600, #      utc_end 1988-10-15 21:00:00 (Sat)
  62716813200, #  local_start 1988-06-01 01:00:00 (Wed)
  62728646400, #    local_end 1988-10-16 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62728635600, #    utc_start 1988-10-15 21:00:00 (Sat)
  62746437600, #      utc_end 1989-05-09 22:00:00 (Tue)
  62728642800, #  local_start 1988-10-15 23:00:00 (Sat)
  62746444800, #    local_end 1989-05-10 00:00:00 (Wed)
  7200,
  0,
  'EET',
      ],
      [
  62746437600, #    utc_start 1989-05-09 22:00:00 (Tue)
  62760171600, #      utc_end 1989-10-15 21:00:00 (Sun)
  62746448400, #  local_start 1989-05-10 01:00:00 (Wed)
  62760182400, #    local_end 1989-10-16 00:00:00 (Mon)
  10800,
  1,
  'EEST',
      ],
      [
  62760171600, #    utc_start 1989-10-15 21:00:00 (Sun)
  62777196000, #      utc_end 1990-04-30 22:00:00 (Mon)
  62760178800, #  local_start 1989-10-15 23:00:00 (Sun)
  62777203200, #    local_end 1990-05-01 00:00:00 (Tue)
  7200,
  0,
  'EET',
      ],
      [
  62777196000, #    utc_start 1990-04-30 22:00:00 (Mon)
  62791707600, #      utc_end 1990-10-15 21:00:00 (Mon)
  62777206800, #  local_start 1990-05-01 01:00:00 (Tue)
  62791718400, #    local_end 1990-10-16 00:00:00 (Tue)
  10800,
  1,
  'EEST',
      ],
      [
  62791707600, #    utc_start 1990-10-15 21:00:00 (Mon)
  62808732000, #      utc_end 1991-04-30 22:00:00 (Tue)
  62791714800, #  local_start 1990-10-15 23:00:00 (Mon)
  62808739200, #    local_end 1991-05-01 00:00:00 (Wed)
  7200,
  0,
  'EET',
      ],
      [
  62808732000, #    utc_start 1991-04-30 22:00:00 (Tue)
  62823243600, #      utc_end 1991-10-15 21:00:00 (Tue)
  62808742800, #  local_start 1991-05-01 01:00:00 (Wed)
  62823254400, #    local_end 1991-10-16 00:00:00 (Wed)
  10800,
  1,
  'EEST',
      ],
      [
  62823243600, #    utc_start 1991-10-15 21:00:00 (Tue)
  62840354400, #      utc_end 1992-04-30 22:00:00 (Thu)
  62823250800, #  local_start 1991-10-15 23:00:00 (Tue)
  62840361600, #    local_end 1992-05-01 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  62840354400, #    utc_start 1992-04-30 22:00:00 (Thu)
  62853829200, #      utc_end 1992-10-03 21:00:00 (Sat)
  62840365200, #  local_start 1992-05-01 01:00:00 (Fri)
  62853840000, #    local_end 1992-10-04 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62853829200, #    utc_start 1992-10-03 21:00:00 (Sat)
  62868952800, #      utc_end 1993-03-27 22:00:00 (Sat)
  62853836400, #  local_start 1992-10-03 23:00:00 (Sat)
  62868960000, #    local_end 1993-03-28 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62868952800, #    utc_start 1993-03-27 22:00:00 (Sat)
  62884674000, #      utc_end 1993-09-25 21:00:00 (Sat)
  62868963600, #  local_start 1993-03-28 01:00:00 (Sun)
  62884684800, #    local_end 1993-09-26 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62884674000, #    utc_start 1993-09-25 21:00:00 (Sat)
  62900402400, #      utc_end 1994-03-26 22:00:00 (Sat)
  62884681200, #  local_start 1993-09-25 23:00:00 (Sat)
  62900409600, #    local_end 1994-03-27 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62900402400, #    utc_start 1994-03-26 22:00:00 (Sat)
  62916123600, #      utc_end 1994-09-24 21:00:00 (Sat)
  62900413200, #  local_start 1994-03-27 01:00:00 (Sun)
  62916134400, #    local_end 1994-09-25 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62916123600, #    utc_start 1994-09-24 21:00:00 (Sat)
  62931852000, #      utc_end 1995-03-25 22:00:00 (Sat)
  62916130800, #  local_start 1994-09-24 23:00:00 (Sat)
  62931859200, #    local_end 1995-03-26 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62931852000, #    utc_start 1995-03-25 22:00:00 (Sat)
  62947573200, #      utc_end 1995-09-23 21:00:00 (Sat)
  62931862800, #  local_start 1995-03-26 01:00:00 (Sun)
  62947584000, #    local_end 1995-09-24 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62947573200, #    utc_start 1995-09-23 21:00:00 (Sat)
  62963906400, #      utc_end 1996-03-30 22:00:00 (Sat)
  62947580400, #  local_start 1995-09-23 23:00:00 (Sat)
  62963913600, #    local_end 1996-03-31 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62963906400, #    utc_start 1996-03-30 22:00:00 (Sat)
  62979627600, #      utc_end 1996-09-28 21:00:00 (Sat)
  62963917200, #  local_start 1996-03-31 01:00:00 (Sun)
  62979638400, #    local_end 1996-09-29 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62979627600, #    utc_start 1996-09-28 21:00:00 (Sat)
  62995356000, #      utc_end 1997-03-29 22:00:00 (Sat)
  62979634800, #  local_start 1996-09-28 23:00:00 (Sat)
  62995363200, #    local_end 1997-03-30 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62995356000, #    utc_start 1997-03-29 22:00:00 (Sat)
  63011077200, #      utc_end 1997-09-27 21:00:00 (Sat)
  62995366800, #  local_start 1997-03-30 01:00:00 (Sun)
  63011088000, #    local_end 1997-09-28 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63011077200, #    utc_start 1997-09-27 21:00:00 (Sat)
  63026805600, #      utc_end 1998-03-28 22:00:00 (Sat)
  63011084400, #  local_start 1997-09-27 23:00:00 (Sat)
  63026812800, #    local_end 1998-03-29 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63026805600, #    utc_start 1998-03-28 22:00:00 (Sat)
  63042526800, #      utc_end 1998-09-26 21:00:00 (Sat)
  63026816400, #  local_start 1998-03-29 01:00:00 (Sun)
  63042537600, #    local_end 1998-09-27 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63042526800, #    utc_start 1998-09-26 21:00:00 (Sat)
  63058255200, #      utc_end 1999-03-27 22:00:00 (Sat)
  63042534000, #  local_start 1998-09-26 23:00:00 (Sat)
  63058262400, #    local_end 1999-03-28 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63058255200, #    utc_start 1999-03-27 22:00:00 (Sat)
  63077000400, #      utc_end 1999-10-30 21:00:00 (Sat)
  63058266000, #  local_start 1999-03-28 01:00:00 (Sun)
  63077011200, #    local_end 1999-10-31 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63077000400, #    utc_start 1999-10-30 21:00:00 (Sat)
  63089704800, #      utc_end 2000-03-25 22:00:00 (Sat)
  63077007600, #  local_start 1999-10-30 23:00:00 (Sat)
  63089712000, #    local_end 2000-03-26 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63089704800, #    utc_start 2000-03-25 22:00:00 (Sat)
  63108450000, #      utc_end 2000-10-28 21:00:00 (Sat)
  63089715600, #  local_start 2000-03-26 01:00:00 (Sun)
  63108460800, #    local_end 2000-10-29 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63108450000, #    utc_start 2000-10-28 21:00:00 (Sat)
  63121154400, #      utc_end 2001-03-24 22:00:00 (Sat)
  63108457200, #  local_start 2000-10-28 23:00:00 (Sat)
  63121161600, #    local_end 2001-03-25 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63121154400, #    utc_start 2001-03-24 22:00:00 (Sat)
  63139899600, #      utc_end 2001-10-27 21:00:00 (Sat)
  63121165200, #  local_start 2001-03-25 01:00:00 (Sun)
  63139910400, #    local_end 2001-10-28 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63139899600, #    utc_start 2001-10-27 21:00:00 (Sat)
  63153208800, #      utc_end 2002-03-30 22:00:00 (Sat)
  63139906800, #  local_start 2001-10-27 23:00:00 (Sat)
  63153216000, #    local_end 2002-03-31 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63153208800, #    utc_start 2002-03-30 22:00:00 (Sat)
  63171349200, #      utc_end 2002-10-26 21:00:00 (Sat)
  63153219600, #  local_start 2002-03-31 01:00:00 (Sun)
  63171360000, #    local_end 2002-10-27 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63171349200, #    utc_start 2002-10-26 21:00:00 (Sat)
  63184658400, #      utc_end 2003-03-29 22:00:00 (Sat)
  63171356400, #  local_start 2002-10-26 23:00:00 (Sat)
  63184665600, #    local_end 2003-03-30 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63184658400, #    utc_start 2003-03-29 22:00:00 (Sat)
  63202798800, #      utc_end 2003-10-25 21:00:00 (Sat)
  63184669200, #  local_start 2003-03-30 01:00:00 (Sun)
  63202809600, #    local_end 2003-10-26 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63202798800, #    utc_start 2003-10-25 21:00:00 (Sat)
  63216108000, #      utc_end 2004-03-27 22:00:00 (Sat)
  63202806000, #  local_start 2003-10-25 23:00:00 (Sat)
  63216115200, #    local_end 2004-03-28 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63216108000, #    utc_start 2004-03-27 22:00:00 (Sat)
  63234853200, #      utc_end 2004-10-30 21:00:00 (Sat)
  63216118800, #  local_start 2004-03-28 01:00:00 (Sun)
  63234864000, #    local_end 2004-10-31 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63234853200, #    utc_start 2004-10-30 21:00:00 (Sat)
  63247557600, #      utc_end 2005-03-26 22:00:00 (Sat)
  63234860400, #  local_start 2004-10-30 23:00:00 (Sat)
  63247564800, #    local_end 2005-03-27 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63247557600, #    utc_start 2005-03-26 22:00:00 (Sat)
  63266302800, #      utc_end 2005-10-29 21:00:00 (Sat)
  63247568400, #  local_start 2005-03-27 01:00:00 (Sun)
  63266313600, #    local_end 2005-10-30 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63266302800, #    utc_start 2005-10-29 21:00:00 (Sat)
  63279007200, #      utc_end 2006-03-25 22:00:00 (Sat)
  63266310000, #  local_start 2005-10-29 23:00:00 (Sat)
  63279014400, #    local_end 2006-03-26 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63279007200, #    utc_start 2006-03-25 22:00:00 (Sat)
  63297752400, #      utc_end 2006-10-28 21:00:00 (Sat)
  63279018000, #  local_start 2006-03-26 01:00:00 (Sun)
  63297763200, #    local_end 2006-10-29 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63297752400, #    utc_start 2006-10-28 21:00:00 (Sat)
  63310456800, #      utc_end 2007-03-24 22:00:00 (Sat)
  63297759600, #  local_start 2006-10-28 23:00:00 (Sat)
  63310464000, #    local_end 2007-03-25 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63310456800, #    utc_start 2007-03-24 22:00:00 (Sat)
  63329202000, #      utc_end 2007-10-27 21:00:00 (Sat)
  63310467600, #  local_start 2007-03-25 01:00:00 (Sun)
  63329212800, #    local_end 2007-10-28 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63329202000, #    utc_start 2007-10-27 21:00:00 (Sat)
  63342511200, #      utc_end 2008-03-29 22:00:00 (Sat)
  63329209200, #  local_start 2007-10-27 23:00:00 (Sat)
  63342518400, #    local_end 2008-03-30 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63342511200, #    utc_start 2008-03-29 22:00:00 (Sat)
  63360651600, #      utc_end 2008-10-25 21:00:00 (Sat)
  63342522000, #  local_start 2008-03-30 01:00:00 (Sun)
  63360662400, #    local_end 2008-10-26 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63360651600, #    utc_start 2008-10-25 21:00:00 (Sat)
  63373960800, #      utc_end 2009-03-28 22:00:00 (Sat)
  63360658800, #  local_start 2008-10-25 23:00:00 (Sat)
  63373968000, #    local_end 2009-03-29 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63373960800, #    utc_start 2009-03-28 22:00:00 (Sat)
  63392101200, #      utc_end 2009-10-24 21:00:00 (Sat)
  63373971600, #  local_start 2009-03-29 01:00:00 (Sun)
  63392112000, #    local_end 2009-10-25 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63392101200, #    utc_start 2009-10-24 21:00:00 (Sat)
  63405410400, #      utc_end 2010-03-27 22:00:00 (Sat)
  63392108400, #  local_start 2009-10-24 23:00:00 (Sat)
  63405417600, #    local_end 2010-03-28 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63405410400, #    utc_start 2010-03-27 22:00:00 (Sat)
  63424155600, #      utc_end 2010-10-30 21:00:00 (Sat)
  63405421200, #  local_start 2010-03-28 01:00:00 (Sun)
  63424166400, #    local_end 2010-10-31 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63424155600, #    utc_start 2010-10-30 21:00:00 (Sat)
  63436860000, #      utc_end 2011-03-26 22:00:00 (Sat)
  63424162800, #  local_start 2010-10-30 23:00:00 (Sat)
  63436867200, #    local_end 2011-03-27 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63436860000, #    utc_start 2011-03-26 22:00:00 (Sat)
  63455605200, #      utc_end 2011-10-29 21:00:00 (Sat)
  63436870800, #  local_start 2011-03-27 01:00:00 (Sun)
  63455616000, #    local_end 2011-10-30 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63455605200, #    utc_start 2011-10-29 21:00:00 (Sat)
  63468309600, #      utc_end 2012-03-24 22:00:00 (Sat)
  63455612400, #  local_start 2011-10-29 23:00:00 (Sat)
  63468316800, #    local_end 2012-03-25 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63468309600, #    utc_start 2012-03-24 22:00:00 (Sat)
  63487054800, #      utc_end 2012-10-27 21:00:00 (Sat)
  63468320400, #  local_start 2012-03-25 01:00:00 (Sun)
  63487065600, #    local_end 2012-10-28 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63487054800, #    utc_start 2012-10-27 21:00:00 (Sat)
  63500364000, #      utc_end 2013-03-30 22:00:00 (Sat)
  63487062000, #  local_start 2012-10-27 23:00:00 (Sat)
  63500371200, #    local_end 2013-03-31 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63500364000, #    utc_start 2013-03-30 22:00:00 (Sat)
  63518504400, #      utc_end 2013-10-26 21:00:00 (Sat)
  63500374800, #  local_start 2013-03-31 01:00:00 (Sun)
  63518515200, #    local_end 2013-10-27 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63518504400, #    utc_start 2013-10-26 21:00:00 (Sat)
  63531813600, #      utc_end 2014-03-29 22:00:00 (Sat)
  63518511600, #  local_start 2013-10-26 23:00:00 (Sat)
  63531820800, #    local_end 2014-03-30 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63531813600, #    utc_start 2014-03-29 22:00:00 (Sat)
  63549954000, #      utc_end 2014-10-25 21:00:00 (Sat)
  63531824400, #  local_start 2014-03-30 01:00:00 (Sun)
  63549964800, #    local_end 2014-10-26 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63549954000, #    utc_start 2014-10-25 21:00:00 (Sat)
  63563263200, #      utc_end 2015-03-28 22:00:00 (Sat)
  63549961200, #  local_start 2014-10-25 23:00:00 (Sat)
  63563270400, #    local_end 2015-03-29 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63563263200, #    utc_start 2015-03-28 22:00:00 (Sat)
  63581403600, #      utc_end 2015-10-24 21:00:00 (Sat)
  63563274000, #  local_start 2015-03-29 01:00:00 (Sun)
  63581414400, #    local_end 2015-10-25 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63581403600, #    utc_start 2015-10-24 21:00:00 (Sat)
  63594712800, #      utc_end 2016-03-26 22:00:00 (Sat)
  63581410800, #  local_start 2015-10-24 23:00:00 (Sat)
  63594720000, #    local_end 2016-03-27 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63594712800, #    utc_start 2016-03-26 22:00:00 (Sat)
  63613458000, #      utc_end 2016-10-29 21:00:00 (Sat)
  63594723600, #  local_start 2016-03-27 01:00:00 (Sun)
  63613468800, #    local_end 2016-10-30 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63613458000, #    utc_start 2016-10-29 21:00:00 (Sat)
  63626162400, #      utc_end 2017-03-25 22:00:00 (Sat)
  63613465200, #  local_start 2016-10-29 23:00:00 (Sat)
  63626169600, #    local_end 2017-03-26 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63626162400, #    utc_start 2017-03-25 22:00:00 (Sat)
  63644907600, #      utc_end 2017-10-28 21:00:00 (Sat)
  63626173200, #  local_start 2017-03-26 01:00:00 (Sun)
  63644918400, #    local_end 2017-10-29 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63644907600, #    utc_start 2017-10-28 21:00:00 (Sat)
  63657612000, #      utc_end 2018-03-24 22:00:00 (Sat)
  63644914800, #  local_start 2017-10-28 23:00:00 (Sat)
  63657619200, #    local_end 2018-03-25 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63657612000, #    utc_start 2018-03-24 22:00:00 (Sat)
  63676357200, #      utc_end 2018-10-27 21:00:00 (Sat)
  63657622800, #  local_start 2018-03-25 01:00:00 (Sun)
  63676368000, #    local_end 2018-10-28 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63676357200, #    utc_start 2018-10-27 21:00:00 (Sat)
  63689666400, #      utc_end 2019-03-30 22:00:00 (Sat)
  63676364400, #  local_start 2018-10-27 23:00:00 (Sat)
  63689673600, #    local_end 2019-03-31 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63689666400, #    utc_start 2019-03-30 22:00:00 (Sat)
  63707806800, #      utc_end 2019-10-26 21:00:00 (Sat)
  63689677200, #  local_start 2019-03-31 01:00:00 (Sun)
  63707817600, #    local_end 2019-10-27 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63707806800, #    utc_start 2019-10-26 21:00:00 (Sat)
  63721116000, #      utc_end 2020-03-28 22:00:00 (Sat)
  63707814000, #  local_start 2019-10-26 23:00:00 (Sat)
  63721123200, #    local_end 2020-03-29 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63721116000, #    utc_start 2020-03-28 22:00:00 (Sat)
  63739256400, #      utc_end 2020-10-24 21:00:00 (Sat)
  63721126800, #  local_start 2020-03-29 01:00:00 (Sun)
  63739267200, #    local_end 2020-10-25 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63739256400, #    utc_start 2020-10-24 21:00:00 (Sat)
  63752565600, #      utc_end 2021-03-27 22:00:00 (Sat)
  63739263600, #  local_start 2020-10-24 23:00:00 (Sat)
  63752572800, #    local_end 2021-03-28 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63752565600, #    utc_start 2021-03-27 22:00:00 (Sat)
  63771310800, #      utc_end 2021-10-30 21:00:00 (Sat)
  63752576400, #  local_start 2021-03-28 01:00:00 (Sun)
  63771321600, #    local_end 2021-10-31 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63771310800, #    utc_start 2021-10-30 21:00:00 (Sat)
  63784015200, #      utc_end 2022-03-26 22:00:00 (Sat)
  63771318000, #  local_start 2021-10-30 23:00:00 (Sat)
  63784022400, #    local_end 2022-03-27 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63784015200, #    utc_start 2022-03-26 22:00:00 (Sat)
  63802760400, #      utc_end 2022-10-29 21:00:00 (Sat)
  63784026000, #  local_start 2022-03-27 01:00:00 (Sun)
  63802771200, #    local_end 2022-10-30 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63802760400, #    utc_start 2022-10-29 21:00:00 (Sat)
  63815464800, #      utc_end 2023-03-25 22:00:00 (Sat)
  63802767600, #  local_start 2022-10-29 23:00:00 (Sat)
  63815472000, #    local_end 2023-03-26 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63815464800, #    utc_start 2023-03-25 22:00:00 (Sat)
  63834210000, #      utc_end 2023-10-28 21:00:00 (Sat)
  63815475600, #  local_start 2023-03-26 01:00:00 (Sun)
  63834220800, #    local_end 2023-10-29 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63834210000, #    utc_start 2023-10-28 21:00:00 (Sat)
  63847519200, #      utc_end 2024-03-30 22:00:00 (Sat)
  63834217200, #  local_start 2023-10-28 23:00:00 (Sat)
  63847526400, #    local_end 2024-03-31 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63847519200, #    utc_start 2024-03-30 22:00:00 (Sat)
  63865659600, #      utc_end 2024-10-26 21:00:00 (Sat)
  63847530000, #  local_start 2024-03-31 01:00:00 (Sun)
  63865670400, #    local_end 2024-10-27 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63865659600, #    utc_start 2024-10-26 21:00:00 (Sat)
  63878968800, #      utc_end 2025-03-29 22:00:00 (Sat)
  63865666800, #  local_start 2024-10-26 23:00:00 (Sat)
  63878976000, #    local_end 2025-03-30 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63878968800, #    utc_start 2025-03-29 22:00:00 (Sat)
  63897109200, #      utc_end 2025-10-25 21:00:00 (Sat)
  63878979600, #  local_start 2025-03-30 01:00:00 (Sun)
  63897120000, #    local_end 2025-10-26 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63897109200, #    utc_start 2025-10-25 21:00:00 (Sat)
  63910418400, #      utc_end 2026-03-28 22:00:00 (Sat)
  63897116400, #  local_start 2025-10-25 23:00:00 (Sat)
  63910425600, #    local_end 2026-03-29 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63910418400, #    utc_start 2026-03-28 22:00:00 (Sat)
  63928558800, #      utc_end 2026-10-24 21:00:00 (Sat)
  63910429200, #  local_start 2026-03-29 01:00:00 (Sun)
  63928569600, #    local_end 2026-10-25 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63928558800, #    utc_start 2026-10-24 21:00:00 (Sat)
  63941868000, #      utc_end 2027-03-27 22:00:00 (Sat)
  63928566000, #  local_start 2026-10-24 23:00:00 (Sat)
  63941875200, #    local_end 2027-03-28 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63941868000, #    utc_start 2027-03-27 22:00:00 (Sat)
  63960613200, #      utc_end 2027-10-30 21:00:00 (Sat)
  63941878800, #  local_start 2027-03-28 01:00:00 (Sun)
  63960624000, #    local_end 2027-10-31 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63960613200, #    utc_start 2027-10-30 21:00:00 (Sat)
  63973317600, #      utc_end 2028-03-25 22:00:00 (Sat)
  63960620400, #  local_start 2027-10-30 23:00:00 (Sat)
  63973324800, #    local_end 2028-03-26 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63973317600, #    utc_start 2028-03-25 22:00:00 (Sat)
  63992062800, #      utc_end 2028-10-28 21:00:00 (Sat)
  63973328400, #  local_start 2028-03-26 01:00:00 (Sun)
  63992073600, #    local_end 2028-10-29 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63992062800, #    utc_start 2028-10-28 21:00:00 (Sat)
  64004767200, #      utc_end 2029-03-24 22:00:00 (Sat)
  63992070000, #  local_start 2028-10-28 23:00:00 (Sat)
  64004774400, #    local_end 2029-03-25 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  64004767200, #    utc_start 2029-03-24 22:00:00 (Sat)
  64023512400, #      utc_end 2029-10-27 21:00:00 (Sat)
  64004778000, #  local_start 2029-03-25 01:00:00 (Sun)
  64023523200, #    local_end 2029-10-28 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  64023512400, #    utc_start 2029-10-27 21:00:00 (Sat)
  64036821600, #      utc_end 2030-03-30 22:00:00 (Sat)
  64023519600, #  local_start 2029-10-27 23:00:00 (Sat)
  64036828800, #    local_end 2030-03-31 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  64036821600, #    utc_start 2030-03-30 22:00:00 (Sat)
  64054962000, #      utc_end 2030-10-26 21:00:00 (Sat)
  64036832400, #  local_start 2030-03-31 01:00:00 (Sun)
  64054972800, #    local_end 2030-10-27 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {63}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { 7200 }
  
  my $last_observance = bless( {
    'format' => 'EE%sT',
    'gmtoff' => '2:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 686290,
      'local_rd_secs' => 85080,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 686290,
      'utc_rd_secs' => 85080,
      'utc_year' => 1880
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => 7200,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 686290,
      'local_rd_secs' => 77880,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 686290,
      'utc_rd_secs' => 77880,
      'utc_year' => 1880
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '0:00',
      'from' => '1993',
      'in' => 'Mar',
      'letter' => 'S',
      'name' => 'Lebanon',
      'offset_from_std' => 3600,
      'on' => 'lastSun',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '0:00',
      'from' => '1999',
      'in' => 'Oct',
      'letter' => '',
      'name' => 'Lebanon',
      'offset_from_std' => 0,
      'on' => 'lastSun',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_BEIRUT

    $main::fatpacked{"DateTime/TimeZone/Asia/Bishkek.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_BISHKEK';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/asia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Bishkek;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Bishkek::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60694513296, #      utc_end 1924-05-01 19:01:36 (Thu)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60694531200, #    local_end 1924-05-02 00:00:00 (Fri)
  17904,
  0,
  'LMT',
      ],
      [
  60694513296, #    utc_start 1924-05-01 19:01:36 (Thu)
  60888135600, #      utc_end 1930-06-20 19:00:00 (Fri)
  60694531296, #  local_start 1924-05-02 00:01:36 (Fri)
  60888153600, #    local_end 1930-06-21 00:00:00 (Sat)
  18000,
  0,
  '+05',
      ],
      [
  60888135600, #    utc_start 1930-06-20 19:00:00 (Fri)
  62490592800, #      utc_end 1981-03-31 18:00:00 (Tue)
  60888157200, #  local_start 1930-06-21 01:00:00 (Sat)
  62490614400, #    local_end 1981-04-01 00:00:00 (Wed)
  21600,
  0,
  '+06',
      ],
      [
  62490592800, #    utc_start 1981-03-31 18:00:00 (Tue)
  62506400400, #      utc_end 1981-09-30 17:00:00 (Wed)
  62490618000, #  local_start 1981-04-01 01:00:00 (Wed)
  62506425600, #    local_end 1981-10-01 00:00:00 (Thu)
  25200,
  1,
  '+07',
      ],
      [
  62506400400, #    utc_start 1981-09-30 17:00:00 (Wed)
  62522128800, #      utc_end 1982-03-31 18:00:00 (Wed)
  62506422000, #  local_start 1981-09-30 23:00:00 (Wed)
  62522150400, #    local_end 1982-04-01 00:00:00 (Thu)
  21600,
  0,
  '+06',
      ],
      [
  62522128800, #    utc_start 1982-03-31 18:00:00 (Wed)
  62537936400, #      utc_end 1982-09-30 17:00:00 (Thu)
  62522154000, #  local_start 1982-04-01 01:00:00 (Thu)
  62537961600, #    local_end 1982-10-01 00:00:00 (Fri)
  25200,
  1,
  '+07',
      ],
      [
  62537936400, #    utc_start 1982-09-30 17:00:00 (Thu)
  62553664800, #      utc_end 1983-03-31 18:00:00 (Thu)
  62537958000, #  local_start 1982-09-30 23:00:00 (Thu)
  62553686400, #    local_end 1983-04-01 00:00:00 (Fri)
  21600,
  0,
  '+06',
      ],
      [
  62553664800, #    utc_start 1983-03-31 18:00:00 (Thu)
  62569472400, #      utc_end 1983-09-30 17:00:00 (Fri)
  62553690000, #  local_start 1983-04-01 01:00:00 (Fri)
  62569497600, #    local_end 1983-10-01 00:00:00 (Sat)
  25200,
  1,
  '+07',
      ],
      [
  62569472400, #    utc_start 1983-09-30 17:00:00 (Fri)
  62585287200, #      utc_end 1984-03-31 18:00:00 (Sat)
  62569494000, #  local_start 1983-09-30 23:00:00 (Fri)
  62585308800, #    local_end 1984-04-01 00:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  62585287200, #    utc_start 1984-03-31 18:00:00 (Sat)
  62601019200, #      utc_end 1984-09-29 20:00:00 (Sat)
  62585312400, #  local_start 1984-04-01 01:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  62601019200, #    utc_start 1984-09-29 20:00:00 (Sat)
  62616744000, #      utc_end 1985-03-30 20:00:00 (Sat)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  62616744000, #    utc_start 1985-03-30 20:00:00 (Sat)
  62632468800, #      utc_end 1985-09-28 20:00:00 (Sat)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  62632468800, #    utc_start 1985-09-28 20:00:00 (Sat)
  62648193600, #      utc_end 1986-03-29 20:00:00 (Sat)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  62648193600, #    utc_start 1986-03-29 20:00:00 (Sat)
  62663918400, #      utc_end 1986-09-27 20:00:00 (Sat)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  62663918400, #    utc_start 1986-09-27 20:00:00 (Sat)
  62679643200, #      utc_end 1987-03-28 20:00:00 (Sat)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  62679643200, #    utc_start 1987-03-28 20:00:00 (Sat)
  62695368000, #      utc_end 1987-09-26 20:00:00 (Sat)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  62695368000, #    utc_start 1987-09-26 20:00:00 (Sat)
  62711092800, #      utc_end 1988-03-26 20:00:00 (Sat)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  62711092800, #    utc_start 1988-03-26 20:00:00 (Sat)
  62726817600, #      utc_end 1988-09-24 20:00:00 (Sat)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  62726817600, #    utc_start 1988-09-24 20:00:00 (Sat)
  62742542400, #      utc_end 1989-03-25 20:00:00 (Sat)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  62742542400, #    utc_start 1989-03-25 20:00:00 (Sat)
  62758267200, #      utc_end 1989-09-23 20:00:00 (Sat)
  62742567600, #  local_start 1989-03-26 03:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  62758267200, #    utc_start 1989-09-23 20:00:00 (Sat)
  62773992000, #      utc_end 1990-03-24 20:00:00 (Sat)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  62773992000, #    utc_start 1990-03-24 20:00:00 (Sat)
  62790321600, #      utc_end 1990-09-29 20:00:00 (Sat)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  62790321600, #    utc_start 1990-09-29 20:00:00 (Sat)
  62806046400, #      utc_end 1991-03-30 20:00:00 (Sat)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  62806046400, #    utc_start 1991-03-30 20:00:00 (Sat)
  62819265600, #      utc_end 1991-08-30 20:00:00 (Fri)
  62806068000, #  local_start 1991-03-31 02:00:00 (Sun)
  62819287200, #    local_end 1991-08-31 02:00:00 (Sat)
  21600,
  1,
  '+06',
      ],
      [
  62819265600, #    utc_start 1991-08-30 20:00:00 (Fri)
  62838702000, #      utc_end 1992-04-11 19:00:00 (Sat)
  62819283600, #  local_start 1991-08-31 01:00:00 (Sat)
  62838720000, #    local_end 1992-04-12 00:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62838702000, #    utc_start 1992-04-11 19:00:00 (Sat)
  62853213600, #      utc_end 1992-09-26 18:00:00 (Sat)
  62838723600, #  local_start 1992-04-12 01:00:00 (Sun)
  62853235200, #    local_end 1992-09-27 00:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62853213600, #    utc_start 1992-09-26 18:00:00 (Sat)
  62870151600, #      utc_end 1993-04-10 19:00:00 (Sat)
  62853231600, #  local_start 1992-09-26 23:00:00 (Sat)
  62870169600, #    local_end 1993-04-11 00:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62870151600, #    utc_start 1993-04-10 19:00:00 (Sat)
  62884663200, #      utc_end 1993-09-25 18:00:00 (Sat)
  62870173200, #  local_start 1993-04-11 01:00:00 (Sun)
  62884684800, #    local_end 1993-09-26 00:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62884663200, #    utc_start 1993-09-25 18:00:00 (Sat)
  62901601200, #      utc_end 1994-04-09 19:00:00 (Sat)
  62884681200, #  local_start 1993-09-25 23:00:00 (Sat)
  62901619200, #    local_end 1994-04-10 00:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62901601200, #    utc_start 1994-04-09 19:00:00 (Sat)
  62916112800, #      utc_end 1994-09-24 18:00:00 (Sat)
  62901622800, #  local_start 1994-04-10 01:00:00 (Sun)
  62916134400, #    local_end 1994-09-25 00:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62916112800, #    utc_start 1994-09-24 18:00:00 (Sat)
  62933050800, #      utc_end 1995-04-08 19:00:00 (Sat)
  62916130800, #  local_start 1994-09-24 23:00:00 (Sat)
  62933068800, #    local_end 1995-04-09 00:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62933050800, #    utc_start 1995-04-08 19:00:00 (Sat)
  62947562400, #      utc_end 1995-09-23 18:00:00 (Sat)
  62933072400, #  local_start 1995-04-09 01:00:00 (Sun)
  62947584000, #    local_end 1995-09-24 00:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62947562400, #    utc_start 1995-09-23 18:00:00 (Sat)
  62964500400, #      utc_end 1996-04-06 19:00:00 (Sat)
  62947580400, #  local_start 1995-09-23 23:00:00 (Sat)
  62964518400, #    local_end 1996-04-07 00:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62964500400, #    utc_start 1996-04-06 19:00:00 (Sat)
  62979616800, #      utc_end 1996-09-28 18:00:00 (Sat)
  62964522000, #  local_start 1996-04-07 01:00:00 (Sun)
  62979638400, #    local_end 1996-09-29 00:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62979616800, #    utc_start 1996-09-28 18:00:00 (Sat)
  62995354200, #      utc_end 1997-03-29 21:30:00 (Sat)
  62979634800, #  local_start 1996-09-28 23:00:00 (Sat)
  62995372200, #    local_end 1997-03-30 02:30:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62995354200, #    utc_start 1997-03-29 21:30:00 (Sat)
  63013494600, #      utc_end 1997-10-25 20:30:00 (Sat)
  62995375800, #  local_start 1997-03-30 03:30:00 (Sun)
  63013516200, #    local_end 1997-10-26 02:30:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  63013494600, #    utc_start 1997-10-25 20:30:00 (Sat)
  63026803800, #      utc_end 1998-03-28 21:30:00 (Sat)
  63013512600, #  local_start 1997-10-26 01:30:00 (Sun)
  63026821800, #    local_end 1998-03-29 02:30:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  63026803800, #    utc_start 1998-03-28 21:30:00 (Sat)
  63044944200, #      utc_end 1998-10-24 20:30:00 (Sat)
  63026825400, #  local_start 1998-03-29 03:30:00 (Sun)
  63044965800, #    local_end 1998-10-25 02:30:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  63044944200, #    utc_start 1998-10-24 20:30:00 (Sat)
  63058253400, #      utc_end 1999-03-27 21:30:00 (Sat)
  63044962200, #  local_start 1998-10-25 01:30:00 (Sun)
  63058271400, #    local_end 1999-03-28 02:30:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  63058253400, #    utc_start 1999-03-27 21:30:00 (Sat)
  63076998600, #      utc_end 1999-10-30 20:30:00 (Sat)
  63058275000, #  local_start 1999-03-28 03:30:00 (Sun)
  63077020200, #    local_end 1999-10-31 02:30:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  63076998600, #    utc_start 1999-10-30 20:30:00 (Sat)
  63089703000, #      utc_end 2000-03-25 21:30:00 (Sat)
  63077016600, #  local_start 1999-10-31 01:30:00 (Sun)
  63089721000, #    local_end 2000-03-26 02:30:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  63089703000, #    utc_start 2000-03-25 21:30:00 (Sat)
  63108448200, #      utc_end 2000-10-28 20:30:00 (Sat)
  63089724600, #  local_start 2000-03-26 03:30:00 (Sun)
  63108469800, #    local_end 2000-10-29 02:30:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  63108448200, #    utc_start 2000-10-28 20:30:00 (Sat)
  63121152600, #      utc_end 2001-03-24 21:30:00 (Sat)
  63108466200, #  local_start 2000-10-29 01:30:00 (Sun)
  63121170600, #    local_end 2001-03-25 02:30:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  63121152600, #    utc_start 2001-03-24 21:30:00 (Sat)
  63139897800, #      utc_end 2001-10-27 20:30:00 (Sat)
  63121174200, #  local_start 2001-03-25 03:30:00 (Sun)
  63139919400, #    local_end 2001-10-28 02:30:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  63139897800, #    utc_start 2001-10-27 20:30:00 (Sat)
  63153207000, #      utc_end 2002-03-30 21:30:00 (Sat)
  63139915800, #  local_start 2001-10-28 01:30:00 (Sun)
  63153225000, #    local_end 2002-03-31 02:30:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  63153207000, #    utc_start 2002-03-30 21:30:00 (Sat)
  63171347400, #      utc_end 2002-10-26 20:30:00 (Sat)
  63153228600, #  local_start 2002-03-31 03:30:00 (Sun)
  63171369000, #    local_end 2002-10-27 02:30:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  63171347400, #    utc_start 2002-10-26 20:30:00 (Sat)
  63184656600, #      utc_end 2003-03-29 21:30:00 (Sat)
  63171365400, #  local_start 2002-10-27 01:30:00 (Sun)
  63184674600, #    local_end 2003-03-30 02:30:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  63184656600, #    utc_start 2003-03-29 21:30:00 (Sat)
  63202797000, #      utc_end 2003-10-25 20:30:00 (Sat)
  63184678200, #  local_start 2003-03-30 03:30:00 (Sun)
  63202818600, #    local_end 2003-10-26 02:30:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  63202797000, #    utc_start 2003-10-25 20:30:00 (Sat)
  63216106200, #      utc_end 2004-03-27 21:30:00 (Sat)
  63202815000, #  local_start 2003-10-26 01:30:00 (Sun)
  63216124200, #    local_end 2004-03-28 02:30:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  63216106200, #    utc_start 2004-03-27 21:30:00 (Sat)
  63234851400, #      utc_end 2004-10-30 20:30:00 (Sat)
  63216127800, #  local_start 2004-03-28 03:30:00 (Sun)
  63234873000, #    local_end 2004-10-31 02:30:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  63234851400, #    utc_start 2004-10-30 20:30:00 (Sat)
  63247555800, #      utc_end 2005-03-26 21:30:00 (Sat)
  63234869400, #  local_start 2004-10-31 01:30:00 (Sun)
  63247573800, #    local_end 2005-03-27 02:30:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  63247555800, #    utc_start 2005-03-26 21:30:00 (Sat)
  63259466400, #      utc_end 2005-08-11 18:00:00 (Thu)
  63247577400, #  local_start 2005-03-27 03:30:00 (Sun)
  63259488000, #    local_end 2005-08-12 00:00:00 (Fri)
  21600,
  1,
  '+06',
      ],
      [
  63259466400, #    utc_start 2005-08-11 18:00:00 (Thu)
  DateTime::TimeZone::INFINITY, #      utc_end
  63259488000, #  local_start 2005-08-12 00:00:00 (Fri)
  DateTime::TimeZone::INFINITY, #    local_end
  21600,
  0,
  '+06',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {25}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_BISHKEK

    $main::fatpacked{"DateTime/TimeZone/Asia/Brunei.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_BRUNEI';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/asia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Brunei;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Brunei::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60752218820, #      utc_end 1926-02-28 16:20:20 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60752246400, #    local_end 1926-03-01 00:00:00 (Mon)
  27580,
  0,
  'LMT',
      ],
      [
  60752218820, #    utc_start 1926-02-28 16:20:20 (Sun)
  60968046600, #      utc_end 1932-12-31 16:30:00 (Sat)
  60752245820, #  local_start 1926-02-28 23:50:20 (Sun)
  60968073600, #    local_end 1933-01-01 00:00:00 (Sun)
  27000,
  0,
  '+0730',
      ],
      [
  60968046600, #    utc_start 1932-12-31 16:30:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  60968075400, #  local_start 1933-01-01 00:30:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  28800,
  0,
  '+08',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_BRUNEI

    $main::fatpacked{"DateTime/TimeZone/Asia/Chita.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_CHITA';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Chita;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Chita::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60556263968, #      utc_end 1919-12-14 16:26:08 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60556291200, #    local_end 1919-12-15 00:00:00 (Mon)
  27232,
  0,
  'LMT',
      ],
      [
  60556263968, #    utc_start 1919-12-14 16:26:08 (Sun)
  60888124800, #      utc_end 1930-06-20 16:00:00 (Fri)
  60556292768, #  local_start 1919-12-15 00:26:08 (Mon)
  60888153600, #    local_end 1930-06-21 00:00:00 (Sat)
  28800,
  0,
  '+08',
      ],
      [
  60888124800, #    utc_start 1930-06-20 16:00:00 (Fri)
  62490582000, #      utc_end 1981-03-31 15:00:00 (Tue)
  60888157200, #  local_start 1930-06-21 01:00:00 (Sat)
  62490614400, #    local_end 1981-04-01 00:00:00 (Wed)
  32400,
  0,
  '+09',
      ],
      [
  62490582000, #    utc_start 1981-03-31 15:00:00 (Tue)
  62506389600, #      utc_end 1981-09-30 14:00:00 (Wed)
  62490618000, #  local_start 1981-04-01 01:00:00 (Wed)
  62506425600, #    local_end 1981-10-01 00:00:00 (Thu)
  36000,
  1,
  '+10',
      ],
      [
  62506389600, #    utc_start 1981-09-30 14:00:00 (Wed)
  62522118000, #      utc_end 1982-03-31 15:00:00 (Wed)
  62506422000, #  local_start 1981-09-30 23:00:00 (Wed)
  62522150400, #    local_end 1982-04-01 00:00:00 (Thu)
  32400,
  0,
  '+09',
      ],
      [
  62522118000, #    utc_start 1982-03-31 15:00:00 (Wed)
  62537925600, #      utc_end 1982-09-30 14:00:00 (Thu)
  62522154000, #  local_start 1982-04-01 01:00:00 (Thu)
  62537961600, #    local_end 1982-10-01 00:00:00 (Fri)
  36000,
  1,
  '+10',
      ],
      [
  62537925600, #    utc_start 1982-09-30 14:00:00 (Thu)
  62553654000, #      utc_end 1983-03-31 15:00:00 (Thu)
  62537958000, #  local_start 1982-09-30 23:00:00 (Thu)
  62553686400, #    local_end 1983-04-01 00:00:00 (Fri)
  32400,
  0,
  '+09',
      ],
      [
  62553654000, #    utc_start 1983-03-31 15:00:00 (Thu)
  62569461600, #      utc_end 1983-09-30 14:00:00 (Fri)
  62553690000, #  local_start 1983-04-01 01:00:00 (Fri)
  62569497600, #    local_end 1983-10-01 00:00:00 (Sat)
  36000,
  1,
  '+10',
      ],
      [
  62569461600, #    utc_start 1983-09-30 14:00:00 (Fri)
  62585276400, #      utc_end 1984-03-31 15:00:00 (Sat)
  62569494000, #  local_start 1983-09-30 23:00:00 (Fri)
  62585308800, #    local_end 1984-04-01 00:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  62585276400, #    utc_start 1984-03-31 15:00:00 (Sat)
  62601008400, #      utc_end 1984-09-29 17:00:00 (Sat)
  62585312400, #  local_start 1984-04-01 01:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  62601008400, #    utc_start 1984-09-29 17:00:00 (Sat)
  62616733200, #      utc_end 1985-03-30 17:00:00 (Sat)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  62616733200, #    utc_start 1985-03-30 17:00:00 (Sat)
  62632458000, #      utc_end 1985-09-28 17:00:00 (Sat)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  62632458000, #    utc_start 1985-09-28 17:00:00 (Sat)
  62648182800, #      utc_end 1986-03-29 17:00:00 (Sat)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  62648182800, #    utc_start 1986-03-29 17:00:00 (Sat)
  62663907600, #      utc_end 1986-09-27 17:00:00 (Sat)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  62663907600, #    utc_start 1986-09-27 17:00:00 (Sat)
  62679632400, #      utc_end 1987-03-28 17:00:00 (Sat)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  62679632400, #    utc_start 1987-03-28 17:00:00 (Sat)
  62695357200, #      utc_end 1987-09-26 17:00:00 (Sat)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  62695357200, #    utc_start 1987-09-26 17:00:00 (Sat)
  62711082000, #      utc_end 1988-03-26 17:00:00 (Sat)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  62711082000, #    utc_start 1988-03-26 17:00:00 (Sat)
  62726806800, #      utc_end 1988-09-24 17:00:00 (Sat)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  62726806800, #    utc_start 1988-09-24 17:00:00 (Sat)
  62742531600, #      utc_end 1989-03-25 17:00:00 (Sat)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  62742531600, #    utc_start 1989-03-25 17:00:00 (Sat)
  62758256400, #      utc_end 1989-09-23 17:00:00 (Sat)
  62742567600, #  local_start 1989-03-26 03:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  62758256400, #    utc_start 1989-09-23 17:00:00 (Sat)
  62773981200, #      utc_end 1990-03-24 17:00:00 (Sat)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  62773981200, #    utc_start 1990-03-24 17:00:00 (Sat)
  62790310800, #      utc_end 1990-09-29 17:00:00 (Sat)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  62790310800, #    utc_start 1990-09-29 17:00:00 (Sat)
  62806035600, #      utc_end 1991-03-30 17:00:00 (Sat)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  62806035600, #    utc_start 1991-03-30 17:00:00 (Sat)
  62821764000, #      utc_end 1991-09-28 18:00:00 (Sat)
  62806068000, #  local_start 1991-03-31 02:00:00 (Sun)
  62821796400, #    local_end 1991-09-29 03:00:00 (Sun)
  32400,
  1,
  '+09',
      ],
      [
  62821764000, #    utc_start 1991-09-28 18:00:00 (Sat)
  62831440800, #      utc_end 1992-01-18 18:00:00 (Sat)
  62821792800, #  local_start 1991-09-29 02:00:00 (Sun)
  62831469600, #    local_end 1992-01-19 02:00:00 (Sun)
  28800,
  0,
  '+08',
      ],
      [
  62831440800, #    utc_start 1992-01-18 18:00:00 (Sat)
  62837485200, #      utc_end 1992-03-28 17:00:00 (Sat)
  62831473200, #  local_start 1992-01-19 03:00:00 (Sun)
  62837517600, #    local_end 1992-03-29 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  62837485200, #    utc_start 1992-03-28 17:00:00 (Sat)
  62853210000, #      utc_end 1992-09-26 17:00:00 (Sat)
  62837521200, #  local_start 1992-03-29 03:00:00 (Sun)
  62853246000, #    local_end 1992-09-27 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  62853210000, #    utc_start 1992-09-26 17:00:00 (Sat)
  62868934800, #      utc_end 1993-03-27 17:00:00 (Sat)
  62853242400, #  local_start 1992-09-27 02:00:00 (Sun)
  62868967200, #    local_end 1993-03-28 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  62868934800, #    utc_start 1993-03-27 17:00:00 (Sat)
  62884659600, #      utc_end 1993-09-25 17:00:00 (Sat)
  62868970800, #  local_start 1993-03-28 03:00:00 (Sun)
  62884695600, #    local_end 1993-09-26 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  62884659600, #    utc_start 1993-09-25 17:00:00 (Sat)
  62900384400, #      utc_end 1994-03-26 17:00:00 (Sat)
  62884692000, #  local_start 1993-09-26 02:00:00 (Sun)
  62900416800, #    local_end 1994-03-27 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  62900384400, #    utc_start 1994-03-26 17:00:00 (Sat)
  62916109200, #      utc_end 1994-09-24 17:00:00 (Sat)
  62900420400, #  local_start 1994-03-27 03:00:00 (Sun)
  62916145200, #    local_end 1994-09-25 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  62916109200, #    utc_start 1994-09-24 17:00:00 (Sat)
  62931834000, #      utc_end 1995-03-25 17:00:00 (Sat)
  62916141600, #  local_start 1994-09-25 02:00:00 (Sun)
  62931866400, #    local_end 1995-03-26 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  62931834000, #    utc_start 1995-03-25 17:00:00 (Sat)
  62947558800, #      utc_end 1995-09-23 17:00:00 (Sat)
  62931870000, #  local_start 1995-03-26 03:00:00 (Sun)
  62947594800, #    local_end 1995-09-24 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  62947558800, #    utc_start 1995-09-23 17:00:00 (Sat)
  62963888400, #      utc_end 1996-03-30 17:00:00 (Sat)
  62947591200, #  local_start 1995-09-24 02:00:00 (Sun)
  62963920800, #    local_end 1996-03-31 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  62963888400, #    utc_start 1996-03-30 17:00:00 (Sat)
  62982032400, #      utc_end 1996-10-26 17:00:00 (Sat)
  62963924400, #  local_start 1996-03-31 03:00:00 (Sun)
  62982068400, #    local_end 1996-10-27 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  62982032400, #    utc_start 1996-10-26 17:00:00 (Sat)
  62995338000, #      utc_end 1997-03-29 17:00:00 (Sat)
  62982064800, #  local_start 1996-10-27 02:00:00 (Sun)
  62995370400, #    local_end 1997-03-30 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  62995338000, #    utc_start 1997-03-29 17:00:00 (Sat)
  63013482000, #      utc_end 1997-10-25 17:00:00 (Sat)
  62995374000, #  local_start 1997-03-30 03:00:00 (Sun)
  63013518000, #    local_end 1997-10-26 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  63013482000, #    utc_start 1997-10-25 17:00:00 (Sat)
  63026787600, #      utc_end 1998-03-28 17:00:00 (Sat)
  63013514400, #  local_start 1997-10-26 02:00:00 (Sun)
  63026820000, #    local_end 1998-03-29 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  63026787600, #    utc_start 1998-03-28 17:00:00 (Sat)
  63044931600, #      utc_end 1998-10-24 17:00:00 (Sat)
  63026823600, #  local_start 1998-03-29 03:00:00 (Sun)
  63044967600, #    local_end 1998-10-25 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  63044931600, #    utc_start 1998-10-24 17:00:00 (Sat)
  63058237200, #      utc_end 1999-03-27 17:00:00 (Sat)
  63044964000, #  local_start 1998-10-25 02:00:00 (Sun)
  63058269600, #    local_end 1999-03-28 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  63058237200, #    utc_start 1999-03-27 17:00:00 (Sat)
  63076986000, #      utc_end 1999-10-30 17:00:00 (Sat)
  63058273200, #  local_start 1999-03-28 03:00:00 (Sun)
  63077022000, #    local_end 1999-10-31 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  63076986000, #    utc_start 1999-10-30 17:00:00 (Sat)
  63089686800, #      utc_end 2000-03-25 17:00:00 (Sat)
  63077018400, #  local_start 1999-10-31 02:00:00 (Sun)
  63089719200, #    local_end 2000-03-26 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  63089686800, #    utc_start 2000-03-25 17:00:00 (Sat)
  63108435600, #      utc_end 2000-10-28 17:00:00 (Sat)
  63089722800, #  local_start 2000-03-26 03:00:00 (Sun)
  63108471600, #    local_end 2000-10-29 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  63108435600, #    utc_start 2000-10-28 17:00:00 (Sat)
  63121136400, #      utc_end 2001-03-24 17:00:00 (Sat)
  63108468000, #  local_start 2000-10-29 02:00:00 (Sun)
  63121168800, #    local_end 2001-03-25 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  63121136400, #    utc_start 2001-03-24 17:00:00 (Sat)
  63139885200, #      utc_end 2001-10-27 17:00:00 (Sat)
  63121172400, #  local_start 2001-03-25 03:00:00 (Sun)
  63139921200, #    local_end 2001-10-28 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  63139885200, #    utc_start 2001-10-27 17:00:00 (Sat)
  63153190800, #      utc_end 2002-03-30 17:00:00 (Sat)
  63139917600, #  local_start 2001-10-28 02:00:00 (Sun)
  63153223200, #    local_end 2002-03-31 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  63153190800, #    utc_start 2002-03-30 17:00:00 (Sat)
  63171334800, #      utc_end 2002-10-26 17:00:00 (Sat)
  63153226800, #  local_start 2002-03-31 03:00:00 (Sun)
  63171370800, #    local_end 2002-10-27 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  63171334800, #    utc_start 2002-10-26 17:00:00 (Sat)
  63184640400, #      utc_end 2003-03-29 17:00:00 (Sat)
  63171367200, #  local_start 2002-10-27 02:00:00 (Sun)
  63184672800, #    local_end 2003-03-30 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  63184640400, #    utc_start 2003-03-29 17:00:00 (Sat)
  63202784400, #      utc_end 2003-10-25 17:00:00 (Sat)
  63184676400, #  local_start 2003-03-30 03:00:00 (Sun)
  63202820400, #    local_end 2003-10-26 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  63202784400, #    utc_start 2003-10-25 17:00:00 (Sat)
  63216090000, #      utc_end 2004-03-27 17:00:00 (Sat)
  63202816800, #  local_start 2003-10-26 02:00:00 (Sun)
  63216122400, #    local_end 2004-03-28 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  63216090000, #    utc_start 2004-03-27 17:00:00 (Sat)
  63234838800, #      utc_end 2004-10-30 17:00:00 (Sat)
  63216126000, #  local_start 2004-03-28 03:00:00 (Sun)
  63234874800, #    local_end 2004-10-31 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  63234838800, #    utc_start 2004-10-30 17:00:00 (Sat)
  63247539600, #      utc_end 2005-03-26 17:00:00 (Sat)
  63234871200, #  local_start 2004-10-31 02:00:00 (Sun)
  63247572000, #    local_end 2005-03-27 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  63247539600, #    utc_start 2005-03-26 17:00:00 (Sat)
  63266288400, #      utc_end 2005-10-29 17:00:00 (Sat)
  63247575600, #  local_start 2005-03-27 03:00:00 (Sun)
  63266324400, #    local_end 2005-10-30 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  63266288400, #    utc_start 2005-10-29 17:00:00 (Sat)
  63278989200, #      utc_end 2006-03-25 17:00:00 (Sat)
  63266320800, #  local_start 2005-10-30 02:00:00 (Sun)
  63279021600, #    local_end 2006-03-26 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  63278989200, #    utc_start 2006-03-25 17:00:00 (Sat)
  63297738000, #      utc_end 2006-10-28 17:00:00 (Sat)
  63279025200, #  local_start 2006-03-26 03:00:00 (Sun)
  63297774000, #    local_end 2006-10-29 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  63297738000, #    utc_start 2006-10-28 17:00:00 (Sat)
  63310438800, #      utc_end 2007-03-24 17:00:00 (Sat)
  63297770400, #  local_start 2006-10-29 02:00:00 (Sun)
  63310471200, #    local_end 2007-03-25 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  63310438800, #    utc_start 2007-03-24 17:00:00 (Sat)
  63329187600, #      utc_end 2007-10-27 17:00:00 (Sat)
  63310474800, #  local_start 2007-03-25 03:00:00 (Sun)
  63329223600, #    local_end 2007-10-28 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  63329187600, #    utc_start 2007-10-27 17:00:00 (Sat)
  63342493200, #      utc_end 2008-03-29 17:00:00 (Sat)
  63329220000, #  local_start 2007-10-28 02:00:00 (Sun)
  63342525600, #    local_end 2008-03-30 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  63342493200, #    utc_start 2008-03-29 17:00:00 (Sat)
  63360637200, #      utc_end 2008-10-25 17:00:00 (Sat)
  63342529200, #  local_start 2008-03-30 03:00:00 (Sun)
  63360673200, #    local_end 2008-10-26 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  63360637200, #    utc_start 2008-10-25 17:00:00 (Sat)
  63373942800, #      utc_end 2009-03-28 17:00:00 (Sat)
  63360669600, #  local_start 2008-10-26 02:00:00 (Sun)
  63373975200, #    local_end 2009-03-29 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  63373942800, #    utc_start 2009-03-28 17:00:00 (Sat)
  63392086800, #      utc_end 2009-10-24 17:00:00 (Sat)
  63373978800, #  local_start 2009-03-29 03:00:00 (Sun)
  63392122800, #    local_end 2009-10-25 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  63392086800, #    utc_start 2009-10-24 17:00:00 (Sat)
  63405392400, #      utc_end 2010-03-27 17:00:00 (Sat)
  63392119200, #  local_start 2009-10-25 02:00:00 (Sun)
  63405424800, #    local_end 2010-03-28 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  63405392400, #    utc_start 2010-03-27 17:00:00 (Sat)
  63424141200, #      utc_end 2010-10-30 17:00:00 (Sat)
  63405428400, #  local_start 2010-03-28 03:00:00 (Sun)
  63424177200, #    local_end 2010-10-31 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  63424141200, #    utc_start 2010-10-30 17:00:00 (Sat)
  63436842000, #      utc_end 2011-03-26 17:00:00 (Sat)
  63424173600, #  local_start 2010-10-31 02:00:00 (Sun)
  63436874400, #    local_end 2011-03-27 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  63436842000, #    utc_start 2011-03-26 17:00:00 (Sat)
  63549936000, #      utc_end 2014-10-25 16:00:00 (Sat)
  63436878000, #  local_start 2011-03-27 03:00:00 (Sun)
  63549972000, #    local_end 2014-10-26 02:00:00 (Sun)
  36000,
  0,
  '+10',
      ],
      [
  63549936000, #    utc_start 2014-10-25 16:00:00 (Sat)
  63594698400, #      utc_end 2016-03-26 18:00:00 (Sat)
  63549964800, #  local_start 2014-10-26 00:00:00 (Sun)
  63594727200, #    local_end 2016-03-27 02:00:00 (Sun)
  28800,
  0,
  '+08',
      ],
      [
  63594698400, #    utc_start 2016-03-26 18:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  63594730800, #  local_start 2016-03-27 03:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  32400,
  0,
  '+09',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {30}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_CHITA

    $main::fatpacked{"DateTime/TimeZone/Asia/Choibalsan.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_CHOIBALSAN';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/asia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Choibalsan;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Choibalsan::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60102750120, #      utc_end 1905-07-31 16:22:00 (Mon)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60102777600, #    local_end 1905-08-01 00:00:00 (Tue)
  27480,
  0,
  'LMT',
      ],
      [
  60102750120, #    utc_start 1905-07-31 16:22:00 (Mon)
  62388118800, #      utc_end 1977-12-31 17:00:00 (Sat)
  60102775320, #  local_start 1905-07-31 23:22:00 (Mon)
  62388144000, #    local_end 1978-01-01 00:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62388118800, #    utc_start 1977-12-31 17:00:00 (Sat)
  62553657600, #      utc_end 1983-03-31 16:00:00 (Thu)
  62388147600, #  local_start 1978-01-01 01:00:00 (Sun)
  62553686400, #    local_end 1983-04-01 00:00:00 (Fri)
  28800,
  0,
  '+08',
      ],
      [
  62553657600, #    utc_start 1983-03-31 16:00:00 (Thu)
  62569461600, #      utc_end 1983-09-30 14:00:00 (Fri)
  62553693600, #  local_start 1983-04-01 02:00:00 (Fri)
  62569497600, #    local_end 1983-10-01 00:00:00 (Sat)
  36000,
  1,
  '+10',
      ],
      [
  62569461600, #    utc_start 1983-09-30 14:00:00 (Fri)
  62585276400, #      utc_end 1984-03-31 15:00:00 (Sat)
  62569494000, #  local_start 1983-09-30 23:00:00 (Fri)
  62585308800, #    local_end 1984-04-01 00:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  62585276400, #    utc_start 1984-03-31 15:00:00 (Sat)
  62600997600, #      utc_end 1984-09-29 14:00:00 (Sat)
  62585312400, #  local_start 1984-04-01 01:00:00 (Sun)
  62601033600, #    local_end 1984-09-30 00:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  62600997600, #    utc_start 1984-09-29 14:00:00 (Sat)
  62616726000, #      utc_end 1985-03-30 15:00:00 (Sat)
  62601030000, #  local_start 1984-09-29 23:00:00 (Sat)
  62616758400, #    local_end 1985-03-31 00:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  62616726000, #    utc_start 1985-03-30 15:00:00 (Sat)
  62632447200, #      utc_end 1985-09-28 14:00:00 (Sat)
  62616762000, #  local_start 1985-03-31 01:00:00 (Sun)
  62632483200, #    local_end 1985-09-29 00:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  62632447200, #    utc_start 1985-09-28 14:00:00 (Sat)
  62648175600, #      utc_end 1986-03-29 15:00:00 (Sat)
  62632479600, #  local_start 1985-09-28 23:00:00 (Sat)
  62648208000, #    local_end 1986-03-30 00:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  62648175600, #    utc_start 1986-03-29 15:00:00 (Sat)
  62663896800, #      utc_end 1986-09-27 14:00:00 (Sat)
  62648211600, #  local_start 1986-03-30 01:00:00 (Sun)
  62663932800, #    local_end 1986-09-28 00:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  62663896800, #    utc_start 1986-09-27 14:00:00 (Sat)
  62679625200, #      utc_end 1987-03-28 15:00:00 (Sat)
  62663929200, #  local_start 1986-09-27 23:00:00 (Sat)
  62679657600, #    local_end 1987-03-29 00:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  62679625200, #    utc_start 1987-03-28 15:00:00 (Sat)
  62695346400, #      utc_end 1987-09-26 14:00:00 (Sat)
  62679661200, #  local_start 1987-03-29 01:00:00 (Sun)
  62695382400, #    local_end 1987-09-27 00:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  62695346400, #    utc_start 1987-09-26 14:00:00 (Sat)
  62711074800, #      utc_end 1988-03-26 15:00:00 (Sat)
  62695378800, #  local_start 1987-09-26 23:00:00 (Sat)
  62711107200, #    local_end 1988-03-27 00:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  62711074800, #    utc_start 1988-03-26 15:00:00 (Sat)
  62726796000, #      utc_end 1988-09-24 14:00:00 (Sat)
  62711110800, #  local_start 1988-03-27 01:00:00 (Sun)
  62726832000, #    local_end 1988-09-25 00:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  62726796000, #    utc_start 1988-09-24 14:00:00 (Sat)
  62742524400, #      utc_end 1989-03-25 15:00:00 (Sat)
  62726828400, #  local_start 1988-09-24 23:00:00 (Sat)
  62742556800, #    local_end 1989-03-26 00:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  62742524400, #    utc_start 1989-03-25 15:00:00 (Sat)
  62758245600, #      utc_end 1989-09-23 14:00:00 (Sat)
  62742560400, #  local_start 1989-03-26 01:00:00 (Sun)
  62758281600, #    local_end 1989-09-24 00:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  62758245600, #    utc_start 1989-09-23 14:00:00 (Sat)
  62773974000, #      utc_end 1990-03-24 15:00:00 (Sat)
  62758278000, #  local_start 1989-09-23 23:00:00 (Sat)
  62774006400, #    local_end 1990-03-25 00:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  62773974000, #    utc_start 1990-03-24 15:00:00 (Sat)
  62790300000, #      utc_end 1990-09-29 14:00:00 (Sat)
  62774010000, #  local_start 1990-03-25 01:00:00 (Sun)
  62790336000, #    local_end 1990-09-30 00:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  62790300000, #    utc_start 1990-09-29 14:00:00 (Sat)
  62806028400, #      utc_end 1991-03-30 15:00:00 (Sat)
  62790332400, #  local_start 1990-09-29 23:00:00 (Sat)
  62806060800, #    local_end 1991-03-31 00:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  62806028400, #    utc_start 1991-03-30 15:00:00 (Sat)
  62821749600, #      utc_end 1991-09-28 14:00:00 (Sat)
  62806064400, #  local_start 1991-03-31 01:00:00 (Sun)
  62821785600, #    local_end 1991-09-29 00:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  62821749600, #    utc_start 1991-09-28 14:00:00 (Sat)
  62837478000, #      utc_end 1992-03-28 15:00:00 (Sat)
  62821782000, #  local_start 1991-09-28 23:00:00 (Sat)
  62837510400, #    local_end 1992-03-29 00:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  62837478000, #    utc_start 1992-03-28 15:00:00 (Sat)
  62853199200, #      utc_end 1992-09-26 14:00:00 (Sat)
  62837514000, #  local_start 1992-03-29 01:00:00 (Sun)
  62853235200, #    local_end 1992-09-27 00:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  62853199200, #    utc_start 1992-09-26 14:00:00 (Sat)
  62868927600, #      utc_end 1993-03-27 15:00:00 (Sat)
  62853231600, #  local_start 1992-09-26 23:00:00 (Sat)
  62868960000, #    local_end 1993-03-28 00:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  62868927600, #    utc_start 1993-03-27 15:00:00 (Sat)
  62884648800, #      utc_end 1993-09-25 14:00:00 (Sat)
  62868963600, #  local_start 1993-03-28 01:00:00 (Sun)
  62884684800, #    local_end 1993-09-26 00:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  62884648800, #    utc_start 1993-09-25 14:00:00 (Sat)
  62900377200, #      utc_end 1994-03-26 15:00:00 (Sat)
  62884681200, #  local_start 1993-09-25 23:00:00 (Sat)
  62900409600, #    local_end 1994-03-27 00:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  62900377200, #    utc_start 1994-03-26 15:00:00 (Sat)
  62916098400, #      utc_end 1994-09-24 14:00:00 (Sat)
  62900413200, #  local_start 1994-03-27 01:00:00 (Sun)
  62916134400, #    local_end 1994-09-25 00:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  62916098400, #    utc_start 1994-09-24 14:00:00 (Sat)
  62931826800, #      utc_end 1995-03-25 15:00:00 (Sat)
  62916130800, #  local_start 1994-09-24 23:00:00 (Sat)
  62931859200, #    local_end 1995-03-26 00:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  62931826800, #    utc_start 1995-03-25 15:00:00 (Sat)
  62947548000, #      utc_end 1995-09-23 14:00:00 (Sat)
  62931862800, #  local_start 1995-03-26 01:00:00 (Sun)
  62947584000, #    local_end 1995-09-24 00:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  62947548000, #    utc_start 1995-09-23 14:00:00 (Sat)
  62963881200, #      utc_end 1996-03-30 15:00:00 (Sat)
  62947580400, #  local_start 1995-09-23 23:00:00 (Sat)
  62963913600, #    local_end 1996-03-31 00:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  62963881200, #    utc_start 1996-03-30 15:00:00 (Sat)
  62979602400, #      utc_end 1996-09-28 14:00:00 (Sat)
  62963917200, #  local_start 1996-03-31 01:00:00 (Sun)
  62979638400, #    local_end 1996-09-29 00:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  62979602400, #    utc_start 1996-09-28 14:00:00 (Sat)
  62995330800, #      utc_end 1997-03-29 15:00:00 (Sat)
  62979634800, #  local_start 1996-09-28 23:00:00 (Sat)
  62995363200, #    local_end 1997-03-30 00:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  62995330800, #    utc_start 1997-03-29 15:00:00 (Sat)
  63011052000, #      utc_end 1997-09-27 14:00:00 (Sat)
  62995366800, #  local_start 1997-03-30 01:00:00 (Sun)
  63011088000, #    local_end 1997-09-28 00:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  63011052000, #    utc_start 1997-09-27 14:00:00 (Sat)
  63026780400, #      utc_end 1998-03-28 15:00:00 (Sat)
  63011084400, #  local_start 1997-09-27 23:00:00 (Sat)
  63026812800, #    local_end 1998-03-29 00:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  63026780400, #    utc_start 1998-03-28 15:00:00 (Sat)
  63042501600, #      utc_end 1998-09-26 14:00:00 (Sat)
  63026816400, #  local_start 1998-03-29 01:00:00 (Sun)
  63042537600, #    local_end 1998-09-27 00:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  63042501600, #    utc_start 1998-09-26 14:00:00 (Sat)
  63124074000, #      utc_end 2001-04-27 17:00:00 (Fri)
  63042534000, #  local_start 1998-09-26 23:00:00 (Sat)
  63124106400, #    local_end 2001-04-28 02:00:00 (Sat)
  32400,
  0,
  '+09',
      ],
      [
  63124074000, #    utc_start 2001-04-27 17:00:00 (Fri)
  63137376000, #      utc_end 2001-09-28 16:00:00 (Fri)
  63124110000, #  local_start 2001-04-28 03:00:00 (Sat)
  63137412000, #    local_end 2001-09-29 02:00:00 (Sat)
  36000,
  1,
  '+10',
      ],
      [
  63137376000, #    utc_start 2001-09-28 16:00:00 (Fri)
  63153104400, #      utc_end 2002-03-29 17:00:00 (Fri)
  63137408400, #  local_start 2001-09-29 01:00:00 (Sat)
  63153136800, #    local_end 2002-03-30 02:00:00 (Sat)
  32400,
  0,
  '+09',
      ],
      [
  63153104400, #    utc_start 2002-03-29 17:00:00 (Fri)
  63168825600, #      utc_end 2002-09-27 16:00:00 (Fri)
  63153140400, #  local_start 2002-03-30 03:00:00 (Sat)
  63168861600, #    local_end 2002-09-28 02:00:00 (Sat)
  36000,
  1,
  '+10',
      ],
      [
  63168825600, #    utc_start 2002-09-27 16:00:00 (Fri)
  63184554000, #      utc_end 2003-03-28 17:00:00 (Fri)
  63168858000, #  local_start 2002-09-28 01:00:00 (Sat)
  63184586400, #    local_end 2003-03-29 02:00:00 (Sat)
  32400,
  0,
  '+09',
      ],
      [
  63184554000, #    utc_start 2003-03-28 17:00:00 (Fri)
  63200275200, #      utc_end 2003-09-26 16:00:00 (Fri)
  63184590000, #  local_start 2003-03-29 03:00:00 (Sat)
  63200311200, #    local_end 2003-09-27 02:00:00 (Sat)
  36000,
  1,
  '+10',
      ],
      [
  63200275200, #    utc_start 2003-09-26 16:00:00 (Fri)
  63216003600, #      utc_end 2004-03-26 17:00:00 (Fri)
  63200307600, #  local_start 2003-09-27 01:00:00 (Sat)
  63216036000, #    local_end 2004-03-27 02:00:00 (Sat)
  32400,
  0,
  '+09',
      ],
      [
  63216003600, #    utc_start 2004-03-26 17:00:00 (Fri)
  63231724800, #      utc_end 2004-09-24 16:00:00 (Fri)
  63216039600, #  local_start 2004-03-27 03:00:00 (Sat)
  63231760800, #    local_end 2004-09-25 02:00:00 (Sat)
  36000,
  1,
  '+10',
      ],
      [
  63231724800, #    utc_start 2004-09-24 16:00:00 (Fri)
  63247453200, #      utc_end 2005-03-25 17:00:00 (Fri)
  63231757200, #  local_start 2004-09-25 01:00:00 (Sat)
  63247485600, #    local_end 2005-03-26 02:00:00 (Sat)
  32400,
  0,
  '+09',
      ],
      [
  63247453200, #    utc_start 2005-03-25 17:00:00 (Fri)
  63263174400, #      utc_end 2005-09-23 16:00:00 (Fri)
  63247489200, #  local_start 2005-03-26 03:00:00 (Sat)
  63263210400, #    local_end 2005-09-24 02:00:00 (Sat)
  36000,
  1,
  '+10',
      ],
      [
  63263174400, #    utc_start 2005-09-23 16:00:00 (Fri)
  63278902800, #      utc_end 2006-03-24 17:00:00 (Fri)
  63263206800, #  local_start 2005-09-24 01:00:00 (Sat)
  63278935200, #    local_end 2006-03-25 02:00:00 (Sat)
  32400,
  0,
  '+09',
      ],
      [
  63278902800, #    utc_start 2006-03-24 17:00:00 (Fri)
  63295228800, #      utc_end 2006-09-29 16:00:00 (Fri)
  63278938800, #  local_start 2006-03-25 03:00:00 (Sat)
  63295264800, #    local_end 2006-09-30 02:00:00 (Sat)
  36000,
  1,
  '+10',
      ],
      [
  63295228800, #    utc_start 2006-09-29 16:00:00 (Fri)
  63342572400, #      utc_end 2008-03-30 15:00:00 (Sun)
  63295261200, #  local_start 2006-09-30 01:00:00 (Sat)
  63342604800, #    local_end 2008-03-31 00:00:00 (Mon)
  32400,
  0,
  '+09',
      ],
      [
  63342572400, #    utc_start 2008-03-30 15:00:00 (Sun)
  63563162400, #      utc_end 2015-03-27 18:00:00 (Fri)
  63342601200, #  local_start 2008-03-30 23:00:00 (Sun)
  63563191200, #    local_end 2015-03-28 02:00:00 (Sat)
  28800,
  0,
  '+08',
      ],
      [
  63563162400, #    utc_start 2015-03-27 18:00:00 (Fri)
  63578876400, #      utc_end 2015-09-25 15:00:00 (Fri)
  63563194800, #  local_start 2015-03-28 03:00:00 (Sat)
  63578908800, #    local_end 2015-09-26 00:00:00 (Sat)
  32400,
  1,
  '+09',
      ],
      [
  63578876400, #    utc_start 2015-09-25 15:00:00 (Fri)
  63594612000, #      utc_end 2016-03-25 18:00:00 (Fri)
  63578905200, #  local_start 2015-09-25 23:00:00 (Fri)
  63594640800, #    local_end 2016-03-26 02:00:00 (Sat)
  28800,
  0,
  '+08',
      ],
      [
  63594612000, #    utc_start 2016-03-25 18:00:00 (Fri)
  63610326000, #      utc_end 2016-09-23 15:00:00 (Fri)
  63594644400, #  local_start 2016-03-26 03:00:00 (Sat)
  63610358400, #    local_end 2016-09-24 00:00:00 (Sat)
  32400,
  1,
  '+09',
      ],
      [
  63610326000, #    utc_start 2016-09-23 15:00:00 (Fri)
  DateTime::TimeZone::INFINITY, #      utc_end
  63610354800, #  local_start 2016-09-23 23:00:00 (Fri)
  DateTime::TimeZone::INFINITY, #    local_end
  28800,
  0,
  '+08',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {24}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_CHOIBALSAN

    $main::fatpacked{"DateTime/TimeZone/Asia/Colombo.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_COLOMBO';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/asia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Colombo;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Colombo::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59295523236, #      utc_end 1879-12-31 18:40:36 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59295542400, #    local_end 1880-01-01 00:00:00 (Thu)
  19164,
  0,
  'LMT',
      ],
      [
  59295523236, #    utc_start 1879-12-31 18:40:36 (Wed)
  60115977628, #      utc_end 1905-12-31 18:40:28 (Sun)
  59295542408, #  local_start 1880-01-01 00:00:08 (Thu)
  60115996800, #    local_end 1906-01-01 00:00:00 (Mon)
  19172,
  0,
  'MMT',
      ],
      [
  60115977628, #    utc_start 1905-12-31 18:40:28 (Sun)
  61252396200, #      utc_end 1942-01-04 18:30:00 (Sun)
  60115997428, #  local_start 1906-01-01 00:10:28 (Mon)
  61252416000, #    local_end 1942-01-05 00:00:00 (Mon)
  19800,
  0,
  '+0530',
      ],
      [
  61252396200, #    utc_start 1942-01-04 18:30:00 (Sun)
  61273044000, #      utc_end 1942-08-31 18:00:00 (Mon)
  61252417800, #  local_start 1942-01-05 00:30:00 (Mon)
  61273065600, #    local_end 1942-09-01 00:00:00 (Tue)
  21600,
  1,
  '+06',
      ],
      [
  61273044000, #    utc_start 1942-08-31 18:00:00 (Mon)
  61371631800, #      utc_end 1945-10-15 19:30:00 (Mon)
  61273067400, #  local_start 1942-09-01 00:30:00 (Tue)
  61371655200, #    local_end 1945-10-16 02:00:00 (Tue)
  23400,
  1,
  '+0630',
      ],
      [
  61371631800, #    utc_start 1945-10-15 19:30:00 (Mon)
  62968645800, #      utc_end 1996-05-24 18:30:00 (Fri)
  61371651600, #  local_start 1945-10-16 01:00:00 (Tue)
  62968665600, #    local_end 1996-05-25 00:00:00 (Sat)
  19800,
  0,
  '+0530',
      ],
      [
  62968645800, #    utc_start 1996-05-24 18:30:00 (Fri)
  62981949600, #      utc_end 1996-10-25 18:00:00 (Fri)
  62968669200, #  local_start 1996-05-25 01:00:00 (Sat)
  62981973000, #    local_end 1996-10-26 00:30:00 (Sat)
  23400,
  0,
  '+0630',
      ],
      [
  62981949600, #    utc_start 1996-10-25 18:00:00 (Fri)
  63280722600, #      utc_end 2006-04-14 18:30:00 (Fri)
  62981971200, #  local_start 1996-10-26 00:00:00 (Sat)
  63280744200, #    local_end 2006-04-15 00:30:00 (Sat)
  21600,
  0,
  '+06',
      ],
      [
  63280722600, #    utc_start 2006-04-14 18:30:00 (Fri)
  DateTime::TimeZone::INFINITY, #      utc_end
  63280742400, #  local_start 2006-04-15 00:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #    local_end
  19800,
  0,
  '+0530',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {2}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_COLOMBO

    $main::fatpacked{"DateTime/TimeZone/Asia/Damascus.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_DAMASCUS';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/asia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Damascus;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Damascus::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60557751288, #      utc_end 1919-12-31 21:34:48 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60557760000, #    local_end 1920-01-01 00:00:00 (Thu)
  8712,
  0,
  'LMT',
      ],
      [
  60557751288, #    utc_start 1919-12-31 21:34:48 (Wed)
  60567091200, #      utc_end 1920-04-18 00:00:00 (Sun)
  60557758488, #  local_start 1919-12-31 23:34:48 (Wed)
  60567098400, #    local_end 1920-04-18 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  60567091200, #    utc_start 1920-04-18 00:00:00 (Sun)
  60581602800, #      utc_end 1920-10-02 23:00:00 (Sat)
  60567102000, #  local_start 1920-04-18 03:00:00 (Sun)
  60581613600, #    local_end 1920-10-03 02:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  60581602800, #    utc_start 1920-10-02 23:00:00 (Sat)
  60598540800, #      utc_end 1921-04-17 00:00:00 (Sun)
  60581610000, #  local_start 1920-10-03 01:00:00 (Sun)
  60598548000, #    local_end 1921-04-17 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  60598540800, #    utc_start 1921-04-17 00:00:00 (Sun)
  60613052400, #      utc_end 1921-10-01 23:00:00 (Sat)
  60598551600, #  local_start 1921-04-17 03:00:00 (Sun)
  60613063200, #    local_end 1921-10-02 02:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  60613052400, #    utc_start 1921-10-01 23:00:00 (Sat)
  60629990400, #      utc_end 1922-04-16 00:00:00 (Sun)
  60613059600, #  local_start 1921-10-02 01:00:00 (Sun)
  60629997600, #    local_end 1922-04-16 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  60629990400, #    utc_start 1922-04-16 00:00:00 (Sun)
  60644502000, #      utc_end 1922-09-30 23:00:00 (Sat)
  60630001200, #  local_start 1922-04-16 03:00:00 (Sun)
  60644512800, #    local_end 1922-10-01 02:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  60644502000, #    utc_start 1922-09-30 23:00:00 (Sat)
  60661440000, #      utc_end 1923-04-15 00:00:00 (Sun)
  60644509200, #  local_start 1922-10-01 01:00:00 (Sun)
  60661447200, #    local_end 1923-04-15 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  60661440000, #    utc_start 1923-04-15 00:00:00 (Sun)
  60676556400, #      utc_end 1923-10-06 23:00:00 (Sat)
  60661450800, #  local_start 1923-04-15 03:00:00 (Sun)
  60676567200, #    local_end 1923-10-07 02:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  60676556400, #    utc_start 1923-10-06 23:00:00 (Sat)
  61893417600, #      utc_end 1962-04-29 00:00:00 (Sun)
  60676563600, #  local_start 1923-10-07 01:00:00 (Sun)
  61893424800, #    local_end 1962-04-29 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  61893417600, #    utc_start 1962-04-29 00:00:00 (Sun)
  61906806000, #      utc_end 1962-09-30 23:00:00 (Sun)
  61893428400, #  local_start 1962-04-29 03:00:00 (Sun)
  61906816800, #    local_end 1962-10-01 02:00:00 (Mon)
  10800,
  1,
  'EEST',
      ],
      [
  61906806000, #    utc_start 1962-09-30 23:00:00 (Sun)
  61925126400, #      utc_end 1963-05-01 00:00:00 (Wed)
  61906813200, #  local_start 1962-10-01 01:00:00 (Mon)
  61925133600, #    local_end 1963-05-01 02:00:00 (Wed)
  7200,
  0,
  'EET',
      ],
      [
  61925126400, #    utc_start 1963-05-01 00:00:00 (Wed)
  61938255600, #      utc_end 1963-09-29 23:00:00 (Sun)
  61925137200, #  local_start 1963-05-01 03:00:00 (Wed)
  61938266400, #    local_end 1963-09-30 02:00:00 (Mon)
  10800,
  1,
  'EEST',
      ],
      [
  61938255600, #    utc_start 1963-09-29 23:00:00 (Sun)
  61956748800, #      utc_end 1964-05-01 00:00:00 (Fri)
  61938262800, #  local_start 1963-09-30 01:00:00 (Mon)
  61956756000, #    local_end 1964-05-01 02:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  61956748800, #    utc_start 1964-05-01 00:00:00 (Fri)
  61969964400, #      utc_end 1964-09-30 23:00:00 (Wed)
  61956759600, #  local_start 1964-05-01 03:00:00 (Fri)
  61969975200, #    local_end 1964-10-01 02:00:00 (Thu)
  10800,
  1,
  'EEST',
      ],
      [
  61969964400, #    utc_start 1964-09-30 23:00:00 (Wed)
  61988284800, #      utc_end 1965-05-01 00:00:00 (Sat)
  61969971600, #  local_start 1964-10-01 01:00:00 (Thu)
  61988292000, #    local_end 1965-05-01 02:00:00 (Sat)
  7200,
  0,
  'EET',
      ],
      [
  61988284800, #    utc_start 1965-05-01 00:00:00 (Sat)
  62001414000, #      utc_end 1965-09-29 23:00:00 (Wed)
  61988295600, #  local_start 1965-05-01 03:00:00 (Sat)
  62001424800, #    local_end 1965-09-30 02:00:00 (Thu)
  10800,
  1,
  'EEST',
      ],
      [
  62001414000, #    utc_start 1965-09-29 23:00:00 (Wed)
  62019216000, #      utc_end 1966-04-24 00:00:00 (Sun)
  62001421200, #  local_start 1965-09-30 01:00:00 (Thu)
  62019223200, #    local_end 1966-04-24 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62019216000, #    utc_start 1966-04-24 00:00:00 (Sun)
  62033036400, #      utc_end 1966-09-30 23:00:00 (Fri)
  62019226800, #  local_start 1966-04-24 03:00:00 (Sun)
  62033047200, #    local_end 1966-10-01 02:00:00 (Sat)
  10800,
  1,
  'EEST',
      ],
      [
  62033036400, #    utc_start 1966-09-30 23:00:00 (Fri)
  62051356800, #      utc_end 1967-05-01 00:00:00 (Mon)
  62033043600, #  local_start 1966-10-01 01:00:00 (Sat)
  62051364000, #    local_end 1967-05-01 02:00:00 (Mon)
  7200,
  0,
  'EET',
      ],
      [
  62051356800, #    utc_start 1967-05-01 00:00:00 (Mon)
  62064572400, #      utc_end 1967-09-30 23:00:00 (Sat)
  62051367600, #  local_start 1967-05-01 03:00:00 (Mon)
  62064583200, #    local_end 1967-10-01 02:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62064572400, #    utc_start 1967-09-30 23:00:00 (Sat)
  62082979200, #      utc_end 1968-05-01 00:00:00 (Wed)
  62064579600, #  local_start 1967-10-01 01:00:00 (Sun)
  62082986400, #    local_end 1968-05-01 02:00:00 (Wed)
  7200,
  0,
  'EET',
      ],
      [
  62082979200, #    utc_start 1968-05-01 00:00:00 (Wed)
  62096194800, #      utc_end 1968-09-30 23:00:00 (Mon)
  62082990000, #  local_start 1968-05-01 03:00:00 (Wed)
  62096205600, #    local_end 1968-10-01 02:00:00 (Tue)
  10800,
  1,
  'EEST',
      ],
      [
  62096194800, #    utc_start 1968-09-30 23:00:00 (Mon)
  62114515200, #      utc_end 1969-05-01 00:00:00 (Thu)
  62096202000, #  local_start 1968-10-01 01:00:00 (Tue)
  62114522400, #    local_end 1969-05-01 02:00:00 (Thu)
  7200,
  0,
  'EET',
      ],
      [
  62114515200, #    utc_start 1969-05-01 00:00:00 (Thu)
  62127730800, #      utc_end 1969-09-30 23:00:00 (Tue)
  62114526000, #  local_start 1969-05-01 03:00:00 (Thu)
  62127741600, #    local_end 1969-10-01 02:00:00 (Wed)
  10800,
  1,
  'EEST',
      ],
      [
  62127730800, #    utc_start 1969-09-30 23:00:00 (Tue)
  62146051200, #      utc_end 1970-05-01 00:00:00 (Fri)
  62127738000, #  local_start 1969-10-01 01:00:00 (Wed)
  62146058400, #    local_end 1970-05-01 02:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  62146051200, #    utc_start 1970-05-01 00:00:00 (Fri)
  62159266800, #      utc_end 1970-09-30 23:00:00 (Wed)
  62146062000, #  local_start 1970-05-01 03:00:00 (Fri)
  62159277600, #    local_end 1970-10-01 02:00:00 (Thu)
  10800,
  1,
  'EEST',
      ],
      [
  62159266800, #    utc_start 1970-09-30 23:00:00 (Wed)
  62177587200, #      utc_end 1971-05-01 00:00:00 (Sat)
  62159274000, #  local_start 1970-10-01 01:00:00 (Thu)
  62177594400, #    local_end 1971-05-01 02:00:00 (Sat)
  7200,
  0,
  'EET',
      ],
      [
  62177587200, #    utc_start 1971-05-01 00:00:00 (Sat)
  62190802800, #      utc_end 1971-09-30 23:00:00 (Thu)
  62177598000, #  local_start 1971-05-01 03:00:00 (Sat)
  62190813600, #    local_end 1971-10-01 02:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  62190802800, #    utc_start 1971-09-30 23:00:00 (Thu)
  62209209600, #      utc_end 1972-05-01 00:00:00 (Mon)
  62190810000, #  local_start 1971-10-01 01:00:00 (Fri)
  62209216800, #    local_end 1972-05-01 02:00:00 (Mon)
  7200,
  0,
  'EET',
      ],
      [
  62209209600, #    utc_start 1972-05-01 00:00:00 (Mon)
  62222425200, #      utc_end 1972-09-30 23:00:00 (Sat)
  62209220400, #  local_start 1972-05-01 03:00:00 (Mon)
  62222436000, #    local_end 1972-10-01 02:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62222425200, #    utc_start 1972-09-30 23:00:00 (Sat)
  62240745600, #      utc_end 1973-05-01 00:00:00 (Tue)
  62222432400, #  local_start 1972-10-01 01:00:00 (Sun)
  62240752800, #    local_end 1973-05-01 02:00:00 (Tue)
  7200,
  0,
  'EET',
      ],
      [
  62240745600, #    utc_start 1973-05-01 00:00:00 (Tue)
  62253961200, #      utc_end 1973-09-30 23:00:00 (Sun)
  62240756400, #  local_start 1973-05-01 03:00:00 (Tue)
  62253972000, #    local_end 1973-10-01 02:00:00 (Mon)
  10800,
  1,
  'EEST',
      ],
      [
  62253961200, #    utc_start 1973-09-30 23:00:00 (Sun)
  62272281600, #      utc_end 1974-05-01 00:00:00 (Wed)
  62253968400, #  local_start 1973-10-01 01:00:00 (Mon)
  62272288800, #    local_end 1974-05-01 02:00:00 (Wed)
  7200,
  0,
  'EET',
      ],
      [
  62272281600, #    utc_start 1974-05-01 00:00:00 (Wed)
  62285497200, #      utc_end 1974-09-30 23:00:00 (Mon)
  62272292400, #  local_start 1974-05-01 03:00:00 (Wed)
  62285508000, #    local_end 1974-10-01 02:00:00 (Tue)
  10800,
  1,
  'EEST',
      ],
      [
  62285497200, #    utc_start 1974-09-30 23:00:00 (Mon)
  62303817600, #      utc_end 1975-05-01 00:00:00 (Thu)
  62285504400, #  local_start 1974-10-01 01:00:00 (Tue)
  62303824800, #    local_end 1975-05-01 02:00:00 (Thu)
  7200,
  0,
  'EET',
      ],
      [
  62303817600, #    utc_start 1975-05-01 00:00:00 (Thu)
  62317033200, #      utc_end 1975-09-30 23:00:00 (Tue)
  62303828400, #  local_start 1975-05-01 03:00:00 (Thu)
  62317044000, #    local_end 1975-10-01 02:00:00 (Wed)
  10800,
  1,
  'EEST',
      ],
      [
  62317033200, #    utc_start 1975-09-30 23:00:00 (Tue)
  62335440000, #      utc_end 1976-05-01 00:00:00 (Sat)
  62317040400, #  local_start 1975-10-01 01:00:00 (Wed)
  62335447200, #    local_end 1976-05-01 02:00:00 (Sat)
  7200,
  0,
  'EET',
      ],
      [
  62335440000, #    utc_start 1976-05-01 00:00:00 (Sat)
  62348655600, #      utc_end 1976-09-30 23:00:00 (Thu)
  62335450800, #  local_start 1976-05-01 03:00:00 (Sat)
  62348666400, #    local_end 1976-10-01 02:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  62348655600, #    utc_start 1976-09-30 23:00:00 (Thu)
  62366976000, #      utc_end 1977-05-01 00:00:00 (Sun)
  62348662800, #  local_start 1976-10-01 01:00:00 (Fri)
  62366983200, #    local_end 1977-05-01 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62366976000, #    utc_start 1977-05-01 00:00:00 (Sun)
  62377599600, #      utc_end 1977-08-31 23:00:00 (Wed)
  62366986800, #  local_start 1977-05-01 03:00:00 (Sun)
  62377610400, #    local_end 1977-09-01 02:00:00 (Thu)
  10800,
  1,
  'EEST',
      ],
      [
  62377599600, #    utc_start 1977-08-31 23:00:00 (Wed)
  62398512000, #      utc_end 1978-05-01 00:00:00 (Mon)
  62377606800, #  local_start 1977-09-01 01:00:00 (Thu)
  62398519200, #    local_end 1978-05-01 02:00:00 (Mon)
  7200,
  0,
  'EET',
      ],
      [
  62398512000, #    utc_start 1978-05-01 00:00:00 (Mon)
  62409135600, #      utc_end 1978-08-31 23:00:00 (Thu)
  62398522800, #  local_start 1978-05-01 03:00:00 (Mon)
  62409146400, #    local_end 1978-09-01 02:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  62409135600, #    utc_start 1978-08-31 23:00:00 (Thu)
  62554377600, #      utc_end 1983-04-09 00:00:00 (Sat)
  62409142800, #  local_start 1978-09-01 01:00:00 (Fri)
  62554384800, #    local_end 1983-04-09 02:00:00 (Sat)
  7200,
  0,
  'EET',
      ],
      [
  62554377600, #    utc_start 1983-04-09 00:00:00 (Sat)
  62569494000, #      utc_end 1983-09-30 23:00:00 (Fri)
  62554388400, #  local_start 1983-04-09 03:00:00 (Sat)
  62569504800, #    local_end 1983-10-01 02:00:00 (Sat)
  10800,
  1,
  'EEST',
      ],
      [
  62569494000, #    utc_start 1983-09-30 23:00:00 (Fri)
  62586000000, #      utc_end 1984-04-09 00:00:00 (Mon)
  62569501200, #  local_start 1983-10-01 01:00:00 (Sat)
  62586007200, #    local_end 1984-04-09 02:00:00 (Mon)
  7200,
  0,
  'EET',
      ],
      [
  62586000000, #    utc_start 1984-04-09 00:00:00 (Mon)
  62601116400, #      utc_end 1984-09-30 23:00:00 (Sun)
  62586010800, #  local_start 1984-04-09 03:00:00 (Mon)
  62601127200, #    local_end 1984-10-01 02:00:00 (Mon)
  10800,
  1,
  'EEST',
      ],
      [
  62601116400, #    utc_start 1984-09-30 23:00:00 (Sun)
  62644579200, #      utc_end 1986-02-16 00:00:00 (Sun)
  62601123600, #  local_start 1984-10-01 01:00:00 (Mon)
  62644586400, #    local_end 1986-02-16 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62644579200, #    utc_start 1986-02-16 00:00:00 (Sun)
  62664879600, #      utc_end 1986-10-08 23:00:00 (Wed)
  62644590000, #  local_start 1986-02-16 03:00:00 (Sun)
  62664890400, #    local_end 1986-10-09 02:00:00 (Thu)
  10800,
  1,
  'EEST',
      ],
      [
  62664879600, #    utc_start 1986-10-08 23:00:00 (Wed)
  62677238400, #      utc_end 1987-03-01 00:00:00 (Sun)
  62664886800, #  local_start 1986-10-09 01:00:00 (Thu)
  62677245600, #    local_end 1987-03-01 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62677238400, #    utc_start 1987-03-01 00:00:00 (Sun)
  62698316400, #      utc_end 1987-10-30 23:00:00 (Fri)
  62677249200, #  local_start 1987-03-01 03:00:00 (Sun)
  62698327200, #    local_end 1987-10-31 02:00:00 (Sat)
  10800,
  1,
  'EEST',
      ],
      [
  62698316400, #    utc_start 1987-10-30 23:00:00 (Fri)
  62710070400, #      utc_end 1988-03-15 00:00:00 (Tue)
  62698323600, #  local_start 1987-10-31 01:00:00 (Sat)
  62710077600, #    local_end 1988-03-15 02:00:00 (Tue)
  7200,
  0,
  'EET',
      ],
      [
  62710070400, #    utc_start 1988-03-15 00:00:00 (Tue)
  62729938800, #      utc_end 1988-10-30 23:00:00 (Sun)
  62710081200, #  local_start 1988-03-15 03:00:00 (Tue)
  62729949600, #    local_end 1988-10-31 02:00:00 (Mon)
  10800,
  1,
  'EEST',
      ],
      [
  62729938800, #    utc_start 1988-10-30 23:00:00 (Sun)
  62742988800, #      utc_end 1989-03-31 00:00:00 (Fri)
  62729946000, #  local_start 1988-10-31 01:00:00 (Mon)
  62742996000, #    local_end 1989-03-31 02:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  62742988800, #    utc_start 1989-03-31 00:00:00 (Fri)
  62758882800, #      utc_end 1989-09-30 23:00:00 (Sat)
  62742999600, #  local_start 1989-03-31 03:00:00 (Fri)
  62758893600, #    local_end 1989-10-01 02:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62758882800, #    utc_start 1989-09-30 23:00:00 (Sat)
  62774611200, #      utc_end 1990-04-01 00:00:00 (Sun)
  62758890000, #  local_start 1989-10-01 01:00:00 (Sun)
  62774618400, #    local_end 1990-04-01 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62774611200, #    utc_start 1990-04-01 00:00:00 (Sun)
  62790332400, #      utc_end 1990-09-29 23:00:00 (Sat)
  62774622000, #  local_start 1990-04-01 03:00:00 (Sun)
  62790343200, #    local_end 1990-09-30 02:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62790332400, #    utc_start 1990-09-29 23:00:00 (Sat)
  62806140000, #      utc_end 1991-03-31 22:00:00 (Sun)
  62790339600, #  local_start 1990-09-30 01:00:00 (Sun)
  62806147200, #    local_end 1991-04-01 00:00:00 (Mon)
  7200,
  0,
  'EET',
      ],
      [
  62806140000, #    utc_start 1991-03-31 22:00:00 (Sun)
  62821947600, #      utc_end 1991-09-30 21:00:00 (Mon)
  62806150800, #  local_start 1991-04-01 01:00:00 (Mon)
  62821958400, #    local_end 1991-10-01 00:00:00 (Tue)
  10800,
  1,
  'EEST',
      ],
      [
  62821947600, #    utc_start 1991-09-30 21:00:00 (Mon)
  62838367200, #      utc_end 1992-04-07 22:00:00 (Tue)
  62821954800, #  local_start 1991-09-30 23:00:00 (Mon)
  62838374400, #    local_end 1992-04-08 00:00:00 (Wed)
  7200,
  0,
  'EET',
      ],
      [
  62838367200, #    utc_start 1992-04-07 22:00:00 (Tue)
  62853570000, #      utc_end 1992-09-30 21:00:00 (Wed)
  62838378000, #  local_start 1992-04-08 01:00:00 (Wed)
  62853580800, #    local_end 1992-10-01 00:00:00 (Thu)
  10800,
  1,
  'EEST',
      ],
      [
  62853570000, #    utc_start 1992-09-30 21:00:00 (Wed)
  62868780000, #      utc_end 1993-03-25 22:00:00 (Thu)
  62853577200, #  local_start 1992-09-30 23:00:00 (Wed)
  62868787200, #    local_end 1993-03-26 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  62868780000, #    utc_start 1993-03-25 22:00:00 (Thu)
  62884587600, #      utc_end 1993-09-24 21:00:00 (Fri)
  62868790800, #  local_start 1993-03-26 01:00:00 (Fri)
  62884598400, #    local_end 1993-09-25 00:00:00 (Sat)
  10800,
  1,
  'EEST',
      ],
      [
  62884587600, #    utc_start 1993-09-24 21:00:00 (Fri)
  62900834400, #      utc_end 1994-03-31 22:00:00 (Thu)
  62884594800, #  local_start 1993-09-24 23:00:00 (Fri)
  62900841600, #    local_end 1994-04-01 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  62900834400, #    utc_start 1994-03-31 22:00:00 (Thu)
  62916642000, #      utc_end 1994-09-30 21:00:00 (Fri)
  62900845200, #  local_start 1994-04-01 01:00:00 (Fri)
  62916652800, #    local_end 1994-10-01 00:00:00 (Sat)
  10800,
  1,
  'EEST',
      ],
      [
  62916642000, #    utc_start 1994-09-30 21:00:00 (Fri)
  62932370400, #      utc_end 1995-03-31 22:00:00 (Fri)
  62916649200, #  local_start 1994-09-30 23:00:00 (Fri)
  62932377600, #    local_end 1995-04-01 00:00:00 (Sat)
  7200,
  0,
  'EET',
      ],
      [
  62932370400, #    utc_start 1995-03-31 22:00:00 (Fri)
  62948178000, #      utc_end 1995-09-30 21:00:00 (Sat)
  62932381200, #  local_start 1995-04-01 01:00:00 (Sat)
  62948188800, #    local_end 1995-10-01 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62948178000, #    utc_start 1995-09-30 21:00:00 (Sat)
  62963992800, #      utc_end 1996-03-31 22:00:00 (Sun)
  62948185200, #  local_start 1995-09-30 23:00:00 (Sat)
  62964000000, #    local_end 1996-04-01 00:00:00 (Mon)
  7200,
  0,
  'EET',
      ],
      [
  62963992800, #    utc_start 1996-03-31 22:00:00 (Sun)
  62979800400, #      utc_end 1996-09-30 21:00:00 (Mon)
  62964003600, #  local_start 1996-04-01 01:00:00 (Mon)
  62979811200, #    local_end 1996-10-01 00:00:00 (Tue)
  10800,
  1,
  'EEST',
      ],
      [
  62979800400, #    utc_start 1996-09-30 21:00:00 (Mon)
  62995442400, #      utc_end 1997-03-30 22:00:00 (Sun)
  62979807600, #  local_start 1996-09-30 23:00:00 (Mon)
  62995449600, #    local_end 1997-03-31 00:00:00 (Mon)
  7200,
  0,
  'EET',
      ],
      [
  62995442400, #    utc_start 1997-03-30 22:00:00 (Sun)
  63011336400, #      utc_end 1997-09-30 21:00:00 (Tue)
  62995453200, #  local_start 1997-03-31 01:00:00 (Mon)
  63011347200, #    local_end 1997-10-01 00:00:00 (Wed)
  10800,
  1,
  'EEST',
      ],
      [
  63011336400, #    utc_start 1997-09-30 21:00:00 (Tue)
  63026892000, #      utc_end 1998-03-29 22:00:00 (Sun)
  63011343600, #  local_start 1997-09-30 23:00:00 (Tue)
  63026899200, #    local_end 1998-03-30 00:00:00 (Mon)
  7200,
  0,
  'EET',
      ],
      [
  63026892000, #    utc_start 1998-03-29 22:00:00 (Sun)
  63042872400, #      utc_end 1998-09-30 21:00:00 (Wed)
  63026902800, #  local_start 1998-03-30 01:00:00 (Mon)
  63042883200, #    local_end 1998-10-01 00:00:00 (Thu)
  10800,
  1,
  'EEST',
      ],
      [
  63042872400, #    utc_start 1998-09-30 21:00:00 (Wed)
  63058600800, #      utc_end 1999-03-31 22:00:00 (Wed)
  63042879600, #  local_start 1998-09-30 23:00:00 (Wed)
  63058608000, #    local_end 1999-04-01 00:00:00 (Thu)
  7200,
  0,
  'EET',
      ],
      [
  63058600800, #    utc_start 1999-03-31 22:00:00 (Wed)
  63074408400, #      utc_end 1999-09-30 21:00:00 (Thu)
  63058611600, #  local_start 1999-04-01 01:00:00 (Thu)
  63074419200, #    local_end 1999-10-01 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63074408400, #    utc_start 1999-09-30 21:00:00 (Thu)
  63090223200, #      utc_end 2000-03-31 22:00:00 (Fri)
  63074415600, #  local_start 1999-09-30 23:00:00 (Thu)
  63090230400, #    local_end 2000-04-01 00:00:00 (Sat)
  7200,
  0,
  'EET',
      ],
      [
  63090223200, #    utc_start 2000-03-31 22:00:00 (Fri)
  63106030800, #      utc_end 2000-09-30 21:00:00 (Sat)
  63090234000, #  local_start 2000-04-01 01:00:00 (Sat)
  63106041600, #    local_end 2000-10-01 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63106030800, #    utc_start 2000-09-30 21:00:00 (Sat)
  63121759200, #      utc_end 2001-03-31 22:00:00 (Sat)
  63106038000, #  local_start 2000-09-30 23:00:00 (Sat)
  63121766400, #    local_end 2001-04-01 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63121759200, #    utc_start 2001-03-31 22:00:00 (Sat)
  63137566800, #      utc_end 2001-09-30 21:00:00 (Sun)
  63121770000, #  local_start 2001-04-01 01:00:00 (Sun)
  63137577600, #    local_end 2001-10-01 00:00:00 (Mon)
  10800,
  1,
  'EEST',
      ],
      [
  63137566800, #    utc_start 2001-09-30 21:00:00 (Sun)
  63153295200, #      utc_end 2002-03-31 22:00:00 (Sun)
  63137574000, #  local_start 2001-09-30 23:00:00 (Sun)
  63153302400, #    local_end 2002-04-01 00:00:00 (Mon)
  7200,
  0,
  'EET',
      ],
      [
  63153295200, #    utc_start 2002-03-31 22:00:00 (Sun)
  63169102800, #      utc_end 2002-09-30 21:00:00 (Mon)
  63153306000, #  local_start 2002-04-01 01:00:00 (Mon)
  63169113600, #    local_end 2002-10-01 00:00:00 (Tue)
  10800,
  1,
  'EEST',
      ],
      [
  63169102800, #    utc_start 2002-09-30 21:00:00 (Mon)
  63184831200, #      utc_end 2003-03-31 22:00:00 (Mon)
  63169110000, #  local_start 2002-09-30 23:00:00 (Mon)
  63184838400, #    local_end 2003-04-01 00:00:00 (Tue)
  7200,
  0,
  'EET',
      ],
      [
  63184831200, #    utc_start 2003-03-31 22:00:00 (Mon)
  63200638800, #      utc_end 2003-09-30 21:00:00 (Tue)
  63184842000, #  local_start 2003-04-01 01:00:00 (Tue)
  63200649600, #    local_end 2003-10-01 00:00:00 (Wed)
  10800,
  1,
  'EEST',
      ],
      [
  63200638800, #    utc_start 2003-09-30 21:00:00 (Tue)
  63216453600, #      utc_end 2004-03-31 22:00:00 (Wed)
  63200646000, #  local_start 2003-09-30 23:00:00 (Tue)
  63216460800, #    local_end 2004-04-01 00:00:00 (Thu)
  7200,
  0,
  'EET',
      ],
      [
  63216453600, #    utc_start 2004-03-31 22:00:00 (Wed)
  63232261200, #      utc_end 2004-09-30 21:00:00 (Thu)
  63216464400, #  local_start 2004-04-01 01:00:00 (Thu)
  63232272000, #    local_end 2004-10-01 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63232261200, #    utc_start 2004-09-30 21:00:00 (Thu)
  63247989600, #      utc_end 2005-03-31 22:00:00 (Thu)
  63232268400, #  local_start 2004-09-30 23:00:00 (Thu)
  63247996800, #    local_end 2005-04-01 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63247989600, #    utc_start 2005-03-31 22:00:00 (Thu)
  63263797200, #      utc_end 2005-09-30 21:00:00 (Fri)
  63248000400, #  local_start 2005-04-01 01:00:00 (Fri)
  63263808000, #    local_end 2005-10-01 00:00:00 (Sat)
  10800,
  1,
  'EEST',
      ],
      [
  63263797200, #    utc_start 2005-09-30 21:00:00 (Fri)
  63279525600, #      utc_end 2006-03-31 22:00:00 (Fri)
  63263804400, #  local_start 2005-09-30 23:00:00 (Fri)
  63279532800, #    local_end 2006-04-01 00:00:00 (Sat)
  7200,
  0,
  'EET',
      ],
      [
  63279525600, #    utc_start 2006-03-31 22:00:00 (Fri)
  63294555600, #      utc_end 2006-09-21 21:00:00 (Thu)
  63279536400, #  local_start 2006-04-01 01:00:00 (Sat)
  63294566400, #    local_end 2006-09-22 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63294555600, #    utc_start 2006-09-21 21:00:00 (Thu)
  63310888800, #      utc_end 2007-03-29 22:00:00 (Thu)
  63294562800, #  local_start 2006-09-21 23:00:00 (Thu)
  63310896000, #    local_end 2007-03-30 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63310888800, #    utc_start 2007-03-29 22:00:00 (Thu)
  63329634000, #      utc_end 2007-11-01 21:00:00 (Thu)
  63310899600, #  local_start 2007-03-30 01:00:00 (Fri)
  63329644800, #    local_end 2007-11-02 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63329634000, #    utc_start 2007-11-01 21:00:00 (Thu)
  63342943200, #      utc_end 2008-04-03 22:00:00 (Thu)
  63329641200, #  local_start 2007-11-01 23:00:00 (Thu)
  63342950400, #    local_end 2008-04-04 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63342943200, #    utc_start 2008-04-03 22:00:00 (Thu)
  63361170000, #      utc_end 2008-10-31 21:00:00 (Fri)
  63342954000, #  local_start 2008-04-04 01:00:00 (Fri)
  63361180800, #    local_end 2008-11-01 00:00:00 (Sat)
  10800,
  1,
  'EEST',
      ],
      [
  63361170000, #    utc_start 2008-10-31 21:00:00 (Fri)
  63373788000, #      utc_end 2009-03-26 22:00:00 (Thu)
  63361177200, #  local_start 2008-10-31 23:00:00 (Fri)
  63373795200, #    local_end 2009-03-27 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63373788000, #    utc_start 2009-03-26 22:00:00 (Thu)
  63392533200, #      utc_end 2009-10-29 21:00:00 (Thu)
  63373798800, #  local_start 2009-03-27 01:00:00 (Fri)
  63392544000, #    local_end 2009-10-30 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63392533200, #    utc_start 2009-10-29 21:00:00 (Thu)
  63405842400, #      utc_end 2010-04-01 22:00:00 (Thu)
  63392540400, #  local_start 2009-10-29 23:00:00 (Thu)
  63405849600, #    local_end 2010-04-02 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63405842400, #    utc_start 2010-04-01 22:00:00 (Thu)
  63423982800, #      utc_end 2010-10-28 21:00:00 (Thu)
  63405853200, #  local_start 2010-04-02 01:00:00 (Fri)
  63423993600, #    local_end 2010-10-29 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63423982800, #    utc_start 2010-10-28 21:00:00 (Thu)
  63437292000, #      utc_end 2011-03-31 22:00:00 (Thu)
  63423990000, #  local_start 2010-10-28 23:00:00 (Thu)
  63437299200, #    local_end 2011-04-01 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63437292000, #    utc_start 2011-03-31 22:00:00 (Thu)
  63455432400, #      utc_end 2011-10-27 21:00:00 (Thu)
  63437302800, #  local_start 2011-04-01 01:00:00 (Fri)
  63455443200, #    local_end 2011-10-28 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63455432400, #    utc_start 2011-10-27 21:00:00 (Thu)
  63468741600, #      utc_end 2012-03-29 22:00:00 (Thu)
  63455439600, #  local_start 2011-10-27 23:00:00 (Thu)
  63468748800, #    local_end 2012-03-30 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63468741600, #    utc_start 2012-03-29 22:00:00 (Thu)
  63486882000, #      utc_end 2012-10-25 21:00:00 (Thu)
  63468752400, #  local_start 2012-03-30 01:00:00 (Fri)
  63486892800, #    local_end 2012-10-26 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63486882000, #    utc_start 2012-10-25 21:00:00 (Thu)
  63500191200, #      utc_end 2013-03-28 22:00:00 (Thu)
  63486889200, #  local_start 2012-10-25 23:00:00 (Thu)
  63500198400, #    local_end 2013-03-29 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63500191200, #    utc_start 2013-03-28 22:00:00 (Thu)
  63518331600, #      utc_end 2013-10-24 21:00:00 (Thu)
  63500202000, #  local_start 2013-03-29 01:00:00 (Fri)
  63518342400, #    local_end 2013-10-25 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63518331600, #    utc_start 2013-10-24 21:00:00 (Thu)
  63531640800, #      utc_end 2014-03-27 22:00:00 (Thu)
  63518338800, #  local_start 2013-10-24 23:00:00 (Thu)
  63531648000, #    local_end 2014-03-28 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63531640800, #    utc_start 2014-03-27 22:00:00 (Thu)
  63550386000, #      utc_end 2014-10-30 21:00:00 (Thu)
  63531651600, #  local_start 2014-03-28 01:00:00 (Fri)
  63550396800, #    local_end 2014-10-31 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63550386000, #    utc_start 2014-10-30 21:00:00 (Thu)
  63563090400, #      utc_end 2015-03-26 22:00:00 (Thu)
  63550393200, #  local_start 2014-10-30 23:00:00 (Thu)
  63563097600, #    local_end 2015-03-27 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63563090400, #    utc_start 2015-03-26 22:00:00 (Thu)
  63581835600, #      utc_end 2015-10-29 21:00:00 (Thu)
  63563101200, #  local_start 2015-03-27 01:00:00 (Fri)
  63581846400, #    local_end 2015-10-30 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63581835600, #    utc_start 2015-10-29 21:00:00 (Thu)
  63594540000, #      utc_end 2016-03-24 22:00:00 (Thu)
  63581842800, #  local_start 2015-10-29 23:00:00 (Thu)
  63594547200, #    local_end 2016-03-25 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63594540000, #    utc_start 2016-03-24 22:00:00 (Thu)
  63613285200, #      utc_end 2016-10-27 21:00:00 (Thu)
  63594550800, #  local_start 2016-03-25 01:00:00 (Fri)
  63613296000, #    local_end 2016-10-28 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63613285200, #    utc_start 2016-10-27 21:00:00 (Thu)
  63626594400, #      utc_end 2017-03-30 22:00:00 (Thu)
  63613292400, #  local_start 2016-10-27 23:00:00 (Thu)
  63626601600, #    local_end 2017-03-31 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63626594400, #    utc_start 2017-03-30 22:00:00 (Thu)
  63644734800, #      utc_end 2017-10-26 21:00:00 (Thu)
  63626605200, #  local_start 2017-03-31 01:00:00 (Fri)
  63644745600, #    local_end 2017-10-27 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63644734800, #    utc_start 2017-10-26 21:00:00 (Thu)
  63658044000, #      utc_end 2018-03-29 22:00:00 (Thu)
  63644742000, #  local_start 2017-10-26 23:00:00 (Thu)
  63658051200, #    local_end 2018-03-30 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63658044000, #    utc_start 2018-03-29 22:00:00 (Thu)
  63676184400, #      utc_end 2018-10-25 21:00:00 (Thu)
  63658054800, #  local_start 2018-03-30 01:00:00 (Fri)
  63676195200, #    local_end 2018-10-26 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63676184400, #    utc_start 2018-10-25 21:00:00 (Thu)
  63689493600, #      utc_end 2019-03-28 22:00:00 (Thu)
  63676191600, #  local_start 2018-10-25 23:00:00 (Thu)
  63689500800, #    local_end 2019-03-29 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63689493600, #    utc_start 2019-03-28 22:00:00 (Thu)
  63707634000, #      utc_end 2019-10-24 21:00:00 (Thu)
  63689504400, #  local_start 2019-03-29 01:00:00 (Fri)
  63707644800, #    local_end 2019-10-25 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63707634000, #    utc_start 2019-10-24 21:00:00 (Thu)
  63720943200, #      utc_end 2020-03-26 22:00:00 (Thu)
  63707641200, #  local_start 2019-10-24 23:00:00 (Thu)
  63720950400, #    local_end 2020-03-27 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63720943200, #    utc_start 2020-03-26 22:00:00 (Thu)
  63739688400, #      utc_end 2020-10-29 21:00:00 (Thu)
  63720954000, #  local_start 2020-03-27 01:00:00 (Fri)
  63739699200, #    local_end 2020-10-30 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63739688400, #    utc_start 2020-10-29 21:00:00 (Thu)
  63752392800, #      utc_end 2021-03-25 22:00:00 (Thu)
  63739695600, #  local_start 2020-10-29 23:00:00 (Thu)
  63752400000, #    local_end 2021-03-26 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63752392800, #    utc_start 2021-03-25 22:00:00 (Thu)
  63771138000, #      utc_end 2021-10-28 21:00:00 (Thu)
  63752403600, #  local_start 2021-03-26 01:00:00 (Fri)
  63771148800, #    local_end 2021-10-29 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63771138000, #    utc_start 2021-10-28 21:00:00 (Thu)
  63783842400, #      utc_end 2022-03-24 22:00:00 (Thu)
  63771145200, #  local_start 2021-10-28 23:00:00 (Thu)
  63783849600, #    local_end 2022-03-25 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63783842400, #    utc_start 2022-03-24 22:00:00 (Thu)
  63802587600, #      utc_end 2022-10-27 21:00:00 (Thu)
  63783853200, #  local_start 2022-03-25 01:00:00 (Fri)
  63802598400, #    local_end 2022-10-28 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63802587600, #    utc_start 2022-10-27 21:00:00 (Thu)
  63815896800, #      utc_end 2023-03-30 22:00:00 (Thu)
  63802594800, #  local_start 2022-10-27 23:00:00 (Thu)
  63815904000, #    local_end 2023-03-31 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63815896800, #    utc_start 2023-03-30 22:00:00 (Thu)
  63834037200, #      utc_end 2023-10-26 21:00:00 (Thu)
  63815907600, #  local_start 2023-03-31 01:00:00 (Fri)
  63834048000, #    local_end 2023-10-27 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63834037200, #    utc_start 2023-10-26 21:00:00 (Thu)
  63847346400, #      utc_end 2024-03-28 22:00:00 (Thu)
  63834044400, #  local_start 2023-10-26 23:00:00 (Thu)
  63847353600, #    local_end 2024-03-29 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63847346400, #    utc_start 2024-03-28 22:00:00 (Thu)
  63865486800, #      utc_end 2024-10-24 21:00:00 (Thu)
  63847357200, #  local_start 2024-03-29 01:00:00 (Fri)
  63865497600, #    local_end 2024-10-25 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63865486800, #    utc_start 2024-10-24 21:00:00 (Thu)
  63878796000, #      utc_end 2025-03-27 22:00:00 (Thu)
  63865494000, #  local_start 2024-10-24 23:00:00 (Thu)
  63878803200, #    local_end 2025-03-28 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63878796000, #    utc_start 2025-03-27 22:00:00 (Thu)
  63897541200, #      utc_end 2025-10-30 21:00:00 (Thu)
  63878806800, #  local_start 2025-03-28 01:00:00 (Fri)
  63897552000, #    local_end 2025-10-31 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63897541200, #    utc_start 2025-10-30 21:00:00 (Thu)
  63910245600, #      utc_end 2026-03-26 22:00:00 (Thu)
  63897548400, #  local_start 2025-10-30 23:00:00 (Thu)
  63910252800, #    local_end 2026-03-27 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63910245600, #    utc_start 2026-03-26 22:00:00 (Thu)
  63928990800, #      utc_end 2026-10-29 21:00:00 (Thu)
  63910256400, #  local_start 2026-03-27 01:00:00 (Fri)
  63929001600, #    local_end 2026-10-30 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63928990800, #    utc_start 2026-10-29 21:00:00 (Thu)
  63941695200, #      utc_end 2027-03-25 22:00:00 (Thu)
  63928998000, #  local_start 2026-10-29 23:00:00 (Thu)
  63941702400, #    local_end 2027-03-26 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63941695200, #    utc_start 2027-03-25 22:00:00 (Thu)
  63960440400, #      utc_end 2027-10-28 21:00:00 (Thu)
  63941706000, #  local_start 2027-03-26 01:00:00 (Fri)
  63960451200, #    local_end 2027-10-29 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63960440400, #    utc_start 2027-10-28 21:00:00 (Thu)
  63973749600, #      utc_end 2028-03-30 22:00:00 (Thu)
  63960447600, #  local_start 2027-10-28 23:00:00 (Thu)
  63973756800, #    local_end 2028-03-31 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63973749600, #    utc_start 2028-03-30 22:00:00 (Thu)
  63991890000, #      utc_end 2028-10-26 21:00:00 (Thu)
  63973760400, #  local_start 2028-03-31 01:00:00 (Fri)
  63991900800, #    local_end 2028-10-27 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63991890000, #    utc_start 2028-10-26 21:00:00 (Thu)
  64005199200, #      utc_end 2029-03-29 22:00:00 (Thu)
  63991897200, #  local_start 2028-10-26 23:00:00 (Thu)
  64005206400, #    local_end 2029-03-30 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  64005199200, #    utc_start 2029-03-29 22:00:00 (Thu)
  64023339600, #      utc_end 2029-10-25 21:00:00 (Thu)
  64005210000, #  local_start 2029-03-30 01:00:00 (Fri)
  64023350400, #    local_end 2029-10-26 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  64023339600, #    utc_start 2029-10-25 21:00:00 (Thu)
  64036648800, #      utc_end 2030-03-28 22:00:00 (Thu)
  64023346800, #  local_start 2029-10-25 23:00:00 (Thu)
  64036656000, #    local_end 2030-03-29 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  64036648800, #    utc_start 2030-03-28 22:00:00 (Thu)
  64054789200, #      utc_end 2030-10-24 21:00:00 (Thu)
  64036659600, #  local_start 2030-03-29 01:00:00 (Fri)
  64054800000, #    local_end 2030-10-25 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {68}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { 7200 }
  
  my $last_observance = bless( {
    'format' => 'EE%sT',
    'gmtoff' => '2:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 700899,
      'local_rd_secs' => 84888,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 700899,
      'utc_rd_secs' => 84888,
      'utc_year' => 1920
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => 7200,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 700899,
      'local_rd_secs' => 77688,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 700899,
      'utc_rd_secs' => 77688,
      'utc_year' => 1920
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '0:00',
      'from' => '2012',
      'in' => 'Mar',
      'letter' => 'S',
      'name' => 'Syria',
      'offset_from_std' => 3600,
      'on' => 'lastFri',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '0:00',
      'from' => '2009',
      'in' => 'Oct',
      'letter' => '',
      'name' => 'Syria',
      'offset_from_std' => 0,
      'on' => 'lastFri',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_DAMASCUS

    $main::fatpacked{"DateTime/TimeZone/Asia/Dhaka.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_DHAKA';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/asia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Dhaka;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Dhaka::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59611139900, #      utc_end 1889-12-31 17:58:20 (Tue)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59611161600, #    local_end 1890-01-01 00:00:00 (Wed)
  21700,
  0,
  'LMT',
      ],
      [
  59611139900, #    utc_start 1889-12-31 17:58:20 (Tue)
  61244100400, #      utc_end 1941-09-30 18:06:40 (Tue)
  59611161100, #  local_start 1889-12-31 23:51:40 (Tue)
  61244121600, #    local_end 1941-10-01 00:00:00 (Wed)
  21200,
  0,
  'HMT',
      ],
      [
  61244100400, #    utc_start 1941-09-30 18:06:40 (Tue)
  61263624600, #      utc_end 1942-05-14 17:30:00 (Thu)
  61244123800, #  local_start 1941-10-01 00:36:40 (Wed)
  61263648000, #    local_end 1942-05-15 00:00:00 (Fri)
  23400,
  0,
  '+0630',
      ],
      [
  61263624600, #    utc_start 1942-05-14 17:30:00 (Thu)
  61273045800, #      utc_end 1942-08-31 18:30:00 (Mon)
  61263644400, #  local_start 1942-05-14 23:00:00 (Thu)
  61273065600, #    local_end 1942-09-01 00:00:00 (Tue)
  19800,
  0,
  '+0530',
      ],
      [
  61273045800, #    utc_start 1942-08-31 18:30:00 (Mon)
  61559544600, #      utc_end 1951-09-29 17:30:00 (Sat)
  61273069200, #  local_start 1942-09-01 01:00:00 (Tue)
  61559568000, #    local_end 1951-09-30 00:00:00 (Sun)
  23400,
  0,
  '+0630',
      ],
      [
  61559544600, #    utc_start 1951-09-29 17:30:00 (Sat)
  63366429600, #      utc_end 2008-12-31 18:00:00 (Wed)
  61559566200, #  local_start 1951-09-29 23:30:00 (Sat)
  63366451200, #    local_end 2009-01-01 00:00:00 (Thu)
  21600,
  0,
  '+06',
      ],
      [
  63366429600, #    utc_start 2008-12-31 18:00:00 (Wed)
  63381114000, #      utc_end 2009-06-19 17:00:00 (Fri)
  63366451200, #  local_start 2009-01-01 00:00:00 (Thu)
  63381135600, #    local_end 2009-06-19 23:00:00 (Fri)
  21600,
  0,
  '+06',
      ],
      [
  63381114000, #    utc_start 2009-06-19 17:00:00 (Fri)
  63397962000, #      utc_end 2009-12-31 17:00:00 (Thu)
  63381139200, #  local_start 2009-06-20 00:00:00 (Sat)
  63397987200, #    local_end 2010-01-01 00:00:00 (Fri)
  25200,
  1,
  '+07',
      ],
      [
  63397962000, #    utc_start 2009-12-31 17:00:00 (Thu)
  DateTime::TimeZone::INFINITY, #      utc_end
  63397983600, #  local_start 2009-12-31 23:00:00 (Thu)
  DateTime::TimeZone::INFINITY, #    local_end
  21600,
  0,
  '+06',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {1}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_DHAKA

    $main::fatpacked{"DateTime/TimeZone/Asia/Dili.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_DILI';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/asia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Dili;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Dili::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60305269060, #      utc_end 1911-12-31 15:37:40 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60305299200, #    local_end 1912-01-01 00:00:00 (Mon)
  30140,
  0,
  'LMT',
      ],
      [
  60305269060, #    utc_start 1911-12-31 15:37:40 (Sun)
  61256530800, #      utc_end 1942-02-21 15:00:00 (Sat)
  60305297860, #  local_start 1911-12-31 23:37:40 (Sun)
  61256559600, #    local_end 1942-02-21 23:00:00 (Sat)
  28800,
  0,
  '+08',
      ],
      [
  61256530800, #    utc_start 1942-02-21 15:00:00 (Sat)
  62335580400, #      utc_end 1976-05-02 15:00:00 (Sun)
  61256563200, #  local_start 1942-02-22 00:00:00 (Sun)
  62335612800, #    local_end 1976-05-03 00:00:00 (Mon)
  32400,
  0,
  '+09',
      ],
      [
  62335580400, #    utc_start 1976-05-02 15:00:00 (Sun)
  63104803200, #      utc_end 2000-09-16 16:00:00 (Sat)
  62335609200, #  local_start 1976-05-02 23:00:00 (Sun)
  63104832000, #    local_end 2000-09-17 00:00:00 (Sun)
  28800,
  0,
  '+08',
      ],
      [
  63104803200, #    utc_start 2000-09-16 16:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  63104835600, #  local_start 2000-09-17 01:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  32400,
  0,
  '+09',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_DILI

    $main::fatpacked{"DateTime/TimeZone/Asia/Dubai.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_DUBAI';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/asia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Dubai;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Dubai::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60557746728, #      utc_end 1919-12-31 20:18:48 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60557760000, #    local_end 1920-01-01 00:00:00 (Thu)
  13272,
  0,
  'LMT',
      ],
      [
  60557746728, #    utc_start 1919-12-31 20:18:48 (Wed)
  DateTime::TimeZone::INFINITY, #      utc_end
  60557761128, #  local_start 1920-01-01 00:18:48 (Thu)
  DateTime::TimeZone::INFINITY, #    local_end
  14400,
  0,
  '+04',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_DUBAI

    $main::fatpacked{"DateTime/TimeZone/Asia/Dushanbe.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_DUSHANBE';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/asia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Dushanbe;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Dushanbe::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60694514688, #      utc_end 1924-05-01 19:24:48 (Thu)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60694531200, #    local_end 1924-05-02 00:00:00 (Fri)
  16512,
  0,
  'LMT',
      ],
      [
  60694514688, #    utc_start 1924-05-01 19:24:48 (Thu)
  60888135600, #      utc_end 1930-06-20 19:00:00 (Fri)
  60694532688, #  local_start 1924-05-02 00:24:48 (Fri)
  60888153600, #    local_end 1930-06-21 00:00:00 (Sat)
  18000,
  0,
  '+05',
      ],
      [
  60888135600, #    utc_start 1930-06-20 19:00:00 (Fri)
  62490592800, #      utc_end 1981-03-31 18:00:00 (Tue)
  60888157200, #  local_start 1930-06-21 01:00:00 (Sat)
  62490614400, #    local_end 1981-04-01 00:00:00 (Wed)
  21600,
  0,
  '+06',
      ],
      [
  62490592800, #    utc_start 1981-03-31 18:00:00 (Tue)
  62506400400, #      utc_end 1981-09-30 17:00:00 (Wed)
  62490618000, #  local_start 1981-04-01 01:00:00 (Wed)
  62506425600, #    local_end 1981-10-01 00:00:00 (Thu)
  25200,
  1,
  '+07',
      ],
      [
  62506400400, #    utc_start 1981-09-30 17:00:00 (Wed)
  62522128800, #      utc_end 1982-03-31 18:00:00 (Wed)
  62506422000, #  local_start 1981-09-30 23:00:00 (Wed)
  62522150400, #    local_end 1982-04-01 00:00:00 (Thu)
  21600,
  0,
  '+06',
      ],
      [
  62522128800, #    utc_start 1982-03-31 18:00:00 (Wed)
  62537936400, #      utc_end 1982-09-30 17:00:00 (Thu)
  62522154000, #  local_start 1982-04-01 01:00:00 (Thu)
  62537961600, #    local_end 1982-10-01 00:00:00 (Fri)
  25200,
  1,
  '+07',
      ],
      [
  62537936400, #    utc_start 1982-09-30 17:00:00 (Thu)
  62553664800, #      utc_end 1983-03-31 18:00:00 (Thu)
  62537958000, #  local_start 1982-09-30 23:00:00 (Thu)
  62553686400, #    local_end 1983-04-01 00:00:00 (Fri)
  21600,
  0,
  '+06',
      ],
      [
  62553664800, #    utc_start 1983-03-31 18:00:00 (Thu)
  62569472400, #      utc_end 1983-09-30 17:00:00 (Fri)
  62553690000, #  local_start 1983-04-01 01:00:00 (Fri)
  62569497600, #    local_end 1983-10-01 00:00:00 (Sat)
  25200,
  1,
  '+07',
      ],
      [
  62569472400, #    utc_start 1983-09-30 17:00:00 (Fri)
  62585287200, #      utc_end 1984-03-31 18:00:00 (Sat)
  62569494000, #  local_start 1983-09-30 23:00:00 (Fri)
  62585308800, #    local_end 1984-04-01 00:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  62585287200, #    utc_start 1984-03-31 18:00:00 (Sat)
  62601019200, #      utc_end 1984-09-29 20:00:00 (Sat)
  62585312400, #  local_start 1984-04-01 01:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  62601019200, #    utc_start 1984-09-29 20:00:00 (Sat)
  62616744000, #      utc_end 1985-03-30 20:00:00 (Sat)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  62616744000, #    utc_start 1985-03-30 20:00:00 (Sat)
  62632468800, #      utc_end 1985-09-28 20:00:00 (Sat)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  62632468800, #    utc_start 1985-09-28 20:00:00 (Sat)
  62648193600, #      utc_end 1986-03-29 20:00:00 (Sat)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  62648193600, #    utc_start 1986-03-29 20:00:00 (Sat)
  62663918400, #      utc_end 1986-09-27 20:00:00 (Sat)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  62663918400, #    utc_start 1986-09-27 20:00:00 (Sat)
  62679643200, #      utc_end 1987-03-28 20:00:00 (Sat)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  62679643200, #    utc_start 1987-03-28 20:00:00 (Sat)
  62695368000, #      utc_end 1987-09-26 20:00:00 (Sat)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  62695368000, #    utc_start 1987-09-26 20:00:00 (Sat)
  62711092800, #      utc_end 1988-03-26 20:00:00 (Sat)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  62711092800, #    utc_start 1988-03-26 20:00:00 (Sat)
  62726817600, #      utc_end 1988-09-24 20:00:00 (Sat)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  62726817600, #    utc_start 1988-09-24 20:00:00 (Sat)
  62742542400, #      utc_end 1989-03-25 20:00:00 (Sat)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  62742542400, #    utc_start 1989-03-25 20:00:00 (Sat)
  62758267200, #      utc_end 1989-09-23 20:00:00 (Sat)
  62742567600, #  local_start 1989-03-26 03:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  62758267200, #    utc_start 1989-09-23 20:00:00 (Sat)
  62773992000, #      utc_end 1990-03-24 20:00:00 (Sat)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  62773992000, #    utc_start 1990-03-24 20:00:00 (Sat)
  62790321600, #      utc_end 1990-09-29 20:00:00 (Sat)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  62790321600, #    utc_start 1990-09-29 20:00:00 (Sat)
  62806046400, #      utc_end 1991-03-30 20:00:00 (Sat)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  62806046400, #    utc_start 1991-03-30 20:00:00 (Sat)
  62820046800, #      utc_end 1991-09-08 21:00:00 (Sun)
  62806068000, #  local_start 1991-03-31 02:00:00 (Sun)
  62820068400, #    local_end 1991-09-09 03:00:00 (Mon)
  21600,
  1,
  '+06',
      ],
      [
  62820046800, #    utc_start 1991-09-08 21:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #      utc_end
  62820064800, #  local_start 1991-09-09 02:00:00 (Mon)
  DateTime::TimeZone::INFINITY, #    local_end
  18000,
  0,
  '+05',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {11}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_DUSHANBE

    $main::fatpacked{"DateTime/TimeZone/Asia/Famagusta.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_FAMAGUSTA';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/asia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Famagusta;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Famagusta::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60616763052, #      utc_end 1921-11-13 21:44:12 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60616771200, #    local_end 1921-11-14 00:00:00 (Mon)
  8148,
  0,
  'LMT',
      ],
      [
  60616763052, #    utc_start 1921-11-13 21:44:12 (Sun)
  62302255200, #      utc_end 1975-04-12 22:00:00 (Sat)
  60616770252, #  local_start 1921-11-13 23:44:12 (Sun)
  62302262400, #    local_end 1975-04-13 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62302255200, #    utc_start 1975-04-12 22:00:00 (Sat)
  62317976400, #      utc_end 1975-10-11 21:00:00 (Sat)
  62302266000, #  local_start 1975-04-13 01:00:00 (Sun)
  62317987200, #    local_end 1975-10-12 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62317976400, #    utc_start 1975-10-11 21:00:00 (Sat)
  62336642400, #      utc_end 1976-05-14 22:00:00 (Fri)
  62317983600, #  local_start 1975-10-11 23:00:00 (Sat)
  62336649600, #    local_end 1976-05-15 00:00:00 (Sat)
  7200,
  0,
  'EET',
      ],
      [
  62336642400, #    utc_start 1976-05-14 22:00:00 (Fri)
  62349512400, #      utc_end 1976-10-10 21:00:00 (Sun)
  62336653200, #  local_start 1976-05-15 01:00:00 (Sat)
  62349523200, #    local_end 1976-10-11 00:00:00 (Mon)
  10800,
  1,
  'EEST',
      ],
      [
  62349512400, #    utc_start 1976-10-10 21:00:00 (Sun)
  62364549600, #      utc_end 1977-04-02 22:00:00 (Sat)
  62349519600, #  local_start 1976-10-10 23:00:00 (Sun)
  62364556800, #    local_end 1977-04-03 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62364549600, #    utc_start 1977-04-02 22:00:00 (Sat)
  62379666000, #      utc_end 1977-09-24 21:00:00 (Sat)
  62364560400, #  local_start 1977-04-03 01:00:00 (Sun)
  62379676800, #    local_end 1977-09-25 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62379666000, #    utc_start 1977-09-24 21:00:00 (Sat)
  62395999200, #      utc_end 1978-04-01 22:00:00 (Sat)
  62379673200, #  local_start 1977-09-24 23:00:00 (Sat)
  62396006400, #    local_end 1978-04-02 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62395999200, #    utc_start 1978-04-01 22:00:00 (Sat)
  62411806800, #      utc_end 1978-10-01 21:00:00 (Sun)
  62396010000, #  local_start 1978-04-02 01:00:00 (Sun)
  62411817600, #    local_end 1978-10-02 00:00:00 (Mon)
  10800,
  1,
  'EEST',
      ],
      [
  62411806800, #    utc_start 1978-10-01 21:00:00 (Sun)
  62427448800, #      utc_end 1979-03-31 22:00:00 (Sat)
  62411814000, #  local_start 1978-10-01 23:00:00 (Sun)
  62427456000, #    local_end 1979-04-01 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62427448800, #    utc_start 1979-03-31 22:00:00 (Sat)
  62443170000, #      utc_end 1979-09-29 21:00:00 (Sat)
  62427459600, #  local_start 1979-04-01 01:00:00 (Sun)
  62443180800, #    local_end 1979-09-30 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62443170000, #    utc_start 1979-09-29 21:00:00 (Sat)
  62459503200, #      utc_end 1980-04-05 22:00:00 (Sat)
  62443177200, #  local_start 1979-09-29 23:00:00 (Sat)
  62459510400, #    local_end 1980-04-06 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62459503200, #    utc_start 1980-04-05 22:00:00 (Sat)
  62474619600, #      utc_end 1980-09-27 21:00:00 (Sat)
  62459514000, #  local_start 1980-04-06 01:00:00 (Sun)
  62474630400, #    local_end 1980-09-28 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62474619600, #    utc_start 1980-09-27 21:00:00 (Sat)
  62490348000, #      utc_end 1981-03-28 22:00:00 (Sat)
  62474626800, #  local_start 1980-09-27 23:00:00 (Sat)
  62490355200, #    local_end 1981-03-29 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62490348000, #    utc_start 1981-03-28 22:00:00 (Sat)
  62506069200, #      utc_end 1981-09-26 21:00:00 (Sat)
  62490358800, #  local_start 1981-03-29 01:00:00 (Sun)
  62506080000, #    local_end 1981-09-27 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62506069200, #    utc_start 1981-09-26 21:00:00 (Sat)
  62521797600, #      utc_end 1982-03-27 22:00:00 (Sat)
  62506076400, #  local_start 1981-09-26 23:00:00 (Sat)
  62521804800, #    local_end 1982-03-28 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62521797600, #    utc_start 1982-03-27 22:00:00 (Sat)
  62537518800, #      utc_end 1982-09-25 21:00:00 (Sat)
  62521808400, #  local_start 1982-03-28 01:00:00 (Sun)
  62537529600, #    local_end 1982-09-26 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62537518800, #    utc_start 1982-09-25 21:00:00 (Sat)
  62553247200, #      utc_end 1983-03-26 22:00:00 (Sat)
  62537526000, #  local_start 1982-09-25 23:00:00 (Sat)
  62553254400, #    local_end 1983-03-27 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62553247200, #    utc_start 1983-03-26 22:00:00 (Sat)
  62568968400, #      utc_end 1983-09-24 21:00:00 (Sat)
  62553258000, #  local_start 1983-03-27 01:00:00 (Sun)
  62568979200, #    local_end 1983-09-25 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62568968400, #    utc_start 1983-09-24 21:00:00 (Sat)
  62584696800, #      utc_end 1984-03-24 22:00:00 (Sat)
  62568975600, #  local_start 1983-09-24 23:00:00 (Sat)
  62584704000, #    local_end 1984-03-25 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62584696800, #    utc_start 1984-03-24 22:00:00 (Sat)
  62601022800, #      utc_end 1984-09-29 21:00:00 (Sat)
  62584707600, #  local_start 1984-03-25 01:00:00 (Sun)
  62601033600, #    local_end 1984-09-30 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62601022800, #    utc_start 1984-09-29 21:00:00 (Sat)
  62616751200, #      utc_end 1985-03-30 22:00:00 (Sat)
  62601030000, #  local_start 1984-09-29 23:00:00 (Sat)
  62616758400, #    local_end 1985-03-31 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62616751200, #    utc_start 1985-03-30 22:00:00 (Sat)
  62632472400, #      utc_end 1985-09-28 21:00:00 (Sat)
  62616762000, #  local_start 1985-03-31 01:00:00 (Sun)
  62632483200, #    local_end 1985-09-29 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62632472400, #    utc_start 1985-09-28 21:00:00 (Sat)
  62648200800, #      utc_end 1986-03-29 22:00:00 (Sat)
  62632479600, #  local_start 1985-09-28 23:00:00 (Sat)
  62648208000, #    local_end 1986-03-30 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62648200800, #    utc_start 1986-03-29 22:00:00 (Sat)
  62663922000, #      utc_end 1986-09-27 21:00:00 (Sat)
  62648211600, #  local_start 1986-03-30 01:00:00 (Sun)
  62663932800, #    local_end 1986-09-28 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62663922000, #    utc_start 1986-09-27 21:00:00 (Sat)
  62679650400, #      utc_end 1987-03-28 22:00:00 (Sat)
  62663929200, #  local_start 1986-09-27 23:00:00 (Sat)
  62679657600, #    local_end 1987-03-29 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62679650400, #    utc_start 1987-03-28 22:00:00 (Sat)
  62695371600, #      utc_end 1987-09-26 21:00:00 (Sat)
  62679661200, #  local_start 1987-03-29 01:00:00 (Sun)
  62695382400, #    local_end 1987-09-27 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62695371600, #    utc_start 1987-09-26 21:00:00 (Sat)
  62711100000, #      utc_end 1988-03-26 22:00:00 (Sat)
  62695378800, #  local_start 1987-09-26 23:00:00 (Sat)
  62711107200, #    local_end 1988-03-27 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62711100000, #    utc_start 1988-03-26 22:00:00 (Sat)
  62726821200, #      utc_end 1988-09-24 21:00:00 (Sat)
  62711110800, #  local_start 1988-03-27 01:00:00 (Sun)
  62726832000, #    local_end 1988-09-25 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62726821200, #    utc_start 1988-09-24 21:00:00 (Sat)
  62742549600, #      utc_end 1989-03-25 22:00:00 (Sat)
  62726828400, #  local_start 1988-09-24 23:00:00 (Sat)
  62742556800, #    local_end 1989-03-26 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62742549600, #    utc_start 1989-03-25 22:00:00 (Sat)
  62758270800, #      utc_end 1989-09-23 21:00:00 (Sat)
  62742560400, #  local_start 1989-03-26 01:00:00 (Sun)
  62758281600, #    local_end 1989-09-24 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62758270800, #    utc_start 1989-09-23 21:00:00 (Sat)
  62773999200, #      utc_end 1990-03-24 22:00:00 (Sat)
  62758278000, #  local_start 1989-09-23 23:00:00 (Sat)
  62774006400, #    local_end 1990-03-25 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62773999200, #    utc_start 1990-03-24 22:00:00 (Sat)
  62790325200, #      utc_end 1990-09-29 21:00:00 (Sat)
  62774010000, #  local_start 1990-03-25 01:00:00 (Sun)
  62790336000, #    local_end 1990-09-30 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62790325200, #    utc_start 1990-09-29 21:00:00 (Sat)
  62806053600, #      utc_end 1991-03-30 22:00:00 (Sat)
  62790332400, #  local_start 1990-09-29 23:00:00 (Sat)
  62806060800, #    local_end 1991-03-31 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62806053600, #    utc_start 1991-03-30 22:00:00 (Sat)
  62821774800, #      utc_end 1991-09-28 21:00:00 (Sat)
  62806064400, #  local_start 1991-03-31 01:00:00 (Sun)
  62821785600, #    local_end 1991-09-29 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62821774800, #    utc_start 1991-09-28 21:00:00 (Sat)
  62837503200, #      utc_end 1992-03-28 22:00:00 (Sat)
  62821782000, #  local_start 1991-09-28 23:00:00 (Sat)
  62837510400, #    local_end 1992-03-29 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62837503200, #    utc_start 1992-03-28 22:00:00 (Sat)
  62853224400, #      utc_end 1992-09-26 21:00:00 (Sat)
  62837514000, #  local_start 1992-03-29 01:00:00 (Sun)
  62853235200, #    local_end 1992-09-27 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62853224400, #    utc_start 1992-09-26 21:00:00 (Sat)
  62868952800, #      utc_end 1993-03-27 22:00:00 (Sat)
  62853231600, #  local_start 1992-09-26 23:00:00 (Sat)
  62868960000, #    local_end 1993-03-28 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62868952800, #    utc_start 1993-03-27 22:00:00 (Sat)
  62884674000, #      utc_end 1993-09-25 21:00:00 (Sat)
  62868963600, #  local_start 1993-03-28 01:00:00 (Sun)
  62884684800, #    local_end 1993-09-26 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62884674000, #    utc_start 1993-09-25 21:00:00 (Sat)
  62900402400, #      utc_end 1994-03-26 22:00:00 (Sat)
  62884681200, #  local_start 1993-09-25 23:00:00 (Sat)
  62900409600, #    local_end 1994-03-27 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62900402400, #    utc_start 1994-03-26 22:00:00 (Sat)
  62916123600, #      utc_end 1994-09-24 21:00:00 (Sat)
  62900413200, #  local_start 1994-03-27 01:00:00 (Sun)
  62916134400, #    local_end 1994-09-25 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62916123600, #    utc_start 1994-09-24 21:00:00 (Sat)
  62931852000, #      utc_end 1995-03-25 22:00:00 (Sat)
  62916130800, #  local_start 1994-09-24 23:00:00 (Sat)
  62931859200, #    local_end 1995-03-26 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62931852000, #    utc_start 1995-03-25 22:00:00 (Sat)
  62947573200, #      utc_end 1995-09-23 21:00:00 (Sat)
  62931862800, #  local_start 1995-03-26 01:00:00 (Sun)
  62947584000, #    local_end 1995-09-24 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62947573200, #    utc_start 1995-09-23 21:00:00 (Sat)
  62963906400, #      utc_end 1996-03-30 22:00:00 (Sat)
  62947580400, #  local_start 1995-09-23 23:00:00 (Sat)
  62963913600, #    local_end 1996-03-31 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62963906400, #    utc_start 1996-03-30 22:00:00 (Sat)
  62979627600, #      utc_end 1996-09-28 21:00:00 (Sat)
  62963917200, #  local_start 1996-03-31 01:00:00 (Sun)
  62979638400, #    local_end 1996-09-29 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62979627600, #    utc_start 1996-09-28 21:00:00 (Sat)
  62995356000, #      utc_end 1997-03-29 22:00:00 (Sat)
  62979634800, #  local_start 1996-09-28 23:00:00 (Sat)
  62995363200, #    local_end 1997-03-30 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62995356000, #    utc_start 1997-03-29 22:00:00 (Sat)
  63011077200, #      utc_end 1997-09-27 21:00:00 (Sat)
  62995366800, #  local_start 1997-03-30 01:00:00 (Sun)
  63011088000, #    local_end 1997-09-28 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63011077200, #    utc_start 1997-09-27 21:00:00 (Sat)
  63026805600, #      utc_end 1998-03-28 22:00:00 (Sat)
  63011084400, #  local_start 1997-09-27 23:00:00 (Sat)
  63026812800, #    local_end 1998-03-29 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63026805600, #    utc_start 1998-03-28 22:00:00 (Sat)
  63040280400, #      utc_end 1998-08-31 21:00:00 (Mon)
  63026816400, #  local_start 1998-03-29 01:00:00 (Sun)
  63040291200, #    local_end 1998-09-01 00:00:00 (Tue)
  10800,
  1,
  'EEST',
      ],
      [
  63040280400, #    utc_start 1998-08-31 21:00:00 (Mon)
  63044960400, #      utc_end 1998-10-25 01:00:00 (Sun)
  63040291200, #  local_start 1998-09-01 00:00:00 (Tue)
  63044971200, #    local_end 1998-10-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63044960400, #    utc_start 1998-10-25 01:00:00 (Sun)
  63058266000, #      utc_end 1999-03-28 01:00:00 (Sun)
  63044967600, #  local_start 1998-10-25 03:00:00 (Sun)
  63058273200, #    local_end 1999-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63058266000, #    utc_start 1999-03-28 01:00:00 (Sun)
  63077014800, #      utc_end 1999-10-31 01:00:00 (Sun)
  63058276800, #  local_start 1999-03-28 04:00:00 (Sun)
  63077025600, #    local_end 1999-10-31 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63077014800, #    utc_start 1999-10-31 01:00:00 (Sun)
  63089715600, #      utc_end 2000-03-26 01:00:00 (Sun)
  63077022000, #  local_start 1999-10-31 03:00:00 (Sun)
  63089722800, #    local_end 2000-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63089715600, #    utc_start 2000-03-26 01:00:00 (Sun)
  63108464400, #      utc_end 2000-10-29 01:00:00 (Sun)
  63089726400, #  local_start 2000-03-26 04:00:00 (Sun)
  63108475200, #    local_end 2000-10-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63108464400, #    utc_start 2000-10-29 01:00:00 (Sun)
  63121165200, #      utc_end 2001-03-25 01:00:00 (Sun)
  63108471600, #  local_start 2000-10-29 03:00:00 (Sun)
  63121172400, #    local_end 2001-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63121165200, #    utc_start 2001-03-25 01:00:00 (Sun)
  63139914000, #      utc_end 2001-10-28 01:00:00 (Sun)
  63121176000, #  local_start 2001-03-25 04:00:00 (Sun)
  63139924800, #    local_end 2001-10-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63139914000, #    utc_start 2001-10-28 01:00:00 (Sun)
  63153219600, #      utc_end 2002-03-31 01:00:00 (Sun)
  63139921200, #  local_start 2001-10-28 03:00:00 (Sun)
  63153226800, #    local_end 2002-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63153219600, #    utc_start 2002-03-31 01:00:00 (Sun)
  63171363600, #      utc_end 2002-10-27 01:00:00 (Sun)
  63153230400, #  local_start 2002-03-31 04:00:00 (Sun)
  63171374400, #    local_end 2002-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63171363600, #    utc_start 2002-10-27 01:00:00 (Sun)
  63184669200, #      utc_end 2003-03-30 01:00:00 (Sun)
  63171370800, #  local_start 2002-10-27 03:00:00 (Sun)
  63184676400, #    local_end 2003-03-30 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63184669200, #    utc_start 2003-03-30 01:00:00 (Sun)
  63202813200, #      utc_end 2003-10-26 01:00:00 (Sun)
  63184680000, #  local_start 2003-03-30 04:00:00 (Sun)
  63202824000, #    local_end 2003-10-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63202813200, #    utc_start 2003-10-26 01:00:00 (Sun)
  63216118800, #      utc_end 2004-03-28 01:00:00 (Sun)
  63202820400, #  local_start 2003-10-26 03:00:00 (Sun)
  63216126000, #    local_end 2004-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63216118800, #    utc_start 2004-03-28 01:00:00 (Sun)
  63234867600, #      utc_end 2004-10-31 01:00:00 (Sun)
  63216129600, #  local_start 2004-03-28 04:00:00 (Sun)
  63234878400, #    local_end 2004-10-31 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63234867600, #    utc_start 2004-10-31 01:00:00 (Sun)
  63247568400, #      utc_end 2005-03-27 01:00:00 (Sun)
  63234874800, #  local_start 2004-10-31 03:00:00 (Sun)
  63247575600, #    local_end 2005-03-27 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63247568400, #    utc_start 2005-03-27 01:00:00 (Sun)
  63266317200, #      utc_end 2005-10-30 01:00:00 (Sun)
  63247579200, #  local_start 2005-03-27 04:00:00 (Sun)
  63266328000, #    local_end 2005-10-30 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63266317200, #    utc_start 2005-10-30 01:00:00 (Sun)
  63279018000, #      utc_end 2006-03-26 01:00:00 (Sun)
  63266324400, #  local_start 2005-10-30 03:00:00 (Sun)
  63279025200, #    local_end 2006-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63279018000, #    utc_start 2006-03-26 01:00:00 (Sun)
  63297766800, #      utc_end 2006-10-29 01:00:00 (Sun)
  63279028800, #  local_start 2006-03-26 04:00:00 (Sun)
  63297777600, #    local_end 2006-10-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63297766800, #    utc_start 2006-10-29 01:00:00 (Sun)
  63310467600, #      utc_end 2007-03-25 01:00:00 (Sun)
  63297774000, #  local_start 2006-10-29 03:00:00 (Sun)
  63310474800, #    local_end 2007-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63310467600, #    utc_start 2007-03-25 01:00:00 (Sun)
  63329216400, #      utc_end 2007-10-28 01:00:00 (Sun)
  63310478400, #  local_start 2007-03-25 04:00:00 (Sun)
  63329227200, #    local_end 2007-10-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63329216400, #    utc_start 2007-10-28 01:00:00 (Sun)
  63342522000, #      utc_end 2008-03-30 01:00:00 (Sun)
  63329223600, #  local_start 2007-10-28 03:00:00 (Sun)
  63342529200, #    local_end 2008-03-30 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63342522000, #    utc_start 2008-03-30 01:00:00 (Sun)
  63360666000, #      utc_end 2008-10-26 01:00:00 (Sun)
  63342532800, #  local_start 2008-03-30 04:00:00 (Sun)
  63360676800, #    local_end 2008-10-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63360666000, #    utc_start 2008-10-26 01:00:00 (Sun)
  63373971600, #      utc_end 2009-03-29 01:00:00 (Sun)
  63360673200, #  local_start 2008-10-26 03:00:00 (Sun)
  63373978800, #    local_end 2009-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63373971600, #    utc_start 2009-03-29 01:00:00 (Sun)
  63392115600, #      utc_end 2009-10-25 01:00:00 (Sun)
  63373982400, #  local_start 2009-03-29 04:00:00 (Sun)
  63392126400, #    local_end 2009-10-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63392115600, #    utc_start 2009-10-25 01:00:00 (Sun)
  63405421200, #      utc_end 2010-03-28 01:00:00 (Sun)
  63392122800, #  local_start 2009-10-25 03:00:00 (Sun)
  63405428400, #    local_end 2010-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63405421200, #    utc_start 2010-03-28 01:00:00 (Sun)
  63424170000, #      utc_end 2010-10-31 01:00:00 (Sun)
  63405432000, #  local_start 2010-03-28 04:00:00 (Sun)
  63424180800, #    local_end 2010-10-31 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63424170000, #    utc_start 2010-10-31 01:00:00 (Sun)
  63436870800, #      utc_end 2011-03-27 01:00:00 (Sun)
  63424177200, #  local_start 2010-10-31 03:00:00 (Sun)
  63436878000, #    local_end 2011-03-27 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63436870800, #    utc_start 2011-03-27 01:00:00 (Sun)
  63455619600, #      utc_end 2011-10-30 01:00:00 (Sun)
  63436881600, #  local_start 2011-03-27 04:00:00 (Sun)
  63455630400, #    local_end 2011-10-30 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63455619600, #    utc_start 2011-10-30 01:00:00 (Sun)
  63468320400, #      utc_end 2012-03-25 01:00:00 (Sun)
  63455626800, #  local_start 2011-10-30 03:00:00 (Sun)
  63468327600, #    local_end 2012-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63468320400, #    utc_start 2012-03-25 01:00:00 (Sun)
  63487069200, #      utc_end 2012-10-28 01:00:00 (Sun)
  63468331200, #  local_start 2012-03-25 04:00:00 (Sun)
  63487080000, #    local_end 2012-10-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63487069200, #    utc_start 2012-10-28 01:00:00 (Sun)
  63500374800, #      utc_end 2013-03-31 01:00:00 (Sun)
  63487076400, #  local_start 2012-10-28 03:00:00 (Sun)
  63500382000, #    local_end 2013-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63500374800, #    utc_start 2013-03-31 01:00:00 (Sun)
  63518518800, #      utc_end 2013-10-27 01:00:00 (Sun)
  63500385600, #  local_start 2013-03-31 04:00:00 (Sun)
  63518529600, #    local_end 2013-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63518518800, #    utc_start 2013-10-27 01:00:00 (Sun)
  63531824400, #      utc_end 2014-03-30 01:00:00 (Sun)
  63518526000, #  local_start 2013-10-27 03:00:00 (Sun)
  63531831600, #    local_end 2014-03-30 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63531824400, #    utc_start 2014-03-30 01:00:00 (Sun)
  63549968400, #      utc_end 2014-10-26 01:00:00 (Sun)
  63531835200, #  local_start 2014-03-30 04:00:00 (Sun)
  63549979200, #    local_end 2014-10-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63549968400, #    utc_start 2014-10-26 01:00:00 (Sun)
  63563274000, #      utc_end 2015-03-29 01:00:00 (Sun)
  63549975600, #  local_start 2014-10-26 03:00:00 (Sun)
  63563281200, #    local_end 2015-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63563274000, #    utc_start 2015-03-29 01:00:00 (Sun)
  63581418000, #      utc_end 2015-10-25 01:00:00 (Sun)
  63563284800, #  local_start 2015-03-29 04:00:00 (Sun)
  63581428800, #    local_end 2015-10-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63581418000, #    utc_start 2015-10-25 01:00:00 (Sun)
  63594723600, #      utc_end 2016-03-27 01:00:00 (Sun)
  63581425200, #  local_start 2015-10-25 03:00:00 (Sun)
  63594730800, #    local_end 2016-03-27 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63594723600, #    utc_start 2016-03-27 01:00:00 (Sun)
  63608965200, #      utc_end 2016-09-07 21:00:00 (Wed)
  63594734400, #  local_start 2016-03-27 04:00:00 (Sun)
  63608976000, #    local_end 2016-09-08 00:00:00 (Thu)
  10800,
  1,
  'EEST',
      ],
      [
  63608965200, #    utc_start 2016-09-07 21:00:00 (Wed)
  63644922000, #      utc_end 2017-10-29 01:00:00 (Sun)
  63608976000, #  local_start 2016-09-08 00:00:00 (Thu)
  63644932800, #    local_end 2017-10-29 04:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63644922000, #    utc_start 2017-10-29 01:00:00 (Sun)
  63657622800, #      utc_end 2018-03-25 01:00:00 (Sun)
  63644929200, #  local_start 2017-10-29 03:00:00 (Sun)
  63657630000, #    local_end 2018-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63657622800, #    utc_start 2018-03-25 01:00:00 (Sun)
  63676371600, #      utc_end 2018-10-28 01:00:00 (Sun)
  63657633600, #  local_start 2018-03-25 04:00:00 (Sun)
  63676382400, #    local_end 2018-10-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63676371600, #    utc_start 2018-10-28 01:00:00 (Sun)
  63689677200, #      utc_end 2019-03-31 01:00:00 (Sun)
  63676378800, #  local_start 2018-10-28 03:00:00 (Sun)
  63689684400, #    local_end 2019-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63689677200, #    utc_start 2019-03-31 01:00:00 (Sun)
  63707821200, #      utc_end 2019-10-27 01:00:00 (Sun)
  63689688000, #  local_start 2019-03-31 04:00:00 (Sun)
  63707832000, #    local_end 2019-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63707821200, #    utc_start 2019-10-27 01:00:00 (Sun)
  63721126800, #      utc_end 2020-03-29 01:00:00 (Sun)
  63707828400, #  local_start 2019-10-27 03:00:00 (Sun)
  63721134000, #    local_end 2020-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63721126800, #    utc_start 2020-03-29 01:00:00 (Sun)
  63739270800, #      utc_end 2020-10-25 01:00:00 (Sun)
  63721137600, #  local_start 2020-03-29 04:00:00 (Sun)
  63739281600, #    local_end 2020-10-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63739270800, #    utc_start 2020-10-25 01:00:00 (Sun)
  63752576400, #      utc_end 2021-03-28 01:00:00 (Sun)
  63739278000, #  local_start 2020-10-25 03:00:00 (Sun)
  63752583600, #    local_end 2021-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63752576400, #    utc_start 2021-03-28 01:00:00 (Sun)
  63771325200, #      utc_end 2021-10-31 01:00:00 (Sun)
  63752587200, #  local_start 2021-03-28 04:00:00 (Sun)
  63771336000, #    local_end 2021-10-31 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63771325200, #    utc_start 2021-10-31 01:00:00 (Sun)
  63784026000, #      utc_end 2022-03-27 01:00:00 (Sun)
  63771332400, #  local_start 2021-10-31 03:00:00 (Sun)
  63784033200, #    local_end 2022-03-27 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63784026000, #    utc_start 2022-03-27 01:00:00 (Sun)
  63802774800, #      utc_end 2022-10-30 01:00:00 (Sun)
  63784036800, #  local_start 2022-03-27 04:00:00 (Sun)
  63802785600, #    local_end 2022-10-30 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63802774800, #    utc_start 2022-10-30 01:00:00 (Sun)
  63815475600, #      utc_end 2023-03-26 01:00:00 (Sun)
  63802782000, #  local_start 2022-10-30 03:00:00 (Sun)
  63815482800, #    local_end 2023-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63815475600, #    utc_start 2023-03-26 01:00:00 (Sun)
  63834224400, #      utc_end 2023-10-29 01:00:00 (Sun)
  63815486400, #  local_start 2023-03-26 04:00:00 (Sun)
  63834235200, #    local_end 2023-10-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63834224400, #    utc_start 2023-10-29 01:00:00 (Sun)
  63847530000, #      utc_end 2024-03-31 01:00:00 (Sun)
  63834231600, #  local_start 2023-10-29 03:00:00 (Sun)
  63847537200, #    local_end 2024-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63847530000, #    utc_start 2024-03-31 01:00:00 (Sun)
  63865674000, #      utc_end 2024-10-27 01:00:00 (Sun)
  63847540800, #  local_start 2024-03-31 04:00:00 (Sun)
  63865684800, #    local_end 2024-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63865674000, #    utc_start 2024-10-27 01:00:00 (Sun)
  63878979600, #      utc_end 2025-03-30 01:00:00 (Sun)
  63865681200, #  local_start 2024-10-27 03:00:00 (Sun)
  63878986800, #    local_end 2025-03-30 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63878979600, #    utc_start 2025-03-30 01:00:00 (Sun)
  63897123600, #      utc_end 2025-10-26 01:00:00 (Sun)
  63878990400, #  local_start 2025-03-30 04:00:00 (Sun)
  63897134400, #    local_end 2025-10-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63897123600, #    utc_start 2025-10-26 01:00:00 (Sun)
  63910429200, #      utc_end 2026-03-29 01:00:00 (Sun)
  63897130800, #  local_start 2025-10-26 03:00:00 (Sun)
  63910436400, #    local_end 2026-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63910429200, #    utc_start 2026-03-29 01:00:00 (Sun)
  63928573200, #      utc_end 2026-10-25 01:00:00 (Sun)
  63910440000, #  local_start 2026-03-29 04:00:00 (Sun)
  63928584000, #    local_end 2026-10-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63928573200, #    utc_start 2026-10-25 01:00:00 (Sun)
  63941878800, #      utc_end 2027-03-28 01:00:00 (Sun)
  63928580400, #  local_start 2026-10-25 03:00:00 (Sun)
  63941886000, #    local_end 2027-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63941878800, #    utc_start 2027-03-28 01:00:00 (Sun)
  63960627600, #      utc_end 2027-10-31 01:00:00 (Sun)
  63941889600, #  local_start 2027-03-28 04:00:00 (Sun)
  63960638400, #    local_end 2027-10-31 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63960627600, #    utc_start 2027-10-31 01:00:00 (Sun)
  63973328400, #      utc_end 2028-03-26 01:00:00 (Sun)
  63960634800, #  local_start 2027-10-31 03:00:00 (Sun)
  63973335600, #    local_end 2028-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63973328400, #    utc_start 2028-03-26 01:00:00 (Sun)
  63992077200, #      utc_end 2028-10-29 01:00:00 (Sun)
  63973339200, #  local_start 2028-03-26 04:00:00 (Sun)
  63992088000, #    local_end 2028-10-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63992077200, #    utc_start 2028-10-29 01:00:00 (Sun)
  64004778000, #      utc_end 2029-03-25 01:00:00 (Sun)
  63992084400, #  local_start 2028-10-29 03:00:00 (Sun)
  64004785200, #    local_end 2029-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  64004778000, #    utc_start 2029-03-25 01:00:00 (Sun)
  64023526800, #      utc_end 2029-10-28 01:00:00 (Sun)
  64004788800, #  local_start 2029-03-25 04:00:00 (Sun)
  64023537600, #    local_end 2029-10-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  64023526800, #    utc_start 2029-10-28 01:00:00 (Sun)
  64036832400, #      utc_end 2030-03-31 01:00:00 (Sun)
  64023534000, #  local_start 2029-10-28 03:00:00 (Sun)
  64036839600, #    local_end 2030-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  64036832400, #    utc_start 2030-03-31 01:00:00 (Sun)
  64054976400, #      utc_end 2030-10-27 01:00:00 (Sun)
  64036843200, #  local_start 2030-03-31 04:00:00 (Sun)
  64054987200, #    local_end 2030-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {56}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { 7200 }
  
  my $last_observance = bless( {
    'format' => 'EE%sT',
    'gmtoff' => '2:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 736631,
      'local_rd_secs' => 10800,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 736631,
      'utc_rd_secs' => 10800,
      'utc_year' => 2018
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => 7200,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 736631,
      'local_rd_secs' => 3600,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 736631,
      'utc_rd_secs' => 3600,
      'utc_year' => 2018
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '1:00u',
      'from' => '1981',
      'in' => 'Mar',
      'letter' => 'S',
      'name' => 'EUAsia',
      'offset_from_std' => 3600,
      'on' => 'lastSun',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '1:00u',
      'from' => '1996',
      'in' => 'Oct',
      'letter' => '',
      'name' => 'EUAsia',
      'offset_from_std' => 0,
      'on' => 'lastSun',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_FAMAGUSTA

    $main::fatpacked{"DateTime/TimeZone/Asia/Gaza.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_GAZA';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/asia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Gaza;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Gaza::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59950273328, #      utc_end 1900-09-30 21:42:08 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59950281600, #    local_end 1900-10-01 00:00:00 (Mon)
  8272,
  0,
  'LMT',
      ],
      [
  59950273328, #    utc_start 1900-09-30 21:42:08 (Sun)
  61202037600, #      utc_end 1940-05-31 22:00:00 (Fri)
  59950280528, #  local_start 1900-09-30 23:42:08 (Sun)
  61202044800, #    local_end 1940-06-01 00:00:00 (Sat)
  7200,
  0,
  'EET',
      ],
      [
  61202037600, #    utc_start 1940-05-31 22:00:00 (Fri)
  61278325200, #      utc_end 1942-10-31 21:00:00 (Sat)
  61202048400, #  local_start 1940-06-01 01:00:00 (Sat)
  61278336000, #    local_end 1942-11-01 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  61278325200, #    utc_start 1942-10-31 21:00:00 (Sat)
  61291382400, #      utc_end 1943-04-01 00:00:00 (Thu)
  61278332400, #  local_start 1942-10-31 23:00:00 (Sat)
  61291389600, #    local_end 1943-04-01 02:00:00 (Thu)
  7200,
  0,
  'EET',
      ],
      [
  61291382400, #    utc_start 1943-04-01 00:00:00 (Thu)
  61309861200, #      utc_end 1943-10-31 21:00:00 (Sun)
  61291393200, #  local_start 1943-04-01 03:00:00 (Thu)
  61309872000, #    local_end 1943-11-01 00:00:00 (Mon)
  10800,
  1,
  'EEST',
      ],
      [
  61309861200, #    utc_start 1943-10-31 21:00:00 (Sun)
  61322997600, #      utc_end 1944-03-31 22:00:00 (Fri)
  61309868400, #  local_start 1943-10-31 23:00:00 (Sun)
  61323004800, #    local_end 1944-04-01 00:00:00 (Sat)
  7200,
  0,
  'EET',
      ],
      [
  61322997600, #    utc_start 1944-03-31 22:00:00 (Fri)
  61341483600, #      utc_end 1944-10-31 21:00:00 (Tue)
  61323008400, #  local_start 1944-04-01 01:00:00 (Sat)
  61341494400, #    local_end 1944-11-01 00:00:00 (Wed)
  10800,
  1,
  'EEST',
      ],
      [
  61341483600, #    utc_start 1944-10-31 21:00:00 (Tue)
  61355829600, #      utc_end 1945-04-15 22:00:00 (Sun)
  61341490800, #  local_start 1944-10-31 23:00:00 (Tue)
  61355836800, #    local_end 1945-04-16 00:00:00 (Mon)
  7200,
  0,
  'EET',
      ],
      [
  61355829600, #    utc_start 1945-04-15 22:00:00 (Sun)
  61373026800, #      utc_end 1945-10-31 23:00:00 (Wed)
  61355840400, #  local_start 1945-04-16 01:00:00 (Mon)
  61373037600, #    local_end 1945-11-01 02:00:00 (Thu)
  10800,
  1,
  'EEST',
      ],
      [
  61373026800, #    utc_start 1945-10-31 23:00:00 (Wed)
  61387372800, #      utc_end 1946-04-16 00:00:00 (Tue)
  61373034000, #  local_start 1945-11-01 01:00:00 (Thu)
  61387380000, #    local_end 1946-04-16 02:00:00 (Tue)
  7200,
  0,
  'EET',
      ],
      [
  61387372800, #    utc_start 1946-04-16 00:00:00 (Tue)
  61404555600, #      utc_end 1946-10-31 21:00:00 (Thu)
  61387383600, #  local_start 1946-04-16 03:00:00 (Tue)
  61404566400, #    local_end 1946-11-01 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  61404555600, #    utc_start 1946-10-31 21:00:00 (Thu)
  61453029600, #      utc_end 1948-05-14 22:00:00 (Fri)
  61404562800, #  local_start 1946-10-31 23:00:00 (Thu)
  61453036800, #    local_end 1948-05-15 00:00:00 (Sat)
  7200,
  0,
  'EET',
      ],
      [
  61453029600, #    utc_start 1948-05-14 22:00:00 (Fri)
  61736594400, #      utc_end 1957-05-09 22:00:00 (Thu)
  61453036800, #  local_start 1948-05-15 00:00:00 (Sat)
  61736601600, #    local_end 1957-05-10 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  61736594400, #    utc_start 1957-05-09 22:00:00 (Thu)
  61749032400, #      utc_end 1957-09-30 21:00:00 (Mon)
  61736605200, #  local_start 1957-05-10 01:00:00 (Fri)
  61749043200, #    local_end 1957-10-01 00:00:00 (Tue)
  10800,
  1,
  'EEST',
      ],
      [
  61749032400, #    utc_start 1957-09-30 21:00:00 (Mon)
  61767352800, #      utc_end 1958-04-30 22:00:00 (Wed)
  61749039600, #  local_start 1957-09-30 23:00:00 (Mon)
  61767360000, #    local_end 1958-05-01 00:00:00 (Thu)
  7200,
  0,
  'EET',
      ],
      [
  61767352800, #    utc_start 1958-04-30 22:00:00 (Wed)
  61780568400, #      utc_end 1958-09-30 21:00:00 (Tue)
  61767363600, #  local_start 1958-05-01 01:00:00 (Thu)
  61780579200, #    local_end 1958-10-01 00:00:00 (Wed)
  10800,
  1,
  'EEST',
      ],
      [
  61780568400, #    utc_start 1958-09-30 21:00:00 (Tue)
  61798892400, #      utc_end 1959-04-30 23:00:00 (Thu)
  61780575600, #  local_start 1958-09-30 23:00:00 (Tue)
  61798899600, #    local_end 1959-05-01 01:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  61798892400, #    utc_start 1959-04-30 23:00:00 (Thu)
  61812028800, #      utc_end 1959-09-30 00:00:00 (Wed)
  61798903200, #  local_start 1959-05-01 02:00:00 (Fri)
  61812039600, #    local_end 1959-09-30 03:00:00 (Wed)
  10800,
  1,
  'EEST',
      ],
      [
  61812028800, #    utc_start 1959-09-30 00:00:00 (Wed)
  61830514800, #      utc_end 1960-04-30 23:00:00 (Sat)
  61812036000, #  local_start 1959-09-30 02:00:00 (Wed)
  61830522000, #    local_end 1960-05-01 01:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  61830514800, #    utc_start 1960-04-30 23:00:00 (Sat)
  61843651200, #      utc_end 1960-09-30 00:00:00 (Fri)
  61830525600, #  local_start 1960-05-01 02:00:00 (Sun)
  61843662000, #    local_end 1960-09-30 03:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  61843651200, #    utc_start 1960-09-30 00:00:00 (Fri)
  61862050800, #      utc_end 1961-04-30 23:00:00 (Sun)
  61843658400, #  local_start 1960-09-30 02:00:00 (Fri)
  61862058000, #    local_end 1961-05-01 01:00:00 (Mon)
  7200,
  0,
  'EET',
      ],
      [
  61862050800, #    utc_start 1961-04-30 23:00:00 (Sun)
  61875187200, #      utc_end 1961-09-30 00:00:00 (Sat)
  61862061600, #  local_start 1961-05-01 02:00:00 (Mon)
  61875198000, #    local_end 1961-09-30 03:00:00 (Sat)
  10800,
  1,
  'EEST',
      ],
      [
  61875187200, #    utc_start 1961-09-30 00:00:00 (Sat)
  61893586800, #      utc_end 1962-04-30 23:00:00 (Mon)
  61875194400, #  local_start 1961-09-30 02:00:00 (Sat)
  61893594000, #    local_end 1962-05-01 01:00:00 (Tue)
  7200,
  0,
  'EET',
      ],
      [
  61893586800, #    utc_start 1962-04-30 23:00:00 (Mon)
  61906723200, #      utc_end 1962-09-30 00:00:00 (Sun)
  61893597600, #  local_start 1962-05-01 02:00:00 (Tue)
  61906734000, #    local_end 1962-09-30 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  61906723200, #    utc_start 1962-09-30 00:00:00 (Sun)
  61925122800, #      utc_end 1963-04-30 23:00:00 (Tue)
  61906730400, #  local_start 1962-09-30 02:00:00 (Sun)
  61925130000, #    local_end 1963-05-01 01:00:00 (Wed)
  7200,
  0,
  'EET',
      ],
      [
  61925122800, #    utc_start 1963-04-30 23:00:00 (Tue)
  61938259200, #      utc_end 1963-09-30 00:00:00 (Mon)
  61925133600, #  local_start 1963-05-01 02:00:00 (Wed)
  61938270000, #    local_end 1963-09-30 03:00:00 (Mon)
  10800,
  1,
  'EEST',
      ],
      [
  61938259200, #    utc_start 1963-09-30 00:00:00 (Mon)
  61956745200, #      utc_end 1964-04-30 23:00:00 (Thu)
  61938266400, #  local_start 1963-09-30 02:00:00 (Mon)
  61956752400, #    local_end 1964-05-01 01:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  61956745200, #    utc_start 1964-04-30 23:00:00 (Thu)
  61969881600, #      utc_end 1964-09-30 00:00:00 (Wed)
  61956756000, #  local_start 1964-05-01 02:00:00 (Fri)
  61969892400, #    local_end 1964-09-30 03:00:00 (Wed)
  10800,
  1,
  'EEST',
      ],
      [
  61969881600, #    utc_start 1964-09-30 00:00:00 (Wed)
  61988281200, #      utc_end 1965-04-30 23:00:00 (Fri)
  61969888800, #  local_start 1964-09-30 02:00:00 (Wed)
  61988288400, #    local_end 1965-05-01 01:00:00 (Sat)
  7200,
  0,
  'EET',
      ],
      [
  61988281200, #    utc_start 1965-04-30 23:00:00 (Fri)
  62001417600, #      utc_end 1965-09-30 00:00:00 (Thu)
  61988292000, #  local_start 1965-05-01 02:00:00 (Sat)
  62001428400, #    local_end 1965-09-30 03:00:00 (Thu)
  10800,
  1,
  'EEST',
      ],
      [
  62001417600, #    utc_start 1965-09-30 00:00:00 (Thu)
  62019817200, #      utc_end 1966-04-30 23:00:00 (Sat)
  62001424800, #  local_start 1965-09-30 02:00:00 (Thu)
  62019824400, #    local_end 1966-05-01 01:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62019817200, #    utc_start 1966-04-30 23:00:00 (Sat)
  62033040000, #      utc_end 1966-10-01 00:00:00 (Sat)
  62019828000, #  local_start 1966-05-01 02:00:00 (Sun)
  62033050800, #    local_end 1966-10-01 03:00:00 (Sat)
  10800,
  1,
  'EEST',
      ],
      [
  62033040000, #    utc_start 1966-10-01 00:00:00 (Sat)
  62051353200, #      utc_end 1967-04-30 23:00:00 (Sun)
  62033047200, #  local_start 1966-10-01 02:00:00 (Sat)
  62051360400, #    local_end 1967-05-01 01:00:00 (Mon)
  7200,
  0,
  'EET',
      ],
      [
  62051353200, #    utc_start 1967-04-30 23:00:00 (Sun)
  62054370000, #      utc_end 1967-06-04 21:00:00 (Sun)
  62051364000, #  local_start 1967-05-01 02:00:00 (Mon)
  62054380800, #    local_end 1967-06-05 00:00:00 (Mon)
  10800,
  1,
  'EEST',
      ],
      [
  62054370000, #    utc_start 1967-06-04 21:00:00 (Sun)
  62278063200, #      utc_end 1974-07-06 22:00:00 (Sat)
  62054377200, #  local_start 1967-06-04 23:00:00 (Sun)
  62278070400, #    local_end 1974-07-07 00:00:00 (Sun)
  7200,
  0,
  'IST',
      ],
      [
  62278063200, #    utc_start 1974-07-06 22:00:00 (Sat)
  62286526800, #      utc_end 1974-10-12 21:00:00 (Sat)
  62278074000, #  local_start 1974-07-07 01:00:00 (Sun)
  62286537600, #    local_end 1974-10-13 00:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  62286526800, #    utc_start 1974-10-12 21:00:00 (Sat)
  62302860000, #      utc_end 1975-04-19 22:00:00 (Sat)
  62286534000, #  local_start 1974-10-12 23:00:00 (Sat)
  62302867200, #    local_end 1975-04-20 00:00:00 (Sun)
  7200,
  0,
  'IST',
      ],
      [
  62302860000, #    utc_start 1975-04-19 22:00:00 (Sat)
  62314347600, #      utc_end 1975-08-30 21:00:00 (Sat)
  62302870800, #  local_start 1975-04-20 01:00:00 (Sun)
  62314358400, #    local_end 1975-08-31 00:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  62314347600, #    utc_start 1975-08-30 21:00:00 (Sat)
  62469698400, #      utc_end 1980-08-01 22:00:00 (Fri)
  62314354800, #  local_start 1975-08-30 23:00:00 (Sat)
  62469705600, #    local_end 1980-08-02 00:00:00 (Sat)
  7200,
  0,
  'IST',
      ],
      [
  62469698400, #    utc_start 1980-08-01 22:00:00 (Fri)
  62473327200, #      utc_end 1980-09-12 22:00:00 (Fri)
  62469709200, #  local_start 1980-08-02 01:00:00 (Sat)
  62473338000, #    local_end 1980-09-13 01:00:00 (Sat)
  10800,
  1,
  'IDT',
      ],
      [
  62473327200, #    utc_start 1980-09-12 22:00:00 (Fri)
  62588239200, #      utc_end 1984-05-04 22:00:00 (Fri)
  62473334400, #  local_start 1980-09-13 00:00:00 (Sat)
  62588246400, #    local_end 1984-05-05 00:00:00 (Sat)
  7200,
  0,
  'IST',
      ],
      [
  62588239200, #    utc_start 1984-05-04 22:00:00 (Fri)
  62597916000, #      utc_end 1984-08-24 22:00:00 (Fri)
  62588250000, #  local_start 1984-05-05 01:00:00 (Sat)
  62597926800, #    local_end 1984-08-25 01:00:00 (Sat)
  10800,
  1,
  'IDT',
      ],
      [
  62597916000, #    utc_start 1984-08-24 22:00:00 (Fri)
  62617960800, #      utc_end 1985-04-13 22:00:00 (Sat)
  62597923200, #  local_start 1984-08-25 00:00:00 (Sat)
  62617968000, #    local_end 1985-04-14 00:00:00 (Sun)
  7200,
  0,
  'IST',
      ],
      [
  62617960800, #    utc_start 1985-04-13 22:00:00 (Sat)
  62631262800, #      utc_end 1985-09-14 21:00:00 (Sat)
  62617971600, #  local_start 1985-04-14 01:00:00 (Sun)
  62631273600, #    local_end 1985-09-15 00:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  62631262800, #    utc_start 1985-09-14 21:00:00 (Sat)
  62652434400, #      utc_end 1986-05-17 22:00:00 (Sat)
  62631270000, #  local_start 1985-09-14 23:00:00 (Sat)
  62652441600, #    local_end 1986-05-18 00:00:00 (Sun)
  7200,
  0,
  'IST',
      ],
      [
  62652434400, #    utc_start 1986-05-17 22:00:00 (Sat)
  62662107600, #      utc_end 1986-09-06 21:00:00 (Sat)
  62652445200, #  local_start 1986-05-18 01:00:00 (Sun)
  62662118400, #    local_end 1986-09-07 00:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  62662107600, #    utc_start 1986-09-06 21:00:00 (Sat)
  62681119200, #      utc_end 1987-04-14 22:00:00 (Tue)
  62662114800, #  local_start 1986-09-06 23:00:00 (Sat)
  62681126400, #    local_end 1987-04-15 00:00:00 (Wed)
  7200,
  0,
  'IST',
      ],
      [
  62681119200, #    utc_start 1987-04-14 22:00:00 (Tue)
  62694162000, #      utc_end 1987-09-12 21:00:00 (Sat)
  62681130000, #  local_start 1987-04-15 01:00:00 (Wed)
  62694172800, #    local_end 1987-09-13 00:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  62694162000, #    utc_start 1987-09-12 21:00:00 (Sat)
  62712309600, #      utc_end 1988-04-09 22:00:00 (Sat)
  62694169200, #  local_start 1987-09-12 23:00:00 (Sat)
  62712316800, #    local_end 1988-04-10 00:00:00 (Sun)
  7200,
  0,
  'IST',
      ],
      [
  62712309600, #    utc_start 1988-04-09 22:00:00 (Sat)
  62725006800, #      utc_end 1988-09-03 21:00:00 (Sat)
  62712320400, #  local_start 1988-04-10 01:00:00 (Sun)
  62725017600, #    local_end 1988-09-04 00:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  62725006800, #    utc_start 1988-09-03 21:00:00 (Sat)
  62745573600, #      utc_end 1989-04-29 22:00:00 (Sat)
  62725014000, #  local_start 1988-09-03 23:00:00 (Sat)
  62745580800, #    local_end 1989-04-30 00:00:00 (Sun)
  7200,
  0,
  'IST',
      ],
      [
  62745573600, #    utc_start 1989-04-29 22:00:00 (Sat)
  62756456400, #      utc_end 1989-09-02 21:00:00 (Sat)
  62745584400, #  local_start 1989-04-30 01:00:00 (Sun)
  62756467200, #    local_end 1989-09-03 00:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  62756456400, #    utc_start 1989-09-02 21:00:00 (Sat)
  62773999200, #      utc_end 1990-03-24 22:00:00 (Sat)
  62756463600, #  local_start 1989-09-02 23:00:00 (Sat)
  62774006400, #    local_end 1990-03-25 00:00:00 (Sun)
  7200,
  0,
  'IST',
      ],
      [
  62773999200, #    utc_start 1990-03-24 22:00:00 (Sat)
  62787301200, #      utc_end 1990-08-25 21:00:00 (Sat)
  62774010000, #  local_start 1990-03-25 01:00:00 (Sun)
  62787312000, #    local_end 1990-08-26 00:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  62787301200, #    utc_start 1990-08-25 21:00:00 (Sat)
  62805448800, #      utc_end 1991-03-23 22:00:00 (Sat)
  62787308400, #  local_start 1990-08-25 23:00:00 (Sat)
  62805456000, #    local_end 1991-03-24 00:00:00 (Sun)
  7200,
  0,
  'IST',
      ],
      [
  62805448800, #    utc_start 1991-03-23 22:00:00 (Sat)
  62819355600, #      utc_end 1991-08-31 21:00:00 (Sat)
  62805459600, #  local_start 1991-03-24 01:00:00 (Sun)
  62819366400, #    local_end 1991-09-01 00:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  62819355600, #    utc_start 1991-08-31 21:00:00 (Sat)
  62837503200, #      utc_end 1992-03-28 22:00:00 (Sat)
  62819362800, #  local_start 1991-08-31 23:00:00 (Sat)
  62837510400, #    local_end 1992-03-29 00:00:00 (Sun)
  7200,
  0,
  'IST',
      ],
      [
  62837503200, #    utc_start 1992-03-28 22:00:00 (Sat)
  62851410000, #      utc_end 1992-09-05 21:00:00 (Sat)
  62837514000, #  local_start 1992-03-29 01:00:00 (Sun)
  62851420800, #    local_end 1992-09-06 00:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  62851410000, #    utc_start 1992-09-05 21:00:00 (Sat)
  62869384800, #      utc_end 1993-04-01 22:00:00 (Thu)
  62851417200, #  local_start 1992-09-05 23:00:00 (Sat)
  62869392000, #    local_end 1993-04-02 00:00:00 (Fri)
  7200,
  0,
  'IST',
      ],
      [
  62869384800, #    utc_start 1993-04-01 22:00:00 (Thu)
  62882859600, #      utc_end 1993-09-04 21:00:00 (Sat)
  62869395600, #  local_start 1993-04-02 01:00:00 (Fri)
  62882870400, #    local_end 1993-09-05 00:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  62882859600, #    utc_start 1993-09-04 21:00:00 (Sat)
  62900834400, #      utc_end 1994-03-31 22:00:00 (Thu)
  62882866800, #  local_start 1993-09-04 23:00:00 (Sat)
  62900841600, #    local_end 1994-04-01 00:00:00 (Fri)
  7200,
  0,
  'IST',
      ],
      [
  62900834400, #    utc_start 1994-03-31 22:00:00 (Thu)
  62913704400, #      utc_end 1994-08-27 21:00:00 (Sat)
  62900845200, #  local_start 1994-04-01 01:00:00 (Fri)
  62913715200, #    local_end 1994-08-28 00:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  62913704400, #    utc_start 1994-08-27 21:00:00 (Sat)
  62932284000, #      utc_end 1995-03-30 22:00:00 (Thu)
  62913711600, #  local_start 1994-08-27 23:00:00 (Sat)
  62932291200, #    local_end 1995-03-31 00:00:00 (Fri)
  7200,
  0,
  'IST',
      ],
      [
  62932284000, #    utc_start 1995-03-30 22:00:00 (Thu)
  62945758800, #      utc_end 1995-09-02 21:00:00 (Sat)
  62932294800, #  local_start 1995-03-31 01:00:00 (Fri)
  62945769600, #    local_end 1995-09-03 00:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  62945758800, #    utc_start 1995-09-02 21:00:00 (Sat)
  62956130400, #      utc_end 1995-12-31 22:00:00 (Sun)
  62945766000, #  local_start 1995-09-02 23:00:00 (Sat)
  62956137600, #    local_end 1996-01-01 00:00:00 (Mon)
  7200,
  0,
  'IST',
      ],
      [
  62956130400, #    utc_start 1995-12-31 22:00:00 (Sun)
  62964338400, #      utc_end 1996-04-04 22:00:00 (Thu)
  62956137600, #  local_start 1996-01-01 00:00:00 (Mon)
  62964345600, #    local_end 1996-04-05 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  62964338400, #    utc_start 1996-04-04 22:00:00 (Thu)
  62978853600, #      utc_end 1996-09-19 22:00:00 (Thu)
  62964349200, #  local_start 1996-04-05 01:00:00 (Fri)
  62978864400, #    local_end 1996-09-20 01:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  62978853600, #    utc_start 1996-09-19 22:00:00 (Thu)
  62995788000, #      utc_end 1997-04-03 22:00:00 (Thu)
  62978860800, #  local_start 1996-09-20 00:00:00 (Fri)
  62995795200, #    local_end 1997-04-04 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  62995788000, #    utc_start 1997-04-03 22:00:00 (Thu)
  63010303200, #      utc_end 1997-09-18 22:00:00 (Thu)
  62995798800, #  local_start 1997-04-04 01:00:00 (Fri)
  63010314000, #    local_end 1997-09-19 01:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63010303200, #    utc_start 1997-09-18 22:00:00 (Thu)
  63027237600, #      utc_end 1998-04-02 22:00:00 (Thu)
  63010310400, #  local_start 1997-09-19 00:00:00 (Fri)
  63027244800, #    local_end 1998-04-03 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63027237600, #    utc_start 1998-04-02 22:00:00 (Thu)
  63041752800, #      utc_end 1998-09-17 22:00:00 (Thu)
  63027248400, #  local_start 1998-04-03 01:00:00 (Fri)
  63041763600, #    local_end 1998-09-18 01:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63041752800, #    utc_start 1998-09-17 22:00:00 (Thu)
  63050824800, #      utc_end 1998-12-31 22:00:00 (Thu)
  63041760000, #  local_start 1998-09-18 00:00:00 (Fri)
  63050832000, #    local_end 1999-01-01 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63050824800, #    utc_start 1998-12-31 22:00:00 (Thu)
  63059896800, #      utc_end 1999-04-15 22:00:00 (Thu)
  63050832000, #  local_start 1999-01-01 00:00:00 (Fri)
  63059904000, #    local_end 1999-04-16 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63059896800, #    utc_start 1999-04-15 22:00:00 (Thu)
  63075618000, #      utc_end 1999-10-14 21:00:00 (Thu)
  63059907600, #  local_start 1999-04-16 01:00:00 (Fri)
  63075628800, #    local_end 1999-10-15 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63075618000, #    utc_start 1999-10-14 21:00:00 (Thu)
  63091951200, #      utc_end 2000-04-20 22:00:00 (Thu)
  63075625200, #  local_start 1999-10-14 23:00:00 (Thu)
  63091958400, #    local_end 2000-04-21 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63091951200, #    utc_start 2000-04-20 22:00:00 (Thu)
  63107672400, #      utc_end 2000-10-19 21:00:00 (Thu)
  63091962000, #  local_start 2000-04-21 01:00:00 (Fri)
  63107683200, #    local_end 2000-10-20 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63107672400, #    utc_start 2000-10-19 21:00:00 (Thu)
  63123400800, #      utc_end 2001-04-19 22:00:00 (Thu)
  63107679600, #  local_start 2000-10-19 23:00:00 (Thu)
  63123408000, #    local_end 2001-04-20 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63123400800, #    utc_start 2001-04-19 22:00:00 (Thu)
  63139122000, #      utc_end 2001-10-18 21:00:00 (Thu)
  63123411600, #  local_start 2001-04-20 01:00:00 (Fri)
  63139132800, #    local_end 2001-10-19 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63139122000, #    utc_start 2001-10-18 21:00:00 (Thu)
  63154850400, #      utc_end 2002-04-18 22:00:00 (Thu)
  63139129200, #  local_start 2001-10-18 23:00:00 (Thu)
  63154857600, #    local_end 2002-04-19 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63154850400, #    utc_start 2002-04-18 22:00:00 (Thu)
  63170571600, #      utc_end 2002-10-17 21:00:00 (Thu)
  63154861200, #  local_start 2002-04-19 01:00:00 (Fri)
  63170582400, #    local_end 2002-10-18 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63170571600, #    utc_start 2002-10-17 21:00:00 (Thu)
  63186300000, #      utc_end 2003-04-17 22:00:00 (Thu)
  63170578800, #  local_start 2002-10-17 23:00:00 (Thu)
  63186307200, #    local_end 2003-04-18 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63186300000, #    utc_start 2003-04-17 22:00:00 (Thu)
  63202021200, #      utc_end 2003-10-16 21:00:00 (Thu)
  63186310800, #  local_start 2003-04-18 01:00:00 (Fri)
  63202032000, #    local_end 2003-10-17 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63202021200, #    utc_start 2003-10-16 21:00:00 (Thu)
  63217749600, #      utc_end 2004-04-15 22:00:00 (Thu)
  63202028400, #  local_start 2003-10-16 23:00:00 (Thu)
  63217756800, #    local_end 2004-04-16 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63217749600, #    utc_start 2004-04-15 22:00:00 (Thu)
  63232264800, #      utc_end 2004-09-30 22:00:00 (Thu)
  63217760400, #  local_start 2004-04-16 01:00:00 (Fri)
  63232275600, #    local_end 2004-10-01 01:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63232264800, #    utc_start 2004-09-30 22:00:00 (Thu)
  63249199200, #      utc_end 2005-04-14 22:00:00 (Thu)
  63232272000, #  local_start 2004-10-01 00:00:00 (Fri)
  63249206400, #    local_end 2005-04-15 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63249199200, #    utc_start 2005-04-14 22:00:00 (Thu)
  63264063600, #      utc_end 2005-10-03 23:00:00 (Mon)
  63249210000, #  local_start 2005-04-15 01:00:00 (Fri)
  63264074400, #    local_end 2005-10-04 02:00:00 (Tue)
  10800,
  1,
  'EEST',
      ],
      [
  63264063600, #    utc_start 2005-10-03 23:00:00 (Mon)
  63279525600, #      utc_end 2006-03-31 22:00:00 (Fri)
  63264070800, #  local_start 2005-10-04 01:00:00 (Tue)
  63279532800, #    local_end 2006-04-01 00:00:00 (Sat)
  7200,
  0,
  'EET',
      ],
      [
  63279525600, #    utc_start 2006-03-31 22:00:00 (Fri)
  63294555600, #      utc_end 2006-09-21 21:00:00 (Thu)
  63279536400, #  local_start 2006-04-01 01:00:00 (Sat)
  63294566400, #    local_end 2006-09-22 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63294555600, #    utc_start 2006-09-21 21:00:00 (Thu)
  63311061600, #      utc_end 2007-03-31 22:00:00 (Sat)
  63294562800, #  local_start 2006-09-21 23:00:00 (Thu)
  63311068800, #    local_end 2007-04-01 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63311061600, #    utc_start 2007-03-31 22:00:00 (Sat)
  63325321200, #      utc_end 2007-09-12 23:00:00 (Wed)
  63311072400, #  local_start 2007-04-01 01:00:00 (Sun)
  63325332000, #    local_end 2007-09-13 02:00:00 (Thu)
  10800,
  1,
  'EEST',
      ],
      [
  63325321200, #    utc_start 2007-09-12 23:00:00 (Wed)
  63342338400, #      utc_end 2008-03-27 22:00:00 (Thu)
  63325328400, #  local_start 2007-09-13 01:00:00 (Thu)
  63342345600, #    local_end 2008-03-28 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63342338400, #    utc_start 2008-03-27 22:00:00 (Thu)
  63355640400, #      utc_end 2008-08-28 21:00:00 (Thu)
  63342349200, #  local_start 2008-03-28 01:00:00 (Fri)
  63355651200, #    local_end 2008-08-29 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63355640400, #    utc_start 2008-08-28 21:00:00 (Thu)
  63355903200, #      utc_end 2008-08-31 22:00:00 (Sun)
  63355647600, #  local_start 2008-08-28 23:00:00 (Thu)
  63355910400, #    local_end 2008-09-01 00:00:00 (Mon)
  7200,
  0,
  'EET',
      ],
      [
  63355903200, #    utc_start 2008-08-31 22:00:00 (Sun)
  63373788000, #      utc_end 2009-03-26 22:00:00 (Thu)
  63355910400, #  local_start 2008-09-01 00:00:00 (Mon)
  63373795200, #    local_end 2009-03-27 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63373788000, #    utc_start 2009-03-26 22:00:00 (Thu)
  63387698400, #      utc_end 2009-09-03 22:00:00 (Thu)
  63373798800, #  local_start 2009-03-27 01:00:00 (Fri)
  63387709200, #    local_end 2009-09-04 01:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63387698400, #    utc_start 2009-09-03 22:00:00 (Thu)
  63397980000, #      utc_end 2009-12-31 22:00:00 (Thu)
  63387705600, #  local_start 2009-09-04 00:00:00 (Fri)
  63397987200, #    local_end 2010-01-01 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63397980000, #    utc_start 2009-12-31 22:00:00 (Thu)
  63405324060, #      utc_end 2010-03-26 22:01:00 (Fri)
  63397987200, #  local_start 2010-01-01 00:00:00 (Fri)
  63405331260, #    local_end 2010-03-27 00:01:00 (Sat)
  7200,
  0,
  'EET',
      ],
      [
  63405324060, #    utc_start 2010-03-26 22:01:00 (Fri)
  63417157200, #      utc_end 2010-08-10 21:00:00 (Tue)
  63405334860, #  local_start 2010-03-27 01:01:00 (Sat)
  63417168000, #    local_end 2010-08-11 00:00:00 (Wed)
  10800,
  1,
  'EEST',
      ],
      [
  63417157200, #    utc_start 2010-08-10 21:00:00 (Tue)
  63437292060, #      utc_end 2011-03-31 22:01:00 (Thu)
  63417164400, #  local_start 2010-08-10 23:00:00 (Tue)
  63437299260, #    local_end 2011-04-01 00:01:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63437292060, #    utc_start 2011-03-31 22:01:00 (Thu)
  63447829200, #      utc_end 2011-07-31 21:00:00 (Sun)
  63437302860, #  local_start 2011-04-01 01:01:00 (Fri)
  63447840000, #    local_end 2011-08-01 00:00:00 (Mon)
  10800,
  1,
  'EEST',
      ],
      [
  63447829200, #    utc_start 2011-07-31 21:00:00 (Sun)
  63461052000, #      utc_end 2011-12-31 22:00:00 (Sat)
  63447836400, #  local_start 2011-07-31 23:00:00 (Sun)
  63461059200, #    local_end 2012-01-01 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63461052000, #    utc_start 2011-12-31 22:00:00 (Sat)
  63468741600, #      utc_end 2012-03-29 22:00:00 (Thu)
  63461059200, #  local_start 2012-01-01 00:00:00 (Sun)
  63468748800, #    local_end 2012-03-30 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63468741600, #    utc_start 2012-03-29 22:00:00 (Thu)
  63483861600, #      utc_end 2012-09-20 22:00:00 (Thu)
  63468752400, #  local_start 2012-03-30 01:00:00 (Fri)
  63483872400, #    local_end 2012-09-21 01:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63483861600, #    utc_start 2012-09-20 22:00:00 (Thu)
  63500191200, #      utc_end 2013-03-28 22:00:00 (Thu)
  63483868800, #  local_start 2012-09-21 00:00:00 (Fri)
  63500198400, #    local_end 2013-03-29 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63500191200, #    utc_start 2013-03-28 22:00:00 (Thu)
  63515912400, #      utc_end 2013-09-26 21:00:00 (Thu)
  63500202000, #  local_start 2013-03-29 01:00:00 (Fri)
  63515923200, #    local_end 2013-09-27 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63515912400, #    utc_start 2013-09-26 21:00:00 (Thu)
  63531640800, #      utc_end 2014-03-27 22:00:00 (Thu)
  63515919600, #  local_start 2013-09-26 23:00:00 (Thu)
  63531648000, #    local_end 2014-03-28 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63531640800, #    utc_start 2014-03-27 22:00:00 (Thu)
  63549781200, #      utc_end 2014-10-23 21:00:00 (Thu)
  63531651600, #  local_start 2014-03-28 01:00:00 (Fri)
  63549792000, #    local_end 2014-10-24 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63549781200, #    utc_start 2014-10-23 21:00:00 (Thu)
  63563176800, #      utc_end 2015-03-27 22:00:00 (Fri)
  63549788400, #  local_start 2014-10-23 23:00:00 (Thu)
  63563184000, #    local_end 2015-03-28 00:00:00 (Sat)
  7200,
  0,
  'EET',
      ],
      [
  63563176800, #    utc_start 2015-03-27 22:00:00 (Fri)
  63581230800, #      utc_end 2015-10-22 21:00:00 (Thu)
  63563187600, #  local_start 2015-03-28 01:00:00 (Sat)
  63581241600, #    local_end 2015-10-23 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63581230800, #    utc_start 2015-10-22 21:00:00 (Thu)
  63594630000, #      utc_end 2016-03-25 23:00:00 (Fri)
  63581238000, #  local_start 2015-10-22 23:00:00 (Thu)
  63594637200, #    local_end 2016-03-26 01:00:00 (Sat)
  7200,
  0,
  'EET',
      ],
      [
  63594630000, #    utc_start 2016-03-25 23:00:00 (Fri)
  63613375200, #      utc_end 2016-10-28 22:00:00 (Fri)
  63594640800, #  local_start 2016-03-26 02:00:00 (Sat)
  63613386000, #    local_end 2016-10-29 01:00:00 (Sat)
  10800,
  1,
  'EEST',
      ],
      [
  63613375200, #    utc_start 2016-10-28 22:00:00 (Fri)
  63626079600, #      utc_end 2017-03-24 23:00:00 (Fri)
  63613382400, #  local_start 2016-10-29 00:00:00 (Sat)
  63626086800, #    local_end 2017-03-25 01:00:00 (Sat)
  7200,
  0,
  'EET',
      ],
      [
  63626079600, #    utc_start 2017-03-24 23:00:00 (Fri)
  63644824800, #      utc_end 2017-10-27 22:00:00 (Fri)
  63626090400, #  local_start 2017-03-25 02:00:00 (Sat)
  63644835600, #    local_end 2017-10-28 01:00:00 (Sat)
  10800,
  1,
  'EEST',
      ],
      [
  63644824800, #    utc_start 2017-10-27 22:00:00 (Fri)
  63657529200, #      utc_end 2018-03-23 23:00:00 (Fri)
  63644832000, #  local_start 2017-10-28 00:00:00 (Sat)
  63657536400, #    local_end 2018-03-24 01:00:00 (Sat)
  7200,
  0,
  'EET',
      ],
      [
  63657529200, #    utc_start 2018-03-23 23:00:00 (Fri)
  63676274400, #      utc_end 2018-10-26 22:00:00 (Fri)
  63657540000, #  local_start 2018-03-24 02:00:00 (Sat)
  63676285200, #    local_end 2018-10-27 01:00:00 (Sat)
  10800,
  1,
  'EEST',
      ],
      [
  63676274400, #    utc_start 2018-10-26 22:00:00 (Fri)
  63689493600, #      utc_end 2019-03-28 22:00:00 (Thu)
  63676281600, #  local_start 2018-10-27 00:00:00 (Sat)
  63689500800, #    local_end 2019-03-29 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63689493600, #    utc_start 2019-03-28 22:00:00 (Thu)
  63707724000, #      utc_end 2019-10-25 22:00:00 (Fri)
  63689504400, #  local_start 2019-03-29 01:00:00 (Fri)
  63707734800, #    local_end 2019-10-26 01:00:00 (Sat)
  10800,
  1,
  'EEST',
      ],
      [
  63707724000, #    utc_start 2019-10-25 22:00:00 (Fri)
  63720943200, #      utc_end 2020-03-26 22:00:00 (Thu)
  63707731200, #  local_start 2019-10-26 00:00:00 (Sat)
  63720950400, #    local_end 2020-03-27 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63720943200, #    utc_start 2020-03-26 22:00:00 (Thu)
  63739778400, #      utc_end 2020-10-30 22:00:00 (Fri)
  63720954000, #  local_start 2020-03-27 01:00:00 (Fri)
  63739789200, #    local_end 2020-10-31 01:00:00 (Sat)
  10800,
  1,
  'EEST',
      ],
      [
  63739778400, #    utc_start 2020-10-30 22:00:00 (Fri)
  63752392800, #      utc_end 2021-03-25 22:00:00 (Thu)
  63739785600, #  local_start 2020-10-31 00:00:00 (Sat)
  63752400000, #    local_end 2021-03-26 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63752392800, #    utc_start 2021-03-25 22:00:00 (Thu)
  63771228000, #      utc_end 2021-10-29 22:00:00 (Fri)
  63752403600, #  local_start 2021-03-26 01:00:00 (Fri)
  63771238800, #    local_end 2021-10-30 01:00:00 (Sat)
  10800,
  1,
  'EEST',
      ],
      [
  63771228000, #    utc_start 2021-10-29 22:00:00 (Fri)
  63783842400, #      utc_end 2022-03-24 22:00:00 (Thu)
  63771235200, #  local_start 2021-10-30 00:00:00 (Sat)
  63783849600, #    local_end 2022-03-25 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63783842400, #    utc_start 2022-03-24 22:00:00 (Thu)
  63802677600, #      utc_end 2022-10-28 22:00:00 (Fri)
  63783853200, #  local_start 2022-03-25 01:00:00 (Fri)
  63802688400, #    local_end 2022-10-29 01:00:00 (Sat)
  10800,
  1,
  'EEST',
      ],
      [
  63802677600, #    utc_start 2022-10-28 22:00:00 (Fri)
  63815896800, #      utc_end 2023-03-30 22:00:00 (Thu)
  63802684800, #  local_start 2022-10-29 00:00:00 (Sat)
  63815904000, #    local_end 2023-03-31 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63815896800, #    utc_start 2023-03-30 22:00:00 (Thu)
  63834127200, #      utc_end 2023-10-27 22:00:00 (Fri)
  63815907600, #  local_start 2023-03-31 01:00:00 (Fri)
  63834138000, #    local_end 2023-10-28 01:00:00 (Sat)
  10800,
  1,
  'EEST',
      ],
      [
  63834127200, #    utc_start 2023-10-27 22:00:00 (Fri)
  63847346400, #      utc_end 2024-03-28 22:00:00 (Thu)
  63834134400, #  local_start 2023-10-28 00:00:00 (Sat)
  63847353600, #    local_end 2024-03-29 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63847346400, #    utc_start 2024-03-28 22:00:00 (Thu)
  63865576800, #      utc_end 2024-10-25 22:00:00 (Fri)
  63847357200, #  local_start 2024-03-29 01:00:00 (Fri)
  63865587600, #    local_end 2024-10-26 01:00:00 (Sat)
  10800,
  1,
  'EEST',
      ],
      [
  63865576800, #    utc_start 2024-10-25 22:00:00 (Fri)
  63878796000, #      utc_end 2025-03-27 22:00:00 (Thu)
  63865584000, #  local_start 2024-10-26 00:00:00 (Sat)
  63878803200, #    local_end 2025-03-28 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63878796000, #    utc_start 2025-03-27 22:00:00 (Thu)
  63897026400, #      utc_end 2025-10-24 22:00:00 (Fri)
  63878806800, #  local_start 2025-03-28 01:00:00 (Fri)
  63897037200, #    local_end 2025-10-25 01:00:00 (Sat)
  10800,
  1,
  'EEST',
      ],
      [
  63897026400, #    utc_start 2025-10-24 22:00:00 (Fri)
  63910245600, #      utc_end 2026-03-26 22:00:00 (Thu)
  63897033600, #  local_start 2025-10-25 00:00:00 (Sat)
  63910252800, #    local_end 2026-03-27 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63910245600, #    utc_start 2026-03-26 22:00:00 (Thu)
  63929080800, #      utc_end 2026-10-30 22:00:00 (Fri)
  63910256400, #  local_start 2026-03-27 01:00:00 (Fri)
  63929091600, #    local_end 2026-10-31 01:00:00 (Sat)
  10800,
  1,
  'EEST',
      ],
      [
  63929080800, #    utc_start 2026-10-30 22:00:00 (Fri)
  63941695200, #      utc_end 2027-03-25 22:00:00 (Thu)
  63929088000, #  local_start 2026-10-31 00:00:00 (Sat)
  63941702400, #    local_end 2027-03-26 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63941695200, #    utc_start 2027-03-25 22:00:00 (Thu)
  63960530400, #      utc_end 2027-10-29 22:00:00 (Fri)
  63941706000, #  local_start 2027-03-26 01:00:00 (Fri)
  63960541200, #    local_end 2027-10-30 01:00:00 (Sat)
  10800,
  1,
  'EEST',
      ],
      [
  63960530400, #    utc_start 2027-10-29 22:00:00 (Fri)
  63973749600, #      utc_end 2028-03-30 22:00:00 (Thu)
  63960537600, #  local_start 2027-10-30 00:00:00 (Sat)
  63973756800, #    local_end 2028-03-31 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63973749600, #    utc_start 2028-03-30 22:00:00 (Thu)
  63991980000, #      utc_end 2028-10-27 22:00:00 (Fri)
  63973760400, #  local_start 2028-03-31 01:00:00 (Fri)
  63991990800, #    local_end 2028-10-28 01:00:00 (Sat)
  10800,
  1,
  'EEST',
      ],
      [
  63991980000, #    utc_start 2028-10-27 22:00:00 (Fri)
  64005199200, #      utc_end 2029-03-29 22:00:00 (Thu)
  63991987200, #  local_start 2028-10-28 00:00:00 (Sat)
  64005206400, #    local_end 2029-03-30 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  64005199200, #    utc_start 2029-03-29 22:00:00 (Thu)
  64023429600, #      utc_end 2029-10-26 22:00:00 (Fri)
  64005210000, #  local_start 2029-03-30 01:00:00 (Fri)
  64023440400, #    local_end 2029-10-27 01:00:00 (Sat)
  10800,
  1,
  'EEST',
      ],
      [
  64023429600, #    utc_start 2029-10-26 22:00:00 (Fri)
  64036648800, #      utc_end 2030-03-28 22:00:00 (Thu)
  64023436800, #  local_start 2029-10-27 00:00:00 (Sat)
  64036656000, #    local_end 2030-03-29 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  64036648800, #    utc_start 2030-03-28 22:00:00 (Thu)
  64054879200, #      utc_end 2030-10-25 22:00:00 (Fri)
  64036659600, #  local_start 2030-03-29 01:00:00 (Fri)
  64054890000, #    local_end 2030-10-26 01:00:00 (Sat)
  10800,
  1,
  'EEST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {66}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { 7200 }
  
  my $last_observance = bless( {
    'format' => 'EE%sT',
    'gmtoff' => '2:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 734503,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 734503,
      'utc_rd_secs' => 0,
      'utc_year' => 2013
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => 7200,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 734502,
      'local_rd_secs' => 79200,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 734502,
      'utc_rd_secs' => 79200,
      'utc_year' => 2012
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '0:00',
      'from' => '2019',
      'in' => 'Mar',
      'letter' => 'S',
      'name' => 'Palestine',
      'offset_from_std' => 3600,
      'on' => 'lastFri',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '1:00',
      'from' => '2016',
      'in' => 'Oct',
      'letter' => '',
      'name' => 'Palestine',
      'offset_from_std' => 0,
      'on' => 'lastSat',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_GAZA

    $main::fatpacked{"DateTime/TimeZone/Asia/Hebron.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_HEBRON';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/asia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Hebron;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Hebron::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59950273177, #      utc_end 1900-09-30 21:39:37 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59950281600, #    local_end 1900-10-01 00:00:00 (Mon)
  8423,
  0,
  'LMT',
      ],
      [
  59950273177, #    utc_start 1900-09-30 21:39:37 (Sun)
  61202037600, #      utc_end 1940-05-31 22:00:00 (Fri)
  59950280377, #  local_start 1900-09-30 23:39:37 (Sun)
  61202044800, #    local_end 1940-06-01 00:00:00 (Sat)
  7200,
  0,
  'EET',
      ],
      [
  61202037600, #    utc_start 1940-05-31 22:00:00 (Fri)
  61278325200, #      utc_end 1942-10-31 21:00:00 (Sat)
  61202048400, #  local_start 1940-06-01 01:00:00 (Sat)
  61278336000, #    local_end 1942-11-01 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  61278325200, #    utc_start 1942-10-31 21:00:00 (Sat)
  61291382400, #      utc_end 1943-04-01 00:00:00 (Thu)
  61278332400, #  local_start 1942-10-31 23:00:00 (Sat)
  61291389600, #    local_end 1943-04-01 02:00:00 (Thu)
  7200,
  0,
  'EET',
      ],
      [
  61291382400, #    utc_start 1943-04-01 00:00:00 (Thu)
  61309861200, #      utc_end 1943-10-31 21:00:00 (Sun)
  61291393200, #  local_start 1943-04-01 03:00:00 (Thu)
  61309872000, #    local_end 1943-11-01 00:00:00 (Mon)
  10800,
  1,
  'EEST',
      ],
      [
  61309861200, #    utc_start 1943-10-31 21:00:00 (Sun)
  61322997600, #      utc_end 1944-03-31 22:00:00 (Fri)
  61309868400, #  local_start 1943-10-31 23:00:00 (Sun)
  61323004800, #    local_end 1944-04-01 00:00:00 (Sat)
  7200,
  0,
  'EET',
      ],
      [
  61322997600, #    utc_start 1944-03-31 22:00:00 (Fri)
  61341483600, #      utc_end 1944-10-31 21:00:00 (Tue)
  61323008400, #  local_start 1944-04-01 01:00:00 (Sat)
  61341494400, #    local_end 1944-11-01 00:00:00 (Wed)
  10800,
  1,
  'EEST',
      ],
      [
  61341483600, #    utc_start 1944-10-31 21:00:00 (Tue)
  61355829600, #      utc_end 1945-04-15 22:00:00 (Sun)
  61341490800, #  local_start 1944-10-31 23:00:00 (Tue)
  61355836800, #    local_end 1945-04-16 00:00:00 (Mon)
  7200,
  0,
  'EET',
      ],
      [
  61355829600, #    utc_start 1945-04-15 22:00:00 (Sun)
  61373026800, #      utc_end 1945-10-31 23:00:00 (Wed)
  61355840400, #  local_start 1945-04-16 01:00:00 (Mon)
  61373037600, #    local_end 1945-11-01 02:00:00 (Thu)
  10800,
  1,
  'EEST',
      ],
      [
  61373026800, #    utc_start 1945-10-31 23:00:00 (Wed)
  61387372800, #      utc_end 1946-04-16 00:00:00 (Tue)
  61373034000, #  local_start 1945-11-01 01:00:00 (Thu)
  61387380000, #    local_end 1946-04-16 02:00:00 (Tue)
  7200,
  0,
  'EET',
      ],
      [
  61387372800, #    utc_start 1946-04-16 00:00:00 (Tue)
  61404555600, #      utc_end 1946-10-31 21:00:00 (Thu)
  61387383600, #  local_start 1946-04-16 03:00:00 (Tue)
  61404566400, #    local_end 1946-11-01 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  61404555600, #    utc_start 1946-10-31 21:00:00 (Thu)
  61453029600, #      utc_end 1948-05-14 22:00:00 (Fri)
  61404562800, #  local_start 1946-10-31 23:00:00 (Thu)
  61453036800, #    local_end 1948-05-15 00:00:00 (Sat)
  7200,
  0,
  'EET',
      ],
      [
  61453029600, #    utc_start 1948-05-14 22:00:00 (Fri)
  61736594400, #      utc_end 1957-05-09 22:00:00 (Thu)
  61453036800, #  local_start 1948-05-15 00:00:00 (Sat)
  61736601600, #    local_end 1957-05-10 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  61736594400, #    utc_start 1957-05-09 22:00:00 (Thu)
  61749032400, #      utc_end 1957-09-30 21:00:00 (Mon)
  61736605200, #  local_start 1957-05-10 01:00:00 (Fri)
  61749043200, #    local_end 1957-10-01 00:00:00 (Tue)
  10800,
  1,
  'EEST',
      ],
      [
  61749032400, #    utc_start 1957-09-30 21:00:00 (Mon)
  61767352800, #      utc_end 1958-04-30 22:00:00 (Wed)
  61749039600, #  local_start 1957-09-30 23:00:00 (Mon)
  61767360000, #    local_end 1958-05-01 00:00:00 (Thu)
  7200,
  0,
  'EET',
      ],
      [
  61767352800, #    utc_start 1958-04-30 22:00:00 (Wed)
  61780568400, #      utc_end 1958-09-30 21:00:00 (Tue)
  61767363600, #  local_start 1958-05-01 01:00:00 (Thu)
  61780579200, #    local_end 1958-10-01 00:00:00 (Wed)
  10800,
  1,
  'EEST',
      ],
      [
  61780568400, #    utc_start 1958-09-30 21:00:00 (Tue)
  61798892400, #      utc_end 1959-04-30 23:00:00 (Thu)
  61780575600, #  local_start 1958-09-30 23:00:00 (Tue)
  61798899600, #    local_end 1959-05-01 01:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  61798892400, #    utc_start 1959-04-30 23:00:00 (Thu)
  61812028800, #      utc_end 1959-09-30 00:00:00 (Wed)
  61798903200, #  local_start 1959-05-01 02:00:00 (Fri)
  61812039600, #    local_end 1959-09-30 03:00:00 (Wed)
  10800,
  1,
  'EEST',
      ],
      [
  61812028800, #    utc_start 1959-09-30 00:00:00 (Wed)
  61830514800, #      utc_end 1960-04-30 23:00:00 (Sat)
  61812036000, #  local_start 1959-09-30 02:00:00 (Wed)
  61830522000, #    local_end 1960-05-01 01:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  61830514800, #    utc_start 1960-04-30 23:00:00 (Sat)
  61843651200, #      utc_end 1960-09-30 00:00:00 (Fri)
  61830525600, #  local_start 1960-05-01 02:00:00 (Sun)
  61843662000, #    local_end 1960-09-30 03:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  61843651200, #    utc_start 1960-09-30 00:00:00 (Fri)
  61862050800, #      utc_end 1961-04-30 23:00:00 (Sun)
  61843658400, #  local_start 1960-09-30 02:00:00 (Fri)
  61862058000, #    local_end 1961-05-01 01:00:00 (Mon)
  7200,
  0,
  'EET',
      ],
      [
  61862050800, #    utc_start 1961-04-30 23:00:00 (Sun)
  61875187200, #      utc_end 1961-09-30 00:00:00 (Sat)
  61862061600, #  local_start 1961-05-01 02:00:00 (Mon)
  61875198000, #    local_end 1961-09-30 03:00:00 (Sat)
  10800,
  1,
  'EEST',
      ],
      [
  61875187200, #    utc_start 1961-09-30 00:00:00 (Sat)
  61893586800, #      utc_end 1962-04-30 23:00:00 (Mon)
  61875194400, #  local_start 1961-09-30 02:00:00 (Sat)
  61893594000, #    local_end 1962-05-01 01:00:00 (Tue)
  7200,
  0,
  'EET',
      ],
      [
  61893586800, #    utc_start 1962-04-30 23:00:00 (Mon)
  61906723200, #      utc_end 1962-09-30 00:00:00 (Sun)
  61893597600, #  local_start 1962-05-01 02:00:00 (Tue)
  61906734000, #    local_end 1962-09-30 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  61906723200, #    utc_start 1962-09-30 00:00:00 (Sun)
  61925122800, #      utc_end 1963-04-30 23:00:00 (Tue)
  61906730400, #  local_start 1962-09-30 02:00:00 (Sun)
  61925130000, #    local_end 1963-05-01 01:00:00 (Wed)
  7200,
  0,
  'EET',
      ],
      [
  61925122800, #    utc_start 1963-04-30 23:00:00 (Tue)
  61938259200, #      utc_end 1963-09-30 00:00:00 (Mon)
  61925133600, #  local_start 1963-05-01 02:00:00 (Wed)
  61938270000, #    local_end 1963-09-30 03:00:00 (Mon)
  10800,
  1,
  'EEST',
      ],
      [
  61938259200, #    utc_start 1963-09-30 00:00:00 (Mon)
  61956745200, #      utc_end 1964-04-30 23:00:00 (Thu)
  61938266400, #  local_start 1963-09-30 02:00:00 (Mon)
  61956752400, #    local_end 1964-05-01 01:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  61956745200, #    utc_start 1964-04-30 23:00:00 (Thu)
  61969881600, #      utc_end 1964-09-30 00:00:00 (Wed)
  61956756000, #  local_start 1964-05-01 02:00:00 (Fri)
  61969892400, #    local_end 1964-09-30 03:00:00 (Wed)
  10800,
  1,
  'EEST',
      ],
      [
  61969881600, #    utc_start 1964-09-30 00:00:00 (Wed)
  61988281200, #      utc_end 1965-04-30 23:00:00 (Fri)
  61969888800, #  local_start 1964-09-30 02:00:00 (Wed)
  61988288400, #    local_end 1965-05-01 01:00:00 (Sat)
  7200,
  0,
  'EET',
      ],
      [
  61988281200, #    utc_start 1965-04-30 23:00:00 (Fri)
  62001417600, #      utc_end 1965-09-30 00:00:00 (Thu)
  61988292000, #  local_start 1965-05-01 02:00:00 (Sat)
  62001428400, #    local_end 1965-09-30 03:00:00 (Thu)
  10800,
  1,
  'EEST',
      ],
      [
  62001417600, #    utc_start 1965-09-30 00:00:00 (Thu)
  62019817200, #      utc_end 1966-04-30 23:00:00 (Sat)
  62001424800, #  local_start 1965-09-30 02:00:00 (Thu)
  62019824400, #    local_end 1966-05-01 01:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62019817200, #    utc_start 1966-04-30 23:00:00 (Sat)
  62033040000, #      utc_end 1966-10-01 00:00:00 (Sat)
  62019828000, #  local_start 1966-05-01 02:00:00 (Sun)
  62033050800, #    local_end 1966-10-01 03:00:00 (Sat)
  10800,
  1,
  'EEST',
      ],
      [
  62033040000, #    utc_start 1966-10-01 00:00:00 (Sat)
  62051353200, #      utc_end 1967-04-30 23:00:00 (Sun)
  62033047200, #  local_start 1966-10-01 02:00:00 (Sat)
  62051360400, #    local_end 1967-05-01 01:00:00 (Mon)
  7200,
  0,
  'EET',
      ],
      [
  62051353200, #    utc_start 1967-04-30 23:00:00 (Sun)
  62054370000, #      utc_end 1967-06-04 21:00:00 (Sun)
  62051364000, #  local_start 1967-05-01 02:00:00 (Mon)
  62054380800, #    local_end 1967-06-05 00:00:00 (Mon)
  10800,
  1,
  'EEST',
      ],
      [
  62054370000, #    utc_start 1967-06-04 21:00:00 (Sun)
  62278063200, #      utc_end 1974-07-06 22:00:00 (Sat)
  62054377200, #  local_start 1967-06-04 23:00:00 (Sun)
  62278070400, #    local_end 1974-07-07 00:00:00 (Sun)
  7200,
  0,
  'IST',
      ],
      [
  62278063200, #    utc_start 1974-07-06 22:00:00 (Sat)
  62286526800, #      utc_end 1974-10-12 21:00:00 (Sat)
  62278074000, #  local_start 1974-07-07 01:00:00 (Sun)
  62286537600, #    local_end 1974-10-13 00:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  62286526800, #    utc_start 1974-10-12 21:00:00 (Sat)
  62302860000, #      utc_end 1975-04-19 22:00:00 (Sat)
  62286534000, #  local_start 1974-10-12 23:00:00 (Sat)
  62302867200, #    local_end 1975-04-20 00:00:00 (Sun)
  7200,
  0,
  'IST',
      ],
      [
  62302860000, #    utc_start 1975-04-19 22:00:00 (Sat)
  62314347600, #      utc_end 1975-08-30 21:00:00 (Sat)
  62302870800, #  local_start 1975-04-20 01:00:00 (Sun)
  62314358400, #    local_end 1975-08-31 00:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  62314347600, #    utc_start 1975-08-30 21:00:00 (Sat)
  62469698400, #      utc_end 1980-08-01 22:00:00 (Fri)
  62314354800, #  local_start 1975-08-30 23:00:00 (Sat)
  62469705600, #    local_end 1980-08-02 00:00:00 (Sat)
  7200,
  0,
  'IST',
      ],
      [
  62469698400, #    utc_start 1980-08-01 22:00:00 (Fri)
  62473327200, #      utc_end 1980-09-12 22:00:00 (Fri)
  62469709200, #  local_start 1980-08-02 01:00:00 (Sat)
  62473338000, #    local_end 1980-09-13 01:00:00 (Sat)
  10800,
  1,
  'IDT',
      ],
      [
  62473327200, #    utc_start 1980-09-12 22:00:00 (Fri)
  62588239200, #      utc_end 1984-05-04 22:00:00 (Fri)
  62473334400, #  local_start 1980-09-13 00:00:00 (Sat)
  62588246400, #    local_end 1984-05-05 00:00:00 (Sat)
  7200,
  0,
  'IST',
      ],
      [
  62588239200, #    utc_start 1984-05-04 22:00:00 (Fri)
  62597916000, #      utc_end 1984-08-24 22:00:00 (Fri)
  62588250000, #  local_start 1984-05-05 01:00:00 (Sat)
  62597926800, #    local_end 1984-08-25 01:00:00 (Sat)
  10800,
  1,
  'IDT',
      ],
      [
  62597916000, #    utc_start 1984-08-24 22:00:00 (Fri)
  62617960800, #      utc_end 1985-04-13 22:00:00 (Sat)
  62597923200, #  local_start 1984-08-25 00:00:00 (Sat)
  62617968000, #    local_end 1985-04-14 00:00:00 (Sun)
  7200,
  0,
  'IST',
      ],
      [
  62617960800, #    utc_start 1985-04-13 22:00:00 (Sat)
  62631262800, #      utc_end 1985-09-14 21:00:00 (Sat)
  62617971600, #  local_start 1985-04-14 01:00:00 (Sun)
  62631273600, #    local_end 1985-09-15 00:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  62631262800, #    utc_start 1985-09-14 21:00:00 (Sat)
  62652434400, #      utc_end 1986-05-17 22:00:00 (Sat)
  62631270000, #  local_start 1985-09-14 23:00:00 (Sat)
  62652441600, #    local_end 1986-05-18 00:00:00 (Sun)
  7200,
  0,
  'IST',
      ],
      [
  62652434400, #    utc_start 1986-05-17 22:00:00 (Sat)
  62662107600, #      utc_end 1986-09-06 21:00:00 (Sat)
  62652445200, #  local_start 1986-05-18 01:00:00 (Sun)
  62662118400, #    local_end 1986-09-07 00:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  62662107600, #    utc_start 1986-09-06 21:00:00 (Sat)
  62681119200, #      utc_end 1987-04-14 22:00:00 (Tue)
  62662114800, #  local_start 1986-09-06 23:00:00 (Sat)
  62681126400, #    local_end 1987-04-15 00:00:00 (Wed)
  7200,
  0,
  'IST',
      ],
      [
  62681119200, #    utc_start 1987-04-14 22:00:00 (Tue)
  62694162000, #      utc_end 1987-09-12 21:00:00 (Sat)
  62681130000, #  local_start 1987-04-15 01:00:00 (Wed)
  62694172800, #    local_end 1987-09-13 00:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  62694162000, #    utc_start 1987-09-12 21:00:00 (Sat)
  62712309600, #      utc_end 1988-04-09 22:00:00 (Sat)
  62694169200, #  local_start 1987-09-12 23:00:00 (Sat)
  62712316800, #    local_end 1988-04-10 00:00:00 (Sun)
  7200,
  0,
  'IST',
      ],
      [
  62712309600, #    utc_start 1988-04-09 22:00:00 (Sat)
  62725006800, #      utc_end 1988-09-03 21:00:00 (Sat)
  62712320400, #  local_start 1988-04-10 01:00:00 (Sun)
  62725017600, #    local_end 1988-09-04 00:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  62725006800, #    utc_start 1988-09-03 21:00:00 (Sat)
  62745573600, #      utc_end 1989-04-29 22:00:00 (Sat)
  62725014000, #  local_start 1988-09-03 23:00:00 (Sat)
  62745580800, #    local_end 1989-04-30 00:00:00 (Sun)
  7200,
  0,
  'IST',
      ],
      [
  62745573600, #    utc_start 1989-04-29 22:00:00 (Sat)
  62756456400, #      utc_end 1989-09-02 21:00:00 (Sat)
  62745584400, #  local_start 1989-04-30 01:00:00 (Sun)
  62756467200, #    local_end 1989-09-03 00:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  62756456400, #    utc_start 1989-09-02 21:00:00 (Sat)
  62773999200, #      utc_end 1990-03-24 22:00:00 (Sat)
  62756463600, #  local_start 1989-09-02 23:00:00 (Sat)
  62774006400, #    local_end 1990-03-25 00:00:00 (Sun)
  7200,
  0,
  'IST',
      ],
      [
  62773999200, #    utc_start 1990-03-24 22:00:00 (Sat)
  62787301200, #      utc_end 1990-08-25 21:00:00 (Sat)
  62774010000, #  local_start 1990-03-25 01:00:00 (Sun)
  62787312000, #    local_end 1990-08-26 00:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  62787301200, #    utc_start 1990-08-25 21:00:00 (Sat)
  62805448800, #      utc_end 1991-03-23 22:00:00 (Sat)
  62787308400, #  local_start 1990-08-25 23:00:00 (Sat)
  62805456000, #    local_end 1991-03-24 00:00:00 (Sun)
  7200,
  0,
  'IST',
      ],
      [
  62805448800, #    utc_start 1991-03-23 22:00:00 (Sat)
  62819355600, #      utc_end 1991-08-31 21:00:00 (Sat)
  62805459600, #  local_start 1991-03-24 01:00:00 (Sun)
  62819366400, #    local_end 1991-09-01 00:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  62819355600, #    utc_start 1991-08-31 21:00:00 (Sat)
  62837503200, #      utc_end 1992-03-28 22:00:00 (Sat)
  62819362800, #  local_start 1991-08-31 23:00:00 (Sat)
  62837510400, #    local_end 1992-03-29 00:00:00 (Sun)
  7200,
  0,
  'IST',
      ],
      [
  62837503200, #    utc_start 1992-03-28 22:00:00 (Sat)
  62851410000, #      utc_end 1992-09-05 21:00:00 (Sat)
  62837514000, #  local_start 1992-03-29 01:00:00 (Sun)
  62851420800, #    local_end 1992-09-06 00:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  62851410000, #    utc_start 1992-09-05 21:00:00 (Sat)
  62869384800, #      utc_end 1993-04-01 22:00:00 (Thu)
  62851417200, #  local_start 1992-09-05 23:00:00 (Sat)
  62869392000, #    local_end 1993-04-02 00:00:00 (Fri)
  7200,
  0,
  'IST',
      ],
      [
  62869384800, #    utc_start 1993-04-01 22:00:00 (Thu)
  62882859600, #      utc_end 1993-09-04 21:00:00 (Sat)
  62869395600, #  local_start 1993-04-02 01:00:00 (Fri)
  62882870400, #    local_end 1993-09-05 00:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  62882859600, #    utc_start 1993-09-04 21:00:00 (Sat)
  62900834400, #      utc_end 1994-03-31 22:00:00 (Thu)
  62882866800, #  local_start 1993-09-04 23:00:00 (Sat)
  62900841600, #    local_end 1994-04-01 00:00:00 (Fri)
  7200,
  0,
  'IST',
      ],
      [
  62900834400, #    utc_start 1994-03-31 22:00:00 (Thu)
  62913704400, #      utc_end 1994-08-27 21:00:00 (Sat)
  62900845200, #  local_start 1994-04-01 01:00:00 (Fri)
  62913715200, #    local_end 1994-08-28 00:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  62913704400, #    utc_start 1994-08-27 21:00:00 (Sat)
  62932284000, #      utc_end 1995-03-30 22:00:00 (Thu)
  62913711600, #  local_start 1994-08-27 23:00:00 (Sat)
  62932291200, #    local_end 1995-03-31 00:00:00 (Fri)
  7200,
  0,
  'IST',
      ],
      [
  62932284000, #    utc_start 1995-03-30 22:00:00 (Thu)
  62945758800, #      utc_end 1995-09-02 21:00:00 (Sat)
  62932294800, #  local_start 1995-03-31 01:00:00 (Fri)
  62945769600, #    local_end 1995-09-03 00:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  62945758800, #    utc_start 1995-09-02 21:00:00 (Sat)
  62956130400, #      utc_end 1995-12-31 22:00:00 (Sun)
  62945766000, #  local_start 1995-09-02 23:00:00 (Sat)
  62956137600, #    local_end 1996-01-01 00:00:00 (Mon)
  7200,
  0,
  'IST',
      ],
      [
  62956130400, #    utc_start 1995-12-31 22:00:00 (Sun)
  62964338400, #      utc_end 1996-04-04 22:00:00 (Thu)
  62956137600, #  local_start 1996-01-01 00:00:00 (Mon)
  62964345600, #    local_end 1996-04-05 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  62964338400, #    utc_start 1996-04-04 22:00:00 (Thu)
  62978853600, #      utc_end 1996-09-19 22:00:00 (Thu)
  62964349200, #  local_start 1996-04-05 01:00:00 (Fri)
  62978864400, #    local_end 1996-09-20 01:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  62978853600, #    utc_start 1996-09-19 22:00:00 (Thu)
  62995788000, #      utc_end 1997-04-03 22:00:00 (Thu)
  62978860800, #  local_start 1996-09-20 00:00:00 (Fri)
  62995795200, #    local_end 1997-04-04 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  62995788000, #    utc_start 1997-04-03 22:00:00 (Thu)
  63010303200, #      utc_end 1997-09-18 22:00:00 (Thu)
  62995798800, #  local_start 1997-04-04 01:00:00 (Fri)
  63010314000, #    local_end 1997-09-19 01:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63010303200, #    utc_start 1997-09-18 22:00:00 (Thu)
  63027237600, #      utc_end 1998-04-02 22:00:00 (Thu)
  63010310400, #  local_start 1997-09-19 00:00:00 (Fri)
  63027244800, #    local_end 1998-04-03 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63027237600, #    utc_start 1998-04-02 22:00:00 (Thu)
  63041752800, #      utc_end 1998-09-17 22:00:00 (Thu)
  63027248400, #  local_start 1998-04-03 01:00:00 (Fri)
  63041763600, #    local_end 1998-09-18 01:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63041752800, #    utc_start 1998-09-17 22:00:00 (Thu)
  63050824800, #      utc_end 1998-12-31 22:00:00 (Thu)
  63041760000, #  local_start 1998-09-18 00:00:00 (Fri)
  63050832000, #    local_end 1999-01-01 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63050824800, #    utc_start 1998-12-31 22:00:00 (Thu)
  63059896800, #      utc_end 1999-04-15 22:00:00 (Thu)
  63050832000, #  local_start 1999-01-01 00:00:00 (Fri)
  63059904000, #    local_end 1999-04-16 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63059896800, #    utc_start 1999-04-15 22:00:00 (Thu)
  63075618000, #      utc_end 1999-10-14 21:00:00 (Thu)
  63059907600, #  local_start 1999-04-16 01:00:00 (Fri)
  63075628800, #    local_end 1999-10-15 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63075618000, #    utc_start 1999-10-14 21:00:00 (Thu)
  63091951200, #      utc_end 2000-04-20 22:00:00 (Thu)
  63075625200, #  local_start 1999-10-14 23:00:00 (Thu)
  63091958400, #    local_end 2000-04-21 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63091951200, #    utc_start 2000-04-20 22:00:00 (Thu)
  63107672400, #      utc_end 2000-10-19 21:00:00 (Thu)
  63091962000, #  local_start 2000-04-21 01:00:00 (Fri)
  63107683200, #    local_end 2000-10-20 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63107672400, #    utc_start 2000-10-19 21:00:00 (Thu)
  63123400800, #      utc_end 2001-04-19 22:00:00 (Thu)
  63107679600, #  local_start 2000-10-19 23:00:00 (Thu)
  63123408000, #    local_end 2001-04-20 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63123400800, #    utc_start 2001-04-19 22:00:00 (Thu)
  63139122000, #      utc_end 2001-10-18 21:00:00 (Thu)
  63123411600, #  local_start 2001-04-20 01:00:00 (Fri)
  63139132800, #    local_end 2001-10-19 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63139122000, #    utc_start 2001-10-18 21:00:00 (Thu)
  63154850400, #      utc_end 2002-04-18 22:00:00 (Thu)
  63139129200, #  local_start 2001-10-18 23:00:00 (Thu)
  63154857600, #    local_end 2002-04-19 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63154850400, #    utc_start 2002-04-18 22:00:00 (Thu)
  63170571600, #      utc_end 2002-10-17 21:00:00 (Thu)
  63154861200, #  local_start 2002-04-19 01:00:00 (Fri)
  63170582400, #    local_end 2002-10-18 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63170571600, #    utc_start 2002-10-17 21:00:00 (Thu)
  63186300000, #      utc_end 2003-04-17 22:00:00 (Thu)
  63170578800, #  local_start 2002-10-17 23:00:00 (Thu)
  63186307200, #    local_end 2003-04-18 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63186300000, #    utc_start 2003-04-17 22:00:00 (Thu)
  63202021200, #      utc_end 2003-10-16 21:00:00 (Thu)
  63186310800, #  local_start 2003-04-18 01:00:00 (Fri)
  63202032000, #    local_end 2003-10-17 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63202021200, #    utc_start 2003-10-16 21:00:00 (Thu)
  63217749600, #      utc_end 2004-04-15 22:00:00 (Thu)
  63202028400, #  local_start 2003-10-16 23:00:00 (Thu)
  63217756800, #    local_end 2004-04-16 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63217749600, #    utc_start 2004-04-15 22:00:00 (Thu)
  63232264800, #      utc_end 2004-09-30 22:00:00 (Thu)
  63217760400, #  local_start 2004-04-16 01:00:00 (Fri)
  63232275600, #    local_end 2004-10-01 01:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63232264800, #    utc_start 2004-09-30 22:00:00 (Thu)
  63249199200, #      utc_end 2005-04-14 22:00:00 (Thu)
  63232272000, #  local_start 2004-10-01 00:00:00 (Fri)
  63249206400, #    local_end 2005-04-15 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63249199200, #    utc_start 2005-04-14 22:00:00 (Thu)
  63264063600, #      utc_end 2005-10-03 23:00:00 (Mon)
  63249210000, #  local_start 2005-04-15 01:00:00 (Fri)
  63264074400, #    local_end 2005-10-04 02:00:00 (Tue)
  10800,
  1,
  'EEST',
      ],
      [
  63264063600, #    utc_start 2005-10-03 23:00:00 (Mon)
  63279525600, #      utc_end 2006-03-31 22:00:00 (Fri)
  63264070800, #  local_start 2005-10-04 01:00:00 (Tue)
  63279532800, #    local_end 2006-04-01 00:00:00 (Sat)
  7200,
  0,
  'EET',
      ],
      [
  63279525600, #    utc_start 2006-03-31 22:00:00 (Fri)
  63294555600, #      utc_end 2006-09-21 21:00:00 (Thu)
  63279536400, #  local_start 2006-04-01 01:00:00 (Sat)
  63294566400, #    local_end 2006-09-22 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63294555600, #    utc_start 2006-09-21 21:00:00 (Thu)
  63311061600, #      utc_end 2007-03-31 22:00:00 (Sat)
  63294562800, #  local_start 2006-09-21 23:00:00 (Thu)
  63311068800, #    local_end 2007-04-01 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63311061600, #    utc_start 2007-03-31 22:00:00 (Sat)
  63325321200, #      utc_end 2007-09-12 23:00:00 (Wed)
  63311072400, #  local_start 2007-04-01 01:00:00 (Sun)
  63325332000, #    local_end 2007-09-13 02:00:00 (Thu)
  10800,
  1,
  'EEST',
      ],
      [
  63325321200, #    utc_start 2007-09-12 23:00:00 (Wed)
  63342338400, #      utc_end 2008-03-27 22:00:00 (Thu)
  63325328400, #  local_start 2007-09-13 01:00:00 (Thu)
  63342345600, #    local_end 2008-03-28 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63342338400, #    utc_start 2008-03-27 22:00:00 (Thu)
  63355899600, #      utc_end 2008-08-31 21:00:00 (Sun)
  63342349200, #  local_start 2008-03-28 01:00:00 (Fri)
  63355910400, #    local_end 2008-09-01 00:00:00 (Mon)
  10800,
  1,
  'EEST',
      ],
      [
  63355899600, #    utc_start 2008-08-31 21:00:00 (Sun)
  63373788000, #      utc_end 2009-03-26 22:00:00 (Thu)
  63355906800, #  local_start 2008-08-31 23:00:00 (Sun)
  63373795200, #    local_end 2009-03-27 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63373788000, #    utc_start 2009-03-26 22:00:00 (Thu)
  63387698400, #      utc_end 2009-09-03 22:00:00 (Thu)
  63373798800, #  local_start 2009-03-27 01:00:00 (Fri)
  63387709200, #    local_end 2009-09-04 01:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63387698400, #    utc_start 2009-09-03 22:00:00 (Thu)
  63405237600, #      utc_end 2010-03-25 22:00:00 (Thu)
  63387705600, #  local_start 2009-09-04 00:00:00 (Fri)
  63405244800, #    local_end 2010-03-26 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63405237600, #    utc_start 2010-03-25 22:00:00 (Thu)
  63417157200, #      utc_end 2010-08-10 21:00:00 (Tue)
  63405248400, #  local_start 2010-03-26 01:00:00 (Fri)
  63417168000, #    local_end 2010-08-11 00:00:00 (Wed)
  10800,
  1,
  'EEST',
      ],
      [
  63417157200, #    utc_start 2010-08-10 21:00:00 (Tue)
  63437292060, #      utc_end 2011-03-31 22:01:00 (Thu)
  63417164400, #  local_start 2010-08-10 23:00:00 (Tue)
  63437299260, #    local_end 2011-04-01 00:01:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63437292060, #    utc_start 2011-03-31 22:01:00 (Thu)
  63447829200, #      utc_end 2011-07-31 21:00:00 (Sun)
  63437302860, #  local_start 2011-04-01 01:01:00 (Fri)
  63447840000, #    local_end 2011-08-01 00:00:00 (Mon)
  10800,
  1,
  'EEST',
      ],
      [
  63447829200, #    utc_start 2011-07-31 21:00:00 (Sun)
  63450338400, #      utc_end 2011-08-29 22:00:00 (Mon)
  63447836400, #  local_start 2011-07-31 23:00:00 (Sun)
  63450345600, #    local_end 2011-08-30 00:00:00 (Tue)
  7200,
  0,
  'EET',
      ],
      [
  63450338400, #    utc_start 2011-08-29 22:00:00 (Mon)
  63453013200, #      utc_end 2011-09-29 21:00:00 (Thu)
  63450349200, #  local_start 2011-08-30 01:00:00 (Tue)
  63453024000, #    local_end 2011-09-30 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63453013200, #    utc_start 2011-09-29 21:00:00 (Thu)
  63468741600, #      utc_end 2012-03-29 22:00:00 (Thu)
  63453020400, #  local_start 2011-09-29 23:00:00 (Thu)
  63468748800, #    local_end 2012-03-30 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63468741600, #    utc_start 2012-03-29 22:00:00 (Thu)
  63483861600, #      utc_end 2012-09-20 22:00:00 (Thu)
  63468752400, #  local_start 2012-03-30 01:00:00 (Fri)
  63483872400, #    local_end 2012-09-21 01:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63483861600, #    utc_start 2012-09-20 22:00:00 (Thu)
  63500191200, #      utc_end 2013-03-28 22:00:00 (Thu)
  63483868800, #  local_start 2012-09-21 00:00:00 (Fri)
  63500198400, #    local_end 2013-03-29 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63500191200, #    utc_start 2013-03-28 22:00:00 (Thu)
  63515912400, #      utc_end 2013-09-26 21:00:00 (Thu)
  63500202000, #  local_start 2013-03-29 01:00:00 (Fri)
  63515923200, #    local_end 2013-09-27 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63515912400, #    utc_start 2013-09-26 21:00:00 (Thu)
  63531640800, #      utc_end 2014-03-27 22:00:00 (Thu)
  63515919600, #  local_start 2013-09-26 23:00:00 (Thu)
  63531648000, #    local_end 2014-03-28 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63531640800, #    utc_start 2014-03-27 22:00:00 (Thu)
  63549781200, #      utc_end 2014-10-23 21:00:00 (Thu)
  63531651600, #  local_start 2014-03-28 01:00:00 (Fri)
  63549792000, #    local_end 2014-10-24 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63549781200, #    utc_start 2014-10-23 21:00:00 (Thu)
  63563176800, #      utc_end 2015-03-27 22:00:00 (Fri)
  63549788400, #  local_start 2014-10-23 23:00:00 (Thu)
  63563184000, #    local_end 2015-03-28 00:00:00 (Sat)
  7200,
  0,
  'EET',
      ],
      [
  63563176800, #    utc_start 2015-03-27 22:00:00 (Fri)
  63581230800, #      utc_end 2015-10-22 21:00:00 (Thu)
  63563187600, #  local_start 2015-03-28 01:00:00 (Sat)
  63581241600, #    local_end 2015-10-23 00:00:00 (Fri)
  10800,
  1,
  'EEST',
      ],
      [
  63581230800, #    utc_start 2015-10-22 21:00:00 (Thu)
  63594630000, #      utc_end 2016-03-25 23:00:00 (Fri)
  63581238000, #  local_start 2015-10-22 23:00:00 (Thu)
  63594637200, #    local_end 2016-03-26 01:00:00 (Sat)
  7200,
  0,
  'EET',
      ],
      [
  63594630000, #    utc_start 2016-03-25 23:00:00 (Fri)
  63613375200, #      utc_end 2016-10-28 22:00:00 (Fri)
  63594640800, #  local_start 2016-03-26 02:00:00 (Sat)
  63613386000, #    local_end 2016-10-29 01:00:00 (Sat)
  10800,
  1,
  'EEST',
      ],
      [
  63613375200, #    utc_start 2016-10-28 22:00:00 (Fri)
  63626079600, #      utc_end 2017-03-24 23:00:00 (Fri)
  63613382400, #  local_start 2016-10-29 00:00:00 (Sat)
  63626086800, #    local_end 2017-03-25 01:00:00 (Sat)
  7200,
  0,
  'EET',
      ],
      [
  63626079600, #    utc_start 2017-03-24 23:00:00 (Fri)
  63644824800, #      utc_end 2017-10-27 22:00:00 (Fri)
  63626090400, #  local_start 2017-03-25 02:00:00 (Sat)
  63644835600, #    local_end 2017-10-28 01:00:00 (Sat)
  10800,
  1,
  'EEST',
      ],
      [
  63644824800, #    utc_start 2017-10-27 22:00:00 (Fri)
  63657529200, #      utc_end 2018-03-23 23:00:00 (Fri)
  63644832000, #  local_start 2017-10-28 00:00:00 (Sat)
  63657536400, #    local_end 2018-03-24 01:00:00 (Sat)
  7200,
  0,
  'EET',
      ],
      [
  63657529200, #    utc_start 2018-03-23 23:00:00 (Fri)
  63676274400, #      utc_end 2018-10-26 22:00:00 (Fri)
  63657540000, #  local_start 2018-03-24 02:00:00 (Sat)
  63676285200, #    local_end 2018-10-27 01:00:00 (Sat)
  10800,
  1,
  'EEST',
      ],
      [
  63676274400, #    utc_start 2018-10-26 22:00:00 (Fri)
  63689493600, #      utc_end 2019-03-28 22:00:00 (Thu)
  63676281600, #  local_start 2018-10-27 00:00:00 (Sat)
  63689500800, #    local_end 2019-03-29 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63689493600, #    utc_start 2019-03-28 22:00:00 (Thu)
  63707724000, #      utc_end 2019-10-25 22:00:00 (Fri)
  63689504400, #  local_start 2019-03-29 01:00:00 (Fri)
  63707734800, #    local_end 2019-10-26 01:00:00 (Sat)
  10800,
  1,
  'EEST',
      ],
      [
  63707724000, #    utc_start 2019-10-25 22:00:00 (Fri)
  63720943200, #      utc_end 2020-03-26 22:00:00 (Thu)
  63707731200, #  local_start 2019-10-26 00:00:00 (Sat)
  63720950400, #    local_end 2020-03-27 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63720943200, #    utc_start 2020-03-26 22:00:00 (Thu)
  63739778400, #      utc_end 2020-10-30 22:00:00 (Fri)
  63720954000, #  local_start 2020-03-27 01:00:00 (Fri)
  63739789200, #    local_end 2020-10-31 01:00:00 (Sat)
  10800,
  1,
  'EEST',
      ],
      [
  63739778400, #    utc_start 2020-10-30 22:00:00 (Fri)
  63752392800, #      utc_end 2021-03-25 22:00:00 (Thu)
  63739785600, #  local_start 2020-10-31 00:00:00 (Sat)
  63752400000, #    local_end 2021-03-26 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63752392800, #    utc_start 2021-03-25 22:00:00 (Thu)
  63771228000, #      utc_end 2021-10-29 22:00:00 (Fri)
  63752403600, #  local_start 2021-03-26 01:00:00 (Fri)
  63771238800, #    local_end 2021-10-30 01:00:00 (Sat)
  10800,
  1,
  'EEST',
      ],
      [
  63771228000, #    utc_start 2021-10-29 22:00:00 (Fri)
  63783842400, #      utc_end 2022-03-24 22:00:00 (Thu)
  63771235200, #  local_start 2021-10-30 00:00:00 (Sat)
  63783849600, #    local_end 2022-03-25 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63783842400, #    utc_start 2022-03-24 22:00:00 (Thu)
  63802677600, #      utc_end 2022-10-28 22:00:00 (Fri)
  63783853200, #  local_start 2022-03-25 01:00:00 (Fri)
  63802688400, #    local_end 2022-10-29 01:00:00 (Sat)
  10800,
  1,
  'EEST',
      ],
      [
  63802677600, #    utc_start 2022-10-28 22:00:00 (Fri)
  63815896800, #      utc_end 2023-03-30 22:00:00 (Thu)
  63802684800, #  local_start 2022-10-29 00:00:00 (Sat)
  63815904000, #    local_end 2023-03-31 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63815896800, #    utc_start 2023-03-30 22:00:00 (Thu)
  63834127200, #      utc_end 2023-10-27 22:00:00 (Fri)
  63815907600, #  local_start 2023-03-31 01:00:00 (Fri)
  63834138000, #    local_end 2023-10-28 01:00:00 (Sat)
  10800,
  1,
  'EEST',
      ],
      [
  63834127200, #    utc_start 2023-10-27 22:00:00 (Fri)
  63847346400, #      utc_end 2024-03-28 22:00:00 (Thu)
  63834134400, #  local_start 2023-10-28 00:00:00 (Sat)
  63847353600, #    local_end 2024-03-29 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63847346400, #    utc_start 2024-03-28 22:00:00 (Thu)
  63865576800, #      utc_end 2024-10-25 22:00:00 (Fri)
  63847357200, #  local_start 2024-03-29 01:00:00 (Fri)
  63865587600, #    local_end 2024-10-26 01:00:00 (Sat)
  10800,
  1,
  'EEST',
      ],
      [
  63865576800, #    utc_start 2024-10-25 22:00:00 (Fri)
  63878796000, #      utc_end 2025-03-27 22:00:00 (Thu)
  63865584000, #  local_start 2024-10-26 00:00:00 (Sat)
  63878803200, #    local_end 2025-03-28 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63878796000, #    utc_start 2025-03-27 22:00:00 (Thu)
  63897026400, #      utc_end 2025-10-24 22:00:00 (Fri)
  63878806800, #  local_start 2025-03-28 01:00:00 (Fri)
  63897037200, #    local_end 2025-10-25 01:00:00 (Sat)
  10800,
  1,
  'EEST',
      ],
      [
  63897026400, #    utc_start 2025-10-24 22:00:00 (Fri)
  63910245600, #      utc_end 2026-03-26 22:00:00 (Thu)
  63897033600, #  local_start 2025-10-25 00:00:00 (Sat)
  63910252800, #    local_end 2026-03-27 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63910245600, #    utc_start 2026-03-26 22:00:00 (Thu)
  63929080800, #      utc_end 2026-10-30 22:00:00 (Fri)
  63910256400, #  local_start 2026-03-27 01:00:00 (Fri)
  63929091600, #    local_end 2026-10-31 01:00:00 (Sat)
  10800,
  1,
  'EEST',
      ],
      [
  63929080800, #    utc_start 2026-10-30 22:00:00 (Fri)
  63941695200, #      utc_end 2027-03-25 22:00:00 (Thu)
  63929088000, #  local_start 2026-10-31 00:00:00 (Sat)
  63941702400, #    local_end 2027-03-26 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63941695200, #    utc_start 2027-03-25 22:00:00 (Thu)
  63960530400, #      utc_end 2027-10-29 22:00:00 (Fri)
  63941706000, #  local_start 2027-03-26 01:00:00 (Fri)
  63960541200, #    local_end 2027-10-30 01:00:00 (Sat)
  10800,
  1,
  'EEST',
      ],
      [
  63960530400, #    utc_start 2027-10-29 22:00:00 (Fri)
  63973749600, #      utc_end 2028-03-30 22:00:00 (Thu)
  63960537600, #  local_start 2027-10-30 00:00:00 (Sat)
  63973756800, #    local_end 2028-03-31 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  63973749600, #    utc_start 2028-03-30 22:00:00 (Thu)
  63991980000, #      utc_end 2028-10-27 22:00:00 (Fri)
  63973760400, #  local_start 2028-03-31 01:00:00 (Fri)
  63991990800, #    local_end 2028-10-28 01:00:00 (Sat)
  10800,
  1,
  'EEST',
      ],
      [
  63991980000, #    utc_start 2028-10-27 22:00:00 (Fri)
  64005199200, #      utc_end 2029-03-29 22:00:00 (Thu)
  63991987200, #  local_start 2028-10-28 00:00:00 (Sat)
  64005206400, #    local_end 2029-03-30 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  64005199200, #    utc_start 2029-03-29 22:00:00 (Thu)
  64023429600, #      utc_end 2029-10-26 22:00:00 (Fri)
  64005210000, #  local_start 2029-03-30 01:00:00 (Fri)
  64023440400, #    local_end 2029-10-27 01:00:00 (Sat)
  10800,
  1,
  'EEST',
      ],
      [
  64023429600, #    utc_start 2029-10-26 22:00:00 (Fri)
  64036648800, #      utc_end 2030-03-28 22:00:00 (Thu)
  64023436800, #  local_start 2029-10-27 00:00:00 (Sat)
  64036656000, #    local_end 2030-03-29 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  64036648800, #    utc_start 2030-03-28 22:00:00 (Thu)
  64054879200, #      utc_end 2030-10-25 22:00:00 (Fri)
  64036659600, #  local_start 2030-03-29 01:00:00 (Fri)
  64054890000, #    local_end 2030-10-26 01:00:00 (Sat)
  10800,
  1,
  'EEST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {67}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { 7200 }
  
  my $last_observance = bless( {
    'format' => 'EE%sT',
    'gmtoff' => '2:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 729755,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 729755,
      'utc_rd_secs' => 0,
      'utc_year' => 2000
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => 7200,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 729754,
      'local_rd_secs' => 79200,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 729754,
      'utc_rd_secs' => 79200,
      'utc_year' => 1999
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '1:00',
      'from' => '2016',
      'in' => 'Oct',
      'letter' => '',
      'name' => 'Palestine',
      'offset_from_std' => 0,
      'on' => 'lastSat',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '0:00',
      'from' => '2019',
      'in' => 'Mar',
      'letter' => 'S',
      'name' => 'Palestine',
      'offset_from_std' => 3600,
      'on' => 'lastFri',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_HEBRON

    $main::fatpacked{"DateTime/TimeZone/Asia/Ho_Chi_Minh.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_HO_CHI_MINH';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/asia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Ho_Chi_Minh;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Ho_Chi_Minh::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60131609600, #      utc_end 1906-06-30 16:53:20 (Sat)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60131635200, #    local_end 1906-07-01 00:00:00 (Sun)
  25600,
  0,
  'LMT',
      ],
      [
  60131609600, #    utc_start 1906-06-30 16:53:20 (Sat)
  60284105610, #      utc_end 1911-04-30 16:53:30 (Sun)
  60131635190, #  local_start 1906-06-30 23:59:50 (Sat)
  60284131200, #    local_end 1911-05-01 00:00:00 (Mon)
  25590,
  0,
  'PLMT',
      ],
      [
  60284105610, #    utc_start 1911-04-30 16:53:30 (Sun)
  61283577600, #      utc_end 1942-12-31 16:00:00 (Thu)
  60284130810, #  local_start 1911-04-30 23:53:30 (Sun)
  61283602800, #    local_end 1942-12-31 23:00:00 (Thu)
  25200,
  0,
  '+07',
      ],
      [
  61283577600, #    utc_start 1942-12-31 16:00:00 (Thu)
  61353039600, #      utc_end 1945-03-14 15:00:00 (Wed)
  61283606400, #  local_start 1943-01-01 00:00:00 (Fri)
  61353068400, #    local_end 1945-03-14 23:00:00 (Wed)
  28800,
  0,
  '+08',
      ],
      [
  61353039600, #    utc_start 1945-03-14 15:00:00 (Wed)
  61367814000, #      utc_end 1945-09-01 15:00:00 (Sat)
  61353072000, #  local_start 1945-03-15 00:00:00 (Thu)
  61367846400, #    local_end 1945-09-02 00:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  61367814000, #    utc_start 1945-09-01 15:00:00 (Sat)
  61417587600, #      utc_end 1947-03-31 17:00:00 (Mon)
  61367839200, #  local_start 1945-09-01 22:00:00 (Sat)
  61417612800, #    local_end 1947-04-01 00:00:00 (Tue)
  25200,
  0,
  '+07',
      ],
      [
  61417587600, #    utc_start 1947-03-31 17:00:00 (Mon)
  61677907200, #      utc_end 1955-06-30 16:00:00 (Thu)
  61417616400, #  local_start 1947-04-01 01:00:00 (Tue)
  61677936000, #    local_end 1955-07-01 00:00:00 (Fri)
  28800,
  0,
  '+08',
      ],
      [
  61677907200, #    utc_start 1955-06-30 16:00:00 (Thu)
  61820035200, #      utc_end 1959-12-31 16:00:00 (Thu)
  61677932400, #  local_start 1955-06-30 23:00:00 (Thu)
  61820060400, #    local_end 1959-12-31 23:00:00 (Thu)
  25200,
  0,
  '+07',
      ],
      [
  61820035200, #    utc_start 1959-12-31 16:00:00 (Thu)
  62307504000, #      utc_end 1975-06-12 16:00:00 (Thu)
  61820064000, #  local_start 1960-01-01 00:00:00 (Fri)
  62307532800, #    local_end 1975-06-13 00:00:00 (Fri)
  28800,
  0,
  '+08',
      ],
      [
  62307504000, #    utc_start 1975-06-12 16:00:00 (Thu)
  DateTime::TimeZone::INFINITY, #      utc_end
  62307529200, #  local_start 1975-06-12 23:00:00 (Thu)
  DateTime::TimeZone::INFINITY, #    local_end
  25200,
  0,
  '+07',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_HO_CHI_MINH

    $main::fatpacked{"DateTime/TimeZone/Asia/Hong_Kong.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_HONG_KONG';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/asia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Hong_Kong;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Hong_Kong::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60078992400, #      utc_end 1904-10-29 17:00:00 (Sat)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60079019802, #    local_end 1904-10-30 00:36:42 (Sun)
  27402,
  0,
  'LMT',
      ],
      [
  60078992400, #    utc_start 1904-10-29 17:00:00 (Sat)
  61234772400, #      utc_end 1941-06-14 19:00:00 (Sat)
  60079021200, #  local_start 1904-10-30 01:00:00 (Sun)
  61234801200, #    local_end 1941-06-15 03:00:00 (Sun)
  28800,
  0,
  'HKT',
      ],
      [
  61234772400, #    utc_start 1941-06-14 19:00:00 (Sat)
  61244103600, #      utc_end 1941-09-30 19:00:00 (Tue)
  61234804800, #  local_start 1941-06-15 04:00:00 (Sun)
  61244136000, #    local_end 1941-10-01 04:00:00 (Wed)
  32400,
  1,
  'HKST',
      ],
      [
  61244103600, #    utc_start 1941-09-30 19:00:00 (Tue)
  61251435000, #      utc_end 1941-12-24 15:30:00 (Wed)
  61244134200, #  local_start 1941-10-01 03:30:00 (Wed)
  61251465600, #    local_end 1941-12-25 00:00:00 (Thu)
  30600,
  0,
  'HKT',
      ],
      [
  61251435000, #    utc_start 1941-12-24 15:30:00 (Wed)
  61374474000, #      utc_end 1945-11-17 17:00:00 (Sat)
  61251467400, #  local_start 1941-12-25 00:30:00 (Thu)
  61374506400, #    local_end 1945-11-18 02:00:00 (Sun)
  32400,
  0,
  'JST',
      ],
      [
  61374474000, #    utc_start 1945-11-17 17:00:00 (Sat)
  61387776000, #      utc_end 1946-04-20 16:00:00 (Sat)
  61374502800, #  local_start 1945-11-18 01:00:00 (Sun)
  61387804800, #    local_end 1946-04-21 00:00:00 (Sun)
  28800,
  0,
  'HKT',
      ],
      [
  61387776000, #    utc_start 1946-04-20 16:00:00 (Sat)
  61407142200, #      utc_end 1946-11-30 19:30:00 (Sat)
  61387808400, #  local_start 1946-04-21 01:00:00 (Sun)
  61407174600, #    local_end 1946-12-01 04:30:00 (Sun)
  32400,
  1,
  'HKST',
      ],
      [
  61407142200, #    utc_start 1946-11-30 19:30:00 (Sat)
  61418633400, #      utc_end 1947-04-12 19:30:00 (Sat)
  61407171000, #  local_start 1946-12-01 03:30:00 (Sun)
  61418662200, #    local_end 1947-04-13 03:30:00 (Sun)
  28800,
  0,
  'HKT',
      ],
      [
  61418633400, #    utc_start 1947-04-12 19:30:00 (Sat)
  61438591800, #      utc_end 1947-11-29 19:30:00 (Sat)
  61418665800, #  local_start 1947-04-13 04:30:00 (Sun)
  61438624200, #    local_end 1947-11-30 04:30:00 (Sun)
  32400,
  1,
  'HKST',
      ],
      [
  61438591800, #    utc_start 1947-11-29 19:30:00 (Sat)
  61451897400, #      utc_end 1948-05-01 19:30:00 (Sat)
  61438620600, #  local_start 1947-11-30 03:30:00 (Sun)
  61451926200, #    local_end 1948-05-02 03:30:00 (Sun)
  28800,
  0,
  'HKT',
      ],
      [
  61451897400, #    utc_start 1948-05-01 19:30:00 (Sat)
  61467622200, #      utc_end 1948-10-30 19:30:00 (Sat)
  61451929800, #  local_start 1948-05-02 04:30:00 (Sun)
  61467654600, #    local_end 1948-10-31 04:30:00 (Sun)
  32400,
  1,
  'HKST',
      ],
      [
  61467622200, #    utc_start 1948-10-30 19:30:00 (Sat)
  61480927800, #      utc_end 1949-04-02 19:30:00 (Sat)
  61467651000, #  local_start 1948-10-31 03:30:00 (Sun)
  61480956600, #    local_end 1949-04-03 03:30:00 (Sun)
  28800,
  0,
  'HKT',
      ],
      [
  61480927800, #    utc_start 1949-04-02 19:30:00 (Sat)
  61499071800, #      utc_end 1949-10-29 19:30:00 (Sat)
  61480960200, #  local_start 1949-04-03 04:30:00 (Sun)
  61499104200, #    local_end 1949-10-30 04:30:00 (Sun)
  32400,
  1,
  'HKST',
      ],
      [
  61499071800, #    utc_start 1949-10-29 19:30:00 (Sat)
  61512377400, #      utc_end 1950-04-01 19:30:00 (Sat)
  61499100600, #  local_start 1949-10-30 03:30:00 (Sun)
  61512406200, #    local_end 1950-04-02 03:30:00 (Sun)
  28800,
  0,
  'HKT',
      ],
      [
  61512377400, #    utc_start 1950-04-01 19:30:00 (Sat)
  61530521400, #      utc_end 1950-10-28 19:30:00 (Sat)
  61512409800, #  local_start 1950-04-02 04:30:00 (Sun)
  61530553800, #    local_end 1950-10-29 04:30:00 (Sun)
  32400,
  1,
  'HKST',
      ],
      [
  61530521400, #    utc_start 1950-10-28 19:30:00 (Sat)
  61543827000, #      utc_end 1951-03-31 19:30:00 (Sat)
  61530550200, #  local_start 1950-10-29 03:30:00 (Sun)
  61543855800, #    local_end 1951-04-01 03:30:00 (Sun)
  28800,
  0,
  'HKT',
      ],
      [
  61543827000, #    utc_start 1951-03-31 19:30:00 (Sat)
  61561971000, #      utc_end 1951-10-27 19:30:00 (Sat)
  61543859400, #  local_start 1951-04-01 04:30:00 (Sun)
  61562003400, #    local_end 1951-10-28 04:30:00 (Sun)
  32400,
  1,
  'HKST',
      ],
      [
  61561971000, #    utc_start 1951-10-27 19:30:00 (Sat)
  61575881400, #      utc_end 1952-04-05 19:30:00 (Sat)
  61561999800, #  local_start 1951-10-28 03:30:00 (Sun)
  61575910200, #    local_end 1952-04-06 03:30:00 (Sun)
  28800,
  0,
  'HKT',
      ],
      [
  61575881400, #    utc_start 1952-04-05 19:30:00 (Sat)
  61594025400, #      utc_end 1952-11-01 19:30:00 (Sat)
  61575913800, #  local_start 1952-04-06 04:30:00 (Sun)
  61594057800, #    local_end 1952-11-02 04:30:00 (Sun)
  32400,
  1,
  'HKST',
      ],
      [
  61594025400, #    utc_start 1952-11-01 19:30:00 (Sat)
  61607331000, #      utc_end 1953-04-04 19:30:00 (Sat)
  61594054200, #  local_start 1952-11-02 03:30:00 (Sun)
  61607359800, #    local_end 1953-04-05 03:30:00 (Sun)
  28800,
  0,
  'HKT',
      ],
      [
  61607331000, #    utc_start 1953-04-04 19:30:00 (Sat)
  61625471400, #      utc_end 1953-10-31 18:30:00 (Sat)
  61607363400, #  local_start 1953-04-05 04:30:00 (Sun)
  61625503800, #    local_end 1953-11-01 03:30:00 (Sun)
  32400,
  1,
  'HKST',
      ],
      [
  61625471400, #    utc_start 1953-10-31 18:30:00 (Sat)
  61637571000, #      utc_end 1954-03-20 19:30:00 (Sat)
  61625500200, #  local_start 1953-11-01 02:30:00 (Sun)
  61637599800, #    local_end 1954-03-21 03:30:00 (Sun)
  28800,
  0,
  'HKT',
      ],
      [
  61637571000, #    utc_start 1954-03-20 19:30:00 (Sat)
  61656921000, #      utc_end 1954-10-30 18:30:00 (Sat)
  61637603400, #  local_start 1954-03-21 04:30:00 (Sun)
  61656953400, #    local_end 1954-10-31 03:30:00 (Sun)
  32400,
  1,
  'HKST',
      ],
      [
  61656921000, #    utc_start 1954-10-30 18:30:00 (Sat)
  61669020600, #      utc_end 1955-03-19 19:30:00 (Sat)
  61656949800, #  local_start 1954-10-31 02:30:00 (Sun)
  61669049400, #    local_end 1955-03-20 03:30:00 (Sun)
  28800,
  0,
  'HKT',
      ],
      [
  61669020600, #    utc_start 1955-03-19 19:30:00 (Sat)
  61688975400, #      utc_end 1955-11-05 18:30:00 (Sat)
  61669053000, #  local_start 1955-03-20 04:30:00 (Sun)
  61689007800, #    local_end 1955-11-06 03:30:00 (Sun)
  32400,
  1,
  'HKST',
      ],
      [
  61688975400, #    utc_start 1955-11-05 18:30:00 (Sat)
  61700470200, #      utc_end 1956-03-17 19:30:00 (Sat)
  61689004200, #  local_start 1955-11-06 02:30:00 (Sun)
  61700499000, #    local_end 1956-03-18 03:30:00 (Sun)
  28800,
  0,
  'HKT',
      ],
      [
  61700470200, #    utc_start 1956-03-17 19:30:00 (Sat)
  61720425000, #      utc_end 1956-11-03 18:30:00 (Sat)
  61700502600, #  local_start 1956-03-18 04:30:00 (Sun)
  61720457400, #    local_end 1956-11-04 03:30:00 (Sun)
  32400,
  1,
  'HKST',
      ],
      [
  61720425000, #    utc_start 1956-11-03 18:30:00 (Sat)
  61732524600, #      utc_end 1957-03-23 19:30:00 (Sat)
  61720453800, #  local_start 1956-11-04 02:30:00 (Sun)
  61732553400, #    local_end 1957-03-24 03:30:00 (Sun)
  28800,
  0,
  'HKT',
      ],
      [
  61732524600, #    utc_start 1957-03-23 19:30:00 (Sat)
  61751874600, #      utc_end 1957-11-02 18:30:00 (Sat)
  61732557000, #  local_start 1957-03-24 04:30:00 (Sun)
  61751907000, #    local_end 1957-11-03 03:30:00 (Sun)
  32400,
  1,
  'HKST',
      ],
      [
  61751874600, #    utc_start 1957-11-02 18:30:00 (Sat)
  61763974200, #      utc_end 1958-03-22 19:30:00 (Sat)
  61751903400, #  local_start 1957-11-03 02:30:00 (Sun)
  61764003000, #    local_end 1958-03-23 03:30:00 (Sun)
  28800,
  0,
  'HKT',
      ],
      [
  61763974200, #    utc_start 1958-03-22 19:30:00 (Sat)
  61783324200, #      utc_end 1958-11-01 18:30:00 (Sat)
  61764006600, #  local_start 1958-03-23 04:30:00 (Sun)
  61783356600, #    local_end 1958-11-02 03:30:00 (Sun)
  32400,
  1,
  'HKST',
      ],
      [
  61783324200, #    utc_start 1958-11-01 18:30:00 (Sat)
  61795423800, #      utc_end 1959-03-21 19:30:00 (Sat)
  61783353000, #  local_start 1958-11-02 02:30:00 (Sun)
  61795452600, #    local_end 1959-03-22 03:30:00 (Sun)
  28800,
  0,
  'HKT',
      ],
      [
  61795423800, #    utc_start 1959-03-21 19:30:00 (Sat)
  61814773800, #      utc_end 1959-10-31 18:30:00 (Sat)
  61795456200, #  local_start 1959-03-22 04:30:00 (Sun)
  61814806200, #    local_end 1959-11-01 03:30:00 (Sun)
  32400,
  1,
  'HKST',
      ],
      [
  61814773800, #    utc_start 1959-10-31 18:30:00 (Sat)
  61826873400, #      utc_end 1960-03-19 19:30:00 (Sat)
  61814802600, #  local_start 1959-11-01 02:30:00 (Sun)
  61826902200, #    local_end 1960-03-20 03:30:00 (Sun)
  28800,
  0,
  'HKT',
      ],
      [
  61826873400, #    utc_start 1960-03-19 19:30:00 (Sat)
  61846828200, #      utc_end 1960-11-05 18:30:00 (Sat)
  61826905800, #  local_start 1960-03-20 04:30:00 (Sun)
  61846860600, #    local_end 1960-11-06 03:30:00 (Sun)
  32400,
  1,
  'HKST',
      ],
      [
  61846828200, #    utc_start 1960-11-05 18:30:00 (Sat)
  61858323000, #      utc_end 1961-03-18 19:30:00 (Sat)
  61846857000, #  local_start 1960-11-06 02:30:00 (Sun)
  61858351800, #    local_end 1961-03-19 03:30:00 (Sun)
  28800,
  0,
  'HKT',
      ],
      [
  61858323000, #    utc_start 1961-03-18 19:30:00 (Sat)
  61878277800, #      utc_end 1961-11-04 18:30:00 (Sat)
  61858355400, #  local_start 1961-03-19 04:30:00 (Sun)
  61878310200, #    local_end 1961-11-05 03:30:00 (Sun)
  32400,
  1,
  'HKST',
      ],
      [
  61878277800, #    utc_start 1961-11-04 18:30:00 (Sat)
  61889772600, #      utc_end 1962-03-17 19:30:00 (Sat)
  61878306600, #  local_start 1961-11-05 02:30:00 (Sun)
  61889801400, #    local_end 1962-03-18 03:30:00 (Sun)
  28800,
  0,
  'HKT',
      ],
      [
  61889772600, #    utc_start 1962-03-17 19:30:00 (Sat)
  61909727400, #      utc_end 1962-11-03 18:30:00 (Sat)
  61889805000, #  local_start 1962-03-18 04:30:00 (Sun)
  61909759800, #    local_end 1962-11-04 03:30:00 (Sun)
  32400,
  1,
  'HKST',
      ],
      [
  61909727400, #    utc_start 1962-11-03 18:30:00 (Sat)
  61921827000, #      utc_end 1963-03-23 19:30:00 (Sat)
  61909756200, #  local_start 1962-11-04 02:30:00 (Sun)
  61921855800, #    local_end 1963-03-24 03:30:00 (Sun)
  28800,
  0,
  'HKT',
      ],
      [
  61921827000, #    utc_start 1963-03-23 19:30:00 (Sat)
  61941177000, #      utc_end 1963-11-02 18:30:00 (Sat)
  61921859400, #  local_start 1963-03-24 04:30:00 (Sun)
  61941209400, #    local_end 1963-11-03 03:30:00 (Sun)
  32400,
  1,
  'HKST',
      ],
      [
  61941177000, #    utc_start 1963-11-02 18:30:00 (Sat)
  61953276600, #      utc_end 1964-03-21 19:30:00 (Sat)
  61941205800, #  local_start 1963-11-03 02:30:00 (Sun)
  61953305400, #    local_end 1964-03-22 03:30:00 (Sun)
  28800,
  0,
  'HKT',
      ],
      [
  61953276600, #    utc_start 1964-03-21 19:30:00 (Sat)
  61972626600, #      utc_end 1964-10-31 18:30:00 (Sat)
  61953309000, #  local_start 1964-03-22 04:30:00 (Sun)
  61972659000, #    local_end 1964-11-01 03:30:00 (Sun)
  32400,
  1,
  'HKST',
      ],
      [
  61972626600, #    utc_start 1964-10-31 18:30:00 (Sat)
  61987145400, #      utc_end 1965-04-17 19:30:00 (Sat)
  61972655400, #  local_start 1964-11-01 02:30:00 (Sun)
  61987174200, #    local_end 1965-04-18 03:30:00 (Sun)
  28800,
  0,
  'HKT',
      ],
      [
  61987145400, #    utc_start 1965-04-17 19:30:00 (Sat)
  62002866600, #      utc_end 1965-10-16 18:30:00 (Sat)
  61987177800, #  local_start 1965-04-18 04:30:00 (Sun)
  62002899000, #    local_end 1965-10-17 03:30:00 (Sun)
  32400,
  1,
  'HKST',
      ],
      [
  62002866600, #    utc_start 1965-10-16 18:30:00 (Sat)
  62018595000, #      utc_end 1966-04-16 19:30:00 (Sat)
  62002895400, #  local_start 1965-10-17 02:30:00 (Sun)
  62018623800, #    local_end 1966-04-17 03:30:00 (Sun)
  28800,
  0,
  'HKT',
      ],
      [
  62018595000, #    utc_start 1966-04-16 19:30:00 (Sat)
  62034316200, #      utc_end 1966-10-15 18:30:00 (Sat)
  62018627400, #  local_start 1966-04-17 04:30:00 (Sun)
  62034348600, #    local_end 1966-10-16 03:30:00 (Sun)
  32400,
  1,
  'HKST',
      ],
      [
  62034316200, #    utc_start 1966-10-15 18:30:00 (Sat)
  62050044600, #      utc_end 1967-04-15 19:30:00 (Sat)
  62034345000, #  local_start 1966-10-16 02:30:00 (Sun)
  62050073400, #    local_end 1967-04-16 03:30:00 (Sun)
  28800,
  0,
  'HKT',
      ],
      [
  62050044600, #    utc_start 1967-04-15 19:30:00 (Sat)
  62066370600, #      utc_end 1967-10-21 18:30:00 (Sat)
  62050077000, #  local_start 1967-04-16 04:30:00 (Sun)
  62066403000, #    local_end 1967-10-22 03:30:00 (Sun)
  32400,
  1,
  'HKST',
      ],
      [
  62066370600, #    utc_start 1967-10-21 18:30:00 (Sat)
  62082099000, #      utc_end 1968-04-20 19:30:00 (Sat)
  62066399400, #  local_start 1967-10-22 02:30:00 (Sun)
  62082127800, #    local_end 1968-04-21 03:30:00 (Sun)
  28800,
  0,
  'HKT',
      ],
      [
  62082099000, #    utc_start 1968-04-20 19:30:00 (Sat)
  62097820200, #      utc_end 1968-10-19 18:30:00 (Sat)
  62082131400, #  local_start 1968-04-21 04:30:00 (Sun)
  62097852600, #    local_end 1968-10-20 03:30:00 (Sun)
  32400,
  1,
  'HKST',
      ],
      [
  62097820200, #    utc_start 1968-10-19 18:30:00 (Sat)
  62113548600, #      utc_end 1969-04-19 19:30:00 (Sat)
  62097849000, #  local_start 1968-10-20 02:30:00 (Sun)
  62113577400, #    local_end 1969-04-20 03:30:00 (Sun)
  28800,
  0,
  'HKT',
      ],
      [
  62113548600, #    utc_start 1969-04-19 19:30:00 (Sat)
  62129269800, #      utc_end 1969-10-18 18:30:00 (Sat)
  62113581000, #  local_start 1969-04-20 04:30:00 (Sun)
  62129302200, #    local_end 1969-10-19 03:30:00 (Sun)
  32400,
  1,
  'HKST',
      ],
      [
  62129269800, #    utc_start 1969-10-18 18:30:00 (Sat)
  62144998200, #      utc_end 1970-04-18 19:30:00 (Sat)
  62129298600, #  local_start 1969-10-19 02:30:00 (Sun)
  62145027000, #    local_end 1970-04-19 03:30:00 (Sun)
  28800,
  0,
  'HKT',
      ],
      [
  62144998200, #    utc_start 1970-04-18 19:30:00 (Sat)
  62160719400, #      utc_end 1970-10-17 18:30:00 (Sat)
  62145030600, #  local_start 1970-04-19 04:30:00 (Sun)
  62160751800, #    local_end 1970-10-18 03:30:00 (Sun)
  32400,
  1,
  'HKST',
      ],
      [
  62160719400, #    utc_start 1970-10-17 18:30:00 (Sat)
  62176447800, #      utc_end 1971-04-17 19:30:00 (Sat)
  62160748200, #  local_start 1970-10-18 02:30:00 (Sun)
  62176476600, #    local_end 1971-04-18 03:30:00 (Sun)
  28800,
  0,
  'HKT',
      ],
      [
  62176447800, #    utc_start 1971-04-17 19:30:00 (Sat)
  62192169000, #      utc_end 1971-10-16 18:30:00 (Sat)
  62176480200, #  local_start 1971-04-18 04:30:00 (Sun)
  62192201400, #    local_end 1971-10-17 03:30:00 (Sun)
  32400,
  1,
  'HKST',
      ],
      [
  62192169000, #    utc_start 1971-10-16 18:30:00 (Sat)
  62207897400, #      utc_end 1972-04-15 19:30:00 (Sat)
  62192197800, #  local_start 1971-10-17 02:30:00 (Sun)
  62207926200, #    local_end 1972-04-16 03:30:00 (Sun)
  28800,
  0,
  'HKT',
      ],
      [
  62207897400, #    utc_start 1972-04-15 19:30:00 (Sat)
  62224223400, #      utc_end 1972-10-21 18:30:00 (Sat)
  62207929800, #  local_start 1972-04-16 04:30:00 (Sun)
  62224255800, #    local_end 1972-10-22 03:30:00 (Sun)
  32400,
  1,
  'HKST',
      ],
      [
  62224223400, #    utc_start 1972-10-21 18:30:00 (Sat)
  62239951800, #      utc_end 1973-04-21 19:30:00 (Sat)
  62224252200, #  local_start 1972-10-22 02:30:00 (Sun)
  62239980600, #    local_end 1973-04-22 03:30:00 (Sun)
  28800,
  0,
  'HKT',
      ],
      [
  62239951800, #    utc_start 1973-04-21 19:30:00 (Sat)
  62255673000, #      utc_end 1973-10-20 18:30:00 (Sat)
  62239984200, #  local_start 1973-04-22 04:30:00 (Sun)
  62255705400, #    local_end 1973-10-21 03:30:00 (Sun)
  32400,
  1,
  'HKST',
      ],
      [
  62255673000, #    utc_start 1973-10-20 18:30:00 (Sat)
  62261724600, #      utc_end 1973-12-29 19:30:00 (Sat)
  62255701800, #  local_start 1973-10-21 02:30:00 (Sun)
  62261753400, #    local_end 1973-12-30 03:30:00 (Sun)
  28800,
  0,
  'HKT',
      ],
      [
  62261724600, #    utc_start 1973-12-29 19:30:00 (Sat)
  62271397800, #      utc_end 1974-04-20 18:30:00 (Sat)
  62261757000, #  local_start 1973-12-30 04:30:00 (Sun)
  62271430200, #    local_end 1974-04-21 03:30:00 (Sun)
  32400,
  1,
  'HKST',
      ],
      [
  62271397800, #    utc_start 1974-04-20 18:30:00 (Sat)
  62287122600, #      utc_end 1974-10-19 18:30:00 (Sat)
  62271430200, #  local_start 1974-04-21 03:30:00 (Sun)
  62287155000, #    local_end 1974-10-20 03:30:00 (Sun)
  32400,
  1,
  'HKST',
      ],
      [
  62287122600, #    utc_start 1974-10-19 18:30:00 (Sat)
  62302851000, #      utc_end 1975-04-19 19:30:00 (Sat)
  62287151400, #  local_start 1974-10-20 02:30:00 (Sun)
  62302879800, #    local_end 1975-04-20 03:30:00 (Sun)
  28800,
  0,
  'HKT',
      ],
      [
  62302851000, #    utc_start 1975-04-19 19:30:00 (Sat)
  62318572200, #      utc_end 1975-10-18 18:30:00 (Sat)
  62302883400, #  local_start 1975-04-20 04:30:00 (Sun)
  62318604600, #    local_end 1975-10-19 03:30:00 (Sun)
  32400,
  1,
  'HKST',
      ],
      [
  62318572200, #    utc_start 1975-10-18 18:30:00 (Sat)
  62334300600, #      utc_end 1976-04-17 19:30:00 (Sat)
  62318601000, #  local_start 1975-10-19 02:30:00 (Sun)
  62334329400, #    local_end 1976-04-18 03:30:00 (Sun)
  28800,
  0,
  'HKT',
      ],
      [
  62334300600, #    utc_start 1976-04-17 19:30:00 (Sat)
  62350021800, #      utc_end 1976-10-16 18:30:00 (Sat)
  62334333000, #  local_start 1976-04-18 04:30:00 (Sun)
  62350054200, #    local_end 1976-10-17 03:30:00 (Sun)
  32400,
  1,
  'HKST',
      ],
      [
  62350021800, #    utc_start 1976-10-16 18:30:00 (Sat)
  62431068600, #      utc_end 1979-05-12 19:30:00 (Sat)
  62350050600, #  local_start 1976-10-17 02:30:00 (Sun)
  62431097400, #    local_end 1979-05-13 03:30:00 (Sun)
  28800,
  0,
  'HKT',
      ],
      [
  62431068600, #    utc_start 1979-05-12 19:30:00 (Sat)
  62444975400, #      utc_end 1979-10-20 18:30:00 (Sat)
  62431101000, #  local_start 1979-05-13 04:30:00 (Sun)
  62445007800, #    local_end 1979-10-21 03:30:00 (Sun)
  32400,
  1,
  'HKST',
      ],
      [
  62444975400, #    utc_start 1979-10-20 18:30:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  62445004200, #  local_start 1979-10-21 02:30:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  28800,
  0,
  'HKT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {34}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_HONG_KONG

    $main::fatpacked{"DateTime/TimeZone/Asia/Hovd.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_HOVD';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/asia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Hovd;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Hovd::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60102755604, #      utc_end 1905-07-31 17:53:24 (Mon)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60102777600, #    local_end 1905-08-01 00:00:00 (Tue)
  21996,
  0,
  'LMT',
      ],
      [
  60102755604, #    utc_start 1905-07-31 17:53:24 (Mon)
  62388122400, #      utc_end 1977-12-31 18:00:00 (Sat)
  60102777204, #  local_start 1905-07-31 23:53:24 (Mon)
  62388144000, #    local_end 1978-01-01 00:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  62388122400, #    utc_start 1977-12-31 18:00:00 (Sat)
  62553661200, #      utc_end 1983-03-31 17:00:00 (Thu)
  62388147600, #  local_start 1978-01-01 01:00:00 (Sun)
  62553686400, #    local_end 1983-04-01 00:00:00 (Fri)
  25200,
  0,
  '+07',
      ],
      [
  62553661200, #    utc_start 1983-03-31 17:00:00 (Thu)
  62569468800, #      utc_end 1983-09-30 16:00:00 (Fri)
  62553690000, #  local_start 1983-04-01 01:00:00 (Fri)
  62569497600, #    local_end 1983-10-01 00:00:00 (Sat)
  28800,
  1,
  '+08',
      ],
      [
  62569468800, #    utc_start 1983-09-30 16:00:00 (Fri)
  62585283600, #      utc_end 1984-03-31 17:00:00 (Sat)
  62569494000, #  local_start 1983-09-30 23:00:00 (Fri)
  62585308800, #    local_end 1984-04-01 00:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62585283600, #    utc_start 1984-03-31 17:00:00 (Sat)
  62601004800, #      utc_end 1984-09-29 16:00:00 (Sat)
  62585312400, #  local_start 1984-04-01 01:00:00 (Sun)
  62601033600, #    local_end 1984-09-30 00:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62601004800, #    utc_start 1984-09-29 16:00:00 (Sat)
  62616733200, #      utc_end 1985-03-30 17:00:00 (Sat)
  62601030000, #  local_start 1984-09-29 23:00:00 (Sat)
  62616758400, #    local_end 1985-03-31 00:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62616733200, #    utc_start 1985-03-30 17:00:00 (Sat)
  62632454400, #      utc_end 1985-09-28 16:00:00 (Sat)
  62616762000, #  local_start 1985-03-31 01:00:00 (Sun)
  62632483200, #    local_end 1985-09-29 00:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62632454400, #    utc_start 1985-09-28 16:00:00 (Sat)
  62648182800, #      utc_end 1986-03-29 17:00:00 (Sat)
  62632479600, #  local_start 1985-09-28 23:00:00 (Sat)
  62648208000, #    local_end 1986-03-30 00:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62648182800, #    utc_start 1986-03-29 17:00:00 (Sat)
  62663904000, #      utc_end 1986-09-27 16:00:00 (Sat)
  62648211600, #  local_start 1986-03-30 01:00:00 (Sun)
  62663932800, #    local_end 1986-09-28 00:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62663904000, #    utc_start 1986-09-27 16:00:00 (Sat)
  62679632400, #      utc_end 1987-03-28 17:00:00 (Sat)
  62663929200, #  local_start 1986-09-27 23:00:00 (Sat)
  62679657600, #    local_end 1987-03-29 00:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62679632400, #    utc_start 1987-03-28 17:00:00 (Sat)
  62695353600, #      utc_end 1987-09-26 16:00:00 (Sat)
  62679661200, #  local_start 1987-03-29 01:00:00 (Sun)
  62695382400, #    local_end 1987-09-27 00:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62695353600, #    utc_start 1987-09-26 16:00:00 (Sat)
  62711082000, #      utc_end 1988-03-26 17:00:00 (Sat)
  62695378800, #  local_start 1987-09-26 23:00:00 (Sat)
  62711107200, #    local_end 1988-03-27 00:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62711082000, #    utc_start 1988-03-26 17:00:00 (Sat)
  62726803200, #      utc_end 1988-09-24 16:00:00 (Sat)
  62711110800, #  local_start 1988-03-27 01:00:00 (Sun)
  62726832000, #    local_end 1988-09-25 00:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62726803200, #    utc_start 1988-09-24 16:00:00 (Sat)
  62742531600, #      utc_end 1989-03-25 17:00:00 (Sat)
  62726828400, #  local_start 1988-09-24 23:00:00 (Sat)
  62742556800, #    local_end 1989-03-26 00:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62742531600, #    utc_start 1989-03-25 17:00:00 (Sat)
  62758252800, #      utc_end 1989-09-23 16:00:00 (Sat)
  62742560400, #  local_start 1989-03-26 01:00:00 (Sun)
  62758281600, #    local_end 1989-09-24 00:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62758252800, #    utc_start 1989-09-23 16:00:00 (Sat)
  62773981200, #      utc_end 1990-03-24 17:00:00 (Sat)
  62758278000, #  local_start 1989-09-23 23:00:00 (Sat)
  62774006400, #    local_end 1990-03-25 00:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62773981200, #    utc_start 1990-03-24 17:00:00 (Sat)
  62790307200, #      utc_end 1990-09-29 16:00:00 (Sat)
  62774010000, #  local_start 1990-03-25 01:00:00 (Sun)
  62790336000, #    local_end 1990-09-30 00:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62790307200, #    utc_start 1990-09-29 16:00:00 (Sat)
  62806035600, #      utc_end 1991-03-30 17:00:00 (Sat)
  62790332400, #  local_start 1990-09-29 23:00:00 (Sat)
  62806060800, #    local_end 1991-03-31 00:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62806035600, #    utc_start 1991-03-30 17:00:00 (Sat)
  62821756800, #      utc_end 1991-09-28 16:00:00 (Sat)
  62806064400, #  local_start 1991-03-31 01:00:00 (Sun)
  62821785600, #    local_end 1991-09-29 00:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62821756800, #    utc_start 1991-09-28 16:00:00 (Sat)
  62837485200, #      utc_end 1992-03-28 17:00:00 (Sat)
  62821782000, #  local_start 1991-09-28 23:00:00 (Sat)
  62837510400, #    local_end 1992-03-29 00:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62837485200, #    utc_start 1992-03-28 17:00:00 (Sat)
  62853206400, #      utc_end 1992-09-26 16:00:00 (Sat)
  62837514000, #  local_start 1992-03-29 01:00:00 (Sun)
  62853235200, #    local_end 1992-09-27 00:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62853206400, #    utc_start 1992-09-26 16:00:00 (Sat)
  62868934800, #      utc_end 1993-03-27 17:00:00 (Sat)
  62853231600, #  local_start 1992-09-26 23:00:00 (Sat)
  62868960000, #    local_end 1993-03-28 00:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62868934800, #    utc_start 1993-03-27 17:00:00 (Sat)
  62884656000, #      utc_end 1993-09-25 16:00:00 (Sat)
  62868963600, #  local_start 1993-03-28 01:00:00 (Sun)
  62884684800, #    local_end 1993-09-26 00:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62884656000, #    utc_start 1993-09-25 16:00:00 (Sat)
  62900384400, #      utc_end 1994-03-26 17:00:00 (Sat)
  62884681200, #  local_start 1993-09-25 23:00:00 (Sat)
  62900409600, #    local_end 1994-03-27 00:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62900384400, #    utc_start 1994-03-26 17:00:00 (Sat)
  62916105600, #      utc_end 1994-09-24 16:00:00 (Sat)
  62900413200, #  local_start 1994-03-27 01:00:00 (Sun)
  62916134400, #    local_end 1994-09-25 00:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62916105600, #    utc_start 1994-09-24 16:00:00 (Sat)
  62931834000, #      utc_end 1995-03-25 17:00:00 (Sat)
  62916130800, #  local_start 1994-09-24 23:00:00 (Sat)
  62931859200, #    local_end 1995-03-26 00:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62931834000, #    utc_start 1995-03-25 17:00:00 (Sat)
  62947555200, #      utc_end 1995-09-23 16:00:00 (Sat)
  62931862800, #  local_start 1995-03-26 01:00:00 (Sun)
  62947584000, #    local_end 1995-09-24 00:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62947555200, #    utc_start 1995-09-23 16:00:00 (Sat)
  62963888400, #      utc_end 1996-03-30 17:00:00 (Sat)
  62947580400, #  local_start 1995-09-23 23:00:00 (Sat)
  62963913600, #    local_end 1996-03-31 00:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62963888400, #    utc_start 1996-03-30 17:00:00 (Sat)
  62979609600, #      utc_end 1996-09-28 16:00:00 (Sat)
  62963917200, #  local_start 1996-03-31 01:00:00 (Sun)
  62979638400, #    local_end 1996-09-29 00:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62979609600, #    utc_start 1996-09-28 16:00:00 (Sat)
  62995338000, #      utc_end 1997-03-29 17:00:00 (Sat)
  62979634800, #  local_start 1996-09-28 23:00:00 (Sat)
  62995363200, #    local_end 1997-03-30 00:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62995338000, #    utc_start 1997-03-29 17:00:00 (Sat)
  63011059200, #      utc_end 1997-09-27 16:00:00 (Sat)
  62995366800, #  local_start 1997-03-30 01:00:00 (Sun)
  63011088000, #    local_end 1997-09-28 00:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  63011059200, #    utc_start 1997-09-27 16:00:00 (Sat)
  63026787600, #      utc_end 1998-03-28 17:00:00 (Sat)
  63011084400, #  local_start 1997-09-27 23:00:00 (Sat)
  63026812800, #    local_end 1998-03-29 00:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  63026787600, #    utc_start 1998-03-28 17:00:00 (Sat)
  63042508800, #      utc_end 1998-09-26 16:00:00 (Sat)
  63026816400, #  local_start 1998-03-29 01:00:00 (Sun)
  63042537600, #    local_end 1998-09-27 00:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  63042508800, #    utc_start 1998-09-26 16:00:00 (Sat)
  63124081200, #      utc_end 2001-04-27 19:00:00 (Fri)
  63042534000, #  local_start 1998-09-26 23:00:00 (Sat)
  63124106400, #    local_end 2001-04-28 02:00:00 (Sat)
  25200,
  0,
  '+07',
      ],
      [
  63124081200, #    utc_start 2001-04-27 19:00:00 (Fri)
  63137383200, #      utc_end 2001-09-28 18:00:00 (Fri)
  63124110000, #  local_start 2001-04-28 03:00:00 (Sat)
  63137412000, #    local_end 2001-09-29 02:00:00 (Sat)
  28800,
  1,
  '+08',
      ],
      [
  63137383200, #    utc_start 2001-09-28 18:00:00 (Fri)
  63153111600, #      utc_end 2002-03-29 19:00:00 (Fri)
  63137408400, #  local_start 2001-09-29 01:00:00 (Sat)
  63153136800, #    local_end 2002-03-30 02:00:00 (Sat)
  25200,
  0,
  '+07',
      ],
      [
  63153111600, #    utc_start 2002-03-29 19:00:00 (Fri)
  63168832800, #      utc_end 2002-09-27 18:00:00 (Fri)
  63153140400, #  local_start 2002-03-30 03:00:00 (Sat)
  63168861600, #    local_end 2002-09-28 02:00:00 (Sat)
  28800,
  1,
  '+08',
      ],
      [
  63168832800, #    utc_start 2002-09-27 18:00:00 (Fri)
  63184561200, #      utc_end 2003-03-28 19:00:00 (Fri)
  63168858000, #  local_start 2002-09-28 01:00:00 (Sat)
  63184586400, #    local_end 2003-03-29 02:00:00 (Sat)
  25200,
  0,
  '+07',
      ],
      [
  63184561200, #    utc_start 2003-03-28 19:00:00 (Fri)
  63200282400, #      utc_end 2003-09-26 18:00:00 (Fri)
  63184590000, #  local_start 2003-03-29 03:00:00 (Sat)
  63200311200, #    local_end 2003-09-27 02:00:00 (Sat)
  28800,
  1,
  '+08',
      ],
      [
  63200282400, #    utc_start 2003-09-26 18:00:00 (Fri)
  63216010800, #      utc_end 2004-03-26 19:00:00 (Fri)
  63200307600, #  local_start 2003-09-27 01:00:00 (Sat)
  63216036000, #    local_end 2004-03-27 02:00:00 (Sat)
  25200,
  0,
  '+07',
      ],
      [
  63216010800, #    utc_start 2004-03-26 19:00:00 (Fri)
  63231732000, #      utc_end 2004-09-24 18:00:00 (Fri)
  63216039600, #  local_start 2004-03-27 03:00:00 (Sat)
  63231760800, #    local_end 2004-09-25 02:00:00 (Sat)
  28800,
  1,
  '+08',
      ],
      [
  63231732000, #    utc_start 2004-09-24 18:00:00 (Fri)
  63247460400, #      utc_end 2005-03-25 19:00:00 (Fri)
  63231757200, #  local_start 2004-09-25 01:00:00 (Sat)
  63247485600, #    local_end 2005-03-26 02:00:00 (Sat)
  25200,
  0,
  '+07',
      ],
      [
  63247460400, #    utc_start 2005-03-25 19:00:00 (Fri)
  63263181600, #      utc_end 2005-09-23 18:00:00 (Fri)
  63247489200, #  local_start 2005-03-26 03:00:00 (Sat)
  63263210400, #    local_end 2005-09-24 02:00:00 (Sat)
  28800,
  1,
  '+08',
      ],
      [
  63263181600, #    utc_start 2005-09-23 18:00:00 (Fri)
  63278910000, #      utc_end 2006-03-24 19:00:00 (Fri)
  63263206800, #  local_start 2005-09-24 01:00:00 (Sat)
  63278935200, #    local_end 2006-03-25 02:00:00 (Sat)
  25200,
  0,
  '+07',
      ],
      [
  63278910000, #    utc_start 2006-03-24 19:00:00 (Fri)
  63295236000, #      utc_end 2006-09-29 18:00:00 (Fri)
  63278938800, #  local_start 2006-03-25 03:00:00 (Sat)
  63295264800, #    local_end 2006-09-30 02:00:00 (Sat)
  28800,
  1,
  '+08',
      ],
      [
  63295236000, #    utc_start 2006-09-29 18:00:00 (Fri)
  63563166000, #      utc_end 2015-03-27 19:00:00 (Fri)
  63295261200, #  local_start 2006-09-30 01:00:00 (Sat)
  63563191200, #    local_end 2015-03-28 02:00:00 (Sat)
  25200,
  0,
  '+07',
      ],
      [
  63563166000, #    utc_start 2015-03-27 19:00:00 (Fri)
  63578880000, #      utc_end 2015-09-25 16:00:00 (Fri)
  63563194800, #  local_start 2015-03-28 03:00:00 (Sat)
  63578908800, #    local_end 2015-09-26 00:00:00 (Sat)
  28800,
  1,
  '+08',
      ],
      [
  63578880000, #    utc_start 2015-09-25 16:00:00 (Fri)
  63594615600, #      utc_end 2016-03-25 19:00:00 (Fri)
  63578905200, #  local_start 2015-09-25 23:00:00 (Fri)
  63594640800, #    local_end 2016-03-26 02:00:00 (Sat)
  25200,
  0,
  '+07',
      ],
      [
  63594615600, #    utc_start 2016-03-25 19:00:00 (Fri)
  63610329600, #      utc_end 2016-09-23 16:00:00 (Fri)
  63594644400, #  local_start 2016-03-26 03:00:00 (Sat)
  63610358400, #    local_end 2016-09-24 00:00:00 (Sat)
  28800,
  1,
  '+08',
      ],
      [
  63610329600, #    utc_start 2016-09-23 16:00:00 (Fri)
  DateTime::TimeZone::INFINITY, #      utc_end
  63610354800, #  local_start 2016-09-23 23:00:00 (Fri)
  DateTime::TimeZone::INFINITY, #    local_end
  25200,
  0,
  '+07',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {24}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_HOVD

    $main::fatpacked{"DateTime/TimeZone/Asia/Irkutsk.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_IRKUTSK';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Irkutsk;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Irkutsk::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59295517375, #      utc_end 1879-12-31 17:02:55 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59295542400, #    local_end 1880-01-01 00:00:00 (Thu)
  25025,
  0,
  'LMT',
      ],
      [
  59295517375, #    utc_start 1879-12-31 17:02:55 (Wed)
  60559808575, #      utc_end 1920-01-24 17:02:55 (Sat)
  59295542400, #  local_start 1880-01-01 00:00:00 (Thu)
  60559833600, #    local_end 1920-01-25 00:00:00 (Sun)
  25025,
  0,
  'IMT',
      ],
      [
  60559808575, #    utc_start 1920-01-24 17:02:55 (Sat)
  60888128400, #      utc_end 1930-06-20 17:00:00 (Fri)
  60559833775, #  local_start 1920-01-25 00:02:55 (Sun)
  60888153600, #    local_end 1930-06-21 00:00:00 (Sat)
  25200,
  0,
  '+07',
      ],
      [
  60888128400, #    utc_start 1930-06-20 17:00:00 (Fri)
  62490585600, #      utc_end 1981-03-31 16:00:00 (Tue)
  60888157200, #  local_start 1930-06-21 01:00:00 (Sat)
  62490614400, #    local_end 1981-04-01 00:00:00 (Wed)
  28800,
  0,
  '+08',
      ],
      [
  62490585600, #    utc_start 1981-03-31 16:00:00 (Tue)
  62506393200, #      utc_end 1981-09-30 15:00:00 (Wed)
  62490618000, #  local_start 1981-04-01 01:00:00 (Wed)
  62506425600, #    local_end 1981-10-01 00:00:00 (Thu)
  32400,
  1,
  '+09',
      ],
      [
  62506393200, #    utc_start 1981-09-30 15:00:00 (Wed)
  62522121600, #      utc_end 1982-03-31 16:00:00 (Wed)
  62506422000, #  local_start 1981-09-30 23:00:00 (Wed)
  62522150400, #    local_end 1982-04-01 00:00:00 (Thu)
  28800,
  0,
  '+08',
      ],
      [
  62522121600, #    utc_start 1982-03-31 16:00:00 (Wed)
  62537929200, #      utc_end 1982-09-30 15:00:00 (Thu)
  62522154000, #  local_start 1982-04-01 01:00:00 (Thu)
  62537961600, #    local_end 1982-10-01 00:00:00 (Fri)
  32400,
  1,
  '+09',
      ],
      [
  62537929200, #    utc_start 1982-09-30 15:00:00 (Thu)
  62553657600, #      utc_end 1983-03-31 16:00:00 (Thu)
  62537958000, #  local_start 1982-09-30 23:00:00 (Thu)
  62553686400, #    local_end 1983-04-01 00:00:00 (Fri)
  28800,
  0,
  '+08',
      ],
      [
  62553657600, #    utc_start 1983-03-31 16:00:00 (Thu)
  62569465200, #      utc_end 1983-09-30 15:00:00 (Fri)
  62553690000, #  local_start 1983-04-01 01:00:00 (Fri)
  62569497600, #    local_end 1983-10-01 00:00:00 (Sat)
  32400,
  1,
  '+09',
      ],
      [
  62569465200, #    utc_start 1983-09-30 15:00:00 (Fri)
  62585280000, #      utc_end 1984-03-31 16:00:00 (Sat)
  62569494000, #  local_start 1983-09-30 23:00:00 (Fri)
  62585308800, #    local_end 1984-04-01 00:00:00 (Sun)
  28800,
  0,
  '+08',
      ],
      [
  62585280000, #    utc_start 1984-03-31 16:00:00 (Sat)
  62601012000, #      utc_end 1984-09-29 18:00:00 (Sat)
  62585312400, #  local_start 1984-04-01 01:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  32400,
  1,
  '+09',
      ],
      [
  62601012000, #    utc_start 1984-09-29 18:00:00 (Sat)
  62616736800, #      utc_end 1985-03-30 18:00:00 (Sat)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  28800,
  0,
  '+08',
      ],
      [
  62616736800, #    utc_start 1985-03-30 18:00:00 (Sat)
  62632461600, #      utc_end 1985-09-28 18:00:00 (Sat)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  32400,
  1,
  '+09',
      ],
      [
  62632461600, #    utc_start 1985-09-28 18:00:00 (Sat)
  62648186400, #      utc_end 1986-03-29 18:00:00 (Sat)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  28800,
  0,
  '+08',
      ],
      [
  62648186400, #    utc_start 1986-03-29 18:00:00 (Sat)
  62663911200, #      utc_end 1986-09-27 18:00:00 (Sat)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  32400,
  1,
  '+09',
      ],
      [
  62663911200, #    utc_start 1986-09-27 18:00:00 (Sat)
  62679636000, #      utc_end 1987-03-28 18:00:00 (Sat)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  28800,
  0,
  '+08',
      ],
      [
  62679636000, #    utc_start 1987-03-28 18:00:00 (Sat)
  62695360800, #      utc_end 1987-09-26 18:00:00 (Sat)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  32400,
  1,
  '+09',
      ],
      [
  62695360800, #    utc_start 1987-09-26 18:00:00 (Sat)
  62711085600, #      utc_end 1988-03-26 18:00:00 (Sat)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  28800,
  0,
  '+08',
      ],
      [
  62711085600, #    utc_start 1988-03-26 18:00:00 (Sat)
  62726810400, #      utc_end 1988-09-24 18:00:00 (Sat)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  32400,
  1,
  '+09',
      ],
      [
  62726810400, #    utc_start 1988-09-24 18:00:00 (Sat)
  62742535200, #      utc_end 1989-03-25 18:00:00 (Sat)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  28800,
  0,
  '+08',
      ],
      [
  62742535200, #    utc_start 1989-03-25 18:00:00 (Sat)
  62758260000, #      utc_end 1989-09-23 18:00:00 (Sat)
  62742567600, #  local_start 1989-03-26 03:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  32400,
  1,
  '+09',
      ],
      [
  62758260000, #    utc_start 1989-09-23 18:00:00 (Sat)
  62773984800, #      utc_end 1990-03-24 18:00:00 (Sat)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  28800,
  0,
  '+08',
      ],
      [
  62773984800, #    utc_start 1990-03-24 18:00:00 (Sat)
  62790314400, #      utc_end 1990-09-29 18:00:00 (Sat)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  32400,
  1,
  '+09',
      ],
      [
  62790314400, #    utc_start 1990-09-29 18:00:00 (Sat)
  62806039200, #      utc_end 1991-03-30 18:00:00 (Sat)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  28800,
  0,
  '+08',
      ],
      [
  62806039200, #    utc_start 1991-03-30 18:00:00 (Sat)
  62821767600, #      utc_end 1991-09-28 19:00:00 (Sat)
  62806068000, #  local_start 1991-03-31 02:00:00 (Sun)
  62821796400, #    local_end 1991-09-29 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62821767600, #    utc_start 1991-09-28 19:00:00 (Sat)
  62831444400, #      utc_end 1992-01-18 19:00:00 (Sat)
  62821792800, #  local_start 1991-09-29 02:00:00 (Sun)
  62831469600, #    local_end 1992-01-19 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62831444400, #    utc_start 1992-01-18 19:00:00 (Sat)
  62837488800, #      utc_end 1992-03-28 18:00:00 (Sat)
  62831473200, #  local_start 1992-01-19 03:00:00 (Sun)
  62837517600, #    local_end 1992-03-29 02:00:00 (Sun)
  28800,
  0,
  '+08',
      ],
      [
  62837488800, #    utc_start 1992-03-28 18:00:00 (Sat)
  62853213600, #      utc_end 1992-09-26 18:00:00 (Sat)
  62837521200, #  local_start 1992-03-29 03:00:00 (Sun)
  62853246000, #    local_end 1992-09-27 03:00:00 (Sun)
  32400,
  1,
  '+09',
      ],
      [
  62853213600, #    utc_start 1992-09-26 18:00:00 (Sat)
  62868938400, #      utc_end 1993-03-27 18:00:00 (Sat)
  62853242400, #  local_start 1992-09-27 02:00:00 (Sun)
  62868967200, #    local_end 1993-03-28 02:00:00 (Sun)
  28800,
  0,
  '+08',
      ],
      [
  62868938400, #    utc_start 1993-03-27 18:00:00 (Sat)
  62884663200, #      utc_end 1993-09-25 18:00:00 (Sat)
  62868970800, #  local_start 1993-03-28 03:00:00 (Sun)
  62884695600, #    local_end 1993-09-26 03:00:00 (Sun)
  32400,
  1,
  '+09',
      ],
      [
  62884663200, #    utc_start 1993-09-25 18:00:00 (Sat)
  62900388000, #      utc_end 1994-03-26 18:00:00 (Sat)
  62884692000, #  local_start 1993-09-26 02:00:00 (Sun)
  62900416800, #    local_end 1994-03-27 02:00:00 (Sun)
  28800,
  0,
  '+08',
      ],
      [
  62900388000, #    utc_start 1994-03-26 18:00:00 (Sat)
  62916112800, #      utc_end 1994-09-24 18:00:00 (Sat)
  62900420400, #  local_start 1994-03-27 03:00:00 (Sun)
  62916145200, #    local_end 1994-09-25 03:00:00 (Sun)
  32400,
  1,
  '+09',
      ],
      [
  62916112800, #    utc_start 1994-09-24 18:00:00 (Sat)
  62931837600, #      utc_end 1995-03-25 18:00:00 (Sat)
  62916141600, #  local_start 1994-09-25 02:00:00 (Sun)
  62931866400, #    local_end 1995-03-26 02:00:00 (Sun)
  28800,
  0,
  '+08',
      ],
      [
  62931837600, #    utc_start 1995-03-25 18:00:00 (Sat)
  62947562400, #      utc_end 1995-09-23 18:00:00 (Sat)
  62931870000, #  local_start 1995-03-26 03:00:00 (Sun)
  62947594800, #    local_end 1995-09-24 03:00:00 (Sun)
  32400,
  1,
  '+09',
      ],
      [
  62947562400, #    utc_start 1995-09-23 18:00:00 (Sat)
  62963892000, #      utc_end 1996-03-30 18:00:00 (Sat)
  62947591200, #  local_start 1995-09-24 02:00:00 (Sun)
  62963920800, #    local_end 1996-03-31 02:00:00 (Sun)
  28800,
  0,
  '+08',
      ],
      [
  62963892000, #    utc_start 1996-03-30 18:00:00 (Sat)
  62982036000, #      utc_end 1996-10-26 18:00:00 (Sat)
  62963924400, #  local_start 1996-03-31 03:00:00 (Sun)
  62982068400, #    local_end 1996-10-27 03:00:00 (Sun)
  32400,
  1,
  '+09',
      ],
      [
  62982036000, #    utc_start 1996-10-26 18:00:00 (Sat)
  62995341600, #      utc_end 1997-03-29 18:00:00 (Sat)
  62982064800, #  local_start 1996-10-27 02:00:00 (Sun)
  62995370400, #    local_end 1997-03-30 02:00:00 (Sun)
  28800,
  0,
  '+08',
      ],
      [
  62995341600, #    utc_start 1997-03-29 18:00:00 (Sat)
  63013485600, #      utc_end 1997-10-25 18:00:00 (Sat)
  62995374000, #  local_start 1997-03-30 03:00:00 (Sun)
  63013518000, #    local_end 1997-10-26 03:00:00 (Sun)
  32400,
  1,
  '+09',
      ],
      [
  63013485600, #    utc_start 1997-10-25 18:00:00 (Sat)
  63026791200, #      utc_end 1998-03-28 18:00:00 (Sat)
  63013514400, #  local_start 1997-10-26 02:00:00 (Sun)
  63026820000, #    local_end 1998-03-29 02:00:00 (Sun)
  28800,
  0,
  '+08',
      ],
      [
  63026791200, #    utc_start 1998-03-28 18:00:00 (Sat)
  63044935200, #      utc_end 1998-10-24 18:00:00 (Sat)
  63026823600, #  local_start 1998-03-29 03:00:00 (Sun)
  63044967600, #    local_end 1998-10-25 03:00:00 (Sun)
  32400,
  1,
  '+09',
      ],
      [
  63044935200, #    utc_start 1998-10-24 18:00:00 (Sat)
  63058240800, #      utc_end 1999-03-27 18:00:00 (Sat)
  63044964000, #  local_start 1998-10-25 02:00:00 (Sun)
  63058269600, #    local_end 1999-03-28 02:00:00 (Sun)
  28800,
  0,
  '+08',
      ],
      [
  63058240800, #    utc_start 1999-03-27 18:00:00 (Sat)
  63076989600, #      utc_end 1999-10-30 18:00:00 (Sat)
  63058273200, #  local_start 1999-03-28 03:00:00 (Sun)
  63077022000, #    local_end 1999-10-31 03:00:00 (Sun)
  32400,
  1,
  '+09',
      ],
      [
  63076989600, #    utc_start 1999-10-30 18:00:00 (Sat)
  63089690400, #      utc_end 2000-03-25 18:00:00 (Sat)
  63077018400, #  local_start 1999-10-31 02:00:00 (Sun)
  63089719200, #    local_end 2000-03-26 02:00:00 (Sun)
  28800,
  0,
  '+08',
      ],
      [
  63089690400, #    utc_start 2000-03-25 18:00:00 (Sat)
  63108439200, #      utc_end 2000-10-28 18:00:00 (Sat)
  63089722800, #  local_start 2000-03-26 03:00:00 (Sun)
  63108471600, #    local_end 2000-10-29 03:00:00 (Sun)
  32400,
  1,
  '+09',
      ],
      [
  63108439200, #    utc_start 2000-10-28 18:00:00 (Sat)
  63121140000, #      utc_end 2001-03-24 18:00:00 (Sat)
  63108468000, #  local_start 2000-10-29 02:00:00 (Sun)
  63121168800, #    local_end 2001-03-25 02:00:00 (Sun)
  28800,
  0,
  '+08',
      ],
      [
  63121140000, #    utc_start 2001-03-24 18:00:00 (Sat)
  63139888800, #      utc_end 2001-10-27 18:00:00 (Sat)
  63121172400, #  local_start 2001-03-25 03:00:00 (Sun)
  63139921200, #    local_end 2001-10-28 03:00:00 (Sun)
  32400,
  1,
  '+09',
      ],
      [
  63139888800, #    utc_start 2001-10-27 18:00:00 (Sat)
  63153194400, #      utc_end 2002-03-30 18:00:00 (Sat)
  63139917600, #  local_start 2001-10-28 02:00:00 (Sun)
  63153223200, #    local_end 2002-03-31 02:00:00 (Sun)
  28800,
  0,
  '+08',
      ],
      [
  63153194400, #    utc_start 2002-03-30 18:00:00 (Sat)
  63171338400, #      utc_end 2002-10-26 18:00:00 (Sat)
  63153226800, #  local_start 2002-03-31 03:00:00 (Sun)
  63171370800, #    local_end 2002-10-27 03:00:00 (Sun)
  32400,
  1,
  '+09',
      ],
      [
  63171338400, #    utc_start 2002-10-26 18:00:00 (Sat)
  63184644000, #      utc_end 2003-03-29 18:00:00 (Sat)
  63171367200, #  local_start 2002-10-27 02:00:00 (Sun)
  63184672800, #    local_end 2003-03-30 02:00:00 (Sun)
  28800,
  0,
  '+08',
      ],
      [
  63184644000, #    utc_start 2003-03-29 18:00:00 (Sat)
  63202788000, #      utc_end 2003-10-25 18:00:00 (Sat)
  63184676400, #  local_start 2003-03-30 03:00:00 (Sun)
  63202820400, #    local_end 2003-10-26 03:00:00 (Sun)
  32400,
  1,
  '+09',
      ],
      [
  63202788000, #    utc_start 2003-10-25 18:00:00 (Sat)
  63216093600, #      utc_end 2004-03-27 18:00:00 (Sat)
  63202816800, #  local_start 2003-10-26 02:00:00 (Sun)
  63216122400, #    local_end 2004-03-28 02:00:00 (Sun)
  28800,
  0,
  '+08',
      ],
      [
  63216093600, #    utc_start 2004-03-27 18:00:00 (Sat)
  63234842400, #      utc_end 2004-10-30 18:00:00 (Sat)
  63216126000, #  local_start 2004-03-28 03:00:00 (Sun)
  63234874800, #    local_end 2004-10-31 03:00:00 (Sun)
  32400,
  1,
  '+09',
      ],
      [
  63234842400, #    utc_start 2004-10-30 18:00:00 (Sat)
  63247543200, #      utc_end 2005-03-26 18:00:00 (Sat)
  63234871200, #  local_start 2004-10-31 02:00:00 (Sun)
  63247572000, #    local_end 2005-03-27 02:00:00 (Sun)
  28800,
  0,
  '+08',
      ],
      [
  63247543200, #    utc_start 2005-03-26 18:00:00 (Sat)
  63266292000, #      utc_end 2005-10-29 18:00:00 (Sat)
  63247575600, #  local_start 2005-03-27 03:00:00 (Sun)
  63266324400, #    local_end 2005-10-30 03:00:00 (Sun)
  32400,
  1,
  '+09',
      ],
      [
  63266292000, #    utc_start 2005-10-29 18:00:00 (Sat)
  63278992800, #      utc_end 2006-03-25 18:00:00 (Sat)
  63266320800, #  local_start 2005-10-30 02:00:00 (Sun)
  63279021600, #    local_end 2006-03-26 02:00:00 (Sun)
  28800,
  0,
  '+08',
      ],
      [
  63278992800, #    utc_start 2006-03-25 18:00:00 (Sat)
  63297741600, #      utc_end 2006-10-28 18:00:00 (Sat)
  63279025200, #  local_start 2006-03-26 03:00:00 (Sun)
  63297774000, #    local_end 2006-10-29 03:00:00 (Sun)
  32400,
  1,
  '+09',
      ],
      [
  63297741600, #    utc_start 2006-10-28 18:00:00 (Sat)
  63310442400, #      utc_end 2007-03-24 18:00:00 (Sat)
  63297770400, #  local_start 2006-10-29 02:00:00 (Sun)
  63310471200, #    local_end 2007-03-25 02:00:00 (Sun)
  28800,
  0,
  '+08',
      ],
      [
  63310442400, #    utc_start 2007-03-24 18:00:00 (Sat)
  63329191200, #      utc_end 2007-10-27 18:00:00 (Sat)
  63310474800, #  local_start 2007-03-25 03:00:00 (Sun)
  63329223600, #    local_end 2007-10-28 03:00:00 (Sun)
  32400,
  1,
  '+09',
      ],
      [
  63329191200, #    utc_start 2007-10-27 18:00:00 (Sat)
  63342496800, #      utc_end 2008-03-29 18:00:00 (Sat)
  63329220000, #  local_start 2007-10-28 02:00:00 (Sun)
  63342525600, #    local_end 2008-03-30 02:00:00 (Sun)
  28800,
  0,
  '+08',
      ],
      [
  63342496800, #    utc_start 2008-03-29 18:00:00 (Sat)
  63360640800, #      utc_end 2008-10-25 18:00:00 (Sat)
  63342529200, #  local_start 2008-03-30 03:00:00 (Sun)
  63360673200, #    local_end 2008-10-26 03:00:00 (Sun)
  32400,
  1,
  '+09',
      ],
      [
  63360640800, #    utc_start 2008-10-25 18:00:00 (Sat)
  63373946400, #      utc_end 2009-03-28 18:00:00 (Sat)
  63360669600, #  local_start 2008-10-26 02:00:00 (Sun)
  63373975200, #    local_end 2009-03-29 02:00:00 (Sun)
  28800,
  0,
  '+08',
      ],
      [
  63373946400, #    utc_start 2009-03-28 18:00:00 (Sat)
  63392090400, #      utc_end 2009-10-24 18:00:00 (Sat)
  63373978800, #  local_start 2009-03-29 03:00:00 (Sun)
  63392122800, #    local_end 2009-10-25 03:00:00 (Sun)
  32400,
  1,
  '+09',
      ],
      [
  63392090400, #    utc_start 2009-10-24 18:00:00 (Sat)
  63405396000, #      utc_end 2010-03-27 18:00:00 (Sat)
  63392119200, #  local_start 2009-10-25 02:00:00 (Sun)
  63405424800, #    local_end 2010-03-28 02:00:00 (Sun)
  28800,
  0,
  '+08',
      ],
      [
  63405396000, #    utc_start 2010-03-27 18:00:00 (Sat)
  63424144800, #      utc_end 2010-10-30 18:00:00 (Sat)
  63405428400, #  local_start 2010-03-28 03:00:00 (Sun)
  63424177200, #    local_end 2010-10-31 03:00:00 (Sun)
  32400,
  1,
  '+09',
      ],
      [
  63424144800, #    utc_start 2010-10-30 18:00:00 (Sat)
  63436845600, #      utc_end 2011-03-26 18:00:00 (Sat)
  63424173600, #  local_start 2010-10-31 02:00:00 (Sun)
  63436874400, #    local_end 2011-03-27 02:00:00 (Sun)
  28800,
  0,
  '+08',
      ],
      [
  63436845600, #    utc_start 2011-03-26 18:00:00 (Sat)
  63549939600, #      utc_end 2014-10-25 17:00:00 (Sat)
  63436878000, #  local_start 2011-03-27 03:00:00 (Sun)
  63549972000, #    local_end 2014-10-26 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  63549939600, #    utc_start 2014-10-25 17:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  63549968400, #  local_start 2014-10-26 01:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  28800,
  0,
  '+08',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {30}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_IRKUTSK

    $main::fatpacked{"DateTime/TimeZone/Asia/Jakarta.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_JAKARTA';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/asia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Jakarta;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Jakarta::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  58904383968, #      utc_end 1867-08-09 16:52:48 (Fri)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  58904409600, #    local_end 1867-08-10 00:00:00 (Sat)
  25632,
  0,
  'LMT',
      ],
      [
  58904383968, #    utc_start 1867-08-09 16:52:48 (Fri)
  60683964000, #      utc_end 1923-12-31 16:40:00 (Mon)
  58904409600, #  local_start 1867-08-10 00:00:00 (Sat)
  60683989632, #    local_end 1923-12-31 23:47:12 (Mon)
  25632,
  0,
  'BMT',
      ],
      [
  60683964000, #    utc_start 1923-12-31 16:40:00 (Mon)
  60962776800, #      utc_end 1932-10-31 16:40:00 (Mon)
  60683990400, #  local_start 1924-01-01 00:00:00 (Tue)
  60962803200, #    local_end 1932-11-01 00:00:00 (Tue)
  26400,
  0,
  '+0720',
      ],
      [
  60962776800, #    utc_start 1932-10-31 16:40:00 (Mon)
  61259041800, #      utc_end 1942-03-22 16:30:00 (Sun)
  60962803800, #  local_start 1932-11-01 00:10:00 (Tue)
  61259068800, #    local_end 1942-03-23 00:00:00 (Mon)
  27000,
  0,
  '+0730',
      ],
      [
  61259041800, #    utc_start 1942-03-22 16:30:00 (Sun)
  61369628400, #      utc_end 1945-09-22 15:00:00 (Sat)
  61259074200, #  local_start 1942-03-23 01:30:00 (Mon)
  61369660800, #    local_end 1945-09-23 00:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  61369628400, #    utc_start 1945-09-22 15:00:00 (Sat)
  61451800200, #      utc_end 1948-04-30 16:30:00 (Fri)
  61369655400, #  local_start 1945-09-22 22:30:00 (Sat)
  61451827200, #    local_end 1948-05-01 00:00:00 (Sat)
  27000,
  0,
  '+0730',
      ],
      [
  61451800200, #    utc_start 1948-04-30 16:30:00 (Fri)
  61514870400, #      utc_end 1950-04-30 16:00:00 (Sun)
  61451829000, #  local_start 1948-05-01 00:30:00 (Sat)
  61514899200, #    local_end 1950-05-01 00:00:00 (Mon)
  28800,
  0,
  '+08',
      ],
      [
  61514870400, #    utc_start 1950-04-30 16:00:00 (Sun)
  61946267400, #      utc_end 1963-12-31 16:30:00 (Tue)
  61514897400, #  local_start 1950-04-30 23:30:00 (Sun)
  61946294400, #    local_end 1964-01-01 00:00:00 (Wed)
  27000,
  0,
  '+0730',
      ],
      [
  61946267400, #    utc_start 1963-12-31 16:30:00 (Tue)
  DateTime::TimeZone::INFINITY, #      utc_end
  61946292600, #  local_start 1963-12-31 23:30:00 (Tue)
  DateTime::TimeZone::INFINITY, #    local_end
  25200,
  0,
  'WIB',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_JAKARTA

    $main::fatpacked{"DateTime/TimeZone/Asia/Jayapura.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_JAYAPURA';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/asia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Jayapura;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Jayapura::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60962769432, #      utc_end 1932-10-31 14:37:12 (Mon)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60962803200, #    local_end 1932-11-01 00:00:00 (Tue)
  33768,
  0,
  'LMT',
      ],
      [
  60962769432, #    utc_start 1932-10-31 14:37:12 (Mon)
  61336191600, #      utc_end 1944-08-31 15:00:00 (Thu)
  60962801832, #  local_start 1932-10-31 23:37:12 (Mon)
  61336224000, #    local_end 1944-09-01 00:00:00 (Fri)
  32400,
  0,
  '+09',
      ],
      [
  61336191600, #    utc_start 1944-08-31 15:00:00 (Thu)
  61946260200, #      utc_end 1963-12-31 14:30:00 (Tue)
  61336225800, #  local_start 1944-09-01 00:30:00 (Fri)
  61946294400, #    local_end 1964-01-01 00:00:00 (Wed)
  34200,
  0,
  '+0930',
      ],
      [
  61946260200, #    utc_start 1963-12-31 14:30:00 (Tue)
  DateTime::TimeZone::INFINITY, #      utc_end
  61946292600, #  local_start 1963-12-31 23:30:00 (Tue)
  DateTime::TimeZone::INFINITY, #    local_end
  32400,
  0,
  'WIT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_JAYAPURA

    $main::fatpacked{"DateTime/TimeZone/Asia/Jerusalem.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_JERUSALEM';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/asia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Jerusalem;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Jerusalem::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59295533946, #      utc_end 1879-12-31 21:39:06 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59295542400, #    local_end 1880-01-01 00:00:00 (Thu)
  8454,
  0,
  'LMT',
      ],
      [
  59295533946, #    utc_start 1879-12-31 21:39:06 (Wed)
  60494679560, #      utc_end 1917-12-31 21:39:20 (Mon)
  59295542386, #  local_start 1879-12-31 23:59:46 (Wed)
  60494688000, #    local_end 1918-01-01 00:00:00 (Tue)
  8440,
  0,
  'JMT',
      ],
      [
  60494679560, #    utc_start 1917-12-31 21:39:20 (Mon)
  61202037600, #      utc_end 1940-05-31 22:00:00 (Fri)
  60494686760, #  local_start 1917-12-31 23:39:20 (Mon)
  61202044800, #    local_end 1940-06-01 00:00:00 (Sat)
  7200,
  0,
  'IST',
      ],
      [
  61202037600, #    utc_start 1940-05-31 22:00:00 (Fri)
  61278325200, #      utc_end 1942-10-31 21:00:00 (Sat)
  61202048400, #  local_start 1940-06-01 01:00:00 (Sat)
  61278336000, #    local_end 1942-11-01 00:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  61278325200, #    utc_start 1942-10-31 21:00:00 (Sat)
  61291382400, #      utc_end 1943-04-01 00:00:00 (Thu)
  61278332400, #  local_start 1942-10-31 23:00:00 (Sat)
  61291389600, #    local_end 1943-04-01 02:00:00 (Thu)
  7200,
  0,
  'IST',
      ],
      [
  61291382400, #    utc_start 1943-04-01 00:00:00 (Thu)
  61309861200, #      utc_end 1943-10-31 21:00:00 (Sun)
  61291393200, #  local_start 1943-04-01 03:00:00 (Thu)
  61309872000, #    local_end 1943-11-01 00:00:00 (Mon)
  10800,
  1,
  'IDT',
      ],
      [
  61309861200, #    utc_start 1943-10-31 21:00:00 (Sun)
  61322997600, #      utc_end 1944-03-31 22:00:00 (Fri)
  61309868400, #  local_start 1943-10-31 23:00:00 (Sun)
  61323004800, #    local_end 1944-04-01 00:00:00 (Sat)
  7200,
  0,
  'IST',
      ],
      [
  61322997600, #    utc_start 1944-03-31 22:00:00 (Fri)
  61341483600, #      utc_end 1944-10-31 21:00:00 (Tue)
  61323008400, #  local_start 1944-04-01 01:00:00 (Sat)
  61341494400, #    local_end 1944-11-01 00:00:00 (Wed)
  10800,
  1,
  'IDT',
      ],
      [
  61341483600, #    utc_start 1944-10-31 21:00:00 (Tue)
  61355829600, #      utc_end 1945-04-15 22:00:00 (Sun)
  61341490800, #  local_start 1944-10-31 23:00:00 (Tue)
  61355836800, #    local_end 1945-04-16 00:00:00 (Mon)
  7200,
  0,
  'IST',
      ],
      [
  61355829600, #    utc_start 1945-04-15 22:00:00 (Sun)
  61373026800, #      utc_end 1945-10-31 23:00:00 (Wed)
  61355840400, #  local_start 1945-04-16 01:00:00 (Mon)
  61373037600, #    local_end 1945-11-01 02:00:00 (Thu)
  10800,
  1,
  'IDT',
      ],
      [
  61373026800, #    utc_start 1945-10-31 23:00:00 (Wed)
  61387372800, #      utc_end 1946-04-16 00:00:00 (Tue)
  61373034000, #  local_start 1945-11-01 01:00:00 (Thu)
  61387380000, #    local_end 1946-04-16 02:00:00 (Tue)
  7200,
  0,
  'IST',
      ],
      [
  61387372800, #    utc_start 1946-04-16 00:00:00 (Tue)
  61404555600, #      utc_end 1946-10-31 21:00:00 (Thu)
  61387383600, #  local_start 1946-04-16 03:00:00 (Tue)
  61404566400, #    local_end 1946-11-01 00:00:00 (Fri)
  10800,
  1,
  'IDT',
      ],
      [
  61404555600, #    utc_start 1946-10-31 21:00:00 (Thu)
  61453720800, #      utc_end 1948-05-22 22:00:00 (Sat)
  61404562800, #  local_start 1946-10-31 23:00:00 (Thu)
  61453728000, #    local_end 1948-05-23 00:00:00 (Sun)
  7200,
  0,
  'IST',
      ],
      [
  61453720800, #    utc_start 1948-05-22 22:00:00 (Sat)
  61462440000, #      utc_end 1948-08-31 20:00:00 (Tue)
  61453735200, #  local_start 1948-05-23 02:00:00 (Sun)
  61462454400, #    local_end 1948-09-01 00:00:00 (Wed)
  14400,
  1,
  'IDDT',
      ],
      [
  61462440000, #    utc_start 1948-08-31 20:00:00 (Tue)
  61467721200, #      utc_end 1948-10-31 23:00:00 (Sun)
  61462450800, #  local_start 1948-08-31 23:00:00 (Tue)
  61467732000, #    local_end 1948-11-01 02:00:00 (Mon)
  10800,
  1,
  'IDT',
      ],
      [
  61467721200, #    utc_start 1948-10-31 23:00:00 (Sun)
  61483356000, #      utc_end 1949-04-30 22:00:00 (Sat)
  61467728400, #  local_start 1948-11-01 01:00:00 (Mon)
  61483363200, #    local_end 1949-05-01 00:00:00 (Sun)
  7200,
  0,
  'IST',
      ],
      [
  61483356000, #    utc_start 1949-04-30 22:00:00 (Sat)
  61499257200, #      utc_end 1949-10-31 23:00:00 (Mon)
  61483366800, #  local_start 1949-05-01 01:00:00 (Sun)
  61499268000, #    local_end 1949-11-01 02:00:00 (Tue)
  10800,
  1,
  'IDT',
      ],
      [
  61499257200, #    utc_start 1949-10-31 23:00:00 (Mon)
  61513596000, #      utc_end 1950-04-15 22:00:00 (Sat)
  61499264400, #  local_start 1949-11-01 01:00:00 (Tue)
  61513603200, #    local_end 1950-04-16 00:00:00 (Sun)
  7200,
  0,
  'IST',
      ],
      [
  61513596000, #    utc_start 1950-04-15 22:00:00 (Sat)
  61526736000, #      utc_end 1950-09-15 00:00:00 (Fri)
  61513606800, #  local_start 1950-04-16 01:00:00 (Sun)
  61526746800, #    local_end 1950-09-15 03:00:00 (Fri)
  10800,
  1,
  'IDT',
      ],
      [
  61526736000, #    utc_start 1950-09-15 00:00:00 (Fri)
  61543836000, #      utc_end 1951-03-31 22:00:00 (Sat)
  61526743200, #  local_start 1950-09-15 02:00:00 (Fri)
  61543843200, #    local_end 1951-04-01 00:00:00 (Sun)
  7200,
  0,
  'IST',
      ],
      [
  61543836000, #    utc_start 1951-03-31 22:00:00 (Sat)
  61563196800, #      utc_end 1951-11-11 00:00:00 (Sun)
  61543846800, #  local_start 1951-04-01 01:00:00 (Sun)
  61563207600, #    local_end 1951-11-11 03:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  61563196800, #    utc_start 1951-11-11 00:00:00 (Sun)
  61577107200, #      utc_end 1952-04-20 00:00:00 (Sun)
  61563204000, #  local_start 1951-11-11 02:00:00 (Sun)
  61577114400, #    local_end 1952-04-20 02:00:00 (Sun)
  7200,
  0,
  'IST',
      ],
      [
  61577107200, #    utc_start 1952-04-20 00:00:00 (Sun)
  61592832000, #      utc_end 1952-10-19 00:00:00 (Sun)
  61577118000, #  local_start 1952-04-20 03:00:00 (Sun)
  61592842800, #    local_end 1952-10-19 03:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  61592832000, #    utc_start 1952-10-19 00:00:00 (Sun)
  61607952000, #      utc_end 1953-04-12 00:00:00 (Sun)
  61592839200, #  local_start 1952-10-19 02:00:00 (Sun)
  61607959200, #    local_end 1953-04-12 02:00:00 (Sun)
  7200,
  0,
  'IST',
      ],
      [
  61607952000, #    utc_start 1953-04-12 00:00:00 (Sun)
  61621257600, #      utc_end 1953-09-13 00:00:00 (Sun)
  61607962800, #  local_start 1953-04-12 03:00:00 (Sun)
  61621268400, #    local_end 1953-09-13 03:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  61621257600, #    utc_start 1953-09-13 00:00:00 (Sun)
  61644837600, #      utc_end 1954-06-12 22:00:00 (Sat)
  61621264800, #  local_start 1953-09-13 02:00:00 (Sun)
  61644844800, #    local_end 1954-06-13 00:00:00 (Sun)
  7200,
  0,
  'IST',
      ],
      [
  61644837600, #    utc_start 1954-06-12 22:00:00 (Sat)
  61652696400, #      utc_end 1954-09-11 21:00:00 (Sat)
  61644848400, #  local_start 1954-06-13 01:00:00 (Sun)
  61652707200, #    local_end 1954-09-12 00:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  61652696400, #    utc_start 1954-09-11 21:00:00 (Sat)
  61676208000, #      utc_end 1955-06-11 00:00:00 (Sat)
  61652703600, #  local_start 1954-09-11 23:00:00 (Sat)
  61676215200, #    local_end 1955-06-11 02:00:00 (Sat)
  7200,
  0,
  'IST',
      ],
      [
  61676208000, #    utc_start 1955-06-11 00:00:00 (Sat)
  61684146000, #      utc_end 1955-09-10 21:00:00 (Sat)
  61676218800, #  local_start 1955-06-11 03:00:00 (Sat)
  61684156800, #    local_end 1955-09-11 00:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  61684146000, #    utc_start 1955-09-10 21:00:00 (Sat)
  61707132000, #      utc_end 1956-06-02 22:00:00 (Sat)
  61684153200, #  local_start 1955-09-10 23:00:00 (Sat)
  61707139200, #    local_end 1956-06-03 00:00:00 (Sun)
  7200,
  0,
  'IST',
      ],
      [
  61707132000, #    utc_start 1956-06-02 22:00:00 (Sat)
  61717420800, #      utc_end 1956-09-30 00:00:00 (Sun)
  61707142800, #  local_start 1956-06-03 01:00:00 (Sun)
  61717431600, #    local_end 1956-09-30 03:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  61717420800, #    utc_start 1956-09-30 00:00:00 (Sun)
  61735651200, #      utc_end 1957-04-29 00:00:00 (Mon)
  61717428000, #  local_start 1956-09-30 02:00:00 (Sun)
  61735658400, #    local_end 1957-04-29 02:00:00 (Mon)
  7200,
  0,
  'IST',
      ],
      [
  61735651200, #    utc_start 1957-04-29 00:00:00 (Mon)
  61748254800, #      utc_end 1957-09-21 21:00:00 (Sat)
  61735662000, #  local_start 1957-04-29 03:00:00 (Mon)
  61748265600, #    local_end 1957-09-22 00:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  61748254800, #    utc_start 1957-09-21 21:00:00 (Sat)
  62278063200, #      utc_end 1974-07-06 22:00:00 (Sat)
  61748262000, #  local_start 1957-09-21 23:00:00 (Sat)
  62278070400, #    local_end 1974-07-07 00:00:00 (Sun)
  7200,
  0,
  'IST',
      ],
      [
  62278063200, #    utc_start 1974-07-06 22:00:00 (Sat)
  62286526800, #      utc_end 1974-10-12 21:00:00 (Sat)
  62278074000, #  local_start 1974-07-07 01:00:00 (Sun)
  62286537600, #    local_end 1974-10-13 00:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  62286526800, #    utc_start 1974-10-12 21:00:00 (Sat)
  62302860000, #      utc_end 1975-04-19 22:00:00 (Sat)
  62286534000, #  local_start 1974-10-12 23:00:00 (Sat)
  62302867200, #    local_end 1975-04-20 00:00:00 (Sun)
  7200,
  0,
  'IST',
      ],
      [
  62302860000, #    utc_start 1975-04-19 22:00:00 (Sat)
  62314347600, #      utc_end 1975-08-30 21:00:00 (Sat)
  62302870800, #  local_start 1975-04-20 01:00:00 (Sun)
  62314358400, #    local_end 1975-08-31 00:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  62314347600, #    utc_start 1975-08-30 21:00:00 (Sat)
  62469698400, #      utc_end 1980-08-01 22:00:00 (Fri)
  62314354800, #  local_start 1975-08-30 23:00:00 (Sat)
  62469705600, #    local_end 1980-08-02 00:00:00 (Sat)
  7200,
  0,
  'IST',
      ],
      [
  62469698400, #    utc_start 1980-08-01 22:00:00 (Fri)
  62473327200, #      utc_end 1980-09-12 22:00:00 (Fri)
  62469709200, #  local_start 1980-08-02 01:00:00 (Sat)
  62473338000, #    local_end 1980-09-13 01:00:00 (Sat)
  10800,
  1,
  'IDT',
      ],
      [
  62473327200, #    utc_start 1980-09-12 22:00:00 (Fri)
  62588239200, #      utc_end 1984-05-04 22:00:00 (Fri)
  62473334400, #  local_start 1980-09-13 00:00:00 (Sat)
  62588246400, #    local_end 1984-05-05 00:00:00 (Sat)
  7200,
  0,
  'IST',
      ],
      [
  62588239200, #    utc_start 1984-05-04 22:00:00 (Fri)
  62597916000, #      utc_end 1984-08-24 22:00:00 (Fri)
  62588250000, #  local_start 1984-05-05 01:00:00 (Sat)
  62597926800, #    local_end 1984-08-25 01:00:00 (Sat)
  10800,
  1,
  'IDT',
      ],
      [
  62597916000, #    utc_start 1984-08-24 22:00:00 (Fri)
  62617960800, #      utc_end 1985-04-13 22:00:00 (Sat)
  62597923200, #  local_start 1984-08-25 00:00:00 (Sat)
  62617968000, #    local_end 1985-04-14 00:00:00 (Sun)
  7200,
  0,
  'IST',
      ],
      [
  62617960800, #    utc_start 1985-04-13 22:00:00 (Sat)
  62631262800, #      utc_end 1985-09-14 21:00:00 (Sat)
  62617971600, #  local_start 1985-04-14 01:00:00 (Sun)
  62631273600, #    local_end 1985-09-15 00:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  62631262800, #    utc_start 1985-09-14 21:00:00 (Sat)
  62652434400, #      utc_end 1986-05-17 22:00:00 (Sat)
  62631270000, #  local_start 1985-09-14 23:00:00 (Sat)
  62652441600, #    local_end 1986-05-18 00:00:00 (Sun)
  7200,
  0,
  'IST',
      ],
      [
  62652434400, #    utc_start 1986-05-17 22:00:00 (Sat)
  62662107600, #      utc_end 1986-09-06 21:00:00 (Sat)
  62652445200, #  local_start 1986-05-18 01:00:00 (Sun)
  62662118400, #    local_end 1986-09-07 00:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  62662107600, #    utc_start 1986-09-06 21:00:00 (Sat)
  62681119200, #      utc_end 1987-04-14 22:00:00 (Tue)
  62662114800, #  local_start 1986-09-06 23:00:00 (Sat)
  62681126400, #    local_end 1987-04-15 00:00:00 (Wed)
  7200,
  0,
  'IST',
      ],
      [
  62681119200, #    utc_start 1987-04-14 22:00:00 (Tue)
  62694162000, #      utc_end 1987-09-12 21:00:00 (Sat)
  62681130000, #  local_start 1987-04-15 01:00:00 (Wed)
  62694172800, #    local_end 1987-09-13 00:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  62694162000, #    utc_start 1987-09-12 21:00:00 (Sat)
  62712309600, #      utc_end 1988-04-09 22:00:00 (Sat)
  62694169200, #  local_start 1987-09-12 23:00:00 (Sat)
  62712316800, #    local_end 1988-04-10 00:00:00 (Sun)
  7200,
  0,
  'IST',
      ],
      [
  62712309600, #    utc_start 1988-04-09 22:00:00 (Sat)
  62725006800, #      utc_end 1988-09-03 21:00:00 (Sat)
  62712320400, #  local_start 1988-04-10 01:00:00 (Sun)
  62725017600, #    local_end 1988-09-04 00:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  62725006800, #    utc_start 1988-09-03 21:00:00 (Sat)
  62745573600, #      utc_end 1989-04-29 22:00:00 (Sat)
  62725014000, #  local_start 1988-09-03 23:00:00 (Sat)
  62745580800, #    local_end 1989-04-30 00:00:00 (Sun)
  7200,
  0,
  'IST',
      ],
      [
  62745573600, #    utc_start 1989-04-29 22:00:00 (Sat)
  62756456400, #      utc_end 1989-09-02 21:00:00 (Sat)
  62745584400, #  local_start 1989-04-30 01:00:00 (Sun)
  62756467200, #    local_end 1989-09-03 00:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  62756456400, #    utc_start 1989-09-02 21:00:00 (Sat)
  62773999200, #      utc_end 1990-03-24 22:00:00 (Sat)
  62756463600, #  local_start 1989-09-02 23:00:00 (Sat)
  62774006400, #    local_end 1990-03-25 00:00:00 (Sun)
  7200,
  0,
  'IST',
      ],
      [
  62773999200, #    utc_start 1990-03-24 22:00:00 (Sat)
  62787301200, #      utc_end 1990-08-25 21:00:00 (Sat)
  62774010000, #  local_start 1990-03-25 01:00:00 (Sun)
  62787312000, #    local_end 1990-08-26 00:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  62787301200, #    utc_start 1990-08-25 21:00:00 (Sat)
  62805448800, #      utc_end 1991-03-23 22:00:00 (Sat)
  62787308400, #  local_start 1990-08-25 23:00:00 (Sat)
  62805456000, #    local_end 1991-03-24 00:00:00 (Sun)
  7200,
  0,
  'IST',
      ],
      [
  62805448800, #    utc_start 1991-03-23 22:00:00 (Sat)
  62819355600, #      utc_end 1991-08-31 21:00:00 (Sat)
  62805459600, #  local_start 1991-03-24 01:00:00 (Sun)
  62819366400, #    local_end 1991-09-01 00:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  62819355600, #    utc_start 1991-08-31 21:00:00 (Sat)
  62837503200, #      utc_end 1992-03-28 22:00:00 (Sat)
  62819362800, #  local_start 1991-08-31 23:00:00 (Sat)
  62837510400, #    local_end 1992-03-29 00:00:00 (Sun)
  7200,
  0,
  'IST',
      ],
      [
  62837503200, #    utc_start 1992-03-28 22:00:00 (Sat)
  62851410000, #      utc_end 1992-09-05 21:00:00 (Sat)
  62837514000, #  local_start 1992-03-29 01:00:00 (Sun)
  62851420800, #    local_end 1992-09-06 00:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  62851410000, #    utc_start 1992-09-05 21:00:00 (Sat)
  62869384800, #      utc_end 1993-04-01 22:00:00 (Thu)
  62851417200, #  local_start 1992-09-05 23:00:00 (Sat)
  62869392000, #    local_end 1993-04-02 00:00:00 (Fri)
  7200,
  0,
  'IST',
      ],
      [
  62869384800, #    utc_start 1993-04-01 22:00:00 (Thu)
  62882859600, #      utc_end 1993-09-04 21:00:00 (Sat)
  62869395600, #  local_start 1993-04-02 01:00:00 (Fri)
  62882870400, #    local_end 1993-09-05 00:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  62882859600, #    utc_start 1993-09-04 21:00:00 (Sat)
  62900834400, #      utc_end 1994-03-31 22:00:00 (Thu)
  62882866800, #  local_start 1993-09-04 23:00:00 (Sat)
  62900841600, #    local_end 1994-04-01 00:00:00 (Fri)
  7200,
  0,
  'IST',
      ],
      [
  62900834400, #    utc_start 1994-03-31 22:00:00 (Thu)
  62913704400, #      utc_end 1994-08-27 21:00:00 (Sat)
  62900845200, #  local_start 1994-04-01 01:00:00 (Fri)
  62913715200, #    local_end 1994-08-28 00:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  62913704400, #    utc_start 1994-08-27 21:00:00 (Sat)
  62932284000, #      utc_end 1995-03-30 22:00:00 (Thu)
  62913711600, #  local_start 1994-08-27 23:00:00 (Sat)
  62932291200, #    local_end 1995-03-31 00:00:00 (Fri)
  7200,
  0,
  'IST',
      ],
      [
  62932284000, #    utc_start 1995-03-30 22:00:00 (Thu)
  62945758800, #      utc_end 1995-09-02 21:00:00 (Sat)
  62932294800, #  local_start 1995-03-31 01:00:00 (Fri)
  62945769600, #    local_end 1995-09-03 00:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  62945758800, #    utc_start 1995-09-02 21:00:00 (Sat)
  62962524000, #      utc_end 1996-03-14 22:00:00 (Thu)
  62945766000, #  local_start 1995-09-02 23:00:00 (Sat)
  62962531200, #    local_end 1996-03-15 00:00:00 (Fri)
  7200,
  0,
  'IST',
      ],
      [
  62962524000, #    utc_start 1996-03-14 22:00:00 (Thu)
  62978504400, #      utc_end 1996-09-15 21:00:00 (Sun)
  62962534800, #  local_start 1996-03-15 01:00:00 (Fri)
  62978515200, #    local_end 1996-09-16 00:00:00 (Mon)
  10800,
  1,
  'IDT',
      ],
      [
  62978504400, #    utc_start 1996-09-15 21:00:00 (Sun)
  62994578400, #      utc_end 1997-03-20 22:00:00 (Thu)
  62978511600, #  local_start 1996-09-15 23:00:00 (Sun)
  62994585600, #    local_end 1997-03-21 00:00:00 (Fri)
  7200,
  0,
  'IST',
      ],
      [
  62994578400, #    utc_start 1997-03-20 22:00:00 (Thu)
  63009867600, #      utc_end 1997-09-13 21:00:00 (Sat)
  62994589200, #  local_start 1997-03-21 01:00:00 (Fri)
  63009878400, #    local_end 1997-09-14 00:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  63009867600, #    utc_start 1997-09-13 21:00:00 (Sat)
  63026028000, #      utc_end 1998-03-19 22:00:00 (Thu)
  63009874800, #  local_start 1997-09-13 23:00:00 (Sat)
  63026035200, #    local_end 1998-03-20 00:00:00 (Fri)
  7200,
  0,
  'IST',
      ],
      [
  63026028000, #    utc_start 1998-03-19 22:00:00 (Thu)
  63040712400, #      utc_end 1998-09-05 21:00:00 (Sat)
  63026038800, #  local_start 1998-03-20 01:00:00 (Fri)
  63040723200, #    local_end 1998-09-06 00:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  63040712400, #    utc_start 1998-09-05 21:00:00 (Sat)
  63058694400, #      utc_end 1999-04-02 00:00:00 (Fri)
  63040719600, #  local_start 1998-09-05 23:00:00 (Sat)
  63058701600, #    local_end 1999-04-02 02:00:00 (Fri)
  7200,
  0,
  'IST',
      ],
      [
  63058694400, #    utc_start 1999-04-02 00:00:00 (Fri)
  63071996400, #      utc_end 1999-09-02 23:00:00 (Thu)
  63058705200, #  local_start 1999-04-02 03:00:00 (Fri)
  63072007200, #    local_end 1999-09-03 02:00:00 (Fri)
  10800,
  1,
  'IDT',
      ],
      [
  63071996400, #    utc_start 1999-09-02 23:00:00 (Thu)
  63091353600, #      utc_end 2000-04-14 00:00:00 (Fri)
  63072003600, #  local_start 1999-09-03 01:00:00 (Fri)
  63091360800, #    local_end 2000-04-14 02:00:00 (Fri)
  7200,
  0,
  'IST',
      ],
      [
  63091353600, #    utc_start 2000-04-14 00:00:00 (Fri)
  63106466400, #      utc_end 2000-10-05 22:00:00 (Thu)
  63091364400, #  local_start 2000-04-14 03:00:00 (Fri)
  63106477200, #    local_end 2000-10-06 01:00:00 (Fri)
  10800,
  1,
  'IDT',
      ],
      [
  63106466400, #    utc_start 2000-10-05 22:00:00 (Thu)
  63122454000, #      utc_end 2001-04-08 23:00:00 (Sun)
  63106473600, #  local_start 2000-10-06 00:00:00 (Fri)
  63122461200, #    local_end 2001-04-09 01:00:00 (Mon)
  7200,
  0,
  'IST',
      ],
      [
  63122454000, #    utc_start 2001-04-08 23:00:00 (Sun)
  63136965600, #      utc_end 2001-09-23 22:00:00 (Sun)
  63122464800, #  local_start 2001-04-09 02:00:00 (Mon)
  63136976400, #    local_end 2001-09-24 01:00:00 (Mon)
  10800,
  1,
  'IDT',
      ],
      [
  63136965600, #    utc_start 2001-09-23 22:00:00 (Sun)
  63153039600, #      utc_end 2002-03-28 23:00:00 (Thu)
  63136972800, #  local_start 2001-09-24 00:00:00 (Mon)
  63153046800, #    local_end 2002-03-29 01:00:00 (Fri)
  7200,
  0,
  'IST',
      ],
      [
  63153039600, #    utc_start 2002-03-28 23:00:00 (Thu)
  63169624800, #      utc_end 2002-10-06 22:00:00 (Sun)
  63153050400, #  local_start 2002-03-29 02:00:00 (Fri)
  63169635600, #    local_end 2002-10-07 01:00:00 (Mon)
  10800,
  1,
  'IDT',
      ],
      [
  63169624800, #    utc_start 2002-10-06 22:00:00 (Sun)
  63184489200, #      utc_end 2003-03-27 23:00:00 (Thu)
  63169632000, #  local_start 2002-10-07 00:00:00 (Mon)
  63184496400, #    local_end 2003-03-28 01:00:00 (Fri)
  7200,
  0,
  'IST',
      ],
      [
  63184489200, #    utc_start 2003-03-27 23:00:00 (Thu)
  63200815200, #      utc_end 2003-10-02 22:00:00 (Thu)
  63184500000, #  local_start 2003-03-28 02:00:00 (Fri)
  63200826000, #    local_end 2003-10-03 01:00:00 (Fri)
  10800,
  1,
  'IDT',
      ],
      [
  63200815200, #    utc_start 2003-10-02 22:00:00 (Thu)
  63216975600, #      utc_end 2004-04-06 23:00:00 (Tue)
  63200822400, #  local_start 2003-10-03 00:00:00 (Fri)
  63216982800, #    local_end 2004-04-07 01:00:00 (Wed)
  7200,
  0,
  'IST',
      ],
      [
  63216975600, #    utc_start 2004-04-06 23:00:00 (Tue)
  63231487200, #      utc_end 2004-09-21 22:00:00 (Tue)
  63216986400, #  local_start 2004-04-07 02:00:00 (Wed)
  63231498000, #    local_end 2004-09-22 01:00:00 (Wed)
  10800,
  1,
  'IDT',
      ],
      [
  63231487200, #    utc_start 2004-09-21 22:00:00 (Tue)
  63247996800, #      utc_end 2005-04-01 00:00:00 (Fri)
  63231494400, #  local_start 2004-09-22 00:00:00 (Wed)
  63248004000, #    local_end 2005-04-01 02:00:00 (Fri)
  7200,
  0,
  'IST',
      ],
      [
  63247996800, #    utc_start 2005-04-01 00:00:00 (Fri)
  63264495600, #      utc_end 2005-10-08 23:00:00 (Sat)
  63248007600, #  local_start 2005-04-01 03:00:00 (Fri)
  63264506400, #    local_end 2005-10-09 02:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  63264495600, #    utc_start 2005-10-08 23:00:00 (Sat)
  63279446400, #      utc_end 2006-03-31 00:00:00 (Fri)
  63264502800, #  local_start 2005-10-09 01:00:00 (Sun)
  63279453600, #    local_end 2006-03-31 02:00:00 (Fri)
  7200,
  0,
  'IST',
      ],
      [
  63279446400, #    utc_start 2006-03-31 00:00:00 (Fri)
  63295340400, #      utc_end 2006-09-30 23:00:00 (Sat)
  63279457200, #  local_start 2006-03-31 03:00:00 (Fri)
  63295351200, #    local_end 2006-10-01 02:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  63295340400, #    utc_start 2006-09-30 23:00:00 (Sat)
  63310896000, #      utc_end 2007-03-30 00:00:00 (Fri)
  63295347600, #  local_start 2006-10-01 01:00:00 (Sun)
  63310903200, #    local_end 2007-03-30 02:00:00 (Fri)
  7200,
  0,
  'IST',
      ],
      [
  63310896000, #    utc_start 2007-03-30 00:00:00 (Fri)
  63325580400, #      utc_end 2007-09-15 23:00:00 (Sat)
  63310906800, #  local_start 2007-03-30 03:00:00 (Fri)
  63325591200, #    local_end 2007-09-16 02:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  63325580400, #    utc_start 2007-09-15 23:00:00 (Sat)
  63342345600, #      utc_end 2008-03-28 00:00:00 (Fri)
  63325587600, #  local_start 2007-09-16 01:00:00 (Sun)
  63342352800, #    local_end 2008-03-28 02:00:00 (Fri)
  7200,
  0,
  'IST',
      ],
      [
  63342345600, #    utc_start 2008-03-28 00:00:00 (Fri)
  63358844400, #      utc_end 2008-10-04 23:00:00 (Sat)
  63342356400, #  local_start 2008-03-28 03:00:00 (Fri)
  63358855200, #    local_end 2008-10-05 02:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  63358844400, #    utc_start 2008-10-04 23:00:00 (Sat)
  63373795200, #      utc_end 2009-03-27 00:00:00 (Fri)
  63358851600, #  local_start 2008-10-05 01:00:00 (Sun)
  63373802400, #    local_end 2009-03-27 02:00:00 (Fri)
  7200,
  0,
  'IST',
      ],
      [
  63373795200, #    utc_start 2009-03-27 00:00:00 (Fri)
  63389689200, #      utc_end 2009-09-26 23:00:00 (Sat)
  63373806000, #  local_start 2009-03-27 03:00:00 (Fri)
  63389700000, #    local_end 2009-09-27 02:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  63389689200, #    utc_start 2009-09-26 23:00:00 (Sat)
  63405244800, #      utc_end 2010-03-26 00:00:00 (Fri)
  63389696400, #  local_start 2009-09-27 01:00:00 (Sun)
  63405252000, #    local_end 2010-03-26 02:00:00 (Fri)
  7200,
  0,
  'IST',
      ],
      [
  63405244800, #    utc_start 2010-03-26 00:00:00 (Fri)
  63419929200, #      utc_end 2010-09-11 23:00:00 (Sat)
  63405255600, #  local_start 2010-03-26 03:00:00 (Fri)
  63419940000, #    local_end 2010-09-12 02:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  63419929200, #    utc_start 2010-09-11 23:00:00 (Sat)
  63437299200, #      utc_end 2011-04-01 00:00:00 (Fri)
  63419936400, #  local_start 2010-09-12 01:00:00 (Sun)
  63437306400, #    local_end 2011-04-01 02:00:00 (Fri)
  7200,
  0,
  'IST',
      ],
      [
  63437299200, #    utc_start 2011-04-01 00:00:00 (Fri)
  63453193200, #      utc_end 2011-10-01 23:00:00 (Sat)
  63437310000, #  local_start 2011-04-01 03:00:00 (Fri)
  63453204000, #    local_end 2011-10-02 02:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  63453193200, #    utc_start 2011-10-01 23:00:00 (Sat)
  63468748800, #      utc_end 2012-03-30 00:00:00 (Fri)
  63453200400, #  local_start 2011-10-02 01:00:00 (Sun)
  63468756000, #    local_end 2012-03-30 02:00:00 (Fri)
  7200,
  0,
  'IST',
      ],
      [
  63468748800, #    utc_start 2012-03-30 00:00:00 (Fri)
  63484038000, #      utc_end 2012-09-22 23:00:00 (Sat)
  63468759600, #  local_start 2012-03-30 03:00:00 (Fri)
  63484048800, #    local_end 2012-09-23 02:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  63484038000, #    utc_start 2012-09-22 23:00:00 (Sat)
  63500198400, #      utc_end 2013-03-29 00:00:00 (Fri)
  63484045200, #  local_start 2012-09-23 01:00:00 (Sun)
  63500205600, #    local_end 2013-03-29 02:00:00 (Fri)
  7200,
  0,
  'IST',
      ],
      [
  63500198400, #    utc_start 2013-03-29 00:00:00 (Fri)
  63518511600, #      utc_end 2013-10-26 23:00:00 (Sat)
  63500209200, #  local_start 2013-03-29 03:00:00 (Fri)
  63518522400, #    local_end 2013-10-27 02:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  63518511600, #    utc_start 2013-10-26 23:00:00 (Sat)
  63531648000, #      utc_end 2014-03-28 00:00:00 (Fri)
  63518518800, #  local_start 2013-10-27 01:00:00 (Sun)
  63531655200, #    local_end 2014-03-28 02:00:00 (Fri)
  7200,
  0,
  'IST',
      ],
      [
  63531648000, #    utc_start 2014-03-28 00:00:00 (Fri)
  63549961200, #      utc_end 2014-10-25 23:00:00 (Sat)
  63531658800, #  local_start 2014-03-28 03:00:00 (Fri)
  63549972000, #    local_end 2014-10-26 02:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  63549961200, #    utc_start 2014-10-25 23:00:00 (Sat)
  63563097600, #      utc_end 2015-03-27 00:00:00 (Fri)
  63549968400, #  local_start 2014-10-26 01:00:00 (Sun)
  63563104800, #    local_end 2015-03-27 02:00:00 (Fri)
  7200,
  0,
  'IST',
      ],
      [
  63563097600, #    utc_start 2015-03-27 00:00:00 (Fri)
  63581410800, #      utc_end 2015-10-24 23:00:00 (Sat)
  63563108400, #  local_start 2015-03-27 03:00:00 (Fri)
  63581421600, #    local_end 2015-10-25 02:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  63581410800, #    utc_start 2015-10-24 23:00:00 (Sat)
  63594547200, #      utc_end 2016-03-25 00:00:00 (Fri)
  63581418000, #  local_start 2015-10-25 01:00:00 (Sun)
  63594554400, #    local_end 2016-03-25 02:00:00 (Fri)
  7200,
  0,
  'IST',
      ],
      [
  63594547200, #    utc_start 2016-03-25 00:00:00 (Fri)
  63613465200, #      utc_end 2016-10-29 23:00:00 (Sat)
  63594558000, #  local_start 2016-03-25 03:00:00 (Fri)
  63613476000, #    local_end 2016-10-30 02:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  63613465200, #    utc_start 2016-10-29 23:00:00 (Sat)
  63625996800, #      utc_end 2017-03-24 00:00:00 (Fri)
  63613472400, #  local_start 2016-10-30 01:00:00 (Sun)
  63626004000, #    local_end 2017-03-24 02:00:00 (Fri)
  7200,
  0,
  'IST',
      ],
      [
  63625996800, #    utc_start 2017-03-24 00:00:00 (Fri)
  63644914800, #      utc_end 2017-10-28 23:00:00 (Sat)
  63626007600, #  local_start 2017-03-24 03:00:00 (Fri)
  63644925600, #    local_end 2017-10-29 02:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  63644914800, #    utc_start 2017-10-28 23:00:00 (Sat)
  63657446400, #      utc_end 2018-03-23 00:00:00 (Fri)
  63644922000, #  local_start 2017-10-29 01:00:00 (Sun)
  63657453600, #    local_end 2018-03-23 02:00:00 (Fri)
  7200,
  0,
  'IST',
      ],
      [
  63657446400, #    utc_start 2018-03-23 00:00:00 (Fri)
  63676364400, #      utc_end 2018-10-27 23:00:00 (Sat)
  63657457200, #  local_start 2018-03-23 03:00:00 (Fri)
  63676375200, #    local_end 2018-10-28 02:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  63676364400, #    utc_start 2018-10-27 23:00:00 (Sat)
  63689500800, #      utc_end 2019-03-29 00:00:00 (Fri)
  63676371600, #  local_start 2018-10-28 01:00:00 (Sun)
  63689508000, #    local_end 2019-03-29 02:00:00 (Fri)
  7200,
  0,
  'IST',
      ],
      [
  63689500800, #    utc_start 2019-03-29 00:00:00 (Fri)
  63707814000, #      utc_end 2019-10-26 23:00:00 (Sat)
  63689511600, #  local_start 2019-03-29 03:00:00 (Fri)
  63707824800, #    local_end 2019-10-27 02:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  63707814000, #    utc_start 2019-10-26 23:00:00 (Sat)
  63720950400, #      utc_end 2020-03-27 00:00:00 (Fri)
  63707821200, #  local_start 2019-10-27 01:00:00 (Sun)
  63720957600, #    local_end 2020-03-27 02:00:00 (Fri)
  7200,
  0,
  'IST',
      ],
      [
  63720950400, #    utc_start 2020-03-27 00:00:00 (Fri)
  63739263600, #      utc_end 2020-10-24 23:00:00 (Sat)
  63720961200, #  local_start 2020-03-27 03:00:00 (Fri)
  63739274400, #    local_end 2020-10-25 02:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  63739263600, #    utc_start 2020-10-24 23:00:00 (Sat)
  63752400000, #      utc_end 2021-03-26 00:00:00 (Fri)
  63739270800, #  local_start 2020-10-25 01:00:00 (Sun)
  63752407200, #    local_end 2021-03-26 02:00:00 (Fri)
  7200,
  0,
  'IST',
      ],
      [
  63752400000, #    utc_start 2021-03-26 00:00:00 (Fri)
  63771318000, #      utc_end 2021-10-30 23:00:00 (Sat)
  63752410800, #  local_start 2021-03-26 03:00:00 (Fri)
  63771328800, #    local_end 2021-10-31 02:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  63771318000, #    utc_start 2021-10-30 23:00:00 (Sat)
  63783849600, #      utc_end 2022-03-25 00:00:00 (Fri)
  63771325200, #  local_start 2021-10-31 01:00:00 (Sun)
  63783856800, #    local_end 2022-03-25 02:00:00 (Fri)
  7200,
  0,
  'IST',
      ],
      [
  63783849600, #    utc_start 2022-03-25 00:00:00 (Fri)
  63802767600, #      utc_end 2022-10-29 23:00:00 (Sat)
  63783860400, #  local_start 2022-03-25 03:00:00 (Fri)
  63802778400, #    local_end 2022-10-30 02:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  63802767600, #    utc_start 2022-10-29 23:00:00 (Sat)
  63815299200, #      utc_end 2023-03-24 00:00:00 (Fri)
  63802774800, #  local_start 2022-10-30 01:00:00 (Sun)
  63815306400, #    local_end 2023-03-24 02:00:00 (Fri)
  7200,
  0,
  'IST',
      ],
      [
  63815299200, #    utc_start 2023-03-24 00:00:00 (Fri)
  63834217200, #      utc_end 2023-10-28 23:00:00 (Sat)
  63815310000, #  local_start 2023-03-24 03:00:00 (Fri)
  63834228000, #    local_end 2023-10-29 02:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  63834217200, #    utc_start 2023-10-28 23:00:00 (Sat)
  63847353600, #      utc_end 2024-03-29 00:00:00 (Fri)
  63834224400, #  local_start 2023-10-29 01:00:00 (Sun)
  63847360800, #    local_end 2024-03-29 02:00:00 (Fri)
  7200,
  0,
  'IST',
      ],
      [
  63847353600, #    utc_start 2024-03-29 00:00:00 (Fri)
  63865666800, #      utc_end 2024-10-26 23:00:00 (Sat)
  63847364400, #  local_start 2024-03-29 03:00:00 (Fri)
  63865677600, #    local_end 2024-10-27 02:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  63865666800, #    utc_start 2024-10-26 23:00:00 (Sat)
  63878803200, #      utc_end 2025-03-28 00:00:00 (Fri)
  63865674000, #  local_start 2024-10-27 01:00:00 (Sun)
  63878810400, #    local_end 2025-03-28 02:00:00 (Fri)
  7200,
  0,
  'IST',
      ],
      [
  63878803200, #    utc_start 2025-03-28 00:00:00 (Fri)
  63897116400, #      utc_end 2025-10-25 23:00:00 (Sat)
  63878814000, #  local_start 2025-03-28 03:00:00 (Fri)
  63897127200, #    local_end 2025-10-26 02:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  63897116400, #    utc_start 2025-10-25 23:00:00 (Sat)
  63910252800, #      utc_end 2026-03-27 00:00:00 (Fri)
  63897123600, #  local_start 2025-10-26 01:00:00 (Sun)
  63910260000, #    local_end 2026-03-27 02:00:00 (Fri)
  7200,
  0,
  'IST',
      ],
      [
  63910252800, #    utc_start 2026-03-27 00:00:00 (Fri)
  63928566000, #      utc_end 2026-10-24 23:00:00 (Sat)
  63910263600, #  local_start 2026-03-27 03:00:00 (Fri)
  63928576800, #    local_end 2026-10-25 02:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  63928566000, #    utc_start 2026-10-24 23:00:00 (Sat)
  63941702400, #      utc_end 2027-03-26 00:00:00 (Fri)
  63928573200, #  local_start 2026-10-25 01:00:00 (Sun)
  63941709600, #    local_end 2027-03-26 02:00:00 (Fri)
  7200,
  0,
  'IST',
      ],
      [
  63941702400, #    utc_start 2027-03-26 00:00:00 (Fri)
  63960620400, #      utc_end 2027-10-30 23:00:00 (Sat)
  63941713200, #  local_start 2027-03-26 03:00:00 (Fri)
  63960631200, #    local_end 2027-10-31 02:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  63960620400, #    utc_start 2027-10-30 23:00:00 (Sat)
  63973152000, #      utc_end 2028-03-24 00:00:00 (Fri)
  63960627600, #  local_start 2027-10-31 01:00:00 (Sun)
  63973159200, #    local_end 2028-03-24 02:00:00 (Fri)
  7200,
  0,
  'IST',
      ],
      [
  63973152000, #    utc_start 2028-03-24 00:00:00 (Fri)
  63992070000, #      utc_end 2028-10-28 23:00:00 (Sat)
  63973162800, #  local_start 2028-03-24 03:00:00 (Fri)
  63992080800, #    local_end 2028-10-29 02:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  63992070000, #    utc_start 2028-10-28 23:00:00 (Sat)
  64004601600, #      utc_end 2029-03-23 00:00:00 (Fri)
  63992077200, #  local_start 2028-10-29 01:00:00 (Sun)
  64004608800, #    local_end 2029-03-23 02:00:00 (Fri)
  7200,
  0,
  'IST',
      ],
      [
  64004601600, #    utc_start 2029-03-23 00:00:00 (Fri)
  64023519600, #      utc_end 2029-10-27 23:00:00 (Sat)
  64004612400, #  local_start 2029-03-23 03:00:00 (Fri)
  64023530400, #    local_end 2029-10-28 02:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
      [
  64023519600, #    utc_start 2029-10-27 23:00:00 (Sat)
  64036656000, #      utc_end 2030-03-29 00:00:00 (Fri)
  64023526800, #  local_start 2029-10-28 01:00:00 (Sun)
  64036663200, #    local_end 2030-03-29 02:00:00 (Fri)
  7200,
  0,
  'IST',
      ],
      [
  64036656000, #    utc_start 2030-03-29 00:00:00 (Fri)
  64054969200, #      utc_end 2030-10-26 23:00:00 (Sat)
  64036666800, #  local_start 2030-03-29 03:00:00 (Fri)
  64054980000, #    local_end 2030-10-27 02:00:00 (Sun)
  10800,
  1,
  'IDT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {66}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { 7200 }
  
  my $last_observance = bless( {
    'format' => 'I%sT',
    'gmtoff' => '2:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 700169,
      'local_rd_secs' => 85160,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 700169,
      'utc_rd_secs' => 85160,
      'utc_year' => 1918
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => 7200,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 700169,
      'local_rd_secs' => 77960,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 700169,
      'utc_rd_secs' => 77960,
      'utc_year' => 1918
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2013',
      'in' => 'Oct',
      'letter' => 'S',
      'name' => 'Zion',
      'offset_from_std' => 0,
      'on' => 'lastSun',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2013',
      'in' => 'Mar',
      'letter' => 'D',
      'name' => 'Zion',
      'offset_from_std' => 3600,
      'on' => 'Fri>=23',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_JERUSALEM

    $main::fatpacked{"DateTime/TimeZone/Asia/Kabul.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_KABUL';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/asia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Kabul;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Kabul::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59611144992, #      utc_end 1889-12-31 19:23:12 (Tue)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59611161600, #    local_end 1890-01-01 00:00:00 (Wed)
  16608,
  0,
  'LMT',
      ],
      [
  59611144992, #    utc_start 1889-12-31 19:23:12 (Tue)
  61346750400, #      utc_end 1944-12-31 20:00:00 (Sun)
  59611159392, #  local_start 1889-12-31 23:23:12 (Tue)
  61346764800, #    local_end 1945-01-01 00:00:00 (Mon)
  14400,
  0,
  '+04',
      ],
      [
  61346750400, #    utc_start 1944-12-31 20:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #      utc_end
  61346766600, #  local_start 1945-01-01 00:30:00 (Mon)
  DateTime::TimeZone::INFINITY, #    local_end
  16200,
  0,
  '+0430',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_KABUL

    $main::fatpacked{"DateTime/TimeZone/Asia/Kamchatka.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_KAMCHATKA';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Kamchatka;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Kamchatka::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60647923524, #      utc_end 1922-11-09 13:25:24 (Thu)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60647961600, #    local_end 1922-11-10 00:00:00 (Fri)
  38076,
  0,
  'LMT',
      ],
      [
  60647923524, #    utc_start 1922-11-09 13:25:24 (Thu)
  60888114000, #      utc_end 1930-06-20 13:00:00 (Fri)
  60647963124, #  local_start 1922-11-10 00:25:24 (Fri)
  60888153600, #    local_end 1930-06-21 00:00:00 (Sat)
  39600,
  0,
  '+11',
      ],
      [
  60888114000, #    utc_start 1930-06-20 13:00:00 (Fri)
  62490571200, #      utc_end 1981-03-31 12:00:00 (Tue)
  60888157200, #  local_start 1930-06-21 01:00:00 (Sat)
  62490614400, #    local_end 1981-04-01 00:00:00 (Wed)
  43200,
  0,
  '+12',
      ],
      [
  62490571200, #    utc_start 1981-03-31 12:00:00 (Tue)
  62506378800, #      utc_end 1981-09-30 11:00:00 (Wed)
  62490618000, #  local_start 1981-04-01 01:00:00 (Wed)
  62506425600, #    local_end 1981-10-01 00:00:00 (Thu)
  46800,
  1,
  '+13',
      ],
      [
  62506378800, #    utc_start 1981-09-30 11:00:00 (Wed)
  62522107200, #      utc_end 1982-03-31 12:00:00 (Wed)
  62506422000, #  local_start 1981-09-30 23:00:00 (Wed)
  62522150400, #    local_end 1982-04-01 00:00:00 (Thu)
  43200,
  0,
  '+12',
      ],
      [
  62522107200, #    utc_start 1982-03-31 12:00:00 (Wed)
  62537914800, #      utc_end 1982-09-30 11:00:00 (Thu)
  62522154000, #  local_start 1982-04-01 01:00:00 (Thu)
  62537961600, #    local_end 1982-10-01 00:00:00 (Fri)
  46800,
  1,
  '+13',
      ],
      [
  62537914800, #    utc_start 1982-09-30 11:00:00 (Thu)
  62553643200, #      utc_end 1983-03-31 12:00:00 (Thu)
  62537958000, #  local_start 1982-09-30 23:00:00 (Thu)
  62553686400, #    local_end 1983-04-01 00:00:00 (Fri)
  43200,
  0,
  '+12',
      ],
      [
  62553643200, #    utc_start 1983-03-31 12:00:00 (Thu)
  62569450800, #      utc_end 1983-09-30 11:00:00 (Fri)
  62553690000, #  local_start 1983-04-01 01:00:00 (Fri)
  62569497600, #    local_end 1983-10-01 00:00:00 (Sat)
  46800,
  1,
  '+13',
      ],
      [
  62569450800, #    utc_start 1983-09-30 11:00:00 (Fri)
  62585265600, #      utc_end 1984-03-31 12:00:00 (Sat)
  62569494000, #  local_start 1983-09-30 23:00:00 (Fri)
  62585308800, #    local_end 1984-04-01 00:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  62585265600, #    utc_start 1984-03-31 12:00:00 (Sat)
  62600997600, #      utc_end 1984-09-29 14:00:00 (Sat)
  62585312400, #  local_start 1984-04-01 01:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  62600997600, #    utc_start 1984-09-29 14:00:00 (Sat)
  62616722400, #      utc_end 1985-03-30 14:00:00 (Sat)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  62616722400, #    utc_start 1985-03-30 14:00:00 (Sat)
  62632447200, #      utc_end 1985-09-28 14:00:00 (Sat)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  62632447200, #    utc_start 1985-09-28 14:00:00 (Sat)
  62648172000, #      utc_end 1986-03-29 14:00:00 (Sat)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  62648172000, #    utc_start 1986-03-29 14:00:00 (Sat)
  62663896800, #      utc_end 1986-09-27 14:00:00 (Sat)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  62663896800, #    utc_start 1986-09-27 14:00:00 (Sat)
  62679621600, #      utc_end 1987-03-28 14:00:00 (Sat)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  62679621600, #    utc_start 1987-03-28 14:00:00 (Sat)
  62695346400, #      utc_end 1987-09-26 14:00:00 (Sat)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  62695346400, #    utc_start 1987-09-26 14:00:00 (Sat)
  62711071200, #      utc_end 1988-03-26 14:00:00 (Sat)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  62711071200, #    utc_start 1988-03-26 14:00:00 (Sat)
  62726796000, #      utc_end 1988-09-24 14:00:00 (Sat)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  62726796000, #    utc_start 1988-09-24 14:00:00 (Sat)
  62742520800, #      utc_end 1989-03-25 14:00:00 (Sat)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  62742520800, #    utc_start 1989-03-25 14:00:00 (Sat)
  62758245600, #      utc_end 1989-09-23 14:00:00 (Sat)
  62742567600, #  local_start 1989-03-26 03:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  62758245600, #    utc_start 1989-09-23 14:00:00 (Sat)
  62773970400, #      utc_end 1990-03-24 14:00:00 (Sat)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  62773970400, #    utc_start 1990-03-24 14:00:00 (Sat)
  62790300000, #      utc_end 1990-09-29 14:00:00 (Sat)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  62790300000, #    utc_start 1990-09-29 14:00:00 (Sat)
  62806024800, #      utc_end 1991-03-30 14:00:00 (Sat)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  62806024800, #    utc_start 1991-03-30 14:00:00 (Sat)
  62821753200, #      utc_end 1991-09-28 15:00:00 (Sat)
  62806068000, #  local_start 1991-03-31 02:00:00 (Sun)
  62821796400, #    local_end 1991-09-29 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  62821753200, #    utc_start 1991-09-28 15:00:00 (Sat)
  62831430000, #      utc_end 1992-01-18 15:00:00 (Sat)
  62821792800, #  local_start 1991-09-29 02:00:00 (Sun)
  62831469600, #    local_end 1992-01-19 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62831430000, #    utc_start 1992-01-18 15:00:00 (Sat)
  62837474400, #      utc_end 1992-03-28 14:00:00 (Sat)
  62831473200, #  local_start 1992-01-19 03:00:00 (Sun)
  62837517600, #    local_end 1992-03-29 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  62837474400, #    utc_start 1992-03-28 14:00:00 (Sat)
  62853199200, #      utc_end 1992-09-26 14:00:00 (Sat)
  62837521200, #  local_start 1992-03-29 03:00:00 (Sun)
  62853246000, #    local_end 1992-09-27 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  62853199200, #    utc_start 1992-09-26 14:00:00 (Sat)
  62868924000, #      utc_end 1993-03-27 14:00:00 (Sat)
  62853242400, #  local_start 1992-09-27 02:00:00 (Sun)
  62868967200, #    local_end 1993-03-28 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  62868924000, #    utc_start 1993-03-27 14:00:00 (Sat)
  62884648800, #      utc_end 1993-09-25 14:00:00 (Sat)
  62868970800, #  local_start 1993-03-28 03:00:00 (Sun)
  62884695600, #    local_end 1993-09-26 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  62884648800, #    utc_start 1993-09-25 14:00:00 (Sat)
  62900373600, #      utc_end 1994-03-26 14:00:00 (Sat)
  62884692000, #  local_start 1993-09-26 02:00:00 (Sun)
  62900416800, #    local_end 1994-03-27 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  62900373600, #    utc_start 1994-03-26 14:00:00 (Sat)
  62916098400, #      utc_end 1994-09-24 14:00:00 (Sat)
  62900420400, #  local_start 1994-03-27 03:00:00 (Sun)
  62916145200, #    local_end 1994-09-25 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  62916098400, #    utc_start 1994-09-24 14:00:00 (Sat)
  62931823200, #      utc_end 1995-03-25 14:00:00 (Sat)
  62916141600, #  local_start 1994-09-25 02:00:00 (Sun)
  62931866400, #    local_end 1995-03-26 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  62931823200, #    utc_start 1995-03-25 14:00:00 (Sat)
  62947548000, #      utc_end 1995-09-23 14:00:00 (Sat)
  62931870000, #  local_start 1995-03-26 03:00:00 (Sun)
  62947594800, #    local_end 1995-09-24 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  62947548000, #    utc_start 1995-09-23 14:00:00 (Sat)
  62963877600, #      utc_end 1996-03-30 14:00:00 (Sat)
  62947591200, #  local_start 1995-09-24 02:00:00 (Sun)
  62963920800, #    local_end 1996-03-31 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  62963877600, #    utc_start 1996-03-30 14:00:00 (Sat)
  62982021600, #      utc_end 1996-10-26 14:00:00 (Sat)
  62963924400, #  local_start 1996-03-31 03:00:00 (Sun)
  62982068400, #    local_end 1996-10-27 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  62982021600, #    utc_start 1996-10-26 14:00:00 (Sat)
  62995327200, #      utc_end 1997-03-29 14:00:00 (Sat)
  62982064800, #  local_start 1996-10-27 02:00:00 (Sun)
  62995370400, #    local_end 1997-03-30 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  62995327200, #    utc_start 1997-03-29 14:00:00 (Sat)
  63013471200, #      utc_end 1997-10-25 14:00:00 (Sat)
  62995374000, #  local_start 1997-03-30 03:00:00 (Sun)
  63013518000, #    local_end 1997-10-26 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  63013471200, #    utc_start 1997-10-25 14:00:00 (Sat)
  63026776800, #      utc_end 1998-03-28 14:00:00 (Sat)
  63013514400, #  local_start 1997-10-26 02:00:00 (Sun)
  63026820000, #    local_end 1998-03-29 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  63026776800, #    utc_start 1998-03-28 14:00:00 (Sat)
  63044920800, #      utc_end 1998-10-24 14:00:00 (Sat)
  63026823600, #  local_start 1998-03-29 03:00:00 (Sun)
  63044967600, #    local_end 1998-10-25 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  63044920800, #    utc_start 1998-10-24 14:00:00 (Sat)
  63058226400, #      utc_end 1999-03-27 14:00:00 (Sat)
  63044964000, #  local_start 1998-10-25 02:00:00 (Sun)
  63058269600, #    local_end 1999-03-28 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  63058226400, #    utc_start 1999-03-27 14:00:00 (Sat)
  63076975200, #      utc_end 1999-10-30 14:00:00 (Sat)
  63058273200, #  local_start 1999-03-28 03:00:00 (Sun)
  63077022000, #    local_end 1999-10-31 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  63076975200, #    utc_start 1999-10-30 14:00:00 (Sat)
  63089676000, #      utc_end 2000-03-25 14:00:00 (Sat)
  63077018400, #  local_start 1999-10-31 02:00:00 (Sun)
  63089719200, #    local_end 2000-03-26 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  63089676000, #    utc_start 2000-03-25 14:00:00 (Sat)
  63108424800, #      utc_end 2000-10-28 14:00:00 (Sat)
  63089722800, #  local_start 2000-03-26 03:00:00 (Sun)
  63108471600, #    local_end 2000-10-29 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  63108424800, #    utc_start 2000-10-28 14:00:00 (Sat)
  63121125600, #      utc_end 2001-03-24 14:00:00 (Sat)
  63108468000, #  local_start 2000-10-29 02:00:00 (Sun)
  63121168800, #    local_end 2001-03-25 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  63121125600, #    utc_start 2001-03-24 14:00:00 (Sat)
  63139874400, #      utc_end 2001-10-27 14:00:00 (Sat)
  63121172400, #  local_start 2001-03-25 03:00:00 (Sun)
  63139921200, #    local_end 2001-10-28 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  63139874400, #    utc_start 2001-10-27 14:00:00 (Sat)
  63153180000, #      utc_end 2002-03-30 14:00:00 (Sat)
  63139917600, #  local_start 2001-10-28 02:00:00 (Sun)
  63153223200, #    local_end 2002-03-31 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  63153180000, #    utc_start 2002-03-30 14:00:00 (Sat)
  63171324000, #      utc_end 2002-10-26 14:00:00 (Sat)
  63153226800, #  local_start 2002-03-31 03:00:00 (Sun)
  63171370800, #    local_end 2002-10-27 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  63171324000, #    utc_start 2002-10-26 14:00:00 (Sat)
  63184629600, #      utc_end 2003-03-29 14:00:00 (Sat)
  63171367200, #  local_start 2002-10-27 02:00:00 (Sun)
  63184672800, #    local_end 2003-03-30 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  63184629600, #    utc_start 2003-03-29 14:00:00 (Sat)
  63202773600, #      utc_end 2003-10-25 14:00:00 (Sat)
  63184676400, #  local_start 2003-03-30 03:00:00 (Sun)
  63202820400, #    local_end 2003-10-26 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  63202773600, #    utc_start 2003-10-25 14:00:00 (Sat)
  63216079200, #      utc_end 2004-03-27 14:00:00 (Sat)
  63202816800, #  local_start 2003-10-26 02:00:00 (Sun)
  63216122400, #    local_end 2004-03-28 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  63216079200, #    utc_start 2004-03-27 14:00:00 (Sat)
  63234828000, #      utc_end 2004-10-30 14:00:00 (Sat)
  63216126000, #  local_start 2004-03-28 03:00:00 (Sun)
  63234874800, #    local_end 2004-10-31 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  63234828000, #    utc_start 2004-10-30 14:00:00 (Sat)
  63247528800, #      utc_end 2005-03-26 14:00:00 (Sat)
  63234871200, #  local_start 2004-10-31 02:00:00 (Sun)
  63247572000, #    local_end 2005-03-27 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  63247528800, #    utc_start 2005-03-26 14:00:00 (Sat)
  63266277600, #      utc_end 2005-10-29 14:00:00 (Sat)
  63247575600, #  local_start 2005-03-27 03:00:00 (Sun)
  63266324400, #    local_end 2005-10-30 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  63266277600, #    utc_start 2005-10-29 14:00:00 (Sat)
  63278978400, #      utc_end 2006-03-25 14:00:00 (Sat)
  63266320800, #  local_start 2005-10-30 02:00:00 (Sun)
  63279021600, #    local_end 2006-03-26 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  63278978400, #    utc_start 2006-03-25 14:00:00 (Sat)
  63297727200, #      utc_end 2006-10-28 14:00:00 (Sat)
  63279025200, #  local_start 2006-03-26 03:00:00 (Sun)
  63297774000, #    local_end 2006-10-29 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  63297727200, #    utc_start 2006-10-28 14:00:00 (Sat)
  63310428000, #      utc_end 2007-03-24 14:00:00 (Sat)
  63297770400, #  local_start 2006-10-29 02:00:00 (Sun)
  63310471200, #    local_end 2007-03-25 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  63310428000, #    utc_start 2007-03-24 14:00:00 (Sat)
  63329176800, #      utc_end 2007-10-27 14:00:00 (Sat)
  63310474800, #  local_start 2007-03-25 03:00:00 (Sun)
  63329223600, #    local_end 2007-10-28 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  63329176800, #    utc_start 2007-10-27 14:00:00 (Sat)
  63342482400, #      utc_end 2008-03-29 14:00:00 (Sat)
  63329220000, #  local_start 2007-10-28 02:00:00 (Sun)
  63342525600, #    local_end 2008-03-30 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  63342482400, #    utc_start 2008-03-29 14:00:00 (Sat)
  63360626400, #      utc_end 2008-10-25 14:00:00 (Sat)
  63342529200, #  local_start 2008-03-30 03:00:00 (Sun)
  63360673200, #    local_end 2008-10-26 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  63360626400, #    utc_start 2008-10-25 14:00:00 (Sat)
  63373932000, #      utc_end 2009-03-28 14:00:00 (Sat)
  63360669600, #  local_start 2008-10-26 02:00:00 (Sun)
  63373975200, #    local_end 2009-03-29 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  63373932000, #    utc_start 2009-03-28 14:00:00 (Sat)
  63392076000, #      utc_end 2009-10-24 14:00:00 (Sat)
  63373978800, #  local_start 2009-03-29 03:00:00 (Sun)
  63392122800, #    local_end 2009-10-25 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  63392076000, #    utc_start 2009-10-24 14:00:00 (Sat)
  63405381600, #      utc_end 2010-03-27 14:00:00 (Sat)
  63392119200, #  local_start 2009-10-25 02:00:00 (Sun)
  63405424800, #    local_end 2010-03-28 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  63405381600, #    utc_start 2010-03-27 14:00:00 (Sat)
  63424134000, #      utc_end 2010-10-30 15:00:00 (Sat)
  63405424800, #  local_start 2010-03-28 02:00:00 (Sun)
  63424177200, #    local_end 2010-10-31 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  63424134000, #    utc_start 2010-10-30 15:00:00 (Sat)
  63436834800, #      utc_end 2011-03-26 15:00:00 (Sat)
  63424173600, #  local_start 2010-10-31 02:00:00 (Sun)
  63436874400, #    local_end 2011-03-27 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  63436834800, #    utc_start 2011-03-26 15:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  63436878000, #  local_start 2011-03-27 03:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  43200,
  0,
  '+12',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {30}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_KAMCHATKA

    $main::fatpacked{"DateTime/TimeZone/Asia/Karachi.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_KARACHI';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/asia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Karachi;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Karachi::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60147516708, #      utc_end 1906-12-31 19:31:48 (Mon)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60147532800, #    local_end 1907-01-01 00:00:00 (Tue)
  16092,
  0,
  'LMT',
      ],
      [
  60147516708, #    utc_start 1906-12-31 19:31:48 (Mon)
  61273045800, #      utc_end 1942-08-31 18:30:00 (Mon)
  60147536508, #  local_start 1907-01-01 01:01:48 (Tue)
  61273065600, #    local_end 1942-09-01 00:00:00 (Tue)
  19800,
  0,
  '+0530',
      ],
      [
  61273045800, #    utc_start 1942-08-31 18:30:00 (Mon)
  61371538200, #      utc_end 1945-10-14 17:30:00 (Sun)
  61273069200, #  local_start 1942-09-01 01:00:00 (Tue)
  61371561600, #    local_end 1945-10-15 00:00:00 (Mon)
  23400,
  1,
  '+0630',
      ],
      [
  61371538200, #    utc_start 1945-10-14 17:30:00 (Sun)
  61559548200, #      utc_end 1951-09-29 18:30:00 (Sat)
  61371558000, #  local_start 1945-10-14 23:00:00 (Sun)
  61559568000, #    local_end 1951-09-30 00:00:00 (Sun)
  19800,
  0,
  '+0530',
      ],
      [
  61559548200, #    utc_start 1951-09-29 18:30:00 (Sat)
  62174458800, #      utc_end 1971-03-25 19:00:00 (Thu)
  61559566200, #  local_start 1951-09-29 23:30:00 (Sat)
  62174476800, #    local_end 1971-03-26 00:00:00 (Fri)
  18000,
  0,
  '+05',
      ],
      [
  62174458800, #    utc_start 1971-03-25 19:00:00 (Thu)
  63153802800, #      utc_end 2002-04-06 19:00:00 (Sat)
  62174476800, #  local_start 1971-03-26 00:00:00 (Fri)
  63153820800, #    local_end 2002-04-07 00:00:00 (Sun)
  18000,
  0,
  'PKT',
      ],
      [
  63153802800, #    utc_start 2002-04-06 19:00:00 (Sat)
  63169524000, #      utc_end 2002-10-05 18:00:00 (Sat)
  63153824400, #  local_start 2002-04-07 01:00:00 (Sun)
  63169545600, #    local_end 2002-10-06 00:00:00 (Sun)
  21600,
  1,
  'PKST',
      ],
      [
  63169524000, #    utc_start 2002-10-05 18:00:00 (Sat)
  63347943600, #      utc_end 2008-05-31 19:00:00 (Sat)
  63169542000, #  local_start 2002-10-05 23:00:00 (Sat)
  63347961600, #    local_end 2008-06-01 00:00:00 (Sun)
  18000,
  0,
  'PKT',
      ],
      [
  63347943600, #    utc_start 2008-05-31 19:00:00 (Sat)
  63361159200, #      utc_end 2008-10-31 18:00:00 (Fri)
  63347965200, #  local_start 2008-06-01 01:00:00 (Sun)
  63361180800, #    local_end 2008-11-01 00:00:00 (Sat)
  21600,
  1,
  'PKST',
      ],
      [
  63361159200, #    utc_start 2008-10-31 18:00:00 (Fri)
  63375418800, #      utc_end 2009-04-14 19:00:00 (Tue)
  63361177200, #  local_start 2008-10-31 23:00:00 (Fri)
  63375436800, #    local_end 2009-04-15 00:00:00 (Wed)
  18000,
  0,
  'PKT',
      ],
      [
  63375418800, #    utc_start 2009-04-14 19:00:00 (Tue)
  63392695200, #      utc_end 2009-10-31 18:00:00 (Sat)
  63375440400, #  local_start 2009-04-15 01:00:00 (Wed)
  63392716800, #    local_end 2009-11-01 00:00:00 (Sun)
  21600,
  1,
  'PKST',
      ],
      [
  63392695200, #    utc_start 2009-10-31 18:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  63392713200, #  local_start 2009-10-31 23:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #    local_end
  18000,
  0,
  'PKT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {4}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_KARACHI

    $main::fatpacked{"DateTime/TimeZone/Asia/Kathmandu.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_KATHMANDU';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/asia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Kathmandu;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Kathmandu::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60557739524, #      utc_end 1919-12-31 18:18:44 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60557760000, #    local_end 1920-01-01 00:00:00 (Thu)
  20476,
  0,
  'LMT',
      ],
      [
  60557739524, #    utc_start 1919-12-31 18:18:44 (Wed)
  62640585000, #      utc_end 1985-12-31 18:30:00 (Tue)
  60557759324, #  local_start 1919-12-31 23:48:44 (Wed)
  62640604800, #    local_end 1986-01-01 00:00:00 (Wed)
  19800,
  0,
  '+0530',
      ],
      [
  62640585000, #    utc_start 1985-12-31 18:30:00 (Tue)
  DateTime::TimeZone::INFINITY, #      utc_end
  62640605700, #  local_start 1986-01-01 00:15:00 (Wed)
  DateTime::TimeZone::INFINITY, #    local_end
  20700,
  0,
  '+0545',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_KATHMANDU

    $main::fatpacked{"DateTime/TimeZone/Asia/Khandyga.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_KHANDYGA';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Khandyga;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Khandyga::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60556258667, #      utc_end 1919-12-14 14:57:47 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60556291200, #    local_end 1919-12-15 00:00:00 (Mon)
  32533,
  0,
  'LMT',
      ],
      [
  60556258667, #    utc_start 1919-12-14 14:57:47 (Sun)
  60888124800, #      utc_end 1930-06-20 16:00:00 (Fri)
  60556287467, #  local_start 1919-12-14 22:57:47 (Sun)
  60888153600, #    local_end 1930-06-21 00:00:00 (Sat)
  28800,
  0,
  '+08',
      ],
      [
  60888124800, #    utc_start 1930-06-20 16:00:00 (Fri)
  62490582000, #      utc_end 1981-03-31 15:00:00 (Tue)
  60888157200, #  local_start 1930-06-21 01:00:00 (Sat)
  62490614400, #    local_end 1981-04-01 00:00:00 (Wed)
  32400,
  0,
  '+09',
      ],
      [
  62490582000, #    utc_start 1981-03-31 15:00:00 (Tue)
  62506389600, #      utc_end 1981-09-30 14:00:00 (Wed)
  62490618000, #  local_start 1981-04-01 01:00:00 (Wed)
  62506425600, #    local_end 1981-10-01 00:00:00 (Thu)
  36000,
  1,
  '+10',
      ],
      [
  62506389600, #    utc_start 1981-09-30 14:00:00 (Wed)
  62522118000, #      utc_end 1982-03-31 15:00:00 (Wed)
  62506422000, #  local_start 1981-09-30 23:00:00 (Wed)
  62522150400, #    local_end 1982-04-01 00:00:00 (Thu)
  32400,
  0,
  '+09',
      ],
      [
  62522118000, #    utc_start 1982-03-31 15:00:00 (Wed)
  62537925600, #      utc_end 1982-09-30 14:00:00 (Thu)
  62522154000, #  local_start 1982-04-01 01:00:00 (Thu)
  62537961600, #    local_end 1982-10-01 00:00:00 (Fri)
  36000,
  1,
  '+10',
      ],
      [
  62537925600, #    utc_start 1982-09-30 14:00:00 (Thu)
  62553654000, #      utc_end 1983-03-31 15:00:00 (Thu)
  62537958000, #  local_start 1982-09-30 23:00:00 (Thu)
  62553686400, #    local_end 1983-04-01 00:00:00 (Fri)
  32400,
  0,
  '+09',
      ],
      [
  62553654000, #    utc_start 1983-03-31 15:00:00 (Thu)
  62569461600, #      utc_end 1983-09-30 14:00:00 (Fri)
  62553690000, #  local_start 1983-04-01 01:00:00 (Fri)
  62569497600, #    local_end 1983-10-01 00:00:00 (Sat)
  36000,
  1,
  '+10',
      ],
      [
  62569461600, #    utc_start 1983-09-30 14:00:00 (Fri)
  62585276400, #      utc_end 1984-03-31 15:00:00 (Sat)
  62569494000, #  local_start 1983-09-30 23:00:00 (Fri)
  62585308800, #    local_end 1984-04-01 00:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  62585276400, #    utc_start 1984-03-31 15:00:00 (Sat)
  62601008400, #      utc_end 1984-09-29 17:00:00 (Sat)
  62585312400, #  local_start 1984-04-01 01:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  62601008400, #    utc_start 1984-09-29 17:00:00 (Sat)
  62616733200, #      utc_end 1985-03-30 17:00:00 (Sat)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  62616733200, #    utc_start 1985-03-30 17:00:00 (Sat)
  62632458000, #      utc_end 1985-09-28 17:00:00 (Sat)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  62632458000, #    utc_start 1985-09-28 17:00:00 (Sat)
  62648182800, #      utc_end 1986-03-29 17:00:00 (Sat)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  62648182800, #    utc_start 1986-03-29 17:00:00 (Sat)
  62663907600, #      utc_end 1986-09-27 17:00:00 (Sat)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  62663907600, #    utc_start 1986-09-27 17:00:00 (Sat)
  62679632400, #      utc_end 1987-03-28 17:00:00 (Sat)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  62679632400, #    utc_start 1987-03-28 17:00:00 (Sat)
  62695357200, #      utc_end 1987-09-26 17:00:00 (Sat)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  62695357200, #    utc_start 1987-09-26 17:00:00 (Sat)
  62711082000, #      utc_end 1988-03-26 17:00:00 (Sat)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  62711082000, #    utc_start 1988-03-26 17:00:00 (Sat)
  62726806800, #      utc_end 1988-09-24 17:00:00 (Sat)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  62726806800, #    utc_start 1988-09-24 17:00:00 (Sat)
  62742531600, #      utc_end 1989-03-25 17:00:00 (Sat)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  62742531600, #    utc_start 1989-03-25 17:00:00 (Sat)
  62758256400, #      utc_end 1989-09-23 17:00:00 (Sat)
  62742567600, #  local_start 1989-03-26 03:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  62758256400, #    utc_start 1989-09-23 17:00:00 (Sat)
  62773981200, #      utc_end 1990-03-24 17:00:00 (Sat)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  62773981200, #    utc_start 1990-03-24 17:00:00 (Sat)
  62790310800, #      utc_end 1990-09-29 17:00:00 (Sat)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  62790310800, #    utc_start 1990-09-29 17:00:00 (Sat)
  62806035600, #      utc_end 1991-03-30 17:00:00 (Sat)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  62806035600, #    utc_start 1991-03-30 17:00:00 (Sat)
  62821764000, #      utc_end 1991-09-28 18:00:00 (Sat)
  62806068000, #  local_start 1991-03-31 02:00:00 (Sun)
  62821796400, #    local_end 1991-09-29 03:00:00 (Sun)
  32400,
  1,
  '+09',
      ],
      [
  62821764000, #    utc_start 1991-09-28 18:00:00 (Sat)
  62831440800, #      utc_end 1992-01-18 18:00:00 (Sat)
  62821792800, #  local_start 1991-09-29 02:00:00 (Sun)
  62831469600, #    local_end 1992-01-19 02:00:00 (Sun)
  28800,
  0,
  '+08',
      ],
      [
  62831440800, #    utc_start 1992-01-18 18:00:00 (Sat)
  62837485200, #      utc_end 1992-03-28 17:00:00 (Sat)
  62831473200, #  local_start 1992-01-19 03:00:00 (Sun)
  62837517600, #    local_end 1992-03-29 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  62837485200, #    utc_start 1992-03-28 17:00:00 (Sat)
  62853210000, #      utc_end 1992-09-26 17:00:00 (Sat)
  62837521200, #  local_start 1992-03-29 03:00:00 (Sun)
  62853246000, #    local_end 1992-09-27 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  62853210000, #    utc_start 1992-09-26 17:00:00 (Sat)
  62868934800, #      utc_end 1993-03-27 17:00:00 (Sat)
  62853242400, #  local_start 1992-09-27 02:00:00 (Sun)
  62868967200, #    local_end 1993-03-28 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  62868934800, #    utc_start 1993-03-27 17:00:00 (Sat)
  62884659600, #      utc_end 1993-09-25 17:00:00 (Sat)
  62868970800, #  local_start 1993-03-28 03:00:00 (Sun)
  62884695600, #    local_end 1993-09-26 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  62884659600, #    utc_start 1993-09-25 17:00:00 (Sat)
  62900384400, #      utc_end 1994-03-26 17:00:00 (Sat)
  62884692000, #  local_start 1993-09-26 02:00:00 (Sun)
  62900416800, #    local_end 1994-03-27 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  62900384400, #    utc_start 1994-03-26 17:00:00 (Sat)
  62916109200, #      utc_end 1994-09-24 17:00:00 (Sat)
  62900420400, #  local_start 1994-03-27 03:00:00 (Sun)
  62916145200, #    local_end 1994-09-25 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  62916109200, #    utc_start 1994-09-24 17:00:00 (Sat)
  62931834000, #      utc_end 1995-03-25 17:00:00 (Sat)
  62916141600, #  local_start 1994-09-25 02:00:00 (Sun)
  62931866400, #    local_end 1995-03-26 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  62931834000, #    utc_start 1995-03-25 17:00:00 (Sat)
  62947558800, #      utc_end 1995-09-23 17:00:00 (Sat)
  62931870000, #  local_start 1995-03-26 03:00:00 (Sun)
  62947594800, #    local_end 1995-09-24 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  62947558800, #    utc_start 1995-09-23 17:00:00 (Sat)
  62963888400, #      utc_end 1996-03-30 17:00:00 (Sat)
  62947591200, #  local_start 1995-09-24 02:00:00 (Sun)
  62963920800, #    local_end 1996-03-31 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  62963888400, #    utc_start 1996-03-30 17:00:00 (Sat)
  62982032400, #      utc_end 1996-10-26 17:00:00 (Sat)
  62963924400, #  local_start 1996-03-31 03:00:00 (Sun)
  62982068400, #    local_end 1996-10-27 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  62982032400, #    utc_start 1996-10-26 17:00:00 (Sat)
  62995338000, #      utc_end 1997-03-29 17:00:00 (Sat)
  62982064800, #  local_start 1996-10-27 02:00:00 (Sun)
  62995370400, #    local_end 1997-03-30 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  62995338000, #    utc_start 1997-03-29 17:00:00 (Sat)
  63013482000, #      utc_end 1997-10-25 17:00:00 (Sat)
  62995374000, #  local_start 1997-03-30 03:00:00 (Sun)
  63013518000, #    local_end 1997-10-26 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  63013482000, #    utc_start 1997-10-25 17:00:00 (Sat)
  63026787600, #      utc_end 1998-03-28 17:00:00 (Sat)
  63013514400, #  local_start 1997-10-26 02:00:00 (Sun)
  63026820000, #    local_end 1998-03-29 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  63026787600, #    utc_start 1998-03-28 17:00:00 (Sat)
  63044931600, #      utc_end 1998-10-24 17:00:00 (Sat)
  63026823600, #  local_start 1998-03-29 03:00:00 (Sun)
  63044967600, #    local_end 1998-10-25 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  63044931600, #    utc_start 1998-10-24 17:00:00 (Sat)
  63058237200, #      utc_end 1999-03-27 17:00:00 (Sat)
  63044964000, #  local_start 1998-10-25 02:00:00 (Sun)
  63058269600, #    local_end 1999-03-28 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  63058237200, #    utc_start 1999-03-27 17:00:00 (Sat)
  63076986000, #      utc_end 1999-10-30 17:00:00 (Sat)
  63058273200, #  local_start 1999-03-28 03:00:00 (Sun)
  63077022000, #    local_end 1999-10-31 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  63076986000, #    utc_start 1999-10-30 17:00:00 (Sat)
  63089686800, #      utc_end 2000-03-25 17:00:00 (Sat)
  63077018400, #  local_start 1999-10-31 02:00:00 (Sun)
  63089719200, #    local_end 2000-03-26 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  63089686800, #    utc_start 2000-03-25 17:00:00 (Sat)
  63108435600, #      utc_end 2000-10-28 17:00:00 (Sat)
  63089722800, #  local_start 2000-03-26 03:00:00 (Sun)
  63108471600, #    local_end 2000-10-29 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  63108435600, #    utc_start 2000-10-28 17:00:00 (Sat)
  63121136400, #      utc_end 2001-03-24 17:00:00 (Sat)
  63108468000, #  local_start 2000-10-29 02:00:00 (Sun)
  63121168800, #    local_end 2001-03-25 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  63121136400, #    utc_start 2001-03-24 17:00:00 (Sat)
  63139885200, #      utc_end 2001-10-27 17:00:00 (Sat)
  63121172400, #  local_start 2001-03-25 03:00:00 (Sun)
  63139921200, #    local_end 2001-10-28 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  63139885200, #    utc_start 2001-10-27 17:00:00 (Sat)
  63153190800, #      utc_end 2002-03-30 17:00:00 (Sat)
  63139917600, #  local_start 2001-10-28 02:00:00 (Sun)
  63153223200, #    local_end 2002-03-31 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  63153190800, #    utc_start 2002-03-30 17:00:00 (Sat)
  63171334800, #      utc_end 2002-10-26 17:00:00 (Sat)
  63153226800, #  local_start 2002-03-31 03:00:00 (Sun)
  63171370800, #    local_end 2002-10-27 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  63171334800, #    utc_start 2002-10-26 17:00:00 (Sat)
  63184640400, #      utc_end 2003-03-29 17:00:00 (Sat)
  63171367200, #  local_start 2002-10-27 02:00:00 (Sun)
  63184672800, #    local_end 2003-03-30 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  63184640400, #    utc_start 2003-03-29 17:00:00 (Sat)
  63202784400, #      utc_end 2003-10-25 17:00:00 (Sat)
  63184676400, #  local_start 2003-03-30 03:00:00 (Sun)
  63202820400, #    local_end 2003-10-26 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  63202784400, #    utc_start 2003-10-25 17:00:00 (Sat)
  63208566000, #      utc_end 2003-12-31 15:00:00 (Wed)
  63202816800, #  local_start 2003-10-26 02:00:00 (Sun)
  63208598400, #    local_end 2004-01-01 00:00:00 (Thu)
  32400,
  0,
  '+09',
      ],
      [
  63208566000, #    utc_start 2003-12-31 15:00:00 (Wed)
  63216086400, #      utc_end 2004-03-27 16:00:00 (Sat)
  63208602000, #  local_start 2004-01-01 01:00:00 (Thu)
  63216122400, #    local_end 2004-03-28 02:00:00 (Sun)
  36000,
  0,
  '+10',
      ],
      [
  63216086400, #    utc_start 2004-03-27 16:00:00 (Sat)
  63234835200, #      utc_end 2004-10-30 16:00:00 (Sat)
  63216126000, #  local_start 2004-03-28 03:00:00 (Sun)
  63234874800, #    local_end 2004-10-31 03:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  63234835200, #    utc_start 2004-10-30 16:00:00 (Sat)
  63247536000, #      utc_end 2005-03-26 16:00:00 (Sat)
  63234871200, #  local_start 2004-10-31 02:00:00 (Sun)
  63247572000, #    local_end 2005-03-27 02:00:00 (Sun)
  36000,
  0,
  '+10',
      ],
      [
  63247536000, #    utc_start 2005-03-26 16:00:00 (Sat)
  63266284800, #      utc_end 2005-10-29 16:00:00 (Sat)
  63247575600, #  local_start 2005-03-27 03:00:00 (Sun)
  63266324400, #    local_end 2005-10-30 03:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  63266284800, #    utc_start 2005-10-29 16:00:00 (Sat)
  63278985600, #      utc_end 2006-03-25 16:00:00 (Sat)
  63266320800, #  local_start 2005-10-30 02:00:00 (Sun)
  63279021600, #    local_end 2006-03-26 02:00:00 (Sun)
  36000,
  0,
  '+10',
      ],
      [
  63278985600, #    utc_start 2006-03-25 16:00:00 (Sat)
  63297734400, #      utc_end 2006-10-28 16:00:00 (Sat)
  63279025200, #  local_start 2006-03-26 03:00:00 (Sun)
  63297774000, #    local_end 2006-10-29 03:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  63297734400, #    utc_start 2006-10-28 16:00:00 (Sat)
  63310435200, #      utc_end 2007-03-24 16:00:00 (Sat)
  63297770400, #  local_start 2006-10-29 02:00:00 (Sun)
  63310471200, #    local_end 2007-03-25 02:00:00 (Sun)
  36000,
  0,
  '+10',
      ],
      [
  63310435200, #    utc_start 2007-03-24 16:00:00 (Sat)
  63329184000, #      utc_end 2007-10-27 16:00:00 (Sat)
  63310474800, #  local_start 2007-03-25 03:00:00 (Sun)
  63329223600, #    local_end 2007-10-28 03:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  63329184000, #    utc_start 2007-10-27 16:00:00 (Sat)
  63342489600, #      utc_end 2008-03-29 16:00:00 (Sat)
  63329220000, #  local_start 2007-10-28 02:00:00 (Sun)
  63342525600, #    local_end 2008-03-30 02:00:00 (Sun)
  36000,
  0,
  '+10',
      ],
      [
  63342489600, #    utc_start 2008-03-29 16:00:00 (Sat)
  63360633600, #      utc_end 2008-10-25 16:00:00 (Sat)
  63342529200, #  local_start 2008-03-30 03:00:00 (Sun)
  63360673200, #    local_end 2008-10-26 03:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  63360633600, #    utc_start 2008-10-25 16:00:00 (Sat)
  63373939200, #      utc_end 2009-03-28 16:00:00 (Sat)
  63360669600, #  local_start 2008-10-26 02:00:00 (Sun)
  63373975200, #    local_end 2009-03-29 02:00:00 (Sun)
  36000,
  0,
  '+10',
      ],
      [
  63373939200, #    utc_start 2009-03-28 16:00:00 (Sat)
  63392083200, #      utc_end 2009-10-24 16:00:00 (Sat)
  63373978800, #  local_start 2009-03-29 03:00:00 (Sun)
  63392122800, #    local_end 2009-10-25 03:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  63392083200, #    utc_start 2009-10-24 16:00:00 (Sat)
  63405388800, #      utc_end 2010-03-27 16:00:00 (Sat)
  63392119200, #  local_start 2009-10-25 02:00:00 (Sun)
  63405424800, #    local_end 2010-03-28 02:00:00 (Sun)
  36000,
  0,
  '+10',
      ],
      [
  63405388800, #    utc_start 2010-03-27 16:00:00 (Sat)
  63424137600, #      utc_end 2010-10-30 16:00:00 (Sat)
  63405428400, #  local_start 2010-03-28 03:00:00 (Sun)
  63424177200, #    local_end 2010-10-31 03:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  63424137600, #    utc_start 2010-10-30 16:00:00 (Sat)
  63436838400, #      utc_end 2011-03-26 16:00:00 (Sat)
  63424173600, #  local_start 2010-10-31 02:00:00 (Sun)
  63436874400, #    local_end 2011-03-27 02:00:00 (Sun)
  36000,
  0,
  '+10',
      ],
      [
  63436838400, #    utc_start 2011-03-26 16:00:00 (Sat)
  63451515600, #      utc_end 2011-09-12 13:00:00 (Mon)
  63436878000, #  local_start 2011-03-27 03:00:00 (Sun)
  63451555200, #    local_end 2011-09-13 00:00:00 (Tue)
  39600,
  0,
  '+11',
      ],
      [
  63451515600, #    utc_start 2011-09-12 13:00:00 (Mon)
  63549936000, #      utc_end 2014-10-25 16:00:00 (Sat)
  63451551600, #  local_start 2011-09-12 23:00:00 (Mon)
  63549972000, #    local_end 2014-10-26 02:00:00 (Sun)
  36000,
  0,
  '+10',
      ],
      [
  63549936000, #    utc_start 2014-10-25 16:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  63549968400, #  local_start 2014-10-26 01:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  32400,
  0,
  '+09',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {30}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_KHANDYGA

    $main::fatpacked{"DateTime/TimeZone/Asia/Kolkata.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_KOLKATA';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/asia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Kolkata;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Kolkata::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  58490445992, #      utc_end 1854-06-27 18:06:32 (Tue)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  58490467200, #    local_end 1854-06-28 00:00:00 (Wed)
  21208,
  0,
  'LMT',
      ],
      [
  58490445992, #    utc_start 1854-06-27 18:06:32 (Tue)
  58979988400, #      utc_end 1869-12-31 18:06:40 (Fri)
  58490467192, #  local_start 1854-06-27 23:59:52 (Tue)
  58980009600, #    local_end 1870-01-01 00:00:00 (Sat)
  21200,
  0,
  'HMT',
      ],
      [
  58979988400, #    utc_start 1869-12-31 18:06:40 (Fri)
  60115977530, #      utc_end 1905-12-31 18:38:50 (Sun)
  58980007670, #  local_start 1869-12-31 23:27:50 (Fri)
  60115996800, #    local_end 1906-01-01 00:00:00 (Mon)
  19270,
  0,
  'MMT',
      ],
      [
  60115977530, #    utc_start 1905-12-31 18:38:50 (Sun)
  61244101800, #      utc_end 1941-09-30 18:30:00 (Tue)
  60115997330, #  local_start 1906-01-01 00:08:50 (Mon)
  61244121600, #    local_end 1941-10-01 00:00:00 (Wed)
  19800,
  0,
  'IST',
      ],
      [
  61244101800, #    utc_start 1941-09-30 18:30:00 (Tue)
  61263624600, #      utc_end 1942-05-14 17:30:00 (Thu)
  61244125200, #  local_start 1941-10-01 01:00:00 (Wed)
  61263648000, #    local_end 1942-05-15 00:00:00 (Fri)
  23400,
  1,
  '+0630',
      ],
      [
  61263624600, #    utc_start 1942-05-14 17:30:00 (Thu)
  61273045800, #      utc_end 1942-08-31 18:30:00 (Mon)
  61263644400, #  local_start 1942-05-14 23:00:00 (Thu)
  61273065600, #    local_end 1942-09-01 00:00:00 (Tue)
  19800,
  0,
  'IST',
      ],
      [
  61273045800, #    utc_start 1942-08-31 18:30:00 (Mon)
  61371538200, #      utc_end 1945-10-14 17:30:00 (Sun)
  61273069200, #  local_start 1942-09-01 01:00:00 (Tue)
  61371561600, #    local_end 1945-10-15 00:00:00 (Mon)
  23400,
  1,
  '+0630',
      ],
      [
  61371538200, #    utc_start 1945-10-14 17:30:00 (Sun)
  DateTime::TimeZone::INFINITY, #      utc_end
  61371558000, #  local_start 1945-10-14 23:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  19800,
  0,
  'IST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {2}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_KOLKATA

    $main::fatpacked{"DateTime/TimeZone/Asia/Krasnoyarsk.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_KRASNOYARSK';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Krasnoyarsk;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Krasnoyarsk::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60558169714, #      utc_end 1920-01-05 17:48:34 (Mon)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60558192000, #    local_end 1920-01-06 00:00:00 (Tue)
  22286,
  0,
  'LMT',
      ],
      [
  60558169714, #    utc_start 1920-01-05 17:48:34 (Mon)
  60888132000, #      utc_end 1930-06-20 18:00:00 (Fri)
  60558191314, #  local_start 1920-01-05 23:48:34 (Mon)
  60888153600, #    local_end 1930-06-21 00:00:00 (Sat)
  21600,
  0,
  '+06',
      ],
      [
  60888132000, #    utc_start 1930-06-20 18:00:00 (Fri)
  62490589200, #      utc_end 1981-03-31 17:00:00 (Tue)
  60888157200, #  local_start 1930-06-21 01:00:00 (Sat)
  62490614400, #    local_end 1981-04-01 00:00:00 (Wed)
  25200,
  0,
  '+07',
      ],
      [
  62490589200, #    utc_start 1981-03-31 17:00:00 (Tue)
  62506396800, #      utc_end 1981-09-30 16:00:00 (Wed)
  62490618000, #  local_start 1981-04-01 01:00:00 (Wed)
  62506425600, #    local_end 1981-10-01 00:00:00 (Thu)
  28800,
  1,
  '+08',
      ],
      [
  62506396800, #    utc_start 1981-09-30 16:00:00 (Wed)
  62522125200, #      utc_end 1982-03-31 17:00:00 (Wed)
  62506422000, #  local_start 1981-09-30 23:00:00 (Wed)
  62522150400, #    local_end 1982-04-01 00:00:00 (Thu)
  25200,
  0,
  '+07',
      ],
      [
  62522125200, #    utc_start 1982-03-31 17:00:00 (Wed)
  62537932800, #      utc_end 1982-09-30 16:00:00 (Thu)
  62522154000, #  local_start 1982-04-01 01:00:00 (Thu)
  62537961600, #    local_end 1982-10-01 00:00:00 (Fri)
  28800,
  1,
  '+08',
      ],
      [
  62537932800, #    utc_start 1982-09-30 16:00:00 (Thu)
  62553661200, #      utc_end 1983-03-31 17:00:00 (Thu)
  62537958000, #  local_start 1982-09-30 23:00:00 (Thu)
  62553686400, #    local_end 1983-04-01 00:00:00 (Fri)
  25200,
  0,
  '+07',
      ],
      [
  62553661200, #    utc_start 1983-03-31 17:00:00 (Thu)
  62569468800, #      utc_end 1983-09-30 16:00:00 (Fri)
  62553690000, #  local_start 1983-04-01 01:00:00 (Fri)
  62569497600, #    local_end 1983-10-01 00:00:00 (Sat)
  28800,
  1,
  '+08',
      ],
      [
  62569468800, #    utc_start 1983-09-30 16:00:00 (Fri)
  62585283600, #      utc_end 1984-03-31 17:00:00 (Sat)
  62569494000, #  local_start 1983-09-30 23:00:00 (Fri)
  62585308800, #    local_end 1984-04-01 00:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62585283600, #    utc_start 1984-03-31 17:00:00 (Sat)
  62601015600, #      utc_end 1984-09-29 19:00:00 (Sat)
  62585312400, #  local_start 1984-04-01 01:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62601015600, #    utc_start 1984-09-29 19:00:00 (Sat)
  62616740400, #      utc_end 1985-03-30 19:00:00 (Sat)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62616740400, #    utc_start 1985-03-30 19:00:00 (Sat)
  62632465200, #      utc_end 1985-09-28 19:00:00 (Sat)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62632465200, #    utc_start 1985-09-28 19:00:00 (Sat)
  62648190000, #      utc_end 1986-03-29 19:00:00 (Sat)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62648190000, #    utc_start 1986-03-29 19:00:00 (Sat)
  62663914800, #      utc_end 1986-09-27 19:00:00 (Sat)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62663914800, #    utc_start 1986-09-27 19:00:00 (Sat)
  62679639600, #      utc_end 1987-03-28 19:00:00 (Sat)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62679639600, #    utc_start 1987-03-28 19:00:00 (Sat)
  62695364400, #      utc_end 1987-09-26 19:00:00 (Sat)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62695364400, #    utc_start 1987-09-26 19:00:00 (Sat)
  62711089200, #      utc_end 1988-03-26 19:00:00 (Sat)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62711089200, #    utc_start 1988-03-26 19:00:00 (Sat)
  62726814000, #      utc_end 1988-09-24 19:00:00 (Sat)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62726814000, #    utc_start 1988-09-24 19:00:00 (Sat)
  62742538800, #      utc_end 1989-03-25 19:00:00 (Sat)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62742538800, #    utc_start 1989-03-25 19:00:00 (Sat)
  62758263600, #      utc_end 1989-09-23 19:00:00 (Sat)
  62742567600, #  local_start 1989-03-26 03:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62758263600, #    utc_start 1989-09-23 19:00:00 (Sat)
  62773988400, #      utc_end 1990-03-24 19:00:00 (Sat)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62773988400, #    utc_start 1990-03-24 19:00:00 (Sat)
  62790318000, #      utc_end 1990-09-29 19:00:00 (Sat)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62790318000, #    utc_start 1990-09-29 19:00:00 (Sat)
  62806042800, #      utc_end 1991-03-30 19:00:00 (Sat)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62806042800, #    utc_start 1991-03-30 19:00:00 (Sat)
  62821771200, #      utc_end 1991-09-28 20:00:00 (Sat)
  62806068000, #  local_start 1991-03-31 02:00:00 (Sun)
  62821796400, #    local_end 1991-09-29 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  62821771200, #    utc_start 1991-09-28 20:00:00 (Sat)
  62831448000, #      utc_end 1992-01-18 20:00:00 (Sat)
  62821792800, #  local_start 1991-09-29 02:00:00 (Sun)
  62831469600, #    local_end 1992-01-19 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  62831448000, #    utc_start 1992-01-18 20:00:00 (Sat)
  62837492400, #      utc_end 1992-03-28 19:00:00 (Sat)
  62831473200, #  local_start 1992-01-19 03:00:00 (Sun)
  62837517600, #    local_end 1992-03-29 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62837492400, #    utc_start 1992-03-28 19:00:00 (Sat)
  62853217200, #      utc_end 1992-09-26 19:00:00 (Sat)
  62837521200, #  local_start 1992-03-29 03:00:00 (Sun)
  62853246000, #    local_end 1992-09-27 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62853217200, #    utc_start 1992-09-26 19:00:00 (Sat)
  62868942000, #      utc_end 1993-03-27 19:00:00 (Sat)
  62853242400, #  local_start 1992-09-27 02:00:00 (Sun)
  62868967200, #    local_end 1993-03-28 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62868942000, #    utc_start 1993-03-27 19:00:00 (Sat)
  62884666800, #      utc_end 1993-09-25 19:00:00 (Sat)
  62868970800, #  local_start 1993-03-28 03:00:00 (Sun)
  62884695600, #    local_end 1993-09-26 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62884666800, #    utc_start 1993-09-25 19:00:00 (Sat)
  62900391600, #      utc_end 1994-03-26 19:00:00 (Sat)
  62884692000, #  local_start 1993-09-26 02:00:00 (Sun)
  62900416800, #    local_end 1994-03-27 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62900391600, #    utc_start 1994-03-26 19:00:00 (Sat)
  62916116400, #      utc_end 1994-09-24 19:00:00 (Sat)
  62900420400, #  local_start 1994-03-27 03:00:00 (Sun)
  62916145200, #    local_end 1994-09-25 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62916116400, #    utc_start 1994-09-24 19:00:00 (Sat)
  62931841200, #      utc_end 1995-03-25 19:00:00 (Sat)
  62916141600, #  local_start 1994-09-25 02:00:00 (Sun)
  62931866400, #    local_end 1995-03-26 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62931841200, #    utc_start 1995-03-25 19:00:00 (Sat)
  62947566000, #      utc_end 1995-09-23 19:00:00 (Sat)
  62931870000, #  local_start 1995-03-26 03:00:00 (Sun)
  62947594800, #    local_end 1995-09-24 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62947566000, #    utc_start 1995-09-23 19:00:00 (Sat)
  62963895600, #      utc_end 1996-03-30 19:00:00 (Sat)
  62947591200, #  local_start 1995-09-24 02:00:00 (Sun)
  62963920800, #    local_end 1996-03-31 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62963895600, #    utc_start 1996-03-30 19:00:00 (Sat)
  62982039600, #      utc_end 1996-10-26 19:00:00 (Sat)
  62963924400, #  local_start 1996-03-31 03:00:00 (Sun)
  62982068400, #    local_end 1996-10-27 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62982039600, #    utc_start 1996-10-26 19:00:00 (Sat)
  62995345200, #      utc_end 1997-03-29 19:00:00 (Sat)
  62982064800, #  local_start 1996-10-27 02:00:00 (Sun)
  62995370400, #    local_end 1997-03-30 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62995345200, #    utc_start 1997-03-29 19:00:00 (Sat)
  63013489200, #      utc_end 1997-10-25 19:00:00 (Sat)
  62995374000, #  local_start 1997-03-30 03:00:00 (Sun)
  63013518000, #    local_end 1997-10-26 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  63013489200, #    utc_start 1997-10-25 19:00:00 (Sat)
  63026794800, #      utc_end 1998-03-28 19:00:00 (Sat)
  63013514400, #  local_start 1997-10-26 02:00:00 (Sun)
  63026820000, #    local_end 1998-03-29 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  63026794800, #    utc_start 1998-03-28 19:00:00 (Sat)
  63044938800, #      utc_end 1998-10-24 19:00:00 (Sat)
  63026823600, #  local_start 1998-03-29 03:00:00 (Sun)
  63044967600, #    local_end 1998-10-25 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  63044938800, #    utc_start 1998-10-24 19:00:00 (Sat)
  63058244400, #      utc_end 1999-03-27 19:00:00 (Sat)
  63044964000, #  local_start 1998-10-25 02:00:00 (Sun)
  63058269600, #    local_end 1999-03-28 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  63058244400, #    utc_start 1999-03-27 19:00:00 (Sat)
  63076993200, #      utc_end 1999-10-30 19:00:00 (Sat)
  63058273200, #  local_start 1999-03-28 03:00:00 (Sun)
  63077022000, #    local_end 1999-10-31 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  63076993200, #    utc_start 1999-10-30 19:00:00 (Sat)
  63089694000, #      utc_end 2000-03-25 19:00:00 (Sat)
  63077018400, #  local_start 1999-10-31 02:00:00 (Sun)
  63089719200, #    local_end 2000-03-26 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  63089694000, #    utc_start 2000-03-25 19:00:00 (Sat)
  63108442800, #      utc_end 2000-10-28 19:00:00 (Sat)
  63089722800, #  local_start 2000-03-26 03:00:00 (Sun)
  63108471600, #    local_end 2000-10-29 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  63108442800, #    utc_start 2000-10-28 19:00:00 (Sat)
  63121143600, #      utc_end 2001-03-24 19:00:00 (Sat)
  63108468000, #  local_start 2000-10-29 02:00:00 (Sun)
  63121168800, #    local_end 2001-03-25 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  63121143600, #    utc_start 2001-03-24 19:00:00 (Sat)
  63139892400, #      utc_end 2001-10-27 19:00:00 (Sat)
  63121172400, #  local_start 2001-03-25 03:00:00 (Sun)
  63139921200, #    local_end 2001-10-28 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  63139892400, #    utc_start 2001-10-27 19:00:00 (Sat)
  63153198000, #      utc_end 2002-03-30 19:00:00 (Sat)
  63139917600, #  local_start 2001-10-28 02:00:00 (Sun)
  63153223200, #    local_end 2002-03-31 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  63153198000, #    utc_start 2002-03-30 19:00:00 (Sat)
  63171342000, #      utc_end 2002-10-26 19:00:00 (Sat)
  63153226800, #  local_start 2002-03-31 03:00:00 (Sun)
  63171370800, #    local_end 2002-10-27 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  63171342000, #    utc_start 2002-10-26 19:00:00 (Sat)
  63184647600, #      utc_end 2003-03-29 19:00:00 (Sat)
  63171367200, #  local_start 2002-10-27 02:00:00 (Sun)
  63184672800, #    local_end 2003-03-30 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  63184647600, #    utc_start 2003-03-29 19:00:00 (Sat)
  63202791600, #      utc_end 2003-10-25 19:00:00 (Sat)
  63184676400, #  local_start 2003-03-30 03:00:00 (Sun)
  63202820400, #    local_end 2003-10-26 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  63202791600, #    utc_start 2003-10-25 19:00:00 (Sat)
  63216097200, #      utc_end 2004-03-27 19:00:00 (Sat)
  63202816800, #  local_start 2003-10-26 02:00:00 (Sun)
  63216122400, #    local_end 2004-03-28 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  63216097200, #    utc_start 2004-03-27 19:00:00 (Sat)
  63234846000, #      utc_end 2004-10-30 19:00:00 (Sat)
  63216126000, #  local_start 2004-03-28 03:00:00 (Sun)
  63234874800, #    local_end 2004-10-31 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  63234846000, #    utc_start 2004-10-30 19:00:00 (Sat)
  63247546800, #      utc_end 2005-03-26 19:00:00 (Sat)
  63234871200, #  local_start 2004-10-31 02:00:00 (Sun)
  63247572000, #    local_end 2005-03-27 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  63247546800, #    utc_start 2005-03-26 19:00:00 (Sat)
  63266295600, #      utc_end 2005-10-29 19:00:00 (Sat)
  63247575600, #  local_start 2005-03-27 03:00:00 (Sun)
  63266324400, #    local_end 2005-10-30 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  63266295600, #    utc_start 2005-10-29 19:00:00 (Sat)
  63278996400, #      utc_end 2006-03-25 19:00:00 (Sat)
  63266320800, #  local_start 2005-10-30 02:00:00 (Sun)
  63279021600, #    local_end 2006-03-26 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  63278996400, #    utc_start 2006-03-25 19:00:00 (Sat)
  63297745200, #      utc_end 2006-10-28 19:00:00 (Sat)
  63279025200, #  local_start 2006-03-26 03:00:00 (Sun)
  63297774000, #    local_end 2006-10-29 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  63297745200, #    utc_start 2006-10-28 19:00:00 (Sat)
  63310446000, #      utc_end 2007-03-24 19:00:00 (Sat)
  63297770400, #  local_start 2006-10-29 02:00:00 (Sun)
  63310471200, #    local_end 2007-03-25 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  63310446000, #    utc_start 2007-03-24 19:00:00 (Sat)
  63329194800, #      utc_end 2007-10-27 19:00:00 (Sat)
  63310474800, #  local_start 2007-03-25 03:00:00 (Sun)
  63329223600, #    local_end 2007-10-28 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  63329194800, #    utc_start 2007-10-27 19:00:00 (Sat)
  63342500400, #      utc_end 2008-03-29 19:00:00 (Sat)
  63329220000, #  local_start 2007-10-28 02:00:00 (Sun)
  63342525600, #    local_end 2008-03-30 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  63342500400, #    utc_start 2008-03-29 19:00:00 (Sat)
  63360644400, #      utc_end 2008-10-25 19:00:00 (Sat)
  63342529200, #  local_start 2008-03-30 03:00:00 (Sun)
  63360673200, #    local_end 2008-10-26 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  63360644400, #    utc_start 2008-10-25 19:00:00 (Sat)
  63373950000, #      utc_end 2009-03-28 19:00:00 (Sat)
  63360669600, #  local_start 2008-10-26 02:00:00 (Sun)
  63373975200, #    local_end 2009-03-29 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  63373950000, #    utc_start 2009-03-28 19:00:00 (Sat)
  63392094000, #      utc_end 2009-10-24 19:00:00 (Sat)
  63373978800, #  local_start 2009-03-29 03:00:00 (Sun)
  63392122800, #    local_end 2009-10-25 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  63392094000, #    utc_start 2009-10-24 19:00:00 (Sat)
  63405399600, #      utc_end 2010-03-27 19:00:00 (Sat)
  63392119200, #  local_start 2009-10-25 02:00:00 (Sun)
  63405424800, #    local_end 2010-03-28 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  63405399600, #    utc_start 2010-03-27 19:00:00 (Sat)
  63424148400, #      utc_end 2010-10-30 19:00:00 (Sat)
  63405428400, #  local_start 2010-03-28 03:00:00 (Sun)
  63424177200, #    local_end 2010-10-31 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  63424148400, #    utc_start 2010-10-30 19:00:00 (Sat)
  63436849200, #      utc_end 2011-03-26 19:00:00 (Sat)
  63424173600, #  local_start 2010-10-31 02:00:00 (Sun)
  63436874400, #    local_end 2011-03-27 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  63436849200, #    utc_start 2011-03-26 19:00:00 (Sat)
  63549943200, #      utc_end 2014-10-25 18:00:00 (Sat)
  63436878000, #  local_start 2011-03-27 03:00:00 (Sun)
  63549972000, #    local_end 2014-10-26 02:00:00 (Sun)
  28800,
  0,
  '+08',
      ],
      [
  63549943200, #    utc_start 2014-10-25 18:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  63549968400, #  local_start 2014-10-26 01:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  25200,
  0,
  '+07',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {30}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_KRASNOYARSK

    $main::fatpacked{"DateTime/TimeZone/Asia/Kuala_Lumpur.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_KUALA_LUMPUR';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/asia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Kuala_Lumpur;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Kuala_Lumpur::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59958205994, #      utc_end 1900-12-31 17:13:14 (Mon)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59958230400, #    local_end 1901-01-01 00:00:00 (Tue)
  24406,
  0,
  'LMT',
      ],
      [
  59958205994, #    utc_start 1900-12-31 17:13:14 (Mon)
  60097482275, #      utc_end 1905-05-31 17:04:35 (Wed)
  59958230919, #  local_start 1901-01-01 00:08:39 (Tue)
  60097507200, #    local_end 1905-06-01 00:00:00 (Thu)
  24925,
  0,
  'SMT',
      ],
      [
  60097482275, #    utc_start 1905-05-31 17:04:35 (Wed)
  60968048400, #      utc_end 1932-12-31 17:00:00 (Sat)
  60097507475, #  local_start 1905-06-01 00:04:35 (Thu)
  60968073600, #    local_end 1933-01-01 00:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  60968048400, #    utc_start 1932-12-31 17:00:00 (Sat)
  61062655200, #      utc_end 1935-12-31 16:40:00 (Tue)
  60968074800, #  local_start 1933-01-01 00:20:00 (Sun)
  61062681600, #    local_end 1936-01-01 00:00:00 (Wed)
  26400,
  1,
  '+0720',
      ],
      [
  61062655200, #    utc_start 1935-12-31 16:40:00 (Tue)
  61241503200, #      utc_end 1941-08-31 16:40:00 (Sun)
  61062681600, #  local_start 1936-01-01 00:00:00 (Wed)
  61241529600, #    local_end 1941-09-01 00:00:00 (Mon)
  26400,
  0,
  '+0720',
      ],
      [
  61241503200, #    utc_start 1941-08-31 16:40:00 (Sun)
  61256017800, #      utc_end 1942-02-15 16:30:00 (Sun)
  61241530200, #  local_start 1941-09-01 00:10:00 (Mon)
  61256044800, #    local_end 1942-02-16 00:00:00 (Mon)
  27000,
  0,
  '+0730',
      ],
      [
  61256017800, #    utc_start 1942-02-15 16:30:00 (Sun)
  61368678000, #      utc_end 1945-09-11 15:00:00 (Tue)
  61256050200, #  local_start 1942-02-16 01:30:00 (Mon)
  61368710400, #    local_end 1945-09-12 00:00:00 (Wed)
  32400,
  0,
  '+09',
      ],
      [
  61368678000, #    utc_start 1945-09-11 15:00:00 (Tue)
  62514347400, #      utc_end 1981-12-31 16:30:00 (Thu)
  61368705000, #  local_start 1945-09-11 22:30:00 (Tue)
  62514374400, #    local_end 1982-01-01 00:00:00 (Fri)
  27000,
  0,
  '+0730',
      ],
      [
  62514347400, #    utc_start 1981-12-31 16:30:00 (Thu)
  DateTime::TimeZone::INFINITY, #      utc_end
  62514376200, #  local_start 1982-01-01 00:30:00 (Fri)
  DateTime::TimeZone::INFINITY, #    local_end
  28800,
  0,
  '+08',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {1}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_KUALA_LUMPUR

    $main::fatpacked{"DateTime/TimeZone/Asia/Kuching.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_KUCHING';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/asia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Kuching;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Kuching::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60752219920, #      utc_end 1926-02-28 16:38:40 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60752246400, #    local_end 1926-03-01 00:00:00 (Mon)
  26480,
  0,
  'LMT',
      ],
      [
  60752219920, #    utc_start 1926-02-28 16:38:40 (Sun)
  60968046600, #      utc_end 1932-12-31 16:30:00 (Sat)
  60752246920, #  local_start 1926-03-01 00:08:40 (Mon)
  60968073600, #    local_end 1933-01-01 00:00:00 (Sun)
  27000,
  0,
  '+0730',
      ],
      [
  60968046600, #    utc_start 1932-12-31 16:30:00 (Sat)
  61053235200, #      utc_end 1935-09-13 16:00:00 (Fri)
  60968075400, #  local_start 1933-01-01 00:30:00 (Sun)
  61053264000, #    local_end 1935-09-14 00:00:00 (Sat)
  28800,
  0,
  '+08',
      ],
      [
  61053235200, #    utc_start 1935-09-13 16:00:00 (Fri)
  61061096400, #      utc_end 1935-12-13 15:40:00 (Fri)
  61053265200, #  local_start 1935-09-14 00:20:00 (Sat)
  61061126400, #    local_end 1935-12-14 00:00:00 (Sat)
  30000,
  1,
  '+0820',
      ],
      [
  61061096400, #    utc_start 1935-12-13 15:40:00 (Fri)
  61084857600, #      utc_end 1936-09-13 16:00:00 (Sun)
  61061125200, #  local_start 1935-12-13 23:40:00 (Fri)
  61084886400, #    local_end 1936-09-14 00:00:00 (Mon)
  28800,
  0,
  '+08',
      ],
      [
  61084857600, #    utc_start 1936-09-13 16:00:00 (Sun)
  61092718800, #      utc_end 1936-12-13 15:40:00 (Sun)
  61084887600, #  local_start 1936-09-14 00:20:00 (Mon)
  61092748800, #    local_end 1936-12-14 00:00:00 (Mon)
  30000,
  1,
  '+0820',
      ],
      [
  61092718800, #    utc_start 1936-12-13 15:40:00 (Sun)
  61116393600, #      utc_end 1937-09-13 16:00:00 (Mon)
  61092747600, #  local_start 1936-12-13 23:40:00 (Sun)
  61116422400, #    local_end 1937-09-14 00:00:00 (Tue)
  28800,
  0,
  '+08',
      ],
      [
  61116393600, #    utc_start 1937-09-13 16:00:00 (Mon)
  61124254800, #      utc_end 1937-12-13 15:40:00 (Mon)
  61116423600, #  local_start 1937-09-14 00:20:00 (Tue)
  61124284800, #    local_end 1937-12-14 00:00:00 (Tue)
  30000,
  1,
  '+0820',
      ],
      [
  61124254800, #    utc_start 1937-12-13 15:40:00 (Mon)
  61147929600, #      utc_end 1938-09-13 16:00:00 (Tue)
  61124283600, #  local_start 1937-12-13 23:40:00 (Mon)
  61147958400, #    local_end 1938-09-14 00:00:00 (Wed)
  28800,
  0,
  '+08',
      ],
      [
  61147929600, #    utc_start 1938-09-13 16:00:00 (Tue)
  61155790800, #      utc_end 1938-12-13 15:40:00 (Tue)
  61147959600, #  local_start 1938-09-14 00:20:00 (Wed)
  61155820800, #    local_end 1938-12-14 00:00:00 (Wed)
  30000,
  1,
  '+0820',
      ],
      [
  61155790800, #    utc_start 1938-12-13 15:40:00 (Tue)
  61179465600, #      utc_end 1939-09-13 16:00:00 (Wed)
  61155819600, #  local_start 1938-12-13 23:40:00 (Tue)
  61179494400, #    local_end 1939-09-14 00:00:00 (Thu)
  28800,
  0,
  '+08',
      ],
      [
  61179465600, #    utc_start 1939-09-13 16:00:00 (Wed)
  61187326800, #      utc_end 1939-12-13 15:40:00 (Wed)
  61179495600, #  local_start 1939-09-14 00:20:00 (Thu)
  61187356800, #    local_end 1939-12-14 00:00:00 (Thu)
  30000,
  1,
  '+0820',
      ],
      [
  61187326800, #    utc_start 1939-12-13 15:40:00 (Wed)
  61211088000, #      utc_end 1940-09-13 16:00:00 (Fri)
  61187355600, #  local_start 1939-12-13 23:40:00 (Wed)
  61211116800, #    local_end 1940-09-14 00:00:00 (Sat)
  28800,
  0,
  '+08',
      ],
      [
  61211088000, #    utc_start 1940-09-13 16:00:00 (Fri)
  61218949200, #      utc_end 1940-12-13 15:40:00 (Fri)
  61211118000, #  local_start 1940-09-14 00:20:00 (Sat)
  61218979200, #    local_end 1940-12-14 00:00:00 (Sat)
  30000,
  1,
  '+0820',
      ],
      [
  61218949200, #    utc_start 1940-12-13 15:40:00 (Fri)
  61242624000, #      utc_end 1941-09-13 16:00:00 (Sat)
  61218978000, #  local_start 1940-12-13 23:40:00 (Fri)
  61242652800, #    local_end 1941-09-14 00:00:00 (Sun)
  28800,
  0,
  '+08',
      ],
      [
  61242624000, #    utc_start 1941-09-13 16:00:00 (Sat)
  61250485200, #      utc_end 1941-12-13 15:40:00 (Sat)
  61242654000, #  local_start 1941-09-14 00:20:00 (Sun)
  61250515200, #    local_end 1941-12-14 00:00:00 (Sun)
  30000,
  1,
  '+0820',
      ],
      [
  61250485200, #    utc_start 1941-12-13 15:40:00 (Sat)
  61256016000, #      utc_end 1942-02-15 16:00:00 (Sun)
  61250514000, #  local_start 1941-12-13 23:40:00 (Sat)
  61256044800, #    local_end 1942-02-16 00:00:00 (Mon)
  28800,
  0,
  '+08',
      ],
      [
  61256016000, #    utc_start 1942-02-15 16:00:00 (Sun)
  61368678000, #      utc_end 1945-09-11 15:00:00 (Tue)
  61256048400, #  local_start 1942-02-16 01:00:00 (Mon)
  61368710400, #    local_end 1945-09-12 00:00:00 (Wed)
  32400,
  0,
  '+09',
      ],
      [
  61368678000, #    utc_start 1945-09-11 15:00:00 (Tue)
  DateTime::TimeZone::INFINITY, #      utc_end
  61368706800, #  local_start 1945-09-11 23:00:00 (Tue)
  DateTime::TimeZone::INFINITY, #    local_end
  28800,
  0,
  '+08',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {7}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_KUCHING

    $main::fatpacked{"DateTime/TimeZone/Asia/Macau.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_MACAU';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/asia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Macau;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Macau::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60078990350, #      utc_end 1904-10-29 16:25:50 (Sat)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60079017600, #    local_end 1904-10-30 00:00:00 (Sun)
  27250,
  0,
  'LMT',
      ],
      [
  60078990350, #    utc_start 1904-10-29 16:25:50 (Sat)
  61251174000, #      utc_end 1941-12-21 15:00:00 (Sun)
  60079019150, #  local_start 1904-10-30 00:25:50 (Sun)
  61251202800, #    local_end 1941-12-21 23:00:00 (Sun)
  28800,
  0,
  'CST',
      ],
      [
  61251174000, #    utc_start 1941-12-21 15:00:00 (Sun)
  61262402400, #      utc_end 1942-04-30 14:00:00 (Thu)
  61251206400, #  local_start 1941-12-22 00:00:00 (Mon)
  61262434800, #    local_end 1942-04-30 23:00:00 (Thu)
  32400,
  0,
  '+09',
      ],
      [
  61262402400, #    utc_start 1942-04-30 14:00:00 (Thu)
  61279765200, #      utc_end 1942-11-17 13:00:00 (Tue)
  61262438400, #  local_start 1942-05-01 00:00:00 (Fri)
  61279801200, #    local_end 1942-11-17 23:00:00 (Tue)
  36000,
  1,
  '+10',
      ],
      [
  61279765200, #    utc_start 1942-11-17 13:00:00 (Tue)
  61293938400, #      utc_end 1943-04-30 14:00:00 (Fri)
  61279797600, #  local_start 1942-11-17 22:00:00 (Tue)
  61293970800, #    local_end 1943-04-30 23:00:00 (Fri)
  32400,
  0,
  '+09',
      ],
      [
  61293938400, #    utc_start 1943-04-30 14:00:00 (Fri)
  61307154000, #      utc_end 1943-09-30 13:00:00 (Thu)
  61293974400, #  local_start 1943-05-01 00:00:00 (Sat)
  61307190000, #    local_end 1943-09-30 23:00:00 (Thu)
  36000,
  1,
  '+10',
      ],
      [
  61307154000, #    utc_start 1943-09-30 13:00:00 (Thu)
  61370319600, #      utc_end 1945-09-30 15:00:00 (Sun)
  61307186400, #  local_start 1943-09-30 22:00:00 (Thu)
  61370352000, #    local_end 1945-10-01 00:00:00 (Mon)
  32400,
  0,
  '+09',
      ],
      [
  61370319600, #    utc_start 1945-09-30 15:00:00 (Sun)
  61388636400, #      utc_end 1946-04-30 15:00:00 (Tue)
  61370348400, #  local_start 1945-09-30 23:00:00 (Sun)
  61388665200, #    local_end 1946-04-30 23:00:00 (Tue)
  28800,
  0,
  'CST',
      ],
      [
  61388636400, #    utc_start 1946-04-30 15:00:00 (Tue)
  61401855600, #      utc_end 1946-09-30 15:00:00 (Mon)
  61388668800, #  local_start 1946-05-01 00:00:00 (Wed)
  61401888000, #    local_end 1946-10-01 00:00:00 (Tue)
  32400,
  1,
  'CDT',
      ],
      [
  61401855600, #    utc_start 1946-09-30 15:00:00 (Mon)
  61419222000, #      utc_end 1947-04-19 15:00:00 (Sat)
  61401884400, #  local_start 1946-09-30 23:00:00 (Mon)
  61419250800, #    local_end 1947-04-19 23:00:00 (Sat)
  28800,
  0,
  'CST',
      ],
      [
  61419222000, #    utc_start 1947-04-19 15:00:00 (Sat)
  61438662000, #      utc_end 1947-11-30 15:00:00 (Sun)
  61419254400, #  local_start 1947-04-20 00:00:00 (Sun)
  61438694400, #    local_end 1947-12-01 00:00:00 (Mon)
  32400,
  1,
  'CDT',
      ],
      [
  61438662000, #    utc_start 1947-11-30 15:00:00 (Sun)
  61451967600, #      utc_end 1948-05-02 15:00:00 (Sun)
  61438690800, #  local_start 1947-11-30 23:00:00 (Sun)
  61451996400, #    local_end 1948-05-02 23:00:00 (Sun)
  28800,
  0,
  'CST',
      ],
      [
  61451967600, #    utc_start 1948-05-02 15:00:00 (Sun)
  61467692400, #      utc_end 1948-10-31 15:00:00 (Sun)
  61452000000, #  local_start 1948-05-03 00:00:00 (Mon)
  61467724800, #    local_end 1948-11-01 00:00:00 (Mon)
  32400,
  1,
  'CDT',
      ],
      [
  61467692400, #    utc_start 1948-10-31 15:00:00 (Sun)
  61480911600, #      utc_end 1949-04-02 15:00:00 (Sat)
  61467721200, #  local_start 1948-10-31 23:00:00 (Sun)
  61480940400, #    local_end 1949-04-02 23:00:00 (Sat)
  28800,
  0,
  'CST',
      ],
      [
  61480911600, #    utc_start 1949-04-02 15:00:00 (Sat)
  61499055600, #      utc_end 1949-10-29 15:00:00 (Sat)
  61480944000, #  local_start 1949-04-03 00:00:00 (Sun)
  61499088000, #    local_end 1949-10-30 00:00:00 (Sun)
  32400,
  1,
  'CDT',
      ],
      [
  61499055600, #    utc_start 1949-10-29 15:00:00 (Sat)
  61512361200, #      utc_end 1950-04-01 15:00:00 (Sat)
  61499084400, #  local_start 1949-10-29 23:00:00 (Sat)
  61512390000, #    local_end 1950-04-01 23:00:00 (Sat)
  28800,
  0,
  'CST',
      ],
      [
  61512361200, #    utc_start 1950-04-01 15:00:00 (Sat)
  61530505200, #      utc_end 1950-10-28 15:00:00 (Sat)
  61512393600, #  local_start 1950-04-02 00:00:00 (Sun)
  61530537600, #    local_end 1950-10-29 00:00:00 (Sun)
  32400,
  1,
  'CDT',
      ],
      [
  61530505200, #    utc_start 1950-10-28 15:00:00 (Sat)
  61543810800, #      utc_end 1951-03-31 15:00:00 (Sat)
  61530534000, #  local_start 1950-10-28 23:00:00 (Sat)
  61543839600, #    local_end 1951-03-31 23:00:00 (Sat)
  28800,
  0,
  'CST',
      ],
      [
  61543810800, #    utc_start 1951-03-31 15:00:00 (Sat)
  61562041200, #      utc_end 1951-10-28 15:00:00 (Sun)
  61543843200, #  local_start 1951-04-01 00:00:00 (Sun)
  61562073600, #    local_end 1951-10-29 00:00:00 (Mon)
  32400,
  1,
  'CDT',
      ],
      [
  61562041200, #    utc_start 1951-10-28 15:00:00 (Sun)
  61575865200, #      utc_end 1952-04-05 15:00:00 (Sat)
  61562070000, #  local_start 1951-10-28 23:00:00 (Sun)
  61575894000, #    local_end 1952-04-05 23:00:00 (Sat)
  28800,
  0,
  'CST',
      ],
      [
  61575865200, #    utc_start 1952-04-05 15:00:00 (Sat)
  61594009200, #      utc_end 1952-11-01 15:00:00 (Sat)
  61575897600, #  local_start 1952-04-06 00:00:00 (Sun)
  61594041600, #    local_end 1952-11-02 00:00:00 (Sun)
  32400,
  1,
  'CDT',
      ],
      [
  61594009200, #    utc_start 1952-11-01 15:00:00 (Sat)
  61607314800, #      utc_end 1953-04-04 15:00:00 (Sat)
  61594038000, #  local_start 1952-11-01 23:00:00 (Sat)
  61607343600, #    local_end 1953-04-04 23:00:00 (Sat)
  28800,
  0,
  'CST',
      ],
      [
  61607314800, #    utc_start 1953-04-04 15:00:00 (Sat)
  61625458800, #      utc_end 1953-10-31 15:00:00 (Sat)
  61607347200, #  local_start 1953-04-05 00:00:00 (Sun)
  61625491200, #    local_end 1953-11-01 00:00:00 (Sun)
  32400,
  1,
  'CDT',
      ],
      [
  61625458800, #    utc_start 1953-10-31 15:00:00 (Sat)
  61637554800, #      utc_end 1954-03-20 15:00:00 (Sat)
  61625487600, #  local_start 1953-10-31 23:00:00 (Sat)
  61637583600, #    local_end 1954-03-20 23:00:00 (Sat)
  28800,
  0,
  'CST',
      ],
      [
  61637554800, #    utc_start 1954-03-20 15:00:00 (Sat)
  61656908400, #      utc_end 1954-10-30 15:00:00 (Sat)
  61637587200, #  local_start 1954-03-21 00:00:00 (Sun)
  61656940800, #    local_end 1954-10-31 00:00:00 (Sun)
  32400,
  1,
  'CDT',
      ],
      [
  61656908400, #    utc_start 1954-10-30 15:00:00 (Sat)
  61669004400, #      utc_end 1955-03-19 15:00:00 (Sat)
  61656937200, #  local_start 1954-10-30 23:00:00 (Sat)
  61669033200, #    local_end 1955-03-19 23:00:00 (Sat)
  28800,
  0,
  'CST',
      ],
      [
  61669004400, #    utc_start 1955-03-19 15:00:00 (Sat)
  61688962800, #      utc_end 1955-11-05 15:00:00 (Sat)
  61669036800, #  local_start 1955-03-20 00:00:00 (Sun)
  61688995200, #    local_end 1955-11-06 00:00:00 (Sun)
  32400,
  1,
  'CDT',
      ],
      [
  61688962800, #    utc_start 1955-11-05 15:00:00 (Sat)
  61700454000, #      utc_end 1956-03-17 15:00:00 (Sat)
  61688991600, #  local_start 1955-11-05 23:00:00 (Sat)
  61700482800, #    local_end 1956-03-17 23:00:00 (Sat)
  28800,
  0,
  'CST',
      ],
      [
  61700454000, #    utc_start 1956-03-17 15:00:00 (Sat)
  61720425000, #      utc_end 1956-11-03 18:30:00 (Sat)
  61700486400, #  local_start 1956-03-18 00:00:00 (Sun)
  61720457400, #    local_end 1956-11-04 03:30:00 (Sun)
  32400,
  1,
  'CDT',
      ],
      [
  61720425000, #    utc_start 1956-11-03 18:30:00 (Sat)
  61732524600, #      utc_end 1957-03-23 19:30:00 (Sat)
  61720453800, #  local_start 1956-11-04 02:30:00 (Sun)
  61732553400, #    local_end 1957-03-24 03:30:00 (Sun)
  28800,
  0,
  'CST',
      ],
      [
  61732524600, #    utc_start 1957-03-23 19:30:00 (Sat)
  61751874600, #      utc_end 1957-11-02 18:30:00 (Sat)
  61732557000, #  local_start 1957-03-24 04:30:00 (Sun)
  61751907000, #    local_end 1957-11-03 03:30:00 (Sun)
  32400,
  1,
  'CDT',
      ],
      [
  61751874600, #    utc_start 1957-11-02 18:30:00 (Sat)
  61763974200, #      utc_end 1958-03-22 19:30:00 (Sat)
  61751903400, #  local_start 1957-11-03 02:30:00 (Sun)
  61764003000, #    local_end 1958-03-23 03:30:00 (Sun)
  28800,
  0,
  'CST',
      ],
      [
  61763974200, #    utc_start 1958-03-22 19:30:00 (Sat)
  61783324200, #      utc_end 1958-11-01 18:30:00 (Sat)
  61764006600, #  local_start 1958-03-23 04:30:00 (Sun)
  61783356600, #    local_end 1958-11-02 03:30:00 (Sun)
  32400,
  1,
  'CDT',
      ],
      [
  61783324200, #    utc_start 1958-11-01 18:30:00 (Sat)
  61795423800, #      utc_end 1959-03-21 19:30:00 (Sat)
  61783353000, #  local_start 1958-11-02 02:30:00 (Sun)
  61795452600, #    local_end 1959-03-22 03:30:00 (Sun)
  28800,
  0,
  'CST',
      ],
      [
  61795423800, #    utc_start 1959-03-21 19:30:00 (Sat)
  61814773800, #      utc_end 1959-10-31 18:30:00 (Sat)
  61795456200, #  local_start 1959-03-22 04:30:00 (Sun)
  61814806200, #    local_end 1959-11-01 03:30:00 (Sun)
  32400,
  1,
  'CDT',
      ],
      [
  61814773800, #    utc_start 1959-10-31 18:30:00 (Sat)
  61826873400, #      utc_end 1960-03-19 19:30:00 (Sat)
  61814802600, #  local_start 1959-11-01 02:30:00 (Sun)
  61826902200, #    local_end 1960-03-20 03:30:00 (Sun)
  28800,
  0,
  'CST',
      ],
      [
  61826873400, #    utc_start 1960-03-19 19:30:00 (Sat)
  61846828200, #      utc_end 1960-11-05 18:30:00 (Sat)
  61826905800, #  local_start 1960-03-20 04:30:00 (Sun)
  61846860600, #    local_end 1960-11-06 03:30:00 (Sun)
  32400,
  1,
  'CDT',
      ],
      [
  61846828200, #    utc_start 1960-11-05 18:30:00 (Sat)
  61858323000, #      utc_end 1961-03-18 19:30:00 (Sat)
  61846857000, #  local_start 1960-11-06 02:30:00 (Sun)
  61858351800, #    local_end 1961-03-19 03:30:00 (Sun)
  28800,
  0,
  'CST',
      ],
      [
  61858323000, #    utc_start 1961-03-18 19:30:00 (Sat)
  61878277800, #      utc_end 1961-11-04 18:30:00 (Sat)
  61858355400, #  local_start 1961-03-19 04:30:00 (Sun)
  61878310200, #    local_end 1961-11-05 03:30:00 (Sun)
  32400,
  1,
  'CDT',
      ],
      [
  61878277800, #    utc_start 1961-11-04 18:30:00 (Sat)
  61889772600, #      utc_end 1962-03-17 19:30:00 (Sat)
  61878306600, #  local_start 1961-11-05 02:30:00 (Sun)
  61889801400, #    local_end 1962-03-18 03:30:00 (Sun)
  28800,
  0,
  'CST',
      ],
      [
  61889772600, #    utc_start 1962-03-17 19:30:00 (Sat)
  61909727400, #      utc_end 1962-11-03 18:30:00 (Sat)
  61889805000, #  local_start 1962-03-18 04:30:00 (Sun)
  61909759800, #    local_end 1962-11-04 03:30:00 (Sun)
  32400,
  1,
  'CDT',
      ],
      [
  61909727400, #    utc_start 1962-11-03 18:30:00 (Sat)
  61921827000, #      utc_end 1963-03-23 19:30:00 (Sat)
  61909756200, #  local_start 1962-11-04 02:30:00 (Sun)
  61921855800, #    local_end 1963-03-24 03:30:00 (Sun)
  28800,
  0,
  'CST',
      ],
      [
  61921827000, #    utc_start 1963-03-23 19:30:00 (Sat)
  61941177000, #      utc_end 1963-11-02 18:30:00 (Sat)
  61921859400, #  local_start 1963-03-24 04:30:00 (Sun)
  61941209400, #    local_end 1963-11-03 03:30:00 (Sun)
  32400,
  1,
  'CDT',
      ],
      [
  61941177000, #    utc_start 1963-11-02 18:30:00 (Sat)
  61953276600, #      utc_end 1964-03-21 19:30:00 (Sat)
  61941205800, #  local_start 1963-11-03 02:30:00 (Sun)
  61953305400, #    local_end 1964-03-22 03:30:00 (Sun)
  28800,
  0,
  'CST',
      ],
      [
  61953276600, #    utc_start 1964-03-21 19:30:00 (Sat)
  61972626600, #      utc_end 1964-10-31 18:30:00 (Sat)
  61953309000, #  local_start 1964-03-22 04:30:00 (Sun)
  61972659000, #    local_end 1964-11-01 03:30:00 (Sun)
  32400,
  1,
  'CDT',
      ],
      [
  61972626600, #    utc_start 1964-10-31 18:30:00 (Sat)
  61987145400, #      utc_end 1965-04-17 19:30:00 (Sat)
  61972655400, #  local_start 1964-11-01 02:30:00 (Sun)
  61987174200, #    local_end 1965-04-18 03:30:00 (Sun)
  28800,
  0,
  'CST',
      ],
      [
  61987145400, #    utc_start 1965-04-17 19:30:00 (Sat)
  62002863000, #      utc_end 1965-10-16 17:30:00 (Sat)
  61987177800, #  local_start 1965-04-18 04:30:00 (Sun)
  62002895400, #    local_end 1965-10-17 02:30:00 (Sun)
  32400,
  1,
  'CDT',
      ],
      [
  62002863000, #    utc_start 1965-10-16 17:30:00 (Sat)
  62018595000, #      utc_end 1966-04-16 19:30:00 (Sat)
  62002891800, #  local_start 1965-10-17 01:30:00 (Sun)
  62018623800, #    local_end 1966-04-17 03:30:00 (Sun)
  28800,
  0,
  'CST',
      ],
      [
  62018595000, #    utc_start 1966-04-16 19:30:00 (Sat)
  62034312600, #      utc_end 1966-10-15 17:30:00 (Sat)
  62018627400, #  local_start 1966-04-17 04:30:00 (Sun)
  62034345000, #    local_end 1966-10-16 02:30:00 (Sun)
  32400,
  1,
  'CDT',
      ],
      [
  62034312600, #    utc_start 1966-10-15 17:30:00 (Sat)
  62050044600, #      utc_end 1967-04-15 19:30:00 (Sat)
  62034341400, #  local_start 1966-10-16 01:30:00 (Sun)
  62050073400, #    local_end 1967-04-16 03:30:00 (Sun)
  28800,
  0,
  'CST',
      ],
      [
  62050044600, #    utc_start 1967-04-15 19:30:00 (Sat)
  62066370600, #      utc_end 1967-10-21 18:30:00 (Sat)
  62050077000, #  local_start 1967-04-16 04:30:00 (Sun)
  62066403000, #    local_end 1967-10-22 03:30:00 (Sun)
  32400,
  1,
  'CDT',
      ],
      [
  62066370600, #    utc_start 1967-10-21 18:30:00 (Sat)
  62082099000, #      utc_end 1968-04-20 19:30:00 (Sat)
  62066399400, #  local_start 1967-10-22 02:30:00 (Sun)
  62082127800, #    local_end 1968-04-21 03:30:00 (Sun)
  28800,
  0,
  'CST',
      ],
      [
  62082099000, #    utc_start 1968-04-20 19:30:00 (Sat)
  62097820200, #      utc_end 1968-10-19 18:30:00 (Sat)
  62082131400, #  local_start 1968-04-21 04:30:00 (Sun)
  62097852600, #    local_end 1968-10-20 03:30:00 (Sun)
  32400,
  1,
  'CDT',
      ],
      [
  62097820200, #    utc_start 1968-10-19 18:30:00 (Sat)
  62113548600, #      utc_end 1969-04-19 19:30:00 (Sat)
  62097849000, #  local_start 1968-10-20 02:30:00 (Sun)
  62113577400, #    local_end 1969-04-20 03:30:00 (Sun)
  28800,
  0,
  'CST',
      ],
      [
  62113548600, #    utc_start 1969-04-19 19:30:00 (Sat)
  62129269800, #      utc_end 1969-10-18 18:30:00 (Sat)
  62113581000, #  local_start 1969-04-20 04:30:00 (Sun)
  62129302200, #    local_end 1969-10-19 03:30:00 (Sun)
  32400,
  1,
  'CDT',
      ],
      [
  62129269800, #    utc_start 1969-10-18 18:30:00 (Sat)
  62144998200, #      utc_end 1970-04-18 19:30:00 (Sat)
  62129298600, #  local_start 1969-10-19 02:30:00 (Sun)
  62145027000, #    local_end 1970-04-19 03:30:00 (Sun)
  28800,
  0,
  'CST',
      ],
      [
  62144998200, #    utc_start 1970-04-18 19:30:00 (Sat)
  62160719400, #      utc_end 1970-10-17 18:30:00 (Sat)
  62145030600, #  local_start 1970-04-19 04:30:00 (Sun)
  62160751800, #    local_end 1970-10-18 03:30:00 (Sun)
  32400,
  1,
  'CDT',
      ],
      [
  62160719400, #    utc_start 1970-10-17 18:30:00 (Sat)
  62176447800, #      utc_end 1971-04-17 19:30:00 (Sat)
  62160748200, #  local_start 1970-10-18 02:30:00 (Sun)
  62176476600, #    local_end 1971-04-18 03:30:00 (Sun)
  28800,
  0,
  'CST',
      ],
      [
  62176447800, #    utc_start 1971-04-17 19:30:00 (Sat)
  62192169000, #      utc_end 1971-10-16 18:30:00 (Sat)
  62176480200, #  local_start 1971-04-18 04:30:00 (Sun)
  62192201400, #    local_end 1971-10-17 03:30:00 (Sun)
  32400,
  1,
  'CDT',
      ],
      [
  62192169000, #    utc_start 1971-10-16 18:30:00 (Sat)
  62207897400, #      utc_end 1972-04-15 19:30:00 (Sat)
  62192197800, #  local_start 1971-10-17 02:30:00 (Sun)
  62207926200, #    local_end 1972-04-16 03:30:00 (Sun)
  28800,
  0,
  'CST',
      ],
      [
  62207897400, #    utc_start 1972-04-15 19:30:00 (Sat)
  62224223400, #      utc_end 1972-10-21 18:30:00 (Sat)
  62207929800, #  local_start 1972-04-16 04:30:00 (Sun)
  62224255800, #    local_end 1972-10-22 03:30:00 (Sun)
  32400,
  1,
  'CDT',
      ],
      [
  62224223400, #    utc_start 1972-10-21 18:30:00 (Sat)
  62239951800, #      utc_end 1973-04-21 19:30:00 (Sat)
  62224252200, #  local_start 1972-10-22 02:30:00 (Sun)
  62239980600, #    local_end 1973-04-22 03:30:00 (Sun)
  28800,
  0,
  'CST',
      ],
      [
  62239951800, #    utc_start 1973-04-21 19:30:00 (Sat)
  62255673000, #      utc_end 1973-10-20 18:30:00 (Sat)
  62239984200, #  local_start 1973-04-22 04:30:00 (Sun)
  62255705400, #    local_end 1973-10-21 03:30:00 (Sun)
  32400,
  1,
  'CDT',
      ],
      [
  62255673000, #    utc_start 1973-10-20 18:30:00 (Sat)
  62261724600, #      utc_end 1973-12-29 19:30:00 (Sat)
  62255701800, #  local_start 1973-10-21 02:30:00 (Sun)
  62261753400, #    local_end 1973-12-30 03:30:00 (Sun)
  28800,
  0,
  'CST',
      ],
      [
  62261724600, #    utc_start 1973-12-29 19:30:00 (Sat)
  62287122600, #      utc_end 1974-10-19 18:30:00 (Sat)
  62261757000, #  local_start 1973-12-30 04:30:00 (Sun)
  62287155000, #    local_end 1974-10-20 03:30:00 (Sun)
  32400,
  1,
  'CDT',
      ],
      [
  62287122600, #    utc_start 1974-10-19 18:30:00 (Sat)
  62302851000, #      utc_end 1975-04-19 19:30:00 (Sat)
  62287151400, #  local_start 1974-10-20 02:30:00 (Sun)
  62302879800, #    local_end 1975-04-20 03:30:00 (Sun)
  28800,
  0,
  'CST',
      ],
      [
  62302851000, #    utc_start 1975-04-19 19:30:00 (Sat)
  62318572200, #      utc_end 1975-10-18 18:30:00 (Sat)
  62302883400, #  local_start 1975-04-20 04:30:00 (Sun)
  62318604600, #    local_end 1975-10-19 03:30:00 (Sun)
  32400,
  1,
  'CDT',
      ],
      [
  62318572200, #    utc_start 1975-10-18 18:30:00 (Sat)
  62334300600, #      utc_end 1976-04-17 19:30:00 (Sat)
  62318601000, #  local_start 1975-10-19 02:30:00 (Sun)
  62334329400, #    local_end 1976-04-18 03:30:00 (Sun)
  28800,
  0,
  'CST',
      ],
      [
  62334300600, #    utc_start 1976-04-17 19:30:00 (Sat)
  62350021800, #      utc_end 1976-10-16 18:30:00 (Sat)
  62334333000, #  local_start 1976-04-18 04:30:00 (Sun)
  62350054200, #    local_end 1976-10-17 03:30:00 (Sun)
  32400,
  1,
  'CDT',
      ],
      [
  62350021800, #    utc_start 1976-10-16 18:30:00 (Sat)
  62431068600, #      utc_end 1979-05-12 19:30:00 (Sat)
  62350050600, #  local_start 1976-10-17 02:30:00 (Sun)
  62431097400, #    local_end 1979-05-13 03:30:00 (Sun)
  28800,
  0,
  'CST',
      ],
      [
  62431068600, #    utc_start 1979-05-12 19:30:00 (Sat)
  62444975400, #      utc_end 1979-10-20 18:30:00 (Sat)
  62431101000, #  local_start 1979-05-13 04:30:00 (Sun)
  62445007800, #    local_end 1979-10-21 03:30:00 (Sun)
  32400,
  1,
  'CDT',
      ],
      [
  62444975400, #    utc_start 1979-10-20 18:30:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  62445004200, #  local_start 1979-10-21 02:30:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  28800,
  0,
  'CST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {34}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_MACAU

    $main::fatpacked{"DateTime/TimeZone/Asia/Magadan.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_MAGADAN';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Magadan;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Magadan::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60694495008, #      utc_end 1924-05-01 13:56:48 (Thu)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60694531200, #    local_end 1924-05-02 00:00:00 (Fri)
  36192,
  0,
  'LMT',
      ],
      [
  60694495008, #    utc_start 1924-05-01 13:56:48 (Thu)
  60888117600, #      utc_end 1930-06-20 14:00:00 (Fri)
  60694531008, #  local_start 1924-05-01 23:56:48 (Thu)
  60888153600, #    local_end 1930-06-21 00:00:00 (Sat)
  36000,
  0,
  '+10',
      ],
      [
  60888117600, #    utc_start 1930-06-20 14:00:00 (Fri)
  62490574800, #      utc_end 1981-03-31 13:00:00 (Tue)
  60888157200, #  local_start 1930-06-21 01:00:00 (Sat)
  62490614400, #    local_end 1981-04-01 00:00:00 (Wed)
  39600,
  0,
  '+11',
      ],
      [
  62490574800, #    utc_start 1981-03-31 13:00:00 (Tue)
  62506382400, #      utc_end 1981-09-30 12:00:00 (Wed)
  62490618000, #  local_start 1981-04-01 01:00:00 (Wed)
  62506425600, #    local_end 1981-10-01 00:00:00 (Thu)
  43200,
  1,
  '+12',
      ],
      [
  62506382400, #    utc_start 1981-09-30 12:00:00 (Wed)
  62522110800, #      utc_end 1982-03-31 13:00:00 (Wed)
  62506422000, #  local_start 1981-09-30 23:00:00 (Wed)
  62522150400, #    local_end 1982-04-01 00:00:00 (Thu)
  39600,
  0,
  '+11',
      ],
      [
  62522110800, #    utc_start 1982-03-31 13:00:00 (Wed)
  62537918400, #      utc_end 1982-09-30 12:00:00 (Thu)
  62522154000, #  local_start 1982-04-01 01:00:00 (Thu)
  62537961600, #    local_end 1982-10-01 00:00:00 (Fri)
  43200,
  1,
  '+12',
      ],
      [
  62537918400, #    utc_start 1982-09-30 12:00:00 (Thu)
  62553646800, #      utc_end 1983-03-31 13:00:00 (Thu)
  62537958000, #  local_start 1982-09-30 23:00:00 (Thu)
  62553686400, #    local_end 1983-04-01 00:00:00 (Fri)
  39600,
  0,
  '+11',
      ],
      [
  62553646800, #    utc_start 1983-03-31 13:00:00 (Thu)
  62569454400, #      utc_end 1983-09-30 12:00:00 (Fri)
  62553690000, #  local_start 1983-04-01 01:00:00 (Fri)
  62569497600, #    local_end 1983-10-01 00:00:00 (Sat)
  43200,
  1,
  '+12',
      ],
      [
  62569454400, #    utc_start 1983-09-30 12:00:00 (Fri)
  62585269200, #      utc_end 1984-03-31 13:00:00 (Sat)
  62569494000, #  local_start 1983-09-30 23:00:00 (Fri)
  62585308800, #    local_end 1984-04-01 00:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62585269200, #    utc_start 1984-03-31 13:00:00 (Sat)
  62601001200, #      utc_end 1984-09-29 15:00:00 (Sat)
  62585312400, #  local_start 1984-04-01 01:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  62601001200, #    utc_start 1984-09-29 15:00:00 (Sat)
  62616726000, #      utc_end 1985-03-30 15:00:00 (Sat)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62616726000, #    utc_start 1985-03-30 15:00:00 (Sat)
  62632450800, #      utc_end 1985-09-28 15:00:00 (Sat)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  62632450800, #    utc_start 1985-09-28 15:00:00 (Sat)
  62648175600, #      utc_end 1986-03-29 15:00:00 (Sat)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62648175600, #    utc_start 1986-03-29 15:00:00 (Sat)
  62663900400, #      utc_end 1986-09-27 15:00:00 (Sat)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  62663900400, #    utc_start 1986-09-27 15:00:00 (Sat)
  62679625200, #      utc_end 1987-03-28 15:00:00 (Sat)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62679625200, #    utc_start 1987-03-28 15:00:00 (Sat)
  62695350000, #      utc_end 1987-09-26 15:00:00 (Sat)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  62695350000, #    utc_start 1987-09-26 15:00:00 (Sat)
  62711074800, #      utc_end 1988-03-26 15:00:00 (Sat)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62711074800, #    utc_start 1988-03-26 15:00:00 (Sat)
  62726799600, #      utc_end 1988-09-24 15:00:00 (Sat)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  62726799600, #    utc_start 1988-09-24 15:00:00 (Sat)
  62742524400, #      utc_end 1989-03-25 15:00:00 (Sat)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62742524400, #    utc_start 1989-03-25 15:00:00 (Sat)
  62758249200, #      utc_end 1989-09-23 15:00:00 (Sat)
  62742567600, #  local_start 1989-03-26 03:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  62758249200, #    utc_start 1989-09-23 15:00:00 (Sat)
  62773974000, #      utc_end 1990-03-24 15:00:00 (Sat)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62773974000, #    utc_start 1990-03-24 15:00:00 (Sat)
  62790303600, #      utc_end 1990-09-29 15:00:00 (Sat)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  62790303600, #    utc_start 1990-09-29 15:00:00 (Sat)
  62806028400, #      utc_end 1991-03-30 15:00:00 (Sat)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62806028400, #    utc_start 1991-03-30 15:00:00 (Sat)
  62821756800, #      utc_end 1991-09-28 16:00:00 (Sat)
  62806068000, #  local_start 1991-03-31 02:00:00 (Sun)
  62821796400, #    local_end 1991-09-29 03:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  62821756800, #    utc_start 1991-09-28 16:00:00 (Sat)
  62831433600, #      utc_end 1992-01-18 16:00:00 (Sat)
  62821792800, #  local_start 1991-09-29 02:00:00 (Sun)
  62831469600, #    local_end 1992-01-19 02:00:00 (Sun)
  36000,
  0,
  '+10',
      ],
      [
  62831433600, #    utc_start 1992-01-18 16:00:00 (Sat)
  62837478000, #      utc_end 1992-03-28 15:00:00 (Sat)
  62831473200, #  local_start 1992-01-19 03:00:00 (Sun)
  62837517600, #    local_end 1992-03-29 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62837478000, #    utc_start 1992-03-28 15:00:00 (Sat)
  62853202800, #      utc_end 1992-09-26 15:00:00 (Sat)
  62837521200, #  local_start 1992-03-29 03:00:00 (Sun)
  62853246000, #    local_end 1992-09-27 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  62853202800, #    utc_start 1992-09-26 15:00:00 (Sat)
  62868927600, #      utc_end 1993-03-27 15:00:00 (Sat)
  62853242400, #  local_start 1992-09-27 02:00:00 (Sun)
  62868967200, #    local_end 1993-03-28 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62868927600, #    utc_start 1993-03-27 15:00:00 (Sat)
  62884652400, #      utc_end 1993-09-25 15:00:00 (Sat)
  62868970800, #  local_start 1993-03-28 03:00:00 (Sun)
  62884695600, #    local_end 1993-09-26 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  62884652400, #    utc_start 1993-09-25 15:00:00 (Sat)
  62900377200, #      utc_end 1994-03-26 15:00:00 (Sat)
  62884692000, #  local_start 1993-09-26 02:00:00 (Sun)
  62900416800, #    local_end 1994-03-27 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62900377200, #    utc_start 1994-03-26 15:00:00 (Sat)
  62916102000, #      utc_end 1994-09-24 15:00:00 (Sat)
  62900420400, #  local_start 1994-03-27 03:00:00 (Sun)
  62916145200, #    local_end 1994-09-25 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  62916102000, #    utc_start 1994-09-24 15:00:00 (Sat)
  62931826800, #      utc_end 1995-03-25 15:00:00 (Sat)
  62916141600, #  local_start 1994-09-25 02:00:00 (Sun)
  62931866400, #    local_end 1995-03-26 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62931826800, #    utc_start 1995-03-25 15:00:00 (Sat)
  62947551600, #      utc_end 1995-09-23 15:00:00 (Sat)
  62931870000, #  local_start 1995-03-26 03:00:00 (Sun)
  62947594800, #    local_end 1995-09-24 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  62947551600, #    utc_start 1995-09-23 15:00:00 (Sat)
  62963881200, #      utc_end 1996-03-30 15:00:00 (Sat)
  62947591200, #  local_start 1995-09-24 02:00:00 (Sun)
  62963920800, #    local_end 1996-03-31 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62963881200, #    utc_start 1996-03-30 15:00:00 (Sat)
  62982025200, #      utc_end 1996-10-26 15:00:00 (Sat)
  62963924400, #  local_start 1996-03-31 03:00:00 (Sun)
  62982068400, #    local_end 1996-10-27 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  62982025200, #    utc_start 1996-10-26 15:00:00 (Sat)
  62995330800, #      utc_end 1997-03-29 15:00:00 (Sat)
  62982064800, #  local_start 1996-10-27 02:00:00 (Sun)
  62995370400, #    local_end 1997-03-30 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62995330800, #    utc_start 1997-03-29 15:00:00 (Sat)
  63013474800, #      utc_end 1997-10-25 15:00:00 (Sat)
  62995374000, #  local_start 1997-03-30 03:00:00 (Sun)
  63013518000, #    local_end 1997-10-26 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  63013474800, #    utc_start 1997-10-25 15:00:00 (Sat)
  63026780400, #      utc_end 1998-03-28 15:00:00 (Sat)
  63013514400, #  local_start 1997-10-26 02:00:00 (Sun)
  63026820000, #    local_end 1998-03-29 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  63026780400, #    utc_start 1998-03-28 15:00:00 (Sat)
  63044924400, #      utc_end 1998-10-24 15:00:00 (Sat)
  63026823600, #  local_start 1998-03-29 03:00:00 (Sun)
  63044967600, #    local_end 1998-10-25 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  63044924400, #    utc_start 1998-10-24 15:00:00 (Sat)
  63058230000, #      utc_end 1999-03-27 15:00:00 (Sat)
  63044964000, #  local_start 1998-10-25 02:00:00 (Sun)
  63058269600, #    local_end 1999-03-28 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  63058230000, #    utc_start 1999-03-27 15:00:00 (Sat)
  63076978800, #      utc_end 1999-10-30 15:00:00 (Sat)
  63058273200, #  local_start 1999-03-28 03:00:00 (Sun)
  63077022000, #    local_end 1999-10-31 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  63076978800, #    utc_start 1999-10-30 15:00:00 (Sat)
  63089679600, #      utc_end 2000-03-25 15:00:00 (Sat)
  63077018400, #  local_start 1999-10-31 02:00:00 (Sun)
  63089719200, #    local_end 2000-03-26 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  63089679600, #    utc_start 2000-03-25 15:00:00 (Sat)
  63108428400, #      utc_end 2000-10-28 15:00:00 (Sat)
  63089722800, #  local_start 2000-03-26 03:00:00 (Sun)
  63108471600, #    local_end 2000-10-29 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  63108428400, #    utc_start 2000-10-28 15:00:00 (Sat)
  63121129200, #      utc_end 2001-03-24 15:00:00 (Sat)
  63108468000, #  local_start 2000-10-29 02:00:00 (Sun)
  63121168800, #    local_end 2001-03-25 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  63121129200, #    utc_start 2001-03-24 15:00:00 (Sat)
  63139878000, #      utc_end 2001-10-27 15:00:00 (Sat)
  63121172400, #  local_start 2001-03-25 03:00:00 (Sun)
  63139921200, #    local_end 2001-10-28 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  63139878000, #    utc_start 2001-10-27 15:00:00 (Sat)
  63153183600, #      utc_end 2002-03-30 15:00:00 (Sat)
  63139917600, #  local_start 2001-10-28 02:00:00 (Sun)
  63153223200, #    local_end 2002-03-31 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  63153183600, #    utc_start 2002-03-30 15:00:00 (Sat)
  63171327600, #      utc_end 2002-10-26 15:00:00 (Sat)
  63153226800, #  local_start 2002-03-31 03:00:00 (Sun)
  63171370800, #    local_end 2002-10-27 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  63171327600, #    utc_start 2002-10-26 15:00:00 (Sat)
  63184633200, #      utc_end 2003-03-29 15:00:00 (Sat)
  63171367200, #  local_start 2002-10-27 02:00:00 (Sun)
  63184672800, #    local_end 2003-03-30 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  63184633200, #    utc_start 2003-03-29 15:00:00 (Sat)
  63202777200, #      utc_end 2003-10-25 15:00:00 (Sat)
  63184676400, #  local_start 2003-03-30 03:00:00 (Sun)
  63202820400, #    local_end 2003-10-26 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  63202777200, #    utc_start 2003-10-25 15:00:00 (Sat)
  63216082800, #      utc_end 2004-03-27 15:00:00 (Sat)
  63202816800, #  local_start 2003-10-26 02:00:00 (Sun)
  63216122400, #    local_end 2004-03-28 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  63216082800, #    utc_start 2004-03-27 15:00:00 (Sat)
  63234831600, #      utc_end 2004-10-30 15:00:00 (Sat)
  63216126000, #  local_start 2004-03-28 03:00:00 (Sun)
  63234874800, #    local_end 2004-10-31 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  63234831600, #    utc_start 2004-10-30 15:00:00 (Sat)
  63247532400, #      utc_end 2005-03-26 15:00:00 (Sat)
  63234871200, #  local_start 2004-10-31 02:00:00 (Sun)
  63247572000, #    local_end 2005-03-27 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  63247532400, #    utc_start 2005-03-26 15:00:00 (Sat)
  63266281200, #      utc_end 2005-10-29 15:00:00 (Sat)
  63247575600, #  local_start 2005-03-27 03:00:00 (Sun)
  63266324400, #    local_end 2005-10-30 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  63266281200, #    utc_start 2005-10-29 15:00:00 (Sat)
  63278982000, #      utc_end 2006-03-25 15:00:00 (Sat)
  63266320800, #  local_start 2005-10-30 02:00:00 (Sun)
  63279021600, #    local_end 2006-03-26 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  63278982000, #    utc_start 2006-03-25 15:00:00 (Sat)
  63297730800, #      utc_end 2006-10-28 15:00:00 (Sat)
  63279025200, #  local_start 2006-03-26 03:00:00 (Sun)
  63297774000, #    local_end 2006-10-29 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  63297730800, #    utc_start 2006-10-28 15:00:00 (Sat)
  63310431600, #      utc_end 2007-03-24 15:00:00 (Sat)
  63297770400, #  local_start 2006-10-29 02:00:00 (Sun)
  63310471200, #    local_end 2007-03-25 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  63310431600, #    utc_start 2007-03-24 15:00:00 (Sat)
  63329180400, #      utc_end 2007-10-27 15:00:00 (Sat)
  63310474800, #  local_start 2007-03-25 03:00:00 (Sun)
  63329223600, #    local_end 2007-10-28 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  63329180400, #    utc_start 2007-10-27 15:00:00 (Sat)
  63342486000, #      utc_end 2008-03-29 15:00:00 (Sat)
  63329220000, #  local_start 2007-10-28 02:00:00 (Sun)
  63342525600, #    local_end 2008-03-30 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  63342486000, #    utc_start 2008-03-29 15:00:00 (Sat)
  63360630000, #      utc_end 2008-10-25 15:00:00 (Sat)
  63342529200, #  local_start 2008-03-30 03:00:00 (Sun)
  63360673200, #    local_end 2008-10-26 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  63360630000, #    utc_start 2008-10-25 15:00:00 (Sat)
  63373935600, #      utc_end 2009-03-28 15:00:00 (Sat)
  63360669600, #  local_start 2008-10-26 02:00:00 (Sun)
  63373975200, #    local_end 2009-03-29 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  63373935600, #    utc_start 2009-03-28 15:00:00 (Sat)
  63392079600, #      utc_end 2009-10-24 15:00:00 (Sat)
  63373978800, #  local_start 2009-03-29 03:00:00 (Sun)
  63392122800, #    local_end 2009-10-25 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  63392079600, #    utc_start 2009-10-24 15:00:00 (Sat)
  63405385200, #      utc_end 2010-03-27 15:00:00 (Sat)
  63392119200, #  local_start 2009-10-25 02:00:00 (Sun)
  63405424800, #    local_end 2010-03-28 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  63405385200, #    utc_start 2010-03-27 15:00:00 (Sat)
  63424134000, #      utc_end 2010-10-30 15:00:00 (Sat)
  63405428400, #  local_start 2010-03-28 03:00:00 (Sun)
  63424177200, #    local_end 2010-10-31 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  63424134000, #    utc_start 2010-10-30 15:00:00 (Sat)
  63436834800, #      utc_end 2011-03-26 15:00:00 (Sat)
  63424173600, #  local_start 2010-10-31 02:00:00 (Sun)
  63436874400, #    local_end 2011-03-27 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  63436834800, #    utc_start 2011-03-26 15:00:00 (Sat)
  63549928800, #      utc_end 2014-10-25 14:00:00 (Sat)
  63436878000, #  local_start 2011-03-27 03:00:00 (Sun)
  63549972000, #    local_end 2014-10-26 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  63549928800, #    utc_start 2014-10-25 14:00:00 (Sat)
  63597110400, #      utc_end 2016-04-23 16:00:00 (Sat)
  63549964800, #  local_start 2014-10-26 00:00:00 (Sun)
  63597146400, #    local_end 2016-04-24 02:00:00 (Sun)
  36000,
  0,
  '+10',
      ],
      [
  63597110400, #    utc_start 2016-04-23 16:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  63597150000, #  local_start 2016-04-24 03:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  39600,
  0,
  '+11',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {30}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_MAGADAN

    $main::fatpacked{"DateTime/TimeZone/Asia/Makassar.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_MAKASSAR';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/asia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Makassar;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Makassar::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60557731344, #      utc_end 1919-12-31 16:02:24 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60557760000, #    local_end 1920-01-01 00:00:00 (Thu)
  28656,
  0,
  'LMT',
      ],
      [
  60557731344, #    utc_start 1919-12-31 16:02:24 (Wed)
  60962774544, #      utc_end 1932-10-31 16:02:24 (Mon)
  60557760000, #  local_start 1920-01-01 00:00:00 (Thu)
  60962803200, #    local_end 1932-11-01 00:00:00 (Tue)
  28656,
  0,
  'MMT',
      ],
      [
  60962774544, #    utc_start 1932-10-31 16:02:24 (Mon)
  61255411200, #      utc_end 1942-02-08 16:00:00 (Sun)
  60962803344, #  local_start 1932-11-01 00:02:24 (Tue)
  61255440000, #    local_end 1942-02-09 00:00:00 (Mon)
  28800,
  0,
  '+08',
      ],
      [
  61255411200, #    utc_start 1942-02-08 16:00:00 (Sun)
  61369628400, #      utc_end 1945-09-22 15:00:00 (Sat)
  61255443600, #  local_start 1942-02-09 01:00:00 (Mon)
  61369660800, #    local_end 1945-09-23 00:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  61369628400, #    utc_start 1945-09-22 15:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  61369657200, #  local_start 1945-09-22 23:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #    local_end
  28800,
  0,
  'WITA',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_MAKASSAR

    $main::fatpacked{"DateTime/TimeZone/Asia/Manila.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_MANILA';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/asia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Manila;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Manila::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  58191062160, #      utc_end 1844-12-31 15:56:00 (Tue)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  58191004800, #    local_end 1844-12-31 00:00:00 (Tue)
  -57360,
  0,
  'LMT',
      ],
      [
  58191062160, #    utc_start 1844-12-31 15:56:00 (Tue)
  59906361360, #      utc_end 1899-05-10 15:56:00 (Wed)
  58191091200, #  local_start 1845-01-01 00:00:00 (Wed)
  59906390400, #    local_end 1899-05-11 00:00:00 (Thu)
  29040,
  0,
  'LMT',
      ],
      [
  59906361360, #    utc_start 1899-05-10 15:56:00 (Wed)
  61089004800, #      utc_end 1936-10-31 16:00:00 (Sat)
  59906390160, #  local_start 1899-05-10 23:56:00 (Wed)
  61089033600, #    local_end 1936-11-01 00:00:00 (Sun)
  28800,
  0,
  'PST',
      ],
      [
  61089004800, #    utc_start 1936-10-31 16:00:00 (Sat)
  61096950000, #      utc_end 1937-01-31 15:00:00 (Sun)
  61089037200, #  local_start 1936-11-01 01:00:00 (Sun)
  61096982400, #    local_end 1937-02-01 00:00:00 (Mon)
  32400,
  1,
  'PDT',
      ],
      [
  61096950000, #    utc_start 1937-01-31 15:00:00 (Sun)
  61262409600, #      utc_end 1942-04-30 16:00:00 (Thu)
  61096978800, #  local_start 1937-01-31 23:00:00 (Sun)
  61262438400, #    local_end 1942-05-01 00:00:00 (Fri)
  28800,
  0,
  'PST',
      ],
      [
  61262409600, #    utc_start 1942-04-30 16:00:00 (Thu)
  61341462000, #      utc_end 1944-10-31 15:00:00 (Tue)
  61262442000, #  local_start 1942-05-01 01:00:00 (Fri)
  61341494400, #    local_end 1944-11-01 00:00:00 (Wed)
  32400,
  0,
  'JST',
      ],
      [
  61341462000, #    utc_start 1944-10-31 15:00:00 (Tue)
  61639459200, #      utc_end 1954-04-11 16:00:00 (Sun)
  61341490800, #  local_start 1944-10-31 23:00:00 (Tue)
  61639488000, #    local_end 1954-04-12 00:00:00 (Mon)
  28800,
  0,
  'PST',
      ],
      [
  61639459200, #    utc_start 1954-04-11 16:00:00 (Sun)
  61646367600, #      utc_end 1954-06-30 15:00:00 (Wed)
  61639491600, #  local_start 1954-04-12 01:00:00 (Mon)
  61646400000, #    local_end 1954-07-01 00:00:00 (Thu)
  32400,
  1,
  'PDT',
      ],
      [
  61646367600, #    utc_start 1954-06-30 15:00:00 (Wed)
  62395027200, #      utc_end 1978-03-21 16:00:00 (Tue)
  61646396400, #  local_start 1954-06-30 23:00:00 (Wed)
  62395056000, #    local_end 1978-03-22 00:00:00 (Wed)
  28800,
  0,
  'PST',
      ],
      [
  62395027200, #    utc_start 1978-03-21 16:00:00 (Tue)
  62410834800, #      utc_end 1978-09-20 15:00:00 (Wed)
  62395059600, #  local_start 1978-03-22 01:00:00 (Wed)
  62410867200, #    local_end 1978-09-21 00:00:00 (Thu)
  32400,
  1,
  'PDT',
      ],
      [
  62410834800, #    utc_start 1978-09-20 15:00:00 (Wed)
  DateTime::TimeZone::INFINITY, #      utc_end
  62410863600, #  local_start 1978-09-20 23:00:00 (Wed)
  DateTime::TimeZone::INFINITY, #    local_end
  28800,
  0,
  'PST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {3}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_MANILA

    $main::fatpacked{"DateTime/TimeZone/Asia/Nicosia.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_NICOSIA';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/asia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Nicosia;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Nicosia::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60616763192, #      utc_end 1921-11-13 21:46:32 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60616771200, #    local_end 1921-11-14 00:00:00 (Mon)
  8008,
  0,
  'LMT',
      ],
      [
  60616763192, #    utc_start 1921-11-13 21:46:32 (Sun)
  62302255200, #      utc_end 1975-04-12 22:00:00 (Sat)
  60616770392, #  local_start 1921-11-13 23:46:32 (Sun)
  62302262400, #    local_end 1975-04-13 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62302255200, #    utc_start 1975-04-12 22:00:00 (Sat)
  62317976400, #      utc_end 1975-10-11 21:00:00 (Sat)
  62302266000, #  local_start 1975-04-13 01:00:00 (Sun)
  62317987200, #    local_end 1975-10-12 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62317976400, #    utc_start 1975-10-11 21:00:00 (Sat)
  62336642400, #      utc_end 1976-05-14 22:00:00 (Fri)
  62317983600, #  local_start 1975-10-11 23:00:00 (Sat)
  62336649600, #    local_end 1976-05-15 00:00:00 (Sat)
  7200,
  0,
  'EET',
      ],
      [
  62336642400, #    utc_start 1976-05-14 22:00:00 (Fri)
  62349512400, #      utc_end 1976-10-10 21:00:00 (Sun)
  62336653200, #  local_start 1976-05-15 01:00:00 (Sat)
  62349523200, #    local_end 1976-10-11 00:00:00 (Mon)
  10800,
  1,
  'EEST',
      ],
      [
  62349512400, #    utc_start 1976-10-10 21:00:00 (Sun)
  62364549600, #      utc_end 1977-04-02 22:00:00 (Sat)
  62349519600, #  local_start 1976-10-10 23:00:00 (Sun)
  62364556800, #    local_end 1977-04-03 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62364549600, #    utc_start 1977-04-02 22:00:00 (Sat)
  62379666000, #      utc_end 1977-09-24 21:00:00 (Sat)
  62364560400, #  local_start 1977-04-03 01:00:00 (Sun)
  62379676800, #    local_end 1977-09-25 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62379666000, #    utc_start 1977-09-24 21:00:00 (Sat)
  62395999200, #      utc_end 1978-04-01 22:00:00 (Sat)
  62379673200, #  local_start 1977-09-24 23:00:00 (Sat)
  62396006400, #    local_end 1978-04-02 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62395999200, #    utc_start 1978-04-01 22:00:00 (Sat)
  62411806800, #      utc_end 1978-10-01 21:00:00 (Sun)
  62396010000, #  local_start 1978-04-02 01:00:00 (Sun)
  62411817600, #    local_end 1978-10-02 00:00:00 (Mon)
  10800,
  1,
  'EEST',
      ],
      [
  62411806800, #    utc_start 1978-10-01 21:00:00 (Sun)
  62427448800, #      utc_end 1979-03-31 22:00:00 (Sat)
  62411814000, #  local_start 1978-10-01 23:00:00 (Sun)
  62427456000, #    local_end 1979-04-01 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62427448800, #    utc_start 1979-03-31 22:00:00 (Sat)
  62443170000, #      utc_end 1979-09-29 21:00:00 (Sat)
  62427459600, #  local_start 1979-04-01 01:00:00 (Sun)
  62443180800, #    local_end 1979-09-30 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62443170000, #    utc_start 1979-09-29 21:00:00 (Sat)
  62459503200, #      utc_end 1980-04-05 22:00:00 (Sat)
  62443177200, #  local_start 1979-09-29 23:00:00 (Sat)
  62459510400, #    local_end 1980-04-06 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62459503200, #    utc_start 1980-04-05 22:00:00 (Sat)
  62474619600, #      utc_end 1980-09-27 21:00:00 (Sat)
  62459514000, #  local_start 1980-04-06 01:00:00 (Sun)
  62474630400, #    local_end 1980-09-28 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62474619600, #    utc_start 1980-09-27 21:00:00 (Sat)
  62490348000, #      utc_end 1981-03-28 22:00:00 (Sat)
  62474626800, #  local_start 1980-09-27 23:00:00 (Sat)
  62490355200, #    local_end 1981-03-29 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62490348000, #    utc_start 1981-03-28 22:00:00 (Sat)
  62506069200, #      utc_end 1981-09-26 21:00:00 (Sat)
  62490358800, #  local_start 1981-03-29 01:00:00 (Sun)
  62506080000, #    local_end 1981-09-27 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62506069200, #    utc_start 1981-09-26 21:00:00 (Sat)
  62521797600, #      utc_end 1982-03-27 22:00:00 (Sat)
  62506076400, #  local_start 1981-09-26 23:00:00 (Sat)
  62521804800, #    local_end 1982-03-28 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62521797600, #    utc_start 1982-03-27 22:00:00 (Sat)
  62537518800, #      utc_end 1982-09-25 21:00:00 (Sat)
  62521808400, #  local_start 1982-03-28 01:00:00 (Sun)
  62537529600, #    local_end 1982-09-26 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62537518800, #    utc_start 1982-09-25 21:00:00 (Sat)
  62553247200, #      utc_end 1983-03-26 22:00:00 (Sat)
  62537526000, #  local_start 1982-09-25 23:00:00 (Sat)
  62553254400, #    local_end 1983-03-27 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62553247200, #    utc_start 1983-03-26 22:00:00 (Sat)
  62568968400, #      utc_end 1983-09-24 21:00:00 (Sat)
  62553258000, #  local_start 1983-03-27 01:00:00 (Sun)
  62568979200, #    local_end 1983-09-25 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62568968400, #    utc_start 1983-09-24 21:00:00 (Sat)
  62584696800, #      utc_end 1984-03-24 22:00:00 (Sat)
  62568975600, #  local_start 1983-09-24 23:00:00 (Sat)
  62584704000, #    local_end 1984-03-25 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62584696800, #    utc_start 1984-03-24 22:00:00 (Sat)
  62601022800, #      utc_end 1984-09-29 21:00:00 (Sat)
  62584707600, #  local_start 1984-03-25 01:00:00 (Sun)
  62601033600, #    local_end 1984-09-30 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62601022800, #    utc_start 1984-09-29 21:00:00 (Sat)
  62616751200, #      utc_end 1985-03-30 22:00:00 (Sat)
  62601030000, #  local_start 1984-09-29 23:00:00 (Sat)
  62616758400, #    local_end 1985-03-31 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62616751200, #    utc_start 1985-03-30 22:00:00 (Sat)
  62632472400, #      utc_end 1985-09-28 21:00:00 (Sat)
  62616762000, #  local_start 1985-03-31 01:00:00 (Sun)
  62632483200, #    local_end 1985-09-29 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62632472400, #    utc_start 1985-09-28 21:00:00 (Sat)
  62648200800, #      utc_end 1986-03-29 22:00:00 (Sat)
  62632479600, #  local_start 1985-09-28 23:00:00 (Sat)
  62648208000, #    local_end 1986-03-30 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62648200800, #    utc_start 1986-03-29 22:00:00 (Sat)
  62663922000, #      utc_end 1986-09-27 21:00:00 (Sat)
  62648211600, #  local_start 1986-03-30 01:00:00 (Sun)
  62663932800, #    local_end 1986-09-28 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62663922000, #    utc_start 1986-09-27 21:00:00 (Sat)
  62679650400, #      utc_end 1987-03-28 22:00:00 (Sat)
  62663929200, #  local_start 1986-09-27 23:00:00 (Sat)
  62679657600, #    local_end 1987-03-29 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62679650400, #    utc_start 1987-03-28 22:00:00 (Sat)
  62695371600, #      utc_end 1987-09-26 21:00:00 (Sat)
  62679661200, #  local_start 1987-03-29 01:00:00 (Sun)
  62695382400, #    local_end 1987-09-27 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62695371600, #    utc_start 1987-09-26 21:00:00 (Sat)
  62711100000, #      utc_end 1988-03-26 22:00:00 (Sat)
  62695378800, #  local_start 1987-09-26 23:00:00 (Sat)
  62711107200, #    local_end 1988-03-27 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62711100000, #    utc_start 1988-03-26 22:00:00 (Sat)
  62726821200, #      utc_end 1988-09-24 21:00:00 (Sat)
  62711110800, #  local_start 1988-03-27 01:00:00 (Sun)
  62726832000, #    local_end 1988-09-25 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62726821200, #    utc_start 1988-09-24 21:00:00 (Sat)
  62742549600, #      utc_end 1989-03-25 22:00:00 (Sat)
  62726828400, #  local_start 1988-09-24 23:00:00 (Sat)
  62742556800, #    local_end 1989-03-26 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62742549600, #    utc_start 1989-03-25 22:00:00 (Sat)
  62758270800, #      utc_end 1989-09-23 21:00:00 (Sat)
  62742560400, #  local_start 1989-03-26 01:00:00 (Sun)
  62758281600, #    local_end 1989-09-24 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62758270800, #    utc_start 1989-09-23 21:00:00 (Sat)
  62773999200, #      utc_end 1990-03-24 22:00:00 (Sat)
  62758278000, #  local_start 1989-09-23 23:00:00 (Sat)
  62774006400, #    local_end 1990-03-25 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62773999200, #    utc_start 1990-03-24 22:00:00 (Sat)
  62790325200, #      utc_end 1990-09-29 21:00:00 (Sat)
  62774010000, #  local_start 1990-03-25 01:00:00 (Sun)
  62790336000, #    local_end 1990-09-30 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62790325200, #    utc_start 1990-09-29 21:00:00 (Sat)
  62806053600, #      utc_end 1991-03-30 22:00:00 (Sat)
  62790332400, #  local_start 1990-09-29 23:00:00 (Sat)
  62806060800, #    local_end 1991-03-31 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62806053600, #    utc_start 1991-03-30 22:00:00 (Sat)
  62821774800, #      utc_end 1991-09-28 21:00:00 (Sat)
  62806064400, #  local_start 1991-03-31 01:00:00 (Sun)
  62821785600, #    local_end 1991-09-29 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62821774800, #    utc_start 1991-09-28 21:00:00 (Sat)
  62837503200, #      utc_end 1992-03-28 22:00:00 (Sat)
  62821782000, #  local_start 1991-09-28 23:00:00 (Sat)
  62837510400, #    local_end 1992-03-29 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62837503200, #    utc_start 1992-03-28 22:00:00 (Sat)
  62853224400, #      utc_end 1992-09-26 21:00:00 (Sat)
  62837514000, #  local_start 1992-03-29 01:00:00 (Sun)
  62853235200, #    local_end 1992-09-27 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62853224400, #    utc_start 1992-09-26 21:00:00 (Sat)
  62868952800, #      utc_end 1993-03-27 22:00:00 (Sat)
  62853231600, #  local_start 1992-09-26 23:00:00 (Sat)
  62868960000, #    local_end 1993-03-28 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62868952800, #    utc_start 1993-03-27 22:00:00 (Sat)
  62884674000, #      utc_end 1993-09-25 21:00:00 (Sat)
  62868963600, #  local_start 1993-03-28 01:00:00 (Sun)
  62884684800, #    local_end 1993-09-26 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62884674000, #    utc_start 1993-09-25 21:00:00 (Sat)
  62900402400, #      utc_end 1994-03-26 22:00:00 (Sat)
  62884681200, #  local_start 1993-09-25 23:00:00 (Sat)
  62900409600, #    local_end 1994-03-27 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62900402400, #    utc_start 1994-03-26 22:00:00 (Sat)
  62916123600, #      utc_end 1994-09-24 21:00:00 (Sat)
  62900413200, #  local_start 1994-03-27 01:00:00 (Sun)
  62916134400, #    local_end 1994-09-25 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62916123600, #    utc_start 1994-09-24 21:00:00 (Sat)
  62931852000, #      utc_end 1995-03-25 22:00:00 (Sat)
  62916130800, #  local_start 1994-09-24 23:00:00 (Sat)
  62931859200, #    local_end 1995-03-26 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62931852000, #    utc_start 1995-03-25 22:00:00 (Sat)
  62947573200, #      utc_end 1995-09-23 21:00:00 (Sat)
  62931862800, #  local_start 1995-03-26 01:00:00 (Sun)
  62947584000, #    local_end 1995-09-24 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62947573200, #    utc_start 1995-09-23 21:00:00 (Sat)
  62963906400, #      utc_end 1996-03-30 22:00:00 (Sat)
  62947580400, #  local_start 1995-09-23 23:00:00 (Sat)
  62963913600, #    local_end 1996-03-31 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62963906400, #    utc_start 1996-03-30 22:00:00 (Sat)
  62979627600, #      utc_end 1996-09-28 21:00:00 (Sat)
  62963917200, #  local_start 1996-03-31 01:00:00 (Sun)
  62979638400, #    local_end 1996-09-29 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62979627600, #    utc_start 1996-09-28 21:00:00 (Sat)
  62995356000, #      utc_end 1997-03-29 22:00:00 (Sat)
  62979634800, #  local_start 1996-09-28 23:00:00 (Sat)
  62995363200, #    local_end 1997-03-30 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62995356000, #    utc_start 1997-03-29 22:00:00 (Sat)
  63011077200, #      utc_end 1997-09-27 21:00:00 (Sat)
  62995366800, #  local_start 1997-03-30 01:00:00 (Sun)
  63011088000, #    local_end 1997-09-28 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63011077200, #    utc_start 1997-09-27 21:00:00 (Sat)
  63026805600, #      utc_end 1998-03-28 22:00:00 (Sat)
  63011084400, #  local_start 1997-09-27 23:00:00 (Sat)
  63026812800, #    local_end 1998-03-29 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63026805600, #    utc_start 1998-03-28 22:00:00 (Sat)
  63040280400, #      utc_end 1998-08-31 21:00:00 (Mon)
  63026816400, #  local_start 1998-03-29 01:00:00 (Sun)
  63040291200, #    local_end 1998-09-01 00:00:00 (Tue)
  10800,
  1,
  'EEST',
      ],
      [
  63040280400, #    utc_start 1998-08-31 21:00:00 (Mon)
  63044960400, #      utc_end 1998-10-25 01:00:00 (Sun)
  63040291200, #  local_start 1998-09-01 00:00:00 (Tue)
  63044971200, #    local_end 1998-10-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63044960400, #    utc_start 1998-10-25 01:00:00 (Sun)
  63058266000, #      utc_end 1999-03-28 01:00:00 (Sun)
  63044967600, #  local_start 1998-10-25 03:00:00 (Sun)
  63058273200, #    local_end 1999-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63058266000, #    utc_start 1999-03-28 01:00:00 (Sun)
  63077014800, #      utc_end 1999-10-31 01:00:00 (Sun)
  63058276800, #  local_start 1999-03-28 04:00:00 (Sun)
  63077025600, #    local_end 1999-10-31 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63077014800, #    utc_start 1999-10-31 01:00:00 (Sun)
  63089715600, #      utc_end 2000-03-26 01:00:00 (Sun)
  63077022000, #  local_start 1999-10-31 03:00:00 (Sun)
  63089722800, #    local_end 2000-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63089715600, #    utc_start 2000-03-26 01:00:00 (Sun)
  63108464400, #      utc_end 2000-10-29 01:00:00 (Sun)
  63089726400, #  local_start 2000-03-26 04:00:00 (Sun)
  63108475200, #    local_end 2000-10-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63108464400, #    utc_start 2000-10-29 01:00:00 (Sun)
  63121165200, #      utc_end 2001-03-25 01:00:00 (Sun)
  63108471600, #  local_start 2000-10-29 03:00:00 (Sun)
  63121172400, #    local_end 2001-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63121165200, #    utc_start 2001-03-25 01:00:00 (Sun)
  63139914000, #      utc_end 2001-10-28 01:00:00 (Sun)
  63121176000, #  local_start 2001-03-25 04:00:00 (Sun)
  63139924800, #    local_end 2001-10-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63139914000, #    utc_start 2001-10-28 01:00:00 (Sun)
  63153219600, #      utc_end 2002-03-31 01:00:00 (Sun)
  63139921200, #  local_start 2001-10-28 03:00:00 (Sun)
  63153226800, #    local_end 2002-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63153219600, #    utc_start 2002-03-31 01:00:00 (Sun)
  63171363600, #      utc_end 2002-10-27 01:00:00 (Sun)
  63153230400, #  local_start 2002-03-31 04:00:00 (Sun)
  63171374400, #    local_end 2002-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63171363600, #    utc_start 2002-10-27 01:00:00 (Sun)
  63184669200, #      utc_end 2003-03-30 01:00:00 (Sun)
  63171370800, #  local_start 2002-10-27 03:00:00 (Sun)
  63184676400, #    local_end 2003-03-30 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63184669200, #    utc_start 2003-03-30 01:00:00 (Sun)
  63202813200, #      utc_end 2003-10-26 01:00:00 (Sun)
  63184680000, #  local_start 2003-03-30 04:00:00 (Sun)
  63202824000, #    local_end 2003-10-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63202813200, #    utc_start 2003-10-26 01:00:00 (Sun)
  63216118800, #      utc_end 2004-03-28 01:00:00 (Sun)
  63202820400, #  local_start 2003-10-26 03:00:00 (Sun)
  63216126000, #    local_end 2004-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63216118800, #    utc_start 2004-03-28 01:00:00 (Sun)
  63234867600, #      utc_end 2004-10-31 01:00:00 (Sun)
  63216129600, #  local_start 2004-03-28 04:00:00 (Sun)
  63234878400, #    local_end 2004-10-31 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63234867600, #    utc_start 2004-10-31 01:00:00 (Sun)
  63247568400, #      utc_end 2005-03-27 01:00:00 (Sun)
  63234874800, #  local_start 2004-10-31 03:00:00 (Sun)
  63247575600, #    local_end 2005-03-27 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63247568400, #    utc_start 2005-03-27 01:00:00 (Sun)
  63266317200, #      utc_end 2005-10-30 01:00:00 (Sun)
  63247579200, #  local_start 2005-03-27 04:00:00 (Sun)
  63266328000, #    local_end 2005-10-30 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63266317200, #    utc_start 2005-10-30 01:00:00 (Sun)
  63279018000, #      utc_end 2006-03-26 01:00:00 (Sun)
  63266324400, #  local_start 2005-10-30 03:00:00 (Sun)
  63279025200, #    local_end 2006-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63279018000, #    utc_start 2006-03-26 01:00:00 (Sun)
  63297766800, #      utc_end 2006-10-29 01:00:00 (Sun)
  63279028800, #  local_start 2006-03-26 04:00:00 (Sun)
  63297777600, #    local_end 2006-10-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63297766800, #    utc_start 2006-10-29 01:00:00 (Sun)
  63310467600, #      utc_end 2007-03-25 01:00:00 (Sun)
  63297774000, #  local_start 2006-10-29 03:00:00 (Sun)
  63310474800, #    local_end 2007-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63310467600, #    utc_start 2007-03-25 01:00:00 (Sun)
  63329216400, #      utc_end 2007-10-28 01:00:00 (Sun)
  63310478400, #  local_start 2007-03-25 04:00:00 (Sun)
  63329227200, #    local_end 2007-10-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63329216400, #    utc_start 2007-10-28 01:00:00 (Sun)
  63342522000, #      utc_end 2008-03-30 01:00:00 (Sun)
  63329223600, #  local_start 2007-10-28 03:00:00 (Sun)
  63342529200, #    local_end 2008-03-30 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63342522000, #    utc_start 2008-03-30 01:00:00 (Sun)
  63360666000, #      utc_end 2008-10-26 01:00:00 (Sun)
  63342532800, #  local_start 2008-03-30 04:00:00 (Sun)
  63360676800, #    local_end 2008-10-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63360666000, #    utc_start 2008-10-26 01:00:00 (Sun)
  63373971600, #      utc_end 2009-03-29 01:00:00 (Sun)
  63360673200, #  local_start 2008-10-26 03:00:00 (Sun)
  63373978800, #    local_end 2009-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63373971600, #    utc_start 2009-03-29 01:00:00 (Sun)
  63392115600, #      utc_end 2009-10-25 01:00:00 (Sun)
  63373982400, #  local_start 2009-03-29 04:00:00 (Sun)
  63392126400, #    local_end 2009-10-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63392115600, #    utc_start 2009-10-25 01:00:00 (Sun)
  63405421200, #      utc_end 2010-03-28 01:00:00 (Sun)
  63392122800, #  local_start 2009-10-25 03:00:00 (Sun)
  63405428400, #    local_end 2010-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63405421200, #    utc_start 2010-03-28 01:00:00 (Sun)
  63424170000, #      utc_end 2010-10-31 01:00:00 (Sun)
  63405432000, #  local_start 2010-03-28 04:00:00 (Sun)
  63424180800, #    local_end 2010-10-31 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63424170000, #    utc_start 2010-10-31 01:00:00 (Sun)
  63436870800, #      utc_end 2011-03-27 01:00:00 (Sun)
  63424177200, #  local_start 2010-10-31 03:00:00 (Sun)
  63436878000, #    local_end 2011-03-27 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63436870800, #    utc_start 2011-03-27 01:00:00 (Sun)
  63455619600, #      utc_end 2011-10-30 01:00:00 (Sun)
  63436881600, #  local_start 2011-03-27 04:00:00 (Sun)
  63455630400, #    local_end 2011-10-30 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63455619600, #    utc_start 2011-10-30 01:00:00 (Sun)
  63468320400, #      utc_end 2012-03-25 01:00:00 (Sun)
  63455626800, #  local_start 2011-10-30 03:00:00 (Sun)
  63468327600, #    local_end 2012-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63468320400, #    utc_start 2012-03-25 01:00:00 (Sun)
  63487069200, #      utc_end 2012-10-28 01:00:00 (Sun)
  63468331200, #  local_start 2012-03-25 04:00:00 (Sun)
  63487080000, #    local_end 2012-10-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63487069200, #    utc_start 2012-10-28 01:00:00 (Sun)
  63500374800, #      utc_end 2013-03-31 01:00:00 (Sun)
  63487076400, #  local_start 2012-10-28 03:00:00 (Sun)
  63500382000, #    local_end 2013-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63500374800, #    utc_start 2013-03-31 01:00:00 (Sun)
  63518518800, #      utc_end 2013-10-27 01:00:00 (Sun)
  63500385600, #  local_start 2013-03-31 04:00:00 (Sun)
  63518529600, #    local_end 2013-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63518518800, #    utc_start 2013-10-27 01:00:00 (Sun)
  63531824400, #      utc_end 2014-03-30 01:00:00 (Sun)
  63518526000, #  local_start 2013-10-27 03:00:00 (Sun)
  63531831600, #    local_end 2014-03-30 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63531824400, #    utc_start 2014-03-30 01:00:00 (Sun)
  63549968400, #      utc_end 2014-10-26 01:00:00 (Sun)
  63531835200, #  local_start 2014-03-30 04:00:00 (Sun)
  63549979200, #    local_end 2014-10-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63549968400, #    utc_start 2014-10-26 01:00:00 (Sun)
  63563274000, #      utc_end 2015-03-29 01:00:00 (Sun)
  63549975600, #  local_start 2014-10-26 03:00:00 (Sun)
  63563281200, #    local_end 2015-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63563274000, #    utc_start 2015-03-29 01:00:00 (Sun)
  63581418000, #      utc_end 2015-10-25 01:00:00 (Sun)
  63563284800, #  local_start 2015-03-29 04:00:00 (Sun)
  63581428800, #    local_end 2015-10-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63581418000, #    utc_start 2015-10-25 01:00:00 (Sun)
  63594723600, #      utc_end 2016-03-27 01:00:00 (Sun)
  63581425200, #  local_start 2015-10-25 03:00:00 (Sun)
  63594730800, #    local_end 2016-03-27 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63594723600, #    utc_start 2016-03-27 01:00:00 (Sun)
  63613472400, #      utc_end 2016-10-30 01:00:00 (Sun)
  63594734400, #  local_start 2016-03-27 04:00:00 (Sun)
  63613483200, #    local_end 2016-10-30 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63613472400, #    utc_start 2016-10-30 01:00:00 (Sun)
  63626173200, #      utc_end 2017-03-26 01:00:00 (Sun)
  63613479600, #  local_start 2016-10-30 03:00:00 (Sun)
  63626180400, #    local_end 2017-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63626173200, #    utc_start 2017-03-26 01:00:00 (Sun)
  63644922000, #      utc_end 2017-10-29 01:00:00 (Sun)
  63626184000, #  local_start 2017-03-26 04:00:00 (Sun)
  63644932800, #    local_end 2017-10-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63644922000, #    utc_start 2017-10-29 01:00:00 (Sun)
  63657622800, #      utc_end 2018-03-25 01:00:00 (Sun)
  63644929200, #  local_start 2017-10-29 03:00:00 (Sun)
  63657630000, #    local_end 2018-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63657622800, #    utc_start 2018-03-25 01:00:00 (Sun)
  63676371600, #      utc_end 2018-10-28 01:00:00 (Sun)
  63657633600, #  local_start 2018-03-25 04:00:00 (Sun)
  63676382400, #    local_end 2018-10-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63676371600, #    utc_start 2018-10-28 01:00:00 (Sun)
  63689677200, #      utc_end 2019-03-31 01:00:00 (Sun)
  63676378800, #  local_start 2018-10-28 03:00:00 (Sun)
  63689684400, #    local_end 2019-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63689677200, #    utc_start 2019-03-31 01:00:00 (Sun)
  63707821200, #      utc_end 2019-10-27 01:00:00 (Sun)
  63689688000, #  local_start 2019-03-31 04:00:00 (Sun)
  63707832000, #    local_end 2019-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63707821200, #    utc_start 2019-10-27 01:00:00 (Sun)
  63721126800, #      utc_end 2020-03-29 01:00:00 (Sun)
  63707828400, #  local_start 2019-10-27 03:00:00 (Sun)
  63721134000, #    local_end 2020-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63721126800, #    utc_start 2020-03-29 01:00:00 (Sun)
  63739270800, #      utc_end 2020-10-25 01:00:00 (Sun)
  63721137600, #  local_start 2020-03-29 04:00:00 (Sun)
  63739281600, #    local_end 2020-10-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63739270800, #    utc_start 2020-10-25 01:00:00 (Sun)
  63752576400, #      utc_end 2021-03-28 01:00:00 (Sun)
  63739278000, #  local_start 2020-10-25 03:00:00 (Sun)
  63752583600, #    local_end 2021-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63752576400, #    utc_start 2021-03-28 01:00:00 (Sun)
  63771325200, #      utc_end 2021-10-31 01:00:00 (Sun)
  63752587200, #  local_start 2021-03-28 04:00:00 (Sun)
  63771336000, #    local_end 2021-10-31 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63771325200, #    utc_start 2021-10-31 01:00:00 (Sun)
  63784026000, #      utc_end 2022-03-27 01:00:00 (Sun)
  63771332400, #  local_start 2021-10-31 03:00:00 (Sun)
  63784033200, #    local_end 2022-03-27 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63784026000, #    utc_start 2022-03-27 01:00:00 (Sun)
  63802774800, #      utc_end 2022-10-30 01:00:00 (Sun)
  63784036800, #  local_start 2022-03-27 04:00:00 (Sun)
  63802785600, #    local_end 2022-10-30 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63802774800, #    utc_start 2022-10-30 01:00:00 (Sun)
  63815475600, #      utc_end 2023-03-26 01:00:00 (Sun)
  63802782000, #  local_start 2022-10-30 03:00:00 (Sun)
  63815482800, #    local_end 2023-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63815475600, #    utc_start 2023-03-26 01:00:00 (Sun)
  63834224400, #      utc_end 2023-10-29 01:00:00 (Sun)
  63815486400, #  local_start 2023-03-26 04:00:00 (Sun)
  63834235200, #    local_end 2023-10-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63834224400, #    utc_start 2023-10-29 01:00:00 (Sun)
  63847530000, #      utc_end 2024-03-31 01:00:00 (Sun)
  63834231600, #  local_start 2023-10-29 03:00:00 (Sun)
  63847537200, #    local_end 2024-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63847530000, #    utc_start 2024-03-31 01:00:00 (Sun)
  63865674000, #      utc_end 2024-10-27 01:00:00 (Sun)
  63847540800, #  local_start 2024-03-31 04:00:00 (Sun)
  63865684800, #    local_end 2024-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63865674000, #    utc_start 2024-10-27 01:00:00 (Sun)
  63878979600, #      utc_end 2025-03-30 01:00:00 (Sun)
  63865681200, #  local_start 2024-10-27 03:00:00 (Sun)
  63878986800, #    local_end 2025-03-30 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63878979600, #    utc_start 2025-03-30 01:00:00 (Sun)
  63897123600, #      utc_end 2025-10-26 01:00:00 (Sun)
  63878990400, #  local_start 2025-03-30 04:00:00 (Sun)
  63897134400, #    local_end 2025-10-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63897123600, #    utc_start 2025-10-26 01:00:00 (Sun)
  63910429200, #      utc_end 2026-03-29 01:00:00 (Sun)
  63897130800, #  local_start 2025-10-26 03:00:00 (Sun)
  63910436400, #    local_end 2026-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63910429200, #    utc_start 2026-03-29 01:00:00 (Sun)
  63928573200, #      utc_end 2026-10-25 01:00:00 (Sun)
  63910440000, #  local_start 2026-03-29 04:00:00 (Sun)
  63928584000, #    local_end 2026-10-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63928573200, #    utc_start 2026-10-25 01:00:00 (Sun)
  63941878800, #      utc_end 2027-03-28 01:00:00 (Sun)
  63928580400, #  local_start 2026-10-25 03:00:00 (Sun)
  63941886000, #    local_end 2027-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63941878800, #    utc_start 2027-03-28 01:00:00 (Sun)
  63960627600, #      utc_end 2027-10-31 01:00:00 (Sun)
  63941889600, #  local_start 2027-03-28 04:00:00 (Sun)
  63960638400, #    local_end 2027-10-31 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63960627600, #    utc_start 2027-10-31 01:00:00 (Sun)
  63973328400, #      utc_end 2028-03-26 01:00:00 (Sun)
  63960634800, #  local_start 2027-10-31 03:00:00 (Sun)
  63973335600, #    local_end 2028-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63973328400, #    utc_start 2028-03-26 01:00:00 (Sun)
  63992077200, #      utc_end 2028-10-29 01:00:00 (Sun)
  63973339200, #  local_start 2028-03-26 04:00:00 (Sun)
  63992088000, #    local_end 2028-10-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63992077200, #    utc_start 2028-10-29 01:00:00 (Sun)
  64004778000, #      utc_end 2029-03-25 01:00:00 (Sun)
  63992084400, #  local_start 2028-10-29 03:00:00 (Sun)
  64004785200, #    local_end 2029-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  64004778000, #    utc_start 2029-03-25 01:00:00 (Sun)
  64023526800, #      utc_end 2029-10-28 01:00:00 (Sun)
  64004788800, #  local_start 2029-03-25 04:00:00 (Sun)
  64023537600, #    local_end 2029-10-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  64023526800, #    utc_start 2029-10-28 01:00:00 (Sun)
  64036832400, #      utc_end 2030-03-31 01:00:00 (Sun)
  64023534000, #  local_start 2029-10-28 03:00:00 (Sun)
  64036839600, #    local_end 2030-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  64036832400, #    utc_start 2030-03-31 01:00:00 (Sun)
  64054976400, #      utc_end 2030-10-27 01:00:00 (Sun)
  64036843200, #  local_start 2030-03-31 04:00:00 (Sun)
  64054987200, #    local_end 2030-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {57}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { 7200 }
  
  my $last_observance = bless( {
    'format' => 'EE%sT',
    'gmtoff' => '2:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 729633,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 729633,
      'utc_rd_secs' => 0,
      'utc_year' => 1999
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => 7200,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 729632,
      'local_rd_secs' => 75600,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 729632,
      'utc_rd_secs' => 75600,
      'utc_year' => 1999
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '1:00u',
      'from' => '1996',
      'in' => 'Oct',
      'letter' => '',
      'name' => 'EUAsia',
      'offset_from_std' => 0,
      'on' => 'lastSun',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '1:00u',
      'from' => '1981',
      'in' => 'Mar',
      'letter' => 'S',
      'name' => 'EUAsia',
      'offset_from_std' => 3600,
      'on' => 'lastSun',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_NICOSIA

    $main::fatpacked{"DateTime/TimeZone/Asia/Novokuznetsk.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_NOVOKUZNETSK';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Novokuznetsk;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Novokuznetsk::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60694423872, #      utc_end 1924-04-30 18:11:12 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60694444800, #    local_end 1924-05-01 00:00:00 (Thu)
  20928,
  0,
  'LMT',
      ],
      [
  60694423872, #    utc_start 1924-04-30 18:11:12 (Wed)
  60888132000, #      utc_end 1930-06-20 18:00:00 (Fri)
  60694445472, #  local_start 1924-05-01 00:11:12 (Thu)
  60888153600, #    local_end 1930-06-21 00:00:00 (Sat)
  21600,
  0,
  '+06',
      ],
      [
  60888132000, #    utc_start 1930-06-20 18:00:00 (Fri)
  62490589200, #      utc_end 1981-03-31 17:00:00 (Tue)
  60888157200, #  local_start 1930-06-21 01:00:00 (Sat)
  62490614400, #    local_end 1981-04-01 00:00:00 (Wed)
  25200,
  0,
  '+07',
      ],
      [
  62490589200, #    utc_start 1981-03-31 17:00:00 (Tue)
  62506396800, #      utc_end 1981-09-30 16:00:00 (Wed)
  62490618000, #  local_start 1981-04-01 01:00:00 (Wed)
  62506425600, #    local_end 1981-10-01 00:00:00 (Thu)
  28800,
  1,
  '+08',
      ],
      [
  62506396800, #    utc_start 1981-09-30 16:00:00 (Wed)
  62522125200, #      utc_end 1982-03-31 17:00:00 (Wed)
  62506422000, #  local_start 1981-09-30 23:00:00 (Wed)
  62522150400, #    local_end 1982-04-01 00:00:00 (Thu)
  25200,
  0,
  '+07',
      ],
      [
  62522125200, #    utc_start 1982-03-31 17:00:00 (Wed)
  62537932800, #      utc_end 1982-09-30 16:00:00 (Thu)
  62522154000, #  local_start 1982-04-01 01:00:00 (Thu)
  62537961600, #    local_end 1982-10-01 00:00:00 (Fri)
  28800,
  1,
  '+08',
      ],
      [
  62537932800, #    utc_start 1982-09-30 16:00:00 (Thu)
  62553661200, #      utc_end 1983-03-31 17:00:00 (Thu)
  62537958000, #  local_start 1982-09-30 23:00:00 (Thu)
  62553686400, #    local_end 1983-04-01 00:00:00 (Fri)
  25200,
  0,
  '+07',
      ],
      [
  62553661200, #    utc_start 1983-03-31 17:00:00 (Thu)
  62569468800, #      utc_end 1983-09-30 16:00:00 (Fri)
  62553690000, #  local_start 1983-04-01 01:00:00 (Fri)
  62569497600, #    local_end 1983-10-01 00:00:00 (Sat)
  28800,
  1,
  '+08',
      ],
      [
  62569468800, #    utc_start 1983-09-30 16:00:00 (Fri)
  62585283600, #      utc_end 1984-03-31 17:00:00 (Sat)
  62569494000, #  local_start 1983-09-30 23:00:00 (Fri)
  62585308800, #    local_end 1984-04-01 00:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62585283600, #    utc_start 1984-03-31 17:00:00 (Sat)
  62601015600, #      utc_end 1984-09-29 19:00:00 (Sat)
  62585312400, #  local_start 1984-04-01 01:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62601015600, #    utc_start 1984-09-29 19:00:00 (Sat)
  62616740400, #      utc_end 1985-03-30 19:00:00 (Sat)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62616740400, #    utc_start 1985-03-30 19:00:00 (Sat)
  62632465200, #      utc_end 1985-09-28 19:00:00 (Sat)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62632465200, #    utc_start 1985-09-28 19:00:00 (Sat)
  62648190000, #      utc_end 1986-03-29 19:00:00 (Sat)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62648190000, #    utc_start 1986-03-29 19:00:00 (Sat)
  62663914800, #      utc_end 1986-09-27 19:00:00 (Sat)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62663914800, #    utc_start 1986-09-27 19:00:00 (Sat)
  62679639600, #      utc_end 1987-03-28 19:00:00 (Sat)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62679639600, #    utc_start 1987-03-28 19:00:00 (Sat)
  62695364400, #      utc_end 1987-09-26 19:00:00 (Sat)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62695364400, #    utc_start 1987-09-26 19:00:00 (Sat)
  62711089200, #      utc_end 1988-03-26 19:00:00 (Sat)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62711089200, #    utc_start 1988-03-26 19:00:00 (Sat)
  62726814000, #      utc_end 1988-09-24 19:00:00 (Sat)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62726814000, #    utc_start 1988-09-24 19:00:00 (Sat)
  62742538800, #      utc_end 1989-03-25 19:00:00 (Sat)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62742538800, #    utc_start 1989-03-25 19:00:00 (Sat)
  62758263600, #      utc_end 1989-09-23 19:00:00 (Sat)
  62742567600, #  local_start 1989-03-26 03:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62758263600, #    utc_start 1989-09-23 19:00:00 (Sat)
  62773988400, #      utc_end 1990-03-24 19:00:00 (Sat)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62773988400, #    utc_start 1990-03-24 19:00:00 (Sat)
  62790318000, #      utc_end 1990-09-29 19:00:00 (Sat)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62790318000, #    utc_start 1990-09-29 19:00:00 (Sat)
  62806042800, #      utc_end 1991-03-30 19:00:00 (Sat)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62806042800, #    utc_start 1991-03-30 19:00:00 (Sat)
  62821771200, #      utc_end 1991-09-28 20:00:00 (Sat)
  62806068000, #  local_start 1991-03-31 02:00:00 (Sun)
  62821796400, #    local_end 1991-09-29 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  62821771200, #    utc_start 1991-09-28 20:00:00 (Sat)
  62831448000, #      utc_end 1992-01-18 20:00:00 (Sat)
  62821792800, #  local_start 1991-09-29 02:00:00 (Sun)
  62831469600, #    local_end 1992-01-19 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  62831448000, #    utc_start 1992-01-18 20:00:00 (Sat)
  62837492400, #      utc_end 1992-03-28 19:00:00 (Sat)
  62831473200, #  local_start 1992-01-19 03:00:00 (Sun)
  62837517600, #    local_end 1992-03-29 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62837492400, #    utc_start 1992-03-28 19:00:00 (Sat)
  62853217200, #      utc_end 1992-09-26 19:00:00 (Sat)
  62837521200, #  local_start 1992-03-29 03:00:00 (Sun)
  62853246000, #    local_end 1992-09-27 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62853217200, #    utc_start 1992-09-26 19:00:00 (Sat)
  62868942000, #      utc_end 1993-03-27 19:00:00 (Sat)
  62853242400, #  local_start 1992-09-27 02:00:00 (Sun)
  62868967200, #    local_end 1993-03-28 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62868942000, #    utc_start 1993-03-27 19:00:00 (Sat)
  62884666800, #      utc_end 1993-09-25 19:00:00 (Sat)
  62868970800, #  local_start 1993-03-28 03:00:00 (Sun)
  62884695600, #    local_end 1993-09-26 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62884666800, #    utc_start 1993-09-25 19:00:00 (Sat)
  62900391600, #      utc_end 1994-03-26 19:00:00 (Sat)
  62884692000, #  local_start 1993-09-26 02:00:00 (Sun)
  62900416800, #    local_end 1994-03-27 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62900391600, #    utc_start 1994-03-26 19:00:00 (Sat)
  62916116400, #      utc_end 1994-09-24 19:00:00 (Sat)
  62900420400, #  local_start 1994-03-27 03:00:00 (Sun)
  62916145200, #    local_end 1994-09-25 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62916116400, #    utc_start 1994-09-24 19:00:00 (Sat)
  62931841200, #      utc_end 1995-03-25 19:00:00 (Sat)
  62916141600, #  local_start 1994-09-25 02:00:00 (Sun)
  62931866400, #    local_end 1995-03-26 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62931841200, #    utc_start 1995-03-25 19:00:00 (Sat)
  62947566000, #      utc_end 1995-09-23 19:00:00 (Sat)
  62931870000, #  local_start 1995-03-26 03:00:00 (Sun)
  62947594800, #    local_end 1995-09-24 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62947566000, #    utc_start 1995-09-23 19:00:00 (Sat)
  62963895600, #      utc_end 1996-03-30 19:00:00 (Sat)
  62947591200, #  local_start 1995-09-24 02:00:00 (Sun)
  62963920800, #    local_end 1996-03-31 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62963895600, #    utc_start 1996-03-30 19:00:00 (Sat)
  62982039600, #      utc_end 1996-10-26 19:00:00 (Sat)
  62963924400, #  local_start 1996-03-31 03:00:00 (Sun)
  62982068400, #    local_end 1996-10-27 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62982039600, #    utc_start 1996-10-26 19:00:00 (Sat)
  62995345200, #      utc_end 1997-03-29 19:00:00 (Sat)
  62982064800, #  local_start 1996-10-27 02:00:00 (Sun)
  62995370400, #    local_end 1997-03-30 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62995345200, #    utc_start 1997-03-29 19:00:00 (Sat)
  63013489200, #      utc_end 1997-10-25 19:00:00 (Sat)
  62995374000, #  local_start 1997-03-30 03:00:00 (Sun)
  63013518000, #    local_end 1997-10-26 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  63013489200, #    utc_start 1997-10-25 19:00:00 (Sat)
  63026794800, #      utc_end 1998-03-28 19:00:00 (Sat)
  63013514400, #  local_start 1997-10-26 02:00:00 (Sun)
  63026820000, #    local_end 1998-03-29 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  63026794800, #    utc_start 1998-03-28 19:00:00 (Sat)
  63044938800, #      utc_end 1998-10-24 19:00:00 (Sat)
  63026823600, #  local_start 1998-03-29 03:00:00 (Sun)
  63044967600, #    local_end 1998-10-25 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  63044938800, #    utc_start 1998-10-24 19:00:00 (Sat)
  63058244400, #      utc_end 1999-03-27 19:00:00 (Sat)
  63044964000, #  local_start 1998-10-25 02:00:00 (Sun)
  63058269600, #    local_end 1999-03-28 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  63058244400, #    utc_start 1999-03-27 19:00:00 (Sat)
  63076993200, #      utc_end 1999-10-30 19:00:00 (Sat)
  63058273200, #  local_start 1999-03-28 03:00:00 (Sun)
  63077022000, #    local_end 1999-10-31 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  63076993200, #    utc_start 1999-10-30 19:00:00 (Sat)
  63089694000, #      utc_end 2000-03-25 19:00:00 (Sat)
  63077018400, #  local_start 1999-10-31 02:00:00 (Sun)
  63089719200, #    local_end 2000-03-26 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  63089694000, #    utc_start 2000-03-25 19:00:00 (Sat)
  63108442800, #      utc_end 2000-10-28 19:00:00 (Sat)
  63089722800, #  local_start 2000-03-26 03:00:00 (Sun)
  63108471600, #    local_end 2000-10-29 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  63108442800, #    utc_start 2000-10-28 19:00:00 (Sat)
  63121143600, #      utc_end 2001-03-24 19:00:00 (Sat)
  63108468000, #  local_start 2000-10-29 02:00:00 (Sun)
  63121168800, #    local_end 2001-03-25 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  63121143600, #    utc_start 2001-03-24 19:00:00 (Sat)
  63139892400, #      utc_end 2001-10-27 19:00:00 (Sat)
  63121172400, #  local_start 2001-03-25 03:00:00 (Sun)
  63139921200, #    local_end 2001-10-28 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  63139892400, #    utc_start 2001-10-27 19:00:00 (Sat)
  63153198000, #      utc_end 2002-03-30 19:00:00 (Sat)
  63139917600, #  local_start 2001-10-28 02:00:00 (Sun)
  63153223200, #    local_end 2002-03-31 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  63153198000, #    utc_start 2002-03-30 19:00:00 (Sat)
  63171342000, #      utc_end 2002-10-26 19:00:00 (Sat)
  63153226800, #  local_start 2002-03-31 03:00:00 (Sun)
  63171370800, #    local_end 2002-10-27 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  63171342000, #    utc_start 2002-10-26 19:00:00 (Sat)
  63184647600, #      utc_end 2003-03-29 19:00:00 (Sat)
  63171367200, #  local_start 2002-10-27 02:00:00 (Sun)
  63184672800, #    local_end 2003-03-30 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  63184647600, #    utc_start 2003-03-29 19:00:00 (Sat)
  63202791600, #      utc_end 2003-10-25 19:00:00 (Sat)
  63184676400, #  local_start 2003-03-30 03:00:00 (Sun)
  63202820400, #    local_end 2003-10-26 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  63202791600, #    utc_start 2003-10-25 19:00:00 (Sat)
  63216097200, #      utc_end 2004-03-27 19:00:00 (Sat)
  63202816800, #  local_start 2003-10-26 02:00:00 (Sun)
  63216122400, #    local_end 2004-03-28 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  63216097200, #    utc_start 2004-03-27 19:00:00 (Sat)
  63234846000, #      utc_end 2004-10-30 19:00:00 (Sat)
  63216126000, #  local_start 2004-03-28 03:00:00 (Sun)
  63234874800, #    local_end 2004-10-31 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  63234846000, #    utc_start 2004-10-30 19:00:00 (Sat)
  63247546800, #      utc_end 2005-03-26 19:00:00 (Sat)
  63234871200, #  local_start 2004-10-31 02:00:00 (Sun)
  63247572000, #    local_end 2005-03-27 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  63247546800, #    utc_start 2005-03-26 19:00:00 (Sat)
  63266295600, #      utc_end 2005-10-29 19:00:00 (Sat)
  63247575600, #  local_start 2005-03-27 03:00:00 (Sun)
  63266324400, #    local_end 2005-10-30 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  63266295600, #    utc_start 2005-10-29 19:00:00 (Sat)
  63278996400, #      utc_end 2006-03-25 19:00:00 (Sat)
  63266320800, #  local_start 2005-10-30 02:00:00 (Sun)
  63279021600, #    local_end 2006-03-26 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  63278996400, #    utc_start 2006-03-25 19:00:00 (Sat)
  63297745200, #      utc_end 2006-10-28 19:00:00 (Sat)
  63279025200, #  local_start 2006-03-26 03:00:00 (Sun)
  63297774000, #    local_end 2006-10-29 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  63297745200, #    utc_start 2006-10-28 19:00:00 (Sat)
  63310446000, #      utc_end 2007-03-24 19:00:00 (Sat)
  63297770400, #  local_start 2006-10-29 02:00:00 (Sun)
  63310471200, #    local_end 2007-03-25 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  63310446000, #    utc_start 2007-03-24 19:00:00 (Sat)
  63329194800, #      utc_end 2007-10-27 19:00:00 (Sat)
  63310474800, #  local_start 2007-03-25 03:00:00 (Sun)
  63329223600, #    local_end 2007-10-28 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  63329194800, #    utc_start 2007-10-27 19:00:00 (Sat)
  63342500400, #      utc_end 2008-03-29 19:00:00 (Sat)
  63329220000, #  local_start 2007-10-28 02:00:00 (Sun)
  63342525600, #    local_end 2008-03-30 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  63342500400, #    utc_start 2008-03-29 19:00:00 (Sat)
  63360644400, #      utc_end 2008-10-25 19:00:00 (Sat)
  63342529200, #  local_start 2008-03-30 03:00:00 (Sun)
  63360673200, #    local_end 2008-10-26 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  63360644400, #    utc_start 2008-10-25 19:00:00 (Sat)
  63373950000, #      utc_end 2009-03-28 19:00:00 (Sat)
  63360669600, #  local_start 2008-10-26 02:00:00 (Sun)
  63373975200, #    local_end 2009-03-29 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  63373950000, #    utc_start 2009-03-28 19:00:00 (Sat)
  63392094000, #      utc_end 2009-10-24 19:00:00 (Sat)
  63373978800, #  local_start 2009-03-29 03:00:00 (Sun)
  63392122800, #    local_end 2009-10-25 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  63392094000, #    utc_start 2009-10-24 19:00:00 (Sat)
  63405399600, #      utc_end 2010-03-27 19:00:00 (Sat)
  63392119200, #  local_start 2009-10-25 02:00:00 (Sun)
  63405424800, #    local_end 2010-03-28 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  63405399600, #    utc_start 2010-03-27 19:00:00 (Sat)
  63424152000, #      utc_end 2010-10-30 20:00:00 (Sat)
  63405424800, #  local_start 2010-03-28 02:00:00 (Sun)
  63424177200, #    local_end 2010-10-31 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  63424152000, #    utc_start 2010-10-30 20:00:00 (Sat)
  63436852800, #      utc_end 2011-03-26 20:00:00 (Sat)
  63424173600, #  local_start 2010-10-31 02:00:00 (Sun)
  63436874400, #    local_end 2011-03-27 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  63436852800, #    utc_start 2011-03-26 20:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  63436878000, #  local_start 2011-03-27 03:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  25200,
  0,
  '+07',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {30}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_NOVOKUZNETSK

    $main::fatpacked{"DateTime/TimeZone/Asia/Novosibirsk.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_NOVOSIBIRSK';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Novosibirsk;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Novosibirsk::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60556206500, #      utc_end 1919-12-14 00:28:20 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60556226400, #    local_end 1919-12-14 06:00:00 (Sun)
  19900,
  0,
  'LMT',
      ],
      [
  60556206500, #    utc_start 1919-12-14 00:28:20 (Sun)
  60888132000, #      utc_end 1930-06-20 18:00:00 (Fri)
  60556228100, #  local_start 1919-12-14 06:28:20 (Sun)
  60888153600, #    local_end 1930-06-21 00:00:00 (Sat)
  21600,
  0,
  '+06',
      ],
      [
  60888132000, #    utc_start 1930-06-20 18:00:00 (Fri)
  62490589200, #      utc_end 1981-03-31 17:00:00 (Tue)
  60888157200, #  local_start 1930-06-21 01:00:00 (Sat)
  62490614400, #    local_end 1981-04-01 00:00:00 (Wed)
  25200,
  0,
  '+07',
      ],
      [
  62490589200, #    utc_start 1981-03-31 17:00:00 (Tue)
  62506396800, #      utc_end 1981-09-30 16:00:00 (Wed)
  62490618000, #  local_start 1981-04-01 01:00:00 (Wed)
  62506425600, #    local_end 1981-10-01 00:00:00 (Thu)
  28800,
  1,
  '+08',
      ],
      [
  62506396800, #    utc_start 1981-09-30 16:00:00 (Wed)
  62522125200, #      utc_end 1982-03-31 17:00:00 (Wed)
  62506422000, #  local_start 1981-09-30 23:00:00 (Wed)
  62522150400, #    local_end 1982-04-01 00:00:00 (Thu)
  25200,
  0,
  '+07',
      ],
      [
  62522125200, #    utc_start 1982-03-31 17:00:00 (Wed)
  62537932800, #      utc_end 1982-09-30 16:00:00 (Thu)
  62522154000, #  local_start 1982-04-01 01:00:00 (Thu)
  62537961600, #    local_end 1982-10-01 00:00:00 (Fri)
  28800,
  1,
  '+08',
      ],
      [
  62537932800, #    utc_start 1982-09-30 16:00:00 (Thu)
  62553661200, #      utc_end 1983-03-31 17:00:00 (Thu)
  62537958000, #  local_start 1982-09-30 23:00:00 (Thu)
  62553686400, #    local_end 1983-04-01 00:00:00 (Fri)
  25200,
  0,
  '+07',
      ],
      [
  62553661200, #    utc_start 1983-03-31 17:00:00 (Thu)
  62569468800, #      utc_end 1983-09-30 16:00:00 (Fri)
  62553690000, #  local_start 1983-04-01 01:00:00 (Fri)
  62569497600, #    local_end 1983-10-01 00:00:00 (Sat)
  28800,
  1,
  '+08',
      ],
      [
  62569468800, #    utc_start 1983-09-30 16:00:00 (Fri)
  62585283600, #      utc_end 1984-03-31 17:00:00 (Sat)
  62569494000, #  local_start 1983-09-30 23:00:00 (Fri)
  62585308800, #    local_end 1984-04-01 00:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62585283600, #    utc_start 1984-03-31 17:00:00 (Sat)
  62601015600, #      utc_end 1984-09-29 19:00:00 (Sat)
  62585312400, #  local_start 1984-04-01 01:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62601015600, #    utc_start 1984-09-29 19:00:00 (Sat)
  62616740400, #      utc_end 1985-03-30 19:00:00 (Sat)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62616740400, #    utc_start 1985-03-30 19:00:00 (Sat)
  62632465200, #      utc_end 1985-09-28 19:00:00 (Sat)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62632465200, #    utc_start 1985-09-28 19:00:00 (Sat)
  62648190000, #      utc_end 1986-03-29 19:00:00 (Sat)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62648190000, #    utc_start 1986-03-29 19:00:00 (Sat)
  62663914800, #      utc_end 1986-09-27 19:00:00 (Sat)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62663914800, #    utc_start 1986-09-27 19:00:00 (Sat)
  62679639600, #      utc_end 1987-03-28 19:00:00 (Sat)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62679639600, #    utc_start 1987-03-28 19:00:00 (Sat)
  62695364400, #      utc_end 1987-09-26 19:00:00 (Sat)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62695364400, #    utc_start 1987-09-26 19:00:00 (Sat)
  62711089200, #      utc_end 1988-03-26 19:00:00 (Sat)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62711089200, #    utc_start 1988-03-26 19:00:00 (Sat)
  62726814000, #      utc_end 1988-09-24 19:00:00 (Sat)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62726814000, #    utc_start 1988-09-24 19:00:00 (Sat)
  62742538800, #      utc_end 1989-03-25 19:00:00 (Sat)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62742538800, #    utc_start 1989-03-25 19:00:00 (Sat)
  62758263600, #      utc_end 1989-09-23 19:00:00 (Sat)
  62742567600, #  local_start 1989-03-26 03:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62758263600, #    utc_start 1989-09-23 19:00:00 (Sat)
  62773988400, #      utc_end 1990-03-24 19:00:00 (Sat)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62773988400, #    utc_start 1990-03-24 19:00:00 (Sat)
  62790318000, #      utc_end 1990-09-29 19:00:00 (Sat)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62790318000, #    utc_start 1990-09-29 19:00:00 (Sat)
  62806042800, #      utc_end 1991-03-30 19:00:00 (Sat)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62806042800, #    utc_start 1991-03-30 19:00:00 (Sat)
  62821771200, #      utc_end 1991-09-28 20:00:00 (Sat)
  62806068000, #  local_start 1991-03-31 02:00:00 (Sun)
  62821796400, #    local_end 1991-09-29 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  62821771200, #    utc_start 1991-09-28 20:00:00 (Sat)
  62831448000, #      utc_end 1992-01-18 20:00:00 (Sat)
  62821792800, #  local_start 1991-09-29 02:00:00 (Sun)
  62831469600, #    local_end 1992-01-19 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  62831448000, #    utc_start 1992-01-18 20:00:00 (Sat)
  62837492400, #      utc_end 1992-03-28 19:00:00 (Sat)
  62831473200, #  local_start 1992-01-19 03:00:00 (Sun)
  62837517600, #    local_end 1992-03-29 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62837492400, #    utc_start 1992-03-28 19:00:00 (Sat)
  62853217200, #      utc_end 1992-09-26 19:00:00 (Sat)
  62837521200, #  local_start 1992-03-29 03:00:00 (Sun)
  62853246000, #    local_end 1992-09-27 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62853217200, #    utc_start 1992-09-26 19:00:00 (Sat)
  62868942000, #      utc_end 1993-03-27 19:00:00 (Sat)
  62853242400, #  local_start 1992-09-27 02:00:00 (Sun)
  62868967200, #    local_end 1993-03-28 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62868942000, #    utc_start 1993-03-27 19:00:00 (Sat)
  62873769600, #      utc_end 1993-05-22 16:00:00 (Sat)
  62868970800, #  local_start 1993-03-28 03:00:00 (Sun)
  62873798400, #    local_end 1993-05-23 00:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62873769600, #    utc_start 1993-05-22 16:00:00 (Sat)
  62884670400, #      utc_end 1993-09-25 20:00:00 (Sat)
  62873794800, #  local_start 1993-05-22 23:00:00 (Sat)
  62884695600, #    local_end 1993-09-26 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  62884670400, #    utc_start 1993-09-25 20:00:00 (Sat)
  62900395200, #      utc_end 1994-03-26 20:00:00 (Sat)
  62884692000, #  local_start 1993-09-26 02:00:00 (Sun)
  62900416800, #    local_end 1994-03-27 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  62900395200, #    utc_start 1994-03-26 20:00:00 (Sat)
  62916120000, #      utc_end 1994-09-24 20:00:00 (Sat)
  62900420400, #  local_start 1994-03-27 03:00:00 (Sun)
  62916145200, #    local_end 1994-09-25 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  62916120000, #    utc_start 1994-09-24 20:00:00 (Sat)
  62931844800, #      utc_end 1995-03-25 20:00:00 (Sat)
  62916141600, #  local_start 1994-09-25 02:00:00 (Sun)
  62931866400, #    local_end 1995-03-26 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  62931844800, #    utc_start 1995-03-25 20:00:00 (Sat)
  62947569600, #      utc_end 1995-09-23 20:00:00 (Sat)
  62931870000, #  local_start 1995-03-26 03:00:00 (Sun)
  62947594800, #    local_end 1995-09-24 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  62947569600, #    utc_start 1995-09-23 20:00:00 (Sat)
  62963899200, #      utc_end 1996-03-30 20:00:00 (Sat)
  62947591200, #  local_start 1995-09-24 02:00:00 (Sun)
  62963920800, #    local_end 1996-03-31 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  62963899200, #    utc_start 1996-03-30 20:00:00 (Sat)
  62982043200, #      utc_end 1996-10-26 20:00:00 (Sat)
  62963924400, #  local_start 1996-03-31 03:00:00 (Sun)
  62982068400, #    local_end 1996-10-27 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  62982043200, #    utc_start 1996-10-26 20:00:00 (Sat)
  62995348800, #      utc_end 1997-03-29 20:00:00 (Sat)
  62982064800, #  local_start 1996-10-27 02:00:00 (Sun)
  62995370400, #    local_end 1997-03-30 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  62995348800, #    utc_start 1997-03-29 20:00:00 (Sat)
  63013492800, #      utc_end 1997-10-25 20:00:00 (Sat)
  62995374000, #  local_start 1997-03-30 03:00:00 (Sun)
  63013518000, #    local_end 1997-10-26 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  63013492800, #    utc_start 1997-10-25 20:00:00 (Sat)
  63026798400, #      utc_end 1998-03-28 20:00:00 (Sat)
  63013514400, #  local_start 1997-10-26 02:00:00 (Sun)
  63026820000, #    local_end 1998-03-29 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  63026798400, #    utc_start 1998-03-28 20:00:00 (Sat)
  63044942400, #      utc_end 1998-10-24 20:00:00 (Sat)
  63026823600, #  local_start 1998-03-29 03:00:00 (Sun)
  63044967600, #    local_end 1998-10-25 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  63044942400, #    utc_start 1998-10-24 20:00:00 (Sat)
  63058248000, #      utc_end 1999-03-27 20:00:00 (Sat)
  63044964000, #  local_start 1998-10-25 02:00:00 (Sun)
  63058269600, #    local_end 1999-03-28 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  63058248000, #    utc_start 1999-03-27 20:00:00 (Sat)
  63076996800, #      utc_end 1999-10-30 20:00:00 (Sat)
  63058273200, #  local_start 1999-03-28 03:00:00 (Sun)
  63077022000, #    local_end 1999-10-31 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  63076996800, #    utc_start 1999-10-30 20:00:00 (Sat)
  63089697600, #      utc_end 2000-03-25 20:00:00 (Sat)
  63077018400, #  local_start 1999-10-31 02:00:00 (Sun)
  63089719200, #    local_end 2000-03-26 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  63089697600, #    utc_start 2000-03-25 20:00:00 (Sat)
  63108446400, #      utc_end 2000-10-28 20:00:00 (Sat)
  63089722800, #  local_start 2000-03-26 03:00:00 (Sun)
  63108471600, #    local_end 2000-10-29 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  63108446400, #    utc_start 2000-10-28 20:00:00 (Sat)
  63121147200, #      utc_end 2001-03-24 20:00:00 (Sat)
  63108468000, #  local_start 2000-10-29 02:00:00 (Sun)
  63121168800, #    local_end 2001-03-25 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  63121147200, #    utc_start 2001-03-24 20:00:00 (Sat)
  63139896000, #      utc_end 2001-10-27 20:00:00 (Sat)
  63121172400, #  local_start 2001-03-25 03:00:00 (Sun)
  63139921200, #    local_end 2001-10-28 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  63139896000, #    utc_start 2001-10-27 20:00:00 (Sat)
  63153201600, #      utc_end 2002-03-30 20:00:00 (Sat)
  63139917600, #  local_start 2001-10-28 02:00:00 (Sun)
  63153223200, #    local_end 2002-03-31 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  63153201600, #    utc_start 2002-03-30 20:00:00 (Sat)
  63171345600, #      utc_end 2002-10-26 20:00:00 (Sat)
  63153226800, #  local_start 2002-03-31 03:00:00 (Sun)
  63171370800, #    local_end 2002-10-27 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  63171345600, #    utc_start 2002-10-26 20:00:00 (Sat)
  63184651200, #      utc_end 2003-03-29 20:00:00 (Sat)
  63171367200, #  local_start 2002-10-27 02:00:00 (Sun)
  63184672800, #    local_end 2003-03-30 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  63184651200, #    utc_start 2003-03-29 20:00:00 (Sat)
  63202795200, #      utc_end 2003-10-25 20:00:00 (Sat)
  63184676400, #  local_start 2003-03-30 03:00:00 (Sun)
  63202820400, #    local_end 2003-10-26 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  63202795200, #    utc_start 2003-10-25 20:00:00 (Sat)
  63216100800, #      utc_end 2004-03-27 20:00:00 (Sat)
  63202816800, #  local_start 2003-10-26 02:00:00 (Sun)
  63216122400, #    local_end 2004-03-28 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  63216100800, #    utc_start 2004-03-27 20:00:00 (Sat)
  63234849600, #      utc_end 2004-10-30 20:00:00 (Sat)
  63216126000, #  local_start 2004-03-28 03:00:00 (Sun)
  63234874800, #    local_end 2004-10-31 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  63234849600, #    utc_start 2004-10-30 20:00:00 (Sat)
  63247550400, #      utc_end 2005-03-26 20:00:00 (Sat)
  63234871200, #  local_start 2004-10-31 02:00:00 (Sun)
  63247572000, #    local_end 2005-03-27 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  63247550400, #    utc_start 2005-03-26 20:00:00 (Sat)
  63266299200, #      utc_end 2005-10-29 20:00:00 (Sat)
  63247575600, #  local_start 2005-03-27 03:00:00 (Sun)
  63266324400, #    local_end 2005-10-30 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  63266299200, #    utc_start 2005-10-29 20:00:00 (Sat)
  63279000000, #      utc_end 2006-03-25 20:00:00 (Sat)
  63266320800, #  local_start 2005-10-30 02:00:00 (Sun)
  63279021600, #    local_end 2006-03-26 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  63279000000, #    utc_start 2006-03-25 20:00:00 (Sat)
  63297748800, #      utc_end 2006-10-28 20:00:00 (Sat)
  63279025200, #  local_start 2006-03-26 03:00:00 (Sun)
  63297774000, #    local_end 2006-10-29 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  63297748800, #    utc_start 2006-10-28 20:00:00 (Sat)
  63310449600, #      utc_end 2007-03-24 20:00:00 (Sat)
  63297770400, #  local_start 2006-10-29 02:00:00 (Sun)
  63310471200, #    local_end 2007-03-25 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  63310449600, #    utc_start 2007-03-24 20:00:00 (Sat)
  63329198400, #      utc_end 2007-10-27 20:00:00 (Sat)
  63310474800, #  local_start 2007-03-25 03:00:00 (Sun)
  63329223600, #    local_end 2007-10-28 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  63329198400, #    utc_start 2007-10-27 20:00:00 (Sat)
  63342504000, #      utc_end 2008-03-29 20:00:00 (Sat)
  63329220000, #  local_start 2007-10-28 02:00:00 (Sun)
  63342525600, #    local_end 2008-03-30 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  63342504000, #    utc_start 2008-03-29 20:00:00 (Sat)
  63360648000, #      utc_end 2008-10-25 20:00:00 (Sat)
  63342529200, #  local_start 2008-03-30 03:00:00 (Sun)
  63360673200, #    local_end 2008-10-26 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  63360648000, #    utc_start 2008-10-25 20:00:00 (Sat)
  63373953600, #      utc_end 2009-03-28 20:00:00 (Sat)
  63360669600, #  local_start 2008-10-26 02:00:00 (Sun)
  63373975200, #    local_end 2009-03-29 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  63373953600, #    utc_start 2009-03-28 20:00:00 (Sat)
  63392097600, #      utc_end 2009-10-24 20:00:00 (Sat)
  63373978800, #  local_start 2009-03-29 03:00:00 (Sun)
  63392122800, #    local_end 2009-10-25 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  63392097600, #    utc_start 2009-10-24 20:00:00 (Sat)
  63405403200, #      utc_end 2010-03-27 20:00:00 (Sat)
  63392119200, #  local_start 2009-10-25 02:00:00 (Sun)
  63405424800, #    local_end 2010-03-28 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  63405403200, #    utc_start 2010-03-27 20:00:00 (Sat)
  63424152000, #      utc_end 2010-10-30 20:00:00 (Sat)
  63405428400, #  local_start 2010-03-28 03:00:00 (Sun)
  63424177200, #    local_end 2010-10-31 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  63424152000, #    utc_start 2010-10-30 20:00:00 (Sat)
  63436852800, #      utc_end 2011-03-26 20:00:00 (Sat)
  63424173600, #  local_start 2010-10-31 02:00:00 (Sun)
  63436874400, #    local_end 2011-03-27 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  63436852800, #    utc_start 2011-03-26 20:00:00 (Sat)
  63549946800, #      utc_end 2014-10-25 19:00:00 (Sat)
  63436878000, #  local_start 2011-03-27 03:00:00 (Sun)
  63549972000, #    local_end 2014-10-26 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  63549946800, #    utc_start 2014-10-25 19:00:00 (Sat)
  63604987200, #      utc_end 2016-07-23 20:00:00 (Sat)
  63549968400, #  local_start 2014-10-26 01:00:00 (Sun)
  63605008800, #    local_end 2016-07-24 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  63604987200, #    utc_start 2016-07-23 20:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  63605012400, #  local_start 2016-07-24 03:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  25200,
  0,
  '+07',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {31}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_NOVOSIBIRSK

    $main::fatpacked{"DateTime/TimeZone/Asia/Omsk.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_OMSK';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Omsk;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Omsk::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60553595190, #      utc_end 1919-11-13 19:06:30 (Thu)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60553612800, #    local_end 1919-11-14 00:00:00 (Fri)
  17610,
  0,
  'LMT',
      ],
      [
  60553595190, #    utc_start 1919-11-13 19:06:30 (Thu)
  60888135600, #      utc_end 1930-06-20 19:00:00 (Fri)
  60553613190, #  local_start 1919-11-14 00:06:30 (Fri)
  60888153600, #    local_end 1930-06-21 00:00:00 (Sat)
  18000,
  0,
  '+05',
      ],
      [
  60888135600, #    utc_start 1930-06-20 19:00:00 (Fri)
  62490592800, #      utc_end 1981-03-31 18:00:00 (Tue)
  60888157200, #  local_start 1930-06-21 01:00:00 (Sat)
  62490614400, #    local_end 1981-04-01 00:00:00 (Wed)
  21600,
  0,
  '+06',
      ],
      [
  62490592800, #    utc_start 1981-03-31 18:00:00 (Tue)
  62506400400, #      utc_end 1981-09-30 17:00:00 (Wed)
  62490618000, #  local_start 1981-04-01 01:00:00 (Wed)
  62506425600, #    local_end 1981-10-01 00:00:00 (Thu)
  25200,
  1,
  '+07',
      ],
      [
  62506400400, #    utc_start 1981-09-30 17:00:00 (Wed)
  62522128800, #      utc_end 1982-03-31 18:00:00 (Wed)
  62506422000, #  local_start 1981-09-30 23:00:00 (Wed)
  62522150400, #    local_end 1982-04-01 00:00:00 (Thu)
  21600,
  0,
  '+06',
      ],
      [
  62522128800, #    utc_start 1982-03-31 18:00:00 (Wed)
  62537936400, #      utc_end 1982-09-30 17:00:00 (Thu)
  62522154000, #  local_start 1982-04-01 01:00:00 (Thu)
  62537961600, #    local_end 1982-10-01 00:00:00 (Fri)
  25200,
  1,
  '+07',
      ],
      [
  62537936400, #    utc_start 1982-09-30 17:00:00 (Thu)
  62553664800, #      utc_end 1983-03-31 18:00:00 (Thu)
  62537958000, #  local_start 1982-09-30 23:00:00 (Thu)
  62553686400, #    local_end 1983-04-01 00:00:00 (Fri)
  21600,
  0,
  '+06',
      ],
      [
  62553664800, #    utc_start 1983-03-31 18:00:00 (Thu)
  62569472400, #      utc_end 1983-09-30 17:00:00 (Fri)
  62553690000, #  local_start 1983-04-01 01:00:00 (Fri)
  62569497600, #    local_end 1983-10-01 00:00:00 (Sat)
  25200,
  1,
  '+07',
      ],
      [
  62569472400, #    utc_start 1983-09-30 17:00:00 (Fri)
  62585287200, #      utc_end 1984-03-31 18:00:00 (Sat)
  62569494000, #  local_start 1983-09-30 23:00:00 (Fri)
  62585308800, #    local_end 1984-04-01 00:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  62585287200, #    utc_start 1984-03-31 18:00:00 (Sat)
  62601019200, #      utc_end 1984-09-29 20:00:00 (Sat)
  62585312400, #  local_start 1984-04-01 01:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  62601019200, #    utc_start 1984-09-29 20:00:00 (Sat)
  62616744000, #      utc_end 1985-03-30 20:00:00 (Sat)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  62616744000, #    utc_start 1985-03-30 20:00:00 (Sat)
  62632468800, #      utc_end 1985-09-28 20:00:00 (Sat)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  62632468800, #    utc_start 1985-09-28 20:00:00 (Sat)
  62648193600, #      utc_end 1986-03-29 20:00:00 (Sat)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  62648193600, #    utc_start 1986-03-29 20:00:00 (Sat)
  62663918400, #      utc_end 1986-09-27 20:00:00 (Sat)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  62663918400, #    utc_start 1986-09-27 20:00:00 (Sat)
  62679643200, #      utc_end 1987-03-28 20:00:00 (Sat)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  62679643200, #    utc_start 1987-03-28 20:00:00 (Sat)
  62695368000, #      utc_end 1987-09-26 20:00:00 (Sat)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  62695368000, #    utc_start 1987-09-26 20:00:00 (Sat)
  62711092800, #      utc_end 1988-03-26 20:00:00 (Sat)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  62711092800, #    utc_start 1988-03-26 20:00:00 (Sat)
  62726817600, #      utc_end 1988-09-24 20:00:00 (Sat)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  62726817600, #    utc_start 1988-09-24 20:00:00 (Sat)
  62742542400, #      utc_end 1989-03-25 20:00:00 (Sat)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  62742542400, #    utc_start 1989-03-25 20:00:00 (Sat)
  62758267200, #      utc_end 1989-09-23 20:00:00 (Sat)
  62742567600, #  local_start 1989-03-26 03:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  62758267200, #    utc_start 1989-09-23 20:00:00 (Sat)
  62773992000, #      utc_end 1990-03-24 20:00:00 (Sat)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  62773992000, #    utc_start 1990-03-24 20:00:00 (Sat)
  62790321600, #      utc_end 1990-09-29 20:00:00 (Sat)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  62790321600, #    utc_start 1990-09-29 20:00:00 (Sat)
  62806046400, #      utc_end 1991-03-30 20:00:00 (Sat)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  62806046400, #    utc_start 1991-03-30 20:00:00 (Sat)
  62821774800, #      utc_end 1991-09-28 21:00:00 (Sat)
  62806068000, #  local_start 1991-03-31 02:00:00 (Sun)
  62821796400, #    local_end 1991-09-29 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62821774800, #    utc_start 1991-09-28 21:00:00 (Sat)
  62831451600, #      utc_end 1992-01-18 21:00:00 (Sat)
  62821792800, #  local_start 1991-09-29 02:00:00 (Sun)
  62831469600, #    local_end 1992-01-19 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62831451600, #    utc_start 1992-01-18 21:00:00 (Sat)
  62837496000, #      utc_end 1992-03-28 20:00:00 (Sat)
  62831473200, #  local_start 1992-01-19 03:00:00 (Sun)
  62837517600, #    local_end 1992-03-29 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  62837496000, #    utc_start 1992-03-28 20:00:00 (Sat)
  62853220800, #      utc_end 1992-09-26 20:00:00 (Sat)
  62837521200, #  local_start 1992-03-29 03:00:00 (Sun)
  62853246000, #    local_end 1992-09-27 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  62853220800, #    utc_start 1992-09-26 20:00:00 (Sat)
  62868945600, #      utc_end 1993-03-27 20:00:00 (Sat)
  62853242400, #  local_start 1992-09-27 02:00:00 (Sun)
  62868967200, #    local_end 1993-03-28 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  62868945600, #    utc_start 1993-03-27 20:00:00 (Sat)
  62884670400, #      utc_end 1993-09-25 20:00:00 (Sat)
  62868970800, #  local_start 1993-03-28 03:00:00 (Sun)
  62884695600, #    local_end 1993-09-26 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  62884670400, #    utc_start 1993-09-25 20:00:00 (Sat)
  62900395200, #      utc_end 1994-03-26 20:00:00 (Sat)
  62884692000, #  local_start 1993-09-26 02:00:00 (Sun)
  62900416800, #    local_end 1994-03-27 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  62900395200, #    utc_start 1994-03-26 20:00:00 (Sat)
  62916120000, #      utc_end 1994-09-24 20:00:00 (Sat)
  62900420400, #  local_start 1994-03-27 03:00:00 (Sun)
  62916145200, #    local_end 1994-09-25 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  62916120000, #    utc_start 1994-09-24 20:00:00 (Sat)
  62931844800, #      utc_end 1995-03-25 20:00:00 (Sat)
  62916141600, #  local_start 1994-09-25 02:00:00 (Sun)
  62931866400, #    local_end 1995-03-26 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  62931844800, #    utc_start 1995-03-25 20:00:00 (Sat)
  62947569600, #      utc_end 1995-09-23 20:00:00 (Sat)
  62931870000, #  local_start 1995-03-26 03:00:00 (Sun)
  62947594800, #    local_end 1995-09-24 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  62947569600, #    utc_start 1995-09-23 20:00:00 (Sat)
  62963899200, #      utc_end 1996-03-30 20:00:00 (Sat)
  62947591200, #  local_start 1995-09-24 02:00:00 (Sun)
  62963920800, #    local_end 1996-03-31 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  62963899200, #    utc_start 1996-03-30 20:00:00 (Sat)
  62982043200, #      utc_end 1996-10-26 20:00:00 (Sat)
  62963924400, #  local_start 1996-03-31 03:00:00 (Sun)
  62982068400, #    local_end 1996-10-27 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  62982043200, #    utc_start 1996-10-26 20:00:00 (Sat)
  62995348800, #      utc_end 1997-03-29 20:00:00 (Sat)
  62982064800, #  local_start 1996-10-27 02:00:00 (Sun)
  62995370400, #    local_end 1997-03-30 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  62995348800, #    utc_start 1997-03-29 20:00:00 (Sat)
  63013492800, #      utc_end 1997-10-25 20:00:00 (Sat)
  62995374000, #  local_start 1997-03-30 03:00:00 (Sun)
  63013518000, #    local_end 1997-10-26 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  63013492800, #    utc_start 1997-10-25 20:00:00 (Sat)
  63026798400, #      utc_end 1998-03-28 20:00:00 (Sat)
  63013514400, #  local_start 1997-10-26 02:00:00 (Sun)
  63026820000, #    local_end 1998-03-29 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  63026798400, #    utc_start 1998-03-28 20:00:00 (Sat)
  63044942400, #      utc_end 1998-10-24 20:00:00 (Sat)
  63026823600, #  local_start 1998-03-29 03:00:00 (Sun)
  63044967600, #    local_end 1998-10-25 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  63044942400, #    utc_start 1998-10-24 20:00:00 (Sat)
  63058248000, #      utc_end 1999-03-27 20:00:00 (Sat)
  63044964000, #  local_start 1998-10-25 02:00:00 (Sun)
  63058269600, #    local_end 1999-03-28 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  63058248000, #    utc_start 1999-03-27 20:00:00 (Sat)
  63076996800, #      utc_end 1999-10-30 20:00:00 (Sat)
  63058273200, #  local_start 1999-03-28 03:00:00 (Sun)
  63077022000, #    local_end 1999-10-31 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  63076996800, #    utc_start 1999-10-30 20:00:00 (Sat)
  63089697600, #      utc_end 2000-03-25 20:00:00 (Sat)
  63077018400, #  local_start 1999-10-31 02:00:00 (Sun)
  63089719200, #    local_end 2000-03-26 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  63089697600, #    utc_start 2000-03-25 20:00:00 (Sat)
  63108446400, #      utc_end 2000-10-28 20:00:00 (Sat)
  63089722800, #  local_start 2000-03-26 03:00:00 (Sun)
  63108471600, #    local_end 2000-10-29 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  63108446400, #    utc_start 2000-10-28 20:00:00 (Sat)
  63121147200, #      utc_end 2001-03-24 20:00:00 (Sat)
  63108468000, #  local_start 2000-10-29 02:00:00 (Sun)
  63121168800, #    local_end 2001-03-25 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  63121147200, #    utc_start 2001-03-24 20:00:00 (Sat)
  63139896000, #      utc_end 2001-10-27 20:00:00 (Sat)
  63121172400, #  local_start 2001-03-25 03:00:00 (Sun)
  63139921200, #    local_end 2001-10-28 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  63139896000, #    utc_start 2001-10-27 20:00:00 (Sat)
  63153201600, #      utc_end 2002-03-30 20:00:00 (Sat)
  63139917600, #  local_start 2001-10-28 02:00:00 (Sun)
  63153223200, #    local_end 2002-03-31 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  63153201600, #    utc_start 2002-03-30 20:00:00 (Sat)
  63171345600, #      utc_end 2002-10-26 20:00:00 (Sat)
  63153226800, #  local_start 2002-03-31 03:00:00 (Sun)
  63171370800, #    local_end 2002-10-27 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  63171345600, #    utc_start 2002-10-26 20:00:00 (Sat)
  63184651200, #      utc_end 2003-03-29 20:00:00 (Sat)
  63171367200, #  local_start 2002-10-27 02:00:00 (Sun)
  63184672800, #    local_end 2003-03-30 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  63184651200, #    utc_start 2003-03-29 20:00:00 (Sat)
  63202795200, #      utc_end 2003-10-25 20:00:00 (Sat)
  63184676400, #  local_start 2003-03-30 03:00:00 (Sun)
  63202820400, #    local_end 2003-10-26 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  63202795200, #    utc_start 2003-10-25 20:00:00 (Sat)
  63216100800, #      utc_end 2004-03-27 20:00:00 (Sat)
  63202816800, #  local_start 2003-10-26 02:00:00 (Sun)
  63216122400, #    local_end 2004-03-28 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  63216100800, #    utc_start 2004-03-27 20:00:00 (Sat)
  63234849600, #      utc_end 2004-10-30 20:00:00 (Sat)
  63216126000, #  local_start 2004-03-28 03:00:00 (Sun)
  63234874800, #    local_end 2004-10-31 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  63234849600, #    utc_start 2004-10-30 20:00:00 (Sat)
  63247550400, #      utc_end 2005-03-26 20:00:00 (Sat)
  63234871200, #  local_start 2004-10-31 02:00:00 (Sun)
  63247572000, #    local_end 2005-03-27 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  63247550400, #    utc_start 2005-03-26 20:00:00 (Sat)
  63266299200, #      utc_end 2005-10-29 20:00:00 (Sat)
  63247575600, #  local_start 2005-03-27 03:00:00 (Sun)
  63266324400, #    local_end 2005-10-30 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  63266299200, #    utc_start 2005-10-29 20:00:00 (Sat)
  63279000000, #      utc_end 2006-03-25 20:00:00 (Sat)
  63266320800, #  local_start 2005-10-30 02:00:00 (Sun)
  63279021600, #    local_end 2006-03-26 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  63279000000, #    utc_start 2006-03-25 20:00:00 (Sat)
  63297748800, #      utc_end 2006-10-28 20:00:00 (Sat)
  63279025200, #  local_start 2006-03-26 03:00:00 (Sun)
  63297774000, #    local_end 2006-10-29 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  63297748800, #    utc_start 2006-10-28 20:00:00 (Sat)
  63310449600, #      utc_end 2007-03-24 20:00:00 (Sat)
  63297770400, #  local_start 2006-10-29 02:00:00 (Sun)
  63310471200, #    local_end 2007-03-25 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  63310449600, #    utc_start 2007-03-24 20:00:00 (Sat)
  63329198400, #      utc_end 2007-10-27 20:00:00 (Sat)
  63310474800, #  local_start 2007-03-25 03:00:00 (Sun)
  63329223600, #    local_end 2007-10-28 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  63329198400, #    utc_start 2007-10-27 20:00:00 (Sat)
  63342504000, #      utc_end 2008-03-29 20:00:00 (Sat)
  63329220000, #  local_start 2007-10-28 02:00:00 (Sun)
  63342525600, #    local_end 2008-03-30 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  63342504000, #    utc_start 2008-03-29 20:00:00 (Sat)
  63360648000, #      utc_end 2008-10-25 20:00:00 (Sat)
  63342529200, #  local_start 2008-03-30 03:00:00 (Sun)
  63360673200, #    local_end 2008-10-26 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  63360648000, #    utc_start 2008-10-25 20:00:00 (Sat)
  63373953600, #      utc_end 2009-03-28 20:00:00 (Sat)
  63360669600, #  local_start 2008-10-26 02:00:00 (Sun)
  63373975200, #    local_end 2009-03-29 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  63373953600, #    utc_start 2009-03-28 20:00:00 (Sat)
  63392097600, #      utc_end 2009-10-24 20:00:00 (Sat)
  63373978800, #  local_start 2009-03-29 03:00:00 (Sun)
  63392122800, #    local_end 2009-10-25 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  63392097600, #    utc_start 2009-10-24 20:00:00 (Sat)
  63405403200, #      utc_end 2010-03-27 20:00:00 (Sat)
  63392119200, #  local_start 2009-10-25 02:00:00 (Sun)
  63405424800, #    local_end 2010-03-28 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  63405403200, #    utc_start 2010-03-27 20:00:00 (Sat)
  63424152000, #      utc_end 2010-10-30 20:00:00 (Sat)
  63405428400, #  local_start 2010-03-28 03:00:00 (Sun)
  63424177200, #    local_end 2010-10-31 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  63424152000, #    utc_start 2010-10-30 20:00:00 (Sat)
  63436852800, #      utc_end 2011-03-26 20:00:00 (Sat)
  63424173600, #  local_start 2010-10-31 02:00:00 (Sun)
  63436874400, #    local_end 2011-03-27 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  63436852800, #    utc_start 2011-03-26 20:00:00 (Sat)
  63549946800, #      utc_end 2014-10-25 19:00:00 (Sat)
  63436878000, #  local_start 2011-03-27 03:00:00 (Sun)
  63549972000, #    local_end 2014-10-26 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  63549946800, #    utc_start 2014-10-25 19:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  63549968400, #  local_start 2014-10-26 01:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  21600,
  0,
  '+06',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {30}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_OMSK

    $main::fatpacked{"DateTime/TimeZone/Asia/Oral.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_ORAL';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/asia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Oral;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Oral::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60694518876, #      utc_end 1924-05-01 20:34:36 (Thu)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60694531200, #    local_end 1924-05-02 00:00:00 (Fri)
  12324,
  0,
  'LMT',
      ],
      [
  60694518876, #    utc_start 1924-05-01 20:34:36 (Thu)
  60888142800, #      utc_end 1930-06-20 21:00:00 (Fri)
  60694529676, #  local_start 1924-05-01 23:34:36 (Thu)
  60888153600, #    local_end 1930-06-21 00:00:00 (Sat)
  10800,
  0,
  '+03',
      ],
      [
  60888142800, #    utc_start 1930-06-20 21:00:00 (Fri)
  62490596400, #      utc_end 1981-03-31 19:00:00 (Tue)
  60888160800, #  local_start 1930-06-21 02:00:00 (Sat)
  62490614400, #    local_end 1981-04-01 00:00:00 (Wed)
  18000,
  0,
  '+05',
      ],
      [
  62490596400, #    utc_start 1981-03-31 19:00:00 (Tue)
  62506404000, #      utc_end 1981-09-30 18:00:00 (Wed)
  62490618000, #  local_start 1981-04-01 01:00:00 (Wed)
  62506425600, #    local_end 1981-10-01 00:00:00 (Thu)
  21600,
  1,
  '+06',
      ],
      [
  62506404000, #    utc_start 1981-09-30 18:00:00 (Wed)
  62522128800, #      utc_end 1982-03-31 18:00:00 (Wed)
  62506425600, #  local_start 1981-10-01 00:00:00 (Thu)
  62522150400, #    local_end 1982-04-01 00:00:00 (Thu)
  21600,
  0,
  '+06',
      ],
      [
  62522128800, #    utc_start 1982-03-31 18:00:00 (Wed)
  62537940000, #      utc_end 1982-09-30 18:00:00 (Thu)
  62522150400, #  local_start 1982-04-01 00:00:00 (Thu)
  62537961600, #    local_end 1982-10-01 00:00:00 (Fri)
  21600,
  1,
  '+06',
      ],
      [
  62537940000, #    utc_start 1982-09-30 18:00:00 (Thu)
  62553668400, #      utc_end 1983-03-31 19:00:00 (Thu)
  62537958000, #  local_start 1982-09-30 23:00:00 (Thu)
  62553686400, #    local_end 1983-04-01 00:00:00 (Fri)
  18000,
  0,
  '+05',
      ],
      [
  62553668400, #    utc_start 1983-03-31 19:00:00 (Thu)
  62569476000, #      utc_end 1983-09-30 18:00:00 (Fri)
  62553690000, #  local_start 1983-04-01 01:00:00 (Fri)
  62569497600, #    local_end 1983-10-01 00:00:00 (Sat)
  21600,
  1,
  '+06',
      ],
      [
  62569476000, #    utc_start 1983-09-30 18:00:00 (Fri)
  62585290800, #      utc_end 1984-03-31 19:00:00 (Sat)
  62569494000, #  local_start 1983-09-30 23:00:00 (Fri)
  62585308800, #    local_end 1984-04-01 00:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62585290800, #    utc_start 1984-03-31 19:00:00 (Sat)
  62601022800, #      utc_end 1984-09-29 21:00:00 (Sat)
  62585312400, #  local_start 1984-04-01 01:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62601022800, #    utc_start 1984-09-29 21:00:00 (Sat)
  62616747600, #      utc_end 1985-03-30 21:00:00 (Sat)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62616747600, #    utc_start 1985-03-30 21:00:00 (Sat)
  62632472400, #      utc_end 1985-09-28 21:00:00 (Sat)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62632472400, #    utc_start 1985-09-28 21:00:00 (Sat)
  62648197200, #      utc_end 1986-03-29 21:00:00 (Sat)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62648197200, #    utc_start 1986-03-29 21:00:00 (Sat)
  62663922000, #      utc_end 1986-09-27 21:00:00 (Sat)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62663922000, #    utc_start 1986-09-27 21:00:00 (Sat)
  62679646800, #      utc_end 1987-03-28 21:00:00 (Sat)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62679646800, #    utc_start 1987-03-28 21:00:00 (Sat)
  62695371600, #      utc_end 1987-09-26 21:00:00 (Sat)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62695371600, #    utc_start 1987-09-26 21:00:00 (Sat)
  62711096400, #      utc_end 1988-03-26 21:00:00 (Sat)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62711096400, #    utc_start 1988-03-26 21:00:00 (Sat)
  62726821200, #      utc_end 1988-09-24 21:00:00 (Sat)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62726821200, #    utc_start 1988-09-24 21:00:00 (Sat)
  62742546000, #      utc_end 1989-03-25 21:00:00 (Sat)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62742546000, #    utc_start 1989-03-25 21:00:00 (Sat)
  62758274400, #      utc_end 1989-09-23 22:00:00 (Sat)
  62742564000, #  local_start 1989-03-26 02:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62758274400, #    utc_start 1989-09-23 22:00:00 (Sat)
  62773999200, #      utc_end 1990-03-24 22:00:00 (Sat)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62773999200, #    utc_start 1990-03-24 22:00:00 (Sat)
  62790328800, #      utc_end 1990-09-29 22:00:00 (Sat)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62790328800, #    utc_start 1990-09-29 22:00:00 (Sat)
  62806053600, #      utc_end 1991-03-30 22:00:00 (Sat)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62806053600, #    utc_start 1991-03-30 22:00:00 (Sat)
  62821778400, #      utc_end 1991-09-28 22:00:00 (Sat)
  62806071600, #  local_start 1991-03-31 03:00:00 (Sun)
  62821796400, #    local_end 1991-09-29 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62821778400, #    utc_start 1991-09-28 22:00:00 (Sat)
  62831455200, #      utc_end 1992-01-18 22:00:00 (Sat)
  62821792800, #  local_start 1991-09-29 02:00:00 (Sun)
  62831469600, #    local_end 1992-01-19 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62831455200, #    utc_start 1992-01-18 22:00:00 (Sat)
  62837499600, #      utc_end 1992-03-28 21:00:00 (Sat)
  62831473200, #  local_start 1992-01-19 03:00:00 (Sun)
  62837517600, #    local_end 1992-03-29 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62837499600, #    utc_start 1992-03-28 21:00:00 (Sat)
  62853228000, #      utc_end 1992-09-26 22:00:00 (Sat)
  62837517600, #  local_start 1992-03-29 02:00:00 (Sun)
  62853246000, #    local_end 1992-09-27 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62853228000, #    utc_start 1992-09-26 22:00:00 (Sat)
  62868952800, #      utc_end 1993-03-27 22:00:00 (Sat)
  62853242400, #  local_start 1992-09-27 02:00:00 (Sun)
  62868967200, #    local_end 1993-03-28 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62868952800, #    utc_start 1993-03-27 22:00:00 (Sat)
  62884677600, #      utc_end 1993-09-25 22:00:00 (Sat)
  62868970800, #  local_start 1993-03-28 03:00:00 (Sun)
  62884695600, #    local_end 1993-09-26 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62884677600, #    utc_start 1993-09-25 22:00:00 (Sat)
  62900402400, #      utc_end 1994-03-26 22:00:00 (Sat)
  62884692000, #  local_start 1993-09-26 02:00:00 (Sun)
  62900416800, #    local_end 1994-03-27 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62900402400, #    utc_start 1994-03-26 22:00:00 (Sat)
  62916127200, #      utc_end 1994-09-24 22:00:00 (Sat)
  62900420400, #  local_start 1994-03-27 03:00:00 (Sun)
  62916145200, #    local_end 1994-09-25 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62916127200, #    utc_start 1994-09-24 22:00:00 (Sat)
  62931852000, #      utc_end 1995-03-25 22:00:00 (Sat)
  62916141600, #  local_start 1994-09-25 02:00:00 (Sun)
  62931866400, #    local_end 1995-03-26 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62931852000, #    utc_start 1995-03-25 22:00:00 (Sat)
  62947576800, #      utc_end 1995-09-23 22:00:00 (Sat)
  62931870000, #  local_start 1995-03-26 03:00:00 (Sun)
  62947594800, #    local_end 1995-09-24 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62947576800, #    utc_start 1995-09-23 22:00:00 (Sat)
  62963906400, #      utc_end 1996-03-30 22:00:00 (Sat)
  62947591200, #  local_start 1995-09-24 02:00:00 (Sun)
  62963920800, #    local_end 1996-03-31 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62963906400, #    utc_start 1996-03-30 22:00:00 (Sat)
  62982050400, #      utc_end 1996-10-26 22:00:00 (Sat)
  62963924400, #  local_start 1996-03-31 03:00:00 (Sun)
  62982068400, #    local_end 1996-10-27 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62982050400, #    utc_start 1996-10-26 22:00:00 (Sat)
  62995356000, #      utc_end 1997-03-29 22:00:00 (Sat)
  62982064800, #  local_start 1996-10-27 02:00:00 (Sun)
  62995370400, #    local_end 1997-03-30 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62995356000, #    utc_start 1997-03-29 22:00:00 (Sat)
  63013500000, #      utc_end 1997-10-25 22:00:00 (Sat)
  62995374000, #  local_start 1997-03-30 03:00:00 (Sun)
  63013518000, #    local_end 1997-10-26 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63013500000, #    utc_start 1997-10-25 22:00:00 (Sat)
  63026805600, #      utc_end 1998-03-28 22:00:00 (Sat)
  63013514400, #  local_start 1997-10-26 02:00:00 (Sun)
  63026820000, #    local_end 1998-03-29 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63026805600, #    utc_start 1998-03-28 22:00:00 (Sat)
  63044949600, #      utc_end 1998-10-24 22:00:00 (Sat)
  63026823600, #  local_start 1998-03-29 03:00:00 (Sun)
  63044967600, #    local_end 1998-10-25 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63044949600, #    utc_start 1998-10-24 22:00:00 (Sat)
  63058255200, #      utc_end 1999-03-27 22:00:00 (Sat)
  63044964000, #  local_start 1998-10-25 02:00:00 (Sun)
  63058269600, #    local_end 1999-03-28 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63058255200, #    utc_start 1999-03-27 22:00:00 (Sat)
  63077004000, #      utc_end 1999-10-30 22:00:00 (Sat)
  63058273200, #  local_start 1999-03-28 03:00:00 (Sun)
  63077022000, #    local_end 1999-10-31 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63077004000, #    utc_start 1999-10-30 22:00:00 (Sat)
  63089704800, #      utc_end 2000-03-25 22:00:00 (Sat)
  63077018400, #  local_start 1999-10-31 02:00:00 (Sun)
  63089719200, #    local_end 2000-03-26 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63089704800, #    utc_start 2000-03-25 22:00:00 (Sat)
  63108453600, #      utc_end 2000-10-28 22:00:00 (Sat)
  63089722800, #  local_start 2000-03-26 03:00:00 (Sun)
  63108471600, #    local_end 2000-10-29 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63108453600, #    utc_start 2000-10-28 22:00:00 (Sat)
  63121154400, #      utc_end 2001-03-24 22:00:00 (Sat)
  63108468000, #  local_start 2000-10-29 02:00:00 (Sun)
  63121168800, #    local_end 2001-03-25 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63121154400, #    utc_start 2001-03-24 22:00:00 (Sat)
  63139903200, #      utc_end 2001-10-27 22:00:00 (Sat)
  63121172400, #  local_start 2001-03-25 03:00:00 (Sun)
  63139921200, #    local_end 2001-10-28 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63139903200, #    utc_start 2001-10-27 22:00:00 (Sat)
  63153208800, #      utc_end 2002-03-30 22:00:00 (Sat)
  63139917600, #  local_start 2001-10-28 02:00:00 (Sun)
  63153223200, #    local_end 2002-03-31 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63153208800, #    utc_start 2002-03-30 22:00:00 (Sat)
  63171352800, #      utc_end 2002-10-26 22:00:00 (Sat)
  63153226800, #  local_start 2002-03-31 03:00:00 (Sun)
  63171370800, #    local_end 2002-10-27 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63171352800, #    utc_start 2002-10-26 22:00:00 (Sat)
  63184658400, #      utc_end 2003-03-29 22:00:00 (Sat)
  63171367200, #  local_start 2002-10-27 02:00:00 (Sun)
  63184672800, #    local_end 2003-03-30 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63184658400, #    utc_start 2003-03-29 22:00:00 (Sat)
  63202802400, #      utc_end 2003-10-25 22:00:00 (Sat)
  63184676400, #  local_start 2003-03-30 03:00:00 (Sun)
  63202820400, #    local_end 2003-10-26 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63202802400, #    utc_start 2003-10-25 22:00:00 (Sat)
  63216108000, #      utc_end 2004-03-27 22:00:00 (Sat)
  63202816800, #  local_start 2003-10-26 02:00:00 (Sun)
  63216122400, #    local_end 2004-03-28 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63216108000, #    utc_start 2004-03-27 22:00:00 (Sat)
  63234856800, #      utc_end 2004-10-30 22:00:00 (Sat)
  63216126000, #  local_start 2004-03-28 03:00:00 (Sun)
  63234874800, #    local_end 2004-10-31 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63234856800, #    utc_start 2004-10-30 22:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  63234874800, #  local_start 2004-10-31 03:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  18000,
  0,
  '+05',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {24}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_ORAL

    $main::fatpacked{"DateTime/TimeZone/Asia/Pontianak.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_PONTIANAK';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/asia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Pontianak;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Pontianak::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60189496960, #      utc_end 1908-04-30 16:42:40 (Thu)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60189523200, #    local_end 1908-05-01 00:00:00 (Fri)
  26240,
  0,
  'LMT',
      ],
      [
  60189496960, #    utc_start 1908-04-30 16:42:40 (Thu)
  60962776960, #      utc_end 1932-10-31 16:42:40 (Mon)
  60189523200, #  local_start 1908-05-01 00:00:00 (Fri)
  60962803200, #    local_end 1932-11-01 00:00:00 (Tue)
  26240,
  0,
  'PMT',
      ],
      [
  60962776960, #    utc_start 1932-10-31 16:42:40 (Mon)
  61254462600, #      utc_end 1942-01-28 16:30:00 (Wed)
  60962803960, #  local_start 1932-11-01 00:12:40 (Tue)
  61254489600, #    local_end 1942-01-29 00:00:00 (Thu)
  27000,
  0,
  '+0730',
      ],
      [
  61254462600, #    utc_start 1942-01-28 16:30:00 (Wed)
  61369628400, #      utc_end 1945-09-22 15:00:00 (Sat)
  61254495000, #  local_start 1942-01-29 01:30:00 (Thu)
  61369660800, #    local_end 1945-09-23 00:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  61369628400, #    utc_start 1945-09-22 15:00:00 (Sat)
  61451800200, #      utc_end 1948-04-30 16:30:00 (Fri)
  61369655400, #  local_start 1945-09-22 22:30:00 (Sat)
  61451827200, #    local_end 1948-05-01 00:00:00 (Sat)
  27000,
  0,
  '+0730',
      ],
      [
  61451800200, #    utc_start 1948-04-30 16:30:00 (Fri)
  61514870400, #      utc_end 1950-04-30 16:00:00 (Sun)
  61451829000, #  local_start 1948-05-01 00:30:00 (Sat)
  61514899200, #    local_end 1950-05-01 00:00:00 (Mon)
  28800,
  0,
  '+08',
      ],
      [
  61514870400, #    utc_start 1950-04-30 16:00:00 (Sun)
  61946267400, #      utc_end 1963-12-31 16:30:00 (Tue)
  61514897400, #  local_start 1950-04-30 23:30:00 (Sun)
  61946294400, #    local_end 1964-01-01 00:00:00 (Wed)
  27000,
  0,
  '+0730',
      ],
      [
  61946267400, #    utc_start 1963-12-31 16:30:00 (Tue)
  62703648000, #      utc_end 1987-12-31 16:00:00 (Thu)
  61946296200, #  local_start 1964-01-01 00:30:00 (Wed)
  62703676800, #    local_end 1988-01-01 00:00:00 (Fri)
  28800,
  0,
  'WITA',
      ],
      [
  62703648000, #    utc_start 1987-12-31 16:00:00 (Thu)
  DateTime::TimeZone::INFINITY, #      utc_end
  62703673200, #  local_start 1987-12-31 23:00:00 (Thu)
  DateTime::TimeZone::INFINITY, #    local_end
  25200,
  0,
  'WIB',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_PONTIANAK

    $main::fatpacked{"DateTime/TimeZone/Asia/Pyongyang.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_PYONGYANG';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/asia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Pyongyang;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Pyongyang::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60186901020, #      utc_end 1908-03-31 15:37:00 (Tue)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60186931200, #    local_end 1908-04-01 00:00:00 (Wed)
  30180,
  0,
  'LMT',
      ],
      [
  60186901020, #    utc_start 1908-03-31 15:37:00 (Tue)
  60305268600, #      utc_end 1911-12-31 15:30:00 (Sun)
  60186931620, #  local_start 1908-04-01 00:07:00 (Wed)
  60305299200, #    local_end 1912-01-01 00:00:00 (Mon)
  30600,
  0,
  'KST',
      ],
      [
  60305268600, #    utc_start 1911-12-31 15:30:00 (Sun)
  61367036400, #      utc_end 1945-08-23 15:00:00 (Thu)
  60305301000, #  local_start 1912-01-01 00:30:00 (Mon)
  61367068800, #    local_end 1945-08-24 00:00:00 (Fri)
  32400,
  0,
  'JST',
      ],
      [
  61367036400, #    utc_start 1945-08-23 15:00:00 (Thu)
  63575247600, #      utc_end 2015-08-14 15:00:00 (Fri)
  61367068800, #  local_start 1945-08-24 00:00:00 (Fri)
  63575280000, #    local_end 2015-08-15 00:00:00 (Sat)
  32400,
  0,
  'KST',
      ],
      [
  63575247600, #    utc_start 2015-08-14 15:00:00 (Fri)
  63661129200, #      utc_end 2018-05-04 15:00:00 (Fri)
  63575278200, #  local_start 2015-08-14 23:30:00 (Fri)
  63661159800, #    local_end 2018-05-04 23:30:00 (Fri)
  30600,
  0,
  'KST',
      ],
      [
  63661129200, #    utc_start 2018-05-04 15:00:00 (Fri)
  DateTime::TimeZone::INFINITY, #      utc_end
  63661161600, #  local_start 2018-05-05 00:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #    local_end
  32400,
  0,
  'KST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_PYONGYANG

    $main::fatpacked{"DateTime/TimeZone/Asia/Qatar.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_QATAR';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/asia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Qatar;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Qatar::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60557747632, #      utc_end 1919-12-31 20:33:52 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60557760000, #    local_end 1920-01-01 00:00:00 (Thu)
  12368,
  0,
  'LMT',
      ],
      [
  60557747632, #    utc_start 1919-12-31 20:33:52 (Wed)
  62211873600, #      utc_end 1972-05-31 20:00:00 (Wed)
  60557762032, #  local_start 1920-01-01 00:33:52 (Thu)
  62211888000, #    local_end 1972-06-01 00:00:00 (Thu)
  14400,
  0,
  '+04',
      ],
      [
  62211873600, #    utc_start 1972-05-31 20:00:00 (Wed)
  DateTime::TimeZone::INFINITY, #      utc_end
  62211884400, #  local_start 1972-05-31 23:00:00 (Wed)
  DateTime::TimeZone::INFINITY, #    local_end
  10800,
  0,
  '+03',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_QATAR

    $main::fatpacked{"DateTime/TimeZone/Asia/Qostanay.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_QOSTANAY';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/asia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Qostanay;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Qostanay::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60694515932, #      utc_end 1924-05-01 19:45:32 (Thu)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60694531200, #    local_end 1924-05-02 00:00:00 (Fri)
  15268,
  0,
  'LMT',
      ],
      [
  60694515932, #    utc_start 1924-05-01 19:45:32 (Thu)
  60888139200, #      utc_end 1930-06-20 20:00:00 (Fri)
  60694530332, #  local_start 1924-05-01 23:45:32 (Thu)
  60888153600, #    local_end 1930-06-21 00:00:00 (Sat)
  14400,
  0,
  '+04',
      ],
      [
  60888139200, #    utc_start 1930-06-20 20:00:00 (Fri)
  62490596400, #      utc_end 1981-03-31 19:00:00 (Tue)
  60888157200, #  local_start 1930-06-21 01:00:00 (Sat)
  62490614400, #    local_end 1981-04-01 00:00:00 (Wed)
  18000,
  0,
  '+05',
      ],
      [
  62490596400, #    utc_start 1981-03-31 19:00:00 (Tue)
  62506404000, #      utc_end 1981-09-30 18:00:00 (Wed)
  62490618000, #  local_start 1981-04-01 01:00:00 (Wed)
  62506425600, #    local_end 1981-10-01 00:00:00 (Thu)
  21600,
  1,
  '+06',
      ],
      [
  62506404000, #    utc_start 1981-09-30 18:00:00 (Wed)
  62522128800, #      utc_end 1982-03-31 18:00:00 (Wed)
  62506425600, #  local_start 1981-10-01 00:00:00 (Thu)
  62522150400, #    local_end 1982-04-01 00:00:00 (Thu)
  21600,
  0,
  '+06',
      ],
      [
  62522128800, #    utc_start 1982-03-31 18:00:00 (Wed)
  62537940000, #      utc_end 1982-09-30 18:00:00 (Thu)
  62522150400, #  local_start 1982-04-01 00:00:00 (Thu)
  62537961600, #    local_end 1982-10-01 00:00:00 (Fri)
  21600,
  1,
  '+06',
      ],
      [
  62537940000, #    utc_start 1982-09-30 18:00:00 (Thu)
  62553668400, #      utc_end 1983-03-31 19:00:00 (Thu)
  62537958000, #  local_start 1982-09-30 23:00:00 (Thu)
  62553686400, #    local_end 1983-04-01 00:00:00 (Fri)
  18000,
  0,
  '+05',
      ],
      [
  62553668400, #    utc_start 1983-03-31 19:00:00 (Thu)
  62569476000, #      utc_end 1983-09-30 18:00:00 (Fri)
  62553690000, #  local_start 1983-04-01 01:00:00 (Fri)
  62569497600, #    local_end 1983-10-01 00:00:00 (Sat)
  21600,
  1,
  '+06',
      ],
      [
  62569476000, #    utc_start 1983-09-30 18:00:00 (Fri)
  62585290800, #      utc_end 1984-03-31 19:00:00 (Sat)
  62569494000, #  local_start 1983-09-30 23:00:00 (Fri)
  62585308800, #    local_end 1984-04-01 00:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62585290800, #    utc_start 1984-03-31 19:00:00 (Sat)
  62601022800, #      utc_end 1984-09-29 21:00:00 (Sat)
  62585312400, #  local_start 1984-04-01 01:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62601022800, #    utc_start 1984-09-29 21:00:00 (Sat)
  62616747600, #      utc_end 1985-03-30 21:00:00 (Sat)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62616747600, #    utc_start 1985-03-30 21:00:00 (Sat)
  62632472400, #      utc_end 1985-09-28 21:00:00 (Sat)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62632472400, #    utc_start 1985-09-28 21:00:00 (Sat)
  62648197200, #      utc_end 1986-03-29 21:00:00 (Sat)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62648197200, #    utc_start 1986-03-29 21:00:00 (Sat)
  62663922000, #      utc_end 1986-09-27 21:00:00 (Sat)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62663922000, #    utc_start 1986-09-27 21:00:00 (Sat)
  62679646800, #      utc_end 1987-03-28 21:00:00 (Sat)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62679646800, #    utc_start 1987-03-28 21:00:00 (Sat)
  62695371600, #      utc_end 1987-09-26 21:00:00 (Sat)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62695371600, #    utc_start 1987-09-26 21:00:00 (Sat)
  62711096400, #      utc_end 1988-03-26 21:00:00 (Sat)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62711096400, #    utc_start 1988-03-26 21:00:00 (Sat)
  62726821200, #      utc_end 1988-09-24 21:00:00 (Sat)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62726821200, #    utc_start 1988-09-24 21:00:00 (Sat)
  62742546000, #      utc_end 1989-03-25 21:00:00 (Sat)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62742546000, #    utc_start 1989-03-25 21:00:00 (Sat)
  62758270800, #      utc_end 1989-09-23 21:00:00 (Sat)
  62742567600, #  local_start 1989-03-26 03:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62758270800, #    utc_start 1989-09-23 21:00:00 (Sat)
  62773995600, #      utc_end 1990-03-24 21:00:00 (Sat)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62773995600, #    utc_start 1990-03-24 21:00:00 (Sat)
  62790325200, #      utc_end 1990-09-29 21:00:00 (Sat)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62790325200, #    utc_start 1990-09-29 21:00:00 (Sat)
  62806050000, #      utc_end 1991-03-30 21:00:00 (Sat)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62806050000, #    utc_start 1991-03-30 21:00:00 (Sat)
  62821778400, #      utc_end 1991-09-28 22:00:00 (Sat)
  62806068000, #  local_start 1991-03-31 02:00:00 (Sun)
  62821796400, #    local_end 1991-09-29 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62821778400, #    utc_start 1991-09-28 22:00:00 (Sat)
  62831455200, #      utc_end 1992-01-18 22:00:00 (Sat)
  62821792800, #  local_start 1991-09-29 02:00:00 (Sun)
  62831469600, #    local_end 1992-01-19 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62831455200, #    utc_start 1992-01-18 22:00:00 (Sat)
  62837499600, #      utc_end 1992-03-28 21:00:00 (Sat)
  62831473200, #  local_start 1992-01-19 03:00:00 (Sun)
  62837517600, #    local_end 1992-03-29 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62837499600, #    utc_start 1992-03-28 21:00:00 (Sat)
  62853224400, #      utc_end 1992-09-26 21:00:00 (Sat)
  62837521200, #  local_start 1992-03-29 03:00:00 (Sun)
  62853246000, #    local_end 1992-09-27 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62853224400, #    utc_start 1992-09-26 21:00:00 (Sat)
  62868949200, #      utc_end 1993-03-27 21:00:00 (Sat)
  62853242400, #  local_start 1992-09-27 02:00:00 (Sun)
  62868967200, #    local_end 1993-03-28 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62868949200, #    utc_start 1993-03-27 21:00:00 (Sat)
  62884674000, #      utc_end 1993-09-25 21:00:00 (Sat)
  62868970800, #  local_start 1993-03-28 03:00:00 (Sun)
  62884695600, #    local_end 1993-09-26 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62884674000, #    utc_start 1993-09-25 21:00:00 (Sat)
  62900398800, #      utc_end 1994-03-26 21:00:00 (Sat)
  62884692000, #  local_start 1993-09-26 02:00:00 (Sun)
  62900416800, #    local_end 1994-03-27 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62900398800, #    utc_start 1994-03-26 21:00:00 (Sat)
  62916123600, #      utc_end 1994-09-24 21:00:00 (Sat)
  62900420400, #  local_start 1994-03-27 03:00:00 (Sun)
  62916145200, #    local_end 1994-09-25 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62916123600, #    utc_start 1994-09-24 21:00:00 (Sat)
  62931848400, #      utc_end 1995-03-25 21:00:00 (Sat)
  62916141600, #  local_start 1994-09-25 02:00:00 (Sun)
  62931866400, #    local_end 1995-03-26 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62931848400, #    utc_start 1995-03-25 21:00:00 (Sat)
  62947573200, #      utc_end 1995-09-23 21:00:00 (Sat)
  62931870000, #  local_start 1995-03-26 03:00:00 (Sun)
  62947594800, #    local_end 1995-09-24 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62947573200, #    utc_start 1995-09-23 21:00:00 (Sat)
  62963902800, #      utc_end 1996-03-30 21:00:00 (Sat)
  62947591200, #  local_start 1995-09-24 02:00:00 (Sun)
  62963920800, #    local_end 1996-03-31 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62963902800, #    utc_start 1996-03-30 21:00:00 (Sat)
  62982046800, #      utc_end 1996-10-26 21:00:00 (Sat)
  62963924400, #  local_start 1996-03-31 03:00:00 (Sun)
  62982068400, #    local_end 1996-10-27 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62982046800, #    utc_start 1996-10-26 21:00:00 (Sat)
  62995352400, #      utc_end 1997-03-29 21:00:00 (Sat)
  62982064800, #  local_start 1996-10-27 02:00:00 (Sun)
  62995370400, #    local_end 1997-03-30 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62995352400, #    utc_start 1997-03-29 21:00:00 (Sat)
  63013496400, #      utc_end 1997-10-25 21:00:00 (Sat)
  62995374000, #  local_start 1997-03-30 03:00:00 (Sun)
  63013518000, #    local_end 1997-10-26 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  63013496400, #    utc_start 1997-10-25 21:00:00 (Sat)
  63026802000, #      utc_end 1998-03-28 21:00:00 (Sat)
  63013514400, #  local_start 1997-10-26 02:00:00 (Sun)
  63026820000, #    local_end 1998-03-29 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  63026802000, #    utc_start 1998-03-28 21:00:00 (Sat)
  63044946000, #      utc_end 1998-10-24 21:00:00 (Sat)
  63026823600, #  local_start 1998-03-29 03:00:00 (Sun)
  63044967600, #    local_end 1998-10-25 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  63044946000, #    utc_start 1998-10-24 21:00:00 (Sat)
  63058251600, #      utc_end 1999-03-27 21:00:00 (Sat)
  63044964000, #  local_start 1998-10-25 02:00:00 (Sun)
  63058269600, #    local_end 1999-03-28 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  63058251600, #    utc_start 1999-03-27 21:00:00 (Sat)
  63077000400, #      utc_end 1999-10-30 21:00:00 (Sat)
  63058273200, #  local_start 1999-03-28 03:00:00 (Sun)
  63077022000, #    local_end 1999-10-31 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  63077000400, #    utc_start 1999-10-30 21:00:00 (Sat)
  63089701200, #      utc_end 2000-03-25 21:00:00 (Sat)
  63077018400, #  local_start 1999-10-31 02:00:00 (Sun)
  63089719200, #    local_end 2000-03-26 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  63089701200, #    utc_start 2000-03-25 21:00:00 (Sat)
  63108450000, #      utc_end 2000-10-28 21:00:00 (Sat)
  63089722800, #  local_start 2000-03-26 03:00:00 (Sun)
  63108471600, #    local_end 2000-10-29 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  63108450000, #    utc_start 2000-10-28 21:00:00 (Sat)
  63121150800, #      utc_end 2001-03-24 21:00:00 (Sat)
  63108468000, #  local_start 2000-10-29 02:00:00 (Sun)
  63121168800, #    local_end 2001-03-25 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  63121150800, #    utc_start 2001-03-24 21:00:00 (Sat)
  63139899600, #      utc_end 2001-10-27 21:00:00 (Sat)
  63121172400, #  local_start 2001-03-25 03:00:00 (Sun)
  63139921200, #    local_end 2001-10-28 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  63139899600, #    utc_start 2001-10-27 21:00:00 (Sat)
  63153205200, #      utc_end 2002-03-30 21:00:00 (Sat)
  63139917600, #  local_start 2001-10-28 02:00:00 (Sun)
  63153223200, #    local_end 2002-03-31 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  63153205200, #    utc_start 2002-03-30 21:00:00 (Sat)
  63171349200, #      utc_end 2002-10-26 21:00:00 (Sat)
  63153226800, #  local_start 2002-03-31 03:00:00 (Sun)
  63171370800, #    local_end 2002-10-27 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  63171349200, #    utc_start 2002-10-26 21:00:00 (Sat)
  63184654800, #      utc_end 2003-03-29 21:00:00 (Sat)
  63171367200, #  local_start 2002-10-27 02:00:00 (Sun)
  63184672800, #    local_end 2003-03-30 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  63184654800, #    utc_start 2003-03-29 21:00:00 (Sat)
  63202798800, #      utc_end 2003-10-25 21:00:00 (Sat)
  63184676400, #  local_start 2003-03-30 03:00:00 (Sun)
  63202820400, #    local_end 2003-10-26 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  63202798800, #    utc_start 2003-10-25 21:00:00 (Sat)
  63216104400, #      utc_end 2004-03-27 21:00:00 (Sat)
  63202816800, #  local_start 2003-10-26 02:00:00 (Sun)
  63216122400, #    local_end 2004-03-28 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  63216104400, #    utc_start 2004-03-27 21:00:00 (Sat)
  63234853200, #      utc_end 2004-10-30 21:00:00 (Sat)
  63216126000, #  local_start 2004-03-28 03:00:00 (Sun)
  63234874800, #    local_end 2004-10-31 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  63234853200, #    utc_start 2004-10-30 21:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  63234874800, #  local_start 2004-10-31 03:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  21600,
  0,
  '+06',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {24}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_QOSTANAY

    $main::fatpacked{"DateTime/TimeZone/Asia/Qyzylorda.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_QYZYLORDA';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/asia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Qyzylorda;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Qyzylorda::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60694515488, #      utc_end 1924-05-01 19:38:08 (Thu)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60694531200, #    local_end 1924-05-02 00:00:00 (Fri)
  15712,
  0,
  'LMT',
      ],
      [
  60694515488, #    utc_start 1924-05-01 19:38:08 (Thu)
  60888139200, #      utc_end 1930-06-20 20:00:00 (Fri)
  60694529888, #  local_start 1924-05-01 23:38:08 (Thu)
  60888153600, #    local_end 1930-06-21 00:00:00 (Sat)
  14400,
  0,
  '+04',
      ],
      [
  60888139200, #    utc_start 1930-06-20 20:00:00 (Fri)
  62490596400, #      utc_end 1981-03-31 19:00:00 (Tue)
  60888157200, #  local_start 1930-06-21 01:00:00 (Sat)
  62490614400, #    local_end 1981-04-01 00:00:00 (Wed)
  18000,
  0,
  '+05',
      ],
      [
  62490596400, #    utc_start 1981-03-31 19:00:00 (Tue)
  62506404000, #      utc_end 1981-09-30 18:00:00 (Wed)
  62490618000, #  local_start 1981-04-01 01:00:00 (Wed)
  62506425600, #    local_end 1981-10-01 00:00:00 (Thu)
  21600,
  1,
  '+06',
      ],
      [
  62506404000, #    utc_start 1981-09-30 18:00:00 (Wed)
  62522128800, #      utc_end 1982-03-31 18:00:00 (Wed)
  62506425600, #  local_start 1981-10-01 00:00:00 (Thu)
  62522150400, #    local_end 1982-04-01 00:00:00 (Thu)
  21600,
  0,
  '+06',
      ],
      [
  62522128800, #    utc_start 1982-03-31 18:00:00 (Wed)
  62537940000, #      utc_end 1982-09-30 18:00:00 (Thu)
  62522150400, #  local_start 1982-04-01 00:00:00 (Thu)
  62537961600, #    local_end 1982-10-01 00:00:00 (Fri)
  21600,
  1,
  '+06',
      ],
      [
  62537940000, #    utc_start 1982-09-30 18:00:00 (Thu)
  62553668400, #      utc_end 1983-03-31 19:00:00 (Thu)
  62537958000, #  local_start 1982-09-30 23:00:00 (Thu)
  62553686400, #    local_end 1983-04-01 00:00:00 (Fri)
  18000,
  0,
  '+05',
      ],
      [
  62553668400, #    utc_start 1983-03-31 19:00:00 (Thu)
  62569476000, #      utc_end 1983-09-30 18:00:00 (Fri)
  62553690000, #  local_start 1983-04-01 01:00:00 (Fri)
  62569497600, #    local_end 1983-10-01 00:00:00 (Sat)
  21600,
  1,
  '+06',
      ],
      [
  62569476000, #    utc_start 1983-09-30 18:00:00 (Fri)
  62585290800, #      utc_end 1984-03-31 19:00:00 (Sat)
  62569494000, #  local_start 1983-09-30 23:00:00 (Fri)
  62585308800, #    local_end 1984-04-01 00:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62585290800, #    utc_start 1984-03-31 19:00:00 (Sat)
  62601022800, #      utc_end 1984-09-29 21:00:00 (Sat)
  62585312400, #  local_start 1984-04-01 01:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62601022800, #    utc_start 1984-09-29 21:00:00 (Sat)
  62616747600, #      utc_end 1985-03-30 21:00:00 (Sat)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62616747600, #    utc_start 1985-03-30 21:00:00 (Sat)
  62632472400, #      utc_end 1985-09-28 21:00:00 (Sat)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62632472400, #    utc_start 1985-09-28 21:00:00 (Sat)
  62648197200, #      utc_end 1986-03-29 21:00:00 (Sat)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62648197200, #    utc_start 1986-03-29 21:00:00 (Sat)
  62663922000, #      utc_end 1986-09-27 21:00:00 (Sat)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62663922000, #    utc_start 1986-09-27 21:00:00 (Sat)
  62679646800, #      utc_end 1987-03-28 21:00:00 (Sat)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62679646800, #    utc_start 1987-03-28 21:00:00 (Sat)
  62695371600, #      utc_end 1987-09-26 21:00:00 (Sat)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62695371600, #    utc_start 1987-09-26 21:00:00 (Sat)
  62711096400, #      utc_end 1988-03-26 21:00:00 (Sat)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62711096400, #    utc_start 1988-03-26 21:00:00 (Sat)
  62726821200, #      utc_end 1988-09-24 21:00:00 (Sat)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62726821200, #    utc_start 1988-09-24 21:00:00 (Sat)
  62742546000, #      utc_end 1989-03-25 21:00:00 (Sat)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62742546000, #    utc_start 1989-03-25 21:00:00 (Sat)
  62758270800, #      utc_end 1989-09-23 21:00:00 (Sat)
  62742567600, #  local_start 1989-03-26 03:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62758270800, #    utc_start 1989-09-23 21:00:00 (Sat)
  62773995600, #      utc_end 1990-03-24 21:00:00 (Sat)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62773995600, #    utc_start 1990-03-24 21:00:00 (Sat)
  62790325200, #      utc_end 1990-09-29 21:00:00 (Sat)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62790325200, #    utc_start 1990-09-29 21:00:00 (Sat)
  62806050000, #      utc_end 1991-03-30 21:00:00 (Sat)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62806050000, #    utc_start 1991-03-30 21:00:00 (Sat)
  62821778400, #      utc_end 1991-09-28 22:00:00 (Sat)
  62806068000, #  local_start 1991-03-31 02:00:00 (Sun)
  62821796400, #    local_end 1991-09-29 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62821778400, #    utc_start 1991-09-28 22:00:00 (Sat)
  62831451600, #      utc_end 1992-01-18 21:00:00 (Sat)
  62821796400, #  local_start 1991-09-29 03:00:00 (Sun)
  62831469600, #    local_end 1992-01-19 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62831451600, #    utc_start 1992-01-18 21:00:00 (Sat)
  62837496000, #      utc_end 1992-03-28 20:00:00 (Sat)
  62831473200, #  local_start 1992-01-19 03:00:00 (Sun)
  62837517600, #    local_end 1992-03-29 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  62837496000, #    utc_start 1992-03-28 20:00:00 (Sat)
  62853224400, #      utc_end 1992-09-26 21:00:00 (Sat)
  62837517600, #  local_start 1992-03-29 02:00:00 (Sun)
  62853246000, #    local_end 1992-09-27 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62853224400, #    utc_start 1992-09-26 21:00:00 (Sat)
  62868949200, #      utc_end 1993-03-27 21:00:00 (Sat)
  62853242400, #  local_start 1992-09-27 02:00:00 (Sun)
  62868967200, #    local_end 1993-03-28 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62868949200, #    utc_start 1993-03-27 21:00:00 (Sat)
  62884674000, #      utc_end 1993-09-25 21:00:00 (Sat)
  62868970800, #  local_start 1993-03-28 03:00:00 (Sun)
  62884695600, #    local_end 1993-09-26 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62884674000, #    utc_start 1993-09-25 21:00:00 (Sat)
  62900398800, #      utc_end 1994-03-26 21:00:00 (Sat)
  62884692000, #  local_start 1993-09-26 02:00:00 (Sun)
  62900416800, #    local_end 1994-03-27 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62900398800, #    utc_start 1994-03-26 21:00:00 (Sat)
  62916123600, #      utc_end 1994-09-24 21:00:00 (Sat)
  62900420400, #  local_start 1994-03-27 03:00:00 (Sun)
  62916145200, #    local_end 1994-09-25 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62916123600, #    utc_start 1994-09-24 21:00:00 (Sat)
  62931848400, #      utc_end 1995-03-25 21:00:00 (Sat)
  62916141600, #  local_start 1994-09-25 02:00:00 (Sun)
  62931866400, #    local_end 1995-03-26 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62931848400, #    utc_start 1995-03-25 21:00:00 (Sat)
  62947573200, #      utc_end 1995-09-23 21:00:00 (Sat)
  62931870000, #  local_start 1995-03-26 03:00:00 (Sun)
  62947594800, #    local_end 1995-09-24 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62947573200, #    utc_start 1995-09-23 21:00:00 (Sat)
  62963902800, #      utc_end 1996-03-30 21:00:00 (Sat)
  62947591200, #  local_start 1995-09-24 02:00:00 (Sun)
  62963920800, #    local_end 1996-03-31 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62963902800, #    utc_start 1996-03-30 21:00:00 (Sat)
  62982046800, #      utc_end 1996-10-26 21:00:00 (Sat)
  62963924400, #  local_start 1996-03-31 03:00:00 (Sun)
  62982068400, #    local_end 1996-10-27 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62982046800, #    utc_start 1996-10-26 21:00:00 (Sat)
  62995352400, #      utc_end 1997-03-29 21:00:00 (Sat)
  62982064800, #  local_start 1996-10-27 02:00:00 (Sun)
  62995370400, #    local_end 1997-03-30 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62995352400, #    utc_start 1997-03-29 21:00:00 (Sat)
  63013496400, #      utc_end 1997-10-25 21:00:00 (Sat)
  62995374000, #  local_start 1997-03-30 03:00:00 (Sun)
  63013518000, #    local_end 1997-10-26 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  63013496400, #    utc_start 1997-10-25 21:00:00 (Sat)
  63026802000, #      utc_end 1998-03-28 21:00:00 (Sat)
  63013514400, #  local_start 1997-10-26 02:00:00 (Sun)
  63026820000, #    local_end 1998-03-29 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  63026802000, #    utc_start 1998-03-28 21:00:00 (Sat)
  63044946000, #      utc_end 1998-10-24 21:00:00 (Sat)
  63026823600, #  local_start 1998-03-29 03:00:00 (Sun)
  63044967600, #    local_end 1998-10-25 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  63044946000, #    utc_start 1998-10-24 21:00:00 (Sat)
  63058251600, #      utc_end 1999-03-27 21:00:00 (Sat)
  63044964000, #  local_start 1998-10-25 02:00:00 (Sun)
  63058269600, #    local_end 1999-03-28 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  63058251600, #    utc_start 1999-03-27 21:00:00 (Sat)
  63077000400, #      utc_end 1999-10-30 21:00:00 (Sat)
  63058273200, #  local_start 1999-03-28 03:00:00 (Sun)
  63077022000, #    local_end 1999-10-31 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  63077000400, #    utc_start 1999-10-30 21:00:00 (Sat)
  63089701200, #      utc_end 2000-03-25 21:00:00 (Sat)
  63077018400, #  local_start 1999-10-31 02:00:00 (Sun)
  63089719200, #    local_end 2000-03-26 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  63089701200, #    utc_start 2000-03-25 21:00:00 (Sat)
  63108450000, #      utc_end 2000-10-28 21:00:00 (Sat)
  63089722800, #  local_start 2000-03-26 03:00:00 (Sun)
  63108471600, #    local_end 2000-10-29 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  63108450000, #    utc_start 2000-10-28 21:00:00 (Sat)
  63121150800, #      utc_end 2001-03-24 21:00:00 (Sat)
  63108468000, #  local_start 2000-10-29 02:00:00 (Sun)
  63121168800, #    local_end 2001-03-25 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  63121150800, #    utc_start 2001-03-24 21:00:00 (Sat)
  63139899600, #      utc_end 2001-10-27 21:00:00 (Sat)
  63121172400, #  local_start 2001-03-25 03:00:00 (Sun)
  63139921200, #    local_end 2001-10-28 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  63139899600, #    utc_start 2001-10-27 21:00:00 (Sat)
  63153205200, #      utc_end 2002-03-30 21:00:00 (Sat)
  63139917600, #  local_start 2001-10-28 02:00:00 (Sun)
  63153223200, #    local_end 2002-03-31 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  63153205200, #    utc_start 2002-03-30 21:00:00 (Sat)
  63171349200, #      utc_end 2002-10-26 21:00:00 (Sat)
  63153226800, #  local_start 2002-03-31 03:00:00 (Sun)
  63171370800, #    local_end 2002-10-27 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  63171349200, #    utc_start 2002-10-26 21:00:00 (Sat)
  63184654800, #      utc_end 2003-03-29 21:00:00 (Sat)
  63171367200, #  local_start 2002-10-27 02:00:00 (Sun)
  63184672800, #    local_end 2003-03-30 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  63184654800, #    utc_start 2003-03-29 21:00:00 (Sat)
  63202798800, #      utc_end 2003-10-25 21:00:00 (Sat)
  63184676400, #  local_start 2003-03-30 03:00:00 (Sun)
  63202820400, #    local_end 2003-10-26 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  63202798800, #    utc_start 2003-10-25 21:00:00 (Sat)
  63216104400, #      utc_end 2004-03-27 21:00:00 (Sat)
  63202816800, #  local_start 2003-10-26 02:00:00 (Sun)
  63216122400, #    local_end 2004-03-28 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  63216104400, #    utc_start 2004-03-27 21:00:00 (Sat)
  63234853200, #      utc_end 2004-10-30 21:00:00 (Sat)
  63216126000, #  local_start 2004-03-28 03:00:00 (Sun)
  63234874800, #    local_end 2004-10-31 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  63234853200, #    utc_start 2004-10-30 21:00:00 (Sat)
  63681012000, #      utc_end 2018-12-20 18:00:00 (Thu)
  63234874800, #  local_start 2004-10-31 03:00:00 (Sun)
  63681033600, #    local_end 2018-12-21 00:00:00 (Fri)
  21600,
  0,
  '+06',
      ],
      [
  63681012000, #    utc_start 2018-12-20 18:00:00 (Thu)
  DateTime::TimeZone::INFINITY, #      utc_end
  63681030000, #  local_start 2018-12-20 23:00:00 (Thu)
  DateTime::TimeZone::INFINITY, #    local_end
  18000,
  0,
  '+05',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {24}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_QYZYLORDA

    $main::fatpacked{"DateTime/TimeZone/Asia/Riyadh.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_RIYADH';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/asia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Riyadh;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Riyadh::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  61416046388, #      utc_end 1947-03-13 20:53:08 (Thu)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  61416057600, #    local_end 1947-03-14 00:00:00 (Fri)
  11212,
  0,
  'LMT',
      ],
      [
  61416046388, #    utc_start 1947-03-13 20:53:08 (Thu)
  DateTime::TimeZone::INFINITY, #      utc_end
  61416057188, #  local_start 1947-03-13 23:53:08 (Thu)
  DateTime::TimeZone::INFINITY, #    local_end
  10800,
  0,
  '+03',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_RIYADH

    $main::fatpacked{"DateTime/TimeZone/Asia/Sakhalin.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_SAKHALIN';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Sakhalin;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Sakhalin::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60104644152, #      utc_end 1905-08-22 14:29:12 (Tue)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60104678400, #    local_end 1905-08-23 00:00:00 (Wed)
  34248,
  0,
  'LMT',
      ],
      [
  60104644152, #    utc_start 1905-08-22 14:29:12 (Tue)
  61367122800, #      utc_end 1945-08-24 15:00:00 (Fri)
  60104676552, #  local_start 1905-08-22 23:29:12 (Tue)
  61367155200, #    local_end 1945-08-25 00:00:00 (Sat)
  32400,
  0,
  '+09',
      ],
      [
  61367122800, #    utc_start 1945-08-24 15:00:00 (Fri)
  62490574800, #      utc_end 1981-03-31 13:00:00 (Tue)
  61367162400, #  local_start 1945-08-25 02:00:00 (Sat)
  62490614400, #    local_end 1981-04-01 00:00:00 (Wed)
  39600,
  0,
  '+11',
      ],
      [
  62490574800, #    utc_start 1981-03-31 13:00:00 (Tue)
  62506382400, #      utc_end 1981-09-30 12:00:00 (Wed)
  62490618000, #  local_start 1981-04-01 01:00:00 (Wed)
  62506425600, #    local_end 1981-10-01 00:00:00 (Thu)
  43200,
  1,
  '+12',
      ],
      [
  62506382400, #    utc_start 1981-09-30 12:00:00 (Wed)
  62522110800, #      utc_end 1982-03-31 13:00:00 (Wed)
  62506422000, #  local_start 1981-09-30 23:00:00 (Wed)
  62522150400, #    local_end 1982-04-01 00:00:00 (Thu)
  39600,
  0,
  '+11',
      ],
      [
  62522110800, #    utc_start 1982-03-31 13:00:00 (Wed)
  62537918400, #      utc_end 1982-09-30 12:00:00 (Thu)
  62522154000, #  local_start 1982-04-01 01:00:00 (Thu)
  62537961600, #    local_end 1982-10-01 00:00:00 (Fri)
  43200,
  1,
  '+12',
      ],
      [
  62537918400, #    utc_start 1982-09-30 12:00:00 (Thu)
  62553646800, #      utc_end 1983-03-31 13:00:00 (Thu)
  62537958000, #  local_start 1982-09-30 23:00:00 (Thu)
  62553686400, #    local_end 1983-04-01 00:00:00 (Fri)
  39600,
  0,
  '+11',
      ],
      [
  62553646800, #    utc_start 1983-03-31 13:00:00 (Thu)
  62569454400, #      utc_end 1983-09-30 12:00:00 (Fri)
  62553690000, #  local_start 1983-04-01 01:00:00 (Fri)
  62569497600, #    local_end 1983-10-01 00:00:00 (Sat)
  43200,
  1,
  '+12',
      ],
      [
  62569454400, #    utc_start 1983-09-30 12:00:00 (Fri)
  62585269200, #      utc_end 1984-03-31 13:00:00 (Sat)
  62569494000, #  local_start 1983-09-30 23:00:00 (Fri)
  62585308800, #    local_end 1984-04-01 00:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62585269200, #    utc_start 1984-03-31 13:00:00 (Sat)
  62601001200, #      utc_end 1984-09-29 15:00:00 (Sat)
  62585312400, #  local_start 1984-04-01 01:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  62601001200, #    utc_start 1984-09-29 15:00:00 (Sat)
  62616726000, #      utc_end 1985-03-30 15:00:00 (Sat)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62616726000, #    utc_start 1985-03-30 15:00:00 (Sat)
  62632450800, #      utc_end 1985-09-28 15:00:00 (Sat)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  62632450800, #    utc_start 1985-09-28 15:00:00 (Sat)
  62648175600, #      utc_end 1986-03-29 15:00:00 (Sat)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62648175600, #    utc_start 1986-03-29 15:00:00 (Sat)
  62663900400, #      utc_end 1986-09-27 15:00:00 (Sat)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  62663900400, #    utc_start 1986-09-27 15:00:00 (Sat)
  62679625200, #      utc_end 1987-03-28 15:00:00 (Sat)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62679625200, #    utc_start 1987-03-28 15:00:00 (Sat)
  62695350000, #      utc_end 1987-09-26 15:00:00 (Sat)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  62695350000, #    utc_start 1987-09-26 15:00:00 (Sat)
  62711074800, #      utc_end 1988-03-26 15:00:00 (Sat)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62711074800, #    utc_start 1988-03-26 15:00:00 (Sat)
  62726799600, #      utc_end 1988-09-24 15:00:00 (Sat)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  62726799600, #    utc_start 1988-09-24 15:00:00 (Sat)
  62742524400, #      utc_end 1989-03-25 15:00:00 (Sat)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62742524400, #    utc_start 1989-03-25 15:00:00 (Sat)
  62758249200, #      utc_end 1989-09-23 15:00:00 (Sat)
  62742567600, #  local_start 1989-03-26 03:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  62758249200, #    utc_start 1989-09-23 15:00:00 (Sat)
  62773974000, #      utc_end 1990-03-24 15:00:00 (Sat)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62773974000, #    utc_start 1990-03-24 15:00:00 (Sat)
  62790303600, #      utc_end 1990-09-29 15:00:00 (Sat)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  62790303600, #    utc_start 1990-09-29 15:00:00 (Sat)
  62806028400, #      utc_end 1991-03-30 15:00:00 (Sat)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62806028400, #    utc_start 1991-03-30 15:00:00 (Sat)
  62821756800, #      utc_end 1991-09-28 16:00:00 (Sat)
  62806068000, #  local_start 1991-03-31 02:00:00 (Sun)
  62821796400, #    local_end 1991-09-29 03:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  62821756800, #    utc_start 1991-09-28 16:00:00 (Sat)
  62831433600, #      utc_end 1992-01-18 16:00:00 (Sat)
  62821792800, #  local_start 1991-09-29 02:00:00 (Sun)
  62831469600, #    local_end 1992-01-19 02:00:00 (Sun)
  36000,
  0,
  '+10',
      ],
      [
  62831433600, #    utc_start 1992-01-18 16:00:00 (Sat)
  62837478000, #      utc_end 1992-03-28 15:00:00 (Sat)
  62831473200, #  local_start 1992-01-19 03:00:00 (Sun)
  62837517600, #    local_end 1992-03-29 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62837478000, #    utc_start 1992-03-28 15:00:00 (Sat)
  62853202800, #      utc_end 1992-09-26 15:00:00 (Sat)
  62837521200, #  local_start 1992-03-29 03:00:00 (Sun)
  62853246000, #    local_end 1992-09-27 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  62853202800, #    utc_start 1992-09-26 15:00:00 (Sat)
  62868927600, #      utc_end 1993-03-27 15:00:00 (Sat)
  62853242400, #  local_start 1992-09-27 02:00:00 (Sun)
  62868967200, #    local_end 1993-03-28 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62868927600, #    utc_start 1993-03-27 15:00:00 (Sat)
  62884652400, #      utc_end 1993-09-25 15:00:00 (Sat)
  62868970800, #  local_start 1993-03-28 03:00:00 (Sun)
  62884695600, #    local_end 1993-09-26 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  62884652400, #    utc_start 1993-09-25 15:00:00 (Sat)
  62900377200, #      utc_end 1994-03-26 15:00:00 (Sat)
  62884692000, #  local_start 1993-09-26 02:00:00 (Sun)
  62900416800, #    local_end 1994-03-27 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62900377200, #    utc_start 1994-03-26 15:00:00 (Sat)
  62916102000, #      utc_end 1994-09-24 15:00:00 (Sat)
  62900420400, #  local_start 1994-03-27 03:00:00 (Sun)
  62916145200, #    local_end 1994-09-25 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  62916102000, #    utc_start 1994-09-24 15:00:00 (Sat)
  62931826800, #      utc_end 1995-03-25 15:00:00 (Sat)
  62916141600, #  local_start 1994-09-25 02:00:00 (Sun)
  62931866400, #    local_end 1995-03-26 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62931826800, #    utc_start 1995-03-25 15:00:00 (Sat)
  62947551600, #      utc_end 1995-09-23 15:00:00 (Sat)
  62931870000, #  local_start 1995-03-26 03:00:00 (Sun)
  62947594800, #    local_end 1995-09-24 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  62947551600, #    utc_start 1995-09-23 15:00:00 (Sat)
  62963881200, #      utc_end 1996-03-30 15:00:00 (Sat)
  62947591200, #  local_start 1995-09-24 02:00:00 (Sun)
  62963920800, #    local_end 1996-03-31 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62963881200, #    utc_start 1996-03-30 15:00:00 (Sat)
  62982025200, #      utc_end 1996-10-26 15:00:00 (Sat)
  62963924400, #  local_start 1996-03-31 03:00:00 (Sun)
  62982068400, #    local_end 1996-10-27 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  62982025200, #    utc_start 1996-10-26 15:00:00 (Sat)
  62995330800, #      utc_end 1997-03-29 15:00:00 (Sat)
  62982064800, #  local_start 1996-10-27 02:00:00 (Sun)
  62995370400, #    local_end 1997-03-30 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62995330800, #    utc_start 1997-03-29 15:00:00 (Sat)
  63013478400, #      utc_end 1997-10-25 16:00:00 (Sat)
  62995370400, #  local_start 1997-03-30 02:00:00 (Sun)
  63013518000, #    local_end 1997-10-26 03:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  63013478400, #    utc_start 1997-10-25 16:00:00 (Sat)
  63026784000, #      utc_end 1998-03-28 16:00:00 (Sat)
  63013514400, #  local_start 1997-10-26 02:00:00 (Sun)
  63026820000, #    local_end 1998-03-29 02:00:00 (Sun)
  36000,
  0,
  '+10',
      ],
      [
  63026784000, #    utc_start 1998-03-28 16:00:00 (Sat)
  63044928000, #      utc_end 1998-10-24 16:00:00 (Sat)
  63026823600, #  local_start 1998-03-29 03:00:00 (Sun)
  63044967600, #    local_end 1998-10-25 03:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  63044928000, #    utc_start 1998-10-24 16:00:00 (Sat)
  63058233600, #      utc_end 1999-03-27 16:00:00 (Sat)
  63044964000, #  local_start 1998-10-25 02:00:00 (Sun)
  63058269600, #    local_end 1999-03-28 02:00:00 (Sun)
  36000,
  0,
  '+10',
      ],
      [
  63058233600, #    utc_start 1999-03-27 16:00:00 (Sat)
  63076982400, #      utc_end 1999-10-30 16:00:00 (Sat)
  63058273200, #  local_start 1999-03-28 03:00:00 (Sun)
  63077022000, #    local_end 1999-10-31 03:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  63076982400, #    utc_start 1999-10-30 16:00:00 (Sat)
  63089683200, #      utc_end 2000-03-25 16:00:00 (Sat)
  63077018400, #  local_start 1999-10-31 02:00:00 (Sun)
  63089719200, #    local_end 2000-03-26 02:00:00 (Sun)
  36000,
  0,
  '+10',
      ],
      [
  63089683200, #    utc_start 2000-03-25 16:00:00 (Sat)
  63108432000, #      utc_end 2000-10-28 16:00:00 (Sat)
  63089722800, #  local_start 2000-03-26 03:00:00 (Sun)
  63108471600, #    local_end 2000-10-29 03:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  63108432000, #    utc_start 2000-10-28 16:00:00 (Sat)
  63121132800, #      utc_end 2001-03-24 16:00:00 (Sat)
  63108468000, #  local_start 2000-10-29 02:00:00 (Sun)
  63121168800, #    local_end 2001-03-25 02:00:00 (Sun)
  36000,
  0,
  '+10',
      ],
      [
  63121132800, #    utc_start 2001-03-24 16:00:00 (Sat)
  63139881600, #      utc_end 2001-10-27 16:00:00 (Sat)
  63121172400, #  local_start 2001-03-25 03:00:00 (Sun)
  63139921200, #    local_end 2001-10-28 03:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  63139881600, #    utc_start 2001-10-27 16:00:00 (Sat)
  63153187200, #      utc_end 2002-03-30 16:00:00 (Sat)
  63139917600, #  local_start 2001-10-28 02:00:00 (Sun)
  63153223200, #    local_end 2002-03-31 02:00:00 (Sun)
  36000,
  0,
  '+10',
      ],
      [
  63153187200, #    utc_start 2002-03-30 16:00:00 (Sat)
  63171331200, #      utc_end 2002-10-26 16:00:00 (Sat)
  63153226800, #  local_start 2002-03-31 03:00:00 (Sun)
  63171370800, #    local_end 2002-10-27 03:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  63171331200, #    utc_start 2002-10-26 16:00:00 (Sat)
  63184636800, #      utc_end 2003-03-29 16:00:00 (Sat)
  63171367200, #  local_start 2002-10-27 02:00:00 (Sun)
  63184672800, #    local_end 2003-03-30 02:00:00 (Sun)
  36000,
  0,
  '+10',
      ],
      [
  63184636800, #    utc_start 2003-03-29 16:00:00 (Sat)
  63202780800, #      utc_end 2003-10-25 16:00:00 (Sat)
  63184676400, #  local_start 2003-03-30 03:00:00 (Sun)
  63202820400, #    local_end 2003-10-26 03:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  63202780800, #    utc_start 2003-10-25 16:00:00 (Sat)
  63216086400, #      utc_end 2004-03-27 16:00:00 (Sat)
  63202816800, #  local_start 2003-10-26 02:00:00 (Sun)
  63216122400, #    local_end 2004-03-28 02:00:00 (Sun)
  36000,
  0,
  '+10',
      ],
      [
  63216086400, #    utc_start 2004-03-27 16:00:00 (Sat)
  63234835200, #      utc_end 2004-10-30 16:00:00 (Sat)
  63216126000, #  local_start 2004-03-28 03:00:00 (Sun)
  63234874800, #    local_end 2004-10-31 03:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  63234835200, #    utc_start 2004-10-30 16:00:00 (Sat)
  63247536000, #      utc_end 2005-03-26 16:00:00 (Sat)
  63234871200, #  local_start 2004-10-31 02:00:00 (Sun)
  63247572000, #    local_end 2005-03-27 02:00:00 (Sun)
  36000,
  0,
  '+10',
      ],
      [
  63247536000, #    utc_start 2005-03-26 16:00:00 (Sat)
  63266284800, #      utc_end 2005-10-29 16:00:00 (Sat)
  63247575600, #  local_start 2005-03-27 03:00:00 (Sun)
  63266324400, #    local_end 2005-10-30 03:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  63266284800, #    utc_start 2005-10-29 16:00:00 (Sat)
  63278985600, #      utc_end 2006-03-25 16:00:00 (Sat)
  63266320800, #  local_start 2005-10-30 02:00:00 (Sun)
  63279021600, #    local_end 2006-03-26 02:00:00 (Sun)
  36000,
  0,
  '+10',
      ],
      [
  63278985600, #    utc_start 2006-03-25 16:00:00 (Sat)
  63297734400, #      utc_end 2006-10-28 16:00:00 (Sat)
  63279025200, #  local_start 2006-03-26 03:00:00 (Sun)
  63297774000, #    local_end 2006-10-29 03:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  63297734400, #    utc_start 2006-10-28 16:00:00 (Sat)
  63310435200, #      utc_end 2007-03-24 16:00:00 (Sat)
  63297770400, #  local_start 2006-10-29 02:00:00 (Sun)
  63310471200, #    local_end 2007-03-25 02:00:00 (Sun)
  36000,
  0,
  '+10',
      ],
      [
  63310435200, #    utc_start 2007-03-24 16:00:00 (Sat)
  63329184000, #      utc_end 2007-10-27 16:00:00 (Sat)
  63310474800, #  local_start 2007-03-25 03:00:00 (Sun)
  63329223600, #    local_end 2007-10-28 03:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  63329184000, #    utc_start 2007-10-27 16:00:00 (Sat)
  63342489600, #      utc_end 2008-03-29 16:00:00 (Sat)
  63329220000, #  local_start 2007-10-28 02:00:00 (Sun)
  63342525600, #    local_end 2008-03-30 02:00:00 (Sun)
  36000,
  0,
  '+10',
      ],
      [
  63342489600, #    utc_start 2008-03-29 16:00:00 (Sat)
  63360633600, #      utc_end 2008-10-25 16:00:00 (Sat)
  63342529200, #  local_start 2008-03-30 03:00:00 (Sun)
  63360673200, #    local_end 2008-10-26 03:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  63360633600, #    utc_start 2008-10-25 16:00:00 (Sat)
  63373939200, #      utc_end 2009-03-28 16:00:00 (Sat)
  63360669600, #  local_start 2008-10-26 02:00:00 (Sun)
  63373975200, #    local_end 2009-03-29 02:00:00 (Sun)
  36000,
  0,
  '+10',
      ],
      [
  63373939200, #    utc_start 2009-03-28 16:00:00 (Sat)
  63392083200, #      utc_end 2009-10-24 16:00:00 (Sat)
  63373978800, #  local_start 2009-03-29 03:00:00 (Sun)
  63392122800, #    local_end 2009-10-25 03:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  63392083200, #    utc_start 2009-10-24 16:00:00 (Sat)
  63405388800, #      utc_end 2010-03-27 16:00:00 (Sat)
  63392119200, #  local_start 2009-10-25 02:00:00 (Sun)
  63405424800, #    local_end 2010-03-28 02:00:00 (Sun)
  36000,
  0,
  '+10',
      ],
      [
  63405388800, #    utc_start 2010-03-27 16:00:00 (Sat)
  63424137600, #      utc_end 2010-10-30 16:00:00 (Sat)
  63405428400, #  local_start 2010-03-28 03:00:00 (Sun)
  63424177200, #    local_end 2010-10-31 03:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  63424137600, #    utc_start 2010-10-30 16:00:00 (Sat)
  63436838400, #      utc_end 2011-03-26 16:00:00 (Sat)
  63424173600, #  local_start 2010-10-31 02:00:00 (Sun)
  63436874400, #    local_end 2011-03-27 02:00:00 (Sun)
  36000,
  0,
  '+10',
      ],
      [
  63436838400, #    utc_start 2011-03-26 16:00:00 (Sat)
  63549932400, #      utc_end 2014-10-25 15:00:00 (Sat)
  63436878000, #  local_start 2011-03-27 03:00:00 (Sun)
  63549972000, #    local_end 2014-10-26 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  63549932400, #    utc_start 2014-10-25 15:00:00 (Sat)
  63594691200, #      utc_end 2016-03-26 16:00:00 (Sat)
  63549968400, #  local_start 2014-10-26 01:00:00 (Sun)
  63594727200, #    local_end 2016-03-27 02:00:00 (Sun)
  36000,
  0,
  '+10',
      ],
      [
  63594691200, #    utc_start 2016-03-26 16:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  63594730800, #  local_start 2016-03-27 03:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  39600,
  0,
  '+11',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {30}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_SAKHALIN

    $main::fatpacked{"DateTime/TimeZone/Asia/Samarkand.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_SAMARKAND';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/asia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Samarkand;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Samarkand::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60694515127, #      utc_end 1924-05-01 19:32:07 (Thu)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60694531200, #    local_end 1924-05-02 00:00:00 (Fri)
  16073,
  0,
  'LMT',
      ],
      [
  60694515127, #    utc_start 1924-05-01 19:32:07 (Thu)
  60888139200, #      utc_end 1930-06-20 20:00:00 (Fri)
  60694529527, #  local_start 1924-05-01 23:32:07 (Thu)
  60888153600, #    local_end 1930-06-21 00:00:00 (Sat)
  14400,
  0,
  '+04',
      ],
      [
  60888139200, #    utc_start 1930-06-20 20:00:00 (Fri)
  62490596400, #      utc_end 1981-03-31 19:00:00 (Tue)
  60888157200, #  local_start 1930-06-21 01:00:00 (Sat)
  62490614400, #    local_end 1981-04-01 00:00:00 (Wed)
  18000,
  0,
  '+05',
      ],
      [
  62490596400, #    utc_start 1981-03-31 19:00:00 (Tue)
  62506404000, #      utc_end 1981-09-30 18:00:00 (Wed)
  62490618000, #  local_start 1981-04-01 01:00:00 (Wed)
  62506425600, #    local_end 1981-10-01 00:00:00 (Thu)
  21600,
  1,
  '+06',
      ],
      [
  62506404000, #    utc_start 1981-09-30 18:00:00 (Wed)
  62522128800, #      utc_end 1982-03-31 18:00:00 (Wed)
  62506425600, #  local_start 1981-10-01 00:00:00 (Thu)
  62522150400, #    local_end 1982-04-01 00:00:00 (Thu)
  21600,
  0,
  '+06',
      ],
      [
  62522128800, #    utc_start 1982-03-31 18:00:00 (Wed)
  62537940000, #      utc_end 1982-09-30 18:00:00 (Thu)
  62522150400, #  local_start 1982-04-01 00:00:00 (Thu)
  62537961600, #    local_end 1982-10-01 00:00:00 (Fri)
  21600,
  1,
  '+06',
      ],
      [
  62537940000, #    utc_start 1982-09-30 18:00:00 (Thu)
  62553668400, #      utc_end 1983-03-31 19:00:00 (Thu)
  62537958000, #  local_start 1982-09-30 23:00:00 (Thu)
  62553686400, #    local_end 1983-04-01 00:00:00 (Fri)
  18000,
  0,
  '+05',
      ],
      [
  62553668400, #    utc_start 1983-03-31 19:00:00 (Thu)
  62569476000, #      utc_end 1983-09-30 18:00:00 (Fri)
  62553690000, #  local_start 1983-04-01 01:00:00 (Fri)
  62569497600, #    local_end 1983-10-01 00:00:00 (Sat)
  21600,
  1,
  '+06',
      ],
      [
  62569476000, #    utc_start 1983-09-30 18:00:00 (Fri)
  62585290800, #      utc_end 1984-03-31 19:00:00 (Sat)
  62569494000, #  local_start 1983-09-30 23:00:00 (Fri)
  62585308800, #    local_end 1984-04-01 00:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62585290800, #    utc_start 1984-03-31 19:00:00 (Sat)
  62601022800, #      utc_end 1984-09-29 21:00:00 (Sat)
  62585312400, #  local_start 1984-04-01 01:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62601022800, #    utc_start 1984-09-29 21:00:00 (Sat)
  62616747600, #      utc_end 1985-03-30 21:00:00 (Sat)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62616747600, #    utc_start 1985-03-30 21:00:00 (Sat)
  62632472400, #      utc_end 1985-09-28 21:00:00 (Sat)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62632472400, #    utc_start 1985-09-28 21:00:00 (Sat)
  62648197200, #      utc_end 1986-03-29 21:00:00 (Sat)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62648197200, #    utc_start 1986-03-29 21:00:00 (Sat)
  62663922000, #      utc_end 1986-09-27 21:00:00 (Sat)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62663922000, #    utc_start 1986-09-27 21:00:00 (Sat)
  62679646800, #      utc_end 1987-03-28 21:00:00 (Sat)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62679646800, #    utc_start 1987-03-28 21:00:00 (Sat)
  62695371600, #      utc_end 1987-09-26 21:00:00 (Sat)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62695371600, #    utc_start 1987-09-26 21:00:00 (Sat)
  62711096400, #      utc_end 1988-03-26 21:00:00 (Sat)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62711096400, #    utc_start 1988-03-26 21:00:00 (Sat)
  62726821200, #      utc_end 1988-09-24 21:00:00 (Sat)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62726821200, #    utc_start 1988-09-24 21:00:00 (Sat)
  62742546000, #      utc_end 1989-03-25 21:00:00 (Sat)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62742546000, #    utc_start 1989-03-25 21:00:00 (Sat)
  62758270800, #      utc_end 1989-09-23 21:00:00 (Sat)
  62742567600, #  local_start 1989-03-26 03:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62758270800, #    utc_start 1989-09-23 21:00:00 (Sat)
  62773995600, #      utc_end 1990-03-24 21:00:00 (Sat)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62773995600, #    utc_start 1990-03-24 21:00:00 (Sat)
  62790325200, #      utc_end 1990-09-29 21:00:00 (Sat)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62790325200, #    utc_start 1990-09-29 21:00:00 (Sat)
  62806050000, #      utc_end 1991-03-30 21:00:00 (Sat)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62806050000, #    utc_start 1991-03-30 21:00:00 (Sat)
  62821774800, #      utc_end 1991-09-28 21:00:00 (Sat)
  62806071600, #  local_start 1991-03-31 03:00:00 (Sun)
  62821796400, #    local_end 1991-09-29 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62821774800, #    utc_start 1991-09-28 21:00:00 (Sat)
  62829889200, #      utc_end 1991-12-31 19:00:00 (Tue)
  62821792800, #  local_start 1991-09-29 02:00:00 (Sun)
  62829907200, #    local_end 1992-01-01 00:00:00 (Wed)
  18000,
  0,
  '+05',
      ],
      [
  62829889200, #    utc_start 1991-12-31 19:00:00 (Tue)
  DateTime::TimeZone::INFINITY, #      utc_end
  62829907200, #  local_start 1992-01-01 00:00:00 (Wed)
  DateTime::TimeZone::INFINITY, #    local_end
  18000,
  0,
  '+05',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {11}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_SAMARKAND

    $main::fatpacked{"DateTime/TimeZone/Asia/Seoul.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_SEOUL';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/asia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Seoul;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Seoul::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60186900728, #      utc_end 1908-03-31 15:32:08 (Tue)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60186931200, #    local_end 1908-04-01 00:00:00 (Wed)
  30472,
  0,
  'LMT',
      ],
      [
  60186900728, #    utc_start 1908-03-31 15:32:08 (Tue)
  60305268600, #      utc_end 1911-12-31 15:30:00 (Sun)
  60186931328, #  local_start 1908-04-01 00:02:08 (Wed)
  60305299200, #    local_end 1912-01-01 00:00:00 (Mon)
  30600,
  0,
  'KST',
      ],
      [
  60305268600, #    utc_start 1911-12-31 15:30:00 (Sun)
  61368332400, #      utc_end 1945-09-07 15:00:00 (Fri)
  60305301000, #  local_start 1912-01-01 00:30:00 (Mon)
  61368364800, #    local_end 1945-09-08 00:00:00 (Sat)
  32400,
  0,
  'JST',
      ],
      [
  61368332400, #    utc_start 1945-09-07 15:00:00 (Fri)
  61637554800, #      utc_end 1954-03-20 15:00:00 (Sat)
  61368364800, #  local_start 1945-09-08 00:00:00 (Sat)
  61637587200, #    local_end 1954-03-21 00:00:00 (Sun)
  32400,
  0,
  'KST',
      ],
      [
  61637554800, #    utc_start 1954-03-20 15:00:00 (Sat)
  61672980600, #      utc_end 1955-05-04 15:30:00 (Wed)
  61637585400, #  local_start 1954-03-20 23:30:00 (Sat)
  61673011200, #    local_end 1955-05-05 00:00:00 (Thu)
  30600,
  0,
  'KST',
      ],
      [
  61672980600, #    utc_start 1955-05-04 15:30:00 (Wed)
  61683949800, #      utc_end 1955-09-08 14:30:00 (Thu)
  61673014800, #  local_start 1955-05-05 01:00:00 (Thu)
  61683984000, #    local_end 1955-09-09 00:00:00 (Fri)
  34200,
  1,
  'KDT',
      ],
      [
  61683949800, #    utc_start 1955-09-08 14:30:00 (Thu)
  61705899000, #      utc_end 1956-05-19 15:30:00 (Sat)
  61683980400, #  local_start 1955-09-08 23:00:00 (Thu)
  61705929600, #    local_end 1956-05-20 00:00:00 (Sun)
  30600,
  0,
  'KST',
      ],
      [
  61705899000, #    utc_start 1956-05-19 15:30:00 (Sat)
  61717386600, #      utc_end 1956-09-29 14:30:00 (Sat)
  61705933200, #  local_start 1956-05-20 01:00:00 (Sun)
  61717420800, #    local_end 1956-09-30 00:00:00 (Sun)
  34200,
  1,
  'KDT',
      ],
      [
  61717386600, #    utc_start 1956-09-29 14:30:00 (Sat)
  61736139000, #      utc_end 1957-05-04 15:30:00 (Sat)
  61717417200, #  local_start 1956-09-29 23:00:00 (Sat)
  61736169600, #    local_end 1957-05-05 00:00:00 (Sun)
  30600,
  0,
  'KST',
      ],
      [
  61736139000, #    utc_start 1957-05-04 15:30:00 (Sat)
  61748231400, #      utc_end 1957-09-21 14:30:00 (Sat)
  61736173200, #  local_start 1957-05-05 01:00:00 (Sun)
  61748265600, #    local_end 1957-09-22 00:00:00 (Sun)
  34200,
  1,
  'KDT',
      ],
      [
  61748231400, #    utc_start 1957-09-21 14:30:00 (Sat)
  61767588600, #      utc_end 1958-05-03 15:30:00 (Sat)
  61748262000, #  local_start 1957-09-21 23:00:00 (Sat)
  61767619200, #    local_end 1958-05-04 00:00:00 (Sun)
  30600,
  0,
  'KST',
      ],
      [
  61767588600, #    utc_start 1958-05-03 15:30:00 (Sat)
  61779681000, #      utc_end 1958-09-20 14:30:00 (Sat)
  61767622800, #  local_start 1958-05-04 01:00:00 (Sun)
  61779715200, #    local_end 1958-09-21 00:00:00 (Sun)
  34200,
  1,
  'KDT',
      ],
      [
  61779681000, #    utc_start 1958-09-20 14:30:00 (Sat)
  61799038200, #      utc_end 1959-05-02 15:30:00 (Sat)
  61779711600, #  local_start 1958-09-20 23:00:00 (Sat)
  61799068800, #    local_end 1959-05-03 00:00:00 (Sun)
  30600,
  0,
  'KST',
      ],
      [
  61799038200, #    utc_start 1959-05-02 15:30:00 (Sat)
  61811130600, #      utc_end 1959-09-19 14:30:00 (Sat)
  61799072400, #  local_start 1959-05-03 01:00:00 (Sun)
  61811164800, #    local_end 1959-09-20 00:00:00 (Sun)
  34200,
  1,
  'KDT',
      ],
      [
  61811130600, #    utc_start 1959-09-19 14:30:00 (Sat)
  61830487800, #      utc_end 1960-04-30 15:30:00 (Sat)
  61811161200, #  local_start 1959-09-19 23:00:00 (Sat)
  61830518400, #    local_end 1960-05-01 00:00:00 (Sun)
  30600,
  0,
  'KST',
      ],
      [
  61830487800, #    utc_start 1960-04-30 15:30:00 (Sat)
  61842580200, #      utc_end 1960-09-17 14:30:00 (Sat)
  61830522000, #  local_start 1960-05-01 01:00:00 (Sun)
  61842614400, #    local_end 1960-09-18 00:00:00 (Sun)
  34200,
  1,
  'KDT',
      ],
      [
  61842580200, #    utc_start 1960-09-17 14:30:00 (Sat)
  61870750200, #      utc_end 1961-08-09 15:30:00 (Wed)
  61842610800, #  local_start 1960-09-17 23:00:00 (Sat)
  61870780800, #    local_end 1961-08-10 00:00:00 (Thu)
  30600,
  0,
  'KST',
      ],
      [
  61870750200, #    utc_start 1961-08-09 15:30:00 (Wed)
  62683261200, #      utc_end 1987-05-09 17:00:00 (Sat)
  61870782600, #  local_start 1961-08-10 00:30:00 (Thu)
  62683293600, #    local_end 1987-05-10 02:00:00 (Sun)
  32400,
  0,
  'KST',
      ],
      [
  62683261200, #    utc_start 1987-05-09 17:00:00 (Sat)
  62696566800, #      utc_end 1987-10-10 17:00:00 (Sat)
  62683297200, #  local_start 1987-05-10 03:00:00 (Sun)
  62696602800, #    local_end 1987-10-11 03:00:00 (Sun)
  36000,
  1,
  'KDT',
      ],
      [
  62696566800, #    utc_start 1987-10-10 17:00:00 (Sat)
  62714710800, #      utc_end 1988-05-07 17:00:00 (Sat)
  62696599200, #  local_start 1987-10-11 02:00:00 (Sun)
  62714743200, #    local_end 1988-05-08 02:00:00 (Sun)
  32400,
  0,
  'KST',
      ],
      [
  62714710800, #    utc_start 1988-05-07 17:00:00 (Sat)
  62728016400, #      utc_end 1988-10-08 17:00:00 (Sat)
  62714746800, #  local_start 1988-05-08 03:00:00 (Sun)
  62728052400, #    local_end 1988-10-09 03:00:00 (Sun)
  36000,
  1,
  'KDT',
      ],
      [
  62728016400, #    utc_start 1988-10-08 17:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  62728048800, #  local_start 1988-10-09 02:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  32400,
  0,
  'KST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {8}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_SEOUL

    $main::fatpacked{"DateTime/TimeZone/Asia/Shanghai.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_SHANGHAI';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/asia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Shanghai;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Shanghai::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59958201257, #      utc_end 1900-12-31 15:54:17 (Mon)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59958230400, #    local_end 1901-01-01 00:00:00 (Tue)
  29143,
  0,
  'LMT',
      ],
      [
  59958201257, #    utc_start 1900-12-31 15:54:17 (Mon)
  61202016000, #      utc_end 1940-05-31 16:00:00 (Fri)
  59958230057, #  local_start 1900-12-31 23:54:17 (Mon)
  61202044800, #    local_end 1940-06-01 00:00:00 (Sat)
  28800,
  0,
  'CST',
      ],
      [
  61202016000, #    utc_start 1940-05-31 16:00:00 (Fri)
  61213590000, #      utc_end 1940-10-12 15:00:00 (Sat)
  61202048400, #  local_start 1940-06-01 01:00:00 (Sat)
  61213622400, #    local_end 1940-10-13 00:00:00 (Sun)
  32400,
  1,
  'CDT',
      ],
      [
  61213590000, #    utc_start 1940-10-12 15:00:00 (Sat)
  61226812800, #      utc_end 1941-03-14 16:00:00 (Fri)
  61213618800, #  local_start 1940-10-12 23:00:00 (Sat)
  61226841600, #    local_end 1941-03-15 00:00:00 (Sat)
  28800,
  0,
  'CST',
      ],
      [
  61226812800, #    utc_start 1941-03-14 16:00:00 (Fri)
  61246854000, #      utc_end 1941-11-01 15:00:00 (Sat)
  61226845200, #  local_start 1941-03-15 01:00:00 (Sat)
  61246886400, #    local_end 1941-11-02 00:00:00 (Sun)
  32400,
  1,
  'CDT',
      ],
      [
  61246854000, #    utc_start 1941-11-01 15:00:00 (Sat)
  61254633600, #      utc_end 1942-01-30 16:00:00 (Fri)
  61246882800, #  local_start 1941-11-01 23:00:00 (Sat)
  61254662400, #    local_end 1942-01-31 00:00:00 (Sat)
  28800,
  0,
  'CST',
      ],
      [
  61254633600, #    utc_start 1942-01-30 16:00:00 (Fri)
  61367814000, #      utc_end 1945-09-01 15:00:00 (Sat)
  61254666000, #  local_start 1942-01-31 01:00:00 (Sat)
  61367846400, #    local_end 1945-09-02 00:00:00 (Sun)
  32400,
  1,
  'CDT',
      ],
      [
  61367814000, #    utc_start 1945-09-01 15:00:00 (Sat)
  61389849600, #      utc_end 1946-05-14 16:00:00 (Tue)
  61367842800, #  local_start 1945-09-01 23:00:00 (Sat)
  61389878400, #    local_end 1946-05-15 00:00:00 (Wed)
  28800,
  0,
  'CST',
      ],
      [
  61389849600, #    utc_start 1946-05-14 16:00:00 (Tue)
  61401855600, #      utc_end 1946-09-30 15:00:00 (Mon)
  61389882000, #  local_start 1946-05-15 01:00:00 (Wed)
  61401888000, #    local_end 1946-10-01 00:00:00 (Tue)
  32400,
  1,
  'CDT',
      ],
      [
  61401855600, #    utc_start 1946-09-30 15:00:00 (Mon)
  61418793600, #      utc_end 1947-04-14 16:00:00 (Mon)
  61401884400, #  local_start 1946-09-30 23:00:00 (Mon)
  61418822400, #    local_end 1947-04-15 00:00:00 (Tue)
  28800,
  0,
  'CST',
      ],
      [
  61418793600, #    utc_start 1947-04-14 16:00:00 (Mon)
  61436070000, #      utc_end 1947-10-31 15:00:00 (Fri)
  61418826000, #  local_start 1947-04-15 01:00:00 (Tue)
  61436102400, #    local_end 1947-11-01 00:00:00 (Sat)
  32400,
  1,
  'CDT',
      ],
      [
  61436070000, #    utc_start 1947-10-31 15:00:00 (Fri)
  61451798400, #      utc_end 1948-04-30 16:00:00 (Fri)
  61436098800, #  local_start 1947-10-31 23:00:00 (Fri)
  61451827200, #    local_end 1948-05-01 00:00:00 (Sat)
  28800,
  0,
  'CST',
      ],
      [
  61451798400, #    utc_start 1948-04-30 16:00:00 (Fri)
  61465014000, #      utc_end 1948-09-30 15:00:00 (Thu)
  61451830800, #  local_start 1948-05-01 01:00:00 (Sat)
  61465046400, #    local_end 1948-10-01 00:00:00 (Fri)
  32400,
  1,
  'CDT',
      ],
      [
  61465014000, #    utc_start 1948-09-30 15:00:00 (Thu)
  61483334400, #      utc_end 1949-04-30 16:00:00 (Sat)
  61465042800, #  local_start 1948-09-30 23:00:00 (Thu)
  61483363200, #    local_end 1949-05-01 00:00:00 (Sun)
  28800,
  0,
  'CST',
      ],
      [
  61483334400, #    utc_start 1949-04-30 16:00:00 (Sat)
  61485663600, #      utc_end 1949-05-27 15:00:00 (Fri)
  61483366800, #  local_start 1949-05-01 01:00:00 (Sun)
  61485696000, #    local_end 1949-05-28 00:00:00 (Sat)
  32400,
  1,
  'CDT',
      ],
      [
  61485663600, #    utc_start 1949-05-27 15:00:00 (Fri)
  62651210400, #      utc_end 1986-05-03 18:00:00 (Sat)
  61485692400, #  local_start 1949-05-27 23:00:00 (Fri)
  62651239200, #    local_end 1986-05-04 02:00:00 (Sun)
  28800,
  0,
  'CST',
      ],
      [
  62651210400, #    utc_start 1986-05-03 18:00:00 (Sat)
  62662698000, #      utc_end 1986-09-13 17:00:00 (Sat)
  62651242800, #  local_start 1986-05-04 03:00:00 (Sun)
  62662730400, #    local_end 1986-09-14 02:00:00 (Sun)
  32400,
  1,
  'CDT',
      ],
      [
  62662698000, #    utc_start 1986-09-13 17:00:00 (Sat)
  62680845600, #      utc_end 1987-04-11 18:00:00 (Sat)
  62662726800, #  local_start 1986-09-14 01:00:00 (Sun)
  62680874400, #    local_end 1987-04-12 02:00:00 (Sun)
  28800,
  0,
  'CST',
      ],
      [
  62680845600, #    utc_start 1987-04-11 18:00:00 (Sat)
  62694147600, #      utc_end 1987-09-12 17:00:00 (Sat)
  62680878000, #  local_start 1987-04-12 03:00:00 (Sun)
  62694180000, #    local_end 1987-09-13 02:00:00 (Sun)
  32400,
  1,
  'CDT',
      ],
      [
  62694147600, #    utc_start 1987-09-12 17:00:00 (Sat)
  62712900000, #      utc_end 1988-04-16 18:00:00 (Sat)
  62694176400, #  local_start 1987-09-13 01:00:00 (Sun)
  62712928800, #    local_end 1988-04-17 02:00:00 (Sun)
  28800,
  0,
  'CST',
      ],
      [
  62712900000, #    utc_start 1988-04-16 18:00:00 (Sat)
  62725597200, #      utc_end 1988-09-10 17:00:00 (Sat)
  62712932400, #  local_start 1988-04-17 03:00:00 (Sun)
  62725629600, #    local_end 1988-09-11 02:00:00 (Sun)
  32400,
  1,
  'CDT',
      ],
      [
  62725597200, #    utc_start 1988-09-10 17:00:00 (Sat)
  62744349600, #      utc_end 1989-04-15 18:00:00 (Sat)
  62725626000, #  local_start 1988-09-11 01:00:00 (Sun)
  62744378400, #    local_end 1989-04-16 02:00:00 (Sun)
  28800,
  0,
  'CST',
      ],
      [
  62744349600, #    utc_start 1989-04-15 18:00:00 (Sat)
  62757651600, #      utc_end 1989-09-16 17:00:00 (Sat)
  62744382000, #  local_start 1989-04-16 03:00:00 (Sun)
  62757684000, #    local_end 1989-09-17 02:00:00 (Sun)
  32400,
  1,
  'CDT',
      ],
      [
  62757651600, #    utc_start 1989-09-16 17:00:00 (Sat)
  62775799200, #      utc_end 1990-04-14 18:00:00 (Sat)
  62757680400, #  local_start 1989-09-17 01:00:00 (Sun)
  62775828000, #    local_end 1990-04-15 02:00:00 (Sun)
  28800,
  0,
  'CST',
      ],
      [
  62775799200, #    utc_start 1990-04-14 18:00:00 (Sat)
  62789101200, #      utc_end 1990-09-15 17:00:00 (Sat)
  62775831600, #  local_start 1990-04-15 03:00:00 (Sun)
  62789133600, #    local_end 1990-09-16 02:00:00 (Sun)
  32400,
  1,
  'CDT',
      ],
      [
  62789101200, #    utc_start 1990-09-15 17:00:00 (Sat)
  62807248800, #      utc_end 1991-04-13 18:00:00 (Sat)
  62789130000, #  local_start 1990-09-16 01:00:00 (Sun)
  62807277600, #    local_end 1991-04-14 02:00:00 (Sun)
  28800,
  0,
  'CST',
      ],
      [
  62807248800, #    utc_start 1991-04-13 18:00:00 (Sat)
  62820550800, #      utc_end 1991-09-14 17:00:00 (Sat)
  62807281200, #  local_start 1991-04-14 03:00:00 (Sun)
  62820583200, #    local_end 1991-09-15 02:00:00 (Sun)
  32400,
  1,
  'CDT',
      ],
      [
  62820550800, #    utc_start 1991-09-14 17:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  62820579600, #  local_start 1991-09-15 01:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  28800,
  0,
  'CST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {13}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_SHANGHAI

    $main::fatpacked{"DateTime/TimeZone/Asia/Singapore.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_SINGAPORE';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/asia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Singapore;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Singapore::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59958205475, #      utc_end 1900-12-31 17:04:35 (Mon)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59958230400, #    local_end 1901-01-01 00:00:00 (Tue)
  24925,
  0,
  'LMT',
      ],
      [
  59958205475, #    utc_start 1900-12-31 17:04:35 (Mon)
  60097482275, #      utc_end 1905-05-31 17:04:35 (Wed)
  59958230400, #  local_start 1901-01-01 00:00:00 (Tue)
  60097507200, #    local_end 1905-06-01 00:00:00 (Thu)
  24925,
  0,
  'SMT',
      ],
      [
  60097482275, #    utc_start 1905-05-31 17:04:35 (Wed)
  60968048400, #      utc_end 1932-12-31 17:00:00 (Sat)
  60097507475, #  local_start 1905-06-01 00:04:35 (Thu)
  60968073600, #    local_end 1933-01-01 00:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  60968048400, #    utc_start 1932-12-31 17:00:00 (Sat)
  61062655200, #      utc_end 1935-12-31 16:40:00 (Tue)
  60968074800, #  local_start 1933-01-01 00:20:00 (Sun)
  61062681600, #    local_end 1936-01-01 00:00:00 (Wed)
  26400,
  1,
  '+0720',
      ],
      [
  61062655200, #    utc_start 1935-12-31 16:40:00 (Tue)
  61241503200, #      utc_end 1941-08-31 16:40:00 (Sun)
  61062681600, #  local_start 1936-01-01 00:00:00 (Wed)
  61241529600, #    local_end 1941-09-01 00:00:00 (Mon)
  26400,
  0,
  '+0720',
      ],
      [
  61241503200, #    utc_start 1941-08-31 16:40:00 (Sun)
  61256017800, #      utc_end 1942-02-15 16:30:00 (Sun)
  61241530200, #  local_start 1941-09-01 00:10:00 (Mon)
  61256044800, #    local_end 1942-02-16 00:00:00 (Mon)
  27000,
  0,
  '+0730',
      ],
      [
  61256017800, #    utc_start 1942-02-15 16:30:00 (Sun)
  61368678000, #      utc_end 1945-09-11 15:00:00 (Tue)
  61256050200, #  local_start 1942-02-16 01:30:00 (Mon)
  61368710400, #    local_end 1945-09-12 00:00:00 (Wed)
  32400,
  0,
  '+09',
      ],
      [
  61368678000, #    utc_start 1945-09-11 15:00:00 (Tue)
  62514347400, #      utc_end 1981-12-31 16:30:00 (Thu)
  61368705000, #  local_start 1945-09-11 22:30:00 (Tue)
  62514374400, #    local_end 1982-01-01 00:00:00 (Fri)
  27000,
  0,
  '+0730',
      ],
      [
  62514347400, #    utc_start 1981-12-31 16:30:00 (Thu)
  DateTime::TimeZone::INFINITY, #      utc_end
  62514376200, #  local_start 1982-01-01 00:30:00 (Fri)
  DateTime::TimeZone::INFINITY, #    local_end
  28800,
  0,
  '+08',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {1}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_SINGAPORE

    $main::fatpacked{"DateTime/TimeZone/Asia/Srednekolymsk.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_SREDNEKOLYMSK';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Srednekolymsk;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Srednekolymsk::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60694494308, #      utc_end 1924-05-01 13:45:08 (Thu)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60694531200, #    local_end 1924-05-02 00:00:00 (Fri)
  36892,
  0,
  'LMT',
      ],
      [
  60694494308, #    utc_start 1924-05-01 13:45:08 (Thu)
  60888117600, #      utc_end 1930-06-20 14:00:00 (Fri)
  60694530308, #  local_start 1924-05-01 23:45:08 (Thu)
  60888153600, #    local_end 1930-06-21 00:00:00 (Sat)
  36000,
  0,
  '+10',
      ],
      [
  60888117600, #    utc_start 1930-06-20 14:00:00 (Fri)
  62490574800, #      utc_end 1981-03-31 13:00:00 (Tue)
  60888157200, #  local_start 1930-06-21 01:00:00 (Sat)
  62490614400, #    local_end 1981-04-01 00:00:00 (Wed)
  39600,
  0,
  '+11',
      ],
      [
  62490574800, #    utc_start 1981-03-31 13:00:00 (Tue)
  62506382400, #      utc_end 1981-09-30 12:00:00 (Wed)
  62490618000, #  local_start 1981-04-01 01:00:00 (Wed)
  62506425600, #    local_end 1981-10-01 00:00:00 (Thu)
  43200,
  1,
  '+12',
      ],
      [
  62506382400, #    utc_start 1981-09-30 12:00:00 (Wed)
  62522110800, #      utc_end 1982-03-31 13:00:00 (Wed)
  62506422000, #  local_start 1981-09-30 23:00:00 (Wed)
  62522150400, #    local_end 1982-04-01 00:00:00 (Thu)
  39600,
  0,
  '+11',
      ],
      [
  62522110800, #    utc_start 1982-03-31 13:00:00 (Wed)
  62537918400, #      utc_end 1982-09-30 12:00:00 (Thu)
  62522154000, #  local_start 1982-04-01 01:00:00 (Thu)
  62537961600, #    local_end 1982-10-01 00:00:00 (Fri)
  43200,
  1,
  '+12',
      ],
      [
  62537918400, #    utc_start 1982-09-30 12:00:00 (Thu)
  62553646800, #      utc_end 1983-03-31 13:00:00 (Thu)
  62537958000, #  local_start 1982-09-30 23:00:00 (Thu)
  62553686400, #    local_end 1983-04-01 00:00:00 (Fri)
  39600,
  0,
  '+11',
      ],
      [
  62553646800, #    utc_start 1983-03-31 13:00:00 (Thu)
  62569454400, #      utc_end 1983-09-30 12:00:00 (Fri)
  62553690000, #  local_start 1983-04-01 01:00:00 (Fri)
  62569497600, #    local_end 1983-10-01 00:00:00 (Sat)
  43200,
  1,
  '+12',
      ],
      [
  62569454400, #    utc_start 1983-09-30 12:00:00 (Fri)
  62585269200, #      utc_end 1984-03-31 13:00:00 (Sat)
  62569494000, #  local_start 1983-09-30 23:00:00 (Fri)
  62585308800, #    local_end 1984-04-01 00:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62585269200, #    utc_start 1984-03-31 13:00:00 (Sat)
  62601001200, #      utc_end 1984-09-29 15:00:00 (Sat)
  62585312400, #  local_start 1984-04-01 01:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  62601001200, #    utc_start 1984-09-29 15:00:00 (Sat)
  62616726000, #      utc_end 1985-03-30 15:00:00 (Sat)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62616726000, #    utc_start 1985-03-30 15:00:00 (Sat)
  62632450800, #      utc_end 1985-09-28 15:00:00 (Sat)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  62632450800, #    utc_start 1985-09-28 15:00:00 (Sat)
  62648175600, #      utc_end 1986-03-29 15:00:00 (Sat)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62648175600, #    utc_start 1986-03-29 15:00:00 (Sat)
  62663900400, #      utc_end 1986-09-27 15:00:00 (Sat)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  62663900400, #    utc_start 1986-09-27 15:00:00 (Sat)
  62679625200, #      utc_end 1987-03-28 15:00:00 (Sat)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62679625200, #    utc_start 1987-03-28 15:00:00 (Sat)
  62695350000, #      utc_end 1987-09-26 15:00:00 (Sat)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  62695350000, #    utc_start 1987-09-26 15:00:00 (Sat)
  62711074800, #      utc_end 1988-03-26 15:00:00 (Sat)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62711074800, #    utc_start 1988-03-26 15:00:00 (Sat)
  62726799600, #      utc_end 1988-09-24 15:00:00 (Sat)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  62726799600, #    utc_start 1988-09-24 15:00:00 (Sat)
  62742524400, #      utc_end 1989-03-25 15:00:00 (Sat)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62742524400, #    utc_start 1989-03-25 15:00:00 (Sat)
  62758249200, #      utc_end 1989-09-23 15:00:00 (Sat)
  62742567600, #  local_start 1989-03-26 03:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  62758249200, #    utc_start 1989-09-23 15:00:00 (Sat)
  62773974000, #      utc_end 1990-03-24 15:00:00 (Sat)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62773974000, #    utc_start 1990-03-24 15:00:00 (Sat)
  62790303600, #      utc_end 1990-09-29 15:00:00 (Sat)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  62790303600, #    utc_start 1990-09-29 15:00:00 (Sat)
  62806028400, #      utc_end 1991-03-30 15:00:00 (Sat)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62806028400, #    utc_start 1991-03-30 15:00:00 (Sat)
  62821756800, #      utc_end 1991-09-28 16:00:00 (Sat)
  62806068000, #  local_start 1991-03-31 02:00:00 (Sun)
  62821796400, #    local_end 1991-09-29 03:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  62821756800, #    utc_start 1991-09-28 16:00:00 (Sat)
  62831433600, #      utc_end 1992-01-18 16:00:00 (Sat)
  62821792800, #  local_start 1991-09-29 02:00:00 (Sun)
  62831469600, #    local_end 1992-01-19 02:00:00 (Sun)
  36000,
  0,
  '+10',
      ],
      [
  62831433600, #    utc_start 1992-01-18 16:00:00 (Sat)
  62837478000, #      utc_end 1992-03-28 15:00:00 (Sat)
  62831473200, #  local_start 1992-01-19 03:00:00 (Sun)
  62837517600, #    local_end 1992-03-29 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62837478000, #    utc_start 1992-03-28 15:00:00 (Sat)
  62853202800, #      utc_end 1992-09-26 15:00:00 (Sat)
  62837521200, #  local_start 1992-03-29 03:00:00 (Sun)
  62853246000, #    local_end 1992-09-27 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  62853202800, #    utc_start 1992-09-26 15:00:00 (Sat)
  62868927600, #      utc_end 1993-03-27 15:00:00 (Sat)
  62853242400, #  local_start 1992-09-27 02:00:00 (Sun)
  62868967200, #    local_end 1993-03-28 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62868927600, #    utc_start 1993-03-27 15:00:00 (Sat)
  62884652400, #      utc_end 1993-09-25 15:00:00 (Sat)
  62868970800, #  local_start 1993-03-28 03:00:00 (Sun)
  62884695600, #    local_end 1993-09-26 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  62884652400, #    utc_start 1993-09-25 15:00:00 (Sat)
  62900377200, #      utc_end 1994-03-26 15:00:00 (Sat)
  62884692000, #  local_start 1993-09-26 02:00:00 (Sun)
  62900416800, #    local_end 1994-03-27 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62900377200, #    utc_start 1994-03-26 15:00:00 (Sat)
  62916102000, #      utc_end 1994-09-24 15:00:00 (Sat)
  62900420400, #  local_start 1994-03-27 03:00:00 (Sun)
  62916145200, #    local_end 1994-09-25 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  62916102000, #    utc_start 1994-09-24 15:00:00 (Sat)
  62931826800, #      utc_end 1995-03-25 15:00:00 (Sat)
  62916141600, #  local_start 1994-09-25 02:00:00 (Sun)
  62931866400, #    local_end 1995-03-26 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62931826800, #    utc_start 1995-03-25 15:00:00 (Sat)
  62947551600, #      utc_end 1995-09-23 15:00:00 (Sat)
  62931870000, #  local_start 1995-03-26 03:00:00 (Sun)
  62947594800, #    local_end 1995-09-24 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  62947551600, #    utc_start 1995-09-23 15:00:00 (Sat)
  62963881200, #      utc_end 1996-03-30 15:00:00 (Sat)
  62947591200, #  local_start 1995-09-24 02:00:00 (Sun)
  62963920800, #    local_end 1996-03-31 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62963881200, #    utc_start 1996-03-30 15:00:00 (Sat)
  62982025200, #      utc_end 1996-10-26 15:00:00 (Sat)
  62963924400, #  local_start 1996-03-31 03:00:00 (Sun)
  62982068400, #    local_end 1996-10-27 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  62982025200, #    utc_start 1996-10-26 15:00:00 (Sat)
  62995330800, #      utc_end 1997-03-29 15:00:00 (Sat)
  62982064800, #  local_start 1996-10-27 02:00:00 (Sun)
  62995370400, #    local_end 1997-03-30 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62995330800, #    utc_start 1997-03-29 15:00:00 (Sat)
  63013474800, #      utc_end 1997-10-25 15:00:00 (Sat)
  62995374000, #  local_start 1997-03-30 03:00:00 (Sun)
  63013518000, #    local_end 1997-10-26 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  63013474800, #    utc_start 1997-10-25 15:00:00 (Sat)
  63026780400, #      utc_end 1998-03-28 15:00:00 (Sat)
  63013514400, #  local_start 1997-10-26 02:00:00 (Sun)
  63026820000, #    local_end 1998-03-29 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  63026780400, #    utc_start 1998-03-28 15:00:00 (Sat)
  63044924400, #      utc_end 1998-10-24 15:00:00 (Sat)
  63026823600, #  local_start 1998-03-29 03:00:00 (Sun)
  63044967600, #    local_end 1998-10-25 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  63044924400, #    utc_start 1998-10-24 15:00:00 (Sat)
  63058230000, #      utc_end 1999-03-27 15:00:00 (Sat)
  63044964000, #  local_start 1998-10-25 02:00:00 (Sun)
  63058269600, #    local_end 1999-03-28 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  63058230000, #    utc_start 1999-03-27 15:00:00 (Sat)
  63076978800, #      utc_end 1999-10-30 15:00:00 (Sat)
  63058273200, #  local_start 1999-03-28 03:00:00 (Sun)
  63077022000, #    local_end 1999-10-31 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  63076978800, #    utc_start 1999-10-30 15:00:00 (Sat)
  63089679600, #      utc_end 2000-03-25 15:00:00 (Sat)
  63077018400, #  local_start 1999-10-31 02:00:00 (Sun)
  63089719200, #    local_end 2000-03-26 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  63089679600, #    utc_start 2000-03-25 15:00:00 (Sat)
  63108428400, #      utc_end 2000-10-28 15:00:00 (Sat)
  63089722800, #  local_start 2000-03-26 03:00:00 (Sun)
  63108471600, #    local_end 2000-10-29 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  63108428400, #    utc_start 2000-10-28 15:00:00 (Sat)
  63121129200, #      utc_end 2001-03-24 15:00:00 (Sat)
  63108468000, #  local_start 2000-10-29 02:00:00 (Sun)
  63121168800, #    local_end 2001-03-25 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  63121129200, #    utc_start 2001-03-24 15:00:00 (Sat)
  63139878000, #      utc_end 2001-10-27 15:00:00 (Sat)
  63121172400, #  local_start 2001-03-25 03:00:00 (Sun)
  63139921200, #    local_end 2001-10-28 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  63139878000, #    utc_start 2001-10-27 15:00:00 (Sat)
  63153183600, #      utc_end 2002-03-30 15:00:00 (Sat)
  63139917600, #  local_start 2001-10-28 02:00:00 (Sun)
  63153223200, #    local_end 2002-03-31 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  63153183600, #    utc_start 2002-03-30 15:00:00 (Sat)
  63171327600, #      utc_end 2002-10-26 15:00:00 (Sat)
  63153226800, #  local_start 2002-03-31 03:00:00 (Sun)
  63171370800, #    local_end 2002-10-27 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  63171327600, #    utc_start 2002-10-26 15:00:00 (Sat)
  63184633200, #      utc_end 2003-03-29 15:00:00 (Sat)
  63171367200, #  local_start 2002-10-27 02:00:00 (Sun)
  63184672800, #    local_end 2003-03-30 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  63184633200, #    utc_start 2003-03-29 15:00:00 (Sat)
  63202777200, #      utc_end 2003-10-25 15:00:00 (Sat)
  63184676400, #  local_start 2003-03-30 03:00:00 (Sun)
  63202820400, #    local_end 2003-10-26 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  63202777200, #    utc_start 2003-10-25 15:00:00 (Sat)
  63216082800, #      utc_end 2004-03-27 15:00:00 (Sat)
  63202816800, #  local_start 2003-10-26 02:00:00 (Sun)
  63216122400, #    local_end 2004-03-28 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  63216082800, #    utc_start 2004-03-27 15:00:00 (Sat)
  63234831600, #      utc_end 2004-10-30 15:00:00 (Sat)
  63216126000, #  local_start 2004-03-28 03:00:00 (Sun)
  63234874800, #    local_end 2004-10-31 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  63234831600, #    utc_start 2004-10-30 15:00:00 (Sat)
  63247532400, #      utc_end 2005-03-26 15:00:00 (Sat)
  63234871200, #  local_start 2004-10-31 02:00:00 (Sun)
  63247572000, #    local_end 2005-03-27 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  63247532400, #    utc_start 2005-03-26 15:00:00 (Sat)
  63266281200, #      utc_end 2005-10-29 15:00:00 (Sat)
  63247575600, #  local_start 2005-03-27 03:00:00 (Sun)
  63266324400, #    local_end 2005-10-30 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  63266281200, #    utc_start 2005-10-29 15:00:00 (Sat)
  63278982000, #      utc_end 2006-03-25 15:00:00 (Sat)
  63266320800, #  local_start 2005-10-30 02:00:00 (Sun)
  63279021600, #    local_end 2006-03-26 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  63278982000, #    utc_start 2006-03-25 15:00:00 (Sat)
  63297730800, #      utc_end 2006-10-28 15:00:00 (Sat)
  63279025200, #  local_start 2006-03-26 03:00:00 (Sun)
  63297774000, #    local_end 2006-10-29 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  63297730800, #    utc_start 2006-10-28 15:00:00 (Sat)
  63310431600, #      utc_end 2007-03-24 15:00:00 (Sat)
  63297770400, #  local_start 2006-10-29 02:00:00 (Sun)
  63310471200, #    local_end 2007-03-25 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  63310431600, #    utc_start 2007-03-24 15:00:00 (Sat)
  63329180400, #      utc_end 2007-10-27 15:00:00 (Sat)
  63310474800, #  local_start 2007-03-25 03:00:00 (Sun)
  63329223600, #    local_end 2007-10-28 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  63329180400, #    utc_start 2007-10-27 15:00:00 (Sat)
  63342486000, #      utc_end 2008-03-29 15:00:00 (Sat)
  63329220000, #  local_start 2007-10-28 02:00:00 (Sun)
  63342525600, #    local_end 2008-03-30 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  63342486000, #    utc_start 2008-03-29 15:00:00 (Sat)
  63360630000, #      utc_end 2008-10-25 15:00:00 (Sat)
  63342529200, #  local_start 2008-03-30 03:00:00 (Sun)
  63360673200, #    local_end 2008-10-26 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  63360630000, #    utc_start 2008-10-25 15:00:00 (Sat)
  63373935600, #      utc_end 2009-03-28 15:00:00 (Sat)
  63360669600, #  local_start 2008-10-26 02:00:00 (Sun)
  63373975200, #    local_end 2009-03-29 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  63373935600, #    utc_start 2009-03-28 15:00:00 (Sat)
  63392079600, #      utc_end 2009-10-24 15:00:00 (Sat)
  63373978800, #  local_start 2009-03-29 03:00:00 (Sun)
  63392122800, #    local_end 2009-10-25 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  63392079600, #    utc_start 2009-10-24 15:00:00 (Sat)
  63405385200, #      utc_end 2010-03-27 15:00:00 (Sat)
  63392119200, #  local_start 2009-10-25 02:00:00 (Sun)
  63405424800, #    local_end 2010-03-28 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  63405385200, #    utc_start 2010-03-27 15:00:00 (Sat)
  63424134000, #      utc_end 2010-10-30 15:00:00 (Sat)
  63405428400, #  local_start 2010-03-28 03:00:00 (Sun)
  63424177200, #    local_end 2010-10-31 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  63424134000, #    utc_start 2010-10-30 15:00:00 (Sat)
  63436834800, #      utc_end 2011-03-26 15:00:00 (Sat)
  63424173600, #  local_start 2010-10-31 02:00:00 (Sun)
  63436874400, #    local_end 2011-03-27 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  63436834800, #    utc_start 2011-03-26 15:00:00 (Sat)
  63549928800, #      utc_end 2014-10-25 14:00:00 (Sat)
  63436878000, #  local_start 2011-03-27 03:00:00 (Sun)
  63549972000, #    local_end 2014-10-26 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  63549928800, #    utc_start 2014-10-25 14:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  63549968400, #  local_start 2014-10-26 01:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  39600,
  0,
  '+11',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {30}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_SREDNEKOLYMSK

    $main::fatpacked{"DateTime/TimeZone/Asia/Taipei.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_TAIPEI';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/asia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Taipei;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Taipei::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59800434840, #      utc_end 1895-12-31 15:54:00 (Tue)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59800464000, #    local_end 1896-01-01 00:00:00 (Wed)
  29160,
  0,
  'LMT',
      ],
      [
  59800434840, #    utc_start 1895-12-31 15:54:00 (Tue)
  61117862400, #      utc_end 1937-09-30 16:00:00 (Thu)
  59800463640, #  local_start 1895-12-31 23:54:00 (Tue)
  61117891200, #    local_end 1937-10-01 00:00:00 (Fri)
  28800,
  0,
  'CST',
      ],
      [
  61117862400, #    utc_start 1937-09-30 16:00:00 (Thu)
  61369459200, #      utc_end 1945-09-20 16:00:00 (Thu)
  61117894800, #  local_start 1937-10-01 01:00:00 (Fri)
  61369491600, #    local_end 1945-09-21 01:00:00 (Fri)
  32400,
  0,
  'JST',
      ],
      [
  61369459200, #    utc_start 1945-09-20 16:00:00 (Thu)
  61389849600, #      utc_end 1946-05-14 16:00:00 (Tue)
  61369488000, #  local_start 1945-09-21 00:00:00 (Fri)
  61389878400, #    local_end 1946-05-15 00:00:00 (Wed)
  28800,
  0,
  'CST',
      ],
      [
  61389849600, #    utc_start 1946-05-14 16:00:00 (Tue)
  61401855600, #      utc_end 1946-09-30 15:00:00 (Mon)
  61389882000, #  local_start 1946-05-15 01:00:00 (Wed)
  61401888000, #    local_end 1946-10-01 00:00:00 (Tue)
  32400,
  1,
  'CDT',
      ],
      [
  61401855600, #    utc_start 1946-09-30 15:00:00 (Mon)
  61418793600, #      utc_end 1947-04-14 16:00:00 (Mon)
  61401884400, #  local_start 1946-09-30 23:00:00 (Mon)
  61418822400, #    local_end 1947-04-15 00:00:00 (Tue)
  28800,
  0,
  'CST',
      ],
      [
  61418793600, #    utc_start 1947-04-14 16:00:00 (Mon)
  61436070000, #      utc_end 1947-10-31 15:00:00 (Fri)
  61418826000, #  local_start 1947-04-15 01:00:00 (Tue)
  61436102400, #    local_end 1947-11-01 00:00:00 (Sat)
  32400,
  1,
  'CDT',
      ],
      [
  61436070000, #    utc_start 1947-10-31 15:00:00 (Fri)
  61451798400, #      utc_end 1948-04-30 16:00:00 (Fri)
  61436098800, #  local_start 1947-10-31 23:00:00 (Fri)
  61451827200, #    local_end 1948-05-01 00:00:00 (Sat)
  28800,
  0,
  'CST',
      ],
      [
  61451798400, #    utc_start 1948-04-30 16:00:00 (Fri)
  61465014000, #      utc_end 1948-09-30 15:00:00 (Thu)
  61451830800, #  local_start 1948-05-01 01:00:00 (Sat)
  61465046400, #    local_end 1948-10-01 00:00:00 (Fri)
  32400,
  1,
  'CDT',
      ],
      [
  61465014000, #    utc_start 1948-09-30 15:00:00 (Thu)
  61483334400, #      utc_end 1949-04-30 16:00:00 (Sat)
  61465042800, #  local_start 1948-09-30 23:00:00 (Thu)
  61483363200, #    local_end 1949-05-01 00:00:00 (Sun)
  28800,
  0,
  'CST',
      ],
      [
  61483334400, #    utc_start 1949-04-30 16:00:00 (Sat)
  61496550000, #      utc_end 1949-09-30 15:00:00 (Fri)
  61483366800, #  local_start 1949-05-01 01:00:00 (Sun)
  61496582400, #    local_end 1949-10-01 00:00:00 (Sat)
  32400,
  1,
  'CDT',
      ],
      [
  61496550000, #    utc_start 1949-09-30 15:00:00 (Fri)
  61514870400, #      utc_end 1950-04-30 16:00:00 (Sun)
  61496578800, #  local_start 1949-09-30 23:00:00 (Fri)
  61514899200, #    local_end 1950-05-01 00:00:00 (Mon)
  28800,
  0,
  'CST',
      ],
      [
  61514870400, #    utc_start 1950-04-30 16:00:00 (Sun)
  61528086000, #      utc_end 1950-09-30 15:00:00 (Sat)
  61514902800, #  local_start 1950-05-01 01:00:00 (Mon)
  61528118400, #    local_end 1950-10-01 00:00:00 (Sun)
  32400,
  1,
  'CDT',
      ],
      [
  61528086000, #    utc_start 1950-09-30 15:00:00 (Sat)
  61546406400, #      utc_end 1951-04-30 16:00:00 (Mon)
  61528114800, #  local_start 1950-09-30 23:00:00 (Sat)
  61546435200, #    local_end 1951-05-01 00:00:00 (Tue)
  28800,
  0,
  'CST',
      ],
      [
  61546406400, #    utc_start 1951-04-30 16:00:00 (Mon)
  61559622000, #      utc_end 1951-09-30 15:00:00 (Sun)
  61546438800, #  local_start 1951-05-01 01:00:00 (Tue)
  61559654400, #    local_end 1951-10-01 00:00:00 (Mon)
  32400,
  1,
  'CDT',
      ],
      [
  61559622000, #    utc_start 1951-09-30 15:00:00 (Sun)
  61572758400, #      utc_end 1952-02-29 16:00:00 (Fri)
  61559650800, #  local_start 1951-09-30 23:00:00 (Sun)
  61572787200, #    local_end 1952-03-01 00:00:00 (Sat)
  28800,
  0,
  'CST',
      ],
      [
  61572758400, #    utc_start 1952-02-29 16:00:00 (Fri)
  61593922800, #      utc_end 1952-10-31 15:00:00 (Fri)
  61572790800, #  local_start 1952-03-01 01:00:00 (Sat)
  61593955200, #    local_end 1952-11-01 00:00:00 (Sat)
  32400,
  1,
  'CDT',
      ],
      [
  61593922800, #    utc_start 1952-10-31 15:00:00 (Fri)
  61606972800, #      utc_end 1953-03-31 16:00:00 (Tue)
  61593951600, #  local_start 1952-10-31 23:00:00 (Fri)
  61607001600, #    local_end 1953-04-01 00:00:00 (Wed)
  28800,
  0,
  'CST',
      ],
      [
  61606972800, #    utc_start 1953-03-31 16:00:00 (Tue)
  61625458800, #      utc_end 1953-10-31 15:00:00 (Sat)
  61607005200, #  local_start 1953-04-01 01:00:00 (Wed)
  61625491200, #    local_end 1953-11-01 00:00:00 (Sun)
  32400,
  1,
  'CDT',
      ],
      [
  61625458800, #    utc_start 1953-10-31 15:00:00 (Sat)
  61638508800, #      utc_end 1954-03-31 16:00:00 (Wed)
  61625487600, #  local_start 1953-10-31 23:00:00 (Sat)
  61638537600, #    local_end 1954-04-01 00:00:00 (Thu)
  28800,
  0,
  'CST',
      ],
      [
  61638508800, #    utc_start 1954-03-31 16:00:00 (Wed)
  61656994800, #      utc_end 1954-10-31 15:00:00 (Sun)
  61638541200, #  local_start 1954-04-01 01:00:00 (Thu)
  61657027200, #    local_end 1954-11-01 00:00:00 (Mon)
  32400,
  1,
  'CDT',
      ],
      [
  61656994800, #    utc_start 1954-10-31 15:00:00 (Sun)
  61670044800, #      utc_end 1955-03-31 16:00:00 (Thu)
  61657023600, #  local_start 1954-10-31 23:00:00 (Sun)
  61670073600, #    local_end 1955-04-01 00:00:00 (Fri)
  28800,
  0,
  'CST',
      ],
      [
  61670044800, #    utc_start 1955-03-31 16:00:00 (Thu)
  61685852400, #      utc_end 1955-09-30 15:00:00 (Fri)
  61670077200, #  local_start 1955-04-01 01:00:00 (Fri)
  61685884800, #    local_end 1955-10-01 00:00:00 (Sat)
  32400,
  1,
  'CDT',
      ],
      [
  61685852400, #    utc_start 1955-09-30 15:00:00 (Fri)
  61701667200, #      utc_end 1956-03-31 16:00:00 (Sat)
  61685881200, #  local_start 1955-09-30 23:00:00 (Fri)
  61701696000, #    local_end 1956-04-01 00:00:00 (Sun)
  28800,
  0,
  'CST',
      ],
      [
  61701667200, #    utc_start 1956-03-31 16:00:00 (Sat)
  61717474800, #      utc_end 1956-09-30 15:00:00 (Sun)
  61701699600, #  local_start 1956-04-01 01:00:00 (Sun)
  61717507200, #    local_end 1956-10-01 00:00:00 (Mon)
  32400,
  1,
  'CDT',
      ],
      [
  61717474800, #    utc_start 1956-09-30 15:00:00 (Sun)
  61733203200, #      utc_end 1957-03-31 16:00:00 (Sun)
  61717503600, #  local_start 1956-09-30 23:00:00 (Sun)
  61733232000, #    local_end 1957-04-01 00:00:00 (Mon)
  28800,
  0,
  'CST',
      ],
      [
  61733203200, #    utc_start 1957-03-31 16:00:00 (Sun)
  61749010800, #      utc_end 1957-09-30 15:00:00 (Mon)
  61733235600, #  local_start 1957-04-01 01:00:00 (Mon)
  61749043200, #    local_end 1957-10-01 00:00:00 (Tue)
  32400,
  1,
  'CDT',
      ],
      [
  61749010800, #    utc_start 1957-09-30 15:00:00 (Mon)
  61764739200, #      utc_end 1958-03-31 16:00:00 (Mon)
  61749039600, #  local_start 1957-09-30 23:00:00 (Mon)
  61764768000, #    local_end 1958-04-01 00:00:00 (Tue)
  28800,
  0,
  'CST',
      ],
      [
  61764739200, #    utc_start 1958-03-31 16:00:00 (Mon)
  61780546800, #      utc_end 1958-09-30 15:00:00 (Tue)
  61764771600, #  local_start 1958-04-01 01:00:00 (Tue)
  61780579200, #    local_end 1958-10-01 00:00:00 (Wed)
  32400,
  1,
  'CDT',
      ],
      [
  61780546800, #    utc_start 1958-09-30 15:00:00 (Tue)
  61796275200, #      utc_end 1959-03-31 16:00:00 (Tue)
  61780575600, #  local_start 1958-09-30 23:00:00 (Tue)
  61796304000, #    local_end 1959-04-01 00:00:00 (Wed)
  28800,
  0,
  'CST',
      ],
      [
  61796275200, #    utc_start 1959-03-31 16:00:00 (Tue)
  61812082800, #      utc_end 1959-09-30 15:00:00 (Wed)
  61796307600, #  local_start 1959-04-01 01:00:00 (Wed)
  61812115200, #    local_end 1959-10-01 00:00:00 (Thu)
  32400,
  1,
  'CDT',
      ],
      [
  61812082800, #    utc_start 1959-09-30 15:00:00 (Wed)
  61833168000, #      utc_end 1960-05-31 16:00:00 (Tue)
  61812111600, #  local_start 1959-09-30 23:00:00 (Wed)
  61833196800, #    local_end 1960-06-01 00:00:00 (Wed)
  28800,
  0,
  'CST',
      ],
      [
  61833168000, #    utc_start 1960-05-31 16:00:00 (Tue)
  61843705200, #      utc_end 1960-09-30 15:00:00 (Fri)
  61833200400, #  local_start 1960-06-01 01:00:00 (Wed)
  61843737600, #    local_end 1960-10-01 00:00:00 (Sat)
  32400,
  1,
  'CDT',
      ],
      [
  61843705200, #    utc_start 1960-09-30 15:00:00 (Fri)
  61864704000, #      utc_end 1961-05-31 16:00:00 (Wed)
  61843734000, #  local_start 1960-09-30 23:00:00 (Fri)
  61864732800, #    local_end 1961-06-01 00:00:00 (Thu)
  28800,
  0,
  'CST',
      ],
      [
  61864704000, #    utc_start 1961-05-31 16:00:00 (Wed)
  61875241200, #      utc_end 1961-09-30 15:00:00 (Sat)
  61864736400, #  local_start 1961-06-01 01:00:00 (Thu)
  61875273600, #    local_end 1961-10-01 00:00:00 (Sun)
  32400,
  1,
  'CDT',
      ],
      [
  61875241200, #    utc_start 1961-09-30 15:00:00 (Sat)
  62269660800, #      utc_end 1974-03-31 16:00:00 (Sun)
  61875270000, #  local_start 1961-09-30 23:00:00 (Sat)
  62269689600, #    local_end 1974-04-01 00:00:00 (Mon)
  28800,
  0,
  'CST',
      ],
      [
  62269660800, #    utc_start 1974-03-31 16:00:00 (Sun)
  62285468400, #      utc_end 1974-09-30 15:00:00 (Mon)
  62269693200, #  local_start 1974-04-01 01:00:00 (Mon)
  62285500800, #    local_end 1974-10-01 00:00:00 (Tue)
  32400,
  1,
  'CDT',
      ],
      [
  62285468400, #    utc_start 1974-09-30 15:00:00 (Mon)
  62301196800, #      utc_end 1975-03-31 16:00:00 (Mon)
  62285497200, #  local_start 1974-09-30 23:00:00 (Mon)
  62301225600, #    local_end 1975-04-01 00:00:00 (Tue)
  28800,
  0,
  'CST',
      ],
      [
  62301196800, #    utc_start 1975-03-31 16:00:00 (Mon)
  62317004400, #      utc_end 1975-09-30 15:00:00 (Tue)
  62301229200, #  local_start 1975-04-01 01:00:00 (Tue)
  62317036800, #    local_end 1975-10-01 00:00:00 (Wed)
  32400,
  1,
  'CDT',
      ],
      [
  62317004400, #    utc_start 1975-09-30 15:00:00 (Tue)
  62435289600, #      utc_end 1979-06-30 16:00:00 (Sat)
  62317033200, #  local_start 1975-09-30 23:00:00 (Tue)
  62435318400, #    local_end 1979-07-01 00:00:00 (Sun)
  28800,
  0,
  'CST',
      ],
      [
  62435289600, #    utc_start 1979-06-30 16:00:00 (Sat)
  62443234800, #      utc_end 1979-09-30 15:00:00 (Sun)
  62435322000, #  local_start 1979-07-01 01:00:00 (Sun)
  62443267200, #    local_end 1979-10-01 00:00:00 (Mon)
  32400,
  1,
  'CDT',
      ],
      [
  62443234800, #    utc_start 1979-09-30 15:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #      utc_end
  62443263600, #  local_start 1979-09-30 23:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  28800,
  0,
  'CST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {19}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_TAIPEI

    $main::fatpacked{"DateTime/TimeZone/Asia/Tashkent.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_TASHKENT';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/asia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Tashkent;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Tashkent::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60694514569, #      utc_end 1924-05-01 19:22:49 (Thu)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60694531200, #    local_end 1924-05-02 00:00:00 (Fri)
  16631,
  0,
  'LMT',
      ],
      [
  60694514569, #    utc_start 1924-05-01 19:22:49 (Thu)
  60888135600, #      utc_end 1930-06-20 19:00:00 (Fri)
  60694532569, #  local_start 1924-05-02 00:22:49 (Fri)
  60888153600, #    local_end 1930-06-21 00:00:00 (Sat)
  18000,
  0,
  '+05',
      ],
      [
  60888135600, #    utc_start 1930-06-20 19:00:00 (Fri)
  62490592800, #      utc_end 1981-03-31 18:00:00 (Tue)
  60888157200, #  local_start 1930-06-21 01:00:00 (Sat)
  62490614400, #    local_end 1981-04-01 00:00:00 (Wed)
  21600,
  0,
  '+06',
      ],
      [
  62490592800, #    utc_start 1981-03-31 18:00:00 (Tue)
  62506400400, #      utc_end 1981-09-30 17:00:00 (Wed)
  62490618000, #  local_start 1981-04-01 01:00:00 (Wed)
  62506425600, #    local_end 1981-10-01 00:00:00 (Thu)
  25200,
  1,
  '+07',
      ],
      [
  62506400400, #    utc_start 1981-09-30 17:00:00 (Wed)
  62522128800, #      utc_end 1982-03-31 18:00:00 (Wed)
  62506422000, #  local_start 1981-09-30 23:00:00 (Wed)
  62522150400, #    local_end 1982-04-01 00:00:00 (Thu)
  21600,
  0,
  '+06',
      ],
      [
  62522128800, #    utc_start 1982-03-31 18:00:00 (Wed)
  62537936400, #      utc_end 1982-09-30 17:00:00 (Thu)
  62522154000, #  local_start 1982-04-01 01:00:00 (Thu)
  62537961600, #    local_end 1982-10-01 00:00:00 (Fri)
  25200,
  1,
  '+07',
      ],
      [
  62537936400, #    utc_start 1982-09-30 17:00:00 (Thu)
  62553664800, #      utc_end 1983-03-31 18:00:00 (Thu)
  62537958000, #  local_start 1982-09-30 23:00:00 (Thu)
  62553686400, #    local_end 1983-04-01 00:00:00 (Fri)
  21600,
  0,
  '+06',
      ],
      [
  62553664800, #    utc_start 1983-03-31 18:00:00 (Thu)
  62569472400, #      utc_end 1983-09-30 17:00:00 (Fri)
  62553690000, #  local_start 1983-04-01 01:00:00 (Fri)
  62569497600, #    local_end 1983-10-01 00:00:00 (Sat)
  25200,
  1,
  '+07',
      ],
      [
  62569472400, #    utc_start 1983-09-30 17:00:00 (Fri)
  62585287200, #      utc_end 1984-03-31 18:00:00 (Sat)
  62569494000, #  local_start 1983-09-30 23:00:00 (Fri)
  62585308800, #    local_end 1984-04-01 00:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  62585287200, #    utc_start 1984-03-31 18:00:00 (Sat)
  62601019200, #      utc_end 1984-09-29 20:00:00 (Sat)
  62585312400, #  local_start 1984-04-01 01:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  62601019200, #    utc_start 1984-09-29 20:00:00 (Sat)
  62616744000, #      utc_end 1985-03-30 20:00:00 (Sat)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  62616744000, #    utc_start 1985-03-30 20:00:00 (Sat)
  62632468800, #      utc_end 1985-09-28 20:00:00 (Sat)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  62632468800, #    utc_start 1985-09-28 20:00:00 (Sat)
  62648193600, #      utc_end 1986-03-29 20:00:00 (Sat)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  62648193600, #    utc_start 1986-03-29 20:00:00 (Sat)
  62663918400, #      utc_end 1986-09-27 20:00:00 (Sat)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  62663918400, #    utc_start 1986-09-27 20:00:00 (Sat)
  62679643200, #      utc_end 1987-03-28 20:00:00 (Sat)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  62679643200, #    utc_start 1987-03-28 20:00:00 (Sat)
  62695368000, #      utc_end 1987-09-26 20:00:00 (Sat)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  62695368000, #    utc_start 1987-09-26 20:00:00 (Sat)
  62711092800, #      utc_end 1988-03-26 20:00:00 (Sat)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  62711092800, #    utc_start 1988-03-26 20:00:00 (Sat)
  62726817600, #      utc_end 1988-09-24 20:00:00 (Sat)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  62726817600, #    utc_start 1988-09-24 20:00:00 (Sat)
  62742542400, #      utc_end 1989-03-25 20:00:00 (Sat)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  62742542400, #    utc_start 1989-03-25 20:00:00 (Sat)
  62758267200, #      utc_end 1989-09-23 20:00:00 (Sat)
  62742567600, #  local_start 1989-03-26 03:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  62758267200, #    utc_start 1989-09-23 20:00:00 (Sat)
  62773992000, #      utc_end 1990-03-24 20:00:00 (Sat)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  62773992000, #    utc_start 1990-03-24 20:00:00 (Sat)
  62790321600, #      utc_end 1990-09-29 20:00:00 (Sat)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  62790321600, #    utc_start 1990-09-29 20:00:00 (Sat)
  62806046400, #      utc_end 1991-03-30 20:00:00 (Sat)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  62806046400, #    utc_start 1991-03-30 20:00:00 (Sat)
  62821774800, #      utc_end 1991-09-28 21:00:00 (Sat)
  62806068000, #  local_start 1991-03-31 02:00:00 (Sun)
  62821796400, #    local_end 1991-09-29 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62821774800, #    utc_start 1991-09-28 21:00:00 (Sat)
  62829889200, #      utc_end 1991-12-31 19:00:00 (Tue)
  62821792800, #  local_start 1991-09-29 02:00:00 (Sun)
  62829907200, #    local_end 1992-01-01 00:00:00 (Wed)
  18000,
  0,
  '+05',
      ],
      [
  62829889200, #    utc_start 1991-12-31 19:00:00 (Tue)
  DateTime::TimeZone::INFINITY, #      utc_end
  62829907200, #  local_start 1992-01-01 00:00:00 (Wed)
  DateTime::TimeZone::INFINITY, #    local_end
  18000,
  0,
  '+05',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {11}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_TASHKENT

    $main::fatpacked{"DateTime/TimeZone/Asia/Tbilisi.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_TBILISI';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/asia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Tbilisi;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Tbilisi::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59295531649, #      utc_end 1879-12-31 21:00:49 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59295542400, #    local_end 1880-01-01 00:00:00 (Thu)
  10751,
  0,
  'LMT',
      ],
      [
  59295531649, #    utc_start 1879-12-31 21:00:49 (Wed)
  60694520449, #      utc_end 1924-05-01 21:00:49 (Thu)
  59295542400, #  local_start 1880-01-01 00:00:00 (Thu)
  60694531200, #    local_end 1924-05-02 00:00:00 (Fri)
  10751,
  0,
  'TBMT',
      ],
      [
  60694520449, #    utc_start 1924-05-01 21:00:49 (Thu)
  61730542800, #      utc_end 1957-02-28 21:00:00 (Thu)
  60694531249, #  local_start 1924-05-02 00:00:49 (Fri)
  61730553600, #    local_end 1957-03-01 00:00:00 (Fri)
  10800,
  0,
  '+03',
      ],
      [
  61730542800, #    utc_start 1957-02-28 21:00:00 (Thu)
  62490600000, #      utc_end 1981-03-31 20:00:00 (Tue)
  61730557200, #  local_start 1957-03-01 01:00:00 (Fri)
  62490614400, #    local_end 1981-04-01 00:00:00 (Wed)
  14400,
  0,
  '+04',
      ],
      [
  62490600000, #    utc_start 1981-03-31 20:00:00 (Tue)
  62506407600, #      utc_end 1981-09-30 19:00:00 (Wed)
  62490618000, #  local_start 1981-04-01 01:00:00 (Wed)
  62506425600, #    local_end 1981-10-01 00:00:00 (Thu)
  18000,
  1,
  '+05',
      ],
      [
  62506407600, #    utc_start 1981-09-30 19:00:00 (Wed)
  62522136000, #      utc_end 1982-03-31 20:00:00 (Wed)
  62506422000, #  local_start 1981-09-30 23:00:00 (Wed)
  62522150400, #    local_end 1982-04-01 00:00:00 (Thu)
  14400,
  0,
  '+04',
      ],
      [
  62522136000, #    utc_start 1982-03-31 20:00:00 (Wed)
  62537943600, #      utc_end 1982-09-30 19:00:00 (Thu)
  62522154000, #  local_start 1982-04-01 01:00:00 (Thu)
  62537961600, #    local_end 1982-10-01 00:00:00 (Fri)
  18000,
  1,
  '+05',
      ],
      [
  62537943600, #    utc_start 1982-09-30 19:00:00 (Thu)
  62553672000, #      utc_end 1983-03-31 20:00:00 (Thu)
  62537958000, #  local_start 1982-09-30 23:00:00 (Thu)
  62553686400, #    local_end 1983-04-01 00:00:00 (Fri)
  14400,
  0,
  '+04',
      ],
      [
  62553672000, #    utc_start 1983-03-31 20:00:00 (Thu)
  62569479600, #      utc_end 1983-09-30 19:00:00 (Fri)
  62553690000, #  local_start 1983-04-01 01:00:00 (Fri)
  62569497600, #    local_end 1983-10-01 00:00:00 (Sat)
  18000,
  1,
  '+05',
      ],
      [
  62569479600, #    utc_start 1983-09-30 19:00:00 (Fri)
  62585294400, #      utc_end 1984-03-31 20:00:00 (Sat)
  62569494000, #  local_start 1983-09-30 23:00:00 (Fri)
  62585308800, #    local_end 1984-04-01 00:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62585294400, #    utc_start 1984-03-31 20:00:00 (Sat)
  62601026400, #      utc_end 1984-09-29 22:00:00 (Sat)
  62585312400, #  local_start 1984-04-01 01:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62601026400, #    utc_start 1984-09-29 22:00:00 (Sat)
  62616751200, #      utc_end 1985-03-30 22:00:00 (Sat)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62616751200, #    utc_start 1985-03-30 22:00:00 (Sat)
  62632476000, #      utc_end 1985-09-28 22:00:00 (Sat)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62632476000, #    utc_start 1985-09-28 22:00:00 (Sat)
  62648200800, #      utc_end 1986-03-29 22:00:00 (Sat)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62648200800, #    utc_start 1986-03-29 22:00:00 (Sat)
  62663925600, #      utc_end 1986-09-27 22:00:00 (Sat)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62663925600, #    utc_start 1986-09-27 22:00:00 (Sat)
  62679650400, #      utc_end 1987-03-28 22:00:00 (Sat)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62679650400, #    utc_start 1987-03-28 22:00:00 (Sat)
  62695375200, #      utc_end 1987-09-26 22:00:00 (Sat)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62695375200, #    utc_start 1987-09-26 22:00:00 (Sat)
  62711100000, #      utc_end 1988-03-26 22:00:00 (Sat)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62711100000, #    utc_start 1988-03-26 22:00:00 (Sat)
  62726824800, #      utc_end 1988-09-24 22:00:00 (Sat)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62726824800, #    utc_start 1988-09-24 22:00:00 (Sat)
  62742549600, #      utc_end 1989-03-25 22:00:00 (Sat)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62742549600, #    utc_start 1989-03-25 22:00:00 (Sat)
  62758274400, #      utc_end 1989-09-23 22:00:00 (Sat)
  62742567600, #  local_start 1989-03-26 03:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62758274400, #    utc_start 1989-09-23 22:00:00 (Sat)
  62773999200, #      utc_end 1990-03-24 22:00:00 (Sat)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62773999200, #    utc_start 1990-03-24 22:00:00 (Sat)
  62790328800, #      utc_end 1990-09-29 22:00:00 (Sat)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62790328800, #    utc_start 1990-09-29 22:00:00 (Sat)
  62806053600, #      utc_end 1991-03-30 22:00:00 (Sat)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62806053600, #    utc_start 1991-03-30 22:00:00 (Sat)
  62821782000, #      utc_end 1991-09-28 23:00:00 (Sat)
  62806068000, #  local_start 1991-03-31 02:00:00 (Sun)
  62821796400, #    local_end 1991-09-29 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  62821782000, #    utc_start 1991-09-28 23:00:00 (Sat)
  62829896400, #      utc_end 1991-12-31 21:00:00 (Tue)
  62821792800, #  local_start 1991-09-29 02:00:00 (Sun)
  62829907200, #    local_end 1992-01-01 00:00:00 (Wed)
  10800,
  0,
  '+03',
      ],
      [
  62829896400, #    utc_start 1991-12-31 21:00:00 (Tue)
  62837499600, #      utc_end 1992-03-28 21:00:00 (Sat)
  62829907200, #  local_start 1992-01-01 00:00:00 (Wed)
  62837510400, #    local_end 1992-03-29 00:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  62837499600, #    utc_start 1992-03-28 21:00:00 (Sat)
  62853220800, #      utc_end 1992-09-26 20:00:00 (Sat)
  62837514000, #  local_start 1992-03-29 01:00:00 (Sun)
  62853235200, #    local_end 1992-09-27 00:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  62853220800, #    utc_start 1992-09-26 20:00:00 (Sat)
  62868949200, #      utc_end 1993-03-27 21:00:00 (Sat)
  62853231600, #  local_start 1992-09-26 23:00:00 (Sat)
  62868960000, #    local_end 1993-03-28 00:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  62868949200, #    utc_start 1993-03-27 21:00:00 (Sat)
  62884670400, #      utc_end 1993-09-25 20:00:00 (Sat)
  62868963600, #  local_start 1993-03-28 01:00:00 (Sun)
  62884684800, #    local_end 1993-09-26 00:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  62884670400, #    utc_start 1993-09-25 20:00:00 (Sat)
  62900398800, #      utc_end 1994-03-26 21:00:00 (Sat)
  62884681200, #  local_start 1993-09-25 23:00:00 (Sat)
  62900409600, #    local_end 1994-03-27 00:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  62900398800, #    utc_start 1994-03-26 21:00:00 (Sat)
  62916120000, #      utc_end 1994-09-24 20:00:00 (Sat)
  62900413200, #  local_start 1994-03-27 01:00:00 (Sun)
  62916134400, #    local_end 1994-09-25 00:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  62916120000, #    utc_start 1994-09-24 20:00:00 (Sat)
  62931844800, #      utc_end 1995-03-25 20:00:00 (Sat)
  62916134400, #  local_start 1994-09-25 00:00:00 (Sun)
  62931859200, #    local_end 1995-03-26 00:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62931844800, #    utc_start 1995-03-25 20:00:00 (Sat)
  62947566000, #      utc_end 1995-09-23 19:00:00 (Sat)
  62931862800, #  local_start 1995-03-26 01:00:00 (Sun)
  62947584000, #    local_end 1995-09-24 00:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62947566000, #    utc_start 1995-09-23 19:00:00 (Sat)
  62963899200, #      utc_end 1996-03-30 20:00:00 (Sat)
  62947580400, #  local_start 1995-09-23 23:00:00 (Sat)
  62963913600, #    local_end 1996-03-31 00:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62963899200, #    utc_start 1996-03-30 20:00:00 (Sat)
  62982039600, #      utc_end 1996-10-26 19:00:00 (Sat)
  62963917200, #  local_start 1996-03-31 01:00:00 (Sun)
  62982057600, #    local_end 1996-10-27 00:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62982039600, #    utc_start 1996-10-26 19:00:00 (Sat)
  62995345200, #      utc_end 1997-03-29 19:00:00 (Sat)
  62982057600, #  local_start 1996-10-27 00:00:00 (Sun)
  62995363200, #    local_end 1997-03-30 00:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62995345200, #    utc_start 1997-03-29 19:00:00 (Sat)
  63013489200, #      utc_end 1997-10-25 19:00:00 (Sat)
  62995363200, #  local_start 1997-03-30 00:00:00 (Sun)
  63013507200, #    local_end 1997-10-26 00:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63013489200, #    utc_start 1997-10-25 19:00:00 (Sat)
  63026798400, #      utc_end 1998-03-28 20:00:00 (Sat)
  63013503600, #  local_start 1997-10-25 23:00:00 (Sat)
  63026812800, #    local_end 1998-03-29 00:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63026798400, #    utc_start 1998-03-28 20:00:00 (Sat)
  63044938800, #      utc_end 1998-10-24 19:00:00 (Sat)
  63026816400, #  local_start 1998-03-29 01:00:00 (Sun)
  63044956800, #    local_end 1998-10-25 00:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63044938800, #    utc_start 1998-10-24 19:00:00 (Sat)
  63058248000, #      utc_end 1999-03-27 20:00:00 (Sat)
  63044953200, #  local_start 1998-10-24 23:00:00 (Sat)
  63058262400, #    local_end 1999-03-28 00:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63058248000, #    utc_start 1999-03-27 20:00:00 (Sat)
  63076993200, #      utc_end 1999-10-30 19:00:00 (Sat)
  63058266000, #  local_start 1999-03-28 01:00:00 (Sun)
  63077011200, #    local_end 1999-10-31 00:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63076993200, #    utc_start 1999-10-30 19:00:00 (Sat)
  63089697600, #      utc_end 2000-03-25 20:00:00 (Sat)
  63077007600, #  local_start 1999-10-30 23:00:00 (Sat)
  63089712000, #    local_end 2000-03-26 00:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63089697600, #    utc_start 2000-03-25 20:00:00 (Sat)
  63108442800, #      utc_end 2000-10-28 19:00:00 (Sat)
  63089715600, #  local_start 2000-03-26 01:00:00 (Sun)
  63108460800, #    local_end 2000-10-29 00:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63108442800, #    utc_start 2000-10-28 19:00:00 (Sat)
  63121147200, #      utc_end 2001-03-24 20:00:00 (Sat)
  63108457200, #  local_start 2000-10-28 23:00:00 (Sat)
  63121161600, #    local_end 2001-03-25 00:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63121147200, #    utc_start 2001-03-24 20:00:00 (Sat)
  63139892400, #      utc_end 2001-10-27 19:00:00 (Sat)
  63121165200, #  local_start 2001-03-25 01:00:00 (Sun)
  63139910400, #    local_end 2001-10-28 00:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63139892400, #    utc_start 2001-10-27 19:00:00 (Sat)
  63153201600, #      utc_end 2002-03-30 20:00:00 (Sat)
  63139906800, #  local_start 2001-10-27 23:00:00 (Sat)
  63153216000, #    local_end 2002-03-31 00:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63153201600, #    utc_start 2002-03-30 20:00:00 (Sat)
  63171342000, #      utc_end 2002-10-26 19:00:00 (Sat)
  63153219600, #  local_start 2002-03-31 01:00:00 (Sun)
  63171360000, #    local_end 2002-10-27 00:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63171342000, #    utc_start 2002-10-26 19:00:00 (Sat)
  63184651200, #      utc_end 2003-03-29 20:00:00 (Sat)
  63171356400, #  local_start 2002-10-26 23:00:00 (Sat)
  63184665600, #    local_end 2003-03-30 00:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63184651200, #    utc_start 2003-03-29 20:00:00 (Sat)
  63202791600, #      utc_end 2003-10-25 19:00:00 (Sat)
  63184669200, #  local_start 2003-03-30 01:00:00 (Sun)
  63202809600, #    local_end 2003-10-26 00:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63202791600, #    utc_start 2003-10-25 19:00:00 (Sat)
  63216100800, #      utc_end 2004-03-27 20:00:00 (Sat)
  63202806000, #  local_start 2003-10-25 23:00:00 (Sat)
  63216115200, #    local_end 2004-03-28 00:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63216100800, #    utc_start 2004-03-27 20:00:00 (Sat)
  63223959600, #      utc_end 2004-06-26 19:00:00 (Sat)
  63216118800, #  local_start 2004-03-28 01:00:00 (Sun)
  63223977600, #    local_end 2004-06-27 00:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63223959600, #    utc_start 2004-06-26 19:00:00 (Sat)
  63234860400, #      utc_end 2004-10-30 23:00:00 (Sat)
  63223974000, #  local_start 2004-06-26 23:00:00 (Sat)
  63234874800, #    local_end 2004-10-31 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63234860400, #    utc_start 2004-10-30 23:00:00 (Sat)
  63247561200, #      utc_end 2005-03-26 23:00:00 (Sat)
  63234871200, #  local_start 2004-10-31 02:00:00 (Sun)
  63247572000, #    local_end 2005-03-27 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63247561200, #    utc_start 2005-03-26 23:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  63247575600, #  local_start 2005-03-27 03:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  14400,
  0,
  '+04',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {26}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_TBILISI

    $main::fatpacked{"DateTime/TimeZone/Asia/Tehran.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_TEHRAN';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/asia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Tehran;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Tehran::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60431517256, #      utc_end 1915-12-31 20:34:16 (Fri)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60431529600, #    local_end 1916-01-01 00:00:00 (Sat)
  12344,
  0,
  'LMT',
      ],
      [
  60431517256, #    utc_start 1915-12-31 20:34:16 (Fri)
  61378288456, #      utc_end 1945-12-31 20:34:16 (Mon)
  60431529600, #  local_start 1916-01-01 00:00:00 (Sat)
  61378300800, #    local_end 1946-01-01 00:00:00 (Tue)
  12344,
  0,
  'TMT',
      ],
      [
  61378288456, #    utc_start 1945-12-31 20:34:16 (Mon)
  62382861000, #      utc_end 1977-10-31 20:30:00 (Mon)
  61378301056, #  local_start 1946-01-01 00:04:16 (Tue)
  62382873600, #    local_end 1977-11-01 00:00:00 (Tue)
  12600,
  0,
  '+0330',
      ],
      [
  62382861000, #    utc_start 1977-10-31 20:30:00 (Mon)
  62394955200, #      utc_end 1978-03-20 20:00:00 (Mon)
  62382875400, #  local_start 1977-11-01 00:30:00 (Tue)
  62394969600, #    local_end 1978-03-21 00:00:00 (Tue)
  14400,
  0,
  '+04',
      ],
      [
  62394955200, #    utc_start 1978-03-20 20:00:00 (Mon)
  62413441200, #      utc_end 1978-10-20 19:00:00 (Fri)
  62394973200, #  local_start 1978-03-21 01:00:00 (Tue)
  62413459200, #    local_end 1978-10-21 00:00:00 (Sat)
  18000,
  1,
  '+05',
      ],
      [
  62413441200, #    utc_start 1978-10-20 19:00:00 (Fri)
  62419665600, #      utc_end 1978-12-31 20:00:00 (Sun)
  62413455600, #  local_start 1978-10-20 23:00:00 (Fri)
  62419680000, #    local_end 1979-01-01 00:00:00 (Mon)
  14400,
  0,
  '+04',
      ],
      [
  62419665600, #    utc_start 1978-12-31 20:00:00 (Sun)
  62426493000, #      utc_end 1979-03-20 20:30:00 (Tue)
  62419678200, #  local_start 1978-12-31 23:30:00 (Sun)
  62426505600, #    local_end 1979-03-21 00:00:00 (Wed)
  12600,
  0,
  '+0330',
      ],
      [
  62426493000, #    utc_start 1979-03-20 20:30:00 (Tue)
  62442214200, #      utc_end 1979-09-18 19:30:00 (Tue)
  62426509200, #  local_start 1979-03-21 01:00:00 (Wed)
  62442230400, #    local_end 1979-09-19 00:00:00 (Wed)
  16200,
  1,
  '+0430',
      ],
      [
  62442214200, #    utc_start 1979-09-18 19:30:00 (Tue)
  62458115400, #      utc_end 1980-03-20 20:30:00 (Thu)
  62442226800, #  local_start 1979-09-18 23:00:00 (Tue)
  62458128000, #    local_end 1980-03-21 00:00:00 (Fri)
  12600,
  0,
  '+0330',
      ],
      [
  62458115400, #    utc_start 1980-03-20 20:30:00 (Thu)
  62474182200, #      utc_end 1980-09-22 19:30:00 (Mon)
  62458131600, #  local_start 1980-03-21 01:00:00 (Fri)
  62474198400, #    local_end 1980-09-23 00:00:00 (Tue)
  16200,
  1,
  '+0430',
      ],
      [
  62474182200, #    utc_start 1980-09-22 19:30:00 (Mon)
  62808899400, #      utc_end 1991-05-02 20:30:00 (Thu)
  62474194800, #  local_start 1980-09-22 23:00:00 (Mon)
  62808912000, #    local_end 1991-05-03 00:00:00 (Fri)
  12600,
  0,
  '+0330',
      ],
      [
  62808899400, #    utc_start 1991-05-02 20:30:00 (Thu)
  62821164600, #      utc_end 1991-09-21 19:30:00 (Sat)
  62808915600, #  local_start 1991-05-03 01:00:00 (Fri)
  62821180800, #    local_end 1991-09-22 00:00:00 (Sun)
  16200,
  1,
  '+0430',
      ],
      [
  62821164600, #    utc_start 1991-09-21 19:30:00 (Sat)
  62836893000, #      utc_end 1992-03-21 20:30:00 (Sat)
  62821177200, #  local_start 1991-09-21 23:00:00 (Sat)
  62836905600, #    local_end 1992-03-22 00:00:00 (Sun)
  12600,
  0,
  '+0330',
      ],
      [
  62836893000, #    utc_start 1992-03-21 20:30:00 (Sat)
  62852787000, #      utc_end 1992-09-21 19:30:00 (Mon)
  62836909200, #  local_start 1992-03-22 01:00:00 (Sun)
  62852803200, #    local_end 1992-09-22 00:00:00 (Tue)
  16200,
  1,
  '+0430',
      ],
      [
  62852787000, #    utc_start 1992-09-21 19:30:00 (Mon)
  62868429000, #      utc_end 1993-03-21 20:30:00 (Sun)
  62852799600, #  local_start 1992-09-21 23:00:00 (Mon)
  62868441600, #    local_end 1993-03-22 00:00:00 (Mon)
  12600,
  0,
  '+0330',
      ],
      [
  62868429000, #    utc_start 1993-03-21 20:30:00 (Sun)
  62884323000, #      utc_end 1993-09-21 19:30:00 (Tue)
  62868445200, #  local_start 1993-03-22 01:00:00 (Mon)
  62884339200, #    local_end 1993-09-22 00:00:00 (Wed)
  16200,
  1,
  '+0430',
      ],
      [
  62884323000, #    utc_start 1993-09-21 19:30:00 (Tue)
  62899965000, #      utc_end 1994-03-21 20:30:00 (Mon)
  62884335600, #  local_start 1993-09-21 23:00:00 (Tue)
  62899977600, #    local_end 1994-03-22 00:00:00 (Tue)
  12600,
  0,
  '+0330',
      ],
      [
  62899965000, #    utc_start 1994-03-21 20:30:00 (Mon)
  62915859000, #      utc_end 1994-09-21 19:30:00 (Wed)
  62899981200, #  local_start 1994-03-22 01:00:00 (Tue)
  62915875200, #    local_end 1994-09-22 00:00:00 (Thu)
  16200,
  1,
  '+0430',
      ],
      [
  62915859000, #    utc_start 1994-09-21 19:30:00 (Wed)
  62931501000, #      utc_end 1995-03-21 20:30:00 (Tue)
  62915871600, #  local_start 1994-09-21 23:00:00 (Wed)
  62931513600, #    local_end 1995-03-22 00:00:00 (Wed)
  12600,
  0,
  '+0330',
      ],
      [
  62931501000, #    utc_start 1995-03-21 20:30:00 (Tue)
  62947395000, #      utc_end 1995-09-21 19:30:00 (Thu)
  62931517200, #  local_start 1995-03-22 01:00:00 (Wed)
  62947411200, #    local_end 1995-09-22 00:00:00 (Fri)
  16200,
  1,
  '+0430',
      ],
      [
  62947395000, #    utc_start 1995-09-21 19:30:00 (Thu)
  62963037000, #      utc_end 1996-03-20 20:30:00 (Wed)
  62947407600, #  local_start 1995-09-21 23:00:00 (Thu)
  62963049600, #    local_end 1996-03-21 00:00:00 (Thu)
  12600,
  0,
  '+0330',
      ],
      [
  62963037000, #    utc_start 1996-03-20 20:30:00 (Wed)
  62978931000, #      utc_end 1996-09-20 19:30:00 (Fri)
  62963053200, #  local_start 1996-03-21 01:00:00 (Thu)
  62978947200, #    local_end 1996-09-21 00:00:00 (Sat)
  16200,
  1,
  '+0430',
      ],
      [
  62978931000, #    utc_start 1996-09-20 19:30:00 (Fri)
  62994659400, #      utc_end 1997-03-21 20:30:00 (Fri)
  62978943600, #  local_start 1996-09-20 23:00:00 (Fri)
  62994672000, #    local_end 1997-03-22 00:00:00 (Sat)
  12600,
  0,
  '+0330',
      ],
      [
  62994659400, #    utc_start 1997-03-21 20:30:00 (Fri)
  63010553400, #      utc_end 1997-09-21 19:30:00 (Sun)
  62994675600, #  local_start 1997-03-22 01:00:00 (Sat)
  63010569600, #    local_end 1997-09-22 00:00:00 (Mon)
  16200,
  1,
  '+0430',
      ],
      [
  63010553400, #    utc_start 1997-09-21 19:30:00 (Sun)
  63026195400, #      utc_end 1998-03-21 20:30:00 (Sat)
  63010566000, #  local_start 1997-09-21 23:00:00 (Sun)
  63026208000, #    local_end 1998-03-22 00:00:00 (Sun)
  12600,
  0,
  '+0330',
      ],
      [
  63026195400, #    utc_start 1998-03-21 20:30:00 (Sat)
  63042089400, #      utc_end 1998-09-21 19:30:00 (Mon)
  63026211600, #  local_start 1998-03-22 01:00:00 (Sun)
  63042105600, #    local_end 1998-09-22 00:00:00 (Tue)
  16200,
  1,
  '+0430',
      ],
      [
  63042089400, #    utc_start 1998-09-21 19:30:00 (Mon)
  63057731400, #      utc_end 1999-03-21 20:30:00 (Sun)
  63042102000, #  local_start 1998-09-21 23:00:00 (Mon)
  63057744000, #    local_end 1999-03-22 00:00:00 (Mon)
  12600,
  0,
  '+0330',
      ],
      [
  63057731400, #    utc_start 1999-03-21 20:30:00 (Sun)
  63073625400, #      utc_end 1999-09-21 19:30:00 (Tue)
  63057747600, #  local_start 1999-03-22 01:00:00 (Mon)
  63073641600, #    local_end 1999-09-22 00:00:00 (Wed)
  16200,
  1,
  '+0430',
      ],
      [
  63073625400, #    utc_start 1999-09-21 19:30:00 (Tue)
  63089267400, #      utc_end 2000-03-20 20:30:00 (Mon)
  63073638000, #  local_start 1999-09-21 23:00:00 (Tue)
  63089280000, #    local_end 2000-03-21 00:00:00 (Tue)
  12600,
  0,
  '+0330',
      ],
      [
  63089267400, #    utc_start 2000-03-20 20:30:00 (Mon)
  63105161400, #      utc_end 2000-09-20 19:30:00 (Wed)
  63089283600, #  local_start 2000-03-21 01:00:00 (Tue)
  63105177600, #    local_end 2000-09-21 00:00:00 (Thu)
  16200,
  1,
  '+0430',
      ],
      [
  63105161400, #    utc_start 2000-09-20 19:30:00 (Wed)
  63120889800, #      utc_end 2001-03-21 20:30:00 (Wed)
  63105174000, #  local_start 2000-09-20 23:00:00 (Wed)
  63120902400, #    local_end 2001-03-22 00:00:00 (Thu)
  12600,
  0,
  '+0330',
      ],
      [
  63120889800, #    utc_start 2001-03-21 20:30:00 (Wed)
  63136783800, #      utc_end 2001-09-21 19:30:00 (Fri)
  63120906000, #  local_start 2001-03-22 01:00:00 (Thu)
  63136800000, #    local_end 2001-09-22 00:00:00 (Sat)
  16200,
  1,
  '+0430',
      ],
      [
  63136783800, #    utc_start 2001-09-21 19:30:00 (Fri)
  63152425800, #      utc_end 2002-03-21 20:30:00 (Thu)
  63136796400, #  local_start 2001-09-21 23:00:00 (Fri)
  63152438400, #    local_end 2002-03-22 00:00:00 (Fri)
  12600,
  0,
  '+0330',
      ],
      [
  63152425800, #    utc_start 2002-03-21 20:30:00 (Thu)
  63168319800, #      utc_end 2002-09-21 19:30:00 (Sat)
  63152442000, #  local_start 2002-03-22 01:00:00 (Fri)
  63168336000, #    local_end 2002-09-22 00:00:00 (Sun)
  16200,
  1,
  '+0430',
      ],
      [
  63168319800, #    utc_start 2002-09-21 19:30:00 (Sat)
  63183961800, #      utc_end 2003-03-21 20:30:00 (Fri)
  63168332400, #  local_start 2002-09-21 23:00:00 (Sat)
  63183974400, #    local_end 2003-03-22 00:00:00 (Sat)
  12600,
  0,
  '+0330',
      ],
      [
  63183961800, #    utc_start 2003-03-21 20:30:00 (Fri)
  63199855800, #      utc_end 2003-09-21 19:30:00 (Sun)
  63183978000, #  local_start 2003-03-22 01:00:00 (Sat)
  63199872000, #    local_end 2003-09-22 00:00:00 (Mon)
  16200,
  1,
  '+0430',
      ],
      [
  63199855800, #    utc_start 2003-09-21 19:30:00 (Sun)
  63215497800, #      utc_end 2004-03-20 20:30:00 (Sat)
  63199868400, #  local_start 2003-09-21 23:00:00 (Sun)
  63215510400, #    local_end 2004-03-21 00:00:00 (Sun)
  12600,
  0,
  '+0330',
      ],
      [
  63215497800, #    utc_start 2004-03-20 20:30:00 (Sat)
  63231391800, #      utc_end 2004-09-20 19:30:00 (Mon)
  63215514000, #  local_start 2004-03-21 01:00:00 (Sun)
  63231408000, #    local_end 2004-09-21 00:00:00 (Tue)
  16200,
  1,
  '+0430',
      ],
      [
  63231391800, #    utc_start 2004-09-20 19:30:00 (Mon)
  63247120200, #      utc_end 2005-03-21 20:30:00 (Mon)
  63231404400, #  local_start 2004-09-20 23:00:00 (Mon)
  63247132800, #    local_end 2005-03-22 00:00:00 (Tue)
  12600,
  0,
  '+0330',
      ],
      [
  63247120200, #    utc_start 2005-03-21 20:30:00 (Mon)
  63263014200, #      utc_end 2005-09-21 19:30:00 (Wed)
  63247136400, #  local_start 2005-03-22 01:00:00 (Tue)
  63263030400, #    local_end 2005-09-22 00:00:00 (Thu)
  16200,
  1,
  '+0430',
      ],
      [
  63263014200, #    utc_start 2005-09-21 19:30:00 (Wed)
  63341728200, #      utc_end 2008-03-20 20:30:00 (Thu)
  63263026800, #  local_start 2005-09-21 23:00:00 (Wed)
  63341740800, #    local_end 2008-03-21 00:00:00 (Fri)
  12600,
  0,
  '+0330',
      ],
      [
  63341728200, #    utc_start 2008-03-20 20:30:00 (Thu)
  63357622200, #      utc_end 2008-09-20 19:30:00 (Sat)
  63341744400, #  local_start 2008-03-21 01:00:00 (Fri)
  63357638400, #    local_end 2008-09-21 00:00:00 (Sun)
  16200,
  1,
  '+0430',
      ],
      [
  63357622200, #    utc_start 2008-09-20 19:30:00 (Sat)
  63373350600, #      utc_end 2009-03-21 20:30:00 (Sat)
  63357634800, #  local_start 2008-09-20 23:00:00 (Sat)
  63373363200, #    local_end 2009-03-22 00:00:00 (Sun)
  12600,
  0,
  '+0330',
      ],
      [
  63373350600, #    utc_start 2009-03-21 20:30:00 (Sat)
  63389244600, #      utc_end 2009-09-21 19:30:00 (Mon)
  63373366800, #  local_start 2009-03-22 01:00:00 (Sun)
  63389260800, #    local_end 2009-09-22 00:00:00 (Tue)
  16200,
  1,
  '+0430',
      ],
      [
  63389244600, #    utc_start 2009-09-21 19:30:00 (Mon)
  63404886600, #      utc_end 2010-03-21 20:30:00 (Sun)
  63389257200, #  local_start 2009-09-21 23:00:00 (Mon)
  63404899200, #    local_end 2010-03-22 00:00:00 (Mon)
  12600,
  0,
  '+0330',
      ],
      [
  63404886600, #    utc_start 2010-03-21 20:30:00 (Sun)
  63420780600, #      utc_end 2010-09-21 19:30:00 (Tue)
  63404902800, #  local_start 2010-03-22 01:00:00 (Mon)
  63420796800, #    local_end 2010-09-22 00:00:00 (Wed)
  16200,
  1,
  '+0430',
      ],
      [
  63420780600, #    utc_start 2010-09-21 19:30:00 (Tue)
  63436422600, #      utc_end 2011-03-21 20:30:00 (Mon)
  63420793200, #  local_start 2010-09-21 23:00:00 (Tue)
  63436435200, #    local_end 2011-03-22 00:00:00 (Tue)
  12600,
  0,
  '+0330',
      ],
      [
  63436422600, #    utc_start 2011-03-21 20:30:00 (Mon)
  63452316600, #      utc_end 2011-09-21 19:30:00 (Wed)
  63436438800, #  local_start 2011-03-22 01:00:00 (Tue)
  63452332800, #    local_end 2011-09-22 00:00:00 (Thu)
  16200,
  1,
  '+0430',
      ],
      [
  63452316600, #    utc_start 2011-09-21 19:30:00 (Wed)
  63467958600, #      utc_end 2012-03-20 20:30:00 (Tue)
  63452329200, #  local_start 2011-09-21 23:00:00 (Wed)
  63467971200, #    local_end 2012-03-21 00:00:00 (Wed)
  12600,
  0,
  '+0330',
      ],
      [
  63467958600, #    utc_start 2012-03-20 20:30:00 (Tue)
  63483852600, #      utc_end 2012-09-20 19:30:00 (Thu)
  63467974800, #  local_start 2012-03-21 01:00:00 (Wed)
  63483868800, #    local_end 2012-09-21 00:00:00 (Fri)
  16200,
  1,
  '+0430',
      ],
      [
  63483852600, #    utc_start 2012-09-20 19:30:00 (Thu)
  63499581000, #      utc_end 2013-03-21 20:30:00 (Thu)
  63483865200, #  local_start 2012-09-20 23:00:00 (Thu)
  63499593600, #    local_end 2013-03-22 00:00:00 (Fri)
  12600,
  0,
  '+0330',
      ],
      [
  63499581000, #    utc_start 2013-03-21 20:30:00 (Thu)
  63515475000, #      utc_end 2013-09-21 19:30:00 (Sat)
  63499597200, #  local_start 2013-03-22 01:00:00 (Fri)
  63515491200, #    local_end 2013-09-22 00:00:00 (Sun)
  16200,
  1,
  '+0430',
      ],
      [
  63515475000, #    utc_start 2013-09-21 19:30:00 (Sat)
  63531117000, #      utc_end 2014-03-21 20:30:00 (Fri)
  63515487600, #  local_start 2013-09-21 23:00:00 (Sat)
  63531129600, #    local_end 2014-03-22 00:00:00 (Sat)
  12600,
  0,
  '+0330',
      ],
      [
  63531117000, #    utc_start 2014-03-21 20:30:00 (Fri)
  63547011000, #      utc_end 2014-09-21 19:30:00 (Sun)
  63531133200, #  local_start 2014-03-22 01:00:00 (Sat)
  63547027200, #    local_end 2014-09-22 00:00:00 (Mon)
  16200,
  1,
  '+0430',
      ],
      [
  63547011000, #    utc_start 2014-09-21 19:30:00 (Sun)
  63562653000, #      utc_end 2015-03-21 20:30:00 (Sat)
  63547023600, #  local_start 2014-09-21 23:00:00 (Sun)
  63562665600, #    local_end 2015-03-22 00:00:00 (Sun)
  12600,
  0,
  '+0330',
      ],
      [
  63562653000, #    utc_start 2015-03-21 20:30:00 (Sat)
  63578547000, #      utc_end 2015-09-21 19:30:00 (Mon)
  63562669200, #  local_start 2015-03-22 01:00:00 (Sun)
  63578563200, #    local_end 2015-09-22 00:00:00 (Tue)
  16200,
  1,
  '+0430',
      ],
      [
  63578547000, #    utc_start 2015-09-21 19:30:00 (Mon)
  63594189000, #      utc_end 2016-03-20 20:30:00 (Sun)
  63578559600, #  local_start 2015-09-21 23:00:00 (Mon)
  63594201600, #    local_end 2016-03-21 00:00:00 (Mon)
  12600,
  0,
  '+0330',
      ],
      [
  63594189000, #    utc_start 2016-03-20 20:30:00 (Sun)
  63610083000, #      utc_end 2016-09-20 19:30:00 (Tue)
  63594205200, #  local_start 2016-03-21 01:00:00 (Mon)
  63610099200, #    local_end 2016-09-21 00:00:00 (Wed)
  16200,
  1,
  '+0430',
      ],
      [
  63610083000, #    utc_start 2016-09-20 19:30:00 (Tue)
  63625811400, #      utc_end 2017-03-21 20:30:00 (Tue)
  63610095600, #  local_start 2016-09-20 23:00:00 (Tue)
  63625824000, #    local_end 2017-03-22 00:00:00 (Wed)
  12600,
  0,
  '+0330',
      ],
      [
  63625811400, #    utc_start 2017-03-21 20:30:00 (Tue)
  63641705400, #      utc_end 2017-09-21 19:30:00 (Thu)
  63625827600, #  local_start 2017-03-22 01:00:00 (Wed)
  63641721600, #    local_end 2017-09-22 00:00:00 (Fri)
  16200,
  1,
  '+0430',
      ],
      [
  63641705400, #    utc_start 2017-09-21 19:30:00 (Thu)
  63657347400, #      utc_end 2018-03-21 20:30:00 (Wed)
  63641718000, #  local_start 2017-09-21 23:00:00 (Thu)
  63657360000, #    local_end 2018-03-22 00:00:00 (Thu)
  12600,
  0,
  '+0330',
      ],
      [
  63657347400, #    utc_start 2018-03-21 20:30:00 (Wed)
  63673241400, #      utc_end 2018-09-21 19:30:00 (Fri)
  63657363600, #  local_start 2018-03-22 01:00:00 (Thu)
  63673257600, #    local_end 2018-09-22 00:00:00 (Sat)
  16200,
  1,
  '+0430',
      ],
      [
  63673241400, #    utc_start 2018-09-21 19:30:00 (Fri)
  63688883400, #      utc_end 2019-03-21 20:30:00 (Thu)
  63673254000, #  local_start 2018-09-21 23:00:00 (Fri)
  63688896000, #    local_end 2019-03-22 00:00:00 (Fri)
  12600,
  0,
  '+0330',
      ],
      [
  63688883400, #    utc_start 2019-03-21 20:30:00 (Thu)
  63704777400, #      utc_end 2019-09-21 19:30:00 (Sat)
  63688899600, #  local_start 2019-03-22 01:00:00 (Fri)
  63704793600, #    local_end 2019-09-22 00:00:00 (Sun)
  16200,
  1,
  '+0430',
      ],
      [
  63704777400, #    utc_start 2019-09-21 19:30:00 (Sat)
  63720419400, #      utc_end 2020-03-20 20:30:00 (Fri)
  63704790000, #  local_start 2019-09-21 23:00:00 (Sat)
  63720432000, #    local_end 2020-03-21 00:00:00 (Sat)
  12600,
  0,
  '+0330',
      ],
      [
  63720419400, #    utc_start 2020-03-20 20:30:00 (Fri)
  63736313400, #      utc_end 2020-09-20 19:30:00 (Sun)
  63720435600, #  local_start 2020-03-21 01:00:00 (Sat)
  63736329600, #    local_end 2020-09-21 00:00:00 (Mon)
  16200,
  1,
  '+0430',
      ],
      [
  63736313400, #    utc_start 2020-09-20 19:30:00 (Sun)
  63752041800, #      utc_end 2021-03-21 20:30:00 (Sun)
  63736326000, #  local_start 2020-09-20 23:00:00 (Sun)
  63752054400, #    local_end 2021-03-22 00:00:00 (Mon)
  12600,
  0,
  '+0330',
      ],
      [
  63752041800, #    utc_start 2021-03-21 20:30:00 (Sun)
  63767935800, #      utc_end 2021-09-21 19:30:00 (Tue)
  63752058000, #  local_start 2021-03-22 01:00:00 (Mon)
  63767952000, #    local_end 2021-09-22 00:00:00 (Wed)
  16200,
  1,
  '+0430',
      ],
      [
  63767935800, #    utc_start 2021-09-21 19:30:00 (Tue)
  63783577800, #      utc_end 2022-03-21 20:30:00 (Mon)
  63767948400, #  local_start 2021-09-21 23:00:00 (Tue)
  63783590400, #    local_end 2022-03-22 00:00:00 (Tue)
  12600,
  0,
  '+0330',
      ],
      [
  63783577800, #    utc_start 2022-03-21 20:30:00 (Mon)
  63799471800, #      utc_end 2022-09-21 19:30:00 (Wed)
  63783594000, #  local_start 2022-03-22 01:00:00 (Tue)
  63799488000, #    local_end 2022-09-22 00:00:00 (Thu)
  16200,
  1,
  '+0430',
      ],
      [
  63799471800, #    utc_start 2022-09-21 19:30:00 (Wed)
  63815113800, #      utc_end 2023-03-21 20:30:00 (Tue)
  63799484400, #  local_start 2022-09-21 23:00:00 (Wed)
  63815126400, #    local_end 2023-03-22 00:00:00 (Wed)
  12600,
  0,
  '+0330',
      ],
      [
  63815113800, #    utc_start 2023-03-21 20:30:00 (Tue)
  63831007800, #      utc_end 2023-09-21 19:30:00 (Thu)
  63815130000, #  local_start 2023-03-22 01:00:00 (Wed)
  63831024000, #    local_end 2023-09-22 00:00:00 (Fri)
  16200,
  1,
  '+0430',
      ],
      [
  63831007800, #    utc_start 2023-09-21 19:30:00 (Thu)
  63846649800, #      utc_end 2024-03-20 20:30:00 (Wed)
  63831020400, #  local_start 2023-09-21 23:00:00 (Thu)
  63846662400, #    local_end 2024-03-21 00:00:00 (Thu)
  12600,
  0,
  '+0330',
      ],
      [
  63846649800, #    utc_start 2024-03-20 20:30:00 (Wed)
  63862543800, #      utc_end 2024-09-20 19:30:00 (Fri)
  63846666000, #  local_start 2024-03-21 01:00:00 (Thu)
  63862560000, #    local_end 2024-09-21 00:00:00 (Sat)
  16200,
  1,
  '+0430',
      ],
      [
  63862543800, #    utc_start 2024-09-20 19:30:00 (Fri)
  63878272200, #      utc_end 2025-03-21 20:30:00 (Fri)
  63862556400, #  local_start 2024-09-20 23:00:00 (Fri)
  63878284800, #    local_end 2025-03-22 00:00:00 (Sat)
  12600,
  0,
  '+0330',
      ],
      [
  63878272200, #    utc_start 2025-03-21 20:30:00 (Fri)
  63894166200, #      utc_end 2025-09-21 19:30:00 (Sun)
  63878288400, #  local_start 2025-03-22 01:00:00 (Sat)
  63894182400, #    local_end 2025-09-22 00:00:00 (Mon)
  16200,
  1,
  '+0430',
      ],
      [
  63894166200, #    utc_start 2025-09-21 19:30:00 (Sun)
  63909808200, #      utc_end 2026-03-21 20:30:00 (Sat)
  63894178800, #  local_start 2025-09-21 23:00:00 (Sun)
  63909820800, #    local_end 2026-03-22 00:00:00 (Sun)
  12600,
  0,
  '+0330',
      ],
      [
  63909808200, #    utc_start 2026-03-21 20:30:00 (Sat)
  63925702200, #      utc_end 2026-09-21 19:30:00 (Mon)
  63909824400, #  local_start 2026-03-22 01:00:00 (Sun)
  63925718400, #    local_end 2026-09-22 00:00:00 (Tue)
  16200,
  1,
  '+0430',
      ],
      [
  63925702200, #    utc_start 2026-09-21 19:30:00 (Mon)
  63941344200, #      utc_end 2027-03-21 20:30:00 (Sun)
  63925714800, #  local_start 2026-09-21 23:00:00 (Mon)
  63941356800, #    local_end 2027-03-22 00:00:00 (Mon)
  12600,
  0,
  '+0330',
      ],
      [
  63941344200, #    utc_start 2027-03-21 20:30:00 (Sun)
  63957238200, #      utc_end 2027-09-21 19:30:00 (Tue)
  63941360400, #  local_start 2027-03-22 01:00:00 (Mon)
  63957254400, #    local_end 2027-09-22 00:00:00 (Wed)
  16200,
  1,
  '+0430',
      ],
      [
  63957238200, #    utc_start 2027-09-21 19:30:00 (Tue)
  63972880200, #      utc_end 2028-03-20 20:30:00 (Mon)
  63957250800, #  local_start 2027-09-21 23:00:00 (Tue)
  63972892800, #    local_end 2028-03-21 00:00:00 (Tue)
  12600,
  0,
  '+0330',
      ],
      [
  63972880200, #    utc_start 2028-03-20 20:30:00 (Mon)
  63988774200, #      utc_end 2028-09-20 19:30:00 (Wed)
  63972896400, #  local_start 2028-03-21 01:00:00 (Tue)
  63988790400, #    local_end 2028-09-21 00:00:00 (Thu)
  16200,
  1,
  '+0430',
      ],
      [
  63988774200, #    utc_start 2028-09-20 19:30:00 (Wed)
  64004416200, #      utc_end 2029-03-20 20:30:00 (Tue)
  63988786800, #  local_start 2028-09-20 23:00:00 (Wed)
  64004428800, #    local_end 2029-03-21 00:00:00 (Wed)
  12600,
  0,
  '+0330',
      ],
      [
  64004416200, #    utc_start 2029-03-20 20:30:00 (Tue)
  64020310200, #      utc_end 2029-09-20 19:30:00 (Thu)
  64004432400, #  local_start 2029-03-21 01:00:00 (Wed)
  64020326400, #    local_end 2029-09-21 00:00:00 (Fri)
  16200,
  1,
  '+0430',
      ],
      [
  64020310200, #    utc_start 2029-09-20 19:30:00 (Thu)
  64036038600, #      utc_end 2030-03-21 20:30:00 (Thu)
  64020322800, #  local_start 2029-09-20 23:00:00 (Thu)
  64036051200, #    local_end 2030-03-22 00:00:00 (Fri)
  12600,
  0,
  '+0330',
      ],
      [
  64036038600, #    utc_start 2030-03-21 20:30:00 (Thu)
  64051932600, #      utc_end 2030-09-21 19:30:00 (Sat)
  64036054800, #  local_start 2030-03-22 01:00:00 (Fri)
  64051948800, #    local_end 2030-09-22 00:00:00 (Sun)
  16200,
  1,
  '+0430',
      ],
      [
  64051932600, #    utc_start 2030-09-21 19:30:00 (Sat)
  64067574600, #      utc_end 2031-03-21 20:30:00 (Fri)
  64051945200, #  local_start 2030-09-21 23:00:00 (Sat)
  64067587200, #    local_end 2031-03-22 00:00:00 (Sat)
  12600,
  0,
  '+0330',
      ],
      [
  64067574600, #    utc_start 2031-03-21 20:30:00 (Fri)
  64083468600, #      utc_end 2031-09-21 19:30:00 (Sun)
  64067590800, #  local_start 2031-03-22 01:00:00 (Sat)
  64083484800, #    local_end 2031-09-22 00:00:00 (Mon)
  16200,
  1,
  '+0430',
      ],
      [
  64083468600, #    utc_start 2031-09-21 19:30:00 (Sun)
  64099110600, #      utc_end 2032-03-20 20:30:00 (Sat)
  64083481200, #  local_start 2031-09-21 23:00:00 (Sun)
  64099123200, #    local_end 2032-03-21 00:00:00 (Sun)
  12600,
  0,
  '+0330',
      ],
      [
  64099110600, #    utc_start 2032-03-20 20:30:00 (Sat)
  64115004600, #      utc_end 2032-09-20 19:30:00 (Mon)
  64099126800, #  local_start 2032-03-21 01:00:00 (Sun)
  64115020800, #    local_end 2032-09-21 00:00:00 (Tue)
  16200,
  1,
  '+0430',
      ],
      [
  64115004600, #    utc_start 2032-09-20 19:30:00 (Mon)
  64130646600, #      utc_end 2033-03-20 20:30:00 (Sun)
  64115017200, #  local_start 2032-09-20 23:00:00 (Mon)
  64130659200, #    local_end 2033-03-21 00:00:00 (Mon)
  12600,
  0,
  '+0330',
      ],
      [
  64130646600, #    utc_start 2033-03-20 20:30:00 (Sun)
  64146540600, #      utc_end 2033-09-20 19:30:00 (Tue)
  64130662800, #  local_start 2033-03-21 01:00:00 (Mon)
  64146556800, #    local_end 2033-09-21 00:00:00 (Wed)
  16200,
  1,
  '+0430',
      ],
      [
  64146540600, #    utc_start 2033-09-20 19:30:00 (Tue)
  64162269000, #      utc_end 2034-03-21 20:30:00 (Tue)
  64146553200, #  local_start 2033-09-20 23:00:00 (Tue)
  64162281600, #    local_end 2034-03-22 00:00:00 (Wed)
  12600,
  0,
  '+0330',
      ],
      [
  64162269000, #    utc_start 2034-03-21 20:30:00 (Tue)
  64178163000, #      utc_end 2034-09-21 19:30:00 (Thu)
  64162285200, #  local_start 2034-03-22 01:00:00 (Wed)
  64178179200, #    local_end 2034-09-22 00:00:00 (Fri)
  16200,
  1,
  '+0430',
      ],
      [
  64178163000, #    utc_start 2034-09-21 19:30:00 (Thu)
  64193805000, #      utc_end 2035-03-21 20:30:00 (Wed)
  64178175600, #  local_start 2034-09-21 23:00:00 (Thu)
  64193817600, #    local_end 2035-03-22 00:00:00 (Thu)
  12600,
  0,
  '+0330',
      ],
      [
  64193805000, #    utc_start 2035-03-21 20:30:00 (Wed)
  64209699000, #      utc_end 2035-09-21 19:30:00 (Fri)
  64193821200, #  local_start 2035-03-22 01:00:00 (Thu)
  64209715200, #    local_end 2035-09-22 00:00:00 (Sat)
  16200,
  1,
  '+0430',
      ],
      [
  64209699000, #    utc_start 2035-09-21 19:30:00 (Fri)
  64225341000, #      utc_end 2036-03-20 20:30:00 (Thu)
  64209711600, #  local_start 2035-09-21 23:00:00 (Fri)
  64225353600, #    local_end 2036-03-21 00:00:00 (Fri)
  12600,
  0,
  '+0330',
      ],
      [
  64225341000, #    utc_start 2036-03-20 20:30:00 (Thu)
  64241235000, #      utc_end 2036-09-20 19:30:00 (Sat)
  64225357200, #  local_start 2036-03-21 01:00:00 (Fri)
  64241251200, #    local_end 2036-09-21 00:00:00 (Sun)
  16200,
  1,
  '+0430',
      ],
      [
  64241235000, #    utc_start 2036-09-20 19:30:00 (Sat)
  64256877000, #      utc_end 2037-03-20 20:30:00 (Fri)
  64241247600, #  local_start 2036-09-20 23:00:00 (Sat)
  64256889600, #    local_end 2037-03-21 00:00:00 (Sat)
  12600,
  0,
  '+0330',
      ],
      [
  64256877000, #    utc_start 2037-03-20 20:30:00 (Fri)
  64272771000, #      utc_end 2037-09-20 19:30:00 (Sun)
  64256893200, #  local_start 2037-03-21 01:00:00 (Sat)
  64272787200, #    local_end 2037-09-21 00:00:00 (Mon)
  16200,
  1,
  '+0430',
      ],
      [
  64272771000, #    utc_start 2037-09-20 19:30:00 (Sun)
  64288499400, #      utc_end 2038-03-21 20:30:00 (Sun)
  64272783600, #  local_start 2037-09-20 23:00:00 (Sun)
  64288512000, #    local_end 2038-03-22 00:00:00 (Mon)
  12600,
  0,
  '+0330',
      ],
      [
  64288499400, #    utc_start 2038-03-21 20:30:00 (Sun)
  64304393400, #      utc_end 2038-09-21 19:30:00 (Tue)
  64288515600, #  local_start 2038-03-22 01:00:00 (Mon)
  64304409600, #    local_end 2038-09-22 00:00:00 (Wed)
  16200,
  1,
  '+0430',
      ],
      [
  64304393400, #    utc_start 2038-09-21 19:30:00 (Tue)
  64320035400, #      utc_end 2039-03-21 20:30:00 (Mon)
  64304406000, #  local_start 2038-09-21 23:00:00 (Tue)
  64320048000, #    local_end 2039-03-22 00:00:00 (Tue)
  12600,
  0,
  '+0330',
      ],
      [
  64320035400, #    utc_start 2039-03-21 20:30:00 (Mon)
  64335929400, #      utc_end 2039-09-21 19:30:00 (Wed)
  64320051600, #  local_start 2039-03-22 01:00:00 (Tue)
  64335945600, #    local_end 2039-09-22 00:00:00 (Thu)
  16200,
  1,
  '+0430',
      ],
      [
  64335929400, #    utc_start 2039-09-21 19:30:00 (Wed)
  64351571400, #      utc_end 2040-03-20 20:30:00 (Tue)
  64335942000, #  local_start 2039-09-21 23:00:00 (Wed)
  64351584000, #    local_end 2040-03-21 00:00:00 (Wed)
  12600,
  0,
  '+0330',
      ],
      [
  64351571400, #    utc_start 2040-03-20 20:30:00 (Tue)
  64367465400, #      utc_end 2040-09-20 19:30:00 (Thu)
  64351587600, #  local_start 2040-03-21 01:00:00 (Wed)
  64367481600, #    local_end 2040-09-21 00:00:00 (Fri)
  16200,
  1,
  '+0430',
      ],
      [
  64367465400, #    utc_start 2040-09-20 19:30:00 (Thu)
  64383107400, #      utc_end 2041-03-20 20:30:00 (Wed)
  64367478000, #  local_start 2040-09-20 23:00:00 (Thu)
  64383120000, #    local_end 2041-03-21 00:00:00 (Thu)
  12600,
  0,
  '+0330',
      ],
      [
  64383107400, #    utc_start 2041-03-20 20:30:00 (Wed)
  64399001400, #      utc_end 2041-09-20 19:30:00 (Fri)
  64383123600, #  local_start 2041-03-21 01:00:00 (Thu)
  64399017600, #    local_end 2041-09-21 00:00:00 (Sat)
  16200,
  1,
  '+0430',
      ],
      [
  64399001400, #    utc_start 2041-09-20 19:30:00 (Fri)
  64414729800, #      utc_end 2042-03-21 20:30:00 (Fri)
  64399014000, #  local_start 2041-09-20 23:00:00 (Fri)
  64414742400, #    local_end 2042-03-22 00:00:00 (Sat)
  12600,
  0,
  '+0330',
      ],
      [
  64414729800, #    utc_start 2042-03-21 20:30:00 (Fri)
  64430623800, #      utc_end 2042-09-21 19:30:00 (Sun)
  64414746000, #  local_start 2042-03-22 01:00:00 (Sat)
  64430640000, #    local_end 2042-09-22 00:00:00 (Mon)
  16200,
  1,
  '+0430',
      ],
      [
  64430623800, #    utc_start 2042-09-21 19:30:00 (Sun)
  64446265800, #      utc_end 2043-03-21 20:30:00 (Sat)
  64430636400, #  local_start 2042-09-21 23:00:00 (Sun)
  64446278400, #    local_end 2043-03-22 00:00:00 (Sun)
  12600,
  0,
  '+0330',
      ],
      [
  64446265800, #    utc_start 2043-03-21 20:30:00 (Sat)
  64462159800, #      utc_end 2043-09-21 19:30:00 (Mon)
  64446282000, #  local_start 2043-03-22 01:00:00 (Sun)
  64462176000, #    local_end 2043-09-22 00:00:00 (Tue)
  16200,
  1,
  '+0430',
      ],
      [
  64462159800, #    utc_start 2043-09-21 19:30:00 (Mon)
  64477801800, #      utc_end 2044-03-20 20:30:00 (Sun)
  64462172400, #  local_start 2043-09-21 23:00:00 (Mon)
  64477814400, #    local_end 2044-03-21 00:00:00 (Mon)
  12600,
  0,
  '+0330',
      ],
      [
  64477801800, #    utc_start 2044-03-20 20:30:00 (Sun)
  64493695800, #      utc_end 2044-09-20 19:30:00 (Tue)
  64477818000, #  local_start 2044-03-21 01:00:00 (Mon)
  64493712000, #    local_end 2044-09-21 00:00:00 (Wed)
  16200,
  1,
  '+0430',
      ],
      [
  64493695800, #    utc_start 2044-09-20 19:30:00 (Tue)
  64509337800, #      utc_end 2045-03-20 20:30:00 (Mon)
  64493708400, #  local_start 2044-09-20 23:00:00 (Tue)
  64509350400, #    local_end 2045-03-21 00:00:00 (Tue)
  12600,
  0,
  '+0330',
      ],
      [
  64509337800, #    utc_start 2045-03-20 20:30:00 (Mon)
  64525231800, #      utc_end 2045-09-20 19:30:00 (Wed)
  64509354000, #  local_start 2045-03-21 01:00:00 (Tue)
  64525248000, #    local_end 2045-09-21 00:00:00 (Thu)
  16200,
  1,
  '+0430',
      ],
      [
  64525231800, #    utc_start 2045-09-20 19:30:00 (Wed)
  64540960200, #      utc_end 2046-03-21 20:30:00 (Wed)
  64525244400, #  local_start 2045-09-20 23:00:00 (Wed)
  64540972800, #    local_end 2046-03-22 00:00:00 (Thu)
  12600,
  0,
  '+0330',
      ],
      [
  64540960200, #    utc_start 2046-03-21 20:30:00 (Wed)
  64556854200, #      utc_end 2046-09-21 19:30:00 (Fri)
  64540976400, #  local_start 2046-03-22 01:00:00 (Thu)
  64556870400, #    local_end 2046-09-22 00:00:00 (Sat)
  16200,
  1,
  '+0430',
      ],
      [
  64556854200, #    utc_start 2046-09-21 19:30:00 (Fri)
  64572496200, #      utc_end 2047-03-21 20:30:00 (Thu)
  64556866800, #  local_start 2046-09-21 23:00:00 (Fri)
  64572508800, #    local_end 2047-03-22 00:00:00 (Fri)
  12600,
  0,
  '+0330',
      ],
      [
  64572496200, #    utc_start 2047-03-21 20:30:00 (Thu)
  64588390200, #      utc_end 2047-09-21 19:30:00 (Sat)
  64572512400, #  local_start 2047-03-22 01:00:00 (Fri)
  64588406400, #    local_end 2047-09-22 00:00:00 (Sun)
  16200,
  1,
  '+0430',
      ],
      [
  64588390200, #    utc_start 2047-09-21 19:30:00 (Sat)
  64604032200, #      utc_end 2048-03-20 20:30:00 (Fri)
  64588402800, #  local_start 2047-09-21 23:00:00 (Sat)
  64604044800, #    local_end 2048-03-21 00:00:00 (Sat)
  12600,
  0,
  '+0330',
      ],
      [
  64604032200, #    utc_start 2048-03-20 20:30:00 (Fri)
  64619926200, #      utc_end 2048-09-20 19:30:00 (Sun)
  64604048400, #  local_start 2048-03-21 01:00:00 (Sat)
  64619942400, #    local_end 2048-09-21 00:00:00 (Mon)
  16200,
  1,
  '+0430',
      ],
      [
  64619926200, #    utc_start 2048-09-20 19:30:00 (Sun)
  64635568200, #      utc_end 2049-03-20 20:30:00 (Sat)
  64619938800, #  local_start 2048-09-20 23:00:00 (Sun)
  64635580800, #    local_end 2049-03-21 00:00:00 (Sun)
  12600,
  0,
  '+0330',
      ],
      [
  64635568200, #    utc_start 2049-03-20 20:30:00 (Sat)
  64651462200, #      utc_end 2049-09-20 19:30:00 (Mon)
  64635584400, #  local_start 2049-03-21 01:00:00 (Sun)
  64651478400, #    local_end 2049-09-21 00:00:00 (Tue)
  16200,
  1,
  '+0430',
      ],
      [
  64651462200, #    utc_start 2049-09-20 19:30:00 (Mon)
  64667190600, #      utc_end 2050-03-21 20:30:00 (Mon)
  64651474800, #  local_start 2049-09-20 23:00:00 (Mon)
  64667203200, #    local_end 2050-03-22 00:00:00 (Tue)
  12600,
  0,
  '+0330',
      ],
      [
  64667190600, #    utc_start 2050-03-21 20:30:00 (Mon)
  64683084600, #      utc_end 2050-09-21 19:30:00 (Wed)
  64667206800, #  local_start 2050-03-22 01:00:00 (Tue)
  64683100800, #    local_end 2050-09-22 00:00:00 (Thu)
  16200,
  1,
  '+0430',
      ],
      [
  64683084600, #    utc_start 2050-09-21 19:30:00 (Wed)
  64698726600, #      utc_end 2051-03-21 20:30:00 (Tue)
  64683097200, #  local_start 2050-09-21 23:00:00 (Wed)
  64698739200, #    local_end 2051-03-22 00:00:00 (Wed)
  12600,
  0,
  '+0330',
      ],
      [
  64698726600, #    utc_start 2051-03-21 20:30:00 (Tue)
  64714620600, #      utc_end 2051-09-21 19:30:00 (Thu)
  64698742800, #  local_start 2051-03-22 01:00:00 (Wed)
  64714636800, #    local_end 2051-09-22 00:00:00 (Fri)
  16200,
  1,
  '+0430',
      ],
      [
  64714620600, #    utc_start 2051-09-21 19:30:00 (Thu)
  64730262600, #      utc_end 2052-03-20 20:30:00 (Wed)
  64714633200, #  local_start 2051-09-21 23:00:00 (Thu)
  64730275200, #    local_end 2052-03-21 00:00:00 (Thu)
  12600,
  0,
  '+0330',
      ],
      [
  64730262600, #    utc_start 2052-03-20 20:30:00 (Wed)
  64746156600, #      utc_end 2052-09-20 19:30:00 (Fri)
  64730278800, #  local_start 2052-03-21 01:00:00 (Thu)
  64746172800, #    local_end 2052-09-21 00:00:00 (Sat)
  16200,
  1,
  '+0430',
      ],
      [
  64746156600, #    utc_start 2052-09-20 19:30:00 (Fri)
  64761798600, #      utc_end 2053-03-20 20:30:00 (Thu)
  64746169200, #  local_start 2052-09-20 23:00:00 (Fri)
  64761811200, #    local_end 2053-03-21 00:00:00 (Fri)
  12600,
  0,
  '+0330',
      ],
      [
  64761798600, #    utc_start 2053-03-20 20:30:00 (Thu)
  64777692600, #      utc_end 2053-09-20 19:30:00 (Sat)
  64761814800, #  local_start 2053-03-21 01:00:00 (Fri)
  64777708800, #    local_end 2053-09-21 00:00:00 (Sun)
  16200,
  1,
  '+0430',
      ],
      [
  64777692600, #    utc_start 2053-09-20 19:30:00 (Sat)
  64793421000, #      utc_end 2054-03-21 20:30:00 (Sat)
  64777705200, #  local_start 2053-09-20 23:00:00 (Sat)
  64793433600, #    local_end 2054-03-22 00:00:00 (Sun)
  12600,
  0,
  '+0330',
      ],
      [
  64793421000, #    utc_start 2054-03-21 20:30:00 (Sat)
  64809315000, #      utc_end 2054-09-21 19:30:00 (Mon)
  64793437200, #  local_start 2054-03-22 01:00:00 (Sun)
  64809331200, #    local_end 2054-09-22 00:00:00 (Tue)
  16200,
  1,
  '+0430',
      ],
      [
  64809315000, #    utc_start 2054-09-21 19:30:00 (Mon)
  64824957000, #      utc_end 2055-03-21 20:30:00 (Sun)
  64809327600, #  local_start 2054-09-21 23:00:00 (Mon)
  64824969600, #    local_end 2055-03-22 00:00:00 (Mon)
  12600,
  0,
  '+0330',
      ],
      [
  64824957000, #    utc_start 2055-03-21 20:30:00 (Sun)
  64840851000, #      utc_end 2055-09-21 19:30:00 (Tue)
  64824973200, #  local_start 2055-03-22 01:00:00 (Mon)
  64840867200, #    local_end 2055-09-22 00:00:00 (Wed)
  16200,
  1,
  '+0430',
      ],
      [
  64840851000, #    utc_start 2055-09-21 19:30:00 (Tue)
  64856493000, #      utc_end 2056-03-20 20:30:00 (Mon)
  64840863600, #  local_start 2055-09-21 23:00:00 (Tue)
  64856505600, #    local_end 2056-03-21 00:00:00 (Tue)
  12600,
  0,
  '+0330',
      ],
      [
  64856493000, #    utc_start 2056-03-20 20:30:00 (Mon)
  64872387000, #      utc_end 2056-09-20 19:30:00 (Wed)
  64856509200, #  local_start 2056-03-21 01:00:00 (Tue)
  64872403200, #    local_end 2056-09-21 00:00:00 (Thu)
  16200,
  1,
  '+0430',
      ],
      [
  64872387000, #    utc_start 2056-09-20 19:30:00 (Wed)
  64888029000, #      utc_end 2057-03-20 20:30:00 (Tue)
  64872399600, #  local_start 2056-09-20 23:00:00 (Wed)
  64888041600, #    local_end 2057-03-21 00:00:00 (Wed)
  12600,
  0,
  '+0330',
      ],
      [
  64888029000, #    utc_start 2057-03-20 20:30:00 (Tue)
  64903923000, #      utc_end 2057-09-20 19:30:00 (Thu)
  64888045200, #  local_start 2057-03-21 01:00:00 (Wed)
  64903939200, #    local_end 2057-09-21 00:00:00 (Fri)
  16200,
  1,
  '+0430',
      ],
      [
  64903923000, #    utc_start 2057-09-20 19:30:00 (Thu)
  64919651400, #      utc_end 2058-03-21 20:30:00 (Thu)
  64903935600, #  local_start 2057-09-20 23:00:00 (Thu)
  64919664000, #    local_end 2058-03-22 00:00:00 (Fri)
  12600,
  0,
  '+0330',
      ],
      [
  64919651400, #    utc_start 2058-03-21 20:30:00 (Thu)
  64935545400, #      utc_end 2058-09-21 19:30:00 (Sat)
  64919667600, #  local_start 2058-03-22 01:00:00 (Fri)
  64935561600, #    local_end 2058-09-22 00:00:00 (Sun)
  16200,
  1,
  '+0430',
      ],
      [
  64935545400, #    utc_start 2058-09-21 19:30:00 (Sat)
  64951187400, #      utc_end 2059-03-21 20:30:00 (Fri)
  64935558000, #  local_start 2058-09-21 23:00:00 (Sat)
  64951200000, #    local_end 2059-03-22 00:00:00 (Sat)
  12600,
  0,
  '+0330',
      ],
      [
  64951187400, #    utc_start 2059-03-21 20:30:00 (Fri)
  64967081400, #      utc_end 2059-09-21 19:30:00 (Sun)
  64951203600, #  local_start 2059-03-22 01:00:00 (Sat)
  64967097600, #    local_end 2059-09-22 00:00:00 (Mon)
  16200,
  1,
  '+0430',
      ],
      [
  64967081400, #    utc_start 2059-09-21 19:30:00 (Sun)
  64982723400, #      utc_end 2060-03-20 20:30:00 (Sat)
  64967094000, #  local_start 2059-09-21 23:00:00 (Sun)
  64982736000, #    local_end 2060-03-21 00:00:00 (Sun)
  12600,
  0,
  '+0330',
      ],
      [
  64982723400, #    utc_start 2060-03-20 20:30:00 (Sat)
  64998617400, #      utc_end 2060-09-20 19:30:00 (Mon)
  64982739600, #  local_start 2060-03-21 01:00:00 (Sun)
  64998633600, #    local_end 2060-09-21 00:00:00 (Tue)
  16200,
  1,
  '+0430',
      ],
      [
  64998617400, #    utc_start 2060-09-20 19:30:00 (Mon)
  65014259400, #      utc_end 2061-03-20 20:30:00 (Sun)
  64998630000, #  local_start 2060-09-20 23:00:00 (Mon)
  65014272000, #    local_end 2061-03-21 00:00:00 (Mon)
  12600,
  0,
  '+0330',
      ],
      [
  65014259400, #    utc_start 2061-03-20 20:30:00 (Sun)
  65030153400, #      utc_end 2061-09-20 19:30:00 (Tue)
  65014275600, #  local_start 2061-03-21 01:00:00 (Mon)
  65030169600, #    local_end 2061-09-21 00:00:00 (Wed)
  16200,
  1,
  '+0430',
      ],
      [
  65030153400, #    utc_start 2061-09-20 19:30:00 (Tue)
  65045795400, #      utc_end 2062-03-20 20:30:00 (Mon)
  65030166000, #  local_start 2061-09-20 23:00:00 (Tue)
  65045808000, #    local_end 2062-03-21 00:00:00 (Tue)
  12600,
  0,
  '+0330',
      ],
      [
  65045795400, #    utc_start 2062-03-20 20:30:00 (Mon)
  65061689400, #      utc_end 2062-09-20 19:30:00 (Wed)
  65045811600, #  local_start 2062-03-21 01:00:00 (Tue)
  65061705600, #    local_end 2062-09-21 00:00:00 (Thu)
  16200,
  1,
  '+0430',
      ],
      [
  65061689400, #    utc_start 2062-09-20 19:30:00 (Wed)
  65077417800, #      utc_end 2063-03-21 20:30:00 (Wed)
  65061702000, #  local_start 2062-09-20 23:00:00 (Wed)
  65077430400, #    local_end 2063-03-22 00:00:00 (Thu)
  12600,
  0,
  '+0330',
      ],
      [
  65077417800, #    utc_start 2063-03-21 20:30:00 (Wed)
  65093311800, #      utc_end 2063-09-21 19:30:00 (Fri)
  65077434000, #  local_start 2063-03-22 01:00:00 (Thu)
  65093328000, #    local_end 2063-09-22 00:00:00 (Sat)
  16200,
  1,
  '+0430',
      ],
      [
  65093311800, #    utc_start 2063-09-21 19:30:00 (Fri)
  65108953800, #      utc_end 2064-03-20 20:30:00 (Thu)
  65093324400, #  local_start 2063-09-21 23:00:00 (Fri)
  65108966400, #    local_end 2064-03-21 00:00:00 (Fri)
  12600,
  0,
  '+0330',
      ],
      [
  65108953800, #    utc_start 2064-03-20 20:30:00 (Thu)
  65124847800, #      utc_end 2064-09-20 19:30:00 (Sat)
  65108970000, #  local_start 2064-03-21 01:00:00 (Fri)
  65124864000, #    local_end 2064-09-21 00:00:00 (Sun)
  16200,
  1,
  '+0430',
      ],
      [
  65124847800, #    utc_start 2064-09-20 19:30:00 (Sat)
  65140489800, #      utc_end 2065-03-20 20:30:00 (Fri)
  65124860400, #  local_start 2064-09-20 23:00:00 (Sat)
  65140502400, #    local_end 2065-03-21 00:00:00 (Sat)
  12600,
  0,
  '+0330',
      ],
      [
  65140489800, #    utc_start 2065-03-20 20:30:00 (Fri)
  65156383800, #      utc_end 2065-09-20 19:30:00 (Sun)
  65140506000, #  local_start 2065-03-21 01:00:00 (Sat)
  65156400000, #    local_end 2065-09-21 00:00:00 (Mon)
  16200,
  1,
  '+0430',
      ],
      [
  65156383800, #    utc_start 2065-09-20 19:30:00 (Sun)
  65172025800, #      utc_end 2066-03-20 20:30:00 (Sat)
  65156396400, #  local_start 2065-09-20 23:00:00 (Sun)
  65172038400, #    local_end 2066-03-21 00:00:00 (Sun)
  12600,
  0,
  '+0330',
      ],
      [
  65172025800, #    utc_start 2066-03-20 20:30:00 (Sat)
  65187919800, #      utc_end 2066-09-20 19:30:00 (Mon)
  65172042000, #  local_start 2066-03-21 01:00:00 (Sun)
  65187936000, #    local_end 2066-09-21 00:00:00 (Tue)
  16200,
  1,
  '+0430',
      ],
      [
  65187919800, #    utc_start 2066-09-20 19:30:00 (Mon)
  65203648200, #      utc_end 2067-03-21 20:30:00 (Mon)
  65187932400, #  local_start 2066-09-20 23:00:00 (Mon)
  65203660800, #    local_end 2067-03-22 00:00:00 (Tue)
  12600,
  0,
  '+0330',
      ],
      [
  65203648200, #    utc_start 2067-03-21 20:30:00 (Mon)
  65219542200, #      utc_end 2067-09-21 19:30:00 (Wed)
  65203664400, #  local_start 2067-03-22 01:00:00 (Tue)
  65219558400, #    local_end 2067-09-22 00:00:00 (Thu)
  16200,
  1,
  '+0430',
      ],
      [
  65219542200, #    utc_start 2067-09-21 19:30:00 (Wed)
  65235184200, #      utc_end 2068-03-20 20:30:00 (Tue)
  65219554800, #  local_start 2067-09-21 23:00:00 (Wed)
  65235196800, #    local_end 2068-03-21 00:00:00 (Wed)
  12600,
  0,
  '+0330',
      ],
      [
  65235184200, #    utc_start 2068-03-20 20:30:00 (Tue)
  65251078200, #      utc_end 2068-09-20 19:30:00 (Thu)
  65235200400, #  local_start 2068-03-21 01:00:00 (Wed)
  65251094400, #    local_end 2068-09-21 00:00:00 (Fri)
  16200,
  1,
  '+0430',
      ],
      [
  65251078200, #    utc_start 2068-09-20 19:30:00 (Thu)
  65266720200, #      utc_end 2069-03-20 20:30:00 (Wed)
  65251090800, #  local_start 2068-09-20 23:00:00 (Thu)
  65266732800, #    local_end 2069-03-21 00:00:00 (Thu)
  12600,
  0,
  '+0330',
      ],
      [
  65266720200, #    utc_start 2069-03-20 20:30:00 (Wed)
  65282614200, #      utc_end 2069-09-20 19:30:00 (Fri)
  65266736400, #  local_start 2069-03-21 01:00:00 (Thu)
  65282630400, #    local_end 2069-09-21 00:00:00 (Sat)
  16200,
  1,
  '+0430',
      ],
      [
  65282614200, #    utc_start 2069-09-20 19:30:00 (Fri)
  65298256200, #      utc_end 2070-03-20 20:30:00 (Thu)
  65282626800, #  local_start 2069-09-20 23:00:00 (Fri)
  65298268800, #    local_end 2070-03-21 00:00:00 (Fri)
  12600,
  0,
  '+0330',
      ],
      [
  65298256200, #    utc_start 2070-03-20 20:30:00 (Thu)
  65314150200, #      utc_end 2070-09-20 19:30:00 (Sat)
  65298272400, #  local_start 2070-03-21 01:00:00 (Fri)
  65314166400, #    local_end 2070-09-21 00:00:00 (Sun)
  16200,
  1,
  '+0430',
      ],
      [
  65314150200, #    utc_start 2070-09-20 19:30:00 (Sat)
  65329878600, #      utc_end 2071-03-21 20:30:00 (Sat)
  65314162800, #  local_start 2070-09-20 23:00:00 (Sat)
  65329891200, #    local_end 2071-03-22 00:00:00 (Sun)
  12600,
  0,
  '+0330',
      ],
      [
  65329878600, #    utc_start 2071-03-21 20:30:00 (Sat)
  65345772600, #      utc_end 2071-09-21 19:30:00 (Mon)
  65329894800, #  local_start 2071-03-22 01:00:00 (Sun)
  65345788800, #    local_end 2071-09-22 00:00:00 (Tue)
  16200,
  1,
  '+0430',
      ],
      [
  65345772600, #    utc_start 2071-09-21 19:30:00 (Mon)
  65361414600, #      utc_end 2072-03-20 20:30:00 (Sun)
  65345785200, #  local_start 2071-09-21 23:00:00 (Mon)
  65361427200, #    local_end 2072-03-21 00:00:00 (Mon)
  12600,
  0,
  '+0330',
      ],
      [
  65361414600, #    utc_start 2072-03-20 20:30:00 (Sun)
  65377308600, #      utc_end 2072-09-20 19:30:00 (Tue)
  65361430800, #  local_start 2072-03-21 01:00:00 (Mon)
  65377324800, #    local_end 2072-09-21 00:00:00 (Wed)
  16200,
  1,
  '+0430',
      ],
      [
  65377308600, #    utc_start 2072-09-20 19:30:00 (Tue)
  65392950600, #      utc_end 2073-03-20 20:30:00 (Mon)
  65377321200, #  local_start 2072-09-20 23:00:00 (Tue)
  65392963200, #    local_end 2073-03-21 00:00:00 (Tue)
  12600,
  0,
  '+0330',
      ],
      [
  65392950600, #    utc_start 2073-03-20 20:30:00 (Mon)
  65408844600, #      utc_end 2073-09-20 19:30:00 (Wed)
  65392966800, #  local_start 2073-03-21 01:00:00 (Tue)
  65408860800, #    local_end 2073-09-21 00:00:00 (Thu)
  16200,
  1,
  '+0430',
      ],
      [
  65408844600, #    utc_start 2073-09-20 19:30:00 (Wed)
  65424486600, #      utc_end 2074-03-20 20:30:00 (Tue)
  65408857200, #  local_start 2073-09-20 23:00:00 (Wed)
  65424499200, #    local_end 2074-03-21 00:00:00 (Wed)
  12600,
  0,
  '+0330',
      ],
      [
  65424486600, #    utc_start 2074-03-20 20:30:00 (Tue)
  65440380600, #      utc_end 2074-09-20 19:30:00 (Thu)
  65424502800, #  local_start 2074-03-21 01:00:00 (Wed)
  65440396800, #    local_end 2074-09-21 00:00:00 (Fri)
  16200,
  1,
  '+0430',
      ],
      [
  65440380600, #    utc_start 2074-09-20 19:30:00 (Thu)
  65456109000, #      utc_end 2075-03-21 20:30:00 (Thu)
  65440393200, #  local_start 2074-09-20 23:00:00 (Thu)
  65456121600, #    local_end 2075-03-22 00:00:00 (Fri)
  12600,
  0,
  '+0330',
      ],
      [
  65456109000, #    utc_start 2075-03-21 20:30:00 (Thu)
  65472003000, #      utc_end 2075-09-21 19:30:00 (Sat)
  65456125200, #  local_start 2075-03-22 01:00:00 (Fri)
  65472019200, #    local_end 2075-09-22 00:00:00 (Sun)
  16200,
  1,
  '+0430',
      ],
      [
  65472003000, #    utc_start 2075-09-21 19:30:00 (Sat)
  65487645000, #      utc_end 2076-03-20 20:30:00 (Fri)
  65472015600, #  local_start 2075-09-21 23:00:00 (Sat)
  65487657600, #    local_end 2076-03-21 00:00:00 (Sat)
  12600,
  0,
  '+0330',
      ],
      [
  65487645000, #    utc_start 2076-03-20 20:30:00 (Fri)
  65503539000, #      utc_end 2076-09-20 19:30:00 (Sun)
  65487661200, #  local_start 2076-03-21 01:00:00 (Sat)
  65503555200, #    local_end 2076-09-21 00:00:00 (Mon)
  16200,
  1,
  '+0430',
      ],
      [
  65503539000, #    utc_start 2076-09-20 19:30:00 (Sun)
  65519181000, #      utc_end 2077-03-20 20:30:00 (Sat)
  65503551600, #  local_start 2076-09-20 23:00:00 (Sun)
  65519193600, #    local_end 2077-03-21 00:00:00 (Sun)
  12600,
  0,
  '+0330',
      ],
      [
  65519181000, #    utc_start 2077-03-20 20:30:00 (Sat)
  65535075000, #      utc_end 2077-09-20 19:30:00 (Mon)
  65519197200, #  local_start 2077-03-21 01:00:00 (Sun)
  65535091200, #    local_end 2077-09-21 00:00:00 (Tue)
  16200,
  1,
  '+0430',
      ],
      [
  65535075000, #    utc_start 2077-09-20 19:30:00 (Mon)
  65550717000, #      utc_end 2078-03-20 20:30:00 (Sun)
  65535087600, #  local_start 2077-09-20 23:00:00 (Mon)
  65550729600, #    local_end 2078-03-21 00:00:00 (Mon)
  12600,
  0,
  '+0330',
      ],
      [
  65550717000, #    utc_start 2078-03-20 20:30:00 (Sun)
  65566611000, #      utc_end 2078-09-20 19:30:00 (Tue)
  65550733200, #  local_start 2078-03-21 01:00:00 (Mon)
  65566627200, #    local_end 2078-09-21 00:00:00 (Wed)
  16200,
  1,
  '+0430',
      ],
      [
  65566611000, #    utc_start 2078-09-20 19:30:00 (Tue)
  65582339400, #      utc_end 2079-03-21 20:30:00 (Tue)
  65566623600, #  local_start 2078-09-20 23:00:00 (Tue)
  65582352000, #    local_end 2079-03-22 00:00:00 (Wed)
  12600,
  0,
  '+0330',
      ],
      [
  65582339400, #    utc_start 2079-03-21 20:30:00 (Tue)
  65598233400, #      utc_end 2079-09-21 19:30:00 (Thu)
  65582355600, #  local_start 2079-03-22 01:00:00 (Wed)
  65598249600, #    local_end 2079-09-22 00:00:00 (Fri)
  16200,
  1,
  '+0430',
      ],
      [
  65598233400, #    utc_start 2079-09-21 19:30:00 (Thu)
  65613875400, #      utc_end 2080-03-20 20:30:00 (Wed)
  65598246000, #  local_start 2079-09-21 23:00:00 (Thu)
  65613888000, #    local_end 2080-03-21 00:00:00 (Thu)
  12600,
  0,
  '+0330',
      ],
      [
  65613875400, #    utc_start 2080-03-20 20:30:00 (Wed)
  65629769400, #      utc_end 2080-09-20 19:30:00 (Fri)
  65613891600, #  local_start 2080-03-21 01:00:00 (Thu)
  65629785600, #    local_end 2080-09-21 00:00:00 (Sat)
  16200,
  1,
  '+0430',
      ],
      [
  65629769400, #    utc_start 2080-09-20 19:30:00 (Fri)
  65645411400, #      utc_end 2081-03-20 20:30:00 (Thu)
  65629782000, #  local_start 2080-09-20 23:00:00 (Fri)
  65645424000, #    local_end 2081-03-21 00:00:00 (Fri)
  12600,
  0,
  '+0330',
      ],
      [
  65645411400, #    utc_start 2081-03-20 20:30:00 (Thu)
  65661305400, #      utc_end 2081-09-20 19:30:00 (Sat)
  65645427600, #  local_start 2081-03-21 01:00:00 (Fri)
  65661321600, #    local_end 2081-09-21 00:00:00 (Sun)
  16200,
  1,
  '+0430',
      ],
      [
  65661305400, #    utc_start 2081-09-20 19:30:00 (Sat)
  65676947400, #      utc_end 2082-03-20 20:30:00 (Fri)
  65661318000, #  local_start 2081-09-20 23:00:00 (Sat)
  65676960000, #    local_end 2082-03-21 00:00:00 (Sat)
  12600,
  0,
  '+0330',
      ],
      [
  65676947400, #    utc_start 2082-03-20 20:30:00 (Fri)
  65692841400, #      utc_end 2082-09-20 19:30:00 (Sun)
  65676963600, #  local_start 2082-03-21 01:00:00 (Sat)
  65692857600, #    local_end 2082-09-21 00:00:00 (Mon)
  16200,
  1,
  '+0430',
      ],
      [
  65692841400, #    utc_start 2082-09-20 19:30:00 (Sun)
  65708569800, #      utc_end 2083-03-21 20:30:00 (Sun)
  65692854000, #  local_start 2082-09-20 23:00:00 (Sun)
  65708582400, #    local_end 2083-03-22 00:00:00 (Mon)
  12600,
  0,
  '+0330',
      ],
      [
  65708569800, #    utc_start 2083-03-21 20:30:00 (Sun)
  65724463800, #      utc_end 2083-09-21 19:30:00 (Tue)
  65708586000, #  local_start 2083-03-22 01:00:00 (Mon)
  65724480000, #    local_end 2083-09-22 00:00:00 (Wed)
  16200,
  1,
  '+0430',
      ],
      [
  65724463800, #    utc_start 2083-09-21 19:30:00 (Tue)
  65740105800, #      utc_end 2084-03-20 20:30:00 (Mon)
  65724476400, #  local_start 2083-09-21 23:00:00 (Tue)
  65740118400, #    local_end 2084-03-21 00:00:00 (Tue)
  12600,
  0,
  '+0330',
      ],
      [
  65740105800, #    utc_start 2084-03-20 20:30:00 (Mon)
  65755999800, #      utc_end 2084-09-20 19:30:00 (Wed)
  65740122000, #  local_start 2084-03-21 01:00:00 (Tue)
  65756016000, #    local_end 2084-09-21 00:00:00 (Thu)
  16200,
  1,
  '+0430',
      ],
      [
  65755999800, #    utc_start 2084-09-20 19:30:00 (Wed)
  65771641800, #      utc_end 2085-03-20 20:30:00 (Tue)
  65756012400, #  local_start 2084-09-20 23:00:00 (Wed)
  65771654400, #    local_end 2085-03-21 00:00:00 (Wed)
  12600,
  0,
  '+0330',
      ],
      [
  65771641800, #    utc_start 2085-03-20 20:30:00 (Tue)
  65787535800, #      utc_end 2085-09-20 19:30:00 (Thu)
  65771658000, #  local_start 2085-03-21 01:00:00 (Wed)
  65787552000, #    local_end 2085-09-21 00:00:00 (Fri)
  16200,
  1,
  '+0430',
      ],
      [
  65787535800, #    utc_start 2085-09-20 19:30:00 (Thu)
  65803177800, #      utc_end 2086-03-20 20:30:00 (Wed)
  65787548400, #  local_start 2085-09-20 23:00:00 (Thu)
  65803190400, #    local_end 2086-03-21 00:00:00 (Thu)
  12600,
  0,
  '+0330',
      ],
      [
  65803177800, #    utc_start 2086-03-20 20:30:00 (Wed)
  65819071800, #      utc_end 2086-09-20 19:30:00 (Fri)
  65803194000, #  local_start 2086-03-21 01:00:00 (Thu)
  65819088000, #    local_end 2086-09-21 00:00:00 (Sat)
  16200,
  1,
  '+0430',
      ],
      [
  65819071800, #    utc_start 2086-09-20 19:30:00 (Fri)
  65834800200, #      utc_end 2087-03-21 20:30:00 (Fri)
  65819084400, #  local_start 2086-09-20 23:00:00 (Fri)
  65834812800, #    local_end 2087-03-22 00:00:00 (Sat)
  12600,
  0,
  '+0330',
      ],
      [
  65834800200, #    utc_start 2087-03-21 20:30:00 (Fri)
  65850694200, #      utc_end 2087-09-21 19:30:00 (Sun)
  65834816400, #  local_start 2087-03-22 01:00:00 (Sat)
  65850710400, #    local_end 2087-09-22 00:00:00 (Mon)
  16200,
  1,
  '+0430',
      ],
      [
  65850694200, #    utc_start 2087-09-21 19:30:00 (Sun)
  65866336200, #      utc_end 2088-03-20 20:30:00 (Sat)
  65850706800, #  local_start 2087-09-21 23:00:00 (Sun)
  65866348800, #    local_end 2088-03-21 00:00:00 (Sun)
  12600,
  0,
  '+0330',
      ],
      [
  65866336200, #    utc_start 2088-03-20 20:30:00 (Sat)
  65882230200, #      utc_end 2088-09-20 19:30:00 (Mon)
  65866352400, #  local_start 2088-03-21 01:00:00 (Sun)
  65882246400, #    local_end 2088-09-21 00:00:00 (Tue)
  16200,
  1,
  '+0430',
      ],
      [
  65882230200, #    utc_start 2088-09-20 19:30:00 (Mon)
  65897872200, #      utc_end 2089-03-20 20:30:00 (Sun)
  65882242800, #  local_start 2088-09-20 23:00:00 (Mon)
  65897884800, #    local_end 2089-03-21 00:00:00 (Mon)
  12600,
  0,
  '+0330',
      ],
      [
  65897872200, #    utc_start 2089-03-20 20:30:00 (Sun)
  65913766200, #      utc_end 2089-09-20 19:30:00 (Tue)
  65897888400, #  local_start 2089-03-21 01:00:00 (Mon)
  65913782400, #    local_end 2089-09-21 00:00:00 (Wed)
  16200,
  1,
  '+0430',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {100}
  
  sub _max_year {2088}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { 12600 }
  
  my $last_observance = bless( {
    'format' => '+0330/+0430',
    'gmtoff' => '3:30',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 722449,
      'local_rd_secs' => 84600,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 722449,
      'utc_rd_secs' => 84600,
      'utc_year' => 1979
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => 12600,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 722449,
      'local_rd_secs' => 72000,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 722449,
      'utc_rd_secs' => 72000,
      'utc_year' => 1979
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '24:00',
      'from' => '2088',
      'in' => 'Mar',
      'letter' => '',
      'name' => 'Iran',
      'offset_from_std' => 3600,
      'on' => '20',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '24:00',
      'from' => '2088',
      'in' => 'Sep',
      'letter' => '',
      'name' => 'Iran',
      'offset_from_std' => 0,
      'on' => '20',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_TEHRAN

    $main::fatpacked{"DateTime/TimeZone/Asia/Thimphu.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_THIMPHU';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/asia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Thimphu;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Thimphu::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  61429341684, #      utc_end 1947-08-14 18:01:24 (Thu)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  61429363200, #    local_end 1947-08-15 00:00:00 (Fri)
  21516,
  0,
  'LMT',
      ],
      [
  61429341684, #    utc_start 1947-08-14 18:01:24 (Thu)
  62695708200, #      utc_end 1987-09-30 18:30:00 (Wed)
  61429361484, #  local_start 1947-08-14 23:31:24 (Thu)
  62695728000, #    local_end 1987-10-01 00:00:00 (Thu)
  19800,
  0,
  '+0530',
      ],
      [
  62695708200, #    utc_start 1987-09-30 18:30:00 (Wed)
  DateTime::TimeZone::INFINITY, #      utc_end
  62695729800, #  local_start 1987-10-01 00:30:00 (Thu)
  DateTime::TimeZone::INFINITY, #    local_end
  21600,
  0,
  '+06',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_THIMPHU

    $main::fatpacked{"DateTime/TimeZone/Asia/Tokyo.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_TOKYO';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/asia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Tokyo;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Tokyo::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59547970800, #      utc_end 1887-12-31 15:00:00 (Sat)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59548004339, #    local_end 1888-01-01 00:18:59 (Sun)
  33539,
  0,
  'LMT',
      ],
      [
  59547970800, #    utc_start 1887-12-31 15:00:00 (Sat)
  61451881200, #      utc_end 1948-05-01 15:00:00 (Sat)
  59548003200, #  local_start 1888-01-01 00:00:00 (Sun)
  61451913600, #    local_end 1948-05-02 00:00:00 (Sun)
  32400,
  0,
  'JST',
      ],
      [
  61451881200, #    utc_start 1948-05-01 15:00:00 (Sat)
  61463372400, #      utc_end 1948-09-11 15:00:00 (Sat)
  61451917200, #  local_start 1948-05-02 01:00:00 (Sun)
  61463408400, #    local_end 1948-09-12 01:00:00 (Sun)
  36000,
  1,
  'JDT',
      ],
      [
  61463372400, #    utc_start 1948-09-11 15:00:00 (Sat)
  61480911600, #      utc_end 1949-04-02 15:00:00 (Sat)
  61463404800, #  local_start 1948-09-12 00:00:00 (Sun)
  61480944000, #    local_end 1949-04-03 00:00:00 (Sun)
  32400,
  0,
  'JST',
      ],
      [
  61480911600, #    utc_start 1949-04-02 15:00:00 (Sat)
  61494822000, #      utc_end 1949-09-10 15:00:00 (Sat)
  61480947600, #  local_start 1949-04-03 01:00:00 (Sun)
  61494858000, #    local_end 1949-09-11 01:00:00 (Sun)
  36000,
  1,
  'JDT',
      ],
      [
  61494822000, #    utc_start 1949-09-10 15:00:00 (Sat)
  61515385200, #      utc_end 1950-05-06 15:00:00 (Sat)
  61494854400, #  local_start 1949-09-11 00:00:00 (Sun)
  61515417600, #    local_end 1950-05-07 00:00:00 (Sun)
  32400,
  0,
  'JST',
      ],
      [
  61515385200, #    utc_start 1950-05-06 15:00:00 (Sat)
  61526271600, #      utc_end 1950-09-09 15:00:00 (Sat)
  61515421200, #  local_start 1950-05-07 01:00:00 (Sun)
  61526307600, #    local_end 1950-09-10 01:00:00 (Sun)
  36000,
  1,
  'JDT',
      ],
      [
  61526271600, #    utc_start 1950-09-09 15:00:00 (Sat)
  61546834800, #      utc_end 1951-05-05 15:00:00 (Sat)
  61526304000, #  local_start 1950-09-10 00:00:00 (Sun)
  61546867200, #    local_end 1951-05-06 00:00:00 (Sun)
  32400,
  0,
  'JST',
      ],
      [
  61546834800, #    utc_start 1951-05-05 15:00:00 (Sat)
  61557721200, #      utc_end 1951-09-08 15:00:00 (Sat)
  61546870800, #  local_start 1951-05-06 01:00:00 (Sun)
  61557757200, #    local_end 1951-09-09 01:00:00 (Sun)
  36000,
  1,
  'JDT',
      ],
      [
  61557721200, #    utc_start 1951-09-08 15:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  61557753600, #  local_start 1951-09-09 00:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  32400,
  0,
  'JST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {4}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_TOKYO

    $main::fatpacked{"DateTime/TimeZone/Asia/Tomsk.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_TOMSK';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Tomsk;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Tomsk::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60556875609, #      utc_end 1919-12-21 18:20:09 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60556896000, #    local_end 1919-12-22 00:00:00 (Mon)
  20391,
  0,
  'LMT',
      ],
      [
  60556875609, #    utc_start 1919-12-21 18:20:09 (Sun)
  60888132000, #      utc_end 1930-06-20 18:00:00 (Fri)
  60556897209, #  local_start 1919-12-22 00:20:09 (Mon)
  60888153600, #    local_end 1930-06-21 00:00:00 (Sat)
  21600,
  0,
  '+06',
      ],
      [
  60888132000, #    utc_start 1930-06-20 18:00:00 (Fri)
  62490589200, #      utc_end 1981-03-31 17:00:00 (Tue)
  60888157200, #  local_start 1930-06-21 01:00:00 (Sat)
  62490614400, #    local_end 1981-04-01 00:00:00 (Wed)
  25200,
  0,
  '+07',
      ],
      [
  62490589200, #    utc_start 1981-03-31 17:00:00 (Tue)
  62506396800, #      utc_end 1981-09-30 16:00:00 (Wed)
  62490618000, #  local_start 1981-04-01 01:00:00 (Wed)
  62506425600, #    local_end 1981-10-01 00:00:00 (Thu)
  28800,
  1,
  '+08',
      ],
      [
  62506396800, #    utc_start 1981-09-30 16:00:00 (Wed)
  62522125200, #      utc_end 1982-03-31 17:00:00 (Wed)
  62506422000, #  local_start 1981-09-30 23:00:00 (Wed)
  62522150400, #    local_end 1982-04-01 00:00:00 (Thu)
  25200,
  0,
  '+07',
      ],
      [
  62522125200, #    utc_start 1982-03-31 17:00:00 (Wed)
  62537932800, #      utc_end 1982-09-30 16:00:00 (Thu)
  62522154000, #  local_start 1982-04-01 01:00:00 (Thu)
  62537961600, #    local_end 1982-10-01 00:00:00 (Fri)
  28800,
  1,
  '+08',
      ],
      [
  62537932800, #    utc_start 1982-09-30 16:00:00 (Thu)
  62553661200, #      utc_end 1983-03-31 17:00:00 (Thu)
  62537958000, #  local_start 1982-09-30 23:00:00 (Thu)
  62553686400, #    local_end 1983-04-01 00:00:00 (Fri)
  25200,
  0,
  '+07',
      ],
      [
  62553661200, #    utc_start 1983-03-31 17:00:00 (Thu)
  62569468800, #      utc_end 1983-09-30 16:00:00 (Fri)
  62553690000, #  local_start 1983-04-01 01:00:00 (Fri)
  62569497600, #    local_end 1983-10-01 00:00:00 (Sat)
  28800,
  1,
  '+08',
      ],
      [
  62569468800, #    utc_start 1983-09-30 16:00:00 (Fri)
  62585283600, #      utc_end 1984-03-31 17:00:00 (Sat)
  62569494000, #  local_start 1983-09-30 23:00:00 (Fri)
  62585308800, #    local_end 1984-04-01 00:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62585283600, #    utc_start 1984-03-31 17:00:00 (Sat)
  62601015600, #      utc_end 1984-09-29 19:00:00 (Sat)
  62585312400, #  local_start 1984-04-01 01:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62601015600, #    utc_start 1984-09-29 19:00:00 (Sat)
  62616740400, #      utc_end 1985-03-30 19:00:00 (Sat)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62616740400, #    utc_start 1985-03-30 19:00:00 (Sat)
  62632465200, #      utc_end 1985-09-28 19:00:00 (Sat)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62632465200, #    utc_start 1985-09-28 19:00:00 (Sat)
  62648190000, #      utc_end 1986-03-29 19:00:00 (Sat)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62648190000, #    utc_start 1986-03-29 19:00:00 (Sat)
  62663914800, #      utc_end 1986-09-27 19:00:00 (Sat)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62663914800, #    utc_start 1986-09-27 19:00:00 (Sat)
  62679639600, #      utc_end 1987-03-28 19:00:00 (Sat)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62679639600, #    utc_start 1987-03-28 19:00:00 (Sat)
  62695364400, #      utc_end 1987-09-26 19:00:00 (Sat)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62695364400, #    utc_start 1987-09-26 19:00:00 (Sat)
  62711089200, #      utc_end 1988-03-26 19:00:00 (Sat)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62711089200, #    utc_start 1988-03-26 19:00:00 (Sat)
  62726814000, #      utc_end 1988-09-24 19:00:00 (Sat)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62726814000, #    utc_start 1988-09-24 19:00:00 (Sat)
  62742538800, #      utc_end 1989-03-25 19:00:00 (Sat)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62742538800, #    utc_start 1989-03-25 19:00:00 (Sat)
  62758263600, #      utc_end 1989-09-23 19:00:00 (Sat)
  62742567600, #  local_start 1989-03-26 03:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62758263600, #    utc_start 1989-09-23 19:00:00 (Sat)
  62773988400, #      utc_end 1990-03-24 19:00:00 (Sat)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62773988400, #    utc_start 1990-03-24 19:00:00 (Sat)
  62790318000, #      utc_end 1990-09-29 19:00:00 (Sat)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62790318000, #    utc_start 1990-09-29 19:00:00 (Sat)
  62806042800, #      utc_end 1991-03-30 19:00:00 (Sat)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62806042800, #    utc_start 1991-03-30 19:00:00 (Sat)
  62821771200, #      utc_end 1991-09-28 20:00:00 (Sat)
  62806068000, #  local_start 1991-03-31 02:00:00 (Sun)
  62821796400, #    local_end 1991-09-29 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  62821771200, #    utc_start 1991-09-28 20:00:00 (Sat)
  62831448000, #      utc_end 1992-01-18 20:00:00 (Sat)
  62821792800, #  local_start 1991-09-29 02:00:00 (Sun)
  62831469600, #    local_end 1992-01-19 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  62831448000, #    utc_start 1992-01-18 20:00:00 (Sat)
  62837492400, #      utc_end 1992-03-28 19:00:00 (Sat)
  62831473200, #  local_start 1992-01-19 03:00:00 (Sun)
  62837517600, #    local_end 1992-03-29 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62837492400, #    utc_start 1992-03-28 19:00:00 (Sat)
  62853217200, #      utc_end 1992-09-26 19:00:00 (Sat)
  62837521200, #  local_start 1992-03-29 03:00:00 (Sun)
  62853246000, #    local_end 1992-09-27 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62853217200, #    utc_start 1992-09-26 19:00:00 (Sat)
  62868942000, #      utc_end 1993-03-27 19:00:00 (Sat)
  62853242400, #  local_start 1992-09-27 02:00:00 (Sun)
  62868967200, #    local_end 1993-03-28 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62868942000, #    utc_start 1993-03-27 19:00:00 (Sat)
  62884666800, #      utc_end 1993-09-25 19:00:00 (Sat)
  62868970800, #  local_start 1993-03-28 03:00:00 (Sun)
  62884695600, #    local_end 1993-09-26 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62884666800, #    utc_start 1993-09-25 19:00:00 (Sat)
  62900391600, #      utc_end 1994-03-26 19:00:00 (Sat)
  62884692000, #  local_start 1993-09-26 02:00:00 (Sun)
  62900416800, #    local_end 1994-03-27 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62900391600, #    utc_start 1994-03-26 19:00:00 (Sat)
  62916116400, #      utc_end 1994-09-24 19:00:00 (Sat)
  62900420400, #  local_start 1994-03-27 03:00:00 (Sun)
  62916145200, #    local_end 1994-09-25 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62916116400, #    utc_start 1994-09-24 19:00:00 (Sat)
  62931841200, #      utc_end 1995-03-25 19:00:00 (Sat)
  62916141600, #  local_start 1994-09-25 02:00:00 (Sun)
  62931866400, #    local_end 1995-03-26 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62931841200, #    utc_start 1995-03-25 19:00:00 (Sat)
  62947566000, #      utc_end 1995-09-23 19:00:00 (Sat)
  62931870000, #  local_start 1995-03-26 03:00:00 (Sun)
  62947594800, #    local_end 1995-09-24 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62947566000, #    utc_start 1995-09-23 19:00:00 (Sat)
  62963895600, #      utc_end 1996-03-30 19:00:00 (Sat)
  62947591200, #  local_start 1995-09-24 02:00:00 (Sun)
  62963920800, #    local_end 1996-03-31 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62963895600, #    utc_start 1996-03-30 19:00:00 (Sat)
  62982039600, #      utc_end 1996-10-26 19:00:00 (Sat)
  62963924400, #  local_start 1996-03-31 03:00:00 (Sun)
  62982068400, #    local_end 1996-10-27 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  62982039600, #    utc_start 1996-10-26 19:00:00 (Sat)
  62995345200, #      utc_end 1997-03-29 19:00:00 (Sat)
  62982064800, #  local_start 1996-10-27 02:00:00 (Sun)
  62995370400, #    local_end 1997-03-30 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62995345200, #    utc_start 1997-03-29 19:00:00 (Sat)
  63013489200, #      utc_end 1997-10-25 19:00:00 (Sat)
  62995374000, #  local_start 1997-03-30 03:00:00 (Sun)
  63013518000, #    local_end 1997-10-26 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  63013489200, #    utc_start 1997-10-25 19:00:00 (Sat)
  63026794800, #      utc_end 1998-03-28 19:00:00 (Sat)
  63013514400, #  local_start 1997-10-26 02:00:00 (Sun)
  63026820000, #    local_end 1998-03-29 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  63026794800, #    utc_start 1998-03-28 19:00:00 (Sat)
  63044938800, #      utc_end 1998-10-24 19:00:00 (Sat)
  63026823600, #  local_start 1998-03-29 03:00:00 (Sun)
  63044967600, #    local_end 1998-10-25 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  63044938800, #    utc_start 1998-10-24 19:00:00 (Sat)
  63058244400, #      utc_end 1999-03-27 19:00:00 (Sat)
  63044964000, #  local_start 1998-10-25 02:00:00 (Sun)
  63058269600, #    local_end 1999-03-28 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  63058244400, #    utc_start 1999-03-27 19:00:00 (Sat)
  63076993200, #      utc_end 1999-10-30 19:00:00 (Sat)
  63058273200, #  local_start 1999-03-28 03:00:00 (Sun)
  63077022000, #    local_end 1999-10-31 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  63076993200, #    utc_start 1999-10-30 19:00:00 (Sat)
  63089694000, #      utc_end 2000-03-25 19:00:00 (Sat)
  63077018400, #  local_start 1999-10-31 02:00:00 (Sun)
  63089719200, #    local_end 2000-03-26 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  63089694000, #    utc_start 2000-03-25 19:00:00 (Sat)
  63108442800, #      utc_end 2000-10-28 19:00:00 (Sat)
  63089722800, #  local_start 2000-03-26 03:00:00 (Sun)
  63108471600, #    local_end 2000-10-29 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  63108442800, #    utc_start 2000-10-28 19:00:00 (Sat)
  63121143600, #      utc_end 2001-03-24 19:00:00 (Sat)
  63108468000, #  local_start 2000-10-29 02:00:00 (Sun)
  63121168800, #    local_end 2001-03-25 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  63121143600, #    utc_start 2001-03-24 19:00:00 (Sat)
  63139892400, #      utc_end 2001-10-27 19:00:00 (Sat)
  63121172400, #  local_start 2001-03-25 03:00:00 (Sun)
  63139921200, #    local_end 2001-10-28 03:00:00 (Sun)
  28800,
  1,
  '+08',
      ],
      [
  63139892400, #    utc_start 2001-10-27 19:00:00 (Sat)
  63153198000, #      utc_end 2002-03-30 19:00:00 (Sat)
  63139917600, #  local_start 2001-10-28 02:00:00 (Sun)
  63153223200, #    local_end 2002-03-31 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  63153198000, #    utc_start 2002-03-30 19:00:00 (Sat)
  63155876400, #      utc_end 2002-04-30 19:00:00 (Tue)
  63153226800, #  local_start 2002-03-31 03:00:00 (Sun)
  63155905200, #    local_end 2002-05-01 03:00:00 (Wed)
  28800,
  1,
  '+08',
      ],
      [
  63155876400, #    utc_start 2002-04-30 19:00:00 (Tue)
  63171345600, #      utc_end 2002-10-26 20:00:00 (Sat)
  63155901600, #  local_start 2002-05-01 02:00:00 (Wed)
  63171370800, #    local_end 2002-10-27 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  63171345600, #    utc_start 2002-10-26 20:00:00 (Sat)
  63184651200, #      utc_end 2003-03-29 20:00:00 (Sat)
  63171367200, #  local_start 2002-10-27 02:00:00 (Sun)
  63184672800, #    local_end 2003-03-30 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  63184651200, #    utc_start 2003-03-29 20:00:00 (Sat)
  63202795200, #      utc_end 2003-10-25 20:00:00 (Sat)
  63184676400, #  local_start 2003-03-30 03:00:00 (Sun)
  63202820400, #    local_end 2003-10-26 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  63202795200, #    utc_start 2003-10-25 20:00:00 (Sat)
  63216100800, #      utc_end 2004-03-27 20:00:00 (Sat)
  63202816800, #  local_start 2003-10-26 02:00:00 (Sun)
  63216122400, #    local_end 2004-03-28 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  63216100800, #    utc_start 2004-03-27 20:00:00 (Sat)
  63234849600, #      utc_end 2004-10-30 20:00:00 (Sat)
  63216126000, #  local_start 2004-03-28 03:00:00 (Sun)
  63234874800, #    local_end 2004-10-31 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  63234849600, #    utc_start 2004-10-30 20:00:00 (Sat)
  63247550400, #      utc_end 2005-03-26 20:00:00 (Sat)
  63234871200, #  local_start 2004-10-31 02:00:00 (Sun)
  63247572000, #    local_end 2005-03-27 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  63247550400, #    utc_start 2005-03-26 20:00:00 (Sat)
  63266299200, #      utc_end 2005-10-29 20:00:00 (Sat)
  63247575600, #  local_start 2005-03-27 03:00:00 (Sun)
  63266324400, #    local_end 2005-10-30 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  63266299200, #    utc_start 2005-10-29 20:00:00 (Sat)
  63279000000, #      utc_end 2006-03-25 20:00:00 (Sat)
  63266320800, #  local_start 2005-10-30 02:00:00 (Sun)
  63279021600, #    local_end 2006-03-26 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  63279000000, #    utc_start 2006-03-25 20:00:00 (Sat)
  63297748800, #      utc_end 2006-10-28 20:00:00 (Sat)
  63279025200, #  local_start 2006-03-26 03:00:00 (Sun)
  63297774000, #    local_end 2006-10-29 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  63297748800, #    utc_start 2006-10-28 20:00:00 (Sat)
  63310449600, #      utc_end 2007-03-24 20:00:00 (Sat)
  63297770400, #  local_start 2006-10-29 02:00:00 (Sun)
  63310471200, #    local_end 2007-03-25 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  63310449600, #    utc_start 2007-03-24 20:00:00 (Sat)
  63329198400, #      utc_end 2007-10-27 20:00:00 (Sat)
  63310474800, #  local_start 2007-03-25 03:00:00 (Sun)
  63329223600, #    local_end 2007-10-28 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  63329198400, #    utc_start 2007-10-27 20:00:00 (Sat)
  63342504000, #      utc_end 2008-03-29 20:00:00 (Sat)
  63329220000, #  local_start 2007-10-28 02:00:00 (Sun)
  63342525600, #    local_end 2008-03-30 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  63342504000, #    utc_start 2008-03-29 20:00:00 (Sat)
  63360648000, #      utc_end 2008-10-25 20:00:00 (Sat)
  63342529200, #  local_start 2008-03-30 03:00:00 (Sun)
  63360673200, #    local_end 2008-10-26 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  63360648000, #    utc_start 2008-10-25 20:00:00 (Sat)
  63373953600, #      utc_end 2009-03-28 20:00:00 (Sat)
  63360669600, #  local_start 2008-10-26 02:00:00 (Sun)
  63373975200, #    local_end 2009-03-29 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  63373953600, #    utc_start 2009-03-28 20:00:00 (Sat)
  63392097600, #      utc_end 2009-10-24 20:00:00 (Sat)
  63373978800, #  local_start 2009-03-29 03:00:00 (Sun)
  63392122800, #    local_end 2009-10-25 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  63392097600, #    utc_start 2009-10-24 20:00:00 (Sat)
  63405403200, #      utc_end 2010-03-27 20:00:00 (Sat)
  63392119200, #  local_start 2009-10-25 02:00:00 (Sun)
  63405424800, #    local_end 2010-03-28 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  63405403200, #    utc_start 2010-03-27 20:00:00 (Sat)
  63424152000, #      utc_end 2010-10-30 20:00:00 (Sat)
  63405428400, #  local_start 2010-03-28 03:00:00 (Sun)
  63424177200, #    local_end 2010-10-31 03:00:00 (Sun)
  25200,
  1,
  '+07',
      ],
      [
  63424152000, #    utc_start 2010-10-30 20:00:00 (Sat)
  63436852800, #      utc_end 2011-03-26 20:00:00 (Sat)
  63424173600, #  local_start 2010-10-31 02:00:00 (Sun)
  63436874400, #    local_end 2011-03-27 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  63436852800, #    utc_start 2011-03-26 20:00:00 (Sat)
  63549946800, #      utc_end 2014-10-25 19:00:00 (Sat)
  63436878000, #  local_start 2011-03-27 03:00:00 (Sun)
  63549972000, #    local_end 2014-10-26 02:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  63549946800, #    utc_start 2014-10-25 19:00:00 (Sat)
  63600148800, #      utc_end 2016-05-28 20:00:00 (Sat)
  63549968400, #  local_start 2014-10-26 01:00:00 (Sun)
  63600170400, #    local_end 2016-05-29 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  63600148800, #    utc_start 2016-05-28 20:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  63600174000, #  local_start 2016-05-29 03:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  25200,
  0,
  '+07',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {31}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_TOMSK

    $main::fatpacked{"DateTime/TimeZone/Asia/Ulaanbaatar.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_ULAANBAATAR';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/asia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Ulaanbaatar;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Ulaanbaatar::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60102751948, #      utc_end 1905-07-31 16:52:28 (Mon)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60102777600, #    local_end 1905-08-01 00:00:00 (Tue)
  25652,
  0,
  'LMT',
      ],
      [
  60102751948, #    utc_start 1905-07-31 16:52:28 (Mon)
  62388118800, #      utc_end 1977-12-31 17:00:00 (Sat)
  60102777148, #  local_start 1905-07-31 23:52:28 (Mon)
  62388144000, #    local_end 1978-01-01 00:00:00 (Sun)
  25200,
  0,
  '+07',
      ],
      [
  62388118800, #    utc_start 1977-12-31 17:00:00 (Sat)
  62553657600, #      utc_end 1983-03-31 16:00:00 (Thu)
  62388147600, #  local_start 1978-01-01 01:00:00 (Sun)
  62553686400, #    local_end 1983-04-01 00:00:00 (Fri)
  28800,
  0,
  '+08',
      ],
      [
  62553657600, #    utc_start 1983-03-31 16:00:00 (Thu)
  62569465200, #      utc_end 1983-09-30 15:00:00 (Fri)
  62553690000, #  local_start 1983-04-01 01:00:00 (Fri)
  62569497600, #    local_end 1983-10-01 00:00:00 (Sat)
  32400,
  1,
  '+09',
      ],
      [
  62569465200, #    utc_start 1983-09-30 15:00:00 (Fri)
  62585280000, #      utc_end 1984-03-31 16:00:00 (Sat)
  62569494000, #  local_start 1983-09-30 23:00:00 (Fri)
  62585308800, #    local_end 1984-04-01 00:00:00 (Sun)
  28800,
  0,
  '+08',
      ],
      [
  62585280000, #    utc_start 1984-03-31 16:00:00 (Sat)
  62601001200, #      utc_end 1984-09-29 15:00:00 (Sat)
  62585312400, #  local_start 1984-04-01 01:00:00 (Sun)
  62601033600, #    local_end 1984-09-30 00:00:00 (Sun)
  32400,
  1,
  '+09',
      ],
      [
  62601001200, #    utc_start 1984-09-29 15:00:00 (Sat)
  62616729600, #      utc_end 1985-03-30 16:00:00 (Sat)
  62601030000, #  local_start 1984-09-29 23:00:00 (Sat)
  62616758400, #    local_end 1985-03-31 00:00:00 (Sun)
  28800,
  0,
  '+08',
      ],
      [
  62616729600, #    utc_start 1985-03-30 16:00:00 (Sat)
  62632450800, #      utc_end 1985-09-28 15:00:00 (Sat)
  62616762000, #  local_start 1985-03-31 01:00:00 (Sun)
  62632483200, #    local_end 1985-09-29 00:00:00 (Sun)
  32400,
  1,
  '+09',
      ],
      [
  62632450800, #    utc_start 1985-09-28 15:00:00 (Sat)
  62648179200, #      utc_end 1986-03-29 16:00:00 (Sat)
  62632479600, #  local_start 1985-09-28 23:00:00 (Sat)
  62648208000, #    local_end 1986-03-30 00:00:00 (Sun)
  28800,
  0,
  '+08',
      ],
      [
  62648179200, #    utc_start 1986-03-29 16:00:00 (Sat)
  62663900400, #      utc_end 1986-09-27 15:00:00 (Sat)
  62648211600, #  local_start 1986-03-30 01:00:00 (Sun)
  62663932800, #    local_end 1986-09-28 00:00:00 (Sun)
  32400,
  1,
  '+09',
      ],
      [
  62663900400, #    utc_start 1986-09-27 15:00:00 (Sat)
  62679628800, #      utc_end 1987-03-28 16:00:00 (Sat)
  62663929200, #  local_start 1986-09-27 23:00:00 (Sat)
  62679657600, #    local_end 1987-03-29 00:00:00 (Sun)
  28800,
  0,
  '+08',
      ],
      [
  62679628800, #    utc_start 1987-03-28 16:00:00 (Sat)
  62695350000, #      utc_end 1987-09-26 15:00:00 (Sat)
  62679661200, #  local_start 1987-03-29 01:00:00 (Sun)
  62695382400, #    local_end 1987-09-27 00:00:00 (Sun)
  32400,
  1,
  '+09',
      ],
      [
  62695350000, #    utc_start 1987-09-26 15:00:00 (Sat)
  62711078400, #      utc_end 1988-03-26 16:00:00 (Sat)
  62695378800, #  local_start 1987-09-26 23:00:00 (Sat)
  62711107200, #    local_end 1988-03-27 00:00:00 (Sun)
  28800,
  0,
  '+08',
      ],
      [
  62711078400, #    utc_start 1988-03-26 16:00:00 (Sat)
  62726799600, #      utc_end 1988-09-24 15:00:00 (Sat)
  62711110800, #  local_start 1988-03-27 01:00:00 (Sun)
  62726832000, #    local_end 1988-09-25 00:00:00 (Sun)
  32400,
  1,
  '+09',
      ],
      [
  62726799600, #    utc_start 1988-09-24 15:00:00 (Sat)
  62742528000, #      utc_end 1989-03-25 16:00:00 (Sat)
  62726828400, #  local_start 1988-09-24 23:00:00 (Sat)
  62742556800, #    local_end 1989-03-26 00:00:00 (Sun)
  28800,
  0,
  '+08',
      ],
      [
  62742528000, #    utc_start 1989-03-25 16:00:00 (Sat)
  62758249200, #      utc_end 1989-09-23 15:00:00 (Sat)
  62742560400, #  local_start 1989-03-26 01:00:00 (Sun)
  62758281600, #    local_end 1989-09-24 00:00:00 (Sun)
  32400,
  1,
  '+09',
      ],
      [
  62758249200, #    utc_start 1989-09-23 15:00:00 (Sat)
  62773977600, #      utc_end 1990-03-24 16:00:00 (Sat)
  62758278000, #  local_start 1989-09-23 23:00:00 (Sat)
  62774006400, #    local_end 1990-03-25 00:00:00 (Sun)
  28800,
  0,
  '+08',
      ],
      [
  62773977600, #    utc_start 1990-03-24 16:00:00 (Sat)
  62790303600, #      utc_end 1990-09-29 15:00:00 (Sat)
  62774010000, #  local_start 1990-03-25 01:00:00 (Sun)
  62790336000, #    local_end 1990-09-30 00:00:00 (Sun)
  32400,
  1,
  '+09',
      ],
      [
  62790303600, #    utc_start 1990-09-29 15:00:00 (Sat)
  62806032000, #      utc_end 1991-03-30 16:00:00 (Sat)
  62790332400, #  local_start 1990-09-29 23:00:00 (Sat)
  62806060800, #    local_end 1991-03-31 00:00:00 (Sun)
  28800,
  0,
  '+08',
      ],
      [
  62806032000, #    utc_start 1991-03-30 16:00:00 (Sat)
  62821753200, #      utc_end 1991-09-28 15:00:00 (Sat)
  62806064400, #  local_start 1991-03-31 01:00:00 (Sun)
  62821785600, #    local_end 1991-09-29 00:00:00 (Sun)
  32400,
  1,
  '+09',
      ],
      [
  62821753200, #    utc_start 1991-09-28 15:00:00 (Sat)
  62837481600, #      utc_end 1992-03-28 16:00:00 (Sat)
  62821782000, #  local_start 1991-09-28 23:00:00 (Sat)
  62837510400, #    local_end 1992-03-29 00:00:00 (Sun)
  28800,
  0,
  '+08',
      ],
      [
  62837481600, #    utc_start 1992-03-28 16:00:00 (Sat)
  62853202800, #      utc_end 1992-09-26 15:00:00 (Sat)
  62837514000, #  local_start 1992-03-29 01:00:00 (Sun)
  62853235200, #    local_end 1992-09-27 00:00:00 (Sun)
  32400,
  1,
  '+09',
      ],
      [
  62853202800, #    utc_start 1992-09-26 15:00:00 (Sat)
  62868931200, #      utc_end 1993-03-27 16:00:00 (Sat)
  62853231600, #  local_start 1992-09-26 23:00:00 (Sat)
  62868960000, #    local_end 1993-03-28 00:00:00 (Sun)
  28800,
  0,
  '+08',
      ],
      [
  62868931200, #    utc_start 1993-03-27 16:00:00 (Sat)
  62884652400, #      utc_end 1993-09-25 15:00:00 (Sat)
  62868963600, #  local_start 1993-03-28 01:00:00 (Sun)
  62884684800, #    local_end 1993-09-26 00:00:00 (Sun)
  32400,
  1,
  '+09',
      ],
      [
  62884652400, #    utc_start 1993-09-25 15:00:00 (Sat)
  62900380800, #      utc_end 1994-03-26 16:00:00 (Sat)
  62884681200, #  local_start 1993-09-25 23:00:00 (Sat)
  62900409600, #    local_end 1994-03-27 00:00:00 (Sun)
  28800,
  0,
  '+08',
      ],
      [
  62900380800, #    utc_start 1994-03-26 16:00:00 (Sat)
  62916102000, #      utc_end 1994-09-24 15:00:00 (Sat)
  62900413200, #  local_start 1994-03-27 01:00:00 (Sun)
  62916134400, #    local_end 1994-09-25 00:00:00 (Sun)
  32400,
  1,
  '+09',
      ],
      [
  62916102000, #    utc_start 1994-09-24 15:00:00 (Sat)
  62931830400, #      utc_end 1995-03-25 16:00:00 (Sat)
  62916130800, #  local_start 1994-09-24 23:00:00 (Sat)
  62931859200, #    local_end 1995-03-26 00:00:00 (Sun)
  28800,
  0,
  '+08',
      ],
      [
  62931830400, #    utc_start 1995-03-25 16:00:00 (Sat)
  62947551600, #      utc_end 1995-09-23 15:00:00 (Sat)
  62931862800, #  local_start 1995-03-26 01:00:00 (Sun)
  62947584000, #    local_end 1995-09-24 00:00:00 (Sun)
  32400,
  1,
  '+09',
      ],
      [
  62947551600, #    utc_start 1995-09-23 15:00:00 (Sat)
  62963884800, #      utc_end 1996-03-30 16:00:00 (Sat)
  62947580400, #  local_start 1995-09-23 23:00:00 (Sat)
  62963913600, #    local_end 1996-03-31 00:00:00 (Sun)
  28800,
  0,
  '+08',
      ],
      [
  62963884800, #    utc_start 1996-03-30 16:00:00 (Sat)
  62979606000, #      utc_end 1996-09-28 15:00:00 (Sat)
  62963917200, #  local_start 1996-03-31 01:00:00 (Sun)
  62979638400, #    local_end 1996-09-29 00:00:00 (Sun)
  32400,
  1,
  '+09',
      ],
      [
  62979606000, #    utc_start 1996-09-28 15:00:00 (Sat)
  62995334400, #      utc_end 1997-03-29 16:00:00 (Sat)
  62979634800, #  local_start 1996-09-28 23:00:00 (Sat)
  62995363200, #    local_end 1997-03-30 00:00:00 (Sun)
  28800,
  0,
  '+08',
      ],
      [
  62995334400, #    utc_start 1997-03-29 16:00:00 (Sat)
  63011055600, #      utc_end 1997-09-27 15:00:00 (Sat)
  62995366800, #  local_start 1997-03-30 01:00:00 (Sun)
  63011088000, #    local_end 1997-09-28 00:00:00 (Sun)
  32400,
  1,
  '+09',
      ],
      [
  63011055600, #    utc_start 1997-09-27 15:00:00 (Sat)
  63026784000, #      utc_end 1998-03-28 16:00:00 (Sat)
  63011084400, #  local_start 1997-09-27 23:00:00 (Sat)
  63026812800, #    local_end 1998-03-29 00:00:00 (Sun)
  28800,
  0,
  '+08',
      ],
      [
  63026784000, #    utc_start 1998-03-28 16:00:00 (Sat)
  63042505200, #      utc_end 1998-09-26 15:00:00 (Sat)
  63026816400, #  local_start 1998-03-29 01:00:00 (Sun)
  63042537600, #    local_end 1998-09-27 00:00:00 (Sun)
  32400,
  1,
  '+09',
      ],
      [
  63042505200, #    utc_start 1998-09-26 15:00:00 (Sat)
  63124077600, #      utc_end 2001-04-27 18:00:00 (Fri)
  63042534000, #  local_start 1998-09-26 23:00:00 (Sat)
  63124106400, #    local_end 2001-04-28 02:00:00 (Sat)
  28800,
  0,
  '+08',
      ],
      [
  63124077600, #    utc_start 2001-04-27 18:00:00 (Fri)
  63137379600, #      utc_end 2001-09-28 17:00:00 (Fri)
  63124110000, #  local_start 2001-04-28 03:00:00 (Sat)
  63137412000, #    local_end 2001-09-29 02:00:00 (Sat)
  32400,
  1,
  '+09',
      ],
      [
  63137379600, #    utc_start 2001-09-28 17:00:00 (Fri)
  63153108000, #      utc_end 2002-03-29 18:00:00 (Fri)
  63137408400, #  local_start 2001-09-29 01:00:00 (Sat)
  63153136800, #    local_end 2002-03-30 02:00:00 (Sat)
  28800,
  0,
  '+08',
      ],
      [
  63153108000, #    utc_start 2002-03-29 18:00:00 (Fri)
  63168829200, #      utc_end 2002-09-27 17:00:00 (Fri)
  63153140400, #  local_start 2002-03-30 03:00:00 (Sat)
  63168861600, #    local_end 2002-09-28 02:00:00 (Sat)
  32400,
  1,
  '+09',
      ],
      [
  63168829200, #    utc_start 2002-09-27 17:00:00 (Fri)
  63184557600, #      utc_end 2003-03-28 18:00:00 (Fri)
  63168858000, #  local_start 2002-09-28 01:00:00 (Sat)
  63184586400, #    local_end 2003-03-29 02:00:00 (Sat)
  28800,
  0,
  '+08',
      ],
      [
  63184557600, #    utc_start 2003-03-28 18:00:00 (Fri)
  63200278800, #      utc_end 2003-09-26 17:00:00 (Fri)
  63184590000, #  local_start 2003-03-29 03:00:00 (Sat)
  63200311200, #    local_end 2003-09-27 02:00:00 (Sat)
  32400,
  1,
  '+09',
      ],
      [
  63200278800, #    utc_start 2003-09-26 17:00:00 (Fri)
  63216007200, #      utc_end 2004-03-26 18:00:00 (Fri)
  63200307600, #  local_start 2003-09-27 01:00:00 (Sat)
  63216036000, #    local_end 2004-03-27 02:00:00 (Sat)
  28800,
  0,
  '+08',
      ],
      [
  63216007200, #    utc_start 2004-03-26 18:00:00 (Fri)
  63231728400, #      utc_end 2004-09-24 17:00:00 (Fri)
  63216039600, #  local_start 2004-03-27 03:00:00 (Sat)
  63231760800, #    local_end 2004-09-25 02:00:00 (Sat)
  32400,
  1,
  '+09',
      ],
      [
  63231728400, #    utc_start 2004-09-24 17:00:00 (Fri)
  63247456800, #      utc_end 2005-03-25 18:00:00 (Fri)
  63231757200, #  local_start 2004-09-25 01:00:00 (Sat)
  63247485600, #    local_end 2005-03-26 02:00:00 (Sat)
  28800,
  0,
  '+08',
      ],
      [
  63247456800, #    utc_start 2005-03-25 18:00:00 (Fri)
  63263178000, #      utc_end 2005-09-23 17:00:00 (Fri)
  63247489200, #  local_start 2005-03-26 03:00:00 (Sat)
  63263210400, #    local_end 2005-09-24 02:00:00 (Sat)
  32400,
  1,
  '+09',
      ],
      [
  63263178000, #    utc_start 2005-09-23 17:00:00 (Fri)
  63278906400, #      utc_end 2006-03-24 18:00:00 (Fri)
  63263206800, #  local_start 2005-09-24 01:00:00 (Sat)
  63278935200, #    local_end 2006-03-25 02:00:00 (Sat)
  28800,
  0,
  '+08',
      ],
      [
  63278906400, #    utc_start 2006-03-24 18:00:00 (Fri)
  63295232400, #      utc_end 2006-09-29 17:00:00 (Fri)
  63278938800, #  local_start 2006-03-25 03:00:00 (Sat)
  63295264800, #    local_end 2006-09-30 02:00:00 (Sat)
  32400,
  1,
  '+09',
      ],
      [
  63295232400, #    utc_start 2006-09-29 17:00:00 (Fri)
  63563162400, #      utc_end 2015-03-27 18:00:00 (Fri)
  63295261200, #  local_start 2006-09-30 01:00:00 (Sat)
  63563191200, #    local_end 2015-03-28 02:00:00 (Sat)
  28800,
  0,
  '+08',
      ],
      [
  63563162400, #    utc_start 2015-03-27 18:00:00 (Fri)
  63578876400, #      utc_end 2015-09-25 15:00:00 (Fri)
  63563194800, #  local_start 2015-03-28 03:00:00 (Sat)
  63578908800, #    local_end 2015-09-26 00:00:00 (Sat)
  32400,
  1,
  '+09',
      ],
      [
  63578876400, #    utc_start 2015-09-25 15:00:00 (Fri)
  63594612000, #      utc_end 2016-03-25 18:00:00 (Fri)
  63578905200, #  local_start 2015-09-25 23:00:00 (Fri)
  63594640800, #    local_end 2016-03-26 02:00:00 (Sat)
  28800,
  0,
  '+08',
      ],
      [
  63594612000, #    utc_start 2016-03-25 18:00:00 (Fri)
  63610326000, #      utc_end 2016-09-23 15:00:00 (Fri)
  63594644400, #  local_start 2016-03-26 03:00:00 (Sat)
  63610358400, #    local_end 2016-09-24 00:00:00 (Sat)
  32400,
  1,
  '+09',
      ],
      [
  63610326000, #    utc_start 2016-09-23 15:00:00 (Fri)
  DateTime::TimeZone::INFINITY, #      utc_end
  63610354800, #  local_start 2016-09-23 23:00:00 (Fri)
  DateTime::TimeZone::INFINITY, #    local_end
  28800,
  0,
  '+08',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {24}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_ULAANBAATAR

    $main::fatpacked{"DateTime/TimeZone/Asia/Urumqi.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_URUMQI';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/asia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Urumqi;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Urumqi::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60810199780, #      utc_end 1927-12-31 18:09:40 (Sat)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60810220800, #    local_end 1928-01-01 00:00:00 (Sun)
  21020,
  0,
  'LMT',
      ],
      [
  60810199780, #    utc_start 1927-12-31 18:09:40 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  60810221380, #  local_start 1928-01-01 00:09:40 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  21600,
  0,
  '+06',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_URUMQI

    $main::fatpacked{"DateTime/TimeZone/Asia/Ust_Nera.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_UST_NERA';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Ust_Nera;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Ust_Nera::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60556256826, #      utc_end 1919-12-14 14:27:06 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60556291200, #    local_end 1919-12-15 00:00:00 (Mon)
  34374,
  0,
  'LMT',
      ],
      [
  60556256826, #    utc_start 1919-12-14 14:27:06 (Sun)
  60888124800, #      utc_end 1930-06-20 16:00:00 (Fri)
  60556285626, #  local_start 1919-12-14 22:27:06 (Sun)
  60888153600, #    local_end 1930-06-21 00:00:00 (Sat)
  28800,
  0,
  '+08',
      ],
      [
  60888124800, #    utc_start 1930-06-20 16:00:00 (Fri)
  62490582000, #      utc_end 1981-03-31 15:00:00 (Tue)
  60888157200, #  local_start 1930-06-21 01:00:00 (Sat)
  62490614400, #    local_end 1981-04-01 00:00:00 (Wed)
  32400,
  0,
  '+09',
      ],
      [
  62490582000, #    utc_start 1981-03-31 15:00:00 (Tue)
  62506382400, #      utc_end 1981-09-30 12:00:00 (Wed)
  62490625200, #  local_start 1981-04-01 03:00:00 (Wed)
  62506425600, #    local_end 1981-10-01 00:00:00 (Thu)
  43200,
  1,
  '+12',
      ],
      [
  62506382400, #    utc_start 1981-09-30 12:00:00 (Wed)
  62522110800, #      utc_end 1982-03-31 13:00:00 (Wed)
  62506422000, #  local_start 1981-09-30 23:00:00 (Wed)
  62522150400, #    local_end 1982-04-01 00:00:00 (Thu)
  39600,
  0,
  '+11',
      ],
      [
  62522110800, #    utc_start 1982-03-31 13:00:00 (Wed)
  62537918400, #      utc_end 1982-09-30 12:00:00 (Thu)
  62522154000, #  local_start 1982-04-01 01:00:00 (Thu)
  62537961600, #    local_end 1982-10-01 00:00:00 (Fri)
  43200,
  1,
  '+12',
      ],
      [
  62537918400, #    utc_start 1982-09-30 12:00:00 (Thu)
  62553646800, #      utc_end 1983-03-31 13:00:00 (Thu)
  62537958000, #  local_start 1982-09-30 23:00:00 (Thu)
  62553686400, #    local_end 1983-04-01 00:00:00 (Fri)
  39600,
  0,
  '+11',
      ],
      [
  62553646800, #    utc_start 1983-03-31 13:00:00 (Thu)
  62569454400, #      utc_end 1983-09-30 12:00:00 (Fri)
  62553690000, #  local_start 1983-04-01 01:00:00 (Fri)
  62569497600, #    local_end 1983-10-01 00:00:00 (Sat)
  43200,
  1,
  '+12',
      ],
      [
  62569454400, #    utc_start 1983-09-30 12:00:00 (Fri)
  62585269200, #      utc_end 1984-03-31 13:00:00 (Sat)
  62569494000, #  local_start 1983-09-30 23:00:00 (Fri)
  62585308800, #    local_end 1984-04-01 00:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62585269200, #    utc_start 1984-03-31 13:00:00 (Sat)
  62601001200, #      utc_end 1984-09-29 15:00:00 (Sat)
  62585312400, #  local_start 1984-04-01 01:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  62601001200, #    utc_start 1984-09-29 15:00:00 (Sat)
  62616726000, #      utc_end 1985-03-30 15:00:00 (Sat)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62616726000, #    utc_start 1985-03-30 15:00:00 (Sat)
  62632450800, #      utc_end 1985-09-28 15:00:00 (Sat)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  62632450800, #    utc_start 1985-09-28 15:00:00 (Sat)
  62648175600, #      utc_end 1986-03-29 15:00:00 (Sat)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62648175600, #    utc_start 1986-03-29 15:00:00 (Sat)
  62663900400, #      utc_end 1986-09-27 15:00:00 (Sat)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  62663900400, #    utc_start 1986-09-27 15:00:00 (Sat)
  62679625200, #      utc_end 1987-03-28 15:00:00 (Sat)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62679625200, #    utc_start 1987-03-28 15:00:00 (Sat)
  62695350000, #      utc_end 1987-09-26 15:00:00 (Sat)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  62695350000, #    utc_start 1987-09-26 15:00:00 (Sat)
  62711074800, #      utc_end 1988-03-26 15:00:00 (Sat)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62711074800, #    utc_start 1988-03-26 15:00:00 (Sat)
  62726799600, #      utc_end 1988-09-24 15:00:00 (Sat)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  62726799600, #    utc_start 1988-09-24 15:00:00 (Sat)
  62742524400, #      utc_end 1989-03-25 15:00:00 (Sat)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62742524400, #    utc_start 1989-03-25 15:00:00 (Sat)
  62758249200, #      utc_end 1989-09-23 15:00:00 (Sat)
  62742567600, #  local_start 1989-03-26 03:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  62758249200, #    utc_start 1989-09-23 15:00:00 (Sat)
  62773974000, #      utc_end 1990-03-24 15:00:00 (Sat)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62773974000, #    utc_start 1990-03-24 15:00:00 (Sat)
  62790303600, #      utc_end 1990-09-29 15:00:00 (Sat)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  62790303600, #    utc_start 1990-09-29 15:00:00 (Sat)
  62806028400, #      utc_end 1991-03-30 15:00:00 (Sat)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62806028400, #    utc_start 1991-03-30 15:00:00 (Sat)
  62821756800, #      utc_end 1991-09-28 16:00:00 (Sat)
  62806068000, #  local_start 1991-03-31 02:00:00 (Sun)
  62821796400, #    local_end 1991-09-29 03:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  62821756800, #    utc_start 1991-09-28 16:00:00 (Sat)
  62831433600, #      utc_end 1992-01-18 16:00:00 (Sat)
  62821792800, #  local_start 1991-09-29 02:00:00 (Sun)
  62831469600, #    local_end 1992-01-19 02:00:00 (Sun)
  36000,
  0,
  '+10',
      ],
      [
  62831433600, #    utc_start 1992-01-18 16:00:00 (Sat)
  62837478000, #      utc_end 1992-03-28 15:00:00 (Sat)
  62831473200, #  local_start 1992-01-19 03:00:00 (Sun)
  62837517600, #    local_end 1992-03-29 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62837478000, #    utc_start 1992-03-28 15:00:00 (Sat)
  62853202800, #      utc_end 1992-09-26 15:00:00 (Sat)
  62837521200, #  local_start 1992-03-29 03:00:00 (Sun)
  62853246000, #    local_end 1992-09-27 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  62853202800, #    utc_start 1992-09-26 15:00:00 (Sat)
  62868927600, #      utc_end 1993-03-27 15:00:00 (Sat)
  62853242400, #  local_start 1992-09-27 02:00:00 (Sun)
  62868967200, #    local_end 1993-03-28 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62868927600, #    utc_start 1993-03-27 15:00:00 (Sat)
  62884652400, #      utc_end 1993-09-25 15:00:00 (Sat)
  62868970800, #  local_start 1993-03-28 03:00:00 (Sun)
  62884695600, #    local_end 1993-09-26 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  62884652400, #    utc_start 1993-09-25 15:00:00 (Sat)
  62900377200, #      utc_end 1994-03-26 15:00:00 (Sat)
  62884692000, #  local_start 1993-09-26 02:00:00 (Sun)
  62900416800, #    local_end 1994-03-27 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62900377200, #    utc_start 1994-03-26 15:00:00 (Sat)
  62916102000, #      utc_end 1994-09-24 15:00:00 (Sat)
  62900420400, #  local_start 1994-03-27 03:00:00 (Sun)
  62916145200, #    local_end 1994-09-25 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  62916102000, #    utc_start 1994-09-24 15:00:00 (Sat)
  62931826800, #      utc_end 1995-03-25 15:00:00 (Sat)
  62916141600, #  local_start 1994-09-25 02:00:00 (Sun)
  62931866400, #    local_end 1995-03-26 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62931826800, #    utc_start 1995-03-25 15:00:00 (Sat)
  62947551600, #      utc_end 1995-09-23 15:00:00 (Sat)
  62931870000, #  local_start 1995-03-26 03:00:00 (Sun)
  62947594800, #    local_end 1995-09-24 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  62947551600, #    utc_start 1995-09-23 15:00:00 (Sat)
  62963881200, #      utc_end 1996-03-30 15:00:00 (Sat)
  62947591200, #  local_start 1995-09-24 02:00:00 (Sun)
  62963920800, #    local_end 1996-03-31 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62963881200, #    utc_start 1996-03-30 15:00:00 (Sat)
  62982025200, #      utc_end 1996-10-26 15:00:00 (Sat)
  62963924400, #  local_start 1996-03-31 03:00:00 (Sun)
  62982068400, #    local_end 1996-10-27 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  62982025200, #    utc_start 1996-10-26 15:00:00 (Sat)
  62995330800, #      utc_end 1997-03-29 15:00:00 (Sat)
  62982064800, #  local_start 1996-10-27 02:00:00 (Sun)
  62995370400, #    local_end 1997-03-30 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62995330800, #    utc_start 1997-03-29 15:00:00 (Sat)
  63013474800, #      utc_end 1997-10-25 15:00:00 (Sat)
  62995374000, #  local_start 1997-03-30 03:00:00 (Sun)
  63013518000, #    local_end 1997-10-26 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  63013474800, #    utc_start 1997-10-25 15:00:00 (Sat)
  63026780400, #      utc_end 1998-03-28 15:00:00 (Sat)
  63013514400, #  local_start 1997-10-26 02:00:00 (Sun)
  63026820000, #    local_end 1998-03-29 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  63026780400, #    utc_start 1998-03-28 15:00:00 (Sat)
  63044924400, #      utc_end 1998-10-24 15:00:00 (Sat)
  63026823600, #  local_start 1998-03-29 03:00:00 (Sun)
  63044967600, #    local_end 1998-10-25 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  63044924400, #    utc_start 1998-10-24 15:00:00 (Sat)
  63058230000, #      utc_end 1999-03-27 15:00:00 (Sat)
  63044964000, #  local_start 1998-10-25 02:00:00 (Sun)
  63058269600, #    local_end 1999-03-28 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  63058230000, #    utc_start 1999-03-27 15:00:00 (Sat)
  63076978800, #      utc_end 1999-10-30 15:00:00 (Sat)
  63058273200, #  local_start 1999-03-28 03:00:00 (Sun)
  63077022000, #    local_end 1999-10-31 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  63076978800, #    utc_start 1999-10-30 15:00:00 (Sat)
  63089679600, #      utc_end 2000-03-25 15:00:00 (Sat)
  63077018400, #  local_start 1999-10-31 02:00:00 (Sun)
  63089719200, #    local_end 2000-03-26 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  63089679600, #    utc_start 2000-03-25 15:00:00 (Sat)
  63108428400, #      utc_end 2000-10-28 15:00:00 (Sat)
  63089722800, #  local_start 2000-03-26 03:00:00 (Sun)
  63108471600, #    local_end 2000-10-29 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  63108428400, #    utc_start 2000-10-28 15:00:00 (Sat)
  63121129200, #      utc_end 2001-03-24 15:00:00 (Sat)
  63108468000, #  local_start 2000-10-29 02:00:00 (Sun)
  63121168800, #    local_end 2001-03-25 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  63121129200, #    utc_start 2001-03-24 15:00:00 (Sat)
  63139878000, #      utc_end 2001-10-27 15:00:00 (Sat)
  63121172400, #  local_start 2001-03-25 03:00:00 (Sun)
  63139921200, #    local_end 2001-10-28 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  63139878000, #    utc_start 2001-10-27 15:00:00 (Sat)
  63153183600, #      utc_end 2002-03-30 15:00:00 (Sat)
  63139917600, #  local_start 2001-10-28 02:00:00 (Sun)
  63153223200, #    local_end 2002-03-31 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  63153183600, #    utc_start 2002-03-30 15:00:00 (Sat)
  63171327600, #      utc_end 2002-10-26 15:00:00 (Sat)
  63153226800, #  local_start 2002-03-31 03:00:00 (Sun)
  63171370800, #    local_end 2002-10-27 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  63171327600, #    utc_start 2002-10-26 15:00:00 (Sat)
  63184633200, #      utc_end 2003-03-29 15:00:00 (Sat)
  63171367200, #  local_start 2002-10-27 02:00:00 (Sun)
  63184672800, #    local_end 2003-03-30 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  63184633200, #    utc_start 2003-03-29 15:00:00 (Sat)
  63202777200, #      utc_end 2003-10-25 15:00:00 (Sat)
  63184676400, #  local_start 2003-03-30 03:00:00 (Sun)
  63202820400, #    local_end 2003-10-26 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  63202777200, #    utc_start 2003-10-25 15:00:00 (Sat)
  63216082800, #      utc_end 2004-03-27 15:00:00 (Sat)
  63202816800, #  local_start 2003-10-26 02:00:00 (Sun)
  63216122400, #    local_end 2004-03-28 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  63216082800, #    utc_start 2004-03-27 15:00:00 (Sat)
  63234831600, #      utc_end 2004-10-30 15:00:00 (Sat)
  63216126000, #  local_start 2004-03-28 03:00:00 (Sun)
  63234874800, #    local_end 2004-10-31 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  63234831600, #    utc_start 2004-10-30 15:00:00 (Sat)
  63247532400, #      utc_end 2005-03-26 15:00:00 (Sat)
  63234871200, #  local_start 2004-10-31 02:00:00 (Sun)
  63247572000, #    local_end 2005-03-27 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  63247532400, #    utc_start 2005-03-26 15:00:00 (Sat)
  63266281200, #      utc_end 2005-10-29 15:00:00 (Sat)
  63247575600, #  local_start 2005-03-27 03:00:00 (Sun)
  63266324400, #    local_end 2005-10-30 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  63266281200, #    utc_start 2005-10-29 15:00:00 (Sat)
  63278982000, #      utc_end 2006-03-25 15:00:00 (Sat)
  63266320800, #  local_start 2005-10-30 02:00:00 (Sun)
  63279021600, #    local_end 2006-03-26 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  63278982000, #    utc_start 2006-03-25 15:00:00 (Sat)
  63297730800, #      utc_end 2006-10-28 15:00:00 (Sat)
  63279025200, #  local_start 2006-03-26 03:00:00 (Sun)
  63297774000, #    local_end 2006-10-29 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  63297730800, #    utc_start 2006-10-28 15:00:00 (Sat)
  63310431600, #      utc_end 2007-03-24 15:00:00 (Sat)
  63297770400, #  local_start 2006-10-29 02:00:00 (Sun)
  63310471200, #    local_end 2007-03-25 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  63310431600, #    utc_start 2007-03-24 15:00:00 (Sat)
  63329180400, #      utc_end 2007-10-27 15:00:00 (Sat)
  63310474800, #  local_start 2007-03-25 03:00:00 (Sun)
  63329223600, #    local_end 2007-10-28 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  63329180400, #    utc_start 2007-10-27 15:00:00 (Sat)
  63342486000, #      utc_end 2008-03-29 15:00:00 (Sat)
  63329220000, #  local_start 2007-10-28 02:00:00 (Sun)
  63342525600, #    local_end 2008-03-30 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  63342486000, #    utc_start 2008-03-29 15:00:00 (Sat)
  63360630000, #      utc_end 2008-10-25 15:00:00 (Sat)
  63342529200, #  local_start 2008-03-30 03:00:00 (Sun)
  63360673200, #    local_end 2008-10-26 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  63360630000, #    utc_start 2008-10-25 15:00:00 (Sat)
  63373935600, #      utc_end 2009-03-28 15:00:00 (Sat)
  63360669600, #  local_start 2008-10-26 02:00:00 (Sun)
  63373975200, #    local_end 2009-03-29 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  63373935600, #    utc_start 2009-03-28 15:00:00 (Sat)
  63392079600, #      utc_end 2009-10-24 15:00:00 (Sat)
  63373978800, #  local_start 2009-03-29 03:00:00 (Sun)
  63392122800, #    local_end 2009-10-25 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  63392079600, #    utc_start 2009-10-24 15:00:00 (Sat)
  63405385200, #      utc_end 2010-03-27 15:00:00 (Sat)
  63392119200, #  local_start 2009-10-25 02:00:00 (Sun)
  63405424800, #    local_end 2010-03-28 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  63405385200, #    utc_start 2010-03-27 15:00:00 (Sat)
  63424134000, #      utc_end 2010-10-30 15:00:00 (Sat)
  63405428400, #  local_start 2010-03-28 03:00:00 (Sun)
  63424177200, #    local_end 2010-10-31 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  63424134000, #    utc_start 2010-10-30 15:00:00 (Sat)
  63436834800, #      utc_end 2011-03-26 15:00:00 (Sat)
  63424173600, #  local_start 2010-10-31 02:00:00 (Sun)
  63436874400, #    local_end 2011-03-27 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  63436834800, #    utc_start 2011-03-26 15:00:00 (Sat)
  63451512000, #      utc_end 2011-09-12 12:00:00 (Mon)
  63436878000, #  local_start 2011-03-27 03:00:00 (Sun)
  63451555200, #    local_end 2011-09-13 00:00:00 (Tue)
  43200,
  0,
  '+12',
      ],
      [
  63451512000, #    utc_start 2011-09-12 12:00:00 (Mon)
  63549932400, #      utc_end 2014-10-25 15:00:00 (Sat)
  63451551600, #  local_start 2011-09-12 23:00:00 (Mon)
  63549972000, #    local_end 2014-10-26 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  63549932400, #    utc_start 2014-10-25 15:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  63549968400, #  local_start 2014-10-26 01:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  36000,
  0,
  '+10',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {30}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_UST_NERA

    $main::fatpacked{"DateTime/TimeZone/Asia/Vladivostok.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_VLADIVOSTOK';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Vladivostok;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Vladivostok::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60648361949, #      utc_end 1922-11-14 15:12:29 (Tue)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60648393600, #    local_end 1922-11-15 00:00:00 (Wed)
  31651,
  0,
  'LMT',
      ],
      [
  60648361949, #    utc_start 1922-11-14 15:12:29 (Tue)
  60888121200, #      utc_end 1930-06-20 15:00:00 (Fri)
  60648394349, #  local_start 1922-11-15 00:12:29 (Wed)
  60888153600, #    local_end 1930-06-21 00:00:00 (Sat)
  32400,
  0,
  '+09',
      ],
      [
  60888121200, #    utc_start 1930-06-20 15:00:00 (Fri)
  62490578400, #      utc_end 1981-03-31 14:00:00 (Tue)
  60888157200, #  local_start 1930-06-21 01:00:00 (Sat)
  62490614400, #    local_end 1981-04-01 00:00:00 (Wed)
  36000,
  0,
  '+10',
      ],
      [
  62490578400, #    utc_start 1981-03-31 14:00:00 (Tue)
  62506386000, #      utc_end 1981-09-30 13:00:00 (Wed)
  62490618000, #  local_start 1981-04-01 01:00:00 (Wed)
  62506425600, #    local_end 1981-10-01 00:00:00 (Thu)
  39600,
  1,
  '+11',
      ],
      [
  62506386000, #    utc_start 1981-09-30 13:00:00 (Wed)
  62522114400, #      utc_end 1982-03-31 14:00:00 (Wed)
  62506422000, #  local_start 1981-09-30 23:00:00 (Wed)
  62522150400, #    local_end 1982-04-01 00:00:00 (Thu)
  36000,
  0,
  '+10',
      ],
      [
  62522114400, #    utc_start 1982-03-31 14:00:00 (Wed)
  62537922000, #      utc_end 1982-09-30 13:00:00 (Thu)
  62522154000, #  local_start 1982-04-01 01:00:00 (Thu)
  62537961600, #    local_end 1982-10-01 00:00:00 (Fri)
  39600,
  1,
  '+11',
      ],
      [
  62537922000, #    utc_start 1982-09-30 13:00:00 (Thu)
  62553650400, #      utc_end 1983-03-31 14:00:00 (Thu)
  62537958000, #  local_start 1982-09-30 23:00:00 (Thu)
  62553686400, #    local_end 1983-04-01 00:00:00 (Fri)
  36000,
  0,
  '+10',
      ],
      [
  62553650400, #    utc_start 1983-03-31 14:00:00 (Thu)
  62569458000, #      utc_end 1983-09-30 13:00:00 (Fri)
  62553690000, #  local_start 1983-04-01 01:00:00 (Fri)
  62569497600, #    local_end 1983-10-01 00:00:00 (Sat)
  39600,
  1,
  '+11',
      ],
      [
  62569458000, #    utc_start 1983-09-30 13:00:00 (Fri)
  62585272800, #      utc_end 1984-03-31 14:00:00 (Sat)
  62569494000, #  local_start 1983-09-30 23:00:00 (Fri)
  62585308800, #    local_end 1984-04-01 00:00:00 (Sun)
  36000,
  0,
  '+10',
      ],
      [
  62585272800, #    utc_start 1984-03-31 14:00:00 (Sat)
  62601004800, #      utc_end 1984-09-29 16:00:00 (Sat)
  62585312400, #  local_start 1984-04-01 01:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  62601004800, #    utc_start 1984-09-29 16:00:00 (Sat)
  62616729600, #      utc_end 1985-03-30 16:00:00 (Sat)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  36000,
  0,
  '+10',
      ],
      [
  62616729600, #    utc_start 1985-03-30 16:00:00 (Sat)
  62632454400, #      utc_end 1985-09-28 16:00:00 (Sat)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  62632454400, #    utc_start 1985-09-28 16:00:00 (Sat)
  62648179200, #      utc_end 1986-03-29 16:00:00 (Sat)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  36000,
  0,
  '+10',
      ],
      [
  62648179200, #    utc_start 1986-03-29 16:00:00 (Sat)
  62663904000, #      utc_end 1986-09-27 16:00:00 (Sat)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  62663904000, #    utc_start 1986-09-27 16:00:00 (Sat)
  62679628800, #      utc_end 1987-03-28 16:00:00 (Sat)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  36000,
  0,
  '+10',
      ],
      [
  62679628800, #    utc_start 1987-03-28 16:00:00 (Sat)
  62695353600, #      utc_end 1987-09-26 16:00:00 (Sat)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  62695353600, #    utc_start 1987-09-26 16:00:00 (Sat)
  62711078400, #      utc_end 1988-03-26 16:00:00 (Sat)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  36000,
  0,
  '+10',
      ],
      [
  62711078400, #    utc_start 1988-03-26 16:00:00 (Sat)
  62726803200, #      utc_end 1988-09-24 16:00:00 (Sat)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  62726803200, #    utc_start 1988-09-24 16:00:00 (Sat)
  62742528000, #      utc_end 1989-03-25 16:00:00 (Sat)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  36000,
  0,
  '+10',
      ],
      [
  62742528000, #    utc_start 1989-03-25 16:00:00 (Sat)
  62758252800, #      utc_end 1989-09-23 16:00:00 (Sat)
  62742567600, #  local_start 1989-03-26 03:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  62758252800, #    utc_start 1989-09-23 16:00:00 (Sat)
  62773977600, #      utc_end 1990-03-24 16:00:00 (Sat)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  36000,
  0,
  '+10',
      ],
      [
  62773977600, #    utc_start 1990-03-24 16:00:00 (Sat)
  62790307200, #      utc_end 1990-09-29 16:00:00 (Sat)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  62790307200, #    utc_start 1990-09-29 16:00:00 (Sat)
  62806032000, #      utc_end 1991-03-30 16:00:00 (Sat)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  36000,
  0,
  '+10',
      ],
      [
  62806032000, #    utc_start 1991-03-30 16:00:00 (Sat)
  62821760400, #      utc_end 1991-09-28 17:00:00 (Sat)
  62806068000, #  local_start 1991-03-31 02:00:00 (Sun)
  62821796400, #    local_end 1991-09-29 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  62821760400, #    utc_start 1991-09-28 17:00:00 (Sat)
  62831437200, #      utc_end 1992-01-18 17:00:00 (Sat)
  62821792800, #  local_start 1991-09-29 02:00:00 (Sun)
  62831469600, #    local_end 1992-01-19 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  62831437200, #    utc_start 1992-01-18 17:00:00 (Sat)
  62837481600, #      utc_end 1992-03-28 16:00:00 (Sat)
  62831473200, #  local_start 1992-01-19 03:00:00 (Sun)
  62837517600, #    local_end 1992-03-29 02:00:00 (Sun)
  36000,
  0,
  '+10',
      ],
      [
  62837481600, #    utc_start 1992-03-28 16:00:00 (Sat)
  62853206400, #      utc_end 1992-09-26 16:00:00 (Sat)
  62837521200, #  local_start 1992-03-29 03:00:00 (Sun)
  62853246000, #    local_end 1992-09-27 03:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  62853206400, #    utc_start 1992-09-26 16:00:00 (Sat)
  62868931200, #      utc_end 1993-03-27 16:00:00 (Sat)
  62853242400, #  local_start 1992-09-27 02:00:00 (Sun)
  62868967200, #    local_end 1993-03-28 02:00:00 (Sun)
  36000,
  0,
  '+10',
      ],
      [
  62868931200, #    utc_start 1993-03-27 16:00:00 (Sat)
  62884656000, #      utc_end 1993-09-25 16:00:00 (Sat)
  62868970800, #  local_start 1993-03-28 03:00:00 (Sun)
  62884695600, #    local_end 1993-09-26 03:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  62884656000, #    utc_start 1993-09-25 16:00:00 (Sat)
  62900380800, #      utc_end 1994-03-26 16:00:00 (Sat)
  62884692000, #  local_start 1993-09-26 02:00:00 (Sun)
  62900416800, #    local_end 1994-03-27 02:00:00 (Sun)
  36000,
  0,
  '+10',
      ],
      [
  62900380800, #    utc_start 1994-03-26 16:00:00 (Sat)
  62916105600, #      utc_end 1994-09-24 16:00:00 (Sat)
  62900420400, #  local_start 1994-03-27 03:00:00 (Sun)
  62916145200, #    local_end 1994-09-25 03:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  62916105600, #    utc_start 1994-09-24 16:00:00 (Sat)
  62931830400, #      utc_end 1995-03-25 16:00:00 (Sat)
  62916141600, #  local_start 1994-09-25 02:00:00 (Sun)
  62931866400, #    local_end 1995-03-26 02:00:00 (Sun)
  36000,
  0,
  '+10',
      ],
      [
  62931830400, #    utc_start 1995-03-25 16:00:00 (Sat)
  62947555200, #      utc_end 1995-09-23 16:00:00 (Sat)
  62931870000, #  local_start 1995-03-26 03:00:00 (Sun)
  62947594800, #    local_end 1995-09-24 03:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  62947555200, #    utc_start 1995-09-23 16:00:00 (Sat)
  62963884800, #      utc_end 1996-03-30 16:00:00 (Sat)
  62947591200, #  local_start 1995-09-24 02:00:00 (Sun)
  62963920800, #    local_end 1996-03-31 02:00:00 (Sun)
  36000,
  0,
  '+10',
      ],
      [
  62963884800, #    utc_start 1996-03-30 16:00:00 (Sat)
  62982028800, #      utc_end 1996-10-26 16:00:00 (Sat)
  62963924400, #  local_start 1996-03-31 03:00:00 (Sun)
  62982068400, #    local_end 1996-10-27 03:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  62982028800, #    utc_start 1996-10-26 16:00:00 (Sat)
  62995334400, #      utc_end 1997-03-29 16:00:00 (Sat)
  62982064800, #  local_start 1996-10-27 02:00:00 (Sun)
  62995370400, #    local_end 1997-03-30 02:00:00 (Sun)
  36000,
  0,
  '+10',
      ],
      [
  62995334400, #    utc_start 1997-03-29 16:00:00 (Sat)
  63013478400, #      utc_end 1997-10-25 16:00:00 (Sat)
  62995374000, #  local_start 1997-03-30 03:00:00 (Sun)
  63013518000, #    local_end 1997-10-26 03:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  63013478400, #    utc_start 1997-10-25 16:00:00 (Sat)
  63026784000, #      utc_end 1998-03-28 16:00:00 (Sat)
  63013514400, #  local_start 1997-10-26 02:00:00 (Sun)
  63026820000, #    local_end 1998-03-29 02:00:00 (Sun)
  36000,
  0,
  '+10',
      ],
      [
  63026784000, #    utc_start 1998-03-28 16:00:00 (Sat)
  63044928000, #      utc_end 1998-10-24 16:00:00 (Sat)
  63026823600, #  local_start 1998-03-29 03:00:00 (Sun)
  63044967600, #    local_end 1998-10-25 03:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  63044928000, #    utc_start 1998-10-24 16:00:00 (Sat)
  63058233600, #      utc_end 1999-03-27 16:00:00 (Sat)
  63044964000, #  local_start 1998-10-25 02:00:00 (Sun)
  63058269600, #    local_end 1999-03-28 02:00:00 (Sun)
  36000,
  0,
  '+10',
      ],
      [
  63058233600, #    utc_start 1999-03-27 16:00:00 (Sat)
  63076982400, #      utc_end 1999-10-30 16:00:00 (Sat)
  63058273200, #  local_start 1999-03-28 03:00:00 (Sun)
  63077022000, #    local_end 1999-10-31 03:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  63076982400, #    utc_start 1999-10-30 16:00:00 (Sat)
  63089683200, #      utc_end 2000-03-25 16:00:00 (Sat)
  63077018400, #  local_start 1999-10-31 02:00:00 (Sun)
  63089719200, #    local_end 2000-03-26 02:00:00 (Sun)
  36000,
  0,
  '+10',
      ],
      [
  63089683200, #    utc_start 2000-03-25 16:00:00 (Sat)
  63108432000, #      utc_end 2000-10-28 16:00:00 (Sat)
  63089722800, #  local_start 2000-03-26 03:00:00 (Sun)
  63108471600, #    local_end 2000-10-29 03:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  63108432000, #    utc_start 2000-10-28 16:00:00 (Sat)
  63121132800, #      utc_end 2001-03-24 16:00:00 (Sat)
  63108468000, #  local_start 2000-10-29 02:00:00 (Sun)
  63121168800, #    local_end 2001-03-25 02:00:00 (Sun)
  36000,
  0,
  '+10',
      ],
      [
  63121132800, #    utc_start 2001-03-24 16:00:00 (Sat)
  63139881600, #      utc_end 2001-10-27 16:00:00 (Sat)
  63121172400, #  local_start 2001-03-25 03:00:00 (Sun)
  63139921200, #    local_end 2001-10-28 03:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  63139881600, #    utc_start 2001-10-27 16:00:00 (Sat)
  63153187200, #      utc_end 2002-03-30 16:00:00 (Sat)
  63139917600, #  local_start 2001-10-28 02:00:00 (Sun)
  63153223200, #    local_end 2002-03-31 02:00:00 (Sun)
  36000,
  0,
  '+10',
      ],
      [
  63153187200, #    utc_start 2002-03-30 16:00:00 (Sat)
  63171331200, #      utc_end 2002-10-26 16:00:00 (Sat)
  63153226800, #  local_start 2002-03-31 03:00:00 (Sun)
  63171370800, #    local_end 2002-10-27 03:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  63171331200, #    utc_start 2002-10-26 16:00:00 (Sat)
  63184636800, #      utc_end 2003-03-29 16:00:00 (Sat)
  63171367200, #  local_start 2002-10-27 02:00:00 (Sun)
  63184672800, #    local_end 2003-03-30 02:00:00 (Sun)
  36000,
  0,
  '+10',
      ],
      [
  63184636800, #    utc_start 2003-03-29 16:00:00 (Sat)
  63202780800, #      utc_end 2003-10-25 16:00:00 (Sat)
  63184676400, #  local_start 2003-03-30 03:00:00 (Sun)
  63202820400, #    local_end 2003-10-26 03:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  63202780800, #    utc_start 2003-10-25 16:00:00 (Sat)
  63216086400, #      utc_end 2004-03-27 16:00:00 (Sat)
  63202816800, #  local_start 2003-10-26 02:00:00 (Sun)
  63216122400, #    local_end 2004-03-28 02:00:00 (Sun)
  36000,
  0,
  '+10',
      ],
      [
  63216086400, #    utc_start 2004-03-27 16:00:00 (Sat)
  63234835200, #      utc_end 2004-10-30 16:00:00 (Sat)
  63216126000, #  local_start 2004-03-28 03:00:00 (Sun)
  63234874800, #    local_end 2004-10-31 03:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  63234835200, #    utc_start 2004-10-30 16:00:00 (Sat)
  63247536000, #      utc_end 2005-03-26 16:00:00 (Sat)
  63234871200, #  local_start 2004-10-31 02:00:00 (Sun)
  63247572000, #    local_end 2005-03-27 02:00:00 (Sun)
  36000,
  0,
  '+10',
      ],
      [
  63247536000, #    utc_start 2005-03-26 16:00:00 (Sat)
  63266284800, #      utc_end 2005-10-29 16:00:00 (Sat)
  63247575600, #  local_start 2005-03-27 03:00:00 (Sun)
  63266324400, #    local_end 2005-10-30 03:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  63266284800, #    utc_start 2005-10-29 16:00:00 (Sat)
  63278985600, #      utc_end 2006-03-25 16:00:00 (Sat)
  63266320800, #  local_start 2005-10-30 02:00:00 (Sun)
  63279021600, #    local_end 2006-03-26 02:00:00 (Sun)
  36000,
  0,
  '+10',
      ],
      [
  63278985600, #    utc_start 2006-03-25 16:00:00 (Sat)
  63297734400, #      utc_end 2006-10-28 16:00:00 (Sat)
  63279025200, #  local_start 2006-03-26 03:00:00 (Sun)
  63297774000, #    local_end 2006-10-29 03:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  63297734400, #    utc_start 2006-10-28 16:00:00 (Sat)
  63310435200, #      utc_end 2007-03-24 16:00:00 (Sat)
  63297770400, #  local_start 2006-10-29 02:00:00 (Sun)
  63310471200, #    local_end 2007-03-25 02:00:00 (Sun)
  36000,
  0,
  '+10',
      ],
      [
  63310435200, #    utc_start 2007-03-24 16:00:00 (Sat)
  63329184000, #      utc_end 2007-10-27 16:00:00 (Sat)
  63310474800, #  local_start 2007-03-25 03:00:00 (Sun)
  63329223600, #    local_end 2007-10-28 03:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  63329184000, #    utc_start 2007-10-27 16:00:00 (Sat)
  63342489600, #      utc_end 2008-03-29 16:00:00 (Sat)
  63329220000, #  local_start 2007-10-28 02:00:00 (Sun)
  63342525600, #    local_end 2008-03-30 02:00:00 (Sun)
  36000,
  0,
  '+10',
      ],
      [
  63342489600, #    utc_start 2008-03-29 16:00:00 (Sat)
  63360633600, #      utc_end 2008-10-25 16:00:00 (Sat)
  63342529200, #  local_start 2008-03-30 03:00:00 (Sun)
  63360673200, #    local_end 2008-10-26 03:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  63360633600, #    utc_start 2008-10-25 16:00:00 (Sat)
  63373939200, #      utc_end 2009-03-28 16:00:00 (Sat)
  63360669600, #  local_start 2008-10-26 02:00:00 (Sun)
  63373975200, #    local_end 2009-03-29 02:00:00 (Sun)
  36000,
  0,
  '+10',
      ],
      [
  63373939200, #    utc_start 2009-03-28 16:00:00 (Sat)
  63392083200, #      utc_end 2009-10-24 16:00:00 (Sat)
  63373978800, #  local_start 2009-03-29 03:00:00 (Sun)
  63392122800, #    local_end 2009-10-25 03:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  63392083200, #    utc_start 2009-10-24 16:00:00 (Sat)
  63405388800, #      utc_end 2010-03-27 16:00:00 (Sat)
  63392119200, #  local_start 2009-10-25 02:00:00 (Sun)
  63405424800, #    local_end 2010-03-28 02:00:00 (Sun)
  36000,
  0,
  '+10',
      ],
      [
  63405388800, #    utc_start 2010-03-27 16:00:00 (Sat)
  63424137600, #      utc_end 2010-10-30 16:00:00 (Sat)
  63405428400, #  local_start 2010-03-28 03:00:00 (Sun)
  63424177200, #    local_end 2010-10-31 03:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  63424137600, #    utc_start 2010-10-30 16:00:00 (Sat)
  63436838400, #      utc_end 2011-03-26 16:00:00 (Sat)
  63424173600, #  local_start 2010-10-31 02:00:00 (Sun)
  63436874400, #    local_end 2011-03-27 02:00:00 (Sun)
  36000,
  0,
  '+10',
      ],
      [
  63436838400, #    utc_start 2011-03-26 16:00:00 (Sat)
  63549932400, #      utc_end 2014-10-25 15:00:00 (Sat)
  63436878000, #  local_start 2011-03-27 03:00:00 (Sun)
  63549972000, #    local_end 2014-10-26 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  63549932400, #    utc_start 2014-10-25 15:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  63549968400, #  local_start 2014-10-26 01:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  36000,
  0,
  '+10',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {30}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_VLADIVOSTOK

    $main::fatpacked{"DateTime/TimeZone/Asia/Yakutsk.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_YAKUTSK';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Yakutsk;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Yakutsk::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60556260062, #      utc_end 1919-12-14 15:21:02 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60556291200, #    local_end 1919-12-15 00:00:00 (Mon)
  31138,
  0,
  'LMT',
      ],
      [
  60556260062, #    utc_start 1919-12-14 15:21:02 (Sun)
  60888124800, #      utc_end 1930-06-20 16:00:00 (Fri)
  60556288862, #  local_start 1919-12-14 23:21:02 (Sun)
  60888153600, #    local_end 1930-06-21 00:00:00 (Sat)
  28800,
  0,
  '+08',
      ],
      [
  60888124800, #    utc_start 1930-06-20 16:00:00 (Fri)
  62490582000, #      utc_end 1981-03-31 15:00:00 (Tue)
  60888157200, #  local_start 1930-06-21 01:00:00 (Sat)
  62490614400, #    local_end 1981-04-01 00:00:00 (Wed)
  32400,
  0,
  '+09',
      ],
      [
  62490582000, #    utc_start 1981-03-31 15:00:00 (Tue)
  62506389600, #      utc_end 1981-09-30 14:00:00 (Wed)
  62490618000, #  local_start 1981-04-01 01:00:00 (Wed)
  62506425600, #    local_end 1981-10-01 00:00:00 (Thu)
  36000,
  1,
  '+10',
      ],
      [
  62506389600, #    utc_start 1981-09-30 14:00:00 (Wed)
  62522118000, #      utc_end 1982-03-31 15:00:00 (Wed)
  62506422000, #  local_start 1981-09-30 23:00:00 (Wed)
  62522150400, #    local_end 1982-04-01 00:00:00 (Thu)
  32400,
  0,
  '+09',
      ],
      [
  62522118000, #    utc_start 1982-03-31 15:00:00 (Wed)
  62537925600, #      utc_end 1982-09-30 14:00:00 (Thu)
  62522154000, #  local_start 1982-04-01 01:00:00 (Thu)
  62537961600, #    local_end 1982-10-01 00:00:00 (Fri)
  36000,
  1,
  '+10',
      ],
      [
  62537925600, #    utc_start 1982-09-30 14:00:00 (Thu)
  62553654000, #      utc_end 1983-03-31 15:00:00 (Thu)
  62537958000, #  local_start 1982-09-30 23:00:00 (Thu)
  62553686400, #    local_end 1983-04-01 00:00:00 (Fri)
  32400,
  0,
  '+09',
      ],
      [
  62553654000, #    utc_start 1983-03-31 15:00:00 (Thu)
  62569461600, #      utc_end 1983-09-30 14:00:00 (Fri)
  62553690000, #  local_start 1983-04-01 01:00:00 (Fri)
  62569497600, #    local_end 1983-10-01 00:00:00 (Sat)
  36000,
  1,
  '+10',
      ],
      [
  62569461600, #    utc_start 1983-09-30 14:00:00 (Fri)
  62585276400, #      utc_end 1984-03-31 15:00:00 (Sat)
  62569494000, #  local_start 1983-09-30 23:00:00 (Fri)
  62585308800, #    local_end 1984-04-01 00:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  62585276400, #    utc_start 1984-03-31 15:00:00 (Sat)
  62601008400, #      utc_end 1984-09-29 17:00:00 (Sat)
  62585312400, #  local_start 1984-04-01 01:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  62601008400, #    utc_start 1984-09-29 17:00:00 (Sat)
  62616733200, #      utc_end 1985-03-30 17:00:00 (Sat)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  62616733200, #    utc_start 1985-03-30 17:00:00 (Sat)
  62632458000, #      utc_end 1985-09-28 17:00:00 (Sat)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  62632458000, #    utc_start 1985-09-28 17:00:00 (Sat)
  62648182800, #      utc_end 1986-03-29 17:00:00 (Sat)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  62648182800, #    utc_start 1986-03-29 17:00:00 (Sat)
  62663907600, #      utc_end 1986-09-27 17:00:00 (Sat)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  62663907600, #    utc_start 1986-09-27 17:00:00 (Sat)
  62679632400, #      utc_end 1987-03-28 17:00:00 (Sat)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  62679632400, #    utc_start 1987-03-28 17:00:00 (Sat)
  62695357200, #      utc_end 1987-09-26 17:00:00 (Sat)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  62695357200, #    utc_start 1987-09-26 17:00:00 (Sat)
  62711082000, #      utc_end 1988-03-26 17:00:00 (Sat)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  62711082000, #    utc_start 1988-03-26 17:00:00 (Sat)
  62726806800, #      utc_end 1988-09-24 17:00:00 (Sat)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  62726806800, #    utc_start 1988-09-24 17:00:00 (Sat)
  62742531600, #      utc_end 1989-03-25 17:00:00 (Sat)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  62742531600, #    utc_start 1989-03-25 17:00:00 (Sat)
  62758256400, #      utc_end 1989-09-23 17:00:00 (Sat)
  62742567600, #  local_start 1989-03-26 03:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  62758256400, #    utc_start 1989-09-23 17:00:00 (Sat)
  62773981200, #      utc_end 1990-03-24 17:00:00 (Sat)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  62773981200, #    utc_start 1990-03-24 17:00:00 (Sat)
  62790310800, #      utc_end 1990-09-29 17:00:00 (Sat)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  62790310800, #    utc_start 1990-09-29 17:00:00 (Sat)
  62806035600, #      utc_end 1991-03-30 17:00:00 (Sat)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  62806035600, #    utc_start 1991-03-30 17:00:00 (Sat)
  62821764000, #      utc_end 1991-09-28 18:00:00 (Sat)
  62806068000, #  local_start 1991-03-31 02:00:00 (Sun)
  62821796400, #    local_end 1991-09-29 03:00:00 (Sun)
  32400,
  1,
  '+09',
      ],
      [
  62821764000, #    utc_start 1991-09-28 18:00:00 (Sat)
  62831440800, #      utc_end 1992-01-18 18:00:00 (Sat)
  62821792800, #  local_start 1991-09-29 02:00:00 (Sun)
  62831469600, #    local_end 1992-01-19 02:00:00 (Sun)
  28800,
  0,
  '+08',
      ],
      [
  62831440800, #    utc_start 1992-01-18 18:00:00 (Sat)
  62837485200, #      utc_end 1992-03-28 17:00:00 (Sat)
  62831473200, #  local_start 1992-01-19 03:00:00 (Sun)
  62837517600, #    local_end 1992-03-29 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  62837485200, #    utc_start 1992-03-28 17:00:00 (Sat)
  62853210000, #      utc_end 1992-09-26 17:00:00 (Sat)
  62837521200, #  local_start 1992-03-29 03:00:00 (Sun)
  62853246000, #    local_end 1992-09-27 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  62853210000, #    utc_start 1992-09-26 17:00:00 (Sat)
  62868934800, #      utc_end 1993-03-27 17:00:00 (Sat)
  62853242400, #  local_start 1992-09-27 02:00:00 (Sun)
  62868967200, #    local_end 1993-03-28 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  62868934800, #    utc_start 1993-03-27 17:00:00 (Sat)
  62884659600, #      utc_end 1993-09-25 17:00:00 (Sat)
  62868970800, #  local_start 1993-03-28 03:00:00 (Sun)
  62884695600, #    local_end 1993-09-26 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  62884659600, #    utc_start 1993-09-25 17:00:00 (Sat)
  62900384400, #      utc_end 1994-03-26 17:00:00 (Sat)
  62884692000, #  local_start 1993-09-26 02:00:00 (Sun)
  62900416800, #    local_end 1994-03-27 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  62900384400, #    utc_start 1994-03-26 17:00:00 (Sat)
  62916109200, #      utc_end 1994-09-24 17:00:00 (Sat)
  62900420400, #  local_start 1994-03-27 03:00:00 (Sun)
  62916145200, #    local_end 1994-09-25 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  62916109200, #    utc_start 1994-09-24 17:00:00 (Sat)
  62931834000, #      utc_end 1995-03-25 17:00:00 (Sat)
  62916141600, #  local_start 1994-09-25 02:00:00 (Sun)
  62931866400, #    local_end 1995-03-26 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  62931834000, #    utc_start 1995-03-25 17:00:00 (Sat)
  62947558800, #      utc_end 1995-09-23 17:00:00 (Sat)
  62931870000, #  local_start 1995-03-26 03:00:00 (Sun)
  62947594800, #    local_end 1995-09-24 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  62947558800, #    utc_start 1995-09-23 17:00:00 (Sat)
  62963888400, #      utc_end 1996-03-30 17:00:00 (Sat)
  62947591200, #  local_start 1995-09-24 02:00:00 (Sun)
  62963920800, #    local_end 1996-03-31 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  62963888400, #    utc_start 1996-03-30 17:00:00 (Sat)
  62982032400, #      utc_end 1996-10-26 17:00:00 (Sat)
  62963924400, #  local_start 1996-03-31 03:00:00 (Sun)
  62982068400, #    local_end 1996-10-27 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  62982032400, #    utc_start 1996-10-26 17:00:00 (Sat)
  62995338000, #      utc_end 1997-03-29 17:00:00 (Sat)
  62982064800, #  local_start 1996-10-27 02:00:00 (Sun)
  62995370400, #    local_end 1997-03-30 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  62995338000, #    utc_start 1997-03-29 17:00:00 (Sat)
  63013482000, #      utc_end 1997-10-25 17:00:00 (Sat)
  62995374000, #  local_start 1997-03-30 03:00:00 (Sun)
  63013518000, #    local_end 1997-10-26 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  63013482000, #    utc_start 1997-10-25 17:00:00 (Sat)
  63026787600, #      utc_end 1998-03-28 17:00:00 (Sat)
  63013514400, #  local_start 1997-10-26 02:00:00 (Sun)
  63026820000, #    local_end 1998-03-29 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  63026787600, #    utc_start 1998-03-28 17:00:00 (Sat)
  63044931600, #      utc_end 1998-10-24 17:00:00 (Sat)
  63026823600, #  local_start 1998-03-29 03:00:00 (Sun)
  63044967600, #    local_end 1998-10-25 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  63044931600, #    utc_start 1998-10-24 17:00:00 (Sat)
  63058237200, #      utc_end 1999-03-27 17:00:00 (Sat)
  63044964000, #  local_start 1998-10-25 02:00:00 (Sun)
  63058269600, #    local_end 1999-03-28 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  63058237200, #    utc_start 1999-03-27 17:00:00 (Sat)
  63076986000, #      utc_end 1999-10-30 17:00:00 (Sat)
  63058273200, #  local_start 1999-03-28 03:00:00 (Sun)
  63077022000, #    local_end 1999-10-31 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  63076986000, #    utc_start 1999-10-30 17:00:00 (Sat)
  63089686800, #      utc_end 2000-03-25 17:00:00 (Sat)
  63077018400, #  local_start 1999-10-31 02:00:00 (Sun)
  63089719200, #    local_end 2000-03-26 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  63089686800, #    utc_start 2000-03-25 17:00:00 (Sat)
  63108435600, #      utc_end 2000-10-28 17:00:00 (Sat)
  63089722800, #  local_start 2000-03-26 03:00:00 (Sun)
  63108471600, #    local_end 2000-10-29 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  63108435600, #    utc_start 2000-10-28 17:00:00 (Sat)
  63121136400, #      utc_end 2001-03-24 17:00:00 (Sat)
  63108468000, #  local_start 2000-10-29 02:00:00 (Sun)
  63121168800, #    local_end 2001-03-25 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  63121136400, #    utc_start 2001-03-24 17:00:00 (Sat)
  63139885200, #      utc_end 2001-10-27 17:00:00 (Sat)
  63121172400, #  local_start 2001-03-25 03:00:00 (Sun)
  63139921200, #    local_end 2001-10-28 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  63139885200, #    utc_start 2001-10-27 17:00:00 (Sat)
  63153190800, #      utc_end 2002-03-30 17:00:00 (Sat)
  63139917600, #  local_start 2001-10-28 02:00:00 (Sun)
  63153223200, #    local_end 2002-03-31 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  63153190800, #    utc_start 2002-03-30 17:00:00 (Sat)
  63171334800, #      utc_end 2002-10-26 17:00:00 (Sat)
  63153226800, #  local_start 2002-03-31 03:00:00 (Sun)
  63171370800, #    local_end 2002-10-27 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  63171334800, #    utc_start 2002-10-26 17:00:00 (Sat)
  63184640400, #      utc_end 2003-03-29 17:00:00 (Sat)
  63171367200, #  local_start 2002-10-27 02:00:00 (Sun)
  63184672800, #    local_end 2003-03-30 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  63184640400, #    utc_start 2003-03-29 17:00:00 (Sat)
  63202784400, #      utc_end 2003-10-25 17:00:00 (Sat)
  63184676400, #  local_start 2003-03-30 03:00:00 (Sun)
  63202820400, #    local_end 2003-10-26 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  63202784400, #    utc_start 2003-10-25 17:00:00 (Sat)
  63216090000, #      utc_end 2004-03-27 17:00:00 (Sat)
  63202816800, #  local_start 2003-10-26 02:00:00 (Sun)
  63216122400, #    local_end 2004-03-28 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  63216090000, #    utc_start 2004-03-27 17:00:00 (Sat)
  63234838800, #      utc_end 2004-10-30 17:00:00 (Sat)
  63216126000, #  local_start 2004-03-28 03:00:00 (Sun)
  63234874800, #    local_end 2004-10-31 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  63234838800, #    utc_start 2004-10-30 17:00:00 (Sat)
  63247539600, #      utc_end 2005-03-26 17:00:00 (Sat)
  63234871200, #  local_start 2004-10-31 02:00:00 (Sun)
  63247572000, #    local_end 2005-03-27 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  63247539600, #    utc_start 2005-03-26 17:00:00 (Sat)
  63266288400, #      utc_end 2005-10-29 17:00:00 (Sat)
  63247575600, #  local_start 2005-03-27 03:00:00 (Sun)
  63266324400, #    local_end 2005-10-30 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  63266288400, #    utc_start 2005-10-29 17:00:00 (Sat)
  63278989200, #      utc_end 2006-03-25 17:00:00 (Sat)
  63266320800, #  local_start 2005-10-30 02:00:00 (Sun)
  63279021600, #    local_end 2006-03-26 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  63278989200, #    utc_start 2006-03-25 17:00:00 (Sat)
  63297738000, #      utc_end 2006-10-28 17:00:00 (Sat)
  63279025200, #  local_start 2006-03-26 03:00:00 (Sun)
  63297774000, #    local_end 2006-10-29 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  63297738000, #    utc_start 2006-10-28 17:00:00 (Sat)
  63310438800, #      utc_end 2007-03-24 17:00:00 (Sat)
  63297770400, #  local_start 2006-10-29 02:00:00 (Sun)
  63310471200, #    local_end 2007-03-25 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  63310438800, #    utc_start 2007-03-24 17:00:00 (Sat)
  63329187600, #      utc_end 2007-10-27 17:00:00 (Sat)
  63310474800, #  local_start 2007-03-25 03:00:00 (Sun)
  63329223600, #    local_end 2007-10-28 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  63329187600, #    utc_start 2007-10-27 17:00:00 (Sat)
  63342493200, #      utc_end 2008-03-29 17:00:00 (Sat)
  63329220000, #  local_start 2007-10-28 02:00:00 (Sun)
  63342525600, #    local_end 2008-03-30 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  63342493200, #    utc_start 2008-03-29 17:00:00 (Sat)
  63360637200, #      utc_end 2008-10-25 17:00:00 (Sat)
  63342529200, #  local_start 2008-03-30 03:00:00 (Sun)
  63360673200, #    local_end 2008-10-26 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  63360637200, #    utc_start 2008-10-25 17:00:00 (Sat)
  63373942800, #      utc_end 2009-03-28 17:00:00 (Sat)
  63360669600, #  local_start 2008-10-26 02:00:00 (Sun)
  63373975200, #    local_end 2009-03-29 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  63373942800, #    utc_start 2009-03-28 17:00:00 (Sat)
  63392086800, #      utc_end 2009-10-24 17:00:00 (Sat)
  63373978800, #  local_start 2009-03-29 03:00:00 (Sun)
  63392122800, #    local_end 2009-10-25 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  63392086800, #    utc_start 2009-10-24 17:00:00 (Sat)
  63405392400, #      utc_end 2010-03-27 17:00:00 (Sat)
  63392119200, #  local_start 2009-10-25 02:00:00 (Sun)
  63405424800, #    local_end 2010-03-28 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  63405392400, #    utc_start 2010-03-27 17:00:00 (Sat)
  63424141200, #      utc_end 2010-10-30 17:00:00 (Sat)
  63405428400, #  local_start 2010-03-28 03:00:00 (Sun)
  63424177200, #    local_end 2010-10-31 03:00:00 (Sun)
  36000,
  1,
  '+10',
      ],
      [
  63424141200, #    utc_start 2010-10-30 17:00:00 (Sat)
  63436842000, #      utc_end 2011-03-26 17:00:00 (Sat)
  63424173600, #  local_start 2010-10-31 02:00:00 (Sun)
  63436874400, #    local_end 2011-03-27 02:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  63436842000, #    utc_start 2011-03-26 17:00:00 (Sat)
  63549936000, #      utc_end 2014-10-25 16:00:00 (Sat)
  63436878000, #  local_start 2011-03-27 03:00:00 (Sun)
  63549972000, #    local_end 2014-10-26 02:00:00 (Sun)
  36000,
  0,
  '+10',
      ],
      [
  63549936000, #    utc_start 2014-10-25 16:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  63549968400, #  local_start 2014-10-26 01:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  32400,
  0,
  '+09',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {30}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_YAKUTSK

    $main::fatpacked{"DateTime/TimeZone/Asia/Yangon.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_YANGON';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/asia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Yangon;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Yangon::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59295519313, #      utc_end 1879-12-31 17:35:13 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59295542400, #    local_end 1880-01-01 00:00:00 (Thu)
  23087,
  0,
  'LMT',
      ],
      [
  59295519313, #    utc_start 1879-12-31 17:35:13 (Wed)
  60557736913, #      utc_end 1919-12-31 17:35:13 (Wed)
  59295542400, #  local_start 1880-01-01 00:00:00 (Thu)
  60557760000, #    local_end 1920-01-01 00:00:00 (Thu)
  23087,
  0,
  'RMT',
      ],
      [
  60557736913, #    utc_start 1919-12-31 17:35:13 (Wed)
  61262415000, #      utc_end 1942-04-30 17:30:00 (Thu)
  60557760313, #  local_start 1920-01-01 00:05:13 (Thu)
  61262438400, #    local_end 1942-05-01 00:00:00 (Fri)
  23400,
  0,
  '+0630',
      ],
      [
  61262415000, #    utc_start 1942-04-30 17:30:00 (Thu)
  61357273200, #      utc_end 1945-05-02 15:00:00 (Wed)
  61262447400, #  local_start 1942-05-01 02:30:00 (Fri)
  61357305600, #    local_end 1945-05-03 00:00:00 (Thu)
  32400,
  0,
  '+09',
      ],
      [
  61357273200, #    utc_start 1945-05-02 15:00:00 (Wed)
  DateTime::TimeZone::INFINITY, #      utc_end
  61357296600, #  local_start 1945-05-02 21:30:00 (Wed)
  DateTime::TimeZone::INFINITY, #    local_end
  23400,
  0,
  '+0630',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_YANGON

    $main::fatpacked{"DateTime/TimeZone/Asia/Yekaterinburg.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_YEKATERINBURG';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Yekaterinburg;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Yekaterinburg::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60447412647, #      utc_end 1916-07-02 19:57:27 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60447427200, #    local_end 1916-07-03 00:00:00 (Mon)
  14553,
  0,
  'LMT',
      ],
      [
  60447412647, #    utc_start 1916-07-02 19:57:27 (Sun)
  60543072895, #      utc_end 1919-07-15 00:14:55 (Tue)
  60447426152, #  local_start 1916-07-02 23:42:32 (Sun)
  60543086400, #    local_end 1919-07-15 04:00:00 (Tue)
  13505,
  0,
  'PMT',
      ],
      [
  60543072895, #    utc_start 1919-07-15 00:14:55 (Tue)
  60888139200, #      utc_end 1930-06-20 20:00:00 (Fri)
  60543087295, #  local_start 1919-07-15 04:14:55 (Tue)
  60888153600, #    local_end 1930-06-21 00:00:00 (Sat)
  14400,
  0,
  '+04',
      ],
      [
  60888139200, #    utc_start 1930-06-20 20:00:00 (Fri)
  62490596400, #      utc_end 1981-03-31 19:00:00 (Tue)
  60888157200, #  local_start 1930-06-21 01:00:00 (Sat)
  62490614400, #    local_end 1981-04-01 00:00:00 (Wed)
  18000,
  0,
  '+05',
      ],
      [
  62490596400, #    utc_start 1981-03-31 19:00:00 (Tue)
  62506404000, #      utc_end 1981-09-30 18:00:00 (Wed)
  62490618000, #  local_start 1981-04-01 01:00:00 (Wed)
  62506425600, #    local_end 1981-10-01 00:00:00 (Thu)
  21600,
  1,
  '+06',
      ],
      [
  62506404000, #    utc_start 1981-09-30 18:00:00 (Wed)
  62522132400, #      utc_end 1982-03-31 19:00:00 (Wed)
  62506422000, #  local_start 1981-09-30 23:00:00 (Wed)
  62522150400, #    local_end 1982-04-01 00:00:00 (Thu)
  18000,
  0,
  '+05',
      ],
      [
  62522132400, #    utc_start 1982-03-31 19:00:00 (Wed)
  62537940000, #      utc_end 1982-09-30 18:00:00 (Thu)
  62522154000, #  local_start 1982-04-01 01:00:00 (Thu)
  62537961600, #    local_end 1982-10-01 00:00:00 (Fri)
  21600,
  1,
  '+06',
      ],
      [
  62537940000, #    utc_start 1982-09-30 18:00:00 (Thu)
  62553668400, #      utc_end 1983-03-31 19:00:00 (Thu)
  62537958000, #  local_start 1982-09-30 23:00:00 (Thu)
  62553686400, #    local_end 1983-04-01 00:00:00 (Fri)
  18000,
  0,
  '+05',
      ],
      [
  62553668400, #    utc_start 1983-03-31 19:00:00 (Thu)
  62569476000, #      utc_end 1983-09-30 18:00:00 (Fri)
  62553690000, #  local_start 1983-04-01 01:00:00 (Fri)
  62569497600, #    local_end 1983-10-01 00:00:00 (Sat)
  21600,
  1,
  '+06',
      ],
      [
  62569476000, #    utc_start 1983-09-30 18:00:00 (Fri)
  62585290800, #      utc_end 1984-03-31 19:00:00 (Sat)
  62569494000, #  local_start 1983-09-30 23:00:00 (Fri)
  62585308800, #    local_end 1984-04-01 00:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62585290800, #    utc_start 1984-03-31 19:00:00 (Sat)
  62601022800, #      utc_end 1984-09-29 21:00:00 (Sat)
  62585312400, #  local_start 1984-04-01 01:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62601022800, #    utc_start 1984-09-29 21:00:00 (Sat)
  62616747600, #      utc_end 1985-03-30 21:00:00 (Sat)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62616747600, #    utc_start 1985-03-30 21:00:00 (Sat)
  62632472400, #      utc_end 1985-09-28 21:00:00 (Sat)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62632472400, #    utc_start 1985-09-28 21:00:00 (Sat)
  62648197200, #      utc_end 1986-03-29 21:00:00 (Sat)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62648197200, #    utc_start 1986-03-29 21:00:00 (Sat)
  62663922000, #      utc_end 1986-09-27 21:00:00 (Sat)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62663922000, #    utc_start 1986-09-27 21:00:00 (Sat)
  62679646800, #      utc_end 1987-03-28 21:00:00 (Sat)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62679646800, #    utc_start 1987-03-28 21:00:00 (Sat)
  62695371600, #      utc_end 1987-09-26 21:00:00 (Sat)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62695371600, #    utc_start 1987-09-26 21:00:00 (Sat)
  62711096400, #      utc_end 1988-03-26 21:00:00 (Sat)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62711096400, #    utc_start 1988-03-26 21:00:00 (Sat)
  62726821200, #      utc_end 1988-09-24 21:00:00 (Sat)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62726821200, #    utc_start 1988-09-24 21:00:00 (Sat)
  62742546000, #      utc_end 1989-03-25 21:00:00 (Sat)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62742546000, #    utc_start 1989-03-25 21:00:00 (Sat)
  62758270800, #      utc_end 1989-09-23 21:00:00 (Sat)
  62742567600, #  local_start 1989-03-26 03:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62758270800, #    utc_start 1989-09-23 21:00:00 (Sat)
  62773995600, #      utc_end 1990-03-24 21:00:00 (Sat)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62773995600, #    utc_start 1990-03-24 21:00:00 (Sat)
  62790325200, #      utc_end 1990-09-29 21:00:00 (Sat)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62790325200, #    utc_start 1990-09-29 21:00:00 (Sat)
  62806050000, #      utc_end 1991-03-30 21:00:00 (Sat)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62806050000, #    utc_start 1991-03-30 21:00:00 (Sat)
  62821778400, #      utc_end 1991-09-28 22:00:00 (Sat)
  62806068000, #  local_start 1991-03-31 02:00:00 (Sun)
  62821796400, #    local_end 1991-09-29 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62821778400, #    utc_start 1991-09-28 22:00:00 (Sat)
  62831455200, #      utc_end 1992-01-18 22:00:00 (Sat)
  62821792800, #  local_start 1991-09-29 02:00:00 (Sun)
  62831469600, #    local_end 1992-01-19 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62831455200, #    utc_start 1992-01-18 22:00:00 (Sat)
  62837499600, #      utc_end 1992-03-28 21:00:00 (Sat)
  62831473200, #  local_start 1992-01-19 03:00:00 (Sun)
  62837517600, #    local_end 1992-03-29 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62837499600, #    utc_start 1992-03-28 21:00:00 (Sat)
  62853224400, #      utc_end 1992-09-26 21:00:00 (Sat)
  62837521200, #  local_start 1992-03-29 03:00:00 (Sun)
  62853246000, #    local_end 1992-09-27 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62853224400, #    utc_start 1992-09-26 21:00:00 (Sat)
  62868949200, #      utc_end 1993-03-27 21:00:00 (Sat)
  62853242400, #  local_start 1992-09-27 02:00:00 (Sun)
  62868967200, #    local_end 1993-03-28 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62868949200, #    utc_start 1993-03-27 21:00:00 (Sat)
  62884674000, #      utc_end 1993-09-25 21:00:00 (Sat)
  62868970800, #  local_start 1993-03-28 03:00:00 (Sun)
  62884695600, #    local_end 1993-09-26 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62884674000, #    utc_start 1993-09-25 21:00:00 (Sat)
  62900398800, #      utc_end 1994-03-26 21:00:00 (Sat)
  62884692000, #  local_start 1993-09-26 02:00:00 (Sun)
  62900416800, #    local_end 1994-03-27 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62900398800, #    utc_start 1994-03-26 21:00:00 (Sat)
  62916123600, #      utc_end 1994-09-24 21:00:00 (Sat)
  62900420400, #  local_start 1994-03-27 03:00:00 (Sun)
  62916145200, #    local_end 1994-09-25 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62916123600, #    utc_start 1994-09-24 21:00:00 (Sat)
  62931848400, #      utc_end 1995-03-25 21:00:00 (Sat)
  62916141600, #  local_start 1994-09-25 02:00:00 (Sun)
  62931866400, #    local_end 1995-03-26 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62931848400, #    utc_start 1995-03-25 21:00:00 (Sat)
  62947573200, #      utc_end 1995-09-23 21:00:00 (Sat)
  62931870000, #  local_start 1995-03-26 03:00:00 (Sun)
  62947594800, #    local_end 1995-09-24 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62947573200, #    utc_start 1995-09-23 21:00:00 (Sat)
  62963902800, #      utc_end 1996-03-30 21:00:00 (Sat)
  62947591200, #  local_start 1995-09-24 02:00:00 (Sun)
  62963920800, #    local_end 1996-03-31 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62963902800, #    utc_start 1996-03-30 21:00:00 (Sat)
  62982046800, #      utc_end 1996-10-26 21:00:00 (Sat)
  62963924400, #  local_start 1996-03-31 03:00:00 (Sun)
  62982068400, #    local_end 1996-10-27 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  62982046800, #    utc_start 1996-10-26 21:00:00 (Sat)
  62995352400, #      utc_end 1997-03-29 21:00:00 (Sat)
  62982064800, #  local_start 1996-10-27 02:00:00 (Sun)
  62995370400, #    local_end 1997-03-30 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  62995352400, #    utc_start 1997-03-29 21:00:00 (Sat)
  63013496400, #      utc_end 1997-10-25 21:00:00 (Sat)
  62995374000, #  local_start 1997-03-30 03:00:00 (Sun)
  63013518000, #    local_end 1997-10-26 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  63013496400, #    utc_start 1997-10-25 21:00:00 (Sat)
  63026802000, #      utc_end 1998-03-28 21:00:00 (Sat)
  63013514400, #  local_start 1997-10-26 02:00:00 (Sun)
  63026820000, #    local_end 1998-03-29 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  63026802000, #    utc_start 1998-03-28 21:00:00 (Sat)
  63044946000, #      utc_end 1998-10-24 21:00:00 (Sat)
  63026823600, #  local_start 1998-03-29 03:00:00 (Sun)
  63044967600, #    local_end 1998-10-25 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  63044946000, #    utc_start 1998-10-24 21:00:00 (Sat)
  63058251600, #      utc_end 1999-03-27 21:00:00 (Sat)
  63044964000, #  local_start 1998-10-25 02:00:00 (Sun)
  63058269600, #    local_end 1999-03-28 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  63058251600, #    utc_start 1999-03-27 21:00:00 (Sat)
  63077000400, #      utc_end 1999-10-30 21:00:00 (Sat)
  63058273200, #  local_start 1999-03-28 03:00:00 (Sun)
  63077022000, #    local_end 1999-10-31 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  63077000400, #    utc_start 1999-10-30 21:00:00 (Sat)
  63089701200, #      utc_end 2000-03-25 21:00:00 (Sat)
  63077018400, #  local_start 1999-10-31 02:00:00 (Sun)
  63089719200, #    local_end 2000-03-26 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  63089701200, #    utc_start 2000-03-25 21:00:00 (Sat)
  63108450000, #      utc_end 2000-10-28 21:00:00 (Sat)
  63089722800, #  local_start 2000-03-26 03:00:00 (Sun)
  63108471600, #    local_end 2000-10-29 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  63108450000, #    utc_start 2000-10-28 21:00:00 (Sat)
  63121150800, #      utc_end 2001-03-24 21:00:00 (Sat)
  63108468000, #  local_start 2000-10-29 02:00:00 (Sun)
  63121168800, #    local_end 2001-03-25 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  63121150800, #    utc_start 2001-03-24 21:00:00 (Sat)
  63139899600, #      utc_end 2001-10-27 21:00:00 (Sat)
  63121172400, #  local_start 2001-03-25 03:00:00 (Sun)
  63139921200, #    local_end 2001-10-28 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  63139899600, #    utc_start 2001-10-27 21:00:00 (Sat)
  63153205200, #      utc_end 2002-03-30 21:00:00 (Sat)
  63139917600, #  local_start 2001-10-28 02:00:00 (Sun)
  63153223200, #    local_end 2002-03-31 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  63153205200, #    utc_start 2002-03-30 21:00:00 (Sat)
  63171349200, #      utc_end 2002-10-26 21:00:00 (Sat)
  63153226800, #  local_start 2002-03-31 03:00:00 (Sun)
  63171370800, #    local_end 2002-10-27 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  63171349200, #    utc_start 2002-10-26 21:00:00 (Sat)
  63184654800, #      utc_end 2003-03-29 21:00:00 (Sat)
  63171367200, #  local_start 2002-10-27 02:00:00 (Sun)
  63184672800, #    local_end 2003-03-30 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  63184654800, #    utc_start 2003-03-29 21:00:00 (Sat)
  63202798800, #      utc_end 2003-10-25 21:00:00 (Sat)
  63184676400, #  local_start 2003-03-30 03:00:00 (Sun)
  63202820400, #    local_end 2003-10-26 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  63202798800, #    utc_start 2003-10-25 21:00:00 (Sat)
  63216104400, #      utc_end 2004-03-27 21:00:00 (Sat)
  63202816800, #  local_start 2003-10-26 02:00:00 (Sun)
  63216122400, #    local_end 2004-03-28 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  63216104400, #    utc_start 2004-03-27 21:00:00 (Sat)
  63234853200, #      utc_end 2004-10-30 21:00:00 (Sat)
  63216126000, #  local_start 2004-03-28 03:00:00 (Sun)
  63234874800, #    local_end 2004-10-31 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  63234853200, #    utc_start 2004-10-30 21:00:00 (Sat)
  63247554000, #      utc_end 2005-03-26 21:00:00 (Sat)
  63234871200, #  local_start 2004-10-31 02:00:00 (Sun)
  63247572000, #    local_end 2005-03-27 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  63247554000, #    utc_start 2005-03-26 21:00:00 (Sat)
  63266302800, #      utc_end 2005-10-29 21:00:00 (Sat)
  63247575600, #  local_start 2005-03-27 03:00:00 (Sun)
  63266324400, #    local_end 2005-10-30 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  63266302800, #    utc_start 2005-10-29 21:00:00 (Sat)
  63279003600, #      utc_end 2006-03-25 21:00:00 (Sat)
  63266320800, #  local_start 2005-10-30 02:00:00 (Sun)
  63279021600, #    local_end 2006-03-26 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  63279003600, #    utc_start 2006-03-25 21:00:00 (Sat)
  63297752400, #      utc_end 2006-10-28 21:00:00 (Sat)
  63279025200, #  local_start 2006-03-26 03:00:00 (Sun)
  63297774000, #    local_end 2006-10-29 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  63297752400, #    utc_start 2006-10-28 21:00:00 (Sat)
  63310453200, #      utc_end 2007-03-24 21:00:00 (Sat)
  63297770400, #  local_start 2006-10-29 02:00:00 (Sun)
  63310471200, #    local_end 2007-03-25 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  63310453200, #    utc_start 2007-03-24 21:00:00 (Sat)
  63329202000, #      utc_end 2007-10-27 21:00:00 (Sat)
  63310474800, #  local_start 2007-03-25 03:00:00 (Sun)
  63329223600, #    local_end 2007-10-28 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  63329202000, #    utc_start 2007-10-27 21:00:00 (Sat)
  63342507600, #      utc_end 2008-03-29 21:00:00 (Sat)
  63329220000, #  local_start 2007-10-28 02:00:00 (Sun)
  63342525600, #    local_end 2008-03-30 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  63342507600, #    utc_start 2008-03-29 21:00:00 (Sat)
  63360651600, #      utc_end 2008-10-25 21:00:00 (Sat)
  63342529200, #  local_start 2008-03-30 03:00:00 (Sun)
  63360673200, #    local_end 2008-10-26 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  63360651600, #    utc_start 2008-10-25 21:00:00 (Sat)
  63373957200, #      utc_end 2009-03-28 21:00:00 (Sat)
  63360669600, #  local_start 2008-10-26 02:00:00 (Sun)
  63373975200, #    local_end 2009-03-29 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  63373957200, #    utc_start 2009-03-28 21:00:00 (Sat)
  63392101200, #      utc_end 2009-10-24 21:00:00 (Sat)
  63373978800, #  local_start 2009-03-29 03:00:00 (Sun)
  63392122800, #    local_end 2009-10-25 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  63392101200, #    utc_start 2009-10-24 21:00:00 (Sat)
  63405406800, #      utc_end 2010-03-27 21:00:00 (Sat)
  63392119200, #  local_start 2009-10-25 02:00:00 (Sun)
  63405424800, #    local_end 2010-03-28 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  63405406800, #    utc_start 2010-03-27 21:00:00 (Sat)
  63424155600, #      utc_end 2010-10-30 21:00:00 (Sat)
  63405428400, #  local_start 2010-03-28 03:00:00 (Sun)
  63424177200, #    local_end 2010-10-31 03:00:00 (Sun)
  21600,
  1,
  '+06',
      ],
      [
  63424155600, #    utc_start 2010-10-30 21:00:00 (Sat)
  63436856400, #      utc_end 2011-03-26 21:00:00 (Sat)
  63424173600, #  local_start 2010-10-31 02:00:00 (Sun)
  63436874400, #    local_end 2011-03-27 02:00:00 (Sun)
  18000,
  0,
  '+05',
      ],
      [
  63436856400, #    utc_start 2011-03-26 21:00:00 (Sat)
  63549950400, #      utc_end 2014-10-25 20:00:00 (Sat)
  63436878000, #  local_start 2011-03-27 03:00:00 (Sun)
  63549972000, #    local_end 2014-10-26 02:00:00 (Sun)
  21600,
  0,
  '+06',
      ],
      [
  63549950400, #    utc_start 2014-10-25 20:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  63549968400, #  local_start 2014-10-26 01:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  18000,
  0,
  '+05',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {30}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_YEKATERINBURG

    $main::fatpacked{"DateTime/TimeZone/Asia/Yerevan.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ASIA_YEREVAN';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/asia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Asia::Yerevan;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Asia::Yerevan::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60694520520, #      utc_end 1924-05-01 21:02:00 (Thu)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60694531200, #    local_end 1924-05-02 00:00:00 (Fri)
  10680,
  0,
  'LMT',
      ],
      [
  60694520520, #    utc_start 1924-05-01 21:02:00 (Thu)
  61730542800, #      utc_end 1957-02-28 21:00:00 (Thu)
  60694531320, #  local_start 1924-05-02 00:02:00 (Fri)
  61730553600, #    local_end 1957-03-01 00:00:00 (Fri)
  10800,
  0,
  '+03',
      ],
      [
  61730542800, #    utc_start 1957-02-28 21:00:00 (Thu)
  62490600000, #      utc_end 1981-03-31 20:00:00 (Tue)
  61730557200, #  local_start 1957-03-01 01:00:00 (Fri)
  62490614400, #    local_end 1981-04-01 00:00:00 (Wed)
  14400,
  0,
  '+04',
      ],
      [
  62490600000, #    utc_start 1981-03-31 20:00:00 (Tue)
  62506407600, #      utc_end 1981-09-30 19:00:00 (Wed)
  62490618000, #  local_start 1981-04-01 01:00:00 (Wed)
  62506425600, #    local_end 1981-10-01 00:00:00 (Thu)
  18000,
  1,
  '+05',
      ],
      [
  62506407600, #    utc_start 1981-09-30 19:00:00 (Wed)
  62522136000, #      utc_end 1982-03-31 20:00:00 (Wed)
  62506422000, #  local_start 1981-09-30 23:00:00 (Wed)
  62522150400, #    local_end 1982-04-01 00:00:00 (Thu)
  14400,
  0,
  '+04',
      ],
      [
  62522136000, #    utc_start 1982-03-31 20:00:00 (Wed)
  62537943600, #      utc_end 1982-09-30 19:00:00 (Thu)
  62522154000, #  local_start 1982-04-01 01:00:00 (Thu)
  62537961600, #    local_end 1982-10-01 00:00:00 (Fri)
  18000,
  1,
  '+05',
      ],
      [
  62537943600, #    utc_start 1982-09-30 19:00:00 (Thu)
  62553672000, #      utc_end 1983-03-31 20:00:00 (Thu)
  62537958000, #  local_start 1982-09-30 23:00:00 (Thu)
  62553686400, #    local_end 1983-04-01 00:00:00 (Fri)
  14400,
  0,
  '+04',
      ],
      [
  62553672000, #    utc_start 1983-03-31 20:00:00 (Thu)
  62569479600, #      utc_end 1983-09-30 19:00:00 (Fri)
  62553690000, #  local_start 1983-04-01 01:00:00 (Fri)
  62569497600, #    local_end 1983-10-01 00:00:00 (Sat)
  18000,
  1,
  '+05',
      ],
      [
  62569479600, #    utc_start 1983-09-30 19:00:00 (Fri)
  62585294400, #      utc_end 1984-03-31 20:00:00 (Sat)
  62569494000, #  local_start 1983-09-30 23:00:00 (Fri)
  62585308800, #    local_end 1984-04-01 00:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62585294400, #    utc_start 1984-03-31 20:00:00 (Sat)
  62601026400, #      utc_end 1984-09-29 22:00:00 (Sat)
  62585312400, #  local_start 1984-04-01 01:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62601026400, #    utc_start 1984-09-29 22:00:00 (Sat)
  62616751200, #      utc_end 1985-03-30 22:00:00 (Sat)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62616751200, #    utc_start 1985-03-30 22:00:00 (Sat)
  62632476000, #      utc_end 1985-09-28 22:00:00 (Sat)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62632476000, #    utc_start 1985-09-28 22:00:00 (Sat)
  62648200800, #      utc_end 1986-03-29 22:00:00 (Sat)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62648200800, #    utc_start 1986-03-29 22:00:00 (Sat)
  62663925600, #      utc_end 1986-09-27 22:00:00 (Sat)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62663925600, #    utc_start 1986-09-27 22:00:00 (Sat)
  62679650400, #      utc_end 1987-03-28 22:00:00 (Sat)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62679650400, #    utc_start 1987-03-28 22:00:00 (Sat)
  62695375200, #      utc_end 1987-09-26 22:00:00 (Sat)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62695375200, #    utc_start 1987-09-26 22:00:00 (Sat)
  62711100000, #      utc_end 1988-03-26 22:00:00 (Sat)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62711100000, #    utc_start 1988-03-26 22:00:00 (Sat)
  62726824800, #      utc_end 1988-09-24 22:00:00 (Sat)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62726824800, #    utc_start 1988-09-24 22:00:00 (Sat)
  62742549600, #      utc_end 1989-03-25 22:00:00 (Sat)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62742549600, #    utc_start 1989-03-25 22:00:00 (Sat)
  62758274400, #      utc_end 1989-09-23 22:00:00 (Sat)
  62742567600, #  local_start 1989-03-26 03:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62758274400, #    utc_start 1989-09-23 22:00:00 (Sat)
  62773999200, #      utc_end 1990-03-24 22:00:00 (Sat)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62773999200, #    utc_start 1990-03-24 22:00:00 (Sat)
  62790328800, #      utc_end 1990-09-29 22:00:00 (Sat)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62790328800, #    utc_start 1990-09-29 22:00:00 (Sat)
  62806053600, #      utc_end 1991-03-30 22:00:00 (Sat)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62806053600, #    utc_start 1991-03-30 22:00:00 (Sat)
  62821782000, #      utc_end 1991-09-28 23:00:00 (Sat)
  62806068000, #  local_start 1991-03-31 02:00:00 (Sun)
  62821796400, #    local_end 1991-09-29 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  62821782000, #    utc_start 1991-09-28 23:00:00 (Sat)
  62837506800, #      utc_end 1992-03-28 23:00:00 (Sat)
  62821792800, #  local_start 1991-09-29 02:00:00 (Sun)
  62837517600, #    local_end 1992-03-29 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  62837506800, #    utc_start 1992-03-28 23:00:00 (Sat)
  62853231600, #      utc_end 1992-09-26 23:00:00 (Sat)
  62837521200, #  local_start 1992-03-29 03:00:00 (Sun)
  62853246000, #    local_end 1992-09-27 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  62853231600, #    utc_start 1992-09-26 23:00:00 (Sat)
  62868956400, #      utc_end 1993-03-27 23:00:00 (Sat)
  62853242400, #  local_start 1992-09-27 02:00:00 (Sun)
  62868967200, #    local_end 1993-03-28 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  62868956400, #    utc_start 1993-03-27 23:00:00 (Sat)
  62884681200, #      utc_end 1993-09-25 23:00:00 (Sat)
  62868970800, #  local_start 1993-03-28 03:00:00 (Sun)
  62884695600, #    local_end 1993-09-26 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  62884681200, #    utc_start 1993-09-25 23:00:00 (Sat)
  62900406000, #      utc_end 1994-03-26 23:00:00 (Sat)
  62884692000, #  local_start 1993-09-26 02:00:00 (Sun)
  62900416800, #    local_end 1994-03-27 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  62900406000, #    utc_start 1994-03-26 23:00:00 (Sat)
  62916130800, #      utc_end 1994-09-24 23:00:00 (Sat)
  62900420400, #  local_start 1994-03-27 03:00:00 (Sun)
  62916145200, #    local_end 1994-09-25 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  62916130800, #    utc_start 1994-09-24 23:00:00 (Sat)
  62931855600, #      utc_end 1995-03-25 23:00:00 (Sat)
  62916141600, #  local_start 1994-09-25 02:00:00 (Sun)
  62931866400, #    local_end 1995-03-26 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  62931855600, #    utc_start 1995-03-25 23:00:00 (Sat)
  62947580400, #      utc_end 1995-09-23 23:00:00 (Sat)
  62931870000, #  local_start 1995-03-26 03:00:00 (Sun)
  62947594800, #    local_end 1995-09-24 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  62947580400, #    utc_start 1995-09-23 23:00:00 (Sat)
  62987745600, #      utc_end 1996-12-31 20:00:00 (Tue)
  62947594800, #  local_start 1995-09-24 03:00:00 (Sun)
  62987760000, #    local_end 1997-01-01 00:00:00 (Wed)
  14400,
  0,
  '+04',
      ],
      [
  62987745600, #    utc_start 1996-12-31 20:00:00 (Tue)
  62995356000, #      utc_end 1997-03-29 22:00:00 (Sat)
  62987760000, #  local_start 1997-01-01 00:00:00 (Wed)
  62995370400, #    local_end 1997-03-30 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62995356000, #    utc_start 1997-03-29 22:00:00 (Sat)
  63013500000, #      utc_end 1997-10-25 22:00:00 (Sat)
  62995374000, #  local_start 1997-03-30 03:00:00 (Sun)
  63013518000, #    local_end 1997-10-26 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63013500000, #    utc_start 1997-10-25 22:00:00 (Sat)
  63026805600, #      utc_end 1998-03-28 22:00:00 (Sat)
  63013514400, #  local_start 1997-10-26 02:00:00 (Sun)
  63026820000, #    local_end 1998-03-29 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63026805600, #    utc_start 1998-03-28 22:00:00 (Sat)
  63044949600, #      utc_end 1998-10-24 22:00:00 (Sat)
  63026823600, #  local_start 1998-03-29 03:00:00 (Sun)
  63044967600, #    local_end 1998-10-25 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63044949600, #    utc_start 1998-10-24 22:00:00 (Sat)
  63058255200, #      utc_end 1999-03-27 22:00:00 (Sat)
  63044964000, #  local_start 1998-10-25 02:00:00 (Sun)
  63058269600, #    local_end 1999-03-28 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63058255200, #    utc_start 1999-03-27 22:00:00 (Sat)
  63077004000, #      utc_end 1999-10-30 22:00:00 (Sat)
  63058273200, #  local_start 1999-03-28 03:00:00 (Sun)
  63077022000, #    local_end 1999-10-31 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63077004000, #    utc_start 1999-10-30 22:00:00 (Sat)
  63089704800, #      utc_end 2000-03-25 22:00:00 (Sat)
  63077018400, #  local_start 1999-10-31 02:00:00 (Sun)
  63089719200, #    local_end 2000-03-26 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63089704800, #    utc_start 2000-03-25 22:00:00 (Sat)
  63108453600, #      utc_end 2000-10-28 22:00:00 (Sat)
  63089722800, #  local_start 2000-03-26 03:00:00 (Sun)
  63108471600, #    local_end 2000-10-29 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63108453600, #    utc_start 2000-10-28 22:00:00 (Sat)
  63121154400, #      utc_end 2001-03-24 22:00:00 (Sat)
  63108468000, #  local_start 2000-10-29 02:00:00 (Sun)
  63121168800, #    local_end 2001-03-25 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63121154400, #    utc_start 2001-03-24 22:00:00 (Sat)
  63139903200, #      utc_end 2001-10-27 22:00:00 (Sat)
  63121172400, #  local_start 2001-03-25 03:00:00 (Sun)
  63139921200, #    local_end 2001-10-28 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63139903200, #    utc_start 2001-10-27 22:00:00 (Sat)
  63153208800, #      utc_end 2002-03-30 22:00:00 (Sat)
  63139917600, #  local_start 2001-10-28 02:00:00 (Sun)
  63153223200, #    local_end 2002-03-31 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63153208800, #    utc_start 2002-03-30 22:00:00 (Sat)
  63171352800, #      utc_end 2002-10-26 22:00:00 (Sat)
  63153226800, #  local_start 2002-03-31 03:00:00 (Sun)
  63171370800, #    local_end 2002-10-27 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63171352800, #    utc_start 2002-10-26 22:00:00 (Sat)
  63184658400, #      utc_end 2003-03-29 22:00:00 (Sat)
  63171367200, #  local_start 2002-10-27 02:00:00 (Sun)
  63184672800, #    local_end 2003-03-30 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63184658400, #    utc_start 2003-03-29 22:00:00 (Sat)
  63202802400, #      utc_end 2003-10-25 22:00:00 (Sat)
  63184676400, #  local_start 2003-03-30 03:00:00 (Sun)
  63202820400, #    local_end 2003-10-26 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63202802400, #    utc_start 2003-10-25 22:00:00 (Sat)
  63216108000, #      utc_end 2004-03-27 22:00:00 (Sat)
  63202816800, #  local_start 2003-10-26 02:00:00 (Sun)
  63216122400, #    local_end 2004-03-28 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63216108000, #    utc_start 2004-03-27 22:00:00 (Sat)
  63234856800, #      utc_end 2004-10-30 22:00:00 (Sat)
  63216126000, #  local_start 2004-03-28 03:00:00 (Sun)
  63234874800, #    local_end 2004-10-31 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63234856800, #    utc_start 2004-10-30 22:00:00 (Sat)
  63247557600, #      utc_end 2005-03-26 22:00:00 (Sat)
  63234871200, #  local_start 2004-10-31 02:00:00 (Sun)
  63247572000, #    local_end 2005-03-27 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63247557600, #    utc_start 2005-03-26 22:00:00 (Sat)
  63266306400, #      utc_end 2005-10-29 22:00:00 (Sat)
  63247575600, #  local_start 2005-03-27 03:00:00 (Sun)
  63266324400, #    local_end 2005-10-30 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63266306400, #    utc_start 2005-10-29 22:00:00 (Sat)
  63279007200, #      utc_end 2006-03-25 22:00:00 (Sat)
  63266320800, #  local_start 2005-10-30 02:00:00 (Sun)
  63279021600, #    local_end 2006-03-26 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63279007200, #    utc_start 2006-03-25 22:00:00 (Sat)
  63297756000, #      utc_end 2006-10-28 22:00:00 (Sat)
  63279025200, #  local_start 2006-03-26 03:00:00 (Sun)
  63297774000, #    local_end 2006-10-29 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63297756000, #    utc_start 2006-10-28 22:00:00 (Sat)
  63310456800, #      utc_end 2007-03-24 22:00:00 (Sat)
  63297770400, #  local_start 2006-10-29 02:00:00 (Sun)
  63310471200, #    local_end 2007-03-25 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63310456800, #    utc_start 2007-03-24 22:00:00 (Sat)
  63329205600, #      utc_end 2007-10-27 22:00:00 (Sat)
  63310474800, #  local_start 2007-03-25 03:00:00 (Sun)
  63329223600, #    local_end 2007-10-28 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63329205600, #    utc_start 2007-10-27 22:00:00 (Sat)
  63342511200, #      utc_end 2008-03-29 22:00:00 (Sat)
  63329220000, #  local_start 2007-10-28 02:00:00 (Sun)
  63342525600, #    local_end 2008-03-30 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63342511200, #    utc_start 2008-03-29 22:00:00 (Sat)
  63360655200, #      utc_end 2008-10-25 22:00:00 (Sat)
  63342529200, #  local_start 2008-03-30 03:00:00 (Sun)
  63360673200, #    local_end 2008-10-26 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63360655200, #    utc_start 2008-10-25 22:00:00 (Sat)
  63373960800, #      utc_end 2009-03-28 22:00:00 (Sat)
  63360669600, #  local_start 2008-10-26 02:00:00 (Sun)
  63373975200, #    local_end 2009-03-29 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63373960800, #    utc_start 2009-03-28 22:00:00 (Sat)
  63392104800, #      utc_end 2009-10-24 22:00:00 (Sat)
  63373978800, #  local_start 2009-03-29 03:00:00 (Sun)
  63392122800, #    local_end 2009-10-25 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63392104800, #    utc_start 2009-10-24 22:00:00 (Sat)
  63405410400, #      utc_end 2010-03-27 22:00:00 (Sat)
  63392119200, #  local_start 2009-10-25 02:00:00 (Sun)
  63405424800, #    local_end 2010-03-28 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63405410400, #    utc_start 2010-03-27 22:00:00 (Sat)
  63424159200, #      utc_end 2010-10-30 22:00:00 (Sat)
  63405428400, #  local_start 2010-03-28 03:00:00 (Sun)
  63424177200, #    local_end 2010-10-31 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63424159200, #    utc_start 2010-10-30 22:00:00 (Sat)
  63429508800, #      utc_end 2010-12-31 20:00:00 (Fri)
  63424173600, #  local_start 2010-10-31 02:00:00 (Sun)
  63429523200, #    local_end 2011-01-01 00:00:00 (Sat)
  14400,
  0,
  '+04',
      ],
      [
  63429508800, #    utc_start 2010-12-31 20:00:00 (Fri)
  63436860000, #      utc_end 2011-03-26 22:00:00 (Sat)
  63429523200, #  local_start 2011-01-01 00:00:00 (Sat)
  63436874400, #    local_end 2011-03-27 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63436860000, #    utc_start 2011-03-26 22:00:00 (Sat)
  63455608800, #      utc_end 2011-10-29 22:00:00 (Sat)
  63436878000, #  local_start 2011-03-27 03:00:00 (Sun)
  63455626800, #    local_end 2011-10-30 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63455608800, #    utc_start 2011-10-29 22:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  63455623200, #  local_start 2011-10-30 02:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  14400,
  0,
  '+04',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {30}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ASIA_YEREVAN

    $main::fatpacked{"DateTime/TimeZone/Atlantic/Azores.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ATLANTIC_AZORES';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Atlantic::Azores;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Atlantic::Azores::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59421778960, #      utc_end 1884-01-01 01:42:40 (Tue)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59421772800, #    local_end 1884-01-01 00:00:00 (Tue)
  -6160,
  0,
  'LMT',
      ],
      [
  59421778960, #    utc_start 1884-01-01 01:42:40 (Tue)
  60305306400, #      utc_end 1912-01-01 02:00:00 (Mon)
  59421772088, #  local_start 1883-12-31 23:48:08 (Mon)
  60305299528, #    local_end 1912-01-01 00:05:28 (Mon)
  -6872,
  0,
  'HMT',
      ],
      [
  60305306400, #    utc_start 1912-01-01 02:00:00 (Mon)
  60446134800, #      utc_end 1916-06-18 01:00:00 (Sun)
  60305299200, #  local_start 1912-01-01 00:00:00 (Mon)
  60446127600, #    local_end 1916-06-17 23:00:00 (Sat)
  -7200,
  0,
  '-02',
      ],
      [
  60446134800, #    utc_start 1916-06-18 01:00:00 (Sun)
  60457888800, #      utc_end 1916-11-01 02:00:00 (Wed)
  60446131200, #  local_start 1916-06-18 00:00:00 (Sun)
  60457885200, #    local_end 1916-11-01 01:00:00 (Wed)
  -3600,
  1,
  '-01',
      ],
      [
  60457888800, #    utc_start 1916-11-01 02:00:00 (Wed)
  60468253200, #      utc_end 1917-03-01 01:00:00 (Thu)
  60457881600, #  local_start 1916-11-01 00:00:00 (Wed)
  60468246000, #    local_end 1917-02-28 23:00:00 (Wed)
  -7200,
  0,
  '-02',
      ],
      [
  60468253200, #    utc_start 1917-03-01 01:00:00 (Thu)
  60487952400, #      utc_end 1917-10-15 01:00:00 (Mon)
  60468249600, #  local_start 1917-03-01 00:00:00 (Thu)
  60487948800, #    local_end 1917-10-15 00:00:00 (Mon)
  -3600,
  1,
  '-01',
      ],
      [
  60487952400, #    utc_start 1917-10-15 01:00:00 (Mon)
  60499875600, #      utc_end 1918-03-02 01:00:00 (Sat)
  60487945200, #  local_start 1917-10-14 23:00:00 (Sun)
  60499868400, #    local_end 1918-03-01 23:00:00 (Fri)
  -7200,
  0,
  '-02',
      ],
      [
  60499875600, #    utc_start 1918-03-02 01:00:00 (Sat)
  60519488400, #      utc_end 1918-10-15 01:00:00 (Tue)
  60499872000, #  local_start 1918-03-02 00:00:00 (Sat)
  60519484800, #    local_end 1918-10-15 00:00:00 (Tue)
  -3600,
  1,
  '-01',
      ],
      [
  60519488400, #    utc_start 1918-10-15 01:00:00 (Tue)
  60531325200, #      utc_end 1919-03-01 01:00:00 (Sat)
  60519481200, #  local_start 1918-10-14 23:00:00 (Mon)
  60531318000, #    local_end 1919-02-28 23:00:00 (Fri)
  -7200,
  0,
  '-02',
      ],
      [
  60531325200, #    utc_start 1919-03-01 01:00:00 (Sat)
  60551024400, #      utc_end 1919-10-15 01:00:00 (Wed)
  60531321600, #  local_start 1919-03-01 00:00:00 (Sat)
  60551020800, #    local_end 1919-10-15 00:00:00 (Wed)
  -3600,
  1,
  '-01',
      ],
      [
  60551024400, #    utc_start 1919-10-15 01:00:00 (Wed)
  60562947600, #      utc_end 1920-03-01 01:00:00 (Mon)
  60551017200, #  local_start 1919-10-14 23:00:00 (Tue)
  60562940400, #    local_end 1920-02-29 23:00:00 (Sun)
  -7200,
  0,
  '-02',
      ],
      [
  60562947600, #    utc_start 1920-03-01 01:00:00 (Mon)
  60582646800, #      utc_end 1920-10-15 01:00:00 (Fri)
  60562944000, #  local_start 1920-03-01 00:00:00 (Mon)
  60582643200, #    local_end 1920-10-15 00:00:00 (Fri)
  -3600,
  1,
  '-01',
      ],
      [
  60582646800, #    utc_start 1920-10-15 01:00:00 (Fri)
  60594483600, #      utc_end 1921-03-01 01:00:00 (Tue)
  60582639600, #  local_start 1920-10-14 23:00:00 (Thu)
  60594476400, #    local_end 1921-02-28 23:00:00 (Mon)
  -7200,
  0,
  '-02',
      ],
      [
  60594483600, #    utc_start 1921-03-01 01:00:00 (Tue)
  60614182800, #      utc_end 1921-10-15 01:00:00 (Sat)
  60594480000, #  local_start 1921-03-01 00:00:00 (Tue)
  60614179200, #    local_end 1921-10-15 00:00:00 (Sat)
  -3600,
  1,
  '-01',
      ],
      [
  60614182800, #    utc_start 1921-10-15 01:00:00 (Sat)
  60693238800, #      utc_end 1924-04-17 01:00:00 (Thu)
  60614175600, #  local_start 1921-10-14 23:00:00 (Fri)
  60693231600, #    local_end 1924-04-16 23:00:00 (Wed)
  -7200,
  0,
  '-02',
      ],
      [
  60693238800, #    utc_start 1924-04-17 01:00:00 (Thu)
  60708877200, #      utc_end 1924-10-15 01:00:00 (Wed)
  60693235200, #  local_start 1924-04-17 00:00:00 (Thu)
  60708873600, #    local_end 1924-10-15 00:00:00 (Wed)
  -3600,
  1,
  '-01',
      ],
      [
  60708877200, #    utc_start 1924-10-15 01:00:00 (Wed)
  60756397200, #      utc_end 1926-04-18 01:00:00 (Sun)
  60708870000, #  local_start 1924-10-14 23:00:00 (Tue)
  60756390000, #    local_end 1926-04-17 23:00:00 (Sat)
  -7200,
  0,
  '-02',
      ],
      [
  60756397200, #    utc_start 1926-04-18 01:00:00 (Sun)
  60770912400, #      utc_end 1926-10-03 01:00:00 (Sun)
  60756393600, #  local_start 1926-04-18 00:00:00 (Sun)
  60770908800, #    local_end 1926-10-03 00:00:00 (Sun)
  -3600,
  1,
  '-01',
      ],
      [
  60770912400, #    utc_start 1926-10-03 01:00:00 (Sun)
  60787242000, #      utc_end 1927-04-10 01:00:00 (Sun)
  60770905200, #  local_start 1926-10-02 23:00:00 (Sat)
  60787234800, #    local_end 1927-04-09 23:00:00 (Sat)
  -7200,
  0,
  '-02',
      ],
      [
  60787242000, #    utc_start 1927-04-10 01:00:00 (Sun)
  60802362000, #      utc_end 1927-10-02 01:00:00 (Sun)
  60787238400, #  local_start 1927-04-10 00:00:00 (Sun)
  60802358400, #    local_end 1927-10-02 00:00:00 (Sun)
  -3600,
  1,
  '-01',
      ],
      [
  60802362000, #    utc_start 1927-10-02 01:00:00 (Sun)
  60819296400, #      utc_end 1928-04-15 01:00:00 (Sun)
  60802354800, #  local_start 1927-10-01 23:00:00 (Sat)
  60819289200, #    local_end 1928-04-14 23:00:00 (Sat)
  -7200,
  0,
  '-02',
      ],
      [
  60819296400, #    utc_start 1928-04-15 01:00:00 (Sun)
  60834416400, #      utc_end 1928-10-07 01:00:00 (Sun)
  60819292800, #  local_start 1928-04-15 00:00:00 (Sun)
  60834412800, #    local_end 1928-10-07 00:00:00 (Sun)
  -3600,
  1,
  '-01',
      ],
      [
  60834416400, #    utc_start 1928-10-07 01:00:00 (Sun)
  60851350800, #      utc_end 1929-04-21 01:00:00 (Sun)
  60834409200, #  local_start 1928-10-06 23:00:00 (Sat)
  60851343600, #    local_end 1929-04-20 23:00:00 (Sat)
  -7200,
  0,
  '-02',
      ],
      [
  60851350800, #    utc_start 1929-04-21 01:00:00 (Sun)
  60865866000, #      utc_end 1929-10-06 01:00:00 (Sun)
  60851347200, #  local_start 1929-04-21 00:00:00 (Sun)
  60865862400, #    local_end 1929-10-06 00:00:00 (Sun)
  -3600,
  1,
  '-01',
      ],
      [
  60865866000, #    utc_start 1929-10-06 01:00:00 (Sun)
  60914250000, #      utc_end 1931-04-19 01:00:00 (Sun)
  60865858800, #  local_start 1929-10-05 23:00:00 (Sat)
  60914242800, #    local_end 1931-04-18 23:00:00 (Sat)
  -7200,
  0,
  '-02',
      ],
      [
  60914250000, #    utc_start 1931-04-19 01:00:00 (Sun)
  60928765200, #      utc_end 1931-10-04 01:00:00 (Sun)
  60914246400, #  local_start 1931-04-19 00:00:00 (Sun)
  60928761600, #    local_end 1931-10-04 00:00:00 (Sun)
  -3600,
  1,
  '-01',
      ],
      [
  60928765200, #    utc_start 1931-10-04 01:00:00 (Sun)
  60944490000, #      utc_end 1932-04-03 01:00:00 (Sun)
  60928758000, #  local_start 1931-10-03 23:00:00 (Sat)
  60944482800, #    local_end 1932-04-02 23:00:00 (Sat)
  -7200,
  0,
  '-02',
      ],
      [
  60944490000, #    utc_start 1932-04-03 01:00:00 (Sun)
  60960214800, #      utc_end 1932-10-02 01:00:00 (Sun)
  60944486400, #  local_start 1932-04-03 00:00:00 (Sun)
  60960211200, #    local_end 1932-10-02 00:00:00 (Sun)
  -3600,
  1,
  '-01',
      ],
      [
  60960214800, #    utc_start 1932-10-02 01:00:00 (Sun)
  61007994000, #      utc_end 1934-04-08 01:00:00 (Sun)
  60960207600, #  local_start 1932-10-01 23:00:00 (Sat)
  61007986800, #    local_end 1934-04-07 23:00:00 (Sat)
  -7200,
  0,
  '-02',
      ],
      [
  61007994000, #    utc_start 1934-04-08 01:00:00 (Sun)
  61023718800, #      utc_end 1934-10-07 01:00:00 (Sun)
  61007990400, #  local_start 1934-04-08 00:00:00 (Sun)
  61023715200, #    local_end 1934-10-07 00:00:00 (Sun)
  -3600,
  1,
  '-01',
      ],
      [
  61023718800, #    utc_start 1934-10-07 01:00:00 (Sun)
  61038838800, #      utc_end 1935-03-31 01:00:00 (Sun)
  61023711600, #  local_start 1934-10-06 23:00:00 (Sat)
  61038831600, #    local_end 1935-03-30 23:00:00 (Sat)
  -7200,
  0,
  '-02',
      ],
      [
  61038838800, #    utc_start 1935-03-31 01:00:00 (Sun)
  61055168400, #      utc_end 1935-10-06 01:00:00 (Sun)
  61038835200, #  local_start 1935-03-31 00:00:00 (Sun)
  61055164800, #    local_end 1935-10-06 00:00:00 (Sun)
  -3600,
  1,
  '-01',
      ],
      [
  61055168400, #    utc_start 1935-10-06 01:00:00 (Sun)
  61072102800, #      utc_end 1936-04-19 01:00:00 (Sun)
  61055161200, #  local_start 1935-10-05 23:00:00 (Sat)
  61072095600, #    local_end 1936-04-18 23:00:00 (Sat)
  -7200,
  0,
  '-02',
      ],
      [
  61072102800, #    utc_start 1936-04-19 01:00:00 (Sun)
  61086618000, #      utc_end 1936-10-04 01:00:00 (Sun)
  61072099200, #  local_start 1936-04-19 00:00:00 (Sun)
  61086614400, #    local_end 1936-10-04 00:00:00 (Sun)
  -3600,
  1,
  '-01',
      ],
      [
  61086618000, #    utc_start 1936-10-04 01:00:00 (Sun)
  61102342800, #      utc_end 1937-04-04 01:00:00 (Sun)
  61086610800, #  local_start 1936-10-03 23:00:00 (Sat)
  61102335600, #    local_end 1937-04-03 23:00:00 (Sat)
  -7200,
  0,
  '-02',
      ],
      [
  61102342800, #    utc_start 1937-04-04 01:00:00 (Sun)
  61118067600, #      utc_end 1937-10-03 01:00:00 (Sun)
  61102339200, #  local_start 1937-04-04 00:00:00 (Sun)
  61118064000, #    local_end 1937-10-03 00:00:00 (Sun)
  -3600,
  1,
  '-01',
      ],
      [
  61118067600, #    utc_start 1937-10-03 01:00:00 (Sun)
  61133187600, #      utc_end 1938-03-27 01:00:00 (Sun)
  61118060400, #  local_start 1937-10-02 23:00:00 (Sat)
  61133180400, #    local_end 1938-03-26 23:00:00 (Sat)
  -7200,
  0,
  '-02',
      ],
      [
  61133187600, #    utc_start 1938-03-27 01:00:00 (Sun)
  61149517200, #      utc_end 1938-10-02 01:00:00 (Sun)
  61133184000, #  local_start 1938-03-27 00:00:00 (Sun)
  61149513600, #    local_end 1938-10-02 00:00:00 (Sun)
  -3600,
  1,
  '-01',
      ],
      [
  61149517200, #    utc_start 1938-10-02 01:00:00 (Sun)
  61166451600, #      utc_end 1939-04-16 01:00:00 (Sun)
  61149510000, #  local_start 1938-10-01 23:00:00 (Sat)
  61166444400, #    local_end 1939-04-15 23:00:00 (Sat)
  -7200,
  0,
  '-02',
      ],
      [
  61166451600, #    utc_start 1939-04-16 01:00:00 (Sun)
  61185200400, #      utc_end 1939-11-19 01:00:00 (Sun)
  61166448000, #  local_start 1939-04-16 00:00:00 (Sun)
  61185196800, #    local_end 1939-11-19 00:00:00 (Sun)
  -3600,
  1,
  '-01',
      ],
      [
  61185200400, #    utc_start 1939-11-19 01:00:00 (Sun)
  61193667600, #      utc_end 1940-02-25 01:00:00 (Sun)
  61185193200, #  local_start 1939-11-18 23:00:00 (Sat)
  61193660400, #    local_end 1940-02-24 23:00:00 (Sat)
  -7200,
  0,
  '-02',
      ],
      [
  61193667600, #    utc_start 1940-02-25 01:00:00 (Sun)
  61213021200, #      utc_end 1940-10-06 01:00:00 (Sun)
  61193664000, #  local_start 1940-02-25 00:00:00 (Sun)
  61213017600, #    local_end 1940-10-06 00:00:00 (Sun)
  -3600,
  1,
  '-01',
      ],
      [
  61213021200, #    utc_start 1940-10-06 01:00:00 (Sun)
  61228746000, #      utc_end 1941-04-06 01:00:00 (Sun)
  61213014000, #  local_start 1940-10-05 23:00:00 (Sat)
  61228738800, #    local_end 1941-04-05 23:00:00 (Sat)
  -7200,
  0,
  '-02',
      ],
      [
  61228746000, #    utc_start 1941-04-06 01:00:00 (Sun)
  61244557200, #      utc_end 1941-10-06 01:00:00 (Mon)
  61228742400, #  local_start 1941-04-06 00:00:00 (Sun)
  61244553600, #    local_end 1941-10-06 00:00:00 (Mon)
  -3600,
  1,
  '-01',
      ],
      [
  61244557200, #    utc_start 1941-10-06 01:00:00 (Mon)
  61258381200, #      utc_end 1942-03-15 01:00:00 (Sun)
  61244550000, #  local_start 1941-10-05 23:00:00 (Sun)
  61258374000, #    local_end 1942-03-14 23:00:00 (Sat)
  -7200,
  0,
  '-02',
      ],
      [
  61258381200, #    utc_start 1942-03-15 01:00:00 (Sun)
  61262006400, #      utc_end 1942-04-26 00:00:00 (Sun)
  61258377600, #  local_start 1942-03-15 00:00:00 (Sun)
  61262002800, #    local_end 1942-04-25 23:00:00 (Sat)
  -3600,
  1,
  '-01',
      ],
      [
  61262006400, #    utc_start 1942-04-26 00:00:00 (Sun)
  61271683200, #      utc_end 1942-08-16 00:00:00 (Sun)
  61262006400, #  local_start 1942-04-26 00:00:00 (Sun)
  61271683200, #    local_end 1942-08-16 00:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  61271683200, #    utc_start 1942-08-16 00:00:00 (Sun)
  61277734800, #      utc_end 1942-10-25 01:00:00 (Sun)
  61271679600, #  local_start 1942-08-15 23:00:00 (Sat)
  61277731200, #    local_end 1942-10-25 00:00:00 (Sun)
  -3600,
  1,
  '-01',
      ],
      [
  61277734800, #    utc_start 1942-10-25 01:00:00 (Sun)
  61289830800, #      utc_end 1943-03-14 01:00:00 (Sun)
  61277727600, #  local_start 1942-10-24 23:00:00 (Sat)
  61289823600, #    local_end 1943-03-13 23:00:00 (Sat)
  -7200,
  0,
  '-02',
      ],
      [
  61289830800, #    utc_start 1943-03-14 01:00:00 (Sun)
  61292851200, #      utc_end 1943-04-18 00:00:00 (Sun)
  61289827200, #  local_start 1943-03-14 00:00:00 (Sun)
  61292847600, #    local_end 1943-04-17 23:00:00 (Sat)
  -3600,
  1,
  '-01',
      ],
      [
  61292851200, #    utc_start 1943-04-18 00:00:00 (Sun)
  61304342400, #      utc_end 1943-08-29 00:00:00 (Sun)
  61292851200, #  local_start 1943-04-18 00:00:00 (Sun)
  61304342400, #    local_end 1943-08-29 00:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  61304342400, #    utc_start 1943-08-29 00:00:00 (Sun)
  61309789200, #      utc_end 1943-10-31 01:00:00 (Sun)
  61304338800, #  local_start 1943-08-28 23:00:00 (Sat)
  61309785600, #    local_end 1943-10-31 00:00:00 (Sun)
  -3600,
  1,
  '-01',
      ],
      [
  61309789200, #    utc_start 1943-10-31 01:00:00 (Sun)
  61321280400, #      utc_end 1944-03-12 01:00:00 (Sun)
  61309782000, #  local_start 1943-10-30 23:00:00 (Sat)
  61321273200, #    local_end 1944-03-11 23:00:00 (Sat)
  -7200,
  0,
  '-02',
      ],
      [
  61321280400, #    utc_start 1944-03-12 01:00:00 (Sun)
  61324905600, #      utc_end 1944-04-23 00:00:00 (Sun)
  61321276800, #  local_start 1944-03-12 00:00:00 (Sun)
  61324902000, #    local_end 1944-04-22 23:00:00 (Sat)
  -3600,
  1,
  '-01',
      ],
      [
  61324905600, #    utc_start 1944-04-23 00:00:00 (Sun)
  61335792000, #      utc_end 1944-08-27 00:00:00 (Sun)
  61324905600, #  local_start 1944-04-23 00:00:00 (Sun)
  61335792000, #    local_end 1944-08-27 00:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  61335792000, #    utc_start 1944-08-27 00:00:00 (Sun)
  61341238800, #      utc_end 1944-10-29 01:00:00 (Sun)
  61335788400, #  local_start 1944-08-26 23:00:00 (Sat)
  61341235200, #    local_end 1944-10-29 00:00:00 (Sun)
  -3600,
  1,
  '-01',
      ],
      [
  61341238800, #    utc_start 1944-10-29 01:00:00 (Sun)
  61352730000, #      utc_end 1945-03-11 01:00:00 (Sun)
  61341231600, #  local_start 1944-10-28 23:00:00 (Sat)
  61352722800, #    local_end 1945-03-10 23:00:00 (Sat)
  -7200,
  0,
  '-02',
      ],
      [
  61352730000, #    utc_start 1945-03-11 01:00:00 (Sun)
  61356355200, #      utc_end 1945-04-22 00:00:00 (Sun)
  61352726400, #  local_start 1945-03-11 00:00:00 (Sun)
  61356351600, #    local_end 1945-04-21 23:00:00 (Sat)
  -3600,
  1,
  '-01',
      ],
      [
  61356355200, #    utc_start 1945-04-22 00:00:00 (Sun)
  61367241600, #      utc_end 1945-08-26 00:00:00 (Sun)
  61356355200, #  local_start 1945-04-22 00:00:00 (Sun)
  61367241600, #    local_end 1945-08-26 00:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  61367241600, #    utc_start 1945-08-26 00:00:00 (Sun)
  61372688400, #      utc_end 1945-10-28 01:00:00 (Sun)
  61367238000, #  local_start 1945-08-25 23:00:00 (Sat)
  61372684800, #    local_end 1945-10-28 00:00:00 (Sun)
  -3600,
  1,
  '-01',
      ],
      [
  61372688400, #    utc_start 1945-10-28 01:00:00 (Sun)
  61386598800, #      utc_end 1946-04-07 01:00:00 (Sun)
  61372681200, #  local_start 1945-10-27 23:00:00 (Sat)
  61386591600, #    local_end 1946-04-06 23:00:00 (Sat)
  -7200,
  0,
  '-02',
      ],
      [
  61386598800, #    utc_start 1946-04-07 01:00:00 (Sun)
  61402323600, #      utc_end 1946-10-06 01:00:00 (Sun)
  61386595200, #  local_start 1946-04-07 00:00:00 (Sun)
  61402320000, #    local_end 1946-10-06 00:00:00 (Sun)
  -3600,
  1,
  '-01',
      ],
      [
  61402323600, #    utc_start 1946-10-06 01:00:00 (Sun)
  61418059200, #      utc_end 1947-04-06 04:00:00 (Sun)
  61402316400, #  local_start 1946-10-05 23:00:00 (Sat)
  61418052000, #    local_end 1947-04-06 02:00:00 (Sun)
  -7200,
  0,
  '-02',
      ],
      [
  61418059200, #    utc_start 1947-04-06 04:00:00 (Sun)
  61433784000, #      utc_end 1947-10-05 04:00:00 (Sun)
  61418055600, #  local_start 1947-04-06 03:00:00 (Sun)
  61433780400, #    local_end 1947-10-05 03:00:00 (Sun)
  -3600,
  1,
  '-01',
      ],
      [
  61433784000, #    utc_start 1947-10-05 04:00:00 (Sun)
  61449508800, #      utc_end 1948-04-04 04:00:00 (Sun)
  61433776800, #  local_start 1947-10-05 02:00:00 (Sun)
  61449501600, #    local_end 1948-04-04 02:00:00 (Sun)
  -7200,
  0,
  '-02',
      ],
      [
  61449508800, #    utc_start 1948-04-04 04:00:00 (Sun)
  61465233600, #      utc_end 1948-10-03 04:00:00 (Sun)
  61449505200, #  local_start 1948-04-04 03:00:00 (Sun)
  61465230000, #    local_end 1948-10-03 03:00:00 (Sun)
  -3600,
  1,
  '-01',
      ],
      [
  61465233600, #    utc_start 1948-10-03 04:00:00 (Sun)
  61480958400, #      utc_end 1949-04-03 04:00:00 (Sun)
  61465226400, #  local_start 1948-10-03 02:00:00 (Sun)
  61480951200, #    local_end 1949-04-03 02:00:00 (Sun)
  -7200,
  0,
  '-02',
      ],
      [
  61480958400, #    utc_start 1949-04-03 04:00:00 (Sun)
  61496683200, #      utc_end 1949-10-02 04:00:00 (Sun)
  61480954800, #  local_start 1949-04-03 03:00:00 (Sun)
  61496679600, #    local_end 1949-10-02 03:00:00 (Sun)
  -3600,
  1,
  '-01',
      ],
      [
  61496683200, #    utc_start 1949-10-02 04:00:00 (Sun)
  61543857600, #      utc_end 1951-04-01 04:00:00 (Sun)
  61496676000, #  local_start 1949-10-02 02:00:00 (Sun)
  61543850400, #    local_end 1951-04-01 02:00:00 (Sun)
  -7200,
  0,
  '-02',
      ],
      [
  61543857600, #    utc_start 1951-04-01 04:00:00 (Sun)
  61560187200, #      utc_end 1951-10-07 04:00:00 (Sun)
  61543854000, #  local_start 1951-04-01 03:00:00 (Sun)
  61560183600, #    local_end 1951-10-07 03:00:00 (Sun)
  -3600,
  1,
  '-01',
      ],
      [
  61560187200, #    utc_start 1951-10-07 04:00:00 (Sun)
  61575912000, #      utc_end 1952-04-06 04:00:00 (Sun)
  61560180000, #  local_start 1951-10-07 02:00:00 (Sun)
  61575904800, #    local_end 1952-04-06 02:00:00 (Sun)
  -7200,
  0,
  '-02',
      ],
      [
  61575912000, #    utc_start 1952-04-06 04:00:00 (Sun)
  61591636800, #      utc_end 1952-10-05 04:00:00 (Sun)
  61575908400, #  local_start 1952-04-06 03:00:00 (Sun)
  61591633200, #    local_end 1952-10-05 03:00:00 (Sun)
  -3600,
  1,
  '-01',
      ],
      [
  61591636800, #    utc_start 1952-10-05 04:00:00 (Sun)
  61607361600, #      utc_end 1953-04-05 04:00:00 (Sun)
  61591629600, #  local_start 1952-10-05 02:00:00 (Sun)
  61607354400, #    local_end 1953-04-05 02:00:00 (Sun)
  -7200,
  0,
  '-02',
      ],
      [
  61607361600, #    utc_start 1953-04-05 04:00:00 (Sun)
  61623086400, #      utc_end 1953-10-04 04:00:00 (Sun)
  61607358000, #  local_start 1953-04-05 03:00:00 (Sun)
  61623082800, #    local_end 1953-10-04 03:00:00 (Sun)
  -3600,
  1,
  '-01',
      ],
      [
  61623086400, #    utc_start 1953-10-04 04:00:00 (Sun)
  61638811200, #      utc_end 1954-04-04 04:00:00 (Sun)
  61623079200, #  local_start 1953-10-04 02:00:00 (Sun)
  61638804000, #    local_end 1954-04-04 02:00:00 (Sun)
  -7200,
  0,
  '-02',
      ],
      [
  61638811200, #    utc_start 1954-04-04 04:00:00 (Sun)
  61654536000, #      utc_end 1954-10-03 04:00:00 (Sun)
  61638807600, #  local_start 1954-04-04 03:00:00 (Sun)
  61654532400, #    local_end 1954-10-03 03:00:00 (Sun)
  -3600,
  1,
  '-01',
      ],
      [
  61654536000, #    utc_start 1954-10-03 04:00:00 (Sun)
  61670260800, #      utc_end 1955-04-03 04:00:00 (Sun)
  61654528800, #  local_start 1954-10-03 02:00:00 (Sun)
  61670253600, #    local_end 1955-04-03 02:00:00 (Sun)
  -7200,
  0,
  '-02',
      ],
      [
  61670260800, #    utc_start 1955-04-03 04:00:00 (Sun)
  61685985600, #      utc_end 1955-10-02 04:00:00 (Sun)
  61670257200, #  local_start 1955-04-03 03:00:00 (Sun)
  61685982000, #    local_end 1955-10-02 03:00:00 (Sun)
  -3600,
  1,
  '-01',
      ],
      [
  61685985600, #    utc_start 1955-10-02 04:00:00 (Sun)
  61701710400, #      utc_end 1956-04-01 04:00:00 (Sun)
  61685978400, #  local_start 1955-10-02 02:00:00 (Sun)
  61701703200, #    local_end 1956-04-01 02:00:00 (Sun)
  -7200,
  0,
  '-02',
      ],
      [
  61701710400, #    utc_start 1956-04-01 04:00:00 (Sun)
  61718040000, #      utc_end 1956-10-07 04:00:00 (Sun)
  61701706800, #  local_start 1956-04-01 03:00:00 (Sun)
  61718036400, #    local_end 1956-10-07 03:00:00 (Sun)
  -3600,
  1,
  '-01',
      ],
      [
  61718040000, #    utc_start 1956-10-07 04:00:00 (Sun)
  61733764800, #      utc_end 1957-04-07 04:00:00 (Sun)
  61718032800, #  local_start 1956-10-07 02:00:00 (Sun)
  61733757600, #    local_end 1957-04-07 02:00:00 (Sun)
  -7200,
  0,
  '-02',
      ],
      [
  61733764800, #    utc_start 1957-04-07 04:00:00 (Sun)
  61749489600, #      utc_end 1957-10-06 04:00:00 (Sun)
  61733761200, #  local_start 1957-04-07 03:00:00 (Sun)
  61749486000, #    local_end 1957-10-06 03:00:00 (Sun)
  -3600,
  1,
  '-01',
      ],
      [
  61749489600, #    utc_start 1957-10-06 04:00:00 (Sun)
  61765214400, #      utc_end 1958-04-06 04:00:00 (Sun)
  61749482400, #  local_start 1957-10-06 02:00:00 (Sun)
  61765207200, #    local_end 1958-04-06 02:00:00 (Sun)
  -7200,
  0,
  '-02',
      ],
      [
  61765214400, #    utc_start 1958-04-06 04:00:00 (Sun)
  61780939200, #      utc_end 1958-10-05 04:00:00 (Sun)
  61765210800, #  local_start 1958-04-06 03:00:00 (Sun)
  61780935600, #    local_end 1958-10-05 03:00:00 (Sun)
  -3600,
  1,
  '-01',
      ],
      [
  61780939200, #    utc_start 1958-10-05 04:00:00 (Sun)
  61796664000, #      utc_end 1959-04-05 04:00:00 (Sun)
  61780932000, #  local_start 1958-10-05 02:00:00 (Sun)
  61796656800, #    local_end 1959-04-05 02:00:00 (Sun)
  -7200,
  0,
  '-02',
      ],
      [
  61796664000, #    utc_start 1959-04-05 04:00:00 (Sun)
  61812388800, #      utc_end 1959-10-04 04:00:00 (Sun)
  61796660400, #  local_start 1959-04-05 03:00:00 (Sun)
  61812385200, #    local_end 1959-10-04 03:00:00 (Sun)
  -3600,
  1,
  '-01',
      ],
      [
  61812388800, #    utc_start 1959-10-04 04:00:00 (Sun)
  61828113600, #      utc_end 1960-04-03 04:00:00 (Sun)
  61812381600, #  local_start 1959-10-04 02:00:00 (Sun)
  61828106400, #    local_end 1960-04-03 02:00:00 (Sun)
  -7200,
  0,
  '-02',
      ],
      [
  61828113600, #    utc_start 1960-04-03 04:00:00 (Sun)
  61843838400, #      utc_end 1960-10-02 04:00:00 (Sun)
  61828110000, #  local_start 1960-04-03 03:00:00 (Sun)
  61843834800, #    local_end 1960-10-02 03:00:00 (Sun)
  -3600,
  1,
  '-01',
      ],
      [
  61843838400, #    utc_start 1960-10-02 04:00:00 (Sun)
  61859563200, #      utc_end 1961-04-02 04:00:00 (Sun)
  61843831200, #  local_start 1960-10-02 02:00:00 (Sun)
  61859556000, #    local_end 1961-04-02 02:00:00 (Sun)
  -7200,
  0,
  '-02',
      ],
      [
  61859563200, #    utc_start 1961-04-02 04:00:00 (Sun)
  61875288000, #      utc_end 1961-10-01 04:00:00 (Sun)
  61859559600, #  local_start 1961-04-02 03:00:00 (Sun)
  61875284400, #    local_end 1961-10-01 03:00:00 (Sun)
  -3600,
  1,
  '-01',
      ],
      [
  61875288000, #    utc_start 1961-10-01 04:00:00 (Sun)
  61891012800, #      utc_end 1962-04-01 04:00:00 (Sun)
  61875280800, #  local_start 1961-10-01 02:00:00 (Sun)
  61891005600, #    local_end 1962-04-01 02:00:00 (Sun)
  -7200,
  0,
  '-02',
      ],
      [
  61891012800, #    utc_start 1962-04-01 04:00:00 (Sun)
  61907342400, #      utc_end 1962-10-07 04:00:00 (Sun)
  61891009200, #  local_start 1962-04-01 03:00:00 (Sun)
  61907338800, #    local_end 1962-10-07 03:00:00 (Sun)
  -3600,
  1,
  '-01',
      ],
      [
  61907342400, #    utc_start 1962-10-07 04:00:00 (Sun)
  61923067200, #      utc_end 1963-04-07 04:00:00 (Sun)
  61907335200, #  local_start 1962-10-07 02:00:00 (Sun)
  61923060000, #    local_end 1963-04-07 02:00:00 (Sun)
  -7200,
  0,
  '-02',
      ],
      [
  61923067200, #    utc_start 1963-04-07 04:00:00 (Sun)
  61938792000, #      utc_end 1963-10-06 04:00:00 (Sun)
  61923063600, #  local_start 1963-04-07 03:00:00 (Sun)
  61938788400, #    local_end 1963-10-06 03:00:00 (Sun)
  -3600,
  1,
  '-01',
      ],
      [
  61938792000, #    utc_start 1963-10-06 04:00:00 (Sun)
  61954516800, #      utc_end 1964-04-05 04:00:00 (Sun)
  61938784800, #  local_start 1963-10-06 02:00:00 (Sun)
  61954509600, #    local_end 1964-04-05 02:00:00 (Sun)
  -7200,
  0,
  '-02',
      ],
      [
  61954516800, #    utc_start 1964-04-05 04:00:00 (Sun)
  61970241600, #      utc_end 1964-10-04 04:00:00 (Sun)
  61954513200, #  local_start 1964-04-05 03:00:00 (Sun)
  61970238000, #    local_end 1964-10-04 03:00:00 (Sun)
  -3600,
  1,
  '-01',
      ],
      [
  61970241600, #    utc_start 1964-10-04 04:00:00 (Sun)
  61985966400, #      utc_end 1965-04-04 04:00:00 (Sun)
  61970234400, #  local_start 1964-10-04 02:00:00 (Sun)
  61985959200, #    local_end 1965-04-04 02:00:00 (Sun)
  -7200,
  0,
  '-02',
      ],
      [
  61985966400, #    utc_start 1965-04-04 04:00:00 (Sun)
  62001691200, #      utc_end 1965-10-03 04:00:00 (Sun)
  61985962800, #  local_start 1965-04-04 03:00:00 (Sun)
  62001687600, #    local_end 1965-10-03 03:00:00 (Sun)
  -3600,
  1,
  '-01',
      ],
      [
  62001691200, #    utc_start 1965-10-03 04:00:00 (Sun)
  62017416000, #      utc_end 1966-04-03 04:00:00 (Sun)
  62001684000, #  local_start 1965-10-03 02:00:00 (Sun)
  62017408800, #    local_end 1966-04-03 02:00:00 (Sun)
  -7200,
  0,
  '-02',
      ],
      [
  62017416000, #    utc_start 1966-04-03 04:00:00 (Sun)
  62363955600, #      utc_end 1977-03-27 01:00:00 (Sun)
  62017412400, #  local_start 1966-04-03 03:00:00 (Sun)
  62363952000, #    local_end 1977-03-27 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  62363955600, #    utc_start 1977-03-27 01:00:00 (Sun)
  62379680400, #      utc_end 1977-09-25 01:00:00 (Sun)
  62363955600, #  local_start 1977-03-27 01:00:00 (Sun)
  62379680400, #    local_end 1977-09-25 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  62379680400, #    utc_start 1977-09-25 01:00:00 (Sun)
  62396010000, #      utc_end 1978-04-02 01:00:00 (Sun)
  62379676800, #  local_start 1977-09-25 00:00:00 (Sun)
  62396006400, #    local_end 1978-04-02 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  62396010000, #    utc_start 1978-04-02 01:00:00 (Sun)
  62411734800, #      utc_end 1978-10-01 01:00:00 (Sun)
  62396010000, #  local_start 1978-04-02 01:00:00 (Sun)
  62411734800, #    local_end 1978-10-01 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  62411734800, #    utc_start 1978-10-01 01:00:00 (Sun)
  62427459600, #      utc_end 1979-04-01 01:00:00 (Sun)
  62411731200, #  local_start 1978-10-01 00:00:00 (Sun)
  62427456000, #    local_end 1979-04-01 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  62427459600, #    utc_start 1979-04-01 01:00:00 (Sun)
  62443188000, #      utc_end 1979-09-30 02:00:00 (Sun)
  62427459600, #  local_start 1979-04-01 01:00:00 (Sun)
  62443188000, #    local_end 1979-09-30 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  62443188000, #    utc_start 1979-09-30 02:00:00 (Sun)
  62458909200, #      utc_end 1980-03-30 01:00:00 (Sun)
  62443184400, #  local_start 1979-09-30 01:00:00 (Sun)
  62458905600, #    local_end 1980-03-30 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  62458909200, #    utc_start 1980-03-30 01:00:00 (Sun)
  62474637600, #      utc_end 1980-09-28 02:00:00 (Sun)
  62458909200, #  local_start 1980-03-30 01:00:00 (Sun)
  62474637600, #    local_end 1980-09-28 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  62474637600, #    utc_start 1980-09-28 02:00:00 (Sun)
  62490362400, #      utc_end 1981-03-29 02:00:00 (Sun)
  62474634000, #  local_start 1980-09-28 01:00:00 (Sun)
  62490358800, #    local_end 1981-03-29 01:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  62490362400, #    utc_start 1981-03-29 02:00:00 (Sun)
  62506087200, #      utc_end 1981-09-27 02:00:00 (Sun)
  62490362400, #  local_start 1981-03-29 02:00:00 (Sun)
  62506087200, #    local_end 1981-09-27 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  62506087200, #    utc_start 1981-09-27 02:00:00 (Sun)
  62521812000, #      utc_end 1982-03-28 02:00:00 (Sun)
  62506083600, #  local_start 1981-09-27 01:00:00 (Sun)
  62521808400, #    local_end 1982-03-28 01:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  62521812000, #    utc_start 1982-03-28 02:00:00 (Sun)
  62537536800, #      utc_end 1982-09-26 02:00:00 (Sun)
  62521812000, #  local_start 1982-03-28 02:00:00 (Sun)
  62537536800, #    local_end 1982-09-26 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  62537536800, #    utc_start 1982-09-26 02:00:00 (Sun)
  62553265200, #      utc_end 1983-03-27 03:00:00 (Sun)
  62537533200, #  local_start 1982-09-26 01:00:00 (Sun)
  62553261600, #    local_end 1983-03-27 02:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  62553265200, #    utc_start 1983-03-27 03:00:00 (Sun)
  62568986400, #      utc_end 1983-09-25 02:00:00 (Sun)
  62553265200, #  local_start 1983-03-27 03:00:00 (Sun)
  62568986400, #    local_end 1983-09-25 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  62568986400, #    utc_start 1983-09-25 02:00:00 (Sun)
  62584711200, #      utc_end 1984-03-25 02:00:00 (Sun)
  62568982800, #  local_start 1983-09-25 01:00:00 (Sun)
  62584707600, #    local_end 1984-03-25 01:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  62584711200, #    utc_start 1984-03-25 02:00:00 (Sun)
  62601040800, #      utc_end 1984-09-30 02:00:00 (Sun)
  62584711200, #  local_start 1984-03-25 02:00:00 (Sun)
  62601040800, #    local_end 1984-09-30 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  62601040800, #    utc_start 1984-09-30 02:00:00 (Sun)
  62616765600, #      utc_end 1985-03-31 02:00:00 (Sun)
  62601037200, #  local_start 1984-09-30 01:00:00 (Sun)
  62616762000, #    local_end 1985-03-31 01:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  62616765600, #    utc_start 1985-03-31 02:00:00 (Sun)
  62632490400, #      utc_end 1985-09-29 02:00:00 (Sun)
  62616765600, #  local_start 1985-03-31 02:00:00 (Sun)
  62632490400, #    local_end 1985-09-29 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  62632490400, #    utc_start 1985-09-29 02:00:00 (Sun)
  62648215200, #      utc_end 1986-03-30 02:00:00 (Sun)
  62632486800, #  local_start 1985-09-29 01:00:00 (Sun)
  62648211600, #    local_end 1986-03-30 01:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  62648215200, #    utc_start 1986-03-30 02:00:00 (Sun)
  62663940000, #      utc_end 1986-09-28 02:00:00 (Sun)
  62648215200, #  local_start 1986-03-30 02:00:00 (Sun)
  62663940000, #    local_end 1986-09-28 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  62663940000, #    utc_start 1986-09-28 02:00:00 (Sun)
  62679664800, #      utc_end 1987-03-29 02:00:00 (Sun)
  62663936400, #  local_start 1986-09-28 01:00:00 (Sun)
  62679661200, #    local_end 1987-03-29 01:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  62679664800, #    utc_start 1987-03-29 02:00:00 (Sun)
  62695389600, #      utc_end 1987-09-27 02:00:00 (Sun)
  62679664800, #  local_start 1987-03-29 02:00:00 (Sun)
  62695389600, #    local_end 1987-09-27 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  62695389600, #    utc_start 1987-09-27 02:00:00 (Sun)
  62711114400, #      utc_end 1988-03-27 02:00:00 (Sun)
  62695386000, #  local_start 1987-09-27 01:00:00 (Sun)
  62711110800, #    local_end 1988-03-27 01:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  62711114400, #    utc_start 1988-03-27 02:00:00 (Sun)
  62726839200, #      utc_end 1988-09-25 02:00:00 (Sun)
  62711114400, #  local_start 1988-03-27 02:00:00 (Sun)
  62726839200, #    local_end 1988-09-25 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  62726839200, #    utc_start 1988-09-25 02:00:00 (Sun)
  62742564000, #      utc_end 1989-03-26 02:00:00 (Sun)
  62726835600, #  local_start 1988-09-25 01:00:00 (Sun)
  62742560400, #    local_end 1989-03-26 01:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  62742564000, #    utc_start 1989-03-26 02:00:00 (Sun)
  62758288800, #      utc_end 1989-09-24 02:00:00 (Sun)
  62742564000, #  local_start 1989-03-26 02:00:00 (Sun)
  62758288800, #    local_end 1989-09-24 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  62758288800, #    utc_start 1989-09-24 02:00:00 (Sun)
  62774013600, #      utc_end 1990-03-25 02:00:00 (Sun)
  62758285200, #  local_start 1989-09-24 01:00:00 (Sun)
  62774010000, #    local_end 1990-03-25 01:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  62774013600, #    utc_start 1990-03-25 02:00:00 (Sun)
  62790343200, #      utc_end 1990-09-30 02:00:00 (Sun)
  62774013600, #  local_start 1990-03-25 02:00:00 (Sun)
  62790343200, #    local_end 1990-09-30 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  62790343200, #    utc_start 1990-09-30 02:00:00 (Sun)
  62806068000, #      utc_end 1991-03-31 02:00:00 (Sun)
  62790339600, #  local_start 1990-09-30 01:00:00 (Sun)
  62806064400, #    local_end 1991-03-31 01:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  62806068000, #    utc_start 1991-03-31 02:00:00 (Sun)
  62821792800, #      utc_end 1991-09-29 02:00:00 (Sun)
  62806068000, #  local_start 1991-03-31 02:00:00 (Sun)
  62821792800, #    local_end 1991-09-29 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  62821792800, #    utc_start 1991-09-29 02:00:00 (Sun)
  62837517600, #      utc_end 1992-03-29 02:00:00 (Sun)
  62821789200, #  local_start 1991-09-29 01:00:00 (Sun)
  62837514000, #    local_end 1992-03-29 01:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  62837517600, #    utc_start 1992-03-29 02:00:00 (Sun)
  62853242400, #      utc_end 1992-09-27 02:00:00 (Sun)
  62837517600, #  local_start 1992-03-29 02:00:00 (Sun)
  62853242400, #    local_end 1992-09-27 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  62853242400, #    utc_start 1992-09-27 02:00:00 (Sun)
  62868963600, #      utc_end 1993-03-28 01:00:00 (Sun)
  62853242400, #  local_start 1992-09-27 02:00:00 (Sun)
  62868963600, #    local_end 1993-03-28 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62868963600, #    utc_start 1993-03-28 01:00:00 (Sun)
  62884688400, #      utc_end 1993-09-26 01:00:00 (Sun)
  62868963600, #  local_start 1993-03-28 01:00:00 (Sun)
  62884688400, #    local_end 1993-09-26 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  62884688400, #    utc_start 1993-09-26 01:00:00 (Sun)
  62900413200, #      utc_end 1994-03-27 01:00:00 (Sun)
  62884684800, #  local_start 1993-09-26 00:00:00 (Sun)
  62900409600, #    local_end 1994-03-27 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  62900413200, #    utc_start 1994-03-27 01:00:00 (Sun)
  62916138000, #      utc_end 1994-09-25 01:00:00 (Sun)
  62900413200, #  local_start 1994-03-27 01:00:00 (Sun)
  62916138000, #    local_end 1994-09-25 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  62916138000, #    utc_start 1994-09-25 01:00:00 (Sun)
  62931862800, #      utc_end 1995-03-26 01:00:00 (Sun)
  62916134400, #  local_start 1994-09-25 00:00:00 (Sun)
  62931859200, #    local_end 1995-03-26 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  62931862800, #    utc_start 1995-03-26 01:00:00 (Sun)
  62947587600, #      utc_end 1995-09-24 01:00:00 (Sun)
  62931862800, #  local_start 1995-03-26 01:00:00 (Sun)
  62947587600, #    local_end 1995-09-24 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  62947587600, #    utc_start 1995-09-24 01:00:00 (Sun)
  62963917200, #      utc_end 1996-03-31 01:00:00 (Sun)
  62947584000, #  local_start 1995-09-24 00:00:00 (Sun)
  62963913600, #    local_end 1996-03-31 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  62963917200, #    utc_start 1996-03-31 01:00:00 (Sun)
  62982061200, #      utc_end 1996-10-27 01:00:00 (Sun)
  62963917200, #  local_start 1996-03-31 01:00:00 (Sun)
  62982061200, #    local_end 1996-10-27 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  62982061200, #    utc_start 1996-10-27 01:00:00 (Sun)
  62995366800, #      utc_end 1997-03-30 01:00:00 (Sun)
  62982057600, #  local_start 1996-10-27 00:00:00 (Sun)
  62995363200, #    local_end 1997-03-30 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  62995366800, #    utc_start 1997-03-30 01:00:00 (Sun)
  63013510800, #      utc_end 1997-10-26 01:00:00 (Sun)
  62995366800, #  local_start 1997-03-30 01:00:00 (Sun)
  63013510800, #    local_end 1997-10-26 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63013510800, #    utc_start 1997-10-26 01:00:00 (Sun)
  63026816400, #      utc_end 1998-03-29 01:00:00 (Sun)
  63013507200, #  local_start 1997-10-26 00:00:00 (Sun)
  63026812800, #    local_end 1998-03-29 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  63026816400, #    utc_start 1998-03-29 01:00:00 (Sun)
  63044960400, #      utc_end 1998-10-25 01:00:00 (Sun)
  63026816400, #  local_start 1998-03-29 01:00:00 (Sun)
  63044960400, #    local_end 1998-10-25 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63044960400, #    utc_start 1998-10-25 01:00:00 (Sun)
  63058266000, #      utc_end 1999-03-28 01:00:00 (Sun)
  63044956800, #  local_start 1998-10-25 00:00:00 (Sun)
  63058262400, #    local_end 1999-03-28 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  63058266000, #    utc_start 1999-03-28 01:00:00 (Sun)
  63077014800, #      utc_end 1999-10-31 01:00:00 (Sun)
  63058266000, #  local_start 1999-03-28 01:00:00 (Sun)
  63077014800, #    local_end 1999-10-31 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63077014800, #    utc_start 1999-10-31 01:00:00 (Sun)
  63089715600, #      utc_end 2000-03-26 01:00:00 (Sun)
  63077011200, #  local_start 1999-10-31 00:00:00 (Sun)
  63089712000, #    local_end 2000-03-26 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  63089715600, #    utc_start 2000-03-26 01:00:00 (Sun)
  63108464400, #      utc_end 2000-10-29 01:00:00 (Sun)
  63089715600, #  local_start 2000-03-26 01:00:00 (Sun)
  63108464400, #    local_end 2000-10-29 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63108464400, #    utc_start 2000-10-29 01:00:00 (Sun)
  63121165200, #      utc_end 2001-03-25 01:00:00 (Sun)
  63108460800, #  local_start 2000-10-29 00:00:00 (Sun)
  63121161600, #    local_end 2001-03-25 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  63121165200, #    utc_start 2001-03-25 01:00:00 (Sun)
  63139914000, #      utc_end 2001-10-28 01:00:00 (Sun)
  63121165200, #  local_start 2001-03-25 01:00:00 (Sun)
  63139914000, #    local_end 2001-10-28 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63139914000, #    utc_start 2001-10-28 01:00:00 (Sun)
  63153219600, #      utc_end 2002-03-31 01:00:00 (Sun)
  63139910400, #  local_start 2001-10-28 00:00:00 (Sun)
  63153216000, #    local_end 2002-03-31 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  63153219600, #    utc_start 2002-03-31 01:00:00 (Sun)
  63171363600, #      utc_end 2002-10-27 01:00:00 (Sun)
  63153219600, #  local_start 2002-03-31 01:00:00 (Sun)
  63171363600, #    local_end 2002-10-27 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63171363600, #    utc_start 2002-10-27 01:00:00 (Sun)
  63184669200, #      utc_end 2003-03-30 01:00:00 (Sun)
  63171360000, #  local_start 2002-10-27 00:00:00 (Sun)
  63184665600, #    local_end 2003-03-30 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  63184669200, #    utc_start 2003-03-30 01:00:00 (Sun)
  63202813200, #      utc_end 2003-10-26 01:00:00 (Sun)
  63184669200, #  local_start 2003-03-30 01:00:00 (Sun)
  63202813200, #    local_end 2003-10-26 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63202813200, #    utc_start 2003-10-26 01:00:00 (Sun)
  63216118800, #      utc_end 2004-03-28 01:00:00 (Sun)
  63202809600, #  local_start 2003-10-26 00:00:00 (Sun)
  63216115200, #    local_end 2004-03-28 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  63216118800, #    utc_start 2004-03-28 01:00:00 (Sun)
  63234867600, #      utc_end 2004-10-31 01:00:00 (Sun)
  63216118800, #  local_start 2004-03-28 01:00:00 (Sun)
  63234867600, #    local_end 2004-10-31 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63234867600, #    utc_start 2004-10-31 01:00:00 (Sun)
  63247568400, #      utc_end 2005-03-27 01:00:00 (Sun)
  63234864000, #  local_start 2004-10-31 00:00:00 (Sun)
  63247564800, #    local_end 2005-03-27 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  63247568400, #    utc_start 2005-03-27 01:00:00 (Sun)
  63266317200, #      utc_end 2005-10-30 01:00:00 (Sun)
  63247568400, #  local_start 2005-03-27 01:00:00 (Sun)
  63266317200, #    local_end 2005-10-30 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63266317200, #    utc_start 2005-10-30 01:00:00 (Sun)
  63279018000, #      utc_end 2006-03-26 01:00:00 (Sun)
  63266313600, #  local_start 2005-10-30 00:00:00 (Sun)
  63279014400, #    local_end 2006-03-26 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  63279018000, #    utc_start 2006-03-26 01:00:00 (Sun)
  63297766800, #      utc_end 2006-10-29 01:00:00 (Sun)
  63279018000, #  local_start 2006-03-26 01:00:00 (Sun)
  63297766800, #    local_end 2006-10-29 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63297766800, #    utc_start 2006-10-29 01:00:00 (Sun)
  63310467600, #      utc_end 2007-03-25 01:00:00 (Sun)
  63297763200, #  local_start 2006-10-29 00:00:00 (Sun)
  63310464000, #    local_end 2007-03-25 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  63310467600, #    utc_start 2007-03-25 01:00:00 (Sun)
  63329216400, #      utc_end 2007-10-28 01:00:00 (Sun)
  63310467600, #  local_start 2007-03-25 01:00:00 (Sun)
  63329216400, #    local_end 2007-10-28 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63329216400, #    utc_start 2007-10-28 01:00:00 (Sun)
  63342522000, #      utc_end 2008-03-30 01:00:00 (Sun)
  63329212800, #  local_start 2007-10-28 00:00:00 (Sun)
  63342518400, #    local_end 2008-03-30 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  63342522000, #    utc_start 2008-03-30 01:00:00 (Sun)
  63360666000, #      utc_end 2008-10-26 01:00:00 (Sun)
  63342522000, #  local_start 2008-03-30 01:00:00 (Sun)
  63360666000, #    local_end 2008-10-26 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63360666000, #    utc_start 2008-10-26 01:00:00 (Sun)
  63373971600, #      utc_end 2009-03-29 01:00:00 (Sun)
  63360662400, #  local_start 2008-10-26 00:00:00 (Sun)
  63373968000, #    local_end 2009-03-29 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  63373971600, #    utc_start 2009-03-29 01:00:00 (Sun)
  63392115600, #      utc_end 2009-10-25 01:00:00 (Sun)
  63373971600, #  local_start 2009-03-29 01:00:00 (Sun)
  63392115600, #    local_end 2009-10-25 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63392115600, #    utc_start 2009-10-25 01:00:00 (Sun)
  63405421200, #      utc_end 2010-03-28 01:00:00 (Sun)
  63392112000, #  local_start 2009-10-25 00:00:00 (Sun)
  63405417600, #    local_end 2010-03-28 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  63405421200, #    utc_start 2010-03-28 01:00:00 (Sun)
  63424170000, #      utc_end 2010-10-31 01:00:00 (Sun)
  63405421200, #  local_start 2010-03-28 01:00:00 (Sun)
  63424170000, #    local_end 2010-10-31 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63424170000, #    utc_start 2010-10-31 01:00:00 (Sun)
  63436870800, #      utc_end 2011-03-27 01:00:00 (Sun)
  63424166400, #  local_start 2010-10-31 00:00:00 (Sun)
  63436867200, #    local_end 2011-03-27 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  63436870800, #    utc_start 2011-03-27 01:00:00 (Sun)
  63455619600, #      utc_end 2011-10-30 01:00:00 (Sun)
  63436870800, #  local_start 2011-03-27 01:00:00 (Sun)
  63455619600, #    local_end 2011-10-30 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63455619600, #    utc_start 2011-10-30 01:00:00 (Sun)
  63468320400, #      utc_end 2012-03-25 01:00:00 (Sun)
  63455616000, #  local_start 2011-10-30 00:00:00 (Sun)
  63468316800, #    local_end 2012-03-25 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  63468320400, #    utc_start 2012-03-25 01:00:00 (Sun)
  63487069200, #      utc_end 2012-10-28 01:00:00 (Sun)
  63468320400, #  local_start 2012-03-25 01:00:00 (Sun)
  63487069200, #    local_end 2012-10-28 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63487069200, #    utc_start 2012-10-28 01:00:00 (Sun)
  63500374800, #      utc_end 2013-03-31 01:00:00 (Sun)
  63487065600, #  local_start 2012-10-28 00:00:00 (Sun)
  63500371200, #    local_end 2013-03-31 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  63500374800, #    utc_start 2013-03-31 01:00:00 (Sun)
  63518518800, #      utc_end 2013-10-27 01:00:00 (Sun)
  63500374800, #  local_start 2013-03-31 01:00:00 (Sun)
  63518518800, #    local_end 2013-10-27 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63518518800, #    utc_start 2013-10-27 01:00:00 (Sun)
  63531824400, #      utc_end 2014-03-30 01:00:00 (Sun)
  63518515200, #  local_start 2013-10-27 00:00:00 (Sun)
  63531820800, #    local_end 2014-03-30 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  63531824400, #    utc_start 2014-03-30 01:00:00 (Sun)
  63549968400, #      utc_end 2014-10-26 01:00:00 (Sun)
  63531824400, #  local_start 2014-03-30 01:00:00 (Sun)
  63549968400, #    local_end 2014-10-26 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63549968400, #    utc_start 2014-10-26 01:00:00 (Sun)
  63563274000, #      utc_end 2015-03-29 01:00:00 (Sun)
  63549964800, #  local_start 2014-10-26 00:00:00 (Sun)
  63563270400, #    local_end 2015-03-29 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  63563274000, #    utc_start 2015-03-29 01:00:00 (Sun)
  63581418000, #      utc_end 2015-10-25 01:00:00 (Sun)
  63563274000, #  local_start 2015-03-29 01:00:00 (Sun)
  63581418000, #    local_end 2015-10-25 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63581418000, #    utc_start 2015-10-25 01:00:00 (Sun)
  63594723600, #      utc_end 2016-03-27 01:00:00 (Sun)
  63581414400, #  local_start 2015-10-25 00:00:00 (Sun)
  63594720000, #    local_end 2016-03-27 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  63594723600, #    utc_start 2016-03-27 01:00:00 (Sun)
  63613472400, #      utc_end 2016-10-30 01:00:00 (Sun)
  63594723600, #  local_start 2016-03-27 01:00:00 (Sun)
  63613472400, #    local_end 2016-10-30 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63613472400, #    utc_start 2016-10-30 01:00:00 (Sun)
  63626173200, #      utc_end 2017-03-26 01:00:00 (Sun)
  63613468800, #  local_start 2016-10-30 00:00:00 (Sun)
  63626169600, #    local_end 2017-03-26 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  63626173200, #    utc_start 2017-03-26 01:00:00 (Sun)
  63644922000, #      utc_end 2017-10-29 01:00:00 (Sun)
  63626173200, #  local_start 2017-03-26 01:00:00 (Sun)
  63644922000, #    local_end 2017-10-29 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63644922000, #    utc_start 2017-10-29 01:00:00 (Sun)
  63657622800, #      utc_end 2018-03-25 01:00:00 (Sun)
  63644918400, #  local_start 2017-10-29 00:00:00 (Sun)
  63657619200, #    local_end 2018-03-25 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  63657622800, #    utc_start 2018-03-25 01:00:00 (Sun)
  63676371600, #      utc_end 2018-10-28 01:00:00 (Sun)
  63657622800, #  local_start 2018-03-25 01:00:00 (Sun)
  63676371600, #    local_end 2018-10-28 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63676371600, #    utc_start 2018-10-28 01:00:00 (Sun)
  63689677200, #      utc_end 2019-03-31 01:00:00 (Sun)
  63676368000, #  local_start 2018-10-28 00:00:00 (Sun)
  63689673600, #    local_end 2019-03-31 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  63689677200, #    utc_start 2019-03-31 01:00:00 (Sun)
  63707821200, #      utc_end 2019-10-27 01:00:00 (Sun)
  63689677200, #  local_start 2019-03-31 01:00:00 (Sun)
  63707821200, #    local_end 2019-10-27 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63707821200, #    utc_start 2019-10-27 01:00:00 (Sun)
  63721126800, #      utc_end 2020-03-29 01:00:00 (Sun)
  63707817600, #  local_start 2019-10-27 00:00:00 (Sun)
  63721123200, #    local_end 2020-03-29 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  63721126800, #    utc_start 2020-03-29 01:00:00 (Sun)
  63739270800, #      utc_end 2020-10-25 01:00:00 (Sun)
  63721126800, #  local_start 2020-03-29 01:00:00 (Sun)
  63739270800, #    local_end 2020-10-25 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63739270800, #    utc_start 2020-10-25 01:00:00 (Sun)
  63752576400, #      utc_end 2021-03-28 01:00:00 (Sun)
  63739267200, #  local_start 2020-10-25 00:00:00 (Sun)
  63752572800, #    local_end 2021-03-28 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  63752576400, #    utc_start 2021-03-28 01:00:00 (Sun)
  63771325200, #      utc_end 2021-10-31 01:00:00 (Sun)
  63752576400, #  local_start 2021-03-28 01:00:00 (Sun)
  63771325200, #    local_end 2021-10-31 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63771325200, #    utc_start 2021-10-31 01:00:00 (Sun)
  63784026000, #      utc_end 2022-03-27 01:00:00 (Sun)
  63771321600, #  local_start 2021-10-31 00:00:00 (Sun)
  63784022400, #    local_end 2022-03-27 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  63784026000, #    utc_start 2022-03-27 01:00:00 (Sun)
  63802774800, #      utc_end 2022-10-30 01:00:00 (Sun)
  63784026000, #  local_start 2022-03-27 01:00:00 (Sun)
  63802774800, #    local_end 2022-10-30 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63802774800, #    utc_start 2022-10-30 01:00:00 (Sun)
  63815475600, #      utc_end 2023-03-26 01:00:00 (Sun)
  63802771200, #  local_start 2022-10-30 00:00:00 (Sun)
  63815472000, #    local_end 2023-03-26 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  63815475600, #    utc_start 2023-03-26 01:00:00 (Sun)
  63834224400, #      utc_end 2023-10-29 01:00:00 (Sun)
  63815475600, #  local_start 2023-03-26 01:00:00 (Sun)
  63834224400, #    local_end 2023-10-29 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63834224400, #    utc_start 2023-10-29 01:00:00 (Sun)
  63847530000, #      utc_end 2024-03-31 01:00:00 (Sun)
  63834220800, #  local_start 2023-10-29 00:00:00 (Sun)
  63847526400, #    local_end 2024-03-31 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  63847530000, #    utc_start 2024-03-31 01:00:00 (Sun)
  63865674000, #      utc_end 2024-10-27 01:00:00 (Sun)
  63847530000, #  local_start 2024-03-31 01:00:00 (Sun)
  63865674000, #    local_end 2024-10-27 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63865674000, #    utc_start 2024-10-27 01:00:00 (Sun)
  63878979600, #      utc_end 2025-03-30 01:00:00 (Sun)
  63865670400, #  local_start 2024-10-27 00:00:00 (Sun)
  63878976000, #    local_end 2025-03-30 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  63878979600, #    utc_start 2025-03-30 01:00:00 (Sun)
  63897123600, #      utc_end 2025-10-26 01:00:00 (Sun)
  63878979600, #  local_start 2025-03-30 01:00:00 (Sun)
  63897123600, #    local_end 2025-10-26 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63897123600, #    utc_start 2025-10-26 01:00:00 (Sun)
  63910429200, #      utc_end 2026-03-29 01:00:00 (Sun)
  63897120000, #  local_start 2025-10-26 00:00:00 (Sun)
  63910425600, #    local_end 2026-03-29 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  63910429200, #    utc_start 2026-03-29 01:00:00 (Sun)
  63928573200, #      utc_end 2026-10-25 01:00:00 (Sun)
  63910429200, #  local_start 2026-03-29 01:00:00 (Sun)
  63928573200, #    local_end 2026-10-25 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63928573200, #    utc_start 2026-10-25 01:00:00 (Sun)
  63941878800, #      utc_end 2027-03-28 01:00:00 (Sun)
  63928569600, #  local_start 2026-10-25 00:00:00 (Sun)
  63941875200, #    local_end 2027-03-28 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  63941878800, #    utc_start 2027-03-28 01:00:00 (Sun)
  63960627600, #      utc_end 2027-10-31 01:00:00 (Sun)
  63941878800, #  local_start 2027-03-28 01:00:00 (Sun)
  63960627600, #    local_end 2027-10-31 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63960627600, #    utc_start 2027-10-31 01:00:00 (Sun)
  63973328400, #      utc_end 2028-03-26 01:00:00 (Sun)
  63960624000, #  local_start 2027-10-31 00:00:00 (Sun)
  63973324800, #    local_end 2028-03-26 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  63973328400, #    utc_start 2028-03-26 01:00:00 (Sun)
  63992077200, #      utc_end 2028-10-29 01:00:00 (Sun)
  63973328400, #  local_start 2028-03-26 01:00:00 (Sun)
  63992077200, #    local_end 2028-10-29 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  63992077200, #    utc_start 2028-10-29 01:00:00 (Sun)
  64004778000, #      utc_end 2029-03-25 01:00:00 (Sun)
  63992073600, #  local_start 2028-10-29 00:00:00 (Sun)
  64004774400, #    local_end 2029-03-25 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  64004778000, #    utc_start 2029-03-25 01:00:00 (Sun)
  64023526800, #      utc_end 2029-10-28 01:00:00 (Sun)
  64004778000, #  local_start 2029-03-25 01:00:00 (Sun)
  64023526800, #    local_end 2029-10-28 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  64023526800, #    utc_start 2029-10-28 01:00:00 (Sun)
  64036832400, #      utc_end 2030-03-31 01:00:00 (Sun)
  64023523200, #  local_start 2029-10-28 00:00:00 (Sun)
  64036828800, #    local_end 2030-03-31 00:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  64036832400, #    utc_start 2030-03-31 01:00:00 (Sun)
  64054976400, #      utc_end 2030-10-27 01:00:00 (Sun)
  64036832400, #  local_start 2030-03-31 01:00:00 (Sun)
  64054976400, #    local_end 2030-10-27 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {106}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -3600 }
  
  my $last_observance = bless( {
    'format' => '-01/+00',
    'gmtoff' => '-1:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 727650,
      'local_rd_secs' => 3600,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 727650,
      'utc_rd_secs' => 3600,
      'utc_year' => 1994
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -3600,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 727650,
      'local_rd_secs' => 3600,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 727650,
      'utc_rd_secs' => 3600,
      'utc_year' => 1994
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '1:00u',
      'from' => '1996',
      'in' => 'Oct',
      'letter' => '',
      'name' => 'EU',
      'offset_from_std' => 0,
      'on' => 'lastSun',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '1:00u',
      'from' => '1981',
      'in' => 'Mar',
      'letter' => 'S',
      'name' => 'EU',
      'offset_from_std' => 3600,
      'on' => 'lastSun',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_ATLANTIC_AZORES

    $main::fatpacked{"DateTime/TimeZone/Atlantic/Bermuda.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ATLANTIC_BERMUDA';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Atlantic::Bermuda;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Atlantic::Bermuda::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60873401958, #      utc_end 1930-01-01 06:19:18 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60873386400, #    local_end 1930-01-01 02:00:00 (Wed)
  -15558,
  0,
  'LMT',
      ],
      [
  60873401958, #    utc_start 1930-01-01 06:19:18 (Wed)
  62272044000, #      utc_end 1974-04-28 06:00:00 (Sun)
  60873387558, #  local_start 1930-01-01 02:19:18 (Wed)
  62272029600, #    local_end 1974-04-28 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62272044000, #    utc_start 1974-04-28 06:00:00 (Sun)
  62287765200, #      utc_end 1974-10-27 05:00:00 (Sun)
  62272033200, #  local_start 1974-04-28 03:00:00 (Sun)
  62287754400, #    local_end 1974-10-27 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62287765200, #    utc_start 1974-10-27 05:00:00 (Sun)
  62303493600, #      utc_end 1975-04-27 06:00:00 (Sun)
  62287750800, #  local_start 1974-10-27 01:00:00 (Sun)
  62303479200, #    local_end 1975-04-27 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62303493600, #    utc_start 1975-04-27 06:00:00 (Sun)
  62319214800, #      utc_end 1975-10-26 05:00:00 (Sun)
  62303482800, #  local_start 1975-04-27 03:00:00 (Sun)
  62319204000, #    local_end 1975-10-26 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62319214800, #    utc_start 1975-10-26 05:00:00 (Sun)
  62325000000, #      utc_end 1976-01-01 04:00:00 (Thu)
  62319200400, #  local_start 1975-10-26 01:00:00 (Sun)
  62324985600, #    local_end 1976-01-01 00:00:00 (Thu)
  -14400,
  0,
  'AST',
      ],
      [
  62325000000, #    utc_start 1976-01-01 04:00:00 (Thu)
  62334943200, #      utc_end 1976-04-25 06:00:00 (Sun)
  62324985600, #  local_start 1976-01-01 00:00:00 (Thu)
  62334928800, #    local_end 1976-04-25 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62334943200, #    utc_start 1976-04-25 06:00:00 (Sun)
  62351269200, #      utc_end 1976-10-31 05:00:00 (Sun)
  62334932400, #  local_start 1976-04-25 03:00:00 (Sun)
  62351258400, #    local_end 1976-10-31 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62351269200, #    utc_start 1976-10-31 05:00:00 (Sun)
  62366392800, #      utc_end 1977-04-24 06:00:00 (Sun)
  62351254800, #  local_start 1976-10-31 01:00:00 (Sun)
  62366378400, #    local_end 1977-04-24 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62366392800, #    utc_start 1977-04-24 06:00:00 (Sun)
  62382718800, #      utc_end 1977-10-30 05:00:00 (Sun)
  62366382000, #  local_start 1977-04-24 03:00:00 (Sun)
  62382708000, #    local_end 1977-10-30 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62382718800, #    utc_start 1977-10-30 05:00:00 (Sun)
  62398447200, #      utc_end 1978-04-30 06:00:00 (Sun)
  62382704400, #  local_start 1977-10-30 01:00:00 (Sun)
  62398432800, #    local_end 1978-04-30 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62398447200, #    utc_start 1978-04-30 06:00:00 (Sun)
  62414168400, #      utc_end 1978-10-29 05:00:00 (Sun)
  62398436400, #  local_start 1978-04-30 03:00:00 (Sun)
  62414157600, #    local_end 1978-10-29 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62414168400, #    utc_start 1978-10-29 05:00:00 (Sun)
  62429896800, #      utc_end 1979-04-29 06:00:00 (Sun)
  62414154000, #  local_start 1978-10-29 01:00:00 (Sun)
  62429882400, #    local_end 1979-04-29 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62429896800, #    utc_start 1979-04-29 06:00:00 (Sun)
  62445618000, #      utc_end 1979-10-28 05:00:00 (Sun)
  62429886000, #  local_start 1979-04-29 03:00:00 (Sun)
  62445607200, #    local_end 1979-10-28 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62445618000, #    utc_start 1979-10-28 05:00:00 (Sun)
  62461346400, #      utc_end 1980-04-27 06:00:00 (Sun)
  62445603600, #  local_start 1979-10-28 01:00:00 (Sun)
  62461332000, #    local_end 1980-04-27 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62461346400, #    utc_start 1980-04-27 06:00:00 (Sun)
  62477067600, #      utc_end 1980-10-26 05:00:00 (Sun)
  62461335600, #  local_start 1980-04-27 03:00:00 (Sun)
  62477056800, #    local_end 1980-10-26 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62477067600, #    utc_start 1980-10-26 05:00:00 (Sun)
  62492796000, #      utc_end 1981-04-26 06:00:00 (Sun)
  62477053200, #  local_start 1980-10-26 01:00:00 (Sun)
  62492781600, #    local_end 1981-04-26 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62492796000, #    utc_start 1981-04-26 06:00:00 (Sun)
  62508517200, #      utc_end 1981-10-25 05:00:00 (Sun)
  62492785200, #  local_start 1981-04-26 03:00:00 (Sun)
  62508506400, #    local_end 1981-10-25 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62508517200, #    utc_start 1981-10-25 05:00:00 (Sun)
  62524245600, #      utc_end 1982-04-25 06:00:00 (Sun)
  62508502800, #  local_start 1981-10-25 01:00:00 (Sun)
  62524231200, #    local_end 1982-04-25 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62524245600, #    utc_start 1982-04-25 06:00:00 (Sun)
  62540571600, #      utc_end 1982-10-31 05:00:00 (Sun)
  62524234800, #  local_start 1982-04-25 03:00:00 (Sun)
  62540560800, #    local_end 1982-10-31 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62540571600, #    utc_start 1982-10-31 05:00:00 (Sun)
  62555695200, #      utc_end 1983-04-24 06:00:00 (Sun)
  62540557200, #  local_start 1982-10-31 01:00:00 (Sun)
  62555680800, #    local_end 1983-04-24 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62555695200, #    utc_start 1983-04-24 06:00:00 (Sun)
  62572021200, #      utc_end 1983-10-30 05:00:00 (Sun)
  62555684400, #  local_start 1983-04-24 03:00:00 (Sun)
  62572010400, #    local_end 1983-10-30 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62572021200, #    utc_start 1983-10-30 05:00:00 (Sun)
  62587749600, #      utc_end 1984-04-29 06:00:00 (Sun)
  62572006800, #  local_start 1983-10-30 01:00:00 (Sun)
  62587735200, #    local_end 1984-04-29 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62587749600, #    utc_start 1984-04-29 06:00:00 (Sun)
  62603470800, #      utc_end 1984-10-28 05:00:00 (Sun)
  62587738800, #  local_start 1984-04-29 03:00:00 (Sun)
  62603460000, #    local_end 1984-10-28 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62603470800, #    utc_start 1984-10-28 05:00:00 (Sun)
  62619199200, #      utc_end 1985-04-28 06:00:00 (Sun)
  62603456400, #  local_start 1984-10-28 01:00:00 (Sun)
  62619184800, #    local_end 1985-04-28 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62619199200, #    utc_start 1985-04-28 06:00:00 (Sun)
  62634920400, #      utc_end 1985-10-27 05:00:00 (Sun)
  62619188400, #  local_start 1985-04-28 03:00:00 (Sun)
  62634909600, #    local_end 1985-10-27 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62634920400, #    utc_start 1985-10-27 05:00:00 (Sun)
  62650648800, #      utc_end 1986-04-27 06:00:00 (Sun)
  62634906000, #  local_start 1985-10-27 01:00:00 (Sun)
  62650634400, #    local_end 1986-04-27 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62650648800, #    utc_start 1986-04-27 06:00:00 (Sun)
  62666370000, #      utc_end 1986-10-26 05:00:00 (Sun)
  62650638000, #  local_start 1986-04-27 03:00:00 (Sun)
  62666359200, #    local_end 1986-10-26 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62666370000, #    utc_start 1986-10-26 05:00:00 (Sun)
  62680284000, #      utc_end 1987-04-05 06:00:00 (Sun)
  62666355600, #  local_start 1986-10-26 01:00:00 (Sun)
  62680269600, #    local_end 1987-04-05 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62680284000, #    utc_start 1987-04-05 06:00:00 (Sun)
  62697819600, #      utc_end 1987-10-25 05:00:00 (Sun)
  62680273200, #  local_start 1987-04-05 03:00:00 (Sun)
  62697808800, #    local_end 1987-10-25 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62697819600, #    utc_start 1987-10-25 05:00:00 (Sun)
  62711733600, #      utc_end 1988-04-03 06:00:00 (Sun)
  62697805200, #  local_start 1987-10-25 01:00:00 (Sun)
  62711719200, #    local_end 1988-04-03 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62711733600, #    utc_start 1988-04-03 06:00:00 (Sun)
  62729874000, #      utc_end 1988-10-30 05:00:00 (Sun)
  62711722800, #  local_start 1988-04-03 03:00:00 (Sun)
  62729863200, #    local_end 1988-10-30 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62729874000, #    utc_start 1988-10-30 05:00:00 (Sun)
  62743183200, #      utc_end 1989-04-02 06:00:00 (Sun)
  62729859600, #  local_start 1988-10-30 01:00:00 (Sun)
  62743168800, #    local_end 1989-04-02 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62743183200, #    utc_start 1989-04-02 06:00:00 (Sun)
  62761323600, #      utc_end 1989-10-29 05:00:00 (Sun)
  62743172400, #  local_start 1989-04-02 03:00:00 (Sun)
  62761312800, #    local_end 1989-10-29 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62761323600, #    utc_start 1989-10-29 05:00:00 (Sun)
  62774632800, #      utc_end 1990-04-01 06:00:00 (Sun)
  62761309200, #  local_start 1989-10-29 01:00:00 (Sun)
  62774618400, #    local_end 1990-04-01 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62774632800, #    utc_start 1990-04-01 06:00:00 (Sun)
  62792773200, #      utc_end 1990-10-28 05:00:00 (Sun)
  62774622000, #  local_start 1990-04-01 03:00:00 (Sun)
  62792762400, #    local_end 1990-10-28 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62792773200, #    utc_start 1990-10-28 05:00:00 (Sun)
  62806687200, #      utc_end 1991-04-07 06:00:00 (Sun)
  62792758800, #  local_start 1990-10-28 01:00:00 (Sun)
  62806672800, #    local_end 1991-04-07 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62806687200, #    utc_start 1991-04-07 06:00:00 (Sun)
  62824222800, #      utc_end 1991-10-27 05:00:00 (Sun)
  62806676400, #  local_start 1991-04-07 03:00:00 (Sun)
  62824212000, #    local_end 1991-10-27 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62824222800, #    utc_start 1991-10-27 05:00:00 (Sun)
  62838136800, #      utc_end 1992-04-05 06:00:00 (Sun)
  62824208400, #  local_start 1991-10-27 01:00:00 (Sun)
  62838122400, #    local_end 1992-04-05 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62838136800, #    utc_start 1992-04-05 06:00:00 (Sun)
  62855672400, #      utc_end 1992-10-25 05:00:00 (Sun)
  62838126000, #  local_start 1992-04-05 03:00:00 (Sun)
  62855661600, #    local_end 1992-10-25 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62855672400, #    utc_start 1992-10-25 05:00:00 (Sun)
  62869586400, #      utc_end 1993-04-04 06:00:00 (Sun)
  62855658000, #  local_start 1992-10-25 01:00:00 (Sun)
  62869572000, #    local_end 1993-04-04 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62869586400, #    utc_start 1993-04-04 06:00:00 (Sun)
  62887726800, #      utc_end 1993-10-31 05:00:00 (Sun)
  62869575600, #  local_start 1993-04-04 03:00:00 (Sun)
  62887716000, #    local_end 1993-10-31 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62887726800, #    utc_start 1993-10-31 05:00:00 (Sun)
  62901036000, #      utc_end 1994-04-03 06:00:00 (Sun)
  62887712400, #  local_start 1993-10-31 01:00:00 (Sun)
  62901021600, #    local_end 1994-04-03 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62901036000, #    utc_start 1994-04-03 06:00:00 (Sun)
  62919176400, #      utc_end 1994-10-30 05:00:00 (Sun)
  62901025200, #  local_start 1994-04-03 03:00:00 (Sun)
  62919165600, #    local_end 1994-10-30 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62919176400, #    utc_start 1994-10-30 05:00:00 (Sun)
  62932485600, #      utc_end 1995-04-02 06:00:00 (Sun)
  62919162000, #  local_start 1994-10-30 01:00:00 (Sun)
  62932471200, #    local_end 1995-04-02 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62932485600, #    utc_start 1995-04-02 06:00:00 (Sun)
  62950626000, #      utc_end 1995-10-29 05:00:00 (Sun)
  62932474800, #  local_start 1995-04-02 03:00:00 (Sun)
  62950615200, #    local_end 1995-10-29 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62950626000, #    utc_start 1995-10-29 05:00:00 (Sun)
  62964540000, #      utc_end 1996-04-07 06:00:00 (Sun)
  62950611600, #  local_start 1995-10-29 01:00:00 (Sun)
  62964525600, #    local_end 1996-04-07 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62964540000, #    utc_start 1996-04-07 06:00:00 (Sun)
  62982075600, #      utc_end 1996-10-27 05:00:00 (Sun)
  62964529200, #  local_start 1996-04-07 03:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  62982075600, #    utc_start 1996-10-27 05:00:00 (Sun)
  62995989600, #      utc_end 1997-04-06 06:00:00 (Sun)
  62982061200, #  local_start 1996-10-27 01:00:00 (Sun)
  62995975200, #    local_end 1997-04-06 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  62995989600, #    utc_start 1997-04-06 06:00:00 (Sun)
  63013525200, #      utc_end 1997-10-26 05:00:00 (Sun)
  62995978800, #  local_start 1997-04-06 03:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63013525200, #    utc_start 1997-10-26 05:00:00 (Sun)
  63027439200, #      utc_end 1998-04-05 06:00:00 (Sun)
  63013510800, #  local_start 1997-10-26 01:00:00 (Sun)
  63027424800, #    local_end 1998-04-05 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63027439200, #    utc_start 1998-04-05 06:00:00 (Sun)
  63044974800, #      utc_end 1998-10-25 05:00:00 (Sun)
  63027428400, #  local_start 1998-04-05 03:00:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63044974800, #    utc_start 1998-10-25 05:00:00 (Sun)
  63058888800, #      utc_end 1999-04-04 06:00:00 (Sun)
  63044960400, #  local_start 1998-10-25 01:00:00 (Sun)
  63058874400, #    local_end 1999-04-04 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63058888800, #    utc_start 1999-04-04 06:00:00 (Sun)
  63077029200, #      utc_end 1999-10-31 05:00:00 (Sun)
  63058878000, #  local_start 1999-04-04 03:00:00 (Sun)
  63077018400, #    local_end 1999-10-31 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63077029200, #    utc_start 1999-10-31 05:00:00 (Sun)
  63090338400, #      utc_end 2000-04-02 06:00:00 (Sun)
  63077014800, #  local_start 1999-10-31 01:00:00 (Sun)
  63090324000, #    local_end 2000-04-02 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63090338400, #    utc_start 2000-04-02 06:00:00 (Sun)
  63108478800, #      utc_end 2000-10-29 05:00:00 (Sun)
  63090327600, #  local_start 2000-04-02 03:00:00 (Sun)
  63108468000, #    local_end 2000-10-29 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63108478800, #    utc_start 2000-10-29 05:00:00 (Sun)
  63121788000, #      utc_end 2001-04-01 06:00:00 (Sun)
  63108464400, #  local_start 2000-10-29 01:00:00 (Sun)
  63121773600, #    local_end 2001-04-01 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63121788000, #    utc_start 2001-04-01 06:00:00 (Sun)
  63139928400, #      utc_end 2001-10-28 05:00:00 (Sun)
  63121777200, #  local_start 2001-04-01 03:00:00 (Sun)
  63139917600, #    local_end 2001-10-28 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63139928400, #    utc_start 2001-10-28 05:00:00 (Sun)
  63153842400, #      utc_end 2002-04-07 06:00:00 (Sun)
  63139914000, #  local_start 2001-10-28 01:00:00 (Sun)
  63153828000, #    local_end 2002-04-07 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63153842400, #    utc_start 2002-04-07 06:00:00 (Sun)
  63171378000, #      utc_end 2002-10-27 05:00:00 (Sun)
  63153831600, #  local_start 2002-04-07 03:00:00 (Sun)
  63171367200, #    local_end 2002-10-27 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63171378000, #    utc_start 2002-10-27 05:00:00 (Sun)
  63185292000, #      utc_end 2003-04-06 06:00:00 (Sun)
  63171363600, #  local_start 2002-10-27 01:00:00 (Sun)
  63185277600, #    local_end 2003-04-06 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63185292000, #    utc_start 2003-04-06 06:00:00 (Sun)
  63202827600, #      utc_end 2003-10-26 05:00:00 (Sun)
  63185281200, #  local_start 2003-04-06 03:00:00 (Sun)
  63202816800, #    local_end 2003-10-26 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63202827600, #    utc_start 2003-10-26 05:00:00 (Sun)
  63216741600, #      utc_end 2004-04-04 06:00:00 (Sun)
  63202813200, #  local_start 2003-10-26 01:00:00 (Sun)
  63216727200, #    local_end 2004-04-04 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63216741600, #    utc_start 2004-04-04 06:00:00 (Sun)
  63234882000, #      utc_end 2004-10-31 05:00:00 (Sun)
  63216730800, #  local_start 2004-04-04 03:00:00 (Sun)
  63234871200, #    local_end 2004-10-31 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63234882000, #    utc_start 2004-10-31 05:00:00 (Sun)
  63248191200, #      utc_end 2005-04-03 06:00:00 (Sun)
  63234867600, #  local_start 2004-10-31 01:00:00 (Sun)
  63248176800, #    local_end 2005-04-03 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63248191200, #    utc_start 2005-04-03 06:00:00 (Sun)
  63266331600, #      utc_end 2005-10-30 05:00:00 (Sun)
  63248180400, #  local_start 2005-04-03 03:00:00 (Sun)
  63266320800, #    local_end 2005-10-30 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63266331600, #    utc_start 2005-10-30 05:00:00 (Sun)
  63279640800, #      utc_end 2006-04-02 06:00:00 (Sun)
  63266317200, #  local_start 2005-10-30 01:00:00 (Sun)
  63279626400, #    local_end 2006-04-02 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63279640800, #    utc_start 2006-04-02 06:00:00 (Sun)
  63297781200, #      utc_end 2006-10-29 05:00:00 (Sun)
  63279630000, #  local_start 2006-04-02 03:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63297781200, #    utc_start 2006-10-29 05:00:00 (Sun)
  63309276000, #      utc_end 2007-03-11 06:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63309261600, #    local_end 2007-03-11 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63309276000, #    utc_start 2007-03-11 06:00:00 (Sun)
  63329835600, #      utc_end 2007-11-04 05:00:00 (Sun)
  63309265200, #  local_start 2007-03-11 03:00:00 (Sun)
  63329824800, #    local_end 2007-11-04 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63329835600, #    utc_start 2007-11-04 05:00:00 (Sun)
  63340725600, #      utc_end 2008-03-09 06:00:00 (Sun)
  63329821200, #  local_start 2007-11-04 01:00:00 (Sun)
  63340711200, #    local_end 2008-03-09 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63340725600, #    utc_start 2008-03-09 06:00:00 (Sun)
  63361285200, #      utc_end 2008-11-02 05:00:00 (Sun)
  63340714800, #  local_start 2008-03-09 03:00:00 (Sun)
  63361274400, #    local_end 2008-11-02 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63361285200, #    utc_start 2008-11-02 05:00:00 (Sun)
  63372175200, #      utc_end 2009-03-08 06:00:00 (Sun)
  63361270800, #  local_start 2008-11-02 01:00:00 (Sun)
  63372160800, #    local_end 2009-03-08 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63372175200, #    utc_start 2009-03-08 06:00:00 (Sun)
  63392734800, #      utc_end 2009-11-01 05:00:00 (Sun)
  63372164400, #  local_start 2009-03-08 03:00:00 (Sun)
  63392724000, #    local_end 2009-11-01 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63392734800, #    utc_start 2009-11-01 05:00:00 (Sun)
  63404229600, #      utc_end 2010-03-14 06:00:00 (Sun)
  63392720400, #  local_start 2009-11-01 01:00:00 (Sun)
  63404215200, #    local_end 2010-03-14 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63404229600, #    utc_start 2010-03-14 06:00:00 (Sun)
  63424789200, #      utc_end 2010-11-07 05:00:00 (Sun)
  63404218800, #  local_start 2010-03-14 03:00:00 (Sun)
  63424778400, #    local_end 2010-11-07 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63424789200, #    utc_start 2010-11-07 05:00:00 (Sun)
  63435679200, #      utc_end 2011-03-13 06:00:00 (Sun)
  63424774800, #  local_start 2010-11-07 01:00:00 (Sun)
  63435664800, #    local_end 2011-03-13 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63435679200, #    utc_start 2011-03-13 06:00:00 (Sun)
  63456238800, #      utc_end 2011-11-06 05:00:00 (Sun)
  63435668400, #  local_start 2011-03-13 03:00:00 (Sun)
  63456228000, #    local_end 2011-11-06 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63456238800, #    utc_start 2011-11-06 05:00:00 (Sun)
  63467128800, #      utc_end 2012-03-11 06:00:00 (Sun)
  63456224400, #  local_start 2011-11-06 01:00:00 (Sun)
  63467114400, #    local_end 2012-03-11 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63467128800, #    utc_start 2012-03-11 06:00:00 (Sun)
  63487688400, #      utc_end 2012-11-04 05:00:00 (Sun)
  63467118000, #  local_start 2012-03-11 03:00:00 (Sun)
  63487677600, #    local_end 2012-11-04 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63487688400, #    utc_start 2012-11-04 05:00:00 (Sun)
  63498578400, #      utc_end 2013-03-10 06:00:00 (Sun)
  63487674000, #  local_start 2012-11-04 01:00:00 (Sun)
  63498564000, #    local_end 2013-03-10 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63498578400, #    utc_start 2013-03-10 06:00:00 (Sun)
  63519138000, #      utc_end 2013-11-03 05:00:00 (Sun)
  63498567600, #  local_start 2013-03-10 03:00:00 (Sun)
  63519127200, #    local_end 2013-11-03 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63519138000, #    utc_start 2013-11-03 05:00:00 (Sun)
  63530028000, #      utc_end 2014-03-09 06:00:00 (Sun)
  63519123600, #  local_start 2013-11-03 01:00:00 (Sun)
  63530013600, #    local_end 2014-03-09 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63530028000, #    utc_start 2014-03-09 06:00:00 (Sun)
  63550587600, #      utc_end 2014-11-02 05:00:00 (Sun)
  63530017200, #  local_start 2014-03-09 03:00:00 (Sun)
  63550576800, #    local_end 2014-11-02 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63550587600, #    utc_start 2014-11-02 05:00:00 (Sun)
  63561477600, #      utc_end 2015-03-08 06:00:00 (Sun)
  63550573200, #  local_start 2014-11-02 01:00:00 (Sun)
  63561463200, #    local_end 2015-03-08 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63561477600, #    utc_start 2015-03-08 06:00:00 (Sun)
  63582037200, #      utc_end 2015-11-01 05:00:00 (Sun)
  63561466800, #  local_start 2015-03-08 03:00:00 (Sun)
  63582026400, #    local_end 2015-11-01 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63582037200, #    utc_start 2015-11-01 05:00:00 (Sun)
  63593532000, #      utc_end 2016-03-13 06:00:00 (Sun)
  63582022800, #  local_start 2015-11-01 01:00:00 (Sun)
  63593517600, #    local_end 2016-03-13 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63593532000, #    utc_start 2016-03-13 06:00:00 (Sun)
  63614091600, #      utc_end 2016-11-06 05:00:00 (Sun)
  63593521200, #  local_start 2016-03-13 03:00:00 (Sun)
  63614080800, #    local_end 2016-11-06 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63614091600, #    utc_start 2016-11-06 05:00:00 (Sun)
  63624981600, #      utc_end 2017-03-12 06:00:00 (Sun)
  63614077200, #  local_start 2016-11-06 01:00:00 (Sun)
  63624967200, #    local_end 2017-03-12 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63624981600, #    utc_start 2017-03-12 06:00:00 (Sun)
  63645541200, #      utc_end 2017-11-05 05:00:00 (Sun)
  63624970800, #  local_start 2017-03-12 03:00:00 (Sun)
  63645530400, #    local_end 2017-11-05 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63645541200, #    utc_start 2017-11-05 05:00:00 (Sun)
  63656431200, #      utc_end 2018-03-11 06:00:00 (Sun)
  63645526800, #  local_start 2017-11-05 01:00:00 (Sun)
  63656416800, #    local_end 2018-03-11 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63656431200, #    utc_start 2018-03-11 06:00:00 (Sun)
  63676990800, #      utc_end 2018-11-04 05:00:00 (Sun)
  63656420400, #  local_start 2018-03-11 03:00:00 (Sun)
  63676980000, #    local_end 2018-11-04 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63676990800, #    utc_start 2018-11-04 05:00:00 (Sun)
  63687880800, #      utc_end 2019-03-10 06:00:00 (Sun)
  63676976400, #  local_start 2018-11-04 01:00:00 (Sun)
  63687866400, #    local_end 2019-03-10 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63687880800, #    utc_start 2019-03-10 06:00:00 (Sun)
  63708440400, #      utc_end 2019-11-03 05:00:00 (Sun)
  63687870000, #  local_start 2019-03-10 03:00:00 (Sun)
  63708429600, #    local_end 2019-11-03 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63708440400, #    utc_start 2019-11-03 05:00:00 (Sun)
  63719330400, #      utc_end 2020-03-08 06:00:00 (Sun)
  63708426000, #  local_start 2019-11-03 01:00:00 (Sun)
  63719316000, #    local_end 2020-03-08 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63719330400, #    utc_start 2020-03-08 06:00:00 (Sun)
  63739890000, #      utc_end 2020-11-01 05:00:00 (Sun)
  63719319600, #  local_start 2020-03-08 03:00:00 (Sun)
  63739879200, #    local_end 2020-11-01 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63739890000, #    utc_start 2020-11-01 05:00:00 (Sun)
  63751384800, #      utc_end 2021-03-14 06:00:00 (Sun)
  63739875600, #  local_start 2020-11-01 01:00:00 (Sun)
  63751370400, #    local_end 2021-03-14 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63751384800, #    utc_start 2021-03-14 06:00:00 (Sun)
  63771944400, #      utc_end 2021-11-07 05:00:00 (Sun)
  63751374000, #  local_start 2021-03-14 03:00:00 (Sun)
  63771933600, #    local_end 2021-11-07 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63771944400, #    utc_start 2021-11-07 05:00:00 (Sun)
  63782834400, #      utc_end 2022-03-13 06:00:00 (Sun)
  63771930000, #  local_start 2021-11-07 01:00:00 (Sun)
  63782820000, #    local_end 2022-03-13 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63782834400, #    utc_start 2022-03-13 06:00:00 (Sun)
  63803394000, #      utc_end 2022-11-06 05:00:00 (Sun)
  63782823600, #  local_start 2022-03-13 03:00:00 (Sun)
  63803383200, #    local_end 2022-11-06 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63803394000, #    utc_start 2022-11-06 05:00:00 (Sun)
  63814284000, #      utc_end 2023-03-12 06:00:00 (Sun)
  63803379600, #  local_start 2022-11-06 01:00:00 (Sun)
  63814269600, #    local_end 2023-03-12 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63814284000, #    utc_start 2023-03-12 06:00:00 (Sun)
  63834843600, #      utc_end 2023-11-05 05:00:00 (Sun)
  63814273200, #  local_start 2023-03-12 03:00:00 (Sun)
  63834832800, #    local_end 2023-11-05 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63834843600, #    utc_start 2023-11-05 05:00:00 (Sun)
  63845733600, #      utc_end 2024-03-10 06:00:00 (Sun)
  63834829200, #  local_start 2023-11-05 01:00:00 (Sun)
  63845719200, #    local_end 2024-03-10 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63845733600, #    utc_start 2024-03-10 06:00:00 (Sun)
  63866293200, #      utc_end 2024-11-03 05:00:00 (Sun)
  63845722800, #  local_start 2024-03-10 03:00:00 (Sun)
  63866282400, #    local_end 2024-11-03 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63866293200, #    utc_start 2024-11-03 05:00:00 (Sun)
  63877183200, #      utc_end 2025-03-09 06:00:00 (Sun)
  63866278800, #  local_start 2024-11-03 01:00:00 (Sun)
  63877168800, #    local_end 2025-03-09 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63877183200, #    utc_start 2025-03-09 06:00:00 (Sun)
  63897742800, #      utc_end 2025-11-02 05:00:00 (Sun)
  63877172400, #  local_start 2025-03-09 03:00:00 (Sun)
  63897732000, #    local_end 2025-11-02 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63897742800, #    utc_start 2025-11-02 05:00:00 (Sun)
  63908632800, #      utc_end 2026-03-08 06:00:00 (Sun)
  63897728400, #  local_start 2025-11-02 01:00:00 (Sun)
  63908618400, #    local_end 2026-03-08 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63908632800, #    utc_start 2026-03-08 06:00:00 (Sun)
  63929192400, #      utc_end 2026-11-01 05:00:00 (Sun)
  63908622000, #  local_start 2026-03-08 03:00:00 (Sun)
  63929181600, #    local_end 2026-11-01 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63929192400, #    utc_start 2026-11-01 05:00:00 (Sun)
  63940687200, #      utc_end 2027-03-14 06:00:00 (Sun)
  63929178000, #  local_start 2026-11-01 01:00:00 (Sun)
  63940672800, #    local_end 2027-03-14 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63940687200, #    utc_start 2027-03-14 06:00:00 (Sun)
  63961246800, #      utc_end 2027-11-07 05:00:00 (Sun)
  63940676400, #  local_start 2027-03-14 03:00:00 (Sun)
  63961236000, #    local_end 2027-11-07 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63961246800, #    utc_start 2027-11-07 05:00:00 (Sun)
  63972136800, #      utc_end 2028-03-12 06:00:00 (Sun)
  63961232400, #  local_start 2027-11-07 01:00:00 (Sun)
  63972122400, #    local_end 2028-03-12 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  63972136800, #    utc_start 2028-03-12 06:00:00 (Sun)
  63992696400, #      utc_end 2028-11-05 05:00:00 (Sun)
  63972126000, #  local_start 2028-03-12 03:00:00 (Sun)
  63992685600, #    local_end 2028-11-05 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  63992696400, #    utc_start 2028-11-05 05:00:00 (Sun)
  64003586400, #      utc_end 2029-03-11 06:00:00 (Sun)
  63992682000, #  local_start 2028-11-05 01:00:00 (Sun)
  64003572000, #    local_end 2029-03-11 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  64003586400, #    utc_start 2029-03-11 06:00:00 (Sun)
  64024146000, #      utc_end 2029-11-04 05:00:00 (Sun)
  64003575600, #  local_start 2029-03-11 03:00:00 (Sun)
  64024135200, #    local_end 2029-11-04 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
      [
  64024146000, #    utc_start 2029-11-04 05:00:00 (Sun)
  64035036000, #      utc_end 2030-03-10 06:00:00 (Sun)
  64024131600, #  local_start 2029-11-04 01:00:00 (Sun)
  64035021600, #    local_end 2030-03-10 02:00:00 (Sun)
  -14400,
  0,
  'AST',
      ],
      [
  64035036000, #    utc_start 2030-03-10 06:00:00 (Sun)
  64055595600, #      utc_end 2030-11-03 05:00:00 (Sun)
  64035025200, #  local_start 2030-03-10 03:00:00 (Sun)
  64055584800, #    local_end 2030-11-03 02:00:00 (Sun)
  -10800,
  1,
  'ADT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {57}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -14400 }
  
  my $last_observance = bless( {
    'format' => 'A%sT',
    'gmtoff' => '-4:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 721354,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 721354,
      'utc_rd_secs' => 0,
      'utc_year' => 1977
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -14400,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 721354,
      'local_rd_secs' => 14400,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 721354,
      'utc_rd_secs' => 14400,
      'utc_year' => 1977
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Mar',
      'letter' => 'D',
      'name' => 'US',
      'offset_from_std' => 3600,
      'on' => 'Sun>=8',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Nov',
      'letter' => 'S',
      'name' => 'US',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_ATLANTIC_BERMUDA

    $main::fatpacked{"DateTime/TimeZone/Atlantic/Canary.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ATLANTIC_CANARY';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Atlantic::Canary;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Atlantic::Canary::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60626019696, #      utc_end 1922-03-01 01:01:36 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60626016000, #    local_end 1922-03-01 00:00:00 (Wed)
  -3696,
  0,
  'LMT',
      ],
      [
  60626019696, #    utc_start 1922-03-01 01:01:36 (Wed)
  61401808800, #      utc_end 1946-09-30 02:00:00 (Mon)
  60626016096, #  local_start 1922-03-01 00:01:36 (Wed)
  61401805200, #    local_end 1946-09-30 01:00:00 (Mon)
  -3600,
  0,
  '-01',
      ],
      [
  61401808800, #    utc_start 1946-09-30 02:00:00 (Mon)
  62459510400, #      utc_end 1980-04-06 00:00:00 (Sun)
  61401808800, #  local_start 1946-09-30 02:00:00 (Mon)
  62459510400, #    local_end 1980-04-06 00:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62459510400, #    utc_start 1980-04-06 00:00:00 (Sun)
  62474634000, #      utc_end 1980-09-28 01:00:00 (Sun)
  62459514000, #  local_start 1980-04-06 01:00:00 (Sun)
  62474637600, #    local_end 1980-09-28 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62474634000, #    utc_start 1980-09-28 01:00:00 (Sun)
  62490358800, #      utc_end 1981-03-29 01:00:00 (Sun)
  62474634000, #  local_start 1980-09-28 01:00:00 (Sun)
  62490358800, #    local_end 1981-03-29 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62490358800, #    utc_start 1981-03-29 01:00:00 (Sun)
  62506083600, #      utc_end 1981-09-27 01:00:00 (Sun)
  62490362400, #  local_start 1981-03-29 02:00:00 (Sun)
  62506087200, #    local_end 1981-09-27 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62506083600, #    utc_start 1981-09-27 01:00:00 (Sun)
  62521808400, #      utc_end 1982-03-28 01:00:00 (Sun)
  62506083600, #  local_start 1981-09-27 01:00:00 (Sun)
  62521808400, #    local_end 1982-03-28 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62521808400, #    utc_start 1982-03-28 01:00:00 (Sun)
  62537533200, #      utc_end 1982-09-26 01:00:00 (Sun)
  62521812000, #  local_start 1982-03-28 02:00:00 (Sun)
  62537536800, #    local_end 1982-09-26 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62537533200, #    utc_start 1982-09-26 01:00:00 (Sun)
  62553258000, #      utc_end 1983-03-27 01:00:00 (Sun)
  62537533200, #  local_start 1982-09-26 01:00:00 (Sun)
  62553258000, #    local_end 1983-03-27 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62553258000, #    utc_start 1983-03-27 01:00:00 (Sun)
  62568982800, #      utc_end 1983-09-25 01:00:00 (Sun)
  62553261600, #  local_start 1983-03-27 02:00:00 (Sun)
  62568986400, #    local_end 1983-09-25 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62568982800, #    utc_start 1983-09-25 01:00:00 (Sun)
  62584707600, #      utc_end 1984-03-25 01:00:00 (Sun)
  62568982800, #  local_start 1983-09-25 01:00:00 (Sun)
  62584707600, #    local_end 1984-03-25 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62584707600, #    utc_start 1984-03-25 01:00:00 (Sun)
  62601037200, #      utc_end 1984-09-30 01:00:00 (Sun)
  62584711200, #  local_start 1984-03-25 02:00:00 (Sun)
  62601040800, #    local_end 1984-09-30 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62601037200, #    utc_start 1984-09-30 01:00:00 (Sun)
  62616762000, #      utc_end 1985-03-31 01:00:00 (Sun)
  62601037200, #  local_start 1984-09-30 01:00:00 (Sun)
  62616762000, #    local_end 1985-03-31 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62616762000, #    utc_start 1985-03-31 01:00:00 (Sun)
  62632486800, #      utc_end 1985-09-29 01:00:00 (Sun)
  62616765600, #  local_start 1985-03-31 02:00:00 (Sun)
  62632490400, #    local_end 1985-09-29 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62632486800, #    utc_start 1985-09-29 01:00:00 (Sun)
  62648211600, #      utc_end 1986-03-30 01:00:00 (Sun)
  62632486800, #  local_start 1985-09-29 01:00:00 (Sun)
  62648211600, #    local_end 1986-03-30 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62648211600, #    utc_start 1986-03-30 01:00:00 (Sun)
  62663936400, #      utc_end 1986-09-28 01:00:00 (Sun)
  62648215200, #  local_start 1986-03-30 02:00:00 (Sun)
  62663940000, #    local_end 1986-09-28 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62663936400, #    utc_start 1986-09-28 01:00:00 (Sun)
  62679661200, #      utc_end 1987-03-29 01:00:00 (Sun)
  62663936400, #  local_start 1986-09-28 01:00:00 (Sun)
  62679661200, #    local_end 1987-03-29 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62679661200, #    utc_start 1987-03-29 01:00:00 (Sun)
  62695386000, #      utc_end 1987-09-27 01:00:00 (Sun)
  62679664800, #  local_start 1987-03-29 02:00:00 (Sun)
  62695389600, #    local_end 1987-09-27 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62695386000, #    utc_start 1987-09-27 01:00:00 (Sun)
  62711110800, #      utc_end 1988-03-27 01:00:00 (Sun)
  62695386000, #  local_start 1987-09-27 01:00:00 (Sun)
  62711110800, #    local_end 1988-03-27 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62711110800, #    utc_start 1988-03-27 01:00:00 (Sun)
  62726835600, #      utc_end 1988-09-25 01:00:00 (Sun)
  62711114400, #  local_start 1988-03-27 02:00:00 (Sun)
  62726839200, #    local_end 1988-09-25 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62726835600, #    utc_start 1988-09-25 01:00:00 (Sun)
  62742560400, #      utc_end 1989-03-26 01:00:00 (Sun)
  62726835600, #  local_start 1988-09-25 01:00:00 (Sun)
  62742560400, #    local_end 1989-03-26 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62742560400, #    utc_start 1989-03-26 01:00:00 (Sun)
  62758285200, #      utc_end 1989-09-24 01:00:00 (Sun)
  62742564000, #  local_start 1989-03-26 02:00:00 (Sun)
  62758288800, #    local_end 1989-09-24 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62758285200, #    utc_start 1989-09-24 01:00:00 (Sun)
  62774010000, #      utc_end 1990-03-25 01:00:00 (Sun)
  62758285200, #  local_start 1989-09-24 01:00:00 (Sun)
  62774010000, #    local_end 1990-03-25 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62774010000, #    utc_start 1990-03-25 01:00:00 (Sun)
  62790339600, #      utc_end 1990-09-30 01:00:00 (Sun)
  62774013600, #  local_start 1990-03-25 02:00:00 (Sun)
  62790343200, #    local_end 1990-09-30 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62790339600, #    utc_start 1990-09-30 01:00:00 (Sun)
  62806064400, #      utc_end 1991-03-31 01:00:00 (Sun)
  62790339600, #  local_start 1990-09-30 01:00:00 (Sun)
  62806064400, #    local_end 1991-03-31 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62806064400, #    utc_start 1991-03-31 01:00:00 (Sun)
  62821789200, #      utc_end 1991-09-29 01:00:00 (Sun)
  62806068000, #  local_start 1991-03-31 02:00:00 (Sun)
  62821792800, #    local_end 1991-09-29 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62821789200, #    utc_start 1991-09-29 01:00:00 (Sun)
  62837514000, #      utc_end 1992-03-29 01:00:00 (Sun)
  62821789200, #  local_start 1991-09-29 01:00:00 (Sun)
  62837514000, #    local_end 1992-03-29 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62837514000, #    utc_start 1992-03-29 01:00:00 (Sun)
  62853238800, #      utc_end 1992-09-27 01:00:00 (Sun)
  62837517600, #  local_start 1992-03-29 02:00:00 (Sun)
  62853242400, #    local_end 1992-09-27 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62853238800, #    utc_start 1992-09-27 01:00:00 (Sun)
  62868963600, #      utc_end 1993-03-28 01:00:00 (Sun)
  62853238800, #  local_start 1992-09-27 01:00:00 (Sun)
  62868963600, #    local_end 1993-03-28 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62868963600, #    utc_start 1993-03-28 01:00:00 (Sun)
  62884688400, #      utc_end 1993-09-26 01:00:00 (Sun)
  62868967200, #  local_start 1993-03-28 02:00:00 (Sun)
  62884692000, #    local_end 1993-09-26 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62884688400, #    utc_start 1993-09-26 01:00:00 (Sun)
  62900413200, #      utc_end 1994-03-27 01:00:00 (Sun)
  62884688400, #  local_start 1993-09-26 01:00:00 (Sun)
  62900413200, #    local_end 1994-03-27 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62900413200, #    utc_start 1994-03-27 01:00:00 (Sun)
  62916138000, #      utc_end 1994-09-25 01:00:00 (Sun)
  62900416800, #  local_start 1994-03-27 02:00:00 (Sun)
  62916141600, #    local_end 1994-09-25 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62916138000, #    utc_start 1994-09-25 01:00:00 (Sun)
  62931862800, #      utc_end 1995-03-26 01:00:00 (Sun)
  62916138000, #  local_start 1994-09-25 01:00:00 (Sun)
  62931862800, #    local_end 1995-03-26 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62931862800, #    utc_start 1995-03-26 01:00:00 (Sun)
  62947587600, #      utc_end 1995-09-24 01:00:00 (Sun)
  62931866400, #  local_start 1995-03-26 02:00:00 (Sun)
  62947591200, #    local_end 1995-09-24 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62947587600, #    utc_start 1995-09-24 01:00:00 (Sun)
  62963917200, #      utc_end 1996-03-31 01:00:00 (Sun)
  62947587600, #  local_start 1995-09-24 01:00:00 (Sun)
  62963917200, #    local_end 1996-03-31 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62963917200, #    utc_start 1996-03-31 01:00:00 (Sun)
  62982061200, #      utc_end 1996-10-27 01:00:00 (Sun)
  62963920800, #  local_start 1996-03-31 02:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62982061200, #    utc_start 1996-10-27 01:00:00 (Sun)
  62995366800, #      utc_end 1997-03-30 01:00:00 (Sun)
  62982061200, #  local_start 1996-10-27 01:00:00 (Sun)
  62995366800, #    local_end 1997-03-30 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62995366800, #    utc_start 1997-03-30 01:00:00 (Sun)
  63013510800, #      utc_end 1997-10-26 01:00:00 (Sun)
  62995370400, #  local_start 1997-03-30 02:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63013510800, #    utc_start 1997-10-26 01:00:00 (Sun)
  63026816400, #      utc_end 1998-03-29 01:00:00 (Sun)
  63013510800, #  local_start 1997-10-26 01:00:00 (Sun)
  63026816400, #    local_end 1998-03-29 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63026816400, #    utc_start 1998-03-29 01:00:00 (Sun)
  63044960400, #      utc_end 1998-10-25 01:00:00 (Sun)
  63026820000, #  local_start 1998-03-29 02:00:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63044960400, #    utc_start 1998-10-25 01:00:00 (Sun)
  63058266000, #      utc_end 1999-03-28 01:00:00 (Sun)
  63044960400, #  local_start 1998-10-25 01:00:00 (Sun)
  63058266000, #    local_end 1999-03-28 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63058266000, #    utc_start 1999-03-28 01:00:00 (Sun)
  63077014800, #      utc_end 1999-10-31 01:00:00 (Sun)
  63058269600, #  local_start 1999-03-28 02:00:00 (Sun)
  63077018400, #    local_end 1999-10-31 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63077014800, #    utc_start 1999-10-31 01:00:00 (Sun)
  63089715600, #      utc_end 2000-03-26 01:00:00 (Sun)
  63077014800, #  local_start 1999-10-31 01:00:00 (Sun)
  63089715600, #    local_end 2000-03-26 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63089715600, #    utc_start 2000-03-26 01:00:00 (Sun)
  63108464400, #      utc_end 2000-10-29 01:00:00 (Sun)
  63089719200, #  local_start 2000-03-26 02:00:00 (Sun)
  63108468000, #    local_end 2000-10-29 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63108464400, #    utc_start 2000-10-29 01:00:00 (Sun)
  63121165200, #      utc_end 2001-03-25 01:00:00 (Sun)
  63108464400, #  local_start 2000-10-29 01:00:00 (Sun)
  63121165200, #    local_end 2001-03-25 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63121165200, #    utc_start 2001-03-25 01:00:00 (Sun)
  63139914000, #      utc_end 2001-10-28 01:00:00 (Sun)
  63121168800, #  local_start 2001-03-25 02:00:00 (Sun)
  63139917600, #    local_end 2001-10-28 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63139914000, #    utc_start 2001-10-28 01:00:00 (Sun)
  63153219600, #      utc_end 2002-03-31 01:00:00 (Sun)
  63139914000, #  local_start 2001-10-28 01:00:00 (Sun)
  63153219600, #    local_end 2002-03-31 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63153219600, #    utc_start 2002-03-31 01:00:00 (Sun)
  63171363600, #      utc_end 2002-10-27 01:00:00 (Sun)
  63153223200, #  local_start 2002-03-31 02:00:00 (Sun)
  63171367200, #    local_end 2002-10-27 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63171363600, #    utc_start 2002-10-27 01:00:00 (Sun)
  63184669200, #      utc_end 2003-03-30 01:00:00 (Sun)
  63171363600, #  local_start 2002-10-27 01:00:00 (Sun)
  63184669200, #    local_end 2003-03-30 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63184669200, #    utc_start 2003-03-30 01:00:00 (Sun)
  63202813200, #      utc_end 2003-10-26 01:00:00 (Sun)
  63184672800, #  local_start 2003-03-30 02:00:00 (Sun)
  63202816800, #    local_end 2003-10-26 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63202813200, #    utc_start 2003-10-26 01:00:00 (Sun)
  63216118800, #      utc_end 2004-03-28 01:00:00 (Sun)
  63202813200, #  local_start 2003-10-26 01:00:00 (Sun)
  63216118800, #    local_end 2004-03-28 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63216118800, #    utc_start 2004-03-28 01:00:00 (Sun)
  63234867600, #      utc_end 2004-10-31 01:00:00 (Sun)
  63216122400, #  local_start 2004-03-28 02:00:00 (Sun)
  63234871200, #    local_end 2004-10-31 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63234867600, #    utc_start 2004-10-31 01:00:00 (Sun)
  63247568400, #      utc_end 2005-03-27 01:00:00 (Sun)
  63234867600, #  local_start 2004-10-31 01:00:00 (Sun)
  63247568400, #    local_end 2005-03-27 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63247568400, #    utc_start 2005-03-27 01:00:00 (Sun)
  63266317200, #      utc_end 2005-10-30 01:00:00 (Sun)
  63247572000, #  local_start 2005-03-27 02:00:00 (Sun)
  63266320800, #    local_end 2005-10-30 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63266317200, #    utc_start 2005-10-30 01:00:00 (Sun)
  63279018000, #      utc_end 2006-03-26 01:00:00 (Sun)
  63266317200, #  local_start 2005-10-30 01:00:00 (Sun)
  63279018000, #    local_end 2006-03-26 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63279018000, #    utc_start 2006-03-26 01:00:00 (Sun)
  63297766800, #      utc_end 2006-10-29 01:00:00 (Sun)
  63279021600, #  local_start 2006-03-26 02:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63297766800, #    utc_start 2006-10-29 01:00:00 (Sun)
  63310467600, #      utc_end 2007-03-25 01:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63310467600, #    local_end 2007-03-25 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63310467600, #    utc_start 2007-03-25 01:00:00 (Sun)
  63329216400, #      utc_end 2007-10-28 01:00:00 (Sun)
  63310471200, #  local_start 2007-03-25 02:00:00 (Sun)
  63329220000, #    local_end 2007-10-28 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63329216400, #    utc_start 2007-10-28 01:00:00 (Sun)
  63342522000, #      utc_end 2008-03-30 01:00:00 (Sun)
  63329216400, #  local_start 2007-10-28 01:00:00 (Sun)
  63342522000, #    local_end 2008-03-30 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63342522000, #    utc_start 2008-03-30 01:00:00 (Sun)
  63360666000, #      utc_end 2008-10-26 01:00:00 (Sun)
  63342525600, #  local_start 2008-03-30 02:00:00 (Sun)
  63360669600, #    local_end 2008-10-26 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63360666000, #    utc_start 2008-10-26 01:00:00 (Sun)
  63373971600, #      utc_end 2009-03-29 01:00:00 (Sun)
  63360666000, #  local_start 2008-10-26 01:00:00 (Sun)
  63373971600, #    local_end 2009-03-29 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63373971600, #    utc_start 2009-03-29 01:00:00 (Sun)
  63392115600, #      utc_end 2009-10-25 01:00:00 (Sun)
  63373975200, #  local_start 2009-03-29 02:00:00 (Sun)
  63392119200, #    local_end 2009-10-25 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63392115600, #    utc_start 2009-10-25 01:00:00 (Sun)
  63405421200, #      utc_end 2010-03-28 01:00:00 (Sun)
  63392115600, #  local_start 2009-10-25 01:00:00 (Sun)
  63405421200, #    local_end 2010-03-28 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63405421200, #    utc_start 2010-03-28 01:00:00 (Sun)
  63424170000, #      utc_end 2010-10-31 01:00:00 (Sun)
  63405424800, #  local_start 2010-03-28 02:00:00 (Sun)
  63424173600, #    local_end 2010-10-31 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63424170000, #    utc_start 2010-10-31 01:00:00 (Sun)
  63436870800, #      utc_end 2011-03-27 01:00:00 (Sun)
  63424170000, #  local_start 2010-10-31 01:00:00 (Sun)
  63436870800, #    local_end 2011-03-27 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63436870800, #    utc_start 2011-03-27 01:00:00 (Sun)
  63455619600, #      utc_end 2011-10-30 01:00:00 (Sun)
  63436874400, #  local_start 2011-03-27 02:00:00 (Sun)
  63455623200, #    local_end 2011-10-30 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63455619600, #    utc_start 2011-10-30 01:00:00 (Sun)
  63468320400, #      utc_end 2012-03-25 01:00:00 (Sun)
  63455619600, #  local_start 2011-10-30 01:00:00 (Sun)
  63468320400, #    local_end 2012-03-25 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63468320400, #    utc_start 2012-03-25 01:00:00 (Sun)
  63487069200, #      utc_end 2012-10-28 01:00:00 (Sun)
  63468324000, #  local_start 2012-03-25 02:00:00 (Sun)
  63487072800, #    local_end 2012-10-28 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63487069200, #    utc_start 2012-10-28 01:00:00 (Sun)
  63500374800, #      utc_end 2013-03-31 01:00:00 (Sun)
  63487069200, #  local_start 2012-10-28 01:00:00 (Sun)
  63500374800, #    local_end 2013-03-31 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63500374800, #    utc_start 2013-03-31 01:00:00 (Sun)
  63518518800, #      utc_end 2013-10-27 01:00:00 (Sun)
  63500378400, #  local_start 2013-03-31 02:00:00 (Sun)
  63518522400, #    local_end 2013-10-27 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63518518800, #    utc_start 2013-10-27 01:00:00 (Sun)
  63531824400, #      utc_end 2014-03-30 01:00:00 (Sun)
  63518518800, #  local_start 2013-10-27 01:00:00 (Sun)
  63531824400, #    local_end 2014-03-30 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63531824400, #    utc_start 2014-03-30 01:00:00 (Sun)
  63549968400, #      utc_end 2014-10-26 01:00:00 (Sun)
  63531828000, #  local_start 2014-03-30 02:00:00 (Sun)
  63549972000, #    local_end 2014-10-26 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63549968400, #    utc_start 2014-10-26 01:00:00 (Sun)
  63563274000, #      utc_end 2015-03-29 01:00:00 (Sun)
  63549968400, #  local_start 2014-10-26 01:00:00 (Sun)
  63563274000, #    local_end 2015-03-29 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63563274000, #    utc_start 2015-03-29 01:00:00 (Sun)
  63581418000, #      utc_end 2015-10-25 01:00:00 (Sun)
  63563277600, #  local_start 2015-03-29 02:00:00 (Sun)
  63581421600, #    local_end 2015-10-25 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63581418000, #    utc_start 2015-10-25 01:00:00 (Sun)
  63594723600, #      utc_end 2016-03-27 01:00:00 (Sun)
  63581418000, #  local_start 2015-10-25 01:00:00 (Sun)
  63594723600, #    local_end 2016-03-27 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63594723600, #    utc_start 2016-03-27 01:00:00 (Sun)
  63613472400, #      utc_end 2016-10-30 01:00:00 (Sun)
  63594727200, #  local_start 2016-03-27 02:00:00 (Sun)
  63613476000, #    local_end 2016-10-30 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63613472400, #    utc_start 2016-10-30 01:00:00 (Sun)
  63626173200, #      utc_end 2017-03-26 01:00:00 (Sun)
  63613472400, #  local_start 2016-10-30 01:00:00 (Sun)
  63626173200, #    local_end 2017-03-26 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63626173200, #    utc_start 2017-03-26 01:00:00 (Sun)
  63644922000, #      utc_end 2017-10-29 01:00:00 (Sun)
  63626176800, #  local_start 2017-03-26 02:00:00 (Sun)
  63644925600, #    local_end 2017-10-29 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63644922000, #    utc_start 2017-10-29 01:00:00 (Sun)
  63657622800, #      utc_end 2018-03-25 01:00:00 (Sun)
  63644922000, #  local_start 2017-10-29 01:00:00 (Sun)
  63657622800, #    local_end 2018-03-25 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63657622800, #    utc_start 2018-03-25 01:00:00 (Sun)
  63676371600, #      utc_end 2018-10-28 01:00:00 (Sun)
  63657626400, #  local_start 2018-03-25 02:00:00 (Sun)
  63676375200, #    local_end 2018-10-28 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63676371600, #    utc_start 2018-10-28 01:00:00 (Sun)
  63689677200, #      utc_end 2019-03-31 01:00:00 (Sun)
  63676371600, #  local_start 2018-10-28 01:00:00 (Sun)
  63689677200, #    local_end 2019-03-31 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63689677200, #    utc_start 2019-03-31 01:00:00 (Sun)
  63707821200, #      utc_end 2019-10-27 01:00:00 (Sun)
  63689680800, #  local_start 2019-03-31 02:00:00 (Sun)
  63707824800, #    local_end 2019-10-27 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63707821200, #    utc_start 2019-10-27 01:00:00 (Sun)
  63721126800, #      utc_end 2020-03-29 01:00:00 (Sun)
  63707821200, #  local_start 2019-10-27 01:00:00 (Sun)
  63721126800, #    local_end 2020-03-29 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63721126800, #    utc_start 2020-03-29 01:00:00 (Sun)
  63739270800, #      utc_end 2020-10-25 01:00:00 (Sun)
  63721130400, #  local_start 2020-03-29 02:00:00 (Sun)
  63739274400, #    local_end 2020-10-25 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63739270800, #    utc_start 2020-10-25 01:00:00 (Sun)
  63752576400, #      utc_end 2021-03-28 01:00:00 (Sun)
  63739270800, #  local_start 2020-10-25 01:00:00 (Sun)
  63752576400, #    local_end 2021-03-28 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63752576400, #    utc_start 2021-03-28 01:00:00 (Sun)
  63771325200, #      utc_end 2021-10-31 01:00:00 (Sun)
  63752580000, #  local_start 2021-03-28 02:00:00 (Sun)
  63771328800, #    local_end 2021-10-31 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63771325200, #    utc_start 2021-10-31 01:00:00 (Sun)
  63784026000, #      utc_end 2022-03-27 01:00:00 (Sun)
  63771325200, #  local_start 2021-10-31 01:00:00 (Sun)
  63784026000, #    local_end 2022-03-27 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63784026000, #    utc_start 2022-03-27 01:00:00 (Sun)
  63802774800, #      utc_end 2022-10-30 01:00:00 (Sun)
  63784029600, #  local_start 2022-03-27 02:00:00 (Sun)
  63802778400, #    local_end 2022-10-30 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63802774800, #    utc_start 2022-10-30 01:00:00 (Sun)
  63815475600, #      utc_end 2023-03-26 01:00:00 (Sun)
  63802774800, #  local_start 2022-10-30 01:00:00 (Sun)
  63815475600, #    local_end 2023-03-26 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63815475600, #    utc_start 2023-03-26 01:00:00 (Sun)
  63834224400, #      utc_end 2023-10-29 01:00:00 (Sun)
  63815479200, #  local_start 2023-03-26 02:00:00 (Sun)
  63834228000, #    local_end 2023-10-29 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63834224400, #    utc_start 2023-10-29 01:00:00 (Sun)
  63847530000, #      utc_end 2024-03-31 01:00:00 (Sun)
  63834224400, #  local_start 2023-10-29 01:00:00 (Sun)
  63847530000, #    local_end 2024-03-31 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63847530000, #    utc_start 2024-03-31 01:00:00 (Sun)
  63865674000, #      utc_end 2024-10-27 01:00:00 (Sun)
  63847533600, #  local_start 2024-03-31 02:00:00 (Sun)
  63865677600, #    local_end 2024-10-27 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63865674000, #    utc_start 2024-10-27 01:00:00 (Sun)
  63878979600, #      utc_end 2025-03-30 01:00:00 (Sun)
  63865674000, #  local_start 2024-10-27 01:00:00 (Sun)
  63878979600, #    local_end 2025-03-30 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63878979600, #    utc_start 2025-03-30 01:00:00 (Sun)
  63897123600, #      utc_end 2025-10-26 01:00:00 (Sun)
  63878983200, #  local_start 2025-03-30 02:00:00 (Sun)
  63897127200, #    local_end 2025-10-26 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63897123600, #    utc_start 2025-10-26 01:00:00 (Sun)
  63910429200, #      utc_end 2026-03-29 01:00:00 (Sun)
  63897123600, #  local_start 2025-10-26 01:00:00 (Sun)
  63910429200, #    local_end 2026-03-29 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63910429200, #    utc_start 2026-03-29 01:00:00 (Sun)
  63928573200, #      utc_end 2026-10-25 01:00:00 (Sun)
  63910432800, #  local_start 2026-03-29 02:00:00 (Sun)
  63928576800, #    local_end 2026-10-25 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63928573200, #    utc_start 2026-10-25 01:00:00 (Sun)
  63941878800, #      utc_end 2027-03-28 01:00:00 (Sun)
  63928573200, #  local_start 2026-10-25 01:00:00 (Sun)
  63941878800, #    local_end 2027-03-28 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63941878800, #    utc_start 2027-03-28 01:00:00 (Sun)
  63960627600, #      utc_end 2027-10-31 01:00:00 (Sun)
  63941882400, #  local_start 2027-03-28 02:00:00 (Sun)
  63960631200, #    local_end 2027-10-31 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63960627600, #    utc_start 2027-10-31 01:00:00 (Sun)
  63973328400, #      utc_end 2028-03-26 01:00:00 (Sun)
  63960627600, #  local_start 2027-10-31 01:00:00 (Sun)
  63973328400, #    local_end 2028-03-26 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63973328400, #    utc_start 2028-03-26 01:00:00 (Sun)
  63992077200, #      utc_end 2028-10-29 01:00:00 (Sun)
  63973332000, #  local_start 2028-03-26 02:00:00 (Sun)
  63992080800, #    local_end 2028-10-29 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63992077200, #    utc_start 2028-10-29 01:00:00 (Sun)
  64004778000, #      utc_end 2029-03-25 01:00:00 (Sun)
  63992077200, #  local_start 2028-10-29 01:00:00 (Sun)
  64004778000, #    local_end 2029-03-25 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  64004778000, #    utc_start 2029-03-25 01:00:00 (Sun)
  64023526800, #      utc_end 2029-10-28 01:00:00 (Sun)
  64004781600, #  local_start 2029-03-25 02:00:00 (Sun)
  64023530400, #    local_end 2029-10-28 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  64023526800, #    utc_start 2029-10-28 01:00:00 (Sun)
  64036832400, #      utc_end 2030-03-31 01:00:00 (Sun)
  64023526800, #  local_start 2029-10-28 01:00:00 (Sun)
  64036832400, #    local_end 2030-03-31 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  64036832400, #    utc_start 2030-03-31 01:00:00 (Sun)
  64054976400, #      utc_end 2030-10-27 01:00:00 (Sun)
  64036836000, #  local_start 2030-03-31 02:00:00 (Sun)
  64054980000, #    local_end 2030-10-27 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {51}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { 0 }
  
  my $last_observance = bless( {
    'format' => 'WE%sT',
    'gmtoff' => '0:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 723086,
      'local_rd_secs' => 3600,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 723086,
      'utc_rd_secs' => 3600,
      'utc_year' => 1981
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => 0,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 723086,
      'local_rd_secs' => 3600,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 723086,
      'utc_rd_secs' => 3600,
      'utc_year' => 1981
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '1:00u',
      'from' => '1996',
      'in' => 'Oct',
      'letter' => '',
      'name' => 'EU',
      'offset_from_std' => 0,
      'on' => 'lastSun',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '1:00u',
      'from' => '1981',
      'in' => 'Mar',
      'letter' => 'S',
      'name' => 'EU',
      'offset_from_std' => 3600,
      'on' => 'lastSun',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_ATLANTIC_CANARY

    $main::fatpacked{"DateTime/TimeZone/Atlantic/Cape_Verde.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ATLANTIC_CAPE_VERDE';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/africa.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Atlantic::Cape_Verde;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Atlantic::Cape_Verde::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60305306400, #      utc_end 1912-01-01 02:00:00 (Mon)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60305300756, #    local_end 1912-01-01 00:25:56 (Mon)
  -5644,
  0,
  'LMT',
      ],
      [
  60305306400, #    utc_start 1912-01-01 02:00:00 (Mon)
  61273072800, #      utc_end 1942-09-01 02:00:00 (Tue)
  60305299200, #  local_start 1912-01-01 00:00:00 (Mon)
  61273065600, #    local_end 1942-09-01 00:00:00 (Tue)
  -7200,
  0,
  '-02',
      ],
      [
  61273072800, #    utc_start 1942-09-01 02:00:00 (Tue)
  61371565200, #      utc_end 1945-10-15 01:00:00 (Mon)
  61273069200, #  local_start 1942-09-01 01:00:00 (Tue)
  61371561600, #    local_end 1945-10-15 00:00:00 (Mon)
  -3600,
  1,
  '-01',
      ],
      [
  61371565200, #    utc_start 1945-10-15 01:00:00 (Mon)
  62321803200, #      utc_end 1975-11-25 04:00:00 (Tue)
  61371558000, #  local_start 1945-10-14 23:00:00 (Sun)
  62321796000, #    local_end 1975-11-25 02:00:00 (Tue)
  -7200,
  0,
  '-02',
      ],
      [
  62321803200, #    utc_start 1975-11-25 04:00:00 (Tue)
  DateTime::TimeZone::INFINITY, #      utc_end
  62321799600, #  local_start 1975-11-25 03:00:00 (Tue)
  DateTime::TimeZone::INFINITY, #    local_end
  -3600,
  0,
  '-01',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {1}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ATLANTIC_CAPE_VERDE

    $main::fatpacked{"DateTime/TimeZone/Atlantic/Faroe.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ATLANTIC_FAROE';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Atlantic::Faroe;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Atlantic::Faroe::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60179934424, #      utc_end 1908-01-11 00:27:04 (Sat)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60179932800, #    local_end 1908-01-11 00:00:00 (Sat)
  -1624,
  0,
  'LMT',
      ],
      [
  60179934424, #    utc_start 1908-01-11 00:27:04 (Sat)
  62482838400, #      utc_end 1981-01-01 00:00:00 (Thu)
  60179934424, #  local_start 1908-01-11 00:27:04 (Sat)
  62482838400, #    local_end 1981-01-01 00:00:00 (Thu)
  0,
  0,
  'WET',
      ],
      [
  62482838400, #    utc_start 1981-01-01 00:00:00 (Thu)
  62490358800, #      utc_end 1981-03-29 01:00:00 (Sun)
  62482838400, #  local_start 1981-01-01 00:00:00 (Thu)
  62490358800, #    local_end 1981-03-29 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62490358800, #    utc_start 1981-03-29 01:00:00 (Sun)
  62506083600, #      utc_end 1981-09-27 01:00:00 (Sun)
  62490362400, #  local_start 1981-03-29 02:00:00 (Sun)
  62506087200, #    local_end 1981-09-27 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62506083600, #    utc_start 1981-09-27 01:00:00 (Sun)
  62521808400, #      utc_end 1982-03-28 01:00:00 (Sun)
  62506083600, #  local_start 1981-09-27 01:00:00 (Sun)
  62521808400, #    local_end 1982-03-28 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62521808400, #    utc_start 1982-03-28 01:00:00 (Sun)
  62537533200, #      utc_end 1982-09-26 01:00:00 (Sun)
  62521812000, #  local_start 1982-03-28 02:00:00 (Sun)
  62537536800, #    local_end 1982-09-26 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62537533200, #    utc_start 1982-09-26 01:00:00 (Sun)
  62553258000, #      utc_end 1983-03-27 01:00:00 (Sun)
  62537533200, #  local_start 1982-09-26 01:00:00 (Sun)
  62553258000, #    local_end 1983-03-27 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62553258000, #    utc_start 1983-03-27 01:00:00 (Sun)
  62568982800, #      utc_end 1983-09-25 01:00:00 (Sun)
  62553261600, #  local_start 1983-03-27 02:00:00 (Sun)
  62568986400, #    local_end 1983-09-25 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62568982800, #    utc_start 1983-09-25 01:00:00 (Sun)
  62584707600, #      utc_end 1984-03-25 01:00:00 (Sun)
  62568982800, #  local_start 1983-09-25 01:00:00 (Sun)
  62584707600, #    local_end 1984-03-25 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62584707600, #    utc_start 1984-03-25 01:00:00 (Sun)
  62601037200, #      utc_end 1984-09-30 01:00:00 (Sun)
  62584711200, #  local_start 1984-03-25 02:00:00 (Sun)
  62601040800, #    local_end 1984-09-30 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62601037200, #    utc_start 1984-09-30 01:00:00 (Sun)
  62616762000, #      utc_end 1985-03-31 01:00:00 (Sun)
  62601037200, #  local_start 1984-09-30 01:00:00 (Sun)
  62616762000, #    local_end 1985-03-31 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62616762000, #    utc_start 1985-03-31 01:00:00 (Sun)
  62632486800, #      utc_end 1985-09-29 01:00:00 (Sun)
  62616765600, #  local_start 1985-03-31 02:00:00 (Sun)
  62632490400, #    local_end 1985-09-29 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62632486800, #    utc_start 1985-09-29 01:00:00 (Sun)
  62648211600, #      utc_end 1986-03-30 01:00:00 (Sun)
  62632486800, #  local_start 1985-09-29 01:00:00 (Sun)
  62648211600, #    local_end 1986-03-30 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62648211600, #    utc_start 1986-03-30 01:00:00 (Sun)
  62663936400, #      utc_end 1986-09-28 01:00:00 (Sun)
  62648215200, #  local_start 1986-03-30 02:00:00 (Sun)
  62663940000, #    local_end 1986-09-28 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62663936400, #    utc_start 1986-09-28 01:00:00 (Sun)
  62679661200, #      utc_end 1987-03-29 01:00:00 (Sun)
  62663936400, #  local_start 1986-09-28 01:00:00 (Sun)
  62679661200, #    local_end 1987-03-29 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62679661200, #    utc_start 1987-03-29 01:00:00 (Sun)
  62695386000, #      utc_end 1987-09-27 01:00:00 (Sun)
  62679664800, #  local_start 1987-03-29 02:00:00 (Sun)
  62695389600, #    local_end 1987-09-27 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62695386000, #    utc_start 1987-09-27 01:00:00 (Sun)
  62711110800, #      utc_end 1988-03-27 01:00:00 (Sun)
  62695386000, #  local_start 1987-09-27 01:00:00 (Sun)
  62711110800, #    local_end 1988-03-27 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62711110800, #    utc_start 1988-03-27 01:00:00 (Sun)
  62726835600, #      utc_end 1988-09-25 01:00:00 (Sun)
  62711114400, #  local_start 1988-03-27 02:00:00 (Sun)
  62726839200, #    local_end 1988-09-25 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62726835600, #    utc_start 1988-09-25 01:00:00 (Sun)
  62742560400, #      utc_end 1989-03-26 01:00:00 (Sun)
  62726835600, #  local_start 1988-09-25 01:00:00 (Sun)
  62742560400, #    local_end 1989-03-26 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62742560400, #    utc_start 1989-03-26 01:00:00 (Sun)
  62758285200, #      utc_end 1989-09-24 01:00:00 (Sun)
  62742564000, #  local_start 1989-03-26 02:00:00 (Sun)
  62758288800, #    local_end 1989-09-24 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62758285200, #    utc_start 1989-09-24 01:00:00 (Sun)
  62774010000, #      utc_end 1990-03-25 01:00:00 (Sun)
  62758285200, #  local_start 1989-09-24 01:00:00 (Sun)
  62774010000, #    local_end 1990-03-25 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62774010000, #    utc_start 1990-03-25 01:00:00 (Sun)
  62790339600, #      utc_end 1990-09-30 01:00:00 (Sun)
  62774013600, #  local_start 1990-03-25 02:00:00 (Sun)
  62790343200, #    local_end 1990-09-30 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62790339600, #    utc_start 1990-09-30 01:00:00 (Sun)
  62806064400, #      utc_end 1991-03-31 01:00:00 (Sun)
  62790339600, #  local_start 1990-09-30 01:00:00 (Sun)
  62806064400, #    local_end 1991-03-31 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62806064400, #    utc_start 1991-03-31 01:00:00 (Sun)
  62821789200, #      utc_end 1991-09-29 01:00:00 (Sun)
  62806068000, #  local_start 1991-03-31 02:00:00 (Sun)
  62821792800, #    local_end 1991-09-29 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62821789200, #    utc_start 1991-09-29 01:00:00 (Sun)
  62837514000, #      utc_end 1992-03-29 01:00:00 (Sun)
  62821789200, #  local_start 1991-09-29 01:00:00 (Sun)
  62837514000, #    local_end 1992-03-29 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62837514000, #    utc_start 1992-03-29 01:00:00 (Sun)
  62853238800, #      utc_end 1992-09-27 01:00:00 (Sun)
  62837517600, #  local_start 1992-03-29 02:00:00 (Sun)
  62853242400, #    local_end 1992-09-27 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62853238800, #    utc_start 1992-09-27 01:00:00 (Sun)
  62868963600, #      utc_end 1993-03-28 01:00:00 (Sun)
  62853238800, #  local_start 1992-09-27 01:00:00 (Sun)
  62868963600, #    local_end 1993-03-28 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62868963600, #    utc_start 1993-03-28 01:00:00 (Sun)
  62884688400, #      utc_end 1993-09-26 01:00:00 (Sun)
  62868967200, #  local_start 1993-03-28 02:00:00 (Sun)
  62884692000, #    local_end 1993-09-26 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62884688400, #    utc_start 1993-09-26 01:00:00 (Sun)
  62900413200, #      utc_end 1994-03-27 01:00:00 (Sun)
  62884688400, #  local_start 1993-09-26 01:00:00 (Sun)
  62900413200, #    local_end 1994-03-27 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62900413200, #    utc_start 1994-03-27 01:00:00 (Sun)
  62916138000, #      utc_end 1994-09-25 01:00:00 (Sun)
  62900416800, #  local_start 1994-03-27 02:00:00 (Sun)
  62916141600, #    local_end 1994-09-25 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62916138000, #    utc_start 1994-09-25 01:00:00 (Sun)
  62931862800, #      utc_end 1995-03-26 01:00:00 (Sun)
  62916138000, #  local_start 1994-09-25 01:00:00 (Sun)
  62931862800, #    local_end 1995-03-26 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62931862800, #    utc_start 1995-03-26 01:00:00 (Sun)
  62947587600, #      utc_end 1995-09-24 01:00:00 (Sun)
  62931866400, #  local_start 1995-03-26 02:00:00 (Sun)
  62947591200, #    local_end 1995-09-24 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62947587600, #    utc_start 1995-09-24 01:00:00 (Sun)
  62963917200, #      utc_end 1996-03-31 01:00:00 (Sun)
  62947587600, #  local_start 1995-09-24 01:00:00 (Sun)
  62963917200, #    local_end 1996-03-31 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62963917200, #    utc_start 1996-03-31 01:00:00 (Sun)
  62982061200, #      utc_end 1996-10-27 01:00:00 (Sun)
  62963920800, #  local_start 1996-03-31 02:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62982061200, #    utc_start 1996-10-27 01:00:00 (Sun)
  62995366800, #      utc_end 1997-03-30 01:00:00 (Sun)
  62982061200, #  local_start 1996-10-27 01:00:00 (Sun)
  62995366800, #    local_end 1997-03-30 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62995366800, #    utc_start 1997-03-30 01:00:00 (Sun)
  63013510800, #      utc_end 1997-10-26 01:00:00 (Sun)
  62995370400, #  local_start 1997-03-30 02:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63013510800, #    utc_start 1997-10-26 01:00:00 (Sun)
  63026816400, #      utc_end 1998-03-29 01:00:00 (Sun)
  63013510800, #  local_start 1997-10-26 01:00:00 (Sun)
  63026816400, #    local_end 1998-03-29 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63026816400, #    utc_start 1998-03-29 01:00:00 (Sun)
  63044960400, #      utc_end 1998-10-25 01:00:00 (Sun)
  63026820000, #  local_start 1998-03-29 02:00:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63044960400, #    utc_start 1998-10-25 01:00:00 (Sun)
  63058266000, #      utc_end 1999-03-28 01:00:00 (Sun)
  63044960400, #  local_start 1998-10-25 01:00:00 (Sun)
  63058266000, #    local_end 1999-03-28 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63058266000, #    utc_start 1999-03-28 01:00:00 (Sun)
  63077014800, #      utc_end 1999-10-31 01:00:00 (Sun)
  63058269600, #  local_start 1999-03-28 02:00:00 (Sun)
  63077018400, #    local_end 1999-10-31 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63077014800, #    utc_start 1999-10-31 01:00:00 (Sun)
  63089715600, #      utc_end 2000-03-26 01:00:00 (Sun)
  63077014800, #  local_start 1999-10-31 01:00:00 (Sun)
  63089715600, #    local_end 2000-03-26 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63089715600, #    utc_start 2000-03-26 01:00:00 (Sun)
  63108464400, #      utc_end 2000-10-29 01:00:00 (Sun)
  63089719200, #  local_start 2000-03-26 02:00:00 (Sun)
  63108468000, #    local_end 2000-10-29 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63108464400, #    utc_start 2000-10-29 01:00:00 (Sun)
  63121165200, #      utc_end 2001-03-25 01:00:00 (Sun)
  63108464400, #  local_start 2000-10-29 01:00:00 (Sun)
  63121165200, #    local_end 2001-03-25 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63121165200, #    utc_start 2001-03-25 01:00:00 (Sun)
  63139914000, #      utc_end 2001-10-28 01:00:00 (Sun)
  63121168800, #  local_start 2001-03-25 02:00:00 (Sun)
  63139917600, #    local_end 2001-10-28 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63139914000, #    utc_start 2001-10-28 01:00:00 (Sun)
  63153219600, #      utc_end 2002-03-31 01:00:00 (Sun)
  63139914000, #  local_start 2001-10-28 01:00:00 (Sun)
  63153219600, #    local_end 2002-03-31 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63153219600, #    utc_start 2002-03-31 01:00:00 (Sun)
  63171363600, #      utc_end 2002-10-27 01:00:00 (Sun)
  63153223200, #  local_start 2002-03-31 02:00:00 (Sun)
  63171367200, #    local_end 2002-10-27 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63171363600, #    utc_start 2002-10-27 01:00:00 (Sun)
  63184669200, #      utc_end 2003-03-30 01:00:00 (Sun)
  63171363600, #  local_start 2002-10-27 01:00:00 (Sun)
  63184669200, #    local_end 2003-03-30 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63184669200, #    utc_start 2003-03-30 01:00:00 (Sun)
  63202813200, #      utc_end 2003-10-26 01:00:00 (Sun)
  63184672800, #  local_start 2003-03-30 02:00:00 (Sun)
  63202816800, #    local_end 2003-10-26 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63202813200, #    utc_start 2003-10-26 01:00:00 (Sun)
  63216118800, #      utc_end 2004-03-28 01:00:00 (Sun)
  63202813200, #  local_start 2003-10-26 01:00:00 (Sun)
  63216118800, #    local_end 2004-03-28 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63216118800, #    utc_start 2004-03-28 01:00:00 (Sun)
  63234867600, #      utc_end 2004-10-31 01:00:00 (Sun)
  63216122400, #  local_start 2004-03-28 02:00:00 (Sun)
  63234871200, #    local_end 2004-10-31 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63234867600, #    utc_start 2004-10-31 01:00:00 (Sun)
  63247568400, #      utc_end 2005-03-27 01:00:00 (Sun)
  63234867600, #  local_start 2004-10-31 01:00:00 (Sun)
  63247568400, #    local_end 2005-03-27 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63247568400, #    utc_start 2005-03-27 01:00:00 (Sun)
  63266317200, #      utc_end 2005-10-30 01:00:00 (Sun)
  63247572000, #  local_start 2005-03-27 02:00:00 (Sun)
  63266320800, #    local_end 2005-10-30 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63266317200, #    utc_start 2005-10-30 01:00:00 (Sun)
  63279018000, #      utc_end 2006-03-26 01:00:00 (Sun)
  63266317200, #  local_start 2005-10-30 01:00:00 (Sun)
  63279018000, #    local_end 2006-03-26 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63279018000, #    utc_start 2006-03-26 01:00:00 (Sun)
  63297766800, #      utc_end 2006-10-29 01:00:00 (Sun)
  63279021600, #  local_start 2006-03-26 02:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63297766800, #    utc_start 2006-10-29 01:00:00 (Sun)
  63310467600, #      utc_end 2007-03-25 01:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63310467600, #    local_end 2007-03-25 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63310467600, #    utc_start 2007-03-25 01:00:00 (Sun)
  63329216400, #      utc_end 2007-10-28 01:00:00 (Sun)
  63310471200, #  local_start 2007-03-25 02:00:00 (Sun)
  63329220000, #    local_end 2007-10-28 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63329216400, #    utc_start 2007-10-28 01:00:00 (Sun)
  63342522000, #      utc_end 2008-03-30 01:00:00 (Sun)
  63329216400, #  local_start 2007-10-28 01:00:00 (Sun)
  63342522000, #    local_end 2008-03-30 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63342522000, #    utc_start 2008-03-30 01:00:00 (Sun)
  63360666000, #      utc_end 2008-10-26 01:00:00 (Sun)
  63342525600, #  local_start 2008-03-30 02:00:00 (Sun)
  63360669600, #    local_end 2008-10-26 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63360666000, #    utc_start 2008-10-26 01:00:00 (Sun)
  63373971600, #      utc_end 2009-03-29 01:00:00 (Sun)
  63360666000, #  local_start 2008-10-26 01:00:00 (Sun)
  63373971600, #    local_end 2009-03-29 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63373971600, #    utc_start 2009-03-29 01:00:00 (Sun)
  63392115600, #      utc_end 2009-10-25 01:00:00 (Sun)
  63373975200, #  local_start 2009-03-29 02:00:00 (Sun)
  63392119200, #    local_end 2009-10-25 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63392115600, #    utc_start 2009-10-25 01:00:00 (Sun)
  63405421200, #      utc_end 2010-03-28 01:00:00 (Sun)
  63392115600, #  local_start 2009-10-25 01:00:00 (Sun)
  63405421200, #    local_end 2010-03-28 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63405421200, #    utc_start 2010-03-28 01:00:00 (Sun)
  63424170000, #      utc_end 2010-10-31 01:00:00 (Sun)
  63405424800, #  local_start 2010-03-28 02:00:00 (Sun)
  63424173600, #    local_end 2010-10-31 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63424170000, #    utc_start 2010-10-31 01:00:00 (Sun)
  63436870800, #      utc_end 2011-03-27 01:00:00 (Sun)
  63424170000, #  local_start 2010-10-31 01:00:00 (Sun)
  63436870800, #    local_end 2011-03-27 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63436870800, #    utc_start 2011-03-27 01:00:00 (Sun)
  63455619600, #      utc_end 2011-10-30 01:00:00 (Sun)
  63436874400, #  local_start 2011-03-27 02:00:00 (Sun)
  63455623200, #    local_end 2011-10-30 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63455619600, #    utc_start 2011-10-30 01:00:00 (Sun)
  63468320400, #      utc_end 2012-03-25 01:00:00 (Sun)
  63455619600, #  local_start 2011-10-30 01:00:00 (Sun)
  63468320400, #    local_end 2012-03-25 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63468320400, #    utc_start 2012-03-25 01:00:00 (Sun)
  63487069200, #      utc_end 2012-10-28 01:00:00 (Sun)
  63468324000, #  local_start 2012-03-25 02:00:00 (Sun)
  63487072800, #    local_end 2012-10-28 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63487069200, #    utc_start 2012-10-28 01:00:00 (Sun)
  63500374800, #      utc_end 2013-03-31 01:00:00 (Sun)
  63487069200, #  local_start 2012-10-28 01:00:00 (Sun)
  63500374800, #    local_end 2013-03-31 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63500374800, #    utc_start 2013-03-31 01:00:00 (Sun)
  63518518800, #      utc_end 2013-10-27 01:00:00 (Sun)
  63500378400, #  local_start 2013-03-31 02:00:00 (Sun)
  63518522400, #    local_end 2013-10-27 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63518518800, #    utc_start 2013-10-27 01:00:00 (Sun)
  63531824400, #      utc_end 2014-03-30 01:00:00 (Sun)
  63518518800, #  local_start 2013-10-27 01:00:00 (Sun)
  63531824400, #    local_end 2014-03-30 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63531824400, #    utc_start 2014-03-30 01:00:00 (Sun)
  63549968400, #      utc_end 2014-10-26 01:00:00 (Sun)
  63531828000, #  local_start 2014-03-30 02:00:00 (Sun)
  63549972000, #    local_end 2014-10-26 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63549968400, #    utc_start 2014-10-26 01:00:00 (Sun)
  63563274000, #      utc_end 2015-03-29 01:00:00 (Sun)
  63549968400, #  local_start 2014-10-26 01:00:00 (Sun)
  63563274000, #    local_end 2015-03-29 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63563274000, #    utc_start 2015-03-29 01:00:00 (Sun)
  63581418000, #      utc_end 2015-10-25 01:00:00 (Sun)
  63563277600, #  local_start 2015-03-29 02:00:00 (Sun)
  63581421600, #    local_end 2015-10-25 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63581418000, #    utc_start 2015-10-25 01:00:00 (Sun)
  63594723600, #      utc_end 2016-03-27 01:00:00 (Sun)
  63581418000, #  local_start 2015-10-25 01:00:00 (Sun)
  63594723600, #    local_end 2016-03-27 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63594723600, #    utc_start 2016-03-27 01:00:00 (Sun)
  63613472400, #      utc_end 2016-10-30 01:00:00 (Sun)
  63594727200, #  local_start 2016-03-27 02:00:00 (Sun)
  63613476000, #    local_end 2016-10-30 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63613472400, #    utc_start 2016-10-30 01:00:00 (Sun)
  63626173200, #      utc_end 2017-03-26 01:00:00 (Sun)
  63613472400, #  local_start 2016-10-30 01:00:00 (Sun)
  63626173200, #    local_end 2017-03-26 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63626173200, #    utc_start 2017-03-26 01:00:00 (Sun)
  63644922000, #      utc_end 2017-10-29 01:00:00 (Sun)
  63626176800, #  local_start 2017-03-26 02:00:00 (Sun)
  63644925600, #    local_end 2017-10-29 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63644922000, #    utc_start 2017-10-29 01:00:00 (Sun)
  63657622800, #      utc_end 2018-03-25 01:00:00 (Sun)
  63644922000, #  local_start 2017-10-29 01:00:00 (Sun)
  63657622800, #    local_end 2018-03-25 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63657622800, #    utc_start 2018-03-25 01:00:00 (Sun)
  63676371600, #      utc_end 2018-10-28 01:00:00 (Sun)
  63657626400, #  local_start 2018-03-25 02:00:00 (Sun)
  63676375200, #    local_end 2018-10-28 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63676371600, #    utc_start 2018-10-28 01:00:00 (Sun)
  63689677200, #      utc_end 2019-03-31 01:00:00 (Sun)
  63676371600, #  local_start 2018-10-28 01:00:00 (Sun)
  63689677200, #    local_end 2019-03-31 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63689677200, #    utc_start 2019-03-31 01:00:00 (Sun)
  63707821200, #      utc_end 2019-10-27 01:00:00 (Sun)
  63689680800, #  local_start 2019-03-31 02:00:00 (Sun)
  63707824800, #    local_end 2019-10-27 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63707821200, #    utc_start 2019-10-27 01:00:00 (Sun)
  63721126800, #      utc_end 2020-03-29 01:00:00 (Sun)
  63707821200, #  local_start 2019-10-27 01:00:00 (Sun)
  63721126800, #    local_end 2020-03-29 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63721126800, #    utc_start 2020-03-29 01:00:00 (Sun)
  63739270800, #      utc_end 2020-10-25 01:00:00 (Sun)
  63721130400, #  local_start 2020-03-29 02:00:00 (Sun)
  63739274400, #    local_end 2020-10-25 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63739270800, #    utc_start 2020-10-25 01:00:00 (Sun)
  63752576400, #      utc_end 2021-03-28 01:00:00 (Sun)
  63739270800, #  local_start 2020-10-25 01:00:00 (Sun)
  63752576400, #    local_end 2021-03-28 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63752576400, #    utc_start 2021-03-28 01:00:00 (Sun)
  63771325200, #      utc_end 2021-10-31 01:00:00 (Sun)
  63752580000, #  local_start 2021-03-28 02:00:00 (Sun)
  63771328800, #    local_end 2021-10-31 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63771325200, #    utc_start 2021-10-31 01:00:00 (Sun)
  63784026000, #      utc_end 2022-03-27 01:00:00 (Sun)
  63771325200, #  local_start 2021-10-31 01:00:00 (Sun)
  63784026000, #    local_end 2022-03-27 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63784026000, #    utc_start 2022-03-27 01:00:00 (Sun)
  63802774800, #      utc_end 2022-10-30 01:00:00 (Sun)
  63784029600, #  local_start 2022-03-27 02:00:00 (Sun)
  63802778400, #    local_end 2022-10-30 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63802774800, #    utc_start 2022-10-30 01:00:00 (Sun)
  63815475600, #      utc_end 2023-03-26 01:00:00 (Sun)
  63802774800, #  local_start 2022-10-30 01:00:00 (Sun)
  63815475600, #    local_end 2023-03-26 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63815475600, #    utc_start 2023-03-26 01:00:00 (Sun)
  63834224400, #      utc_end 2023-10-29 01:00:00 (Sun)
  63815479200, #  local_start 2023-03-26 02:00:00 (Sun)
  63834228000, #    local_end 2023-10-29 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63834224400, #    utc_start 2023-10-29 01:00:00 (Sun)
  63847530000, #      utc_end 2024-03-31 01:00:00 (Sun)
  63834224400, #  local_start 2023-10-29 01:00:00 (Sun)
  63847530000, #    local_end 2024-03-31 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63847530000, #    utc_start 2024-03-31 01:00:00 (Sun)
  63865674000, #      utc_end 2024-10-27 01:00:00 (Sun)
  63847533600, #  local_start 2024-03-31 02:00:00 (Sun)
  63865677600, #    local_end 2024-10-27 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63865674000, #    utc_start 2024-10-27 01:00:00 (Sun)
  63878979600, #      utc_end 2025-03-30 01:00:00 (Sun)
  63865674000, #  local_start 2024-10-27 01:00:00 (Sun)
  63878979600, #    local_end 2025-03-30 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63878979600, #    utc_start 2025-03-30 01:00:00 (Sun)
  63897123600, #      utc_end 2025-10-26 01:00:00 (Sun)
  63878983200, #  local_start 2025-03-30 02:00:00 (Sun)
  63897127200, #    local_end 2025-10-26 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63897123600, #    utc_start 2025-10-26 01:00:00 (Sun)
  63910429200, #      utc_end 2026-03-29 01:00:00 (Sun)
  63897123600, #  local_start 2025-10-26 01:00:00 (Sun)
  63910429200, #    local_end 2026-03-29 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63910429200, #    utc_start 2026-03-29 01:00:00 (Sun)
  63928573200, #      utc_end 2026-10-25 01:00:00 (Sun)
  63910432800, #  local_start 2026-03-29 02:00:00 (Sun)
  63928576800, #    local_end 2026-10-25 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63928573200, #    utc_start 2026-10-25 01:00:00 (Sun)
  63941878800, #      utc_end 2027-03-28 01:00:00 (Sun)
  63928573200, #  local_start 2026-10-25 01:00:00 (Sun)
  63941878800, #    local_end 2027-03-28 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63941878800, #    utc_start 2027-03-28 01:00:00 (Sun)
  63960627600, #      utc_end 2027-10-31 01:00:00 (Sun)
  63941882400, #  local_start 2027-03-28 02:00:00 (Sun)
  63960631200, #    local_end 2027-10-31 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63960627600, #    utc_start 2027-10-31 01:00:00 (Sun)
  63973328400, #      utc_end 2028-03-26 01:00:00 (Sun)
  63960627600, #  local_start 2027-10-31 01:00:00 (Sun)
  63973328400, #    local_end 2028-03-26 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63973328400, #    utc_start 2028-03-26 01:00:00 (Sun)
  63992077200, #      utc_end 2028-10-29 01:00:00 (Sun)
  63973332000, #  local_start 2028-03-26 02:00:00 (Sun)
  63992080800, #    local_end 2028-10-29 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63992077200, #    utc_start 2028-10-29 01:00:00 (Sun)
  64004778000, #      utc_end 2029-03-25 01:00:00 (Sun)
  63992077200, #  local_start 2028-10-29 01:00:00 (Sun)
  64004778000, #    local_end 2029-03-25 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  64004778000, #    utc_start 2029-03-25 01:00:00 (Sun)
  64023526800, #      utc_end 2029-10-28 01:00:00 (Sun)
  64004781600, #  local_start 2029-03-25 02:00:00 (Sun)
  64023530400, #    local_end 2029-10-28 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  64023526800, #    utc_start 2029-10-28 01:00:00 (Sun)
  64036832400, #      utc_end 2030-03-31 01:00:00 (Sun)
  64023526800, #  local_start 2029-10-28 01:00:00 (Sun)
  64036832400, #    local_end 2030-03-31 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  64036832400, #    utc_start 2030-03-31 01:00:00 (Sun)
  64054976400, #      utc_end 2030-10-27 01:00:00 (Sun)
  64036836000, #  local_start 2030-03-31 02:00:00 (Sun)
  64054980000, #    local_end 2030-10-27 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {50}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { 0 }
  
  my $last_observance = bless( {
    'format' => 'WE%sT',
    'gmtoff' => '0:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 723181,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 723181,
      'utc_rd_secs' => 0,
      'utc_year' => 1982
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => 0,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 723181,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 723181,
      'utc_rd_secs' => 0,
      'utc_year' => 1982
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '1:00u',
      'from' => '1996',
      'in' => 'Oct',
      'letter' => '',
      'name' => 'EU',
      'offset_from_std' => 0,
      'on' => 'lastSun',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '1:00u',
      'from' => '1981',
      'in' => 'Mar',
      'letter' => 'S',
      'name' => 'EU',
      'offset_from_std' => 3600,
      'on' => 'lastSun',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_ATLANTIC_FAROE

    $main::fatpacked{"DateTime/TimeZone/Atlantic/Madeira.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ATLANTIC_MADEIRA';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Atlantic::Madeira;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Atlantic::Madeira::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59421776856, #      utc_end 1884-01-01 01:07:36 (Tue)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59421772800, #    local_end 1884-01-01 00:00:00 (Tue)
  -4056,
  0,
  'LMT',
      ],
      [
  59421776856, #    utc_start 1884-01-01 01:07:36 (Tue)
  60305302800, #      utc_end 1912-01-01 01:00:00 (Mon)
  59421772800, #  local_start 1884-01-01 00:00:00 (Tue)
  60305298744, #    local_end 1911-12-31 23:52:24 (Sun)
  -4056,
  0,
  'FMT',
      ],
      [
  60305302800, #    utc_start 1912-01-01 01:00:00 (Mon)
  60446131200, #      utc_end 1916-06-18 00:00:00 (Sun)
  60305299200, #  local_start 1912-01-01 00:00:00 (Mon)
  60446127600, #    local_end 1916-06-17 23:00:00 (Sat)
  -3600,
  0,
  '-01',
      ],
      [
  60446131200, #    utc_start 1916-06-18 00:00:00 (Sun)
  60457885200, #      utc_end 1916-11-01 01:00:00 (Wed)
  60446131200, #  local_start 1916-06-18 00:00:00 (Sun)
  60457885200, #    local_end 1916-11-01 01:00:00 (Wed)
  0,
  1,
  '+00',
      ],
      [
  60457885200, #    utc_start 1916-11-01 01:00:00 (Wed)
  60468249600, #      utc_end 1917-03-01 00:00:00 (Thu)
  60457881600, #  local_start 1916-11-01 00:00:00 (Wed)
  60468246000, #    local_end 1917-02-28 23:00:00 (Wed)
  -3600,
  0,
  '-01',
      ],
      [
  60468249600, #    utc_start 1917-03-01 00:00:00 (Thu)
  60487948800, #      utc_end 1917-10-15 00:00:00 (Mon)
  60468249600, #  local_start 1917-03-01 00:00:00 (Thu)
  60487948800, #    local_end 1917-10-15 00:00:00 (Mon)
  0,
  1,
  '+00',
      ],
      [
  60487948800, #    utc_start 1917-10-15 00:00:00 (Mon)
  60499872000, #      utc_end 1918-03-02 00:00:00 (Sat)
  60487945200, #  local_start 1917-10-14 23:00:00 (Sun)
  60499868400, #    local_end 1918-03-01 23:00:00 (Fri)
  -3600,
  0,
  '-01',
      ],
      [
  60499872000, #    utc_start 1918-03-02 00:00:00 (Sat)
  60519484800, #      utc_end 1918-10-15 00:00:00 (Tue)
  60499872000, #  local_start 1918-03-02 00:00:00 (Sat)
  60519484800, #    local_end 1918-10-15 00:00:00 (Tue)
  0,
  1,
  '+00',
      ],
      [
  60519484800, #    utc_start 1918-10-15 00:00:00 (Tue)
  60531321600, #      utc_end 1919-03-01 00:00:00 (Sat)
  60519481200, #  local_start 1918-10-14 23:00:00 (Mon)
  60531318000, #    local_end 1919-02-28 23:00:00 (Fri)
  -3600,
  0,
  '-01',
      ],
      [
  60531321600, #    utc_start 1919-03-01 00:00:00 (Sat)
  60551020800, #      utc_end 1919-10-15 00:00:00 (Wed)
  60531321600, #  local_start 1919-03-01 00:00:00 (Sat)
  60551020800, #    local_end 1919-10-15 00:00:00 (Wed)
  0,
  1,
  '+00',
      ],
      [
  60551020800, #    utc_start 1919-10-15 00:00:00 (Wed)
  60562944000, #      utc_end 1920-03-01 00:00:00 (Mon)
  60551017200, #  local_start 1919-10-14 23:00:00 (Tue)
  60562940400, #    local_end 1920-02-29 23:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  60562944000, #    utc_start 1920-03-01 00:00:00 (Mon)
  60582643200, #      utc_end 1920-10-15 00:00:00 (Fri)
  60562944000, #  local_start 1920-03-01 00:00:00 (Mon)
  60582643200, #    local_end 1920-10-15 00:00:00 (Fri)
  0,
  1,
  '+00',
      ],
      [
  60582643200, #    utc_start 1920-10-15 00:00:00 (Fri)
  60594480000, #      utc_end 1921-03-01 00:00:00 (Tue)
  60582639600, #  local_start 1920-10-14 23:00:00 (Thu)
  60594476400, #    local_end 1921-02-28 23:00:00 (Mon)
  -3600,
  0,
  '-01',
      ],
      [
  60594480000, #    utc_start 1921-03-01 00:00:00 (Tue)
  60614179200, #      utc_end 1921-10-15 00:00:00 (Sat)
  60594480000, #  local_start 1921-03-01 00:00:00 (Tue)
  60614179200, #    local_end 1921-10-15 00:00:00 (Sat)
  0,
  1,
  '+00',
      ],
      [
  60614179200, #    utc_start 1921-10-15 00:00:00 (Sat)
  60693235200, #      utc_end 1924-04-17 00:00:00 (Thu)
  60614175600, #  local_start 1921-10-14 23:00:00 (Fri)
  60693231600, #    local_end 1924-04-16 23:00:00 (Wed)
  -3600,
  0,
  '-01',
      ],
      [
  60693235200, #    utc_start 1924-04-17 00:00:00 (Thu)
  60708873600, #      utc_end 1924-10-15 00:00:00 (Wed)
  60693235200, #  local_start 1924-04-17 00:00:00 (Thu)
  60708873600, #    local_end 1924-10-15 00:00:00 (Wed)
  0,
  1,
  '+00',
      ],
      [
  60708873600, #    utc_start 1924-10-15 00:00:00 (Wed)
  60756393600, #      utc_end 1926-04-18 00:00:00 (Sun)
  60708870000, #  local_start 1924-10-14 23:00:00 (Tue)
  60756390000, #    local_end 1926-04-17 23:00:00 (Sat)
  -3600,
  0,
  '-01',
      ],
      [
  60756393600, #    utc_start 1926-04-18 00:00:00 (Sun)
  60770908800, #      utc_end 1926-10-03 00:00:00 (Sun)
  60756393600, #  local_start 1926-04-18 00:00:00 (Sun)
  60770908800, #    local_end 1926-10-03 00:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  60770908800, #    utc_start 1926-10-03 00:00:00 (Sun)
  60787238400, #      utc_end 1927-04-10 00:00:00 (Sun)
  60770905200, #  local_start 1926-10-02 23:00:00 (Sat)
  60787234800, #    local_end 1927-04-09 23:00:00 (Sat)
  -3600,
  0,
  '-01',
      ],
      [
  60787238400, #    utc_start 1927-04-10 00:00:00 (Sun)
  60802358400, #      utc_end 1927-10-02 00:00:00 (Sun)
  60787238400, #  local_start 1927-04-10 00:00:00 (Sun)
  60802358400, #    local_end 1927-10-02 00:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  60802358400, #    utc_start 1927-10-02 00:00:00 (Sun)
  60819292800, #      utc_end 1928-04-15 00:00:00 (Sun)
  60802354800, #  local_start 1927-10-01 23:00:00 (Sat)
  60819289200, #    local_end 1928-04-14 23:00:00 (Sat)
  -3600,
  0,
  '-01',
      ],
      [
  60819292800, #    utc_start 1928-04-15 00:00:00 (Sun)
  60834412800, #      utc_end 1928-10-07 00:00:00 (Sun)
  60819292800, #  local_start 1928-04-15 00:00:00 (Sun)
  60834412800, #    local_end 1928-10-07 00:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  60834412800, #    utc_start 1928-10-07 00:00:00 (Sun)
  60851347200, #      utc_end 1929-04-21 00:00:00 (Sun)
  60834409200, #  local_start 1928-10-06 23:00:00 (Sat)
  60851343600, #    local_end 1929-04-20 23:00:00 (Sat)
  -3600,
  0,
  '-01',
      ],
      [
  60851347200, #    utc_start 1929-04-21 00:00:00 (Sun)
  60865862400, #      utc_end 1929-10-06 00:00:00 (Sun)
  60851347200, #  local_start 1929-04-21 00:00:00 (Sun)
  60865862400, #    local_end 1929-10-06 00:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  60865862400, #    utc_start 1929-10-06 00:00:00 (Sun)
  60914246400, #      utc_end 1931-04-19 00:00:00 (Sun)
  60865858800, #  local_start 1929-10-05 23:00:00 (Sat)
  60914242800, #    local_end 1931-04-18 23:00:00 (Sat)
  -3600,
  0,
  '-01',
      ],
      [
  60914246400, #    utc_start 1931-04-19 00:00:00 (Sun)
  60928761600, #      utc_end 1931-10-04 00:00:00 (Sun)
  60914246400, #  local_start 1931-04-19 00:00:00 (Sun)
  60928761600, #    local_end 1931-10-04 00:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  60928761600, #    utc_start 1931-10-04 00:00:00 (Sun)
  60944486400, #      utc_end 1932-04-03 00:00:00 (Sun)
  60928758000, #  local_start 1931-10-03 23:00:00 (Sat)
  60944482800, #    local_end 1932-04-02 23:00:00 (Sat)
  -3600,
  0,
  '-01',
      ],
      [
  60944486400, #    utc_start 1932-04-03 00:00:00 (Sun)
  60960211200, #      utc_end 1932-10-02 00:00:00 (Sun)
  60944486400, #  local_start 1932-04-03 00:00:00 (Sun)
  60960211200, #    local_end 1932-10-02 00:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  60960211200, #    utc_start 1932-10-02 00:00:00 (Sun)
  61007990400, #      utc_end 1934-04-08 00:00:00 (Sun)
  60960207600, #  local_start 1932-10-01 23:00:00 (Sat)
  61007986800, #    local_end 1934-04-07 23:00:00 (Sat)
  -3600,
  0,
  '-01',
      ],
      [
  61007990400, #    utc_start 1934-04-08 00:00:00 (Sun)
  61023715200, #      utc_end 1934-10-07 00:00:00 (Sun)
  61007990400, #  local_start 1934-04-08 00:00:00 (Sun)
  61023715200, #    local_end 1934-10-07 00:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  61023715200, #    utc_start 1934-10-07 00:00:00 (Sun)
  61038835200, #      utc_end 1935-03-31 00:00:00 (Sun)
  61023711600, #  local_start 1934-10-06 23:00:00 (Sat)
  61038831600, #    local_end 1935-03-30 23:00:00 (Sat)
  -3600,
  0,
  '-01',
      ],
      [
  61038835200, #    utc_start 1935-03-31 00:00:00 (Sun)
  61055164800, #      utc_end 1935-10-06 00:00:00 (Sun)
  61038835200, #  local_start 1935-03-31 00:00:00 (Sun)
  61055164800, #    local_end 1935-10-06 00:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  61055164800, #    utc_start 1935-10-06 00:00:00 (Sun)
  61072099200, #      utc_end 1936-04-19 00:00:00 (Sun)
  61055161200, #  local_start 1935-10-05 23:00:00 (Sat)
  61072095600, #    local_end 1936-04-18 23:00:00 (Sat)
  -3600,
  0,
  '-01',
      ],
      [
  61072099200, #    utc_start 1936-04-19 00:00:00 (Sun)
  61086614400, #      utc_end 1936-10-04 00:00:00 (Sun)
  61072099200, #  local_start 1936-04-19 00:00:00 (Sun)
  61086614400, #    local_end 1936-10-04 00:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  61086614400, #    utc_start 1936-10-04 00:00:00 (Sun)
  61102339200, #      utc_end 1937-04-04 00:00:00 (Sun)
  61086610800, #  local_start 1936-10-03 23:00:00 (Sat)
  61102335600, #    local_end 1937-04-03 23:00:00 (Sat)
  -3600,
  0,
  '-01',
      ],
      [
  61102339200, #    utc_start 1937-04-04 00:00:00 (Sun)
  61118064000, #      utc_end 1937-10-03 00:00:00 (Sun)
  61102339200, #  local_start 1937-04-04 00:00:00 (Sun)
  61118064000, #    local_end 1937-10-03 00:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  61118064000, #    utc_start 1937-10-03 00:00:00 (Sun)
  61133184000, #      utc_end 1938-03-27 00:00:00 (Sun)
  61118060400, #  local_start 1937-10-02 23:00:00 (Sat)
  61133180400, #    local_end 1938-03-26 23:00:00 (Sat)
  -3600,
  0,
  '-01',
      ],
      [
  61133184000, #    utc_start 1938-03-27 00:00:00 (Sun)
  61149513600, #      utc_end 1938-10-02 00:00:00 (Sun)
  61133184000, #  local_start 1938-03-27 00:00:00 (Sun)
  61149513600, #    local_end 1938-10-02 00:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  61149513600, #    utc_start 1938-10-02 00:00:00 (Sun)
  61166448000, #      utc_end 1939-04-16 00:00:00 (Sun)
  61149510000, #  local_start 1938-10-01 23:00:00 (Sat)
  61166444400, #    local_end 1939-04-15 23:00:00 (Sat)
  -3600,
  0,
  '-01',
      ],
      [
  61166448000, #    utc_start 1939-04-16 00:00:00 (Sun)
  61185196800, #      utc_end 1939-11-19 00:00:00 (Sun)
  61166448000, #  local_start 1939-04-16 00:00:00 (Sun)
  61185196800, #    local_end 1939-11-19 00:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  61185196800, #    utc_start 1939-11-19 00:00:00 (Sun)
  61193664000, #      utc_end 1940-02-25 00:00:00 (Sun)
  61185193200, #  local_start 1939-11-18 23:00:00 (Sat)
  61193660400, #    local_end 1940-02-24 23:00:00 (Sat)
  -3600,
  0,
  '-01',
      ],
      [
  61193664000, #    utc_start 1940-02-25 00:00:00 (Sun)
  61213017600, #      utc_end 1940-10-06 00:00:00 (Sun)
  61193664000, #  local_start 1940-02-25 00:00:00 (Sun)
  61213017600, #    local_end 1940-10-06 00:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  61213017600, #    utc_start 1940-10-06 00:00:00 (Sun)
  61228742400, #      utc_end 1941-04-06 00:00:00 (Sun)
  61213014000, #  local_start 1940-10-05 23:00:00 (Sat)
  61228738800, #    local_end 1941-04-05 23:00:00 (Sat)
  -3600,
  0,
  '-01',
      ],
      [
  61228742400, #    utc_start 1941-04-06 00:00:00 (Sun)
  61244553600, #      utc_end 1941-10-06 00:00:00 (Mon)
  61228742400, #  local_start 1941-04-06 00:00:00 (Sun)
  61244553600, #    local_end 1941-10-06 00:00:00 (Mon)
  0,
  1,
  '+00',
      ],
      [
  61244553600, #    utc_start 1941-10-06 00:00:00 (Mon)
  61258377600, #      utc_end 1942-03-15 00:00:00 (Sun)
  61244550000, #  local_start 1941-10-05 23:00:00 (Sun)
  61258374000, #    local_end 1942-03-14 23:00:00 (Sat)
  -3600,
  0,
  '-01',
      ],
      [
  61258377600, #    utc_start 1942-03-15 00:00:00 (Sun)
  61262002800, #      utc_end 1942-04-25 23:00:00 (Sat)
  61258377600, #  local_start 1942-03-15 00:00:00 (Sun)
  61262002800, #    local_end 1942-04-25 23:00:00 (Sat)
  0,
  1,
  '+00',
      ],
      [
  61262002800, #    utc_start 1942-04-25 23:00:00 (Sat)
  61271679600, #      utc_end 1942-08-15 23:00:00 (Sat)
  61262006400, #  local_start 1942-04-26 00:00:00 (Sun)
  61271683200, #    local_end 1942-08-16 00:00:00 (Sun)
  3600,
  1,
  '+01',
      ],
      [
  61271679600, #    utc_start 1942-08-15 23:00:00 (Sat)
  61277731200, #      utc_end 1942-10-25 00:00:00 (Sun)
  61271679600, #  local_start 1942-08-15 23:00:00 (Sat)
  61277731200, #    local_end 1942-10-25 00:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  61277731200, #    utc_start 1942-10-25 00:00:00 (Sun)
  61289827200, #      utc_end 1943-03-14 00:00:00 (Sun)
  61277727600, #  local_start 1942-10-24 23:00:00 (Sat)
  61289823600, #    local_end 1943-03-13 23:00:00 (Sat)
  -3600,
  0,
  '-01',
      ],
      [
  61289827200, #    utc_start 1943-03-14 00:00:00 (Sun)
  61292847600, #      utc_end 1943-04-17 23:00:00 (Sat)
  61289827200, #  local_start 1943-03-14 00:00:00 (Sun)
  61292847600, #    local_end 1943-04-17 23:00:00 (Sat)
  0,
  1,
  '+00',
      ],
      [
  61292847600, #    utc_start 1943-04-17 23:00:00 (Sat)
  61304338800, #      utc_end 1943-08-28 23:00:00 (Sat)
  61292851200, #  local_start 1943-04-18 00:00:00 (Sun)
  61304342400, #    local_end 1943-08-29 00:00:00 (Sun)
  3600,
  1,
  '+01',
      ],
      [
  61304338800, #    utc_start 1943-08-28 23:00:00 (Sat)
  61309785600, #      utc_end 1943-10-31 00:00:00 (Sun)
  61304338800, #  local_start 1943-08-28 23:00:00 (Sat)
  61309785600, #    local_end 1943-10-31 00:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  61309785600, #    utc_start 1943-10-31 00:00:00 (Sun)
  61321276800, #      utc_end 1944-03-12 00:00:00 (Sun)
  61309782000, #  local_start 1943-10-30 23:00:00 (Sat)
  61321273200, #    local_end 1944-03-11 23:00:00 (Sat)
  -3600,
  0,
  '-01',
      ],
      [
  61321276800, #    utc_start 1944-03-12 00:00:00 (Sun)
  61324902000, #      utc_end 1944-04-22 23:00:00 (Sat)
  61321276800, #  local_start 1944-03-12 00:00:00 (Sun)
  61324902000, #    local_end 1944-04-22 23:00:00 (Sat)
  0,
  1,
  '+00',
      ],
      [
  61324902000, #    utc_start 1944-04-22 23:00:00 (Sat)
  61335788400, #      utc_end 1944-08-26 23:00:00 (Sat)
  61324905600, #  local_start 1944-04-23 00:00:00 (Sun)
  61335792000, #    local_end 1944-08-27 00:00:00 (Sun)
  3600,
  1,
  '+01',
      ],
      [
  61335788400, #    utc_start 1944-08-26 23:00:00 (Sat)
  61341235200, #      utc_end 1944-10-29 00:00:00 (Sun)
  61335788400, #  local_start 1944-08-26 23:00:00 (Sat)
  61341235200, #    local_end 1944-10-29 00:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  61341235200, #    utc_start 1944-10-29 00:00:00 (Sun)
  61352726400, #      utc_end 1945-03-11 00:00:00 (Sun)
  61341231600, #  local_start 1944-10-28 23:00:00 (Sat)
  61352722800, #    local_end 1945-03-10 23:00:00 (Sat)
  -3600,
  0,
  '-01',
      ],
      [
  61352726400, #    utc_start 1945-03-11 00:00:00 (Sun)
  61356351600, #      utc_end 1945-04-21 23:00:00 (Sat)
  61352726400, #  local_start 1945-03-11 00:00:00 (Sun)
  61356351600, #    local_end 1945-04-21 23:00:00 (Sat)
  0,
  1,
  '+00',
      ],
      [
  61356351600, #    utc_start 1945-04-21 23:00:00 (Sat)
  61367238000, #      utc_end 1945-08-25 23:00:00 (Sat)
  61356355200, #  local_start 1945-04-22 00:00:00 (Sun)
  61367241600, #    local_end 1945-08-26 00:00:00 (Sun)
  3600,
  1,
  '+01',
      ],
      [
  61367238000, #    utc_start 1945-08-25 23:00:00 (Sat)
  61372684800, #      utc_end 1945-10-28 00:00:00 (Sun)
  61367238000, #  local_start 1945-08-25 23:00:00 (Sat)
  61372684800, #    local_end 1945-10-28 00:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  61372684800, #    utc_start 1945-10-28 00:00:00 (Sun)
  61386595200, #      utc_end 1946-04-07 00:00:00 (Sun)
  61372681200, #  local_start 1945-10-27 23:00:00 (Sat)
  61386591600, #    local_end 1946-04-06 23:00:00 (Sat)
  -3600,
  0,
  '-01',
      ],
      [
  61386595200, #    utc_start 1946-04-07 00:00:00 (Sun)
  61402320000, #      utc_end 1946-10-06 00:00:00 (Sun)
  61386595200, #  local_start 1946-04-07 00:00:00 (Sun)
  61402320000, #    local_end 1946-10-06 00:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  61402320000, #    utc_start 1946-10-06 00:00:00 (Sun)
  61418055600, #      utc_end 1947-04-06 03:00:00 (Sun)
  61402316400, #  local_start 1946-10-05 23:00:00 (Sat)
  61418052000, #    local_end 1947-04-06 02:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  61418055600, #    utc_start 1947-04-06 03:00:00 (Sun)
  61433780400, #      utc_end 1947-10-05 03:00:00 (Sun)
  61418055600, #  local_start 1947-04-06 03:00:00 (Sun)
  61433780400, #    local_end 1947-10-05 03:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  61433780400, #    utc_start 1947-10-05 03:00:00 (Sun)
  61449505200, #      utc_end 1948-04-04 03:00:00 (Sun)
  61433776800, #  local_start 1947-10-05 02:00:00 (Sun)
  61449501600, #    local_end 1948-04-04 02:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  61449505200, #    utc_start 1948-04-04 03:00:00 (Sun)
  61465230000, #      utc_end 1948-10-03 03:00:00 (Sun)
  61449505200, #  local_start 1948-04-04 03:00:00 (Sun)
  61465230000, #    local_end 1948-10-03 03:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  61465230000, #    utc_start 1948-10-03 03:00:00 (Sun)
  61480954800, #      utc_end 1949-04-03 03:00:00 (Sun)
  61465226400, #  local_start 1948-10-03 02:00:00 (Sun)
  61480951200, #    local_end 1949-04-03 02:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  61480954800, #    utc_start 1949-04-03 03:00:00 (Sun)
  61496679600, #      utc_end 1949-10-02 03:00:00 (Sun)
  61480954800, #  local_start 1949-04-03 03:00:00 (Sun)
  61496679600, #    local_end 1949-10-02 03:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  61496679600, #    utc_start 1949-10-02 03:00:00 (Sun)
  61543854000, #      utc_end 1951-04-01 03:00:00 (Sun)
  61496676000, #  local_start 1949-10-02 02:00:00 (Sun)
  61543850400, #    local_end 1951-04-01 02:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  61543854000, #    utc_start 1951-04-01 03:00:00 (Sun)
  61560183600, #      utc_end 1951-10-07 03:00:00 (Sun)
  61543854000, #  local_start 1951-04-01 03:00:00 (Sun)
  61560183600, #    local_end 1951-10-07 03:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  61560183600, #    utc_start 1951-10-07 03:00:00 (Sun)
  61575908400, #      utc_end 1952-04-06 03:00:00 (Sun)
  61560180000, #  local_start 1951-10-07 02:00:00 (Sun)
  61575904800, #    local_end 1952-04-06 02:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  61575908400, #    utc_start 1952-04-06 03:00:00 (Sun)
  61591633200, #      utc_end 1952-10-05 03:00:00 (Sun)
  61575908400, #  local_start 1952-04-06 03:00:00 (Sun)
  61591633200, #    local_end 1952-10-05 03:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  61591633200, #    utc_start 1952-10-05 03:00:00 (Sun)
  61607358000, #      utc_end 1953-04-05 03:00:00 (Sun)
  61591629600, #  local_start 1952-10-05 02:00:00 (Sun)
  61607354400, #    local_end 1953-04-05 02:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  61607358000, #    utc_start 1953-04-05 03:00:00 (Sun)
  61623082800, #      utc_end 1953-10-04 03:00:00 (Sun)
  61607358000, #  local_start 1953-04-05 03:00:00 (Sun)
  61623082800, #    local_end 1953-10-04 03:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  61623082800, #    utc_start 1953-10-04 03:00:00 (Sun)
  61638807600, #      utc_end 1954-04-04 03:00:00 (Sun)
  61623079200, #  local_start 1953-10-04 02:00:00 (Sun)
  61638804000, #    local_end 1954-04-04 02:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  61638807600, #    utc_start 1954-04-04 03:00:00 (Sun)
  61654532400, #      utc_end 1954-10-03 03:00:00 (Sun)
  61638807600, #  local_start 1954-04-04 03:00:00 (Sun)
  61654532400, #    local_end 1954-10-03 03:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  61654532400, #    utc_start 1954-10-03 03:00:00 (Sun)
  61670257200, #      utc_end 1955-04-03 03:00:00 (Sun)
  61654528800, #  local_start 1954-10-03 02:00:00 (Sun)
  61670253600, #    local_end 1955-04-03 02:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  61670257200, #    utc_start 1955-04-03 03:00:00 (Sun)
  61685982000, #      utc_end 1955-10-02 03:00:00 (Sun)
  61670257200, #  local_start 1955-04-03 03:00:00 (Sun)
  61685982000, #    local_end 1955-10-02 03:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  61685982000, #    utc_start 1955-10-02 03:00:00 (Sun)
  61701706800, #      utc_end 1956-04-01 03:00:00 (Sun)
  61685978400, #  local_start 1955-10-02 02:00:00 (Sun)
  61701703200, #    local_end 1956-04-01 02:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  61701706800, #    utc_start 1956-04-01 03:00:00 (Sun)
  61718036400, #      utc_end 1956-10-07 03:00:00 (Sun)
  61701706800, #  local_start 1956-04-01 03:00:00 (Sun)
  61718036400, #    local_end 1956-10-07 03:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  61718036400, #    utc_start 1956-10-07 03:00:00 (Sun)
  61733761200, #      utc_end 1957-04-07 03:00:00 (Sun)
  61718032800, #  local_start 1956-10-07 02:00:00 (Sun)
  61733757600, #    local_end 1957-04-07 02:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  61733761200, #    utc_start 1957-04-07 03:00:00 (Sun)
  61749486000, #      utc_end 1957-10-06 03:00:00 (Sun)
  61733761200, #  local_start 1957-04-07 03:00:00 (Sun)
  61749486000, #    local_end 1957-10-06 03:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  61749486000, #    utc_start 1957-10-06 03:00:00 (Sun)
  61765210800, #      utc_end 1958-04-06 03:00:00 (Sun)
  61749482400, #  local_start 1957-10-06 02:00:00 (Sun)
  61765207200, #    local_end 1958-04-06 02:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  61765210800, #    utc_start 1958-04-06 03:00:00 (Sun)
  61780935600, #      utc_end 1958-10-05 03:00:00 (Sun)
  61765210800, #  local_start 1958-04-06 03:00:00 (Sun)
  61780935600, #    local_end 1958-10-05 03:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  61780935600, #    utc_start 1958-10-05 03:00:00 (Sun)
  61796660400, #      utc_end 1959-04-05 03:00:00 (Sun)
  61780932000, #  local_start 1958-10-05 02:00:00 (Sun)
  61796656800, #    local_end 1959-04-05 02:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  61796660400, #    utc_start 1959-04-05 03:00:00 (Sun)
  61812385200, #      utc_end 1959-10-04 03:00:00 (Sun)
  61796660400, #  local_start 1959-04-05 03:00:00 (Sun)
  61812385200, #    local_end 1959-10-04 03:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  61812385200, #    utc_start 1959-10-04 03:00:00 (Sun)
  61828110000, #      utc_end 1960-04-03 03:00:00 (Sun)
  61812381600, #  local_start 1959-10-04 02:00:00 (Sun)
  61828106400, #    local_end 1960-04-03 02:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  61828110000, #    utc_start 1960-04-03 03:00:00 (Sun)
  61843834800, #      utc_end 1960-10-02 03:00:00 (Sun)
  61828110000, #  local_start 1960-04-03 03:00:00 (Sun)
  61843834800, #    local_end 1960-10-02 03:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  61843834800, #    utc_start 1960-10-02 03:00:00 (Sun)
  61859559600, #      utc_end 1961-04-02 03:00:00 (Sun)
  61843831200, #  local_start 1960-10-02 02:00:00 (Sun)
  61859556000, #    local_end 1961-04-02 02:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  61859559600, #    utc_start 1961-04-02 03:00:00 (Sun)
  61875284400, #      utc_end 1961-10-01 03:00:00 (Sun)
  61859559600, #  local_start 1961-04-02 03:00:00 (Sun)
  61875284400, #    local_end 1961-10-01 03:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  61875284400, #    utc_start 1961-10-01 03:00:00 (Sun)
  61891009200, #      utc_end 1962-04-01 03:00:00 (Sun)
  61875280800, #  local_start 1961-10-01 02:00:00 (Sun)
  61891005600, #    local_end 1962-04-01 02:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  61891009200, #    utc_start 1962-04-01 03:00:00 (Sun)
  61907338800, #      utc_end 1962-10-07 03:00:00 (Sun)
  61891009200, #  local_start 1962-04-01 03:00:00 (Sun)
  61907338800, #    local_end 1962-10-07 03:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  61907338800, #    utc_start 1962-10-07 03:00:00 (Sun)
  61923063600, #      utc_end 1963-04-07 03:00:00 (Sun)
  61907335200, #  local_start 1962-10-07 02:00:00 (Sun)
  61923060000, #    local_end 1963-04-07 02:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  61923063600, #    utc_start 1963-04-07 03:00:00 (Sun)
  61938788400, #      utc_end 1963-10-06 03:00:00 (Sun)
  61923063600, #  local_start 1963-04-07 03:00:00 (Sun)
  61938788400, #    local_end 1963-10-06 03:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  61938788400, #    utc_start 1963-10-06 03:00:00 (Sun)
  61954513200, #      utc_end 1964-04-05 03:00:00 (Sun)
  61938784800, #  local_start 1963-10-06 02:00:00 (Sun)
  61954509600, #    local_end 1964-04-05 02:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  61954513200, #    utc_start 1964-04-05 03:00:00 (Sun)
  61970238000, #      utc_end 1964-10-04 03:00:00 (Sun)
  61954513200, #  local_start 1964-04-05 03:00:00 (Sun)
  61970238000, #    local_end 1964-10-04 03:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  61970238000, #    utc_start 1964-10-04 03:00:00 (Sun)
  61985962800, #      utc_end 1965-04-04 03:00:00 (Sun)
  61970234400, #  local_start 1964-10-04 02:00:00 (Sun)
  61985959200, #    local_end 1965-04-04 02:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  61985962800, #    utc_start 1965-04-04 03:00:00 (Sun)
  62001687600, #      utc_end 1965-10-03 03:00:00 (Sun)
  61985962800, #  local_start 1965-04-04 03:00:00 (Sun)
  62001687600, #    local_end 1965-10-03 03:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  62001687600, #    utc_start 1965-10-03 03:00:00 (Sun)
  62017412400, #      utc_end 1966-04-03 03:00:00 (Sun)
  62001684000, #  local_start 1965-10-03 02:00:00 (Sun)
  62017408800, #    local_end 1966-04-03 02:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  62017412400, #    utc_start 1966-04-03 03:00:00 (Sun)
  62363952000, #      utc_end 1977-03-27 00:00:00 (Sun)
  62017412400, #  local_start 1966-04-03 03:00:00 (Sun)
  62363952000, #    local_end 1977-03-27 00:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62363952000, #    utc_start 1977-03-27 00:00:00 (Sun)
  62379676800, #      utc_end 1977-09-25 00:00:00 (Sun)
  62363955600, #  local_start 1977-03-27 01:00:00 (Sun)
  62379680400, #    local_end 1977-09-25 01:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62379676800, #    utc_start 1977-09-25 00:00:00 (Sun)
  62396006400, #      utc_end 1978-04-02 00:00:00 (Sun)
  62379676800, #  local_start 1977-09-25 00:00:00 (Sun)
  62396006400, #    local_end 1978-04-02 00:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62396006400, #    utc_start 1978-04-02 00:00:00 (Sun)
  62411731200, #      utc_end 1978-10-01 00:00:00 (Sun)
  62396010000, #  local_start 1978-04-02 01:00:00 (Sun)
  62411734800, #    local_end 1978-10-01 01:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62411731200, #    utc_start 1978-10-01 00:00:00 (Sun)
  62427456000, #      utc_end 1979-04-01 00:00:00 (Sun)
  62411731200, #  local_start 1978-10-01 00:00:00 (Sun)
  62427456000, #    local_end 1979-04-01 00:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62427456000, #    utc_start 1979-04-01 00:00:00 (Sun)
  62443184400, #      utc_end 1979-09-30 01:00:00 (Sun)
  62427459600, #  local_start 1979-04-01 01:00:00 (Sun)
  62443188000, #    local_end 1979-09-30 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62443184400, #    utc_start 1979-09-30 01:00:00 (Sun)
  62458905600, #      utc_end 1980-03-30 00:00:00 (Sun)
  62443184400, #  local_start 1979-09-30 01:00:00 (Sun)
  62458905600, #    local_end 1980-03-30 00:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62458905600, #    utc_start 1980-03-30 00:00:00 (Sun)
  62474634000, #      utc_end 1980-09-28 01:00:00 (Sun)
  62458909200, #  local_start 1980-03-30 01:00:00 (Sun)
  62474637600, #    local_end 1980-09-28 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62474634000, #    utc_start 1980-09-28 01:00:00 (Sun)
  62490358800, #      utc_end 1981-03-29 01:00:00 (Sun)
  62474634000, #  local_start 1980-09-28 01:00:00 (Sun)
  62490358800, #    local_end 1981-03-29 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62490358800, #    utc_start 1981-03-29 01:00:00 (Sun)
  62506083600, #      utc_end 1981-09-27 01:00:00 (Sun)
  62490362400, #  local_start 1981-03-29 02:00:00 (Sun)
  62506087200, #    local_end 1981-09-27 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62506083600, #    utc_start 1981-09-27 01:00:00 (Sun)
  62521808400, #      utc_end 1982-03-28 01:00:00 (Sun)
  62506083600, #  local_start 1981-09-27 01:00:00 (Sun)
  62521808400, #    local_end 1982-03-28 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62521808400, #    utc_start 1982-03-28 01:00:00 (Sun)
  62537533200, #      utc_end 1982-09-26 01:00:00 (Sun)
  62521812000, #  local_start 1982-03-28 02:00:00 (Sun)
  62537536800, #    local_end 1982-09-26 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62537533200, #    utc_start 1982-09-26 01:00:00 (Sun)
  62553261600, #      utc_end 1983-03-27 02:00:00 (Sun)
  62537533200, #  local_start 1982-09-26 01:00:00 (Sun)
  62553261600, #    local_end 1983-03-27 02:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62553261600, #    utc_start 1983-03-27 02:00:00 (Sun)
  62568982800, #      utc_end 1983-09-25 01:00:00 (Sun)
  62553265200, #  local_start 1983-03-27 03:00:00 (Sun)
  62568986400, #    local_end 1983-09-25 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62568982800, #    utc_start 1983-09-25 01:00:00 (Sun)
  62584707600, #      utc_end 1984-03-25 01:00:00 (Sun)
  62568982800, #  local_start 1983-09-25 01:00:00 (Sun)
  62584707600, #    local_end 1984-03-25 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62584707600, #    utc_start 1984-03-25 01:00:00 (Sun)
  62601037200, #      utc_end 1984-09-30 01:00:00 (Sun)
  62584711200, #  local_start 1984-03-25 02:00:00 (Sun)
  62601040800, #    local_end 1984-09-30 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62601037200, #    utc_start 1984-09-30 01:00:00 (Sun)
  62616762000, #      utc_end 1985-03-31 01:00:00 (Sun)
  62601037200, #  local_start 1984-09-30 01:00:00 (Sun)
  62616762000, #    local_end 1985-03-31 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62616762000, #    utc_start 1985-03-31 01:00:00 (Sun)
  62632486800, #      utc_end 1985-09-29 01:00:00 (Sun)
  62616765600, #  local_start 1985-03-31 02:00:00 (Sun)
  62632490400, #    local_end 1985-09-29 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62632486800, #    utc_start 1985-09-29 01:00:00 (Sun)
  62648211600, #      utc_end 1986-03-30 01:00:00 (Sun)
  62632486800, #  local_start 1985-09-29 01:00:00 (Sun)
  62648211600, #    local_end 1986-03-30 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62648211600, #    utc_start 1986-03-30 01:00:00 (Sun)
  62663936400, #      utc_end 1986-09-28 01:00:00 (Sun)
  62648215200, #  local_start 1986-03-30 02:00:00 (Sun)
  62663940000, #    local_end 1986-09-28 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62663936400, #    utc_start 1986-09-28 01:00:00 (Sun)
  62679661200, #      utc_end 1987-03-29 01:00:00 (Sun)
  62663936400, #  local_start 1986-09-28 01:00:00 (Sun)
  62679661200, #    local_end 1987-03-29 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62679661200, #    utc_start 1987-03-29 01:00:00 (Sun)
  62695386000, #      utc_end 1987-09-27 01:00:00 (Sun)
  62679664800, #  local_start 1987-03-29 02:00:00 (Sun)
  62695389600, #    local_end 1987-09-27 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62695386000, #    utc_start 1987-09-27 01:00:00 (Sun)
  62711110800, #      utc_end 1988-03-27 01:00:00 (Sun)
  62695386000, #  local_start 1987-09-27 01:00:00 (Sun)
  62711110800, #    local_end 1988-03-27 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62711110800, #    utc_start 1988-03-27 01:00:00 (Sun)
  62726835600, #      utc_end 1988-09-25 01:00:00 (Sun)
  62711114400, #  local_start 1988-03-27 02:00:00 (Sun)
  62726839200, #    local_end 1988-09-25 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62726835600, #    utc_start 1988-09-25 01:00:00 (Sun)
  62742560400, #      utc_end 1989-03-26 01:00:00 (Sun)
  62726835600, #  local_start 1988-09-25 01:00:00 (Sun)
  62742560400, #    local_end 1989-03-26 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62742560400, #    utc_start 1989-03-26 01:00:00 (Sun)
  62758285200, #      utc_end 1989-09-24 01:00:00 (Sun)
  62742564000, #  local_start 1989-03-26 02:00:00 (Sun)
  62758288800, #    local_end 1989-09-24 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62758285200, #    utc_start 1989-09-24 01:00:00 (Sun)
  62774010000, #      utc_end 1990-03-25 01:00:00 (Sun)
  62758285200, #  local_start 1989-09-24 01:00:00 (Sun)
  62774010000, #    local_end 1990-03-25 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62774010000, #    utc_start 1990-03-25 01:00:00 (Sun)
  62790339600, #      utc_end 1990-09-30 01:00:00 (Sun)
  62774013600, #  local_start 1990-03-25 02:00:00 (Sun)
  62790343200, #    local_end 1990-09-30 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62790339600, #    utc_start 1990-09-30 01:00:00 (Sun)
  62806064400, #      utc_end 1991-03-31 01:00:00 (Sun)
  62790339600, #  local_start 1990-09-30 01:00:00 (Sun)
  62806064400, #    local_end 1991-03-31 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62806064400, #    utc_start 1991-03-31 01:00:00 (Sun)
  62821789200, #      utc_end 1991-09-29 01:00:00 (Sun)
  62806068000, #  local_start 1991-03-31 02:00:00 (Sun)
  62821792800, #    local_end 1991-09-29 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62821789200, #    utc_start 1991-09-29 01:00:00 (Sun)
  62837514000, #      utc_end 1992-03-29 01:00:00 (Sun)
  62821789200, #  local_start 1991-09-29 01:00:00 (Sun)
  62837514000, #    local_end 1992-03-29 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62837514000, #    utc_start 1992-03-29 01:00:00 (Sun)
  62853238800, #      utc_end 1992-09-27 01:00:00 (Sun)
  62837517600, #  local_start 1992-03-29 02:00:00 (Sun)
  62853242400, #    local_end 1992-09-27 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62853238800, #    utc_start 1992-09-27 01:00:00 (Sun)
  62868963600, #      utc_end 1993-03-28 01:00:00 (Sun)
  62853238800, #  local_start 1992-09-27 01:00:00 (Sun)
  62868963600, #    local_end 1993-03-28 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62868963600, #    utc_start 1993-03-28 01:00:00 (Sun)
  62884688400, #      utc_end 1993-09-26 01:00:00 (Sun)
  62868967200, #  local_start 1993-03-28 02:00:00 (Sun)
  62884692000, #    local_end 1993-09-26 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62884688400, #    utc_start 1993-09-26 01:00:00 (Sun)
  62900413200, #      utc_end 1994-03-27 01:00:00 (Sun)
  62884688400, #  local_start 1993-09-26 01:00:00 (Sun)
  62900413200, #    local_end 1994-03-27 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62900413200, #    utc_start 1994-03-27 01:00:00 (Sun)
  62916138000, #      utc_end 1994-09-25 01:00:00 (Sun)
  62900416800, #  local_start 1994-03-27 02:00:00 (Sun)
  62916141600, #    local_end 1994-09-25 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62916138000, #    utc_start 1994-09-25 01:00:00 (Sun)
  62931862800, #      utc_end 1995-03-26 01:00:00 (Sun)
  62916138000, #  local_start 1994-09-25 01:00:00 (Sun)
  62931862800, #    local_end 1995-03-26 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62931862800, #    utc_start 1995-03-26 01:00:00 (Sun)
  62947587600, #      utc_end 1995-09-24 01:00:00 (Sun)
  62931866400, #  local_start 1995-03-26 02:00:00 (Sun)
  62947591200, #    local_end 1995-09-24 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62947587600, #    utc_start 1995-09-24 01:00:00 (Sun)
  62963917200, #      utc_end 1996-03-31 01:00:00 (Sun)
  62947587600, #  local_start 1995-09-24 01:00:00 (Sun)
  62963917200, #    local_end 1996-03-31 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62963917200, #    utc_start 1996-03-31 01:00:00 (Sun)
  62982061200, #      utc_end 1996-10-27 01:00:00 (Sun)
  62963920800, #  local_start 1996-03-31 02:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62982061200, #    utc_start 1996-10-27 01:00:00 (Sun)
  62995366800, #      utc_end 1997-03-30 01:00:00 (Sun)
  62982061200, #  local_start 1996-10-27 01:00:00 (Sun)
  62995366800, #    local_end 1997-03-30 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62995366800, #    utc_start 1997-03-30 01:00:00 (Sun)
  63013510800, #      utc_end 1997-10-26 01:00:00 (Sun)
  62995370400, #  local_start 1997-03-30 02:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63013510800, #    utc_start 1997-10-26 01:00:00 (Sun)
  63026816400, #      utc_end 1998-03-29 01:00:00 (Sun)
  63013510800, #  local_start 1997-10-26 01:00:00 (Sun)
  63026816400, #    local_end 1998-03-29 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63026816400, #    utc_start 1998-03-29 01:00:00 (Sun)
  63044960400, #      utc_end 1998-10-25 01:00:00 (Sun)
  63026820000, #  local_start 1998-03-29 02:00:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63044960400, #    utc_start 1998-10-25 01:00:00 (Sun)
  63058266000, #      utc_end 1999-03-28 01:00:00 (Sun)
  63044960400, #  local_start 1998-10-25 01:00:00 (Sun)
  63058266000, #    local_end 1999-03-28 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63058266000, #    utc_start 1999-03-28 01:00:00 (Sun)
  63077014800, #      utc_end 1999-10-31 01:00:00 (Sun)
  63058269600, #  local_start 1999-03-28 02:00:00 (Sun)
  63077018400, #    local_end 1999-10-31 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63077014800, #    utc_start 1999-10-31 01:00:00 (Sun)
  63089715600, #      utc_end 2000-03-26 01:00:00 (Sun)
  63077014800, #  local_start 1999-10-31 01:00:00 (Sun)
  63089715600, #    local_end 2000-03-26 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63089715600, #    utc_start 2000-03-26 01:00:00 (Sun)
  63108464400, #      utc_end 2000-10-29 01:00:00 (Sun)
  63089719200, #  local_start 2000-03-26 02:00:00 (Sun)
  63108468000, #    local_end 2000-10-29 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63108464400, #    utc_start 2000-10-29 01:00:00 (Sun)
  63121165200, #      utc_end 2001-03-25 01:00:00 (Sun)
  63108464400, #  local_start 2000-10-29 01:00:00 (Sun)
  63121165200, #    local_end 2001-03-25 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63121165200, #    utc_start 2001-03-25 01:00:00 (Sun)
  63139914000, #      utc_end 2001-10-28 01:00:00 (Sun)
  63121168800, #  local_start 2001-03-25 02:00:00 (Sun)
  63139917600, #    local_end 2001-10-28 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63139914000, #    utc_start 2001-10-28 01:00:00 (Sun)
  63153219600, #      utc_end 2002-03-31 01:00:00 (Sun)
  63139914000, #  local_start 2001-10-28 01:00:00 (Sun)
  63153219600, #    local_end 2002-03-31 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63153219600, #    utc_start 2002-03-31 01:00:00 (Sun)
  63171363600, #      utc_end 2002-10-27 01:00:00 (Sun)
  63153223200, #  local_start 2002-03-31 02:00:00 (Sun)
  63171367200, #    local_end 2002-10-27 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63171363600, #    utc_start 2002-10-27 01:00:00 (Sun)
  63184669200, #      utc_end 2003-03-30 01:00:00 (Sun)
  63171363600, #  local_start 2002-10-27 01:00:00 (Sun)
  63184669200, #    local_end 2003-03-30 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63184669200, #    utc_start 2003-03-30 01:00:00 (Sun)
  63202813200, #      utc_end 2003-10-26 01:00:00 (Sun)
  63184672800, #  local_start 2003-03-30 02:00:00 (Sun)
  63202816800, #    local_end 2003-10-26 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63202813200, #    utc_start 2003-10-26 01:00:00 (Sun)
  63216118800, #      utc_end 2004-03-28 01:00:00 (Sun)
  63202813200, #  local_start 2003-10-26 01:00:00 (Sun)
  63216118800, #    local_end 2004-03-28 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63216118800, #    utc_start 2004-03-28 01:00:00 (Sun)
  63234867600, #      utc_end 2004-10-31 01:00:00 (Sun)
  63216122400, #  local_start 2004-03-28 02:00:00 (Sun)
  63234871200, #    local_end 2004-10-31 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63234867600, #    utc_start 2004-10-31 01:00:00 (Sun)
  63247568400, #      utc_end 2005-03-27 01:00:00 (Sun)
  63234867600, #  local_start 2004-10-31 01:00:00 (Sun)
  63247568400, #    local_end 2005-03-27 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63247568400, #    utc_start 2005-03-27 01:00:00 (Sun)
  63266317200, #      utc_end 2005-10-30 01:00:00 (Sun)
  63247572000, #  local_start 2005-03-27 02:00:00 (Sun)
  63266320800, #    local_end 2005-10-30 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63266317200, #    utc_start 2005-10-30 01:00:00 (Sun)
  63279018000, #      utc_end 2006-03-26 01:00:00 (Sun)
  63266317200, #  local_start 2005-10-30 01:00:00 (Sun)
  63279018000, #    local_end 2006-03-26 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63279018000, #    utc_start 2006-03-26 01:00:00 (Sun)
  63297766800, #      utc_end 2006-10-29 01:00:00 (Sun)
  63279021600, #  local_start 2006-03-26 02:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63297766800, #    utc_start 2006-10-29 01:00:00 (Sun)
  63310467600, #      utc_end 2007-03-25 01:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63310467600, #    local_end 2007-03-25 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63310467600, #    utc_start 2007-03-25 01:00:00 (Sun)
  63329216400, #      utc_end 2007-10-28 01:00:00 (Sun)
  63310471200, #  local_start 2007-03-25 02:00:00 (Sun)
  63329220000, #    local_end 2007-10-28 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63329216400, #    utc_start 2007-10-28 01:00:00 (Sun)
  63342522000, #      utc_end 2008-03-30 01:00:00 (Sun)
  63329216400, #  local_start 2007-10-28 01:00:00 (Sun)
  63342522000, #    local_end 2008-03-30 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63342522000, #    utc_start 2008-03-30 01:00:00 (Sun)
  63360666000, #      utc_end 2008-10-26 01:00:00 (Sun)
  63342525600, #  local_start 2008-03-30 02:00:00 (Sun)
  63360669600, #    local_end 2008-10-26 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63360666000, #    utc_start 2008-10-26 01:00:00 (Sun)
  63373971600, #      utc_end 2009-03-29 01:00:00 (Sun)
  63360666000, #  local_start 2008-10-26 01:00:00 (Sun)
  63373971600, #    local_end 2009-03-29 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63373971600, #    utc_start 2009-03-29 01:00:00 (Sun)
  63392115600, #      utc_end 2009-10-25 01:00:00 (Sun)
  63373975200, #  local_start 2009-03-29 02:00:00 (Sun)
  63392119200, #    local_end 2009-10-25 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63392115600, #    utc_start 2009-10-25 01:00:00 (Sun)
  63405421200, #      utc_end 2010-03-28 01:00:00 (Sun)
  63392115600, #  local_start 2009-10-25 01:00:00 (Sun)
  63405421200, #    local_end 2010-03-28 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63405421200, #    utc_start 2010-03-28 01:00:00 (Sun)
  63424170000, #      utc_end 2010-10-31 01:00:00 (Sun)
  63405424800, #  local_start 2010-03-28 02:00:00 (Sun)
  63424173600, #    local_end 2010-10-31 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63424170000, #    utc_start 2010-10-31 01:00:00 (Sun)
  63436870800, #      utc_end 2011-03-27 01:00:00 (Sun)
  63424170000, #  local_start 2010-10-31 01:00:00 (Sun)
  63436870800, #    local_end 2011-03-27 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63436870800, #    utc_start 2011-03-27 01:00:00 (Sun)
  63455619600, #      utc_end 2011-10-30 01:00:00 (Sun)
  63436874400, #  local_start 2011-03-27 02:00:00 (Sun)
  63455623200, #    local_end 2011-10-30 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63455619600, #    utc_start 2011-10-30 01:00:00 (Sun)
  63468320400, #      utc_end 2012-03-25 01:00:00 (Sun)
  63455619600, #  local_start 2011-10-30 01:00:00 (Sun)
  63468320400, #    local_end 2012-03-25 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63468320400, #    utc_start 2012-03-25 01:00:00 (Sun)
  63487069200, #      utc_end 2012-10-28 01:00:00 (Sun)
  63468324000, #  local_start 2012-03-25 02:00:00 (Sun)
  63487072800, #    local_end 2012-10-28 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63487069200, #    utc_start 2012-10-28 01:00:00 (Sun)
  63500374800, #      utc_end 2013-03-31 01:00:00 (Sun)
  63487069200, #  local_start 2012-10-28 01:00:00 (Sun)
  63500374800, #    local_end 2013-03-31 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63500374800, #    utc_start 2013-03-31 01:00:00 (Sun)
  63518518800, #      utc_end 2013-10-27 01:00:00 (Sun)
  63500378400, #  local_start 2013-03-31 02:00:00 (Sun)
  63518522400, #    local_end 2013-10-27 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63518518800, #    utc_start 2013-10-27 01:00:00 (Sun)
  63531824400, #      utc_end 2014-03-30 01:00:00 (Sun)
  63518518800, #  local_start 2013-10-27 01:00:00 (Sun)
  63531824400, #    local_end 2014-03-30 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63531824400, #    utc_start 2014-03-30 01:00:00 (Sun)
  63549968400, #      utc_end 2014-10-26 01:00:00 (Sun)
  63531828000, #  local_start 2014-03-30 02:00:00 (Sun)
  63549972000, #    local_end 2014-10-26 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63549968400, #    utc_start 2014-10-26 01:00:00 (Sun)
  63563274000, #      utc_end 2015-03-29 01:00:00 (Sun)
  63549968400, #  local_start 2014-10-26 01:00:00 (Sun)
  63563274000, #    local_end 2015-03-29 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63563274000, #    utc_start 2015-03-29 01:00:00 (Sun)
  63581418000, #      utc_end 2015-10-25 01:00:00 (Sun)
  63563277600, #  local_start 2015-03-29 02:00:00 (Sun)
  63581421600, #    local_end 2015-10-25 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63581418000, #    utc_start 2015-10-25 01:00:00 (Sun)
  63594723600, #      utc_end 2016-03-27 01:00:00 (Sun)
  63581418000, #  local_start 2015-10-25 01:00:00 (Sun)
  63594723600, #    local_end 2016-03-27 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63594723600, #    utc_start 2016-03-27 01:00:00 (Sun)
  63613472400, #      utc_end 2016-10-30 01:00:00 (Sun)
  63594727200, #  local_start 2016-03-27 02:00:00 (Sun)
  63613476000, #    local_end 2016-10-30 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63613472400, #    utc_start 2016-10-30 01:00:00 (Sun)
  63626173200, #      utc_end 2017-03-26 01:00:00 (Sun)
  63613472400, #  local_start 2016-10-30 01:00:00 (Sun)
  63626173200, #    local_end 2017-03-26 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63626173200, #    utc_start 2017-03-26 01:00:00 (Sun)
  63644922000, #      utc_end 2017-10-29 01:00:00 (Sun)
  63626176800, #  local_start 2017-03-26 02:00:00 (Sun)
  63644925600, #    local_end 2017-10-29 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63644922000, #    utc_start 2017-10-29 01:00:00 (Sun)
  63657622800, #      utc_end 2018-03-25 01:00:00 (Sun)
  63644922000, #  local_start 2017-10-29 01:00:00 (Sun)
  63657622800, #    local_end 2018-03-25 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63657622800, #    utc_start 2018-03-25 01:00:00 (Sun)
  63676371600, #      utc_end 2018-10-28 01:00:00 (Sun)
  63657626400, #  local_start 2018-03-25 02:00:00 (Sun)
  63676375200, #    local_end 2018-10-28 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63676371600, #    utc_start 2018-10-28 01:00:00 (Sun)
  63689677200, #      utc_end 2019-03-31 01:00:00 (Sun)
  63676371600, #  local_start 2018-10-28 01:00:00 (Sun)
  63689677200, #    local_end 2019-03-31 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63689677200, #    utc_start 2019-03-31 01:00:00 (Sun)
  63707821200, #      utc_end 2019-10-27 01:00:00 (Sun)
  63689680800, #  local_start 2019-03-31 02:00:00 (Sun)
  63707824800, #    local_end 2019-10-27 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63707821200, #    utc_start 2019-10-27 01:00:00 (Sun)
  63721126800, #      utc_end 2020-03-29 01:00:00 (Sun)
  63707821200, #  local_start 2019-10-27 01:00:00 (Sun)
  63721126800, #    local_end 2020-03-29 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63721126800, #    utc_start 2020-03-29 01:00:00 (Sun)
  63739270800, #      utc_end 2020-10-25 01:00:00 (Sun)
  63721130400, #  local_start 2020-03-29 02:00:00 (Sun)
  63739274400, #    local_end 2020-10-25 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63739270800, #    utc_start 2020-10-25 01:00:00 (Sun)
  63752576400, #      utc_end 2021-03-28 01:00:00 (Sun)
  63739270800, #  local_start 2020-10-25 01:00:00 (Sun)
  63752576400, #    local_end 2021-03-28 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63752576400, #    utc_start 2021-03-28 01:00:00 (Sun)
  63771325200, #      utc_end 2021-10-31 01:00:00 (Sun)
  63752580000, #  local_start 2021-03-28 02:00:00 (Sun)
  63771328800, #    local_end 2021-10-31 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63771325200, #    utc_start 2021-10-31 01:00:00 (Sun)
  63784026000, #      utc_end 2022-03-27 01:00:00 (Sun)
  63771325200, #  local_start 2021-10-31 01:00:00 (Sun)
  63784026000, #    local_end 2022-03-27 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63784026000, #    utc_start 2022-03-27 01:00:00 (Sun)
  63802774800, #      utc_end 2022-10-30 01:00:00 (Sun)
  63784029600, #  local_start 2022-03-27 02:00:00 (Sun)
  63802778400, #    local_end 2022-10-30 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63802774800, #    utc_start 2022-10-30 01:00:00 (Sun)
  63815475600, #      utc_end 2023-03-26 01:00:00 (Sun)
  63802774800, #  local_start 2022-10-30 01:00:00 (Sun)
  63815475600, #    local_end 2023-03-26 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63815475600, #    utc_start 2023-03-26 01:00:00 (Sun)
  63834224400, #      utc_end 2023-10-29 01:00:00 (Sun)
  63815479200, #  local_start 2023-03-26 02:00:00 (Sun)
  63834228000, #    local_end 2023-10-29 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63834224400, #    utc_start 2023-10-29 01:00:00 (Sun)
  63847530000, #      utc_end 2024-03-31 01:00:00 (Sun)
  63834224400, #  local_start 2023-10-29 01:00:00 (Sun)
  63847530000, #    local_end 2024-03-31 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63847530000, #    utc_start 2024-03-31 01:00:00 (Sun)
  63865674000, #      utc_end 2024-10-27 01:00:00 (Sun)
  63847533600, #  local_start 2024-03-31 02:00:00 (Sun)
  63865677600, #    local_end 2024-10-27 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63865674000, #    utc_start 2024-10-27 01:00:00 (Sun)
  63878979600, #      utc_end 2025-03-30 01:00:00 (Sun)
  63865674000, #  local_start 2024-10-27 01:00:00 (Sun)
  63878979600, #    local_end 2025-03-30 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63878979600, #    utc_start 2025-03-30 01:00:00 (Sun)
  63897123600, #      utc_end 2025-10-26 01:00:00 (Sun)
  63878983200, #  local_start 2025-03-30 02:00:00 (Sun)
  63897127200, #    local_end 2025-10-26 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63897123600, #    utc_start 2025-10-26 01:00:00 (Sun)
  63910429200, #      utc_end 2026-03-29 01:00:00 (Sun)
  63897123600, #  local_start 2025-10-26 01:00:00 (Sun)
  63910429200, #    local_end 2026-03-29 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63910429200, #    utc_start 2026-03-29 01:00:00 (Sun)
  63928573200, #      utc_end 2026-10-25 01:00:00 (Sun)
  63910432800, #  local_start 2026-03-29 02:00:00 (Sun)
  63928576800, #    local_end 2026-10-25 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63928573200, #    utc_start 2026-10-25 01:00:00 (Sun)
  63941878800, #      utc_end 2027-03-28 01:00:00 (Sun)
  63928573200, #  local_start 2026-10-25 01:00:00 (Sun)
  63941878800, #    local_end 2027-03-28 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63941878800, #    utc_start 2027-03-28 01:00:00 (Sun)
  63960627600, #      utc_end 2027-10-31 01:00:00 (Sun)
  63941882400, #  local_start 2027-03-28 02:00:00 (Sun)
  63960631200, #    local_end 2027-10-31 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63960627600, #    utc_start 2027-10-31 01:00:00 (Sun)
  63973328400, #      utc_end 2028-03-26 01:00:00 (Sun)
  63960627600, #  local_start 2027-10-31 01:00:00 (Sun)
  63973328400, #    local_end 2028-03-26 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63973328400, #    utc_start 2028-03-26 01:00:00 (Sun)
  63992077200, #      utc_end 2028-10-29 01:00:00 (Sun)
  63973332000, #  local_start 2028-03-26 02:00:00 (Sun)
  63992080800, #    local_end 2028-10-29 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63992077200, #    utc_start 2028-10-29 01:00:00 (Sun)
  64004778000, #      utc_end 2029-03-25 01:00:00 (Sun)
  63992077200, #  local_start 2028-10-29 01:00:00 (Sun)
  64004778000, #    local_end 2029-03-25 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  64004778000, #    utc_start 2029-03-25 01:00:00 (Sun)
  64023526800, #      utc_end 2029-10-28 01:00:00 (Sun)
  64004781600, #  local_start 2029-03-25 02:00:00 (Sun)
  64023530400, #    local_end 2029-10-28 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  64023526800, #    utc_start 2029-10-28 01:00:00 (Sun)
  64036832400, #      utc_end 2030-03-31 01:00:00 (Sun)
  64023526800, #  local_start 2029-10-28 01:00:00 (Sun)
  64036832400, #    local_end 2030-03-31 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  64036832400, #    utc_start 2030-03-31 01:00:00 (Sun)
  64054976400, #      utc_end 2030-10-27 01:00:00 (Sun)
  64036836000, #  local_start 2030-03-31 02:00:00 (Sun)
  64054980000, #    local_end 2030-10-27 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {106}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { 0 }
  
  my $last_observance = bless( {
    'format' => 'WE%sT',
    'gmtoff' => '0:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 724178,
      'local_rd_secs' => 3600,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 724178,
      'utc_rd_secs' => 3600,
      'utc_year' => 1984
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => 0,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 724178,
      'local_rd_secs' => 3600,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 724178,
      'utc_rd_secs' => 3600,
      'utc_year' => 1984
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '1:00u',
      'from' => '1981',
      'in' => 'Mar',
      'letter' => 'S',
      'name' => 'EU',
      'offset_from_std' => 3600,
      'on' => 'lastSun',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '1:00u',
      'from' => '1996',
      'in' => 'Oct',
      'letter' => '',
      'name' => 'EU',
      'offset_from_std' => 0,
      'on' => 'lastSun',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_ATLANTIC_MADEIRA

    $main::fatpacked{"DateTime/TimeZone/Atlantic/Reykjavik.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ATLANTIC_REYKJAVIK';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Atlantic::Reykjavik;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Atlantic::Reykjavik::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60179074080, #      utc_end 1908-01-01 01:28:00 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60179068800, #    local_end 1908-01-01 00:00:00 (Wed)
  -5280,
  0,
  'LMT',
      ],
      [
  60179074080, #    utc_start 1908-01-01 01:28:00 (Wed)
  60467472000, #      utc_end 1917-02-20 00:00:00 (Tue)
  60179070480, #  local_start 1908-01-01 00:28:00 (Wed)
  60467468400, #    local_end 1917-02-19 23:00:00 (Mon)
  -3600,
  0,
  '-01',
      ],
      [
  60467472000, #    utc_start 1917-02-20 00:00:00 (Tue)
  60488470800, #      utc_end 1917-10-21 01:00:00 (Sun)
  60467472000, #  local_start 1917-02-20 00:00:00 (Tue)
  60488470800, #    local_end 1917-10-21 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  60488470800, #    utc_start 1917-10-21 01:00:00 (Sun)
  60499008000, #      utc_end 1918-02-20 00:00:00 (Wed)
  60488467200, #  local_start 1917-10-21 00:00:00 (Sun)
  60499004400, #    local_end 1918-02-19 23:00:00 (Tue)
  -3600,
  0,
  '-01',
      ],
      [
  60499008000, #    utc_start 1918-02-20 00:00:00 (Wed)
  60522253200, #      utc_end 1918-11-16 01:00:00 (Sat)
  60499008000, #  local_start 1918-02-20 00:00:00 (Wed)
  60522253200, #    local_end 1918-11-16 01:00:00 (Sat)
  0,
  1,
  '+00',
      ],
      [
  60522253200, #    utc_start 1918-11-16 01:00:00 (Sat)
  60530544000, #      utc_end 1919-02-20 00:00:00 (Thu)
  60522249600, #  local_start 1918-11-16 00:00:00 (Sat)
  60530540400, #    local_end 1919-02-19 23:00:00 (Wed)
  -3600,
  0,
  '-01',
      ],
      [
  60530544000, #    utc_start 1919-02-20 00:00:00 (Thu)
  60553789200, #      utc_end 1919-11-16 01:00:00 (Sun)
  60530544000, #  local_start 1919-02-20 00:00:00 (Thu)
  60553789200, #    local_end 1919-11-16 01:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  60553789200, #    utc_start 1919-11-16 01:00:00 (Sun)
  60596121600, #      utc_end 1921-03-20 00:00:00 (Sun)
  60553785600, #  local_start 1919-11-16 00:00:00 (Sun)
  60596118000, #    local_end 1921-03-19 23:00:00 (Sat)
  -3600,
  0,
  '-01',
      ],
      [
  60596121600, #    utc_start 1921-03-20 00:00:00 (Sun)
  60604333200, #      utc_end 1921-06-23 01:00:00 (Thu)
  60596121600, #  local_start 1921-03-20 00:00:00 (Sun)
  60604333200, #    local_end 1921-06-23 01:00:00 (Thu)
  0,
  1,
  '+00',
      ],
      [
  60604333200, #    utc_start 1921-06-23 01:00:00 (Thu)
  61167657600, #      utc_end 1939-04-30 00:00:00 (Sun)
  60604329600, #  local_start 1921-06-23 00:00:00 (Thu)
  61167654000, #    local_end 1939-04-29 23:00:00 (Sat)
  -3600,
  0,
  '-01',
      ],
      [
  61167657600, #    utc_start 1939-04-30 00:00:00 (Sun)
  61183389600, #      utc_end 1939-10-29 02:00:00 (Sun)
  61167657600, #  local_start 1939-04-30 00:00:00 (Sun)
  61183389600, #    local_end 1939-10-29 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  61183389600, #    utc_start 1939-10-29 02:00:00 (Sun)
  61193674800, #      utc_end 1940-02-25 03:00:00 (Sun)
  61183386000, #  local_start 1939-10-29 01:00:00 (Sun)
  61193671200, #    local_end 1940-02-25 02:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  61193674800, #    utc_start 1940-02-25 03:00:00 (Sun)
  61215444000, #      utc_end 1940-11-03 02:00:00 (Sun)
  61193674800, #  local_start 1940-02-25 03:00:00 (Sun)
  61215444000, #    local_end 1940-11-03 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  61215444000, #    utc_start 1940-11-03 02:00:00 (Sun)
  61225725600, #      utc_end 1941-03-02 02:00:00 (Sun)
  61215440400, #  local_start 1940-11-03 01:00:00 (Sun)
  61225722000, #    local_end 1941-03-02 01:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  61225725600, #    utc_start 1941-03-02 02:00:00 (Sun)
  61246893600, #      utc_end 1941-11-02 02:00:00 (Sun)
  61225725600, #  local_start 1941-03-02 02:00:00 (Sun)
  61246893600, #    local_end 1941-11-02 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  61246893600, #    utc_start 1941-11-02 02:00:00 (Sun)
  61257780000, #      utc_end 1942-03-08 02:00:00 (Sun)
  61246890000, #  local_start 1941-11-02 01:00:00 (Sun)
  61257776400, #    local_end 1942-03-08 01:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  61257780000, #    utc_start 1942-03-08 02:00:00 (Sun)
  61277738400, #      utc_end 1942-10-25 02:00:00 (Sun)
  61257780000, #  local_start 1942-03-08 02:00:00 (Sun)
  61277738400, #    local_end 1942-10-25 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  61277738400, #    utc_start 1942-10-25 02:00:00 (Sun)
  61289229600, #      utc_end 1943-03-07 02:00:00 (Sun)
  61277734800, #  local_start 1942-10-25 01:00:00 (Sun)
  61289226000, #    local_end 1943-03-07 01:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  61289229600, #    utc_start 1943-03-07 02:00:00 (Sun)
  61309188000, #      utc_end 1943-10-24 02:00:00 (Sun)
  61289229600, #  local_start 1943-03-07 02:00:00 (Sun)
  61309188000, #    local_end 1943-10-24 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  61309188000, #    utc_start 1943-10-24 02:00:00 (Sun)
  61320679200, #      utc_end 1944-03-05 02:00:00 (Sun)
  61309184400, #  local_start 1943-10-24 01:00:00 (Sun)
  61320675600, #    local_end 1944-03-05 01:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  61320679200, #    utc_start 1944-03-05 02:00:00 (Sun)
  61340637600, #      utc_end 1944-10-22 02:00:00 (Sun)
  61320679200, #  local_start 1944-03-05 02:00:00 (Sun)
  61340637600, #    local_end 1944-10-22 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  61340637600, #    utc_start 1944-10-22 02:00:00 (Sun)
  61352128800, #      utc_end 1945-03-04 02:00:00 (Sun)
  61340634000, #  local_start 1944-10-22 01:00:00 (Sun)
  61352125200, #    local_end 1945-03-04 01:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  61352128800, #    utc_start 1945-03-04 02:00:00 (Sun)
  61372692000, #      utc_end 1945-10-28 02:00:00 (Sun)
  61352128800, #  local_start 1945-03-04 02:00:00 (Sun)
  61372692000, #    local_end 1945-10-28 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  61372692000, #    utc_start 1945-10-28 02:00:00 (Sun)
  61383578400, #      utc_end 1946-03-03 02:00:00 (Sun)
  61372688400, #  local_start 1945-10-28 01:00:00 (Sun)
  61383574800, #    local_end 1946-03-03 01:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  61383578400, #    utc_start 1946-03-03 02:00:00 (Sun)
  61404141600, #      utc_end 1946-10-27 02:00:00 (Sun)
  61383578400, #  local_start 1946-03-03 02:00:00 (Sun)
  61404141600, #    local_end 1946-10-27 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  61404141600, #    utc_start 1946-10-27 02:00:00 (Sun)
  61418052000, #      utc_end 1947-04-06 02:00:00 (Sun)
  61404138000, #  local_start 1946-10-27 01:00:00 (Sun)
  61418048400, #    local_end 1947-04-06 01:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  61418052000, #    utc_start 1947-04-06 02:00:00 (Sun)
  61435591200, #      utc_end 1947-10-26 02:00:00 (Sun)
  61418052000, #  local_start 1947-04-06 02:00:00 (Sun)
  61435591200, #    local_end 1947-10-26 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  61435591200, #    utc_start 1947-10-26 02:00:00 (Sun)
  61449501600, #      utc_end 1948-04-04 02:00:00 (Sun)
  61435587600, #  local_start 1947-10-26 01:00:00 (Sun)
  61449498000, #    local_end 1948-04-04 01:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  61449501600, #    utc_start 1948-04-04 02:00:00 (Sun)
  61467040800, #      utc_end 1948-10-24 02:00:00 (Sun)
  61449501600, #  local_start 1948-04-04 02:00:00 (Sun)
  61467040800, #    local_end 1948-10-24 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  61467040800, #    utc_start 1948-10-24 02:00:00 (Sun)
  61480951200, #      utc_end 1949-04-03 02:00:00 (Sun)
  61467037200, #  local_start 1948-10-24 01:00:00 (Sun)
  61480947600, #    local_end 1949-04-03 01:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  61480951200, #    utc_start 1949-04-03 02:00:00 (Sun)
  61499095200, #      utc_end 1949-10-30 02:00:00 (Sun)
  61480951200, #  local_start 1949-04-03 02:00:00 (Sun)
  61499095200, #    local_end 1949-10-30 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  61499095200, #    utc_start 1949-10-30 02:00:00 (Sun)
  61512400800, #      utc_end 1950-04-02 02:00:00 (Sun)
  61499091600, #  local_start 1949-10-30 01:00:00 (Sun)
  61512397200, #    local_end 1950-04-02 01:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  61512400800, #    utc_start 1950-04-02 02:00:00 (Sun)
  61529940000, #      utc_end 1950-10-22 02:00:00 (Sun)
  61512400800, #  local_start 1950-04-02 02:00:00 (Sun)
  61529940000, #    local_end 1950-10-22 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  61529940000, #    utc_start 1950-10-22 02:00:00 (Sun)
  61543850400, #      utc_end 1951-04-01 02:00:00 (Sun)
  61529936400, #  local_start 1950-10-22 01:00:00 (Sun)
  61543846800, #    local_end 1951-04-01 01:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  61543850400, #    utc_start 1951-04-01 02:00:00 (Sun)
  61561994400, #      utc_end 1951-10-28 02:00:00 (Sun)
  61543850400, #  local_start 1951-04-01 02:00:00 (Sun)
  61561994400, #    local_end 1951-10-28 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  61561994400, #    utc_start 1951-10-28 02:00:00 (Sun)
  61575904800, #      utc_end 1952-04-06 02:00:00 (Sun)
  61561990800, #  local_start 1951-10-28 01:00:00 (Sun)
  61575901200, #    local_end 1952-04-06 01:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  61575904800, #    utc_start 1952-04-06 02:00:00 (Sun)
  61593444000, #      utc_end 1952-10-26 02:00:00 (Sun)
  61575904800, #  local_start 1952-04-06 02:00:00 (Sun)
  61593444000, #    local_end 1952-10-26 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  61593444000, #    utc_start 1952-10-26 02:00:00 (Sun)
  61607354400, #      utc_end 1953-04-05 02:00:00 (Sun)
  61593440400, #  local_start 1952-10-26 01:00:00 (Sun)
  61607350800, #    local_end 1953-04-05 01:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  61607354400, #    utc_start 1953-04-05 02:00:00 (Sun)
  61624893600, #      utc_end 1953-10-25 02:00:00 (Sun)
  61607354400, #  local_start 1953-04-05 02:00:00 (Sun)
  61624893600, #    local_end 1953-10-25 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  61624893600, #    utc_start 1953-10-25 02:00:00 (Sun)
  61638804000, #      utc_end 1954-04-04 02:00:00 (Sun)
  61624890000, #  local_start 1953-10-25 01:00:00 (Sun)
  61638800400, #    local_end 1954-04-04 01:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  61638804000, #    utc_start 1954-04-04 02:00:00 (Sun)
  61656343200, #      utc_end 1954-10-24 02:00:00 (Sun)
  61638804000, #  local_start 1954-04-04 02:00:00 (Sun)
  61656343200, #    local_end 1954-10-24 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  61656343200, #    utc_start 1954-10-24 02:00:00 (Sun)
  61670253600, #      utc_end 1955-04-03 02:00:00 (Sun)
  61656339600, #  local_start 1954-10-24 01:00:00 (Sun)
  61670250000, #    local_end 1955-04-03 01:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  61670253600, #    utc_start 1955-04-03 02:00:00 (Sun)
  61687792800, #      utc_end 1955-10-23 02:00:00 (Sun)
  61670253600, #  local_start 1955-04-03 02:00:00 (Sun)
  61687792800, #    local_end 1955-10-23 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  61687792800, #    utc_start 1955-10-23 02:00:00 (Sun)
  61701703200, #      utc_end 1956-04-01 02:00:00 (Sun)
  61687789200, #  local_start 1955-10-23 01:00:00 (Sun)
  61701699600, #    local_end 1956-04-01 01:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  61701703200, #    utc_start 1956-04-01 02:00:00 (Sun)
  61719847200, #      utc_end 1956-10-28 02:00:00 (Sun)
  61701703200, #  local_start 1956-04-01 02:00:00 (Sun)
  61719847200, #    local_end 1956-10-28 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  61719847200, #    utc_start 1956-10-28 02:00:00 (Sun)
  61733757600, #      utc_end 1957-04-07 02:00:00 (Sun)
  61719843600, #  local_start 1956-10-28 01:00:00 (Sun)
  61733754000, #    local_end 1957-04-07 01:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  61733757600, #    utc_start 1957-04-07 02:00:00 (Sun)
  61751296800, #      utc_end 1957-10-27 02:00:00 (Sun)
  61733757600, #  local_start 1957-04-07 02:00:00 (Sun)
  61751296800, #    local_end 1957-10-27 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  61751296800, #    utc_start 1957-10-27 02:00:00 (Sun)
  61765207200, #      utc_end 1958-04-06 02:00:00 (Sun)
  61751293200, #  local_start 1957-10-27 01:00:00 (Sun)
  61765203600, #    local_end 1958-04-06 01:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  61765207200, #    utc_start 1958-04-06 02:00:00 (Sun)
  61782746400, #      utc_end 1958-10-26 02:00:00 (Sun)
  61765207200, #  local_start 1958-04-06 02:00:00 (Sun)
  61782746400, #    local_end 1958-10-26 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  61782746400, #    utc_start 1958-10-26 02:00:00 (Sun)
  61796656800, #      utc_end 1959-04-05 02:00:00 (Sun)
  61782742800, #  local_start 1958-10-26 01:00:00 (Sun)
  61796653200, #    local_end 1959-04-05 01:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  61796656800, #    utc_start 1959-04-05 02:00:00 (Sun)
  61814196000, #      utc_end 1959-10-25 02:00:00 (Sun)
  61796656800, #  local_start 1959-04-05 02:00:00 (Sun)
  61814196000, #    local_end 1959-10-25 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  61814196000, #    utc_start 1959-10-25 02:00:00 (Sun)
  61828106400, #      utc_end 1960-04-03 02:00:00 (Sun)
  61814192400, #  local_start 1959-10-25 01:00:00 (Sun)
  61828102800, #    local_end 1960-04-03 01:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  61828106400, #    utc_start 1960-04-03 02:00:00 (Sun)
  61845645600, #      utc_end 1960-10-23 02:00:00 (Sun)
  61828106400, #  local_start 1960-04-03 02:00:00 (Sun)
  61845645600, #    local_end 1960-10-23 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  61845645600, #    utc_start 1960-10-23 02:00:00 (Sun)
  61859556000, #      utc_end 1961-04-02 02:00:00 (Sun)
  61845642000, #  local_start 1960-10-23 01:00:00 (Sun)
  61859552400, #    local_end 1961-04-02 01:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  61859556000, #    utc_start 1961-04-02 02:00:00 (Sun)
  61877095200, #      utc_end 1961-10-22 02:00:00 (Sun)
  61859556000, #  local_start 1961-04-02 02:00:00 (Sun)
  61877095200, #    local_end 1961-10-22 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  61877095200, #    utc_start 1961-10-22 02:00:00 (Sun)
  61891005600, #      utc_end 1962-04-01 02:00:00 (Sun)
  61877091600, #  local_start 1961-10-22 01:00:00 (Sun)
  61891002000, #    local_end 1962-04-01 01:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  61891005600, #    utc_start 1962-04-01 02:00:00 (Sun)
  61909149600, #      utc_end 1962-10-28 02:00:00 (Sun)
  61891005600, #  local_start 1962-04-01 02:00:00 (Sun)
  61909149600, #    local_end 1962-10-28 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  61909149600, #    utc_start 1962-10-28 02:00:00 (Sun)
  61923060000, #      utc_end 1963-04-07 02:00:00 (Sun)
  61909146000, #  local_start 1962-10-28 01:00:00 (Sun)
  61923056400, #    local_end 1963-04-07 01:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  61923060000, #    utc_start 1963-04-07 02:00:00 (Sun)
  61940599200, #      utc_end 1963-10-27 02:00:00 (Sun)
  61923060000, #  local_start 1963-04-07 02:00:00 (Sun)
  61940599200, #    local_end 1963-10-27 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  61940599200, #    utc_start 1963-10-27 02:00:00 (Sun)
  61954509600, #      utc_end 1964-04-05 02:00:00 (Sun)
  61940595600, #  local_start 1963-10-27 01:00:00 (Sun)
  61954506000, #    local_end 1964-04-05 01:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  61954509600, #    utc_start 1964-04-05 02:00:00 (Sun)
  61972048800, #      utc_end 1964-10-25 02:00:00 (Sun)
  61954509600, #  local_start 1964-04-05 02:00:00 (Sun)
  61972048800, #    local_end 1964-10-25 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  61972048800, #    utc_start 1964-10-25 02:00:00 (Sun)
  61985959200, #      utc_end 1965-04-04 02:00:00 (Sun)
  61972045200, #  local_start 1964-10-25 01:00:00 (Sun)
  61985955600, #    local_end 1965-04-04 01:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  61985959200, #    utc_start 1965-04-04 02:00:00 (Sun)
  62003498400, #      utc_end 1965-10-24 02:00:00 (Sun)
  61985959200, #  local_start 1965-04-04 02:00:00 (Sun)
  62003498400, #    local_end 1965-10-24 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  62003498400, #    utc_start 1965-10-24 02:00:00 (Sun)
  62017408800, #      utc_end 1966-04-03 02:00:00 (Sun)
  62003494800, #  local_start 1965-10-24 01:00:00 (Sun)
  62017405200, #    local_end 1966-04-03 01:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  62017408800, #    utc_start 1966-04-03 02:00:00 (Sun)
  62034948000, #      utc_end 1966-10-23 02:00:00 (Sun)
  62017408800, #  local_start 1966-04-03 02:00:00 (Sun)
  62034948000, #    local_end 1966-10-23 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  62034948000, #    utc_start 1966-10-23 02:00:00 (Sun)
  62048858400, #      utc_end 1967-04-02 02:00:00 (Sun)
  62034944400, #  local_start 1966-10-23 01:00:00 (Sun)
  62048854800, #    local_end 1967-04-02 01:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  62048858400, #    utc_start 1967-04-02 02:00:00 (Sun)
  62067002400, #      utc_end 1967-10-29 02:00:00 (Sun)
  62048858400, #  local_start 1967-04-02 02:00:00 (Sun)
  62067002400, #    local_end 1967-10-29 02:00:00 (Sun)
  0,
  1,
  '+00',
      ],
      [
  62067002400, #    utc_start 1967-10-29 02:00:00 (Sun)
  62080912800, #      utc_end 1968-04-07 02:00:00 (Sun)
  62066998800, #  local_start 1967-10-29 01:00:00 (Sun)
  62080909200, #    local_end 1968-04-07 01:00:00 (Sun)
  -3600,
  0,
  '-01',
      ],
      [
  62080912800, #    utc_start 1968-04-07 02:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #      utc_end
  62080912800, #  local_start 1968-04-07 02:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  0,
  0,
  'GMT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {33}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ATLANTIC_REYKJAVIK

    $main::fatpacked{"DateTime/TimeZone/Atlantic/South_Georgia.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ATLANTIC_SOUTH_GEORGIA';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/southamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Atlantic::South_Georgia;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Atlantic::South_Georgia::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59611170368, #      utc_end 1890-01-01 02:26:08 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59611161600, #    local_end 1890-01-01 00:00:00 (Wed)
  -8768,
  0,
  'LMT',
      ],
      [
  59611170368, #    utc_start 1890-01-01 02:26:08 (Wed)
  DateTime::TimeZone::INFINITY, #      utc_end
  59611163168, #  local_start 1890-01-01 00:26:08 (Wed)
  DateTime::TimeZone::INFINITY, #    local_end
  -7200,
  0,
  '-02',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ATLANTIC_SOUTH_GEORGIA

    $main::fatpacked{"DateTime/TimeZone/Atlantic/Stanley.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_ATLANTIC_STANLEY';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/southamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Atlantic::Stanley;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Atlantic::Stanley::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59611175484, #      utc_end 1890-01-01 03:51:24 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59611161600, #    local_end 1890-01-01 00:00:00 (Wed)
  -13884,
  0,
  'LMT',
      ],
      [
  59611175484, #    utc_start 1890-01-01 03:51:24 (Wed)
  60311447484, #      utc_end 1912-03-12 03:51:24 (Tue)
  59611161600, #  local_start 1890-01-01 00:00:00 (Wed)
  60311433600, #    local_end 1912-03-12 00:00:00 (Tue)
  -13884,
  0,
  'SMT',
      ],
      [
  60311447484, #    utc_start 1912-03-12 03:51:24 (Tue)
  61117473600, #      utc_end 1937-09-26 04:00:00 (Sun)
  60311433084, #  local_start 1912-03-11 23:51:24 (Mon)
  61117459200, #    local_end 1937-09-26 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  61117473600, #    utc_start 1937-09-26 04:00:00 (Sun)
  61132590000, #      utc_end 1938-03-20 03:00:00 (Sun)
  61117462800, #  local_start 1937-09-26 01:00:00 (Sun)
  61132579200, #    local_end 1938-03-20 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61132590000, #    utc_start 1938-03-20 03:00:00 (Sun)
  61148923200, #      utc_end 1938-09-25 04:00:00 (Sun)
  61132575600, #  local_start 1938-03-19 23:00:00 (Sat)
  61148908800, #    local_end 1938-09-25 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  61148923200, #    utc_start 1938-09-25 04:00:00 (Sun)
  61164039600, #      utc_end 1939-03-19 03:00:00 (Sun)
  61148912400, #  local_start 1938-09-25 01:00:00 (Sun)
  61164028800, #    local_end 1939-03-19 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61164039600, #    utc_start 1939-03-19 03:00:00 (Sun)
  61180977600, #      utc_end 1939-10-01 04:00:00 (Sun)
  61164025200, #  local_start 1939-03-18 23:00:00 (Sat)
  61180963200, #    local_end 1939-10-01 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  61180977600, #    utc_start 1939-10-01 04:00:00 (Sun)
  61196094000, #      utc_end 1940-03-24 03:00:00 (Sun)
  61180966800, #  local_start 1939-10-01 01:00:00 (Sun)
  61196083200, #    local_end 1940-03-24 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61196094000, #    utc_start 1940-03-24 03:00:00 (Sun)
  61212427200, #      utc_end 1940-09-29 04:00:00 (Sun)
  61196079600, #  local_start 1940-03-23 23:00:00 (Sat)
  61212412800, #    local_end 1940-09-29 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  61212427200, #    utc_start 1940-09-29 04:00:00 (Sun)
  61227543600, #      utc_end 1941-03-23 03:00:00 (Sun)
  61212416400, #  local_start 1940-09-29 01:00:00 (Sun)
  61227532800, #    local_end 1941-03-23 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61227543600, #    utc_start 1941-03-23 03:00:00 (Sun)
  61243876800, #      utc_end 1941-09-28 04:00:00 (Sun)
  61227529200, #  local_start 1941-03-22 23:00:00 (Sat)
  61243862400, #    local_end 1941-09-28 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  61243876800, #    utc_start 1941-09-28 04:00:00 (Sun)
  61258993200, #      utc_end 1942-03-22 03:00:00 (Sun)
  61243866000, #  local_start 1941-09-28 01:00:00 (Sun)
  61258982400, #    local_end 1942-03-22 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  61258993200, #    utc_start 1942-03-22 03:00:00 (Sun)
  61275326400, #      utc_end 1942-09-27 04:00:00 (Sun)
  61258978800, #  local_start 1942-03-21 23:00:00 (Sat)
  61275312000, #    local_end 1942-09-27 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  61275326400, #    utc_start 1942-09-27 04:00:00 (Sun)
  61283617200, #      utc_end 1943-01-01 03:00:00 (Fri)
  61275315600, #  local_start 1942-09-27 01:00:00 (Sun)
  61283606400, #    local_end 1943-01-01 00:00:00 (Fri)
  -10800,
  1,
  '-03',
      ],
      [
  61283617200, #    utc_start 1943-01-01 03:00:00 (Fri)
  62556292800, #      utc_end 1983-05-01 04:00:00 (Sun)
  61283602800, #  local_start 1942-12-31 23:00:00 (Thu)
  62556278400, #    local_end 1983-05-01 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62556292800, #    utc_start 1983-05-01 04:00:00 (Sun)
  62568990000, #      utc_end 1983-09-25 03:00:00 (Sun)
  62556282000, #  local_start 1983-05-01 01:00:00 (Sun)
  62568979200, #    local_end 1983-09-25 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62568990000, #    utc_start 1983-09-25 03:00:00 (Sun)
  62587735200, #      utc_end 1984-04-29 02:00:00 (Sun)
  62568982800, #  local_start 1983-09-25 01:00:00 (Sun)
  62587728000, #    local_end 1984-04-29 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62587735200, #    utc_start 1984-04-29 02:00:00 (Sun)
  62599834800, #      utc_end 1984-09-16 03:00:00 (Sun)
  62587724400, #  local_start 1984-04-28 23:00:00 (Sat)
  62599824000, #    local_end 1984-09-16 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62599834800, #    utc_start 1984-09-16 03:00:00 (Sun)
  62619184800, #      utc_end 1985-04-28 02:00:00 (Sun)
  62599827600, #  local_start 1984-09-16 01:00:00 (Sun)
  62619177600, #    local_end 1985-04-28 00:00:00 (Sun)
  -7200,
  1,
  '-02',
      ],
      [
  62619184800, #    utc_start 1985-04-28 02:00:00 (Sun)
  62631284400, #      utc_end 1985-09-15 03:00:00 (Sun)
  62619174000, #  local_start 1985-04-27 23:00:00 (Sat)
  62631273600, #    local_end 1985-09-15 00:00:00 (Sun)
  -10800,
  0,
  '-03',
      ],
      [
  62631284400, #    utc_start 1985-09-15 03:00:00 (Sun)
  62650033200, #      utc_end 1986-04-20 03:00:00 (Sun)
  62631273600, #  local_start 1985-09-15 00:00:00 (Sun)
  62650022400, #    local_end 1986-04-20 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62650033200, #    utc_start 1986-04-20 03:00:00 (Sun)
  62662737600, #      utc_end 1986-09-14 04:00:00 (Sun)
  62650018800, #  local_start 1986-04-19 23:00:00 (Sat)
  62662723200, #    local_end 1986-09-14 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62662737600, #    utc_start 1986-09-14 04:00:00 (Sun)
  62681482800, #      utc_end 1987-04-19 03:00:00 (Sun)
  62662726800, #  local_start 1986-09-14 01:00:00 (Sun)
  62681472000, #    local_end 1987-04-19 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62681482800, #    utc_start 1987-04-19 03:00:00 (Sun)
  62694187200, #      utc_end 1987-09-13 04:00:00 (Sun)
  62681468400, #  local_start 1987-04-18 23:00:00 (Sat)
  62694172800, #    local_end 1987-09-13 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62694187200, #    utc_start 1987-09-13 04:00:00 (Sun)
  62712932400, #      utc_end 1988-04-17 03:00:00 (Sun)
  62694176400, #  local_start 1987-09-13 01:00:00 (Sun)
  62712921600, #    local_end 1988-04-17 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62712932400, #    utc_start 1988-04-17 03:00:00 (Sun)
  62725636800, #      utc_end 1988-09-11 04:00:00 (Sun)
  62712918000, #  local_start 1988-04-16 23:00:00 (Sat)
  62725622400, #    local_end 1988-09-11 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62725636800, #    utc_start 1988-09-11 04:00:00 (Sun)
  62744382000, #      utc_end 1989-04-16 03:00:00 (Sun)
  62725626000, #  local_start 1988-09-11 01:00:00 (Sun)
  62744371200, #    local_end 1989-04-16 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62744382000, #    utc_start 1989-04-16 03:00:00 (Sun)
  62757086400, #      utc_end 1989-09-10 04:00:00 (Sun)
  62744367600, #  local_start 1989-04-15 23:00:00 (Sat)
  62757072000, #    local_end 1989-09-10 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62757086400, #    utc_start 1989-09-10 04:00:00 (Sun)
  62776436400, #      utc_end 1990-04-22 03:00:00 (Sun)
  62757075600, #  local_start 1989-09-10 01:00:00 (Sun)
  62776425600, #    local_end 1990-04-22 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62776436400, #    utc_start 1990-04-22 03:00:00 (Sun)
  62788536000, #      utc_end 1990-09-09 04:00:00 (Sun)
  62776422000, #  local_start 1990-04-21 23:00:00 (Sat)
  62788521600, #    local_end 1990-09-09 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62788536000, #    utc_start 1990-09-09 04:00:00 (Sun)
  62807886000, #      utc_end 1991-04-21 03:00:00 (Sun)
  62788525200, #  local_start 1990-09-09 01:00:00 (Sun)
  62807875200, #    local_end 1991-04-21 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62807886000, #    utc_start 1991-04-21 03:00:00 (Sun)
  62820590400, #      utc_end 1991-09-15 04:00:00 (Sun)
  62807871600, #  local_start 1991-04-20 23:00:00 (Sat)
  62820576000, #    local_end 1991-09-15 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62820590400, #    utc_start 1991-09-15 04:00:00 (Sun)
  62839335600, #      utc_end 1992-04-19 03:00:00 (Sun)
  62820579600, #  local_start 1991-09-15 01:00:00 (Sun)
  62839324800, #    local_end 1992-04-19 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62839335600, #    utc_start 1992-04-19 03:00:00 (Sun)
  62852040000, #      utc_end 1992-09-13 04:00:00 (Sun)
  62839321200, #  local_start 1992-04-18 23:00:00 (Sat)
  62852025600, #    local_end 1992-09-13 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62852040000, #    utc_start 1992-09-13 04:00:00 (Sun)
  62870785200, #      utc_end 1993-04-18 03:00:00 (Sun)
  62852029200, #  local_start 1992-09-13 01:00:00 (Sun)
  62870774400, #    local_end 1993-04-18 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62870785200, #    utc_start 1993-04-18 03:00:00 (Sun)
  62883489600, #      utc_end 1993-09-12 04:00:00 (Sun)
  62870770800, #  local_start 1993-04-17 23:00:00 (Sat)
  62883475200, #    local_end 1993-09-12 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62883489600, #    utc_start 1993-09-12 04:00:00 (Sun)
  62902234800, #      utc_end 1994-04-17 03:00:00 (Sun)
  62883478800, #  local_start 1993-09-12 01:00:00 (Sun)
  62902224000, #    local_end 1994-04-17 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62902234800, #    utc_start 1994-04-17 03:00:00 (Sun)
  62914939200, #      utc_end 1994-09-11 04:00:00 (Sun)
  62902220400, #  local_start 1994-04-16 23:00:00 (Sat)
  62914924800, #    local_end 1994-09-11 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62914939200, #    utc_start 1994-09-11 04:00:00 (Sun)
  62933684400, #      utc_end 1995-04-16 03:00:00 (Sun)
  62914928400, #  local_start 1994-09-11 01:00:00 (Sun)
  62933673600, #    local_end 1995-04-16 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62933684400, #    utc_start 1995-04-16 03:00:00 (Sun)
  62946388800, #      utc_end 1995-09-10 04:00:00 (Sun)
  62933670000, #  local_start 1995-04-15 23:00:00 (Sat)
  62946374400, #    local_end 1995-09-10 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62946388800, #    utc_start 1995-09-10 04:00:00 (Sun)
  62965738800, #      utc_end 1996-04-21 03:00:00 (Sun)
  62946378000, #  local_start 1995-09-10 01:00:00 (Sun)
  62965728000, #    local_end 1996-04-21 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62965738800, #    utc_start 1996-04-21 03:00:00 (Sun)
  62978443200, #      utc_end 1996-09-15 04:00:00 (Sun)
  62965724400, #  local_start 1996-04-20 23:00:00 (Sat)
  62978428800, #    local_end 1996-09-15 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  62978443200, #    utc_start 1996-09-15 04:00:00 (Sun)
  62997188400, #      utc_end 1997-04-20 03:00:00 (Sun)
  62978432400, #  local_start 1996-09-15 01:00:00 (Sun)
  62997177600, #    local_end 1997-04-20 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  62997188400, #    utc_start 1997-04-20 03:00:00 (Sun)
  63009892800, #      utc_end 1997-09-14 04:00:00 (Sun)
  62997174000, #  local_start 1997-04-19 23:00:00 (Sat)
  63009878400, #    local_end 1997-09-14 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63009892800, #    utc_start 1997-09-14 04:00:00 (Sun)
  63028638000, #      utc_end 1998-04-19 03:00:00 (Sun)
  63009882000, #  local_start 1997-09-14 01:00:00 (Sun)
  63028627200, #    local_end 1998-04-19 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63028638000, #    utc_start 1998-04-19 03:00:00 (Sun)
  63041342400, #      utc_end 1998-09-13 04:00:00 (Sun)
  63028623600, #  local_start 1998-04-18 23:00:00 (Sat)
  63041328000, #    local_end 1998-09-13 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63041342400, #    utc_start 1998-09-13 04:00:00 (Sun)
  63060087600, #      utc_end 1999-04-18 03:00:00 (Sun)
  63041331600, #  local_start 1998-09-13 01:00:00 (Sun)
  63060076800, #    local_end 1999-04-18 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63060087600, #    utc_start 1999-04-18 03:00:00 (Sun)
  63072792000, #      utc_end 1999-09-12 04:00:00 (Sun)
  63060073200, #  local_start 1999-04-17 23:00:00 (Sat)
  63072777600, #    local_end 1999-09-12 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63072792000, #    utc_start 1999-09-12 04:00:00 (Sun)
  63091537200, #      utc_end 2000-04-16 03:00:00 (Sun)
  63072781200, #  local_start 1999-09-12 01:00:00 (Sun)
  63091526400, #    local_end 2000-04-16 00:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63091537200, #    utc_start 2000-04-16 03:00:00 (Sun)
  63104241600, #      utc_end 2000-09-10 04:00:00 (Sun)
  63091522800, #  local_start 2000-04-15 23:00:00 (Sat)
  63104227200, #    local_end 2000-09-10 00:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63104241600, #    utc_start 2000-09-10 04:00:00 (Sun)
  63122994000, #      utc_end 2001-04-15 05:00:00 (Sun)
  63104230800, #  local_start 2000-09-10 01:00:00 (Sun)
  63122983200, #    local_end 2001-04-15 02:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63122994000, #    utc_start 2001-04-15 05:00:00 (Sun)
  63135093600, #      utc_end 2001-09-02 06:00:00 (Sun)
  63122979600, #  local_start 2001-04-15 01:00:00 (Sun)
  63135079200, #    local_end 2001-09-02 02:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63135093600, #    utc_start 2001-09-02 06:00:00 (Sun)
  63155048400, #      utc_end 2002-04-21 05:00:00 (Sun)
  63135082800, #  local_start 2001-09-02 03:00:00 (Sun)
  63155037600, #    local_end 2002-04-21 02:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63155048400, #    utc_start 2002-04-21 05:00:00 (Sun)
  63166543200, #      utc_end 2002-09-01 06:00:00 (Sun)
  63155034000, #  local_start 2002-04-21 01:00:00 (Sun)
  63166528800, #    local_end 2002-09-01 02:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63166543200, #    utc_start 2002-09-01 06:00:00 (Sun)
  63186498000, #      utc_end 2003-04-20 05:00:00 (Sun)
  63166532400, #  local_start 2002-09-01 03:00:00 (Sun)
  63186487200, #    local_end 2003-04-20 02:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63186498000, #    utc_start 2003-04-20 05:00:00 (Sun)
  63198597600, #      utc_end 2003-09-07 06:00:00 (Sun)
  63186483600, #  local_start 2003-04-20 01:00:00 (Sun)
  63198583200, #    local_end 2003-09-07 02:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63198597600, #    utc_start 2003-09-07 06:00:00 (Sun)
  63217947600, #      utc_end 2004-04-18 05:00:00 (Sun)
  63198586800, #  local_start 2003-09-07 03:00:00 (Sun)
  63217936800, #    local_end 2004-04-18 02:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63217947600, #    utc_start 2004-04-18 05:00:00 (Sun)
  63230047200, #      utc_end 2004-09-05 06:00:00 (Sun)
  63217933200, #  local_start 2004-04-18 01:00:00 (Sun)
  63230032800, #    local_end 2004-09-05 02:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63230047200, #    utc_start 2004-09-05 06:00:00 (Sun)
  63249397200, #      utc_end 2005-04-17 05:00:00 (Sun)
  63230036400, #  local_start 2004-09-05 03:00:00 (Sun)
  63249386400, #    local_end 2005-04-17 02:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63249397200, #    utc_start 2005-04-17 05:00:00 (Sun)
  63261496800, #      utc_end 2005-09-04 06:00:00 (Sun)
  63249382800, #  local_start 2005-04-17 01:00:00 (Sun)
  63261482400, #    local_end 2005-09-04 02:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63261496800, #    utc_start 2005-09-04 06:00:00 (Sun)
  63280846800, #      utc_end 2006-04-16 05:00:00 (Sun)
  63261486000, #  local_start 2005-09-04 03:00:00 (Sun)
  63280836000, #    local_end 2006-04-16 02:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63280846800, #    utc_start 2006-04-16 05:00:00 (Sun)
  63292946400, #      utc_end 2006-09-03 06:00:00 (Sun)
  63280832400, #  local_start 2006-04-16 01:00:00 (Sun)
  63292932000, #    local_end 2006-09-03 02:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63292946400, #    utc_start 2006-09-03 06:00:00 (Sun)
  63312296400, #      utc_end 2007-04-15 05:00:00 (Sun)
  63292935600, #  local_start 2006-09-03 03:00:00 (Sun)
  63312285600, #    local_end 2007-04-15 02:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63312296400, #    utc_start 2007-04-15 05:00:00 (Sun)
  63324396000, #      utc_end 2007-09-02 06:00:00 (Sun)
  63312282000, #  local_start 2007-04-15 01:00:00 (Sun)
  63324381600, #    local_end 2007-09-02 02:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63324396000, #    utc_start 2007-09-02 06:00:00 (Sun)
  63344350800, #      utc_end 2008-04-20 05:00:00 (Sun)
  63324385200, #  local_start 2007-09-02 03:00:00 (Sun)
  63344340000, #    local_end 2008-04-20 02:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63344350800, #    utc_start 2008-04-20 05:00:00 (Sun)
  63356450400, #      utc_end 2008-09-07 06:00:00 (Sun)
  63344336400, #  local_start 2008-04-20 01:00:00 (Sun)
  63356436000, #    local_end 2008-09-07 02:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63356450400, #    utc_start 2008-09-07 06:00:00 (Sun)
  63375800400, #      utc_end 2009-04-19 05:00:00 (Sun)
  63356439600, #  local_start 2008-09-07 03:00:00 (Sun)
  63375789600, #    local_end 2009-04-19 02:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63375800400, #    utc_start 2009-04-19 05:00:00 (Sun)
  63387900000, #      utc_end 2009-09-06 06:00:00 (Sun)
  63375786000, #  local_start 2009-04-19 01:00:00 (Sun)
  63387885600, #    local_end 2009-09-06 02:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63387900000, #    utc_start 2009-09-06 06:00:00 (Sun)
  63407250000, #      utc_end 2010-04-18 05:00:00 (Sun)
  63387889200, #  local_start 2009-09-06 03:00:00 (Sun)
  63407239200, #    local_end 2010-04-18 02:00:00 (Sun)
  -10800,
  1,
  '-03',
      ],
      [
  63407250000, #    utc_start 2010-04-18 05:00:00 (Sun)
  63419349600, #      utc_end 2010-09-05 06:00:00 (Sun)
  63407235600, #  local_start 2010-04-18 01:00:00 (Sun)
  63419335200, #    local_end 2010-09-05 02:00:00 (Sun)
  -14400,
  0,
  '-04',
      ],
      [
  63419349600, #    utc_start 2010-09-05 06:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #      utc_end
  63419338800, #  local_start 2010-09-05 03:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  -10800,
  0,
  '-03',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {33}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_ATLANTIC_STANLEY

    $main::fatpacked{"DateTime/TimeZone/Australia/Adelaide.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AUSTRALIA_ADELAIDE';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/australasia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Australia::Adelaide;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Australia::Adelaide::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59771573140, #      utc_end 1895-01-31 14:45:40 (Thu)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59771606400, #    local_end 1895-02-01 00:00:00 (Fri)
  33260,
  0,
  'LMT',
      ],
      [
  59771573140, #    utc_start 1895-01-31 14:45:40 (Thu)
  59905494000, #      utc_end 1899-04-30 15:00:00 (Sun)
  59771605540, #  local_start 1895-01-31 23:45:40 (Thu)
  59905526400, #    local_end 1899-05-01 00:00:00 (Mon)
  32400,
  0,
  'ACST',
      ],
      [
  59905494000, #    utc_start 1899-04-30 15:00:00 (Sun)
  60463117860, #      utc_end 1916-12-31 14:31:00 (Sun)
  59905528200, #  local_start 1899-05-01 00:30:00 (Mon)
  60463152060, #    local_end 1917-01-01 00:01:00 (Mon)
  34200,
  0,
  'ACST',
      ],
      [
  60463117860, #    utc_start 1916-12-31 14:31:00 (Sun)
  60470292600, #      utc_end 1917-03-24 15:30:00 (Sat)
  60463155660, #  local_start 1917-01-01 01:01:00 (Mon)
  60470330400, #    local_end 1917-03-25 02:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  60470292600, #    utc_start 1917-03-24 15:30:00 (Sat)
  61252043400, #      utc_end 1941-12-31 16:30:00 (Wed)
  60470326800, #  local_start 1917-03-25 01:00:00 (Sun)
  61252077600, #    local_end 1942-01-01 02:00:00 (Thu)
  34200,
  0,
  'ACST',
      ],
      [
  61252043400, #    utc_start 1941-12-31 16:30:00 (Wed)
  61259556600, #      utc_end 1942-03-28 15:30:00 (Sat)
  61252081200, #  local_start 1942-01-01 03:00:00 (Thu)
  61259594400, #    local_end 1942-03-29 02:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  61259556600, #    utc_start 1942-03-28 15:30:00 (Sat)
  61275285000, #      utc_end 1942-09-26 16:30:00 (Sat)
  61259590800, #  local_start 1942-03-29 01:00:00 (Sun)
  61275319200, #    local_end 1942-09-27 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  61275285000, #    utc_start 1942-09-26 16:30:00 (Sat)
  61291006200, #      utc_end 1943-03-27 15:30:00 (Sat)
  61275322800, #  local_start 1942-09-27 03:00:00 (Sun)
  61291044000, #    local_end 1943-03-28 02:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  61291006200, #    utc_start 1943-03-27 15:30:00 (Sat)
  61307339400, #      utc_end 1943-10-02 16:30:00 (Sat)
  61291040400, #  local_start 1943-03-28 01:00:00 (Sun)
  61307373600, #    local_end 1943-10-03 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  61307339400, #    utc_start 1943-10-02 16:30:00 (Sat)
  61322455800, #      utc_end 1944-03-25 15:30:00 (Sat)
  61307377200, #  local_start 1943-10-03 03:00:00 (Sun)
  61322493600, #    local_end 1944-03-26 02:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  61322455800, #    utc_start 1944-03-25 15:30:00 (Sat)
  62167185000, #      utc_end 1970-12-31 14:30:00 (Thu)
  61322490000, #  local_start 1944-03-26 01:00:00 (Sun)
  62167219200, #    local_end 1971-01-01 00:00:00 (Fri)
  34200,
  0,
  'ACST',
      ],
      [
  62167185000, #    utc_start 1970-12-31 14:30:00 (Thu)
  62193371400, #      utc_end 1971-10-30 16:30:00 (Sat)
  62167219200, #  local_start 1971-01-01 00:00:00 (Fri)
  62193405600, #    local_end 1971-10-31 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  62193371400, #    utc_start 1971-10-30 16:30:00 (Sat)
  62203653000, #      utc_end 1972-02-26 16:30:00 (Sat)
  62193409200, #  local_start 1971-10-31 03:00:00 (Sun)
  62203690800, #    local_end 1972-02-27 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  62203653000, #    utc_start 1972-02-26 16:30:00 (Sat)
  62224821000, #      utc_end 1972-10-28 16:30:00 (Sat)
  62203687200, #  local_start 1972-02-27 02:00:00 (Sun)
  62224855200, #    local_end 1972-10-29 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  62224821000, #    utc_start 1972-10-28 16:30:00 (Sat)
  62235707400, #      utc_end 1973-03-03 16:30:00 (Sat)
  62224858800, #  local_start 1972-10-29 03:00:00 (Sun)
  62235745200, #    local_end 1973-03-04 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  62235707400, #    utc_start 1973-03-03 16:30:00 (Sat)
  62256270600, #      utc_end 1973-10-27 16:30:00 (Sat)
  62235741600, #  local_start 1973-03-04 02:00:00 (Sun)
  62256304800, #    local_end 1973-10-28 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  62256270600, #    utc_start 1973-10-27 16:30:00 (Sat)
  62267157000, #      utc_end 1974-03-02 16:30:00 (Sat)
  62256308400, #  local_start 1973-10-28 03:00:00 (Sun)
  62267194800, #    local_end 1974-03-03 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  62267157000, #    utc_start 1974-03-02 16:30:00 (Sat)
  62287720200, #      utc_end 1974-10-26 16:30:00 (Sat)
  62267191200, #  local_start 1974-03-03 02:00:00 (Sun)
  62287754400, #    local_end 1974-10-27 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  62287720200, #    utc_start 1974-10-26 16:30:00 (Sat)
  62298606600, #      utc_end 1975-03-01 16:30:00 (Sat)
  62287758000, #  local_start 1974-10-27 03:00:00 (Sun)
  62298644400, #    local_end 1975-03-02 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  62298606600, #    utc_start 1975-03-01 16:30:00 (Sat)
  62319169800, #      utc_end 1975-10-25 16:30:00 (Sat)
  62298640800, #  local_start 1975-03-02 02:00:00 (Sun)
  62319204000, #    local_end 1975-10-26 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  62319169800, #    utc_start 1975-10-25 16:30:00 (Sat)
  62330661000, #      utc_end 1976-03-06 16:30:00 (Sat)
  62319207600, #  local_start 1975-10-26 03:00:00 (Sun)
  62330698800, #    local_end 1976-03-07 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  62330661000, #    utc_start 1976-03-06 16:30:00 (Sat)
  62351224200, #      utc_end 1976-10-30 16:30:00 (Sat)
  62330695200, #  local_start 1976-03-07 02:00:00 (Sun)
  62351258400, #    local_end 1976-10-31 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  62351224200, #    utc_start 1976-10-30 16:30:00 (Sat)
  62362110600, #      utc_end 1977-03-05 16:30:00 (Sat)
  62351262000, #  local_start 1976-10-31 03:00:00 (Sun)
  62362148400, #    local_end 1977-03-06 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  62362110600, #    utc_start 1977-03-05 16:30:00 (Sat)
  62382673800, #      utc_end 1977-10-29 16:30:00 (Sat)
  62362144800, #  local_start 1977-03-06 02:00:00 (Sun)
  62382708000, #    local_end 1977-10-30 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  62382673800, #    utc_start 1977-10-29 16:30:00 (Sat)
  62393560200, #      utc_end 1978-03-04 16:30:00 (Sat)
  62382711600, #  local_start 1977-10-30 03:00:00 (Sun)
  62393598000, #    local_end 1978-03-05 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  62393560200, #    utc_start 1978-03-04 16:30:00 (Sat)
  62414123400, #      utc_end 1978-10-28 16:30:00 (Sat)
  62393594400, #  local_start 1978-03-05 02:00:00 (Sun)
  62414157600, #    local_end 1978-10-29 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  62414123400, #    utc_start 1978-10-28 16:30:00 (Sat)
  62425009800, #      utc_end 1979-03-03 16:30:00 (Sat)
  62414161200, #  local_start 1978-10-29 03:00:00 (Sun)
  62425047600, #    local_end 1979-03-04 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  62425009800, #    utc_start 1979-03-03 16:30:00 (Sat)
  62445573000, #      utc_end 1979-10-27 16:30:00 (Sat)
  62425044000, #  local_start 1979-03-04 02:00:00 (Sun)
  62445607200, #    local_end 1979-10-28 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  62445573000, #    utc_start 1979-10-27 16:30:00 (Sat)
  62456459400, #      utc_end 1980-03-01 16:30:00 (Sat)
  62445610800, #  local_start 1979-10-28 03:00:00 (Sun)
  62456497200, #    local_end 1980-03-02 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  62456459400, #    utc_start 1980-03-01 16:30:00 (Sat)
  62477022600, #      utc_end 1980-10-25 16:30:00 (Sat)
  62456493600, #  local_start 1980-03-02 02:00:00 (Sun)
  62477056800, #    local_end 1980-10-26 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  62477022600, #    utc_start 1980-10-25 16:30:00 (Sat)
  62487909000, #      utc_end 1981-02-28 16:30:00 (Sat)
  62477060400, #  local_start 1980-10-26 03:00:00 (Sun)
  62487946800, #    local_end 1981-03-01 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  62487909000, #    utc_start 1981-02-28 16:30:00 (Sat)
  62508472200, #      utc_end 1981-10-24 16:30:00 (Sat)
  62487943200, #  local_start 1981-03-01 02:00:00 (Sun)
  62508506400, #    local_end 1981-10-25 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  62508472200, #    utc_start 1981-10-24 16:30:00 (Sat)
  62519963400, #      utc_end 1982-03-06 16:30:00 (Sat)
  62508510000, #  local_start 1981-10-25 03:00:00 (Sun)
  62520001200, #    local_end 1982-03-07 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  62519963400, #    utc_start 1982-03-06 16:30:00 (Sat)
  62540526600, #      utc_end 1982-10-30 16:30:00 (Sat)
  62519997600, #  local_start 1982-03-07 02:00:00 (Sun)
  62540560800, #    local_end 1982-10-31 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  62540526600, #    utc_start 1982-10-30 16:30:00 (Sat)
  62551413000, #      utc_end 1983-03-05 16:30:00 (Sat)
  62540564400, #  local_start 1982-10-31 03:00:00 (Sun)
  62551450800, #    local_end 1983-03-06 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  62551413000, #    utc_start 1983-03-05 16:30:00 (Sat)
  62571976200, #      utc_end 1983-10-29 16:30:00 (Sat)
  62551447200, #  local_start 1983-03-06 02:00:00 (Sun)
  62572010400, #    local_end 1983-10-30 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  62571976200, #    utc_start 1983-10-29 16:30:00 (Sat)
  62582862600, #      utc_end 1984-03-03 16:30:00 (Sat)
  62572014000, #  local_start 1983-10-30 03:00:00 (Sun)
  62582900400, #    local_end 1984-03-04 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  62582862600, #    utc_start 1984-03-03 16:30:00 (Sat)
  62603425800, #      utc_end 1984-10-27 16:30:00 (Sat)
  62582896800, #  local_start 1984-03-04 02:00:00 (Sun)
  62603460000, #    local_end 1984-10-28 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  62603425800, #    utc_start 1984-10-27 16:30:00 (Sat)
  62614312200, #      utc_end 1985-03-02 16:30:00 (Sat)
  62603463600, #  local_start 1984-10-28 03:00:00 (Sun)
  62614350000, #    local_end 1985-03-03 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  62614312200, #    utc_start 1985-03-02 16:30:00 (Sat)
  62634875400, #      utc_end 1985-10-26 16:30:00 (Sat)
  62614346400, #  local_start 1985-03-03 02:00:00 (Sun)
  62634909600, #    local_end 1985-10-27 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  62634875400, #    utc_start 1985-10-26 16:30:00 (Sat)
  62646971400, #      utc_end 1986-03-15 16:30:00 (Sat)
  62634913200, #  local_start 1985-10-27 03:00:00 (Sun)
  62647009200, #    local_end 1986-03-16 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  62646971400, #    utc_start 1986-03-15 16:30:00 (Sat)
  62665720200, #      utc_end 1986-10-18 16:30:00 (Sat)
  62647005600, #  local_start 1986-03-16 02:00:00 (Sun)
  62665754400, #    local_end 1986-10-19 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  62665720200, #    utc_start 1986-10-18 16:30:00 (Sat)
  62678421000, #      utc_end 1987-03-14 16:30:00 (Sat)
  62665758000, #  local_start 1986-10-19 03:00:00 (Sun)
  62678458800, #    local_end 1987-03-15 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  62678421000, #    utc_start 1987-03-14 16:30:00 (Sat)
  62697774600, #      utc_end 1987-10-24 16:30:00 (Sat)
  62678455200, #  local_start 1987-03-15 02:00:00 (Sun)
  62697808800, #    local_end 1987-10-25 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  62697774600, #    utc_start 1987-10-24 16:30:00 (Sat)
  62710475400, #      utc_end 1988-03-19 16:30:00 (Sat)
  62697812400, #  local_start 1987-10-25 03:00:00 (Sun)
  62710513200, #    local_end 1988-03-20 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  62710475400, #    utc_start 1988-03-19 16:30:00 (Sat)
  62729829000, #      utc_end 1988-10-29 16:30:00 (Sat)
  62710509600, #  local_start 1988-03-20 02:00:00 (Sun)
  62729863200, #    local_end 1988-10-30 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  62729829000, #    utc_start 1988-10-29 16:30:00 (Sat)
  62741925000, #      utc_end 1989-03-18 16:30:00 (Sat)
  62729866800, #  local_start 1988-10-30 03:00:00 (Sun)
  62741962800, #    local_end 1989-03-19 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  62741925000, #    utc_start 1989-03-18 16:30:00 (Sat)
  62761278600, #      utc_end 1989-10-28 16:30:00 (Sat)
  62741959200, #  local_start 1989-03-19 02:00:00 (Sun)
  62761312800, #    local_end 1989-10-29 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  62761278600, #    utc_start 1989-10-28 16:30:00 (Sat)
  62773374600, #      utc_end 1990-03-17 16:30:00 (Sat)
  62761316400, #  local_start 1989-10-29 03:00:00 (Sun)
  62773412400, #    local_end 1990-03-18 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  62773374600, #    utc_start 1990-03-17 16:30:00 (Sat)
  62792728200, #      utc_end 1990-10-27 16:30:00 (Sat)
  62773408800, #  local_start 1990-03-18 02:00:00 (Sun)
  62792762400, #    local_end 1990-10-28 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  62792728200, #    utc_start 1990-10-27 16:30:00 (Sat)
  62803614600, #      utc_end 1991-03-02 16:30:00 (Sat)
  62792766000, #  local_start 1990-10-28 03:00:00 (Sun)
  62803652400, #    local_end 1991-03-03 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  62803614600, #    utc_start 1991-03-02 16:30:00 (Sat)
  62824177800, #      utc_end 1991-10-26 16:30:00 (Sat)
  62803648800, #  local_start 1991-03-03 02:00:00 (Sun)
  62824212000, #    local_end 1991-10-27 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  62824177800, #    utc_start 1991-10-26 16:30:00 (Sat)
  62836878600, #      utc_end 1992-03-21 16:30:00 (Sat)
  62824215600, #  local_start 1991-10-27 03:00:00 (Sun)
  62836916400, #    local_end 1992-03-22 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  62836878600, #    utc_start 1992-03-21 16:30:00 (Sat)
  62855627400, #      utc_end 1992-10-24 16:30:00 (Sat)
  62836912800, #  local_start 1992-03-22 02:00:00 (Sun)
  62855661600, #    local_end 1992-10-25 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  62855627400, #    utc_start 1992-10-24 16:30:00 (Sat)
  62867118600, #      utc_end 1993-03-06 16:30:00 (Sat)
  62855665200, #  local_start 1992-10-25 03:00:00 (Sun)
  62867156400, #    local_end 1993-03-07 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  62867118600, #    utc_start 1993-03-06 16:30:00 (Sat)
  62887681800, #      utc_end 1993-10-30 16:30:00 (Sat)
  62867152800, #  local_start 1993-03-07 02:00:00 (Sun)
  62887716000, #    local_end 1993-10-31 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  62887681800, #    utc_start 1993-10-30 16:30:00 (Sat)
  62899777800, #      utc_end 1994-03-19 16:30:00 (Sat)
  62887719600, #  local_start 1993-10-31 03:00:00 (Sun)
  62899815600, #    local_end 1994-03-20 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  62899777800, #    utc_start 1994-03-19 16:30:00 (Sat)
  62919131400, #      utc_end 1994-10-29 16:30:00 (Sat)
  62899812000, #  local_start 1994-03-20 02:00:00 (Sun)
  62919165600, #    local_end 1994-10-30 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  62919131400, #    utc_start 1994-10-29 16:30:00 (Sat)
  62931832200, #      utc_end 1995-03-25 16:30:00 (Sat)
  62919169200, #  local_start 1994-10-30 03:00:00 (Sun)
  62931870000, #    local_end 1995-03-26 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  62931832200, #    utc_start 1995-03-25 16:30:00 (Sat)
  62950581000, #      utc_end 1995-10-28 16:30:00 (Sat)
  62931866400, #  local_start 1995-03-26 02:00:00 (Sun)
  62950615200, #    local_end 1995-10-29 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  62950581000, #    utc_start 1995-10-28 16:30:00 (Sat)
  62963886600, #      utc_end 1996-03-30 16:30:00 (Sat)
  62950618800, #  local_start 1995-10-29 03:00:00 (Sun)
  62963924400, #    local_end 1996-03-31 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  62963886600, #    utc_start 1996-03-30 16:30:00 (Sat)
  62982030600, #      utc_end 1996-10-26 16:30:00 (Sat)
  62963920800, #  local_start 1996-03-31 02:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  62982030600, #    utc_start 1996-10-26 16:30:00 (Sat)
  62995336200, #      utc_end 1997-03-29 16:30:00 (Sat)
  62982068400, #  local_start 1996-10-27 03:00:00 (Sun)
  62995374000, #    local_end 1997-03-30 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  62995336200, #    utc_start 1997-03-29 16:30:00 (Sat)
  63013480200, #      utc_end 1997-10-25 16:30:00 (Sat)
  62995370400, #  local_start 1997-03-30 02:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  63013480200, #    utc_start 1997-10-25 16:30:00 (Sat)
  63026785800, #      utc_end 1998-03-28 16:30:00 (Sat)
  63013518000, #  local_start 1997-10-26 03:00:00 (Sun)
  63026823600, #    local_end 1998-03-29 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  63026785800, #    utc_start 1998-03-28 16:30:00 (Sat)
  63044929800, #      utc_end 1998-10-24 16:30:00 (Sat)
  63026820000, #  local_start 1998-03-29 02:00:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  63044929800, #    utc_start 1998-10-24 16:30:00 (Sat)
  63058235400, #      utc_end 1999-03-27 16:30:00 (Sat)
  63044967600, #  local_start 1998-10-25 03:00:00 (Sun)
  63058273200, #    local_end 1999-03-28 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  63058235400, #    utc_start 1999-03-27 16:30:00 (Sat)
  63076984200, #      utc_end 1999-10-30 16:30:00 (Sat)
  63058269600, #  local_start 1999-03-28 02:00:00 (Sun)
  63077018400, #    local_end 1999-10-31 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  63076984200, #    utc_start 1999-10-30 16:30:00 (Sat)
  63089685000, #      utc_end 2000-03-25 16:30:00 (Sat)
  63077022000, #  local_start 1999-10-31 03:00:00 (Sun)
  63089722800, #    local_end 2000-03-26 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  63089685000, #    utc_start 2000-03-25 16:30:00 (Sat)
  63108433800, #      utc_end 2000-10-28 16:30:00 (Sat)
  63089719200, #  local_start 2000-03-26 02:00:00 (Sun)
  63108468000, #    local_end 2000-10-29 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  63108433800, #    utc_start 2000-10-28 16:30:00 (Sat)
  63121134600, #      utc_end 2001-03-24 16:30:00 (Sat)
  63108471600, #  local_start 2000-10-29 03:00:00 (Sun)
  63121172400, #    local_end 2001-03-25 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  63121134600, #    utc_start 2001-03-24 16:30:00 (Sat)
  63139883400, #      utc_end 2001-10-27 16:30:00 (Sat)
  63121168800, #  local_start 2001-03-25 02:00:00 (Sun)
  63139917600, #    local_end 2001-10-28 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  63139883400, #    utc_start 2001-10-27 16:30:00 (Sat)
  63153189000, #      utc_end 2002-03-30 16:30:00 (Sat)
  63139921200, #  local_start 2001-10-28 03:00:00 (Sun)
  63153226800, #    local_end 2002-03-31 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  63153189000, #    utc_start 2002-03-30 16:30:00 (Sat)
  63171333000, #      utc_end 2002-10-26 16:30:00 (Sat)
  63153223200, #  local_start 2002-03-31 02:00:00 (Sun)
  63171367200, #    local_end 2002-10-27 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  63171333000, #    utc_start 2002-10-26 16:30:00 (Sat)
  63184638600, #      utc_end 2003-03-29 16:30:00 (Sat)
  63171370800, #  local_start 2002-10-27 03:00:00 (Sun)
  63184676400, #    local_end 2003-03-30 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  63184638600, #    utc_start 2003-03-29 16:30:00 (Sat)
  63202782600, #      utc_end 2003-10-25 16:30:00 (Sat)
  63184672800, #  local_start 2003-03-30 02:00:00 (Sun)
  63202816800, #    local_end 2003-10-26 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  63202782600, #    utc_start 2003-10-25 16:30:00 (Sat)
  63216088200, #      utc_end 2004-03-27 16:30:00 (Sat)
  63202820400, #  local_start 2003-10-26 03:00:00 (Sun)
  63216126000, #    local_end 2004-03-28 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  63216088200, #    utc_start 2004-03-27 16:30:00 (Sat)
  63234837000, #      utc_end 2004-10-30 16:30:00 (Sat)
  63216122400, #  local_start 2004-03-28 02:00:00 (Sun)
  63234871200, #    local_end 2004-10-31 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  63234837000, #    utc_start 2004-10-30 16:30:00 (Sat)
  63247537800, #      utc_end 2005-03-26 16:30:00 (Sat)
  63234874800, #  local_start 2004-10-31 03:00:00 (Sun)
  63247575600, #    local_end 2005-03-27 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  63247537800, #    utc_start 2005-03-26 16:30:00 (Sat)
  63266286600, #      utc_end 2005-10-29 16:30:00 (Sat)
  63247572000, #  local_start 2005-03-27 02:00:00 (Sun)
  63266320800, #    local_end 2005-10-30 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  63266286600, #    utc_start 2005-10-29 16:30:00 (Sat)
  63279592200, #      utc_end 2006-04-01 16:30:00 (Sat)
  63266324400, #  local_start 2005-10-30 03:00:00 (Sun)
  63279630000, #    local_end 2006-04-02 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  63279592200, #    utc_start 2006-04-01 16:30:00 (Sat)
  63297736200, #      utc_end 2006-10-28 16:30:00 (Sat)
  63279626400, #  local_start 2006-04-02 02:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  63297736200, #    utc_start 2006-10-28 16:30:00 (Sat)
  63310437000, #      utc_end 2007-03-24 16:30:00 (Sat)
  63297774000, #  local_start 2006-10-29 03:00:00 (Sun)
  63310474800, #    local_end 2007-03-25 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  63310437000, #    utc_start 2007-03-24 16:30:00 (Sat)
  63329185800, #      utc_end 2007-10-27 16:30:00 (Sat)
  63310471200, #  local_start 2007-03-25 02:00:00 (Sun)
  63329220000, #    local_end 2007-10-28 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  63329185800, #    utc_start 2007-10-27 16:30:00 (Sat)
  63343096200, #      utc_end 2008-04-05 16:30:00 (Sat)
  63329223600, #  local_start 2007-10-28 03:00:00 (Sun)
  63343134000, #    local_end 2008-04-06 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  63343096200, #    utc_start 2008-04-05 16:30:00 (Sat)
  63358821000, #      utc_end 2008-10-04 16:30:00 (Sat)
  63343130400, #  local_start 2008-04-06 02:00:00 (Sun)
  63358855200, #    local_end 2008-10-05 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  63358821000, #    utc_start 2008-10-04 16:30:00 (Sat)
  63374545800, #      utc_end 2009-04-04 16:30:00 (Sat)
  63358858800, #  local_start 2008-10-05 03:00:00 (Sun)
  63374583600, #    local_end 2009-04-05 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  63374545800, #    utc_start 2009-04-04 16:30:00 (Sat)
  63390270600, #      utc_end 2009-10-03 16:30:00 (Sat)
  63374580000, #  local_start 2009-04-05 02:00:00 (Sun)
  63390304800, #    local_end 2009-10-04 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  63390270600, #    utc_start 2009-10-03 16:30:00 (Sat)
  63405995400, #      utc_end 2010-04-03 16:30:00 (Sat)
  63390308400, #  local_start 2009-10-04 03:00:00 (Sun)
  63406033200, #    local_end 2010-04-04 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  63405995400, #    utc_start 2010-04-03 16:30:00 (Sat)
  63421720200, #      utc_end 2010-10-02 16:30:00 (Sat)
  63406029600, #  local_start 2010-04-04 02:00:00 (Sun)
  63421754400, #    local_end 2010-10-03 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  63421720200, #    utc_start 2010-10-02 16:30:00 (Sat)
  63437445000, #      utc_end 2011-04-02 16:30:00 (Sat)
  63421758000, #  local_start 2010-10-03 03:00:00 (Sun)
  63437482800, #    local_end 2011-04-03 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  63437445000, #    utc_start 2011-04-02 16:30:00 (Sat)
  63453169800, #      utc_end 2011-10-01 16:30:00 (Sat)
  63437479200, #  local_start 2011-04-03 02:00:00 (Sun)
  63453204000, #    local_end 2011-10-02 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  63453169800, #    utc_start 2011-10-01 16:30:00 (Sat)
  63468894600, #      utc_end 2012-03-31 16:30:00 (Sat)
  63453207600, #  local_start 2011-10-02 03:00:00 (Sun)
  63468932400, #    local_end 2012-04-01 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  63468894600, #    utc_start 2012-03-31 16:30:00 (Sat)
  63485224200, #      utc_end 2012-10-06 16:30:00 (Sat)
  63468928800, #  local_start 2012-04-01 02:00:00 (Sun)
  63485258400, #    local_end 2012-10-07 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  63485224200, #    utc_start 2012-10-06 16:30:00 (Sat)
  63500949000, #      utc_end 2013-04-06 16:30:00 (Sat)
  63485262000, #  local_start 2012-10-07 03:00:00 (Sun)
  63500986800, #    local_end 2013-04-07 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  63500949000, #    utc_start 2013-04-06 16:30:00 (Sat)
  63516673800, #      utc_end 2013-10-05 16:30:00 (Sat)
  63500983200, #  local_start 2013-04-07 02:00:00 (Sun)
  63516708000, #    local_end 2013-10-06 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  63516673800, #    utc_start 2013-10-05 16:30:00 (Sat)
  63532398600, #      utc_end 2014-04-05 16:30:00 (Sat)
  63516711600, #  local_start 2013-10-06 03:00:00 (Sun)
  63532436400, #    local_end 2014-04-06 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  63532398600, #    utc_start 2014-04-05 16:30:00 (Sat)
  63548123400, #      utc_end 2014-10-04 16:30:00 (Sat)
  63532432800, #  local_start 2014-04-06 02:00:00 (Sun)
  63548157600, #    local_end 2014-10-05 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  63548123400, #    utc_start 2014-10-04 16:30:00 (Sat)
  63563848200, #      utc_end 2015-04-04 16:30:00 (Sat)
  63548161200, #  local_start 2014-10-05 03:00:00 (Sun)
  63563886000, #    local_end 2015-04-05 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  63563848200, #    utc_start 2015-04-04 16:30:00 (Sat)
  63579573000, #      utc_end 2015-10-03 16:30:00 (Sat)
  63563882400, #  local_start 2015-04-05 02:00:00 (Sun)
  63579607200, #    local_end 2015-10-04 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  63579573000, #    utc_start 2015-10-03 16:30:00 (Sat)
  63595297800, #      utc_end 2016-04-02 16:30:00 (Sat)
  63579610800, #  local_start 2015-10-04 03:00:00 (Sun)
  63595335600, #    local_end 2016-04-03 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  63595297800, #    utc_start 2016-04-02 16:30:00 (Sat)
  63611022600, #      utc_end 2016-10-01 16:30:00 (Sat)
  63595332000, #  local_start 2016-04-03 02:00:00 (Sun)
  63611056800, #    local_end 2016-10-02 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  63611022600, #    utc_start 2016-10-01 16:30:00 (Sat)
  63626747400, #      utc_end 2017-04-01 16:30:00 (Sat)
  63611060400, #  local_start 2016-10-02 03:00:00 (Sun)
  63626785200, #    local_end 2017-04-02 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  63626747400, #    utc_start 2017-04-01 16:30:00 (Sat)
  63642472200, #      utc_end 2017-09-30 16:30:00 (Sat)
  63626781600, #  local_start 2017-04-02 02:00:00 (Sun)
  63642506400, #    local_end 2017-10-01 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  63642472200, #    utc_start 2017-09-30 16:30:00 (Sat)
  63658197000, #      utc_end 2018-03-31 16:30:00 (Sat)
  63642510000, #  local_start 2017-10-01 03:00:00 (Sun)
  63658234800, #    local_end 2018-04-01 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  63658197000, #    utc_start 2018-03-31 16:30:00 (Sat)
  63674526600, #      utc_end 2018-10-06 16:30:00 (Sat)
  63658231200, #  local_start 2018-04-01 02:00:00 (Sun)
  63674560800, #    local_end 2018-10-07 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  63674526600, #    utc_start 2018-10-06 16:30:00 (Sat)
  63690251400, #      utc_end 2019-04-06 16:30:00 (Sat)
  63674564400, #  local_start 2018-10-07 03:00:00 (Sun)
  63690289200, #    local_end 2019-04-07 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  63690251400, #    utc_start 2019-04-06 16:30:00 (Sat)
  63705976200, #      utc_end 2019-10-05 16:30:00 (Sat)
  63690285600, #  local_start 2019-04-07 02:00:00 (Sun)
  63706010400, #    local_end 2019-10-06 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  63705976200, #    utc_start 2019-10-05 16:30:00 (Sat)
  63721701000, #      utc_end 2020-04-04 16:30:00 (Sat)
  63706014000, #  local_start 2019-10-06 03:00:00 (Sun)
  63721738800, #    local_end 2020-04-05 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  63721701000, #    utc_start 2020-04-04 16:30:00 (Sat)
  63737425800, #      utc_end 2020-10-03 16:30:00 (Sat)
  63721735200, #  local_start 2020-04-05 02:00:00 (Sun)
  63737460000, #    local_end 2020-10-04 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  63737425800, #    utc_start 2020-10-03 16:30:00 (Sat)
  63753150600, #      utc_end 2021-04-03 16:30:00 (Sat)
  63737463600, #  local_start 2020-10-04 03:00:00 (Sun)
  63753188400, #    local_end 2021-04-04 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  63753150600, #    utc_start 2021-04-03 16:30:00 (Sat)
  63768875400, #      utc_end 2021-10-02 16:30:00 (Sat)
  63753184800, #  local_start 2021-04-04 02:00:00 (Sun)
  63768909600, #    local_end 2021-10-03 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  63768875400, #    utc_start 2021-10-02 16:30:00 (Sat)
  63784600200, #      utc_end 2022-04-02 16:30:00 (Sat)
  63768913200, #  local_start 2021-10-03 03:00:00 (Sun)
  63784638000, #    local_end 2022-04-03 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  63784600200, #    utc_start 2022-04-02 16:30:00 (Sat)
  63800325000, #      utc_end 2022-10-01 16:30:00 (Sat)
  63784634400, #  local_start 2022-04-03 02:00:00 (Sun)
  63800359200, #    local_end 2022-10-02 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  63800325000, #    utc_start 2022-10-01 16:30:00 (Sat)
  63816049800, #      utc_end 2023-04-01 16:30:00 (Sat)
  63800362800, #  local_start 2022-10-02 03:00:00 (Sun)
  63816087600, #    local_end 2023-04-02 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  63816049800, #    utc_start 2023-04-01 16:30:00 (Sat)
  63831774600, #      utc_end 2023-09-30 16:30:00 (Sat)
  63816084000, #  local_start 2023-04-02 02:00:00 (Sun)
  63831808800, #    local_end 2023-10-01 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  63831774600, #    utc_start 2023-09-30 16:30:00 (Sat)
  63848104200, #      utc_end 2024-04-06 16:30:00 (Sat)
  63831812400, #  local_start 2023-10-01 03:00:00 (Sun)
  63848142000, #    local_end 2024-04-07 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  63848104200, #    utc_start 2024-04-06 16:30:00 (Sat)
  63863829000, #      utc_end 2024-10-05 16:30:00 (Sat)
  63848138400, #  local_start 2024-04-07 02:00:00 (Sun)
  63863863200, #    local_end 2024-10-06 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  63863829000, #    utc_start 2024-10-05 16:30:00 (Sat)
  63879553800, #      utc_end 2025-04-05 16:30:00 (Sat)
  63863866800, #  local_start 2024-10-06 03:00:00 (Sun)
  63879591600, #    local_end 2025-04-06 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  63879553800, #    utc_start 2025-04-05 16:30:00 (Sat)
  63895278600, #      utc_end 2025-10-04 16:30:00 (Sat)
  63879588000, #  local_start 2025-04-06 02:00:00 (Sun)
  63895312800, #    local_end 2025-10-05 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  63895278600, #    utc_start 2025-10-04 16:30:00 (Sat)
  63911003400, #      utc_end 2026-04-04 16:30:00 (Sat)
  63895316400, #  local_start 2025-10-05 03:00:00 (Sun)
  63911041200, #    local_end 2026-04-05 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  63911003400, #    utc_start 2026-04-04 16:30:00 (Sat)
  63926728200, #      utc_end 2026-10-03 16:30:00 (Sat)
  63911037600, #  local_start 2026-04-05 02:00:00 (Sun)
  63926762400, #    local_end 2026-10-04 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  63926728200, #    utc_start 2026-10-03 16:30:00 (Sat)
  63942453000, #      utc_end 2027-04-03 16:30:00 (Sat)
  63926766000, #  local_start 2026-10-04 03:00:00 (Sun)
  63942490800, #    local_end 2027-04-04 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  63942453000, #    utc_start 2027-04-03 16:30:00 (Sat)
  63958177800, #      utc_end 2027-10-02 16:30:00 (Sat)
  63942487200, #  local_start 2027-04-04 02:00:00 (Sun)
  63958212000, #    local_end 2027-10-03 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  63958177800, #    utc_start 2027-10-02 16:30:00 (Sat)
  63973902600, #      utc_end 2028-04-01 16:30:00 (Sat)
  63958215600, #  local_start 2027-10-03 03:00:00 (Sun)
  63973940400, #    local_end 2028-04-02 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  63973902600, #    utc_start 2028-04-01 16:30:00 (Sat)
  63989627400, #      utc_end 2028-09-30 16:30:00 (Sat)
  63973936800, #  local_start 2028-04-02 02:00:00 (Sun)
  63989661600, #    local_end 2028-10-01 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  63989627400, #    utc_start 2028-09-30 16:30:00 (Sat)
  64005352200, #      utc_end 2029-03-31 16:30:00 (Sat)
  63989665200, #  local_start 2028-10-01 03:00:00 (Sun)
  64005390000, #    local_end 2029-04-01 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  64005352200, #    utc_start 2029-03-31 16:30:00 (Sat)
  64021681800, #      utc_end 2029-10-06 16:30:00 (Sat)
  64005386400, #  local_start 2029-04-01 02:00:00 (Sun)
  64021716000, #    local_end 2029-10-07 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  64021681800, #    utc_start 2029-10-06 16:30:00 (Sat)
  64037406600, #      utc_end 2030-04-06 16:30:00 (Sat)
  64021719600, #  local_start 2029-10-07 03:00:00 (Sun)
  64037444400, #    local_end 2030-04-07 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  64037406600, #    utc_start 2030-04-06 16:30:00 (Sat)
  64053131400, #      utc_end 2030-10-05 16:30:00 (Sat)
  64037440800, #  local_start 2030-04-07 02:00:00 (Sun)
  64053165600, #    local_end 2030-10-06 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {64}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { 34200 }
  
  my $last_observance = bless( {
    'format' => 'AC%sT',
    'gmtoff' => '9:30',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 719528,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 719528,
      'utc_rd_secs' => 0,
      'utc_year' => 1972
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => 34200,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 719527,
      'local_rd_secs' => 52200,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 719527,
      'utc_rd_secs' => 52200,
      'utc_year' => 1971
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00s',
      'from' => '2008',
      'in' => 'Apr',
      'letter' => 'S',
      'name' => 'AS',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00s',
      'from' => '2008',
      'in' => 'Oct',
      'letter' => 'D',
      'name' => 'AS',
      'offset_from_std' => 3600,
      'on' => 'Sun>=1',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AUSTRALIA_ADELAIDE

    $main::fatpacked{"DateTime/TimeZone/Australia/Brisbane.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AUSTRALIA_BRISBANE';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/australasia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Australia::Brisbane;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Australia::Brisbane::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59768891272, #      utc_end 1894-12-31 13:47:52 (Mon)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59768928000, #    local_end 1895-01-01 00:00:00 (Tue)
  36728,
  0,
  'LMT',
      ],
      [
  59768891272, #    utc_start 1894-12-31 13:47:52 (Mon)
  60463116060, #      utc_end 1916-12-31 14:01:00 (Sun)
  59768927272, #  local_start 1894-12-31 23:47:52 (Mon)
  60463152060, #    local_end 1917-01-01 00:01:00 (Mon)
  36000,
  0,
  'AEST',
      ],
      [
  60463116060, #    utc_start 1916-12-31 14:01:00 (Sun)
  60470290800, #      utc_end 1917-03-24 15:00:00 (Sat)
  60463155660, #  local_start 1917-01-01 01:01:00 (Mon)
  60470330400, #    local_end 1917-03-25 02:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  60470290800, #    utc_start 1917-03-24 15:00:00 (Sat)
  61252041600, #      utc_end 1941-12-31 16:00:00 (Wed)
  60470326800, #  local_start 1917-03-25 01:00:00 (Sun)
  61252077600, #    local_end 1942-01-01 02:00:00 (Thu)
  36000,
  0,
  'AEST',
      ],
      [
  61252041600, #    utc_start 1941-12-31 16:00:00 (Wed)
  61259554800, #      utc_end 1942-03-28 15:00:00 (Sat)
  61252081200, #  local_start 1942-01-01 03:00:00 (Thu)
  61259594400, #    local_end 1942-03-29 02:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  61259554800, #    utc_start 1942-03-28 15:00:00 (Sat)
  61275283200, #      utc_end 1942-09-26 16:00:00 (Sat)
  61259590800, #  local_start 1942-03-29 01:00:00 (Sun)
  61275319200, #    local_end 1942-09-27 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  61275283200, #    utc_start 1942-09-26 16:00:00 (Sat)
  61291004400, #      utc_end 1943-03-27 15:00:00 (Sat)
  61275322800, #  local_start 1942-09-27 03:00:00 (Sun)
  61291044000, #    local_end 1943-03-28 02:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  61291004400, #    utc_start 1943-03-27 15:00:00 (Sat)
  61307337600, #      utc_end 1943-10-02 16:00:00 (Sat)
  61291040400, #  local_start 1943-03-28 01:00:00 (Sun)
  61307373600, #    local_end 1943-10-03 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  61307337600, #    utc_start 1943-10-02 16:00:00 (Sat)
  61322454000, #      utc_end 1944-03-25 15:00:00 (Sat)
  61307377200, #  local_start 1943-10-03 03:00:00 (Sun)
  61322493600, #    local_end 1944-03-26 02:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  61322454000, #    utc_start 1944-03-25 15:00:00 (Sat)
  62167183200, #      utc_end 1970-12-31 14:00:00 (Thu)
  61322490000, #  local_start 1944-03-26 01:00:00 (Sun)
  62167219200, #    local_end 1971-01-01 00:00:00 (Fri)
  36000,
  0,
  'AEST',
      ],
      [
  62167183200, #    utc_start 1970-12-31 14:00:00 (Thu)
  62193369600, #      utc_end 1971-10-30 16:00:00 (Sat)
  62167219200, #  local_start 1971-01-01 00:00:00 (Fri)
  62193405600, #    local_end 1971-10-31 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62193369600, #    utc_start 1971-10-30 16:00:00 (Sat)
  62203651200, #      utc_end 1972-02-26 16:00:00 (Sat)
  62193409200, #  local_start 1971-10-31 03:00:00 (Sun)
  62203690800, #    local_end 1972-02-27 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62203651200, #    utc_start 1972-02-26 16:00:00 (Sat)
  62761276800, #      utc_end 1989-10-28 16:00:00 (Sat)
  62203687200, #  local_start 1972-02-27 02:00:00 (Sun)
  62761312800, #    local_end 1989-10-29 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62761276800, #    utc_start 1989-10-28 16:00:00 (Sat)
  62772163200, #      utc_end 1990-03-03 16:00:00 (Sat)
  62761316400, #  local_start 1989-10-29 03:00:00 (Sun)
  62772202800, #    local_end 1990-03-04 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62772163200, #    utc_start 1990-03-03 16:00:00 (Sat)
  62792726400, #      utc_end 1990-10-27 16:00:00 (Sat)
  62772199200, #  local_start 1990-03-04 02:00:00 (Sun)
  62792762400, #    local_end 1990-10-28 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62792726400, #    utc_start 1990-10-27 16:00:00 (Sat)
  62803612800, #      utc_end 1991-03-02 16:00:00 (Sat)
  62792766000, #  local_start 1990-10-28 03:00:00 (Sun)
  62803652400, #    local_end 1991-03-03 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62803612800, #    utc_start 1991-03-02 16:00:00 (Sat)
  62824176000, #      utc_end 1991-10-26 16:00:00 (Sat)
  62803648800, #  local_start 1991-03-03 02:00:00 (Sun)
  62824212000, #    local_end 1991-10-27 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62824176000, #    utc_start 1991-10-26 16:00:00 (Sat)
  62835062400, #      utc_end 1992-02-29 16:00:00 (Sat)
  62824215600, #  local_start 1991-10-27 03:00:00 (Sun)
  62835102000, #    local_end 1992-03-01 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62835062400, #    utc_start 1992-02-29 16:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  62835098400, #  local_start 1992-03-01 02:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  36000,
  0,
  'AEST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {8}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AUSTRALIA_BRISBANE

    $main::fatpacked{"DateTime/TimeZone/Australia/Broken_Hill.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AUSTRALIA_BROKEN_HILL';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/australasia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Australia::Broken_Hill;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Australia::Broken_Hill::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59771572452, #      utc_end 1895-01-31 14:34:12 (Thu)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59771606400, #    local_end 1895-02-01 00:00:00 (Fri)
  33948,
  0,
  'LMT',
      ],
      [
  59771572452, #    utc_start 1895-01-31 14:34:12 (Thu)
  59820732000, #      utc_end 1896-08-22 14:00:00 (Sat)
  59771608452, #  local_start 1895-02-01 00:34:12 (Fri)
  59820768000, #    local_end 1896-08-23 00:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  59820732000, #    utc_start 1896-08-22 14:00:00 (Sat)
  59905494000, #      utc_end 1899-04-30 15:00:00 (Sun)
  59820764400, #  local_start 1896-08-22 23:00:00 (Sat)
  59905526400, #    local_end 1899-05-01 00:00:00 (Mon)
  32400,
  0,
  'ACST',
      ],
      [
  59905494000, #    utc_start 1899-04-30 15:00:00 (Sun)
  60463117860, #      utc_end 1916-12-31 14:31:00 (Sun)
  59905528200, #  local_start 1899-05-01 00:30:00 (Mon)
  60463152060, #    local_end 1917-01-01 00:01:00 (Mon)
  34200,
  0,
  'ACST',
      ],
      [
  60463117860, #    utc_start 1916-12-31 14:31:00 (Sun)
  60470292600, #      utc_end 1917-03-24 15:30:00 (Sat)
  60463155660, #  local_start 1917-01-01 01:01:00 (Mon)
  60470330400, #    local_end 1917-03-25 02:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  60470292600, #    utc_start 1917-03-24 15:30:00 (Sat)
  61252043400, #      utc_end 1941-12-31 16:30:00 (Wed)
  60470326800, #  local_start 1917-03-25 01:00:00 (Sun)
  61252077600, #    local_end 1942-01-01 02:00:00 (Thu)
  34200,
  0,
  'ACST',
      ],
      [
  61252043400, #    utc_start 1941-12-31 16:30:00 (Wed)
  61259556600, #      utc_end 1942-03-28 15:30:00 (Sat)
  61252081200, #  local_start 1942-01-01 03:00:00 (Thu)
  61259594400, #    local_end 1942-03-29 02:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  61259556600, #    utc_start 1942-03-28 15:30:00 (Sat)
  61275285000, #      utc_end 1942-09-26 16:30:00 (Sat)
  61259590800, #  local_start 1942-03-29 01:00:00 (Sun)
  61275319200, #    local_end 1942-09-27 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  61275285000, #    utc_start 1942-09-26 16:30:00 (Sat)
  61291006200, #      utc_end 1943-03-27 15:30:00 (Sat)
  61275322800, #  local_start 1942-09-27 03:00:00 (Sun)
  61291044000, #    local_end 1943-03-28 02:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  61291006200, #    utc_start 1943-03-27 15:30:00 (Sat)
  61307339400, #      utc_end 1943-10-02 16:30:00 (Sat)
  61291040400, #  local_start 1943-03-28 01:00:00 (Sun)
  61307373600, #    local_end 1943-10-03 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  61307339400, #    utc_start 1943-10-02 16:30:00 (Sat)
  61322455800, #      utc_end 1944-03-25 15:30:00 (Sat)
  61307377200, #  local_start 1943-10-03 03:00:00 (Sun)
  61322493600, #    local_end 1944-03-26 02:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  61322455800, #    utc_start 1944-03-25 15:30:00 (Sat)
  62167185000, #      utc_end 1970-12-31 14:30:00 (Thu)
  61322490000, #  local_start 1944-03-26 01:00:00 (Sun)
  62167219200, #    local_end 1971-01-01 00:00:00 (Fri)
  34200,
  0,
  'ACST',
      ],
      [
  62167185000, #    utc_start 1970-12-31 14:30:00 (Thu)
  62193371400, #      utc_end 1971-10-30 16:30:00 (Sat)
  62167219200, #  local_start 1971-01-01 00:00:00 (Fri)
  62193405600, #    local_end 1971-10-31 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  62193371400, #    utc_start 1971-10-30 16:30:00 (Sat)
  62203653000, #      utc_end 1972-02-26 16:30:00 (Sat)
  62193409200, #  local_start 1971-10-31 03:00:00 (Sun)
  62203690800, #    local_end 1972-02-27 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  62203653000, #    utc_start 1972-02-26 16:30:00 (Sat)
  62224821000, #      utc_end 1972-10-28 16:30:00 (Sat)
  62203687200, #  local_start 1972-02-27 02:00:00 (Sun)
  62224855200, #    local_end 1972-10-29 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  62224821000, #    utc_start 1972-10-28 16:30:00 (Sat)
  62235707400, #      utc_end 1973-03-03 16:30:00 (Sat)
  62224858800, #  local_start 1972-10-29 03:00:00 (Sun)
  62235745200, #    local_end 1973-03-04 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  62235707400, #    utc_start 1973-03-03 16:30:00 (Sat)
  62256270600, #      utc_end 1973-10-27 16:30:00 (Sat)
  62235741600, #  local_start 1973-03-04 02:00:00 (Sun)
  62256304800, #    local_end 1973-10-28 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  62256270600, #    utc_start 1973-10-27 16:30:00 (Sat)
  62267157000, #      utc_end 1974-03-02 16:30:00 (Sat)
  62256308400, #  local_start 1973-10-28 03:00:00 (Sun)
  62267194800, #    local_end 1974-03-03 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  62267157000, #    utc_start 1974-03-02 16:30:00 (Sat)
  62287720200, #      utc_end 1974-10-26 16:30:00 (Sat)
  62267191200, #  local_start 1974-03-03 02:00:00 (Sun)
  62287754400, #    local_end 1974-10-27 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  62287720200, #    utc_start 1974-10-26 16:30:00 (Sat)
  62298606600, #      utc_end 1975-03-01 16:30:00 (Sat)
  62287758000, #  local_start 1974-10-27 03:00:00 (Sun)
  62298644400, #    local_end 1975-03-02 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  62298606600, #    utc_start 1975-03-01 16:30:00 (Sat)
  62319169800, #      utc_end 1975-10-25 16:30:00 (Sat)
  62298640800, #  local_start 1975-03-02 02:00:00 (Sun)
  62319204000, #    local_end 1975-10-26 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  62319169800, #    utc_start 1975-10-25 16:30:00 (Sat)
  62330661000, #      utc_end 1976-03-06 16:30:00 (Sat)
  62319207600, #  local_start 1975-10-26 03:00:00 (Sun)
  62330698800, #    local_end 1976-03-07 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  62330661000, #    utc_start 1976-03-06 16:30:00 (Sat)
  62351224200, #      utc_end 1976-10-30 16:30:00 (Sat)
  62330695200, #  local_start 1976-03-07 02:00:00 (Sun)
  62351258400, #    local_end 1976-10-31 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  62351224200, #    utc_start 1976-10-30 16:30:00 (Sat)
  62362110600, #      utc_end 1977-03-05 16:30:00 (Sat)
  62351262000, #  local_start 1976-10-31 03:00:00 (Sun)
  62362148400, #    local_end 1977-03-06 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  62362110600, #    utc_start 1977-03-05 16:30:00 (Sat)
  62382673800, #      utc_end 1977-10-29 16:30:00 (Sat)
  62362144800, #  local_start 1977-03-06 02:00:00 (Sun)
  62382708000, #    local_end 1977-10-30 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  62382673800, #    utc_start 1977-10-29 16:30:00 (Sat)
  62393560200, #      utc_end 1978-03-04 16:30:00 (Sat)
  62382711600, #  local_start 1977-10-30 03:00:00 (Sun)
  62393598000, #    local_end 1978-03-05 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  62393560200, #    utc_start 1978-03-04 16:30:00 (Sat)
  62414123400, #      utc_end 1978-10-28 16:30:00 (Sat)
  62393594400, #  local_start 1978-03-05 02:00:00 (Sun)
  62414157600, #    local_end 1978-10-29 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  62414123400, #    utc_start 1978-10-28 16:30:00 (Sat)
  62425009800, #      utc_end 1979-03-03 16:30:00 (Sat)
  62414161200, #  local_start 1978-10-29 03:00:00 (Sun)
  62425047600, #    local_end 1979-03-04 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  62425009800, #    utc_start 1979-03-03 16:30:00 (Sat)
  62445573000, #      utc_end 1979-10-27 16:30:00 (Sat)
  62425044000, #  local_start 1979-03-04 02:00:00 (Sun)
  62445607200, #    local_end 1979-10-28 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  62445573000, #    utc_start 1979-10-27 16:30:00 (Sat)
  62456459400, #      utc_end 1980-03-01 16:30:00 (Sat)
  62445610800, #  local_start 1979-10-28 03:00:00 (Sun)
  62456497200, #    local_end 1980-03-02 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  62456459400, #    utc_start 1980-03-01 16:30:00 (Sat)
  62477022600, #      utc_end 1980-10-25 16:30:00 (Sat)
  62456493600, #  local_start 1980-03-02 02:00:00 (Sun)
  62477056800, #    local_end 1980-10-26 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  62477022600, #    utc_start 1980-10-25 16:30:00 (Sat)
  62487909000, #      utc_end 1981-02-28 16:30:00 (Sat)
  62477060400, #  local_start 1980-10-26 03:00:00 (Sun)
  62487946800, #    local_end 1981-03-01 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  62487909000, #    utc_start 1981-02-28 16:30:00 (Sat)
  62508472200, #      utc_end 1981-10-24 16:30:00 (Sat)
  62487943200, #  local_start 1981-03-01 02:00:00 (Sun)
  62508506400, #    local_end 1981-10-25 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  62508472200, #    utc_start 1981-10-24 16:30:00 (Sat)
  62522382600, #      utc_end 1982-04-03 16:30:00 (Sat)
  62508510000, #  local_start 1981-10-25 03:00:00 (Sun)
  62522420400, #    local_end 1982-04-04 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  62522382600, #    utc_start 1982-04-03 16:30:00 (Sat)
  62540526600, #      utc_end 1982-10-30 16:30:00 (Sat)
  62522416800, #  local_start 1982-04-04 02:00:00 (Sun)
  62540560800, #    local_end 1982-10-31 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  62540526600, #    utc_start 1982-10-30 16:30:00 (Sat)
  62551413000, #      utc_end 1983-03-05 16:30:00 (Sat)
  62540564400, #  local_start 1982-10-31 03:00:00 (Sun)
  62551450800, #    local_end 1983-03-06 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  62551413000, #    utc_start 1983-03-05 16:30:00 (Sat)
  62571976200, #      utc_end 1983-10-29 16:30:00 (Sat)
  62551447200, #  local_start 1983-03-06 02:00:00 (Sun)
  62572010400, #    local_end 1983-10-30 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  62571976200, #    utc_start 1983-10-29 16:30:00 (Sat)
  62582862600, #      utc_end 1984-03-03 16:30:00 (Sat)
  62572014000, #  local_start 1983-10-30 03:00:00 (Sun)
  62582900400, #    local_end 1984-03-04 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  62582862600, #    utc_start 1984-03-03 16:30:00 (Sat)
  62603425800, #      utc_end 1984-10-27 16:30:00 (Sat)
  62582896800, #  local_start 1984-03-04 02:00:00 (Sun)
  62603460000, #    local_end 1984-10-28 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  62603425800, #    utc_start 1984-10-27 16:30:00 (Sat)
  62614312200, #      utc_end 1985-03-02 16:30:00 (Sat)
  62603463600, #  local_start 1984-10-28 03:00:00 (Sun)
  62614350000, #    local_end 1985-03-03 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  62614312200, #    utc_start 1985-03-02 16:30:00 (Sat)
  62634875400, #      utc_end 1985-10-26 16:30:00 (Sat)
  62614346400, #  local_start 1985-03-03 02:00:00 (Sun)
  62634909600, #    local_end 1985-10-27 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  62634875400, #    utc_start 1985-10-26 16:30:00 (Sat)
  62646971400, #      utc_end 1986-03-15 16:30:00 (Sat)
  62634913200, #  local_start 1985-10-27 03:00:00 (Sun)
  62647009200, #    local_end 1986-03-16 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  62646971400, #    utc_start 1986-03-15 16:30:00 (Sat)
  62665720200, #      utc_end 1986-10-18 16:30:00 (Sat)
  62647005600, #  local_start 1986-03-16 02:00:00 (Sun)
  62665754400, #    local_end 1986-10-19 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  62665720200, #    utc_start 1986-10-18 16:30:00 (Sat)
  62678421000, #      utc_end 1987-03-14 16:30:00 (Sat)
  62665758000, #  local_start 1986-10-19 03:00:00 (Sun)
  62678458800, #    local_end 1987-03-15 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  62678421000, #    utc_start 1987-03-14 16:30:00 (Sat)
  62697774600, #      utc_end 1987-10-24 16:30:00 (Sat)
  62678455200, #  local_start 1987-03-15 02:00:00 (Sun)
  62697808800, #    local_end 1987-10-25 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  62697774600, #    utc_start 1987-10-24 16:30:00 (Sat)
  62710475400, #      utc_end 1988-03-19 16:30:00 (Sat)
  62697812400, #  local_start 1987-10-25 03:00:00 (Sun)
  62710513200, #    local_end 1988-03-20 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  62710475400, #    utc_start 1988-03-19 16:30:00 (Sat)
  62729829000, #      utc_end 1988-10-29 16:30:00 (Sat)
  62710509600, #  local_start 1988-03-20 02:00:00 (Sun)
  62729863200, #    local_end 1988-10-30 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  62729829000, #    utc_start 1988-10-29 16:30:00 (Sat)
  62741925000, #      utc_end 1989-03-18 16:30:00 (Sat)
  62729866800, #  local_start 1988-10-30 03:00:00 (Sun)
  62741962800, #    local_end 1989-03-19 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  62741925000, #    utc_start 1989-03-18 16:30:00 (Sat)
  62761278600, #      utc_end 1989-10-28 16:30:00 (Sat)
  62741959200, #  local_start 1989-03-19 02:00:00 (Sun)
  62761312800, #    local_end 1989-10-29 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  62761278600, #    utc_start 1989-10-28 16:30:00 (Sat)
  62772165000, #      utc_end 1990-03-03 16:30:00 (Sat)
  62761316400, #  local_start 1989-10-29 03:00:00 (Sun)
  62772202800, #    local_end 1990-03-04 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  62772165000, #    utc_start 1990-03-03 16:30:00 (Sat)
  62792728200, #      utc_end 1990-10-27 16:30:00 (Sat)
  62772199200, #  local_start 1990-03-04 02:00:00 (Sun)
  62792762400, #    local_end 1990-10-28 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  62792728200, #    utc_start 1990-10-27 16:30:00 (Sat)
  62803614600, #      utc_end 1991-03-02 16:30:00 (Sat)
  62792766000, #  local_start 1990-10-28 03:00:00 (Sun)
  62803652400, #    local_end 1991-03-03 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  62803614600, #    utc_start 1991-03-02 16:30:00 (Sat)
  62824177800, #      utc_end 1991-10-26 16:30:00 (Sat)
  62803648800, #  local_start 1991-03-03 02:00:00 (Sun)
  62824212000, #    local_end 1991-10-27 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  62824177800, #    utc_start 1991-10-26 16:30:00 (Sat)
  62835064200, #      utc_end 1992-02-29 16:30:00 (Sat)
  62824215600, #  local_start 1991-10-27 03:00:00 (Sun)
  62835102000, #    local_end 1992-03-01 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  62835064200, #    utc_start 1992-02-29 16:30:00 (Sat)
  62855627400, #      utc_end 1992-10-24 16:30:00 (Sat)
  62835098400, #  local_start 1992-03-01 02:00:00 (Sun)
  62855661600, #    local_end 1992-10-25 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  62855627400, #    utc_start 1992-10-24 16:30:00 (Sat)
  62867118600, #      utc_end 1993-03-06 16:30:00 (Sat)
  62855665200, #  local_start 1992-10-25 03:00:00 (Sun)
  62867156400, #    local_end 1993-03-07 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  62867118600, #    utc_start 1993-03-06 16:30:00 (Sat)
  62887681800, #      utc_end 1993-10-30 16:30:00 (Sat)
  62867152800, #  local_start 1993-03-07 02:00:00 (Sun)
  62887716000, #    local_end 1993-10-31 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  62887681800, #    utc_start 1993-10-30 16:30:00 (Sat)
  62898568200, #      utc_end 1994-03-05 16:30:00 (Sat)
  62887719600, #  local_start 1993-10-31 03:00:00 (Sun)
  62898606000, #    local_end 1994-03-06 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  62898568200, #    utc_start 1994-03-05 16:30:00 (Sat)
  62919131400, #      utc_end 1994-10-29 16:30:00 (Sat)
  62898602400, #  local_start 1994-03-06 02:00:00 (Sun)
  62919165600, #    local_end 1994-10-30 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  62919131400, #    utc_start 1994-10-29 16:30:00 (Sat)
  62930017800, #      utc_end 1995-03-04 16:30:00 (Sat)
  62919169200, #  local_start 1994-10-30 03:00:00 (Sun)
  62930055600, #    local_end 1995-03-05 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  62930017800, #    utc_start 1995-03-04 16:30:00 (Sat)
  62950581000, #      utc_end 1995-10-28 16:30:00 (Sat)
  62930052000, #  local_start 1995-03-05 02:00:00 (Sun)
  62950615200, #    local_end 1995-10-29 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  62950581000, #    utc_start 1995-10-28 16:30:00 (Sat)
  62963886600, #      utc_end 1996-03-30 16:30:00 (Sat)
  62950618800, #  local_start 1995-10-29 03:00:00 (Sun)
  62963924400, #    local_end 1996-03-31 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  62963886600, #    utc_start 1996-03-30 16:30:00 (Sat)
  62982030600, #      utc_end 1996-10-26 16:30:00 (Sat)
  62963920800, #  local_start 1996-03-31 02:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  62982030600, #    utc_start 1996-10-26 16:30:00 (Sat)
  62995336200, #      utc_end 1997-03-29 16:30:00 (Sat)
  62982068400, #  local_start 1996-10-27 03:00:00 (Sun)
  62995374000, #    local_end 1997-03-30 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  62995336200, #    utc_start 1997-03-29 16:30:00 (Sat)
  63013480200, #      utc_end 1997-10-25 16:30:00 (Sat)
  62995370400, #  local_start 1997-03-30 02:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  63013480200, #    utc_start 1997-10-25 16:30:00 (Sat)
  63026785800, #      utc_end 1998-03-28 16:30:00 (Sat)
  63013518000, #  local_start 1997-10-26 03:00:00 (Sun)
  63026823600, #    local_end 1998-03-29 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  63026785800, #    utc_start 1998-03-28 16:30:00 (Sat)
  63044929800, #      utc_end 1998-10-24 16:30:00 (Sat)
  63026820000, #  local_start 1998-03-29 02:00:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  63044929800, #    utc_start 1998-10-24 16:30:00 (Sat)
  63058235400, #      utc_end 1999-03-27 16:30:00 (Sat)
  63044967600, #  local_start 1998-10-25 03:00:00 (Sun)
  63058273200, #    local_end 1999-03-28 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  63058235400, #    utc_start 1999-03-27 16:30:00 (Sat)
  63076984200, #      utc_end 1999-10-30 16:30:00 (Sat)
  63058269600, #  local_start 1999-03-28 02:00:00 (Sun)
  63077018400, #    local_end 1999-10-31 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  63076984200, #    utc_start 1999-10-30 16:30:00 (Sat)
  63082330200, #      utc_end 1999-12-31 13:30:00 (Fri)
  63077022000, #  local_start 1999-10-31 03:00:00 (Sun)
  63082368000, #    local_end 2000-01-01 00:00:00 (Sat)
  37800,
  1,
  'ACDT',
      ],
      [
  63082330200, #    utc_start 1999-12-31 13:30:00 (Fri)
  63089685000, #      utc_end 2000-03-25 16:30:00 (Sat)
  63082368000, #  local_start 2000-01-01 00:00:00 (Sat)
  63089722800, #    local_end 2000-03-26 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  63089685000, #    utc_start 2000-03-25 16:30:00 (Sat)
  63108433800, #      utc_end 2000-10-28 16:30:00 (Sat)
  63089719200, #  local_start 2000-03-26 02:00:00 (Sun)
  63108468000, #    local_end 2000-10-29 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  63108433800, #    utc_start 2000-10-28 16:30:00 (Sat)
  63121134600, #      utc_end 2001-03-24 16:30:00 (Sat)
  63108471600, #  local_start 2000-10-29 03:00:00 (Sun)
  63121172400, #    local_end 2001-03-25 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  63121134600, #    utc_start 2001-03-24 16:30:00 (Sat)
  63139883400, #      utc_end 2001-10-27 16:30:00 (Sat)
  63121168800, #  local_start 2001-03-25 02:00:00 (Sun)
  63139917600, #    local_end 2001-10-28 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  63139883400, #    utc_start 2001-10-27 16:30:00 (Sat)
  63153189000, #      utc_end 2002-03-30 16:30:00 (Sat)
  63139921200, #  local_start 2001-10-28 03:00:00 (Sun)
  63153226800, #    local_end 2002-03-31 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  63153189000, #    utc_start 2002-03-30 16:30:00 (Sat)
  63171333000, #      utc_end 2002-10-26 16:30:00 (Sat)
  63153223200, #  local_start 2002-03-31 02:00:00 (Sun)
  63171367200, #    local_end 2002-10-27 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  63171333000, #    utc_start 2002-10-26 16:30:00 (Sat)
  63184638600, #      utc_end 2003-03-29 16:30:00 (Sat)
  63171370800, #  local_start 2002-10-27 03:00:00 (Sun)
  63184676400, #    local_end 2003-03-30 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  63184638600, #    utc_start 2003-03-29 16:30:00 (Sat)
  63202782600, #      utc_end 2003-10-25 16:30:00 (Sat)
  63184672800, #  local_start 2003-03-30 02:00:00 (Sun)
  63202816800, #    local_end 2003-10-26 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  63202782600, #    utc_start 2003-10-25 16:30:00 (Sat)
  63216088200, #      utc_end 2004-03-27 16:30:00 (Sat)
  63202820400, #  local_start 2003-10-26 03:00:00 (Sun)
  63216126000, #    local_end 2004-03-28 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  63216088200, #    utc_start 2004-03-27 16:30:00 (Sat)
  63234837000, #      utc_end 2004-10-30 16:30:00 (Sat)
  63216122400, #  local_start 2004-03-28 02:00:00 (Sun)
  63234871200, #    local_end 2004-10-31 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  63234837000, #    utc_start 2004-10-30 16:30:00 (Sat)
  63247537800, #      utc_end 2005-03-26 16:30:00 (Sat)
  63234874800, #  local_start 2004-10-31 03:00:00 (Sun)
  63247575600, #    local_end 2005-03-27 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  63247537800, #    utc_start 2005-03-26 16:30:00 (Sat)
  63266286600, #      utc_end 2005-10-29 16:30:00 (Sat)
  63247572000, #  local_start 2005-03-27 02:00:00 (Sun)
  63266320800, #    local_end 2005-10-30 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  63266286600, #    utc_start 2005-10-29 16:30:00 (Sat)
  63279592200, #      utc_end 2006-04-01 16:30:00 (Sat)
  63266324400, #  local_start 2005-10-30 03:00:00 (Sun)
  63279630000, #    local_end 2006-04-02 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  63279592200, #    utc_start 2006-04-01 16:30:00 (Sat)
  63297736200, #      utc_end 2006-10-28 16:30:00 (Sat)
  63279626400, #  local_start 2006-04-02 02:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  63297736200, #    utc_start 2006-10-28 16:30:00 (Sat)
  63310437000, #      utc_end 2007-03-24 16:30:00 (Sat)
  63297774000, #  local_start 2006-10-29 03:00:00 (Sun)
  63310474800, #    local_end 2007-03-25 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  63310437000, #    utc_start 2007-03-24 16:30:00 (Sat)
  63329185800, #      utc_end 2007-10-27 16:30:00 (Sat)
  63310471200, #  local_start 2007-03-25 02:00:00 (Sun)
  63329220000, #    local_end 2007-10-28 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  63329185800, #    utc_start 2007-10-27 16:30:00 (Sat)
  63343096200, #      utc_end 2008-04-05 16:30:00 (Sat)
  63329223600, #  local_start 2007-10-28 03:00:00 (Sun)
  63343134000, #    local_end 2008-04-06 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  63343096200, #    utc_start 2008-04-05 16:30:00 (Sat)
  63358821000, #      utc_end 2008-10-04 16:30:00 (Sat)
  63343130400, #  local_start 2008-04-06 02:00:00 (Sun)
  63358855200, #    local_end 2008-10-05 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  63358821000, #    utc_start 2008-10-04 16:30:00 (Sat)
  63374545800, #      utc_end 2009-04-04 16:30:00 (Sat)
  63358858800, #  local_start 2008-10-05 03:00:00 (Sun)
  63374583600, #    local_end 2009-04-05 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  63374545800, #    utc_start 2009-04-04 16:30:00 (Sat)
  63390270600, #      utc_end 2009-10-03 16:30:00 (Sat)
  63374580000, #  local_start 2009-04-05 02:00:00 (Sun)
  63390304800, #    local_end 2009-10-04 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  63390270600, #    utc_start 2009-10-03 16:30:00 (Sat)
  63405995400, #      utc_end 2010-04-03 16:30:00 (Sat)
  63390308400, #  local_start 2009-10-04 03:00:00 (Sun)
  63406033200, #    local_end 2010-04-04 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  63405995400, #    utc_start 2010-04-03 16:30:00 (Sat)
  63421720200, #      utc_end 2010-10-02 16:30:00 (Sat)
  63406029600, #  local_start 2010-04-04 02:00:00 (Sun)
  63421754400, #    local_end 2010-10-03 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  63421720200, #    utc_start 2010-10-02 16:30:00 (Sat)
  63437445000, #      utc_end 2011-04-02 16:30:00 (Sat)
  63421758000, #  local_start 2010-10-03 03:00:00 (Sun)
  63437482800, #    local_end 2011-04-03 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  63437445000, #    utc_start 2011-04-02 16:30:00 (Sat)
  63453169800, #      utc_end 2011-10-01 16:30:00 (Sat)
  63437479200, #  local_start 2011-04-03 02:00:00 (Sun)
  63453204000, #    local_end 2011-10-02 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  63453169800, #    utc_start 2011-10-01 16:30:00 (Sat)
  63468894600, #      utc_end 2012-03-31 16:30:00 (Sat)
  63453207600, #  local_start 2011-10-02 03:00:00 (Sun)
  63468932400, #    local_end 2012-04-01 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  63468894600, #    utc_start 2012-03-31 16:30:00 (Sat)
  63485224200, #      utc_end 2012-10-06 16:30:00 (Sat)
  63468928800, #  local_start 2012-04-01 02:00:00 (Sun)
  63485258400, #    local_end 2012-10-07 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  63485224200, #    utc_start 2012-10-06 16:30:00 (Sat)
  63500949000, #      utc_end 2013-04-06 16:30:00 (Sat)
  63485262000, #  local_start 2012-10-07 03:00:00 (Sun)
  63500986800, #    local_end 2013-04-07 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  63500949000, #    utc_start 2013-04-06 16:30:00 (Sat)
  63516673800, #      utc_end 2013-10-05 16:30:00 (Sat)
  63500983200, #  local_start 2013-04-07 02:00:00 (Sun)
  63516708000, #    local_end 2013-10-06 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  63516673800, #    utc_start 2013-10-05 16:30:00 (Sat)
  63532398600, #      utc_end 2014-04-05 16:30:00 (Sat)
  63516711600, #  local_start 2013-10-06 03:00:00 (Sun)
  63532436400, #    local_end 2014-04-06 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  63532398600, #    utc_start 2014-04-05 16:30:00 (Sat)
  63548123400, #      utc_end 2014-10-04 16:30:00 (Sat)
  63532432800, #  local_start 2014-04-06 02:00:00 (Sun)
  63548157600, #    local_end 2014-10-05 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  63548123400, #    utc_start 2014-10-04 16:30:00 (Sat)
  63563848200, #      utc_end 2015-04-04 16:30:00 (Sat)
  63548161200, #  local_start 2014-10-05 03:00:00 (Sun)
  63563886000, #    local_end 2015-04-05 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  63563848200, #    utc_start 2015-04-04 16:30:00 (Sat)
  63579573000, #      utc_end 2015-10-03 16:30:00 (Sat)
  63563882400, #  local_start 2015-04-05 02:00:00 (Sun)
  63579607200, #    local_end 2015-10-04 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  63579573000, #    utc_start 2015-10-03 16:30:00 (Sat)
  63595297800, #      utc_end 2016-04-02 16:30:00 (Sat)
  63579610800, #  local_start 2015-10-04 03:00:00 (Sun)
  63595335600, #    local_end 2016-04-03 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  63595297800, #    utc_start 2016-04-02 16:30:00 (Sat)
  63611022600, #      utc_end 2016-10-01 16:30:00 (Sat)
  63595332000, #  local_start 2016-04-03 02:00:00 (Sun)
  63611056800, #    local_end 2016-10-02 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  63611022600, #    utc_start 2016-10-01 16:30:00 (Sat)
  63626747400, #      utc_end 2017-04-01 16:30:00 (Sat)
  63611060400, #  local_start 2016-10-02 03:00:00 (Sun)
  63626785200, #    local_end 2017-04-02 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  63626747400, #    utc_start 2017-04-01 16:30:00 (Sat)
  63642472200, #      utc_end 2017-09-30 16:30:00 (Sat)
  63626781600, #  local_start 2017-04-02 02:00:00 (Sun)
  63642506400, #    local_end 2017-10-01 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  63642472200, #    utc_start 2017-09-30 16:30:00 (Sat)
  63658197000, #      utc_end 2018-03-31 16:30:00 (Sat)
  63642510000, #  local_start 2017-10-01 03:00:00 (Sun)
  63658234800, #    local_end 2018-04-01 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  63658197000, #    utc_start 2018-03-31 16:30:00 (Sat)
  63674526600, #      utc_end 2018-10-06 16:30:00 (Sat)
  63658231200, #  local_start 2018-04-01 02:00:00 (Sun)
  63674560800, #    local_end 2018-10-07 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  63674526600, #    utc_start 2018-10-06 16:30:00 (Sat)
  63690251400, #      utc_end 2019-04-06 16:30:00 (Sat)
  63674564400, #  local_start 2018-10-07 03:00:00 (Sun)
  63690289200, #    local_end 2019-04-07 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  63690251400, #    utc_start 2019-04-06 16:30:00 (Sat)
  63705976200, #      utc_end 2019-10-05 16:30:00 (Sat)
  63690285600, #  local_start 2019-04-07 02:00:00 (Sun)
  63706010400, #    local_end 2019-10-06 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  63705976200, #    utc_start 2019-10-05 16:30:00 (Sat)
  63721701000, #      utc_end 2020-04-04 16:30:00 (Sat)
  63706014000, #  local_start 2019-10-06 03:00:00 (Sun)
  63721738800, #    local_end 2020-04-05 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  63721701000, #    utc_start 2020-04-04 16:30:00 (Sat)
  63737425800, #      utc_end 2020-10-03 16:30:00 (Sat)
  63721735200, #  local_start 2020-04-05 02:00:00 (Sun)
  63737460000, #    local_end 2020-10-04 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  63737425800, #    utc_start 2020-10-03 16:30:00 (Sat)
  63753150600, #      utc_end 2021-04-03 16:30:00 (Sat)
  63737463600, #  local_start 2020-10-04 03:00:00 (Sun)
  63753188400, #    local_end 2021-04-04 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  63753150600, #    utc_start 2021-04-03 16:30:00 (Sat)
  63768875400, #      utc_end 2021-10-02 16:30:00 (Sat)
  63753184800, #  local_start 2021-04-04 02:00:00 (Sun)
  63768909600, #    local_end 2021-10-03 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  63768875400, #    utc_start 2021-10-02 16:30:00 (Sat)
  63784600200, #      utc_end 2022-04-02 16:30:00 (Sat)
  63768913200, #  local_start 2021-10-03 03:00:00 (Sun)
  63784638000, #    local_end 2022-04-03 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  63784600200, #    utc_start 2022-04-02 16:30:00 (Sat)
  63800325000, #      utc_end 2022-10-01 16:30:00 (Sat)
  63784634400, #  local_start 2022-04-03 02:00:00 (Sun)
  63800359200, #    local_end 2022-10-02 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  63800325000, #    utc_start 2022-10-01 16:30:00 (Sat)
  63816049800, #      utc_end 2023-04-01 16:30:00 (Sat)
  63800362800, #  local_start 2022-10-02 03:00:00 (Sun)
  63816087600, #    local_end 2023-04-02 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  63816049800, #    utc_start 2023-04-01 16:30:00 (Sat)
  63831774600, #      utc_end 2023-09-30 16:30:00 (Sat)
  63816084000, #  local_start 2023-04-02 02:00:00 (Sun)
  63831808800, #    local_end 2023-10-01 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  63831774600, #    utc_start 2023-09-30 16:30:00 (Sat)
  63848104200, #      utc_end 2024-04-06 16:30:00 (Sat)
  63831812400, #  local_start 2023-10-01 03:00:00 (Sun)
  63848142000, #    local_end 2024-04-07 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  63848104200, #    utc_start 2024-04-06 16:30:00 (Sat)
  63863829000, #      utc_end 2024-10-05 16:30:00 (Sat)
  63848138400, #  local_start 2024-04-07 02:00:00 (Sun)
  63863863200, #    local_end 2024-10-06 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  63863829000, #    utc_start 2024-10-05 16:30:00 (Sat)
  63879553800, #      utc_end 2025-04-05 16:30:00 (Sat)
  63863866800, #  local_start 2024-10-06 03:00:00 (Sun)
  63879591600, #    local_end 2025-04-06 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  63879553800, #    utc_start 2025-04-05 16:30:00 (Sat)
  63895278600, #      utc_end 2025-10-04 16:30:00 (Sat)
  63879588000, #  local_start 2025-04-06 02:00:00 (Sun)
  63895312800, #    local_end 2025-10-05 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  63895278600, #    utc_start 2025-10-04 16:30:00 (Sat)
  63911003400, #      utc_end 2026-04-04 16:30:00 (Sat)
  63895316400, #  local_start 2025-10-05 03:00:00 (Sun)
  63911041200, #    local_end 2026-04-05 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  63911003400, #    utc_start 2026-04-04 16:30:00 (Sat)
  63926728200, #      utc_end 2026-10-03 16:30:00 (Sat)
  63911037600, #  local_start 2026-04-05 02:00:00 (Sun)
  63926762400, #    local_end 2026-10-04 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  63926728200, #    utc_start 2026-10-03 16:30:00 (Sat)
  63942453000, #      utc_end 2027-04-03 16:30:00 (Sat)
  63926766000, #  local_start 2026-10-04 03:00:00 (Sun)
  63942490800, #    local_end 2027-04-04 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  63942453000, #    utc_start 2027-04-03 16:30:00 (Sat)
  63958177800, #      utc_end 2027-10-02 16:30:00 (Sat)
  63942487200, #  local_start 2027-04-04 02:00:00 (Sun)
  63958212000, #    local_end 2027-10-03 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  63958177800, #    utc_start 2027-10-02 16:30:00 (Sat)
  63973902600, #      utc_end 2028-04-01 16:30:00 (Sat)
  63958215600, #  local_start 2027-10-03 03:00:00 (Sun)
  63973940400, #    local_end 2028-04-02 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  63973902600, #    utc_start 2028-04-01 16:30:00 (Sat)
  63989627400, #      utc_end 2028-09-30 16:30:00 (Sat)
  63973936800, #  local_start 2028-04-02 02:00:00 (Sun)
  63989661600, #    local_end 2028-10-01 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  63989627400, #    utc_start 2028-09-30 16:30:00 (Sat)
  64005352200, #      utc_end 2029-03-31 16:30:00 (Sat)
  63989665200, #  local_start 2028-10-01 03:00:00 (Sun)
  64005390000, #    local_end 2029-04-01 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  64005352200, #    utc_start 2029-03-31 16:30:00 (Sat)
  64021681800, #      utc_end 2029-10-06 16:30:00 (Sat)
  64005386400, #  local_start 2029-04-01 02:00:00 (Sun)
  64021716000, #    local_end 2029-10-07 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  64021681800, #    utc_start 2029-10-06 16:30:00 (Sat)
  64037406600, #      utc_end 2030-04-06 16:30:00 (Sat)
  64021719600, #  local_start 2029-10-07 03:00:00 (Sun)
  64037444400, #    local_end 2030-04-07 03:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  64037406600, #    utc_start 2030-04-06 16:30:00 (Sat)
  64053131400, #      utc_end 2030-10-05 16:30:00 (Sat)
  64037440800, #  local_start 2030-04-07 02:00:00 (Sun)
  64053165600, #    local_end 2030-10-06 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {65}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { 34200 }
  
  my $last_observance = bless( {
    'format' => 'AC%sT',
    'gmtoff' => '9:30',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 730120,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 730120,
      'utc_rd_secs' => 0,
      'utc_year' => 2001
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => 34200,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 730119,
      'local_rd_secs' => 48600,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 730119,
      'utc_rd_secs' => 48600,
      'utc_year' => 2000
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00s',
      'from' => '2008',
      'in' => 'Apr',
      'letter' => 'S',
      'name' => 'AS',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00s',
      'from' => '2008',
      'in' => 'Oct',
      'letter' => 'D',
      'name' => 'AS',
      'offset_from_std' => 3600,
      'on' => 'Sun>=1',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AUSTRALIA_BROKEN_HILL

    $main::fatpacked{"DateTime/TimeZone/Australia/Currie.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AUSTRALIA_CURRIE';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/australasia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Australia::Currie;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Australia::Currie::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59789888672, #      utc_end 1895-08-31 14:24:32 (Sat)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59789923200, #    local_end 1895-09-01 00:00:00 (Sun)
  34528,
  0,
  'LMT',
      ],
      [
  59789888672, #    utc_start 1895-08-31 14:24:32 (Sat)
  60455174400, #      utc_end 1916-09-30 16:00:00 (Sat)
  59789924672, #  local_start 1895-09-01 00:24:32 (Sun)
  60455210400, #    local_end 1916-10-01 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  60455174400, #    utc_start 1916-09-30 16:00:00 (Sat)
  60465790800, #      utc_end 1917-01-31 13:00:00 (Wed)
  60455214000, #  local_start 1916-10-01 03:00:00 (Sun)
  60465830400, #    local_end 1917-02-01 00:00:00 (Thu)
  39600,
  1,
  'AEDT',
      ],
      [
  60465790800, #    utc_start 1917-01-31 13:00:00 (Wed)
  60470290800, #      utc_end 1917-03-24 15:00:00 (Sat)
  60465830400, #  local_start 1917-02-01 00:00:00 (Thu)
  60470330400, #    local_end 1917-03-25 02:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  60470290800, #    utc_start 1917-03-24 15:00:00 (Sat)
  61252041600, #      utc_end 1941-12-31 16:00:00 (Wed)
  60470326800, #  local_start 1917-03-25 01:00:00 (Sun)
  61252077600, #    local_end 1942-01-01 02:00:00 (Thu)
  36000,
  0,
  'AEST',
      ],
      [
  61252041600, #    utc_start 1941-12-31 16:00:00 (Wed)
  61259554800, #      utc_end 1942-03-28 15:00:00 (Sat)
  61252081200, #  local_start 1942-01-01 03:00:00 (Thu)
  61259594400, #    local_end 1942-03-29 02:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  61259554800, #    utc_start 1942-03-28 15:00:00 (Sat)
  61275283200, #      utc_end 1942-09-26 16:00:00 (Sat)
  61259590800, #  local_start 1942-03-29 01:00:00 (Sun)
  61275319200, #    local_end 1942-09-27 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  61275283200, #    utc_start 1942-09-26 16:00:00 (Sat)
  61291004400, #      utc_end 1943-03-27 15:00:00 (Sat)
  61275322800, #  local_start 1942-09-27 03:00:00 (Sun)
  61291044000, #    local_end 1943-03-28 02:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  61291004400, #    utc_start 1943-03-27 15:00:00 (Sat)
  61307337600, #      utc_end 1943-10-02 16:00:00 (Sat)
  61291040400, #  local_start 1943-03-28 01:00:00 (Sun)
  61307373600, #    local_end 1943-10-03 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  61307337600, #    utc_start 1943-10-02 16:00:00 (Sat)
  61322454000, #      utc_end 1944-03-25 15:00:00 (Sat)
  61307377200, #  local_start 1943-10-03 03:00:00 (Sun)
  61322493600, #    local_end 1944-03-26 02:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  61322454000, #    utc_start 1944-03-25 15:00:00 (Sat)
  62182821600, #      utc_end 1971-06-30 14:00:00 (Wed)
  61322490000, #  local_start 1944-03-26 01:00:00 (Sun)
  62182857600, #    local_end 1971-07-01 00:00:00 (Thu)
  36000,
  0,
  'AEST',
      ],
      [
  62182821600, #    utc_start 1971-06-30 14:00:00 (Wed)
  62193369600, #      utc_end 1971-10-30 16:00:00 (Sat)
  62182857600, #  local_start 1971-07-01 00:00:00 (Thu)
  62193405600, #    local_end 1971-10-31 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62193369600, #    utc_start 1971-10-30 16:00:00 (Sat)
  62203651200, #      utc_end 1972-02-26 16:00:00 (Sat)
  62193409200, #  local_start 1971-10-31 03:00:00 (Sun)
  62203690800, #    local_end 1972-02-27 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62203651200, #    utc_start 1972-02-26 16:00:00 (Sat)
  62224819200, #      utc_end 1972-10-28 16:00:00 (Sat)
  62203687200, #  local_start 1972-02-27 02:00:00 (Sun)
  62224855200, #    local_end 1972-10-29 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62224819200, #    utc_start 1972-10-28 16:00:00 (Sat)
  62235705600, #      utc_end 1973-03-03 16:00:00 (Sat)
  62224858800, #  local_start 1972-10-29 03:00:00 (Sun)
  62235745200, #    local_end 1973-03-04 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62235705600, #    utc_start 1973-03-03 16:00:00 (Sat)
  62256268800, #      utc_end 1973-10-27 16:00:00 (Sat)
  62235741600, #  local_start 1973-03-04 02:00:00 (Sun)
  62256304800, #    local_end 1973-10-28 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62256268800, #    utc_start 1973-10-27 16:00:00 (Sat)
  62267155200, #      utc_end 1974-03-02 16:00:00 (Sat)
  62256308400, #  local_start 1973-10-28 03:00:00 (Sun)
  62267194800, #    local_end 1974-03-03 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62267155200, #    utc_start 1974-03-02 16:00:00 (Sat)
  62287718400, #      utc_end 1974-10-26 16:00:00 (Sat)
  62267191200, #  local_start 1974-03-03 02:00:00 (Sun)
  62287754400, #    local_end 1974-10-27 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62287718400, #    utc_start 1974-10-26 16:00:00 (Sat)
  62298604800, #      utc_end 1975-03-01 16:00:00 (Sat)
  62287758000, #  local_start 1974-10-27 03:00:00 (Sun)
  62298644400, #    local_end 1975-03-02 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62298604800, #    utc_start 1975-03-01 16:00:00 (Sat)
  62319168000, #      utc_end 1975-10-25 16:00:00 (Sat)
  62298640800, #  local_start 1975-03-02 02:00:00 (Sun)
  62319204000, #    local_end 1975-10-26 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62319168000, #    utc_start 1975-10-25 16:00:00 (Sat)
  62330659200, #      utc_end 1976-03-06 16:00:00 (Sat)
  62319207600, #  local_start 1975-10-26 03:00:00 (Sun)
  62330698800, #    local_end 1976-03-07 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62330659200, #    utc_start 1976-03-06 16:00:00 (Sat)
  62351222400, #      utc_end 1976-10-30 16:00:00 (Sat)
  62330695200, #  local_start 1976-03-07 02:00:00 (Sun)
  62351258400, #    local_end 1976-10-31 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62351222400, #    utc_start 1976-10-30 16:00:00 (Sat)
  62362108800, #      utc_end 1977-03-05 16:00:00 (Sat)
  62351262000, #  local_start 1976-10-31 03:00:00 (Sun)
  62362148400, #    local_end 1977-03-06 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62362108800, #    utc_start 1977-03-05 16:00:00 (Sat)
  62382672000, #      utc_end 1977-10-29 16:00:00 (Sat)
  62362144800, #  local_start 1977-03-06 02:00:00 (Sun)
  62382708000, #    local_end 1977-10-30 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62382672000, #    utc_start 1977-10-29 16:00:00 (Sat)
  62393558400, #      utc_end 1978-03-04 16:00:00 (Sat)
  62382711600, #  local_start 1977-10-30 03:00:00 (Sun)
  62393598000, #    local_end 1978-03-05 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62393558400, #    utc_start 1978-03-04 16:00:00 (Sat)
  62414121600, #      utc_end 1978-10-28 16:00:00 (Sat)
  62393594400, #  local_start 1978-03-05 02:00:00 (Sun)
  62414157600, #    local_end 1978-10-29 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62414121600, #    utc_start 1978-10-28 16:00:00 (Sat)
  62425008000, #      utc_end 1979-03-03 16:00:00 (Sat)
  62414161200, #  local_start 1978-10-29 03:00:00 (Sun)
  62425047600, #    local_end 1979-03-04 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62425008000, #    utc_start 1979-03-03 16:00:00 (Sat)
  62445571200, #      utc_end 1979-10-27 16:00:00 (Sat)
  62425044000, #  local_start 1979-03-04 02:00:00 (Sun)
  62445607200, #    local_end 1979-10-28 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62445571200, #    utc_start 1979-10-27 16:00:00 (Sat)
  62456457600, #      utc_end 1980-03-01 16:00:00 (Sat)
  62445610800, #  local_start 1979-10-28 03:00:00 (Sun)
  62456497200, #    local_end 1980-03-02 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62456457600, #    utc_start 1980-03-01 16:00:00 (Sat)
  62477020800, #      utc_end 1980-10-25 16:00:00 (Sat)
  62456493600, #  local_start 1980-03-02 02:00:00 (Sun)
  62477056800, #    local_end 1980-10-26 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62477020800, #    utc_start 1980-10-25 16:00:00 (Sat)
  62487907200, #      utc_end 1981-02-28 16:00:00 (Sat)
  62477060400, #  local_start 1980-10-26 03:00:00 (Sun)
  62487946800, #    local_end 1981-03-01 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62487907200, #    utc_start 1981-02-28 16:00:00 (Sat)
  62508470400, #      utc_end 1981-10-24 16:00:00 (Sat)
  62487943200, #  local_start 1981-03-01 02:00:00 (Sun)
  62508506400, #    local_end 1981-10-25 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62508470400, #    utc_start 1981-10-24 16:00:00 (Sat)
  62521776000, #      utc_end 1982-03-27 16:00:00 (Sat)
  62508510000, #  local_start 1981-10-25 03:00:00 (Sun)
  62521815600, #    local_end 1982-03-28 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62521776000, #    utc_start 1982-03-27 16:00:00 (Sat)
  62540524800, #      utc_end 1982-10-30 16:00:00 (Sat)
  62521812000, #  local_start 1982-03-28 02:00:00 (Sun)
  62540560800, #    local_end 1982-10-31 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62540524800, #    utc_start 1982-10-30 16:00:00 (Sat)
  62553225600, #      utc_end 1983-03-26 16:00:00 (Sat)
  62540564400, #  local_start 1982-10-31 03:00:00 (Sun)
  62553265200, #    local_end 1983-03-27 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62553225600, #    utc_start 1983-03-26 16:00:00 (Sat)
  62571974400, #      utc_end 1983-10-29 16:00:00 (Sat)
  62553261600, #  local_start 1983-03-27 02:00:00 (Sun)
  62572010400, #    local_end 1983-10-30 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62571974400, #    utc_start 1983-10-29 16:00:00 (Sat)
  62582860800, #      utc_end 1984-03-03 16:00:00 (Sat)
  62572014000, #  local_start 1983-10-30 03:00:00 (Sun)
  62582900400, #    local_end 1984-03-04 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62582860800, #    utc_start 1984-03-03 16:00:00 (Sat)
  62603424000, #      utc_end 1984-10-27 16:00:00 (Sat)
  62582896800, #  local_start 1984-03-04 02:00:00 (Sun)
  62603460000, #    local_end 1984-10-28 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62603424000, #    utc_start 1984-10-27 16:00:00 (Sat)
  62614310400, #      utc_end 1985-03-02 16:00:00 (Sat)
  62603463600, #  local_start 1984-10-28 03:00:00 (Sun)
  62614350000, #    local_end 1985-03-03 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62614310400, #    utc_start 1985-03-02 16:00:00 (Sat)
  62634873600, #      utc_end 1985-10-26 16:00:00 (Sat)
  62614346400, #  local_start 1985-03-03 02:00:00 (Sun)
  62634909600, #    local_end 1985-10-27 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62634873600, #    utc_start 1985-10-26 16:00:00 (Sat)
  62645760000, #      utc_end 1986-03-01 16:00:00 (Sat)
  62634913200, #  local_start 1985-10-27 03:00:00 (Sun)
  62645799600, #    local_end 1986-03-02 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62645760000, #    utc_start 1986-03-01 16:00:00 (Sat)
  62665718400, #      utc_end 1986-10-18 16:00:00 (Sat)
  62645796000, #  local_start 1986-03-02 02:00:00 (Sun)
  62665754400, #    local_end 1986-10-19 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62665718400, #    utc_start 1986-10-18 16:00:00 (Sat)
  62678419200, #      utc_end 1987-03-14 16:00:00 (Sat)
  62665758000, #  local_start 1986-10-19 03:00:00 (Sun)
  62678458800, #    local_end 1987-03-15 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62678419200, #    utc_start 1987-03-14 16:00:00 (Sat)
  62697772800, #      utc_end 1987-10-24 16:00:00 (Sat)
  62678455200, #  local_start 1987-03-15 02:00:00 (Sun)
  62697808800, #    local_end 1987-10-25 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62697772800, #    utc_start 1987-10-24 16:00:00 (Sat)
  62710473600, #      utc_end 1988-03-19 16:00:00 (Sat)
  62697812400, #  local_start 1987-10-25 03:00:00 (Sun)
  62710513200, #    local_end 1988-03-20 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62710473600, #    utc_start 1988-03-19 16:00:00 (Sat)
  62729827200, #      utc_end 1988-10-29 16:00:00 (Sat)
  62710509600, #  local_start 1988-03-20 02:00:00 (Sun)
  62729863200, #    local_end 1988-10-30 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62729827200, #    utc_start 1988-10-29 16:00:00 (Sat)
  62741923200, #      utc_end 1989-03-18 16:00:00 (Sat)
  62729866800, #  local_start 1988-10-30 03:00:00 (Sun)
  62741962800, #    local_end 1989-03-19 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62741923200, #    utc_start 1989-03-18 16:00:00 (Sat)
  62761276800, #      utc_end 1989-10-28 16:00:00 (Sat)
  62741959200, #  local_start 1989-03-19 02:00:00 (Sun)
  62761312800, #    local_end 1989-10-29 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62761276800, #    utc_start 1989-10-28 16:00:00 (Sat)
  62773372800, #      utc_end 1990-03-17 16:00:00 (Sat)
  62761316400, #  local_start 1989-10-29 03:00:00 (Sun)
  62773412400, #    local_end 1990-03-18 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62773372800, #    utc_start 1990-03-17 16:00:00 (Sat)
  62792726400, #      utc_end 1990-10-27 16:00:00 (Sat)
  62773408800, #  local_start 1990-03-18 02:00:00 (Sun)
  62792762400, #    local_end 1990-10-28 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62792726400, #    utc_start 1990-10-27 16:00:00 (Sat)
  62806032000, #      utc_end 1991-03-30 16:00:00 (Sat)
  62792766000, #  local_start 1990-10-28 03:00:00 (Sun)
  62806071600, #    local_end 1991-03-31 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62806032000, #    utc_start 1991-03-30 16:00:00 (Sat)
  62822361600, #      utc_end 1991-10-05 16:00:00 (Sat)
  62806068000, #  local_start 1991-03-31 02:00:00 (Sun)
  62822397600, #    local_end 1991-10-06 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62822361600, #    utc_start 1991-10-05 16:00:00 (Sat)
  62837481600, #      utc_end 1992-03-28 16:00:00 (Sat)
  62822401200, #  local_start 1991-10-06 03:00:00 (Sun)
  62837521200, #    local_end 1992-03-29 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62837481600, #    utc_start 1992-03-28 16:00:00 (Sat)
  62853811200, #      utc_end 1992-10-03 16:00:00 (Sat)
  62837517600, #  local_start 1992-03-29 02:00:00 (Sun)
  62853847200, #    local_end 1992-10-04 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62853811200, #    utc_start 1992-10-03 16:00:00 (Sat)
  62868931200, #      utc_end 1993-03-27 16:00:00 (Sat)
  62853850800, #  local_start 1992-10-04 03:00:00 (Sun)
  62868970800, #    local_end 1993-03-28 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62868931200, #    utc_start 1993-03-27 16:00:00 (Sat)
  62885260800, #      utc_end 1993-10-02 16:00:00 (Sat)
  62868967200, #  local_start 1993-03-28 02:00:00 (Sun)
  62885296800, #    local_end 1993-10-03 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62885260800, #    utc_start 1993-10-02 16:00:00 (Sat)
  62900380800, #      utc_end 1994-03-26 16:00:00 (Sat)
  62885300400, #  local_start 1993-10-03 03:00:00 (Sun)
  62900420400, #    local_end 1994-03-27 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62900380800, #    utc_start 1994-03-26 16:00:00 (Sat)
  62916710400, #      utc_end 1994-10-01 16:00:00 (Sat)
  62900416800, #  local_start 1994-03-27 02:00:00 (Sun)
  62916746400, #    local_end 1994-10-02 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62916710400, #    utc_start 1994-10-01 16:00:00 (Sat)
  62931830400, #      utc_end 1995-03-25 16:00:00 (Sat)
  62916750000, #  local_start 1994-10-02 03:00:00 (Sun)
  62931870000, #    local_end 1995-03-26 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62931830400, #    utc_start 1995-03-25 16:00:00 (Sat)
  62948160000, #      utc_end 1995-09-30 16:00:00 (Sat)
  62931866400, #  local_start 1995-03-26 02:00:00 (Sun)
  62948196000, #    local_end 1995-10-01 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62948160000, #    utc_start 1995-09-30 16:00:00 (Sat)
  62963884800, #      utc_end 1996-03-30 16:00:00 (Sat)
  62948199600, #  local_start 1995-10-01 03:00:00 (Sun)
  62963924400, #    local_end 1996-03-31 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62963884800, #    utc_start 1996-03-30 16:00:00 (Sat)
  62980214400, #      utc_end 1996-10-05 16:00:00 (Sat)
  62963920800, #  local_start 1996-03-31 02:00:00 (Sun)
  62980250400, #    local_end 1996-10-06 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62980214400, #    utc_start 1996-10-05 16:00:00 (Sat)
  62995334400, #      utc_end 1997-03-29 16:00:00 (Sat)
  62980254000, #  local_start 1996-10-06 03:00:00 (Sun)
  62995374000, #    local_end 1997-03-30 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62995334400, #    utc_start 1997-03-29 16:00:00 (Sat)
  63011664000, #      utc_end 1997-10-04 16:00:00 (Sat)
  62995370400, #  local_start 1997-03-30 02:00:00 (Sun)
  63011700000, #    local_end 1997-10-05 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63011664000, #    utc_start 1997-10-04 16:00:00 (Sat)
  63026784000, #      utc_end 1998-03-28 16:00:00 (Sat)
  63011703600, #  local_start 1997-10-05 03:00:00 (Sun)
  63026823600, #    local_end 1998-03-29 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63026784000, #    utc_start 1998-03-28 16:00:00 (Sat)
  63043113600, #      utc_end 1998-10-03 16:00:00 (Sat)
  63026820000, #  local_start 1998-03-29 02:00:00 (Sun)
  63043149600, #    local_end 1998-10-04 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63043113600, #    utc_start 1998-10-03 16:00:00 (Sat)
  63058233600, #      utc_end 1999-03-27 16:00:00 (Sat)
  63043153200, #  local_start 1998-10-04 03:00:00 (Sun)
  63058273200, #    local_end 1999-03-28 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63058233600, #    utc_start 1999-03-27 16:00:00 (Sat)
  63074563200, #      utc_end 1999-10-02 16:00:00 (Sat)
  63058269600, #  local_start 1999-03-28 02:00:00 (Sun)
  63074599200, #    local_end 1999-10-03 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63074563200, #    utc_start 1999-10-02 16:00:00 (Sat)
  63089683200, #      utc_end 2000-03-25 16:00:00 (Sat)
  63074602800, #  local_start 1999-10-03 03:00:00 (Sun)
  63089722800, #    local_end 2000-03-26 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63089683200, #    utc_start 2000-03-25 16:00:00 (Sat)
  63102988800, #      utc_end 2000-08-26 16:00:00 (Sat)
  63089719200, #  local_start 2000-03-26 02:00:00 (Sun)
  63103024800, #    local_end 2000-08-27 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63102988800, #    utc_start 2000-08-26 16:00:00 (Sat)
  63121132800, #      utc_end 2001-03-24 16:00:00 (Sat)
  63103028400, #  local_start 2000-08-27 03:00:00 (Sun)
  63121172400, #    local_end 2001-03-25 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63121132800, #    utc_start 2001-03-24 16:00:00 (Sat)
  63138067200, #      utc_end 2001-10-06 16:00:00 (Sat)
  63121168800, #  local_start 2001-03-25 02:00:00 (Sun)
  63138103200, #    local_end 2001-10-07 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63138067200, #    utc_start 2001-10-06 16:00:00 (Sat)
  63153187200, #      utc_end 2002-03-30 16:00:00 (Sat)
  63138106800, #  local_start 2001-10-07 03:00:00 (Sun)
  63153226800, #    local_end 2002-03-31 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63153187200, #    utc_start 2002-03-30 16:00:00 (Sat)
  63169516800, #      utc_end 2002-10-05 16:00:00 (Sat)
  63153223200, #  local_start 2002-03-31 02:00:00 (Sun)
  63169552800, #    local_end 2002-10-06 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63169516800, #    utc_start 2002-10-05 16:00:00 (Sat)
  63184636800, #      utc_end 2003-03-29 16:00:00 (Sat)
  63169556400, #  local_start 2002-10-06 03:00:00 (Sun)
  63184676400, #    local_end 2003-03-30 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63184636800, #    utc_start 2003-03-29 16:00:00 (Sat)
  63200966400, #      utc_end 2003-10-04 16:00:00 (Sat)
  63184672800, #  local_start 2003-03-30 02:00:00 (Sun)
  63201002400, #    local_end 2003-10-05 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63200966400, #    utc_start 2003-10-04 16:00:00 (Sat)
  63216086400, #      utc_end 2004-03-27 16:00:00 (Sat)
  63201006000, #  local_start 2003-10-05 03:00:00 (Sun)
  63216126000, #    local_end 2004-03-28 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63216086400, #    utc_start 2004-03-27 16:00:00 (Sat)
  63232416000, #      utc_end 2004-10-02 16:00:00 (Sat)
  63216122400, #  local_start 2004-03-28 02:00:00 (Sun)
  63232452000, #    local_end 2004-10-03 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63232416000, #    utc_start 2004-10-02 16:00:00 (Sat)
  63247536000, #      utc_end 2005-03-26 16:00:00 (Sat)
  63232455600, #  local_start 2004-10-03 03:00:00 (Sun)
  63247575600, #    local_end 2005-03-27 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63247536000, #    utc_start 2005-03-26 16:00:00 (Sat)
  63263865600, #      utc_end 2005-10-01 16:00:00 (Sat)
  63247572000, #  local_start 2005-03-27 02:00:00 (Sun)
  63263901600, #    local_end 2005-10-02 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63263865600, #    utc_start 2005-10-01 16:00:00 (Sat)
  63279590400, #      utc_end 2006-04-01 16:00:00 (Sat)
  63263905200, #  local_start 2005-10-02 03:00:00 (Sun)
  63279630000, #    local_end 2006-04-02 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63279590400, #    utc_start 2006-04-01 16:00:00 (Sat)
  63295315200, #      utc_end 2006-09-30 16:00:00 (Sat)
  63279626400, #  local_start 2006-04-02 02:00:00 (Sun)
  63295351200, #    local_end 2006-10-01 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63295315200, #    utc_start 2006-09-30 16:00:00 (Sat)
  63310435200, #      utc_end 2007-03-24 16:00:00 (Sat)
  63295354800, #  local_start 2006-10-01 03:00:00 (Sun)
  63310474800, #    local_end 2007-03-25 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63310435200, #    utc_start 2007-03-24 16:00:00 (Sat)
  63327369600, #      utc_end 2007-10-06 16:00:00 (Sat)
  63310471200, #  local_start 2007-03-25 02:00:00 (Sun)
  63327405600, #    local_end 2007-10-07 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63327369600, #    utc_start 2007-10-06 16:00:00 (Sat)
  63343094400, #      utc_end 2008-04-05 16:00:00 (Sat)
  63327409200, #  local_start 2007-10-07 03:00:00 (Sun)
  63343134000, #    local_end 2008-04-06 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63343094400, #    utc_start 2008-04-05 16:00:00 (Sat)
  63358819200, #      utc_end 2008-10-04 16:00:00 (Sat)
  63343130400, #  local_start 2008-04-06 02:00:00 (Sun)
  63358855200, #    local_end 2008-10-05 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63358819200, #    utc_start 2008-10-04 16:00:00 (Sat)
  63374544000, #      utc_end 2009-04-04 16:00:00 (Sat)
  63358858800, #  local_start 2008-10-05 03:00:00 (Sun)
  63374583600, #    local_end 2009-04-05 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63374544000, #    utc_start 2009-04-04 16:00:00 (Sat)
  63390268800, #      utc_end 2009-10-03 16:00:00 (Sat)
  63374580000, #  local_start 2009-04-05 02:00:00 (Sun)
  63390304800, #    local_end 2009-10-04 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63390268800, #    utc_start 2009-10-03 16:00:00 (Sat)
  63405993600, #      utc_end 2010-04-03 16:00:00 (Sat)
  63390308400, #  local_start 2009-10-04 03:00:00 (Sun)
  63406033200, #    local_end 2010-04-04 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63405993600, #    utc_start 2010-04-03 16:00:00 (Sat)
  63421718400, #      utc_end 2010-10-02 16:00:00 (Sat)
  63406029600, #  local_start 2010-04-04 02:00:00 (Sun)
  63421754400, #    local_end 2010-10-03 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63421718400, #    utc_start 2010-10-02 16:00:00 (Sat)
  63437443200, #      utc_end 2011-04-02 16:00:00 (Sat)
  63421758000, #  local_start 2010-10-03 03:00:00 (Sun)
  63437482800, #    local_end 2011-04-03 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63437443200, #    utc_start 2011-04-02 16:00:00 (Sat)
  63453168000, #      utc_end 2011-10-01 16:00:00 (Sat)
  63437479200, #  local_start 2011-04-03 02:00:00 (Sun)
  63453204000, #    local_end 2011-10-02 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63453168000, #    utc_start 2011-10-01 16:00:00 (Sat)
  63468892800, #      utc_end 2012-03-31 16:00:00 (Sat)
  63453207600, #  local_start 2011-10-02 03:00:00 (Sun)
  63468932400, #    local_end 2012-04-01 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63468892800, #    utc_start 2012-03-31 16:00:00 (Sat)
  63485222400, #      utc_end 2012-10-06 16:00:00 (Sat)
  63468928800, #  local_start 2012-04-01 02:00:00 (Sun)
  63485258400, #    local_end 2012-10-07 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63485222400, #    utc_start 2012-10-06 16:00:00 (Sat)
  63500947200, #      utc_end 2013-04-06 16:00:00 (Sat)
  63485262000, #  local_start 2012-10-07 03:00:00 (Sun)
  63500986800, #    local_end 2013-04-07 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63500947200, #    utc_start 2013-04-06 16:00:00 (Sat)
  63516672000, #      utc_end 2013-10-05 16:00:00 (Sat)
  63500983200, #  local_start 2013-04-07 02:00:00 (Sun)
  63516708000, #    local_end 2013-10-06 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63516672000, #    utc_start 2013-10-05 16:00:00 (Sat)
  63532396800, #      utc_end 2014-04-05 16:00:00 (Sat)
  63516711600, #  local_start 2013-10-06 03:00:00 (Sun)
  63532436400, #    local_end 2014-04-06 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63532396800, #    utc_start 2014-04-05 16:00:00 (Sat)
  63548121600, #      utc_end 2014-10-04 16:00:00 (Sat)
  63532432800, #  local_start 2014-04-06 02:00:00 (Sun)
  63548157600, #    local_end 2014-10-05 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63548121600, #    utc_start 2014-10-04 16:00:00 (Sat)
  63563846400, #      utc_end 2015-04-04 16:00:00 (Sat)
  63548161200, #  local_start 2014-10-05 03:00:00 (Sun)
  63563886000, #    local_end 2015-04-05 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63563846400, #    utc_start 2015-04-04 16:00:00 (Sat)
  63579571200, #      utc_end 2015-10-03 16:00:00 (Sat)
  63563882400, #  local_start 2015-04-05 02:00:00 (Sun)
  63579607200, #    local_end 2015-10-04 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63579571200, #    utc_start 2015-10-03 16:00:00 (Sat)
  63595296000, #      utc_end 2016-04-02 16:00:00 (Sat)
  63579610800, #  local_start 2015-10-04 03:00:00 (Sun)
  63595335600, #    local_end 2016-04-03 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63595296000, #    utc_start 2016-04-02 16:00:00 (Sat)
  63611020800, #      utc_end 2016-10-01 16:00:00 (Sat)
  63595332000, #  local_start 2016-04-03 02:00:00 (Sun)
  63611056800, #    local_end 2016-10-02 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63611020800, #    utc_start 2016-10-01 16:00:00 (Sat)
  63626745600, #      utc_end 2017-04-01 16:00:00 (Sat)
  63611060400, #  local_start 2016-10-02 03:00:00 (Sun)
  63626785200, #    local_end 2017-04-02 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63626745600, #    utc_start 2017-04-01 16:00:00 (Sat)
  63642470400, #      utc_end 2017-09-30 16:00:00 (Sat)
  63626781600, #  local_start 2017-04-02 02:00:00 (Sun)
  63642506400, #    local_end 2017-10-01 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63642470400, #    utc_start 2017-09-30 16:00:00 (Sat)
  63658195200, #      utc_end 2018-03-31 16:00:00 (Sat)
  63642510000, #  local_start 2017-10-01 03:00:00 (Sun)
  63658234800, #    local_end 2018-04-01 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63658195200, #    utc_start 2018-03-31 16:00:00 (Sat)
  63674524800, #      utc_end 2018-10-06 16:00:00 (Sat)
  63658231200, #  local_start 2018-04-01 02:00:00 (Sun)
  63674560800, #    local_end 2018-10-07 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63674524800, #    utc_start 2018-10-06 16:00:00 (Sat)
  63690249600, #      utc_end 2019-04-06 16:00:00 (Sat)
  63674564400, #  local_start 2018-10-07 03:00:00 (Sun)
  63690289200, #    local_end 2019-04-07 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63690249600, #    utc_start 2019-04-06 16:00:00 (Sat)
  63705974400, #      utc_end 2019-10-05 16:00:00 (Sat)
  63690285600, #  local_start 2019-04-07 02:00:00 (Sun)
  63706010400, #    local_end 2019-10-06 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63705974400, #    utc_start 2019-10-05 16:00:00 (Sat)
  63721699200, #      utc_end 2020-04-04 16:00:00 (Sat)
  63706014000, #  local_start 2019-10-06 03:00:00 (Sun)
  63721738800, #    local_end 2020-04-05 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63721699200, #    utc_start 2020-04-04 16:00:00 (Sat)
  63737424000, #      utc_end 2020-10-03 16:00:00 (Sat)
  63721735200, #  local_start 2020-04-05 02:00:00 (Sun)
  63737460000, #    local_end 2020-10-04 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63737424000, #    utc_start 2020-10-03 16:00:00 (Sat)
  63753148800, #      utc_end 2021-04-03 16:00:00 (Sat)
  63737463600, #  local_start 2020-10-04 03:00:00 (Sun)
  63753188400, #    local_end 2021-04-04 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63753148800, #    utc_start 2021-04-03 16:00:00 (Sat)
  63768873600, #      utc_end 2021-10-02 16:00:00 (Sat)
  63753184800, #  local_start 2021-04-04 02:00:00 (Sun)
  63768909600, #    local_end 2021-10-03 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63768873600, #    utc_start 2021-10-02 16:00:00 (Sat)
  63784598400, #      utc_end 2022-04-02 16:00:00 (Sat)
  63768913200, #  local_start 2021-10-03 03:00:00 (Sun)
  63784638000, #    local_end 2022-04-03 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63784598400, #    utc_start 2022-04-02 16:00:00 (Sat)
  63800323200, #      utc_end 2022-10-01 16:00:00 (Sat)
  63784634400, #  local_start 2022-04-03 02:00:00 (Sun)
  63800359200, #    local_end 2022-10-02 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63800323200, #    utc_start 2022-10-01 16:00:00 (Sat)
  63816048000, #      utc_end 2023-04-01 16:00:00 (Sat)
  63800362800, #  local_start 2022-10-02 03:00:00 (Sun)
  63816087600, #    local_end 2023-04-02 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63816048000, #    utc_start 2023-04-01 16:00:00 (Sat)
  63831772800, #      utc_end 2023-09-30 16:00:00 (Sat)
  63816084000, #  local_start 2023-04-02 02:00:00 (Sun)
  63831808800, #    local_end 2023-10-01 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63831772800, #    utc_start 2023-09-30 16:00:00 (Sat)
  63848102400, #      utc_end 2024-04-06 16:00:00 (Sat)
  63831812400, #  local_start 2023-10-01 03:00:00 (Sun)
  63848142000, #    local_end 2024-04-07 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63848102400, #    utc_start 2024-04-06 16:00:00 (Sat)
  63863827200, #      utc_end 2024-10-05 16:00:00 (Sat)
  63848138400, #  local_start 2024-04-07 02:00:00 (Sun)
  63863863200, #    local_end 2024-10-06 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63863827200, #    utc_start 2024-10-05 16:00:00 (Sat)
  63879552000, #      utc_end 2025-04-05 16:00:00 (Sat)
  63863866800, #  local_start 2024-10-06 03:00:00 (Sun)
  63879591600, #    local_end 2025-04-06 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63879552000, #    utc_start 2025-04-05 16:00:00 (Sat)
  63895276800, #      utc_end 2025-10-04 16:00:00 (Sat)
  63879588000, #  local_start 2025-04-06 02:00:00 (Sun)
  63895312800, #    local_end 2025-10-05 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63895276800, #    utc_start 2025-10-04 16:00:00 (Sat)
  63911001600, #      utc_end 2026-04-04 16:00:00 (Sat)
  63895316400, #  local_start 2025-10-05 03:00:00 (Sun)
  63911041200, #    local_end 2026-04-05 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63911001600, #    utc_start 2026-04-04 16:00:00 (Sat)
  63926726400, #      utc_end 2026-10-03 16:00:00 (Sat)
  63911037600, #  local_start 2026-04-05 02:00:00 (Sun)
  63926762400, #    local_end 2026-10-04 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63926726400, #    utc_start 2026-10-03 16:00:00 (Sat)
  63942451200, #      utc_end 2027-04-03 16:00:00 (Sat)
  63926766000, #  local_start 2026-10-04 03:00:00 (Sun)
  63942490800, #    local_end 2027-04-04 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63942451200, #    utc_start 2027-04-03 16:00:00 (Sat)
  63958176000, #      utc_end 2027-10-02 16:00:00 (Sat)
  63942487200, #  local_start 2027-04-04 02:00:00 (Sun)
  63958212000, #    local_end 2027-10-03 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63958176000, #    utc_start 2027-10-02 16:00:00 (Sat)
  63973900800, #      utc_end 2028-04-01 16:00:00 (Sat)
  63958215600, #  local_start 2027-10-03 03:00:00 (Sun)
  63973940400, #    local_end 2028-04-02 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63973900800, #    utc_start 2028-04-01 16:00:00 (Sat)
  63989625600, #      utc_end 2028-09-30 16:00:00 (Sat)
  63973936800, #  local_start 2028-04-02 02:00:00 (Sun)
  63989661600, #    local_end 2028-10-01 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63989625600, #    utc_start 2028-09-30 16:00:00 (Sat)
  64005350400, #      utc_end 2029-03-31 16:00:00 (Sat)
  63989665200, #  local_start 2028-10-01 03:00:00 (Sun)
  64005390000, #    local_end 2029-04-01 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  64005350400, #    utc_start 2029-03-31 16:00:00 (Sat)
  64021680000, #      utc_end 2029-10-06 16:00:00 (Sat)
  64005386400, #  local_start 2029-04-01 02:00:00 (Sun)
  64021716000, #    local_end 2029-10-07 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  64021680000, #    utc_start 2029-10-06 16:00:00 (Sat)
  64037404800, #      utc_end 2030-04-06 16:00:00 (Sat)
  64021719600, #  local_start 2029-10-07 03:00:00 (Sun)
  64037444400, #    local_end 2030-04-07 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  64037404800, #    utc_start 2030-04-06 16:00:00 (Sat)
  64053129600, #      utc_end 2030-10-05 16:00:00 (Sat)
  64037440800, #  local_start 2030-04-07 02:00:00 (Sun)
  64053165600, #    local_end 2030-10-06 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {65}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { 36000 }
  
  my $last_observance = bless( {
    'format' => 'AE%sT',
    'gmtoff' => '10:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 719709,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 719709,
      'utc_rd_secs' => 0,
      'utc_year' => 1972
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => 36000,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 719708,
      'local_rd_secs' => 50400,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 719708,
      'utc_rd_secs' => 50400,
      'utc_year' => 1972
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00s',
      'from' => '2001',
      'in' => 'Oct',
      'letter' => 'D',
      'name' => 'AT',
      'offset_from_std' => 3600,
      'on' => 'Sun>=1',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00s',
      'from' => '2008',
      'in' => 'Apr',
      'letter' => 'S',
      'name' => 'AT',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AUSTRALIA_CURRIE

    $main::fatpacked{"DateTime/TimeZone/Australia/Darwin.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AUSTRALIA_DARWIN';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/australasia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Australia::Darwin;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Australia::Darwin::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59771575000, #      utc_end 1895-01-31 15:16:40 (Thu)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59771606400, #    local_end 1895-02-01 00:00:00 (Fri)
  31400,
  0,
  'LMT',
      ],
      [
  59771575000, #    utc_start 1895-01-31 15:16:40 (Thu)
  59905494000, #      utc_end 1899-04-30 15:00:00 (Sun)
  59771607400, #  local_start 1895-02-01 00:16:40 (Fri)
  59905526400, #    local_end 1899-05-01 00:00:00 (Mon)
  32400,
  0,
  'ACST',
      ],
      [
  59905494000, #    utc_start 1899-04-30 15:00:00 (Sun)
  60463117860, #      utc_end 1916-12-31 14:31:00 (Sun)
  59905528200, #  local_start 1899-05-01 00:30:00 (Mon)
  60463152060, #    local_end 1917-01-01 00:01:00 (Mon)
  34200,
  0,
  'ACST',
      ],
      [
  60463117860, #    utc_start 1916-12-31 14:31:00 (Sun)
  60470292600, #      utc_end 1917-03-24 15:30:00 (Sat)
  60463155660, #  local_start 1917-01-01 01:01:00 (Mon)
  60470330400, #    local_end 1917-03-25 02:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  60470292600, #    utc_start 1917-03-24 15:30:00 (Sat)
  61252043400, #      utc_end 1941-12-31 16:30:00 (Wed)
  60470326800, #  local_start 1917-03-25 01:00:00 (Sun)
  61252077600, #    local_end 1942-01-01 02:00:00 (Thu)
  34200,
  0,
  'ACST',
      ],
      [
  61252043400, #    utc_start 1941-12-31 16:30:00 (Wed)
  61259556600, #      utc_end 1942-03-28 15:30:00 (Sat)
  61252081200, #  local_start 1942-01-01 03:00:00 (Thu)
  61259594400, #    local_end 1942-03-29 02:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  61259556600, #    utc_start 1942-03-28 15:30:00 (Sat)
  61275285000, #      utc_end 1942-09-26 16:30:00 (Sat)
  61259590800, #  local_start 1942-03-29 01:00:00 (Sun)
  61275319200, #    local_end 1942-09-27 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  61275285000, #    utc_start 1942-09-26 16:30:00 (Sat)
  61291006200, #      utc_end 1943-03-27 15:30:00 (Sat)
  61275322800, #  local_start 1942-09-27 03:00:00 (Sun)
  61291044000, #    local_end 1943-03-28 02:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  61291006200, #    utc_start 1943-03-27 15:30:00 (Sat)
  61307339400, #      utc_end 1943-10-02 16:30:00 (Sat)
  61291040400, #  local_start 1943-03-28 01:00:00 (Sun)
  61307373600, #    local_end 1943-10-03 02:00:00 (Sun)
  34200,
  0,
  'ACST',
      ],
      [
  61307339400, #    utc_start 1943-10-02 16:30:00 (Sat)
  61322455800, #      utc_end 1944-03-25 15:30:00 (Sat)
  61307377200, #  local_start 1943-10-03 03:00:00 (Sun)
  61322493600, #    local_end 1944-03-26 02:00:00 (Sun)
  37800,
  1,
  'ACDT',
      ],
      [
  61322455800, #    utc_start 1944-03-25 15:30:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  61322490000, #  local_start 1944-03-26 01:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  34200,
  0,
  'ACST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {4}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AUSTRALIA_DARWIN

    $main::fatpacked{"DateTime/TimeZone/Australia/Eucla.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AUSTRALIA_EUCLA';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/australasia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Australia::Eucla;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Australia::Eucla::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59797754672, #      utc_end 1895-11-30 15:24:32 (Sat)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59797785600, #    local_end 1895-12-01 00:00:00 (Sun)
  30928,
  0,
  'LMT',
      ],
      [
  59797754672, #    utc_start 1895-11-30 15:24:32 (Sat)
  60463120560, #      utc_end 1916-12-31 15:16:00 (Sun)
  59797786172, #  local_start 1895-12-01 00:09:32 (Sun)
  60463152060, #    local_end 1917-01-01 00:01:00 (Mon)
  31500,
  0,
  '+0845',
      ],
      [
  60463120560, #    utc_start 1916-12-31 15:16:00 (Sun)
  60470295300, #      utc_end 1917-03-24 16:15:00 (Sat)
  60463155660, #  local_start 1917-01-01 01:01:00 (Mon)
  60470330400, #    local_end 1917-03-25 02:00:00 (Sun)
  35100,
  1,
  '+0945',
      ],
      [
  60470295300, #    utc_start 1917-03-24 16:15:00 (Sat)
  61252046100, #      utc_end 1941-12-31 17:15:00 (Wed)
  60470326800, #  local_start 1917-03-25 01:00:00 (Sun)
  61252077600, #    local_end 1942-01-01 02:00:00 (Thu)
  31500,
  0,
  '+0845',
      ],
      [
  61252046100, #    utc_start 1941-12-31 17:15:00 (Wed)
  61259559300, #      utc_end 1942-03-28 16:15:00 (Sat)
  61252081200, #  local_start 1942-01-01 03:00:00 (Thu)
  61259594400, #    local_end 1942-03-29 02:00:00 (Sun)
  35100,
  1,
  '+0945',
      ],
      [
  61259559300, #    utc_start 1942-03-28 16:15:00 (Sat)
  61275287700, #      utc_end 1942-09-26 17:15:00 (Sat)
  61259590800, #  local_start 1942-03-29 01:00:00 (Sun)
  61275319200, #    local_end 1942-09-27 02:00:00 (Sun)
  31500,
  0,
  '+0845',
      ],
      [
  61275287700, #    utc_start 1942-09-26 17:15:00 (Sat)
  61291008900, #      utc_end 1943-03-27 16:15:00 (Sat)
  61275322800, #  local_start 1942-09-27 03:00:00 (Sun)
  61291044000, #    local_end 1943-03-28 02:00:00 (Sun)
  35100,
  1,
  '+0945',
      ],
      [
  61291008900, #    utc_start 1943-03-27 16:15:00 (Sat)
  61299213300, #      utc_end 1943-06-30 15:15:00 (Wed)
  61291040400, #  local_start 1943-03-28 01:00:00 (Sun)
  61299244800, #    local_end 1943-07-01 00:00:00 (Thu)
  31500,
  0,
  '+0845',
      ],
      [
  61299213300, #    utc_start 1943-06-30 15:15:00 (Wed)
  62287722900, #      utc_end 1974-10-26 17:15:00 (Sat)
  61299244800, #  local_start 1943-07-01 00:00:00 (Thu)
  62287754400, #    local_end 1974-10-27 02:00:00 (Sun)
  31500,
  0,
  '+0845',
      ],
      [
  62287722900, #    utc_start 1974-10-26 17:15:00 (Sat)
  62298609300, #      utc_end 1975-03-01 17:15:00 (Sat)
  62287758000, #  local_start 1974-10-27 03:00:00 (Sun)
  62298644400, #    local_end 1975-03-02 03:00:00 (Sun)
  35100,
  1,
  '+0945',
      ],
      [
  62298609300, #    utc_start 1975-03-01 17:15:00 (Sat)
  62571978900, #      utc_end 1983-10-29 17:15:00 (Sat)
  62298640800, #  local_start 1975-03-02 02:00:00 (Sun)
  62572010400, #    local_end 1983-10-30 02:00:00 (Sun)
  31500,
  0,
  '+0845',
      ],
      [
  62571978900, #    utc_start 1983-10-29 17:15:00 (Sat)
  62582865300, #      utc_end 1984-03-03 17:15:00 (Sat)
  62572014000, #  local_start 1983-10-30 03:00:00 (Sun)
  62582900400, #    local_end 1984-03-04 03:00:00 (Sun)
  35100,
  1,
  '+0945',
      ],
      [
  62582865300, #    utc_start 1984-03-03 17:15:00 (Sat)
  62825994900, #      utc_end 1991-11-16 17:15:00 (Sat)
  62582896800, #  local_start 1984-03-04 02:00:00 (Sun)
  62826026400, #    local_end 1991-11-17 02:00:00 (Sun)
  31500,
  0,
  '+0845',
      ],
      [
  62825994900, #    utc_start 1991-11-16 17:15:00 (Sat)
  62835066900, #      utc_end 1992-02-29 17:15:00 (Sat)
  62826030000, #  local_start 1991-11-17 03:00:00 (Sun)
  62835102000, #    local_end 1992-03-01 03:00:00 (Sun)
  35100,
  1,
  '+0945',
      ],
      [
  62835066900, #    utc_start 1992-02-29 17:15:00 (Sat)
  63300762900, #      utc_end 2006-12-02 17:15:00 (Sat)
  62835098400, #  local_start 1992-03-01 02:00:00 (Sun)
  63300794400, #    local_end 2006-12-03 02:00:00 (Sun)
  31500,
  0,
  '+0845',
      ],
      [
  63300762900, #    utc_start 2006-12-02 17:15:00 (Sat)
  63310439700, #      utc_end 2007-03-24 17:15:00 (Sat)
  63300798000, #  local_start 2006-12-03 03:00:00 (Sun)
  63310474800, #    local_end 2007-03-25 03:00:00 (Sun)
  35100,
  1,
  '+0945',
      ],
      [
  63310439700, #    utc_start 2007-03-24 17:15:00 (Sat)
  63329188500, #      utc_end 2007-10-27 17:15:00 (Sat)
  63310471200, #  local_start 2007-03-25 02:00:00 (Sun)
  63329220000, #    local_end 2007-10-28 02:00:00 (Sun)
  31500,
  0,
  '+0845',
      ],
      [
  63329188500, #    utc_start 2007-10-27 17:15:00 (Sat)
  63342494100, #      utc_end 2008-03-29 17:15:00 (Sat)
  63329223600, #  local_start 2007-10-28 03:00:00 (Sun)
  63342529200, #    local_end 2008-03-30 03:00:00 (Sun)
  35100,
  1,
  '+0945',
      ],
      [
  63342494100, #    utc_start 2008-03-29 17:15:00 (Sat)
  63360638100, #      utc_end 2008-10-25 17:15:00 (Sat)
  63342525600, #  local_start 2008-03-30 02:00:00 (Sun)
  63360669600, #    local_end 2008-10-26 02:00:00 (Sun)
  31500,
  0,
  '+0845',
      ],
      [
  63360638100, #    utc_start 2008-10-25 17:15:00 (Sat)
  63373943700, #      utc_end 2009-03-28 17:15:00 (Sat)
  63360673200, #  local_start 2008-10-26 03:00:00 (Sun)
  63373978800, #    local_end 2009-03-29 03:00:00 (Sun)
  35100,
  1,
  '+0945',
      ],
      [
  63373943700, #    utc_start 2009-03-28 17:15:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  63373975200, #  local_start 2009-03-29 02:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  31500,
  0,
  '+0845',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {9}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AUSTRALIA_EUCLA

    $main::fatpacked{"DateTime/TimeZone/Australia/Hobart.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AUSTRALIA_HOBART';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/australasia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Australia::Hobart;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Australia::Hobart::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59789887844, #      utc_end 1895-08-31 14:10:44 (Sat)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59789923200, #    local_end 1895-09-01 00:00:00 (Sun)
  35356,
  0,
  'LMT',
      ],
      [
  59789887844, #    utc_start 1895-08-31 14:10:44 (Sat)
  60455174400, #      utc_end 1916-09-30 16:00:00 (Sat)
  59789923844, #  local_start 1895-09-01 00:10:44 (Sun)
  60455210400, #    local_end 1916-10-01 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  60455174400, #    utc_start 1916-09-30 16:00:00 (Sat)
  60465790800, #      utc_end 1917-01-31 13:00:00 (Wed)
  60455214000, #  local_start 1916-10-01 03:00:00 (Sun)
  60465830400, #    local_end 1917-02-01 00:00:00 (Thu)
  39600,
  1,
  'AEDT',
      ],
      [
  60465790800, #    utc_start 1917-01-31 13:00:00 (Wed)
  60470290800, #      utc_end 1917-03-24 15:00:00 (Sat)
  60465830400, #  local_start 1917-02-01 00:00:00 (Thu)
  60470330400, #    local_end 1917-03-25 02:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  60470290800, #    utc_start 1917-03-24 15:00:00 (Sat)
  61252041600, #      utc_end 1941-12-31 16:00:00 (Wed)
  60470326800, #  local_start 1917-03-25 01:00:00 (Sun)
  61252077600, #    local_end 1942-01-01 02:00:00 (Thu)
  36000,
  0,
  'AEST',
      ],
      [
  61252041600, #    utc_start 1941-12-31 16:00:00 (Wed)
  61259554800, #      utc_end 1942-03-28 15:00:00 (Sat)
  61252081200, #  local_start 1942-01-01 03:00:00 (Thu)
  61259594400, #    local_end 1942-03-29 02:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  61259554800, #    utc_start 1942-03-28 15:00:00 (Sat)
  61275283200, #      utc_end 1942-09-26 16:00:00 (Sat)
  61259590800, #  local_start 1942-03-29 01:00:00 (Sun)
  61275319200, #    local_end 1942-09-27 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  61275283200, #    utc_start 1942-09-26 16:00:00 (Sat)
  61291004400, #      utc_end 1943-03-27 15:00:00 (Sat)
  61275322800, #  local_start 1942-09-27 03:00:00 (Sun)
  61291044000, #    local_end 1943-03-28 02:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  61291004400, #    utc_start 1943-03-27 15:00:00 (Sat)
  61307337600, #      utc_end 1943-10-02 16:00:00 (Sat)
  61291040400, #  local_start 1943-03-28 01:00:00 (Sun)
  61307373600, #    local_end 1943-10-03 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  61307337600, #    utc_start 1943-10-02 16:00:00 (Sat)
  61322454000, #      utc_end 1944-03-25 15:00:00 (Sat)
  61307377200, #  local_start 1943-10-03 03:00:00 (Sun)
  61322493600, #    local_end 1944-03-26 02:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  61322454000, #    utc_start 1944-03-25 15:00:00 (Sat)
  62040952800, #      utc_end 1966-12-31 14:00:00 (Sat)
  61322490000, #  local_start 1944-03-26 01:00:00 (Sun)
  62040988800, #    local_end 1967-01-01 00:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62040952800, #    utc_start 1966-12-31 14:00:00 (Sat)
  62064547200, #      utc_end 1967-09-30 16:00:00 (Sat)
  62040988800, #  local_start 1967-01-01 00:00:00 (Sun)
  62064583200, #    local_end 1967-10-01 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62064547200, #    utc_start 1967-09-30 16:00:00 (Sat)
  62080272000, #      utc_end 1968-03-30 16:00:00 (Sat)
  62064586800, #  local_start 1967-10-01 03:00:00 (Sun)
  62080311600, #    local_end 1968-03-31 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62080272000, #    utc_start 1968-03-30 16:00:00 (Sat)
  62098416000, #      utc_end 1968-10-26 16:00:00 (Sat)
  62080308000, #  local_start 1968-03-31 02:00:00 (Sun)
  62098452000, #    local_end 1968-10-27 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62098416000, #    utc_start 1968-10-26 16:00:00 (Sat)
  62109907200, #      utc_end 1969-03-08 16:00:00 (Sat)
  62098455600, #  local_start 1968-10-27 03:00:00 (Sun)
  62109946800, #    local_end 1969-03-09 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62109907200, #    utc_start 1969-03-08 16:00:00 (Sat)
  62129865600, #      utc_end 1969-10-25 16:00:00 (Sat)
  62109943200, #  local_start 1969-03-09 02:00:00 (Sun)
  62129901600, #    local_end 1969-10-26 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62129865600, #    utc_start 1969-10-25 16:00:00 (Sat)
  62141356800, #      utc_end 1970-03-07 16:00:00 (Sat)
  62129905200, #  local_start 1969-10-26 03:00:00 (Sun)
  62141396400, #    local_end 1970-03-08 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62141356800, #    utc_start 1970-03-07 16:00:00 (Sat)
  62161315200, #      utc_end 1970-10-24 16:00:00 (Sat)
  62141392800, #  local_start 1970-03-08 02:00:00 (Sun)
  62161351200, #    local_end 1970-10-25 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62161315200, #    utc_start 1970-10-24 16:00:00 (Sat)
  62173411200, #      utc_end 1971-03-13 16:00:00 (Sat)
  62161354800, #  local_start 1970-10-25 03:00:00 (Sun)
  62173450800, #    local_end 1971-03-14 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62173411200, #    utc_start 1971-03-13 16:00:00 (Sat)
  62193369600, #      utc_end 1971-10-30 16:00:00 (Sat)
  62173447200, #  local_start 1971-03-14 02:00:00 (Sun)
  62193405600, #    local_end 1971-10-31 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62193369600, #    utc_start 1971-10-30 16:00:00 (Sat)
  62203651200, #      utc_end 1972-02-26 16:00:00 (Sat)
  62193409200, #  local_start 1971-10-31 03:00:00 (Sun)
  62203690800, #    local_end 1972-02-27 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62203651200, #    utc_start 1972-02-26 16:00:00 (Sat)
  62224819200, #      utc_end 1972-10-28 16:00:00 (Sat)
  62203687200, #  local_start 1972-02-27 02:00:00 (Sun)
  62224855200, #    local_end 1972-10-29 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62224819200, #    utc_start 1972-10-28 16:00:00 (Sat)
  62235705600, #      utc_end 1973-03-03 16:00:00 (Sat)
  62224858800, #  local_start 1972-10-29 03:00:00 (Sun)
  62235745200, #    local_end 1973-03-04 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62235705600, #    utc_start 1973-03-03 16:00:00 (Sat)
  62256268800, #      utc_end 1973-10-27 16:00:00 (Sat)
  62235741600, #  local_start 1973-03-04 02:00:00 (Sun)
  62256304800, #    local_end 1973-10-28 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62256268800, #    utc_start 1973-10-27 16:00:00 (Sat)
  62267155200, #      utc_end 1974-03-02 16:00:00 (Sat)
  62256308400, #  local_start 1973-10-28 03:00:00 (Sun)
  62267194800, #    local_end 1974-03-03 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62267155200, #    utc_start 1974-03-02 16:00:00 (Sat)
  62287718400, #      utc_end 1974-10-26 16:00:00 (Sat)
  62267191200, #  local_start 1974-03-03 02:00:00 (Sun)
  62287754400, #    local_end 1974-10-27 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62287718400, #    utc_start 1974-10-26 16:00:00 (Sat)
  62298604800, #      utc_end 1975-03-01 16:00:00 (Sat)
  62287758000, #  local_start 1974-10-27 03:00:00 (Sun)
  62298644400, #    local_end 1975-03-02 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62298604800, #    utc_start 1975-03-01 16:00:00 (Sat)
  62319168000, #      utc_end 1975-10-25 16:00:00 (Sat)
  62298640800, #  local_start 1975-03-02 02:00:00 (Sun)
  62319204000, #    local_end 1975-10-26 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62319168000, #    utc_start 1975-10-25 16:00:00 (Sat)
  62330659200, #      utc_end 1976-03-06 16:00:00 (Sat)
  62319207600, #  local_start 1975-10-26 03:00:00 (Sun)
  62330698800, #    local_end 1976-03-07 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62330659200, #    utc_start 1976-03-06 16:00:00 (Sat)
  62351222400, #      utc_end 1976-10-30 16:00:00 (Sat)
  62330695200, #  local_start 1976-03-07 02:00:00 (Sun)
  62351258400, #    local_end 1976-10-31 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62351222400, #    utc_start 1976-10-30 16:00:00 (Sat)
  62362108800, #      utc_end 1977-03-05 16:00:00 (Sat)
  62351262000, #  local_start 1976-10-31 03:00:00 (Sun)
  62362148400, #    local_end 1977-03-06 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62362108800, #    utc_start 1977-03-05 16:00:00 (Sat)
  62382672000, #      utc_end 1977-10-29 16:00:00 (Sat)
  62362144800, #  local_start 1977-03-06 02:00:00 (Sun)
  62382708000, #    local_end 1977-10-30 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62382672000, #    utc_start 1977-10-29 16:00:00 (Sat)
  62393558400, #      utc_end 1978-03-04 16:00:00 (Sat)
  62382711600, #  local_start 1977-10-30 03:00:00 (Sun)
  62393598000, #    local_end 1978-03-05 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62393558400, #    utc_start 1978-03-04 16:00:00 (Sat)
  62414121600, #      utc_end 1978-10-28 16:00:00 (Sat)
  62393594400, #  local_start 1978-03-05 02:00:00 (Sun)
  62414157600, #    local_end 1978-10-29 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62414121600, #    utc_start 1978-10-28 16:00:00 (Sat)
  62425008000, #      utc_end 1979-03-03 16:00:00 (Sat)
  62414161200, #  local_start 1978-10-29 03:00:00 (Sun)
  62425047600, #    local_end 1979-03-04 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62425008000, #    utc_start 1979-03-03 16:00:00 (Sat)
  62445571200, #      utc_end 1979-10-27 16:00:00 (Sat)
  62425044000, #  local_start 1979-03-04 02:00:00 (Sun)
  62445607200, #    local_end 1979-10-28 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62445571200, #    utc_start 1979-10-27 16:00:00 (Sat)
  62456457600, #      utc_end 1980-03-01 16:00:00 (Sat)
  62445610800, #  local_start 1979-10-28 03:00:00 (Sun)
  62456497200, #    local_end 1980-03-02 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62456457600, #    utc_start 1980-03-01 16:00:00 (Sat)
  62477020800, #      utc_end 1980-10-25 16:00:00 (Sat)
  62456493600, #  local_start 1980-03-02 02:00:00 (Sun)
  62477056800, #    local_end 1980-10-26 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62477020800, #    utc_start 1980-10-25 16:00:00 (Sat)
  62487907200, #      utc_end 1981-02-28 16:00:00 (Sat)
  62477060400, #  local_start 1980-10-26 03:00:00 (Sun)
  62487946800, #    local_end 1981-03-01 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62487907200, #    utc_start 1981-02-28 16:00:00 (Sat)
  62508470400, #      utc_end 1981-10-24 16:00:00 (Sat)
  62487943200, #  local_start 1981-03-01 02:00:00 (Sun)
  62508506400, #    local_end 1981-10-25 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62508470400, #    utc_start 1981-10-24 16:00:00 (Sat)
  62521776000, #      utc_end 1982-03-27 16:00:00 (Sat)
  62508510000, #  local_start 1981-10-25 03:00:00 (Sun)
  62521815600, #    local_end 1982-03-28 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62521776000, #    utc_start 1982-03-27 16:00:00 (Sat)
  62540524800, #      utc_end 1982-10-30 16:00:00 (Sat)
  62521812000, #  local_start 1982-03-28 02:00:00 (Sun)
  62540560800, #    local_end 1982-10-31 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62540524800, #    utc_start 1982-10-30 16:00:00 (Sat)
  62553225600, #      utc_end 1983-03-26 16:00:00 (Sat)
  62540564400, #  local_start 1982-10-31 03:00:00 (Sun)
  62553265200, #    local_end 1983-03-27 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62553225600, #    utc_start 1983-03-26 16:00:00 (Sat)
  62571974400, #      utc_end 1983-10-29 16:00:00 (Sat)
  62553261600, #  local_start 1983-03-27 02:00:00 (Sun)
  62572010400, #    local_end 1983-10-30 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62571974400, #    utc_start 1983-10-29 16:00:00 (Sat)
  62582860800, #      utc_end 1984-03-03 16:00:00 (Sat)
  62572014000, #  local_start 1983-10-30 03:00:00 (Sun)
  62582900400, #    local_end 1984-03-04 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62582860800, #    utc_start 1984-03-03 16:00:00 (Sat)
  62603424000, #      utc_end 1984-10-27 16:00:00 (Sat)
  62582896800, #  local_start 1984-03-04 02:00:00 (Sun)
  62603460000, #    local_end 1984-10-28 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62603424000, #    utc_start 1984-10-27 16:00:00 (Sat)
  62614310400, #      utc_end 1985-03-02 16:00:00 (Sat)
  62603463600, #  local_start 1984-10-28 03:00:00 (Sun)
  62614350000, #    local_end 1985-03-03 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62614310400, #    utc_start 1985-03-02 16:00:00 (Sat)
  62634873600, #      utc_end 1985-10-26 16:00:00 (Sat)
  62614346400, #  local_start 1985-03-03 02:00:00 (Sun)
  62634909600, #    local_end 1985-10-27 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62634873600, #    utc_start 1985-10-26 16:00:00 (Sat)
  62645760000, #      utc_end 1986-03-01 16:00:00 (Sat)
  62634913200, #  local_start 1985-10-27 03:00:00 (Sun)
  62645799600, #    local_end 1986-03-02 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62645760000, #    utc_start 1986-03-01 16:00:00 (Sat)
  62665718400, #      utc_end 1986-10-18 16:00:00 (Sat)
  62645796000, #  local_start 1986-03-02 02:00:00 (Sun)
  62665754400, #    local_end 1986-10-19 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62665718400, #    utc_start 1986-10-18 16:00:00 (Sat)
  62678419200, #      utc_end 1987-03-14 16:00:00 (Sat)
  62665758000, #  local_start 1986-10-19 03:00:00 (Sun)
  62678458800, #    local_end 1987-03-15 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62678419200, #    utc_start 1987-03-14 16:00:00 (Sat)
  62697772800, #      utc_end 1987-10-24 16:00:00 (Sat)
  62678455200, #  local_start 1987-03-15 02:00:00 (Sun)
  62697808800, #    local_end 1987-10-25 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62697772800, #    utc_start 1987-10-24 16:00:00 (Sat)
  62710473600, #      utc_end 1988-03-19 16:00:00 (Sat)
  62697812400, #  local_start 1987-10-25 03:00:00 (Sun)
  62710513200, #    local_end 1988-03-20 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62710473600, #    utc_start 1988-03-19 16:00:00 (Sat)
  62729827200, #      utc_end 1988-10-29 16:00:00 (Sat)
  62710509600, #  local_start 1988-03-20 02:00:00 (Sun)
  62729863200, #    local_end 1988-10-30 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62729827200, #    utc_start 1988-10-29 16:00:00 (Sat)
  62741923200, #      utc_end 1989-03-18 16:00:00 (Sat)
  62729866800, #  local_start 1988-10-30 03:00:00 (Sun)
  62741962800, #    local_end 1989-03-19 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62741923200, #    utc_start 1989-03-18 16:00:00 (Sat)
  62761276800, #      utc_end 1989-10-28 16:00:00 (Sat)
  62741959200, #  local_start 1989-03-19 02:00:00 (Sun)
  62761312800, #    local_end 1989-10-29 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62761276800, #    utc_start 1989-10-28 16:00:00 (Sat)
  62773372800, #      utc_end 1990-03-17 16:00:00 (Sat)
  62761316400, #  local_start 1989-10-29 03:00:00 (Sun)
  62773412400, #    local_end 1990-03-18 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62773372800, #    utc_start 1990-03-17 16:00:00 (Sat)
  62792726400, #      utc_end 1990-10-27 16:00:00 (Sat)
  62773408800, #  local_start 1990-03-18 02:00:00 (Sun)
  62792762400, #    local_end 1990-10-28 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62792726400, #    utc_start 1990-10-27 16:00:00 (Sat)
  62806032000, #      utc_end 1991-03-30 16:00:00 (Sat)
  62792766000, #  local_start 1990-10-28 03:00:00 (Sun)
  62806071600, #    local_end 1991-03-31 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62806032000, #    utc_start 1991-03-30 16:00:00 (Sat)
  62822361600, #      utc_end 1991-10-05 16:00:00 (Sat)
  62806068000, #  local_start 1991-03-31 02:00:00 (Sun)
  62822397600, #    local_end 1991-10-06 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62822361600, #    utc_start 1991-10-05 16:00:00 (Sat)
  62837481600, #      utc_end 1992-03-28 16:00:00 (Sat)
  62822401200, #  local_start 1991-10-06 03:00:00 (Sun)
  62837521200, #    local_end 1992-03-29 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62837481600, #    utc_start 1992-03-28 16:00:00 (Sat)
  62853811200, #      utc_end 1992-10-03 16:00:00 (Sat)
  62837517600, #  local_start 1992-03-29 02:00:00 (Sun)
  62853847200, #    local_end 1992-10-04 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62853811200, #    utc_start 1992-10-03 16:00:00 (Sat)
  62868931200, #      utc_end 1993-03-27 16:00:00 (Sat)
  62853850800, #  local_start 1992-10-04 03:00:00 (Sun)
  62868970800, #    local_end 1993-03-28 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62868931200, #    utc_start 1993-03-27 16:00:00 (Sat)
  62885260800, #      utc_end 1993-10-02 16:00:00 (Sat)
  62868967200, #  local_start 1993-03-28 02:00:00 (Sun)
  62885296800, #    local_end 1993-10-03 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62885260800, #    utc_start 1993-10-02 16:00:00 (Sat)
  62900380800, #      utc_end 1994-03-26 16:00:00 (Sat)
  62885300400, #  local_start 1993-10-03 03:00:00 (Sun)
  62900420400, #    local_end 1994-03-27 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62900380800, #    utc_start 1994-03-26 16:00:00 (Sat)
  62916710400, #      utc_end 1994-10-01 16:00:00 (Sat)
  62900416800, #  local_start 1994-03-27 02:00:00 (Sun)
  62916746400, #    local_end 1994-10-02 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62916710400, #    utc_start 1994-10-01 16:00:00 (Sat)
  62931830400, #      utc_end 1995-03-25 16:00:00 (Sat)
  62916750000, #  local_start 1994-10-02 03:00:00 (Sun)
  62931870000, #    local_end 1995-03-26 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62931830400, #    utc_start 1995-03-25 16:00:00 (Sat)
  62948160000, #      utc_end 1995-09-30 16:00:00 (Sat)
  62931866400, #  local_start 1995-03-26 02:00:00 (Sun)
  62948196000, #    local_end 1995-10-01 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62948160000, #    utc_start 1995-09-30 16:00:00 (Sat)
  62963884800, #      utc_end 1996-03-30 16:00:00 (Sat)
  62948199600, #  local_start 1995-10-01 03:00:00 (Sun)
  62963924400, #    local_end 1996-03-31 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62963884800, #    utc_start 1996-03-30 16:00:00 (Sat)
  62980214400, #      utc_end 1996-10-05 16:00:00 (Sat)
  62963920800, #  local_start 1996-03-31 02:00:00 (Sun)
  62980250400, #    local_end 1996-10-06 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62980214400, #    utc_start 1996-10-05 16:00:00 (Sat)
  62995334400, #      utc_end 1997-03-29 16:00:00 (Sat)
  62980254000, #  local_start 1996-10-06 03:00:00 (Sun)
  62995374000, #    local_end 1997-03-30 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62995334400, #    utc_start 1997-03-29 16:00:00 (Sat)
  63011664000, #      utc_end 1997-10-04 16:00:00 (Sat)
  62995370400, #  local_start 1997-03-30 02:00:00 (Sun)
  63011700000, #    local_end 1997-10-05 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63011664000, #    utc_start 1997-10-04 16:00:00 (Sat)
  63026784000, #      utc_end 1998-03-28 16:00:00 (Sat)
  63011703600, #  local_start 1997-10-05 03:00:00 (Sun)
  63026823600, #    local_end 1998-03-29 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63026784000, #    utc_start 1998-03-28 16:00:00 (Sat)
  63043113600, #      utc_end 1998-10-03 16:00:00 (Sat)
  63026820000, #  local_start 1998-03-29 02:00:00 (Sun)
  63043149600, #    local_end 1998-10-04 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63043113600, #    utc_start 1998-10-03 16:00:00 (Sat)
  63058233600, #      utc_end 1999-03-27 16:00:00 (Sat)
  63043153200, #  local_start 1998-10-04 03:00:00 (Sun)
  63058273200, #    local_end 1999-03-28 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63058233600, #    utc_start 1999-03-27 16:00:00 (Sat)
  63074563200, #      utc_end 1999-10-02 16:00:00 (Sat)
  63058269600, #  local_start 1999-03-28 02:00:00 (Sun)
  63074599200, #    local_end 1999-10-03 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63074563200, #    utc_start 1999-10-02 16:00:00 (Sat)
  63089683200, #      utc_end 2000-03-25 16:00:00 (Sat)
  63074602800, #  local_start 1999-10-03 03:00:00 (Sun)
  63089722800, #    local_end 2000-03-26 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63089683200, #    utc_start 2000-03-25 16:00:00 (Sat)
  63102988800, #      utc_end 2000-08-26 16:00:00 (Sat)
  63089719200, #  local_start 2000-03-26 02:00:00 (Sun)
  63103024800, #    local_end 2000-08-27 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63102988800, #    utc_start 2000-08-26 16:00:00 (Sat)
  63121132800, #      utc_end 2001-03-24 16:00:00 (Sat)
  63103028400, #  local_start 2000-08-27 03:00:00 (Sun)
  63121172400, #    local_end 2001-03-25 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63121132800, #    utc_start 2001-03-24 16:00:00 (Sat)
  63138067200, #      utc_end 2001-10-06 16:00:00 (Sat)
  63121168800, #  local_start 2001-03-25 02:00:00 (Sun)
  63138103200, #    local_end 2001-10-07 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63138067200, #    utc_start 2001-10-06 16:00:00 (Sat)
  63153187200, #      utc_end 2002-03-30 16:00:00 (Sat)
  63138106800, #  local_start 2001-10-07 03:00:00 (Sun)
  63153226800, #    local_end 2002-03-31 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63153187200, #    utc_start 2002-03-30 16:00:00 (Sat)
  63169516800, #      utc_end 2002-10-05 16:00:00 (Sat)
  63153223200, #  local_start 2002-03-31 02:00:00 (Sun)
  63169552800, #    local_end 2002-10-06 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63169516800, #    utc_start 2002-10-05 16:00:00 (Sat)
  63184636800, #      utc_end 2003-03-29 16:00:00 (Sat)
  63169556400, #  local_start 2002-10-06 03:00:00 (Sun)
  63184676400, #    local_end 2003-03-30 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63184636800, #    utc_start 2003-03-29 16:00:00 (Sat)
  63200966400, #      utc_end 2003-10-04 16:00:00 (Sat)
  63184672800, #  local_start 2003-03-30 02:00:00 (Sun)
  63201002400, #    local_end 2003-10-05 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63200966400, #    utc_start 2003-10-04 16:00:00 (Sat)
  63216086400, #      utc_end 2004-03-27 16:00:00 (Sat)
  63201006000, #  local_start 2003-10-05 03:00:00 (Sun)
  63216126000, #    local_end 2004-03-28 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63216086400, #    utc_start 2004-03-27 16:00:00 (Sat)
  63232416000, #      utc_end 2004-10-02 16:00:00 (Sat)
  63216122400, #  local_start 2004-03-28 02:00:00 (Sun)
  63232452000, #    local_end 2004-10-03 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63232416000, #    utc_start 2004-10-02 16:00:00 (Sat)
  63247536000, #      utc_end 2005-03-26 16:00:00 (Sat)
  63232455600, #  local_start 2004-10-03 03:00:00 (Sun)
  63247575600, #    local_end 2005-03-27 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63247536000, #    utc_start 2005-03-26 16:00:00 (Sat)
  63263865600, #      utc_end 2005-10-01 16:00:00 (Sat)
  63247572000, #  local_start 2005-03-27 02:00:00 (Sun)
  63263901600, #    local_end 2005-10-02 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63263865600, #    utc_start 2005-10-01 16:00:00 (Sat)
  63279590400, #      utc_end 2006-04-01 16:00:00 (Sat)
  63263905200, #  local_start 2005-10-02 03:00:00 (Sun)
  63279630000, #    local_end 2006-04-02 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63279590400, #    utc_start 2006-04-01 16:00:00 (Sat)
  63295315200, #      utc_end 2006-09-30 16:00:00 (Sat)
  63279626400, #  local_start 2006-04-02 02:00:00 (Sun)
  63295351200, #    local_end 2006-10-01 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63295315200, #    utc_start 2006-09-30 16:00:00 (Sat)
  63310435200, #      utc_end 2007-03-24 16:00:00 (Sat)
  63295354800, #  local_start 2006-10-01 03:00:00 (Sun)
  63310474800, #    local_end 2007-03-25 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63310435200, #    utc_start 2007-03-24 16:00:00 (Sat)
  63327369600, #      utc_end 2007-10-06 16:00:00 (Sat)
  63310471200, #  local_start 2007-03-25 02:00:00 (Sun)
  63327405600, #    local_end 2007-10-07 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63327369600, #    utc_start 2007-10-06 16:00:00 (Sat)
  63343094400, #      utc_end 2008-04-05 16:00:00 (Sat)
  63327409200, #  local_start 2007-10-07 03:00:00 (Sun)
  63343134000, #    local_end 2008-04-06 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63343094400, #    utc_start 2008-04-05 16:00:00 (Sat)
  63358819200, #      utc_end 2008-10-04 16:00:00 (Sat)
  63343130400, #  local_start 2008-04-06 02:00:00 (Sun)
  63358855200, #    local_end 2008-10-05 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63358819200, #    utc_start 2008-10-04 16:00:00 (Sat)
  63374544000, #      utc_end 2009-04-04 16:00:00 (Sat)
  63358858800, #  local_start 2008-10-05 03:00:00 (Sun)
  63374583600, #    local_end 2009-04-05 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63374544000, #    utc_start 2009-04-04 16:00:00 (Sat)
  63390268800, #      utc_end 2009-10-03 16:00:00 (Sat)
  63374580000, #  local_start 2009-04-05 02:00:00 (Sun)
  63390304800, #    local_end 2009-10-04 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63390268800, #    utc_start 2009-10-03 16:00:00 (Sat)
  63405993600, #      utc_end 2010-04-03 16:00:00 (Sat)
  63390308400, #  local_start 2009-10-04 03:00:00 (Sun)
  63406033200, #    local_end 2010-04-04 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63405993600, #    utc_start 2010-04-03 16:00:00 (Sat)
  63421718400, #      utc_end 2010-10-02 16:00:00 (Sat)
  63406029600, #  local_start 2010-04-04 02:00:00 (Sun)
  63421754400, #    local_end 2010-10-03 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63421718400, #    utc_start 2010-10-02 16:00:00 (Sat)
  63437443200, #      utc_end 2011-04-02 16:00:00 (Sat)
  63421758000, #  local_start 2010-10-03 03:00:00 (Sun)
  63437482800, #    local_end 2011-04-03 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63437443200, #    utc_start 2011-04-02 16:00:00 (Sat)
  63453168000, #      utc_end 2011-10-01 16:00:00 (Sat)
  63437479200, #  local_start 2011-04-03 02:00:00 (Sun)
  63453204000, #    local_end 2011-10-02 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63453168000, #    utc_start 2011-10-01 16:00:00 (Sat)
  63468892800, #      utc_end 2012-03-31 16:00:00 (Sat)
  63453207600, #  local_start 2011-10-02 03:00:00 (Sun)
  63468932400, #    local_end 2012-04-01 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63468892800, #    utc_start 2012-03-31 16:00:00 (Sat)
  63485222400, #      utc_end 2012-10-06 16:00:00 (Sat)
  63468928800, #  local_start 2012-04-01 02:00:00 (Sun)
  63485258400, #    local_end 2012-10-07 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63485222400, #    utc_start 2012-10-06 16:00:00 (Sat)
  63500947200, #      utc_end 2013-04-06 16:00:00 (Sat)
  63485262000, #  local_start 2012-10-07 03:00:00 (Sun)
  63500986800, #    local_end 2013-04-07 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63500947200, #    utc_start 2013-04-06 16:00:00 (Sat)
  63516672000, #      utc_end 2013-10-05 16:00:00 (Sat)
  63500983200, #  local_start 2013-04-07 02:00:00 (Sun)
  63516708000, #    local_end 2013-10-06 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63516672000, #    utc_start 2013-10-05 16:00:00 (Sat)
  63532396800, #      utc_end 2014-04-05 16:00:00 (Sat)
  63516711600, #  local_start 2013-10-06 03:00:00 (Sun)
  63532436400, #    local_end 2014-04-06 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63532396800, #    utc_start 2014-04-05 16:00:00 (Sat)
  63548121600, #      utc_end 2014-10-04 16:00:00 (Sat)
  63532432800, #  local_start 2014-04-06 02:00:00 (Sun)
  63548157600, #    local_end 2014-10-05 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63548121600, #    utc_start 2014-10-04 16:00:00 (Sat)
  63563846400, #      utc_end 2015-04-04 16:00:00 (Sat)
  63548161200, #  local_start 2014-10-05 03:00:00 (Sun)
  63563886000, #    local_end 2015-04-05 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63563846400, #    utc_start 2015-04-04 16:00:00 (Sat)
  63579571200, #      utc_end 2015-10-03 16:00:00 (Sat)
  63563882400, #  local_start 2015-04-05 02:00:00 (Sun)
  63579607200, #    local_end 2015-10-04 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63579571200, #    utc_start 2015-10-03 16:00:00 (Sat)
  63595296000, #      utc_end 2016-04-02 16:00:00 (Sat)
  63579610800, #  local_start 2015-10-04 03:00:00 (Sun)
  63595335600, #    local_end 2016-04-03 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63595296000, #    utc_start 2016-04-02 16:00:00 (Sat)
  63611020800, #      utc_end 2016-10-01 16:00:00 (Sat)
  63595332000, #  local_start 2016-04-03 02:00:00 (Sun)
  63611056800, #    local_end 2016-10-02 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63611020800, #    utc_start 2016-10-01 16:00:00 (Sat)
  63626745600, #      utc_end 2017-04-01 16:00:00 (Sat)
  63611060400, #  local_start 2016-10-02 03:00:00 (Sun)
  63626785200, #    local_end 2017-04-02 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63626745600, #    utc_start 2017-04-01 16:00:00 (Sat)
  63642470400, #      utc_end 2017-09-30 16:00:00 (Sat)
  63626781600, #  local_start 2017-04-02 02:00:00 (Sun)
  63642506400, #    local_end 2017-10-01 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63642470400, #    utc_start 2017-09-30 16:00:00 (Sat)
  63658195200, #      utc_end 2018-03-31 16:00:00 (Sat)
  63642510000, #  local_start 2017-10-01 03:00:00 (Sun)
  63658234800, #    local_end 2018-04-01 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63658195200, #    utc_start 2018-03-31 16:00:00 (Sat)
  63674524800, #      utc_end 2018-10-06 16:00:00 (Sat)
  63658231200, #  local_start 2018-04-01 02:00:00 (Sun)
  63674560800, #    local_end 2018-10-07 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63674524800, #    utc_start 2018-10-06 16:00:00 (Sat)
  63690249600, #      utc_end 2019-04-06 16:00:00 (Sat)
  63674564400, #  local_start 2018-10-07 03:00:00 (Sun)
  63690289200, #    local_end 2019-04-07 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63690249600, #    utc_start 2019-04-06 16:00:00 (Sat)
  63705974400, #      utc_end 2019-10-05 16:00:00 (Sat)
  63690285600, #  local_start 2019-04-07 02:00:00 (Sun)
  63706010400, #    local_end 2019-10-06 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63705974400, #    utc_start 2019-10-05 16:00:00 (Sat)
  63721699200, #      utc_end 2020-04-04 16:00:00 (Sat)
  63706014000, #  local_start 2019-10-06 03:00:00 (Sun)
  63721738800, #    local_end 2020-04-05 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63721699200, #    utc_start 2020-04-04 16:00:00 (Sat)
  63737424000, #      utc_end 2020-10-03 16:00:00 (Sat)
  63721735200, #  local_start 2020-04-05 02:00:00 (Sun)
  63737460000, #    local_end 2020-10-04 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63737424000, #    utc_start 2020-10-03 16:00:00 (Sat)
  63753148800, #      utc_end 2021-04-03 16:00:00 (Sat)
  63737463600, #  local_start 2020-10-04 03:00:00 (Sun)
  63753188400, #    local_end 2021-04-04 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63753148800, #    utc_start 2021-04-03 16:00:00 (Sat)
  63768873600, #      utc_end 2021-10-02 16:00:00 (Sat)
  63753184800, #  local_start 2021-04-04 02:00:00 (Sun)
  63768909600, #    local_end 2021-10-03 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63768873600, #    utc_start 2021-10-02 16:00:00 (Sat)
  63784598400, #      utc_end 2022-04-02 16:00:00 (Sat)
  63768913200, #  local_start 2021-10-03 03:00:00 (Sun)
  63784638000, #    local_end 2022-04-03 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63784598400, #    utc_start 2022-04-02 16:00:00 (Sat)
  63800323200, #      utc_end 2022-10-01 16:00:00 (Sat)
  63784634400, #  local_start 2022-04-03 02:00:00 (Sun)
  63800359200, #    local_end 2022-10-02 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63800323200, #    utc_start 2022-10-01 16:00:00 (Sat)
  63816048000, #      utc_end 2023-04-01 16:00:00 (Sat)
  63800362800, #  local_start 2022-10-02 03:00:00 (Sun)
  63816087600, #    local_end 2023-04-02 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63816048000, #    utc_start 2023-04-01 16:00:00 (Sat)
  63831772800, #      utc_end 2023-09-30 16:00:00 (Sat)
  63816084000, #  local_start 2023-04-02 02:00:00 (Sun)
  63831808800, #    local_end 2023-10-01 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63831772800, #    utc_start 2023-09-30 16:00:00 (Sat)
  63848102400, #      utc_end 2024-04-06 16:00:00 (Sat)
  63831812400, #  local_start 2023-10-01 03:00:00 (Sun)
  63848142000, #    local_end 2024-04-07 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63848102400, #    utc_start 2024-04-06 16:00:00 (Sat)
  63863827200, #      utc_end 2024-10-05 16:00:00 (Sat)
  63848138400, #  local_start 2024-04-07 02:00:00 (Sun)
  63863863200, #    local_end 2024-10-06 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63863827200, #    utc_start 2024-10-05 16:00:00 (Sat)
  63879552000, #      utc_end 2025-04-05 16:00:00 (Sat)
  63863866800, #  local_start 2024-10-06 03:00:00 (Sun)
  63879591600, #    local_end 2025-04-06 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63879552000, #    utc_start 2025-04-05 16:00:00 (Sat)
  63895276800, #      utc_end 2025-10-04 16:00:00 (Sat)
  63879588000, #  local_start 2025-04-06 02:00:00 (Sun)
  63895312800, #    local_end 2025-10-05 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63895276800, #    utc_start 2025-10-04 16:00:00 (Sat)
  63911001600, #      utc_end 2026-04-04 16:00:00 (Sat)
  63895316400, #  local_start 2025-10-05 03:00:00 (Sun)
  63911041200, #    local_end 2026-04-05 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63911001600, #    utc_start 2026-04-04 16:00:00 (Sat)
  63926726400, #      utc_end 2026-10-03 16:00:00 (Sat)
  63911037600, #  local_start 2026-04-05 02:00:00 (Sun)
  63926762400, #    local_end 2026-10-04 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63926726400, #    utc_start 2026-10-03 16:00:00 (Sat)
  63942451200, #      utc_end 2027-04-03 16:00:00 (Sat)
  63926766000, #  local_start 2026-10-04 03:00:00 (Sun)
  63942490800, #    local_end 2027-04-04 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63942451200, #    utc_start 2027-04-03 16:00:00 (Sat)
  63958176000, #      utc_end 2027-10-02 16:00:00 (Sat)
  63942487200, #  local_start 2027-04-04 02:00:00 (Sun)
  63958212000, #    local_end 2027-10-03 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63958176000, #    utc_start 2027-10-02 16:00:00 (Sat)
  63973900800, #      utc_end 2028-04-01 16:00:00 (Sat)
  63958215600, #  local_start 2027-10-03 03:00:00 (Sun)
  63973940400, #    local_end 2028-04-02 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63973900800, #    utc_start 2028-04-01 16:00:00 (Sat)
  63989625600, #      utc_end 2028-09-30 16:00:00 (Sat)
  63973936800, #  local_start 2028-04-02 02:00:00 (Sun)
  63989661600, #    local_end 2028-10-01 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63989625600, #    utc_start 2028-09-30 16:00:00 (Sat)
  64005350400, #      utc_end 2029-03-31 16:00:00 (Sat)
  63989665200, #  local_start 2028-10-01 03:00:00 (Sun)
  64005390000, #    local_end 2029-04-01 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  64005350400, #    utc_start 2029-03-31 16:00:00 (Sat)
  64021680000, #      utc_end 2029-10-06 16:00:00 (Sat)
  64005386400, #  local_start 2029-04-01 02:00:00 (Sun)
  64021716000, #    local_end 2029-10-07 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  64021680000, #    utc_start 2029-10-06 16:00:00 (Sat)
  64037404800, #      utc_end 2030-04-06 16:00:00 (Sat)
  64021719600, #  local_start 2029-10-07 03:00:00 (Sun)
  64037444400, #    local_end 2030-04-07 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  64037404800, #    utc_start 2030-04-06 16:00:00 (Sat)
  64053129600, #      utc_end 2030-10-05 16:00:00 (Sat)
  64037440800, #  local_start 2030-04-07 02:00:00 (Sun)
  64053165600, #    local_end 2030-10-06 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {69}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { 36000 }
  
  my $last_observance = bless( {
    'format' => 'AE%sT',
    'gmtoff' => '10:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 718067,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 718067,
      'utc_rd_secs' => 0,
      'utc_year' => 1968
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => 36000,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 718066,
      'local_rd_secs' => 50400,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 718066,
      'utc_rd_secs' => 50400,
      'utc_year' => 1967
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00s',
      'from' => '2001',
      'in' => 'Oct',
      'letter' => 'D',
      'name' => 'AT',
      'offset_from_std' => 3600,
      'on' => 'Sun>=1',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00s',
      'from' => '2008',
      'in' => 'Apr',
      'letter' => 'S',
      'name' => 'AT',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AUSTRALIA_HOBART

    $main::fatpacked{"DateTime/TimeZone/Australia/Lindeman.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AUSTRALIA_LINDEMAN';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/australasia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Australia::Lindeman;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Australia::Lindeman::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59768892244, #      utc_end 1894-12-31 14:04:04 (Mon)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59768928000, #    local_end 1895-01-01 00:00:00 (Tue)
  35756,
  0,
  'LMT',
      ],
      [
  59768892244, #    utc_start 1894-12-31 14:04:04 (Mon)
  60463116060, #      utc_end 1916-12-31 14:01:00 (Sun)
  59768928244, #  local_start 1895-01-01 00:04:04 (Tue)
  60463152060, #    local_end 1917-01-01 00:01:00 (Mon)
  36000,
  0,
  'AEST',
      ],
      [
  60463116060, #    utc_start 1916-12-31 14:01:00 (Sun)
  60470290800, #      utc_end 1917-03-24 15:00:00 (Sat)
  60463155660, #  local_start 1917-01-01 01:01:00 (Mon)
  60470330400, #    local_end 1917-03-25 02:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  60470290800, #    utc_start 1917-03-24 15:00:00 (Sat)
  61252041600, #      utc_end 1941-12-31 16:00:00 (Wed)
  60470326800, #  local_start 1917-03-25 01:00:00 (Sun)
  61252077600, #    local_end 1942-01-01 02:00:00 (Thu)
  36000,
  0,
  'AEST',
      ],
      [
  61252041600, #    utc_start 1941-12-31 16:00:00 (Wed)
  61259554800, #      utc_end 1942-03-28 15:00:00 (Sat)
  61252081200, #  local_start 1942-01-01 03:00:00 (Thu)
  61259594400, #    local_end 1942-03-29 02:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  61259554800, #    utc_start 1942-03-28 15:00:00 (Sat)
  61275283200, #      utc_end 1942-09-26 16:00:00 (Sat)
  61259590800, #  local_start 1942-03-29 01:00:00 (Sun)
  61275319200, #    local_end 1942-09-27 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  61275283200, #    utc_start 1942-09-26 16:00:00 (Sat)
  61291004400, #      utc_end 1943-03-27 15:00:00 (Sat)
  61275322800, #  local_start 1942-09-27 03:00:00 (Sun)
  61291044000, #    local_end 1943-03-28 02:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  61291004400, #    utc_start 1943-03-27 15:00:00 (Sat)
  61307337600, #      utc_end 1943-10-02 16:00:00 (Sat)
  61291040400, #  local_start 1943-03-28 01:00:00 (Sun)
  61307373600, #    local_end 1943-10-03 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  61307337600, #    utc_start 1943-10-02 16:00:00 (Sat)
  61322454000, #      utc_end 1944-03-25 15:00:00 (Sat)
  61307377200, #  local_start 1943-10-03 03:00:00 (Sun)
  61322493600, #    local_end 1944-03-26 02:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  61322454000, #    utc_start 1944-03-25 15:00:00 (Sat)
  62167183200, #      utc_end 1970-12-31 14:00:00 (Thu)
  61322490000, #  local_start 1944-03-26 01:00:00 (Sun)
  62167219200, #    local_end 1971-01-01 00:00:00 (Fri)
  36000,
  0,
  'AEST',
      ],
      [
  62167183200, #    utc_start 1970-12-31 14:00:00 (Thu)
  62193369600, #      utc_end 1971-10-30 16:00:00 (Sat)
  62167219200, #  local_start 1971-01-01 00:00:00 (Fri)
  62193405600, #    local_end 1971-10-31 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62193369600, #    utc_start 1971-10-30 16:00:00 (Sat)
  62203651200, #      utc_end 1972-02-26 16:00:00 (Sat)
  62193409200, #  local_start 1971-10-31 03:00:00 (Sun)
  62203690800, #    local_end 1972-02-27 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62203651200, #    utc_start 1972-02-26 16:00:00 (Sat)
  62761276800, #      utc_end 1989-10-28 16:00:00 (Sat)
  62203687200, #  local_start 1972-02-27 02:00:00 (Sun)
  62761312800, #    local_end 1989-10-29 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62761276800, #    utc_start 1989-10-28 16:00:00 (Sat)
  62772163200, #      utc_end 1990-03-03 16:00:00 (Sat)
  62761316400, #  local_start 1989-10-29 03:00:00 (Sun)
  62772202800, #    local_end 1990-03-04 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62772163200, #    utc_start 1990-03-03 16:00:00 (Sat)
  62792726400, #      utc_end 1990-10-27 16:00:00 (Sat)
  62772199200, #  local_start 1990-03-04 02:00:00 (Sun)
  62792762400, #    local_end 1990-10-28 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62792726400, #    utc_start 1990-10-27 16:00:00 (Sat)
  62803612800, #      utc_end 1991-03-02 16:00:00 (Sat)
  62792766000, #  local_start 1990-10-28 03:00:00 (Sun)
  62803652400, #    local_end 1991-03-03 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62803612800, #    utc_start 1991-03-02 16:00:00 (Sat)
  62824176000, #      utc_end 1991-10-26 16:00:00 (Sat)
  62803648800, #  local_start 1991-03-03 02:00:00 (Sun)
  62824212000, #    local_end 1991-10-27 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62824176000, #    utc_start 1991-10-26 16:00:00 (Sat)
  62835062400, #      utc_end 1992-02-29 16:00:00 (Sat)
  62824215600, #  local_start 1991-10-27 03:00:00 (Sun)
  62835102000, #    local_end 1992-03-01 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62835062400, #    utc_start 1992-02-29 16:00:00 (Sat)
  62845596000, #      utc_end 1992-06-30 14:00:00 (Tue)
  62835098400, #  local_start 1992-03-01 02:00:00 (Sun)
  62845632000, #    local_end 1992-07-01 00:00:00 (Wed)
  36000,
  0,
  'AEST',
      ],
      [
  62845596000, #    utc_start 1992-06-30 14:00:00 (Tue)
  62855625600, #      utc_end 1992-10-24 16:00:00 (Sat)
  62845632000, #  local_start 1992-07-01 00:00:00 (Wed)
  62855661600, #    local_end 1992-10-25 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62855625600, #    utc_start 1992-10-24 16:00:00 (Sat)
  62867116800, #      utc_end 1993-03-06 16:00:00 (Sat)
  62855665200, #  local_start 1992-10-25 03:00:00 (Sun)
  62867156400, #    local_end 1993-03-07 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62867116800, #    utc_start 1993-03-06 16:00:00 (Sat)
  62887680000, #      utc_end 1993-10-30 16:00:00 (Sat)
  62867152800, #  local_start 1993-03-07 02:00:00 (Sun)
  62887716000, #    local_end 1993-10-31 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62887680000, #    utc_start 1993-10-30 16:00:00 (Sat)
  62898566400, #      utc_end 1994-03-05 16:00:00 (Sat)
  62887719600, #  local_start 1993-10-31 03:00:00 (Sun)
  62898606000, #    local_end 1994-03-06 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62898566400, #    utc_start 1994-03-05 16:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  62898602400, #  local_start 1994-03-06 02:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  36000,
  0,
  'AEST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {10}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AUSTRALIA_LINDEMAN

    $main::fatpacked{"DateTime/TimeZone/Australia/Lord_Howe.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AUSTRALIA_LORD_HOWE';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/australasia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Australia::Lord_Howe;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Australia::Lord_Howe::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59771568220, #      utc_end 1895-01-31 13:23:40 (Thu)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59771606400, #    local_end 1895-02-01 00:00:00 (Fri)
  38180,
  0,
  'LMT',
      ],
      [
  59771568220, #    utc_start 1895-01-31 13:23:40 (Thu)
  62487900000, #      utc_end 1981-02-28 14:00:00 (Sat)
  59771604220, #  local_start 1895-01-31 23:23:40 (Thu)
  62487936000, #    local_end 1981-03-01 00:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62487900000, #    utc_start 1981-02-28 14:00:00 (Sat)
  62508468600, #      utc_end 1981-10-24 15:30:00 (Sat)
  62487937800, #  local_start 1981-03-01 00:30:00 (Sun)
  62508506400, #    local_end 1981-10-25 02:00:00 (Sun)
  37800,
  0,
  '+1030',
      ],
      [
  62508468600, #    utc_start 1981-10-24 15:30:00 (Sat)
  62519956200, #      utc_end 1982-03-06 14:30:00 (Sat)
  62508510000, #  local_start 1981-10-25 03:00:00 (Sun)
  62519997600, #    local_end 1982-03-07 02:00:00 (Sun)
  41400,
  1,
  '+1130',
      ],
      [
  62519956200, #    utc_start 1982-03-06 14:30:00 (Sat)
  62540523000, #      utc_end 1982-10-30 15:30:00 (Sat)
  62519994000, #  local_start 1982-03-07 01:00:00 (Sun)
  62540560800, #    local_end 1982-10-31 02:00:00 (Sun)
  37800,
  0,
  '+1030',
      ],
      [
  62540523000, #    utc_start 1982-10-30 15:30:00 (Sat)
  62551405800, #      utc_end 1983-03-05 14:30:00 (Sat)
  62540564400, #  local_start 1982-10-31 03:00:00 (Sun)
  62551447200, #    local_end 1983-03-06 02:00:00 (Sun)
  41400,
  1,
  '+1130',
      ],
      [
  62551405800, #    utc_start 1983-03-05 14:30:00 (Sat)
  62571972600, #      utc_end 1983-10-29 15:30:00 (Sat)
  62551443600, #  local_start 1983-03-06 01:00:00 (Sun)
  62572010400, #    local_end 1983-10-30 02:00:00 (Sun)
  37800,
  0,
  '+1030',
      ],
      [
  62571972600, #    utc_start 1983-10-29 15:30:00 (Sat)
  62582855400, #      utc_end 1984-03-03 14:30:00 (Sat)
  62572014000, #  local_start 1983-10-30 03:00:00 (Sun)
  62582896800, #    local_end 1984-03-04 02:00:00 (Sun)
  41400,
  1,
  '+1130',
      ],
      [
  62582855400, #    utc_start 1984-03-03 14:30:00 (Sat)
  62603422200, #      utc_end 1984-10-27 15:30:00 (Sat)
  62582893200, #  local_start 1984-03-04 01:00:00 (Sun)
  62603460000, #    local_end 1984-10-28 02:00:00 (Sun)
  37800,
  0,
  '+1030',
      ],
      [
  62603422200, #    utc_start 1984-10-27 15:30:00 (Sat)
  62614305000, #      utc_end 1985-03-02 14:30:00 (Sat)
  62603463600, #  local_start 1984-10-28 03:00:00 (Sun)
  62614346400, #    local_end 1985-03-03 02:00:00 (Sun)
  41400,
  1,
  '+1130',
      ],
      [
  62614305000, #    utc_start 1985-03-02 14:30:00 (Sat)
  62624669400, #      utc_end 1985-06-30 13:30:00 (Sun)
  62614342800, #  local_start 1985-03-03 01:00:00 (Sun)
  62624707200, #    local_end 1985-07-01 00:00:00 (Mon)
  37800,
  0,
  '+1030',
      ],
      [
  62624669400, #    utc_start 1985-06-30 13:30:00 (Sun)
  62634871800, #      utc_end 1985-10-26 15:30:00 (Sat)
  62624707200, #  local_start 1985-07-01 00:00:00 (Mon)
  62634909600, #    local_end 1985-10-27 02:00:00 (Sun)
  37800,
  0,
  '+1030',
      ],
      [
  62634871800, #    utc_start 1985-10-26 15:30:00 (Sat)
  62646966000, #      utc_end 1986-03-15 15:00:00 (Sat)
  62634911400, #  local_start 1985-10-27 02:30:00 (Sun)
  62647005600, #    local_end 1986-03-16 02:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  62646966000, #    utc_start 1986-03-15 15:00:00 (Sat)
  62665716600, #      utc_end 1986-10-18 15:30:00 (Sat)
  62647003800, #  local_start 1986-03-16 01:30:00 (Sun)
  62665754400, #    local_end 1986-10-19 02:00:00 (Sun)
  37800,
  0,
  '+1030',
      ],
      [
  62665716600, #    utc_start 1986-10-18 15:30:00 (Sat)
  62678415600, #      utc_end 1987-03-14 15:00:00 (Sat)
  62665756200, #  local_start 1986-10-19 02:30:00 (Sun)
  62678455200, #    local_end 1987-03-15 02:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  62678415600, #    utc_start 1987-03-14 15:00:00 (Sat)
  62697771000, #      utc_end 1987-10-24 15:30:00 (Sat)
  62678453400, #  local_start 1987-03-15 01:30:00 (Sun)
  62697808800, #    local_end 1987-10-25 02:00:00 (Sun)
  37800,
  0,
  '+1030',
      ],
      [
  62697771000, #    utc_start 1987-10-24 15:30:00 (Sat)
  62710470000, #      utc_end 1988-03-19 15:00:00 (Sat)
  62697810600, #  local_start 1987-10-25 02:30:00 (Sun)
  62710509600, #    local_end 1988-03-20 02:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  62710470000, #    utc_start 1988-03-19 15:00:00 (Sat)
  62729825400, #      utc_end 1988-10-29 15:30:00 (Sat)
  62710507800, #  local_start 1988-03-20 01:30:00 (Sun)
  62729863200, #    local_end 1988-10-30 02:00:00 (Sun)
  37800,
  0,
  '+1030',
      ],
      [
  62729825400, #    utc_start 1988-10-29 15:30:00 (Sat)
  62741919600, #      utc_end 1989-03-18 15:00:00 (Sat)
  62729865000, #  local_start 1988-10-30 02:30:00 (Sun)
  62741959200, #    local_end 1989-03-19 02:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  62741919600, #    utc_start 1989-03-18 15:00:00 (Sat)
  62761275000, #      utc_end 1989-10-28 15:30:00 (Sat)
  62741957400, #  local_start 1989-03-19 01:30:00 (Sun)
  62761312800, #    local_end 1989-10-29 02:00:00 (Sun)
  37800,
  0,
  '+1030',
      ],
      [
  62761275000, #    utc_start 1989-10-28 15:30:00 (Sat)
  62772159600, #      utc_end 1990-03-03 15:00:00 (Sat)
  62761314600, #  local_start 1989-10-29 02:30:00 (Sun)
  62772199200, #    local_end 1990-03-04 02:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  62772159600, #    utc_start 1990-03-03 15:00:00 (Sat)
  62792724600, #      utc_end 1990-10-27 15:30:00 (Sat)
  62772197400, #  local_start 1990-03-04 01:30:00 (Sun)
  62792762400, #    local_end 1990-10-28 02:00:00 (Sun)
  37800,
  0,
  '+1030',
      ],
      [
  62792724600, #    utc_start 1990-10-27 15:30:00 (Sat)
  62803609200, #      utc_end 1991-03-02 15:00:00 (Sat)
  62792764200, #  local_start 1990-10-28 02:30:00 (Sun)
  62803648800, #    local_end 1991-03-03 02:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  62803609200, #    utc_start 1991-03-02 15:00:00 (Sat)
  62824174200, #      utc_end 1991-10-26 15:30:00 (Sat)
  62803647000, #  local_start 1991-03-03 01:30:00 (Sun)
  62824212000, #    local_end 1991-10-27 02:00:00 (Sun)
  37800,
  0,
  '+1030',
      ],
      [
  62824174200, #    utc_start 1991-10-26 15:30:00 (Sat)
  62835058800, #      utc_end 1992-02-29 15:00:00 (Sat)
  62824213800, #  local_start 1991-10-27 02:30:00 (Sun)
  62835098400, #    local_end 1992-03-01 02:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  62835058800, #    utc_start 1992-02-29 15:00:00 (Sat)
  62855623800, #      utc_end 1992-10-24 15:30:00 (Sat)
  62835096600, #  local_start 1992-03-01 01:30:00 (Sun)
  62855661600, #    local_end 1992-10-25 02:00:00 (Sun)
  37800,
  0,
  '+1030',
      ],
      [
  62855623800, #    utc_start 1992-10-24 15:30:00 (Sat)
  62867113200, #      utc_end 1993-03-06 15:00:00 (Sat)
  62855663400, #  local_start 1992-10-25 02:30:00 (Sun)
  62867152800, #    local_end 1993-03-07 02:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  62867113200, #    utc_start 1993-03-06 15:00:00 (Sat)
  62887678200, #      utc_end 1993-10-30 15:30:00 (Sat)
  62867151000, #  local_start 1993-03-07 01:30:00 (Sun)
  62887716000, #    local_end 1993-10-31 02:00:00 (Sun)
  37800,
  0,
  '+1030',
      ],
      [
  62887678200, #    utc_start 1993-10-30 15:30:00 (Sat)
  62898562800, #      utc_end 1994-03-05 15:00:00 (Sat)
  62887717800, #  local_start 1993-10-31 02:30:00 (Sun)
  62898602400, #    local_end 1994-03-06 02:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  62898562800, #    utc_start 1994-03-05 15:00:00 (Sat)
  62919127800, #      utc_end 1994-10-29 15:30:00 (Sat)
  62898600600, #  local_start 1994-03-06 01:30:00 (Sun)
  62919165600, #    local_end 1994-10-30 02:00:00 (Sun)
  37800,
  0,
  '+1030',
      ],
      [
  62919127800, #    utc_start 1994-10-29 15:30:00 (Sat)
  62930012400, #      utc_end 1995-03-04 15:00:00 (Sat)
  62919167400, #  local_start 1994-10-30 02:30:00 (Sun)
  62930052000, #    local_end 1995-03-05 02:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  62930012400, #    utc_start 1995-03-04 15:00:00 (Sat)
  62950577400, #      utc_end 1995-10-28 15:30:00 (Sat)
  62930050200, #  local_start 1995-03-05 01:30:00 (Sun)
  62950615200, #    local_end 1995-10-29 02:00:00 (Sun)
  37800,
  0,
  '+1030',
      ],
      [
  62950577400, #    utc_start 1995-10-28 15:30:00 (Sat)
  62963881200, #      utc_end 1996-03-30 15:00:00 (Sat)
  62950617000, #  local_start 1995-10-29 02:30:00 (Sun)
  62963920800, #    local_end 1996-03-31 02:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  62963881200, #    utc_start 1996-03-30 15:00:00 (Sat)
  62982027000, #      utc_end 1996-10-26 15:30:00 (Sat)
  62963919000, #  local_start 1996-03-31 01:30:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  37800,
  0,
  '+1030',
      ],
      [
  62982027000, #    utc_start 1996-10-26 15:30:00 (Sat)
  62995330800, #      utc_end 1997-03-29 15:00:00 (Sat)
  62982066600, #  local_start 1996-10-27 02:30:00 (Sun)
  62995370400, #    local_end 1997-03-30 02:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  62995330800, #    utc_start 1997-03-29 15:00:00 (Sat)
  63013476600, #      utc_end 1997-10-25 15:30:00 (Sat)
  62995368600, #  local_start 1997-03-30 01:30:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  37800,
  0,
  '+1030',
      ],
      [
  63013476600, #    utc_start 1997-10-25 15:30:00 (Sat)
  63026780400, #      utc_end 1998-03-28 15:00:00 (Sat)
  63013516200, #  local_start 1997-10-26 02:30:00 (Sun)
  63026820000, #    local_end 1998-03-29 02:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  63026780400, #    utc_start 1998-03-28 15:00:00 (Sat)
  63044926200, #      utc_end 1998-10-24 15:30:00 (Sat)
  63026818200, #  local_start 1998-03-29 01:30:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  37800,
  0,
  '+1030',
      ],
      [
  63044926200, #    utc_start 1998-10-24 15:30:00 (Sat)
  63058230000, #      utc_end 1999-03-27 15:00:00 (Sat)
  63044965800, #  local_start 1998-10-25 02:30:00 (Sun)
  63058269600, #    local_end 1999-03-28 02:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  63058230000, #    utc_start 1999-03-27 15:00:00 (Sat)
  63076980600, #      utc_end 1999-10-30 15:30:00 (Sat)
  63058267800, #  local_start 1999-03-28 01:30:00 (Sun)
  63077018400, #    local_end 1999-10-31 02:00:00 (Sun)
  37800,
  0,
  '+1030',
      ],
      [
  63076980600, #    utc_start 1999-10-30 15:30:00 (Sat)
  63089679600, #      utc_end 2000-03-25 15:00:00 (Sat)
  63077020200, #  local_start 1999-10-31 02:30:00 (Sun)
  63089719200, #    local_end 2000-03-26 02:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  63089679600, #    utc_start 2000-03-25 15:00:00 (Sat)
  63102987000, #      utc_end 2000-08-26 15:30:00 (Sat)
  63089717400, #  local_start 2000-03-26 01:30:00 (Sun)
  63103024800, #    local_end 2000-08-27 02:00:00 (Sun)
  37800,
  0,
  '+1030',
      ],
      [
  63102987000, #    utc_start 2000-08-26 15:30:00 (Sat)
  63121129200, #      utc_end 2001-03-24 15:00:00 (Sat)
  63103026600, #  local_start 2000-08-27 02:30:00 (Sun)
  63121168800, #    local_end 2001-03-25 02:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  63121129200, #    utc_start 2001-03-24 15:00:00 (Sat)
  63139879800, #      utc_end 2001-10-27 15:30:00 (Sat)
  63121167000, #  local_start 2001-03-25 01:30:00 (Sun)
  63139917600, #    local_end 2001-10-28 02:00:00 (Sun)
  37800,
  0,
  '+1030',
      ],
      [
  63139879800, #    utc_start 2001-10-27 15:30:00 (Sat)
  63153183600, #      utc_end 2002-03-30 15:00:00 (Sat)
  63139919400, #  local_start 2001-10-28 02:30:00 (Sun)
  63153223200, #    local_end 2002-03-31 02:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  63153183600, #    utc_start 2002-03-30 15:00:00 (Sat)
  63171329400, #      utc_end 2002-10-26 15:30:00 (Sat)
  63153221400, #  local_start 2002-03-31 01:30:00 (Sun)
  63171367200, #    local_end 2002-10-27 02:00:00 (Sun)
  37800,
  0,
  '+1030',
      ],
      [
  63171329400, #    utc_start 2002-10-26 15:30:00 (Sat)
  63184633200, #      utc_end 2003-03-29 15:00:00 (Sat)
  63171369000, #  local_start 2002-10-27 02:30:00 (Sun)
  63184672800, #    local_end 2003-03-30 02:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  63184633200, #    utc_start 2003-03-29 15:00:00 (Sat)
  63202779000, #      utc_end 2003-10-25 15:30:00 (Sat)
  63184671000, #  local_start 2003-03-30 01:30:00 (Sun)
  63202816800, #    local_end 2003-10-26 02:00:00 (Sun)
  37800,
  0,
  '+1030',
      ],
      [
  63202779000, #    utc_start 2003-10-25 15:30:00 (Sat)
  63216082800, #      utc_end 2004-03-27 15:00:00 (Sat)
  63202818600, #  local_start 2003-10-26 02:30:00 (Sun)
  63216122400, #    local_end 2004-03-28 02:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  63216082800, #    utc_start 2004-03-27 15:00:00 (Sat)
  63234833400, #      utc_end 2004-10-30 15:30:00 (Sat)
  63216120600, #  local_start 2004-03-28 01:30:00 (Sun)
  63234871200, #    local_end 2004-10-31 02:00:00 (Sun)
  37800,
  0,
  '+1030',
      ],
      [
  63234833400, #    utc_start 2004-10-30 15:30:00 (Sat)
  63247532400, #      utc_end 2005-03-26 15:00:00 (Sat)
  63234873000, #  local_start 2004-10-31 02:30:00 (Sun)
  63247572000, #    local_end 2005-03-27 02:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  63247532400, #    utc_start 2005-03-26 15:00:00 (Sat)
  63266283000, #      utc_end 2005-10-29 15:30:00 (Sat)
  63247570200, #  local_start 2005-03-27 01:30:00 (Sun)
  63266320800, #    local_end 2005-10-30 02:00:00 (Sun)
  37800,
  0,
  '+1030',
      ],
      [
  63266283000, #    utc_start 2005-10-29 15:30:00 (Sat)
  63279586800, #      utc_end 2006-04-01 15:00:00 (Sat)
  63266322600, #  local_start 2005-10-30 02:30:00 (Sun)
  63279626400, #    local_end 2006-04-02 02:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  63279586800, #    utc_start 2006-04-01 15:00:00 (Sat)
  63297732600, #      utc_end 2006-10-28 15:30:00 (Sat)
  63279624600, #  local_start 2006-04-02 01:30:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  37800,
  0,
  '+1030',
      ],
      [
  63297732600, #    utc_start 2006-10-28 15:30:00 (Sat)
  63310431600, #      utc_end 2007-03-24 15:00:00 (Sat)
  63297772200, #  local_start 2006-10-29 02:30:00 (Sun)
  63310471200, #    local_end 2007-03-25 02:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  63310431600, #    utc_start 2007-03-24 15:00:00 (Sat)
  63329182200, #      utc_end 2007-10-27 15:30:00 (Sat)
  63310469400, #  local_start 2007-03-25 01:30:00 (Sun)
  63329220000, #    local_end 2007-10-28 02:00:00 (Sun)
  37800,
  0,
  '+1030',
      ],
      [
  63329182200, #    utc_start 2007-10-27 15:30:00 (Sat)
  63343090800, #      utc_end 2008-04-05 15:00:00 (Sat)
  63329221800, #  local_start 2007-10-28 02:30:00 (Sun)
  63343130400, #    local_end 2008-04-06 02:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  63343090800, #    utc_start 2008-04-05 15:00:00 (Sat)
  63358817400, #      utc_end 2008-10-04 15:30:00 (Sat)
  63343128600, #  local_start 2008-04-06 01:30:00 (Sun)
  63358855200, #    local_end 2008-10-05 02:00:00 (Sun)
  37800,
  0,
  '+1030',
      ],
      [
  63358817400, #    utc_start 2008-10-04 15:30:00 (Sat)
  63374540400, #      utc_end 2009-04-04 15:00:00 (Sat)
  63358857000, #  local_start 2008-10-05 02:30:00 (Sun)
  63374580000, #    local_end 2009-04-05 02:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  63374540400, #    utc_start 2009-04-04 15:00:00 (Sat)
  63390267000, #      utc_end 2009-10-03 15:30:00 (Sat)
  63374578200, #  local_start 2009-04-05 01:30:00 (Sun)
  63390304800, #    local_end 2009-10-04 02:00:00 (Sun)
  37800,
  0,
  '+1030',
      ],
      [
  63390267000, #    utc_start 2009-10-03 15:30:00 (Sat)
  63405990000, #      utc_end 2010-04-03 15:00:00 (Sat)
  63390306600, #  local_start 2009-10-04 02:30:00 (Sun)
  63406029600, #    local_end 2010-04-04 02:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  63405990000, #    utc_start 2010-04-03 15:00:00 (Sat)
  63421716600, #      utc_end 2010-10-02 15:30:00 (Sat)
  63406027800, #  local_start 2010-04-04 01:30:00 (Sun)
  63421754400, #    local_end 2010-10-03 02:00:00 (Sun)
  37800,
  0,
  '+1030',
      ],
      [
  63421716600, #    utc_start 2010-10-02 15:30:00 (Sat)
  63437439600, #      utc_end 2011-04-02 15:00:00 (Sat)
  63421756200, #  local_start 2010-10-03 02:30:00 (Sun)
  63437479200, #    local_end 2011-04-03 02:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  63437439600, #    utc_start 2011-04-02 15:00:00 (Sat)
  63453166200, #      utc_end 2011-10-01 15:30:00 (Sat)
  63437477400, #  local_start 2011-04-03 01:30:00 (Sun)
  63453204000, #    local_end 2011-10-02 02:00:00 (Sun)
  37800,
  0,
  '+1030',
      ],
      [
  63453166200, #    utc_start 2011-10-01 15:30:00 (Sat)
  63468889200, #      utc_end 2012-03-31 15:00:00 (Sat)
  63453205800, #  local_start 2011-10-02 02:30:00 (Sun)
  63468928800, #    local_end 2012-04-01 02:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  63468889200, #    utc_start 2012-03-31 15:00:00 (Sat)
  63485220600, #      utc_end 2012-10-06 15:30:00 (Sat)
  63468927000, #  local_start 2012-04-01 01:30:00 (Sun)
  63485258400, #    local_end 2012-10-07 02:00:00 (Sun)
  37800,
  0,
  '+1030',
      ],
      [
  63485220600, #    utc_start 2012-10-06 15:30:00 (Sat)
  63500943600, #      utc_end 2013-04-06 15:00:00 (Sat)
  63485260200, #  local_start 2012-10-07 02:30:00 (Sun)
  63500983200, #    local_end 2013-04-07 02:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  63500943600, #    utc_start 2013-04-06 15:00:00 (Sat)
  63516670200, #      utc_end 2013-10-05 15:30:00 (Sat)
  63500981400, #  local_start 2013-04-07 01:30:00 (Sun)
  63516708000, #    local_end 2013-10-06 02:00:00 (Sun)
  37800,
  0,
  '+1030',
      ],
      [
  63516670200, #    utc_start 2013-10-05 15:30:00 (Sat)
  63532393200, #      utc_end 2014-04-05 15:00:00 (Sat)
  63516709800, #  local_start 2013-10-06 02:30:00 (Sun)
  63532432800, #    local_end 2014-04-06 02:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  63532393200, #    utc_start 2014-04-05 15:00:00 (Sat)
  63548119800, #      utc_end 2014-10-04 15:30:00 (Sat)
  63532431000, #  local_start 2014-04-06 01:30:00 (Sun)
  63548157600, #    local_end 2014-10-05 02:00:00 (Sun)
  37800,
  0,
  '+1030',
      ],
      [
  63548119800, #    utc_start 2014-10-04 15:30:00 (Sat)
  63563842800, #      utc_end 2015-04-04 15:00:00 (Sat)
  63548159400, #  local_start 2014-10-05 02:30:00 (Sun)
  63563882400, #    local_end 2015-04-05 02:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  63563842800, #    utc_start 2015-04-04 15:00:00 (Sat)
  63579569400, #      utc_end 2015-10-03 15:30:00 (Sat)
  63563880600, #  local_start 2015-04-05 01:30:00 (Sun)
  63579607200, #    local_end 2015-10-04 02:00:00 (Sun)
  37800,
  0,
  '+1030',
      ],
      [
  63579569400, #    utc_start 2015-10-03 15:30:00 (Sat)
  63595292400, #      utc_end 2016-04-02 15:00:00 (Sat)
  63579609000, #  local_start 2015-10-04 02:30:00 (Sun)
  63595332000, #    local_end 2016-04-03 02:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  63595292400, #    utc_start 2016-04-02 15:00:00 (Sat)
  63611019000, #      utc_end 2016-10-01 15:30:00 (Sat)
  63595330200, #  local_start 2016-04-03 01:30:00 (Sun)
  63611056800, #    local_end 2016-10-02 02:00:00 (Sun)
  37800,
  0,
  '+1030',
      ],
      [
  63611019000, #    utc_start 2016-10-01 15:30:00 (Sat)
  63626742000, #      utc_end 2017-04-01 15:00:00 (Sat)
  63611058600, #  local_start 2016-10-02 02:30:00 (Sun)
  63626781600, #    local_end 2017-04-02 02:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  63626742000, #    utc_start 2017-04-01 15:00:00 (Sat)
  63642468600, #      utc_end 2017-09-30 15:30:00 (Sat)
  63626779800, #  local_start 2017-04-02 01:30:00 (Sun)
  63642506400, #    local_end 2017-10-01 02:00:00 (Sun)
  37800,
  0,
  '+1030',
      ],
      [
  63642468600, #    utc_start 2017-09-30 15:30:00 (Sat)
  63658191600, #      utc_end 2018-03-31 15:00:00 (Sat)
  63642508200, #  local_start 2017-10-01 02:30:00 (Sun)
  63658231200, #    local_end 2018-04-01 02:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  63658191600, #    utc_start 2018-03-31 15:00:00 (Sat)
  63674523000, #      utc_end 2018-10-06 15:30:00 (Sat)
  63658229400, #  local_start 2018-04-01 01:30:00 (Sun)
  63674560800, #    local_end 2018-10-07 02:00:00 (Sun)
  37800,
  0,
  '+1030',
      ],
      [
  63674523000, #    utc_start 2018-10-06 15:30:00 (Sat)
  63690246000, #      utc_end 2019-04-06 15:00:00 (Sat)
  63674562600, #  local_start 2018-10-07 02:30:00 (Sun)
  63690285600, #    local_end 2019-04-07 02:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  63690246000, #    utc_start 2019-04-06 15:00:00 (Sat)
  63705972600, #      utc_end 2019-10-05 15:30:00 (Sat)
  63690283800, #  local_start 2019-04-07 01:30:00 (Sun)
  63706010400, #    local_end 2019-10-06 02:00:00 (Sun)
  37800,
  0,
  '+1030',
      ],
      [
  63705972600, #    utc_start 2019-10-05 15:30:00 (Sat)
  63721695600, #      utc_end 2020-04-04 15:00:00 (Sat)
  63706012200, #  local_start 2019-10-06 02:30:00 (Sun)
  63721735200, #    local_end 2020-04-05 02:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  63721695600, #    utc_start 2020-04-04 15:00:00 (Sat)
  63737422200, #      utc_end 2020-10-03 15:30:00 (Sat)
  63721733400, #  local_start 2020-04-05 01:30:00 (Sun)
  63737460000, #    local_end 2020-10-04 02:00:00 (Sun)
  37800,
  0,
  '+1030',
      ],
      [
  63737422200, #    utc_start 2020-10-03 15:30:00 (Sat)
  63753145200, #      utc_end 2021-04-03 15:00:00 (Sat)
  63737461800, #  local_start 2020-10-04 02:30:00 (Sun)
  63753184800, #    local_end 2021-04-04 02:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  63753145200, #    utc_start 2021-04-03 15:00:00 (Sat)
  63768871800, #      utc_end 2021-10-02 15:30:00 (Sat)
  63753183000, #  local_start 2021-04-04 01:30:00 (Sun)
  63768909600, #    local_end 2021-10-03 02:00:00 (Sun)
  37800,
  0,
  '+1030',
      ],
      [
  63768871800, #    utc_start 2021-10-02 15:30:00 (Sat)
  63784594800, #      utc_end 2022-04-02 15:00:00 (Sat)
  63768911400, #  local_start 2021-10-03 02:30:00 (Sun)
  63784634400, #    local_end 2022-04-03 02:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  63784594800, #    utc_start 2022-04-02 15:00:00 (Sat)
  63800321400, #      utc_end 2022-10-01 15:30:00 (Sat)
  63784632600, #  local_start 2022-04-03 01:30:00 (Sun)
  63800359200, #    local_end 2022-10-02 02:00:00 (Sun)
  37800,
  0,
  '+1030',
      ],
      [
  63800321400, #    utc_start 2022-10-01 15:30:00 (Sat)
  63816044400, #      utc_end 2023-04-01 15:00:00 (Sat)
  63800361000, #  local_start 2022-10-02 02:30:00 (Sun)
  63816084000, #    local_end 2023-04-02 02:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  63816044400, #    utc_start 2023-04-01 15:00:00 (Sat)
  63831771000, #      utc_end 2023-09-30 15:30:00 (Sat)
  63816082200, #  local_start 2023-04-02 01:30:00 (Sun)
  63831808800, #    local_end 2023-10-01 02:00:00 (Sun)
  37800,
  0,
  '+1030',
      ],
      [
  63831771000, #    utc_start 2023-09-30 15:30:00 (Sat)
  63848098800, #      utc_end 2024-04-06 15:00:00 (Sat)
  63831810600, #  local_start 2023-10-01 02:30:00 (Sun)
  63848138400, #    local_end 2024-04-07 02:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  63848098800, #    utc_start 2024-04-06 15:00:00 (Sat)
  63863825400, #      utc_end 2024-10-05 15:30:00 (Sat)
  63848136600, #  local_start 2024-04-07 01:30:00 (Sun)
  63863863200, #    local_end 2024-10-06 02:00:00 (Sun)
  37800,
  0,
  '+1030',
      ],
      [
  63863825400, #    utc_start 2024-10-05 15:30:00 (Sat)
  63879548400, #      utc_end 2025-04-05 15:00:00 (Sat)
  63863865000, #  local_start 2024-10-06 02:30:00 (Sun)
  63879588000, #    local_end 2025-04-06 02:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  63879548400, #    utc_start 2025-04-05 15:00:00 (Sat)
  63895275000, #      utc_end 2025-10-04 15:30:00 (Sat)
  63879586200, #  local_start 2025-04-06 01:30:00 (Sun)
  63895312800, #    local_end 2025-10-05 02:00:00 (Sun)
  37800,
  0,
  '+1030',
      ],
      [
  63895275000, #    utc_start 2025-10-04 15:30:00 (Sat)
  63910998000, #      utc_end 2026-04-04 15:00:00 (Sat)
  63895314600, #  local_start 2025-10-05 02:30:00 (Sun)
  63911037600, #    local_end 2026-04-05 02:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  63910998000, #    utc_start 2026-04-04 15:00:00 (Sat)
  63926724600, #      utc_end 2026-10-03 15:30:00 (Sat)
  63911035800, #  local_start 2026-04-05 01:30:00 (Sun)
  63926762400, #    local_end 2026-10-04 02:00:00 (Sun)
  37800,
  0,
  '+1030',
      ],
      [
  63926724600, #    utc_start 2026-10-03 15:30:00 (Sat)
  63942447600, #      utc_end 2027-04-03 15:00:00 (Sat)
  63926764200, #  local_start 2026-10-04 02:30:00 (Sun)
  63942487200, #    local_end 2027-04-04 02:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  63942447600, #    utc_start 2027-04-03 15:00:00 (Sat)
  63958174200, #      utc_end 2027-10-02 15:30:00 (Sat)
  63942485400, #  local_start 2027-04-04 01:30:00 (Sun)
  63958212000, #    local_end 2027-10-03 02:00:00 (Sun)
  37800,
  0,
  '+1030',
      ],
      [
  63958174200, #    utc_start 2027-10-02 15:30:00 (Sat)
  63973897200, #      utc_end 2028-04-01 15:00:00 (Sat)
  63958213800, #  local_start 2027-10-03 02:30:00 (Sun)
  63973936800, #    local_end 2028-04-02 02:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  63973897200, #    utc_start 2028-04-01 15:00:00 (Sat)
  63989623800, #      utc_end 2028-09-30 15:30:00 (Sat)
  63973935000, #  local_start 2028-04-02 01:30:00 (Sun)
  63989661600, #    local_end 2028-10-01 02:00:00 (Sun)
  37800,
  0,
  '+1030',
      ],
      [
  63989623800, #    utc_start 2028-09-30 15:30:00 (Sat)
  64005346800, #      utc_end 2029-03-31 15:00:00 (Sat)
  63989663400, #  local_start 2028-10-01 02:30:00 (Sun)
  64005386400, #    local_end 2029-04-01 02:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  64005346800, #    utc_start 2029-03-31 15:00:00 (Sat)
  64021678200, #      utc_end 2029-10-06 15:30:00 (Sat)
  64005384600, #  local_start 2029-04-01 01:30:00 (Sun)
  64021716000, #    local_end 2029-10-07 02:00:00 (Sun)
  37800,
  0,
  '+1030',
      ],
      [
  64021678200, #    utc_start 2029-10-06 15:30:00 (Sat)
  64037401200, #      utc_end 2030-04-06 15:00:00 (Sat)
  64021717800, #  local_start 2029-10-07 02:30:00 (Sun)
  64037440800, #    local_end 2030-04-07 02:00:00 (Sun)
  39600,
  1,
  '+11',
      ],
      [
  64037401200, #    utc_start 2030-04-06 15:00:00 (Sat)
  64053127800, #      utc_end 2030-10-05 15:30:00 (Sat)
  64037439000, #  local_start 2030-04-07 01:30:00 (Sun)
  64053165600, #    local_end 2030-10-06 02:00:00 (Sun)
  37800,
  0,
  '+1030',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {50}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { 37800 }
  
  my $last_observance = bless( {
    'format' => '+1030/+11',
    'gmtoff' => '10:30',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 724823,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 724823,
      'utc_rd_secs' => 0,
      'utc_year' => 1986
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => 37800,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 724822,
      'local_rd_secs' => 48600,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 724822,
      'utc_rd_secs' => 48600,
      'utc_year' => 1986
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2008',
      'in' => 'Oct',
      'letter' => '',
      'name' => 'LH',
      'offset_from_std' => 1800,
      'on' => 'Sun>=1',
      'save' => '0:30',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2008',
      'in' => 'Apr',
      'letter' => '',
      'name' => 'LH',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AUSTRALIA_LORD_HOWE

    $main::fatpacked{"DateTime/TimeZone/Australia/Melbourne.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AUSTRALIA_MELBOURNE';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/australasia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Australia::Melbourne;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Australia::Melbourne::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59771571608, #      utc_end 1895-01-31 14:20:08 (Thu)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59771606400, #    local_end 1895-02-01 00:00:00 (Fri)
  34792,
  0,
  'LMT',
      ],
      [
  59771571608, #    utc_start 1895-01-31 14:20:08 (Thu)
  60463116060, #      utc_end 1916-12-31 14:01:00 (Sun)
  59771607608, #  local_start 1895-02-01 00:20:08 (Fri)
  60463152060, #    local_end 1917-01-01 00:01:00 (Mon)
  36000,
  0,
  'AEST',
      ],
      [
  60463116060, #    utc_start 1916-12-31 14:01:00 (Sun)
  60470290800, #      utc_end 1917-03-24 15:00:00 (Sat)
  60463155660, #  local_start 1917-01-01 01:01:00 (Mon)
  60470330400, #    local_end 1917-03-25 02:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  60470290800, #    utc_start 1917-03-24 15:00:00 (Sat)
  61252041600, #      utc_end 1941-12-31 16:00:00 (Wed)
  60470326800, #  local_start 1917-03-25 01:00:00 (Sun)
  61252077600, #    local_end 1942-01-01 02:00:00 (Thu)
  36000,
  0,
  'AEST',
      ],
      [
  61252041600, #    utc_start 1941-12-31 16:00:00 (Wed)
  61259554800, #      utc_end 1942-03-28 15:00:00 (Sat)
  61252081200, #  local_start 1942-01-01 03:00:00 (Thu)
  61259594400, #    local_end 1942-03-29 02:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  61259554800, #    utc_start 1942-03-28 15:00:00 (Sat)
  61275283200, #      utc_end 1942-09-26 16:00:00 (Sat)
  61259590800, #  local_start 1942-03-29 01:00:00 (Sun)
  61275319200, #    local_end 1942-09-27 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  61275283200, #    utc_start 1942-09-26 16:00:00 (Sat)
  61291004400, #      utc_end 1943-03-27 15:00:00 (Sat)
  61275322800, #  local_start 1942-09-27 03:00:00 (Sun)
  61291044000, #    local_end 1943-03-28 02:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  61291004400, #    utc_start 1943-03-27 15:00:00 (Sat)
  61307337600, #      utc_end 1943-10-02 16:00:00 (Sat)
  61291040400, #  local_start 1943-03-28 01:00:00 (Sun)
  61307373600, #    local_end 1943-10-03 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  61307337600, #    utc_start 1943-10-02 16:00:00 (Sat)
  61322454000, #      utc_end 1944-03-25 15:00:00 (Sat)
  61307377200, #  local_start 1943-10-03 03:00:00 (Sun)
  61322493600, #    local_end 1944-03-26 02:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  61322454000, #    utc_start 1944-03-25 15:00:00 (Sat)
  62167183200, #      utc_end 1970-12-31 14:00:00 (Thu)
  61322490000, #  local_start 1944-03-26 01:00:00 (Sun)
  62167219200, #    local_end 1971-01-01 00:00:00 (Fri)
  36000,
  0,
  'AEST',
      ],
      [
  62167183200, #    utc_start 1970-12-31 14:00:00 (Thu)
  62193369600, #      utc_end 1971-10-30 16:00:00 (Sat)
  62167219200, #  local_start 1971-01-01 00:00:00 (Fri)
  62193405600, #    local_end 1971-10-31 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62193369600, #    utc_start 1971-10-30 16:00:00 (Sat)
  62203651200, #      utc_end 1972-02-26 16:00:00 (Sat)
  62193409200, #  local_start 1971-10-31 03:00:00 (Sun)
  62203690800, #    local_end 1972-02-27 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62203651200, #    utc_start 1972-02-26 16:00:00 (Sat)
  62224819200, #      utc_end 1972-10-28 16:00:00 (Sat)
  62203687200, #  local_start 1972-02-27 02:00:00 (Sun)
  62224855200, #    local_end 1972-10-29 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62224819200, #    utc_start 1972-10-28 16:00:00 (Sat)
  62235705600, #      utc_end 1973-03-03 16:00:00 (Sat)
  62224858800, #  local_start 1972-10-29 03:00:00 (Sun)
  62235745200, #    local_end 1973-03-04 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62235705600, #    utc_start 1973-03-03 16:00:00 (Sat)
  62256268800, #      utc_end 1973-10-27 16:00:00 (Sat)
  62235741600, #  local_start 1973-03-04 02:00:00 (Sun)
  62256304800, #    local_end 1973-10-28 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62256268800, #    utc_start 1973-10-27 16:00:00 (Sat)
  62267155200, #      utc_end 1974-03-02 16:00:00 (Sat)
  62256308400, #  local_start 1973-10-28 03:00:00 (Sun)
  62267194800, #    local_end 1974-03-03 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62267155200, #    utc_start 1974-03-02 16:00:00 (Sat)
  62287718400, #      utc_end 1974-10-26 16:00:00 (Sat)
  62267191200, #  local_start 1974-03-03 02:00:00 (Sun)
  62287754400, #    local_end 1974-10-27 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62287718400, #    utc_start 1974-10-26 16:00:00 (Sat)
  62298604800, #      utc_end 1975-03-01 16:00:00 (Sat)
  62287758000, #  local_start 1974-10-27 03:00:00 (Sun)
  62298644400, #    local_end 1975-03-02 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62298604800, #    utc_start 1975-03-01 16:00:00 (Sat)
  62319168000, #      utc_end 1975-10-25 16:00:00 (Sat)
  62298640800, #  local_start 1975-03-02 02:00:00 (Sun)
  62319204000, #    local_end 1975-10-26 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62319168000, #    utc_start 1975-10-25 16:00:00 (Sat)
  62330659200, #      utc_end 1976-03-06 16:00:00 (Sat)
  62319207600, #  local_start 1975-10-26 03:00:00 (Sun)
  62330698800, #    local_end 1976-03-07 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62330659200, #    utc_start 1976-03-06 16:00:00 (Sat)
  62351222400, #      utc_end 1976-10-30 16:00:00 (Sat)
  62330695200, #  local_start 1976-03-07 02:00:00 (Sun)
  62351258400, #    local_end 1976-10-31 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62351222400, #    utc_start 1976-10-30 16:00:00 (Sat)
  62362108800, #      utc_end 1977-03-05 16:00:00 (Sat)
  62351262000, #  local_start 1976-10-31 03:00:00 (Sun)
  62362148400, #    local_end 1977-03-06 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62362108800, #    utc_start 1977-03-05 16:00:00 (Sat)
  62382672000, #      utc_end 1977-10-29 16:00:00 (Sat)
  62362144800, #  local_start 1977-03-06 02:00:00 (Sun)
  62382708000, #    local_end 1977-10-30 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62382672000, #    utc_start 1977-10-29 16:00:00 (Sat)
  62393558400, #      utc_end 1978-03-04 16:00:00 (Sat)
  62382711600, #  local_start 1977-10-30 03:00:00 (Sun)
  62393598000, #    local_end 1978-03-05 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62393558400, #    utc_start 1978-03-04 16:00:00 (Sat)
  62414121600, #      utc_end 1978-10-28 16:00:00 (Sat)
  62393594400, #  local_start 1978-03-05 02:00:00 (Sun)
  62414157600, #    local_end 1978-10-29 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62414121600, #    utc_start 1978-10-28 16:00:00 (Sat)
  62425008000, #      utc_end 1979-03-03 16:00:00 (Sat)
  62414161200, #  local_start 1978-10-29 03:00:00 (Sun)
  62425047600, #    local_end 1979-03-04 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62425008000, #    utc_start 1979-03-03 16:00:00 (Sat)
  62445571200, #      utc_end 1979-10-27 16:00:00 (Sat)
  62425044000, #  local_start 1979-03-04 02:00:00 (Sun)
  62445607200, #    local_end 1979-10-28 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62445571200, #    utc_start 1979-10-27 16:00:00 (Sat)
  62456457600, #      utc_end 1980-03-01 16:00:00 (Sat)
  62445610800, #  local_start 1979-10-28 03:00:00 (Sun)
  62456497200, #    local_end 1980-03-02 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62456457600, #    utc_start 1980-03-01 16:00:00 (Sat)
  62477020800, #      utc_end 1980-10-25 16:00:00 (Sat)
  62456493600, #  local_start 1980-03-02 02:00:00 (Sun)
  62477056800, #    local_end 1980-10-26 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62477020800, #    utc_start 1980-10-25 16:00:00 (Sat)
  62487907200, #      utc_end 1981-02-28 16:00:00 (Sat)
  62477060400, #  local_start 1980-10-26 03:00:00 (Sun)
  62487946800, #    local_end 1981-03-01 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62487907200, #    utc_start 1981-02-28 16:00:00 (Sat)
  62508470400, #      utc_end 1981-10-24 16:00:00 (Sat)
  62487943200, #  local_start 1981-03-01 02:00:00 (Sun)
  62508506400, #    local_end 1981-10-25 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62508470400, #    utc_start 1981-10-24 16:00:00 (Sat)
  62519961600, #      utc_end 1982-03-06 16:00:00 (Sat)
  62508510000, #  local_start 1981-10-25 03:00:00 (Sun)
  62520001200, #    local_end 1982-03-07 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62519961600, #    utc_start 1982-03-06 16:00:00 (Sat)
  62540524800, #      utc_end 1982-10-30 16:00:00 (Sat)
  62519997600, #  local_start 1982-03-07 02:00:00 (Sun)
  62540560800, #    local_end 1982-10-31 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62540524800, #    utc_start 1982-10-30 16:00:00 (Sat)
  62551411200, #      utc_end 1983-03-05 16:00:00 (Sat)
  62540564400, #  local_start 1982-10-31 03:00:00 (Sun)
  62551450800, #    local_end 1983-03-06 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62551411200, #    utc_start 1983-03-05 16:00:00 (Sat)
  62571974400, #      utc_end 1983-10-29 16:00:00 (Sat)
  62551447200, #  local_start 1983-03-06 02:00:00 (Sun)
  62572010400, #    local_end 1983-10-30 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62571974400, #    utc_start 1983-10-29 16:00:00 (Sat)
  62582860800, #      utc_end 1984-03-03 16:00:00 (Sat)
  62572014000, #  local_start 1983-10-30 03:00:00 (Sun)
  62582900400, #    local_end 1984-03-04 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62582860800, #    utc_start 1984-03-03 16:00:00 (Sat)
  62603424000, #      utc_end 1984-10-27 16:00:00 (Sat)
  62582896800, #  local_start 1984-03-04 02:00:00 (Sun)
  62603460000, #    local_end 1984-10-28 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62603424000, #    utc_start 1984-10-27 16:00:00 (Sat)
  62614310400, #      utc_end 1985-03-02 16:00:00 (Sat)
  62603463600, #  local_start 1984-10-28 03:00:00 (Sun)
  62614350000, #    local_end 1985-03-03 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62614310400, #    utc_start 1985-03-02 16:00:00 (Sat)
  62634873600, #      utc_end 1985-10-26 16:00:00 (Sat)
  62614346400, #  local_start 1985-03-03 02:00:00 (Sun)
  62634909600, #    local_end 1985-10-27 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62634873600, #    utc_start 1985-10-26 16:00:00 (Sat)
  62646969600, #      utc_end 1986-03-15 16:00:00 (Sat)
  62634913200, #  local_start 1985-10-27 03:00:00 (Sun)
  62647009200, #    local_end 1986-03-16 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62646969600, #    utc_start 1986-03-15 16:00:00 (Sat)
  62665718400, #      utc_end 1986-10-18 16:00:00 (Sat)
  62647005600, #  local_start 1986-03-16 02:00:00 (Sun)
  62665754400, #    local_end 1986-10-19 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62665718400, #    utc_start 1986-10-18 16:00:00 (Sat)
  62678419200, #      utc_end 1987-03-14 16:00:00 (Sat)
  62665758000, #  local_start 1986-10-19 03:00:00 (Sun)
  62678458800, #    local_end 1987-03-15 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62678419200, #    utc_start 1987-03-14 16:00:00 (Sat)
  62697168000, #      utc_end 1987-10-17 16:00:00 (Sat)
  62678455200, #  local_start 1987-03-15 02:00:00 (Sun)
  62697204000, #    local_end 1987-10-18 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62697168000, #    utc_start 1987-10-17 16:00:00 (Sat)
  62710473600, #      utc_end 1988-03-19 16:00:00 (Sat)
  62697207600, #  local_start 1987-10-18 03:00:00 (Sun)
  62710513200, #    local_end 1988-03-20 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62710473600, #    utc_start 1988-03-19 16:00:00 (Sat)
  62729827200, #      utc_end 1988-10-29 16:00:00 (Sat)
  62710509600, #  local_start 1988-03-20 02:00:00 (Sun)
  62729863200, #    local_end 1988-10-30 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62729827200, #    utc_start 1988-10-29 16:00:00 (Sat)
  62741923200, #      utc_end 1989-03-18 16:00:00 (Sat)
  62729866800, #  local_start 1988-10-30 03:00:00 (Sun)
  62741962800, #    local_end 1989-03-19 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62741923200, #    utc_start 1989-03-18 16:00:00 (Sat)
  62761276800, #      utc_end 1989-10-28 16:00:00 (Sat)
  62741959200, #  local_start 1989-03-19 02:00:00 (Sun)
  62761312800, #    local_end 1989-10-29 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62761276800, #    utc_start 1989-10-28 16:00:00 (Sat)
  62773372800, #      utc_end 1990-03-17 16:00:00 (Sat)
  62761316400, #  local_start 1989-10-29 03:00:00 (Sun)
  62773412400, #    local_end 1990-03-18 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62773372800, #    utc_start 1990-03-17 16:00:00 (Sat)
  62792726400, #      utc_end 1990-10-27 16:00:00 (Sat)
  62773408800, #  local_start 1990-03-18 02:00:00 (Sun)
  62792762400, #    local_end 1990-10-28 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62792726400, #    utc_start 1990-10-27 16:00:00 (Sat)
  62803612800, #      utc_end 1991-03-02 16:00:00 (Sat)
  62792766000, #  local_start 1990-10-28 03:00:00 (Sun)
  62803652400, #    local_end 1991-03-03 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62803612800, #    utc_start 1991-03-02 16:00:00 (Sat)
  62824176000, #      utc_end 1991-10-26 16:00:00 (Sat)
  62803648800, #  local_start 1991-03-03 02:00:00 (Sun)
  62824212000, #    local_end 1991-10-27 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62824176000, #    utc_start 1991-10-26 16:00:00 (Sat)
  62835062400, #      utc_end 1992-02-29 16:00:00 (Sat)
  62824215600, #  local_start 1991-10-27 03:00:00 (Sun)
  62835102000, #    local_end 1992-03-01 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62835062400, #    utc_start 1992-02-29 16:00:00 (Sat)
  62855625600, #      utc_end 1992-10-24 16:00:00 (Sat)
  62835098400, #  local_start 1992-03-01 02:00:00 (Sun)
  62855661600, #    local_end 1992-10-25 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62855625600, #    utc_start 1992-10-24 16:00:00 (Sat)
  62867116800, #      utc_end 1993-03-06 16:00:00 (Sat)
  62855665200, #  local_start 1992-10-25 03:00:00 (Sun)
  62867156400, #    local_end 1993-03-07 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62867116800, #    utc_start 1993-03-06 16:00:00 (Sat)
  62887680000, #      utc_end 1993-10-30 16:00:00 (Sat)
  62867152800, #  local_start 1993-03-07 02:00:00 (Sun)
  62887716000, #    local_end 1993-10-31 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62887680000, #    utc_start 1993-10-30 16:00:00 (Sat)
  62898566400, #      utc_end 1994-03-05 16:00:00 (Sat)
  62887719600, #  local_start 1993-10-31 03:00:00 (Sun)
  62898606000, #    local_end 1994-03-06 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62898566400, #    utc_start 1994-03-05 16:00:00 (Sat)
  62919129600, #      utc_end 1994-10-29 16:00:00 (Sat)
  62898602400, #  local_start 1994-03-06 02:00:00 (Sun)
  62919165600, #    local_end 1994-10-30 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62919129600, #    utc_start 1994-10-29 16:00:00 (Sat)
  62931830400, #      utc_end 1995-03-25 16:00:00 (Sat)
  62919169200, #  local_start 1994-10-30 03:00:00 (Sun)
  62931870000, #    local_end 1995-03-26 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62931830400, #    utc_start 1995-03-25 16:00:00 (Sat)
  62950579200, #      utc_end 1995-10-28 16:00:00 (Sat)
  62931866400, #  local_start 1995-03-26 02:00:00 (Sun)
  62950615200, #    local_end 1995-10-29 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62950579200, #    utc_start 1995-10-28 16:00:00 (Sat)
  62963884800, #      utc_end 1996-03-30 16:00:00 (Sat)
  62950618800, #  local_start 1995-10-29 03:00:00 (Sun)
  62963924400, #    local_end 1996-03-31 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62963884800, #    utc_start 1996-03-30 16:00:00 (Sat)
  62982028800, #      utc_end 1996-10-26 16:00:00 (Sat)
  62963920800, #  local_start 1996-03-31 02:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62982028800, #    utc_start 1996-10-26 16:00:00 (Sat)
  62995334400, #      utc_end 1997-03-29 16:00:00 (Sat)
  62982068400, #  local_start 1996-10-27 03:00:00 (Sun)
  62995374000, #    local_end 1997-03-30 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62995334400, #    utc_start 1997-03-29 16:00:00 (Sat)
  63013478400, #      utc_end 1997-10-25 16:00:00 (Sat)
  62995370400, #  local_start 1997-03-30 02:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63013478400, #    utc_start 1997-10-25 16:00:00 (Sat)
  63026784000, #      utc_end 1998-03-28 16:00:00 (Sat)
  63013518000, #  local_start 1997-10-26 03:00:00 (Sun)
  63026823600, #    local_end 1998-03-29 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63026784000, #    utc_start 1998-03-28 16:00:00 (Sat)
  63044928000, #      utc_end 1998-10-24 16:00:00 (Sat)
  63026820000, #  local_start 1998-03-29 02:00:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63044928000, #    utc_start 1998-10-24 16:00:00 (Sat)
  63058233600, #      utc_end 1999-03-27 16:00:00 (Sat)
  63044967600, #  local_start 1998-10-25 03:00:00 (Sun)
  63058273200, #    local_end 1999-03-28 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63058233600, #    utc_start 1999-03-27 16:00:00 (Sat)
  63076982400, #      utc_end 1999-10-30 16:00:00 (Sat)
  63058269600, #  local_start 1999-03-28 02:00:00 (Sun)
  63077018400, #    local_end 1999-10-31 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63076982400, #    utc_start 1999-10-30 16:00:00 (Sat)
  63089683200, #      utc_end 2000-03-25 16:00:00 (Sat)
  63077022000, #  local_start 1999-10-31 03:00:00 (Sun)
  63089722800, #    local_end 2000-03-26 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63089683200, #    utc_start 2000-03-25 16:00:00 (Sat)
  63102988800, #      utc_end 2000-08-26 16:00:00 (Sat)
  63089719200, #  local_start 2000-03-26 02:00:00 (Sun)
  63103024800, #    local_end 2000-08-27 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63102988800, #    utc_start 2000-08-26 16:00:00 (Sat)
  63121132800, #      utc_end 2001-03-24 16:00:00 (Sat)
  63103028400, #  local_start 2000-08-27 03:00:00 (Sun)
  63121172400, #    local_end 2001-03-25 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63121132800, #    utc_start 2001-03-24 16:00:00 (Sat)
  63139881600, #      utc_end 2001-10-27 16:00:00 (Sat)
  63121168800, #  local_start 2001-03-25 02:00:00 (Sun)
  63139917600, #    local_end 2001-10-28 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63139881600, #    utc_start 2001-10-27 16:00:00 (Sat)
  63153187200, #      utc_end 2002-03-30 16:00:00 (Sat)
  63139921200, #  local_start 2001-10-28 03:00:00 (Sun)
  63153226800, #    local_end 2002-03-31 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63153187200, #    utc_start 2002-03-30 16:00:00 (Sat)
  63171331200, #      utc_end 2002-10-26 16:00:00 (Sat)
  63153223200, #  local_start 2002-03-31 02:00:00 (Sun)
  63171367200, #    local_end 2002-10-27 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63171331200, #    utc_start 2002-10-26 16:00:00 (Sat)
  63184636800, #      utc_end 2003-03-29 16:00:00 (Sat)
  63171370800, #  local_start 2002-10-27 03:00:00 (Sun)
  63184676400, #    local_end 2003-03-30 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63184636800, #    utc_start 2003-03-29 16:00:00 (Sat)
  63202780800, #      utc_end 2003-10-25 16:00:00 (Sat)
  63184672800, #  local_start 2003-03-30 02:00:00 (Sun)
  63202816800, #    local_end 2003-10-26 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63202780800, #    utc_start 2003-10-25 16:00:00 (Sat)
  63216086400, #      utc_end 2004-03-27 16:00:00 (Sat)
  63202820400, #  local_start 2003-10-26 03:00:00 (Sun)
  63216126000, #    local_end 2004-03-28 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63216086400, #    utc_start 2004-03-27 16:00:00 (Sat)
  63234835200, #      utc_end 2004-10-30 16:00:00 (Sat)
  63216122400, #  local_start 2004-03-28 02:00:00 (Sun)
  63234871200, #    local_end 2004-10-31 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63234835200, #    utc_start 2004-10-30 16:00:00 (Sat)
  63247536000, #      utc_end 2005-03-26 16:00:00 (Sat)
  63234874800, #  local_start 2004-10-31 03:00:00 (Sun)
  63247575600, #    local_end 2005-03-27 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63247536000, #    utc_start 2005-03-26 16:00:00 (Sat)
  63266284800, #      utc_end 2005-10-29 16:00:00 (Sat)
  63247572000, #  local_start 2005-03-27 02:00:00 (Sun)
  63266320800, #    local_end 2005-10-30 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63266284800, #    utc_start 2005-10-29 16:00:00 (Sat)
  63279590400, #      utc_end 2006-04-01 16:00:00 (Sat)
  63266324400, #  local_start 2005-10-30 03:00:00 (Sun)
  63279630000, #    local_end 2006-04-02 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63279590400, #    utc_start 2006-04-01 16:00:00 (Sat)
  63297734400, #      utc_end 2006-10-28 16:00:00 (Sat)
  63279626400, #  local_start 2006-04-02 02:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63297734400, #    utc_start 2006-10-28 16:00:00 (Sat)
  63310435200, #      utc_end 2007-03-24 16:00:00 (Sat)
  63297774000, #  local_start 2006-10-29 03:00:00 (Sun)
  63310474800, #    local_end 2007-03-25 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63310435200, #    utc_start 2007-03-24 16:00:00 (Sat)
  63329184000, #      utc_end 2007-10-27 16:00:00 (Sat)
  63310471200, #  local_start 2007-03-25 02:00:00 (Sun)
  63329220000, #    local_end 2007-10-28 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63329184000, #    utc_start 2007-10-27 16:00:00 (Sat)
  63343094400, #      utc_end 2008-04-05 16:00:00 (Sat)
  63329223600, #  local_start 2007-10-28 03:00:00 (Sun)
  63343134000, #    local_end 2008-04-06 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63343094400, #    utc_start 2008-04-05 16:00:00 (Sat)
  63358819200, #      utc_end 2008-10-04 16:00:00 (Sat)
  63343130400, #  local_start 2008-04-06 02:00:00 (Sun)
  63358855200, #    local_end 2008-10-05 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63358819200, #    utc_start 2008-10-04 16:00:00 (Sat)
  63374544000, #      utc_end 2009-04-04 16:00:00 (Sat)
  63358858800, #  local_start 2008-10-05 03:00:00 (Sun)
  63374583600, #    local_end 2009-04-05 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63374544000, #    utc_start 2009-04-04 16:00:00 (Sat)
  63390268800, #      utc_end 2009-10-03 16:00:00 (Sat)
  63374580000, #  local_start 2009-04-05 02:00:00 (Sun)
  63390304800, #    local_end 2009-10-04 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63390268800, #    utc_start 2009-10-03 16:00:00 (Sat)
  63405993600, #      utc_end 2010-04-03 16:00:00 (Sat)
  63390308400, #  local_start 2009-10-04 03:00:00 (Sun)
  63406033200, #    local_end 2010-04-04 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63405993600, #    utc_start 2010-04-03 16:00:00 (Sat)
  63421718400, #      utc_end 2010-10-02 16:00:00 (Sat)
  63406029600, #  local_start 2010-04-04 02:00:00 (Sun)
  63421754400, #    local_end 2010-10-03 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63421718400, #    utc_start 2010-10-02 16:00:00 (Sat)
  63437443200, #      utc_end 2011-04-02 16:00:00 (Sat)
  63421758000, #  local_start 2010-10-03 03:00:00 (Sun)
  63437482800, #    local_end 2011-04-03 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63437443200, #    utc_start 2011-04-02 16:00:00 (Sat)
  63453168000, #      utc_end 2011-10-01 16:00:00 (Sat)
  63437479200, #  local_start 2011-04-03 02:00:00 (Sun)
  63453204000, #    local_end 2011-10-02 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63453168000, #    utc_start 2011-10-01 16:00:00 (Sat)
  63468892800, #      utc_end 2012-03-31 16:00:00 (Sat)
  63453207600, #  local_start 2011-10-02 03:00:00 (Sun)
  63468932400, #    local_end 2012-04-01 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63468892800, #    utc_start 2012-03-31 16:00:00 (Sat)
  63485222400, #      utc_end 2012-10-06 16:00:00 (Sat)
  63468928800, #  local_start 2012-04-01 02:00:00 (Sun)
  63485258400, #    local_end 2012-10-07 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63485222400, #    utc_start 2012-10-06 16:00:00 (Sat)
  63500947200, #      utc_end 2013-04-06 16:00:00 (Sat)
  63485262000, #  local_start 2012-10-07 03:00:00 (Sun)
  63500986800, #    local_end 2013-04-07 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63500947200, #    utc_start 2013-04-06 16:00:00 (Sat)
  63516672000, #      utc_end 2013-10-05 16:00:00 (Sat)
  63500983200, #  local_start 2013-04-07 02:00:00 (Sun)
  63516708000, #    local_end 2013-10-06 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63516672000, #    utc_start 2013-10-05 16:00:00 (Sat)
  63532396800, #      utc_end 2014-04-05 16:00:00 (Sat)
  63516711600, #  local_start 2013-10-06 03:00:00 (Sun)
  63532436400, #    local_end 2014-04-06 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63532396800, #    utc_start 2014-04-05 16:00:00 (Sat)
  63548121600, #      utc_end 2014-10-04 16:00:00 (Sat)
  63532432800, #  local_start 2014-04-06 02:00:00 (Sun)
  63548157600, #    local_end 2014-10-05 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63548121600, #    utc_start 2014-10-04 16:00:00 (Sat)
  63563846400, #      utc_end 2015-04-04 16:00:00 (Sat)
  63548161200, #  local_start 2014-10-05 03:00:00 (Sun)
  63563886000, #    local_end 2015-04-05 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63563846400, #    utc_start 2015-04-04 16:00:00 (Sat)
  63579571200, #      utc_end 2015-10-03 16:00:00 (Sat)
  63563882400, #  local_start 2015-04-05 02:00:00 (Sun)
  63579607200, #    local_end 2015-10-04 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63579571200, #    utc_start 2015-10-03 16:00:00 (Sat)
  63595296000, #      utc_end 2016-04-02 16:00:00 (Sat)
  63579610800, #  local_start 2015-10-04 03:00:00 (Sun)
  63595335600, #    local_end 2016-04-03 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63595296000, #    utc_start 2016-04-02 16:00:00 (Sat)
  63611020800, #      utc_end 2016-10-01 16:00:00 (Sat)
  63595332000, #  local_start 2016-04-03 02:00:00 (Sun)
  63611056800, #    local_end 2016-10-02 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63611020800, #    utc_start 2016-10-01 16:00:00 (Sat)
  63626745600, #      utc_end 2017-04-01 16:00:00 (Sat)
  63611060400, #  local_start 2016-10-02 03:00:00 (Sun)
  63626785200, #    local_end 2017-04-02 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63626745600, #    utc_start 2017-04-01 16:00:00 (Sat)
  63642470400, #      utc_end 2017-09-30 16:00:00 (Sat)
  63626781600, #  local_start 2017-04-02 02:00:00 (Sun)
  63642506400, #    local_end 2017-10-01 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63642470400, #    utc_start 2017-09-30 16:00:00 (Sat)
  63658195200, #      utc_end 2018-03-31 16:00:00 (Sat)
  63642510000, #  local_start 2017-10-01 03:00:00 (Sun)
  63658234800, #    local_end 2018-04-01 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63658195200, #    utc_start 2018-03-31 16:00:00 (Sat)
  63674524800, #      utc_end 2018-10-06 16:00:00 (Sat)
  63658231200, #  local_start 2018-04-01 02:00:00 (Sun)
  63674560800, #    local_end 2018-10-07 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63674524800, #    utc_start 2018-10-06 16:00:00 (Sat)
  63690249600, #      utc_end 2019-04-06 16:00:00 (Sat)
  63674564400, #  local_start 2018-10-07 03:00:00 (Sun)
  63690289200, #    local_end 2019-04-07 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63690249600, #    utc_start 2019-04-06 16:00:00 (Sat)
  63705974400, #      utc_end 2019-10-05 16:00:00 (Sat)
  63690285600, #  local_start 2019-04-07 02:00:00 (Sun)
  63706010400, #    local_end 2019-10-06 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63705974400, #    utc_start 2019-10-05 16:00:00 (Sat)
  63721699200, #      utc_end 2020-04-04 16:00:00 (Sat)
  63706014000, #  local_start 2019-10-06 03:00:00 (Sun)
  63721738800, #    local_end 2020-04-05 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63721699200, #    utc_start 2020-04-04 16:00:00 (Sat)
  63737424000, #      utc_end 2020-10-03 16:00:00 (Sat)
  63721735200, #  local_start 2020-04-05 02:00:00 (Sun)
  63737460000, #    local_end 2020-10-04 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63737424000, #    utc_start 2020-10-03 16:00:00 (Sat)
  63753148800, #      utc_end 2021-04-03 16:00:00 (Sat)
  63737463600, #  local_start 2020-10-04 03:00:00 (Sun)
  63753188400, #    local_end 2021-04-04 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63753148800, #    utc_start 2021-04-03 16:00:00 (Sat)
  63768873600, #      utc_end 2021-10-02 16:00:00 (Sat)
  63753184800, #  local_start 2021-04-04 02:00:00 (Sun)
  63768909600, #    local_end 2021-10-03 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63768873600, #    utc_start 2021-10-02 16:00:00 (Sat)
  63784598400, #      utc_end 2022-04-02 16:00:00 (Sat)
  63768913200, #  local_start 2021-10-03 03:00:00 (Sun)
  63784638000, #    local_end 2022-04-03 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63784598400, #    utc_start 2022-04-02 16:00:00 (Sat)
  63800323200, #      utc_end 2022-10-01 16:00:00 (Sat)
  63784634400, #  local_start 2022-04-03 02:00:00 (Sun)
  63800359200, #    local_end 2022-10-02 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63800323200, #    utc_start 2022-10-01 16:00:00 (Sat)
  63816048000, #      utc_end 2023-04-01 16:00:00 (Sat)
  63800362800, #  local_start 2022-10-02 03:00:00 (Sun)
  63816087600, #    local_end 2023-04-02 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63816048000, #    utc_start 2023-04-01 16:00:00 (Sat)
  63831772800, #      utc_end 2023-09-30 16:00:00 (Sat)
  63816084000, #  local_start 2023-04-02 02:00:00 (Sun)
  63831808800, #    local_end 2023-10-01 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63831772800, #    utc_start 2023-09-30 16:00:00 (Sat)
  63848102400, #      utc_end 2024-04-06 16:00:00 (Sat)
  63831812400, #  local_start 2023-10-01 03:00:00 (Sun)
  63848142000, #    local_end 2024-04-07 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63848102400, #    utc_start 2024-04-06 16:00:00 (Sat)
  63863827200, #      utc_end 2024-10-05 16:00:00 (Sat)
  63848138400, #  local_start 2024-04-07 02:00:00 (Sun)
  63863863200, #    local_end 2024-10-06 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63863827200, #    utc_start 2024-10-05 16:00:00 (Sat)
  63879552000, #      utc_end 2025-04-05 16:00:00 (Sat)
  63863866800, #  local_start 2024-10-06 03:00:00 (Sun)
  63879591600, #    local_end 2025-04-06 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63879552000, #    utc_start 2025-04-05 16:00:00 (Sat)
  63895276800, #      utc_end 2025-10-04 16:00:00 (Sat)
  63879588000, #  local_start 2025-04-06 02:00:00 (Sun)
  63895312800, #    local_end 2025-10-05 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63895276800, #    utc_start 2025-10-04 16:00:00 (Sat)
  63911001600, #      utc_end 2026-04-04 16:00:00 (Sat)
  63895316400, #  local_start 2025-10-05 03:00:00 (Sun)
  63911041200, #    local_end 2026-04-05 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63911001600, #    utc_start 2026-04-04 16:00:00 (Sat)
  63926726400, #      utc_end 2026-10-03 16:00:00 (Sat)
  63911037600, #  local_start 2026-04-05 02:00:00 (Sun)
  63926762400, #    local_end 2026-10-04 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63926726400, #    utc_start 2026-10-03 16:00:00 (Sat)
  63942451200, #      utc_end 2027-04-03 16:00:00 (Sat)
  63926766000, #  local_start 2026-10-04 03:00:00 (Sun)
  63942490800, #    local_end 2027-04-04 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63942451200, #    utc_start 2027-04-03 16:00:00 (Sat)
  63958176000, #      utc_end 2027-10-02 16:00:00 (Sat)
  63942487200, #  local_start 2027-04-04 02:00:00 (Sun)
  63958212000, #    local_end 2027-10-03 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63958176000, #    utc_start 2027-10-02 16:00:00 (Sat)
  63973900800, #      utc_end 2028-04-01 16:00:00 (Sat)
  63958215600, #  local_start 2027-10-03 03:00:00 (Sun)
  63973940400, #    local_end 2028-04-02 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63973900800, #    utc_start 2028-04-01 16:00:00 (Sat)
  63989625600, #      utc_end 2028-09-30 16:00:00 (Sat)
  63973936800, #  local_start 2028-04-02 02:00:00 (Sun)
  63989661600, #    local_end 2028-10-01 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63989625600, #    utc_start 2028-09-30 16:00:00 (Sat)
  64005350400, #      utc_end 2029-03-31 16:00:00 (Sat)
  63989665200, #  local_start 2028-10-01 03:00:00 (Sun)
  64005390000, #    local_end 2029-04-01 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  64005350400, #    utc_start 2029-03-31 16:00:00 (Sat)
  64021680000, #      utc_end 2029-10-06 16:00:00 (Sat)
  64005386400, #  local_start 2029-04-01 02:00:00 (Sun)
  64021716000, #    local_end 2029-10-07 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  64021680000, #    utc_start 2029-10-06 16:00:00 (Sat)
  64037404800, #      utc_end 2030-04-06 16:00:00 (Sat)
  64021719600, #  local_start 2029-10-07 03:00:00 (Sun)
  64037444400, #    local_end 2030-04-07 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  64037404800, #    utc_start 2030-04-06 16:00:00 (Sat)
  64053129600, #      utc_end 2030-10-05 16:00:00 (Sat)
  64037440800, #  local_start 2030-04-07 02:00:00 (Sun)
  64053165600, #    local_end 2030-10-06 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {64}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { 36000 }
  
  my $last_observance = bless( {
    'format' => 'AE%sT',
    'gmtoff' => '10:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 719528,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 719528,
      'utc_rd_secs' => 0,
      'utc_year' => 1972
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => 36000,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 719527,
      'local_rd_secs' => 50400,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 719527,
      'utc_rd_secs' => 50400,
      'utc_year' => 1971
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00s',
      'from' => '2008',
      'in' => 'Apr',
      'letter' => 'S',
      'name' => 'AV',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00s',
      'from' => '2008',
      'in' => 'Oct',
      'letter' => 'D',
      'name' => 'AV',
      'offset_from_std' => 3600,
      'on' => 'Sun>=1',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AUSTRALIA_MELBOURNE

    $main::fatpacked{"DateTime/TimeZone/Australia/Perth.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AUSTRALIA_PERTH';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/australasia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Australia::Perth;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Australia::Perth::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59797757796, #      utc_end 1895-11-30 16:16:36 (Sat)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59797785600, #    local_end 1895-12-01 00:00:00 (Sun)
  27804,
  0,
  'LMT',
      ],
      [
  59797757796, #    utc_start 1895-11-30 16:16:36 (Sat)
  60463123260, #      utc_end 1916-12-31 16:01:00 (Sun)
  59797786596, #  local_start 1895-12-01 00:16:36 (Sun)
  60463152060, #    local_end 1917-01-01 00:01:00 (Mon)
  28800,
  0,
  'AWST',
      ],
      [
  60463123260, #    utc_start 1916-12-31 16:01:00 (Sun)
  60470298000, #      utc_end 1917-03-24 17:00:00 (Sat)
  60463155660, #  local_start 1917-01-01 01:01:00 (Mon)
  60470330400, #    local_end 1917-03-25 02:00:00 (Sun)
  32400,
  1,
  'AWDT',
      ],
      [
  60470298000, #    utc_start 1917-03-24 17:00:00 (Sat)
  61252048800, #      utc_end 1941-12-31 18:00:00 (Wed)
  60470326800, #  local_start 1917-03-25 01:00:00 (Sun)
  61252077600, #    local_end 1942-01-01 02:00:00 (Thu)
  28800,
  0,
  'AWST',
      ],
      [
  61252048800, #    utc_start 1941-12-31 18:00:00 (Wed)
  61259562000, #      utc_end 1942-03-28 17:00:00 (Sat)
  61252081200, #  local_start 1942-01-01 03:00:00 (Thu)
  61259594400, #    local_end 1942-03-29 02:00:00 (Sun)
  32400,
  1,
  'AWDT',
      ],
      [
  61259562000, #    utc_start 1942-03-28 17:00:00 (Sat)
  61275290400, #      utc_end 1942-09-26 18:00:00 (Sat)
  61259590800, #  local_start 1942-03-29 01:00:00 (Sun)
  61275319200, #    local_end 1942-09-27 02:00:00 (Sun)
  28800,
  0,
  'AWST',
      ],
      [
  61275290400, #    utc_start 1942-09-26 18:00:00 (Sat)
  61291011600, #      utc_end 1943-03-27 17:00:00 (Sat)
  61275322800, #  local_start 1942-09-27 03:00:00 (Sun)
  61291044000, #    local_end 1943-03-28 02:00:00 (Sun)
  32400,
  1,
  'AWDT',
      ],
      [
  61291011600, #    utc_start 1943-03-27 17:00:00 (Sat)
  61299216000, #      utc_end 1943-06-30 16:00:00 (Wed)
  61291040400, #  local_start 1943-03-28 01:00:00 (Sun)
  61299244800, #    local_end 1943-07-01 00:00:00 (Thu)
  28800,
  0,
  'AWST',
      ],
      [
  61299216000, #    utc_start 1943-06-30 16:00:00 (Wed)
  62287725600, #      utc_end 1974-10-26 18:00:00 (Sat)
  61299244800, #  local_start 1943-07-01 00:00:00 (Thu)
  62287754400, #    local_end 1974-10-27 02:00:00 (Sun)
  28800,
  0,
  'AWST',
      ],
      [
  62287725600, #    utc_start 1974-10-26 18:00:00 (Sat)
  62298612000, #      utc_end 1975-03-01 18:00:00 (Sat)
  62287758000, #  local_start 1974-10-27 03:00:00 (Sun)
  62298644400, #    local_end 1975-03-02 03:00:00 (Sun)
  32400,
  1,
  'AWDT',
      ],
      [
  62298612000, #    utc_start 1975-03-01 18:00:00 (Sat)
  62571981600, #      utc_end 1983-10-29 18:00:00 (Sat)
  62298640800, #  local_start 1975-03-02 02:00:00 (Sun)
  62572010400, #    local_end 1983-10-30 02:00:00 (Sun)
  28800,
  0,
  'AWST',
      ],
      [
  62571981600, #    utc_start 1983-10-29 18:00:00 (Sat)
  62582868000, #      utc_end 1984-03-03 18:00:00 (Sat)
  62572014000, #  local_start 1983-10-30 03:00:00 (Sun)
  62582900400, #    local_end 1984-03-04 03:00:00 (Sun)
  32400,
  1,
  'AWDT',
      ],
      [
  62582868000, #    utc_start 1984-03-03 18:00:00 (Sat)
  62825997600, #      utc_end 1991-11-16 18:00:00 (Sat)
  62582896800, #  local_start 1984-03-04 02:00:00 (Sun)
  62826026400, #    local_end 1991-11-17 02:00:00 (Sun)
  28800,
  0,
  'AWST',
      ],
      [
  62825997600, #    utc_start 1991-11-16 18:00:00 (Sat)
  62835069600, #      utc_end 1992-02-29 18:00:00 (Sat)
  62826030000, #  local_start 1991-11-17 03:00:00 (Sun)
  62835102000, #    local_end 1992-03-01 03:00:00 (Sun)
  32400,
  1,
  'AWDT',
      ],
      [
  62835069600, #    utc_start 1992-02-29 18:00:00 (Sat)
  63300765600, #      utc_end 2006-12-02 18:00:00 (Sat)
  62835098400, #  local_start 1992-03-01 02:00:00 (Sun)
  63300794400, #    local_end 2006-12-03 02:00:00 (Sun)
  28800,
  0,
  'AWST',
      ],
      [
  63300765600, #    utc_start 2006-12-02 18:00:00 (Sat)
  63310442400, #      utc_end 2007-03-24 18:00:00 (Sat)
  63300798000, #  local_start 2006-12-03 03:00:00 (Sun)
  63310474800, #    local_end 2007-03-25 03:00:00 (Sun)
  32400,
  1,
  'AWDT',
      ],
      [
  63310442400, #    utc_start 2007-03-24 18:00:00 (Sat)
  63329191200, #      utc_end 2007-10-27 18:00:00 (Sat)
  63310471200, #  local_start 2007-03-25 02:00:00 (Sun)
  63329220000, #    local_end 2007-10-28 02:00:00 (Sun)
  28800,
  0,
  'AWST',
      ],
      [
  63329191200, #    utc_start 2007-10-27 18:00:00 (Sat)
  63342496800, #      utc_end 2008-03-29 18:00:00 (Sat)
  63329223600, #  local_start 2007-10-28 03:00:00 (Sun)
  63342529200, #    local_end 2008-03-30 03:00:00 (Sun)
  32400,
  1,
  'AWDT',
      ],
      [
  63342496800, #    utc_start 2008-03-29 18:00:00 (Sat)
  63360640800, #      utc_end 2008-10-25 18:00:00 (Sat)
  63342525600, #  local_start 2008-03-30 02:00:00 (Sun)
  63360669600, #    local_end 2008-10-26 02:00:00 (Sun)
  28800,
  0,
  'AWST',
      ],
      [
  63360640800, #    utc_start 2008-10-25 18:00:00 (Sat)
  63373946400, #      utc_end 2009-03-28 18:00:00 (Sat)
  63360673200, #  local_start 2008-10-26 03:00:00 (Sun)
  63373978800, #    local_end 2009-03-29 03:00:00 (Sun)
  32400,
  1,
  'AWDT',
      ],
      [
  63373946400, #    utc_start 2009-03-28 18:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  63373975200, #  local_start 2009-03-29 02:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  28800,
  0,
  'AWST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {9}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_AUSTRALIA_PERTH

    $main::fatpacked{"DateTime/TimeZone/Australia/Sydney.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_AUSTRALIA_SYDNEY';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/australasia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Australia::Sydney;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Australia::Sydney::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59771570108, #      utc_end 1895-01-31 13:55:08 (Thu)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59771606400, #    local_end 1895-02-01 00:00:00 (Fri)
  36292,
  0,
  'LMT',
      ],
      [
  59771570108, #    utc_start 1895-01-31 13:55:08 (Thu)
  60463116060, #      utc_end 1916-12-31 14:01:00 (Sun)
  59771606108, #  local_start 1895-01-31 23:55:08 (Thu)
  60463152060, #    local_end 1917-01-01 00:01:00 (Mon)
  36000,
  0,
  'AEST',
      ],
      [
  60463116060, #    utc_start 1916-12-31 14:01:00 (Sun)
  60470290800, #      utc_end 1917-03-24 15:00:00 (Sat)
  60463155660, #  local_start 1917-01-01 01:01:00 (Mon)
  60470330400, #    local_end 1917-03-25 02:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  60470290800, #    utc_start 1917-03-24 15:00:00 (Sat)
  61252041600, #      utc_end 1941-12-31 16:00:00 (Wed)
  60470326800, #  local_start 1917-03-25 01:00:00 (Sun)
  61252077600, #    local_end 1942-01-01 02:00:00 (Thu)
  36000,
  0,
  'AEST',
      ],
      [
  61252041600, #    utc_start 1941-12-31 16:00:00 (Wed)
  61259554800, #      utc_end 1942-03-28 15:00:00 (Sat)
  61252081200, #  local_start 1942-01-01 03:00:00 (Thu)
  61259594400, #    local_end 1942-03-29 02:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  61259554800, #    utc_start 1942-03-28 15:00:00 (Sat)
  61275283200, #      utc_end 1942-09-26 16:00:00 (Sat)
  61259590800, #  local_start 1942-03-29 01:00:00 (Sun)
  61275319200, #    local_end 1942-09-27 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  61275283200, #    utc_start 1942-09-26 16:00:00 (Sat)
  61291004400, #      utc_end 1943-03-27 15:00:00 (Sat)
  61275322800, #  local_start 1942-09-27 03:00:00 (Sun)
  61291044000, #    local_end 1943-03-28 02:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  61291004400, #    utc_start 1943-03-27 15:00:00 (Sat)
  61307337600, #      utc_end 1943-10-02 16:00:00 (Sat)
  61291040400, #  local_start 1943-03-28 01:00:00 (Sun)
  61307373600, #    local_end 1943-10-03 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  61307337600, #    utc_start 1943-10-02 16:00:00 (Sat)
  61322454000, #      utc_end 1944-03-25 15:00:00 (Sat)
  61307377200, #  local_start 1943-10-03 03:00:00 (Sun)
  61322493600, #    local_end 1944-03-26 02:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  61322454000, #    utc_start 1944-03-25 15:00:00 (Sat)
  62167183200, #      utc_end 1970-12-31 14:00:00 (Thu)
  61322490000, #  local_start 1944-03-26 01:00:00 (Sun)
  62167219200, #    local_end 1971-01-01 00:00:00 (Fri)
  36000,
  0,
  'AEST',
      ],
      [
  62167183200, #    utc_start 1970-12-31 14:00:00 (Thu)
  62193369600, #      utc_end 1971-10-30 16:00:00 (Sat)
  62167219200, #  local_start 1971-01-01 00:00:00 (Fri)
  62193405600, #    local_end 1971-10-31 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62193369600, #    utc_start 1971-10-30 16:00:00 (Sat)
  62203651200, #      utc_end 1972-02-26 16:00:00 (Sat)
  62193409200, #  local_start 1971-10-31 03:00:00 (Sun)
  62203690800, #    local_end 1972-02-27 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62203651200, #    utc_start 1972-02-26 16:00:00 (Sat)
  62224819200, #      utc_end 1972-10-28 16:00:00 (Sat)
  62203687200, #  local_start 1972-02-27 02:00:00 (Sun)
  62224855200, #    local_end 1972-10-29 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62224819200, #    utc_start 1972-10-28 16:00:00 (Sat)
  62235705600, #      utc_end 1973-03-03 16:00:00 (Sat)
  62224858800, #  local_start 1972-10-29 03:00:00 (Sun)
  62235745200, #    local_end 1973-03-04 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62235705600, #    utc_start 1973-03-03 16:00:00 (Sat)
  62256268800, #      utc_end 1973-10-27 16:00:00 (Sat)
  62235741600, #  local_start 1973-03-04 02:00:00 (Sun)
  62256304800, #    local_end 1973-10-28 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62256268800, #    utc_start 1973-10-27 16:00:00 (Sat)
  62267155200, #      utc_end 1974-03-02 16:00:00 (Sat)
  62256308400, #  local_start 1973-10-28 03:00:00 (Sun)
  62267194800, #    local_end 1974-03-03 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62267155200, #    utc_start 1974-03-02 16:00:00 (Sat)
  62287718400, #      utc_end 1974-10-26 16:00:00 (Sat)
  62267191200, #  local_start 1974-03-03 02:00:00 (Sun)
  62287754400, #    local_end 1974-10-27 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62287718400, #    utc_start 1974-10-26 16:00:00 (Sat)
  62298604800, #      utc_end 1975-03-01 16:00:00 (Sat)
  62287758000, #  local_start 1974-10-27 03:00:00 (Sun)
  62298644400, #    local_end 1975-03-02 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62298604800, #    utc_start 1975-03-01 16:00:00 (Sat)
  62319168000, #      utc_end 1975-10-25 16:00:00 (Sat)
  62298640800, #  local_start 1975-03-02 02:00:00 (Sun)
  62319204000, #    local_end 1975-10-26 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62319168000, #    utc_start 1975-10-25 16:00:00 (Sat)
  62330659200, #      utc_end 1976-03-06 16:00:00 (Sat)
  62319207600, #  local_start 1975-10-26 03:00:00 (Sun)
  62330698800, #    local_end 1976-03-07 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62330659200, #    utc_start 1976-03-06 16:00:00 (Sat)
  62351222400, #      utc_end 1976-10-30 16:00:00 (Sat)
  62330695200, #  local_start 1976-03-07 02:00:00 (Sun)
  62351258400, #    local_end 1976-10-31 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62351222400, #    utc_start 1976-10-30 16:00:00 (Sat)
  62362108800, #      utc_end 1977-03-05 16:00:00 (Sat)
  62351262000, #  local_start 1976-10-31 03:00:00 (Sun)
  62362148400, #    local_end 1977-03-06 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62362108800, #    utc_start 1977-03-05 16:00:00 (Sat)
  62382672000, #      utc_end 1977-10-29 16:00:00 (Sat)
  62362144800, #  local_start 1977-03-06 02:00:00 (Sun)
  62382708000, #    local_end 1977-10-30 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62382672000, #    utc_start 1977-10-29 16:00:00 (Sat)
  62393558400, #      utc_end 1978-03-04 16:00:00 (Sat)
  62382711600, #  local_start 1977-10-30 03:00:00 (Sun)
  62393598000, #    local_end 1978-03-05 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62393558400, #    utc_start 1978-03-04 16:00:00 (Sat)
  62414121600, #      utc_end 1978-10-28 16:00:00 (Sat)
  62393594400, #  local_start 1978-03-05 02:00:00 (Sun)
  62414157600, #    local_end 1978-10-29 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62414121600, #    utc_start 1978-10-28 16:00:00 (Sat)
  62425008000, #      utc_end 1979-03-03 16:00:00 (Sat)
  62414161200, #  local_start 1978-10-29 03:00:00 (Sun)
  62425047600, #    local_end 1979-03-04 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62425008000, #    utc_start 1979-03-03 16:00:00 (Sat)
  62445571200, #      utc_end 1979-10-27 16:00:00 (Sat)
  62425044000, #  local_start 1979-03-04 02:00:00 (Sun)
  62445607200, #    local_end 1979-10-28 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62445571200, #    utc_start 1979-10-27 16:00:00 (Sat)
  62456457600, #      utc_end 1980-03-01 16:00:00 (Sat)
  62445610800, #  local_start 1979-10-28 03:00:00 (Sun)
  62456497200, #    local_end 1980-03-02 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62456457600, #    utc_start 1980-03-01 16:00:00 (Sat)
  62477020800, #      utc_end 1980-10-25 16:00:00 (Sat)
  62456493600, #  local_start 1980-03-02 02:00:00 (Sun)
  62477056800, #    local_end 1980-10-26 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62477020800, #    utc_start 1980-10-25 16:00:00 (Sat)
  62487907200, #      utc_end 1981-02-28 16:00:00 (Sat)
  62477060400, #  local_start 1980-10-26 03:00:00 (Sun)
  62487946800, #    local_end 1981-03-01 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62487907200, #    utc_start 1981-02-28 16:00:00 (Sat)
  62508470400, #      utc_end 1981-10-24 16:00:00 (Sat)
  62487943200, #  local_start 1981-03-01 02:00:00 (Sun)
  62508506400, #    local_end 1981-10-25 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62508470400, #    utc_start 1981-10-24 16:00:00 (Sat)
  62522380800, #      utc_end 1982-04-03 16:00:00 (Sat)
  62508510000, #  local_start 1981-10-25 03:00:00 (Sun)
  62522420400, #    local_end 1982-04-04 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62522380800, #    utc_start 1982-04-03 16:00:00 (Sat)
  62540524800, #      utc_end 1982-10-30 16:00:00 (Sat)
  62522416800, #  local_start 1982-04-04 02:00:00 (Sun)
  62540560800, #    local_end 1982-10-31 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62540524800, #    utc_start 1982-10-30 16:00:00 (Sat)
  62551411200, #      utc_end 1983-03-05 16:00:00 (Sat)
  62540564400, #  local_start 1982-10-31 03:00:00 (Sun)
  62551450800, #    local_end 1983-03-06 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62551411200, #    utc_start 1983-03-05 16:00:00 (Sat)
  62571974400, #      utc_end 1983-10-29 16:00:00 (Sat)
  62551447200, #  local_start 1983-03-06 02:00:00 (Sun)
  62572010400, #    local_end 1983-10-30 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62571974400, #    utc_start 1983-10-29 16:00:00 (Sat)
  62582860800, #      utc_end 1984-03-03 16:00:00 (Sat)
  62572014000, #  local_start 1983-10-30 03:00:00 (Sun)
  62582900400, #    local_end 1984-03-04 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62582860800, #    utc_start 1984-03-03 16:00:00 (Sat)
  62603424000, #      utc_end 1984-10-27 16:00:00 (Sat)
  62582896800, #  local_start 1984-03-04 02:00:00 (Sun)
  62603460000, #    local_end 1984-10-28 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62603424000, #    utc_start 1984-10-27 16:00:00 (Sat)
  62614310400, #      utc_end 1985-03-02 16:00:00 (Sat)
  62603463600, #  local_start 1984-10-28 03:00:00 (Sun)
  62614350000, #    local_end 1985-03-03 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62614310400, #    utc_start 1985-03-02 16:00:00 (Sat)
  62634873600, #      utc_end 1985-10-26 16:00:00 (Sat)
  62614346400, #  local_start 1985-03-03 02:00:00 (Sun)
  62634909600, #    local_end 1985-10-27 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62634873600, #    utc_start 1985-10-26 16:00:00 (Sat)
  62646969600, #      utc_end 1986-03-15 16:00:00 (Sat)
  62634913200, #  local_start 1985-10-27 03:00:00 (Sun)
  62647009200, #    local_end 1986-03-16 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62646969600, #    utc_start 1986-03-15 16:00:00 (Sat)
  62665718400, #      utc_end 1986-10-18 16:00:00 (Sat)
  62647005600, #  local_start 1986-03-16 02:00:00 (Sun)
  62665754400, #    local_end 1986-10-19 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62665718400, #    utc_start 1986-10-18 16:00:00 (Sat)
  62678419200, #      utc_end 1987-03-14 16:00:00 (Sat)
  62665758000, #  local_start 1986-10-19 03:00:00 (Sun)
  62678458800, #    local_end 1987-03-15 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62678419200, #    utc_start 1987-03-14 16:00:00 (Sat)
  62697772800, #      utc_end 1987-10-24 16:00:00 (Sat)
  62678455200, #  local_start 1987-03-15 02:00:00 (Sun)
  62697808800, #    local_end 1987-10-25 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62697772800, #    utc_start 1987-10-24 16:00:00 (Sat)
  62710473600, #      utc_end 1988-03-19 16:00:00 (Sat)
  62697812400, #  local_start 1987-10-25 03:00:00 (Sun)
  62710513200, #    local_end 1988-03-20 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62710473600, #    utc_start 1988-03-19 16:00:00 (Sat)
  62729827200, #      utc_end 1988-10-29 16:00:00 (Sat)
  62710509600, #  local_start 1988-03-20 02:00:00 (Sun)
  62729863200, #    local_end 1988-10-30 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62729827200, #    utc_start 1988-10-29 16:00:00 (Sat)
  62741923200, #      utc_end 1989-03-18 16:00:00 (Sat)
  62729866800, #  local_start 1988-10-30 03:00:00 (Sun)
  62741962800, #    local_end 1989-03-19 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62741923200, #    utc_start 1989-03-18 16:00:00 (Sat)
  62761276800, #      utc_end 1989-10-28 16:00:00 (Sat)
  62741959200, #  local_start 1989-03-19 02:00:00 (Sun)
  62761312800, #    local_end 1989-10-29 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62761276800, #    utc_start 1989-10-28 16:00:00 (Sat)
  62772163200, #      utc_end 1990-03-03 16:00:00 (Sat)
  62761316400, #  local_start 1989-10-29 03:00:00 (Sun)
  62772202800, #    local_end 1990-03-04 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62772163200, #    utc_start 1990-03-03 16:00:00 (Sat)
  62792726400, #      utc_end 1990-10-27 16:00:00 (Sat)
  62772199200, #  local_start 1990-03-04 02:00:00 (Sun)
  62792762400, #    local_end 1990-10-28 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62792726400, #    utc_start 1990-10-27 16:00:00 (Sat)
  62803612800, #      utc_end 1991-03-02 16:00:00 (Sat)
  62792766000, #  local_start 1990-10-28 03:00:00 (Sun)
  62803652400, #    local_end 1991-03-03 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62803612800, #    utc_start 1991-03-02 16:00:00 (Sat)
  62824176000, #      utc_end 1991-10-26 16:00:00 (Sat)
  62803648800, #  local_start 1991-03-03 02:00:00 (Sun)
  62824212000, #    local_end 1991-10-27 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62824176000, #    utc_start 1991-10-26 16:00:00 (Sat)
  62835062400, #      utc_end 1992-02-29 16:00:00 (Sat)
  62824215600, #  local_start 1991-10-27 03:00:00 (Sun)
  62835102000, #    local_end 1992-03-01 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62835062400, #    utc_start 1992-02-29 16:00:00 (Sat)
  62855625600, #      utc_end 1992-10-24 16:00:00 (Sat)
  62835098400, #  local_start 1992-03-01 02:00:00 (Sun)
  62855661600, #    local_end 1992-10-25 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62855625600, #    utc_start 1992-10-24 16:00:00 (Sat)
  62867116800, #      utc_end 1993-03-06 16:00:00 (Sat)
  62855665200, #  local_start 1992-10-25 03:00:00 (Sun)
  62867156400, #    local_end 1993-03-07 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62867116800, #    utc_start 1993-03-06 16:00:00 (Sat)
  62887680000, #      utc_end 1993-10-30 16:00:00 (Sat)
  62867152800, #  local_start 1993-03-07 02:00:00 (Sun)
  62887716000, #    local_end 1993-10-31 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62887680000, #    utc_start 1993-10-30 16:00:00 (Sat)
  62898566400, #      utc_end 1994-03-05 16:00:00 (Sat)
  62887719600, #  local_start 1993-10-31 03:00:00 (Sun)
  62898606000, #    local_end 1994-03-06 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62898566400, #    utc_start 1994-03-05 16:00:00 (Sat)
  62919129600, #      utc_end 1994-10-29 16:00:00 (Sat)
  62898602400, #  local_start 1994-03-06 02:00:00 (Sun)
  62919165600, #    local_end 1994-10-30 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62919129600, #    utc_start 1994-10-29 16:00:00 (Sat)
  62930016000, #      utc_end 1995-03-04 16:00:00 (Sat)
  62919169200, #  local_start 1994-10-30 03:00:00 (Sun)
  62930055600, #    local_end 1995-03-05 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62930016000, #    utc_start 1995-03-04 16:00:00 (Sat)
  62950579200, #      utc_end 1995-10-28 16:00:00 (Sat)
  62930052000, #  local_start 1995-03-05 02:00:00 (Sun)
  62950615200, #    local_end 1995-10-29 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62950579200, #    utc_start 1995-10-28 16:00:00 (Sat)
  62963884800, #      utc_end 1996-03-30 16:00:00 (Sat)
  62950618800, #  local_start 1995-10-29 03:00:00 (Sun)
  62963924400, #    local_end 1996-03-31 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62963884800, #    utc_start 1996-03-30 16:00:00 (Sat)
  62982028800, #      utc_end 1996-10-26 16:00:00 (Sat)
  62963920800, #  local_start 1996-03-31 02:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  62982028800, #    utc_start 1996-10-26 16:00:00 (Sat)
  62995334400, #      utc_end 1997-03-29 16:00:00 (Sat)
  62982068400, #  local_start 1996-10-27 03:00:00 (Sun)
  62995374000, #    local_end 1997-03-30 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  62995334400, #    utc_start 1997-03-29 16:00:00 (Sat)
  63013478400, #      utc_end 1997-10-25 16:00:00 (Sat)
  62995370400, #  local_start 1997-03-30 02:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63013478400, #    utc_start 1997-10-25 16:00:00 (Sat)
  63026784000, #      utc_end 1998-03-28 16:00:00 (Sat)
  63013518000, #  local_start 1997-10-26 03:00:00 (Sun)
  63026823600, #    local_end 1998-03-29 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63026784000, #    utc_start 1998-03-28 16:00:00 (Sat)
  63044928000, #      utc_end 1998-10-24 16:00:00 (Sat)
  63026820000, #  local_start 1998-03-29 02:00:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63044928000, #    utc_start 1998-10-24 16:00:00 (Sat)
  63058233600, #      utc_end 1999-03-27 16:00:00 (Sat)
  63044967600, #  local_start 1998-10-25 03:00:00 (Sun)
  63058273200, #    local_end 1999-03-28 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63058233600, #    utc_start 1999-03-27 16:00:00 (Sat)
  63076982400, #      utc_end 1999-10-30 16:00:00 (Sat)
  63058269600, #  local_start 1999-03-28 02:00:00 (Sun)
  63077018400, #    local_end 1999-10-31 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63076982400, #    utc_start 1999-10-30 16:00:00 (Sat)
  63089683200, #      utc_end 2000-03-25 16:00:00 (Sat)
  63077022000, #  local_start 1999-10-31 03:00:00 (Sun)
  63089722800, #    local_end 2000-03-26 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63089683200, #    utc_start 2000-03-25 16:00:00 (Sat)
  63102988800, #      utc_end 2000-08-26 16:00:00 (Sat)
  63089719200, #  local_start 2000-03-26 02:00:00 (Sun)
  63103024800, #    local_end 2000-08-27 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63102988800, #    utc_start 2000-08-26 16:00:00 (Sat)
  63121132800, #      utc_end 2001-03-24 16:00:00 (Sat)
  63103028400, #  local_start 2000-08-27 03:00:00 (Sun)
  63121172400, #    local_end 2001-03-25 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63121132800, #    utc_start 2001-03-24 16:00:00 (Sat)
  63139881600, #      utc_end 2001-10-27 16:00:00 (Sat)
  63121168800, #  local_start 2001-03-25 02:00:00 (Sun)
  63139917600, #    local_end 2001-10-28 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63139881600, #    utc_start 2001-10-27 16:00:00 (Sat)
  63153187200, #      utc_end 2002-03-30 16:00:00 (Sat)
  63139921200, #  local_start 2001-10-28 03:00:00 (Sun)
  63153226800, #    local_end 2002-03-31 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63153187200, #    utc_start 2002-03-30 16:00:00 (Sat)
  63171331200, #      utc_end 2002-10-26 16:00:00 (Sat)
  63153223200, #  local_start 2002-03-31 02:00:00 (Sun)
  63171367200, #    local_end 2002-10-27 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63171331200, #    utc_start 2002-10-26 16:00:00 (Sat)
  63184636800, #      utc_end 2003-03-29 16:00:00 (Sat)
  63171370800, #  local_start 2002-10-27 03:00:00 (Sun)
  63184676400, #    local_end 2003-03-30 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63184636800, #    utc_start 2003-03-29 16:00:00 (Sat)
  63202780800, #      utc_end 2003-10-25 16:00:00 (Sat)
  63184672800, #  local_start 2003-03-30 02:00:00 (Sun)
  63202816800, #    local_end 2003-10-26 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63202780800, #    utc_start 2003-10-25 16:00:00 (Sat)
  63216086400, #      utc_end 2004-03-27 16:00:00 (Sat)
  63202820400, #  local_start 2003-10-26 03:00:00 (Sun)
  63216126000, #    local_end 2004-03-28 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63216086400, #    utc_start 2004-03-27 16:00:00 (Sat)
  63234835200, #      utc_end 2004-10-30 16:00:00 (Sat)
  63216122400, #  local_start 2004-03-28 02:00:00 (Sun)
  63234871200, #    local_end 2004-10-31 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63234835200, #    utc_start 2004-10-30 16:00:00 (Sat)
  63247536000, #      utc_end 2005-03-26 16:00:00 (Sat)
  63234874800, #  local_start 2004-10-31 03:00:00 (Sun)
  63247575600, #    local_end 2005-03-27 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63247536000, #    utc_start 2005-03-26 16:00:00 (Sat)
  63266284800, #      utc_end 2005-10-29 16:00:00 (Sat)
  63247572000, #  local_start 2005-03-27 02:00:00 (Sun)
  63266320800, #    local_end 2005-10-30 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63266284800, #    utc_start 2005-10-29 16:00:00 (Sat)
  63279590400, #      utc_end 2006-04-01 16:00:00 (Sat)
  63266324400, #  local_start 2005-10-30 03:00:00 (Sun)
  63279630000, #    local_end 2006-04-02 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63279590400, #    utc_start 2006-04-01 16:00:00 (Sat)
  63297734400, #      utc_end 2006-10-28 16:00:00 (Sat)
  63279626400, #  local_start 2006-04-02 02:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63297734400, #    utc_start 2006-10-28 16:00:00 (Sat)
  63310435200, #      utc_end 2007-03-24 16:00:00 (Sat)
  63297774000, #  local_start 2006-10-29 03:00:00 (Sun)
  63310474800, #    local_end 2007-03-25 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63310435200, #    utc_start 2007-03-24 16:00:00 (Sat)
  63329184000, #      utc_end 2007-10-27 16:00:00 (Sat)
  63310471200, #  local_start 2007-03-25 02:00:00 (Sun)
  63329220000, #    local_end 2007-10-28 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63329184000, #    utc_start 2007-10-27 16:00:00 (Sat)
  63343094400, #      utc_end 2008-04-05 16:00:00 (Sat)
  63329223600, #  local_start 2007-10-28 03:00:00 (Sun)
  63343134000, #    local_end 2008-04-06 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63343094400, #    utc_start 2008-04-05 16:00:00 (Sat)
  63358819200, #      utc_end 2008-10-04 16:00:00 (Sat)
  63343130400, #  local_start 2008-04-06 02:00:00 (Sun)
  63358855200, #    local_end 2008-10-05 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63358819200, #    utc_start 2008-10-04 16:00:00 (Sat)
  63374544000, #      utc_end 2009-04-04 16:00:00 (Sat)
  63358858800, #  local_start 2008-10-05 03:00:00 (Sun)
  63374583600, #    local_end 2009-04-05 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63374544000, #    utc_start 2009-04-04 16:00:00 (Sat)
  63390268800, #      utc_end 2009-10-03 16:00:00 (Sat)
  63374580000, #  local_start 2009-04-05 02:00:00 (Sun)
  63390304800, #    local_end 2009-10-04 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63390268800, #    utc_start 2009-10-03 16:00:00 (Sat)
  63405993600, #      utc_end 2010-04-03 16:00:00 (Sat)
  63390308400, #  local_start 2009-10-04 03:00:00 (Sun)
  63406033200, #    local_end 2010-04-04 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63405993600, #    utc_start 2010-04-03 16:00:00 (Sat)
  63421718400, #      utc_end 2010-10-02 16:00:00 (Sat)
  63406029600, #  local_start 2010-04-04 02:00:00 (Sun)
  63421754400, #    local_end 2010-10-03 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63421718400, #    utc_start 2010-10-02 16:00:00 (Sat)
  63437443200, #      utc_end 2011-04-02 16:00:00 (Sat)
  63421758000, #  local_start 2010-10-03 03:00:00 (Sun)
  63437482800, #    local_end 2011-04-03 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63437443200, #    utc_start 2011-04-02 16:00:00 (Sat)
  63453168000, #      utc_end 2011-10-01 16:00:00 (Sat)
  63437479200, #  local_start 2011-04-03 02:00:00 (Sun)
  63453204000, #    local_end 2011-10-02 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63453168000, #    utc_start 2011-10-01 16:00:00 (Sat)
  63468892800, #      utc_end 2012-03-31 16:00:00 (Sat)
  63453207600, #  local_start 2011-10-02 03:00:00 (Sun)
  63468932400, #    local_end 2012-04-01 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63468892800, #    utc_start 2012-03-31 16:00:00 (Sat)
  63485222400, #      utc_end 2012-10-06 16:00:00 (Sat)
  63468928800, #  local_start 2012-04-01 02:00:00 (Sun)
  63485258400, #    local_end 2012-10-07 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63485222400, #    utc_start 2012-10-06 16:00:00 (Sat)
  63500947200, #      utc_end 2013-04-06 16:00:00 (Sat)
  63485262000, #  local_start 2012-10-07 03:00:00 (Sun)
  63500986800, #    local_end 2013-04-07 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63500947200, #    utc_start 2013-04-06 16:00:00 (Sat)
  63516672000, #      utc_end 2013-10-05 16:00:00 (Sat)
  63500983200, #  local_start 2013-04-07 02:00:00 (Sun)
  63516708000, #    local_end 2013-10-06 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63516672000, #    utc_start 2013-10-05 16:00:00 (Sat)
  63532396800, #      utc_end 2014-04-05 16:00:00 (Sat)
  63516711600, #  local_start 2013-10-06 03:00:00 (Sun)
  63532436400, #    local_end 2014-04-06 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63532396800, #    utc_start 2014-04-05 16:00:00 (Sat)
  63548121600, #      utc_end 2014-10-04 16:00:00 (Sat)
  63532432800, #  local_start 2014-04-06 02:00:00 (Sun)
  63548157600, #    local_end 2014-10-05 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63548121600, #    utc_start 2014-10-04 16:00:00 (Sat)
  63563846400, #      utc_end 2015-04-04 16:00:00 (Sat)
  63548161200, #  local_start 2014-10-05 03:00:00 (Sun)
  63563886000, #    local_end 2015-04-05 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63563846400, #    utc_start 2015-04-04 16:00:00 (Sat)
  63579571200, #      utc_end 2015-10-03 16:00:00 (Sat)
  63563882400, #  local_start 2015-04-05 02:00:00 (Sun)
  63579607200, #    local_end 2015-10-04 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63579571200, #    utc_start 2015-10-03 16:00:00 (Sat)
  63595296000, #      utc_end 2016-04-02 16:00:00 (Sat)
  63579610800, #  local_start 2015-10-04 03:00:00 (Sun)
  63595335600, #    local_end 2016-04-03 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63595296000, #    utc_start 2016-04-02 16:00:00 (Sat)
  63611020800, #      utc_end 2016-10-01 16:00:00 (Sat)
  63595332000, #  local_start 2016-04-03 02:00:00 (Sun)
  63611056800, #    local_end 2016-10-02 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63611020800, #    utc_start 2016-10-01 16:00:00 (Sat)
  63626745600, #      utc_end 2017-04-01 16:00:00 (Sat)
  63611060400, #  local_start 2016-10-02 03:00:00 (Sun)
  63626785200, #    local_end 2017-04-02 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63626745600, #    utc_start 2017-04-01 16:00:00 (Sat)
  63642470400, #      utc_end 2017-09-30 16:00:00 (Sat)
  63626781600, #  local_start 2017-04-02 02:00:00 (Sun)
  63642506400, #    local_end 2017-10-01 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63642470400, #    utc_start 2017-09-30 16:00:00 (Sat)
  63658195200, #      utc_end 2018-03-31 16:00:00 (Sat)
  63642510000, #  local_start 2017-10-01 03:00:00 (Sun)
  63658234800, #    local_end 2018-04-01 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63658195200, #    utc_start 2018-03-31 16:00:00 (Sat)
  63674524800, #      utc_end 2018-10-06 16:00:00 (Sat)
  63658231200, #  local_start 2018-04-01 02:00:00 (Sun)
  63674560800, #    local_end 2018-10-07 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63674524800, #    utc_start 2018-10-06 16:00:00 (Sat)
  63690249600, #      utc_end 2019-04-06 16:00:00 (Sat)
  63674564400, #  local_start 2018-10-07 03:00:00 (Sun)
  63690289200, #    local_end 2019-04-07 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63690249600, #    utc_start 2019-04-06 16:00:00 (Sat)
  63705974400, #      utc_end 2019-10-05 16:00:00 (Sat)
  63690285600, #  local_start 2019-04-07 02:00:00 (Sun)
  63706010400, #    local_end 2019-10-06 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63705974400, #    utc_start 2019-10-05 16:00:00 (Sat)
  63721699200, #      utc_end 2020-04-04 16:00:00 (Sat)
  63706014000, #  local_start 2019-10-06 03:00:00 (Sun)
  63721738800, #    local_end 2020-04-05 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63721699200, #    utc_start 2020-04-04 16:00:00 (Sat)
  63737424000, #      utc_end 2020-10-03 16:00:00 (Sat)
  63721735200, #  local_start 2020-04-05 02:00:00 (Sun)
  63737460000, #    local_end 2020-10-04 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63737424000, #    utc_start 2020-10-03 16:00:00 (Sat)
  63753148800, #      utc_end 2021-04-03 16:00:00 (Sat)
  63737463600, #  local_start 2020-10-04 03:00:00 (Sun)
  63753188400, #    local_end 2021-04-04 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63753148800, #    utc_start 2021-04-03 16:00:00 (Sat)
  63768873600, #      utc_end 2021-10-02 16:00:00 (Sat)
  63753184800, #  local_start 2021-04-04 02:00:00 (Sun)
  63768909600, #    local_end 2021-10-03 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63768873600, #    utc_start 2021-10-02 16:00:00 (Sat)
  63784598400, #      utc_end 2022-04-02 16:00:00 (Sat)
  63768913200, #  local_start 2021-10-03 03:00:00 (Sun)
  63784638000, #    local_end 2022-04-03 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63784598400, #    utc_start 2022-04-02 16:00:00 (Sat)
  63800323200, #      utc_end 2022-10-01 16:00:00 (Sat)
  63784634400, #  local_start 2022-04-03 02:00:00 (Sun)
  63800359200, #    local_end 2022-10-02 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63800323200, #    utc_start 2022-10-01 16:00:00 (Sat)
  63816048000, #      utc_end 2023-04-01 16:00:00 (Sat)
  63800362800, #  local_start 2022-10-02 03:00:00 (Sun)
  63816087600, #    local_end 2023-04-02 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63816048000, #    utc_start 2023-04-01 16:00:00 (Sat)
  63831772800, #      utc_end 2023-09-30 16:00:00 (Sat)
  63816084000, #  local_start 2023-04-02 02:00:00 (Sun)
  63831808800, #    local_end 2023-10-01 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63831772800, #    utc_start 2023-09-30 16:00:00 (Sat)
  63848102400, #      utc_end 2024-04-06 16:00:00 (Sat)
  63831812400, #  local_start 2023-10-01 03:00:00 (Sun)
  63848142000, #    local_end 2024-04-07 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63848102400, #    utc_start 2024-04-06 16:00:00 (Sat)
  63863827200, #      utc_end 2024-10-05 16:00:00 (Sat)
  63848138400, #  local_start 2024-04-07 02:00:00 (Sun)
  63863863200, #    local_end 2024-10-06 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63863827200, #    utc_start 2024-10-05 16:00:00 (Sat)
  63879552000, #      utc_end 2025-04-05 16:00:00 (Sat)
  63863866800, #  local_start 2024-10-06 03:00:00 (Sun)
  63879591600, #    local_end 2025-04-06 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63879552000, #    utc_start 2025-04-05 16:00:00 (Sat)
  63895276800, #      utc_end 2025-10-04 16:00:00 (Sat)
  63879588000, #  local_start 2025-04-06 02:00:00 (Sun)
  63895312800, #    local_end 2025-10-05 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63895276800, #    utc_start 2025-10-04 16:00:00 (Sat)
  63911001600, #      utc_end 2026-04-04 16:00:00 (Sat)
  63895316400, #  local_start 2025-10-05 03:00:00 (Sun)
  63911041200, #    local_end 2026-04-05 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63911001600, #    utc_start 2026-04-04 16:00:00 (Sat)
  63926726400, #      utc_end 2026-10-03 16:00:00 (Sat)
  63911037600, #  local_start 2026-04-05 02:00:00 (Sun)
  63926762400, #    local_end 2026-10-04 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63926726400, #    utc_start 2026-10-03 16:00:00 (Sat)
  63942451200, #      utc_end 2027-04-03 16:00:00 (Sat)
  63926766000, #  local_start 2026-10-04 03:00:00 (Sun)
  63942490800, #    local_end 2027-04-04 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63942451200, #    utc_start 2027-04-03 16:00:00 (Sat)
  63958176000, #      utc_end 2027-10-02 16:00:00 (Sat)
  63942487200, #  local_start 2027-04-04 02:00:00 (Sun)
  63958212000, #    local_end 2027-10-03 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63958176000, #    utc_start 2027-10-02 16:00:00 (Sat)
  63973900800, #      utc_end 2028-04-01 16:00:00 (Sat)
  63958215600, #  local_start 2027-10-03 03:00:00 (Sun)
  63973940400, #    local_end 2028-04-02 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  63973900800, #    utc_start 2028-04-01 16:00:00 (Sat)
  63989625600, #      utc_end 2028-09-30 16:00:00 (Sat)
  63973936800, #  local_start 2028-04-02 02:00:00 (Sun)
  63989661600, #    local_end 2028-10-01 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  63989625600, #    utc_start 2028-09-30 16:00:00 (Sat)
  64005350400, #      utc_end 2029-03-31 16:00:00 (Sat)
  63989665200, #  local_start 2028-10-01 03:00:00 (Sun)
  64005390000, #    local_end 2029-04-01 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  64005350400, #    utc_start 2029-03-31 16:00:00 (Sat)
  64021680000, #      utc_end 2029-10-06 16:00:00 (Sat)
  64005386400, #  local_start 2029-04-01 02:00:00 (Sun)
  64021716000, #    local_end 2029-10-07 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
      [
  64021680000, #    utc_start 2029-10-06 16:00:00 (Sat)
  64037404800, #      utc_end 2030-04-06 16:00:00 (Sat)
  64021719600, #  local_start 2029-10-07 03:00:00 (Sun)
  64037444400, #    local_end 2030-04-07 03:00:00 (Sun)
  39600,
  1,
  'AEDT',
      ],
      [
  64037404800, #    utc_start 2030-04-06 16:00:00 (Sat)
  64053129600, #      utc_end 2030-10-05 16:00:00 (Sat)
  64037440800, #  local_start 2030-04-07 02:00:00 (Sun)
  64053165600, #    local_end 2030-10-06 02:00:00 (Sun)
  36000,
  0,
  'AEST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {64}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { 36000 }
  
  my $last_observance = bless( {
    'format' => 'AE%sT',
    'gmtoff' => '10:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 719528,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 719528,
      'utc_rd_secs' => 0,
      'utc_year' => 1972
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => 36000,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 719527,
      'local_rd_secs' => 50400,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 719527,
      'utc_rd_secs' => 50400,
      'utc_year' => 1971
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00s',
      'from' => '2008',
      'in' => 'Oct',
      'letter' => 'D',
      'name' => 'AN',
      'offset_from_std' => 3600,
      'on' => 'Sun>=1',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00s',
      'from' => '2008',
      'in' => 'Apr',
      'letter' => 'S',
      'name' => 'AN',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_AUSTRALIA_SYDNEY

    $main::fatpacked{"DateTime/TimeZone/CET.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_CET';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::CET;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::CET::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60441976800, #      utc_end 1916-04-30 22:00:00 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60441980400, #    local_end 1916-04-30 23:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  60441976800, #    utc_start 1916-04-30 22:00:00 (Sun)
  60455199600, #      utc_end 1916-09-30 23:00:00 (Sat)
  60441984000, #  local_start 1916-05-01 00:00:00 (Mon)
  60455206800, #    local_end 1916-10-01 01:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  60455199600, #    utc_start 1916-09-30 23:00:00 (Sat)
  60472227600, #      utc_end 1917-04-16 01:00:00 (Mon)
  60455203200, #  local_start 1916-10-01 00:00:00 (Sun)
  60472231200, #    local_end 1917-04-16 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  60472227600, #    utc_start 1917-04-16 01:00:00 (Mon)
  60485533200, #      utc_end 1917-09-17 01:00:00 (Mon)
  60472234800, #  local_start 1917-04-16 03:00:00 (Mon)
  60485540400, #    local_end 1917-09-17 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  60485533200, #    utc_start 1917-09-17 01:00:00 (Mon)
  60503677200, #      utc_end 1918-04-15 01:00:00 (Mon)
  60485536800, #  local_start 1917-09-17 02:00:00 (Mon)
  60503680800, #    local_end 1918-04-15 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  60503677200, #    utc_start 1918-04-15 01:00:00 (Mon)
  60516982800, #      utc_end 1918-09-16 01:00:00 (Mon)
  60503684400, #  local_start 1918-04-15 03:00:00 (Mon)
  60516990000, #    local_end 1918-09-16 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  60516982800, #    utc_start 1918-09-16 01:00:00 (Mon)
  61196778000, #      utc_end 1940-04-01 01:00:00 (Mon)
  60516986400, #  local_start 1918-09-16 02:00:00 (Mon)
  61196781600, #    local_end 1940-04-01 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61196778000, #    utc_start 1940-04-01 01:00:00 (Mon)
  61278426000, #      utc_end 1942-11-02 01:00:00 (Mon)
  61196785200, #  local_start 1940-04-01 03:00:00 (Mon)
  61278433200, #    local_end 1942-11-02 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61278426000, #    utc_start 1942-11-02 01:00:00 (Mon)
  61291126800, #      utc_end 1943-03-29 01:00:00 (Mon)
  61278429600, #  local_start 1942-11-02 02:00:00 (Mon)
  61291130400, #    local_end 1943-03-29 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61291126800, #    utc_start 1943-03-29 01:00:00 (Mon)
  61307456400, #      utc_end 1943-10-04 01:00:00 (Mon)
  61291134000, #  local_start 1943-03-29 03:00:00 (Mon)
  61307463600, #    local_end 1943-10-04 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61307456400, #    utc_start 1943-10-04 01:00:00 (Mon)
  61323181200, #      utc_end 1944-04-03 01:00:00 (Mon)
  61307460000, #  local_start 1943-10-04 02:00:00 (Mon)
  61323184800, #    local_end 1944-04-03 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61323181200, #    utc_start 1944-04-03 01:00:00 (Mon)
  61338906000, #      utc_end 1944-10-02 01:00:00 (Mon)
  61323188400, #  local_start 1944-04-03 03:00:00 (Mon)
  61338913200, #    local_end 1944-10-02 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61338906000, #    utc_start 1944-10-02 01:00:00 (Mon)
  61354630800, #      utc_end 1945-04-02 01:00:00 (Mon)
  61338909600, #  local_start 1944-10-02 02:00:00 (Mon)
  61354634400, #    local_end 1945-04-02 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61354630800, #    utc_start 1945-04-02 01:00:00 (Mon)
  61369059600, #      utc_end 1945-09-16 01:00:00 (Sun)
  61354638000, #  local_start 1945-04-02 03:00:00 (Mon)
  61369066800, #    local_end 1945-09-16 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  61369059600, #    utc_start 1945-09-16 01:00:00 (Sun)
  62364560400, #      utc_end 1977-04-03 01:00:00 (Sun)
  61369063200, #  local_start 1945-09-16 02:00:00 (Sun)
  62364564000, #    local_end 1977-04-03 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62364560400, #    utc_start 1977-04-03 01:00:00 (Sun)
  62379680400, #      utc_end 1977-09-25 01:00:00 (Sun)
  62364567600, #  local_start 1977-04-03 03:00:00 (Sun)
  62379687600, #    local_end 1977-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62379680400, #    utc_start 1977-09-25 01:00:00 (Sun)
  62396010000, #      utc_end 1978-04-02 01:00:00 (Sun)
  62379684000, #  local_start 1977-09-25 02:00:00 (Sun)
  62396013600, #    local_end 1978-04-02 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62396010000, #    utc_start 1978-04-02 01:00:00 (Sun)
  62411734800, #      utc_end 1978-10-01 01:00:00 (Sun)
  62396017200, #  local_start 1978-04-02 03:00:00 (Sun)
  62411742000, #    local_end 1978-10-01 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62411734800, #    utc_start 1978-10-01 01:00:00 (Sun)
  62427459600, #      utc_end 1979-04-01 01:00:00 (Sun)
  62411738400, #  local_start 1978-10-01 02:00:00 (Sun)
  62427463200, #    local_end 1979-04-01 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62427459600, #    utc_start 1979-04-01 01:00:00 (Sun)
  62443184400, #      utc_end 1979-09-30 01:00:00 (Sun)
  62427466800, #  local_start 1979-04-01 03:00:00 (Sun)
  62443191600, #    local_end 1979-09-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62443184400, #    utc_start 1979-09-30 01:00:00 (Sun)
  62459514000, #      utc_end 1980-04-06 01:00:00 (Sun)
  62443188000, #  local_start 1979-09-30 02:00:00 (Sun)
  62459517600, #    local_end 1980-04-06 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62459514000, #    utc_start 1980-04-06 01:00:00 (Sun)
  62474634000, #      utc_end 1980-09-28 01:00:00 (Sun)
  62459521200, #  local_start 1980-04-06 03:00:00 (Sun)
  62474641200, #    local_end 1980-09-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62474634000, #    utc_start 1980-09-28 01:00:00 (Sun)
  62490358800, #      utc_end 1981-03-29 01:00:00 (Sun)
  62474637600, #  local_start 1980-09-28 02:00:00 (Sun)
  62490362400, #    local_end 1981-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62490358800, #    utc_start 1981-03-29 01:00:00 (Sun)
  62506083600, #      utc_end 1981-09-27 01:00:00 (Sun)
  62490366000, #  local_start 1981-03-29 03:00:00 (Sun)
  62506090800, #    local_end 1981-09-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62506083600, #    utc_start 1981-09-27 01:00:00 (Sun)
  62521808400, #      utc_end 1982-03-28 01:00:00 (Sun)
  62506087200, #  local_start 1981-09-27 02:00:00 (Sun)
  62521812000, #    local_end 1982-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62521808400, #    utc_start 1982-03-28 01:00:00 (Sun)
  62537533200, #      utc_end 1982-09-26 01:00:00 (Sun)
  62521815600, #  local_start 1982-03-28 03:00:00 (Sun)
  62537540400, #    local_end 1982-09-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62537533200, #    utc_start 1982-09-26 01:00:00 (Sun)
  62553258000, #      utc_end 1983-03-27 01:00:00 (Sun)
  62537536800, #  local_start 1982-09-26 02:00:00 (Sun)
  62553261600, #    local_end 1983-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62553258000, #    utc_start 1983-03-27 01:00:00 (Sun)
  62568982800, #      utc_end 1983-09-25 01:00:00 (Sun)
  62553265200, #  local_start 1983-03-27 03:00:00 (Sun)
  62568990000, #    local_end 1983-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62568982800, #    utc_start 1983-09-25 01:00:00 (Sun)
  62584707600, #      utc_end 1984-03-25 01:00:00 (Sun)
  62568986400, #  local_start 1983-09-25 02:00:00 (Sun)
  62584711200, #    local_end 1984-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62584707600, #    utc_start 1984-03-25 01:00:00 (Sun)
  62601037200, #      utc_end 1984-09-30 01:00:00 (Sun)
  62584714800, #  local_start 1984-03-25 03:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62601037200, #    utc_start 1984-09-30 01:00:00 (Sun)
  62616762000, #      utc_end 1985-03-31 01:00:00 (Sun)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62616762000, #    utc_start 1985-03-31 01:00:00 (Sun)
  62632486800, #      utc_end 1985-09-29 01:00:00 (Sun)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62632486800, #    utc_start 1985-09-29 01:00:00 (Sun)
  62648211600, #      utc_end 1986-03-30 01:00:00 (Sun)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62648211600, #    utc_start 1986-03-30 01:00:00 (Sun)
  62663936400, #      utc_end 1986-09-28 01:00:00 (Sun)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62663936400, #    utc_start 1986-09-28 01:00:00 (Sun)
  62679661200, #      utc_end 1987-03-29 01:00:00 (Sun)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62679661200, #    utc_start 1987-03-29 01:00:00 (Sun)
  62695386000, #      utc_end 1987-09-27 01:00:00 (Sun)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62695386000, #    utc_start 1987-09-27 01:00:00 (Sun)
  62711110800, #      utc_end 1988-03-27 01:00:00 (Sun)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62711110800, #    utc_start 1988-03-27 01:00:00 (Sun)
  62726835600, #      utc_end 1988-09-25 01:00:00 (Sun)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62726835600, #    utc_start 1988-09-25 01:00:00 (Sun)
  62742560400, #      utc_end 1989-03-26 01:00:00 (Sun)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62742560400, #    utc_start 1989-03-26 01:00:00 (Sun)
  62758285200, #      utc_end 1989-09-24 01:00:00 (Sun)
  62742567600, #  local_start 1989-03-26 03:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62758285200, #    utc_start 1989-09-24 01:00:00 (Sun)
  62774010000, #      utc_end 1990-03-25 01:00:00 (Sun)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62774010000, #    utc_start 1990-03-25 01:00:00 (Sun)
  62790339600, #      utc_end 1990-09-30 01:00:00 (Sun)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62790339600, #    utc_start 1990-09-30 01:00:00 (Sun)
  62806064400, #      utc_end 1991-03-31 01:00:00 (Sun)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62806064400, #    utc_start 1991-03-31 01:00:00 (Sun)
  62821789200, #      utc_end 1991-09-29 01:00:00 (Sun)
  62806071600, #  local_start 1991-03-31 03:00:00 (Sun)
  62821796400, #    local_end 1991-09-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62821789200, #    utc_start 1991-09-29 01:00:00 (Sun)
  62837514000, #      utc_end 1992-03-29 01:00:00 (Sun)
  62821792800, #  local_start 1991-09-29 02:00:00 (Sun)
  62837517600, #    local_end 1992-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62837514000, #    utc_start 1992-03-29 01:00:00 (Sun)
  62853238800, #      utc_end 1992-09-27 01:00:00 (Sun)
  62837521200, #  local_start 1992-03-29 03:00:00 (Sun)
  62853246000, #    local_end 1992-09-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62853238800, #    utc_start 1992-09-27 01:00:00 (Sun)
  62868963600, #      utc_end 1993-03-28 01:00:00 (Sun)
  62853242400, #  local_start 1992-09-27 02:00:00 (Sun)
  62868967200, #    local_end 1993-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62868963600, #    utc_start 1993-03-28 01:00:00 (Sun)
  62884688400, #      utc_end 1993-09-26 01:00:00 (Sun)
  62868970800, #  local_start 1993-03-28 03:00:00 (Sun)
  62884695600, #    local_end 1993-09-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62884688400, #    utc_start 1993-09-26 01:00:00 (Sun)
  62900413200, #      utc_end 1994-03-27 01:00:00 (Sun)
  62884692000, #  local_start 1993-09-26 02:00:00 (Sun)
  62900416800, #    local_end 1994-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62900413200, #    utc_start 1994-03-27 01:00:00 (Sun)
  62916138000, #      utc_end 1994-09-25 01:00:00 (Sun)
  62900420400, #  local_start 1994-03-27 03:00:00 (Sun)
  62916145200, #    local_end 1994-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62916138000, #    utc_start 1994-09-25 01:00:00 (Sun)
  62931862800, #      utc_end 1995-03-26 01:00:00 (Sun)
  62916141600, #  local_start 1994-09-25 02:00:00 (Sun)
  62931866400, #    local_end 1995-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62931862800, #    utc_start 1995-03-26 01:00:00 (Sun)
  62947587600, #      utc_end 1995-09-24 01:00:00 (Sun)
  62931870000, #  local_start 1995-03-26 03:00:00 (Sun)
  62947594800, #    local_end 1995-09-24 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62947587600, #    utc_start 1995-09-24 01:00:00 (Sun)
  62963917200, #      utc_end 1996-03-31 01:00:00 (Sun)
  62947591200, #  local_start 1995-09-24 02:00:00 (Sun)
  62963920800, #    local_end 1996-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62963917200, #    utc_start 1996-03-31 01:00:00 (Sun)
  62982061200, #      utc_end 1996-10-27 01:00:00 (Sun)
  62963924400, #  local_start 1996-03-31 03:00:00 (Sun)
  62982068400, #    local_end 1996-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62982061200, #    utc_start 1996-10-27 01:00:00 (Sun)
  62995366800, #      utc_end 1997-03-30 01:00:00 (Sun)
  62982064800, #  local_start 1996-10-27 02:00:00 (Sun)
  62995370400, #    local_end 1997-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62995366800, #    utc_start 1997-03-30 01:00:00 (Sun)
  63013510800, #      utc_end 1997-10-26 01:00:00 (Sun)
  62995374000, #  local_start 1997-03-30 03:00:00 (Sun)
  63013518000, #    local_end 1997-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63013510800, #    utc_start 1997-10-26 01:00:00 (Sun)
  63026816400, #      utc_end 1998-03-29 01:00:00 (Sun)
  63013514400, #  local_start 1997-10-26 02:00:00 (Sun)
  63026820000, #    local_end 1998-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63026816400, #    utc_start 1998-03-29 01:00:00 (Sun)
  63044960400, #      utc_end 1998-10-25 01:00:00 (Sun)
  63026823600, #  local_start 1998-03-29 03:00:00 (Sun)
  63044967600, #    local_end 1998-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63044960400, #    utc_start 1998-10-25 01:00:00 (Sun)
  63058266000, #      utc_end 1999-03-28 01:00:00 (Sun)
  63044964000, #  local_start 1998-10-25 02:00:00 (Sun)
  63058269600, #    local_end 1999-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63058266000, #    utc_start 1999-03-28 01:00:00 (Sun)
  63077014800, #      utc_end 1999-10-31 01:00:00 (Sun)
  63058273200, #  local_start 1999-03-28 03:00:00 (Sun)
  63077022000, #    local_end 1999-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63077014800, #    utc_start 1999-10-31 01:00:00 (Sun)
  63089715600, #      utc_end 2000-03-26 01:00:00 (Sun)
  63077018400, #  local_start 1999-10-31 02:00:00 (Sun)
  63089719200, #    local_end 2000-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63089715600, #    utc_start 2000-03-26 01:00:00 (Sun)
  63108464400, #      utc_end 2000-10-29 01:00:00 (Sun)
  63089722800, #  local_start 2000-03-26 03:00:00 (Sun)
  63108471600, #    local_end 2000-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63108464400, #    utc_start 2000-10-29 01:00:00 (Sun)
  63121165200, #      utc_end 2001-03-25 01:00:00 (Sun)
  63108468000, #  local_start 2000-10-29 02:00:00 (Sun)
  63121168800, #    local_end 2001-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63121165200, #    utc_start 2001-03-25 01:00:00 (Sun)
  63139914000, #      utc_end 2001-10-28 01:00:00 (Sun)
  63121172400, #  local_start 2001-03-25 03:00:00 (Sun)
  63139921200, #    local_end 2001-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63139914000, #    utc_start 2001-10-28 01:00:00 (Sun)
  63153219600, #      utc_end 2002-03-31 01:00:00 (Sun)
  63139917600, #  local_start 2001-10-28 02:00:00 (Sun)
  63153223200, #    local_end 2002-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63153219600, #    utc_start 2002-03-31 01:00:00 (Sun)
  63171363600, #      utc_end 2002-10-27 01:00:00 (Sun)
  63153226800, #  local_start 2002-03-31 03:00:00 (Sun)
  63171370800, #    local_end 2002-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63171363600, #    utc_start 2002-10-27 01:00:00 (Sun)
  63184669200, #      utc_end 2003-03-30 01:00:00 (Sun)
  63171367200, #  local_start 2002-10-27 02:00:00 (Sun)
  63184672800, #    local_end 2003-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63184669200, #    utc_start 2003-03-30 01:00:00 (Sun)
  63202813200, #      utc_end 2003-10-26 01:00:00 (Sun)
  63184676400, #  local_start 2003-03-30 03:00:00 (Sun)
  63202820400, #    local_end 2003-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63202813200, #    utc_start 2003-10-26 01:00:00 (Sun)
  63216118800, #      utc_end 2004-03-28 01:00:00 (Sun)
  63202816800, #  local_start 2003-10-26 02:00:00 (Sun)
  63216122400, #    local_end 2004-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63216118800, #    utc_start 2004-03-28 01:00:00 (Sun)
  63234867600, #      utc_end 2004-10-31 01:00:00 (Sun)
  63216126000, #  local_start 2004-03-28 03:00:00 (Sun)
  63234874800, #    local_end 2004-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63234867600, #    utc_start 2004-10-31 01:00:00 (Sun)
  63247568400, #      utc_end 2005-03-27 01:00:00 (Sun)
  63234871200, #  local_start 2004-10-31 02:00:00 (Sun)
  63247572000, #    local_end 2005-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63247568400, #    utc_start 2005-03-27 01:00:00 (Sun)
  63266317200, #      utc_end 2005-10-30 01:00:00 (Sun)
  63247575600, #  local_start 2005-03-27 03:00:00 (Sun)
  63266324400, #    local_end 2005-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63266317200, #    utc_start 2005-10-30 01:00:00 (Sun)
  63279018000, #      utc_end 2006-03-26 01:00:00 (Sun)
  63266320800, #  local_start 2005-10-30 02:00:00 (Sun)
  63279021600, #    local_end 2006-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63279018000, #    utc_start 2006-03-26 01:00:00 (Sun)
  63297766800, #      utc_end 2006-10-29 01:00:00 (Sun)
  63279025200, #  local_start 2006-03-26 03:00:00 (Sun)
  63297774000, #    local_end 2006-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63297766800, #    utc_start 2006-10-29 01:00:00 (Sun)
  63310467600, #      utc_end 2007-03-25 01:00:00 (Sun)
  63297770400, #  local_start 2006-10-29 02:00:00 (Sun)
  63310471200, #    local_end 2007-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63310467600, #    utc_start 2007-03-25 01:00:00 (Sun)
  63329216400, #      utc_end 2007-10-28 01:00:00 (Sun)
  63310474800, #  local_start 2007-03-25 03:00:00 (Sun)
  63329223600, #    local_end 2007-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63329216400, #    utc_start 2007-10-28 01:00:00 (Sun)
  63342522000, #      utc_end 2008-03-30 01:00:00 (Sun)
  63329220000, #  local_start 2007-10-28 02:00:00 (Sun)
  63342525600, #    local_end 2008-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63342522000, #    utc_start 2008-03-30 01:00:00 (Sun)
  63360666000, #      utc_end 2008-10-26 01:00:00 (Sun)
  63342529200, #  local_start 2008-03-30 03:00:00 (Sun)
  63360673200, #    local_end 2008-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63360666000, #    utc_start 2008-10-26 01:00:00 (Sun)
  63373971600, #      utc_end 2009-03-29 01:00:00 (Sun)
  63360669600, #  local_start 2008-10-26 02:00:00 (Sun)
  63373975200, #    local_end 2009-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63373971600, #    utc_start 2009-03-29 01:00:00 (Sun)
  63392115600, #      utc_end 2009-10-25 01:00:00 (Sun)
  63373978800, #  local_start 2009-03-29 03:00:00 (Sun)
  63392122800, #    local_end 2009-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63392115600, #    utc_start 2009-10-25 01:00:00 (Sun)
  63405421200, #      utc_end 2010-03-28 01:00:00 (Sun)
  63392119200, #  local_start 2009-10-25 02:00:00 (Sun)
  63405424800, #    local_end 2010-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63405421200, #    utc_start 2010-03-28 01:00:00 (Sun)
  63424170000, #      utc_end 2010-10-31 01:00:00 (Sun)
  63405428400, #  local_start 2010-03-28 03:00:00 (Sun)
  63424177200, #    local_end 2010-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63424170000, #    utc_start 2010-10-31 01:00:00 (Sun)
  63436870800, #      utc_end 2011-03-27 01:00:00 (Sun)
  63424173600, #  local_start 2010-10-31 02:00:00 (Sun)
  63436874400, #    local_end 2011-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63436870800, #    utc_start 2011-03-27 01:00:00 (Sun)
  63455619600, #      utc_end 2011-10-30 01:00:00 (Sun)
  63436878000, #  local_start 2011-03-27 03:00:00 (Sun)
  63455626800, #    local_end 2011-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63455619600, #    utc_start 2011-10-30 01:00:00 (Sun)
  63468320400, #      utc_end 2012-03-25 01:00:00 (Sun)
  63455623200, #  local_start 2011-10-30 02:00:00 (Sun)
  63468324000, #    local_end 2012-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63468320400, #    utc_start 2012-03-25 01:00:00 (Sun)
  63487069200, #      utc_end 2012-10-28 01:00:00 (Sun)
  63468327600, #  local_start 2012-03-25 03:00:00 (Sun)
  63487076400, #    local_end 2012-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63487069200, #    utc_start 2012-10-28 01:00:00 (Sun)
  63500374800, #      utc_end 2013-03-31 01:00:00 (Sun)
  63487072800, #  local_start 2012-10-28 02:00:00 (Sun)
  63500378400, #    local_end 2013-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63500374800, #    utc_start 2013-03-31 01:00:00 (Sun)
  63518518800, #      utc_end 2013-10-27 01:00:00 (Sun)
  63500382000, #  local_start 2013-03-31 03:00:00 (Sun)
  63518526000, #    local_end 2013-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63518518800, #    utc_start 2013-10-27 01:00:00 (Sun)
  63531824400, #      utc_end 2014-03-30 01:00:00 (Sun)
  63518522400, #  local_start 2013-10-27 02:00:00 (Sun)
  63531828000, #    local_end 2014-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63531824400, #    utc_start 2014-03-30 01:00:00 (Sun)
  63549968400, #      utc_end 2014-10-26 01:00:00 (Sun)
  63531831600, #  local_start 2014-03-30 03:00:00 (Sun)
  63549975600, #    local_end 2014-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63549968400, #    utc_start 2014-10-26 01:00:00 (Sun)
  63563274000, #      utc_end 2015-03-29 01:00:00 (Sun)
  63549972000, #  local_start 2014-10-26 02:00:00 (Sun)
  63563277600, #    local_end 2015-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63563274000, #    utc_start 2015-03-29 01:00:00 (Sun)
  63581418000, #      utc_end 2015-10-25 01:00:00 (Sun)
  63563281200, #  local_start 2015-03-29 03:00:00 (Sun)
  63581425200, #    local_end 2015-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63581418000, #    utc_start 2015-10-25 01:00:00 (Sun)
  63594723600, #      utc_end 2016-03-27 01:00:00 (Sun)
  63581421600, #  local_start 2015-10-25 02:00:00 (Sun)
  63594727200, #    local_end 2016-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63594723600, #    utc_start 2016-03-27 01:00:00 (Sun)
  63613472400, #      utc_end 2016-10-30 01:00:00 (Sun)
  63594730800, #  local_start 2016-03-27 03:00:00 (Sun)
  63613479600, #    local_end 2016-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63613472400, #    utc_start 2016-10-30 01:00:00 (Sun)
  63626173200, #      utc_end 2017-03-26 01:00:00 (Sun)
  63613476000, #  local_start 2016-10-30 02:00:00 (Sun)
  63626176800, #    local_end 2017-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63626173200, #    utc_start 2017-03-26 01:00:00 (Sun)
  63644922000, #      utc_end 2017-10-29 01:00:00 (Sun)
  63626180400, #  local_start 2017-03-26 03:00:00 (Sun)
  63644929200, #    local_end 2017-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63644922000, #    utc_start 2017-10-29 01:00:00 (Sun)
  63657622800, #      utc_end 2018-03-25 01:00:00 (Sun)
  63644925600, #  local_start 2017-10-29 02:00:00 (Sun)
  63657626400, #    local_end 2018-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63657622800, #    utc_start 2018-03-25 01:00:00 (Sun)
  63676371600, #      utc_end 2018-10-28 01:00:00 (Sun)
  63657630000, #  local_start 2018-03-25 03:00:00 (Sun)
  63676378800, #    local_end 2018-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63676371600, #    utc_start 2018-10-28 01:00:00 (Sun)
  63689677200, #      utc_end 2019-03-31 01:00:00 (Sun)
  63676375200, #  local_start 2018-10-28 02:00:00 (Sun)
  63689680800, #    local_end 2019-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63689677200, #    utc_start 2019-03-31 01:00:00 (Sun)
  63707821200, #      utc_end 2019-10-27 01:00:00 (Sun)
  63689684400, #  local_start 2019-03-31 03:00:00 (Sun)
  63707828400, #    local_end 2019-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63707821200, #    utc_start 2019-10-27 01:00:00 (Sun)
  63721126800, #      utc_end 2020-03-29 01:00:00 (Sun)
  63707824800, #  local_start 2019-10-27 02:00:00 (Sun)
  63721130400, #    local_end 2020-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63721126800, #    utc_start 2020-03-29 01:00:00 (Sun)
  63739270800, #      utc_end 2020-10-25 01:00:00 (Sun)
  63721134000, #  local_start 2020-03-29 03:00:00 (Sun)
  63739278000, #    local_end 2020-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63739270800, #    utc_start 2020-10-25 01:00:00 (Sun)
  63752576400, #      utc_end 2021-03-28 01:00:00 (Sun)
  63739274400, #  local_start 2020-10-25 02:00:00 (Sun)
  63752580000, #    local_end 2021-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63752576400, #    utc_start 2021-03-28 01:00:00 (Sun)
  63771325200, #      utc_end 2021-10-31 01:00:00 (Sun)
  63752583600, #  local_start 2021-03-28 03:00:00 (Sun)
  63771332400, #    local_end 2021-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63771325200, #    utc_start 2021-10-31 01:00:00 (Sun)
  63784026000, #      utc_end 2022-03-27 01:00:00 (Sun)
  63771328800, #  local_start 2021-10-31 02:00:00 (Sun)
  63784029600, #    local_end 2022-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63784026000, #    utc_start 2022-03-27 01:00:00 (Sun)
  63802774800, #      utc_end 2022-10-30 01:00:00 (Sun)
  63784033200, #  local_start 2022-03-27 03:00:00 (Sun)
  63802782000, #    local_end 2022-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63802774800, #    utc_start 2022-10-30 01:00:00 (Sun)
  63815475600, #      utc_end 2023-03-26 01:00:00 (Sun)
  63802778400, #  local_start 2022-10-30 02:00:00 (Sun)
  63815479200, #    local_end 2023-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63815475600, #    utc_start 2023-03-26 01:00:00 (Sun)
  63834224400, #      utc_end 2023-10-29 01:00:00 (Sun)
  63815482800, #  local_start 2023-03-26 03:00:00 (Sun)
  63834231600, #    local_end 2023-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63834224400, #    utc_start 2023-10-29 01:00:00 (Sun)
  63847530000, #      utc_end 2024-03-31 01:00:00 (Sun)
  63834228000, #  local_start 2023-10-29 02:00:00 (Sun)
  63847533600, #    local_end 2024-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63847530000, #    utc_start 2024-03-31 01:00:00 (Sun)
  63865674000, #      utc_end 2024-10-27 01:00:00 (Sun)
  63847537200, #  local_start 2024-03-31 03:00:00 (Sun)
  63865681200, #    local_end 2024-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63865674000, #    utc_start 2024-10-27 01:00:00 (Sun)
  63878979600, #      utc_end 2025-03-30 01:00:00 (Sun)
  63865677600, #  local_start 2024-10-27 02:00:00 (Sun)
  63878983200, #    local_end 2025-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63878979600, #    utc_start 2025-03-30 01:00:00 (Sun)
  63897123600, #      utc_end 2025-10-26 01:00:00 (Sun)
  63878986800, #  local_start 2025-03-30 03:00:00 (Sun)
  63897130800, #    local_end 2025-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63897123600, #    utc_start 2025-10-26 01:00:00 (Sun)
  63910429200, #      utc_end 2026-03-29 01:00:00 (Sun)
  63897127200, #  local_start 2025-10-26 02:00:00 (Sun)
  63910432800, #    local_end 2026-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63910429200, #    utc_start 2026-03-29 01:00:00 (Sun)
  63928573200, #      utc_end 2026-10-25 01:00:00 (Sun)
  63910436400, #  local_start 2026-03-29 03:00:00 (Sun)
  63928580400, #    local_end 2026-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63928573200, #    utc_start 2026-10-25 01:00:00 (Sun)
  63941878800, #      utc_end 2027-03-28 01:00:00 (Sun)
  63928576800, #  local_start 2026-10-25 02:00:00 (Sun)
  63941882400, #    local_end 2027-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63941878800, #    utc_start 2027-03-28 01:00:00 (Sun)
  63960627600, #      utc_end 2027-10-31 01:00:00 (Sun)
  63941886000, #  local_start 2027-03-28 03:00:00 (Sun)
  63960634800, #    local_end 2027-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63960627600, #    utc_start 2027-10-31 01:00:00 (Sun)
  63973328400, #      utc_end 2028-03-26 01:00:00 (Sun)
  63960631200, #  local_start 2027-10-31 02:00:00 (Sun)
  63973332000, #    local_end 2028-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63973328400, #    utc_start 2028-03-26 01:00:00 (Sun)
  63992077200, #      utc_end 2028-10-29 01:00:00 (Sun)
  63973335600, #  local_start 2028-03-26 03:00:00 (Sun)
  63992084400, #    local_end 2028-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63992077200, #    utc_start 2028-10-29 01:00:00 (Sun)
  64004778000, #      utc_end 2029-03-25 01:00:00 (Sun)
  63992080800, #  local_start 2028-10-29 02:00:00 (Sun)
  64004781600, #    local_end 2029-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  64004778000, #    utc_start 2029-03-25 01:00:00 (Sun)
  64023526800, #      utc_end 2029-10-28 01:00:00 (Sun)
  64004785200, #  local_start 2029-03-25 03:00:00 (Sun)
  64023534000, #    local_end 2029-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  64023526800, #    utc_start 2029-10-28 01:00:00 (Sun)
  64036832400, #      utc_end 2030-03-31 01:00:00 (Sun)
  64023530400, #  local_start 2029-10-28 02:00:00 (Sun)
  64036836000, #    local_end 2030-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  64036832400, #    utc_start 2030-03-31 01:00:00 (Sun)
  64054976400, #      utc_end 2030-10-27 01:00:00 (Sun)
  64036839600, #  local_start 2030-03-31 03:00:00 (Sun)
  64054983600, #    local_end 2030-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {61}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { 3600 }
  
  my $last_observance = bless( {
    'format' => 'CE%sT',
    'gmtoff' => '1:00',
    'local_start_datetime' => {},
    'offset_from_std' => 0,
    'offset_from_utc' => 3600,
    'until' => [],
    'utc_start_datetime' => {}
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00s',
      'from' => '1981',
      'in' => 'Mar',
      'letter' => 'S',
      'name' => 'C-Eur',
      'offset_from_std' => 3600,
      'on' => 'lastSun',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00s',
      'from' => '1996',
      'in' => 'Oct',
      'letter' => '',
      'name' => 'C-Eur',
      'offset_from_std' => 0,
      'on' => 'lastSun',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_CET

    $main::fatpacked{"DateTime/TimeZone/CST6CDT.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_CST6CDT';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::CST6CDT;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::CST6CDT::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60502406400, #      utc_end 1918-03-31 08:00:00 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60502384800, #    local_end 1918-03-31 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  60502406400, #    utc_start 1918-03-31 08:00:00 (Sun)
  60520546800, #      utc_end 1918-10-27 07:00:00 (Sun)
  60502388400, #  local_start 1918-03-31 03:00:00 (Sun)
  60520528800, #    local_end 1918-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  60520546800, #    utc_start 1918-10-27 07:00:00 (Sun)
  60533856000, #      utc_end 1919-03-30 08:00:00 (Sun)
  60520525200, #  local_start 1918-10-27 01:00:00 (Sun)
  60533834400, #    local_end 1919-03-30 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  60533856000, #    utc_start 1919-03-30 08:00:00 (Sun)
  60551996400, #      utc_end 1919-10-26 07:00:00 (Sun)
  60533838000, #  local_start 1919-03-30 03:00:00 (Sun)
  60551978400, #    local_end 1919-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  60551996400, #    utc_start 1919-10-26 07:00:00 (Sun)
  61255468800, #      utc_end 1942-02-09 08:00:00 (Mon)
  60551974800, #  local_start 1919-10-26 01:00:00 (Sun)
  61255447200, #    local_end 1942-02-09 02:00:00 (Mon)
  -21600,
  0,
  'CST',
      ],
      [
  61255468800, #    utc_start 1942-02-09 08:00:00 (Mon)
  61366287600, #      utc_end 1945-08-14 23:00:00 (Tue)
  61255450800, #  local_start 1942-02-09 03:00:00 (Mon)
  61366269600, #    local_end 1945-08-14 18:00:00 (Tue)
  -18000,
  1,
  'CWT',
      ],
      [
  61366287600, #    utc_start 1945-08-14 23:00:00 (Tue)
  61370290800, #      utc_end 1945-09-30 07:00:00 (Sun)
  61366269600, #  local_start 1945-08-14 18:00:00 (Tue)
  61370272800, #    local_end 1945-09-30 02:00:00 (Sun)
  -18000,
  1,
  'CPT',
      ],
      [
  61370290800, #    utc_start 1945-09-30 07:00:00 (Sun)
  62051299200, #      utc_end 1967-04-30 08:00:00 (Sun)
  61370269200, #  local_start 1945-09-30 01:00:00 (Sun)
  62051277600, #    local_end 1967-04-30 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62051299200, #    utc_start 1967-04-30 08:00:00 (Sun)
  62067020400, #      utc_end 1967-10-29 07:00:00 (Sun)
  62051281200, #  local_start 1967-04-30 03:00:00 (Sun)
  62067002400, #    local_end 1967-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62067020400, #    utc_start 1967-10-29 07:00:00 (Sun)
  62082748800, #      utc_end 1968-04-28 08:00:00 (Sun)
  62066998800, #  local_start 1967-10-29 01:00:00 (Sun)
  62082727200, #    local_end 1968-04-28 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62082748800, #    utc_start 1968-04-28 08:00:00 (Sun)
  62098470000, #      utc_end 1968-10-27 07:00:00 (Sun)
  62082730800, #  local_start 1968-04-28 03:00:00 (Sun)
  62098452000, #    local_end 1968-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62098470000, #    utc_start 1968-10-27 07:00:00 (Sun)
  62114198400, #      utc_end 1969-04-27 08:00:00 (Sun)
  62098448400, #  local_start 1968-10-27 01:00:00 (Sun)
  62114176800, #    local_end 1969-04-27 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62114198400, #    utc_start 1969-04-27 08:00:00 (Sun)
  62129919600, #      utc_end 1969-10-26 07:00:00 (Sun)
  62114180400, #  local_start 1969-04-27 03:00:00 (Sun)
  62129901600, #    local_end 1969-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62129919600, #    utc_start 1969-10-26 07:00:00 (Sun)
  62145648000, #      utc_end 1970-04-26 08:00:00 (Sun)
  62129898000, #  local_start 1969-10-26 01:00:00 (Sun)
  62145626400, #    local_end 1970-04-26 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62145648000, #    utc_start 1970-04-26 08:00:00 (Sun)
  62161369200, #      utc_end 1970-10-25 07:00:00 (Sun)
  62145630000, #  local_start 1970-04-26 03:00:00 (Sun)
  62161351200, #    local_end 1970-10-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62161369200, #    utc_start 1970-10-25 07:00:00 (Sun)
  62177097600, #      utc_end 1971-04-25 08:00:00 (Sun)
  62161347600, #  local_start 1970-10-25 01:00:00 (Sun)
  62177076000, #    local_end 1971-04-25 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62177097600, #    utc_start 1971-04-25 08:00:00 (Sun)
  62193423600, #      utc_end 1971-10-31 07:00:00 (Sun)
  62177079600, #  local_start 1971-04-25 03:00:00 (Sun)
  62193405600, #    local_end 1971-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62193423600, #    utc_start 1971-10-31 07:00:00 (Sun)
  62209152000, #      utc_end 1972-04-30 08:00:00 (Sun)
  62193402000, #  local_start 1971-10-31 01:00:00 (Sun)
  62209130400, #    local_end 1972-04-30 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62209152000, #    utc_start 1972-04-30 08:00:00 (Sun)
  62224873200, #      utc_end 1972-10-29 07:00:00 (Sun)
  62209134000, #  local_start 1972-04-30 03:00:00 (Sun)
  62224855200, #    local_end 1972-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62224873200, #    utc_start 1972-10-29 07:00:00 (Sun)
  62240601600, #      utc_end 1973-04-29 08:00:00 (Sun)
  62224851600, #  local_start 1972-10-29 01:00:00 (Sun)
  62240580000, #    local_end 1973-04-29 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62240601600, #    utc_start 1973-04-29 08:00:00 (Sun)
  62256322800, #      utc_end 1973-10-28 07:00:00 (Sun)
  62240583600, #  local_start 1973-04-29 03:00:00 (Sun)
  62256304800, #    local_end 1973-10-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62256322800, #    utc_start 1973-10-28 07:00:00 (Sun)
  62262374400, #      utc_end 1974-01-06 08:00:00 (Sun)
  62256301200, #  local_start 1973-10-28 01:00:00 (Sun)
  62262352800, #    local_end 1974-01-06 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62262374400, #    utc_start 1974-01-06 08:00:00 (Sun)
  62287772400, #      utc_end 1974-10-27 07:00:00 (Sun)
  62262356400, #  local_start 1974-01-06 03:00:00 (Sun)
  62287754400, #    local_end 1974-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62287772400, #    utc_start 1974-10-27 07:00:00 (Sun)
  62298057600, #      utc_end 1975-02-23 08:00:00 (Sun)
  62287750800, #  local_start 1974-10-27 01:00:00 (Sun)
  62298036000, #    local_end 1975-02-23 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62298057600, #    utc_start 1975-02-23 08:00:00 (Sun)
  62319222000, #      utc_end 1975-10-26 07:00:00 (Sun)
  62298039600, #  local_start 1975-02-23 03:00:00 (Sun)
  62319204000, #    local_end 1975-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62319222000, #    utc_start 1975-10-26 07:00:00 (Sun)
  62334950400, #      utc_end 1976-04-25 08:00:00 (Sun)
  62319200400, #  local_start 1975-10-26 01:00:00 (Sun)
  62334928800, #    local_end 1976-04-25 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62334950400, #    utc_start 1976-04-25 08:00:00 (Sun)
  62351276400, #      utc_end 1976-10-31 07:00:00 (Sun)
  62334932400, #  local_start 1976-04-25 03:00:00 (Sun)
  62351258400, #    local_end 1976-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62351276400, #    utc_start 1976-10-31 07:00:00 (Sun)
  62366400000, #      utc_end 1977-04-24 08:00:00 (Sun)
  62351254800, #  local_start 1976-10-31 01:00:00 (Sun)
  62366378400, #    local_end 1977-04-24 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62366400000, #    utc_start 1977-04-24 08:00:00 (Sun)
  62382726000, #      utc_end 1977-10-30 07:00:00 (Sun)
  62366382000, #  local_start 1977-04-24 03:00:00 (Sun)
  62382708000, #    local_end 1977-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62382726000, #    utc_start 1977-10-30 07:00:00 (Sun)
  62398454400, #      utc_end 1978-04-30 08:00:00 (Sun)
  62382704400, #  local_start 1977-10-30 01:00:00 (Sun)
  62398432800, #    local_end 1978-04-30 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62398454400, #    utc_start 1978-04-30 08:00:00 (Sun)
  62414175600, #      utc_end 1978-10-29 07:00:00 (Sun)
  62398436400, #  local_start 1978-04-30 03:00:00 (Sun)
  62414157600, #    local_end 1978-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62414175600, #    utc_start 1978-10-29 07:00:00 (Sun)
  62429904000, #      utc_end 1979-04-29 08:00:00 (Sun)
  62414154000, #  local_start 1978-10-29 01:00:00 (Sun)
  62429882400, #    local_end 1979-04-29 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62429904000, #    utc_start 1979-04-29 08:00:00 (Sun)
  62445625200, #      utc_end 1979-10-28 07:00:00 (Sun)
  62429886000, #  local_start 1979-04-29 03:00:00 (Sun)
  62445607200, #    local_end 1979-10-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62445625200, #    utc_start 1979-10-28 07:00:00 (Sun)
  62461353600, #      utc_end 1980-04-27 08:00:00 (Sun)
  62445603600, #  local_start 1979-10-28 01:00:00 (Sun)
  62461332000, #    local_end 1980-04-27 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62461353600, #    utc_start 1980-04-27 08:00:00 (Sun)
  62477074800, #      utc_end 1980-10-26 07:00:00 (Sun)
  62461335600, #  local_start 1980-04-27 03:00:00 (Sun)
  62477056800, #    local_end 1980-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62477074800, #    utc_start 1980-10-26 07:00:00 (Sun)
  62492803200, #      utc_end 1981-04-26 08:00:00 (Sun)
  62477053200, #  local_start 1980-10-26 01:00:00 (Sun)
  62492781600, #    local_end 1981-04-26 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62492803200, #    utc_start 1981-04-26 08:00:00 (Sun)
  62508524400, #      utc_end 1981-10-25 07:00:00 (Sun)
  62492785200, #  local_start 1981-04-26 03:00:00 (Sun)
  62508506400, #    local_end 1981-10-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62508524400, #    utc_start 1981-10-25 07:00:00 (Sun)
  62524252800, #      utc_end 1982-04-25 08:00:00 (Sun)
  62508502800, #  local_start 1981-10-25 01:00:00 (Sun)
  62524231200, #    local_end 1982-04-25 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62524252800, #    utc_start 1982-04-25 08:00:00 (Sun)
  62540578800, #      utc_end 1982-10-31 07:00:00 (Sun)
  62524234800, #  local_start 1982-04-25 03:00:00 (Sun)
  62540560800, #    local_end 1982-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62540578800, #    utc_start 1982-10-31 07:00:00 (Sun)
  62555702400, #      utc_end 1983-04-24 08:00:00 (Sun)
  62540557200, #  local_start 1982-10-31 01:00:00 (Sun)
  62555680800, #    local_end 1983-04-24 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62555702400, #    utc_start 1983-04-24 08:00:00 (Sun)
  62572028400, #      utc_end 1983-10-30 07:00:00 (Sun)
  62555684400, #  local_start 1983-04-24 03:00:00 (Sun)
  62572010400, #    local_end 1983-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62572028400, #    utc_start 1983-10-30 07:00:00 (Sun)
  62587756800, #      utc_end 1984-04-29 08:00:00 (Sun)
  62572006800, #  local_start 1983-10-30 01:00:00 (Sun)
  62587735200, #    local_end 1984-04-29 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62587756800, #    utc_start 1984-04-29 08:00:00 (Sun)
  62603478000, #      utc_end 1984-10-28 07:00:00 (Sun)
  62587738800, #  local_start 1984-04-29 03:00:00 (Sun)
  62603460000, #    local_end 1984-10-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62603478000, #    utc_start 1984-10-28 07:00:00 (Sun)
  62619206400, #      utc_end 1985-04-28 08:00:00 (Sun)
  62603456400, #  local_start 1984-10-28 01:00:00 (Sun)
  62619184800, #    local_end 1985-04-28 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62619206400, #    utc_start 1985-04-28 08:00:00 (Sun)
  62634927600, #      utc_end 1985-10-27 07:00:00 (Sun)
  62619188400, #  local_start 1985-04-28 03:00:00 (Sun)
  62634909600, #    local_end 1985-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62634927600, #    utc_start 1985-10-27 07:00:00 (Sun)
  62650656000, #      utc_end 1986-04-27 08:00:00 (Sun)
  62634906000, #  local_start 1985-10-27 01:00:00 (Sun)
  62650634400, #    local_end 1986-04-27 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62650656000, #    utc_start 1986-04-27 08:00:00 (Sun)
  62666377200, #      utc_end 1986-10-26 07:00:00 (Sun)
  62650638000, #  local_start 1986-04-27 03:00:00 (Sun)
  62666359200, #    local_end 1986-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62666377200, #    utc_start 1986-10-26 07:00:00 (Sun)
  62680291200, #      utc_end 1987-04-05 08:00:00 (Sun)
  62666355600, #  local_start 1986-10-26 01:00:00 (Sun)
  62680269600, #    local_end 1987-04-05 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62680291200, #    utc_start 1987-04-05 08:00:00 (Sun)
  62697826800, #      utc_end 1987-10-25 07:00:00 (Sun)
  62680273200, #  local_start 1987-04-05 03:00:00 (Sun)
  62697808800, #    local_end 1987-10-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62697826800, #    utc_start 1987-10-25 07:00:00 (Sun)
  62711740800, #      utc_end 1988-04-03 08:00:00 (Sun)
  62697805200, #  local_start 1987-10-25 01:00:00 (Sun)
  62711719200, #    local_end 1988-04-03 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62711740800, #    utc_start 1988-04-03 08:00:00 (Sun)
  62729881200, #      utc_end 1988-10-30 07:00:00 (Sun)
  62711722800, #  local_start 1988-04-03 03:00:00 (Sun)
  62729863200, #    local_end 1988-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62729881200, #    utc_start 1988-10-30 07:00:00 (Sun)
  62743190400, #      utc_end 1989-04-02 08:00:00 (Sun)
  62729859600, #  local_start 1988-10-30 01:00:00 (Sun)
  62743168800, #    local_end 1989-04-02 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62743190400, #    utc_start 1989-04-02 08:00:00 (Sun)
  62761330800, #      utc_end 1989-10-29 07:00:00 (Sun)
  62743172400, #  local_start 1989-04-02 03:00:00 (Sun)
  62761312800, #    local_end 1989-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62761330800, #    utc_start 1989-10-29 07:00:00 (Sun)
  62774640000, #      utc_end 1990-04-01 08:00:00 (Sun)
  62761309200, #  local_start 1989-10-29 01:00:00 (Sun)
  62774618400, #    local_end 1990-04-01 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62774640000, #    utc_start 1990-04-01 08:00:00 (Sun)
  62792780400, #      utc_end 1990-10-28 07:00:00 (Sun)
  62774622000, #  local_start 1990-04-01 03:00:00 (Sun)
  62792762400, #    local_end 1990-10-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62792780400, #    utc_start 1990-10-28 07:00:00 (Sun)
  62806694400, #      utc_end 1991-04-07 08:00:00 (Sun)
  62792758800, #  local_start 1990-10-28 01:00:00 (Sun)
  62806672800, #    local_end 1991-04-07 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62806694400, #    utc_start 1991-04-07 08:00:00 (Sun)
  62824230000, #      utc_end 1991-10-27 07:00:00 (Sun)
  62806676400, #  local_start 1991-04-07 03:00:00 (Sun)
  62824212000, #    local_end 1991-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62824230000, #    utc_start 1991-10-27 07:00:00 (Sun)
  62838144000, #      utc_end 1992-04-05 08:00:00 (Sun)
  62824208400, #  local_start 1991-10-27 01:00:00 (Sun)
  62838122400, #    local_end 1992-04-05 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62838144000, #    utc_start 1992-04-05 08:00:00 (Sun)
  62855679600, #      utc_end 1992-10-25 07:00:00 (Sun)
  62838126000, #  local_start 1992-04-05 03:00:00 (Sun)
  62855661600, #    local_end 1992-10-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62855679600, #    utc_start 1992-10-25 07:00:00 (Sun)
  62869593600, #      utc_end 1993-04-04 08:00:00 (Sun)
  62855658000, #  local_start 1992-10-25 01:00:00 (Sun)
  62869572000, #    local_end 1993-04-04 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62869593600, #    utc_start 1993-04-04 08:00:00 (Sun)
  62887734000, #      utc_end 1993-10-31 07:00:00 (Sun)
  62869575600, #  local_start 1993-04-04 03:00:00 (Sun)
  62887716000, #    local_end 1993-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62887734000, #    utc_start 1993-10-31 07:00:00 (Sun)
  62901043200, #      utc_end 1994-04-03 08:00:00 (Sun)
  62887712400, #  local_start 1993-10-31 01:00:00 (Sun)
  62901021600, #    local_end 1994-04-03 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62901043200, #    utc_start 1994-04-03 08:00:00 (Sun)
  62919183600, #      utc_end 1994-10-30 07:00:00 (Sun)
  62901025200, #  local_start 1994-04-03 03:00:00 (Sun)
  62919165600, #    local_end 1994-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62919183600, #    utc_start 1994-10-30 07:00:00 (Sun)
  62932492800, #      utc_end 1995-04-02 08:00:00 (Sun)
  62919162000, #  local_start 1994-10-30 01:00:00 (Sun)
  62932471200, #    local_end 1995-04-02 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62932492800, #    utc_start 1995-04-02 08:00:00 (Sun)
  62950633200, #      utc_end 1995-10-29 07:00:00 (Sun)
  62932474800, #  local_start 1995-04-02 03:00:00 (Sun)
  62950615200, #    local_end 1995-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62950633200, #    utc_start 1995-10-29 07:00:00 (Sun)
  62964547200, #      utc_end 1996-04-07 08:00:00 (Sun)
  62950611600, #  local_start 1995-10-29 01:00:00 (Sun)
  62964525600, #    local_end 1996-04-07 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62964547200, #    utc_start 1996-04-07 08:00:00 (Sun)
  62982082800, #      utc_end 1996-10-27 07:00:00 (Sun)
  62964529200, #  local_start 1996-04-07 03:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  62982082800, #    utc_start 1996-10-27 07:00:00 (Sun)
  62995996800, #      utc_end 1997-04-06 08:00:00 (Sun)
  62982061200, #  local_start 1996-10-27 01:00:00 (Sun)
  62995975200, #    local_end 1997-04-06 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  62995996800, #    utc_start 1997-04-06 08:00:00 (Sun)
  63013532400, #      utc_end 1997-10-26 07:00:00 (Sun)
  62995978800, #  local_start 1997-04-06 03:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63013532400, #    utc_start 1997-10-26 07:00:00 (Sun)
  63027446400, #      utc_end 1998-04-05 08:00:00 (Sun)
  63013510800, #  local_start 1997-10-26 01:00:00 (Sun)
  63027424800, #    local_end 1998-04-05 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63027446400, #    utc_start 1998-04-05 08:00:00 (Sun)
  63044982000, #      utc_end 1998-10-25 07:00:00 (Sun)
  63027428400, #  local_start 1998-04-05 03:00:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63044982000, #    utc_start 1998-10-25 07:00:00 (Sun)
  63058896000, #      utc_end 1999-04-04 08:00:00 (Sun)
  63044960400, #  local_start 1998-10-25 01:00:00 (Sun)
  63058874400, #    local_end 1999-04-04 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63058896000, #    utc_start 1999-04-04 08:00:00 (Sun)
  63077036400, #      utc_end 1999-10-31 07:00:00 (Sun)
  63058878000, #  local_start 1999-04-04 03:00:00 (Sun)
  63077018400, #    local_end 1999-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63077036400, #    utc_start 1999-10-31 07:00:00 (Sun)
  63090345600, #      utc_end 2000-04-02 08:00:00 (Sun)
  63077014800, #  local_start 1999-10-31 01:00:00 (Sun)
  63090324000, #    local_end 2000-04-02 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63090345600, #    utc_start 2000-04-02 08:00:00 (Sun)
  63108486000, #      utc_end 2000-10-29 07:00:00 (Sun)
  63090327600, #  local_start 2000-04-02 03:00:00 (Sun)
  63108468000, #    local_end 2000-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63108486000, #    utc_start 2000-10-29 07:00:00 (Sun)
  63121795200, #      utc_end 2001-04-01 08:00:00 (Sun)
  63108464400, #  local_start 2000-10-29 01:00:00 (Sun)
  63121773600, #    local_end 2001-04-01 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63121795200, #    utc_start 2001-04-01 08:00:00 (Sun)
  63139935600, #      utc_end 2001-10-28 07:00:00 (Sun)
  63121777200, #  local_start 2001-04-01 03:00:00 (Sun)
  63139917600, #    local_end 2001-10-28 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63139935600, #    utc_start 2001-10-28 07:00:00 (Sun)
  63153849600, #      utc_end 2002-04-07 08:00:00 (Sun)
  63139914000, #  local_start 2001-10-28 01:00:00 (Sun)
  63153828000, #    local_end 2002-04-07 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63153849600, #    utc_start 2002-04-07 08:00:00 (Sun)
  63171385200, #      utc_end 2002-10-27 07:00:00 (Sun)
  63153831600, #  local_start 2002-04-07 03:00:00 (Sun)
  63171367200, #    local_end 2002-10-27 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63171385200, #    utc_start 2002-10-27 07:00:00 (Sun)
  63185299200, #      utc_end 2003-04-06 08:00:00 (Sun)
  63171363600, #  local_start 2002-10-27 01:00:00 (Sun)
  63185277600, #    local_end 2003-04-06 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63185299200, #    utc_start 2003-04-06 08:00:00 (Sun)
  63202834800, #      utc_end 2003-10-26 07:00:00 (Sun)
  63185281200, #  local_start 2003-04-06 03:00:00 (Sun)
  63202816800, #    local_end 2003-10-26 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63202834800, #    utc_start 2003-10-26 07:00:00 (Sun)
  63216748800, #      utc_end 2004-04-04 08:00:00 (Sun)
  63202813200, #  local_start 2003-10-26 01:00:00 (Sun)
  63216727200, #    local_end 2004-04-04 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63216748800, #    utc_start 2004-04-04 08:00:00 (Sun)
  63234889200, #      utc_end 2004-10-31 07:00:00 (Sun)
  63216730800, #  local_start 2004-04-04 03:00:00 (Sun)
  63234871200, #    local_end 2004-10-31 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63234889200, #    utc_start 2004-10-31 07:00:00 (Sun)
  63248198400, #      utc_end 2005-04-03 08:00:00 (Sun)
  63234867600, #  local_start 2004-10-31 01:00:00 (Sun)
  63248176800, #    local_end 2005-04-03 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63248198400, #    utc_start 2005-04-03 08:00:00 (Sun)
  63266338800, #      utc_end 2005-10-30 07:00:00 (Sun)
  63248180400, #  local_start 2005-04-03 03:00:00 (Sun)
  63266320800, #    local_end 2005-10-30 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63266338800, #    utc_start 2005-10-30 07:00:00 (Sun)
  63279648000, #      utc_end 2006-04-02 08:00:00 (Sun)
  63266317200, #  local_start 2005-10-30 01:00:00 (Sun)
  63279626400, #    local_end 2006-04-02 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63279648000, #    utc_start 2006-04-02 08:00:00 (Sun)
  63297788400, #      utc_end 2006-10-29 07:00:00 (Sun)
  63279630000, #  local_start 2006-04-02 03:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63297788400, #    utc_start 2006-10-29 07:00:00 (Sun)
  63309283200, #      utc_end 2007-03-11 08:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63309261600, #    local_end 2007-03-11 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63309283200, #    utc_start 2007-03-11 08:00:00 (Sun)
  63329842800, #      utc_end 2007-11-04 07:00:00 (Sun)
  63309265200, #  local_start 2007-03-11 03:00:00 (Sun)
  63329824800, #    local_end 2007-11-04 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63329842800, #    utc_start 2007-11-04 07:00:00 (Sun)
  63340732800, #      utc_end 2008-03-09 08:00:00 (Sun)
  63329821200, #  local_start 2007-11-04 01:00:00 (Sun)
  63340711200, #    local_end 2008-03-09 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63340732800, #    utc_start 2008-03-09 08:00:00 (Sun)
  63361292400, #      utc_end 2008-11-02 07:00:00 (Sun)
  63340714800, #  local_start 2008-03-09 03:00:00 (Sun)
  63361274400, #    local_end 2008-11-02 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63361292400, #    utc_start 2008-11-02 07:00:00 (Sun)
  63372182400, #      utc_end 2009-03-08 08:00:00 (Sun)
  63361270800, #  local_start 2008-11-02 01:00:00 (Sun)
  63372160800, #    local_end 2009-03-08 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63372182400, #    utc_start 2009-03-08 08:00:00 (Sun)
  63392742000, #      utc_end 2009-11-01 07:00:00 (Sun)
  63372164400, #  local_start 2009-03-08 03:00:00 (Sun)
  63392724000, #    local_end 2009-11-01 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63392742000, #    utc_start 2009-11-01 07:00:00 (Sun)
  63404236800, #      utc_end 2010-03-14 08:00:00 (Sun)
  63392720400, #  local_start 2009-11-01 01:00:00 (Sun)
  63404215200, #    local_end 2010-03-14 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63404236800, #    utc_start 2010-03-14 08:00:00 (Sun)
  63424796400, #      utc_end 2010-11-07 07:00:00 (Sun)
  63404218800, #  local_start 2010-03-14 03:00:00 (Sun)
  63424778400, #    local_end 2010-11-07 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63424796400, #    utc_start 2010-11-07 07:00:00 (Sun)
  63435686400, #      utc_end 2011-03-13 08:00:00 (Sun)
  63424774800, #  local_start 2010-11-07 01:00:00 (Sun)
  63435664800, #    local_end 2011-03-13 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63435686400, #    utc_start 2011-03-13 08:00:00 (Sun)
  63456246000, #      utc_end 2011-11-06 07:00:00 (Sun)
  63435668400, #  local_start 2011-03-13 03:00:00 (Sun)
  63456228000, #    local_end 2011-11-06 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63456246000, #    utc_start 2011-11-06 07:00:00 (Sun)
  63467136000, #      utc_end 2012-03-11 08:00:00 (Sun)
  63456224400, #  local_start 2011-11-06 01:00:00 (Sun)
  63467114400, #    local_end 2012-03-11 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63467136000, #    utc_start 2012-03-11 08:00:00 (Sun)
  63487695600, #      utc_end 2012-11-04 07:00:00 (Sun)
  63467118000, #  local_start 2012-03-11 03:00:00 (Sun)
  63487677600, #    local_end 2012-11-04 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63487695600, #    utc_start 2012-11-04 07:00:00 (Sun)
  63498585600, #      utc_end 2013-03-10 08:00:00 (Sun)
  63487674000, #  local_start 2012-11-04 01:00:00 (Sun)
  63498564000, #    local_end 2013-03-10 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63498585600, #    utc_start 2013-03-10 08:00:00 (Sun)
  63519145200, #      utc_end 2013-11-03 07:00:00 (Sun)
  63498567600, #  local_start 2013-03-10 03:00:00 (Sun)
  63519127200, #    local_end 2013-11-03 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63519145200, #    utc_start 2013-11-03 07:00:00 (Sun)
  63530035200, #      utc_end 2014-03-09 08:00:00 (Sun)
  63519123600, #  local_start 2013-11-03 01:00:00 (Sun)
  63530013600, #    local_end 2014-03-09 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63530035200, #    utc_start 2014-03-09 08:00:00 (Sun)
  63550594800, #      utc_end 2014-11-02 07:00:00 (Sun)
  63530017200, #  local_start 2014-03-09 03:00:00 (Sun)
  63550576800, #    local_end 2014-11-02 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63550594800, #    utc_start 2014-11-02 07:00:00 (Sun)
  63561484800, #      utc_end 2015-03-08 08:00:00 (Sun)
  63550573200, #  local_start 2014-11-02 01:00:00 (Sun)
  63561463200, #    local_end 2015-03-08 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63561484800, #    utc_start 2015-03-08 08:00:00 (Sun)
  63582044400, #      utc_end 2015-11-01 07:00:00 (Sun)
  63561466800, #  local_start 2015-03-08 03:00:00 (Sun)
  63582026400, #    local_end 2015-11-01 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63582044400, #    utc_start 2015-11-01 07:00:00 (Sun)
  63593539200, #      utc_end 2016-03-13 08:00:00 (Sun)
  63582022800, #  local_start 2015-11-01 01:00:00 (Sun)
  63593517600, #    local_end 2016-03-13 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63593539200, #    utc_start 2016-03-13 08:00:00 (Sun)
  63614098800, #      utc_end 2016-11-06 07:00:00 (Sun)
  63593521200, #  local_start 2016-03-13 03:00:00 (Sun)
  63614080800, #    local_end 2016-11-06 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63614098800, #    utc_start 2016-11-06 07:00:00 (Sun)
  63624988800, #      utc_end 2017-03-12 08:00:00 (Sun)
  63614077200, #  local_start 2016-11-06 01:00:00 (Sun)
  63624967200, #    local_end 2017-03-12 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63624988800, #    utc_start 2017-03-12 08:00:00 (Sun)
  63645548400, #      utc_end 2017-11-05 07:00:00 (Sun)
  63624970800, #  local_start 2017-03-12 03:00:00 (Sun)
  63645530400, #    local_end 2017-11-05 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63645548400, #    utc_start 2017-11-05 07:00:00 (Sun)
  63656438400, #      utc_end 2018-03-11 08:00:00 (Sun)
  63645526800, #  local_start 2017-11-05 01:00:00 (Sun)
  63656416800, #    local_end 2018-03-11 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63656438400, #    utc_start 2018-03-11 08:00:00 (Sun)
  63676998000, #      utc_end 2018-11-04 07:00:00 (Sun)
  63656420400, #  local_start 2018-03-11 03:00:00 (Sun)
  63676980000, #    local_end 2018-11-04 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63676998000, #    utc_start 2018-11-04 07:00:00 (Sun)
  63687888000, #      utc_end 2019-03-10 08:00:00 (Sun)
  63676976400, #  local_start 2018-11-04 01:00:00 (Sun)
  63687866400, #    local_end 2019-03-10 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63687888000, #    utc_start 2019-03-10 08:00:00 (Sun)
  63708447600, #      utc_end 2019-11-03 07:00:00 (Sun)
  63687870000, #  local_start 2019-03-10 03:00:00 (Sun)
  63708429600, #    local_end 2019-11-03 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63708447600, #    utc_start 2019-11-03 07:00:00 (Sun)
  63719337600, #      utc_end 2020-03-08 08:00:00 (Sun)
  63708426000, #  local_start 2019-11-03 01:00:00 (Sun)
  63719316000, #    local_end 2020-03-08 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63719337600, #    utc_start 2020-03-08 08:00:00 (Sun)
  63739897200, #      utc_end 2020-11-01 07:00:00 (Sun)
  63719319600, #  local_start 2020-03-08 03:00:00 (Sun)
  63739879200, #    local_end 2020-11-01 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63739897200, #    utc_start 2020-11-01 07:00:00 (Sun)
  63751392000, #      utc_end 2021-03-14 08:00:00 (Sun)
  63739875600, #  local_start 2020-11-01 01:00:00 (Sun)
  63751370400, #    local_end 2021-03-14 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63751392000, #    utc_start 2021-03-14 08:00:00 (Sun)
  63771951600, #      utc_end 2021-11-07 07:00:00 (Sun)
  63751374000, #  local_start 2021-03-14 03:00:00 (Sun)
  63771933600, #    local_end 2021-11-07 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63771951600, #    utc_start 2021-11-07 07:00:00 (Sun)
  63782841600, #      utc_end 2022-03-13 08:00:00 (Sun)
  63771930000, #  local_start 2021-11-07 01:00:00 (Sun)
  63782820000, #    local_end 2022-03-13 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63782841600, #    utc_start 2022-03-13 08:00:00 (Sun)
  63803401200, #      utc_end 2022-11-06 07:00:00 (Sun)
  63782823600, #  local_start 2022-03-13 03:00:00 (Sun)
  63803383200, #    local_end 2022-11-06 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63803401200, #    utc_start 2022-11-06 07:00:00 (Sun)
  63814291200, #      utc_end 2023-03-12 08:00:00 (Sun)
  63803379600, #  local_start 2022-11-06 01:00:00 (Sun)
  63814269600, #    local_end 2023-03-12 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63814291200, #    utc_start 2023-03-12 08:00:00 (Sun)
  63834850800, #      utc_end 2023-11-05 07:00:00 (Sun)
  63814273200, #  local_start 2023-03-12 03:00:00 (Sun)
  63834832800, #    local_end 2023-11-05 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63834850800, #    utc_start 2023-11-05 07:00:00 (Sun)
  63845740800, #      utc_end 2024-03-10 08:00:00 (Sun)
  63834829200, #  local_start 2023-11-05 01:00:00 (Sun)
  63845719200, #    local_end 2024-03-10 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63845740800, #    utc_start 2024-03-10 08:00:00 (Sun)
  63866300400, #      utc_end 2024-11-03 07:00:00 (Sun)
  63845722800, #  local_start 2024-03-10 03:00:00 (Sun)
  63866282400, #    local_end 2024-11-03 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63866300400, #    utc_start 2024-11-03 07:00:00 (Sun)
  63877190400, #      utc_end 2025-03-09 08:00:00 (Sun)
  63866278800, #  local_start 2024-11-03 01:00:00 (Sun)
  63877168800, #    local_end 2025-03-09 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63877190400, #    utc_start 2025-03-09 08:00:00 (Sun)
  63897750000, #      utc_end 2025-11-02 07:00:00 (Sun)
  63877172400, #  local_start 2025-03-09 03:00:00 (Sun)
  63897732000, #    local_end 2025-11-02 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63897750000, #    utc_start 2025-11-02 07:00:00 (Sun)
  63908640000, #      utc_end 2026-03-08 08:00:00 (Sun)
  63897728400, #  local_start 2025-11-02 01:00:00 (Sun)
  63908618400, #    local_end 2026-03-08 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63908640000, #    utc_start 2026-03-08 08:00:00 (Sun)
  63929199600, #      utc_end 2026-11-01 07:00:00 (Sun)
  63908622000, #  local_start 2026-03-08 03:00:00 (Sun)
  63929181600, #    local_end 2026-11-01 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63929199600, #    utc_start 2026-11-01 07:00:00 (Sun)
  63940694400, #      utc_end 2027-03-14 08:00:00 (Sun)
  63929178000, #  local_start 2026-11-01 01:00:00 (Sun)
  63940672800, #    local_end 2027-03-14 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63940694400, #    utc_start 2027-03-14 08:00:00 (Sun)
  63961254000, #      utc_end 2027-11-07 07:00:00 (Sun)
  63940676400, #  local_start 2027-03-14 03:00:00 (Sun)
  63961236000, #    local_end 2027-11-07 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63961254000, #    utc_start 2027-11-07 07:00:00 (Sun)
  63972144000, #      utc_end 2028-03-12 08:00:00 (Sun)
  63961232400, #  local_start 2027-11-07 01:00:00 (Sun)
  63972122400, #    local_end 2028-03-12 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  63972144000, #    utc_start 2028-03-12 08:00:00 (Sun)
  63992703600, #      utc_end 2028-11-05 07:00:00 (Sun)
  63972126000, #  local_start 2028-03-12 03:00:00 (Sun)
  63992685600, #    local_end 2028-11-05 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  63992703600, #    utc_start 2028-11-05 07:00:00 (Sun)
  64003593600, #      utc_end 2029-03-11 08:00:00 (Sun)
  63992682000, #  local_start 2028-11-05 01:00:00 (Sun)
  64003572000, #    local_end 2029-03-11 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  64003593600, #    utc_start 2029-03-11 08:00:00 (Sun)
  64024153200, #      utc_end 2029-11-04 07:00:00 (Sun)
  64003575600, #  local_start 2029-03-11 03:00:00 (Sun)
  64024135200, #    local_end 2029-11-04 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
      [
  64024153200, #    utc_start 2029-11-04 07:00:00 (Sun)
  64035043200, #      utc_end 2030-03-10 08:00:00 (Sun)
  64024131600, #  local_start 2029-11-04 01:00:00 (Sun)
  64035021600, #    local_end 2030-03-10 02:00:00 (Sun)
  -21600,
  0,
  'CST',
      ],
      [
  64035043200, #    utc_start 2030-03-10 08:00:00 (Sun)
  64055602800, #      utc_end 2030-11-03 07:00:00 (Sun)
  64035025200, #  local_start 2030-03-10 03:00:00 (Sun)
  64055584800, #    local_end 2030-11-03 02:00:00 (Sun)
  -18000,
  1,
  'CDT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {68}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -21600 }
  
  my $last_observance = bless( {
    'format' => 'C%sT',
    'gmtoff' => '-6:00',
    'local_start_datetime' => {},
    'offset_from_std' => 0,
    'offset_from_utc' => -21600,
    'until' => [],
    'utc_start_datetime' => {}
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Mar',
      'letter' => 'D',
      'name' => 'US',
      'offset_from_std' => 3600,
      'on' => 'Sun>=8',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Nov',
      'letter' => 'S',
      'name' => 'US',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_CST6CDT

    $main::fatpacked{"DateTime/TimeZone/Catalog.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_CATALOG';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Do not edit this file directly.
  
  package DateTime::TimeZone::Catalog;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  our @ALL =
  qw(
    Africa/Abidjan
    Africa/Accra
    Africa/Algiers
    Africa/Bissau
    Africa/Cairo
    Africa/Casablanca
    Africa/Ceuta
    Africa/El_Aaiun
    Africa/Johannesburg
    Africa/Juba
    Africa/Khartoum
    Africa/Lagos
    Africa/Maputo
    Africa/Monrovia
    Africa/Nairobi
    Africa/Ndjamena
    Africa/Sao_Tome
    Africa/Tripoli
    Africa/Tunis
    Africa/Windhoek
    America/Adak
    America/Anchorage
    America/Araguaina
    America/Argentina/Buenos_Aires
    America/Argentina/Catamarca
    America/Argentina/Cordoba
    America/Argentina/Jujuy
    America/Argentina/La_Rioja
    America/Argentina/Mendoza
    America/Argentina/Rio_Gallegos
    America/Argentina/Salta
    America/Argentina/San_Juan
    America/Argentina/San_Luis
    America/Argentina/Tucuman
    America/Argentina/Ushuaia
    America/Asuncion
    America/Atikokan
    America/Bahia
    America/Bahia_Banderas
    America/Barbados
    America/Belem
    America/Belize
    America/Blanc-Sablon
    America/Boa_Vista
    America/Bogota
    America/Boise
    America/Cambridge_Bay
    America/Campo_Grande
    America/Cancun
    America/Caracas
    America/Cayenne
    America/Chicago
    America/Chihuahua
    America/Costa_Rica
    America/Creston
    America/Cuiaba
    America/Curacao
    America/Danmarkshavn
    America/Dawson
    America/Dawson_Creek
    America/Denver
    America/Detroit
    America/Edmonton
    America/Eirunepe
    America/El_Salvador
    America/Fort_Nelson
    America/Fortaleza
    America/Glace_Bay
    America/Godthab
    America/Goose_Bay
    America/Grand_Turk
    America/Guatemala
    America/Guayaquil
    America/Guyana
    America/Halifax
    America/Havana
    America/Hermosillo
    America/Indiana/Indianapolis
    America/Indiana/Knox
    America/Indiana/Marengo
    America/Indiana/Petersburg
    America/Indiana/Tell_City
    America/Indiana/Vevay
    America/Indiana/Vincennes
    America/Indiana/Winamac
    America/Inuvik
    America/Iqaluit
    America/Jamaica
    America/Juneau
    America/Kentucky/Louisville
    America/Kentucky/Monticello
    America/La_Paz
    America/Lima
    America/Los_Angeles
    America/Maceio
    America/Managua
    America/Manaus
    America/Martinique
    America/Matamoros
    America/Mazatlan
    America/Menominee
    America/Merida
    America/Metlakatla
    America/Mexico_City
    America/Miquelon
    America/Moncton
    America/Monterrey
    America/Montevideo
    America/Nassau
    America/New_York
    America/Nipigon
    America/Nome
    America/Noronha
    America/North_Dakota/Beulah
    America/North_Dakota/Center
    America/North_Dakota/New_Salem
    America/Ojinaga
    America/Panama
    America/Pangnirtung
    America/Paramaribo
    America/Phoenix
    America/Port-au-Prince
    America/Port_of_Spain
    America/Porto_Velho
    America/Puerto_Rico
    America/Punta_Arenas
    America/Rainy_River
    America/Rankin_Inlet
    America/Recife
    America/Regina
    America/Resolute
    America/Rio_Branco
    America/Santarem
    America/Santiago
    America/Santo_Domingo
    America/Sao_Paulo
    America/Scoresbysund
    America/Sitka
    America/St_Johns
    America/Swift_Current
    America/Tegucigalpa
    America/Thule
    America/Thunder_Bay
    America/Tijuana
    America/Toronto
    America/Vancouver
    America/Whitehorse
    America/Winnipeg
    America/Yakutat
    America/Yellowknife
    Antarctica/Casey
    Antarctica/Davis
    Antarctica/DumontDUrville
    Antarctica/Macquarie
    Antarctica/Mawson
    Antarctica/Palmer
    Antarctica/Rothera
    Antarctica/Syowa
    Antarctica/Troll
    Antarctica/Vostok
    Asia/Almaty
    Asia/Amman
    Asia/Anadyr
    Asia/Aqtau
    Asia/Aqtobe
    Asia/Ashgabat
    Asia/Atyrau
    Asia/Baghdad
    Asia/Baku
    Asia/Bangkok
    Asia/Barnaul
    Asia/Beirut
    Asia/Bishkek
    Asia/Brunei
    Asia/Chita
    Asia/Choibalsan
    Asia/Colombo
    Asia/Damascus
    Asia/Dhaka
    Asia/Dili
    Asia/Dubai
    Asia/Dushanbe
    Asia/Famagusta
    Asia/Gaza
    Asia/Hebron
    Asia/Ho_Chi_Minh
    Asia/Hong_Kong
    Asia/Hovd
    Asia/Irkutsk
    Asia/Jakarta
    Asia/Jayapura
    Asia/Jerusalem
    Asia/Kabul
    Asia/Kamchatka
    Asia/Karachi
    Asia/Kathmandu
    Asia/Khandyga
    Asia/Kolkata
    Asia/Krasnoyarsk
    Asia/Kuala_Lumpur
    Asia/Kuching
    Asia/Macau
    Asia/Magadan
    Asia/Makassar
    Asia/Manila
    Asia/Nicosia
    Asia/Novokuznetsk
    Asia/Novosibirsk
    Asia/Omsk
    Asia/Oral
    Asia/Pontianak
    Asia/Pyongyang
    Asia/Qatar
    Asia/Qostanay
    Asia/Qyzylorda
    Asia/Riyadh
    Asia/Sakhalin
    Asia/Samarkand
    Asia/Seoul
    Asia/Shanghai
    Asia/Singapore
    Asia/Srednekolymsk
    Asia/Taipei
    Asia/Tashkent
    Asia/Tbilisi
    Asia/Tehran
    Asia/Thimphu
    Asia/Tokyo
    Asia/Tomsk
    Asia/Ulaanbaatar
    Asia/Urumqi
    Asia/Ust-Nera
    Asia/Vladivostok
    Asia/Yakutsk
    Asia/Yangon
    Asia/Yekaterinburg
    Asia/Yerevan
    Atlantic/Azores
    Atlantic/Bermuda
    Atlantic/Canary
    Atlantic/Cape_Verde
    Atlantic/Faroe
    Atlantic/Madeira
    Atlantic/Reykjavik
    Atlantic/South_Georgia
    Atlantic/Stanley
    Australia/Adelaide
    Australia/Brisbane
    Australia/Broken_Hill
    Australia/Currie
    Australia/Darwin
    Australia/Eucla
    Australia/Hobart
    Australia/Lindeman
    Australia/Lord_Howe
    Australia/Melbourne
    Australia/Perth
    Australia/Sydney
    CET
    CST6CDT
    EET
    EST
    EST5EDT
    Europe/Amsterdam
    Europe/Andorra
    Europe/Astrakhan
    Europe/Athens
    Europe/Belgrade
    Europe/Berlin
    Europe/Brussels
    Europe/Bucharest
    Europe/Budapest
    Europe/Chisinau
    Europe/Copenhagen
    Europe/Dublin
    Europe/Gibraltar
    Europe/Helsinki
    Europe/Istanbul
    Europe/Kaliningrad
    Europe/Kiev
    Europe/Kirov
    Europe/Lisbon
    Europe/London
    Europe/Luxembourg
    Europe/Madrid
    Europe/Malta
    Europe/Minsk
    Europe/Monaco
    Europe/Moscow
    Europe/Oslo
    Europe/Paris
    Europe/Prague
    Europe/Riga
    Europe/Rome
    Europe/Samara
    Europe/Saratov
    Europe/Simferopol
    Europe/Sofia
    Europe/Stockholm
    Europe/Tallinn
    Europe/Tirane
    Europe/Ulyanovsk
    Europe/Uzhgorod
    Europe/Vienna
    Europe/Vilnius
    Europe/Volgograd
    Europe/Warsaw
    Europe/Zaporozhye
    Europe/Zurich
    HST
    Indian/Chagos
    Indian/Christmas
    Indian/Cocos
    Indian/Kerguelen
    Indian/Mahe
    Indian/Maldives
    Indian/Mauritius
    Indian/Reunion
    MET
    MST
    MST7MDT
    PST8PDT
    Pacific/Apia
    Pacific/Auckland
    Pacific/Bougainville
    Pacific/Chatham
    Pacific/Chuuk
    Pacific/Easter
    Pacific/Efate
    Pacific/Enderbury
    Pacific/Fakaofo
    Pacific/Fiji
    Pacific/Funafuti
    Pacific/Galapagos
    Pacific/Gambier
    Pacific/Guadalcanal
    Pacific/Guam
    Pacific/Honolulu
    Pacific/Kiritimati
    Pacific/Kosrae
    Pacific/Kwajalein
    Pacific/Majuro
    Pacific/Marquesas
    Pacific/Nauru
    Pacific/Niue
    Pacific/Norfolk
    Pacific/Noumea
    Pacific/Pago_Pago
    Pacific/Palau
    Pacific/Pitcairn
    Pacific/Pohnpei
    Pacific/Port_Moresby
    Pacific/Rarotonga
    Pacific/Tahiti
    Pacific/Tarawa
    Pacific/Tongatapu
    Pacific/Wake
    Pacific/Wallis
    UTC
    WET
  );
  
  our @CATEGORY_NAMES =
  qw(
    Africa
    America
    Antarctica
    Asia
    Atlantic
    Australia
    Europe
    Indian
    Pacific
  );
  
  our %CATEGORIES =
  (
    'Africa' => [ qw(
  Abidjan
  Accra
  Algiers
  Bissau
  Cairo
  Casablanca
  Ceuta
  El_Aaiun
  Johannesburg
  Juba
  Khartoum
  Lagos
  Maputo
  Monrovia
  Nairobi
  Ndjamena
  Sao_Tome
  Tripoli
  Tunis
  Windhoek
  ) ],
    'America' => [ qw(
  Adak
  Anchorage
  Araguaina
  Argentina/Buenos_Aires
  Argentina/Catamarca
  Argentina/Cordoba
  Argentina/Jujuy
  Argentina/La_Rioja
  Argentina/Mendoza
  Argentina/Rio_Gallegos
  Argentina/Salta
  Argentina/San_Juan
  Argentina/San_Luis
  Argentina/Tucuman
  Argentina/Ushuaia
  Asuncion
  Atikokan
  Bahia
  Bahia_Banderas
  Barbados
  Belem
  Belize
  Blanc-Sablon
  Boa_Vista
  Bogota
  Boise
  Cambridge_Bay
  Campo_Grande
  Cancun
  Caracas
  Cayenne
  Chicago
  Chihuahua
  Costa_Rica
  Creston
  Cuiaba
  Curacao
  Danmarkshavn
  Dawson
  Dawson_Creek
  Denver
  Detroit
  Edmonton
  Eirunepe
  El_Salvador
  Fort_Nelson
  Fortaleza
  Glace_Bay
  Godthab
  Goose_Bay
  Grand_Turk
  Guatemala
  Guayaquil
  Guyana
  Halifax
  Havana
  Hermosillo
  Indiana/Indianapolis
  Indiana/Knox
  Indiana/Marengo
  Indiana/Petersburg
  Indiana/Tell_City
  Indiana/Vevay
  Indiana/Vincennes
  Indiana/Winamac
  Inuvik
  Iqaluit
  Jamaica
  Juneau
  Kentucky/Louisville
  Kentucky/Monticello
  La_Paz
  Lima
  Los_Angeles
  Maceio
  Managua
  Manaus
  Martinique
  Matamoros
  Mazatlan
  Menominee
  Merida
  Metlakatla
  Mexico_City
  Miquelon
  Moncton
  Monterrey
  Montevideo
  Nassau
  New_York
  Nipigon
  Nome
  Noronha
  North_Dakota/Beulah
  North_Dakota/Center
  North_Dakota/New_Salem
  Ojinaga
  Panama
  Pangnirtung
  Paramaribo
  Phoenix
  Port-au-Prince
  Port_of_Spain
  Porto_Velho
  Puerto_Rico
  Punta_Arenas
  Rainy_River
  Rankin_Inlet
  Recife
  Regina
  Resolute
  Rio_Branco
  Santarem
  Santiago
  Santo_Domingo
  Sao_Paulo
  Scoresbysund
  Sitka
  St_Johns
  Swift_Current
  Tegucigalpa
  Thule
  Thunder_Bay
  Tijuana
  Toronto
  Vancouver
  Whitehorse
  Winnipeg
  Yakutat
  Yellowknife
  ) ],
    'Antarctica' => [ qw(
  Casey
  Davis
  DumontDUrville
  Macquarie
  Mawson
  Palmer
  Rothera
  Syowa
  Troll
  Vostok
  ) ],
    'Asia' => [ qw(
  Almaty
  Amman
  Anadyr
  Aqtau
  Aqtobe
  Ashgabat
  Atyrau
  Baghdad
  Baku
  Bangkok
  Barnaul
  Beirut
  Bishkek
  Brunei
  Chita
  Choibalsan
  Colombo
  Damascus
  Dhaka
  Dili
  Dubai
  Dushanbe
  Famagusta
  Gaza
  Hebron
  Ho_Chi_Minh
  Hong_Kong
  Hovd
  Irkutsk
  Jakarta
  Jayapura
  Jerusalem
  Kabul
  Kamchatka
  Karachi
  Kathmandu
  Khandyga
  Kolkata
  Krasnoyarsk
  Kuala_Lumpur
  Kuching
  Macau
  Magadan
  Makassar
  Manila
  Nicosia
  Novokuznetsk
  Novosibirsk
  Omsk
  Oral
  Pontianak
  Pyongyang
  Qatar
  Qostanay
  Qyzylorda
  Riyadh
  Sakhalin
  Samarkand
  Seoul
  Shanghai
  Singapore
  Srednekolymsk
  Taipei
  Tashkent
  Tbilisi
  Tehran
  Thimphu
  Tokyo
  Tomsk
  Ulaanbaatar
  Urumqi
  Ust-Nera
  Vladivostok
  Yakutsk
  Yangon
  Yekaterinburg
  Yerevan
  ) ],
    'Atlantic' => [ qw(
  Azores
  Bermuda
  Canary
  Cape_Verde
  Faroe
  Madeira
  Reykjavik
  South_Georgia
  Stanley
  ) ],
    'Australia' => [ qw(
  Adelaide
  Brisbane
  Broken_Hill
  Currie
  Darwin
  Eucla
  Hobart
  Lindeman
  Lord_Howe
  Melbourne
  Perth
  Sydney
  ) ],
    'Europe' => [ qw(
  Amsterdam
  Andorra
  Astrakhan
  Athens
  Belgrade
  Berlin
  Brussels
  Bucharest
  Budapest
  Chisinau
  Copenhagen
  Dublin
  Gibraltar
  Helsinki
  Istanbul
  Kaliningrad
  Kiev
  Kirov
  Lisbon
  London
  Luxembourg
  Madrid
  Malta
  Minsk
  Monaco
  Moscow
  Oslo
  Paris
  Prague
  Riga
  Rome
  Samara
  Saratov
  Simferopol
  Sofia
  Stockholm
  Tallinn
  Tirane
  Ulyanovsk
  Uzhgorod
  Vienna
  Vilnius
  Volgograd
  Warsaw
  Zaporozhye
  Zurich
  ) ],
    'Indian' => [ qw(
  Chagos
  Christmas
  Cocos
  Kerguelen
  Mahe
  Maldives
  Mauritius
  Reunion
  ) ],
    'Pacific' => [ qw(
  Apia
  Auckland
  Bougainville
  Chatham
  Chuuk
  Easter
  Efate
  Enderbury
  Fakaofo
  Fiji
  Funafuti
  Galapagos
  Gambier
  Guadalcanal
  Guam
  Honolulu
  Kiritimati
  Kosrae
  Kwajalein
  Majuro
  Marquesas
  Nauru
  Niue
  Norfolk
  Noumea
  Pago_Pago
  Palau
  Pitcairn
  Pohnpei
  Port_Moresby
  Rarotonga
  Tahiti
  Tarawa
  Tongatapu
  Wake
  Wallis
  ) ],
  
  );
  
  our %ZONES_BY_COUNTRY =
  (
    'ad' => [ qw(
  Europe/Andorra
  ) ],
    'ae' => [ qw(
  Asia/Dubai
  ) ],
    'af' => [ qw(
  Asia/Kabul
  ) ],
    'ag' => [ qw(
  America/Antigua
  ) ],
    'ai' => [ qw(
  America/Anguilla
  ) ],
    'al' => [ qw(
  Europe/Tirane
  ) ],
    'am' => [ qw(
  Asia/Yerevan
  ) ],
    'ao' => [ qw(
  Africa/Luanda
  ) ],
    'aq' => [ qw(
  Antarctica/McMurdo
  Antarctica/Casey
  Antarctica/Davis
  Antarctica/DumontDUrville
  Antarctica/Mawson
  Antarctica/Palmer
  Antarctica/Rothera
  Antarctica/Syowa
  Antarctica/Troll
  Antarctica/Vostok
  ) ],
    'ar' => [ qw(
  America/Argentina/Buenos_Aires
  America/Argentina/Cordoba
  America/Argentina/Salta
  America/Argentina/Jujuy
  America/Argentina/Tucuman
  America/Argentina/Catamarca
  America/Argentina/La_Rioja
  America/Argentina/San_Juan
  America/Argentina/Mendoza
  America/Argentina/San_Luis
  America/Argentina/Rio_Gallegos
  America/Argentina/Ushuaia
  ) ],
    'as' => [ qw(
  Pacific/Pago_Pago
  ) ],
    'at' => [ qw(
  Europe/Vienna
  ) ],
    'au' => [ qw(
  Australia/Lord_Howe
  Antarctica/Macquarie
  Australia/Hobart
  Australia/Currie
  Australia/Melbourne
  Australia/Sydney
  Australia/Broken_Hill
  Australia/Brisbane
  Australia/Lindeman
  Australia/Adelaide
  Australia/Darwin
  Australia/Perth
  Australia/Eucla
  ) ],
    'aw' => [ qw(
  America/Aruba
  ) ],
    'ax' => [ qw(
  Europe/Mariehamn
  ) ],
    'az' => [ qw(
  Asia/Baku
  ) ],
    'ba' => [ qw(
  Europe/Sarajevo
  ) ],
    'bb' => [ qw(
  America/Barbados
  ) ],
    'bd' => [ qw(
  Asia/Dhaka
  ) ],
    'be' => [ qw(
  Europe/Brussels
  ) ],
    'bf' => [ qw(
  Africa/Ouagadougou
  ) ],
    'bg' => [ qw(
  Europe/Sofia
  ) ],
    'bh' => [ qw(
  Asia/Bahrain
  ) ],
    'bi' => [ qw(
  Africa/Bujumbura
  ) ],
    'bj' => [ qw(
  Africa/Porto-Novo
  ) ],
    'bl' => [ qw(
  America/St_Barthelemy
  ) ],
    'bm' => [ qw(
  Atlantic/Bermuda
  ) ],
    'bn' => [ qw(
  Asia/Brunei
  ) ],
    'bo' => [ qw(
  America/La_Paz
  ) ],
    'bq' => [ qw(
  America/Kralendijk
  ) ],
    'br' => [ qw(
  America/Noronha
  America/Belem
  America/Fortaleza
  America/Recife
  America/Araguaina
  America/Maceio
  America/Bahia
  America/Sao_Paulo
  America/Campo_Grande
  America/Cuiaba
  America/Santarem
  America/Porto_Velho
  America/Boa_Vista
  America/Manaus
  America/Eirunepe
  America/Rio_Branco
  ) ],
    'bs' => [ qw(
  America/Nassau
  ) ],
    'bt' => [ qw(
  Asia/Thimphu
  ) ],
    'bw' => [ qw(
  Africa/Gaborone
  ) ],
    'by' => [ qw(
  Europe/Minsk
  ) ],
    'bz' => [ qw(
  America/Belize
  ) ],
    'ca' => [ qw(
  America/St_Johns
  America/Halifax
  America/Glace_Bay
  America/Moncton
  America/Goose_Bay
  America/Blanc-Sablon
  America/Toronto
  America/Nipigon
  America/Thunder_Bay
  America/Iqaluit
  America/Pangnirtung
  America/Atikokan
  America/Winnipeg
  America/Rainy_River
  America/Resolute
  America/Rankin_Inlet
  America/Regina
  America/Swift_Current
  America/Edmonton
  America/Cambridge_Bay
  America/Yellowknife
  America/Inuvik
  America/Creston
  America/Dawson_Creek
  America/Fort_Nelson
  America/Vancouver
  America/Whitehorse
  America/Dawson
  ) ],
    'cc' => [ qw(
  Indian/Cocos
  ) ],
    'cd' => [ qw(
  Africa/Kinshasa
  Africa/Lubumbashi
  ) ],
    'cf' => [ qw(
  Africa/Bangui
  ) ],
    'cg' => [ qw(
  Africa/Brazzaville
  ) ],
    'ch' => [ qw(
  Europe/Zurich
  ) ],
    'ci' => [ qw(
  Africa/Abidjan
  ) ],
    'ck' => [ qw(
  Pacific/Rarotonga
  ) ],
    'cl' => [ qw(
  America/Santiago
  America/Punta_Arenas
  Pacific/Easter
  ) ],
    'cm' => [ qw(
  Africa/Douala
  ) ],
    'cn' => [ qw(
  Asia/Shanghai
  Asia/Urumqi
  ) ],
    'co' => [ qw(
  America/Bogota
  ) ],
    'cr' => [ qw(
  America/Costa_Rica
  ) ],
    'cu' => [ qw(
  America/Havana
  ) ],
    'cv' => [ qw(
  Atlantic/Cape_Verde
  ) ],
    'cw' => [ qw(
  America/Curacao
  ) ],
    'cx' => [ qw(
  Indian/Christmas
  ) ],
    'cy' => [ qw(
  Asia/Nicosia
  Asia/Famagusta
  ) ],
    'cz' => [ qw(
  Europe/Prague
  ) ],
    'de' => [ qw(
  Europe/Berlin
  Europe/Busingen
  ) ],
    'dj' => [ qw(
  Africa/Djibouti
  ) ],
    'dk' => [ qw(
  Europe/Copenhagen
  ) ],
    'dm' => [ qw(
  America/Dominica
  ) ],
    'do' => [ qw(
  America/Santo_Domingo
  ) ],
    'dz' => [ qw(
  Africa/Algiers
  ) ],
    'ec' => [ qw(
  America/Guayaquil
  Pacific/Galapagos
  ) ],
    'ee' => [ qw(
  Europe/Tallinn
  ) ],
    'eg' => [ qw(
  Africa/Cairo
  ) ],
    'eh' => [ qw(
  Africa/El_Aaiun
  ) ],
    'er' => [ qw(
  Africa/Asmara
  ) ],
    'es' => [ qw(
  Europe/Madrid
  Africa/Ceuta
  Atlantic/Canary
  ) ],
    'et' => [ qw(
  Africa/Addis_Ababa
  ) ],
    'fi' => [ qw(
  Europe/Helsinki
  ) ],
    'fj' => [ qw(
  Pacific/Fiji
  ) ],
    'fk' => [ qw(
  Atlantic/Stanley
  ) ],
    'fm' => [ qw(
  Pacific/Chuuk
  Pacific/Pohnpei
  Pacific/Kosrae
  ) ],
    'fo' => [ qw(
  Atlantic/Faroe
  ) ],
    'fr' => [ qw(
  Europe/Paris
  ) ],
    'ga' => [ qw(
  Africa/Libreville
  ) ],
    'gb' => [ qw(
  Europe/London
  ) ],
    'gd' => [ qw(
  America/Grenada
  ) ],
    'ge' => [ qw(
  Asia/Tbilisi
  ) ],
    'gf' => [ qw(
  America/Cayenne
  ) ],
    'gg' => [ qw(
  Europe/Guernsey
  ) ],
    'gh' => [ qw(
  Africa/Accra
  ) ],
    'gi' => [ qw(
  Europe/Gibraltar
  ) ],
    'gl' => [ qw(
  America/Godthab
  America/Danmarkshavn
  America/Scoresbysund
  America/Thule
  ) ],
    'gm' => [ qw(
  Africa/Banjul
  ) ],
    'gn' => [ qw(
  Africa/Conakry
  ) ],
    'gp' => [ qw(
  America/Guadeloupe
  ) ],
    'gq' => [ qw(
  Africa/Malabo
  ) ],
    'gr' => [ qw(
  Europe/Athens
  ) ],
    'gs' => [ qw(
  Atlantic/South_Georgia
  ) ],
    'gt' => [ qw(
  America/Guatemala
  ) ],
    'gu' => [ qw(
  Pacific/Guam
  ) ],
    'gw' => [ qw(
  Africa/Bissau
  ) ],
    'gy' => [ qw(
  America/Guyana
  ) ],
    'hk' => [ qw(
  Asia/Hong_Kong
  ) ],
    'hn' => [ qw(
  America/Tegucigalpa
  ) ],
    'hr' => [ qw(
  Europe/Zagreb
  ) ],
    'ht' => [ qw(
  America/Port-au-Prince
  ) ],
    'hu' => [ qw(
  Europe/Budapest
  ) ],
    'id' => [ qw(
  Asia/Jakarta
  Asia/Pontianak
  Asia/Makassar
  Asia/Jayapura
  ) ],
    'ie' => [ qw(
  Europe/Dublin
  ) ],
    'il' => [ qw(
  Asia/Jerusalem
  ) ],
    'im' => [ qw(
  Europe/Isle_of_Man
  ) ],
    'in' => [ qw(
  Asia/Kolkata
  ) ],
    'io' => [ qw(
  Indian/Chagos
  ) ],
    'iq' => [ qw(
  Asia/Baghdad
  ) ],
    'ir' => [ qw(
  Asia/Tehran
  ) ],
    'is' => [ qw(
  Atlantic/Reykjavik
  ) ],
    'it' => [ qw(
  Europe/Rome
  ) ],
    'je' => [ qw(
  Europe/Jersey
  ) ],
    'jm' => [ qw(
  America/Jamaica
  ) ],
    'jo' => [ qw(
  Asia/Amman
  ) ],
    'jp' => [ qw(
  Asia/Tokyo
  ) ],
    'ke' => [ qw(
  Africa/Nairobi
  ) ],
    'kg' => [ qw(
  Asia/Bishkek
  ) ],
    'kh' => [ qw(
  Asia/Phnom_Penh
  ) ],
    'ki' => [ qw(
  Pacific/Tarawa
  Pacific/Enderbury
  Pacific/Kiritimati
  ) ],
    'km' => [ qw(
  Indian/Comoro
  ) ],
    'kn' => [ qw(
  America/St_Kitts
  ) ],
    'kp' => [ qw(
  Asia/Pyongyang
  ) ],
    'kr' => [ qw(
  Asia/Seoul
  ) ],
    'kw' => [ qw(
  Asia/Kuwait
  ) ],
    'ky' => [ qw(
  America/Cayman
  ) ],
    'kz' => [ qw(
  Asia/Almaty
  Asia/Qyzylorda
  Asia/Qostanay
  Asia/Aqtobe
  Asia/Aqtau
  Asia/Atyrau
  Asia/Oral
  ) ],
    'la' => [ qw(
  Asia/Vientiane
  ) ],
    'lb' => [ qw(
  Asia/Beirut
  ) ],
    'lc' => [ qw(
  America/St_Lucia
  ) ],
    'li' => [ qw(
  Europe/Vaduz
  ) ],
    'lk' => [ qw(
  Asia/Colombo
  ) ],
    'lr' => [ qw(
  Africa/Monrovia
  ) ],
    'ls' => [ qw(
  Africa/Maseru
  ) ],
    'lt' => [ qw(
  Europe/Vilnius
  ) ],
    'lu' => [ qw(
  Europe/Luxembourg
  ) ],
    'lv' => [ qw(
  Europe/Riga
  ) ],
    'ly' => [ qw(
  Africa/Tripoli
  ) ],
    'ma' => [ qw(
  Africa/Casablanca
  ) ],
    'mc' => [ qw(
  Europe/Monaco
  ) ],
    'md' => [ qw(
  Europe/Chisinau
  ) ],
    'me' => [ qw(
  Europe/Podgorica
  ) ],
    'mf' => [ qw(
  America/Marigot
  ) ],
    'mg' => [ qw(
  Indian/Antananarivo
  ) ],
    'mh' => [ qw(
  Pacific/Majuro
  Pacific/Kwajalein
  ) ],
    'mk' => [ qw(
  Europe/Skopje
  ) ],
    'ml' => [ qw(
  Africa/Bamako
  ) ],
    'mm' => [ qw(
  Asia/Yangon
  ) ],
    'mn' => [ qw(
  Asia/Ulaanbaatar
  Asia/Hovd
  Asia/Choibalsan
  ) ],
    'mo' => [ qw(
  Asia/Macau
  ) ],
    'mp' => [ qw(
  Pacific/Saipan
  ) ],
    'mq' => [ qw(
  America/Martinique
  ) ],
    'mr' => [ qw(
  Africa/Nouakchott
  ) ],
    'ms' => [ qw(
  America/Montserrat
  ) ],
    'mt' => [ qw(
  Europe/Malta
  ) ],
    'mu' => [ qw(
  Indian/Mauritius
  ) ],
    'mv' => [ qw(
  Indian/Maldives
  ) ],
    'mw' => [ qw(
  Africa/Blantyre
  ) ],
    'mx' => [ qw(
  America/Mexico_City
  America/Cancun
  America/Merida
  America/Monterrey
  America/Matamoros
  America/Mazatlan
  America/Chihuahua
  America/Ojinaga
  America/Hermosillo
  America/Tijuana
  America/Bahia_Banderas
  ) ],
    'my' => [ qw(
  Asia/Kuala_Lumpur
  Asia/Kuching
  ) ],
    'mz' => [ qw(
  Africa/Maputo
  ) ],
    'na' => [ qw(
  Africa/Windhoek
  ) ],
    'nc' => [ qw(
  Pacific/Noumea
  ) ],
    'ne' => [ qw(
  Africa/Niamey
  ) ],
    'nf' => [ qw(
  Pacific/Norfolk
  ) ],
    'ng' => [ qw(
  Africa/Lagos
  ) ],
    'ni' => [ qw(
  America/Managua
  ) ],
    'nl' => [ qw(
  Europe/Amsterdam
  ) ],
    'no' => [ qw(
  Europe/Oslo
  ) ],
    'np' => [ qw(
  Asia/Kathmandu
  ) ],
    'nr' => [ qw(
  Pacific/Nauru
  ) ],
    'nu' => [ qw(
  Pacific/Niue
  ) ],
    'nz' => [ qw(
  Pacific/Auckland
  Pacific/Chatham
  ) ],
    'om' => [ qw(
  Asia/Muscat
  ) ],
    'pa' => [ qw(
  America/Panama
  ) ],
    'pe' => [ qw(
  America/Lima
  ) ],
    'pf' => [ qw(
  Pacific/Tahiti
  Pacific/Marquesas
  Pacific/Gambier
  ) ],
    'pg' => [ qw(
  Pacific/Port_Moresby
  Pacific/Bougainville
  ) ],
    'ph' => [ qw(
  Asia/Manila
  ) ],
    'pk' => [ qw(
  Asia/Karachi
  ) ],
    'pl' => [ qw(
  Europe/Warsaw
  ) ],
    'pm' => [ qw(
  America/Miquelon
  ) ],
    'pn' => [ qw(
  Pacific/Pitcairn
  ) ],
    'pr' => [ qw(
  America/Puerto_Rico
  ) ],
    'ps' => [ qw(
  Asia/Gaza
  Asia/Hebron
  ) ],
    'pt' => [ qw(
  Europe/Lisbon
  Atlantic/Madeira
  Atlantic/Azores
  ) ],
    'pw' => [ qw(
  Pacific/Palau
  ) ],
    'py' => [ qw(
  America/Asuncion
  ) ],
    'qa' => [ qw(
  Asia/Qatar
  ) ],
    're' => [ qw(
  Indian/Reunion
  ) ],
    'ro' => [ qw(
  Europe/Bucharest
  ) ],
    'rs' => [ qw(
  Europe/Belgrade
  ) ],
    'ru' => [ qw(
  Europe/Kaliningrad
  Europe/Moscow
  Europe/Kirov
  Europe/Astrakhan
  Europe/Volgograd
  Europe/Saratov
  Europe/Ulyanovsk
  Europe/Samara
  Asia/Yekaterinburg
  Asia/Omsk
  Asia/Novosibirsk
  Asia/Barnaul
  Asia/Tomsk
  Asia/Novokuznetsk
  Asia/Krasnoyarsk
  Asia/Irkutsk
  Asia/Chita
  Asia/Yakutsk
  Asia/Khandyga
  Asia/Vladivostok
  Asia/Ust-Nera
  Asia/Magadan
  Asia/Sakhalin
  Asia/Srednekolymsk
  Asia/Kamchatka
  Asia/Anadyr
  ) ],
    'rw' => [ qw(
  Africa/Kigali
  ) ],
    'sa' => [ qw(
  Asia/Riyadh
  ) ],
    'sb' => [ qw(
  Pacific/Guadalcanal
  ) ],
    'sc' => [ qw(
  Indian/Mahe
  ) ],
    'sd' => [ qw(
  Africa/Khartoum
  ) ],
    'se' => [ qw(
  Europe/Stockholm
  ) ],
    'sg' => [ qw(
  Asia/Singapore
  ) ],
    'sh' => [ qw(
  Atlantic/St_Helena
  ) ],
    'si' => [ qw(
  Europe/Ljubljana
  ) ],
    'sj' => [ qw(
  Arctic/Longyearbyen
  ) ],
    'sk' => [ qw(
  Europe/Bratislava
  ) ],
    'sl' => [ qw(
  Africa/Freetown
  ) ],
    'sm' => [ qw(
  Europe/San_Marino
  ) ],
    'sn' => [ qw(
  Africa/Dakar
  ) ],
    'so' => [ qw(
  Africa/Mogadishu
  ) ],
    'sr' => [ qw(
  America/Paramaribo
  ) ],
    'ss' => [ qw(
  Africa/Juba
  ) ],
    'st' => [ qw(
  Africa/Sao_Tome
  ) ],
    'sv' => [ qw(
  America/El_Salvador
  ) ],
    'sx' => [ qw(
  America/Lower_Princes
  ) ],
    'sy' => [ qw(
  Asia/Damascus
  ) ],
    'sz' => [ qw(
  Africa/Mbabane
  ) ],
    'tc' => [ qw(
  America/Grand_Turk
  ) ],
    'td' => [ qw(
  Africa/Ndjamena
  ) ],
    'tf' => [ qw(
  Indian/Kerguelen
  ) ],
    'tg' => [ qw(
  Africa/Lome
  ) ],
    'th' => [ qw(
  Asia/Bangkok
  ) ],
    'tj' => [ qw(
  Asia/Dushanbe
  ) ],
    'tk' => [ qw(
  Pacific/Fakaofo
  ) ],
    'tl' => [ qw(
  Asia/Dili
  ) ],
    'tm' => [ qw(
  Asia/Ashgabat
  ) ],
    'tn' => [ qw(
  Africa/Tunis
  ) ],
    'to' => [ qw(
  Pacific/Tongatapu
  ) ],
    'tr' => [ qw(
  Europe/Istanbul
  ) ],
    'tt' => [ qw(
  America/Port_of_Spain
  ) ],
    'tv' => [ qw(
  Pacific/Funafuti
  ) ],
    'tw' => [ qw(
  Asia/Taipei
  ) ],
    'tz' => [ qw(
  Africa/Dar_es_Salaam
  ) ],
    'ua' => [ qw(
  Europe/Simferopol
  Europe/Kiev
  Europe/Uzhgorod
  Europe/Zaporozhye
  ) ],
    'ug' => [ qw(
  Africa/Kampala
  ) ],
    'uk' => [ qw(
  Europe/London
  ) ],
    'um' => [ qw(
  Pacific/Midway
  Pacific/Wake
  ) ],
    'us' => [ qw(
  America/New_York
  America/Detroit
  America/Kentucky/Louisville
  America/Kentucky/Monticello
  America/Indiana/Indianapolis
  America/Indiana/Vincennes
  America/Indiana/Winamac
  America/Indiana/Marengo
  America/Indiana/Petersburg
  America/Indiana/Vevay
  America/Chicago
  America/Indiana/Tell_City
  America/Indiana/Knox
  America/Menominee
  America/North_Dakota/Center
  America/North_Dakota/New_Salem
  America/North_Dakota/Beulah
  America/Denver
  America/Boise
  America/Phoenix
  America/Los_Angeles
  America/Anchorage
  America/Juneau
  America/Sitka
  America/Metlakatla
  America/Yakutat
  America/Nome
  America/Adak
  Pacific/Honolulu
  ) ],
    'uy' => [ qw(
  America/Montevideo
  ) ],
    'uz' => [ qw(
  Asia/Samarkand
  Asia/Tashkent
  ) ],
    'va' => [ qw(
  Europe/Vatican
  ) ],
    'vc' => [ qw(
  America/St_Vincent
  ) ],
    've' => [ qw(
  America/Caracas
  ) ],
    'vg' => [ qw(
  America/Tortola
  ) ],
    'vi' => [ qw(
  America/St_Thomas
  ) ],
    'vn' => [ qw(
  Asia/Ho_Chi_Minh
  ) ],
    'vu' => [ qw(
  Pacific/Efate
  ) ],
    'wf' => [ qw(
  Pacific/Wallis
  ) ],
    'ws' => [ qw(
  Pacific/Apia
  ) ],
    'ye' => [ qw(
  Asia/Aden
  ) ],
    'yt' => [ qw(
  Indian/Mayotte
  ) ],
    'za' => [ qw(
  Africa/Johannesburg
  ) ],
    'zm' => [ qw(
  Africa/Lusaka
  ) ],
    'zw' => [ qw(
  Africa/Harare
  ) ],
  
  );
  
  our %LINKS =
  (
    'AKST9AKDT' => 'America/Anchorage',
    'Africa/Addis_Ababa' => 'Africa/Nairobi',
    'Africa/Asmara' => 'Africa/Nairobi',
    'Africa/Asmera' => 'Africa/Nairobi',
    'Africa/Bamako' => 'Africa/Abidjan',
    'Africa/Bangui' => 'Africa/Lagos',
    'Africa/Banjul' => 'Africa/Abidjan',
    'Africa/Blantyre' => 'Africa/Maputo',
    'Africa/Brazzaville' => 'Africa/Lagos',
    'Africa/Bujumbura' => 'Africa/Maputo',
    'Africa/Conakry' => 'Africa/Abidjan',
    'Africa/Dakar' => 'Africa/Abidjan',
    'Africa/Dar_es_Salaam' => 'Africa/Nairobi',
    'Africa/Djibouti' => 'Africa/Nairobi',
    'Africa/Douala' => 'Africa/Lagos',
    'Africa/Freetown' => 'Africa/Abidjan',
    'Africa/Gaborone' => 'Africa/Maputo',
    'Africa/Harare' => 'Africa/Maputo',
    'Africa/Kampala' => 'Africa/Nairobi',
    'Africa/Kigali' => 'Africa/Maputo',
    'Africa/Kinshasa' => 'Africa/Lagos',
    'Africa/Libreville' => 'Africa/Lagos',
    'Africa/Lome' => 'Africa/Abidjan',
    'Africa/Luanda' => 'Africa/Lagos',
    'Africa/Lubumbashi' => 'Africa/Maputo',
    'Africa/Lusaka' => 'Africa/Maputo',
    'Africa/Malabo' => 'Africa/Lagos',
    'Africa/Maseru' => 'Africa/Johannesburg',
    'Africa/Mbabane' => 'Africa/Johannesburg',
    'Africa/Mogadishu' => 'Africa/Nairobi',
    'Africa/Niamey' => 'Africa/Lagos',
    'Africa/Nouakchott' => 'Africa/Abidjan',
    'Africa/Ouagadougou' => 'Africa/Abidjan',
    'Africa/Porto-Novo' => 'Africa/Lagos',
    'Africa/Timbuktu' => 'Africa/Abidjan',
    'America/Anguilla' => 'America/Port_of_Spain',
    'America/Antigua' => 'America/Port_of_Spain',
    'America/Argentina/ComodRivadavia' => 'America/Argentina/Catamarca',
    'America/Aruba' => 'America/Curacao',
    'America/Atka' => 'America/Adak',
    'America/Buenos_Aires' => 'America/Argentina/Buenos_Aires',
    'America/Catamarca' => 'America/Argentina/Catamarca',
    'America/Cayman' => 'America/Panama',
    'America/Coral_Harbour' => 'America/Atikokan',
    'America/Cordoba' => 'America/Argentina/Cordoba',
    'America/Dominica' => 'America/Port_of_Spain',
    'America/Ensenada' => 'America/Tijuana',
    'America/Fort_Wayne' => 'America/Indiana/Indianapolis',
    'America/Grenada' => 'America/Port_of_Spain',
    'America/Guadeloupe' => 'America/Port_of_Spain',
    'America/Indianapolis' => 'America/Indiana/Indianapolis',
    'America/Jujuy' => 'America/Argentina/Jujuy',
    'America/Knox_IN' => 'America/Indiana/Knox',
    'America/Kralendijk' => 'America/Curacao',
    'America/Louisville' => 'America/Kentucky/Louisville',
    'America/Lower_Princes' => 'America/Curacao',
    'America/Marigot' => 'America/Port_of_Spain',
    'America/Mendoza' => 'America/Argentina/Mendoza',
    'America/Montreal' => 'America/Toronto',
    'America/Montserrat' => 'America/Port_of_Spain',
    'America/Porto_Acre' => 'America/Rio_Branco',
    'America/Rosario' => 'America/Argentina/Cordoba',
    'America/Santa_Isabel' => 'America/Tijuana',
    'America/Shiprock' => 'America/Denver',
    'America/St_Barthelemy' => 'America/Port_of_Spain',
    'America/St_Kitts' => 'America/Port_of_Spain',
    'America/St_Lucia' => 'America/Port_of_Spain',
    'America/St_Thomas' => 'America/Port_of_Spain',
    'America/St_Vincent' => 'America/Port_of_Spain',
    'America/Tortola' => 'America/Port_of_Spain',
    'America/Virgin' => 'America/Port_of_Spain',
    'Antarctica/McMurdo' => 'Pacific/Auckland',
    'Antarctica/South_Pole' => 'Pacific/Auckland',
    'Arctic/Longyearbyen' => 'Europe/Oslo',
    'Asia/Aden' => 'Asia/Riyadh',
    'Asia/Ashkhabad' => 'Asia/Ashgabat',
    'Asia/Bahrain' => 'Asia/Qatar',
    'Asia/Calcutta' => 'Asia/Kolkata',
    'Asia/Chongqing' => 'Asia/Shanghai',
    'Asia/Chungking' => 'Asia/Shanghai',
    'Asia/Dacca' => 'Asia/Dhaka',
    'Asia/Harbin' => 'Asia/Shanghai',
    'Asia/Istanbul' => 'Europe/Istanbul',
    'Asia/Kashgar' => 'Asia/Urumqi',
    'Asia/Katmandu' => 'Asia/Kathmandu',
    'Asia/Kuwait' => 'Asia/Riyadh',
    'Asia/Macao' => 'Asia/Macau',
    'Asia/Muscat' => 'Asia/Dubai',
    'Asia/Phnom_Penh' => 'Asia/Bangkok',
    'Asia/Rangoon' => 'Asia/Yangon',
    'Asia/Saigon' => 'Asia/Ho_Chi_Minh',
    'Asia/Tel_Aviv' => 'Asia/Jerusalem',
    'Asia/Thimbu' => 'Asia/Thimphu',
    'Asia/Ujung_Pandang' => 'Asia/Makassar',
    'Asia/Ulan_Bator' => 'Asia/Ulaanbaatar',
    'Asia/Vientiane' => 'Asia/Bangkok',
    'Atlantic/Faeroe' => 'Atlantic/Faroe',
    'Atlantic/Jan_Mayen' => 'Europe/Oslo',
    'Atlantic/St_Helena' => 'Africa/Abidjan',
    'Australia/ACT' => 'Australia/Sydney',
    'Australia/Canberra' => 'Australia/Sydney',
    'Australia/LHI' => 'Australia/Lord_Howe',
    'Australia/NSW' => 'Australia/Sydney',
    'Australia/North' => 'Australia/Darwin',
    'Australia/Queensland' => 'Australia/Brisbane',
    'Australia/South' => 'Australia/Adelaide',
    'Australia/Tasmania' => 'Australia/Hobart',
    'Australia/Victoria' => 'Australia/Melbourne',
    'Australia/West' => 'Australia/Perth',
    'Australia/Yancowinna' => 'Australia/Broken_Hill',
    'Brazil/Acre' => 'America/Rio_Branco',
    'Brazil/DeNoronha' => 'America/Noronha',
    'Brazil/East' => 'America/Sao_Paulo',
    'Brazil/West' => 'America/Manaus',
    'Canada/Atlantic' => 'America/Halifax',
    'Canada/Central' => 'America/Winnipeg',
    'Canada/Eastern' => 'America/Toronto',
    'Canada/Mountain' => 'America/Edmonton',
    'Canada/Newfoundland' => 'America/St_Johns',
    'Canada/Pacific' => 'America/Vancouver',
    'Canada/Saskatchewan' => 'America/Regina',
    'Canada/Yukon' => 'America/Whitehorse',
    'Chile/Continental' => 'America/Santiago',
    'Chile/EasterIsland' => 'Pacific/Easter',
    'Cuba' => 'America/Havana',
    'Egypt' => 'Africa/Cairo',
    'Eire' => 'Europe/Dublin',
    'Etc/GMT' => 'UTC',
    'Etc/GMT+0' => 'UTC',
    'Etc/UCT' => 'UTC',
    'Etc/UTC' => 'UTC',
    'Etc/Universal' => 'UTC',
    'Etc/Zulu' => 'UTC',
    'Europe/Belfast' => 'Europe/London',
    'Europe/Bratislava' => 'Europe/Prague',
    'Europe/Busingen' => 'Europe/Zurich',
    'Europe/Guernsey' => 'Europe/London',
    'Europe/Isle_of_Man' => 'Europe/London',
    'Europe/Jersey' => 'Europe/London',
    'Europe/Ljubljana' => 'Europe/Belgrade',
    'Europe/Mariehamn' => 'Europe/Helsinki',
    'Europe/Nicosia' => 'Asia/Nicosia',
    'Europe/Podgorica' => 'Europe/Belgrade',
    'Europe/San_Marino' => 'Europe/Rome',
    'Europe/Sarajevo' => 'Europe/Belgrade',
    'Europe/Skopje' => 'Europe/Belgrade',
    'Europe/Tiraspol' => 'Europe/Chisinau',
    'Europe/Vaduz' => 'Europe/Zurich',
    'Europe/Vatican' => 'Europe/Rome',
    'Europe/Zagreb' => 'Europe/Belgrade',
    'GB' => 'Europe/London',
    'GB-Eire' => 'Europe/London',
    'GMT' => 'UTC',
    'GMT+0' => 'UTC',
    'GMT-0' => 'UTC',
    'GMT0' => 'UTC',
    'Greenwich' => 'UTC',
    'Hongkong' => 'Asia/Hong_Kong',
    'Iceland' => 'Atlantic/Reykjavik',
    'Indian/Antananarivo' => 'Africa/Nairobi',
    'Indian/Comoro' => 'Africa/Nairobi',
    'Indian/Mayotte' => 'Africa/Nairobi',
    'Iran' => 'Asia/Tehran',
    'Israel' => 'Asia/Jerusalem',
    'JST-9' => 'Asia/Tokyo',
    'Jamaica' => 'America/Jamaica',
    'Japan' => 'Asia/Tokyo',
    'Kwajalein' => 'Pacific/Kwajalein',
    'Libya' => 'Africa/Tripoli',
    'Mexico/BajaNorte' => 'America/Tijuana',
    'Mexico/BajaSur' => 'America/Mazatlan',
    'Mexico/General' => 'America/Mexico_City',
    'NZ' => 'Pacific/Auckland',
    'NZ-CHAT' => 'Pacific/Chatham',
    'Navajo' => 'America/Denver',
    'PRC' => 'Asia/Shanghai',
    'Pacific/Johnston' => 'Pacific/Honolulu',
    'Pacific/Midway' => 'Pacific/Pago_Pago',
    'Pacific/Ponape' => 'Pacific/Pohnpei',
    'Pacific/Saipan' => 'Pacific/Guam',
    'Pacific/Samoa' => 'Pacific/Pago_Pago',
    'Pacific/Truk' => 'Pacific/Chuuk',
    'Pacific/Yap' => 'Pacific/Chuuk',
    'Poland' => 'Europe/Warsaw',
    'Portugal' => 'Europe/Lisbon',
    'ROC' => 'Asia/Taipei',
    'ROK' => 'Asia/Seoul',
    'Singapore' => 'Asia/Singapore',
    'Turkey' => 'Europe/Istanbul',
    'UCT' => 'UTC',
    'US/Alaska' => 'America/Anchorage',
    'US/Aleutian' => 'America/Adak',
    'US/Arizona' => 'America/Phoenix',
    'US/Central' => 'America/Chicago',
    'US/East-Indiana' => 'America/Indiana/Indianapolis',
    'US/Eastern' => 'America/New_York',
    'US/Hawaii' => 'Pacific/Honolulu',
    'US/Indiana-Starke' => 'America/Indiana/Knox',
    'US/Michigan' => 'America/Detroit',
    'US/Mountain' => 'America/Denver',
    'US/Pacific' => 'America/Los_Angeles',
    'US/Pacific-New' => 'America/Los_Angeles',
    'US/Samoa' => 'Pacific/Pago_Pago',
    'Universal' => 'UTC',
    'W-SU' => 'Europe/Moscow',
    'Zulu' => 'UTC'
  )
  
  ;
  
  sub OlsonVersion { '2019b' }
  
  
  1;
  
  __END__
  
  =pod
  
  =head1 NAME
  
  DateTime::TimeZone::Catalog - Provides a list of all valid time zone names
  
  =head1 DESCRIPTION
  
  This module contains an enumerated list of all known system timezones,
  so that applications can easily present a list of timezones.
  
  =head1 AVAILABLE ZONES
  
  =head2 Zones by Continent/Region
  
  =head3 Africa
  
    Africa/Abidjan
    Africa/Accra
    Africa/Algiers
    Africa/Bissau
    Africa/Cairo
    Africa/Casablanca
    Africa/El_Aaiun
    Africa/Johannesburg
    Africa/Juba
    Africa/Khartoum
    Africa/Lagos
    Africa/Maputo
    Africa/Monrovia
    Africa/Nairobi
    Africa/Ndjamena
    Africa/Sao_Tome
    Africa/Tripoli
    Africa/Tunis
    Africa/Windhoek
    Africa/Ceuta
  
  =head3 America
  
    America/Araguaina
    America/Argentina/Buenos_Aires
    America/Argentina/Catamarca
    America/Argentina/Cordoba
    America/Argentina/Jujuy
    America/Argentina/La_Rioja
    America/Argentina/Mendoza
    America/Argentina/Rio_Gallegos
    America/Argentina/Salta
    America/Argentina/San_Juan
    America/Argentina/San_Luis
    America/Argentina/Tucuman
    America/Argentina/Ushuaia
    America/Asuncion
    America/Bahia
    America/Belem
    America/Boa_Vista
    America/Bogota
    America/Campo_Grande
    America/Caracas
    America/Cayenne
    America/Cuiaba
    America/Curacao
    America/Eirunepe
    America/Fortaleza
    America/Guayaquil
    America/Guyana
    America/La_Paz
    America/Lima
    America/Maceio
    America/Manaus
    America/Montevideo
    America/Noronha
    America/Paramaribo
    America/Port_of_Spain
    America/Porto_Velho
    America/Punta_Arenas
    America/Recife
    America/Rio_Branco
    America/Santarem
    America/Santiago
    America/Sao_Paulo
    America/Danmarkshavn
    America/Godthab
    America/Scoresbysund
    America/Thule
    America/Adak
    America/Anchorage
    America/Atikokan
    America/Bahia_Banderas
    America/Barbados
    America/Belize
    America/Blanc-Sablon
    America/Boise
    America/Cambridge_Bay
    America/Cancun
    America/Chicago
    America/Chihuahua
    America/Costa_Rica
    America/Creston
    America/Dawson
    America/Dawson_Creek
    America/Denver
    America/Detroit
    America/Edmonton
    America/El_Salvador
    America/Fort_Nelson
    America/Glace_Bay
    America/Goose_Bay
    America/Grand_Turk
    America/Guatemala
    America/Halifax
    America/Havana
    America/Hermosillo
    America/Indiana/Indianapolis
    America/Indiana/Knox
    America/Indiana/Marengo
    America/Indiana/Petersburg
    America/Indiana/Tell_City
    America/Indiana/Vevay
    America/Indiana/Vincennes
    America/Indiana/Winamac
    America/Inuvik
    America/Iqaluit
    America/Jamaica
    America/Juneau
    America/Kentucky/Louisville
    America/Kentucky/Monticello
    America/Los_Angeles
    America/Managua
    America/Martinique
    America/Matamoros
    America/Mazatlan
    America/Menominee
    America/Merida
    America/Metlakatla
    America/Mexico_City
    America/Miquelon
    America/Moncton
    America/Monterrey
    America/Nassau
    America/New_York
    America/Nipigon
    America/Nome
    America/North_Dakota/Beulah
    America/North_Dakota/Center
    America/North_Dakota/New_Salem
    America/Ojinaga
    America/Panama
    America/Pangnirtung
    America/Phoenix
    America/Port-au-Prince
    America/Puerto_Rico
    America/Rainy_River
    America/Rankin_Inlet
    America/Regina
    America/Resolute
    America/Santo_Domingo
    America/Sitka
    America/St_Johns
    America/Swift_Current
    America/Tegucigalpa
    America/Thunder_Bay
    America/Tijuana
    America/Toronto
    America/Vancouver
    America/Whitehorse
    America/Winnipeg
    America/Yakutat
    America/Yellowknife
  
  =head3 Antarctica
  
    Antarctica/Casey
    Antarctica/Davis
    Antarctica/DumontDUrville
    Antarctica/Mawson
    Antarctica/Rothera
    Antarctica/Syowa
    Antarctica/Troll
    Antarctica/Vostok
    Antarctica/Macquarie
    Antarctica/Palmer
  
  =head3 Asia
  
    Asia/Almaty
    Asia/Amman
    Asia/Aqtau
    Asia/Aqtobe
    Asia/Ashgabat
    Asia/Atyrau
    Asia/Baghdad
    Asia/Baku
    Asia/Bangkok
    Asia/Beirut
    Asia/Bishkek
    Asia/Brunei
    Asia/Choibalsan
    Asia/Colombo
    Asia/Damascus
    Asia/Dhaka
    Asia/Dili
    Asia/Dubai
    Asia/Dushanbe
    Asia/Famagusta
    Asia/Gaza
    Asia/Hebron
    Asia/Ho_Chi_Minh
    Asia/Hong_Kong
    Asia/Hovd
    Asia/Jakarta
    Asia/Jayapura
    Asia/Jerusalem
    Asia/Kabul
    Asia/Karachi
    Asia/Kathmandu
    Asia/Kolkata
    Asia/Kuala_Lumpur
    Asia/Kuching
    Asia/Macau
    Asia/Makassar
    Asia/Manila
    Asia/Nicosia
    Asia/Oral
    Asia/Pontianak
    Asia/Pyongyang
    Asia/Qatar
    Asia/Qostanay
    Asia/Qyzylorda
    Asia/Riyadh
    Asia/Samarkand
    Asia/Seoul
    Asia/Shanghai
    Asia/Singapore
    Asia/Taipei
    Asia/Tashkent
    Asia/Tbilisi
    Asia/Tehran
    Asia/Thimphu
    Asia/Tokyo
    Asia/Ulaanbaatar
    Asia/Urumqi
    Asia/Yangon
    Asia/Yerevan
    Asia/Anadyr
    Asia/Barnaul
    Asia/Chita
    Asia/Irkutsk
    Asia/Kamchatka
    Asia/Khandyga
    Asia/Krasnoyarsk
    Asia/Magadan
    Asia/Novokuznetsk
    Asia/Novosibirsk
    Asia/Omsk
    Asia/Sakhalin
    Asia/Srednekolymsk
    Asia/Tomsk
    Asia/Ust-Nera
    Asia/Vladivostok
    Asia/Yakutsk
    Asia/Yekaterinburg
  
  =head3 Atlantic
  
    Atlantic/Cape_Verde
    Atlantic/South_Georgia
    Atlantic/Stanley
    Atlantic/Azores
    Atlantic/Canary
    Atlantic/Faroe
    Atlantic/Madeira
    Atlantic/Reykjavik
    Atlantic/Bermuda
  
  =head3 Australia
  
    Australia/Adelaide
    Australia/Brisbane
    Australia/Broken_Hill
    Australia/Currie
    Australia/Darwin
    Australia/Eucla
    Australia/Hobart
    Australia/Lindeman
    Australia/Lord_Howe
    Australia/Melbourne
    Australia/Perth
    Australia/Sydney
  
  =head3 Europe
  
    Europe/Amsterdam
    Europe/Andorra
    Europe/Astrakhan
    Europe/Athens
    Europe/Belgrade
    Europe/Berlin
    Europe/Brussels
    Europe/Bucharest
    Europe/Budapest
    Europe/Chisinau
    Europe/Copenhagen
    Europe/Dublin
    Europe/Gibraltar
    Europe/Helsinki
    Europe/Istanbul
    Europe/Kaliningrad
    Europe/Kiev
    Europe/Kirov
    Europe/Lisbon
    Europe/London
    Europe/Luxembourg
    Europe/Madrid
    Europe/Malta
    Europe/Minsk
    Europe/Monaco
    Europe/Moscow
    Europe/Oslo
    Europe/Paris
    Europe/Prague
    Europe/Riga
    Europe/Rome
    Europe/Samara
    Europe/Saratov
    Europe/Simferopol
    Europe/Sofia
    Europe/Stockholm
    Europe/Tallinn
    Europe/Tirane
    Europe/Ulyanovsk
    Europe/Uzhgorod
    Europe/Vienna
    Europe/Vilnius
    Europe/Volgograd
    Europe/Warsaw
    Europe/Zaporozhye
    Europe/Zurich
  
  =head3 Indian
  
    Indian/Kerguelen
    Indian/Mahe
    Indian/Mauritius
    Indian/Reunion
    Indian/Christmas
    Indian/Cocos
    Indian/Chagos
    Indian/Maldives
  
  =head3 Pacific
  
    Pacific/Apia
    Pacific/Auckland
    Pacific/Bougainville
    Pacific/Chatham
    Pacific/Chuuk
    Pacific/Efate
    Pacific/Enderbury
    Pacific/Fakaofo
    Pacific/Fiji
    Pacific/Funafuti
    Pacific/Gambier
    Pacific/Guadalcanal
    Pacific/Guam
    Pacific/Kiritimati
    Pacific/Kosrae
    Pacific/Kwajalein
    Pacific/Majuro
    Pacific/Marquesas
    Pacific/Nauru
    Pacific/Niue
    Pacific/Norfolk
    Pacific/Noumea
    Pacific/Pago_Pago
    Pacific/Palau
    Pacific/Pitcairn
    Pacific/Pohnpei
    Pacific/Port_Moresby
    Pacific/Rarotonga
    Pacific/Tahiti
    Pacific/Tarawa
    Pacific/Tongatapu
    Pacific/Wake
    Pacific/Wallis
    Pacific/Easter
    Pacific/Galapagos
    Pacific/Honolulu
  
  =head2 Zones by Country
  
  =head3 Afghanistan (AF)
  
    Asia/Kabul
  
  =head3 Aland Islands (AX)
  
    Europe/Mariehamn
  
  =head3 Albania (AL)
  
    Europe/Tirane
  
  =head3 Algeria (DZ)
  
    Africa/Algiers
  
  =head3 American Samoa (AS)
  
    Pacific/Pago_Pago
  
  =head3 Andorra (AD)
  
    Europe/Andorra
  
  =head3 Angola (AO)
  
    Africa/Luanda
  
  =head3 Anguilla (AI)
  
    America/Anguilla
  
  =head3 Antarctica (AQ)
  
    Antarctica/McMurdo - New Zealand time - McMurdo, South Pole
    Antarctica/Casey - Casey
    Antarctica/Davis - Davis
    Antarctica/DumontDUrville - Dumont-d'Urville
    Antarctica/Mawson - Mawson
    Antarctica/Palmer - Palmer
    Antarctica/Rothera - Rothera
    Antarctica/Syowa - Syowa
    Antarctica/Troll - Troll
    Antarctica/Vostok - Vostok
  
  =head3 Antigua and Barbuda (AG)
  
    America/Antigua
  
  =head3 Argentina (AR)
  
    America/Argentina/Buenos_Aires - Buenos Aires (BA, CF)
    America/Argentina/Cordoba - Argentina (most areas: CB, CC, CN, ER, FM, MN, SE, SF)
    America/Argentina/Salta - Salta (SA, LP, NQ, RN)
    America/Argentina/Jujuy - Jujuy (JY)
    America/Argentina/Tucuman - Tucuman (TM)
    America/Argentina/Catamarca - Catamarca (CT); Chubut (CH)
    America/Argentina/La_Rioja - La Rioja (LR)
    America/Argentina/San_Juan - San Juan (SJ)
    America/Argentina/Mendoza - Mendoza (MZ)
    America/Argentina/San_Luis - San Luis (SL)
    America/Argentina/Rio_Gallegos - Santa Cruz (SC)
    America/Argentina/Ushuaia - Tierra del Fuego (TF)
  
  =head3 Armenia (AM)
  
    Asia/Yerevan
  
  =head3 Aruba (AW)
  
    America/Aruba
  
  =head3 Australia (AU)
  
    Australia/Lord_Howe - Lord Howe Island
    Antarctica/Macquarie - Macquarie Island
    Australia/Hobart - Tasmania (most areas)
    Australia/Currie - Tasmania (King Island)
    Australia/Melbourne - Victoria
    Australia/Sydney - New South Wales (most areas)
    Australia/Broken_Hill - New South Wales (Yancowinna)
    Australia/Brisbane - Queensland (most areas)
    Australia/Lindeman - Queensland (Whitsunday Islands)
    Australia/Adelaide - South Australia
    Australia/Darwin - Northern Territory
    Australia/Perth - Western Australia (most areas)
    Australia/Eucla - Western Australia (Eucla)
  
  =head3 Austria (AT)
  
    Europe/Vienna
  
  =head3 Azerbaijan (AZ)
  
    Asia/Baku
  
  =head3 Bahamas (BS)
  
    America/Nassau
  
  =head3 Bahrain (BH)
  
    Asia/Bahrain
  
  =head3 Bangladesh (BD)
  
    Asia/Dhaka
  
  =head3 Barbados (BB)
  
    America/Barbados
  
  =head3 Belarus (BY)
  
    Europe/Minsk
  
  =head3 Belgium (BE)
  
    Europe/Brussels
  
  =head3 Belize (BZ)
  
    America/Belize
  
  =head3 Benin (BJ)
  
    Africa/Porto-Novo
  
  =head3 Bermuda (BM)
  
    Atlantic/Bermuda
  
  =head3 Bhutan (BT)
  
    Asia/Thimphu
  
  =head3 Bolivia (Plurinational State of) (BO)
  
    America/La_Paz
  
  =head3 Bonaire, Sint Eustatius and Saba (BQ)
  
    America/Kralendijk
  
  =head3 Bosnia and Herzegovina (BA)
  
    Europe/Sarajevo
  
  =head3 Botswana (BW)
  
    Africa/Gaborone
  
  =head3 Brazil (BR)
  
    America/Noronha - Atlantic islands
    America/Belem - Para (east); Amapa
    America/Fortaleza - Brazil (northeast: MA, PI, CE, RN, PB)
    America/Recife - Pernambuco
    America/Araguaina - Tocantins
    America/Maceio - Alagoas, Sergipe
    America/Bahia - Bahia
    America/Sao_Paulo - Brazil (southeast: GO, DF, MG, ES, RJ, SP, PR, SC, RS)
    America/Campo_Grande - Mato Grosso do Sul
    America/Cuiaba - Mato Grosso
    America/Santarem - Para (west)
    America/Porto_Velho - Rondonia
    America/Boa_Vista - Roraima
    America/Manaus - Amazonas (east)
    America/Eirunepe - Amazonas (west)
    America/Rio_Branco - Acre
  
  =head3 British Indian Ocean Territory (IO)
  
    Indian/Chagos
  
  =head3 Brunei Darussalam (BN)
  
    Asia/Brunei
  
  =head3 Bulgaria (BG)
  
    Europe/Sofia
  
  =head3 Burkina Faso (BF)
  
    Africa/Ouagadougou
  
  =head3 Burundi (BI)
  
    Africa/Bujumbura
  
  =head3 Cabo Verde (CV)
  
    Atlantic/Cape_Verde
  
  =head3 Cambodia (KH)
  
    Asia/Phnom_Penh
  
  =head3 Cameroon (CM)
  
    Africa/Douala
  
  =head3 Canada (CA)
  
    America/St_Johns - Newfoundland; Labrador (southeast)
    America/Halifax - Atlantic - NS (most areas); PE
    America/Glace_Bay - Atlantic - NS (Cape Breton)
    America/Moncton - Atlantic - New Brunswick
    America/Goose_Bay - Atlantic - Labrador (most areas)
    America/Blanc-Sablon - AST - QC (Lower North Shore)
    America/Toronto - Eastern - ON, QC (most areas)
    America/Nipigon - Eastern - ON, QC (no DST 1967-73)
    America/Thunder_Bay - Eastern - ON (Thunder Bay)
    America/Iqaluit - Eastern - NU (most east areas)
    America/Pangnirtung - Eastern - NU (Pangnirtung)
    America/Atikokan - EST - ON (Atikokan); NU (Coral H)
    America/Winnipeg - Central - ON (west); Manitoba
    America/Rainy_River - Central - ON (Rainy R, Ft Frances)
    America/Resolute - Central - NU (Resolute)
    America/Rankin_Inlet - Central - NU (central)
    America/Regina - CST - SK (most areas)
    America/Swift_Current - CST - SK (midwest)
    America/Edmonton - Mountain - AB; BC (E); SK (W)
    America/Cambridge_Bay - Mountain - NU (west)
    America/Yellowknife - Mountain - NT (central)
    America/Inuvik - Mountain - NT (west)
    America/Creston - MST - BC (Creston)
    America/Dawson_Creek - MST - BC (Dawson Cr, Ft St John)
    America/Fort_Nelson - MST - BC (Ft Nelson)
    America/Vancouver - Pacific - BC (most areas)
    America/Whitehorse - Pacific - Yukon (south)
    America/Dawson - Pacific - Yukon (north)
  
  =head3 Cayman Islands (KY)
  
    America/Cayman
  
  =head3 Central African Republic (CF)
  
    Africa/Bangui
  
  =head3 Chad (TD)
  
    Africa/Ndjamena
  
  =head3 Chile (CL)
  
    America/Santiago - Chile (most areas)
    America/Punta_Arenas - Region of Magallanes
    Pacific/Easter - Easter Island
  
  =head3 China (CN)
  
    Asia/Shanghai - Beijing Time
    Asia/Urumqi - Xinjiang Time
  
  =head3 Christmas Island (CX)
  
    Indian/Christmas
  
  =head3 Cocos (Keeling) Islands (CC)
  
    Indian/Cocos
  
  =head3 Colombia (CO)
  
    America/Bogota
  
  =head3 Comoros (KM)
  
    Indian/Comoro
  
  =head3 Congo (CG)
  
    Africa/Brazzaville
  
  =head3 Congo (The Democratic Republic of the) (CD)
  
    Africa/Kinshasa - Dem. Rep. of Congo (west)
    Africa/Lubumbashi - Dem. Rep. of Congo (east)
  
  =head3 Cook Islands (CK)
  
    Pacific/Rarotonga
  
  =head3 Costa Rica (CR)
  
    America/Costa_Rica
  
  =head3 Cote d'Ivoire (CI)
  
    Africa/Abidjan
  
  =head3 Croatia (HR)
  
    Europe/Zagreb
  
  =head3 Cuba (CU)
  
    America/Havana
  
  =head3 Curacao (CW)
  
    America/Curacao
  
  =head3 Cyprus (CY)
  
    Asia/Nicosia - Cyprus (most areas)
    Asia/Famagusta - Northern Cyprus
  
  =head3 Czechia (CZ)
  
    Europe/Prague
  
  =head3 Denmark (DK)
  
    Europe/Copenhagen
  
  =head3 Djibouti (DJ)
  
    Africa/Djibouti
  
  =head3 Dominica (DM)
  
    America/Dominica
  
  =head3 Dominican Republic (DO)
  
    America/Santo_Domingo
  
  =head3 Ecuador (EC)
  
    America/Guayaquil - Ecuador (mainland)
    Pacific/Galapagos - Galapagos Islands
  
  =head3 Egypt (EG)
  
    Africa/Cairo
  
  =head3 El Salvador (SV)
  
    America/El_Salvador
  
  =head3 Equatorial Guinea (GQ)
  
    Africa/Malabo
  
  =head3 Eritrea (ER)
  
    Africa/Asmara
  
  =head3 Estonia (EE)
  
    Europe/Tallinn
  
  =head3 Eswatini (SZ)
  
    Africa/Mbabane
  
  =head3 Ethiopia (ET)
  
    Africa/Addis_Ababa
  
  =head3 Falkland Islands (The) [Malvinas] (FK)
  
    Atlantic/Stanley
  
  =head3 Faroe Islands (FO)
  
    Atlantic/Faroe
  
  =head3 Fiji (FJ)
  
    Pacific/Fiji
  
  =head3 Finland (FI)
  
    Europe/Helsinki
  
  =head3 France (FR)
  
    Europe/Paris
  
  =head3 French Guiana (GF)
  
    America/Cayenne
  
  =head3 French Polynesia (PF)
  
    Pacific/Tahiti - Society Islands
    Pacific/Marquesas - Marquesas Islands
    Pacific/Gambier - Gambier Islands
  
  =head3 French Southern Territories (TF)
  
    Indian/Kerguelen
  
  =head3 Gabon (GA)
  
    Africa/Libreville
  
  =head3 Gambia (GM)
  
    Africa/Banjul
  
  =head3 Georgia (GE)
  
    Asia/Tbilisi
  
  =head3 Germany (DE)
  
    Europe/Berlin - Germany (most areas)
    Europe/Busingen - Busingen
  
  =head3 Ghana (GH)
  
    Africa/Accra
  
  =head3 Gibraltar (GI)
  
    Europe/Gibraltar
  
  =head3 Greece (GR)
  
    Europe/Athens
  
  =head3 Greenland (GL)
  
    America/Godthab - Greenland (most areas)
    America/Danmarkshavn - National Park (east coast)
    America/Scoresbysund - Scoresbysund/Ittoqqortoormiit
    America/Thule - Thule/Pituffik
  
  =head3 Grenada (GD)
  
    America/Grenada
  
  =head3 Guadeloupe (GP)
  
    America/Guadeloupe
  
  =head3 Guam (GU)
  
    Pacific/Guam
  
  =head3 Guatemala (GT)
  
    America/Guatemala
  
  =head3 Guernsey (GG)
  
    Europe/Guernsey
  
  =head3 Guinea (GN)
  
    Africa/Conakry
  
  =head3 Guinea-Bissau (GW)
  
    Africa/Bissau
  
  =head3 Guyana (GY)
  
    America/Guyana
  
  =head3 Haiti (HT)
  
    America/Port-au-Prince
  
  =head3 Holy See (VA)
  
    Europe/Vatican
  
  =head3 Honduras (HN)
  
    America/Tegucigalpa
  
  =head3 Hong Kong (HK)
  
    Asia/Hong_Kong
  
  =head3 Hungary (HU)
  
    Europe/Budapest
  
  =head3 Iceland (IS)
  
    Atlantic/Reykjavik
  
  =head3 India (IN)
  
    Asia/Kolkata
  
  =head3 Indonesia (ID)
  
    Asia/Jakarta - Java, Sumatra
    Asia/Pontianak - Borneo (west, central)
    Asia/Makassar - Borneo (east, south); Sulawesi/Celebes, Bali, Nusa Tengarra; Timor (west)
    Asia/Jayapura - New Guinea (West Papua / Irian Jaya); Malukus/Moluccas
  
  =head3 Iran (Islamic Republic of) (IR)
  
    Asia/Tehran
  
  =head3 Iraq (IQ)
  
    Asia/Baghdad
  
  =head3 Ireland (IE)
  
    Europe/Dublin
  
  =head3 Isle of Man (IM)
  
    Europe/Isle_of_Man
  
  =head3 Israel (IL)
  
    Asia/Jerusalem
  
  =head3 Italy (IT)
  
    Europe/Rome
  
  =head3 Jamaica (JM)
  
    America/Jamaica
  
  =head3 Japan (JP)
  
    Asia/Tokyo
  
  =head3 Jersey (JE)
  
    Europe/Jersey
  
  =head3 Jordan (JO)
  
    Asia/Amman
  
  =head3 Kazakhstan (KZ)
  
    Asia/Almaty - Kazakhstan (most areas)
    Asia/Qyzylorda - Qyzylorda/Kyzylorda/Kzyl-Orda
    Asia/Qostanay - Qostanay/Kostanay/Kustanay
    Asia/Aqtobe - Aqtobe/Aktobe
    Asia/Aqtau - Mangghystau/Mankistau
    Asia/Atyrau - Atyrau/Atirau/Gur'yev
    Asia/Oral - West Kazakhstan
  
  =head3 Kenya (KE)
  
    Africa/Nairobi
  
  =head3 Kiribati (KI)
  
    Pacific/Tarawa - Gilbert Islands
    Pacific/Enderbury - Phoenix Islands
    Pacific/Kiritimati - Line Islands
  
  =head3 Korea, The Democratic People's Republic of (KP)
  
    Asia/Pyongyang
  
  =head3 Korea, The Republic of (KR)
  
    Asia/Seoul
  
  =head3 Kuwait (KW)
  
    Asia/Kuwait
  
  =head3 Kyrgyzstan (KG)
  
    Asia/Bishkek
  
  =head3 Lao People's Democratic Republic (LA)
  
    Asia/Vientiane
  
  =head3 Latvia (LV)
  
    Europe/Riga
  
  =head3 Lebanon (LB)
  
    Asia/Beirut
  
  =head3 Lesotho (LS)
  
    Africa/Maseru
  
  =head3 Liberia (LR)
  
    Africa/Monrovia
  
  =head3 Libya (LY)
  
    Africa/Tripoli
  
  =head3 Liechtenstein (LI)
  
    Europe/Vaduz
  
  =head3 Lithuania (LT)
  
    Europe/Vilnius
  
  =head3 Luxembourg (LU)
  
    Europe/Luxembourg
  
  =head3 Macao (MO)
  
    Asia/Macau
  
  =head3 Macedonia, The former Yugoslav Republic of (MK)
  
    Europe/Skopje
  
  =head3 Madagascar (MG)
  
    Indian/Antananarivo
  
  =head3 Malawi (MW)
  
    Africa/Blantyre
  
  =head3 Malaysia (MY)
  
    Asia/Kuala_Lumpur - Malaysia (peninsula)
    Asia/Kuching - Sabah, Sarawak
  
  =head3 Maldives (MV)
  
    Indian/Maldives
  
  =head3 Mali (ML)
  
    Africa/Bamako
  
  =head3 Malta (MT)
  
    Europe/Malta
  
  =head3 Marshall Islands (MH)
  
    Pacific/Majuro - Marshall Islands (most areas)
    Pacific/Kwajalein - Kwajalein
  
  =head3 Martinique (MQ)
  
    America/Martinique
  
  =head3 Mauritania (MR)
  
    Africa/Nouakchott
  
  =head3 Mauritius (MU)
  
    Indian/Mauritius
  
  =head3 Mayotte (YT)
  
    Indian/Mayotte
  
  =head3 Mexico (MX)
  
    America/Mexico_City - Central Time
    America/Cancun - Eastern Standard Time - Quintana Roo
    America/Merida - Central Time - Campeche, Yucatan
    America/Monterrey - Central Time - Durango; Coahuila, Nuevo Leon, Tamaulipas (most areas)
    America/Matamoros - Central Time US - Coahuila, Nuevo Leon, Tamaulipas (US border)
    America/Mazatlan - Mountain Time - Baja California Sur, Nayarit, Sinaloa
    America/Chihuahua - Mountain Time - Chihuahua (most areas)
    America/Ojinaga - Mountain Time US - Chihuahua (US border)
    America/Hermosillo - Mountain Standard Time - Sonora
    America/Tijuana - Pacific Time US - Baja California
    America/Bahia_Banderas - Central Time - Bahia de Banderas
  
  =head3 Micronesia (Federated States of) (FM)
  
    Pacific/Chuuk - Chuuk/Truk, Yap
    Pacific/Pohnpei - Pohnpei/Ponape
    Pacific/Kosrae - Kosrae
  
  =head3 Moldova, The Republic of (MD)
  
    Europe/Chisinau
  
  =head3 Monaco (MC)
  
    Europe/Monaco
  
  =head3 Mongolia (MN)
  
    Asia/Ulaanbaatar - Mongolia (most areas)
    Asia/Hovd - Bayan-Olgiy, Govi-Altai, Hovd, Uvs, Zavkhan
    Asia/Choibalsan - Dornod, Sukhbaatar
  
  =head3 Montenegro (ME)
  
    Europe/Podgorica
  
  =head3 Montserrat (MS)
  
    America/Montserrat
  
  =head3 Morocco (MA)
  
    Africa/Casablanca
  
  =head3 Mozambique (MZ)
  
    Africa/Maputo
  
  =head3 Myanmar (MM)
  
    Asia/Yangon
  
  =head3 Namibia (NA)
  
    Africa/Windhoek
  
  =head3 Nauru (NR)
  
    Pacific/Nauru
  
  =head3 Nepal (NP)
  
    Asia/Kathmandu
  
  =head3 Netherlands (NL)
  
    Europe/Amsterdam
  
  =head3 New Caledonia (NC)
  
    Pacific/Noumea
  
  =head3 New Zealand (NZ)
  
    Pacific/Auckland - New Zealand (most areas)
    Pacific/Chatham - Chatham Islands
  
  =head3 Nicaragua (NI)
  
    America/Managua
  
  =head3 Niger (NE)
  
    Africa/Niamey
  
  =head3 Nigeria (NG)
  
    Africa/Lagos
  
  =head3 Niue (NU)
  
    Pacific/Niue
  
  =head3 Norfolk Island (NF)
  
    Pacific/Norfolk
  
  =head3 Northern Mariana Islands (MP)
  
    Pacific/Saipan
  
  =head3 Norway (NO)
  
    Europe/Oslo
  
  =head3 Oman (OM)
  
    Asia/Muscat
  
  =head3 Pakistan (PK)
  
    Asia/Karachi
  
  =head3 Palau (PW)
  
    Pacific/Palau
  
  =head3 Palestine, State of (PS)
  
    Asia/Gaza - Gaza Strip
    Asia/Hebron - West Bank
  
  =head3 Panama (PA)
  
    America/Panama
  
  =head3 Papua New Guinea (PG)
  
    Pacific/Port_Moresby - Papua New Guinea (most areas)
    Pacific/Bougainville - Bougainville
  
  =head3 Paraguay (PY)
  
    America/Asuncion
  
  =head3 Peru (PE)
  
    America/Lima
  
  =head3 Philippines (PH)
  
    Asia/Manila
  
  =head3 Pitcairn (PN)
  
    Pacific/Pitcairn
  
  =head3 Poland (PL)
  
    Europe/Warsaw
  
  =head3 Portugal (PT)
  
    Europe/Lisbon - Portugal (mainland)
    Atlantic/Madeira - Madeira Islands
    Atlantic/Azores - Azores
  
  =head3 Puerto Rico (PR)
  
    America/Puerto_Rico
  
  =head3 Qatar (QA)
  
    Asia/Qatar
  
  =head3 Reunion (RE)
  
    Indian/Reunion
  
  =head3 Romania (RO)
  
    Europe/Bucharest
  
  =head3 Russian Federation (RU)
  
    Europe/Kaliningrad - MSK-01 - Kaliningrad
    Europe/Moscow - MSK+00 - Moscow area
    Europe/Kirov - MSK+00 - Kirov
    Europe/Astrakhan - MSK+01 - Astrakhan
    Europe/Volgograd - MSK+01 - Volgograd
    Europe/Saratov - MSK+01 - Saratov
    Europe/Ulyanovsk - MSK+01 - Ulyanovsk
    Europe/Samara - MSK+01 - Samara, Udmurtia
    Asia/Yekaterinburg - MSK+02 - Urals
    Asia/Omsk - MSK+03 - Omsk
    Asia/Novosibirsk - MSK+04 - Novosibirsk
    Asia/Barnaul - MSK+04 - Altai
    Asia/Tomsk - MSK+04 - Tomsk
    Asia/Novokuznetsk - MSK+04 - Kemerovo
    Asia/Krasnoyarsk - MSK+04 - Krasnoyarsk area
    Asia/Irkutsk - MSK+05 - Irkutsk, Buryatia
    Asia/Chita - MSK+06 - Zabaykalsky
    Asia/Yakutsk - MSK+06 - Lena River
    Asia/Khandyga - MSK+06 - Tomponsky, Ust-Maysky
    Asia/Vladivostok - MSK+07 - Amur River
    Asia/Ust-Nera - MSK+07 - Oymyakonsky
    Asia/Magadan - MSK+08 - Magadan
    Asia/Sakhalin - MSK+08 - Sakhalin Island
    Asia/Srednekolymsk - MSK+08 - Sakha (E); North Kuril Is
    Asia/Kamchatka - MSK+09 - Kamchatka
    Asia/Anadyr - MSK+09 - Bering Sea
  
  =head3 Rwanda (RW)
  
    Africa/Kigali
  
  =head3 Saint Barthelemy (BL)
  
    America/St_Barthelemy
  
  =head3 Saint Helena, Ascension and Tristan da Cunha (SH)
  
    Atlantic/St_Helena
  
  =head3 Saint Kitts and Nevis (KN)
  
    America/St_Kitts
  
  =head3 Saint Lucia (LC)
  
    America/St_Lucia
  
  =head3 Saint Martin (French part) (MF)
  
    America/Marigot
  
  =head3 Saint Pierre and Miquelon (PM)
  
    America/Miquelon
  
  =head3 Saint Vincent and the Grenadines (VC)
  
    America/St_Vincent
  
  =head3 Samoa (WS)
  
    Pacific/Apia
  
  =head3 San Marino (SM)
  
    Europe/San_Marino
  
  =head3 Sao Tome and Principe (ST)
  
    Africa/Sao_Tome
  
  =head3 Saudi Arabia (SA)
  
    Asia/Riyadh
  
  =head3 Senegal (SN)
  
    Africa/Dakar
  
  =head3 Serbia (RS)
  
    Europe/Belgrade
  
  =head3 Seychelles (SC)
  
    Indian/Mahe
  
  =head3 Sierra Leone (SL)
  
    Africa/Freetown
  
  =head3 Singapore (SG)
  
    Asia/Singapore
  
  =head3 Sint Maarten (Dutch part) (SX)
  
    America/Lower_Princes
  
  =head3 Slovakia (SK)
  
    Europe/Bratislava
  
  =head3 Slovenia (SI)
  
    Europe/Ljubljana
  
  =head3 Solomon Islands (SB)
  
    Pacific/Guadalcanal
  
  =head3 Somalia (SO)
  
    Africa/Mogadishu
  
  =head3 South Africa (ZA)
  
    Africa/Johannesburg
  
  =head3 South Georgia and the South Sandwich Islands (GS)
  
    Atlantic/South_Georgia
  
  =head3 South Sudan (SS)
  
    Africa/Juba
  
  =head3 Spain (ES)
  
    Europe/Madrid - Spain (mainland)
    Africa/Ceuta - Ceuta, Melilla
    Atlantic/Canary - Canary Islands
  
  =head3 Sri Lanka (LK)
  
    Asia/Colombo
  
  =head3 Sudan (SD)
  
    Africa/Khartoum
  
  =head3 Suriname (SR)
  
    America/Paramaribo
  
  =head3 Svalbard and Jan Mayen (SJ)
  
    Arctic/Longyearbyen
  
  =head3 Sweden (SE)
  
    Europe/Stockholm
  
  =head3 Switzerland (CH)
  
    Europe/Zurich
  
  =head3 Syrian Arab Republic (SY)
  
    Asia/Damascus
  
  =head3 Taiwan (Province of China) (TW)
  
    Asia/Taipei
  
  =head3 Tajikistan (TJ)
  
    Asia/Dushanbe
  
  =head3 Tanzania, the United Republic of (TZ)
  
    Africa/Dar_es_Salaam
  
  =head3 Thailand (TH)
  
    Asia/Bangkok
  
  =head3 Timor-Leste (TL)
  
    Asia/Dili
  
  =head3 Togo (TG)
  
    Africa/Lome
  
  =head3 Tokelau (TK)
  
    Pacific/Fakaofo
  
  =head3 Tonga (TO)
  
    Pacific/Tongatapu
  
  =head3 Trinidad and Tobago (TT)
  
    America/Port_of_Spain
  
  =head3 Tunisia (TN)
  
    Africa/Tunis
  
  =head3 Turkey (TR)
  
    Europe/Istanbul
  
  =head3 Turkmenistan (TM)
  
    Asia/Ashgabat
  
  =head3 Turks and Caicos Islands (TC)
  
    America/Grand_Turk
  
  =head3 Tuvalu (TV)
  
    Pacific/Funafuti
  
  =head3 Uganda (UG)
  
    Africa/Kampala
  
  =head3 Ukraine (UA)
  
    Europe/Simferopol - MSK+00 - Crimea
    Europe/Kiev - Ukraine (most areas)
    Europe/Uzhgorod - Ruthenia
    Europe/Zaporozhye - Zaporozh'ye/Zaporizhia; Lugansk/Luhansk (east)
  
  =head3 United Arab Emirates (AE)
  
    Asia/Dubai
  
  =head3 United Kingdom of Great Britain and Northern Ireland (GB)
  
    Europe/London
  
  =head3 United States Minor Outlying Islands (UM)
  
    Pacific/Midway - Midway Islands
    Pacific/Wake - Wake Island
  
  =head3 United States of America (US)
  
    America/New_York - Eastern (most areas)
    America/Detroit - Eastern - MI (most areas)
    America/Kentucky/Louisville - Eastern - KY (Louisville area)
    America/Kentucky/Monticello - Eastern - KY (Wayne)
    America/Indiana/Indianapolis - Eastern - IN (most areas)
    America/Indiana/Vincennes - Eastern - IN (Da, Du, K, Mn)
    America/Indiana/Winamac - Eastern - IN (Pulaski)
    America/Indiana/Marengo - Eastern - IN (Crawford)
    America/Indiana/Petersburg - Eastern - IN (Pike)
    America/Indiana/Vevay - Eastern - IN (Switzerland)
    America/Chicago - Central (most areas)
    America/Indiana/Tell_City - Central - IN (Perry)
    America/Indiana/Knox - Central - IN (Starke)
    America/Menominee - Central - MI (Wisconsin border)
    America/North_Dakota/Center - Central - ND (Oliver)
    America/North_Dakota/New_Salem - Central - ND (Morton rural)
    America/North_Dakota/Beulah - Central - ND (Mercer)
    America/Denver - Mountain (most areas)
    America/Boise - Mountain - ID (south); OR (east)
    America/Phoenix - MST - Arizona (except Navajo)
    America/Los_Angeles - Pacific
    America/Anchorage - Alaska (most areas)
    America/Juneau - Alaska - Juneau area
    America/Sitka - Alaska - Sitka area
    America/Metlakatla - Alaska - Annette Island
    America/Yakutat - Alaska - Yakutat
    America/Nome - Alaska (west)
    America/Adak - Aleutian Islands
    Pacific/Honolulu - Hawaii
  
  =head3 Uruguay (UY)
  
    America/Montevideo
  
  =head3 Uzbekistan (UZ)
  
    Asia/Samarkand - Uzbekistan (west)
    Asia/Tashkent - Uzbekistan (east)
  
  =head3 Vanuatu (VU)
  
    Pacific/Efate
  
  =head3 Venezuela (Bolivarian Republic of) (VE)
  
    America/Caracas
  
  =head3 Viet Nam (VN)
  
    Asia/Ho_Chi_Minh
  
  =head3 Virgin Islands (British) (VG)
  
    America/Tortola
  
  =head3 Virgin Islands (U.S.) (VI)
  
    America/St_Thomas
  
  =head3 Wallis and Futuna (WF)
  
    Pacific/Wallis
  
  =head3 Western Sahara (EH)
  
    Africa/El_Aaiun
  
  =head3 Yemen (YE)
  
    Asia/Aden
  
  =head3 Zambia (ZM)
  
    Africa/Lusaka
  
  =head3 Zimbabwe (ZW)
  
    Africa/Harare
  
  =head2 Linked Zones
  
  A linked zone is an alias from one name to another.
  
    AKST9AKDT => America/Anchorage
    Africa/Addis_Ababa => Africa/Nairobi
    Africa/Asmara => Africa/Nairobi
    Africa/Asmera => Africa/Nairobi
    Africa/Bamako => Africa/Abidjan
    Africa/Bangui => Africa/Lagos
    Africa/Banjul => Africa/Abidjan
    Africa/Blantyre => Africa/Maputo
    Africa/Brazzaville => Africa/Lagos
    Africa/Bujumbura => Africa/Maputo
    Africa/Conakry => Africa/Abidjan
    Africa/Dakar => Africa/Abidjan
    Africa/Dar_es_Salaam => Africa/Nairobi
    Africa/Djibouti => Africa/Nairobi
    Africa/Douala => Africa/Lagos
    Africa/Freetown => Africa/Abidjan
    Africa/Gaborone => Africa/Maputo
    Africa/Harare => Africa/Maputo
    Africa/Kampala => Africa/Nairobi
    Africa/Kigali => Africa/Maputo
    Africa/Kinshasa => Africa/Lagos
    Africa/Libreville => Africa/Lagos
    Africa/Lome => Africa/Abidjan
    Africa/Luanda => Africa/Lagos
    Africa/Lubumbashi => Africa/Maputo
    Africa/Lusaka => Africa/Maputo
    Africa/Malabo => Africa/Lagos
    Africa/Maseru => Africa/Johannesburg
    Africa/Mbabane => Africa/Johannesburg
    Africa/Mogadishu => Africa/Nairobi
    Africa/Niamey => Africa/Lagos
    Africa/Nouakchott => Africa/Abidjan
    Africa/Ouagadougou => Africa/Abidjan
    Africa/Porto-Novo => Africa/Lagos
    Africa/Timbuktu => Africa/Abidjan
    America/Anguilla => America/Port_of_Spain
    America/Antigua => America/Port_of_Spain
    America/Argentina/ComodRivadavia => America/Argentina/Catamarca
    America/Aruba => America/Curacao
    America/Atka => America/Adak
    America/Buenos_Aires => America/Argentina/Buenos_Aires
    America/Catamarca => America/Argentina/Catamarca
    America/Cayman => America/Panama
    America/Coral_Harbour => America/Atikokan
    America/Cordoba => America/Argentina/Cordoba
    America/Dominica => America/Port_of_Spain
    America/Ensenada => America/Tijuana
    America/Fort_Wayne => America/Indiana/Indianapolis
    America/Grenada => America/Port_of_Spain
    America/Guadeloupe => America/Port_of_Spain
    America/Indianapolis => America/Indiana/Indianapolis
    America/Jujuy => America/Argentina/Jujuy
    America/Knox_IN => America/Indiana/Knox
    America/Kralendijk => America/Curacao
    America/Louisville => America/Kentucky/Louisville
    America/Lower_Princes => America/Curacao
    America/Marigot => America/Port_of_Spain
    America/Mendoza => America/Argentina/Mendoza
    America/Montreal => America/Toronto
    America/Montserrat => America/Port_of_Spain
    America/Porto_Acre => America/Rio_Branco
    America/Rosario => America/Argentina/Cordoba
    America/Santa_Isabel => America/Tijuana
    America/Shiprock => America/Denver
    America/St_Barthelemy => America/Port_of_Spain
    America/St_Kitts => America/Port_of_Spain
    America/St_Lucia => America/Port_of_Spain
    America/St_Thomas => America/Port_of_Spain
    America/St_Vincent => America/Port_of_Spain
    America/Tortola => America/Port_of_Spain
    America/Virgin => America/Port_of_Spain
    Antarctica/McMurdo => Pacific/Auckland
    Antarctica/South_Pole => Pacific/Auckland
    Arctic/Longyearbyen => Europe/Oslo
    Asia/Aden => Asia/Riyadh
    Asia/Ashkhabad => Asia/Ashgabat
    Asia/Bahrain => Asia/Qatar
    Asia/Calcutta => Asia/Kolkata
    Asia/Chongqing => Asia/Shanghai
    Asia/Chungking => Asia/Shanghai
    Asia/Dacca => Asia/Dhaka
    Asia/Harbin => Asia/Shanghai
    Asia/Istanbul => Europe/Istanbul
    Asia/Kashgar => Asia/Urumqi
    Asia/Katmandu => Asia/Kathmandu
    Asia/Kuwait => Asia/Riyadh
    Asia/Macao => Asia/Macau
    Asia/Muscat => Asia/Dubai
    Asia/Phnom_Penh => Asia/Bangkok
    Asia/Rangoon => Asia/Yangon
    Asia/Saigon => Asia/Ho_Chi_Minh
    Asia/Tel_Aviv => Asia/Jerusalem
    Asia/Thimbu => Asia/Thimphu
    Asia/Ujung_Pandang => Asia/Makassar
    Asia/Ulan_Bator => Asia/Ulaanbaatar
    Asia/Vientiane => Asia/Bangkok
    Atlantic/Faeroe => Atlantic/Faroe
    Atlantic/Jan_Mayen => Europe/Oslo
    Atlantic/St_Helena => Africa/Abidjan
    Australia/ACT => Australia/Sydney
    Australia/Canberra => Australia/Sydney
    Australia/LHI => Australia/Lord_Howe
    Australia/NSW => Australia/Sydney
    Australia/North => Australia/Darwin
    Australia/Queensland => Australia/Brisbane
    Australia/South => Australia/Adelaide
    Australia/Tasmania => Australia/Hobart
    Australia/Victoria => Australia/Melbourne
    Australia/West => Australia/Perth
    Australia/Yancowinna => Australia/Broken_Hill
    Brazil/Acre => America/Rio_Branco
    Brazil/DeNoronha => America/Noronha
    Brazil/East => America/Sao_Paulo
    Brazil/West => America/Manaus
    Canada/Atlantic => America/Halifax
    Canada/Central => America/Winnipeg
    Canada/Eastern => America/Toronto
    Canada/Mountain => America/Edmonton
    Canada/Newfoundland => America/St_Johns
    Canada/Pacific => America/Vancouver
    Canada/Saskatchewan => America/Regina
    Canada/Yukon => America/Whitehorse
    Chile/Continental => America/Santiago
    Chile/EasterIsland => Pacific/Easter
    Cuba => America/Havana
    Egypt => Africa/Cairo
    Eire => Europe/Dublin
    Etc/GMT => UTC
    Etc/GMT+0 => UTC
    Etc/UCT => UTC
    Etc/UTC => UTC
    Etc/Universal => UTC
    Etc/Zulu => UTC
    Europe/Belfast => Europe/London
    Europe/Bratislava => Europe/Prague
    Europe/Busingen => Europe/Zurich
    Europe/Guernsey => Europe/London
    Europe/Isle_of_Man => Europe/London
    Europe/Jersey => Europe/London
    Europe/Ljubljana => Europe/Belgrade
    Europe/Mariehamn => Europe/Helsinki
    Europe/Nicosia => Asia/Nicosia
    Europe/Podgorica => Europe/Belgrade
    Europe/San_Marino => Europe/Rome
    Europe/Sarajevo => Europe/Belgrade
    Europe/Skopje => Europe/Belgrade
    Europe/Tiraspol => Europe/Chisinau
    Europe/Vaduz => Europe/Zurich
    Europe/Vatican => Europe/Rome
    Europe/Zagreb => Europe/Belgrade
    GB => Europe/London
    GB-Eire => Europe/London
    GMT => UTC
    GMT+0 => UTC
    GMT-0 => UTC
    GMT0 => UTC
    Greenwich => UTC
    Hongkong => Asia/Hong_Kong
    Iceland => Atlantic/Reykjavik
    Indian/Antananarivo => Africa/Nairobi
    Indian/Comoro => Africa/Nairobi
    Indian/Mayotte => Africa/Nairobi
    Iran => Asia/Tehran
    Israel => Asia/Jerusalem
    JST-9 => Asia/Tokyo
    Jamaica => America/Jamaica
    Japan => Asia/Tokyo
    Kwajalein => Pacific/Kwajalein
    Libya => Africa/Tripoli
    Mexico/BajaNorte => America/Tijuana
    Mexico/BajaSur => America/Mazatlan
    Mexico/General => America/Mexico_City
    NZ => Pacific/Auckland
    NZ-CHAT => Pacific/Chatham
    Navajo => America/Denver
    PRC => Asia/Shanghai
    Pacific/Johnston => Pacific/Honolulu
    Pacific/Midway => Pacific/Pago_Pago
    Pacific/Ponape => Pacific/Pohnpei
    Pacific/Saipan => Pacific/Guam
    Pacific/Samoa => Pacific/Pago_Pago
    Pacific/Truk => Pacific/Chuuk
    Pacific/Yap => Pacific/Chuuk
    Poland => Europe/Warsaw
    Portugal => Europe/Lisbon
    ROC => Asia/Taipei
    ROK => Asia/Seoul
    Singapore => Asia/Singapore
    Turkey => Europe/Istanbul
    UCT => UTC
    US/Alaska => America/Anchorage
    US/Aleutian => America/Adak
    US/Arizona => America/Phoenix
    US/Central => America/Chicago
    US/East-Indiana => America/Indiana/Indianapolis
    US/Eastern => America/New_York
    US/Hawaii => Pacific/Honolulu
    US/Indiana-Starke => America/Indiana/Knox
    US/Michigan => America/Detroit
    US/Mountain => America/Denver
    US/Pacific => America/Los_Angeles
    US/Pacific-New => America/Los_Angeles
    US/Samoa => Pacific/Pago_Pago
    Universal => UTC
    W-SU => Europe/Moscow
    Zulu => UTC
  
  =cut
DATETIME_TIMEZONE_CATALOG

    $main::fatpacked{"DateTime/TimeZone/EET.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_EET';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::EET;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::EET::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  62364560400, #      utc_end 1977-04-03 01:00:00 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  62364567600, #    local_end 1977-04-03 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62364560400, #    utc_start 1977-04-03 01:00:00 (Sun)
  62379680400, #      utc_end 1977-09-25 01:00:00 (Sun)
  62364571200, #  local_start 1977-04-03 04:00:00 (Sun)
  62379691200, #    local_end 1977-09-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62379680400, #    utc_start 1977-09-25 01:00:00 (Sun)
  62396010000, #      utc_end 1978-04-02 01:00:00 (Sun)
  62379687600, #  local_start 1977-09-25 03:00:00 (Sun)
  62396017200, #    local_end 1978-04-02 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62396010000, #    utc_start 1978-04-02 01:00:00 (Sun)
  62411734800, #      utc_end 1978-10-01 01:00:00 (Sun)
  62396020800, #  local_start 1978-04-02 04:00:00 (Sun)
  62411745600, #    local_end 1978-10-01 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62411734800, #    utc_start 1978-10-01 01:00:00 (Sun)
  62427459600, #      utc_end 1979-04-01 01:00:00 (Sun)
  62411742000, #  local_start 1978-10-01 03:00:00 (Sun)
  62427466800, #    local_end 1979-04-01 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62427459600, #    utc_start 1979-04-01 01:00:00 (Sun)
  62443184400, #      utc_end 1979-09-30 01:00:00 (Sun)
  62427470400, #  local_start 1979-04-01 04:00:00 (Sun)
  62443195200, #    local_end 1979-09-30 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62443184400, #    utc_start 1979-09-30 01:00:00 (Sun)
  62459514000, #      utc_end 1980-04-06 01:00:00 (Sun)
  62443191600, #  local_start 1979-09-30 03:00:00 (Sun)
  62459521200, #    local_end 1980-04-06 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62459514000, #    utc_start 1980-04-06 01:00:00 (Sun)
  62474634000, #      utc_end 1980-09-28 01:00:00 (Sun)
  62459524800, #  local_start 1980-04-06 04:00:00 (Sun)
  62474644800, #    local_end 1980-09-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62474634000, #    utc_start 1980-09-28 01:00:00 (Sun)
  62490358800, #      utc_end 1981-03-29 01:00:00 (Sun)
  62474641200, #  local_start 1980-09-28 03:00:00 (Sun)
  62490366000, #    local_end 1981-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62490358800, #    utc_start 1981-03-29 01:00:00 (Sun)
  62506083600, #      utc_end 1981-09-27 01:00:00 (Sun)
  62490369600, #  local_start 1981-03-29 04:00:00 (Sun)
  62506094400, #    local_end 1981-09-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62506083600, #    utc_start 1981-09-27 01:00:00 (Sun)
  62521808400, #      utc_end 1982-03-28 01:00:00 (Sun)
  62506090800, #  local_start 1981-09-27 03:00:00 (Sun)
  62521815600, #    local_end 1982-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62521808400, #    utc_start 1982-03-28 01:00:00 (Sun)
  62537533200, #      utc_end 1982-09-26 01:00:00 (Sun)
  62521819200, #  local_start 1982-03-28 04:00:00 (Sun)
  62537544000, #    local_end 1982-09-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62537533200, #    utc_start 1982-09-26 01:00:00 (Sun)
  62553258000, #      utc_end 1983-03-27 01:00:00 (Sun)
  62537540400, #  local_start 1982-09-26 03:00:00 (Sun)
  62553265200, #    local_end 1983-03-27 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62553258000, #    utc_start 1983-03-27 01:00:00 (Sun)
  62568982800, #      utc_end 1983-09-25 01:00:00 (Sun)
  62553268800, #  local_start 1983-03-27 04:00:00 (Sun)
  62568993600, #    local_end 1983-09-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62568982800, #    utc_start 1983-09-25 01:00:00 (Sun)
  62584707600, #      utc_end 1984-03-25 01:00:00 (Sun)
  62568990000, #  local_start 1983-09-25 03:00:00 (Sun)
  62584714800, #    local_end 1984-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62584707600, #    utc_start 1984-03-25 01:00:00 (Sun)
  62601037200, #      utc_end 1984-09-30 01:00:00 (Sun)
  62584718400, #  local_start 1984-03-25 04:00:00 (Sun)
  62601048000, #    local_end 1984-09-30 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62601037200, #    utc_start 1984-09-30 01:00:00 (Sun)
  62616762000, #      utc_end 1985-03-31 01:00:00 (Sun)
  62601044400, #  local_start 1984-09-30 03:00:00 (Sun)
  62616769200, #    local_end 1985-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62616762000, #    utc_start 1985-03-31 01:00:00 (Sun)
  62632486800, #      utc_end 1985-09-29 01:00:00 (Sun)
  62616772800, #  local_start 1985-03-31 04:00:00 (Sun)
  62632497600, #    local_end 1985-09-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62632486800, #    utc_start 1985-09-29 01:00:00 (Sun)
  62648211600, #      utc_end 1986-03-30 01:00:00 (Sun)
  62632494000, #  local_start 1985-09-29 03:00:00 (Sun)
  62648218800, #    local_end 1986-03-30 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62648211600, #    utc_start 1986-03-30 01:00:00 (Sun)
  62663936400, #      utc_end 1986-09-28 01:00:00 (Sun)
  62648222400, #  local_start 1986-03-30 04:00:00 (Sun)
  62663947200, #    local_end 1986-09-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62663936400, #    utc_start 1986-09-28 01:00:00 (Sun)
  62679661200, #      utc_end 1987-03-29 01:00:00 (Sun)
  62663943600, #  local_start 1986-09-28 03:00:00 (Sun)
  62679668400, #    local_end 1987-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62679661200, #    utc_start 1987-03-29 01:00:00 (Sun)
  62695386000, #      utc_end 1987-09-27 01:00:00 (Sun)
  62679672000, #  local_start 1987-03-29 04:00:00 (Sun)
  62695396800, #    local_end 1987-09-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62695386000, #    utc_start 1987-09-27 01:00:00 (Sun)
  62711110800, #      utc_end 1988-03-27 01:00:00 (Sun)
  62695393200, #  local_start 1987-09-27 03:00:00 (Sun)
  62711118000, #    local_end 1988-03-27 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62711110800, #    utc_start 1988-03-27 01:00:00 (Sun)
  62726835600, #      utc_end 1988-09-25 01:00:00 (Sun)
  62711121600, #  local_start 1988-03-27 04:00:00 (Sun)
  62726846400, #    local_end 1988-09-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62726835600, #    utc_start 1988-09-25 01:00:00 (Sun)
  62742560400, #      utc_end 1989-03-26 01:00:00 (Sun)
  62726842800, #  local_start 1988-09-25 03:00:00 (Sun)
  62742567600, #    local_end 1989-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62742560400, #    utc_start 1989-03-26 01:00:00 (Sun)
  62758285200, #      utc_end 1989-09-24 01:00:00 (Sun)
  62742571200, #  local_start 1989-03-26 04:00:00 (Sun)
  62758296000, #    local_end 1989-09-24 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62758285200, #    utc_start 1989-09-24 01:00:00 (Sun)
  62774010000, #      utc_end 1990-03-25 01:00:00 (Sun)
  62758292400, #  local_start 1989-09-24 03:00:00 (Sun)
  62774017200, #    local_end 1990-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62774010000, #    utc_start 1990-03-25 01:00:00 (Sun)
  62790339600, #      utc_end 1990-09-30 01:00:00 (Sun)
  62774020800, #  local_start 1990-03-25 04:00:00 (Sun)
  62790350400, #    local_end 1990-09-30 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62790339600, #    utc_start 1990-09-30 01:00:00 (Sun)
  62806064400, #      utc_end 1991-03-31 01:00:00 (Sun)
  62790346800, #  local_start 1990-09-30 03:00:00 (Sun)
  62806071600, #    local_end 1991-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62806064400, #    utc_start 1991-03-31 01:00:00 (Sun)
  62821789200, #      utc_end 1991-09-29 01:00:00 (Sun)
  62806075200, #  local_start 1991-03-31 04:00:00 (Sun)
  62821800000, #    local_end 1991-09-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62821789200, #    utc_start 1991-09-29 01:00:00 (Sun)
  62837514000, #      utc_end 1992-03-29 01:00:00 (Sun)
  62821796400, #  local_start 1991-09-29 03:00:00 (Sun)
  62837521200, #    local_end 1992-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62837514000, #    utc_start 1992-03-29 01:00:00 (Sun)
  62853238800, #      utc_end 1992-09-27 01:00:00 (Sun)
  62837524800, #  local_start 1992-03-29 04:00:00 (Sun)
  62853249600, #    local_end 1992-09-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62853238800, #    utc_start 1992-09-27 01:00:00 (Sun)
  62868963600, #      utc_end 1993-03-28 01:00:00 (Sun)
  62853246000, #  local_start 1992-09-27 03:00:00 (Sun)
  62868970800, #    local_end 1993-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62868963600, #    utc_start 1993-03-28 01:00:00 (Sun)
  62884688400, #      utc_end 1993-09-26 01:00:00 (Sun)
  62868974400, #  local_start 1993-03-28 04:00:00 (Sun)
  62884699200, #    local_end 1993-09-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62884688400, #    utc_start 1993-09-26 01:00:00 (Sun)
  62900413200, #      utc_end 1994-03-27 01:00:00 (Sun)
  62884695600, #  local_start 1993-09-26 03:00:00 (Sun)
  62900420400, #    local_end 1994-03-27 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62900413200, #    utc_start 1994-03-27 01:00:00 (Sun)
  62916138000, #      utc_end 1994-09-25 01:00:00 (Sun)
  62900424000, #  local_start 1994-03-27 04:00:00 (Sun)
  62916148800, #    local_end 1994-09-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62916138000, #    utc_start 1994-09-25 01:00:00 (Sun)
  62931862800, #      utc_end 1995-03-26 01:00:00 (Sun)
  62916145200, #  local_start 1994-09-25 03:00:00 (Sun)
  62931870000, #    local_end 1995-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62931862800, #    utc_start 1995-03-26 01:00:00 (Sun)
  62947587600, #      utc_end 1995-09-24 01:00:00 (Sun)
  62931873600, #  local_start 1995-03-26 04:00:00 (Sun)
  62947598400, #    local_end 1995-09-24 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62947587600, #    utc_start 1995-09-24 01:00:00 (Sun)
  62963917200, #      utc_end 1996-03-31 01:00:00 (Sun)
  62947594800, #  local_start 1995-09-24 03:00:00 (Sun)
  62963924400, #    local_end 1996-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62963917200, #    utc_start 1996-03-31 01:00:00 (Sun)
  62982061200, #      utc_end 1996-10-27 01:00:00 (Sun)
  62963928000, #  local_start 1996-03-31 04:00:00 (Sun)
  62982072000, #    local_end 1996-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62982061200, #    utc_start 1996-10-27 01:00:00 (Sun)
  62995366800, #      utc_end 1997-03-30 01:00:00 (Sun)
  62982068400, #  local_start 1996-10-27 03:00:00 (Sun)
  62995374000, #    local_end 1997-03-30 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62995366800, #    utc_start 1997-03-30 01:00:00 (Sun)
  63013510800, #      utc_end 1997-10-26 01:00:00 (Sun)
  62995377600, #  local_start 1997-03-30 04:00:00 (Sun)
  63013521600, #    local_end 1997-10-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63013510800, #    utc_start 1997-10-26 01:00:00 (Sun)
  63026816400, #      utc_end 1998-03-29 01:00:00 (Sun)
  63013518000, #  local_start 1997-10-26 03:00:00 (Sun)
  63026823600, #    local_end 1998-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63026816400, #    utc_start 1998-03-29 01:00:00 (Sun)
  63044960400, #      utc_end 1998-10-25 01:00:00 (Sun)
  63026827200, #  local_start 1998-03-29 04:00:00 (Sun)
  63044971200, #    local_end 1998-10-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63044960400, #    utc_start 1998-10-25 01:00:00 (Sun)
  63058266000, #      utc_end 1999-03-28 01:00:00 (Sun)
  63044967600, #  local_start 1998-10-25 03:00:00 (Sun)
  63058273200, #    local_end 1999-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63058266000, #    utc_start 1999-03-28 01:00:00 (Sun)
  63077014800, #      utc_end 1999-10-31 01:00:00 (Sun)
  63058276800, #  local_start 1999-03-28 04:00:00 (Sun)
  63077025600, #    local_end 1999-10-31 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63077014800, #    utc_start 1999-10-31 01:00:00 (Sun)
  63089715600, #      utc_end 2000-03-26 01:00:00 (Sun)
  63077022000, #  local_start 1999-10-31 03:00:00 (Sun)
  63089722800, #    local_end 2000-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63089715600, #    utc_start 2000-03-26 01:00:00 (Sun)
  63108464400, #      utc_end 2000-10-29 01:00:00 (Sun)
  63089726400, #  local_start 2000-03-26 04:00:00 (Sun)
  63108475200, #    local_end 2000-10-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63108464400, #    utc_start 2000-10-29 01:00:00 (Sun)
  63121165200, #      utc_end 2001-03-25 01:00:00 (Sun)
  63108471600, #  local_start 2000-10-29 03:00:00 (Sun)
  63121172400, #    local_end 2001-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63121165200, #    utc_start 2001-03-25 01:00:00 (Sun)
  63139914000, #      utc_end 2001-10-28 01:00:00 (Sun)
  63121176000, #  local_start 2001-03-25 04:00:00 (Sun)
  63139924800, #    local_end 2001-10-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63139914000, #    utc_start 2001-10-28 01:00:00 (Sun)
  63153219600, #      utc_end 2002-03-31 01:00:00 (Sun)
  63139921200, #  local_start 2001-10-28 03:00:00 (Sun)
  63153226800, #    local_end 2002-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63153219600, #    utc_start 2002-03-31 01:00:00 (Sun)
  63171363600, #      utc_end 2002-10-27 01:00:00 (Sun)
  63153230400, #  local_start 2002-03-31 04:00:00 (Sun)
  63171374400, #    local_end 2002-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63171363600, #    utc_start 2002-10-27 01:00:00 (Sun)
  63184669200, #      utc_end 2003-03-30 01:00:00 (Sun)
  63171370800, #  local_start 2002-10-27 03:00:00 (Sun)
  63184676400, #    local_end 2003-03-30 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63184669200, #    utc_start 2003-03-30 01:00:00 (Sun)
  63202813200, #      utc_end 2003-10-26 01:00:00 (Sun)
  63184680000, #  local_start 2003-03-30 04:00:00 (Sun)
  63202824000, #    local_end 2003-10-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63202813200, #    utc_start 2003-10-26 01:00:00 (Sun)
  63216118800, #      utc_end 2004-03-28 01:00:00 (Sun)
  63202820400, #  local_start 2003-10-26 03:00:00 (Sun)
  63216126000, #    local_end 2004-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63216118800, #    utc_start 2004-03-28 01:00:00 (Sun)
  63234867600, #      utc_end 2004-10-31 01:00:00 (Sun)
  63216129600, #  local_start 2004-03-28 04:00:00 (Sun)
  63234878400, #    local_end 2004-10-31 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63234867600, #    utc_start 2004-10-31 01:00:00 (Sun)
  63247568400, #      utc_end 2005-03-27 01:00:00 (Sun)
  63234874800, #  local_start 2004-10-31 03:00:00 (Sun)
  63247575600, #    local_end 2005-03-27 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63247568400, #    utc_start 2005-03-27 01:00:00 (Sun)
  63266317200, #      utc_end 2005-10-30 01:00:00 (Sun)
  63247579200, #  local_start 2005-03-27 04:00:00 (Sun)
  63266328000, #    local_end 2005-10-30 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63266317200, #    utc_start 2005-10-30 01:00:00 (Sun)
  63279018000, #      utc_end 2006-03-26 01:00:00 (Sun)
  63266324400, #  local_start 2005-10-30 03:00:00 (Sun)
  63279025200, #    local_end 2006-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63279018000, #    utc_start 2006-03-26 01:00:00 (Sun)
  63297766800, #      utc_end 2006-10-29 01:00:00 (Sun)
  63279028800, #  local_start 2006-03-26 04:00:00 (Sun)
  63297777600, #    local_end 2006-10-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63297766800, #    utc_start 2006-10-29 01:00:00 (Sun)
  63310467600, #      utc_end 2007-03-25 01:00:00 (Sun)
  63297774000, #  local_start 2006-10-29 03:00:00 (Sun)
  63310474800, #    local_end 2007-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63310467600, #    utc_start 2007-03-25 01:00:00 (Sun)
  63329216400, #      utc_end 2007-10-28 01:00:00 (Sun)
  63310478400, #  local_start 2007-03-25 04:00:00 (Sun)
  63329227200, #    local_end 2007-10-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63329216400, #    utc_start 2007-10-28 01:00:00 (Sun)
  63342522000, #      utc_end 2008-03-30 01:00:00 (Sun)
  63329223600, #  local_start 2007-10-28 03:00:00 (Sun)
  63342529200, #    local_end 2008-03-30 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63342522000, #    utc_start 2008-03-30 01:00:00 (Sun)
  63360666000, #      utc_end 2008-10-26 01:00:00 (Sun)
  63342532800, #  local_start 2008-03-30 04:00:00 (Sun)
  63360676800, #    local_end 2008-10-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63360666000, #    utc_start 2008-10-26 01:00:00 (Sun)
  63373971600, #      utc_end 2009-03-29 01:00:00 (Sun)
  63360673200, #  local_start 2008-10-26 03:00:00 (Sun)
  63373978800, #    local_end 2009-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63373971600, #    utc_start 2009-03-29 01:00:00 (Sun)
  63392115600, #      utc_end 2009-10-25 01:00:00 (Sun)
  63373982400, #  local_start 2009-03-29 04:00:00 (Sun)
  63392126400, #    local_end 2009-10-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63392115600, #    utc_start 2009-10-25 01:00:00 (Sun)
  63405421200, #      utc_end 2010-03-28 01:00:00 (Sun)
  63392122800, #  local_start 2009-10-25 03:00:00 (Sun)
  63405428400, #    local_end 2010-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63405421200, #    utc_start 2010-03-28 01:00:00 (Sun)
  63424170000, #      utc_end 2010-10-31 01:00:00 (Sun)
  63405432000, #  local_start 2010-03-28 04:00:00 (Sun)
  63424180800, #    local_end 2010-10-31 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63424170000, #    utc_start 2010-10-31 01:00:00 (Sun)
  63436870800, #      utc_end 2011-03-27 01:00:00 (Sun)
  63424177200, #  local_start 2010-10-31 03:00:00 (Sun)
  63436878000, #    local_end 2011-03-27 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63436870800, #    utc_start 2011-03-27 01:00:00 (Sun)
  63455619600, #      utc_end 2011-10-30 01:00:00 (Sun)
  63436881600, #  local_start 2011-03-27 04:00:00 (Sun)
  63455630400, #    local_end 2011-10-30 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63455619600, #    utc_start 2011-10-30 01:00:00 (Sun)
  63468320400, #      utc_end 2012-03-25 01:00:00 (Sun)
  63455626800, #  local_start 2011-10-30 03:00:00 (Sun)
  63468327600, #    local_end 2012-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63468320400, #    utc_start 2012-03-25 01:00:00 (Sun)
  63487069200, #      utc_end 2012-10-28 01:00:00 (Sun)
  63468331200, #  local_start 2012-03-25 04:00:00 (Sun)
  63487080000, #    local_end 2012-10-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63487069200, #    utc_start 2012-10-28 01:00:00 (Sun)
  63500374800, #      utc_end 2013-03-31 01:00:00 (Sun)
  63487076400, #  local_start 2012-10-28 03:00:00 (Sun)
  63500382000, #    local_end 2013-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63500374800, #    utc_start 2013-03-31 01:00:00 (Sun)
  63518518800, #      utc_end 2013-10-27 01:00:00 (Sun)
  63500385600, #  local_start 2013-03-31 04:00:00 (Sun)
  63518529600, #    local_end 2013-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63518518800, #    utc_start 2013-10-27 01:00:00 (Sun)
  63531824400, #      utc_end 2014-03-30 01:00:00 (Sun)
  63518526000, #  local_start 2013-10-27 03:00:00 (Sun)
  63531831600, #    local_end 2014-03-30 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63531824400, #    utc_start 2014-03-30 01:00:00 (Sun)
  63549968400, #      utc_end 2014-10-26 01:00:00 (Sun)
  63531835200, #  local_start 2014-03-30 04:00:00 (Sun)
  63549979200, #    local_end 2014-10-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63549968400, #    utc_start 2014-10-26 01:00:00 (Sun)
  63563274000, #      utc_end 2015-03-29 01:00:00 (Sun)
  63549975600, #  local_start 2014-10-26 03:00:00 (Sun)
  63563281200, #    local_end 2015-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63563274000, #    utc_start 2015-03-29 01:00:00 (Sun)
  63581418000, #      utc_end 2015-10-25 01:00:00 (Sun)
  63563284800, #  local_start 2015-03-29 04:00:00 (Sun)
  63581428800, #    local_end 2015-10-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63581418000, #    utc_start 2015-10-25 01:00:00 (Sun)
  63594723600, #      utc_end 2016-03-27 01:00:00 (Sun)
  63581425200, #  local_start 2015-10-25 03:00:00 (Sun)
  63594730800, #    local_end 2016-03-27 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63594723600, #    utc_start 2016-03-27 01:00:00 (Sun)
  63613472400, #      utc_end 2016-10-30 01:00:00 (Sun)
  63594734400, #  local_start 2016-03-27 04:00:00 (Sun)
  63613483200, #    local_end 2016-10-30 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63613472400, #    utc_start 2016-10-30 01:00:00 (Sun)
  63626173200, #      utc_end 2017-03-26 01:00:00 (Sun)
  63613479600, #  local_start 2016-10-30 03:00:00 (Sun)
  63626180400, #    local_end 2017-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63626173200, #    utc_start 2017-03-26 01:00:00 (Sun)
  63644922000, #      utc_end 2017-10-29 01:00:00 (Sun)
  63626184000, #  local_start 2017-03-26 04:00:00 (Sun)
  63644932800, #    local_end 2017-10-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63644922000, #    utc_start 2017-10-29 01:00:00 (Sun)
  63657622800, #      utc_end 2018-03-25 01:00:00 (Sun)
  63644929200, #  local_start 2017-10-29 03:00:00 (Sun)
  63657630000, #    local_end 2018-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63657622800, #    utc_start 2018-03-25 01:00:00 (Sun)
  63676371600, #      utc_end 2018-10-28 01:00:00 (Sun)
  63657633600, #  local_start 2018-03-25 04:00:00 (Sun)
  63676382400, #    local_end 2018-10-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63676371600, #    utc_start 2018-10-28 01:00:00 (Sun)
  63689677200, #      utc_end 2019-03-31 01:00:00 (Sun)
  63676378800, #  local_start 2018-10-28 03:00:00 (Sun)
  63689684400, #    local_end 2019-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63689677200, #    utc_start 2019-03-31 01:00:00 (Sun)
  63707821200, #      utc_end 2019-10-27 01:00:00 (Sun)
  63689688000, #  local_start 2019-03-31 04:00:00 (Sun)
  63707832000, #    local_end 2019-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63707821200, #    utc_start 2019-10-27 01:00:00 (Sun)
  63721126800, #      utc_end 2020-03-29 01:00:00 (Sun)
  63707828400, #  local_start 2019-10-27 03:00:00 (Sun)
  63721134000, #    local_end 2020-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63721126800, #    utc_start 2020-03-29 01:00:00 (Sun)
  63739270800, #      utc_end 2020-10-25 01:00:00 (Sun)
  63721137600, #  local_start 2020-03-29 04:00:00 (Sun)
  63739281600, #    local_end 2020-10-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63739270800, #    utc_start 2020-10-25 01:00:00 (Sun)
  63752576400, #      utc_end 2021-03-28 01:00:00 (Sun)
  63739278000, #  local_start 2020-10-25 03:00:00 (Sun)
  63752583600, #    local_end 2021-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63752576400, #    utc_start 2021-03-28 01:00:00 (Sun)
  63771325200, #      utc_end 2021-10-31 01:00:00 (Sun)
  63752587200, #  local_start 2021-03-28 04:00:00 (Sun)
  63771336000, #    local_end 2021-10-31 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63771325200, #    utc_start 2021-10-31 01:00:00 (Sun)
  63784026000, #      utc_end 2022-03-27 01:00:00 (Sun)
  63771332400, #  local_start 2021-10-31 03:00:00 (Sun)
  63784033200, #    local_end 2022-03-27 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63784026000, #    utc_start 2022-03-27 01:00:00 (Sun)
  63802774800, #      utc_end 2022-10-30 01:00:00 (Sun)
  63784036800, #  local_start 2022-03-27 04:00:00 (Sun)
  63802785600, #    local_end 2022-10-30 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63802774800, #    utc_start 2022-10-30 01:00:00 (Sun)
  63815475600, #      utc_end 2023-03-26 01:00:00 (Sun)
  63802782000, #  local_start 2022-10-30 03:00:00 (Sun)
  63815482800, #    local_end 2023-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63815475600, #    utc_start 2023-03-26 01:00:00 (Sun)
  63834224400, #      utc_end 2023-10-29 01:00:00 (Sun)
  63815486400, #  local_start 2023-03-26 04:00:00 (Sun)
  63834235200, #    local_end 2023-10-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63834224400, #    utc_start 2023-10-29 01:00:00 (Sun)
  63847530000, #      utc_end 2024-03-31 01:00:00 (Sun)
  63834231600, #  local_start 2023-10-29 03:00:00 (Sun)
  63847537200, #    local_end 2024-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63847530000, #    utc_start 2024-03-31 01:00:00 (Sun)
  63865674000, #      utc_end 2024-10-27 01:00:00 (Sun)
  63847540800, #  local_start 2024-03-31 04:00:00 (Sun)
  63865684800, #    local_end 2024-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63865674000, #    utc_start 2024-10-27 01:00:00 (Sun)
  63878979600, #      utc_end 2025-03-30 01:00:00 (Sun)
  63865681200, #  local_start 2024-10-27 03:00:00 (Sun)
  63878986800, #    local_end 2025-03-30 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63878979600, #    utc_start 2025-03-30 01:00:00 (Sun)
  63897123600, #      utc_end 2025-10-26 01:00:00 (Sun)
  63878990400, #  local_start 2025-03-30 04:00:00 (Sun)
  63897134400, #    local_end 2025-10-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63897123600, #    utc_start 2025-10-26 01:00:00 (Sun)
  63910429200, #      utc_end 2026-03-29 01:00:00 (Sun)
  63897130800, #  local_start 2025-10-26 03:00:00 (Sun)
  63910436400, #    local_end 2026-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63910429200, #    utc_start 2026-03-29 01:00:00 (Sun)
  63928573200, #      utc_end 2026-10-25 01:00:00 (Sun)
  63910440000, #  local_start 2026-03-29 04:00:00 (Sun)
  63928584000, #    local_end 2026-10-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63928573200, #    utc_start 2026-10-25 01:00:00 (Sun)
  63941878800, #      utc_end 2027-03-28 01:00:00 (Sun)
  63928580400, #  local_start 2026-10-25 03:00:00 (Sun)
  63941886000, #    local_end 2027-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63941878800, #    utc_start 2027-03-28 01:00:00 (Sun)
  63960627600, #      utc_end 2027-10-31 01:00:00 (Sun)
  63941889600, #  local_start 2027-03-28 04:00:00 (Sun)
  63960638400, #    local_end 2027-10-31 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63960627600, #    utc_start 2027-10-31 01:00:00 (Sun)
  63973328400, #      utc_end 2028-03-26 01:00:00 (Sun)
  63960634800, #  local_start 2027-10-31 03:00:00 (Sun)
  63973335600, #    local_end 2028-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63973328400, #    utc_start 2028-03-26 01:00:00 (Sun)
  63992077200, #      utc_end 2028-10-29 01:00:00 (Sun)
  63973339200, #  local_start 2028-03-26 04:00:00 (Sun)
  63992088000, #    local_end 2028-10-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63992077200, #    utc_start 2028-10-29 01:00:00 (Sun)
  64004778000, #      utc_end 2029-03-25 01:00:00 (Sun)
  63992084400, #  local_start 2028-10-29 03:00:00 (Sun)
  64004785200, #    local_end 2029-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  64004778000, #    utc_start 2029-03-25 01:00:00 (Sun)
  64023526800, #      utc_end 2029-10-28 01:00:00 (Sun)
  64004788800, #  local_start 2029-03-25 04:00:00 (Sun)
  64023537600, #    local_end 2029-10-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  64023526800, #    utc_start 2029-10-28 01:00:00 (Sun)
  64036832400, #      utc_end 2030-03-31 01:00:00 (Sun)
  64023534000, #  local_start 2029-10-28 03:00:00 (Sun)
  64036839600, #    local_end 2030-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  64036832400, #    utc_start 2030-03-31 01:00:00 (Sun)
  64054976400, #      utc_end 2030-10-27 01:00:00 (Sun)
  64036843200, #  local_start 2030-03-31 04:00:00 (Sun)
  64054987200, #    local_end 2030-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {54}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { 7200 }
  
  my $last_observance = bless( {
    'format' => 'EE%sT',
    'gmtoff' => '2:00',
    'local_start_datetime' => {},
    'offset_from_std' => 0,
    'offset_from_utc' => 7200,
    'until' => [],
    'utc_start_datetime' => {}
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '1:00u',
      'from' => '1996',
      'in' => 'Oct',
      'letter' => '',
      'name' => 'EU',
      'offset_from_std' => 0,
      'on' => 'lastSun',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '1:00u',
      'from' => '1981',
      'in' => 'Mar',
      'letter' => 'S',
      'name' => 'EU',
      'offset_from_std' => 3600,
      'on' => 'lastSun',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_EET

    $main::fatpacked{"DateTime/TimeZone/EST.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_EST';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::EST;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::EST::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  DateTime::TimeZone::INFINITY, #      utc_end
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  DateTime::TimeZone::INFINITY, #    local_end
  -18000,
  0,
  'EST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_EST

    $main::fatpacked{"DateTime/TimeZone/EST5EDT.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_EST5EDT';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::EST5EDT;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::EST5EDT::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60502402800, #      utc_end 1918-03-31 07:00:00 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60502384800, #    local_end 1918-03-31 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  60502402800, #    utc_start 1918-03-31 07:00:00 (Sun)
  60520543200, #      utc_end 1918-10-27 06:00:00 (Sun)
  60502388400, #  local_start 1918-03-31 03:00:00 (Sun)
  60520528800, #    local_end 1918-10-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  60520543200, #    utc_start 1918-10-27 06:00:00 (Sun)
  60533852400, #      utc_end 1919-03-30 07:00:00 (Sun)
  60520525200, #  local_start 1918-10-27 01:00:00 (Sun)
  60533834400, #    local_end 1919-03-30 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  60533852400, #    utc_start 1919-03-30 07:00:00 (Sun)
  60551992800, #      utc_end 1919-10-26 06:00:00 (Sun)
  60533838000, #  local_start 1919-03-30 03:00:00 (Sun)
  60551978400, #    local_end 1919-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  60551992800, #    utc_start 1919-10-26 06:00:00 (Sun)
  61255465200, #      utc_end 1942-02-09 07:00:00 (Mon)
  60551974800, #  local_start 1919-10-26 01:00:00 (Sun)
  61255447200, #    local_end 1942-02-09 02:00:00 (Mon)
  -18000,
  0,
  'EST',
      ],
      [
  61255465200, #    utc_start 1942-02-09 07:00:00 (Mon)
  61366287600, #      utc_end 1945-08-14 23:00:00 (Tue)
  61255450800, #  local_start 1942-02-09 03:00:00 (Mon)
  61366273200, #    local_end 1945-08-14 19:00:00 (Tue)
  -14400,
  1,
  'EWT',
      ],
      [
  61366287600, #    utc_start 1945-08-14 23:00:00 (Tue)
  61370287200, #      utc_end 1945-09-30 06:00:00 (Sun)
  61366273200, #  local_start 1945-08-14 19:00:00 (Tue)
  61370272800, #    local_end 1945-09-30 02:00:00 (Sun)
  -14400,
  1,
  'EPT',
      ],
      [
  61370287200, #    utc_start 1945-09-30 06:00:00 (Sun)
  62051295600, #      utc_end 1967-04-30 07:00:00 (Sun)
  61370269200, #  local_start 1945-09-30 01:00:00 (Sun)
  62051277600, #    local_end 1967-04-30 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62051295600, #    utc_start 1967-04-30 07:00:00 (Sun)
  62067016800, #      utc_end 1967-10-29 06:00:00 (Sun)
  62051281200, #  local_start 1967-04-30 03:00:00 (Sun)
  62067002400, #    local_end 1967-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62067016800, #    utc_start 1967-10-29 06:00:00 (Sun)
  62082745200, #      utc_end 1968-04-28 07:00:00 (Sun)
  62066998800, #  local_start 1967-10-29 01:00:00 (Sun)
  62082727200, #    local_end 1968-04-28 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62082745200, #    utc_start 1968-04-28 07:00:00 (Sun)
  62098466400, #      utc_end 1968-10-27 06:00:00 (Sun)
  62082730800, #  local_start 1968-04-28 03:00:00 (Sun)
  62098452000, #    local_end 1968-10-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62098466400, #    utc_start 1968-10-27 06:00:00 (Sun)
  62114194800, #      utc_end 1969-04-27 07:00:00 (Sun)
  62098448400, #  local_start 1968-10-27 01:00:00 (Sun)
  62114176800, #    local_end 1969-04-27 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62114194800, #    utc_start 1969-04-27 07:00:00 (Sun)
  62129916000, #      utc_end 1969-10-26 06:00:00 (Sun)
  62114180400, #  local_start 1969-04-27 03:00:00 (Sun)
  62129901600, #    local_end 1969-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62129916000, #    utc_start 1969-10-26 06:00:00 (Sun)
  62145644400, #      utc_end 1970-04-26 07:00:00 (Sun)
  62129898000, #  local_start 1969-10-26 01:00:00 (Sun)
  62145626400, #    local_end 1970-04-26 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62145644400, #    utc_start 1970-04-26 07:00:00 (Sun)
  62161365600, #      utc_end 1970-10-25 06:00:00 (Sun)
  62145630000, #  local_start 1970-04-26 03:00:00 (Sun)
  62161351200, #    local_end 1970-10-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62161365600, #    utc_start 1970-10-25 06:00:00 (Sun)
  62177094000, #      utc_end 1971-04-25 07:00:00 (Sun)
  62161347600, #  local_start 1970-10-25 01:00:00 (Sun)
  62177076000, #    local_end 1971-04-25 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62177094000, #    utc_start 1971-04-25 07:00:00 (Sun)
  62193420000, #      utc_end 1971-10-31 06:00:00 (Sun)
  62177079600, #  local_start 1971-04-25 03:00:00 (Sun)
  62193405600, #    local_end 1971-10-31 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62193420000, #    utc_start 1971-10-31 06:00:00 (Sun)
  62209148400, #      utc_end 1972-04-30 07:00:00 (Sun)
  62193402000, #  local_start 1971-10-31 01:00:00 (Sun)
  62209130400, #    local_end 1972-04-30 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62209148400, #    utc_start 1972-04-30 07:00:00 (Sun)
  62224869600, #      utc_end 1972-10-29 06:00:00 (Sun)
  62209134000, #  local_start 1972-04-30 03:00:00 (Sun)
  62224855200, #    local_end 1972-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62224869600, #    utc_start 1972-10-29 06:00:00 (Sun)
  62240598000, #      utc_end 1973-04-29 07:00:00 (Sun)
  62224851600, #  local_start 1972-10-29 01:00:00 (Sun)
  62240580000, #    local_end 1973-04-29 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62240598000, #    utc_start 1973-04-29 07:00:00 (Sun)
  62256319200, #      utc_end 1973-10-28 06:00:00 (Sun)
  62240583600, #  local_start 1973-04-29 03:00:00 (Sun)
  62256304800, #    local_end 1973-10-28 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62256319200, #    utc_start 1973-10-28 06:00:00 (Sun)
  62262370800, #      utc_end 1974-01-06 07:00:00 (Sun)
  62256301200, #  local_start 1973-10-28 01:00:00 (Sun)
  62262352800, #    local_end 1974-01-06 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62262370800, #    utc_start 1974-01-06 07:00:00 (Sun)
  62287768800, #      utc_end 1974-10-27 06:00:00 (Sun)
  62262356400, #  local_start 1974-01-06 03:00:00 (Sun)
  62287754400, #    local_end 1974-10-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62287768800, #    utc_start 1974-10-27 06:00:00 (Sun)
  62298054000, #      utc_end 1975-02-23 07:00:00 (Sun)
  62287750800, #  local_start 1974-10-27 01:00:00 (Sun)
  62298036000, #    local_end 1975-02-23 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62298054000, #    utc_start 1975-02-23 07:00:00 (Sun)
  62319218400, #      utc_end 1975-10-26 06:00:00 (Sun)
  62298039600, #  local_start 1975-02-23 03:00:00 (Sun)
  62319204000, #    local_end 1975-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62319218400, #    utc_start 1975-10-26 06:00:00 (Sun)
  62334946800, #      utc_end 1976-04-25 07:00:00 (Sun)
  62319200400, #  local_start 1975-10-26 01:00:00 (Sun)
  62334928800, #    local_end 1976-04-25 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62334946800, #    utc_start 1976-04-25 07:00:00 (Sun)
  62351272800, #      utc_end 1976-10-31 06:00:00 (Sun)
  62334932400, #  local_start 1976-04-25 03:00:00 (Sun)
  62351258400, #    local_end 1976-10-31 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62351272800, #    utc_start 1976-10-31 06:00:00 (Sun)
  62366396400, #      utc_end 1977-04-24 07:00:00 (Sun)
  62351254800, #  local_start 1976-10-31 01:00:00 (Sun)
  62366378400, #    local_end 1977-04-24 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62366396400, #    utc_start 1977-04-24 07:00:00 (Sun)
  62382722400, #      utc_end 1977-10-30 06:00:00 (Sun)
  62366382000, #  local_start 1977-04-24 03:00:00 (Sun)
  62382708000, #    local_end 1977-10-30 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62382722400, #    utc_start 1977-10-30 06:00:00 (Sun)
  62398450800, #      utc_end 1978-04-30 07:00:00 (Sun)
  62382704400, #  local_start 1977-10-30 01:00:00 (Sun)
  62398432800, #    local_end 1978-04-30 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62398450800, #    utc_start 1978-04-30 07:00:00 (Sun)
  62414172000, #      utc_end 1978-10-29 06:00:00 (Sun)
  62398436400, #  local_start 1978-04-30 03:00:00 (Sun)
  62414157600, #    local_end 1978-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62414172000, #    utc_start 1978-10-29 06:00:00 (Sun)
  62429900400, #      utc_end 1979-04-29 07:00:00 (Sun)
  62414154000, #  local_start 1978-10-29 01:00:00 (Sun)
  62429882400, #    local_end 1979-04-29 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62429900400, #    utc_start 1979-04-29 07:00:00 (Sun)
  62445621600, #      utc_end 1979-10-28 06:00:00 (Sun)
  62429886000, #  local_start 1979-04-29 03:00:00 (Sun)
  62445607200, #    local_end 1979-10-28 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62445621600, #    utc_start 1979-10-28 06:00:00 (Sun)
  62461350000, #      utc_end 1980-04-27 07:00:00 (Sun)
  62445603600, #  local_start 1979-10-28 01:00:00 (Sun)
  62461332000, #    local_end 1980-04-27 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62461350000, #    utc_start 1980-04-27 07:00:00 (Sun)
  62477071200, #      utc_end 1980-10-26 06:00:00 (Sun)
  62461335600, #  local_start 1980-04-27 03:00:00 (Sun)
  62477056800, #    local_end 1980-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62477071200, #    utc_start 1980-10-26 06:00:00 (Sun)
  62492799600, #      utc_end 1981-04-26 07:00:00 (Sun)
  62477053200, #  local_start 1980-10-26 01:00:00 (Sun)
  62492781600, #    local_end 1981-04-26 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62492799600, #    utc_start 1981-04-26 07:00:00 (Sun)
  62508520800, #      utc_end 1981-10-25 06:00:00 (Sun)
  62492785200, #  local_start 1981-04-26 03:00:00 (Sun)
  62508506400, #    local_end 1981-10-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62508520800, #    utc_start 1981-10-25 06:00:00 (Sun)
  62524249200, #      utc_end 1982-04-25 07:00:00 (Sun)
  62508502800, #  local_start 1981-10-25 01:00:00 (Sun)
  62524231200, #    local_end 1982-04-25 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62524249200, #    utc_start 1982-04-25 07:00:00 (Sun)
  62540575200, #      utc_end 1982-10-31 06:00:00 (Sun)
  62524234800, #  local_start 1982-04-25 03:00:00 (Sun)
  62540560800, #    local_end 1982-10-31 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62540575200, #    utc_start 1982-10-31 06:00:00 (Sun)
  62555698800, #      utc_end 1983-04-24 07:00:00 (Sun)
  62540557200, #  local_start 1982-10-31 01:00:00 (Sun)
  62555680800, #    local_end 1983-04-24 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62555698800, #    utc_start 1983-04-24 07:00:00 (Sun)
  62572024800, #      utc_end 1983-10-30 06:00:00 (Sun)
  62555684400, #  local_start 1983-04-24 03:00:00 (Sun)
  62572010400, #    local_end 1983-10-30 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62572024800, #    utc_start 1983-10-30 06:00:00 (Sun)
  62587753200, #      utc_end 1984-04-29 07:00:00 (Sun)
  62572006800, #  local_start 1983-10-30 01:00:00 (Sun)
  62587735200, #    local_end 1984-04-29 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62587753200, #    utc_start 1984-04-29 07:00:00 (Sun)
  62603474400, #      utc_end 1984-10-28 06:00:00 (Sun)
  62587738800, #  local_start 1984-04-29 03:00:00 (Sun)
  62603460000, #    local_end 1984-10-28 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62603474400, #    utc_start 1984-10-28 06:00:00 (Sun)
  62619202800, #      utc_end 1985-04-28 07:00:00 (Sun)
  62603456400, #  local_start 1984-10-28 01:00:00 (Sun)
  62619184800, #    local_end 1985-04-28 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62619202800, #    utc_start 1985-04-28 07:00:00 (Sun)
  62634924000, #      utc_end 1985-10-27 06:00:00 (Sun)
  62619188400, #  local_start 1985-04-28 03:00:00 (Sun)
  62634909600, #    local_end 1985-10-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62634924000, #    utc_start 1985-10-27 06:00:00 (Sun)
  62650652400, #      utc_end 1986-04-27 07:00:00 (Sun)
  62634906000, #  local_start 1985-10-27 01:00:00 (Sun)
  62650634400, #    local_end 1986-04-27 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62650652400, #    utc_start 1986-04-27 07:00:00 (Sun)
  62666373600, #      utc_end 1986-10-26 06:00:00 (Sun)
  62650638000, #  local_start 1986-04-27 03:00:00 (Sun)
  62666359200, #    local_end 1986-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62666373600, #    utc_start 1986-10-26 06:00:00 (Sun)
  62680287600, #      utc_end 1987-04-05 07:00:00 (Sun)
  62666355600, #  local_start 1986-10-26 01:00:00 (Sun)
  62680269600, #    local_end 1987-04-05 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62680287600, #    utc_start 1987-04-05 07:00:00 (Sun)
  62697823200, #      utc_end 1987-10-25 06:00:00 (Sun)
  62680273200, #  local_start 1987-04-05 03:00:00 (Sun)
  62697808800, #    local_end 1987-10-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62697823200, #    utc_start 1987-10-25 06:00:00 (Sun)
  62711737200, #      utc_end 1988-04-03 07:00:00 (Sun)
  62697805200, #  local_start 1987-10-25 01:00:00 (Sun)
  62711719200, #    local_end 1988-04-03 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62711737200, #    utc_start 1988-04-03 07:00:00 (Sun)
  62729877600, #      utc_end 1988-10-30 06:00:00 (Sun)
  62711722800, #  local_start 1988-04-03 03:00:00 (Sun)
  62729863200, #    local_end 1988-10-30 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62729877600, #    utc_start 1988-10-30 06:00:00 (Sun)
  62743186800, #      utc_end 1989-04-02 07:00:00 (Sun)
  62729859600, #  local_start 1988-10-30 01:00:00 (Sun)
  62743168800, #    local_end 1989-04-02 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62743186800, #    utc_start 1989-04-02 07:00:00 (Sun)
  62761327200, #      utc_end 1989-10-29 06:00:00 (Sun)
  62743172400, #  local_start 1989-04-02 03:00:00 (Sun)
  62761312800, #    local_end 1989-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62761327200, #    utc_start 1989-10-29 06:00:00 (Sun)
  62774636400, #      utc_end 1990-04-01 07:00:00 (Sun)
  62761309200, #  local_start 1989-10-29 01:00:00 (Sun)
  62774618400, #    local_end 1990-04-01 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62774636400, #    utc_start 1990-04-01 07:00:00 (Sun)
  62792776800, #      utc_end 1990-10-28 06:00:00 (Sun)
  62774622000, #  local_start 1990-04-01 03:00:00 (Sun)
  62792762400, #    local_end 1990-10-28 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62792776800, #    utc_start 1990-10-28 06:00:00 (Sun)
  62806690800, #      utc_end 1991-04-07 07:00:00 (Sun)
  62792758800, #  local_start 1990-10-28 01:00:00 (Sun)
  62806672800, #    local_end 1991-04-07 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62806690800, #    utc_start 1991-04-07 07:00:00 (Sun)
  62824226400, #      utc_end 1991-10-27 06:00:00 (Sun)
  62806676400, #  local_start 1991-04-07 03:00:00 (Sun)
  62824212000, #    local_end 1991-10-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62824226400, #    utc_start 1991-10-27 06:00:00 (Sun)
  62838140400, #      utc_end 1992-04-05 07:00:00 (Sun)
  62824208400, #  local_start 1991-10-27 01:00:00 (Sun)
  62838122400, #    local_end 1992-04-05 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62838140400, #    utc_start 1992-04-05 07:00:00 (Sun)
  62855676000, #      utc_end 1992-10-25 06:00:00 (Sun)
  62838126000, #  local_start 1992-04-05 03:00:00 (Sun)
  62855661600, #    local_end 1992-10-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62855676000, #    utc_start 1992-10-25 06:00:00 (Sun)
  62869590000, #      utc_end 1993-04-04 07:00:00 (Sun)
  62855658000, #  local_start 1992-10-25 01:00:00 (Sun)
  62869572000, #    local_end 1993-04-04 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62869590000, #    utc_start 1993-04-04 07:00:00 (Sun)
  62887730400, #      utc_end 1993-10-31 06:00:00 (Sun)
  62869575600, #  local_start 1993-04-04 03:00:00 (Sun)
  62887716000, #    local_end 1993-10-31 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62887730400, #    utc_start 1993-10-31 06:00:00 (Sun)
  62901039600, #      utc_end 1994-04-03 07:00:00 (Sun)
  62887712400, #  local_start 1993-10-31 01:00:00 (Sun)
  62901021600, #    local_end 1994-04-03 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62901039600, #    utc_start 1994-04-03 07:00:00 (Sun)
  62919180000, #      utc_end 1994-10-30 06:00:00 (Sun)
  62901025200, #  local_start 1994-04-03 03:00:00 (Sun)
  62919165600, #    local_end 1994-10-30 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62919180000, #    utc_start 1994-10-30 06:00:00 (Sun)
  62932489200, #      utc_end 1995-04-02 07:00:00 (Sun)
  62919162000, #  local_start 1994-10-30 01:00:00 (Sun)
  62932471200, #    local_end 1995-04-02 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62932489200, #    utc_start 1995-04-02 07:00:00 (Sun)
  62950629600, #      utc_end 1995-10-29 06:00:00 (Sun)
  62932474800, #  local_start 1995-04-02 03:00:00 (Sun)
  62950615200, #    local_end 1995-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62950629600, #    utc_start 1995-10-29 06:00:00 (Sun)
  62964543600, #      utc_end 1996-04-07 07:00:00 (Sun)
  62950611600, #  local_start 1995-10-29 01:00:00 (Sun)
  62964525600, #    local_end 1996-04-07 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62964543600, #    utc_start 1996-04-07 07:00:00 (Sun)
  62982079200, #      utc_end 1996-10-27 06:00:00 (Sun)
  62964529200, #  local_start 1996-04-07 03:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  62982079200, #    utc_start 1996-10-27 06:00:00 (Sun)
  62995993200, #      utc_end 1997-04-06 07:00:00 (Sun)
  62982061200, #  local_start 1996-10-27 01:00:00 (Sun)
  62995975200, #    local_end 1997-04-06 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  62995993200, #    utc_start 1997-04-06 07:00:00 (Sun)
  63013528800, #      utc_end 1997-10-26 06:00:00 (Sun)
  62995978800, #  local_start 1997-04-06 03:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63013528800, #    utc_start 1997-10-26 06:00:00 (Sun)
  63027442800, #      utc_end 1998-04-05 07:00:00 (Sun)
  63013510800, #  local_start 1997-10-26 01:00:00 (Sun)
  63027424800, #    local_end 1998-04-05 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63027442800, #    utc_start 1998-04-05 07:00:00 (Sun)
  63044978400, #      utc_end 1998-10-25 06:00:00 (Sun)
  63027428400, #  local_start 1998-04-05 03:00:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63044978400, #    utc_start 1998-10-25 06:00:00 (Sun)
  63058892400, #      utc_end 1999-04-04 07:00:00 (Sun)
  63044960400, #  local_start 1998-10-25 01:00:00 (Sun)
  63058874400, #    local_end 1999-04-04 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63058892400, #    utc_start 1999-04-04 07:00:00 (Sun)
  63077032800, #      utc_end 1999-10-31 06:00:00 (Sun)
  63058878000, #  local_start 1999-04-04 03:00:00 (Sun)
  63077018400, #    local_end 1999-10-31 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63077032800, #    utc_start 1999-10-31 06:00:00 (Sun)
  63090342000, #      utc_end 2000-04-02 07:00:00 (Sun)
  63077014800, #  local_start 1999-10-31 01:00:00 (Sun)
  63090324000, #    local_end 2000-04-02 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63090342000, #    utc_start 2000-04-02 07:00:00 (Sun)
  63108482400, #      utc_end 2000-10-29 06:00:00 (Sun)
  63090327600, #  local_start 2000-04-02 03:00:00 (Sun)
  63108468000, #    local_end 2000-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63108482400, #    utc_start 2000-10-29 06:00:00 (Sun)
  63121791600, #      utc_end 2001-04-01 07:00:00 (Sun)
  63108464400, #  local_start 2000-10-29 01:00:00 (Sun)
  63121773600, #    local_end 2001-04-01 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63121791600, #    utc_start 2001-04-01 07:00:00 (Sun)
  63139932000, #      utc_end 2001-10-28 06:00:00 (Sun)
  63121777200, #  local_start 2001-04-01 03:00:00 (Sun)
  63139917600, #    local_end 2001-10-28 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63139932000, #    utc_start 2001-10-28 06:00:00 (Sun)
  63153846000, #      utc_end 2002-04-07 07:00:00 (Sun)
  63139914000, #  local_start 2001-10-28 01:00:00 (Sun)
  63153828000, #    local_end 2002-04-07 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63153846000, #    utc_start 2002-04-07 07:00:00 (Sun)
  63171381600, #      utc_end 2002-10-27 06:00:00 (Sun)
  63153831600, #  local_start 2002-04-07 03:00:00 (Sun)
  63171367200, #    local_end 2002-10-27 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63171381600, #    utc_start 2002-10-27 06:00:00 (Sun)
  63185295600, #      utc_end 2003-04-06 07:00:00 (Sun)
  63171363600, #  local_start 2002-10-27 01:00:00 (Sun)
  63185277600, #    local_end 2003-04-06 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63185295600, #    utc_start 2003-04-06 07:00:00 (Sun)
  63202831200, #      utc_end 2003-10-26 06:00:00 (Sun)
  63185281200, #  local_start 2003-04-06 03:00:00 (Sun)
  63202816800, #    local_end 2003-10-26 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63202831200, #    utc_start 2003-10-26 06:00:00 (Sun)
  63216745200, #      utc_end 2004-04-04 07:00:00 (Sun)
  63202813200, #  local_start 2003-10-26 01:00:00 (Sun)
  63216727200, #    local_end 2004-04-04 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63216745200, #    utc_start 2004-04-04 07:00:00 (Sun)
  63234885600, #      utc_end 2004-10-31 06:00:00 (Sun)
  63216730800, #  local_start 2004-04-04 03:00:00 (Sun)
  63234871200, #    local_end 2004-10-31 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63234885600, #    utc_start 2004-10-31 06:00:00 (Sun)
  63248194800, #      utc_end 2005-04-03 07:00:00 (Sun)
  63234867600, #  local_start 2004-10-31 01:00:00 (Sun)
  63248176800, #    local_end 2005-04-03 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63248194800, #    utc_start 2005-04-03 07:00:00 (Sun)
  63266335200, #      utc_end 2005-10-30 06:00:00 (Sun)
  63248180400, #  local_start 2005-04-03 03:00:00 (Sun)
  63266320800, #    local_end 2005-10-30 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63266335200, #    utc_start 2005-10-30 06:00:00 (Sun)
  63279644400, #      utc_end 2006-04-02 07:00:00 (Sun)
  63266317200, #  local_start 2005-10-30 01:00:00 (Sun)
  63279626400, #    local_end 2006-04-02 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63279644400, #    utc_start 2006-04-02 07:00:00 (Sun)
  63297784800, #      utc_end 2006-10-29 06:00:00 (Sun)
  63279630000, #  local_start 2006-04-02 03:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63297784800, #    utc_start 2006-10-29 06:00:00 (Sun)
  63309279600, #      utc_end 2007-03-11 07:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63309261600, #    local_end 2007-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63309279600, #    utc_start 2007-03-11 07:00:00 (Sun)
  63329839200, #      utc_end 2007-11-04 06:00:00 (Sun)
  63309265200, #  local_start 2007-03-11 03:00:00 (Sun)
  63329824800, #    local_end 2007-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63329839200, #    utc_start 2007-11-04 06:00:00 (Sun)
  63340729200, #      utc_end 2008-03-09 07:00:00 (Sun)
  63329821200, #  local_start 2007-11-04 01:00:00 (Sun)
  63340711200, #    local_end 2008-03-09 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63340729200, #    utc_start 2008-03-09 07:00:00 (Sun)
  63361288800, #      utc_end 2008-11-02 06:00:00 (Sun)
  63340714800, #  local_start 2008-03-09 03:00:00 (Sun)
  63361274400, #    local_end 2008-11-02 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63361288800, #    utc_start 2008-11-02 06:00:00 (Sun)
  63372178800, #      utc_end 2009-03-08 07:00:00 (Sun)
  63361270800, #  local_start 2008-11-02 01:00:00 (Sun)
  63372160800, #    local_end 2009-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63372178800, #    utc_start 2009-03-08 07:00:00 (Sun)
  63392738400, #      utc_end 2009-11-01 06:00:00 (Sun)
  63372164400, #  local_start 2009-03-08 03:00:00 (Sun)
  63392724000, #    local_end 2009-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63392738400, #    utc_start 2009-11-01 06:00:00 (Sun)
  63404233200, #      utc_end 2010-03-14 07:00:00 (Sun)
  63392720400, #  local_start 2009-11-01 01:00:00 (Sun)
  63404215200, #    local_end 2010-03-14 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63404233200, #    utc_start 2010-03-14 07:00:00 (Sun)
  63424792800, #      utc_end 2010-11-07 06:00:00 (Sun)
  63404218800, #  local_start 2010-03-14 03:00:00 (Sun)
  63424778400, #    local_end 2010-11-07 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63424792800, #    utc_start 2010-11-07 06:00:00 (Sun)
  63435682800, #      utc_end 2011-03-13 07:00:00 (Sun)
  63424774800, #  local_start 2010-11-07 01:00:00 (Sun)
  63435664800, #    local_end 2011-03-13 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63435682800, #    utc_start 2011-03-13 07:00:00 (Sun)
  63456242400, #      utc_end 2011-11-06 06:00:00 (Sun)
  63435668400, #  local_start 2011-03-13 03:00:00 (Sun)
  63456228000, #    local_end 2011-11-06 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63456242400, #    utc_start 2011-11-06 06:00:00 (Sun)
  63467132400, #      utc_end 2012-03-11 07:00:00 (Sun)
  63456224400, #  local_start 2011-11-06 01:00:00 (Sun)
  63467114400, #    local_end 2012-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63467132400, #    utc_start 2012-03-11 07:00:00 (Sun)
  63487692000, #      utc_end 2012-11-04 06:00:00 (Sun)
  63467118000, #  local_start 2012-03-11 03:00:00 (Sun)
  63487677600, #    local_end 2012-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63487692000, #    utc_start 2012-11-04 06:00:00 (Sun)
  63498582000, #      utc_end 2013-03-10 07:00:00 (Sun)
  63487674000, #  local_start 2012-11-04 01:00:00 (Sun)
  63498564000, #    local_end 2013-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63498582000, #    utc_start 2013-03-10 07:00:00 (Sun)
  63519141600, #      utc_end 2013-11-03 06:00:00 (Sun)
  63498567600, #  local_start 2013-03-10 03:00:00 (Sun)
  63519127200, #    local_end 2013-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63519141600, #    utc_start 2013-11-03 06:00:00 (Sun)
  63530031600, #      utc_end 2014-03-09 07:00:00 (Sun)
  63519123600, #  local_start 2013-11-03 01:00:00 (Sun)
  63530013600, #    local_end 2014-03-09 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63530031600, #    utc_start 2014-03-09 07:00:00 (Sun)
  63550591200, #      utc_end 2014-11-02 06:00:00 (Sun)
  63530017200, #  local_start 2014-03-09 03:00:00 (Sun)
  63550576800, #    local_end 2014-11-02 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63550591200, #    utc_start 2014-11-02 06:00:00 (Sun)
  63561481200, #      utc_end 2015-03-08 07:00:00 (Sun)
  63550573200, #  local_start 2014-11-02 01:00:00 (Sun)
  63561463200, #    local_end 2015-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63561481200, #    utc_start 2015-03-08 07:00:00 (Sun)
  63582040800, #      utc_end 2015-11-01 06:00:00 (Sun)
  63561466800, #  local_start 2015-03-08 03:00:00 (Sun)
  63582026400, #    local_end 2015-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63582040800, #    utc_start 2015-11-01 06:00:00 (Sun)
  63593535600, #      utc_end 2016-03-13 07:00:00 (Sun)
  63582022800, #  local_start 2015-11-01 01:00:00 (Sun)
  63593517600, #    local_end 2016-03-13 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63593535600, #    utc_start 2016-03-13 07:00:00 (Sun)
  63614095200, #      utc_end 2016-11-06 06:00:00 (Sun)
  63593521200, #  local_start 2016-03-13 03:00:00 (Sun)
  63614080800, #    local_end 2016-11-06 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63614095200, #    utc_start 2016-11-06 06:00:00 (Sun)
  63624985200, #      utc_end 2017-03-12 07:00:00 (Sun)
  63614077200, #  local_start 2016-11-06 01:00:00 (Sun)
  63624967200, #    local_end 2017-03-12 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63624985200, #    utc_start 2017-03-12 07:00:00 (Sun)
  63645544800, #      utc_end 2017-11-05 06:00:00 (Sun)
  63624970800, #  local_start 2017-03-12 03:00:00 (Sun)
  63645530400, #    local_end 2017-11-05 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63645544800, #    utc_start 2017-11-05 06:00:00 (Sun)
  63656434800, #      utc_end 2018-03-11 07:00:00 (Sun)
  63645526800, #  local_start 2017-11-05 01:00:00 (Sun)
  63656416800, #    local_end 2018-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63656434800, #    utc_start 2018-03-11 07:00:00 (Sun)
  63676994400, #      utc_end 2018-11-04 06:00:00 (Sun)
  63656420400, #  local_start 2018-03-11 03:00:00 (Sun)
  63676980000, #    local_end 2018-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63676994400, #    utc_start 2018-11-04 06:00:00 (Sun)
  63687884400, #      utc_end 2019-03-10 07:00:00 (Sun)
  63676976400, #  local_start 2018-11-04 01:00:00 (Sun)
  63687866400, #    local_end 2019-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63687884400, #    utc_start 2019-03-10 07:00:00 (Sun)
  63708444000, #      utc_end 2019-11-03 06:00:00 (Sun)
  63687870000, #  local_start 2019-03-10 03:00:00 (Sun)
  63708429600, #    local_end 2019-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63708444000, #    utc_start 2019-11-03 06:00:00 (Sun)
  63719334000, #      utc_end 2020-03-08 07:00:00 (Sun)
  63708426000, #  local_start 2019-11-03 01:00:00 (Sun)
  63719316000, #    local_end 2020-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63719334000, #    utc_start 2020-03-08 07:00:00 (Sun)
  63739893600, #      utc_end 2020-11-01 06:00:00 (Sun)
  63719319600, #  local_start 2020-03-08 03:00:00 (Sun)
  63739879200, #    local_end 2020-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63739893600, #    utc_start 2020-11-01 06:00:00 (Sun)
  63751388400, #      utc_end 2021-03-14 07:00:00 (Sun)
  63739875600, #  local_start 2020-11-01 01:00:00 (Sun)
  63751370400, #    local_end 2021-03-14 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63751388400, #    utc_start 2021-03-14 07:00:00 (Sun)
  63771948000, #      utc_end 2021-11-07 06:00:00 (Sun)
  63751374000, #  local_start 2021-03-14 03:00:00 (Sun)
  63771933600, #    local_end 2021-11-07 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63771948000, #    utc_start 2021-11-07 06:00:00 (Sun)
  63782838000, #      utc_end 2022-03-13 07:00:00 (Sun)
  63771930000, #  local_start 2021-11-07 01:00:00 (Sun)
  63782820000, #    local_end 2022-03-13 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63782838000, #    utc_start 2022-03-13 07:00:00 (Sun)
  63803397600, #      utc_end 2022-11-06 06:00:00 (Sun)
  63782823600, #  local_start 2022-03-13 03:00:00 (Sun)
  63803383200, #    local_end 2022-11-06 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63803397600, #    utc_start 2022-11-06 06:00:00 (Sun)
  63814287600, #      utc_end 2023-03-12 07:00:00 (Sun)
  63803379600, #  local_start 2022-11-06 01:00:00 (Sun)
  63814269600, #    local_end 2023-03-12 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63814287600, #    utc_start 2023-03-12 07:00:00 (Sun)
  63834847200, #      utc_end 2023-11-05 06:00:00 (Sun)
  63814273200, #  local_start 2023-03-12 03:00:00 (Sun)
  63834832800, #    local_end 2023-11-05 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63834847200, #    utc_start 2023-11-05 06:00:00 (Sun)
  63845737200, #      utc_end 2024-03-10 07:00:00 (Sun)
  63834829200, #  local_start 2023-11-05 01:00:00 (Sun)
  63845719200, #    local_end 2024-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63845737200, #    utc_start 2024-03-10 07:00:00 (Sun)
  63866296800, #      utc_end 2024-11-03 06:00:00 (Sun)
  63845722800, #  local_start 2024-03-10 03:00:00 (Sun)
  63866282400, #    local_end 2024-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63866296800, #    utc_start 2024-11-03 06:00:00 (Sun)
  63877186800, #      utc_end 2025-03-09 07:00:00 (Sun)
  63866278800, #  local_start 2024-11-03 01:00:00 (Sun)
  63877168800, #    local_end 2025-03-09 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63877186800, #    utc_start 2025-03-09 07:00:00 (Sun)
  63897746400, #      utc_end 2025-11-02 06:00:00 (Sun)
  63877172400, #  local_start 2025-03-09 03:00:00 (Sun)
  63897732000, #    local_end 2025-11-02 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63897746400, #    utc_start 2025-11-02 06:00:00 (Sun)
  63908636400, #      utc_end 2026-03-08 07:00:00 (Sun)
  63897728400, #  local_start 2025-11-02 01:00:00 (Sun)
  63908618400, #    local_end 2026-03-08 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63908636400, #    utc_start 2026-03-08 07:00:00 (Sun)
  63929196000, #      utc_end 2026-11-01 06:00:00 (Sun)
  63908622000, #  local_start 2026-03-08 03:00:00 (Sun)
  63929181600, #    local_end 2026-11-01 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63929196000, #    utc_start 2026-11-01 06:00:00 (Sun)
  63940690800, #      utc_end 2027-03-14 07:00:00 (Sun)
  63929178000, #  local_start 2026-11-01 01:00:00 (Sun)
  63940672800, #    local_end 2027-03-14 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63940690800, #    utc_start 2027-03-14 07:00:00 (Sun)
  63961250400, #      utc_end 2027-11-07 06:00:00 (Sun)
  63940676400, #  local_start 2027-03-14 03:00:00 (Sun)
  63961236000, #    local_end 2027-11-07 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63961250400, #    utc_start 2027-11-07 06:00:00 (Sun)
  63972140400, #      utc_end 2028-03-12 07:00:00 (Sun)
  63961232400, #  local_start 2027-11-07 01:00:00 (Sun)
  63972122400, #    local_end 2028-03-12 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  63972140400, #    utc_start 2028-03-12 07:00:00 (Sun)
  63992700000, #      utc_end 2028-11-05 06:00:00 (Sun)
  63972126000, #  local_start 2028-03-12 03:00:00 (Sun)
  63992685600, #    local_end 2028-11-05 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  63992700000, #    utc_start 2028-11-05 06:00:00 (Sun)
  64003590000, #      utc_end 2029-03-11 07:00:00 (Sun)
  63992682000, #  local_start 2028-11-05 01:00:00 (Sun)
  64003572000, #    local_end 2029-03-11 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  64003590000, #    utc_start 2029-03-11 07:00:00 (Sun)
  64024149600, #      utc_end 2029-11-04 06:00:00 (Sun)
  64003575600, #  local_start 2029-03-11 03:00:00 (Sun)
  64024135200, #    local_end 2029-11-04 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
      [
  64024149600, #    utc_start 2029-11-04 06:00:00 (Sun)
  64035039600, #      utc_end 2030-03-10 07:00:00 (Sun)
  64024131600, #  local_start 2029-11-04 01:00:00 (Sun)
  64035021600, #    local_end 2030-03-10 02:00:00 (Sun)
  -18000,
  0,
  'EST',
      ],
      [
  64035039600, #    utc_start 2030-03-10 07:00:00 (Sun)
  64055599200, #      utc_end 2030-11-03 06:00:00 (Sun)
  64035025200, #  local_start 2030-03-10 03:00:00 (Sun)
  64055584800, #    local_end 2030-11-03 02:00:00 (Sun)
  -14400,
  1,
  'EDT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {68}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -18000 }
  
  my $last_observance = bless( {
    'format' => 'E%sT',
    'gmtoff' => '-5:00',
    'local_start_datetime' => {},
    'offset_from_std' => 0,
    'offset_from_utc' => -18000,
    'until' => [],
    'utc_start_datetime' => {}
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Nov',
      'letter' => 'S',
      'name' => 'US',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Mar',
      'letter' => 'D',
      'name' => 'US',
      'offset_from_std' => 3600,
      'on' => 'Sun>=8',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_EST5EDT

    $main::fatpacked{"DateTime/TimeZone/Europe/Amsterdam.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_EUROPE_AMSTERDAM';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Europe::Amsterdam;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Europe::Amsterdam::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  57875470828, #      utc_end 1834-12-31 23:40:28 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  57875472000, #    local_end 1835-01-01 00:00:00 (Thu)
  1172,
  0,
  'LMT',
      ],
      [
  57875470828, #    utc_start 1834-12-31 23:40:28 (Wed)
  60441982828, #      utc_end 1916-04-30 23:40:28 (Sun)
  57875472000, #  local_start 1835-01-01 00:00:00 (Thu)
  60441984000, #    local_end 1916-05-01 00:00:00 (Mon)
  1172,
  0,
  'AMT',
      ],
      [
  60441982828, #    utc_start 1916-04-30 23:40:28 (Sun)
  60455198428, #      utc_end 1916-09-30 22:40:28 (Sat)
  60441987600, #  local_start 1916-05-01 01:00:00 (Mon)
  60455203200, #    local_end 1916-10-01 00:00:00 (Sun)
  4772,
  1,
  'NST',
      ],
      [
  60455198428, #    utc_start 1916-09-30 22:40:28 (Sat)
  60472230028, #      utc_end 1917-04-16 01:40:28 (Mon)
  60455199600, #  local_start 1916-09-30 23:00:00 (Sat)
  60472231200, #    local_end 1917-04-16 02:00:00 (Mon)
  1172,
  0,
  'AMT',
      ],
      [
  60472230028, #    utc_start 1917-04-16 01:40:28 (Mon)
  60485535628, #      utc_end 1917-09-17 01:40:28 (Mon)
  60472234800, #  local_start 1917-04-16 03:00:00 (Mon)
  60485540400, #    local_end 1917-09-17 03:00:00 (Mon)
  4772,
  1,
  'NST',
      ],
      [
  60485535628, #    utc_start 1917-09-17 01:40:28 (Mon)
  60502470028, #      utc_end 1918-04-01 01:40:28 (Mon)
  60485536800, #  local_start 1917-09-17 02:00:00 (Mon)
  60502471200, #    local_end 1918-04-01 02:00:00 (Mon)
  1172,
  0,
  'AMT',
      ],
      [
  60502470028, #    utc_start 1918-04-01 01:40:28 (Mon)
  60518194828, #      utc_end 1918-09-30 01:40:28 (Mon)
  60502474800, #  local_start 1918-04-01 03:00:00 (Mon)
  60518199600, #    local_end 1918-09-30 03:00:00 (Mon)
  4772,
  1,
  'NST',
      ],
      [
  60518194828, #    utc_start 1918-09-30 01:40:28 (Mon)
  60534524428, #      utc_end 1919-04-07 01:40:28 (Mon)
  60518196000, #  local_start 1918-09-30 02:00:00 (Mon)
  60534525600, #    local_end 1919-04-07 02:00:00 (Mon)
  1172,
  0,
  'AMT',
      ],
      [
  60534524428, #    utc_start 1919-04-07 01:40:28 (Mon)
  60549644428, #      utc_end 1919-09-29 01:40:28 (Mon)
  60534529200, #  local_start 1919-04-07 03:00:00 (Mon)
  60549649200, #    local_end 1919-09-29 03:00:00 (Mon)
  4772,
  1,
  'NST',
      ],
      [
  60549644428, #    utc_start 1919-09-29 01:40:28 (Mon)
  60565974028, #      utc_end 1920-04-05 01:40:28 (Mon)
  60549645600, #  local_start 1919-09-29 02:00:00 (Mon)
  60565975200, #    local_end 1920-04-05 02:00:00 (Mon)
  1172,
  0,
  'AMT',
      ],
      [
  60565974028, #    utc_start 1920-04-05 01:40:28 (Mon)
  60581094028, #      utc_end 1920-09-27 01:40:28 (Mon)
  60565978800, #  local_start 1920-04-05 03:00:00 (Mon)
  60581098800, #    local_end 1920-09-27 03:00:00 (Mon)
  4772,
  1,
  'NST',
      ],
      [
  60581094028, #    utc_start 1920-09-27 01:40:28 (Mon)
  60597423628, #      utc_end 1921-04-04 01:40:28 (Mon)
  60581095200, #  local_start 1920-09-27 02:00:00 (Mon)
  60597424800, #    local_end 1921-04-04 02:00:00 (Mon)
  1172,
  0,
  'AMT',
      ],
      [
  60597423628, #    utc_start 1921-04-04 01:40:28 (Mon)
  60612543628, #      utc_end 1921-09-26 01:40:28 (Mon)
  60597428400, #  local_start 1921-04-04 03:00:00 (Mon)
  60612548400, #    local_end 1921-09-26 03:00:00 (Mon)
  4772,
  1,
  'NST',
      ],
      [
  60612543628, #    utc_start 1921-09-26 01:40:28 (Mon)
  60628182028, #      utc_end 1922-03-26 01:40:28 (Sun)
  60612544800, #  local_start 1921-09-26 02:00:00 (Mon)
  60628183200, #    local_end 1922-03-26 02:00:00 (Sun)
  1172,
  0,
  'AMT',
      ],
      [
  60628182028, #    utc_start 1922-03-26 01:40:28 (Sun)
  60645116428, #      utc_end 1922-10-08 01:40:28 (Sun)
  60628186800, #  local_start 1922-03-26 03:00:00 (Sun)
  60645121200, #    local_end 1922-10-08 03:00:00 (Sun)
  4772,
  1,
  'NST',
      ],
      [
  60645116428, #    utc_start 1922-10-08 01:40:28 (Sun)
  60665506828, #      utc_end 1923-06-01 01:40:28 (Fri)
  60645117600, #  local_start 1922-10-08 02:00:00 (Sun)
  60665508000, #    local_end 1923-06-01 02:00:00 (Fri)
  1172,
  0,
  'AMT',
      ],
      [
  60665506828, #    utc_start 1923-06-01 01:40:28 (Fri)
  60676566028, #      utc_end 1923-10-07 01:40:28 (Sun)
  60665511600, #  local_start 1923-06-01 03:00:00 (Fri)
  60676570800, #    local_end 1923-10-07 03:00:00 (Sun)
  4772,
  1,
  'NST',
      ],
      [
  60676566028, #    utc_start 1923-10-07 01:40:28 (Sun)
  60691686028, #      utc_end 1924-03-30 01:40:28 (Sun)
  60676567200, #  local_start 1923-10-07 02:00:00 (Sun)
  60691687200, #    local_end 1924-03-30 02:00:00 (Sun)
  1172,
  0,
  'AMT',
      ],
      [
  60691686028, #    utc_start 1924-03-30 01:40:28 (Sun)
  60708015628, #      utc_end 1924-10-05 01:40:28 (Sun)
  60691690800, #  local_start 1924-03-30 03:00:00 (Sun)
  60708020400, #    local_end 1924-10-05 03:00:00 (Sun)
  4772,
  1,
  'NST',
      ],
      [
  60708015628, #    utc_start 1924-10-05 01:40:28 (Sun)
  60729010828, #      utc_end 1925-06-05 01:40:28 (Fri)
  60708016800, #  local_start 1924-10-05 02:00:00 (Sun)
  60729012000, #    local_end 1925-06-05 02:00:00 (Fri)
  1172,
  0,
  'AMT',
      ],
      [
  60729010828, #    utc_start 1925-06-05 01:40:28 (Fri)
  60739465228, #      utc_end 1925-10-04 01:40:28 (Sun)
  60729015600, #  local_start 1925-06-05 03:00:00 (Fri)
  60739470000, #    local_end 1925-10-04 03:00:00 (Sun)
  4772,
  1,
  'NST',
      ],
      [
  60739465228, #    utc_start 1925-10-04 01:40:28 (Sun)
  60758732428, #      utc_end 1926-05-15 01:40:28 (Sat)
  60739466400, #  local_start 1925-10-04 02:00:00 (Sun)
  60758733600, #    local_end 1926-05-15 02:00:00 (Sat)
  1172,
  0,
  'AMT',
      ],
      [
  60758732428, #    utc_start 1926-05-15 01:40:28 (Sat)
  60770914828, #      utc_end 1926-10-03 01:40:28 (Sun)
  60758737200, #  local_start 1926-05-15 03:00:00 (Sat)
  60770919600, #    local_end 1926-10-03 03:00:00 (Sun)
  4772,
  1,
  'NST',
      ],
      [
  60770914828, #    utc_start 1926-10-03 01:40:28 (Sun)
  60790268428, #      utc_end 1927-05-15 01:40:28 (Sun)
  60770916000, #  local_start 1926-10-03 02:00:00 (Sun)
  60790269600, #    local_end 1927-05-15 02:00:00 (Sun)
  1172,
  0,
  'AMT',
      ],
      [
  60790268428, #    utc_start 1927-05-15 01:40:28 (Sun)
  60802364428, #      utc_end 1927-10-02 01:40:28 (Sun)
  60790273200, #  local_start 1927-05-15 03:00:00 (Sun)
  60802369200, #    local_end 1927-10-02 03:00:00 (Sun)
  4772,
  1,
  'NST',
      ],
      [
  60802364428, #    utc_start 1927-10-02 01:40:28 (Sun)
  60821890828, #      utc_end 1928-05-15 01:40:28 (Tue)
  60802365600, #  local_start 1927-10-02 02:00:00 (Sun)
  60821892000, #    local_end 1928-05-15 02:00:00 (Tue)
  1172,
  0,
  'AMT',
      ],
      [
  60821890828, #    utc_start 1928-05-15 01:40:28 (Tue)
  60834418828, #      utc_end 1928-10-07 01:40:28 (Sun)
  60821895600, #  local_start 1928-05-15 03:00:00 (Tue)
  60834423600, #    local_end 1928-10-07 03:00:00 (Sun)
  4772,
  1,
  'NST',
      ],
      [
  60834418828, #    utc_start 1928-10-07 01:40:28 (Sun)
  60853426828, #      utc_end 1929-05-15 01:40:28 (Wed)
  60834420000, #  local_start 1928-10-07 02:00:00 (Sun)
  60853428000, #    local_end 1929-05-15 02:00:00 (Wed)
  1172,
  0,
  'AMT',
      ],
      [
  60853426828, #    utc_start 1929-05-15 01:40:28 (Wed)
  60865868428, #      utc_end 1929-10-06 01:40:28 (Sun)
  60853431600, #  local_start 1929-05-15 03:00:00 (Wed)
  60865873200, #    local_end 1929-10-06 03:00:00 (Sun)
  4772,
  1,
  'NST',
      ],
      [
  60865868428, #    utc_start 1929-10-06 01:40:28 (Sun)
  60884962828, #      utc_end 1930-05-15 01:40:28 (Thu)
  60865869600, #  local_start 1929-10-06 02:00:00 (Sun)
  60884964000, #    local_end 1930-05-15 02:00:00 (Thu)
  1172,
  0,
  'AMT',
      ],
      [
  60884962828, #    utc_start 1930-05-15 01:40:28 (Thu)
  60897318028, #      utc_end 1930-10-05 01:40:28 (Sun)
  60884967600, #  local_start 1930-05-15 03:00:00 (Thu)
  60897322800, #    local_end 1930-10-05 03:00:00 (Sun)
  4772,
  1,
  'NST',
      ],
      [
  60897318028, #    utc_start 1930-10-05 01:40:28 (Sun)
  60916498828, #      utc_end 1931-05-15 01:40:28 (Fri)
  60897319200, #  local_start 1930-10-05 02:00:00 (Sun)
  60916500000, #    local_end 1931-05-15 02:00:00 (Fri)
  1172,
  0,
  'AMT',
      ],
      [
  60916498828, #    utc_start 1931-05-15 01:40:28 (Fri)
  60928767628, #      utc_end 1931-10-04 01:40:28 (Sun)
  60916503600, #  local_start 1931-05-15 03:00:00 (Fri)
  60928772400, #    local_end 1931-10-04 03:00:00 (Sun)
  4772,
  1,
  'NST',
      ],
      [
  60928767628, #    utc_start 1931-10-04 01:40:28 (Sun)
  60948726028, #      utc_end 1932-05-22 01:40:28 (Sun)
  60928768800, #  local_start 1931-10-04 02:00:00 (Sun)
  60948727200, #    local_end 1932-05-22 02:00:00 (Sun)
  1172,
  0,
  'AMT',
      ],
      [
  60948726028, #    utc_start 1932-05-22 01:40:28 (Sun)
  60960217228, #      utc_end 1932-10-02 01:40:28 (Sun)
  60948730800, #  local_start 1932-05-22 03:00:00 (Sun)
  60960222000, #    local_end 1932-10-02 03:00:00 (Sun)
  4772,
  1,
  'NST',
      ],
      [
  60960217228, #    utc_start 1932-10-02 01:40:28 (Sun)
  60979657228, #      utc_end 1933-05-15 01:40:28 (Mon)
  60960218400, #  local_start 1932-10-02 02:00:00 (Sun)
  60979658400, #    local_end 1933-05-15 02:00:00 (Mon)
  1172,
  0,
  'AMT',
      ],
      [
  60979657228, #    utc_start 1933-05-15 01:40:28 (Mon)
  60992271628, #      utc_end 1933-10-08 01:40:28 (Sun)
  60979662000, #  local_start 1933-05-15 03:00:00 (Mon)
  60992276400, #    local_end 1933-10-08 03:00:00 (Sun)
  4772,
  1,
  'NST',
      ],
      [
  60992271628, #    utc_start 1933-10-08 01:40:28 (Sun)
  61011193228, #      utc_end 1934-05-15 01:40:28 (Tue)
  60992272800, #  local_start 1933-10-08 02:00:00 (Sun)
  61011194400, #    local_end 1934-05-15 02:00:00 (Tue)
  1172,
  0,
  'AMT',
      ],
      [
  61011193228, #    utc_start 1934-05-15 01:40:28 (Tue)
  61023721228, #      utc_end 1934-10-07 01:40:28 (Sun)
  61011198000, #  local_start 1934-05-15 03:00:00 (Tue)
  61023726000, #    local_end 1934-10-07 03:00:00 (Sun)
  4772,
  1,
  'NST',
      ],
      [
  61023721228, #    utc_start 1934-10-07 01:40:28 (Sun)
  61042729228, #      utc_end 1935-05-15 01:40:28 (Wed)
  61023722400, #  local_start 1934-10-07 02:00:00 (Sun)
  61042730400, #    local_end 1935-05-15 02:00:00 (Wed)
  1172,
  0,
  'AMT',
      ],
      [
  61042729228, #    utc_start 1935-05-15 01:40:28 (Wed)
  61055170828, #      utc_end 1935-10-06 01:40:28 (Sun)
  61042734000, #  local_start 1935-05-15 03:00:00 (Wed)
  61055175600, #    local_end 1935-10-06 03:00:00 (Sun)
  4772,
  1,
  'NST',
      ],
      [
  61055170828, #    utc_start 1935-10-06 01:40:28 (Sun)
  61074351628, #      utc_end 1936-05-15 01:40:28 (Fri)
  61055172000, #  local_start 1935-10-06 02:00:00 (Sun)
  61074352800, #    local_end 1936-05-15 02:00:00 (Fri)
  1172,
  0,
  'AMT',
      ],
      [
  61074351628, #    utc_start 1936-05-15 01:40:28 (Fri)
  61086620428, #      utc_end 1936-10-04 01:40:28 (Sun)
  61074356400, #  local_start 1936-05-15 03:00:00 (Fri)
  61086625200, #    local_end 1936-10-04 03:00:00 (Sun)
  4772,
  1,
  'NST',
      ],
      [
  61086620428, #    utc_start 1936-10-04 01:40:28 (Sun)
  61106492428, #      utc_end 1937-05-22 01:40:28 (Sat)
  61086621600, #  local_start 1936-10-04 02:00:00 (Sun)
  61106493600, #    local_end 1937-05-22 02:00:00 (Sat)
  1172,
  0,
  'AMT',
      ],
      [
  61106492428, #    utc_start 1937-05-22 01:40:28 (Sat)
  61109937628, #      utc_end 1937-06-30 22:40:28 (Wed)
  61106497200, #  local_start 1937-05-22 03:00:00 (Sat)
  61109942400, #    local_end 1937-07-01 00:00:00 (Thu)
  4772,
  1,
  'NST',
      ],
      [
  61109937628, #    utc_start 1937-06-30 22:40:28 (Wed)
  61118070000, #      utc_end 1937-10-03 01:40:00 (Sun)
  61109942428, #  local_start 1937-07-01 00:00:28 (Thu)
  61118074800, #    local_end 1937-10-03 03:00:00 (Sun)
  4800,
  1,
  '+0120',
      ],
      [
  61118070000, #    utc_start 1937-10-03 01:40:00 (Sun)
  61137423600, #      utc_end 1938-05-15 01:40:00 (Sun)
  61118071200, #  local_start 1937-10-03 02:00:00 (Sun)
  61137424800, #    local_end 1938-05-15 02:00:00 (Sun)
  1200,
  0,
  '+0020',
      ],
      [
  61137423600, #    utc_start 1938-05-15 01:40:00 (Sun)
  61149519600, #      utc_end 1938-10-02 01:40:00 (Sun)
  61137428400, #  local_start 1938-05-15 03:00:00 (Sun)
  61149524400, #    local_end 1938-10-02 03:00:00 (Sun)
  4800,
  1,
  '+0120',
      ],
      [
  61149519600, #    utc_start 1938-10-02 01:40:00 (Sun)
  61168959600, #      utc_end 1939-05-15 01:40:00 (Mon)
  61149520800, #  local_start 1938-10-02 02:00:00 (Sun)
  61168960800, #    local_end 1939-05-15 02:00:00 (Mon)
  1200,
  0,
  '+0020',
      ],
      [
  61168959600, #    utc_start 1939-05-15 01:40:00 (Mon)
  61181574000, #      utc_end 1939-10-08 01:40:00 (Sun)
  61168964400, #  local_start 1939-05-15 03:00:00 (Mon)
  61181578800, #    local_end 1939-10-08 03:00:00 (Sun)
  4800,
  1,
  '+0120',
      ],
      [
  61181574000, #    utc_start 1939-10-08 01:40:00 (Sun)
  61200661200, #      utc_end 1940-05-15 23:40:00 (Wed)
  61181575200, #  local_start 1939-10-08 02:00:00 (Sun)
  61200662400, #    local_end 1940-05-16 00:00:00 (Thu)
  1200,
  0,
  '+0020',
      ],
      [
  61200661200, #    utc_start 1940-05-15 23:40:00 (Wed)
  61278426000, #      utc_end 1942-11-02 01:00:00 (Mon)
  61200668400, #  local_start 1940-05-16 01:40:00 (Thu)
  61278433200, #    local_end 1942-11-02 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61278426000, #    utc_start 1942-11-02 01:00:00 (Mon)
  61291126800, #      utc_end 1943-03-29 01:00:00 (Mon)
  61278429600, #  local_start 1942-11-02 02:00:00 (Mon)
  61291130400, #    local_end 1943-03-29 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61291126800, #    utc_start 1943-03-29 01:00:00 (Mon)
  61307456400, #      utc_end 1943-10-04 01:00:00 (Mon)
  61291134000, #  local_start 1943-03-29 03:00:00 (Mon)
  61307463600, #    local_end 1943-10-04 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61307456400, #    utc_start 1943-10-04 01:00:00 (Mon)
  61323181200, #      utc_end 1944-04-03 01:00:00 (Mon)
  61307460000, #  local_start 1943-10-04 02:00:00 (Mon)
  61323184800, #    local_end 1944-04-03 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61323181200, #    utc_start 1944-04-03 01:00:00 (Mon)
  61338906000, #      utc_end 1944-10-02 01:00:00 (Mon)
  61323188400, #  local_start 1944-04-03 03:00:00 (Mon)
  61338913200, #    local_end 1944-10-02 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61338906000, #    utc_start 1944-10-02 01:00:00 (Mon)
  61354630800, #      utc_end 1945-04-02 01:00:00 (Mon)
  61338909600, #  local_start 1944-10-02 02:00:00 (Mon)
  61354634400, #    local_end 1945-04-02 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61354630800, #    utc_start 1945-04-02 01:00:00 (Mon)
  61369059600, #      utc_end 1945-09-16 01:00:00 (Sun)
  61354638000, #  local_start 1945-04-02 03:00:00 (Mon)
  61369066800, #    local_end 1945-09-16 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  61369059600, #    utc_start 1945-09-16 01:00:00 (Sun)
  62356604400, #      utc_end 1976-12-31 23:00:00 (Fri)
  61369063200, #  local_start 1945-09-16 02:00:00 (Sun)
  62356608000, #    local_end 1977-01-01 00:00:00 (Sat)
  3600,
  0,
  'CET',
      ],
      [
  62356604400, #    utc_start 1976-12-31 23:00:00 (Fri)
  62364560400, #      utc_end 1977-04-03 01:00:00 (Sun)
  62356608000, #  local_start 1977-01-01 00:00:00 (Sat)
  62364564000, #    local_end 1977-04-03 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62364560400, #    utc_start 1977-04-03 01:00:00 (Sun)
  62379680400, #      utc_end 1977-09-25 01:00:00 (Sun)
  62364567600, #  local_start 1977-04-03 03:00:00 (Sun)
  62379687600, #    local_end 1977-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62379680400, #    utc_start 1977-09-25 01:00:00 (Sun)
  62396010000, #      utc_end 1978-04-02 01:00:00 (Sun)
  62379684000, #  local_start 1977-09-25 02:00:00 (Sun)
  62396013600, #    local_end 1978-04-02 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62396010000, #    utc_start 1978-04-02 01:00:00 (Sun)
  62411734800, #      utc_end 1978-10-01 01:00:00 (Sun)
  62396017200, #  local_start 1978-04-02 03:00:00 (Sun)
  62411742000, #    local_end 1978-10-01 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62411734800, #    utc_start 1978-10-01 01:00:00 (Sun)
  62427459600, #      utc_end 1979-04-01 01:00:00 (Sun)
  62411738400, #  local_start 1978-10-01 02:00:00 (Sun)
  62427463200, #    local_end 1979-04-01 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62427459600, #    utc_start 1979-04-01 01:00:00 (Sun)
  62443184400, #      utc_end 1979-09-30 01:00:00 (Sun)
  62427466800, #  local_start 1979-04-01 03:00:00 (Sun)
  62443191600, #    local_end 1979-09-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62443184400, #    utc_start 1979-09-30 01:00:00 (Sun)
  62459514000, #      utc_end 1980-04-06 01:00:00 (Sun)
  62443188000, #  local_start 1979-09-30 02:00:00 (Sun)
  62459517600, #    local_end 1980-04-06 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62459514000, #    utc_start 1980-04-06 01:00:00 (Sun)
  62474634000, #      utc_end 1980-09-28 01:00:00 (Sun)
  62459521200, #  local_start 1980-04-06 03:00:00 (Sun)
  62474641200, #    local_end 1980-09-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62474634000, #    utc_start 1980-09-28 01:00:00 (Sun)
  62490358800, #      utc_end 1981-03-29 01:00:00 (Sun)
  62474637600, #  local_start 1980-09-28 02:00:00 (Sun)
  62490362400, #    local_end 1981-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62490358800, #    utc_start 1981-03-29 01:00:00 (Sun)
  62506083600, #      utc_end 1981-09-27 01:00:00 (Sun)
  62490366000, #  local_start 1981-03-29 03:00:00 (Sun)
  62506090800, #    local_end 1981-09-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62506083600, #    utc_start 1981-09-27 01:00:00 (Sun)
  62521808400, #      utc_end 1982-03-28 01:00:00 (Sun)
  62506087200, #  local_start 1981-09-27 02:00:00 (Sun)
  62521812000, #    local_end 1982-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62521808400, #    utc_start 1982-03-28 01:00:00 (Sun)
  62537533200, #      utc_end 1982-09-26 01:00:00 (Sun)
  62521815600, #  local_start 1982-03-28 03:00:00 (Sun)
  62537540400, #    local_end 1982-09-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62537533200, #    utc_start 1982-09-26 01:00:00 (Sun)
  62553258000, #      utc_end 1983-03-27 01:00:00 (Sun)
  62537536800, #  local_start 1982-09-26 02:00:00 (Sun)
  62553261600, #    local_end 1983-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62553258000, #    utc_start 1983-03-27 01:00:00 (Sun)
  62568982800, #      utc_end 1983-09-25 01:00:00 (Sun)
  62553265200, #  local_start 1983-03-27 03:00:00 (Sun)
  62568990000, #    local_end 1983-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62568982800, #    utc_start 1983-09-25 01:00:00 (Sun)
  62584707600, #      utc_end 1984-03-25 01:00:00 (Sun)
  62568986400, #  local_start 1983-09-25 02:00:00 (Sun)
  62584711200, #    local_end 1984-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62584707600, #    utc_start 1984-03-25 01:00:00 (Sun)
  62601037200, #      utc_end 1984-09-30 01:00:00 (Sun)
  62584714800, #  local_start 1984-03-25 03:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62601037200, #    utc_start 1984-09-30 01:00:00 (Sun)
  62616762000, #      utc_end 1985-03-31 01:00:00 (Sun)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62616762000, #    utc_start 1985-03-31 01:00:00 (Sun)
  62632486800, #      utc_end 1985-09-29 01:00:00 (Sun)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62632486800, #    utc_start 1985-09-29 01:00:00 (Sun)
  62648211600, #      utc_end 1986-03-30 01:00:00 (Sun)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62648211600, #    utc_start 1986-03-30 01:00:00 (Sun)
  62663936400, #      utc_end 1986-09-28 01:00:00 (Sun)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62663936400, #    utc_start 1986-09-28 01:00:00 (Sun)
  62679661200, #      utc_end 1987-03-29 01:00:00 (Sun)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62679661200, #    utc_start 1987-03-29 01:00:00 (Sun)
  62695386000, #      utc_end 1987-09-27 01:00:00 (Sun)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62695386000, #    utc_start 1987-09-27 01:00:00 (Sun)
  62711110800, #      utc_end 1988-03-27 01:00:00 (Sun)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62711110800, #    utc_start 1988-03-27 01:00:00 (Sun)
  62726835600, #      utc_end 1988-09-25 01:00:00 (Sun)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62726835600, #    utc_start 1988-09-25 01:00:00 (Sun)
  62742560400, #      utc_end 1989-03-26 01:00:00 (Sun)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62742560400, #    utc_start 1989-03-26 01:00:00 (Sun)
  62758285200, #      utc_end 1989-09-24 01:00:00 (Sun)
  62742567600, #  local_start 1989-03-26 03:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62758285200, #    utc_start 1989-09-24 01:00:00 (Sun)
  62774010000, #      utc_end 1990-03-25 01:00:00 (Sun)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62774010000, #    utc_start 1990-03-25 01:00:00 (Sun)
  62790339600, #      utc_end 1990-09-30 01:00:00 (Sun)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62790339600, #    utc_start 1990-09-30 01:00:00 (Sun)
  62806064400, #      utc_end 1991-03-31 01:00:00 (Sun)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62806064400, #    utc_start 1991-03-31 01:00:00 (Sun)
  62821789200, #      utc_end 1991-09-29 01:00:00 (Sun)
  62806071600, #  local_start 1991-03-31 03:00:00 (Sun)
  62821796400, #    local_end 1991-09-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62821789200, #    utc_start 1991-09-29 01:00:00 (Sun)
  62837514000, #      utc_end 1992-03-29 01:00:00 (Sun)
  62821792800, #  local_start 1991-09-29 02:00:00 (Sun)
  62837517600, #    local_end 1992-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62837514000, #    utc_start 1992-03-29 01:00:00 (Sun)
  62853238800, #      utc_end 1992-09-27 01:00:00 (Sun)
  62837521200, #  local_start 1992-03-29 03:00:00 (Sun)
  62853246000, #    local_end 1992-09-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62853238800, #    utc_start 1992-09-27 01:00:00 (Sun)
  62868963600, #      utc_end 1993-03-28 01:00:00 (Sun)
  62853242400, #  local_start 1992-09-27 02:00:00 (Sun)
  62868967200, #    local_end 1993-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62868963600, #    utc_start 1993-03-28 01:00:00 (Sun)
  62884688400, #      utc_end 1993-09-26 01:00:00 (Sun)
  62868970800, #  local_start 1993-03-28 03:00:00 (Sun)
  62884695600, #    local_end 1993-09-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62884688400, #    utc_start 1993-09-26 01:00:00 (Sun)
  62900413200, #      utc_end 1994-03-27 01:00:00 (Sun)
  62884692000, #  local_start 1993-09-26 02:00:00 (Sun)
  62900416800, #    local_end 1994-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62900413200, #    utc_start 1994-03-27 01:00:00 (Sun)
  62916138000, #      utc_end 1994-09-25 01:00:00 (Sun)
  62900420400, #  local_start 1994-03-27 03:00:00 (Sun)
  62916145200, #    local_end 1994-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62916138000, #    utc_start 1994-09-25 01:00:00 (Sun)
  62931862800, #      utc_end 1995-03-26 01:00:00 (Sun)
  62916141600, #  local_start 1994-09-25 02:00:00 (Sun)
  62931866400, #    local_end 1995-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62931862800, #    utc_start 1995-03-26 01:00:00 (Sun)
  62947587600, #      utc_end 1995-09-24 01:00:00 (Sun)
  62931870000, #  local_start 1995-03-26 03:00:00 (Sun)
  62947594800, #    local_end 1995-09-24 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62947587600, #    utc_start 1995-09-24 01:00:00 (Sun)
  62963917200, #      utc_end 1996-03-31 01:00:00 (Sun)
  62947591200, #  local_start 1995-09-24 02:00:00 (Sun)
  62963920800, #    local_end 1996-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62963917200, #    utc_start 1996-03-31 01:00:00 (Sun)
  62982061200, #      utc_end 1996-10-27 01:00:00 (Sun)
  62963924400, #  local_start 1996-03-31 03:00:00 (Sun)
  62982068400, #    local_end 1996-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62982061200, #    utc_start 1996-10-27 01:00:00 (Sun)
  62995366800, #      utc_end 1997-03-30 01:00:00 (Sun)
  62982064800, #  local_start 1996-10-27 02:00:00 (Sun)
  62995370400, #    local_end 1997-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62995366800, #    utc_start 1997-03-30 01:00:00 (Sun)
  63013510800, #      utc_end 1997-10-26 01:00:00 (Sun)
  62995374000, #  local_start 1997-03-30 03:00:00 (Sun)
  63013518000, #    local_end 1997-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63013510800, #    utc_start 1997-10-26 01:00:00 (Sun)
  63026816400, #      utc_end 1998-03-29 01:00:00 (Sun)
  63013514400, #  local_start 1997-10-26 02:00:00 (Sun)
  63026820000, #    local_end 1998-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63026816400, #    utc_start 1998-03-29 01:00:00 (Sun)
  63044960400, #      utc_end 1998-10-25 01:00:00 (Sun)
  63026823600, #  local_start 1998-03-29 03:00:00 (Sun)
  63044967600, #    local_end 1998-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63044960400, #    utc_start 1998-10-25 01:00:00 (Sun)
  63058266000, #      utc_end 1999-03-28 01:00:00 (Sun)
  63044964000, #  local_start 1998-10-25 02:00:00 (Sun)
  63058269600, #    local_end 1999-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63058266000, #    utc_start 1999-03-28 01:00:00 (Sun)
  63077014800, #      utc_end 1999-10-31 01:00:00 (Sun)
  63058273200, #  local_start 1999-03-28 03:00:00 (Sun)
  63077022000, #    local_end 1999-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63077014800, #    utc_start 1999-10-31 01:00:00 (Sun)
  63089715600, #      utc_end 2000-03-26 01:00:00 (Sun)
  63077018400, #  local_start 1999-10-31 02:00:00 (Sun)
  63089719200, #    local_end 2000-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63089715600, #    utc_start 2000-03-26 01:00:00 (Sun)
  63108464400, #      utc_end 2000-10-29 01:00:00 (Sun)
  63089722800, #  local_start 2000-03-26 03:00:00 (Sun)
  63108471600, #    local_end 2000-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63108464400, #    utc_start 2000-10-29 01:00:00 (Sun)
  63121165200, #      utc_end 2001-03-25 01:00:00 (Sun)
  63108468000, #  local_start 2000-10-29 02:00:00 (Sun)
  63121168800, #    local_end 2001-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63121165200, #    utc_start 2001-03-25 01:00:00 (Sun)
  63139914000, #      utc_end 2001-10-28 01:00:00 (Sun)
  63121172400, #  local_start 2001-03-25 03:00:00 (Sun)
  63139921200, #    local_end 2001-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63139914000, #    utc_start 2001-10-28 01:00:00 (Sun)
  63153219600, #      utc_end 2002-03-31 01:00:00 (Sun)
  63139917600, #  local_start 2001-10-28 02:00:00 (Sun)
  63153223200, #    local_end 2002-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63153219600, #    utc_start 2002-03-31 01:00:00 (Sun)
  63171363600, #      utc_end 2002-10-27 01:00:00 (Sun)
  63153226800, #  local_start 2002-03-31 03:00:00 (Sun)
  63171370800, #    local_end 2002-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63171363600, #    utc_start 2002-10-27 01:00:00 (Sun)
  63184669200, #      utc_end 2003-03-30 01:00:00 (Sun)
  63171367200, #  local_start 2002-10-27 02:00:00 (Sun)
  63184672800, #    local_end 2003-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63184669200, #    utc_start 2003-03-30 01:00:00 (Sun)
  63202813200, #      utc_end 2003-10-26 01:00:00 (Sun)
  63184676400, #  local_start 2003-03-30 03:00:00 (Sun)
  63202820400, #    local_end 2003-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63202813200, #    utc_start 2003-10-26 01:00:00 (Sun)
  63216118800, #      utc_end 2004-03-28 01:00:00 (Sun)
  63202816800, #  local_start 2003-10-26 02:00:00 (Sun)
  63216122400, #    local_end 2004-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63216118800, #    utc_start 2004-03-28 01:00:00 (Sun)
  63234867600, #      utc_end 2004-10-31 01:00:00 (Sun)
  63216126000, #  local_start 2004-03-28 03:00:00 (Sun)
  63234874800, #    local_end 2004-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63234867600, #    utc_start 2004-10-31 01:00:00 (Sun)
  63247568400, #      utc_end 2005-03-27 01:00:00 (Sun)
  63234871200, #  local_start 2004-10-31 02:00:00 (Sun)
  63247572000, #    local_end 2005-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63247568400, #    utc_start 2005-03-27 01:00:00 (Sun)
  63266317200, #      utc_end 2005-10-30 01:00:00 (Sun)
  63247575600, #  local_start 2005-03-27 03:00:00 (Sun)
  63266324400, #    local_end 2005-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63266317200, #    utc_start 2005-10-30 01:00:00 (Sun)
  63279018000, #      utc_end 2006-03-26 01:00:00 (Sun)
  63266320800, #  local_start 2005-10-30 02:00:00 (Sun)
  63279021600, #    local_end 2006-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63279018000, #    utc_start 2006-03-26 01:00:00 (Sun)
  63297766800, #      utc_end 2006-10-29 01:00:00 (Sun)
  63279025200, #  local_start 2006-03-26 03:00:00 (Sun)
  63297774000, #    local_end 2006-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63297766800, #    utc_start 2006-10-29 01:00:00 (Sun)
  63310467600, #      utc_end 2007-03-25 01:00:00 (Sun)
  63297770400, #  local_start 2006-10-29 02:00:00 (Sun)
  63310471200, #    local_end 2007-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63310467600, #    utc_start 2007-03-25 01:00:00 (Sun)
  63329216400, #      utc_end 2007-10-28 01:00:00 (Sun)
  63310474800, #  local_start 2007-03-25 03:00:00 (Sun)
  63329223600, #    local_end 2007-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63329216400, #    utc_start 2007-10-28 01:00:00 (Sun)
  63342522000, #      utc_end 2008-03-30 01:00:00 (Sun)
  63329220000, #  local_start 2007-10-28 02:00:00 (Sun)
  63342525600, #    local_end 2008-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63342522000, #    utc_start 2008-03-30 01:00:00 (Sun)
  63360666000, #      utc_end 2008-10-26 01:00:00 (Sun)
  63342529200, #  local_start 2008-03-30 03:00:00 (Sun)
  63360673200, #    local_end 2008-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63360666000, #    utc_start 2008-10-26 01:00:00 (Sun)
  63373971600, #      utc_end 2009-03-29 01:00:00 (Sun)
  63360669600, #  local_start 2008-10-26 02:00:00 (Sun)
  63373975200, #    local_end 2009-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63373971600, #    utc_start 2009-03-29 01:00:00 (Sun)
  63392115600, #      utc_end 2009-10-25 01:00:00 (Sun)
  63373978800, #  local_start 2009-03-29 03:00:00 (Sun)
  63392122800, #    local_end 2009-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63392115600, #    utc_start 2009-10-25 01:00:00 (Sun)
  63405421200, #      utc_end 2010-03-28 01:00:00 (Sun)
  63392119200, #  local_start 2009-10-25 02:00:00 (Sun)
  63405424800, #    local_end 2010-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63405421200, #    utc_start 2010-03-28 01:00:00 (Sun)
  63424170000, #      utc_end 2010-10-31 01:00:00 (Sun)
  63405428400, #  local_start 2010-03-28 03:00:00 (Sun)
  63424177200, #    local_end 2010-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63424170000, #    utc_start 2010-10-31 01:00:00 (Sun)
  63436870800, #      utc_end 2011-03-27 01:00:00 (Sun)
  63424173600, #  local_start 2010-10-31 02:00:00 (Sun)
  63436874400, #    local_end 2011-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63436870800, #    utc_start 2011-03-27 01:00:00 (Sun)
  63455619600, #      utc_end 2011-10-30 01:00:00 (Sun)
  63436878000, #  local_start 2011-03-27 03:00:00 (Sun)
  63455626800, #    local_end 2011-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63455619600, #    utc_start 2011-10-30 01:00:00 (Sun)
  63468320400, #      utc_end 2012-03-25 01:00:00 (Sun)
  63455623200, #  local_start 2011-10-30 02:00:00 (Sun)
  63468324000, #    local_end 2012-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63468320400, #    utc_start 2012-03-25 01:00:00 (Sun)
  63487069200, #      utc_end 2012-10-28 01:00:00 (Sun)
  63468327600, #  local_start 2012-03-25 03:00:00 (Sun)
  63487076400, #    local_end 2012-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63487069200, #    utc_start 2012-10-28 01:00:00 (Sun)
  63500374800, #      utc_end 2013-03-31 01:00:00 (Sun)
  63487072800, #  local_start 2012-10-28 02:00:00 (Sun)
  63500378400, #    local_end 2013-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63500374800, #    utc_start 2013-03-31 01:00:00 (Sun)
  63518518800, #      utc_end 2013-10-27 01:00:00 (Sun)
  63500382000, #  local_start 2013-03-31 03:00:00 (Sun)
  63518526000, #    local_end 2013-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63518518800, #    utc_start 2013-10-27 01:00:00 (Sun)
  63531824400, #      utc_end 2014-03-30 01:00:00 (Sun)
  63518522400, #  local_start 2013-10-27 02:00:00 (Sun)
  63531828000, #    local_end 2014-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63531824400, #    utc_start 2014-03-30 01:00:00 (Sun)
  63549968400, #      utc_end 2014-10-26 01:00:00 (Sun)
  63531831600, #  local_start 2014-03-30 03:00:00 (Sun)
  63549975600, #    local_end 2014-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63549968400, #    utc_start 2014-10-26 01:00:00 (Sun)
  63563274000, #      utc_end 2015-03-29 01:00:00 (Sun)
  63549972000, #  local_start 2014-10-26 02:00:00 (Sun)
  63563277600, #    local_end 2015-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63563274000, #    utc_start 2015-03-29 01:00:00 (Sun)
  63581418000, #      utc_end 2015-10-25 01:00:00 (Sun)
  63563281200, #  local_start 2015-03-29 03:00:00 (Sun)
  63581425200, #    local_end 2015-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63581418000, #    utc_start 2015-10-25 01:00:00 (Sun)
  63594723600, #      utc_end 2016-03-27 01:00:00 (Sun)
  63581421600, #  local_start 2015-10-25 02:00:00 (Sun)
  63594727200, #    local_end 2016-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63594723600, #    utc_start 2016-03-27 01:00:00 (Sun)
  63613472400, #      utc_end 2016-10-30 01:00:00 (Sun)
  63594730800, #  local_start 2016-03-27 03:00:00 (Sun)
  63613479600, #    local_end 2016-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63613472400, #    utc_start 2016-10-30 01:00:00 (Sun)
  63626173200, #      utc_end 2017-03-26 01:00:00 (Sun)
  63613476000, #  local_start 2016-10-30 02:00:00 (Sun)
  63626176800, #    local_end 2017-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63626173200, #    utc_start 2017-03-26 01:00:00 (Sun)
  63644922000, #      utc_end 2017-10-29 01:00:00 (Sun)
  63626180400, #  local_start 2017-03-26 03:00:00 (Sun)
  63644929200, #    local_end 2017-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63644922000, #    utc_start 2017-10-29 01:00:00 (Sun)
  63657622800, #      utc_end 2018-03-25 01:00:00 (Sun)
  63644925600, #  local_start 2017-10-29 02:00:00 (Sun)
  63657626400, #    local_end 2018-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63657622800, #    utc_start 2018-03-25 01:00:00 (Sun)
  63676371600, #      utc_end 2018-10-28 01:00:00 (Sun)
  63657630000, #  local_start 2018-03-25 03:00:00 (Sun)
  63676378800, #    local_end 2018-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63676371600, #    utc_start 2018-10-28 01:00:00 (Sun)
  63689677200, #      utc_end 2019-03-31 01:00:00 (Sun)
  63676375200, #  local_start 2018-10-28 02:00:00 (Sun)
  63689680800, #    local_end 2019-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63689677200, #    utc_start 2019-03-31 01:00:00 (Sun)
  63707821200, #      utc_end 2019-10-27 01:00:00 (Sun)
  63689684400, #  local_start 2019-03-31 03:00:00 (Sun)
  63707828400, #    local_end 2019-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63707821200, #    utc_start 2019-10-27 01:00:00 (Sun)
  63721126800, #      utc_end 2020-03-29 01:00:00 (Sun)
  63707824800, #  local_start 2019-10-27 02:00:00 (Sun)
  63721130400, #    local_end 2020-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63721126800, #    utc_start 2020-03-29 01:00:00 (Sun)
  63739270800, #      utc_end 2020-10-25 01:00:00 (Sun)
  63721134000, #  local_start 2020-03-29 03:00:00 (Sun)
  63739278000, #    local_end 2020-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63739270800, #    utc_start 2020-10-25 01:00:00 (Sun)
  63752576400, #      utc_end 2021-03-28 01:00:00 (Sun)
  63739274400, #  local_start 2020-10-25 02:00:00 (Sun)
  63752580000, #    local_end 2021-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63752576400, #    utc_start 2021-03-28 01:00:00 (Sun)
  63771325200, #      utc_end 2021-10-31 01:00:00 (Sun)
  63752583600, #  local_start 2021-03-28 03:00:00 (Sun)
  63771332400, #    local_end 2021-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63771325200, #    utc_start 2021-10-31 01:00:00 (Sun)
  63784026000, #      utc_end 2022-03-27 01:00:00 (Sun)
  63771328800, #  local_start 2021-10-31 02:00:00 (Sun)
  63784029600, #    local_end 2022-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63784026000, #    utc_start 2022-03-27 01:00:00 (Sun)
  63802774800, #      utc_end 2022-10-30 01:00:00 (Sun)
  63784033200, #  local_start 2022-03-27 03:00:00 (Sun)
  63802782000, #    local_end 2022-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63802774800, #    utc_start 2022-10-30 01:00:00 (Sun)
  63815475600, #      utc_end 2023-03-26 01:00:00 (Sun)
  63802778400, #  local_start 2022-10-30 02:00:00 (Sun)
  63815479200, #    local_end 2023-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63815475600, #    utc_start 2023-03-26 01:00:00 (Sun)
  63834224400, #      utc_end 2023-10-29 01:00:00 (Sun)
  63815482800, #  local_start 2023-03-26 03:00:00 (Sun)
  63834231600, #    local_end 2023-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63834224400, #    utc_start 2023-10-29 01:00:00 (Sun)
  63847530000, #      utc_end 2024-03-31 01:00:00 (Sun)
  63834228000, #  local_start 2023-10-29 02:00:00 (Sun)
  63847533600, #    local_end 2024-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63847530000, #    utc_start 2024-03-31 01:00:00 (Sun)
  63865674000, #      utc_end 2024-10-27 01:00:00 (Sun)
  63847537200, #  local_start 2024-03-31 03:00:00 (Sun)
  63865681200, #    local_end 2024-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63865674000, #    utc_start 2024-10-27 01:00:00 (Sun)
  63878979600, #      utc_end 2025-03-30 01:00:00 (Sun)
  63865677600, #  local_start 2024-10-27 02:00:00 (Sun)
  63878983200, #    local_end 2025-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63878979600, #    utc_start 2025-03-30 01:00:00 (Sun)
  63897123600, #      utc_end 2025-10-26 01:00:00 (Sun)
  63878986800, #  local_start 2025-03-30 03:00:00 (Sun)
  63897130800, #    local_end 2025-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63897123600, #    utc_start 2025-10-26 01:00:00 (Sun)
  63910429200, #      utc_end 2026-03-29 01:00:00 (Sun)
  63897127200, #  local_start 2025-10-26 02:00:00 (Sun)
  63910432800, #    local_end 2026-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63910429200, #    utc_start 2026-03-29 01:00:00 (Sun)
  63928573200, #      utc_end 2026-10-25 01:00:00 (Sun)
  63910436400, #  local_start 2026-03-29 03:00:00 (Sun)
  63928580400, #    local_end 2026-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63928573200, #    utc_start 2026-10-25 01:00:00 (Sun)
  63941878800, #      utc_end 2027-03-28 01:00:00 (Sun)
  63928576800, #  local_start 2026-10-25 02:00:00 (Sun)
  63941882400, #    local_end 2027-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63941878800, #    utc_start 2027-03-28 01:00:00 (Sun)
  63960627600, #      utc_end 2027-10-31 01:00:00 (Sun)
  63941886000, #  local_start 2027-03-28 03:00:00 (Sun)
  63960634800, #    local_end 2027-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63960627600, #    utc_start 2027-10-31 01:00:00 (Sun)
  63973328400, #      utc_end 2028-03-26 01:00:00 (Sun)
  63960631200, #  local_start 2027-10-31 02:00:00 (Sun)
  63973332000, #    local_end 2028-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63973328400, #    utc_start 2028-03-26 01:00:00 (Sun)
  63992077200, #      utc_end 2028-10-29 01:00:00 (Sun)
  63973335600, #  local_start 2028-03-26 03:00:00 (Sun)
  63992084400, #    local_end 2028-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63992077200, #    utc_start 2028-10-29 01:00:00 (Sun)
  64004778000, #      utc_end 2029-03-25 01:00:00 (Sun)
  63992080800, #  local_start 2028-10-29 02:00:00 (Sun)
  64004781600, #    local_end 2029-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  64004778000, #    utc_start 2029-03-25 01:00:00 (Sun)
  64023526800, #      utc_end 2029-10-28 01:00:00 (Sun)
  64004785200, #  local_start 2029-03-25 03:00:00 (Sun)
  64023534000, #    local_end 2029-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  64023526800, #    utc_start 2029-10-28 01:00:00 (Sun)
  64036832400, #      utc_end 2030-03-31 01:00:00 (Sun)
  64023530400, #  local_start 2029-10-28 02:00:00 (Sun)
  64036836000, #    local_end 2030-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  64036832400, #    utc_start 2030-03-31 01:00:00 (Sun)
  64054976400, #      utc_end 2030-10-27 01:00:00 (Sun)
  64036839600, #  local_start 2030-03-31 03:00:00 (Sun)
  64054983600, #    local_end 2030-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {83}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { 3600 }
  
  my $last_observance = bless( {
    'format' => 'CE%sT',
    'gmtoff' => '1:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 721720,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 721720,
      'utc_rd_secs' => 0,
      'utc_year' => 1978
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => 3600,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 721719,
      'local_rd_secs' => 82800,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 721719,
      'utc_rd_secs' => 82800,
      'utc_year' => 1977
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '1:00u',
      'from' => '1996',
      'in' => 'Oct',
      'letter' => '',
      'name' => 'EU',
      'offset_from_std' => 0,
      'on' => 'lastSun',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '1:00u',
      'from' => '1981',
      'in' => 'Mar',
      'letter' => 'S',
      'name' => 'EU',
      'offset_from_std' => 3600,
      'on' => 'lastSun',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_EUROPE_AMSTERDAM

    $main::fatpacked{"DateTime/TimeZone/Europe/Andorra.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_EUROPE_ANDORRA';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Europe::Andorra;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Europe::Andorra::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59958230036, #      utc_end 1900-12-31 23:53:56 (Mon)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59958230400, #    local_end 1901-01-01 00:00:00 (Tue)
  364,
  0,
  'LMT',
      ],
      [
  59958230036, #    utc_start 1900-12-31 23:53:56 (Mon)
  61401801600, #      utc_end 1946-09-30 00:00:00 (Mon)
  59958230036, #  local_start 1900-12-31 23:53:56 (Mon)
  61401801600, #    local_end 1946-09-30 00:00:00 (Mon)
  0,
  0,
  'WET',
      ],
      [
  61401801600, #    utc_start 1946-09-30 00:00:00 (Mon)
  62616762000, #      utc_end 1985-03-31 01:00:00 (Sun)
  61401805200, #  local_start 1946-09-30 01:00:00 (Mon)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62616762000, #    utc_start 1985-03-31 01:00:00 (Sun)
  62632486800, #      utc_end 1985-09-29 01:00:00 (Sun)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62632486800, #    utc_start 1985-09-29 01:00:00 (Sun)
  62648211600, #      utc_end 1986-03-30 01:00:00 (Sun)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62648211600, #    utc_start 1986-03-30 01:00:00 (Sun)
  62663936400, #      utc_end 1986-09-28 01:00:00 (Sun)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62663936400, #    utc_start 1986-09-28 01:00:00 (Sun)
  62679661200, #      utc_end 1987-03-29 01:00:00 (Sun)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62679661200, #    utc_start 1987-03-29 01:00:00 (Sun)
  62695386000, #      utc_end 1987-09-27 01:00:00 (Sun)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62695386000, #    utc_start 1987-09-27 01:00:00 (Sun)
  62711110800, #      utc_end 1988-03-27 01:00:00 (Sun)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62711110800, #    utc_start 1988-03-27 01:00:00 (Sun)
  62726835600, #      utc_end 1988-09-25 01:00:00 (Sun)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62726835600, #    utc_start 1988-09-25 01:00:00 (Sun)
  62742560400, #      utc_end 1989-03-26 01:00:00 (Sun)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62742560400, #    utc_start 1989-03-26 01:00:00 (Sun)
  62758285200, #      utc_end 1989-09-24 01:00:00 (Sun)
  62742567600, #  local_start 1989-03-26 03:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62758285200, #    utc_start 1989-09-24 01:00:00 (Sun)
  62774010000, #      utc_end 1990-03-25 01:00:00 (Sun)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62774010000, #    utc_start 1990-03-25 01:00:00 (Sun)
  62790339600, #      utc_end 1990-09-30 01:00:00 (Sun)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62790339600, #    utc_start 1990-09-30 01:00:00 (Sun)
  62806064400, #      utc_end 1991-03-31 01:00:00 (Sun)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62806064400, #    utc_start 1991-03-31 01:00:00 (Sun)
  62821789200, #      utc_end 1991-09-29 01:00:00 (Sun)
  62806071600, #  local_start 1991-03-31 03:00:00 (Sun)
  62821796400, #    local_end 1991-09-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62821789200, #    utc_start 1991-09-29 01:00:00 (Sun)
  62837514000, #      utc_end 1992-03-29 01:00:00 (Sun)
  62821792800, #  local_start 1991-09-29 02:00:00 (Sun)
  62837517600, #    local_end 1992-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62837514000, #    utc_start 1992-03-29 01:00:00 (Sun)
  62853238800, #      utc_end 1992-09-27 01:00:00 (Sun)
  62837521200, #  local_start 1992-03-29 03:00:00 (Sun)
  62853246000, #    local_end 1992-09-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62853238800, #    utc_start 1992-09-27 01:00:00 (Sun)
  62868963600, #      utc_end 1993-03-28 01:00:00 (Sun)
  62853242400, #  local_start 1992-09-27 02:00:00 (Sun)
  62868967200, #    local_end 1993-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62868963600, #    utc_start 1993-03-28 01:00:00 (Sun)
  62884688400, #      utc_end 1993-09-26 01:00:00 (Sun)
  62868970800, #  local_start 1993-03-28 03:00:00 (Sun)
  62884695600, #    local_end 1993-09-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62884688400, #    utc_start 1993-09-26 01:00:00 (Sun)
  62900413200, #      utc_end 1994-03-27 01:00:00 (Sun)
  62884692000, #  local_start 1993-09-26 02:00:00 (Sun)
  62900416800, #    local_end 1994-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62900413200, #    utc_start 1994-03-27 01:00:00 (Sun)
  62916138000, #      utc_end 1994-09-25 01:00:00 (Sun)
  62900420400, #  local_start 1994-03-27 03:00:00 (Sun)
  62916145200, #    local_end 1994-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62916138000, #    utc_start 1994-09-25 01:00:00 (Sun)
  62931862800, #      utc_end 1995-03-26 01:00:00 (Sun)
  62916141600, #  local_start 1994-09-25 02:00:00 (Sun)
  62931866400, #    local_end 1995-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62931862800, #    utc_start 1995-03-26 01:00:00 (Sun)
  62947587600, #      utc_end 1995-09-24 01:00:00 (Sun)
  62931870000, #  local_start 1995-03-26 03:00:00 (Sun)
  62947594800, #    local_end 1995-09-24 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62947587600, #    utc_start 1995-09-24 01:00:00 (Sun)
  62963917200, #      utc_end 1996-03-31 01:00:00 (Sun)
  62947591200, #  local_start 1995-09-24 02:00:00 (Sun)
  62963920800, #    local_end 1996-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62963917200, #    utc_start 1996-03-31 01:00:00 (Sun)
  62982061200, #      utc_end 1996-10-27 01:00:00 (Sun)
  62963924400, #  local_start 1996-03-31 03:00:00 (Sun)
  62982068400, #    local_end 1996-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62982061200, #    utc_start 1996-10-27 01:00:00 (Sun)
  62995366800, #      utc_end 1997-03-30 01:00:00 (Sun)
  62982064800, #  local_start 1996-10-27 02:00:00 (Sun)
  62995370400, #    local_end 1997-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62995366800, #    utc_start 1997-03-30 01:00:00 (Sun)
  63013510800, #      utc_end 1997-10-26 01:00:00 (Sun)
  62995374000, #  local_start 1997-03-30 03:00:00 (Sun)
  63013518000, #    local_end 1997-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63013510800, #    utc_start 1997-10-26 01:00:00 (Sun)
  63026816400, #      utc_end 1998-03-29 01:00:00 (Sun)
  63013514400, #  local_start 1997-10-26 02:00:00 (Sun)
  63026820000, #    local_end 1998-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63026816400, #    utc_start 1998-03-29 01:00:00 (Sun)
  63044960400, #      utc_end 1998-10-25 01:00:00 (Sun)
  63026823600, #  local_start 1998-03-29 03:00:00 (Sun)
  63044967600, #    local_end 1998-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63044960400, #    utc_start 1998-10-25 01:00:00 (Sun)
  63058266000, #      utc_end 1999-03-28 01:00:00 (Sun)
  63044964000, #  local_start 1998-10-25 02:00:00 (Sun)
  63058269600, #    local_end 1999-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63058266000, #    utc_start 1999-03-28 01:00:00 (Sun)
  63077014800, #      utc_end 1999-10-31 01:00:00 (Sun)
  63058273200, #  local_start 1999-03-28 03:00:00 (Sun)
  63077022000, #    local_end 1999-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63077014800, #    utc_start 1999-10-31 01:00:00 (Sun)
  63089715600, #      utc_end 2000-03-26 01:00:00 (Sun)
  63077018400, #  local_start 1999-10-31 02:00:00 (Sun)
  63089719200, #    local_end 2000-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63089715600, #    utc_start 2000-03-26 01:00:00 (Sun)
  63108464400, #      utc_end 2000-10-29 01:00:00 (Sun)
  63089722800, #  local_start 2000-03-26 03:00:00 (Sun)
  63108471600, #    local_end 2000-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63108464400, #    utc_start 2000-10-29 01:00:00 (Sun)
  63121165200, #      utc_end 2001-03-25 01:00:00 (Sun)
  63108468000, #  local_start 2000-10-29 02:00:00 (Sun)
  63121168800, #    local_end 2001-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63121165200, #    utc_start 2001-03-25 01:00:00 (Sun)
  63139914000, #      utc_end 2001-10-28 01:00:00 (Sun)
  63121172400, #  local_start 2001-03-25 03:00:00 (Sun)
  63139921200, #    local_end 2001-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63139914000, #    utc_start 2001-10-28 01:00:00 (Sun)
  63153219600, #      utc_end 2002-03-31 01:00:00 (Sun)
  63139917600, #  local_start 2001-10-28 02:00:00 (Sun)
  63153223200, #    local_end 2002-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63153219600, #    utc_start 2002-03-31 01:00:00 (Sun)
  63171363600, #      utc_end 2002-10-27 01:00:00 (Sun)
  63153226800, #  local_start 2002-03-31 03:00:00 (Sun)
  63171370800, #    local_end 2002-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63171363600, #    utc_start 2002-10-27 01:00:00 (Sun)
  63184669200, #      utc_end 2003-03-30 01:00:00 (Sun)
  63171367200, #  local_start 2002-10-27 02:00:00 (Sun)
  63184672800, #    local_end 2003-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63184669200, #    utc_start 2003-03-30 01:00:00 (Sun)
  63202813200, #      utc_end 2003-10-26 01:00:00 (Sun)
  63184676400, #  local_start 2003-03-30 03:00:00 (Sun)
  63202820400, #    local_end 2003-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63202813200, #    utc_start 2003-10-26 01:00:00 (Sun)
  63216118800, #      utc_end 2004-03-28 01:00:00 (Sun)
  63202816800, #  local_start 2003-10-26 02:00:00 (Sun)
  63216122400, #    local_end 2004-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63216118800, #    utc_start 2004-03-28 01:00:00 (Sun)
  63234867600, #      utc_end 2004-10-31 01:00:00 (Sun)
  63216126000, #  local_start 2004-03-28 03:00:00 (Sun)
  63234874800, #    local_end 2004-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63234867600, #    utc_start 2004-10-31 01:00:00 (Sun)
  63247568400, #      utc_end 2005-03-27 01:00:00 (Sun)
  63234871200, #  local_start 2004-10-31 02:00:00 (Sun)
  63247572000, #    local_end 2005-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63247568400, #    utc_start 2005-03-27 01:00:00 (Sun)
  63266317200, #      utc_end 2005-10-30 01:00:00 (Sun)
  63247575600, #  local_start 2005-03-27 03:00:00 (Sun)
  63266324400, #    local_end 2005-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63266317200, #    utc_start 2005-10-30 01:00:00 (Sun)
  63279018000, #      utc_end 2006-03-26 01:00:00 (Sun)
  63266320800, #  local_start 2005-10-30 02:00:00 (Sun)
  63279021600, #    local_end 2006-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63279018000, #    utc_start 2006-03-26 01:00:00 (Sun)
  63297766800, #      utc_end 2006-10-29 01:00:00 (Sun)
  63279025200, #  local_start 2006-03-26 03:00:00 (Sun)
  63297774000, #    local_end 2006-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63297766800, #    utc_start 2006-10-29 01:00:00 (Sun)
  63310467600, #      utc_end 2007-03-25 01:00:00 (Sun)
  63297770400, #  local_start 2006-10-29 02:00:00 (Sun)
  63310471200, #    local_end 2007-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63310467600, #    utc_start 2007-03-25 01:00:00 (Sun)
  63329216400, #      utc_end 2007-10-28 01:00:00 (Sun)
  63310474800, #  local_start 2007-03-25 03:00:00 (Sun)
  63329223600, #    local_end 2007-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63329216400, #    utc_start 2007-10-28 01:00:00 (Sun)
  63342522000, #      utc_end 2008-03-30 01:00:00 (Sun)
  63329220000, #  local_start 2007-10-28 02:00:00 (Sun)
  63342525600, #    local_end 2008-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63342522000, #    utc_start 2008-03-30 01:00:00 (Sun)
  63360666000, #      utc_end 2008-10-26 01:00:00 (Sun)
  63342529200, #  local_start 2008-03-30 03:00:00 (Sun)
  63360673200, #    local_end 2008-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63360666000, #    utc_start 2008-10-26 01:00:00 (Sun)
  63373971600, #      utc_end 2009-03-29 01:00:00 (Sun)
  63360669600, #  local_start 2008-10-26 02:00:00 (Sun)
  63373975200, #    local_end 2009-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63373971600, #    utc_start 2009-03-29 01:00:00 (Sun)
  63392115600, #      utc_end 2009-10-25 01:00:00 (Sun)
  63373978800, #  local_start 2009-03-29 03:00:00 (Sun)
  63392122800, #    local_end 2009-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63392115600, #    utc_start 2009-10-25 01:00:00 (Sun)
  63405421200, #      utc_end 2010-03-28 01:00:00 (Sun)
  63392119200, #  local_start 2009-10-25 02:00:00 (Sun)
  63405424800, #    local_end 2010-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63405421200, #    utc_start 2010-03-28 01:00:00 (Sun)
  63424170000, #      utc_end 2010-10-31 01:00:00 (Sun)
  63405428400, #  local_start 2010-03-28 03:00:00 (Sun)
  63424177200, #    local_end 2010-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63424170000, #    utc_start 2010-10-31 01:00:00 (Sun)
  63436870800, #      utc_end 2011-03-27 01:00:00 (Sun)
  63424173600, #  local_start 2010-10-31 02:00:00 (Sun)
  63436874400, #    local_end 2011-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63436870800, #    utc_start 2011-03-27 01:00:00 (Sun)
  63455619600, #      utc_end 2011-10-30 01:00:00 (Sun)
  63436878000, #  local_start 2011-03-27 03:00:00 (Sun)
  63455626800, #    local_end 2011-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63455619600, #    utc_start 2011-10-30 01:00:00 (Sun)
  63468320400, #      utc_end 2012-03-25 01:00:00 (Sun)
  63455623200, #  local_start 2011-10-30 02:00:00 (Sun)
  63468324000, #    local_end 2012-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63468320400, #    utc_start 2012-03-25 01:00:00 (Sun)
  63487069200, #      utc_end 2012-10-28 01:00:00 (Sun)
  63468327600, #  local_start 2012-03-25 03:00:00 (Sun)
  63487076400, #    local_end 2012-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63487069200, #    utc_start 2012-10-28 01:00:00 (Sun)
  63500374800, #      utc_end 2013-03-31 01:00:00 (Sun)
  63487072800, #  local_start 2012-10-28 02:00:00 (Sun)
  63500378400, #    local_end 2013-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63500374800, #    utc_start 2013-03-31 01:00:00 (Sun)
  63518518800, #      utc_end 2013-10-27 01:00:00 (Sun)
  63500382000, #  local_start 2013-03-31 03:00:00 (Sun)
  63518526000, #    local_end 2013-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63518518800, #    utc_start 2013-10-27 01:00:00 (Sun)
  63531824400, #      utc_end 2014-03-30 01:00:00 (Sun)
  63518522400, #  local_start 2013-10-27 02:00:00 (Sun)
  63531828000, #    local_end 2014-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63531824400, #    utc_start 2014-03-30 01:00:00 (Sun)
  63549968400, #      utc_end 2014-10-26 01:00:00 (Sun)
  63531831600, #  local_start 2014-03-30 03:00:00 (Sun)
  63549975600, #    local_end 2014-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63549968400, #    utc_start 2014-10-26 01:00:00 (Sun)
  63563274000, #      utc_end 2015-03-29 01:00:00 (Sun)
  63549972000, #  local_start 2014-10-26 02:00:00 (Sun)
  63563277600, #    local_end 2015-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63563274000, #    utc_start 2015-03-29 01:00:00 (Sun)
  63581418000, #      utc_end 2015-10-25 01:00:00 (Sun)
  63563281200, #  local_start 2015-03-29 03:00:00 (Sun)
  63581425200, #    local_end 2015-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63581418000, #    utc_start 2015-10-25 01:00:00 (Sun)
  63594723600, #      utc_end 2016-03-27 01:00:00 (Sun)
  63581421600, #  local_start 2015-10-25 02:00:00 (Sun)
  63594727200, #    local_end 2016-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63594723600, #    utc_start 2016-03-27 01:00:00 (Sun)
  63613472400, #      utc_end 2016-10-30 01:00:00 (Sun)
  63594730800, #  local_start 2016-03-27 03:00:00 (Sun)
  63613479600, #    local_end 2016-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63613472400, #    utc_start 2016-10-30 01:00:00 (Sun)
  63626173200, #      utc_end 2017-03-26 01:00:00 (Sun)
  63613476000, #  local_start 2016-10-30 02:00:00 (Sun)
  63626176800, #    local_end 2017-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63626173200, #    utc_start 2017-03-26 01:00:00 (Sun)
  63644922000, #      utc_end 2017-10-29 01:00:00 (Sun)
  63626180400, #  local_start 2017-03-26 03:00:00 (Sun)
  63644929200, #    local_end 2017-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63644922000, #    utc_start 2017-10-29 01:00:00 (Sun)
  63657622800, #      utc_end 2018-03-25 01:00:00 (Sun)
  63644925600, #  local_start 2017-10-29 02:00:00 (Sun)
  63657626400, #    local_end 2018-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63657622800, #    utc_start 2018-03-25 01:00:00 (Sun)
  63676371600, #      utc_end 2018-10-28 01:00:00 (Sun)
  63657630000, #  local_start 2018-03-25 03:00:00 (Sun)
  63676378800, #    local_end 2018-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63676371600, #    utc_start 2018-10-28 01:00:00 (Sun)
  63689677200, #      utc_end 2019-03-31 01:00:00 (Sun)
  63676375200, #  local_start 2018-10-28 02:00:00 (Sun)
  63689680800, #    local_end 2019-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63689677200, #    utc_start 2019-03-31 01:00:00 (Sun)
  63707821200, #      utc_end 2019-10-27 01:00:00 (Sun)
  63689684400, #  local_start 2019-03-31 03:00:00 (Sun)
  63707828400, #    local_end 2019-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63707821200, #    utc_start 2019-10-27 01:00:00 (Sun)
  63721126800, #      utc_end 2020-03-29 01:00:00 (Sun)
  63707824800, #  local_start 2019-10-27 02:00:00 (Sun)
  63721130400, #    local_end 2020-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63721126800, #    utc_start 2020-03-29 01:00:00 (Sun)
  63739270800, #      utc_end 2020-10-25 01:00:00 (Sun)
  63721134000, #  local_start 2020-03-29 03:00:00 (Sun)
  63739278000, #    local_end 2020-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63739270800, #    utc_start 2020-10-25 01:00:00 (Sun)
  63752576400, #      utc_end 2021-03-28 01:00:00 (Sun)
  63739274400, #  local_start 2020-10-25 02:00:00 (Sun)
  63752580000, #    local_end 2021-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63752576400, #    utc_start 2021-03-28 01:00:00 (Sun)
  63771325200, #      utc_end 2021-10-31 01:00:00 (Sun)
  63752583600, #  local_start 2021-03-28 03:00:00 (Sun)
  63771332400, #    local_end 2021-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63771325200, #    utc_start 2021-10-31 01:00:00 (Sun)
  63784026000, #      utc_end 2022-03-27 01:00:00 (Sun)
  63771328800, #  local_start 2021-10-31 02:00:00 (Sun)
  63784029600, #    local_end 2022-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63784026000, #    utc_start 2022-03-27 01:00:00 (Sun)
  63802774800, #      utc_end 2022-10-30 01:00:00 (Sun)
  63784033200, #  local_start 2022-03-27 03:00:00 (Sun)
  63802782000, #    local_end 2022-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63802774800, #    utc_start 2022-10-30 01:00:00 (Sun)
  63815475600, #      utc_end 2023-03-26 01:00:00 (Sun)
  63802778400, #  local_start 2022-10-30 02:00:00 (Sun)
  63815479200, #    local_end 2023-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63815475600, #    utc_start 2023-03-26 01:00:00 (Sun)
  63834224400, #      utc_end 2023-10-29 01:00:00 (Sun)
  63815482800, #  local_start 2023-03-26 03:00:00 (Sun)
  63834231600, #    local_end 2023-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63834224400, #    utc_start 2023-10-29 01:00:00 (Sun)
  63847530000, #      utc_end 2024-03-31 01:00:00 (Sun)
  63834228000, #  local_start 2023-10-29 02:00:00 (Sun)
  63847533600, #    local_end 2024-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63847530000, #    utc_start 2024-03-31 01:00:00 (Sun)
  63865674000, #      utc_end 2024-10-27 01:00:00 (Sun)
  63847537200, #  local_start 2024-03-31 03:00:00 (Sun)
  63865681200, #    local_end 2024-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63865674000, #    utc_start 2024-10-27 01:00:00 (Sun)
  63878979600, #      utc_end 2025-03-30 01:00:00 (Sun)
  63865677600, #  local_start 2024-10-27 02:00:00 (Sun)
  63878983200, #    local_end 2025-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63878979600, #    utc_start 2025-03-30 01:00:00 (Sun)
  63897123600, #      utc_end 2025-10-26 01:00:00 (Sun)
  63878986800, #  local_start 2025-03-30 03:00:00 (Sun)
  63897130800, #    local_end 2025-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63897123600, #    utc_start 2025-10-26 01:00:00 (Sun)
  63910429200, #      utc_end 2026-03-29 01:00:00 (Sun)
  63897127200, #  local_start 2025-10-26 02:00:00 (Sun)
  63910432800, #    local_end 2026-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63910429200, #    utc_start 2026-03-29 01:00:00 (Sun)
  63928573200, #      utc_end 2026-10-25 01:00:00 (Sun)
  63910436400, #  local_start 2026-03-29 03:00:00 (Sun)
  63928580400, #    local_end 2026-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63928573200, #    utc_start 2026-10-25 01:00:00 (Sun)
  63941878800, #      utc_end 2027-03-28 01:00:00 (Sun)
  63928576800, #  local_start 2026-10-25 02:00:00 (Sun)
  63941882400, #    local_end 2027-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63941878800, #    utc_start 2027-03-28 01:00:00 (Sun)
  63960627600, #      utc_end 2027-10-31 01:00:00 (Sun)
  63941886000, #  local_start 2027-03-28 03:00:00 (Sun)
  63960634800, #    local_end 2027-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63960627600, #    utc_start 2027-10-31 01:00:00 (Sun)
  63973328400, #      utc_end 2028-03-26 01:00:00 (Sun)
  63960631200, #  local_start 2027-10-31 02:00:00 (Sun)
  63973332000, #    local_end 2028-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63973328400, #    utc_start 2028-03-26 01:00:00 (Sun)
  63992077200, #      utc_end 2028-10-29 01:00:00 (Sun)
  63973335600, #  local_start 2028-03-26 03:00:00 (Sun)
  63992084400, #    local_end 2028-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63992077200, #    utc_start 2028-10-29 01:00:00 (Sun)
  64004778000, #      utc_end 2029-03-25 01:00:00 (Sun)
  63992080800, #  local_start 2028-10-29 02:00:00 (Sun)
  64004781600, #    local_end 2029-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  64004778000, #    utc_start 2029-03-25 01:00:00 (Sun)
  64023526800, #      utc_end 2029-10-28 01:00:00 (Sun)
  64004785200, #  local_start 2029-03-25 03:00:00 (Sun)
  64023534000, #    local_end 2029-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  64023526800, #    utc_start 2029-10-28 01:00:00 (Sun)
  64036832400, #      utc_end 2030-03-31 01:00:00 (Sun)
  64023530400, #  local_start 2029-10-28 02:00:00 (Sun)
  64036836000, #    local_end 2030-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  64036832400, #    utc_start 2030-03-31 01:00:00 (Sun)
  64054976400, #      utc_end 2030-10-27 01:00:00 (Sun)
  64036839600, #  local_start 2030-03-31 03:00:00 (Sun)
  64054983600, #    local_end 2030-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {46}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { 3600 }
  
  my $last_observance = bless( {
    'format' => 'CE%sT',
    'gmtoff' => '1:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 724731,
      'local_rd_secs' => 10800,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 724731,
      'utc_rd_secs' => 10800,
      'utc_year' => 1986
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => 3600,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 724731,
      'local_rd_secs' => 3600,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 724731,
      'utc_rd_secs' => 3600,
      'utc_year' => 1986
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '1:00u',
      'from' => '1996',
      'in' => 'Oct',
      'letter' => '',
      'name' => 'EU',
      'offset_from_std' => 0,
      'on' => 'lastSun',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '1:00u',
      'from' => '1981',
      'in' => 'Mar',
      'letter' => 'S',
      'name' => 'EU',
      'offset_from_std' => 3600,
      'on' => 'lastSun',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_EUROPE_ANDORRA

    $main::fatpacked{"DateTime/TimeZone/Europe/Astrakhan.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_EUROPE_ASTRAKHAN';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Europe::Astrakhan;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Europe::Astrakhan::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60694433268, #      utc_end 1924-04-30 20:47:48 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60694444800, #    local_end 1924-05-01 00:00:00 (Thu)
  11532,
  0,
  'LMT',
      ],
      [
  60694433268, #    utc_start 1924-04-30 20:47:48 (Wed)
  60888142800, #      utc_end 1930-06-20 21:00:00 (Fri)
  60694444068, #  local_start 1924-04-30 23:47:48 (Wed)
  60888153600, #    local_end 1930-06-21 00:00:00 (Sat)
  10800,
  0,
  '+03',
      ],
      [
  60888142800, #    utc_start 1930-06-20 21:00:00 (Fri)
  62490600000, #      utc_end 1981-03-31 20:00:00 (Tue)
  60888157200, #  local_start 1930-06-21 01:00:00 (Sat)
  62490614400, #    local_end 1981-04-01 00:00:00 (Wed)
  14400,
  0,
  '+04',
      ],
      [
  62490600000, #    utc_start 1981-03-31 20:00:00 (Tue)
  62506407600, #      utc_end 1981-09-30 19:00:00 (Wed)
  62490618000, #  local_start 1981-04-01 01:00:00 (Wed)
  62506425600, #    local_end 1981-10-01 00:00:00 (Thu)
  18000,
  1,
  '+05',
      ],
      [
  62506407600, #    utc_start 1981-09-30 19:00:00 (Wed)
  62522136000, #      utc_end 1982-03-31 20:00:00 (Wed)
  62506422000, #  local_start 1981-09-30 23:00:00 (Wed)
  62522150400, #    local_end 1982-04-01 00:00:00 (Thu)
  14400,
  0,
  '+04',
      ],
      [
  62522136000, #    utc_start 1982-03-31 20:00:00 (Wed)
  62537943600, #      utc_end 1982-09-30 19:00:00 (Thu)
  62522154000, #  local_start 1982-04-01 01:00:00 (Thu)
  62537961600, #    local_end 1982-10-01 00:00:00 (Fri)
  18000,
  1,
  '+05',
      ],
      [
  62537943600, #    utc_start 1982-09-30 19:00:00 (Thu)
  62553672000, #      utc_end 1983-03-31 20:00:00 (Thu)
  62537958000, #  local_start 1982-09-30 23:00:00 (Thu)
  62553686400, #    local_end 1983-04-01 00:00:00 (Fri)
  14400,
  0,
  '+04',
      ],
      [
  62553672000, #    utc_start 1983-03-31 20:00:00 (Thu)
  62569479600, #      utc_end 1983-09-30 19:00:00 (Fri)
  62553690000, #  local_start 1983-04-01 01:00:00 (Fri)
  62569497600, #    local_end 1983-10-01 00:00:00 (Sat)
  18000,
  1,
  '+05',
      ],
      [
  62569479600, #    utc_start 1983-09-30 19:00:00 (Fri)
  62585294400, #      utc_end 1984-03-31 20:00:00 (Sat)
  62569494000, #  local_start 1983-09-30 23:00:00 (Fri)
  62585308800, #    local_end 1984-04-01 00:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62585294400, #    utc_start 1984-03-31 20:00:00 (Sat)
  62601026400, #      utc_end 1984-09-29 22:00:00 (Sat)
  62585312400, #  local_start 1984-04-01 01:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62601026400, #    utc_start 1984-09-29 22:00:00 (Sat)
  62616751200, #      utc_end 1985-03-30 22:00:00 (Sat)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62616751200, #    utc_start 1985-03-30 22:00:00 (Sat)
  62632476000, #      utc_end 1985-09-28 22:00:00 (Sat)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62632476000, #    utc_start 1985-09-28 22:00:00 (Sat)
  62648200800, #      utc_end 1986-03-29 22:00:00 (Sat)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62648200800, #    utc_start 1986-03-29 22:00:00 (Sat)
  62663925600, #      utc_end 1986-09-27 22:00:00 (Sat)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62663925600, #    utc_start 1986-09-27 22:00:00 (Sat)
  62679650400, #      utc_end 1987-03-28 22:00:00 (Sat)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62679650400, #    utc_start 1987-03-28 22:00:00 (Sat)
  62695375200, #      utc_end 1987-09-26 22:00:00 (Sat)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62695375200, #    utc_start 1987-09-26 22:00:00 (Sat)
  62711100000, #      utc_end 1988-03-26 22:00:00 (Sat)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62711100000, #    utc_start 1988-03-26 22:00:00 (Sat)
  62726824800, #      utc_end 1988-09-24 22:00:00 (Sat)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62726824800, #    utc_start 1988-09-24 22:00:00 (Sat)
  62742549600, #      utc_end 1989-03-25 22:00:00 (Sat)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62742549600, #    utc_start 1989-03-25 22:00:00 (Sat)
  62758278000, #      utc_end 1989-09-23 23:00:00 (Sat)
  62742564000, #  local_start 1989-03-26 02:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  62758278000, #    utc_start 1989-09-23 23:00:00 (Sat)
  62774002800, #      utc_end 1990-03-24 23:00:00 (Sat)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  62774002800, #    utc_start 1990-03-24 23:00:00 (Sat)
  62790332400, #      utc_end 1990-09-29 23:00:00 (Sat)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  62790332400, #    utc_start 1990-09-29 23:00:00 (Sat)
  62806057200, #      utc_end 1991-03-30 23:00:00 (Sat)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  62806057200, #    utc_start 1991-03-30 23:00:00 (Sat)
  62837503200, #      utc_end 1992-03-28 22:00:00 (Sat)
  62806071600, #  local_start 1991-03-31 03:00:00 (Sun)
  62837517600, #    local_end 1992-03-29 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62837503200, #    utc_start 1992-03-28 22:00:00 (Sat)
  62853231600, #      utc_end 1992-09-26 23:00:00 (Sat)
  62837517600, #  local_start 1992-03-29 02:00:00 (Sun)
  62853246000, #    local_end 1992-09-27 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  62853231600, #    utc_start 1992-09-26 23:00:00 (Sat)
  62868956400, #      utc_end 1993-03-27 23:00:00 (Sat)
  62853242400, #  local_start 1992-09-27 02:00:00 (Sun)
  62868967200, #    local_end 1993-03-28 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  62868956400, #    utc_start 1993-03-27 23:00:00 (Sat)
  62884681200, #      utc_end 1993-09-25 23:00:00 (Sat)
  62868970800, #  local_start 1993-03-28 03:00:00 (Sun)
  62884695600, #    local_end 1993-09-26 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  62884681200, #    utc_start 1993-09-25 23:00:00 (Sat)
  62900406000, #      utc_end 1994-03-26 23:00:00 (Sat)
  62884692000, #  local_start 1993-09-26 02:00:00 (Sun)
  62900416800, #    local_end 1994-03-27 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  62900406000, #    utc_start 1994-03-26 23:00:00 (Sat)
  62916130800, #      utc_end 1994-09-24 23:00:00 (Sat)
  62900420400, #  local_start 1994-03-27 03:00:00 (Sun)
  62916145200, #    local_end 1994-09-25 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  62916130800, #    utc_start 1994-09-24 23:00:00 (Sat)
  62931855600, #      utc_end 1995-03-25 23:00:00 (Sat)
  62916141600, #  local_start 1994-09-25 02:00:00 (Sun)
  62931866400, #    local_end 1995-03-26 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  62931855600, #    utc_start 1995-03-25 23:00:00 (Sat)
  62947580400, #      utc_end 1995-09-23 23:00:00 (Sat)
  62931870000, #  local_start 1995-03-26 03:00:00 (Sun)
  62947594800, #    local_end 1995-09-24 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  62947580400, #    utc_start 1995-09-23 23:00:00 (Sat)
  62963910000, #      utc_end 1996-03-30 23:00:00 (Sat)
  62947591200, #  local_start 1995-09-24 02:00:00 (Sun)
  62963920800, #    local_end 1996-03-31 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  62963910000, #    utc_start 1996-03-30 23:00:00 (Sat)
  62982054000, #      utc_end 1996-10-26 23:00:00 (Sat)
  62963924400, #  local_start 1996-03-31 03:00:00 (Sun)
  62982068400, #    local_end 1996-10-27 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  62982054000, #    utc_start 1996-10-26 23:00:00 (Sat)
  62995359600, #      utc_end 1997-03-29 23:00:00 (Sat)
  62982064800, #  local_start 1996-10-27 02:00:00 (Sun)
  62995370400, #    local_end 1997-03-30 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  62995359600, #    utc_start 1997-03-29 23:00:00 (Sat)
  63013503600, #      utc_end 1997-10-25 23:00:00 (Sat)
  62995374000, #  local_start 1997-03-30 03:00:00 (Sun)
  63013518000, #    local_end 1997-10-26 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63013503600, #    utc_start 1997-10-25 23:00:00 (Sat)
  63026809200, #      utc_end 1998-03-28 23:00:00 (Sat)
  63013514400, #  local_start 1997-10-26 02:00:00 (Sun)
  63026820000, #    local_end 1998-03-29 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63026809200, #    utc_start 1998-03-28 23:00:00 (Sat)
  63044953200, #      utc_end 1998-10-24 23:00:00 (Sat)
  63026823600, #  local_start 1998-03-29 03:00:00 (Sun)
  63044967600, #    local_end 1998-10-25 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63044953200, #    utc_start 1998-10-24 23:00:00 (Sat)
  63058258800, #      utc_end 1999-03-27 23:00:00 (Sat)
  63044964000, #  local_start 1998-10-25 02:00:00 (Sun)
  63058269600, #    local_end 1999-03-28 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63058258800, #    utc_start 1999-03-27 23:00:00 (Sat)
  63077007600, #      utc_end 1999-10-30 23:00:00 (Sat)
  63058273200, #  local_start 1999-03-28 03:00:00 (Sun)
  63077022000, #    local_end 1999-10-31 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63077007600, #    utc_start 1999-10-30 23:00:00 (Sat)
  63089708400, #      utc_end 2000-03-25 23:00:00 (Sat)
  63077018400, #  local_start 1999-10-31 02:00:00 (Sun)
  63089719200, #    local_end 2000-03-26 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63089708400, #    utc_start 2000-03-25 23:00:00 (Sat)
  63108457200, #      utc_end 2000-10-28 23:00:00 (Sat)
  63089722800, #  local_start 2000-03-26 03:00:00 (Sun)
  63108471600, #    local_end 2000-10-29 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63108457200, #    utc_start 2000-10-28 23:00:00 (Sat)
  63121158000, #      utc_end 2001-03-24 23:00:00 (Sat)
  63108468000, #  local_start 2000-10-29 02:00:00 (Sun)
  63121168800, #    local_end 2001-03-25 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63121158000, #    utc_start 2001-03-24 23:00:00 (Sat)
  63139906800, #      utc_end 2001-10-27 23:00:00 (Sat)
  63121172400, #  local_start 2001-03-25 03:00:00 (Sun)
  63139921200, #    local_end 2001-10-28 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63139906800, #    utc_start 2001-10-27 23:00:00 (Sat)
  63153212400, #      utc_end 2002-03-30 23:00:00 (Sat)
  63139917600, #  local_start 2001-10-28 02:00:00 (Sun)
  63153223200, #    local_end 2002-03-31 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63153212400, #    utc_start 2002-03-30 23:00:00 (Sat)
  63171356400, #      utc_end 2002-10-26 23:00:00 (Sat)
  63153226800, #  local_start 2002-03-31 03:00:00 (Sun)
  63171370800, #    local_end 2002-10-27 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63171356400, #    utc_start 2002-10-26 23:00:00 (Sat)
  63184662000, #      utc_end 2003-03-29 23:00:00 (Sat)
  63171367200, #  local_start 2002-10-27 02:00:00 (Sun)
  63184672800, #    local_end 2003-03-30 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63184662000, #    utc_start 2003-03-29 23:00:00 (Sat)
  63202806000, #      utc_end 2003-10-25 23:00:00 (Sat)
  63184676400, #  local_start 2003-03-30 03:00:00 (Sun)
  63202820400, #    local_end 2003-10-26 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63202806000, #    utc_start 2003-10-25 23:00:00 (Sat)
  63216111600, #      utc_end 2004-03-27 23:00:00 (Sat)
  63202816800, #  local_start 2003-10-26 02:00:00 (Sun)
  63216122400, #    local_end 2004-03-28 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63216111600, #    utc_start 2004-03-27 23:00:00 (Sat)
  63234860400, #      utc_end 2004-10-30 23:00:00 (Sat)
  63216126000, #  local_start 2004-03-28 03:00:00 (Sun)
  63234874800, #    local_end 2004-10-31 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63234860400, #    utc_start 2004-10-30 23:00:00 (Sat)
  63247561200, #      utc_end 2005-03-26 23:00:00 (Sat)
  63234871200, #  local_start 2004-10-31 02:00:00 (Sun)
  63247572000, #    local_end 2005-03-27 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63247561200, #    utc_start 2005-03-26 23:00:00 (Sat)
  63266310000, #      utc_end 2005-10-29 23:00:00 (Sat)
  63247575600, #  local_start 2005-03-27 03:00:00 (Sun)
  63266324400, #    local_end 2005-10-30 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63266310000, #    utc_start 2005-10-29 23:00:00 (Sat)
  63279010800, #      utc_end 2006-03-25 23:00:00 (Sat)
  63266320800, #  local_start 2005-10-30 02:00:00 (Sun)
  63279021600, #    local_end 2006-03-26 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63279010800, #    utc_start 2006-03-25 23:00:00 (Sat)
  63297759600, #      utc_end 2006-10-28 23:00:00 (Sat)
  63279025200, #  local_start 2006-03-26 03:00:00 (Sun)
  63297774000, #    local_end 2006-10-29 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63297759600, #    utc_start 2006-10-28 23:00:00 (Sat)
  63310460400, #      utc_end 2007-03-24 23:00:00 (Sat)
  63297770400, #  local_start 2006-10-29 02:00:00 (Sun)
  63310471200, #    local_end 2007-03-25 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63310460400, #    utc_start 2007-03-24 23:00:00 (Sat)
  63329209200, #      utc_end 2007-10-27 23:00:00 (Sat)
  63310474800, #  local_start 2007-03-25 03:00:00 (Sun)
  63329223600, #    local_end 2007-10-28 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63329209200, #    utc_start 2007-10-27 23:00:00 (Sat)
  63342514800, #      utc_end 2008-03-29 23:00:00 (Sat)
  63329220000, #  local_start 2007-10-28 02:00:00 (Sun)
  63342525600, #    local_end 2008-03-30 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63342514800, #    utc_start 2008-03-29 23:00:00 (Sat)
  63360658800, #      utc_end 2008-10-25 23:00:00 (Sat)
  63342529200, #  local_start 2008-03-30 03:00:00 (Sun)
  63360673200, #    local_end 2008-10-26 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63360658800, #    utc_start 2008-10-25 23:00:00 (Sat)
  63373964400, #      utc_end 2009-03-28 23:00:00 (Sat)
  63360669600, #  local_start 2008-10-26 02:00:00 (Sun)
  63373975200, #    local_end 2009-03-29 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63373964400, #    utc_start 2009-03-28 23:00:00 (Sat)
  63392108400, #      utc_end 2009-10-24 23:00:00 (Sat)
  63373978800, #  local_start 2009-03-29 03:00:00 (Sun)
  63392122800, #    local_end 2009-10-25 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63392108400, #    utc_start 2009-10-24 23:00:00 (Sat)
  63405414000, #      utc_end 2010-03-27 23:00:00 (Sat)
  63392119200, #  local_start 2009-10-25 02:00:00 (Sun)
  63405424800, #    local_end 2010-03-28 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63405414000, #    utc_start 2010-03-27 23:00:00 (Sat)
  63424162800, #      utc_end 2010-10-30 23:00:00 (Sat)
  63405428400, #  local_start 2010-03-28 03:00:00 (Sun)
  63424177200, #    local_end 2010-10-31 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63424162800, #    utc_start 2010-10-30 23:00:00 (Sat)
  63436863600, #      utc_end 2011-03-26 23:00:00 (Sat)
  63424173600, #  local_start 2010-10-31 02:00:00 (Sun)
  63436874400, #    local_end 2011-03-27 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63436863600, #    utc_start 2011-03-26 23:00:00 (Sat)
  63549957600, #      utc_end 2014-10-25 22:00:00 (Sat)
  63436878000, #  local_start 2011-03-27 03:00:00 (Sun)
  63549972000, #    local_end 2014-10-26 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63549957600, #    utc_start 2014-10-25 22:00:00 (Sat)
  63594716400, #      utc_end 2016-03-26 23:00:00 (Sat)
  63549968400, #  local_start 2014-10-26 01:00:00 (Sun)
  63594727200, #    local_end 2016-03-27 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63594716400, #    utc_start 2016-03-26 23:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  63594730800, #  local_start 2016-03-27 03:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  14400,
  0,
  '+04',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {29}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_EUROPE_ASTRAKHAN

    $main::fatpacked{"DateTime/TimeZone/Europe/Athens.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_EUROPE_ATHENS';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Europe::Athens;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Europe::Athens::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59791040708, #      utc_end 1895-09-13 22:25:08 (Fri)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59791046400, #    local_end 1895-09-14 00:00:00 (Sat)
  5692,
  0,
  'LMT',
      ],
      [
  59791040708, #    utc_start 1895-09-13 22:25:08 (Fri)
  60449581568, #      utc_end 1916-07-27 22:26:08 (Thu)
  59791046400, #  local_start 1895-09-14 00:00:00 (Sat)
  60449587260, #    local_end 1916-07-28 00:01:00 (Fri)
  5692,
  0,
  'AMT',
      ],
      [
  60449581568, #    utc_start 1916-07-27 22:26:08 (Thu)
  60952687200, #      utc_end 1932-07-06 22:00:00 (Wed)
  60449588768, #  local_start 1916-07-28 00:26:08 (Fri)
  60952694400, #    local_end 1932-07-07 00:00:00 (Thu)
  7200,
  0,
  'EET',
      ],
      [
  60952687200, #    utc_start 1932-07-06 22:00:00 (Wed)
  60957522000, #      utc_end 1932-08-31 21:00:00 (Wed)
  60952698000, #  local_start 1932-07-07 01:00:00 (Thu)
  60957532800, #    local_end 1932-09-01 00:00:00 (Thu)
  10800,
  1,
  'EEST',
      ],
      [
  60957522000, #    utc_start 1932-08-31 21:00:00 (Wed)
  61228821600, #      utc_end 1941-04-06 22:00:00 (Sun)
  60957529200, #  local_start 1932-08-31 23:00:00 (Wed)
  61228828800, #    local_end 1941-04-07 00:00:00 (Mon)
  7200,
  0,
  'EET',
      ],
      [
  61228821600, #    utc_start 1941-04-06 22:00:00 (Sun)
  61230805200, #      utc_end 1941-04-29 21:00:00 (Tue)
  61228832400, #  local_start 1941-04-07 01:00:00 (Mon)
  61230816000, #    local_end 1941-04-30 00:00:00 (Wed)
  10800,
  1,
  'EEST',
      ],
      [
  61230805200, #    utc_start 1941-04-29 21:00:00 (Tue)
  61278426000, #      utc_end 1942-11-02 01:00:00 (Mon)
  61230812400, #  local_start 1941-04-29 23:00:00 (Tue)
  61278433200, #    local_end 1942-11-02 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61278426000, #    utc_start 1942-11-02 01:00:00 (Mon)
  61291206000, #      utc_end 1943-03-29 23:00:00 (Mon)
  61278429600, #  local_start 1942-11-02 02:00:00 (Mon)
  61291209600, #    local_end 1943-03-30 00:00:00 (Tue)
  3600,
  0,
  'CET',
      ],
      [
  61291206000, #    utc_start 1943-03-29 23:00:00 (Mon)
  61307445600, #      utc_end 1943-10-03 22:00:00 (Sun)
  61291213200, #  local_start 1943-03-30 01:00:00 (Tue)
  61307452800, #    local_end 1943-10-04 00:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61307445600, #    utc_start 1943-10-03 22:00:00 (Sun)
  61323260400, #      utc_end 1944-04-03 23:00:00 (Mon)
  61307449200, #  local_start 1943-10-03 23:00:00 (Sun)
  61323264000, #    local_end 1944-04-04 00:00:00 (Tue)
  3600,
  0,
  'CET',
      ],
      [
  61323260400, #    utc_start 1944-04-03 23:00:00 (Mon)
  61583320800, #      utc_end 1952-06-30 22:00:00 (Mon)
  61323267600, #  local_start 1944-04-04 01:00:00 (Tue)
  61583328000, #    local_end 1952-07-01 00:00:00 (Tue)
  7200,
  0,
  'EET',
      ],
      [
  61583320800, #    utc_start 1952-06-30 22:00:00 (Mon)
  61594030800, #      utc_end 1952-11-01 21:00:00 (Sat)
  61583331600, #  local_start 1952-07-01 01:00:00 (Tue)
  61594041600, #    local_end 1952-11-02 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  61594030800, #    utc_start 1952-11-01 21:00:00 (Sat)
  62302168800, #      utc_end 1975-04-11 22:00:00 (Fri)
  61594038000, #  local_start 1952-11-01 23:00:00 (Sat)
  62302176000, #    local_end 1975-04-12 00:00:00 (Sat)
  7200,
  0,
  'EET',
      ],
      [
  62302168800, #    utc_start 1975-04-11 22:00:00 (Fri)
  62321868000, #      utc_end 1975-11-25 22:00:00 (Tue)
  62302179600, #  local_start 1975-04-12 01:00:00 (Sat)
  62321878800, #    local_end 1975-11-26 01:00:00 (Wed)
  10800,
  1,
  'EEST',
      ],
      [
  62321868000, #    utc_start 1975-11-25 22:00:00 (Tue)
  62333712000, #      utc_end 1976-04-11 00:00:00 (Sun)
  62321875200, #  local_start 1975-11-26 00:00:00 (Wed)
  62333719200, #    local_end 1976-04-11 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62333712000, #    utc_start 1976-04-11 00:00:00 (Sun)
  62349436800, #      utc_end 1976-10-10 00:00:00 (Sun)
  62333722800, #  local_start 1976-04-11 03:00:00 (Sun)
  62349447600, #    local_end 1976-10-10 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62349436800, #    utc_start 1976-10-10 00:00:00 (Sun)
  62364556800, #      utc_end 1977-04-03 00:00:00 (Sun)
  62349444000, #  local_start 1976-10-10 02:00:00 (Sun)
  62364564000, #    local_end 1977-04-03 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62364556800, #    utc_start 1977-04-03 00:00:00 (Sun)
  62379763200, #      utc_end 1977-09-26 00:00:00 (Mon)
  62364567600, #  local_start 1977-04-03 03:00:00 (Sun)
  62379774000, #    local_end 1977-09-26 03:00:00 (Mon)
  10800,
  1,
  'EEST',
      ],
      [
  62379763200, #    utc_start 1977-09-26 00:00:00 (Mon)
  62396006400, #      utc_end 1978-04-02 00:00:00 (Sun)
  62379770400, #  local_start 1977-09-26 02:00:00 (Mon)
  62396013600, #    local_end 1978-04-02 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62396006400, #    utc_start 1978-04-02 00:00:00 (Sun)
  62411130000, #      utc_end 1978-09-24 01:00:00 (Sun)
  62396017200, #  local_start 1978-04-02 03:00:00 (Sun)
  62411140800, #    local_end 1978-09-24 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62411130000, #    utc_start 1978-09-24 01:00:00 (Sun)
  62427481200, #      utc_end 1979-04-01 07:00:00 (Sun)
  62411137200, #  local_start 1978-09-24 03:00:00 (Sun)
  62427488400, #    local_end 1979-04-01 09:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62427481200, #    utc_start 1979-04-01 07:00:00 (Sun)
  62443090800, #      utc_end 1979-09-28 23:00:00 (Fri)
  62427492000, #  local_start 1979-04-01 10:00:00 (Sun)
  62443101600, #    local_end 1979-09-29 02:00:00 (Sat)
  10800,
  1,
  'EEST',
      ],
      [
  62443090800, #    utc_start 1979-09-28 23:00:00 (Fri)
  62459071200, #      utc_end 1980-03-31 22:00:00 (Mon)
  62443098000, #  local_start 1979-09-29 01:00:00 (Sat)
  62459078400, #    local_end 1980-04-01 00:00:00 (Tue)
  7200,
  0,
  'EET',
      ],
      [
  62459071200, #    utc_start 1980-03-31 22:00:00 (Mon)
  62474619600, #      utc_end 1980-09-27 21:00:00 (Sat)
  62459082000, #  local_start 1980-04-01 01:00:00 (Tue)
  62474630400, #    local_end 1980-09-28 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62474619600, #    utc_start 1980-09-27 21:00:00 (Sat)
  62482831200, #      utc_end 1980-12-31 22:00:00 (Wed)
  62474626800, #  local_start 1980-09-27 23:00:00 (Sat)
  62482838400, #    local_end 1981-01-01 00:00:00 (Thu)
  7200,
  0,
  'EET',
      ],
      [
  62482831200, #    utc_start 1980-12-31 22:00:00 (Wed)
  62490358800, #      utc_end 1981-03-29 01:00:00 (Sun)
  62482838400, #  local_start 1981-01-01 00:00:00 (Thu)
  62490366000, #    local_end 1981-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62490358800, #    utc_start 1981-03-29 01:00:00 (Sun)
  62506083600, #      utc_end 1981-09-27 01:00:00 (Sun)
  62490369600, #  local_start 1981-03-29 04:00:00 (Sun)
  62506094400, #    local_end 1981-09-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62506083600, #    utc_start 1981-09-27 01:00:00 (Sun)
  62521808400, #      utc_end 1982-03-28 01:00:00 (Sun)
  62506090800, #  local_start 1981-09-27 03:00:00 (Sun)
  62521815600, #    local_end 1982-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62521808400, #    utc_start 1982-03-28 01:00:00 (Sun)
  62537533200, #      utc_end 1982-09-26 01:00:00 (Sun)
  62521819200, #  local_start 1982-03-28 04:00:00 (Sun)
  62537544000, #    local_end 1982-09-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62537533200, #    utc_start 1982-09-26 01:00:00 (Sun)
  62553258000, #      utc_end 1983-03-27 01:00:00 (Sun)
  62537540400, #  local_start 1982-09-26 03:00:00 (Sun)
  62553265200, #    local_end 1983-03-27 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62553258000, #    utc_start 1983-03-27 01:00:00 (Sun)
  62568982800, #      utc_end 1983-09-25 01:00:00 (Sun)
  62553268800, #  local_start 1983-03-27 04:00:00 (Sun)
  62568993600, #    local_end 1983-09-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62568982800, #    utc_start 1983-09-25 01:00:00 (Sun)
  62584707600, #      utc_end 1984-03-25 01:00:00 (Sun)
  62568990000, #  local_start 1983-09-25 03:00:00 (Sun)
  62584714800, #    local_end 1984-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62584707600, #    utc_start 1984-03-25 01:00:00 (Sun)
  62601037200, #      utc_end 1984-09-30 01:00:00 (Sun)
  62584718400, #  local_start 1984-03-25 04:00:00 (Sun)
  62601048000, #    local_end 1984-09-30 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62601037200, #    utc_start 1984-09-30 01:00:00 (Sun)
  62616762000, #      utc_end 1985-03-31 01:00:00 (Sun)
  62601044400, #  local_start 1984-09-30 03:00:00 (Sun)
  62616769200, #    local_end 1985-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62616762000, #    utc_start 1985-03-31 01:00:00 (Sun)
  62632486800, #      utc_end 1985-09-29 01:00:00 (Sun)
  62616772800, #  local_start 1985-03-31 04:00:00 (Sun)
  62632497600, #    local_end 1985-09-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62632486800, #    utc_start 1985-09-29 01:00:00 (Sun)
  62648211600, #      utc_end 1986-03-30 01:00:00 (Sun)
  62632494000, #  local_start 1985-09-29 03:00:00 (Sun)
  62648218800, #    local_end 1986-03-30 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62648211600, #    utc_start 1986-03-30 01:00:00 (Sun)
  62663936400, #      utc_end 1986-09-28 01:00:00 (Sun)
  62648222400, #  local_start 1986-03-30 04:00:00 (Sun)
  62663947200, #    local_end 1986-09-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62663936400, #    utc_start 1986-09-28 01:00:00 (Sun)
  62679661200, #      utc_end 1987-03-29 01:00:00 (Sun)
  62663943600, #  local_start 1986-09-28 03:00:00 (Sun)
  62679668400, #    local_end 1987-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62679661200, #    utc_start 1987-03-29 01:00:00 (Sun)
  62695386000, #      utc_end 1987-09-27 01:00:00 (Sun)
  62679672000, #  local_start 1987-03-29 04:00:00 (Sun)
  62695396800, #    local_end 1987-09-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62695386000, #    utc_start 1987-09-27 01:00:00 (Sun)
  62711110800, #      utc_end 1988-03-27 01:00:00 (Sun)
  62695393200, #  local_start 1987-09-27 03:00:00 (Sun)
  62711118000, #    local_end 1988-03-27 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62711110800, #    utc_start 1988-03-27 01:00:00 (Sun)
  62726835600, #      utc_end 1988-09-25 01:00:00 (Sun)
  62711121600, #  local_start 1988-03-27 04:00:00 (Sun)
  62726846400, #    local_end 1988-09-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62726835600, #    utc_start 1988-09-25 01:00:00 (Sun)
  62742560400, #      utc_end 1989-03-26 01:00:00 (Sun)
  62726842800, #  local_start 1988-09-25 03:00:00 (Sun)
  62742567600, #    local_end 1989-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62742560400, #    utc_start 1989-03-26 01:00:00 (Sun)
  62758285200, #      utc_end 1989-09-24 01:00:00 (Sun)
  62742571200, #  local_start 1989-03-26 04:00:00 (Sun)
  62758296000, #    local_end 1989-09-24 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62758285200, #    utc_start 1989-09-24 01:00:00 (Sun)
  62774010000, #      utc_end 1990-03-25 01:00:00 (Sun)
  62758292400, #  local_start 1989-09-24 03:00:00 (Sun)
  62774017200, #    local_end 1990-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62774010000, #    utc_start 1990-03-25 01:00:00 (Sun)
  62790339600, #      utc_end 1990-09-30 01:00:00 (Sun)
  62774020800, #  local_start 1990-03-25 04:00:00 (Sun)
  62790350400, #    local_end 1990-09-30 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62790339600, #    utc_start 1990-09-30 01:00:00 (Sun)
  62806064400, #      utc_end 1991-03-31 01:00:00 (Sun)
  62790346800, #  local_start 1990-09-30 03:00:00 (Sun)
  62806071600, #    local_end 1991-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62806064400, #    utc_start 1991-03-31 01:00:00 (Sun)
  62821789200, #      utc_end 1991-09-29 01:00:00 (Sun)
  62806075200, #  local_start 1991-03-31 04:00:00 (Sun)
  62821800000, #    local_end 1991-09-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62821789200, #    utc_start 1991-09-29 01:00:00 (Sun)
  62837514000, #      utc_end 1992-03-29 01:00:00 (Sun)
  62821796400, #  local_start 1991-09-29 03:00:00 (Sun)
  62837521200, #    local_end 1992-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62837514000, #    utc_start 1992-03-29 01:00:00 (Sun)
  62853238800, #      utc_end 1992-09-27 01:00:00 (Sun)
  62837524800, #  local_start 1992-03-29 04:00:00 (Sun)
  62853249600, #    local_end 1992-09-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62853238800, #    utc_start 1992-09-27 01:00:00 (Sun)
  62868963600, #      utc_end 1993-03-28 01:00:00 (Sun)
  62853246000, #  local_start 1992-09-27 03:00:00 (Sun)
  62868970800, #    local_end 1993-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62868963600, #    utc_start 1993-03-28 01:00:00 (Sun)
  62884688400, #      utc_end 1993-09-26 01:00:00 (Sun)
  62868974400, #  local_start 1993-03-28 04:00:00 (Sun)
  62884699200, #    local_end 1993-09-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62884688400, #    utc_start 1993-09-26 01:00:00 (Sun)
  62900413200, #      utc_end 1994-03-27 01:00:00 (Sun)
  62884695600, #  local_start 1993-09-26 03:00:00 (Sun)
  62900420400, #    local_end 1994-03-27 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62900413200, #    utc_start 1994-03-27 01:00:00 (Sun)
  62916138000, #      utc_end 1994-09-25 01:00:00 (Sun)
  62900424000, #  local_start 1994-03-27 04:00:00 (Sun)
  62916148800, #    local_end 1994-09-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62916138000, #    utc_start 1994-09-25 01:00:00 (Sun)
  62931862800, #      utc_end 1995-03-26 01:00:00 (Sun)
  62916145200, #  local_start 1994-09-25 03:00:00 (Sun)
  62931870000, #    local_end 1995-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62931862800, #    utc_start 1995-03-26 01:00:00 (Sun)
  62947587600, #      utc_end 1995-09-24 01:00:00 (Sun)
  62931873600, #  local_start 1995-03-26 04:00:00 (Sun)
  62947598400, #    local_end 1995-09-24 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62947587600, #    utc_start 1995-09-24 01:00:00 (Sun)
  62963917200, #      utc_end 1996-03-31 01:00:00 (Sun)
  62947594800, #  local_start 1995-09-24 03:00:00 (Sun)
  62963924400, #    local_end 1996-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62963917200, #    utc_start 1996-03-31 01:00:00 (Sun)
  62982061200, #      utc_end 1996-10-27 01:00:00 (Sun)
  62963928000, #  local_start 1996-03-31 04:00:00 (Sun)
  62982072000, #    local_end 1996-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62982061200, #    utc_start 1996-10-27 01:00:00 (Sun)
  62995366800, #      utc_end 1997-03-30 01:00:00 (Sun)
  62982068400, #  local_start 1996-10-27 03:00:00 (Sun)
  62995374000, #    local_end 1997-03-30 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62995366800, #    utc_start 1997-03-30 01:00:00 (Sun)
  63013510800, #      utc_end 1997-10-26 01:00:00 (Sun)
  62995377600, #  local_start 1997-03-30 04:00:00 (Sun)
  63013521600, #    local_end 1997-10-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63013510800, #    utc_start 1997-10-26 01:00:00 (Sun)
  63026816400, #      utc_end 1998-03-29 01:00:00 (Sun)
  63013518000, #  local_start 1997-10-26 03:00:00 (Sun)
  63026823600, #    local_end 1998-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63026816400, #    utc_start 1998-03-29 01:00:00 (Sun)
  63044960400, #      utc_end 1998-10-25 01:00:00 (Sun)
  63026827200, #  local_start 1998-03-29 04:00:00 (Sun)
  63044971200, #    local_end 1998-10-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63044960400, #    utc_start 1998-10-25 01:00:00 (Sun)
  63058266000, #      utc_end 1999-03-28 01:00:00 (Sun)
  63044967600, #  local_start 1998-10-25 03:00:00 (Sun)
  63058273200, #    local_end 1999-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63058266000, #    utc_start 1999-03-28 01:00:00 (Sun)
  63077014800, #      utc_end 1999-10-31 01:00:00 (Sun)
  63058276800, #  local_start 1999-03-28 04:00:00 (Sun)
  63077025600, #    local_end 1999-10-31 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63077014800, #    utc_start 1999-10-31 01:00:00 (Sun)
  63089715600, #      utc_end 2000-03-26 01:00:00 (Sun)
  63077022000, #  local_start 1999-10-31 03:00:00 (Sun)
  63089722800, #    local_end 2000-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63089715600, #    utc_start 2000-03-26 01:00:00 (Sun)
  63108464400, #      utc_end 2000-10-29 01:00:00 (Sun)
  63089726400, #  local_start 2000-03-26 04:00:00 (Sun)
  63108475200, #    local_end 2000-10-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63108464400, #    utc_start 2000-10-29 01:00:00 (Sun)
  63121165200, #      utc_end 2001-03-25 01:00:00 (Sun)
  63108471600, #  local_start 2000-10-29 03:00:00 (Sun)
  63121172400, #    local_end 2001-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63121165200, #    utc_start 2001-03-25 01:00:00 (Sun)
  63139914000, #      utc_end 2001-10-28 01:00:00 (Sun)
  63121176000, #  local_start 2001-03-25 04:00:00 (Sun)
  63139924800, #    local_end 2001-10-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63139914000, #    utc_start 2001-10-28 01:00:00 (Sun)
  63153219600, #      utc_end 2002-03-31 01:00:00 (Sun)
  63139921200, #  local_start 2001-10-28 03:00:00 (Sun)
  63153226800, #    local_end 2002-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63153219600, #    utc_start 2002-03-31 01:00:00 (Sun)
  63171363600, #      utc_end 2002-10-27 01:00:00 (Sun)
  63153230400, #  local_start 2002-03-31 04:00:00 (Sun)
  63171374400, #    local_end 2002-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63171363600, #    utc_start 2002-10-27 01:00:00 (Sun)
  63184669200, #      utc_end 2003-03-30 01:00:00 (Sun)
  63171370800, #  local_start 2002-10-27 03:00:00 (Sun)
  63184676400, #    local_end 2003-03-30 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63184669200, #    utc_start 2003-03-30 01:00:00 (Sun)
  63202813200, #      utc_end 2003-10-26 01:00:00 (Sun)
  63184680000, #  local_start 2003-03-30 04:00:00 (Sun)
  63202824000, #    local_end 2003-10-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63202813200, #    utc_start 2003-10-26 01:00:00 (Sun)
  63216118800, #      utc_end 2004-03-28 01:00:00 (Sun)
  63202820400, #  local_start 2003-10-26 03:00:00 (Sun)
  63216126000, #    local_end 2004-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63216118800, #    utc_start 2004-03-28 01:00:00 (Sun)
  63234867600, #      utc_end 2004-10-31 01:00:00 (Sun)
  63216129600, #  local_start 2004-03-28 04:00:00 (Sun)
  63234878400, #    local_end 2004-10-31 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63234867600, #    utc_start 2004-10-31 01:00:00 (Sun)
  63247568400, #      utc_end 2005-03-27 01:00:00 (Sun)
  63234874800, #  local_start 2004-10-31 03:00:00 (Sun)
  63247575600, #    local_end 2005-03-27 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63247568400, #    utc_start 2005-03-27 01:00:00 (Sun)
  63266317200, #      utc_end 2005-10-30 01:00:00 (Sun)
  63247579200, #  local_start 2005-03-27 04:00:00 (Sun)
  63266328000, #    local_end 2005-10-30 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63266317200, #    utc_start 2005-10-30 01:00:00 (Sun)
  63279018000, #      utc_end 2006-03-26 01:00:00 (Sun)
  63266324400, #  local_start 2005-10-30 03:00:00 (Sun)
  63279025200, #    local_end 2006-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63279018000, #    utc_start 2006-03-26 01:00:00 (Sun)
  63297766800, #      utc_end 2006-10-29 01:00:00 (Sun)
  63279028800, #  local_start 2006-03-26 04:00:00 (Sun)
  63297777600, #    local_end 2006-10-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63297766800, #    utc_start 2006-10-29 01:00:00 (Sun)
  63310467600, #      utc_end 2007-03-25 01:00:00 (Sun)
  63297774000, #  local_start 2006-10-29 03:00:00 (Sun)
  63310474800, #    local_end 2007-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63310467600, #    utc_start 2007-03-25 01:00:00 (Sun)
  63329216400, #      utc_end 2007-10-28 01:00:00 (Sun)
  63310478400, #  local_start 2007-03-25 04:00:00 (Sun)
  63329227200, #    local_end 2007-10-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63329216400, #    utc_start 2007-10-28 01:00:00 (Sun)
  63342522000, #      utc_end 2008-03-30 01:00:00 (Sun)
  63329223600, #  local_start 2007-10-28 03:00:00 (Sun)
  63342529200, #    local_end 2008-03-30 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63342522000, #    utc_start 2008-03-30 01:00:00 (Sun)
  63360666000, #      utc_end 2008-10-26 01:00:00 (Sun)
  63342532800, #  local_start 2008-03-30 04:00:00 (Sun)
  63360676800, #    local_end 2008-10-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63360666000, #    utc_start 2008-10-26 01:00:00 (Sun)
  63373971600, #      utc_end 2009-03-29 01:00:00 (Sun)
  63360673200, #  local_start 2008-10-26 03:00:00 (Sun)
  63373978800, #    local_end 2009-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63373971600, #    utc_start 2009-03-29 01:00:00 (Sun)
  63392115600, #      utc_end 2009-10-25 01:00:00 (Sun)
  63373982400, #  local_start 2009-03-29 04:00:00 (Sun)
  63392126400, #    local_end 2009-10-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63392115600, #    utc_start 2009-10-25 01:00:00 (Sun)
  63405421200, #      utc_end 2010-03-28 01:00:00 (Sun)
  63392122800, #  local_start 2009-10-25 03:00:00 (Sun)
  63405428400, #    local_end 2010-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63405421200, #    utc_start 2010-03-28 01:00:00 (Sun)
  63424170000, #      utc_end 2010-10-31 01:00:00 (Sun)
  63405432000, #  local_start 2010-03-28 04:00:00 (Sun)
  63424180800, #    local_end 2010-10-31 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63424170000, #    utc_start 2010-10-31 01:00:00 (Sun)
  63436870800, #      utc_end 2011-03-27 01:00:00 (Sun)
  63424177200, #  local_start 2010-10-31 03:00:00 (Sun)
  63436878000, #    local_end 2011-03-27 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63436870800, #    utc_start 2011-03-27 01:00:00 (Sun)
  63455619600, #      utc_end 2011-10-30 01:00:00 (Sun)
  63436881600, #  local_start 2011-03-27 04:00:00 (Sun)
  63455630400, #    local_end 2011-10-30 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63455619600, #    utc_start 2011-10-30 01:00:00 (Sun)
  63468320400, #      utc_end 2012-03-25 01:00:00 (Sun)
  63455626800, #  local_start 2011-10-30 03:00:00 (Sun)
  63468327600, #    local_end 2012-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63468320400, #    utc_start 2012-03-25 01:00:00 (Sun)
  63487069200, #      utc_end 2012-10-28 01:00:00 (Sun)
  63468331200, #  local_start 2012-03-25 04:00:00 (Sun)
  63487080000, #    local_end 2012-10-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63487069200, #    utc_start 2012-10-28 01:00:00 (Sun)
  63500374800, #      utc_end 2013-03-31 01:00:00 (Sun)
  63487076400, #  local_start 2012-10-28 03:00:00 (Sun)
  63500382000, #    local_end 2013-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63500374800, #    utc_start 2013-03-31 01:00:00 (Sun)
  63518518800, #      utc_end 2013-10-27 01:00:00 (Sun)
  63500385600, #  local_start 2013-03-31 04:00:00 (Sun)
  63518529600, #    local_end 2013-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63518518800, #    utc_start 2013-10-27 01:00:00 (Sun)
  63531824400, #      utc_end 2014-03-30 01:00:00 (Sun)
  63518526000, #  local_start 2013-10-27 03:00:00 (Sun)
  63531831600, #    local_end 2014-03-30 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63531824400, #    utc_start 2014-03-30 01:00:00 (Sun)
  63549968400, #      utc_end 2014-10-26 01:00:00 (Sun)
  63531835200, #  local_start 2014-03-30 04:00:00 (Sun)
  63549979200, #    local_end 2014-10-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63549968400, #    utc_start 2014-10-26 01:00:00 (Sun)
  63563274000, #      utc_end 2015-03-29 01:00:00 (Sun)
  63549975600, #  local_start 2014-10-26 03:00:00 (Sun)
  63563281200, #    local_end 2015-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63563274000, #    utc_start 2015-03-29 01:00:00 (Sun)
  63581418000, #      utc_end 2015-10-25 01:00:00 (Sun)
  63563284800, #  local_start 2015-03-29 04:00:00 (Sun)
  63581428800, #    local_end 2015-10-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63581418000, #    utc_start 2015-10-25 01:00:00 (Sun)
  63594723600, #      utc_end 2016-03-27 01:00:00 (Sun)
  63581425200, #  local_start 2015-10-25 03:00:00 (Sun)
  63594730800, #    local_end 2016-03-27 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63594723600, #    utc_start 2016-03-27 01:00:00 (Sun)
  63613472400, #      utc_end 2016-10-30 01:00:00 (Sun)
  63594734400, #  local_start 2016-03-27 04:00:00 (Sun)
  63613483200, #    local_end 2016-10-30 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63613472400, #    utc_start 2016-10-30 01:00:00 (Sun)
  63626173200, #      utc_end 2017-03-26 01:00:00 (Sun)
  63613479600, #  local_start 2016-10-30 03:00:00 (Sun)
  63626180400, #    local_end 2017-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63626173200, #    utc_start 2017-03-26 01:00:00 (Sun)
  63644922000, #      utc_end 2017-10-29 01:00:00 (Sun)
  63626184000, #  local_start 2017-03-26 04:00:00 (Sun)
  63644932800, #    local_end 2017-10-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63644922000, #    utc_start 2017-10-29 01:00:00 (Sun)
  63657622800, #      utc_end 2018-03-25 01:00:00 (Sun)
  63644929200, #  local_start 2017-10-29 03:00:00 (Sun)
  63657630000, #    local_end 2018-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63657622800, #    utc_start 2018-03-25 01:00:00 (Sun)
  63676371600, #      utc_end 2018-10-28 01:00:00 (Sun)
  63657633600, #  local_start 2018-03-25 04:00:00 (Sun)
  63676382400, #    local_end 2018-10-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63676371600, #    utc_start 2018-10-28 01:00:00 (Sun)
  63689677200, #      utc_end 2019-03-31 01:00:00 (Sun)
  63676378800, #  local_start 2018-10-28 03:00:00 (Sun)
  63689684400, #    local_end 2019-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63689677200, #    utc_start 2019-03-31 01:00:00 (Sun)
  63707821200, #      utc_end 2019-10-27 01:00:00 (Sun)
  63689688000, #  local_start 2019-03-31 04:00:00 (Sun)
  63707832000, #    local_end 2019-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63707821200, #    utc_start 2019-10-27 01:00:00 (Sun)
  63721126800, #      utc_end 2020-03-29 01:00:00 (Sun)
  63707828400, #  local_start 2019-10-27 03:00:00 (Sun)
  63721134000, #    local_end 2020-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63721126800, #    utc_start 2020-03-29 01:00:00 (Sun)
  63739270800, #      utc_end 2020-10-25 01:00:00 (Sun)
  63721137600, #  local_start 2020-03-29 04:00:00 (Sun)
  63739281600, #    local_end 2020-10-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63739270800, #    utc_start 2020-10-25 01:00:00 (Sun)
  63752576400, #      utc_end 2021-03-28 01:00:00 (Sun)
  63739278000, #  local_start 2020-10-25 03:00:00 (Sun)
  63752583600, #    local_end 2021-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63752576400, #    utc_start 2021-03-28 01:00:00 (Sun)
  63771325200, #      utc_end 2021-10-31 01:00:00 (Sun)
  63752587200, #  local_start 2021-03-28 04:00:00 (Sun)
  63771336000, #    local_end 2021-10-31 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63771325200, #    utc_start 2021-10-31 01:00:00 (Sun)
  63784026000, #      utc_end 2022-03-27 01:00:00 (Sun)
  63771332400, #  local_start 2021-10-31 03:00:00 (Sun)
  63784033200, #    local_end 2022-03-27 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63784026000, #    utc_start 2022-03-27 01:00:00 (Sun)
  63802774800, #      utc_end 2022-10-30 01:00:00 (Sun)
  63784036800, #  local_start 2022-03-27 04:00:00 (Sun)
  63802785600, #    local_end 2022-10-30 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63802774800, #    utc_start 2022-10-30 01:00:00 (Sun)
  63815475600, #      utc_end 2023-03-26 01:00:00 (Sun)
  63802782000, #  local_start 2022-10-30 03:00:00 (Sun)
  63815482800, #    local_end 2023-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63815475600, #    utc_start 2023-03-26 01:00:00 (Sun)
  63834224400, #      utc_end 2023-10-29 01:00:00 (Sun)
  63815486400, #  local_start 2023-03-26 04:00:00 (Sun)
  63834235200, #    local_end 2023-10-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63834224400, #    utc_start 2023-10-29 01:00:00 (Sun)
  63847530000, #      utc_end 2024-03-31 01:00:00 (Sun)
  63834231600, #  local_start 2023-10-29 03:00:00 (Sun)
  63847537200, #    local_end 2024-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63847530000, #    utc_start 2024-03-31 01:00:00 (Sun)
  63865674000, #      utc_end 2024-10-27 01:00:00 (Sun)
  63847540800, #  local_start 2024-03-31 04:00:00 (Sun)
  63865684800, #    local_end 2024-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63865674000, #    utc_start 2024-10-27 01:00:00 (Sun)
  63878979600, #      utc_end 2025-03-30 01:00:00 (Sun)
  63865681200, #  local_start 2024-10-27 03:00:00 (Sun)
  63878986800, #    local_end 2025-03-30 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63878979600, #    utc_start 2025-03-30 01:00:00 (Sun)
  63897123600, #      utc_end 2025-10-26 01:00:00 (Sun)
  63878990400, #  local_start 2025-03-30 04:00:00 (Sun)
  63897134400, #    local_end 2025-10-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63897123600, #    utc_start 2025-10-26 01:00:00 (Sun)
  63910429200, #      utc_end 2026-03-29 01:00:00 (Sun)
  63897130800, #  local_start 2025-10-26 03:00:00 (Sun)
  63910436400, #    local_end 2026-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63910429200, #    utc_start 2026-03-29 01:00:00 (Sun)
  63928573200, #      utc_end 2026-10-25 01:00:00 (Sun)
  63910440000, #  local_start 2026-03-29 04:00:00 (Sun)
  63928584000, #    local_end 2026-10-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63928573200, #    utc_start 2026-10-25 01:00:00 (Sun)
  63941878800, #      utc_end 2027-03-28 01:00:00 (Sun)
  63928580400, #  local_start 2026-10-25 03:00:00 (Sun)
  63941886000, #    local_end 2027-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63941878800, #    utc_start 2027-03-28 01:00:00 (Sun)
  63960627600, #      utc_end 2027-10-31 01:00:00 (Sun)
  63941889600, #  local_start 2027-03-28 04:00:00 (Sun)
  63960638400, #    local_end 2027-10-31 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63960627600, #    utc_start 2027-10-31 01:00:00 (Sun)
  63973328400, #      utc_end 2028-03-26 01:00:00 (Sun)
  63960634800, #  local_start 2027-10-31 03:00:00 (Sun)
  63973335600, #    local_end 2028-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63973328400, #    utc_start 2028-03-26 01:00:00 (Sun)
  63992077200, #      utc_end 2028-10-29 01:00:00 (Sun)
  63973339200, #  local_start 2028-03-26 04:00:00 (Sun)
  63992088000, #    local_end 2028-10-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63992077200, #    utc_start 2028-10-29 01:00:00 (Sun)
  64004778000, #      utc_end 2029-03-25 01:00:00 (Sun)
  63992084400, #  local_start 2028-10-29 03:00:00 (Sun)
  64004785200, #    local_end 2029-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  64004778000, #    utc_start 2029-03-25 01:00:00 (Sun)
  64023526800, #      utc_end 2029-10-28 01:00:00 (Sun)
  64004788800, #  local_start 2029-03-25 04:00:00 (Sun)
  64023537600, #    local_end 2029-10-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  64023526800, #    utc_start 2029-10-28 01:00:00 (Sun)
  64036832400, #      utc_end 2030-03-31 01:00:00 (Sun)
  64023534000, #  local_start 2029-10-28 03:00:00 (Sun)
  64036839600, #    local_end 2030-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  64036832400, #    utc_start 2030-03-31 01:00:00 (Sun)
  64054976400, #      utc_end 2030-10-27 01:00:00 (Sun)
  64036843200, #  local_start 2030-03-31 04:00:00 (Sun)
  64054987200, #    local_end 2030-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {61}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { 7200 }
  
  my $last_observance = bless( {
    'format' => 'EE%sT',
    'gmtoff' => '2:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 723181,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 723181,
      'utc_rd_secs' => 0,
      'utc_year' => 1982
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => 7200,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 723180,
      'local_rd_secs' => 79200,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 723180,
      'utc_rd_secs' => 79200,
      'utc_year' => 1981
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '1:00u',
      'from' => '1996',
      'in' => 'Oct',
      'letter' => '',
      'name' => 'EU',
      'offset_from_std' => 0,
      'on' => 'lastSun',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '1:00u',
      'from' => '1981',
      'in' => 'Mar',
      'letter' => 'S',
      'name' => 'EU',
      'offset_from_std' => 3600,
      'on' => 'lastSun',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_EUROPE_ATHENS

    $main::fatpacked{"DateTime/TimeZone/Europe/Belgrade.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_EUROPE_BELGRADE';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Europe::Belgrade;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Europe::Belgrade::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59421767880, #      utc_end 1883-12-31 22:38:00 (Mon)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59421772800, #    local_end 1884-01-01 00:00:00 (Tue)
  4920,
  0,
  'LMT',
      ],
      [
  59421767880, #    utc_start 1883-12-31 22:38:00 (Mon)
  61229858400, #      utc_end 1941-04-18 22:00:00 (Fri)
  59421771480, #  local_start 1883-12-31 23:38:00 (Mon)
  61229862000, #    local_end 1941-04-18 23:00:00 (Fri)
  3600,
  0,
  'CET',
      ],
      [
  61229858400, #    utc_start 1941-04-18 22:00:00 (Fri)
  61278426000, #      utc_end 1942-11-02 01:00:00 (Mon)
  61229865600, #  local_start 1941-04-19 00:00:00 (Sat)
  61278433200, #    local_end 1942-11-02 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61278426000, #    utc_start 1942-11-02 01:00:00 (Mon)
  61291126800, #      utc_end 1943-03-29 01:00:00 (Mon)
  61278429600, #  local_start 1942-11-02 02:00:00 (Mon)
  61291130400, #    local_end 1943-03-29 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61291126800, #    utc_start 1943-03-29 01:00:00 (Mon)
  61307456400, #      utc_end 1943-10-04 01:00:00 (Mon)
  61291134000, #  local_start 1943-03-29 03:00:00 (Mon)
  61307463600, #    local_end 1943-10-04 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61307456400, #    utc_start 1943-10-04 01:00:00 (Mon)
  61323181200, #      utc_end 1944-04-03 01:00:00 (Mon)
  61307460000, #  local_start 1943-10-04 02:00:00 (Mon)
  61323184800, #    local_end 1944-04-03 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61323181200, #    utc_start 1944-04-03 01:00:00 (Mon)
  61338906000, #      utc_end 1944-10-02 01:00:00 (Mon)
  61323188400, #  local_start 1944-04-03 03:00:00 (Mon)
  61338913200, #    local_end 1944-10-02 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61338906000, #    utc_start 1944-10-02 01:00:00 (Mon)
  61346761200, #      utc_end 1944-12-31 23:00:00 (Sun)
  61338909600, #  local_start 1944-10-02 02:00:00 (Mon)
  61346764800, #    local_end 1945-01-01 00:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61346761200, #    utc_start 1944-12-31 23:00:00 (Sun)
  61357741200, #      utc_end 1945-05-08 01:00:00 (Tue)
  61346764800, #  local_start 1945-01-01 00:00:00 (Mon)
  61357744800, #    local_end 1945-05-08 02:00:00 (Tue)
  3600,
  0,
  'CET',
      ],
      [
  61357741200, #    utc_start 1945-05-08 01:00:00 (Tue)
  61369059600, #      utc_end 1945-09-16 01:00:00 (Sun)
  61357748400, #  local_start 1945-05-08 03:00:00 (Tue)
  61369066800, #    local_end 1945-09-16 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  61369059600, #    utc_start 1945-09-16 01:00:00 (Sun)
  62542882800, #      utc_end 1982-11-26 23:00:00 (Fri)
  61369063200, #  local_start 1945-09-16 02:00:00 (Sun)
  62542886400, #    local_end 1982-11-27 00:00:00 (Sat)
  3600,
  0,
  'CET',
      ],
      [
  62542882800, #    utc_start 1982-11-26 23:00:00 (Fri)
  62553258000, #      utc_end 1983-03-27 01:00:00 (Sun)
  62542886400, #  local_start 1982-11-27 00:00:00 (Sat)
  62553261600, #    local_end 1983-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62553258000, #    utc_start 1983-03-27 01:00:00 (Sun)
  62568982800, #      utc_end 1983-09-25 01:00:00 (Sun)
  62553265200, #  local_start 1983-03-27 03:00:00 (Sun)
  62568990000, #    local_end 1983-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62568982800, #    utc_start 1983-09-25 01:00:00 (Sun)
  62584707600, #      utc_end 1984-03-25 01:00:00 (Sun)
  62568986400, #  local_start 1983-09-25 02:00:00 (Sun)
  62584711200, #    local_end 1984-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62584707600, #    utc_start 1984-03-25 01:00:00 (Sun)
  62601037200, #      utc_end 1984-09-30 01:00:00 (Sun)
  62584714800, #  local_start 1984-03-25 03:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62601037200, #    utc_start 1984-09-30 01:00:00 (Sun)
  62616762000, #      utc_end 1985-03-31 01:00:00 (Sun)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62616762000, #    utc_start 1985-03-31 01:00:00 (Sun)
  62632486800, #      utc_end 1985-09-29 01:00:00 (Sun)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62632486800, #    utc_start 1985-09-29 01:00:00 (Sun)
  62648211600, #      utc_end 1986-03-30 01:00:00 (Sun)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62648211600, #    utc_start 1986-03-30 01:00:00 (Sun)
  62663936400, #      utc_end 1986-09-28 01:00:00 (Sun)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62663936400, #    utc_start 1986-09-28 01:00:00 (Sun)
  62679661200, #      utc_end 1987-03-29 01:00:00 (Sun)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62679661200, #    utc_start 1987-03-29 01:00:00 (Sun)
  62695386000, #      utc_end 1987-09-27 01:00:00 (Sun)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62695386000, #    utc_start 1987-09-27 01:00:00 (Sun)
  62711110800, #      utc_end 1988-03-27 01:00:00 (Sun)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62711110800, #    utc_start 1988-03-27 01:00:00 (Sun)
  62726835600, #      utc_end 1988-09-25 01:00:00 (Sun)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62726835600, #    utc_start 1988-09-25 01:00:00 (Sun)
  62742560400, #      utc_end 1989-03-26 01:00:00 (Sun)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62742560400, #    utc_start 1989-03-26 01:00:00 (Sun)
  62758285200, #      utc_end 1989-09-24 01:00:00 (Sun)
  62742567600, #  local_start 1989-03-26 03:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62758285200, #    utc_start 1989-09-24 01:00:00 (Sun)
  62774010000, #      utc_end 1990-03-25 01:00:00 (Sun)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62774010000, #    utc_start 1990-03-25 01:00:00 (Sun)
  62790339600, #      utc_end 1990-09-30 01:00:00 (Sun)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62790339600, #    utc_start 1990-09-30 01:00:00 (Sun)
  62806064400, #      utc_end 1991-03-31 01:00:00 (Sun)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62806064400, #    utc_start 1991-03-31 01:00:00 (Sun)
  62821789200, #      utc_end 1991-09-29 01:00:00 (Sun)
  62806071600, #  local_start 1991-03-31 03:00:00 (Sun)
  62821796400, #    local_end 1991-09-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62821789200, #    utc_start 1991-09-29 01:00:00 (Sun)
  62837514000, #      utc_end 1992-03-29 01:00:00 (Sun)
  62821792800, #  local_start 1991-09-29 02:00:00 (Sun)
  62837517600, #    local_end 1992-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62837514000, #    utc_start 1992-03-29 01:00:00 (Sun)
  62853238800, #      utc_end 1992-09-27 01:00:00 (Sun)
  62837521200, #  local_start 1992-03-29 03:00:00 (Sun)
  62853246000, #    local_end 1992-09-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62853238800, #    utc_start 1992-09-27 01:00:00 (Sun)
  62868963600, #      utc_end 1993-03-28 01:00:00 (Sun)
  62853242400, #  local_start 1992-09-27 02:00:00 (Sun)
  62868967200, #    local_end 1993-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62868963600, #    utc_start 1993-03-28 01:00:00 (Sun)
  62884688400, #      utc_end 1993-09-26 01:00:00 (Sun)
  62868970800, #  local_start 1993-03-28 03:00:00 (Sun)
  62884695600, #    local_end 1993-09-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62884688400, #    utc_start 1993-09-26 01:00:00 (Sun)
  62900413200, #      utc_end 1994-03-27 01:00:00 (Sun)
  62884692000, #  local_start 1993-09-26 02:00:00 (Sun)
  62900416800, #    local_end 1994-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62900413200, #    utc_start 1994-03-27 01:00:00 (Sun)
  62916138000, #      utc_end 1994-09-25 01:00:00 (Sun)
  62900420400, #  local_start 1994-03-27 03:00:00 (Sun)
  62916145200, #    local_end 1994-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62916138000, #    utc_start 1994-09-25 01:00:00 (Sun)
  62931862800, #      utc_end 1995-03-26 01:00:00 (Sun)
  62916141600, #  local_start 1994-09-25 02:00:00 (Sun)
  62931866400, #    local_end 1995-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62931862800, #    utc_start 1995-03-26 01:00:00 (Sun)
  62947587600, #      utc_end 1995-09-24 01:00:00 (Sun)
  62931870000, #  local_start 1995-03-26 03:00:00 (Sun)
  62947594800, #    local_end 1995-09-24 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62947587600, #    utc_start 1995-09-24 01:00:00 (Sun)
  62963917200, #      utc_end 1996-03-31 01:00:00 (Sun)
  62947591200, #  local_start 1995-09-24 02:00:00 (Sun)
  62963920800, #    local_end 1996-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62963917200, #    utc_start 1996-03-31 01:00:00 (Sun)
  62982061200, #      utc_end 1996-10-27 01:00:00 (Sun)
  62963924400, #  local_start 1996-03-31 03:00:00 (Sun)
  62982068400, #    local_end 1996-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62982061200, #    utc_start 1996-10-27 01:00:00 (Sun)
  62995366800, #      utc_end 1997-03-30 01:00:00 (Sun)
  62982064800, #  local_start 1996-10-27 02:00:00 (Sun)
  62995370400, #    local_end 1997-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62995366800, #    utc_start 1997-03-30 01:00:00 (Sun)
  63013510800, #      utc_end 1997-10-26 01:00:00 (Sun)
  62995374000, #  local_start 1997-03-30 03:00:00 (Sun)
  63013518000, #    local_end 1997-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63013510800, #    utc_start 1997-10-26 01:00:00 (Sun)
  63026816400, #      utc_end 1998-03-29 01:00:00 (Sun)
  63013514400, #  local_start 1997-10-26 02:00:00 (Sun)
  63026820000, #    local_end 1998-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63026816400, #    utc_start 1998-03-29 01:00:00 (Sun)
  63044960400, #      utc_end 1998-10-25 01:00:00 (Sun)
  63026823600, #  local_start 1998-03-29 03:00:00 (Sun)
  63044967600, #    local_end 1998-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63044960400, #    utc_start 1998-10-25 01:00:00 (Sun)
  63058266000, #      utc_end 1999-03-28 01:00:00 (Sun)
  63044964000, #  local_start 1998-10-25 02:00:00 (Sun)
  63058269600, #    local_end 1999-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63058266000, #    utc_start 1999-03-28 01:00:00 (Sun)
  63077014800, #      utc_end 1999-10-31 01:00:00 (Sun)
  63058273200, #  local_start 1999-03-28 03:00:00 (Sun)
  63077022000, #    local_end 1999-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63077014800, #    utc_start 1999-10-31 01:00:00 (Sun)
  63089715600, #      utc_end 2000-03-26 01:00:00 (Sun)
  63077018400, #  local_start 1999-10-31 02:00:00 (Sun)
  63089719200, #    local_end 2000-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63089715600, #    utc_start 2000-03-26 01:00:00 (Sun)
  63108464400, #      utc_end 2000-10-29 01:00:00 (Sun)
  63089722800, #  local_start 2000-03-26 03:00:00 (Sun)
  63108471600, #    local_end 2000-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63108464400, #    utc_start 2000-10-29 01:00:00 (Sun)
  63121165200, #      utc_end 2001-03-25 01:00:00 (Sun)
  63108468000, #  local_start 2000-10-29 02:00:00 (Sun)
  63121168800, #    local_end 2001-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63121165200, #    utc_start 2001-03-25 01:00:00 (Sun)
  63139914000, #      utc_end 2001-10-28 01:00:00 (Sun)
  63121172400, #  local_start 2001-03-25 03:00:00 (Sun)
  63139921200, #    local_end 2001-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63139914000, #    utc_start 2001-10-28 01:00:00 (Sun)
  63153219600, #      utc_end 2002-03-31 01:00:00 (Sun)
  63139917600, #  local_start 2001-10-28 02:00:00 (Sun)
  63153223200, #    local_end 2002-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63153219600, #    utc_start 2002-03-31 01:00:00 (Sun)
  63171363600, #      utc_end 2002-10-27 01:00:00 (Sun)
  63153226800, #  local_start 2002-03-31 03:00:00 (Sun)
  63171370800, #    local_end 2002-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63171363600, #    utc_start 2002-10-27 01:00:00 (Sun)
  63184669200, #      utc_end 2003-03-30 01:00:00 (Sun)
  63171367200, #  local_start 2002-10-27 02:00:00 (Sun)
  63184672800, #    local_end 2003-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63184669200, #    utc_start 2003-03-30 01:00:00 (Sun)
  63202813200, #      utc_end 2003-10-26 01:00:00 (Sun)
  63184676400, #  local_start 2003-03-30 03:00:00 (Sun)
  63202820400, #    local_end 2003-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63202813200, #    utc_start 2003-10-26 01:00:00 (Sun)
  63216118800, #      utc_end 2004-03-28 01:00:00 (Sun)
  63202816800, #  local_start 2003-10-26 02:00:00 (Sun)
  63216122400, #    local_end 2004-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63216118800, #    utc_start 2004-03-28 01:00:00 (Sun)
  63234867600, #      utc_end 2004-10-31 01:00:00 (Sun)
  63216126000, #  local_start 2004-03-28 03:00:00 (Sun)
  63234874800, #    local_end 2004-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63234867600, #    utc_start 2004-10-31 01:00:00 (Sun)
  63247568400, #      utc_end 2005-03-27 01:00:00 (Sun)
  63234871200, #  local_start 2004-10-31 02:00:00 (Sun)
  63247572000, #    local_end 2005-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63247568400, #    utc_start 2005-03-27 01:00:00 (Sun)
  63266317200, #      utc_end 2005-10-30 01:00:00 (Sun)
  63247575600, #  local_start 2005-03-27 03:00:00 (Sun)
  63266324400, #    local_end 2005-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63266317200, #    utc_start 2005-10-30 01:00:00 (Sun)
  63279018000, #      utc_end 2006-03-26 01:00:00 (Sun)
  63266320800, #  local_start 2005-10-30 02:00:00 (Sun)
  63279021600, #    local_end 2006-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63279018000, #    utc_start 2006-03-26 01:00:00 (Sun)
  63297766800, #      utc_end 2006-10-29 01:00:00 (Sun)
  63279025200, #  local_start 2006-03-26 03:00:00 (Sun)
  63297774000, #    local_end 2006-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63297766800, #    utc_start 2006-10-29 01:00:00 (Sun)
  63310467600, #      utc_end 2007-03-25 01:00:00 (Sun)
  63297770400, #  local_start 2006-10-29 02:00:00 (Sun)
  63310471200, #    local_end 2007-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63310467600, #    utc_start 2007-03-25 01:00:00 (Sun)
  63329216400, #      utc_end 2007-10-28 01:00:00 (Sun)
  63310474800, #  local_start 2007-03-25 03:00:00 (Sun)
  63329223600, #    local_end 2007-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63329216400, #    utc_start 2007-10-28 01:00:00 (Sun)
  63342522000, #      utc_end 2008-03-30 01:00:00 (Sun)
  63329220000, #  local_start 2007-10-28 02:00:00 (Sun)
  63342525600, #    local_end 2008-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63342522000, #    utc_start 2008-03-30 01:00:00 (Sun)
  63360666000, #      utc_end 2008-10-26 01:00:00 (Sun)
  63342529200, #  local_start 2008-03-30 03:00:00 (Sun)
  63360673200, #    local_end 2008-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63360666000, #    utc_start 2008-10-26 01:00:00 (Sun)
  63373971600, #      utc_end 2009-03-29 01:00:00 (Sun)
  63360669600, #  local_start 2008-10-26 02:00:00 (Sun)
  63373975200, #    local_end 2009-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63373971600, #    utc_start 2009-03-29 01:00:00 (Sun)
  63392115600, #      utc_end 2009-10-25 01:00:00 (Sun)
  63373978800, #  local_start 2009-03-29 03:00:00 (Sun)
  63392122800, #    local_end 2009-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63392115600, #    utc_start 2009-10-25 01:00:00 (Sun)
  63405421200, #      utc_end 2010-03-28 01:00:00 (Sun)
  63392119200, #  local_start 2009-10-25 02:00:00 (Sun)
  63405424800, #    local_end 2010-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63405421200, #    utc_start 2010-03-28 01:00:00 (Sun)
  63424170000, #      utc_end 2010-10-31 01:00:00 (Sun)
  63405428400, #  local_start 2010-03-28 03:00:00 (Sun)
  63424177200, #    local_end 2010-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63424170000, #    utc_start 2010-10-31 01:00:00 (Sun)
  63436870800, #      utc_end 2011-03-27 01:00:00 (Sun)
  63424173600, #  local_start 2010-10-31 02:00:00 (Sun)
  63436874400, #    local_end 2011-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63436870800, #    utc_start 2011-03-27 01:00:00 (Sun)
  63455619600, #      utc_end 2011-10-30 01:00:00 (Sun)
  63436878000, #  local_start 2011-03-27 03:00:00 (Sun)
  63455626800, #    local_end 2011-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63455619600, #    utc_start 2011-10-30 01:00:00 (Sun)
  63468320400, #      utc_end 2012-03-25 01:00:00 (Sun)
  63455623200, #  local_start 2011-10-30 02:00:00 (Sun)
  63468324000, #    local_end 2012-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63468320400, #    utc_start 2012-03-25 01:00:00 (Sun)
  63487069200, #      utc_end 2012-10-28 01:00:00 (Sun)
  63468327600, #  local_start 2012-03-25 03:00:00 (Sun)
  63487076400, #    local_end 2012-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63487069200, #    utc_start 2012-10-28 01:00:00 (Sun)
  63500374800, #      utc_end 2013-03-31 01:00:00 (Sun)
  63487072800, #  local_start 2012-10-28 02:00:00 (Sun)
  63500378400, #    local_end 2013-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63500374800, #    utc_start 2013-03-31 01:00:00 (Sun)
  63518518800, #      utc_end 2013-10-27 01:00:00 (Sun)
  63500382000, #  local_start 2013-03-31 03:00:00 (Sun)
  63518526000, #    local_end 2013-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63518518800, #    utc_start 2013-10-27 01:00:00 (Sun)
  63531824400, #      utc_end 2014-03-30 01:00:00 (Sun)
  63518522400, #  local_start 2013-10-27 02:00:00 (Sun)
  63531828000, #    local_end 2014-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63531824400, #    utc_start 2014-03-30 01:00:00 (Sun)
  63549968400, #      utc_end 2014-10-26 01:00:00 (Sun)
  63531831600, #  local_start 2014-03-30 03:00:00 (Sun)
  63549975600, #    local_end 2014-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63549968400, #    utc_start 2014-10-26 01:00:00 (Sun)
  63563274000, #      utc_end 2015-03-29 01:00:00 (Sun)
  63549972000, #  local_start 2014-10-26 02:00:00 (Sun)
  63563277600, #    local_end 2015-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63563274000, #    utc_start 2015-03-29 01:00:00 (Sun)
  63581418000, #      utc_end 2015-10-25 01:00:00 (Sun)
  63563281200, #  local_start 2015-03-29 03:00:00 (Sun)
  63581425200, #    local_end 2015-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63581418000, #    utc_start 2015-10-25 01:00:00 (Sun)
  63594723600, #      utc_end 2016-03-27 01:00:00 (Sun)
  63581421600, #  local_start 2015-10-25 02:00:00 (Sun)
  63594727200, #    local_end 2016-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63594723600, #    utc_start 2016-03-27 01:00:00 (Sun)
  63613472400, #      utc_end 2016-10-30 01:00:00 (Sun)
  63594730800, #  local_start 2016-03-27 03:00:00 (Sun)
  63613479600, #    local_end 2016-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63613472400, #    utc_start 2016-10-30 01:00:00 (Sun)
  63626173200, #      utc_end 2017-03-26 01:00:00 (Sun)
  63613476000, #  local_start 2016-10-30 02:00:00 (Sun)
  63626176800, #    local_end 2017-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63626173200, #    utc_start 2017-03-26 01:00:00 (Sun)
  63644922000, #      utc_end 2017-10-29 01:00:00 (Sun)
  63626180400, #  local_start 2017-03-26 03:00:00 (Sun)
  63644929200, #    local_end 2017-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63644922000, #    utc_start 2017-10-29 01:00:00 (Sun)
  63657622800, #      utc_end 2018-03-25 01:00:00 (Sun)
  63644925600, #  local_start 2017-10-29 02:00:00 (Sun)
  63657626400, #    local_end 2018-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63657622800, #    utc_start 2018-03-25 01:00:00 (Sun)
  63676371600, #      utc_end 2018-10-28 01:00:00 (Sun)
  63657630000, #  local_start 2018-03-25 03:00:00 (Sun)
  63676378800, #    local_end 2018-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63676371600, #    utc_start 2018-10-28 01:00:00 (Sun)
  63689677200, #      utc_end 2019-03-31 01:00:00 (Sun)
  63676375200, #  local_start 2018-10-28 02:00:00 (Sun)
  63689680800, #    local_end 2019-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63689677200, #    utc_start 2019-03-31 01:00:00 (Sun)
  63707821200, #      utc_end 2019-10-27 01:00:00 (Sun)
  63689684400, #  local_start 2019-03-31 03:00:00 (Sun)
  63707828400, #    local_end 2019-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63707821200, #    utc_start 2019-10-27 01:00:00 (Sun)
  63721126800, #      utc_end 2020-03-29 01:00:00 (Sun)
  63707824800, #  local_start 2019-10-27 02:00:00 (Sun)
  63721130400, #    local_end 2020-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63721126800, #    utc_start 2020-03-29 01:00:00 (Sun)
  63739270800, #      utc_end 2020-10-25 01:00:00 (Sun)
  63721134000, #  local_start 2020-03-29 03:00:00 (Sun)
  63739278000, #    local_end 2020-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63739270800, #    utc_start 2020-10-25 01:00:00 (Sun)
  63752576400, #      utc_end 2021-03-28 01:00:00 (Sun)
  63739274400, #  local_start 2020-10-25 02:00:00 (Sun)
  63752580000, #    local_end 2021-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63752576400, #    utc_start 2021-03-28 01:00:00 (Sun)
  63771325200, #      utc_end 2021-10-31 01:00:00 (Sun)
  63752583600, #  local_start 2021-03-28 03:00:00 (Sun)
  63771332400, #    local_end 2021-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63771325200, #    utc_start 2021-10-31 01:00:00 (Sun)
  63784026000, #      utc_end 2022-03-27 01:00:00 (Sun)
  63771328800, #  local_start 2021-10-31 02:00:00 (Sun)
  63784029600, #    local_end 2022-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63784026000, #    utc_start 2022-03-27 01:00:00 (Sun)
  63802774800, #      utc_end 2022-10-30 01:00:00 (Sun)
  63784033200, #  local_start 2022-03-27 03:00:00 (Sun)
  63802782000, #    local_end 2022-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63802774800, #    utc_start 2022-10-30 01:00:00 (Sun)
  63815475600, #      utc_end 2023-03-26 01:00:00 (Sun)
  63802778400, #  local_start 2022-10-30 02:00:00 (Sun)
  63815479200, #    local_end 2023-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63815475600, #    utc_start 2023-03-26 01:00:00 (Sun)
  63834224400, #      utc_end 2023-10-29 01:00:00 (Sun)
  63815482800, #  local_start 2023-03-26 03:00:00 (Sun)
  63834231600, #    local_end 2023-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63834224400, #    utc_start 2023-10-29 01:00:00 (Sun)
  63847530000, #      utc_end 2024-03-31 01:00:00 (Sun)
  63834228000, #  local_start 2023-10-29 02:00:00 (Sun)
  63847533600, #    local_end 2024-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63847530000, #    utc_start 2024-03-31 01:00:00 (Sun)
  63865674000, #      utc_end 2024-10-27 01:00:00 (Sun)
  63847537200, #  local_start 2024-03-31 03:00:00 (Sun)
  63865681200, #    local_end 2024-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63865674000, #    utc_start 2024-10-27 01:00:00 (Sun)
  63878979600, #      utc_end 2025-03-30 01:00:00 (Sun)
  63865677600, #  local_start 2024-10-27 02:00:00 (Sun)
  63878983200, #    local_end 2025-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63878979600, #    utc_start 2025-03-30 01:00:00 (Sun)
  63897123600, #      utc_end 2025-10-26 01:00:00 (Sun)
  63878986800, #  local_start 2025-03-30 03:00:00 (Sun)
  63897130800, #    local_end 2025-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63897123600, #    utc_start 2025-10-26 01:00:00 (Sun)
  63910429200, #      utc_end 2026-03-29 01:00:00 (Sun)
  63897127200, #  local_start 2025-10-26 02:00:00 (Sun)
  63910432800, #    local_end 2026-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63910429200, #    utc_start 2026-03-29 01:00:00 (Sun)
  63928573200, #      utc_end 2026-10-25 01:00:00 (Sun)
  63910436400, #  local_start 2026-03-29 03:00:00 (Sun)
  63928580400, #    local_end 2026-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63928573200, #    utc_start 2026-10-25 01:00:00 (Sun)
  63941878800, #      utc_end 2027-03-28 01:00:00 (Sun)
  63928576800, #  local_start 2026-10-25 02:00:00 (Sun)
  63941882400, #    local_end 2027-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63941878800, #    utc_start 2027-03-28 01:00:00 (Sun)
  63960627600, #      utc_end 2027-10-31 01:00:00 (Sun)
  63941886000, #  local_start 2027-03-28 03:00:00 (Sun)
  63960634800, #    local_end 2027-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63960627600, #    utc_start 2027-10-31 01:00:00 (Sun)
  63973328400, #      utc_end 2028-03-26 01:00:00 (Sun)
  63960631200, #  local_start 2027-10-31 02:00:00 (Sun)
  63973332000, #    local_end 2028-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63973328400, #    utc_start 2028-03-26 01:00:00 (Sun)
  63992077200, #      utc_end 2028-10-29 01:00:00 (Sun)
  63973335600, #  local_start 2028-03-26 03:00:00 (Sun)
  63992084400, #    local_end 2028-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63992077200, #    utc_start 2028-10-29 01:00:00 (Sun)
  64004778000, #      utc_end 2029-03-25 01:00:00 (Sun)
  63992080800, #  local_start 2028-10-29 02:00:00 (Sun)
  64004781600, #    local_end 2029-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  64004778000, #    utc_start 2029-03-25 01:00:00 (Sun)
  64023526800, #      utc_end 2029-10-28 01:00:00 (Sun)
  64004785200, #  local_start 2029-03-25 03:00:00 (Sun)
  64023534000, #    local_end 2029-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  64023526800, #    utc_start 2029-10-28 01:00:00 (Sun)
  64036832400, #      utc_end 2030-03-31 01:00:00 (Sun)
  64023530400, #  local_start 2029-10-28 02:00:00 (Sun)
  64036836000, #    local_end 2030-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  64036832400, #    utc_start 2030-03-31 01:00:00 (Sun)
  64054976400, #      utc_end 2030-10-27 01:00:00 (Sun)
  64036839600, #  local_start 2030-03-31 03:00:00 (Sun)
  64054983600, #    local_end 2030-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {52}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { 3600 }
  
  my $last_observance = bless( {
    'format' => 'CE%sT',
    'gmtoff' => '1:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 723876,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 723876,
      'utc_rd_secs' => 0,
      'utc_year' => 1983
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => 3600,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 723875,
      'local_rd_secs' => 82800,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 723875,
      'utc_rd_secs' => 82800,
      'utc_year' => 1983
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '1:00u',
      'from' => '1996',
      'in' => 'Oct',
      'letter' => '',
      'name' => 'EU',
      'offset_from_std' => 0,
      'on' => 'lastSun',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '1:00u',
      'from' => '1981',
      'in' => 'Mar',
      'letter' => 'S',
      'name' => 'EU',
      'offset_from_std' => 3600,
      'on' => 'lastSun',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_EUROPE_BELGRADE

    $main::fatpacked{"DateTime/TimeZone/Europe/Berlin.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_EUROPE_BERLIN';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Europe::Berlin;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Europe::Berlin::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59713628792, #      utc_end 1893-03-31 23:06:32 (Fri)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59713632000, #    local_end 1893-04-01 00:00:00 (Sat)
  3208,
  0,
  'LMT',
      ],
      [
  59713628792, #    utc_start 1893-03-31 23:06:32 (Fri)
  60441976800, #      utc_end 1916-04-30 22:00:00 (Sun)
  59713632392, #  local_start 1893-04-01 00:06:32 (Sat)
  60441980400, #    local_end 1916-04-30 23:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  60441976800, #    utc_start 1916-04-30 22:00:00 (Sun)
  60455199600, #      utc_end 1916-09-30 23:00:00 (Sat)
  60441984000, #  local_start 1916-05-01 00:00:00 (Mon)
  60455206800, #    local_end 1916-10-01 01:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  60455199600, #    utc_start 1916-09-30 23:00:00 (Sat)
  60472227600, #      utc_end 1917-04-16 01:00:00 (Mon)
  60455203200, #  local_start 1916-10-01 00:00:00 (Sun)
  60472231200, #    local_end 1917-04-16 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  60472227600, #    utc_start 1917-04-16 01:00:00 (Mon)
  60485533200, #      utc_end 1917-09-17 01:00:00 (Mon)
  60472234800, #  local_start 1917-04-16 03:00:00 (Mon)
  60485540400, #    local_end 1917-09-17 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  60485533200, #    utc_start 1917-09-17 01:00:00 (Mon)
  60503677200, #      utc_end 1918-04-15 01:00:00 (Mon)
  60485536800, #  local_start 1917-09-17 02:00:00 (Mon)
  60503680800, #    local_end 1918-04-15 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  60503677200, #    utc_start 1918-04-15 01:00:00 (Mon)
  60516982800, #      utc_end 1918-09-16 01:00:00 (Mon)
  60503684400, #  local_start 1918-04-15 03:00:00 (Mon)
  60516990000, #    local_end 1918-09-16 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  60516982800, #    utc_start 1918-09-16 01:00:00 (Mon)
  61196778000, #      utc_end 1940-04-01 01:00:00 (Mon)
  60516986400, #  local_start 1918-09-16 02:00:00 (Mon)
  61196781600, #    local_end 1940-04-01 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61196778000, #    utc_start 1940-04-01 01:00:00 (Mon)
  61278426000, #      utc_end 1942-11-02 01:00:00 (Mon)
  61196785200, #  local_start 1940-04-01 03:00:00 (Mon)
  61278433200, #    local_end 1942-11-02 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61278426000, #    utc_start 1942-11-02 01:00:00 (Mon)
  61291126800, #      utc_end 1943-03-29 01:00:00 (Mon)
  61278429600, #  local_start 1942-11-02 02:00:00 (Mon)
  61291130400, #    local_end 1943-03-29 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61291126800, #    utc_start 1943-03-29 01:00:00 (Mon)
  61307456400, #      utc_end 1943-10-04 01:00:00 (Mon)
  61291134000, #  local_start 1943-03-29 03:00:00 (Mon)
  61307463600, #    local_end 1943-10-04 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61307456400, #    utc_start 1943-10-04 01:00:00 (Mon)
  61323181200, #      utc_end 1944-04-03 01:00:00 (Mon)
  61307460000, #  local_start 1943-10-04 02:00:00 (Mon)
  61323184800, #    local_end 1944-04-03 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61323181200, #    utc_start 1944-04-03 01:00:00 (Mon)
  61338906000, #      utc_end 1944-10-02 01:00:00 (Mon)
  61323188400, #  local_start 1944-04-03 03:00:00 (Mon)
  61338913200, #    local_end 1944-10-02 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61338906000, #    utc_start 1944-10-02 01:00:00 (Mon)
  61354630800, #      utc_end 1945-04-02 01:00:00 (Mon)
  61338909600, #  local_start 1944-10-02 02:00:00 (Mon)
  61354634400, #    local_end 1945-04-02 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61354630800, #    utc_start 1945-04-02 01:00:00 (Mon)
  61359120000, #      utc_end 1945-05-24 00:00:00 (Thu)
  61354638000, #  local_start 1945-04-02 03:00:00 (Mon)
  61359127200, #    local_end 1945-05-24 02:00:00 (Thu)
  7200,
  1,
  'CEST',
      ],
      [
  61359120000, #    utc_start 1945-05-24 00:00:00 (Thu)
  61369747200, #      utc_end 1945-09-24 00:00:00 (Mon)
  61359130800, #  local_start 1945-05-24 03:00:00 (Thu)
  61369758000, #    local_end 1945-09-24 03:00:00 (Mon)
  10800,
  1,
  'CEMT',
      ],
      [
  61369747200, #    utc_start 1945-09-24 00:00:00 (Mon)
  61374502800, #      utc_end 1945-11-18 01:00:00 (Sun)
  61369754400, #  local_start 1945-09-24 02:00:00 (Mon)
  61374510000, #    local_end 1945-11-18 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  61374502800, #    utc_start 1945-11-18 01:00:00 (Sun)
  61378297200, #      utc_end 1945-12-31 23:00:00 (Mon)
  61374506400, #  local_start 1945-11-18 02:00:00 (Sun)
  61378300800, #    local_end 1946-01-01 00:00:00 (Tue)
  3600,
  0,
  'CET',
      ],
      [
  61378297200, #    utc_start 1945-12-31 23:00:00 (Mon)
  61387203600, #      utc_end 1946-04-14 01:00:00 (Sun)
  61378300800, #  local_start 1946-01-01 00:00:00 (Tue)
  61387207200, #    local_end 1946-04-14 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  61387203600, #    utc_start 1946-04-14 01:00:00 (Sun)
  61402410000, #      utc_end 1946-10-07 01:00:00 (Mon)
  61387210800, #  local_start 1946-04-14 03:00:00 (Sun)
  61402417200, #    local_end 1946-10-07 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61402410000, #    utc_start 1946-10-07 01:00:00 (Mon)
  61418052000, #      utc_end 1947-04-06 02:00:00 (Sun)
  61402413600, #  local_start 1946-10-07 02:00:00 (Mon)
  61418055600, #    local_end 1947-04-06 03:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  61418052000, #    utc_start 1947-04-06 02:00:00 (Sun)
  61421072400, #      utc_end 1947-05-11 01:00:00 (Sun)
  61418059200, #  local_start 1947-04-06 04:00:00 (Sun)
  61421079600, #    local_end 1947-05-11 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  61421072400, #    utc_start 1947-05-11 01:00:00 (Sun)
  61425302400, #      utc_end 1947-06-29 00:00:00 (Sun)
  61421083200, #  local_start 1947-05-11 04:00:00 (Sun)
  61425313200, #    local_end 1947-06-29 03:00:00 (Sun)
  10800,
  1,
  'CEMT',
      ],
      [
  61425302400, #    utc_start 1947-06-29 00:00:00 (Sun)
  61433773200, #      utc_end 1947-10-05 01:00:00 (Sun)
  61425309600, #  local_start 1947-06-29 02:00:00 (Sun)
  61433780400, #    local_end 1947-10-05 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  61433773200, #    utc_start 1947-10-05 01:00:00 (Sun)
  61450707600, #      utc_end 1948-04-18 01:00:00 (Sun)
  61433776800, #  local_start 1947-10-05 02:00:00 (Sun)
  61450711200, #    local_end 1948-04-18 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  61450707600, #    utc_start 1948-04-18 01:00:00 (Sun)
  61465222800, #      utc_end 1948-10-03 01:00:00 (Sun)
  61450714800, #  local_start 1948-04-18 03:00:00 (Sun)
  61465230000, #    local_end 1948-10-03 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  61465222800, #    utc_start 1948-10-03 01:00:00 (Sun)
  61481552400, #      utc_end 1949-04-10 01:00:00 (Sun)
  61465226400, #  local_start 1948-10-03 02:00:00 (Sun)
  61481556000, #    local_end 1949-04-10 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  61481552400, #    utc_start 1949-04-10 01:00:00 (Sun)
  61496672400, #      utc_end 1949-10-02 01:00:00 (Sun)
  61481559600, #  local_start 1949-04-10 03:00:00 (Sun)
  61496679600, #    local_end 1949-10-02 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  61496672400, #    utc_start 1949-10-02 01:00:00 (Sun)
  62451212400, #      utc_end 1979-12-31 23:00:00 (Mon)
  61496676000, #  local_start 1949-10-02 02:00:00 (Sun)
  62451216000, #    local_end 1980-01-01 00:00:00 (Tue)
  3600,
  0,
  'CET',
      ],
      [
  62451212400, #    utc_start 1979-12-31 23:00:00 (Mon)
  62459514000, #      utc_end 1980-04-06 01:00:00 (Sun)
  62451216000, #  local_start 1980-01-01 00:00:00 (Tue)
  62459517600, #    local_end 1980-04-06 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62459514000, #    utc_start 1980-04-06 01:00:00 (Sun)
  62474634000, #      utc_end 1980-09-28 01:00:00 (Sun)
  62459521200, #  local_start 1980-04-06 03:00:00 (Sun)
  62474641200, #    local_end 1980-09-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62474634000, #    utc_start 1980-09-28 01:00:00 (Sun)
  62490358800, #      utc_end 1981-03-29 01:00:00 (Sun)
  62474637600, #  local_start 1980-09-28 02:00:00 (Sun)
  62490362400, #    local_end 1981-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62490358800, #    utc_start 1981-03-29 01:00:00 (Sun)
  62506083600, #      utc_end 1981-09-27 01:00:00 (Sun)
  62490366000, #  local_start 1981-03-29 03:00:00 (Sun)
  62506090800, #    local_end 1981-09-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62506083600, #    utc_start 1981-09-27 01:00:00 (Sun)
  62521808400, #      utc_end 1982-03-28 01:00:00 (Sun)
  62506087200, #  local_start 1981-09-27 02:00:00 (Sun)
  62521812000, #    local_end 1982-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62521808400, #    utc_start 1982-03-28 01:00:00 (Sun)
  62537533200, #      utc_end 1982-09-26 01:00:00 (Sun)
  62521815600, #  local_start 1982-03-28 03:00:00 (Sun)
  62537540400, #    local_end 1982-09-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62537533200, #    utc_start 1982-09-26 01:00:00 (Sun)
  62553258000, #      utc_end 1983-03-27 01:00:00 (Sun)
  62537536800, #  local_start 1982-09-26 02:00:00 (Sun)
  62553261600, #    local_end 1983-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62553258000, #    utc_start 1983-03-27 01:00:00 (Sun)
  62568982800, #      utc_end 1983-09-25 01:00:00 (Sun)
  62553265200, #  local_start 1983-03-27 03:00:00 (Sun)
  62568990000, #    local_end 1983-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62568982800, #    utc_start 1983-09-25 01:00:00 (Sun)
  62584707600, #      utc_end 1984-03-25 01:00:00 (Sun)
  62568986400, #  local_start 1983-09-25 02:00:00 (Sun)
  62584711200, #    local_end 1984-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62584707600, #    utc_start 1984-03-25 01:00:00 (Sun)
  62601037200, #      utc_end 1984-09-30 01:00:00 (Sun)
  62584714800, #  local_start 1984-03-25 03:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62601037200, #    utc_start 1984-09-30 01:00:00 (Sun)
  62616762000, #      utc_end 1985-03-31 01:00:00 (Sun)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62616762000, #    utc_start 1985-03-31 01:00:00 (Sun)
  62632486800, #      utc_end 1985-09-29 01:00:00 (Sun)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62632486800, #    utc_start 1985-09-29 01:00:00 (Sun)
  62648211600, #      utc_end 1986-03-30 01:00:00 (Sun)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62648211600, #    utc_start 1986-03-30 01:00:00 (Sun)
  62663936400, #      utc_end 1986-09-28 01:00:00 (Sun)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62663936400, #    utc_start 1986-09-28 01:00:00 (Sun)
  62679661200, #      utc_end 1987-03-29 01:00:00 (Sun)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62679661200, #    utc_start 1987-03-29 01:00:00 (Sun)
  62695386000, #      utc_end 1987-09-27 01:00:00 (Sun)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62695386000, #    utc_start 1987-09-27 01:00:00 (Sun)
  62711110800, #      utc_end 1988-03-27 01:00:00 (Sun)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62711110800, #    utc_start 1988-03-27 01:00:00 (Sun)
  62726835600, #      utc_end 1988-09-25 01:00:00 (Sun)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62726835600, #    utc_start 1988-09-25 01:00:00 (Sun)
  62742560400, #      utc_end 1989-03-26 01:00:00 (Sun)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62742560400, #    utc_start 1989-03-26 01:00:00 (Sun)
  62758285200, #      utc_end 1989-09-24 01:00:00 (Sun)
  62742567600, #  local_start 1989-03-26 03:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62758285200, #    utc_start 1989-09-24 01:00:00 (Sun)
  62774010000, #      utc_end 1990-03-25 01:00:00 (Sun)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62774010000, #    utc_start 1990-03-25 01:00:00 (Sun)
  62790339600, #      utc_end 1990-09-30 01:00:00 (Sun)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62790339600, #    utc_start 1990-09-30 01:00:00 (Sun)
  62806064400, #      utc_end 1991-03-31 01:00:00 (Sun)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62806064400, #    utc_start 1991-03-31 01:00:00 (Sun)
  62821789200, #      utc_end 1991-09-29 01:00:00 (Sun)
  62806071600, #  local_start 1991-03-31 03:00:00 (Sun)
  62821796400, #    local_end 1991-09-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62821789200, #    utc_start 1991-09-29 01:00:00 (Sun)
  62837514000, #      utc_end 1992-03-29 01:00:00 (Sun)
  62821792800, #  local_start 1991-09-29 02:00:00 (Sun)
  62837517600, #    local_end 1992-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62837514000, #    utc_start 1992-03-29 01:00:00 (Sun)
  62853238800, #      utc_end 1992-09-27 01:00:00 (Sun)
  62837521200, #  local_start 1992-03-29 03:00:00 (Sun)
  62853246000, #    local_end 1992-09-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62853238800, #    utc_start 1992-09-27 01:00:00 (Sun)
  62868963600, #      utc_end 1993-03-28 01:00:00 (Sun)
  62853242400, #  local_start 1992-09-27 02:00:00 (Sun)
  62868967200, #    local_end 1993-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62868963600, #    utc_start 1993-03-28 01:00:00 (Sun)
  62884688400, #      utc_end 1993-09-26 01:00:00 (Sun)
  62868970800, #  local_start 1993-03-28 03:00:00 (Sun)
  62884695600, #    local_end 1993-09-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62884688400, #    utc_start 1993-09-26 01:00:00 (Sun)
  62900413200, #      utc_end 1994-03-27 01:00:00 (Sun)
  62884692000, #  local_start 1993-09-26 02:00:00 (Sun)
  62900416800, #    local_end 1994-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62900413200, #    utc_start 1994-03-27 01:00:00 (Sun)
  62916138000, #      utc_end 1994-09-25 01:00:00 (Sun)
  62900420400, #  local_start 1994-03-27 03:00:00 (Sun)
  62916145200, #    local_end 1994-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62916138000, #    utc_start 1994-09-25 01:00:00 (Sun)
  62931862800, #      utc_end 1995-03-26 01:00:00 (Sun)
  62916141600, #  local_start 1994-09-25 02:00:00 (Sun)
  62931866400, #    local_end 1995-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62931862800, #    utc_start 1995-03-26 01:00:00 (Sun)
  62947587600, #      utc_end 1995-09-24 01:00:00 (Sun)
  62931870000, #  local_start 1995-03-26 03:00:00 (Sun)
  62947594800, #    local_end 1995-09-24 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62947587600, #    utc_start 1995-09-24 01:00:00 (Sun)
  62963917200, #      utc_end 1996-03-31 01:00:00 (Sun)
  62947591200, #  local_start 1995-09-24 02:00:00 (Sun)
  62963920800, #    local_end 1996-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62963917200, #    utc_start 1996-03-31 01:00:00 (Sun)
  62982061200, #      utc_end 1996-10-27 01:00:00 (Sun)
  62963924400, #  local_start 1996-03-31 03:00:00 (Sun)
  62982068400, #    local_end 1996-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62982061200, #    utc_start 1996-10-27 01:00:00 (Sun)
  62995366800, #      utc_end 1997-03-30 01:00:00 (Sun)
  62982064800, #  local_start 1996-10-27 02:00:00 (Sun)
  62995370400, #    local_end 1997-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62995366800, #    utc_start 1997-03-30 01:00:00 (Sun)
  63013510800, #      utc_end 1997-10-26 01:00:00 (Sun)
  62995374000, #  local_start 1997-03-30 03:00:00 (Sun)
  63013518000, #    local_end 1997-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63013510800, #    utc_start 1997-10-26 01:00:00 (Sun)
  63026816400, #      utc_end 1998-03-29 01:00:00 (Sun)
  63013514400, #  local_start 1997-10-26 02:00:00 (Sun)
  63026820000, #    local_end 1998-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63026816400, #    utc_start 1998-03-29 01:00:00 (Sun)
  63044960400, #      utc_end 1998-10-25 01:00:00 (Sun)
  63026823600, #  local_start 1998-03-29 03:00:00 (Sun)
  63044967600, #    local_end 1998-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63044960400, #    utc_start 1998-10-25 01:00:00 (Sun)
  63058266000, #      utc_end 1999-03-28 01:00:00 (Sun)
  63044964000, #  local_start 1998-10-25 02:00:00 (Sun)
  63058269600, #    local_end 1999-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63058266000, #    utc_start 1999-03-28 01:00:00 (Sun)
  63077014800, #      utc_end 1999-10-31 01:00:00 (Sun)
  63058273200, #  local_start 1999-03-28 03:00:00 (Sun)
  63077022000, #    local_end 1999-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63077014800, #    utc_start 1999-10-31 01:00:00 (Sun)
  63089715600, #      utc_end 2000-03-26 01:00:00 (Sun)
  63077018400, #  local_start 1999-10-31 02:00:00 (Sun)
  63089719200, #    local_end 2000-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63089715600, #    utc_start 2000-03-26 01:00:00 (Sun)
  63108464400, #      utc_end 2000-10-29 01:00:00 (Sun)
  63089722800, #  local_start 2000-03-26 03:00:00 (Sun)
  63108471600, #    local_end 2000-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63108464400, #    utc_start 2000-10-29 01:00:00 (Sun)
  63121165200, #      utc_end 2001-03-25 01:00:00 (Sun)
  63108468000, #  local_start 2000-10-29 02:00:00 (Sun)
  63121168800, #    local_end 2001-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63121165200, #    utc_start 2001-03-25 01:00:00 (Sun)
  63139914000, #      utc_end 2001-10-28 01:00:00 (Sun)
  63121172400, #  local_start 2001-03-25 03:00:00 (Sun)
  63139921200, #    local_end 2001-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63139914000, #    utc_start 2001-10-28 01:00:00 (Sun)
  63153219600, #      utc_end 2002-03-31 01:00:00 (Sun)
  63139917600, #  local_start 2001-10-28 02:00:00 (Sun)
  63153223200, #    local_end 2002-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63153219600, #    utc_start 2002-03-31 01:00:00 (Sun)
  63171363600, #      utc_end 2002-10-27 01:00:00 (Sun)
  63153226800, #  local_start 2002-03-31 03:00:00 (Sun)
  63171370800, #    local_end 2002-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63171363600, #    utc_start 2002-10-27 01:00:00 (Sun)
  63184669200, #      utc_end 2003-03-30 01:00:00 (Sun)
  63171367200, #  local_start 2002-10-27 02:00:00 (Sun)
  63184672800, #    local_end 2003-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63184669200, #    utc_start 2003-03-30 01:00:00 (Sun)
  63202813200, #      utc_end 2003-10-26 01:00:00 (Sun)
  63184676400, #  local_start 2003-03-30 03:00:00 (Sun)
  63202820400, #    local_end 2003-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63202813200, #    utc_start 2003-10-26 01:00:00 (Sun)
  63216118800, #      utc_end 2004-03-28 01:00:00 (Sun)
  63202816800, #  local_start 2003-10-26 02:00:00 (Sun)
  63216122400, #    local_end 2004-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63216118800, #    utc_start 2004-03-28 01:00:00 (Sun)
  63234867600, #      utc_end 2004-10-31 01:00:00 (Sun)
  63216126000, #  local_start 2004-03-28 03:00:00 (Sun)
  63234874800, #    local_end 2004-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63234867600, #    utc_start 2004-10-31 01:00:00 (Sun)
  63247568400, #      utc_end 2005-03-27 01:00:00 (Sun)
  63234871200, #  local_start 2004-10-31 02:00:00 (Sun)
  63247572000, #    local_end 2005-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63247568400, #    utc_start 2005-03-27 01:00:00 (Sun)
  63266317200, #      utc_end 2005-10-30 01:00:00 (Sun)
  63247575600, #  local_start 2005-03-27 03:00:00 (Sun)
  63266324400, #    local_end 2005-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63266317200, #    utc_start 2005-10-30 01:00:00 (Sun)
  63279018000, #      utc_end 2006-03-26 01:00:00 (Sun)
  63266320800, #  local_start 2005-10-30 02:00:00 (Sun)
  63279021600, #    local_end 2006-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63279018000, #    utc_start 2006-03-26 01:00:00 (Sun)
  63297766800, #      utc_end 2006-10-29 01:00:00 (Sun)
  63279025200, #  local_start 2006-03-26 03:00:00 (Sun)
  63297774000, #    local_end 2006-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63297766800, #    utc_start 2006-10-29 01:00:00 (Sun)
  63310467600, #      utc_end 2007-03-25 01:00:00 (Sun)
  63297770400, #  local_start 2006-10-29 02:00:00 (Sun)
  63310471200, #    local_end 2007-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63310467600, #    utc_start 2007-03-25 01:00:00 (Sun)
  63329216400, #      utc_end 2007-10-28 01:00:00 (Sun)
  63310474800, #  local_start 2007-03-25 03:00:00 (Sun)
  63329223600, #    local_end 2007-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63329216400, #    utc_start 2007-10-28 01:00:00 (Sun)
  63342522000, #      utc_end 2008-03-30 01:00:00 (Sun)
  63329220000, #  local_start 2007-10-28 02:00:00 (Sun)
  63342525600, #    local_end 2008-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63342522000, #    utc_start 2008-03-30 01:00:00 (Sun)
  63360666000, #      utc_end 2008-10-26 01:00:00 (Sun)
  63342529200, #  local_start 2008-03-30 03:00:00 (Sun)
  63360673200, #    local_end 2008-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63360666000, #    utc_start 2008-10-26 01:00:00 (Sun)
  63373971600, #      utc_end 2009-03-29 01:00:00 (Sun)
  63360669600, #  local_start 2008-10-26 02:00:00 (Sun)
  63373975200, #    local_end 2009-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63373971600, #    utc_start 2009-03-29 01:00:00 (Sun)
  63392115600, #      utc_end 2009-10-25 01:00:00 (Sun)
  63373978800, #  local_start 2009-03-29 03:00:00 (Sun)
  63392122800, #    local_end 2009-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63392115600, #    utc_start 2009-10-25 01:00:00 (Sun)
  63405421200, #      utc_end 2010-03-28 01:00:00 (Sun)
  63392119200, #  local_start 2009-10-25 02:00:00 (Sun)
  63405424800, #    local_end 2010-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63405421200, #    utc_start 2010-03-28 01:00:00 (Sun)
  63424170000, #      utc_end 2010-10-31 01:00:00 (Sun)
  63405428400, #  local_start 2010-03-28 03:00:00 (Sun)
  63424177200, #    local_end 2010-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63424170000, #    utc_start 2010-10-31 01:00:00 (Sun)
  63436870800, #      utc_end 2011-03-27 01:00:00 (Sun)
  63424173600, #  local_start 2010-10-31 02:00:00 (Sun)
  63436874400, #    local_end 2011-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63436870800, #    utc_start 2011-03-27 01:00:00 (Sun)
  63455619600, #      utc_end 2011-10-30 01:00:00 (Sun)
  63436878000, #  local_start 2011-03-27 03:00:00 (Sun)
  63455626800, #    local_end 2011-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63455619600, #    utc_start 2011-10-30 01:00:00 (Sun)
  63468320400, #      utc_end 2012-03-25 01:00:00 (Sun)
  63455623200, #  local_start 2011-10-30 02:00:00 (Sun)
  63468324000, #    local_end 2012-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63468320400, #    utc_start 2012-03-25 01:00:00 (Sun)
  63487069200, #      utc_end 2012-10-28 01:00:00 (Sun)
  63468327600, #  local_start 2012-03-25 03:00:00 (Sun)
  63487076400, #    local_end 2012-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63487069200, #    utc_start 2012-10-28 01:00:00 (Sun)
  63500374800, #      utc_end 2013-03-31 01:00:00 (Sun)
  63487072800, #  local_start 2012-10-28 02:00:00 (Sun)
  63500378400, #    local_end 2013-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63500374800, #    utc_start 2013-03-31 01:00:00 (Sun)
  63518518800, #      utc_end 2013-10-27 01:00:00 (Sun)
  63500382000, #  local_start 2013-03-31 03:00:00 (Sun)
  63518526000, #    local_end 2013-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63518518800, #    utc_start 2013-10-27 01:00:00 (Sun)
  63531824400, #      utc_end 2014-03-30 01:00:00 (Sun)
  63518522400, #  local_start 2013-10-27 02:00:00 (Sun)
  63531828000, #    local_end 2014-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63531824400, #    utc_start 2014-03-30 01:00:00 (Sun)
  63549968400, #      utc_end 2014-10-26 01:00:00 (Sun)
  63531831600, #  local_start 2014-03-30 03:00:00 (Sun)
  63549975600, #    local_end 2014-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63549968400, #    utc_start 2014-10-26 01:00:00 (Sun)
  63563274000, #      utc_end 2015-03-29 01:00:00 (Sun)
  63549972000, #  local_start 2014-10-26 02:00:00 (Sun)
  63563277600, #    local_end 2015-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63563274000, #    utc_start 2015-03-29 01:00:00 (Sun)
  63581418000, #      utc_end 2015-10-25 01:00:00 (Sun)
  63563281200, #  local_start 2015-03-29 03:00:00 (Sun)
  63581425200, #    local_end 2015-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63581418000, #    utc_start 2015-10-25 01:00:00 (Sun)
  63594723600, #      utc_end 2016-03-27 01:00:00 (Sun)
  63581421600, #  local_start 2015-10-25 02:00:00 (Sun)
  63594727200, #    local_end 2016-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63594723600, #    utc_start 2016-03-27 01:00:00 (Sun)
  63613472400, #      utc_end 2016-10-30 01:00:00 (Sun)
  63594730800, #  local_start 2016-03-27 03:00:00 (Sun)
  63613479600, #    local_end 2016-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63613472400, #    utc_start 2016-10-30 01:00:00 (Sun)
  63626173200, #      utc_end 2017-03-26 01:00:00 (Sun)
  63613476000, #  local_start 2016-10-30 02:00:00 (Sun)
  63626176800, #    local_end 2017-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63626173200, #    utc_start 2017-03-26 01:00:00 (Sun)
  63644922000, #      utc_end 2017-10-29 01:00:00 (Sun)
  63626180400, #  local_start 2017-03-26 03:00:00 (Sun)
  63644929200, #    local_end 2017-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63644922000, #    utc_start 2017-10-29 01:00:00 (Sun)
  63657622800, #      utc_end 2018-03-25 01:00:00 (Sun)
  63644925600, #  local_start 2017-10-29 02:00:00 (Sun)
  63657626400, #    local_end 2018-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63657622800, #    utc_start 2018-03-25 01:00:00 (Sun)
  63676371600, #      utc_end 2018-10-28 01:00:00 (Sun)
  63657630000, #  local_start 2018-03-25 03:00:00 (Sun)
  63676378800, #    local_end 2018-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63676371600, #    utc_start 2018-10-28 01:00:00 (Sun)
  63689677200, #      utc_end 2019-03-31 01:00:00 (Sun)
  63676375200, #  local_start 2018-10-28 02:00:00 (Sun)
  63689680800, #    local_end 2019-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63689677200, #    utc_start 2019-03-31 01:00:00 (Sun)
  63707821200, #      utc_end 2019-10-27 01:00:00 (Sun)
  63689684400, #  local_start 2019-03-31 03:00:00 (Sun)
  63707828400, #    local_end 2019-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63707821200, #    utc_start 2019-10-27 01:00:00 (Sun)
  63721126800, #      utc_end 2020-03-29 01:00:00 (Sun)
  63707824800, #  local_start 2019-10-27 02:00:00 (Sun)
  63721130400, #    local_end 2020-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63721126800, #    utc_start 2020-03-29 01:00:00 (Sun)
  63739270800, #      utc_end 2020-10-25 01:00:00 (Sun)
  63721134000, #  local_start 2020-03-29 03:00:00 (Sun)
  63739278000, #    local_end 2020-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63739270800, #    utc_start 2020-10-25 01:00:00 (Sun)
  63752576400, #      utc_end 2021-03-28 01:00:00 (Sun)
  63739274400, #  local_start 2020-10-25 02:00:00 (Sun)
  63752580000, #    local_end 2021-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63752576400, #    utc_start 2021-03-28 01:00:00 (Sun)
  63771325200, #      utc_end 2021-10-31 01:00:00 (Sun)
  63752583600, #  local_start 2021-03-28 03:00:00 (Sun)
  63771332400, #    local_end 2021-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63771325200, #    utc_start 2021-10-31 01:00:00 (Sun)
  63784026000, #      utc_end 2022-03-27 01:00:00 (Sun)
  63771328800, #  local_start 2021-10-31 02:00:00 (Sun)
  63784029600, #    local_end 2022-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63784026000, #    utc_start 2022-03-27 01:00:00 (Sun)
  63802774800, #      utc_end 2022-10-30 01:00:00 (Sun)
  63784033200, #  local_start 2022-03-27 03:00:00 (Sun)
  63802782000, #    local_end 2022-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63802774800, #    utc_start 2022-10-30 01:00:00 (Sun)
  63815475600, #      utc_end 2023-03-26 01:00:00 (Sun)
  63802778400, #  local_start 2022-10-30 02:00:00 (Sun)
  63815479200, #    local_end 2023-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63815475600, #    utc_start 2023-03-26 01:00:00 (Sun)
  63834224400, #      utc_end 2023-10-29 01:00:00 (Sun)
  63815482800, #  local_start 2023-03-26 03:00:00 (Sun)
  63834231600, #    local_end 2023-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63834224400, #    utc_start 2023-10-29 01:00:00 (Sun)
  63847530000, #      utc_end 2024-03-31 01:00:00 (Sun)
  63834228000, #  local_start 2023-10-29 02:00:00 (Sun)
  63847533600, #    local_end 2024-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63847530000, #    utc_start 2024-03-31 01:00:00 (Sun)
  63865674000, #      utc_end 2024-10-27 01:00:00 (Sun)
  63847537200, #  local_start 2024-03-31 03:00:00 (Sun)
  63865681200, #    local_end 2024-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63865674000, #    utc_start 2024-10-27 01:00:00 (Sun)
  63878979600, #      utc_end 2025-03-30 01:00:00 (Sun)
  63865677600, #  local_start 2024-10-27 02:00:00 (Sun)
  63878983200, #    local_end 2025-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63878979600, #    utc_start 2025-03-30 01:00:00 (Sun)
  63897123600, #      utc_end 2025-10-26 01:00:00 (Sun)
  63878986800, #  local_start 2025-03-30 03:00:00 (Sun)
  63897130800, #    local_end 2025-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63897123600, #    utc_start 2025-10-26 01:00:00 (Sun)
  63910429200, #      utc_end 2026-03-29 01:00:00 (Sun)
  63897127200, #  local_start 2025-10-26 02:00:00 (Sun)
  63910432800, #    local_end 2026-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63910429200, #    utc_start 2026-03-29 01:00:00 (Sun)
  63928573200, #      utc_end 2026-10-25 01:00:00 (Sun)
  63910436400, #  local_start 2026-03-29 03:00:00 (Sun)
  63928580400, #    local_end 2026-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63928573200, #    utc_start 2026-10-25 01:00:00 (Sun)
  63941878800, #      utc_end 2027-03-28 01:00:00 (Sun)
  63928576800, #  local_start 2026-10-25 02:00:00 (Sun)
  63941882400, #    local_end 2027-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63941878800, #    utc_start 2027-03-28 01:00:00 (Sun)
  63960627600, #      utc_end 2027-10-31 01:00:00 (Sun)
  63941886000, #  local_start 2027-03-28 03:00:00 (Sun)
  63960634800, #    local_end 2027-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63960627600, #    utc_start 2027-10-31 01:00:00 (Sun)
  63973328400, #      utc_end 2028-03-26 01:00:00 (Sun)
  63960631200, #  local_start 2027-10-31 02:00:00 (Sun)
  63973332000, #    local_end 2028-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63973328400, #    utc_start 2028-03-26 01:00:00 (Sun)
  63992077200, #      utc_end 2028-10-29 01:00:00 (Sun)
  63973335600, #  local_start 2028-03-26 03:00:00 (Sun)
  63992084400, #    local_end 2028-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63992077200, #    utc_start 2028-10-29 01:00:00 (Sun)
  64004778000, #      utc_end 2029-03-25 01:00:00 (Sun)
  63992080800, #  local_start 2028-10-29 02:00:00 (Sun)
  64004781600, #    local_end 2029-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  64004778000, #    utc_start 2029-03-25 01:00:00 (Sun)
  64023526800, #      utc_end 2029-10-28 01:00:00 (Sun)
  64004785200, #  local_start 2029-03-25 03:00:00 (Sun)
  64023534000, #    local_end 2029-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  64023526800, #    utc_start 2029-10-28 01:00:00 (Sun)
  64036832400, #      utc_end 2030-03-31 01:00:00 (Sun)
  64023530400, #  local_start 2029-10-28 02:00:00 (Sun)
  64036836000, #    local_end 2030-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  64036832400, #    utc_start 2030-03-31 01:00:00 (Sun)
  64054976400, #      utc_end 2030-10-27 01:00:00 (Sun)
  64036839600, #  local_start 2030-03-31 03:00:00 (Sun)
  64054983600, #    local_end 2030-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {66}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { 3600 }
  
  my $last_observance = bless( {
    'format' => 'CE%sT',
    'gmtoff' => '1:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 722815,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 722815,
      'utc_rd_secs' => 0,
      'utc_year' => 1981
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => 3600,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 722814,
      'local_rd_secs' => 82800,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 722814,
      'utc_rd_secs' => 82800,
      'utc_year' => 1980
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '1:00u',
      'from' => '1996',
      'in' => 'Oct',
      'letter' => '',
      'name' => 'EU',
      'offset_from_std' => 0,
      'on' => 'lastSun',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '1:00u',
      'from' => '1981',
      'in' => 'Mar',
      'letter' => 'S',
      'name' => 'EU',
      'offset_from_std' => 3600,
      'on' => 'lastSun',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_EUROPE_BERLIN

    $main::fatpacked{"DateTime/TimeZone/Europe/Brussels.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_EUROPE_BRUSSELS';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Europe::Brussels;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Europe::Brussels::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59295541350, #      utc_end 1879-12-31 23:42:30 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59295542400, #    local_end 1880-01-01 00:00:00 (Thu)
  1050,
  0,
  'LMT',
      ],
      [
  59295541350, #    utc_start 1879-12-31 23:42:30 (Wed)
  59684730150, #      utc_end 1892-05-01 11:42:30 (Sun)
  59295542400, #  local_start 1880-01-01 00:00:00 (Thu)
  59684731200, #    local_end 1892-05-01 12:00:00 (Sun)
  1050,
  0,
  'BMT',
      ],
      [
  59684730150, #    utc_start 1892-05-01 11:42:30 (Sun)
  60395328000, #      utc_end 1914-11-08 00:00:00 (Sun)
  59684730150, #  local_start 1892-05-01 11:42:30 (Sun)
  60395328000, #    local_end 1914-11-08 00:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  60395328000, #    utc_start 1914-11-08 00:00:00 (Sun)
  60441980400, #      utc_end 1916-04-30 23:00:00 (Sun)
  60395331600, #  local_start 1914-11-08 01:00:00 (Sun)
  60441984000, #    local_end 1916-05-01 00:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  60441980400, #    utc_start 1916-04-30 23:00:00 (Sun)
  60455199600, #      utc_end 1916-09-30 23:00:00 (Sat)
  60441987600, #  local_start 1916-05-01 01:00:00 (Mon)
  60455206800, #    local_end 1916-10-01 01:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  60455199600, #    utc_start 1916-09-30 23:00:00 (Sat)
  60472227600, #      utc_end 1917-04-16 01:00:00 (Mon)
  60455203200, #  local_start 1916-10-01 00:00:00 (Sun)
  60472231200, #    local_end 1917-04-16 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  60472227600, #    utc_start 1917-04-16 01:00:00 (Mon)
  60485533200, #      utc_end 1917-09-17 01:00:00 (Mon)
  60472234800, #  local_start 1917-04-16 03:00:00 (Mon)
  60485540400, #    local_end 1917-09-17 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  60485533200, #    utc_start 1917-09-17 01:00:00 (Mon)
  60503677200, #      utc_end 1918-04-15 01:00:00 (Mon)
  60485536800, #  local_start 1917-09-17 02:00:00 (Mon)
  60503680800, #    local_end 1918-04-15 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  60503677200, #    utc_start 1918-04-15 01:00:00 (Mon)
  60516982800, #      utc_end 1918-09-16 01:00:00 (Mon)
  60503684400, #  local_start 1918-04-15 03:00:00 (Mon)
  60516990000, #    local_end 1918-09-16 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  60516982800, #    utc_start 1918-09-16 01:00:00 (Mon)
  60521857200, #      utc_end 1918-11-11 11:00:00 (Mon)
  60516986400, #  local_start 1918-09-16 02:00:00 (Mon)
  60521860800, #    local_end 1918-11-11 12:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  60521857200, #    utc_start 1918-11-11 11:00:00 (Mon)
  60531404400, #      utc_end 1919-03-01 23:00:00 (Sat)
  60521857200, #  local_start 1918-11-11 11:00:00 (Mon)
  60531404400, #    local_end 1919-03-01 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  60531404400, #    utc_start 1919-03-01 23:00:00 (Sat)
  60550153200, #      utc_end 1919-10-04 23:00:00 (Sat)
  60531408000, #  local_start 1919-03-02 00:00:00 (Sun)
  60550156800, #    local_end 1919-10-05 00:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60550153200, #    utc_start 1919-10-04 23:00:00 (Sat)
  60561644400, #      utc_end 1920-02-14 23:00:00 (Sat)
  60550153200, #  local_start 1919-10-04 23:00:00 (Sat)
  60561644400, #    local_end 1920-02-14 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  60561644400, #    utc_start 1920-02-14 23:00:00 (Sat)
  60583417200, #      utc_end 1920-10-23 23:00:00 (Sat)
  60561648000, #  local_start 1920-02-15 00:00:00 (Sun)
  60583420800, #    local_end 1920-10-24 00:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60583417200, #    utc_start 1920-10-23 23:00:00 (Sat)
  60595686000, #      utc_end 1921-03-14 23:00:00 (Mon)
  60583417200, #  local_start 1920-10-23 23:00:00 (Sat)
  60595686000, #    local_end 1921-03-14 23:00:00 (Mon)
  0,
  0,
  'WET',
      ],
      [
  60595686000, #    utc_start 1921-03-14 23:00:00 (Mon)
  60615126000, #      utc_end 1921-10-25 23:00:00 (Tue)
  60595689600, #  local_start 1921-03-15 00:00:00 (Tue)
  60615129600, #    local_end 1921-10-26 00:00:00 (Wed)
  3600,
  1,
  'WEST',
      ],
      [
  60615126000, #    utc_start 1921-10-25 23:00:00 (Tue)
  60628172400, #      utc_end 1922-03-25 23:00:00 (Sat)
  60615126000, #  local_start 1921-10-25 23:00:00 (Tue)
  60628172400, #    local_end 1922-03-25 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  60628172400, #    utc_start 1922-03-25 23:00:00 (Sat)
  60645106800, #      utc_end 1922-10-07 23:00:00 (Sat)
  60628176000, #  local_start 1922-03-26 00:00:00 (Sun)
  60645110400, #    local_end 1922-10-08 00:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60645106800, #    utc_start 1922-10-07 23:00:00 (Sat)
  60662041200, #      utc_end 1923-04-21 23:00:00 (Sat)
  60645106800, #  local_start 1922-10-07 23:00:00 (Sat)
  60662041200, #    local_end 1923-04-21 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  60662041200, #    utc_start 1923-04-21 23:00:00 (Sat)
  60676556400, #      utc_end 1923-10-06 23:00:00 (Sat)
  60662044800, #  local_start 1923-04-22 00:00:00 (Sun)
  60676560000, #    local_end 1923-10-07 00:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60676556400, #    utc_start 1923-10-06 23:00:00 (Sat)
  60691676400, #      utc_end 1924-03-29 23:00:00 (Sat)
  60676556400, #  local_start 1923-10-06 23:00:00 (Sat)
  60691676400, #    local_end 1924-03-29 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  60691676400, #    utc_start 1924-03-29 23:00:00 (Sat)
  60708006000, #      utc_end 1924-10-04 23:00:00 (Sat)
  60691680000, #  local_start 1924-03-30 00:00:00 (Sun)
  60708009600, #    local_end 1924-10-05 00:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60708006000, #    utc_start 1924-10-04 23:00:00 (Sat)
  60723730800, #      utc_end 1925-04-04 23:00:00 (Sat)
  60708006000, #  local_start 1924-10-04 23:00:00 (Sat)
  60723730800, #    local_end 1925-04-04 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  60723730800, #    utc_start 1925-04-04 23:00:00 (Sat)
  60739455600, #      utc_end 1925-10-03 23:00:00 (Sat)
  60723734400, #  local_start 1925-04-05 00:00:00 (Sun)
  60739459200, #    local_end 1925-10-04 00:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60739455600, #    utc_start 1925-10-03 23:00:00 (Sat)
  60756390000, #      utc_end 1926-04-17 23:00:00 (Sat)
  60739455600, #  local_start 1925-10-03 23:00:00 (Sat)
  60756390000, #    local_end 1926-04-17 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  60756390000, #    utc_start 1926-04-17 23:00:00 (Sat)
  60770905200, #      utc_end 1926-10-02 23:00:00 (Sat)
  60756393600, #  local_start 1926-04-18 00:00:00 (Sun)
  60770908800, #    local_end 1926-10-03 00:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60770905200, #    utc_start 1926-10-02 23:00:00 (Sat)
  60787234800, #      utc_end 1927-04-09 23:00:00 (Sat)
  60770905200, #  local_start 1926-10-02 23:00:00 (Sat)
  60787234800, #    local_end 1927-04-09 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  60787234800, #    utc_start 1927-04-09 23:00:00 (Sat)
  60802354800, #      utc_end 1927-10-01 23:00:00 (Sat)
  60787238400, #  local_start 1927-04-10 00:00:00 (Sun)
  60802358400, #    local_end 1927-10-02 00:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60802354800, #    utc_start 1927-10-01 23:00:00 (Sat)
  60819289200, #      utc_end 1928-04-14 23:00:00 (Sat)
  60802354800, #  local_start 1927-10-01 23:00:00 (Sat)
  60819289200, #    local_end 1928-04-14 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  60819289200, #    utc_start 1928-04-14 23:00:00 (Sat)
  60834420000, #      utc_end 1928-10-07 02:00:00 (Sun)
  60819292800, #  local_start 1928-04-15 00:00:00 (Sun)
  60834423600, #    local_end 1928-10-07 03:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60834420000, #    utc_start 1928-10-07 02:00:00 (Sun)
  60851354400, #      utc_end 1929-04-21 02:00:00 (Sun)
  60834420000, #  local_start 1928-10-07 02:00:00 (Sun)
  60851354400, #    local_end 1929-04-21 02:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  60851354400, #    utc_start 1929-04-21 02:00:00 (Sun)
  60865869600, #      utc_end 1929-10-06 02:00:00 (Sun)
  60851358000, #  local_start 1929-04-21 03:00:00 (Sun)
  60865873200, #    local_end 1929-10-06 03:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60865869600, #    utc_start 1929-10-06 02:00:00 (Sun)
  60882199200, #      utc_end 1930-04-13 02:00:00 (Sun)
  60865869600, #  local_start 1929-10-06 02:00:00 (Sun)
  60882199200, #    local_end 1930-04-13 02:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  60882199200, #    utc_start 1930-04-13 02:00:00 (Sun)
  60897319200, #      utc_end 1930-10-05 02:00:00 (Sun)
  60882202800, #  local_start 1930-04-13 03:00:00 (Sun)
  60897322800, #    local_end 1930-10-05 03:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60897319200, #    utc_start 1930-10-05 02:00:00 (Sun)
  60914253600, #      utc_end 1931-04-19 02:00:00 (Sun)
  60897319200, #  local_start 1930-10-05 02:00:00 (Sun)
  60914253600, #    local_end 1931-04-19 02:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  60914253600, #    utc_start 1931-04-19 02:00:00 (Sun)
  60928768800, #      utc_end 1931-10-04 02:00:00 (Sun)
  60914257200, #  local_start 1931-04-19 03:00:00 (Sun)
  60928772400, #    local_end 1931-10-04 03:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60928768800, #    utc_start 1931-10-04 02:00:00 (Sun)
  60944493600, #      utc_end 1932-04-03 02:00:00 (Sun)
  60928768800, #  local_start 1931-10-04 02:00:00 (Sun)
  60944493600, #    local_end 1932-04-03 02:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  60944493600, #    utc_start 1932-04-03 02:00:00 (Sun)
  60960218400, #      utc_end 1932-10-02 02:00:00 (Sun)
  60944497200, #  local_start 1932-04-03 03:00:00 (Sun)
  60960222000, #    local_end 1932-10-02 03:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60960218400, #    utc_start 1932-10-02 02:00:00 (Sun)
  60975338400, #      utc_end 1933-03-26 02:00:00 (Sun)
  60960218400, #  local_start 1932-10-02 02:00:00 (Sun)
  60975338400, #    local_end 1933-03-26 02:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  60975338400, #    utc_start 1933-03-26 02:00:00 (Sun)
  60992272800, #      utc_end 1933-10-08 02:00:00 (Sun)
  60975342000, #  local_start 1933-03-26 03:00:00 (Sun)
  60992276400, #    local_end 1933-10-08 03:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60992272800, #    utc_start 1933-10-08 02:00:00 (Sun)
  61007997600, #      utc_end 1934-04-08 02:00:00 (Sun)
  60992272800, #  local_start 1933-10-08 02:00:00 (Sun)
  61007997600, #    local_end 1934-04-08 02:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  61007997600, #    utc_start 1934-04-08 02:00:00 (Sun)
  61023722400, #      utc_end 1934-10-07 02:00:00 (Sun)
  61008001200, #  local_start 1934-04-08 03:00:00 (Sun)
  61023726000, #    local_end 1934-10-07 03:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  61023722400, #    utc_start 1934-10-07 02:00:00 (Sun)
  61038842400, #      utc_end 1935-03-31 02:00:00 (Sun)
  61023722400, #  local_start 1934-10-07 02:00:00 (Sun)
  61038842400, #    local_end 1935-03-31 02:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  61038842400, #    utc_start 1935-03-31 02:00:00 (Sun)
  61055172000, #      utc_end 1935-10-06 02:00:00 (Sun)
  61038846000, #  local_start 1935-03-31 03:00:00 (Sun)
  61055175600, #    local_end 1935-10-06 03:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  61055172000, #    utc_start 1935-10-06 02:00:00 (Sun)
  61072106400, #      utc_end 1936-04-19 02:00:00 (Sun)
  61055172000, #  local_start 1935-10-06 02:00:00 (Sun)
  61072106400, #    local_end 1936-04-19 02:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  61072106400, #    utc_start 1936-04-19 02:00:00 (Sun)
  61086621600, #      utc_end 1936-10-04 02:00:00 (Sun)
  61072110000, #  local_start 1936-04-19 03:00:00 (Sun)
  61086625200, #    local_end 1936-10-04 03:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  61086621600, #    utc_start 1936-10-04 02:00:00 (Sun)
  61102346400, #      utc_end 1937-04-04 02:00:00 (Sun)
  61086621600, #  local_start 1936-10-04 02:00:00 (Sun)
  61102346400, #    local_end 1937-04-04 02:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  61102346400, #    utc_start 1937-04-04 02:00:00 (Sun)
  61118071200, #      utc_end 1937-10-03 02:00:00 (Sun)
  61102350000, #  local_start 1937-04-04 03:00:00 (Sun)
  61118074800, #    local_end 1937-10-03 03:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  61118071200, #    utc_start 1937-10-03 02:00:00 (Sun)
  61133191200, #      utc_end 1938-03-27 02:00:00 (Sun)
  61118071200, #  local_start 1937-10-03 02:00:00 (Sun)
  61133191200, #    local_end 1938-03-27 02:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  61133191200, #    utc_start 1938-03-27 02:00:00 (Sun)
  61149520800, #      utc_end 1938-10-02 02:00:00 (Sun)
  61133194800, #  local_start 1938-03-27 03:00:00 (Sun)
  61149524400, #    local_end 1938-10-02 03:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  61149520800, #    utc_start 1938-10-02 02:00:00 (Sun)
  61166455200, #      utc_end 1939-04-16 02:00:00 (Sun)
  61149520800, #  local_start 1938-10-02 02:00:00 (Sun)
  61166455200, #    local_end 1939-04-16 02:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  61166455200, #    utc_start 1939-04-16 02:00:00 (Sun)
  61185204000, #      utc_end 1939-11-19 02:00:00 (Sun)
  61166458800, #  local_start 1939-04-16 03:00:00 (Sun)
  61185207600, #    local_end 1939-11-19 03:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  61185204000, #    utc_start 1939-11-19 02:00:00 (Sun)
  61193671200, #      utc_end 1940-02-25 02:00:00 (Sun)
  61185204000, #  local_start 1939-11-19 02:00:00 (Sun)
  61193671200, #    local_end 1940-02-25 02:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  61193671200, #    utc_start 1940-02-25 02:00:00 (Sun)
  61201015200, #      utc_end 1940-05-20 02:00:00 (Mon)
  61193674800, #  local_start 1940-02-25 03:00:00 (Sun)
  61201018800, #    local_end 1940-05-20 03:00:00 (Mon)
  3600,
  1,
  'WEST',
      ],
      [
  61201015200, #    utc_start 1940-05-20 02:00:00 (Mon)
  61278426000, #      utc_end 1942-11-02 01:00:00 (Mon)
  61201022400, #  local_start 1940-05-20 04:00:00 (Mon)
  61278433200, #    local_end 1942-11-02 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61278426000, #    utc_start 1942-11-02 01:00:00 (Mon)
  61291126800, #      utc_end 1943-03-29 01:00:00 (Mon)
  61278429600, #  local_start 1942-11-02 02:00:00 (Mon)
  61291130400, #    local_end 1943-03-29 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61291126800, #    utc_start 1943-03-29 01:00:00 (Mon)
  61307456400, #      utc_end 1943-10-04 01:00:00 (Mon)
  61291134000, #  local_start 1943-03-29 03:00:00 (Mon)
  61307463600, #    local_end 1943-10-04 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61307456400, #    utc_start 1943-10-04 01:00:00 (Mon)
  61323181200, #      utc_end 1944-04-03 01:00:00 (Mon)
  61307460000, #  local_start 1943-10-04 02:00:00 (Mon)
  61323184800, #    local_end 1944-04-03 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61323181200, #    utc_start 1944-04-03 01:00:00 (Mon)
  61336389600, #      utc_end 1944-09-02 22:00:00 (Sat)
  61323188400, #  local_start 1944-04-03 03:00:00 (Mon)
  61336396800, #    local_end 1944-09-03 00:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  61336389600, #    utc_start 1944-09-02 22:00:00 (Sat)
  61337610000, #      utc_end 1944-09-17 01:00:00 (Sun)
  61336396800, #  local_start 1944-09-03 00:00:00 (Sun)
  61337617200, #    local_end 1944-09-17 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  61337610000, #    utc_start 1944-09-17 01:00:00 (Sun)
  61354630800, #      utc_end 1945-04-02 01:00:00 (Mon)
  61337613600, #  local_start 1944-09-17 02:00:00 (Sun)
  61354634400, #    local_end 1945-04-02 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61354630800, #    utc_start 1945-04-02 01:00:00 (Mon)
  61369059600, #      utc_end 1945-09-16 01:00:00 (Sun)
  61354638000, #  local_start 1945-04-02 03:00:00 (Mon)
  61369066800, #    local_end 1945-09-16 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  61369059600, #    utc_start 1945-09-16 01:00:00 (Sun)
  61390227600, #      utc_end 1946-05-19 01:00:00 (Sun)
  61369063200, #  local_start 1945-09-16 02:00:00 (Sun)
  61390231200, #    local_end 1946-05-19 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  61390227600, #    utc_start 1946-05-19 01:00:00 (Sun)
  61402410000, #      utc_end 1946-10-07 01:00:00 (Mon)
  61390234800, #  local_start 1946-05-19 03:00:00 (Sun)
  61402417200, #    local_end 1946-10-07 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61402410000, #    utc_start 1946-10-07 01:00:00 (Mon)
  62356604400, #      utc_end 1976-12-31 23:00:00 (Fri)
  61402413600, #  local_start 1946-10-07 02:00:00 (Mon)
  62356608000, #    local_end 1977-01-01 00:00:00 (Sat)
  3600,
  0,
  'CET',
      ],
      [
  62356604400, #    utc_start 1976-12-31 23:00:00 (Fri)
  62364560400, #      utc_end 1977-04-03 01:00:00 (Sun)
  62356608000, #  local_start 1977-01-01 00:00:00 (Sat)
  62364564000, #    local_end 1977-04-03 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62364560400, #    utc_start 1977-04-03 01:00:00 (Sun)
  62379680400, #      utc_end 1977-09-25 01:00:00 (Sun)
  62364567600, #  local_start 1977-04-03 03:00:00 (Sun)
  62379687600, #    local_end 1977-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62379680400, #    utc_start 1977-09-25 01:00:00 (Sun)
  62396010000, #      utc_end 1978-04-02 01:00:00 (Sun)
  62379684000, #  local_start 1977-09-25 02:00:00 (Sun)
  62396013600, #    local_end 1978-04-02 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62396010000, #    utc_start 1978-04-02 01:00:00 (Sun)
  62411734800, #      utc_end 1978-10-01 01:00:00 (Sun)
  62396017200, #  local_start 1978-04-02 03:00:00 (Sun)
  62411742000, #    local_end 1978-10-01 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62411734800, #    utc_start 1978-10-01 01:00:00 (Sun)
  62427459600, #      utc_end 1979-04-01 01:00:00 (Sun)
  62411738400, #  local_start 1978-10-01 02:00:00 (Sun)
  62427463200, #    local_end 1979-04-01 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62427459600, #    utc_start 1979-04-01 01:00:00 (Sun)
  62443184400, #      utc_end 1979-09-30 01:00:00 (Sun)
  62427466800, #  local_start 1979-04-01 03:00:00 (Sun)
  62443191600, #    local_end 1979-09-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62443184400, #    utc_start 1979-09-30 01:00:00 (Sun)
  62459514000, #      utc_end 1980-04-06 01:00:00 (Sun)
  62443188000, #  local_start 1979-09-30 02:00:00 (Sun)
  62459517600, #    local_end 1980-04-06 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62459514000, #    utc_start 1980-04-06 01:00:00 (Sun)
  62474634000, #      utc_end 1980-09-28 01:00:00 (Sun)
  62459521200, #  local_start 1980-04-06 03:00:00 (Sun)
  62474641200, #    local_end 1980-09-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62474634000, #    utc_start 1980-09-28 01:00:00 (Sun)
  62490358800, #      utc_end 1981-03-29 01:00:00 (Sun)
  62474637600, #  local_start 1980-09-28 02:00:00 (Sun)
  62490362400, #    local_end 1981-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62490358800, #    utc_start 1981-03-29 01:00:00 (Sun)
  62506083600, #      utc_end 1981-09-27 01:00:00 (Sun)
  62490366000, #  local_start 1981-03-29 03:00:00 (Sun)
  62506090800, #    local_end 1981-09-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62506083600, #    utc_start 1981-09-27 01:00:00 (Sun)
  62521808400, #      utc_end 1982-03-28 01:00:00 (Sun)
  62506087200, #  local_start 1981-09-27 02:00:00 (Sun)
  62521812000, #    local_end 1982-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62521808400, #    utc_start 1982-03-28 01:00:00 (Sun)
  62537533200, #      utc_end 1982-09-26 01:00:00 (Sun)
  62521815600, #  local_start 1982-03-28 03:00:00 (Sun)
  62537540400, #    local_end 1982-09-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62537533200, #    utc_start 1982-09-26 01:00:00 (Sun)
  62553258000, #      utc_end 1983-03-27 01:00:00 (Sun)
  62537536800, #  local_start 1982-09-26 02:00:00 (Sun)
  62553261600, #    local_end 1983-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62553258000, #    utc_start 1983-03-27 01:00:00 (Sun)
  62568982800, #      utc_end 1983-09-25 01:00:00 (Sun)
  62553265200, #  local_start 1983-03-27 03:00:00 (Sun)
  62568990000, #    local_end 1983-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62568982800, #    utc_start 1983-09-25 01:00:00 (Sun)
  62584707600, #      utc_end 1984-03-25 01:00:00 (Sun)
  62568986400, #  local_start 1983-09-25 02:00:00 (Sun)
  62584711200, #    local_end 1984-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62584707600, #    utc_start 1984-03-25 01:00:00 (Sun)
  62601037200, #      utc_end 1984-09-30 01:00:00 (Sun)
  62584714800, #  local_start 1984-03-25 03:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62601037200, #    utc_start 1984-09-30 01:00:00 (Sun)
  62616762000, #      utc_end 1985-03-31 01:00:00 (Sun)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62616762000, #    utc_start 1985-03-31 01:00:00 (Sun)
  62632486800, #      utc_end 1985-09-29 01:00:00 (Sun)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62632486800, #    utc_start 1985-09-29 01:00:00 (Sun)
  62648211600, #      utc_end 1986-03-30 01:00:00 (Sun)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62648211600, #    utc_start 1986-03-30 01:00:00 (Sun)
  62663936400, #      utc_end 1986-09-28 01:00:00 (Sun)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62663936400, #    utc_start 1986-09-28 01:00:00 (Sun)
  62679661200, #      utc_end 1987-03-29 01:00:00 (Sun)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62679661200, #    utc_start 1987-03-29 01:00:00 (Sun)
  62695386000, #      utc_end 1987-09-27 01:00:00 (Sun)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62695386000, #    utc_start 1987-09-27 01:00:00 (Sun)
  62711110800, #      utc_end 1988-03-27 01:00:00 (Sun)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62711110800, #    utc_start 1988-03-27 01:00:00 (Sun)
  62726835600, #      utc_end 1988-09-25 01:00:00 (Sun)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62726835600, #    utc_start 1988-09-25 01:00:00 (Sun)
  62742560400, #      utc_end 1989-03-26 01:00:00 (Sun)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62742560400, #    utc_start 1989-03-26 01:00:00 (Sun)
  62758285200, #      utc_end 1989-09-24 01:00:00 (Sun)
  62742567600, #  local_start 1989-03-26 03:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62758285200, #    utc_start 1989-09-24 01:00:00 (Sun)
  62774010000, #      utc_end 1990-03-25 01:00:00 (Sun)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62774010000, #    utc_start 1990-03-25 01:00:00 (Sun)
  62790339600, #      utc_end 1990-09-30 01:00:00 (Sun)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62790339600, #    utc_start 1990-09-30 01:00:00 (Sun)
  62806064400, #      utc_end 1991-03-31 01:00:00 (Sun)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62806064400, #    utc_start 1991-03-31 01:00:00 (Sun)
  62821789200, #      utc_end 1991-09-29 01:00:00 (Sun)
  62806071600, #  local_start 1991-03-31 03:00:00 (Sun)
  62821796400, #    local_end 1991-09-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62821789200, #    utc_start 1991-09-29 01:00:00 (Sun)
  62837514000, #      utc_end 1992-03-29 01:00:00 (Sun)
  62821792800, #  local_start 1991-09-29 02:00:00 (Sun)
  62837517600, #    local_end 1992-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62837514000, #    utc_start 1992-03-29 01:00:00 (Sun)
  62853238800, #      utc_end 1992-09-27 01:00:00 (Sun)
  62837521200, #  local_start 1992-03-29 03:00:00 (Sun)
  62853246000, #    local_end 1992-09-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62853238800, #    utc_start 1992-09-27 01:00:00 (Sun)
  62868963600, #      utc_end 1993-03-28 01:00:00 (Sun)
  62853242400, #  local_start 1992-09-27 02:00:00 (Sun)
  62868967200, #    local_end 1993-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62868963600, #    utc_start 1993-03-28 01:00:00 (Sun)
  62884688400, #      utc_end 1993-09-26 01:00:00 (Sun)
  62868970800, #  local_start 1993-03-28 03:00:00 (Sun)
  62884695600, #    local_end 1993-09-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62884688400, #    utc_start 1993-09-26 01:00:00 (Sun)
  62900413200, #      utc_end 1994-03-27 01:00:00 (Sun)
  62884692000, #  local_start 1993-09-26 02:00:00 (Sun)
  62900416800, #    local_end 1994-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62900413200, #    utc_start 1994-03-27 01:00:00 (Sun)
  62916138000, #      utc_end 1994-09-25 01:00:00 (Sun)
  62900420400, #  local_start 1994-03-27 03:00:00 (Sun)
  62916145200, #    local_end 1994-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62916138000, #    utc_start 1994-09-25 01:00:00 (Sun)
  62931862800, #      utc_end 1995-03-26 01:00:00 (Sun)
  62916141600, #  local_start 1994-09-25 02:00:00 (Sun)
  62931866400, #    local_end 1995-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62931862800, #    utc_start 1995-03-26 01:00:00 (Sun)
  62947587600, #      utc_end 1995-09-24 01:00:00 (Sun)
  62931870000, #  local_start 1995-03-26 03:00:00 (Sun)
  62947594800, #    local_end 1995-09-24 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62947587600, #    utc_start 1995-09-24 01:00:00 (Sun)
  62963917200, #      utc_end 1996-03-31 01:00:00 (Sun)
  62947591200, #  local_start 1995-09-24 02:00:00 (Sun)
  62963920800, #    local_end 1996-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62963917200, #    utc_start 1996-03-31 01:00:00 (Sun)
  62982061200, #      utc_end 1996-10-27 01:00:00 (Sun)
  62963924400, #  local_start 1996-03-31 03:00:00 (Sun)
  62982068400, #    local_end 1996-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62982061200, #    utc_start 1996-10-27 01:00:00 (Sun)
  62995366800, #      utc_end 1997-03-30 01:00:00 (Sun)
  62982064800, #  local_start 1996-10-27 02:00:00 (Sun)
  62995370400, #    local_end 1997-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62995366800, #    utc_start 1997-03-30 01:00:00 (Sun)
  63013510800, #      utc_end 1997-10-26 01:00:00 (Sun)
  62995374000, #  local_start 1997-03-30 03:00:00 (Sun)
  63013518000, #    local_end 1997-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63013510800, #    utc_start 1997-10-26 01:00:00 (Sun)
  63026816400, #      utc_end 1998-03-29 01:00:00 (Sun)
  63013514400, #  local_start 1997-10-26 02:00:00 (Sun)
  63026820000, #    local_end 1998-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63026816400, #    utc_start 1998-03-29 01:00:00 (Sun)
  63044960400, #      utc_end 1998-10-25 01:00:00 (Sun)
  63026823600, #  local_start 1998-03-29 03:00:00 (Sun)
  63044967600, #    local_end 1998-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63044960400, #    utc_start 1998-10-25 01:00:00 (Sun)
  63058266000, #      utc_end 1999-03-28 01:00:00 (Sun)
  63044964000, #  local_start 1998-10-25 02:00:00 (Sun)
  63058269600, #    local_end 1999-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63058266000, #    utc_start 1999-03-28 01:00:00 (Sun)
  63077014800, #      utc_end 1999-10-31 01:00:00 (Sun)
  63058273200, #  local_start 1999-03-28 03:00:00 (Sun)
  63077022000, #    local_end 1999-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63077014800, #    utc_start 1999-10-31 01:00:00 (Sun)
  63089715600, #      utc_end 2000-03-26 01:00:00 (Sun)
  63077018400, #  local_start 1999-10-31 02:00:00 (Sun)
  63089719200, #    local_end 2000-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63089715600, #    utc_start 2000-03-26 01:00:00 (Sun)
  63108464400, #      utc_end 2000-10-29 01:00:00 (Sun)
  63089722800, #  local_start 2000-03-26 03:00:00 (Sun)
  63108471600, #    local_end 2000-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63108464400, #    utc_start 2000-10-29 01:00:00 (Sun)
  63121165200, #      utc_end 2001-03-25 01:00:00 (Sun)
  63108468000, #  local_start 2000-10-29 02:00:00 (Sun)
  63121168800, #    local_end 2001-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63121165200, #    utc_start 2001-03-25 01:00:00 (Sun)
  63139914000, #      utc_end 2001-10-28 01:00:00 (Sun)
  63121172400, #  local_start 2001-03-25 03:00:00 (Sun)
  63139921200, #    local_end 2001-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63139914000, #    utc_start 2001-10-28 01:00:00 (Sun)
  63153219600, #      utc_end 2002-03-31 01:00:00 (Sun)
  63139917600, #  local_start 2001-10-28 02:00:00 (Sun)
  63153223200, #    local_end 2002-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63153219600, #    utc_start 2002-03-31 01:00:00 (Sun)
  63171363600, #      utc_end 2002-10-27 01:00:00 (Sun)
  63153226800, #  local_start 2002-03-31 03:00:00 (Sun)
  63171370800, #    local_end 2002-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63171363600, #    utc_start 2002-10-27 01:00:00 (Sun)
  63184669200, #      utc_end 2003-03-30 01:00:00 (Sun)
  63171367200, #  local_start 2002-10-27 02:00:00 (Sun)
  63184672800, #    local_end 2003-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63184669200, #    utc_start 2003-03-30 01:00:00 (Sun)
  63202813200, #      utc_end 2003-10-26 01:00:00 (Sun)
  63184676400, #  local_start 2003-03-30 03:00:00 (Sun)
  63202820400, #    local_end 2003-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63202813200, #    utc_start 2003-10-26 01:00:00 (Sun)
  63216118800, #      utc_end 2004-03-28 01:00:00 (Sun)
  63202816800, #  local_start 2003-10-26 02:00:00 (Sun)
  63216122400, #    local_end 2004-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63216118800, #    utc_start 2004-03-28 01:00:00 (Sun)
  63234867600, #      utc_end 2004-10-31 01:00:00 (Sun)
  63216126000, #  local_start 2004-03-28 03:00:00 (Sun)
  63234874800, #    local_end 2004-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63234867600, #    utc_start 2004-10-31 01:00:00 (Sun)
  63247568400, #      utc_end 2005-03-27 01:00:00 (Sun)
  63234871200, #  local_start 2004-10-31 02:00:00 (Sun)
  63247572000, #    local_end 2005-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63247568400, #    utc_start 2005-03-27 01:00:00 (Sun)
  63266317200, #      utc_end 2005-10-30 01:00:00 (Sun)
  63247575600, #  local_start 2005-03-27 03:00:00 (Sun)
  63266324400, #    local_end 2005-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63266317200, #    utc_start 2005-10-30 01:00:00 (Sun)
  63279018000, #      utc_end 2006-03-26 01:00:00 (Sun)
  63266320800, #  local_start 2005-10-30 02:00:00 (Sun)
  63279021600, #    local_end 2006-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63279018000, #    utc_start 2006-03-26 01:00:00 (Sun)
  63297766800, #      utc_end 2006-10-29 01:00:00 (Sun)
  63279025200, #  local_start 2006-03-26 03:00:00 (Sun)
  63297774000, #    local_end 2006-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63297766800, #    utc_start 2006-10-29 01:00:00 (Sun)
  63310467600, #      utc_end 2007-03-25 01:00:00 (Sun)
  63297770400, #  local_start 2006-10-29 02:00:00 (Sun)
  63310471200, #    local_end 2007-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63310467600, #    utc_start 2007-03-25 01:00:00 (Sun)
  63329216400, #      utc_end 2007-10-28 01:00:00 (Sun)
  63310474800, #  local_start 2007-03-25 03:00:00 (Sun)
  63329223600, #    local_end 2007-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63329216400, #    utc_start 2007-10-28 01:00:00 (Sun)
  63342522000, #      utc_end 2008-03-30 01:00:00 (Sun)
  63329220000, #  local_start 2007-10-28 02:00:00 (Sun)
  63342525600, #    local_end 2008-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63342522000, #    utc_start 2008-03-30 01:00:00 (Sun)
  63360666000, #      utc_end 2008-10-26 01:00:00 (Sun)
  63342529200, #  local_start 2008-03-30 03:00:00 (Sun)
  63360673200, #    local_end 2008-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63360666000, #    utc_start 2008-10-26 01:00:00 (Sun)
  63373971600, #      utc_end 2009-03-29 01:00:00 (Sun)
  63360669600, #  local_start 2008-10-26 02:00:00 (Sun)
  63373975200, #    local_end 2009-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63373971600, #    utc_start 2009-03-29 01:00:00 (Sun)
  63392115600, #      utc_end 2009-10-25 01:00:00 (Sun)
  63373978800, #  local_start 2009-03-29 03:00:00 (Sun)
  63392122800, #    local_end 2009-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63392115600, #    utc_start 2009-10-25 01:00:00 (Sun)
  63405421200, #      utc_end 2010-03-28 01:00:00 (Sun)
  63392119200, #  local_start 2009-10-25 02:00:00 (Sun)
  63405424800, #    local_end 2010-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63405421200, #    utc_start 2010-03-28 01:00:00 (Sun)
  63424170000, #      utc_end 2010-10-31 01:00:00 (Sun)
  63405428400, #  local_start 2010-03-28 03:00:00 (Sun)
  63424177200, #    local_end 2010-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63424170000, #    utc_start 2010-10-31 01:00:00 (Sun)
  63436870800, #      utc_end 2011-03-27 01:00:00 (Sun)
  63424173600, #  local_start 2010-10-31 02:00:00 (Sun)
  63436874400, #    local_end 2011-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63436870800, #    utc_start 2011-03-27 01:00:00 (Sun)
  63455619600, #      utc_end 2011-10-30 01:00:00 (Sun)
  63436878000, #  local_start 2011-03-27 03:00:00 (Sun)
  63455626800, #    local_end 2011-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63455619600, #    utc_start 2011-10-30 01:00:00 (Sun)
  63468320400, #      utc_end 2012-03-25 01:00:00 (Sun)
  63455623200, #  local_start 2011-10-30 02:00:00 (Sun)
  63468324000, #    local_end 2012-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63468320400, #    utc_start 2012-03-25 01:00:00 (Sun)
  63487069200, #      utc_end 2012-10-28 01:00:00 (Sun)
  63468327600, #  local_start 2012-03-25 03:00:00 (Sun)
  63487076400, #    local_end 2012-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63487069200, #    utc_start 2012-10-28 01:00:00 (Sun)
  63500374800, #      utc_end 2013-03-31 01:00:00 (Sun)
  63487072800, #  local_start 2012-10-28 02:00:00 (Sun)
  63500378400, #    local_end 2013-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63500374800, #    utc_start 2013-03-31 01:00:00 (Sun)
  63518518800, #      utc_end 2013-10-27 01:00:00 (Sun)
  63500382000, #  local_start 2013-03-31 03:00:00 (Sun)
  63518526000, #    local_end 2013-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63518518800, #    utc_start 2013-10-27 01:00:00 (Sun)
  63531824400, #      utc_end 2014-03-30 01:00:00 (Sun)
  63518522400, #  local_start 2013-10-27 02:00:00 (Sun)
  63531828000, #    local_end 2014-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63531824400, #    utc_start 2014-03-30 01:00:00 (Sun)
  63549968400, #      utc_end 2014-10-26 01:00:00 (Sun)
  63531831600, #  local_start 2014-03-30 03:00:00 (Sun)
  63549975600, #    local_end 2014-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63549968400, #    utc_start 2014-10-26 01:00:00 (Sun)
  63563274000, #      utc_end 2015-03-29 01:00:00 (Sun)
  63549972000, #  local_start 2014-10-26 02:00:00 (Sun)
  63563277600, #    local_end 2015-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63563274000, #    utc_start 2015-03-29 01:00:00 (Sun)
  63581418000, #      utc_end 2015-10-25 01:00:00 (Sun)
  63563281200, #  local_start 2015-03-29 03:00:00 (Sun)
  63581425200, #    local_end 2015-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63581418000, #    utc_start 2015-10-25 01:00:00 (Sun)
  63594723600, #      utc_end 2016-03-27 01:00:00 (Sun)
  63581421600, #  local_start 2015-10-25 02:00:00 (Sun)
  63594727200, #    local_end 2016-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63594723600, #    utc_start 2016-03-27 01:00:00 (Sun)
  63613472400, #      utc_end 2016-10-30 01:00:00 (Sun)
  63594730800, #  local_start 2016-03-27 03:00:00 (Sun)
  63613479600, #    local_end 2016-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63613472400, #    utc_start 2016-10-30 01:00:00 (Sun)
  63626173200, #      utc_end 2017-03-26 01:00:00 (Sun)
  63613476000, #  local_start 2016-10-30 02:00:00 (Sun)
  63626176800, #    local_end 2017-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63626173200, #    utc_start 2017-03-26 01:00:00 (Sun)
  63644922000, #      utc_end 2017-10-29 01:00:00 (Sun)
  63626180400, #  local_start 2017-03-26 03:00:00 (Sun)
  63644929200, #    local_end 2017-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63644922000, #    utc_start 2017-10-29 01:00:00 (Sun)
  63657622800, #      utc_end 2018-03-25 01:00:00 (Sun)
  63644925600, #  local_start 2017-10-29 02:00:00 (Sun)
  63657626400, #    local_end 2018-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63657622800, #    utc_start 2018-03-25 01:00:00 (Sun)
  63676371600, #      utc_end 2018-10-28 01:00:00 (Sun)
  63657630000, #  local_start 2018-03-25 03:00:00 (Sun)
  63676378800, #    local_end 2018-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63676371600, #    utc_start 2018-10-28 01:00:00 (Sun)
  63689677200, #      utc_end 2019-03-31 01:00:00 (Sun)
  63676375200, #  local_start 2018-10-28 02:00:00 (Sun)
  63689680800, #    local_end 2019-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63689677200, #    utc_start 2019-03-31 01:00:00 (Sun)
  63707821200, #      utc_end 2019-10-27 01:00:00 (Sun)
  63689684400, #  local_start 2019-03-31 03:00:00 (Sun)
  63707828400, #    local_end 2019-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63707821200, #    utc_start 2019-10-27 01:00:00 (Sun)
  63721126800, #      utc_end 2020-03-29 01:00:00 (Sun)
  63707824800, #  local_start 2019-10-27 02:00:00 (Sun)
  63721130400, #    local_end 2020-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63721126800, #    utc_start 2020-03-29 01:00:00 (Sun)
  63739270800, #      utc_end 2020-10-25 01:00:00 (Sun)
  63721134000, #  local_start 2020-03-29 03:00:00 (Sun)
  63739278000, #    local_end 2020-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63739270800, #    utc_start 2020-10-25 01:00:00 (Sun)
  63752576400, #      utc_end 2021-03-28 01:00:00 (Sun)
  63739274400, #  local_start 2020-10-25 02:00:00 (Sun)
  63752580000, #    local_end 2021-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63752576400, #    utc_start 2021-03-28 01:00:00 (Sun)
  63771325200, #      utc_end 2021-10-31 01:00:00 (Sun)
  63752583600, #  local_start 2021-03-28 03:00:00 (Sun)
  63771332400, #    local_end 2021-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63771325200, #    utc_start 2021-10-31 01:00:00 (Sun)
  63784026000, #      utc_end 2022-03-27 01:00:00 (Sun)
  63771328800, #  local_start 2021-10-31 02:00:00 (Sun)
  63784029600, #    local_end 2022-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63784026000, #    utc_start 2022-03-27 01:00:00 (Sun)
  63802774800, #      utc_end 2022-10-30 01:00:00 (Sun)
  63784033200, #  local_start 2022-03-27 03:00:00 (Sun)
  63802782000, #    local_end 2022-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63802774800, #    utc_start 2022-10-30 01:00:00 (Sun)
  63815475600, #      utc_end 2023-03-26 01:00:00 (Sun)
  63802778400, #  local_start 2022-10-30 02:00:00 (Sun)
  63815479200, #    local_end 2023-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63815475600, #    utc_start 2023-03-26 01:00:00 (Sun)
  63834224400, #      utc_end 2023-10-29 01:00:00 (Sun)
  63815482800, #  local_start 2023-03-26 03:00:00 (Sun)
  63834231600, #    local_end 2023-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63834224400, #    utc_start 2023-10-29 01:00:00 (Sun)
  63847530000, #      utc_end 2024-03-31 01:00:00 (Sun)
  63834228000, #  local_start 2023-10-29 02:00:00 (Sun)
  63847533600, #    local_end 2024-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63847530000, #    utc_start 2024-03-31 01:00:00 (Sun)
  63865674000, #      utc_end 2024-10-27 01:00:00 (Sun)
  63847537200, #  local_start 2024-03-31 03:00:00 (Sun)
  63865681200, #    local_end 2024-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63865674000, #    utc_start 2024-10-27 01:00:00 (Sun)
  63878979600, #      utc_end 2025-03-30 01:00:00 (Sun)
  63865677600, #  local_start 2024-10-27 02:00:00 (Sun)
  63878983200, #    local_end 2025-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63878979600, #    utc_start 2025-03-30 01:00:00 (Sun)
  63897123600, #      utc_end 2025-10-26 01:00:00 (Sun)
  63878986800, #  local_start 2025-03-30 03:00:00 (Sun)
  63897130800, #    local_end 2025-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63897123600, #    utc_start 2025-10-26 01:00:00 (Sun)
  63910429200, #      utc_end 2026-03-29 01:00:00 (Sun)
  63897127200, #  local_start 2025-10-26 02:00:00 (Sun)
  63910432800, #    local_end 2026-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63910429200, #    utc_start 2026-03-29 01:00:00 (Sun)
  63928573200, #      utc_end 2026-10-25 01:00:00 (Sun)
  63910436400, #  local_start 2026-03-29 03:00:00 (Sun)
  63928580400, #    local_end 2026-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63928573200, #    utc_start 2026-10-25 01:00:00 (Sun)
  63941878800, #      utc_end 2027-03-28 01:00:00 (Sun)
  63928576800, #  local_start 2026-10-25 02:00:00 (Sun)
  63941882400, #    local_end 2027-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63941878800, #    utc_start 2027-03-28 01:00:00 (Sun)
  63960627600, #      utc_end 2027-10-31 01:00:00 (Sun)
  63941886000, #  local_start 2027-03-28 03:00:00 (Sun)
  63960634800, #    local_end 2027-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63960627600, #    utc_start 2027-10-31 01:00:00 (Sun)
  63973328400, #      utc_end 2028-03-26 01:00:00 (Sun)
  63960631200, #  local_start 2027-10-31 02:00:00 (Sun)
  63973332000, #    local_end 2028-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63973328400, #    utc_start 2028-03-26 01:00:00 (Sun)
  63992077200, #      utc_end 2028-10-29 01:00:00 (Sun)
  63973335600, #  local_start 2028-03-26 03:00:00 (Sun)
  63992084400, #    local_end 2028-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63992077200, #    utc_start 2028-10-29 01:00:00 (Sun)
  64004778000, #      utc_end 2029-03-25 01:00:00 (Sun)
  63992080800, #  local_start 2028-10-29 02:00:00 (Sun)
  64004781600, #    local_end 2029-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  64004778000, #    utc_start 2029-03-25 01:00:00 (Sun)
  64023526800, #      utc_end 2029-10-28 01:00:00 (Sun)
  64004785200, #  local_start 2029-03-25 03:00:00 (Sun)
  64023534000, #    local_end 2029-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  64023526800, #    utc_start 2029-10-28 01:00:00 (Sun)
  64036832400, #      utc_end 2030-03-31 01:00:00 (Sun)
  64023530400, #  local_start 2029-10-28 02:00:00 (Sun)
  64036836000, #    local_end 2030-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  64036832400, #    utc_start 2030-03-31 01:00:00 (Sun)
  64054976400, #      utc_end 2030-10-27 01:00:00 (Sun)
  64036839600, #  local_start 2030-03-31 03:00:00 (Sun)
  64054983600, #    local_end 2030-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {85}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { 3600 }
  
  my $last_observance = bless( {
    'format' => 'CE%sT',
    'gmtoff' => '1:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 721720,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 721720,
      'utc_rd_secs' => 0,
      'utc_year' => 1978
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => 3600,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 721719,
      'local_rd_secs' => 82800,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 721719,
      'utc_rd_secs' => 82800,
      'utc_year' => 1977
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '1:00u',
      'from' => '1996',
      'in' => 'Oct',
      'letter' => '',
      'name' => 'EU',
      'offset_from_std' => 0,
      'on' => 'lastSun',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '1:00u',
      'from' => '1981',
      'in' => 'Mar',
      'letter' => 'S',
      'name' => 'EU',
      'offset_from_std' => 3600,
      'on' => 'lastSun',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_EUROPE_BRUSSELS

    $main::fatpacked{"DateTime/TimeZone/Europe/Bucharest.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_EUROPE_BUCHAREST';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Europe::Bucharest;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Europe::Bucharest::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59666278536, #      utc_end 1891-09-30 22:15:36 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59666284800, #    local_end 1891-10-01 00:00:00 (Thu)
  6264,
  0,
  'LMT',
      ],
      [
  59666278536, #    utc_start 1891-09-30 22:15:36 (Wed)
  60922534536, #      utc_end 1931-07-23 22:15:36 (Thu)
  59666284800, #  local_start 1891-10-01 00:00:00 (Thu)
  60922540800, #    local_end 1931-07-24 00:00:00 (Fri)
  6264,
  0,
  'BMT',
      ],
      [
  60922534536, #    utc_start 1931-07-23 22:15:36 (Thu)
  60948626400, #      utc_end 1932-05-20 22:00:00 (Fri)
  60922541736, #  local_start 1931-07-24 00:15:36 (Fri)
  60948633600, #    local_end 1932-05-21 00:00:00 (Sat)
  7200,
  0,
  'EET',
      ],
      [
  60948626400, #    utc_start 1932-05-20 22:00:00 (Fri)
  60960204000, #      utc_end 1932-10-01 22:00:00 (Sat)
  60948637200, #  local_start 1932-05-21 01:00:00 (Sat)
  60960214800, #    local_end 1932-10-02 01:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  60960204000, #    utc_start 1932-10-01 22:00:00 (Sat)
  60975928800, #      utc_end 1933-04-01 22:00:00 (Sat)
  60960211200, #  local_start 1932-10-02 00:00:00 (Sun)
  60975936000, #    local_end 1933-04-02 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  60975928800, #    utc_start 1933-04-01 22:00:00 (Sat)
  60991653600, #      utc_end 1933-09-30 22:00:00 (Sat)
  60975939600, #  local_start 1933-04-02 01:00:00 (Sun)
  60991664400, #    local_end 1933-10-01 01:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  60991653600, #    utc_start 1933-09-30 22:00:00 (Sat)
  61007983200, #      utc_end 1934-04-07 22:00:00 (Sat)
  60991660800, #  local_start 1933-10-01 00:00:00 (Sun)
  61007990400, #    local_end 1934-04-08 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  61007983200, #    utc_start 1934-04-07 22:00:00 (Sat)
  61023708000, #      utc_end 1934-10-06 22:00:00 (Sat)
  61007994000, #  local_start 1934-04-08 01:00:00 (Sun)
  61023718800, #    local_end 1934-10-07 01:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  61023708000, #    utc_start 1934-10-06 22:00:00 (Sat)
  61039432800, #      utc_end 1935-04-06 22:00:00 (Sat)
  61023715200, #  local_start 1934-10-07 00:00:00 (Sun)
  61039440000, #    local_end 1935-04-07 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  61039432800, #    utc_start 1935-04-06 22:00:00 (Sat)
  61055157600, #      utc_end 1935-10-05 22:00:00 (Sat)
  61039443600, #  local_start 1935-04-07 01:00:00 (Sun)
  61055168400, #    local_end 1935-10-06 01:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  61055157600, #    utc_start 1935-10-05 22:00:00 (Sat)
  61070882400, #      utc_end 1936-04-04 22:00:00 (Sat)
  61055164800, #  local_start 1935-10-06 00:00:00 (Sun)
  61070889600, #    local_end 1936-04-05 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  61070882400, #    utc_start 1936-04-04 22:00:00 (Sat)
  61086607200, #      utc_end 1936-10-03 22:00:00 (Sat)
  61070893200, #  local_start 1936-04-05 01:00:00 (Sun)
  61086618000, #    local_end 1936-10-04 01:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  61086607200, #    utc_start 1936-10-03 22:00:00 (Sat)
  61102332000, #      utc_end 1937-04-03 22:00:00 (Sat)
  61086614400, #  local_start 1936-10-04 00:00:00 (Sun)
  61102339200, #    local_end 1937-04-04 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  61102332000, #    utc_start 1937-04-03 22:00:00 (Sat)
  61118056800, #      utc_end 1937-10-02 22:00:00 (Sat)
  61102342800, #  local_start 1937-04-04 01:00:00 (Sun)
  61118067600, #    local_end 1937-10-03 01:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  61118056800, #    utc_start 1937-10-02 22:00:00 (Sat)
  61133781600, #      utc_end 1938-04-02 22:00:00 (Sat)
  61118064000, #  local_start 1937-10-03 00:00:00 (Sun)
  61133788800, #    local_end 1938-04-03 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  61133781600, #    utc_start 1938-04-02 22:00:00 (Sat)
  61149506400, #      utc_end 1938-10-01 22:00:00 (Sat)
  61133792400, #  local_start 1938-04-03 01:00:00 (Sun)
  61149517200, #    local_end 1938-10-02 01:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  61149506400, #    utc_start 1938-10-01 22:00:00 (Sat)
  61165231200, #      utc_end 1939-04-01 22:00:00 (Sat)
  61149513600, #  local_start 1938-10-02 00:00:00 (Sun)
  61165238400, #    local_end 1939-04-02 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  61165231200, #    utc_start 1939-04-01 22:00:00 (Sat)
  61180956000, #      utc_end 1939-09-30 22:00:00 (Sat)
  61165242000, #  local_start 1939-04-02 01:00:00 (Sun)
  61180966800, #    local_end 1939-10-01 01:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  61180956000, #    utc_start 1939-09-30 22:00:00 (Sat)
  62432287200, #      utc_end 1979-05-26 22:00:00 (Sat)
  61180963200, #  local_start 1939-10-01 00:00:00 (Sun)
  62432294400, #    local_end 1979-05-27 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62432287200, #    utc_start 1979-05-26 22:00:00 (Sat)
  62443170000, #      utc_end 1979-09-29 21:00:00 (Sat)
  62432298000, #  local_start 1979-05-27 01:00:00 (Sun)
  62443180800, #    local_end 1979-09-30 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62443170000, #    utc_start 1979-09-29 21:00:00 (Sat)
  62459499600, #      utc_end 1980-04-05 21:00:00 (Sat)
  62443177200, #  local_start 1979-09-29 23:00:00 (Sat)
  62459506800, #    local_end 1980-04-05 23:00:00 (Sat)
  7200,
  0,
  'EET',
      ],
      [
  62459499600, #    utc_start 1980-04-05 21:00:00 (Sat)
  62474623200, #      utc_end 1980-09-27 22:00:00 (Sat)
  62459510400, #  local_start 1980-04-06 00:00:00 (Sun)
  62474634000, #    local_end 1980-09-28 01:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62474623200, #    utc_start 1980-09-27 22:00:00 (Sat)
  62490355200, #      utc_end 1981-03-29 00:00:00 (Sun)
  62474630400, #  local_start 1980-09-28 00:00:00 (Sun)
  62490362400, #    local_end 1981-03-29 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62490355200, #    utc_start 1981-03-29 00:00:00 (Sun)
  62506080000, #      utc_end 1981-09-27 00:00:00 (Sun)
  62490366000, #  local_start 1981-03-29 03:00:00 (Sun)
  62506090800, #    local_end 1981-09-27 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62506080000, #    utc_start 1981-09-27 00:00:00 (Sun)
  62521804800, #      utc_end 1982-03-28 00:00:00 (Sun)
  62506087200, #  local_start 1981-09-27 02:00:00 (Sun)
  62521812000, #    local_end 1982-03-28 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62521804800, #    utc_start 1982-03-28 00:00:00 (Sun)
  62537529600, #      utc_end 1982-09-26 00:00:00 (Sun)
  62521815600, #  local_start 1982-03-28 03:00:00 (Sun)
  62537540400, #    local_end 1982-09-26 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62537529600, #    utc_start 1982-09-26 00:00:00 (Sun)
  62553254400, #      utc_end 1983-03-27 00:00:00 (Sun)
  62537536800, #  local_start 1982-09-26 02:00:00 (Sun)
  62553261600, #    local_end 1983-03-27 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62553254400, #    utc_start 1983-03-27 00:00:00 (Sun)
  62568979200, #      utc_end 1983-09-25 00:00:00 (Sun)
  62553265200, #  local_start 1983-03-27 03:00:00 (Sun)
  62568990000, #    local_end 1983-09-25 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62568979200, #    utc_start 1983-09-25 00:00:00 (Sun)
  62584704000, #      utc_end 1984-03-25 00:00:00 (Sun)
  62568986400, #  local_start 1983-09-25 02:00:00 (Sun)
  62584711200, #    local_end 1984-03-25 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62584704000, #    utc_start 1984-03-25 00:00:00 (Sun)
  62601033600, #      utc_end 1984-09-30 00:00:00 (Sun)
  62584714800, #  local_start 1984-03-25 03:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62601033600, #    utc_start 1984-09-30 00:00:00 (Sun)
  62616758400, #      utc_end 1985-03-31 00:00:00 (Sun)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62616758400, #    utc_start 1985-03-31 00:00:00 (Sun)
  62632483200, #      utc_end 1985-09-29 00:00:00 (Sun)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62632483200, #    utc_start 1985-09-29 00:00:00 (Sun)
  62648208000, #      utc_end 1986-03-30 00:00:00 (Sun)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62648208000, #    utc_start 1986-03-30 00:00:00 (Sun)
  62663932800, #      utc_end 1986-09-28 00:00:00 (Sun)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62663932800, #    utc_start 1986-09-28 00:00:00 (Sun)
  62679657600, #      utc_end 1987-03-29 00:00:00 (Sun)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62679657600, #    utc_start 1987-03-29 00:00:00 (Sun)
  62695382400, #      utc_end 1987-09-27 00:00:00 (Sun)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62695382400, #    utc_start 1987-09-27 00:00:00 (Sun)
  62711107200, #      utc_end 1988-03-27 00:00:00 (Sun)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62711107200, #    utc_start 1988-03-27 00:00:00 (Sun)
  62726832000, #      utc_end 1988-09-25 00:00:00 (Sun)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62726832000, #    utc_start 1988-09-25 00:00:00 (Sun)
  62742556800, #      utc_end 1989-03-26 00:00:00 (Sun)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62742556800, #    utc_start 1989-03-26 00:00:00 (Sun)
  62758281600, #      utc_end 1989-09-24 00:00:00 (Sun)
  62742567600, #  local_start 1989-03-26 03:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62758281600, #    utc_start 1989-09-24 00:00:00 (Sun)
  62774006400, #      utc_end 1990-03-25 00:00:00 (Sun)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62774006400, #    utc_start 1990-03-25 00:00:00 (Sun)
  62790336000, #      utc_end 1990-09-30 00:00:00 (Sun)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62790336000, #    utc_start 1990-09-30 00:00:00 (Sun)
  62798364000, #      utc_end 1990-12-31 22:00:00 (Mon)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62798371200, #    local_end 1991-01-01 00:00:00 (Tue)
  7200,
  0,
  'EET',
      ],
      [
  62798364000, #    utc_start 1990-12-31 22:00:00 (Mon)
  62806053600, #      utc_end 1991-03-30 22:00:00 (Sat)
  62798371200, #  local_start 1991-01-01 00:00:00 (Tue)
  62806060800, #    local_end 1991-03-31 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62806053600, #    utc_start 1991-03-30 22:00:00 (Sat)
  62821778400, #      utc_end 1991-09-28 22:00:00 (Sat)
  62806064400, #  local_start 1991-03-31 01:00:00 (Sun)
  62821789200, #    local_end 1991-09-29 01:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62821778400, #    utc_start 1991-09-28 22:00:00 (Sat)
  62837503200, #      utc_end 1992-03-28 22:00:00 (Sat)
  62821785600, #  local_start 1991-09-29 00:00:00 (Sun)
  62837510400, #    local_end 1992-03-29 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62837503200, #    utc_start 1992-03-28 22:00:00 (Sat)
  62853228000, #      utc_end 1992-09-26 22:00:00 (Sat)
  62837514000, #  local_start 1992-03-29 01:00:00 (Sun)
  62853238800, #    local_end 1992-09-27 01:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62853228000, #    utc_start 1992-09-26 22:00:00 (Sat)
  62868952800, #      utc_end 1993-03-27 22:00:00 (Sat)
  62853235200, #  local_start 1992-09-27 00:00:00 (Sun)
  62868960000, #    local_end 1993-03-28 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62868952800, #    utc_start 1993-03-27 22:00:00 (Sat)
  62884677600, #      utc_end 1993-09-25 22:00:00 (Sat)
  62868963600, #  local_start 1993-03-28 01:00:00 (Sun)
  62884688400, #    local_end 1993-09-26 01:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62884677600, #    utc_start 1993-09-25 22:00:00 (Sat)
  62893058400, #      utc_end 1993-12-31 22:00:00 (Fri)
  62884684800, #  local_start 1993-09-26 00:00:00 (Sun)
  62893065600, #    local_end 1994-01-01 00:00:00 (Sat)
  7200,
  0,
  'EET',
      ],
      [
  62893058400, #    utc_start 1993-12-31 22:00:00 (Fri)
  62900402400, #      utc_end 1994-03-26 22:00:00 (Sat)
  62893065600, #  local_start 1994-01-01 00:00:00 (Sat)
  62900409600, #    local_end 1994-03-27 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62900402400, #    utc_start 1994-03-26 22:00:00 (Sat)
  62916123600, #      utc_end 1994-09-24 21:00:00 (Sat)
  62900413200, #  local_start 1994-03-27 01:00:00 (Sun)
  62916134400, #    local_end 1994-09-25 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62916123600, #    utc_start 1994-09-24 21:00:00 (Sat)
  62931852000, #      utc_end 1995-03-25 22:00:00 (Sat)
  62916130800, #  local_start 1994-09-24 23:00:00 (Sat)
  62931859200, #    local_end 1995-03-26 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62931852000, #    utc_start 1995-03-25 22:00:00 (Sat)
  62947573200, #      utc_end 1995-09-23 21:00:00 (Sat)
  62931862800, #  local_start 1995-03-26 01:00:00 (Sun)
  62947584000, #    local_end 1995-09-24 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62947573200, #    utc_start 1995-09-23 21:00:00 (Sat)
  62963906400, #      utc_end 1996-03-30 22:00:00 (Sat)
  62947580400, #  local_start 1995-09-23 23:00:00 (Sat)
  62963913600, #    local_end 1996-03-31 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62963906400, #    utc_start 1996-03-30 22:00:00 (Sat)
  62982046800, #      utc_end 1996-10-26 21:00:00 (Sat)
  62963917200, #  local_start 1996-03-31 01:00:00 (Sun)
  62982057600, #    local_end 1996-10-27 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62982046800, #    utc_start 1996-10-26 21:00:00 (Sat)
  62987752800, #      utc_end 1996-12-31 22:00:00 (Tue)
  62982054000, #  local_start 1996-10-26 23:00:00 (Sat)
  62987760000, #    local_end 1997-01-01 00:00:00 (Wed)
  7200,
  0,
  'EET',
      ],
      [
  62987752800, #    utc_start 1996-12-31 22:00:00 (Tue)
  62995366800, #      utc_end 1997-03-30 01:00:00 (Sun)
  62987760000, #  local_start 1997-01-01 00:00:00 (Wed)
  62995374000, #    local_end 1997-03-30 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62995366800, #    utc_start 1997-03-30 01:00:00 (Sun)
  63013510800, #      utc_end 1997-10-26 01:00:00 (Sun)
  62995377600, #  local_start 1997-03-30 04:00:00 (Sun)
  63013521600, #    local_end 1997-10-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63013510800, #    utc_start 1997-10-26 01:00:00 (Sun)
  63026816400, #      utc_end 1998-03-29 01:00:00 (Sun)
  63013518000, #  local_start 1997-10-26 03:00:00 (Sun)
  63026823600, #    local_end 1998-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63026816400, #    utc_start 1998-03-29 01:00:00 (Sun)
  63044960400, #      utc_end 1998-10-25 01:00:00 (Sun)
  63026827200, #  local_start 1998-03-29 04:00:00 (Sun)
  63044971200, #    local_end 1998-10-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63044960400, #    utc_start 1998-10-25 01:00:00 (Sun)
  63058266000, #      utc_end 1999-03-28 01:00:00 (Sun)
  63044967600, #  local_start 1998-10-25 03:00:00 (Sun)
  63058273200, #    local_end 1999-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63058266000, #    utc_start 1999-03-28 01:00:00 (Sun)
  63077014800, #      utc_end 1999-10-31 01:00:00 (Sun)
  63058276800, #  local_start 1999-03-28 04:00:00 (Sun)
  63077025600, #    local_end 1999-10-31 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63077014800, #    utc_start 1999-10-31 01:00:00 (Sun)
  63089715600, #      utc_end 2000-03-26 01:00:00 (Sun)
  63077022000, #  local_start 1999-10-31 03:00:00 (Sun)
  63089722800, #    local_end 2000-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63089715600, #    utc_start 2000-03-26 01:00:00 (Sun)
  63108464400, #      utc_end 2000-10-29 01:00:00 (Sun)
  63089726400, #  local_start 2000-03-26 04:00:00 (Sun)
  63108475200, #    local_end 2000-10-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63108464400, #    utc_start 2000-10-29 01:00:00 (Sun)
  63121165200, #      utc_end 2001-03-25 01:00:00 (Sun)
  63108471600, #  local_start 2000-10-29 03:00:00 (Sun)
  63121172400, #    local_end 2001-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63121165200, #    utc_start 2001-03-25 01:00:00 (Sun)
  63139914000, #      utc_end 2001-10-28 01:00:00 (Sun)
  63121176000, #  local_start 2001-03-25 04:00:00 (Sun)
  63139924800, #    local_end 2001-10-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63139914000, #    utc_start 2001-10-28 01:00:00 (Sun)
  63153219600, #      utc_end 2002-03-31 01:00:00 (Sun)
  63139921200, #  local_start 2001-10-28 03:00:00 (Sun)
  63153226800, #    local_end 2002-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63153219600, #    utc_start 2002-03-31 01:00:00 (Sun)
  63171363600, #      utc_end 2002-10-27 01:00:00 (Sun)
  63153230400, #  local_start 2002-03-31 04:00:00 (Sun)
  63171374400, #    local_end 2002-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63171363600, #    utc_start 2002-10-27 01:00:00 (Sun)
  63184669200, #      utc_end 2003-03-30 01:00:00 (Sun)
  63171370800, #  local_start 2002-10-27 03:00:00 (Sun)
  63184676400, #    local_end 2003-03-30 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63184669200, #    utc_start 2003-03-30 01:00:00 (Sun)
  63202813200, #      utc_end 2003-10-26 01:00:00 (Sun)
  63184680000, #  local_start 2003-03-30 04:00:00 (Sun)
  63202824000, #    local_end 2003-10-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63202813200, #    utc_start 2003-10-26 01:00:00 (Sun)
  63216118800, #      utc_end 2004-03-28 01:00:00 (Sun)
  63202820400, #  local_start 2003-10-26 03:00:00 (Sun)
  63216126000, #    local_end 2004-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63216118800, #    utc_start 2004-03-28 01:00:00 (Sun)
  63234867600, #      utc_end 2004-10-31 01:00:00 (Sun)
  63216129600, #  local_start 2004-03-28 04:00:00 (Sun)
  63234878400, #    local_end 2004-10-31 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63234867600, #    utc_start 2004-10-31 01:00:00 (Sun)
  63247568400, #      utc_end 2005-03-27 01:00:00 (Sun)
  63234874800, #  local_start 2004-10-31 03:00:00 (Sun)
  63247575600, #    local_end 2005-03-27 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63247568400, #    utc_start 2005-03-27 01:00:00 (Sun)
  63266317200, #      utc_end 2005-10-30 01:00:00 (Sun)
  63247579200, #  local_start 2005-03-27 04:00:00 (Sun)
  63266328000, #    local_end 2005-10-30 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63266317200, #    utc_start 2005-10-30 01:00:00 (Sun)
  63279018000, #      utc_end 2006-03-26 01:00:00 (Sun)
  63266324400, #  local_start 2005-10-30 03:00:00 (Sun)
  63279025200, #    local_end 2006-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63279018000, #    utc_start 2006-03-26 01:00:00 (Sun)
  63297766800, #      utc_end 2006-10-29 01:00:00 (Sun)
  63279028800, #  local_start 2006-03-26 04:00:00 (Sun)
  63297777600, #    local_end 2006-10-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63297766800, #    utc_start 2006-10-29 01:00:00 (Sun)
  63310467600, #      utc_end 2007-03-25 01:00:00 (Sun)
  63297774000, #  local_start 2006-10-29 03:00:00 (Sun)
  63310474800, #    local_end 2007-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63310467600, #    utc_start 2007-03-25 01:00:00 (Sun)
  63329216400, #      utc_end 2007-10-28 01:00:00 (Sun)
  63310478400, #  local_start 2007-03-25 04:00:00 (Sun)
  63329227200, #    local_end 2007-10-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63329216400, #    utc_start 2007-10-28 01:00:00 (Sun)
  63342522000, #      utc_end 2008-03-30 01:00:00 (Sun)
  63329223600, #  local_start 2007-10-28 03:00:00 (Sun)
  63342529200, #    local_end 2008-03-30 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63342522000, #    utc_start 2008-03-30 01:00:00 (Sun)
  63360666000, #      utc_end 2008-10-26 01:00:00 (Sun)
  63342532800, #  local_start 2008-03-30 04:00:00 (Sun)
  63360676800, #    local_end 2008-10-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63360666000, #    utc_start 2008-10-26 01:00:00 (Sun)
  63373971600, #      utc_end 2009-03-29 01:00:00 (Sun)
  63360673200, #  local_start 2008-10-26 03:00:00 (Sun)
  63373978800, #    local_end 2009-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63373971600, #    utc_start 2009-03-29 01:00:00 (Sun)
  63392115600, #      utc_end 2009-10-25 01:00:00 (Sun)
  63373982400, #  local_start 2009-03-29 04:00:00 (Sun)
  63392126400, #    local_end 2009-10-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63392115600, #    utc_start 2009-10-25 01:00:00 (Sun)
  63405421200, #      utc_end 2010-03-28 01:00:00 (Sun)
  63392122800, #  local_start 2009-10-25 03:00:00 (Sun)
  63405428400, #    local_end 2010-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63405421200, #    utc_start 2010-03-28 01:00:00 (Sun)
  63424170000, #      utc_end 2010-10-31 01:00:00 (Sun)
  63405432000, #  local_start 2010-03-28 04:00:00 (Sun)
  63424180800, #    local_end 2010-10-31 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63424170000, #    utc_start 2010-10-31 01:00:00 (Sun)
  63436870800, #      utc_end 2011-03-27 01:00:00 (Sun)
  63424177200, #  local_start 2010-10-31 03:00:00 (Sun)
  63436878000, #    local_end 2011-03-27 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63436870800, #    utc_start 2011-03-27 01:00:00 (Sun)
  63455619600, #      utc_end 2011-10-30 01:00:00 (Sun)
  63436881600, #  local_start 2011-03-27 04:00:00 (Sun)
  63455630400, #    local_end 2011-10-30 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63455619600, #    utc_start 2011-10-30 01:00:00 (Sun)
  63468320400, #      utc_end 2012-03-25 01:00:00 (Sun)
  63455626800, #  local_start 2011-10-30 03:00:00 (Sun)
  63468327600, #    local_end 2012-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63468320400, #    utc_start 2012-03-25 01:00:00 (Sun)
  63487069200, #      utc_end 2012-10-28 01:00:00 (Sun)
  63468331200, #  local_start 2012-03-25 04:00:00 (Sun)
  63487080000, #    local_end 2012-10-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63487069200, #    utc_start 2012-10-28 01:00:00 (Sun)
  63500374800, #      utc_end 2013-03-31 01:00:00 (Sun)
  63487076400, #  local_start 2012-10-28 03:00:00 (Sun)
  63500382000, #    local_end 2013-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63500374800, #    utc_start 2013-03-31 01:00:00 (Sun)
  63518518800, #      utc_end 2013-10-27 01:00:00 (Sun)
  63500385600, #  local_start 2013-03-31 04:00:00 (Sun)
  63518529600, #    local_end 2013-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63518518800, #    utc_start 2013-10-27 01:00:00 (Sun)
  63531824400, #      utc_end 2014-03-30 01:00:00 (Sun)
  63518526000, #  local_start 2013-10-27 03:00:00 (Sun)
  63531831600, #    local_end 2014-03-30 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63531824400, #    utc_start 2014-03-30 01:00:00 (Sun)
  63549968400, #      utc_end 2014-10-26 01:00:00 (Sun)
  63531835200, #  local_start 2014-03-30 04:00:00 (Sun)
  63549979200, #    local_end 2014-10-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63549968400, #    utc_start 2014-10-26 01:00:00 (Sun)
  63563274000, #      utc_end 2015-03-29 01:00:00 (Sun)
  63549975600, #  local_start 2014-10-26 03:00:00 (Sun)
  63563281200, #    local_end 2015-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63563274000, #    utc_start 2015-03-29 01:00:00 (Sun)
  63581418000, #      utc_end 2015-10-25 01:00:00 (Sun)
  63563284800, #  local_start 2015-03-29 04:00:00 (Sun)
  63581428800, #    local_end 2015-10-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63581418000, #    utc_start 2015-10-25 01:00:00 (Sun)
  63594723600, #      utc_end 2016-03-27 01:00:00 (Sun)
  63581425200, #  local_start 2015-10-25 03:00:00 (Sun)
  63594730800, #    local_end 2016-03-27 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63594723600, #    utc_start 2016-03-27 01:00:00 (Sun)
  63613472400, #      utc_end 2016-10-30 01:00:00 (Sun)
  63594734400, #  local_start 2016-03-27 04:00:00 (Sun)
  63613483200, #    local_end 2016-10-30 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63613472400, #    utc_start 2016-10-30 01:00:00 (Sun)
  63626173200, #      utc_end 2017-03-26 01:00:00 (Sun)
  63613479600, #  local_start 2016-10-30 03:00:00 (Sun)
  63626180400, #    local_end 2017-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63626173200, #    utc_start 2017-03-26 01:00:00 (Sun)
  63644922000, #      utc_end 2017-10-29 01:00:00 (Sun)
  63626184000, #  local_start 2017-03-26 04:00:00 (Sun)
  63644932800, #    local_end 2017-10-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63644922000, #    utc_start 2017-10-29 01:00:00 (Sun)
  63657622800, #      utc_end 2018-03-25 01:00:00 (Sun)
  63644929200, #  local_start 2017-10-29 03:00:00 (Sun)
  63657630000, #    local_end 2018-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63657622800, #    utc_start 2018-03-25 01:00:00 (Sun)
  63676371600, #      utc_end 2018-10-28 01:00:00 (Sun)
  63657633600, #  local_start 2018-03-25 04:00:00 (Sun)
  63676382400, #    local_end 2018-10-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63676371600, #    utc_start 2018-10-28 01:00:00 (Sun)
  63689677200, #      utc_end 2019-03-31 01:00:00 (Sun)
  63676378800, #  local_start 2018-10-28 03:00:00 (Sun)
  63689684400, #    local_end 2019-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63689677200, #    utc_start 2019-03-31 01:00:00 (Sun)
  63707821200, #      utc_end 2019-10-27 01:00:00 (Sun)
  63689688000, #  local_start 2019-03-31 04:00:00 (Sun)
  63707832000, #    local_end 2019-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63707821200, #    utc_start 2019-10-27 01:00:00 (Sun)
  63721126800, #      utc_end 2020-03-29 01:00:00 (Sun)
  63707828400, #  local_start 2019-10-27 03:00:00 (Sun)
  63721134000, #    local_end 2020-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63721126800, #    utc_start 2020-03-29 01:00:00 (Sun)
  63739270800, #      utc_end 2020-10-25 01:00:00 (Sun)
  63721137600, #  local_start 2020-03-29 04:00:00 (Sun)
  63739281600, #    local_end 2020-10-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63739270800, #    utc_start 2020-10-25 01:00:00 (Sun)
  63752576400, #      utc_end 2021-03-28 01:00:00 (Sun)
  63739278000, #  local_start 2020-10-25 03:00:00 (Sun)
  63752583600, #    local_end 2021-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63752576400, #    utc_start 2021-03-28 01:00:00 (Sun)
  63771325200, #      utc_end 2021-10-31 01:00:00 (Sun)
  63752587200, #  local_start 2021-03-28 04:00:00 (Sun)
  63771336000, #    local_end 2021-10-31 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63771325200, #    utc_start 2021-10-31 01:00:00 (Sun)
  63784026000, #      utc_end 2022-03-27 01:00:00 (Sun)
  63771332400, #  local_start 2021-10-31 03:00:00 (Sun)
  63784033200, #    local_end 2022-03-27 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63784026000, #    utc_start 2022-03-27 01:00:00 (Sun)
  63802774800, #      utc_end 2022-10-30 01:00:00 (Sun)
  63784036800, #  local_start 2022-03-27 04:00:00 (Sun)
  63802785600, #    local_end 2022-10-30 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63802774800, #    utc_start 2022-10-30 01:00:00 (Sun)
  63815475600, #      utc_end 2023-03-26 01:00:00 (Sun)
  63802782000, #  local_start 2022-10-30 03:00:00 (Sun)
  63815482800, #    local_end 2023-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63815475600, #    utc_start 2023-03-26 01:00:00 (Sun)
  63834224400, #      utc_end 2023-10-29 01:00:00 (Sun)
  63815486400, #  local_start 2023-03-26 04:00:00 (Sun)
  63834235200, #    local_end 2023-10-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63834224400, #    utc_start 2023-10-29 01:00:00 (Sun)
  63847530000, #      utc_end 2024-03-31 01:00:00 (Sun)
  63834231600, #  local_start 2023-10-29 03:00:00 (Sun)
  63847537200, #    local_end 2024-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63847530000, #    utc_start 2024-03-31 01:00:00 (Sun)
  63865674000, #      utc_end 2024-10-27 01:00:00 (Sun)
  63847540800, #  local_start 2024-03-31 04:00:00 (Sun)
  63865684800, #    local_end 2024-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63865674000, #    utc_start 2024-10-27 01:00:00 (Sun)
  63878979600, #      utc_end 2025-03-30 01:00:00 (Sun)
  63865681200, #  local_start 2024-10-27 03:00:00 (Sun)
  63878986800, #    local_end 2025-03-30 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63878979600, #    utc_start 2025-03-30 01:00:00 (Sun)
  63897123600, #      utc_end 2025-10-26 01:00:00 (Sun)
  63878990400, #  local_start 2025-03-30 04:00:00 (Sun)
  63897134400, #    local_end 2025-10-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63897123600, #    utc_start 2025-10-26 01:00:00 (Sun)
  63910429200, #      utc_end 2026-03-29 01:00:00 (Sun)
  63897130800, #  local_start 2025-10-26 03:00:00 (Sun)
  63910436400, #    local_end 2026-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63910429200, #    utc_start 2026-03-29 01:00:00 (Sun)
  63928573200, #      utc_end 2026-10-25 01:00:00 (Sun)
  63910440000, #  local_start 2026-03-29 04:00:00 (Sun)
  63928584000, #    local_end 2026-10-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63928573200, #    utc_start 2026-10-25 01:00:00 (Sun)
  63941878800, #      utc_end 2027-03-28 01:00:00 (Sun)
  63928580400, #  local_start 2026-10-25 03:00:00 (Sun)
  63941886000, #    local_end 2027-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63941878800, #    utc_start 2027-03-28 01:00:00 (Sun)
  63960627600, #      utc_end 2027-10-31 01:00:00 (Sun)
  63941889600, #  local_start 2027-03-28 04:00:00 (Sun)
  63960638400, #    local_end 2027-10-31 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63960627600, #    utc_start 2027-10-31 01:00:00 (Sun)
  63973328400, #      utc_end 2028-03-26 01:00:00 (Sun)
  63960634800, #  local_start 2027-10-31 03:00:00 (Sun)
  63973335600, #    local_end 2028-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63973328400, #    utc_start 2028-03-26 01:00:00 (Sun)
  63992077200, #      utc_end 2028-10-29 01:00:00 (Sun)
  63973339200, #  local_start 2028-03-26 04:00:00 (Sun)
  63992088000, #    local_end 2028-10-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63992077200, #    utc_start 2028-10-29 01:00:00 (Sun)
  64004778000, #      utc_end 2029-03-25 01:00:00 (Sun)
  63992084400, #  local_start 2028-10-29 03:00:00 (Sun)
  64004785200, #    local_end 2029-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  64004778000, #    utc_start 2029-03-25 01:00:00 (Sun)
  64023526800, #      utc_end 2029-10-28 01:00:00 (Sun)
  64004788800, #  local_start 2029-03-25 04:00:00 (Sun)
  64023537600, #    local_end 2029-10-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  64023526800, #    utc_start 2029-10-28 01:00:00 (Sun)
  64036832400, #      utc_end 2030-03-31 01:00:00 (Sun)
  64023534000, #  local_start 2029-10-28 03:00:00 (Sun)
  64036839600, #    local_end 2030-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  64036832400, #    utc_start 2030-03-31 01:00:00 (Sun)
  64054976400, #      utc_end 2030-10-27 01:00:00 (Sun)
  64036843200, #  local_start 2030-03-31 04:00:00 (Sun)
  64054987200, #    local_end 2030-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {60}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { 7200 }
  
  my $last_observance = bless( {
    'format' => 'EE%sT',
    'gmtoff' => '2:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 729025,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 729025,
      'utc_rd_secs' => 0,
      'utc_year' => 1998
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => 7200,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 729024,
      'local_rd_secs' => 79200,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 729024,
      'utc_rd_secs' => 79200,
      'utc_year' => 1997
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '1:00u',
      'from' => '1981',
      'in' => 'Mar',
      'letter' => 'S',
      'name' => 'EU',
      'offset_from_std' => 3600,
      'on' => 'lastSun',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '1:00u',
      'from' => '1996',
      'in' => 'Oct',
      'letter' => '',
      'name' => 'EU',
      'offset_from_std' => 0,
      'on' => 'lastSun',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_EUROPE_BUCHAREST

    $main::fatpacked{"DateTime/TimeZone/Europe/Budapest.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_EUROPE_BUDAPEST';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Europe::Budapest;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Europe::Budapest::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59634744220, #      utc_end 1890-09-30 22:43:40 (Tue)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59634748800, #    local_end 1890-10-01 00:00:00 (Wed)
  4580,
  0,
  'LMT',
      ],
      [
  59634744220, #    utc_start 1890-09-30 22:43:40 (Tue)
  60441976800, #      utc_end 1916-04-30 22:00:00 (Sun)
  59634747820, #  local_start 1890-09-30 23:43:40 (Tue)
  60441980400, #    local_end 1916-04-30 23:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  60441976800, #    utc_start 1916-04-30 22:00:00 (Sun)
  60455199600, #      utc_end 1916-09-30 23:00:00 (Sat)
  60441984000, #  local_start 1916-05-01 00:00:00 (Mon)
  60455206800, #    local_end 1916-10-01 01:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  60455199600, #    utc_start 1916-09-30 23:00:00 (Sat)
  60472227600, #      utc_end 1917-04-16 01:00:00 (Mon)
  60455203200, #  local_start 1916-10-01 00:00:00 (Sun)
  60472231200, #    local_end 1917-04-16 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  60472227600, #    utc_start 1917-04-16 01:00:00 (Mon)
  60485533200, #      utc_end 1917-09-17 01:00:00 (Mon)
  60472234800, #  local_start 1917-04-16 03:00:00 (Mon)
  60485540400, #    local_end 1917-09-17 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  60485533200, #    utc_start 1917-09-17 01:00:00 (Mon)
  60494684400, #      utc_end 1917-12-31 23:00:00 (Mon)
  60485536800, #  local_start 1917-09-17 02:00:00 (Mon)
  60494688000, #    local_end 1918-01-01 00:00:00 (Tue)
  3600,
  0,
  'CET',
      ],
      [
  60494684400, #    utc_start 1917-12-31 23:00:00 (Mon)
  60502471200, #      utc_end 1918-04-01 02:00:00 (Mon)
  60494688000, #  local_start 1918-01-01 00:00:00 (Tue)
  60502474800, #    local_end 1918-04-01 03:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  60502471200, #    utc_start 1918-04-01 02:00:00 (Mon)
  60516982800, #      utc_end 1918-09-16 01:00:00 (Mon)
  60502478400, #  local_start 1918-04-01 04:00:00 (Mon)
  60516990000, #    local_end 1918-09-16 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  60516982800, #    utc_start 1918-09-16 01:00:00 (Mon)
  60535216800, #      utc_end 1919-04-15 02:00:00 (Tue)
  60516986400, #  local_start 1918-09-16 02:00:00 (Mon)
  60535220400, #    local_end 1919-04-15 03:00:00 (Tue)
  3600,
  0,
  'CET',
      ],
      [
  60535216800, #    utc_start 1919-04-15 02:00:00 (Tue)
  60554480400, #      utc_end 1919-11-24 01:00:00 (Mon)
  60535224000, #  local_start 1919-04-15 04:00:00 (Tue)
  60554487600, #    local_end 1919-11-24 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  60554480400, #    utc_start 1919-11-24 01:00:00 (Mon)
  61228911600, #      utc_end 1941-04-07 23:00:00 (Mon)
  60554484000, #  local_start 1919-11-24 02:00:00 (Mon)
  61228915200, #    local_end 1941-04-08 00:00:00 (Tue)
  3600,
  0,
  'CET',
      ],
      [
  61228911600, #    utc_start 1941-04-07 23:00:00 (Mon)
  61278426000, #      utc_end 1942-11-02 01:00:00 (Mon)
  61228918800, #  local_start 1941-04-08 01:00:00 (Tue)
  61278433200, #    local_end 1942-11-02 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61278426000, #    utc_start 1942-11-02 01:00:00 (Mon)
  61291126800, #      utc_end 1943-03-29 01:00:00 (Mon)
  61278429600, #  local_start 1942-11-02 02:00:00 (Mon)
  61291130400, #    local_end 1943-03-29 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61291126800, #    utc_start 1943-03-29 01:00:00 (Mon)
  61307456400, #      utc_end 1943-10-04 01:00:00 (Mon)
  61291134000, #  local_start 1943-03-29 03:00:00 (Mon)
  61307463600, #    local_end 1943-10-04 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61307456400, #    utc_start 1943-10-04 01:00:00 (Mon)
  61323181200, #      utc_end 1944-04-03 01:00:00 (Mon)
  61307460000, #  local_start 1943-10-04 02:00:00 (Mon)
  61323184800, #    local_end 1944-04-03 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61323181200, #    utc_start 1944-04-03 01:00:00 (Mon)
  61338906000, #      utc_end 1944-10-02 01:00:00 (Mon)
  61323188400, #  local_start 1944-04-03 03:00:00 (Mon)
  61338913200, #    local_end 1944-10-02 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61338906000, #    utc_start 1944-10-02 01:00:00 (Mon)
  61346761200, #      utc_end 1944-12-31 23:00:00 (Sun)
  61338909600, #  local_start 1944-10-02 02:00:00 (Mon)
  61346764800, #    local_end 1945-01-01 00:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61346761200, #    utc_start 1944-12-31 23:00:00 (Sun)
  61357212000, #      utc_end 1945-05-01 22:00:00 (Tue)
  61346764800, #  local_start 1945-01-01 00:00:00 (Mon)
  61357215600, #    local_end 1945-05-01 23:00:00 (Tue)
  3600,
  0,
  'CET',
      ],
      [
  61357212000, #    utc_start 1945-05-01 22:00:00 (Tue)
  61373023200, #      utc_end 1945-10-31 22:00:00 (Wed)
  61357219200, #  local_start 1945-05-02 00:00:00 (Wed)
  61373030400, #    local_end 1945-11-01 00:00:00 (Thu)
  7200,
  1,
  'CEST',
      ],
      [
  61373023200, #    utc_start 1945-10-31 22:00:00 (Wed)
  61385994000, #      utc_end 1946-03-31 01:00:00 (Sun)
  61373026800, #  local_start 1945-10-31 23:00:00 (Wed)
  61385997600, #    local_end 1946-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  61385994000, #    utc_start 1946-03-31 01:00:00 (Sun)
  61402323600, #      utc_end 1946-10-06 01:00:00 (Sun)
  61386001200, #  local_start 1946-03-31 03:00:00 (Sun)
  61402330800, #    local_end 1946-10-06 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  61402323600, #    utc_start 1946-10-06 01:00:00 (Sun)
  61418048400, #      utc_end 1947-04-06 01:00:00 (Sun)
  61402327200, #  local_start 1946-10-06 02:00:00 (Sun)
  61418052000, #    local_end 1947-04-06 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  61418048400, #    utc_start 1947-04-06 01:00:00 (Sun)
  61433773200, #      utc_end 1947-10-05 01:00:00 (Sun)
  61418055600, #  local_start 1947-04-06 03:00:00 (Sun)
  61433780400, #    local_end 1947-10-05 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  61433773200, #    utc_start 1947-10-05 01:00:00 (Sun)
  61449498000, #      utc_end 1948-04-04 01:00:00 (Sun)
  61433776800, #  local_start 1947-10-05 02:00:00 (Sun)
  61449501600, #    local_end 1948-04-04 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  61449498000, #    utc_start 1948-04-04 01:00:00 (Sun)
  61465222800, #      utc_end 1948-10-03 01:00:00 (Sun)
  61449505200, #  local_start 1948-04-04 03:00:00 (Sun)
  61465230000, #    local_end 1948-10-03 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  61465222800, #    utc_start 1948-10-03 01:00:00 (Sun)
  61481552400, #      utc_end 1949-04-10 01:00:00 (Sun)
  61465226400, #  local_start 1948-10-03 02:00:00 (Sun)
  61481556000, #    local_end 1949-04-10 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  61481552400, #    utc_start 1949-04-10 01:00:00 (Sun)
  61496672400, #      utc_end 1949-10-02 01:00:00 (Sun)
  61481559600, #  local_start 1949-04-10 03:00:00 (Sun)
  61496679600, #    local_end 1949-10-02 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  61496672400, #    utc_start 1949-10-02 01:00:00 (Sun)
  61513693200, #      utc_end 1950-04-17 01:00:00 (Mon)
  61496676000, #  local_start 1949-10-02 02:00:00 (Sun)
  61513696800, #    local_end 1950-04-17 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61513693200, #    utc_start 1950-04-17 01:00:00 (Mon)
  61530022800, #      utc_end 1950-10-23 01:00:00 (Mon)
  61513700400, #  local_start 1950-04-17 03:00:00 (Mon)
  61530030000, #    local_end 1950-10-23 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61530022800, #    utc_start 1950-10-23 01:00:00 (Mon)
  61643026800, #      utc_end 1954-05-22 23:00:00 (Sat)
  61530026400, #  local_start 1950-10-23 02:00:00 (Mon)
  61643030400, #    local_end 1954-05-23 00:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  61643026800, #    utc_start 1954-05-22 23:00:00 (Sat)
  61654514400, #      utc_end 1954-10-02 22:00:00 (Sat)
  61643034000, #  local_start 1954-05-23 01:00:00 (Sun)
  61654521600, #    local_end 1954-10-03 00:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  61654514400, #    utc_start 1954-10-02 22:00:00 (Sat)
  61674562800, #      utc_end 1955-05-22 23:00:00 (Sun)
  61654518000, #  local_start 1954-10-02 23:00:00 (Sat)
  61674566400, #    local_end 1955-05-23 00:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61674562800, #    utc_start 1955-05-22 23:00:00 (Sun)
  61686050400, #      utc_end 1955-10-02 22:00:00 (Sun)
  61674570000, #  local_start 1955-05-23 01:00:00 (Mon)
  61686057600, #    local_end 1955-10-03 00:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61686050400, #    utc_start 1955-10-02 22:00:00 (Sun)
  61707135600, #      utc_end 1956-06-02 23:00:00 (Sat)
  61686054000, #  local_start 1955-10-02 23:00:00 (Sun)
  61707139200, #    local_end 1956-06-03 00:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  61707135600, #    utc_start 1956-06-02 23:00:00 (Sat)
  61717413600, #      utc_end 1956-09-29 22:00:00 (Sat)
  61707142800, #  local_start 1956-06-03 01:00:00 (Sun)
  61717420800, #    local_end 1956-09-30 00:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  61717413600, #    utc_start 1956-09-29 22:00:00 (Sat)
  61738588800, #      utc_end 1957-06-02 00:00:00 (Sun)
  61717417200, #  local_start 1956-09-29 23:00:00 (Sat)
  61738592400, #    local_end 1957-06-02 01:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  61738588800, #    utc_start 1957-06-02 00:00:00 (Sun)
  61748874000, #      utc_end 1957-09-29 01:00:00 (Sun)
  61738596000, #  local_start 1957-06-02 02:00:00 (Sun)
  61748881200, #    local_end 1957-09-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  61748874000, #    utc_start 1957-09-29 01:00:00 (Sun)
  62459510400, #      utc_end 1980-04-06 00:00:00 (Sun)
  61748877600, #  local_start 1957-09-29 02:00:00 (Sun)
  62459514000, #    local_end 1980-04-06 01:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62459510400, #    utc_start 1980-04-06 00:00:00 (Sun)
  62474634000, #      utc_end 1980-09-28 01:00:00 (Sun)
  62459517600, #  local_start 1980-04-06 02:00:00 (Sun)
  62474641200, #    local_end 1980-09-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62474634000, #    utc_start 1980-09-28 01:00:00 (Sun)
  62490358800, #      utc_end 1981-03-29 01:00:00 (Sun)
  62474637600, #  local_start 1980-09-28 02:00:00 (Sun)
  62490362400, #    local_end 1981-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62490358800, #    utc_start 1981-03-29 01:00:00 (Sun)
  62506083600, #      utc_end 1981-09-27 01:00:00 (Sun)
  62490366000, #  local_start 1981-03-29 03:00:00 (Sun)
  62506090800, #    local_end 1981-09-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62506083600, #    utc_start 1981-09-27 01:00:00 (Sun)
  62521808400, #      utc_end 1982-03-28 01:00:00 (Sun)
  62506087200, #  local_start 1981-09-27 02:00:00 (Sun)
  62521812000, #    local_end 1982-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62521808400, #    utc_start 1982-03-28 01:00:00 (Sun)
  62537533200, #      utc_end 1982-09-26 01:00:00 (Sun)
  62521815600, #  local_start 1982-03-28 03:00:00 (Sun)
  62537540400, #    local_end 1982-09-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62537533200, #    utc_start 1982-09-26 01:00:00 (Sun)
  62553258000, #      utc_end 1983-03-27 01:00:00 (Sun)
  62537536800, #  local_start 1982-09-26 02:00:00 (Sun)
  62553261600, #    local_end 1983-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62553258000, #    utc_start 1983-03-27 01:00:00 (Sun)
  62568982800, #      utc_end 1983-09-25 01:00:00 (Sun)
  62553265200, #  local_start 1983-03-27 03:00:00 (Sun)
  62568990000, #    local_end 1983-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62568982800, #    utc_start 1983-09-25 01:00:00 (Sun)
  62584707600, #      utc_end 1984-03-25 01:00:00 (Sun)
  62568986400, #  local_start 1983-09-25 02:00:00 (Sun)
  62584711200, #    local_end 1984-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62584707600, #    utc_start 1984-03-25 01:00:00 (Sun)
  62601037200, #      utc_end 1984-09-30 01:00:00 (Sun)
  62584714800, #  local_start 1984-03-25 03:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62601037200, #    utc_start 1984-09-30 01:00:00 (Sun)
  62616762000, #      utc_end 1985-03-31 01:00:00 (Sun)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62616762000, #    utc_start 1985-03-31 01:00:00 (Sun)
  62632486800, #      utc_end 1985-09-29 01:00:00 (Sun)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62632486800, #    utc_start 1985-09-29 01:00:00 (Sun)
  62648211600, #      utc_end 1986-03-30 01:00:00 (Sun)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62648211600, #    utc_start 1986-03-30 01:00:00 (Sun)
  62663936400, #      utc_end 1986-09-28 01:00:00 (Sun)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62663936400, #    utc_start 1986-09-28 01:00:00 (Sun)
  62679661200, #      utc_end 1987-03-29 01:00:00 (Sun)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62679661200, #    utc_start 1987-03-29 01:00:00 (Sun)
  62695386000, #      utc_end 1987-09-27 01:00:00 (Sun)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62695386000, #    utc_start 1987-09-27 01:00:00 (Sun)
  62711110800, #      utc_end 1988-03-27 01:00:00 (Sun)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62711110800, #    utc_start 1988-03-27 01:00:00 (Sun)
  62726835600, #      utc_end 1988-09-25 01:00:00 (Sun)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62726835600, #    utc_start 1988-09-25 01:00:00 (Sun)
  62742560400, #      utc_end 1989-03-26 01:00:00 (Sun)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62742560400, #    utc_start 1989-03-26 01:00:00 (Sun)
  62758285200, #      utc_end 1989-09-24 01:00:00 (Sun)
  62742567600, #  local_start 1989-03-26 03:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62758285200, #    utc_start 1989-09-24 01:00:00 (Sun)
  62774010000, #      utc_end 1990-03-25 01:00:00 (Sun)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62774010000, #    utc_start 1990-03-25 01:00:00 (Sun)
  62790339600, #      utc_end 1990-09-30 01:00:00 (Sun)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62790339600, #    utc_start 1990-09-30 01:00:00 (Sun)
  62806064400, #      utc_end 1991-03-31 01:00:00 (Sun)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62806064400, #    utc_start 1991-03-31 01:00:00 (Sun)
  62821789200, #      utc_end 1991-09-29 01:00:00 (Sun)
  62806071600, #  local_start 1991-03-31 03:00:00 (Sun)
  62821796400, #    local_end 1991-09-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62821789200, #    utc_start 1991-09-29 01:00:00 (Sun)
  62837514000, #      utc_end 1992-03-29 01:00:00 (Sun)
  62821792800, #  local_start 1991-09-29 02:00:00 (Sun)
  62837517600, #    local_end 1992-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62837514000, #    utc_start 1992-03-29 01:00:00 (Sun)
  62853238800, #      utc_end 1992-09-27 01:00:00 (Sun)
  62837521200, #  local_start 1992-03-29 03:00:00 (Sun)
  62853246000, #    local_end 1992-09-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62853238800, #    utc_start 1992-09-27 01:00:00 (Sun)
  62868963600, #      utc_end 1993-03-28 01:00:00 (Sun)
  62853242400, #  local_start 1992-09-27 02:00:00 (Sun)
  62868967200, #    local_end 1993-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62868963600, #    utc_start 1993-03-28 01:00:00 (Sun)
  62884688400, #      utc_end 1993-09-26 01:00:00 (Sun)
  62868970800, #  local_start 1993-03-28 03:00:00 (Sun)
  62884695600, #    local_end 1993-09-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62884688400, #    utc_start 1993-09-26 01:00:00 (Sun)
  62900413200, #      utc_end 1994-03-27 01:00:00 (Sun)
  62884692000, #  local_start 1993-09-26 02:00:00 (Sun)
  62900416800, #    local_end 1994-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62900413200, #    utc_start 1994-03-27 01:00:00 (Sun)
  62916138000, #      utc_end 1994-09-25 01:00:00 (Sun)
  62900420400, #  local_start 1994-03-27 03:00:00 (Sun)
  62916145200, #    local_end 1994-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62916138000, #    utc_start 1994-09-25 01:00:00 (Sun)
  62931862800, #      utc_end 1995-03-26 01:00:00 (Sun)
  62916141600, #  local_start 1994-09-25 02:00:00 (Sun)
  62931866400, #    local_end 1995-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62931862800, #    utc_start 1995-03-26 01:00:00 (Sun)
  62947587600, #      utc_end 1995-09-24 01:00:00 (Sun)
  62931870000, #  local_start 1995-03-26 03:00:00 (Sun)
  62947594800, #    local_end 1995-09-24 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62947587600, #    utc_start 1995-09-24 01:00:00 (Sun)
  62963917200, #      utc_end 1996-03-31 01:00:00 (Sun)
  62947591200, #  local_start 1995-09-24 02:00:00 (Sun)
  62963920800, #    local_end 1996-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62963917200, #    utc_start 1996-03-31 01:00:00 (Sun)
  62982061200, #      utc_end 1996-10-27 01:00:00 (Sun)
  62963924400, #  local_start 1996-03-31 03:00:00 (Sun)
  62982068400, #    local_end 1996-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62982061200, #    utc_start 1996-10-27 01:00:00 (Sun)
  62995366800, #      utc_end 1997-03-30 01:00:00 (Sun)
  62982064800, #  local_start 1996-10-27 02:00:00 (Sun)
  62995370400, #    local_end 1997-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62995366800, #    utc_start 1997-03-30 01:00:00 (Sun)
  63013510800, #      utc_end 1997-10-26 01:00:00 (Sun)
  62995374000, #  local_start 1997-03-30 03:00:00 (Sun)
  63013518000, #    local_end 1997-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63013510800, #    utc_start 1997-10-26 01:00:00 (Sun)
  63026816400, #      utc_end 1998-03-29 01:00:00 (Sun)
  63013514400, #  local_start 1997-10-26 02:00:00 (Sun)
  63026820000, #    local_end 1998-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63026816400, #    utc_start 1998-03-29 01:00:00 (Sun)
  63044960400, #      utc_end 1998-10-25 01:00:00 (Sun)
  63026823600, #  local_start 1998-03-29 03:00:00 (Sun)
  63044967600, #    local_end 1998-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63044960400, #    utc_start 1998-10-25 01:00:00 (Sun)
  63058266000, #      utc_end 1999-03-28 01:00:00 (Sun)
  63044964000, #  local_start 1998-10-25 02:00:00 (Sun)
  63058269600, #    local_end 1999-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63058266000, #    utc_start 1999-03-28 01:00:00 (Sun)
  63077014800, #      utc_end 1999-10-31 01:00:00 (Sun)
  63058273200, #  local_start 1999-03-28 03:00:00 (Sun)
  63077022000, #    local_end 1999-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63077014800, #    utc_start 1999-10-31 01:00:00 (Sun)
  63089715600, #      utc_end 2000-03-26 01:00:00 (Sun)
  63077018400, #  local_start 1999-10-31 02:00:00 (Sun)
  63089719200, #    local_end 2000-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63089715600, #    utc_start 2000-03-26 01:00:00 (Sun)
  63108464400, #      utc_end 2000-10-29 01:00:00 (Sun)
  63089722800, #  local_start 2000-03-26 03:00:00 (Sun)
  63108471600, #    local_end 2000-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63108464400, #    utc_start 2000-10-29 01:00:00 (Sun)
  63121165200, #      utc_end 2001-03-25 01:00:00 (Sun)
  63108468000, #  local_start 2000-10-29 02:00:00 (Sun)
  63121168800, #    local_end 2001-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63121165200, #    utc_start 2001-03-25 01:00:00 (Sun)
  63139914000, #      utc_end 2001-10-28 01:00:00 (Sun)
  63121172400, #  local_start 2001-03-25 03:00:00 (Sun)
  63139921200, #    local_end 2001-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63139914000, #    utc_start 2001-10-28 01:00:00 (Sun)
  63153219600, #      utc_end 2002-03-31 01:00:00 (Sun)
  63139917600, #  local_start 2001-10-28 02:00:00 (Sun)
  63153223200, #    local_end 2002-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63153219600, #    utc_start 2002-03-31 01:00:00 (Sun)
  63171363600, #      utc_end 2002-10-27 01:00:00 (Sun)
  63153226800, #  local_start 2002-03-31 03:00:00 (Sun)
  63171370800, #    local_end 2002-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63171363600, #    utc_start 2002-10-27 01:00:00 (Sun)
  63184669200, #      utc_end 2003-03-30 01:00:00 (Sun)
  63171367200, #  local_start 2002-10-27 02:00:00 (Sun)
  63184672800, #    local_end 2003-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63184669200, #    utc_start 2003-03-30 01:00:00 (Sun)
  63202813200, #      utc_end 2003-10-26 01:00:00 (Sun)
  63184676400, #  local_start 2003-03-30 03:00:00 (Sun)
  63202820400, #    local_end 2003-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63202813200, #    utc_start 2003-10-26 01:00:00 (Sun)
  63216118800, #      utc_end 2004-03-28 01:00:00 (Sun)
  63202816800, #  local_start 2003-10-26 02:00:00 (Sun)
  63216122400, #    local_end 2004-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63216118800, #    utc_start 2004-03-28 01:00:00 (Sun)
  63234867600, #      utc_end 2004-10-31 01:00:00 (Sun)
  63216126000, #  local_start 2004-03-28 03:00:00 (Sun)
  63234874800, #    local_end 2004-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63234867600, #    utc_start 2004-10-31 01:00:00 (Sun)
  63247568400, #      utc_end 2005-03-27 01:00:00 (Sun)
  63234871200, #  local_start 2004-10-31 02:00:00 (Sun)
  63247572000, #    local_end 2005-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63247568400, #    utc_start 2005-03-27 01:00:00 (Sun)
  63266317200, #      utc_end 2005-10-30 01:00:00 (Sun)
  63247575600, #  local_start 2005-03-27 03:00:00 (Sun)
  63266324400, #    local_end 2005-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63266317200, #    utc_start 2005-10-30 01:00:00 (Sun)
  63279018000, #      utc_end 2006-03-26 01:00:00 (Sun)
  63266320800, #  local_start 2005-10-30 02:00:00 (Sun)
  63279021600, #    local_end 2006-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63279018000, #    utc_start 2006-03-26 01:00:00 (Sun)
  63297766800, #      utc_end 2006-10-29 01:00:00 (Sun)
  63279025200, #  local_start 2006-03-26 03:00:00 (Sun)
  63297774000, #    local_end 2006-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63297766800, #    utc_start 2006-10-29 01:00:00 (Sun)
  63310467600, #      utc_end 2007-03-25 01:00:00 (Sun)
  63297770400, #  local_start 2006-10-29 02:00:00 (Sun)
  63310471200, #    local_end 2007-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63310467600, #    utc_start 2007-03-25 01:00:00 (Sun)
  63329216400, #      utc_end 2007-10-28 01:00:00 (Sun)
  63310474800, #  local_start 2007-03-25 03:00:00 (Sun)
  63329223600, #    local_end 2007-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63329216400, #    utc_start 2007-10-28 01:00:00 (Sun)
  63342522000, #      utc_end 2008-03-30 01:00:00 (Sun)
  63329220000, #  local_start 2007-10-28 02:00:00 (Sun)
  63342525600, #    local_end 2008-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63342522000, #    utc_start 2008-03-30 01:00:00 (Sun)
  63360666000, #      utc_end 2008-10-26 01:00:00 (Sun)
  63342529200, #  local_start 2008-03-30 03:00:00 (Sun)
  63360673200, #    local_end 2008-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63360666000, #    utc_start 2008-10-26 01:00:00 (Sun)
  63373971600, #      utc_end 2009-03-29 01:00:00 (Sun)
  63360669600, #  local_start 2008-10-26 02:00:00 (Sun)
  63373975200, #    local_end 2009-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63373971600, #    utc_start 2009-03-29 01:00:00 (Sun)
  63392115600, #      utc_end 2009-10-25 01:00:00 (Sun)
  63373978800, #  local_start 2009-03-29 03:00:00 (Sun)
  63392122800, #    local_end 2009-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63392115600, #    utc_start 2009-10-25 01:00:00 (Sun)
  63405421200, #      utc_end 2010-03-28 01:00:00 (Sun)
  63392119200, #  local_start 2009-10-25 02:00:00 (Sun)
  63405424800, #    local_end 2010-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63405421200, #    utc_start 2010-03-28 01:00:00 (Sun)
  63424170000, #      utc_end 2010-10-31 01:00:00 (Sun)
  63405428400, #  local_start 2010-03-28 03:00:00 (Sun)
  63424177200, #    local_end 2010-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63424170000, #    utc_start 2010-10-31 01:00:00 (Sun)
  63436870800, #      utc_end 2011-03-27 01:00:00 (Sun)
  63424173600, #  local_start 2010-10-31 02:00:00 (Sun)
  63436874400, #    local_end 2011-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63436870800, #    utc_start 2011-03-27 01:00:00 (Sun)
  63455619600, #      utc_end 2011-10-30 01:00:00 (Sun)
  63436878000, #  local_start 2011-03-27 03:00:00 (Sun)
  63455626800, #    local_end 2011-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63455619600, #    utc_start 2011-10-30 01:00:00 (Sun)
  63468320400, #      utc_end 2012-03-25 01:00:00 (Sun)
  63455623200, #  local_start 2011-10-30 02:00:00 (Sun)
  63468324000, #    local_end 2012-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63468320400, #    utc_start 2012-03-25 01:00:00 (Sun)
  63487069200, #      utc_end 2012-10-28 01:00:00 (Sun)
  63468327600, #  local_start 2012-03-25 03:00:00 (Sun)
  63487076400, #    local_end 2012-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63487069200, #    utc_start 2012-10-28 01:00:00 (Sun)
  63500374800, #      utc_end 2013-03-31 01:00:00 (Sun)
  63487072800, #  local_start 2012-10-28 02:00:00 (Sun)
  63500378400, #    local_end 2013-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63500374800, #    utc_start 2013-03-31 01:00:00 (Sun)
  63518518800, #      utc_end 2013-10-27 01:00:00 (Sun)
  63500382000, #  local_start 2013-03-31 03:00:00 (Sun)
  63518526000, #    local_end 2013-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63518518800, #    utc_start 2013-10-27 01:00:00 (Sun)
  63531824400, #      utc_end 2014-03-30 01:00:00 (Sun)
  63518522400, #  local_start 2013-10-27 02:00:00 (Sun)
  63531828000, #    local_end 2014-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63531824400, #    utc_start 2014-03-30 01:00:00 (Sun)
  63549968400, #      utc_end 2014-10-26 01:00:00 (Sun)
  63531831600, #  local_start 2014-03-30 03:00:00 (Sun)
  63549975600, #    local_end 2014-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63549968400, #    utc_start 2014-10-26 01:00:00 (Sun)
  63563274000, #      utc_end 2015-03-29 01:00:00 (Sun)
  63549972000, #  local_start 2014-10-26 02:00:00 (Sun)
  63563277600, #    local_end 2015-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63563274000, #    utc_start 2015-03-29 01:00:00 (Sun)
  63581418000, #      utc_end 2015-10-25 01:00:00 (Sun)
  63563281200, #  local_start 2015-03-29 03:00:00 (Sun)
  63581425200, #    local_end 2015-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63581418000, #    utc_start 2015-10-25 01:00:00 (Sun)
  63594723600, #      utc_end 2016-03-27 01:00:00 (Sun)
  63581421600, #  local_start 2015-10-25 02:00:00 (Sun)
  63594727200, #    local_end 2016-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63594723600, #    utc_start 2016-03-27 01:00:00 (Sun)
  63613472400, #      utc_end 2016-10-30 01:00:00 (Sun)
  63594730800, #  local_start 2016-03-27 03:00:00 (Sun)
  63613479600, #    local_end 2016-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63613472400, #    utc_start 2016-10-30 01:00:00 (Sun)
  63626173200, #      utc_end 2017-03-26 01:00:00 (Sun)
  63613476000, #  local_start 2016-10-30 02:00:00 (Sun)
  63626176800, #    local_end 2017-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63626173200, #    utc_start 2017-03-26 01:00:00 (Sun)
  63644922000, #      utc_end 2017-10-29 01:00:00 (Sun)
  63626180400, #  local_start 2017-03-26 03:00:00 (Sun)
  63644929200, #    local_end 2017-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63644922000, #    utc_start 2017-10-29 01:00:00 (Sun)
  63657622800, #      utc_end 2018-03-25 01:00:00 (Sun)
  63644925600, #  local_start 2017-10-29 02:00:00 (Sun)
  63657626400, #    local_end 2018-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63657622800, #    utc_start 2018-03-25 01:00:00 (Sun)
  63676371600, #      utc_end 2018-10-28 01:00:00 (Sun)
  63657630000, #  local_start 2018-03-25 03:00:00 (Sun)
  63676378800, #    local_end 2018-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63676371600, #    utc_start 2018-10-28 01:00:00 (Sun)
  63689677200, #      utc_end 2019-03-31 01:00:00 (Sun)
  63676375200, #  local_start 2018-10-28 02:00:00 (Sun)
  63689680800, #    local_end 2019-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63689677200, #    utc_start 2019-03-31 01:00:00 (Sun)
  63707821200, #      utc_end 2019-10-27 01:00:00 (Sun)
  63689684400, #  local_start 2019-03-31 03:00:00 (Sun)
  63707828400, #    local_end 2019-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63707821200, #    utc_start 2019-10-27 01:00:00 (Sun)
  63721126800, #      utc_end 2020-03-29 01:00:00 (Sun)
  63707824800, #  local_start 2019-10-27 02:00:00 (Sun)
  63721130400, #    local_end 2020-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63721126800, #    utc_start 2020-03-29 01:00:00 (Sun)
  63739270800, #      utc_end 2020-10-25 01:00:00 (Sun)
  63721134000, #  local_start 2020-03-29 03:00:00 (Sun)
  63739278000, #    local_end 2020-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63739270800, #    utc_start 2020-10-25 01:00:00 (Sun)
  63752576400, #      utc_end 2021-03-28 01:00:00 (Sun)
  63739274400, #  local_start 2020-10-25 02:00:00 (Sun)
  63752580000, #    local_end 2021-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63752576400, #    utc_start 2021-03-28 01:00:00 (Sun)
  63771325200, #      utc_end 2021-10-31 01:00:00 (Sun)
  63752583600, #  local_start 2021-03-28 03:00:00 (Sun)
  63771332400, #    local_end 2021-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63771325200, #    utc_start 2021-10-31 01:00:00 (Sun)
  63784026000, #      utc_end 2022-03-27 01:00:00 (Sun)
  63771328800, #  local_start 2021-10-31 02:00:00 (Sun)
  63784029600, #    local_end 2022-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63784026000, #    utc_start 2022-03-27 01:00:00 (Sun)
  63802774800, #      utc_end 2022-10-30 01:00:00 (Sun)
  63784033200, #  local_start 2022-03-27 03:00:00 (Sun)
  63802782000, #    local_end 2022-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63802774800, #    utc_start 2022-10-30 01:00:00 (Sun)
  63815475600, #      utc_end 2023-03-26 01:00:00 (Sun)
  63802778400, #  local_start 2022-10-30 02:00:00 (Sun)
  63815479200, #    local_end 2023-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63815475600, #    utc_start 2023-03-26 01:00:00 (Sun)
  63834224400, #      utc_end 2023-10-29 01:00:00 (Sun)
  63815482800, #  local_start 2023-03-26 03:00:00 (Sun)
  63834231600, #    local_end 2023-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63834224400, #    utc_start 2023-10-29 01:00:00 (Sun)
  63847530000, #      utc_end 2024-03-31 01:00:00 (Sun)
  63834228000, #  local_start 2023-10-29 02:00:00 (Sun)
  63847533600, #    local_end 2024-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63847530000, #    utc_start 2024-03-31 01:00:00 (Sun)
  63865674000, #      utc_end 2024-10-27 01:00:00 (Sun)
  63847537200, #  local_start 2024-03-31 03:00:00 (Sun)
  63865681200, #    local_end 2024-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63865674000, #    utc_start 2024-10-27 01:00:00 (Sun)
  63878979600, #      utc_end 2025-03-30 01:00:00 (Sun)
  63865677600, #  local_start 2024-10-27 02:00:00 (Sun)
  63878983200, #    local_end 2025-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63878979600, #    utc_start 2025-03-30 01:00:00 (Sun)
  63897123600, #      utc_end 2025-10-26 01:00:00 (Sun)
  63878986800, #  local_start 2025-03-30 03:00:00 (Sun)
  63897130800, #    local_end 2025-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63897123600, #    utc_start 2025-10-26 01:00:00 (Sun)
  63910429200, #      utc_end 2026-03-29 01:00:00 (Sun)
  63897127200, #  local_start 2025-10-26 02:00:00 (Sun)
  63910432800, #    local_end 2026-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63910429200, #    utc_start 2026-03-29 01:00:00 (Sun)
  63928573200, #      utc_end 2026-10-25 01:00:00 (Sun)
  63910436400, #  local_start 2026-03-29 03:00:00 (Sun)
  63928580400, #    local_end 2026-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63928573200, #    utc_start 2026-10-25 01:00:00 (Sun)
  63941878800, #      utc_end 2027-03-28 01:00:00 (Sun)
  63928576800, #  local_start 2026-10-25 02:00:00 (Sun)
  63941882400, #    local_end 2027-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63941878800, #    utc_start 2027-03-28 01:00:00 (Sun)
  63960627600, #      utc_end 2027-10-31 01:00:00 (Sun)
  63941886000, #  local_start 2027-03-28 03:00:00 (Sun)
  63960634800, #    local_end 2027-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63960627600, #    utc_start 2027-10-31 01:00:00 (Sun)
  63973328400, #      utc_end 2028-03-26 01:00:00 (Sun)
  63960631200, #  local_start 2027-10-31 02:00:00 (Sun)
  63973332000, #    local_end 2028-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63973328400, #    utc_start 2028-03-26 01:00:00 (Sun)
  63992077200, #      utc_end 2028-10-29 01:00:00 (Sun)
  63973335600, #  local_start 2028-03-26 03:00:00 (Sun)
  63992084400, #    local_end 2028-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63992077200, #    utc_start 2028-10-29 01:00:00 (Sun)
  64004778000, #      utc_end 2029-03-25 01:00:00 (Sun)
  63992080800, #  local_start 2028-10-29 02:00:00 (Sun)
  64004781600, #    local_end 2029-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  64004778000, #    utc_start 2029-03-25 01:00:00 (Sun)
  64023526800, #      utc_end 2029-10-28 01:00:00 (Sun)
  64004785200, #  local_start 2029-03-25 03:00:00 (Sun)
  64023534000, #    local_end 2029-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  64023526800, #    utc_start 2029-10-28 01:00:00 (Sun)
  64036832400, #      utc_end 2030-03-31 01:00:00 (Sun)
  64023530400, #  local_start 2029-10-28 02:00:00 (Sun)
  64036836000, #    local_end 2030-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  64036832400, #    utc_start 2030-03-31 01:00:00 (Sun)
  64054976400, #      utc_end 2030-10-27 01:00:00 (Sun)
  64036839600, #  local_start 2030-03-31 03:00:00 (Sun)
  64054983600, #    local_end 2030-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {68}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { 3600 }
  
  my $last_observance = bless( {
    'format' => 'CE%sT',
    'gmtoff' => '1:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 723086,
      'local_rd_secs' => 7200,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 723086,
      'utc_rd_secs' => 7200,
      'utc_year' => 1981
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => 3600,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 723086,
      'local_rd_secs' => 3600,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 723086,
      'utc_rd_secs' => 3600,
      'utc_year' => 1981
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '1:00u',
      'from' => '1996',
      'in' => 'Oct',
      'letter' => '',
      'name' => 'EU',
      'offset_from_std' => 0,
      'on' => 'lastSun',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '1:00u',
      'from' => '1981',
      'in' => 'Mar',
      'letter' => 'S',
      'name' => 'EU',
      'offset_from_std' => 3600,
      'on' => 'lastSun',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_EUROPE_BUDAPEST

    $main::fatpacked{"DateTime/TimeZone/Europe/Chisinau.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_EUROPE_CHISINAU';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Europe::Chisinau;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Europe::Chisinau::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59295535480, #      utc_end 1879-12-31 22:04:40 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59295542400, #    local_end 1880-01-01 00:00:00 (Thu)
  6920,
  0,
  'LMT',
      ],
      [
  59295535480, #    utc_start 1879-12-31 22:04:40 (Wed)
  60498569100, #      utc_end 1918-02-14 22:05:00 (Thu)
  59295542380, #  local_start 1879-12-31 23:59:40 (Wed)
  60498576000, #    local_end 1918-02-15 00:00:00 (Fri)
  6900,
  0,
  'CMT',
      ],
      [
  60498569100, #    utc_start 1918-02-14 22:05:00 (Thu)
  60922534536, #      utc_end 1931-07-23 22:15:36 (Thu)
  60498575364, #  local_start 1918-02-14 23:49:24 (Thu)
  60922540800, #    local_end 1931-07-24 00:00:00 (Fri)
  6264,
  0,
  'BMT',
      ],
      [
  60922534536, #    utc_start 1931-07-23 22:15:36 (Thu)
  60948626400, #      utc_end 1932-05-20 22:00:00 (Fri)
  60922541736, #  local_start 1931-07-24 00:15:36 (Fri)
  60948633600, #    local_end 1932-05-21 00:00:00 (Sat)
  7200,
  0,
  'EET',
      ],
      [
  60948626400, #    utc_start 1932-05-20 22:00:00 (Fri)
  60960204000, #      utc_end 1932-10-01 22:00:00 (Sat)
  60948637200, #  local_start 1932-05-21 01:00:00 (Sat)
  60960214800, #    local_end 1932-10-02 01:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  60960204000, #    utc_start 1932-10-01 22:00:00 (Sat)
  60975928800, #      utc_end 1933-04-01 22:00:00 (Sat)
  60960211200, #  local_start 1932-10-02 00:00:00 (Sun)
  60975936000, #    local_end 1933-04-02 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  60975928800, #    utc_start 1933-04-01 22:00:00 (Sat)
  60991653600, #      utc_end 1933-09-30 22:00:00 (Sat)
  60975939600, #  local_start 1933-04-02 01:00:00 (Sun)
  60991664400, #    local_end 1933-10-01 01:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  60991653600, #    utc_start 1933-09-30 22:00:00 (Sat)
  61007983200, #      utc_end 1934-04-07 22:00:00 (Sat)
  60991660800, #  local_start 1933-10-01 00:00:00 (Sun)
  61007990400, #    local_end 1934-04-08 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  61007983200, #    utc_start 1934-04-07 22:00:00 (Sat)
  61023708000, #      utc_end 1934-10-06 22:00:00 (Sat)
  61007994000, #  local_start 1934-04-08 01:00:00 (Sun)
  61023718800, #    local_end 1934-10-07 01:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  61023708000, #    utc_start 1934-10-06 22:00:00 (Sat)
  61039432800, #      utc_end 1935-04-06 22:00:00 (Sat)
  61023715200, #  local_start 1934-10-07 00:00:00 (Sun)
  61039440000, #    local_end 1935-04-07 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  61039432800, #    utc_start 1935-04-06 22:00:00 (Sat)
  61055157600, #      utc_end 1935-10-05 22:00:00 (Sat)
  61039443600, #  local_start 1935-04-07 01:00:00 (Sun)
  61055168400, #    local_end 1935-10-06 01:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  61055157600, #    utc_start 1935-10-05 22:00:00 (Sat)
  61070882400, #      utc_end 1936-04-04 22:00:00 (Sat)
  61055164800, #  local_start 1935-10-06 00:00:00 (Sun)
  61070889600, #    local_end 1936-04-05 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  61070882400, #    utc_start 1936-04-04 22:00:00 (Sat)
  61086607200, #      utc_end 1936-10-03 22:00:00 (Sat)
  61070893200, #  local_start 1936-04-05 01:00:00 (Sun)
  61086618000, #    local_end 1936-10-04 01:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  61086607200, #    utc_start 1936-10-03 22:00:00 (Sat)
  61102332000, #      utc_end 1937-04-03 22:00:00 (Sat)
  61086614400, #  local_start 1936-10-04 00:00:00 (Sun)
  61102339200, #    local_end 1937-04-04 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  61102332000, #    utc_start 1937-04-03 22:00:00 (Sat)
  61118056800, #      utc_end 1937-10-02 22:00:00 (Sat)
  61102342800, #  local_start 1937-04-04 01:00:00 (Sun)
  61118067600, #    local_end 1937-10-03 01:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  61118056800, #    utc_start 1937-10-02 22:00:00 (Sat)
  61133781600, #      utc_end 1938-04-02 22:00:00 (Sat)
  61118064000, #  local_start 1937-10-03 00:00:00 (Sun)
  61133788800, #    local_end 1938-04-03 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  61133781600, #    utc_start 1938-04-02 22:00:00 (Sat)
  61149506400, #      utc_end 1938-10-01 22:00:00 (Sat)
  61133792400, #  local_start 1938-04-03 01:00:00 (Sun)
  61149517200, #    local_end 1938-10-02 01:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  61149506400, #    utc_start 1938-10-01 22:00:00 (Sat)
  61165231200, #      utc_end 1939-04-01 22:00:00 (Sat)
  61149513600, #  local_start 1938-10-02 00:00:00 (Sun)
  61165238400, #    local_end 1939-04-02 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  61165231200, #    utc_start 1939-04-01 22:00:00 (Sat)
  61180956000, #      utc_end 1939-09-30 22:00:00 (Sat)
  61165242000, #  local_start 1939-04-02 01:00:00 (Sun)
  61180966800, #    local_end 1939-10-01 01:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  61180956000, #    utc_start 1939-09-30 22:00:00 (Sat)
  61208517600, #      utc_end 1940-08-14 22:00:00 (Wed)
  61180963200, #  local_start 1939-10-01 00:00:00 (Sun)
  61208524800, #    local_end 1940-08-15 00:00:00 (Thu)
  7200,
  0,
  'EET',
      ],
      [
  61208517600, #    utc_start 1940-08-14 22:00:00 (Wed)
  61237544400, #      utc_end 1941-07-16 21:00:00 (Wed)
  61208528400, #  local_start 1940-08-15 01:00:00 (Thu)
  61237555200, #    local_end 1941-07-17 00:00:00 (Thu)
  10800,
  1,
  'EEST',
      ],
      [
  61237544400, #    utc_start 1941-07-16 21:00:00 (Wed)
  61278426000, #      utc_end 1942-11-02 01:00:00 (Mon)
  61237551600, #  local_start 1941-07-16 23:00:00 (Wed)
  61278433200, #    local_end 1942-11-02 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61278426000, #    utc_start 1942-11-02 01:00:00 (Mon)
  61291126800, #      utc_end 1943-03-29 01:00:00 (Mon)
  61278429600, #  local_start 1942-11-02 02:00:00 (Mon)
  61291130400, #    local_end 1943-03-29 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61291126800, #    utc_start 1943-03-29 01:00:00 (Mon)
  61307456400, #      utc_end 1943-10-04 01:00:00 (Mon)
  61291134000, #  local_start 1943-03-29 03:00:00 (Mon)
  61307463600, #    local_end 1943-10-04 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61307456400, #    utc_start 1943-10-04 01:00:00 (Mon)
  61323181200, #      utc_end 1944-04-03 01:00:00 (Mon)
  61307460000, #  local_start 1943-10-04 02:00:00 (Mon)
  61323184800, #    local_end 1944-04-03 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61323181200, #    utc_start 1944-04-03 01:00:00 (Mon)
  61335525600, #      utc_end 1944-08-23 22:00:00 (Wed)
  61323188400, #  local_start 1944-04-03 03:00:00 (Mon)
  61335532800, #    local_end 1944-08-24 00:00:00 (Thu)
  7200,
  1,
  'CEST',
      ],
      [
  61335525600, #    utc_start 1944-08-23 22:00:00 (Wed)
  62490603600, #      utc_end 1981-03-31 21:00:00 (Tue)
  61335536400, #  local_start 1944-08-24 01:00:00 (Thu)
  62490614400, #    local_end 1981-04-01 00:00:00 (Wed)
  10800,
  0,
  'MSK',
      ],
      [
  62490603600, #    utc_start 1981-03-31 21:00:00 (Tue)
  62506411200, #      utc_end 1981-09-30 20:00:00 (Wed)
  62490618000, #  local_start 1981-04-01 01:00:00 (Wed)
  62506425600, #    local_end 1981-10-01 00:00:00 (Thu)
  14400,
  1,
  'MSD',
      ],
      [
  62506411200, #    utc_start 1981-09-30 20:00:00 (Wed)
  62522139600, #      utc_end 1982-03-31 21:00:00 (Wed)
  62506422000, #  local_start 1981-09-30 23:00:00 (Wed)
  62522150400, #    local_end 1982-04-01 00:00:00 (Thu)
  10800,
  0,
  'MSK',
      ],
      [
  62522139600, #    utc_start 1982-03-31 21:00:00 (Wed)
  62537947200, #      utc_end 1982-09-30 20:00:00 (Thu)
  62522154000, #  local_start 1982-04-01 01:00:00 (Thu)
  62537961600, #    local_end 1982-10-01 00:00:00 (Fri)
  14400,
  1,
  'MSD',
      ],
      [
  62537947200, #    utc_start 1982-09-30 20:00:00 (Thu)
  62553675600, #      utc_end 1983-03-31 21:00:00 (Thu)
  62537958000, #  local_start 1982-09-30 23:00:00 (Thu)
  62553686400, #    local_end 1983-04-01 00:00:00 (Fri)
  10800,
  0,
  'MSK',
      ],
      [
  62553675600, #    utc_start 1983-03-31 21:00:00 (Thu)
  62569483200, #      utc_end 1983-09-30 20:00:00 (Fri)
  62553690000, #  local_start 1983-04-01 01:00:00 (Fri)
  62569497600, #    local_end 1983-10-01 00:00:00 (Sat)
  14400,
  1,
  'MSD',
      ],
      [
  62569483200, #    utc_start 1983-09-30 20:00:00 (Fri)
  62585298000, #      utc_end 1984-03-31 21:00:00 (Sat)
  62569494000, #  local_start 1983-09-30 23:00:00 (Fri)
  62585308800, #    local_end 1984-04-01 00:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62585298000, #    utc_start 1984-03-31 21:00:00 (Sat)
  62601030000, #      utc_end 1984-09-29 23:00:00 (Sat)
  62585312400, #  local_start 1984-04-01 01:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62601030000, #    utc_start 1984-09-29 23:00:00 (Sat)
  62616754800, #      utc_end 1985-03-30 23:00:00 (Sat)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62616754800, #    utc_start 1985-03-30 23:00:00 (Sat)
  62632479600, #      utc_end 1985-09-28 23:00:00 (Sat)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62632479600, #    utc_start 1985-09-28 23:00:00 (Sat)
  62648204400, #      utc_end 1986-03-29 23:00:00 (Sat)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62648204400, #    utc_start 1986-03-29 23:00:00 (Sat)
  62663929200, #      utc_end 1986-09-27 23:00:00 (Sat)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62663929200, #    utc_start 1986-09-27 23:00:00 (Sat)
  62679654000, #      utc_end 1987-03-28 23:00:00 (Sat)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62679654000, #    utc_start 1987-03-28 23:00:00 (Sat)
  62695378800, #      utc_end 1987-09-26 23:00:00 (Sat)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62695378800, #    utc_start 1987-09-26 23:00:00 (Sat)
  62711103600, #      utc_end 1988-03-26 23:00:00 (Sat)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62711103600, #    utc_start 1988-03-26 23:00:00 (Sat)
  62726828400, #      utc_end 1988-09-24 23:00:00 (Sat)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62726828400, #    utc_start 1988-09-24 23:00:00 (Sat)
  62742553200, #      utc_end 1989-03-25 23:00:00 (Sat)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62742553200, #    utc_start 1989-03-25 23:00:00 (Sat)
  62758278000, #      utc_end 1989-09-23 23:00:00 (Sat)
  62742567600, #  local_start 1989-03-26 03:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62758278000, #    utc_start 1989-09-23 23:00:00 (Sat)
  62774002800, #      utc_end 1990-03-24 23:00:00 (Sat)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62774002800, #    utc_start 1990-03-24 23:00:00 (Sat)
  62777628000, #      utc_end 1990-05-05 22:00:00 (Sat)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62777642400, #    local_end 1990-05-06 02:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62777628000, #    utc_start 1990-05-05 22:00:00 (Sat)
  62790336000, #      utc_end 1990-09-30 00:00:00 (Sun)
  62777638800, #  local_start 1990-05-06 01:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62790336000, #    utc_start 1990-09-30 00:00:00 (Sun)
  62806060800, #      utc_end 1991-03-31 00:00:00 (Sun)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62806060800, #    utc_start 1991-03-31 00:00:00 (Sun)
  62821785600, #      utc_end 1991-09-29 00:00:00 (Sun)
  62806071600, #  local_start 1991-03-31 03:00:00 (Sun)
  62821796400, #    local_end 1991-09-29 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62821785600, #    utc_start 1991-09-29 00:00:00 (Sun)
  62829900000, #      utc_end 1991-12-31 22:00:00 (Tue)
  62821792800, #  local_start 1991-09-29 02:00:00 (Sun)
  62829907200, #    local_end 1992-01-01 00:00:00 (Wed)
  7200,
  0,
  'EET',
      ],
      [
  62829900000, #    utc_start 1991-12-31 22:00:00 (Tue)
  62837503200, #      utc_end 1992-03-28 22:00:00 (Sat)
  62829907200, #  local_start 1992-01-01 00:00:00 (Wed)
  62837510400, #    local_end 1992-03-29 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62837503200, #    utc_start 1992-03-28 22:00:00 (Sat)
  62853224400, #      utc_end 1992-09-26 21:00:00 (Sat)
  62837514000, #  local_start 1992-03-29 01:00:00 (Sun)
  62853235200, #    local_end 1992-09-27 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62853224400, #    utc_start 1992-09-26 21:00:00 (Sat)
  62868952800, #      utc_end 1993-03-27 22:00:00 (Sat)
  62853231600, #  local_start 1992-09-26 23:00:00 (Sat)
  62868960000, #    local_end 1993-03-28 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62868952800, #    utc_start 1993-03-27 22:00:00 (Sat)
  62884674000, #      utc_end 1993-09-25 21:00:00 (Sat)
  62868963600, #  local_start 1993-03-28 01:00:00 (Sun)
  62884684800, #    local_end 1993-09-26 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62884674000, #    utc_start 1993-09-25 21:00:00 (Sat)
  62900402400, #      utc_end 1994-03-26 22:00:00 (Sat)
  62884681200, #  local_start 1993-09-25 23:00:00 (Sat)
  62900409600, #    local_end 1994-03-27 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62900402400, #    utc_start 1994-03-26 22:00:00 (Sat)
  62916123600, #      utc_end 1994-09-24 21:00:00 (Sat)
  62900413200, #  local_start 1994-03-27 01:00:00 (Sun)
  62916134400, #    local_end 1994-09-25 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62916123600, #    utc_start 1994-09-24 21:00:00 (Sat)
  62931852000, #      utc_end 1995-03-25 22:00:00 (Sat)
  62916130800, #  local_start 1994-09-24 23:00:00 (Sat)
  62931859200, #    local_end 1995-03-26 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62931852000, #    utc_start 1995-03-25 22:00:00 (Sat)
  62947573200, #      utc_end 1995-09-23 21:00:00 (Sat)
  62931862800, #  local_start 1995-03-26 01:00:00 (Sun)
  62947584000, #    local_end 1995-09-24 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62947573200, #    utc_start 1995-09-23 21:00:00 (Sat)
  62963906400, #      utc_end 1996-03-30 22:00:00 (Sat)
  62947580400, #  local_start 1995-09-23 23:00:00 (Sat)
  62963913600, #    local_end 1996-03-31 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62963906400, #    utc_start 1996-03-30 22:00:00 (Sat)
  62982046800, #      utc_end 1996-10-26 21:00:00 (Sat)
  62963917200, #  local_start 1996-03-31 01:00:00 (Sun)
  62982057600, #    local_end 1996-10-27 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62982046800, #    utc_start 1996-10-26 21:00:00 (Sat)
  62987752800, #      utc_end 1996-12-31 22:00:00 (Tue)
  62982054000, #  local_start 1996-10-26 23:00:00 (Sat)
  62987760000, #    local_end 1997-01-01 00:00:00 (Wed)
  7200,
  0,
  'EET',
      ],
      [
  62987752800, #    utc_start 1996-12-31 22:00:00 (Tue)
  62995363200, #      utc_end 1997-03-30 00:00:00 (Sun)
  62987760000, #  local_start 1997-01-01 00:00:00 (Wed)
  62995370400, #    local_end 1997-03-30 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62995363200, #    utc_start 1997-03-30 00:00:00 (Sun)
  63013507200, #      utc_end 1997-10-26 00:00:00 (Sun)
  62995374000, #  local_start 1997-03-30 03:00:00 (Sun)
  63013518000, #    local_end 1997-10-26 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63013507200, #    utc_start 1997-10-26 00:00:00 (Sun)
  63026812800, #      utc_end 1998-03-29 00:00:00 (Sun)
  63013514400, #  local_start 1997-10-26 02:00:00 (Sun)
  63026820000, #    local_end 1998-03-29 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63026812800, #    utc_start 1998-03-29 00:00:00 (Sun)
  63044956800, #      utc_end 1998-10-25 00:00:00 (Sun)
  63026823600, #  local_start 1998-03-29 03:00:00 (Sun)
  63044967600, #    local_end 1998-10-25 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63044956800, #    utc_start 1998-10-25 00:00:00 (Sun)
  63058262400, #      utc_end 1999-03-28 00:00:00 (Sun)
  63044964000, #  local_start 1998-10-25 02:00:00 (Sun)
  63058269600, #    local_end 1999-03-28 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63058262400, #    utc_start 1999-03-28 00:00:00 (Sun)
  63077011200, #      utc_end 1999-10-31 00:00:00 (Sun)
  63058273200, #  local_start 1999-03-28 03:00:00 (Sun)
  63077022000, #    local_end 1999-10-31 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63077011200, #    utc_start 1999-10-31 00:00:00 (Sun)
  63089712000, #      utc_end 2000-03-26 00:00:00 (Sun)
  63077018400, #  local_start 1999-10-31 02:00:00 (Sun)
  63089719200, #    local_end 2000-03-26 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63089712000, #    utc_start 2000-03-26 00:00:00 (Sun)
  63108460800, #      utc_end 2000-10-29 00:00:00 (Sun)
  63089722800, #  local_start 2000-03-26 03:00:00 (Sun)
  63108471600, #    local_end 2000-10-29 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63108460800, #    utc_start 2000-10-29 00:00:00 (Sun)
  63121161600, #      utc_end 2001-03-25 00:00:00 (Sun)
  63108468000, #  local_start 2000-10-29 02:00:00 (Sun)
  63121168800, #    local_end 2001-03-25 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63121161600, #    utc_start 2001-03-25 00:00:00 (Sun)
  63139910400, #      utc_end 2001-10-28 00:00:00 (Sun)
  63121172400, #  local_start 2001-03-25 03:00:00 (Sun)
  63139921200, #    local_end 2001-10-28 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63139910400, #    utc_start 2001-10-28 00:00:00 (Sun)
  63153216000, #      utc_end 2002-03-31 00:00:00 (Sun)
  63139917600, #  local_start 2001-10-28 02:00:00 (Sun)
  63153223200, #    local_end 2002-03-31 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63153216000, #    utc_start 2002-03-31 00:00:00 (Sun)
  63171360000, #      utc_end 2002-10-27 00:00:00 (Sun)
  63153226800, #  local_start 2002-03-31 03:00:00 (Sun)
  63171370800, #    local_end 2002-10-27 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63171360000, #    utc_start 2002-10-27 00:00:00 (Sun)
  63184665600, #      utc_end 2003-03-30 00:00:00 (Sun)
  63171367200, #  local_start 2002-10-27 02:00:00 (Sun)
  63184672800, #    local_end 2003-03-30 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63184665600, #    utc_start 2003-03-30 00:00:00 (Sun)
  63202809600, #      utc_end 2003-10-26 00:00:00 (Sun)
  63184676400, #  local_start 2003-03-30 03:00:00 (Sun)
  63202820400, #    local_end 2003-10-26 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63202809600, #    utc_start 2003-10-26 00:00:00 (Sun)
  63216115200, #      utc_end 2004-03-28 00:00:00 (Sun)
  63202816800, #  local_start 2003-10-26 02:00:00 (Sun)
  63216122400, #    local_end 2004-03-28 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63216115200, #    utc_start 2004-03-28 00:00:00 (Sun)
  63234864000, #      utc_end 2004-10-31 00:00:00 (Sun)
  63216126000, #  local_start 2004-03-28 03:00:00 (Sun)
  63234874800, #    local_end 2004-10-31 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63234864000, #    utc_start 2004-10-31 00:00:00 (Sun)
  63247564800, #      utc_end 2005-03-27 00:00:00 (Sun)
  63234871200, #  local_start 2004-10-31 02:00:00 (Sun)
  63247572000, #    local_end 2005-03-27 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63247564800, #    utc_start 2005-03-27 00:00:00 (Sun)
  63266313600, #      utc_end 2005-10-30 00:00:00 (Sun)
  63247575600, #  local_start 2005-03-27 03:00:00 (Sun)
  63266324400, #    local_end 2005-10-30 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63266313600, #    utc_start 2005-10-30 00:00:00 (Sun)
  63279014400, #      utc_end 2006-03-26 00:00:00 (Sun)
  63266320800, #  local_start 2005-10-30 02:00:00 (Sun)
  63279021600, #    local_end 2006-03-26 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63279014400, #    utc_start 2006-03-26 00:00:00 (Sun)
  63297763200, #      utc_end 2006-10-29 00:00:00 (Sun)
  63279025200, #  local_start 2006-03-26 03:00:00 (Sun)
  63297774000, #    local_end 2006-10-29 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63297763200, #    utc_start 2006-10-29 00:00:00 (Sun)
  63310464000, #      utc_end 2007-03-25 00:00:00 (Sun)
  63297770400, #  local_start 2006-10-29 02:00:00 (Sun)
  63310471200, #    local_end 2007-03-25 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63310464000, #    utc_start 2007-03-25 00:00:00 (Sun)
  63329212800, #      utc_end 2007-10-28 00:00:00 (Sun)
  63310474800, #  local_start 2007-03-25 03:00:00 (Sun)
  63329223600, #    local_end 2007-10-28 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63329212800, #    utc_start 2007-10-28 00:00:00 (Sun)
  63342518400, #      utc_end 2008-03-30 00:00:00 (Sun)
  63329220000, #  local_start 2007-10-28 02:00:00 (Sun)
  63342525600, #    local_end 2008-03-30 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63342518400, #    utc_start 2008-03-30 00:00:00 (Sun)
  63360662400, #      utc_end 2008-10-26 00:00:00 (Sun)
  63342529200, #  local_start 2008-03-30 03:00:00 (Sun)
  63360673200, #    local_end 2008-10-26 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63360662400, #    utc_start 2008-10-26 00:00:00 (Sun)
  63373968000, #      utc_end 2009-03-29 00:00:00 (Sun)
  63360669600, #  local_start 2008-10-26 02:00:00 (Sun)
  63373975200, #    local_end 2009-03-29 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63373968000, #    utc_start 2009-03-29 00:00:00 (Sun)
  63392112000, #      utc_end 2009-10-25 00:00:00 (Sun)
  63373978800, #  local_start 2009-03-29 03:00:00 (Sun)
  63392122800, #    local_end 2009-10-25 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63392112000, #    utc_start 2009-10-25 00:00:00 (Sun)
  63405417600, #      utc_end 2010-03-28 00:00:00 (Sun)
  63392119200, #  local_start 2009-10-25 02:00:00 (Sun)
  63405424800, #    local_end 2010-03-28 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63405417600, #    utc_start 2010-03-28 00:00:00 (Sun)
  63424166400, #      utc_end 2010-10-31 00:00:00 (Sun)
  63405428400, #  local_start 2010-03-28 03:00:00 (Sun)
  63424177200, #    local_end 2010-10-31 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63424166400, #    utc_start 2010-10-31 00:00:00 (Sun)
  63436867200, #      utc_end 2011-03-27 00:00:00 (Sun)
  63424173600, #  local_start 2010-10-31 02:00:00 (Sun)
  63436874400, #    local_end 2011-03-27 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63436867200, #    utc_start 2011-03-27 00:00:00 (Sun)
  63455616000, #      utc_end 2011-10-30 00:00:00 (Sun)
  63436878000, #  local_start 2011-03-27 03:00:00 (Sun)
  63455626800, #    local_end 2011-10-30 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63455616000, #    utc_start 2011-10-30 00:00:00 (Sun)
  63468316800, #      utc_end 2012-03-25 00:00:00 (Sun)
  63455623200, #  local_start 2011-10-30 02:00:00 (Sun)
  63468324000, #    local_end 2012-03-25 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63468316800, #    utc_start 2012-03-25 00:00:00 (Sun)
  63487065600, #      utc_end 2012-10-28 00:00:00 (Sun)
  63468327600, #  local_start 2012-03-25 03:00:00 (Sun)
  63487076400, #    local_end 2012-10-28 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63487065600, #    utc_start 2012-10-28 00:00:00 (Sun)
  63500371200, #      utc_end 2013-03-31 00:00:00 (Sun)
  63487072800, #  local_start 2012-10-28 02:00:00 (Sun)
  63500378400, #    local_end 2013-03-31 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63500371200, #    utc_start 2013-03-31 00:00:00 (Sun)
  63518515200, #      utc_end 2013-10-27 00:00:00 (Sun)
  63500382000, #  local_start 2013-03-31 03:00:00 (Sun)
  63518526000, #    local_end 2013-10-27 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63518515200, #    utc_start 2013-10-27 00:00:00 (Sun)
  63531820800, #      utc_end 2014-03-30 00:00:00 (Sun)
  63518522400, #  local_start 2013-10-27 02:00:00 (Sun)
  63531828000, #    local_end 2014-03-30 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63531820800, #    utc_start 2014-03-30 00:00:00 (Sun)
  63549964800, #      utc_end 2014-10-26 00:00:00 (Sun)
  63531831600, #  local_start 2014-03-30 03:00:00 (Sun)
  63549975600, #    local_end 2014-10-26 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63549964800, #    utc_start 2014-10-26 00:00:00 (Sun)
  63563270400, #      utc_end 2015-03-29 00:00:00 (Sun)
  63549972000, #  local_start 2014-10-26 02:00:00 (Sun)
  63563277600, #    local_end 2015-03-29 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63563270400, #    utc_start 2015-03-29 00:00:00 (Sun)
  63581414400, #      utc_end 2015-10-25 00:00:00 (Sun)
  63563281200, #  local_start 2015-03-29 03:00:00 (Sun)
  63581425200, #    local_end 2015-10-25 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63581414400, #    utc_start 2015-10-25 00:00:00 (Sun)
  63594720000, #      utc_end 2016-03-27 00:00:00 (Sun)
  63581421600, #  local_start 2015-10-25 02:00:00 (Sun)
  63594727200, #    local_end 2016-03-27 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63594720000, #    utc_start 2016-03-27 00:00:00 (Sun)
  63613468800, #      utc_end 2016-10-30 00:00:00 (Sun)
  63594730800, #  local_start 2016-03-27 03:00:00 (Sun)
  63613479600, #    local_end 2016-10-30 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63613468800, #    utc_start 2016-10-30 00:00:00 (Sun)
  63626169600, #      utc_end 2017-03-26 00:00:00 (Sun)
  63613476000, #  local_start 2016-10-30 02:00:00 (Sun)
  63626176800, #    local_end 2017-03-26 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63626169600, #    utc_start 2017-03-26 00:00:00 (Sun)
  63644918400, #      utc_end 2017-10-29 00:00:00 (Sun)
  63626180400, #  local_start 2017-03-26 03:00:00 (Sun)
  63644929200, #    local_end 2017-10-29 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63644918400, #    utc_start 2017-10-29 00:00:00 (Sun)
  63657619200, #      utc_end 2018-03-25 00:00:00 (Sun)
  63644925600, #  local_start 2017-10-29 02:00:00 (Sun)
  63657626400, #    local_end 2018-03-25 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63657619200, #    utc_start 2018-03-25 00:00:00 (Sun)
  63676368000, #      utc_end 2018-10-28 00:00:00 (Sun)
  63657630000, #  local_start 2018-03-25 03:00:00 (Sun)
  63676378800, #    local_end 2018-10-28 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63676368000, #    utc_start 2018-10-28 00:00:00 (Sun)
  63689673600, #      utc_end 2019-03-31 00:00:00 (Sun)
  63676375200, #  local_start 2018-10-28 02:00:00 (Sun)
  63689680800, #    local_end 2019-03-31 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63689673600, #    utc_start 2019-03-31 00:00:00 (Sun)
  63707817600, #      utc_end 2019-10-27 00:00:00 (Sun)
  63689684400, #  local_start 2019-03-31 03:00:00 (Sun)
  63707828400, #    local_end 2019-10-27 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63707817600, #    utc_start 2019-10-27 00:00:00 (Sun)
  63721123200, #      utc_end 2020-03-29 00:00:00 (Sun)
  63707824800, #  local_start 2019-10-27 02:00:00 (Sun)
  63721130400, #    local_end 2020-03-29 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63721123200, #    utc_start 2020-03-29 00:00:00 (Sun)
  63739267200, #      utc_end 2020-10-25 00:00:00 (Sun)
  63721134000, #  local_start 2020-03-29 03:00:00 (Sun)
  63739278000, #    local_end 2020-10-25 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63739267200, #    utc_start 2020-10-25 00:00:00 (Sun)
  63752572800, #      utc_end 2021-03-28 00:00:00 (Sun)
  63739274400, #  local_start 2020-10-25 02:00:00 (Sun)
  63752580000, #    local_end 2021-03-28 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63752572800, #    utc_start 2021-03-28 00:00:00 (Sun)
  63771321600, #      utc_end 2021-10-31 00:00:00 (Sun)
  63752583600, #  local_start 2021-03-28 03:00:00 (Sun)
  63771332400, #    local_end 2021-10-31 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63771321600, #    utc_start 2021-10-31 00:00:00 (Sun)
  63784022400, #      utc_end 2022-03-27 00:00:00 (Sun)
  63771328800, #  local_start 2021-10-31 02:00:00 (Sun)
  63784029600, #    local_end 2022-03-27 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63784022400, #    utc_start 2022-03-27 00:00:00 (Sun)
  63802771200, #      utc_end 2022-10-30 00:00:00 (Sun)
  63784033200, #  local_start 2022-03-27 03:00:00 (Sun)
  63802782000, #    local_end 2022-10-30 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63802771200, #    utc_start 2022-10-30 00:00:00 (Sun)
  63815472000, #      utc_end 2023-03-26 00:00:00 (Sun)
  63802778400, #  local_start 2022-10-30 02:00:00 (Sun)
  63815479200, #    local_end 2023-03-26 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63815472000, #    utc_start 2023-03-26 00:00:00 (Sun)
  63834220800, #      utc_end 2023-10-29 00:00:00 (Sun)
  63815482800, #  local_start 2023-03-26 03:00:00 (Sun)
  63834231600, #    local_end 2023-10-29 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63834220800, #    utc_start 2023-10-29 00:00:00 (Sun)
  63847526400, #      utc_end 2024-03-31 00:00:00 (Sun)
  63834228000, #  local_start 2023-10-29 02:00:00 (Sun)
  63847533600, #    local_end 2024-03-31 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63847526400, #    utc_start 2024-03-31 00:00:00 (Sun)
  63865670400, #      utc_end 2024-10-27 00:00:00 (Sun)
  63847537200, #  local_start 2024-03-31 03:00:00 (Sun)
  63865681200, #    local_end 2024-10-27 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63865670400, #    utc_start 2024-10-27 00:00:00 (Sun)
  63878976000, #      utc_end 2025-03-30 00:00:00 (Sun)
  63865677600, #  local_start 2024-10-27 02:00:00 (Sun)
  63878983200, #    local_end 2025-03-30 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63878976000, #    utc_start 2025-03-30 00:00:00 (Sun)
  63897120000, #      utc_end 2025-10-26 00:00:00 (Sun)
  63878986800, #  local_start 2025-03-30 03:00:00 (Sun)
  63897130800, #    local_end 2025-10-26 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63897120000, #    utc_start 2025-10-26 00:00:00 (Sun)
  63910425600, #      utc_end 2026-03-29 00:00:00 (Sun)
  63897127200, #  local_start 2025-10-26 02:00:00 (Sun)
  63910432800, #    local_end 2026-03-29 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63910425600, #    utc_start 2026-03-29 00:00:00 (Sun)
  63928569600, #      utc_end 2026-10-25 00:00:00 (Sun)
  63910436400, #  local_start 2026-03-29 03:00:00 (Sun)
  63928580400, #    local_end 2026-10-25 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63928569600, #    utc_start 2026-10-25 00:00:00 (Sun)
  63941875200, #      utc_end 2027-03-28 00:00:00 (Sun)
  63928576800, #  local_start 2026-10-25 02:00:00 (Sun)
  63941882400, #    local_end 2027-03-28 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63941875200, #    utc_start 2027-03-28 00:00:00 (Sun)
  63960624000, #      utc_end 2027-10-31 00:00:00 (Sun)
  63941886000, #  local_start 2027-03-28 03:00:00 (Sun)
  63960634800, #    local_end 2027-10-31 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63960624000, #    utc_start 2027-10-31 00:00:00 (Sun)
  63973324800, #      utc_end 2028-03-26 00:00:00 (Sun)
  63960631200, #  local_start 2027-10-31 02:00:00 (Sun)
  63973332000, #    local_end 2028-03-26 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63973324800, #    utc_start 2028-03-26 00:00:00 (Sun)
  63992073600, #      utc_end 2028-10-29 00:00:00 (Sun)
  63973335600, #  local_start 2028-03-26 03:00:00 (Sun)
  63992084400, #    local_end 2028-10-29 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63992073600, #    utc_start 2028-10-29 00:00:00 (Sun)
  64004774400, #      utc_end 2029-03-25 00:00:00 (Sun)
  63992080800, #  local_start 2028-10-29 02:00:00 (Sun)
  64004781600, #    local_end 2029-03-25 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  64004774400, #    utc_start 2029-03-25 00:00:00 (Sun)
  64023523200, #      utc_end 2029-10-28 00:00:00 (Sun)
  64004785200, #  local_start 2029-03-25 03:00:00 (Sun)
  64023534000, #    local_end 2029-10-28 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  64023523200, #    utc_start 2029-10-28 00:00:00 (Sun)
  64036828800, #      utc_end 2030-03-31 00:00:00 (Sun)
  64023530400, #  local_start 2029-10-28 02:00:00 (Sun)
  64036836000, #    local_end 2030-03-31 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  64036828800, #    utc_start 2030-03-31 00:00:00 (Sun)
  64054972800, #      utc_end 2030-10-27 00:00:00 (Sun)
  64036839600, #  local_start 2030-03-31 03:00:00 (Sun)
  64054983600, #    local_end 2030-10-27 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {63}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { 7200 }
  
  my $last_observance = bless( {
    'format' => 'EE%sT',
    'gmtoff' => '2:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 729025,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 729025,
      'utc_rd_secs' => 0,
      'utc_year' => 1998
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => 7200,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 729024,
      'local_rd_secs' => 79200,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 729024,
      'utc_rd_secs' => 79200,
      'utc_year' => 1997
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '3:00',
      'from' => '1997',
      'in' => 'Oct',
      'letter' => '',
      'name' => 'Moldova',
      'offset_from_std' => 0,
      'on' => 'lastSun',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '1997',
      'in' => 'Mar',
      'letter' => 'S',
      'name' => 'Moldova',
      'offset_from_std' => 3600,
      'on' => 'lastSun',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_EUROPE_CHISINAU

    $main::fatpacked{"DateTime/TimeZone/Europe/Copenhagen.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_EUROPE_COPENHAGEN';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Europe::Copenhagen;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Europe::Copenhagen::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59611158580, #      utc_end 1889-12-31 23:09:40 (Tue)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59611161600, #    local_end 1890-01-01 00:00:00 (Wed)
  3020,
  0,
  'LMT',
      ],
      [
  59611158580, #    utc_start 1889-12-31 23:09:40 (Tue)
  59737388980, #      utc_end 1893-12-31 23:09:40 (Sun)
  59611161600, #  local_start 1890-01-01 00:00:00 (Wed)
  59737392000, #    local_end 1894-01-01 00:00:00 (Mon)
  3020,
  0,
  'CMT',
      ],
      [
  59737388980, #    utc_start 1893-12-31 23:09:40 (Sun)
  60443186400, #      utc_end 1916-05-14 22:00:00 (Sun)
  59737392580, #  local_start 1894-01-01 00:09:40 (Mon)
  60443190000, #    local_end 1916-05-14 23:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  60443186400, #    utc_start 1916-05-14 22:00:00 (Sun)
  60455192400, #      utc_end 1916-09-30 21:00:00 (Sat)
  60443193600, #  local_start 1916-05-15 00:00:00 (Mon)
  60455199600, #    local_end 1916-09-30 23:00:00 (Sat)
  7200,
  1,
  'CEST',
      ],
      [
  60455192400, #    utc_start 1916-09-30 21:00:00 (Sat)
  61200572400, #      utc_end 1940-05-14 23:00:00 (Tue)
  60455196000, #  local_start 1916-09-30 22:00:00 (Sat)
  61200576000, #    local_end 1940-05-15 00:00:00 (Wed)
  3600,
  0,
  'CET',
      ],
      [
  61200572400, #    utc_start 1940-05-14 23:00:00 (Tue)
  61278426000, #      utc_end 1942-11-02 01:00:00 (Mon)
  61200579600, #  local_start 1940-05-15 01:00:00 (Wed)
  61278433200, #    local_end 1942-11-02 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61278426000, #    utc_start 1942-11-02 01:00:00 (Mon)
  61291126800, #      utc_end 1943-03-29 01:00:00 (Mon)
  61278429600, #  local_start 1942-11-02 02:00:00 (Mon)
  61291130400, #    local_end 1943-03-29 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61291126800, #    utc_start 1943-03-29 01:00:00 (Mon)
  61307456400, #      utc_end 1943-10-04 01:00:00 (Mon)
  61291134000, #  local_start 1943-03-29 03:00:00 (Mon)
  61307463600, #    local_end 1943-10-04 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61307456400, #    utc_start 1943-10-04 01:00:00 (Mon)
  61323181200, #      utc_end 1944-04-03 01:00:00 (Mon)
  61307460000, #  local_start 1943-10-04 02:00:00 (Mon)
  61323184800, #    local_end 1944-04-03 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61323181200, #    utc_start 1944-04-03 01:00:00 (Mon)
  61338906000, #      utc_end 1944-10-02 01:00:00 (Mon)
  61323188400, #  local_start 1944-04-03 03:00:00 (Mon)
  61338913200, #    local_end 1944-10-02 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61338906000, #    utc_start 1944-10-02 01:00:00 (Mon)
  61354630800, #      utc_end 1945-04-02 01:00:00 (Mon)
  61338909600, #  local_start 1944-10-02 02:00:00 (Mon)
  61354634400, #    local_end 1945-04-02 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61354630800, #    utc_start 1945-04-02 01:00:00 (Mon)
  61366294800, #      utc_end 1945-08-15 01:00:00 (Wed)
  61354638000, #  local_start 1945-04-02 03:00:00 (Mon)
  61366302000, #    local_end 1945-08-15 03:00:00 (Wed)
  7200,
  1,
  'CEST',
      ],
      [
  61366294800, #    utc_start 1945-08-15 01:00:00 (Wed)
  61388672400, #      utc_end 1946-05-01 01:00:00 (Wed)
  61366298400, #  local_start 1945-08-15 02:00:00 (Wed)
  61388676000, #    local_end 1946-05-01 02:00:00 (Wed)
  3600,
  0,
  'CET',
      ],
      [
  61388672400, #    utc_start 1946-05-01 01:00:00 (Wed)
  61399299600, #      utc_end 1946-09-01 01:00:00 (Sun)
  61388679600, #  local_start 1946-05-01 03:00:00 (Wed)
  61399306800, #    local_end 1946-09-01 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  61399299600, #    utc_start 1946-09-01 01:00:00 (Sun)
  61420467600, #      utc_end 1947-05-04 01:00:00 (Sun)
  61399303200, #  local_start 1946-09-01 02:00:00 (Sun)
  61420471200, #    local_end 1947-05-04 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  61420467600, #    utc_start 1947-05-04 01:00:00 (Sun)
  61428934800, #      utc_end 1947-08-10 01:00:00 (Sun)
  61420474800, #  local_start 1947-05-04 03:00:00 (Sun)
  61428942000, #    local_end 1947-08-10 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  61428934800, #    utc_start 1947-08-10 01:00:00 (Sun)
  61452522000, #      utc_end 1948-05-09 01:00:00 (Sun)
  61428938400, #  local_start 1947-08-10 02:00:00 (Sun)
  61452525600, #    local_end 1948-05-09 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  61452522000, #    utc_start 1948-05-09 01:00:00 (Sun)
  61460384400, #      utc_end 1948-08-08 01:00:00 (Sun)
  61452529200, #  local_start 1948-05-09 03:00:00 (Sun)
  61460391600, #    local_end 1948-08-08 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  61460384400, #    utc_start 1948-08-08 01:00:00 (Sun)
  62451212400, #      utc_end 1979-12-31 23:00:00 (Mon)
  61460388000, #  local_start 1948-08-08 02:00:00 (Sun)
  62451216000, #    local_end 1980-01-01 00:00:00 (Tue)
  3600,
  0,
  'CET',
      ],
      [
  62451212400, #    utc_start 1979-12-31 23:00:00 (Mon)
  62459514000, #      utc_end 1980-04-06 01:00:00 (Sun)
  62451216000, #  local_start 1980-01-01 00:00:00 (Tue)
  62459517600, #    local_end 1980-04-06 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62459514000, #    utc_start 1980-04-06 01:00:00 (Sun)
  62474634000, #      utc_end 1980-09-28 01:00:00 (Sun)
  62459521200, #  local_start 1980-04-06 03:00:00 (Sun)
  62474641200, #    local_end 1980-09-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62474634000, #    utc_start 1980-09-28 01:00:00 (Sun)
  62490358800, #      utc_end 1981-03-29 01:00:00 (Sun)
  62474637600, #  local_start 1980-09-28 02:00:00 (Sun)
  62490362400, #    local_end 1981-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62490358800, #    utc_start 1981-03-29 01:00:00 (Sun)
  62506083600, #      utc_end 1981-09-27 01:00:00 (Sun)
  62490366000, #  local_start 1981-03-29 03:00:00 (Sun)
  62506090800, #    local_end 1981-09-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62506083600, #    utc_start 1981-09-27 01:00:00 (Sun)
  62521808400, #      utc_end 1982-03-28 01:00:00 (Sun)
  62506087200, #  local_start 1981-09-27 02:00:00 (Sun)
  62521812000, #    local_end 1982-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62521808400, #    utc_start 1982-03-28 01:00:00 (Sun)
  62537533200, #      utc_end 1982-09-26 01:00:00 (Sun)
  62521815600, #  local_start 1982-03-28 03:00:00 (Sun)
  62537540400, #    local_end 1982-09-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62537533200, #    utc_start 1982-09-26 01:00:00 (Sun)
  62553258000, #      utc_end 1983-03-27 01:00:00 (Sun)
  62537536800, #  local_start 1982-09-26 02:00:00 (Sun)
  62553261600, #    local_end 1983-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62553258000, #    utc_start 1983-03-27 01:00:00 (Sun)
  62568982800, #      utc_end 1983-09-25 01:00:00 (Sun)
  62553265200, #  local_start 1983-03-27 03:00:00 (Sun)
  62568990000, #    local_end 1983-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62568982800, #    utc_start 1983-09-25 01:00:00 (Sun)
  62584707600, #      utc_end 1984-03-25 01:00:00 (Sun)
  62568986400, #  local_start 1983-09-25 02:00:00 (Sun)
  62584711200, #    local_end 1984-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62584707600, #    utc_start 1984-03-25 01:00:00 (Sun)
  62601037200, #      utc_end 1984-09-30 01:00:00 (Sun)
  62584714800, #  local_start 1984-03-25 03:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62601037200, #    utc_start 1984-09-30 01:00:00 (Sun)
  62616762000, #      utc_end 1985-03-31 01:00:00 (Sun)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62616762000, #    utc_start 1985-03-31 01:00:00 (Sun)
  62632486800, #      utc_end 1985-09-29 01:00:00 (Sun)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62632486800, #    utc_start 1985-09-29 01:00:00 (Sun)
  62648211600, #      utc_end 1986-03-30 01:00:00 (Sun)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62648211600, #    utc_start 1986-03-30 01:00:00 (Sun)
  62663936400, #      utc_end 1986-09-28 01:00:00 (Sun)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62663936400, #    utc_start 1986-09-28 01:00:00 (Sun)
  62679661200, #      utc_end 1987-03-29 01:00:00 (Sun)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62679661200, #    utc_start 1987-03-29 01:00:00 (Sun)
  62695386000, #      utc_end 1987-09-27 01:00:00 (Sun)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62695386000, #    utc_start 1987-09-27 01:00:00 (Sun)
  62711110800, #      utc_end 1988-03-27 01:00:00 (Sun)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62711110800, #    utc_start 1988-03-27 01:00:00 (Sun)
  62726835600, #      utc_end 1988-09-25 01:00:00 (Sun)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62726835600, #    utc_start 1988-09-25 01:00:00 (Sun)
  62742560400, #      utc_end 1989-03-26 01:00:00 (Sun)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62742560400, #    utc_start 1989-03-26 01:00:00 (Sun)
  62758285200, #      utc_end 1989-09-24 01:00:00 (Sun)
  62742567600, #  local_start 1989-03-26 03:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62758285200, #    utc_start 1989-09-24 01:00:00 (Sun)
  62774010000, #      utc_end 1990-03-25 01:00:00 (Sun)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62774010000, #    utc_start 1990-03-25 01:00:00 (Sun)
  62790339600, #      utc_end 1990-09-30 01:00:00 (Sun)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62790339600, #    utc_start 1990-09-30 01:00:00 (Sun)
  62806064400, #      utc_end 1991-03-31 01:00:00 (Sun)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62806064400, #    utc_start 1991-03-31 01:00:00 (Sun)
  62821789200, #      utc_end 1991-09-29 01:00:00 (Sun)
  62806071600, #  local_start 1991-03-31 03:00:00 (Sun)
  62821796400, #    local_end 1991-09-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62821789200, #    utc_start 1991-09-29 01:00:00 (Sun)
  62837514000, #      utc_end 1992-03-29 01:00:00 (Sun)
  62821792800, #  local_start 1991-09-29 02:00:00 (Sun)
  62837517600, #    local_end 1992-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62837514000, #    utc_start 1992-03-29 01:00:00 (Sun)
  62853238800, #      utc_end 1992-09-27 01:00:00 (Sun)
  62837521200, #  local_start 1992-03-29 03:00:00 (Sun)
  62853246000, #    local_end 1992-09-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62853238800, #    utc_start 1992-09-27 01:00:00 (Sun)
  62868963600, #      utc_end 1993-03-28 01:00:00 (Sun)
  62853242400, #  local_start 1992-09-27 02:00:00 (Sun)
  62868967200, #    local_end 1993-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62868963600, #    utc_start 1993-03-28 01:00:00 (Sun)
  62884688400, #      utc_end 1993-09-26 01:00:00 (Sun)
  62868970800, #  local_start 1993-03-28 03:00:00 (Sun)
  62884695600, #    local_end 1993-09-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62884688400, #    utc_start 1993-09-26 01:00:00 (Sun)
  62900413200, #      utc_end 1994-03-27 01:00:00 (Sun)
  62884692000, #  local_start 1993-09-26 02:00:00 (Sun)
  62900416800, #    local_end 1994-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62900413200, #    utc_start 1994-03-27 01:00:00 (Sun)
  62916138000, #      utc_end 1994-09-25 01:00:00 (Sun)
  62900420400, #  local_start 1994-03-27 03:00:00 (Sun)
  62916145200, #    local_end 1994-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62916138000, #    utc_start 1994-09-25 01:00:00 (Sun)
  62931862800, #      utc_end 1995-03-26 01:00:00 (Sun)
  62916141600, #  local_start 1994-09-25 02:00:00 (Sun)
  62931866400, #    local_end 1995-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62931862800, #    utc_start 1995-03-26 01:00:00 (Sun)
  62947587600, #      utc_end 1995-09-24 01:00:00 (Sun)
  62931870000, #  local_start 1995-03-26 03:00:00 (Sun)
  62947594800, #    local_end 1995-09-24 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62947587600, #    utc_start 1995-09-24 01:00:00 (Sun)
  62963917200, #      utc_end 1996-03-31 01:00:00 (Sun)
  62947591200, #  local_start 1995-09-24 02:00:00 (Sun)
  62963920800, #    local_end 1996-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62963917200, #    utc_start 1996-03-31 01:00:00 (Sun)
  62982061200, #      utc_end 1996-10-27 01:00:00 (Sun)
  62963924400, #  local_start 1996-03-31 03:00:00 (Sun)
  62982068400, #    local_end 1996-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62982061200, #    utc_start 1996-10-27 01:00:00 (Sun)
  62995366800, #      utc_end 1997-03-30 01:00:00 (Sun)
  62982064800, #  local_start 1996-10-27 02:00:00 (Sun)
  62995370400, #    local_end 1997-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62995366800, #    utc_start 1997-03-30 01:00:00 (Sun)
  63013510800, #      utc_end 1997-10-26 01:00:00 (Sun)
  62995374000, #  local_start 1997-03-30 03:00:00 (Sun)
  63013518000, #    local_end 1997-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63013510800, #    utc_start 1997-10-26 01:00:00 (Sun)
  63026816400, #      utc_end 1998-03-29 01:00:00 (Sun)
  63013514400, #  local_start 1997-10-26 02:00:00 (Sun)
  63026820000, #    local_end 1998-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63026816400, #    utc_start 1998-03-29 01:00:00 (Sun)
  63044960400, #      utc_end 1998-10-25 01:00:00 (Sun)
  63026823600, #  local_start 1998-03-29 03:00:00 (Sun)
  63044967600, #    local_end 1998-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63044960400, #    utc_start 1998-10-25 01:00:00 (Sun)
  63058266000, #      utc_end 1999-03-28 01:00:00 (Sun)
  63044964000, #  local_start 1998-10-25 02:00:00 (Sun)
  63058269600, #    local_end 1999-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63058266000, #    utc_start 1999-03-28 01:00:00 (Sun)
  63077014800, #      utc_end 1999-10-31 01:00:00 (Sun)
  63058273200, #  local_start 1999-03-28 03:00:00 (Sun)
  63077022000, #    local_end 1999-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63077014800, #    utc_start 1999-10-31 01:00:00 (Sun)
  63089715600, #      utc_end 2000-03-26 01:00:00 (Sun)
  63077018400, #  local_start 1999-10-31 02:00:00 (Sun)
  63089719200, #    local_end 2000-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63089715600, #    utc_start 2000-03-26 01:00:00 (Sun)
  63108464400, #      utc_end 2000-10-29 01:00:00 (Sun)
  63089722800, #  local_start 2000-03-26 03:00:00 (Sun)
  63108471600, #    local_end 2000-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63108464400, #    utc_start 2000-10-29 01:00:00 (Sun)
  63121165200, #      utc_end 2001-03-25 01:00:00 (Sun)
  63108468000, #  local_start 2000-10-29 02:00:00 (Sun)
  63121168800, #    local_end 2001-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63121165200, #    utc_start 2001-03-25 01:00:00 (Sun)
  63139914000, #      utc_end 2001-10-28 01:00:00 (Sun)
  63121172400, #  local_start 2001-03-25 03:00:00 (Sun)
  63139921200, #    local_end 2001-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63139914000, #    utc_start 2001-10-28 01:00:00 (Sun)
  63153219600, #      utc_end 2002-03-31 01:00:00 (Sun)
  63139917600, #  local_start 2001-10-28 02:00:00 (Sun)
  63153223200, #    local_end 2002-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63153219600, #    utc_start 2002-03-31 01:00:00 (Sun)
  63171363600, #      utc_end 2002-10-27 01:00:00 (Sun)
  63153226800, #  local_start 2002-03-31 03:00:00 (Sun)
  63171370800, #    local_end 2002-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63171363600, #    utc_start 2002-10-27 01:00:00 (Sun)
  63184669200, #      utc_end 2003-03-30 01:00:00 (Sun)
  63171367200, #  local_start 2002-10-27 02:00:00 (Sun)
  63184672800, #    local_end 2003-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63184669200, #    utc_start 2003-03-30 01:00:00 (Sun)
  63202813200, #      utc_end 2003-10-26 01:00:00 (Sun)
  63184676400, #  local_start 2003-03-30 03:00:00 (Sun)
  63202820400, #    local_end 2003-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63202813200, #    utc_start 2003-10-26 01:00:00 (Sun)
  63216118800, #      utc_end 2004-03-28 01:00:00 (Sun)
  63202816800, #  local_start 2003-10-26 02:00:00 (Sun)
  63216122400, #    local_end 2004-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63216118800, #    utc_start 2004-03-28 01:00:00 (Sun)
  63234867600, #      utc_end 2004-10-31 01:00:00 (Sun)
  63216126000, #  local_start 2004-03-28 03:00:00 (Sun)
  63234874800, #    local_end 2004-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63234867600, #    utc_start 2004-10-31 01:00:00 (Sun)
  63247568400, #      utc_end 2005-03-27 01:00:00 (Sun)
  63234871200, #  local_start 2004-10-31 02:00:00 (Sun)
  63247572000, #    local_end 2005-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63247568400, #    utc_start 2005-03-27 01:00:00 (Sun)
  63266317200, #      utc_end 2005-10-30 01:00:00 (Sun)
  63247575600, #  local_start 2005-03-27 03:00:00 (Sun)
  63266324400, #    local_end 2005-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63266317200, #    utc_start 2005-10-30 01:00:00 (Sun)
  63279018000, #      utc_end 2006-03-26 01:00:00 (Sun)
  63266320800, #  local_start 2005-10-30 02:00:00 (Sun)
  63279021600, #    local_end 2006-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63279018000, #    utc_start 2006-03-26 01:00:00 (Sun)
  63297766800, #      utc_end 2006-10-29 01:00:00 (Sun)
  63279025200, #  local_start 2006-03-26 03:00:00 (Sun)
  63297774000, #    local_end 2006-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63297766800, #    utc_start 2006-10-29 01:00:00 (Sun)
  63310467600, #      utc_end 2007-03-25 01:00:00 (Sun)
  63297770400, #  local_start 2006-10-29 02:00:00 (Sun)
  63310471200, #    local_end 2007-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63310467600, #    utc_start 2007-03-25 01:00:00 (Sun)
  63329216400, #      utc_end 2007-10-28 01:00:00 (Sun)
  63310474800, #  local_start 2007-03-25 03:00:00 (Sun)
  63329223600, #    local_end 2007-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63329216400, #    utc_start 2007-10-28 01:00:00 (Sun)
  63342522000, #      utc_end 2008-03-30 01:00:00 (Sun)
  63329220000, #  local_start 2007-10-28 02:00:00 (Sun)
  63342525600, #    local_end 2008-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63342522000, #    utc_start 2008-03-30 01:00:00 (Sun)
  63360666000, #      utc_end 2008-10-26 01:00:00 (Sun)
  63342529200, #  local_start 2008-03-30 03:00:00 (Sun)
  63360673200, #    local_end 2008-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63360666000, #    utc_start 2008-10-26 01:00:00 (Sun)
  63373971600, #      utc_end 2009-03-29 01:00:00 (Sun)
  63360669600, #  local_start 2008-10-26 02:00:00 (Sun)
  63373975200, #    local_end 2009-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63373971600, #    utc_start 2009-03-29 01:00:00 (Sun)
  63392115600, #      utc_end 2009-10-25 01:00:00 (Sun)
  63373978800, #  local_start 2009-03-29 03:00:00 (Sun)
  63392122800, #    local_end 2009-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63392115600, #    utc_start 2009-10-25 01:00:00 (Sun)
  63405421200, #      utc_end 2010-03-28 01:00:00 (Sun)
  63392119200, #  local_start 2009-10-25 02:00:00 (Sun)
  63405424800, #    local_end 2010-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63405421200, #    utc_start 2010-03-28 01:00:00 (Sun)
  63424170000, #      utc_end 2010-10-31 01:00:00 (Sun)
  63405428400, #  local_start 2010-03-28 03:00:00 (Sun)
  63424177200, #    local_end 2010-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63424170000, #    utc_start 2010-10-31 01:00:00 (Sun)
  63436870800, #      utc_end 2011-03-27 01:00:00 (Sun)
  63424173600, #  local_start 2010-10-31 02:00:00 (Sun)
  63436874400, #    local_end 2011-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63436870800, #    utc_start 2011-03-27 01:00:00 (Sun)
  63455619600, #      utc_end 2011-10-30 01:00:00 (Sun)
  63436878000, #  local_start 2011-03-27 03:00:00 (Sun)
  63455626800, #    local_end 2011-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63455619600, #    utc_start 2011-10-30 01:00:00 (Sun)
  63468320400, #      utc_end 2012-03-25 01:00:00 (Sun)
  63455623200, #  local_start 2011-10-30 02:00:00 (Sun)
  63468324000, #    local_end 2012-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63468320400, #    utc_start 2012-03-25 01:00:00 (Sun)
  63487069200, #      utc_end 2012-10-28 01:00:00 (Sun)
  63468327600, #  local_start 2012-03-25 03:00:00 (Sun)
  63487076400, #    local_end 2012-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63487069200, #    utc_start 2012-10-28 01:00:00 (Sun)
  63500374800, #      utc_end 2013-03-31 01:00:00 (Sun)
  63487072800, #  local_start 2012-10-28 02:00:00 (Sun)
  63500378400, #    local_end 2013-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63500374800, #    utc_start 2013-03-31 01:00:00 (Sun)
  63518518800, #      utc_end 2013-10-27 01:00:00 (Sun)
  63500382000, #  local_start 2013-03-31 03:00:00 (Sun)
  63518526000, #    local_end 2013-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63518518800, #    utc_start 2013-10-27 01:00:00 (Sun)
  63531824400, #      utc_end 2014-03-30 01:00:00 (Sun)
  63518522400, #  local_start 2013-10-27 02:00:00 (Sun)
  63531828000, #    local_end 2014-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63531824400, #    utc_start 2014-03-30 01:00:00 (Sun)
  63549968400, #      utc_end 2014-10-26 01:00:00 (Sun)
  63531831600, #  local_start 2014-03-30 03:00:00 (Sun)
  63549975600, #    local_end 2014-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63549968400, #    utc_start 2014-10-26 01:00:00 (Sun)
  63563274000, #      utc_end 2015-03-29 01:00:00 (Sun)
  63549972000, #  local_start 2014-10-26 02:00:00 (Sun)
  63563277600, #    local_end 2015-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63563274000, #    utc_start 2015-03-29 01:00:00 (Sun)
  63581418000, #      utc_end 2015-10-25 01:00:00 (Sun)
  63563281200, #  local_start 2015-03-29 03:00:00 (Sun)
  63581425200, #    local_end 2015-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63581418000, #    utc_start 2015-10-25 01:00:00 (Sun)
  63594723600, #      utc_end 2016-03-27 01:00:00 (Sun)
  63581421600, #  local_start 2015-10-25 02:00:00 (Sun)
  63594727200, #    local_end 2016-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63594723600, #    utc_start 2016-03-27 01:00:00 (Sun)
  63613472400, #      utc_end 2016-10-30 01:00:00 (Sun)
  63594730800, #  local_start 2016-03-27 03:00:00 (Sun)
  63613479600, #    local_end 2016-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63613472400, #    utc_start 2016-10-30 01:00:00 (Sun)
  63626173200, #      utc_end 2017-03-26 01:00:00 (Sun)
  63613476000, #  local_start 2016-10-30 02:00:00 (Sun)
  63626176800, #    local_end 2017-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63626173200, #    utc_start 2017-03-26 01:00:00 (Sun)
  63644922000, #      utc_end 2017-10-29 01:00:00 (Sun)
  63626180400, #  local_start 2017-03-26 03:00:00 (Sun)
  63644929200, #    local_end 2017-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63644922000, #    utc_start 2017-10-29 01:00:00 (Sun)
  63657622800, #      utc_end 2018-03-25 01:00:00 (Sun)
  63644925600, #  local_start 2017-10-29 02:00:00 (Sun)
  63657626400, #    local_end 2018-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63657622800, #    utc_start 2018-03-25 01:00:00 (Sun)
  63676371600, #      utc_end 2018-10-28 01:00:00 (Sun)
  63657630000, #  local_start 2018-03-25 03:00:00 (Sun)
  63676378800, #    local_end 2018-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63676371600, #    utc_start 2018-10-28 01:00:00 (Sun)
  63689677200, #      utc_end 2019-03-31 01:00:00 (Sun)
  63676375200, #  local_start 2018-10-28 02:00:00 (Sun)
  63689680800, #    local_end 2019-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63689677200, #    utc_start 2019-03-31 01:00:00 (Sun)
  63707821200, #      utc_end 2019-10-27 01:00:00 (Sun)
  63689684400, #  local_start 2019-03-31 03:00:00 (Sun)
  63707828400, #    local_end 2019-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63707821200, #    utc_start 2019-10-27 01:00:00 (Sun)
  63721126800, #      utc_end 2020-03-29 01:00:00 (Sun)
  63707824800, #  local_start 2019-10-27 02:00:00 (Sun)
  63721130400, #    local_end 2020-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63721126800, #    utc_start 2020-03-29 01:00:00 (Sun)
  63739270800, #      utc_end 2020-10-25 01:00:00 (Sun)
  63721134000, #  local_start 2020-03-29 03:00:00 (Sun)
  63739278000, #    local_end 2020-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63739270800, #    utc_start 2020-10-25 01:00:00 (Sun)
  63752576400, #      utc_end 2021-03-28 01:00:00 (Sun)
  63739274400, #  local_start 2020-10-25 02:00:00 (Sun)
  63752580000, #    local_end 2021-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63752576400, #    utc_start 2021-03-28 01:00:00 (Sun)
  63771325200, #      utc_end 2021-10-31 01:00:00 (Sun)
  63752583600, #  local_start 2021-03-28 03:00:00 (Sun)
  63771332400, #    local_end 2021-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63771325200, #    utc_start 2021-10-31 01:00:00 (Sun)
  63784026000, #      utc_end 2022-03-27 01:00:00 (Sun)
  63771328800, #  local_start 2021-10-31 02:00:00 (Sun)
  63784029600, #    local_end 2022-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63784026000, #    utc_start 2022-03-27 01:00:00 (Sun)
  63802774800, #      utc_end 2022-10-30 01:00:00 (Sun)
  63784033200, #  local_start 2022-03-27 03:00:00 (Sun)
  63802782000, #    local_end 2022-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63802774800, #    utc_start 2022-10-30 01:00:00 (Sun)
  63815475600, #      utc_end 2023-03-26 01:00:00 (Sun)
  63802778400, #  local_start 2022-10-30 02:00:00 (Sun)
  63815479200, #    local_end 2023-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63815475600, #    utc_start 2023-03-26 01:00:00 (Sun)
  63834224400, #      utc_end 2023-10-29 01:00:00 (Sun)
  63815482800, #  local_start 2023-03-26 03:00:00 (Sun)
  63834231600, #    local_end 2023-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63834224400, #    utc_start 2023-10-29 01:00:00 (Sun)
  63847530000, #      utc_end 2024-03-31 01:00:00 (Sun)
  63834228000, #  local_start 2023-10-29 02:00:00 (Sun)
  63847533600, #    local_end 2024-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63847530000, #    utc_start 2024-03-31 01:00:00 (Sun)
  63865674000, #      utc_end 2024-10-27 01:00:00 (Sun)
  63847537200, #  local_start 2024-03-31 03:00:00 (Sun)
  63865681200, #    local_end 2024-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63865674000, #    utc_start 2024-10-27 01:00:00 (Sun)
  63878979600, #      utc_end 2025-03-30 01:00:00 (Sun)
  63865677600, #  local_start 2024-10-27 02:00:00 (Sun)
  63878983200, #    local_end 2025-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63878979600, #    utc_start 2025-03-30 01:00:00 (Sun)
  63897123600, #      utc_end 2025-10-26 01:00:00 (Sun)
  63878986800, #  local_start 2025-03-30 03:00:00 (Sun)
  63897130800, #    local_end 2025-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63897123600, #    utc_start 2025-10-26 01:00:00 (Sun)
  63910429200, #      utc_end 2026-03-29 01:00:00 (Sun)
  63897127200, #  local_start 2025-10-26 02:00:00 (Sun)
  63910432800, #    local_end 2026-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63910429200, #    utc_start 2026-03-29 01:00:00 (Sun)
  63928573200, #      utc_end 2026-10-25 01:00:00 (Sun)
  63910436400, #  local_start 2026-03-29 03:00:00 (Sun)
  63928580400, #    local_end 2026-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63928573200, #    utc_start 2026-10-25 01:00:00 (Sun)
  63941878800, #      utc_end 2027-03-28 01:00:00 (Sun)
  63928576800, #  local_start 2026-10-25 02:00:00 (Sun)
  63941882400, #    local_end 2027-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63941878800, #    utc_start 2027-03-28 01:00:00 (Sun)
  63960627600, #      utc_end 2027-10-31 01:00:00 (Sun)
  63941886000, #  local_start 2027-03-28 03:00:00 (Sun)
  63960634800, #    local_end 2027-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63960627600, #    utc_start 2027-10-31 01:00:00 (Sun)
  63973328400, #      utc_end 2028-03-26 01:00:00 (Sun)
  63960631200, #  local_start 2027-10-31 02:00:00 (Sun)
  63973332000, #    local_end 2028-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63973328400, #    utc_start 2028-03-26 01:00:00 (Sun)
  63992077200, #      utc_end 2028-10-29 01:00:00 (Sun)
  63973335600, #  local_start 2028-03-26 03:00:00 (Sun)
  63992084400, #    local_end 2028-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63992077200, #    utc_start 2028-10-29 01:00:00 (Sun)
  64004778000, #      utc_end 2029-03-25 01:00:00 (Sun)
  63992080800, #  local_start 2028-10-29 02:00:00 (Sun)
  64004781600, #    local_end 2029-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  64004778000, #    utc_start 2029-03-25 01:00:00 (Sun)
  64023526800, #      utc_end 2029-10-28 01:00:00 (Sun)
  64004785200, #  local_start 2029-03-25 03:00:00 (Sun)
  64023534000, #    local_end 2029-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  64023526800, #    utc_start 2029-10-28 01:00:00 (Sun)
  64036832400, #      utc_end 2030-03-31 01:00:00 (Sun)
  64023530400, #  local_start 2029-10-28 02:00:00 (Sun)
  64036836000, #    local_end 2030-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  64036832400, #    utc_start 2030-03-31 01:00:00 (Sun)
  64054976400, #      utc_end 2030-10-27 01:00:00 (Sun)
  64036839600, #  local_start 2030-03-31 03:00:00 (Sun)
  64054983600, #    local_end 2030-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {59}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { 3600 }
  
  my $last_observance = bless( {
    'format' => 'CE%sT',
    'gmtoff' => '1:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 722815,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 722815,
      'utc_rd_secs' => 0,
      'utc_year' => 1981
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => 3600,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 722814,
      'local_rd_secs' => 82800,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 722814,
      'utc_rd_secs' => 82800,
      'utc_year' => 1980
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '1:00u',
      'from' => '1981',
      'in' => 'Mar',
      'letter' => 'S',
      'name' => 'EU',
      'offset_from_std' => 3600,
      'on' => 'lastSun',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '1:00u',
      'from' => '1996',
      'in' => 'Oct',
      'letter' => '',
      'name' => 'EU',
      'offset_from_std' => 0,
      'on' => 'lastSun',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_EUROPE_COPENHAGEN

    $main::fatpacked{"DateTime/TimeZone/Europe/Dublin.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_EUROPE_DUBLIN';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Europe::Dublin;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Europe::Dublin::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59314033500, #      utc_end 1880-08-02 00:25:00 (Mon)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59314032000, #    local_end 1880-08-02 00:00:00 (Mon)
  -1500,
  0,
  'LMT',
      ],
      [
  59314033500, #    utc_start 1880-08-02 00:25:00 (Mon)
  60443720721, #      utc_end 1916-05-21 02:25:21 (Sun)
  59314031979, #  local_start 1880-08-01 23:59:39 (Sun)
  60443719200, #    local_end 1916-05-21 02:00:00 (Sun)
  -1521,
  0,
  'DMT',
      ],
      [
  60443720721, #    utc_start 1916-05-21 02:25:21 (Sun)
  60455211921, #      utc_end 1916-10-01 02:25:21 (Sun)
  60443722800, #  local_start 1916-05-21 03:00:00 (Sun)
  60455214000, #    local_end 1916-10-01 03:00:00 (Sun)
  2079,
  1,
  'IST',
      ],
      [
  60455211921, #    utc_start 1916-10-01 02:25:21 (Sun)
  60471540000, #      utc_end 1917-04-08 02:00:00 (Sun)
  60455211921, #  local_start 1916-10-01 02:25:21 (Sun)
  60471540000, #    local_end 1917-04-08 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  60471540000, #    utc_start 1917-04-08 02:00:00 (Sun)
  60485536800, #      utc_end 1917-09-17 02:00:00 (Mon)
  60471543600, #  local_start 1917-04-08 03:00:00 (Sun)
  60485540400, #    local_end 1917-09-17 03:00:00 (Mon)
  3600,
  1,
  'BST',
      ],
      [
  60485536800, #    utc_start 1917-09-17 02:00:00 (Mon)
  60501780000, #      utc_end 1918-03-24 02:00:00 (Sun)
  60485536800, #  local_start 1917-09-17 02:00:00 (Mon)
  60501780000, #    local_end 1918-03-24 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  60501780000, #    utc_start 1918-03-24 02:00:00 (Sun)
  60518196000, #      utc_end 1918-09-30 02:00:00 (Mon)
  60501783600, #  local_start 1918-03-24 03:00:00 (Sun)
  60518199600, #    local_end 1918-09-30 03:00:00 (Mon)
  3600,
  1,
  'BST',
      ],
      [
  60518196000, #    utc_start 1918-09-30 02:00:00 (Mon)
  60533834400, #      utc_end 1919-03-30 02:00:00 (Sun)
  60518196000, #  local_start 1918-09-30 02:00:00 (Mon)
  60533834400, #    local_end 1919-03-30 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  60533834400, #    utc_start 1919-03-30 02:00:00 (Sun)
  60549645600, #      utc_end 1919-09-29 02:00:00 (Mon)
  60533838000, #  local_start 1919-03-30 03:00:00 (Sun)
  60549649200, #    local_end 1919-09-29 03:00:00 (Mon)
  3600,
  1,
  'BST',
      ],
      [
  60549645600, #    utc_start 1919-09-29 02:00:00 (Mon)
  60565284000, #      utc_end 1920-03-28 02:00:00 (Sun)
  60549645600, #  local_start 1919-09-29 02:00:00 (Mon)
  60565284000, #    local_end 1920-03-28 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  60565284000, #    utc_start 1920-03-28 02:00:00 (Sun)
  60583514400, #      utc_end 1920-10-25 02:00:00 (Mon)
  60565287600, #  local_start 1920-03-28 03:00:00 (Sun)
  60583518000, #    local_end 1920-10-25 03:00:00 (Mon)
  3600,
  1,
  'BST',
      ],
      [
  60583514400, #    utc_start 1920-10-25 02:00:00 (Mon)
  60597338400, #      utc_end 1921-04-03 02:00:00 (Sun)
  60583514400, #  local_start 1920-10-25 02:00:00 (Mon)
  60597338400, #    local_end 1921-04-03 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  60597338400, #    utc_start 1921-04-03 02:00:00 (Sun)
  60613149600, #      utc_end 1921-10-03 02:00:00 (Mon)
  60597342000, #  local_start 1921-04-03 03:00:00 (Sun)
  60613153200, #    local_end 1921-10-03 03:00:00 (Mon)
  3600,
  1,
  'BST',
      ],
      [
  60613149600, #    utc_start 1921-10-03 02:00:00 (Mon)
  60618672000, #      utc_end 1921-12-06 00:00:00 (Tue)
  60613149600, #  local_start 1921-10-03 02:00:00 (Mon)
  60618672000, #    local_end 1921-12-06 00:00:00 (Tue)
  0,
  0,
  'GMT',
      ],
      [
  60618672000, #    utc_start 1921-12-06 00:00:00 (Tue)
  60628183200, #      utc_end 1922-03-26 02:00:00 (Sun)
  60618672000, #  local_start 1921-12-06 00:00:00 (Tue)
  60628183200, #    local_end 1922-03-26 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  60628183200, #    utc_start 1922-03-26 02:00:00 (Sun)
  60645117600, #      utc_end 1922-10-08 02:00:00 (Sun)
  60628186800, #  local_start 1922-03-26 03:00:00 (Sun)
  60645121200, #    local_end 1922-10-08 03:00:00 (Sun)
  3600,
  1,
  'IST',
      ],
      [
  60645117600, #    utc_start 1922-10-08 02:00:00 (Sun)
  60662052000, #      utc_end 1923-04-22 02:00:00 (Sun)
  60645117600, #  local_start 1922-10-08 02:00:00 (Sun)
  60662052000, #    local_end 1923-04-22 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  60662052000, #    utc_start 1923-04-22 02:00:00 (Sun)
  60674752800, #      utc_end 1923-09-16 02:00:00 (Sun)
  60662055600, #  local_start 1923-04-22 03:00:00 (Sun)
  60674756400, #    local_end 1923-09-16 03:00:00 (Sun)
  3600,
  1,
  'IST',
      ],
      [
  60674752800, #    utc_start 1923-09-16 02:00:00 (Sun)
  60692896800, #      utc_end 1924-04-13 02:00:00 (Sun)
  60674752800, #  local_start 1923-09-16 02:00:00 (Sun)
  60692896800, #    local_end 1924-04-13 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  60692896800, #    utc_start 1924-04-13 02:00:00 (Sun)
  60706807200, #      utc_end 1924-09-21 02:00:00 (Sun)
  60692900400, #  local_start 1924-04-13 03:00:00 (Sun)
  60706810800, #    local_end 1924-09-21 03:00:00 (Sun)
  3600,
  1,
  'IST',
      ],
      [
  60706807200, #    utc_start 1924-09-21 02:00:00 (Sun)
  60724951200, #      utc_end 1925-04-19 02:00:00 (Sun)
  60706807200, #  local_start 1924-09-21 02:00:00 (Sun)
  60724951200, #    local_end 1925-04-19 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  60724951200, #    utc_start 1925-04-19 02:00:00 (Sun)
  60739466400, #      utc_end 1925-10-04 02:00:00 (Sun)
  60724954800, #  local_start 1925-04-19 03:00:00 (Sun)
  60739470000, #    local_end 1925-10-04 03:00:00 (Sun)
  3600,
  1,
  'IST',
      ],
      [
  60739466400, #    utc_start 1925-10-04 02:00:00 (Sun)
  60756400800, #      utc_end 1926-04-18 02:00:00 (Sun)
  60739466400, #  local_start 1925-10-04 02:00:00 (Sun)
  60756400800, #    local_end 1926-04-18 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  60756400800, #    utc_start 1926-04-18 02:00:00 (Sun)
  60770916000, #      utc_end 1926-10-03 02:00:00 (Sun)
  60756404400, #  local_start 1926-04-18 03:00:00 (Sun)
  60770919600, #    local_end 1926-10-03 03:00:00 (Sun)
  3600,
  1,
  'IST',
      ],
      [
  60770916000, #    utc_start 1926-10-03 02:00:00 (Sun)
  60787245600, #      utc_end 1927-04-10 02:00:00 (Sun)
  60770916000, #  local_start 1926-10-03 02:00:00 (Sun)
  60787245600, #    local_end 1927-04-10 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  60787245600, #    utc_start 1927-04-10 02:00:00 (Sun)
  60802365600, #      utc_end 1927-10-02 02:00:00 (Sun)
  60787249200, #  local_start 1927-04-10 03:00:00 (Sun)
  60802369200, #    local_end 1927-10-02 03:00:00 (Sun)
  3600,
  1,
  'IST',
      ],
      [
  60802365600, #    utc_start 1927-10-02 02:00:00 (Sun)
  60819904800, #      utc_end 1928-04-22 02:00:00 (Sun)
  60802365600, #  local_start 1927-10-02 02:00:00 (Sun)
  60819904800, #    local_end 1928-04-22 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  60819904800, #    utc_start 1928-04-22 02:00:00 (Sun)
  60834420000, #      utc_end 1928-10-07 02:00:00 (Sun)
  60819908400, #  local_start 1928-04-22 03:00:00 (Sun)
  60834423600, #    local_end 1928-10-07 03:00:00 (Sun)
  3600,
  1,
  'IST',
      ],
      [
  60834420000, #    utc_start 1928-10-07 02:00:00 (Sun)
  60851354400, #      utc_end 1929-04-21 02:00:00 (Sun)
  60834420000, #  local_start 1928-10-07 02:00:00 (Sun)
  60851354400, #    local_end 1929-04-21 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  60851354400, #    utc_start 1929-04-21 02:00:00 (Sun)
  60865869600, #      utc_end 1929-10-06 02:00:00 (Sun)
  60851358000, #  local_start 1929-04-21 03:00:00 (Sun)
  60865873200, #    local_end 1929-10-06 03:00:00 (Sun)
  3600,
  1,
  'IST',
      ],
      [
  60865869600, #    utc_start 1929-10-06 02:00:00 (Sun)
  60882199200, #      utc_end 1930-04-13 02:00:00 (Sun)
  60865869600, #  local_start 1929-10-06 02:00:00 (Sun)
  60882199200, #    local_end 1930-04-13 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  60882199200, #    utc_start 1930-04-13 02:00:00 (Sun)
  60897319200, #      utc_end 1930-10-05 02:00:00 (Sun)
  60882202800, #  local_start 1930-04-13 03:00:00 (Sun)
  60897322800, #    local_end 1930-10-05 03:00:00 (Sun)
  3600,
  1,
  'IST',
      ],
      [
  60897319200, #    utc_start 1930-10-05 02:00:00 (Sun)
  60914253600, #      utc_end 1931-04-19 02:00:00 (Sun)
  60897319200, #  local_start 1930-10-05 02:00:00 (Sun)
  60914253600, #    local_end 1931-04-19 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  60914253600, #    utc_start 1931-04-19 02:00:00 (Sun)
  60928768800, #      utc_end 1931-10-04 02:00:00 (Sun)
  60914257200, #  local_start 1931-04-19 03:00:00 (Sun)
  60928772400, #    local_end 1931-10-04 03:00:00 (Sun)
  3600,
  1,
  'IST',
      ],
      [
  60928768800, #    utc_start 1931-10-04 02:00:00 (Sun)
  60945703200, #      utc_end 1932-04-17 02:00:00 (Sun)
  60928768800, #  local_start 1931-10-04 02:00:00 (Sun)
  60945703200, #    local_end 1932-04-17 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  60945703200, #    utc_start 1932-04-17 02:00:00 (Sun)
  60960218400, #      utc_end 1932-10-02 02:00:00 (Sun)
  60945706800, #  local_start 1932-04-17 03:00:00 (Sun)
  60960222000, #    local_end 1932-10-02 03:00:00 (Sun)
  3600,
  1,
  'IST',
      ],
      [
  60960218400, #    utc_start 1932-10-02 02:00:00 (Sun)
  60976548000, #      utc_end 1933-04-09 02:00:00 (Sun)
  60960218400, #  local_start 1932-10-02 02:00:00 (Sun)
  60976548000, #    local_end 1933-04-09 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  60976548000, #    utc_start 1933-04-09 02:00:00 (Sun)
  60992272800, #      utc_end 1933-10-08 02:00:00 (Sun)
  60976551600, #  local_start 1933-04-09 03:00:00 (Sun)
  60992276400, #    local_end 1933-10-08 03:00:00 (Sun)
  3600,
  1,
  'IST',
      ],
      [
  60992272800, #    utc_start 1933-10-08 02:00:00 (Sun)
  61009207200, #      utc_end 1934-04-22 02:00:00 (Sun)
  60992272800, #  local_start 1933-10-08 02:00:00 (Sun)
  61009207200, #    local_end 1934-04-22 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61009207200, #    utc_start 1934-04-22 02:00:00 (Sun)
  61023722400, #      utc_end 1934-10-07 02:00:00 (Sun)
  61009210800, #  local_start 1934-04-22 03:00:00 (Sun)
  61023726000, #    local_end 1934-10-07 03:00:00 (Sun)
  3600,
  1,
  'IST',
      ],
      [
  61023722400, #    utc_start 1934-10-07 02:00:00 (Sun)
  61040052000, #      utc_end 1935-04-14 02:00:00 (Sun)
  61023722400, #  local_start 1934-10-07 02:00:00 (Sun)
  61040052000, #    local_end 1935-04-14 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61040052000, #    utc_start 1935-04-14 02:00:00 (Sun)
  61055172000, #      utc_end 1935-10-06 02:00:00 (Sun)
  61040055600, #  local_start 1935-04-14 03:00:00 (Sun)
  61055175600, #    local_end 1935-10-06 03:00:00 (Sun)
  3600,
  1,
  'IST',
      ],
      [
  61055172000, #    utc_start 1935-10-06 02:00:00 (Sun)
  61072106400, #      utc_end 1936-04-19 02:00:00 (Sun)
  61055172000, #  local_start 1935-10-06 02:00:00 (Sun)
  61072106400, #    local_end 1936-04-19 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61072106400, #    utc_start 1936-04-19 02:00:00 (Sun)
  61086621600, #      utc_end 1936-10-04 02:00:00 (Sun)
  61072110000, #  local_start 1936-04-19 03:00:00 (Sun)
  61086625200, #    local_end 1936-10-04 03:00:00 (Sun)
  3600,
  1,
  'IST',
      ],
      [
  61086621600, #    utc_start 1936-10-04 02:00:00 (Sun)
  61103556000, #      utc_end 1937-04-18 02:00:00 (Sun)
  61086621600, #  local_start 1936-10-04 02:00:00 (Sun)
  61103556000, #    local_end 1937-04-18 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61103556000, #    utc_start 1937-04-18 02:00:00 (Sun)
  61118071200, #      utc_end 1937-10-03 02:00:00 (Sun)
  61103559600, #  local_start 1937-04-18 03:00:00 (Sun)
  61118074800, #    local_end 1937-10-03 03:00:00 (Sun)
  3600,
  1,
  'IST',
      ],
      [
  61118071200, #    utc_start 1937-10-03 02:00:00 (Sun)
  61134400800, #      utc_end 1938-04-10 02:00:00 (Sun)
  61118071200, #  local_start 1937-10-03 02:00:00 (Sun)
  61134400800, #    local_end 1938-04-10 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61134400800, #    utc_start 1938-04-10 02:00:00 (Sun)
  61149520800, #      utc_end 1938-10-02 02:00:00 (Sun)
  61134404400, #  local_start 1938-04-10 03:00:00 (Sun)
  61149524400, #    local_end 1938-10-02 03:00:00 (Sun)
  3600,
  1,
  'IST',
      ],
      [
  61149520800, #    utc_start 1938-10-02 02:00:00 (Sun)
  61166455200, #      utc_end 1939-04-16 02:00:00 (Sun)
  61149520800, #  local_start 1938-10-02 02:00:00 (Sun)
  61166455200, #    local_end 1939-04-16 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61166455200, #    utc_start 1939-04-16 02:00:00 (Sun)
  61185204000, #      utc_end 1939-11-19 02:00:00 (Sun)
  61166458800, #  local_start 1939-04-16 03:00:00 (Sun)
  61185207600, #    local_end 1939-11-19 03:00:00 (Sun)
  3600,
  1,
  'IST',
      ],
      [
  61185204000, #    utc_start 1939-11-19 02:00:00 (Sun)
  61193671200, #      utc_end 1940-02-25 02:00:00 (Sun)
  61185204000, #  local_start 1939-11-19 02:00:00 (Sun)
  61193671200, #    local_end 1940-02-25 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61193671200, #    utc_start 1940-02-25 02:00:00 (Sun)
  61402327200, #      utc_end 1946-10-06 02:00:00 (Sun)
  61193674800, #  local_start 1940-02-25 03:00:00 (Sun)
  61402330800, #    local_end 1946-10-06 03:00:00 (Sun)
  3600,
  1,
  'IST',
      ],
      [
  61402327200, #    utc_start 1946-10-06 02:00:00 (Sun)
  61416237600, #      utc_end 1947-03-16 02:00:00 (Sun)
  61402327200, #  local_start 1946-10-06 02:00:00 (Sun)
  61416237600, #    local_end 1947-03-16 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61416237600, #    utc_start 1947-03-16 02:00:00 (Sun)
  61436196000, #      utc_end 1947-11-02 02:00:00 (Sun)
  61416241200, #  local_start 1947-03-16 03:00:00 (Sun)
  61436199600, #    local_end 1947-11-02 03:00:00 (Sun)
  3600,
  1,
  'IST',
      ],
      [
  61436196000, #    utc_start 1947-11-02 02:00:00 (Sun)
  61450711200, #      utc_end 1948-04-18 02:00:00 (Sun)
  61436196000, #  local_start 1947-11-02 02:00:00 (Sun)
  61450711200, #    local_end 1948-04-18 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61450711200, #    utc_start 1948-04-18 02:00:00 (Sun)
  61467645600, #      utc_end 1948-10-31 02:00:00 (Sun)
  61450714800, #  local_start 1948-04-18 03:00:00 (Sun)
  61467649200, #    local_end 1948-10-31 03:00:00 (Sun)
  3600,
  1,
  'IST',
      ],
      [
  61467645600, #    utc_start 1948-10-31 02:00:00 (Sun)
  61480951200, #      utc_end 1949-04-03 02:00:00 (Sun)
  61467645600, #  local_start 1948-10-31 02:00:00 (Sun)
  61480951200, #    local_end 1949-04-03 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61480951200, #    utc_start 1949-04-03 02:00:00 (Sun)
  61499095200, #      utc_end 1949-10-30 02:00:00 (Sun)
  61480954800, #  local_start 1949-04-03 03:00:00 (Sun)
  61499098800, #    local_end 1949-10-30 03:00:00 (Sun)
  3600,
  1,
  'IST',
      ],
      [
  61499095200, #    utc_start 1949-10-30 02:00:00 (Sun)
  61513610400, #      utc_end 1950-04-16 02:00:00 (Sun)
  61499095200, #  local_start 1949-10-30 02:00:00 (Sun)
  61513610400, #    local_end 1950-04-16 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61513610400, #    utc_start 1950-04-16 02:00:00 (Sun)
  61529940000, #      utc_end 1950-10-22 02:00:00 (Sun)
  61513614000, #  local_start 1950-04-16 03:00:00 (Sun)
  61529943600, #    local_end 1950-10-22 03:00:00 (Sun)
  3600,
  1,
  'IST',
      ],
      [
  61529940000, #    utc_start 1950-10-22 02:00:00 (Sun)
  61545060000, #      utc_end 1951-04-15 02:00:00 (Sun)
  61529940000, #  local_start 1950-10-22 02:00:00 (Sun)
  61545060000, #    local_end 1951-04-15 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61545060000, #    utc_start 1951-04-15 02:00:00 (Sun)
  61561389600, #      utc_end 1951-10-21 02:00:00 (Sun)
  61545063600, #  local_start 1951-04-15 03:00:00 (Sun)
  61561393200, #    local_end 1951-10-21 03:00:00 (Sun)
  3600,
  1,
  'IST',
      ],
      [
  61561389600, #    utc_start 1951-10-21 02:00:00 (Sun)
  61577114400, #      utc_end 1952-04-20 02:00:00 (Sun)
  61561389600, #  local_start 1951-10-21 02:00:00 (Sun)
  61577114400, #    local_end 1952-04-20 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61577114400, #    utc_start 1952-04-20 02:00:00 (Sun)
  61593444000, #      utc_end 1952-10-26 02:00:00 (Sun)
  61577118000, #  local_start 1952-04-20 03:00:00 (Sun)
  61593447600, #    local_end 1952-10-26 03:00:00 (Sun)
  3600,
  1,
  'IST',
      ],
      [
  61593444000, #    utc_start 1952-10-26 02:00:00 (Sun)
  61608564000, #      utc_end 1953-04-19 02:00:00 (Sun)
  61593444000, #  local_start 1952-10-26 02:00:00 (Sun)
  61608564000, #    local_end 1953-04-19 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61608564000, #    utc_start 1953-04-19 02:00:00 (Sun)
  61623079200, #      utc_end 1953-10-04 02:00:00 (Sun)
  61608567600, #  local_start 1953-04-19 03:00:00 (Sun)
  61623082800, #    local_end 1953-10-04 03:00:00 (Sun)
  3600,
  1,
  'IST',
      ],
      [
  61623079200, #    utc_start 1953-10-04 02:00:00 (Sun)
  61639408800, #      utc_end 1954-04-11 02:00:00 (Sun)
  61623079200, #  local_start 1953-10-04 02:00:00 (Sun)
  61639408800, #    local_end 1954-04-11 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61639408800, #    utc_start 1954-04-11 02:00:00 (Sun)
  61654528800, #      utc_end 1954-10-03 02:00:00 (Sun)
  61639412400, #  local_start 1954-04-11 03:00:00 (Sun)
  61654532400, #    local_end 1954-10-03 03:00:00 (Sun)
  3600,
  1,
  'IST',
      ],
      [
  61654528800, #    utc_start 1954-10-03 02:00:00 (Sun)
  61671463200, #      utc_end 1955-04-17 02:00:00 (Sun)
  61654528800, #  local_start 1954-10-03 02:00:00 (Sun)
  61671463200, #    local_end 1955-04-17 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61671463200, #    utc_start 1955-04-17 02:00:00 (Sun)
  61685978400, #      utc_end 1955-10-02 02:00:00 (Sun)
  61671466800, #  local_start 1955-04-17 03:00:00 (Sun)
  61685982000, #    local_end 1955-10-02 03:00:00 (Sun)
  3600,
  1,
  'IST',
      ],
      [
  61685978400, #    utc_start 1955-10-02 02:00:00 (Sun)
  61703517600, #      utc_end 1956-04-22 02:00:00 (Sun)
  61685978400, #  local_start 1955-10-02 02:00:00 (Sun)
  61703517600, #    local_end 1956-04-22 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61703517600, #    utc_start 1956-04-22 02:00:00 (Sun)
  61718032800, #      utc_end 1956-10-07 02:00:00 (Sun)
  61703521200, #  local_start 1956-04-22 03:00:00 (Sun)
  61718036400, #    local_end 1956-10-07 03:00:00 (Sun)
  3600,
  1,
  'IST',
      ],
      [
  61718032800, #    utc_start 1956-10-07 02:00:00 (Sun)
  61734362400, #      utc_end 1957-04-14 02:00:00 (Sun)
  61718032800, #  local_start 1956-10-07 02:00:00 (Sun)
  61734362400, #    local_end 1957-04-14 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61734362400, #    utc_start 1957-04-14 02:00:00 (Sun)
  61749482400, #      utc_end 1957-10-06 02:00:00 (Sun)
  61734366000, #  local_start 1957-04-14 03:00:00 (Sun)
  61749486000, #    local_end 1957-10-06 03:00:00 (Sun)
  3600,
  1,
  'IST',
      ],
      [
  61749482400, #    utc_start 1957-10-06 02:00:00 (Sun)
  61766416800, #      utc_end 1958-04-20 02:00:00 (Sun)
  61749482400, #  local_start 1957-10-06 02:00:00 (Sun)
  61766416800, #    local_end 1958-04-20 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61766416800, #    utc_start 1958-04-20 02:00:00 (Sun)
  61780932000, #      utc_end 1958-10-05 02:00:00 (Sun)
  61766420400, #  local_start 1958-04-20 03:00:00 (Sun)
  61780935600, #    local_end 1958-10-05 03:00:00 (Sun)
  3600,
  1,
  'IST',
      ],
      [
  61780932000, #    utc_start 1958-10-05 02:00:00 (Sun)
  61797866400, #      utc_end 1959-04-19 02:00:00 (Sun)
  61780932000, #  local_start 1958-10-05 02:00:00 (Sun)
  61797866400, #    local_end 1959-04-19 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61797866400, #    utc_start 1959-04-19 02:00:00 (Sun)
  61812381600, #      utc_end 1959-10-04 02:00:00 (Sun)
  61797870000, #  local_start 1959-04-19 03:00:00 (Sun)
  61812385200, #    local_end 1959-10-04 03:00:00 (Sun)
  3600,
  1,
  'IST',
      ],
      [
  61812381600, #    utc_start 1959-10-04 02:00:00 (Sun)
  61828711200, #      utc_end 1960-04-10 02:00:00 (Sun)
  61812381600, #  local_start 1959-10-04 02:00:00 (Sun)
  61828711200, #    local_end 1960-04-10 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61828711200, #    utc_start 1960-04-10 02:00:00 (Sun)
  61843831200, #      utc_end 1960-10-02 02:00:00 (Sun)
  61828714800, #  local_start 1960-04-10 03:00:00 (Sun)
  61843834800, #    local_end 1960-10-02 03:00:00 (Sun)
  3600,
  1,
  'IST',
      ],
      [
  61843831200, #    utc_start 1960-10-02 02:00:00 (Sun)
  61858951200, #      utc_end 1961-03-26 02:00:00 (Sun)
  61843831200, #  local_start 1960-10-02 02:00:00 (Sun)
  61858951200, #    local_end 1961-03-26 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61858951200, #    utc_start 1961-03-26 02:00:00 (Sun)
  61877700000, #      utc_end 1961-10-29 02:00:00 (Sun)
  61858954800, #  local_start 1961-03-26 03:00:00 (Sun)
  61877703600, #    local_end 1961-10-29 03:00:00 (Sun)
  3600,
  1,
  'IST',
      ],
      [
  61877700000, #    utc_start 1961-10-29 02:00:00 (Sun)
  61890400800, #      utc_end 1962-03-25 02:00:00 (Sun)
  61877700000, #  local_start 1961-10-29 02:00:00 (Sun)
  61890400800, #    local_end 1962-03-25 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61890400800, #    utc_start 1962-03-25 02:00:00 (Sun)
  61909149600, #      utc_end 1962-10-28 02:00:00 (Sun)
  61890404400, #  local_start 1962-03-25 03:00:00 (Sun)
  61909153200, #    local_end 1962-10-28 03:00:00 (Sun)
  3600,
  1,
  'IST',
      ],
      [
  61909149600, #    utc_start 1962-10-28 02:00:00 (Sun)
  61922455200, #      utc_end 1963-03-31 02:00:00 (Sun)
  61909149600, #  local_start 1962-10-28 02:00:00 (Sun)
  61922455200, #    local_end 1963-03-31 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61922455200, #    utc_start 1963-03-31 02:00:00 (Sun)
  61940599200, #      utc_end 1963-10-27 02:00:00 (Sun)
  61922458800, #  local_start 1963-03-31 03:00:00 (Sun)
  61940602800, #    local_end 1963-10-27 03:00:00 (Sun)
  3600,
  1,
  'IST',
      ],
      [
  61940599200, #    utc_start 1963-10-27 02:00:00 (Sun)
  61953300000, #      utc_end 1964-03-22 02:00:00 (Sun)
  61940599200, #  local_start 1963-10-27 02:00:00 (Sun)
  61953300000, #    local_end 1964-03-22 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61953300000, #    utc_start 1964-03-22 02:00:00 (Sun)
  61972048800, #      utc_end 1964-10-25 02:00:00 (Sun)
  61953303600, #  local_start 1964-03-22 03:00:00 (Sun)
  61972052400, #    local_end 1964-10-25 03:00:00 (Sun)
  3600,
  1,
  'IST',
      ],
      [
  61972048800, #    utc_start 1964-10-25 02:00:00 (Sun)
  61984749600, #      utc_end 1965-03-21 02:00:00 (Sun)
  61972048800, #  local_start 1964-10-25 02:00:00 (Sun)
  61984749600, #    local_end 1965-03-21 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61984749600, #    utc_start 1965-03-21 02:00:00 (Sun)
  62003498400, #      utc_end 1965-10-24 02:00:00 (Sun)
  61984753200, #  local_start 1965-03-21 03:00:00 (Sun)
  62003502000, #    local_end 1965-10-24 03:00:00 (Sun)
  3600,
  1,
  'IST',
      ],
      [
  62003498400, #    utc_start 1965-10-24 02:00:00 (Sun)
  62016199200, #      utc_end 1966-03-20 02:00:00 (Sun)
  62003498400, #  local_start 1965-10-24 02:00:00 (Sun)
  62016199200, #    local_end 1966-03-20 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  62016199200, #    utc_start 1966-03-20 02:00:00 (Sun)
  62034948000, #      utc_end 1966-10-23 02:00:00 (Sun)
  62016202800, #  local_start 1966-03-20 03:00:00 (Sun)
  62034951600, #    local_end 1966-10-23 03:00:00 (Sun)
  3600,
  1,
  'IST',
      ],
      [
  62034948000, #    utc_start 1966-10-23 02:00:00 (Sun)
  62047648800, #      utc_end 1967-03-19 02:00:00 (Sun)
  62034948000, #  local_start 1966-10-23 02:00:00 (Sun)
  62047648800, #    local_end 1967-03-19 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  62047648800, #    utc_start 1967-03-19 02:00:00 (Sun)
  62067002400, #      utc_end 1967-10-29 02:00:00 (Sun)
  62047652400, #  local_start 1967-03-19 03:00:00 (Sun)
  62067006000, #    local_end 1967-10-29 03:00:00 (Sun)
  3600,
  1,
  'IST',
      ],
      [
  62067002400, #    utc_start 1967-10-29 02:00:00 (Sun)
  62076679200, #      utc_end 1968-02-18 02:00:00 (Sun)
  62067002400, #  local_start 1967-10-29 02:00:00 (Sun)
  62076679200, #    local_end 1968-02-18 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  62076679200, #    utc_start 1968-02-18 02:00:00 (Sun)
  62098441200, #      utc_end 1968-10-26 23:00:00 (Sat)
  62076682800, #  local_start 1968-02-18 03:00:00 (Sun)
  62098444800, #    local_end 1968-10-27 00:00:00 (Sun)
  3600,
  1,
  'IST',
      ],
      [
  62098441200, #    utc_start 1968-10-26 23:00:00 (Sat)
  62193405600, #      utc_end 1971-10-31 02:00:00 (Sun)
  62098444800, #  local_start 1968-10-27 00:00:00 (Sun)
  62193409200, #    local_end 1971-10-31 03:00:00 (Sun)
  3600,
  0,
  'IST',
      ],
      [
  62193405600, #    utc_start 1971-10-31 02:00:00 (Sun)
  62205501600, #      utc_end 1972-03-19 02:00:00 (Sun)
  62193405600, #  local_start 1971-10-31 02:00:00 (Sun)
  62205501600, #    local_end 1972-03-19 02:00:00 (Sun)
  0,
  1,
  'GMT',
      ],
      [
  62205501600, #    utc_start 1972-03-19 02:00:00 (Sun)
  62224855200, #      utc_end 1972-10-29 02:00:00 (Sun)
  62205505200, #  local_start 1972-03-19 03:00:00 (Sun)
  62224858800, #    local_end 1972-10-29 03:00:00 (Sun)
  3600,
  0,
  'IST',
      ],
      [
  62224855200, #    utc_start 1972-10-29 02:00:00 (Sun)
  62236951200, #      utc_end 1973-03-18 02:00:00 (Sun)
  62224855200, #  local_start 1972-10-29 02:00:00 (Sun)
  62236951200, #    local_end 1973-03-18 02:00:00 (Sun)
  0,
  1,
  'GMT',
      ],
      [
  62236951200, #    utc_start 1973-03-18 02:00:00 (Sun)
  62256304800, #      utc_end 1973-10-28 02:00:00 (Sun)
  62236954800, #  local_start 1973-03-18 03:00:00 (Sun)
  62256308400, #    local_end 1973-10-28 03:00:00 (Sun)
  3600,
  0,
  'IST',
      ],
      [
  62256304800, #    utc_start 1973-10-28 02:00:00 (Sun)
  62268400800, #      utc_end 1974-03-17 02:00:00 (Sun)
  62256304800, #  local_start 1973-10-28 02:00:00 (Sun)
  62268400800, #    local_end 1974-03-17 02:00:00 (Sun)
  0,
  1,
  'GMT',
      ],
      [
  62268400800, #    utc_start 1974-03-17 02:00:00 (Sun)
  62287754400, #      utc_end 1974-10-27 02:00:00 (Sun)
  62268404400, #  local_start 1974-03-17 03:00:00 (Sun)
  62287758000, #    local_end 1974-10-27 03:00:00 (Sun)
  3600,
  0,
  'IST',
      ],
      [
  62287754400, #    utc_start 1974-10-27 02:00:00 (Sun)
  62299850400, #      utc_end 1975-03-16 02:00:00 (Sun)
  62287754400, #  local_start 1974-10-27 02:00:00 (Sun)
  62299850400, #    local_end 1975-03-16 02:00:00 (Sun)
  0,
  1,
  'GMT',
      ],
      [
  62299850400, #    utc_start 1975-03-16 02:00:00 (Sun)
  62319204000, #      utc_end 1975-10-26 02:00:00 (Sun)
  62299854000, #  local_start 1975-03-16 03:00:00 (Sun)
  62319207600, #    local_end 1975-10-26 03:00:00 (Sun)
  3600,
  0,
  'IST',
      ],
      [
  62319204000, #    utc_start 1975-10-26 02:00:00 (Sun)
  62331904800, #      utc_end 1976-03-21 02:00:00 (Sun)
  62319204000, #  local_start 1975-10-26 02:00:00 (Sun)
  62331904800, #    local_end 1976-03-21 02:00:00 (Sun)
  0,
  1,
  'GMT',
      ],
      [
  62331904800, #    utc_start 1976-03-21 02:00:00 (Sun)
  62350653600, #      utc_end 1976-10-24 02:00:00 (Sun)
  62331908400, #  local_start 1976-03-21 03:00:00 (Sun)
  62350657200, #    local_end 1976-10-24 03:00:00 (Sun)
  3600,
  0,
  'IST',
      ],
      [
  62350653600, #    utc_start 1976-10-24 02:00:00 (Sun)
  62363354400, #      utc_end 1977-03-20 02:00:00 (Sun)
  62350653600, #  local_start 1976-10-24 02:00:00 (Sun)
  62363354400, #    local_end 1977-03-20 02:00:00 (Sun)
  0,
  1,
  'GMT',
      ],
      [
  62363354400, #    utc_start 1977-03-20 02:00:00 (Sun)
  62382103200, #      utc_end 1977-10-23 02:00:00 (Sun)
  62363358000, #  local_start 1977-03-20 03:00:00 (Sun)
  62382106800, #    local_end 1977-10-23 03:00:00 (Sun)
  3600,
  0,
  'IST',
      ],
      [
  62382103200, #    utc_start 1977-10-23 02:00:00 (Sun)
  62394804000, #      utc_end 1978-03-19 02:00:00 (Sun)
  62382103200, #  local_start 1977-10-23 02:00:00 (Sun)
  62394804000, #    local_end 1978-03-19 02:00:00 (Sun)
  0,
  1,
  'GMT',
      ],
      [
  62394804000, #    utc_start 1978-03-19 02:00:00 (Sun)
  62414157600, #      utc_end 1978-10-29 02:00:00 (Sun)
  62394807600, #  local_start 1978-03-19 03:00:00 (Sun)
  62414161200, #    local_end 1978-10-29 03:00:00 (Sun)
  3600,
  0,
  'IST',
      ],
      [
  62414157600, #    utc_start 1978-10-29 02:00:00 (Sun)
  62426253600, #      utc_end 1979-03-18 02:00:00 (Sun)
  62414157600, #  local_start 1978-10-29 02:00:00 (Sun)
  62426253600, #    local_end 1979-03-18 02:00:00 (Sun)
  0,
  1,
  'GMT',
      ],
      [
  62426253600, #    utc_start 1979-03-18 02:00:00 (Sun)
  62445607200, #      utc_end 1979-10-28 02:00:00 (Sun)
  62426257200, #  local_start 1979-03-18 03:00:00 (Sun)
  62445610800, #    local_end 1979-10-28 03:00:00 (Sun)
  3600,
  0,
  'IST',
      ],
      [
  62445607200, #    utc_start 1979-10-28 02:00:00 (Sun)
  62457703200, #      utc_end 1980-03-16 02:00:00 (Sun)
  62445607200, #  local_start 1979-10-28 02:00:00 (Sun)
  62457703200, #    local_end 1980-03-16 02:00:00 (Sun)
  0,
  1,
  'GMT',
      ],
      [
  62457703200, #    utc_start 1980-03-16 02:00:00 (Sun)
  62477056800, #      utc_end 1980-10-26 02:00:00 (Sun)
  62457706800, #  local_start 1980-03-16 03:00:00 (Sun)
  62477060400, #    local_end 1980-10-26 03:00:00 (Sun)
  3600,
  0,
  'IST',
      ],
      [
  62477056800, #    utc_start 1980-10-26 02:00:00 (Sun)
  62490358800, #      utc_end 1981-03-29 01:00:00 (Sun)
  62477056800, #  local_start 1980-10-26 02:00:00 (Sun)
  62490358800, #    local_end 1981-03-29 01:00:00 (Sun)
  0,
  1,
  'GMT',
      ],
      [
  62490358800, #    utc_start 1981-03-29 01:00:00 (Sun)
  62508502800, #      utc_end 1981-10-25 01:00:00 (Sun)
  62490362400, #  local_start 1981-03-29 02:00:00 (Sun)
  62508506400, #    local_end 1981-10-25 02:00:00 (Sun)
  3600,
  0,
  'IST',
      ],
      [
  62508502800, #    utc_start 1981-10-25 01:00:00 (Sun)
  62521808400, #      utc_end 1982-03-28 01:00:00 (Sun)
  62508502800, #  local_start 1981-10-25 01:00:00 (Sun)
  62521808400, #    local_end 1982-03-28 01:00:00 (Sun)
  0,
  1,
  'GMT',
      ],
      [
  62521808400, #    utc_start 1982-03-28 01:00:00 (Sun)
  62539952400, #      utc_end 1982-10-24 01:00:00 (Sun)
  62521812000, #  local_start 1982-03-28 02:00:00 (Sun)
  62539956000, #    local_end 1982-10-24 02:00:00 (Sun)
  3600,
  0,
  'IST',
      ],
      [
  62539952400, #    utc_start 1982-10-24 01:00:00 (Sun)
  62553258000, #      utc_end 1983-03-27 01:00:00 (Sun)
  62539952400, #  local_start 1982-10-24 01:00:00 (Sun)
  62553258000, #    local_end 1983-03-27 01:00:00 (Sun)
  0,
  1,
  'GMT',
      ],
      [
  62553258000, #    utc_start 1983-03-27 01:00:00 (Sun)
  62571402000, #      utc_end 1983-10-23 01:00:00 (Sun)
  62553261600, #  local_start 1983-03-27 02:00:00 (Sun)
  62571405600, #    local_end 1983-10-23 02:00:00 (Sun)
  3600,
  0,
  'IST',
      ],
      [
  62571402000, #    utc_start 1983-10-23 01:00:00 (Sun)
  62584707600, #      utc_end 1984-03-25 01:00:00 (Sun)
  62571402000, #  local_start 1983-10-23 01:00:00 (Sun)
  62584707600, #    local_end 1984-03-25 01:00:00 (Sun)
  0,
  1,
  'GMT',
      ],
      [
  62584707600, #    utc_start 1984-03-25 01:00:00 (Sun)
  62603456400, #      utc_end 1984-10-28 01:00:00 (Sun)
  62584711200, #  local_start 1984-03-25 02:00:00 (Sun)
  62603460000, #    local_end 1984-10-28 02:00:00 (Sun)
  3600,
  0,
  'IST',
      ],
      [
  62603456400, #    utc_start 1984-10-28 01:00:00 (Sun)
  62616762000, #      utc_end 1985-03-31 01:00:00 (Sun)
  62603456400, #  local_start 1984-10-28 01:00:00 (Sun)
  62616762000, #    local_end 1985-03-31 01:00:00 (Sun)
  0,
  1,
  'GMT',
      ],
      [
  62616762000, #    utc_start 1985-03-31 01:00:00 (Sun)
  62634906000, #      utc_end 1985-10-27 01:00:00 (Sun)
  62616765600, #  local_start 1985-03-31 02:00:00 (Sun)
  62634909600, #    local_end 1985-10-27 02:00:00 (Sun)
  3600,
  0,
  'IST',
      ],
      [
  62634906000, #    utc_start 1985-10-27 01:00:00 (Sun)
  62648211600, #      utc_end 1986-03-30 01:00:00 (Sun)
  62634906000, #  local_start 1985-10-27 01:00:00 (Sun)
  62648211600, #    local_end 1986-03-30 01:00:00 (Sun)
  0,
  1,
  'GMT',
      ],
      [
  62648211600, #    utc_start 1986-03-30 01:00:00 (Sun)
  62666355600, #      utc_end 1986-10-26 01:00:00 (Sun)
  62648215200, #  local_start 1986-03-30 02:00:00 (Sun)
  62666359200, #    local_end 1986-10-26 02:00:00 (Sun)
  3600,
  0,
  'IST',
      ],
      [
  62666355600, #    utc_start 1986-10-26 01:00:00 (Sun)
  62679661200, #      utc_end 1987-03-29 01:00:00 (Sun)
  62666355600, #  local_start 1986-10-26 01:00:00 (Sun)
  62679661200, #    local_end 1987-03-29 01:00:00 (Sun)
  0,
  1,
  'GMT',
      ],
      [
  62679661200, #    utc_start 1987-03-29 01:00:00 (Sun)
  62697805200, #      utc_end 1987-10-25 01:00:00 (Sun)
  62679664800, #  local_start 1987-03-29 02:00:00 (Sun)
  62697808800, #    local_end 1987-10-25 02:00:00 (Sun)
  3600,
  0,
  'IST',
      ],
      [
  62697805200, #    utc_start 1987-10-25 01:00:00 (Sun)
  62711110800, #      utc_end 1988-03-27 01:00:00 (Sun)
  62697805200, #  local_start 1987-10-25 01:00:00 (Sun)
  62711110800, #    local_end 1988-03-27 01:00:00 (Sun)
  0,
  1,
  'GMT',
      ],
      [
  62711110800, #    utc_start 1988-03-27 01:00:00 (Sun)
  62729254800, #      utc_end 1988-10-23 01:00:00 (Sun)
  62711114400, #  local_start 1988-03-27 02:00:00 (Sun)
  62729258400, #    local_end 1988-10-23 02:00:00 (Sun)
  3600,
  0,
  'IST',
      ],
      [
  62729254800, #    utc_start 1988-10-23 01:00:00 (Sun)
  62742560400, #      utc_end 1989-03-26 01:00:00 (Sun)
  62729254800, #  local_start 1988-10-23 01:00:00 (Sun)
  62742560400, #    local_end 1989-03-26 01:00:00 (Sun)
  0,
  1,
  'GMT',
      ],
      [
  62742560400, #    utc_start 1989-03-26 01:00:00 (Sun)
  62761309200, #      utc_end 1989-10-29 01:00:00 (Sun)
  62742564000, #  local_start 1989-03-26 02:00:00 (Sun)
  62761312800, #    local_end 1989-10-29 02:00:00 (Sun)
  3600,
  0,
  'IST',
      ],
      [
  62761309200, #    utc_start 1989-10-29 01:00:00 (Sun)
  62774010000, #      utc_end 1990-03-25 01:00:00 (Sun)
  62761309200, #  local_start 1989-10-29 01:00:00 (Sun)
  62774010000, #    local_end 1990-03-25 01:00:00 (Sun)
  0,
  1,
  'GMT',
      ],
      [
  62774010000, #    utc_start 1990-03-25 01:00:00 (Sun)
  62792758800, #      utc_end 1990-10-28 01:00:00 (Sun)
  62774013600, #  local_start 1990-03-25 02:00:00 (Sun)
  62792762400, #    local_end 1990-10-28 02:00:00 (Sun)
  3600,
  0,
  'IST',
      ],
      [
  62792758800, #    utc_start 1990-10-28 01:00:00 (Sun)
  62806064400, #      utc_end 1991-03-31 01:00:00 (Sun)
  62792758800, #  local_start 1990-10-28 01:00:00 (Sun)
  62806064400, #    local_end 1991-03-31 01:00:00 (Sun)
  0,
  1,
  'GMT',
      ],
      [
  62806064400, #    utc_start 1991-03-31 01:00:00 (Sun)
  62824208400, #      utc_end 1991-10-27 01:00:00 (Sun)
  62806068000, #  local_start 1991-03-31 02:00:00 (Sun)
  62824212000, #    local_end 1991-10-27 02:00:00 (Sun)
  3600,
  0,
  'IST',
      ],
      [
  62824208400, #    utc_start 1991-10-27 01:00:00 (Sun)
  62837514000, #      utc_end 1992-03-29 01:00:00 (Sun)
  62824208400, #  local_start 1991-10-27 01:00:00 (Sun)
  62837514000, #    local_end 1992-03-29 01:00:00 (Sun)
  0,
  1,
  'GMT',
      ],
      [
  62837514000, #    utc_start 1992-03-29 01:00:00 (Sun)
  62855658000, #      utc_end 1992-10-25 01:00:00 (Sun)
  62837517600, #  local_start 1992-03-29 02:00:00 (Sun)
  62855661600, #    local_end 1992-10-25 02:00:00 (Sun)
  3600,
  0,
  'IST',
      ],
      [
  62855658000, #    utc_start 1992-10-25 01:00:00 (Sun)
  62868963600, #      utc_end 1993-03-28 01:00:00 (Sun)
  62855658000, #  local_start 1992-10-25 01:00:00 (Sun)
  62868963600, #    local_end 1993-03-28 01:00:00 (Sun)
  0,
  1,
  'GMT',
      ],
      [
  62868963600, #    utc_start 1993-03-28 01:00:00 (Sun)
  62887107600, #      utc_end 1993-10-24 01:00:00 (Sun)
  62868967200, #  local_start 1993-03-28 02:00:00 (Sun)
  62887111200, #    local_end 1993-10-24 02:00:00 (Sun)
  3600,
  0,
  'IST',
      ],
      [
  62887107600, #    utc_start 1993-10-24 01:00:00 (Sun)
  62900413200, #      utc_end 1994-03-27 01:00:00 (Sun)
  62887107600, #  local_start 1993-10-24 01:00:00 (Sun)
  62900413200, #    local_end 1994-03-27 01:00:00 (Sun)
  0,
  1,
  'GMT',
      ],
      [
  62900413200, #    utc_start 1994-03-27 01:00:00 (Sun)
  62918557200, #      utc_end 1994-10-23 01:00:00 (Sun)
  62900416800, #  local_start 1994-03-27 02:00:00 (Sun)
  62918560800, #    local_end 1994-10-23 02:00:00 (Sun)
  3600,
  0,
  'IST',
      ],
      [
  62918557200, #    utc_start 1994-10-23 01:00:00 (Sun)
  62931862800, #      utc_end 1995-03-26 01:00:00 (Sun)
  62918557200, #  local_start 1994-10-23 01:00:00 (Sun)
  62931862800, #    local_end 1995-03-26 01:00:00 (Sun)
  0,
  1,
  'GMT',
      ],
      [
  62931862800, #    utc_start 1995-03-26 01:00:00 (Sun)
  62950006800, #      utc_end 1995-10-22 01:00:00 (Sun)
  62931866400, #  local_start 1995-03-26 02:00:00 (Sun)
  62950010400, #    local_end 1995-10-22 02:00:00 (Sun)
  3600,
  0,
  'IST',
      ],
      [
  62950006800, #    utc_start 1995-10-22 01:00:00 (Sun)
  62963917200, #      utc_end 1996-03-31 01:00:00 (Sun)
  62950006800, #  local_start 1995-10-22 01:00:00 (Sun)
  62963917200, #    local_end 1996-03-31 01:00:00 (Sun)
  0,
  1,
  'GMT',
      ],
      [
  62963917200, #    utc_start 1996-03-31 01:00:00 (Sun)
  62982061200, #      utc_end 1996-10-27 01:00:00 (Sun)
  62963920800, #  local_start 1996-03-31 02:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  3600,
  0,
  'IST',
      ],
      [
  62982061200, #    utc_start 1996-10-27 01:00:00 (Sun)
  62995366800, #      utc_end 1997-03-30 01:00:00 (Sun)
  62982061200, #  local_start 1996-10-27 01:00:00 (Sun)
  62995366800, #    local_end 1997-03-30 01:00:00 (Sun)
  0,
  1,
  'GMT',
      ],
      [
  62995366800, #    utc_start 1997-03-30 01:00:00 (Sun)
  63013510800, #      utc_end 1997-10-26 01:00:00 (Sun)
  62995370400, #  local_start 1997-03-30 02:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  3600,
  0,
  'IST',
      ],
      [
  63013510800, #    utc_start 1997-10-26 01:00:00 (Sun)
  63026816400, #      utc_end 1998-03-29 01:00:00 (Sun)
  63013510800, #  local_start 1997-10-26 01:00:00 (Sun)
  63026816400, #    local_end 1998-03-29 01:00:00 (Sun)
  0,
  1,
  'GMT',
      ],
      [
  63026816400, #    utc_start 1998-03-29 01:00:00 (Sun)
  63044960400, #      utc_end 1998-10-25 01:00:00 (Sun)
  63026820000, #  local_start 1998-03-29 02:00:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  3600,
  0,
  'IST',
      ],
      [
  63044960400, #    utc_start 1998-10-25 01:00:00 (Sun)
  63058266000, #      utc_end 1999-03-28 01:00:00 (Sun)
  63044960400, #  local_start 1998-10-25 01:00:00 (Sun)
  63058266000, #    local_end 1999-03-28 01:00:00 (Sun)
  0,
  1,
  'GMT',
      ],
      [
  63058266000, #    utc_start 1999-03-28 01:00:00 (Sun)
  63077014800, #      utc_end 1999-10-31 01:00:00 (Sun)
  63058269600, #  local_start 1999-03-28 02:00:00 (Sun)
  63077018400, #    local_end 1999-10-31 02:00:00 (Sun)
  3600,
  0,
  'IST',
      ],
      [
  63077014800, #    utc_start 1999-10-31 01:00:00 (Sun)
  63089715600, #      utc_end 2000-03-26 01:00:00 (Sun)
  63077014800, #  local_start 1999-10-31 01:00:00 (Sun)
  63089715600, #    local_end 2000-03-26 01:00:00 (Sun)
  0,
  1,
  'GMT',
      ],
      [
  63089715600, #    utc_start 2000-03-26 01:00:00 (Sun)
  63108464400, #      utc_end 2000-10-29 01:00:00 (Sun)
  63089719200, #  local_start 2000-03-26 02:00:00 (Sun)
  63108468000, #    local_end 2000-10-29 02:00:00 (Sun)
  3600,
  0,
  'IST',
      ],
      [
  63108464400, #    utc_start 2000-10-29 01:00:00 (Sun)
  63121165200, #      utc_end 2001-03-25 01:00:00 (Sun)
  63108464400, #  local_start 2000-10-29 01:00:00 (Sun)
  63121165200, #    local_end 2001-03-25 01:00:00 (Sun)
  0,
  1,
  'GMT',
      ],
      [
  63121165200, #    utc_start 2001-03-25 01:00:00 (Sun)
  63139914000, #      utc_end 2001-10-28 01:00:00 (Sun)
  63121168800, #  local_start 2001-03-25 02:00:00 (Sun)
  63139917600, #    local_end 2001-10-28 02:00:00 (Sun)
  3600,
  0,
  'IST',
      ],
      [
  63139914000, #    utc_start 2001-10-28 01:00:00 (Sun)
  63153219600, #      utc_end 2002-03-31 01:00:00 (Sun)
  63139914000, #  local_start 2001-10-28 01:00:00 (Sun)
  63153219600, #    local_end 2002-03-31 01:00:00 (Sun)
  0,
  1,
  'GMT',
      ],
      [
  63153219600, #    utc_start 2002-03-31 01:00:00 (Sun)
  63171363600, #      utc_end 2002-10-27 01:00:00 (Sun)
  63153223200, #  local_start 2002-03-31 02:00:00 (Sun)
  63171367200, #    local_end 2002-10-27 02:00:00 (Sun)
  3600,
  0,
  'IST',
      ],
      [
  63171363600, #    utc_start 2002-10-27 01:00:00 (Sun)
  63184669200, #      utc_end 2003-03-30 01:00:00 (Sun)
  63171363600, #  local_start 2002-10-27 01:00:00 (Sun)
  63184669200, #    local_end 2003-03-30 01:00:00 (Sun)
  0,
  1,
  'GMT',
      ],
      [
  63184669200, #    utc_start 2003-03-30 01:00:00 (Sun)
  63202813200, #      utc_end 2003-10-26 01:00:00 (Sun)
  63184672800, #  local_start 2003-03-30 02:00:00 (Sun)
  63202816800, #    local_end 2003-10-26 02:00:00 (Sun)
  3600,
  0,
  'IST',
      ],
      [
  63202813200, #    utc_start 2003-10-26 01:00:00 (Sun)
  63216118800, #      utc_end 2004-03-28 01:00:00 (Sun)
  63202813200, #  local_start 2003-10-26 01:00:00 (Sun)
  63216118800, #    local_end 2004-03-28 01:00:00 (Sun)
  0,
  1,
  'GMT',
      ],
      [
  63216118800, #    utc_start 2004-03-28 01:00:00 (Sun)
  63234867600, #      utc_end 2004-10-31 01:00:00 (Sun)
  63216122400, #  local_start 2004-03-28 02:00:00 (Sun)
  63234871200, #    local_end 2004-10-31 02:00:00 (Sun)
  3600,
  0,
  'IST',
      ],
      [
  63234867600, #    utc_start 2004-10-31 01:00:00 (Sun)
  63247568400, #      utc_end 2005-03-27 01:00:00 (Sun)
  63234867600, #  local_start 2004-10-31 01:00:00 (Sun)
  63247568400, #    local_end 2005-03-27 01:00:00 (Sun)
  0,
  1,
  'GMT',
      ],
      [
  63247568400, #    utc_start 2005-03-27 01:00:00 (Sun)
  63266317200, #      utc_end 2005-10-30 01:00:00 (Sun)
  63247572000, #  local_start 2005-03-27 02:00:00 (Sun)
  63266320800, #    local_end 2005-10-30 02:00:00 (Sun)
  3600,
  0,
  'IST',
      ],
      [
  63266317200, #    utc_start 2005-10-30 01:00:00 (Sun)
  63279018000, #      utc_end 2006-03-26 01:00:00 (Sun)
  63266317200, #  local_start 2005-10-30 01:00:00 (Sun)
  63279018000, #    local_end 2006-03-26 01:00:00 (Sun)
  0,
  1,
  'GMT',
      ],
      [
  63279018000, #    utc_start 2006-03-26 01:00:00 (Sun)
  63297766800, #      utc_end 2006-10-29 01:00:00 (Sun)
  63279021600, #  local_start 2006-03-26 02:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  3600,
  0,
  'IST',
      ],
      [
  63297766800, #    utc_start 2006-10-29 01:00:00 (Sun)
  63310467600, #      utc_end 2007-03-25 01:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63310467600, #    local_end 2007-03-25 01:00:00 (Sun)
  0,
  1,
  'GMT',
      ],
      [
  63310467600, #    utc_start 2007-03-25 01:00:00 (Sun)
  63329216400, #      utc_end 2007-10-28 01:00:00 (Sun)
  63310471200, #  local_start 2007-03-25 02:00:00 (Sun)
  63329220000, #    local_end 2007-10-28 02:00:00 (Sun)
  3600,
  0,
  'IST',
      ],
      [
  63329216400, #    utc_start 2007-10-28 01:00:00 (Sun)
  63342522000, #      utc_end 2008-03-30 01:00:00 (Sun)
  63329216400, #  local_start 2007-10-28 01:00:00 (Sun)
  63342522000, #    local_end 2008-03-30 01:00:00 (Sun)
  0,
  1,
  'GMT',
      ],
      [
  63342522000, #    utc_start 2008-03-30 01:00:00 (Sun)
  63360666000, #      utc_end 2008-10-26 01:00:00 (Sun)
  63342525600, #  local_start 2008-03-30 02:00:00 (Sun)
  63360669600, #    local_end 2008-10-26 02:00:00 (Sun)
  3600,
  0,
  'IST',
      ],
      [
  63360666000, #    utc_start 2008-10-26 01:00:00 (Sun)
  63373971600, #      utc_end 2009-03-29 01:00:00 (Sun)
  63360666000, #  local_start 2008-10-26 01:00:00 (Sun)
  63373971600, #    local_end 2009-03-29 01:00:00 (Sun)
  0,
  1,
  'GMT',
      ],
      [
  63373971600, #    utc_start 2009-03-29 01:00:00 (Sun)
  63392115600, #      utc_end 2009-10-25 01:00:00 (Sun)
  63373975200, #  local_start 2009-03-29 02:00:00 (Sun)
  63392119200, #    local_end 2009-10-25 02:00:00 (Sun)
  3600,
  0,
  'IST',
      ],
      [
  63392115600, #    utc_start 2009-10-25 01:00:00 (Sun)
  63405421200, #      utc_end 2010-03-28 01:00:00 (Sun)
  63392115600, #  local_start 2009-10-25 01:00:00 (Sun)
  63405421200, #    local_end 2010-03-28 01:00:00 (Sun)
  0,
  1,
  'GMT',
      ],
      [
  63405421200, #    utc_start 2010-03-28 01:00:00 (Sun)
  63424170000, #      utc_end 2010-10-31 01:00:00 (Sun)
  63405424800, #  local_start 2010-03-28 02:00:00 (Sun)
  63424173600, #    local_end 2010-10-31 02:00:00 (Sun)
  3600,
  0,
  'IST',
      ],
      [
  63424170000, #    utc_start 2010-10-31 01:00:00 (Sun)
  63436870800, #      utc_end 2011-03-27 01:00:00 (Sun)
  63424170000, #  local_start 2010-10-31 01:00:00 (Sun)
  63436870800, #    local_end 2011-03-27 01:00:00 (Sun)
  0,
  1,
  'GMT',
      ],
      [
  63436870800, #    utc_start 2011-03-27 01:00:00 (Sun)
  63455619600, #      utc_end 2011-10-30 01:00:00 (Sun)
  63436874400, #  local_start 2011-03-27 02:00:00 (Sun)
  63455623200, #    local_end 2011-10-30 02:00:00 (Sun)
  3600,
  0,
  'IST',
      ],
      [
  63455619600, #    utc_start 2011-10-30 01:00:00 (Sun)
  63468320400, #      utc_end 2012-03-25 01:00:00 (Sun)
  63455619600, #  local_start 2011-10-30 01:00:00 (Sun)
  63468320400, #    local_end 2012-03-25 01:00:00 (Sun)
  0,
  1,
  'GMT',
      ],
      [
  63468320400, #    utc_start 2012-03-25 01:00:00 (Sun)
  63487069200, #      utc_end 2012-10-28 01:00:00 (Sun)
  63468324000, #  local_start 2012-03-25 02:00:00 (Sun)
  63487072800, #    local_end 2012-10-28 02:00:00 (Sun)
  3600,
  0,
  'IST',
      ],
      [
  63487069200, #    utc_start 2012-10-28 01:00:00 (Sun)
  63500374800, #      utc_end 2013-03-31 01:00:00 (Sun)
  63487069200, #  local_start 2012-10-28 01:00:00 (Sun)
  63500374800, #    local_end 2013-03-31 01:00:00 (Sun)
  0,
  1,
  'GMT',
      ],
      [
  63500374800, #    utc_start 2013-03-31 01:00:00 (Sun)
  63518518800, #      utc_end 2013-10-27 01:00:00 (Sun)
  63500378400, #  local_start 2013-03-31 02:00:00 (Sun)
  63518522400, #    local_end 2013-10-27 02:00:00 (Sun)
  3600,
  0,
  'IST',
      ],
      [
  63518518800, #    utc_start 2013-10-27 01:00:00 (Sun)
  63531824400, #      utc_end 2014-03-30 01:00:00 (Sun)
  63518518800, #  local_start 2013-10-27 01:00:00 (Sun)
  63531824400, #    local_end 2014-03-30 01:00:00 (Sun)
  0,
  1,
  'GMT',
      ],
      [
  63531824400, #    utc_start 2014-03-30 01:00:00 (Sun)
  63549968400, #      utc_end 2014-10-26 01:00:00 (Sun)
  63531828000, #  local_start 2014-03-30 02:00:00 (Sun)
  63549972000, #    local_end 2014-10-26 02:00:00 (Sun)
  3600,
  0,
  'IST',
      ],
      [
  63549968400, #    utc_start 2014-10-26 01:00:00 (Sun)
  63563274000, #      utc_end 2015-03-29 01:00:00 (Sun)
  63549968400, #  local_start 2014-10-26 01:00:00 (Sun)
  63563274000, #    local_end 2015-03-29 01:00:00 (Sun)
  0,
  1,
  'GMT',
      ],
      [
  63563274000, #    utc_start 2015-03-29 01:00:00 (Sun)
  63581418000, #      utc_end 2015-10-25 01:00:00 (Sun)
  63563277600, #  local_start 2015-03-29 02:00:00 (Sun)
  63581421600, #    local_end 2015-10-25 02:00:00 (Sun)
  3600,
  0,
  'IST',
      ],
      [
  63581418000, #    utc_start 2015-10-25 01:00:00 (Sun)
  63594723600, #      utc_end 2016-03-27 01:00:00 (Sun)
  63581418000, #  local_start 2015-10-25 01:00:00 (Sun)
  63594723600, #    local_end 2016-03-27 01:00:00 (Sun)
  0,
  1,
  'GMT',
      ],
      [
  63594723600, #    utc_start 2016-03-27 01:00:00 (Sun)
  63613472400, #      utc_end 2016-10-30 01:00:00 (Sun)
  63594727200, #  local_start 2016-03-27 02:00:00 (Sun)
  63613476000, #    local_end 2016-10-30 02:00:00 (Sun)
  3600,
  0,
  'IST',
      ],
      [
  63613472400, #    utc_start 2016-10-30 01:00:00 (Sun)
  63626173200, #      utc_end 2017-03-26 01:00:00 (Sun)
  63613472400, #  local_start 2016-10-30 01:00:00 (Sun)
  63626173200, #    local_end 2017-03-26 01:00:00 (Sun)
  0,
  1,
  'GMT',
      ],
      [
  63626173200, #    utc_start 2017-03-26 01:00:00 (Sun)
  63644922000, #      utc_end 2017-10-29 01:00:00 (Sun)
  63626176800, #  local_start 2017-03-26 02:00:00 (Sun)
  63644925600, #    local_end 2017-10-29 02:00:00 (Sun)
  3600,
  0,
  'IST',
      ],
      [
  63644922000, #    utc_start 2017-10-29 01:00:00 (Sun)
  63657622800, #      utc_end 2018-03-25 01:00:00 (Sun)
  63644922000, #  local_start 2017-10-29 01:00:00 (Sun)
  63657622800, #    local_end 2018-03-25 01:00:00 (Sun)
  0,
  1,
  'GMT',
      ],
      [
  63657622800, #    utc_start 2018-03-25 01:00:00 (Sun)
  63676371600, #      utc_end 2018-10-28 01:00:00 (Sun)
  63657626400, #  local_start 2018-03-25 02:00:00 (Sun)
  63676375200, #    local_end 2018-10-28 02:00:00 (Sun)
  3600,
  0,
  'IST',
      ],
      [
  63676371600, #    utc_start 2018-10-28 01:00:00 (Sun)
  63689677200, #      utc_end 2019-03-31 01:00:00 (Sun)
  63676371600, #  local_start 2018-10-28 01:00:00 (Sun)
  63689677200, #    local_end 2019-03-31 01:00:00 (Sun)
  0,
  1,
  'GMT',
      ],
      [
  63689677200, #    utc_start 2019-03-31 01:00:00 (Sun)
  63707821200, #      utc_end 2019-10-27 01:00:00 (Sun)
  63689680800, #  local_start 2019-03-31 02:00:00 (Sun)
  63707824800, #    local_end 2019-10-27 02:00:00 (Sun)
  3600,
  0,
  'IST',
      ],
      [
  63707821200, #    utc_start 2019-10-27 01:00:00 (Sun)
  63721126800, #      utc_end 2020-03-29 01:00:00 (Sun)
  63707821200, #  local_start 2019-10-27 01:00:00 (Sun)
  63721126800, #    local_end 2020-03-29 01:00:00 (Sun)
  0,
  1,
  'GMT',
      ],
      [
  63721126800, #    utc_start 2020-03-29 01:00:00 (Sun)
  63739270800, #      utc_end 2020-10-25 01:00:00 (Sun)
  63721130400, #  local_start 2020-03-29 02:00:00 (Sun)
  63739274400, #    local_end 2020-10-25 02:00:00 (Sun)
  3600,
  0,
  'IST',
      ],
      [
  63739270800, #    utc_start 2020-10-25 01:00:00 (Sun)
  63752576400, #      utc_end 2021-03-28 01:00:00 (Sun)
  63739270800, #  local_start 2020-10-25 01:00:00 (Sun)
  63752576400, #    local_end 2021-03-28 01:00:00 (Sun)
  0,
  1,
  'GMT',
      ],
      [
  63752576400, #    utc_start 2021-03-28 01:00:00 (Sun)
  63771325200, #      utc_end 2021-10-31 01:00:00 (Sun)
  63752580000, #  local_start 2021-03-28 02:00:00 (Sun)
  63771328800, #    local_end 2021-10-31 02:00:00 (Sun)
  3600,
  0,
  'IST',
      ],
      [
  63771325200, #    utc_start 2021-10-31 01:00:00 (Sun)
  63784026000, #      utc_end 2022-03-27 01:00:00 (Sun)
  63771325200, #  local_start 2021-10-31 01:00:00 (Sun)
  63784026000, #    local_end 2022-03-27 01:00:00 (Sun)
  0,
  1,
  'GMT',
      ],
      [
  63784026000, #    utc_start 2022-03-27 01:00:00 (Sun)
  63802774800, #      utc_end 2022-10-30 01:00:00 (Sun)
  63784029600, #  local_start 2022-03-27 02:00:00 (Sun)
  63802778400, #    local_end 2022-10-30 02:00:00 (Sun)
  3600,
  0,
  'IST',
      ],
      [
  63802774800, #    utc_start 2022-10-30 01:00:00 (Sun)
  63815475600, #      utc_end 2023-03-26 01:00:00 (Sun)
  63802774800, #  local_start 2022-10-30 01:00:00 (Sun)
  63815475600, #    local_end 2023-03-26 01:00:00 (Sun)
  0,
  1,
  'GMT',
      ],
      [
  63815475600, #    utc_start 2023-03-26 01:00:00 (Sun)
  63834224400, #      utc_end 2023-10-29 01:00:00 (Sun)
  63815479200, #  local_start 2023-03-26 02:00:00 (Sun)
  63834228000, #    local_end 2023-10-29 02:00:00 (Sun)
  3600,
  0,
  'IST',
      ],
      [
  63834224400, #    utc_start 2023-10-29 01:00:00 (Sun)
  63847530000, #      utc_end 2024-03-31 01:00:00 (Sun)
  63834224400, #  local_start 2023-10-29 01:00:00 (Sun)
  63847530000, #    local_end 2024-03-31 01:00:00 (Sun)
  0,
  1,
  'GMT',
      ],
      [
  63847530000, #    utc_start 2024-03-31 01:00:00 (Sun)
  63865674000, #      utc_end 2024-10-27 01:00:00 (Sun)
  63847533600, #  local_start 2024-03-31 02:00:00 (Sun)
  63865677600, #    local_end 2024-10-27 02:00:00 (Sun)
  3600,
  0,
  'IST',
      ],
      [
  63865674000, #    utc_start 2024-10-27 01:00:00 (Sun)
  63878979600, #      utc_end 2025-03-30 01:00:00 (Sun)
  63865674000, #  local_start 2024-10-27 01:00:00 (Sun)
  63878979600, #    local_end 2025-03-30 01:00:00 (Sun)
  0,
  1,
  'GMT',
      ],
      [
  63878979600, #    utc_start 2025-03-30 01:00:00 (Sun)
  63897123600, #      utc_end 2025-10-26 01:00:00 (Sun)
  63878983200, #  local_start 2025-03-30 02:00:00 (Sun)
  63897127200, #    local_end 2025-10-26 02:00:00 (Sun)
  3600,
  0,
  'IST',
      ],
      [
  63897123600, #    utc_start 2025-10-26 01:00:00 (Sun)
  63910429200, #      utc_end 2026-03-29 01:00:00 (Sun)
  63897123600, #  local_start 2025-10-26 01:00:00 (Sun)
  63910429200, #    local_end 2026-03-29 01:00:00 (Sun)
  0,
  1,
  'GMT',
      ],
      [
  63910429200, #    utc_start 2026-03-29 01:00:00 (Sun)
  63928573200, #      utc_end 2026-10-25 01:00:00 (Sun)
  63910432800, #  local_start 2026-03-29 02:00:00 (Sun)
  63928576800, #    local_end 2026-10-25 02:00:00 (Sun)
  3600,
  0,
  'IST',
      ],
      [
  63928573200, #    utc_start 2026-10-25 01:00:00 (Sun)
  63941878800, #      utc_end 2027-03-28 01:00:00 (Sun)
  63928573200, #  local_start 2026-10-25 01:00:00 (Sun)
  63941878800, #    local_end 2027-03-28 01:00:00 (Sun)
  0,
  1,
  'GMT',
      ],
      [
  63941878800, #    utc_start 2027-03-28 01:00:00 (Sun)
  63960627600, #      utc_end 2027-10-31 01:00:00 (Sun)
  63941882400, #  local_start 2027-03-28 02:00:00 (Sun)
  63960631200, #    local_end 2027-10-31 02:00:00 (Sun)
  3600,
  0,
  'IST',
      ],
      [
  63960627600, #    utc_start 2027-10-31 01:00:00 (Sun)
  63973328400, #      utc_end 2028-03-26 01:00:00 (Sun)
  63960627600, #  local_start 2027-10-31 01:00:00 (Sun)
  63973328400, #    local_end 2028-03-26 01:00:00 (Sun)
  0,
  1,
  'GMT',
      ],
      [
  63973328400, #    utc_start 2028-03-26 01:00:00 (Sun)
  63992077200, #      utc_end 2028-10-29 01:00:00 (Sun)
  63973332000, #  local_start 2028-03-26 02:00:00 (Sun)
  63992080800, #    local_end 2028-10-29 02:00:00 (Sun)
  3600,
  0,
  'IST',
      ],
      [
  63992077200, #    utc_start 2028-10-29 01:00:00 (Sun)
  64004778000, #      utc_end 2029-03-25 01:00:00 (Sun)
  63992077200, #  local_start 2028-10-29 01:00:00 (Sun)
  64004778000, #    local_end 2029-03-25 01:00:00 (Sun)
  0,
  1,
  'GMT',
      ],
      [
  64004778000, #    utc_start 2029-03-25 01:00:00 (Sun)
  64023526800, #      utc_end 2029-10-28 01:00:00 (Sun)
  64004781600, #  local_start 2029-03-25 02:00:00 (Sun)
  64023530400, #    local_end 2029-10-28 02:00:00 (Sun)
  3600,
  0,
  'IST',
      ],
      [
  64023526800, #    utc_start 2029-10-28 01:00:00 (Sun)
  64036832400, #      utc_end 2030-03-31 01:00:00 (Sun)
  64023526800, #  local_start 2029-10-28 01:00:00 (Sun)
  64036832400, #    local_end 2030-03-31 01:00:00 (Sun)
  0,
  1,
  'GMT',
      ],
      [
  64036832400, #    utc_start 2030-03-31 01:00:00 (Sun)
  64054976400, #      utc_end 2030-10-27 01:00:00 (Sun)
  64036836000, #  local_start 2030-03-31 02:00:00 (Sun)
  64054980000, #    local_end 2030-10-27 02:00:00 (Sun)
  3600,
  0,
  'IST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {107}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { 3600 }
  
  my $last_observance = bless( {
    'format' => 'IST/GMT',
    'gmtoff' => '1:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 718732,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 718732,
      'utc_rd_secs' => 0,
      'utc_year' => 1969
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => 3600,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 718731,
      'local_rd_secs' => 82800,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 718731,
      'utc_rd_secs' => 82800,
      'utc_year' => 1969
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '1:00u',
      'from' => '1996',
      'in' => 'Oct',
      'letter' => '',
      'name' => 'Eire',
      'offset_from_std' => -3600,
      'on' => 'lastSun',
      'save' => '-1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '1:00u',
      'from' => '1981',
      'in' => 'Mar',
      'letter' => '',
      'name' => 'Eire',
      'offset_from_std' => 0,
      'on' => 'lastSun',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_EUROPE_DUBLIN

    $main::fatpacked{"DateTime/TimeZone/Europe/Gibraltar.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_EUROPE_GIBRALTAR';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Europe::Gibraltar;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Europe::Gibraltar::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59314033284, #      utc_end 1880-08-02 00:21:24 (Mon)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59314032000, #    local_end 1880-08-02 00:00:00 (Mon)
  -1284,
  0,
  'LMT',
      ],
      [
  59314033284, #    utc_start 1880-08-02 00:21:24 (Mon)
  60443719200, #      utc_end 1916-05-21 02:00:00 (Sun)
  59314033284, #  local_start 1880-08-02 00:21:24 (Mon)
  60443719200, #    local_end 1916-05-21 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  60443719200, #    utc_start 1916-05-21 02:00:00 (Sun)
  60455210400, #      utc_end 1916-10-01 02:00:00 (Sun)
  60443722800, #  local_start 1916-05-21 03:00:00 (Sun)
  60455214000, #    local_end 1916-10-01 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  60455210400, #    utc_start 1916-10-01 02:00:00 (Sun)
  60471540000, #      utc_end 1917-04-08 02:00:00 (Sun)
  60455210400, #  local_start 1916-10-01 02:00:00 (Sun)
  60471540000, #    local_end 1917-04-08 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  60471540000, #    utc_start 1917-04-08 02:00:00 (Sun)
  60485536800, #      utc_end 1917-09-17 02:00:00 (Mon)
  60471543600, #  local_start 1917-04-08 03:00:00 (Sun)
  60485540400, #    local_end 1917-09-17 03:00:00 (Mon)
  3600,
  1,
  'BST',
      ],
      [
  60485536800, #    utc_start 1917-09-17 02:00:00 (Mon)
  60501780000, #      utc_end 1918-03-24 02:00:00 (Sun)
  60485536800, #  local_start 1917-09-17 02:00:00 (Mon)
  60501780000, #    local_end 1918-03-24 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  60501780000, #    utc_start 1918-03-24 02:00:00 (Sun)
  60518196000, #      utc_end 1918-09-30 02:00:00 (Mon)
  60501783600, #  local_start 1918-03-24 03:00:00 (Sun)
  60518199600, #    local_end 1918-09-30 03:00:00 (Mon)
  3600,
  1,
  'BST',
      ],
      [
  60518196000, #    utc_start 1918-09-30 02:00:00 (Mon)
  60533834400, #      utc_end 1919-03-30 02:00:00 (Sun)
  60518196000, #  local_start 1918-09-30 02:00:00 (Mon)
  60533834400, #    local_end 1919-03-30 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  60533834400, #    utc_start 1919-03-30 02:00:00 (Sun)
  60549645600, #      utc_end 1919-09-29 02:00:00 (Mon)
  60533838000, #  local_start 1919-03-30 03:00:00 (Sun)
  60549649200, #    local_end 1919-09-29 03:00:00 (Mon)
  3600,
  1,
  'BST',
      ],
      [
  60549645600, #    utc_start 1919-09-29 02:00:00 (Mon)
  60565284000, #      utc_end 1920-03-28 02:00:00 (Sun)
  60549645600, #  local_start 1919-09-29 02:00:00 (Mon)
  60565284000, #    local_end 1920-03-28 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  60565284000, #    utc_start 1920-03-28 02:00:00 (Sun)
  60583514400, #      utc_end 1920-10-25 02:00:00 (Mon)
  60565287600, #  local_start 1920-03-28 03:00:00 (Sun)
  60583518000, #    local_end 1920-10-25 03:00:00 (Mon)
  3600,
  1,
  'BST',
      ],
      [
  60583514400, #    utc_start 1920-10-25 02:00:00 (Mon)
  60597338400, #      utc_end 1921-04-03 02:00:00 (Sun)
  60583514400, #  local_start 1920-10-25 02:00:00 (Mon)
  60597338400, #    local_end 1921-04-03 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  60597338400, #    utc_start 1921-04-03 02:00:00 (Sun)
  60613149600, #      utc_end 1921-10-03 02:00:00 (Mon)
  60597342000, #  local_start 1921-04-03 03:00:00 (Sun)
  60613153200, #    local_end 1921-10-03 03:00:00 (Mon)
  3600,
  1,
  'BST',
      ],
      [
  60613149600, #    utc_start 1921-10-03 02:00:00 (Mon)
  60628183200, #      utc_end 1922-03-26 02:00:00 (Sun)
  60613149600, #  local_start 1921-10-03 02:00:00 (Mon)
  60628183200, #    local_end 1922-03-26 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  60628183200, #    utc_start 1922-03-26 02:00:00 (Sun)
  60645117600, #      utc_end 1922-10-08 02:00:00 (Sun)
  60628186800, #  local_start 1922-03-26 03:00:00 (Sun)
  60645121200, #    local_end 1922-10-08 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  60645117600, #    utc_start 1922-10-08 02:00:00 (Sun)
  60662052000, #      utc_end 1923-04-22 02:00:00 (Sun)
  60645117600, #  local_start 1922-10-08 02:00:00 (Sun)
  60662052000, #    local_end 1923-04-22 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  60662052000, #    utc_start 1923-04-22 02:00:00 (Sun)
  60674752800, #      utc_end 1923-09-16 02:00:00 (Sun)
  60662055600, #  local_start 1923-04-22 03:00:00 (Sun)
  60674756400, #    local_end 1923-09-16 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  60674752800, #    utc_start 1923-09-16 02:00:00 (Sun)
  60692896800, #      utc_end 1924-04-13 02:00:00 (Sun)
  60674752800, #  local_start 1923-09-16 02:00:00 (Sun)
  60692896800, #    local_end 1924-04-13 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  60692896800, #    utc_start 1924-04-13 02:00:00 (Sun)
  60706807200, #      utc_end 1924-09-21 02:00:00 (Sun)
  60692900400, #  local_start 1924-04-13 03:00:00 (Sun)
  60706810800, #    local_end 1924-09-21 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  60706807200, #    utc_start 1924-09-21 02:00:00 (Sun)
  60724951200, #      utc_end 1925-04-19 02:00:00 (Sun)
  60706807200, #  local_start 1924-09-21 02:00:00 (Sun)
  60724951200, #    local_end 1925-04-19 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  60724951200, #    utc_start 1925-04-19 02:00:00 (Sun)
  60739466400, #      utc_end 1925-10-04 02:00:00 (Sun)
  60724954800, #  local_start 1925-04-19 03:00:00 (Sun)
  60739470000, #    local_end 1925-10-04 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  60739466400, #    utc_start 1925-10-04 02:00:00 (Sun)
  60756400800, #      utc_end 1926-04-18 02:00:00 (Sun)
  60739466400, #  local_start 1925-10-04 02:00:00 (Sun)
  60756400800, #    local_end 1926-04-18 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  60756400800, #    utc_start 1926-04-18 02:00:00 (Sun)
  60770916000, #      utc_end 1926-10-03 02:00:00 (Sun)
  60756404400, #  local_start 1926-04-18 03:00:00 (Sun)
  60770919600, #    local_end 1926-10-03 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  60770916000, #    utc_start 1926-10-03 02:00:00 (Sun)
  60787245600, #      utc_end 1927-04-10 02:00:00 (Sun)
  60770916000, #  local_start 1926-10-03 02:00:00 (Sun)
  60787245600, #    local_end 1927-04-10 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  60787245600, #    utc_start 1927-04-10 02:00:00 (Sun)
  60802365600, #      utc_end 1927-10-02 02:00:00 (Sun)
  60787249200, #  local_start 1927-04-10 03:00:00 (Sun)
  60802369200, #    local_end 1927-10-02 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  60802365600, #    utc_start 1927-10-02 02:00:00 (Sun)
  60819904800, #      utc_end 1928-04-22 02:00:00 (Sun)
  60802365600, #  local_start 1927-10-02 02:00:00 (Sun)
  60819904800, #    local_end 1928-04-22 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  60819904800, #    utc_start 1928-04-22 02:00:00 (Sun)
  60834420000, #      utc_end 1928-10-07 02:00:00 (Sun)
  60819908400, #  local_start 1928-04-22 03:00:00 (Sun)
  60834423600, #    local_end 1928-10-07 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  60834420000, #    utc_start 1928-10-07 02:00:00 (Sun)
  60851354400, #      utc_end 1929-04-21 02:00:00 (Sun)
  60834420000, #  local_start 1928-10-07 02:00:00 (Sun)
  60851354400, #    local_end 1929-04-21 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  60851354400, #    utc_start 1929-04-21 02:00:00 (Sun)
  60865869600, #      utc_end 1929-10-06 02:00:00 (Sun)
  60851358000, #  local_start 1929-04-21 03:00:00 (Sun)
  60865873200, #    local_end 1929-10-06 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  60865869600, #    utc_start 1929-10-06 02:00:00 (Sun)
  60882199200, #      utc_end 1930-04-13 02:00:00 (Sun)
  60865869600, #  local_start 1929-10-06 02:00:00 (Sun)
  60882199200, #    local_end 1930-04-13 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  60882199200, #    utc_start 1930-04-13 02:00:00 (Sun)
  60897319200, #      utc_end 1930-10-05 02:00:00 (Sun)
  60882202800, #  local_start 1930-04-13 03:00:00 (Sun)
  60897322800, #    local_end 1930-10-05 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  60897319200, #    utc_start 1930-10-05 02:00:00 (Sun)
  60914253600, #      utc_end 1931-04-19 02:00:00 (Sun)
  60897319200, #  local_start 1930-10-05 02:00:00 (Sun)
  60914253600, #    local_end 1931-04-19 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  60914253600, #    utc_start 1931-04-19 02:00:00 (Sun)
  60928768800, #      utc_end 1931-10-04 02:00:00 (Sun)
  60914257200, #  local_start 1931-04-19 03:00:00 (Sun)
  60928772400, #    local_end 1931-10-04 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  60928768800, #    utc_start 1931-10-04 02:00:00 (Sun)
  60945703200, #      utc_end 1932-04-17 02:00:00 (Sun)
  60928768800, #  local_start 1931-10-04 02:00:00 (Sun)
  60945703200, #    local_end 1932-04-17 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  60945703200, #    utc_start 1932-04-17 02:00:00 (Sun)
  60960218400, #      utc_end 1932-10-02 02:00:00 (Sun)
  60945706800, #  local_start 1932-04-17 03:00:00 (Sun)
  60960222000, #    local_end 1932-10-02 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  60960218400, #    utc_start 1932-10-02 02:00:00 (Sun)
  60976548000, #      utc_end 1933-04-09 02:00:00 (Sun)
  60960218400, #  local_start 1932-10-02 02:00:00 (Sun)
  60976548000, #    local_end 1933-04-09 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  60976548000, #    utc_start 1933-04-09 02:00:00 (Sun)
  60992272800, #      utc_end 1933-10-08 02:00:00 (Sun)
  60976551600, #  local_start 1933-04-09 03:00:00 (Sun)
  60992276400, #    local_end 1933-10-08 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  60992272800, #    utc_start 1933-10-08 02:00:00 (Sun)
  61009207200, #      utc_end 1934-04-22 02:00:00 (Sun)
  60992272800, #  local_start 1933-10-08 02:00:00 (Sun)
  61009207200, #    local_end 1934-04-22 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61009207200, #    utc_start 1934-04-22 02:00:00 (Sun)
  61023722400, #      utc_end 1934-10-07 02:00:00 (Sun)
  61009210800, #  local_start 1934-04-22 03:00:00 (Sun)
  61023726000, #    local_end 1934-10-07 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  61023722400, #    utc_start 1934-10-07 02:00:00 (Sun)
  61040052000, #      utc_end 1935-04-14 02:00:00 (Sun)
  61023722400, #  local_start 1934-10-07 02:00:00 (Sun)
  61040052000, #    local_end 1935-04-14 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61040052000, #    utc_start 1935-04-14 02:00:00 (Sun)
  61055172000, #      utc_end 1935-10-06 02:00:00 (Sun)
  61040055600, #  local_start 1935-04-14 03:00:00 (Sun)
  61055175600, #    local_end 1935-10-06 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  61055172000, #    utc_start 1935-10-06 02:00:00 (Sun)
  61072106400, #      utc_end 1936-04-19 02:00:00 (Sun)
  61055172000, #  local_start 1935-10-06 02:00:00 (Sun)
  61072106400, #    local_end 1936-04-19 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61072106400, #    utc_start 1936-04-19 02:00:00 (Sun)
  61086621600, #      utc_end 1936-10-04 02:00:00 (Sun)
  61072110000, #  local_start 1936-04-19 03:00:00 (Sun)
  61086625200, #    local_end 1936-10-04 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  61086621600, #    utc_start 1936-10-04 02:00:00 (Sun)
  61103556000, #      utc_end 1937-04-18 02:00:00 (Sun)
  61086621600, #  local_start 1936-10-04 02:00:00 (Sun)
  61103556000, #    local_end 1937-04-18 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61103556000, #    utc_start 1937-04-18 02:00:00 (Sun)
  61118071200, #      utc_end 1937-10-03 02:00:00 (Sun)
  61103559600, #  local_start 1937-04-18 03:00:00 (Sun)
  61118074800, #    local_end 1937-10-03 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  61118071200, #    utc_start 1937-10-03 02:00:00 (Sun)
  61134400800, #      utc_end 1938-04-10 02:00:00 (Sun)
  61118071200, #  local_start 1937-10-03 02:00:00 (Sun)
  61134400800, #    local_end 1938-04-10 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61134400800, #    utc_start 1938-04-10 02:00:00 (Sun)
  61149520800, #      utc_end 1938-10-02 02:00:00 (Sun)
  61134404400, #  local_start 1938-04-10 03:00:00 (Sun)
  61149524400, #    local_end 1938-10-02 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  61149520800, #    utc_start 1938-10-02 02:00:00 (Sun)
  61166455200, #      utc_end 1939-04-16 02:00:00 (Sun)
  61149520800, #  local_start 1938-10-02 02:00:00 (Sun)
  61166455200, #    local_end 1939-04-16 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61166455200, #    utc_start 1939-04-16 02:00:00 (Sun)
  61185204000, #      utc_end 1939-11-19 02:00:00 (Sun)
  61166458800, #  local_start 1939-04-16 03:00:00 (Sun)
  61185207600, #    local_end 1939-11-19 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  61185204000, #    utc_start 1939-11-19 02:00:00 (Sun)
  61193671200, #      utc_end 1940-02-25 02:00:00 (Sun)
  61185204000, #  local_start 1939-11-19 02:00:00 (Sun)
  61193671200, #    local_end 1940-02-25 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61193671200, #    utc_start 1940-02-25 02:00:00 (Sun)
  61231165200, #      utc_end 1941-05-04 01:00:00 (Sun)
  61193674800, #  local_start 1940-02-25 03:00:00 (Sun)
  61231168800, #    local_end 1941-05-04 02:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  61231165200, #    utc_start 1941-05-04 01:00:00 (Sun)
  61239632400, #      utc_end 1941-08-10 01:00:00 (Sun)
  61231172400, #  local_start 1941-05-04 03:00:00 (Sun)
  61239639600, #    local_end 1941-08-10 03:00:00 (Sun)
  7200,
  1,
  'BDST',
      ],
      [
  61239632400, #    utc_start 1941-08-10 01:00:00 (Sun)
  61260195600, #      utc_end 1942-04-05 01:00:00 (Sun)
  61239636000, #  local_start 1941-08-10 02:00:00 (Sun)
  61260199200, #    local_end 1942-04-05 02:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  61260195600, #    utc_start 1942-04-05 01:00:00 (Sun)
  61271082000, #      utc_end 1942-08-09 01:00:00 (Sun)
  61260202800, #  local_start 1942-04-05 03:00:00 (Sun)
  61271089200, #    local_end 1942-08-09 03:00:00 (Sun)
  7200,
  1,
  'BDST',
      ],
      [
  61271082000, #    utc_start 1942-08-09 01:00:00 (Sun)
  61291645200, #      utc_end 1943-04-04 01:00:00 (Sun)
  61271085600, #  local_start 1942-08-09 02:00:00 (Sun)
  61291648800, #    local_end 1943-04-04 02:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  61291645200, #    utc_start 1943-04-04 01:00:00 (Sun)
  61303136400, #      utc_end 1943-08-15 01:00:00 (Sun)
  61291652400, #  local_start 1943-04-04 03:00:00 (Sun)
  61303143600, #    local_end 1943-08-15 03:00:00 (Sun)
  7200,
  1,
  'BDST',
      ],
      [
  61303136400, #    utc_start 1943-08-15 01:00:00 (Sun)
  61323094800, #      utc_end 1944-04-02 01:00:00 (Sun)
  61303140000, #  local_start 1943-08-15 02:00:00 (Sun)
  61323098400, #    local_end 1944-04-02 02:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  61323094800, #    utc_start 1944-04-02 01:00:00 (Sun)
  61337610000, #      utc_end 1944-09-17 01:00:00 (Sun)
  61323102000, #  local_start 1944-04-02 03:00:00 (Sun)
  61337617200, #    local_end 1944-09-17 03:00:00 (Sun)
  7200,
  1,
  'BDST',
      ],
      [
  61337610000, #    utc_start 1944-09-17 01:00:00 (Sun)
  61354630800, #      utc_end 1945-04-02 01:00:00 (Mon)
  61337613600, #  local_start 1944-09-17 02:00:00 (Sun)
  61354634400, #    local_end 1945-04-02 02:00:00 (Mon)
  3600,
  1,
  'BST',
      ],
      [
  61354630800, #    utc_start 1945-04-02 01:00:00 (Mon)
  61363616400, #      utc_end 1945-07-15 01:00:00 (Sun)
  61354638000, #  local_start 1945-04-02 03:00:00 (Mon)
  61363623600, #    local_end 1945-07-15 03:00:00 (Sun)
  7200,
  1,
  'BDST',
      ],
      [
  61363616400, #    utc_start 1945-07-15 01:00:00 (Sun)
  61370877600, #      utc_end 1945-10-07 02:00:00 (Sun)
  61363620000, #  local_start 1945-07-15 02:00:00 (Sun)
  61370881200, #    local_end 1945-10-07 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  61370877600, #    utc_start 1945-10-07 02:00:00 (Sun)
  61387207200, #      utc_end 1946-04-14 02:00:00 (Sun)
  61370877600, #  local_start 1945-10-07 02:00:00 (Sun)
  61387207200, #    local_end 1946-04-14 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61387207200, #    utc_start 1946-04-14 02:00:00 (Sun)
  61402327200, #      utc_end 1946-10-06 02:00:00 (Sun)
  61387210800, #  local_start 1946-04-14 03:00:00 (Sun)
  61402330800, #    local_end 1946-10-06 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  61402327200, #    utc_start 1946-10-06 02:00:00 (Sun)
  61416237600, #      utc_end 1947-03-16 02:00:00 (Sun)
  61402327200, #  local_start 1946-10-06 02:00:00 (Sun)
  61416237600, #    local_end 1947-03-16 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61416237600, #    utc_start 1947-03-16 02:00:00 (Sun)
  61418653200, #      utc_end 1947-04-13 01:00:00 (Sun)
  61416241200, #  local_start 1947-03-16 03:00:00 (Sun)
  61418656800, #    local_end 1947-04-13 02:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  61418653200, #    utc_start 1947-04-13 01:00:00 (Sun)
  61428934800, #      utc_end 1947-08-10 01:00:00 (Sun)
  61418660400, #  local_start 1947-04-13 03:00:00 (Sun)
  61428942000, #    local_end 1947-08-10 03:00:00 (Sun)
  7200,
  1,
  'BDST',
      ],
      [
  61428934800, #    utc_start 1947-08-10 01:00:00 (Sun)
  61436196000, #      utc_end 1947-11-02 02:00:00 (Sun)
  61428938400, #  local_start 1947-08-10 02:00:00 (Sun)
  61436199600, #    local_end 1947-11-02 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  61436196000, #    utc_start 1947-11-02 02:00:00 (Sun)
  61447687200, #      utc_end 1948-03-14 02:00:00 (Sun)
  61436196000, #  local_start 1947-11-02 02:00:00 (Sun)
  61447687200, #    local_end 1948-03-14 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61447687200, #    utc_start 1948-03-14 02:00:00 (Sun)
  61467645600, #      utc_end 1948-10-31 02:00:00 (Sun)
  61447690800, #  local_start 1948-03-14 03:00:00 (Sun)
  61467649200, #    local_end 1948-10-31 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  61467645600, #    utc_start 1948-10-31 02:00:00 (Sun)
  61480951200, #      utc_end 1949-04-03 02:00:00 (Sun)
  61467645600, #  local_start 1948-10-31 02:00:00 (Sun)
  61480951200, #    local_end 1949-04-03 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61480951200, #    utc_start 1949-04-03 02:00:00 (Sun)
  61499095200, #      utc_end 1949-10-30 02:00:00 (Sun)
  61480954800, #  local_start 1949-04-03 03:00:00 (Sun)
  61499098800, #    local_end 1949-10-30 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  61499095200, #    utc_start 1949-10-30 02:00:00 (Sun)
  61513610400, #      utc_end 1950-04-16 02:00:00 (Sun)
  61499095200, #  local_start 1949-10-30 02:00:00 (Sun)
  61513610400, #    local_end 1950-04-16 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61513610400, #    utc_start 1950-04-16 02:00:00 (Sun)
  61529940000, #      utc_end 1950-10-22 02:00:00 (Sun)
  61513614000, #  local_start 1950-04-16 03:00:00 (Sun)
  61529943600, #    local_end 1950-10-22 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  61529940000, #    utc_start 1950-10-22 02:00:00 (Sun)
  61545060000, #      utc_end 1951-04-15 02:00:00 (Sun)
  61529940000, #  local_start 1950-10-22 02:00:00 (Sun)
  61545060000, #    local_end 1951-04-15 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61545060000, #    utc_start 1951-04-15 02:00:00 (Sun)
  61561389600, #      utc_end 1951-10-21 02:00:00 (Sun)
  61545063600, #  local_start 1951-04-15 03:00:00 (Sun)
  61561393200, #    local_end 1951-10-21 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  61561389600, #    utc_start 1951-10-21 02:00:00 (Sun)
  61577114400, #      utc_end 1952-04-20 02:00:00 (Sun)
  61561389600, #  local_start 1951-10-21 02:00:00 (Sun)
  61577114400, #    local_end 1952-04-20 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61577114400, #    utc_start 1952-04-20 02:00:00 (Sun)
  61593444000, #      utc_end 1952-10-26 02:00:00 (Sun)
  61577118000, #  local_start 1952-04-20 03:00:00 (Sun)
  61593447600, #    local_end 1952-10-26 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  61593444000, #    utc_start 1952-10-26 02:00:00 (Sun)
  61608564000, #      utc_end 1953-04-19 02:00:00 (Sun)
  61593444000, #  local_start 1952-10-26 02:00:00 (Sun)
  61608564000, #    local_end 1953-04-19 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61608564000, #    utc_start 1953-04-19 02:00:00 (Sun)
  61623079200, #      utc_end 1953-10-04 02:00:00 (Sun)
  61608567600, #  local_start 1953-04-19 03:00:00 (Sun)
  61623082800, #    local_end 1953-10-04 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  61623079200, #    utc_start 1953-10-04 02:00:00 (Sun)
  61639408800, #      utc_end 1954-04-11 02:00:00 (Sun)
  61623079200, #  local_start 1953-10-04 02:00:00 (Sun)
  61639408800, #    local_end 1954-04-11 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61639408800, #    utc_start 1954-04-11 02:00:00 (Sun)
  61654528800, #      utc_end 1954-10-03 02:00:00 (Sun)
  61639412400, #  local_start 1954-04-11 03:00:00 (Sun)
  61654532400, #    local_end 1954-10-03 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  61654528800, #    utc_start 1954-10-03 02:00:00 (Sun)
  61671463200, #      utc_end 1955-04-17 02:00:00 (Sun)
  61654528800, #  local_start 1954-10-03 02:00:00 (Sun)
  61671463200, #    local_end 1955-04-17 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61671463200, #    utc_start 1955-04-17 02:00:00 (Sun)
  61685978400, #      utc_end 1955-10-02 02:00:00 (Sun)
  61671466800, #  local_start 1955-04-17 03:00:00 (Sun)
  61685982000, #    local_end 1955-10-02 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  61685978400, #    utc_start 1955-10-02 02:00:00 (Sun)
  61703517600, #      utc_end 1956-04-22 02:00:00 (Sun)
  61685978400, #  local_start 1955-10-02 02:00:00 (Sun)
  61703517600, #    local_end 1956-04-22 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61703517600, #    utc_start 1956-04-22 02:00:00 (Sun)
  61718032800, #      utc_end 1956-10-07 02:00:00 (Sun)
  61703521200, #  local_start 1956-04-22 03:00:00 (Sun)
  61718036400, #    local_end 1956-10-07 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  61718032800, #    utc_start 1956-10-07 02:00:00 (Sun)
  61734362400, #      utc_end 1957-04-14 02:00:00 (Sun)
  61718032800, #  local_start 1956-10-07 02:00:00 (Sun)
  61734362400, #    local_end 1957-04-14 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61734362400, #    utc_start 1957-04-14 02:00:00 (Sun)
  62514370800, #      utc_end 1981-12-31 23:00:00 (Thu)
  61734366000, #  local_start 1957-04-14 03:00:00 (Sun)
  62514374400, #    local_end 1982-01-01 00:00:00 (Fri)
  3600,
  0,
  'CET',
      ],
      [
  62514370800, #    utc_start 1981-12-31 23:00:00 (Thu)
  62521808400, #      utc_end 1982-03-28 01:00:00 (Sun)
  62514374400, #  local_start 1982-01-01 00:00:00 (Fri)
  62521812000, #    local_end 1982-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62521808400, #    utc_start 1982-03-28 01:00:00 (Sun)
  62537533200, #      utc_end 1982-09-26 01:00:00 (Sun)
  62521815600, #  local_start 1982-03-28 03:00:00 (Sun)
  62537540400, #    local_end 1982-09-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62537533200, #    utc_start 1982-09-26 01:00:00 (Sun)
  62553258000, #      utc_end 1983-03-27 01:00:00 (Sun)
  62537536800, #  local_start 1982-09-26 02:00:00 (Sun)
  62553261600, #    local_end 1983-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62553258000, #    utc_start 1983-03-27 01:00:00 (Sun)
  62568982800, #      utc_end 1983-09-25 01:00:00 (Sun)
  62553265200, #  local_start 1983-03-27 03:00:00 (Sun)
  62568990000, #    local_end 1983-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62568982800, #    utc_start 1983-09-25 01:00:00 (Sun)
  62584707600, #      utc_end 1984-03-25 01:00:00 (Sun)
  62568986400, #  local_start 1983-09-25 02:00:00 (Sun)
  62584711200, #    local_end 1984-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62584707600, #    utc_start 1984-03-25 01:00:00 (Sun)
  62601037200, #      utc_end 1984-09-30 01:00:00 (Sun)
  62584714800, #  local_start 1984-03-25 03:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62601037200, #    utc_start 1984-09-30 01:00:00 (Sun)
  62616762000, #      utc_end 1985-03-31 01:00:00 (Sun)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62616762000, #    utc_start 1985-03-31 01:00:00 (Sun)
  62632486800, #      utc_end 1985-09-29 01:00:00 (Sun)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62632486800, #    utc_start 1985-09-29 01:00:00 (Sun)
  62648211600, #      utc_end 1986-03-30 01:00:00 (Sun)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62648211600, #    utc_start 1986-03-30 01:00:00 (Sun)
  62663936400, #      utc_end 1986-09-28 01:00:00 (Sun)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62663936400, #    utc_start 1986-09-28 01:00:00 (Sun)
  62679661200, #      utc_end 1987-03-29 01:00:00 (Sun)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62679661200, #    utc_start 1987-03-29 01:00:00 (Sun)
  62695386000, #      utc_end 1987-09-27 01:00:00 (Sun)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62695386000, #    utc_start 1987-09-27 01:00:00 (Sun)
  62711110800, #      utc_end 1988-03-27 01:00:00 (Sun)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62711110800, #    utc_start 1988-03-27 01:00:00 (Sun)
  62726835600, #      utc_end 1988-09-25 01:00:00 (Sun)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62726835600, #    utc_start 1988-09-25 01:00:00 (Sun)
  62742560400, #      utc_end 1989-03-26 01:00:00 (Sun)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62742560400, #    utc_start 1989-03-26 01:00:00 (Sun)
  62758285200, #      utc_end 1989-09-24 01:00:00 (Sun)
  62742567600, #  local_start 1989-03-26 03:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62758285200, #    utc_start 1989-09-24 01:00:00 (Sun)
  62774010000, #      utc_end 1990-03-25 01:00:00 (Sun)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62774010000, #    utc_start 1990-03-25 01:00:00 (Sun)
  62790339600, #      utc_end 1990-09-30 01:00:00 (Sun)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62790339600, #    utc_start 1990-09-30 01:00:00 (Sun)
  62806064400, #      utc_end 1991-03-31 01:00:00 (Sun)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62806064400, #    utc_start 1991-03-31 01:00:00 (Sun)
  62821789200, #      utc_end 1991-09-29 01:00:00 (Sun)
  62806071600, #  local_start 1991-03-31 03:00:00 (Sun)
  62821796400, #    local_end 1991-09-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62821789200, #    utc_start 1991-09-29 01:00:00 (Sun)
  62837514000, #      utc_end 1992-03-29 01:00:00 (Sun)
  62821792800, #  local_start 1991-09-29 02:00:00 (Sun)
  62837517600, #    local_end 1992-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62837514000, #    utc_start 1992-03-29 01:00:00 (Sun)
  62853238800, #      utc_end 1992-09-27 01:00:00 (Sun)
  62837521200, #  local_start 1992-03-29 03:00:00 (Sun)
  62853246000, #    local_end 1992-09-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62853238800, #    utc_start 1992-09-27 01:00:00 (Sun)
  62868963600, #      utc_end 1993-03-28 01:00:00 (Sun)
  62853242400, #  local_start 1992-09-27 02:00:00 (Sun)
  62868967200, #    local_end 1993-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62868963600, #    utc_start 1993-03-28 01:00:00 (Sun)
  62884688400, #      utc_end 1993-09-26 01:00:00 (Sun)
  62868970800, #  local_start 1993-03-28 03:00:00 (Sun)
  62884695600, #    local_end 1993-09-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62884688400, #    utc_start 1993-09-26 01:00:00 (Sun)
  62900413200, #      utc_end 1994-03-27 01:00:00 (Sun)
  62884692000, #  local_start 1993-09-26 02:00:00 (Sun)
  62900416800, #    local_end 1994-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62900413200, #    utc_start 1994-03-27 01:00:00 (Sun)
  62916138000, #      utc_end 1994-09-25 01:00:00 (Sun)
  62900420400, #  local_start 1994-03-27 03:00:00 (Sun)
  62916145200, #    local_end 1994-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62916138000, #    utc_start 1994-09-25 01:00:00 (Sun)
  62931862800, #      utc_end 1995-03-26 01:00:00 (Sun)
  62916141600, #  local_start 1994-09-25 02:00:00 (Sun)
  62931866400, #    local_end 1995-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62931862800, #    utc_start 1995-03-26 01:00:00 (Sun)
  62947587600, #      utc_end 1995-09-24 01:00:00 (Sun)
  62931870000, #  local_start 1995-03-26 03:00:00 (Sun)
  62947594800, #    local_end 1995-09-24 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62947587600, #    utc_start 1995-09-24 01:00:00 (Sun)
  62963917200, #      utc_end 1996-03-31 01:00:00 (Sun)
  62947591200, #  local_start 1995-09-24 02:00:00 (Sun)
  62963920800, #    local_end 1996-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62963917200, #    utc_start 1996-03-31 01:00:00 (Sun)
  62982061200, #      utc_end 1996-10-27 01:00:00 (Sun)
  62963924400, #  local_start 1996-03-31 03:00:00 (Sun)
  62982068400, #    local_end 1996-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62982061200, #    utc_start 1996-10-27 01:00:00 (Sun)
  62995366800, #      utc_end 1997-03-30 01:00:00 (Sun)
  62982064800, #  local_start 1996-10-27 02:00:00 (Sun)
  62995370400, #    local_end 1997-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62995366800, #    utc_start 1997-03-30 01:00:00 (Sun)
  63013510800, #      utc_end 1997-10-26 01:00:00 (Sun)
  62995374000, #  local_start 1997-03-30 03:00:00 (Sun)
  63013518000, #    local_end 1997-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63013510800, #    utc_start 1997-10-26 01:00:00 (Sun)
  63026816400, #      utc_end 1998-03-29 01:00:00 (Sun)
  63013514400, #  local_start 1997-10-26 02:00:00 (Sun)
  63026820000, #    local_end 1998-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63026816400, #    utc_start 1998-03-29 01:00:00 (Sun)
  63044960400, #      utc_end 1998-10-25 01:00:00 (Sun)
  63026823600, #  local_start 1998-03-29 03:00:00 (Sun)
  63044967600, #    local_end 1998-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63044960400, #    utc_start 1998-10-25 01:00:00 (Sun)
  63058266000, #      utc_end 1999-03-28 01:00:00 (Sun)
  63044964000, #  local_start 1998-10-25 02:00:00 (Sun)
  63058269600, #    local_end 1999-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63058266000, #    utc_start 1999-03-28 01:00:00 (Sun)
  63077014800, #      utc_end 1999-10-31 01:00:00 (Sun)
  63058273200, #  local_start 1999-03-28 03:00:00 (Sun)
  63077022000, #    local_end 1999-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63077014800, #    utc_start 1999-10-31 01:00:00 (Sun)
  63089715600, #      utc_end 2000-03-26 01:00:00 (Sun)
  63077018400, #  local_start 1999-10-31 02:00:00 (Sun)
  63089719200, #    local_end 2000-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63089715600, #    utc_start 2000-03-26 01:00:00 (Sun)
  63108464400, #      utc_end 2000-10-29 01:00:00 (Sun)
  63089722800, #  local_start 2000-03-26 03:00:00 (Sun)
  63108471600, #    local_end 2000-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63108464400, #    utc_start 2000-10-29 01:00:00 (Sun)
  63121165200, #      utc_end 2001-03-25 01:00:00 (Sun)
  63108468000, #  local_start 2000-10-29 02:00:00 (Sun)
  63121168800, #    local_end 2001-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63121165200, #    utc_start 2001-03-25 01:00:00 (Sun)
  63139914000, #      utc_end 2001-10-28 01:00:00 (Sun)
  63121172400, #  local_start 2001-03-25 03:00:00 (Sun)
  63139921200, #    local_end 2001-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63139914000, #    utc_start 2001-10-28 01:00:00 (Sun)
  63153219600, #      utc_end 2002-03-31 01:00:00 (Sun)
  63139917600, #  local_start 2001-10-28 02:00:00 (Sun)
  63153223200, #    local_end 2002-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63153219600, #    utc_start 2002-03-31 01:00:00 (Sun)
  63171363600, #      utc_end 2002-10-27 01:00:00 (Sun)
  63153226800, #  local_start 2002-03-31 03:00:00 (Sun)
  63171370800, #    local_end 2002-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63171363600, #    utc_start 2002-10-27 01:00:00 (Sun)
  63184669200, #      utc_end 2003-03-30 01:00:00 (Sun)
  63171367200, #  local_start 2002-10-27 02:00:00 (Sun)
  63184672800, #    local_end 2003-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63184669200, #    utc_start 2003-03-30 01:00:00 (Sun)
  63202813200, #      utc_end 2003-10-26 01:00:00 (Sun)
  63184676400, #  local_start 2003-03-30 03:00:00 (Sun)
  63202820400, #    local_end 2003-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63202813200, #    utc_start 2003-10-26 01:00:00 (Sun)
  63216118800, #      utc_end 2004-03-28 01:00:00 (Sun)
  63202816800, #  local_start 2003-10-26 02:00:00 (Sun)
  63216122400, #    local_end 2004-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63216118800, #    utc_start 2004-03-28 01:00:00 (Sun)
  63234867600, #      utc_end 2004-10-31 01:00:00 (Sun)
  63216126000, #  local_start 2004-03-28 03:00:00 (Sun)
  63234874800, #    local_end 2004-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63234867600, #    utc_start 2004-10-31 01:00:00 (Sun)
  63247568400, #      utc_end 2005-03-27 01:00:00 (Sun)
  63234871200, #  local_start 2004-10-31 02:00:00 (Sun)
  63247572000, #    local_end 2005-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63247568400, #    utc_start 2005-03-27 01:00:00 (Sun)
  63266317200, #      utc_end 2005-10-30 01:00:00 (Sun)
  63247575600, #  local_start 2005-03-27 03:00:00 (Sun)
  63266324400, #    local_end 2005-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63266317200, #    utc_start 2005-10-30 01:00:00 (Sun)
  63279018000, #      utc_end 2006-03-26 01:00:00 (Sun)
  63266320800, #  local_start 2005-10-30 02:00:00 (Sun)
  63279021600, #    local_end 2006-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63279018000, #    utc_start 2006-03-26 01:00:00 (Sun)
  63297766800, #      utc_end 2006-10-29 01:00:00 (Sun)
  63279025200, #  local_start 2006-03-26 03:00:00 (Sun)
  63297774000, #    local_end 2006-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63297766800, #    utc_start 2006-10-29 01:00:00 (Sun)
  63310467600, #      utc_end 2007-03-25 01:00:00 (Sun)
  63297770400, #  local_start 2006-10-29 02:00:00 (Sun)
  63310471200, #    local_end 2007-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63310467600, #    utc_start 2007-03-25 01:00:00 (Sun)
  63329216400, #      utc_end 2007-10-28 01:00:00 (Sun)
  63310474800, #  local_start 2007-03-25 03:00:00 (Sun)
  63329223600, #    local_end 2007-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63329216400, #    utc_start 2007-10-28 01:00:00 (Sun)
  63342522000, #      utc_end 2008-03-30 01:00:00 (Sun)
  63329220000, #  local_start 2007-10-28 02:00:00 (Sun)
  63342525600, #    local_end 2008-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63342522000, #    utc_start 2008-03-30 01:00:00 (Sun)
  63360666000, #      utc_end 2008-10-26 01:00:00 (Sun)
  63342529200, #  local_start 2008-03-30 03:00:00 (Sun)
  63360673200, #    local_end 2008-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63360666000, #    utc_start 2008-10-26 01:00:00 (Sun)
  63373971600, #      utc_end 2009-03-29 01:00:00 (Sun)
  63360669600, #  local_start 2008-10-26 02:00:00 (Sun)
  63373975200, #    local_end 2009-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63373971600, #    utc_start 2009-03-29 01:00:00 (Sun)
  63392115600, #      utc_end 2009-10-25 01:00:00 (Sun)
  63373978800, #  local_start 2009-03-29 03:00:00 (Sun)
  63392122800, #    local_end 2009-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63392115600, #    utc_start 2009-10-25 01:00:00 (Sun)
  63405421200, #      utc_end 2010-03-28 01:00:00 (Sun)
  63392119200, #  local_start 2009-10-25 02:00:00 (Sun)
  63405424800, #    local_end 2010-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63405421200, #    utc_start 2010-03-28 01:00:00 (Sun)
  63424170000, #      utc_end 2010-10-31 01:00:00 (Sun)
  63405428400, #  local_start 2010-03-28 03:00:00 (Sun)
  63424177200, #    local_end 2010-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63424170000, #    utc_start 2010-10-31 01:00:00 (Sun)
  63436870800, #      utc_end 2011-03-27 01:00:00 (Sun)
  63424173600, #  local_start 2010-10-31 02:00:00 (Sun)
  63436874400, #    local_end 2011-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63436870800, #    utc_start 2011-03-27 01:00:00 (Sun)
  63455619600, #      utc_end 2011-10-30 01:00:00 (Sun)
  63436878000, #  local_start 2011-03-27 03:00:00 (Sun)
  63455626800, #    local_end 2011-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63455619600, #    utc_start 2011-10-30 01:00:00 (Sun)
  63468320400, #      utc_end 2012-03-25 01:00:00 (Sun)
  63455623200, #  local_start 2011-10-30 02:00:00 (Sun)
  63468324000, #    local_end 2012-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63468320400, #    utc_start 2012-03-25 01:00:00 (Sun)
  63487069200, #      utc_end 2012-10-28 01:00:00 (Sun)
  63468327600, #  local_start 2012-03-25 03:00:00 (Sun)
  63487076400, #    local_end 2012-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63487069200, #    utc_start 2012-10-28 01:00:00 (Sun)
  63500374800, #      utc_end 2013-03-31 01:00:00 (Sun)
  63487072800, #  local_start 2012-10-28 02:00:00 (Sun)
  63500378400, #    local_end 2013-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63500374800, #    utc_start 2013-03-31 01:00:00 (Sun)
  63518518800, #      utc_end 2013-10-27 01:00:00 (Sun)
  63500382000, #  local_start 2013-03-31 03:00:00 (Sun)
  63518526000, #    local_end 2013-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63518518800, #    utc_start 2013-10-27 01:00:00 (Sun)
  63531824400, #      utc_end 2014-03-30 01:00:00 (Sun)
  63518522400, #  local_start 2013-10-27 02:00:00 (Sun)
  63531828000, #    local_end 2014-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63531824400, #    utc_start 2014-03-30 01:00:00 (Sun)
  63549968400, #      utc_end 2014-10-26 01:00:00 (Sun)
  63531831600, #  local_start 2014-03-30 03:00:00 (Sun)
  63549975600, #    local_end 2014-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63549968400, #    utc_start 2014-10-26 01:00:00 (Sun)
  63563274000, #      utc_end 2015-03-29 01:00:00 (Sun)
  63549972000, #  local_start 2014-10-26 02:00:00 (Sun)
  63563277600, #    local_end 2015-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63563274000, #    utc_start 2015-03-29 01:00:00 (Sun)
  63581418000, #      utc_end 2015-10-25 01:00:00 (Sun)
  63563281200, #  local_start 2015-03-29 03:00:00 (Sun)
  63581425200, #    local_end 2015-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63581418000, #    utc_start 2015-10-25 01:00:00 (Sun)
  63594723600, #      utc_end 2016-03-27 01:00:00 (Sun)
  63581421600, #  local_start 2015-10-25 02:00:00 (Sun)
  63594727200, #    local_end 2016-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63594723600, #    utc_start 2016-03-27 01:00:00 (Sun)
  63613472400, #      utc_end 2016-10-30 01:00:00 (Sun)
  63594730800, #  local_start 2016-03-27 03:00:00 (Sun)
  63613479600, #    local_end 2016-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63613472400, #    utc_start 2016-10-30 01:00:00 (Sun)
  63626173200, #      utc_end 2017-03-26 01:00:00 (Sun)
  63613476000, #  local_start 2016-10-30 02:00:00 (Sun)
  63626176800, #    local_end 2017-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63626173200, #    utc_start 2017-03-26 01:00:00 (Sun)
  63644922000, #      utc_end 2017-10-29 01:00:00 (Sun)
  63626180400, #  local_start 2017-03-26 03:00:00 (Sun)
  63644929200, #    local_end 2017-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63644922000, #    utc_start 2017-10-29 01:00:00 (Sun)
  63657622800, #      utc_end 2018-03-25 01:00:00 (Sun)
  63644925600, #  local_start 2017-10-29 02:00:00 (Sun)
  63657626400, #    local_end 2018-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63657622800, #    utc_start 2018-03-25 01:00:00 (Sun)
  63676371600, #      utc_end 2018-10-28 01:00:00 (Sun)
  63657630000, #  local_start 2018-03-25 03:00:00 (Sun)
  63676378800, #    local_end 2018-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63676371600, #    utc_start 2018-10-28 01:00:00 (Sun)
  63689677200, #      utc_end 2019-03-31 01:00:00 (Sun)
  63676375200, #  local_start 2018-10-28 02:00:00 (Sun)
  63689680800, #    local_end 2019-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63689677200, #    utc_start 2019-03-31 01:00:00 (Sun)
  63707821200, #      utc_end 2019-10-27 01:00:00 (Sun)
  63689684400, #  local_start 2019-03-31 03:00:00 (Sun)
  63707828400, #    local_end 2019-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63707821200, #    utc_start 2019-10-27 01:00:00 (Sun)
  63721126800, #      utc_end 2020-03-29 01:00:00 (Sun)
  63707824800, #  local_start 2019-10-27 02:00:00 (Sun)
  63721130400, #    local_end 2020-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63721126800, #    utc_start 2020-03-29 01:00:00 (Sun)
  63739270800, #      utc_end 2020-10-25 01:00:00 (Sun)
  63721134000, #  local_start 2020-03-29 03:00:00 (Sun)
  63739278000, #    local_end 2020-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63739270800, #    utc_start 2020-10-25 01:00:00 (Sun)
  63752576400, #      utc_end 2021-03-28 01:00:00 (Sun)
  63739274400, #  local_start 2020-10-25 02:00:00 (Sun)
  63752580000, #    local_end 2021-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63752576400, #    utc_start 2021-03-28 01:00:00 (Sun)
  63771325200, #      utc_end 2021-10-31 01:00:00 (Sun)
  63752583600, #  local_start 2021-03-28 03:00:00 (Sun)
  63771332400, #    local_end 2021-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63771325200, #    utc_start 2021-10-31 01:00:00 (Sun)
  63784026000, #      utc_end 2022-03-27 01:00:00 (Sun)
  63771328800, #  local_start 2021-10-31 02:00:00 (Sun)
  63784029600, #    local_end 2022-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63784026000, #    utc_start 2022-03-27 01:00:00 (Sun)
  63802774800, #      utc_end 2022-10-30 01:00:00 (Sun)
  63784033200, #  local_start 2022-03-27 03:00:00 (Sun)
  63802782000, #    local_end 2022-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63802774800, #    utc_start 2022-10-30 01:00:00 (Sun)
  63815475600, #      utc_end 2023-03-26 01:00:00 (Sun)
  63802778400, #  local_start 2022-10-30 02:00:00 (Sun)
  63815479200, #    local_end 2023-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63815475600, #    utc_start 2023-03-26 01:00:00 (Sun)
  63834224400, #      utc_end 2023-10-29 01:00:00 (Sun)
  63815482800, #  local_start 2023-03-26 03:00:00 (Sun)
  63834231600, #    local_end 2023-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63834224400, #    utc_start 2023-10-29 01:00:00 (Sun)
  63847530000, #      utc_end 2024-03-31 01:00:00 (Sun)
  63834228000, #  local_start 2023-10-29 02:00:00 (Sun)
  63847533600, #    local_end 2024-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63847530000, #    utc_start 2024-03-31 01:00:00 (Sun)
  63865674000, #      utc_end 2024-10-27 01:00:00 (Sun)
  63847537200, #  local_start 2024-03-31 03:00:00 (Sun)
  63865681200, #    local_end 2024-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63865674000, #    utc_start 2024-10-27 01:00:00 (Sun)
  63878979600, #      utc_end 2025-03-30 01:00:00 (Sun)
  63865677600, #  local_start 2024-10-27 02:00:00 (Sun)
  63878983200, #    local_end 2025-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63878979600, #    utc_start 2025-03-30 01:00:00 (Sun)
  63897123600, #      utc_end 2025-10-26 01:00:00 (Sun)
  63878986800, #  local_start 2025-03-30 03:00:00 (Sun)
  63897130800, #    local_end 2025-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63897123600, #    utc_start 2025-10-26 01:00:00 (Sun)
  63910429200, #      utc_end 2026-03-29 01:00:00 (Sun)
  63897127200, #  local_start 2025-10-26 02:00:00 (Sun)
  63910432800, #    local_end 2026-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63910429200, #    utc_start 2026-03-29 01:00:00 (Sun)
  63928573200, #      utc_end 2026-10-25 01:00:00 (Sun)
  63910436400, #  local_start 2026-03-29 03:00:00 (Sun)
  63928580400, #    local_end 2026-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63928573200, #    utc_start 2026-10-25 01:00:00 (Sun)
  63941878800, #      utc_end 2027-03-28 01:00:00 (Sun)
  63928576800, #  local_start 2026-10-25 02:00:00 (Sun)
  63941882400, #    local_end 2027-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63941878800, #    utc_start 2027-03-28 01:00:00 (Sun)
  63960627600, #      utc_end 2027-10-31 01:00:00 (Sun)
  63941886000, #  local_start 2027-03-28 03:00:00 (Sun)
  63960634800, #    local_end 2027-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63960627600, #    utc_start 2027-10-31 01:00:00 (Sun)
  63973328400, #      utc_end 2028-03-26 01:00:00 (Sun)
  63960631200, #  local_start 2027-10-31 02:00:00 (Sun)
  63973332000, #    local_end 2028-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63973328400, #    utc_start 2028-03-26 01:00:00 (Sun)
  63992077200, #      utc_end 2028-10-29 01:00:00 (Sun)
  63973335600, #  local_start 2028-03-26 03:00:00 (Sun)
  63992084400, #    local_end 2028-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63992077200, #    utc_start 2028-10-29 01:00:00 (Sun)
  64004778000, #      utc_end 2029-03-25 01:00:00 (Sun)
  63992080800, #  local_start 2028-10-29 02:00:00 (Sun)
  64004781600, #    local_end 2029-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  64004778000, #    utc_start 2029-03-25 01:00:00 (Sun)
  64023526800, #      utc_end 2029-10-28 01:00:00 (Sun)
  64004785200, #  local_start 2029-03-25 03:00:00 (Sun)
  64023534000, #    local_end 2029-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  64023526800, #    utc_start 2029-10-28 01:00:00 (Sun)
  64036832400, #      utc_end 2030-03-31 01:00:00 (Sun)
  64023530400, #  local_start 2029-10-28 02:00:00 (Sun)
  64036836000, #    local_end 2030-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  64036832400, #    utc_start 2030-03-31 01:00:00 (Sun)
  64054976400, #      utc_end 2030-10-27 01:00:00 (Sun)
  64036839600, #  local_start 2030-03-31 03:00:00 (Sun)
  64054983600, #    local_end 2030-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {97}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { 3600 }
  
  my $last_observance = bless( {
    'format' => 'CE%sT',
    'gmtoff' => '1:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 723546,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 723546,
      'utc_rd_secs' => 0,
      'utc_year' => 1983
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => 3600,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 723545,
      'local_rd_secs' => 82800,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 723545,
      'utc_rd_secs' => 82800,
      'utc_year' => 1982
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '1:00u',
      'from' => '1996',
      'in' => 'Oct',
      'letter' => '',
      'name' => 'EU',
      'offset_from_std' => 0,
      'on' => 'lastSun',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '1:00u',
      'from' => '1981',
      'in' => 'Mar',
      'letter' => 'S',
      'name' => 'EU',
      'offset_from_std' => 3600,
      'on' => 'lastSun',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_EUROPE_GIBRALTAR

    $main::fatpacked{"DateTime/TimeZone/Europe/Helsinki.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_EUROPE_HELSINKI';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Europe::Helsinki;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Europe::Helsinki::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59245424411, #      utc_end 1878-05-30 22:20:11 (Thu)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59245430400, #    local_end 1878-05-31 00:00:00 (Fri)
  5989,
  0,
  'LMT',
      ],
      [
  59245424411, #    utc_start 1878-05-30 22:20:11 (Thu)
  60599744411, #      utc_end 1921-04-30 22:20:11 (Sat)
  59245430400, #  local_start 1878-05-31 00:00:00 (Fri)
  60599750400, #    local_end 1921-05-01 00:00:00 (Sun)
  5989,
  0,
  'HMT',
      ],
      [
  60599744411, #    utc_start 1921-04-30 22:20:11 (Sat)
  61260012000, #      utc_end 1942-04-02 22:00:00 (Thu)
  60599751611, #  local_start 1921-05-01 00:20:11 (Sun)
  61260019200, #    local_end 1942-04-03 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  61260012000, #    utc_start 1942-04-02 22:00:00 (Thu)
  61275909600, #      utc_end 1942-10-03 22:00:00 (Sat)
  61260022800, #  local_start 1942-04-03 01:00:00 (Fri)
  61275920400, #    local_end 1942-10-04 01:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  61275909600, #    utc_start 1942-10-03 22:00:00 (Sat)
  62490355200, #      utc_end 1981-03-29 00:00:00 (Sun)
  61275916800, #  local_start 1942-10-04 00:00:00 (Sun)
  62490362400, #    local_end 1981-03-29 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62490355200, #    utc_start 1981-03-29 00:00:00 (Sun)
  62506080000, #      utc_end 1981-09-27 00:00:00 (Sun)
  62490366000, #  local_start 1981-03-29 03:00:00 (Sun)
  62506090800, #    local_end 1981-09-27 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62506080000, #    utc_start 1981-09-27 00:00:00 (Sun)
  62521804800, #      utc_end 1982-03-28 00:00:00 (Sun)
  62506087200, #  local_start 1981-09-27 02:00:00 (Sun)
  62521812000, #    local_end 1982-03-28 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62521804800, #    utc_start 1982-03-28 00:00:00 (Sun)
  62537529600, #      utc_end 1982-09-26 00:00:00 (Sun)
  62521815600, #  local_start 1982-03-28 03:00:00 (Sun)
  62537540400, #    local_end 1982-09-26 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62537529600, #    utc_start 1982-09-26 00:00:00 (Sun)
  62545903200, #      utc_end 1982-12-31 22:00:00 (Fri)
  62537536800, #  local_start 1982-09-26 02:00:00 (Sun)
  62545910400, #    local_end 1983-01-01 00:00:00 (Sat)
  7200,
  0,
  'EET',
      ],
      [
  62545903200, #    utc_start 1982-12-31 22:00:00 (Fri)
  62553258000, #      utc_end 1983-03-27 01:00:00 (Sun)
  62545910400, #  local_start 1983-01-01 00:00:00 (Sat)
  62553265200, #    local_end 1983-03-27 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62553258000, #    utc_start 1983-03-27 01:00:00 (Sun)
  62568982800, #      utc_end 1983-09-25 01:00:00 (Sun)
  62553268800, #  local_start 1983-03-27 04:00:00 (Sun)
  62568993600, #    local_end 1983-09-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62568982800, #    utc_start 1983-09-25 01:00:00 (Sun)
  62584707600, #      utc_end 1984-03-25 01:00:00 (Sun)
  62568990000, #  local_start 1983-09-25 03:00:00 (Sun)
  62584714800, #    local_end 1984-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62584707600, #    utc_start 1984-03-25 01:00:00 (Sun)
  62601037200, #      utc_end 1984-09-30 01:00:00 (Sun)
  62584718400, #  local_start 1984-03-25 04:00:00 (Sun)
  62601048000, #    local_end 1984-09-30 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62601037200, #    utc_start 1984-09-30 01:00:00 (Sun)
  62616762000, #      utc_end 1985-03-31 01:00:00 (Sun)
  62601044400, #  local_start 1984-09-30 03:00:00 (Sun)
  62616769200, #    local_end 1985-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62616762000, #    utc_start 1985-03-31 01:00:00 (Sun)
  62632486800, #      utc_end 1985-09-29 01:00:00 (Sun)
  62616772800, #  local_start 1985-03-31 04:00:00 (Sun)
  62632497600, #    local_end 1985-09-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62632486800, #    utc_start 1985-09-29 01:00:00 (Sun)
  62648211600, #      utc_end 1986-03-30 01:00:00 (Sun)
  62632494000, #  local_start 1985-09-29 03:00:00 (Sun)
  62648218800, #    local_end 1986-03-30 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62648211600, #    utc_start 1986-03-30 01:00:00 (Sun)
  62663936400, #      utc_end 1986-09-28 01:00:00 (Sun)
  62648222400, #  local_start 1986-03-30 04:00:00 (Sun)
  62663947200, #    local_end 1986-09-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62663936400, #    utc_start 1986-09-28 01:00:00 (Sun)
  62679661200, #      utc_end 1987-03-29 01:00:00 (Sun)
  62663943600, #  local_start 1986-09-28 03:00:00 (Sun)
  62679668400, #    local_end 1987-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62679661200, #    utc_start 1987-03-29 01:00:00 (Sun)
  62695386000, #      utc_end 1987-09-27 01:00:00 (Sun)
  62679672000, #  local_start 1987-03-29 04:00:00 (Sun)
  62695396800, #    local_end 1987-09-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62695386000, #    utc_start 1987-09-27 01:00:00 (Sun)
  62711110800, #      utc_end 1988-03-27 01:00:00 (Sun)
  62695393200, #  local_start 1987-09-27 03:00:00 (Sun)
  62711118000, #    local_end 1988-03-27 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62711110800, #    utc_start 1988-03-27 01:00:00 (Sun)
  62726835600, #      utc_end 1988-09-25 01:00:00 (Sun)
  62711121600, #  local_start 1988-03-27 04:00:00 (Sun)
  62726846400, #    local_end 1988-09-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62726835600, #    utc_start 1988-09-25 01:00:00 (Sun)
  62742560400, #      utc_end 1989-03-26 01:00:00 (Sun)
  62726842800, #  local_start 1988-09-25 03:00:00 (Sun)
  62742567600, #    local_end 1989-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62742560400, #    utc_start 1989-03-26 01:00:00 (Sun)
  62758285200, #      utc_end 1989-09-24 01:00:00 (Sun)
  62742571200, #  local_start 1989-03-26 04:00:00 (Sun)
  62758296000, #    local_end 1989-09-24 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62758285200, #    utc_start 1989-09-24 01:00:00 (Sun)
  62774010000, #      utc_end 1990-03-25 01:00:00 (Sun)
  62758292400, #  local_start 1989-09-24 03:00:00 (Sun)
  62774017200, #    local_end 1990-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62774010000, #    utc_start 1990-03-25 01:00:00 (Sun)
  62790339600, #      utc_end 1990-09-30 01:00:00 (Sun)
  62774020800, #  local_start 1990-03-25 04:00:00 (Sun)
  62790350400, #    local_end 1990-09-30 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62790339600, #    utc_start 1990-09-30 01:00:00 (Sun)
  62806064400, #      utc_end 1991-03-31 01:00:00 (Sun)
  62790346800, #  local_start 1990-09-30 03:00:00 (Sun)
  62806071600, #    local_end 1991-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62806064400, #    utc_start 1991-03-31 01:00:00 (Sun)
  62821789200, #      utc_end 1991-09-29 01:00:00 (Sun)
  62806075200, #  local_start 1991-03-31 04:00:00 (Sun)
  62821800000, #    local_end 1991-09-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62821789200, #    utc_start 1991-09-29 01:00:00 (Sun)
  62837514000, #      utc_end 1992-03-29 01:00:00 (Sun)
  62821796400, #  local_start 1991-09-29 03:00:00 (Sun)
  62837521200, #    local_end 1992-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62837514000, #    utc_start 1992-03-29 01:00:00 (Sun)
  62853238800, #      utc_end 1992-09-27 01:00:00 (Sun)
  62837524800, #  local_start 1992-03-29 04:00:00 (Sun)
  62853249600, #    local_end 1992-09-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62853238800, #    utc_start 1992-09-27 01:00:00 (Sun)
  62868963600, #      utc_end 1993-03-28 01:00:00 (Sun)
  62853246000, #  local_start 1992-09-27 03:00:00 (Sun)
  62868970800, #    local_end 1993-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62868963600, #    utc_start 1993-03-28 01:00:00 (Sun)
  62884688400, #      utc_end 1993-09-26 01:00:00 (Sun)
  62868974400, #  local_start 1993-03-28 04:00:00 (Sun)
  62884699200, #    local_end 1993-09-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62884688400, #    utc_start 1993-09-26 01:00:00 (Sun)
  62900413200, #      utc_end 1994-03-27 01:00:00 (Sun)
  62884695600, #  local_start 1993-09-26 03:00:00 (Sun)
  62900420400, #    local_end 1994-03-27 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62900413200, #    utc_start 1994-03-27 01:00:00 (Sun)
  62916138000, #      utc_end 1994-09-25 01:00:00 (Sun)
  62900424000, #  local_start 1994-03-27 04:00:00 (Sun)
  62916148800, #    local_end 1994-09-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62916138000, #    utc_start 1994-09-25 01:00:00 (Sun)
  62931862800, #      utc_end 1995-03-26 01:00:00 (Sun)
  62916145200, #  local_start 1994-09-25 03:00:00 (Sun)
  62931870000, #    local_end 1995-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62931862800, #    utc_start 1995-03-26 01:00:00 (Sun)
  62947587600, #      utc_end 1995-09-24 01:00:00 (Sun)
  62931873600, #  local_start 1995-03-26 04:00:00 (Sun)
  62947598400, #    local_end 1995-09-24 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62947587600, #    utc_start 1995-09-24 01:00:00 (Sun)
  62963917200, #      utc_end 1996-03-31 01:00:00 (Sun)
  62947594800, #  local_start 1995-09-24 03:00:00 (Sun)
  62963924400, #    local_end 1996-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62963917200, #    utc_start 1996-03-31 01:00:00 (Sun)
  62982061200, #      utc_end 1996-10-27 01:00:00 (Sun)
  62963928000, #  local_start 1996-03-31 04:00:00 (Sun)
  62982072000, #    local_end 1996-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62982061200, #    utc_start 1996-10-27 01:00:00 (Sun)
  62995366800, #      utc_end 1997-03-30 01:00:00 (Sun)
  62982068400, #  local_start 1996-10-27 03:00:00 (Sun)
  62995374000, #    local_end 1997-03-30 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62995366800, #    utc_start 1997-03-30 01:00:00 (Sun)
  63013510800, #      utc_end 1997-10-26 01:00:00 (Sun)
  62995377600, #  local_start 1997-03-30 04:00:00 (Sun)
  63013521600, #    local_end 1997-10-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63013510800, #    utc_start 1997-10-26 01:00:00 (Sun)
  63026816400, #      utc_end 1998-03-29 01:00:00 (Sun)
  63013518000, #  local_start 1997-10-26 03:00:00 (Sun)
  63026823600, #    local_end 1998-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63026816400, #    utc_start 1998-03-29 01:00:00 (Sun)
  63044960400, #      utc_end 1998-10-25 01:00:00 (Sun)
  63026827200, #  local_start 1998-03-29 04:00:00 (Sun)
  63044971200, #    local_end 1998-10-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63044960400, #    utc_start 1998-10-25 01:00:00 (Sun)
  63058266000, #      utc_end 1999-03-28 01:00:00 (Sun)
  63044967600, #  local_start 1998-10-25 03:00:00 (Sun)
  63058273200, #    local_end 1999-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63058266000, #    utc_start 1999-03-28 01:00:00 (Sun)
  63077014800, #      utc_end 1999-10-31 01:00:00 (Sun)
  63058276800, #  local_start 1999-03-28 04:00:00 (Sun)
  63077025600, #    local_end 1999-10-31 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63077014800, #    utc_start 1999-10-31 01:00:00 (Sun)
  63089715600, #      utc_end 2000-03-26 01:00:00 (Sun)
  63077022000, #  local_start 1999-10-31 03:00:00 (Sun)
  63089722800, #    local_end 2000-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63089715600, #    utc_start 2000-03-26 01:00:00 (Sun)
  63108464400, #      utc_end 2000-10-29 01:00:00 (Sun)
  63089726400, #  local_start 2000-03-26 04:00:00 (Sun)
  63108475200, #    local_end 2000-10-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63108464400, #    utc_start 2000-10-29 01:00:00 (Sun)
  63121165200, #      utc_end 2001-03-25 01:00:00 (Sun)
  63108471600, #  local_start 2000-10-29 03:00:00 (Sun)
  63121172400, #    local_end 2001-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63121165200, #    utc_start 2001-03-25 01:00:00 (Sun)
  63139914000, #      utc_end 2001-10-28 01:00:00 (Sun)
  63121176000, #  local_start 2001-03-25 04:00:00 (Sun)
  63139924800, #    local_end 2001-10-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63139914000, #    utc_start 2001-10-28 01:00:00 (Sun)
  63153219600, #      utc_end 2002-03-31 01:00:00 (Sun)
  63139921200, #  local_start 2001-10-28 03:00:00 (Sun)
  63153226800, #    local_end 2002-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63153219600, #    utc_start 2002-03-31 01:00:00 (Sun)
  63171363600, #      utc_end 2002-10-27 01:00:00 (Sun)
  63153230400, #  local_start 2002-03-31 04:00:00 (Sun)
  63171374400, #    local_end 2002-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63171363600, #    utc_start 2002-10-27 01:00:00 (Sun)
  63184669200, #      utc_end 2003-03-30 01:00:00 (Sun)
  63171370800, #  local_start 2002-10-27 03:00:00 (Sun)
  63184676400, #    local_end 2003-03-30 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63184669200, #    utc_start 2003-03-30 01:00:00 (Sun)
  63202813200, #      utc_end 2003-10-26 01:00:00 (Sun)
  63184680000, #  local_start 2003-03-30 04:00:00 (Sun)
  63202824000, #    local_end 2003-10-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63202813200, #    utc_start 2003-10-26 01:00:00 (Sun)
  63216118800, #      utc_end 2004-03-28 01:00:00 (Sun)
  63202820400, #  local_start 2003-10-26 03:00:00 (Sun)
  63216126000, #    local_end 2004-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63216118800, #    utc_start 2004-03-28 01:00:00 (Sun)
  63234867600, #      utc_end 2004-10-31 01:00:00 (Sun)
  63216129600, #  local_start 2004-03-28 04:00:00 (Sun)
  63234878400, #    local_end 2004-10-31 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63234867600, #    utc_start 2004-10-31 01:00:00 (Sun)
  63247568400, #      utc_end 2005-03-27 01:00:00 (Sun)
  63234874800, #  local_start 2004-10-31 03:00:00 (Sun)
  63247575600, #    local_end 2005-03-27 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63247568400, #    utc_start 2005-03-27 01:00:00 (Sun)
  63266317200, #      utc_end 2005-10-30 01:00:00 (Sun)
  63247579200, #  local_start 2005-03-27 04:00:00 (Sun)
  63266328000, #    local_end 2005-10-30 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63266317200, #    utc_start 2005-10-30 01:00:00 (Sun)
  63279018000, #      utc_end 2006-03-26 01:00:00 (Sun)
  63266324400, #  local_start 2005-10-30 03:00:00 (Sun)
  63279025200, #    local_end 2006-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63279018000, #    utc_start 2006-03-26 01:00:00 (Sun)
  63297766800, #      utc_end 2006-10-29 01:00:00 (Sun)
  63279028800, #  local_start 2006-03-26 04:00:00 (Sun)
  63297777600, #    local_end 2006-10-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63297766800, #    utc_start 2006-10-29 01:00:00 (Sun)
  63310467600, #      utc_end 2007-03-25 01:00:00 (Sun)
  63297774000, #  local_start 2006-10-29 03:00:00 (Sun)
  63310474800, #    local_end 2007-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63310467600, #    utc_start 2007-03-25 01:00:00 (Sun)
  63329216400, #      utc_end 2007-10-28 01:00:00 (Sun)
  63310478400, #  local_start 2007-03-25 04:00:00 (Sun)
  63329227200, #    local_end 2007-10-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63329216400, #    utc_start 2007-10-28 01:00:00 (Sun)
  63342522000, #      utc_end 2008-03-30 01:00:00 (Sun)
  63329223600, #  local_start 2007-10-28 03:00:00 (Sun)
  63342529200, #    local_end 2008-03-30 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63342522000, #    utc_start 2008-03-30 01:00:00 (Sun)
  63360666000, #      utc_end 2008-10-26 01:00:00 (Sun)
  63342532800, #  local_start 2008-03-30 04:00:00 (Sun)
  63360676800, #    local_end 2008-10-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63360666000, #    utc_start 2008-10-26 01:00:00 (Sun)
  63373971600, #      utc_end 2009-03-29 01:00:00 (Sun)
  63360673200, #  local_start 2008-10-26 03:00:00 (Sun)
  63373978800, #    local_end 2009-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63373971600, #    utc_start 2009-03-29 01:00:00 (Sun)
  63392115600, #      utc_end 2009-10-25 01:00:00 (Sun)
  63373982400, #  local_start 2009-03-29 04:00:00 (Sun)
  63392126400, #    local_end 2009-10-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63392115600, #    utc_start 2009-10-25 01:00:00 (Sun)
  63405421200, #      utc_end 2010-03-28 01:00:00 (Sun)
  63392122800, #  local_start 2009-10-25 03:00:00 (Sun)
  63405428400, #    local_end 2010-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63405421200, #    utc_start 2010-03-28 01:00:00 (Sun)
  63424170000, #      utc_end 2010-10-31 01:00:00 (Sun)
  63405432000, #  local_start 2010-03-28 04:00:00 (Sun)
  63424180800, #    local_end 2010-10-31 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63424170000, #    utc_start 2010-10-31 01:00:00 (Sun)
  63436870800, #      utc_end 2011-03-27 01:00:00 (Sun)
  63424177200, #  local_start 2010-10-31 03:00:00 (Sun)
  63436878000, #    local_end 2011-03-27 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63436870800, #    utc_start 2011-03-27 01:00:00 (Sun)
  63455619600, #      utc_end 2011-10-30 01:00:00 (Sun)
  63436881600, #  local_start 2011-03-27 04:00:00 (Sun)
  63455630400, #    local_end 2011-10-30 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63455619600, #    utc_start 2011-10-30 01:00:00 (Sun)
  63468320400, #      utc_end 2012-03-25 01:00:00 (Sun)
  63455626800, #  local_start 2011-10-30 03:00:00 (Sun)
  63468327600, #    local_end 2012-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63468320400, #    utc_start 2012-03-25 01:00:00 (Sun)
  63487069200, #      utc_end 2012-10-28 01:00:00 (Sun)
  63468331200, #  local_start 2012-03-25 04:00:00 (Sun)
  63487080000, #    local_end 2012-10-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63487069200, #    utc_start 2012-10-28 01:00:00 (Sun)
  63500374800, #      utc_end 2013-03-31 01:00:00 (Sun)
  63487076400, #  local_start 2012-10-28 03:00:00 (Sun)
  63500382000, #    local_end 2013-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63500374800, #    utc_start 2013-03-31 01:00:00 (Sun)
  63518518800, #      utc_end 2013-10-27 01:00:00 (Sun)
  63500385600, #  local_start 2013-03-31 04:00:00 (Sun)
  63518529600, #    local_end 2013-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63518518800, #    utc_start 2013-10-27 01:00:00 (Sun)
  63531824400, #      utc_end 2014-03-30 01:00:00 (Sun)
  63518526000, #  local_start 2013-10-27 03:00:00 (Sun)
  63531831600, #    local_end 2014-03-30 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63531824400, #    utc_start 2014-03-30 01:00:00 (Sun)
  63549968400, #      utc_end 2014-10-26 01:00:00 (Sun)
  63531835200, #  local_start 2014-03-30 04:00:00 (Sun)
  63549979200, #    local_end 2014-10-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63549968400, #    utc_start 2014-10-26 01:00:00 (Sun)
  63563274000, #      utc_end 2015-03-29 01:00:00 (Sun)
  63549975600, #  local_start 2014-10-26 03:00:00 (Sun)
  63563281200, #    local_end 2015-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63563274000, #    utc_start 2015-03-29 01:00:00 (Sun)
  63581418000, #      utc_end 2015-10-25 01:00:00 (Sun)
  63563284800, #  local_start 2015-03-29 04:00:00 (Sun)
  63581428800, #    local_end 2015-10-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63581418000, #    utc_start 2015-10-25 01:00:00 (Sun)
  63594723600, #      utc_end 2016-03-27 01:00:00 (Sun)
  63581425200, #  local_start 2015-10-25 03:00:00 (Sun)
  63594730800, #    local_end 2016-03-27 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63594723600, #    utc_start 2016-03-27 01:00:00 (Sun)
  63613472400, #      utc_end 2016-10-30 01:00:00 (Sun)
  63594734400, #  local_start 2016-03-27 04:00:00 (Sun)
  63613483200, #    local_end 2016-10-30 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63613472400, #    utc_start 2016-10-30 01:00:00 (Sun)
  63626173200, #      utc_end 2017-03-26 01:00:00 (Sun)
  63613479600, #  local_start 2016-10-30 03:00:00 (Sun)
  63626180400, #    local_end 2017-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63626173200, #    utc_start 2017-03-26 01:00:00 (Sun)
  63644922000, #      utc_end 2017-10-29 01:00:00 (Sun)
  63626184000, #  local_start 2017-03-26 04:00:00 (Sun)
  63644932800, #    local_end 2017-10-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63644922000, #    utc_start 2017-10-29 01:00:00 (Sun)
  63657622800, #      utc_end 2018-03-25 01:00:00 (Sun)
  63644929200, #  local_start 2017-10-29 03:00:00 (Sun)
  63657630000, #    local_end 2018-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63657622800, #    utc_start 2018-03-25 01:00:00 (Sun)
  63676371600, #      utc_end 2018-10-28 01:00:00 (Sun)
  63657633600, #  local_start 2018-03-25 04:00:00 (Sun)
  63676382400, #    local_end 2018-10-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63676371600, #    utc_start 2018-10-28 01:00:00 (Sun)
  63689677200, #      utc_end 2019-03-31 01:00:00 (Sun)
  63676378800, #  local_start 2018-10-28 03:00:00 (Sun)
  63689684400, #    local_end 2019-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63689677200, #    utc_start 2019-03-31 01:00:00 (Sun)
  63707821200, #      utc_end 2019-10-27 01:00:00 (Sun)
  63689688000, #  local_start 2019-03-31 04:00:00 (Sun)
  63707832000, #    local_end 2019-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63707821200, #    utc_start 2019-10-27 01:00:00 (Sun)
  63721126800, #      utc_end 2020-03-29 01:00:00 (Sun)
  63707828400, #  local_start 2019-10-27 03:00:00 (Sun)
  63721134000, #    local_end 2020-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63721126800, #    utc_start 2020-03-29 01:00:00 (Sun)
  63739270800, #      utc_end 2020-10-25 01:00:00 (Sun)
  63721137600, #  local_start 2020-03-29 04:00:00 (Sun)
  63739281600, #    local_end 2020-10-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63739270800, #    utc_start 2020-10-25 01:00:00 (Sun)
  63752576400, #      utc_end 2021-03-28 01:00:00 (Sun)
  63739278000, #  local_start 2020-10-25 03:00:00 (Sun)
  63752583600, #    local_end 2021-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63752576400, #    utc_start 2021-03-28 01:00:00 (Sun)
  63771325200, #      utc_end 2021-10-31 01:00:00 (Sun)
  63752587200, #  local_start 2021-03-28 04:00:00 (Sun)
  63771336000, #    local_end 2021-10-31 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63771325200, #    utc_start 2021-10-31 01:00:00 (Sun)
  63784026000, #      utc_end 2022-03-27 01:00:00 (Sun)
  63771332400, #  local_start 2021-10-31 03:00:00 (Sun)
  63784033200, #    local_end 2022-03-27 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63784026000, #    utc_start 2022-03-27 01:00:00 (Sun)
  63802774800, #      utc_end 2022-10-30 01:00:00 (Sun)
  63784036800, #  local_start 2022-03-27 04:00:00 (Sun)
  63802785600, #    local_end 2022-10-30 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63802774800, #    utc_start 2022-10-30 01:00:00 (Sun)
  63815475600, #      utc_end 2023-03-26 01:00:00 (Sun)
  63802782000, #  local_start 2022-10-30 03:00:00 (Sun)
  63815482800, #    local_end 2023-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63815475600, #    utc_start 2023-03-26 01:00:00 (Sun)
  63834224400, #      utc_end 2023-10-29 01:00:00 (Sun)
  63815486400, #  local_start 2023-03-26 04:00:00 (Sun)
  63834235200, #    local_end 2023-10-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63834224400, #    utc_start 2023-10-29 01:00:00 (Sun)
  63847530000, #      utc_end 2024-03-31 01:00:00 (Sun)
  63834231600, #  local_start 2023-10-29 03:00:00 (Sun)
  63847537200, #    local_end 2024-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63847530000, #    utc_start 2024-03-31 01:00:00 (Sun)
  63865674000, #      utc_end 2024-10-27 01:00:00 (Sun)
  63847540800, #  local_start 2024-03-31 04:00:00 (Sun)
  63865684800, #    local_end 2024-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63865674000, #    utc_start 2024-10-27 01:00:00 (Sun)
  63878979600, #      utc_end 2025-03-30 01:00:00 (Sun)
  63865681200, #  local_start 2024-10-27 03:00:00 (Sun)
  63878986800, #    local_end 2025-03-30 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63878979600, #    utc_start 2025-03-30 01:00:00 (Sun)
  63897123600, #      utc_end 2025-10-26 01:00:00 (Sun)
  63878990400, #  local_start 2025-03-30 04:00:00 (Sun)
  63897134400, #    local_end 2025-10-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63897123600, #    utc_start 2025-10-26 01:00:00 (Sun)
  63910429200, #      utc_end 2026-03-29 01:00:00 (Sun)
  63897130800, #  local_start 2025-10-26 03:00:00 (Sun)
  63910436400, #    local_end 2026-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63910429200, #    utc_start 2026-03-29 01:00:00 (Sun)
  63928573200, #      utc_end 2026-10-25 01:00:00 (Sun)
  63910440000, #  local_start 2026-03-29 04:00:00 (Sun)
  63928584000, #    local_end 2026-10-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63928573200, #    utc_start 2026-10-25 01:00:00 (Sun)
  63941878800, #      utc_end 2027-03-28 01:00:00 (Sun)
  63928580400, #  local_start 2026-10-25 03:00:00 (Sun)
  63941886000, #    local_end 2027-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63941878800, #    utc_start 2027-03-28 01:00:00 (Sun)
  63960627600, #      utc_end 2027-10-31 01:00:00 (Sun)
  63941889600, #  local_start 2027-03-28 04:00:00 (Sun)
  63960638400, #    local_end 2027-10-31 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63960627600, #    utc_start 2027-10-31 01:00:00 (Sun)
  63973328400, #      utc_end 2028-03-26 01:00:00 (Sun)
  63960634800, #  local_start 2027-10-31 03:00:00 (Sun)
  63973335600, #    local_end 2028-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63973328400, #    utc_start 2028-03-26 01:00:00 (Sun)
  63992077200, #      utc_end 2028-10-29 01:00:00 (Sun)
  63973339200, #  local_start 2028-03-26 04:00:00 (Sun)
  63992088000, #    local_end 2028-10-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63992077200, #    utc_start 2028-10-29 01:00:00 (Sun)
  64004778000, #      utc_end 2029-03-25 01:00:00 (Sun)
  63992084400, #  local_start 2028-10-29 03:00:00 (Sun)
  64004785200, #    local_end 2029-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  64004778000, #    utc_start 2029-03-25 01:00:00 (Sun)
  64023526800, #      utc_end 2029-10-28 01:00:00 (Sun)
  64004788800, #  local_start 2029-03-25 04:00:00 (Sun)
  64023537600, #    local_end 2029-10-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  64023526800, #    utc_start 2029-10-28 01:00:00 (Sun)
  64036832400, #      utc_end 2030-03-31 01:00:00 (Sun)
  64023534000, #  local_start 2029-10-28 03:00:00 (Sun)
  64036839600, #    local_end 2030-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  64036832400, #    utc_start 2030-03-31 01:00:00 (Sun)
  64054976400, #      utc_end 2030-10-27 01:00:00 (Sun)
  64036843200, #  local_start 2030-03-31 04:00:00 (Sun)
  64054987200, #    local_end 2030-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {51}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { 7200 }
  
  my $last_observance = bless( {
    'format' => 'EE%sT',
    'gmtoff' => '2:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 723911,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 723911,
      'utc_rd_secs' => 0,
      'utc_year' => 1984
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => 7200,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 723910,
      'local_rd_secs' => 79200,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 723910,
      'utc_rd_secs' => 79200,
      'utc_year' => 1983
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '1:00u',
      'from' => '1981',
      'in' => 'Mar',
      'letter' => 'S',
      'name' => 'EU',
      'offset_from_std' => 3600,
      'on' => 'lastSun',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '1:00u',
      'from' => '1996',
      'in' => 'Oct',
      'letter' => '',
      'name' => 'EU',
      'offset_from_std' => 0,
      'on' => 'lastSun',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_EUROPE_HELSINKI

    $main::fatpacked{"DateTime/TimeZone/Europe/Istanbul.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_EUROPE_ISTANBUL';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Europe::Istanbul;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Europe::Istanbul::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59295535448, #      utc_end 1879-12-31 22:04:08 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59295542400, #    local_end 1880-01-01 00:00:00 (Thu)
  6952,
  0,
  'LMT',
      ],
      [
  59295535448, #    utc_start 1879-12-31 22:04:08 (Wed)
  60265807384, #      utc_end 1910-09-30 22:03:04 (Fri)
  59295542464, #  local_start 1880-01-01 00:01:04 (Thu)
  60265814400, #    local_end 1910-10-01 00:00:00 (Sat)
  7016,
  0,
  'IMT',
      ],
      [
  60265807384, #    utc_start 1910-09-30 22:03:04 (Fri)
  60441976800, #      utc_end 1916-04-30 22:00:00 (Sun)
  60265814584, #  local_start 1910-10-01 00:03:04 (Sat)
  60441984000, #    local_end 1916-05-01 00:00:00 (Mon)
  7200,
  0,
  'EET',
      ],
      [
  60441976800, #    utc_start 1916-04-30 22:00:00 (Sun)
  60455192400, #      utc_end 1916-09-30 21:00:00 (Sat)
  60441987600, #  local_start 1916-05-01 01:00:00 (Mon)
  60455203200, #    local_end 1916-10-01 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  60455192400, #    utc_start 1916-09-30 21:00:00 (Sat)
  60565269600, #      utc_end 1920-03-27 22:00:00 (Sat)
  60455199600, #  local_start 1916-09-30 23:00:00 (Sat)
  60565276800, #    local_end 1920-03-28 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  60565269600, #    utc_start 1920-03-27 22:00:00 (Sat)
  60583496400, #      utc_end 1920-10-24 21:00:00 (Sun)
  60565280400, #  local_start 1920-03-28 01:00:00 (Sun)
  60583507200, #    local_end 1920-10-25 00:00:00 (Mon)
  10800,
  1,
  'EEST',
      ],
      [
  60583496400, #    utc_start 1920-10-24 21:00:00 (Sun)
  60597324000, #      utc_end 1921-04-02 22:00:00 (Sat)
  60583503600, #  local_start 1920-10-24 23:00:00 (Sun)
  60597331200, #    local_end 1921-04-03 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  60597324000, #    utc_start 1921-04-02 22:00:00 (Sat)
  60613131600, #      utc_end 1921-10-02 21:00:00 (Sun)
  60597334800, #  local_start 1921-04-03 01:00:00 (Sun)
  60613142400, #    local_end 1921-10-03 00:00:00 (Mon)
  10800,
  1,
  'EEST',
      ],
      [
  60613131600, #    utc_start 1921-10-02 21:00:00 (Sun)
  60628168800, #      utc_end 1922-03-25 22:00:00 (Sat)
  60613138800, #  local_start 1921-10-02 23:00:00 (Sun)
  60628176000, #    local_end 1922-03-26 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  60628168800, #    utc_start 1922-03-25 22:00:00 (Sat)
  60645099600, #      utc_end 1922-10-07 21:00:00 (Sat)
  60628179600, #  local_start 1922-03-26 01:00:00 (Sun)
  60645110400, #    local_end 1922-10-08 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  60645099600, #    utc_start 1922-10-07 21:00:00 (Sat)
  60695474400, #      utc_end 1924-05-12 22:00:00 (Mon)
  60645106800, #  local_start 1922-10-07 23:00:00 (Sat)
  60695481600, #    local_end 1924-05-13 00:00:00 (Tue)
  7200,
  0,
  'EET',
      ],
      [
  60695474400, #    utc_start 1924-05-12 22:00:00 (Mon)
  60707653200, #      utc_end 1924-09-30 21:00:00 (Tue)
  60695485200, #  local_start 1924-05-13 01:00:00 (Tue)
  60707664000, #    local_end 1924-10-01 00:00:00 (Wed)
  10800,
  1,
  'EEST',
      ],
      [
  60707653200, #    utc_start 1924-09-30 21:00:00 (Tue)
  60725973600, #      utc_end 1925-04-30 22:00:00 (Thu)
  60707660400, #  local_start 1924-09-30 23:00:00 (Tue)
  60725980800, #    local_end 1925-05-01 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  60725973600, #    utc_start 1925-04-30 22:00:00 (Thu)
  60739189200, #      utc_end 1925-09-30 21:00:00 (Wed)
  60725984400, #  local_start 1925-05-01 01:00:00 (Fri)
  60739200000, #    local_end 1925-10-01 00:00:00 (Thu)
  10800,
  1,
  'EEST',
      ],
      [
  60739189200, #    utc_start 1925-09-30 21:00:00 (Wed)
  61204543200, #      utc_end 1940-06-29 22:00:00 (Sat)
  60739196400, #  local_start 1925-09-30 23:00:00 (Wed)
  61204550400, #    local_end 1940-06-30 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  61204543200, #    utc_start 1940-06-29 22:00:00 (Sat)
  61212920400, #      utc_end 1940-10-04 21:00:00 (Fri)
  61204554000, #  local_start 1940-06-30 01:00:00 (Sun)
  61212931200, #    local_end 1940-10-05 00:00:00 (Sat)
  10800,
  1,
  'EEST',
      ],
      [
  61212920400, #    utc_start 1940-10-04 21:00:00 (Fri)
  61217848800, #      utc_end 1940-11-30 22:00:00 (Sat)
  61212927600, #  local_start 1940-10-04 23:00:00 (Fri)
  61217856000, #    local_end 1940-12-01 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  61217848800, #    utc_start 1940-11-30 22:00:00 (Sat)
  61243246800, #      utc_end 1941-09-20 21:00:00 (Sat)
  61217859600, #  local_start 1940-12-01 01:00:00 (Sun)
  61243257600, #    local_end 1941-09-21 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  61243246800, #    utc_start 1941-09-20 21:00:00 (Sat)
  61259839200, #      utc_end 1942-03-31 22:00:00 (Tue)
  61243254000, #  local_start 1941-09-20 23:00:00 (Sat)
  61259846400, #    local_end 1942-04-01 00:00:00 (Wed)
  7200,
  0,
  'EET',
      ],
      [
  61259839200, #    utc_start 1942-03-31 22:00:00 (Tue)
  61278325200, #      utc_end 1942-10-31 21:00:00 (Sat)
  61259850000, #  local_start 1942-04-01 01:00:00 (Wed)
  61278336000, #    local_end 1942-11-01 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  61278325200, #    utc_start 1942-10-31 21:00:00 (Sat)
  61354620000, #      utc_end 1945-04-01 22:00:00 (Sun)
  61278332400, #  local_start 1942-10-31 23:00:00 (Sat)
  61354627200, #    local_end 1945-04-02 00:00:00 (Mon)
  7200,
  0,
  'EET',
      ],
      [
  61354620000, #    utc_start 1945-04-01 22:00:00 (Sun)
  61370946000, #      utc_end 1945-10-07 21:00:00 (Sun)
  61354630800, #  local_start 1945-04-02 01:00:00 (Mon)
  61370956800, #    local_end 1945-10-08 00:00:00 (Mon)
  10800,
  1,
  'EEST',
      ],
      [
  61370946000, #    utc_start 1945-10-07 21:00:00 (Sun)
  61391340000, #      utc_end 1946-05-31 22:00:00 (Fri)
  61370953200, #  local_start 1945-10-07 23:00:00 (Sun)
  61391347200, #    local_end 1946-06-01 00:00:00 (Sat)
  7200,
  0,
  'EET',
      ],
      [
  61391340000, #    utc_start 1946-05-31 22:00:00 (Fri)
  61401877200, #      utc_end 1946-09-30 21:00:00 (Mon)
  61391350800, #  local_start 1946-06-01 01:00:00 (Sat)
  61401888000, #    local_end 1946-10-01 00:00:00 (Tue)
  10800,
  1,
  'EEST',
      ],
      [
  61401877200, #    utc_start 1946-09-30 21:00:00 (Mon)
  61419247200, #      utc_end 1947-04-19 22:00:00 (Sat)
  61401884400, #  local_start 1946-09-30 23:00:00 (Mon)
  61419254400, #    local_end 1947-04-20 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  61419247200, #    utc_start 1947-04-19 22:00:00 (Sat)
  61433758800, #      utc_end 1947-10-04 21:00:00 (Sat)
  61419258000, #  local_start 1947-04-20 01:00:00 (Sun)
  61433769600, #    local_end 1947-10-05 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  61433758800, #    utc_start 1947-10-04 21:00:00 (Sat)
  61450696800, #      utc_end 1948-04-17 22:00:00 (Sat)
  61433766000, #  local_start 1947-10-04 23:00:00 (Sat)
  61450704000, #    local_end 1948-04-18 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  61450696800, #    utc_start 1948-04-17 22:00:00 (Sat)
  61465208400, #      utc_end 1948-10-02 21:00:00 (Sat)
  61450707600, #  local_start 1948-04-18 01:00:00 (Sun)
  61465219200, #    local_end 1948-10-03 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  61465208400, #    utc_start 1948-10-02 21:00:00 (Sat)
  61481541600, #      utc_end 1949-04-09 22:00:00 (Sat)
  61465215600, #  local_start 1948-10-02 23:00:00 (Sat)
  61481548800, #    local_end 1949-04-10 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  61481541600, #    utc_start 1949-04-09 22:00:00 (Sat)
  61496658000, #      utc_end 1949-10-01 21:00:00 (Sat)
  61481552400, #  local_start 1949-04-10 01:00:00 (Sun)
  61496668800, #    local_end 1949-10-02 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  61496658000, #    utc_start 1949-10-01 21:00:00 (Sat)
  61513855200, #      utc_end 1950-04-18 22:00:00 (Tue)
  61496665200, #  local_start 1949-10-01 23:00:00 (Sat)
  61513862400, #    local_end 1950-04-19 00:00:00 (Wed)
  7200,
  0,
  'EET',
      ],
      [
  61513855200, #    utc_start 1950-04-18 22:00:00 (Tue)
  61528712400, #      utc_end 1950-10-07 21:00:00 (Sat)
  61513866000, #  local_start 1950-04-19 01:00:00 (Wed)
  61528723200, #    local_end 1950-10-08 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  61528712400, #    utc_start 1950-10-07 21:00:00 (Sat)
  61545650400, #      utc_end 1951-04-21 22:00:00 (Sat)
  61528719600, #  local_start 1950-10-07 23:00:00 (Sat)
  61545657600, #    local_end 1951-04-22 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  61545650400, #    utc_start 1951-04-21 22:00:00 (Sat)
  61560248400, #      utc_end 1951-10-07 21:00:00 (Sun)
  61545661200, #  local_start 1951-04-22 01:00:00 (Sun)
  61560259200, #    local_end 1951-10-08 00:00:00 (Mon)
  10800,
  1,
  'EEST',
      ],
      [
  61560248400, #    utc_start 1951-10-07 21:00:00 (Sun)
  61900063200, #      utc_end 1962-07-14 22:00:00 (Sat)
  61560255600, #  local_start 1951-10-07 23:00:00 (Sun)
  61900070400, #    local_end 1962-07-15 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  61900063200, #    utc_start 1962-07-14 22:00:00 (Sat)
  61907403600, #      utc_end 1962-10-07 21:00:00 (Sun)
  61900074000, #  local_start 1962-07-15 01:00:00 (Sun)
  61907414400, #    local_end 1962-10-08 00:00:00 (Mon)
  10800,
  1,
  'EEST',
      ],
      [
  61907403600, #    utc_start 1962-10-07 21:00:00 (Sun)
  61957951200, #      utc_end 1964-05-14 22:00:00 (Thu)
  61907410800, #  local_start 1962-10-07 23:00:00 (Sun)
  61957958400, #    local_end 1964-05-15 00:00:00 (Fri)
  7200,
  0,
  'EET',
      ],
      [
  61957951200, #    utc_start 1964-05-14 22:00:00 (Thu)
  61969957200, #      utc_end 1964-09-30 21:00:00 (Wed)
  61957962000, #  local_start 1964-05-15 01:00:00 (Fri)
  61969968000, #    local_end 1964-10-01 00:00:00 (Thu)
  10800,
  1,
  'EEST',
      ],
      [
  61969957200, #    utc_start 1964-09-30 21:00:00 (Wed)
  62146216800, #      utc_end 1970-05-02 22:00:00 (Sat)
  61969964400, #  local_start 1964-09-30 23:00:00 (Wed)
  62146224000, #    local_end 1970-05-03 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62146216800, #    utc_start 1970-05-02 22:00:00 (Sat)
  62159518800, #      utc_end 1970-10-03 21:00:00 (Sat)
  62146227600, #  local_start 1970-05-03 01:00:00 (Sun)
  62159529600, #    local_end 1970-10-04 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62159518800, #    utc_start 1970-10-03 21:00:00 (Sat)
  62177666400, #      utc_end 1971-05-01 22:00:00 (Sat)
  62159526000, #  local_start 1970-10-03 23:00:00 (Sat)
  62177673600, #    local_end 1971-05-02 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62177666400, #    utc_start 1971-05-01 22:00:00 (Sat)
  62190968400, #      utc_end 1971-10-02 21:00:00 (Sat)
  62177677200, #  local_start 1971-05-02 01:00:00 (Sun)
  62190979200, #    local_end 1971-10-03 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62190968400, #    utc_start 1971-10-02 21:00:00 (Sat)
  62209720800, #      utc_end 1972-05-06 22:00:00 (Sat)
  62190975600, #  local_start 1971-10-02 23:00:00 (Sat)
  62209728000, #    local_end 1972-05-07 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62209720800, #    utc_start 1972-05-06 22:00:00 (Sat)
  62223022800, #      utc_end 1972-10-07 21:00:00 (Sat)
  62209731600, #  local_start 1972-05-07 01:00:00 (Sun)
  62223033600, #    local_end 1972-10-08 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62223022800, #    utc_start 1972-10-07 21:00:00 (Sat)
  62243593200, #      utc_end 1973-06-02 23:00:00 (Sat)
  62223030000, #  local_start 1972-10-07 23:00:00 (Sat)
  62243600400, #    local_end 1973-06-03 01:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62243593200, #    utc_start 1973-06-02 23:00:00 (Sat)
  62256902400, #      utc_end 1973-11-04 00:00:00 (Sun)
  62243604000, #  local_start 1973-06-03 02:00:00 (Sun)
  62256913200, #    local_end 1973-11-04 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62256902400, #    utc_start 1973-11-04 00:00:00 (Sun)
  62269603200, #      utc_end 1974-03-31 00:00:00 (Sun)
  62256909600, #  local_start 1973-11-04 02:00:00 (Sun)
  62269610400, #    local_end 1974-03-31 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62269603200, #    utc_start 1974-03-31 00:00:00 (Sun)
  62288359200, #      utc_end 1974-11-03 02:00:00 (Sun)
  62269614000, #  local_start 1974-03-31 03:00:00 (Sun)
  62288370000, #    local_end 1974-11-03 05:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62288359200, #    utc_start 1974-11-03 02:00:00 (Sun)
  62301045600, #      utc_end 1975-03-29 22:00:00 (Sat)
  62288366400, #  local_start 1974-11-03 04:00:00 (Sun)
  62301052800, #    local_end 1975-03-30 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62301045600, #    utc_start 1975-03-29 22:00:00 (Sat)
  62319186000, #      utc_end 1975-10-25 21:00:00 (Sat)
  62301056400, #  local_start 1975-03-30 01:00:00 (Sun)
  62319196800, #    local_end 1975-10-26 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62319186000, #    utc_start 1975-10-25 21:00:00 (Sat)
  62338111200, #      utc_end 1976-05-31 22:00:00 (Mon)
  62319193200, #  local_start 1975-10-25 23:00:00 (Sat)
  62338118400, #    local_end 1976-06-01 00:00:00 (Tue)
  7200,
  0,
  'EET',
      ],
      [
  62338111200, #    utc_start 1976-05-31 22:00:00 (Mon)
  62351240400, #      utc_end 1976-10-30 21:00:00 (Sat)
  62338122000, #  local_start 1976-06-01 01:00:00 (Tue)
  62351251200, #    local_end 1976-10-31 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62351240400, #    utc_start 1976-10-30 21:00:00 (Sat)
  62364549600, #      utc_end 1977-04-02 22:00:00 (Sat)
  62351247600, #  local_start 1976-10-30 23:00:00 (Sat)
  62364556800, #    local_end 1977-04-03 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62364549600, #    utc_start 1977-04-02 22:00:00 (Sat)
  62381480400, #      utc_end 1977-10-15 21:00:00 (Sat)
  62364560400, #  local_start 1977-04-03 01:00:00 (Sun)
  62381491200, #    local_end 1977-10-16 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62381480400, #    utc_start 1977-10-15 21:00:00 (Sat)
  62395999200, #      utc_end 1978-04-01 22:00:00 (Sat)
  62381487600, #  local_start 1977-10-15 23:00:00 (Sat)
  62396006400, #    local_end 1978-04-02 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62395999200, #    utc_start 1978-04-01 22:00:00 (Sat)
  62412930000, #      utc_end 1978-10-14 21:00:00 (Sat)
  62396010000, #  local_start 1978-04-02 01:00:00 (Sun)
  62412940800, #    local_end 1978-10-15 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62412930000, #    utc_start 1978-10-14 21:00:00 (Sat)
  62427452400, #      utc_end 1979-03-31 23:00:00 (Sat)
  62412944400, #  local_start 1978-10-15 01:00:00 (Sun)
  62427466800, #    local_end 1979-04-01 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  62427452400, #    utc_start 1979-03-31 23:00:00 (Sat)
  62444462400, #      utc_end 1979-10-14 20:00:00 (Sun)
  62427466800, #  local_start 1979-04-01 03:00:00 (Sun)
  62444476800, #    local_end 1979-10-15 00:00:00 (Mon)
  14400,
  1,
  '+04',
      ],
      [
  62444462400, #    utc_start 1979-10-14 20:00:00 (Sun)
  62459510400, #      utc_end 1980-04-06 00:00:00 (Sun)
  62444473200, #  local_start 1979-10-14 23:00:00 (Sun)
  62459521200, #    local_end 1980-04-06 03:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  62459510400, #    utc_start 1980-04-06 00:00:00 (Sun)
  62475912000, #      utc_end 1980-10-12 20:00:00 (Sun)
  62459524800, #  local_start 1980-04-06 04:00:00 (Sun)
  62475926400, #    local_end 1980-10-13 00:00:00 (Mon)
  14400,
  1,
  '+04',
      ],
      [
  62475912000, #    utc_start 1980-10-12 20:00:00 (Sun)
  62490355200, #      utc_end 1981-03-29 00:00:00 (Sun)
  62475922800, #  local_start 1980-10-12 23:00:00 (Sun)
  62490366000, #    local_end 1981-03-29 03:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  62490355200, #    utc_start 1981-03-29 00:00:00 (Sun)
  62507361600, #      utc_end 1981-10-11 20:00:00 (Sun)
  62490369600, #  local_start 1981-03-29 04:00:00 (Sun)
  62507376000, #    local_end 1981-10-12 00:00:00 (Mon)
  14400,
  1,
  '+04',
      ],
      [
  62507361600, #    utc_start 1981-10-11 20:00:00 (Sun)
  62521804800, #      utc_end 1982-03-28 00:00:00 (Sun)
  62507372400, #  local_start 1981-10-11 23:00:00 (Sun)
  62521815600, #    local_end 1982-03-28 03:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  62521804800, #    utc_start 1982-03-28 00:00:00 (Sun)
  62538811200, #      utc_end 1982-10-10 20:00:00 (Sun)
  62521819200, #  local_start 1982-03-28 04:00:00 (Sun)
  62538825600, #    local_end 1982-10-11 00:00:00 (Mon)
  14400,
  1,
  '+04',
      ],
      [
  62538811200, #    utc_start 1982-10-10 20:00:00 (Sun)
  62564130000, #      utc_end 1983-07-30 21:00:00 (Sat)
  62538822000, #  local_start 1982-10-10 23:00:00 (Sun)
  62564140800, #    local_end 1983-07-31 00:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  62564130000, #    utc_start 1983-07-30 21:00:00 (Sat)
  62569569600, #      utc_end 1983-10-01 20:00:00 (Sat)
  62564144400, #  local_start 1983-07-31 01:00:00 (Sun)
  62569584000, #    local_end 1983-10-02 00:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  62569569600, #    utc_start 1983-10-01 20:00:00 (Sat)
  62618475600, #      utc_end 1985-04-19 21:00:00 (Fri)
  62569580400, #  local_start 1983-10-01 23:00:00 (Sat)
  62618486400, #    local_end 1985-04-20 00:00:00 (Sat)
  10800,
  0,
  '+03',
      ],
      [
  62618475600, #    utc_start 1985-04-19 21:00:00 (Fri)
  62632386000, #      utc_end 1985-09-27 21:00:00 (Fri)
  62618486400, #  local_start 1985-04-20 00:00:00 (Sat)
  62632396800, #    local_end 1985-09-28 00:00:00 (Sat)
  10800,
  1,
  'EEST',
      ],
      [
  62632386000, #    utc_start 1985-09-27 21:00:00 (Fri)
  62648204400, #      utc_end 1986-03-29 23:00:00 (Sat)
  62632393200, #  local_start 1985-09-27 23:00:00 (Fri)
  62648211600, #    local_end 1986-03-30 01:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62648204400, #    utc_start 1986-03-29 23:00:00 (Sat)
  62663929200, #      utc_end 1986-09-27 23:00:00 (Sat)
  62648215200, #  local_start 1986-03-30 02:00:00 (Sun)
  62663940000, #    local_end 1986-09-28 02:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62663929200, #    utc_start 1986-09-27 23:00:00 (Sat)
  62679654000, #      utc_end 1987-03-28 23:00:00 (Sat)
  62663936400, #  local_start 1986-09-28 01:00:00 (Sun)
  62679661200, #    local_end 1987-03-29 01:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62679654000, #    utc_start 1987-03-28 23:00:00 (Sat)
  62695378800, #      utc_end 1987-09-26 23:00:00 (Sat)
  62679664800, #  local_start 1987-03-29 02:00:00 (Sun)
  62695389600, #    local_end 1987-09-27 02:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62695378800, #    utc_start 1987-09-26 23:00:00 (Sat)
  62711103600, #      utc_end 1988-03-26 23:00:00 (Sat)
  62695386000, #  local_start 1987-09-27 01:00:00 (Sun)
  62711110800, #    local_end 1988-03-27 01:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62711103600, #    utc_start 1988-03-26 23:00:00 (Sat)
  62726828400, #      utc_end 1988-09-24 23:00:00 (Sat)
  62711114400, #  local_start 1988-03-27 02:00:00 (Sun)
  62726839200, #    local_end 1988-09-25 02:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62726828400, #    utc_start 1988-09-24 23:00:00 (Sat)
  62742553200, #      utc_end 1989-03-25 23:00:00 (Sat)
  62726835600, #  local_start 1988-09-25 01:00:00 (Sun)
  62742560400, #    local_end 1989-03-26 01:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62742553200, #    utc_start 1989-03-25 23:00:00 (Sat)
  62758278000, #      utc_end 1989-09-23 23:00:00 (Sat)
  62742564000, #  local_start 1989-03-26 02:00:00 (Sun)
  62758288800, #    local_end 1989-09-24 02:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62758278000, #    utc_start 1989-09-23 23:00:00 (Sat)
  62774002800, #      utc_end 1990-03-24 23:00:00 (Sat)
  62758285200, #  local_start 1989-09-24 01:00:00 (Sun)
  62774010000, #    local_end 1990-03-25 01:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62774002800, #    utc_start 1990-03-24 23:00:00 (Sat)
  62790332400, #      utc_end 1990-09-29 23:00:00 (Sat)
  62774013600, #  local_start 1990-03-25 02:00:00 (Sun)
  62790343200, #    local_end 1990-09-30 02:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62790332400, #    utc_start 1990-09-29 23:00:00 (Sat)
  62806057200, #      utc_end 1991-03-30 23:00:00 (Sat)
  62790339600, #  local_start 1990-09-30 01:00:00 (Sun)
  62806064400, #    local_end 1991-03-31 01:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62806057200, #    utc_start 1991-03-30 23:00:00 (Sat)
  62821782000, #      utc_end 1991-09-28 23:00:00 (Sat)
  62806068000, #  local_start 1991-03-31 02:00:00 (Sun)
  62821792800, #    local_end 1991-09-29 02:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62821782000, #    utc_start 1991-09-28 23:00:00 (Sat)
  62837506800, #      utc_end 1992-03-28 23:00:00 (Sat)
  62821789200, #  local_start 1991-09-29 01:00:00 (Sun)
  62837514000, #    local_end 1992-03-29 01:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62837506800, #    utc_start 1992-03-28 23:00:00 (Sat)
  62853231600, #      utc_end 1992-09-26 23:00:00 (Sat)
  62837517600, #  local_start 1992-03-29 02:00:00 (Sun)
  62853242400, #    local_end 1992-09-27 02:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62853231600, #    utc_start 1992-09-26 23:00:00 (Sat)
  62868956400, #      utc_end 1993-03-27 23:00:00 (Sat)
  62853238800, #  local_start 1992-09-27 01:00:00 (Sun)
  62868963600, #    local_end 1993-03-28 01:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62868956400, #    utc_start 1993-03-27 23:00:00 (Sat)
  62884681200, #      utc_end 1993-09-25 23:00:00 (Sat)
  62868967200, #  local_start 1993-03-28 02:00:00 (Sun)
  62884692000, #    local_end 1993-09-26 02:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62884681200, #    utc_start 1993-09-25 23:00:00 (Sat)
  62899801200, #      utc_end 1994-03-19 23:00:00 (Sat)
  62884688400, #  local_start 1993-09-26 01:00:00 (Sun)
  62899808400, #    local_end 1994-03-20 01:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62899801200, #    utc_start 1994-03-19 23:00:00 (Sat)
  62916130800, #      utc_end 1994-09-24 23:00:00 (Sat)
  62899812000, #  local_start 1994-03-20 02:00:00 (Sun)
  62916141600, #    local_end 1994-09-25 02:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62916130800, #    utc_start 1994-09-24 23:00:00 (Sat)
  62931855600, #      utc_end 1995-03-25 23:00:00 (Sat)
  62916138000, #  local_start 1994-09-25 01:00:00 (Sun)
  62931862800, #    local_end 1995-03-26 01:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62931855600, #    utc_start 1995-03-25 23:00:00 (Sat)
  62947580400, #      utc_end 1995-09-23 23:00:00 (Sat)
  62931866400, #  local_start 1995-03-26 02:00:00 (Sun)
  62947591200, #    local_end 1995-09-24 02:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62947580400, #    utc_start 1995-09-23 23:00:00 (Sat)
  62963910000, #      utc_end 1996-03-30 23:00:00 (Sat)
  62947587600, #  local_start 1995-09-24 01:00:00 (Sun)
  62963917200, #    local_end 1996-03-31 01:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62963910000, #    utc_start 1996-03-30 23:00:00 (Sat)
  62982054000, #      utc_end 1996-10-26 23:00:00 (Sat)
  62963920800, #  local_start 1996-03-31 02:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62982054000, #    utc_start 1996-10-26 23:00:00 (Sat)
  62995359600, #      utc_end 1997-03-29 23:00:00 (Sat)
  62982061200, #  local_start 1996-10-27 01:00:00 (Sun)
  62995366800, #    local_end 1997-03-30 01:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62995359600, #    utc_start 1997-03-29 23:00:00 (Sat)
  63013503600, #      utc_end 1997-10-25 23:00:00 (Sat)
  62995370400, #  local_start 1997-03-30 02:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63013503600, #    utc_start 1997-10-25 23:00:00 (Sat)
  63026809200, #      utc_end 1998-03-28 23:00:00 (Sat)
  63013510800, #  local_start 1997-10-26 01:00:00 (Sun)
  63026816400, #    local_end 1998-03-29 01:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63026809200, #    utc_start 1998-03-28 23:00:00 (Sat)
  63044953200, #      utc_end 1998-10-24 23:00:00 (Sat)
  63026820000, #  local_start 1998-03-29 02:00:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63044953200, #    utc_start 1998-10-24 23:00:00 (Sat)
  63058258800, #      utc_end 1999-03-27 23:00:00 (Sat)
  63044960400, #  local_start 1998-10-25 01:00:00 (Sun)
  63058266000, #    local_end 1999-03-28 01:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63058258800, #    utc_start 1999-03-27 23:00:00 (Sat)
  63077007600, #      utc_end 1999-10-30 23:00:00 (Sat)
  63058269600, #  local_start 1999-03-28 02:00:00 (Sun)
  63077018400, #    local_end 1999-10-31 02:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63077007600, #    utc_start 1999-10-30 23:00:00 (Sat)
  63089708400, #      utc_end 2000-03-25 23:00:00 (Sat)
  63077014800, #  local_start 1999-10-31 01:00:00 (Sun)
  63089715600, #    local_end 2000-03-26 01:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63089708400, #    utc_start 2000-03-25 23:00:00 (Sat)
  63108457200, #      utc_end 2000-10-28 23:00:00 (Sat)
  63089719200, #  local_start 2000-03-26 02:00:00 (Sun)
  63108468000, #    local_end 2000-10-29 02:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63108457200, #    utc_start 2000-10-28 23:00:00 (Sat)
  63121158000, #      utc_end 2001-03-24 23:00:00 (Sat)
  63108464400, #  local_start 2000-10-29 01:00:00 (Sun)
  63121165200, #    local_end 2001-03-25 01:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63121158000, #    utc_start 2001-03-24 23:00:00 (Sat)
  63139906800, #      utc_end 2001-10-27 23:00:00 (Sat)
  63121168800, #  local_start 2001-03-25 02:00:00 (Sun)
  63139917600, #    local_end 2001-10-28 02:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63139906800, #    utc_start 2001-10-27 23:00:00 (Sat)
  63153212400, #      utc_end 2002-03-30 23:00:00 (Sat)
  63139914000, #  local_start 2001-10-28 01:00:00 (Sun)
  63153219600, #    local_end 2002-03-31 01:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63153212400, #    utc_start 2002-03-30 23:00:00 (Sat)
  63171356400, #      utc_end 2002-10-26 23:00:00 (Sat)
  63153223200, #  local_start 2002-03-31 02:00:00 (Sun)
  63171367200, #    local_end 2002-10-27 02:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63171356400, #    utc_start 2002-10-26 23:00:00 (Sat)
  63184662000, #      utc_end 2003-03-29 23:00:00 (Sat)
  63171363600, #  local_start 2002-10-27 01:00:00 (Sun)
  63184669200, #    local_end 2003-03-30 01:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63184662000, #    utc_start 2003-03-29 23:00:00 (Sat)
  63202806000, #      utc_end 2003-10-25 23:00:00 (Sat)
  63184672800, #  local_start 2003-03-30 02:00:00 (Sun)
  63202816800, #    local_end 2003-10-26 02:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63202806000, #    utc_start 2003-10-25 23:00:00 (Sat)
  63216111600, #      utc_end 2004-03-27 23:00:00 (Sat)
  63202813200, #  local_start 2003-10-26 01:00:00 (Sun)
  63216118800, #    local_end 2004-03-28 01:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63216111600, #    utc_start 2004-03-27 23:00:00 (Sat)
  63234860400, #      utc_end 2004-10-30 23:00:00 (Sat)
  63216122400, #  local_start 2004-03-28 02:00:00 (Sun)
  63234871200, #    local_end 2004-10-31 02:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63234860400, #    utc_start 2004-10-30 23:00:00 (Sat)
  63247561200, #      utc_end 2005-03-26 23:00:00 (Sat)
  63234867600, #  local_start 2004-10-31 01:00:00 (Sun)
  63247568400, #    local_end 2005-03-27 01:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63247561200, #    utc_start 2005-03-26 23:00:00 (Sat)
  63266310000, #      utc_end 2005-10-29 23:00:00 (Sat)
  63247572000, #  local_start 2005-03-27 02:00:00 (Sun)
  63266320800, #    local_end 2005-10-30 02:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63266310000, #    utc_start 2005-10-29 23:00:00 (Sat)
  63279010800, #      utc_end 2006-03-25 23:00:00 (Sat)
  63266317200, #  local_start 2005-10-30 01:00:00 (Sun)
  63279018000, #    local_end 2006-03-26 01:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63279010800, #    utc_start 2006-03-25 23:00:00 (Sat)
  63297759600, #      utc_end 2006-10-28 23:00:00 (Sat)
  63279021600, #  local_start 2006-03-26 02:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63297759600, #    utc_start 2006-10-28 23:00:00 (Sat)
  63303285600, #      utc_end 2006-12-31 22:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63303292800, #    local_end 2007-01-01 00:00:00 (Mon)
  7200,
  0,
  'EET',
      ],
      [
  63303285600, #    utc_start 2006-12-31 22:00:00 (Sun)
  63310467600, #      utc_end 2007-03-25 01:00:00 (Sun)
  63303292800, #  local_start 2007-01-01 00:00:00 (Mon)
  63310474800, #    local_end 2007-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63310467600, #    utc_start 2007-03-25 01:00:00 (Sun)
  63329216400, #      utc_end 2007-10-28 01:00:00 (Sun)
  63310478400, #  local_start 2007-03-25 04:00:00 (Sun)
  63329227200, #    local_end 2007-10-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63329216400, #    utc_start 2007-10-28 01:00:00 (Sun)
  63342522000, #      utc_end 2008-03-30 01:00:00 (Sun)
  63329223600, #  local_start 2007-10-28 03:00:00 (Sun)
  63342529200, #    local_end 2008-03-30 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63342522000, #    utc_start 2008-03-30 01:00:00 (Sun)
  63360666000, #      utc_end 2008-10-26 01:00:00 (Sun)
  63342532800, #  local_start 2008-03-30 04:00:00 (Sun)
  63360676800, #    local_end 2008-10-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63360666000, #    utc_start 2008-10-26 01:00:00 (Sun)
  63373971600, #      utc_end 2009-03-29 01:00:00 (Sun)
  63360673200, #  local_start 2008-10-26 03:00:00 (Sun)
  63373978800, #    local_end 2009-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63373971600, #    utc_start 2009-03-29 01:00:00 (Sun)
  63392115600, #      utc_end 2009-10-25 01:00:00 (Sun)
  63373982400, #  local_start 2009-03-29 04:00:00 (Sun)
  63392126400, #    local_end 2009-10-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63392115600, #    utc_start 2009-10-25 01:00:00 (Sun)
  63405421200, #      utc_end 2010-03-28 01:00:00 (Sun)
  63392122800, #  local_start 2009-10-25 03:00:00 (Sun)
  63405428400, #    local_end 2010-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63405421200, #    utc_start 2010-03-28 01:00:00 (Sun)
  63424170000, #      utc_end 2010-10-31 01:00:00 (Sun)
  63405432000, #  local_start 2010-03-28 04:00:00 (Sun)
  63424180800, #    local_end 2010-10-31 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63424170000, #    utc_start 2010-10-31 01:00:00 (Sun)
  63436870800, #      utc_end 2011-03-27 01:00:00 (Sun)
  63424177200, #  local_start 2010-10-31 03:00:00 (Sun)
  63436878000, #    local_end 2011-03-27 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63436870800, #    utc_start 2011-03-27 01:00:00 (Sun)
  63436957200, #      utc_end 2011-03-28 01:00:00 (Mon)
  63436878000, #  local_start 2011-03-27 03:00:00 (Sun)
  63436964400, #    local_end 2011-03-28 03:00:00 (Mon)
  7200,
  0,
  'EET',
      ],
      [
  63436957200, #    utc_start 2011-03-28 01:00:00 (Mon)
  63455619600, #      utc_end 2011-10-30 01:00:00 (Sun)
  63436968000, #  local_start 2011-03-28 04:00:00 (Mon)
  63455630400, #    local_end 2011-10-30 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63455619600, #    utc_start 2011-10-30 01:00:00 (Sun)
  63468320400, #      utc_end 2012-03-25 01:00:00 (Sun)
  63455626800, #  local_start 2011-10-30 03:00:00 (Sun)
  63468327600, #    local_end 2012-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63468320400, #    utc_start 2012-03-25 01:00:00 (Sun)
  63487069200, #      utc_end 2012-10-28 01:00:00 (Sun)
  63468331200, #  local_start 2012-03-25 04:00:00 (Sun)
  63487080000, #    local_end 2012-10-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63487069200, #    utc_start 2012-10-28 01:00:00 (Sun)
  63500374800, #      utc_end 2013-03-31 01:00:00 (Sun)
  63487076400, #  local_start 2012-10-28 03:00:00 (Sun)
  63500382000, #    local_end 2013-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63500374800, #    utc_start 2013-03-31 01:00:00 (Sun)
  63518518800, #      utc_end 2013-10-27 01:00:00 (Sun)
  63500385600, #  local_start 2013-03-31 04:00:00 (Sun)
  63518529600, #    local_end 2013-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63518518800, #    utc_start 2013-10-27 01:00:00 (Sun)
  63531824400, #      utc_end 2014-03-30 01:00:00 (Sun)
  63518526000, #  local_start 2013-10-27 03:00:00 (Sun)
  63531831600, #    local_end 2014-03-30 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63531824400, #    utc_start 2014-03-30 01:00:00 (Sun)
  63531910800, #      utc_end 2014-03-31 01:00:00 (Mon)
  63531831600, #  local_start 2014-03-30 03:00:00 (Sun)
  63531918000, #    local_end 2014-03-31 03:00:00 (Mon)
  7200,
  0,
  'EET',
      ],
      [
  63531910800, #    utc_start 2014-03-31 01:00:00 (Mon)
  63549968400, #      utc_end 2014-10-26 01:00:00 (Sun)
  63531921600, #  local_start 2014-03-31 04:00:00 (Mon)
  63549979200, #    local_end 2014-10-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63549968400, #    utc_start 2014-10-26 01:00:00 (Sun)
  63563274000, #      utc_end 2015-03-29 01:00:00 (Sun)
  63549975600, #  local_start 2014-10-26 03:00:00 (Sun)
  63563281200, #    local_end 2015-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63563274000, #    utc_start 2015-03-29 01:00:00 (Sun)
  63581418000, #      utc_end 2015-10-25 01:00:00 (Sun)
  63563284800, #  local_start 2015-03-29 04:00:00 (Sun)
  63581428800, #    local_end 2015-10-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63581418000, #    utc_start 2015-10-25 01:00:00 (Sun)
  63582627600, #      utc_end 2015-11-08 01:00:00 (Sun)
  63581428800, #  local_start 2015-10-25 04:00:00 (Sun)
  63582638400, #    local_end 2015-11-08 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63582627600, #    utc_start 2015-11-08 01:00:00 (Sun)
  63594723600, #      utc_end 2016-03-27 01:00:00 (Sun)
  63582634800, #  local_start 2015-11-08 03:00:00 (Sun)
  63594730800, #    local_end 2016-03-27 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63594723600, #    utc_start 2016-03-27 01:00:00 (Sun)
  63608878800, #      utc_end 2016-09-06 21:00:00 (Tue)
  63594734400, #  local_start 2016-03-27 04:00:00 (Sun)
  63608889600, #    local_end 2016-09-07 00:00:00 (Wed)
  10800,
  1,
  'EEST',
      ],
      [
  63608878800, #    utc_start 2016-09-06 21:00:00 (Tue)
  DateTime::TimeZone::INFINITY, #      utc_end
  63608889600, #  local_start 2016-09-07 00:00:00 (Wed)
  DateTime::TimeZone::INFINITY, #    local_end
  10800,
  0,
  '+03',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {66}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_EUROPE_ISTANBUL

    $main::fatpacked{"DateTime/TimeZone/Europe/Kaliningrad.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_EUROPE_KALININGRAD';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Europe::Kaliningrad;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Europe::Kaliningrad::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59713627080, #      utc_end 1893-03-31 22:38:00 (Fri)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59713632000, #    local_end 1893-04-01 00:00:00 (Sat)
  4920,
  0,
  'LMT',
      ],
      [
  59713627080, #    utc_start 1893-03-31 22:38:00 (Fri)
  60441976800, #      utc_end 1916-04-30 22:00:00 (Sun)
  59713630680, #  local_start 1893-03-31 23:38:00 (Fri)
  60441980400, #    local_end 1916-04-30 23:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  60441976800, #    utc_start 1916-04-30 22:00:00 (Sun)
  60455199600, #      utc_end 1916-09-30 23:00:00 (Sat)
  60441984000, #  local_start 1916-05-01 00:00:00 (Mon)
  60455206800, #    local_end 1916-10-01 01:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  60455199600, #    utc_start 1916-09-30 23:00:00 (Sat)
  60472227600, #      utc_end 1917-04-16 01:00:00 (Mon)
  60455203200, #  local_start 1916-10-01 00:00:00 (Sun)
  60472231200, #    local_end 1917-04-16 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  60472227600, #    utc_start 1917-04-16 01:00:00 (Mon)
  60485533200, #      utc_end 1917-09-17 01:00:00 (Mon)
  60472234800, #  local_start 1917-04-16 03:00:00 (Mon)
  60485540400, #    local_end 1917-09-17 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  60485533200, #    utc_start 1917-09-17 01:00:00 (Mon)
  60503677200, #      utc_end 1918-04-15 01:00:00 (Mon)
  60485536800, #  local_start 1917-09-17 02:00:00 (Mon)
  60503680800, #    local_end 1918-04-15 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  60503677200, #    utc_start 1918-04-15 01:00:00 (Mon)
  60516982800, #      utc_end 1918-09-16 01:00:00 (Mon)
  60503684400, #  local_start 1918-04-15 03:00:00 (Mon)
  60516990000, #    local_end 1918-09-16 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  60516982800, #    utc_start 1918-09-16 01:00:00 (Mon)
  61196778000, #      utc_end 1940-04-01 01:00:00 (Mon)
  60516986400, #  local_start 1918-09-16 02:00:00 (Mon)
  61196781600, #    local_end 1940-04-01 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61196778000, #    utc_start 1940-04-01 01:00:00 (Mon)
  61278426000, #      utc_end 1942-11-02 01:00:00 (Mon)
  61196785200, #  local_start 1940-04-01 03:00:00 (Mon)
  61278433200, #    local_end 1942-11-02 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61278426000, #    utc_start 1942-11-02 01:00:00 (Mon)
  61291126800, #      utc_end 1943-03-29 01:00:00 (Mon)
  61278429600, #  local_start 1942-11-02 02:00:00 (Mon)
  61291130400, #    local_end 1943-03-29 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61291126800, #    utc_start 1943-03-29 01:00:00 (Mon)
  61307456400, #      utc_end 1943-10-04 01:00:00 (Mon)
  61291134000, #  local_start 1943-03-29 03:00:00 (Mon)
  61307463600, #    local_end 1943-10-04 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61307456400, #    utc_start 1943-10-04 01:00:00 (Mon)
  61323181200, #      utc_end 1944-04-03 01:00:00 (Mon)
  61307460000, #  local_start 1943-10-04 02:00:00 (Mon)
  61323184800, #    local_end 1944-04-03 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61323181200, #    utc_start 1944-04-03 01:00:00 (Mon)
  61338906000, #      utc_end 1944-10-02 01:00:00 (Mon)
  61323188400, #  local_start 1944-04-03 03:00:00 (Mon)
  61338913200, #    local_end 1944-10-02 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61338906000, #    utc_start 1944-10-02 01:00:00 (Mon)
  61346761200, #      utc_end 1944-12-31 23:00:00 (Sun)
  61338909600, #  local_start 1944-10-02 02:00:00 (Mon)
  61346764800, #    local_end 1945-01-01 00:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61346761200, #    utc_start 1944-12-31 23:00:00 (Sun)
  61356952800, #      utc_end 1945-04-28 22:00:00 (Sat)
  61346768400, #  local_start 1945-01-01 01:00:00 (Mon)
  61356960000, #    local_end 1945-04-29 00:00:00 (Sun)
  7200,
  0,
  'CET',
      ],
      [
  61356952800, #    utc_start 1945-04-28 22:00:00 (Sat)
  61373019600, #      utc_end 1945-10-31 21:00:00 (Wed)
  61356963600, #  local_start 1945-04-29 01:00:00 (Sun)
  61373030400, #    local_end 1945-11-01 00:00:00 (Thu)
  10800,
  1,
  'CEST',
      ],
      [
  61373019600, #    utc_start 1945-10-31 21:00:00 (Wed)
  61378293600, #      utc_end 1945-12-31 22:00:00 (Mon)
  61373026800, #  local_start 1945-10-31 23:00:00 (Wed)
  61378300800, #    local_end 1946-01-01 00:00:00 (Tue)
  7200,
  0,
  'CET',
      ],
      [
  61378293600, #    utc_start 1945-12-31 22:00:00 (Mon)
  62490603600, #      utc_end 1981-03-31 21:00:00 (Tue)
  61378304400, #  local_start 1946-01-01 01:00:00 (Tue)
  62490614400, #    local_end 1981-04-01 00:00:00 (Wed)
  10800,
  0,
  'MSK',
      ],
      [
  62490603600, #    utc_start 1981-03-31 21:00:00 (Tue)
  62506411200, #      utc_end 1981-09-30 20:00:00 (Wed)
  62490618000, #  local_start 1981-04-01 01:00:00 (Wed)
  62506425600, #    local_end 1981-10-01 00:00:00 (Thu)
  14400,
  1,
  'MSD',
      ],
      [
  62506411200, #    utc_start 1981-09-30 20:00:00 (Wed)
  62522139600, #      utc_end 1982-03-31 21:00:00 (Wed)
  62506422000, #  local_start 1981-09-30 23:00:00 (Wed)
  62522150400, #    local_end 1982-04-01 00:00:00 (Thu)
  10800,
  0,
  'MSK',
      ],
      [
  62522139600, #    utc_start 1982-03-31 21:00:00 (Wed)
  62537947200, #      utc_end 1982-09-30 20:00:00 (Thu)
  62522154000, #  local_start 1982-04-01 01:00:00 (Thu)
  62537961600, #    local_end 1982-10-01 00:00:00 (Fri)
  14400,
  1,
  'MSD',
      ],
      [
  62537947200, #    utc_start 1982-09-30 20:00:00 (Thu)
  62553675600, #      utc_end 1983-03-31 21:00:00 (Thu)
  62537958000, #  local_start 1982-09-30 23:00:00 (Thu)
  62553686400, #    local_end 1983-04-01 00:00:00 (Fri)
  10800,
  0,
  'MSK',
      ],
      [
  62553675600, #    utc_start 1983-03-31 21:00:00 (Thu)
  62569483200, #      utc_end 1983-09-30 20:00:00 (Fri)
  62553690000, #  local_start 1983-04-01 01:00:00 (Fri)
  62569497600, #    local_end 1983-10-01 00:00:00 (Sat)
  14400,
  1,
  'MSD',
      ],
      [
  62569483200, #    utc_start 1983-09-30 20:00:00 (Fri)
  62585298000, #      utc_end 1984-03-31 21:00:00 (Sat)
  62569494000, #  local_start 1983-09-30 23:00:00 (Fri)
  62585308800, #    local_end 1984-04-01 00:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62585298000, #    utc_start 1984-03-31 21:00:00 (Sat)
  62601030000, #      utc_end 1984-09-29 23:00:00 (Sat)
  62585312400, #  local_start 1984-04-01 01:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62601030000, #    utc_start 1984-09-29 23:00:00 (Sat)
  62616754800, #      utc_end 1985-03-30 23:00:00 (Sat)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62616754800, #    utc_start 1985-03-30 23:00:00 (Sat)
  62632479600, #      utc_end 1985-09-28 23:00:00 (Sat)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62632479600, #    utc_start 1985-09-28 23:00:00 (Sat)
  62648204400, #      utc_end 1986-03-29 23:00:00 (Sat)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62648204400, #    utc_start 1986-03-29 23:00:00 (Sat)
  62663929200, #      utc_end 1986-09-27 23:00:00 (Sat)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62663929200, #    utc_start 1986-09-27 23:00:00 (Sat)
  62679654000, #      utc_end 1987-03-28 23:00:00 (Sat)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62679654000, #    utc_start 1987-03-28 23:00:00 (Sat)
  62695378800, #      utc_end 1987-09-26 23:00:00 (Sat)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62695378800, #    utc_start 1987-09-26 23:00:00 (Sat)
  62711103600, #      utc_end 1988-03-26 23:00:00 (Sat)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62711103600, #    utc_start 1988-03-26 23:00:00 (Sat)
  62726828400, #      utc_end 1988-09-24 23:00:00 (Sat)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62726828400, #    utc_start 1988-09-24 23:00:00 (Sat)
  62742553200, #      utc_end 1989-03-25 23:00:00 (Sat)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62742553200, #    utc_start 1989-03-25 23:00:00 (Sat)
  62758281600, #      utc_end 1989-09-24 00:00:00 (Sun)
  62742564000, #  local_start 1989-03-26 02:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62758281600, #    utc_start 1989-09-24 00:00:00 (Sun)
  62774006400, #      utc_end 1990-03-25 00:00:00 (Sun)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62774006400, #    utc_start 1990-03-25 00:00:00 (Sun)
  62790336000, #      utc_end 1990-09-30 00:00:00 (Sun)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62790336000, #    utc_start 1990-09-30 00:00:00 (Sun)
  62806060800, #      utc_end 1991-03-31 00:00:00 (Sun)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62806060800, #    utc_start 1991-03-31 00:00:00 (Sun)
  62821785600, #      utc_end 1991-09-29 00:00:00 (Sun)
  62806071600, #  local_start 1991-03-31 03:00:00 (Sun)
  62821796400, #    local_end 1991-09-29 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62821785600, #    utc_start 1991-09-29 00:00:00 (Sun)
  62837510400, #      utc_end 1992-03-29 00:00:00 (Sun)
  62821792800, #  local_start 1991-09-29 02:00:00 (Sun)
  62837517600, #    local_end 1992-03-29 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62837510400, #    utc_start 1992-03-29 00:00:00 (Sun)
  62853235200, #      utc_end 1992-09-27 00:00:00 (Sun)
  62837521200, #  local_start 1992-03-29 03:00:00 (Sun)
  62853246000, #    local_end 1992-09-27 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62853235200, #    utc_start 1992-09-27 00:00:00 (Sun)
  62868960000, #      utc_end 1993-03-28 00:00:00 (Sun)
  62853242400, #  local_start 1992-09-27 02:00:00 (Sun)
  62868967200, #    local_end 1993-03-28 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62868960000, #    utc_start 1993-03-28 00:00:00 (Sun)
  62884684800, #      utc_end 1993-09-26 00:00:00 (Sun)
  62868970800, #  local_start 1993-03-28 03:00:00 (Sun)
  62884695600, #    local_end 1993-09-26 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62884684800, #    utc_start 1993-09-26 00:00:00 (Sun)
  62900409600, #      utc_end 1994-03-27 00:00:00 (Sun)
  62884692000, #  local_start 1993-09-26 02:00:00 (Sun)
  62900416800, #    local_end 1994-03-27 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62900409600, #    utc_start 1994-03-27 00:00:00 (Sun)
  62916134400, #      utc_end 1994-09-25 00:00:00 (Sun)
  62900420400, #  local_start 1994-03-27 03:00:00 (Sun)
  62916145200, #    local_end 1994-09-25 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62916134400, #    utc_start 1994-09-25 00:00:00 (Sun)
  62931859200, #      utc_end 1995-03-26 00:00:00 (Sun)
  62916141600, #  local_start 1994-09-25 02:00:00 (Sun)
  62931866400, #    local_end 1995-03-26 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62931859200, #    utc_start 1995-03-26 00:00:00 (Sun)
  62947584000, #      utc_end 1995-09-24 00:00:00 (Sun)
  62931870000, #  local_start 1995-03-26 03:00:00 (Sun)
  62947594800, #    local_end 1995-09-24 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62947584000, #    utc_start 1995-09-24 00:00:00 (Sun)
  62963913600, #      utc_end 1996-03-31 00:00:00 (Sun)
  62947591200, #  local_start 1995-09-24 02:00:00 (Sun)
  62963920800, #    local_end 1996-03-31 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62963913600, #    utc_start 1996-03-31 00:00:00 (Sun)
  62982057600, #      utc_end 1996-10-27 00:00:00 (Sun)
  62963924400, #  local_start 1996-03-31 03:00:00 (Sun)
  62982068400, #    local_end 1996-10-27 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62982057600, #    utc_start 1996-10-27 00:00:00 (Sun)
  62995363200, #      utc_end 1997-03-30 00:00:00 (Sun)
  62982064800, #  local_start 1996-10-27 02:00:00 (Sun)
  62995370400, #    local_end 1997-03-30 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62995363200, #    utc_start 1997-03-30 00:00:00 (Sun)
  63013507200, #      utc_end 1997-10-26 00:00:00 (Sun)
  62995374000, #  local_start 1997-03-30 03:00:00 (Sun)
  63013518000, #    local_end 1997-10-26 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63013507200, #    utc_start 1997-10-26 00:00:00 (Sun)
  63026812800, #      utc_end 1998-03-29 00:00:00 (Sun)
  63013514400, #  local_start 1997-10-26 02:00:00 (Sun)
  63026820000, #    local_end 1998-03-29 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63026812800, #    utc_start 1998-03-29 00:00:00 (Sun)
  63044956800, #      utc_end 1998-10-25 00:00:00 (Sun)
  63026823600, #  local_start 1998-03-29 03:00:00 (Sun)
  63044967600, #    local_end 1998-10-25 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63044956800, #    utc_start 1998-10-25 00:00:00 (Sun)
  63058262400, #      utc_end 1999-03-28 00:00:00 (Sun)
  63044964000, #  local_start 1998-10-25 02:00:00 (Sun)
  63058269600, #    local_end 1999-03-28 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63058262400, #    utc_start 1999-03-28 00:00:00 (Sun)
  63077011200, #      utc_end 1999-10-31 00:00:00 (Sun)
  63058273200, #  local_start 1999-03-28 03:00:00 (Sun)
  63077022000, #    local_end 1999-10-31 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63077011200, #    utc_start 1999-10-31 00:00:00 (Sun)
  63089712000, #      utc_end 2000-03-26 00:00:00 (Sun)
  63077018400, #  local_start 1999-10-31 02:00:00 (Sun)
  63089719200, #    local_end 2000-03-26 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63089712000, #    utc_start 2000-03-26 00:00:00 (Sun)
  63108460800, #      utc_end 2000-10-29 00:00:00 (Sun)
  63089722800, #  local_start 2000-03-26 03:00:00 (Sun)
  63108471600, #    local_end 2000-10-29 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63108460800, #    utc_start 2000-10-29 00:00:00 (Sun)
  63121161600, #      utc_end 2001-03-25 00:00:00 (Sun)
  63108468000, #  local_start 2000-10-29 02:00:00 (Sun)
  63121168800, #    local_end 2001-03-25 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63121161600, #    utc_start 2001-03-25 00:00:00 (Sun)
  63139910400, #      utc_end 2001-10-28 00:00:00 (Sun)
  63121172400, #  local_start 2001-03-25 03:00:00 (Sun)
  63139921200, #    local_end 2001-10-28 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63139910400, #    utc_start 2001-10-28 00:00:00 (Sun)
  63153216000, #      utc_end 2002-03-31 00:00:00 (Sun)
  63139917600, #  local_start 2001-10-28 02:00:00 (Sun)
  63153223200, #    local_end 2002-03-31 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63153216000, #    utc_start 2002-03-31 00:00:00 (Sun)
  63171360000, #      utc_end 2002-10-27 00:00:00 (Sun)
  63153226800, #  local_start 2002-03-31 03:00:00 (Sun)
  63171370800, #    local_end 2002-10-27 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63171360000, #    utc_start 2002-10-27 00:00:00 (Sun)
  63184665600, #      utc_end 2003-03-30 00:00:00 (Sun)
  63171367200, #  local_start 2002-10-27 02:00:00 (Sun)
  63184672800, #    local_end 2003-03-30 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63184665600, #    utc_start 2003-03-30 00:00:00 (Sun)
  63202809600, #      utc_end 2003-10-26 00:00:00 (Sun)
  63184676400, #  local_start 2003-03-30 03:00:00 (Sun)
  63202820400, #    local_end 2003-10-26 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63202809600, #    utc_start 2003-10-26 00:00:00 (Sun)
  63216115200, #      utc_end 2004-03-28 00:00:00 (Sun)
  63202816800, #  local_start 2003-10-26 02:00:00 (Sun)
  63216122400, #    local_end 2004-03-28 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63216115200, #    utc_start 2004-03-28 00:00:00 (Sun)
  63234864000, #      utc_end 2004-10-31 00:00:00 (Sun)
  63216126000, #  local_start 2004-03-28 03:00:00 (Sun)
  63234874800, #    local_end 2004-10-31 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63234864000, #    utc_start 2004-10-31 00:00:00 (Sun)
  63247564800, #      utc_end 2005-03-27 00:00:00 (Sun)
  63234871200, #  local_start 2004-10-31 02:00:00 (Sun)
  63247572000, #    local_end 2005-03-27 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63247564800, #    utc_start 2005-03-27 00:00:00 (Sun)
  63266313600, #      utc_end 2005-10-30 00:00:00 (Sun)
  63247575600, #  local_start 2005-03-27 03:00:00 (Sun)
  63266324400, #    local_end 2005-10-30 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63266313600, #    utc_start 2005-10-30 00:00:00 (Sun)
  63279014400, #      utc_end 2006-03-26 00:00:00 (Sun)
  63266320800, #  local_start 2005-10-30 02:00:00 (Sun)
  63279021600, #    local_end 2006-03-26 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63279014400, #    utc_start 2006-03-26 00:00:00 (Sun)
  63297763200, #      utc_end 2006-10-29 00:00:00 (Sun)
  63279025200, #  local_start 2006-03-26 03:00:00 (Sun)
  63297774000, #    local_end 2006-10-29 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63297763200, #    utc_start 2006-10-29 00:00:00 (Sun)
  63310464000, #      utc_end 2007-03-25 00:00:00 (Sun)
  63297770400, #  local_start 2006-10-29 02:00:00 (Sun)
  63310471200, #    local_end 2007-03-25 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63310464000, #    utc_start 2007-03-25 00:00:00 (Sun)
  63329212800, #      utc_end 2007-10-28 00:00:00 (Sun)
  63310474800, #  local_start 2007-03-25 03:00:00 (Sun)
  63329223600, #    local_end 2007-10-28 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63329212800, #    utc_start 2007-10-28 00:00:00 (Sun)
  63342518400, #      utc_end 2008-03-30 00:00:00 (Sun)
  63329220000, #  local_start 2007-10-28 02:00:00 (Sun)
  63342525600, #    local_end 2008-03-30 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63342518400, #    utc_start 2008-03-30 00:00:00 (Sun)
  63360662400, #      utc_end 2008-10-26 00:00:00 (Sun)
  63342529200, #  local_start 2008-03-30 03:00:00 (Sun)
  63360673200, #    local_end 2008-10-26 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63360662400, #    utc_start 2008-10-26 00:00:00 (Sun)
  63373968000, #      utc_end 2009-03-29 00:00:00 (Sun)
  63360669600, #  local_start 2008-10-26 02:00:00 (Sun)
  63373975200, #    local_end 2009-03-29 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63373968000, #    utc_start 2009-03-29 00:00:00 (Sun)
  63392112000, #      utc_end 2009-10-25 00:00:00 (Sun)
  63373978800, #  local_start 2009-03-29 03:00:00 (Sun)
  63392122800, #    local_end 2009-10-25 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63392112000, #    utc_start 2009-10-25 00:00:00 (Sun)
  63405417600, #      utc_end 2010-03-28 00:00:00 (Sun)
  63392119200, #  local_start 2009-10-25 02:00:00 (Sun)
  63405424800, #    local_end 2010-03-28 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63405417600, #    utc_start 2010-03-28 00:00:00 (Sun)
  63424166400, #      utc_end 2010-10-31 00:00:00 (Sun)
  63405428400, #  local_start 2010-03-28 03:00:00 (Sun)
  63424177200, #    local_end 2010-10-31 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63424166400, #    utc_start 2010-10-31 00:00:00 (Sun)
  63436867200, #      utc_end 2011-03-27 00:00:00 (Sun)
  63424173600, #  local_start 2010-10-31 02:00:00 (Sun)
  63436874400, #    local_end 2011-03-27 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63436867200, #    utc_start 2011-03-27 00:00:00 (Sun)
  63549961200, #      utc_end 2014-10-25 23:00:00 (Sat)
  63436878000, #  local_start 2011-03-27 03:00:00 (Sun)
  63549972000, #    local_end 2014-10-26 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63549961200, #    utc_start 2014-10-25 23:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  63549968400, #  local_start 2014-10-26 01:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  7200,
  0,
  'EET',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {37}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_EUROPE_KALININGRAD

    $main::fatpacked{"DateTime/TimeZone/Europe/Kiev.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_EUROPE_KIEV';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Europe::Kiev;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Europe::Kiev::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59295535076, #      utc_end 1879-12-31 21:57:56 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59295542400, #    local_end 1880-01-01 00:00:00 (Thu)
  7324,
  0,
  'LMT',
      ],
      [
  59295535076, #    utc_start 1879-12-31 21:57:56 (Wed)
  60694523876, #      utc_end 1924-05-01 21:57:56 (Thu)
  59295542400, #  local_start 1880-01-01 00:00:00 (Thu)
  60694531200, #    local_end 1924-05-02 00:00:00 (Fri)
  7324,
  0,
  'KMT',
      ],
      [
  60694523876, #    utc_start 1924-05-01 21:57:56 (Thu)
  60888146400, #      utc_end 1930-06-20 22:00:00 (Fri)
  60694531076, #  local_start 1924-05-01 23:57:56 (Thu)
  60888153600, #    local_end 1930-06-21 00:00:00 (Sat)
  7200,
  0,
  'EET',
      ],
      [
  60888146400, #    utc_start 1930-06-20 22:00:00 (Fri)
  61243160400, #      utc_end 1941-09-19 21:00:00 (Fri)
  60888157200, #  local_start 1930-06-21 01:00:00 (Sat)
  61243171200, #    local_end 1941-09-20 00:00:00 (Sat)
  10800,
  0,
  'MSK',
      ],
      [
  61243160400, #    utc_start 1941-09-19 21:00:00 (Fri)
  61278426000, #      utc_end 1942-11-02 01:00:00 (Mon)
  61243167600, #  local_start 1941-09-19 23:00:00 (Fri)
  61278433200, #    local_end 1942-11-02 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61278426000, #    utc_start 1942-11-02 01:00:00 (Mon)
  61291126800, #      utc_end 1943-03-29 01:00:00 (Mon)
  61278429600, #  local_start 1942-11-02 02:00:00 (Mon)
  61291130400, #    local_end 1943-03-29 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61291126800, #    utc_start 1943-03-29 01:00:00 (Mon)
  61307456400, #      utc_end 1943-10-04 01:00:00 (Mon)
  61291134000, #  local_start 1943-03-29 03:00:00 (Mon)
  61307463600, #    local_end 1943-10-04 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61307456400, #    utc_start 1943-10-04 01:00:00 (Mon)
  61310300400, #      utc_end 1943-11-05 23:00:00 (Fri)
  61307460000, #  local_start 1943-10-04 02:00:00 (Mon)
  61310304000, #    local_end 1943-11-06 00:00:00 (Sat)
  3600,
  0,
  'CET',
      ],
      [
  61310300400, #    utc_start 1943-11-05 23:00:00 (Fri)
  62490603600, #      utc_end 1981-03-31 21:00:00 (Tue)
  61310311200, #  local_start 1943-11-06 02:00:00 (Sat)
  62490614400, #    local_end 1981-04-01 00:00:00 (Wed)
  10800,
  0,
  'MSK',
      ],
      [
  62490603600, #    utc_start 1981-03-31 21:00:00 (Tue)
  62506411200, #      utc_end 1981-09-30 20:00:00 (Wed)
  62490618000, #  local_start 1981-04-01 01:00:00 (Wed)
  62506425600, #    local_end 1981-10-01 00:00:00 (Thu)
  14400,
  1,
  'MSD',
      ],
      [
  62506411200, #    utc_start 1981-09-30 20:00:00 (Wed)
  62522139600, #      utc_end 1982-03-31 21:00:00 (Wed)
  62506422000, #  local_start 1981-09-30 23:00:00 (Wed)
  62522150400, #    local_end 1982-04-01 00:00:00 (Thu)
  10800,
  0,
  'MSK',
      ],
      [
  62522139600, #    utc_start 1982-03-31 21:00:00 (Wed)
  62537947200, #      utc_end 1982-09-30 20:00:00 (Thu)
  62522154000, #  local_start 1982-04-01 01:00:00 (Thu)
  62537961600, #    local_end 1982-10-01 00:00:00 (Fri)
  14400,
  1,
  'MSD',
      ],
      [
  62537947200, #    utc_start 1982-09-30 20:00:00 (Thu)
  62553675600, #      utc_end 1983-03-31 21:00:00 (Thu)
  62537958000, #  local_start 1982-09-30 23:00:00 (Thu)
  62553686400, #    local_end 1983-04-01 00:00:00 (Fri)
  10800,
  0,
  'MSK',
      ],
      [
  62553675600, #    utc_start 1983-03-31 21:00:00 (Thu)
  62569483200, #      utc_end 1983-09-30 20:00:00 (Fri)
  62553690000, #  local_start 1983-04-01 01:00:00 (Fri)
  62569497600, #    local_end 1983-10-01 00:00:00 (Sat)
  14400,
  1,
  'MSD',
      ],
      [
  62569483200, #    utc_start 1983-09-30 20:00:00 (Fri)
  62585298000, #      utc_end 1984-03-31 21:00:00 (Sat)
  62569494000, #  local_start 1983-09-30 23:00:00 (Fri)
  62585308800, #    local_end 1984-04-01 00:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62585298000, #    utc_start 1984-03-31 21:00:00 (Sat)
  62601030000, #      utc_end 1984-09-29 23:00:00 (Sat)
  62585312400, #  local_start 1984-04-01 01:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62601030000, #    utc_start 1984-09-29 23:00:00 (Sat)
  62616754800, #      utc_end 1985-03-30 23:00:00 (Sat)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62616754800, #    utc_start 1985-03-30 23:00:00 (Sat)
  62632479600, #      utc_end 1985-09-28 23:00:00 (Sat)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62632479600, #    utc_start 1985-09-28 23:00:00 (Sat)
  62648204400, #      utc_end 1986-03-29 23:00:00 (Sat)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62648204400, #    utc_start 1986-03-29 23:00:00 (Sat)
  62663929200, #      utc_end 1986-09-27 23:00:00 (Sat)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62663929200, #    utc_start 1986-09-27 23:00:00 (Sat)
  62679654000, #      utc_end 1987-03-28 23:00:00 (Sat)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62679654000, #    utc_start 1987-03-28 23:00:00 (Sat)
  62695378800, #      utc_end 1987-09-26 23:00:00 (Sat)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62695378800, #    utc_start 1987-09-26 23:00:00 (Sat)
  62711103600, #      utc_end 1988-03-26 23:00:00 (Sat)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62711103600, #    utc_start 1988-03-26 23:00:00 (Sat)
  62726828400, #      utc_end 1988-09-24 23:00:00 (Sat)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62726828400, #    utc_start 1988-09-24 23:00:00 (Sat)
  62742553200, #      utc_end 1989-03-25 23:00:00 (Sat)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62742553200, #    utc_start 1989-03-25 23:00:00 (Sat)
  62758278000, #      utc_end 1989-09-23 23:00:00 (Sat)
  62742567600, #  local_start 1989-03-26 03:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62758278000, #    utc_start 1989-09-23 23:00:00 (Sat)
  62774002800, #      utc_end 1990-03-24 23:00:00 (Sat)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62774002800, #    utc_start 1990-03-24 23:00:00 (Sat)
  62782466400, #      utc_end 1990-06-30 22:00:00 (Sat)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62782480800, #    local_end 1990-07-01 02:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62782466400, #    utc_start 1990-06-30 22:00:00 (Sat)
  62821785600, #      utc_end 1991-09-29 00:00:00 (Sun)
  62782477200, #  local_start 1990-07-01 01:00:00 (Sun)
  62821796400, #    local_end 1991-09-29 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62821785600, #    utc_start 1991-09-29 00:00:00 (Sun)
  62837503200, #      utc_end 1992-03-28 22:00:00 (Sat)
  62821792800, #  local_start 1991-09-29 02:00:00 (Sun)
  62837510400, #    local_end 1992-03-29 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62837503200, #    utc_start 1992-03-28 22:00:00 (Sat)
  62853224400, #      utc_end 1992-09-26 21:00:00 (Sat)
  62837514000, #  local_start 1992-03-29 01:00:00 (Sun)
  62853235200, #    local_end 1992-09-27 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62853224400, #    utc_start 1992-09-26 21:00:00 (Sat)
  62868952800, #      utc_end 1993-03-27 22:00:00 (Sat)
  62853231600, #  local_start 1992-09-26 23:00:00 (Sat)
  62868960000, #    local_end 1993-03-28 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62868952800, #    utc_start 1993-03-27 22:00:00 (Sat)
  62884674000, #      utc_end 1993-09-25 21:00:00 (Sat)
  62868963600, #  local_start 1993-03-28 01:00:00 (Sun)
  62884684800, #    local_end 1993-09-26 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62884674000, #    utc_start 1993-09-25 21:00:00 (Sat)
  62900402400, #      utc_end 1994-03-26 22:00:00 (Sat)
  62884681200, #  local_start 1993-09-25 23:00:00 (Sat)
  62900409600, #    local_end 1994-03-27 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62900402400, #    utc_start 1994-03-26 22:00:00 (Sat)
  62916123600, #      utc_end 1994-09-24 21:00:00 (Sat)
  62900413200, #  local_start 1994-03-27 01:00:00 (Sun)
  62916134400, #    local_end 1994-09-25 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62916123600, #    utc_start 1994-09-24 21:00:00 (Sat)
  62924594400, #      utc_end 1994-12-31 22:00:00 (Sat)
  62916130800, #  local_start 1994-09-24 23:00:00 (Sat)
  62924601600, #    local_end 1995-01-01 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62924594400, #    utc_start 1994-12-31 22:00:00 (Sat)
  62931862800, #      utc_end 1995-03-26 01:00:00 (Sun)
  62924601600, #  local_start 1995-01-01 00:00:00 (Sun)
  62931870000, #    local_end 1995-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62931862800, #    utc_start 1995-03-26 01:00:00 (Sun)
  62947587600, #      utc_end 1995-09-24 01:00:00 (Sun)
  62931873600, #  local_start 1995-03-26 04:00:00 (Sun)
  62947598400, #    local_end 1995-09-24 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62947587600, #    utc_start 1995-09-24 01:00:00 (Sun)
  62963917200, #      utc_end 1996-03-31 01:00:00 (Sun)
  62947594800, #  local_start 1995-09-24 03:00:00 (Sun)
  62963924400, #    local_end 1996-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62963917200, #    utc_start 1996-03-31 01:00:00 (Sun)
  62982061200, #      utc_end 1996-10-27 01:00:00 (Sun)
  62963928000, #  local_start 1996-03-31 04:00:00 (Sun)
  62982072000, #    local_end 1996-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62982061200, #    utc_start 1996-10-27 01:00:00 (Sun)
  62995366800, #      utc_end 1997-03-30 01:00:00 (Sun)
  62982068400, #  local_start 1996-10-27 03:00:00 (Sun)
  62995374000, #    local_end 1997-03-30 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62995366800, #    utc_start 1997-03-30 01:00:00 (Sun)
  63013510800, #      utc_end 1997-10-26 01:00:00 (Sun)
  62995377600, #  local_start 1997-03-30 04:00:00 (Sun)
  63013521600, #    local_end 1997-10-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63013510800, #    utc_start 1997-10-26 01:00:00 (Sun)
  63026816400, #      utc_end 1998-03-29 01:00:00 (Sun)
  63013518000, #  local_start 1997-10-26 03:00:00 (Sun)
  63026823600, #    local_end 1998-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63026816400, #    utc_start 1998-03-29 01:00:00 (Sun)
  63044960400, #      utc_end 1998-10-25 01:00:00 (Sun)
  63026827200, #  local_start 1998-03-29 04:00:00 (Sun)
  63044971200, #    local_end 1998-10-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63044960400, #    utc_start 1998-10-25 01:00:00 (Sun)
  63058266000, #      utc_end 1999-03-28 01:00:00 (Sun)
  63044967600, #  local_start 1998-10-25 03:00:00 (Sun)
  63058273200, #    local_end 1999-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63058266000, #    utc_start 1999-03-28 01:00:00 (Sun)
  63077014800, #      utc_end 1999-10-31 01:00:00 (Sun)
  63058276800, #  local_start 1999-03-28 04:00:00 (Sun)
  63077025600, #    local_end 1999-10-31 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63077014800, #    utc_start 1999-10-31 01:00:00 (Sun)
  63089715600, #      utc_end 2000-03-26 01:00:00 (Sun)
  63077022000, #  local_start 1999-10-31 03:00:00 (Sun)
  63089722800, #    local_end 2000-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63089715600, #    utc_start 2000-03-26 01:00:00 (Sun)
  63108464400, #      utc_end 2000-10-29 01:00:00 (Sun)
  63089726400, #  local_start 2000-03-26 04:00:00 (Sun)
  63108475200, #    local_end 2000-10-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63108464400, #    utc_start 2000-10-29 01:00:00 (Sun)
  63121165200, #      utc_end 2001-03-25 01:00:00 (Sun)
  63108471600, #  local_start 2000-10-29 03:00:00 (Sun)
  63121172400, #    local_end 2001-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63121165200, #    utc_start 2001-03-25 01:00:00 (Sun)
  63139914000, #      utc_end 2001-10-28 01:00:00 (Sun)
  63121176000, #  local_start 2001-03-25 04:00:00 (Sun)
  63139924800, #    local_end 2001-10-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63139914000, #    utc_start 2001-10-28 01:00:00 (Sun)
  63153219600, #      utc_end 2002-03-31 01:00:00 (Sun)
  63139921200, #  local_start 2001-10-28 03:00:00 (Sun)
  63153226800, #    local_end 2002-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63153219600, #    utc_start 2002-03-31 01:00:00 (Sun)
  63171363600, #      utc_end 2002-10-27 01:00:00 (Sun)
  63153230400, #  local_start 2002-03-31 04:00:00 (Sun)
  63171374400, #    local_end 2002-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63171363600, #    utc_start 2002-10-27 01:00:00 (Sun)
  63184669200, #      utc_end 2003-03-30 01:00:00 (Sun)
  63171370800, #  local_start 2002-10-27 03:00:00 (Sun)
  63184676400, #    local_end 2003-03-30 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63184669200, #    utc_start 2003-03-30 01:00:00 (Sun)
  63202813200, #      utc_end 2003-10-26 01:00:00 (Sun)
  63184680000, #  local_start 2003-03-30 04:00:00 (Sun)
  63202824000, #    local_end 2003-10-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63202813200, #    utc_start 2003-10-26 01:00:00 (Sun)
  63216118800, #      utc_end 2004-03-28 01:00:00 (Sun)
  63202820400, #  local_start 2003-10-26 03:00:00 (Sun)
  63216126000, #    local_end 2004-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63216118800, #    utc_start 2004-03-28 01:00:00 (Sun)
  63234867600, #      utc_end 2004-10-31 01:00:00 (Sun)
  63216129600, #  local_start 2004-03-28 04:00:00 (Sun)
  63234878400, #    local_end 2004-10-31 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63234867600, #    utc_start 2004-10-31 01:00:00 (Sun)
  63247568400, #      utc_end 2005-03-27 01:00:00 (Sun)
  63234874800, #  local_start 2004-10-31 03:00:00 (Sun)
  63247575600, #    local_end 2005-03-27 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63247568400, #    utc_start 2005-03-27 01:00:00 (Sun)
  63266317200, #      utc_end 2005-10-30 01:00:00 (Sun)
  63247579200, #  local_start 2005-03-27 04:00:00 (Sun)
  63266328000, #    local_end 2005-10-30 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63266317200, #    utc_start 2005-10-30 01:00:00 (Sun)
  63279018000, #      utc_end 2006-03-26 01:00:00 (Sun)
  63266324400, #  local_start 2005-10-30 03:00:00 (Sun)
  63279025200, #    local_end 2006-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63279018000, #    utc_start 2006-03-26 01:00:00 (Sun)
  63297766800, #      utc_end 2006-10-29 01:00:00 (Sun)
  63279028800, #  local_start 2006-03-26 04:00:00 (Sun)
  63297777600, #    local_end 2006-10-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63297766800, #    utc_start 2006-10-29 01:00:00 (Sun)
  63310467600, #      utc_end 2007-03-25 01:00:00 (Sun)
  63297774000, #  local_start 2006-10-29 03:00:00 (Sun)
  63310474800, #    local_end 2007-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63310467600, #    utc_start 2007-03-25 01:00:00 (Sun)
  63329216400, #      utc_end 2007-10-28 01:00:00 (Sun)
  63310478400, #  local_start 2007-03-25 04:00:00 (Sun)
  63329227200, #    local_end 2007-10-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63329216400, #    utc_start 2007-10-28 01:00:00 (Sun)
  63342522000, #      utc_end 2008-03-30 01:00:00 (Sun)
  63329223600, #  local_start 2007-10-28 03:00:00 (Sun)
  63342529200, #    local_end 2008-03-30 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63342522000, #    utc_start 2008-03-30 01:00:00 (Sun)
  63360666000, #      utc_end 2008-10-26 01:00:00 (Sun)
  63342532800, #  local_start 2008-03-30 04:00:00 (Sun)
  63360676800, #    local_end 2008-10-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63360666000, #    utc_start 2008-10-26 01:00:00 (Sun)
  63373971600, #      utc_end 2009-03-29 01:00:00 (Sun)
  63360673200, #  local_start 2008-10-26 03:00:00 (Sun)
  63373978800, #    local_end 2009-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63373971600, #    utc_start 2009-03-29 01:00:00 (Sun)
  63392115600, #      utc_end 2009-10-25 01:00:00 (Sun)
  63373982400, #  local_start 2009-03-29 04:00:00 (Sun)
  63392126400, #    local_end 2009-10-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63392115600, #    utc_start 2009-10-25 01:00:00 (Sun)
  63405421200, #      utc_end 2010-03-28 01:00:00 (Sun)
  63392122800, #  local_start 2009-10-25 03:00:00 (Sun)
  63405428400, #    local_end 2010-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63405421200, #    utc_start 2010-03-28 01:00:00 (Sun)
  63424170000, #      utc_end 2010-10-31 01:00:00 (Sun)
  63405432000, #  local_start 2010-03-28 04:00:00 (Sun)
  63424180800, #    local_end 2010-10-31 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63424170000, #    utc_start 2010-10-31 01:00:00 (Sun)
  63436870800, #      utc_end 2011-03-27 01:00:00 (Sun)
  63424177200, #  local_start 2010-10-31 03:00:00 (Sun)
  63436878000, #    local_end 2011-03-27 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63436870800, #    utc_start 2011-03-27 01:00:00 (Sun)
  63455619600, #      utc_end 2011-10-30 01:00:00 (Sun)
  63436881600, #  local_start 2011-03-27 04:00:00 (Sun)
  63455630400, #    local_end 2011-10-30 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63455619600, #    utc_start 2011-10-30 01:00:00 (Sun)
  63468320400, #      utc_end 2012-03-25 01:00:00 (Sun)
  63455626800, #  local_start 2011-10-30 03:00:00 (Sun)
  63468327600, #    local_end 2012-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63468320400, #    utc_start 2012-03-25 01:00:00 (Sun)
  63487069200, #      utc_end 2012-10-28 01:00:00 (Sun)
  63468331200, #  local_start 2012-03-25 04:00:00 (Sun)
  63487080000, #    local_end 2012-10-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63487069200, #    utc_start 2012-10-28 01:00:00 (Sun)
  63500374800, #      utc_end 2013-03-31 01:00:00 (Sun)
  63487076400, #  local_start 2012-10-28 03:00:00 (Sun)
  63500382000, #    local_end 2013-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63500374800, #    utc_start 2013-03-31 01:00:00 (Sun)
  63518518800, #      utc_end 2013-10-27 01:00:00 (Sun)
  63500385600, #  local_start 2013-03-31 04:00:00 (Sun)
  63518529600, #    local_end 2013-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63518518800, #    utc_start 2013-10-27 01:00:00 (Sun)
  63531824400, #      utc_end 2014-03-30 01:00:00 (Sun)
  63518526000, #  local_start 2013-10-27 03:00:00 (Sun)
  63531831600, #    local_end 2014-03-30 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63531824400, #    utc_start 2014-03-30 01:00:00 (Sun)
  63549968400, #      utc_end 2014-10-26 01:00:00 (Sun)
  63531835200, #  local_start 2014-03-30 04:00:00 (Sun)
  63549979200, #    local_end 2014-10-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63549968400, #    utc_start 2014-10-26 01:00:00 (Sun)
  63563274000, #      utc_end 2015-03-29 01:00:00 (Sun)
  63549975600, #  local_start 2014-10-26 03:00:00 (Sun)
  63563281200, #    local_end 2015-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63563274000, #    utc_start 2015-03-29 01:00:00 (Sun)
  63581418000, #      utc_end 2015-10-25 01:00:00 (Sun)
  63563284800, #  local_start 2015-03-29 04:00:00 (Sun)
  63581428800, #    local_end 2015-10-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63581418000, #    utc_start 2015-10-25 01:00:00 (Sun)
  63594723600, #      utc_end 2016-03-27 01:00:00 (Sun)
  63581425200, #  local_start 2015-10-25 03:00:00 (Sun)
  63594730800, #    local_end 2016-03-27 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63594723600, #    utc_start 2016-03-27 01:00:00 (Sun)
  63613472400, #      utc_end 2016-10-30 01:00:00 (Sun)
  63594734400, #  local_start 2016-03-27 04:00:00 (Sun)
  63613483200, #    local_end 2016-10-30 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63613472400, #    utc_start 2016-10-30 01:00:00 (Sun)
  63626173200, #      utc_end 2017-03-26 01:00:00 (Sun)
  63613479600, #  local_start 2016-10-30 03:00:00 (Sun)
  63626180400, #    local_end 2017-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63626173200, #    utc_start 2017-03-26 01:00:00 (Sun)
  63644922000, #      utc_end 2017-10-29 01:00:00 (Sun)
  63626184000, #  local_start 2017-03-26 04:00:00 (Sun)
  63644932800, #    local_end 2017-10-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63644922000, #    utc_start 2017-10-29 01:00:00 (Sun)
  63657622800, #      utc_end 2018-03-25 01:00:00 (Sun)
  63644929200, #  local_start 2017-10-29 03:00:00 (Sun)
  63657630000, #    local_end 2018-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63657622800, #    utc_start 2018-03-25 01:00:00 (Sun)
  63676371600, #      utc_end 2018-10-28 01:00:00 (Sun)
  63657633600, #  local_start 2018-03-25 04:00:00 (Sun)
  63676382400, #    local_end 2018-10-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63676371600, #    utc_start 2018-10-28 01:00:00 (Sun)
  63689677200, #      utc_end 2019-03-31 01:00:00 (Sun)
  63676378800, #  local_start 2018-10-28 03:00:00 (Sun)
  63689684400, #    local_end 2019-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63689677200, #    utc_start 2019-03-31 01:00:00 (Sun)
  63707821200, #      utc_end 2019-10-27 01:00:00 (Sun)
  63689688000, #  local_start 2019-03-31 04:00:00 (Sun)
  63707832000, #    local_end 2019-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63707821200, #    utc_start 2019-10-27 01:00:00 (Sun)
  63721126800, #      utc_end 2020-03-29 01:00:00 (Sun)
  63707828400, #  local_start 2019-10-27 03:00:00 (Sun)
  63721134000, #    local_end 2020-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63721126800, #    utc_start 2020-03-29 01:00:00 (Sun)
  63739270800, #      utc_end 2020-10-25 01:00:00 (Sun)
  63721137600, #  local_start 2020-03-29 04:00:00 (Sun)
  63739281600, #    local_end 2020-10-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63739270800, #    utc_start 2020-10-25 01:00:00 (Sun)
  63752576400, #      utc_end 2021-03-28 01:00:00 (Sun)
  63739278000, #  local_start 2020-10-25 03:00:00 (Sun)
  63752583600, #    local_end 2021-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63752576400, #    utc_start 2021-03-28 01:00:00 (Sun)
  63771325200, #      utc_end 2021-10-31 01:00:00 (Sun)
  63752587200, #  local_start 2021-03-28 04:00:00 (Sun)
  63771336000, #    local_end 2021-10-31 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63771325200, #    utc_start 2021-10-31 01:00:00 (Sun)
  63784026000, #      utc_end 2022-03-27 01:00:00 (Sun)
  63771332400, #  local_start 2021-10-31 03:00:00 (Sun)
  63784033200, #    local_end 2022-03-27 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63784026000, #    utc_start 2022-03-27 01:00:00 (Sun)
  63802774800, #      utc_end 2022-10-30 01:00:00 (Sun)
  63784036800, #  local_start 2022-03-27 04:00:00 (Sun)
  63802785600, #    local_end 2022-10-30 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63802774800, #    utc_start 2022-10-30 01:00:00 (Sun)
  63815475600, #      utc_end 2023-03-26 01:00:00 (Sun)
  63802782000, #  local_start 2022-10-30 03:00:00 (Sun)
  63815482800, #    local_end 2023-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63815475600, #    utc_start 2023-03-26 01:00:00 (Sun)
  63834224400, #      utc_end 2023-10-29 01:00:00 (Sun)
  63815486400, #  local_start 2023-03-26 04:00:00 (Sun)
  63834235200, #    local_end 2023-10-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63834224400, #    utc_start 2023-10-29 01:00:00 (Sun)
  63847530000, #      utc_end 2024-03-31 01:00:00 (Sun)
  63834231600, #  local_start 2023-10-29 03:00:00 (Sun)
  63847537200, #    local_end 2024-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63847530000, #    utc_start 2024-03-31 01:00:00 (Sun)
  63865674000, #      utc_end 2024-10-27 01:00:00 (Sun)
  63847540800, #  local_start 2024-03-31 04:00:00 (Sun)
  63865684800, #    local_end 2024-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63865674000, #    utc_start 2024-10-27 01:00:00 (Sun)
  63878979600, #      utc_end 2025-03-30 01:00:00 (Sun)
  63865681200, #  local_start 2024-10-27 03:00:00 (Sun)
  63878986800, #    local_end 2025-03-30 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63878979600, #    utc_start 2025-03-30 01:00:00 (Sun)
  63897123600, #      utc_end 2025-10-26 01:00:00 (Sun)
  63878990400, #  local_start 2025-03-30 04:00:00 (Sun)
  63897134400, #    local_end 2025-10-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63897123600, #    utc_start 2025-10-26 01:00:00 (Sun)
  63910429200, #      utc_end 2026-03-29 01:00:00 (Sun)
  63897130800, #  local_start 2025-10-26 03:00:00 (Sun)
  63910436400, #    local_end 2026-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63910429200, #    utc_start 2026-03-29 01:00:00 (Sun)
  63928573200, #      utc_end 2026-10-25 01:00:00 (Sun)
  63910440000, #  local_start 2026-03-29 04:00:00 (Sun)
  63928584000, #    local_end 2026-10-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63928573200, #    utc_start 2026-10-25 01:00:00 (Sun)
  63941878800, #      utc_end 2027-03-28 01:00:00 (Sun)
  63928580400, #  local_start 2026-10-25 03:00:00 (Sun)
  63941886000, #    local_end 2027-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63941878800, #    utc_start 2027-03-28 01:00:00 (Sun)
  63960627600, #      utc_end 2027-10-31 01:00:00 (Sun)
  63941889600, #  local_start 2027-03-28 04:00:00 (Sun)
  63960638400, #    local_end 2027-10-31 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63960627600, #    utc_start 2027-10-31 01:00:00 (Sun)
  63973328400, #      utc_end 2028-03-26 01:00:00 (Sun)
  63960634800, #  local_start 2027-10-31 03:00:00 (Sun)
  63973335600, #    local_end 2028-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63973328400, #    utc_start 2028-03-26 01:00:00 (Sun)
  63992077200, #      utc_end 2028-10-29 01:00:00 (Sun)
  63973339200, #  local_start 2028-03-26 04:00:00 (Sun)
  63992088000, #    local_end 2028-10-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63992077200, #    utc_start 2028-10-29 01:00:00 (Sun)
  64004778000, #      utc_end 2029-03-25 01:00:00 (Sun)
  63992084400, #  local_start 2028-10-29 03:00:00 (Sun)
  64004785200, #    local_end 2029-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  64004778000, #    utc_start 2029-03-25 01:00:00 (Sun)
  64023526800, #      utc_end 2029-10-28 01:00:00 (Sun)
  64004788800, #  local_start 2029-03-25 04:00:00 (Sun)
  64023537600, #    local_end 2029-10-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  64023526800, #    utc_start 2029-10-28 01:00:00 (Sun)
  64036832400, #      utc_end 2030-03-31 01:00:00 (Sun)
  64023534000, #  local_start 2029-10-28 03:00:00 (Sun)
  64036839600, #    local_end 2030-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  64036832400, #    utc_start 2030-03-31 01:00:00 (Sun)
  64054976400, #      utc_end 2030-10-27 01:00:00 (Sun)
  64036843200, #  local_start 2030-03-31 04:00:00 (Sun)
  64054987200, #    local_end 2030-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {52}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { 7200 }
  
  my $last_observance = bless( {
    'format' => 'EE%sT',
    'gmtoff' => '2:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 728294,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 728294,
      'utc_rd_secs' => 0,
      'utc_year' => 1996
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => 7200,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 728293,
      'local_rd_secs' => 79200,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 728293,
      'utc_rd_secs' => 79200,
      'utc_year' => 1995
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '1:00u',
      'from' => '1996',
      'in' => 'Oct',
      'letter' => '',
      'name' => 'EU',
      'offset_from_std' => 0,
      'on' => 'lastSun',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '1:00u',
      'from' => '1981',
      'in' => 'Mar',
      'letter' => 'S',
      'name' => 'EU',
      'offset_from_std' => 3600,
      'on' => 'lastSun',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_EUROPE_KIEV

    $main::fatpacked{"DateTime/TimeZone/Europe/Kirov.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_EUROPE_KIROV';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Europe::Kirov;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Europe::Kirov::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60541862400, #      utc_end 1919-07-01 00:00:00 (Tue)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60541874328, #    local_end 1919-07-01 03:18:48 (Tue)
  11928,
  0,
  'LMT',
      ],
      [
  60541862400, #    utc_start 1919-07-01 00:00:00 (Tue)
  60888142800, #      utc_end 1930-06-20 21:00:00 (Fri)
  60541873200, #  local_start 1919-07-01 03:00:00 (Tue)
  60888153600, #    local_end 1930-06-21 00:00:00 (Sat)
  10800,
  0,
  '+03',
      ],
      [
  60888142800, #    utc_start 1930-06-20 21:00:00 (Fri)
  62490600000, #      utc_end 1981-03-31 20:00:00 (Tue)
  60888157200, #  local_start 1930-06-21 01:00:00 (Sat)
  62490614400, #    local_end 1981-04-01 00:00:00 (Wed)
  14400,
  0,
  '+04',
      ],
      [
  62490600000, #    utc_start 1981-03-31 20:00:00 (Tue)
  62506407600, #      utc_end 1981-09-30 19:00:00 (Wed)
  62490618000, #  local_start 1981-04-01 01:00:00 (Wed)
  62506425600, #    local_end 1981-10-01 00:00:00 (Thu)
  18000,
  1,
  '+05',
      ],
      [
  62506407600, #    utc_start 1981-09-30 19:00:00 (Wed)
  62522136000, #      utc_end 1982-03-31 20:00:00 (Wed)
  62506422000, #  local_start 1981-09-30 23:00:00 (Wed)
  62522150400, #    local_end 1982-04-01 00:00:00 (Thu)
  14400,
  0,
  '+04',
      ],
      [
  62522136000, #    utc_start 1982-03-31 20:00:00 (Wed)
  62537943600, #      utc_end 1982-09-30 19:00:00 (Thu)
  62522154000, #  local_start 1982-04-01 01:00:00 (Thu)
  62537961600, #    local_end 1982-10-01 00:00:00 (Fri)
  18000,
  1,
  '+05',
      ],
      [
  62537943600, #    utc_start 1982-09-30 19:00:00 (Thu)
  62553672000, #      utc_end 1983-03-31 20:00:00 (Thu)
  62537958000, #  local_start 1982-09-30 23:00:00 (Thu)
  62553686400, #    local_end 1983-04-01 00:00:00 (Fri)
  14400,
  0,
  '+04',
      ],
      [
  62553672000, #    utc_start 1983-03-31 20:00:00 (Thu)
  62569479600, #      utc_end 1983-09-30 19:00:00 (Fri)
  62553690000, #  local_start 1983-04-01 01:00:00 (Fri)
  62569497600, #    local_end 1983-10-01 00:00:00 (Sat)
  18000,
  1,
  '+05',
      ],
      [
  62569479600, #    utc_start 1983-09-30 19:00:00 (Fri)
  62585294400, #      utc_end 1984-03-31 20:00:00 (Sat)
  62569494000, #  local_start 1983-09-30 23:00:00 (Fri)
  62585308800, #    local_end 1984-04-01 00:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62585294400, #    utc_start 1984-03-31 20:00:00 (Sat)
  62601026400, #      utc_end 1984-09-29 22:00:00 (Sat)
  62585312400, #  local_start 1984-04-01 01:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62601026400, #    utc_start 1984-09-29 22:00:00 (Sat)
  62616751200, #      utc_end 1985-03-30 22:00:00 (Sat)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62616751200, #    utc_start 1985-03-30 22:00:00 (Sat)
  62632476000, #      utc_end 1985-09-28 22:00:00 (Sat)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62632476000, #    utc_start 1985-09-28 22:00:00 (Sat)
  62648200800, #      utc_end 1986-03-29 22:00:00 (Sat)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62648200800, #    utc_start 1986-03-29 22:00:00 (Sat)
  62663925600, #      utc_end 1986-09-27 22:00:00 (Sat)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62663925600, #    utc_start 1986-09-27 22:00:00 (Sat)
  62679650400, #      utc_end 1987-03-28 22:00:00 (Sat)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62679650400, #    utc_start 1987-03-28 22:00:00 (Sat)
  62695375200, #      utc_end 1987-09-26 22:00:00 (Sat)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62695375200, #    utc_start 1987-09-26 22:00:00 (Sat)
  62711100000, #      utc_end 1988-03-26 22:00:00 (Sat)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62711100000, #    utc_start 1988-03-26 22:00:00 (Sat)
  62726824800, #      utc_end 1988-09-24 22:00:00 (Sat)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62726824800, #    utc_start 1988-09-24 22:00:00 (Sat)
  62742549600, #      utc_end 1989-03-25 22:00:00 (Sat)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62742549600, #    utc_start 1989-03-25 22:00:00 (Sat)
  62758278000, #      utc_end 1989-09-23 23:00:00 (Sat)
  62742564000, #  local_start 1989-03-26 02:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  62758278000, #    utc_start 1989-09-23 23:00:00 (Sat)
  62774002800, #      utc_end 1990-03-24 23:00:00 (Sat)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  62774002800, #    utc_start 1990-03-24 23:00:00 (Sat)
  62790332400, #      utc_end 1990-09-29 23:00:00 (Sat)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  62790332400, #    utc_start 1990-09-29 23:00:00 (Sat)
  62806057200, #      utc_end 1991-03-30 23:00:00 (Sat)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  62806057200, #    utc_start 1991-03-30 23:00:00 (Sat)
  62837503200, #      utc_end 1992-03-28 22:00:00 (Sat)
  62806071600, #  local_start 1991-03-31 03:00:00 (Sun)
  62837517600, #    local_end 1992-03-29 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62837503200, #    utc_start 1992-03-28 22:00:00 (Sat)
  62853231600, #      utc_end 1992-09-26 23:00:00 (Sat)
  62837517600, #  local_start 1992-03-29 02:00:00 (Sun)
  62853246000, #    local_end 1992-09-27 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  62853231600, #    utc_start 1992-09-26 23:00:00 (Sat)
  62868956400, #      utc_end 1993-03-27 23:00:00 (Sat)
  62853242400, #  local_start 1992-09-27 02:00:00 (Sun)
  62868967200, #    local_end 1993-03-28 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  62868956400, #    utc_start 1993-03-27 23:00:00 (Sat)
  62884681200, #      utc_end 1993-09-25 23:00:00 (Sat)
  62868970800, #  local_start 1993-03-28 03:00:00 (Sun)
  62884695600, #    local_end 1993-09-26 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  62884681200, #    utc_start 1993-09-25 23:00:00 (Sat)
  62900406000, #      utc_end 1994-03-26 23:00:00 (Sat)
  62884692000, #  local_start 1993-09-26 02:00:00 (Sun)
  62900416800, #    local_end 1994-03-27 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  62900406000, #    utc_start 1994-03-26 23:00:00 (Sat)
  62916130800, #      utc_end 1994-09-24 23:00:00 (Sat)
  62900420400, #  local_start 1994-03-27 03:00:00 (Sun)
  62916145200, #    local_end 1994-09-25 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  62916130800, #    utc_start 1994-09-24 23:00:00 (Sat)
  62931855600, #      utc_end 1995-03-25 23:00:00 (Sat)
  62916141600, #  local_start 1994-09-25 02:00:00 (Sun)
  62931866400, #    local_end 1995-03-26 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  62931855600, #    utc_start 1995-03-25 23:00:00 (Sat)
  62947580400, #      utc_end 1995-09-23 23:00:00 (Sat)
  62931870000, #  local_start 1995-03-26 03:00:00 (Sun)
  62947594800, #    local_end 1995-09-24 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  62947580400, #    utc_start 1995-09-23 23:00:00 (Sat)
  62963910000, #      utc_end 1996-03-30 23:00:00 (Sat)
  62947591200, #  local_start 1995-09-24 02:00:00 (Sun)
  62963920800, #    local_end 1996-03-31 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  62963910000, #    utc_start 1996-03-30 23:00:00 (Sat)
  62982054000, #      utc_end 1996-10-26 23:00:00 (Sat)
  62963924400, #  local_start 1996-03-31 03:00:00 (Sun)
  62982068400, #    local_end 1996-10-27 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  62982054000, #    utc_start 1996-10-26 23:00:00 (Sat)
  62995359600, #      utc_end 1997-03-29 23:00:00 (Sat)
  62982064800, #  local_start 1996-10-27 02:00:00 (Sun)
  62995370400, #    local_end 1997-03-30 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  62995359600, #    utc_start 1997-03-29 23:00:00 (Sat)
  63013503600, #      utc_end 1997-10-25 23:00:00 (Sat)
  62995374000, #  local_start 1997-03-30 03:00:00 (Sun)
  63013518000, #    local_end 1997-10-26 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63013503600, #    utc_start 1997-10-25 23:00:00 (Sat)
  63026809200, #      utc_end 1998-03-28 23:00:00 (Sat)
  63013514400, #  local_start 1997-10-26 02:00:00 (Sun)
  63026820000, #    local_end 1998-03-29 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63026809200, #    utc_start 1998-03-28 23:00:00 (Sat)
  63044953200, #      utc_end 1998-10-24 23:00:00 (Sat)
  63026823600, #  local_start 1998-03-29 03:00:00 (Sun)
  63044967600, #    local_end 1998-10-25 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63044953200, #    utc_start 1998-10-24 23:00:00 (Sat)
  63058258800, #      utc_end 1999-03-27 23:00:00 (Sat)
  63044964000, #  local_start 1998-10-25 02:00:00 (Sun)
  63058269600, #    local_end 1999-03-28 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63058258800, #    utc_start 1999-03-27 23:00:00 (Sat)
  63077007600, #      utc_end 1999-10-30 23:00:00 (Sat)
  63058273200, #  local_start 1999-03-28 03:00:00 (Sun)
  63077022000, #    local_end 1999-10-31 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63077007600, #    utc_start 1999-10-30 23:00:00 (Sat)
  63089708400, #      utc_end 2000-03-25 23:00:00 (Sat)
  63077018400, #  local_start 1999-10-31 02:00:00 (Sun)
  63089719200, #    local_end 2000-03-26 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63089708400, #    utc_start 2000-03-25 23:00:00 (Sat)
  63108457200, #      utc_end 2000-10-28 23:00:00 (Sat)
  63089722800, #  local_start 2000-03-26 03:00:00 (Sun)
  63108471600, #    local_end 2000-10-29 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63108457200, #    utc_start 2000-10-28 23:00:00 (Sat)
  63121158000, #      utc_end 2001-03-24 23:00:00 (Sat)
  63108468000, #  local_start 2000-10-29 02:00:00 (Sun)
  63121168800, #    local_end 2001-03-25 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63121158000, #    utc_start 2001-03-24 23:00:00 (Sat)
  63139906800, #      utc_end 2001-10-27 23:00:00 (Sat)
  63121172400, #  local_start 2001-03-25 03:00:00 (Sun)
  63139921200, #    local_end 2001-10-28 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63139906800, #    utc_start 2001-10-27 23:00:00 (Sat)
  63153212400, #      utc_end 2002-03-30 23:00:00 (Sat)
  63139917600, #  local_start 2001-10-28 02:00:00 (Sun)
  63153223200, #    local_end 2002-03-31 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63153212400, #    utc_start 2002-03-30 23:00:00 (Sat)
  63171356400, #      utc_end 2002-10-26 23:00:00 (Sat)
  63153226800, #  local_start 2002-03-31 03:00:00 (Sun)
  63171370800, #    local_end 2002-10-27 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63171356400, #    utc_start 2002-10-26 23:00:00 (Sat)
  63184662000, #      utc_end 2003-03-29 23:00:00 (Sat)
  63171367200, #  local_start 2002-10-27 02:00:00 (Sun)
  63184672800, #    local_end 2003-03-30 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63184662000, #    utc_start 2003-03-29 23:00:00 (Sat)
  63202806000, #      utc_end 2003-10-25 23:00:00 (Sat)
  63184676400, #  local_start 2003-03-30 03:00:00 (Sun)
  63202820400, #    local_end 2003-10-26 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63202806000, #    utc_start 2003-10-25 23:00:00 (Sat)
  63216111600, #      utc_end 2004-03-27 23:00:00 (Sat)
  63202816800, #  local_start 2003-10-26 02:00:00 (Sun)
  63216122400, #    local_end 2004-03-28 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63216111600, #    utc_start 2004-03-27 23:00:00 (Sat)
  63234860400, #      utc_end 2004-10-30 23:00:00 (Sat)
  63216126000, #  local_start 2004-03-28 03:00:00 (Sun)
  63234874800, #    local_end 2004-10-31 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63234860400, #    utc_start 2004-10-30 23:00:00 (Sat)
  63247561200, #      utc_end 2005-03-26 23:00:00 (Sat)
  63234871200, #  local_start 2004-10-31 02:00:00 (Sun)
  63247572000, #    local_end 2005-03-27 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63247561200, #    utc_start 2005-03-26 23:00:00 (Sat)
  63266310000, #      utc_end 2005-10-29 23:00:00 (Sat)
  63247575600, #  local_start 2005-03-27 03:00:00 (Sun)
  63266324400, #    local_end 2005-10-30 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63266310000, #    utc_start 2005-10-29 23:00:00 (Sat)
  63279010800, #      utc_end 2006-03-25 23:00:00 (Sat)
  63266320800, #  local_start 2005-10-30 02:00:00 (Sun)
  63279021600, #    local_end 2006-03-26 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63279010800, #    utc_start 2006-03-25 23:00:00 (Sat)
  63297759600, #      utc_end 2006-10-28 23:00:00 (Sat)
  63279025200, #  local_start 2006-03-26 03:00:00 (Sun)
  63297774000, #    local_end 2006-10-29 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63297759600, #    utc_start 2006-10-28 23:00:00 (Sat)
  63310460400, #      utc_end 2007-03-24 23:00:00 (Sat)
  63297770400, #  local_start 2006-10-29 02:00:00 (Sun)
  63310471200, #    local_end 2007-03-25 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63310460400, #    utc_start 2007-03-24 23:00:00 (Sat)
  63329209200, #      utc_end 2007-10-27 23:00:00 (Sat)
  63310474800, #  local_start 2007-03-25 03:00:00 (Sun)
  63329223600, #    local_end 2007-10-28 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63329209200, #    utc_start 2007-10-27 23:00:00 (Sat)
  63342514800, #      utc_end 2008-03-29 23:00:00 (Sat)
  63329220000, #  local_start 2007-10-28 02:00:00 (Sun)
  63342525600, #    local_end 2008-03-30 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63342514800, #    utc_start 2008-03-29 23:00:00 (Sat)
  63360658800, #      utc_end 2008-10-25 23:00:00 (Sat)
  63342529200, #  local_start 2008-03-30 03:00:00 (Sun)
  63360673200, #    local_end 2008-10-26 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63360658800, #    utc_start 2008-10-25 23:00:00 (Sat)
  63373964400, #      utc_end 2009-03-28 23:00:00 (Sat)
  63360669600, #  local_start 2008-10-26 02:00:00 (Sun)
  63373975200, #    local_end 2009-03-29 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63373964400, #    utc_start 2009-03-28 23:00:00 (Sat)
  63392108400, #      utc_end 2009-10-24 23:00:00 (Sat)
  63373978800, #  local_start 2009-03-29 03:00:00 (Sun)
  63392122800, #    local_end 2009-10-25 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63392108400, #    utc_start 2009-10-24 23:00:00 (Sat)
  63405414000, #      utc_end 2010-03-27 23:00:00 (Sat)
  63392119200, #  local_start 2009-10-25 02:00:00 (Sun)
  63405424800, #    local_end 2010-03-28 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63405414000, #    utc_start 2010-03-27 23:00:00 (Sat)
  63424162800, #      utc_end 2010-10-30 23:00:00 (Sat)
  63405428400, #  local_start 2010-03-28 03:00:00 (Sun)
  63424177200, #    local_end 2010-10-31 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63424162800, #    utc_start 2010-10-30 23:00:00 (Sat)
  63436863600, #      utc_end 2011-03-26 23:00:00 (Sat)
  63424173600, #  local_start 2010-10-31 02:00:00 (Sun)
  63436874400, #    local_end 2011-03-27 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63436863600, #    utc_start 2011-03-26 23:00:00 (Sat)
  63549957600, #      utc_end 2014-10-25 22:00:00 (Sat)
  63436878000, #  local_start 2011-03-27 03:00:00 (Sun)
  63549972000, #    local_end 2014-10-26 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63549957600, #    utc_start 2014-10-25 22:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  63549968400, #  local_start 2014-10-26 01:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  10800,
  0,
  '+03',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {29}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_EUROPE_KIROV

    $main::fatpacked{"DateTime/TimeZone/Europe/Lisbon.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_EUROPE_LISBON';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Europe::Lisbon;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Europe::Lisbon::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59421775005, #      utc_end 1884-01-01 00:36:45 (Tue)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59421772800, #    local_end 1884-01-01 00:00:00 (Tue)
  -2205,
  0,
  'LMT',
      ],
      [
  59421775005, #    utc_start 1884-01-01 00:36:45 (Tue)
  60305299200, #      utc_end 1912-01-01 00:00:00 (Mon)
  59421772800, #  local_start 1884-01-01 00:00:00 (Tue)
  60305296995, #    local_end 1911-12-31 23:23:15 (Sun)
  -2205,
  0,
  'LMT',
      ],
      [
  60305299200, #    utc_start 1912-01-01 00:00:00 (Mon)
  60446127600, #      utc_end 1916-06-17 23:00:00 (Sat)
  60305299200, #  local_start 1912-01-01 00:00:00 (Mon)
  60446127600, #    local_end 1916-06-17 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  60446127600, #    utc_start 1916-06-17 23:00:00 (Sat)
  60457881600, #      utc_end 1916-11-01 00:00:00 (Wed)
  60446131200, #  local_start 1916-06-18 00:00:00 (Sun)
  60457885200, #    local_end 1916-11-01 01:00:00 (Wed)
  3600,
  1,
  'WEST',
      ],
      [
  60457881600, #    utc_start 1916-11-01 00:00:00 (Wed)
  60468246000, #      utc_end 1917-02-28 23:00:00 (Wed)
  60457881600, #  local_start 1916-11-01 00:00:00 (Wed)
  60468246000, #    local_end 1917-02-28 23:00:00 (Wed)
  0,
  0,
  'WET',
      ],
      [
  60468246000, #    utc_start 1917-02-28 23:00:00 (Wed)
  60487945200, #      utc_end 1917-10-14 23:00:00 (Sun)
  60468249600, #  local_start 1917-03-01 00:00:00 (Thu)
  60487948800, #    local_end 1917-10-15 00:00:00 (Mon)
  3600,
  1,
  'WEST',
      ],
      [
  60487945200, #    utc_start 1917-10-14 23:00:00 (Sun)
  60499868400, #      utc_end 1918-03-01 23:00:00 (Fri)
  60487945200, #  local_start 1917-10-14 23:00:00 (Sun)
  60499868400, #    local_end 1918-03-01 23:00:00 (Fri)
  0,
  0,
  'WET',
      ],
      [
  60499868400, #    utc_start 1918-03-01 23:00:00 (Fri)
  60519481200, #      utc_end 1918-10-14 23:00:00 (Mon)
  60499872000, #  local_start 1918-03-02 00:00:00 (Sat)
  60519484800, #    local_end 1918-10-15 00:00:00 (Tue)
  3600,
  1,
  'WEST',
      ],
      [
  60519481200, #    utc_start 1918-10-14 23:00:00 (Mon)
  60531318000, #      utc_end 1919-02-28 23:00:00 (Fri)
  60519481200, #  local_start 1918-10-14 23:00:00 (Mon)
  60531318000, #    local_end 1919-02-28 23:00:00 (Fri)
  0,
  0,
  'WET',
      ],
      [
  60531318000, #    utc_start 1919-02-28 23:00:00 (Fri)
  60551017200, #      utc_end 1919-10-14 23:00:00 (Tue)
  60531321600, #  local_start 1919-03-01 00:00:00 (Sat)
  60551020800, #    local_end 1919-10-15 00:00:00 (Wed)
  3600,
  1,
  'WEST',
      ],
      [
  60551017200, #    utc_start 1919-10-14 23:00:00 (Tue)
  60562940400, #      utc_end 1920-02-29 23:00:00 (Sun)
  60551017200, #  local_start 1919-10-14 23:00:00 (Tue)
  60562940400, #    local_end 1920-02-29 23:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  60562940400, #    utc_start 1920-02-29 23:00:00 (Sun)
  60582639600, #      utc_end 1920-10-14 23:00:00 (Thu)
  60562944000, #  local_start 1920-03-01 00:00:00 (Mon)
  60582643200, #    local_end 1920-10-15 00:00:00 (Fri)
  3600,
  1,
  'WEST',
      ],
      [
  60582639600, #    utc_start 1920-10-14 23:00:00 (Thu)
  60594476400, #      utc_end 1921-02-28 23:00:00 (Mon)
  60582639600, #  local_start 1920-10-14 23:00:00 (Thu)
  60594476400, #    local_end 1921-02-28 23:00:00 (Mon)
  0,
  0,
  'WET',
      ],
      [
  60594476400, #    utc_start 1921-02-28 23:00:00 (Mon)
  60614175600, #      utc_end 1921-10-14 23:00:00 (Fri)
  60594480000, #  local_start 1921-03-01 00:00:00 (Tue)
  60614179200, #    local_end 1921-10-15 00:00:00 (Sat)
  3600,
  1,
  'WEST',
      ],
      [
  60614175600, #    utc_start 1921-10-14 23:00:00 (Fri)
  60693231600, #      utc_end 1924-04-16 23:00:00 (Wed)
  60614175600, #  local_start 1921-10-14 23:00:00 (Fri)
  60693231600, #    local_end 1924-04-16 23:00:00 (Wed)
  0,
  0,
  'WET',
      ],
      [
  60693231600, #    utc_start 1924-04-16 23:00:00 (Wed)
  60708870000, #      utc_end 1924-10-14 23:00:00 (Tue)
  60693235200, #  local_start 1924-04-17 00:00:00 (Thu)
  60708873600, #    local_end 1924-10-15 00:00:00 (Wed)
  3600,
  1,
  'WEST',
      ],
      [
  60708870000, #    utc_start 1924-10-14 23:00:00 (Tue)
  60756390000, #      utc_end 1926-04-17 23:00:00 (Sat)
  60708870000, #  local_start 1924-10-14 23:00:00 (Tue)
  60756390000, #    local_end 1926-04-17 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  60756390000, #    utc_start 1926-04-17 23:00:00 (Sat)
  60770905200, #      utc_end 1926-10-02 23:00:00 (Sat)
  60756393600, #  local_start 1926-04-18 00:00:00 (Sun)
  60770908800, #    local_end 1926-10-03 00:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60770905200, #    utc_start 1926-10-02 23:00:00 (Sat)
  60787234800, #      utc_end 1927-04-09 23:00:00 (Sat)
  60770905200, #  local_start 1926-10-02 23:00:00 (Sat)
  60787234800, #    local_end 1927-04-09 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  60787234800, #    utc_start 1927-04-09 23:00:00 (Sat)
  60802354800, #      utc_end 1927-10-01 23:00:00 (Sat)
  60787238400, #  local_start 1927-04-10 00:00:00 (Sun)
  60802358400, #    local_end 1927-10-02 00:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60802354800, #    utc_start 1927-10-01 23:00:00 (Sat)
  60819289200, #      utc_end 1928-04-14 23:00:00 (Sat)
  60802354800, #  local_start 1927-10-01 23:00:00 (Sat)
  60819289200, #    local_end 1928-04-14 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  60819289200, #    utc_start 1928-04-14 23:00:00 (Sat)
  60834409200, #      utc_end 1928-10-06 23:00:00 (Sat)
  60819292800, #  local_start 1928-04-15 00:00:00 (Sun)
  60834412800, #    local_end 1928-10-07 00:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60834409200, #    utc_start 1928-10-06 23:00:00 (Sat)
  60851343600, #      utc_end 1929-04-20 23:00:00 (Sat)
  60834409200, #  local_start 1928-10-06 23:00:00 (Sat)
  60851343600, #    local_end 1929-04-20 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  60851343600, #    utc_start 1929-04-20 23:00:00 (Sat)
  60865858800, #      utc_end 1929-10-05 23:00:00 (Sat)
  60851347200, #  local_start 1929-04-21 00:00:00 (Sun)
  60865862400, #    local_end 1929-10-06 00:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60865858800, #    utc_start 1929-10-05 23:00:00 (Sat)
  60914242800, #      utc_end 1931-04-18 23:00:00 (Sat)
  60865858800, #  local_start 1929-10-05 23:00:00 (Sat)
  60914242800, #    local_end 1931-04-18 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  60914242800, #    utc_start 1931-04-18 23:00:00 (Sat)
  60928758000, #      utc_end 1931-10-03 23:00:00 (Sat)
  60914246400, #  local_start 1931-04-19 00:00:00 (Sun)
  60928761600, #    local_end 1931-10-04 00:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60928758000, #    utc_start 1931-10-03 23:00:00 (Sat)
  60944482800, #      utc_end 1932-04-02 23:00:00 (Sat)
  60928758000, #  local_start 1931-10-03 23:00:00 (Sat)
  60944482800, #    local_end 1932-04-02 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  60944482800, #    utc_start 1932-04-02 23:00:00 (Sat)
  60960207600, #      utc_end 1932-10-01 23:00:00 (Sat)
  60944486400, #  local_start 1932-04-03 00:00:00 (Sun)
  60960211200, #    local_end 1932-10-02 00:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60960207600, #    utc_start 1932-10-01 23:00:00 (Sat)
  61007986800, #      utc_end 1934-04-07 23:00:00 (Sat)
  60960207600, #  local_start 1932-10-01 23:00:00 (Sat)
  61007986800, #    local_end 1934-04-07 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  61007986800, #    utc_start 1934-04-07 23:00:00 (Sat)
  61023711600, #      utc_end 1934-10-06 23:00:00 (Sat)
  61007990400, #  local_start 1934-04-08 00:00:00 (Sun)
  61023715200, #    local_end 1934-10-07 00:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  61023711600, #    utc_start 1934-10-06 23:00:00 (Sat)
  61038831600, #      utc_end 1935-03-30 23:00:00 (Sat)
  61023711600, #  local_start 1934-10-06 23:00:00 (Sat)
  61038831600, #    local_end 1935-03-30 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  61038831600, #    utc_start 1935-03-30 23:00:00 (Sat)
  61055161200, #      utc_end 1935-10-05 23:00:00 (Sat)
  61038835200, #  local_start 1935-03-31 00:00:00 (Sun)
  61055164800, #    local_end 1935-10-06 00:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  61055161200, #    utc_start 1935-10-05 23:00:00 (Sat)
  61072095600, #      utc_end 1936-04-18 23:00:00 (Sat)
  61055161200, #  local_start 1935-10-05 23:00:00 (Sat)
  61072095600, #    local_end 1936-04-18 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  61072095600, #    utc_start 1936-04-18 23:00:00 (Sat)
  61086610800, #      utc_end 1936-10-03 23:00:00 (Sat)
  61072099200, #  local_start 1936-04-19 00:00:00 (Sun)
  61086614400, #    local_end 1936-10-04 00:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  61086610800, #    utc_start 1936-10-03 23:00:00 (Sat)
  61102335600, #      utc_end 1937-04-03 23:00:00 (Sat)
  61086610800, #  local_start 1936-10-03 23:00:00 (Sat)
  61102335600, #    local_end 1937-04-03 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  61102335600, #    utc_start 1937-04-03 23:00:00 (Sat)
  61118060400, #      utc_end 1937-10-02 23:00:00 (Sat)
  61102339200, #  local_start 1937-04-04 00:00:00 (Sun)
  61118064000, #    local_end 1937-10-03 00:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  61118060400, #    utc_start 1937-10-02 23:00:00 (Sat)
  61133180400, #      utc_end 1938-03-26 23:00:00 (Sat)
  61118060400, #  local_start 1937-10-02 23:00:00 (Sat)
  61133180400, #    local_end 1938-03-26 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  61133180400, #    utc_start 1938-03-26 23:00:00 (Sat)
  61149510000, #      utc_end 1938-10-01 23:00:00 (Sat)
  61133184000, #  local_start 1938-03-27 00:00:00 (Sun)
  61149513600, #    local_end 1938-10-02 00:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  61149510000, #    utc_start 1938-10-01 23:00:00 (Sat)
  61166444400, #      utc_end 1939-04-15 23:00:00 (Sat)
  61149510000, #  local_start 1938-10-01 23:00:00 (Sat)
  61166444400, #    local_end 1939-04-15 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  61166444400, #    utc_start 1939-04-15 23:00:00 (Sat)
  61185193200, #      utc_end 1939-11-18 23:00:00 (Sat)
  61166448000, #  local_start 1939-04-16 00:00:00 (Sun)
  61185196800, #    local_end 1939-11-19 00:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  61185193200, #    utc_start 1939-11-18 23:00:00 (Sat)
  61193660400, #      utc_end 1940-02-24 23:00:00 (Sat)
  61185193200, #  local_start 1939-11-18 23:00:00 (Sat)
  61193660400, #    local_end 1940-02-24 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  61193660400, #    utc_start 1940-02-24 23:00:00 (Sat)
  61213014000, #      utc_end 1940-10-05 23:00:00 (Sat)
  61193664000, #  local_start 1940-02-25 00:00:00 (Sun)
  61213017600, #    local_end 1940-10-06 00:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  61213014000, #    utc_start 1940-10-05 23:00:00 (Sat)
  61228738800, #      utc_end 1941-04-05 23:00:00 (Sat)
  61213014000, #  local_start 1940-10-05 23:00:00 (Sat)
  61228738800, #    local_end 1941-04-05 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  61228738800, #    utc_start 1941-04-05 23:00:00 (Sat)
  61244550000, #      utc_end 1941-10-05 23:00:00 (Sun)
  61228742400, #  local_start 1941-04-06 00:00:00 (Sun)
  61244553600, #    local_end 1941-10-06 00:00:00 (Mon)
  3600,
  1,
  'WEST',
      ],
      [
  61244550000, #    utc_start 1941-10-05 23:00:00 (Sun)
  61258374000, #      utc_end 1942-03-14 23:00:00 (Sat)
  61244550000, #  local_start 1941-10-05 23:00:00 (Sun)
  61258374000, #    local_end 1942-03-14 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  61258374000, #    utc_start 1942-03-14 23:00:00 (Sat)
  61261999200, #      utc_end 1942-04-25 22:00:00 (Sat)
  61258377600, #  local_start 1942-03-15 00:00:00 (Sun)
  61262002800, #    local_end 1942-04-25 23:00:00 (Sat)
  3600,
  1,
  'WEST',
      ],
      [
  61261999200, #    utc_start 1942-04-25 22:00:00 (Sat)
  61271676000, #      utc_end 1942-08-15 22:00:00 (Sat)
  61262006400, #  local_start 1942-04-26 00:00:00 (Sun)
  61271683200, #    local_end 1942-08-16 00:00:00 (Sun)
  7200,
  1,
  'WEMT',
      ],
      [
  61271676000, #    utc_start 1942-08-15 22:00:00 (Sat)
  61277727600, #      utc_end 1942-10-24 23:00:00 (Sat)
  61271679600, #  local_start 1942-08-15 23:00:00 (Sat)
  61277731200, #    local_end 1942-10-25 00:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  61277727600, #    utc_start 1942-10-24 23:00:00 (Sat)
  61289823600, #      utc_end 1943-03-13 23:00:00 (Sat)
  61277727600, #  local_start 1942-10-24 23:00:00 (Sat)
  61289823600, #    local_end 1943-03-13 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  61289823600, #    utc_start 1943-03-13 23:00:00 (Sat)
  61292844000, #      utc_end 1943-04-17 22:00:00 (Sat)
  61289827200, #  local_start 1943-03-14 00:00:00 (Sun)
  61292847600, #    local_end 1943-04-17 23:00:00 (Sat)
  3600,
  1,
  'WEST',
      ],
      [
  61292844000, #    utc_start 1943-04-17 22:00:00 (Sat)
  61304335200, #      utc_end 1943-08-28 22:00:00 (Sat)
  61292851200, #  local_start 1943-04-18 00:00:00 (Sun)
  61304342400, #    local_end 1943-08-29 00:00:00 (Sun)
  7200,
  1,
  'WEMT',
      ],
      [
  61304335200, #    utc_start 1943-08-28 22:00:00 (Sat)
  61309782000, #      utc_end 1943-10-30 23:00:00 (Sat)
  61304338800, #  local_start 1943-08-28 23:00:00 (Sat)
  61309785600, #    local_end 1943-10-31 00:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  61309782000, #    utc_start 1943-10-30 23:00:00 (Sat)
  61321273200, #      utc_end 1944-03-11 23:00:00 (Sat)
  61309782000, #  local_start 1943-10-30 23:00:00 (Sat)
  61321273200, #    local_end 1944-03-11 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  61321273200, #    utc_start 1944-03-11 23:00:00 (Sat)
  61324898400, #      utc_end 1944-04-22 22:00:00 (Sat)
  61321276800, #  local_start 1944-03-12 00:00:00 (Sun)
  61324902000, #    local_end 1944-04-22 23:00:00 (Sat)
  3600,
  1,
  'WEST',
      ],
      [
  61324898400, #    utc_start 1944-04-22 22:00:00 (Sat)
  61335784800, #      utc_end 1944-08-26 22:00:00 (Sat)
  61324905600, #  local_start 1944-04-23 00:00:00 (Sun)
  61335792000, #    local_end 1944-08-27 00:00:00 (Sun)
  7200,
  1,
  'WEMT',
      ],
      [
  61335784800, #    utc_start 1944-08-26 22:00:00 (Sat)
  61341231600, #      utc_end 1944-10-28 23:00:00 (Sat)
  61335788400, #  local_start 1944-08-26 23:00:00 (Sat)
  61341235200, #    local_end 1944-10-29 00:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  61341231600, #    utc_start 1944-10-28 23:00:00 (Sat)
  61352722800, #      utc_end 1945-03-10 23:00:00 (Sat)
  61341231600, #  local_start 1944-10-28 23:00:00 (Sat)
  61352722800, #    local_end 1945-03-10 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  61352722800, #    utc_start 1945-03-10 23:00:00 (Sat)
  61356348000, #      utc_end 1945-04-21 22:00:00 (Sat)
  61352726400, #  local_start 1945-03-11 00:00:00 (Sun)
  61356351600, #    local_end 1945-04-21 23:00:00 (Sat)
  3600,
  1,
  'WEST',
      ],
      [
  61356348000, #    utc_start 1945-04-21 22:00:00 (Sat)
  61367234400, #      utc_end 1945-08-25 22:00:00 (Sat)
  61356355200, #  local_start 1945-04-22 00:00:00 (Sun)
  61367241600, #    local_end 1945-08-26 00:00:00 (Sun)
  7200,
  1,
  'WEMT',
      ],
      [
  61367234400, #    utc_start 1945-08-25 22:00:00 (Sat)
  61372681200, #      utc_end 1945-10-27 23:00:00 (Sat)
  61367238000, #  local_start 1945-08-25 23:00:00 (Sat)
  61372684800, #    local_end 1945-10-28 00:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  61372681200, #    utc_start 1945-10-27 23:00:00 (Sat)
  61386591600, #      utc_end 1946-04-06 23:00:00 (Sat)
  61372681200, #  local_start 1945-10-27 23:00:00 (Sat)
  61386591600, #    local_end 1946-04-06 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  61386591600, #    utc_start 1946-04-06 23:00:00 (Sat)
  61402316400, #      utc_end 1946-10-05 23:00:00 (Sat)
  61386595200, #  local_start 1946-04-07 00:00:00 (Sun)
  61402320000, #    local_end 1946-10-06 00:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  61402316400, #    utc_start 1946-10-05 23:00:00 (Sat)
  61418052000, #      utc_end 1947-04-06 02:00:00 (Sun)
  61402316400, #  local_start 1946-10-05 23:00:00 (Sat)
  61418052000, #    local_end 1947-04-06 02:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  61418052000, #    utc_start 1947-04-06 02:00:00 (Sun)
  61433776800, #      utc_end 1947-10-05 02:00:00 (Sun)
  61418055600, #  local_start 1947-04-06 03:00:00 (Sun)
  61433780400, #    local_end 1947-10-05 03:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  61433776800, #    utc_start 1947-10-05 02:00:00 (Sun)
  61449501600, #      utc_end 1948-04-04 02:00:00 (Sun)
  61433776800, #  local_start 1947-10-05 02:00:00 (Sun)
  61449501600, #    local_end 1948-04-04 02:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  61449501600, #    utc_start 1948-04-04 02:00:00 (Sun)
  61465226400, #      utc_end 1948-10-03 02:00:00 (Sun)
  61449505200, #  local_start 1948-04-04 03:00:00 (Sun)
  61465230000, #    local_end 1948-10-03 03:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  61465226400, #    utc_start 1948-10-03 02:00:00 (Sun)
  61480951200, #      utc_end 1949-04-03 02:00:00 (Sun)
  61465226400, #  local_start 1948-10-03 02:00:00 (Sun)
  61480951200, #    local_end 1949-04-03 02:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  61480951200, #    utc_start 1949-04-03 02:00:00 (Sun)
  61496676000, #      utc_end 1949-10-02 02:00:00 (Sun)
  61480954800, #  local_start 1949-04-03 03:00:00 (Sun)
  61496679600, #    local_end 1949-10-02 03:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  61496676000, #    utc_start 1949-10-02 02:00:00 (Sun)
  61543850400, #      utc_end 1951-04-01 02:00:00 (Sun)
  61496676000, #  local_start 1949-10-02 02:00:00 (Sun)
  61543850400, #    local_end 1951-04-01 02:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  61543850400, #    utc_start 1951-04-01 02:00:00 (Sun)
  61560180000, #      utc_end 1951-10-07 02:00:00 (Sun)
  61543854000, #  local_start 1951-04-01 03:00:00 (Sun)
  61560183600, #    local_end 1951-10-07 03:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  61560180000, #    utc_start 1951-10-07 02:00:00 (Sun)
  61575904800, #      utc_end 1952-04-06 02:00:00 (Sun)
  61560180000, #  local_start 1951-10-07 02:00:00 (Sun)
  61575904800, #    local_end 1952-04-06 02:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  61575904800, #    utc_start 1952-04-06 02:00:00 (Sun)
  61591629600, #      utc_end 1952-10-05 02:00:00 (Sun)
  61575908400, #  local_start 1952-04-06 03:00:00 (Sun)
  61591633200, #    local_end 1952-10-05 03:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  61591629600, #    utc_start 1952-10-05 02:00:00 (Sun)
  61607354400, #      utc_end 1953-04-05 02:00:00 (Sun)
  61591629600, #  local_start 1952-10-05 02:00:00 (Sun)
  61607354400, #    local_end 1953-04-05 02:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  61607354400, #    utc_start 1953-04-05 02:00:00 (Sun)
  61623079200, #      utc_end 1953-10-04 02:00:00 (Sun)
  61607358000, #  local_start 1953-04-05 03:00:00 (Sun)
  61623082800, #    local_end 1953-10-04 03:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  61623079200, #    utc_start 1953-10-04 02:00:00 (Sun)
  61638804000, #      utc_end 1954-04-04 02:00:00 (Sun)
  61623079200, #  local_start 1953-10-04 02:00:00 (Sun)
  61638804000, #    local_end 1954-04-04 02:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  61638804000, #    utc_start 1954-04-04 02:00:00 (Sun)
  61654528800, #      utc_end 1954-10-03 02:00:00 (Sun)
  61638807600, #  local_start 1954-04-04 03:00:00 (Sun)
  61654532400, #    local_end 1954-10-03 03:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  61654528800, #    utc_start 1954-10-03 02:00:00 (Sun)
  61670253600, #      utc_end 1955-04-03 02:00:00 (Sun)
  61654528800, #  local_start 1954-10-03 02:00:00 (Sun)
  61670253600, #    local_end 1955-04-03 02:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  61670253600, #    utc_start 1955-04-03 02:00:00 (Sun)
  61685978400, #      utc_end 1955-10-02 02:00:00 (Sun)
  61670257200, #  local_start 1955-04-03 03:00:00 (Sun)
  61685982000, #    local_end 1955-10-02 03:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  61685978400, #    utc_start 1955-10-02 02:00:00 (Sun)
  61701703200, #      utc_end 1956-04-01 02:00:00 (Sun)
  61685978400, #  local_start 1955-10-02 02:00:00 (Sun)
  61701703200, #    local_end 1956-04-01 02:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  61701703200, #    utc_start 1956-04-01 02:00:00 (Sun)
  61718032800, #      utc_end 1956-10-07 02:00:00 (Sun)
  61701706800, #  local_start 1956-04-01 03:00:00 (Sun)
  61718036400, #    local_end 1956-10-07 03:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  61718032800, #    utc_start 1956-10-07 02:00:00 (Sun)
  61733757600, #      utc_end 1957-04-07 02:00:00 (Sun)
  61718032800, #  local_start 1956-10-07 02:00:00 (Sun)
  61733757600, #    local_end 1957-04-07 02:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  61733757600, #    utc_start 1957-04-07 02:00:00 (Sun)
  61749482400, #      utc_end 1957-10-06 02:00:00 (Sun)
  61733761200, #  local_start 1957-04-07 03:00:00 (Sun)
  61749486000, #    local_end 1957-10-06 03:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  61749482400, #    utc_start 1957-10-06 02:00:00 (Sun)
  61765207200, #      utc_end 1958-04-06 02:00:00 (Sun)
  61749482400, #  local_start 1957-10-06 02:00:00 (Sun)
  61765207200, #    local_end 1958-04-06 02:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  61765207200, #    utc_start 1958-04-06 02:00:00 (Sun)
  61780932000, #      utc_end 1958-10-05 02:00:00 (Sun)
  61765210800, #  local_start 1958-04-06 03:00:00 (Sun)
  61780935600, #    local_end 1958-10-05 03:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  61780932000, #    utc_start 1958-10-05 02:00:00 (Sun)
  61796656800, #      utc_end 1959-04-05 02:00:00 (Sun)
  61780932000, #  local_start 1958-10-05 02:00:00 (Sun)
  61796656800, #    local_end 1959-04-05 02:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  61796656800, #    utc_start 1959-04-05 02:00:00 (Sun)
  61812381600, #      utc_end 1959-10-04 02:00:00 (Sun)
  61796660400, #  local_start 1959-04-05 03:00:00 (Sun)
  61812385200, #    local_end 1959-10-04 03:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  61812381600, #    utc_start 1959-10-04 02:00:00 (Sun)
  61828106400, #      utc_end 1960-04-03 02:00:00 (Sun)
  61812381600, #  local_start 1959-10-04 02:00:00 (Sun)
  61828106400, #    local_end 1960-04-03 02:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  61828106400, #    utc_start 1960-04-03 02:00:00 (Sun)
  61843831200, #      utc_end 1960-10-02 02:00:00 (Sun)
  61828110000, #  local_start 1960-04-03 03:00:00 (Sun)
  61843834800, #    local_end 1960-10-02 03:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  61843831200, #    utc_start 1960-10-02 02:00:00 (Sun)
  61859556000, #      utc_end 1961-04-02 02:00:00 (Sun)
  61843831200, #  local_start 1960-10-02 02:00:00 (Sun)
  61859556000, #    local_end 1961-04-02 02:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  61859556000, #    utc_start 1961-04-02 02:00:00 (Sun)
  61875280800, #      utc_end 1961-10-01 02:00:00 (Sun)
  61859559600, #  local_start 1961-04-02 03:00:00 (Sun)
  61875284400, #    local_end 1961-10-01 03:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  61875280800, #    utc_start 1961-10-01 02:00:00 (Sun)
  61891005600, #      utc_end 1962-04-01 02:00:00 (Sun)
  61875280800, #  local_start 1961-10-01 02:00:00 (Sun)
  61891005600, #    local_end 1962-04-01 02:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  61891005600, #    utc_start 1962-04-01 02:00:00 (Sun)
  61907335200, #      utc_end 1962-10-07 02:00:00 (Sun)
  61891009200, #  local_start 1962-04-01 03:00:00 (Sun)
  61907338800, #    local_end 1962-10-07 03:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  61907335200, #    utc_start 1962-10-07 02:00:00 (Sun)
  61923060000, #      utc_end 1963-04-07 02:00:00 (Sun)
  61907335200, #  local_start 1962-10-07 02:00:00 (Sun)
  61923060000, #    local_end 1963-04-07 02:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  61923060000, #    utc_start 1963-04-07 02:00:00 (Sun)
  61938784800, #      utc_end 1963-10-06 02:00:00 (Sun)
  61923063600, #  local_start 1963-04-07 03:00:00 (Sun)
  61938788400, #    local_end 1963-10-06 03:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  61938784800, #    utc_start 1963-10-06 02:00:00 (Sun)
  61954509600, #      utc_end 1964-04-05 02:00:00 (Sun)
  61938784800, #  local_start 1963-10-06 02:00:00 (Sun)
  61954509600, #    local_end 1964-04-05 02:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  61954509600, #    utc_start 1964-04-05 02:00:00 (Sun)
  61970234400, #      utc_end 1964-10-04 02:00:00 (Sun)
  61954513200, #  local_start 1964-04-05 03:00:00 (Sun)
  61970238000, #    local_end 1964-10-04 03:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  61970234400, #    utc_start 1964-10-04 02:00:00 (Sun)
  61985959200, #      utc_end 1965-04-04 02:00:00 (Sun)
  61970234400, #  local_start 1964-10-04 02:00:00 (Sun)
  61985959200, #    local_end 1965-04-04 02:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  61985959200, #    utc_start 1965-04-04 02:00:00 (Sun)
  62001684000, #      utc_end 1965-10-03 02:00:00 (Sun)
  61985962800, #  local_start 1965-04-04 03:00:00 (Sun)
  62001687600, #    local_end 1965-10-03 03:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62001684000, #    utc_start 1965-10-03 02:00:00 (Sun)
  62017408800, #      utc_end 1966-04-03 02:00:00 (Sun)
  62001684000, #  local_start 1965-10-03 02:00:00 (Sun)
  62017408800, #    local_end 1966-04-03 02:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62017408800, #    utc_start 1966-04-03 02:00:00 (Sun)
  62348227200, #      utc_end 1976-09-26 00:00:00 (Sun)
  62017412400, #  local_start 1966-04-03 03:00:00 (Sun)
  62348230800, #    local_end 1976-09-26 01:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62348227200, #    utc_start 1976-09-26 00:00:00 (Sun)
  62363952000, #      utc_end 1977-03-27 00:00:00 (Sun)
  62348227200, #  local_start 1976-09-26 00:00:00 (Sun)
  62363952000, #    local_end 1977-03-27 00:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62363952000, #    utc_start 1977-03-27 00:00:00 (Sun)
  62379676800, #      utc_end 1977-09-25 00:00:00 (Sun)
  62363955600, #  local_start 1977-03-27 01:00:00 (Sun)
  62379680400, #    local_end 1977-09-25 01:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62379676800, #    utc_start 1977-09-25 00:00:00 (Sun)
  62396006400, #      utc_end 1978-04-02 00:00:00 (Sun)
  62379676800, #  local_start 1977-09-25 00:00:00 (Sun)
  62396006400, #    local_end 1978-04-02 00:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62396006400, #    utc_start 1978-04-02 00:00:00 (Sun)
  62411731200, #      utc_end 1978-10-01 00:00:00 (Sun)
  62396010000, #  local_start 1978-04-02 01:00:00 (Sun)
  62411734800, #    local_end 1978-10-01 01:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62411731200, #    utc_start 1978-10-01 00:00:00 (Sun)
  62427456000, #      utc_end 1979-04-01 00:00:00 (Sun)
  62411731200, #  local_start 1978-10-01 00:00:00 (Sun)
  62427456000, #    local_end 1979-04-01 00:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62427456000, #    utc_start 1979-04-01 00:00:00 (Sun)
  62443184400, #      utc_end 1979-09-30 01:00:00 (Sun)
  62427459600, #  local_start 1979-04-01 01:00:00 (Sun)
  62443188000, #    local_end 1979-09-30 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62443184400, #    utc_start 1979-09-30 01:00:00 (Sun)
  62458905600, #      utc_end 1980-03-30 00:00:00 (Sun)
  62443184400, #  local_start 1979-09-30 01:00:00 (Sun)
  62458905600, #    local_end 1980-03-30 00:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62458905600, #    utc_start 1980-03-30 00:00:00 (Sun)
  62474634000, #      utc_end 1980-09-28 01:00:00 (Sun)
  62458909200, #  local_start 1980-03-30 01:00:00 (Sun)
  62474637600, #    local_end 1980-09-28 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62474634000, #    utc_start 1980-09-28 01:00:00 (Sun)
  62490358800, #      utc_end 1981-03-29 01:00:00 (Sun)
  62474634000, #  local_start 1980-09-28 01:00:00 (Sun)
  62490358800, #    local_end 1981-03-29 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62490358800, #    utc_start 1981-03-29 01:00:00 (Sun)
  62506083600, #      utc_end 1981-09-27 01:00:00 (Sun)
  62490362400, #  local_start 1981-03-29 02:00:00 (Sun)
  62506087200, #    local_end 1981-09-27 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62506083600, #    utc_start 1981-09-27 01:00:00 (Sun)
  62521808400, #      utc_end 1982-03-28 01:00:00 (Sun)
  62506083600, #  local_start 1981-09-27 01:00:00 (Sun)
  62521808400, #    local_end 1982-03-28 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62521808400, #    utc_start 1982-03-28 01:00:00 (Sun)
  62537533200, #      utc_end 1982-09-26 01:00:00 (Sun)
  62521812000, #  local_start 1982-03-28 02:00:00 (Sun)
  62537536800, #    local_end 1982-09-26 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62537533200, #    utc_start 1982-09-26 01:00:00 (Sun)
  62553261600, #      utc_end 1983-03-27 02:00:00 (Sun)
  62537533200, #  local_start 1982-09-26 01:00:00 (Sun)
  62553261600, #    local_end 1983-03-27 02:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62553261600, #    utc_start 1983-03-27 02:00:00 (Sun)
  62568982800, #      utc_end 1983-09-25 01:00:00 (Sun)
  62553265200, #  local_start 1983-03-27 03:00:00 (Sun)
  62568986400, #    local_end 1983-09-25 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62568982800, #    utc_start 1983-09-25 01:00:00 (Sun)
  62584707600, #      utc_end 1984-03-25 01:00:00 (Sun)
  62568982800, #  local_start 1983-09-25 01:00:00 (Sun)
  62584707600, #    local_end 1984-03-25 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62584707600, #    utc_start 1984-03-25 01:00:00 (Sun)
  62601037200, #      utc_end 1984-09-30 01:00:00 (Sun)
  62584711200, #  local_start 1984-03-25 02:00:00 (Sun)
  62601040800, #    local_end 1984-09-30 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62601037200, #    utc_start 1984-09-30 01:00:00 (Sun)
  62616762000, #      utc_end 1985-03-31 01:00:00 (Sun)
  62601037200, #  local_start 1984-09-30 01:00:00 (Sun)
  62616762000, #    local_end 1985-03-31 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62616762000, #    utc_start 1985-03-31 01:00:00 (Sun)
  62632486800, #      utc_end 1985-09-29 01:00:00 (Sun)
  62616765600, #  local_start 1985-03-31 02:00:00 (Sun)
  62632490400, #    local_end 1985-09-29 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62632486800, #    utc_start 1985-09-29 01:00:00 (Sun)
  62648211600, #      utc_end 1986-03-30 01:00:00 (Sun)
  62632486800, #  local_start 1985-09-29 01:00:00 (Sun)
  62648211600, #    local_end 1986-03-30 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62648211600, #    utc_start 1986-03-30 01:00:00 (Sun)
  62663936400, #      utc_end 1986-09-28 01:00:00 (Sun)
  62648215200, #  local_start 1986-03-30 02:00:00 (Sun)
  62663940000, #    local_end 1986-09-28 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62663936400, #    utc_start 1986-09-28 01:00:00 (Sun)
  62679661200, #      utc_end 1987-03-29 01:00:00 (Sun)
  62663936400, #  local_start 1986-09-28 01:00:00 (Sun)
  62679661200, #    local_end 1987-03-29 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62679661200, #    utc_start 1987-03-29 01:00:00 (Sun)
  62695386000, #      utc_end 1987-09-27 01:00:00 (Sun)
  62679664800, #  local_start 1987-03-29 02:00:00 (Sun)
  62695389600, #    local_end 1987-09-27 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62695386000, #    utc_start 1987-09-27 01:00:00 (Sun)
  62711110800, #      utc_end 1988-03-27 01:00:00 (Sun)
  62695386000, #  local_start 1987-09-27 01:00:00 (Sun)
  62711110800, #    local_end 1988-03-27 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62711110800, #    utc_start 1988-03-27 01:00:00 (Sun)
  62726835600, #      utc_end 1988-09-25 01:00:00 (Sun)
  62711114400, #  local_start 1988-03-27 02:00:00 (Sun)
  62726839200, #    local_end 1988-09-25 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62726835600, #    utc_start 1988-09-25 01:00:00 (Sun)
  62742560400, #      utc_end 1989-03-26 01:00:00 (Sun)
  62726835600, #  local_start 1988-09-25 01:00:00 (Sun)
  62742560400, #    local_end 1989-03-26 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62742560400, #    utc_start 1989-03-26 01:00:00 (Sun)
  62758285200, #      utc_end 1989-09-24 01:00:00 (Sun)
  62742564000, #  local_start 1989-03-26 02:00:00 (Sun)
  62758288800, #    local_end 1989-09-24 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62758285200, #    utc_start 1989-09-24 01:00:00 (Sun)
  62774010000, #      utc_end 1990-03-25 01:00:00 (Sun)
  62758285200, #  local_start 1989-09-24 01:00:00 (Sun)
  62774010000, #    local_end 1990-03-25 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62774010000, #    utc_start 1990-03-25 01:00:00 (Sun)
  62790339600, #      utc_end 1990-09-30 01:00:00 (Sun)
  62774013600, #  local_start 1990-03-25 02:00:00 (Sun)
  62790343200, #    local_end 1990-09-30 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62790339600, #    utc_start 1990-09-30 01:00:00 (Sun)
  62806064400, #      utc_end 1991-03-31 01:00:00 (Sun)
  62790339600, #  local_start 1990-09-30 01:00:00 (Sun)
  62806064400, #    local_end 1991-03-31 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62806064400, #    utc_start 1991-03-31 01:00:00 (Sun)
  62821789200, #      utc_end 1991-09-29 01:00:00 (Sun)
  62806068000, #  local_start 1991-03-31 02:00:00 (Sun)
  62821792800, #    local_end 1991-09-29 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62821789200, #    utc_start 1991-09-29 01:00:00 (Sun)
  62837514000, #      utc_end 1992-03-29 01:00:00 (Sun)
  62821789200, #  local_start 1991-09-29 01:00:00 (Sun)
  62837514000, #    local_end 1992-03-29 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62837514000, #    utc_start 1992-03-29 01:00:00 (Sun)
  62853238800, #      utc_end 1992-09-27 01:00:00 (Sun)
  62837517600, #  local_start 1992-03-29 02:00:00 (Sun)
  62853242400, #    local_end 1992-09-27 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62853238800, #    utc_start 1992-09-27 01:00:00 (Sun)
  62868963600, #      utc_end 1993-03-28 01:00:00 (Sun)
  62853242400, #  local_start 1992-09-27 02:00:00 (Sun)
  62868967200, #    local_end 1993-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62868963600, #    utc_start 1993-03-28 01:00:00 (Sun)
  62884688400, #      utc_end 1993-09-26 01:00:00 (Sun)
  62868970800, #  local_start 1993-03-28 03:00:00 (Sun)
  62884695600, #    local_end 1993-09-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62884688400, #    utc_start 1993-09-26 01:00:00 (Sun)
  62900413200, #      utc_end 1994-03-27 01:00:00 (Sun)
  62884692000, #  local_start 1993-09-26 02:00:00 (Sun)
  62900416800, #    local_end 1994-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62900413200, #    utc_start 1994-03-27 01:00:00 (Sun)
  62916138000, #      utc_end 1994-09-25 01:00:00 (Sun)
  62900420400, #  local_start 1994-03-27 03:00:00 (Sun)
  62916145200, #    local_end 1994-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62916138000, #    utc_start 1994-09-25 01:00:00 (Sun)
  62931862800, #      utc_end 1995-03-26 01:00:00 (Sun)
  62916141600, #  local_start 1994-09-25 02:00:00 (Sun)
  62931866400, #    local_end 1995-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62931862800, #    utc_start 1995-03-26 01:00:00 (Sun)
  62947587600, #      utc_end 1995-09-24 01:00:00 (Sun)
  62931870000, #  local_start 1995-03-26 03:00:00 (Sun)
  62947594800, #    local_end 1995-09-24 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62947587600, #    utc_start 1995-09-24 01:00:00 (Sun)
  62963917200, #      utc_end 1996-03-31 01:00:00 (Sun)
  62947591200, #  local_start 1995-09-24 02:00:00 (Sun)
  62963920800, #    local_end 1996-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62963917200, #    utc_start 1996-03-31 01:00:00 (Sun)
  62982061200, #      utc_end 1996-10-27 01:00:00 (Sun)
  62963920800, #  local_start 1996-03-31 02:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62982061200, #    utc_start 1996-10-27 01:00:00 (Sun)
  62995366800, #      utc_end 1997-03-30 01:00:00 (Sun)
  62982061200, #  local_start 1996-10-27 01:00:00 (Sun)
  62995366800, #    local_end 1997-03-30 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62995366800, #    utc_start 1997-03-30 01:00:00 (Sun)
  63013510800, #      utc_end 1997-10-26 01:00:00 (Sun)
  62995370400, #  local_start 1997-03-30 02:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63013510800, #    utc_start 1997-10-26 01:00:00 (Sun)
  63026816400, #      utc_end 1998-03-29 01:00:00 (Sun)
  63013510800, #  local_start 1997-10-26 01:00:00 (Sun)
  63026816400, #    local_end 1998-03-29 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63026816400, #    utc_start 1998-03-29 01:00:00 (Sun)
  63044960400, #      utc_end 1998-10-25 01:00:00 (Sun)
  63026820000, #  local_start 1998-03-29 02:00:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63044960400, #    utc_start 1998-10-25 01:00:00 (Sun)
  63058266000, #      utc_end 1999-03-28 01:00:00 (Sun)
  63044960400, #  local_start 1998-10-25 01:00:00 (Sun)
  63058266000, #    local_end 1999-03-28 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63058266000, #    utc_start 1999-03-28 01:00:00 (Sun)
  63077014800, #      utc_end 1999-10-31 01:00:00 (Sun)
  63058269600, #  local_start 1999-03-28 02:00:00 (Sun)
  63077018400, #    local_end 1999-10-31 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63077014800, #    utc_start 1999-10-31 01:00:00 (Sun)
  63089715600, #      utc_end 2000-03-26 01:00:00 (Sun)
  63077014800, #  local_start 1999-10-31 01:00:00 (Sun)
  63089715600, #    local_end 2000-03-26 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63089715600, #    utc_start 2000-03-26 01:00:00 (Sun)
  63108464400, #      utc_end 2000-10-29 01:00:00 (Sun)
  63089719200, #  local_start 2000-03-26 02:00:00 (Sun)
  63108468000, #    local_end 2000-10-29 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63108464400, #    utc_start 2000-10-29 01:00:00 (Sun)
  63121165200, #      utc_end 2001-03-25 01:00:00 (Sun)
  63108464400, #  local_start 2000-10-29 01:00:00 (Sun)
  63121165200, #    local_end 2001-03-25 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63121165200, #    utc_start 2001-03-25 01:00:00 (Sun)
  63139914000, #      utc_end 2001-10-28 01:00:00 (Sun)
  63121168800, #  local_start 2001-03-25 02:00:00 (Sun)
  63139917600, #    local_end 2001-10-28 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63139914000, #    utc_start 2001-10-28 01:00:00 (Sun)
  63153219600, #      utc_end 2002-03-31 01:00:00 (Sun)
  63139914000, #  local_start 2001-10-28 01:00:00 (Sun)
  63153219600, #    local_end 2002-03-31 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63153219600, #    utc_start 2002-03-31 01:00:00 (Sun)
  63171363600, #      utc_end 2002-10-27 01:00:00 (Sun)
  63153223200, #  local_start 2002-03-31 02:00:00 (Sun)
  63171367200, #    local_end 2002-10-27 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63171363600, #    utc_start 2002-10-27 01:00:00 (Sun)
  63184669200, #      utc_end 2003-03-30 01:00:00 (Sun)
  63171363600, #  local_start 2002-10-27 01:00:00 (Sun)
  63184669200, #    local_end 2003-03-30 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63184669200, #    utc_start 2003-03-30 01:00:00 (Sun)
  63202813200, #      utc_end 2003-10-26 01:00:00 (Sun)
  63184672800, #  local_start 2003-03-30 02:00:00 (Sun)
  63202816800, #    local_end 2003-10-26 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63202813200, #    utc_start 2003-10-26 01:00:00 (Sun)
  63216118800, #      utc_end 2004-03-28 01:00:00 (Sun)
  63202813200, #  local_start 2003-10-26 01:00:00 (Sun)
  63216118800, #    local_end 2004-03-28 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63216118800, #    utc_start 2004-03-28 01:00:00 (Sun)
  63234867600, #      utc_end 2004-10-31 01:00:00 (Sun)
  63216122400, #  local_start 2004-03-28 02:00:00 (Sun)
  63234871200, #    local_end 2004-10-31 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63234867600, #    utc_start 2004-10-31 01:00:00 (Sun)
  63247568400, #      utc_end 2005-03-27 01:00:00 (Sun)
  63234867600, #  local_start 2004-10-31 01:00:00 (Sun)
  63247568400, #    local_end 2005-03-27 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63247568400, #    utc_start 2005-03-27 01:00:00 (Sun)
  63266317200, #      utc_end 2005-10-30 01:00:00 (Sun)
  63247572000, #  local_start 2005-03-27 02:00:00 (Sun)
  63266320800, #    local_end 2005-10-30 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63266317200, #    utc_start 2005-10-30 01:00:00 (Sun)
  63279018000, #      utc_end 2006-03-26 01:00:00 (Sun)
  63266317200, #  local_start 2005-10-30 01:00:00 (Sun)
  63279018000, #    local_end 2006-03-26 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63279018000, #    utc_start 2006-03-26 01:00:00 (Sun)
  63297766800, #      utc_end 2006-10-29 01:00:00 (Sun)
  63279021600, #  local_start 2006-03-26 02:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63297766800, #    utc_start 2006-10-29 01:00:00 (Sun)
  63310467600, #      utc_end 2007-03-25 01:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63310467600, #    local_end 2007-03-25 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63310467600, #    utc_start 2007-03-25 01:00:00 (Sun)
  63329216400, #      utc_end 2007-10-28 01:00:00 (Sun)
  63310471200, #  local_start 2007-03-25 02:00:00 (Sun)
  63329220000, #    local_end 2007-10-28 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63329216400, #    utc_start 2007-10-28 01:00:00 (Sun)
  63342522000, #      utc_end 2008-03-30 01:00:00 (Sun)
  63329216400, #  local_start 2007-10-28 01:00:00 (Sun)
  63342522000, #    local_end 2008-03-30 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63342522000, #    utc_start 2008-03-30 01:00:00 (Sun)
  63360666000, #      utc_end 2008-10-26 01:00:00 (Sun)
  63342525600, #  local_start 2008-03-30 02:00:00 (Sun)
  63360669600, #    local_end 2008-10-26 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63360666000, #    utc_start 2008-10-26 01:00:00 (Sun)
  63373971600, #      utc_end 2009-03-29 01:00:00 (Sun)
  63360666000, #  local_start 2008-10-26 01:00:00 (Sun)
  63373971600, #    local_end 2009-03-29 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63373971600, #    utc_start 2009-03-29 01:00:00 (Sun)
  63392115600, #      utc_end 2009-10-25 01:00:00 (Sun)
  63373975200, #  local_start 2009-03-29 02:00:00 (Sun)
  63392119200, #    local_end 2009-10-25 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63392115600, #    utc_start 2009-10-25 01:00:00 (Sun)
  63405421200, #      utc_end 2010-03-28 01:00:00 (Sun)
  63392115600, #  local_start 2009-10-25 01:00:00 (Sun)
  63405421200, #    local_end 2010-03-28 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63405421200, #    utc_start 2010-03-28 01:00:00 (Sun)
  63424170000, #      utc_end 2010-10-31 01:00:00 (Sun)
  63405424800, #  local_start 2010-03-28 02:00:00 (Sun)
  63424173600, #    local_end 2010-10-31 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63424170000, #    utc_start 2010-10-31 01:00:00 (Sun)
  63436870800, #      utc_end 2011-03-27 01:00:00 (Sun)
  63424170000, #  local_start 2010-10-31 01:00:00 (Sun)
  63436870800, #    local_end 2011-03-27 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63436870800, #    utc_start 2011-03-27 01:00:00 (Sun)
  63455619600, #      utc_end 2011-10-30 01:00:00 (Sun)
  63436874400, #  local_start 2011-03-27 02:00:00 (Sun)
  63455623200, #    local_end 2011-10-30 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63455619600, #    utc_start 2011-10-30 01:00:00 (Sun)
  63468320400, #      utc_end 2012-03-25 01:00:00 (Sun)
  63455619600, #  local_start 2011-10-30 01:00:00 (Sun)
  63468320400, #    local_end 2012-03-25 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63468320400, #    utc_start 2012-03-25 01:00:00 (Sun)
  63487069200, #      utc_end 2012-10-28 01:00:00 (Sun)
  63468324000, #  local_start 2012-03-25 02:00:00 (Sun)
  63487072800, #    local_end 2012-10-28 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63487069200, #    utc_start 2012-10-28 01:00:00 (Sun)
  63500374800, #      utc_end 2013-03-31 01:00:00 (Sun)
  63487069200, #  local_start 2012-10-28 01:00:00 (Sun)
  63500374800, #    local_end 2013-03-31 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63500374800, #    utc_start 2013-03-31 01:00:00 (Sun)
  63518518800, #      utc_end 2013-10-27 01:00:00 (Sun)
  63500378400, #  local_start 2013-03-31 02:00:00 (Sun)
  63518522400, #    local_end 2013-10-27 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63518518800, #    utc_start 2013-10-27 01:00:00 (Sun)
  63531824400, #      utc_end 2014-03-30 01:00:00 (Sun)
  63518518800, #  local_start 2013-10-27 01:00:00 (Sun)
  63531824400, #    local_end 2014-03-30 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63531824400, #    utc_start 2014-03-30 01:00:00 (Sun)
  63549968400, #      utc_end 2014-10-26 01:00:00 (Sun)
  63531828000, #  local_start 2014-03-30 02:00:00 (Sun)
  63549972000, #    local_end 2014-10-26 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63549968400, #    utc_start 2014-10-26 01:00:00 (Sun)
  63563274000, #      utc_end 2015-03-29 01:00:00 (Sun)
  63549968400, #  local_start 2014-10-26 01:00:00 (Sun)
  63563274000, #    local_end 2015-03-29 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63563274000, #    utc_start 2015-03-29 01:00:00 (Sun)
  63581418000, #      utc_end 2015-10-25 01:00:00 (Sun)
  63563277600, #  local_start 2015-03-29 02:00:00 (Sun)
  63581421600, #    local_end 2015-10-25 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63581418000, #    utc_start 2015-10-25 01:00:00 (Sun)
  63594723600, #      utc_end 2016-03-27 01:00:00 (Sun)
  63581418000, #  local_start 2015-10-25 01:00:00 (Sun)
  63594723600, #    local_end 2016-03-27 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63594723600, #    utc_start 2016-03-27 01:00:00 (Sun)
  63613472400, #      utc_end 2016-10-30 01:00:00 (Sun)
  63594727200, #  local_start 2016-03-27 02:00:00 (Sun)
  63613476000, #    local_end 2016-10-30 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63613472400, #    utc_start 2016-10-30 01:00:00 (Sun)
  63626173200, #      utc_end 2017-03-26 01:00:00 (Sun)
  63613472400, #  local_start 2016-10-30 01:00:00 (Sun)
  63626173200, #    local_end 2017-03-26 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63626173200, #    utc_start 2017-03-26 01:00:00 (Sun)
  63644922000, #      utc_end 2017-10-29 01:00:00 (Sun)
  63626176800, #  local_start 2017-03-26 02:00:00 (Sun)
  63644925600, #    local_end 2017-10-29 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63644922000, #    utc_start 2017-10-29 01:00:00 (Sun)
  63657622800, #      utc_end 2018-03-25 01:00:00 (Sun)
  63644922000, #  local_start 2017-10-29 01:00:00 (Sun)
  63657622800, #    local_end 2018-03-25 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63657622800, #    utc_start 2018-03-25 01:00:00 (Sun)
  63676371600, #      utc_end 2018-10-28 01:00:00 (Sun)
  63657626400, #  local_start 2018-03-25 02:00:00 (Sun)
  63676375200, #    local_end 2018-10-28 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63676371600, #    utc_start 2018-10-28 01:00:00 (Sun)
  63689677200, #      utc_end 2019-03-31 01:00:00 (Sun)
  63676371600, #  local_start 2018-10-28 01:00:00 (Sun)
  63689677200, #    local_end 2019-03-31 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63689677200, #    utc_start 2019-03-31 01:00:00 (Sun)
  63707821200, #      utc_end 2019-10-27 01:00:00 (Sun)
  63689680800, #  local_start 2019-03-31 02:00:00 (Sun)
  63707824800, #    local_end 2019-10-27 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63707821200, #    utc_start 2019-10-27 01:00:00 (Sun)
  63721126800, #      utc_end 2020-03-29 01:00:00 (Sun)
  63707821200, #  local_start 2019-10-27 01:00:00 (Sun)
  63721126800, #    local_end 2020-03-29 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63721126800, #    utc_start 2020-03-29 01:00:00 (Sun)
  63739270800, #      utc_end 2020-10-25 01:00:00 (Sun)
  63721130400, #  local_start 2020-03-29 02:00:00 (Sun)
  63739274400, #    local_end 2020-10-25 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63739270800, #    utc_start 2020-10-25 01:00:00 (Sun)
  63752576400, #      utc_end 2021-03-28 01:00:00 (Sun)
  63739270800, #  local_start 2020-10-25 01:00:00 (Sun)
  63752576400, #    local_end 2021-03-28 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63752576400, #    utc_start 2021-03-28 01:00:00 (Sun)
  63771325200, #      utc_end 2021-10-31 01:00:00 (Sun)
  63752580000, #  local_start 2021-03-28 02:00:00 (Sun)
  63771328800, #    local_end 2021-10-31 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63771325200, #    utc_start 2021-10-31 01:00:00 (Sun)
  63784026000, #      utc_end 2022-03-27 01:00:00 (Sun)
  63771325200, #  local_start 2021-10-31 01:00:00 (Sun)
  63784026000, #    local_end 2022-03-27 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63784026000, #    utc_start 2022-03-27 01:00:00 (Sun)
  63802774800, #      utc_end 2022-10-30 01:00:00 (Sun)
  63784029600, #  local_start 2022-03-27 02:00:00 (Sun)
  63802778400, #    local_end 2022-10-30 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63802774800, #    utc_start 2022-10-30 01:00:00 (Sun)
  63815475600, #      utc_end 2023-03-26 01:00:00 (Sun)
  63802774800, #  local_start 2022-10-30 01:00:00 (Sun)
  63815475600, #    local_end 2023-03-26 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63815475600, #    utc_start 2023-03-26 01:00:00 (Sun)
  63834224400, #      utc_end 2023-10-29 01:00:00 (Sun)
  63815479200, #  local_start 2023-03-26 02:00:00 (Sun)
  63834228000, #    local_end 2023-10-29 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63834224400, #    utc_start 2023-10-29 01:00:00 (Sun)
  63847530000, #      utc_end 2024-03-31 01:00:00 (Sun)
  63834224400, #  local_start 2023-10-29 01:00:00 (Sun)
  63847530000, #    local_end 2024-03-31 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63847530000, #    utc_start 2024-03-31 01:00:00 (Sun)
  63865674000, #      utc_end 2024-10-27 01:00:00 (Sun)
  63847533600, #  local_start 2024-03-31 02:00:00 (Sun)
  63865677600, #    local_end 2024-10-27 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63865674000, #    utc_start 2024-10-27 01:00:00 (Sun)
  63878979600, #      utc_end 2025-03-30 01:00:00 (Sun)
  63865674000, #  local_start 2024-10-27 01:00:00 (Sun)
  63878979600, #    local_end 2025-03-30 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63878979600, #    utc_start 2025-03-30 01:00:00 (Sun)
  63897123600, #      utc_end 2025-10-26 01:00:00 (Sun)
  63878983200, #  local_start 2025-03-30 02:00:00 (Sun)
  63897127200, #    local_end 2025-10-26 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63897123600, #    utc_start 2025-10-26 01:00:00 (Sun)
  63910429200, #      utc_end 2026-03-29 01:00:00 (Sun)
  63897123600, #  local_start 2025-10-26 01:00:00 (Sun)
  63910429200, #    local_end 2026-03-29 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63910429200, #    utc_start 2026-03-29 01:00:00 (Sun)
  63928573200, #      utc_end 2026-10-25 01:00:00 (Sun)
  63910432800, #  local_start 2026-03-29 02:00:00 (Sun)
  63928576800, #    local_end 2026-10-25 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63928573200, #    utc_start 2026-10-25 01:00:00 (Sun)
  63941878800, #      utc_end 2027-03-28 01:00:00 (Sun)
  63928573200, #  local_start 2026-10-25 01:00:00 (Sun)
  63941878800, #    local_end 2027-03-28 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63941878800, #    utc_start 2027-03-28 01:00:00 (Sun)
  63960627600, #      utc_end 2027-10-31 01:00:00 (Sun)
  63941882400, #  local_start 2027-03-28 02:00:00 (Sun)
  63960631200, #    local_end 2027-10-31 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63960627600, #    utc_start 2027-10-31 01:00:00 (Sun)
  63973328400, #      utc_end 2028-03-26 01:00:00 (Sun)
  63960627600, #  local_start 2027-10-31 01:00:00 (Sun)
  63973328400, #    local_end 2028-03-26 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63973328400, #    utc_start 2028-03-26 01:00:00 (Sun)
  63992077200, #      utc_end 2028-10-29 01:00:00 (Sun)
  63973332000, #  local_start 2028-03-26 02:00:00 (Sun)
  63992080800, #    local_end 2028-10-29 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63992077200, #    utc_start 2028-10-29 01:00:00 (Sun)
  64004778000, #      utc_end 2029-03-25 01:00:00 (Sun)
  63992077200, #  local_start 2028-10-29 01:00:00 (Sun)
  64004778000, #    local_end 2029-03-25 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  64004778000, #    utc_start 2029-03-25 01:00:00 (Sun)
  64023526800, #      utc_end 2029-10-28 01:00:00 (Sun)
  64004781600, #  local_start 2029-03-25 02:00:00 (Sun)
  64023530400, #    local_end 2029-10-28 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  64023526800, #    utc_start 2029-10-28 01:00:00 (Sun)
  64036832400, #      utc_end 2030-03-31 01:00:00 (Sun)
  64023526800, #  local_start 2029-10-28 01:00:00 (Sun)
  64036832400, #    local_end 2030-03-31 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  64036832400, #    utc_start 2030-03-31 01:00:00 (Sun)
  64054976400, #      utc_end 2030-10-27 01:00:00 (Sun)
  64036836000, #  local_start 2030-03-31 02:00:00 (Sun)
  64054980000, #    local_end 2030-10-27 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {106}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { 0 }
  
  my $last_observance = bless( {
    'format' => 'WE%sT',
    'gmtoff' => '0:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 728749,
      'local_rd_secs' => 7200,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 728749,
      'utc_rd_secs' => 7200,
      'utc_year' => 1997
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => 0,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 728749,
      'local_rd_secs' => 3600,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 728749,
      'utc_rd_secs' => 3600,
      'utc_year' => 1997
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '1:00u',
      'from' => '1981',
      'in' => 'Mar',
      'letter' => 'S',
      'name' => 'EU',
      'offset_from_std' => 3600,
      'on' => 'lastSun',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '1:00u',
      'from' => '1996',
      'in' => 'Oct',
      'letter' => '',
      'name' => 'EU',
      'offset_from_std' => 0,
      'on' => 'lastSun',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_EUROPE_LISBON

    $main::fatpacked{"DateTime/TimeZone/Europe/London.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_EUROPE_LONDON';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Europe::London;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Europe::London::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  58283020875, #      utc_end 1847-12-01 00:01:15 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  58283020800, #    local_end 1847-12-01 00:00:00 (Wed)
  -75,
  0,
  'LMT',
      ],
      [
  58283020875, #    utc_start 1847-12-01 00:01:15 (Wed)
  60443719200, #      utc_end 1916-05-21 02:00:00 (Sun)
  58283020875, #  local_start 1847-12-01 00:01:15 (Wed)
  60443719200, #    local_end 1916-05-21 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  60443719200, #    utc_start 1916-05-21 02:00:00 (Sun)
  60455210400, #      utc_end 1916-10-01 02:00:00 (Sun)
  60443722800, #  local_start 1916-05-21 03:00:00 (Sun)
  60455214000, #    local_end 1916-10-01 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  60455210400, #    utc_start 1916-10-01 02:00:00 (Sun)
  60471540000, #      utc_end 1917-04-08 02:00:00 (Sun)
  60455210400, #  local_start 1916-10-01 02:00:00 (Sun)
  60471540000, #    local_end 1917-04-08 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  60471540000, #    utc_start 1917-04-08 02:00:00 (Sun)
  60485536800, #      utc_end 1917-09-17 02:00:00 (Mon)
  60471543600, #  local_start 1917-04-08 03:00:00 (Sun)
  60485540400, #    local_end 1917-09-17 03:00:00 (Mon)
  3600,
  1,
  'BST',
      ],
      [
  60485536800, #    utc_start 1917-09-17 02:00:00 (Mon)
  60501780000, #      utc_end 1918-03-24 02:00:00 (Sun)
  60485536800, #  local_start 1917-09-17 02:00:00 (Mon)
  60501780000, #    local_end 1918-03-24 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  60501780000, #    utc_start 1918-03-24 02:00:00 (Sun)
  60518196000, #      utc_end 1918-09-30 02:00:00 (Mon)
  60501783600, #  local_start 1918-03-24 03:00:00 (Sun)
  60518199600, #    local_end 1918-09-30 03:00:00 (Mon)
  3600,
  1,
  'BST',
      ],
      [
  60518196000, #    utc_start 1918-09-30 02:00:00 (Mon)
  60533834400, #      utc_end 1919-03-30 02:00:00 (Sun)
  60518196000, #  local_start 1918-09-30 02:00:00 (Mon)
  60533834400, #    local_end 1919-03-30 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  60533834400, #    utc_start 1919-03-30 02:00:00 (Sun)
  60549645600, #      utc_end 1919-09-29 02:00:00 (Mon)
  60533838000, #  local_start 1919-03-30 03:00:00 (Sun)
  60549649200, #    local_end 1919-09-29 03:00:00 (Mon)
  3600,
  1,
  'BST',
      ],
      [
  60549645600, #    utc_start 1919-09-29 02:00:00 (Mon)
  60565284000, #      utc_end 1920-03-28 02:00:00 (Sun)
  60549645600, #  local_start 1919-09-29 02:00:00 (Mon)
  60565284000, #    local_end 1920-03-28 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  60565284000, #    utc_start 1920-03-28 02:00:00 (Sun)
  60583514400, #      utc_end 1920-10-25 02:00:00 (Mon)
  60565287600, #  local_start 1920-03-28 03:00:00 (Sun)
  60583518000, #    local_end 1920-10-25 03:00:00 (Mon)
  3600,
  1,
  'BST',
      ],
      [
  60583514400, #    utc_start 1920-10-25 02:00:00 (Mon)
  60597338400, #      utc_end 1921-04-03 02:00:00 (Sun)
  60583514400, #  local_start 1920-10-25 02:00:00 (Mon)
  60597338400, #    local_end 1921-04-03 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  60597338400, #    utc_start 1921-04-03 02:00:00 (Sun)
  60613149600, #      utc_end 1921-10-03 02:00:00 (Mon)
  60597342000, #  local_start 1921-04-03 03:00:00 (Sun)
  60613153200, #    local_end 1921-10-03 03:00:00 (Mon)
  3600,
  1,
  'BST',
      ],
      [
  60613149600, #    utc_start 1921-10-03 02:00:00 (Mon)
  60628183200, #      utc_end 1922-03-26 02:00:00 (Sun)
  60613149600, #  local_start 1921-10-03 02:00:00 (Mon)
  60628183200, #    local_end 1922-03-26 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  60628183200, #    utc_start 1922-03-26 02:00:00 (Sun)
  60645117600, #      utc_end 1922-10-08 02:00:00 (Sun)
  60628186800, #  local_start 1922-03-26 03:00:00 (Sun)
  60645121200, #    local_end 1922-10-08 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  60645117600, #    utc_start 1922-10-08 02:00:00 (Sun)
  60662052000, #      utc_end 1923-04-22 02:00:00 (Sun)
  60645117600, #  local_start 1922-10-08 02:00:00 (Sun)
  60662052000, #    local_end 1923-04-22 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  60662052000, #    utc_start 1923-04-22 02:00:00 (Sun)
  60674752800, #      utc_end 1923-09-16 02:00:00 (Sun)
  60662055600, #  local_start 1923-04-22 03:00:00 (Sun)
  60674756400, #    local_end 1923-09-16 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  60674752800, #    utc_start 1923-09-16 02:00:00 (Sun)
  60692896800, #      utc_end 1924-04-13 02:00:00 (Sun)
  60674752800, #  local_start 1923-09-16 02:00:00 (Sun)
  60692896800, #    local_end 1924-04-13 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  60692896800, #    utc_start 1924-04-13 02:00:00 (Sun)
  60706807200, #      utc_end 1924-09-21 02:00:00 (Sun)
  60692900400, #  local_start 1924-04-13 03:00:00 (Sun)
  60706810800, #    local_end 1924-09-21 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  60706807200, #    utc_start 1924-09-21 02:00:00 (Sun)
  60724951200, #      utc_end 1925-04-19 02:00:00 (Sun)
  60706807200, #  local_start 1924-09-21 02:00:00 (Sun)
  60724951200, #    local_end 1925-04-19 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  60724951200, #    utc_start 1925-04-19 02:00:00 (Sun)
  60739466400, #      utc_end 1925-10-04 02:00:00 (Sun)
  60724954800, #  local_start 1925-04-19 03:00:00 (Sun)
  60739470000, #    local_end 1925-10-04 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  60739466400, #    utc_start 1925-10-04 02:00:00 (Sun)
  60756400800, #      utc_end 1926-04-18 02:00:00 (Sun)
  60739466400, #  local_start 1925-10-04 02:00:00 (Sun)
  60756400800, #    local_end 1926-04-18 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  60756400800, #    utc_start 1926-04-18 02:00:00 (Sun)
  60770916000, #      utc_end 1926-10-03 02:00:00 (Sun)
  60756404400, #  local_start 1926-04-18 03:00:00 (Sun)
  60770919600, #    local_end 1926-10-03 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  60770916000, #    utc_start 1926-10-03 02:00:00 (Sun)
  60787245600, #      utc_end 1927-04-10 02:00:00 (Sun)
  60770916000, #  local_start 1926-10-03 02:00:00 (Sun)
  60787245600, #    local_end 1927-04-10 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  60787245600, #    utc_start 1927-04-10 02:00:00 (Sun)
  60802365600, #      utc_end 1927-10-02 02:00:00 (Sun)
  60787249200, #  local_start 1927-04-10 03:00:00 (Sun)
  60802369200, #    local_end 1927-10-02 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  60802365600, #    utc_start 1927-10-02 02:00:00 (Sun)
  60819904800, #      utc_end 1928-04-22 02:00:00 (Sun)
  60802365600, #  local_start 1927-10-02 02:00:00 (Sun)
  60819904800, #    local_end 1928-04-22 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  60819904800, #    utc_start 1928-04-22 02:00:00 (Sun)
  60834420000, #      utc_end 1928-10-07 02:00:00 (Sun)
  60819908400, #  local_start 1928-04-22 03:00:00 (Sun)
  60834423600, #    local_end 1928-10-07 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  60834420000, #    utc_start 1928-10-07 02:00:00 (Sun)
  60851354400, #      utc_end 1929-04-21 02:00:00 (Sun)
  60834420000, #  local_start 1928-10-07 02:00:00 (Sun)
  60851354400, #    local_end 1929-04-21 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  60851354400, #    utc_start 1929-04-21 02:00:00 (Sun)
  60865869600, #      utc_end 1929-10-06 02:00:00 (Sun)
  60851358000, #  local_start 1929-04-21 03:00:00 (Sun)
  60865873200, #    local_end 1929-10-06 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  60865869600, #    utc_start 1929-10-06 02:00:00 (Sun)
  60882199200, #      utc_end 1930-04-13 02:00:00 (Sun)
  60865869600, #  local_start 1929-10-06 02:00:00 (Sun)
  60882199200, #    local_end 1930-04-13 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  60882199200, #    utc_start 1930-04-13 02:00:00 (Sun)
  60897319200, #      utc_end 1930-10-05 02:00:00 (Sun)
  60882202800, #  local_start 1930-04-13 03:00:00 (Sun)
  60897322800, #    local_end 1930-10-05 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  60897319200, #    utc_start 1930-10-05 02:00:00 (Sun)
  60914253600, #      utc_end 1931-04-19 02:00:00 (Sun)
  60897319200, #  local_start 1930-10-05 02:00:00 (Sun)
  60914253600, #    local_end 1931-04-19 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  60914253600, #    utc_start 1931-04-19 02:00:00 (Sun)
  60928768800, #      utc_end 1931-10-04 02:00:00 (Sun)
  60914257200, #  local_start 1931-04-19 03:00:00 (Sun)
  60928772400, #    local_end 1931-10-04 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  60928768800, #    utc_start 1931-10-04 02:00:00 (Sun)
  60945703200, #      utc_end 1932-04-17 02:00:00 (Sun)
  60928768800, #  local_start 1931-10-04 02:00:00 (Sun)
  60945703200, #    local_end 1932-04-17 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  60945703200, #    utc_start 1932-04-17 02:00:00 (Sun)
  60960218400, #      utc_end 1932-10-02 02:00:00 (Sun)
  60945706800, #  local_start 1932-04-17 03:00:00 (Sun)
  60960222000, #    local_end 1932-10-02 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  60960218400, #    utc_start 1932-10-02 02:00:00 (Sun)
  60976548000, #      utc_end 1933-04-09 02:00:00 (Sun)
  60960218400, #  local_start 1932-10-02 02:00:00 (Sun)
  60976548000, #    local_end 1933-04-09 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  60976548000, #    utc_start 1933-04-09 02:00:00 (Sun)
  60992272800, #      utc_end 1933-10-08 02:00:00 (Sun)
  60976551600, #  local_start 1933-04-09 03:00:00 (Sun)
  60992276400, #    local_end 1933-10-08 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  60992272800, #    utc_start 1933-10-08 02:00:00 (Sun)
  61009207200, #      utc_end 1934-04-22 02:00:00 (Sun)
  60992272800, #  local_start 1933-10-08 02:00:00 (Sun)
  61009207200, #    local_end 1934-04-22 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61009207200, #    utc_start 1934-04-22 02:00:00 (Sun)
  61023722400, #      utc_end 1934-10-07 02:00:00 (Sun)
  61009210800, #  local_start 1934-04-22 03:00:00 (Sun)
  61023726000, #    local_end 1934-10-07 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  61023722400, #    utc_start 1934-10-07 02:00:00 (Sun)
  61040052000, #      utc_end 1935-04-14 02:00:00 (Sun)
  61023722400, #  local_start 1934-10-07 02:00:00 (Sun)
  61040052000, #    local_end 1935-04-14 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61040052000, #    utc_start 1935-04-14 02:00:00 (Sun)
  61055172000, #      utc_end 1935-10-06 02:00:00 (Sun)
  61040055600, #  local_start 1935-04-14 03:00:00 (Sun)
  61055175600, #    local_end 1935-10-06 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  61055172000, #    utc_start 1935-10-06 02:00:00 (Sun)
  61072106400, #      utc_end 1936-04-19 02:00:00 (Sun)
  61055172000, #  local_start 1935-10-06 02:00:00 (Sun)
  61072106400, #    local_end 1936-04-19 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61072106400, #    utc_start 1936-04-19 02:00:00 (Sun)
  61086621600, #      utc_end 1936-10-04 02:00:00 (Sun)
  61072110000, #  local_start 1936-04-19 03:00:00 (Sun)
  61086625200, #    local_end 1936-10-04 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  61086621600, #    utc_start 1936-10-04 02:00:00 (Sun)
  61103556000, #      utc_end 1937-04-18 02:00:00 (Sun)
  61086621600, #  local_start 1936-10-04 02:00:00 (Sun)
  61103556000, #    local_end 1937-04-18 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61103556000, #    utc_start 1937-04-18 02:00:00 (Sun)
  61118071200, #      utc_end 1937-10-03 02:00:00 (Sun)
  61103559600, #  local_start 1937-04-18 03:00:00 (Sun)
  61118074800, #    local_end 1937-10-03 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  61118071200, #    utc_start 1937-10-03 02:00:00 (Sun)
  61134400800, #      utc_end 1938-04-10 02:00:00 (Sun)
  61118071200, #  local_start 1937-10-03 02:00:00 (Sun)
  61134400800, #    local_end 1938-04-10 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61134400800, #    utc_start 1938-04-10 02:00:00 (Sun)
  61149520800, #      utc_end 1938-10-02 02:00:00 (Sun)
  61134404400, #  local_start 1938-04-10 03:00:00 (Sun)
  61149524400, #    local_end 1938-10-02 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  61149520800, #    utc_start 1938-10-02 02:00:00 (Sun)
  61166455200, #      utc_end 1939-04-16 02:00:00 (Sun)
  61149520800, #  local_start 1938-10-02 02:00:00 (Sun)
  61166455200, #    local_end 1939-04-16 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61166455200, #    utc_start 1939-04-16 02:00:00 (Sun)
  61185204000, #      utc_end 1939-11-19 02:00:00 (Sun)
  61166458800, #  local_start 1939-04-16 03:00:00 (Sun)
  61185207600, #    local_end 1939-11-19 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  61185204000, #    utc_start 1939-11-19 02:00:00 (Sun)
  61193671200, #      utc_end 1940-02-25 02:00:00 (Sun)
  61185204000, #  local_start 1939-11-19 02:00:00 (Sun)
  61193671200, #    local_end 1940-02-25 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61193671200, #    utc_start 1940-02-25 02:00:00 (Sun)
  61231165200, #      utc_end 1941-05-04 01:00:00 (Sun)
  61193674800, #  local_start 1940-02-25 03:00:00 (Sun)
  61231168800, #    local_end 1941-05-04 02:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  61231165200, #    utc_start 1941-05-04 01:00:00 (Sun)
  61239632400, #      utc_end 1941-08-10 01:00:00 (Sun)
  61231172400, #  local_start 1941-05-04 03:00:00 (Sun)
  61239639600, #    local_end 1941-08-10 03:00:00 (Sun)
  7200,
  1,
  'BDST',
      ],
      [
  61239632400, #    utc_start 1941-08-10 01:00:00 (Sun)
  61260195600, #      utc_end 1942-04-05 01:00:00 (Sun)
  61239636000, #  local_start 1941-08-10 02:00:00 (Sun)
  61260199200, #    local_end 1942-04-05 02:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  61260195600, #    utc_start 1942-04-05 01:00:00 (Sun)
  61271082000, #      utc_end 1942-08-09 01:00:00 (Sun)
  61260202800, #  local_start 1942-04-05 03:00:00 (Sun)
  61271089200, #    local_end 1942-08-09 03:00:00 (Sun)
  7200,
  1,
  'BDST',
      ],
      [
  61271082000, #    utc_start 1942-08-09 01:00:00 (Sun)
  61291645200, #      utc_end 1943-04-04 01:00:00 (Sun)
  61271085600, #  local_start 1942-08-09 02:00:00 (Sun)
  61291648800, #    local_end 1943-04-04 02:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  61291645200, #    utc_start 1943-04-04 01:00:00 (Sun)
  61303136400, #      utc_end 1943-08-15 01:00:00 (Sun)
  61291652400, #  local_start 1943-04-04 03:00:00 (Sun)
  61303143600, #    local_end 1943-08-15 03:00:00 (Sun)
  7200,
  1,
  'BDST',
      ],
      [
  61303136400, #    utc_start 1943-08-15 01:00:00 (Sun)
  61323094800, #      utc_end 1944-04-02 01:00:00 (Sun)
  61303140000, #  local_start 1943-08-15 02:00:00 (Sun)
  61323098400, #    local_end 1944-04-02 02:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  61323094800, #    utc_start 1944-04-02 01:00:00 (Sun)
  61337610000, #      utc_end 1944-09-17 01:00:00 (Sun)
  61323102000, #  local_start 1944-04-02 03:00:00 (Sun)
  61337617200, #    local_end 1944-09-17 03:00:00 (Sun)
  7200,
  1,
  'BDST',
      ],
      [
  61337610000, #    utc_start 1944-09-17 01:00:00 (Sun)
  61354630800, #      utc_end 1945-04-02 01:00:00 (Mon)
  61337613600, #  local_start 1944-09-17 02:00:00 (Sun)
  61354634400, #    local_end 1945-04-02 02:00:00 (Mon)
  3600,
  1,
  'BST',
      ],
      [
  61354630800, #    utc_start 1945-04-02 01:00:00 (Mon)
  61363616400, #      utc_end 1945-07-15 01:00:00 (Sun)
  61354638000, #  local_start 1945-04-02 03:00:00 (Mon)
  61363623600, #    local_end 1945-07-15 03:00:00 (Sun)
  7200,
  1,
  'BDST',
      ],
      [
  61363616400, #    utc_start 1945-07-15 01:00:00 (Sun)
  61370877600, #      utc_end 1945-10-07 02:00:00 (Sun)
  61363620000, #  local_start 1945-07-15 02:00:00 (Sun)
  61370881200, #    local_end 1945-10-07 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  61370877600, #    utc_start 1945-10-07 02:00:00 (Sun)
  61387207200, #      utc_end 1946-04-14 02:00:00 (Sun)
  61370877600, #  local_start 1945-10-07 02:00:00 (Sun)
  61387207200, #    local_end 1946-04-14 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61387207200, #    utc_start 1946-04-14 02:00:00 (Sun)
  61402327200, #      utc_end 1946-10-06 02:00:00 (Sun)
  61387210800, #  local_start 1946-04-14 03:00:00 (Sun)
  61402330800, #    local_end 1946-10-06 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  61402327200, #    utc_start 1946-10-06 02:00:00 (Sun)
  61416237600, #      utc_end 1947-03-16 02:00:00 (Sun)
  61402327200, #  local_start 1946-10-06 02:00:00 (Sun)
  61416237600, #    local_end 1947-03-16 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61416237600, #    utc_start 1947-03-16 02:00:00 (Sun)
  61418653200, #      utc_end 1947-04-13 01:00:00 (Sun)
  61416241200, #  local_start 1947-03-16 03:00:00 (Sun)
  61418656800, #    local_end 1947-04-13 02:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  61418653200, #    utc_start 1947-04-13 01:00:00 (Sun)
  61428934800, #      utc_end 1947-08-10 01:00:00 (Sun)
  61418660400, #  local_start 1947-04-13 03:00:00 (Sun)
  61428942000, #    local_end 1947-08-10 03:00:00 (Sun)
  7200,
  1,
  'BDST',
      ],
      [
  61428934800, #    utc_start 1947-08-10 01:00:00 (Sun)
  61436196000, #      utc_end 1947-11-02 02:00:00 (Sun)
  61428938400, #  local_start 1947-08-10 02:00:00 (Sun)
  61436199600, #    local_end 1947-11-02 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  61436196000, #    utc_start 1947-11-02 02:00:00 (Sun)
  61447687200, #      utc_end 1948-03-14 02:00:00 (Sun)
  61436196000, #  local_start 1947-11-02 02:00:00 (Sun)
  61447687200, #    local_end 1948-03-14 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61447687200, #    utc_start 1948-03-14 02:00:00 (Sun)
  61467645600, #      utc_end 1948-10-31 02:00:00 (Sun)
  61447690800, #  local_start 1948-03-14 03:00:00 (Sun)
  61467649200, #    local_end 1948-10-31 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  61467645600, #    utc_start 1948-10-31 02:00:00 (Sun)
  61480951200, #      utc_end 1949-04-03 02:00:00 (Sun)
  61467645600, #  local_start 1948-10-31 02:00:00 (Sun)
  61480951200, #    local_end 1949-04-03 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61480951200, #    utc_start 1949-04-03 02:00:00 (Sun)
  61499095200, #      utc_end 1949-10-30 02:00:00 (Sun)
  61480954800, #  local_start 1949-04-03 03:00:00 (Sun)
  61499098800, #    local_end 1949-10-30 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  61499095200, #    utc_start 1949-10-30 02:00:00 (Sun)
  61513610400, #      utc_end 1950-04-16 02:00:00 (Sun)
  61499095200, #  local_start 1949-10-30 02:00:00 (Sun)
  61513610400, #    local_end 1950-04-16 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61513610400, #    utc_start 1950-04-16 02:00:00 (Sun)
  61529940000, #      utc_end 1950-10-22 02:00:00 (Sun)
  61513614000, #  local_start 1950-04-16 03:00:00 (Sun)
  61529943600, #    local_end 1950-10-22 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  61529940000, #    utc_start 1950-10-22 02:00:00 (Sun)
  61545060000, #      utc_end 1951-04-15 02:00:00 (Sun)
  61529940000, #  local_start 1950-10-22 02:00:00 (Sun)
  61545060000, #    local_end 1951-04-15 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61545060000, #    utc_start 1951-04-15 02:00:00 (Sun)
  61561389600, #      utc_end 1951-10-21 02:00:00 (Sun)
  61545063600, #  local_start 1951-04-15 03:00:00 (Sun)
  61561393200, #    local_end 1951-10-21 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  61561389600, #    utc_start 1951-10-21 02:00:00 (Sun)
  61577114400, #      utc_end 1952-04-20 02:00:00 (Sun)
  61561389600, #  local_start 1951-10-21 02:00:00 (Sun)
  61577114400, #    local_end 1952-04-20 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61577114400, #    utc_start 1952-04-20 02:00:00 (Sun)
  61593444000, #      utc_end 1952-10-26 02:00:00 (Sun)
  61577118000, #  local_start 1952-04-20 03:00:00 (Sun)
  61593447600, #    local_end 1952-10-26 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  61593444000, #    utc_start 1952-10-26 02:00:00 (Sun)
  61608564000, #      utc_end 1953-04-19 02:00:00 (Sun)
  61593444000, #  local_start 1952-10-26 02:00:00 (Sun)
  61608564000, #    local_end 1953-04-19 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61608564000, #    utc_start 1953-04-19 02:00:00 (Sun)
  61623079200, #      utc_end 1953-10-04 02:00:00 (Sun)
  61608567600, #  local_start 1953-04-19 03:00:00 (Sun)
  61623082800, #    local_end 1953-10-04 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  61623079200, #    utc_start 1953-10-04 02:00:00 (Sun)
  61639408800, #      utc_end 1954-04-11 02:00:00 (Sun)
  61623079200, #  local_start 1953-10-04 02:00:00 (Sun)
  61639408800, #    local_end 1954-04-11 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61639408800, #    utc_start 1954-04-11 02:00:00 (Sun)
  61654528800, #      utc_end 1954-10-03 02:00:00 (Sun)
  61639412400, #  local_start 1954-04-11 03:00:00 (Sun)
  61654532400, #    local_end 1954-10-03 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  61654528800, #    utc_start 1954-10-03 02:00:00 (Sun)
  61671463200, #      utc_end 1955-04-17 02:00:00 (Sun)
  61654528800, #  local_start 1954-10-03 02:00:00 (Sun)
  61671463200, #    local_end 1955-04-17 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61671463200, #    utc_start 1955-04-17 02:00:00 (Sun)
  61685978400, #      utc_end 1955-10-02 02:00:00 (Sun)
  61671466800, #  local_start 1955-04-17 03:00:00 (Sun)
  61685982000, #    local_end 1955-10-02 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  61685978400, #    utc_start 1955-10-02 02:00:00 (Sun)
  61703517600, #      utc_end 1956-04-22 02:00:00 (Sun)
  61685978400, #  local_start 1955-10-02 02:00:00 (Sun)
  61703517600, #    local_end 1956-04-22 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61703517600, #    utc_start 1956-04-22 02:00:00 (Sun)
  61718032800, #      utc_end 1956-10-07 02:00:00 (Sun)
  61703521200, #  local_start 1956-04-22 03:00:00 (Sun)
  61718036400, #    local_end 1956-10-07 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  61718032800, #    utc_start 1956-10-07 02:00:00 (Sun)
  61734362400, #      utc_end 1957-04-14 02:00:00 (Sun)
  61718032800, #  local_start 1956-10-07 02:00:00 (Sun)
  61734362400, #    local_end 1957-04-14 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61734362400, #    utc_start 1957-04-14 02:00:00 (Sun)
  61749482400, #      utc_end 1957-10-06 02:00:00 (Sun)
  61734366000, #  local_start 1957-04-14 03:00:00 (Sun)
  61749486000, #    local_end 1957-10-06 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  61749482400, #    utc_start 1957-10-06 02:00:00 (Sun)
  61766416800, #      utc_end 1958-04-20 02:00:00 (Sun)
  61749482400, #  local_start 1957-10-06 02:00:00 (Sun)
  61766416800, #    local_end 1958-04-20 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61766416800, #    utc_start 1958-04-20 02:00:00 (Sun)
  61780932000, #      utc_end 1958-10-05 02:00:00 (Sun)
  61766420400, #  local_start 1958-04-20 03:00:00 (Sun)
  61780935600, #    local_end 1958-10-05 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  61780932000, #    utc_start 1958-10-05 02:00:00 (Sun)
  61797866400, #      utc_end 1959-04-19 02:00:00 (Sun)
  61780932000, #  local_start 1958-10-05 02:00:00 (Sun)
  61797866400, #    local_end 1959-04-19 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61797866400, #    utc_start 1959-04-19 02:00:00 (Sun)
  61812381600, #      utc_end 1959-10-04 02:00:00 (Sun)
  61797870000, #  local_start 1959-04-19 03:00:00 (Sun)
  61812385200, #    local_end 1959-10-04 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  61812381600, #    utc_start 1959-10-04 02:00:00 (Sun)
  61828711200, #      utc_end 1960-04-10 02:00:00 (Sun)
  61812381600, #  local_start 1959-10-04 02:00:00 (Sun)
  61828711200, #    local_end 1960-04-10 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61828711200, #    utc_start 1960-04-10 02:00:00 (Sun)
  61843831200, #      utc_end 1960-10-02 02:00:00 (Sun)
  61828714800, #  local_start 1960-04-10 03:00:00 (Sun)
  61843834800, #    local_end 1960-10-02 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  61843831200, #    utc_start 1960-10-02 02:00:00 (Sun)
  61858951200, #      utc_end 1961-03-26 02:00:00 (Sun)
  61843831200, #  local_start 1960-10-02 02:00:00 (Sun)
  61858951200, #    local_end 1961-03-26 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61858951200, #    utc_start 1961-03-26 02:00:00 (Sun)
  61877700000, #      utc_end 1961-10-29 02:00:00 (Sun)
  61858954800, #  local_start 1961-03-26 03:00:00 (Sun)
  61877703600, #    local_end 1961-10-29 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  61877700000, #    utc_start 1961-10-29 02:00:00 (Sun)
  61890400800, #      utc_end 1962-03-25 02:00:00 (Sun)
  61877700000, #  local_start 1961-10-29 02:00:00 (Sun)
  61890400800, #    local_end 1962-03-25 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61890400800, #    utc_start 1962-03-25 02:00:00 (Sun)
  61909149600, #      utc_end 1962-10-28 02:00:00 (Sun)
  61890404400, #  local_start 1962-03-25 03:00:00 (Sun)
  61909153200, #    local_end 1962-10-28 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  61909149600, #    utc_start 1962-10-28 02:00:00 (Sun)
  61922455200, #      utc_end 1963-03-31 02:00:00 (Sun)
  61909149600, #  local_start 1962-10-28 02:00:00 (Sun)
  61922455200, #    local_end 1963-03-31 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61922455200, #    utc_start 1963-03-31 02:00:00 (Sun)
  61940599200, #      utc_end 1963-10-27 02:00:00 (Sun)
  61922458800, #  local_start 1963-03-31 03:00:00 (Sun)
  61940602800, #    local_end 1963-10-27 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  61940599200, #    utc_start 1963-10-27 02:00:00 (Sun)
  61953300000, #      utc_end 1964-03-22 02:00:00 (Sun)
  61940599200, #  local_start 1963-10-27 02:00:00 (Sun)
  61953300000, #    local_end 1964-03-22 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61953300000, #    utc_start 1964-03-22 02:00:00 (Sun)
  61972048800, #      utc_end 1964-10-25 02:00:00 (Sun)
  61953303600, #  local_start 1964-03-22 03:00:00 (Sun)
  61972052400, #    local_end 1964-10-25 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  61972048800, #    utc_start 1964-10-25 02:00:00 (Sun)
  61984749600, #      utc_end 1965-03-21 02:00:00 (Sun)
  61972048800, #  local_start 1964-10-25 02:00:00 (Sun)
  61984749600, #    local_end 1965-03-21 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  61984749600, #    utc_start 1965-03-21 02:00:00 (Sun)
  62003498400, #      utc_end 1965-10-24 02:00:00 (Sun)
  61984753200, #  local_start 1965-03-21 03:00:00 (Sun)
  62003502000, #    local_end 1965-10-24 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  62003498400, #    utc_start 1965-10-24 02:00:00 (Sun)
  62016199200, #      utc_end 1966-03-20 02:00:00 (Sun)
  62003498400, #  local_start 1965-10-24 02:00:00 (Sun)
  62016199200, #    local_end 1966-03-20 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  62016199200, #    utc_start 1966-03-20 02:00:00 (Sun)
  62034948000, #      utc_end 1966-10-23 02:00:00 (Sun)
  62016202800, #  local_start 1966-03-20 03:00:00 (Sun)
  62034951600, #    local_end 1966-10-23 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  62034948000, #    utc_start 1966-10-23 02:00:00 (Sun)
  62047648800, #      utc_end 1967-03-19 02:00:00 (Sun)
  62034948000, #  local_start 1966-10-23 02:00:00 (Sun)
  62047648800, #    local_end 1967-03-19 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  62047648800, #    utc_start 1967-03-19 02:00:00 (Sun)
  62067002400, #      utc_end 1967-10-29 02:00:00 (Sun)
  62047652400, #  local_start 1967-03-19 03:00:00 (Sun)
  62067006000, #    local_end 1967-10-29 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  62067002400, #    utc_start 1967-10-29 02:00:00 (Sun)
  62076679200, #      utc_end 1968-02-18 02:00:00 (Sun)
  62067002400, #  local_start 1967-10-29 02:00:00 (Sun)
  62076679200, #    local_end 1968-02-18 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  62076679200, #    utc_start 1968-02-18 02:00:00 (Sun)
  62098441200, #      utc_end 1968-10-26 23:00:00 (Sat)
  62076682800, #  local_start 1968-02-18 03:00:00 (Sun)
  62098444800, #    local_end 1968-10-27 00:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  62098441200, #    utc_start 1968-10-26 23:00:00 (Sat)
  62193405600, #      utc_end 1971-10-31 02:00:00 (Sun)
  62098444800, #  local_start 1968-10-27 00:00:00 (Sun)
  62193409200, #    local_end 1971-10-31 03:00:00 (Sun)
  3600,
  0,
  'BST',
      ],
      [
  62193405600, #    utc_start 1971-10-31 02:00:00 (Sun)
  62205501600, #      utc_end 1972-03-19 02:00:00 (Sun)
  62193405600, #  local_start 1971-10-31 02:00:00 (Sun)
  62205501600, #    local_end 1972-03-19 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  62205501600, #    utc_start 1972-03-19 02:00:00 (Sun)
  62224855200, #      utc_end 1972-10-29 02:00:00 (Sun)
  62205505200, #  local_start 1972-03-19 03:00:00 (Sun)
  62224858800, #    local_end 1972-10-29 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  62224855200, #    utc_start 1972-10-29 02:00:00 (Sun)
  62236951200, #      utc_end 1973-03-18 02:00:00 (Sun)
  62224855200, #  local_start 1972-10-29 02:00:00 (Sun)
  62236951200, #    local_end 1973-03-18 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  62236951200, #    utc_start 1973-03-18 02:00:00 (Sun)
  62256304800, #      utc_end 1973-10-28 02:00:00 (Sun)
  62236954800, #  local_start 1973-03-18 03:00:00 (Sun)
  62256308400, #    local_end 1973-10-28 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  62256304800, #    utc_start 1973-10-28 02:00:00 (Sun)
  62268400800, #      utc_end 1974-03-17 02:00:00 (Sun)
  62256304800, #  local_start 1973-10-28 02:00:00 (Sun)
  62268400800, #    local_end 1974-03-17 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  62268400800, #    utc_start 1974-03-17 02:00:00 (Sun)
  62287754400, #      utc_end 1974-10-27 02:00:00 (Sun)
  62268404400, #  local_start 1974-03-17 03:00:00 (Sun)
  62287758000, #    local_end 1974-10-27 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  62287754400, #    utc_start 1974-10-27 02:00:00 (Sun)
  62299850400, #      utc_end 1975-03-16 02:00:00 (Sun)
  62287754400, #  local_start 1974-10-27 02:00:00 (Sun)
  62299850400, #    local_end 1975-03-16 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  62299850400, #    utc_start 1975-03-16 02:00:00 (Sun)
  62319204000, #      utc_end 1975-10-26 02:00:00 (Sun)
  62299854000, #  local_start 1975-03-16 03:00:00 (Sun)
  62319207600, #    local_end 1975-10-26 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  62319204000, #    utc_start 1975-10-26 02:00:00 (Sun)
  62331904800, #      utc_end 1976-03-21 02:00:00 (Sun)
  62319204000, #  local_start 1975-10-26 02:00:00 (Sun)
  62331904800, #    local_end 1976-03-21 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  62331904800, #    utc_start 1976-03-21 02:00:00 (Sun)
  62350653600, #      utc_end 1976-10-24 02:00:00 (Sun)
  62331908400, #  local_start 1976-03-21 03:00:00 (Sun)
  62350657200, #    local_end 1976-10-24 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  62350653600, #    utc_start 1976-10-24 02:00:00 (Sun)
  62363354400, #      utc_end 1977-03-20 02:00:00 (Sun)
  62350653600, #  local_start 1976-10-24 02:00:00 (Sun)
  62363354400, #    local_end 1977-03-20 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  62363354400, #    utc_start 1977-03-20 02:00:00 (Sun)
  62382103200, #      utc_end 1977-10-23 02:00:00 (Sun)
  62363358000, #  local_start 1977-03-20 03:00:00 (Sun)
  62382106800, #    local_end 1977-10-23 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  62382103200, #    utc_start 1977-10-23 02:00:00 (Sun)
  62394804000, #      utc_end 1978-03-19 02:00:00 (Sun)
  62382103200, #  local_start 1977-10-23 02:00:00 (Sun)
  62394804000, #    local_end 1978-03-19 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  62394804000, #    utc_start 1978-03-19 02:00:00 (Sun)
  62414157600, #      utc_end 1978-10-29 02:00:00 (Sun)
  62394807600, #  local_start 1978-03-19 03:00:00 (Sun)
  62414161200, #    local_end 1978-10-29 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  62414157600, #    utc_start 1978-10-29 02:00:00 (Sun)
  62426253600, #      utc_end 1979-03-18 02:00:00 (Sun)
  62414157600, #  local_start 1978-10-29 02:00:00 (Sun)
  62426253600, #    local_end 1979-03-18 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  62426253600, #    utc_start 1979-03-18 02:00:00 (Sun)
  62445607200, #      utc_end 1979-10-28 02:00:00 (Sun)
  62426257200, #  local_start 1979-03-18 03:00:00 (Sun)
  62445610800, #    local_end 1979-10-28 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  62445607200, #    utc_start 1979-10-28 02:00:00 (Sun)
  62457703200, #      utc_end 1980-03-16 02:00:00 (Sun)
  62445607200, #  local_start 1979-10-28 02:00:00 (Sun)
  62457703200, #    local_end 1980-03-16 02:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  62457703200, #    utc_start 1980-03-16 02:00:00 (Sun)
  62477056800, #      utc_end 1980-10-26 02:00:00 (Sun)
  62457706800, #  local_start 1980-03-16 03:00:00 (Sun)
  62477060400, #    local_end 1980-10-26 03:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  62477056800, #    utc_start 1980-10-26 02:00:00 (Sun)
  62490358800, #      utc_end 1981-03-29 01:00:00 (Sun)
  62477056800, #  local_start 1980-10-26 02:00:00 (Sun)
  62490358800, #    local_end 1981-03-29 01:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  62490358800, #    utc_start 1981-03-29 01:00:00 (Sun)
  62508502800, #      utc_end 1981-10-25 01:00:00 (Sun)
  62490362400, #  local_start 1981-03-29 02:00:00 (Sun)
  62508506400, #    local_end 1981-10-25 02:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  62508502800, #    utc_start 1981-10-25 01:00:00 (Sun)
  62521808400, #      utc_end 1982-03-28 01:00:00 (Sun)
  62508502800, #  local_start 1981-10-25 01:00:00 (Sun)
  62521808400, #    local_end 1982-03-28 01:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  62521808400, #    utc_start 1982-03-28 01:00:00 (Sun)
  62539952400, #      utc_end 1982-10-24 01:00:00 (Sun)
  62521812000, #  local_start 1982-03-28 02:00:00 (Sun)
  62539956000, #    local_end 1982-10-24 02:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  62539952400, #    utc_start 1982-10-24 01:00:00 (Sun)
  62553258000, #      utc_end 1983-03-27 01:00:00 (Sun)
  62539952400, #  local_start 1982-10-24 01:00:00 (Sun)
  62553258000, #    local_end 1983-03-27 01:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  62553258000, #    utc_start 1983-03-27 01:00:00 (Sun)
  62571402000, #      utc_end 1983-10-23 01:00:00 (Sun)
  62553261600, #  local_start 1983-03-27 02:00:00 (Sun)
  62571405600, #    local_end 1983-10-23 02:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  62571402000, #    utc_start 1983-10-23 01:00:00 (Sun)
  62584707600, #      utc_end 1984-03-25 01:00:00 (Sun)
  62571402000, #  local_start 1983-10-23 01:00:00 (Sun)
  62584707600, #    local_end 1984-03-25 01:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  62584707600, #    utc_start 1984-03-25 01:00:00 (Sun)
  62603456400, #      utc_end 1984-10-28 01:00:00 (Sun)
  62584711200, #  local_start 1984-03-25 02:00:00 (Sun)
  62603460000, #    local_end 1984-10-28 02:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  62603456400, #    utc_start 1984-10-28 01:00:00 (Sun)
  62616762000, #      utc_end 1985-03-31 01:00:00 (Sun)
  62603456400, #  local_start 1984-10-28 01:00:00 (Sun)
  62616762000, #    local_end 1985-03-31 01:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  62616762000, #    utc_start 1985-03-31 01:00:00 (Sun)
  62634906000, #      utc_end 1985-10-27 01:00:00 (Sun)
  62616765600, #  local_start 1985-03-31 02:00:00 (Sun)
  62634909600, #    local_end 1985-10-27 02:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  62634906000, #    utc_start 1985-10-27 01:00:00 (Sun)
  62648211600, #      utc_end 1986-03-30 01:00:00 (Sun)
  62634906000, #  local_start 1985-10-27 01:00:00 (Sun)
  62648211600, #    local_end 1986-03-30 01:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  62648211600, #    utc_start 1986-03-30 01:00:00 (Sun)
  62666355600, #      utc_end 1986-10-26 01:00:00 (Sun)
  62648215200, #  local_start 1986-03-30 02:00:00 (Sun)
  62666359200, #    local_end 1986-10-26 02:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  62666355600, #    utc_start 1986-10-26 01:00:00 (Sun)
  62679661200, #      utc_end 1987-03-29 01:00:00 (Sun)
  62666355600, #  local_start 1986-10-26 01:00:00 (Sun)
  62679661200, #    local_end 1987-03-29 01:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  62679661200, #    utc_start 1987-03-29 01:00:00 (Sun)
  62697805200, #      utc_end 1987-10-25 01:00:00 (Sun)
  62679664800, #  local_start 1987-03-29 02:00:00 (Sun)
  62697808800, #    local_end 1987-10-25 02:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  62697805200, #    utc_start 1987-10-25 01:00:00 (Sun)
  62711110800, #      utc_end 1988-03-27 01:00:00 (Sun)
  62697805200, #  local_start 1987-10-25 01:00:00 (Sun)
  62711110800, #    local_end 1988-03-27 01:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  62711110800, #    utc_start 1988-03-27 01:00:00 (Sun)
  62729254800, #      utc_end 1988-10-23 01:00:00 (Sun)
  62711114400, #  local_start 1988-03-27 02:00:00 (Sun)
  62729258400, #    local_end 1988-10-23 02:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  62729254800, #    utc_start 1988-10-23 01:00:00 (Sun)
  62742560400, #      utc_end 1989-03-26 01:00:00 (Sun)
  62729254800, #  local_start 1988-10-23 01:00:00 (Sun)
  62742560400, #    local_end 1989-03-26 01:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  62742560400, #    utc_start 1989-03-26 01:00:00 (Sun)
  62761309200, #      utc_end 1989-10-29 01:00:00 (Sun)
  62742564000, #  local_start 1989-03-26 02:00:00 (Sun)
  62761312800, #    local_end 1989-10-29 02:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  62761309200, #    utc_start 1989-10-29 01:00:00 (Sun)
  62774010000, #      utc_end 1990-03-25 01:00:00 (Sun)
  62761309200, #  local_start 1989-10-29 01:00:00 (Sun)
  62774010000, #    local_end 1990-03-25 01:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  62774010000, #    utc_start 1990-03-25 01:00:00 (Sun)
  62792758800, #      utc_end 1990-10-28 01:00:00 (Sun)
  62774013600, #  local_start 1990-03-25 02:00:00 (Sun)
  62792762400, #    local_end 1990-10-28 02:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  62792758800, #    utc_start 1990-10-28 01:00:00 (Sun)
  62806064400, #      utc_end 1991-03-31 01:00:00 (Sun)
  62792758800, #  local_start 1990-10-28 01:00:00 (Sun)
  62806064400, #    local_end 1991-03-31 01:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  62806064400, #    utc_start 1991-03-31 01:00:00 (Sun)
  62824208400, #      utc_end 1991-10-27 01:00:00 (Sun)
  62806068000, #  local_start 1991-03-31 02:00:00 (Sun)
  62824212000, #    local_end 1991-10-27 02:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  62824208400, #    utc_start 1991-10-27 01:00:00 (Sun)
  62837514000, #      utc_end 1992-03-29 01:00:00 (Sun)
  62824208400, #  local_start 1991-10-27 01:00:00 (Sun)
  62837514000, #    local_end 1992-03-29 01:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  62837514000, #    utc_start 1992-03-29 01:00:00 (Sun)
  62855658000, #      utc_end 1992-10-25 01:00:00 (Sun)
  62837517600, #  local_start 1992-03-29 02:00:00 (Sun)
  62855661600, #    local_end 1992-10-25 02:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  62855658000, #    utc_start 1992-10-25 01:00:00 (Sun)
  62868963600, #      utc_end 1993-03-28 01:00:00 (Sun)
  62855658000, #  local_start 1992-10-25 01:00:00 (Sun)
  62868963600, #    local_end 1993-03-28 01:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  62868963600, #    utc_start 1993-03-28 01:00:00 (Sun)
  62887107600, #      utc_end 1993-10-24 01:00:00 (Sun)
  62868967200, #  local_start 1993-03-28 02:00:00 (Sun)
  62887111200, #    local_end 1993-10-24 02:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  62887107600, #    utc_start 1993-10-24 01:00:00 (Sun)
  62900413200, #      utc_end 1994-03-27 01:00:00 (Sun)
  62887107600, #  local_start 1993-10-24 01:00:00 (Sun)
  62900413200, #    local_end 1994-03-27 01:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  62900413200, #    utc_start 1994-03-27 01:00:00 (Sun)
  62918557200, #      utc_end 1994-10-23 01:00:00 (Sun)
  62900416800, #  local_start 1994-03-27 02:00:00 (Sun)
  62918560800, #    local_end 1994-10-23 02:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  62918557200, #    utc_start 1994-10-23 01:00:00 (Sun)
  62931862800, #      utc_end 1995-03-26 01:00:00 (Sun)
  62918557200, #  local_start 1994-10-23 01:00:00 (Sun)
  62931862800, #    local_end 1995-03-26 01:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  62931862800, #    utc_start 1995-03-26 01:00:00 (Sun)
  62950006800, #      utc_end 1995-10-22 01:00:00 (Sun)
  62931866400, #  local_start 1995-03-26 02:00:00 (Sun)
  62950010400, #    local_end 1995-10-22 02:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  62950006800, #    utc_start 1995-10-22 01:00:00 (Sun)
  62956137600, #      utc_end 1996-01-01 00:00:00 (Mon)
  62950006800, #  local_start 1995-10-22 01:00:00 (Sun)
  62956137600, #    local_end 1996-01-01 00:00:00 (Mon)
  0,
  0,
  'GMT',
      ],
      [
  62956137600, #    utc_start 1996-01-01 00:00:00 (Mon)
  62963917200, #      utc_end 1996-03-31 01:00:00 (Sun)
  62956137600, #  local_start 1996-01-01 00:00:00 (Mon)
  62963917200, #    local_end 1996-03-31 01:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  62963917200, #    utc_start 1996-03-31 01:00:00 (Sun)
  62982061200, #      utc_end 1996-10-27 01:00:00 (Sun)
  62963920800, #  local_start 1996-03-31 02:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  62982061200, #    utc_start 1996-10-27 01:00:00 (Sun)
  62995366800, #      utc_end 1997-03-30 01:00:00 (Sun)
  62982061200, #  local_start 1996-10-27 01:00:00 (Sun)
  62995366800, #    local_end 1997-03-30 01:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  62995366800, #    utc_start 1997-03-30 01:00:00 (Sun)
  63013510800, #      utc_end 1997-10-26 01:00:00 (Sun)
  62995370400, #  local_start 1997-03-30 02:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  63013510800, #    utc_start 1997-10-26 01:00:00 (Sun)
  63026816400, #      utc_end 1998-03-29 01:00:00 (Sun)
  63013510800, #  local_start 1997-10-26 01:00:00 (Sun)
  63026816400, #    local_end 1998-03-29 01:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  63026816400, #    utc_start 1998-03-29 01:00:00 (Sun)
  63044960400, #      utc_end 1998-10-25 01:00:00 (Sun)
  63026820000, #  local_start 1998-03-29 02:00:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  63044960400, #    utc_start 1998-10-25 01:00:00 (Sun)
  63058266000, #      utc_end 1999-03-28 01:00:00 (Sun)
  63044960400, #  local_start 1998-10-25 01:00:00 (Sun)
  63058266000, #    local_end 1999-03-28 01:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  63058266000, #    utc_start 1999-03-28 01:00:00 (Sun)
  63077014800, #      utc_end 1999-10-31 01:00:00 (Sun)
  63058269600, #  local_start 1999-03-28 02:00:00 (Sun)
  63077018400, #    local_end 1999-10-31 02:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  63077014800, #    utc_start 1999-10-31 01:00:00 (Sun)
  63089715600, #      utc_end 2000-03-26 01:00:00 (Sun)
  63077014800, #  local_start 1999-10-31 01:00:00 (Sun)
  63089715600, #    local_end 2000-03-26 01:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  63089715600, #    utc_start 2000-03-26 01:00:00 (Sun)
  63108464400, #      utc_end 2000-10-29 01:00:00 (Sun)
  63089719200, #  local_start 2000-03-26 02:00:00 (Sun)
  63108468000, #    local_end 2000-10-29 02:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  63108464400, #    utc_start 2000-10-29 01:00:00 (Sun)
  63121165200, #      utc_end 2001-03-25 01:00:00 (Sun)
  63108464400, #  local_start 2000-10-29 01:00:00 (Sun)
  63121165200, #    local_end 2001-03-25 01:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  63121165200, #    utc_start 2001-03-25 01:00:00 (Sun)
  63139914000, #      utc_end 2001-10-28 01:00:00 (Sun)
  63121168800, #  local_start 2001-03-25 02:00:00 (Sun)
  63139917600, #    local_end 2001-10-28 02:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  63139914000, #    utc_start 2001-10-28 01:00:00 (Sun)
  63153219600, #      utc_end 2002-03-31 01:00:00 (Sun)
  63139914000, #  local_start 2001-10-28 01:00:00 (Sun)
  63153219600, #    local_end 2002-03-31 01:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  63153219600, #    utc_start 2002-03-31 01:00:00 (Sun)
  63171363600, #      utc_end 2002-10-27 01:00:00 (Sun)
  63153223200, #  local_start 2002-03-31 02:00:00 (Sun)
  63171367200, #    local_end 2002-10-27 02:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  63171363600, #    utc_start 2002-10-27 01:00:00 (Sun)
  63184669200, #      utc_end 2003-03-30 01:00:00 (Sun)
  63171363600, #  local_start 2002-10-27 01:00:00 (Sun)
  63184669200, #    local_end 2003-03-30 01:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  63184669200, #    utc_start 2003-03-30 01:00:00 (Sun)
  63202813200, #      utc_end 2003-10-26 01:00:00 (Sun)
  63184672800, #  local_start 2003-03-30 02:00:00 (Sun)
  63202816800, #    local_end 2003-10-26 02:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  63202813200, #    utc_start 2003-10-26 01:00:00 (Sun)
  63216118800, #      utc_end 2004-03-28 01:00:00 (Sun)
  63202813200, #  local_start 2003-10-26 01:00:00 (Sun)
  63216118800, #    local_end 2004-03-28 01:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  63216118800, #    utc_start 2004-03-28 01:00:00 (Sun)
  63234867600, #      utc_end 2004-10-31 01:00:00 (Sun)
  63216122400, #  local_start 2004-03-28 02:00:00 (Sun)
  63234871200, #    local_end 2004-10-31 02:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  63234867600, #    utc_start 2004-10-31 01:00:00 (Sun)
  63247568400, #      utc_end 2005-03-27 01:00:00 (Sun)
  63234867600, #  local_start 2004-10-31 01:00:00 (Sun)
  63247568400, #    local_end 2005-03-27 01:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  63247568400, #    utc_start 2005-03-27 01:00:00 (Sun)
  63266317200, #      utc_end 2005-10-30 01:00:00 (Sun)
  63247572000, #  local_start 2005-03-27 02:00:00 (Sun)
  63266320800, #    local_end 2005-10-30 02:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  63266317200, #    utc_start 2005-10-30 01:00:00 (Sun)
  63279018000, #      utc_end 2006-03-26 01:00:00 (Sun)
  63266317200, #  local_start 2005-10-30 01:00:00 (Sun)
  63279018000, #    local_end 2006-03-26 01:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  63279018000, #    utc_start 2006-03-26 01:00:00 (Sun)
  63297766800, #      utc_end 2006-10-29 01:00:00 (Sun)
  63279021600, #  local_start 2006-03-26 02:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  63297766800, #    utc_start 2006-10-29 01:00:00 (Sun)
  63310467600, #      utc_end 2007-03-25 01:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63310467600, #    local_end 2007-03-25 01:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  63310467600, #    utc_start 2007-03-25 01:00:00 (Sun)
  63329216400, #      utc_end 2007-10-28 01:00:00 (Sun)
  63310471200, #  local_start 2007-03-25 02:00:00 (Sun)
  63329220000, #    local_end 2007-10-28 02:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  63329216400, #    utc_start 2007-10-28 01:00:00 (Sun)
  63342522000, #      utc_end 2008-03-30 01:00:00 (Sun)
  63329216400, #  local_start 2007-10-28 01:00:00 (Sun)
  63342522000, #    local_end 2008-03-30 01:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  63342522000, #    utc_start 2008-03-30 01:00:00 (Sun)
  63360666000, #      utc_end 2008-10-26 01:00:00 (Sun)
  63342525600, #  local_start 2008-03-30 02:00:00 (Sun)
  63360669600, #    local_end 2008-10-26 02:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  63360666000, #    utc_start 2008-10-26 01:00:00 (Sun)
  63373971600, #      utc_end 2009-03-29 01:00:00 (Sun)
  63360666000, #  local_start 2008-10-26 01:00:00 (Sun)
  63373971600, #    local_end 2009-03-29 01:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  63373971600, #    utc_start 2009-03-29 01:00:00 (Sun)
  63392115600, #      utc_end 2009-10-25 01:00:00 (Sun)
  63373975200, #  local_start 2009-03-29 02:00:00 (Sun)
  63392119200, #    local_end 2009-10-25 02:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  63392115600, #    utc_start 2009-10-25 01:00:00 (Sun)
  63405421200, #      utc_end 2010-03-28 01:00:00 (Sun)
  63392115600, #  local_start 2009-10-25 01:00:00 (Sun)
  63405421200, #    local_end 2010-03-28 01:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  63405421200, #    utc_start 2010-03-28 01:00:00 (Sun)
  63424170000, #      utc_end 2010-10-31 01:00:00 (Sun)
  63405424800, #  local_start 2010-03-28 02:00:00 (Sun)
  63424173600, #    local_end 2010-10-31 02:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  63424170000, #    utc_start 2010-10-31 01:00:00 (Sun)
  63436870800, #      utc_end 2011-03-27 01:00:00 (Sun)
  63424170000, #  local_start 2010-10-31 01:00:00 (Sun)
  63436870800, #    local_end 2011-03-27 01:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  63436870800, #    utc_start 2011-03-27 01:00:00 (Sun)
  63455619600, #      utc_end 2011-10-30 01:00:00 (Sun)
  63436874400, #  local_start 2011-03-27 02:00:00 (Sun)
  63455623200, #    local_end 2011-10-30 02:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  63455619600, #    utc_start 2011-10-30 01:00:00 (Sun)
  63468320400, #      utc_end 2012-03-25 01:00:00 (Sun)
  63455619600, #  local_start 2011-10-30 01:00:00 (Sun)
  63468320400, #    local_end 2012-03-25 01:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  63468320400, #    utc_start 2012-03-25 01:00:00 (Sun)
  63487069200, #      utc_end 2012-10-28 01:00:00 (Sun)
  63468324000, #  local_start 2012-03-25 02:00:00 (Sun)
  63487072800, #    local_end 2012-10-28 02:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  63487069200, #    utc_start 2012-10-28 01:00:00 (Sun)
  63500374800, #      utc_end 2013-03-31 01:00:00 (Sun)
  63487069200, #  local_start 2012-10-28 01:00:00 (Sun)
  63500374800, #    local_end 2013-03-31 01:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  63500374800, #    utc_start 2013-03-31 01:00:00 (Sun)
  63518518800, #      utc_end 2013-10-27 01:00:00 (Sun)
  63500378400, #  local_start 2013-03-31 02:00:00 (Sun)
  63518522400, #    local_end 2013-10-27 02:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  63518518800, #    utc_start 2013-10-27 01:00:00 (Sun)
  63531824400, #      utc_end 2014-03-30 01:00:00 (Sun)
  63518518800, #  local_start 2013-10-27 01:00:00 (Sun)
  63531824400, #    local_end 2014-03-30 01:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  63531824400, #    utc_start 2014-03-30 01:00:00 (Sun)
  63549968400, #      utc_end 2014-10-26 01:00:00 (Sun)
  63531828000, #  local_start 2014-03-30 02:00:00 (Sun)
  63549972000, #    local_end 2014-10-26 02:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  63549968400, #    utc_start 2014-10-26 01:00:00 (Sun)
  63563274000, #      utc_end 2015-03-29 01:00:00 (Sun)
  63549968400, #  local_start 2014-10-26 01:00:00 (Sun)
  63563274000, #    local_end 2015-03-29 01:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  63563274000, #    utc_start 2015-03-29 01:00:00 (Sun)
  63581418000, #      utc_end 2015-10-25 01:00:00 (Sun)
  63563277600, #  local_start 2015-03-29 02:00:00 (Sun)
  63581421600, #    local_end 2015-10-25 02:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  63581418000, #    utc_start 2015-10-25 01:00:00 (Sun)
  63594723600, #      utc_end 2016-03-27 01:00:00 (Sun)
  63581418000, #  local_start 2015-10-25 01:00:00 (Sun)
  63594723600, #    local_end 2016-03-27 01:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  63594723600, #    utc_start 2016-03-27 01:00:00 (Sun)
  63613472400, #      utc_end 2016-10-30 01:00:00 (Sun)
  63594727200, #  local_start 2016-03-27 02:00:00 (Sun)
  63613476000, #    local_end 2016-10-30 02:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  63613472400, #    utc_start 2016-10-30 01:00:00 (Sun)
  63626173200, #      utc_end 2017-03-26 01:00:00 (Sun)
  63613472400, #  local_start 2016-10-30 01:00:00 (Sun)
  63626173200, #    local_end 2017-03-26 01:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  63626173200, #    utc_start 2017-03-26 01:00:00 (Sun)
  63644922000, #      utc_end 2017-10-29 01:00:00 (Sun)
  63626176800, #  local_start 2017-03-26 02:00:00 (Sun)
  63644925600, #    local_end 2017-10-29 02:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  63644922000, #    utc_start 2017-10-29 01:00:00 (Sun)
  63657622800, #      utc_end 2018-03-25 01:00:00 (Sun)
  63644922000, #  local_start 2017-10-29 01:00:00 (Sun)
  63657622800, #    local_end 2018-03-25 01:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  63657622800, #    utc_start 2018-03-25 01:00:00 (Sun)
  63676371600, #      utc_end 2018-10-28 01:00:00 (Sun)
  63657626400, #  local_start 2018-03-25 02:00:00 (Sun)
  63676375200, #    local_end 2018-10-28 02:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  63676371600, #    utc_start 2018-10-28 01:00:00 (Sun)
  63689677200, #      utc_end 2019-03-31 01:00:00 (Sun)
  63676371600, #  local_start 2018-10-28 01:00:00 (Sun)
  63689677200, #    local_end 2019-03-31 01:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  63689677200, #    utc_start 2019-03-31 01:00:00 (Sun)
  63707821200, #      utc_end 2019-10-27 01:00:00 (Sun)
  63689680800, #  local_start 2019-03-31 02:00:00 (Sun)
  63707824800, #    local_end 2019-10-27 02:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  63707821200, #    utc_start 2019-10-27 01:00:00 (Sun)
  63721126800, #      utc_end 2020-03-29 01:00:00 (Sun)
  63707821200, #  local_start 2019-10-27 01:00:00 (Sun)
  63721126800, #    local_end 2020-03-29 01:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  63721126800, #    utc_start 2020-03-29 01:00:00 (Sun)
  63739270800, #      utc_end 2020-10-25 01:00:00 (Sun)
  63721130400, #  local_start 2020-03-29 02:00:00 (Sun)
  63739274400, #    local_end 2020-10-25 02:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  63739270800, #    utc_start 2020-10-25 01:00:00 (Sun)
  63752576400, #      utc_end 2021-03-28 01:00:00 (Sun)
  63739270800, #  local_start 2020-10-25 01:00:00 (Sun)
  63752576400, #    local_end 2021-03-28 01:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  63752576400, #    utc_start 2021-03-28 01:00:00 (Sun)
  63771325200, #      utc_end 2021-10-31 01:00:00 (Sun)
  63752580000, #  local_start 2021-03-28 02:00:00 (Sun)
  63771328800, #    local_end 2021-10-31 02:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  63771325200, #    utc_start 2021-10-31 01:00:00 (Sun)
  63784026000, #      utc_end 2022-03-27 01:00:00 (Sun)
  63771325200, #  local_start 2021-10-31 01:00:00 (Sun)
  63784026000, #    local_end 2022-03-27 01:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  63784026000, #    utc_start 2022-03-27 01:00:00 (Sun)
  63802774800, #      utc_end 2022-10-30 01:00:00 (Sun)
  63784029600, #  local_start 2022-03-27 02:00:00 (Sun)
  63802778400, #    local_end 2022-10-30 02:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  63802774800, #    utc_start 2022-10-30 01:00:00 (Sun)
  63815475600, #      utc_end 2023-03-26 01:00:00 (Sun)
  63802774800, #  local_start 2022-10-30 01:00:00 (Sun)
  63815475600, #    local_end 2023-03-26 01:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  63815475600, #    utc_start 2023-03-26 01:00:00 (Sun)
  63834224400, #      utc_end 2023-10-29 01:00:00 (Sun)
  63815479200, #  local_start 2023-03-26 02:00:00 (Sun)
  63834228000, #    local_end 2023-10-29 02:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  63834224400, #    utc_start 2023-10-29 01:00:00 (Sun)
  63847530000, #      utc_end 2024-03-31 01:00:00 (Sun)
  63834224400, #  local_start 2023-10-29 01:00:00 (Sun)
  63847530000, #    local_end 2024-03-31 01:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  63847530000, #    utc_start 2024-03-31 01:00:00 (Sun)
  63865674000, #      utc_end 2024-10-27 01:00:00 (Sun)
  63847533600, #  local_start 2024-03-31 02:00:00 (Sun)
  63865677600, #    local_end 2024-10-27 02:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  63865674000, #    utc_start 2024-10-27 01:00:00 (Sun)
  63878979600, #      utc_end 2025-03-30 01:00:00 (Sun)
  63865674000, #  local_start 2024-10-27 01:00:00 (Sun)
  63878979600, #    local_end 2025-03-30 01:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  63878979600, #    utc_start 2025-03-30 01:00:00 (Sun)
  63897123600, #      utc_end 2025-10-26 01:00:00 (Sun)
  63878983200, #  local_start 2025-03-30 02:00:00 (Sun)
  63897127200, #    local_end 2025-10-26 02:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  63897123600, #    utc_start 2025-10-26 01:00:00 (Sun)
  63910429200, #      utc_end 2026-03-29 01:00:00 (Sun)
  63897123600, #  local_start 2025-10-26 01:00:00 (Sun)
  63910429200, #    local_end 2026-03-29 01:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  63910429200, #    utc_start 2026-03-29 01:00:00 (Sun)
  63928573200, #      utc_end 2026-10-25 01:00:00 (Sun)
  63910432800, #  local_start 2026-03-29 02:00:00 (Sun)
  63928576800, #    local_end 2026-10-25 02:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  63928573200, #    utc_start 2026-10-25 01:00:00 (Sun)
  63941878800, #      utc_end 2027-03-28 01:00:00 (Sun)
  63928573200, #  local_start 2026-10-25 01:00:00 (Sun)
  63941878800, #    local_end 2027-03-28 01:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  63941878800, #    utc_start 2027-03-28 01:00:00 (Sun)
  63960627600, #      utc_end 2027-10-31 01:00:00 (Sun)
  63941882400, #  local_start 2027-03-28 02:00:00 (Sun)
  63960631200, #    local_end 2027-10-31 02:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  63960627600, #    utc_start 2027-10-31 01:00:00 (Sun)
  63973328400, #      utc_end 2028-03-26 01:00:00 (Sun)
  63960627600, #  local_start 2027-10-31 01:00:00 (Sun)
  63973328400, #    local_end 2028-03-26 01:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  63973328400, #    utc_start 2028-03-26 01:00:00 (Sun)
  63992077200, #      utc_end 2028-10-29 01:00:00 (Sun)
  63973332000, #  local_start 2028-03-26 02:00:00 (Sun)
  63992080800, #    local_end 2028-10-29 02:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  63992077200, #    utc_start 2028-10-29 01:00:00 (Sun)
  64004778000, #      utc_end 2029-03-25 01:00:00 (Sun)
  63992077200, #  local_start 2028-10-29 01:00:00 (Sun)
  64004778000, #    local_end 2029-03-25 01:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  64004778000, #    utc_start 2029-03-25 01:00:00 (Sun)
  64023526800, #      utc_end 2029-10-28 01:00:00 (Sun)
  64004781600, #  local_start 2029-03-25 02:00:00 (Sun)
  64023530400, #    local_end 2029-10-28 02:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
      [
  64023526800, #    utc_start 2029-10-28 01:00:00 (Sun)
  64036832400, #      utc_end 2030-03-31 01:00:00 (Sun)
  64023526800, #  local_start 2029-10-28 01:00:00 (Sun)
  64036832400, #    local_end 2030-03-31 01:00:00 (Sun)
  0,
  0,
  'GMT',
      ],
      [
  64036832400, #    utc_start 2030-03-31 01:00:00 (Sun)
  64054976400, #      utc_end 2030-10-27 01:00:00 (Sun)
  64036836000, #  local_start 2030-03-31 02:00:00 (Sun)
  64054980000, #    local_end 2030-10-27 02:00:00 (Sun)
  3600,
  1,
  'BST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {119}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { 0 }
  
  my $last_observance = bless( {
    'format' => 'GMT/BST',
    'gmtoff' => '0:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 728659,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 728659,
      'utc_rd_secs' => 0,
      'utc_year' => 1997
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => 0,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 728659,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 728659,
      'utc_rd_secs' => 0,
      'utc_year' => 1997
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '1:00u',
      'from' => '1981',
      'in' => 'Mar',
      'letter' => 'S',
      'name' => 'EU',
      'offset_from_std' => 3600,
      'on' => 'lastSun',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '1:00u',
      'from' => '1996',
      'in' => 'Oct',
      'letter' => '',
      'name' => 'EU',
      'offset_from_std' => 0,
      'on' => 'lastSun',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_EUROPE_LONDON

    $main::fatpacked{"DateTime/TimeZone/Europe/Luxembourg.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_EUROPE_LUXEMBOURG';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Europe::Luxembourg;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Europe::Luxembourg::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60065969724, #      utc_end 1904-05-31 23:35:24 (Tue)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60065971200, #    local_end 1904-06-01 00:00:00 (Wed)
  1476,
  0,
  'LMT',
      ],
      [
  60065969724, #    utc_start 1904-05-31 23:35:24 (Tue)
  60443186400, #      utc_end 1916-05-14 22:00:00 (Sun)
  60065973324, #  local_start 1904-06-01 00:35:24 (Wed)
  60443190000, #    local_end 1916-05-14 23:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  60443186400, #    utc_start 1916-05-14 22:00:00 (Sun)
  60455199600, #      utc_end 1916-09-30 23:00:00 (Sat)
  60443193600, #  local_start 1916-05-15 00:00:00 (Mon)
  60455206800, #    local_end 1916-10-01 01:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  60455199600, #    utc_start 1916-09-30 23:00:00 (Sat)
  60473340000, #      utc_end 1917-04-28 22:00:00 (Sat)
  60455203200, #  local_start 1916-10-01 00:00:00 (Sun)
  60473343600, #    local_end 1917-04-28 23:00:00 (Sat)
  3600,
  0,
  'CET',
      ],
      [
  60473340000, #    utc_start 1917-04-28 22:00:00 (Sat)
  60485526000, #      utc_end 1917-09-16 23:00:00 (Sun)
  60473347200, #  local_start 1917-04-29 00:00:00 (Sun)
  60485533200, #    local_end 1917-09-17 01:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  60485526000, #    utc_start 1917-09-16 23:00:00 (Sun)
  60503677200, #      utc_end 1918-04-15 01:00:00 (Mon)
  60485529600, #  local_start 1917-09-17 00:00:00 (Mon)
  60503680800, #    local_end 1918-04-15 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  60503677200, #    utc_start 1918-04-15 01:00:00 (Mon)
  60516982800, #      utc_end 1918-09-16 01:00:00 (Mon)
  60503684400, #  local_start 1918-04-15 03:00:00 (Mon)
  60516990000, #    local_end 1918-09-16 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  60516982800, #    utc_start 1918-09-16 01:00:00 (Mon)
  60523023600, #      utc_end 1918-11-24 23:00:00 (Sun)
  60516986400, #  local_start 1918-09-16 02:00:00 (Mon)
  60523027200, #    local_end 1918-11-25 00:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  60523023600, #    utc_start 1918-11-24 23:00:00 (Sun)
  60531404400, #      utc_end 1919-03-01 23:00:00 (Sat)
  60523023600, #  local_start 1918-11-24 23:00:00 (Sun)
  60531404400, #    local_end 1919-03-01 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  60531404400, #    utc_start 1919-03-01 23:00:00 (Sat)
  60550164000, #      utc_end 1919-10-05 02:00:00 (Sun)
  60531408000, #  local_start 1919-03-02 00:00:00 (Sun)
  60550167600, #    local_end 1919-10-05 03:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60550164000, #    utc_start 1919-10-05 02:00:00 (Sun)
  60561644400, #      utc_end 1920-02-14 23:00:00 (Sat)
  60550164000, #  local_start 1919-10-05 02:00:00 (Sun)
  60561644400, #    local_end 1920-02-14 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  60561644400, #    utc_start 1920-02-14 23:00:00 (Sat)
  60583424400, #      utc_end 1920-10-24 01:00:00 (Sun)
  60561648000, #  local_start 1920-02-15 00:00:00 (Sun)
  60583428000, #    local_end 1920-10-24 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60583424400, #    utc_start 1920-10-24 01:00:00 (Sun)
  60595686000, #      utc_end 1921-03-14 23:00:00 (Mon)
  60583424400, #  local_start 1920-10-24 01:00:00 (Sun)
  60595686000, #    local_end 1921-03-14 23:00:00 (Mon)
  0,
  0,
  'WET',
      ],
      [
  60595686000, #    utc_start 1921-03-14 23:00:00 (Mon)
  60615133200, #      utc_end 1921-10-26 01:00:00 (Wed)
  60595689600, #  local_start 1921-03-15 00:00:00 (Tue)
  60615136800, #    local_end 1921-10-26 02:00:00 (Wed)
  3600,
  1,
  'WEST',
      ],
      [
  60615133200, #    utc_start 1921-10-26 01:00:00 (Wed)
  60628172400, #      utc_end 1922-03-25 23:00:00 (Sat)
  60615133200, #  local_start 1921-10-26 01:00:00 (Wed)
  60628172400, #    local_end 1922-03-25 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  60628172400, #    utc_start 1922-03-25 23:00:00 (Sat)
  60645110400, #      utc_end 1922-10-08 00:00:00 (Sun)
  60628176000, #  local_start 1922-03-26 00:00:00 (Sun)
  60645114000, #    local_end 1922-10-08 01:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60645110400, #    utc_start 1922-10-08 00:00:00 (Sun)
  60662041200, #      utc_end 1923-04-21 23:00:00 (Sat)
  60645110400, #  local_start 1922-10-08 00:00:00 (Sun)
  60662041200, #    local_end 1923-04-21 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  60662041200, #    utc_start 1923-04-21 23:00:00 (Sat)
  60676563600, #      utc_end 1923-10-07 01:00:00 (Sun)
  60662044800, #  local_start 1923-04-22 00:00:00 (Sun)
  60676567200, #    local_end 1923-10-07 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60676563600, #    utc_start 1923-10-07 01:00:00 (Sun)
  60691676400, #      utc_end 1924-03-29 23:00:00 (Sat)
  60676563600, #  local_start 1923-10-07 01:00:00 (Sun)
  60691676400, #    local_end 1924-03-29 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  60691676400, #    utc_start 1924-03-29 23:00:00 (Sat)
  60708009600, #      utc_end 1924-10-05 00:00:00 (Sun)
  60691680000, #  local_start 1924-03-30 00:00:00 (Sun)
  60708013200, #    local_end 1924-10-05 01:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60708009600, #    utc_start 1924-10-05 00:00:00 (Sun)
  60723817200, #      utc_end 1925-04-05 23:00:00 (Sun)
  60708009600, #  local_start 1924-10-05 00:00:00 (Sun)
  60723817200, #    local_end 1925-04-05 23:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  60723817200, #    utc_start 1925-04-05 23:00:00 (Sun)
  60739459200, #      utc_end 1925-10-04 00:00:00 (Sun)
  60723820800, #  local_start 1925-04-06 00:00:00 (Mon)
  60739462800, #    local_end 1925-10-04 01:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60739459200, #    utc_start 1925-10-04 00:00:00 (Sun)
  60756390000, #      utc_end 1926-04-17 23:00:00 (Sat)
  60739459200, #  local_start 1925-10-04 00:00:00 (Sun)
  60756390000, #    local_end 1926-04-17 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  60756390000, #    utc_start 1926-04-17 23:00:00 (Sat)
  60770908800, #      utc_end 1926-10-03 00:00:00 (Sun)
  60756393600, #  local_start 1926-04-18 00:00:00 (Sun)
  60770912400, #    local_end 1926-10-03 01:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60770908800, #    utc_start 1926-10-03 00:00:00 (Sun)
  60787234800, #      utc_end 1927-04-09 23:00:00 (Sat)
  60770908800, #  local_start 1926-10-03 00:00:00 (Sun)
  60787234800, #    local_end 1927-04-09 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  60787234800, #    utc_start 1927-04-09 23:00:00 (Sat)
  60802358400, #      utc_end 1927-10-02 00:00:00 (Sun)
  60787238400, #  local_start 1927-04-10 00:00:00 (Sun)
  60802362000, #    local_end 1927-10-02 01:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60802358400, #    utc_start 1927-10-02 00:00:00 (Sun)
  60819289200, #      utc_end 1928-04-14 23:00:00 (Sat)
  60802358400, #  local_start 1927-10-02 00:00:00 (Sun)
  60819289200, #    local_end 1928-04-14 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  60819289200, #    utc_start 1928-04-14 23:00:00 (Sat)
  60834412800, #      utc_end 1928-10-07 00:00:00 (Sun)
  60819292800, #  local_start 1928-04-15 00:00:00 (Sun)
  60834416400, #    local_end 1928-10-07 01:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60834412800, #    utc_start 1928-10-07 00:00:00 (Sun)
  60851343600, #      utc_end 1929-04-20 23:00:00 (Sat)
  60834412800, #  local_start 1928-10-07 00:00:00 (Sun)
  60851343600, #    local_end 1929-04-20 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  60851343600, #    utc_start 1929-04-20 23:00:00 (Sat)
  60865869600, #      utc_end 1929-10-06 02:00:00 (Sun)
  60851347200, #  local_start 1929-04-21 00:00:00 (Sun)
  60865873200, #    local_end 1929-10-06 03:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60865869600, #    utc_start 1929-10-06 02:00:00 (Sun)
  60882199200, #      utc_end 1930-04-13 02:00:00 (Sun)
  60865869600, #  local_start 1929-10-06 02:00:00 (Sun)
  60882199200, #    local_end 1930-04-13 02:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  60882199200, #    utc_start 1930-04-13 02:00:00 (Sun)
  60897319200, #      utc_end 1930-10-05 02:00:00 (Sun)
  60882202800, #  local_start 1930-04-13 03:00:00 (Sun)
  60897322800, #    local_end 1930-10-05 03:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60897319200, #    utc_start 1930-10-05 02:00:00 (Sun)
  60914253600, #      utc_end 1931-04-19 02:00:00 (Sun)
  60897319200, #  local_start 1930-10-05 02:00:00 (Sun)
  60914253600, #    local_end 1931-04-19 02:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  60914253600, #    utc_start 1931-04-19 02:00:00 (Sun)
  60928768800, #      utc_end 1931-10-04 02:00:00 (Sun)
  60914257200, #  local_start 1931-04-19 03:00:00 (Sun)
  60928772400, #    local_end 1931-10-04 03:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60928768800, #    utc_start 1931-10-04 02:00:00 (Sun)
  60944493600, #      utc_end 1932-04-03 02:00:00 (Sun)
  60928768800, #  local_start 1931-10-04 02:00:00 (Sun)
  60944493600, #    local_end 1932-04-03 02:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  60944493600, #    utc_start 1932-04-03 02:00:00 (Sun)
  60960218400, #      utc_end 1932-10-02 02:00:00 (Sun)
  60944497200, #  local_start 1932-04-03 03:00:00 (Sun)
  60960222000, #    local_end 1932-10-02 03:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60960218400, #    utc_start 1932-10-02 02:00:00 (Sun)
  60975338400, #      utc_end 1933-03-26 02:00:00 (Sun)
  60960218400, #  local_start 1932-10-02 02:00:00 (Sun)
  60975338400, #    local_end 1933-03-26 02:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  60975338400, #    utc_start 1933-03-26 02:00:00 (Sun)
  60992272800, #      utc_end 1933-10-08 02:00:00 (Sun)
  60975342000, #  local_start 1933-03-26 03:00:00 (Sun)
  60992276400, #    local_end 1933-10-08 03:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60992272800, #    utc_start 1933-10-08 02:00:00 (Sun)
  61007997600, #      utc_end 1934-04-08 02:00:00 (Sun)
  60992272800, #  local_start 1933-10-08 02:00:00 (Sun)
  61007997600, #    local_end 1934-04-08 02:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  61007997600, #    utc_start 1934-04-08 02:00:00 (Sun)
  61023722400, #      utc_end 1934-10-07 02:00:00 (Sun)
  61008001200, #  local_start 1934-04-08 03:00:00 (Sun)
  61023726000, #    local_end 1934-10-07 03:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  61023722400, #    utc_start 1934-10-07 02:00:00 (Sun)
  61038842400, #      utc_end 1935-03-31 02:00:00 (Sun)
  61023722400, #  local_start 1934-10-07 02:00:00 (Sun)
  61038842400, #    local_end 1935-03-31 02:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  61038842400, #    utc_start 1935-03-31 02:00:00 (Sun)
  61055172000, #      utc_end 1935-10-06 02:00:00 (Sun)
  61038846000, #  local_start 1935-03-31 03:00:00 (Sun)
  61055175600, #    local_end 1935-10-06 03:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  61055172000, #    utc_start 1935-10-06 02:00:00 (Sun)
  61072106400, #      utc_end 1936-04-19 02:00:00 (Sun)
  61055172000, #  local_start 1935-10-06 02:00:00 (Sun)
  61072106400, #    local_end 1936-04-19 02:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  61072106400, #    utc_start 1936-04-19 02:00:00 (Sun)
  61086621600, #      utc_end 1936-10-04 02:00:00 (Sun)
  61072110000, #  local_start 1936-04-19 03:00:00 (Sun)
  61086625200, #    local_end 1936-10-04 03:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  61086621600, #    utc_start 1936-10-04 02:00:00 (Sun)
  61102346400, #      utc_end 1937-04-04 02:00:00 (Sun)
  61086621600, #  local_start 1936-10-04 02:00:00 (Sun)
  61102346400, #    local_end 1937-04-04 02:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  61102346400, #    utc_start 1937-04-04 02:00:00 (Sun)
  61118071200, #      utc_end 1937-10-03 02:00:00 (Sun)
  61102350000, #  local_start 1937-04-04 03:00:00 (Sun)
  61118074800, #    local_end 1937-10-03 03:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  61118071200, #    utc_start 1937-10-03 02:00:00 (Sun)
  61133191200, #      utc_end 1938-03-27 02:00:00 (Sun)
  61118071200, #  local_start 1937-10-03 02:00:00 (Sun)
  61133191200, #    local_end 1938-03-27 02:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  61133191200, #    utc_start 1938-03-27 02:00:00 (Sun)
  61149520800, #      utc_end 1938-10-02 02:00:00 (Sun)
  61133194800, #  local_start 1938-03-27 03:00:00 (Sun)
  61149524400, #    local_end 1938-10-02 03:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  61149520800, #    utc_start 1938-10-02 02:00:00 (Sun)
  61166455200, #      utc_end 1939-04-16 02:00:00 (Sun)
  61149520800, #  local_start 1938-10-02 02:00:00 (Sun)
  61166455200, #    local_end 1939-04-16 02:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  61166455200, #    utc_start 1939-04-16 02:00:00 (Sun)
  61185204000, #      utc_end 1939-11-19 02:00:00 (Sun)
  61166458800, #  local_start 1939-04-16 03:00:00 (Sun)
  61185207600, #    local_end 1939-11-19 03:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  61185204000, #    utc_start 1939-11-19 02:00:00 (Sun)
  61193671200, #      utc_end 1940-02-25 02:00:00 (Sun)
  61185204000, #  local_start 1939-11-19 02:00:00 (Sun)
  61193671200, #    local_end 1940-02-25 02:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  61193671200, #    utc_start 1940-02-25 02:00:00 (Sun)
  61200496800, #      utc_end 1940-05-14 02:00:00 (Tue)
  61193674800, #  local_start 1940-02-25 03:00:00 (Sun)
  61200500400, #    local_end 1940-05-14 03:00:00 (Tue)
  3600,
  1,
  'WEST',
      ],
      [
  61200496800, #    utc_start 1940-05-14 02:00:00 (Tue)
  61278426000, #      utc_end 1942-11-02 01:00:00 (Mon)
  61200504000, #  local_start 1940-05-14 04:00:00 (Tue)
  61278433200, #    local_end 1942-11-02 03:00:00 (Mon)
  7200,
  1,
  'WEST',
      ],
      [
  61278426000, #    utc_start 1942-11-02 01:00:00 (Mon)
  61291126800, #      utc_end 1943-03-29 01:00:00 (Mon)
  61278429600, #  local_start 1942-11-02 02:00:00 (Mon)
  61291130400, #    local_end 1943-03-29 02:00:00 (Mon)
  3600,
  0,
  'WET',
      ],
      [
  61291126800, #    utc_start 1943-03-29 01:00:00 (Mon)
  61307456400, #      utc_end 1943-10-04 01:00:00 (Mon)
  61291134000, #  local_start 1943-03-29 03:00:00 (Mon)
  61307463600, #    local_end 1943-10-04 03:00:00 (Mon)
  7200,
  1,
  'WEST',
      ],
      [
  61307456400, #    utc_start 1943-10-04 01:00:00 (Mon)
  61323181200, #      utc_end 1944-04-03 01:00:00 (Mon)
  61307460000, #  local_start 1943-10-04 02:00:00 (Mon)
  61323184800, #    local_end 1944-04-03 02:00:00 (Mon)
  3600,
  0,
  'WET',
      ],
      [
  61323181200, #    utc_start 1944-04-03 01:00:00 (Mon)
  61337696400, #      utc_end 1944-09-18 01:00:00 (Mon)
  61323188400, #  local_start 1944-04-03 03:00:00 (Mon)
  61337703600, #    local_end 1944-09-18 03:00:00 (Mon)
  7200,
  1,
  'WEST',
      ],
      [
  61337696400, #    utc_start 1944-09-18 01:00:00 (Mon)
  61354630800, #      utc_end 1945-04-02 01:00:00 (Mon)
  61337700000, #  local_start 1944-09-18 02:00:00 (Mon)
  61354634400, #    local_end 1945-04-02 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61354630800, #    utc_start 1945-04-02 01:00:00 (Mon)
  61369059600, #      utc_end 1945-09-16 01:00:00 (Sun)
  61354638000, #  local_start 1945-04-02 03:00:00 (Mon)
  61369066800, #    local_end 1945-09-16 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  61369059600, #    utc_start 1945-09-16 01:00:00 (Sun)
  61390227600, #      utc_end 1946-05-19 01:00:00 (Sun)
  61369063200, #  local_start 1945-09-16 02:00:00 (Sun)
  61390231200, #    local_end 1946-05-19 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  61390227600, #    utc_start 1946-05-19 01:00:00 (Sun)
  61402410000, #      utc_end 1946-10-07 01:00:00 (Mon)
  61390234800, #  local_start 1946-05-19 03:00:00 (Sun)
  61402417200, #    local_end 1946-10-07 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61402410000, #    utc_start 1946-10-07 01:00:00 (Mon)
  62356604400, #      utc_end 1976-12-31 23:00:00 (Fri)
  61402413600, #  local_start 1946-10-07 02:00:00 (Mon)
  62356608000, #    local_end 1977-01-01 00:00:00 (Sat)
  3600,
  0,
  'CET',
      ],
      [
  62356604400, #    utc_start 1976-12-31 23:00:00 (Fri)
  62364560400, #      utc_end 1977-04-03 01:00:00 (Sun)
  62356608000, #  local_start 1977-01-01 00:00:00 (Sat)
  62364564000, #    local_end 1977-04-03 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62364560400, #    utc_start 1977-04-03 01:00:00 (Sun)
  62379680400, #      utc_end 1977-09-25 01:00:00 (Sun)
  62364567600, #  local_start 1977-04-03 03:00:00 (Sun)
  62379687600, #    local_end 1977-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62379680400, #    utc_start 1977-09-25 01:00:00 (Sun)
  62396010000, #      utc_end 1978-04-02 01:00:00 (Sun)
  62379684000, #  local_start 1977-09-25 02:00:00 (Sun)
  62396013600, #    local_end 1978-04-02 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62396010000, #    utc_start 1978-04-02 01:00:00 (Sun)
  62411734800, #      utc_end 1978-10-01 01:00:00 (Sun)
  62396017200, #  local_start 1978-04-02 03:00:00 (Sun)
  62411742000, #    local_end 1978-10-01 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62411734800, #    utc_start 1978-10-01 01:00:00 (Sun)
  62427459600, #      utc_end 1979-04-01 01:00:00 (Sun)
  62411738400, #  local_start 1978-10-01 02:00:00 (Sun)
  62427463200, #    local_end 1979-04-01 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62427459600, #    utc_start 1979-04-01 01:00:00 (Sun)
  62443184400, #      utc_end 1979-09-30 01:00:00 (Sun)
  62427466800, #  local_start 1979-04-01 03:00:00 (Sun)
  62443191600, #    local_end 1979-09-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62443184400, #    utc_start 1979-09-30 01:00:00 (Sun)
  62459514000, #      utc_end 1980-04-06 01:00:00 (Sun)
  62443188000, #  local_start 1979-09-30 02:00:00 (Sun)
  62459517600, #    local_end 1980-04-06 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62459514000, #    utc_start 1980-04-06 01:00:00 (Sun)
  62474634000, #      utc_end 1980-09-28 01:00:00 (Sun)
  62459521200, #  local_start 1980-04-06 03:00:00 (Sun)
  62474641200, #    local_end 1980-09-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62474634000, #    utc_start 1980-09-28 01:00:00 (Sun)
  62490358800, #      utc_end 1981-03-29 01:00:00 (Sun)
  62474637600, #  local_start 1980-09-28 02:00:00 (Sun)
  62490362400, #    local_end 1981-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62490358800, #    utc_start 1981-03-29 01:00:00 (Sun)
  62506083600, #      utc_end 1981-09-27 01:00:00 (Sun)
  62490366000, #  local_start 1981-03-29 03:00:00 (Sun)
  62506090800, #    local_end 1981-09-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62506083600, #    utc_start 1981-09-27 01:00:00 (Sun)
  62521808400, #      utc_end 1982-03-28 01:00:00 (Sun)
  62506087200, #  local_start 1981-09-27 02:00:00 (Sun)
  62521812000, #    local_end 1982-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62521808400, #    utc_start 1982-03-28 01:00:00 (Sun)
  62537533200, #      utc_end 1982-09-26 01:00:00 (Sun)
  62521815600, #  local_start 1982-03-28 03:00:00 (Sun)
  62537540400, #    local_end 1982-09-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62537533200, #    utc_start 1982-09-26 01:00:00 (Sun)
  62553258000, #      utc_end 1983-03-27 01:00:00 (Sun)
  62537536800, #  local_start 1982-09-26 02:00:00 (Sun)
  62553261600, #    local_end 1983-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62553258000, #    utc_start 1983-03-27 01:00:00 (Sun)
  62568982800, #      utc_end 1983-09-25 01:00:00 (Sun)
  62553265200, #  local_start 1983-03-27 03:00:00 (Sun)
  62568990000, #    local_end 1983-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62568982800, #    utc_start 1983-09-25 01:00:00 (Sun)
  62584707600, #      utc_end 1984-03-25 01:00:00 (Sun)
  62568986400, #  local_start 1983-09-25 02:00:00 (Sun)
  62584711200, #    local_end 1984-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62584707600, #    utc_start 1984-03-25 01:00:00 (Sun)
  62601037200, #      utc_end 1984-09-30 01:00:00 (Sun)
  62584714800, #  local_start 1984-03-25 03:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62601037200, #    utc_start 1984-09-30 01:00:00 (Sun)
  62616762000, #      utc_end 1985-03-31 01:00:00 (Sun)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62616762000, #    utc_start 1985-03-31 01:00:00 (Sun)
  62632486800, #      utc_end 1985-09-29 01:00:00 (Sun)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62632486800, #    utc_start 1985-09-29 01:00:00 (Sun)
  62648211600, #      utc_end 1986-03-30 01:00:00 (Sun)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62648211600, #    utc_start 1986-03-30 01:00:00 (Sun)
  62663936400, #      utc_end 1986-09-28 01:00:00 (Sun)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62663936400, #    utc_start 1986-09-28 01:00:00 (Sun)
  62679661200, #      utc_end 1987-03-29 01:00:00 (Sun)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62679661200, #    utc_start 1987-03-29 01:00:00 (Sun)
  62695386000, #      utc_end 1987-09-27 01:00:00 (Sun)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62695386000, #    utc_start 1987-09-27 01:00:00 (Sun)
  62711110800, #      utc_end 1988-03-27 01:00:00 (Sun)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62711110800, #    utc_start 1988-03-27 01:00:00 (Sun)
  62726835600, #      utc_end 1988-09-25 01:00:00 (Sun)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62726835600, #    utc_start 1988-09-25 01:00:00 (Sun)
  62742560400, #      utc_end 1989-03-26 01:00:00 (Sun)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62742560400, #    utc_start 1989-03-26 01:00:00 (Sun)
  62758285200, #      utc_end 1989-09-24 01:00:00 (Sun)
  62742567600, #  local_start 1989-03-26 03:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62758285200, #    utc_start 1989-09-24 01:00:00 (Sun)
  62774010000, #      utc_end 1990-03-25 01:00:00 (Sun)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62774010000, #    utc_start 1990-03-25 01:00:00 (Sun)
  62790339600, #      utc_end 1990-09-30 01:00:00 (Sun)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62790339600, #    utc_start 1990-09-30 01:00:00 (Sun)
  62806064400, #      utc_end 1991-03-31 01:00:00 (Sun)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62806064400, #    utc_start 1991-03-31 01:00:00 (Sun)
  62821789200, #      utc_end 1991-09-29 01:00:00 (Sun)
  62806071600, #  local_start 1991-03-31 03:00:00 (Sun)
  62821796400, #    local_end 1991-09-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62821789200, #    utc_start 1991-09-29 01:00:00 (Sun)
  62837514000, #      utc_end 1992-03-29 01:00:00 (Sun)
  62821792800, #  local_start 1991-09-29 02:00:00 (Sun)
  62837517600, #    local_end 1992-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62837514000, #    utc_start 1992-03-29 01:00:00 (Sun)
  62853238800, #      utc_end 1992-09-27 01:00:00 (Sun)
  62837521200, #  local_start 1992-03-29 03:00:00 (Sun)
  62853246000, #    local_end 1992-09-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62853238800, #    utc_start 1992-09-27 01:00:00 (Sun)
  62868963600, #      utc_end 1993-03-28 01:00:00 (Sun)
  62853242400, #  local_start 1992-09-27 02:00:00 (Sun)
  62868967200, #    local_end 1993-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62868963600, #    utc_start 1993-03-28 01:00:00 (Sun)
  62884688400, #      utc_end 1993-09-26 01:00:00 (Sun)
  62868970800, #  local_start 1993-03-28 03:00:00 (Sun)
  62884695600, #    local_end 1993-09-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62884688400, #    utc_start 1993-09-26 01:00:00 (Sun)
  62900413200, #      utc_end 1994-03-27 01:00:00 (Sun)
  62884692000, #  local_start 1993-09-26 02:00:00 (Sun)
  62900416800, #    local_end 1994-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62900413200, #    utc_start 1994-03-27 01:00:00 (Sun)
  62916138000, #      utc_end 1994-09-25 01:00:00 (Sun)
  62900420400, #  local_start 1994-03-27 03:00:00 (Sun)
  62916145200, #    local_end 1994-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62916138000, #    utc_start 1994-09-25 01:00:00 (Sun)
  62931862800, #      utc_end 1995-03-26 01:00:00 (Sun)
  62916141600, #  local_start 1994-09-25 02:00:00 (Sun)
  62931866400, #    local_end 1995-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62931862800, #    utc_start 1995-03-26 01:00:00 (Sun)
  62947587600, #      utc_end 1995-09-24 01:00:00 (Sun)
  62931870000, #  local_start 1995-03-26 03:00:00 (Sun)
  62947594800, #    local_end 1995-09-24 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62947587600, #    utc_start 1995-09-24 01:00:00 (Sun)
  62963917200, #      utc_end 1996-03-31 01:00:00 (Sun)
  62947591200, #  local_start 1995-09-24 02:00:00 (Sun)
  62963920800, #    local_end 1996-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62963917200, #    utc_start 1996-03-31 01:00:00 (Sun)
  62982061200, #      utc_end 1996-10-27 01:00:00 (Sun)
  62963924400, #  local_start 1996-03-31 03:00:00 (Sun)
  62982068400, #    local_end 1996-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62982061200, #    utc_start 1996-10-27 01:00:00 (Sun)
  62995366800, #      utc_end 1997-03-30 01:00:00 (Sun)
  62982064800, #  local_start 1996-10-27 02:00:00 (Sun)
  62995370400, #    local_end 1997-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62995366800, #    utc_start 1997-03-30 01:00:00 (Sun)
  63013510800, #      utc_end 1997-10-26 01:00:00 (Sun)
  62995374000, #  local_start 1997-03-30 03:00:00 (Sun)
  63013518000, #    local_end 1997-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63013510800, #    utc_start 1997-10-26 01:00:00 (Sun)
  63026816400, #      utc_end 1998-03-29 01:00:00 (Sun)
  63013514400, #  local_start 1997-10-26 02:00:00 (Sun)
  63026820000, #    local_end 1998-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63026816400, #    utc_start 1998-03-29 01:00:00 (Sun)
  63044960400, #      utc_end 1998-10-25 01:00:00 (Sun)
  63026823600, #  local_start 1998-03-29 03:00:00 (Sun)
  63044967600, #    local_end 1998-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63044960400, #    utc_start 1998-10-25 01:00:00 (Sun)
  63058266000, #      utc_end 1999-03-28 01:00:00 (Sun)
  63044964000, #  local_start 1998-10-25 02:00:00 (Sun)
  63058269600, #    local_end 1999-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63058266000, #    utc_start 1999-03-28 01:00:00 (Sun)
  63077014800, #      utc_end 1999-10-31 01:00:00 (Sun)
  63058273200, #  local_start 1999-03-28 03:00:00 (Sun)
  63077022000, #    local_end 1999-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63077014800, #    utc_start 1999-10-31 01:00:00 (Sun)
  63089715600, #      utc_end 2000-03-26 01:00:00 (Sun)
  63077018400, #  local_start 1999-10-31 02:00:00 (Sun)
  63089719200, #    local_end 2000-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63089715600, #    utc_start 2000-03-26 01:00:00 (Sun)
  63108464400, #      utc_end 2000-10-29 01:00:00 (Sun)
  63089722800, #  local_start 2000-03-26 03:00:00 (Sun)
  63108471600, #    local_end 2000-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63108464400, #    utc_start 2000-10-29 01:00:00 (Sun)
  63121165200, #      utc_end 2001-03-25 01:00:00 (Sun)
  63108468000, #  local_start 2000-10-29 02:00:00 (Sun)
  63121168800, #    local_end 2001-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63121165200, #    utc_start 2001-03-25 01:00:00 (Sun)
  63139914000, #      utc_end 2001-10-28 01:00:00 (Sun)
  63121172400, #  local_start 2001-03-25 03:00:00 (Sun)
  63139921200, #    local_end 2001-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63139914000, #    utc_start 2001-10-28 01:00:00 (Sun)
  63153219600, #      utc_end 2002-03-31 01:00:00 (Sun)
  63139917600, #  local_start 2001-10-28 02:00:00 (Sun)
  63153223200, #    local_end 2002-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63153219600, #    utc_start 2002-03-31 01:00:00 (Sun)
  63171363600, #      utc_end 2002-10-27 01:00:00 (Sun)
  63153226800, #  local_start 2002-03-31 03:00:00 (Sun)
  63171370800, #    local_end 2002-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63171363600, #    utc_start 2002-10-27 01:00:00 (Sun)
  63184669200, #      utc_end 2003-03-30 01:00:00 (Sun)
  63171367200, #  local_start 2002-10-27 02:00:00 (Sun)
  63184672800, #    local_end 2003-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63184669200, #    utc_start 2003-03-30 01:00:00 (Sun)
  63202813200, #      utc_end 2003-10-26 01:00:00 (Sun)
  63184676400, #  local_start 2003-03-30 03:00:00 (Sun)
  63202820400, #    local_end 2003-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63202813200, #    utc_start 2003-10-26 01:00:00 (Sun)
  63216118800, #      utc_end 2004-03-28 01:00:00 (Sun)
  63202816800, #  local_start 2003-10-26 02:00:00 (Sun)
  63216122400, #    local_end 2004-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63216118800, #    utc_start 2004-03-28 01:00:00 (Sun)
  63234867600, #      utc_end 2004-10-31 01:00:00 (Sun)
  63216126000, #  local_start 2004-03-28 03:00:00 (Sun)
  63234874800, #    local_end 2004-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63234867600, #    utc_start 2004-10-31 01:00:00 (Sun)
  63247568400, #      utc_end 2005-03-27 01:00:00 (Sun)
  63234871200, #  local_start 2004-10-31 02:00:00 (Sun)
  63247572000, #    local_end 2005-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63247568400, #    utc_start 2005-03-27 01:00:00 (Sun)
  63266317200, #      utc_end 2005-10-30 01:00:00 (Sun)
  63247575600, #  local_start 2005-03-27 03:00:00 (Sun)
  63266324400, #    local_end 2005-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63266317200, #    utc_start 2005-10-30 01:00:00 (Sun)
  63279018000, #      utc_end 2006-03-26 01:00:00 (Sun)
  63266320800, #  local_start 2005-10-30 02:00:00 (Sun)
  63279021600, #    local_end 2006-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63279018000, #    utc_start 2006-03-26 01:00:00 (Sun)
  63297766800, #      utc_end 2006-10-29 01:00:00 (Sun)
  63279025200, #  local_start 2006-03-26 03:00:00 (Sun)
  63297774000, #    local_end 2006-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63297766800, #    utc_start 2006-10-29 01:00:00 (Sun)
  63310467600, #      utc_end 2007-03-25 01:00:00 (Sun)
  63297770400, #  local_start 2006-10-29 02:00:00 (Sun)
  63310471200, #    local_end 2007-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63310467600, #    utc_start 2007-03-25 01:00:00 (Sun)
  63329216400, #      utc_end 2007-10-28 01:00:00 (Sun)
  63310474800, #  local_start 2007-03-25 03:00:00 (Sun)
  63329223600, #    local_end 2007-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63329216400, #    utc_start 2007-10-28 01:00:00 (Sun)
  63342522000, #      utc_end 2008-03-30 01:00:00 (Sun)
  63329220000, #  local_start 2007-10-28 02:00:00 (Sun)
  63342525600, #    local_end 2008-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63342522000, #    utc_start 2008-03-30 01:00:00 (Sun)
  63360666000, #      utc_end 2008-10-26 01:00:00 (Sun)
  63342529200, #  local_start 2008-03-30 03:00:00 (Sun)
  63360673200, #    local_end 2008-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63360666000, #    utc_start 2008-10-26 01:00:00 (Sun)
  63373971600, #      utc_end 2009-03-29 01:00:00 (Sun)
  63360669600, #  local_start 2008-10-26 02:00:00 (Sun)
  63373975200, #    local_end 2009-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63373971600, #    utc_start 2009-03-29 01:00:00 (Sun)
  63392115600, #      utc_end 2009-10-25 01:00:00 (Sun)
  63373978800, #  local_start 2009-03-29 03:00:00 (Sun)
  63392122800, #    local_end 2009-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63392115600, #    utc_start 2009-10-25 01:00:00 (Sun)
  63405421200, #      utc_end 2010-03-28 01:00:00 (Sun)
  63392119200, #  local_start 2009-10-25 02:00:00 (Sun)
  63405424800, #    local_end 2010-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63405421200, #    utc_start 2010-03-28 01:00:00 (Sun)
  63424170000, #      utc_end 2010-10-31 01:00:00 (Sun)
  63405428400, #  local_start 2010-03-28 03:00:00 (Sun)
  63424177200, #    local_end 2010-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63424170000, #    utc_start 2010-10-31 01:00:00 (Sun)
  63436870800, #      utc_end 2011-03-27 01:00:00 (Sun)
  63424173600, #  local_start 2010-10-31 02:00:00 (Sun)
  63436874400, #    local_end 2011-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63436870800, #    utc_start 2011-03-27 01:00:00 (Sun)
  63455619600, #      utc_end 2011-10-30 01:00:00 (Sun)
  63436878000, #  local_start 2011-03-27 03:00:00 (Sun)
  63455626800, #    local_end 2011-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63455619600, #    utc_start 2011-10-30 01:00:00 (Sun)
  63468320400, #      utc_end 2012-03-25 01:00:00 (Sun)
  63455623200, #  local_start 2011-10-30 02:00:00 (Sun)
  63468324000, #    local_end 2012-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63468320400, #    utc_start 2012-03-25 01:00:00 (Sun)
  63487069200, #      utc_end 2012-10-28 01:00:00 (Sun)
  63468327600, #  local_start 2012-03-25 03:00:00 (Sun)
  63487076400, #    local_end 2012-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63487069200, #    utc_start 2012-10-28 01:00:00 (Sun)
  63500374800, #      utc_end 2013-03-31 01:00:00 (Sun)
  63487072800, #  local_start 2012-10-28 02:00:00 (Sun)
  63500378400, #    local_end 2013-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63500374800, #    utc_start 2013-03-31 01:00:00 (Sun)
  63518518800, #      utc_end 2013-10-27 01:00:00 (Sun)
  63500382000, #  local_start 2013-03-31 03:00:00 (Sun)
  63518526000, #    local_end 2013-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63518518800, #    utc_start 2013-10-27 01:00:00 (Sun)
  63531824400, #      utc_end 2014-03-30 01:00:00 (Sun)
  63518522400, #  local_start 2013-10-27 02:00:00 (Sun)
  63531828000, #    local_end 2014-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63531824400, #    utc_start 2014-03-30 01:00:00 (Sun)
  63549968400, #      utc_end 2014-10-26 01:00:00 (Sun)
  63531831600, #  local_start 2014-03-30 03:00:00 (Sun)
  63549975600, #    local_end 2014-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63549968400, #    utc_start 2014-10-26 01:00:00 (Sun)
  63563274000, #      utc_end 2015-03-29 01:00:00 (Sun)
  63549972000, #  local_start 2014-10-26 02:00:00 (Sun)
  63563277600, #    local_end 2015-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63563274000, #    utc_start 2015-03-29 01:00:00 (Sun)
  63581418000, #      utc_end 2015-10-25 01:00:00 (Sun)
  63563281200, #  local_start 2015-03-29 03:00:00 (Sun)
  63581425200, #    local_end 2015-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63581418000, #    utc_start 2015-10-25 01:00:00 (Sun)
  63594723600, #      utc_end 2016-03-27 01:00:00 (Sun)
  63581421600, #  local_start 2015-10-25 02:00:00 (Sun)
  63594727200, #    local_end 2016-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63594723600, #    utc_start 2016-03-27 01:00:00 (Sun)
  63613472400, #      utc_end 2016-10-30 01:00:00 (Sun)
  63594730800, #  local_start 2016-03-27 03:00:00 (Sun)
  63613479600, #    local_end 2016-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63613472400, #    utc_start 2016-10-30 01:00:00 (Sun)
  63626173200, #      utc_end 2017-03-26 01:00:00 (Sun)
  63613476000, #  local_start 2016-10-30 02:00:00 (Sun)
  63626176800, #    local_end 2017-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63626173200, #    utc_start 2017-03-26 01:00:00 (Sun)
  63644922000, #      utc_end 2017-10-29 01:00:00 (Sun)
  63626180400, #  local_start 2017-03-26 03:00:00 (Sun)
  63644929200, #    local_end 2017-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63644922000, #    utc_start 2017-10-29 01:00:00 (Sun)
  63657622800, #      utc_end 2018-03-25 01:00:00 (Sun)
  63644925600, #  local_start 2017-10-29 02:00:00 (Sun)
  63657626400, #    local_end 2018-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63657622800, #    utc_start 2018-03-25 01:00:00 (Sun)
  63676371600, #      utc_end 2018-10-28 01:00:00 (Sun)
  63657630000, #  local_start 2018-03-25 03:00:00 (Sun)
  63676378800, #    local_end 2018-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63676371600, #    utc_start 2018-10-28 01:00:00 (Sun)
  63689677200, #      utc_end 2019-03-31 01:00:00 (Sun)
  63676375200, #  local_start 2018-10-28 02:00:00 (Sun)
  63689680800, #    local_end 2019-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63689677200, #    utc_start 2019-03-31 01:00:00 (Sun)
  63707821200, #      utc_end 2019-10-27 01:00:00 (Sun)
  63689684400, #  local_start 2019-03-31 03:00:00 (Sun)
  63707828400, #    local_end 2019-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63707821200, #    utc_start 2019-10-27 01:00:00 (Sun)
  63721126800, #      utc_end 2020-03-29 01:00:00 (Sun)
  63707824800, #  local_start 2019-10-27 02:00:00 (Sun)
  63721130400, #    local_end 2020-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63721126800, #    utc_start 2020-03-29 01:00:00 (Sun)
  63739270800, #      utc_end 2020-10-25 01:00:00 (Sun)
  63721134000, #  local_start 2020-03-29 03:00:00 (Sun)
  63739278000, #    local_end 2020-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63739270800, #    utc_start 2020-10-25 01:00:00 (Sun)
  63752576400, #      utc_end 2021-03-28 01:00:00 (Sun)
  63739274400, #  local_start 2020-10-25 02:00:00 (Sun)
  63752580000, #    local_end 2021-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63752576400, #    utc_start 2021-03-28 01:00:00 (Sun)
  63771325200, #      utc_end 2021-10-31 01:00:00 (Sun)
  63752583600, #  local_start 2021-03-28 03:00:00 (Sun)
  63771332400, #    local_end 2021-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63771325200, #    utc_start 2021-10-31 01:00:00 (Sun)
  63784026000, #      utc_end 2022-03-27 01:00:00 (Sun)
  63771328800, #  local_start 2021-10-31 02:00:00 (Sun)
  63784029600, #    local_end 2022-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63784026000, #    utc_start 2022-03-27 01:00:00 (Sun)
  63802774800, #      utc_end 2022-10-30 01:00:00 (Sun)
  63784033200, #  local_start 2022-03-27 03:00:00 (Sun)
  63802782000, #    local_end 2022-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63802774800, #    utc_start 2022-10-30 01:00:00 (Sun)
  63815475600, #      utc_end 2023-03-26 01:00:00 (Sun)
  63802778400, #  local_start 2022-10-30 02:00:00 (Sun)
  63815479200, #    local_end 2023-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63815475600, #    utc_start 2023-03-26 01:00:00 (Sun)
  63834224400, #      utc_end 2023-10-29 01:00:00 (Sun)
  63815482800, #  local_start 2023-03-26 03:00:00 (Sun)
  63834231600, #    local_end 2023-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63834224400, #    utc_start 2023-10-29 01:00:00 (Sun)
  63847530000, #      utc_end 2024-03-31 01:00:00 (Sun)
  63834228000, #  local_start 2023-10-29 02:00:00 (Sun)
  63847533600, #    local_end 2024-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63847530000, #    utc_start 2024-03-31 01:00:00 (Sun)
  63865674000, #      utc_end 2024-10-27 01:00:00 (Sun)
  63847537200, #  local_start 2024-03-31 03:00:00 (Sun)
  63865681200, #    local_end 2024-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63865674000, #    utc_start 2024-10-27 01:00:00 (Sun)
  63878979600, #      utc_end 2025-03-30 01:00:00 (Sun)
  63865677600, #  local_start 2024-10-27 02:00:00 (Sun)
  63878983200, #    local_end 2025-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63878979600, #    utc_start 2025-03-30 01:00:00 (Sun)
  63897123600, #      utc_end 2025-10-26 01:00:00 (Sun)
  63878986800, #  local_start 2025-03-30 03:00:00 (Sun)
  63897130800, #    local_end 2025-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63897123600, #    utc_start 2025-10-26 01:00:00 (Sun)
  63910429200, #      utc_end 2026-03-29 01:00:00 (Sun)
  63897127200, #  local_start 2025-10-26 02:00:00 (Sun)
  63910432800, #    local_end 2026-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63910429200, #    utc_start 2026-03-29 01:00:00 (Sun)
  63928573200, #      utc_end 2026-10-25 01:00:00 (Sun)
  63910436400, #  local_start 2026-03-29 03:00:00 (Sun)
  63928580400, #    local_end 2026-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63928573200, #    utc_start 2026-10-25 01:00:00 (Sun)
  63941878800, #      utc_end 2027-03-28 01:00:00 (Sun)
  63928576800, #  local_start 2026-10-25 02:00:00 (Sun)
  63941882400, #    local_end 2027-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63941878800, #    utc_start 2027-03-28 01:00:00 (Sun)
  63960627600, #      utc_end 2027-10-31 01:00:00 (Sun)
  63941886000, #  local_start 2027-03-28 03:00:00 (Sun)
  63960634800, #    local_end 2027-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63960627600, #    utc_start 2027-10-31 01:00:00 (Sun)
  63973328400, #      utc_end 2028-03-26 01:00:00 (Sun)
  63960631200, #  local_start 2027-10-31 02:00:00 (Sun)
  63973332000, #    local_end 2028-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63973328400, #    utc_start 2028-03-26 01:00:00 (Sun)
  63992077200, #      utc_end 2028-10-29 01:00:00 (Sun)
  63973335600, #  local_start 2028-03-26 03:00:00 (Sun)
  63992084400, #    local_end 2028-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63992077200, #    utc_start 2028-10-29 01:00:00 (Sun)
  64004778000, #      utc_end 2029-03-25 01:00:00 (Sun)
  63992080800, #  local_start 2028-10-29 02:00:00 (Sun)
  64004781600, #    local_end 2029-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  64004778000, #    utc_start 2029-03-25 01:00:00 (Sun)
  64023526800, #      utc_end 2029-10-28 01:00:00 (Sun)
  64004785200, #  local_start 2029-03-25 03:00:00 (Sun)
  64023534000, #    local_end 2029-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  64023526800, #    utc_start 2029-10-28 01:00:00 (Sun)
  64036832400, #      utc_end 2030-03-31 01:00:00 (Sun)
  64023530400, #  local_start 2029-10-28 02:00:00 (Sun)
  64036836000, #    local_end 2030-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  64036832400, #    utc_start 2030-03-31 01:00:00 (Sun)
  64054976400, #      utc_end 2030-10-27 01:00:00 (Sun)
  64036839600, #  local_start 2030-03-31 03:00:00 (Sun)
  64054983600, #    local_end 2030-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {84}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { 3600 }
  
  my $last_observance = bless( {
    'format' => 'CE%sT',
    'gmtoff' => '1:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 721720,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 721720,
      'utc_rd_secs' => 0,
      'utc_year' => 1978
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => 3600,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 721719,
      'local_rd_secs' => 82800,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 721719,
      'utc_rd_secs' => 82800,
      'utc_year' => 1977
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '1:00u',
      'from' => '1996',
      'in' => 'Oct',
      'letter' => '',
      'name' => 'EU',
      'offset_from_std' => 0,
      'on' => 'lastSun',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '1:00u',
      'from' => '1981',
      'in' => 'Mar',
      'letter' => 'S',
      'name' => 'EU',
      'offset_from_std' => 3600,
      'on' => 'lastSun',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_EUROPE_LUXEMBOURG

    $main::fatpacked{"DateTime/TimeZone/Europe/Madrid.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_EUROPE_MADRID';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Europe::Madrid;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Europe::Madrid::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59958230400, #      utc_end 1901-01-01 00:00:00 (Tue)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59958229516, #    local_end 1900-12-31 23:45:16 (Mon)
  -884,
  0,
  'LMT',
      ],
      [
  59958230400, #    utc_start 1901-01-01 00:00:00 (Tue)
  60503756400, #      utc_end 1918-04-15 23:00:00 (Mon)
  59958230400, #  local_start 1901-01-01 00:00:00 (Tue)
  60503756400, #    local_end 1918-04-15 23:00:00 (Mon)
  0,
  0,
  'WET',
      ],
      [
  60503756400, #    utc_start 1918-04-15 23:00:00 (Mon)
  60518793600, #      utc_end 1918-10-07 00:00:00 (Mon)
  60503760000, #  local_start 1918-04-16 00:00:00 (Tue)
  60518797200, #    local_end 1918-10-07 01:00:00 (Mon)
  3600,
  1,
  'WEST',
      ],
      [
  60518793600, #    utc_start 1918-10-07 00:00:00 (Mon)
  60534514800, #      utc_end 1919-04-06 23:00:00 (Sun)
  60518793600, #  local_start 1918-10-07 00:00:00 (Mon)
  60534514800, #    local_end 1919-04-06 23:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  60534514800, #    utc_start 1919-04-06 23:00:00 (Sun)
  60550329600, #      utc_end 1919-10-07 00:00:00 (Tue)
  60534518400, #  local_start 1919-04-07 00:00:00 (Mon)
  60550333200, #    local_end 1919-10-07 01:00:00 (Tue)
  3600,
  1,
  'WEST',
      ],
      [
  60550329600, #    utc_start 1919-10-07 00:00:00 (Tue)
  60693231600, #      utc_end 1924-04-16 23:00:00 (Wed)
  60550329600, #  local_start 1919-10-07 00:00:00 (Tue)
  60693231600, #    local_end 1924-04-16 23:00:00 (Wed)
  0,
  0,
  'WET',
      ],
      [
  60693231600, #    utc_start 1924-04-16 23:00:00 (Wed)
  60708009600, #      utc_end 1924-10-05 00:00:00 (Sun)
  60693235200, #  local_start 1924-04-17 00:00:00 (Thu)
  60708013200, #    local_end 1924-10-05 01:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60708009600, #    utc_start 1924-10-05 00:00:00 (Sun)
  60756390000, #      utc_end 1926-04-17 23:00:00 (Sat)
  60708009600, #  local_start 1924-10-05 00:00:00 (Sun)
  60756390000, #    local_end 1926-04-17 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  60756390000, #    utc_start 1926-04-17 23:00:00 (Sat)
  60770908800, #      utc_end 1926-10-03 00:00:00 (Sun)
  60756393600, #  local_start 1926-04-18 00:00:00 (Sun)
  60770912400, #    local_end 1926-10-03 01:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60770908800, #    utc_start 1926-10-03 00:00:00 (Sun)
  60787234800, #      utc_end 1927-04-09 23:00:00 (Sat)
  60770908800, #  local_start 1926-10-03 00:00:00 (Sun)
  60787234800, #    local_end 1927-04-09 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  60787234800, #    utc_start 1927-04-09 23:00:00 (Sat)
  60802358400, #      utc_end 1927-10-02 00:00:00 (Sun)
  60787238400, #  local_start 1927-04-10 00:00:00 (Sun)
  60802362000, #    local_end 1927-10-02 01:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60802358400, #    utc_start 1927-10-02 00:00:00 (Sun)
  60819292800, #      utc_end 1928-04-15 00:00:00 (Sun)
  60802358400, #  local_start 1927-10-02 00:00:00 (Sun)
  60819292800, #    local_end 1928-04-15 00:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  60819292800, #    utc_start 1928-04-15 00:00:00 (Sun)
  60834412800, #      utc_end 1928-10-07 00:00:00 (Sun)
  60819296400, #  local_start 1928-04-15 01:00:00 (Sun)
  60834416400, #    local_end 1928-10-07 01:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60834412800, #    utc_start 1928-10-07 00:00:00 (Sun)
  60851343600, #      utc_end 1929-04-20 23:00:00 (Sat)
  60834412800, #  local_start 1928-10-07 00:00:00 (Sun)
  60851343600, #    local_end 1929-04-20 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  60851343600, #    utc_start 1929-04-20 23:00:00 (Sat)
  60865862400, #      utc_end 1929-10-06 00:00:00 (Sun)
  60851347200, #  local_start 1929-04-21 00:00:00 (Sun)
  60865866000, #    local_end 1929-10-06 01:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60865862400, #    utc_start 1929-10-06 00:00:00 (Sun)
  61108729200, #      utc_end 1937-06-16 23:00:00 (Wed)
  60865862400, #  local_start 1929-10-06 00:00:00 (Sun)
  61108729200, #    local_end 1937-06-16 23:00:00 (Wed)
  0,
  0,
  'WET',
      ],
      [
  61108729200, #    utc_start 1937-06-16 23:00:00 (Wed)
  61118064000, #      utc_end 1937-10-03 00:00:00 (Sun)
  61108732800, #  local_start 1937-06-17 00:00:00 (Thu)
  61118067600, #    local_end 1937-10-03 01:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  61118064000, #    utc_start 1937-10-03 00:00:00 (Sun)
  61133785200, #      utc_end 1938-04-02 23:00:00 (Sat)
  61118064000, #  local_start 1937-10-03 00:00:00 (Sun)
  61133785200, #    local_end 1938-04-02 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  61133785200, #    utc_start 1938-04-02 23:00:00 (Sat)
  61136200800, #      utc_end 1938-04-30 22:00:00 (Sat)
  61133788800, #  local_start 1938-04-03 00:00:00 (Sun)
  61136204400, #    local_end 1938-04-30 23:00:00 (Sat)
  3600,
  1,
  'WEST',
      ],
      [
  61136200800, #    utc_start 1938-04-30 22:00:00 (Sat)
  61149592800, #      utc_end 1938-10-02 22:00:00 (Sun)
  61136208000, #  local_start 1938-05-01 00:00:00 (Sun)
  61149600000, #    local_end 1938-10-03 00:00:00 (Mon)
  7200,
  1,
  'WEMT',
      ],
      [
  61149592800, #    utc_start 1938-10-02 22:00:00 (Sun)
  61181568000, #      utc_end 1939-10-08 00:00:00 (Sun)
  61149596400, #  local_start 1938-10-02 23:00:00 (Sun)
  61181571600, #    local_end 1939-10-08 01:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  61181568000, #    utc_start 1939-10-08 00:00:00 (Sun)
  61195474800, #      utc_end 1940-03-16 23:00:00 (Sat)
  61181568000, #  local_start 1939-10-08 00:00:00 (Sun)
  61195474800, #    local_end 1940-03-16 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  61195474800, #    utc_start 1940-03-16 23:00:00 (Sat)
  61262604000, #      utc_end 1942-05-02 22:00:00 (Sat)
  61195478400, #  local_start 1940-03-17 00:00:00 (Sun)
  61262607600, #    local_end 1942-05-02 23:00:00 (Sat)
  3600,
  0,
  'CET',
      ],
      [
  61262604000, #    utc_start 1942-05-02 22:00:00 (Sat)
  61273062000, #      utc_end 1942-08-31 23:00:00 (Mon)
  61262611200, #  local_start 1942-05-03 00:00:00 (Sun)
  61273069200, #    local_end 1942-09-01 01:00:00 (Tue)
  7200,
  1,
  'CEST',
      ],
      [
  61273062000, #    utc_start 1942-08-31 23:00:00 (Mon)
  61292844000, #      utc_end 1943-04-17 22:00:00 (Sat)
  61273065600, #  local_start 1942-09-01 00:00:00 (Tue)
  61292847600, #    local_end 1943-04-17 23:00:00 (Sat)
  3600,
  0,
  'CET',
      ],
      [
  61292844000, #    utc_start 1943-04-17 22:00:00 (Sat)
  61307362800, #      utc_end 1943-10-02 23:00:00 (Sat)
  61292851200, #  local_start 1943-04-18 00:00:00 (Sun)
  61307370000, #    local_end 1943-10-03 01:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  61307362800, #    utc_start 1943-10-02 23:00:00 (Sat)
  61324293600, #      utc_end 1944-04-15 22:00:00 (Sat)
  61307366400, #  local_start 1943-10-03 00:00:00 (Sun)
  61324297200, #    local_end 1944-04-15 23:00:00 (Sat)
  3600,
  0,
  'CET',
      ],
      [
  61324293600, #    utc_start 1944-04-15 22:00:00 (Sat)
  61338812400, #      utc_end 1944-09-30 23:00:00 (Sat)
  61324300800, #  local_start 1944-04-16 00:00:00 (Sun)
  61338819600, #    local_end 1944-10-01 01:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  61338812400, #    utc_start 1944-09-30 23:00:00 (Sat)
  61355743200, #      utc_end 1945-04-14 22:00:00 (Sat)
  61338816000, #  local_start 1944-10-01 00:00:00 (Sun)
  61355746800, #    local_end 1945-04-14 23:00:00 (Sat)
  3600,
  0,
  'CET',
      ],
      [
  61355743200, #    utc_start 1945-04-14 22:00:00 (Sat)
  61370262000, #      utc_end 1945-09-29 23:00:00 (Sat)
  61355750400, #  local_start 1945-04-15 00:00:00 (Sun)
  61370269200, #    local_end 1945-09-30 01:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  61370262000, #    utc_start 1945-09-29 23:00:00 (Sat)
  61387192800, #      utc_end 1946-04-13 22:00:00 (Sat)
  61370265600, #  local_start 1945-09-30 00:00:00 (Sun)
  61387196400, #    local_end 1946-04-13 23:00:00 (Sat)
  3600,
  0,
  'CET',
      ],
      [
  61387192800, #    utc_start 1946-04-13 22:00:00 (Sat)
  61401711600, #      utc_end 1946-09-28 23:00:00 (Sat)
  61387200000, #  local_start 1946-04-14 00:00:00 (Sun)
  61401718800, #    local_end 1946-09-29 01:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  61401711600, #    utc_start 1946-09-28 23:00:00 (Sat)
  61483356000, #      utc_end 1949-04-30 22:00:00 (Sat)
  61401715200, #  local_start 1946-09-29 00:00:00 (Sun)
  61483359600, #    local_end 1949-04-30 23:00:00 (Sat)
  3600,
  0,
  'CET',
      ],
      [
  61483356000, #    utc_start 1949-04-30 22:00:00 (Sat)
  61496665200, #      utc_end 1949-10-01 23:00:00 (Sat)
  61483363200, #  local_start 1949-05-01 00:00:00 (Sun)
  61496672400, #    local_end 1949-10-02 01:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  61496665200, #    utc_start 1949-10-01 23:00:00 (Sat)
  62270805600, #      utc_end 1974-04-13 22:00:00 (Sat)
  61496668800, #  local_start 1949-10-02 00:00:00 (Sun)
  62270809200, #    local_end 1974-04-13 23:00:00 (Sat)
  3600,
  0,
  'CET',
      ],
      [
  62270805600, #    utc_start 1974-04-13 22:00:00 (Sat)
  62285929200, #      utc_end 1974-10-05 23:00:00 (Sat)
  62270812800, #  local_start 1974-04-14 00:00:00 (Sun)
  62285936400, #    local_end 1974-10-06 01:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62285929200, #    utc_start 1974-10-05 23:00:00 (Sat)
  62302255200, #      utc_end 1975-04-12 22:00:00 (Sat)
  62285932800, #  local_start 1974-10-06 00:00:00 (Sun)
  62302258800, #    local_end 1975-04-12 23:00:00 (Sat)
  3600,
  0,
  'CET',
      ],
      [
  62302255200, #    utc_start 1975-04-12 22:00:00 (Sat)
  62317378800, #      utc_end 1975-10-04 23:00:00 (Sat)
  62302262400, #  local_start 1975-04-13 00:00:00 (Sun)
  62317386000, #    local_end 1975-10-05 01:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62317378800, #    utc_start 1975-10-04 23:00:00 (Sat)
  62332495200, #      utc_end 1976-03-27 22:00:00 (Sat)
  62317382400, #  local_start 1975-10-05 00:00:00 (Sun)
  62332498800, #    local_end 1976-03-27 23:00:00 (Sat)
  3600,
  0,
  'CET',
      ],
      [
  62332495200, #    utc_start 1976-03-27 22:00:00 (Sat)
  62348223600, #      utc_end 1976-09-25 23:00:00 (Sat)
  62332502400, #  local_start 1976-03-28 00:00:00 (Sun)
  62348230800, #    local_end 1976-09-26 01:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62348223600, #    utc_start 1976-09-25 23:00:00 (Sat)
  62364549600, #      utc_end 1977-04-02 22:00:00 (Sat)
  62348227200, #  local_start 1976-09-26 00:00:00 (Sun)
  62364553200, #    local_end 1977-04-02 23:00:00 (Sat)
  3600,
  0,
  'CET',
      ],
      [
  62364549600, #    utc_start 1977-04-02 22:00:00 (Sat)
  62379673200, #      utc_end 1977-09-24 23:00:00 (Sat)
  62364556800, #  local_start 1977-04-03 00:00:00 (Sun)
  62379680400, #    local_end 1977-09-25 01:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62379673200, #    utc_start 1977-09-24 23:00:00 (Sat)
  62396010000, #      utc_end 1978-04-02 01:00:00 (Sun)
  62379676800, #  local_start 1977-09-25 00:00:00 (Sun)
  62396013600, #    local_end 1978-04-02 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62396010000, #    utc_start 1978-04-02 01:00:00 (Sun)
  62411734800, #      utc_end 1978-10-01 01:00:00 (Sun)
  62396017200, #  local_start 1978-04-02 03:00:00 (Sun)
  62411742000, #    local_end 1978-10-01 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62411734800, #    utc_start 1978-10-01 01:00:00 (Sun)
  62419676400, #      utc_end 1978-12-31 23:00:00 (Sun)
  62411738400, #  local_start 1978-10-01 02:00:00 (Sun)
  62419680000, #    local_end 1979-01-01 00:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  62419676400, #    utc_start 1978-12-31 23:00:00 (Sun)
  62427459600, #      utc_end 1979-04-01 01:00:00 (Sun)
  62419680000, #  local_start 1979-01-01 00:00:00 (Mon)
  62427463200, #    local_end 1979-04-01 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62427459600, #    utc_start 1979-04-01 01:00:00 (Sun)
  62443184400, #      utc_end 1979-09-30 01:00:00 (Sun)
  62427466800, #  local_start 1979-04-01 03:00:00 (Sun)
  62443191600, #    local_end 1979-09-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62443184400, #    utc_start 1979-09-30 01:00:00 (Sun)
  62459514000, #      utc_end 1980-04-06 01:00:00 (Sun)
  62443188000, #  local_start 1979-09-30 02:00:00 (Sun)
  62459517600, #    local_end 1980-04-06 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62459514000, #    utc_start 1980-04-06 01:00:00 (Sun)
  62474634000, #      utc_end 1980-09-28 01:00:00 (Sun)
  62459521200, #  local_start 1980-04-06 03:00:00 (Sun)
  62474641200, #    local_end 1980-09-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62474634000, #    utc_start 1980-09-28 01:00:00 (Sun)
  62490358800, #      utc_end 1981-03-29 01:00:00 (Sun)
  62474637600, #  local_start 1980-09-28 02:00:00 (Sun)
  62490362400, #    local_end 1981-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62490358800, #    utc_start 1981-03-29 01:00:00 (Sun)
  62506083600, #      utc_end 1981-09-27 01:00:00 (Sun)
  62490366000, #  local_start 1981-03-29 03:00:00 (Sun)
  62506090800, #    local_end 1981-09-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62506083600, #    utc_start 1981-09-27 01:00:00 (Sun)
  62521808400, #      utc_end 1982-03-28 01:00:00 (Sun)
  62506087200, #  local_start 1981-09-27 02:00:00 (Sun)
  62521812000, #    local_end 1982-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62521808400, #    utc_start 1982-03-28 01:00:00 (Sun)
  62537533200, #      utc_end 1982-09-26 01:00:00 (Sun)
  62521815600, #  local_start 1982-03-28 03:00:00 (Sun)
  62537540400, #    local_end 1982-09-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62537533200, #    utc_start 1982-09-26 01:00:00 (Sun)
  62553258000, #      utc_end 1983-03-27 01:00:00 (Sun)
  62537536800, #  local_start 1982-09-26 02:00:00 (Sun)
  62553261600, #    local_end 1983-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62553258000, #    utc_start 1983-03-27 01:00:00 (Sun)
  62568982800, #      utc_end 1983-09-25 01:00:00 (Sun)
  62553265200, #  local_start 1983-03-27 03:00:00 (Sun)
  62568990000, #    local_end 1983-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62568982800, #    utc_start 1983-09-25 01:00:00 (Sun)
  62584707600, #      utc_end 1984-03-25 01:00:00 (Sun)
  62568986400, #  local_start 1983-09-25 02:00:00 (Sun)
  62584711200, #    local_end 1984-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62584707600, #    utc_start 1984-03-25 01:00:00 (Sun)
  62601037200, #      utc_end 1984-09-30 01:00:00 (Sun)
  62584714800, #  local_start 1984-03-25 03:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62601037200, #    utc_start 1984-09-30 01:00:00 (Sun)
  62616762000, #      utc_end 1985-03-31 01:00:00 (Sun)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62616762000, #    utc_start 1985-03-31 01:00:00 (Sun)
  62632486800, #      utc_end 1985-09-29 01:00:00 (Sun)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62632486800, #    utc_start 1985-09-29 01:00:00 (Sun)
  62648211600, #      utc_end 1986-03-30 01:00:00 (Sun)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62648211600, #    utc_start 1986-03-30 01:00:00 (Sun)
  62663936400, #      utc_end 1986-09-28 01:00:00 (Sun)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62663936400, #    utc_start 1986-09-28 01:00:00 (Sun)
  62679661200, #      utc_end 1987-03-29 01:00:00 (Sun)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62679661200, #    utc_start 1987-03-29 01:00:00 (Sun)
  62695386000, #      utc_end 1987-09-27 01:00:00 (Sun)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62695386000, #    utc_start 1987-09-27 01:00:00 (Sun)
  62711110800, #      utc_end 1988-03-27 01:00:00 (Sun)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62711110800, #    utc_start 1988-03-27 01:00:00 (Sun)
  62726835600, #      utc_end 1988-09-25 01:00:00 (Sun)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62726835600, #    utc_start 1988-09-25 01:00:00 (Sun)
  62742560400, #      utc_end 1989-03-26 01:00:00 (Sun)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62742560400, #    utc_start 1989-03-26 01:00:00 (Sun)
  62758285200, #      utc_end 1989-09-24 01:00:00 (Sun)
  62742567600, #  local_start 1989-03-26 03:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62758285200, #    utc_start 1989-09-24 01:00:00 (Sun)
  62774010000, #      utc_end 1990-03-25 01:00:00 (Sun)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62774010000, #    utc_start 1990-03-25 01:00:00 (Sun)
  62790339600, #      utc_end 1990-09-30 01:00:00 (Sun)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62790339600, #    utc_start 1990-09-30 01:00:00 (Sun)
  62806064400, #      utc_end 1991-03-31 01:00:00 (Sun)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62806064400, #    utc_start 1991-03-31 01:00:00 (Sun)
  62821789200, #      utc_end 1991-09-29 01:00:00 (Sun)
  62806071600, #  local_start 1991-03-31 03:00:00 (Sun)
  62821796400, #    local_end 1991-09-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62821789200, #    utc_start 1991-09-29 01:00:00 (Sun)
  62837514000, #      utc_end 1992-03-29 01:00:00 (Sun)
  62821792800, #  local_start 1991-09-29 02:00:00 (Sun)
  62837517600, #    local_end 1992-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62837514000, #    utc_start 1992-03-29 01:00:00 (Sun)
  62853238800, #      utc_end 1992-09-27 01:00:00 (Sun)
  62837521200, #  local_start 1992-03-29 03:00:00 (Sun)
  62853246000, #    local_end 1992-09-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62853238800, #    utc_start 1992-09-27 01:00:00 (Sun)
  62868963600, #      utc_end 1993-03-28 01:00:00 (Sun)
  62853242400, #  local_start 1992-09-27 02:00:00 (Sun)
  62868967200, #    local_end 1993-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62868963600, #    utc_start 1993-03-28 01:00:00 (Sun)
  62884688400, #      utc_end 1993-09-26 01:00:00 (Sun)
  62868970800, #  local_start 1993-03-28 03:00:00 (Sun)
  62884695600, #    local_end 1993-09-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62884688400, #    utc_start 1993-09-26 01:00:00 (Sun)
  62900413200, #      utc_end 1994-03-27 01:00:00 (Sun)
  62884692000, #  local_start 1993-09-26 02:00:00 (Sun)
  62900416800, #    local_end 1994-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62900413200, #    utc_start 1994-03-27 01:00:00 (Sun)
  62916138000, #      utc_end 1994-09-25 01:00:00 (Sun)
  62900420400, #  local_start 1994-03-27 03:00:00 (Sun)
  62916145200, #    local_end 1994-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62916138000, #    utc_start 1994-09-25 01:00:00 (Sun)
  62931862800, #      utc_end 1995-03-26 01:00:00 (Sun)
  62916141600, #  local_start 1994-09-25 02:00:00 (Sun)
  62931866400, #    local_end 1995-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62931862800, #    utc_start 1995-03-26 01:00:00 (Sun)
  62947587600, #      utc_end 1995-09-24 01:00:00 (Sun)
  62931870000, #  local_start 1995-03-26 03:00:00 (Sun)
  62947594800, #    local_end 1995-09-24 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62947587600, #    utc_start 1995-09-24 01:00:00 (Sun)
  62963917200, #      utc_end 1996-03-31 01:00:00 (Sun)
  62947591200, #  local_start 1995-09-24 02:00:00 (Sun)
  62963920800, #    local_end 1996-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62963917200, #    utc_start 1996-03-31 01:00:00 (Sun)
  62982061200, #      utc_end 1996-10-27 01:00:00 (Sun)
  62963924400, #  local_start 1996-03-31 03:00:00 (Sun)
  62982068400, #    local_end 1996-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62982061200, #    utc_start 1996-10-27 01:00:00 (Sun)
  62995366800, #      utc_end 1997-03-30 01:00:00 (Sun)
  62982064800, #  local_start 1996-10-27 02:00:00 (Sun)
  62995370400, #    local_end 1997-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62995366800, #    utc_start 1997-03-30 01:00:00 (Sun)
  63013510800, #      utc_end 1997-10-26 01:00:00 (Sun)
  62995374000, #  local_start 1997-03-30 03:00:00 (Sun)
  63013518000, #    local_end 1997-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63013510800, #    utc_start 1997-10-26 01:00:00 (Sun)
  63026816400, #      utc_end 1998-03-29 01:00:00 (Sun)
  63013514400, #  local_start 1997-10-26 02:00:00 (Sun)
  63026820000, #    local_end 1998-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63026816400, #    utc_start 1998-03-29 01:00:00 (Sun)
  63044960400, #      utc_end 1998-10-25 01:00:00 (Sun)
  63026823600, #  local_start 1998-03-29 03:00:00 (Sun)
  63044967600, #    local_end 1998-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63044960400, #    utc_start 1998-10-25 01:00:00 (Sun)
  63058266000, #      utc_end 1999-03-28 01:00:00 (Sun)
  63044964000, #  local_start 1998-10-25 02:00:00 (Sun)
  63058269600, #    local_end 1999-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63058266000, #    utc_start 1999-03-28 01:00:00 (Sun)
  63077014800, #      utc_end 1999-10-31 01:00:00 (Sun)
  63058273200, #  local_start 1999-03-28 03:00:00 (Sun)
  63077022000, #    local_end 1999-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63077014800, #    utc_start 1999-10-31 01:00:00 (Sun)
  63089715600, #      utc_end 2000-03-26 01:00:00 (Sun)
  63077018400, #  local_start 1999-10-31 02:00:00 (Sun)
  63089719200, #    local_end 2000-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63089715600, #    utc_start 2000-03-26 01:00:00 (Sun)
  63108464400, #      utc_end 2000-10-29 01:00:00 (Sun)
  63089722800, #  local_start 2000-03-26 03:00:00 (Sun)
  63108471600, #    local_end 2000-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63108464400, #    utc_start 2000-10-29 01:00:00 (Sun)
  63121165200, #      utc_end 2001-03-25 01:00:00 (Sun)
  63108468000, #  local_start 2000-10-29 02:00:00 (Sun)
  63121168800, #    local_end 2001-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63121165200, #    utc_start 2001-03-25 01:00:00 (Sun)
  63139914000, #      utc_end 2001-10-28 01:00:00 (Sun)
  63121172400, #  local_start 2001-03-25 03:00:00 (Sun)
  63139921200, #    local_end 2001-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63139914000, #    utc_start 2001-10-28 01:00:00 (Sun)
  63153219600, #      utc_end 2002-03-31 01:00:00 (Sun)
  63139917600, #  local_start 2001-10-28 02:00:00 (Sun)
  63153223200, #    local_end 2002-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63153219600, #    utc_start 2002-03-31 01:00:00 (Sun)
  63171363600, #      utc_end 2002-10-27 01:00:00 (Sun)
  63153226800, #  local_start 2002-03-31 03:00:00 (Sun)
  63171370800, #    local_end 2002-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63171363600, #    utc_start 2002-10-27 01:00:00 (Sun)
  63184669200, #      utc_end 2003-03-30 01:00:00 (Sun)
  63171367200, #  local_start 2002-10-27 02:00:00 (Sun)
  63184672800, #    local_end 2003-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63184669200, #    utc_start 2003-03-30 01:00:00 (Sun)
  63202813200, #      utc_end 2003-10-26 01:00:00 (Sun)
  63184676400, #  local_start 2003-03-30 03:00:00 (Sun)
  63202820400, #    local_end 2003-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63202813200, #    utc_start 2003-10-26 01:00:00 (Sun)
  63216118800, #      utc_end 2004-03-28 01:00:00 (Sun)
  63202816800, #  local_start 2003-10-26 02:00:00 (Sun)
  63216122400, #    local_end 2004-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63216118800, #    utc_start 2004-03-28 01:00:00 (Sun)
  63234867600, #      utc_end 2004-10-31 01:00:00 (Sun)
  63216126000, #  local_start 2004-03-28 03:00:00 (Sun)
  63234874800, #    local_end 2004-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63234867600, #    utc_start 2004-10-31 01:00:00 (Sun)
  63247568400, #      utc_end 2005-03-27 01:00:00 (Sun)
  63234871200, #  local_start 2004-10-31 02:00:00 (Sun)
  63247572000, #    local_end 2005-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63247568400, #    utc_start 2005-03-27 01:00:00 (Sun)
  63266317200, #      utc_end 2005-10-30 01:00:00 (Sun)
  63247575600, #  local_start 2005-03-27 03:00:00 (Sun)
  63266324400, #    local_end 2005-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63266317200, #    utc_start 2005-10-30 01:00:00 (Sun)
  63279018000, #      utc_end 2006-03-26 01:00:00 (Sun)
  63266320800, #  local_start 2005-10-30 02:00:00 (Sun)
  63279021600, #    local_end 2006-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63279018000, #    utc_start 2006-03-26 01:00:00 (Sun)
  63297766800, #      utc_end 2006-10-29 01:00:00 (Sun)
  63279025200, #  local_start 2006-03-26 03:00:00 (Sun)
  63297774000, #    local_end 2006-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63297766800, #    utc_start 2006-10-29 01:00:00 (Sun)
  63310467600, #      utc_end 2007-03-25 01:00:00 (Sun)
  63297770400, #  local_start 2006-10-29 02:00:00 (Sun)
  63310471200, #    local_end 2007-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63310467600, #    utc_start 2007-03-25 01:00:00 (Sun)
  63329216400, #      utc_end 2007-10-28 01:00:00 (Sun)
  63310474800, #  local_start 2007-03-25 03:00:00 (Sun)
  63329223600, #    local_end 2007-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63329216400, #    utc_start 2007-10-28 01:00:00 (Sun)
  63342522000, #      utc_end 2008-03-30 01:00:00 (Sun)
  63329220000, #  local_start 2007-10-28 02:00:00 (Sun)
  63342525600, #    local_end 2008-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63342522000, #    utc_start 2008-03-30 01:00:00 (Sun)
  63360666000, #      utc_end 2008-10-26 01:00:00 (Sun)
  63342529200, #  local_start 2008-03-30 03:00:00 (Sun)
  63360673200, #    local_end 2008-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63360666000, #    utc_start 2008-10-26 01:00:00 (Sun)
  63373971600, #      utc_end 2009-03-29 01:00:00 (Sun)
  63360669600, #  local_start 2008-10-26 02:00:00 (Sun)
  63373975200, #    local_end 2009-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63373971600, #    utc_start 2009-03-29 01:00:00 (Sun)
  63392115600, #      utc_end 2009-10-25 01:00:00 (Sun)
  63373978800, #  local_start 2009-03-29 03:00:00 (Sun)
  63392122800, #    local_end 2009-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63392115600, #    utc_start 2009-10-25 01:00:00 (Sun)
  63405421200, #      utc_end 2010-03-28 01:00:00 (Sun)
  63392119200, #  local_start 2009-10-25 02:00:00 (Sun)
  63405424800, #    local_end 2010-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63405421200, #    utc_start 2010-03-28 01:00:00 (Sun)
  63424170000, #      utc_end 2010-10-31 01:00:00 (Sun)
  63405428400, #  local_start 2010-03-28 03:00:00 (Sun)
  63424177200, #    local_end 2010-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63424170000, #    utc_start 2010-10-31 01:00:00 (Sun)
  63436870800, #      utc_end 2011-03-27 01:00:00 (Sun)
  63424173600, #  local_start 2010-10-31 02:00:00 (Sun)
  63436874400, #    local_end 2011-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63436870800, #    utc_start 2011-03-27 01:00:00 (Sun)
  63455619600, #      utc_end 2011-10-30 01:00:00 (Sun)
  63436878000, #  local_start 2011-03-27 03:00:00 (Sun)
  63455626800, #    local_end 2011-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63455619600, #    utc_start 2011-10-30 01:00:00 (Sun)
  63468320400, #      utc_end 2012-03-25 01:00:00 (Sun)
  63455623200, #  local_start 2011-10-30 02:00:00 (Sun)
  63468324000, #    local_end 2012-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63468320400, #    utc_start 2012-03-25 01:00:00 (Sun)
  63487069200, #      utc_end 2012-10-28 01:00:00 (Sun)
  63468327600, #  local_start 2012-03-25 03:00:00 (Sun)
  63487076400, #    local_end 2012-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63487069200, #    utc_start 2012-10-28 01:00:00 (Sun)
  63500374800, #      utc_end 2013-03-31 01:00:00 (Sun)
  63487072800, #  local_start 2012-10-28 02:00:00 (Sun)
  63500378400, #    local_end 2013-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63500374800, #    utc_start 2013-03-31 01:00:00 (Sun)
  63518518800, #      utc_end 2013-10-27 01:00:00 (Sun)
  63500382000, #  local_start 2013-03-31 03:00:00 (Sun)
  63518526000, #    local_end 2013-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63518518800, #    utc_start 2013-10-27 01:00:00 (Sun)
  63531824400, #      utc_end 2014-03-30 01:00:00 (Sun)
  63518522400, #  local_start 2013-10-27 02:00:00 (Sun)
  63531828000, #    local_end 2014-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63531824400, #    utc_start 2014-03-30 01:00:00 (Sun)
  63549968400, #      utc_end 2014-10-26 01:00:00 (Sun)
  63531831600, #  local_start 2014-03-30 03:00:00 (Sun)
  63549975600, #    local_end 2014-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63549968400, #    utc_start 2014-10-26 01:00:00 (Sun)
  63563274000, #      utc_end 2015-03-29 01:00:00 (Sun)
  63549972000, #  local_start 2014-10-26 02:00:00 (Sun)
  63563277600, #    local_end 2015-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63563274000, #    utc_start 2015-03-29 01:00:00 (Sun)
  63581418000, #      utc_end 2015-10-25 01:00:00 (Sun)
  63563281200, #  local_start 2015-03-29 03:00:00 (Sun)
  63581425200, #    local_end 2015-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63581418000, #    utc_start 2015-10-25 01:00:00 (Sun)
  63594723600, #      utc_end 2016-03-27 01:00:00 (Sun)
  63581421600, #  local_start 2015-10-25 02:00:00 (Sun)
  63594727200, #    local_end 2016-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63594723600, #    utc_start 2016-03-27 01:00:00 (Sun)
  63613472400, #      utc_end 2016-10-30 01:00:00 (Sun)
  63594730800, #  local_start 2016-03-27 03:00:00 (Sun)
  63613479600, #    local_end 2016-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63613472400, #    utc_start 2016-10-30 01:00:00 (Sun)
  63626173200, #      utc_end 2017-03-26 01:00:00 (Sun)
  63613476000, #  local_start 2016-10-30 02:00:00 (Sun)
  63626176800, #    local_end 2017-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63626173200, #    utc_start 2017-03-26 01:00:00 (Sun)
  63644922000, #      utc_end 2017-10-29 01:00:00 (Sun)
  63626180400, #  local_start 2017-03-26 03:00:00 (Sun)
  63644929200, #    local_end 2017-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63644922000, #    utc_start 2017-10-29 01:00:00 (Sun)
  63657622800, #      utc_end 2018-03-25 01:00:00 (Sun)
  63644925600, #  local_start 2017-10-29 02:00:00 (Sun)
  63657626400, #    local_end 2018-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63657622800, #    utc_start 2018-03-25 01:00:00 (Sun)
  63676371600, #      utc_end 2018-10-28 01:00:00 (Sun)
  63657630000, #  local_start 2018-03-25 03:00:00 (Sun)
  63676378800, #    local_end 2018-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63676371600, #    utc_start 2018-10-28 01:00:00 (Sun)
  63689677200, #      utc_end 2019-03-31 01:00:00 (Sun)
  63676375200, #  local_start 2018-10-28 02:00:00 (Sun)
  63689680800, #    local_end 2019-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63689677200, #    utc_start 2019-03-31 01:00:00 (Sun)
  63707821200, #      utc_end 2019-10-27 01:00:00 (Sun)
  63689684400, #  local_start 2019-03-31 03:00:00 (Sun)
  63707828400, #    local_end 2019-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63707821200, #    utc_start 2019-10-27 01:00:00 (Sun)
  63721126800, #      utc_end 2020-03-29 01:00:00 (Sun)
  63707824800, #  local_start 2019-10-27 02:00:00 (Sun)
  63721130400, #    local_end 2020-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63721126800, #    utc_start 2020-03-29 01:00:00 (Sun)
  63739270800, #      utc_end 2020-10-25 01:00:00 (Sun)
  63721134000, #  local_start 2020-03-29 03:00:00 (Sun)
  63739278000, #    local_end 2020-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63739270800, #    utc_start 2020-10-25 01:00:00 (Sun)
  63752576400, #      utc_end 2021-03-28 01:00:00 (Sun)
  63739274400, #  local_start 2020-10-25 02:00:00 (Sun)
  63752580000, #    local_end 2021-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63752576400, #    utc_start 2021-03-28 01:00:00 (Sun)
  63771325200, #      utc_end 2021-10-31 01:00:00 (Sun)
  63752583600, #  local_start 2021-03-28 03:00:00 (Sun)
  63771332400, #    local_end 2021-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63771325200, #    utc_start 2021-10-31 01:00:00 (Sun)
  63784026000, #      utc_end 2022-03-27 01:00:00 (Sun)
  63771328800, #  local_start 2021-10-31 02:00:00 (Sun)
  63784029600, #    local_end 2022-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63784026000, #    utc_start 2022-03-27 01:00:00 (Sun)
  63802774800, #      utc_end 2022-10-30 01:00:00 (Sun)
  63784033200, #  local_start 2022-03-27 03:00:00 (Sun)
  63802782000, #    local_end 2022-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63802774800, #    utc_start 2022-10-30 01:00:00 (Sun)
  63815475600, #      utc_end 2023-03-26 01:00:00 (Sun)
  63802778400, #  local_start 2022-10-30 02:00:00 (Sun)
  63815479200, #    local_end 2023-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63815475600, #    utc_start 2023-03-26 01:00:00 (Sun)
  63834224400, #      utc_end 2023-10-29 01:00:00 (Sun)
  63815482800, #  local_start 2023-03-26 03:00:00 (Sun)
  63834231600, #    local_end 2023-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63834224400, #    utc_start 2023-10-29 01:00:00 (Sun)
  63847530000, #      utc_end 2024-03-31 01:00:00 (Sun)
  63834228000, #  local_start 2023-10-29 02:00:00 (Sun)
  63847533600, #    local_end 2024-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63847530000, #    utc_start 2024-03-31 01:00:00 (Sun)
  63865674000, #      utc_end 2024-10-27 01:00:00 (Sun)
  63847537200, #  local_start 2024-03-31 03:00:00 (Sun)
  63865681200, #    local_end 2024-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63865674000, #    utc_start 2024-10-27 01:00:00 (Sun)
  63878979600, #      utc_end 2025-03-30 01:00:00 (Sun)
  63865677600, #  local_start 2024-10-27 02:00:00 (Sun)
  63878983200, #    local_end 2025-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63878979600, #    utc_start 2025-03-30 01:00:00 (Sun)
  63897123600, #      utc_end 2025-10-26 01:00:00 (Sun)
  63878986800, #  local_start 2025-03-30 03:00:00 (Sun)
  63897130800, #    local_end 2025-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63897123600, #    utc_start 2025-10-26 01:00:00 (Sun)
  63910429200, #      utc_end 2026-03-29 01:00:00 (Sun)
  63897127200, #  local_start 2025-10-26 02:00:00 (Sun)
  63910432800, #    local_end 2026-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63910429200, #    utc_start 2026-03-29 01:00:00 (Sun)
  63928573200, #      utc_end 2026-10-25 01:00:00 (Sun)
  63910436400, #  local_start 2026-03-29 03:00:00 (Sun)
  63928580400, #    local_end 2026-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63928573200, #    utc_start 2026-10-25 01:00:00 (Sun)
  63941878800, #      utc_end 2027-03-28 01:00:00 (Sun)
  63928576800, #  local_start 2026-10-25 02:00:00 (Sun)
  63941882400, #    local_end 2027-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63941878800, #    utc_start 2027-03-28 01:00:00 (Sun)
  63960627600, #      utc_end 2027-10-31 01:00:00 (Sun)
  63941886000, #  local_start 2027-03-28 03:00:00 (Sun)
  63960634800, #    local_end 2027-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63960627600, #    utc_start 2027-10-31 01:00:00 (Sun)
  63973328400, #      utc_end 2028-03-26 01:00:00 (Sun)
  63960631200, #  local_start 2027-10-31 02:00:00 (Sun)
  63973332000, #    local_end 2028-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63973328400, #    utc_start 2028-03-26 01:00:00 (Sun)
  63992077200, #      utc_end 2028-10-29 01:00:00 (Sun)
  63973335600, #  local_start 2028-03-26 03:00:00 (Sun)
  63992084400, #    local_end 2028-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63992077200, #    utc_start 2028-10-29 01:00:00 (Sun)
  64004778000, #      utc_end 2029-03-25 01:00:00 (Sun)
  63992080800, #  local_start 2028-10-29 02:00:00 (Sun)
  64004781600, #    local_end 2029-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  64004778000, #    utc_start 2029-03-25 01:00:00 (Sun)
  64023526800, #      utc_end 2029-10-28 01:00:00 (Sun)
  64004785200, #  local_start 2029-03-25 03:00:00 (Sun)
  64023534000, #    local_end 2029-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  64023526800, #    utc_start 2029-10-28 01:00:00 (Sun)
  64036832400, #      utc_end 2030-03-31 01:00:00 (Sun)
  64023530400, #  local_start 2029-10-28 02:00:00 (Sun)
  64036836000, #    local_end 2030-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  64036832400, #    utc_start 2030-03-31 01:00:00 (Sun)
  64054976400, #      utc_end 2030-10-27 01:00:00 (Sun)
  64036839600, #  local_start 2030-03-31 03:00:00 (Sun)
  64054983600, #    local_end 2030-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {74}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { 3600 }
  
  my $last_observance = bless( {
    'format' => 'CE%sT',
    'gmtoff' => '1:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 722450,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 722450,
      'utc_rd_secs' => 0,
      'utc_year' => 1980
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => 3600,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 722449,
      'local_rd_secs' => 82800,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 722449,
      'utc_rd_secs' => 82800,
      'utc_year' => 1979
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '1:00u',
      'from' => '1981',
      'in' => 'Mar',
      'letter' => 'S',
      'name' => 'EU',
      'offset_from_std' => 3600,
      'on' => 'lastSun',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '1:00u',
      'from' => '1996',
      'in' => 'Oct',
      'letter' => '',
      'name' => 'EU',
      'offset_from_std' => 0,
      'on' => 'lastSun',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_EUROPE_MADRID

    $main::fatpacked{"DateTime/TimeZone/Europe/Malta.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_EUROPE_MALTA';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Europe::Malta;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Europe::Malta::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59732204516, #      utc_end 1893-11-01 23:01:56 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59732208000, #    local_end 1893-11-02 00:00:00 (Thu)
  3484,
  0,
  'LMT',
      ],
      [
  59732204516, #    utc_start 1893-11-01 23:01:56 (Wed)
  60444918000, #      utc_end 1916-06-03 23:00:00 (Sat)
  59732208116, #  local_start 1893-11-02 00:01:56 (Thu)
  60444921600, #    local_end 1916-06-04 00:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  60444918000, #    utc_start 1916-06-03 23:00:00 (Sat)
  60455196000, #      utc_end 1916-09-30 22:00:00 (Sat)
  60444925200, #  local_start 1916-06-04 01:00:00 (Sun)
  60455203200, #    local_end 1916-10-01 00:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  60455196000, #    utc_start 1916-09-30 22:00:00 (Sat)
  60470924400, #      utc_end 1917-03-31 23:00:00 (Sat)
  60455199600, #  local_start 1916-09-30 23:00:00 (Sat)
  60470928000, #    local_end 1917-04-01 00:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  60470924400, #    utc_start 1917-03-31 23:00:00 (Sat)
  60486732000, #      utc_end 1917-09-30 22:00:00 (Sun)
  60470931600, #  local_start 1917-04-01 01:00:00 (Sun)
  60486739200, #    local_end 1917-10-01 00:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  60486732000, #    utc_start 1917-09-30 22:00:00 (Sun)
  60500559600, #      utc_end 1918-03-09 23:00:00 (Sat)
  60486735600, #  local_start 1917-09-30 23:00:00 (Sun)
  60500563200, #    local_end 1918-03-10 00:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  60500559600, #    utc_start 1918-03-09 23:00:00 (Sat)
  60518786400, #      utc_end 1918-10-06 22:00:00 (Sun)
  60500566800, #  local_start 1918-03-10 01:00:00 (Sun)
  60518793600, #    local_end 1918-10-07 00:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  60518786400, #    utc_start 1918-10-06 22:00:00 (Sun)
  60531404400, #      utc_end 1919-03-01 23:00:00 (Sat)
  60518790000, #  local_start 1918-10-06 23:00:00 (Sun)
  60531408000, #    local_end 1919-03-02 00:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  60531404400, #    utc_start 1919-03-01 23:00:00 (Sat)
  60550149600, #      utc_end 1919-10-04 22:00:00 (Sat)
  60531411600, #  local_start 1919-03-02 01:00:00 (Sun)
  60550156800, #    local_end 1919-10-05 00:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  60550149600, #    utc_start 1919-10-04 22:00:00 (Sat)
  60564668400, #      utc_end 1920-03-20 23:00:00 (Sat)
  60550153200, #  local_start 1919-10-04 23:00:00 (Sat)
  60564672000, #    local_end 1920-03-21 00:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  60564668400, #    utc_start 1920-03-20 23:00:00 (Sat)
  60580389600, #      utc_end 1920-09-18 22:00:00 (Sat)
  60564675600, #  local_start 1920-03-21 01:00:00 (Sun)
  60580396800, #    local_end 1920-09-19 00:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  60580389600, #    utc_start 1920-09-18 22:00:00 (Sat)
  61203250800, #      utc_end 1940-06-14 23:00:00 (Fri)
  60580393200, #  local_start 1920-09-18 23:00:00 (Sat)
  61203254400, #    local_end 1940-06-15 00:00:00 (Sat)
  3600,
  0,
  'CET',
      ],
      [
  61203250800, #    utc_start 1940-06-14 23:00:00 (Fri)
  61278426000, #      utc_end 1942-11-02 01:00:00 (Mon)
  61203258000, #  local_start 1940-06-15 01:00:00 (Sat)
  61278433200, #    local_end 1942-11-02 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61278426000, #    utc_start 1942-11-02 01:00:00 (Mon)
  61291126800, #      utc_end 1943-03-29 01:00:00 (Mon)
  61278429600, #  local_start 1942-11-02 02:00:00 (Mon)
  61291130400, #    local_end 1943-03-29 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61291126800, #    utc_start 1943-03-29 01:00:00 (Mon)
  61307456400, #      utc_end 1943-10-04 01:00:00 (Mon)
  61291134000, #  local_start 1943-03-29 03:00:00 (Mon)
  61307463600, #    local_end 1943-10-04 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61307456400, #    utc_start 1943-10-04 01:00:00 (Mon)
  61323094800, #      utc_end 1944-04-02 01:00:00 (Sun)
  61307460000, #  local_start 1943-10-04 02:00:00 (Mon)
  61323098400, #    local_end 1944-04-02 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  61323094800, #    utc_start 1944-04-02 01:00:00 (Sun)
  61337610000, #      utc_end 1944-09-17 01:00:00 (Sun)
  61323102000, #  local_start 1944-04-02 03:00:00 (Sun)
  61337617200, #    local_end 1944-09-17 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  61337610000, #    utc_start 1944-09-17 01:00:00 (Sun)
  61354630800, #      utc_end 1945-04-02 01:00:00 (Mon)
  61337613600, #  local_start 1944-09-17 02:00:00 (Sun)
  61354634400, #    local_end 1945-04-02 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61354630800, #    utc_start 1945-04-02 01:00:00 (Mon)
  61368966000, #      utc_end 1945-09-14 23:00:00 (Fri)
  61354638000, #  local_start 1945-04-02 03:00:00 (Mon)
  61368973200, #    local_end 1945-09-15 01:00:00 (Sat)
  7200,
  1,
  'CEST',
      ],
      [
  61368966000, #    utc_start 1945-09-14 23:00:00 (Fri)
  61384784400, #      utc_end 1946-03-17 01:00:00 (Sun)
  61368969600, #  local_start 1945-09-15 00:00:00 (Sat)
  61384788000, #    local_end 1946-03-17 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  61384784400, #    utc_start 1946-03-17 01:00:00 (Sun)
  61402323600, #      utc_end 1946-10-06 01:00:00 (Sun)
  61384791600, #  local_start 1946-03-17 03:00:00 (Sun)
  61402330800, #    local_end 1946-10-06 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  61402323600, #    utc_start 1946-10-06 01:00:00 (Sun)
  61416226800, #      utc_end 1947-03-15 23:00:00 (Sat)
  61402327200, #  local_start 1946-10-06 02:00:00 (Sun)
  61416230400, #    local_end 1947-03-16 00:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  61416226800, #    utc_start 1947-03-15 23:00:00 (Sat)
  61433766000, #      utc_end 1947-10-04 23:00:00 (Sat)
  61416234000, #  local_start 1947-03-16 01:00:00 (Sun)
  61433773200, #    local_end 1947-10-05 01:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  61433766000, #    utc_start 1947-10-04 23:00:00 (Sat)
  61446474000, #      utc_end 1948-02-29 01:00:00 (Sun)
  61433769600, #  local_start 1947-10-05 00:00:00 (Sun)
  61446477600, #    local_end 1948-02-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  61446474000, #    utc_start 1948-02-29 01:00:00 (Sun)
  61465222800, #      utc_end 1948-10-03 01:00:00 (Sun)
  61446481200, #  local_start 1948-02-29 03:00:00 (Sun)
  61465230000, #    local_end 1948-10-03 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  61465222800, #    utc_start 1948-10-03 01:00:00 (Sun)
  62021631600, #      utc_end 1966-05-21 23:00:00 (Sat)
  61465226400, #  local_start 1948-10-03 02:00:00 (Sun)
  62021635200, #    local_end 1966-05-22 00:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62021631600, #    utc_start 1966-05-21 23:00:00 (Sat)
  62032514400, #      utc_end 1966-09-24 22:00:00 (Sat)
  62021638800, #  local_start 1966-05-22 01:00:00 (Sun)
  62032521600, #    local_end 1966-09-25 00:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62032514400, #    utc_start 1966-09-24 22:00:00 (Sat)
  62053686000, #      utc_end 1967-05-27 23:00:00 (Sat)
  62032518000, #  local_start 1966-09-24 23:00:00 (Sat)
  62053689600, #    local_end 1967-05-28 00:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62053686000, #    utc_start 1967-05-27 23:00:00 (Sat)
  62063967600, #      utc_end 1967-09-23 23:00:00 (Sat)
  62053693200, #  local_start 1967-05-28 01:00:00 (Sun)
  62063974800, #    local_end 1967-09-24 01:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62063967600, #    utc_start 1967-09-23 23:00:00 (Sat)
  62085135600, #      utc_end 1968-05-25 23:00:00 (Sat)
  62063971200, #  local_start 1967-09-24 00:00:00 (Sun)
  62085139200, #    local_end 1968-05-26 00:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62085135600, #    utc_start 1968-05-25 23:00:00 (Sat)
  62095417200, #      utc_end 1968-09-21 23:00:00 (Sat)
  62085142800, #  local_start 1968-05-26 01:00:00 (Sun)
  62095424400, #    local_end 1968-09-22 01:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62095417200, #    utc_start 1968-09-21 23:00:00 (Sat)
  62117190000, #      utc_end 1969-05-31 23:00:00 (Sat)
  62095420800, #  local_start 1968-09-22 00:00:00 (Sun)
  62117193600, #    local_end 1969-06-01 00:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62117190000, #    utc_start 1969-05-31 23:00:00 (Sat)
  62127471600, #      utc_end 1969-09-27 23:00:00 (Sat)
  62117197200, #  local_start 1969-06-01 01:00:00 (Sun)
  62127478800, #    local_end 1969-09-28 01:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62127471600, #    utc_start 1969-09-27 23:00:00 (Sat)
  62148639600, #      utc_end 1970-05-30 23:00:00 (Sat)
  62127475200, #  local_start 1969-09-28 00:00:00 (Sun)
  62148643200, #    local_end 1970-05-31 00:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62148639600, #    utc_start 1970-05-30 23:00:00 (Sat)
  62158921200, #      utc_end 1970-09-26 23:00:00 (Sat)
  62148646800, #  local_start 1970-05-31 01:00:00 (Sun)
  62158928400, #    local_end 1970-09-27 01:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62158921200, #    utc_start 1970-09-26 23:00:00 (Sat)
  62179484400, #      utc_end 1971-05-22 23:00:00 (Sat)
  62158924800, #  local_start 1970-09-27 00:00:00 (Sun)
  62179488000, #    local_end 1971-05-23 00:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62179484400, #    utc_start 1971-05-22 23:00:00 (Sat)
  62190370800, #      utc_end 1971-09-25 23:00:00 (Sat)
  62179491600, #  local_start 1971-05-23 01:00:00 (Sun)
  62190378000, #    local_end 1971-09-26 01:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62190370800, #    utc_start 1971-09-25 23:00:00 (Sat)
  62211538800, #      utc_end 1972-05-27 23:00:00 (Sat)
  62190374400, #  local_start 1971-09-26 00:00:00 (Sun)
  62211542400, #    local_end 1972-05-28 00:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62211538800, #    utc_start 1972-05-27 23:00:00 (Sat)
  62222425200, #      utc_end 1972-09-30 23:00:00 (Sat)
  62211546000, #  local_start 1972-05-28 01:00:00 (Sun)
  62222432400, #    local_end 1972-10-01 01:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62222425200, #    utc_start 1972-09-30 23:00:00 (Sat)
  62238063600, #      utc_end 1973-03-30 23:00:00 (Fri)
  62222428800, #  local_start 1972-10-01 00:00:00 (Sun)
  62238067200, #    local_end 1973-03-31 00:00:00 (Sat)
  3600,
  0,
  'CET',
      ],
      [
  62238063600, #    utc_start 1973-03-30 23:00:00 (Fri)
  62253788400, #      utc_end 1973-09-28 23:00:00 (Fri)
  62238070800, #  local_start 1973-03-31 01:00:00 (Sat)
  62253795600, #    local_end 1973-09-29 01:00:00 (Sat)
  7200,
  1,
  'CEST',
      ],
      [
  62253788400, #    utc_start 1973-09-28 23:00:00 (Fri)
  62271414000, #      utc_end 1974-04-20 23:00:00 (Sat)
  62253792000, #  local_start 1973-09-29 00:00:00 (Sat)
  62271417600, #    local_end 1974-04-21 00:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62271414000, #    utc_start 1974-04-20 23:00:00 (Sat)
  62284201200, #      utc_end 1974-09-15 23:00:00 (Sun)
  62271421200, #  local_start 1974-04-21 01:00:00 (Sun)
  62284208400, #    local_end 1974-09-16 01:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  62284201200, #    utc_start 1974-09-15 23:00:00 (Sun)
  62302870800, #      utc_end 1975-04-20 01:00:00 (Sun)
  62284204800, #  local_start 1974-09-16 00:00:00 (Mon)
  62302874400, #    local_end 1975-04-20 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62302870800, #    utc_start 1975-04-20 01:00:00 (Sun)
  62316172800, #      utc_end 1975-09-21 00:00:00 (Sun)
  62302878000, #  local_start 1975-04-20 03:00:00 (Sun)
  62316180000, #    local_end 1975-09-21 02:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62316172800, #    utc_start 1975-09-21 00:00:00 (Sun)
  62334320400, #      utc_end 1976-04-18 01:00:00 (Sun)
  62316176400, #  local_start 1975-09-21 01:00:00 (Sun)
  62334324000, #    local_end 1976-04-18 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62334320400, #    utc_start 1976-04-18 01:00:00 (Sun)
  62347622400, #      utc_end 1976-09-19 00:00:00 (Sun)
  62334327600, #  local_start 1976-04-18 03:00:00 (Sun)
  62347629600, #    local_end 1976-09-19 02:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62347622400, #    utc_start 1976-09-19 00:00:00 (Sun)
  62365770000, #      utc_end 1977-04-17 01:00:00 (Sun)
  62347626000, #  local_start 1976-09-19 01:00:00 (Sun)
  62365773600, #    local_end 1977-04-17 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62365770000, #    utc_start 1977-04-17 01:00:00 (Sun)
  62379072000, #      utc_end 1977-09-18 00:00:00 (Sun)
  62365777200, #  local_start 1977-04-17 03:00:00 (Sun)
  62379079200, #    local_end 1977-09-18 02:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62379072000, #    utc_start 1977-09-18 00:00:00 (Sun)
  62397219600, #      utc_end 1978-04-16 01:00:00 (Sun)
  62379075600, #  local_start 1977-09-18 01:00:00 (Sun)
  62397223200, #    local_end 1978-04-16 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62397219600, #    utc_start 1978-04-16 01:00:00 (Sun)
  62410521600, #      utc_end 1978-09-17 00:00:00 (Sun)
  62397226800, #  local_start 1978-04-16 03:00:00 (Sun)
  62410528800, #    local_end 1978-09-17 02:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62410521600, #    utc_start 1978-09-17 00:00:00 (Sun)
  62428669200, #      utc_end 1979-04-15 01:00:00 (Sun)
  62410525200, #  local_start 1978-09-17 01:00:00 (Sun)
  62428672800, #    local_end 1979-04-15 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62428669200, #    utc_start 1979-04-15 01:00:00 (Sun)
  62441971200, #      utc_end 1979-09-16 00:00:00 (Sun)
  62428676400, #  local_start 1979-04-15 03:00:00 (Sun)
  62441978400, #    local_end 1979-09-16 02:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62441971200, #    utc_start 1979-09-16 00:00:00 (Sun)
  62458995600, #      utc_end 1980-03-31 01:00:00 (Mon)
  62441974800, #  local_start 1979-09-16 01:00:00 (Sun)
  62458999200, #    local_end 1980-03-31 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  62458995600, #    utc_start 1980-03-31 01:00:00 (Mon)
  62474025600, #      utc_end 1980-09-21 00:00:00 (Sun)
  62459002800, #  local_start 1980-03-31 03:00:00 (Mon)
  62474032800, #    local_end 1980-09-21 02:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62474025600, #    utc_start 1980-09-21 00:00:00 (Sun)
  62482834800, #      utc_end 1980-12-31 23:00:00 (Wed)
  62474029200, #  local_start 1980-09-21 01:00:00 (Sun)
  62482838400, #    local_end 1981-01-01 00:00:00 (Thu)
  3600,
  0,
  'CET',
      ],
      [
  62482834800, #    utc_start 1980-12-31 23:00:00 (Wed)
  62490358800, #      utc_end 1981-03-29 01:00:00 (Sun)
  62482838400, #  local_start 1981-01-01 00:00:00 (Thu)
  62490362400, #    local_end 1981-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62490358800, #    utc_start 1981-03-29 01:00:00 (Sun)
  62506083600, #      utc_end 1981-09-27 01:00:00 (Sun)
  62490366000, #  local_start 1981-03-29 03:00:00 (Sun)
  62506090800, #    local_end 1981-09-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62506083600, #    utc_start 1981-09-27 01:00:00 (Sun)
  62521808400, #      utc_end 1982-03-28 01:00:00 (Sun)
  62506087200, #  local_start 1981-09-27 02:00:00 (Sun)
  62521812000, #    local_end 1982-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62521808400, #    utc_start 1982-03-28 01:00:00 (Sun)
  62537533200, #      utc_end 1982-09-26 01:00:00 (Sun)
  62521815600, #  local_start 1982-03-28 03:00:00 (Sun)
  62537540400, #    local_end 1982-09-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62537533200, #    utc_start 1982-09-26 01:00:00 (Sun)
  62553258000, #      utc_end 1983-03-27 01:00:00 (Sun)
  62537536800, #  local_start 1982-09-26 02:00:00 (Sun)
  62553261600, #    local_end 1983-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62553258000, #    utc_start 1983-03-27 01:00:00 (Sun)
  62568982800, #      utc_end 1983-09-25 01:00:00 (Sun)
  62553265200, #  local_start 1983-03-27 03:00:00 (Sun)
  62568990000, #    local_end 1983-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62568982800, #    utc_start 1983-09-25 01:00:00 (Sun)
  62584707600, #      utc_end 1984-03-25 01:00:00 (Sun)
  62568986400, #  local_start 1983-09-25 02:00:00 (Sun)
  62584711200, #    local_end 1984-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62584707600, #    utc_start 1984-03-25 01:00:00 (Sun)
  62601037200, #      utc_end 1984-09-30 01:00:00 (Sun)
  62584714800, #  local_start 1984-03-25 03:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62601037200, #    utc_start 1984-09-30 01:00:00 (Sun)
  62616762000, #      utc_end 1985-03-31 01:00:00 (Sun)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62616762000, #    utc_start 1985-03-31 01:00:00 (Sun)
  62632486800, #      utc_end 1985-09-29 01:00:00 (Sun)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62632486800, #    utc_start 1985-09-29 01:00:00 (Sun)
  62648211600, #      utc_end 1986-03-30 01:00:00 (Sun)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62648211600, #    utc_start 1986-03-30 01:00:00 (Sun)
  62663936400, #      utc_end 1986-09-28 01:00:00 (Sun)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62663936400, #    utc_start 1986-09-28 01:00:00 (Sun)
  62679661200, #      utc_end 1987-03-29 01:00:00 (Sun)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62679661200, #    utc_start 1987-03-29 01:00:00 (Sun)
  62695386000, #      utc_end 1987-09-27 01:00:00 (Sun)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62695386000, #    utc_start 1987-09-27 01:00:00 (Sun)
  62711110800, #      utc_end 1988-03-27 01:00:00 (Sun)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62711110800, #    utc_start 1988-03-27 01:00:00 (Sun)
  62726835600, #      utc_end 1988-09-25 01:00:00 (Sun)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62726835600, #    utc_start 1988-09-25 01:00:00 (Sun)
  62742560400, #      utc_end 1989-03-26 01:00:00 (Sun)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62742560400, #    utc_start 1989-03-26 01:00:00 (Sun)
  62758285200, #      utc_end 1989-09-24 01:00:00 (Sun)
  62742567600, #  local_start 1989-03-26 03:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62758285200, #    utc_start 1989-09-24 01:00:00 (Sun)
  62774010000, #      utc_end 1990-03-25 01:00:00 (Sun)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62774010000, #    utc_start 1990-03-25 01:00:00 (Sun)
  62790339600, #      utc_end 1990-09-30 01:00:00 (Sun)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62790339600, #    utc_start 1990-09-30 01:00:00 (Sun)
  62806064400, #      utc_end 1991-03-31 01:00:00 (Sun)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62806064400, #    utc_start 1991-03-31 01:00:00 (Sun)
  62821789200, #      utc_end 1991-09-29 01:00:00 (Sun)
  62806071600, #  local_start 1991-03-31 03:00:00 (Sun)
  62821796400, #    local_end 1991-09-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62821789200, #    utc_start 1991-09-29 01:00:00 (Sun)
  62837514000, #      utc_end 1992-03-29 01:00:00 (Sun)
  62821792800, #  local_start 1991-09-29 02:00:00 (Sun)
  62837517600, #    local_end 1992-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62837514000, #    utc_start 1992-03-29 01:00:00 (Sun)
  62853238800, #      utc_end 1992-09-27 01:00:00 (Sun)
  62837521200, #  local_start 1992-03-29 03:00:00 (Sun)
  62853246000, #    local_end 1992-09-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62853238800, #    utc_start 1992-09-27 01:00:00 (Sun)
  62868963600, #      utc_end 1993-03-28 01:00:00 (Sun)
  62853242400, #  local_start 1992-09-27 02:00:00 (Sun)
  62868967200, #    local_end 1993-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62868963600, #    utc_start 1993-03-28 01:00:00 (Sun)
  62884688400, #      utc_end 1993-09-26 01:00:00 (Sun)
  62868970800, #  local_start 1993-03-28 03:00:00 (Sun)
  62884695600, #    local_end 1993-09-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62884688400, #    utc_start 1993-09-26 01:00:00 (Sun)
  62900413200, #      utc_end 1994-03-27 01:00:00 (Sun)
  62884692000, #  local_start 1993-09-26 02:00:00 (Sun)
  62900416800, #    local_end 1994-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62900413200, #    utc_start 1994-03-27 01:00:00 (Sun)
  62916138000, #      utc_end 1994-09-25 01:00:00 (Sun)
  62900420400, #  local_start 1994-03-27 03:00:00 (Sun)
  62916145200, #    local_end 1994-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62916138000, #    utc_start 1994-09-25 01:00:00 (Sun)
  62931862800, #      utc_end 1995-03-26 01:00:00 (Sun)
  62916141600, #  local_start 1994-09-25 02:00:00 (Sun)
  62931866400, #    local_end 1995-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62931862800, #    utc_start 1995-03-26 01:00:00 (Sun)
  62947587600, #      utc_end 1995-09-24 01:00:00 (Sun)
  62931870000, #  local_start 1995-03-26 03:00:00 (Sun)
  62947594800, #    local_end 1995-09-24 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62947587600, #    utc_start 1995-09-24 01:00:00 (Sun)
  62963917200, #      utc_end 1996-03-31 01:00:00 (Sun)
  62947591200, #  local_start 1995-09-24 02:00:00 (Sun)
  62963920800, #    local_end 1996-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62963917200, #    utc_start 1996-03-31 01:00:00 (Sun)
  62982061200, #      utc_end 1996-10-27 01:00:00 (Sun)
  62963924400, #  local_start 1996-03-31 03:00:00 (Sun)
  62982068400, #    local_end 1996-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62982061200, #    utc_start 1996-10-27 01:00:00 (Sun)
  62995366800, #      utc_end 1997-03-30 01:00:00 (Sun)
  62982064800, #  local_start 1996-10-27 02:00:00 (Sun)
  62995370400, #    local_end 1997-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62995366800, #    utc_start 1997-03-30 01:00:00 (Sun)
  63013510800, #      utc_end 1997-10-26 01:00:00 (Sun)
  62995374000, #  local_start 1997-03-30 03:00:00 (Sun)
  63013518000, #    local_end 1997-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63013510800, #    utc_start 1997-10-26 01:00:00 (Sun)
  63026816400, #      utc_end 1998-03-29 01:00:00 (Sun)
  63013514400, #  local_start 1997-10-26 02:00:00 (Sun)
  63026820000, #    local_end 1998-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63026816400, #    utc_start 1998-03-29 01:00:00 (Sun)
  63044960400, #      utc_end 1998-10-25 01:00:00 (Sun)
  63026823600, #  local_start 1998-03-29 03:00:00 (Sun)
  63044967600, #    local_end 1998-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63044960400, #    utc_start 1998-10-25 01:00:00 (Sun)
  63058266000, #      utc_end 1999-03-28 01:00:00 (Sun)
  63044964000, #  local_start 1998-10-25 02:00:00 (Sun)
  63058269600, #    local_end 1999-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63058266000, #    utc_start 1999-03-28 01:00:00 (Sun)
  63077014800, #      utc_end 1999-10-31 01:00:00 (Sun)
  63058273200, #  local_start 1999-03-28 03:00:00 (Sun)
  63077022000, #    local_end 1999-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63077014800, #    utc_start 1999-10-31 01:00:00 (Sun)
  63089715600, #      utc_end 2000-03-26 01:00:00 (Sun)
  63077018400, #  local_start 1999-10-31 02:00:00 (Sun)
  63089719200, #    local_end 2000-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63089715600, #    utc_start 2000-03-26 01:00:00 (Sun)
  63108464400, #      utc_end 2000-10-29 01:00:00 (Sun)
  63089722800, #  local_start 2000-03-26 03:00:00 (Sun)
  63108471600, #    local_end 2000-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63108464400, #    utc_start 2000-10-29 01:00:00 (Sun)
  63121165200, #      utc_end 2001-03-25 01:00:00 (Sun)
  63108468000, #  local_start 2000-10-29 02:00:00 (Sun)
  63121168800, #    local_end 2001-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63121165200, #    utc_start 2001-03-25 01:00:00 (Sun)
  63139914000, #      utc_end 2001-10-28 01:00:00 (Sun)
  63121172400, #  local_start 2001-03-25 03:00:00 (Sun)
  63139921200, #    local_end 2001-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63139914000, #    utc_start 2001-10-28 01:00:00 (Sun)
  63153219600, #      utc_end 2002-03-31 01:00:00 (Sun)
  63139917600, #  local_start 2001-10-28 02:00:00 (Sun)
  63153223200, #    local_end 2002-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63153219600, #    utc_start 2002-03-31 01:00:00 (Sun)
  63171363600, #      utc_end 2002-10-27 01:00:00 (Sun)
  63153226800, #  local_start 2002-03-31 03:00:00 (Sun)
  63171370800, #    local_end 2002-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63171363600, #    utc_start 2002-10-27 01:00:00 (Sun)
  63184669200, #      utc_end 2003-03-30 01:00:00 (Sun)
  63171367200, #  local_start 2002-10-27 02:00:00 (Sun)
  63184672800, #    local_end 2003-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63184669200, #    utc_start 2003-03-30 01:00:00 (Sun)
  63202813200, #      utc_end 2003-10-26 01:00:00 (Sun)
  63184676400, #  local_start 2003-03-30 03:00:00 (Sun)
  63202820400, #    local_end 2003-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63202813200, #    utc_start 2003-10-26 01:00:00 (Sun)
  63216118800, #      utc_end 2004-03-28 01:00:00 (Sun)
  63202816800, #  local_start 2003-10-26 02:00:00 (Sun)
  63216122400, #    local_end 2004-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63216118800, #    utc_start 2004-03-28 01:00:00 (Sun)
  63234867600, #      utc_end 2004-10-31 01:00:00 (Sun)
  63216126000, #  local_start 2004-03-28 03:00:00 (Sun)
  63234874800, #    local_end 2004-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63234867600, #    utc_start 2004-10-31 01:00:00 (Sun)
  63247568400, #      utc_end 2005-03-27 01:00:00 (Sun)
  63234871200, #  local_start 2004-10-31 02:00:00 (Sun)
  63247572000, #    local_end 2005-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63247568400, #    utc_start 2005-03-27 01:00:00 (Sun)
  63266317200, #      utc_end 2005-10-30 01:00:00 (Sun)
  63247575600, #  local_start 2005-03-27 03:00:00 (Sun)
  63266324400, #    local_end 2005-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63266317200, #    utc_start 2005-10-30 01:00:00 (Sun)
  63279018000, #      utc_end 2006-03-26 01:00:00 (Sun)
  63266320800, #  local_start 2005-10-30 02:00:00 (Sun)
  63279021600, #    local_end 2006-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63279018000, #    utc_start 2006-03-26 01:00:00 (Sun)
  63297766800, #      utc_end 2006-10-29 01:00:00 (Sun)
  63279025200, #  local_start 2006-03-26 03:00:00 (Sun)
  63297774000, #    local_end 2006-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63297766800, #    utc_start 2006-10-29 01:00:00 (Sun)
  63310467600, #      utc_end 2007-03-25 01:00:00 (Sun)
  63297770400, #  local_start 2006-10-29 02:00:00 (Sun)
  63310471200, #    local_end 2007-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63310467600, #    utc_start 2007-03-25 01:00:00 (Sun)
  63329216400, #      utc_end 2007-10-28 01:00:00 (Sun)
  63310474800, #  local_start 2007-03-25 03:00:00 (Sun)
  63329223600, #    local_end 2007-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63329216400, #    utc_start 2007-10-28 01:00:00 (Sun)
  63342522000, #      utc_end 2008-03-30 01:00:00 (Sun)
  63329220000, #  local_start 2007-10-28 02:00:00 (Sun)
  63342525600, #    local_end 2008-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63342522000, #    utc_start 2008-03-30 01:00:00 (Sun)
  63360666000, #      utc_end 2008-10-26 01:00:00 (Sun)
  63342529200, #  local_start 2008-03-30 03:00:00 (Sun)
  63360673200, #    local_end 2008-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63360666000, #    utc_start 2008-10-26 01:00:00 (Sun)
  63373971600, #      utc_end 2009-03-29 01:00:00 (Sun)
  63360669600, #  local_start 2008-10-26 02:00:00 (Sun)
  63373975200, #    local_end 2009-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63373971600, #    utc_start 2009-03-29 01:00:00 (Sun)
  63392115600, #      utc_end 2009-10-25 01:00:00 (Sun)
  63373978800, #  local_start 2009-03-29 03:00:00 (Sun)
  63392122800, #    local_end 2009-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63392115600, #    utc_start 2009-10-25 01:00:00 (Sun)
  63405421200, #      utc_end 2010-03-28 01:00:00 (Sun)
  63392119200, #  local_start 2009-10-25 02:00:00 (Sun)
  63405424800, #    local_end 2010-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63405421200, #    utc_start 2010-03-28 01:00:00 (Sun)
  63424170000, #      utc_end 2010-10-31 01:00:00 (Sun)
  63405428400, #  local_start 2010-03-28 03:00:00 (Sun)
  63424177200, #    local_end 2010-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63424170000, #    utc_start 2010-10-31 01:00:00 (Sun)
  63436870800, #      utc_end 2011-03-27 01:00:00 (Sun)
  63424173600, #  local_start 2010-10-31 02:00:00 (Sun)
  63436874400, #    local_end 2011-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63436870800, #    utc_start 2011-03-27 01:00:00 (Sun)
  63455619600, #      utc_end 2011-10-30 01:00:00 (Sun)
  63436878000, #  local_start 2011-03-27 03:00:00 (Sun)
  63455626800, #    local_end 2011-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63455619600, #    utc_start 2011-10-30 01:00:00 (Sun)
  63468320400, #      utc_end 2012-03-25 01:00:00 (Sun)
  63455623200, #  local_start 2011-10-30 02:00:00 (Sun)
  63468324000, #    local_end 2012-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63468320400, #    utc_start 2012-03-25 01:00:00 (Sun)
  63487069200, #      utc_end 2012-10-28 01:00:00 (Sun)
  63468327600, #  local_start 2012-03-25 03:00:00 (Sun)
  63487076400, #    local_end 2012-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63487069200, #    utc_start 2012-10-28 01:00:00 (Sun)
  63500374800, #      utc_end 2013-03-31 01:00:00 (Sun)
  63487072800, #  local_start 2012-10-28 02:00:00 (Sun)
  63500378400, #    local_end 2013-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63500374800, #    utc_start 2013-03-31 01:00:00 (Sun)
  63518518800, #      utc_end 2013-10-27 01:00:00 (Sun)
  63500382000, #  local_start 2013-03-31 03:00:00 (Sun)
  63518526000, #    local_end 2013-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63518518800, #    utc_start 2013-10-27 01:00:00 (Sun)
  63531824400, #      utc_end 2014-03-30 01:00:00 (Sun)
  63518522400, #  local_start 2013-10-27 02:00:00 (Sun)
  63531828000, #    local_end 2014-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63531824400, #    utc_start 2014-03-30 01:00:00 (Sun)
  63549968400, #      utc_end 2014-10-26 01:00:00 (Sun)
  63531831600, #  local_start 2014-03-30 03:00:00 (Sun)
  63549975600, #    local_end 2014-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63549968400, #    utc_start 2014-10-26 01:00:00 (Sun)
  63563274000, #      utc_end 2015-03-29 01:00:00 (Sun)
  63549972000, #  local_start 2014-10-26 02:00:00 (Sun)
  63563277600, #    local_end 2015-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63563274000, #    utc_start 2015-03-29 01:00:00 (Sun)
  63581418000, #      utc_end 2015-10-25 01:00:00 (Sun)
  63563281200, #  local_start 2015-03-29 03:00:00 (Sun)
  63581425200, #    local_end 2015-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63581418000, #    utc_start 2015-10-25 01:00:00 (Sun)
  63594723600, #      utc_end 2016-03-27 01:00:00 (Sun)
  63581421600, #  local_start 2015-10-25 02:00:00 (Sun)
  63594727200, #    local_end 2016-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63594723600, #    utc_start 2016-03-27 01:00:00 (Sun)
  63613472400, #      utc_end 2016-10-30 01:00:00 (Sun)
  63594730800, #  local_start 2016-03-27 03:00:00 (Sun)
  63613479600, #    local_end 2016-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63613472400, #    utc_start 2016-10-30 01:00:00 (Sun)
  63626173200, #      utc_end 2017-03-26 01:00:00 (Sun)
  63613476000, #  local_start 2016-10-30 02:00:00 (Sun)
  63626176800, #    local_end 2017-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63626173200, #    utc_start 2017-03-26 01:00:00 (Sun)
  63644922000, #      utc_end 2017-10-29 01:00:00 (Sun)
  63626180400, #  local_start 2017-03-26 03:00:00 (Sun)
  63644929200, #    local_end 2017-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63644922000, #    utc_start 2017-10-29 01:00:00 (Sun)
  63657622800, #      utc_end 2018-03-25 01:00:00 (Sun)
  63644925600, #  local_start 2017-10-29 02:00:00 (Sun)
  63657626400, #    local_end 2018-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63657622800, #    utc_start 2018-03-25 01:00:00 (Sun)
  63676371600, #      utc_end 2018-10-28 01:00:00 (Sun)
  63657630000, #  local_start 2018-03-25 03:00:00 (Sun)
  63676378800, #    local_end 2018-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63676371600, #    utc_start 2018-10-28 01:00:00 (Sun)
  63689677200, #      utc_end 2019-03-31 01:00:00 (Sun)
  63676375200, #  local_start 2018-10-28 02:00:00 (Sun)
  63689680800, #    local_end 2019-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63689677200, #    utc_start 2019-03-31 01:00:00 (Sun)
  63707821200, #      utc_end 2019-10-27 01:00:00 (Sun)
  63689684400, #  local_start 2019-03-31 03:00:00 (Sun)
  63707828400, #    local_end 2019-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63707821200, #    utc_start 2019-10-27 01:00:00 (Sun)
  63721126800, #      utc_end 2020-03-29 01:00:00 (Sun)
  63707824800, #  local_start 2019-10-27 02:00:00 (Sun)
  63721130400, #    local_end 2020-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63721126800, #    utc_start 2020-03-29 01:00:00 (Sun)
  63739270800, #      utc_end 2020-10-25 01:00:00 (Sun)
  63721134000, #  local_start 2020-03-29 03:00:00 (Sun)
  63739278000, #    local_end 2020-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63739270800, #    utc_start 2020-10-25 01:00:00 (Sun)
  63752576400, #      utc_end 2021-03-28 01:00:00 (Sun)
  63739274400, #  local_start 2020-10-25 02:00:00 (Sun)
  63752580000, #    local_end 2021-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63752576400, #    utc_start 2021-03-28 01:00:00 (Sun)
  63771325200, #      utc_end 2021-10-31 01:00:00 (Sun)
  63752583600, #  local_start 2021-03-28 03:00:00 (Sun)
  63771332400, #    local_end 2021-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63771325200, #    utc_start 2021-10-31 01:00:00 (Sun)
  63784026000, #      utc_end 2022-03-27 01:00:00 (Sun)
  63771328800, #  local_start 2021-10-31 02:00:00 (Sun)
  63784029600, #    local_end 2022-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63784026000, #    utc_start 2022-03-27 01:00:00 (Sun)
  63802774800, #      utc_end 2022-10-30 01:00:00 (Sun)
  63784033200, #  local_start 2022-03-27 03:00:00 (Sun)
  63802782000, #    local_end 2022-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63802774800, #    utc_start 2022-10-30 01:00:00 (Sun)
  63815475600, #      utc_end 2023-03-26 01:00:00 (Sun)
  63802778400, #  local_start 2022-10-30 02:00:00 (Sun)
  63815479200, #    local_end 2023-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63815475600, #    utc_start 2023-03-26 01:00:00 (Sun)
  63834224400, #      utc_end 2023-10-29 01:00:00 (Sun)
  63815482800, #  local_start 2023-03-26 03:00:00 (Sun)
  63834231600, #    local_end 2023-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63834224400, #    utc_start 2023-10-29 01:00:00 (Sun)
  63847530000, #      utc_end 2024-03-31 01:00:00 (Sun)
  63834228000, #  local_start 2023-10-29 02:00:00 (Sun)
  63847533600, #    local_end 2024-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63847530000, #    utc_start 2024-03-31 01:00:00 (Sun)
  63865674000, #      utc_end 2024-10-27 01:00:00 (Sun)
  63847537200, #  local_start 2024-03-31 03:00:00 (Sun)
  63865681200, #    local_end 2024-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63865674000, #    utc_start 2024-10-27 01:00:00 (Sun)
  63878979600, #      utc_end 2025-03-30 01:00:00 (Sun)
  63865677600, #  local_start 2024-10-27 02:00:00 (Sun)
  63878983200, #    local_end 2025-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63878979600, #    utc_start 2025-03-30 01:00:00 (Sun)
  63897123600, #      utc_end 2025-10-26 01:00:00 (Sun)
  63878986800, #  local_start 2025-03-30 03:00:00 (Sun)
  63897130800, #    local_end 2025-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63897123600, #    utc_start 2025-10-26 01:00:00 (Sun)
  63910429200, #      utc_end 2026-03-29 01:00:00 (Sun)
  63897127200, #  local_start 2025-10-26 02:00:00 (Sun)
  63910432800, #    local_end 2026-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63910429200, #    utc_start 2026-03-29 01:00:00 (Sun)
  63928573200, #      utc_end 2026-10-25 01:00:00 (Sun)
  63910436400, #  local_start 2026-03-29 03:00:00 (Sun)
  63928580400, #    local_end 2026-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63928573200, #    utc_start 2026-10-25 01:00:00 (Sun)
  63941878800, #      utc_end 2027-03-28 01:00:00 (Sun)
  63928576800, #  local_start 2026-10-25 02:00:00 (Sun)
  63941882400, #    local_end 2027-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63941878800, #    utc_start 2027-03-28 01:00:00 (Sun)
  63960627600, #      utc_end 2027-10-31 01:00:00 (Sun)
  63941886000, #  local_start 2027-03-28 03:00:00 (Sun)
  63960634800, #    local_end 2027-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63960627600, #    utc_start 2027-10-31 01:00:00 (Sun)
  63973328400, #      utc_end 2028-03-26 01:00:00 (Sun)
  63960631200, #  local_start 2027-10-31 02:00:00 (Sun)
  63973332000, #    local_end 2028-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63973328400, #    utc_start 2028-03-26 01:00:00 (Sun)
  63992077200, #      utc_end 2028-10-29 01:00:00 (Sun)
  63973335600, #  local_start 2028-03-26 03:00:00 (Sun)
  63992084400, #    local_end 2028-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63992077200, #    utc_start 2028-10-29 01:00:00 (Sun)
  64004778000, #      utc_end 2029-03-25 01:00:00 (Sun)
  63992080800, #  local_start 2028-10-29 02:00:00 (Sun)
  64004781600, #    local_end 2029-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  64004778000, #    utc_start 2029-03-25 01:00:00 (Sun)
  64023526800, #      utc_end 2029-10-28 01:00:00 (Sun)
  64004785200, #  local_start 2029-03-25 03:00:00 (Sun)
  64023534000, #    local_end 2029-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  64023526800, #    utc_start 2029-10-28 01:00:00 (Sun)
  64036832400, #      utc_end 2030-03-31 01:00:00 (Sun)
  64023530400, #  local_start 2029-10-28 02:00:00 (Sun)
  64036836000, #    local_end 2030-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  64036832400, #    utc_start 2030-03-31 01:00:00 (Sun)
  64054976400, #      utc_end 2030-10-27 01:00:00 (Sun)
  64036839600, #  local_start 2030-03-31 03:00:00 (Sun)
  64054983600, #    local_end 2030-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {77}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { 3600 }
  
  my $last_observance = bless( {
    'format' => 'CE%sT',
    'gmtoff' => '1:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 723181,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 723181,
      'utc_rd_secs' => 0,
      'utc_year' => 1982
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => 3600,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 723180,
      'local_rd_secs' => 82800,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 723180,
      'utc_rd_secs' => 82800,
      'utc_year' => 1981
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '1:00u',
      'from' => '1996',
      'in' => 'Oct',
      'letter' => '',
      'name' => 'EU',
      'offset_from_std' => 0,
      'on' => 'lastSun',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '1:00u',
      'from' => '1981',
      'in' => 'Mar',
      'letter' => 'S',
      'name' => 'EU',
      'offset_from_std' => 3600,
      'on' => 'lastSun',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_EUROPE_MALTA

    $main::fatpacked{"DateTime/TimeZone/Europe/Minsk.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_EUROPE_MINSK';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Europe::Minsk;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Europe::Minsk::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59295535784, #      utc_end 1879-12-31 22:09:44 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59295542400, #    local_end 1880-01-01 00:00:00 (Thu)
  6616,
  0,
  'LMT',
      ],
      [
  59295535784, #    utc_start 1879-12-31 22:09:44 (Wed)
  60694524600, #      utc_end 1924-05-01 22:10:00 (Thu)
  59295542384, #  local_start 1879-12-31 23:59:44 (Wed)
  60694531200, #    local_end 1924-05-02 00:00:00 (Fri)
  6600,
  0,
  'MMT',
      ],
      [
  60694524600, #    utc_start 1924-05-01 22:10:00 (Thu)
  60888146400, #      utc_end 1930-06-20 22:00:00 (Fri)
  60694531800, #  local_start 1924-05-02 00:10:00 (Fri)
  60888153600, #    local_end 1930-06-21 00:00:00 (Sat)
  7200,
  0,
  'EET',
      ],
      [
  60888146400, #    utc_start 1930-06-20 22:00:00 (Fri)
  61235902800, #      utc_end 1941-06-27 21:00:00 (Fri)
  60888157200, #  local_start 1930-06-21 01:00:00 (Sat)
  61235913600, #    local_end 1941-06-28 00:00:00 (Sat)
  10800,
  0,
  'MSK',
      ],
      [
  61235902800, #    utc_start 1941-06-27 21:00:00 (Fri)
  61278426000, #      utc_end 1942-11-02 01:00:00 (Mon)
  61235910000, #  local_start 1941-06-27 23:00:00 (Fri)
  61278433200, #    local_end 1942-11-02 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61278426000, #    utc_start 1942-11-02 01:00:00 (Mon)
  61291126800, #      utc_end 1943-03-29 01:00:00 (Mon)
  61278429600, #  local_start 1942-11-02 02:00:00 (Mon)
  61291130400, #    local_end 1943-03-29 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61291126800, #    utc_start 1943-03-29 01:00:00 (Mon)
  61307456400, #      utc_end 1943-10-04 01:00:00 (Mon)
  61291134000, #  local_start 1943-03-29 03:00:00 (Mon)
  61307463600, #    local_end 1943-10-04 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61307456400, #    utc_start 1943-10-04 01:00:00 (Mon)
  61323181200, #      utc_end 1944-04-03 01:00:00 (Mon)
  61307460000, #  local_start 1943-10-04 02:00:00 (Mon)
  61323184800, #    local_end 1944-04-03 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61323181200, #    utc_start 1944-04-03 01:00:00 (Mon)
  61331032800, #      utc_end 1944-07-02 22:00:00 (Sun)
  61323188400, #  local_start 1944-04-03 03:00:00 (Mon)
  61331040000, #    local_end 1944-07-03 00:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61331032800, #    utc_start 1944-07-02 22:00:00 (Sun)
  62490603600, #      utc_end 1981-03-31 21:00:00 (Tue)
  61331043600, #  local_start 1944-07-03 01:00:00 (Mon)
  62490614400, #    local_end 1981-04-01 00:00:00 (Wed)
  10800,
  0,
  'MSK',
      ],
      [
  62490603600, #    utc_start 1981-03-31 21:00:00 (Tue)
  62506411200, #      utc_end 1981-09-30 20:00:00 (Wed)
  62490618000, #  local_start 1981-04-01 01:00:00 (Wed)
  62506425600, #    local_end 1981-10-01 00:00:00 (Thu)
  14400,
  1,
  'MSD',
      ],
      [
  62506411200, #    utc_start 1981-09-30 20:00:00 (Wed)
  62522139600, #      utc_end 1982-03-31 21:00:00 (Wed)
  62506422000, #  local_start 1981-09-30 23:00:00 (Wed)
  62522150400, #    local_end 1982-04-01 00:00:00 (Thu)
  10800,
  0,
  'MSK',
      ],
      [
  62522139600, #    utc_start 1982-03-31 21:00:00 (Wed)
  62537947200, #      utc_end 1982-09-30 20:00:00 (Thu)
  62522154000, #  local_start 1982-04-01 01:00:00 (Thu)
  62537961600, #    local_end 1982-10-01 00:00:00 (Fri)
  14400,
  1,
  'MSD',
      ],
      [
  62537947200, #    utc_start 1982-09-30 20:00:00 (Thu)
  62553675600, #      utc_end 1983-03-31 21:00:00 (Thu)
  62537958000, #  local_start 1982-09-30 23:00:00 (Thu)
  62553686400, #    local_end 1983-04-01 00:00:00 (Fri)
  10800,
  0,
  'MSK',
      ],
      [
  62553675600, #    utc_start 1983-03-31 21:00:00 (Thu)
  62569483200, #      utc_end 1983-09-30 20:00:00 (Fri)
  62553690000, #  local_start 1983-04-01 01:00:00 (Fri)
  62569497600, #    local_end 1983-10-01 00:00:00 (Sat)
  14400,
  1,
  'MSD',
      ],
      [
  62569483200, #    utc_start 1983-09-30 20:00:00 (Fri)
  62585298000, #      utc_end 1984-03-31 21:00:00 (Sat)
  62569494000, #  local_start 1983-09-30 23:00:00 (Fri)
  62585308800, #    local_end 1984-04-01 00:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62585298000, #    utc_start 1984-03-31 21:00:00 (Sat)
  62601030000, #      utc_end 1984-09-29 23:00:00 (Sat)
  62585312400, #  local_start 1984-04-01 01:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62601030000, #    utc_start 1984-09-29 23:00:00 (Sat)
  62616754800, #      utc_end 1985-03-30 23:00:00 (Sat)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62616754800, #    utc_start 1985-03-30 23:00:00 (Sat)
  62632479600, #      utc_end 1985-09-28 23:00:00 (Sat)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62632479600, #    utc_start 1985-09-28 23:00:00 (Sat)
  62648204400, #      utc_end 1986-03-29 23:00:00 (Sat)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62648204400, #    utc_start 1986-03-29 23:00:00 (Sat)
  62663929200, #      utc_end 1986-09-27 23:00:00 (Sat)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62663929200, #    utc_start 1986-09-27 23:00:00 (Sat)
  62679654000, #      utc_end 1987-03-28 23:00:00 (Sat)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62679654000, #    utc_start 1987-03-28 23:00:00 (Sat)
  62695378800, #      utc_end 1987-09-26 23:00:00 (Sat)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62695378800, #    utc_start 1987-09-26 23:00:00 (Sat)
  62711103600, #      utc_end 1988-03-26 23:00:00 (Sat)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62711103600, #    utc_start 1988-03-26 23:00:00 (Sat)
  62726828400, #      utc_end 1988-09-24 23:00:00 (Sat)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62726828400, #    utc_start 1988-09-24 23:00:00 (Sat)
  62742553200, #      utc_end 1989-03-25 23:00:00 (Sat)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62742553200, #    utc_start 1989-03-25 23:00:00 (Sat)
  62758278000, #      utc_end 1989-09-23 23:00:00 (Sat)
  62742567600, #  local_start 1989-03-26 03:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62758278000, #    utc_start 1989-09-23 23:00:00 (Sat)
  62766824400, #      utc_end 1989-12-31 21:00:00 (Sun)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62766835200, #    local_end 1990-01-01 00:00:00 (Mon)
  10800,
  0,
  'MSK',
      ],
      [
  62766824400, #    utc_start 1989-12-31 21:00:00 (Sun)
  62806057200, #      utc_end 1991-03-30 23:00:00 (Sat)
  62766835200, #  local_start 1990-01-01 00:00:00 (Mon)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62806057200, #    utc_start 1991-03-30 23:00:00 (Sat)
  62821785600, #      utc_end 1991-09-29 00:00:00 (Sun)
  62806068000, #  local_start 1991-03-31 02:00:00 (Sun)
  62821796400, #    local_end 1991-09-29 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62821785600, #    utc_start 1991-09-29 00:00:00 (Sun)
  62837510400, #      utc_end 1992-03-29 00:00:00 (Sun)
  62821792800, #  local_start 1991-09-29 02:00:00 (Sun)
  62837517600, #    local_end 1992-03-29 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62837510400, #    utc_start 1992-03-29 00:00:00 (Sun)
  62853235200, #      utc_end 1992-09-27 00:00:00 (Sun)
  62837521200, #  local_start 1992-03-29 03:00:00 (Sun)
  62853246000, #    local_end 1992-09-27 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62853235200, #    utc_start 1992-09-27 00:00:00 (Sun)
  62868960000, #      utc_end 1993-03-28 00:00:00 (Sun)
  62853242400, #  local_start 1992-09-27 02:00:00 (Sun)
  62868967200, #    local_end 1993-03-28 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62868960000, #    utc_start 1993-03-28 00:00:00 (Sun)
  62884684800, #      utc_end 1993-09-26 00:00:00 (Sun)
  62868970800, #  local_start 1993-03-28 03:00:00 (Sun)
  62884695600, #    local_end 1993-09-26 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62884684800, #    utc_start 1993-09-26 00:00:00 (Sun)
  62900409600, #      utc_end 1994-03-27 00:00:00 (Sun)
  62884692000, #  local_start 1993-09-26 02:00:00 (Sun)
  62900416800, #    local_end 1994-03-27 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62900409600, #    utc_start 1994-03-27 00:00:00 (Sun)
  62916134400, #      utc_end 1994-09-25 00:00:00 (Sun)
  62900420400, #  local_start 1994-03-27 03:00:00 (Sun)
  62916145200, #    local_end 1994-09-25 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62916134400, #    utc_start 1994-09-25 00:00:00 (Sun)
  62931859200, #      utc_end 1995-03-26 00:00:00 (Sun)
  62916141600, #  local_start 1994-09-25 02:00:00 (Sun)
  62931866400, #    local_end 1995-03-26 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62931859200, #    utc_start 1995-03-26 00:00:00 (Sun)
  62947584000, #      utc_end 1995-09-24 00:00:00 (Sun)
  62931870000, #  local_start 1995-03-26 03:00:00 (Sun)
  62947594800, #    local_end 1995-09-24 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62947584000, #    utc_start 1995-09-24 00:00:00 (Sun)
  62963913600, #      utc_end 1996-03-31 00:00:00 (Sun)
  62947591200, #  local_start 1995-09-24 02:00:00 (Sun)
  62963920800, #    local_end 1996-03-31 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62963913600, #    utc_start 1996-03-31 00:00:00 (Sun)
  62982057600, #      utc_end 1996-10-27 00:00:00 (Sun)
  62963924400, #  local_start 1996-03-31 03:00:00 (Sun)
  62982068400, #    local_end 1996-10-27 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62982057600, #    utc_start 1996-10-27 00:00:00 (Sun)
  62995363200, #      utc_end 1997-03-30 00:00:00 (Sun)
  62982064800, #  local_start 1996-10-27 02:00:00 (Sun)
  62995370400, #    local_end 1997-03-30 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62995363200, #    utc_start 1997-03-30 00:00:00 (Sun)
  63013507200, #      utc_end 1997-10-26 00:00:00 (Sun)
  62995374000, #  local_start 1997-03-30 03:00:00 (Sun)
  63013518000, #    local_end 1997-10-26 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63013507200, #    utc_start 1997-10-26 00:00:00 (Sun)
  63026812800, #      utc_end 1998-03-29 00:00:00 (Sun)
  63013514400, #  local_start 1997-10-26 02:00:00 (Sun)
  63026820000, #    local_end 1998-03-29 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63026812800, #    utc_start 1998-03-29 00:00:00 (Sun)
  63044956800, #      utc_end 1998-10-25 00:00:00 (Sun)
  63026823600, #  local_start 1998-03-29 03:00:00 (Sun)
  63044967600, #    local_end 1998-10-25 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63044956800, #    utc_start 1998-10-25 00:00:00 (Sun)
  63058262400, #      utc_end 1999-03-28 00:00:00 (Sun)
  63044964000, #  local_start 1998-10-25 02:00:00 (Sun)
  63058269600, #    local_end 1999-03-28 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63058262400, #    utc_start 1999-03-28 00:00:00 (Sun)
  63077011200, #      utc_end 1999-10-31 00:00:00 (Sun)
  63058273200, #  local_start 1999-03-28 03:00:00 (Sun)
  63077022000, #    local_end 1999-10-31 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63077011200, #    utc_start 1999-10-31 00:00:00 (Sun)
  63089712000, #      utc_end 2000-03-26 00:00:00 (Sun)
  63077018400, #  local_start 1999-10-31 02:00:00 (Sun)
  63089719200, #    local_end 2000-03-26 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63089712000, #    utc_start 2000-03-26 00:00:00 (Sun)
  63108460800, #      utc_end 2000-10-29 00:00:00 (Sun)
  63089722800, #  local_start 2000-03-26 03:00:00 (Sun)
  63108471600, #    local_end 2000-10-29 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63108460800, #    utc_start 2000-10-29 00:00:00 (Sun)
  63121161600, #      utc_end 2001-03-25 00:00:00 (Sun)
  63108468000, #  local_start 2000-10-29 02:00:00 (Sun)
  63121168800, #    local_end 2001-03-25 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63121161600, #    utc_start 2001-03-25 00:00:00 (Sun)
  63139910400, #      utc_end 2001-10-28 00:00:00 (Sun)
  63121172400, #  local_start 2001-03-25 03:00:00 (Sun)
  63139921200, #    local_end 2001-10-28 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63139910400, #    utc_start 2001-10-28 00:00:00 (Sun)
  63153216000, #      utc_end 2002-03-31 00:00:00 (Sun)
  63139917600, #  local_start 2001-10-28 02:00:00 (Sun)
  63153223200, #    local_end 2002-03-31 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63153216000, #    utc_start 2002-03-31 00:00:00 (Sun)
  63171360000, #      utc_end 2002-10-27 00:00:00 (Sun)
  63153226800, #  local_start 2002-03-31 03:00:00 (Sun)
  63171370800, #    local_end 2002-10-27 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63171360000, #    utc_start 2002-10-27 00:00:00 (Sun)
  63184665600, #      utc_end 2003-03-30 00:00:00 (Sun)
  63171367200, #  local_start 2002-10-27 02:00:00 (Sun)
  63184672800, #    local_end 2003-03-30 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63184665600, #    utc_start 2003-03-30 00:00:00 (Sun)
  63202809600, #      utc_end 2003-10-26 00:00:00 (Sun)
  63184676400, #  local_start 2003-03-30 03:00:00 (Sun)
  63202820400, #    local_end 2003-10-26 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63202809600, #    utc_start 2003-10-26 00:00:00 (Sun)
  63216115200, #      utc_end 2004-03-28 00:00:00 (Sun)
  63202816800, #  local_start 2003-10-26 02:00:00 (Sun)
  63216122400, #    local_end 2004-03-28 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63216115200, #    utc_start 2004-03-28 00:00:00 (Sun)
  63234864000, #      utc_end 2004-10-31 00:00:00 (Sun)
  63216126000, #  local_start 2004-03-28 03:00:00 (Sun)
  63234874800, #    local_end 2004-10-31 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63234864000, #    utc_start 2004-10-31 00:00:00 (Sun)
  63247564800, #      utc_end 2005-03-27 00:00:00 (Sun)
  63234871200, #  local_start 2004-10-31 02:00:00 (Sun)
  63247572000, #    local_end 2005-03-27 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63247564800, #    utc_start 2005-03-27 00:00:00 (Sun)
  63266313600, #      utc_end 2005-10-30 00:00:00 (Sun)
  63247575600, #  local_start 2005-03-27 03:00:00 (Sun)
  63266324400, #    local_end 2005-10-30 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63266313600, #    utc_start 2005-10-30 00:00:00 (Sun)
  63279014400, #      utc_end 2006-03-26 00:00:00 (Sun)
  63266320800, #  local_start 2005-10-30 02:00:00 (Sun)
  63279021600, #    local_end 2006-03-26 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63279014400, #    utc_start 2006-03-26 00:00:00 (Sun)
  63297763200, #      utc_end 2006-10-29 00:00:00 (Sun)
  63279025200, #  local_start 2006-03-26 03:00:00 (Sun)
  63297774000, #    local_end 2006-10-29 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63297763200, #    utc_start 2006-10-29 00:00:00 (Sun)
  63310464000, #      utc_end 2007-03-25 00:00:00 (Sun)
  63297770400, #  local_start 2006-10-29 02:00:00 (Sun)
  63310471200, #    local_end 2007-03-25 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63310464000, #    utc_start 2007-03-25 00:00:00 (Sun)
  63329212800, #      utc_end 2007-10-28 00:00:00 (Sun)
  63310474800, #  local_start 2007-03-25 03:00:00 (Sun)
  63329223600, #    local_end 2007-10-28 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63329212800, #    utc_start 2007-10-28 00:00:00 (Sun)
  63342518400, #      utc_end 2008-03-30 00:00:00 (Sun)
  63329220000, #  local_start 2007-10-28 02:00:00 (Sun)
  63342525600, #    local_end 2008-03-30 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63342518400, #    utc_start 2008-03-30 00:00:00 (Sun)
  63360662400, #      utc_end 2008-10-26 00:00:00 (Sun)
  63342529200, #  local_start 2008-03-30 03:00:00 (Sun)
  63360673200, #    local_end 2008-10-26 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63360662400, #    utc_start 2008-10-26 00:00:00 (Sun)
  63373968000, #      utc_end 2009-03-29 00:00:00 (Sun)
  63360669600, #  local_start 2008-10-26 02:00:00 (Sun)
  63373975200, #    local_end 2009-03-29 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63373968000, #    utc_start 2009-03-29 00:00:00 (Sun)
  63392112000, #      utc_end 2009-10-25 00:00:00 (Sun)
  63373978800, #  local_start 2009-03-29 03:00:00 (Sun)
  63392122800, #    local_end 2009-10-25 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63392112000, #    utc_start 2009-10-25 00:00:00 (Sun)
  63405417600, #      utc_end 2010-03-28 00:00:00 (Sun)
  63392119200, #  local_start 2009-10-25 02:00:00 (Sun)
  63405424800, #    local_end 2010-03-28 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63405417600, #    utc_start 2010-03-28 00:00:00 (Sun)
  63424166400, #      utc_end 2010-10-31 00:00:00 (Sun)
  63405428400, #  local_start 2010-03-28 03:00:00 (Sun)
  63424177200, #    local_end 2010-10-31 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63424166400, #    utc_start 2010-10-31 00:00:00 (Sun)
  63436867200, #      utc_end 2011-03-27 00:00:00 (Sun)
  63424173600, #  local_start 2010-10-31 02:00:00 (Sun)
  63436874400, #    local_end 2011-03-27 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63436867200, #    utc_start 2011-03-27 00:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #      utc_end
  63436878000, #  local_start 2011-03-27 03:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  10800,
  0,
  '+03',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {32}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_EUROPE_MINSK

    $main::fatpacked{"DateTime/TimeZone/Europe/Monaco.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_EUROPE_MONACO';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Europe::Monaco;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Europe::Monaco::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59649003028, #      utc_end 1891-03-14 23:30:28 (Sat)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59649004800, #    local_end 1891-03-15 00:00:00 (Sun)
  1772,
  0,
  'LMT',
      ],
      [
  59649003028, #    utc_start 1891-03-14 23:30:28 (Sat)
  60279724239, #      utc_end 1911-03-10 23:50:39 (Fri)
  59649003589, #  local_start 1891-03-14 23:39:49 (Sat)
  60279724800, #    local_end 1911-03-11 00:00:00 (Sat)
  561,
  0,
  'PMT',
      ],
      [
  60279724239, #    utc_start 1911-03-10 23:50:39 (Fri)
  60445868400, #      utc_end 1916-06-14 23:00:00 (Wed)
  60279724239, #  local_start 1911-03-10 23:50:39 (Fri)
  60445868400, #    local_end 1916-06-14 23:00:00 (Wed)
  0,
  0,
  'WET',
      ],
      [
  60445868400, #    utc_start 1916-06-14 23:00:00 (Wed)
  60455286000, #      utc_end 1916-10-01 23:00:00 (Sun)
  60445872000, #  local_start 1916-06-15 00:00:00 (Thu)
  60455289600, #    local_end 1916-10-02 00:00:00 (Mon)
  3600,
  1,
  'WEST',
      ],
      [
  60455286000, #    utc_start 1916-10-01 23:00:00 (Sun)
  60470319600, #      utc_end 1917-03-24 23:00:00 (Sat)
  60455286000, #  local_start 1916-10-01 23:00:00 (Sun)
  60470319600, #    local_end 1917-03-24 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  60470319600, #    utc_start 1917-03-24 23:00:00 (Sat)
  60487340400, #      utc_end 1917-10-07 23:00:00 (Sun)
  60470323200, #  local_start 1917-03-25 00:00:00 (Sun)
  60487344000, #    local_end 1917-10-08 00:00:00 (Mon)
  3600,
  1,
  'WEST',
      ],
      [
  60487340400, #    utc_start 1917-10-07 23:00:00 (Sun)
  60500559600, #      utc_end 1918-03-09 23:00:00 (Sat)
  60487340400, #  local_start 1917-10-07 23:00:00 (Sun)
  60500559600, #    local_end 1918-03-09 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  60500559600, #    utc_start 1918-03-09 23:00:00 (Sat)
  60518790000, #      utc_end 1918-10-06 23:00:00 (Sun)
  60500563200, #  local_start 1918-03-10 00:00:00 (Sun)
  60518793600, #    local_end 1918-10-07 00:00:00 (Mon)
  3600,
  1,
  'WEST',
      ],
      [
  60518790000, #    utc_start 1918-10-06 23:00:00 (Sun)
  60531404400, #      utc_end 1919-03-01 23:00:00 (Sat)
  60518790000, #  local_start 1918-10-06 23:00:00 (Sun)
  60531404400, #    local_end 1919-03-01 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  60531404400, #    utc_start 1919-03-01 23:00:00 (Sat)
  60550239600, #      utc_end 1919-10-05 23:00:00 (Sun)
  60531408000, #  local_start 1919-03-02 00:00:00 (Sun)
  60550243200, #    local_end 1919-10-06 00:00:00 (Mon)
  3600,
  1,
  'WEST',
      ],
      [
  60550239600, #    utc_start 1919-10-05 23:00:00 (Sun)
  60561644400, #      utc_end 1920-02-14 23:00:00 (Sat)
  60550239600, #  local_start 1919-10-05 23:00:00 (Sun)
  60561644400, #    local_end 1920-02-14 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  60561644400, #    utc_start 1920-02-14 23:00:00 (Sat)
  60583417200, #      utc_end 1920-10-23 23:00:00 (Sat)
  60561648000, #  local_start 1920-02-15 00:00:00 (Sun)
  60583420800, #    local_end 1920-10-24 00:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60583417200, #    utc_start 1920-10-23 23:00:00 (Sat)
  60595686000, #      utc_end 1921-03-14 23:00:00 (Mon)
  60583417200, #  local_start 1920-10-23 23:00:00 (Sat)
  60595686000, #    local_end 1921-03-14 23:00:00 (Mon)
  0,
  0,
  'WET',
      ],
      [
  60595686000, #    utc_start 1921-03-14 23:00:00 (Mon)
  60615126000, #      utc_end 1921-10-25 23:00:00 (Tue)
  60595689600, #  local_start 1921-03-15 00:00:00 (Tue)
  60615129600, #    local_end 1921-10-26 00:00:00 (Wed)
  3600,
  1,
  'WEST',
      ],
      [
  60615126000, #    utc_start 1921-10-25 23:00:00 (Tue)
  60628172400, #      utc_end 1922-03-25 23:00:00 (Sat)
  60615126000, #  local_start 1921-10-25 23:00:00 (Tue)
  60628172400, #    local_end 1922-03-25 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  60628172400, #    utc_start 1922-03-25 23:00:00 (Sat)
  60645106800, #      utc_end 1922-10-07 23:00:00 (Sat)
  60628176000, #  local_start 1922-03-26 00:00:00 (Sun)
  60645110400, #    local_end 1922-10-08 00:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60645106800, #    utc_start 1922-10-07 23:00:00 (Sat)
  60665065200, #      utc_end 1923-05-26 23:00:00 (Sat)
  60645106800, #  local_start 1922-10-07 23:00:00 (Sat)
  60665065200, #    local_end 1923-05-26 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  60665065200, #    utc_start 1923-05-26 23:00:00 (Sat)
  60676556400, #      utc_end 1923-10-06 23:00:00 (Sat)
  60665068800, #  local_start 1923-05-27 00:00:00 (Sun)
  60676560000, #    local_end 1923-10-07 00:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60676556400, #    utc_start 1923-10-06 23:00:00 (Sat)
  60691676400, #      utc_end 1924-03-29 23:00:00 (Sat)
  60676556400, #  local_start 1923-10-06 23:00:00 (Sat)
  60691676400, #    local_end 1924-03-29 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  60691676400, #    utc_start 1924-03-29 23:00:00 (Sat)
  60708006000, #      utc_end 1924-10-04 23:00:00 (Sat)
  60691680000, #  local_start 1924-03-30 00:00:00 (Sun)
  60708009600, #    local_end 1924-10-05 00:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60708006000, #    utc_start 1924-10-04 23:00:00 (Sat)
  60723730800, #      utc_end 1925-04-04 23:00:00 (Sat)
  60708006000, #  local_start 1924-10-04 23:00:00 (Sat)
  60723730800, #    local_end 1925-04-04 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  60723730800, #    utc_start 1925-04-04 23:00:00 (Sat)
  60739455600, #      utc_end 1925-10-03 23:00:00 (Sat)
  60723734400, #  local_start 1925-04-05 00:00:00 (Sun)
  60739459200, #    local_end 1925-10-04 00:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60739455600, #    utc_start 1925-10-03 23:00:00 (Sat)
  60756390000, #      utc_end 1926-04-17 23:00:00 (Sat)
  60739455600, #  local_start 1925-10-03 23:00:00 (Sat)
  60756390000, #    local_end 1926-04-17 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  60756390000, #    utc_start 1926-04-17 23:00:00 (Sat)
  60770905200, #      utc_end 1926-10-02 23:00:00 (Sat)
  60756393600, #  local_start 1926-04-18 00:00:00 (Sun)
  60770908800, #    local_end 1926-10-03 00:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60770905200, #    utc_start 1926-10-02 23:00:00 (Sat)
  60787234800, #      utc_end 1927-04-09 23:00:00 (Sat)
  60770905200, #  local_start 1926-10-02 23:00:00 (Sat)
  60787234800, #    local_end 1927-04-09 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  60787234800, #    utc_start 1927-04-09 23:00:00 (Sat)
  60802354800, #      utc_end 1927-10-01 23:00:00 (Sat)
  60787238400, #  local_start 1927-04-10 00:00:00 (Sun)
  60802358400, #    local_end 1927-10-02 00:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60802354800, #    utc_start 1927-10-01 23:00:00 (Sat)
  60819289200, #      utc_end 1928-04-14 23:00:00 (Sat)
  60802354800, #  local_start 1927-10-01 23:00:00 (Sat)
  60819289200, #    local_end 1928-04-14 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  60819289200, #    utc_start 1928-04-14 23:00:00 (Sat)
  60834409200, #      utc_end 1928-10-06 23:00:00 (Sat)
  60819292800, #  local_start 1928-04-15 00:00:00 (Sun)
  60834412800, #    local_end 1928-10-07 00:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60834409200, #    utc_start 1928-10-06 23:00:00 (Sat)
  60851343600, #      utc_end 1929-04-20 23:00:00 (Sat)
  60834409200, #  local_start 1928-10-06 23:00:00 (Sat)
  60851343600, #    local_end 1929-04-20 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  60851343600, #    utc_start 1929-04-20 23:00:00 (Sat)
  60865858800, #      utc_end 1929-10-05 23:00:00 (Sat)
  60851347200, #  local_start 1929-04-21 00:00:00 (Sun)
  60865862400, #    local_end 1929-10-06 00:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60865858800, #    utc_start 1929-10-05 23:00:00 (Sat)
  60882188400, #      utc_end 1930-04-12 23:00:00 (Sat)
  60865858800, #  local_start 1929-10-05 23:00:00 (Sat)
  60882188400, #    local_end 1930-04-12 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  60882188400, #    utc_start 1930-04-12 23:00:00 (Sat)
  60897308400, #      utc_end 1930-10-04 23:00:00 (Sat)
  60882192000, #  local_start 1930-04-13 00:00:00 (Sun)
  60897312000, #    local_end 1930-10-05 00:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60897308400, #    utc_start 1930-10-04 23:00:00 (Sat)
  60914242800, #      utc_end 1931-04-18 23:00:00 (Sat)
  60897308400, #  local_start 1930-10-04 23:00:00 (Sat)
  60914242800, #    local_end 1931-04-18 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  60914242800, #    utc_start 1931-04-18 23:00:00 (Sat)
  60928758000, #      utc_end 1931-10-03 23:00:00 (Sat)
  60914246400, #  local_start 1931-04-19 00:00:00 (Sun)
  60928761600, #    local_end 1931-10-04 00:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60928758000, #    utc_start 1931-10-03 23:00:00 (Sat)
  60944482800, #      utc_end 1932-04-02 23:00:00 (Sat)
  60928758000, #  local_start 1931-10-03 23:00:00 (Sat)
  60944482800, #    local_end 1932-04-02 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  60944482800, #    utc_start 1932-04-02 23:00:00 (Sat)
  60960207600, #      utc_end 1932-10-01 23:00:00 (Sat)
  60944486400, #  local_start 1932-04-03 00:00:00 (Sun)
  60960211200, #    local_end 1932-10-02 00:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60960207600, #    utc_start 1932-10-01 23:00:00 (Sat)
  60975327600, #      utc_end 1933-03-25 23:00:00 (Sat)
  60960207600, #  local_start 1932-10-01 23:00:00 (Sat)
  60975327600, #    local_end 1933-03-25 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  60975327600, #    utc_start 1933-03-25 23:00:00 (Sat)
  60992262000, #      utc_end 1933-10-07 23:00:00 (Sat)
  60975331200, #  local_start 1933-03-26 00:00:00 (Sun)
  60992265600, #    local_end 1933-10-08 00:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60992262000, #    utc_start 1933-10-07 23:00:00 (Sat)
  61007986800, #      utc_end 1934-04-07 23:00:00 (Sat)
  60992262000, #  local_start 1933-10-07 23:00:00 (Sat)
  61007986800, #    local_end 1934-04-07 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  61007986800, #    utc_start 1934-04-07 23:00:00 (Sat)
  61023711600, #      utc_end 1934-10-06 23:00:00 (Sat)
  61007990400, #  local_start 1934-04-08 00:00:00 (Sun)
  61023715200, #    local_end 1934-10-07 00:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  61023711600, #    utc_start 1934-10-06 23:00:00 (Sat)
  61038831600, #      utc_end 1935-03-30 23:00:00 (Sat)
  61023711600, #  local_start 1934-10-06 23:00:00 (Sat)
  61038831600, #    local_end 1935-03-30 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  61038831600, #    utc_start 1935-03-30 23:00:00 (Sat)
  61055161200, #      utc_end 1935-10-05 23:00:00 (Sat)
  61038835200, #  local_start 1935-03-31 00:00:00 (Sun)
  61055164800, #    local_end 1935-10-06 00:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  61055161200, #    utc_start 1935-10-05 23:00:00 (Sat)
  61072095600, #      utc_end 1936-04-18 23:00:00 (Sat)
  61055161200, #  local_start 1935-10-05 23:00:00 (Sat)
  61072095600, #    local_end 1936-04-18 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  61072095600, #    utc_start 1936-04-18 23:00:00 (Sat)
  61086610800, #      utc_end 1936-10-03 23:00:00 (Sat)
  61072099200, #  local_start 1936-04-19 00:00:00 (Sun)
  61086614400, #    local_end 1936-10-04 00:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  61086610800, #    utc_start 1936-10-03 23:00:00 (Sat)
  61102335600, #      utc_end 1937-04-03 23:00:00 (Sat)
  61086610800, #  local_start 1936-10-03 23:00:00 (Sat)
  61102335600, #    local_end 1937-04-03 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  61102335600, #    utc_start 1937-04-03 23:00:00 (Sat)
  61118060400, #      utc_end 1937-10-02 23:00:00 (Sat)
  61102339200, #  local_start 1937-04-04 00:00:00 (Sun)
  61118064000, #    local_end 1937-10-03 00:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  61118060400, #    utc_start 1937-10-02 23:00:00 (Sat)
  61133180400, #      utc_end 1938-03-26 23:00:00 (Sat)
  61118060400, #  local_start 1937-10-02 23:00:00 (Sat)
  61133180400, #    local_end 1938-03-26 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  61133180400, #    utc_start 1938-03-26 23:00:00 (Sat)
  61149510000, #      utc_end 1938-10-01 23:00:00 (Sat)
  61133184000, #  local_start 1938-03-27 00:00:00 (Sun)
  61149513600, #    local_end 1938-10-02 00:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  61149510000, #    utc_start 1938-10-01 23:00:00 (Sat)
  61166444400, #      utc_end 1939-04-15 23:00:00 (Sat)
  61149510000, #  local_start 1938-10-01 23:00:00 (Sat)
  61166444400, #    local_end 1939-04-15 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  61166444400, #    utc_start 1939-04-15 23:00:00 (Sat)
  61185193200, #      utc_end 1939-11-18 23:00:00 (Sat)
  61166448000, #  local_start 1939-04-16 00:00:00 (Sun)
  61185196800, #    local_end 1939-11-19 00:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  61185193200, #    utc_start 1939-11-18 23:00:00 (Sat)
  61193671200, #      utc_end 1940-02-25 02:00:00 (Sun)
  61185193200, #  local_start 1939-11-18 23:00:00 (Sat)
  61193671200, #    local_end 1940-02-25 02:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  61193671200, #    utc_start 1940-02-25 02:00:00 (Sun)
  61231244400, #      utc_end 1941-05-04 23:00:00 (Sun)
  61193674800, #  local_start 1940-02-25 03:00:00 (Sun)
  61231248000, #    local_end 1941-05-05 00:00:00 (Mon)
  3600,
  1,
  'WEST',
      ],
      [
  61231244400, #    utc_start 1941-05-04 23:00:00 (Sun)
  61244546400, #      utc_end 1941-10-05 22:00:00 (Sun)
  61231251600, #  local_start 1941-05-05 01:00:00 (Mon)
  61244553600, #    local_end 1941-10-06 00:00:00 (Mon)
  7200,
  1,
  'WEMT',
      ],
      [
  61244546400, #    utc_start 1941-10-05 22:00:00 (Sun)
  61257855600, #      utc_end 1942-03-08 23:00:00 (Sun)
  61244550000, #  local_start 1941-10-05 23:00:00 (Sun)
  61257859200, #    local_end 1942-03-09 00:00:00 (Mon)
  3600,
  1,
  'WEST',
      ],
      [
  61257855600, #    utc_start 1942-03-08 23:00:00 (Sun)
  61278426000, #      utc_end 1942-11-02 01:00:00 (Mon)
  61257862800, #  local_start 1942-03-09 01:00:00 (Mon)
  61278433200, #    local_end 1942-11-02 03:00:00 (Mon)
  7200,
  1,
  'WEMT',
      ],
      [
  61278426000, #    utc_start 1942-11-02 01:00:00 (Mon)
  61291126800, #      utc_end 1943-03-29 01:00:00 (Mon)
  61278429600, #  local_start 1942-11-02 02:00:00 (Mon)
  61291130400, #    local_end 1943-03-29 02:00:00 (Mon)
  3600,
  1,
  'WEST',
      ],
      [
  61291126800, #    utc_start 1943-03-29 01:00:00 (Mon)
  61307456400, #      utc_end 1943-10-04 01:00:00 (Mon)
  61291134000, #  local_start 1943-03-29 03:00:00 (Mon)
  61307463600, #    local_end 1943-10-04 03:00:00 (Mon)
  7200,
  1,
  'WEMT',
      ],
      [
  61307456400, #    utc_start 1943-10-04 01:00:00 (Mon)
  61323181200, #      utc_end 1944-04-03 01:00:00 (Mon)
  61307460000, #  local_start 1943-10-04 02:00:00 (Mon)
  61323184800, #    local_end 1944-04-03 02:00:00 (Mon)
  3600,
  1,
  'WEST',
      ],
      [
  61323181200, #    utc_start 1944-04-03 01:00:00 (Mon)
  61339417200, #      utc_end 1944-10-07 23:00:00 (Sat)
  61323188400, #  local_start 1944-04-03 03:00:00 (Mon)
  61339424400, #    local_end 1944-10-08 01:00:00 (Sun)
  7200,
  1,
  'WEMT',
      ],
      [
  61339417200, #    utc_start 1944-10-07 23:00:00 (Sat)
  61354630800, #      utc_end 1945-04-02 01:00:00 (Mon)
  61339420800, #  local_start 1944-10-08 00:00:00 (Sun)
  61354634400, #    local_end 1945-04-02 02:00:00 (Mon)
  3600,
  1,
  'WEST',
      ],
      [
  61354630800, #    utc_start 1945-04-02 01:00:00 (Mon)
  61369059600, #      utc_end 1945-09-16 01:00:00 (Sun)
  61354638000, #  local_start 1945-04-02 03:00:00 (Mon)
  61369066800, #    local_end 1945-09-16 03:00:00 (Sun)
  7200,
  1,
  'WEMT',
      ],
      [
  61369059600, #    utc_start 1945-09-16 01:00:00 (Sun)
  62332502400, #      utc_end 1976-03-28 00:00:00 (Sun)
  61369063200, #  local_start 1945-09-16 02:00:00 (Sun)
  62332506000, #    local_end 1976-03-28 01:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62332502400, #    utc_start 1976-03-28 00:00:00 (Sun)
  62348223600, #      utc_end 1976-09-25 23:00:00 (Sat)
  62332509600, #  local_start 1976-03-28 02:00:00 (Sun)
  62348230800, #    local_end 1976-09-26 01:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62348223600, #    utc_start 1976-09-25 23:00:00 (Sat)
  62356604400, #      utc_end 1976-12-31 23:00:00 (Fri)
  62348227200, #  local_start 1976-09-26 00:00:00 (Sun)
  62356608000, #    local_end 1977-01-01 00:00:00 (Sat)
  3600,
  0,
  'CET',
      ],
      [
  62356604400, #    utc_start 1976-12-31 23:00:00 (Fri)
  62364560400, #      utc_end 1977-04-03 01:00:00 (Sun)
  62356608000, #  local_start 1977-01-01 00:00:00 (Sat)
  62364564000, #    local_end 1977-04-03 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62364560400, #    utc_start 1977-04-03 01:00:00 (Sun)
  62379680400, #      utc_end 1977-09-25 01:00:00 (Sun)
  62364567600, #  local_start 1977-04-03 03:00:00 (Sun)
  62379687600, #    local_end 1977-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62379680400, #    utc_start 1977-09-25 01:00:00 (Sun)
  62396010000, #      utc_end 1978-04-02 01:00:00 (Sun)
  62379684000, #  local_start 1977-09-25 02:00:00 (Sun)
  62396013600, #    local_end 1978-04-02 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62396010000, #    utc_start 1978-04-02 01:00:00 (Sun)
  62411734800, #      utc_end 1978-10-01 01:00:00 (Sun)
  62396017200, #  local_start 1978-04-02 03:00:00 (Sun)
  62411742000, #    local_end 1978-10-01 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62411734800, #    utc_start 1978-10-01 01:00:00 (Sun)
  62427459600, #      utc_end 1979-04-01 01:00:00 (Sun)
  62411738400, #  local_start 1978-10-01 02:00:00 (Sun)
  62427463200, #    local_end 1979-04-01 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62427459600, #    utc_start 1979-04-01 01:00:00 (Sun)
  62443184400, #      utc_end 1979-09-30 01:00:00 (Sun)
  62427466800, #  local_start 1979-04-01 03:00:00 (Sun)
  62443191600, #    local_end 1979-09-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62443184400, #    utc_start 1979-09-30 01:00:00 (Sun)
  62459514000, #      utc_end 1980-04-06 01:00:00 (Sun)
  62443188000, #  local_start 1979-09-30 02:00:00 (Sun)
  62459517600, #    local_end 1980-04-06 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62459514000, #    utc_start 1980-04-06 01:00:00 (Sun)
  62474634000, #      utc_end 1980-09-28 01:00:00 (Sun)
  62459521200, #  local_start 1980-04-06 03:00:00 (Sun)
  62474641200, #    local_end 1980-09-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62474634000, #    utc_start 1980-09-28 01:00:00 (Sun)
  62490358800, #      utc_end 1981-03-29 01:00:00 (Sun)
  62474637600, #  local_start 1980-09-28 02:00:00 (Sun)
  62490362400, #    local_end 1981-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62490358800, #    utc_start 1981-03-29 01:00:00 (Sun)
  62506083600, #      utc_end 1981-09-27 01:00:00 (Sun)
  62490366000, #  local_start 1981-03-29 03:00:00 (Sun)
  62506090800, #    local_end 1981-09-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62506083600, #    utc_start 1981-09-27 01:00:00 (Sun)
  62521808400, #      utc_end 1982-03-28 01:00:00 (Sun)
  62506087200, #  local_start 1981-09-27 02:00:00 (Sun)
  62521812000, #    local_end 1982-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62521808400, #    utc_start 1982-03-28 01:00:00 (Sun)
  62537533200, #      utc_end 1982-09-26 01:00:00 (Sun)
  62521815600, #  local_start 1982-03-28 03:00:00 (Sun)
  62537540400, #    local_end 1982-09-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62537533200, #    utc_start 1982-09-26 01:00:00 (Sun)
  62553258000, #      utc_end 1983-03-27 01:00:00 (Sun)
  62537536800, #  local_start 1982-09-26 02:00:00 (Sun)
  62553261600, #    local_end 1983-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62553258000, #    utc_start 1983-03-27 01:00:00 (Sun)
  62568982800, #      utc_end 1983-09-25 01:00:00 (Sun)
  62553265200, #  local_start 1983-03-27 03:00:00 (Sun)
  62568990000, #    local_end 1983-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62568982800, #    utc_start 1983-09-25 01:00:00 (Sun)
  62584707600, #      utc_end 1984-03-25 01:00:00 (Sun)
  62568986400, #  local_start 1983-09-25 02:00:00 (Sun)
  62584711200, #    local_end 1984-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62584707600, #    utc_start 1984-03-25 01:00:00 (Sun)
  62601037200, #      utc_end 1984-09-30 01:00:00 (Sun)
  62584714800, #  local_start 1984-03-25 03:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62601037200, #    utc_start 1984-09-30 01:00:00 (Sun)
  62616762000, #      utc_end 1985-03-31 01:00:00 (Sun)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62616762000, #    utc_start 1985-03-31 01:00:00 (Sun)
  62632486800, #      utc_end 1985-09-29 01:00:00 (Sun)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62632486800, #    utc_start 1985-09-29 01:00:00 (Sun)
  62648211600, #      utc_end 1986-03-30 01:00:00 (Sun)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62648211600, #    utc_start 1986-03-30 01:00:00 (Sun)
  62663936400, #      utc_end 1986-09-28 01:00:00 (Sun)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62663936400, #    utc_start 1986-09-28 01:00:00 (Sun)
  62679661200, #      utc_end 1987-03-29 01:00:00 (Sun)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62679661200, #    utc_start 1987-03-29 01:00:00 (Sun)
  62695386000, #      utc_end 1987-09-27 01:00:00 (Sun)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62695386000, #    utc_start 1987-09-27 01:00:00 (Sun)
  62711110800, #      utc_end 1988-03-27 01:00:00 (Sun)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62711110800, #    utc_start 1988-03-27 01:00:00 (Sun)
  62726835600, #      utc_end 1988-09-25 01:00:00 (Sun)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62726835600, #    utc_start 1988-09-25 01:00:00 (Sun)
  62742560400, #      utc_end 1989-03-26 01:00:00 (Sun)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62742560400, #    utc_start 1989-03-26 01:00:00 (Sun)
  62758285200, #      utc_end 1989-09-24 01:00:00 (Sun)
  62742567600, #  local_start 1989-03-26 03:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62758285200, #    utc_start 1989-09-24 01:00:00 (Sun)
  62774010000, #      utc_end 1990-03-25 01:00:00 (Sun)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62774010000, #    utc_start 1990-03-25 01:00:00 (Sun)
  62790339600, #      utc_end 1990-09-30 01:00:00 (Sun)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62790339600, #    utc_start 1990-09-30 01:00:00 (Sun)
  62806064400, #      utc_end 1991-03-31 01:00:00 (Sun)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62806064400, #    utc_start 1991-03-31 01:00:00 (Sun)
  62821789200, #      utc_end 1991-09-29 01:00:00 (Sun)
  62806071600, #  local_start 1991-03-31 03:00:00 (Sun)
  62821796400, #    local_end 1991-09-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62821789200, #    utc_start 1991-09-29 01:00:00 (Sun)
  62837514000, #      utc_end 1992-03-29 01:00:00 (Sun)
  62821792800, #  local_start 1991-09-29 02:00:00 (Sun)
  62837517600, #    local_end 1992-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62837514000, #    utc_start 1992-03-29 01:00:00 (Sun)
  62853238800, #      utc_end 1992-09-27 01:00:00 (Sun)
  62837521200, #  local_start 1992-03-29 03:00:00 (Sun)
  62853246000, #    local_end 1992-09-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62853238800, #    utc_start 1992-09-27 01:00:00 (Sun)
  62868963600, #      utc_end 1993-03-28 01:00:00 (Sun)
  62853242400, #  local_start 1992-09-27 02:00:00 (Sun)
  62868967200, #    local_end 1993-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62868963600, #    utc_start 1993-03-28 01:00:00 (Sun)
  62884688400, #      utc_end 1993-09-26 01:00:00 (Sun)
  62868970800, #  local_start 1993-03-28 03:00:00 (Sun)
  62884695600, #    local_end 1993-09-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62884688400, #    utc_start 1993-09-26 01:00:00 (Sun)
  62900413200, #      utc_end 1994-03-27 01:00:00 (Sun)
  62884692000, #  local_start 1993-09-26 02:00:00 (Sun)
  62900416800, #    local_end 1994-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62900413200, #    utc_start 1994-03-27 01:00:00 (Sun)
  62916138000, #      utc_end 1994-09-25 01:00:00 (Sun)
  62900420400, #  local_start 1994-03-27 03:00:00 (Sun)
  62916145200, #    local_end 1994-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62916138000, #    utc_start 1994-09-25 01:00:00 (Sun)
  62931862800, #      utc_end 1995-03-26 01:00:00 (Sun)
  62916141600, #  local_start 1994-09-25 02:00:00 (Sun)
  62931866400, #    local_end 1995-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62931862800, #    utc_start 1995-03-26 01:00:00 (Sun)
  62947587600, #      utc_end 1995-09-24 01:00:00 (Sun)
  62931870000, #  local_start 1995-03-26 03:00:00 (Sun)
  62947594800, #    local_end 1995-09-24 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62947587600, #    utc_start 1995-09-24 01:00:00 (Sun)
  62963917200, #      utc_end 1996-03-31 01:00:00 (Sun)
  62947591200, #  local_start 1995-09-24 02:00:00 (Sun)
  62963920800, #    local_end 1996-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62963917200, #    utc_start 1996-03-31 01:00:00 (Sun)
  62982061200, #      utc_end 1996-10-27 01:00:00 (Sun)
  62963924400, #  local_start 1996-03-31 03:00:00 (Sun)
  62982068400, #    local_end 1996-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62982061200, #    utc_start 1996-10-27 01:00:00 (Sun)
  62995366800, #      utc_end 1997-03-30 01:00:00 (Sun)
  62982064800, #  local_start 1996-10-27 02:00:00 (Sun)
  62995370400, #    local_end 1997-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62995366800, #    utc_start 1997-03-30 01:00:00 (Sun)
  63013510800, #      utc_end 1997-10-26 01:00:00 (Sun)
  62995374000, #  local_start 1997-03-30 03:00:00 (Sun)
  63013518000, #    local_end 1997-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63013510800, #    utc_start 1997-10-26 01:00:00 (Sun)
  63026816400, #      utc_end 1998-03-29 01:00:00 (Sun)
  63013514400, #  local_start 1997-10-26 02:00:00 (Sun)
  63026820000, #    local_end 1998-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63026816400, #    utc_start 1998-03-29 01:00:00 (Sun)
  63044960400, #      utc_end 1998-10-25 01:00:00 (Sun)
  63026823600, #  local_start 1998-03-29 03:00:00 (Sun)
  63044967600, #    local_end 1998-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63044960400, #    utc_start 1998-10-25 01:00:00 (Sun)
  63058266000, #      utc_end 1999-03-28 01:00:00 (Sun)
  63044964000, #  local_start 1998-10-25 02:00:00 (Sun)
  63058269600, #    local_end 1999-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63058266000, #    utc_start 1999-03-28 01:00:00 (Sun)
  63077014800, #      utc_end 1999-10-31 01:00:00 (Sun)
  63058273200, #  local_start 1999-03-28 03:00:00 (Sun)
  63077022000, #    local_end 1999-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63077014800, #    utc_start 1999-10-31 01:00:00 (Sun)
  63089715600, #      utc_end 2000-03-26 01:00:00 (Sun)
  63077018400, #  local_start 1999-10-31 02:00:00 (Sun)
  63089719200, #    local_end 2000-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63089715600, #    utc_start 2000-03-26 01:00:00 (Sun)
  63108464400, #      utc_end 2000-10-29 01:00:00 (Sun)
  63089722800, #  local_start 2000-03-26 03:00:00 (Sun)
  63108471600, #    local_end 2000-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63108464400, #    utc_start 2000-10-29 01:00:00 (Sun)
  63121165200, #      utc_end 2001-03-25 01:00:00 (Sun)
  63108468000, #  local_start 2000-10-29 02:00:00 (Sun)
  63121168800, #    local_end 2001-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63121165200, #    utc_start 2001-03-25 01:00:00 (Sun)
  63139914000, #      utc_end 2001-10-28 01:00:00 (Sun)
  63121172400, #  local_start 2001-03-25 03:00:00 (Sun)
  63139921200, #    local_end 2001-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63139914000, #    utc_start 2001-10-28 01:00:00 (Sun)
  63153219600, #      utc_end 2002-03-31 01:00:00 (Sun)
  63139917600, #  local_start 2001-10-28 02:00:00 (Sun)
  63153223200, #    local_end 2002-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63153219600, #    utc_start 2002-03-31 01:00:00 (Sun)
  63171363600, #      utc_end 2002-10-27 01:00:00 (Sun)
  63153226800, #  local_start 2002-03-31 03:00:00 (Sun)
  63171370800, #    local_end 2002-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63171363600, #    utc_start 2002-10-27 01:00:00 (Sun)
  63184669200, #      utc_end 2003-03-30 01:00:00 (Sun)
  63171367200, #  local_start 2002-10-27 02:00:00 (Sun)
  63184672800, #    local_end 2003-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63184669200, #    utc_start 2003-03-30 01:00:00 (Sun)
  63202813200, #      utc_end 2003-10-26 01:00:00 (Sun)
  63184676400, #  local_start 2003-03-30 03:00:00 (Sun)
  63202820400, #    local_end 2003-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63202813200, #    utc_start 2003-10-26 01:00:00 (Sun)
  63216118800, #      utc_end 2004-03-28 01:00:00 (Sun)
  63202816800, #  local_start 2003-10-26 02:00:00 (Sun)
  63216122400, #    local_end 2004-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63216118800, #    utc_start 2004-03-28 01:00:00 (Sun)
  63234867600, #      utc_end 2004-10-31 01:00:00 (Sun)
  63216126000, #  local_start 2004-03-28 03:00:00 (Sun)
  63234874800, #    local_end 2004-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63234867600, #    utc_start 2004-10-31 01:00:00 (Sun)
  63247568400, #      utc_end 2005-03-27 01:00:00 (Sun)
  63234871200, #  local_start 2004-10-31 02:00:00 (Sun)
  63247572000, #    local_end 2005-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63247568400, #    utc_start 2005-03-27 01:00:00 (Sun)
  63266317200, #      utc_end 2005-10-30 01:00:00 (Sun)
  63247575600, #  local_start 2005-03-27 03:00:00 (Sun)
  63266324400, #    local_end 2005-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63266317200, #    utc_start 2005-10-30 01:00:00 (Sun)
  63279018000, #      utc_end 2006-03-26 01:00:00 (Sun)
  63266320800, #  local_start 2005-10-30 02:00:00 (Sun)
  63279021600, #    local_end 2006-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63279018000, #    utc_start 2006-03-26 01:00:00 (Sun)
  63297766800, #      utc_end 2006-10-29 01:00:00 (Sun)
  63279025200, #  local_start 2006-03-26 03:00:00 (Sun)
  63297774000, #    local_end 2006-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63297766800, #    utc_start 2006-10-29 01:00:00 (Sun)
  63310467600, #      utc_end 2007-03-25 01:00:00 (Sun)
  63297770400, #  local_start 2006-10-29 02:00:00 (Sun)
  63310471200, #    local_end 2007-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63310467600, #    utc_start 2007-03-25 01:00:00 (Sun)
  63329216400, #      utc_end 2007-10-28 01:00:00 (Sun)
  63310474800, #  local_start 2007-03-25 03:00:00 (Sun)
  63329223600, #    local_end 2007-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63329216400, #    utc_start 2007-10-28 01:00:00 (Sun)
  63342522000, #      utc_end 2008-03-30 01:00:00 (Sun)
  63329220000, #  local_start 2007-10-28 02:00:00 (Sun)
  63342525600, #    local_end 2008-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63342522000, #    utc_start 2008-03-30 01:00:00 (Sun)
  63360666000, #      utc_end 2008-10-26 01:00:00 (Sun)
  63342529200, #  local_start 2008-03-30 03:00:00 (Sun)
  63360673200, #    local_end 2008-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63360666000, #    utc_start 2008-10-26 01:00:00 (Sun)
  63373971600, #      utc_end 2009-03-29 01:00:00 (Sun)
  63360669600, #  local_start 2008-10-26 02:00:00 (Sun)
  63373975200, #    local_end 2009-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63373971600, #    utc_start 2009-03-29 01:00:00 (Sun)
  63392115600, #      utc_end 2009-10-25 01:00:00 (Sun)
  63373978800, #  local_start 2009-03-29 03:00:00 (Sun)
  63392122800, #    local_end 2009-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63392115600, #    utc_start 2009-10-25 01:00:00 (Sun)
  63405421200, #      utc_end 2010-03-28 01:00:00 (Sun)
  63392119200, #  local_start 2009-10-25 02:00:00 (Sun)
  63405424800, #    local_end 2010-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63405421200, #    utc_start 2010-03-28 01:00:00 (Sun)
  63424170000, #      utc_end 2010-10-31 01:00:00 (Sun)
  63405428400, #  local_start 2010-03-28 03:00:00 (Sun)
  63424177200, #    local_end 2010-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63424170000, #    utc_start 2010-10-31 01:00:00 (Sun)
  63436870800, #      utc_end 2011-03-27 01:00:00 (Sun)
  63424173600, #  local_start 2010-10-31 02:00:00 (Sun)
  63436874400, #    local_end 2011-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63436870800, #    utc_start 2011-03-27 01:00:00 (Sun)
  63455619600, #      utc_end 2011-10-30 01:00:00 (Sun)
  63436878000, #  local_start 2011-03-27 03:00:00 (Sun)
  63455626800, #    local_end 2011-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63455619600, #    utc_start 2011-10-30 01:00:00 (Sun)
  63468320400, #      utc_end 2012-03-25 01:00:00 (Sun)
  63455623200, #  local_start 2011-10-30 02:00:00 (Sun)
  63468324000, #    local_end 2012-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63468320400, #    utc_start 2012-03-25 01:00:00 (Sun)
  63487069200, #      utc_end 2012-10-28 01:00:00 (Sun)
  63468327600, #  local_start 2012-03-25 03:00:00 (Sun)
  63487076400, #    local_end 2012-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63487069200, #    utc_start 2012-10-28 01:00:00 (Sun)
  63500374800, #      utc_end 2013-03-31 01:00:00 (Sun)
  63487072800, #  local_start 2012-10-28 02:00:00 (Sun)
  63500378400, #    local_end 2013-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63500374800, #    utc_start 2013-03-31 01:00:00 (Sun)
  63518518800, #      utc_end 2013-10-27 01:00:00 (Sun)
  63500382000, #  local_start 2013-03-31 03:00:00 (Sun)
  63518526000, #    local_end 2013-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63518518800, #    utc_start 2013-10-27 01:00:00 (Sun)
  63531824400, #      utc_end 2014-03-30 01:00:00 (Sun)
  63518522400, #  local_start 2013-10-27 02:00:00 (Sun)
  63531828000, #    local_end 2014-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63531824400, #    utc_start 2014-03-30 01:00:00 (Sun)
  63549968400, #      utc_end 2014-10-26 01:00:00 (Sun)
  63531831600, #  local_start 2014-03-30 03:00:00 (Sun)
  63549975600, #    local_end 2014-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63549968400, #    utc_start 2014-10-26 01:00:00 (Sun)
  63563274000, #      utc_end 2015-03-29 01:00:00 (Sun)
  63549972000, #  local_start 2014-10-26 02:00:00 (Sun)
  63563277600, #    local_end 2015-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63563274000, #    utc_start 2015-03-29 01:00:00 (Sun)
  63581418000, #      utc_end 2015-10-25 01:00:00 (Sun)
  63563281200, #  local_start 2015-03-29 03:00:00 (Sun)
  63581425200, #    local_end 2015-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63581418000, #    utc_start 2015-10-25 01:00:00 (Sun)
  63594723600, #      utc_end 2016-03-27 01:00:00 (Sun)
  63581421600, #  local_start 2015-10-25 02:00:00 (Sun)
  63594727200, #    local_end 2016-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63594723600, #    utc_start 2016-03-27 01:00:00 (Sun)
  63613472400, #      utc_end 2016-10-30 01:00:00 (Sun)
  63594730800, #  local_start 2016-03-27 03:00:00 (Sun)
  63613479600, #    local_end 2016-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63613472400, #    utc_start 2016-10-30 01:00:00 (Sun)
  63626173200, #      utc_end 2017-03-26 01:00:00 (Sun)
  63613476000, #  local_start 2016-10-30 02:00:00 (Sun)
  63626176800, #    local_end 2017-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63626173200, #    utc_start 2017-03-26 01:00:00 (Sun)
  63644922000, #      utc_end 2017-10-29 01:00:00 (Sun)
  63626180400, #  local_start 2017-03-26 03:00:00 (Sun)
  63644929200, #    local_end 2017-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63644922000, #    utc_start 2017-10-29 01:00:00 (Sun)
  63657622800, #      utc_end 2018-03-25 01:00:00 (Sun)
  63644925600, #  local_start 2017-10-29 02:00:00 (Sun)
  63657626400, #    local_end 2018-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63657622800, #    utc_start 2018-03-25 01:00:00 (Sun)
  63676371600, #      utc_end 2018-10-28 01:00:00 (Sun)
  63657630000, #  local_start 2018-03-25 03:00:00 (Sun)
  63676378800, #    local_end 2018-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63676371600, #    utc_start 2018-10-28 01:00:00 (Sun)
  63689677200, #      utc_end 2019-03-31 01:00:00 (Sun)
  63676375200, #  local_start 2018-10-28 02:00:00 (Sun)
  63689680800, #    local_end 2019-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63689677200, #    utc_start 2019-03-31 01:00:00 (Sun)
  63707821200, #      utc_end 2019-10-27 01:00:00 (Sun)
  63689684400, #  local_start 2019-03-31 03:00:00 (Sun)
  63707828400, #    local_end 2019-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63707821200, #    utc_start 2019-10-27 01:00:00 (Sun)
  63721126800, #      utc_end 2020-03-29 01:00:00 (Sun)
  63707824800, #  local_start 2019-10-27 02:00:00 (Sun)
  63721130400, #    local_end 2020-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63721126800, #    utc_start 2020-03-29 01:00:00 (Sun)
  63739270800, #      utc_end 2020-10-25 01:00:00 (Sun)
  63721134000, #  local_start 2020-03-29 03:00:00 (Sun)
  63739278000, #    local_end 2020-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63739270800, #    utc_start 2020-10-25 01:00:00 (Sun)
  63752576400, #      utc_end 2021-03-28 01:00:00 (Sun)
  63739274400, #  local_start 2020-10-25 02:00:00 (Sun)
  63752580000, #    local_end 2021-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63752576400, #    utc_start 2021-03-28 01:00:00 (Sun)
  63771325200, #      utc_end 2021-10-31 01:00:00 (Sun)
  63752583600, #  local_start 2021-03-28 03:00:00 (Sun)
  63771332400, #    local_end 2021-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63771325200, #    utc_start 2021-10-31 01:00:00 (Sun)
  63784026000, #      utc_end 2022-03-27 01:00:00 (Sun)
  63771328800, #  local_start 2021-10-31 02:00:00 (Sun)
  63784029600, #    local_end 2022-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63784026000, #    utc_start 2022-03-27 01:00:00 (Sun)
  63802774800, #      utc_end 2022-10-30 01:00:00 (Sun)
  63784033200, #  local_start 2022-03-27 03:00:00 (Sun)
  63802782000, #    local_end 2022-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63802774800, #    utc_start 2022-10-30 01:00:00 (Sun)
  63815475600, #      utc_end 2023-03-26 01:00:00 (Sun)
  63802778400, #  local_start 2022-10-30 02:00:00 (Sun)
  63815479200, #    local_end 2023-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63815475600, #    utc_start 2023-03-26 01:00:00 (Sun)
  63834224400, #      utc_end 2023-10-29 01:00:00 (Sun)
  63815482800, #  local_start 2023-03-26 03:00:00 (Sun)
  63834231600, #    local_end 2023-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63834224400, #    utc_start 2023-10-29 01:00:00 (Sun)
  63847530000, #      utc_end 2024-03-31 01:00:00 (Sun)
  63834228000, #  local_start 2023-10-29 02:00:00 (Sun)
  63847533600, #    local_end 2024-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63847530000, #    utc_start 2024-03-31 01:00:00 (Sun)
  63865674000, #      utc_end 2024-10-27 01:00:00 (Sun)
  63847537200, #  local_start 2024-03-31 03:00:00 (Sun)
  63865681200, #    local_end 2024-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63865674000, #    utc_start 2024-10-27 01:00:00 (Sun)
  63878979600, #      utc_end 2025-03-30 01:00:00 (Sun)
  63865677600, #  local_start 2024-10-27 02:00:00 (Sun)
  63878983200, #    local_end 2025-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63878979600, #    utc_start 2025-03-30 01:00:00 (Sun)
  63897123600, #      utc_end 2025-10-26 01:00:00 (Sun)
  63878986800, #  local_start 2025-03-30 03:00:00 (Sun)
  63897130800, #    local_end 2025-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63897123600, #    utc_start 2025-10-26 01:00:00 (Sun)
  63910429200, #      utc_end 2026-03-29 01:00:00 (Sun)
  63897127200, #  local_start 2025-10-26 02:00:00 (Sun)
  63910432800, #    local_end 2026-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63910429200, #    utc_start 2026-03-29 01:00:00 (Sun)
  63928573200, #      utc_end 2026-10-25 01:00:00 (Sun)
  63910436400, #  local_start 2026-03-29 03:00:00 (Sun)
  63928580400, #    local_end 2026-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63928573200, #    utc_start 2026-10-25 01:00:00 (Sun)
  63941878800, #      utc_end 2027-03-28 01:00:00 (Sun)
  63928576800, #  local_start 2026-10-25 02:00:00 (Sun)
  63941882400, #    local_end 2027-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63941878800, #    utc_start 2027-03-28 01:00:00 (Sun)
  63960627600, #      utc_end 2027-10-31 01:00:00 (Sun)
  63941886000, #  local_start 2027-03-28 03:00:00 (Sun)
  63960634800, #    local_end 2027-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63960627600, #    utc_start 2027-10-31 01:00:00 (Sun)
  63973328400, #      utc_end 2028-03-26 01:00:00 (Sun)
  63960631200, #  local_start 2027-10-31 02:00:00 (Sun)
  63973332000, #    local_end 2028-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63973328400, #    utc_start 2028-03-26 01:00:00 (Sun)
  63992077200, #      utc_end 2028-10-29 01:00:00 (Sun)
  63973335600, #  local_start 2028-03-26 03:00:00 (Sun)
  63992084400, #    local_end 2028-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63992077200, #    utc_start 2028-10-29 01:00:00 (Sun)
  64004778000, #      utc_end 2029-03-25 01:00:00 (Sun)
  63992080800, #  local_start 2028-10-29 02:00:00 (Sun)
  64004781600, #    local_end 2029-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  64004778000, #    utc_start 2029-03-25 01:00:00 (Sun)
  64023526800, #      utc_end 2029-10-28 01:00:00 (Sun)
  64004785200, #  local_start 2029-03-25 03:00:00 (Sun)
  64023534000, #    local_end 2029-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  64023526800, #    utc_start 2029-10-28 01:00:00 (Sun)
  64036832400, #      utc_end 2030-03-31 01:00:00 (Sun)
  64023530400, #  local_start 2029-10-28 02:00:00 (Sun)
  64036836000, #    local_end 2030-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  64036832400, #    utc_start 2030-03-31 01:00:00 (Sun)
  64054976400, #      utc_end 2030-10-27 01:00:00 (Sun)
  64036839600, #  local_start 2030-03-31 03:00:00 (Sun)
  64054983600, #    local_end 2030-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {89}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { 3600 }
  
  my $last_observance = bless( {
    'format' => 'CE%sT',
    'gmtoff' => '1:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 721720,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 721720,
      'utc_rd_secs' => 0,
      'utc_year' => 1978
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => 3600,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 721719,
      'local_rd_secs' => 82800,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 721719,
      'utc_rd_secs' => 82800,
      'utc_year' => 1977
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '1:00u',
      'from' => '1981',
      'in' => 'Mar',
      'letter' => 'S',
      'name' => 'EU',
      'offset_from_std' => 3600,
      'on' => 'lastSun',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '1:00u',
      'from' => '1996',
      'in' => 'Oct',
      'letter' => '',
      'name' => 'EU',
      'offset_from_std' => 0,
      'on' => 'lastSun',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_EUROPE_MONACO

    $main::fatpacked{"DateTime/TimeZone/Europe/Moscow.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_EUROPE_MOSCOW';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Europe::Moscow;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Europe::Moscow::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59295533383, #      utc_end 1879-12-31 21:29:43 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59295542400, #    local_end 1880-01-01 00:00:00 (Thu)
  9017,
  0,
  'LMT',
      ],
      [
  59295533383, #    utc_start 1879-12-31 21:29:43 (Wed)
  60447418183, #      utc_end 1916-07-02 21:29:43 (Sun)
  59295542400, #  local_start 1880-01-01 00:00:00 (Thu)
  60447427200, #    local_end 1916-07-03 00:00:00 (Mon)
  9017,
  0,
  'MMT',
      ],
      [
  60447418183, #    utc_start 1916-07-02 21:29:43 (Sun)
  60478864121, #      utc_end 1917-07-01 20:28:41 (Sun)
  60447427262, #  local_start 1916-07-03 00:01:02 (Mon)
  60478873200, #    local_end 1917-07-01 23:00:00 (Sun)
  9079,
  0,
  'MMT',
      ],
      [
  60478864121, #    utc_start 1917-07-01 20:28:41 (Sun)
  60494329721, #      utc_end 1917-12-27 20:28:41 (Thu)
  60478876800, #  local_start 1917-07-02 00:00:00 (Mon)
  60494342400, #    local_end 1917-12-28 00:00:00 (Fri)
  12679,
  1,
  'MST',
      ],
      [
  60494329721, #    utc_start 1917-12-27 20:28:41 (Thu)
  60507718121, #      utc_end 1918-05-31 19:28:41 (Fri)
  60494338800, #  local_start 1917-12-27 23:00:00 (Thu)
  60507727200, #    local_end 1918-05-31 22:00:00 (Fri)
  9079,
  0,
  'MMT',
      ],
      [
  60507718121, #    utc_start 1918-05-31 19:28:41 (Fri)
  60516966521, #      utc_end 1918-09-15 20:28:41 (Sun)
  60507734400, #  local_start 1918-06-01 00:00:00 (Sat)
  60516982800, #    local_end 1918-09-16 01:00:00 (Mon)
  16279,
  1,
  'MDST',
      ],
      [
  60516966521, #    utc_start 1918-09-15 20:28:41 (Sun)
  60539254121, #      utc_end 1919-05-31 19:28:41 (Sat)
  60516979200, #  local_start 1918-09-16 00:00:00 (Mon)
  60539266800, #    local_end 1919-05-31 23:00:00 (Sat)
  12679,
  1,
  'MST',
      ],
      [
  60539254121, #    utc_start 1919-05-31 19:28:41 (Sat)
  60541862400, #      utc_end 1919-07-01 00:00:00 (Tue)
  60539270400, #  local_start 1919-06-01 00:00:00 (Sun)
  60541878679, #    local_end 1919-07-01 04:31:19 (Tue)
  16279,
  1,
  'MDST',
      ],
      [
  60541862400, #    utc_start 1919-07-01 00:00:00 (Tue)
  60545822400, #      utc_end 1919-08-15 20:00:00 (Fri)
  60541876800, #  local_start 1919-07-01 04:00:00 (Tue)
  60545836800, #    local_end 1919-08-16 00:00:00 (Sat)
  14400,
  1,
  'MSD',
      ],
      [
  60545822400, #    utc_start 1919-08-15 20:00:00 (Fri)
  60593256000, #      utc_end 1921-02-14 20:00:00 (Mon)
  60545833200, #  local_start 1919-08-15 23:00:00 (Fri)
  60593266800, #    local_end 1921-02-14 23:00:00 (Mon)
  10800,
  0,
  'MSK',
      ],
      [
  60593256000, #    utc_start 1921-02-14 20:00:00 (Mon)
  60596190000, #      utc_end 1921-03-20 19:00:00 (Sun)
  60593270400, #  local_start 1921-02-15 00:00:00 (Tue)
  60596204400, #    local_end 1921-03-20 23:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  60596190000, #    utc_start 1921-03-20 19:00:00 (Sun)
  60610359600, #      utc_end 1921-08-31 19:00:00 (Wed)
  60596208000, #  local_start 1921-03-21 00:00:00 (Mon)
  60610377600, #    local_end 1921-09-01 00:00:00 (Thu)
  18000,
  1,
  '+05',
      ],
      [
  60610359600, #    utc_start 1921-08-31 19:00:00 (Wed)
  60612955200, #      utc_end 1921-09-30 20:00:00 (Fri)
  60610374000, #  local_start 1921-08-31 23:00:00 (Wed)
  60612969600, #    local_end 1921-10-01 00:00:00 (Sat)
  14400,
  1,
  'MSD',
      ],
      [
  60612955200, #    utc_start 1921-09-30 20:00:00 (Fri)
  60644494800, #      utc_end 1922-09-30 21:00:00 (Sat)
  60612966000, #  local_start 1921-09-30 23:00:00 (Fri)
  60644505600, #    local_end 1922-10-01 00:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  60644494800, #    utc_start 1922-09-30 21:00:00 (Sat)
  60888146400, #      utc_end 1930-06-20 22:00:00 (Fri)
  60644502000, #  local_start 1922-09-30 23:00:00 (Sat)
  60888153600, #    local_end 1930-06-21 00:00:00 (Sat)
  7200,
  0,
  'EET',
      ],
      [
  60888146400, #    utc_start 1930-06-20 22:00:00 (Fri)
  62490603600, #      utc_end 1981-03-31 21:00:00 (Tue)
  60888157200, #  local_start 1930-06-21 01:00:00 (Sat)
  62490614400, #    local_end 1981-04-01 00:00:00 (Wed)
  10800,
  0,
  'MSK',
      ],
      [
  62490603600, #    utc_start 1981-03-31 21:00:00 (Tue)
  62506411200, #      utc_end 1981-09-30 20:00:00 (Wed)
  62490618000, #  local_start 1981-04-01 01:00:00 (Wed)
  62506425600, #    local_end 1981-10-01 00:00:00 (Thu)
  14400,
  1,
  'MSD',
      ],
      [
  62506411200, #    utc_start 1981-09-30 20:00:00 (Wed)
  62522139600, #      utc_end 1982-03-31 21:00:00 (Wed)
  62506422000, #  local_start 1981-09-30 23:00:00 (Wed)
  62522150400, #    local_end 1982-04-01 00:00:00 (Thu)
  10800,
  0,
  'MSK',
      ],
      [
  62522139600, #    utc_start 1982-03-31 21:00:00 (Wed)
  62537947200, #      utc_end 1982-09-30 20:00:00 (Thu)
  62522154000, #  local_start 1982-04-01 01:00:00 (Thu)
  62537961600, #    local_end 1982-10-01 00:00:00 (Fri)
  14400,
  1,
  'MSD',
      ],
      [
  62537947200, #    utc_start 1982-09-30 20:00:00 (Thu)
  62553675600, #      utc_end 1983-03-31 21:00:00 (Thu)
  62537958000, #  local_start 1982-09-30 23:00:00 (Thu)
  62553686400, #    local_end 1983-04-01 00:00:00 (Fri)
  10800,
  0,
  'MSK',
      ],
      [
  62553675600, #    utc_start 1983-03-31 21:00:00 (Thu)
  62569483200, #      utc_end 1983-09-30 20:00:00 (Fri)
  62553690000, #  local_start 1983-04-01 01:00:00 (Fri)
  62569497600, #    local_end 1983-10-01 00:00:00 (Sat)
  14400,
  1,
  'MSD',
      ],
      [
  62569483200, #    utc_start 1983-09-30 20:00:00 (Fri)
  62585298000, #      utc_end 1984-03-31 21:00:00 (Sat)
  62569494000, #  local_start 1983-09-30 23:00:00 (Fri)
  62585308800, #    local_end 1984-04-01 00:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62585298000, #    utc_start 1984-03-31 21:00:00 (Sat)
  62601030000, #      utc_end 1984-09-29 23:00:00 (Sat)
  62585312400, #  local_start 1984-04-01 01:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62601030000, #    utc_start 1984-09-29 23:00:00 (Sat)
  62616754800, #      utc_end 1985-03-30 23:00:00 (Sat)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62616754800, #    utc_start 1985-03-30 23:00:00 (Sat)
  62632479600, #      utc_end 1985-09-28 23:00:00 (Sat)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62632479600, #    utc_start 1985-09-28 23:00:00 (Sat)
  62648204400, #      utc_end 1986-03-29 23:00:00 (Sat)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62648204400, #    utc_start 1986-03-29 23:00:00 (Sat)
  62663929200, #      utc_end 1986-09-27 23:00:00 (Sat)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62663929200, #    utc_start 1986-09-27 23:00:00 (Sat)
  62679654000, #      utc_end 1987-03-28 23:00:00 (Sat)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62679654000, #    utc_start 1987-03-28 23:00:00 (Sat)
  62695378800, #      utc_end 1987-09-26 23:00:00 (Sat)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62695378800, #    utc_start 1987-09-26 23:00:00 (Sat)
  62711103600, #      utc_end 1988-03-26 23:00:00 (Sat)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62711103600, #    utc_start 1988-03-26 23:00:00 (Sat)
  62726828400, #      utc_end 1988-09-24 23:00:00 (Sat)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62726828400, #    utc_start 1988-09-24 23:00:00 (Sat)
  62742553200, #      utc_end 1989-03-25 23:00:00 (Sat)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62742553200, #    utc_start 1989-03-25 23:00:00 (Sat)
  62758278000, #      utc_end 1989-09-23 23:00:00 (Sat)
  62742567600, #  local_start 1989-03-26 03:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62758278000, #    utc_start 1989-09-23 23:00:00 (Sat)
  62774002800, #      utc_end 1990-03-24 23:00:00 (Sat)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62774002800, #    utc_start 1990-03-24 23:00:00 (Sat)
  62790332400, #      utc_end 1990-09-29 23:00:00 (Sat)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62790332400, #    utc_start 1990-09-29 23:00:00 (Sat)
  62806057200, #      utc_end 1991-03-30 23:00:00 (Sat)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62806057200, #    utc_start 1991-03-30 23:00:00 (Sat)
  62821785600, #      utc_end 1991-09-29 00:00:00 (Sun)
  62806068000, #  local_start 1991-03-31 02:00:00 (Sun)
  62821796400, #    local_end 1991-09-29 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62821785600, #    utc_start 1991-09-29 00:00:00 (Sun)
  62831462400, #      utc_end 1992-01-19 00:00:00 (Sun)
  62821792800, #  local_start 1991-09-29 02:00:00 (Sun)
  62831469600, #    local_end 1992-01-19 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62831462400, #    utc_start 1992-01-19 00:00:00 (Sun)
  62837506800, #      utc_end 1992-03-28 23:00:00 (Sat)
  62831473200, #  local_start 1992-01-19 03:00:00 (Sun)
  62837517600, #    local_end 1992-03-29 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62837506800, #    utc_start 1992-03-28 23:00:00 (Sat)
  62853231600, #      utc_end 1992-09-26 23:00:00 (Sat)
  62837521200, #  local_start 1992-03-29 03:00:00 (Sun)
  62853246000, #    local_end 1992-09-27 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62853231600, #    utc_start 1992-09-26 23:00:00 (Sat)
  62868956400, #      utc_end 1993-03-27 23:00:00 (Sat)
  62853242400, #  local_start 1992-09-27 02:00:00 (Sun)
  62868967200, #    local_end 1993-03-28 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62868956400, #    utc_start 1993-03-27 23:00:00 (Sat)
  62884681200, #      utc_end 1993-09-25 23:00:00 (Sat)
  62868970800, #  local_start 1993-03-28 03:00:00 (Sun)
  62884695600, #    local_end 1993-09-26 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62884681200, #    utc_start 1993-09-25 23:00:00 (Sat)
  62900406000, #      utc_end 1994-03-26 23:00:00 (Sat)
  62884692000, #  local_start 1993-09-26 02:00:00 (Sun)
  62900416800, #    local_end 1994-03-27 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62900406000, #    utc_start 1994-03-26 23:00:00 (Sat)
  62916130800, #      utc_end 1994-09-24 23:00:00 (Sat)
  62900420400, #  local_start 1994-03-27 03:00:00 (Sun)
  62916145200, #    local_end 1994-09-25 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62916130800, #    utc_start 1994-09-24 23:00:00 (Sat)
  62931855600, #      utc_end 1995-03-25 23:00:00 (Sat)
  62916141600, #  local_start 1994-09-25 02:00:00 (Sun)
  62931866400, #    local_end 1995-03-26 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62931855600, #    utc_start 1995-03-25 23:00:00 (Sat)
  62947580400, #      utc_end 1995-09-23 23:00:00 (Sat)
  62931870000, #  local_start 1995-03-26 03:00:00 (Sun)
  62947594800, #    local_end 1995-09-24 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62947580400, #    utc_start 1995-09-23 23:00:00 (Sat)
  62963910000, #      utc_end 1996-03-30 23:00:00 (Sat)
  62947591200, #  local_start 1995-09-24 02:00:00 (Sun)
  62963920800, #    local_end 1996-03-31 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62963910000, #    utc_start 1996-03-30 23:00:00 (Sat)
  62982054000, #      utc_end 1996-10-26 23:00:00 (Sat)
  62963924400, #  local_start 1996-03-31 03:00:00 (Sun)
  62982068400, #    local_end 1996-10-27 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62982054000, #    utc_start 1996-10-26 23:00:00 (Sat)
  62995359600, #      utc_end 1997-03-29 23:00:00 (Sat)
  62982064800, #  local_start 1996-10-27 02:00:00 (Sun)
  62995370400, #    local_end 1997-03-30 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62995359600, #    utc_start 1997-03-29 23:00:00 (Sat)
  63013503600, #      utc_end 1997-10-25 23:00:00 (Sat)
  62995374000, #  local_start 1997-03-30 03:00:00 (Sun)
  63013518000, #    local_end 1997-10-26 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  63013503600, #    utc_start 1997-10-25 23:00:00 (Sat)
  63026809200, #      utc_end 1998-03-28 23:00:00 (Sat)
  63013514400, #  local_start 1997-10-26 02:00:00 (Sun)
  63026820000, #    local_end 1998-03-29 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  63026809200, #    utc_start 1998-03-28 23:00:00 (Sat)
  63044953200, #      utc_end 1998-10-24 23:00:00 (Sat)
  63026823600, #  local_start 1998-03-29 03:00:00 (Sun)
  63044967600, #    local_end 1998-10-25 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  63044953200, #    utc_start 1998-10-24 23:00:00 (Sat)
  63058258800, #      utc_end 1999-03-27 23:00:00 (Sat)
  63044964000, #  local_start 1998-10-25 02:00:00 (Sun)
  63058269600, #    local_end 1999-03-28 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  63058258800, #    utc_start 1999-03-27 23:00:00 (Sat)
  63077007600, #      utc_end 1999-10-30 23:00:00 (Sat)
  63058273200, #  local_start 1999-03-28 03:00:00 (Sun)
  63077022000, #    local_end 1999-10-31 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  63077007600, #    utc_start 1999-10-30 23:00:00 (Sat)
  63089708400, #      utc_end 2000-03-25 23:00:00 (Sat)
  63077018400, #  local_start 1999-10-31 02:00:00 (Sun)
  63089719200, #    local_end 2000-03-26 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  63089708400, #    utc_start 2000-03-25 23:00:00 (Sat)
  63108457200, #      utc_end 2000-10-28 23:00:00 (Sat)
  63089722800, #  local_start 2000-03-26 03:00:00 (Sun)
  63108471600, #    local_end 2000-10-29 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  63108457200, #    utc_start 2000-10-28 23:00:00 (Sat)
  63121158000, #      utc_end 2001-03-24 23:00:00 (Sat)
  63108468000, #  local_start 2000-10-29 02:00:00 (Sun)
  63121168800, #    local_end 2001-03-25 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  63121158000, #    utc_start 2001-03-24 23:00:00 (Sat)
  63139906800, #      utc_end 2001-10-27 23:00:00 (Sat)
  63121172400, #  local_start 2001-03-25 03:00:00 (Sun)
  63139921200, #    local_end 2001-10-28 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  63139906800, #    utc_start 2001-10-27 23:00:00 (Sat)
  63153212400, #      utc_end 2002-03-30 23:00:00 (Sat)
  63139917600, #  local_start 2001-10-28 02:00:00 (Sun)
  63153223200, #    local_end 2002-03-31 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  63153212400, #    utc_start 2002-03-30 23:00:00 (Sat)
  63171356400, #      utc_end 2002-10-26 23:00:00 (Sat)
  63153226800, #  local_start 2002-03-31 03:00:00 (Sun)
  63171370800, #    local_end 2002-10-27 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  63171356400, #    utc_start 2002-10-26 23:00:00 (Sat)
  63184662000, #      utc_end 2003-03-29 23:00:00 (Sat)
  63171367200, #  local_start 2002-10-27 02:00:00 (Sun)
  63184672800, #    local_end 2003-03-30 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  63184662000, #    utc_start 2003-03-29 23:00:00 (Sat)
  63202806000, #      utc_end 2003-10-25 23:00:00 (Sat)
  63184676400, #  local_start 2003-03-30 03:00:00 (Sun)
  63202820400, #    local_end 2003-10-26 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  63202806000, #    utc_start 2003-10-25 23:00:00 (Sat)
  63216111600, #      utc_end 2004-03-27 23:00:00 (Sat)
  63202816800, #  local_start 2003-10-26 02:00:00 (Sun)
  63216122400, #    local_end 2004-03-28 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  63216111600, #    utc_start 2004-03-27 23:00:00 (Sat)
  63234860400, #      utc_end 2004-10-30 23:00:00 (Sat)
  63216126000, #  local_start 2004-03-28 03:00:00 (Sun)
  63234874800, #    local_end 2004-10-31 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  63234860400, #    utc_start 2004-10-30 23:00:00 (Sat)
  63247561200, #      utc_end 2005-03-26 23:00:00 (Sat)
  63234871200, #  local_start 2004-10-31 02:00:00 (Sun)
  63247572000, #    local_end 2005-03-27 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  63247561200, #    utc_start 2005-03-26 23:00:00 (Sat)
  63266310000, #      utc_end 2005-10-29 23:00:00 (Sat)
  63247575600, #  local_start 2005-03-27 03:00:00 (Sun)
  63266324400, #    local_end 2005-10-30 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  63266310000, #    utc_start 2005-10-29 23:00:00 (Sat)
  63279010800, #      utc_end 2006-03-25 23:00:00 (Sat)
  63266320800, #  local_start 2005-10-30 02:00:00 (Sun)
  63279021600, #    local_end 2006-03-26 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  63279010800, #    utc_start 2006-03-25 23:00:00 (Sat)
  63297759600, #      utc_end 2006-10-28 23:00:00 (Sat)
  63279025200, #  local_start 2006-03-26 03:00:00 (Sun)
  63297774000, #    local_end 2006-10-29 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  63297759600, #    utc_start 2006-10-28 23:00:00 (Sat)
  63310460400, #      utc_end 2007-03-24 23:00:00 (Sat)
  63297770400, #  local_start 2006-10-29 02:00:00 (Sun)
  63310471200, #    local_end 2007-03-25 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  63310460400, #    utc_start 2007-03-24 23:00:00 (Sat)
  63329209200, #      utc_end 2007-10-27 23:00:00 (Sat)
  63310474800, #  local_start 2007-03-25 03:00:00 (Sun)
  63329223600, #    local_end 2007-10-28 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  63329209200, #    utc_start 2007-10-27 23:00:00 (Sat)
  63342514800, #      utc_end 2008-03-29 23:00:00 (Sat)
  63329220000, #  local_start 2007-10-28 02:00:00 (Sun)
  63342525600, #    local_end 2008-03-30 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  63342514800, #    utc_start 2008-03-29 23:00:00 (Sat)
  63360658800, #      utc_end 2008-10-25 23:00:00 (Sat)
  63342529200, #  local_start 2008-03-30 03:00:00 (Sun)
  63360673200, #    local_end 2008-10-26 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  63360658800, #    utc_start 2008-10-25 23:00:00 (Sat)
  63373964400, #      utc_end 2009-03-28 23:00:00 (Sat)
  63360669600, #  local_start 2008-10-26 02:00:00 (Sun)
  63373975200, #    local_end 2009-03-29 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  63373964400, #    utc_start 2009-03-28 23:00:00 (Sat)
  63392108400, #      utc_end 2009-10-24 23:00:00 (Sat)
  63373978800, #  local_start 2009-03-29 03:00:00 (Sun)
  63392122800, #    local_end 2009-10-25 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  63392108400, #    utc_start 2009-10-24 23:00:00 (Sat)
  63405414000, #      utc_end 2010-03-27 23:00:00 (Sat)
  63392119200, #  local_start 2009-10-25 02:00:00 (Sun)
  63405424800, #    local_end 2010-03-28 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  63405414000, #    utc_start 2010-03-27 23:00:00 (Sat)
  63424162800, #      utc_end 2010-10-30 23:00:00 (Sat)
  63405428400, #  local_start 2010-03-28 03:00:00 (Sun)
  63424177200, #    local_end 2010-10-31 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  63424162800, #    utc_start 2010-10-30 23:00:00 (Sat)
  63436863600, #      utc_end 2011-03-26 23:00:00 (Sat)
  63424173600, #  local_start 2010-10-31 02:00:00 (Sun)
  63436874400, #    local_end 2011-03-27 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  63436863600, #    utc_start 2011-03-26 23:00:00 (Sat)
  63549957600, #      utc_end 2014-10-25 22:00:00 (Sat)
  63436878000, #  local_start 2011-03-27 03:00:00 (Sun)
  63549972000, #    local_end 2014-10-26 02:00:00 (Sun)
  14400,
  0,
  'MSK',
      ],
      [
  63549957600, #    utc_start 2014-10-25 22:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  63549968400, #  local_start 2014-10-26 01:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  10800,
  0,
  'MSK',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {38}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_EUROPE_MOSCOW

    $main::fatpacked{"DateTime/TimeZone/Europe/Oslo.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_EUROPE_OSLO';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Europe::Oslo;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Europe::Oslo::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59768925420, #      utc_end 1894-12-31 23:17:00 (Mon)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59768928000, #    local_end 1895-01-01 00:00:00 (Tue)
  2580,
  0,
  'LMT',
      ],
      [
  59768925420, #    utc_start 1894-12-31 23:17:00 (Mon)
  60443798400, #      utc_end 1916-05-22 00:00:00 (Mon)
  59768929020, #  local_start 1895-01-01 00:17:00 (Tue)
  60443802000, #    local_end 1916-05-22 01:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  60443798400, #    utc_start 1916-05-22 00:00:00 (Mon)
  60455109600, #      utc_end 1916-09-29 22:00:00 (Fri)
  60443805600, #  local_start 1916-05-22 02:00:00 (Mon)
  60455116800, #    local_end 1916-09-30 00:00:00 (Sat)
  7200,
  1,
  'CEST',
      ],
      [
  60455109600, #    utc_start 1916-09-29 22:00:00 (Fri)
  61208172000, #      utc_end 1940-08-10 22:00:00 (Sat)
  60455113200, #  local_start 1916-09-29 23:00:00 (Fri)
  61208175600, #    local_end 1940-08-10 23:00:00 (Sat)
  3600,
  0,
  'CET',
      ],
      [
  61208172000, #    utc_start 1940-08-10 22:00:00 (Sat)
  61278426000, #      utc_end 1942-11-02 01:00:00 (Mon)
  61208179200, #  local_start 1940-08-11 00:00:00 (Sun)
  61278433200, #    local_end 1942-11-02 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61278426000, #    utc_start 1942-11-02 01:00:00 (Mon)
  61291126800, #      utc_end 1943-03-29 01:00:00 (Mon)
  61278429600, #  local_start 1942-11-02 02:00:00 (Mon)
  61291130400, #    local_end 1943-03-29 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61291126800, #    utc_start 1943-03-29 01:00:00 (Mon)
  61307456400, #      utc_end 1943-10-04 01:00:00 (Mon)
  61291134000, #  local_start 1943-03-29 03:00:00 (Mon)
  61307463600, #    local_end 1943-10-04 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61307456400, #    utc_start 1943-10-04 01:00:00 (Mon)
  61323181200, #      utc_end 1944-04-03 01:00:00 (Mon)
  61307460000, #  local_start 1943-10-04 02:00:00 (Mon)
  61323184800, #    local_end 1944-04-03 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61323181200, #    utc_start 1944-04-03 01:00:00 (Mon)
  61338906000, #      utc_end 1944-10-02 01:00:00 (Mon)
  61323188400, #  local_start 1944-04-03 03:00:00 (Mon)
  61338913200, #    local_end 1944-10-02 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61338906000, #    utc_start 1944-10-02 01:00:00 (Mon)
  61354630800, #      utc_end 1945-04-02 01:00:00 (Mon)
  61338909600, #  local_start 1944-10-02 02:00:00 (Mon)
  61354634400, #    local_end 1945-04-02 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61354630800, #    utc_start 1945-04-02 01:00:00 (Mon)
  61370355600, #      utc_end 1945-10-01 01:00:00 (Mon)
  61354638000, #  local_start 1945-04-02 03:00:00 (Mon)
  61370362800, #    local_end 1945-10-01 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61370355600, #    utc_start 1945-10-01 01:00:00 (Mon)
  61794838800, #      utc_end 1959-03-15 01:00:00 (Sun)
  61370359200, #  local_start 1945-10-01 02:00:00 (Mon)
  61794842400, #    local_end 1959-03-15 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  61794838800, #    utc_start 1959-03-15 01:00:00 (Sun)
  61811168400, #      utc_end 1959-09-20 01:00:00 (Sun)
  61794846000, #  local_start 1959-03-15 03:00:00 (Sun)
  61811175600, #    local_end 1959-09-20 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  61811168400, #    utc_start 1959-09-20 01:00:00 (Sun)
  61826893200, #      utc_end 1960-03-20 01:00:00 (Sun)
  61811172000, #  local_start 1959-09-20 02:00:00 (Sun)
  61826896800, #    local_end 1960-03-20 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  61826893200, #    utc_start 1960-03-20 01:00:00 (Sun)
  61842618000, #      utc_end 1960-09-18 01:00:00 (Sun)
  61826900400, #  local_start 1960-03-20 03:00:00 (Sun)
  61842625200, #    local_end 1960-09-18 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  61842618000, #    utc_start 1960-09-18 01:00:00 (Sun)
  61858342800, #      utc_end 1961-03-19 01:00:00 (Sun)
  61842621600, #  local_start 1960-09-18 02:00:00 (Sun)
  61858346400, #    local_end 1961-03-19 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  61858342800, #    utc_start 1961-03-19 01:00:00 (Sun)
  61874067600, #      utc_end 1961-09-17 01:00:00 (Sun)
  61858350000, #  local_start 1961-03-19 03:00:00 (Sun)
  61874074800, #    local_end 1961-09-17 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  61874067600, #    utc_start 1961-09-17 01:00:00 (Sun)
  61889792400, #      utc_end 1962-03-18 01:00:00 (Sun)
  61874071200, #  local_start 1961-09-17 02:00:00 (Sun)
  61889796000, #    local_end 1962-03-18 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  61889792400, #    utc_start 1962-03-18 01:00:00 (Sun)
  61905517200, #      utc_end 1962-09-16 01:00:00 (Sun)
  61889799600, #  local_start 1962-03-18 03:00:00 (Sun)
  61905524400, #    local_end 1962-09-16 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  61905517200, #    utc_start 1962-09-16 01:00:00 (Sun)
  61921242000, #      utc_end 1963-03-17 01:00:00 (Sun)
  61905520800, #  local_start 1962-09-16 02:00:00 (Sun)
  61921245600, #    local_end 1963-03-17 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  61921242000, #    utc_start 1963-03-17 01:00:00 (Sun)
  61936966800, #      utc_end 1963-09-15 01:00:00 (Sun)
  61921249200, #  local_start 1963-03-17 03:00:00 (Sun)
  61936974000, #    local_end 1963-09-15 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  61936966800, #    utc_start 1963-09-15 01:00:00 (Sun)
  61952691600, #      utc_end 1964-03-15 01:00:00 (Sun)
  61936970400, #  local_start 1963-09-15 02:00:00 (Sun)
  61952695200, #    local_end 1964-03-15 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  61952691600, #    utc_start 1964-03-15 01:00:00 (Sun)
  61969021200, #      utc_end 1964-09-20 01:00:00 (Sun)
  61952698800, #  local_start 1964-03-15 03:00:00 (Sun)
  61969028400, #    local_end 1964-09-20 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  61969021200, #    utc_start 1964-09-20 01:00:00 (Sun)
  61987770000, #      utc_end 1965-04-25 01:00:00 (Sun)
  61969024800, #  local_start 1964-09-20 02:00:00 (Sun)
  61987773600, #    local_end 1965-04-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  61987770000, #    utc_start 1965-04-25 01:00:00 (Sun)
  62000470800, #      utc_end 1965-09-19 01:00:00 (Sun)
  61987777200, #  local_start 1965-04-25 03:00:00 (Sun)
  62000478000, #    local_end 1965-09-19 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62000470800, #    utc_start 1965-09-19 01:00:00 (Sun)
  62451212400, #      utc_end 1979-12-31 23:00:00 (Mon)
  62000474400, #  local_start 1965-09-19 02:00:00 (Sun)
  62451216000, #    local_end 1980-01-01 00:00:00 (Tue)
  3600,
  0,
  'CET',
      ],
      [
  62451212400, #    utc_start 1979-12-31 23:00:00 (Mon)
  62459514000, #      utc_end 1980-04-06 01:00:00 (Sun)
  62451216000, #  local_start 1980-01-01 00:00:00 (Tue)
  62459517600, #    local_end 1980-04-06 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62459514000, #    utc_start 1980-04-06 01:00:00 (Sun)
  62474634000, #      utc_end 1980-09-28 01:00:00 (Sun)
  62459521200, #  local_start 1980-04-06 03:00:00 (Sun)
  62474641200, #    local_end 1980-09-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62474634000, #    utc_start 1980-09-28 01:00:00 (Sun)
  62490358800, #      utc_end 1981-03-29 01:00:00 (Sun)
  62474637600, #  local_start 1980-09-28 02:00:00 (Sun)
  62490362400, #    local_end 1981-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62490358800, #    utc_start 1981-03-29 01:00:00 (Sun)
  62506083600, #      utc_end 1981-09-27 01:00:00 (Sun)
  62490366000, #  local_start 1981-03-29 03:00:00 (Sun)
  62506090800, #    local_end 1981-09-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62506083600, #    utc_start 1981-09-27 01:00:00 (Sun)
  62521808400, #      utc_end 1982-03-28 01:00:00 (Sun)
  62506087200, #  local_start 1981-09-27 02:00:00 (Sun)
  62521812000, #    local_end 1982-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62521808400, #    utc_start 1982-03-28 01:00:00 (Sun)
  62537533200, #      utc_end 1982-09-26 01:00:00 (Sun)
  62521815600, #  local_start 1982-03-28 03:00:00 (Sun)
  62537540400, #    local_end 1982-09-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62537533200, #    utc_start 1982-09-26 01:00:00 (Sun)
  62553258000, #      utc_end 1983-03-27 01:00:00 (Sun)
  62537536800, #  local_start 1982-09-26 02:00:00 (Sun)
  62553261600, #    local_end 1983-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62553258000, #    utc_start 1983-03-27 01:00:00 (Sun)
  62568982800, #      utc_end 1983-09-25 01:00:00 (Sun)
  62553265200, #  local_start 1983-03-27 03:00:00 (Sun)
  62568990000, #    local_end 1983-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62568982800, #    utc_start 1983-09-25 01:00:00 (Sun)
  62584707600, #      utc_end 1984-03-25 01:00:00 (Sun)
  62568986400, #  local_start 1983-09-25 02:00:00 (Sun)
  62584711200, #    local_end 1984-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62584707600, #    utc_start 1984-03-25 01:00:00 (Sun)
  62601037200, #      utc_end 1984-09-30 01:00:00 (Sun)
  62584714800, #  local_start 1984-03-25 03:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62601037200, #    utc_start 1984-09-30 01:00:00 (Sun)
  62616762000, #      utc_end 1985-03-31 01:00:00 (Sun)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62616762000, #    utc_start 1985-03-31 01:00:00 (Sun)
  62632486800, #      utc_end 1985-09-29 01:00:00 (Sun)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62632486800, #    utc_start 1985-09-29 01:00:00 (Sun)
  62648211600, #      utc_end 1986-03-30 01:00:00 (Sun)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62648211600, #    utc_start 1986-03-30 01:00:00 (Sun)
  62663936400, #      utc_end 1986-09-28 01:00:00 (Sun)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62663936400, #    utc_start 1986-09-28 01:00:00 (Sun)
  62679661200, #      utc_end 1987-03-29 01:00:00 (Sun)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62679661200, #    utc_start 1987-03-29 01:00:00 (Sun)
  62695386000, #      utc_end 1987-09-27 01:00:00 (Sun)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62695386000, #    utc_start 1987-09-27 01:00:00 (Sun)
  62711110800, #      utc_end 1988-03-27 01:00:00 (Sun)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62711110800, #    utc_start 1988-03-27 01:00:00 (Sun)
  62726835600, #      utc_end 1988-09-25 01:00:00 (Sun)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62726835600, #    utc_start 1988-09-25 01:00:00 (Sun)
  62742560400, #      utc_end 1989-03-26 01:00:00 (Sun)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62742560400, #    utc_start 1989-03-26 01:00:00 (Sun)
  62758285200, #      utc_end 1989-09-24 01:00:00 (Sun)
  62742567600, #  local_start 1989-03-26 03:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62758285200, #    utc_start 1989-09-24 01:00:00 (Sun)
  62774010000, #      utc_end 1990-03-25 01:00:00 (Sun)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62774010000, #    utc_start 1990-03-25 01:00:00 (Sun)
  62790339600, #      utc_end 1990-09-30 01:00:00 (Sun)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62790339600, #    utc_start 1990-09-30 01:00:00 (Sun)
  62806064400, #      utc_end 1991-03-31 01:00:00 (Sun)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62806064400, #    utc_start 1991-03-31 01:00:00 (Sun)
  62821789200, #      utc_end 1991-09-29 01:00:00 (Sun)
  62806071600, #  local_start 1991-03-31 03:00:00 (Sun)
  62821796400, #    local_end 1991-09-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62821789200, #    utc_start 1991-09-29 01:00:00 (Sun)
  62837514000, #      utc_end 1992-03-29 01:00:00 (Sun)
  62821792800, #  local_start 1991-09-29 02:00:00 (Sun)
  62837517600, #    local_end 1992-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62837514000, #    utc_start 1992-03-29 01:00:00 (Sun)
  62853238800, #      utc_end 1992-09-27 01:00:00 (Sun)
  62837521200, #  local_start 1992-03-29 03:00:00 (Sun)
  62853246000, #    local_end 1992-09-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62853238800, #    utc_start 1992-09-27 01:00:00 (Sun)
  62868963600, #      utc_end 1993-03-28 01:00:00 (Sun)
  62853242400, #  local_start 1992-09-27 02:00:00 (Sun)
  62868967200, #    local_end 1993-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62868963600, #    utc_start 1993-03-28 01:00:00 (Sun)
  62884688400, #      utc_end 1993-09-26 01:00:00 (Sun)
  62868970800, #  local_start 1993-03-28 03:00:00 (Sun)
  62884695600, #    local_end 1993-09-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62884688400, #    utc_start 1993-09-26 01:00:00 (Sun)
  62900413200, #      utc_end 1994-03-27 01:00:00 (Sun)
  62884692000, #  local_start 1993-09-26 02:00:00 (Sun)
  62900416800, #    local_end 1994-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62900413200, #    utc_start 1994-03-27 01:00:00 (Sun)
  62916138000, #      utc_end 1994-09-25 01:00:00 (Sun)
  62900420400, #  local_start 1994-03-27 03:00:00 (Sun)
  62916145200, #    local_end 1994-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62916138000, #    utc_start 1994-09-25 01:00:00 (Sun)
  62931862800, #      utc_end 1995-03-26 01:00:00 (Sun)
  62916141600, #  local_start 1994-09-25 02:00:00 (Sun)
  62931866400, #    local_end 1995-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62931862800, #    utc_start 1995-03-26 01:00:00 (Sun)
  62947587600, #      utc_end 1995-09-24 01:00:00 (Sun)
  62931870000, #  local_start 1995-03-26 03:00:00 (Sun)
  62947594800, #    local_end 1995-09-24 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62947587600, #    utc_start 1995-09-24 01:00:00 (Sun)
  62963917200, #      utc_end 1996-03-31 01:00:00 (Sun)
  62947591200, #  local_start 1995-09-24 02:00:00 (Sun)
  62963920800, #    local_end 1996-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62963917200, #    utc_start 1996-03-31 01:00:00 (Sun)
  62982061200, #      utc_end 1996-10-27 01:00:00 (Sun)
  62963924400, #  local_start 1996-03-31 03:00:00 (Sun)
  62982068400, #    local_end 1996-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62982061200, #    utc_start 1996-10-27 01:00:00 (Sun)
  62995366800, #      utc_end 1997-03-30 01:00:00 (Sun)
  62982064800, #  local_start 1996-10-27 02:00:00 (Sun)
  62995370400, #    local_end 1997-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62995366800, #    utc_start 1997-03-30 01:00:00 (Sun)
  63013510800, #      utc_end 1997-10-26 01:00:00 (Sun)
  62995374000, #  local_start 1997-03-30 03:00:00 (Sun)
  63013518000, #    local_end 1997-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63013510800, #    utc_start 1997-10-26 01:00:00 (Sun)
  63026816400, #      utc_end 1998-03-29 01:00:00 (Sun)
  63013514400, #  local_start 1997-10-26 02:00:00 (Sun)
  63026820000, #    local_end 1998-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63026816400, #    utc_start 1998-03-29 01:00:00 (Sun)
  63044960400, #      utc_end 1998-10-25 01:00:00 (Sun)
  63026823600, #  local_start 1998-03-29 03:00:00 (Sun)
  63044967600, #    local_end 1998-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63044960400, #    utc_start 1998-10-25 01:00:00 (Sun)
  63058266000, #      utc_end 1999-03-28 01:00:00 (Sun)
  63044964000, #  local_start 1998-10-25 02:00:00 (Sun)
  63058269600, #    local_end 1999-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63058266000, #    utc_start 1999-03-28 01:00:00 (Sun)
  63077014800, #      utc_end 1999-10-31 01:00:00 (Sun)
  63058273200, #  local_start 1999-03-28 03:00:00 (Sun)
  63077022000, #    local_end 1999-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63077014800, #    utc_start 1999-10-31 01:00:00 (Sun)
  63089715600, #      utc_end 2000-03-26 01:00:00 (Sun)
  63077018400, #  local_start 1999-10-31 02:00:00 (Sun)
  63089719200, #    local_end 2000-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63089715600, #    utc_start 2000-03-26 01:00:00 (Sun)
  63108464400, #      utc_end 2000-10-29 01:00:00 (Sun)
  63089722800, #  local_start 2000-03-26 03:00:00 (Sun)
  63108471600, #    local_end 2000-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63108464400, #    utc_start 2000-10-29 01:00:00 (Sun)
  63121165200, #      utc_end 2001-03-25 01:00:00 (Sun)
  63108468000, #  local_start 2000-10-29 02:00:00 (Sun)
  63121168800, #    local_end 2001-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63121165200, #    utc_start 2001-03-25 01:00:00 (Sun)
  63139914000, #      utc_end 2001-10-28 01:00:00 (Sun)
  63121172400, #  local_start 2001-03-25 03:00:00 (Sun)
  63139921200, #    local_end 2001-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63139914000, #    utc_start 2001-10-28 01:00:00 (Sun)
  63153219600, #      utc_end 2002-03-31 01:00:00 (Sun)
  63139917600, #  local_start 2001-10-28 02:00:00 (Sun)
  63153223200, #    local_end 2002-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63153219600, #    utc_start 2002-03-31 01:00:00 (Sun)
  63171363600, #      utc_end 2002-10-27 01:00:00 (Sun)
  63153226800, #  local_start 2002-03-31 03:00:00 (Sun)
  63171370800, #    local_end 2002-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63171363600, #    utc_start 2002-10-27 01:00:00 (Sun)
  63184669200, #      utc_end 2003-03-30 01:00:00 (Sun)
  63171367200, #  local_start 2002-10-27 02:00:00 (Sun)
  63184672800, #    local_end 2003-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63184669200, #    utc_start 2003-03-30 01:00:00 (Sun)
  63202813200, #      utc_end 2003-10-26 01:00:00 (Sun)
  63184676400, #  local_start 2003-03-30 03:00:00 (Sun)
  63202820400, #    local_end 2003-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63202813200, #    utc_start 2003-10-26 01:00:00 (Sun)
  63216118800, #      utc_end 2004-03-28 01:00:00 (Sun)
  63202816800, #  local_start 2003-10-26 02:00:00 (Sun)
  63216122400, #    local_end 2004-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63216118800, #    utc_start 2004-03-28 01:00:00 (Sun)
  63234867600, #      utc_end 2004-10-31 01:00:00 (Sun)
  63216126000, #  local_start 2004-03-28 03:00:00 (Sun)
  63234874800, #    local_end 2004-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63234867600, #    utc_start 2004-10-31 01:00:00 (Sun)
  63247568400, #      utc_end 2005-03-27 01:00:00 (Sun)
  63234871200, #  local_start 2004-10-31 02:00:00 (Sun)
  63247572000, #    local_end 2005-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63247568400, #    utc_start 2005-03-27 01:00:00 (Sun)
  63266317200, #      utc_end 2005-10-30 01:00:00 (Sun)
  63247575600, #  local_start 2005-03-27 03:00:00 (Sun)
  63266324400, #    local_end 2005-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63266317200, #    utc_start 2005-10-30 01:00:00 (Sun)
  63279018000, #      utc_end 2006-03-26 01:00:00 (Sun)
  63266320800, #  local_start 2005-10-30 02:00:00 (Sun)
  63279021600, #    local_end 2006-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63279018000, #    utc_start 2006-03-26 01:00:00 (Sun)
  63297766800, #      utc_end 2006-10-29 01:00:00 (Sun)
  63279025200, #  local_start 2006-03-26 03:00:00 (Sun)
  63297774000, #    local_end 2006-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63297766800, #    utc_start 2006-10-29 01:00:00 (Sun)
  63310467600, #      utc_end 2007-03-25 01:00:00 (Sun)
  63297770400, #  local_start 2006-10-29 02:00:00 (Sun)
  63310471200, #    local_end 2007-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63310467600, #    utc_start 2007-03-25 01:00:00 (Sun)
  63329216400, #      utc_end 2007-10-28 01:00:00 (Sun)
  63310474800, #  local_start 2007-03-25 03:00:00 (Sun)
  63329223600, #    local_end 2007-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63329216400, #    utc_start 2007-10-28 01:00:00 (Sun)
  63342522000, #      utc_end 2008-03-30 01:00:00 (Sun)
  63329220000, #  local_start 2007-10-28 02:00:00 (Sun)
  63342525600, #    local_end 2008-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63342522000, #    utc_start 2008-03-30 01:00:00 (Sun)
  63360666000, #      utc_end 2008-10-26 01:00:00 (Sun)
  63342529200, #  local_start 2008-03-30 03:00:00 (Sun)
  63360673200, #    local_end 2008-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63360666000, #    utc_start 2008-10-26 01:00:00 (Sun)
  63373971600, #      utc_end 2009-03-29 01:00:00 (Sun)
  63360669600, #  local_start 2008-10-26 02:00:00 (Sun)
  63373975200, #    local_end 2009-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63373971600, #    utc_start 2009-03-29 01:00:00 (Sun)
  63392115600, #      utc_end 2009-10-25 01:00:00 (Sun)
  63373978800, #  local_start 2009-03-29 03:00:00 (Sun)
  63392122800, #    local_end 2009-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63392115600, #    utc_start 2009-10-25 01:00:00 (Sun)
  63405421200, #      utc_end 2010-03-28 01:00:00 (Sun)
  63392119200, #  local_start 2009-10-25 02:00:00 (Sun)
  63405424800, #    local_end 2010-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63405421200, #    utc_start 2010-03-28 01:00:00 (Sun)
  63424170000, #      utc_end 2010-10-31 01:00:00 (Sun)
  63405428400, #  local_start 2010-03-28 03:00:00 (Sun)
  63424177200, #    local_end 2010-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63424170000, #    utc_start 2010-10-31 01:00:00 (Sun)
  63436870800, #      utc_end 2011-03-27 01:00:00 (Sun)
  63424173600, #  local_start 2010-10-31 02:00:00 (Sun)
  63436874400, #    local_end 2011-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63436870800, #    utc_start 2011-03-27 01:00:00 (Sun)
  63455619600, #      utc_end 2011-10-30 01:00:00 (Sun)
  63436878000, #  local_start 2011-03-27 03:00:00 (Sun)
  63455626800, #    local_end 2011-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63455619600, #    utc_start 2011-10-30 01:00:00 (Sun)
  63468320400, #      utc_end 2012-03-25 01:00:00 (Sun)
  63455623200, #  local_start 2011-10-30 02:00:00 (Sun)
  63468324000, #    local_end 2012-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63468320400, #    utc_start 2012-03-25 01:00:00 (Sun)
  63487069200, #      utc_end 2012-10-28 01:00:00 (Sun)
  63468327600, #  local_start 2012-03-25 03:00:00 (Sun)
  63487076400, #    local_end 2012-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63487069200, #    utc_start 2012-10-28 01:00:00 (Sun)
  63500374800, #      utc_end 2013-03-31 01:00:00 (Sun)
  63487072800, #  local_start 2012-10-28 02:00:00 (Sun)
  63500378400, #    local_end 2013-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63500374800, #    utc_start 2013-03-31 01:00:00 (Sun)
  63518518800, #      utc_end 2013-10-27 01:00:00 (Sun)
  63500382000, #  local_start 2013-03-31 03:00:00 (Sun)
  63518526000, #    local_end 2013-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63518518800, #    utc_start 2013-10-27 01:00:00 (Sun)
  63531824400, #      utc_end 2014-03-30 01:00:00 (Sun)
  63518522400, #  local_start 2013-10-27 02:00:00 (Sun)
  63531828000, #    local_end 2014-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63531824400, #    utc_start 2014-03-30 01:00:00 (Sun)
  63549968400, #      utc_end 2014-10-26 01:00:00 (Sun)
  63531831600, #  local_start 2014-03-30 03:00:00 (Sun)
  63549975600, #    local_end 2014-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63549968400, #    utc_start 2014-10-26 01:00:00 (Sun)
  63563274000, #      utc_end 2015-03-29 01:00:00 (Sun)
  63549972000, #  local_start 2014-10-26 02:00:00 (Sun)
  63563277600, #    local_end 2015-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63563274000, #    utc_start 2015-03-29 01:00:00 (Sun)
  63581418000, #      utc_end 2015-10-25 01:00:00 (Sun)
  63563281200, #  local_start 2015-03-29 03:00:00 (Sun)
  63581425200, #    local_end 2015-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63581418000, #    utc_start 2015-10-25 01:00:00 (Sun)
  63594723600, #      utc_end 2016-03-27 01:00:00 (Sun)
  63581421600, #  local_start 2015-10-25 02:00:00 (Sun)
  63594727200, #    local_end 2016-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63594723600, #    utc_start 2016-03-27 01:00:00 (Sun)
  63613472400, #      utc_end 2016-10-30 01:00:00 (Sun)
  63594730800, #  local_start 2016-03-27 03:00:00 (Sun)
  63613479600, #    local_end 2016-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63613472400, #    utc_start 2016-10-30 01:00:00 (Sun)
  63626173200, #      utc_end 2017-03-26 01:00:00 (Sun)
  63613476000, #  local_start 2016-10-30 02:00:00 (Sun)
  63626176800, #    local_end 2017-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63626173200, #    utc_start 2017-03-26 01:00:00 (Sun)
  63644922000, #      utc_end 2017-10-29 01:00:00 (Sun)
  63626180400, #  local_start 2017-03-26 03:00:00 (Sun)
  63644929200, #    local_end 2017-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63644922000, #    utc_start 2017-10-29 01:00:00 (Sun)
  63657622800, #      utc_end 2018-03-25 01:00:00 (Sun)
  63644925600, #  local_start 2017-10-29 02:00:00 (Sun)
  63657626400, #    local_end 2018-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63657622800, #    utc_start 2018-03-25 01:00:00 (Sun)
  63676371600, #      utc_end 2018-10-28 01:00:00 (Sun)
  63657630000, #  local_start 2018-03-25 03:00:00 (Sun)
  63676378800, #    local_end 2018-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63676371600, #    utc_start 2018-10-28 01:00:00 (Sun)
  63689677200, #      utc_end 2019-03-31 01:00:00 (Sun)
  63676375200, #  local_start 2018-10-28 02:00:00 (Sun)
  63689680800, #    local_end 2019-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63689677200, #    utc_start 2019-03-31 01:00:00 (Sun)
  63707821200, #      utc_end 2019-10-27 01:00:00 (Sun)
  63689684400, #  local_start 2019-03-31 03:00:00 (Sun)
  63707828400, #    local_end 2019-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63707821200, #    utc_start 2019-10-27 01:00:00 (Sun)
  63721126800, #      utc_end 2020-03-29 01:00:00 (Sun)
  63707824800, #  local_start 2019-10-27 02:00:00 (Sun)
  63721130400, #    local_end 2020-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63721126800, #    utc_start 2020-03-29 01:00:00 (Sun)
  63739270800, #      utc_end 2020-10-25 01:00:00 (Sun)
  63721134000, #  local_start 2020-03-29 03:00:00 (Sun)
  63739278000, #    local_end 2020-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63739270800, #    utc_start 2020-10-25 01:00:00 (Sun)
  63752576400, #      utc_end 2021-03-28 01:00:00 (Sun)
  63739274400, #  local_start 2020-10-25 02:00:00 (Sun)
  63752580000, #    local_end 2021-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63752576400, #    utc_start 2021-03-28 01:00:00 (Sun)
  63771325200, #      utc_end 2021-10-31 01:00:00 (Sun)
  63752583600, #  local_start 2021-03-28 03:00:00 (Sun)
  63771332400, #    local_end 2021-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63771325200, #    utc_start 2021-10-31 01:00:00 (Sun)
  63784026000, #      utc_end 2022-03-27 01:00:00 (Sun)
  63771328800, #  local_start 2021-10-31 02:00:00 (Sun)
  63784029600, #    local_end 2022-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63784026000, #    utc_start 2022-03-27 01:00:00 (Sun)
  63802774800, #      utc_end 2022-10-30 01:00:00 (Sun)
  63784033200, #  local_start 2022-03-27 03:00:00 (Sun)
  63802782000, #    local_end 2022-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63802774800, #    utc_start 2022-10-30 01:00:00 (Sun)
  63815475600, #      utc_end 2023-03-26 01:00:00 (Sun)
  63802778400, #  local_start 2022-10-30 02:00:00 (Sun)
  63815479200, #    local_end 2023-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63815475600, #    utc_start 2023-03-26 01:00:00 (Sun)
  63834224400, #      utc_end 2023-10-29 01:00:00 (Sun)
  63815482800, #  local_start 2023-03-26 03:00:00 (Sun)
  63834231600, #    local_end 2023-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63834224400, #    utc_start 2023-10-29 01:00:00 (Sun)
  63847530000, #      utc_end 2024-03-31 01:00:00 (Sun)
  63834228000, #  local_start 2023-10-29 02:00:00 (Sun)
  63847533600, #    local_end 2024-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63847530000, #    utc_start 2024-03-31 01:00:00 (Sun)
  63865674000, #      utc_end 2024-10-27 01:00:00 (Sun)
  63847537200, #  local_start 2024-03-31 03:00:00 (Sun)
  63865681200, #    local_end 2024-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63865674000, #    utc_start 2024-10-27 01:00:00 (Sun)
  63878979600, #      utc_end 2025-03-30 01:00:00 (Sun)
  63865677600, #  local_start 2024-10-27 02:00:00 (Sun)
  63878983200, #    local_end 2025-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63878979600, #    utc_start 2025-03-30 01:00:00 (Sun)
  63897123600, #      utc_end 2025-10-26 01:00:00 (Sun)
  63878986800, #  local_start 2025-03-30 03:00:00 (Sun)
  63897130800, #    local_end 2025-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63897123600, #    utc_start 2025-10-26 01:00:00 (Sun)
  63910429200, #      utc_end 2026-03-29 01:00:00 (Sun)
  63897127200, #  local_start 2025-10-26 02:00:00 (Sun)
  63910432800, #    local_end 2026-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63910429200, #    utc_start 2026-03-29 01:00:00 (Sun)
  63928573200, #      utc_end 2026-10-25 01:00:00 (Sun)
  63910436400, #  local_start 2026-03-29 03:00:00 (Sun)
  63928580400, #    local_end 2026-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63928573200, #    utc_start 2026-10-25 01:00:00 (Sun)
  63941878800, #      utc_end 2027-03-28 01:00:00 (Sun)
  63928576800, #  local_start 2026-10-25 02:00:00 (Sun)
  63941882400, #    local_end 2027-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63941878800, #    utc_start 2027-03-28 01:00:00 (Sun)
  63960627600, #      utc_end 2027-10-31 01:00:00 (Sun)
  63941886000, #  local_start 2027-03-28 03:00:00 (Sun)
  63960634800, #    local_end 2027-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63960627600, #    utc_start 2027-10-31 01:00:00 (Sun)
  63973328400, #      utc_end 2028-03-26 01:00:00 (Sun)
  63960631200, #  local_start 2027-10-31 02:00:00 (Sun)
  63973332000, #    local_end 2028-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63973328400, #    utc_start 2028-03-26 01:00:00 (Sun)
  63992077200, #      utc_end 2028-10-29 01:00:00 (Sun)
  63973335600, #  local_start 2028-03-26 03:00:00 (Sun)
  63992084400, #    local_end 2028-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63992077200, #    utc_start 2028-10-29 01:00:00 (Sun)
  64004778000, #      utc_end 2029-03-25 01:00:00 (Sun)
  63992080800, #  local_start 2028-10-29 02:00:00 (Sun)
  64004781600, #    local_end 2029-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  64004778000, #    utc_start 2029-03-25 01:00:00 (Sun)
  64023526800, #      utc_end 2029-10-28 01:00:00 (Sun)
  64004785200, #  local_start 2029-03-25 03:00:00 (Sun)
  64023534000, #    local_end 2029-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  64023526800, #    utc_start 2029-10-28 01:00:00 (Sun)
  64036832400, #      utc_end 2030-03-31 01:00:00 (Sun)
  64023530400, #  local_start 2029-10-28 02:00:00 (Sun)
  64036836000, #    local_end 2030-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  64036832400, #    utc_start 2030-03-31 01:00:00 (Sun)
  64054976400, #      utc_end 2030-10-27 01:00:00 (Sun)
  64036839600, #  local_start 2030-03-31 03:00:00 (Sun)
  64054983600, #    local_end 2030-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {63}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { 3600 }
  
  my $last_observance = bless( {
    'format' => 'CE%sT',
    'gmtoff' => '1:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 722815,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 722815,
      'utc_rd_secs' => 0,
      'utc_year' => 1981
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => 3600,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 722814,
      'local_rd_secs' => 82800,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 722814,
      'utc_rd_secs' => 82800,
      'utc_year' => 1980
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '1:00u',
      'from' => '1981',
      'in' => 'Mar',
      'letter' => 'S',
      'name' => 'EU',
      'offset_from_std' => 3600,
      'on' => 'lastSun',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '1:00u',
      'from' => '1996',
      'in' => 'Oct',
      'letter' => '',
      'name' => 'EU',
      'offset_from_std' => 0,
      'on' => 'lastSun',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_EUROPE_OSLO

    $main::fatpacked{"DateTime/TimeZone/Europe/Paris.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_EUROPE_PARIS';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Europe::Paris;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Europe::Paris::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59649004299, #      utc_end 1891-03-14 23:51:39 (Sat)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59649004860, #    local_end 1891-03-15 00:01:00 (Sun)
  561,
  0,
  'LMT',
      ],
      [
  59649004299, #    utc_start 1891-03-14 23:51:39 (Sat)
  60279724299, #      utc_end 1911-03-10 23:51:39 (Fri)
  59649004860, #  local_start 1891-03-15 00:01:00 (Sun)
  60279724860, #    local_end 1911-03-11 00:01:00 (Sat)
  561,
  0,
  'PMT',
      ],
      [
  60279724299, #    utc_start 1911-03-10 23:51:39 (Fri)
  60445868400, #      utc_end 1916-06-14 23:00:00 (Wed)
  60279724299, #  local_start 1911-03-10 23:51:39 (Fri)
  60445868400, #    local_end 1916-06-14 23:00:00 (Wed)
  0,
  0,
  'WET',
      ],
      [
  60445868400, #    utc_start 1916-06-14 23:00:00 (Wed)
  60455286000, #      utc_end 1916-10-01 23:00:00 (Sun)
  60445872000, #  local_start 1916-06-15 00:00:00 (Thu)
  60455289600, #    local_end 1916-10-02 00:00:00 (Mon)
  3600,
  1,
  'WEST',
      ],
      [
  60455286000, #    utc_start 1916-10-01 23:00:00 (Sun)
  60470319600, #      utc_end 1917-03-24 23:00:00 (Sat)
  60455286000, #  local_start 1916-10-01 23:00:00 (Sun)
  60470319600, #    local_end 1917-03-24 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  60470319600, #    utc_start 1917-03-24 23:00:00 (Sat)
  60487340400, #      utc_end 1917-10-07 23:00:00 (Sun)
  60470323200, #  local_start 1917-03-25 00:00:00 (Sun)
  60487344000, #    local_end 1917-10-08 00:00:00 (Mon)
  3600,
  1,
  'WEST',
      ],
      [
  60487340400, #    utc_start 1917-10-07 23:00:00 (Sun)
  60500559600, #      utc_end 1918-03-09 23:00:00 (Sat)
  60487340400, #  local_start 1917-10-07 23:00:00 (Sun)
  60500559600, #    local_end 1918-03-09 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  60500559600, #    utc_start 1918-03-09 23:00:00 (Sat)
  60518790000, #      utc_end 1918-10-06 23:00:00 (Sun)
  60500563200, #  local_start 1918-03-10 00:00:00 (Sun)
  60518793600, #    local_end 1918-10-07 00:00:00 (Mon)
  3600,
  1,
  'WEST',
      ],
      [
  60518790000, #    utc_start 1918-10-06 23:00:00 (Sun)
  60531404400, #      utc_end 1919-03-01 23:00:00 (Sat)
  60518790000, #  local_start 1918-10-06 23:00:00 (Sun)
  60531404400, #    local_end 1919-03-01 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  60531404400, #    utc_start 1919-03-01 23:00:00 (Sat)
  60550239600, #      utc_end 1919-10-05 23:00:00 (Sun)
  60531408000, #  local_start 1919-03-02 00:00:00 (Sun)
  60550243200, #    local_end 1919-10-06 00:00:00 (Mon)
  3600,
  1,
  'WEST',
      ],
      [
  60550239600, #    utc_start 1919-10-05 23:00:00 (Sun)
  60561644400, #      utc_end 1920-02-14 23:00:00 (Sat)
  60550239600, #  local_start 1919-10-05 23:00:00 (Sun)
  60561644400, #    local_end 1920-02-14 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  60561644400, #    utc_start 1920-02-14 23:00:00 (Sat)
  60583417200, #      utc_end 1920-10-23 23:00:00 (Sat)
  60561648000, #  local_start 1920-02-15 00:00:00 (Sun)
  60583420800, #    local_end 1920-10-24 00:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60583417200, #    utc_start 1920-10-23 23:00:00 (Sat)
  60595686000, #      utc_end 1921-03-14 23:00:00 (Mon)
  60583417200, #  local_start 1920-10-23 23:00:00 (Sat)
  60595686000, #    local_end 1921-03-14 23:00:00 (Mon)
  0,
  0,
  'WET',
      ],
      [
  60595686000, #    utc_start 1921-03-14 23:00:00 (Mon)
  60615126000, #      utc_end 1921-10-25 23:00:00 (Tue)
  60595689600, #  local_start 1921-03-15 00:00:00 (Tue)
  60615129600, #    local_end 1921-10-26 00:00:00 (Wed)
  3600,
  1,
  'WEST',
      ],
      [
  60615126000, #    utc_start 1921-10-25 23:00:00 (Tue)
  60628172400, #      utc_end 1922-03-25 23:00:00 (Sat)
  60615126000, #  local_start 1921-10-25 23:00:00 (Tue)
  60628172400, #    local_end 1922-03-25 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  60628172400, #    utc_start 1922-03-25 23:00:00 (Sat)
  60645106800, #      utc_end 1922-10-07 23:00:00 (Sat)
  60628176000, #  local_start 1922-03-26 00:00:00 (Sun)
  60645110400, #    local_end 1922-10-08 00:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60645106800, #    utc_start 1922-10-07 23:00:00 (Sat)
  60665065200, #      utc_end 1923-05-26 23:00:00 (Sat)
  60645106800, #  local_start 1922-10-07 23:00:00 (Sat)
  60665065200, #    local_end 1923-05-26 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  60665065200, #    utc_start 1923-05-26 23:00:00 (Sat)
  60676556400, #      utc_end 1923-10-06 23:00:00 (Sat)
  60665068800, #  local_start 1923-05-27 00:00:00 (Sun)
  60676560000, #    local_end 1923-10-07 00:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60676556400, #    utc_start 1923-10-06 23:00:00 (Sat)
  60691676400, #      utc_end 1924-03-29 23:00:00 (Sat)
  60676556400, #  local_start 1923-10-06 23:00:00 (Sat)
  60691676400, #    local_end 1924-03-29 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  60691676400, #    utc_start 1924-03-29 23:00:00 (Sat)
  60708006000, #      utc_end 1924-10-04 23:00:00 (Sat)
  60691680000, #  local_start 1924-03-30 00:00:00 (Sun)
  60708009600, #    local_end 1924-10-05 00:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60708006000, #    utc_start 1924-10-04 23:00:00 (Sat)
  60723730800, #      utc_end 1925-04-04 23:00:00 (Sat)
  60708006000, #  local_start 1924-10-04 23:00:00 (Sat)
  60723730800, #    local_end 1925-04-04 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  60723730800, #    utc_start 1925-04-04 23:00:00 (Sat)
  60739455600, #      utc_end 1925-10-03 23:00:00 (Sat)
  60723734400, #  local_start 1925-04-05 00:00:00 (Sun)
  60739459200, #    local_end 1925-10-04 00:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60739455600, #    utc_start 1925-10-03 23:00:00 (Sat)
  60756390000, #      utc_end 1926-04-17 23:00:00 (Sat)
  60739455600, #  local_start 1925-10-03 23:00:00 (Sat)
  60756390000, #    local_end 1926-04-17 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  60756390000, #    utc_start 1926-04-17 23:00:00 (Sat)
  60770905200, #      utc_end 1926-10-02 23:00:00 (Sat)
  60756393600, #  local_start 1926-04-18 00:00:00 (Sun)
  60770908800, #    local_end 1926-10-03 00:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60770905200, #    utc_start 1926-10-02 23:00:00 (Sat)
  60787234800, #      utc_end 1927-04-09 23:00:00 (Sat)
  60770905200, #  local_start 1926-10-02 23:00:00 (Sat)
  60787234800, #    local_end 1927-04-09 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  60787234800, #    utc_start 1927-04-09 23:00:00 (Sat)
  60802354800, #      utc_end 1927-10-01 23:00:00 (Sat)
  60787238400, #  local_start 1927-04-10 00:00:00 (Sun)
  60802358400, #    local_end 1927-10-02 00:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60802354800, #    utc_start 1927-10-01 23:00:00 (Sat)
  60819289200, #      utc_end 1928-04-14 23:00:00 (Sat)
  60802354800, #  local_start 1927-10-01 23:00:00 (Sat)
  60819289200, #    local_end 1928-04-14 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  60819289200, #    utc_start 1928-04-14 23:00:00 (Sat)
  60834409200, #      utc_end 1928-10-06 23:00:00 (Sat)
  60819292800, #  local_start 1928-04-15 00:00:00 (Sun)
  60834412800, #    local_end 1928-10-07 00:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60834409200, #    utc_start 1928-10-06 23:00:00 (Sat)
  60851343600, #      utc_end 1929-04-20 23:00:00 (Sat)
  60834409200, #  local_start 1928-10-06 23:00:00 (Sat)
  60851343600, #    local_end 1929-04-20 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  60851343600, #    utc_start 1929-04-20 23:00:00 (Sat)
  60865858800, #      utc_end 1929-10-05 23:00:00 (Sat)
  60851347200, #  local_start 1929-04-21 00:00:00 (Sun)
  60865862400, #    local_end 1929-10-06 00:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60865858800, #    utc_start 1929-10-05 23:00:00 (Sat)
  60882188400, #      utc_end 1930-04-12 23:00:00 (Sat)
  60865858800, #  local_start 1929-10-05 23:00:00 (Sat)
  60882188400, #    local_end 1930-04-12 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  60882188400, #    utc_start 1930-04-12 23:00:00 (Sat)
  60897308400, #      utc_end 1930-10-04 23:00:00 (Sat)
  60882192000, #  local_start 1930-04-13 00:00:00 (Sun)
  60897312000, #    local_end 1930-10-05 00:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60897308400, #    utc_start 1930-10-04 23:00:00 (Sat)
  60914242800, #      utc_end 1931-04-18 23:00:00 (Sat)
  60897308400, #  local_start 1930-10-04 23:00:00 (Sat)
  60914242800, #    local_end 1931-04-18 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  60914242800, #    utc_start 1931-04-18 23:00:00 (Sat)
  60928758000, #      utc_end 1931-10-03 23:00:00 (Sat)
  60914246400, #  local_start 1931-04-19 00:00:00 (Sun)
  60928761600, #    local_end 1931-10-04 00:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60928758000, #    utc_start 1931-10-03 23:00:00 (Sat)
  60944482800, #      utc_end 1932-04-02 23:00:00 (Sat)
  60928758000, #  local_start 1931-10-03 23:00:00 (Sat)
  60944482800, #    local_end 1932-04-02 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  60944482800, #    utc_start 1932-04-02 23:00:00 (Sat)
  60960207600, #      utc_end 1932-10-01 23:00:00 (Sat)
  60944486400, #  local_start 1932-04-03 00:00:00 (Sun)
  60960211200, #    local_end 1932-10-02 00:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60960207600, #    utc_start 1932-10-01 23:00:00 (Sat)
  60975327600, #      utc_end 1933-03-25 23:00:00 (Sat)
  60960207600, #  local_start 1932-10-01 23:00:00 (Sat)
  60975327600, #    local_end 1933-03-25 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  60975327600, #    utc_start 1933-03-25 23:00:00 (Sat)
  60992262000, #      utc_end 1933-10-07 23:00:00 (Sat)
  60975331200, #  local_start 1933-03-26 00:00:00 (Sun)
  60992265600, #    local_end 1933-10-08 00:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  60992262000, #    utc_start 1933-10-07 23:00:00 (Sat)
  61007986800, #      utc_end 1934-04-07 23:00:00 (Sat)
  60992262000, #  local_start 1933-10-07 23:00:00 (Sat)
  61007986800, #    local_end 1934-04-07 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  61007986800, #    utc_start 1934-04-07 23:00:00 (Sat)
  61023711600, #      utc_end 1934-10-06 23:00:00 (Sat)
  61007990400, #  local_start 1934-04-08 00:00:00 (Sun)
  61023715200, #    local_end 1934-10-07 00:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  61023711600, #    utc_start 1934-10-06 23:00:00 (Sat)
  61038831600, #      utc_end 1935-03-30 23:00:00 (Sat)
  61023711600, #  local_start 1934-10-06 23:00:00 (Sat)
  61038831600, #    local_end 1935-03-30 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  61038831600, #    utc_start 1935-03-30 23:00:00 (Sat)
  61055161200, #      utc_end 1935-10-05 23:00:00 (Sat)
  61038835200, #  local_start 1935-03-31 00:00:00 (Sun)
  61055164800, #    local_end 1935-10-06 00:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  61055161200, #    utc_start 1935-10-05 23:00:00 (Sat)
  61072095600, #      utc_end 1936-04-18 23:00:00 (Sat)
  61055161200, #  local_start 1935-10-05 23:00:00 (Sat)
  61072095600, #    local_end 1936-04-18 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  61072095600, #    utc_start 1936-04-18 23:00:00 (Sat)
  61086610800, #      utc_end 1936-10-03 23:00:00 (Sat)
  61072099200, #  local_start 1936-04-19 00:00:00 (Sun)
  61086614400, #    local_end 1936-10-04 00:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  61086610800, #    utc_start 1936-10-03 23:00:00 (Sat)
  61102335600, #      utc_end 1937-04-03 23:00:00 (Sat)
  61086610800, #  local_start 1936-10-03 23:00:00 (Sat)
  61102335600, #    local_end 1937-04-03 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  61102335600, #    utc_start 1937-04-03 23:00:00 (Sat)
  61118060400, #      utc_end 1937-10-02 23:00:00 (Sat)
  61102339200, #  local_start 1937-04-04 00:00:00 (Sun)
  61118064000, #    local_end 1937-10-03 00:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  61118060400, #    utc_start 1937-10-02 23:00:00 (Sat)
  61133180400, #      utc_end 1938-03-26 23:00:00 (Sat)
  61118060400, #  local_start 1937-10-02 23:00:00 (Sat)
  61133180400, #    local_end 1938-03-26 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  61133180400, #    utc_start 1938-03-26 23:00:00 (Sat)
  61149510000, #      utc_end 1938-10-01 23:00:00 (Sat)
  61133184000, #  local_start 1938-03-27 00:00:00 (Sun)
  61149513600, #    local_end 1938-10-02 00:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  61149510000, #    utc_start 1938-10-01 23:00:00 (Sat)
  61166444400, #      utc_end 1939-04-15 23:00:00 (Sat)
  61149510000, #  local_start 1938-10-01 23:00:00 (Sat)
  61166444400, #    local_end 1939-04-15 23:00:00 (Sat)
  0,
  0,
  'WET',
      ],
      [
  61166444400, #    utc_start 1939-04-15 23:00:00 (Sat)
  61185193200, #      utc_end 1939-11-18 23:00:00 (Sat)
  61166448000, #  local_start 1939-04-16 00:00:00 (Sun)
  61185196800, #    local_end 1939-11-19 00:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  61185193200, #    utc_start 1939-11-18 23:00:00 (Sat)
  61193671200, #      utc_end 1940-02-25 02:00:00 (Sun)
  61185193200, #  local_start 1939-11-18 23:00:00 (Sat)
  61193671200, #    local_end 1940-02-25 02:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  61193671200, #    utc_start 1940-02-25 02:00:00 (Sun)
  61203247200, #      utc_end 1940-06-14 22:00:00 (Fri)
  61193674800, #  local_start 1940-02-25 03:00:00 (Sun)
  61203250800, #    local_end 1940-06-14 23:00:00 (Fri)
  3600,
  1,
  'WEST',
      ],
      [
  61203247200, #    utc_start 1940-06-14 22:00:00 (Fri)
  61278426000, #      utc_end 1942-11-02 01:00:00 (Mon)
  61203254400, #  local_start 1940-06-15 00:00:00 (Sat)
  61278433200, #    local_end 1942-11-02 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61278426000, #    utc_start 1942-11-02 01:00:00 (Mon)
  61291126800, #      utc_end 1943-03-29 01:00:00 (Mon)
  61278429600, #  local_start 1942-11-02 02:00:00 (Mon)
  61291130400, #    local_end 1943-03-29 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61291126800, #    utc_start 1943-03-29 01:00:00 (Mon)
  61307456400, #      utc_end 1943-10-04 01:00:00 (Mon)
  61291134000, #  local_start 1943-03-29 03:00:00 (Mon)
  61307463600, #    local_end 1943-10-04 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61307456400, #    utc_start 1943-10-04 01:00:00 (Mon)
  61323181200, #      utc_end 1944-04-03 01:00:00 (Mon)
  61307460000, #  local_start 1943-10-04 02:00:00 (Mon)
  61323184800, #    local_end 1944-04-03 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61323181200, #    utc_start 1944-04-03 01:00:00 (Mon)
  61335612000, #      utc_end 1944-08-24 22:00:00 (Thu)
  61323188400, #  local_start 1944-04-03 03:00:00 (Mon)
  61335619200, #    local_end 1944-08-25 00:00:00 (Fri)
  7200,
  1,
  'CEST',
      ],
      [
  61335612000, #    utc_start 1944-08-24 22:00:00 (Thu)
  61339417200, #      utc_end 1944-10-07 23:00:00 (Sat)
  61335619200, #  local_start 1944-08-25 00:00:00 (Fri)
  61339424400, #    local_end 1944-10-08 01:00:00 (Sun)
  7200,
  1,
  'WEMT',
      ],
      [
  61339417200, #    utc_start 1944-10-07 23:00:00 (Sat)
  61354630800, #      utc_end 1945-04-02 01:00:00 (Mon)
  61339420800, #  local_start 1944-10-08 00:00:00 (Sun)
  61354634400, #    local_end 1945-04-02 02:00:00 (Mon)
  3600,
  1,
  'WEST',
      ],
      [
  61354630800, #    utc_start 1945-04-02 01:00:00 (Mon)
  61369059600, #      utc_end 1945-09-16 01:00:00 (Sun)
  61354638000, #  local_start 1945-04-02 03:00:00 (Mon)
  61369066800, #    local_end 1945-09-16 03:00:00 (Sun)
  7200,
  1,
  'WEMT',
      ],
      [
  61369059600, #    utc_start 1945-09-16 01:00:00 (Sun)
  62332502400, #      utc_end 1976-03-28 00:00:00 (Sun)
  61369063200, #  local_start 1945-09-16 02:00:00 (Sun)
  62332506000, #    local_end 1976-03-28 01:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62332502400, #    utc_start 1976-03-28 00:00:00 (Sun)
  62348223600, #      utc_end 1976-09-25 23:00:00 (Sat)
  62332509600, #  local_start 1976-03-28 02:00:00 (Sun)
  62348230800, #    local_end 1976-09-26 01:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62348223600, #    utc_start 1976-09-25 23:00:00 (Sat)
  62356604400, #      utc_end 1976-12-31 23:00:00 (Fri)
  62348227200, #  local_start 1976-09-26 00:00:00 (Sun)
  62356608000, #    local_end 1977-01-01 00:00:00 (Sat)
  3600,
  0,
  'CET',
      ],
      [
  62356604400, #    utc_start 1976-12-31 23:00:00 (Fri)
  62364560400, #      utc_end 1977-04-03 01:00:00 (Sun)
  62356608000, #  local_start 1977-01-01 00:00:00 (Sat)
  62364564000, #    local_end 1977-04-03 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62364560400, #    utc_start 1977-04-03 01:00:00 (Sun)
  62379680400, #      utc_end 1977-09-25 01:00:00 (Sun)
  62364567600, #  local_start 1977-04-03 03:00:00 (Sun)
  62379687600, #    local_end 1977-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62379680400, #    utc_start 1977-09-25 01:00:00 (Sun)
  62396010000, #      utc_end 1978-04-02 01:00:00 (Sun)
  62379684000, #  local_start 1977-09-25 02:00:00 (Sun)
  62396013600, #    local_end 1978-04-02 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62396010000, #    utc_start 1978-04-02 01:00:00 (Sun)
  62411734800, #      utc_end 1978-10-01 01:00:00 (Sun)
  62396017200, #  local_start 1978-04-02 03:00:00 (Sun)
  62411742000, #    local_end 1978-10-01 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62411734800, #    utc_start 1978-10-01 01:00:00 (Sun)
  62427459600, #      utc_end 1979-04-01 01:00:00 (Sun)
  62411738400, #  local_start 1978-10-01 02:00:00 (Sun)
  62427463200, #    local_end 1979-04-01 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62427459600, #    utc_start 1979-04-01 01:00:00 (Sun)
  62443184400, #      utc_end 1979-09-30 01:00:00 (Sun)
  62427466800, #  local_start 1979-04-01 03:00:00 (Sun)
  62443191600, #    local_end 1979-09-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62443184400, #    utc_start 1979-09-30 01:00:00 (Sun)
  62459514000, #      utc_end 1980-04-06 01:00:00 (Sun)
  62443188000, #  local_start 1979-09-30 02:00:00 (Sun)
  62459517600, #    local_end 1980-04-06 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62459514000, #    utc_start 1980-04-06 01:00:00 (Sun)
  62474634000, #      utc_end 1980-09-28 01:00:00 (Sun)
  62459521200, #  local_start 1980-04-06 03:00:00 (Sun)
  62474641200, #    local_end 1980-09-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62474634000, #    utc_start 1980-09-28 01:00:00 (Sun)
  62490358800, #      utc_end 1981-03-29 01:00:00 (Sun)
  62474637600, #  local_start 1980-09-28 02:00:00 (Sun)
  62490362400, #    local_end 1981-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62490358800, #    utc_start 1981-03-29 01:00:00 (Sun)
  62506083600, #      utc_end 1981-09-27 01:00:00 (Sun)
  62490366000, #  local_start 1981-03-29 03:00:00 (Sun)
  62506090800, #    local_end 1981-09-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62506083600, #    utc_start 1981-09-27 01:00:00 (Sun)
  62521808400, #      utc_end 1982-03-28 01:00:00 (Sun)
  62506087200, #  local_start 1981-09-27 02:00:00 (Sun)
  62521812000, #    local_end 1982-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62521808400, #    utc_start 1982-03-28 01:00:00 (Sun)
  62537533200, #      utc_end 1982-09-26 01:00:00 (Sun)
  62521815600, #  local_start 1982-03-28 03:00:00 (Sun)
  62537540400, #    local_end 1982-09-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62537533200, #    utc_start 1982-09-26 01:00:00 (Sun)
  62553258000, #      utc_end 1983-03-27 01:00:00 (Sun)
  62537536800, #  local_start 1982-09-26 02:00:00 (Sun)
  62553261600, #    local_end 1983-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62553258000, #    utc_start 1983-03-27 01:00:00 (Sun)
  62568982800, #      utc_end 1983-09-25 01:00:00 (Sun)
  62553265200, #  local_start 1983-03-27 03:00:00 (Sun)
  62568990000, #    local_end 1983-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62568982800, #    utc_start 1983-09-25 01:00:00 (Sun)
  62584707600, #      utc_end 1984-03-25 01:00:00 (Sun)
  62568986400, #  local_start 1983-09-25 02:00:00 (Sun)
  62584711200, #    local_end 1984-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62584707600, #    utc_start 1984-03-25 01:00:00 (Sun)
  62601037200, #      utc_end 1984-09-30 01:00:00 (Sun)
  62584714800, #  local_start 1984-03-25 03:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62601037200, #    utc_start 1984-09-30 01:00:00 (Sun)
  62616762000, #      utc_end 1985-03-31 01:00:00 (Sun)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62616762000, #    utc_start 1985-03-31 01:00:00 (Sun)
  62632486800, #      utc_end 1985-09-29 01:00:00 (Sun)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62632486800, #    utc_start 1985-09-29 01:00:00 (Sun)
  62648211600, #      utc_end 1986-03-30 01:00:00 (Sun)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62648211600, #    utc_start 1986-03-30 01:00:00 (Sun)
  62663936400, #      utc_end 1986-09-28 01:00:00 (Sun)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62663936400, #    utc_start 1986-09-28 01:00:00 (Sun)
  62679661200, #      utc_end 1987-03-29 01:00:00 (Sun)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62679661200, #    utc_start 1987-03-29 01:00:00 (Sun)
  62695386000, #      utc_end 1987-09-27 01:00:00 (Sun)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62695386000, #    utc_start 1987-09-27 01:00:00 (Sun)
  62711110800, #      utc_end 1988-03-27 01:00:00 (Sun)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62711110800, #    utc_start 1988-03-27 01:00:00 (Sun)
  62726835600, #      utc_end 1988-09-25 01:00:00 (Sun)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62726835600, #    utc_start 1988-09-25 01:00:00 (Sun)
  62742560400, #      utc_end 1989-03-26 01:00:00 (Sun)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62742560400, #    utc_start 1989-03-26 01:00:00 (Sun)
  62758285200, #      utc_end 1989-09-24 01:00:00 (Sun)
  62742567600, #  local_start 1989-03-26 03:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62758285200, #    utc_start 1989-09-24 01:00:00 (Sun)
  62774010000, #      utc_end 1990-03-25 01:00:00 (Sun)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62774010000, #    utc_start 1990-03-25 01:00:00 (Sun)
  62790339600, #      utc_end 1990-09-30 01:00:00 (Sun)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62790339600, #    utc_start 1990-09-30 01:00:00 (Sun)
  62806064400, #      utc_end 1991-03-31 01:00:00 (Sun)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62806064400, #    utc_start 1991-03-31 01:00:00 (Sun)
  62821789200, #      utc_end 1991-09-29 01:00:00 (Sun)
  62806071600, #  local_start 1991-03-31 03:00:00 (Sun)
  62821796400, #    local_end 1991-09-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62821789200, #    utc_start 1991-09-29 01:00:00 (Sun)
  62837514000, #      utc_end 1992-03-29 01:00:00 (Sun)
  62821792800, #  local_start 1991-09-29 02:00:00 (Sun)
  62837517600, #    local_end 1992-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62837514000, #    utc_start 1992-03-29 01:00:00 (Sun)
  62853238800, #      utc_end 1992-09-27 01:00:00 (Sun)
  62837521200, #  local_start 1992-03-29 03:00:00 (Sun)
  62853246000, #    local_end 1992-09-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62853238800, #    utc_start 1992-09-27 01:00:00 (Sun)
  62868963600, #      utc_end 1993-03-28 01:00:00 (Sun)
  62853242400, #  local_start 1992-09-27 02:00:00 (Sun)
  62868967200, #    local_end 1993-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62868963600, #    utc_start 1993-03-28 01:00:00 (Sun)
  62884688400, #      utc_end 1993-09-26 01:00:00 (Sun)
  62868970800, #  local_start 1993-03-28 03:00:00 (Sun)
  62884695600, #    local_end 1993-09-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62884688400, #    utc_start 1993-09-26 01:00:00 (Sun)
  62900413200, #      utc_end 1994-03-27 01:00:00 (Sun)
  62884692000, #  local_start 1993-09-26 02:00:00 (Sun)
  62900416800, #    local_end 1994-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62900413200, #    utc_start 1994-03-27 01:00:00 (Sun)
  62916138000, #      utc_end 1994-09-25 01:00:00 (Sun)
  62900420400, #  local_start 1994-03-27 03:00:00 (Sun)
  62916145200, #    local_end 1994-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62916138000, #    utc_start 1994-09-25 01:00:00 (Sun)
  62931862800, #      utc_end 1995-03-26 01:00:00 (Sun)
  62916141600, #  local_start 1994-09-25 02:00:00 (Sun)
  62931866400, #    local_end 1995-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62931862800, #    utc_start 1995-03-26 01:00:00 (Sun)
  62947587600, #      utc_end 1995-09-24 01:00:00 (Sun)
  62931870000, #  local_start 1995-03-26 03:00:00 (Sun)
  62947594800, #    local_end 1995-09-24 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62947587600, #    utc_start 1995-09-24 01:00:00 (Sun)
  62963917200, #      utc_end 1996-03-31 01:00:00 (Sun)
  62947591200, #  local_start 1995-09-24 02:00:00 (Sun)
  62963920800, #    local_end 1996-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62963917200, #    utc_start 1996-03-31 01:00:00 (Sun)
  62982061200, #      utc_end 1996-10-27 01:00:00 (Sun)
  62963924400, #  local_start 1996-03-31 03:00:00 (Sun)
  62982068400, #    local_end 1996-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62982061200, #    utc_start 1996-10-27 01:00:00 (Sun)
  62995366800, #      utc_end 1997-03-30 01:00:00 (Sun)
  62982064800, #  local_start 1996-10-27 02:00:00 (Sun)
  62995370400, #    local_end 1997-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62995366800, #    utc_start 1997-03-30 01:00:00 (Sun)
  63013510800, #      utc_end 1997-10-26 01:00:00 (Sun)
  62995374000, #  local_start 1997-03-30 03:00:00 (Sun)
  63013518000, #    local_end 1997-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63013510800, #    utc_start 1997-10-26 01:00:00 (Sun)
  63026816400, #      utc_end 1998-03-29 01:00:00 (Sun)
  63013514400, #  local_start 1997-10-26 02:00:00 (Sun)
  63026820000, #    local_end 1998-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63026816400, #    utc_start 1998-03-29 01:00:00 (Sun)
  63044960400, #      utc_end 1998-10-25 01:00:00 (Sun)
  63026823600, #  local_start 1998-03-29 03:00:00 (Sun)
  63044967600, #    local_end 1998-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63044960400, #    utc_start 1998-10-25 01:00:00 (Sun)
  63058266000, #      utc_end 1999-03-28 01:00:00 (Sun)
  63044964000, #  local_start 1998-10-25 02:00:00 (Sun)
  63058269600, #    local_end 1999-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63058266000, #    utc_start 1999-03-28 01:00:00 (Sun)
  63077014800, #      utc_end 1999-10-31 01:00:00 (Sun)
  63058273200, #  local_start 1999-03-28 03:00:00 (Sun)
  63077022000, #    local_end 1999-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63077014800, #    utc_start 1999-10-31 01:00:00 (Sun)
  63089715600, #      utc_end 2000-03-26 01:00:00 (Sun)
  63077018400, #  local_start 1999-10-31 02:00:00 (Sun)
  63089719200, #    local_end 2000-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63089715600, #    utc_start 2000-03-26 01:00:00 (Sun)
  63108464400, #      utc_end 2000-10-29 01:00:00 (Sun)
  63089722800, #  local_start 2000-03-26 03:00:00 (Sun)
  63108471600, #    local_end 2000-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63108464400, #    utc_start 2000-10-29 01:00:00 (Sun)
  63121165200, #      utc_end 2001-03-25 01:00:00 (Sun)
  63108468000, #  local_start 2000-10-29 02:00:00 (Sun)
  63121168800, #    local_end 2001-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63121165200, #    utc_start 2001-03-25 01:00:00 (Sun)
  63139914000, #      utc_end 2001-10-28 01:00:00 (Sun)
  63121172400, #  local_start 2001-03-25 03:00:00 (Sun)
  63139921200, #    local_end 2001-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63139914000, #    utc_start 2001-10-28 01:00:00 (Sun)
  63153219600, #      utc_end 2002-03-31 01:00:00 (Sun)
  63139917600, #  local_start 2001-10-28 02:00:00 (Sun)
  63153223200, #    local_end 2002-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63153219600, #    utc_start 2002-03-31 01:00:00 (Sun)
  63171363600, #      utc_end 2002-10-27 01:00:00 (Sun)
  63153226800, #  local_start 2002-03-31 03:00:00 (Sun)
  63171370800, #    local_end 2002-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63171363600, #    utc_start 2002-10-27 01:00:00 (Sun)
  63184669200, #      utc_end 2003-03-30 01:00:00 (Sun)
  63171367200, #  local_start 2002-10-27 02:00:00 (Sun)
  63184672800, #    local_end 2003-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63184669200, #    utc_start 2003-03-30 01:00:00 (Sun)
  63202813200, #      utc_end 2003-10-26 01:00:00 (Sun)
  63184676400, #  local_start 2003-03-30 03:00:00 (Sun)
  63202820400, #    local_end 2003-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63202813200, #    utc_start 2003-10-26 01:00:00 (Sun)
  63216118800, #      utc_end 2004-03-28 01:00:00 (Sun)
  63202816800, #  local_start 2003-10-26 02:00:00 (Sun)
  63216122400, #    local_end 2004-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63216118800, #    utc_start 2004-03-28 01:00:00 (Sun)
  63234867600, #      utc_end 2004-10-31 01:00:00 (Sun)
  63216126000, #  local_start 2004-03-28 03:00:00 (Sun)
  63234874800, #    local_end 2004-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63234867600, #    utc_start 2004-10-31 01:00:00 (Sun)
  63247568400, #      utc_end 2005-03-27 01:00:00 (Sun)
  63234871200, #  local_start 2004-10-31 02:00:00 (Sun)
  63247572000, #    local_end 2005-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63247568400, #    utc_start 2005-03-27 01:00:00 (Sun)
  63266317200, #      utc_end 2005-10-30 01:00:00 (Sun)
  63247575600, #  local_start 2005-03-27 03:00:00 (Sun)
  63266324400, #    local_end 2005-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63266317200, #    utc_start 2005-10-30 01:00:00 (Sun)
  63279018000, #      utc_end 2006-03-26 01:00:00 (Sun)
  63266320800, #  local_start 2005-10-30 02:00:00 (Sun)
  63279021600, #    local_end 2006-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63279018000, #    utc_start 2006-03-26 01:00:00 (Sun)
  63297766800, #      utc_end 2006-10-29 01:00:00 (Sun)
  63279025200, #  local_start 2006-03-26 03:00:00 (Sun)
  63297774000, #    local_end 2006-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63297766800, #    utc_start 2006-10-29 01:00:00 (Sun)
  63310467600, #      utc_end 2007-03-25 01:00:00 (Sun)
  63297770400, #  local_start 2006-10-29 02:00:00 (Sun)
  63310471200, #    local_end 2007-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63310467600, #    utc_start 2007-03-25 01:00:00 (Sun)
  63329216400, #      utc_end 2007-10-28 01:00:00 (Sun)
  63310474800, #  local_start 2007-03-25 03:00:00 (Sun)
  63329223600, #    local_end 2007-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63329216400, #    utc_start 2007-10-28 01:00:00 (Sun)
  63342522000, #      utc_end 2008-03-30 01:00:00 (Sun)
  63329220000, #  local_start 2007-10-28 02:00:00 (Sun)
  63342525600, #    local_end 2008-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63342522000, #    utc_start 2008-03-30 01:00:00 (Sun)
  63360666000, #      utc_end 2008-10-26 01:00:00 (Sun)
  63342529200, #  local_start 2008-03-30 03:00:00 (Sun)
  63360673200, #    local_end 2008-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63360666000, #    utc_start 2008-10-26 01:00:00 (Sun)
  63373971600, #      utc_end 2009-03-29 01:00:00 (Sun)
  63360669600, #  local_start 2008-10-26 02:00:00 (Sun)
  63373975200, #    local_end 2009-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63373971600, #    utc_start 2009-03-29 01:00:00 (Sun)
  63392115600, #      utc_end 2009-10-25 01:00:00 (Sun)
  63373978800, #  local_start 2009-03-29 03:00:00 (Sun)
  63392122800, #    local_end 2009-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63392115600, #    utc_start 2009-10-25 01:00:00 (Sun)
  63405421200, #      utc_end 2010-03-28 01:00:00 (Sun)
  63392119200, #  local_start 2009-10-25 02:00:00 (Sun)
  63405424800, #    local_end 2010-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63405421200, #    utc_start 2010-03-28 01:00:00 (Sun)
  63424170000, #      utc_end 2010-10-31 01:00:00 (Sun)
  63405428400, #  local_start 2010-03-28 03:00:00 (Sun)
  63424177200, #    local_end 2010-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63424170000, #    utc_start 2010-10-31 01:00:00 (Sun)
  63436870800, #      utc_end 2011-03-27 01:00:00 (Sun)
  63424173600, #  local_start 2010-10-31 02:00:00 (Sun)
  63436874400, #    local_end 2011-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63436870800, #    utc_start 2011-03-27 01:00:00 (Sun)
  63455619600, #      utc_end 2011-10-30 01:00:00 (Sun)
  63436878000, #  local_start 2011-03-27 03:00:00 (Sun)
  63455626800, #    local_end 2011-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63455619600, #    utc_start 2011-10-30 01:00:00 (Sun)
  63468320400, #      utc_end 2012-03-25 01:00:00 (Sun)
  63455623200, #  local_start 2011-10-30 02:00:00 (Sun)
  63468324000, #    local_end 2012-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63468320400, #    utc_start 2012-03-25 01:00:00 (Sun)
  63487069200, #      utc_end 2012-10-28 01:00:00 (Sun)
  63468327600, #  local_start 2012-03-25 03:00:00 (Sun)
  63487076400, #    local_end 2012-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63487069200, #    utc_start 2012-10-28 01:00:00 (Sun)
  63500374800, #      utc_end 2013-03-31 01:00:00 (Sun)
  63487072800, #  local_start 2012-10-28 02:00:00 (Sun)
  63500378400, #    local_end 2013-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63500374800, #    utc_start 2013-03-31 01:00:00 (Sun)
  63518518800, #      utc_end 2013-10-27 01:00:00 (Sun)
  63500382000, #  local_start 2013-03-31 03:00:00 (Sun)
  63518526000, #    local_end 2013-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63518518800, #    utc_start 2013-10-27 01:00:00 (Sun)
  63531824400, #      utc_end 2014-03-30 01:00:00 (Sun)
  63518522400, #  local_start 2013-10-27 02:00:00 (Sun)
  63531828000, #    local_end 2014-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63531824400, #    utc_start 2014-03-30 01:00:00 (Sun)
  63549968400, #      utc_end 2014-10-26 01:00:00 (Sun)
  63531831600, #  local_start 2014-03-30 03:00:00 (Sun)
  63549975600, #    local_end 2014-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63549968400, #    utc_start 2014-10-26 01:00:00 (Sun)
  63563274000, #      utc_end 2015-03-29 01:00:00 (Sun)
  63549972000, #  local_start 2014-10-26 02:00:00 (Sun)
  63563277600, #    local_end 2015-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63563274000, #    utc_start 2015-03-29 01:00:00 (Sun)
  63581418000, #      utc_end 2015-10-25 01:00:00 (Sun)
  63563281200, #  local_start 2015-03-29 03:00:00 (Sun)
  63581425200, #    local_end 2015-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63581418000, #    utc_start 2015-10-25 01:00:00 (Sun)
  63594723600, #      utc_end 2016-03-27 01:00:00 (Sun)
  63581421600, #  local_start 2015-10-25 02:00:00 (Sun)
  63594727200, #    local_end 2016-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63594723600, #    utc_start 2016-03-27 01:00:00 (Sun)
  63613472400, #      utc_end 2016-10-30 01:00:00 (Sun)
  63594730800, #  local_start 2016-03-27 03:00:00 (Sun)
  63613479600, #    local_end 2016-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63613472400, #    utc_start 2016-10-30 01:00:00 (Sun)
  63626173200, #      utc_end 2017-03-26 01:00:00 (Sun)
  63613476000, #  local_start 2016-10-30 02:00:00 (Sun)
  63626176800, #    local_end 2017-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63626173200, #    utc_start 2017-03-26 01:00:00 (Sun)
  63644922000, #      utc_end 2017-10-29 01:00:00 (Sun)
  63626180400, #  local_start 2017-03-26 03:00:00 (Sun)
  63644929200, #    local_end 2017-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63644922000, #    utc_start 2017-10-29 01:00:00 (Sun)
  63657622800, #      utc_end 2018-03-25 01:00:00 (Sun)
  63644925600, #  local_start 2017-10-29 02:00:00 (Sun)
  63657626400, #    local_end 2018-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63657622800, #    utc_start 2018-03-25 01:00:00 (Sun)
  63676371600, #      utc_end 2018-10-28 01:00:00 (Sun)
  63657630000, #  local_start 2018-03-25 03:00:00 (Sun)
  63676378800, #    local_end 2018-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63676371600, #    utc_start 2018-10-28 01:00:00 (Sun)
  63689677200, #      utc_end 2019-03-31 01:00:00 (Sun)
  63676375200, #  local_start 2018-10-28 02:00:00 (Sun)
  63689680800, #    local_end 2019-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63689677200, #    utc_start 2019-03-31 01:00:00 (Sun)
  63707821200, #      utc_end 2019-10-27 01:00:00 (Sun)
  63689684400, #  local_start 2019-03-31 03:00:00 (Sun)
  63707828400, #    local_end 2019-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63707821200, #    utc_start 2019-10-27 01:00:00 (Sun)
  63721126800, #      utc_end 2020-03-29 01:00:00 (Sun)
  63707824800, #  local_start 2019-10-27 02:00:00 (Sun)
  63721130400, #    local_end 2020-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63721126800, #    utc_start 2020-03-29 01:00:00 (Sun)
  63739270800, #      utc_end 2020-10-25 01:00:00 (Sun)
  63721134000, #  local_start 2020-03-29 03:00:00 (Sun)
  63739278000, #    local_end 2020-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63739270800, #    utc_start 2020-10-25 01:00:00 (Sun)
  63752576400, #      utc_end 2021-03-28 01:00:00 (Sun)
  63739274400, #  local_start 2020-10-25 02:00:00 (Sun)
  63752580000, #    local_end 2021-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63752576400, #    utc_start 2021-03-28 01:00:00 (Sun)
  63771325200, #      utc_end 2021-10-31 01:00:00 (Sun)
  63752583600, #  local_start 2021-03-28 03:00:00 (Sun)
  63771332400, #    local_end 2021-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63771325200, #    utc_start 2021-10-31 01:00:00 (Sun)
  63784026000, #      utc_end 2022-03-27 01:00:00 (Sun)
  63771328800, #  local_start 2021-10-31 02:00:00 (Sun)
  63784029600, #    local_end 2022-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63784026000, #    utc_start 2022-03-27 01:00:00 (Sun)
  63802774800, #      utc_end 2022-10-30 01:00:00 (Sun)
  63784033200, #  local_start 2022-03-27 03:00:00 (Sun)
  63802782000, #    local_end 2022-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63802774800, #    utc_start 2022-10-30 01:00:00 (Sun)
  63815475600, #      utc_end 2023-03-26 01:00:00 (Sun)
  63802778400, #  local_start 2022-10-30 02:00:00 (Sun)
  63815479200, #    local_end 2023-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63815475600, #    utc_start 2023-03-26 01:00:00 (Sun)
  63834224400, #      utc_end 2023-10-29 01:00:00 (Sun)
  63815482800, #  local_start 2023-03-26 03:00:00 (Sun)
  63834231600, #    local_end 2023-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63834224400, #    utc_start 2023-10-29 01:00:00 (Sun)
  63847530000, #      utc_end 2024-03-31 01:00:00 (Sun)
  63834228000, #  local_start 2023-10-29 02:00:00 (Sun)
  63847533600, #    local_end 2024-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63847530000, #    utc_start 2024-03-31 01:00:00 (Sun)
  63865674000, #      utc_end 2024-10-27 01:00:00 (Sun)
  63847537200, #  local_start 2024-03-31 03:00:00 (Sun)
  63865681200, #    local_end 2024-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63865674000, #    utc_start 2024-10-27 01:00:00 (Sun)
  63878979600, #      utc_end 2025-03-30 01:00:00 (Sun)
  63865677600, #  local_start 2024-10-27 02:00:00 (Sun)
  63878983200, #    local_end 2025-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63878979600, #    utc_start 2025-03-30 01:00:00 (Sun)
  63897123600, #      utc_end 2025-10-26 01:00:00 (Sun)
  63878986800, #  local_start 2025-03-30 03:00:00 (Sun)
  63897130800, #    local_end 2025-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63897123600, #    utc_start 2025-10-26 01:00:00 (Sun)
  63910429200, #      utc_end 2026-03-29 01:00:00 (Sun)
  63897127200, #  local_start 2025-10-26 02:00:00 (Sun)
  63910432800, #    local_end 2026-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63910429200, #    utc_start 2026-03-29 01:00:00 (Sun)
  63928573200, #      utc_end 2026-10-25 01:00:00 (Sun)
  63910436400, #  local_start 2026-03-29 03:00:00 (Sun)
  63928580400, #    local_end 2026-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63928573200, #    utc_start 2026-10-25 01:00:00 (Sun)
  63941878800, #      utc_end 2027-03-28 01:00:00 (Sun)
  63928576800, #  local_start 2026-10-25 02:00:00 (Sun)
  63941882400, #    local_end 2027-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63941878800, #    utc_start 2027-03-28 01:00:00 (Sun)
  63960627600, #      utc_end 2027-10-31 01:00:00 (Sun)
  63941886000, #  local_start 2027-03-28 03:00:00 (Sun)
  63960634800, #    local_end 2027-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63960627600, #    utc_start 2027-10-31 01:00:00 (Sun)
  63973328400, #      utc_end 2028-03-26 01:00:00 (Sun)
  63960631200, #  local_start 2027-10-31 02:00:00 (Sun)
  63973332000, #    local_end 2028-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63973328400, #    utc_start 2028-03-26 01:00:00 (Sun)
  63992077200, #      utc_end 2028-10-29 01:00:00 (Sun)
  63973335600, #  local_start 2028-03-26 03:00:00 (Sun)
  63992084400, #    local_end 2028-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63992077200, #    utc_start 2028-10-29 01:00:00 (Sun)
  64004778000, #      utc_end 2029-03-25 01:00:00 (Sun)
  63992080800, #  local_start 2028-10-29 02:00:00 (Sun)
  64004781600, #    local_end 2029-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  64004778000, #    utc_start 2029-03-25 01:00:00 (Sun)
  64023526800, #      utc_end 2029-10-28 01:00:00 (Sun)
  64004785200, #  local_start 2029-03-25 03:00:00 (Sun)
  64023534000, #    local_end 2029-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  64023526800, #    utc_start 2029-10-28 01:00:00 (Sun)
  64036832400, #      utc_end 2030-03-31 01:00:00 (Sun)
  64023530400, #  local_start 2029-10-28 02:00:00 (Sun)
  64036836000, #    local_end 2030-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  64036832400, #    utc_start 2030-03-31 01:00:00 (Sun)
  64054976400, #      utc_end 2030-10-27 01:00:00 (Sun)
  64036839600, #  local_start 2030-03-31 03:00:00 (Sun)
  64054983600, #    local_end 2030-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {86}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { 3600 }
  
  my $last_observance = bless( {
    'format' => 'CE%sT',
    'gmtoff' => '1:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 721720,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 721720,
      'utc_rd_secs' => 0,
      'utc_year' => 1978
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => 3600,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 721719,
      'local_rd_secs' => 82800,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 721719,
      'utc_rd_secs' => 82800,
      'utc_year' => 1977
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '1:00u',
      'from' => '1996',
      'in' => 'Oct',
      'letter' => '',
      'name' => 'EU',
      'offset_from_std' => 0,
      'on' => 'lastSun',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '1:00u',
      'from' => '1981',
      'in' => 'Mar',
      'letter' => 'S',
      'name' => 'EU',
      'offset_from_std' => 3600,
      'on' => 'lastSun',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_EUROPE_PARIS

    $main::fatpacked{"DateTime/TimeZone/Europe/Prague.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_EUROPE_PRAGUE';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Europe::Prague;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Europe::Prague::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  58348854136, #      utc_end 1849-12-31 23:02:16 (Mon)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  58348857600, #    local_end 1850-01-01 00:00:00 (Tue)
  3464,
  0,
  'LMT',
      ],
      [
  58348854136, #    utc_start 1849-12-31 23:02:16 (Mon)
  59666281336, #      utc_end 1891-09-30 23:02:16 (Wed)
  58348857600, #  local_start 1850-01-01 00:00:00 (Tue)
  59666284800, #    local_end 1891-10-01 00:00:00 (Thu)
  3464,
  0,
  'PMT',
      ],
      [
  59666281336, #    utc_start 1891-09-30 23:02:16 (Wed)
  60441976800, #      utc_end 1916-04-30 22:00:00 (Sun)
  59666284936, #  local_start 1891-10-01 00:02:16 (Thu)
  60441980400, #    local_end 1916-04-30 23:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  60441976800, #    utc_start 1916-04-30 22:00:00 (Sun)
  60455199600, #      utc_end 1916-09-30 23:00:00 (Sat)
  60441984000, #  local_start 1916-05-01 00:00:00 (Mon)
  60455206800, #    local_end 1916-10-01 01:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  60455199600, #    utc_start 1916-09-30 23:00:00 (Sat)
  60472227600, #      utc_end 1917-04-16 01:00:00 (Mon)
  60455203200, #  local_start 1916-10-01 00:00:00 (Sun)
  60472231200, #    local_end 1917-04-16 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  60472227600, #    utc_start 1917-04-16 01:00:00 (Mon)
  60485533200, #      utc_end 1917-09-17 01:00:00 (Mon)
  60472234800, #  local_start 1917-04-16 03:00:00 (Mon)
  60485540400, #    local_end 1917-09-17 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  60485533200, #    utc_start 1917-09-17 01:00:00 (Mon)
  60503677200, #      utc_end 1918-04-15 01:00:00 (Mon)
  60485536800, #  local_start 1917-09-17 02:00:00 (Mon)
  60503680800, #    local_end 1918-04-15 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  60503677200, #    utc_start 1918-04-15 01:00:00 (Mon)
  60516982800, #      utc_end 1918-09-16 01:00:00 (Mon)
  60503684400, #  local_start 1918-04-15 03:00:00 (Mon)
  60516990000, #    local_end 1918-09-16 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  60516982800, #    utc_start 1918-09-16 01:00:00 (Mon)
  61196778000, #      utc_end 1940-04-01 01:00:00 (Mon)
  60516986400, #  local_start 1918-09-16 02:00:00 (Mon)
  61196781600, #    local_end 1940-04-01 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61196778000, #    utc_start 1940-04-01 01:00:00 (Mon)
  61278426000, #      utc_end 1942-11-02 01:00:00 (Mon)
  61196785200, #  local_start 1940-04-01 03:00:00 (Mon)
  61278433200, #    local_end 1942-11-02 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61278426000, #    utc_start 1942-11-02 01:00:00 (Mon)
  61291126800, #      utc_end 1943-03-29 01:00:00 (Mon)
  61278429600, #  local_start 1942-11-02 02:00:00 (Mon)
  61291130400, #    local_end 1943-03-29 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61291126800, #    utc_start 1943-03-29 01:00:00 (Mon)
  61307456400, #      utc_end 1943-10-04 01:00:00 (Mon)
  61291134000, #  local_start 1943-03-29 03:00:00 (Mon)
  61307463600, #    local_end 1943-10-04 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61307456400, #    utc_start 1943-10-04 01:00:00 (Mon)
  61323181200, #      utc_end 1944-04-03 01:00:00 (Mon)
  61307460000, #  local_start 1943-10-04 02:00:00 (Mon)
  61323184800, #    local_end 1944-04-03 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61323181200, #    utc_start 1944-04-03 01:00:00 (Mon)
  61338906000, #      utc_end 1944-10-02 01:00:00 (Mon)
  61323188400, #  local_start 1944-04-03 03:00:00 (Mon)
  61338913200, #    local_end 1944-10-02 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61338906000, #    utc_start 1944-10-02 01:00:00 (Mon)
  61354630800, #      utc_end 1945-04-02 01:00:00 (Mon)
  61338909600, #  local_start 1944-10-02 02:00:00 (Mon)
  61354634400, #    local_end 1945-04-02 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61354630800, #    utc_start 1945-04-02 01:00:00 (Mon)
  61357816800, #      utc_end 1945-05-08 22:00:00 (Tue)
  61354638000, #  local_start 1945-04-02 03:00:00 (Mon)
  61357824000, #    local_end 1945-05-09 00:00:00 (Wed)
  7200,
  1,
  'CEST',
      ],
      [
  61357816800, #    utc_start 1945-05-08 22:00:00 (Tue)
  61370355600, #      utc_end 1945-10-01 01:00:00 (Mon)
  61357824000, #  local_start 1945-05-09 00:00:00 (Wed)
  61370362800, #    local_end 1945-10-01 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61370355600, #    utc_start 1945-10-01 01:00:00 (Mon)
  61389104400, #      utc_end 1946-05-06 01:00:00 (Mon)
  61370359200, #  local_start 1945-10-01 02:00:00 (Mon)
  61389108000, #    local_end 1946-05-06 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61389104400, #    utc_start 1946-05-06 01:00:00 (Mon)
  61402323600, #      utc_end 1946-10-06 01:00:00 (Sun)
  61389111600, #  local_start 1946-05-06 03:00:00 (Mon)
  61402330800, #    local_end 1946-10-06 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  61402323600, #    utc_start 1946-10-06 01:00:00 (Sun)
  61407165600, #      utc_end 1946-12-01 02:00:00 (Sun)
  61402327200, #  local_start 1946-10-06 02:00:00 (Sun)
  61407169200, #    local_end 1946-12-01 03:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  61407165600, #    utc_start 1946-12-01 02:00:00 (Sun)
  61414423200, #      utc_end 1947-02-23 02:00:00 (Sun)
  61407165600, #  local_start 1946-12-01 02:00:00 (Sun)
  61414423200, #    local_end 1947-02-23 02:00:00 (Sun)
  0,
  1,
  'GMT',
      ],
      [
  61414423200, #    utc_start 1947-02-23 02:00:00 (Sun)
  61419258000, #      utc_end 1947-04-20 01:00:00 (Sun)
  61414426800, #  local_start 1947-02-23 03:00:00 (Sun)
  61419261600, #    local_end 1947-04-20 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  61419258000, #    utc_start 1947-04-20 01:00:00 (Sun)
  61433773200, #      utc_end 1947-10-05 01:00:00 (Sun)
  61419265200, #  local_start 1947-04-20 03:00:00 (Sun)
  61433780400, #    local_end 1947-10-05 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  61433773200, #    utc_start 1947-10-05 01:00:00 (Sun)
  61450707600, #      utc_end 1948-04-18 01:00:00 (Sun)
  61433776800, #  local_start 1947-10-05 02:00:00 (Sun)
  61450711200, #    local_end 1948-04-18 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  61450707600, #    utc_start 1948-04-18 01:00:00 (Sun)
  61465222800, #      utc_end 1948-10-03 01:00:00 (Sun)
  61450714800, #  local_start 1948-04-18 03:00:00 (Sun)
  61465230000, #    local_end 1948-10-03 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  61465222800, #    utc_start 1948-10-03 01:00:00 (Sun)
  61481466000, #      utc_end 1949-04-09 01:00:00 (Sat)
  61465226400, #  local_start 1948-10-03 02:00:00 (Sun)
  61481469600, #    local_end 1949-04-09 02:00:00 (Sat)
  3600,
  0,
  'CET',
      ],
      [
  61481466000, #    utc_start 1949-04-09 01:00:00 (Sat)
  61496672400, #      utc_end 1949-10-02 01:00:00 (Sun)
  61481473200, #  local_start 1949-04-09 03:00:00 (Sat)
  61496679600, #    local_end 1949-10-02 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  61496672400, #    utc_start 1949-10-02 01:00:00 (Sun)
  62419676400, #      utc_end 1978-12-31 23:00:00 (Sun)
  61496676000, #  local_start 1949-10-02 02:00:00 (Sun)
  62419680000, #    local_end 1979-01-01 00:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  62419676400, #    utc_start 1978-12-31 23:00:00 (Sun)
  62427459600, #      utc_end 1979-04-01 01:00:00 (Sun)
  62419680000, #  local_start 1979-01-01 00:00:00 (Mon)
  62427463200, #    local_end 1979-04-01 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62427459600, #    utc_start 1979-04-01 01:00:00 (Sun)
  62443184400, #      utc_end 1979-09-30 01:00:00 (Sun)
  62427466800, #  local_start 1979-04-01 03:00:00 (Sun)
  62443191600, #    local_end 1979-09-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62443184400, #    utc_start 1979-09-30 01:00:00 (Sun)
  62459514000, #      utc_end 1980-04-06 01:00:00 (Sun)
  62443188000, #  local_start 1979-09-30 02:00:00 (Sun)
  62459517600, #    local_end 1980-04-06 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62459514000, #    utc_start 1980-04-06 01:00:00 (Sun)
  62474634000, #      utc_end 1980-09-28 01:00:00 (Sun)
  62459521200, #  local_start 1980-04-06 03:00:00 (Sun)
  62474641200, #    local_end 1980-09-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62474634000, #    utc_start 1980-09-28 01:00:00 (Sun)
  62490358800, #      utc_end 1981-03-29 01:00:00 (Sun)
  62474637600, #  local_start 1980-09-28 02:00:00 (Sun)
  62490362400, #    local_end 1981-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62490358800, #    utc_start 1981-03-29 01:00:00 (Sun)
  62506083600, #      utc_end 1981-09-27 01:00:00 (Sun)
  62490366000, #  local_start 1981-03-29 03:00:00 (Sun)
  62506090800, #    local_end 1981-09-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62506083600, #    utc_start 1981-09-27 01:00:00 (Sun)
  62521808400, #      utc_end 1982-03-28 01:00:00 (Sun)
  62506087200, #  local_start 1981-09-27 02:00:00 (Sun)
  62521812000, #    local_end 1982-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62521808400, #    utc_start 1982-03-28 01:00:00 (Sun)
  62537533200, #      utc_end 1982-09-26 01:00:00 (Sun)
  62521815600, #  local_start 1982-03-28 03:00:00 (Sun)
  62537540400, #    local_end 1982-09-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62537533200, #    utc_start 1982-09-26 01:00:00 (Sun)
  62553258000, #      utc_end 1983-03-27 01:00:00 (Sun)
  62537536800, #  local_start 1982-09-26 02:00:00 (Sun)
  62553261600, #    local_end 1983-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62553258000, #    utc_start 1983-03-27 01:00:00 (Sun)
  62568982800, #      utc_end 1983-09-25 01:00:00 (Sun)
  62553265200, #  local_start 1983-03-27 03:00:00 (Sun)
  62568990000, #    local_end 1983-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62568982800, #    utc_start 1983-09-25 01:00:00 (Sun)
  62584707600, #      utc_end 1984-03-25 01:00:00 (Sun)
  62568986400, #  local_start 1983-09-25 02:00:00 (Sun)
  62584711200, #    local_end 1984-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62584707600, #    utc_start 1984-03-25 01:00:00 (Sun)
  62601037200, #      utc_end 1984-09-30 01:00:00 (Sun)
  62584714800, #  local_start 1984-03-25 03:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62601037200, #    utc_start 1984-09-30 01:00:00 (Sun)
  62616762000, #      utc_end 1985-03-31 01:00:00 (Sun)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62616762000, #    utc_start 1985-03-31 01:00:00 (Sun)
  62632486800, #      utc_end 1985-09-29 01:00:00 (Sun)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62632486800, #    utc_start 1985-09-29 01:00:00 (Sun)
  62648211600, #      utc_end 1986-03-30 01:00:00 (Sun)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62648211600, #    utc_start 1986-03-30 01:00:00 (Sun)
  62663936400, #      utc_end 1986-09-28 01:00:00 (Sun)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62663936400, #    utc_start 1986-09-28 01:00:00 (Sun)
  62679661200, #      utc_end 1987-03-29 01:00:00 (Sun)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62679661200, #    utc_start 1987-03-29 01:00:00 (Sun)
  62695386000, #      utc_end 1987-09-27 01:00:00 (Sun)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62695386000, #    utc_start 1987-09-27 01:00:00 (Sun)
  62711110800, #      utc_end 1988-03-27 01:00:00 (Sun)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62711110800, #    utc_start 1988-03-27 01:00:00 (Sun)
  62726835600, #      utc_end 1988-09-25 01:00:00 (Sun)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62726835600, #    utc_start 1988-09-25 01:00:00 (Sun)
  62742560400, #      utc_end 1989-03-26 01:00:00 (Sun)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62742560400, #    utc_start 1989-03-26 01:00:00 (Sun)
  62758285200, #      utc_end 1989-09-24 01:00:00 (Sun)
  62742567600, #  local_start 1989-03-26 03:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62758285200, #    utc_start 1989-09-24 01:00:00 (Sun)
  62774010000, #      utc_end 1990-03-25 01:00:00 (Sun)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62774010000, #    utc_start 1990-03-25 01:00:00 (Sun)
  62790339600, #      utc_end 1990-09-30 01:00:00 (Sun)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62790339600, #    utc_start 1990-09-30 01:00:00 (Sun)
  62806064400, #      utc_end 1991-03-31 01:00:00 (Sun)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62806064400, #    utc_start 1991-03-31 01:00:00 (Sun)
  62821789200, #      utc_end 1991-09-29 01:00:00 (Sun)
  62806071600, #  local_start 1991-03-31 03:00:00 (Sun)
  62821796400, #    local_end 1991-09-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62821789200, #    utc_start 1991-09-29 01:00:00 (Sun)
  62837514000, #      utc_end 1992-03-29 01:00:00 (Sun)
  62821792800, #  local_start 1991-09-29 02:00:00 (Sun)
  62837517600, #    local_end 1992-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62837514000, #    utc_start 1992-03-29 01:00:00 (Sun)
  62853238800, #      utc_end 1992-09-27 01:00:00 (Sun)
  62837521200, #  local_start 1992-03-29 03:00:00 (Sun)
  62853246000, #    local_end 1992-09-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62853238800, #    utc_start 1992-09-27 01:00:00 (Sun)
  62868963600, #      utc_end 1993-03-28 01:00:00 (Sun)
  62853242400, #  local_start 1992-09-27 02:00:00 (Sun)
  62868967200, #    local_end 1993-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62868963600, #    utc_start 1993-03-28 01:00:00 (Sun)
  62884688400, #      utc_end 1993-09-26 01:00:00 (Sun)
  62868970800, #  local_start 1993-03-28 03:00:00 (Sun)
  62884695600, #    local_end 1993-09-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62884688400, #    utc_start 1993-09-26 01:00:00 (Sun)
  62900413200, #      utc_end 1994-03-27 01:00:00 (Sun)
  62884692000, #  local_start 1993-09-26 02:00:00 (Sun)
  62900416800, #    local_end 1994-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62900413200, #    utc_start 1994-03-27 01:00:00 (Sun)
  62916138000, #      utc_end 1994-09-25 01:00:00 (Sun)
  62900420400, #  local_start 1994-03-27 03:00:00 (Sun)
  62916145200, #    local_end 1994-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62916138000, #    utc_start 1994-09-25 01:00:00 (Sun)
  62931862800, #      utc_end 1995-03-26 01:00:00 (Sun)
  62916141600, #  local_start 1994-09-25 02:00:00 (Sun)
  62931866400, #    local_end 1995-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62931862800, #    utc_start 1995-03-26 01:00:00 (Sun)
  62947587600, #      utc_end 1995-09-24 01:00:00 (Sun)
  62931870000, #  local_start 1995-03-26 03:00:00 (Sun)
  62947594800, #    local_end 1995-09-24 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62947587600, #    utc_start 1995-09-24 01:00:00 (Sun)
  62963917200, #      utc_end 1996-03-31 01:00:00 (Sun)
  62947591200, #  local_start 1995-09-24 02:00:00 (Sun)
  62963920800, #    local_end 1996-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62963917200, #    utc_start 1996-03-31 01:00:00 (Sun)
  62982061200, #      utc_end 1996-10-27 01:00:00 (Sun)
  62963924400, #  local_start 1996-03-31 03:00:00 (Sun)
  62982068400, #    local_end 1996-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62982061200, #    utc_start 1996-10-27 01:00:00 (Sun)
  62995366800, #      utc_end 1997-03-30 01:00:00 (Sun)
  62982064800, #  local_start 1996-10-27 02:00:00 (Sun)
  62995370400, #    local_end 1997-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62995366800, #    utc_start 1997-03-30 01:00:00 (Sun)
  63013510800, #      utc_end 1997-10-26 01:00:00 (Sun)
  62995374000, #  local_start 1997-03-30 03:00:00 (Sun)
  63013518000, #    local_end 1997-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63013510800, #    utc_start 1997-10-26 01:00:00 (Sun)
  63026816400, #      utc_end 1998-03-29 01:00:00 (Sun)
  63013514400, #  local_start 1997-10-26 02:00:00 (Sun)
  63026820000, #    local_end 1998-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63026816400, #    utc_start 1998-03-29 01:00:00 (Sun)
  63044960400, #      utc_end 1998-10-25 01:00:00 (Sun)
  63026823600, #  local_start 1998-03-29 03:00:00 (Sun)
  63044967600, #    local_end 1998-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63044960400, #    utc_start 1998-10-25 01:00:00 (Sun)
  63058266000, #      utc_end 1999-03-28 01:00:00 (Sun)
  63044964000, #  local_start 1998-10-25 02:00:00 (Sun)
  63058269600, #    local_end 1999-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63058266000, #    utc_start 1999-03-28 01:00:00 (Sun)
  63077014800, #      utc_end 1999-10-31 01:00:00 (Sun)
  63058273200, #  local_start 1999-03-28 03:00:00 (Sun)
  63077022000, #    local_end 1999-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63077014800, #    utc_start 1999-10-31 01:00:00 (Sun)
  63089715600, #      utc_end 2000-03-26 01:00:00 (Sun)
  63077018400, #  local_start 1999-10-31 02:00:00 (Sun)
  63089719200, #    local_end 2000-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63089715600, #    utc_start 2000-03-26 01:00:00 (Sun)
  63108464400, #      utc_end 2000-10-29 01:00:00 (Sun)
  63089722800, #  local_start 2000-03-26 03:00:00 (Sun)
  63108471600, #    local_end 2000-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63108464400, #    utc_start 2000-10-29 01:00:00 (Sun)
  63121165200, #      utc_end 2001-03-25 01:00:00 (Sun)
  63108468000, #  local_start 2000-10-29 02:00:00 (Sun)
  63121168800, #    local_end 2001-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63121165200, #    utc_start 2001-03-25 01:00:00 (Sun)
  63139914000, #      utc_end 2001-10-28 01:00:00 (Sun)
  63121172400, #  local_start 2001-03-25 03:00:00 (Sun)
  63139921200, #    local_end 2001-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63139914000, #    utc_start 2001-10-28 01:00:00 (Sun)
  63153219600, #      utc_end 2002-03-31 01:00:00 (Sun)
  63139917600, #  local_start 2001-10-28 02:00:00 (Sun)
  63153223200, #    local_end 2002-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63153219600, #    utc_start 2002-03-31 01:00:00 (Sun)
  63171363600, #      utc_end 2002-10-27 01:00:00 (Sun)
  63153226800, #  local_start 2002-03-31 03:00:00 (Sun)
  63171370800, #    local_end 2002-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63171363600, #    utc_start 2002-10-27 01:00:00 (Sun)
  63184669200, #      utc_end 2003-03-30 01:00:00 (Sun)
  63171367200, #  local_start 2002-10-27 02:00:00 (Sun)
  63184672800, #    local_end 2003-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63184669200, #    utc_start 2003-03-30 01:00:00 (Sun)
  63202813200, #      utc_end 2003-10-26 01:00:00 (Sun)
  63184676400, #  local_start 2003-03-30 03:00:00 (Sun)
  63202820400, #    local_end 2003-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63202813200, #    utc_start 2003-10-26 01:00:00 (Sun)
  63216118800, #      utc_end 2004-03-28 01:00:00 (Sun)
  63202816800, #  local_start 2003-10-26 02:00:00 (Sun)
  63216122400, #    local_end 2004-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63216118800, #    utc_start 2004-03-28 01:00:00 (Sun)
  63234867600, #      utc_end 2004-10-31 01:00:00 (Sun)
  63216126000, #  local_start 2004-03-28 03:00:00 (Sun)
  63234874800, #    local_end 2004-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63234867600, #    utc_start 2004-10-31 01:00:00 (Sun)
  63247568400, #      utc_end 2005-03-27 01:00:00 (Sun)
  63234871200, #  local_start 2004-10-31 02:00:00 (Sun)
  63247572000, #    local_end 2005-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63247568400, #    utc_start 2005-03-27 01:00:00 (Sun)
  63266317200, #      utc_end 2005-10-30 01:00:00 (Sun)
  63247575600, #  local_start 2005-03-27 03:00:00 (Sun)
  63266324400, #    local_end 2005-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63266317200, #    utc_start 2005-10-30 01:00:00 (Sun)
  63279018000, #      utc_end 2006-03-26 01:00:00 (Sun)
  63266320800, #  local_start 2005-10-30 02:00:00 (Sun)
  63279021600, #    local_end 2006-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63279018000, #    utc_start 2006-03-26 01:00:00 (Sun)
  63297766800, #      utc_end 2006-10-29 01:00:00 (Sun)
  63279025200, #  local_start 2006-03-26 03:00:00 (Sun)
  63297774000, #    local_end 2006-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63297766800, #    utc_start 2006-10-29 01:00:00 (Sun)
  63310467600, #      utc_end 2007-03-25 01:00:00 (Sun)
  63297770400, #  local_start 2006-10-29 02:00:00 (Sun)
  63310471200, #    local_end 2007-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63310467600, #    utc_start 2007-03-25 01:00:00 (Sun)
  63329216400, #      utc_end 2007-10-28 01:00:00 (Sun)
  63310474800, #  local_start 2007-03-25 03:00:00 (Sun)
  63329223600, #    local_end 2007-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63329216400, #    utc_start 2007-10-28 01:00:00 (Sun)
  63342522000, #      utc_end 2008-03-30 01:00:00 (Sun)
  63329220000, #  local_start 2007-10-28 02:00:00 (Sun)
  63342525600, #    local_end 2008-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63342522000, #    utc_start 2008-03-30 01:00:00 (Sun)
  63360666000, #      utc_end 2008-10-26 01:00:00 (Sun)
  63342529200, #  local_start 2008-03-30 03:00:00 (Sun)
  63360673200, #    local_end 2008-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63360666000, #    utc_start 2008-10-26 01:00:00 (Sun)
  63373971600, #      utc_end 2009-03-29 01:00:00 (Sun)
  63360669600, #  local_start 2008-10-26 02:00:00 (Sun)
  63373975200, #    local_end 2009-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63373971600, #    utc_start 2009-03-29 01:00:00 (Sun)
  63392115600, #      utc_end 2009-10-25 01:00:00 (Sun)
  63373978800, #  local_start 2009-03-29 03:00:00 (Sun)
  63392122800, #    local_end 2009-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63392115600, #    utc_start 2009-10-25 01:00:00 (Sun)
  63405421200, #      utc_end 2010-03-28 01:00:00 (Sun)
  63392119200, #  local_start 2009-10-25 02:00:00 (Sun)
  63405424800, #    local_end 2010-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63405421200, #    utc_start 2010-03-28 01:00:00 (Sun)
  63424170000, #      utc_end 2010-10-31 01:00:00 (Sun)
  63405428400, #  local_start 2010-03-28 03:00:00 (Sun)
  63424177200, #    local_end 2010-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63424170000, #    utc_start 2010-10-31 01:00:00 (Sun)
  63436870800, #      utc_end 2011-03-27 01:00:00 (Sun)
  63424173600, #  local_start 2010-10-31 02:00:00 (Sun)
  63436874400, #    local_end 2011-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63436870800, #    utc_start 2011-03-27 01:00:00 (Sun)
  63455619600, #      utc_end 2011-10-30 01:00:00 (Sun)
  63436878000, #  local_start 2011-03-27 03:00:00 (Sun)
  63455626800, #    local_end 2011-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63455619600, #    utc_start 2011-10-30 01:00:00 (Sun)
  63468320400, #      utc_end 2012-03-25 01:00:00 (Sun)
  63455623200, #  local_start 2011-10-30 02:00:00 (Sun)
  63468324000, #    local_end 2012-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63468320400, #    utc_start 2012-03-25 01:00:00 (Sun)
  63487069200, #      utc_end 2012-10-28 01:00:00 (Sun)
  63468327600, #  local_start 2012-03-25 03:00:00 (Sun)
  63487076400, #    local_end 2012-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63487069200, #    utc_start 2012-10-28 01:00:00 (Sun)
  63500374800, #      utc_end 2013-03-31 01:00:00 (Sun)
  63487072800, #  local_start 2012-10-28 02:00:00 (Sun)
  63500378400, #    local_end 2013-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63500374800, #    utc_start 2013-03-31 01:00:00 (Sun)
  63518518800, #      utc_end 2013-10-27 01:00:00 (Sun)
  63500382000, #  local_start 2013-03-31 03:00:00 (Sun)
  63518526000, #    local_end 2013-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63518518800, #    utc_start 2013-10-27 01:00:00 (Sun)
  63531824400, #      utc_end 2014-03-30 01:00:00 (Sun)
  63518522400, #  local_start 2013-10-27 02:00:00 (Sun)
  63531828000, #    local_end 2014-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63531824400, #    utc_start 2014-03-30 01:00:00 (Sun)
  63549968400, #      utc_end 2014-10-26 01:00:00 (Sun)
  63531831600, #  local_start 2014-03-30 03:00:00 (Sun)
  63549975600, #    local_end 2014-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63549968400, #    utc_start 2014-10-26 01:00:00 (Sun)
  63563274000, #      utc_end 2015-03-29 01:00:00 (Sun)
  63549972000, #  local_start 2014-10-26 02:00:00 (Sun)
  63563277600, #    local_end 2015-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63563274000, #    utc_start 2015-03-29 01:00:00 (Sun)
  63581418000, #      utc_end 2015-10-25 01:00:00 (Sun)
  63563281200, #  local_start 2015-03-29 03:00:00 (Sun)
  63581425200, #    local_end 2015-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63581418000, #    utc_start 2015-10-25 01:00:00 (Sun)
  63594723600, #      utc_end 2016-03-27 01:00:00 (Sun)
  63581421600, #  local_start 2015-10-25 02:00:00 (Sun)
  63594727200, #    local_end 2016-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63594723600, #    utc_start 2016-03-27 01:00:00 (Sun)
  63613472400, #      utc_end 2016-10-30 01:00:00 (Sun)
  63594730800, #  local_start 2016-03-27 03:00:00 (Sun)
  63613479600, #    local_end 2016-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63613472400, #    utc_start 2016-10-30 01:00:00 (Sun)
  63626173200, #      utc_end 2017-03-26 01:00:00 (Sun)
  63613476000, #  local_start 2016-10-30 02:00:00 (Sun)
  63626176800, #    local_end 2017-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63626173200, #    utc_start 2017-03-26 01:00:00 (Sun)
  63644922000, #      utc_end 2017-10-29 01:00:00 (Sun)
  63626180400, #  local_start 2017-03-26 03:00:00 (Sun)
  63644929200, #    local_end 2017-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63644922000, #    utc_start 2017-10-29 01:00:00 (Sun)
  63657622800, #      utc_end 2018-03-25 01:00:00 (Sun)
  63644925600, #  local_start 2017-10-29 02:00:00 (Sun)
  63657626400, #    local_end 2018-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63657622800, #    utc_start 2018-03-25 01:00:00 (Sun)
  63676371600, #      utc_end 2018-10-28 01:00:00 (Sun)
  63657630000, #  local_start 2018-03-25 03:00:00 (Sun)
  63676378800, #    local_end 2018-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63676371600, #    utc_start 2018-10-28 01:00:00 (Sun)
  63689677200, #      utc_end 2019-03-31 01:00:00 (Sun)
  63676375200, #  local_start 2018-10-28 02:00:00 (Sun)
  63689680800, #    local_end 2019-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63689677200, #    utc_start 2019-03-31 01:00:00 (Sun)
  63707821200, #      utc_end 2019-10-27 01:00:00 (Sun)
  63689684400, #  local_start 2019-03-31 03:00:00 (Sun)
  63707828400, #    local_end 2019-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63707821200, #    utc_start 2019-10-27 01:00:00 (Sun)
  63721126800, #      utc_end 2020-03-29 01:00:00 (Sun)
  63707824800, #  local_start 2019-10-27 02:00:00 (Sun)
  63721130400, #    local_end 2020-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63721126800, #    utc_start 2020-03-29 01:00:00 (Sun)
  63739270800, #      utc_end 2020-10-25 01:00:00 (Sun)
  63721134000, #  local_start 2020-03-29 03:00:00 (Sun)
  63739278000, #    local_end 2020-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63739270800, #    utc_start 2020-10-25 01:00:00 (Sun)
  63752576400, #      utc_end 2021-03-28 01:00:00 (Sun)
  63739274400, #  local_start 2020-10-25 02:00:00 (Sun)
  63752580000, #    local_end 2021-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63752576400, #    utc_start 2021-03-28 01:00:00 (Sun)
  63771325200, #      utc_end 2021-10-31 01:00:00 (Sun)
  63752583600, #  local_start 2021-03-28 03:00:00 (Sun)
  63771332400, #    local_end 2021-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63771325200, #    utc_start 2021-10-31 01:00:00 (Sun)
  63784026000, #      utc_end 2022-03-27 01:00:00 (Sun)
  63771328800, #  local_start 2021-10-31 02:00:00 (Sun)
  63784029600, #    local_end 2022-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63784026000, #    utc_start 2022-03-27 01:00:00 (Sun)
  63802774800, #      utc_end 2022-10-30 01:00:00 (Sun)
  63784033200, #  local_start 2022-03-27 03:00:00 (Sun)
  63802782000, #    local_end 2022-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63802774800, #    utc_start 2022-10-30 01:00:00 (Sun)
  63815475600, #      utc_end 2023-03-26 01:00:00 (Sun)
  63802778400, #  local_start 2022-10-30 02:00:00 (Sun)
  63815479200, #    local_end 2023-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63815475600, #    utc_start 2023-03-26 01:00:00 (Sun)
  63834224400, #      utc_end 2023-10-29 01:00:00 (Sun)
  63815482800, #  local_start 2023-03-26 03:00:00 (Sun)
  63834231600, #    local_end 2023-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63834224400, #    utc_start 2023-10-29 01:00:00 (Sun)
  63847530000, #      utc_end 2024-03-31 01:00:00 (Sun)
  63834228000, #  local_start 2023-10-29 02:00:00 (Sun)
  63847533600, #    local_end 2024-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63847530000, #    utc_start 2024-03-31 01:00:00 (Sun)
  63865674000, #      utc_end 2024-10-27 01:00:00 (Sun)
  63847537200, #  local_start 2024-03-31 03:00:00 (Sun)
  63865681200, #    local_end 2024-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63865674000, #    utc_start 2024-10-27 01:00:00 (Sun)
  63878979600, #      utc_end 2025-03-30 01:00:00 (Sun)
  63865677600, #  local_start 2024-10-27 02:00:00 (Sun)
  63878983200, #    local_end 2025-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63878979600, #    utc_start 2025-03-30 01:00:00 (Sun)
  63897123600, #      utc_end 2025-10-26 01:00:00 (Sun)
  63878986800, #  local_start 2025-03-30 03:00:00 (Sun)
  63897130800, #    local_end 2025-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63897123600, #    utc_start 2025-10-26 01:00:00 (Sun)
  63910429200, #      utc_end 2026-03-29 01:00:00 (Sun)
  63897127200, #  local_start 2025-10-26 02:00:00 (Sun)
  63910432800, #    local_end 2026-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63910429200, #    utc_start 2026-03-29 01:00:00 (Sun)
  63928573200, #      utc_end 2026-10-25 01:00:00 (Sun)
  63910436400, #  local_start 2026-03-29 03:00:00 (Sun)
  63928580400, #    local_end 2026-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63928573200, #    utc_start 2026-10-25 01:00:00 (Sun)
  63941878800, #      utc_end 2027-03-28 01:00:00 (Sun)
  63928576800, #  local_start 2026-10-25 02:00:00 (Sun)
  63941882400, #    local_end 2027-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63941878800, #    utc_start 2027-03-28 01:00:00 (Sun)
  63960627600, #      utc_end 2027-10-31 01:00:00 (Sun)
  63941886000, #  local_start 2027-03-28 03:00:00 (Sun)
  63960634800, #    local_end 2027-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63960627600, #    utc_start 2027-10-31 01:00:00 (Sun)
  63973328400, #      utc_end 2028-03-26 01:00:00 (Sun)
  63960631200, #  local_start 2027-10-31 02:00:00 (Sun)
  63973332000, #    local_end 2028-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63973328400, #    utc_start 2028-03-26 01:00:00 (Sun)
  63992077200, #      utc_end 2028-10-29 01:00:00 (Sun)
  63973335600, #  local_start 2028-03-26 03:00:00 (Sun)
  63992084400, #    local_end 2028-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63992077200, #    utc_start 2028-10-29 01:00:00 (Sun)
  64004778000, #      utc_end 2029-03-25 01:00:00 (Sun)
  63992080800, #  local_start 2028-10-29 02:00:00 (Sun)
  64004781600, #    local_end 2029-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  64004778000, #    utc_start 2029-03-25 01:00:00 (Sun)
  64023526800, #      utc_end 2029-10-28 01:00:00 (Sun)
  64004785200, #  local_start 2029-03-25 03:00:00 (Sun)
  64023534000, #    local_end 2029-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  64023526800, #    utc_start 2029-10-28 01:00:00 (Sun)
  64036832400, #      utc_end 2030-03-31 01:00:00 (Sun)
  64023530400, #  local_start 2029-10-28 02:00:00 (Sun)
  64036836000, #    local_end 2030-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  64036832400, #    utc_start 2030-03-31 01:00:00 (Sun)
  64054976400, #      utc_end 2030-10-27 01:00:00 (Sun)
  64036839600, #  local_start 2030-03-31 03:00:00 (Sun)
  64054983600, #    local_end 2030-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {65}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { 3600 }
  
  my $last_observance = bless( {
    'format' => 'CE%sT',
    'gmtoff' => '1:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 722450,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 722450,
      'utc_rd_secs' => 0,
      'utc_year' => 1980
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => 3600,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 722449,
      'local_rd_secs' => 82800,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 722449,
      'utc_rd_secs' => 82800,
      'utc_year' => 1979
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '1:00u',
      'from' => '1996',
      'in' => 'Oct',
      'letter' => '',
      'name' => 'EU',
      'offset_from_std' => 0,
      'on' => 'lastSun',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '1:00u',
      'from' => '1981',
      'in' => 'Mar',
      'letter' => 'S',
      'name' => 'EU',
      'offset_from_std' => 3600,
      'on' => 'lastSun',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_EUROPE_PRAGUE

    $main::fatpacked{"DateTime/TimeZone/Europe/Riga.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_EUROPE_RIGA';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Europe::Riga;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Europe::Riga::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59295536606, #      utc_end 1879-12-31 22:23:26 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59295542400, #    local_end 1880-01-01 00:00:00 (Thu)
  5794,
  0,
  'LMT',
      ],
      [
  59295536606, #    utc_start 1879-12-31 22:23:26 (Wed)
  60503675006, #      utc_end 1918-04-15 00:23:26 (Mon)
  59295542400, #  local_start 1880-01-01 00:00:00 (Thu)
  60503680800, #    local_end 1918-04-15 02:00:00 (Mon)
  5794,
  0,
  'RMT',
      ],
      [
  60503675006, #    utc_start 1918-04-15 00:23:26 (Mon)
  60516980606, #      utc_end 1918-09-16 00:23:26 (Mon)
  60503684400, #  local_start 1918-04-15 03:00:00 (Mon)
  60516990000, #    local_end 1918-09-16 03:00:00 (Mon)
  9394,
  1,
  'LST',
      ],
      [
  60516980606, #    utc_start 1918-09-16 00:23:26 (Mon)
  60534001406, #      utc_end 1919-04-01 00:23:26 (Tue)
  60516986400, #  local_start 1918-09-16 02:00:00 (Mon)
  60534007200, #    local_end 1919-04-01 02:00:00 (Tue)
  5794,
  0,
  'RMT',
      ],
      [
  60534001406, #    utc_start 1919-04-01 00:23:26 (Tue)
  60538407806, #      utc_end 1919-05-22 00:23:26 (Thu)
  60534010800, #  local_start 1919-04-01 03:00:00 (Tue)
  60538417200, #    local_end 1919-05-22 03:00:00 (Thu)
  9394,
  1,
  'LST',
      ],
      [
  60538407806, #    utc_start 1919-05-22 00:23:26 (Thu)
  60758375006, #      utc_end 1926-05-10 22:23:26 (Mon)
  60538413600, #  local_start 1919-05-22 02:00:00 (Thu)
  60758380800, #    local_end 1926-05-11 00:00:00 (Tue)
  5794,
  0,
  'RMT',
      ],
      [
  60758375006, #    utc_start 1926-05-10 22:23:26 (Mon)
  61207653600, #      utc_end 1940-08-04 22:00:00 (Sun)
  60758382206, #  local_start 1926-05-11 00:23:26 (Tue)
  61207660800, #    local_end 1940-08-05 00:00:00 (Mon)
  7200,
  0,
  'EET',
      ],
      [
  61207653600, #    utc_start 1940-08-04 22:00:00 (Sun)
  61236162000, #      utc_end 1941-06-30 21:00:00 (Mon)
  61207664400, #  local_start 1940-08-05 01:00:00 (Mon)
  61236172800, #    local_end 1941-07-01 00:00:00 (Tue)
  10800,
  0,
  'MSK',
      ],
      [
  61236162000, #    utc_start 1941-06-30 21:00:00 (Mon)
  61278426000, #      utc_end 1942-11-02 01:00:00 (Mon)
  61236169200, #  local_start 1941-06-30 23:00:00 (Mon)
  61278433200, #    local_end 1942-11-02 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61278426000, #    utc_start 1942-11-02 01:00:00 (Mon)
  61291126800, #      utc_end 1943-03-29 01:00:00 (Mon)
  61278429600, #  local_start 1942-11-02 02:00:00 (Mon)
  61291130400, #    local_end 1943-03-29 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61291126800, #    utc_start 1943-03-29 01:00:00 (Mon)
  61307456400, #      utc_end 1943-10-04 01:00:00 (Mon)
  61291134000, #  local_start 1943-03-29 03:00:00 (Mon)
  61307463600, #    local_end 1943-10-04 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61307456400, #    utc_start 1943-10-04 01:00:00 (Mon)
  61323181200, #      utc_end 1944-04-03 01:00:00 (Mon)
  61307460000, #  local_start 1943-10-04 02:00:00 (Mon)
  61323184800, #    local_end 1944-04-03 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61323181200, #    utc_start 1944-04-03 01:00:00 (Mon)
  61338906000, #      utc_end 1944-10-02 01:00:00 (Mon)
  61323188400, #  local_start 1944-04-03 03:00:00 (Mon)
  61338913200, #    local_end 1944-10-02 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61338906000, #    utc_start 1944-10-02 01:00:00 (Mon)
  61339849200, #      utc_end 1944-10-12 23:00:00 (Thu)
  61338909600, #  local_start 1944-10-02 02:00:00 (Mon)
  61339852800, #    local_end 1944-10-13 00:00:00 (Fri)
  3600,
  0,
  'CET',
      ],
      [
  61339849200, #    utc_start 1944-10-12 23:00:00 (Thu)
  62490603600, #      utc_end 1981-03-31 21:00:00 (Tue)
  61339860000, #  local_start 1944-10-13 02:00:00 (Fri)
  62490614400, #    local_end 1981-04-01 00:00:00 (Wed)
  10800,
  0,
  'MSK',
      ],
      [
  62490603600, #    utc_start 1981-03-31 21:00:00 (Tue)
  62506411200, #      utc_end 1981-09-30 20:00:00 (Wed)
  62490618000, #  local_start 1981-04-01 01:00:00 (Wed)
  62506425600, #    local_end 1981-10-01 00:00:00 (Thu)
  14400,
  1,
  'MSD',
      ],
      [
  62506411200, #    utc_start 1981-09-30 20:00:00 (Wed)
  62522139600, #      utc_end 1982-03-31 21:00:00 (Wed)
  62506422000, #  local_start 1981-09-30 23:00:00 (Wed)
  62522150400, #    local_end 1982-04-01 00:00:00 (Thu)
  10800,
  0,
  'MSK',
      ],
      [
  62522139600, #    utc_start 1982-03-31 21:00:00 (Wed)
  62537947200, #      utc_end 1982-09-30 20:00:00 (Thu)
  62522154000, #  local_start 1982-04-01 01:00:00 (Thu)
  62537961600, #    local_end 1982-10-01 00:00:00 (Fri)
  14400,
  1,
  'MSD',
      ],
      [
  62537947200, #    utc_start 1982-09-30 20:00:00 (Thu)
  62553675600, #      utc_end 1983-03-31 21:00:00 (Thu)
  62537958000, #  local_start 1982-09-30 23:00:00 (Thu)
  62553686400, #    local_end 1983-04-01 00:00:00 (Fri)
  10800,
  0,
  'MSK',
      ],
      [
  62553675600, #    utc_start 1983-03-31 21:00:00 (Thu)
  62569483200, #      utc_end 1983-09-30 20:00:00 (Fri)
  62553690000, #  local_start 1983-04-01 01:00:00 (Fri)
  62569497600, #    local_end 1983-10-01 00:00:00 (Sat)
  14400,
  1,
  'MSD',
      ],
      [
  62569483200, #    utc_start 1983-09-30 20:00:00 (Fri)
  62585298000, #      utc_end 1984-03-31 21:00:00 (Sat)
  62569494000, #  local_start 1983-09-30 23:00:00 (Fri)
  62585308800, #    local_end 1984-04-01 00:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62585298000, #    utc_start 1984-03-31 21:00:00 (Sat)
  62601030000, #      utc_end 1984-09-29 23:00:00 (Sat)
  62585312400, #  local_start 1984-04-01 01:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62601030000, #    utc_start 1984-09-29 23:00:00 (Sat)
  62616754800, #      utc_end 1985-03-30 23:00:00 (Sat)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62616754800, #    utc_start 1985-03-30 23:00:00 (Sat)
  62632479600, #      utc_end 1985-09-28 23:00:00 (Sat)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62632479600, #    utc_start 1985-09-28 23:00:00 (Sat)
  62648204400, #      utc_end 1986-03-29 23:00:00 (Sat)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62648204400, #    utc_start 1986-03-29 23:00:00 (Sat)
  62663929200, #      utc_end 1986-09-27 23:00:00 (Sat)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62663929200, #    utc_start 1986-09-27 23:00:00 (Sat)
  62679654000, #      utc_end 1987-03-28 23:00:00 (Sat)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62679654000, #    utc_start 1987-03-28 23:00:00 (Sat)
  62695378800, #      utc_end 1987-09-26 23:00:00 (Sat)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62695378800, #    utc_start 1987-09-26 23:00:00 (Sat)
  62711103600, #      utc_end 1988-03-26 23:00:00 (Sat)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62711103600, #    utc_start 1988-03-26 23:00:00 (Sat)
  62726828400, #      utc_end 1988-09-24 23:00:00 (Sat)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62726828400, #    utc_start 1988-09-24 23:00:00 (Sat)
  62742553200, #      utc_end 1989-03-25 23:00:00 (Sat)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62742553200, #    utc_start 1989-03-25 23:00:00 (Sat)
  62758281600, #      utc_end 1989-09-24 00:00:00 (Sun)
  62742564000, #  local_start 1989-03-26 02:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62758281600, #    utc_start 1989-09-24 00:00:00 (Sun)
  62774006400, #      utc_end 1990-03-25 00:00:00 (Sun)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62774006400, #    utc_start 1990-03-25 00:00:00 (Sun)
  62790336000, #      utc_end 1990-09-30 00:00:00 (Sun)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62790336000, #    utc_start 1990-09-30 00:00:00 (Sun)
  62806060800, #      utc_end 1991-03-31 00:00:00 (Sun)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62806060800, #    utc_start 1991-03-31 00:00:00 (Sun)
  62821785600, #      utc_end 1991-09-29 00:00:00 (Sun)
  62806071600, #  local_start 1991-03-31 03:00:00 (Sun)
  62821796400, #    local_end 1991-09-29 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62821785600, #    utc_start 1991-09-29 00:00:00 (Sun)
  62837510400, #      utc_end 1992-03-29 00:00:00 (Sun)
  62821792800, #  local_start 1991-09-29 02:00:00 (Sun)
  62837517600, #    local_end 1992-03-29 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62837510400, #    utc_start 1992-03-29 00:00:00 (Sun)
  62853235200, #      utc_end 1992-09-27 00:00:00 (Sun)
  62837521200, #  local_start 1992-03-29 03:00:00 (Sun)
  62853246000, #    local_end 1992-09-27 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62853235200, #    utc_start 1992-09-27 00:00:00 (Sun)
  62868960000, #      utc_end 1993-03-28 00:00:00 (Sun)
  62853242400, #  local_start 1992-09-27 02:00:00 (Sun)
  62868967200, #    local_end 1993-03-28 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62868960000, #    utc_start 1993-03-28 00:00:00 (Sun)
  62884684800, #      utc_end 1993-09-26 00:00:00 (Sun)
  62868970800, #  local_start 1993-03-28 03:00:00 (Sun)
  62884695600, #    local_end 1993-09-26 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62884684800, #    utc_start 1993-09-26 00:00:00 (Sun)
  62900409600, #      utc_end 1994-03-27 00:00:00 (Sun)
  62884692000, #  local_start 1993-09-26 02:00:00 (Sun)
  62900416800, #    local_end 1994-03-27 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62900409600, #    utc_start 1994-03-27 00:00:00 (Sun)
  62916134400, #      utc_end 1994-09-25 00:00:00 (Sun)
  62900420400, #  local_start 1994-03-27 03:00:00 (Sun)
  62916145200, #    local_end 1994-09-25 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62916134400, #    utc_start 1994-09-25 00:00:00 (Sun)
  62931859200, #      utc_end 1995-03-26 00:00:00 (Sun)
  62916141600, #  local_start 1994-09-25 02:00:00 (Sun)
  62931866400, #    local_end 1995-03-26 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62931859200, #    utc_start 1995-03-26 00:00:00 (Sun)
  62947584000, #      utc_end 1995-09-24 00:00:00 (Sun)
  62931870000, #  local_start 1995-03-26 03:00:00 (Sun)
  62947594800, #    local_end 1995-09-24 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62947584000, #    utc_start 1995-09-24 00:00:00 (Sun)
  62963913600, #      utc_end 1996-03-31 00:00:00 (Sun)
  62947591200, #  local_start 1995-09-24 02:00:00 (Sun)
  62963920800, #    local_end 1996-03-31 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62963913600, #    utc_start 1996-03-31 00:00:00 (Sun)
  62979638400, #      utc_end 1996-09-29 00:00:00 (Sun)
  62963924400, #  local_start 1996-03-31 03:00:00 (Sun)
  62979649200, #    local_end 1996-09-29 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62979638400, #    utc_start 1996-09-29 00:00:00 (Sun)
  62989480800, #      utc_end 1997-01-20 22:00:00 (Mon)
  62979645600, #  local_start 1996-09-29 02:00:00 (Sun)
  62989488000, #    local_end 1997-01-21 00:00:00 (Tue)
  7200,
  0,
  'EET',
      ],
      [
  62989480800, #    utc_start 1997-01-20 22:00:00 (Mon)
  62995366800, #      utc_end 1997-03-30 01:00:00 (Sun)
  62989488000, #  local_start 1997-01-21 00:00:00 (Tue)
  62995374000, #    local_end 1997-03-30 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62995366800, #    utc_start 1997-03-30 01:00:00 (Sun)
  63013510800, #      utc_end 1997-10-26 01:00:00 (Sun)
  62995377600, #  local_start 1997-03-30 04:00:00 (Sun)
  63013521600, #    local_end 1997-10-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63013510800, #    utc_start 1997-10-26 01:00:00 (Sun)
  63026816400, #      utc_end 1998-03-29 01:00:00 (Sun)
  63013518000, #  local_start 1997-10-26 03:00:00 (Sun)
  63026823600, #    local_end 1998-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63026816400, #    utc_start 1998-03-29 01:00:00 (Sun)
  63044960400, #      utc_end 1998-10-25 01:00:00 (Sun)
  63026827200, #  local_start 1998-03-29 04:00:00 (Sun)
  63044971200, #    local_end 1998-10-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63044960400, #    utc_start 1998-10-25 01:00:00 (Sun)
  63058266000, #      utc_end 1999-03-28 01:00:00 (Sun)
  63044967600, #  local_start 1998-10-25 03:00:00 (Sun)
  63058273200, #    local_end 1999-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63058266000, #    utc_start 1999-03-28 01:00:00 (Sun)
  63077014800, #      utc_end 1999-10-31 01:00:00 (Sun)
  63058276800, #  local_start 1999-03-28 04:00:00 (Sun)
  63077025600, #    local_end 1999-10-31 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63077014800, #    utc_start 1999-10-31 01:00:00 (Sun)
  63087458400, #      utc_end 2000-02-28 22:00:00 (Mon)
  63077022000, #  local_start 1999-10-31 03:00:00 (Sun)
  63087465600, #    local_end 2000-02-29 00:00:00 (Tue)
  7200,
  0,
  'EET',
      ],
      [
  63087458400, #    utc_start 2000-02-28 22:00:00 (Mon)
  63114069600, #      utc_end 2001-01-01 22:00:00 (Mon)
  63087465600, #  local_start 2000-02-29 00:00:00 (Tue)
  63114076800, #    local_end 2001-01-02 00:00:00 (Tue)
  7200,
  0,
  'EET',
      ],
      [
  63114069600, #    utc_start 2001-01-01 22:00:00 (Mon)
  63121165200, #      utc_end 2001-03-25 01:00:00 (Sun)
  63114076800, #  local_start 2001-01-02 00:00:00 (Tue)
  63121172400, #    local_end 2001-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63121165200, #    utc_start 2001-03-25 01:00:00 (Sun)
  63139914000, #      utc_end 2001-10-28 01:00:00 (Sun)
  63121176000, #  local_start 2001-03-25 04:00:00 (Sun)
  63139924800, #    local_end 2001-10-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63139914000, #    utc_start 2001-10-28 01:00:00 (Sun)
  63153219600, #      utc_end 2002-03-31 01:00:00 (Sun)
  63139921200, #  local_start 2001-10-28 03:00:00 (Sun)
  63153226800, #    local_end 2002-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63153219600, #    utc_start 2002-03-31 01:00:00 (Sun)
  63171363600, #      utc_end 2002-10-27 01:00:00 (Sun)
  63153230400, #  local_start 2002-03-31 04:00:00 (Sun)
  63171374400, #    local_end 2002-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63171363600, #    utc_start 2002-10-27 01:00:00 (Sun)
  63184669200, #      utc_end 2003-03-30 01:00:00 (Sun)
  63171370800, #  local_start 2002-10-27 03:00:00 (Sun)
  63184676400, #    local_end 2003-03-30 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63184669200, #    utc_start 2003-03-30 01:00:00 (Sun)
  63202813200, #      utc_end 2003-10-26 01:00:00 (Sun)
  63184680000, #  local_start 2003-03-30 04:00:00 (Sun)
  63202824000, #    local_end 2003-10-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63202813200, #    utc_start 2003-10-26 01:00:00 (Sun)
  63216118800, #      utc_end 2004-03-28 01:00:00 (Sun)
  63202820400, #  local_start 2003-10-26 03:00:00 (Sun)
  63216126000, #    local_end 2004-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63216118800, #    utc_start 2004-03-28 01:00:00 (Sun)
  63234867600, #      utc_end 2004-10-31 01:00:00 (Sun)
  63216129600, #  local_start 2004-03-28 04:00:00 (Sun)
  63234878400, #    local_end 2004-10-31 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63234867600, #    utc_start 2004-10-31 01:00:00 (Sun)
  63247568400, #      utc_end 2005-03-27 01:00:00 (Sun)
  63234874800, #  local_start 2004-10-31 03:00:00 (Sun)
  63247575600, #    local_end 2005-03-27 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63247568400, #    utc_start 2005-03-27 01:00:00 (Sun)
  63266317200, #      utc_end 2005-10-30 01:00:00 (Sun)
  63247579200, #  local_start 2005-03-27 04:00:00 (Sun)
  63266328000, #    local_end 2005-10-30 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63266317200, #    utc_start 2005-10-30 01:00:00 (Sun)
  63279018000, #      utc_end 2006-03-26 01:00:00 (Sun)
  63266324400, #  local_start 2005-10-30 03:00:00 (Sun)
  63279025200, #    local_end 2006-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63279018000, #    utc_start 2006-03-26 01:00:00 (Sun)
  63297766800, #      utc_end 2006-10-29 01:00:00 (Sun)
  63279028800, #  local_start 2006-03-26 04:00:00 (Sun)
  63297777600, #    local_end 2006-10-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63297766800, #    utc_start 2006-10-29 01:00:00 (Sun)
  63310467600, #      utc_end 2007-03-25 01:00:00 (Sun)
  63297774000, #  local_start 2006-10-29 03:00:00 (Sun)
  63310474800, #    local_end 2007-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63310467600, #    utc_start 2007-03-25 01:00:00 (Sun)
  63329216400, #      utc_end 2007-10-28 01:00:00 (Sun)
  63310478400, #  local_start 2007-03-25 04:00:00 (Sun)
  63329227200, #    local_end 2007-10-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63329216400, #    utc_start 2007-10-28 01:00:00 (Sun)
  63342522000, #      utc_end 2008-03-30 01:00:00 (Sun)
  63329223600, #  local_start 2007-10-28 03:00:00 (Sun)
  63342529200, #    local_end 2008-03-30 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63342522000, #    utc_start 2008-03-30 01:00:00 (Sun)
  63360666000, #      utc_end 2008-10-26 01:00:00 (Sun)
  63342532800, #  local_start 2008-03-30 04:00:00 (Sun)
  63360676800, #    local_end 2008-10-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63360666000, #    utc_start 2008-10-26 01:00:00 (Sun)
  63373971600, #      utc_end 2009-03-29 01:00:00 (Sun)
  63360673200, #  local_start 2008-10-26 03:00:00 (Sun)
  63373978800, #    local_end 2009-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63373971600, #    utc_start 2009-03-29 01:00:00 (Sun)
  63392115600, #      utc_end 2009-10-25 01:00:00 (Sun)
  63373982400, #  local_start 2009-03-29 04:00:00 (Sun)
  63392126400, #    local_end 2009-10-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63392115600, #    utc_start 2009-10-25 01:00:00 (Sun)
  63405421200, #      utc_end 2010-03-28 01:00:00 (Sun)
  63392122800, #  local_start 2009-10-25 03:00:00 (Sun)
  63405428400, #    local_end 2010-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63405421200, #    utc_start 2010-03-28 01:00:00 (Sun)
  63424170000, #      utc_end 2010-10-31 01:00:00 (Sun)
  63405432000, #  local_start 2010-03-28 04:00:00 (Sun)
  63424180800, #    local_end 2010-10-31 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63424170000, #    utc_start 2010-10-31 01:00:00 (Sun)
  63436870800, #      utc_end 2011-03-27 01:00:00 (Sun)
  63424177200, #  local_start 2010-10-31 03:00:00 (Sun)
  63436878000, #    local_end 2011-03-27 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63436870800, #    utc_start 2011-03-27 01:00:00 (Sun)
  63455619600, #      utc_end 2011-10-30 01:00:00 (Sun)
  63436881600, #  local_start 2011-03-27 04:00:00 (Sun)
  63455630400, #    local_end 2011-10-30 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63455619600, #    utc_start 2011-10-30 01:00:00 (Sun)
  63468320400, #      utc_end 2012-03-25 01:00:00 (Sun)
  63455626800, #  local_start 2011-10-30 03:00:00 (Sun)
  63468327600, #    local_end 2012-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63468320400, #    utc_start 2012-03-25 01:00:00 (Sun)
  63487069200, #      utc_end 2012-10-28 01:00:00 (Sun)
  63468331200, #  local_start 2012-03-25 04:00:00 (Sun)
  63487080000, #    local_end 2012-10-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63487069200, #    utc_start 2012-10-28 01:00:00 (Sun)
  63500374800, #      utc_end 2013-03-31 01:00:00 (Sun)
  63487076400, #  local_start 2012-10-28 03:00:00 (Sun)
  63500382000, #    local_end 2013-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63500374800, #    utc_start 2013-03-31 01:00:00 (Sun)
  63518518800, #      utc_end 2013-10-27 01:00:00 (Sun)
  63500385600, #  local_start 2013-03-31 04:00:00 (Sun)
  63518529600, #    local_end 2013-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63518518800, #    utc_start 2013-10-27 01:00:00 (Sun)
  63531824400, #      utc_end 2014-03-30 01:00:00 (Sun)
  63518526000, #  local_start 2013-10-27 03:00:00 (Sun)
  63531831600, #    local_end 2014-03-30 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63531824400, #    utc_start 2014-03-30 01:00:00 (Sun)
  63549968400, #      utc_end 2014-10-26 01:00:00 (Sun)
  63531835200, #  local_start 2014-03-30 04:00:00 (Sun)
  63549979200, #    local_end 2014-10-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63549968400, #    utc_start 2014-10-26 01:00:00 (Sun)
  63563274000, #      utc_end 2015-03-29 01:00:00 (Sun)
  63549975600, #  local_start 2014-10-26 03:00:00 (Sun)
  63563281200, #    local_end 2015-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63563274000, #    utc_start 2015-03-29 01:00:00 (Sun)
  63581418000, #      utc_end 2015-10-25 01:00:00 (Sun)
  63563284800, #  local_start 2015-03-29 04:00:00 (Sun)
  63581428800, #    local_end 2015-10-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63581418000, #    utc_start 2015-10-25 01:00:00 (Sun)
  63594723600, #      utc_end 2016-03-27 01:00:00 (Sun)
  63581425200, #  local_start 2015-10-25 03:00:00 (Sun)
  63594730800, #    local_end 2016-03-27 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63594723600, #    utc_start 2016-03-27 01:00:00 (Sun)
  63613472400, #      utc_end 2016-10-30 01:00:00 (Sun)
  63594734400, #  local_start 2016-03-27 04:00:00 (Sun)
  63613483200, #    local_end 2016-10-30 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63613472400, #    utc_start 2016-10-30 01:00:00 (Sun)
  63626173200, #      utc_end 2017-03-26 01:00:00 (Sun)
  63613479600, #  local_start 2016-10-30 03:00:00 (Sun)
  63626180400, #    local_end 2017-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63626173200, #    utc_start 2017-03-26 01:00:00 (Sun)
  63644922000, #      utc_end 2017-10-29 01:00:00 (Sun)
  63626184000, #  local_start 2017-03-26 04:00:00 (Sun)
  63644932800, #    local_end 2017-10-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63644922000, #    utc_start 2017-10-29 01:00:00 (Sun)
  63657622800, #      utc_end 2018-03-25 01:00:00 (Sun)
  63644929200, #  local_start 2017-10-29 03:00:00 (Sun)
  63657630000, #    local_end 2018-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63657622800, #    utc_start 2018-03-25 01:00:00 (Sun)
  63676371600, #      utc_end 2018-10-28 01:00:00 (Sun)
  63657633600, #  local_start 2018-03-25 04:00:00 (Sun)
  63676382400, #    local_end 2018-10-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63676371600, #    utc_start 2018-10-28 01:00:00 (Sun)
  63689677200, #      utc_end 2019-03-31 01:00:00 (Sun)
  63676378800, #  local_start 2018-10-28 03:00:00 (Sun)
  63689684400, #    local_end 2019-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63689677200, #    utc_start 2019-03-31 01:00:00 (Sun)
  63707821200, #      utc_end 2019-10-27 01:00:00 (Sun)
  63689688000, #  local_start 2019-03-31 04:00:00 (Sun)
  63707832000, #    local_end 2019-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63707821200, #    utc_start 2019-10-27 01:00:00 (Sun)
  63721126800, #      utc_end 2020-03-29 01:00:00 (Sun)
  63707828400, #  local_start 2019-10-27 03:00:00 (Sun)
  63721134000, #    local_end 2020-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63721126800, #    utc_start 2020-03-29 01:00:00 (Sun)
  63739270800, #      utc_end 2020-10-25 01:00:00 (Sun)
  63721137600, #  local_start 2020-03-29 04:00:00 (Sun)
  63739281600, #    local_end 2020-10-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63739270800, #    utc_start 2020-10-25 01:00:00 (Sun)
  63752576400, #      utc_end 2021-03-28 01:00:00 (Sun)
  63739278000, #  local_start 2020-10-25 03:00:00 (Sun)
  63752583600, #    local_end 2021-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63752576400, #    utc_start 2021-03-28 01:00:00 (Sun)
  63771325200, #      utc_end 2021-10-31 01:00:00 (Sun)
  63752587200, #  local_start 2021-03-28 04:00:00 (Sun)
  63771336000, #    local_end 2021-10-31 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63771325200, #    utc_start 2021-10-31 01:00:00 (Sun)
  63784026000, #      utc_end 2022-03-27 01:00:00 (Sun)
  63771332400, #  local_start 2021-10-31 03:00:00 (Sun)
  63784033200, #    local_end 2022-03-27 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63784026000, #    utc_start 2022-03-27 01:00:00 (Sun)
  63802774800, #      utc_end 2022-10-30 01:00:00 (Sun)
  63784036800, #  local_start 2022-03-27 04:00:00 (Sun)
  63802785600, #    local_end 2022-10-30 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63802774800, #    utc_start 2022-10-30 01:00:00 (Sun)
  63815475600, #      utc_end 2023-03-26 01:00:00 (Sun)
  63802782000, #  local_start 2022-10-30 03:00:00 (Sun)
  63815482800, #    local_end 2023-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63815475600, #    utc_start 2023-03-26 01:00:00 (Sun)
  63834224400, #      utc_end 2023-10-29 01:00:00 (Sun)
  63815486400, #  local_start 2023-03-26 04:00:00 (Sun)
  63834235200, #    local_end 2023-10-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63834224400, #    utc_start 2023-10-29 01:00:00 (Sun)
  63847530000, #      utc_end 2024-03-31 01:00:00 (Sun)
  63834231600, #  local_start 2023-10-29 03:00:00 (Sun)
  63847537200, #    local_end 2024-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63847530000, #    utc_start 2024-03-31 01:00:00 (Sun)
  63865674000, #      utc_end 2024-10-27 01:00:00 (Sun)
  63847540800, #  local_start 2024-03-31 04:00:00 (Sun)
  63865684800, #    local_end 2024-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63865674000, #    utc_start 2024-10-27 01:00:00 (Sun)
  63878979600, #      utc_end 2025-03-30 01:00:00 (Sun)
  63865681200, #  local_start 2024-10-27 03:00:00 (Sun)
  63878986800, #    local_end 2025-03-30 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63878979600, #    utc_start 2025-03-30 01:00:00 (Sun)
  63897123600, #      utc_end 2025-10-26 01:00:00 (Sun)
  63878990400, #  local_start 2025-03-30 04:00:00 (Sun)
  63897134400, #    local_end 2025-10-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63897123600, #    utc_start 2025-10-26 01:00:00 (Sun)
  63910429200, #      utc_end 2026-03-29 01:00:00 (Sun)
  63897130800, #  local_start 2025-10-26 03:00:00 (Sun)
  63910436400, #    local_end 2026-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63910429200, #    utc_start 2026-03-29 01:00:00 (Sun)
  63928573200, #      utc_end 2026-10-25 01:00:00 (Sun)
  63910440000, #  local_start 2026-03-29 04:00:00 (Sun)
  63928584000, #    local_end 2026-10-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63928573200, #    utc_start 2026-10-25 01:00:00 (Sun)
  63941878800, #      utc_end 2027-03-28 01:00:00 (Sun)
  63928580400, #  local_start 2026-10-25 03:00:00 (Sun)
  63941886000, #    local_end 2027-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63941878800, #    utc_start 2027-03-28 01:00:00 (Sun)
  63960627600, #      utc_end 2027-10-31 01:00:00 (Sun)
  63941889600, #  local_start 2027-03-28 04:00:00 (Sun)
  63960638400, #    local_end 2027-10-31 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63960627600, #    utc_start 2027-10-31 01:00:00 (Sun)
  63973328400, #      utc_end 2028-03-26 01:00:00 (Sun)
  63960634800, #  local_start 2027-10-31 03:00:00 (Sun)
  63973335600, #    local_end 2028-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63973328400, #    utc_start 2028-03-26 01:00:00 (Sun)
  63992077200, #      utc_end 2028-10-29 01:00:00 (Sun)
  63973339200, #  local_start 2028-03-26 04:00:00 (Sun)
  63992088000, #    local_end 2028-10-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63992077200, #    utc_start 2028-10-29 01:00:00 (Sun)
  64004778000, #      utc_end 2029-03-25 01:00:00 (Sun)
  63992084400, #  local_start 2028-10-29 03:00:00 (Sun)
  64004785200, #    local_end 2029-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  64004778000, #    utc_start 2029-03-25 01:00:00 (Sun)
  64023526800, #      utc_end 2029-10-28 01:00:00 (Sun)
  64004788800, #  local_start 2029-03-25 04:00:00 (Sun)
  64023537600, #    local_end 2029-10-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  64023526800, #    utc_start 2029-10-28 01:00:00 (Sun)
  64036832400, #      utc_end 2030-03-31 01:00:00 (Sun)
  64023534000, #  local_start 2029-10-28 03:00:00 (Sun)
  64036839600, #    local_end 2030-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  64036832400, #    utc_start 2030-03-31 01:00:00 (Sun)
  64054976400, #      utc_end 2030-10-27 01:00:00 (Sun)
  64036843200, #  local_start 2030-03-31 04:00:00 (Sun)
  64054987200, #    local_end 2030-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {54}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { 7200 }
  
  my $last_observance = bless( {
    'format' => 'EE%sT',
    'gmtoff' => '2:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 730487,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 730487,
      'utc_rd_secs' => 0,
      'utc_year' => 2002
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => 7200,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 730486,
      'local_rd_secs' => 79200,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 730486,
      'utc_rd_secs' => 79200,
      'utc_year' => 2002
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '1:00u',
      'from' => '1981',
      'in' => 'Mar',
      'letter' => 'S',
      'name' => 'EU',
      'offset_from_std' => 3600,
      'on' => 'lastSun',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '1:00u',
      'from' => '1996',
      'in' => 'Oct',
      'letter' => '',
      'name' => 'EU',
      'offset_from_std' => 0,
      'on' => 'lastSun',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_EUROPE_RIGA

    $main::fatpacked{"DateTime/TimeZone/Europe/Rome.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_EUROPE_ROME';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Europe::Rome;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Europe::Rome::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  58883584204, #      utc_end 1866-12-11 23:10:04 (Tue)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  58883587200, #    local_end 1866-12-12 00:00:00 (Wed)
  2996,
  0,
  'LMT',
      ],
      [
  58883584204, #    utc_start 1866-12-11 23:10:04 (Tue)
  59732118000, #      utc_end 1893-10-31 23:00:00 (Tue)
  58883587200, #  local_start 1866-12-12 00:00:00 (Wed)
  59732120996, #    local_end 1893-10-31 23:49:56 (Tue)
  2996,
  0,
  'RMT',
      ],
      [
  59732118000, #    utc_start 1893-10-31 23:00:00 (Tue)
  60444918000, #      utc_end 1916-06-03 23:00:00 (Sat)
  59732121600, #  local_start 1893-11-01 00:00:00 (Wed)
  60444921600, #    local_end 1916-06-04 00:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  60444918000, #    utc_start 1916-06-03 23:00:00 (Sat)
  60455196000, #      utc_end 1916-09-30 22:00:00 (Sat)
  60444925200, #  local_start 1916-06-04 01:00:00 (Sun)
  60455203200, #    local_end 1916-10-01 00:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  60455196000, #    utc_start 1916-09-30 22:00:00 (Sat)
  60470924400, #      utc_end 1917-03-31 23:00:00 (Sat)
  60455199600, #  local_start 1916-09-30 23:00:00 (Sat)
  60470928000, #    local_end 1917-04-01 00:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  60470924400, #    utc_start 1917-03-31 23:00:00 (Sat)
  60486732000, #      utc_end 1917-09-30 22:00:00 (Sun)
  60470931600, #  local_start 1917-04-01 01:00:00 (Sun)
  60486739200, #    local_end 1917-10-01 00:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  60486732000, #    utc_start 1917-09-30 22:00:00 (Sun)
  60500559600, #      utc_end 1918-03-09 23:00:00 (Sat)
  60486735600, #  local_start 1917-09-30 23:00:00 (Sun)
  60500563200, #    local_end 1918-03-10 00:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  60500559600, #    utc_start 1918-03-09 23:00:00 (Sat)
  60518786400, #      utc_end 1918-10-06 22:00:00 (Sun)
  60500566800, #  local_start 1918-03-10 01:00:00 (Sun)
  60518793600, #    local_end 1918-10-07 00:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  60518786400, #    utc_start 1918-10-06 22:00:00 (Sun)
  60531404400, #      utc_end 1919-03-01 23:00:00 (Sat)
  60518790000, #  local_start 1918-10-06 23:00:00 (Sun)
  60531408000, #    local_end 1919-03-02 00:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  60531404400, #    utc_start 1919-03-01 23:00:00 (Sat)
  60550149600, #      utc_end 1919-10-04 22:00:00 (Sat)
  60531411600, #  local_start 1919-03-02 01:00:00 (Sun)
  60550156800, #    local_end 1919-10-05 00:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  60550149600, #    utc_start 1919-10-04 22:00:00 (Sat)
  60564668400, #      utc_end 1920-03-20 23:00:00 (Sat)
  60550153200, #  local_start 1919-10-04 23:00:00 (Sat)
  60564672000, #    local_end 1920-03-21 00:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  60564668400, #    utc_start 1920-03-20 23:00:00 (Sat)
  60580389600, #      utc_end 1920-09-18 22:00:00 (Sat)
  60564675600, #  local_start 1920-03-21 01:00:00 (Sun)
  60580396800, #    local_end 1920-09-19 00:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  60580389600, #    utc_start 1920-09-18 22:00:00 (Sat)
  61203250800, #      utc_end 1940-06-14 23:00:00 (Fri)
  60580393200, #  local_start 1920-09-18 23:00:00 (Sat)
  61203254400, #    local_end 1940-06-15 00:00:00 (Sat)
  3600,
  0,
  'CET',
      ],
      [
  61203250800, #    utc_start 1940-06-14 23:00:00 (Fri)
  61278426000, #      utc_end 1942-11-02 01:00:00 (Mon)
  61203258000, #  local_start 1940-06-15 01:00:00 (Sat)
  61278433200, #    local_end 1942-11-02 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61278426000, #    utc_start 1942-11-02 01:00:00 (Mon)
  61291126800, #      utc_end 1943-03-29 01:00:00 (Mon)
  61278429600, #  local_start 1942-11-02 02:00:00 (Mon)
  61291130400, #    local_end 1943-03-29 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61291126800, #    utc_start 1943-03-29 01:00:00 (Mon)
  61305372000, #      utc_end 1943-09-09 22:00:00 (Thu)
  61291134000, #  local_start 1943-03-29 03:00:00 (Mon)
  61305379200, #    local_end 1943-09-10 00:00:00 (Fri)
  7200,
  1,
  'CEST',
      ],
      [
  61305372000, #    utc_start 1943-09-09 22:00:00 (Thu)
  61307456400, #      utc_end 1943-10-04 01:00:00 (Mon)
  61305379200, #  local_start 1943-09-10 00:00:00 (Fri)
  61307463600, #    local_end 1943-10-04 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61307456400, #    utc_start 1943-10-04 01:00:00 (Mon)
  61323181200, #      utc_end 1944-04-03 01:00:00 (Mon)
  61307460000, #  local_start 1943-10-04 02:00:00 (Mon)
  61323184800, #    local_end 1944-04-03 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61323181200, #    utc_start 1944-04-03 01:00:00 (Mon)
  61328527200, #      utc_end 1944-06-03 22:00:00 (Sat)
  61323188400, #  local_start 1944-04-03 03:00:00 (Mon)
  61328534400, #    local_end 1944-06-04 00:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  61328527200, #    utc_start 1944-06-03 22:00:00 (Sat)
  61337610000, #      utc_end 1944-09-17 01:00:00 (Sun)
  61328534400, #  local_start 1944-06-04 00:00:00 (Sun)
  61337617200, #    local_end 1944-09-17 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  61337610000, #    utc_start 1944-09-17 01:00:00 (Sun)
  61354630800, #      utc_end 1945-04-02 01:00:00 (Mon)
  61337613600, #  local_start 1944-09-17 02:00:00 (Sun)
  61354634400, #    local_end 1945-04-02 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61354630800, #    utc_start 1945-04-02 01:00:00 (Mon)
  61368966000, #      utc_end 1945-09-14 23:00:00 (Fri)
  61354638000, #  local_start 1945-04-02 03:00:00 (Mon)
  61368973200, #    local_end 1945-09-15 01:00:00 (Sat)
  7200,
  1,
  'CEST',
      ],
      [
  61368966000, #    utc_start 1945-09-14 23:00:00 (Fri)
  61384784400, #      utc_end 1946-03-17 01:00:00 (Sun)
  61368969600, #  local_start 1945-09-15 00:00:00 (Sat)
  61384788000, #    local_end 1946-03-17 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  61384784400, #    utc_start 1946-03-17 01:00:00 (Sun)
  61402323600, #      utc_end 1946-10-06 01:00:00 (Sun)
  61384791600, #  local_start 1946-03-17 03:00:00 (Sun)
  61402330800, #    local_end 1946-10-06 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  61402323600, #    utc_start 1946-10-06 01:00:00 (Sun)
  61416226800, #      utc_end 1947-03-15 23:00:00 (Sat)
  61402327200, #  local_start 1946-10-06 02:00:00 (Sun)
  61416230400, #    local_end 1947-03-16 00:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  61416226800, #    utc_start 1947-03-15 23:00:00 (Sat)
  61433766000, #      utc_end 1947-10-04 23:00:00 (Sat)
  61416234000, #  local_start 1947-03-16 01:00:00 (Sun)
  61433773200, #    local_end 1947-10-05 01:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  61433766000, #    utc_start 1947-10-04 23:00:00 (Sat)
  61446474000, #      utc_end 1948-02-29 01:00:00 (Sun)
  61433769600, #  local_start 1947-10-05 00:00:00 (Sun)
  61446477600, #    local_end 1948-02-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  61446474000, #    utc_start 1948-02-29 01:00:00 (Sun)
  61465222800, #      utc_end 1948-10-03 01:00:00 (Sun)
  61446481200, #  local_start 1948-02-29 03:00:00 (Sun)
  61465230000, #    local_end 1948-10-03 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  61465222800, #    utc_start 1948-10-03 01:00:00 (Sun)
  62021631600, #      utc_end 1966-05-21 23:00:00 (Sat)
  61465226400, #  local_start 1948-10-03 02:00:00 (Sun)
  62021635200, #    local_end 1966-05-22 00:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62021631600, #    utc_start 1966-05-21 23:00:00 (Sat)
  62032514400, #      utc_end 1966-09-24 22:00:00 (Sat)
  62021638800, #  local_start 1966-05-22 01:00:00 (Sun)
  62032521600, #    local_end 1966-09-25 00:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62032514400, #    utc_start 1966-09-24 22:00:00 (Sat)
  62053686000, #      utc_end 1967-05-27 23:00:00 (Sat)
  62032518000, #  local_start 1966-09-24 23:00:00 (Sat)
  62053689600, #    local_end 1967-05-28 00:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62053686000, #    utc_start 1967-05-27 23:00:00 (Sat)
  62063967600, #      utc_end 1967-09-23 23:00:00 (Sat)
  62053693200, #  local_start 1967-05-28 01:00:00 (Sun)
  62063974800, #    local_end 1967-09-24 01:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62063967600, #    utc_start 1967-09-23 23:00:00 (Sat)
  62085135600, #      utc_end 1968-05-25 23:00:00 (Sat)
  62063971200, #  local_start 1967-09-24 00:00:00 (Sun)
  62085139200, #    local_end 1968-05-26 00:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62085135600, #    utc_start 1968-05-25 23:00:00 (Sat)
  62095417200, #      utc_end 1968-09-21 23:00:00 (Sat)
  62085142800, #  local_start 1968-05-26 01:00:00 (Sun)
  62095424400, #    local_end 1968-09-22 01:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62095417200, #    utc_start 1968-09-21 23:00:00 (Sat)
  62117190000, #      utc_end 1969-05-31 23:00:00 (Sat)
  62095420800, #  local_start 1968-09-22 00:00:00 (Sun)
  62117193600, #    local_end 1969-06-01 00:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62117190000, #    utc_start 1969-05-31 23:00:00 (Sat)
  62127471600, #      utc_end 1969-09-27 23:00:00 (Sat)
  62117197200, #  local_start 1969-06-01 01:00:00 (Sun)
  62127478800, #    local_end 1969-09-28 01:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62127471600, #    utc_start 1969-09-27 23:00:00 (Sat)
  62148639600, #      utc_end 1970-05-30 23:00:00 (Sat)
  62127475200, #  local_start 1969-09-28 00:00:00 (Sun)
  62148643200, #    local_end 1970-05-31 00:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62148639600, #    utc_start 1970-05-30 23:00:00 (Sat)
  62158921200, #      utc_end 1970-09-26 23:00:00 (Sat)
  62148646800, #  local_start 1970-05-31 01:00:00 (Sun)
  62158928400, #    local_end 1970-09-27 01:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62158921200, #    utc_start 1970-09-26 23:00:00 (Sat)
  62179484400, #      utc_end 1971-05-22 23:00:00 (Sat)
  62158924800, #  local_start 1970-09-27 00:00:00 (Sun)
  62179488000, #    local_end 1971-05-23 00:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62179484400, #    utc_start 1971-05-22 23:00:00 (Sat)
  62190370800, #      utc_end 1971-09-25 23:00:00 (Sat)
  62179491600, #  local_start 1971-05-23 01:00:00 (Sun)
  62190378000, #    local_end 1971-09-26 01:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62190370800, #    utc_start 1971-09-25 23:00:00 (Sat)
  62211538800, #      utc_end 1972-05-27 23:00:00 (Sat)
  62190374400, #  local_start 1971-09-26 00:00:00 (Sun)
  62211542400, #    local_end 1972-05-28 00:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62211538800, #    utc_start 1972-05-27 23:00:00 (Sat)
  62222425200, #      utc_end 1972-09-30 23:00:00 (Sat)
  62211546000, #  local_start 1972-05-28 01:00:00 (Sun)
  62222432400, #    local_end 1972-10-01 01:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62222425200, #    utc_start 1972-09-30 23:00:00 (Sat)
  62243593200, #      utc_end 1973-06-02 23:00:00 (Sat)
  62222428800, #  local_start 1972-10-01 00:00:00 (Sun)
  62243596800, #    local_end 1973-06-03 00:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62243593200, #    utc_start 1973-06-02 23:00:00 (Sat)
  62253874800, #      utc_end 1973-09-29 23:00:00 (Sat)
  62243600400, #  local_start 1973-06-03 01:00:00 (Sun)
  62253882000, #    local_end 1973-09-30 01:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62253874800, #    utc_start 1973-09-29 23:00:00 (Sat)
  62274438000, #      utc_end 1974-05-25 23:00:00 (Sat)
  62253878400, #  local_start 1973-09-30 00:00:00 (Sun)
  62274441600, #    local_end 1974-05-26 00:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62274438000, #    utc_start 1974-05-25 23:00:00 (Sat)
  62285324400, #      utc_end 1974-09-28 23:00:00 (Sat)
  62274445200, #  local_start 1974-05-26 01:00:00 (Sun)
  62285331600, #    local_end 1974-09-29 01:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62285324400, #    utc_start 1974-09-28 23:00:00 (Sat)
  62306492400, #      utc_end 1975-05-31 23:00:00 (Sat)
  62285328000, #  local_start 1974-09-29 00:00:00 (Sun)
  62306496000, #    local_end 1975-06-01 00:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62306492400, #    utc_start 1975-05-31 23:00:00 (Sat)
  62316774000, #      utc_end 1975-09-27 23:00:00 (Sat)
  62306499600, #  local_start 1975-06-01 01:00:00 (Sun)
  62316781200, #    local_end 1975-09-28 01:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62316774000, #    utc_start 1975-09-27 23:00:00 (Sat)
  62337942000, #      utc_end 1976-05-29 23:00:00 (Sat)
  62316777600, #  local_start 1975-09-28 00:00:00 (Sun)
  62337945600, #    local_end 1976-05-30 00:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62337942000, #    utc_start 1976-05-29 23:00:00 (Sat)
  62348223600, #      utc_end 1976-09-25 23:00:00 (Sat)
  62337949200, #  local_start 1976-05-30 01:00:00 (Sun)
  62348230800, #    local_end 1976-09-26 01:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62348223600, #    utc_start 1976-09-25 23:00:00 (Sat)
  62368786800, #      utc_end 1977-05-21 23:00:00 (Sat)
  62348227200, #  local_start 1976-09-26 00:00:00 (Sun)
  62368790400, #    local_end 1977-05-22 00:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62368786800, #    utc_start 1977-05-21 23:00:00 (Sat)
  62379673200, #      utc_end 1977-09-24 23:00:00 (Sat)
  62368794000, #  local_start 1977-05-22 01:00:00 (Sun)
  62379680400, #    local_end 1977-09-25 01:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62379673200, #    utc_start 1977-09-24 23:00:00 (Sat)
  62400841200, #      utc_end 1978-05-27 23:00:00 (Sat)
  62379676800, #  local_start 1977-09-25 00:00:00 (Sun)
  62400844800, #    local_end 1978-05-28 00:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62400841200, #    utc_start 1978-05-27 23:00:00 (Sat)
  62411727600, #      utc_end 1978-09-30 23:00:00 (Sat)
  62400848400, #  local_start 1978-05-28 01:00:00 (Sun)
  62411734800, #    local_end 1978-10-01 01:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62411727600, #    utc_start 1978-09-30 23:00:00 (Sat)
  62432290800, #      utc_end 1979-05-26 23:00:00 (Sat)
  62411731200, #  local_start 1978-10-01 00:00:00 (Sun)
  62432294400, #    local_end 1979-05-27 00:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62432290800, #    utc_start 1979-05-26 23:00:00 (Sat)
  62443177200, #      utc_end 1979-09-29 23:00:00 (Sat)
  62432298000, #  local_start 1979-05-27 01:00:00 (Sun)
  62443184400, #    local_end 1979-09-30 01:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62443177200, #    utc_start 1979-09-29 23:00:00 (Sat)
  62451212400, #      utc_end 1979-12-31 23:00:00 (Mon)
  62443180800, #  local_start 1979-09-30 00:00:00 (Sun)
  62451216000, #    local_end 1980-01-01 00:00:00 (Tue)
  3600,
  0,
  'CET',
      ],
      [
  62451212400, #    utc_start 1979-12-31 23:00:00 (Mon)
  62459514000, #      utc_end 1980-04-06 01:00:00 (Sun)
  62451216000, #  local_start 1980-01-01 00:00:00 (Tue)
  62459517600, #    local_end 1980-04-06 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62459514000, #    utc_start 1980-04-06 01:00:00 (Sun)
  62474634000, #      utc_end 1980-09-28 01:00:00 (Sun)
  62459521200, #  local_start 1980-04-06 03:00:00 (Sun)
  62474641200, #    local_end 1980-09-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62474634000, #    utc_start 1980-09-28 01:00:00 (Sun)
  62490358800, #      utc_end 1981-03-29 01:00:00 (Sun)
  62474637600, #  local_start 1980-09-28 02:00:00 (Sun)
  62490362400, #    local_end 1981-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62490358800, #    utc_start 1981-03-29 01:00:00 (Sun)
  62506083600, #      utc_end 1981-09-27 01:00:00 (Sun)
  62490366000, #  local_start 1981-03-29 03:00:00 (Sun)
  62506090800, #    local_end 1981-09-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62506083600, #    utc_start 1981-09-27 01:00:00 (Sun)
  62521808400, #      utc_end 1982-03-28 01:00:00 (Sun)
  62506087200, #  local_start 1981-09-27 02:00:00 (Sun)
  62521812000, #    local_end 1982-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62521808400, #    utc_start 1982-03-28 01:00:00 (Sun)
  62537533200, #      utc_end 1982-09-26 01:00:00 (Sun)
  62521815600, #  local_start 1982-03-28 03:00:00 (Sun)
  62537540400, #    local_end 1982-09-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62537533200, #    utc_start 1982-09-26 01:00:00 (Sun)
  62553258000, #      utc_end 1983-03-27 01:00:00 (Sun)
  62537536800, #  local_start 1982-09-26 02:00:00 (Sun)
  62553261600, #    local_end 1983-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62553258000, #    utc_start 1983-03-27 01:00:00 (Sun)
  62568982800, #      utc_end 1983-09-25 01:00:00 (Sun)
  62553265200, #  local_start 1983-03-27 03:00:00 (Sun)
  62568990000, #    local_end 1983-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62568982800, #    utc_start 1983-09-25 01:00:00 (Sun)
  62584707600, #      utc_end 1984-03-25 01:00:00 (Sun)
  62568986400, #  local_start 1983-09-25 02:00:00 (Sun)
  62584711200, #    local_end 1984-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62584707600, #    utc_start 1984-03-25 01:00:00 (Sun)
  62601037200, #      utc_end 1984-09-30 01:00:00 (Sun)
  62584714800, #  local_start 1984-03-25 03:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62601037200, #    utc_start 1984-09-30 01:00:00 (Sun)
  62616762000, #      utc_end 1985-03-31 01:00:00 (Sun)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62616762000, #    utc_start 1985-03-31 01:00:00 (Sun)
  62632486800, #      utc_end 1985-09-29 01:00:00 (Sun)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62632486800, #    utc_start 1985-09-29 01:00:00 (Sun)
  62648211600, #      utc_end 1986-03-30 01:00:00 (Sun)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62648211600, #    utc_start 1986-03-30 01:00:00 (Sun)
  62663936400, #      utc_end 1986-09-28 01:00:00 (Sun)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62663936400, #    utc_start 1986-09-28 01:00:00 (Sun)
  62679661200, #      utc_end 1987-03-29 01:00:00 (Sun)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62679661200, #    utc_start 1987-03-29 01:00:00 (Sun)
  62695386000, #      utc_end 1987-09-27 01:00:00 (Sun)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62695386000, #    utc_start 1987-09-27 01:00:00 (Sun)
  62711110800, #      utc_end 1988-03-27 01:00:00 (Sun)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62711110800, #    utc_start 1988-03-27 01:00:00 (Sun)
  62726835600, #      utc_end 1988-09-25 01:00:00 (Sun)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62726835600, #    utc_start 1988-09-25 01:00:00 (Sun)
  62742560400, #      utc_end 1989-03-26 01:00:00 (Sun)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62742560400, #    utc_start 1989-03-26 01:00:00 (Sun)
  62758285200, #      utc_end 1989-09-24 01:00:00 (Sun)
  62742567600, #  local_start 1989-03-26 03:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62758285200, #    utc_start 1989-09-24 01:00:00 (Sun)
  62774010000, #      utc_end 1990-03-25 01:00:00 (Sun)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62774010000, #    utc_start 1990-03-25 01:00:00 (Sun)
  62790339600, #      utc_end 1990-09-30 01:00:00 (Sun)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62790339600, #    utc_start 1990-09-30 01:00:00 (Sun)
  62806064400, #      utc_end 1991-03-31 01:00:00 (Sun)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62806064400, #    utc_start 1991-03-31 01:00:00 (Sun)
  62821789200, #      utc_end 1991-09-29 01:00:00 (Sun)
  62806071600, #  local_start 1991-03-31 03:00:00 (Sun)
  62821796400, #    local_end 1991-09-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62821789200, #    utc_start 1991-09-29 01:00:00 (Sun)
  62837514000, #      utc_end 1992-03-29 01:00:00 (Sun)
  62821792800, #  local_start 1991-09-29 02:00:00 (Sun)
  62837517600, #    local_end 1992-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62837514000, #    utc_start 1992-03-29 01:00:00 (Sun)
  62853238800, #      utc_end 1992-09-27 01:00:00 (Sun)
  62837521200, #  local_start 1992-03-29 03:00:00 (Sun)
  62853246000, #    local_end 1992-09-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62853238800, #    utc_start 1992-09-27 01:00:00 (Sun)
  62868963600, #      utc_end 1993-03-28 01:00:00 (Sun)
  62853242400, #  local_start 1992-09-27 02:00:00 (Sun)
  62868967200, #    local_end 1993-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62868963600, #    utc_start 1993-03-28 01:00:00 (Sun)
  62884688400, #      utc_end 1993-09-26 01:00:00 (Sun)
  62868970800, #  local_start 1993-03-28 03:00:00 (Sun)
  62884695600, #    local_end 1993-09-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62884688400, #    utc_start 1993-09-26 01:00:00 (Sun)
  62900413200, #      utc_end 1994-03-27 01:00:00 (Sun)
  62884692000, #  local_start 1993-09-26 02:00:00 (Sun)
  62900416800, #    local_end 1994-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62900413200, #    utc_start 1994-03-27 01:00:00 (Sun)
  62916138000, #      utc_end 1994-09-25 01:00:00 (Sun)
  62900420400, #  local_start 1994-03-27 03:00:00 (Sun)
  62916145200, #    local_end 1994-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62916138000, #    utc_start 1994-09-25 01:00:00 (Sun)
  62931862800, #      utc_end 1995-03-26 01:00:00 (Sun)
  62916141600, #  local_start 1994-09-25 02:00:00 (Sun)
  62931866400, #    local_end 1995-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62931862800, #    utc_start 1995-03-26 01:00:00 (Sun)
  62947587600, #      utc_end 1995-09-24 01:00:00 (Sun)
  62931870000, #  local_start 1995-03-26 03:00:00 (Sun)
  62947594800, #    local_end 1995-09-24 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62947587600, #    utc_start 1995-09-24 01:00:00 (Sun)
  62963917200, #      utc_end 1996-03-31 01:00:00 (Sun)
  62947591200, #  local_start 1995-09-24 02:00:00 (Sun)
  62963920800, #    local_end 1996-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62963917200, #    utc_start 1996-03-31 01:00:00 (Sun)
  62982061200, #      utc_end 1996-10-27 01:00:00 (Sun)
  62963924400, #  local_start 1996-03-31 03:00:00 (Sun)
  62982068400, #    local_end 1996-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62982061200, #    utc_start 1996-10-27 01:00:00 (Sun)
  62995366800, #      utc_end 1997-03-30 01:00:00 (Sun)
  62982064800, #  local_start 1996-10-27 02:00:00 (Sun)
  62995370400, #    local_end 1997-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62995366800, #    utc_start 1997-03-30 01:00:00 (Sun)
  63013510800, #      utc_end 1997-10-26 01:00:00 (Sun)
  62995374000, #  local_start 1997-03-30 03:00:00 (Sun)
  63013518000, #    local_end 1997-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63013510800, #    utc_start 1997-10-26 01:00:00 (Sun)
  63026816400, #      utc_end 1998-03-29 01:00:00 (Sun)
  63013514400, #  local_start 1997-10-26 02:00:00 (Sun)
  63026820000, #    local_end 1998-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63026816400, #    utc_start 1998-03-29 01:00:00 (Sun)
  63044960400, #      utc_end 1998-10-25 01:00:00 (Sun)
  63026823600, #  local_start 1998-03-29 03:00:00 (Sun)
  63044967600, #    local_end 1998-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63044960400, #    utc_start 1998-10-25 01:00:00 (Sun)
  63058266000, #      utc_end 1999-03-28 01:00:00 (Sun)
  63044964000, #  local_start 1998-10-25 02:00:00 (Sun)
  63058269600, #    local_end 1999-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63058266000, #    utc_start 1999-03-28 01:00:00 (Sun)
  63077014800, #      utc_end 1999-10-31 01:00:00 (Sun)
  63058273200, #  local_start 1999-03-28 03:00:00 (Sun)
  63077022000, #    local_end 1999-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63077014800, #    utc_start 1999-10-31 01:00:00 (Sun)
  63089715600, #      utc_end 2000-03-26 01:00:00 (Sun)
  63077018400, #  local_start 1999-10-31 02:00:00 (Sun)
  63089719200, #    local_end 2000-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63089715600, #    utc_start 2000-03-26 01:00:00 (Sun)
  63108464400, #      utc_end 2000-10-29 01:00:00 (Sun)
  63089722800, #  local_start 2000-03-26 03:00:00 (Sun)
  63108471600, #    local_end 2000-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63108464400, #    utc_start 2000-10-29 01:00:00 (Sun)
  63121165200, #      utc_end 2001-03-25 01:00:00 (Sun)
  63108468000, #  local_start 2000-10-29 02:00:00 (Sun)
  63121168800, #    local_end 2001-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63121165200, #    utc_start 2001-03-25 01:00:00 (Sun)
  63139914000, #      utc_end 2001-10-28 01:00:00 (Sun)
  63121172400, #  local_start 2001-03-25 03:00:00 (Sun)
  63139921200, #    local_end 2001-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63139914000, #    utc_start 2001-10-28 01:00:00 (Sun)
  63153219600, #      utc_end 2002-03-31 01:00:00 (Sun)
  63139917600, #  local_start 2001-10-28 02:00:00 (Sun)
  63153223200, #    local_end 2002-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63153219600, #    utc_start 2002-03-31 01:00:00 (Sun)
  63171363600, #      utc_end 2002-10-27 01:00:00 (Sun)
  63153226800, #  local_start 2002-03-31 03:00:00 (Sun)
  63171370800, #    local_end 2002-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63171363600, #    utc_start 2002-10-27 01:00:00 (Sun)
  63184669200, #      utc_end 2003-03-30 01:00:00 (Sun)
  63171367200, #  local_start 2002-10-27 02:00:00 (Sun)
  63184672800, #    local_end 2003-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63184669200, #    utc_start 2003-03-30 01:00:00 (Sun)
  63202813200, #      utc_end 2003-10-26 01:00:00 (Sun)
  63184676400, #  local_start 2003-03-30 03:00:00 (Sun)
  63202820400, #    local_end 2003-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63202813200, #    utc_start 2003-10-26 01:00:00 (Sun)
  63216118800, #      utc_end 2004-03-28 01:00:00 (Sun)
  63202816800, #  local_start 2003-10-26 02:00:00 (Sun)
  63216122400, #    local_end 2004-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63216118800, #    utc_start 2004-03-28 01:00:00 (Sun)
  63234867600, #      utc_end 2004-10-31 01:00:00 (Sun)
  63216126000, #  local_start 2004-03-28 03:00:00 (Sun)
  63234874800, #    local_end 2004-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63234867600, #    utc_start 2004-10-31 01:00:00 (Sun)
  63247568400, #      utc_end 2005-03-27 01:00:00 (Sun)
  63234871200, #  local_start 2004-10-31 02:00:00 (Sun)
  63247572000, #    local_end 2005-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63247568400, #    utc_start 2005-03-27 01:00:00 (Sun)
  63266317200, #      utc_end 2005-10-30 01:00:00 (Sun)
  63247575600, #  local_start 2005-03-27 03:00:00 (Sun)
  63266324400, #    local_end 2005-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63266317200, #    utc_start 2005-10-30 01:00:00 (Sun)
  63279018000, #      utc_end 2006-03-26 01:00:00 (Sun)
  63266320800, #  local_start 2005-10-30 02:00:00 (Sun)
  63279021600, #    local_end 2006-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63279018000, #    utc_start 2006-03-26 01:00:00 (Sun)
  63297766800, #      utc_end 2006-10-29 01:00:00 (Sun)
  63279025200, #  local_start 2006-03-26 03:00:00 (Sun)
  63297774000, #    local_end 2006-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63297766800, #    utc_start 2006-10-29 01:00:00 (Sun)
  63310467600, #      utc_end 2007-03-25 01:00:00 (Sun)
  63297770400, #  local_start 2006-10-29 02:00:00 (Sun)
  63310471200, #    local_end 2007-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63310467600, #    utc_start 2007-03-25 01:00:00 (Sun)
  63329216400, #      utc_end 2007-10-28 01:00:00 (Sun)
  63310474800, #  local_start 2007-03-25 03:00:00 (Sun)
  63329223600, #    local_end 2007-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63329216400, #    utc_start 2007-10-28 01:00:00 (Sun)
  63342522000, #      utc_end 2008-03-30 01:00:00 (Sun)
  63329220000, #  local_start 2007-10-28 02:00:00 (Sun)
  63342525600, #    local_end 2008-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63342522000, #    utc_start 2008-03-30 01:00:00 (Sun)
  63360666000, #      utc_end 2008-10-26 01:00:00 (Sun)
  63342529200, #  local_start 2008-03-30 03:00:00 (Sun)
  63360673200, #    local_end 2008-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63360666000, #    utc_start 2008-10-26 01:00:00 (Sun)
  63373971600, #      utc_end 2009-03-29 01:00:00 (Sun)
  63360669600, #  local_start 2008-10-26 02:00:00 (Sun)
  63373975200, #    local_end 2009-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63373971600, #    utc_start 2009-03-29 01:00:00 (Sun)
  63392115600, #      utc_end 2009-10-25 01:00:00 (Sun)
  63373978800, #  local_start 2009-03-29 03:00:00 (Sun)
  63392122800, #    local_end 2009-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63392115600, #    utc_start 2009-10-25 01:00:00 (Sun)
  63405421200, #      utc_end 2010-03-28 01:00:00 (Sun)
  63392119200, #  local_start 2009-10-25 02:00:00 (Sun)
  63405424800, #    local_end 2010-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63405421200, #    utc_start 2010-03-28 01:00:00 (Sun)
  63424170000, #      utc_end 2010-10-31 01:00:00 (Sun)
  63405428400, #  local_start 2010-03-28 03:00:00 (Sun)
  63424177200, #    local_end 2010-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63424170000, #    utc_start 2010-10-31 01:00:00 (Sun)
  63436870800, #      utc_end 2011-03-27 01:00:00 (Sun)
  63424173600, #  local_start 2010-10-31 02:00:00 (Sun)
  63436874400, #    local_end 2011-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63436870800, #    utc_start 2011-03-27 01:00:00 (Sun)
  63455619600, #      utc_end 2011-10-30 01:00:00 (Sun)
  63436878000, #  local_start 2011-03-27 03:00:00 (Sun)
  63455626800, #    local_end 2011-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63455619600, #    utc_start 2011-10-30 01:00:00 (Sun)
  63468320400, #      utc_end 2012-03-25 01:00:00 (Sun)
  63455623200, #  local_start 2011-10-30 02:00:00 (Sun)
  63468324000, #    local_end 2012-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63468320400, #    utc_start 2012-03-25 01:00:00 (Sun)
  63487069200, #      utc_end 2012-10-28 01:00:00 (Sun)
  63468327600, #  local_start 2012-03-25 03:00:00 (Sun)
  63487076400, #    local_end 2012-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63487069200, #    utc_start 2012-10-28 01:00:00 (Sun)
  63500374800, #      utc_end 2013-03-31 01:00:00 (Sun)
  63487072800, #  local_start 2012-10-28 02:00:00 (Sun)
  63500378400, #    local_end 2013-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63500374800, #    utc_start 2013-03-31 01:00:00 (Sun)
  63518518800, #      utc_end 2013-10-27 01:00:00 (Sun)
  63500382000, #  local_start 2013-03-31 03:00:00 (Sun)
  63518526000, #    local_end 2013-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63518518800, #    utc_start 2013-10-27 01:00:00 (Sun)
  63531824400, #      utc_end 2014-03-30 01:00:00 (Sun)
  63518522400, #  local_start 2013-10-27 02:00:00 (Sun)
  63531828000, #    local_end 2014-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63531824400, #    utc_start 2014-03-30 01:00:00 (Sun)
  63549968400, #      utc_end 2014-10-26 01:00:00 (Sun)
  63531831600, #  local_start 2014-03-30 03:00:00 (Sun)
  63549975600, #    local_end 2014-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63549968400, #    utc_start 2014-10-26 01:00:00 (Sun)
  63563274000, #      utc_end 2015-03-29 01:00:00 (Sun)
  63549972000, #  local_start 2014-10-26 02:00:00 (Sun)
  63563277600, #    local_end 2015-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63563274000, #    utc_start 2015-03-29 01:00:00 (Sun)
  63581418000, #      utc_end 2015-10-25 01:00:00 (Sun)
  63563281200, #  local_start 2015-03-29 03:00:00 (Sun)
  63581425200, #    local_end 2015-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63581418000, #    utc_start 2015-10-25 01:00:00 (Sun)
  63594723600, #      utc_end 2016-03-27 01:00:00 (Sun)
  63581421600, #  local_start 2015-10-25 02:00:00 (Sun)
  63594727200, #    local_end 2016-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63594723600, #    utc_start 2016-03-27 01:00:00 (Sun)
  63613472400, #      utc_end 2016-10-30 01:00:00 (Sun)
  63594730800, #  local_start 2016-03-27 03:00:00 (Sun)
  63613479600, #    local_end 2016-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63613472400, #    utc_start 2016-10-30 01:00:00 (Sun)
  63626173200, #      utc_end 2017-03-26 01:00:00 (Sun)
  63613476000, #  local_start 2016-10-30 02:00:00 (Sun)
  63626176800, #    local_end 2017-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63626173200, #    utc_start 2017-03-26 01:00:00 (Sun)
  63644922000, #      utc_end 2017-10-29 01:00:00 (Sun)
  63626180400, #  local_start 2017-03-26 03:00:00 (Sun)
  63644929200, #    local_end 2017-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63644922000, #    utc_start 2017-10-29 01:00:00 (Sun)
  63657622800, #      utc_end 2018-03-25 01:00:00 (Sun)
  63644925600, #  local_start 2017-10-29 02:00:00 (Sun)
  63657626400, #    local_end 2018-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63657622800, #    utc_start 2018-03-25 01:00:00 (Sun)
  63676371600, #      utc_end 2018-10-28 01:00:00 (Sun)
  63657630000, #  local_start 2018-03-25 03:00:00 (Sun)
  63676378800, #    local_end 2018-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63676371600, #    utc_start 2018-10-28 01:00:00 (Sun)
  63689677200, #      utc_end 2019-03-31 01:00:00 (Sun)
  63676375200, #  local_start 2018-10-28 02:00:00 (Sun)
  63689680800, #    local_end 2019-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63689677200, #    utc_start 2019-03-31 01:00:00 (Sun)
  63707821200, #      utc_end 2019-10-27 01:00:00 (Sun)
  63689684400, #  local_start 2019-03-31 03:00:00 (Sun)
  63707828400, #    local_end 2019-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63707821200, #    utc_start 2019-10-27 01:00:00 (Sun)
  63721126800, #      utc_end 2020-03-29 01:00:00 (Sun)
  63707824800, #  local_start 2019-10-27 02:00:00 (Sun)
  63721130400, #    local_end 2020-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63721126800, #    utc_start 2020-03-29 01:00:00 (Sun)
  63739270800, #      utc_end 2020-10-25 01:00:00 (Sun)
  63721134000, #  local_start 2020-03-29 03:00:00 (Sun)
  63739278000, #    local_end 2020-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63739270800, #    utc_start 2020-10-25 01:00:00 (Sun)
  63752576400, #      utc_end 2021-03-28 01:00:00 (Sun)
  63739274400, #  local_start 2020-10-25 02:00:00 (Sun)
  63752580000, #    local_end 2021-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63752576400, #    utc_start 2021-03-28 01:00:00 (Sun)
  63771325200, #      utc_end 2021-10-31 01:00:00 (Sun)
  63752583600, #  local_start 2021-03-28 03:00:00 (Sun)
  63771332400, #    local_end 2021-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63771325200, #    utc_start 2021-10-31 01:00:00 (Sun)
  63784026000, #      utc_end 2022-03-27 01:00:00 (Sun)
  63771328800, #  local_start 2021-10-31 02:00:00 (Sun)
  63784029600, #    local_end 2022-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63784026000, #    utc_start 2022-03-27 01:00:00 (Sun)
  63802774800, #      utc_end 2022-10-30 01:00:00 (Sun)
  63784033200, #  local_start 2022-03-27 03:00:00 (Sun)
  63802782000, #    local_end 2022-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63802774800, #    utc_start 2022-10-30 01:00:00 (Sun)
  63815475600, #      utc_end 2023-03-26 01:00:00 (Sun)
  63802778400, #  local_start 2022-10-30 02:00:00 (Sun)
  63815479200, #    local_end 2023-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63815475600, #    utc_start 2023-03-26 01:00:00 (Sun)
  63834224400, #      utc_end 2023-10-29 01:00:00 (Sun)
  63815482800, #  local_start 2023-03-26 03:00:00 (Sun)
  63834231600, #    local_end 2023-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63834224400, #    utc_start 2023-10-29 01:00:00 (Sun)
  63847530000, #      utc_end 2024-03-31 01:00:00 (Sun)
  63834228000, #  local_start 2023-10-29 02:00:00 (Sun)
  63847533600, #    local_end 2024-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63847530000, #    utc_start 2024-03-31 01:00:00 (Sun)
  63865674000, #      utc_end 2024-10-27 01:00:00 (Sun)
  63847537200, #  local_start 2024-03-31 03:00:00 (Sun)
  63865681200, #    local_end 2024-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63865674000, #    utc_start 2024-10-27 01:00:00 (Sun)
  63878979600, #      utc_end 2025-03-30 01:00:00 (Sun)
  63865677600, #  local_start 2024-10-27 02:00:00 (Sun)
  63878983200, #    local_end 2025-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63878979600, #    utc_start 2025-03-30 01:00:00 (Sun)
  63897123600, #      utc_end 2025-10-26 01:00:00 (Sun)
  63878986800, #  local_start 2025-03-30 03:00:00 (Sun)
  63897130800, #    local_end 2025-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63897123600, #    utc_start 2025-10-26 01:00:00 (Sun)
  63910429200, #      utc_end 2026-03-29 01:00:00 (Sun)
  63897127200, #  local_start 2025-10-26 02:00:00 (Sun)
  63910432800, #    local_end 2026-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63910429200, #    utc_start 2026-03-29 01:00:00 (Sun)
  63928573200, #      utc_end 2026-10-25 01:00:00 (Sun)
  63910436400, #  local_start 2026-03-29 03:00:00 (Sun)
  63928580400, #    local_end 2026-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63928573200, #    utc_start 2026-10-25 01:00:00 (Sun)
  63941878800, #      utc_end 2027-03-28 01:00:00 (Sun)
  63928576800, #  local_start 2026-10-25 02:00:00 (Sun)
  63941882400, #    local_end 2027-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63941878800, #    utc_start 2027-03-28 01:00:00 (Sun)
  63960627600, #      utc_end 2027-10-31 01:00:00 (Sun)
  63941886000, #  local_start 2027-03-28 03:00:00 (Sun)
  63960634800, #    local_end 2027-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63960627600, #    utc_start 2027-10-31 01:00:00 (Sun)
  63973328400, #      utc_end 2028-03-26 01:00:00 (Sun)
  63960631200, #  local_start 2027-10-31 02:00:00 (Sun)
  63973332000, #    local_end 2028-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63973328400, #    utc_start 2028-03-26 01:00:00 (Sun)
  63992077200, #      utc_end 2028-10-29 01:00:00 (Sun)
  63973335600, #  local_start 2028-03-26 03:00:00 (Sun)
  63992084400, #    local_end 2028-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63992077200, #    utc_start 2028-10-29 01:00:00 (Sun)
  64004778000, #      utc_end 2029-03-25 01:00:00 (Sun)
  63992080800, #  local_start 2028-10-29 02:00:00 (Sun)
  64004781600, #    local_end 2029-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  64004778000, #    utc_start 2029-03-25 01:00:00 (Sun)
  64023526800, #      utc_end 2029-10-28 01:00:00 (Sun)
  64004785200, #  local_start 2029-03-25 03:00:00 (Sun)
  64023534000, #    local_end 2029-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  64023526800, #    utc_start 2029-10-28 01:00:00 (Sun)
  64036832400, #      utc_end 2030-03-31 01:00:00 (Sun)
  64023530400, #  local_start 2029-10-28 02:00:00 (Sun)
  64036836000, #    local_end 2030-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  64036832400, #    utc_start 2030-03-31 01:00:00 (Sun)
  64054976400, #      utc_end 2030-10-27 01:00:00 (Sun)
  64036839600, #  local_start 2030-03-31 03:00:00 (Sun)
  64054983600, #    local_end 2030-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {79}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { 3600 }
  
  my $last_observance = bless( {
    'format' => 'CE%sT',
    'gmtoff' => '1:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 722815,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 722815,
      'utc_rd_secs' => 0,
      'utc_year' => 1981
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => 3600,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 722814,
      'local_rd_secs' => 82800,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 722814,
      'utc_rd_secs' => 82800,
      'utc_year' => 1980
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '1:00u',
      'from' => '1996',
      'in' => 'Oct',
      'letter' => '',
      'name' => 'EU',
      'offset_from_std' => 0,
      'on' => 'lastSun',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '1:00u',
      'from' => '1981',
      'in' => 'Mar',
      'letter' => 'S',
      'name' => 'EU',
      'offset_from_std' => 3600,
      'on' => 'lastSun',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_EUROPE_ROME

    $main::fatpacked{"DateTime/TimeZone/Europe/Samara.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_EUROPE_SAMARA';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Europe::Samara;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Europe::Samara::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60541862400, #      utc_end 1919-07-01 00:00:00 (Tue)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60541874420, #    local_end 1919-07-01 03:20:20 (Tue)
  12020,
  0,
  'LMT',
      ],
      [
  60541862400, #    utc_start 1919-07-01 00:00:00 (Tue)
  60888142800, #      utc_end 1930-06-20 21:00:00 (Fri)
  60541873200, #  local_start 1919-07-01 03:00:00 (Tue)
  60888153600, #    local_end 1930-06-21 00:00:00 (Sat)
  10800,
  0,
  '+03',
      ],
      [
  60888142800, #    utc_start 1930-06-20 21:00:00 (Fri)
  61033377600, #      utc_end 1935-01-26 20:00:00 (Sat)
  60888157200, #  local_start 1930-06-21 01:00:00 (Sat)
  61033392000, #    local_end 1935-01-27 00:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  61033377600, #    utc_start 1935-01-26 20:00:00 (Sat)
  62490600000, #      utc_end 1981-03-31 20:00:00 (Tue)
  61033392000, #  local_start 1935-01-27 00:00:00 (Sun)
  62490614400, #    local_end 1981-04-01 00:00:00 (Wed)
  14400,
  0,
  '+04',
      ],
      [
  62490600000, #    utc_start 1981-03-31 20:00:00 (Tue)
  62506407600, #      utc_end 1981-09-30 19:00:00 (Wed)
  62490618000, #  local_start 1981-04-01 01:00:00 (Wed)
  62506425600, #    local_end 1981-10-01 00:00:00 (Thu)
  18000,
  1,
  '+05',
      ],
      [
  62506407600, #    utc_start 1981-09-30 19:00:00 (Wed)
  62522136000, #      utc_end 1982-03-31 20:00:00 (Wed)
  62506422000, #  local_start 1981-09-30 23:00:00 (Wed)
  62522150400, #    local_end 1982-04-01 00:00:00 (Thu)
  14400,
  0,
  '+04',
      ],
      [
  62522136000, #    utc_start 1982-03-31 20:00:00 (Wed)
  62537943600, #      utc_end 1982-09-30 19:00:00 (Thu)
  62522154000, #  local_start 1982-04-01 01:00:00 (Thu)
  62537961600, #    local_end 1982-10-01 00:00:00 (Fri)
  18000,
  1,
  '+05',
      ],
      [
  62537943600, #    utc_start 1982-09-30 19:00:00 (Thu)
  62553672000, #      utc_end 1983-03-31 20:00:00 (Thu)
  62537958000, #  local_start 1982-09-30 23:00:00 (Thu)
  62553686400, #    local_end 1983-04-01 00:00:00 (Fri)
  14400,
  0,
  '+04',
      ],
      [
  62553672000, #    utc_start 1983-03-31 20:00:00 (Thu)
  62569479600, #      utc_end 1983-09-30 19:00:00 (Fri)
  62553690000, #  local_start 1983-04-01 01:00:00 (Fri)
  62569497600, #    local_end 1983-10-01 00:00:00 (Sat)
  18000,
  1,
  '+05',
      ],
      [
  62569479600, #    utc_start 1983-09-30 19:00:00 (Fri)
  62585294400, #      utc_end 1984-03-31 20:00:00 (Sat)
  62569494000, #  local_start 1983-09-30 23:00:00 (Fri)
  62585308800, #    local_end 1984-04-01 00:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62585294400, #    utc_start 1984-03-31 20:00:00 (Sat)
  62601026400, #      utc_end 1984-09-29 22:00:00 (Sat)
  62585312400, #  local_start 1984-04-01 01:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62601026400, #    utc_start 1984-09-29 22:00:00 (Sat)
  62616751200, #      utc_end 1985-03-30 22:00:00 (Sat)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62616751200, #    utc_start 1985-03-30 22:00:00 (Sat)
  62632476000, #      utc_end 1985-09-28 22:00:00 (Sat)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62632476000, #    utc_start 1985-09-28 22:00:00 (Sat)
  62648200800, #      utc_end 1986-03-29 22:00:00 (Sat)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62648200800, #    utc_start 1986-03-29 22:00:00 (Sat)
  62663925600, #      utc_end 1986-09-27 22:00:00 (Sat)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62663925600, #    utc_start 1986-09-27 22:00:00 (Sat)
  62679650400, #      utc_end 1987-03-28 22:00:00 (Sat)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62679650400, #    utc_start 1987-03-28 22:00:00 (Sat)
  62695375200, #      utc_end 1987-09-26 22:00:00 (Sat)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62695375200, #    utc_start 1987-09-26 22:00:00 (Sat)
  62711100000, #      utc_end 1988-03-26 22:00:00 (Sat)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62711100000, #    utc_start 1988-03-26 22:00:00 (Sat)
  62726824800, #      utc_end 1988-09-24 22:00:00 (Sat)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62726824800, #    utc_start 1988-09-24 22:00:00 (Sat)
  62742549600, #      utc_end 1989-03-25 22:00:00 (Sat)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62742549600, #    utc_start 1989-03-25 22:00:00 (Sat)
  62758278000, #      utc_end 1989-09-23 23:00:00 (Sat)
  62742564000, #  local_start 1989-03-26 02:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  62758278000, #    utc_start 1989-09-23 23:00:00 (Sat)
  62774002800, #      utc_end 1990-03-24 23:00:00 (Sat)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  62774002800, #    utc_start 1990-03-24 23:00:00 (Sat)
  62790332400, #      utc_end 1990-09-29 23:00:00 (Sat)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  62790332400, #    utc_start 1990-09-29 23:00:00 (Sat)
  62806057200, #      utc_end 1991-03-30 23:00:00 (Sat)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  62806057200, #    utc_start 1991-03-30 23:00:00 (Sat)
  62821785600, #      utc_end 1991-09-29 00:00:00 (Sun)
  62806068000, #  local_start 1991-03-31 02:00:00 (Sun)
  62821796400, #    local_end 1991-09-29 03:00:00 (Sun)
  10800,
  1,
  '+03',
      ],
      [
  62821785600, #    utc_start 1991-09-29 00:00:00 (Sun)
  62823600000, #      utc_end 1991-10-20 00:00:00 (Sun)
  62821796400, #  local_start 1991-09-29 03:00:00 (Sun)
  62823610800, #    local_end 1991-10-20 03:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  62823600000, #    utc_start 1991-10-20 00:00:00 (Sun)
  62837503200, #      utc_end 1992-03-28 22:00:00 (Sat)
  62823614400, #  local_start 1991-10-20 04:00:00 (Sun)
  62837517600, #    local_end 1992-03-29 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62837503200, #    utc_start 1992-03-28 22:00:00 (Sat)
  62853228000, #      utc_end 1992-09-26 22:00:00 (Sat)
  62837521200, #  local_start 1992-03-29 03:00:00 (Sun)
  62853246000, #    local_end 1992-09-27 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62853228000, #    utc_start 1992-09-26 22:00:00 (Sat)
  62868952800, #      utc_end 1993-03-27 22:00:00 (Sat)
  62853242400, #  local_start 1992-09-27 02:00:00 (Sun)
  62868967200, #    local_end 1993-03-28 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62868952800, #    utc_start 1993-03-27 22:00:00 (Sat)
  62884677600, #      utc_end 1993-09-25 22:00:00 (Sat)
  62868970800, #  local_start 1993-03-28 03:00:00 (Sun)
  62884695600, #    local_end 1993-09-26 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62884677600, #    utc_start 1993-09-25 22:00:00 (Sat)
  62900402400, #      utc_end 1994-03-26 22:00:00 (Sat)
  62884692000, #  local_start 1993-09-26 02:00:00 (Sun)
  62900416800, #    local_end 1994-03-27 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62900402400, #    utc_start 1994-03-26 22:00:00 (Sat)
  62916127200, #      utc_end 1994-09-24 22:00:00 (Sat)
  62900420400, #  local_start 1994-03-27 03:00:00 (Sun)
  62916145200, #    local_end 1994-09-25 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62916127200, #    utc_start 1994-09-24 22:00:00 (Sat)
  62931852000, #      utc_end 1995-03-25 22:00:00 (Sat)
  62916141600, #  local_start 1994-09-25 02:00:00 (Sun)
  62931866400, #    local_end 1995-03-26 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62931852000, #    utc_start 1995-03-25 22:00:00 (Sat)
  62947576800, #      utc_end 1995-09-23 22:00:00 (Sat)
  62931870000, #  local_start 1995-03-26 03:00:00 (Sun)
  62947594800, #    local_end 1995-09-24 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62947576800, #    utc_start 1995-09-23 22:00:00 (Sat)
  62963906400, #      utc_end 1996-03-30 22:00:00 (Sat)
  62947591200, #  local_start 1995-09-24 02:00:00 (Sun)
  62963920800, #    local_end 1996-03-31 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62963906400, #    utc_start 1996-03-30 22:00:00 (Sat)
  62982050400, #      utc_end 1996-10-26 22:00:00 (Sat)
  62963924400, #  local_start 1996-03-31 03:00:00 (Sun)
  62982068400, #    local_end 1996-10-27 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62982050400, #    utc_start 1996-10-26 22:00:00 (Sat)
  62995356000, #      utc_end 1997-03-29 22:00:00 (Sat)
  62982064800, #  local_start 1996-10-27 02:00:00 (Sun)
  62995370400, #    local_end 1997-03-30 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62995356000, #    utc_start 1997-03-29 22:00:00 (Sat)
  63013500000, #      utc_end 1997-10-25 22:00:00 (Sat)
  62995374000, #  local_start 1997-03-30 03:00:00 (Sun)
  63013518000, #    local_end 1997-10-26 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63013500000, #    utc_start 1997-10-25 22:00:00 (Sat)
  63026805600, #      utc_end 1998-03-28 22:00:00 (Sat)
  63013514400, #  local_start 1997-10-26 02:00:00 (Sun)
  63026820000, #    local_end 1998-03-29 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63026805600, #    utc_start 1998-03-28 22:00:00 (Sat)
  63044949600, #      utc_end 1998-10-24 22:00:00 (Sat)
  63026823600, #  local_start 1998-03-29 03:00:00 (Sun)
  63044967600, #    local_end 1998-10-25 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63044949600, #    utc_start 1998-10-24 22:00:00 (Sat)
  63058255200, #      utc_end 1999-03-27 22:00:00 (Sat)
  63044964000, #  local_start 1998-10-25 02:00:00 (Sun)
  63058269600, #    local_end 1999-03-28 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63058255200, #    utc_start 1999-03-27 22:00:00 (Sat)
  63077004000, #      utc_end 1999-10-30 22:00:00 (Sat)
  63058273200, #  local_start 1999-03-28 03:00:00 (Sun)
  63077022000, #    local_end 1999-10-31 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63077004000, #    utc_start 1999-10-30 22:00:00 (Sat)
  63089704800, #      utc_end 2000-03-25 22:00:00 (Sat)
  63077018400, #  local_start 1999-10-31 02:00:00 (Sun)
  63089719200, #    local_end 2000-03-26 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63089704800, #    utc_start 2000-03-25 22:00:00 (Sat)
  63108453600, #      utc_end 2000-10-28 22:00:00 (Sat)
  63089722800, #  local_start 2000-03-26 03:00:00 (Sun)
  63108471600, #    local_end 2000-10-29 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63108453600, #    utc_start 2000-10-28 22:00:00 (Sat)
  63121154400, #      utc_end 2001-03-24 22:00:00 (Sat)
  63108468000, #  local_start 2000-10-29 02:00:00 (Sun)
  63121168800, #    local_end 2001-03-25 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63121154400, #    utc_start 2001-03-24 22:00:00 (Sat)
  63139903200, #      utc_end 2001-10-27 22:00:00 (Sat)
  63121172400, #  local_start 2001-03-25 03:00:00 (Sun)
  63139921200, #    local_end 2001-10-28 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63139903200, #    utc_start 2001-10-27 22:00:00 (Sat)
  63153208800, #      utc_end 2002-03-30 22:00:00 (Sat)
  63139917600, #  local_start 2001-10-28 02:00:00 (Sun)
  63153223200, #    local_end 2002-03-31 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63153208800, #    utc_start 2002-03-30 22:00:00 (Sat)
  63171352800, #      utc_end 2002-10-26 22:00:00 (Sat)
  63153226800, #  local_start 2002-03-31 03:00:00 (Sun)
  63171370800, #    local_end 2002-10-27 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63171352800, #    utc_start 2002-10-26 22:00:00 (Sat)
  63184658400, #      utc_end 2003-03-29 22:00:00 (Sat)
  63171367200, #  local_start 2002-10-27 02:00:00 (Sun)
  63184672800, #    local_end 2003-03-30 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63184658400, #    utc_start 2003-03-29 22:00:00 (Sat)
  63202802400, #      utc_end 2003-10-25 22:00:00 (Sat)
  63184676400, #  local_start 2003-03-30 03:00:00 (Sun)
  63202820400, #    local_end 2003-10-26 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63202802400, #    utc_start 2003-10-25 22:00:00 (Sat)
  63216108000, #      utc_end 2004-03-27 22:00:00 (Sat)
  63202816800, #  local_start 2003-10-26 02:00:00 (Sun)
  63216122400, #    local_end 2004-03-28 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63216108000, #    utc_start 2004-03-27 22:00:00 (Sat)
  63234856800, #      utc_end 2004-10-30 22:00:00 (Sat)
  63216126000, #  local_start 2004-03-28 03:00:00 (Sun)
  63234874800, #    local_end 2004-10-31 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63234856800, #    utc_start 2004-10-30 22:00:00 (Sat)
  63247557600, #      utc_end 2005-03-26 22:00:00 (Sat)
  63234871200, #  local_start 2004-10-31 02:00:00 (Sun)
  63247572000, #    local_end 2005-03-27 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63247557600, #    utc_start 2005-03-26 22:00:00 (Sat)
  63266306400, #      utc_end 2005-10-29 22:00:00 (Sat)
  63247575600, #  local_start 2005-03-27 03:00:00 (Sun)
  63266324400, #    local_end 2005-10-30 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63266306400, #    utc_start 2005-10-29 22:00:00 (Sat)
  63279007200, #      utc_end 2006-03-25 22:00:00 (Sat)
  63266320800, #  local_start 2005-10-30 02:00:00 (Sun)
  63279021600, #    local_end 2006-03-26 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63279007200, #    utc_start 2006-03-25 22:00:00 (Sat)
  63297756000, #      utc_end 2006-10-28 22:00:00 (Sat)
  63279025200, #  local_start 2006-03-26 03:00:00 (Sun)
  63297774000, #    local_end 2006-10-29 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63297756000, #    utc_start 2006-10-28 22:00:00 (Sat)
  63310456800, #      utc_end 2007-03-24 22:00:00 (Sat)
  63297770400, #  local_start 2006-10-29 02:00:00 (Sun)
  63310471200, #    local_end 2007-03-25 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63310456800, #    utc_start 2007-03-24 22:00:00 (Sat)
  63329205600, #      utc_end 2007-10-27 22:00:00 (Sat)
  63310474800, #  local_start 2007-03-25 03:00:00 (Sun)
  63329223600, #    local_end 2007-10-28 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63329205600, #    utc_start 2007-10-27 22:00:00 (Sat)
  63342511200, #      utc_end 2008-03-29 22:00:00 (Sat)
  63329220000, #  local_start 2007-10-28 02:00:00 (Sun)
  63342525600, #    local_end 2008-03-30 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63342511200, #    utc_start 2008-03-29 22:00:00 (Sat)
  63360655200, #      utc_end 2008-10-25 22:00:00 (Sat)
  63342529200, #  local_start 2008-03-30 03:00:00 (Sun)
  63360673200, #    local_end 2008-10-26 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63360655200, #    utc_start 2008-10-25 22:00:00 (Sat)
  63373960800, #      utc_end 2009-03-28 22:00:00 (Sat)
  63360669600, #  local_start 2008-10-26 02:00:00 (Sun)
  63373975200, #    local_end 2009-03-29 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63373960800, #    utc_start 2009-03-28 22:00:00 (Sat)
  63392104800, #      utc_end 2009-10-24 22:00:00 (Sat)
  63373978800, #  local_start 2009-03-29 03:00:00 (Sun)
  63392122800, #    local_end 2009-10-25 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63392104800, #    utc_start 2009-10-24 22:00:00 (Sat)
  63405410400, #      utc_end 2010-03-27 22:00:00 (Sat)
  63392119200, #  local_start 2009-10-25 02:00:00 (Sun)
  63405424800, #    local_end 2010-03-28 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63405410400, #    utc_start 2010-03-27 22:00:00 (Sat)
  63424162800, #      utc_end 2010-10-30 23:00:00 (Sat)
  63405424800, #  local_start 2010-03-28 02:00:00 (Sun)
  63424177200, #    local_end 2010-10-31 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63424162800, #    utc_start 2010-10-30 23:00:00 (Sat)
  63436863600, #      utc_end 2011-03-26 23:00:00 (Sat)
  63424173600, #  local_start 2010-10-31 02:00:00 (Sun)
  63436874400, #    local_end 2011-03-27 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63436863600, #    utc_start 2011-03-26 23:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  63436878000, #  local_start 2011-03-27 03:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  14400,
  0,
  '+04',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {30}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_EUROPE_SAMARA

    $main::fatpacked{"DateTime/TimeZone/Europe/Saratov.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_EUROPE_SARATOV';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Europe::Saratov;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Europe::Saratov::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60541862400, #      utc_end 1919-07-01 00:00:00 (Tue)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60541873458, #    local_end 1919-07-01 03:04:18 (Tue)
  11058,
  0,
  'LMT',
      ],
      [
  60541862400, #    utc_start 1919-07-01 00:00:00 (Tue)
  60888142800, #      utc_end 1930-06-20 21:00:00 (Fri)
  60541873200, #  local_start 1919-07-01 03:00:00 (Tue)
  60888153600, #    local_end 1930-06-21 00:00:00 (Sat)
  10800,
  0,
  '+03',
      ],
      [
  60888142800, #    utc_start 1930-06-20 21:00:00 (Fri)
  62490600000, #      utc_end 1981-03-31 20:00:00 (Tue)
  60888157200, #  local_start 1930-06-21 01:00:00 (Sat)
  62490614400, #    local_end 1981-04-01 00:00:00 (Wed)
  14400,
  0,
  '+04',
      ],
      [
  62490600000, #    utc_start 1981-03-31 20:00:00 (Tue)
  62506407600, #      utc_end 1981-09-30 19:00:00 (Wed)
  62490618000, #  local_start 1981-04-01 01:00:00 (Wed)
  62506425600, #    local_end 1981-10-01 00:00:00 (Thu)
  18000,
  1,
  '+05',
      ],
      [
  62506407600, #    utc_start 1981-09-30 19:00:00 (Wed)
  62522136000, #      utc_end 1982-03-31 20:00:00 (Wed)
  62506422000, #  local_start 1981-09-30 23:00:00 (Wed)
  62522150400, #    local_end 1982-04-01 00:00:00 (Thu)
  14400,
  0,
  '+04',
      ],
      [
  62522136000, #    utc_start 1982-03-31 20:00:00 (Wed)
  62537943600, #      utc_end 1982-09-30 19:00:00 (Thu)
  62522154000, #  local_start 1982-04-01 01:00:00 (Thu)
  62537961600, #    local_end 1982-10-01 00:00:00 (Fri)
  18000,
  1,
  '+05',
      ],
      [
  62537943600, #    utc_start 1982-09-30 19:00:00 (Thu)
  62553672000, #      utc_end 1983-03-31 20:00:00 (Thu)
  62537958000, #  local_start 1982-09-30 23:00:00 (Thu)
  62553686400, #    local_end 1983-04-01 00:00:00 (Fri)
  14400,
  0,
  '+04',
      ],
      [
  62553672000, #    utc_start 1983-03-31 20:00:00 (Thu)
  62569479600, #      utc_end 1983-09-30 19:00:00 (Fri)
  62553690000, #  local_start 1983-04-01 01:00:00 (Fri)
  62569497600, #    local_end 1983-10-01 00:00:00 (Sat)
  18000,
  1,
  '+05',
      ],
      [
  62569479600, #    utc_start 1983-09-30 19:00:00 (Fri)
  62585294400, #      utc_end 1984-03-31 20:00:00 (Sat)
  62569494000, #  local_start 1983-09-30 23:00:00 (Fri)
  62585308800, #    local_end 1984-04-01 00:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62585294400, #    utc_start 1984-03-31 20:00:00 (Sat)
  62601026400, #      utc_end 1984-09-29 22:00:00 (Sat)
  62585312400, #  local_start 1984-04-01 01:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62601026400, #    utc_start 1984-09-29 22:00:00 (Sat)
  62616751200, #      utc_end 1985-03-30 22:00:00 (Sat)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62616751200, #    utc_start 1985-03-30 22:00:00 (Sat)
  62632476000, #      utc_end 1985-09-28 22:00:00 (Sat)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62632476000, #    utc_start 1985-09-28 22:00:00 (Sat)
  62648200800, #      utc_end 1986-03-29 22:00:00 (Sat)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62648200800, #    utc_start 1986-03-29 22:00:00 (Sat)
  62663925600, #      utc_end 1986-09-27 22:00:00 (Sat)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62663925600, #    utc_start 1986-09-27 22:00:00 (Sat)
  62679650400, #      utc_end 1987-03-28 22:00:00 (Sat)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62679650400, #    utc_start 1987-03-28 22:00:00 (Sat)
  62695375200, #      utc_end 1987-09-26 22:00:00 (Sat)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62695375200, #    utc_start 1987-09-26 22:00:00 (Sat)
  62711100000, #      utc_end 1988-03-26 22:00:00 (Sat)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62711100000, #    utc_start 1988-03-26 22:00:00 (Sat)
  62726828400, #      utc_end 1988-09-24 23:00:00 (Sat)
  62711114400, #  local_start 1988-03-27 02:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  62726828400, #    utc_start 1988-09-24 23:00:00 (Sat)
  62742553200, #      utc_end 1989-03-25 23:00:00 (Sat)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  62742553200, #    utc_start 1989-03-25 23:00:00 (Sat)
  62758278000, #      utc_end 1989-09-23 23:00:00 (Sat)
  62742567600, #  local_start 1989-03-26 03:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  62758278000, #    utc_start 1989-09-23 23:00:00 (Sat)
  62774002800, #      utc_end 1990-03-24 23:00:00 (Sat)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  62774002800, #    utc_start 1990-03-24 23:00:00 (Sat)
  62790332400, #      utc_end 1990-09-29 23:00:00 (Sat)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  62790332400, #    utc_start 1990-09-29 23:00:00 (Sat)
  62806057200, #      utc_end 1991-03-30 23:00:00 (Sat)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  62806057200, #    utc_start 1991-03-30 23:00:00 (Sat)
  62837503200, #      utc_end 1992-03-28 22:00:00 (Sat)
  62806071600, #  local_start 1991-03-31 03:00:00 (Sun)
  62837517600, #    local_end 1992-03-29 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62837503200, #    utc_start 1992-03-28 22:00:00 (Sat)
  62853231600, #      utc_end 1992-09-26 23:00:00 (Sat)
  62837517600, #  local_start 1992-03-29 02:00:00 (Sun)
  62853246000, #    local_end 1992-09-27 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  62853231600, #    utc_start 1992-09-26 23:00:00 (Sat)
  62868956400, #      utc_end 1993-03-27 23:00:00 (Sat)
  62853242400, #  local_start 1992-09-27 02:00:00 (Sun)
  62868967200, #    local_end 1993-03-28 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  62868956400, #    utc_start 1993-03-27 23:00:00 (Sat)
  62884681200, #      utc_end 1993-09-25 23:00:00 (Sat)
  62868970800, #  local_start 1993-03-28 03:00:00 (Sun)
  62884695600, #    local_end 1993-09-26 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  62884681200, #    utc_start 1993-09-25 23:00:00 (Sat)
  62900406000, #      utc_end 1994-03-26 23:00:00 (Sat)
  62884692000, #  local_start 1993-09-26 02:00:00 (Sun)
  62900416800, #    local_end 1994-03-27 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  62900406000, #    utc_start 1994-03-26 23:00:00 (Sat)
  62916130800, #      utc_end 1994-09-24 23:00:00 (Sat)
  62900420400, #  local_start 1994-03-27 03:00:00 (Sun)
  62916145200, #    local_end 1994-09-25 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  62916130800, #    utc_start 1994-09-24 23:00:00 (Sat)
  62931855600, #      utc_end 1995-03-25 23:00:00 (Sat)
  62916141600, #  local_start 1994-09-25 02:00:00 (Sun)
  62931866400, #    local_end 1995-03-26 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  62931855600, #    utc_start 1995-03-25 23:00:00 (Sat)
  62947580400, #      utc_end 1995-09-23 23:00:00 (Sat)
  62931870000, #  local_start 1995-03-26 03:00:00 (Sun)
  62947594800, #    local_end 1995-09-24 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  62947580400, #    utc_start 1995-09-23 23:00:00 (Sat)
  62963910000, #      utc_end 1996-03-30 23:00:00 (Sat)
  62947591200, #  local_start 1995-09-24 02:00:00 (Sun)
  62963920800, #    local_end 1996-03-31 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  62963910000, #    utc_start 1996-03-30 23:00:00 (Sat)
  62982054000, #      utc_end 1996-10-26 23:00:00 (Sat)
  62963924400, #  local_start 1996-03-31 03:00:00 (Sun)
  62982068400, #    local_end 1996-10-27 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  62982054000, #    utc_start 1996-10-26 23:00:00 (Sat)
  62995359600, #      utc_end 1997-03-29 23:00:00 (Sat)
  62982064800, #  local_start 1996-10-27 02:00:00 (Sun)
  62995370400, #    local_end 1997-03-30 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  62995359600, #    utc_start 1997-03-29 23:00:00 (Sat)
  63013503600, #      utc_end 1997-10-25 23:00:00 (Sat)
  62995374000, #  local_start 1997-03-30 03:00:00 (Sun)
  63013518000, #    local_end 1997-10-26 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63013503600, #    utc_start 1997-10-25 23:00:00 (Sat)
  63026809200, #      utc_end 1998-03-28 23:00:00 (Sat)
  63013514400, #  local_start 1997-10-26 02:00:00 (Sun)
  63026820000, #    local_end 1998-03-29 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63026809200, #    utc_start 1998-03-28 23:00:00 (Sat)
  63044953200, #      utc_end 1998-10-24 23:00:00 (Sat)
  63026823600, #  local_start 1998-03-29 03:00:00 (Sun)
  63044967600, #    local_end 1998-10-25 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63044953200, #    utc_start 1998-10-24 23:00:00 (Sat)
  63058258800, #      utc_end 1999-03-27 23:00:00 (Sat)
  63044964000, #  local_start 1998-10-25 02:00:00 (Sun)
  63058269600, #    local_end 1999-03-28 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63058258800, #    utc_start 1999-03-27 23:00:00 (Sat)
  63077007600, #      utc_end 1999-10-30 23:00:00 (Sat)
  63058273200, #  local_start 1999-03-28 03:00:00 (Sun)
  63077022000, #    local_end 1999-10-31 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63077007600, #    utc_start 1999-10-30 23:00:00 (Sat)
  63089708400, #      utc_end 2000-03-25 23:00:00 (Sat)
  63077018400, #  local_start 1999-10-31 02:00:00 (Sun)
  63089719200, #    local_end 2000-03-26 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63089708400, #    utc_start 2000-03-25 23:00:00 (Sat)
  63108457200, #      utc_end 2000-10-28 23:00:00 (Sat)
  63089722800, #  local_start 2000-03-26 03:00:00 (Sun)
  63108471600, #    local_end 2000-10-29 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63108457200, #    utc_start 2000-10-28 23:00:00 (Sat)
  63121158000, #      utc_end 2001-03-24 23:00:00 (Sat)
  63108468000, #  local_start 2000-10-29 02:00:00 (Sun)
  63121168800, #    local_end 2001-03-25 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63121158000, #    utc_start 2001-03-24 23:00:00 (Sat)
  63139906800, #      utc_end 2001-10-27 23:00:00 (Sat)
  63121172400, #  local_start 2001-03-25 03:00:00 (Sun)
  63139921200, #    local_end 2001-10-28 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63139906800, #    utc_start 2001-10-27 23:00:00 (Sat)
  63153212400, #      utc_end 2002-03-30 23:00:00 (Sat)
  63139917600, #  local_start 2001-10-28 02:00:00 (Sun)
  63153223200, #    local_end 2002-03-31 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63153212400, #    utc_start 2002-03-30 23:00:00 (Sat)
  63171356400, #      utc_end 2002-10-26 23:00:00 (Sat)
  63153226800, #  local_start 2002-03-31 03:00:00 (Sun)
  63171370800, #    local_end 2002-10-27 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63171356400, #    utc_start 2002-10-26 23:00:00 (Sat)
  63184662000, #      utc_end 2003-03-29 23:00:00 (Sat)
  63171367200, #  local_start 2002-10-27 02:00:00 (Sun)
  63184672800, #    local_end 2003-03-30 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63184662000, #    utc_start 2003-03-29 23:00:00 (Sat)
  63202806000, #      utc_end 2003-10-25 23:00:00 (Sat)
  63184676400, #  local_start 2003-03-30 03:00:00 (Sun)
  63202820400, #    local_end 2003-10-26 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63202806000, #    utc_start 2003-10-25 23:00:00 (Sat)
  63216111600, #      utc_end 2004-03-27 23:00:00 (Sat)
  63202816800, #  local_start 2003-10-26 02:00:00 (Sun)
  63216122400, #    local_end 2004-03-28 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63216111600, #    utc_start 2004-03-27 23:00:00 (Sat)
  63234860400, #      utc_end 2004-10-30 23:00:00 (Sat)
  63216126000, #  local_start 2004-03-28 03:00:00 (Sun)
  63234874800, #    local_end 2004-10-31 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63234860400, #    utc_start 2004-10-30 23:00:00 (Sat)
  63247561200, #      utc_end 2005-03-26 23:00:00 (Sat)
  63234871200, #  local_start 2004-10-31 02:00:00 (Sun)
  63247572000, #    local_end 2005-03-27 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63247561200, #    utc_start 2005-03-26 23:00:00 (Sat)
  63266310000, #      utc_end 2005-10-29 23:00:00 (Sat)
  63247575600, #  local_start 2005-03-27 03:00:00 (Sun)
  63266324400, #    local_end 2005-10-30 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63266310000, #    utc_start 2005-10-29 23:00:00 (Sat)
  63279010800, #      utc_end 2006-03-25 23:00:00 (Sat)
  63266320800, #  local_start 2005-10-30 02:00:00 (Sun)
  63279021600, #    local_end 2006-03-26 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63279010800, #    utc_start 2006-03-25 23:00:00 (Sat)
  63297759600, #      utc_end 2006-10-28 23:00:00 (Sat)
  63279025200, #  local_start 2006-03-26 03:00:00 (Sun)
  63297774000, #    local_end 2006-10-29 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63297759600, #    utc_start 2006-10-28 23:00:00 (Sat)
  63310460400, #      utc_end 2007-03-24 23:00:00 (Sat)
  63297770400, #  local_start 2006-10-29 02:00:00 (Sun)
  63310471200, #    local_end 2007-03-25 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63310460400, #    utc_start 2007-03-24 23:00:00 (Sat)
  63329209200, #      utc_end 2007-10-27 23:00:00 (Sat)
  63310474800, #  local_start 2007-03-25 03:00:00 (Sun)
  63329223600, #    local_end 2007-10-28 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63329209200, #    utc_start 2007-10-27 23:00:00 (Sat)
  63342514800, #      utc_end 2008-03-29 23:00:00 (Sat)
  63329220000, #  local_start 2007-10-28 02:00:00 (Sun)
  63342525600, #    local_end 2008-03-30 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63342514800, #    utc_start 2008-03-29 23:00:00 (Sat)
  63360658800, #      utc_end 2008-10-25 23:00:00 (Sat)
  63342529200, #  local_start 2008-03-30 03:00:00 (Sun)
  63360673200, #    local_end 2008-10-26 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63360658800, #    utc_start 2008-10-25 23:00:00 (Sat)
  63373964400, #      utc_end 2009-03-28 23:00:00 (Sat)
  63360669600, #  local_start 2008-10-26 02:00:00 (Sun)
  63373975200, #    local_end 2009-03-29 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63373964400, #    utc_start 2009-03-28 23:00:00 (Sat)
  63392108400, #      utc_end 2009-10-24 23:00:00 (Sat)
  63373978800, #  local_start 2009-03-29 03:00:00 (Sun)
  63392122800, #    local_end 2009-10-25 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63392108400, #    utc_start 2009-10-24 23:00:00 (Sat)
  63405414000, #      utc_end 2010-03-27 23:00:00 (Sat)
  63392119200, #  local_start 2009-10-25 02:00:00 (Sun)
  63405424800, #    local_end 2010-03-28 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63405414000, #    utc_start 2010-03-27 23:00:00 (Sat)
  63424162800, #      utc_end 2010-10-30 23:00:00 (Sat)
  63405428400, #  local_start 2010-03-28 03:00:00 (Sun)
  63424177200, #    local_end 2010-10-31 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63424162800, #    utc_start 2010-10-30 23:00:00 (Sat)
  63436863600, #      utc_end 2011-03-26 23:00:00 (Sat)
  63424173600, #  local_start 2010-10-31 02:00:00 (Sun)
  63436874400, #    local_end 2011-03-27 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63436863600, #    utc_start 2011-03-26 23:00:00 (Sat)
  63549957600, #      utc_end 2014-10-25 22:00:00 (Sat)
  63436878000, #  local_start 2011-03-27 03:00:00 (Sun)
  63549972000, #    local_end 2014-10-26 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63549957600, #    utc_start 2014-10-25 22:00:00 (Sat)
  63616489200, #      utc_end 2016-12-03 23:00:00 (Sat)
  63549968400, #  local_start 2014-10-26 01:00:00 (Sun)
  63616500000, #    local_end 2016-12-04 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63616489200, #    utc_start 2016-12-03 23:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  63616503600, #  local_start 2016-12-04 03:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  14400,
  0,
  '+04',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {29}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_EUROPE_SARATOV

    $main::fatpacked{"DateTime/TimeZone/Europe/Simferopol.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_EUROPE_SIMFEROPOL';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Europe::Simferopol;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Europe::Simferopol::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59295534216, #      utc_end 1879-12-31 21:43:36 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59295542400, #    local_end 1880-01-01 00:00:00 (Thu)
  8184,
  0,
  'LMT',
      ],
      [
  59295534216, #    utc_start 1879-12-31 21:43:36 (Wed)
  60694523040, #      utc_end 1924-05-01 21:44:00 (Thu)
  59295542376, #  local_start 1879-12-31 23:59:36 (Wed)
  60694531200, #    local_end 1924-05-02 00:00:00 (Fri)
  8160,
  0,
  'SMT',
      ],
      [
  60694523040, #    utc_start 1924-05-01 21:44:00 (Thu)
  60888146400, #      utc_end 1930-06-20 22:00:00 (Fri)
  60694530240, #  local_start 1924-05-01 23:44:00 (Thu)
  60888153600, #    local_end 1930-06-21 00:00:00 (Sat)
  7200,
  0,
  'EET',
      ],
      [
  60888146400, #    utc_start 1930-06-20 22:00:00 (Fri)
  61246789200, #      utc_end 1941-10-31 21:00:00 (Fri)
  60888157200, #  local_start 1930-06-21 01:00:00 (Sat)
  61246800000, #    local_end 1941-11-01 00:00:00 (Sat)
  10800,
  0,
  'MSK',
      ],
      [
  61246789200, #    utc_start 1941-10-31 21:00:00 (Fri)
  61278426000, #      utc_end 1942-11-02 01:00:00 (Mon)
  61246796400, #  local_start 1941-10-31 23:00:00 (Fri)
  61278433200, #    local_end 1942-11-02 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61278426000, #    utc_start 1942-11-02 01:00:00 (Mon)
  61291126800, #      utc_end 1943-03-29 01:00:00 (Mon)
  61278429600, #  local_start 1942-11-02 02:00:00 (Mon)
  61291130400, #    local_end 1943-03-29 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61291126800, #    utc_start 1943-03-29 01:00:00 (Mon)
  61307456400, #      utc_end 1943-10-04 01:00:00 (Mon)
  61291134000, #  local_start 1943-03-29 03:00:00 (Mon)
  61307463600, #    local_end 1943-10-04 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61307456400, #    utc_start 1943-10-04 01:00:00 (Mon)
  61323181200, #      utc_end 1944-04-03 01:00:00 (Mon)
  61307460000, #  local_start 1943-10-04 02:00:00 (Mon)
  61323184800, #    local_end 1944-04-03 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61323181200, #    utc_start 1944-04-03 01:00:00 (Mon)
  61324034400, #      utc_end 1944-04-12 22:00:00 (Wed)
  61323188400, #  local_start 1944-04-03 03:00:00 (Mon)
  61324041600, #    local_end 1944-04-13 00:00:00 (Thu)
  7200,
  1,
  'CEST',
      ],
      [
  61324034400, #    utc_start 1944-04-12 22:00:00 (Wed)
  62490603600, #      utc_end 1981-03-31 21:00:00 (Tue)
  61324045200, #  local_start 1944-04-13 01:00:00 (Thu)
  62490614400, #    local_end 1981-04-01 00:00:00 (Wed)
  10800,
  0,
  'MSK',
      ],
      [
  62490603600, #    utc_start 1981-03-31 21:00:00 (Tue)
  62506411200, #      utc_end 1981-09-30 20:00:00 (Wed)
  62490618000, #  local_start 1981-04-01 01:00:00 (Wed)
  62506425600, #    local_end 1981-10-01 00:00:00 (Thu)
  14400,
  1,
  'MSD',
      ],
      [
  62506411200, #    utc_start 1981-09-30 20:00:00 (Wed)
  62522139600, #      utc_end 1982-03-31 21:00:00 (Wed)
  62506422000, #  local_start 1981-09-30 23:00:00 (Wed)
  62522150400, #    local_end 1982-04-01 00:00:00 (Thu)
  10800,
  0,
  'MSK',
      ],
      [
  62522139600, #    utc_start 1982-03-31 21:00:00 (Wed)
  62537947200, #      utc_end 1982-09-30 20:00:00 (Thu)
  62522154000, #  local_start 1982-04-01 01:00:00 (Thu)
  62537961600, #    local_end 1982-10-01 00:00:00 (Fri)
  14400,
  1,
  'MSD',
      ],
      [
  62537947200, #    utc_start 1982-09-30 20:00:00 (Thu)
  62553675600, #      utc_end 1983-03-31 21:00:00 (Thu)
  62537958000, #  local_start 1982-09-30 23:00:00 (Thu)
  62553686400, #    local_end 1983-04-01 00:00:00 (Fri)
  10800,
  0,
  'MSK',
      ],
      [
  62553675600, #    utc_start 1983-03-31 21:00:00 (Thu)
  62569483200, #      utc_end 1983-09-30 20:00:00 (Fri)
  62553690000, #  local_start 1983-04-01 01:00:00 (Fri)
  62569497600, #    local_end 1983-10-01 00:00:00 (Sat)
  14400,
  1,
  'MSD',
      ],
      [
  62569483200, #    utc_start 1983-09-30 20:00:00 (Fri)
  62585298000, #      utc_end 1984-03-31 21:00:00 (Sat)
  62569494000, #  local_start 1983-09-30 23:00:00 (Fri)
  62585308800, #    local_end 1984-04-01 00:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62585298000, #    utc_start 1984-03-31 21:00:00 (Sat)
  62601030000, #      utc_end 1984-09-29 23:00:00 (Sat)
  62585312400, #  local_start 1984-04-01 01:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62601030000, #    utc_start 1984-09-29 23:00:00 (Sat)
  62616754800, #      utc_end 1985-03-30 23:00:00 (Sat)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62616754800, #    utc_start 1985-03-30 23:00:00 (Sat)
  62632479600, #      utc_end 1985-09-28 23:00:00 (Sat)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62632479600, #    utc_start 1985-09-28 23:00:00 (Sat)
  62648204400, #      utc_end 1986-03-29 23:00:00 (Sat)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62648204400, #    utc_start 1986-03-29 23:00:00 (Sat)
  62663929200, #      utc_end 1986-09-27 23:00:00 (Sat)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62663929200, #    utc_start 1986-09-27 23:00:00 (Sat)
  62679654000, #      utc_end 1987-03-28 23:00:00 (Sat)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62679654000, #    utc_start 1987-03-28 23:00:00 (Sat)
  62695378800, #      utc_end 1987-09-26 23:00:00 (Sat)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62695378800, #    utc_start 1987-09-26 23:00:00 (Sat)
  62711103600, #      utc_end 1988-03-26 23:00:00 (Sat)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62711103600, #    utc_start 1988-03-26 23:00:00 (Sat)
  62726828400, #      utc_end 1988-09-24 23:00:00 (Sat)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62726828400, #    utc_start 1988-09-24 23:00:00 (Sat)
  62742553200, #      utc_end 1989-03-25 23:00:00 (Sat)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62742553200, #    utc_start 1989-03-25 23:00:00 (Sat)
  62758278000, #      utc_end 1989-09-23 23:00:00 (Sat)
  62742567600, #  local_start 1989-03-26 03:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62758278000, #    utc_start 1989-09-23 23:00:00 (Sat)
  62766824400, #      utc_end 1989-12-31 21:00:00 (Sun)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62766835200, #    local_end 1990-01-01 00:00:00 (Mon)
  10800,
  0,
  'MSK',
      ],
      [
  62766824400, #    utc_start 1989-12-31 21:00:00 (Sun)
  62782470000, #      utc_end 1990-06-30 23:00:00 (Sat)
  62766835200, #  local_start 1990-01-01 00:00:00 (Mon)
  62782480800, #    local_end 1990-07-01 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62782470000, #    utc_start 1990-06-30 23:00:00 (Sat)
  62829900000, #      utc_end 1991-12-31 22:00:00 (Tue)
  62782477200, #  local_start 1990-07-01 01:00:00 (Sun)
  62829907200, #    local_end 1992-01-01 00:00:00 (Wed)
  7200,
  0,
  'EET',
      ],
      [
  62829900000, #    utc_start 1991-12-31 22:00:00 (Tue)
  62837503200, #      utc_end 1992-03-28 22:00:00 (Sat)
  62829907200, #  local_start 1992-01-01 00:00:00 (Wed)
  62837510400, #    local_end 1992-03-29 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62837503200, #    utc_start 1992-03-28 22:00:00 (Sat)
  62853224400, #      utc_end 1992-09-26 21:00:00 (Sat)
  62837514000, #  local_start 1992-03-29 01:00:00 (Sun)
  62853235200, #    local_end 1992-09-27 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62853224400, #    utc_start 1992-09-26 21:00:00 (Sat)
  62868952800, #      utc_end 1993-03-27 22:00:00 (Sat)
  62853231600, #  local_start 1992-09-26 23:00:00 (Sat)
  62868960000, #    local_end 1993-03-28 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62868952800, #    utc_start 1993-03-27 22:00:00 (Sat)
  62884674000, #      utc_end 1993-09-25 21:00:00 (Sat)
  62868963600, #  local_start 1993-03-28 01:00:00 (Sun)
  62884684800, #    local_end 1993-09-26 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62884674000, #    utc_start 1993-09-25 21:00:00 (Sat)
  62900402400, #      utc_end 1994-03-26 22:00:00 (Sat)
  62884681200, #  local_start 1993-09-25 23:00:00 (Sat)
  62900409600, #    local_end 1994-03-27 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62900402400, #    utc_start 1994-03-26 22:00:00 (Sat)
  62903422800, #      utc_end 1994-04-30 21:00:00 (Sat)
  62900413200, #  local_start 1994-03-27 01:00:00 (Sun)
  62903433600, #    local_end 1994-05-01 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62903422800, #    utc_start 1994-04-30 21:00:00 (Sat)
  62916120000, #      utc_end 1994-09-24 20:00:00 (Sat)
  62903437200, #  local_start 1994-05-01 01:00:00 (Sun)
  62916134400, #    local_end 1994-09-25 00:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62916120000, #    utc_start 1994-09-24 20:00:00 (Sat)
  62931848400, #      utc_end 1995-03-25 21:00:00 (Sat)
  62916130800, #  local_start 1994-09-24 23:00:00 (Sat)
  62931859200, #    local_end 1995-03-26 00:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62931848400, #    utc_start 1995-03-25 21:00:00 (Sat)
  62947569600, #      utc_end 1995-09-23 20:00:00 (Sat)
  62931862800, #  local_start 1995-03-26 01:00:00 (Sun)
  62947584000, #    local_end 1995-09-24 00:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62947569600, #    utc_start 1995-09-23 20:00:00 (Sat)
  62963902800, #      utc_end 1996-03-30 21:00:00 (Sat)
  62947580400, #  local_start 1995-09-23 23:00:00 (Sat)
  62963913600, #    local_end 1996-03-31 00:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62963902800, #    utc_start 1996-03-30 21:00:00 (Sat)
  62982057600, #      utc_end 1996-10-27 00:00:00 (Sun)
  62963917200, #  local_start 1996-03-31 01:00:00 (Sun)
  62982072000, #    local_end 1996-10-27 04:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62982057600, #    utc_start 1996-10-27 00:00:00 (Sun)
  62987749200, #      utc_end 1996-12-31 21:00:00 (Tue)
  62982068400, #  local_start 1996-10-27 03:00:00 (Sun)
  62987760000, #    local_end 1997-01-01 00:00:00 (Wed)
  10800,
  0,
  'MSK',
      ],
      [
  62987749200, #    utc_start 1996-12-31 21:00:00 (Tue)
  62995366800, #      utc_end 1997-03-30 01:00:00 (Sun)
  62987760000, #  local_start 1997-01-01 00:00:00 (Wed)
  62995377600, #    local_end 1997-03-30 04:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62995366800, #    utc_start 1997-03-30 01:00:00 (Sun)
  63013510800, #      utc_end 1997-10-26 01:00:00 (Sun)
  62995377600, #  local_start 1997-03-30 04:00:00 (Sun)
  63013521600, #    local_end 1997-10-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63013510800, #    utc_start 1997-10-26 01:00:00 (Sun)
  63026816400, #      utc_end 1998-03-29 01:00:00 (Sun)
  63013518000, #  local_start 1997-10-26 03:00:00 (Sun)
  63026823600, #    local_end 1998-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63026816400, #    utc_start 1998-03-29 01:00:00 (Sun)
  63044960400, #      utc_end 1998-10-25 01:00:00 (Sun)
  63026827200, #  local_start 1998-03-29 04:00:00 (Sun)
  63044971200, #    local_end 1998-10-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63044960400, #    utc_start 1998-10-25 01:00:00 (Sun)
  63058266000, #      utc_end 1999-03-28 01:00:00 (Sun)
  63044967600, #  local_start 1998-10-25 03:00:00 (Sun)
  63058273200, #    local_end 1999-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63058266000, #    utc_start 1999-03-28 01:00:00 (Sun)
  63077014800, #      utc_end 1999-10-31 01:00:00 (Sun)
  63058276800, #  local_start 1999-03-28 04:00:00 (Sun)
  63077025600, #    local_end 1999-10-31 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63077014800, #    utc_start 1999-10-31 01:00:00 (Sun)
  63089715600, #      utc_end 2000-03-26 01:00:00 (Sun)
  63077022000, #  local_start 1999-10-31 03:00:00 (Sun)
  63089722800, #    local_end 2000-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63089715600, #    utc_start 2000-03-26 01:00:00 (Sun)
  63108464400, #      utc_end 2000-10-29 01:00:00 (Sun)
  63089726400, #  local_start 2000-03-26 04:00:00 (Sun)
  63108475200, #    local_end 2000-10-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63108464400, #    utc_start 2000-10-29 01:00:00 (Sun)
  63121165200, #      utc_end 2001-03-25 01:00:00 (Sun)
  63108471600, #  local_start 2000-10-29 03:00:00 (Sun)
  63121172400, #    local_end 2001-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63121165200, #    utc_start 2001-03-25 01:00:00 (Sun)
  63139914000, #      utc_end 2001-10-28 01:00:00 (Sun)
  63121176000, #  local_start 2001-03-25 04:00:00 (Sun)
  63139924800, #    local_end 2001-10-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63139914000, #    utc_start 2001-10-28 01:00:00 (Sun)
  63153219600, #      utc_end 2002-03-31 01:00:00 (Sun)
  63139921200, #  local_start 2001-10-28 03:00:00 (Sun)
  63153226800, #    local_end 2002-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63153219600, #    utc_start 2002-03-31 01:00:00 (Sun)
  63171363600, #      utc_end 2002-10-27 01:00:00 (Sun)
  63153230400, #  local_start 2002-03-31 04:00:00 (Sun)
  63171374400, #    local_end 2002-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63171363600, #    utc_start 2002-10-27 01:00:00 (Sun)
  63184669200, #      utc_end 2003-03-30 01:00:00 (Sun)
  63171370800, #  local_start 2002-10-27 03:00:00 (Sun)
  63184676400, #    local_end 2003-03-30 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63184669200, #    utc_start 2003-03-30 01:00:00 (Sun)
  63202813200, #      utc_end 2003-10-26 01:00:00 (Sun)
  63184680000, #  local_start 2003-03-30 04:00:00 (Sun)
  63202824000, #    local_end 2003-10-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63202813200, #    utc_start 2003-10-26 01:00:00 (Sun)
  63216118800, #      utc_end 2004-03-28 01:00:00 (Sun)
  63202820400, #  local_start 2003-10-26 03:00:00 (Sun)
  63216126000, #    local_end 2004-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63216118800, #    utc_start 2004-03-28 01:00:00 (Sun)
  63234867600, #      utc_end 2004-10-31 01:00:00 (Sun)
  63216129600, #  local_start 2004-03-28 04:00:00 (Sun)
  63234878400, #    local_end 2004-10-31 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63234867600, #    utc_start 2004-10-31 01:00:00 (Sun)
  63247568400, #      utc_end 2005-03-27 01:00:00 (Sun)
  63234874800, #  local_start 2004-10-31 03:00:00 (Sun)
  63247575600, #    local_end 2005-03-27 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63247568400, #    utc_start 2005-03-27 01:00:00 (Sun)
  63266317200, #      utc_end 2005-10-30 01:00:00 (Sun)
  63247579200, #  local_start 2005-03-27 04:00:00 (Sun)
  63266328000, #    local_end 2005-10-30 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63266317200, #    utc_start 2005-10-30 01:00:00 (Sun)
  63279018000, #      utc_end 2006-03-26 01:00:00 (Sun)
  63266324400, #  local_start 2005-10-30 03:00:00 (Sun)
  63279025200, #    local_end 2006-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63279018000, #    utc_start 2006-03-26 01:00:00 (Sun)
  63297766800, #      utc_end 2006-10-29 01:00:00 (Sun)
  63279028800, #  local_start 2006-03-26 04:00:00 (Sun)
  63297777600, #    local_end 2006-10-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63297766800, #    utc_start 2006-10-29 01:00:00 (Sun)
  63310467600, #      utc_end 2007-03-25 01:00:00 (Sun)
  63297774000, #  local_start 2006-10-29 03:00:00 (Sun)
  63310474800, #    local_end 2007-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63310467600, #    utc_start 2007-03-25 01:00:00 (Sun)
  63329216400, #      utc_end 2007-10-28 01:00:00 (Sun)
  63310478400, #  local_start 2007-03-25 04:00:00 (Sun)
  63329227200, #    local_end 2007-10-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63329216400, #    utc_start 2007-10-28 01:00:00 (Sun)
  63342522000, #      utc_end 2008-03-30 01:00:00 (Sun)
  63329223600, #  local_start 2007-10-28 03:00:00 (Sun)
  63342529200, #    local_end 2008-03-30 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63342522000, #    utc_start 2008-03-30 01:00:00 (Sun)
  63360666000, #      utc_end 2008-10-26 01:00:00 (Sun)
  63342532800, #  local_start 2008-03-30 04:00:00 (Sun)
  63360676800, #    local_end 2008-10-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63360666000, #    utc_start 2008-10-26 01:00:00 (Sun)
  63373971600, #      utc_end 2009-03-29 01:00:00 (Sun)
  63360673200, #  local_start 2008-10-26 03:00:00 (Sun)
  63373978800, #    local_end 2009-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63373971600, #    utc_start 2009-03-29 01:00:00 (Sun)
  63392115600, #      utc_end 2009-10-25 01:00:00 (Sun)
  63373982400, #  local_start 2009-03-29 04:00:00 (Sun)
  63392126400, #    local_end 2009-10-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63392115600, #    utc_start 2009-10-25 01:00:00 (Sun)
  63405421200, #      utc_end 2010-03-28 01:00:00 (Sun)
  63392122800, #  local_start 2009-10-25 03:00:00 (Sun)
  63405428400, #    local_end 2010-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63405421200, #    utc_start 2010-03-28 01:00:00 (Sun)
  63424170000, #      utc_end 2010-10-31 01:00:00 (Sun)
  63405432000, #  local_start 2010-03-28 04:00:00 (Sun)
  63424180800, #    local_end 2010-10-31 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63424170000, #    utc_start 2010-10-31 01:00:00 (Sun)
  63436870800, #      utc_end 2011-03-27 01:00:00 (Sun)
  63424177200, #  local_start 2010-10-31 03:00:00 (Sun)
  63436878000, #    local_end 2011-03-27 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63436870800, #    utc_start 2011-03-27 01:00:00 (Sun)
  63455619600, #      utc_end 2011-10-30 01:00:00 (Sun)
  63436881600, #  local_start 2011-03-27 04:00:00 (Sun)
  63455630400, #    local_end 2011-10-30 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63455619600, #    utc_start 2011-10-30 01:00:00 (Sun)
  63468320400, #      utc_end 2012-03-25 01:00:00 (Sun)
  63455626800, #  local_start 2011-10-30 03:00:00 (Sun)
  63468327600, #    local_end 2012-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63468320400, #    utc_start 2012-03-25 01:00:00 (Sun)
  63487069200, #      utc_end 2012-10-28 01:00:00 (Sun)
  63468331200, #  local_start 2012-03-25 04:00:00 (Sun)
  63487080000, #    local_end 2012-10-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63487069200, #    utc_start 2012-10-28 01:00:00 (Sun)
  63500374800, #      utc_end 2013-03-31 01:00:00 (Sun)
  63487076400, #  local_start 2012-10-28 03:00:00 (Sun)
  63500382000, #    local_end 2013-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63500374800, #    utc_start 2013-03-31 01:00:00 (Sun)
  63518518800, #      utc_end 2013-10-27 01:00:00 (Sun)
  63500385600, #  local_start 2013-03-31 04:00:00 (Sun)
  63518529600, #    local_end 2013-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63518518800, #    utc_start 2013-10-27 01:00:00 (Sun)
  63531820800, #      utc_end 2014-03-30 00:00:00 (Sun)
  63518526000, #  local_start 2013-10-27 03:00:00 (Sun)
  63531828000, #    local_end 2014-03-30 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63531820800, #    utc_start 2014-03-30 00:00:00 (Sun)
  63549957600, #      utc_end 2014-10-25 22:00:00 (Sat)
  63531835200, #  local_start 2014-03-30 04:00:00 (Sun)
  63549972000, #    local_end 2014-10-26 02:00:00 (Sun)
  14400,
  0,
  'MSK',
      ],
      [
  63549957600, #    utc_start 2014-10-25 22:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  63549968400, #  local_start 2014-10-26 01:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  10800,
  0,
  'MSK',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {35}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_EUROPE_SIMFEROPOL

    $main::fatpacked{"DateTime/TimeZone/Europe/Sofia.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_EUROPE_SOFIA';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Europe::Sofia;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Europe::Sofia::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59295536804, #      utc_end 1879-12-31 22:26:44 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59295542400, #    local_end 1880-01-01 00:00:00 (Thu)
  5596,
  0,
  'LMT',
      ],
      [
  59295536804, #    utc_start 1879-12-31 22:26:44 (Wed)
  59766156184, #      utc_end 1894-11-29 22:03:04 (Thu)
  59295543820, #  local_start 1880-01-01 00:23:40 (Thu)
  59766163200, #    local_end 1894-11-30 00:00:00 (Fri)
  7016,
  0,
  'IMT',
      ],
      [
  59766156184, #    utc_start 1894-11-29 22:03:04 (Thu)
  61278426000, #      utc_end 1942-11-02 01:00:00 (Mon)
  59766163384, #  local_start 1894-11-30 00:03:04 (Fri)
  61278433200, #    local_end 1942-11-02 03:00:00 (Mon)
  7200,
  0,
  'EET',
      ],
      [
  61278426000, #    utc_start 1942-11-02 01:00:00 (Mon)
  61291126800, #      utc_end 1943-03-29 01:00:00 (Mon)
  61278429600, #  local_start 1942-11-02 02:00:00 (Mon)
  61291130400, #    local_end 1943-03-29 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61291126800, #    utc_start 1943-03-29 01:00:00 (Mon)
  61307456400, #      utc_end 1943-10-04 01:00:00 (Mon)
  61291134000, #  local_start 1943-03-29 03:00:00 (Mon)
  61307463600, #    local_end 1943-10-04 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61307456400, #    utc_start 1943-10-04 01:00:00 (Mon)
  61323181200, #      utc_end 1944-04-03 01:00:00 (Mon)
  61307460000, #  local_start 1943-10-04 02:00:00 (Mon)
  61323184800, #    local_end 1944-04-03 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61323181200, #    utc_start 1944-04-03 01:00:00 (Mon)
  61338906000, #      utc_end 1944-10-02 01:00:00 (Mon)
  61323188400, #  local_start 1944-04-03 03:00:00 (Mon)
  61338913200, #    local_end 1944-10-02 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61338906000, #    utc_start 1944-10-02 01:00:00 (Mon)
  61346761200, #      utc_end 1944-12-31 23:00:00 (Sun)
  61338909600, #  local_start 1944-10-02 02:00:00 (Mon)
  61346764800, #    local_end 1945-01-01 00:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61346761200, #    utc_start 1944-12-31 23:00:00 (Sun)
  61354634400, #      utc_end 1945-04-02 02:00:00 (Mon)
  61346764800, #  local_start 1945-01-01 00:00:00 (Mon)
  61354638000, #    local_end 1945-04-02 03:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61354634400, #    utc_start 1945-04-02 02:00:00 (Mon)
  62427445200, #      utc_end 1979-03-31 21:00:00 (Sat)
  61354641600, #  local_start 1945-04-02 04:00:00 (Mon)
  62427452400, #    local_end 1979-03-31 23:00:00 (Sat)
  7200,
  0,
  'EET',
      ],
      [
  62427445200, #    utc_start 1979-03-31 21:00:00 (Sat)
  62443260000, #      utc_end 1979-09-30 22:00:00 (Sun)
  62427456000, #  local_start 1979-04-01 00:00:00 (Sun)
  62443270800, #    local_end 1979-10-01 01:00:00 (Mon)
  10800,
  1,
  'EEST',
      ],
      [
  62443260000, #    utc_start 1979-09-30 22:00:00 (Sun)
  62459499600, #      utc_end 1980-04-05 21:00:00 (Sat)
  62443267200, #  local_start 1979-10-01 00:00:00 (Mon)
  62459506800, #    local_end 1980-04-05 23:00:00 (Sat)
  7200,
  0,
  'EET',
      ],
      [
  62459499600, #    utc_start 1980-04-05 21:00:00 (Sat)
  62474709600, #      utc_end 1980-09-28 22:00:00 (Sun)
  62459510400, #  local_start 1980-04-06 00:00:00 (Sun)
  62474720400, #    local_end 1980-09-29 01:00:00 (Mon)
  10800,
  1,
  'EEST',
      ],
      [
  62474709600, #    utc_start 1980-09-28 22:00:00 (Sun)
  62490949200, #      utc_end 1981-04-04 21:00:00 (Sat)
  62474716800, #  local_start 1980-09-29 00:00:00 (Mon)
  62490956400, #    local_end 1981-04-04 23:00:00 (Sat)
  7200,
  0,
  'EET',
      ],
      [
  62490949200, #    utc_start 1981-04-04 21:00:00 (Sat)
  62506076400, #      utc_end 1981-09-26 23:00:00 (Sat)
  62490960000, #  local_start 1981-04-05 00:00:00 (Sun)
  62506087200, #    local_end 1981-09-27 02:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62506076400, #    utc_start 1981-09-26 23:00:00 (Sat)
  62522398800, #      utc_end 1982-04-03 21:00:00 (Sat)
  62506083600, #  local_start 1981-09-27 01:00:00 (Sun)
  62522406000, #    local_end 1982-04-03 23:00:00 (Sat)
  7200,
  0,
  'EET',
      ],
      [
  62522398800, #    utc_start 1982-04-03 21:00:00 (Sat)
  62537529600, #      utc_end 1982-09-26 00:00:00 (Sun)
  62522409600, #  local_start 1982-04-04 00:00:00 (Sun)
  62537540400, #    local_end 1982-09-26 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62537529600, #    utc_start 1982-09-26 00:00:00 (Sun)
  62553254400, #      utc_end 1983-03-27 00:00:00 (Sun)
  62537536800, #  local_start 1982-09-26 02:00:00 (Sun)
  62553261600, #    local_end 1983-03-27 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62553254400, #    utc_start 1983-03-27 00:00:00 (Sun)
  62568979200, #      utc_end 1983-09-25 00:00:00 (Sun)
  62553265200, #  local_start 1983-03-27 03:00:00 (Sun)
  62568990000, #    local_end 1983-09-25 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62568979200, #    utc_start 1983-09-25 00:00:00 (Sun)
  62584704000, #      utc_end 1984-03-25 00:00:00 (Sun)
  62568986400, #  local_start 1983-09-25 02:00:00 (Sun)
  62584711200, #    local_end 1984-03-25 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62584704000, #    utc_start 1984-03-25 00:00:00 (Sun)
  62601033600, #      utc_end 1984-09-30 00:00:00 (Sun)
  62584714800, #  local_start 1984-03-25 03:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62601033600, #    utc_start 1984-09-30 00:00:00 (Sun)
  62616758400, #      utc_end 1985-03-31 00:00:00 (Sun)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62616758400, #    utc_start 1985-03-31 00:00:00 (Sun)
  62632483200, #      utc_end 1985-09-29 00:00:00 (Sun)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62632483200, #    utc_start 1985-09-29 00:00:00 (Sun)
  62648208000, #      utc_end 1986-03-30 00:00:00 (Sun)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62648208000, #    utc_start 1986-03-30 00:00:00 (Sun)
  62663932800, #      utc_end 1986-09-28 00:00:00 (Sun)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62663932800, #    utc_start 1986-09-28 00:00:00 (Sun)
  62679657600, #      utc_end 1987-03-29 00:00:00 (Sun)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62679657600, #    utc_start 1987-03-29 00:00:00 (Sun)
  62695382400, #      utc_end 1987-09-27 00:00:00 (Sun)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62695382400, #    utc_start 1987-09-27 00:00:00 (Sun)
  62711107200, #      utc_end 1988-03-27 00:00:00 (Sun)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62711107200, #    utc_start 1988-03-27 00:00:00 (Sun)
  62726832000, #      utc_end 1988-09-25 00:00:00 (Sun)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62726832000, #    utc_start 1988-09-25 00:00:00 (Sun)
  62742556800, #      utc_end 1989-03-26 00:00:00 (Sun)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62742556800, #    utc_start 1989-03-26 00:00:00 (Sun)
  62758281600, #      utc_end 1989-09-24 00:00:00 (Sun)
  62742567600, #  local_start 1989-03-26 03:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62758281600, #    utc_start 1989-09-24 00:00:00 (Sun)
  62774006400, #      utc_end 1990-03-25 00:00:00 (Sun)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62774006400, #    utc_start 1990-03-25 00:00:00 (Sun)
  62790336000, #      utc_end 1990-09-30 00:00:00 (Sun)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62790336000, #    utc_start 1990-09-30 00:00:00 (Sun)
  62798364000, #      utc_end 1990-12-31 22:00:00 (Mon)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62798371200, #    local_end 1991-01-01 00:00:00 (Tue)
  7200,
  0,
  'EET',
      ],
      [
  62798364000, #    utc_start 1990-12-31 22:00:00 (Mon)
  62806053600, #      utc_end 1991-03-30 22:00:00 (Sat)
  62798371200, #  local_start 1991-01-01 00:00:00 (Tue)
  62806060800, #    local_end 1991-03-31 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62806053600, #    utc_start 1991-03-30 22:00:00 (Sat)
  62821774800, #      utc_end 1991-09-28 21:00:00 (Sat)
  62806064400, #  local_start 1991-03-31 01:00:00 (Sun)
  62821785600, #    local_end 1991-09-29 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62821774800, #    utc_start 1991-09-28 21:00:00 (Sat)
  62837503200, #      utc_end 1992-03-28 22:00:00 (Sat)
  62821782000, #  local_start 1991-09-28 23:00:00 (Sat)
  62837510400, #    local_end 1992-03-29 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62837503200, #    utc_start 1992-03-28 22:00:00 (Sat)
  62853224400, #      utc_end 1992-09-26 21:00:00 (Sat)
  62837514000, #  local_start 1992-03-29 01:00:00 (Sun)
  62853235200, #    local_end 1992-09-27 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62853224400, #    utc_start 1992-09-26 21:00:00 (Sat)
  62868952800, #      utc_end 1993-03-27 22:00:00 (Sat)
  62853231600, #  local_start 1992-09-26 23:00:00 (Sat)
  62868960000, #    local_end 1993-03-28 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62868952800, #    utc_start 1993-03-27 22:00:00 (Sat)
  62884674000, #      utc_end 1993-09-25 21:00:00 (Sat)
  62868963600, #  local_start 1993-03-28 01:00:00 (Sun)
  62884684800, #    local_end 1993-09-26 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62884674000, #    utc_start 1993-09-25 21:00:00 (Sat)
  62900402400, #      utc_end 1994-03-26 22:00:00 (Sat)
  62884681200, #  local_start 1993-09-25 23:00:00 (Sat)
  62900409600, #    local_end 1994-03-27 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62900402400, #    utc_start 1994-03-26 22:00:00 (Sat)
  62916123600, #      utc_end 1994-09-24 21:00:00 (Sat)
  62900413200, #  local_start 1994-03-27 01:00:00 (Sun)
  62916134400, #    local_end 1994-09-25 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62916123600, #    utc_start 1994-09-24 21:00:00 (Sat)
  62931852000, #      utc_end 1995-03-25 22:00:00 (Sat)
  62916130800, #  local_start 1994-09-24 23:00:00 (Sat)
  62931859200, #    local_end 1995-03-26 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62931852000, #    utc_start 1995-03-25 22:00:00 (Sat)
  62947573200, #      utc_end 1995-09-23 21:00:00 (Sat)
  62931862800, #  local_start 1995-03-26 01:00:00 (Sun)
  62947584000, #    local_end 1995-09-24 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62947573200, #    utc_start 1995-09-23 21:00:00 (Sat)
  62963906400, #      utc_end 1996-03-30 22:00:00 (Sat)
  62947580400, #  local_start 1995-09-23 23:00:00 (Sat)
  62963913600, #    local_end 1996-03-31 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62963906400, #    utc_start 1996-03-30 22:00:00 (Sat)
  62982046800, #      utc_end 1996-10-26 21:00:00 (Sat)
  62963917200, #  local_start 1996-03-31 01:00:00 (Sun)
  62982057600, #    local_end 1996-10-27 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62982046800, #    utc_start 1996-10-26 21:00:00 (Sat)
  62987752800, #      utc_end 1996-12-31 22:00:00 (Tue)
  62982054000, #  local_start 1996-10-26 23:00:00 (Sat)
  62987760000, #    local_end 1997-01-01 00:00:00 (Wed)
  7200,
  0,
  'EET',
      ],
      [
  62987752800, #    utc_start 1996-12-31 22:00:00 (Tue)
  62995366800, #      utc_end 1997-03-30 01:00:00 (Sun)
  62987760000, #  local_start 1997-01-01 00:00:00 (Wed)
  62995374000, #    local_end 1997-03-30 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62995366800, #    utc_start 1997-03-30 01:00:00 (Sun)
  63013510800, #      utc_end 1997-10-26 01:00:00 (Sun)
  62995377600, #  local_start 1997-03-30 04:00:00 (Sun)
  63013521600, #    local_end 1997-10-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63013510800, #    utc_start 1997-10-26 01:00:00 (Sun)
  63026816400, #      utc_end 1998-03-29 01:00:00 (Sun)
  63013518000, #  local_start 1997-10-26 03:00:00 (Sun)
  63026823600, #    local_end 1998-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63026816400, #    utc_start 1998-03-29 01:00:00 (Sun)
  63044960400, #      utc_end 1998-10-25 01:00:00 (Sun)
  63026827200, #  local_start 1998-03-29 04:00:00 (Sun)
  63044971200, #    local_end 1998-10-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63044960400, #    utc_start 1998-10-25 01:00:00 (Sun)
  63058266000, #      utc_end 1999-03-28 01:00:00 (Sun)
  63044967600, #  local_start 1998-10-25 03:00:00 (Sun)
  63058273200, #    local_end 1999-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63058266000, #    utc_start 1999-03-28 01:00:00 (Sun)
  63077014800, #      utc_end 1999-10-31 01:00:00 (Sun)
  63058276800, #  local_start 1999-03-28 04:00:00 (Sun)
  63077025600, #    local_end 1999-10-31 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63077014800, #    utc_start 1999-10-31 01:00:00 (Sun)
  63089715600, #      utc_end 2000-03-26 01:00:00 (Sun)
  63077022000, #  local_start 1999-10-31 03:00:00 (Sun)
  63089722800, #    local_end 2000-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63089715600, #    utc_start 2000-03-26 01:00:00 (Sun)
  63108464400, #      utc_end 2000-10-29 01:00:00 (Sun)
  63089726400, #  local_start 2000-03-26 04:00:00 (Sun)
  63108475200, #    local_end 2000-10-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63108464400, #    utc_start 2000-10-29 01:00:00 (Sun)
  63121165200, #      utc_end 2001-03-25 01:00:00 (Sun)
  63108471600, #  local_start 2000-10-29 03:00:00 (Sun)
  63121172400, #    local_end 2001-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63121165200, #    utc_start 2001-03-25 01:00:00 (Sun)
  63139914000, #      utc_end 2001-10-28 01:00:00 (Sun)
  63121176000, #  local_start 2001-03-25 04:00:00 (Sun)
  63139924800, #    local_end 2001-10-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63139914000, #    utc_start 2001-10-28 01:00:00 (Sun)
  63153219600, #      utc_end 2002-03-31 01:00:00 (Sun)
  63139921200, #  local_start 2001-10-28 03:00:00 (Sun)
  63153226800, #    local_end 2002-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63153219600, #    utc_start 2002-03-31 01:00:00 (Sun)
  63171363600, #      utc_end 2002-10-27 01:00:00 (Sun)
  63153230400, #  local_start 2002-03-31 04:00:00 (Sun)
  63171374400, #    local_end 2002-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63171363600, #    utc_start 2002-10-27 01:00:00 (Sun)
  63184669200, #      utc_end 2003-03-30 01:00:00 (Sun)
  63171370800, #  local_start 2002-10-27 03:00:00 (Sun)
  63184676400, #    local_end 2003-03-30 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63184669200, #    utc_start 2003-03-30 01:00:00 (Sun)
  63202813200, #      utc_end 2003-10-26 01:00:00 (Sun)
  63184680000, #  local_start 2003-03-30 04:00:00 (Sun)
  63202824000, #    local_end 2003-10-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63202813200, #    utc_start 2003-10-26 01:00:00 (Sun)
  63216118800, #      utc_end 2004-03-28 01:00:00 (Sun)
  63202820400, #  local_start 2003-10-26 03:00:00 (Sun)
  63216126000, #    local_end 2004-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63216118800, #    utc_start 2004-03-28 01:00:00 (Sun)
  63234867600, #      utc_end 2004-10-31 01:00:00 (Sun)
  63216129600, #  local_start 2004-03-28 04:00:00 (Sun)
  63234878400, #    local_end 2004-10-31 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63234867600, #    utc_start 2004-10-31 01:00:00 (Sun)
  63247568400, #      utc_end 2005-03-27 01:00:00 (Sun)
  63234874800, #  local_start 2004-10-31 03:00:00 (Sun)
  63247575600, #    local_end 2005-03-27 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63247568400, #    utc_start 2005-03-27 01:00:00 (Sun)
  63266317200, #      utc_end 2005-10-30 01:00:00 (Sun)
  63247579200, #  local_start 2005-03-27 04:00:00 (Sun)
  63266328000, #    local_end 2005-10-30 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63266317200, #    utc_start 2005-10-30 01:00:00 (Sun)
  63279018000, #      utc_end 2006-03-26 01:00:00 (Sun)
  63266324400, #  local_start 2005-10-30 03:00:00 (Sun)
  63279025200, #    local_end 2006-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63279018000, #    utc_start 2006-03-26 01:00:00 (Sun)
  63297766800, #      utc_end 2006-10-29 01:00:00 (Sun)
  63279028800, #  local_start 2006-03-26 04:00:00 (Sun)
  63297777600, #    local_end 2006-10-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63297766800, #    utc_start 2006-10-29 01:00:00 (Sun)
  63310467600, #      utc_end 2007-03-25 01:00:00 (Sun)
  63297774000, #  local_start 2006-10-29 03:00:00 (Sun)
  63310474800, #    local_end 2007-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63310467600, #    utc_start 2007-03-25 01:00:00 (Sun)
  63329216400, #      utc_end 2007-10-28 01:00:00 (Sun)
  63310478400, #  local_start 2007-03-25 04:00:00 (Sun)
  63329227200, #    local_end 2007-10-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63329216400, #    utc_start 2007-10-28 01:00:00 (Sun)
  63342522000, #      utc_end 2008-03-30 01:00:00 (Sun)
  63329223600, #  local_start 2007-10-28 03:00:00 (Sun)
  63342529200, #    local_end 2008-03-30 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63342522000, #    utc_start 2008-03-30 01:00:00 (Sun)
  63360666000, #      utc_end 2008-10-26 01:00:00 (Sun)
  63342532800, #  local_start 2008-03-30 04:00:00 (Sun)
  63360676800, #    local_end 2008-10-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63360666000, #    utc_start 2008-10-26 01:00:00 (Sun)
  63373971600, #      utc_end 2009-03-29 01:00:00 (Sun)
  63360673200, #  local_start 2008-10-26 03:00:00 (Sun)
  63373978800, #    local_end 2009-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63373971600, #    utc_start 2009-03-29 01:00:00 (Sun)
  63392115600, #      utc_end 2009-10-25 01:00:00 (Sun)
  63373982400, #  local_start 2009-03-29 04:00:00 (Sun)
  63392126400, #    local_end 2009-10-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63392115600, #    utc_start 2009-10-25 01:00:00 (Sun)
  63405421200, #      utc_end 2010-03-28 01:00:00 (Sun)
  63392122800, #  local_start 2009-10-25 03:00:00 (Sun)
  63405428400, #    local_end 2010-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63405421200, #    utc_start 2010-03-28 01:00:00 (Sun)
  63424170000, #      utc_end 2010-10-31 01:00:00 (Sun)
  63405432000, #  local_start 2010-03-28 04:00:00 (Sun)
  63424180800, #    local_end 2010-10-31 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63424170000, #    utc_start 2010-10-31 01:00:00 (Sun)
  63436870800, #      utc_end 2011-03-27 01:00:00 (Sun)
  63424177200, #  local_start 2010-10-31 03:00:00 (Sun)
  63436878000, #    local_end 2011-03-27 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63436870800, #    utc_start 2011-03-27 01:00:00 (Sun)
  63455619600, #      utc_end 2011-10-30 01:00:00 (Sun)
  63436881600, #  local_start 2011-03-27 04:00:00 (Sun)
  63455630400, #    local_end 2011-10-30 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63455619600, #    utc_start 2011-10-30 01:00:00 (Sun)
  63468320400, #      utc_end 2012-03-25 01:00:00 (Sun)
  63455626800, #  local_start 2011-10-30 03:00:00 (Sun)
  63468327600, #    local_end 2012-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63468320400, #    utc_start 2012-03-25 01:00:00 (Sun)
  63487069200, #      utc_end 2012-10-28 01:00:00 (Sun)
  63468331200, #  local_start 2012-03-25 04:00:00 (Sun)
  63487080000, #    local_end 2012-10-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63487069200, #    utc_start 2012-10-28 01:00:00 (Sun)
  63500374800, #      utc_end 2013-03-31 01:00:00 (Sun)
  63487076400, #  local_start 2012-10-28 03:00:00 (Sun)
  63500382000, #    local_end 2013-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63500374800, #    utc_start 2013-03-31 01:00:00 (Sun)
  63518518800, #      utc_end 2013-10-27 01:00:00 (Sun)
  63500385600, #  local_start 2013-03-31 04:00:00 (Sun)
  63518529600, #    local_end 2013-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63518518800, #    utc_start 2013-10-27 01:00:00 (Sun)
  63531824400, #      utc_end 2014-03-30 01:00:00 (Sun)
  63518526000, #  local_start 2013-10-27 03:00:00 (Sun)
  63531831600, #    local_end 2014-03-30 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63531824400, #    utc_start 2014-03-30 01:00:00 (Sun)
  63549968400, #      utc_end 2014-10-26 01:00:00 (Sun)
  63531835200, #  local_start 2014-03-30 04:00:00 (Sun)
  63549979200, #    local_end 2014-10-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63549968400, #    utc_start 2014-10-26 01:00:00 (Sun)
  63563274000, #      utc_end 2015-03-29 01:00:00 (Sun)
  63549975600, #  local_start 2014-10-26 03:00:00 (Sun)
  63563281200, #    local_end 2015-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63563274000, #    utc_start 2015-03-29 01:00:00 (Sun)
  63581418000, #      utc_end 2015-10-25 01:00:00 (Sun)
  63563284800, #  local_start 2015-03-29 04:00:00 (Sun)
  63581428800, #    local_end 2015-10-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63581418000, #    utc_start 2015-10-25 01:00:00 (Sun)
  63594723600, #      utc_end 2016-03-27 01:00:00 (Sun)
  63581425200, #  local_start 2015-10-25 03:00:00 (Sun)
  63594730800, #    local_end 2016-03-27 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63594723600, #    utc_start 2016-03-27 01:00:00 (Sun)
  63613472400, #      utc_end 2016-10-30 01:00:00 (Sun)
  63594734400, #  local_start 2016-03-27 04:00:00 (Sun)
  63613483200, #    local_end 2016-10-30 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63613472400, #    utc_start 2016-10-30 01:00:00 (Sun)
  63626173200, #      utc_end 2017-03-26 01:00:00 (Sun)
  63613479600, #  local_start 2016-10-30 03:00:00 (Sun)
  63626180400, #    local_end 2017-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63626173200, #    utc_start 2017-03-26 01:00:00 (Sun)
  63644922000, #      utc_end 2017-10-29 01:00:00 (Sun)
  63626184000, #  local_start 2017-03-26 04:00:00 (Sun)
  63644932800, #    local_end 2017-10-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63644922000, #    utc_start 2017-10-29 01:00:00 (Sun)
  63657622800, #      utc_end 2018-03-25 01:00:00 (Sun)
  63644929200, #  local_start 2017-10-29 03:00:00 (Sun)
  63657630000, #    local_end 2018-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63657622800, #    utc_start 2018-03-25 01:00:00 (Sun)
  63676371600, #      utc_end 2018-10-28 01:00:00 (Sun)
  63657633600, #  local_start 2018-03-25 04:00:00 (Sun)
  63676382400, #    local_end 2018-10-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63676371600, #    utc_start 2018-10-28 01:00:00 (Sun)
  63689677200, #      utc_end 2019-03-31 01:00:00 (Sun)
  63676378800, #  local_start 2018-10-28 03:00:00 (Sun)
  63689684400, #    local_end 2019-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63689677200, #    utc_start 2019-03-31 01:00:00 (Sun)
  63707821200, #      utc_end 2019-10-27 01:00:00 (Sun)
  63689688000, #  local_start 2019-03-31 04:00:00 (Sun)
  63707832000, #    local_end 2019-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63707821200, #    utc_start 2019-10-27 01:00:00 (Sun)
  63721126800, #      utc_end 2020-03-29 01:00:00 (Sun)
  63707828400, #  local_start 2019-10-27 03:00:00 (Sun)
  63721134000, #    local_end 2020-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63721126800, #    utc_start 2020-03-29 01:00:00 (Sun)
  63739270800, #      utc_end 2020-10-25 01:00:00 (Sun)
  63721137600, #  local_start 2020-03-29 04:00:00 (Sun)
  63739281600, #    local_end 2020-10-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63739270800, #    utc_start 2020-10-25 01:00:00 (Sun)
  63752576400, #      utc_end 2021-03-28 01:00:00 (Sun)
  63739278000, #  local_start 2020-10-25 03:00:00 (Sun)
  63752583600, #    local_end 2021-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63752576400, #    utc_start 2021-03-28 01:00:00 (Sun)
  63771325200, #      utc_end 2021-10-31 01:00:00 (Sun)
  63752587200, #  local_start 2021-03-28 04:00:00 (Sun)
  63771336000, #    local_end 2021-10-31 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63771325200, #    utc_start 2021-10-31 01:00:00 (Sun)
  63784026000, #      utc_end 2022-03-27 01:00:00 (Sun)
  63771332400, #  local_start 2021-10-31 03:00:00 (Sun)
  63784033200, #    local_end 2022-03-27 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63784026000, #    utc_start 2022-03-27 01:00:00 (Sun)
  63802774800, #      utc_end 2022-10-30 01:00:00 (Sun)
  63784036800, #  local_start 2022-03-27 04:00:00 (Sun)
  63802785600, #    local_end 2022-10-30 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63802774800, #    utc_start 2022-10-30 01:00:00 (Sun)
  63815475600, #      utc_end 2023-03-26 01:00:00 (Sun)
  63802782000, #  local_start 2022-10-30 03:00:00 (Sun)
  63815482800, #    local_end 2023-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63815475600, #    utc_start 2023-03-26 01:00:00 (Sun)
  63834224400, #      utc_end 2023-10-29 01:00:00 (Sun)
  63815486400, #  local_start 2023-03-26 04:00:00 (Sun)
  63834235200, #    local_end 2023-10-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63834224400, #    utc_start 2023-10-29 01:00:00 (Sun)
  63847530000, #      utc_end 2024-03-31 01:00:00 (Sun)
  63834231600, #  local_start 2023-10-29 03:00:00 (Sun)
  63847537200, #    local_end 2024-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63847530000, #    utc_start 2024-03-31 01:00:00 (Sun)
  63865674000, #      utc_end 2024-10-27 01:00:00 (Sun)
  63847540800, #  local_start 2024-03-31 04:00:00 (Sun)
  63865684800, #    local_end 2024-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63865674000, #    utc_start 2024-10-27 01:00:00 (Sun)
  63878979600, #      utc_end 2025-03-30 01:00:00 (Sun)
  63865681200, #  local_start 2024-10-27 03:00:00 (Sun)
  63878986800, #    local_end 2025-03-30 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63878979600, #    utc_start 2025-03-30 01:00:00 (Sun)
  63897123600, #      utc_end 2025-10-26 01:00:00 (Sun)
  63878990400, #  local_start 2025-03-30 04:00:00 (Sun)
  63897134400, #    local_end 2025-10-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63897123600, #    utc_start 2025-10-26 01:00:00 (Sun)
  63910429200, #      utc_end 2026-03-29 01:00:00 (Sun)
  63897130800, #  local_start 2025-10-26 03:00:00 (Sun)
  63910436400, #    local_end 2026-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63910429200, #    utc_start 2026-03-29 01:00:00 (Sun)
  63928573200, #      utc_end 2026-10-25 01:00:00 (Sun)
  63910440000, #  local_start 2026-03-29 04:00:00 (Sun)
  63928584000, #    local_end 2026-10-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63928573200, #    utc_start 2026-10-25 01:00:00 (Sun)
  63941878800, #      utc_end 2027-03-28 01:00:00 (Sun)
  63928580400, #  local_start 2026-10-25 03:00:00 (Sun)
  63941886000, #    local_end 2027-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63941878800, #    utc_start 2027-03-28 01:00:00 (Sun)
  63960627600, #      utc_end 2027-10-31 01:00:00 (Sun)
  63941889600, #  local_start 2027-03-28 04:00:00 (Sun)
  63960638400, #    local_end 2027-10-31 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63960627600, #    utc_start 2027-10-31 01:00:00 (Sun)
  63973328400, #      utc_end 2028-03-26 01:00:00 (Sun)
  63960634800, #  local_start 2027-10-31 03:00:00 (Sun)
  63973335600, #    local_end 2028-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63973328400, #    utc_start 2028-03-26 01:00:00 (Sun)
  63992077200, #      utc_end 2028-10-29 01:00:00 (Sun)
  63973339200, #  local_start 2028-03-26 04:00:00 (Sun)
  63992088000, #    local_end 2028-10-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63992077200, #    utc_start 2028-10-29 01:00:00 (Sun)
  64004778000, #      utc_end 2029-03-25 01:00:00 (Sun)
  63992084400, #  local_start 2028-10-29 03:00:00 (Sun)
  64004785200, #    local_end 2029-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  64004778000, #    utc_start 2029-03-25 01:00:00 (Sun)
  64023526800, #      utc_end 2029-10-28 01:00:00 (Sun)
  64004788800, #  local_start 2029-03-25 04:00:00 (Sun)
  64023537600, #    local_end 2029-10-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  64023526800, #    utc_start 2029-10-28 01:00:00 (Sun)
  64036832400, #      utc_end 2030-03-31 01:00:00 (Sun)
  64023534000, #  local_start 2029-10-28 03:00:00 (Sun)
  64036839600, #    local_end 2030-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  64036832400, #    utc_start 2030-03-31 01:00:00 (Sun)
  64054976400, #      utc_end 2030-10-27 01:00:00 (Sun)
  64036843200, #  local_start 2030-03-31 04:00:00 (Sun)
  64054987200, #    local_end 2030-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {54}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { 7200 }
  
  my $last_observance = bless( {
    'format' => 'EE%sT',
    'gmtoff' => '2:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 729025,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 729025,
      'utc_rd_secs' => 0,
      'utc_year' => 1998
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => 7200,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 729024,
      'local_rd_secs' => 79200,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 729024,
      'utc_rd_secs' => 79200,
      'utc_year' => 1997
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '1:00u',
      'from' => '1981',
      'in' => 'Mar',
      'letter' => 'S',
      'name' => 'EU',
      'offset_from_std' => 3600,
      'on' => 'lastSun',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '1:00u',
      'from' => '1996',
      'in' => 'Oct',
      'letter' => '',
      'name' => 'EU',
      'offset_from_std' => 0,
      'on' => 'lastSun',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_EUROPE_SOFIA

    $main::fatpacked{"DateTime/TimeZone/Europe/Stockholm.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_EUROPE_STOCKHOLM';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Europe::Stockholm;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Europe::Stockholm::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59264002068, #      utc_end 1878-12-31 22:47:48 (Tue)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59264006400, #    local_end 1879-01-01 00:00:00 (Wed)
  4332,
  0,
  'LMT',
      ],
      [
  59264002068, #    utc_start 1878-12-31 22:47:48 (Tue)
  59926690786, #      utc_end 1899-12-31 22:59:46 (Sun)
  59264005682, #  local_start 1878-12-31 23:48:02 (Tue)
  59926694400, #    local_end 1900-01-01 00:00:00 (Mon)
  3614,
  0,
  'SET',
      ],
      [
  59926690786, #    utc_start 1899-12-31 22:59:46 (Sun)
  60443186400, #      utc_end 1916-05-14 22:00:00 (Sun)
  59926694386, #  local_start 1899-12-31 23:59:46 (Sun)
  60443190000, #    local_end 1916-05-14 23:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  60443186400, #    utc_start 1916-05-14 22:00:00 (Sun)
  60455199600, #      utc_end 1916-09-30 23:00:00 (Sat)
  60443193600, #  local_start 1916-05-15 00:00:00 (Mon)
  60455206800, #    local_end 1916-10-01 01:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  60455199600, #    utc_start 1916-09-30 23:00:00 (Sat)
  62451212400, #      utc_end 1979-12-31 23:00:00 (Mon)
  60455203200, #  local_start 1916-10-01 00:00:00 (Sun)
  62451216000, #    local_end 1980-01-01 00:00:00 (Tue)
  3600,
  0,
  'CET',
      ],
      [
  62451212400, #    utc_start 1979-12-31 23:00:00 (Mon)
  62459514000, #      utc_end 1980-04-06 01:00:00 (Sun)
  62451216000, #  local_start 1980-01-01 00:00:00 (Tue)
  62459517600, #    local_end 1980-04-06 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62459514000, #    utc_start 1980-04-06 01:00:00 (Sun)
  62474634000, #      utc_end 1980-09-28 01:00:00 (Sun)
  62459521200, #  local_start 1980-04-06 03:00:00 (Sun)
  62474641200, #    local_end 1980-09-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62474634000, #    utc_start 1980-09-28 01:00:00 (Sun)
  62490358800, #      utc_end 1981-03-29 01:00:00 (Sun)
  62474637600, #  local_start 1980-09-28 02:00:00 (Sun)
  62490362400, #    local_end 1981-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62490358800, #    utc_start 1981-03-29 01:00:00 (Sun)
  62506083600, #      utc_end 1981-09-27 01:00:00 (Sun)
  62490366000, #  local_start 1981-03-29 03:00:00 (Sun)
  62506090800, #    local_end 1981-09-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62506083600, #    utc_start 1981-09-27 01:00:00 (Sun)
  62521808400, #      utc_end 1982-03-28 01:00:00 (Sun)
  62506087200, #  local_start 1981-09-27 02:00:00 (Sun)
  62521812000, #    local_end 1982-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62521808400, #    utc_start 1982-03-28 01:00:00 (Sun)
  62537533200, #      utc_end 1982-09-26 01:00:00 (Sun)
  62521815600, #  local_start 1982-03-28 03:00:00 (Sun)
  62537540400, #    local_end 1982-09-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62537533200, #    utc_start 1982-09-26 01:00:00 (Sun)
  62553258000, #      utc_end 1983-03-27 01:00:00 (Sun)
  62537536800, #  local_start 1982-09-26 02:00:00 (Sun)
  62553261600, #    local_end 1983-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62553258000, #    utc_start 1983-03-27 01:00:00 (Sun)
  62568982800, #      utc_end 1983-09-25 01:00:00 (Sun)
  62553265200, #  local_start 1983-03-27 03:00:00 (Sun)
  62568990000, #    local_end 1983-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62568982800, #    utc_start 1983-09-25 01:00:00 (Sun)
  62584707600, #      utc_end 1984-03-25 01:00:00 (Sun)
  62568986400, #  local_start 1983-09-25 02:00:00 (Sun)
  62584711200, #    local_end 1984-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62584707600, #    utc_start 1984-03-25 01:00:00 (Sun)
  62601037200, #      utc_end 1984-09-30 01:00:00 (Sun)
  62584714800, #  local_start 1984-03-25 03:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62601037200, #    utc_start 1984-09-30 01:00:00 (Sun)
  62616762000, #      utc_end 1985-03-31 01:00:00 (Sun)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62616762000, #    utc_start 1985-03-31 01:00:00 (Sun)
  62632486800, #      utc_end 1985-09-29 01:00:00 (Sun)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62632486800, #    utc_start 1985-09-29 01:00:00 (Sun)
  62648211600, #      utc_end 1986-03-30 01:00:00 (Sun)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62648211600, #    utc_start 1986-03-30 01:00:00 (Sun)
  62663936400, #      utc_end 1986-09-28 01:00:00 (Sun)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62663936400, #    utc_start 1986-09-28 01:00:00 (Sun)
  62679661200, #      utc_end 1987-03-29 01:00:00 (Sun)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62679661200, #    utc_start 1987-03-29 01:00:00 (Sun)
  62695386000, #      utc_end 1987-09-27 01:00:00 (Sun)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62695386000, #    utc_start 1987-09-27 01:00:00 (Sun)
  62711110800, #      utc_end 1988-03-27 01:00:00 (Sun)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62711110800, #    utc_start 1988-03-27 01:00:00 (Sun)
  62726835600, #      utc_end 1988-09-25 01:00:00 (Sun)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62726835600, #    utc_start 1988-09-25 01:00:00 (Sun)
  62742560400, #      utc_end 1989-03-26 01:00:00 (Sun)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62742560400, #    utc_start 1989-03-26 01:00:00 (Sun)
  62758285200, #      utc_end 1989-09-24 01:00:00 (Sun)
  62742567600, #  local_start 1989-03-26 03:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62758285200, #    utc_start 1989-09-24 01:00:00 (Sun)
  62774010000, #      utc_end 1990-03-25 01:00:00 (Sun)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62774010000, #    utc_start 1990-03-25 01:00:00 (Sun)
  62790339600, #      utc_end 1990-09-30 01:00:00 (Sun)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62790339600, #    utc_start 1990-09-30 01:00:00 (Sun)
  62806064400, #      utc_end 1991-03-31 01:00:00 (Sun)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62806064400, #    utc_start 1991-03-31 01:00:00 (Sun)
  62821789200, #      utc_end 1991-09-29 01:00:00 (Sun)
  62806071600, #  local_start 1991-03-31 03:00:00 (Sun)
  62821796400, #    local_end 1991-09-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62821789200, #    utc_start 1991-09-29 01:00:00 (Sun)
  62837514000, #      utc_end 1992-03-29 01:00:00 (Sun)
  62821792800, #  local_start 1991-09-29 02:00:00 (Sun)
  62837517600, #    local_end 1992-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62837514000, #    utc_start 1992-03-29 01:00:00 (Sun)
  62853238800, #      utc_end 1992-09-27 01:00:00 (Sun)
  62837521200, #  local_start 1992-03-29 03:00:00 (Sun)
  62853246000, #    local_end 1992-09-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62853238800, #    utc_start 1992-09-27 01:00:00 (Sun)
  62868963600, #      utc_end 1993-03-28 01:00:00 (Sun)
  62853242400, #  local_start 1992-09-27 02:00:00 (Sun)
  62868967200, #    local_end 1993-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62868963600, #    utc_start 1993-03-28 01:00:00 (Sun)
  62884688400, #      utc_end 1993-09-26 01:00:00 (Sun)
  62868970800, #  local_start 1993-03-28 03:00:00 (Sun)
  62884695600, #    local_end 1993-09-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62884688400, #    utc_start 1993-09-26 01:00:00 (Sun)
  62900413200, #      utc_end 1994-03-27 01:00:00 (Sun)
  62884692000, #  local_start 1993-09-26 02:00:00 (Sun)
  62900416800, #    local_end 1994-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62900413200, #    utc_start 1994-03-27 01:00:00 (Sun)
  62916138000, #      utc_end 1994-09-25 01:00:00 (Sun)
  62900420400, #  local_start 1994-03-27 03:00:00 (Sun)
  62916145200, #    local_end 1994-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62916138000, #    utc_start 1994-09-25 01:00:00 (Sun)
  62931862800, #      utc_end 1995-03-26 01:00:00 (Sun)
  62916141600, #  local_start 1994-09-25 02:00:00 (Sun)
  62931866400, #    local_end 1995-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62931862800, #    utc_start 1995-03-26 01:00:00 (Sun)
  62947587600, #      utc_end 1995-09-24 01:00:00 (Sun)
  62931870000, #  local_start 1995-03-26 03:00:00 (Sun)
  62947594800, #    local_end 1995-09-24 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62947587600, #    utc_start 1995-09-24 01:00:00 (Sun)
  62963917200, #      utc_end 1996-03-31 01:00:00 (Sun)
  62947591200, #  local_start 1995-09-24 02:00:00 (Sun)
  62963920800, #    local_end 1996-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62963917200, #    utc_start 1996-03-31 01:00:00 (Sun)
  62982061200, #      utc_end 1996-10-27 01:00:00 (Sun)
  62963924400, #  local_start 1996-03-31 03:00:00 (Sun)
  62982068400, #    local_end 1996-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62982061200, #    utc_start 1996-10-27 01:00:00 (Sun)
  62995366800, #      utc_end 1997-03-30 01:00:00 (Sun)
  62982064800, #  local_start 1996-10-27 02:00:00 (Sun)
  62995370400, #    local_end 1997-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62995366800, #    utc_start 1997-03-30 01:00:00 (Sun)
  63013510800, #      utc_end 1997-10-26 01:00:00 (Sun)
  62995374000, #  local_start 1997-03-30 03:00:00 (Sun)
  63013518000, #    local_end 1997-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63013510800, #    utc_start 1997-10-26 01:00:00 (Sun)
  63026816400, #      utc_end 1998-03-29 01:00:00 (Sun)
  63013514400, #  local_start 1997-10-26 02:00:00 (Sun)
  63026820000, #    local_end 1998-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63026816400, #    utc_start 1998-03-29 01:00:00 (Sun)
  63044960400, #      utc_end 1998-10-25 01:00:00 (Sun)
  63026823600, #  local_start 1998-03-29 03:00:00 (Sun)
  63044967600, #    local_end 1998-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63044960400, #    utc_start 1998-10-25 01:00:00 (Sun)
  63058266000, #      utc_end 1999-03-28 01:00:00 (Sun)
  63044964000, #  local_start 1998-10-25 02:00:00 (Sun)
  63058269600, #    local_end 1999-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63058266000, #    utc_start 1999-03-28 01:00:00 (Sun)
  63077014800, #      utc_end 1999-10-31 01:00:00 (Sun)
  63058273200, #  local_start 1999-03-28 03:00:00 (Sun)
  63077022000, #    local_end 1999-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63077014800, #    utc_start 1999-10-31 01:00:00 (Sun)
  63089715600, #      utc_end 2000-03-26 01:00:00 (Sun)
  63077018400, #  local_start 1999-10-31 02:00:00 (Sun)
  63089719200, #    local_end 2000-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63089715600, #    utc_start 2000-03-26 01:00:00 (Sun)
  63108464400, #      utc_end 2000-10-29 01:00:00 (Sun)
  63089722800, #  local_start 2000-03-26 03:00:00 (Sun)
  63108471600, #    local_end 2000-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63108464400, #    utc_start 2000-10-29 01:00:00 (Sun)
  63121165200, #      utc_end 2001-03-25 01:00:00 (Sun)
  63108468000, #  local_start 2000-10-29 02:00:00 (Sun)
  63121168800, #    local_end 2001-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63121165200, #    utc_start 2001-03-25 01:00:00 (Sun)
  63139914000, #      utc_end 2001-10-28 01:00:00 (Sun)
  63121172400, #  local_start 2001-03-25 03:00:00 (Sun)
  63139921200, #    local_end 2001-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63139914000, #    utc_start 2001-10-28 01:00:00 (Sun)
  63153219600, #      utc_end 2002-03-31 01:00:00 (Sun)
  63139917600, #  local_start 2001-10-28 02:00:00 (Sun)
  63153223200, #    local_end 2002-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63153219600, #    utc_start 2002-03-31 01:00:00 (Sun)
  63171363600, #      utc_end 2002-10-27 01:00:00 (Sun)
  63153226800, #  local_start 2002-03-31 03:00:00 (Sun)
  63171370800, #    local_end 2002-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63171363600, #    utc_start 2002-10-27 01:00:00 (Sun)
  63184669200, #      utc_end 2003-03-30 01:00:00 (Sun)
  63171367200, #  local_start 2002-10-27 02:00:00 (Sun)
  63184672800, #    local_end 2003-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63184669200, #    utc_start 2003-03-30 01:00:00 (Sun)
  63202813200, #      utc_end 2003-10-26 01:00:00 (Sun)
  63184676400, #  local_start 2003-03-30 03:00:00 (Sun)
  63202820400, #    local_end 2003-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63202813200, #    utc_start 2003-10-26 01:00:00 (Sun)
  63216118800, #      utc_end 2004-03-28 01:00:00 (Sun)
  63202816800, #  local_start 2003-10-26 02:00:00 (Sun)
  63216122400, #    local_end 2004-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63216118800, #    utc_start 2004-03-28 01:00:00 (Sun)
  63234867600, #      utc_end 2004-10-31 01:00:00 (Sun)
  63216126000, #  local_start 2004-03-28 03:00:00 (Sun)
  63234874800, #    local_end 2004-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63234867600, #    utc_start 2004-10-31 01:00:00 (Sun)
  63247568400, #      utc_end 2005-03-27 01:00:00 (Sun)
  63234871200, #  local_start 2004-10-31 02:00:00 (Sun)
  63247572000, #    local_end 2005-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63247568400, #    utc_start 2005-03-27 01:00:00 (Sun)
  63266317200, #      utc_end 2005-10-30 01:00:00 (Sun)
  63247575600, #  local_start 2005-03-27 03:00:00 (Sun)
  63266324400, #    local_end 2005-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63266317200, #    utc_start 2005-10-30 01:00:00 (Sun)
  63279018000, #      utc_end 2006-03-26 01:00:00 (Sun)
  63266320800, #  local_start 2005-10-30 02:00:00 (Sun)
  63279021600, #    local_end 2006-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63279018000, #    utc_start 2006-03-26 01:00:00 (Sun)
  63297766800, #      utc_end 2006-10-29 01:00:00 (Sun)
  63279025200, #  local_start 2006-03-26 03:00:00 (Sun)
  63297774000, #    local_end 2006-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63297766800, #    utc_start 2006-10-29 01:00:00 (Sun)
  63310467600, #      utc_end 2007-03-25 01:00:00 (Sun)
  63297770400, #  local_start 2006-10-29 02:00:00 (Sun)
  63310471200, #    local_end 2007-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63310467600, #    utc_start 2007-03-25 01:00:00 (Sun)
  63329216400, #      utc_end 2007-10-28 01:00:00 (Sun)
  63310474800, #  local_start 2007-03-25 03:00:00 (Sun)
  63329223600, #    local_end 2007-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63329216400, #    utc_start 2007-10-28 01:00:00 (Sun)
  63342522000, #      utc_end 2008-03-30 01:00:00 (Sun)
  63329220000, #  local_start 2007-10-28 02:00:00 (Sun)
  63342525600, #    local_end 2008-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63342522000, #    utc_start 2008-03-30 01:00:00 (Sun)
  63360666000, #      utc_end 2008-10-26 01:00:00 (Sun)
  63342529200, #  local_start 2008-03-30 03:00:00 (Sun)
  63360673200, #    local_end 2008-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63360666000, #    utc_start 2008-10-26 01:00:00 (Sun)
  63373971600, #      utc_end 2009-03-29 01:00:00 (Sun)
  63360669600, #  local_start 2008-10-26 02:00:00 (Sun)
  63373975200, #    local_end 2009-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63373971600, #    utc_start 2009-03-29 01:00:00 (Sun)
  63392115600, #      utc_end 2009-10-25 01:00:00 (Sun)
  63373978800, #  local_start 2009-03-29 03:00:00 (Sun)
  63392122800, #    local_end 2009-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63392115600, #    utc_start 2009-10-25 01:00:00 (Sun)
  63405421200, #      utc_end 2010-03-28 01:00:00 (Sun)
  63392119200, #  local_start 2009-10-25 02:00:00 (Sun)
  63405424800, #    local_end 2010-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63405421200, #    utc_start 2010-03-28 01:00:00 (Sun)
  63424170000, #      utc_end 2010-10-31 01:00:00 (Sun)
  63405428400, #  local_start 2010-03-28 03:00:00 (Sun)
  63424177200, #    local_end 2010-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63424170000, #    utc_start 2010-10-31 01:00:00 (Sun)
  63436870800, #      utc_end 2011-03-27 01:00:00 (Sun)
  63424173600, #  local_start 2010-10-31 02:00:00 (Sun)
  63436874400, #    local_end 2011-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63436870800, #    utc_start 2011-03-27 01:00:00 (Sun)
  63455619600, #      utc_end 2011-10-30 01:00:00 (Sun)
  63436878000, #  local_start 2011-03-27 03:00:00 (Sun)
  63455626800, #    local_end 2011-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63455619600, #    utc_start 2011-10-30 01:00:00 (Sun)
  63468320400, #      utc_end 2012-03-25 01:00:00 (Sun)
  63455623200, #  local_start 2011-10-30 02:00:00 (Sun)
  63468324000, #    local_end 2012-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63468320400, #    utc_start 2012-03-25 01:00:00 (Sun)
  63487069200, #      utc_end 2012-10-28 01:00:00 (Sun)
  63468327600, #  local_start 2012-03-25 03:00:00 (Sun)
  63487076400, #    local_end 2012-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63487069200, #    utc_start 2012-10-28 01:00:00 (Sun)
  63500374800, #      utc_end 2013-03-31 01:00:00 (Sun)
  63487072800, #  local_start 2012-10-28 02:00:00 (Sun)
  63500378400, #    local_end 2013-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63500374800, #    utc_start 2013-03-31 01:00:00 (Sun)
  63518518800, #      utc_end 2013-10-27 01:00:00 (Sun)
  63500382000, #  local_start 2013-03-31 03:00:00 (Sun)
  63518526000, #    local_end 2013-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63518518800, #    utc_start 2013-10-27 01:00:00 (Sun)
  63531824400, #      utc_end 2014-03-30 01:00:00 (Sun)
  63518522400, #  local_start 2013-10-27 02:00:00 (Sun)
  63531828000, #    local_end 2014-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63531824400, #    utc_start 2014-03-30 01:00:00 (Sun)
  63549968400, #      utc_end 2014-10-26 01:00:00 (Sun)
  63531831600, #  local_start 2014-03-30 03:00:00 (Sun)
  63549975600, #    local_end 2014-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63549968400, #    utc_start 2014-10-26 01:00:00 (Sun)
  63563274000, #      utc_end 2015-03-29 01:00:00 (Sun)
  63549972000, #  local_start 2014-10-26 02:00:00 (Sun)
  63563277600, #    local_end 2015-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63563274000, #    utc_start 2015-03-29 01:00:00 (Sun)
  63581418000, #      utc_end 2015-10-25 01:00:00 (Sun)
  63563281200, #  local_start 2015-03-29 03:00:00 (Sun)
  63581425200, #    local_end 2015-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63581418000, #    utc_start 2015-10-25 01:00:00 (Sun)
  63594723600, #      utc_end 2016-03-27 01:00:00 (Sun)
  63581421600, #  local_start 2015-10-25 02:00:00 (Sun)
  63594727200, #    local_end 2016-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63594723600, #    utc_start 2016-03-27 01:00:00 (Sun)
  63613472400, #      utc_end 2016-10-30 01:00:00 (Sun)
  63594730800, #  local_start 2016-03-27 03:00:00 (Sun)
  63613479600, #    local_end 2016-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63613472400, #    utc_start 2016-10-30 01:00:00 (Sun)
  63626173200, #      utc_end 2017-03-26 01:00:00 (Sun)
  63613476000, #  local_start 2016-10-30 02:00:00 (Sun)
  63626176800, #    local_end 2017-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63626173200, #    utc_start 2017-03-26 01:00:00 (Sun)
  63644922000, #      utc_end 2017-10-29 01:00:00 (Sun)
  63626180400, #  local_start 2017-03-26 03:00:00 (Sun)
  63644929200, #    local_end 2017-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63644922000, #    utc_start 2017-10-29 01:00:00 (Sun)
  63657622800, #      utc_end 2018-03-25 01:00:00 (Sun)
  63644925600, #  local_start 2017-10-29 02:00:00 (Sun)
  63657626400, #    local_end 2018-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63657622800, #    utc_start 2018-03-25 01:00:00 (Sun)
  63676371600, #      utc_end 2018-10-28 01:00:00 (Sun)
  63657630000, #  local_start 2018-03-25 03:00:00 (Sun)
  63676378800, #    local_end 2018-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63676371600, #    utc_start 2018-10-28 01:00:00 (Sun)
  63689677200, #      utc_end 2019-03-31 01:00:00 (Sun)
  63676375200, #  local_start 2018-10-28 02:00:00 (Sun)
  63689680800, #    local_end 2019-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63689677200, #    utc_start 2019-03-31 01:00:00 (Sun)
  63707821200, #      utc_end 2019-10-27 01:00:00 (Sun)
  63689684400, #  local_start 2019-03-31 03:00:00 (Sun)
  63707828400, #    local_end 2019-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63707821200, #    utc_start 2019-10-27 01:00:00 (Sun)
  63721126800, #      utc_end 2020-03-29 01:00:00 (Sun)
  63707824800, #  local_start 2019-10-27 02:00:00 (Sun)
  63721130400, #    local_end 2020-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63721126800, #    utc_start 2020-03-29 01:00:00 (Sun)
  63739270800, #      utc_end 2020-10-25 01:00:00 (Sun)
  63721134000, #  local_start 2020-03-29 03:00:00 (Sun)
  63739278000, #    local_end 2020-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63739270800, #    utc_start 2020-10-25 01:00:00 (Sun)
  63752576400, #      utc_end 2021-03-28 01:00:00 (Sun)
  63739274400, #  local_start 2020-10-25 02:00:00 (Sun)
  63752580000, #    local_end 2021-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63752576400, #    utc_start 2021-03-28 01:00:00 (Sun)
  63771325200, #      utc_end 2021-10-31 01:00:00 (Sun)
  63752583600, #  local_start 2021-03-28 03:00:00 (Sun)
  63771332400, #    local_end 2021-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63771325200, #    utc_start 2021-10-31 01:00:00 (Sun)
  63784026000, #      utc_end 2022-03-27 01:00:00 (Sun)
  63771328800, #  local_start 2021-10-31 02:00:00 (Sun)
  63784029600, #    local_end 2022-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63784026000, #    utc_start 2022-03-27 01:00:00 (Sun)
  63802774800, #      utc_end 2022-10-30 01:00:00 (Sun)
  63784033200, #  local_start 2022-03-27 03:00:00 (Sun)
  63802782000, #    local_end 2022-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63802774800, #    utc_start 2022-10-30 01:00:00 (Sun)
  63815475600, #      utc_end 2023-03-26 01:00:00 (Sun)
  63802778400, #  local_start 2022-10-30 02:00:00 (Sun)
  63815479200, #    local_end 2023-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63815475600, #    utc_start 2023-03-26 01:00:00 (Sun)
  63834224400, #      utc_end 2023-10-29 01:00:00 (Sun)
  63815482800, #  local_start 2023-03-26 03:00:00 (Sun)
  63834231600, #    local_end 2023-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63834224400, #    utc_start 2023-10-29 01:00:00 (Sun)
  63847530000, #      utc_end 2024-03-31 01:00:00 (Sun)
  63834228000, #  local_start 2023-10-29 02:00:00 (Sun)
  63847533600, #    local_end 2024-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63847530000, #    utc_start 2024-03-31 01:00:00 (Sun)
  63865674000, #      utc_end 2024-10-27 01:00:00 (Sun)
  63847537200, #  local_start 2024-03-31 03:00:00 (Sun)
  63865681200, #    local_end 2024-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63865674000, #    utc_start 2024-10-27 01:00:00 (Sun)
  63878979600, #      utc_end 2025-03-30 01:00:00 (Sun)
  63865677600, #  local_start 2024-10-27 02:00:00 (Sun)
  63878983200, #    local_end 2025-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63878979600, #    utc_start 2025-03-30 01:00:00 (Sun)
  63897123600, #      utc_end 2025-10-26 01:00:00 (Sun)
  63878986800, #  local_start 2025-03-30 03:00:00 (Sun)
  63897130800, #    local_end 2025-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63897123600, #    utc_start 2025-10-26 01:00:00 (Sun)
  63910429200, #      utc_end 2026-03-29 01:00:00 (Sun)
  63897127200, #  local_start 2025-10-26 02:00:00 (Sun)
  63910432800, #    local_end 2026-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63910429200, #    utc_start 2026-03-29 01:00:00 (Sun)
  63928573200, #      utc_end 2026-10-25 01:00:00 (Sun)
  63910436400, #  local_start 2026-03-29 03:00:00 (Sun)
  63928580400, #    local_end 2026-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63928573200, #    utc_start 2026-10-25 01:00:00 (Sun)
  63941878800, #      utc_end 2027-03-28 01:00:00 (Sun)
  63928576800, #  local_start 2026-10-25 02:00:00 (Sun)
  63941882400, #    local_end 2027-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63941878800, #    utc_start 2027-03-28 01:00:00 (Sun)
  63960627600, #      utc_end 2027-10-31 01:00:00 (Sun)
  63941886000, #  local_start 2027-03-28 03:00:00 (Sun)
  63960634800, #    local_end 2027-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63960627600, #    utc_start 2027-10-31 01:00:00 (Sun)
  63973328400, #      utc_end 2028-03-26 01:00:00 (Sun)
  63960631200, #  local_start 2027-10-31 02:00:00 (Sun)
  63973332000, #    local_end 2028-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63973328400, #    utc_start 2028-03-26 01:00:00 (Sun)
  63992077200, #      utc_end 2028-10-29 01:00:00 (Sun)
  63973335600, #  local_start 2028-03-26 03:00:00 (Sun)
  63992084400, #    local_end 2028-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63992077200, #    utc_start 2028-10-29 01:00:00 (Sun)
  64004778000, #      utc_end 2029-03-25 01:00:00 (Sun)
  63992080800, #  local_start 2028-10-29 02:00:00 (Sun)
  64004781600, #    local_end 2029-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  64004778000, #    utc_start 2029-03-25 01:00:00 (Sun)
  64023526800, #      utc_end 2029-10-28 01:00:00 (Sun)
  64004785200, #  local_start 2029-03-25 03:00:00 (Sun)
  64023534000, #    local_end 2029-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  64023526800, #    utc_start 2029-10-28 01:00:00 (Sun)
  64036832400, #      utc_end 2030-03-31 01:00:00 (Sun)
  64023530400, #  local_start 2029-10-28 02:00:00 (Sun)
  64036836000, #    local_end 2030-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  64036832400, #    utc_start 2030-03-31 01:00:00 (Sun)
  64054976400, #      utc_end 2030-10-27 01:00:00 (Sun)
  64036839600, #  local_start 2030-03-31 03:00:00 (Sun)
  64054983600, #    local_end 2030-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {52}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { 3600 }
  
  my $last_observance = bless( {
    'format' => 'CE%sT',
    'gmtoff' => '1:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 722815,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 722815,
      'utc_rd_secs' => 0,
      'utc_year' => 1981
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => 3600,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 722814,
      'local_rd_secs' => 82800,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 722814,
      'utc_rd_secs' => 82800,
      'utc_year' => 1980
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '1:00u',
      'from' => '1981',
      'in' => 'Mar',
      'letter' => 'S',
      'name' => 'EU',
      'offset_from_std' => 3600,
      'on' => 'lastSun',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '1:00u',
      'from' => '1996',
      'in' => 'Oct',
      'letter' => '',
      'name' => 'EU',
      'offset_from_std' => 0,
      'on' => 'lastSun',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_EUROPE_STOCKHOLM

    $main::fatpacked{"DateTime/TimeZone/Europe/Tallinn.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_EUROPE_TALLINN';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Europe::Tallinn;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Europe::Tallinn::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59295536460, #      utc_end 1879-12-31 22:21:00 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59295542400, #    local_end 1880-01-01 00:00:00 (Thu)
  5940,
  0,
  'LMT',
      ],
      [
  59295536460, #    utc_start 1879-12-31 22:21:00 (Wed)
  60497360460, #      utc_end 1918-01-31 22:21:00 (Thu)
  59295542400, #  local_start 1880-01-01 00:00:00 (Thu)
  60497366400, #    local_end 1918-02-01 00:00:00 (Fri)
  5940,
  0,
  'TMT',
      ],
      [
  60497360460, #    utc_start 1918-01-31 22:21:00 (Thu)
  60503677200, #      utc_end 1918-04-15 01:00:00 (Mon)
  60497364060, #  local_start 1918-01-31 23:21:00 (Thu)
  60503680800, #    local_end 1918-04-15 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  60503677200, #    utc_start 1918-04-15 01:00:00 (Mon)
  60516982800, #      utc_end 1918-09-16 01:00:00 (Mon)
  60503684400, #  local_start 1918-04-15 03:00:00 (Mon)
  60516990000, #    local_end 1918-09-16 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  60516982800, #    utc_start 1918-09-16 01:00:00 (Mon)
  60541858800, #      utc_end 1919-06-30 23:00:00 (Mon)
  60516986400, #  local_start 1918-09-16 02:00:00 (Mon)
  60541862400, #    local_end 1919-07-01 00:00:00 (Tue)
  3600,
  0,
  'CET',
      ],
      [
  60541858800, #    utc_start 1919-06-30 23:00:00 (Mon)
  60599744460, #      utc_end 1921-04-30 22:21:00 (Sat)
  60541864740, #  local_start 1919-07-01 00:39:00 (Tue)
  60599750400, #    local_end 1921-05-01 00:00:00 (Sun)
  5940,
  0,
  'TMT',
      ],
      [
  60599744460, #    utc_start 1921-04-30 22:21:00 (Sat)
  61207740000, #      utc_end 1940-08-05 22:00:00 (Mon)
  60599751660, #  local_start 1921-05-01 00:21:00 (Sun)
  61207747200, #    local_end 1940-08-06 00:00:00 (Tue)
  7200,
  0,
  'EET',
      ],
      [
  61207740000, #    utc_start 1940-08-05 22:00:00 (Mon)
  61242728400, #      utc_end 1941-09-14 21:00:00 (Sun)
  61207750800, #  local_start 1940-08-06 01:00:00 (Tue)
  61242739200, #    local_end 1941-09-15 00:00:00 (Mon)
  10800,
  0,
  'MSK',
      ],
      [
  61242728400, #    utc_start 1941-09-14 21:00:00 (Sun)
  61278426000, #      utc_end 1942-11-02 01:00:00 (Mon)
  61242735600, #  local_start 1941-09-14 23:00:00 (Sun)
  61278433200, #    local_end 1942-11-02 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61278426000, #    utc_start 1942-11-02 01:00:00 (Mon)
  61291126800, #      utc_end 1943-03-29 01:00:00 (Mon)
  61278429600, #  local_start 1942-11-02 02:00:00 (Mon)
  61291130400, #    local_end 1943-03-29 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61291126800, #    utc_start 1943-03-29 01:00:00 (Mon)
  61307456400, #      utc_end 1943-10-04 01:00:00 (Mon)
  61291134000, #  local_start 1943-03-29 03:00:00 (Mon)
  61307463600, #    local_end 1943-10-04 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61307456400, #    utc_start 1943-10-04 01:00:00 (Mon)
  61323181200, #      utc_end 1944-04-03 01:00:00 (Mon)
  61307460000, #  local_start 1943-10-04 02:00:00 (Mon)
  61323184800, #    local_end 1944-04-03 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61323181200, #    utc_start 1944-04-03 01:00:00 (Mon)
  61338031200, #      utc_end 1944-09-21 22:00:00 (Thu)
  61323188400, #  local_start 1944-04-03 03:00:00 (Mon)
  61338038400, #    local_end 1944-09-22 00:00:00 (Fri)
  7200,
  1,
  'CEST',
      ],
      [
  61338031200, #    utc_start 1944-09-21 22:00:00 (Thu)
  62490603600, #      utc_end 1981-03-31 21:00:00 (Tue)
  61338042000, #  local_start 1944-09-22 01:00:00 (Fri)
  62490614400, #    local_end 1981-04-01 00:00:00 (Wed)
  10800,
  0,
  'MSK',
      ],
      [
  62490603600, #    utc_start 1981-03-31 21:00:00 (Tue)
  62506411200, #      utc_end 1981-09-30 20:00:00 (Wed)
  62490618000, #  local_start 1981-04-01 01:00:00 (Wed)
  62506425600, #    local_end 1981-10-01 00:00:00 (Thu)
  14400,
  1,
  'MSD',
      ],
      [
  62506411200, #    utc_start 1981-09-30 20:00:00 (Wed)
  62522139600, #      utc_end 1982-03-31 21:00:00 (Wed)
  62506422000, #  local_start 1981-09-30 23:00:00 (Wed)
  62522150400, #    local_end 1982-04-01 00:00:00 (Thu)
  10800,
  0,
  'MSK',
      ],
      [
  62522139600, #    utc_start 1982-03-31 21:00:00 (Wed)
  62537947200, #      utc_end 1982-09-30 20:00:00 (Thu)
  62522154000, #  local_start 1982-04-01 01:00:00 (Thu)
  62537961600, #    local_end 1982-10-01 00:00:00 (Fri)
  14400,
  1,
  'MSD',
      ],
      [
  62537947200, #    utc_start 1982-09-30 20:00:00 (Thu)
  62553675600, #      utc_end 1983-03-31 21:00:00 (Thu)
  62537958000, #  local_start 1982-09-30 23:00:00 (Thu)
  62553686400, #    local_end 1983-04-01 00:00:00 (Fri)
  10800,
  0,
  'MSK',
      ],
      [
  62553675600, #    utc_start 1983-03-31 21:00:00 (Thu)
  62569483200, #      utc_end 1983-09-30 20:00:00 (Fri)
  62553690000, #  local_start 1983-04-01 01:00:00 (Fri)
  62569497600, #    local_end 1983-10-01 00:00:00 (Sat)
  14400,
  1,
  'MSD',
      ],
      [
  62569483200, #    utc_start 1983-09-30 20:00:00 (Fri)
  62585298000, #      utc_end 1984-03-31 21:00:00 (Sat)
  62569494000, #  local_start 1983-09-30 23:00:00 (Fri)
  62585308800, #    local_end 1984-04-01 00:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62585298000, #    utc_start 1984-03-31 21:00:00 (Sat)
  62601030000, #      utc_end 1984-09-29 23:00:00 (Sat)
  62585312400, #  local_start 1984-04-01 01:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62601030000, #    utc_start 1984-09-29 23:00:00 (Sat)
  62616754800, #      utc_end 1985-03-30 23:00:00 (Sat)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62616754800, #    utc_start 1985-03-30 23:00:00 (Sat)
  62632479600, #      utc_end 1985-09-28 23:00:00 (Sat)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62632479600, #    utc_start 1985-09-28 23:00:00 (Sat)
  62648204400, #      utc_end 1986-03-29 23:00:00 (Sat)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62648204400, #    utc_start 1986-03-29 23:00:00 (Sat)
  62663929200, #      utc_end 1986-09-27 23:00:00 (Sat)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62663929200, #    utc_start 1986-09-27 23:00:00 (Sat)
  62679654000, #      utc_end 1987-03-28 23:00:00 (Sat)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62679654000, #    utc_start 1987-03-28 23:00:00 (Sat)
  62695378800, #      utc_end 1987-09-26 23:00:00 (Sat)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62695378800, #    utc_start 1987-09-26 23:00:00 (Sat)
  62711103600, #      utc_end 1988-03-26 23:00:00 (Sat)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62711103600, #    utc_start 1988-03-26 23:00:00 (Sat)
  62726828400, #      utc_end 1988-09-24 23:00:00 (Sat)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62726828400, #    utc_start 1988-09-24 23:00:00 (Sat)
  62742553200, #      utc_end 1989-03-25 23:00:00 (Sat)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62742553200, #    utc_start 1989-03-25 23:00:00 (Sat)
  62758281600, #      utc_end 1989-09-24 00:00:00 (Sun)
  62742564000, #  local_start 1989-03-26 02:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62758281600, #    utc_start 1989-09-24 00:00:00 (Sun)
  62774006400, #      utc_end 1990-03-25 00:00:00 (Sun)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62774006400, #    utc_start 1990-03-25 00:00:00 (Sun)
  62790336000, #      utc_end 1990-09-30 00:00:00 (Sun)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62790336000, #    utc_start 1990-09-30 00:00:00 (Sun)
  62806060800, #      utc_end 1991-03-31 00:00:00 (Sun)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62806060800, #    utc_start 1991-03-31 00:00:00 (Sun)
  62821785600, #      utc_end 1991-09-29 00:00:00 (Sun)
  62806071600, #  local_start 1991-03-31 03:00:00 (Sun)
  62821796400, #    local_end 1991-09-29 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62821785600, #    utc_start 1991-09-29 00:00:00 (Sun)
  62837510400, #      utc_end 1992-03-29 00:00:00 (Sun)
  62821792800, #  local_start 1991-09-29 02:00:00 (Sun)
  62837517600, #    local_end 1992-03-29 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62837510400, #    utc_start 1992-03-29 00:00:00 (Sun)
  62853235200, #      utc_end 1992-09-27 00:00:00 (Sun)
  62837521200, #  local_start 1992-03-29 03:00:00 (Sun)
  62853246000, #    local_end 1992-09-27 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62853235200, #    utc_start 1992-09-27 00:00:00 (Sun)
  62868960000, #      utc_end 1993-03-28 00:00:00 (Sun)
  62853242400, #  local_start 1992-09-27 02:00:00 (Sun)
  62868967200, #    local_end 1993-03-28 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62868960000, #    utc_start 1993-03-28 00:00:00 (Sun)
  62884684800, #      utc_end 1993-09-26 00:00:00 (Sun)
  62868970800, #  local_start 1993-03-28 03:00:00 (Sun)
  62884695600, #    local_end 1993-09-26 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62884684800, #    utc_start 1993-09-26 00:00:00 (Sun)
  62900409600, #      utc_end 1994-03-27 00:00:00 (Sun)
  62884692000, #  local_start 1993-09-26 02:00:00 (Sun)
  62900416800, #    local_end 1994-03-27 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62900409600, #    utc_start 1994-03-27 00:00:00 (Sun)
  62916134400, #      utc_end 1994-09-25 00:00:00 (Sun)
  62900420400, #  local_start 1994-03-27 03:00:00 (Sun)
  62916145200, #    local_end 1994-09-25 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62916134400, #    utc_start 1994-09-25 00:00:00 (Sun)
  62931859200, #      utc_end 1995-03-26 00:00:00 (Sun)
  62916141600, #  local_start 1994-09-25 02:00:00 (Sun)
  62931866400, #    local_end 1995-03-26 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62931859200, #    utc_start 1995-03-26 00:00:00 (Sun)
  62947584000, #      utc_end 1995-09-24 00:00:00 (Sun)
  62931870000, #  local_start 1995-03-26 03:00:00 (Sun)
  62947594800, #    local_end 1995-09-24 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62947584000, #    utc_start 1995-09-24 00:00:00 (Sun)
  62963913600, #      utc_end 1996-03-31 00:00:00 (Sun)
  62947591200, #  local_start 1995-09-24 02:00:00 (Sun)
  62963920800, #    local_end 1996-03-31 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62963913600, #    utc_start 1996-03-31 00:00:00 (Sun)
  62982057600, #      utc_end 1996-10-27 00:00:00 (Sun)
  62963924400, #  local_start 1996-03-31 03:00:00 (Sun)
  62982068400, #    local_end 1996-10-27 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62982057600, #    utc_start 1996-10-27 00:00:00 (Sun)
  62995363200, #      utc_end 1997-03-30 00:00:00 (Sun)
  62982064800, #  local_start 1996-10-27 02:00:00 (Sun)
  62995370400, #    local_end 1997-03-30 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62995363200, #    utc_start 1997-03-30 00:00:00 (Sun)
  63013507200, #      utc_end 1997-10-26 00:00:00 (Sun)
  62995374000, #  local_start 1997-03-30 03:00:00 (Sun)
  63013518000, #    local_end 1997-10-26 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63013507200, #    utc_start 1997-10-26 00:00:00 (Sun)
  63026812800, #      utc_end 1998-03-29 00:00:00 (Sun)
  63013514400, #  local_start 1997-10-26 02:00:00 (Sun)
  63026820000, #    local_end 1998-03-29 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63026812800, #    utc_start 1998-03-29 00:00:00 (Sun)
  63042094800, #      utc_end 1998-09-21 21:00:00 (Mon)
  63026823600, #  local_start 1998-03-29 03:00:00 (Sun)
  63042105600, #    local_end 1998-09-22 00:00:00 (Tue)
  10800,
  1,
  'EEST',
      ],
      [
  63042094800, #    utc_start 1998-09-21 21:00:00 (Mon)
  63044960400, #      utc_end 1998-10-25 01:00:00 (Sun)
  63042105600, #  local_start 1998-09-22 00:00:00 (Tue)
  63044971200, #    local_end 1998-10-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63044960400, #    utc_start 1998-10-25 01:00:00 (Sun)
  63058266000, #      utc_end 1999-03-28 01:00:00 (Sun)
  63044967600, #  local_start 1998-10-25 03:00:00 (Sun)
  63058273200, #    local_end 1999-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63058266000, #    utc_start 1999-03-28 01:00:00 (Sun)
  63077014800, #      utc_end 1999-10-31 01:00:00 (Sun)
  63058276800, #  local_start 1999-03-28 04:00:00 (Sun)
  63077025600, #    local_end 1999-10-31 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63077014800, #    utc_start 1999-10-31 01:00:00 (Sun)
  63149925600, #      utc_end 2002-02-20 22:00:00 (Wed)
  63077022000, #  local_start 1999-10-31 03:00:00 (Sun)
  63149932800, #    local_end 2002-02-21 00:00:00 (Thu)
  7200,
  0,
  'EET',
      ],
      [
  63149925600, #    utc_start 2002-02-20 22:00:00 (Wed)
  63153219600, #      utc_end 2002-03-31 01:00:00 (Sun)
  63149932800, #  local_start 2002-02-21 00:00:00 (Thu)
  63153226800, #    local_end 2002-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63153219600, #    utc_start 2002-03-31 01:00:00 (Sun)
  63171363600, #      utc_end 2002-10-27 01:00:00 (Sun)
  63153230400, #  local_start 2002-03-31 04:00:00 (Sun)
  63171374400, #    local_end 2002-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63171363600, #    utc_start 2002-10-27 01:00:00 (Sun)
  63184669200, #      utc_end 2003-03-30 01:00:00 (Sun)
  63171370800, #  local_start 2002-10-27 03:00:00 (Sun)
  63184676400, #    local_end 2003-03-30 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63184669200, #    utc_start 2003-03-30 01:00:00 (Sun)
  63202813200, #      utc_end 2003-10-26 01:00:00 (Sun)
  63184680000, #  local_start 2003-03-30 04:00:00 (Sun)
  63202824000, #    local_end 2003-10-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63202813200, #    utc_start 2003-10-26 01:00:00 (Sun)
  63216118800, #      utc_end 2004-03-28 01:00:00 (Sun)
  63202820400, #  local_start 2003-10-26 03:00:00 (Sun)
  63216126000, #    local_end 2004-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63216118800, #    utc_start 2004-03-28 01:00:00 (Sun)
  63234867600, #      utc_end 2004-10-31 01:00:00 (Sun)
  63216129600, #  local_start 2004-03-28 04:00:00 (Sun)
  63234878400, #    local_end 2004-10-31 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63234867600, #    utc_start 2004-10-31 01:00:00 (Sun)
  63247568400, #      utc_end 2005-03-27 01:00:00 (Sun)
  63234874800, #  local_start 2004-10-31 03:00:00 (Sun)
  63247575600, #    local_end 2005-03-27 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63247568400, #    utc_start 2005-03-27 01:00:00 (Sun)
  63266317200, #      utc_end 2005-10-30 01:00:00 (Sun)
  63247579200, #  local_start 2005-03-27 04:00:00 (Sun)
  63266328000, #    local_end 2005-10-30 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63266317200, #    utc_start 2005-10-30 01:00:00 (Sun)
  63279018000, #      utc_end 2006-03-26 01:00:00 (Sun)
  63266324400, #  local_start 2005-10-30 03:00:00 (Sun)
  63279025200, #    local_end 2006-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63279018000, #    utc_start 2006-03-26 01:00:00 (Sun)
  63297766800, #      utc_end 2006-10-29 01:00:00 (Sun)
  63279028800, #  local_start 2006-03-26 04:00:00 (Sun)
  63297777600, #    local_end 2006-10-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63297766800, #    utc_start 2006-10-29 01:00:00 (Sun)
  63310467600, #      utc_end 2007-03-25 01:00:00 (Sun)
  63297774000, #  local_start 2006-10-29 03:00:00 (Sun)
  63310474800, #    local_end 2007-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63310467600, #    utc_start 2007-03-25 01:00:00 (Sun)
  63329216400, #      utc_end 2007-10-28 01:00:00 (Sun)
  63310478400, #  local_start 2007-03-25 04:00:00 (Sun)
  63329227200, #    local_end 2007-10-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63329216400, #    utc_start 2007-10-28 01:00:00 (Sun)
  63342522000, #      utc_end 2008-03-30 01:00:00 (Sun)
  63329223600, #  local_start 2007-10-28 03:00:00 (Sun)
  63342529200, #    local_end 2008-03-30 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63342522000, #    utc_start 2008-03-30 01:00:00 (Sun)
  63360666000, #      utc_end 2008-10-26 01:00:00 (Sun)
  63342532800, #  local_start 2008-03-30 04:00:00 (Sun)
  63360676800, #    local_end 2008-10-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63360666000, #    utc_start 2008-10-26 01:00:00 (Sun)
  63373971600, #      utc_end 2009-03-29 01:00:00 (Sun)
  63360673200, #  local_start 2008-10-26 03:00:00 (Sun)
  63373978800, #    local_end 2009-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63373971600, #    utc_start 2009-03-29 01:00:00 (Sun)
  63392115600, #      utc_end 2009-10-25 01:00:00 (Sun)
  63373982400, #  local_start 2009-03-29 04:00:00 (Sun)
  63392126400, #    local_end 2009-10-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63392115600, #    utc_start 2009-10-25 01:00:00 (Sun)
  63405421200, #      utc_end 2010-03-28 01:00:00 (Sun)
  63392122800, #  local_start 2009-10-25 03:00:00 (Sun)
  63405428400, #    local_end 2010-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63405421200, #    utc_start 2010-03-28 01:00:00 (Sun)
  63424170000, #      utc_end 2010-10-31 01:00:00 (Sun)
  63405432000, #  local_start 2010-03-28 04:00:00 (Sun)
  63424180800, #    local_end 2010-10-31 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63424170000, #    utc_start 2010-10-31 01:00:00 (Sun)
  63436870800, #      utc_end 2011-03-27 01:00:00 (Sun)
  63424177200, #  local_start 2010-10-31 03:00:00 (Sun)
  63436878000, #    local_end 2011-03-27 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63436870800, #    utc_start 2011-03-27 01:00:00 (Sun)
  63455619600, #      utc_end 2011-10-30 01:00:00 (Sun)
  63436881600, #  local_start 2011-03-27 04:00:00 (Sun)
  63455630400, #    local_end 2011-10-30 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63455619600, #    utc_start 2011-10-30 01:00:00 (Sun)
  63468320400, #      utc_end 2012-03-25 01:00:00 (Sun)
  63455626800, #  local_start 2011-10-30 03:00:00 (Sun)
  63468327600, #    local_end 2012-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63468320400, #    utc_start 2012-03-25 01:00:00 (Sun)
  63487069200, #      utc_end 2012-10-28 01:00:00 (Sun)
  63468331200, #  local_start 2012-03-25 04:00:00 (Sun)
  63487080000, #    local_end 2012-10-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63487069200, #    utc_start 2012-10-28 01:00:00 (Sun)
  63500374800, #      utc_end 2013-03-31 01:00:00 (Sun)
  63487076400, #  local_start 2012-10-28 03:00:00 (Sun)
  63500382000, #    local_end 2013-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63500374800, #    utc_start 2013-03-31 01:00:00 (Sun)
  63518518800, #      utc_end 2013-10-27 01:00:00 (Sun)
  63500385600, #  local_start 2013-03-31 04:00:00 (Sun)
  63518529600, #    local_end 2013-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63518518800, #    utc_start 2013-10-27 01:00:00 (Sun)
  63531824400, #      utc_end 2014-03-30 01:00:00 (Sun)
  63518526000, #  local_start 2013-10-27 03:00:00 (Sun)
  63531831600, #    local_end 2014-03-30 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63531824400, #    utc_start 2014-03-30 01:00:00 (Sun)
  63549968400, #      utc_end 2014-10-26 01:00:00 (Sun)
  63531835200, #  local_start 2014-03-30 04:00:00 (Sun)
  63549979200, #    local_end 2014-10-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63549968400, #    utc_start 2014-10-26 01:00:00 (Sun)
  63563274000, #      utc_end 2015-03-29 01:00:00 (Sun)
  63549975600, #  local_start 2014-10-26 03:00:00 (Sun)
  63563281200, #    local_end 2015-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63563274000, #    utc_start 2015-03-29 01:00:00 (Sun)
  63581418000, #      utc_end 2015-10-25 01:00:00 (Sun)
  63563284800, #  local_start 2015-03-29 04:00:00 (Sun)
  63581428800, #    local_end 2015-10-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63581418000, #    utc_start 2015-10-25 01:00:00 (Sun)
  63594723600, #      utc_end 2016-03-27 01:00:00 (Sun)
  63581425200, #  local_start 2015-10-25 03:00:00 (Sun)
  63594730800, #    local_end 2016-03-27 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63594723600, #    utc_start 2016-03-27 01:00:00 (Sun)
  63613472400, #      utc_end 2016-10-30 01:00:00 (Sun)
  63594734400, #  local_start 2016-03-27 04:00:00 (Sun)
  63613483200, #    local_end 2016-10-30 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63613472400, #    utc_start 2016-10-30 01:00:00 (Sun)
  63626173200, #      utc_end 2017-03-26 01:00:00 (Sun)
  63613479600, #  local_start 2016-10-30 03:00:00 (Sun)
  63626180400, #    local_end 2017-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63626173200, #    utc_start 2017-03-26 01:00:00 (Sun)
  63644922000, #      utc_end 2017-10-29 01:00:00 (Sun)
  63626184000, #  local_start 2017-03-26 04:00:00 (Sun)
  63644932800, #    local_end 2017-10-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63644922000, #    utc_start 2017-10-29 01:00:00 (Sun)
  63657622800, #      utc_end 2018-03-25 01:00:00 (Sun)
  63644929200, #  local_start 2017-10-29 03:00:00 (Sun)
  63657630000, #    local_end 2018-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63657622800, #    utc_start 2018-03-25 01:00:00 (Sun)
  63676371600, #      utc_end 2018-10-28 01:00:00 (Sun)
  63657633600, #  local_start 2018-03-25 04:00:00 (Sun)
  63676382400, #    local_end 2018-10-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63676371600, #    utc_start 2018-10-28 01:00:00 (Sun)
  63689677200, #      utc_end 2019-03-31 01:00:00 (Sun)
  63676378800, #  local_start 2018-10-28 03:00:00 (Sun)
  63689684400, #    local_end 2019-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63689677200, #    utc_start 2019-03-31 01:00:00 (Sun)
  63707821200, #      utc_end 2019-10-27 01:00:00 (Sun)
  63689688000, #  local_start 2019-03-31 04:00:00 (Sun)
  63707832000, #    local_end 2019-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63707821200, #    utc_start 2019-10-27 01:00:00 (Sun)
  63721126800, #      utc_end 2020-03-29 01:00:00 (Sun)
  63707828400, #  local_start 2019-10-27 03:00:00 (Sun)
  63721134000, #    local_end 2020-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63721126800, #    utc_start 2020-03-29 01:00:00 (Sun)
  63739270800, #      utc_end 2020-10-25 01:00:00 (Sun)
  63721137600, #  local_start 2020-03-29 04:00:00 (Sun)
  63739281600, #    local_end 2020-10-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63739270800, #    utc_start 2020-10-25 01:00:00 (Sun)
  63752576400, #      utc_end 2021-03-28 01:00:00 (Sun)
  63739278000, #  local_start 2020-10-25 03:00:00 (Sun)
  63752583600, #    local_end 2021-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63752576400, #    utc_start 2021-03-28 01:00:00 (Sun)
  63771325200, #      utc_end 2021-10-31 01:00:00 (Sun)
  63752587200, #  local_start 2021-03-28 04:00:00 (Sun)
  63771336000, #    local_end 2021-10-31 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63771325200, #    utc_start 2021-10-31 01:00:00 (Sun)
  63784026000, #      utc_end 2022-03-27 01:00:00 (Sun)
  63771332400, #  local_start 2021-10-31 03:00:00 (Sun)
  63784033200, #    local_end 2022-03-27 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63784026000, #    utc_start 2022-03-27 01:00:00 (Sun)
  63802774800, #      utc_end 2022-10-30 01:00:00 (Sun)
  63784036800, #  local_start 2022-03-27 04:00:00 (Sun)
  63802785600, #    local_end 2022-10-30 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63802774800, #    utc_start 2022-10-30 01:00:00 (Sun)
  63815475600, #      utc_end 2023-03-26 01:00:00 (Sun)
  63802782000, #  local_start 2022-10-30 03:00:00 (Sun)
  63815482800, #    local_end 2023-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63815475600, #    utc_start 2023-03-26 01:00:00 (Sun)
  63834224400, #      utc_end 2023-10-29 01:00:00 (Sun)
  63815486400, #  local_start 2023-03-26 04:00:00 (Sun)
  63834235200, #    local_end 2023-10-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63834224400, #    utc_start 2023-10-29 01:00:00 (Sun)
  63847530000, #      utc_end 2024-03-31 01:00:00 (Sun)
  63834231600, #  local_start 2023-10-29 03:00:00 (Sun)
  63847537200, #    local_end 2024-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63847530000, #    utc_start 2024-03-31 01:00:00 (Sun)
  63865674000, #      utc_end 2024-10-27 01:00:00 (Sun)
  63847540800, #  local_start 2024-03-31 04:00:00 (Sun)
  63865684800, #    local_end 2024-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63865674000, #    utc_start 2024-10-27 01:00:00 (Sun)
  63878979600, #      utc_end 2025-03-30 01:00:00 (Sun)
  63865681200, #  local_start 2024-10-27 03:00:00 (Sun)
  63878986800, #    local_end 2025-03-30 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63878979600, #    utc_start 2025-03-30 01:00:00 (Sun)
  63897123600, #      utc_end 2025-10-26 01:00:00 (Sun)
  63878990400, #  local_start 2025-03-30 04:00:00 (Sun)
  63897134400, #    local_end 2025-10-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63897123600, #    utc_start 2025-10-26 01:00:00 (Sun)
  63910429200, #      utc_end 2026-03-29 01:00:00 (Sun)
  63897130800, #  local_start 2025-10-26 03:00:00 (Sun)
  63910436400, #    local_end 2026-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63910429200, #    utc_start 2026-03-29 01:00:00 (Sun)
  63928573200, #      utc_end 2026-10-25 01:00:00 (Sun)
  63910440000, #  local_start 2026-03-29 04:00:00 (Sun)
  63928584000, #    local_end 2026-10-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63928573200, #    utc_start 2026-10-25 01:00:00 (Sun)
  63941878800, #      utc_end 2027-03-28 01:00:00 (Sun)
  63928580400, #  local_start 2026-10-25 03:00:00 (Sun)
  63941886000, #    local_end 2027-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63941878800, #    utc_start 2027-03-28 01:00:00 (Sun)
  63960627600, #      utc_end 2027-10-31 01:00:00 (Sun)
  63941889600, #  local_start 2027-03-28 04:00:00 (Sun)
  63960638400, #    local_end 2027-10-31 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63960627600, #    utc_start 2027-10-31 01:00:00 (Sun)
  63973328400, #      utc_end 2028-03-26 01:00:00 (Sun)
  63960634800, #  local_start 2027-10-31 03:00:00 (Sun)
  63973335600, #    local_end 2028-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63973328400, #    utc_start 2028-03-26 01:00:00 (Sun)
  63992077200, #      utc_end 2028-10-29 01:00:00 (Sun)
  63973339200, #  local_start 2028-03-26 04:00:00 (Sun)
  63992088000, #    local_end 2028-10-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63992077200, #    utc_start 2028-10-29 01:00:00 (Sun)
  64004778000, #      utc_end 2029-03-25 01:00:00 (Sun)
  63992084400, #  local_start 2028-10-29 03:00:00 (Sun)
  64004785200, #    local_end 2029-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  64004778000, #    utc_start 2029-03-25 01:00:00 (Sun)
  64023526800, #      utc_end 2029-10-28 01:00:00 (Sun)
  64004788800, #  local_start 2029-03-25 04:00:00 (Sun)
  64023537600, #    local_end 2029-10-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  64023526800, #    utc_start 2029-10-28 01:00:00 (Sun)
  64036832400, #      utc_end 2030-03-31 01:00:00 (Sun)
  64023534000, #  local_start 2029-10-28 03:00:00 (Sun)
  64036839600, #    local_end 2030-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  64036832400, #    utc_start 2030-03-31 01:00:00 (Sun)
  64054976400, #      utc_end 2030-10-27 01:00:00 (Sun)
  64036843200, #  local_start 2030-03-31 04:00:00 (Sun)
  64054987200, #    local_end 2030-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {53}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { 7200 }
  
  my $last_observance = bless( {
    'format' => 'EE%sT',
    'gmtoff' => '2:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 730902,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 730902,
      'utc_rd_secs' => 0,
      'utc_year' => 2003
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => 7200,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 730901,
      'local_rd_secs' => 79200,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 730901,
      'utc_rd_secs' => 79200,
      'utc_year' => 2003
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '1:00u',
      'from' => '1981',
      'in' => 'Mar',
      'letter' => 'S',
      'name' => 'EU',
      'offset_from_std' => 3600,
      'on' => 'lastSun',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '1:00u',
      'from' => '1996',
      'in' => 'Oct',
      'letter' => '',
      'name' => 'EU',
      'offset_from_std' => 0,
      'on' => 'lastSun',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_EUROPE_TALLINN

    $main::fatpacked{"DateTime/TimeZone/Europe/Tirane.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_EUROPE_TIRANE';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Europe::Tirane;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Europe::Tirane::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60368452840, #      utc_end 1913-12-31 22:40:40 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60368457600, #    local_end 1914-01-01 00:00:00 (Thu)
  4760,
  0,
  'LMT',
      ],
      [
  60368452840, #    utc_start 1913-12-31 22:40:40 (Wed)
  61203337200, #      utc_end 1940-06-15 23:00:00 (Sat)
  60368456440, #  local_start 1913-12-31 23:40:40 (Wed)
  61203340800, #    local_end 1940-06-16 00:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  61203337200, #    utc_start 1940-06-15 23:00:00 (Sat)
  61278426000, #      utc_end 1942-11-02 01:00:00 (Mon)
  61203344400, #  local_start 1940-06-16 01:00:00 (Sun)
  61278433200, #    local_end 1942-11-02 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61278426000, #    utc_start 1942-11-02 01:00:00 (Mon)
  61291126800, #      utc_end 1943-03-29 01:00:00 (Mon)
  61278429600, #  local_start 1942-11-02 02:00:00 (Mon)
  61291130400, #    local_end 1943-03-29 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61291126800, #    utc_start 1943-03-29 01:00:00 (Mon)
  61292163600, #      utc_end 1943-04-10 01:00:00 (Sat)
  61291134000, #  local_start 1943-03-29 03:00:00 (Mon)
  61292170800, #    local_end 1943-04-10 03:00:00 (Sat)
  7200,
  1,
  'CEST',
      ],
      [
  61292163600, #    utc_start 1943-04-10 01:00:00 (Sat)
  62272537200, #      utc_end 1974-05-03 23:00:00 (Fri)
  61292167200, #  local_start 1943-04-10 02:00:00 (Sat)
  62272540800, #    local_end 1974-05-04 00:00:00 (Sat)
  3600,
  0,
  'CET',
      ],
      [
  62272537200, #    utc_start 1974-05-03 23:00:00 (Fri)
  62285580000, #      utc_end 1974-10-01 22:00:00 (Tue)
  62272544400, #  local_start 1974-05-04 01:00:00 (Sat)
  62285587200, #    local_end 1974-10-02 00:00:00 (Wed)
  7200,
  1,
  'CEST',
      ],
      [
  62285580000, #    utc_start 1974-10-01 22:00:00 (Tue)
  62303814000, #      utc_end 1975-04-30 23:00:00 (Wed)
  62285583600, #  local_start 1974-10-01 23:00:00 (Tue)
  62303817600, #    local_end 1975-05-01 00:00:00 (Thu)
  3600,
  0,
  'CET',
      ],
      [
  62303814000, #    utc_start 1975-04-30 23:00:00 (Wed)
  62317116000, #      utc_end 1975-10-01 22:00:00 (Wed)
  62303821200, #  local_start 1975-05-01 01:00:00 (Thu)
  62317123200, #    local_end 1975-10-02 00:00:00 (Thu)
  7200,
  1,
  'CEST',
      ],
      [
  62317116000, #    utc_start 1975-10-01 22:00:00 (Wed)
  62335522800, #      utc_end 1976-05-01 23:00:00 (Sat)
  62317119600, #  local_start 1975-10-01 23:00:00 (Wed)
  62335526400, #    local_end 1976-05-02 00:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62335522800, #    utc_start 1976-05-01 23:00:00 (Sat)
  62348824800, #      utc_end 1976-10-02 22:00:00 (Sat)
  62335530000, #  local_start 1976-05-02 01:00:00 (Sun)
  62348832000, #    local_end 1976-10-03 00:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62348824800, #    utc_start 1976-10-02 22:00:00 (Sat)
  62367577200, #      utc_end 1977-05-07 23:00:00 (Sat)
  62348828400, #  local_start 1976-10-02 23:00:00 (Sat)
  62367580800, #    local_end 1977-05-08 00:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62367577200, #    utc_start 1977-05-07 23:00:00 (Sat)
  62380274400, #      utc_end 1977-10-01 22:00:00 (Sat)
  62367584400, #  local_start 1977-05-08 01:00:00 (Sun)
  62380281600, #    local_end 1977-10-02 00:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62380274400, #    utc_start 1977-10-01 22:00:00 (Sat)
  62398940400, #      utc_end 1978-05-05 23:00:00 (Fri)
  62380278000, #  local_start 1977-10-01 23:00:00 (Sat)
  62398944000, #    local_end 1978-05-06 00:00:00 (Sat)
  3600,
  0,
  'CET',
      ],
      [
  62398940400, #    utc_start 1978-05-05 23:00:00 (Fri)
  62411724000, #      utc_end 1978-09-30 22:00:00 (Sat)
  62398947600, #  local_start 1978-05-06 01:00:00 (Sat)
  62411731200, #    local_end 1978-10-01 00:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62411724000, #    utc_start 1978-09-30 22:00:00 (Sat)
  62430390000, #      utc_end 1979-05-04 23:00:00 (Fri)
  62411727600, #  local_start 1978-09-30 23:00:00 (Sat)
  62430393600, #    local_end 1979-05-05 00:00:00 (Sat)
  3600,
  0,
  'CET',
      ],
      [
  62430390000, #    utc_start 1979-05-04 23:00:00 (Fri)
  62443173600, #      utc_end 1979-09-29 22:00:00 (Sat)
  62430397200, #  local_start 1979-05-05 01:00:00 (Sat)
  62443180800, #    local_end 1979-09-30 00:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62443173600, #    utc_start 1979-09-29 22:00:00 (Sat)
  62461839600, #      utc_end 1980-05-02 23:00:00 (Fri)
  62443177200, #  local_start 1979-09-29 23:00:00 (Sat)
  62461843200, #    local_end 1980-05-03 00:00:00 (Sat)
  3600,
  0,
  'CET',
      ],
      [
  62461839600, #    utc_start 1980-05-02 23:00:00 (Fri)
  62475141600, #      utc_end 1980-10-03 22:00:00 (Fri)
  62461846800, #  local_start 1980-05-03 01:00:00 (Sat)
  62475148800, #    local_end 1980-10-04 00:00:00 (Sat)
  7200,
  1,
  'CEST',
      ],
      [
  62475141600, #    utc_start 1980-10-03 22:00:00 (Fri)
  62492770800, #      utc_end 1981-04-25 23:00:00 (Sat)
  62475145200, #  local_start 1980-10-03 23:00:00 (Fri)
  62492774400, #    local_end 1981-04-26 00:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62492770800, #    utc_start 1981-04-25 23:00:00 (Sat)
  62506072800, #      utc_end 1981-09-26 22:00:00 (Sat)
  62492778000, #  local_start 1981-04-26 01:00:00 (Sun)
  62506080000, #    local_end 1981-09-27 00:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62506072800, #    utc_start 1981-09-26 22:00:00 (Sat)
  62524825200, #      utc_end 1982-05-01 23:00:00 (Sat)
  62506076400, #  local_start 1981-09-26 23:00:00 (Sat)
  62524828800, #    local_end 1982-05-02 00:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62524825200, #    utc_start 1982-05-01 23:00:00 (Sat)
  62538127200, #      utc_end 1982-10-02 22:00:00 (Sat)
  62524832400, #  local_start 1982-05-02 01:00:00 (Sun)
  62538134400, #    local_end 1982-10-03 00:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62538127200, #    utc_start 1982-10-02 22:00:00 (Sat)
  62555151600, #      utc_end 1983-04-17 23:00:00 (Sun)
  62538130800, #  local_start 1982-10-02 23:00:00 (Sat)
  62555155200, #    local_end 1983-04-18 00:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  62555151600, #    utc_start 1983-04-17 23:00:00 (Sun)
  62569490400, #      utc_end 1983-09-30 22:00:00 (Fri)
  62555158800, #  local_start 1983-04-18 01:00:00 (Mon)
  62569497600, #    local_end 1983-10-01 00:00:00 (Sat)
  7200,
  1,
  'CEST',
      ],
      [
  62569490400, #    utc_start 1983-09-30 22:00:00 (Fri)
  62585305200, #      utc_end 1984-03-31 23:00:00 (Sat)
  62569494000, #  local_start 1983-09-30 23:00:00 (Fri)
  62585308800, #    local_end 1984-04-01 00:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62585305200, #    utc_start 1984-03-31 23:00:00 (Sat)
  62593164000, #      utc_end 1984-06-30 22:00:00 (Sat)
  62585312400, #  local_start 1984-04-01 01:00:00 (Sun)
  62593171200, #    local_end 1984-07-01 00:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62593164000, #    utc_start 1984-06-30 22:00:00 (Sat)
  62601037200, #      utc_end 1984-09-30 01:00:00 (Sun)
  62593171200, #  local_start 1984-07-01 00:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62601037200, #    utc_start 1984-09-30 01:00:00 (Sun)
  62616762000, #      utc_end 1985-03-31 01:00:00 (Sun)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62616762000, #    utc_start 1985-03-31 01:00:00 (Sun)
  62632486800, #      utc_end 1985-09-29 01:00:00 (Sun)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62632486800, #    utc_start 1985-09-29 01:00:00 (Sun)
  62648211600, #      utc_end 1986-03-30 01:00:00 (Sun)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62648211600, #    utc_start 1986-03-30 01:00:00 (Sun)
  62663936400, #      utc_end 1986-09-28 01:00:00 (Sun)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62663936400, #    utc_start 1986-09-28 01:00:00 (Sun)
  62679661200, #      utc_end 1987-03-29 01:00:00 (Sun)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62679661200, #    utc_start 1987-03-29 01:00:00 (Sun)
  62695386000, #      utc_end 1987-09-27 01:00:00 (Sun)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62695386000, #    utc_start 1987-09-27 01:00:00 (Sun)
  62711110800, #      utc_end 1988-03-27 01:00:00 (Sun)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62711110800, #    utc_start 1988-03-27 01:00:00 (Sun)
  62726835600, #      utc_end 1988-09-25 01:00:00 (Sun)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62726835600, #    utc_start 1988-09-25 01:00:00 (Sun)
  62742560400, #      utc_end 1989-03-26 01:00:00 (Sun)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62742560400, #    utc_start 1989-03-26 01:00:00 (Sun)
  62758285200, #      utc_end 1989-09-24 01:00:00 (Sun)
  62742567600, #  local_start 1989-03-26 03:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62758285200, #    utc_start 1989-09-24 01:00:00 (Sun)
  62774010000, #      utc_end 1990-03-25 01:00:00 (Sun)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62774010000, #    utc_start 1990-03-25 01:00:00 (Sun)
  62790339600, #      utc_end 1990-09-30 01:00:00 (Sun)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62790339600, #    utc_start 1990-09-30 01:00:00 (Sun)
  62806064400, #      utc_end 1991-03-31 01:00:00 (Sun)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62806064400, #    utc_start 1991-03-31 01:00:00 (Sun)
  62821789200, #      utc_end 1991-09-29 01:00:00 (Sun)
  62806071600, #  local_start 1991-03-31 03:00:00 (Sun)
  62821796400, #    local_end 1991-09-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62821789200, #    utc_start 1991-09-29 01:00:00 (Sun)
  62837514000, #      utc_end 1992-03-29 01:00:00 (Sun)
  62821792800, #  local_start 1991-09-29 02:00:00 (Sun)
  62837517600, #    local_end 1992-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62837514000, #    utc_start 1992-03-29 01:00:00 (Sun)
  62853238800, #      utc_end 1992-09-27 01:00:00 (Sun)
  62837521200, #  local_start 1992-03-29 03:00:00 (Sun)
  62853246000, #    local_end 1992-09-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62853238800, #    utc_start 1992-09-27 01:00:00 (Sun)
  62868963600, #      utc_end 1993-03-28 01:00:00 (Sun)
  62853242400, #  local_start 1992-09-27 02:00:00 (Sun)
  62868967200, #    local_end 1993-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62868963600, #    utc_start 1993-03-28 01:00:00 (Sun)
  62884688400, #      utc_end 1993-09-26 01:00:00 (Sun)
  62868970800, #  local_start 1993-03-28 03:00:00 (Sun)
  62884695600, #    local_end 1993-09-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62884688400, #    utc_start 1993-09-26 01:00:00 (Sun)
  62900413200, #      utc_end 1994-03-27 01:00:00 (Sun)
  62884692000, #  local_start 1993-09-26 02:00:00 (Sun)
  62900416800, #    local_end 1994-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62900413200, #    utc_start 1994-03-27 01:00:00 (Sun)
  62916138000, #      utc_end 1994-09-25 01:00:00 (Sun)
  62900420400, #  local_start 1994-03-27 03:00:00 (Sun)
  62916145200, #    local_end 1994-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62916138000, #    utc_start 1994-09-25 01:00:00 (Sun)
  62931862800, #      utc_end 1995-03-26 01:00:00 (Sun)
  62916141600, #  local_start 1994-09-25 02:00:00 (Sun)
  62931866400, #    local_end 1995-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62931862800, #    utc_start 1995-03-26 01:00:00 (Sun)
  62947587600, #      utc_end 1995-09-24 01:00:00 (Sun)
  62931870000, #  local_start 1995-03-26 03:00:00 (Sun)
  62947594800, #    local_end 1995-09-24 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62947587600, #    utc_start 1995-09-24 01:00:00 (Sun)
  62963917200, #      utc_end 1996-03-31 01:00:00 (Sun)
  62947591200, #  local_start 1995-09-24 02:00:00 (Sun)
  62963920800, #    local_end 1996-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62963917200, #    utc_start 1996-03-31 01:00:00 (Sun)
  62982061200, #      utc_end 1996-10-27 01:00:00 (Sun)
  62963924400, #  local_start 1996-03-31 03:00:00 (Sun)
  62982068400, #    local_end 1996-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62982061200, #    utc_start 1996-10-27 01:00:00 (Sun)
  62995366800, #      utc_end 1997-03-30 01:00:00 (Sun)
  62982064800, #  local_start 1996-10-27 02:00:00 (Sun)
  62995370400, #    local_end 1997-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62995366800, #    utc_start 1997-03-30 01:00:00 (Sun)
  63013510800, #      utc_end 1997-10-26 01:00:00 (Sun)
  62995374000, #  local_start 1997-03-30 03:00:00 (Sun)
  63013518000, #    local_end 1997-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63013510800, #    utc_start 1997-10-26 01:00:00 (Sun)
  63026816400, #      utc_end 1998-03-29 01:00:00 (Sun)
  63013514400, #  local_start 1997-10-26 02:00:00 (Sun)
  63026820000, #    local_end 1998-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63026816400, #    utc_start 1998-03-29 01:00:00 (Sun)
  63044960400, #      utc_end 1998-10-25 01:00:00 (Sun)
  63026823600, #  local_start 1998-03-29 03:00:00 (Sun)
  63044967600, #    local_end 1998-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63044960400, #    utc_start 1998-10-25 01:00:00 (Sun)
  63058266000, #      utc_end 1999-03-28 01:00:00 (Sun)
  63044964000, #  local_start 1998-10-25 02:00:00 (Sun)
  63058269600, #    local_end 1999-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63058266000, #    utc_start 1999-03-28 01:00:00 (Sun)
  63077014800, #      utc_end 1999-10-31 01:00:00 (Sun)
  63058273200, #  local_start 1999-03-28 03:00:00 (Sun)
  63077022000, #    local_end 1999-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63077014800, #    utc_start 1999-10-31 01:00:00 (Sun)
  63089715600, #      utc_end 2000-03-26 01:00:00 (Sun)
  63077018400, #  local_start 1999-10-31 02:00:00 (Sun)
  63089719200, #    local_end 2000-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63089715600, #    utc_start 2000-03-26 01:00:00 (Sun)
  63108464400, #      utc_end 2000-10-29 01:00:00 (Sun)
  63089722800, #  local_start 2000-03-26 03:00:00 (Sun)
  63108471600, #    local_end 2000-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63108464400, #    utc_start 2000-10-29 01:00:00 (Sun)
  63121165200, #      utc_end 2001-03-25 01:00:00 (Sun)
  63108468000, #  local_start 2000-10-29 02:00:00 (Sun)
  63121168800, #    local_end 2001-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63121165200, #    utc_start 2001-03-25 01:00:00 (Sun)
  63139914000, #      utc_end 2001-10-28 01:00:00 (Sun)
  63121172400, #  local_start 2001-03-25 03:00:00 (Sun)
  63139921200, #    local_end 2001-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63139914000, #    utc_start 2001-10-28 01:00:00 (Sun)
  63153219600, #      utc_end 2002-03-31 01:00:00 (Sun)
  63139917600, #  local_start 2001-10-28 02:00:00 (Sun)
  63153223200, #    local_end 2002-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63153219600, #    utc_start 2002-03-31 01:00:00 (Sun)
  63171363600, #      utc_end 2002-10-27 01:00:00 (Sun)
  63153226800, #  local_start 2002-03-31 03:00:00 (Sun)
  63171370800, #    local_end 2002-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63171363600, #    utc_start 2002-10-27 01:00:00 (Sun)
  63184669200, #      utc_end 2003-03-30 01:00:00 (Sun)
  63171367200, #  local_start 2002-10-27 02:00:00 (Sun)
  63184672800, #    local_end 2003-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63184669200, #    utc_start 2003-03-30 01:00:00 (Sun)
  63202813200, #      utc_end 2003-10-26 01:00:00 (Sun)
  63184676400, #  local_start 2003-03-30 03:00:00 (Sun)
  63202820400, #    local_end 2003-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63202813200, #    utc_start 2003-10-26 01:00:00 (Sun)
  63216118800, #      utc_end 2004-03-28 01:00:00 (Sun)
  63202816800, #  local_start 2003-10-26 02:00:00 (Sun)
  63216122400, #    local_end 2004-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63216118800, #    utc_start 2004-03-28 01:00:00 (Sun)
  63234867600, #      utc_end 2004-10-31 01:00:00 (Sun)
  63216126000, #  local_start 2004-03-28 03:00:00 (Sun)
  63234874800, #    local_end 2004-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63234867600, #    utc_start 2004-10-31 01:00:00 (Sun)
  63247568400, #      utc_end 2005-03-27 01:00:00 (Sun)
  63234871200, #  local_start 2004-10-31 02:00:00 (Sun)
  63247572000, #    local_end 2005-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63247568400, #    utc_start 2005-03-27 01:00:00 (Sun)
  63266317200, #      utc_end 2005-10-30 01:00:00 (Sun)
  63247575600, #  local_start 2005-03-27 03:00:00 (Sun)
  63266324400, #    local_end 2005-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63266317200, #    utc_start 2005-10-30 01:00:00 (Sun)
  63279018000, #      utc_end 2006-03-26 01:00:00 (Sun)
  63266320800, #  local_start 2005-10-30 02:00:00 (Sun)
  63279021600, #    local_end 2006-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63279018000, #    utc_start 2006-03-26 01:00:00 (Sun)
  63297766800, #      utc_end 2006-10-29 01:00:00 (Sun)
  63279025200, #  local_start 2006-03-26 03:00:00 (Sun)
  63297774000, #    local_end 2006-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63297766800, #    utc_start 2006-10-29 01:00:00 (Sun)
  63310467600, #      utc_end 2007-03-25 01:00:00 (Sun)
  63297770400, #  local_start 2006-10-29 02:00:00 (Sun)
  63310471200, #    local_end 2007-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63310467600, #    utc_start 2007-03-25 01:00:00 (Sun)
  63329216400, #      utc_end 2007-10-28 01:00:00 (Sun)
  63310474800, #  local_start 2007-03-25 03:00:00 (Sun)
  63329223600, #    local_end 2007-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63329216400, #    utc_start 2007-10-28 01:00:00 (Sun)
  63342522000, #      utc_end 2008-03-30 01:00:00 (Sun)
  63329220000, #  local_start 2007-10-28 02:00:00 (Sun)
  63342525600, #    local_end 2008-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63342522000, #    utc_start 2008-03-30 01:00:00 (Sun)
  63360666000, #      utc_end 2008-10-26 01:00:00 (Sun)
  63342529200, #  local_start 2008-03-30 03:00:00 (Sun)
  63360673200, #    local_end 2008-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63360666000, #    utc_start 2008-10-26 01:00:00 (Sun)
  63373971600, #      utc_end 2009-03-29 01:00:00 (Sun)
  63360669600, #  local_start 2008-10-26 02:00:00 (Sun)
  63373975200, #    local_end 2009-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63373971600, #    utc_start 2009-03-29 01:00:00 (Sun)
  63392115600, #      utc_end 2009-10-25 01:00:00 (Sun)
  63373978800, #  local_start 2009-03-29 03:00:00 (Sun)
  63392122800, #    local_end 2009-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63392115600, #    utc_start 2009-10-25 01:00:00 (Sun)
  63405421200, #      utc_end 2010-03-28 01:00:00 (Sun)
  63392119200, #  local_start 2009-10-25 02:00:00 (Sun)
  63405424800, #    local_end 2010-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63405421200, #    utc_start 2010-03-28 01:00:00 (Sun)
  63424170000, #      utc_end 2010-10-31 01:00:00 (Sun)
  63405428400, #  local_start 2010-03-28 03:00:00 (Sun)
  63424177200, #    local_end 2010-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63424170000, #    utc_start 2010-10-31 01:00:00 (Sun)
  63436870800, #      utc_end 2011-03-27 01:00:00 (Sun)
  63424173600, #  local_start 2010-10-31 02:00:00 (Sun)
  63436874400, #    local_end 2011-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63436870800, #    utc_start 2011-03-27 01:00:00 (Sun)
  63455619600, #      utc_end 2011-10-30 01:00:00 (Sun)
  63436878000, #  local_start 2011-03-27 03:00:00 (Sun)
  63455626800, #    local_end 2011-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63455619600, #    utc_start 2011-10-30 01:00:00 (Sun)
  63468320400, #      utc_end 2012-03-25 01:00:00 (Sun)
  63455623200, #  local_start 2011-10-30 02:00:00 (Sun)
  63468324000, #    local_end 2012-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63468320400, #    utc_start 2012-03-25 01:00:00 (Sun)
  63487069200, #      utc_end 2012-10-28 01:00:00 (Sun)
  63468327600, #  local_start 2012-03-25 03:00:00 (Sun)
  63487076400, #    local_end 2012-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63487069200, #    utc_start 2012-10-28 01:00:00 (Sun)
  63500374800, #      utc_end 2013-03-31 01:00:00 (Sun)
  63487072800, #  local_start 2012-10-28 02:00:00 (Sun)
  63500378400, #    local_end 2013-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63500374800, #    utc_start 2013-03-31 01:00:00 (Sun)
  63518518800, #      utc_end 2013-10-27 01:00:00 (Sun)
  63500382000, #  local_start 2013-03-31 03:00:00 (Sun)
  63518526000, #    local_end 2013-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63518518800, #    utc_start 2013-10-27 01:00:00 (Sun)
  63531824400, #      utc_end 2014-03-30 01:00:00 (Sun)
  63518522400, #  local_start 2013-10-27 02:00:00 (Sun)
  63531828000, #    local_end 2014-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63531824400, #    utc_start 2014-03-30 01:00:00 (Sun)
  63549968400, #      utc_end 2014-10-26 01:00:00 (Sun)
  63531831600, #  local_start 2014-03-30 03:00:00 (Sun)
  63549975600, #    local_end 2014-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63549968400, #    utc_start 2014-10-26 01:00:00 (Sun)
  63563274000, #      utc_end 2015-03-29 01:00:00 (Sun)
  63549972000, #  local_start 2014-10-26 02:00:00 (Sun)
  63563277600, #    local_end 2015-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63563274000, #    utc_start 2015-03-29 01:00:00 (Sun)
  63581418000, #      utc_end 2015-10-25 01:00:00 (Sun)
  63563281200, #  local_start 2015-03-29 03:00:00 (Sun)
  63581425200, #    local_end 2015-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63581418000, #    utc_start 2015-10-25 01:00:00 (Sun)
  63594723600, #      utc_end 2016-03-27 01:00:00 (Sun)
  63581421600, #  local_start 2015-10-25 02:00:00 (Sun)
  63594727200, #    local_end 2016-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63594723600, #    utc_start 2016-03-27 01:00:00 (Sun)
  63613472400, #      utc_end 2016-10-30 01:00:00 (Sun)
  63594730800, #  local_start 2016-03-27 03:00:00 (Sun)
  63613479600, #    local_end 2016-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63613472400, #    utc_start 2016-10-30 01:00:00 (Sun)
  63626173200, #      utc_end 2017-03-26 01:00:00 (Sun)
  63613476000, #  local_start 2016-10-30 02:00:00 (Sun)
  63626176800, #    local_end 2017-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63626173200, #    utc_start 2017-03-26 01:00:00 (Sun)
  63644922000, #      utc_end 2017-10-29 01:00:00 (Sun)
  63626180400, #  local_start 2017-03-26 03:00:00 (Sun)
  63644929200, #    local_end 2017-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63644922000, #    utc_start 2017-10-29 01:00:00 (Sun)
  63657622800, #      utc_end 2018-03-25 01:00:00 (Sun)
  63644925600, #  local_start 2017-10-29 02:00:00 (Sun)
  63657626400, #    local_end 2018-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63657622800, #    utc_start 2018-03-25 01:00:00 (Sun)
  63676371600, #      utc_end 2018-10-28 01:00:00 (Sun)
  63657630000, #  local_start 2018-03-25 03:00:00 (Sun)
  63676378800, #    local_end 2018-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63676371600, #    utc_start 2018-10-28 01:00:00 (Sun)
  63689677200, #      utc_end 2019-03-31 01:00:00 (Sun)
  63676375200, #  local_start 2018-10-28 02:00:00 (Sun)
  63689680800, #    local_end 2019-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63689677200, #    utc_start 2019-03-31 01:00:00 (Sun)
  63707821200, #      utc_end 2019-10-27 01:00:00 (Sun)
  63689684400, #  local_start 2019-03-31 03:00:00 (Sun)
  63707828400, #    local_end 2019-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63707821200, #    utc_start 2019-10-27 01:00:00 (Sun)
  63721126800, #      utc_end 2020-03-29 01:00:00 (Sun)
  63707824800, #  local_start 2019-10-27 02:00:00 (Sun)
  63721130400, #    local_end 2020-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63721126800, #    utc_start 2020-03-29 01:00:00 (Sun)
  63739270800, #      utc_end 2020-10-25 01:00:00 (Sun)
  63721134000, #  local_start 2020-03-29 03:00:00 (Sun)
  63739278000, #    local_end 2020-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63739270800, #    utc_start 2020-10-25 01:00:00 (Sun)
  63752576400, #      utc_end 2021-03-28 01:00:00 (Sun)
  63739274400, #  local_start 2020-10-25 02:00:00 (Sun)
  63752580000, #    local_end 2021-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63752576400, #    utc_start 2021-03-28 01:00:00 (Sun)
  63771325200, #      utc_end 2021-10-31 01:00:00 (Sun)
  63752583600, #  local_start 2021-03-28 03:00:00 (Sun)
  63771332400, #    local_end 2021-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63771325200, #    utc_start 2021-10-31 01:00:00 (Sun)
  63784026000, #      utc_end 2022-03-27 01:00:00 (Sun)
  63771328800, #  local_start 2021-10-31 02:00:00 (Sun)
  63784029600, #    local_end 2022-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63784026000, #    utc_start 2022-03-27 01:00:00 (Sun)
  63802774800, #      utc_end 2022-10-30 01:00:00 (Sun)
  63784033200, #  local_start 2022-03-27 03:00:00 (Sun)
  63802782000, #    local_end 2022-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63802774800, #    utc_start 2022-10-30 01:00:00 (Sun)
  63815475600, #      utc_end 2023-03-26 01:00:00 (Sun)
  63802778400, #  local_start 2022-10-30 02:00:00 (Sun)
  63815479200, #    local_end 2023-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63815475600, #    utc_start 2023-03-26 01:00:00 (Sun)
  63834224400, #      utc_end 2023-10-29 01:00:00 (Sun)
  63815482800, #  local_start 2023-03-26 03:00:00 (Sun)
  63834231600, #    local_end 2023-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63834224400, #    utc_start 2023-10-29 01:00:00 (Sun)
  63847530000, #      utc_end 2024-03-31 01:00:00 (Sun)
  63834228000, #  local_start 2023-10-29 02:00:00 (Sun)
  63847533600, #    local_end 2024-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63847530000, #    utc_start 2024-03-31 01:00:00 (Sun)
  63865674000, #      utc_end 2024-10-27 01:00:00 (Sun)
  63847537200, #  local_start 2024-03-31 03:00:00 (Sun)
  63865681200, #    local_end 2024-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63865674000, #    utc_start 2024-10-27 01:00:00 (Sun)
  63878979600, #      utc_end 2025-03-30 01:00:00 (Sun)
  63865677600, #  local_start 2024-10-27 02:00:00 (Sun)
  63878983200, #    local_end 2025-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63878979600, #    utc_start 2025-03-30 01:00:00 (Sun)
  63897123600, #      utc_end 2025-10-26 01:00:00 (Sun)
  63878986800, #  local_start 2025-03-30 03:00:00 (Sun)
  63897130800, #    local_end 2025-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63897123600, #    utc_start 2025-10-26 01:00:00 (Sun)
  63910429200, #      utc_end 2026-03-29 01:00:00 (Sun)
  63897127200, #  local_start 2025-10-26 02:00:00 (Sun)
  63910432800, #    local_end 2026-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63910429200, #    utc_start 2026-03-29 01:00:00 (Sun)
  63928573200, #      utc_end 2026-10-25 01:00:00 (Sun)
  63910436400, #  local_start 2026-03-29 03:00:00 (Sun)
  63928580400, #    local_end 2026-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63928573200, #    utc_start 2026-10-25 01:00:00 (Sun)
  63941878800, #      utc_end 2027-03-28 01:00:00 (Sun)
  63928576800, #  local_start 2026-10-25 02:00:00 (Sun)
  63941882400, #    local_end 2027-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63941878800, #    utc_start 2027-03-28 01:00:00 (Sun)
  63960627600, #      utc_end 2027-10-31 01:00:00 (Sun)
  63941886000, #  local_start 2027-03-28 03:00:00 (Sun)
  63960634800, #    local_end 2027-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63960627600, #    utc_start 2027-10-31 01:00:00 (Sun)
  63973328400, #      utc_end 2028-03-26 01:00:00 (Sun)
  63960631200, #  local_start 2027-10-31 02:00:00 (Sun)
  63973332000, #    local_end 2028-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63973328400, #    utc_start 2028-03-26 01:00:00 (Sun)
  63992077200, #      utc_end 2028-10-29 01:00:00 (Sun)
  63973335600, #  local_start 2028-03-26 03:00:00 (Sun)
  63992084400, #    local_end 2028-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63992077200, #    utc_start 2028-10-29 01:00:00 (Sun)
  64004778000, #      utc_end 2029-03-25 01:00:00 (Sun)
  63992080800, #  local_start 2028-10-29 02:00:00 (Sun)
  64004781600, #    local_end 2029-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  64004778000, #    utc_start 2029-03-25 01:00:00 (Sun)
  64023526800, #      utc_end 2029-10-28 01:00:00 (Sun)
  64004785200, #  local_start 2029-03-25 03:00:00 (Sun)
  64023534000, #    local_end 2029-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  64023526800, #    utc_start 2029-10-28 01:00:00 (Sun)
  64036832400, #      utc_end 2030-03-31 01:00:00 (Sun)
  64023530400, #  local_start 2029-10-28 02:00:00 (Sun)
  64036836000, #    local_end 2030-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  64036832400, #    utc_start 2030-03-31 01:00:00 (Sun)
  64054976400, #      utc_end 2030-10-27 01:00:00 (Sun)
  64036839600, #  local_start 2030-03-31 03:00:00 (Sun)
  64054983600, #    local_end 2030-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {60}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { 3600 }
  
  my $last_observance = bless( {
    'format' => 'CE%sT',
    'gmtoff' => '1:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 724458,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 724458,
      'utc_rd_secs' => 0,
      'utc_year' => 1985
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => 3600,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 724457,
      'local_rd_secs' => 79200,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 724457,
      'utc_rd_secs' => 79200,
      'utc_year' => 1985
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '1:00u',
      'from' => '1981',
      'in' => 'Mar',
      'letter' => 'S',
      'name' => 'EU',
      'offset_from_std' => 3600,
      'on' => 'lastSun',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '1:00u',
      'from' => '1996',
      'in' => 'Oct',
      'letter' => '',
      'name' => 'EU',
      'offset_from_std' => 0,
      'on' => 'lastSun',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_EUROPE_TIRANE

    $main::fatpacked{"DateTime/TimeZone/Europe/Ulyanovsk.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_EUROPE_ULYANOVSK';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Europe::Ulyanovsk;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Europe::Ulyanovsk::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60541862400, #      utc_end 1919-07-01 00:00:00 (Tue)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60541874016, #    local_end 1919-07-01 03:13:36 (Tue)
  11616,
  0,
  'LMT',
      ],
      [
  60541862400, #    utc_start 1919-07-01 00:00:00 (Tue)
  60888142800, #      utc_end 1930-06-20 21:00:00 (Fri)
  60541873200, #  local_start 1919-07-01 03:00:00 (Tue)
  60888153600, #    local_end 1930-06-21 00:00:00 (Sat)
  10800,
  0,
  '+03',
      ],
      [
  60888142800, #    utc_start 1930-06-20 21:00:00 (Fri)
  62490600000, #      utc_end 1981-03-31 20:00:00 (Tue)
  60888157200, #  local_start 1930-06-21 01:00:00 (Sat)
  62490614400, #    local_end 1981-04-01 00:00:00 (Wed)
  14400,
  0,
  '+04',
      ],
      [
  62490600000, #    utc_start 1981-03-31 20:00:00 (Tue)
  62506407600, #      utc_end 1981-09-30 19:00:00 (Wed)
  62490618000, #  local_start 1981-04-01 01:00:00 (Wed)
  62506425600, #    local_end 1981-10-01 00:00:00 (Thu)
  18000,
  1,
  '+05',
      ],
      [
  62506407600, #    utc_start 1981-09-30 19:00:00 (Wed)
  62522136000, #      utc_end 1982-03-31 20:00:00 (Wed)
  62506422000, #  local_start 1981-09-30 23:00:00 (Wed)
  62522150400, #    local_end 1982-04-01 00:00:00 (Thu)
  14400,
  0,
  '+04',
      ],
      [
  62522136000, #    utc_start 1982-03-31 20:00:00 (Wed)
  62537943600, #      utc_end 1982-09-30 19:00:00 (Thu)
  62522154000, #  local_start 1982-04-01 01:00:00 (Thu)
  62537961600, #    local_end 1982-10-01 00:00:00 (Fri)
  18000,
  1,
  '+05',
      ],
      [
  62537943600, #    utc_start 1982-09-30 19:00:00 (Thu)
  62553672000, #      utc_end 1983-03-31 20:00:00 (Thu)
  62537958000, #  local_start 1982-09-30 23:00:00 (Thu)
  62553686400, #    local_end 1983-04-01 00:00:00 (Fri)
  14400,
  0,
  '+04',
      ],
      [
  62553672000, #    utc_start 1983-03-31 20:00:00 (Thu)
  62569479600, #      utc_end 1983-09-30 19:00:00 (Fri)
  62553690000, #  local_start 1983-04-01 01:00:00 (Fri)
  62569497600, #    local_end 1983-10-01 00:00:00 (Sat)
  18000,
  1,
  '+05',
      ],
      [
  62569479600, #    utc_start 1983-09-30 19:00:00 (Fri)
  62585294400, #      utc_end 1984-03-31 20:00:00 (Sat)
  62569494000, #  local_start 1983-09-30 23:00:00 (Fri)
  62585308800, #    local_end 1984-04-01 00:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62585294400, #    utc_start 1984-03-31 20:00:00 (Sat)
  62601026400, #      utc_end 1984-09-29 22:00:00 (Sat)
  62585312400, #  local_start 1984-04-01 01:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62601026400, #    utc_start 1984-09-29 22:00:00 (Sat)
  62616751200, #      utc_end 1985-03-30 22:00:00 (Sat)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62616751200, #    utc_start 1985-03-30 22:00:00 (Sat)
  62632476000, #      utc_end 1985-09-28 22:00:00 (Sat)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62632476000, #    utc_start 1985-09-28 22:00:00 (Sat)
  62648200800, #      utc_end 1986-03-29 22:00:00 (Sat)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62648200800, #    utc_start 1986-03-29 22:00:00 (Sat)
  62663925600, #      utc_end 1986-09-27 22:00:00 (Sat)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62663925600, #    utc_start 1986-09-27 22:00:00 (Sat)
  62679650400, #      utc_end 1987-03-28 22:00:00 (Sat)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62679650400, #    utc_start 1987-03-28 22:00:00 (Sat)
  62695375200, #      utc_end 1987-09-26 22:00:00 (Sat)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62695375200, #    utc_start 1987-09-26 22:00:00 (Sat)
  62711100000, #      utc_end 1988-03-26 22:00:00 (Sat)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62711100000, #    utc_start 1988-03-26 22:00:00 (Sat)
  62726824800, #      utc_end 1988-09-24 22:00:00 (Sat)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62726824800, #    utc_start 1988-09-24 22:00:00 (Sat)
  62742549600, #      utc_end 1989-03-25 22:00:00 (Sat)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62742549600, #    utc_start 1989-03-25 22:00:00 (Sat)
  62758278000, #      utc_end 1989-09-23 23:00:00 (Sat)
  62742564000, #  local_start 1989-03-26 02:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  62758278000, #    utc_start 1989-09-23 23:00:00 (Sat)
  62774002800, #      utc_end 1990-03-24 23:00:00 (Sat)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  62774002800, #    utc_start 1990-03-24 23:00:00 (Sat)
  62790332400, #      utc_end 1990-09-29 23:00:00 (Sat)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  62790332400, #    utc_start 1990-09-29 23:00:00 (Sat)
  62806057200, #      utc_end 1991-03-30 23:00:00 (Sat)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  62806057200, #    utc_start 1991-03-30 23:00:00 (Sat)
  62821785600, #      utc_end 1991-09-29 00:00:00 (Sun)
  62806068000, #  local_start 1991-03-31 02:00:00 (Sun)
  62821796400, #    local_end 1991-09-29 03:00:00 (Sun)
  10800,
  1,
  '+03',
      ],
      [
  62821785600, #    utc_start 1991-09-29 00:00:00 (Sun)
  62831462400, #      utc_end 1992-01-19 00:00:00 (Sun)
  62821792800, #  local_start 1991-09-29 02:00:00 (Sun)
  62831469600, #    local_end 1992-01-19 02:00:00 (Sun)
  7200,
  0,
  '+02',
      ],
      [
  62831462400, #    utc_start 1992-01-19 00:00:00 (Sun)
  62837506800, #      utc_end 1992-03-28 23:00:00 (Sat)
  62831473200, #  local_start 1992-01-19 03:00:00 (Sun)
  62837517600, #    local_end 1992-03-29 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  62837506800, #    utc_start 1992-03-28 23:00:00 (Sat)
  62853231600, #      utc_end 1992-09-26 23:00:00 (Sat)
  62837521200, #  local_start 1992-03-29 03:00:00 (Sun)
  62853246000, #    local_end 1992-09-27 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  62853231600, #    utc_start 1992-09-26 23:00:00 (Sat)
  62868956400, #      utc_end 1993-03-27 23:00:00 (Sat)
  62853242400, #  local_start 1992-09-27 02:00:00 (Sun)
  62868967200, #    local_end 1993-03-28 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  62868956400, #    utc_start 1993-03-27 23:00:00 (Sat)
  62884681200, #      utc_end 1993-09-25 23:00:00 (Sat)
  62868970800, #  local_start 1993-03-28 03:00:00 (Sun)
  62884695600, #    local_end 1993-09-26 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  62884681200, #    utc_start 1993-09-25 23:00:00 (Sat)
  62900406000, #      utc_end 1994-03-26 23:00:00 (Sat)
  62884692000, #  local_start 1993-09-26 02:00:00 (Sun)
  62900416800, #    local_end 1994-03-27 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  62900406000, #    utc_start 1994-03-26 23:00:00 (Sat)
  62916130800, #      utc_end 1994-09-24 23:00:00 (Sat)
  62900420400, #  local_start 1994-03-27 03:00:00 (Sun)
  62916145200, #    local_end 1994-09-25 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  62916130800, #    utc_start 1994-09-24 23:00:00 (Sat)
  62931855600, #      utc_end 1995-03-25 23:00:00 (Sat)
  62916141600, #  local_start 1994-09-25 02:00:00 (Sun)
  62931866400, #    local_end 1995-03-26 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  62931855600, #    utc_start 1995-03-25 23:00:00 (Sat)
  62947580400, #      utc_end 1995-09-23 23:00:00 (Sat)
  62931870000, #  local_start 1995-03-26 03:00:00 (Sun)
  62947594800, #    local_end 1995-09-24 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  62947580400, #    utc_start 1995-09-23 23:00:00 (Sat)
  62963910000, #      utc_end 1996-03-30 23:00:00 (Sat)
  62947591200, #  local_start 1995-09-24 02:00:00 (Sun)
  62963920800, #    local_end 1996-03-31 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  62963910000, #    utc_start 1996-03-30 23:00:00 (Sat)
  62982054000, #      utc_end 1996-10-26 23:00:00 (Sat)
  62963924400, #  local_start 1996-03-31 03:00:00 (Sun)
  62982068400, #    local_end 1996-10-27 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  62982054000, #    utc_start 1996-10-26 23:00:00 (Sat)
  62995359600, #      utc_end 1997-03-29 23:00:00 (Sat)
  62982064800, #  local_start 1996-10-27 02:00:00 (Sun)
  62995370400, #    local_end 1997-03-30 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  62995359600, #    utc_start 1997-03-29 23:00:00 (Sat)
  63013503600, #      utc_end 1997-10-25 23:00:00 (Sat)
  62995374000, #  local_start 1997-03-30 03:00:00 (Sun)
  63013518000, #    local_end 1997-10-26 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63013503600, #    utc_start 1997-10-25 23:00:00 (Sat)
  63026809200, #      utc_end 1998-03-28 23:00:00 (Sat)
  63013514400, #  local_start 1997-10-26 02:00:00 (Sun)
  63026820000, #    local_end 1998-03-29 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63026809200, #    utc_start 1998-03-28 23:00:00 (Sat)
  63044953200, #      utc_end 1998-10-24 23:00:00 (Sat)
  63026823600, #  local_start 1998-03-29 03:00:00 (Sun)
  63044967600, #    local_end 1998-10-25 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63044953200, #    utc_start 1998-10-24 23:00:00 (Sat)
  63058258800, #      utc_end 1999-03-27 23:00:00 (Sat)
  63044964000, #  local_start 1998-10-25 02:00:00 (Sun)
  63058269600, #    local_end 1999-03-28 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63058258800, #    utc_start 1999-03-27 23:00:00 (Sat)
  63077007600, #      utc_end 1999-10-30 23:00:00 (Sat)
  63058273200, #  local_start 1999-03-28 03:00:00 (Sun)
  63077022000, #    local_end 1999-10-31 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63077007600, #    utc_start 1999-10-30 23:00:00 (Sat)
  63089708400, #      utc_end 2000-03-25 23:00:00 (Sat)
  63077018400, #  local_start 1999-10-31 02:00:00 (Sun)
  63089719200, #    local_end 2000-03-26 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63089708400, #    utc_start 2000-03-25 23:00:00 (Sat)
  63108457200, #      utc_end 2000-10-28 23:00:00 (Sat)
  63089722800, #  local_start 2000-03-26 03:00:00 (Sun)
  63108471600, #    local_end 2000-10-29 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63108457200, #    utc_start 2000-10-28 23:00:00 (Sat)
  63121158000, #      utc_end 2001-03-24 23:00:00 (Sat)
  63108468000, #  local_start 2000-10-29 02:00:00 (Sun)
  63121168800, #    local_end 2001-03-25 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63121158000, #    utc_start 2001-03-24 23:00:00 (Sat)
  63139906800, #      utc_end 2001-10-27 23:00:00 (Sat)
  63121172400, #  local_start 2001-03-25 03:00:00 (Sun)
  63139921200, #    local_end 2001-10-28 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63139906800, #    utc_start 2001-10-27 23:00:00 (Sat)
  63153212400, #      utc_end 2002-03-30 23:00:00 (Sat)
  63139917600, #  local_start 2001-10-28 02:00:00 (Sun)
  63153223200, #    local_end 2002-03-31 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63153212400, #    utc_start 2002-03-30 23:00:00 (Sat)
  63171356400, #      utc_end 2002-10-26 23:00:00 (Sat)
  63153226800, #  local_start 2002-03-31 03:00:00 (Sun)
  63171370800, #    local_end 2002-10-27 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63171356400, #    utc_start 2002-10-26 23:00:00 (Sat)
  63184662000, #      utc_end 2003-03-29 23:00:00 (Sat)
  63171367200, #  local_start 2002-10-27 02:00:00 (Sun)
  63184672800, #    local_end 2003-03-30 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63184662000, #    utc_start 2003-03-29 23:00:00 (Sat)
  63202806000, #      utc_end 2003-10-25 23:00:00 (Sat)
  63184676400, #  local_start 2003-03-30 03:00:00 (Sun)
  63202820400, #    local_end 2003-10-26 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63202806000, #    utc_start 2003-10-25 23:00:00 (Sat)
  63216111600, #      utc_end 2004-03-27 23:00:00 (Sat)
  63202816800, #  local_start 2003-10-26 02:00:00 (Sun)
  63216122400, #    local_end 2004-03-28 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63216111600, #    utc_start 2004-03-27 23:00:00 (Sat)
  63234860400, #      utc_end 2004-10-30 23:00:00 (Sat)
  63216126000, #  local_start 2004-03-28 03:00:00 (Sun)
  63234874800, #    local_end 2004-10-31 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63234860400, #    utc_start 2004-10-30 23:00:00 (Sat)
  63247561200, #      utc_end 2005-03-26 23:00:00 (Sat)
  63234871200, #  local_start 2004-10-31 02:00:00 (Sun)
  63247572000, #    local_end 2005-03-27 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63247561200, #    utc_start 2005-03-26 23:00:00 (Sat)
  63266310000, #      utc_end 2005-10-29 23:00:00 (Sat)
  63247575600, #  local_start 2005-03-27 03:00:00 (Sun)
  63266324400, #    local_end 2005-10-30 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63266310000, #    utc_start 2005-10-29 23:00:00 (Sat)
  63279010800, #      utc_end 2006-03-25 23:00:00 (Sat)
  63266320800, #  local_start 2005-10-30 02:00:00 (Sun)
  63279021600, #    local_end 2006-03-26 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63279010800, #    utc_start 2006-03-25 23:00:00 (Sat)
  63297759600, #      utc_end 2006-10-28 23:00:00 (Sat)
  63279025200, #  local_start 2006-03-26 03:00:00 (Sun)
  63297774000, #    local_end 2006-10-29 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63297759600, #    utc_start 2006-10-28 23:00:00 (Sat)
  63310460400, #      utc_end 2007-03-24 23:00:00 (Sat)
  63297770400, #  local_start 2006-10-29 02:00:00 (Sun)
  63310471200, #    local_end 2007-03-25 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63310460400, #    utc_start 2007-03-24 23:00:00 (Sat)
  63329209200, #      utc_end 2007-10-27 23:00:00 (Sat)
  63310474800, #  local_start 2007-03-25 03:00:00 (Sun)
  63329223600, #    local_end 2007-10-28 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63329209200, #    utc_start 2007-10-27 23:00:00 (Sat)
  63342514800, #      utc_end 2008-03-29 23:00:00 (Sat)
  63329220000, #  local_start 2007-10-28 02:00:00 (Sun)
  63342525600, #    local_end 2008-03-30 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63342514800, #    utc_start 2008-03-29 23:00:00 (Sat)
  63360658800, #      utc_end 2008-10-25 23:00:00 (Sat)
  63342529200, #  local_start 2008-03-30 03:00:00 (Sun)
  63360673200, #    local_end 2008-10-26 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63360658800, #    utc_start 2008-10-25 23:00:00 (Sat)
  63373964400, #      utc_end 2009-03-28 23:00:00 (Sat)
  63360669600, #  local_start 2008-10-26 02:00:00 (Sun)
  63373975200, #    local_end 2009-03-29 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63373964400, #    utc_start 2009-03-28 23:00:00 (Sat)
  63392108400, #      utc_end 2009-10-24 23:00:00 (Sat)
  63373978800, #  local_start 2009-03-29 03:00:00 (Sun)
  63392122800, #    local_end 2009-10-25 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63392108400, #    utc_start 2009-10-24 23:00:00 (Sat)
  63405414000, #      utc_end 2010-03-27 23:00:00 (Sat)
  63392119200, #  local_start 2009-10-25 02:00:00 (Sun)
  63405424800, #    local_end 2010-03-28 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63405414000, #    utc_start 2010-03-27 23:00:00 (Sat)
  63424162800, #      utc_end 2010-10-30 23:00:00 (Sat)
  63405428400, #  local_start 2010-03-28 03:00:00 (Sun)
  63424177200, #    local_end 2010-10-31 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63424162800, #    utc_start 2010-10-30 23:00:00 (Sat)
  63436863600, #      utc_end 2011-03-26 23:00:00 (Sat)
  63424173600, #  local_start 2010-10-31 02:00:00 (Sun)
  63436874400, #    local_end 2011-03-27 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63436863600, #    utc_start 2011-03-26 23:00:00 (Sat)
  63549957600, #      utc_end 2014-10-25 22:00:00 (Sat)
  63436878000, #  local_start 2011-03-27 03:00:00 (Sun)
  63549972000, #    local_end 2014-10-26 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63549957600, #    utc_start 2014-10-25 22:00:00 (Sat)
  63594716400, #      utc_end 2016-03-26 23:00:00 (Sat)
  63549968400, #  local_start 2014-10-26 01:00:00 (Sun)
  63594727200, #    local_end 2016-03-27 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63594716400, #    utc_start 2016-03-26 23:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  63594730800, #  local_start 2016-03-27 03:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  14400,
  0,
  '+04',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {30}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_EUROPE_ULYANOVSK

    $main::fatpacked{"DateTime/TimeZone/Europe/Uzhgorod.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_EUROPE_UZHGOROD';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Europe::Uzhgorod;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Europe::Uzhgorod::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59634743448, #      utc_end 1890-09-30 22:30:48 (Tue)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59634748800, #    local_end 1890-10-01 00:00:00 (Wed)
  5352,
  0,
  'LMT',
      ],
      [
  59634743448, #    utc_start 1890-09-30 22:30:48 (Tue)
  61188908400, #      utc_end 1939-12-31 23:00:00 (Sun)
  59634747048, #  local_start 1890-09-30 23:30:48 (Tue)
  61188912000, #    local_end 1940-01-01 00:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61188908400, #    utc_start 1939-12-31 23:00:00 (Sun)
  61196778000, #      utc_end 1940-04-01 01:00:00 (Mon)
  61188912000, #  local_start 1940-01-01 00:00:00 (Mon)
  61196781600, #    local_end 1940-04-01 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61196778000, #    utc_start 1940-04-01 01:00:00 (Mon)
  61278426000, #      utc_end 1942-11-02 01:00:00 (Mon)
  61196785200, #  local_start 1940-04-01 03:00:00 (Mon)
  61278433200, #    local_end 1942-11-02 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61278426000, #    utc_start 1942-11-02 01:00:00 (Mon)
  61291126800, #      utc_end 1943-03-29 01:00:00 (Mon)
  61278429600, #  local_start 1942-11-02 02:00:00 (Mon)
  61291130400, #    local_end 1943-03-29 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61291126800, #    utc_start 1943-03-29 01:00:00 (Mon)
  61307456400, #      utc_end 1943-10-04 01:00:00 (Mon)
  61291134000, #  local_start 1943-03-29 03:00:00 (Mon)
  61307463600, #    local_end 1943-10-04 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61307456400, #    utc_start 1943-10-04 01:00:00 (Mon)
  61323181200, #      utc_end 1944-04-03 01:00:00 (Mon)
  61307460000, #  local_start 1943-10-04 02:00:00 (Mon)
  61323184800, #    local_end 1944-04-03 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61323181200, #    utc_start 1944-04-03 01:00:00 (Mon)
  61338808800, #      utc_end 1944-09-30 22:00:00 (Sat)
  61323188400, #  local_start 1944-04-03 03:00:00 (Mon)
  61338816000, #    local_end 1944-10-01 00:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  61338808800, #    utc_start 1944-09-30 22:00:00 (Sat)
  61340968800, #      utc_end 1944-10-25 22:00:00 (Wed)
  61338816000, #  local_start 1944-10-01 00:00:00 (Sun)
  61340976000, #    local_end 1944-10-26 00:00:00 (Thu)
  7200,
  1,
  'CEST',
      ],
      [
  61340968800, #    utc_start 1944-10-25 22:00:00 (Wed)
  61362226800, #      utc_end 1945-06-28 23:00:00 (Thu)
  61340972400, #  local_start 1944-10-25 23:00:00 (Wed)
  61362230400, #    local_end 1945-06-29 00:00:00 (Fri)
  3600,
  0,
  'CET',
      ],
      [
  61362226800, #    utc_start 1945-06-28 23:00:00 (Thu)
  62490603600, #      utc_end 1981-03-31 21:00:00 (Tue)
  61362237600, #  local_start 1945-06-29 02:00:00 (Fri)
  62490614400, #    local_end 1981-04-01 00:00:00 (Wed)
  10800,
  0,
  'MSK',
      ],
      [
  62490603600, #    utc_start 1981-03-31 21:00:00 (Tue)
  62506411200, #      utc_end 1981-09-30 20:00:00 (Wed)
  62490618000, #  local_start 1981-04-01 01:00:00 (Wed)
  62506425600, #    local_end 1981-10-01 00:00:00 (Thu)
  14400,
  1,
  'MSD',
      ],
      [
  62506411200, #    utc_start 1981-09-30 20:00:00 (Wed)
  62522139600, #      utc_end 1982-03-31 21:00:00 (Wed)
  62506422000, #  local_start 1981-09-30 23:00:00 (Wed)
  62522150400, #    local_end 1982-04-01 00:00:00 (Thu)
  10800,
  0,
  'MSK',
      ],
      [
  62522139600, #    utc_start 1982-03-31 21:00:00 (Wed)
  62537947200, #      utc_end 1982-09-30 20:00:00 (Thu)
  62522154000, #  local_start 1982-04-01 01:00:00 (Thu)
  62537961600, #    local_end 1982-10-01 00:00:00 (Fri)
  14400,
  1,
  'MSD',
      ],
      [
  62537947200, #    utc_start 1982-09-30 20:00:00 (Thu)
  62553675600, #      utc_end 1983-03-31 21:00:00 (Thu)
  62537958000, #  local_start 1982-09-30 23:00:00 (Thu)
  62553686400, #    local_end 1983-04-01 00:00:00 (Fri)
  10800,
  0,
  'MSK',
      ],
      [
  62553675600, #    utc_start 1983-03-31 21:00:00 (Thu)
  62569483200, #      utc_end 1983-09-30 20:00:00 (Fri)
  62553690000, #  local_start 1983-04-01 01:00:00 (Fri)
  62569497600, #    local_end 1983-10-01 00:00:00 (Sat)
  14400,
  1,
  'MSD',
      ],
      [
  62569483200, #    utc_start 1983-09-30 20:00:00 (Fri)
  62585298000, #      utc_end 1984-03-31 21:00:00 (Sat)
  62569494000, #  local_start 1983-09-30 23:00:00 (Fri)
  62585308800, #    local_end 1984-04-01 00:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62585298000, #    utc_start 1984-03-31 21:00:00 (Sat)
  62601030000, #      utc_end 1984-09-29 23:00:00 (Sat)
  62585312400, #  local_start 1984-04-01 01:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62601030000, #    utc_start 1984-09-29 23:00:00 (Sat)
  62616754800, #      utc_end 1985-03-30 23:00:00 (Sat)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62616754800, #    utc_start 1985-03-30 23:00:00 (Sat)
  62632479600, #      utc_end 1985-09-28 23:00:00 (Sat)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62632479600, #    utc_start 1985-09-28 23:00:00 (Sat)
  62648204400, #      utc_end 1986-03-29 23:00:00 (Sat)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62648204400, #    utc_start 1986-03-29 23:00:00 (Sat)
  62663929200, #      utc_end 1986-09-27 23:00:00 (Sat)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62663929200, #    utc_start 1986-09-27 23:00:00 (Sat)
  62679654000, #      utc_end 1987-03-28 23:00:00 (Sat)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62679654000, #    utc_start 1987-03-28 23:00:00 (Sat)
  62695378800, #      utc_end 1987-09-26 23:00:00 (Sat)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62695378800, #    utc_start 1987-09-26 23:00:00 (Sat)
  62711103600, #      utc_end 1988-03-26 23:00:00 (Sat)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62711103600, #    utc_start 1988-03-26 23:00:00 (Sat)
  62726828400, #      utc_end 1988-09-24 23:00:00 (Sat)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62726828400, #    utc_start 1988-09-24 23:00:00 (Sat)
  62742553200, #      utc_end 1989-03-25 23:00:00 (Sat)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62742553200, #    utc_start 1989-03-25 23:00:00 (Sat)
  62758278000, #      utc_end 1989-09-23 23:00:00 (Sat)
  62742567600, #  local_start 1989-03-26 03:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62758278000, #    utc_start 1989-09-23 23:00:00 (Sat)
  62766824400, #      utc_end 1989-12-31 21:00:00 (Sun)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62766835200, #    local_end 1990-01-01 00:00:00 (Mon)
  10800,
  0,
  'MSK',
      ],
      [
  62766824400, #    utc_start 1989-12-31 21:00:00 (Sun)
  62782470000, #      utc_end 1990-06-30 23:00:00 (Sat)
  62766835200, #  local_start 1990-01-01 00:00:00 (Mon)
  62782480800, #    local_end 1990-07-01 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62782470000, #    utc_start 1990-06-30 23:00:00 (Sat)
  62806068000, #      utc_end 1991-03-31 02:00:00 (Sun)
  62782473600, #  local_start 1990-07-01 00:00:00 (Sun)
  62806071600, #    local_end 1991-03-31 03:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62806068000, #    utc_start 1991-03-31 02:00:00 (Sun)
  62829900000, #      utc_end 1991-12-31 22:00:00 (Tue)
  62806075200, #  local_start 1991-03-31 04:00:00 (Sun)
  62829907200, #    local_end 1992-01-01 00:00:00 (Wed)
  7200,
  0,
  'EET',
      ],
      [
  62829900000, #    utc_start 1991-12-31 22:00:00 (Tue)
  62837503200, #      utc_end 1992-03-28 22:00:00 (Sat)
  62829907200, #  local_start 1992-01-01 00:00:00 (Wed)
  62837510400, #    local_end 1992-03-29 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62837503200, #    utc_start 1992-03-28 22:00:00 (Sat)
  62853224400, #      utc_end 1992-09-26 21:00:00 (Sat)
  62837514000, #  local_start 1992-03-29 01:00:00 (Sun)
  62853235200, #    local_end 1992-09-27 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62853224400, #    utc_start 1992-09-26 21:00:00 (Sat)
  62868952800, #      utc_end 1993-03-27 22:00:00 (Sat)
  62853231600, #  local_start 1992-09-26 23:00:00 (Sat)
  62868960000, #    local_end 1993-03-28 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62868952800, #    utc_start 1993-03-27 22:00:00 (Sat)
  62884674000, #      utc_end 1993-09-25 21:00:00 (Sat)
  62868963600, #  local_start 1993-03-28 01:00:00 (Sun)
  62884684800, #    local_end 1993-09-26 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62884674000, #    utc_start 1993-09-25 21:00:00 (Sat)
  62900402400, #      utc_end 1994-03-26 22:00:00 (Sat)
  62884681200, #  local_start 1993-09-25 23:00:00 (Sat)
  62900409600, #    local_end 1994-03-27 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62900402400, #    utc_start 1994-03-26 22:00:00 (Sat)
  62916123600, #      utc_end 1994-09-24 21:00:00 (Sat)
  62900413200, #  local_start 1994-03-27 01:00:00 (Sun)
  62916134400, #    local_end 1994-09-25 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62916123600, #    utc_start 1994-09-24 21:00:00 (Sat)
  62924594400, #      utc_end 1994-12-31 22:00:00 (Sat)
  62916130800, #  local_start 1994-09-24 23:00:00 (Sat)
  62924601600, #    local_end 1995-01-01 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62924594400, #    utc_start 1994-12-31 22:00:00 (Sat)
  62931862800, #      utc_end 1995-03-26 01:00:00 (Sun)
  62924601600, #  local_start 1995-01-01 00:00:00 (Sun)
  62931870000, #    local_end 1995-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62931862800, #    utc_start 1995-03-26 01:00:00 (Sun)
  62947587600, #      utc_end 1995-09-24 01:00:00 (Sun)
  62931873600, #  local_start 1995-03-26 04:00:00 (Sun)
  62947598400, #    local_end 1995-09-24 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62947587600, #    utc_start 1995-09-24 01:00:00 (Sun)
  62963917200, #      utc_end 1996-03-31 01:00:00 (Sun)
  62947594800, #  local_start 1995-09-24 03:00:00 (Sun)
  62963924400, #    local_end 1996-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62963917200, #    utc_start 1996-03-31 01:00:00 (Sun)
  62982061200, #      utc_end 1996-10-27 01:00:00 (Sun)
  62963928000, #  local_start 1996-03-31 04:00:00 (Sun)
  62982072000, #    local_end 1996-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62982061200, #    utc_start 1996-10-27 01:00:00 (Sun)
  62995366800, #      utc_end 1997-03-30 01:00:00 (Sun)
  62982068400, #  local_start 1996-10-27 03:00:00 (Sun)
  62995374000, #    local_end 1997-03-30 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62995366800, #    utc_start 1997-03-30 01:00:00 (Sun)
  63013510800, #      utc_end 1997-10-26 01:00:00 (Sun)
  62995377600, #  local_start 1997-03-30 04:00:00 (Sun)
  63013521600, #    local_end 1997-10-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63013510800, #    utc_start 1997-10-26 01:00:00 (Sun)
  63026816400, #      utc_end 1998-03-29 01:00:00 (Sun)
  63013518000, #  local_start 1997-10-26 03:00:00 (Sun)
  63026823600, #    local_end 1998-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63026816400, #    utc_start 1998-03-29 01:00:00 (Sun)
  63044960400, #      utc_end 1998-10-25 01:00:00 (Sun)
  63026827200, #  local_start 1998-03-29 04:00:00 (Sun)
  63044971200, #    local_end 1998-10-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63044960400, #    utc_start 1998-10-25 01:00:00 (Sun)
  63058266000, #      utc_end 1999-03-28 01:00:00 (Sun)
  63044967600, #  local_start 1998-10-25 03:00:00 (Sun)
  63058273200, #    local_end 1999-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63058266000, #    utc_start 1999-03-28 01:00:00 (Sun)
  63077014800, #      utc_end 1999-10-31 01:00:00 (Sun)
  63058276800, #  local_start 1999-03-28 04:00:00 (Sun)
  63077025600, #    local_end 1999-10-31 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63077014800, #    utc_start 1999-10-31 01:00:00 (Sun)
  63089715600, #      utc_end 2000-03-26 01:00:00 (Sun)
  63077022000, #  local_start 1999-10-31 03:00:00 (Sun)
  63089722800, #    local_end 2000-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63089715600, #    utc_start 2000-03-26 01:00:00 (Sun)
  63108464400, #      utc_end 2000-10-29 01:00:00 (Sun)
  63089726400, #  local_start 2000-03-26 04:00:00 (Sun)
  63108475200, #    local_end 2000-10-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63108464400, #    utc_start 2000-10-29 01:00:00 (Sun)
  63121165200, #      utc_end 2001-03-25 01:00:00 (Sun)
  63108471600, #  local_start 2000-10-29 03:00:00 (Sun)
  63121172400, #    local_end 2001-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63121165200, #    utc_start 2001-03-25 01:00:00 (Sun)
  63139914000, #      utc_end 2001-10-28 01:00:00 (Sun)
  63121176000, #  local_start 2001-03-25 04:00:00 (Sun)
  63139924800, #    local_end 2001-10-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63139914000, #    utc_start 2001-10-28 01:00:00 (Sun)
  63153219600, #      utc_end 2002-03-31 01:00:00 (Sun)
  63139921200, #  local_start 2001-10-28 03:00:00 (Sun)
  63153226800, #    local_end 2002-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63153219600, #    utc_start 2002-03-31 01:00:00 (Sun)
  63171363600, #      utc_end 2002-10-27 01:00:00 (Sun)
  63153230400, #  local_start 2002-03-31 04:00:00 (Sun)
  63171374400, #    local_end 2002-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63171363600, #    utc_start 2002-10-27 01:00:00 (Sun)
  63184669200, #      utc_end 2003-03-30 01:00:00 (Sun)
  63171370800, #  local_start 2002-10-27 03:00:00 (Sun)
  63184676400, #    local_end 2003-03-30 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63184669200, #    utc_start 2003-03-30 01:00:00 (Sun)
  63202813200, #      utc_end 2003-10-26 01:00:00 (Sun)
  63184680000, #  local_start 2003-03-30 04:00:00 (Sun)
  63202824000, #    local_end 2003-10-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63202813200, #    utc_start 2003-10-26 01:00:00 (Sun)
  63216118800, #      utc_end 2004-03-28 01:00:00 (Sun)
  63202820400, #  local_start 2003-10-26 03:00:00 (Sun)
  63216126000, #    local_end 2004-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63216118800, #    utc_start 2004-03-28 01:00:00 (Sun)
  63234867600, #      utc_end 2004-10-31 01:00:00 (Sun)
  63216129600, #  local_start 2004-03-28 04:00:00 (Sun)
  63234878400, #    local_end 2004-10-31 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63234867600, #    utc_start 2004-10-31 01:00:00 (Sun)
  63247568400, #      utc_end 2005-03-27 01:00:00 (Sun)
  63234874800, #  local_start 2004-10-31 03:00:00 (Sun)
  63247575600, #    local_end 2005-03-27 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63247568400, #    utc_start 2005-03-27 01:00:00 (Sun)
  63266317200, #      utc_end 2005-10-30 01:00:00 (Sun)
  63247579200, #  local_start 2005-03-27 04:00:00 (Sun)
  63266328000, #    local_end 2005-10-30 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63266317200, #    utc_start 2005-10-30 01:00:00 (Sun)
  63279018000, #      utc_end 2006-03-26 01:00:00 (Sun)
  63266324400, #  local_start 2005-10-30 03:00:00 (Sun)
  63279025200, #    local_end 2006-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63279018000, #    utc_start 2006-03-26 01:00:00 (Sun)
  63297766800, #      utc_end 2006-10-29 01:00:00 (Sun)
  63279028800, #  local_start 2006-03-26 04:00:00 (Sun)
  63297777600, #    local_end 2006-10-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63297766800, #    utc_start 2006-10-29 01:00:00 (Sun)
  63310467600, #      utc_end 2007-03-25 01:00:00 (Sun)
  63297774000, #  local_start 2006-10-29 03:00:00 (Sun)
  63310474800, #    local_end 2007-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63310467600, #    utc_start 2007-03-25 01:00:00 (Sun)
  63329216400, #      utc_end 2007-10-28 01:00:00 (Sun)
  63310478400, #  local_start 2007-03-25 04:00:00 (Sun)
  63329227200, #    local_end 2007-10-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63329216400, #    utc_start 2007-10-28 01:00:00 (Sun)
  63342522000, #      utc_end 2008-03-30 01:00:00 (Sun)
  63329223600, #  local_start 2007-10-28 03:00:00 (Sun)
  63342529200, #    local_end 2008-03-30 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63342522000, #    utc_start 2008-03-30 01:00:00 (Sun)
  63360666000, #      utc_end 2008-10-26 01:00:00 (Sun)
  63342532800, #  local_start 2008-03-30 04:00:00 (Sun)
  63360676800, #    local_end 2008-10-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63360666000, #    utc_start 2008-10-26 01:00:00 (Sun)
  63373971600, #      utc_end 2009-03-29 01:00:00 (Sun)
  63360673200, #  local_start 2008-10-26 03:00:00 (Sun)
  63373978800, #    local_end 2009-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63373971600, #    utc_start 2009-03-29 01:00:00 (Sun)
  63392115600, #      utc_end 2009-10-25 01:00:00 (Sun)
  63373982400, #  local_start 2009-03-29 04:00:00 (Sun)
  63392126400, #    local_end 2009-10-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63392115600, #    utc_start 2009-10-25 01:00:00 (Sun)
  63405421200, #      utc_end 2010-03-28 01:00:00 (Sun)
  63392122800, #  local_start 2009-10-25 03:00:00 (Sun)
  63405428400, #    local_end 2010-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63405421200, #    utc_start 2010-03-28 01:00:00 (Sun)
  63424170000, #      utc_end 2010-10-31 01:00:00 (Sun)
  63405432000, #  local_start 2010-03-28 04:00:00 (Sun)
  63424180800, #    local_end 2010-10-31 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63424170000, #    utc_start 2010-10-31 01:00:00 (Sun)
  63436870800, #      utc_end 2011-03-27 01:00:00 (Sun)
  63424177200, #  local_start 2010-10-31 03:00:00 (Sun)
  63436878000, #    local_end 2011-03-27 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63436870800, #    utc_start 2011-03-27 01:00:00 (Sun)
  63455619600, #      utc_end 2011-10-30 01:00:00 (Sun)
  63436881600, #  local_start 2011-03-27 04:00:00 (Sun)
  63455630400, #    local_end 2011-10-30 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63455619600, #    utc_start 2011-10-30 01:00:00 (Sun)
  63468320400, #      utc_end 2012-03-25 01:00:00 (Sun)
  63455626800, #  local_start 2011-10-30 03:00:00 (Sun)
  63468327600, #    local_end 2012-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63468320400, #    utc_start 2012-03-25 01:00:00 (Sun)
  63487069200, #      utc_end 2012-10-28 01:00:00 (Sun)
  63468331200, #  local_start 2012-03-25 04:00:00 (Sun)
  63487080000, #    local_end 2012-10-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63487069200, #    utc_start 2012-10-28 01:00:00 (Sun)
  63500374800, #      utc_end 2013-03-31 01:00:00 (Sun)
  63487076400, #  local_start 2012-10-28 03:00:00 (Sun)
  63500382000, #    local_end 2013-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63500374800, #    utc_start 2013-03-31 01:00:00 (Sun)
  63518518800, #      utc_end 2013-10-27 01:00:00 (Sun)
  63500385600, #  local_start 2013-03-31 04:00:00 (Sun)
  63518529600, #    local_end 2013-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63518518800, #    utc_start 2013-10-27 01:00:00 (Sun)
  63531824400, #      utc_end 2014-03-30 01:00:00 (Sun)
  63518526000, #  local_start 2013-10-27 03:00:00 (Sun)
  63531831600, #    local_end 2014-03-30 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63531824400, #    utc_start 2014-03-30 01:00:00 (Sun)
  63549968400, #      utc_end 2014-10-26 01:00:00 (Sun)
  63531835200, #  local_start 2014-03-30 04:00:00 (Sun)
  63549979200, #    local_end 2014-10-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63549968400, #    utc_start 2014-10-26 01:00:00 (Sun)
  63563274000, #      utc_end 2015-03-29 01:00:00 (Sun)
  63549975600, #  local_start 2014-10-26 03:00:00 (Sun)
  63563281200, #    local_end 2015-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63563274000, #    utc_start 2015-03-29 01:00:00 (Sun)
  63581418000, #      utc_end 2015-10-25 01:00:00 (Sun)
  63563284800, #  local_start 2015-03-29 04:00:00 (Sun)
  63581428800, #    local_end 2015-10-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63581418000, #    utc_start 2015-10-25 01:00:00 (Sun)
  63594723600, #      utc_end 2016-03-27 01:00:00 (Sun)
  63581425200, #  local_start 2015-10-25 03:00:00 (Sun)
  63594730800, #    local_end 2016-03-27 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63594723600, #    utc_start 2016-03-27 01:00:00 (Sun)
  63613472400, #      utc_end 2016-10-30 01:00:00 (Sun)
  63594734400, #  local_start 2016-03-27 04:00:00 (Sun)
  63613483200, #    local_end 2016-10-30 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63613472400, #    utc_start 2016-10-30 01:00:00 (Sun)
  63626173200, #      utc_end 2017-03-26 01:00:00 (Sun)
  63613479600, #  local_start 2016-10-30 03:00:00 (Sun)
  63626180400, #    local_end 2017-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63626173200, #    utc_start 2017-03-26 01:00:00 (Sun)
  63644922000, #      utc_end 2017-10-29 01:00:00 (Sun)
  63626184000, #  local_start 2017-03-26 04:00:00 (Sun)
  63644932800, #    local_end 2017-10-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63644922000, #    utc_start 2017-10-29 01:00:00 (Sun)
  63657622800, #      utc_end 2018-03-25 01:00:00 (Sun)
  63644929200, #  local_start 2017-10-29 03:00:00 (Sun)
  63657630000, #    local_end 2018-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63657622800, #    utc_start 2018-03-25 01:00:00 (Sun)
  63676371600, #      utc_end 2018-10-28 01:00:00 (Sun)
  63657633600, #  local_start 2018-03-25 04:00:00 (Sun)
  63676382400, #    local_end 2018-10-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63676371600, #    utc_start 2018-10-28 01:00:00 (Sun)
  63689677200, #      utc_end 2019-03-31 01:00:00 (Sun)
  63676378800, #  local_start 2018-10-28 03:00:00 (Sun)
  63689684400, #    local_end 2019-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63689677200, #    utc_start 2019-03-31 01:00:00 (Sun)
  63707821200, #      utc_end 2019-10-27 01:00:00 (Sun)
  63689688000, #  local_start 2019-03-31 04:00:00 (Sun)
  63707832000, #    local_end 2019-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63707821200, #    utc_start 2019-10-27 01:00:00 (Sun)
  63721126800, #      utc_end 2020-03-29 01:00:00 (Sun)
  63707828400, #  local_start 2019-10-27 03:00:00 (Sun)
  63721134000, #    local_end 2020-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63721126800, #    utc_start 2020-03-29 01:00:00 (Sun)
  63739270800, #      utc_end 2020-10-25 01:00:00 (Sun)
  63721137600, #  local_start 2020-03-29 04:00:00 (Sun)
  63739281600, #    local_end 2020-10-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63739270800, #    utc_start 2020-10-25 01:00:00 (Sun)
  63752576400, #      utc_end 2021-03-28 01:00:00 (Sun)
  63739278000, #  local_start 2020-10-25 03:00:00 (Sun)
  63752583600, #    local_end 2021-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63752576400, #    utc_start 2021-03-28 01:00:00 (Sun)
  63771325200, #      utc_end 2021-10-31 01:00:00 (Sun)
  63752587200, #  local_start 2021-03-28 04:00:00 (Sun)
  63771336000, #    local_end 2021-10-31 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63771325200, #    utc_start 2021-10-31 01:00:00 (Sun)
  63784026000, #      utc_end 2022-03-27 01:00:00 (Sun)
  63771332400, #  local_start 2021-10-31 03:00:00 (Sun)
  63784033200, #    local_end 2022-03-27 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63784026000, #    utc_start 2022-03-27 01:00:00 (Sun)
  63802774800, #      utc_end 2022-10-30 01:00:00 (Sun)
  63784036800, #  local_start 2022-03-27 04:00:00 (Sun)
  63802785600, #    local_end 2022-10-30 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63802774800, #    utc_start 2022-10-30 01:00:00 (Sun)
  63815475600, #      utc_end 2023-03-26 01:00:00 (Sun)
  63802782000, #  local_start 2022-10-30 03:00:00 (Sun)
  63815482800, #    local_end 2023-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63815475600, #    utc_start 2023-03-26 01:00:00 (Sun)
  63834224400, #      utc_end 2023-10-29 01:00:00 (Sun)
  63815486400, #  local_start 2023-03-26 04:00:00 (Sun)
  63834235200, #    local_end 2023-10-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63834224400, #    utc_start 2023-10-29 01:00:00 (Sun)
  63847530000, #      utc_end 2024-03-31 01:00:00 (Sun)
  63834231600, #  local_start 2023-10-29 03:00:00 (Sun)
  63847537200, #    local_end 2024-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63847530000, #    utc_start 2024-03-31 01:00:00 (Sun)
  63865674000, #      utc_end 2024-10-27 01:00:00 (Sun)
  63847540800, #  local_start 2024-03-31 04:00:00 (Sun)
  63865684800, #    local_end 2024-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63865674000, #    utc_start 2024-10-27 01:00:00 (Sun)
  63878979600, #      utc_end 2025-03-30 01:00:00 (Sun)
  63865681200, #  local_start 2024-10-27 03:00:00 (Sun)
  63878986800, #    local_end 2025-03-30 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63878979600, #    utc_start 2025-03-30 01:00:00 (Sun)
  63897123600, #      utc_end 2025-10-26 01:00:00 (Sun)
  63878990400, #  local_start 2025-03-30 04:00:00 (Sun)
  63897134400, #    local_end 2025-10-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63897123600, #    utc_start 2025-10-26 01:00:00 (Sun)
  63910429200, #      utc_end 2026-03-29 01:00:00 (Sun)
  63897130800, #  local_start 2025-10-26 03:00:00 (Sun)
  63910436400, #    local_end 2026-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63910429200, #    utc_start 2026-03-29 01:00:00 (Sun)
  63928573200, #      utc_end 2026-10-25 01:00:00 (Sun)
  63910440000, #  local_start 2026-03-29 04:00:00 (Sun)
  63928584000, #    local_end 2026-10-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63928573200, #    utc_start 2026-10-25 01:00:00 (Sun)
  63941878800, #      utc_end 2027-03-28 01:00:00 (Sun)
  63928580400, #  local_start 2026-10-25 03:00:00 (Sun)
  63941886000, #    local_end 2027-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63941878800, #    utc_start 2027-03-28 01:00:00 (Sun)
  63960627600, #      utc_end 2027-10-31 01:00:00 (Sun)
  63941889600, #  local_start 2027-03-28 04:00:00 (Sun)
  63960638400, #    local_end 2027-10-31 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63960627600, #    utc_start 2027-10-31 01:00:00 (Sun)
  63973328400, #      utc_end 2028-03-26 01:00:00 (Sun)
  63960634800, #  local_start 2027-10-31 03:00:00 (Sun)
  63973335600, #    local_end 2028-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63973328400, #    utc_start 2028-03-26 01:00:00 (Sun)
  63992077200, #      utc_end 2028-10-29 01:00:00 (Sun)
  63973339200, #  local_start 2028-03-26 04:00:00 (Sun)
  63992088000, #    local_end 2028-10-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63992077200, #    utc_start 2028-10-29 01:00:00 (Sun)
  64004778000, #      utc_end 2029-03-25 01:00:00 (Sun)
  63992084400, #  local_start 2028-10-29 03:00:00 (Sun)
  64004785200, #    local_end 2029-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  64004778000, #    utc_start 2029-03-25 01:00:00 (Sun)
  64023526800, #      utc_end 2029-10-28 01:00:00 (Sun)
  64004788800, #  local_start 2029-03-25 04:00:00 (Sun)
  64023537600, #    local_end 2029-10-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  64023526800, #    utc_start 2029-10-28 01:00:00 (Sun)
  64036832400, #      utc_end 2030-03-31 01:00:00 (Sun)
  64023534000, #  local_start 2029-10-28 03:00:00 (Sun)
  64036839600, #    local_end 2030-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  64036832400, #    utc_start 2030-03-31 01:00:00 (Sun)
  64054976400, #      utc_end 2030-10-27 01:00:00 (Sun)
  64036843200, #  local_start 2030-03-31 04:00:00 (Sun)
  64054987200, #    local_end 2030-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {52}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { 7200 }
  
  my $last_observance = bless( {
    'format' => 'EE%sT',
    'gmtoff' => '2:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 728294,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 728294,
      'utc_rd_secs' => 0,
      'utc_year' => 1996
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => 7200,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 728293,
      'local_rd_secs' => 79200,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 728293,
      'utc_rd_secs' => 79200,
      'utc_year' => 1995
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '1:00u',
      'from' => '1981',
      'in' => 'Mar',
      'letter' => 'S',
      'name' => 'EU',
      'offset_from_std' => 3600,
      'on' => 'lastSun',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '1:00u',
      'from' => '1996',
      'in' => 'Oct',
      'letter' => '',
      'name' => 'EU',
      'offset_from_std' => 0,
      'on' => 'lastSun',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_EUROPE_UZHGOROD

    $main::fatpacked{"DateTime/TimeZone/Europe/Vienna.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_EUROPE_VIENNA';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Europe::Vienna;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Europe::Vienna::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59713628079, #      utc_end 1893-03-31 22:54:39 (Fri)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59713632000, #    local_end 1893-04-01 00:00:00 (Sat)
  3921,
  0,
  'LMT',
      ],
      [
  59713628079, #    utc_start 1893-03-31 22:54:39 (Fri)
  60441976800, #      utc_end 1916-04-30 22:00:00 (Sun)
  59713631679, #  local_start 1893-03-31 23:54:39 (Fri)
  60441980400, #    local_end 1916-04-30 23:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  60441976800, #    utc_start 1916-04-30 22:00:00 (Sun)
  60455199600, #      utc_end 1916-09-30 23:00:00 (Sat)
  60441984000, #  local_start 1916-05-01 00:00:00 (Mon)
  60455206800, #    local_end 1916-10-01 01:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  60455199600, #    utc_start 1916-09-30 23:00:00 (Sat)
  60472227600, #      utc_end 1917-04-16 01:00:00 (Mon)
  60455203200, #  local_start 1916-10-01 00:00:00 (Sun)
  60472231200, #    local_end 1917-04-16 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  60472227600, #    utc_start 1917-04-16 01:00:00 (Mon)
  60485533200, #      utc_end 1917-09-17 01:00:00 (Mon)
  60472234800, #  local_start 1917-04-16 03:00:00 (Mon)
  60485540400, #    local_end 1917-09-17 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  60485533200, #    utc_start 1917-09-17 01:00:00 (Mon)
  60503677200, #      utc_end 1918-04-15 01:00:00 (Mon)
  60485536800, #  local_start 1917-09-17 02:00:00 (Mon)
  60503680800, #    local_end 1918-04-15 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  60503677200, #    utc_start 1918-04-15 01:00:00 (Mon)
  60516982800, #      utc_end 1918-09-16 01:00:00 (Mon)
  60503684400, #  local_start 1918-04-15 03:00:00 (Mon)
  60516990000, #    local_end 1918-09-16 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  60516982800, #    utc_start 1918-09-16 01:00:00 (Mon)
  60557756400, #      utc_end 1919-12-31 23:00:00 (Wed)
  60516986400, #  local_start 1918-09-16 02:00:00 (Mon)
  60557760000, #    local_end 1920-01-01 00:00:00 (Thu)
  3600,
  0,
  'CET',
      ],
      [
  60557756400, #    utc_start 1919-12-31 23:00:00 (Wed)
  60565971600, #      utc_end 1920-04-05 01:00:00 (Mon)
  60557760000, #  local_start 1920-01-01 00:00:00 (Thu)
  60565975200, #    local_end 1920-04-05 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  60565971600, #    utc_start 1920-04-05 01:00:00 (Mon)
  60579882000, #      utc_end 1920-09-13 01:00:00 (Mon)
  60565978800, #  local_start 1920-04-05 03:00:00 (Mon)
  60579889200, #    local_end 1920-09-13 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  60579882000, #    utc_start 1920-09-13 01:00:00 (Mon)
  61196778000, #      utc_end 1940-04-01 01:00:00 (Mon)
  60579885600, #  local_start 1920-09-13 02:00:00 (Mon)
  61196781600, #    local_end 1940-04-01 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61196778000, #    utc_start 1940-04-01 01:00:00 (Mon)
  61278426000, #      utc_end 1942-11-02 01:00:00 (Mon)
  61196785200, #  local_start 1940-04-01 03:00:00 (Mon)
  61278433200, #    local_end 1942-11-02 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61278426000, #    utc_start 1942-11-02 01:00:00 (Mon)
  61291126800, #      utc_end 1943-03-29 01:00:00 (Mon)
  61278429600, #  local_start 1942-11-02 02:00:00 (Mon)
  61291130400, #    local_end 1943-03-29 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61291126800, #    utc_start 1943-03-29 01:00:00 (Mon)
  61307456400, #      utc_end 1943-10-04 01:00:00 (Mon)
  61291134000, #  local_start 1943-03-29 03:00:00 (Mon)
  61307463600, #    local_end 1943-10-04 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61307456400, #    utc_start 1943-10-04 01:00:00 (Mon)
  61323181200, #      utc_end 1944-04-03 01:00:00 (Mon)
  61307460000, #  local_start 1943-10-04 02:00:00 (Mon)
  61323184800, #    local_end 1944-04-03 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61323181200, #    utc_start 1944-04-03 01:00:00 (Mon)
  61338906000, #      utc_end 1944-10-02 01:00:00 (Mon)
  61323188400, #  local_start 1944-04-03 03:00:00 (Mon)
  61338913200, #    local_end 1944-10-02 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61338906000, #    utc_start 1944-10-02 01:00:00 (Mon)
  61354630800, #      utc_end 1945-04-02 01:00:00 (Mon)
  61338909600, #  local_start 1944-10-02 02:00:00 (Mon)
  61354634400, #    local_end 1945-04-02 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61354630800, #    utc_start 1945-04-02 01:00:00 (Mon)
  61355494800, #      utc_end 1945-04-12 01:00:00 (Thu)
  61354638000, #  local_start 1945-04-02 03:00:00 (Mon)
  61355502000, #    local_end 1945-04-12 03:00:00 (Thu)
  7200,
  1,
  'CEST',
      ],
      [
  61355494800, #    utc_start 1945-04-12 01:00:00 (Thu)
  61378297200, #      utc_end 1945-12-31 23:00:00 (Mon)
  61355498400, #  local_start 1945-04-12 02:00:00 (Thu)
  61378300800, #    local_end 1946-01-01 00:00:00 (Tue)
  3600,
  0,
  'CET',
      ],
      [
  61378297200, #    utc_start 1945-12-31 23:00:00 (Mon)
  61387203600, #      utc_end 1946-04-14 01:00:00 (Sun)
  61378300800, #  local_start 1946-01-01 00:00:00 (Tue)
  61387207200, #    local_end 1946-04-14 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  61387203600, #    utc_start 1946-04-14 01:00:00 (Sun)
  61402323600, #      utc_end 1946-10-06 01:00:00 (Sun)
  61387210800, #  local_start 1946-04-14 03:00:00 (Sun)
  61402330800, #    local_end 1946-10-06 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  61402323600, #    utc_start 1946-10-06 01:00:00 (Sun)
  61418048400, #      utc_end 1947-04-06 01:00:00 (Sun)
  61402327200, #  local_start 1946-10-06 02:00:00 (Sun)
  61418052000, #    local_end 1947-04-06 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  61418048400, #    utc_start 1947-04-06 01:00:00 (Sun)
  61433773200, #      utc_end 1947-10-05 01:00:00 (Sun)
  61418055600, #  local_start 1947-04-06 03:00:00 (Sun)
  61433780400, #    local_end 1947-10-05 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  61433773200, #    utc_start 1947-10-05 01:00:00 (Sun)
  61450707600, #      utc_end 1948-04-18 01:00:00 (Sun)
  61433776800, #  local_start 1947-10-05 02:00:00 (Sun)
  61450711200, #    local_end 1948-04-18 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  61450707600, #    utc_start 1948-04-18 01:00:00 (Sun)
  61465222800, #      utc_end 1948-10-03 01:00:00 (Sun)
  61450714800, #  local_start 1948-04-18 03:00:00 (Sun)
  61465230000, #    local_end 1948-10-03 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  61465222800, #    utc_start 1948-10-03 01:00:00 (Sun)
  62459506800, #      utc_end 1980-04-05 23:00:00 (Sat)
  61465226400, #  local_start 1948-10-03 02:00:00 (Sun)
  62459510400, #    local_end 1980-04-06 00:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62459506800, #    utc_start 1980-04-05 23:00:00 (Sat)
  62474623200, #      utc_end 1980-09-27 22:00:00 (Sat)
  62459514000, #  local_start 1980-04-06 01:00:00 (Sun)
  62474630400, #    local_end 1980-09-28 00:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62474623200, #    utc_start 1980-09-27 22:00:00 (Sat)
  62482834800, #      utc_end 1980-12-31 23:00:00 (Wed)
  62474626800, #  local_start 1980-09-27 23:00:00 (Sat)
  62482838400, #    local_end 1981-01-01 00:00:00 (Thu)
  3600,
  0,
  'CET',
      ],
      [
  62482834800, #    utc_start 1980-12-31 23:00:00 (Wed)
  62490358800, #      utc_end 1981-03-29 01:00:00 (Sun)
  62482838400, #  local_start 1981-01-01 00:00:00 (Thu)
  62490362400, #    local_end 1981-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62490358800, #    utc_start 1981-03-29 01:00:00 (Sun)
  62506083600, #      utc_end 1981-09-27 01:00:00 (Sun)
  62490366000, #  local_start 1981-03-29 03:00:00 (Sun)
  62506090800, #    local_end 1981-09-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62506083600, #    utc_start 1981-09-27 01:00:00 (Sun)
  62521808400, #      utc_end 1982-03-28 01:00:00 (Sun)
  62506087200, #  local_start 1981-09-27 02:00:00 (Sun)
  62521812000, #    local_end 1982-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62521808400, #    utc_start 1982-03-28 01:00:00 (Sun)
  62537533200, #      utc_end 1982-09-26 01:00:00 (Sun)
  62521815600, #  local_start 1982-03-28 03:00:00 (Sun)
  62537540400, #    local_end 1982-09-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62537533200, #    utc_start 1982-09-26 01:00:00 (Sun)
  62553258000, #      utc_end 1983-03-27 01:00:00 (Sun)
  62537536800, #  local_start 1982-09-26 02:00:00 (Sun)
  62553261600, #    local_end 1983-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62553258000, #    utc_start 1983-03-27 01:00:00 (Sun)
  62568982800, #      utc_end 1983-09-25 01:00:00 (Sun)
  62553265200, #  local_start 1983-03-27 03:00:00 (Sun)
  62568990000, #    local_end 1983-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62568982800, #    utc_start 1983-09-25 01:00:00 (Sun)
  62584707600, #      utc_end 1984-03-25 01:00:00 (Sun)
  62568986400, #  local_start 1983-09-25 02:00:00 (Sun)
  62584711200, #    local_end 1984-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62584707600, #    utc_start 1984-03-25 01:00:00 (Sun)
  62601037200, #      utc_end 1984-09-30 01:00:00 (Sun)
  62584714800, #  local_start 1984-03-25 03:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62601037200, #    utc_start 1984-09-30 01:00:00 (Sun)
  62616762000, #      utc_end 1985-03-31 01:00:00 (Sun)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62616762000, #    utc_start 1985-03-31 01:00:00 (Sun)
  62632486800, #      utc_end 1985-09-29 01:00:00 (Sun)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62632486800, #    utc_start 1985-09-29 01:00:00 (Sun)
  62648211600, #      utc_end 1986-03-30 01:00:00 (Sun)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62648211600, #    utc_start 1986-03-30 01:00:00 (Sun)
  62663936400, #      utc_end 1986-09-28 01:00:00 (Sun)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62663936400, #    utc_start 1986-09-28 01:00:00 (Sun)
  62679661200, #      utc_end 1987-03-29 01:00:00 (Sun)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62679661200, #    utc_start 1987-03-29 01:00:00 (Sun)
  62695386000, #      utc_end 1987-09-27 01:00:00 (Sun)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62695386000, #    utc_start 1987-09-27 01:00:00 (Sun)
  62711110800, #      utc_end 1988-03-27 01:00:00 (Sun)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62711110800, #    utc_start 1988-03-27 01:00:00 (Sun)
  62726835600, #      utc_end 1988-09-25 01:00:00 (Sun)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62726835600, #    utc_start 1988-09-25 01:00:00 (Sun)
  62742560400, #      utc_end 1989-03-26 01:00:00 (Sun)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62742560400, #    utc_start 1989-03-26 01:00:00 (Sun)
  62758285200, #      utc_end 1989-09-24 01:00:00 (Sun)
  62742567600, #  local_start 1989-03-26 03:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62758285200, #    utc_start 1989-09-24 01:00:00 (Sun)
  62774010000, #      utc_end 1990-03-25 01:00:00 (Sun)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62774010000, #    utc_start 1990-03-25 01:00:00 (Sun)
  62790339600, #      utc_end 1990-09-30 01:00:00 (Sun)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62790339600, #    utc_start 1990-09-30 01:00:00 (Sun)
  62806064400, #      utc_end 1991-03-31 01:00:00 (Sun)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62806064400, #    utc_start 1991-03-31 01:00:00 (Sun)
  62821789200, #      utc_end 1991-09-29 01:00:00 (Sun)
  62806071600, #  local_start 1991-03-31 03:00:00 (Sun)
  62821796400, #    local_end 1991-09-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62821789200, #    utc_start 1991-09-29 01:00:00 (Sun)
  62837514000, #      utc_end 1992-03-29 01:00:00 (Sun)
  62821792800, #  local_start 1991-09-29 02:00:00 (Sun)
  62837517600, #    local_end 1992-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62837514000, #    utc_start 1992-03-29 01:00:00 (Sun)
  62853238800, #      utc_end 1992-09-27 01:00:00 (Sun)
  62837521200, #  local_start 1992-03-29 03:00:00 (Sun)
  62853246000, #    local_end 1992-09-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62853238800, #    utc_start 1992-09-27 01:00:00 (Sun)
  62868963600, #      utc_end 1993-03-28 01:00:00 (Sun)
  62853242400, #  local_start 1992-09-27 02:00:00 (Sun)
  62868967200, #    local_end 1993-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62868963600, #    utc_start 1993-03-28 01:00:00 (Sun)
  62884688400, #      utc_end 1993-09-26 01:00:00 (Sun)
  62868970800, #  local_start 1993-03-28 03:00:00 (Sun)
  62884695600, #    local_end 1993-09-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62884688400, #    utc_start 1993-09-26 01:00:00 (Sun)
  62900413200, #      utc_end 1994-03-27 01:00:00 (Sun)
  62884692000, #  local_start 1993-09-26 02:00:00 (Sun)
  62900416800, #    local_end 1994-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62900413200, #    utc_start 1994-03-27 01:00:00 (Sun)
  62916138000, #      utc_end 1994-09-25 01:00:00 (Sun)
  62900420400, #  local_start 1994-03-27 03:00:00 (Sun)
  62916145200, #    local_end 1994-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62916138000, #    utc_start 1994-09-25 01:00:00 (Sun)
  62931862800, #      utc_end 1995-03-26 01:00:00 (Sun)
  62916141600, #  local_start 1994-09-25 02:00:00 (Sun)
  62931866400, #    local_end 1995-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62931862800, #    utc_start 1995-03-26 01:00:00 (Sun)
  62947587600, #      utc_end 1995-09-24 01:00:00 (Sun)
  62931870000, #  local_start 1995-03-26 03:00:00 (Sun)
  62947594800, #    local_end 1995-09-24 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62947587600, #    utc_start 1995-09-24 01:00:00 (Sun)
  62963917200, #      utc_end 1996-03-31 01:00:00 (Sun)
  62947591200, #  local_start 1995-09-24 02:00:00 (Sun)
  62963920800, #    local_end 1996-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62963917200, #    utc_start 1996-03-31 01:00:00 (Sun)
  62982061200, #      utc_end 1996-10-27 01:00:00 (Sun)
  62963924400, #  local_start 1996-03-31 03:00:00 (Sun)
  62982068400, #    local_end 1996-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62982061200, #    utc_start 1996-10-27 01:00:00 (Sun)
  62995366800, #      utc_end 1997-03-30 01:00:00 (Sun)
  62982064800, #  local_start 1996-10-27 02:00:00 (Sun)
  62995370400, #    local_end 1997-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62995366800, #    utc_start 1997-03-30 01:00:00 (Sun)
  63013510800, #      utc_end 1997-10-26 01:00:00 (Sun)
  62995374000, #  local_start 1997-03-30 03:00:00 (Sun)
  63013518000, #    local_end 1997-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63013510800, #    utc_start 1997-10-26 01:00:00 (Sun)
  63026816400, #      utc_end 1998-03-29 01:00:00 (Sun)
  63013514400, #  local_start 1997-10-26 02:00:00 (Sun)
  63026820000, #    local_end 1998-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63026816400, #    utc_start 1998-03-29 01:00:00 (Sun)
  63044960400, #      utc_end 1998-10-25 01:00:00 (Sun)
  63026823600, #  local_start 1998-03-29 03:00:00 (Sun)
  63044967600, #    local_end 1998-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63044960400, #    utc_start 1998-10-25 01:00:00 (Sun)
  63058266000, #      utc_end 1999-03-28 01:00:00 (Sun)
  63044964000, #  local_start 1998-10-25 02:00:00 (Sun)
  63058269600, #    local_end 1999-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63058266000, #    utc_start 1999-03-28 01:00:00 (Sun)
  63077014800, #      utc_end 1999-10-31 01:00:00 (Sun)
  63058273200, #  local_start 1999-03-28 03:00:00 (Sun)
  63077022000, #    local_end 1999-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63077014800, #    utc_start 1999-10-31 01:00:00 (Sun)
  63089715600, #      utc_end 2000-03-26 01:00:00 (Sun)
  63077018400, #  local_start 1999-10-31 02:00:00 (Sun)
  63089719200, #    local_end 2000-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63089715600, #    utc_start 2000-03-26 01:00:00 (Sun)
  63108464400, #      utc_end 2000-10-29 01:00:00 (Sun)
  63089722800, #  local_start 2000-03-26 03:00:00 (Sun)
  63108471600, #    local_end 2000-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63108464400, #    utc_start 2000-10-29 01:00:00 (Sun)
  63121165200, #      utc_end 2001-03-25 01:00:00 (Sun)
  63108468000, #  local_start 2000-10-29 02:00:00 (Sun)
  63121168800, #    local_end 2001-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63121165200, #    utc_start 2001-03-25 01:00:00 (Sun)
  63139914000, #      utc_end 2001-10-28 01:00:00 (Sun)
  63121172400, #  local_start 2001-03-25 03:00:00 (Sun)
  63139921200, #    local_end 2001-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63139914000, #    utc_start 2001-10-28 01:00:00 (Sun)
  63153219600, #      utc_end 2002-03-31 01:00:00 (Sun)
  63139917600, #  local_start 2001-10-28 02:00:00 (Sun)
  63153223200, #    local_end 2002-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63153219600, #    utc_start 2002-03-31 01:00:00 (Sun)
  63171363600, #      utc_end 2002-10-27 01:00:00 (Sun)
  63153226800, #  local_start 2002-03-31 03:00:00 (Sun)
  63171370800, #    local_end 2002-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63171363600, #    utc_start 2002-10-27 01:00:00 (Sun)
  63184669200, #      utc_end 2003-03-30 01:00:00 (Sun)
  63171367200, #  local_start 2002-10-27 02:00:00 (Sun)
  63184672800, #    local_end 2003-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63184669200, #    utc_start 2003-03-30 01:00:00 (Sun)
  63202813200, #      utc_end 2003-10-26 01:00:00 (Sun)
  63184676400, #  local_start 2003-03-30 03:00:00 (Sun)
  63202820400, #    local_end 2003-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63202813200, #    utc_start 2003-10-26 01:00:00 (Sun)
  63216118800, #      utc_end 2004-03-28 01:00:00 (Sun)
  63202816800, #  local_start 2003-10-26 02:00:00 (Sun)
  63216122400, #    local_end 2004-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63216118800, #    utc_start 2004-03-28 01:00:00 (Sun)
  63234867600, #      utc_end 2004-10-31 01:00:00 (Sun)
  63216126000, #  local_start 2004-03-28 03:00:00 (Sun)
  63234874800, #    local_end 2004-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63234867600, #    utc_start 2004-10-31 01:00:00 (Sun)
  63247568400, #      utc_end 2005-03-27 01:00:00 (Sun)
  63234871200, #  local_start 2004-10-31 02:00:00 (Sun)
  63247572000, #    local_end 2005-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63247568400, #    utc_start 2005-03-27 01:00:00 (Sun)
  63266317200, #      utc_end 2005-10-30 01:00:00 (Sun)
  63247575600, #  local_start 2005-03-27 03:00:00 (Sun)
  63266324400, #    local_end 2005-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63266317200, #    utc_start 2005-10-30 01:00:00 (Sun)
  63279018000, #      utc_end 2006-03-26 01:00:00 (Sun)
  63266320800, #  local_start 2005-10-30 02:00:00 (Sun)
  63279021600, #    local_end 2006-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63279018000, #    utc_start 2006-03-26 01:00:00 (Sun)
  63297766800, #      utc_end 2006-10-29 01:00:00 (Sun)
  63279025200, #  local_start 2006-03-26 03:00:00 (Sun)
  63297774000, #    local_end 2006-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63297766800, #    utc_start 2006-10-29 01:00:00 (Sun)
  63310467600, #      utc_end 2007-03-25 01:00:00 (Sun)
  63297770400, #  local_start 2006-10-29 02:00:00 (Sun)
  63310471200, #    local_end 2007-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63310467600, #    utc_start 2007-03-25 01:00:00 (Sun)
  63329216400, #      utc_end 2007-10-28 01:00:00 (Sun)
  63310474800, #  local_start 2007-03-25 03:00:00 (Sun)
  63329223600, #    local_end 2007-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63329216400, #    utc_start 2007-10-28 01:00:00 (Sun)
  63342522000, #      utc_end 2008-03-30 01:00:00 (Sun)
  63329220000, #  local_start 2007-10-28 02:00:00 (Sun)
  63342525600, #    local_end 2008-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63342522000, #    utc_start 2008-03-30 01:00:00 (Sun)
  63360666000, #      utc_end 2008-10-26 01:00:00 (Sun)
  63342529200, #  local_start 2008-03-30 03:00:00 (Sun)
  63360673200, #    local_end 2008-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63360666000, #    utc_start 2008-10-26 01:00:00 (Sun)
  63373971600, #      utc_end 2009-03-29 01:00:00 (Sun)
  63360669600, #  local_start 2008-10-26 02:00:00 (Sun)
  63373975200, #    local_end 2009-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63373971600, #    utc_start 2009-03-29 01:00:00 (Sun)
  63392115600, #      utc_end 2009-10-25 01:00:00 (Sun)
  63373978800, #  local_start 2009-03-29 03:00:00 (Sun)
  63392122800, #    local_end 2009-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63392115600, #    utc_start 2009-10-25 01:00:00 (Sun)
  63405421200, #      utc_end 2010-03-28 01:00:00 (Sun)
  63392119200, #  local_start 2009-10-25 02:00:00 (Sun)
  63405424800, #    local_end 2010-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63405421200, #    utc_start 2010-03-28 01:00:00 (Sun)
  63424170000, #      utc_end 2010-10-31 01:00:00 (Sun)
  63405428400, #  local_start 2010-03-28 03:00:00 (Sun)
  63424177200, #    local_end 2010-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63424170000, #    utc_start 2010-10-31 01:00:00 (Sun)
  63436870800, #      utc_end 2011-03-27 01:00:00 (Sun)
  63424173600, #  local_start 2010-10-31 02:00:00 (Sun)
  63436874400, #    local_end 2011-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63436870800, #    utc_start 2011-03-27 01:00:00 (Sun)
  63455619600, #      utc_end 2011-10-30 01:00:00 (Sun)
  63436878000, #  local_start 2011-03-27 03:00:00 (Sun)
  63455626800, #    local_end 2011-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63455619600, #    utc_start 2011-10-30 01:00:00 (Sun)
  63468320400, #      utc_end 2012-03-25 01:00:00 (Sun)
  63455623200, #  local_start 2011-10-30 02:00:00 (Sun)
  63468324000, #    local_end 2012-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63468320400, #    utc_start 2012-03-25 01:00:00 (Sun)
  63487069200, #      utc_end 2012-10-28 01:00:00 (Sun)
  63468327600, #  local_start 2012-03-25 03:00:00 (Sun)
  63487076400, #    local_end 2012-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63487069200, #    utc_start 2012-10-28 01:00:00 (Sun)
  63500374800, #      utc_end 2013-03-31 01:00:00 (Sun)
  63487072800, #  local_start 2012-10-28 02:00:00 (Sun)
  63500378400, #    local_end 2013-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63500374800, #    utc_start 2013-03-31 01:00:00 (Sun)
  63518518800, #      utc_end 2013-10-27 01:00:00 (Sun)
  63500382000, #  local_start 2013-03-31 03:00:00 (Sun)
  63518526000, #    local_end 2013-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63518518800, #    utc_start 2013-10-27 01:00:00 (Sun)
  63531824400, #      utc_end 2014-03-30 01:00:00 (Sun)
  63518522400, #  local_start 2013-10-27 02:00:00 (Sun)
  63531828000, #    local_end 2014-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63531824400, #    utc_start 2014-03-30 01:00:00 (Sun)
  63549968400, #      utc_end 2014-10-26 01:00:00 (Sun)
  63531831600, #  local_start 2014-03-30 03:00:00 (Sun)
  63549975600, #    local_end 2014-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63549968400, #    utc_start 2014-10-26 01:00:00 (Sun)
  63563274000, #      utc_end 2015-03-29 01:00:00 (Sun)
  63549972000, #  local_start 2014-10-26 02:00:00 (Sun)
  63563277600, #    local_end 2015-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63563274000, #    utc_start 2015-03-29 01:00:00 (Sun)
  63581418000, #      utc_end 2015-10-25 01:00:00 (Sun)
  63563281200, #  local_start 2015-03-29 03:00:00 (Sun)
  63581425200, #    local_end 2015-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63581418000, #    utc_start 2015-10-25 01:00:00 (Sun)
  63594723600, #      utc_end 2016-03-27 01:00:00 (Sun)
  63581421600, #  local_start 2015-10-25 02:00:00 (Sun)
  63594727200, #    local_end 2016-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63594723600, #    utc_start 2016-03-27 01:00:00 (Sun)
  63613472400, #      utc_end 2016-10-30 01:00:00 (Sun)
  63594730800, #  local_start 2016-03-27 03:00:00 (Sun)
  63613479600, #    local_end 2016-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63613472400, #    utc_start 2016-10-30 01:00:00 (Sun)
  63626173200, #      utc_end 2017-03-26 01:00:00 (Sun)
  63613476000, #  local_start 2016-10-30 02:00:00 (Sun)
  63626176800, #    local_end 2017-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63626173200, #    utc_start 2017-03-26 01:00:00 (Sun)
  63644922000, #      utc_end 2017-10-29 01:00:00 (Sun)
  63626180400, #  local_start 2017-03-26 03:00:00 (Sun)
  63644929200, #    local_end 2017-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63644922000, #    utc_start 2017-10-29 01:00:00 (Sun)
  63657622800, #      utc_end 2018-03-25 01:00:00 (Sun)
  63644925600, #  local_start 2017-10-29 02:00:00 (Sun)
  63657626400, #    local_end 2018-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63657622800, #    utc_start 2018-03-25 01:00:00 (Sun)
  63676371600, #      utc_end 2018-10-28 01:00:00 (Sun)
  63657630000, #  local_start 2018-03-25 03:00:00 (Sun)
  63676378800, #    local_end 2018-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63676371600, #    utc_start 2018-10-28 01:00:00 (Sun)
  63689677200, #      utc_end 2019-03-31 01:00:00 (Sun)
  63676375200, #  local_start 2018-10-28 02:00:00 (Sun)
  63689680800, #    local_end 2019-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63689677200, #    utc_start 2019-03-31 01:00:00 (Sun)
  63707821200, #      utc_end 2019-10-27 01:00:00 (Sun)
  63689684400, #  local_start 2019-03-31 03:00:00 (Sun)
  63707828400, #    local_end 2019-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63707821200, #    utc_start 2019-10-27 01:00:00 (Sun)
  63721126800, #      utc_end 2020-03-29 01:00:00 (Sun)
  63707824800, #  local_start 2019-10-27 02:00:00 (Sun)
  63721130400, #    local_end 2020-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63721126800, #    utc_start 2020-03-29 01:00:00 (Sun)
  63739270800, #      utc_end 2020-10-25 01:00:00 (Sun)
  63721134000, #  local_start 2020-03-29 03:00:00 (Sun)
  63739278000, #    local_end 2020-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63739270800, #    utc_start 2020-10-25 01:00:00 (Sun)
  63752576400, #      utc_end 2021-03-28 01:00:00 (Sun)
  63739274400, #  local_start 2020-10-25 02:00:00 (Sun)
  63752580000, #    local_end 2021-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63752576400, #    utc_start 2021-03-28 01:00:00 (Sun)
  63771325200, #      utc_end 2021-10-31 01:00:00 (Sun)
  63752583600, #  local_start 2021-03-28 03:00:00 (Sun)
  63771332400, #    local_end 2021-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63771325200, #    utc_start 2021-10-31 01:00:00 (Sun)
  63784026000, #      utc_end 2022-03-27 01:00:00 (Sun)
  63771328800, #  local_start 2021-10-31 02:00:00 (Sun)
  63784029600, #    local_end 2022-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63784026000, #    utc_start 2022-03-27 01:00:00 (Sun)
  63802774800, #      utc_end 2022-10-30 01:00:00 (Sun)
  63784033200, #  local_start 2022-03-27 03:00:00 (Sun)
  63802782000, #    local_end 2022-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63802774800, #    utc_start 2022-10-30 01:00:00 (Sun)
  63815475600, #      utc_end 2023-03-26 01:00:00 (Sun)
  63802778400, #  local_start 2022-10-30 02:00:00 (Sun)
  63815479200, #    local_end 2023-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63815475600, #    utc_start 2023-03-26 01:00:00 (Sun)
  63834224400, #      utc_end 2023-10-29 01:00:00 (Sun)
  63815482800, #  local_start 2023-03-26 03:00:00 (Sun)
  63834231600, #    local_end 2023-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63834224400, #    utc_start 2023-10-29 01:00:00 (Sun)
  63847530000, #      utc_end 2024-03-31 01:00:00 (Sun)
  63834228000, #  local_start 2023-10-29 02:00:00 (Sun)
  63847533600, #    local_end 2024-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63847530000, #    utc_start 2024-03-31 01:00:00 (Sun)
  63865674000, #      utc_end 2024-10-27 01:00:00 (Sun)
  63847537200, #  local_start 2024-03-31 03:00:00 (Sun)
  63865681200, #    local_end 2024-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63865674000, #    utc_start 2024-10-27 01:00:00 (Sun)
  63878979600, #      utc_end 2025-03-30 01:00:00 (Sun)
  63865677600, #  local_start 2024-10-27 02:00:00 (Sun)
  63878983200, #    local_end 2025-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63878979600, #    utc_start 2025-03-30 01:00:00 (Sun)
  63897123600, #      utc_end 2025-10-26 01:00:00 (Sun)
  63878986800, #  local_start 2025-03-30 03:00:00 (Sun)
  63897130800, #    local_end 2025-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63897123600, #    utc_start 2025-10-26 01:00:00 (Sun)
  63910429200, #      utc_end 2026-03-29 01:00:00 (Sun)
  63897127200, #  local_start 2025-10-26 02:00:00 (Sun)
  63910432800, #    local_end 2026-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63910429200, #    utc_start 2026-03-29 01:00:00 (Sun)
  63928573200, #      utc_end 2026-10-25 01:00:00 (Sun)
  63910436400, #  local_start 2026-03-29 03:00:00 (Sun)
  63928580400, #    local_end 2026-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63928573200, #    utc_start 2026-10-25 01:00:00 (Sun)
  63941878800, #      utc_end 2027-03-28 01:00:00 (Sun)
  63928576800, #  local_start 2026-10-25 02:00:00 (Sun)
  63941882400, #    local_end 2027-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63941878800, #    utc_start 2027-03-28 01:00:00 (Sun)
  63960627600, #      utc_end 2027-10-31 01:00:00 (Sun)
  63941886000, #  local_start 2027-03-28 03:00:00 (Sun)
  63960634800, #    local_end 2027-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63960627600, #    utc_start 2027-10-31 01:00:00 (Sun)
  63973328400, #      utc_end 2028-03-26 01:00:00 (Sun)
  63960631200, #  local_start 2027-10-31 02:00:00 (Sun)
  63973332000, #    local_end 2028-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63973328400, #    utc_start 2028-03-26 01:00:00 (Sun)
  63992077200, #      utc_end 2028-10-29 01:00:00 (Sun)
  63973335600, #  local_start 2028-03-26 03:00:00 (Sun)
  63992084400, #    local_end 2028-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63992077200, #    utc_start 2028-10-29 01:00:00 (Sun)
  64004778000, #      utc_end 2029-03-25 01:00:00 (Sun)
  63992080800, #  local_start 2028-10-29 02:00:00 (Sun)
  64004781600, #    local_end 2029-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  64004778000, #    utc_start 2029-03-25 01:00:00 (Sun)
  64023526800, #      utc_end 2029-10-28 01:00:00 (Sun)
  64004785200, #  local_start 2029-03-25 03:00:00 (Sun)
  64023534000, #    local_end 2029-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  64023526800, #    utc_start 2029-10-28 01:00:00 (Sun)
  64036832400, #      utc_end 2030-03-31 01:00:00 (Sun)
  64023530400, #  local_start 2029-10-28 02:00:00 (Sun)
  64036836000, #    local_end 2030-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  64036832400, #    utc_start 2030-03-31 01:00:00 (Sun)
  64054976400, #      utc_end 2030-10-27 01:00:00 (Sun)
  64036839600, #  local_start 2030-03-31 03:00:00 (Sun)
  64054983600, #    local_end 2030-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {62}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { 3600 }
  
  my $last_observance = bless( {
    'format' => 'CE%sT',
    'gmtoff' => '1:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 723181,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 723181,
      'utc_rd_secs' => 0,
      'utc_year' => 1982
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => 3600,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 723180,
      'local_rd_secs' => 82800,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 723180,
      'utc_rd_secs' => 82800,
      'utc_year' => 1981
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '1:00u',
      'from' => '1981',
      'in' => 'Mar',
      'letter' => 'S',
      'name' => 'EU',
      'offset_from_std' => 3600,
      'on' => 'lastSun',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '1:00u',
      'from' => '1996',
      'in' => 'Oct',
      'letter' => '',
      'name' => 'EU',
      'offset_from_std' => 0,
      'on' => 'lastSun',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_EUROPE_VIENNA

    $main::fatpacked{"DateTime/TimeZone/Europe/Vilnius.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_EUROPE_VILNIUS';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Europe::Vilnius;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Europe::Vilnius::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59295536324, #      utc_end 1879-12-31 22:18:44 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59295542400, #    local_end 1880-01-01 00:00:00 (Thu)
  6076,
  0,
  'LMT',
      ],
      [
  59295536324, #    utc_start 1879-12-31 22:18:44 (Wed)
  60463146960, #      utc_end 1916-12-31 22:36:00 (Sun)
  59295541364, #  local_start 1879-12-31 23:42:44 (Wed)
  60463152000, #    local_end 1917-01-01 00:00:00 (Mon)
  5040,
  0,
  'WMT',
      ],
      [
  60463146960, #    utc_start 1916-12-31 22:36:00 (Sun)
  60550583064, #      utc_end 1919-10-09 22:24:24 (Thu)
  60463152696, #  local_start 1917-01-01 00:11:36 (Mon)
  60550588800, #    local_end 1919-10-10 00:00:00 (Fri)
  5736,
  0,
  'KMT',
      ],
      [
  60550583064, #    utc_start 1919-10-09 22:24:24 (Thu)
  60574431600, #      utc_end 1920-07-11 23:00:00 (Sun)
  60550586664, #  local_start 1919-10-09 23:24:24 (Thu)
  60574435200, #    local_end 1920-07-12 00:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  60574431600, #    utc_start 1920-07-11 23:00:00 (Sun)
  60582117600, #      utc_end 1920-10-08 22:00:00 (Fri)
  60574438800, #  local_start 1920-07-12 01:00:00 (Mon)
  60582124800, #    local_end 1920-10-09 00:00:00 (Sat)
  7200,
  0,
  'EET',
      ],
      [
  60582117600, #    utc_start 1920-10-08 22:00:00 (Fri)
  61207484400, #      utc_end 1940-08-02 23:00:00 (Fri)
  60582121200, #  local_start 1920-10-08 23:00:00 (Fri)
  61207488000, #    local_end 1940-08-03 00:00:00 (Sat)
  3600,
  0,
  'CET',
      ],
      [
  61207484400, #    utc_start 1940-08-02 23:00:00 (Fri)
  61235557200, #      utc_end 1941-06-23 21:00:00 (Mon)
  61207495200, #  local_start 1940-08-03 02:00:00 (Sat)
  61235568000, #    local_end 1941-06-24 00:00:00 (Tue)
  10800,
  0,
  'MSK',
      ],
      [
  61235557200, #    utc_start 1941-06-23 21:00:00 (Mon)
  61278426000, #      utc_end 1942-11-02 01:00:00 (Mon)
  61235564400, #  local_start 1941-06-23 23:00:00 (Mon)
  61278433200, #    local_end 1942-11-02 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61278426000, #    utc_start 1942-11-02 01:00:00 (Mon)
  61291126800, #      utc_end 1943-03-29 01:00:00 (Mon)
  61278429600, #  local_start 1942-11-02 02:00:00 (Mon)
  61291130400, #    local_end 1943-03-29 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61291126800, #    utc_start 1943-03-29 01:00:00 (Mon)
  61307456400, #      utc_end 1943-10-04 01:00:00 (Mon)
  61291134000, #  local_start 1943-03-29 03:00:00 (Mon)
  61307463600, #    local_end 1943-10-04 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61307456400, #    utc_start 1943-10-04 01:00:00 (Mon)
  61323181200, #      utc_end 1944-04-03 01:00:00 (Mon)
  61307460000, #  local_start 1943-10-04 02:00:00 (Mon)
  61323184800, #    local_end 1944-04-03 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61323181200, #    utc_start 1944-04-03 01:00:00 (Mon)
  61333538400, #      utc_end 1944-07-31 22:00:00 (Mon)
  61323188400, #  local_start 1944-04-03 03:00:00 (Mon)
  61333545600, #    local_end 1944-08-01 00:00:00 (Tue)
  7200,
  1,
  'CEST',
      ],
      [
  61333538400, #    utc_start 1944-07-31 22:00:00 (Mon)
  62490603600, #      utc_end 1981-03-31 21:00:00 (Tue)
  61333549200, #  local_start 1944-08-01 01:00:00 (Tue)
  62490614400, #    local_end 1981-04-01 00:00:00 (Wed)
  10800,
  0,
  'MSK',
      ],
      [
  62490603600, #    utc_start 1981-03-31 21:00:00 (Tue)
  62506411200, #      utc_end 1981-09-30 20:00:00 (Wed)
  62490618000, #  local_start 1981-04-01 01:00:00 (Wed)
  62506425600, #    local_end 1981-10-01 00:00:00 (Thu)
  14400,
  1,
  'MSD',
      ],
      [
  62506411200, #    utc_start 1981-09-30 20:00:00 (Wed)
  62522139600, #      utc_end 1982-03-31 21:00:00 (Wed)
  62506422000, #  local_start 1981-09-30 23:00:00 (Wed)
  62522150400, #    local_end 1982-04-01 00:00:00 (Thu)
  10800,
  0,
  'MSK',
      ],
      [
  62522139600, #    utc_start 1982-03-31 21:00:00 (Wed)
  62537947200, #      utc_end 1982-09-30 20:00:00 (Thu)
  62522154000, #  local_start 1982-04-01 01:00:00 (Thu)
  62537961600, #    local_end 1982-10-01 00:00:00 (Fri)
  14400,
  1,
  'MSD',
      ],
      [
  62537947200, #    utc_start 1982-09-30 20:00:00 (Thu)
  62553675600, #      utc_end 1983-03-31 21:00:00 (Thu)
  62537958000, #  local_start 1982-09-30 23:00:00 (Thu)
  62553686400, #    local_end 1983-04-01 00:00:00 (Fri)
  10800,
  0,
  'MSK',
      ],
      [
  62553675600, #    utc_start 1983-03-31 21:00:00 (Thu)
  62569483200, #      utc_end 1983-09-30 20:00:00 (Fri)
  62553690000, #  local_start 1983-04-01 01:00:00 (Fri)
  62569497600, #    local_end 1983-10-01 00:00:00 (Sat)
  14400,
  1,
  'MSD',
      ],
      [
  62569483200, #    utc_start 1983-09-30 20:00:00 (Fri)
  62585298000, #      utc_end 1984-03-31 21:00:00 (Sat)
  62569494000, #  local_start 1983-09-30 23:00:00 (Fri)
  62585308800, #    local_end 1984-04-01 00:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62585298000, #    utc_start 1984-03-31 21:00:00 (Sat)
  62601030000, #      utc_end 1984-09-29 23:00:00 (Sat)
  62585312400, #  local_start 1984-04-01 01:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62601030000, #    utc_start 1984-09-29 23:00:00 (Sat)
  62616754800, #      utc_end 1985-03-30 23:00:00 (Sat)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62616754800, #    utc_start 1985-03-30 23:00:00 (Sat)
  62632479600, #      utc_end 1985-09-28 23:00:00 (Sat)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62632479600, #    utc_start 1985-09-28 23:00:00 (Sat)
  62648204400, #      utc_end 1986-03-29 23:00:00 (Sat)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62648204400, #    utc_start 1986-03-29 23:00:00 (Sat)
  62663929200, #      utc_end 1986-09-27 23:00:00 (Sat)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62663929200, #    utc_start 1986-09-27 23:00:00 (Sat)
  62679654000, #      utc_end 1987-03-28 23:00:00 (Sat)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62679654000, #    utc_start 1987-03-28 23:00:00 (Sat)
  62695378800, #      utc_end 1987-09-26 23:00:00 (Sat)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62695378800, #    utc_start 1987-09-26 23:00:00 (Sat)
  62711103600, #      utc_end 1988-03-26 23:00:00 (Sat)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62711103600, #    utc_start 1988-03-26 23:00:00 (Sat)
  62726828400, #      utc_end 1988-09-24 23:00:00 (Sat)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62726828400, #    utc_start 1988-09-24 23:00:00 (Sat)
  62742553200, #      utc_end 1989-03-25 23:00:00 (Sat)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62742553200, #    utc_start 1989-03-25 23:00:00 (Sat)
  62758281600, #      utc_end 1989-09-24 00:00:00 (Sun)
  62742564000, #  local_start 1989-03-26 02:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62758281600, #    utc_start 1989-09-24 00:00:00 (Sun)
  62774006400, #      utc_end 1990-03-25 00:00:00 (Sun)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62774006400, #    utc_start 1990-03-25 00:00:00 (Sun)
  62790336000, #      utc_end 1990-09-30 00:00:00 (Sun)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62790336000, #    utc_start 1990-09-30 00:00:00 (Sun)
  62806060800, #      utc_end 1991-03-31 00:00:00 (Sun)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62806060800, #    utc_start 1991-03-31 00:00:00 (Sun)
  62821785600, #      utc_end 1991-09-29 00:00:00 (Sun)
  62806071600, #  local_start 1991-03-31 03:00:00 (Sun)
  62821796400, #    local_end 1991-09-29 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62821785600, #    utc_start 1991-09-29 00:00:00 (Sun)
  62837510400, #      utc_end 1992-03-29 00:00:00 (Sun)
  62821792800, #  local_start 1991-09-29 02:00:00 (Sun)
  62837517600, #    local_end 1992-03-29 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62837510400, #    utc_start 1992-03-29 00:00:00 (Sun)
  62853235200, #      utc_end 1992-09-27 00:00:00 (Sun)
  62837521200, #  local_start 1992-03-29 03:00:00 (Sun)
  62853246000, #    local_end 1992-09-27 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62853235200, #    utc_start 1992-09-27 00:00:00 (Sun)
  62868960000, #      utc_end 1993-03-28 00:00:00 (Sun)
  62853242400, #  local_start 1992-09-27 02:00:00 (Sun)
  62868967200, #    local_end 1993-03-28 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62868960000, #    utc_start 1993-03-28 00:00:00 (Sun)
  62884684800, #      utc_end 1993-09-26 00:00:00 (Sun)
  62868970800, #  local_start 1993-03-28 03:00:00 (Sun)
  62884695600, #    local_end 1993-09-26 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62884684800, #    utc_start 1993-09-26 00:00:00 (Sun)
  62900409600, #      utc_end 1994-03-27 00:00:00 (Sun)
  62884692000, #  local_start 1993-09-26 02:00:00 (Sun)
  62900416800, #    local_end 1994-03-27 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62900409600, #    utc_start 1994-03-27 00:00:00 (Sun)
  62916134400, #      utc_end 1994-09-25 00:00:00 (Sun)
  62900420400, #  local_start 1994-03-27 03:00:00 (Sun)
  62916145200, #    local_end 1994-09-25 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62916134400, #    utc_start 1994-09-25 00:00:00 (Sun)
  62931859200, #      utc_end 1995-03-26 00:00:00 (Sun)
  62916141600, #  local_start 1994-09-25 02:00:00 (Sun)
  62931866400, #    local_end 1995-03-26 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62931859200, #    utc_start 1995-03-26 00:00:00 (Sun)
  62947584000, #      utc_end 1995-09-24 00:00:00 (Sun)
  62931870000, #  local_start 1995-03-26 03:00:00 (Sun)
  62947594800, #    local_end 1995-09-24 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62947584000, #    utc_start 1995-09-24 00:00:00 (Sun)
  62963913600, #      utc_end 1996-03-31 00:00:00 (Sun)
  62947591200, #  local_start 1995-09-24 02:00:00 (Sun)
  62963920800, #    local_end 1996-03-31 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62963913600, #    utc_start 1996-03-31 00:00:00 (Sun)
  62982057600, #      utc_end 1996-10-27 00:00:00 (Sun)
  62963924400, #  local_start 1996-03-31 03:00:00 (Sun)
  62982068400, #    local_end 1996-10-27 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62982057600, #    utc_start 1996-10-27 00:00:00 (Sun)
  62995363200, #      utc_end 1997-03-30 00:00:00 (Sun)
  62982064800, #  local_start 1996-10-27 02:00:00 (Sun)
  62995370400, #    local_end 1997-03-30 02:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62995363200, #    utc_start 1997-03-30 00:00:00 (Sun)
  63013507200, #      utc_end 1997-10-26 00:00:00 (Sun)
  62995374000, #  local_start 1997-03-30 03:00:00 (Sun)
  63013518000, #    local_end 1997-10-26 03:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63013507200, #    utc_start 1997-10-26 00:00:00 (Sun)
  63019288800, #      utc_end 1997-12-31 22:00:00 (Wed)
  63013514400, #  local_start 1997-10-26 02:00:00 (Sun)
  63019296000, #    local_end 1998-01-01 00:00:00 (Thu)
  7200,
  0,
  'EET',
      ],
      [
  63019288800, #    utc_start 1997-12-31 22:00:00 (Wed)
  63026816400, #      utc_end 1998-03-29 01:00:00 (Sun)
  63019296000, #  local_start 1998-01-01 00:00:00 (Thu)
  63026823600, #    local_end 1998-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63026816400, #    utc_start 1998-03-29 01:00:00 (Sun)
  63044960400, #      utc_end 1998-10-25 01:00:00 (Sun)
  63026823600, #  local_start 1998-03-29 03:00:00 (Sun)
  63044967600, #    local_end 1998-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63044960400, #    utc_start 1998-10-25 01:00:00 (Sun)
  63058266000, #      utc_end 1999-03-28 01:00:00 (Sun)
  63044964000, #  local_start 1998-10-25 02:00:00 (Sun)
  63058269600, #    local_end 1999-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63058266000, #    utc_start 1999-03-28 01:00:00 (Sun)
  63077014800, #      utc_end 1999-10-31 01:00:00 (Sun)
  63058273200, #  local_start 1999-03-28 03:00:00 (Sun)
  63077022000, #    local_end 1999-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63077014800, #    utc_start 1999-10-31 01:00:00 (Sun)
  63177055200, #      utc_end 2002-12-31 22:00:00 (Tue)
  63077022000, #  local_start 1999-10-31 03:00:00 (Sun)
  63177062400, #    local_end 2003-01-01 00:00:00 (Wed)
  7200,
  0,
  'EET',
      ],
      [
  63177055200, #    utc_start 2002-12-31 22:00:00 (Tue)
  63184669200, #      utc_end 2003-03-30 01:00:00 (Sun)
  63177062400, #  local_start 2003-01-01 00:00:00 (Wed)
  63184676400, #    local_end 2003-03-30 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63184669200, #    utc_start 2003-03-30 01:00:00 (Sun)
  63202813200, #      utc_end 2003-10-26 01:00:00 (Sun)
  63184680000, #  local_start 2003-03-30 04:00:00 (Sun)
  63202824000, #    local_end 2003-10-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63202813200, #    utc_start 2003-10-26 01:00:00 (Sun)
  63216118800, #      utc_end 2004-03-28 01:00:00 (Sun)
  63202820400, #  local_start 2003-10-26 03:00:00 (Sun)
  63216126000, #    local_end 2004-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63216118800, #    utc_start 2004-03-28 01:00:00 (Sun)
  63234867600, #      utc_end 2004-10-31 01:00:00 (Sun)
  63216129600, #  local_start 2004-03-28 04:00:00 (Sun)
  63234878400, #    local_end 2004-10-31 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63234867600, #    utc_start 2004-10-31 01:00:00 (Sun)
  63247568400, #      utc_end 2005-03-27 01:00:00 (Sun)
  63234874800, #  local_start 2004-10-31 03:00:00 (Sun)
  63247575600, #    local_end 2005-03-27 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63247568400, #    utc_start 2005-03-27 01:00:00 (Sun)
  63266317200, #      utc_end 2005-10-30 01:00:00 (Sun)
  63247579200, #  local_start 2005-03-27 04:00:00 (Sun)
  63266328000, #    local_end 2005-10-30 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63266317200, #    utc_start 2005-10-30 01:00:00 (Sun)
  63279018000, #      utc_end 2006-03-26 01:00:00 (Sun)
  63266324400, #  local_start 2005-10-30 03:00:00 (Sun)
  63279025200, #    local_end 2006-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63279018000, #    utc_start 2006-03-26 01:00:00 (Sun)
  63297766800, #      utc_end 2006-10-29 01:00:00 (Sun)
  63279028800, #  local_start 2006-03-26 04:00:00 (Sun)
  63297777600, #    local_end 2006-10-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63297766800, #    utc_start 2006-10-29 01:00:00 (Sun)
  63310467600, #      utc_end 2007-03-25 01:00:00 (Sun)
  63297774000, #  local_start 2006-10-29 03:00:00 (Sun)
  63310474800, #    local_end 2007-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63310467600, #    utc_start 2007-03-25 01:00:00 (Sun)
  63329216400, #      utc_end 2007-10-28 01:00:00 (Sun)
  63310478400, #  local_start 2007-03-25 04:00:00 (Sun)
  63329227200, #    local_end 2007-10-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63329216400, #    utc_start 2007-10-28 01:00:00 (Sun)
  63342522000, #      utc_end 2008-03-30 01:00:00 (Sun)
  63329223600, #  local_start 2007-10-28 03:00:00 (Sun)
  63342529200, #    local_end 2008-03-30 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63342522000, #    utc_start 2008-03-30 01:00:00 (Sun)
  63360666000, #      utc_end 2008-10-26 01:00:00 (Sun)
  63342532800, #  local_start 2008-03-30 04:00:00 (Sun)
  63360676800, #    local_end 2008-10-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63360666000, #    utc_start 2008-10-26 01:00:00 (Sun)
  63373971600, #      utc_end 2009-03-29 01:00:00 (Sun)
  63360673200, #  local_start 2008-10-26 03:00:00 (Sun)
  63373978800, #    local_end 2009-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63373971600, #    utc_start 2009-03-29 01:00:00 (Sun)
  63392115600, #      utc_end 2009-10-25 01:00:00 (Sun)
  63373982400, #  local_start 2009-03-29 04:00:00 (Sun)
  63392126400, #    local_end 2009-10-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63392115600, #    utc_start 2009-10-25 01:00:00 (Sun)
  63405421200, #      utc_end 2010-03-28 01:00:00 (Sun)
  63392122800, #  local_start 2009-10-25 03:00:00 (Sun)
  63405428400, #    local_end 2010-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63405421200, #    utc_start 2010-03-28 01:00:00 (Sun)
  63424170000, #      utc_end 2010-10-31 01:00:00 (Sun)
  63405432000, #  local_start 2010-03-28 04:00:00 (Sun)
  63424180800, #    local_end 2010-10-31 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63424170000, #    utc_start 2010-10-31 01:00:00 (Sun)
  63436870800, #      utc_end 2011-03-27 01:00:00 (Sun)
  63424177200, #  local_start 2010-10-31 03:00:00 (Sun)
  63436878000, #    local_end 2011-03-27 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63436870800, #    utc_start 2011-03-27 01:00:00 (Sun)
  63455619600, #      utc_end 2011-10-30 01:00:00 (Sun)
  63436881600, #  local_start 2011-03-27 04:00:00 (Sun)
  63455630400, #    local_end 2011-10-30 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63455619600, #    utc_start 2011-10-30 01:00:00 (Sun)
  63468320400, #      utc_end 2012-03-25 01:00:00 (Sun)
  63455626800, #  local_start 2011-10-30 03:00:00 (Sun)
  63468327600, #    local_end 2012-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63468320400, #    utc_start 2012-03-25 01:00:00 (Sun)
  63487069200, #      utc_end 2012-10-28 01:00:00 (Sun)
  63468331200, #  local_start 2012-03-25 04:00:00 (Sun)
  63487080000, #    local_end 2012-10-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63487069200, #    utc_start 2012-10-28 01:00:00 (Sun)
  63500374800, #      utc_end 2013-03-31 01:00:00 (Sun)
  63487076400, #  local_start 2012-10-28 03:00:00 (Sun)
  63500382000, #    local_end 2013-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63500374800, #    utc_start 2013-03-31 01:00:00 (Sun)
  63518518800, #      utc_end 2013-10-27 01:00:00 (Sun)
  63500385600, #  local_start 2013-03-31 04:00:00 (Sun)
  63518529600, #    local_end 2013-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63518518800, #    utc_start 2013-10-27 01:00:00 (Sun)
  63531824400, #      utc_end 2014-03-30 01:00:00 (Sun)
  63518526000, #  local_start 2013-10-27 03:00:00 (Sun)
  63531831600, #    local_end 2014-03-30 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63531824400, #    utc_start 2014-03-30 01:00:00 (Sun)
  63549968400, #      utc_end 2014-10-26 01:00:00 (Sun)
  63531835200, #  local_start 2014-03-30 04:00:00 (Sun)
  63549979200, #    local_end 2014-10-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63549968400, #    utc_start 2014-10-26 01:00:00 (Sun)
  63563274000, #      utc_end 2015-03-29 01:00:00 (Sun)
  63549975600, #  local_start 2014-10-26 03:00:00 (Sun)
  63563281200, #    local_end 2015-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63563274000, #    utc_start 2015-03-29 01:00:00 (Sun)
  63581418000, #      utc_end 2015-10-25 01:00:00 (Sun)
  63563284800, #  local_start 2015-03-29 04:00:00 (Sun)
  63581428800, #    local_end 2015-10-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63581418000, #    utc_start 2015-10-25 01:00:00 (Sun)
  63594723600, #      utc_end 2016-03-27 01:00:00 (Sun)
  63581425200, #  local_start 2015-10-25 03:00:00 (Sun)
  63594730800, #    local_end 2016-03-27 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63594723600, #    utc_start 2016-03-27 01:00:00 (Sun)
  63613472400, #      utc_end 2016-10-30 01:00:00 (Sun)
  63594734400, #  local_start 2016-03-27 04:00:00 (Sun)
  63613483200, #    local_end 2016-10-30 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63613472400, #    utc_start 2016-10-30 01:00:00 (Sun)
  63626173200, #      utc_end 2017-03-26 01:00:00 (Sun)
  63613479600, #  local_start 2016-10-30 03:00:00 (Sun)
  63626180400, #    local_end 2017-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63626173200, #    utc_start 2017-03-26 01:00:00 (Sun)
  63644922000, #      utc_end 2017-10-29 01:00:00 (Sun)
  63626184000, #  local_start 2017-03-26 04:00:00 (Sun)
  63644932800, #    local_end 2017-10-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63644922000, #    utc_start 2017-10-29 01:00:00 (Sun)
  63657622800, #      utc_end 2018-03-25 01:00:00 (Sun)
  63644929200, #  local_start 2017-10-29 03:00:00 (Sun)
  63657630000, #    local_end 2018-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63657622800, #    utc_start 2018-03-25 01:00:00 (Sun)
  63676371600, #      utc_end 2018-10-28 01:00:00 (Sun)
  63657633600, #  local_start 2018-03-25 04:00:00 (Sun)
  63676382400, #    local_end 2018-10-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63676371600, #    utc_start 2018-10-28 01:00:00 (Sun)
  63689677200, #      utc_end 2019-03-31 01:00:00 (Sun)
  63676378800, #  local_start 2018-10-28 03:00:00 (Sun)
  63689684400, #    local_end 2019-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63689677200, #    utc_start 2019-03-31 01:00:00 (Sun)
  63707821200, #      utc_end 2019-10-27 01:00:00 (Sun)
  63689688000, #  local_start 2019-03-31 04:00:00 (Sun)
  63707832000, #    local_end 2019-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63707821200, #    utc_start 2019-10-27 01:00:00 (Sun)
  63721126800, #      utc_end 2020-03-29 01:00:00 (Sun)
  63707828400, #  local_start 2019-10-27 03:00:00 (Sun)
  63721134000, #    local_end 2020-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63721126800, #    utc_start 2020-03-29 01:00:00 (Sun)
  63739270800, #      utc_end 2020-10-25 01:00:00 (Sun)
  63721137600, #  local_start 2020-03-29 04:00:00 (Sun)
  63739281600, #    local_end 2020-10-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63739270800, #    utc_start 2020-10-25 01:00:00 (Sun)
  63752576400, #      utc_end 2021-03-28 01:00:00 (Sun)
  63739278000, #  local_start 2020-10-25 03:00:00 (Sun)
  63752583600, #    local_end 2021-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63752576400, #    utc_start 2021-03-28 01:00:00 (Sun)
  63771325200, #      utc_end 2021-10-31 01:00:00 (Sun)
  63752587200, #  local_start 2021-03-28 04:00:00 (Sun)
  63771336000, #    local_end 2021-10-31 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63771325200, #    utc_start 2021-10-31 01:00:00 (Sun)
  63784026000, #      utc_end 2022-03-27 01:00:00 (Sun)
  63771332400, #  local_start 2021-10-31 03:00:00 (Sun)
  63784033200, #    local_end 2022-03-27 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63784026000, #    utc_start 2022-03-27 01:00:00 (Sun)
  63802774800, #      utc_end 2022-10-30 01:00:00 (Sun)
  63784036800, #  local_start 2022-03-27 04:00:00 (Sun)
  63802785600, #    local_end 2022-10-30 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63802774800, #    utc_start 2022-10-30 01:00:00 (Sun)
  63815475600, #      utc_end 2023-03-26 01:00:00 (Sun)
  63802782000, #  local_start 2022-10-30 03:00:00 (Sun)
  63815482800, #    local_end 2023-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63815475600, #    utc_start 2023-03-26 01:00:00 (Sun)
  63834224400, #      utc_end 2023-10-29 01:00:00 (Sun)
  63815486400, #  local_start 2023-03-26 04:00:00 (Sun)
  63834235200, #    local_end 2023-10-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63834224400, #    utc_start 2023-10-29 01:00:00 (Sun)
  63847530000, #      utc_end 2024-03-31 01:00:00 (Sun)
  63834231600, #  local_start 2023-10-29 03:00:00 (Sun)
  63847537200, #    local_end 2024-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63847530000, #    utc_start 2024-03-31 01:00:00 (Sun)
  63865674000, #      utc_end 2024-10-27 01:00:00 (Sun)
  63847540800, #  local_start 2024-03-31 04:00:00 (Sun)
  63865684800, #    local_end 2024-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63865674000, #    utc_start 2024-10-27 01:00:00 (Sun)
  63878979600, #      utc_end 2025-03-30 01:00:00 (Sun)
  63865681200, #  local_start 2024-10-27 03:00:00 (Sun)
  63878986800, #    local_end 2025-03-30 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63878979600, #    utc_start 2025-03-30 01:00:00 (Sun)
  63897123600, #      utc_end 2025-10-26 01:00:00 (Sun)
  63878990400, #  local_start 2025-03-30 04:00:00 (Sun)
  63897134400, #    local_end 2025-10-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63897123600, #    utc_start 2025-10-26 01:00:00 (Sun)
  63910429200, #      utc_end 2026-03-29 01:00:00 (Sun)
  63897130800, #  local_start 2025-10-26 03:00:00 (Sun)
  63910436400, #    local_end 2026-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63910429200, #    utc_start 2026-03-29 01:00:00 (Sun)
  63928573200, #      utc_end 2026-10-25 01:00:00 (Sun)
  63910440000, #  local_start 2026-03-29 04:00:00 (Sun)
  63928584000, #    local_end 2026-10-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63928573200, #    utc_start 2026-10-25 01:00:00 (Sun)
  63941878800, #      utc_end 2027-03-28 01:00:00 (Sun)
  63928580400, #  local_start 2026-10-25 03:00:00 (Sun)
  63941886000, #    local_end 2027-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63941878800, #    utc_start 2027-03-28 01:00:00 (Sun)
  63960627600, #      utc_end 2027-10-31 01:00:00 (Sun)
  63941889600, #  local_start 2027-03-28 04:00:00 (Sun)
  63960638400, #    local_end 2027-10-31 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63960627600, #    utc_start 2027-10-31 01:00:00 (Sun)
  63973328400, #      utc_end 2028-03-26 01:00:00 (Sun)
  63960634800, #  local_start 2027-10-31 03:00:00 (Sun)
  63973335600, #    local_end 2028-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63973328400, #    utc_start 2028-03-26 01:00:00 (Sun)
  63992077200, #      utc_end 2028-10-29 01:00:00 (Sun)
  63973339200, #  local_start 2028-03-26 04:00:00 (Sun)
  63992088000, #    local_end 2028-10-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63992077200, #    utc_start 2028-10-29 01:00:00 (Sun)
  64004778000, #      utc_end 2029-03-25 01:00:00 (Sun)
  63992084400, #  local_start 2028-10-29 03:00:00 (Sun)
  64004785200, #    local_end 2029-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  64004778000, #    utc_start 2029-03-25 01:00:00 (Sun)
  64023526800, #      utc_end 2029-10-28 01:00:00 (Sun)
  64004788800, #  local_start 2029-03-25 04:00:00 (Sun)
  64023537600, #    local_end 2029-10-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  64023526800, #    utc_start 2029-10-28 01:00:00 (Sun)
  64036832400, #      utc_end 2030-03-31 01:00:00 (Sun)
  64023534000, #  local_start 2029-10-28 03:00:00 (Sun)
  64036839600, #    local_end 2030-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  64036832400, #    utc_start 2030-03-31 01:00:00 (Sun)
  64054976400, #      utc_end 2030-10-27 01:00:00 (Sun)
  64036843200, #  local_start 2030-03-31 04:00:00 (Sun)
  64054987200, #    local_end 2030-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {50}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { 7200 }
  
  my $last_observance = bless( {
    'format' => 'EE%sT',
    'gmtoff' => '2:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 731216,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 731216,
      'utc_rd_secs' => 0,
      'utc_year' => 2004
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => 7200,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 731215,
      'local_rd_secs' => 79200,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 731215,
      'utc_rd_secs' => 79200,
      'utc_year' => 2003
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '1:00u',
      'from' => '1981',
      'in' => 'Mar',
      'letter' => 'S',
      'name' => 'EU',
      'offset_from_std' => 3600,
      'on' => 'lastSun',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '1:00u',
      'from' => '1996',
      'in' => 'Oct',
      'letter' => '',
      'name' => 'EU',
      'offset_from_std' => 0,
      'on' => 'lastSun',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_EUROPE_VILNIUS

    $main::fatpacked{"DateTime/TimeZone/Europe/Volgograd.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_EUROPE_VOLGOGRAD';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Europe::Volgograd;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Europe::Volgograd::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60557922140, #      utc_end 1920-01-02 21:02:20 (Fri)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60557932800, #    local_end 1920-01-03 00:00:00 (Sat)
  10660,
  0,
  'LMT',
      ],
      [
  60557922140, #    utc_start 1920-01-02 21:02:20 (Fri)
  60888142800, #      utc_end 1930-06-20 21:00:00 (Fri)
  60557932940, #  local_start 1920-01-03 00:02:20 (Sat)
  60888153600, #    local_end 1930-06-21 00:00:00 (Sat)
  10800,
  0,
  '+03',
      ],
      [
  60888142800, #    utc_start 1930-06-20 21:00:00 (Fri)
  61878801600, #      utc_end 1961-11-10 20:00:00 (Fri)
  60888157200, #  local_start 1930-06-21 01:00:00 (Sat)
  61878816000, #    local_end 1961-11-11 00:00:00 (Sat)
  14400,
  0,
  '+04',
      ],
      [
  61878801600, #    utc_start 1961-11-10 20:00:00 (Fri)
  62490600000, #      utc_end 1981-03-31 20:00:00 (Tue)
  61878816000, #  local_start 1961-11-11 00:00:00 (Sat)
  62490614400, #    local_end 1981-04-01 00:00:00 (Wed)
  14400,
  0,
  '+04',
      ],
      [
  62490600000, #    utc_start 1981-03-31 20:00:00 (Tue)
  62506407600, #      utc_end 1981-09-30 19:00:00 (Wed)
  62490618000, #  local_start 1981-04-01 01:00:00 (Wed)
  62506425600, #    local_end 1981-10-01 00:00:00 (Thu)
  18000,
  1,
  '+05',
      ],
      [
  62506407600, #    utc_start 1981-09-30 19:00:00 (Wed)
  62522136000, #      utc_end 1982-03-31 20:00:00 (Wed)
  62506422000, #  local_start 1981-09-30 23:00:00 (Wed)
  62522150400, #    local_end 1982-04-01 00:00:00 (Thu)
  14400,
  0,
  '+04',
      ],
      [
  62522136000, #    utc_start 1982-03-31 20:00:00 (Wed)
  62537943600, #      utc_end 1982-09-30 19:00:00 (Thu)
  62522154000, #  local_start 1982-04-01 01:00:00 (Thu)
  62537961600, #    local_end 1982-10-01 00:00:00 (Fri)
  18000,
  1,
  '+05',
      ],
      [
  62537943600, #    utc_start 1982-09-30 19:00:00 (Thu)
  62553672000, #      utc_end 1983-03-31 20:00:00 (Thu)
  62537958000, #  local_start 1982-09-30 23:00:00 (Thu)
  62553686400, #    local_end 1983-04-01 00:00:00 (Fri)
  14400,
  0,
  '+04',
      ],
      [
  62553672000, #    utc_start 1983-03-31 20:00:00 (Thu)
  62569479600, #      utc_end 1983-09-30 19:00:00 (Fri)
  62553690000, #  local_start 1983-04-01 01:00:00 (Fri)
  62569497600, #    local_end 1983-10-01 00:00:00 (Sat)
  18000,
  1,
  '+05',
      ],
      [
  62569479600, #    utc_start 1983-09-30 19:00:00 (Fri)
  62585294400, #      utc_end 1984-03-31 20:00:00 (Sat)
  62569494000, #  local_start 1983-09-30 23:00:00 (Fri)
  62585308800, #    local_end 1984-04-01 00:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62585294400, #    utc_start 1984-03-31 20:00:00 (Sat)
  62601026400, #      utc_end 1984-09-29 22:00:00 (Sat)
  62585312400, #  local_start 1984-04-01 01:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62601026400, #    utc_start 1984-09-29 22:00:00 (Sat)
  62616751200, #      utc_end 1985-03-30 22:00:00 (Sat)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62616751200, #    utc_start 1985-03-30 22:00:00 (Sat)
  62632476000, #      utc_end 1985-09-28 22:00:00 (Sat)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62632476000, #    utc_start 1985-09-28 22:00:00 (Sat)
  62648200800, #      utc_end 1986-03-29 22:00:00 (Sat)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62648200800, #    utc_start 1986-03-29 22:00:00 (Sat)
  62663925600, #      utc_end 1986-09-27 22:00:00 (Sat)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62663925600, #    utc_start 1986-09-27 22:00:00 (Sat)
  62679650400, #      utc_end 1987-03-28 22:00:00 (Sat)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62679650400, #    utc_start 1987-03-28 22:00:00 (Sat)
  62695375200, #      utc_end 1987-09-26 22:00:00 (Sat)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  62695375200, #    utc_start 1987-09-26 22:00:00 (Sat)
  62711100000, #      utc_end 1988-03-26 22:00:00 (Sat)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62711100000, #    utc_start 1988-03-26 22:00:00 (Sat)
  62726828400, #      utc_end 1988-09-24 23:00:00 (Sat)
  62711114400, #  local_start 1988-03-27 02:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  62726828400, #    utc_start 1988-09-24 23:00:00 (Sat)
  62742553200, #      utc_end 1989-03-25 23:00:00 (Sat)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  62742553200, #    utc_start 1989-03-25 23:00:00 (Sat)
  62758278000, #      utc_end 1989-09-23 23:00:00 (Sat)
  62742567600, #  local_start 1989-03-26 03:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  62758278000, #    utc_start 1989-09-23 23:00:00 (Sat)
  62774002800, #      utc_end 1990-03-24 23:00:00 (Sat)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  62774002800, #    utc_start 1990-03-24 23:00:00 (Sat)
  62790332400, #      utc_end 1990-09-29 23:00:00 (Sat)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  62790332400, #    utc_start 1990-09-29 23:00:00 (Sat)
  62806057200, #      utc_end 1991-03-30 23:00:00 (Sat)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  62806057200, #    utc_start 1991-03-30 23:00:00 (Sat)
  62837503200, #      utc_end 1992-03-28 22:00:00 (Sat)
  62806071600, #  local_start 1991-03-31 03:00:00 (Sun)
  62837517600, #    local_end 1992-03-29 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62837503200, #    utc_start 1992-03-28 22:00:00 (Sat)
  62853231600, #      utc_end 1992-09-26 23:00:00 (Sat)
  62837517600, #  local_start 1992-03-29 02:00:00 (Sun)
  62853246000, #    local_end 1992-09-27 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  62853231600, #    utc_start 1992-09-26 23:00:00 (Sat)
  62868956400, #      utc_end 1993-03-27 23:00:00 (Sat)
  62853242400, #  local_start 1992-09-27 02:00:00 (Sun)
  62868967200, #    local_end 1993-03-28 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  62868956400, #    utc_start 1993-03-27 23:00:00 (Sat)
  62884681200, #      utc_end 1993-09-25 23:00:00 (Sat)
  62868970800, #  local_start 1993-03-28 03:00:00 (Sun)
  62884695600, #    local_end 1993-09-26 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  62884681200, #    utc_start 1993-09-25 23:00:00 (Sat)
  62900406000, #      utc_end 1994-03-26 23:00:00 (Sat)
  62884692000, #  local_start 1993-09-26 02:00:00 (Sun)
  62900416800, #    local_end 1994-03-27 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  62900406000, #    utc_start 1994-03-26 23:00:00 (Sat)
  62916130800, #      utc_end 1994-09-24 23:00:00 (Sat)
  62900420400, #  local_start 1994-03-27 03:00:00 (Sun)
  62916145200, #    local_end 1994-09-25 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  62916130800, #    utc_start 1994-09-24 23:00:00 (Sat)
  62931855600, #      utc_end 1995-03-25 23:00:00 (Sat)
  62916141600, #  local_start 1994-09-25 02:00:00 (Sun)
  62931866400, #    local_end 1995-03-26 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  62931855600, #    utc_start 1995-03-25 23:00:00 (Sat)
  62947580400, #      utc_end 1995-09-23 23:00:00 (Sat)
  62931870000, #  local_start 1995-03-26 03:00:00 (Sun)
  62947594800, #    local_end 1995-09-24 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  62947580400, #    utc_start 1995-09-23 23:00:00 (Sat)
  62963910000, #      utc_end 1996-03-30 23:00:00 (Sat)
  62947591200, #  local_start 1995-09-24 02:00:00 (Sun)
  62963920800, #    local_end 1996-03-31 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  62963910000, #    utc_start 1996-03-30 23:00:00 (Sat)
  62982054000, #      utc_end 1996-10-26 23:00:00 (Sat)
  62963924400, #  local_start 1996-03-31 03:00:00 (Sun)
  62982068400, #    local_end 1996-10-27 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  62982054000, #    utc_start 1996-10-26 23:00:00 (Sat)
  62995359600, #      utc_end 1997-03-29 23:00:00 (Sat)
  62982064800, #  local_start 1996-10-27 02:00:00 (Sun)
  62995370400, #    local_end 1997-03-30 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  62995359600, #    utc_start 1997-03-29 23:00:00 (Sat)
  63013503600, #      utc_end 1997-10-25 23:00:00 (Sat)
  62995374000, #  local_start 1997-03-30 03:00:00 (Sun)
  63013518000, #    local_end 1997-10-26 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63013503600, #    utc_start 1997-10-25 23:00:00 (Sat)
  63026809200, #      utc_end 1998-03-28 23:00:00 (Sat)
  63013514400, #  local_start 1997-10-26 02:00:00 (Sun)
  63026820000, #    local_end 1998-03-29 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63026809200, #    utc_start 1998-03-28 23:00:00 (Sat)
  63044953200, #      utc_end 1998-10-24 23:00:00 (Sat)
  63026823600, #  local_start 1998-03-29 03:00:00 (Sun)
  63044967600, #    local_end 1998-10-25 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63044953200, #    utc_start 1998-10-24 23:00:00 (Sat)
  63058258800, #      utc_end 1999-03-27 23:00:00 (Sat)
  63044964000, #  local_start 1998-10-25 02:00:00 (Sun)
  63058269600, #    local_end 1999-03-28 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63058258800, #    utc_start 1999-03-27 23:00:00 (Sat)
  63077007600, #      utc_end 1999-10-30 23:00:00 (Sat)
  63058273200, #  local_start 1999-03-28 03:00:00 (Sun)
  63077022000, #    local_end 1999-10-31 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63077007600, #    utc_start 1999-10-30 23:00:00 (Sat)
  63089708400, #      utc_end 2000-03-25 23:00:00 (Sat)
  63077018400, #  local_start 1999-10-31 02:00:00 (Sun)
  63089719200, #    local_end 2000-03-26 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63089708400, #    utc_start 2000-03-25 23:00:00 (Sat)
  63108457200, #      utc_end 2000-10-28 23:00:00 (Sat)
  63089722800, #  local_start 2000-03-26 03:00:00 (Sun)
  63108471600, #    local_end 2000-10-29 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63108457200, #    utc_start 2000-10-28 23:00:00 (Sat)
  63121158000, #      utc_end 2001-03-24 23:00:00 (Sat)
  63108468000, #  local_start 2000-10-29 02:00:00 (Sun)
  63121168800, #    local_end 2001-03-25 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63121158000, #    utc_start 2001-03-24 23:00:00 (Sat)
  63139906800, #      utc_end 2001-10-27 23:00:00 (Sat)
  63121172400, #  local_start 2001-03-25 03:00:00 (Sun)
  63139921200, #    local_end 2001-10-28 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63139906800, #    utc_start 2001-10-27 23:00:00 (Sat)
  63153212400, #      utc_end 2002-03-30 23:00:00 (Sat)
  63139917600, #  local_start 2001-10-28 02:00:00 (Sun)
  63153223200, #    local_end 2002-03-31 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63153212400, #    utc_start 2002-03-30 23:00:00 (Sat)
  63171356400, #      utc_end 2002-10-26 23:00:00 (Sat)
  63153226800, #  local_start 2002-03-31 03:00:00 (Sun)
  63171370800, #    local_end 2002-10-27 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63171356400, #    utc_start 2002-10-26 23:00:00 (Sat)
  63184662000, #      utc_end 2003-03-29 23:00:00 (Sat)
  63171367200, #  local_start 2002-10-27 02:00:00 (Sun)
  63184672800, #    local_end 2003-03-30 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63184662000, #    utc_start 2003-03-29 23:00:00 (Sat)
  63202806000, #      utc_end 2003-10-25 23:00:00 (Sat)
  63184676400, #  local_start 2003-03-30 03:00:00 (Sun)
  63202820400, #    local_end 2003-10-26 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63202806000, #    utc_start 2003-10-25 23:00:00 (Sat)
  63216111600, #      utc_end 2004-03-27 23:00:00 (Sat)
  63202816800, #  local_start 2003-10-26 02:00:00 (Sun)
  63216122400, #    local_end 2004-03-28 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63216111600, #    utc_start 2004-03-27 23:00:00 (Sat)
  63234860400, #      utc_end 2004-10-30 23:00:00 (Sat)
  63216126000, #  local_start 2004-03-28 03:00:00 (Sun)
  63234874800, #    local_end 2004-10-31 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63234860400, #    utc_start 2004-10-30 23:00:00 (Sat)
  63247561200, #      utc_end 2005-03-26 23:00:00 (Sat)
  63234871200, #  local_start 2004-10-31 02:00:00 (Sun)
  63247572000, #    local_end 2005-03-27 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63247561200, #    utc_start 2005-03-26 23:00:00 (Sat)
  63266310000, #      utc_end 2005-10-29 23:00:00 (Sat)
  63247575600, #  local_start 2005-03-27 03:00:00 (Sun)
  63266324400, #    local_end 2005-10-30 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63266310000, #    utc_start 2005-10-29 23:00:00 (Sat)
  63279010800, #      utc_end 2006-03-25 23:00:00 (Sat)
  63266320800, #  local_start 2005-10-30 02:00:00 (Sun)
  63279021600, #    local_end 2006-03-26 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63279010800, #    utc_start 2006-03-25 23:00:00 (Sat)
  63297759600, #      utc_end 2006-10-28 23:00:00 (Sat)
  63279025200, #  local_start 2006-03-26 03:00:00 (Sun)
  63297774000, #    local_end 2006-10-29 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63297759600, #    utc_start 2006-10-28 23:00:00 (Sat)
  63310460400, #      utc_end 2007-03-24 23:00:00 (Sat)
  63297770400, #  local_start 2006-10-29 02:00:00 (Sun)
  63310471200, #    local_end 2007-03-25 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63310460400, #    utc_start 2007-03-24 23:00:00 (Sat)
  63329209200, #      utc_end 2007-10-27 23:00:00 (Sat)
  63310474800, #  local_start 2007-03-25 03:00:00 (Sun)
  63329223600, #    local_end 2007-10-28 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63329209200, #    utc_start 2007-10-27 23:00:00 (Sat)
  63342514800, #      utc_end 2008-03-29 23:00:00 (Sat)
  63329220000, #  local_start 2007-10-28 02:00:00 (Sun)
  63342525600, #    local_end 2008-03-30 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63342514800, #    utc_start 2008-03-29 23:00:00 (Sat)
  63360658800, #      utc_end 2008-10-25 23:00:00 (Sat)
  63342529200, #  local_start 2008-03-30 03:00:00 (Sun)
  63360673200, #    local_end 2008-10-26 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63360658800, #    utc_start 2008-10-25 23:00:00 (Sat)
  63373964400, #      utc_end 2009-03-28 23:00:00 (Sat)
  63360669600, #  local_start 2008-10-26 02:00:00 (Sun)
  63373975200, #    local_end 2009-03-29 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63373964400, #    utc_start 2009-03-28 23:00:00 (Sat)
  63392108400, #      utc_end 2009-10-24 23:00:00 (Sat)
  63373978800, #  local_start 2009-03-29 03:00:00 (Sun)
  63392122800, #    local_end 2009-10-25 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63392108400, #    utc_start 2009-10-24 23:00:00 (Sat)
  63405414000, #      utc_end 2010-03-27 23:00:00 (Sat)
  63392119200, #  local_start 2009-10-25 02:00:00 (Sun)
  63405424800, #    local_end 2010-03-28 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63405414000, #    utc_start 2010-03-27 23:00:00 (Sat)
  63424162800, #      utc_end 2010-10-30 23:00:00 (Sat)
  63405428400, #  local_start 2010-03-28 03:00:00 (Sun)
  63424177200, #    local_end 2010-10-31 03:00:00 (Sun)
  14400,
  1,
  '+04',
      ],
      [
  63424162800, #    utc_start 2010-10-30 23:00:00 (Sat)
  63436863600, #      utc_end 2011-03-26 23:00:00 (Sat)
  63424173600, #  local_start 2010-10-31 02:00:00 (Sun)
  63436874400, #    local_end 2011-03-27 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63436863600, #    utc_start 2011-03-26 23:00:00 (Sat)
  63549957600, #      utc_end 2014-10-25 22:00:00 (Sat)
  63436878000, #  local_start 2011-03-27 03:00:00 (Sun)
  63549972000, #    local_end 2014-10-26 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63549957600, #    utc_start 2014-10-25 22:00:00 (Sat)
  63676364400, #      utc_end 2018-10-27 23:00:00 (Sat)
  63549968400, #  local_start 2014-10-26 01:00:00 (Sun)
  63676375200, #    local_end 2018-10-28 02:00:00 (Sun)
  10800,
  0,
  '+03',
      ],
      [
  63676364400, #    utc_start 2018-10-27 23:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  63676378800, #  local_start 2018-10-28 03:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  14400,
  0,
  '+04',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {29}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_EUROPE_VOLGOGRAD

    $main::fatpacked{"DateTime/TimeZone/Europe/Warsaw.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_EUROPE_WARSAW';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Europe::Warsaw;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Europe::Warsaw::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59295537360, #      utc_end 1879-12-31 22:36:00 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59295542400, #    local_end 1880-01-01 00:00:00 (Thu)
  5040,
  0,
  'LMT',
      ],
      [
  59295537360, #    utc_start 1879-12-31 22:36:00 (Wed)
  60418650960, #      utc_end 1915-08-04 22:36:00 (Wed)
  59295542400, #  local_start 1880-01-01 00:00:00 (Thu)
  60418656000, #    local_end 1915-08-05 00:00:00 (Thu)
  5040,
  0,
  'WMT',
      ],
      [
  60418650960, #    utc_start 1915-08-04 22:36:00 (Wed)
  60441976800, #      utc_end 1916-04-30 22:00:00 (Sun)
  60418654560, #  local_start 1915-08-04 23:36:00 (Wed)
  60441980400, #    local_end 1916-04-30 23:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  60441976800, #    utc_start 1916-04-30 22:00:00 (Sun)
  60455199600, #      utc_end 1916-09-30 23:00:00 (Sat)
  60441984000, #  local_start 1916-05-01 00:00:00 (Mon)
  60455206800, #    local_end 1916-10-01 01:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  60455199600, #    utc_start 1916-09-30 23:00:00 (Sat)
  60472227600, #      utc_end 1917-04-16 01:00:00 (Mon)
  60455203200, #  local_start 1916-10-01 00:00:00 (Sun)
  60472231200, #    local_end 1917-04-16 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  60472227600, #    utc_start 1917-04-16 01:00:00 (Mon)
  60485533200, #      utc_end 1917-09-17 01:00:00 (Mon)
  60472234800, #  local_start 1917-04-16 03:00:00 (Mon)
  60485540400, #    local_end 1917-09-17 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  60485533200, #    utc_start 1917-09-17 01:00:00 (Mon)
  60503677200, #      utc_end 1918-04-15 01:00:00 (Mon)
  60485536800, #  local_start 1917-09-17 02:00:00 (Mon)
  60503680800, #    local_end 1918-04-15 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  60503677200, #    utc_start 1918-04-15 01:00:00 (Mon)
  60516982800, #      utc_end 1918-09-16 01:00:00 (Mon)
  60503684400, #  local_start 1918-04-15 03:00:00 (Mon)
  60516990000, #    local_end 1918-09-16 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  60516982800, #    utc_start 1918-09-16 01:00:00 (Mon)
  60535209600, #      utc_end 1919-04-15 00:00:00 (Tue)
  60516990000, #  local_start 1918-09-16 03:00:00 (Mon)
  60535216800, #    local_end 1919-04-15 02:00:00 (Tue)
  7200,
  0,
  'EET',
      ],
      [
  60535209600, #    utc_start 1919-04-15 00:00:00 (Tue)
  60548515200, #      utc_end 1919-09-16 00:00:00 (Tue)
  60535220400, #  local_start 1919-04-15 03:00:00 (Tue)
  60548526000, #    local_end 1919-09-16 03:00:00 (Tue)
  10800,
  1,
  'EEST',
      ],
      [
  60548515200, #    utc_start 1919-09-16 00:00:00 (Tue)
  60633957600, #      utc_end 1922-05-31 22:00:00 (Wed)
  60548522400, #  local_start 1919-09-16 02:00:00 (Tue)
  60633964800, #    local_end 1922-06-01 00:00:00 (Thu)
  7200,
  0,
  'EET',
      ],
      [
  60633957600, #    utc_start 1922-05-31 22:00:00 (Wed)
  61203949200, #      utc_end 1940-06-23 01:00:00 (Sun)
  60633961200, #  local_start 1922-05-31 23:00:00 (Wed)
  61203952800, #    local_end 1940-06-23 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  61203949200, #    utc_start 1940-06-23 01:00:00 (Sun)
  61278426000, #      utc_end 1942-11-02 01:00:00 (Mon)
  61203956400, #  local_start 1940-06-23 03:00:00 (Sun)
  61278433200, #    local_end 1942-11-02 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61278426000, #    utc_start 1942-11-02 01:00:00 (Mon)
  61291126800, #      utc_end 1943-03-29 01:00:00 (Mon)
  61278429600, #  local_start 1942-11-02 02:00:00 (Mon)
  61291130400, #    local_end 1943-03-29 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61291126800, #    utc_start 1943-03-29 01:00:00 (Mon)
  61307456400, #      utc_end 1943-10-04 01:00:00 (Mon)
  61291134000, #  local_start 1943-03-29 03:00:00 (Mon)
  61307463600, #    local_end 1943-10-04 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61307456400, #    utc_start 1943-10-04 01:00:00 (Mon)
  61323181200, #      utc_end 1944-04-03 01:00:00 (Mon)
  61307460000, #  local_start 1943-10-04 02:00:00 (Mon)
  61323184800, #    local_end 1944-04-03 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61323181200, #    utc_start 1944-04-03 01:00:00 (Mon)
  61338808800, #      utc_end 1944-09-30 22:00:00 (Sat)
  61323188400, #  local_start 1944-04-03 03:00:00 (Mon)
  61338816000, #    local_end 1944-10-01 00:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  61338808800, #    utc_start 1944-09-30 22:00:00 (Sat)
  61339075200, #      utc_end 1944-10-04 00:00:00 (Wed)
  61338816000, #  local_start 1944-10-01 00:00:00 (Sun)
  61339082400, #    local_end 1944-10-04 02:00:00 (Wed)
  7200,
  1,
  'CEST',
      ],
      [
  61339075200, #    utc_start 1944-10-04 00:00:00 (Wed)
  61356956400, #      utc_end 1945-04-28 23:00:00 (Sat)
  61339078800, #  local_start 1944-10-04 01:00:00 (Wed)
  61356960000, #    local_end 1945-04-29 00:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  61356956400, #    utc_start 1945-04-28 23:00:00 (Sat)
  61373023200, #      utc_end 1945-10-31 22:00:00 (Wed)
  61356963600, #  local_start 1945-04-29 01:00:00 (Sun)
  61373030400, #    local_end 1945-11-01 00:00:00 (Thu)
  7200,
  1,
  'CEST',
      ],
      [
  61373023200, #    utc_start 1945-10-31 22:00:00 (Wed)
  61387196400, #      utc_end 1946-04-13 23:00:00 (Sat)
  61373026800, #  local_start 1945-10-31 23:00:00 (Wed)
  61387200000, #    local_end 1946-04-14 00:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  61387196400, #    utc_start 1946-04-13 23:00:00 (Sat)
  61402410000, #      utc_end 1946-10-07 01:00:00 (Mon)
  61387203600, #  local_start 1946-04-14 01:00:00 (Sun)
  61402417200, #    local_end 1946-10-07 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61402410000, #    utc_start 1946-10-07 01:00:00 (Mon)
  61420467600, #      utc_end 1947-05-04 01:00:00 (Sun)
  61402413600, #  local_start 1946-10-07 02:00:00 (Mon)
  61420471200, #    local_end 1947-05-04 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  61420467600, #    utc_start 1947-05-04 01:00:00 (Sun)
  61433773200, #      utc_end 1947-10-05 01:00:00 (Sun)
  61420474800, #  local_start 1947-05-04 03:00:00 (Sun)
  61433780400, #    local_end 1947-10-05 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  61433773200, #    utc_start 1947-10-05 01:00:00 (Sun)
  61450707600, #      utc_end 1948-04-18 01:00:00 (Sun)
  61433776800, #  local_start 1947-10-05 02:00:00 (Sun)
  61450711200, #    local_end 1948-04-18 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  61450707600, #    utc_start 1948-04-18 01:00:00 (Sun)
  61465222800, #      utc_end 1948-10-03 01:00:00 (Sun)
  61450714800, #  local_start 1948-04-18 03:00:00 (Sun)
  61465230000, #    local_end 1948-10-03 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  61465222800, #    utc_start 1948-10-03 01:00:00 (Sun)
  61481552400, #      utc_end 1949-04-10 01:00:00 (Sun)
  61465226400, #  local_start 1948-10-03 02:00:00 (Sun)
  61481556000, #    local_end 1949-04-10 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  61481552400, #    utc_start 1949-04-10 01:00:00 (Sun)
  61496672400, #      utc_end 1949-10-02 01:00:00 (Sun)
  61481559600, #  local_start 1949-04-10 03:00:00 (Sun)
  61496679600, #    local_end 1949-10-02 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  61496672400, #    utc_start 1949-10-02 01:00:00 (Sun)
  61738588800, #      utc_end 1957-06-02 00:00:00 (Sun)
  61496676000, #  local_start 1949-10-02 02:00:00 (Sun)
  61738592400, #    local_end 1957-06-02 01:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  61738588800, #    utc_start 1957-06-02 00:00:00 (Sun)
  61748870400, #      utc_end 1957-09-29 00:00:00 (Sun)
  61738596000, #  local_start 1957-06-02 02:00:00 (Sun)
  61748877600, #    local_end 1957-09-29 02:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  61748870400, #    utc_start 1957-09-29 00:00:00 (Sun)
  61764595200, #      utc_end 1958-03-30 00:00:00 (Sun)
  61748874000, #  local_start 1957-09-29 01:00:00 (Sun)
  61764598800, #    local_end 1958-03-30 01:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  61764595200, #    utc_start 1958-03-30 00:00:00 (Sun)
  61780320000, #      utc_end 1958-09-28 00:00:00 (Sun)
  61764602400, #  local_start 1958-03-30 02:00:00 (Sun)
  61780327200, #    local_end 1958-09-28 02:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  61780320000, #    utc_start 1958-09-28 00:00:00 (Sun)
  61801488000, #      utc_end 1959-05-31 00:00:00 (Sun)
  61780323600, #  local_start 1958-09-28 01:00:00 (Sun)
  61801491600, #    local_end 1959-05-31 01:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  61801488000, #    utc_start 1959-05-31 00:00:00 (Sun)
  61812374400, #      utc_end 1959-10-04 00:00:00 (Sun)
  61801495200, #  local_start 1959-05-31 02:00:00 (Sun)
  61812381600, #    local_end 1959-10-04 02:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  61812374400, #    utc_start 1959-10-04 00:00:00 (Sun)
  61828099200, #      utc_end 1960-04-03 00:00:00 (Sun)
  61812378000, #  local_start 1959-10-04 01:00:00 (Sun)
  61828102800, #    local_end 1960-04-03 01:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  61828099200, #    utc_start 1960-04-03 00:00:00 (Sun)
  61843824000, #      utc_end 1960-10-02 00:00:00 (Sun)
  61828106400, #  local_start 1960-04-03 02:00:00 (Sun)
  61843831200, #    local_end 1960-10-02 02:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  61843824000, #    utc_start 1960-10-02 00:00:00 (Sun)
  61864387200, #      utc_end 1961-05-28 00:00:00 (Sun)
  61843827600, #  local_start 1960-10-02 01:00:00 (Sun)
  61864390800, #    local_end 1961-05-28 01:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  61864387200, #    utc_start 1961-05-28 00:00:00 (Sun)
  61875273600, #      utc_end 1961-10-01 00:00:00 (Sun)
  61864394400, #  local_start 1961-05-28 02:00:00 (Sun)
  61875280800, #    local_end 1961-10-01 02:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  61875273600, #    utc_start 1961-10-01 00:00:00 (Sun)
  61895836800, #      utc_end 1962-05-27 00:00:00 (Sun)
  61875277200, #  local_start 1961-10-01 01:00:00 (Sun)
  61895840400, #    local_end 1962-05-27 01:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  61895836800, #    utc_start 1962-05-27 00:00:00 (Sun)
  61906723200, #      utc_end 1962-09-30 00:00:00 (Sun)
  61895844000, #  local_start 1962-05-27 02:00:00 (Sun)
  61906730400, #    local_end 1962-09-30 02:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  61906723200, #    utc_start 1962-09-30 00:00:00 (Sun)
  61927286400, #      utc_end 1963-05-26 00:00:00 (Sun)
  61906726800, #  local_start 1962-09-30 01:00:00 (Sun)
  61927290000, #    local_end 1963-05-26 01:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  61927286400, #    utc_start 1963-05-26 00:00:00 (Sun)
  61938172800, #      utc_end 1963-09-29 00:00:00 (Sun)
  61927293600, #  local_start 1963-05-26 02:00:00 (Sun)
  61938180000, #    local_end 1963-09-29 02:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  61938172800, #    utc_start 1963-09-29 00:00:00 (Sun)
  61959340800, #      utc_end 1964-05-31 00:00:00 (Sun)
  61938176400, #  local_start 1963-09-29 01:00:00 (Sun)
  61959344400, #    local_end 1964-05-31 01:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  61959340800, #    utc_start 1964-05-31 00:00:00 (Sun)
  61969622400, #      utc_end 1964-09-27 00:00:00 (Sun)
  61959348000, #  local_start 1964-05-31 02:00:00 (Sun)
  61969629600, #    local_end 1964-09-27 02:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  61969622400, #    utc_start 1964-09-27 00:00:00 (Sun)
  62356604400, #      utc_end 1976-12-31 23:00:00 (Fri)
  61969626000, #  local_start 1964-09-27 01:00:00 (Sun)
  62356608000, #    local_end 1977-01-01 00:00:00 (Sat)
  3600,
  0,
  'CET',
      ],
      [
  62356604400, #    utc_start 1976-12-31 23:00:00 (Fri)
  62364556800, #      utc_end 1977-04-03 00:00:00 (Sun)
  62356608000, #  local_start 1977-01-01 00:00:00 (Sat)
  62364560400, #    local_end 1977-04-03 01:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62364556800, #    utc_start 1977-04-03 00:00:00 (Sun)
  62379676800, #      utc_end 1977-09-25 00:00:00 (Sun)
  62364564000, #  local_start 1977-04-03 02:00:00 (Sun)
  62379684000, #    local_end 1977-09-25 02:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62379676800, #    utc_start 1977-09-25 00:00:00 (Sun)
  62396006400, #      utc_end 1978-04-02 00:00:00 (Sun)
  62379680400, #  local_start 1977-09-25 01:00:00 (Sun)
  62396010000, #    local_end 1978-04-02 01:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62396006400, #    utc_start 1978-04-02 00:00:00 (Sun)
  62411731200, #      utc_end 1978-10-01 00:00:00 (Sun)
  62396013600, #  local_start 1978-04-02 02:00:00 (Sun)
  62411738400, #    local_end 1978-10-01 02:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62411731200, #    utc_start 1978-10-01 00:00:00 (Sun)
  62427456000, #      utc_end 1979-04-01 00:00:00 (Sun)
  62411734800, #  local_start 1978-10-01 01:00:00 (Sun)
  62427459600, #    local_end 1979-04-01 01:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62427456000, #    utc_start 1979-04-01 00:00:00 (Sun)
  62443180800, #      utc_end 1979-09-30 00:00:00 (Sun)
  62427463200, #  local_start 1979-04-01 02:00:00 (Sun)
  62443188000, #    local_end 1979-09-30 02:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62443180800, #    utc_start 1979-09-30 00:00:00 (Sun)
  62459510400, #      utc_end 1980-04-06 00:00:00 (Sun)
  62443184400, #  local_start 1979-09-30 01:00:00 (Sun)
  62459514000, #    local_end 1980-04-06 01:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62459510400, #    utc_start 1980-04-06 00:00:00 (Sun)
  62474630400, #      utc_end 1980-09-28 00:00:00 (Sun)
  62459517600, #  local_start 1980-04-06 02:00:00 (Sun)
  62474637600, #    local_end 1980-09-28 02:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62474630400, #    utc_start 1980-09-28 00:00:00 (Sun)
  62490355200, #      utc_end 1981-03-29 00:00:00 (Sun)
  62474634000, #  local_start 1980-09-28 01:00:00 (Sun)
  62490358800, #    local_end 1981-03-29 01:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62490355200, #    utc_start 1981-03-29 00:00:00 (Sun)
  62506080000, #      utc_end 1981-09-27 00:00:00 (Sun)
  62490362400, #  local_start 1981-03-29 02:00:00 (Sun)
  62506087200, #    local_end 1981-09-27 02:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62506080000, #    utc_start 1981-09-27 00:00:00 (Sun)
  62521804800, #      utc_end 1982-03-28 00:00:00 (Sun)
  62506083600, #  local_start 1981-09-27 01:00:00 (Sun)
  62521808400, #    local_end 1982-03-28 01:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62521804800, #    utc_start 1982-03-28 00:00:00 (Sun)
  62537529600, #      utc_end 1982-09-26 00:00:00 (Sun)
  62521812000, #  local_start 1982-03-28 02:00:00 (Sun)
  62537536800, #    local_end 1982-09-26 02:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62537529600, #    utc_start 1982-09-26 00:00:00 (Sun)
  62553254400, #      utc_end 1983-03-27 00:00:00 (Sun)
  62537533200, #  local_start 1982-09-26 01:00:00 (Sun)
  62553258000, #    local_end 1983-03-27 01:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62553254400, #    utc_start 1983-03-27 00:00:00 (Sun)
  62568979200, #      utc_end 1983-09-25 00:00:00 (Sun)
  62553261600, #  local_start 1983-03-27 02:00:00 (Sun)
  62568986400, #    local_end 1983-09-25 02:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62568979200, #    utc_start 1983-09-25 00:00:00 (Sun)
  62584704000, #      utc_end 1984-03-25 00:00:00 (Sun)
  62568982800, #  local_start 1983-09-25 01:00:00 (Sun)
  62584707600, #    local_end 1984-03-25 01:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62584704000, #    utc_start 1984-03-25 00:00:00 (Sun)
  62601033600, #      utc_end 1984-09-30 00:00:00 (Sun)
  62584711200, #  local_start 1984-03-25 02:00:00 (Sun)
  62601040800, #    local_end 1984-09-30 02:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62601033600, #    utc_start 1984-09-30 00:00:00 (Sun)
  62616758400, #      utc_end 1985-03-31 00:00:00 (Sun)
  62601037200, #  local_start 1984-09-30 01:00:00 (Sun)
  62616762000, #    local_end 1985-03-31 01:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62616758400, #    utc_start 1985-03-31 00:00:00 (Sun)
  62632483200, #      utc_end 1985-09-29 00:00:00 (Sun)
  62616765600, #  local_start 1985-03-31 02:00:00 (Sun)
  62632490400, #    local_end 1985-09-29 02:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62632483200, #    utc_start 1985-09-29 00:00:00 (Sun)
  62648208000, #      utc_end 1986-03-30 00:00:00 (Sun)
  62632486800, #  local_start 1985-09-29 01:00:00 (Sun)
  62648211600, #    local_end 1986-03-30 01:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62648208000, #    utc_start 1986-03-30 00:00:00 (Sun)
  62663932800, #      utc_end 1986-09-28 00:00:00 (Sun)
  62648215200, #  local_start 1986-03-30 02:00:00 (Sun)
  62663940000, #    local_end 1986-09-28 02:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62663932800, #    utc_start 1986-09-28 00:00:00 (Sun)
  62679657600, #      utc_end 1987-03-29 00:00:00 (Sun)
  62663936400, #  local_start 1986-09-28 01:00:00 (Sun)
  62679661200, #    local_end 1987-03-29 01:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62679657600, #    utc_start 1987-03-29 00:00:00 (Sun)
  62695382400, #      utc_end 1987-09-27 00:00:00 (Sun)
  62679664800, #  local_start 1987-03-29 02:00:00 (Sun)
  62695389600, #    local_end 1987-09-27 02:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62695382400, #    utc_start 1987-09-27 00:00:00 (Sun)
  62703673200, #      utc_end 1987-12-31 23:00:00 (Thu)
  62695386000, #  local_start 1987-09-27 01:00:00 (Sun)
  62703676800, #    local_end 1988-01-01 00:00:00 (Fri)
  3600,
  0,
  'CET',
      ],
      [
  62703673200, #    utc_start 1987-12-31 23:00:00 (Thu)
  62711110800, #      utc_end 1988-03-27 01:00:00 (Sun)
  62703676800, #  local_start 1988-01-01 00:00:00 (Fri)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62711110800, #    utc_start 1988-03-27 01:00:00 (Sun)
  62726835600, #      utc_end 1988-09-25 01:00:00 (Sun)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62726835600, #    utc_start 1988-09-25 01:00:00 (Sun)
  62742560400, #      utc_end 1989-03-26 01:00:00 (Sun)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62742560400, #    utc_start 1989-03-26 01:00:00 (Sun)
  62758285200, #      utc_end 1989-09-24 01:00:00 (Sun)
  62742567600, #  local_start 1989-03-26 03:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62758285200, #    utc_start 1989-09-24 01:00:00 (Sun)
  62774010000, #      utc_end 1990-03-25 01:00:00 (Sun)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62774010000, #    utc_start 1990-03-25 01:00:00 (Sun)
  62790339600, #      utc_end 1990-09-30 01:00:00 (Sun)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62790339600, #    utc_start 1990-09-30 01:00:00 (Sun)
  62806064400, #      utc_end 1991-03-31 01:00:00 (Sun)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62806064400, #    utc_start 1991-03-31 01:00:00 (Sun)
  62821789200, #      utc_end 1991-09-29 01:00:00 (Sun)
  62806071600, #  local_start 1991-03-31 03:00:00 (Sun)
  62821796400, #    local_end 1991-09-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62821789200, #    utc_start 1991-09-29 01:00:00 (Sun)
  62837514000, #      utc_end 1992-03-29 01:00:00 (Sun)
  62821792800, #  local_start 1991-09-29 02:00:00 (Sun)
  62837517600, #    local_end 1992-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62837514000, #    utc_start 1992-03-29 01:00:00 (Sun)
  62853238800, #      utc_end 1992-09-27 01:00:00 (Sun)
  62837521200, #  local_start 1992-03-29 03:00:00 (Sun)
  62853246000, #    local_end 1992-09-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62853238800, #    utc_start 1992-09-27 01:00:00 (Sun)
  62868963600, #      utc_end 1993-03-28 01:00:00 (Sun)
  62853242400, #  local_start 1992-09-27 02:00:00 (Sun)
  62868967200, #    local_end 1993-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62868963600, #    utc_start 1993-03-28 01:00:00 (Sun)
  62884688400, #      utc_end 1993-09-26 01:00:00 (Sun)
  62868970800, #  local_start 1993-03-28 03:00:00 (Sun)
  62884695600, #    local_end 1993-09-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62884688400, #    utc_start 1993-09-26 01:00:00 (Sun)
  62900413200, #      utc_end 1994-03-27 01:00:00 (Sun)
  62884692000, #  local_start 1993-09-26 02:00:00 (Sun)
  62900416800, #    local_end 1994-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62900413200, #    utc_start 1994-03-27 01:00:00 (Sun)
  62916138000, #      utc_end 1994-09-25 01:00:00 (Sun)
  62900420400, #  local_start 1994-03-27 03:00:00 (Sun)
  62916145200, #    local_end 1994-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62916138000, #    utc_start 1994-09-25 01:00:00 (Sun)
  62931862800, #      utc_end 1995-03-26 01:00:00 (Sun)
  62916141600, #  local_start 1994-09-25 02:00:00 (Sun)
  62931866400, #    local_end 1995-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62931862800, #    utc_start 1995-03-26 01:00:00 (Sun)
  62947587600, #      utc_end 1995-09-24 01:00:00 (Sun)
  62931870000, #  local_start 1995-03-26 03:00:00 (Sun)
  62947594800, #    local_end 1995-09-24 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62947587600, #    utc_start 1995-09-24 01:00:00 (Sun)
  62963917200, #      utc_end 1996-03-31 01:00:00 (Sun)
  62947591200, #  local_start 1995-09-24 02:00:00 (Sun)
  62963920800, #    local_end 1996-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62963917200, #    utc_start 1996-03-31 01:00:00 (Sun)
  62982061200, #      utc_end 1996-10-27 01:00:00 (Sun)
  62963924400, #  local_start 1996-03-31 03:00:00 (Sun)
  62982068400, #    local_end 1996-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62982061200, #    utc_start 1996-10-27 01:00:00 (Sun)
  62995366800, #      utc_end 1997-03-30 01:00:00 (Sun)
  62982064800, #  local_start 1996-10-27 02:00:00 (Sun)
  62995370400, #    local_end 1997-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62995366800, #    utc_start 1997-03-30 01:00:00 (Sun)
  63013510800, #      utc_end 1997-10-26 01:00:00 (Sun)
  62995374000, #  local_start 1997-03-30 03:00:00 (Sun)
  63013518000, #    local_end 1997-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63013510800, #    utc_start 1997-10-26 01:00:00 (Sun)
  63026816400, #      utc_end 1998-03-29 01:00:00 (Sun)
  63013514400, #  local_start 1997-10-26 02:00:00 (Sun)
  63026820000, #    local_end 1998-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63026816400, #    utc_start 1998-03-29 01:00:00 (Sun)
  63044960400, #      utc_end 1998-10-25 01:00:00 (Sun)
  63026823600, #  local_start 1998-03-29 03:00:00 (Sun)
  63044967600, #    local_end 1998-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63044960400, #    utc_start 1998-10-25 01:00:00 (Sun)
  63058266000, #      utc_end 1999-03-28 01:00:00 (Sun)
  63044964000, #  local_start 1998-10-25 02:00:00 (Sun)
  63058269600, #    local_end 1999-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63058266000, #    utc_start 1999-03-28 01:00:00 (Sun)
  63077014800, #      utc_end 1999-10-31 01:00:00 (Sun)
  63058273200, #  local_start 1999-03-28 03:00:00 (Sun)
  63077022000, #    local_end 1999-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63077014800, #    utc_start 1999-10-31 01:00:00 (Sun)
  63089715600, #      utc_end 2000-03-26 01:00:00 (Sun)
  63077018400, #  local_start 1999-10-31 02:00:00 (Sun)
  63089719200, #    local_end 2000-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63089715600, #    utc_start 2000-03-26 01:00:00 (Sun)
  63108464400, #      utc_end 2000-10-29 01:00:00 (Sun)
  63089722800, #  local_start 2000-03-26 03:00:00 (Sun)
  63108471600, #    local_end 2000-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63108464400, #    utc_start 2000-10-29 01:00:00 (Sun)
  63121165200, #      utc_end 2001-03-25 01:00:00 (Sun)
  63108468000, #  local_start 2000-10-29 02:00:00 (Sun)
  63121168800, #    local_end 2001-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63121165200, #    utc_start 2001-03-25 01:00:00 (Sun)
  63139914000, #      utc_end 2001-10-28 01:00:00 (Sun)
  63121172400, #  local_start 2001-03-25 03:00:00 (Sun)
  63139921200, #    local_end 2001-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63139914000, #    utc_start 2001-10-28 01:00:00 (Sun)
  63153219600, #      utc_end 2002-03-31 01:00:00 (Sun)
  63139917600, #  local_start 2001-10-28 02:00:00 (Sun)
  63153223200, #    local_end 2002-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63153219600, #    utc_start 2002-03-31 01:00:00 (Sun)
  63171363600, #      utc_end 2002-10-27 01:00:00 (Sun)
  63153226800, #  local_start 2002-03-31 03:00:00 (Sun)
  63171370800, #    local_end 2002-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63171363600, #    utc_start 2002-10-27 01:00:00 (Sun)
  63184669200, #      utc_end 2003-03-30 01:00:00 (Sun)
  63171367200, #  local_start 2002-10-27 02:00:00 (Sun)
  63184672800, #    local_end 2003-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63184669200, #    utc_start 2003-03-30 01:00:00 (Sun)
  63202813200, #      utc_end 2003-10-26 01:00:00 (Sun)
  63184676400, #  local_start 2003-03-30 03:00:00 (Sun)
  63202820400, #    local_end 2003-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63202813200, #    utc_start 2003-10-26 01:00:00 (Sun)
  63216118800, #      utc_end 2004-03-28 01:00:00 (Sun)
  63202816800, #  local_start 2003-10-26 02:00:00 (Sun)
  63216122400, #    local_end 2004-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63216118800, #    utc_start 2004-03-28 01:00:00 (Sun)
  63234867600, #      utc_end 2004-10-31 01:00:00 (Sun)
  63216126000, #  local_start 2004-03-28 03:00:00 (Sun)
  63234874800, #    local_end 2004-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63234867600, #    utc_start 2004-10-31 01:00:00 (Sun)
  63247568400, #      utc_end 2005-03-27 01:00:00 (Sun)
  63234871200, #  local_start 2004-10-31 02:00:00 (Sun)
  63247572000, #    local_end 2005-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63247568400, #    utc_start 2005-03-27 01:00:00 (Sun)
  63266317200, #      utc_end 2005-10-30 01:00:00 (Sun)
  63247575600, #  local_start 2005-03-27 03:00:00 (Sun)
  63266324400, #    local_end 2005-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63266317200, #    utc_start 2005-10-30 01:00:00 (Sun)
  63279018000, #      utc_end 2006-03-26 01:00:00 (Sun)
  63266320800, #  local_start 2005-10-30 02:00:00 (Sun)
  63279021600, #    local_end 2006-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63279018000, #    utc_start 2006-03-26 01:00:00 (Sun)
  63297766800, #      utc_end 2006-10-29 01:00:00 (Sun)
  63279025200, #  local_start 2006-03-26 03:00:00 (Sun)
  63297774000, #    local_end 2006-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63297766800, #    utc_start 2006-10-29 01:00:00 (Sun)
  63310467600, #      utc_end 2007-03-25 01:00:00 (Sun)
  63297770400, #  local_start 2006-10-29 02:00:00 (Sun)
  63310471200, #    local_end 2007-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63310467600, #    utc_start 2007-03-25 01:00:00 (Sun)
  63329216400, #      utc_end 2007-10-28 01:00:00 (Sun)
  63310474800, #  local_start 2007-03-25 03:00:00 (Sun)
  63329223600, #    local_end 2007-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63329216400, #    utc_start 2007-10-28 01:00:00 (Sun)
  63342522000, #      utc_end 2008-03-30 01:00:00 (Sun)
  63329220000, #  local_start 2007-10-28 02:00:00 (Sun)
  63342525600, #    local_end 2008-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63342522000, #    utc_start 2008-03-30 01:00:00 (Sun)
  63360666000, #      utc_end 2008-10-26 01:00:00 (Sun)
  63342529200, #  local_start 2008-03-30 03:00:00 (Sun)
  63360673200, #    local_end 2008-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63360666000, #    utc_start 2008-10-26 01:00:00 (Sun)
  63373971600, #      utc_end 2009-03-29 01:00:00 (Sun)
  63360669600, #  local_start 2008-10-26 02:00:00 (Sun)
  63373975200, #    local_end 2009-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63373971600, #    utc_start 2009-03-29 01:00:00 (Sun)
  63392115600, #      utc_end 2009-10-25 01:00:00 (Sun)
  63373978800, #  local_start 2009-03-29 03:00:00 (Sun)
  63392122800, #    local_end 2009-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63392115600, #    utc_start 2009-10-25 01:00:00 (Sun)
  63405421200, #      utc_end 2010-03-28 01:00:00 (Sun)
  63392119200, #  local_start 2009-10-25 02:00:00 (Sun)
  63405424800, #    local_end 2010-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63405421200, #    utc_start 2010-03-28 01:00:00 (Sun)
  63424170000, #      utc_end 2010-10-31 01:00:00 (Sun)
  63405428400, #  local_start 2010-03-28 03:00:00 (Sun)
  63424177200, #    local_end 2010-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63424170000, #    utc_start 2010-10-31 01:00:00 (Sun)
  63436870800, #      utc_end 2011-03-27 01:00:00 (Sun)
  63424173600, #  local_start 2010-10-31 02:00:00 (Sun)
  63436874400, #    local_end 2011-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63436870800, #    utc_start 2011-03-27 01:00:00 (Sun)
  63455619600, #      utc_end 2011-10-30 01:00:00 (Sun)
  63436878000, #  local_start 2011-03-27 03:00:00 (Sun)
  63455626800, #    local_end 2011-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63455619600, #    utc_start 2011-10-30 01:00:00 (Sun)
  63468320400, #      utc_end 2012-03-25 01:00:00 (Sun)
  63455623200, #  local_start 2011-10-30 02:00:00 (Sun)
  63468324000, #    local_end 2012-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63468320400, #    utc_start 2012-03-25 01:00:00 (Sun)
  63487069200, #      utc_end 2012-10-28 01:00:00 (Sun)
  63468327600, #  local_start 2012-03-25 03:00:00 (Sun)
  63487076400, #    local_end 2012-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63487069200, #    utc_start 2012-10-28 01:00:00 (Sun)
  63500374800, #      utc_end 2013-03-31 01:00:00 (Sun)
  63487072800, #  local_start 2012-10-28 02:00:00 (Sun)
  63500378400, #    local_end 2013-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63500374800, #    utc_start 2013-03-31 01:00:00 (Sun)
  63518518800, #      utc_end 2013-10-27 01:00:00 (Sun)
  63500382000, #  local_start 2013-03-31 03:00:00 (Sun)
  63518526000, #    local_end 2013-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63518518800, #    utc_start 2013-10-27 01:00:00 (Sun)
  63531824400, #      utc_end 2014-03-30 01:00:00 (Sun)
  63518522400, #  local_start 2013-10-27 02:00:00 (Sun)
  63531828000, #    local_end 2014-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63531824400, #    utc_start 2014-03-30 01:00:00 (Sun)
  63549968400, #      utc_end 2014-10-26 01:00:00 (Sun)
  63531831600, #  local_start 2014-03-30 03:00:00 (Sun)
  63549975600, #    local_end 2014-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63549968400, #    utc_start 2014-10-26 01:00:00 (Sun)
  63563274000, #      utc_end 2015-03-29 01:00:00 (Sun)
  63549972000, #  local_start 2014-10-26 02:00:00 (Sun)
  63563277600, #    local_end 2015-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63563274000, #    utc_start 2015-03-29 01:00:00 (Sun)
  63581418000, #      utc_end 2015-10-25 01:00:00 (Sun)
  63563281200, #  local_start 2015-03-29 03:00:00 (Sun)
  63581425200, #    local_end 2015-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63581418000, #    utc_start 2015-10-25 01:00:00 (Sun)
  63594723600, #      utc_end 2016-03-27 01:00:00 (Sun)
  63581421600, #  local_start 2015-10-25 02:00:00 (Sun)
  63594727200, #    local_end 2016-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63594723600, #    utc_start 2016-03-27 01:00:00 (Sun)
  63613472400, #      utc_end 2016-10-30 01:00:00 (Sun)
  63594730800, #  local_start 2016-03-27 03:00:00 (Sun)
  63613479600, #    local_end 2016-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63613472400, #    utc_start 2016-10-30 01:00:00 (Sun)
  63626173200, #      utc_end 2017-03-26 01:00:00 (Sun)
  63613476000, #  local_start 2016-10-30 02:00:00 (Sun)
  63626176800, #    local_end 2017-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63626173200, #    utc_start 2017-03-26 01:00:00 (Sun)
  63644922000, #      utc_end 2017-10-29 01:00:00 (Sun)
  63626180400, #  local_start 2017-03-26 03:00:00 (Sun)
  63644929200, #    local_end 2017-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63644922000, #    utc_start 2017-10-29 01:00:00 (Sun)
  63657622800, #      utc_end 2018-03-25 01:00:00 (Sun)
  63644925600, #  local_start 2017-10-29 02:00:00 (Sun)
  63657626400, #    local_end 2018-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63657622800, #    utc_start 2018-03-25 01:00:00 (Sun)
  63676371600, #      utc_end 2018-10-28 01:00:00 (Sun)
  63657630000, #  local_start 2018-03-25 03:00:00 (Sun)
  63676378800, #    local_end 2018-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63676371600, #    utc_start 2018-10-28 01:00:00 (Sun)
  63689677200, #      utc_end 2019-03-31 01:00:00 (Sun)
  63676375200, #  local_start 2018-10-28 02:00:00 (Sun)
  63689680800, #    local_end 2019-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63689677200, #    utc_start 2019-03-31 01:00:00 (Sun)
  63707821200, #      utc_end 2019-10-27 01:00:00 (Sun)
  63689684400, #  local_start 2019-03-31 03:00:00 (Sun)
  63707828400, #    local_end 2019-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63707821200, #    utc_start 2019-10-27 01:00:00 (Sun)
  63721126800, #      utc_end 2020-03-29 01:00:00 (Sun)
  63707824800, #  local_start 2019-10-27 02:00:00 (Sun)
  63721130400, #    local_end 2020-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63721126800, #    utc_start 2020-03-29 01:00:00 (Sun)
  63739270800, #      utc_end 2020-10-25 01:00:00 (Sun)
  63721134000, #  local_start 2020-03-29 03:00:00 (Sun)
  63739278000, #    local_end 2020-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63739270800, #    utc_start 2020-10-25 01:00:00 (Sun)
  63752576400, #      utc_end 2021-03-28 01:00:00 (Sun)
  63739274400, #  local_start 2020-10-25 02:00:00 (Sun)
  63752580000, #    local_end 2021-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63752576400, #    utc_start 2021-03-28 01:00:00 (Sun)
  63771325200, #      utc_end 2021-10-31 01:00:00 (Sun)
  63752583600, #  local_start 2021-03-28 03:00:00 (Sun)
  63771332400, #    local_end 2021-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63771325200, #    utc_start 2021-10-31 01:00:00 (Sun)
  63784026000, #      utc_end 2022-03-27 01:00:00 (Sun)
  63771328800, #  local_start 2021-10-31 02:00:00 (Sun)
  63784029600, #    local_end 2022-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63784026000, #    utc_start 2022-03-27 01:00:00 (Sun)
  63802774800, #      utc_end 2022-10-30 01:00:00 (Sun)
  63784033200, #  local_start 2022-03-27 03:00:00 (Sun)
  63802782000, #    local_end 2022-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63802774800, #    utc_start 2022-10-30 01:00:00 (Sun)
  63815475600, #      utc_end 2023-03-26 01:00:00 (Sun)
  63802778400, #  local_start 2022-10-30 02:00:00 (Sun)
  63815479200, #    local_end 2023-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63815475600, #    utc_start 2023-03-26 01:00:00 (Sun)
  63834224400, #      utc_end 2023-10-29 01:00:00 (Sun)
  63815482800, #  local_start 2023-03-26 03:00:00 (Sun)
  63834231600, #    local_end 2023-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63834224400, #    utc_start 2023-10-29 01:00:00 (Sun)
  63847530000, #      utc_end 2024-03-31 01:00:00 (Sun)
  63834228000, #  local_start 2023-10-29 02:00:00 (Sun)
  63847533600, #    local_end 2024-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63847530000, #    utc_start 2024-03-31 01:00:00 (Sun)
  63865674000, #      utc_end 2024-10-27 01:00:00 (Sun)
  63847537200, #  local_start 2024-03-31 03:00:00 (Sun)
  63865681200, #    local_end 2024-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63865674000, #    utc_start 2024-10-27 01:00:00 (Sun)
  63878979600, #      utc_end 2025-03-30 01:00:00 (Sun)
  63865677600, #  local_start 2024-10-27 02:00:00 (Sun)
  63878983200, #    local_end 2025-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63878979600, #    utc_start 2025-03-30 01:00:00 (Sun)
  63897123600, #      utc_end 2025-10-26 01:00:00 (Sun)
  63878986800, #  local_start 2025-03-30 03:00:00 (Sun)
  63897130800, #    local_end 2025-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63897123600, #    utc_start 2025-10-26 01:00:00 (Sun)
  63910429200, #      utc_end 2026-03-29 01:00:00 (Sun)
  63897127200, #  local_start 2025-10-26 02:00:00 (Sun)
  63910432800, #    local_end 2026-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63910429200, #    utc_start 2026-03-29 01:00:00 (Sun)
  63928573200, #      utc_end 2026-10-25 01:00:00 (Sun)
  63910436400, #  local_start 2026-03-29 03:00:00 (Sun)
  63928580400, #    local_end 2026-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63928573200, #    utc_start 2026-10-25 01:00:00 (Sun)
  63941878800, #      utc_end 2027-03-28 01:00:00 (Sun)
  63928576800, #  local_start 2026-10-25 02:00:00 (Sun)
  63941882400, #    local_end 2027-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63941878800, #    utc_start 2027-03-28 01:00:00 (Sun)
  63960627600, #      utc_end 2027-10-31 01:00:00 (Sun)
  63941886000, #  local_start 2027-03-28 03:00:00 (Sun)
  63960634800, #    local_end 2027-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63960627600, #    utc_start 2027-10-31 01:00:00 (Sun)
  63973328400, #      utc_end 2028-03-26 01:00:00 (Sun)
  63960631200, #  local_start 2027-10-31 02:00:00 (Sun)
  63973332000, #    local_end 2028-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63973328400, #    utc_start 2028-03-26 01:00:00 (Sun)
  63992077200, #      utc_end 2028-10-29 01:00:00 (Sun)
  63973335600, #  local_start 2028-03-26 03:00:00 (Sun)
  63992084400, #    local_end 2028-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63992077200, #    utc_start 2028-10-29 01:00:00 (Sun)
  64004778000, #      utc_end 2029-03-25 01:00:00 (Sun)
  63992080800, #  local_start 2028-10-29 02:00:00 (Sun)
  64004781600, #    local_end 2029-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  64004778000, #    utc_start 2029-03-25 01:00:00 (Sun)
  64023526800, #      utc_end 2029-10-28 01:00:00 (Sun)
  64004785200, #  local_start 2029-03-25 03:00:00 (Sun)
  64023534000, #    local_end 2029-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  64023526800, #    utc_start 2029-10-28 01:00:00 (Sun)
  64036832400, #      utc_end 2030-03-31 01:00:00 (Sun)
  64023530400, #  local_start 2029-10-28 02:00:00 (Sun)
  64036836000, #    local_end 2030-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  64036832400, #    utc_start 2030-03-31 01:00:00 (Sun)
  64054976400, #      utc_end 2030-10-27 01:00:00 (Sun)
  64036839600, #  local_start 2030-03-31 03:00:00 (Sun)
  64054983600, #    local_end 2030-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {75}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { 3600 }
  
  my $last_observance = bless( {
    'format' => 'CE%sT',
    'gmtoff' => '1:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 725737,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 725737,
      'utc_rd_secs' => 0,
      'utc_year' => 1989
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => 3600,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 725736,
      'local_rd_secs' => 82800,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 725736,
      'utc_rd_secs' => 82800,
      'utc_year' => 1988
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '1:00u',
      'from' => '1981',
      'in' => 'Mar',
      'letter' => 'S',
      'name' => 'EU',
      'offset_from_std' => 3600,
      'on' => 'lastSun',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '1:00u',
      'from' => '1996',
      'in' => 'Oct',
      'letter' => '',
      'name' => 'EU',
      'offset_from_std' => 0,
      'on' => 'lastSun',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_EUROPE_WARSAW

    $main::fatpacked{"DateTime/TimeZone/Europe/Zaporozhye.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_EUROPE_ZAPOROZHYE';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Europe::Zaporozhye;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Europe::Zaporozhye::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59295533960, #      utc_end 1879-12-31 21:39:20 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59295542400, #    local_end 1880-01-01 00:00:00 (Thu)
  8440,
  0,
  'LMT',
      ],
      [
  59295533960, #    utc_start 1879-12-31 21:39:20 (Wed)
  60694522800, #      utc_end 1924-05-01 21:40:00 (Thu)
  59295542360, #  local_start 1879-12-31 23:59:20 (Wed)
  60694531200, #    local_end 1924-05-02 00:00:00 (Fri)
  8400,
  0,
  '+0220',
      ],
      [
  60694522800, #    utc_start 1924-05-01 21:40:00 (Thu)
  60888146400, #      utc_end 1930-06-20 22:00:00 (Fri)
  60694530000, #  local_start 1924-05-01 23:40:00 (Thu)
  60888153600, #    local_end 1930-06-21 00:00:00 (Sat)
  7200,
  0,
  'EET',
      ],
      [
  60888146400, #    utc_start 1930-06-20 22:00:00 (Fri)
  61240914000, #      utc_end 1941-08-24 21:00:00 (Sun)
  60888157200, #  local_start 1930-06-21 01:00:00 (Sat)
  61240924800, #    local_end 1941-08-25 00:00:00 (Mon)
  10800,
  0,
  'MSK',
      ],
      [
  61240914000, #    utc_start 1941-08-24 21:00:00 (Sun)
  61278426000, #      utc_end 1942-11-02 01:00:00 (Mon)
  61240921200, #  local_start 1941-08-24 23:00:00 (Sun)
  61278433200, #    local_end 1942-11-02 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61278426000, #    utc_start 1942-11-02 01:00:00 (Mon)
  61291126800, #      utc_end 1943-03-29 01:00:00 (Mon)
  61278429600, #  local_start 1942-11-02 02:00:00 (Mon)
  61291130400, #    local_end 1943-03-29 02:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61291126800, #    utc_start 1943-03-29 01:00:00 (Mon)
  61307456400, #      utc_end 1943-10-04 01:00:00 (Mon)
  61291134000, #  local_start 1943-03-29 03:00:00 (Mon)
  61307463600, #    local_end 1943-10-04 03:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61307456400, #    utc_start 1943-10-04 01:00:00 (Mon)
  61309263600, #      utc_end 1943-10-24 23:00:00 (Sun)
  61307460000, #  local_start 1943-10-04 02:00:00 (Mon)
  61309267200, #    local_end 1943-10-25 00:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61309263600, #    utc_start 1943-10-24 23:00:00 (Sun)
  62490603600, #      utc_end 1981-03-31 21:00:00 (Tue)
  61309274400, #  local_start 1943-10-25 02:00:00 (Mon)
  62490614400, #    local_end 1981-04-01 00:00:00 (Wed)
  10800,
  0,
  'MSK',
      ],
      [
  62490603600, #    utc_start 1981-03-31 21:00:00 (Tue)
  62506411200, #      utc_end 1981-09-30 20:00:00 (Wed)
  62490618000, #  local_start 1981-04-01 01:00:00 (Wed)
  62506425600, #    local_end 1981-10-01 00:00:00 (Thu)
  14400,
  1,
  'MSD',
      ],
      [
  62506411200, #    utc_start 1981-09-30 20:00:00 (Wed)
  62522139600, #      utc_end 1982-03-31 21:00:00 (Wed)
  62506422000, #  local_start 1981-09-30 23:00:00 (Wed)
  62522150400, #    local_end 1982-04-01 00:00:00 (Thu)
  10800,
  0,
  'MSK',
      ],
      [
  62522139600, #    utc_start 1982-03-31 21:00:00 (Wed)
  62537947200, #      utc_end 1982-09-30 20:00:00 (Thu)
  62522154000, #  local_start 1982-04-01 01:00:00 (Thu)
  62537961600, #    local_end 1982-10-01 00:00:00 (Fri)
  14400,
  1,
  'MSD',
      ],
      [
  62537947200, #    utc_start 1982-09-30 20:00:00 (Thu)
  62553675600, #      utc_end 1983-03-31 21:00:00 (Thu)
  62537958000, #  local_start 1982-09-30 23:00:00 (Thu)
  62553686400, #    local_end 1983-04-01 00:00:00 (Fri)
  10800,
  0,
  'MSK',
      ],
      [
  62553675600, #    utc_start 1983-03-31 21:00:00 (Thu)
  62569483200, #      utc_end 1983-09-30 20:00:00 (Fri)
  62553690000, #  local_start 1983-04-01 01:00:00 (Fri)
  62569497600, #    local_end 1983-10-01 00:00:00 (Sat)
  14400,
  1,
  'MSD',
      ],
      [
  62569483200, #    utc_start 1983-09-30 20:00:00 (Fri)
  62585298000, #      utc_end 1984-03-31 21:00:00 (Sat)
  62569494000, #  local_start 1983-09-30 23:00:00 (Fri)
  62585308800, #    local_end 1984-04-01 00:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62585298000, #    utc_start 1984-03-31 21:00:00 (Sat)
  62601030000, #      utc_end 1984-09-29 23:00:00 (Sat)
  62585312400, #  local_start 1984-04-01 01:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62601030000, #    utc_start 1984-09-29 23:00:00 (Sat)
  62616754800, #      utc_end 1985-03-30 23:00:00 (Sat)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62616754800, #    utc_start 1985-03-30 23:00:00 (Sat)
  62632479600, #      utc_end 1985-09-28 23:00:00 (Sat)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62632479600, #    utc_start 1985-09-28 23:00:00 (Sat)
  62648204400, #      utc_end 1986-03-29 23:00:00 (Sat)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62648204400, #    utc_start 1986-03-29 23:00:00 (Sat)
  62663929200, #      utc_end 1986-09-27 23:00:00 (Sat)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62663929200, #    utc_start 1986-09-27 23:00:00 (Sat)
  62679654000, #      utc_end 1987-03-28 23:00:00 (Sat)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62679654000, #    utc_start 1987-03-28 23:00:00 (Sat)
  62695378800, #      utc_end 1987-09-26 23:00:00 (Sat)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62695378800, #    utc_start 1987-09-26 23:00:00 (Sat)
  62711103600, #      utc_end 1988-03-26 23:00:00 (Sat)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62711103600, #    utc_start 1988-03-26 23:00:00 (Sat)
  62726828400, #      utc_end 1988-09-24 23:00:00 (Sat)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62726828400, #    utc_start 1988-09-24 23:00:00 (Sat)
  62742553200, #      utc_end 1989-03-25 23:00:00 (Sat)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62742553200, #    utc_start 1989-03-25 23:00:00 (Sat)
  62758278000, #      utc_end 1989-09-23 23:00:00 (Sat)
  62742567600, #  local_start 1989-03-26 03:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62758278000, #    utc_start 1989-09-23 23:00:00 (Sat)
  62774002800, #      utc_end 1990-03-24 23:00:00 (Sat)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62774002800, #    utc_start 1990-03-24 23:00:00 (Sat)
  62790332400, #      utc_end 1990-09-29 23:00:00 (Sat)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  14400,
  1,
  'MSD',
      ],
      [
  62790332400, #    utc_start 1990-09-29 23:00:00 (Sat)
  62806057200, #      utc_end 1991-03-30 23:00:00 (Sat)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  10800,
  0,
  'MSK',
      ],
      [
  62806057200, #    utc_start 1991-03-30 23:00:00 (Sat)
  62821774800, #      utc_end 1991-09-28 21:00:00 (Sat)
  62806068000, #  local_start 1991-03-31 02:00:00 (Sun)
  62821785600, #    local_end 1991-09-29 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62821774800, #    utc_start 1991-09-28 21:00:00 (Sat)
  62837503200, #      utc_end 1992-03-28 22:00:00 (Sat)
  62821782000, #  local_start 1991-09-28 23:00:00 (Sat)
  62837510400, #    local_end 1992-03-29 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62837503200, #    utc_start 1992-03-28 22:00:00 (Sat)
  62853224400, #      utc_end 1992-09-26 21:00:00 (Sat)
  62837514000, #  local_start 1992-03-29 01:00:00 (Sun)
  62853235200, #    local_end 1992-09-27 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62853224400, #    utc_start 1992-09-26 21:00:00 (Sat)
  62868952800, #      utc_end 1993-03-27 22:00:00 (Sat)
  62853231600, #  local_start 1992-09-26 23:00:00 (Sat)
  62868960000, #    local_end 1993-03-28 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62868952800, #    utc_start 1993-03-27 22:00:00 (Sat)
  62884674000, #      utc_end 1993-09-25 21:00:00 (Sat)
  62868963600, #  local_start 1993-03-28 01:00:00 (Sun)
  62884684800, #    local_end 1993-09-26 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62884674000, #    utc_start 1993-09-25 21:00:00 (Sat)
  62900402400, #      utc_end 1994-03-26 22:00:00 (Sat)
  62884681200, #  local_start 1993-09-25 23:00:00 (Sat)
  62900409600, #    local_end 1994-03-27 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62900402400, #    utc_start 1994-03-26 22:00:00 (Sat)
  62916123600, #      utc_end 1994-09-24 21:00:00 (Sat)
  62900413200, #  local_start 1994-03-27 01:00:00 (Sun)
  62916134400, #    local_end 1994-09-25 00:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62916123600, #    utc_start 1994-09-24 21:00:00 (Sat)
  62924594400, #      utc_end 1994-12-31 22:00:00 (Sat)
  62916130800, #  local_start 1994-09-24 23:00:00 (Sat)
  62924601600, #    local_end 1995-01-01 00:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62924594400, #    utc_start 1994-12-31 22:00:00 (Sat)
  62931862800, #      utc_end 1995-03-26 01:00:00 (Sun)
  62924601600, #  local_start 1995-01-01 00:00:00 (Sun)
  62931870000, #    local_end 1995-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62931862800, #    utc_start 1995-03-26 01:00:00 (Sun)
  62947587600, #      utc_end 1995-09-24 01:00:00 (Sun)
  62931873600, #  local_start 1995-03-26 04:00:00 (Sun)
  62947598400, #    local_end 1995-09-24 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62947587600, #    utc_start 1995-09-24 01:00:00 (Sun)
  62963917200, #      utc_end 1996-03-31 01:00:00 (Sun)
  62947594800, #  local_start 1995-09-24 03:00:00 (Sun)
  62963924400, #    local_end 1996-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62963917200, #    utc_start 1996-03-31 01:00:00 (Sun)
  62982061200, #      utc_end 1996-10-27 01:00:00 (Sun)
  62963928000, #  local_start 1996-03-31 04:00:00 (Sun)
  62982072000, #    local_end 1996-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  62982061200, #    utc_start 1996-10-27 01:00:00 (Sun)
  62995366800, #      utc_end 1997-03-30 01:00:00 (Sun)
  62982068400, #  local_start 1996-10-27 03:00:00 (Sun)
  62995374000, #    local_end 1997-03-30 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  62995366800, #    utc_start 1997-03-30 01:00:00 (Sun)
  63013510800, #      utc_end 1997-10-26 01:00:00 (Sun)
  62995377600, #  local_start 1997-03-30 04:00:00 (Sun)
  63013521600, #    local_end 1997-10-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63013510800, #    utc_start 1997-10-26 01:00:00 (Sun)
  63026816400, #      utc_end 1998-03-29 01:00:00 (Sun)
  63013518000, #  local_start 1997-10-26 03:00:00 (Sun)
  63026823600, #    local_end 1998-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63026816400, #    utc_start 1998-03-29 01:00:00 (Sun)
  63044960400, #      utc_end 1998-10-25 01:00:00 (Sun)
  63026827200, #  local_start 1998-03-29 04:00:00 (Sun)
  63044971200, #    local_end 1998-10-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63044960400, #    utc_start 1998-10-25 01:00:00 (Sun)
  63058266000, #      utc_end 1999-03-28 01:00:00 (Sun)
  63044967600, #  local_start 1998-10-25 03:00:00 (Sun)
  63058273200, #    local_end 1999-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63058266000, #    utc_start 1999-03-28 01:00:00 (Sun)
  63077014800, #      utc_end 1999-10-31 01:00:00 (Sun)
  63058276800, #  local_start 1999-03-28 04:00:00 (Sun)
  63077025600, #    local_end 1999-10-31 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63077014800, #    utc_start 1999-10-31 01:00:00 (Sun)
  63089715600, #      utc_end 2000-03-26 01:00:00 (Sun)
  63077022000, #  local_start 1999-10-31 03:00:00 (Sun)
  63089722800, #    local_end 2000-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63089715600, #    utc_start 2000-03-26 01:00:00 (Sun)
  63108464400, #      utc_end 2000-10-29 01:00:00 (Sun)
  63089726400, #  local_start 2000-03-26 04:00:00 (Sun)
  63108475200, #    local_end 2000-10-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63108464400, #    utc_start 2000-10-29 01:00:00 (Sun)
  63121165200, #      utc_end 2001-03-25 01:00:00 (Sun)
  63108471600, #  local_start 2000-10-29 03:00:00 (Sun)
  63121172400, #    local_end 2001-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63121165200, #    utc_start 2001-03-25 01:00:00 (Sun)
  63139914000, #      utc_end 2001-10-28 01:00:00 (Sun)
  63121176000, #  local_start 2001-03-25 04:00:00 (Sun)
  63139924800, #    local_end 2001-10-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63139914000, #    utc_start 2001-10-28 01:00:00 (Sun)
  63153219600, #      utc_end 2002-03-31 01:00:00 (Sun)
  63139921200, #  local_start 2001-10-28 03:00:00 (Sun)
  63153226800, #    local_end 2002-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63153219600, #    utc_start 2002-03-31 01:00:00 (Sun)
  63171363600, #      utc_end 2002-10-27 01:00:00 (Sun)
  63153230400, #  local_start 2002-03-31 04:00:00 (Sun)
  63171374400, #    local_end 2002-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63171363600, #    utc_start 2002-10-27 01:00:00 (Sun)
  63184669200, #      utc_end 2003-03-30 01:00:00 (Sun)
  63171370800, #  local_start 2002-10-27 03:00:00 (Sun)
  63184676400, #    local_end 2003-03-30 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63184669200, #    utc_start 2003-03-30 01:00:00 (Sun)
  63202813200, #      utc_end 2003-10-26 01:00:00 (Sun)
  63184680000, #  local_start 2003-03-30 04:00:00 (Sun)
  63202824000, #    local_end 2003-10-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63202813200, #    utc_start 2003-10-26 01:00:00 (Sun)
  63216118800, #      utc_end 2004-03-28 01:00:00 (Sun)
  63202820400, #  local_start 2003-10-26 03:00:00 (Sun)
  63216126000, #    local_end 2004-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63216118800, #    utc_start 2004-03-28 01:00:00 (Sun)
  63234867600, #      utc_end 2004-10-31 01:00:00 (Sun)
  63216129600, #  local_start 2004-03-28 04:00:00 (Sun)
  63234878400, #    local_end 2004-10-31 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63234867600, #    utc_start 2004-10-31 01:00:00 (Sun)
  63247568400, #      utc_end 2005-03-27 01:00:00 (Sun)
  63234874800, #  local_start 2004-10-31 03:00:00 (Sun)
  63247575600, #    local_end 2005-03-27 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63247568400, #    utc_start 2005-03-27 01:00:00 (Sun)
  63266317200, #      utc_end 2005-10-30 01:00:00 (Sun)
  63247579200, #  local_start 2005-03-27 04:00:00 (Sun)
  63266328000, #    local_end 2005-10-30 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63266317200, #    utc_start 2005-10-30 01:00:00 (Sun)
  63279018000, #      utc_end 2006-03-26 01:00:00 (Sun)
  63266324400, #  local_start 2005-10-30 03:00:00 (Sun)
  63279025200, #    local_end 2006-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63279018000, #    utc_start 2006-03-26 01:00:00 (Sun)
  63297766800, #      utc_end 2006-10-29 01:00:00 (Sun)
  63279028800, #  local_start 2006-03-26 04:00:00 (Sun)
  63297777600, #    local_end 2006-10-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63297766800, #    utc_start 2006-10-29 01:00:00 (Sun)
  63310467600, #      utc_end 2007-03-25 01:00:00 (Sun)
  63297774000, #  local_start 2006-10-29 03:00:00 (Sun)
  63310474800, #    local_end 2007-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63310467600, #    utc_start 2007-03-25 01:00:00 (Sun)
  63329216400, #      utc_end 2007-10-28 01:00:00 (Sun)
  63310478400, #  local_start 2007-03-25 04:00:00 (Sun)
  63329227200, #    local_end 2007-10-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63329216400, #    utc_start 2007-10-28 01:00:00 (Sun)
  63342522000, #      utc_end 2008-03-30 01:00:00 (Sun)
  63329223600, #  local_start 2007-10-28 03:00:00 (Sun)
  63342529200, #    local_end 2008-03-30 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63342522000, #    utc_start 2008-03-30 01:00:00 (Sun)
  63360666000, #      utc_end 2008-10-26 01:00:00 (Sun)
  63342532800, #  local_start 2008-03-30 04:00:00 (Sun)
  63360676800, #    local_end 2008-10-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63360666000, #    utc_start 2008-10-26 01:00:00 (Sun)
  63373971600, #      utc_end 2009-03-29 01:00:00 (Sun)
  63360673200, #  local_start 2008-10-26 03:00:00 (Sun)
  63373978800, #    local_end 2009-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63373971600, #    utc_start 2009-03-29 01:00:00 (Sun)
  63392115600, #      utc_end 2009-10-25 01:00:00 (Sun)
  63373982400, #  local_start 2009-03-29 04:00:00 (Sun)
  63392126400, #    local_end 2009-10-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63392115600, #    utc_start 2009-10-25 01:00:00 (Sun)
  63405421200, #      utc_end 2010-03-28 01:00:00 (Sun)
  63392122800, #  local_start 2009-10-25 03:00:00 (Sun)
  63405428400, #    local_end 2010-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63405421200, #    utc_start 2010-03-28 01:00:00 (Sun)
  63424170000, #      utc_end 2010-10-31 01:00:00 (Sun)
  63405432000, #  local_start 2010-03-28 04:00:00 (Sun)
  63424180800, #    local_end 2010-10-31 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63424170000, #    utc_start 2010-10-31 01:00:00 (Sun)
  63436870800, #      utc_end 2011-03-27 01:00:00 (Sun)
  63424177200, #  local_start 2010-10-31 03:00:00 (Sun)
  63436878000, #    local_end 2011-03-27 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63436870800, #    utc_start 2011-03-27 01:00:00 (Sun)
  63455619600, #      utc_end 2011-10-30 01:00:00 (Sun)
  63436881600, #  local_start 2011-03-27 04:00:00 (Sun)
  63455630400, #    local_end 2011-10-30 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63455619600, #    utc_start 2011-10-30 01:00:00 (Sun)
  63468320400, #      utc_end 2012-03-25 01:00:00 (Sun)
  63455626800, #  local_start 2011-10-30 03:00:00 (Sun)
  63468327600, #    local_end 2012-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63468320400, #    utc_start 2012-03-25 01:00:00 (Sun)
  63487069200, #      utc_end 2012-10-28 01:00:00 (Sun)
  63468331200, #  local_start 2012-03-25 04:00:00 (Sun)
  63487080000, #    local_end 2012-10-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63487069200, #    utc_start 2012-10-28 01:00:00 (Sun)
  63500374800, #      utc_end 2013-03-31 01:00:00 (Sun)
  63487076400, #  local_start 2012-10-28 03:00:00 (Sun)
  63500382000, #    local_end 2013-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63500374800, #    utc_start 2013-03-31 01:00:00 (Sun)
  63518518800, #      utc_end 2013-10-27 01:00:00 (Sun)
  63500385600, #  local_start 2013-03-31 04:00:00 (Sun)
  63518529600, #    local_end 2013-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63518518800, #    utc_start 2013-10-27 01:00:00 (Sun)
  63531824400, #      utc_end 2014-03-30 01:00:00 (Sun)
  63518526000, #  local_start 2013-10-27 03:00:00 (Sun)
  63531831600, #    local_end 2014-03-30 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63531824400, #    utc_start 2014-03-30 01:00:00 (Sun)
  63549968400, #      utc_end 2014-10-26 01:00:00 (Sun)
  63531835200, #  local_start 2014-03-30 04:00:00 (Sun)
  63549979200, #    local_end 2014-10-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63549968400, #    utc_start 2014-10-26 01:00:00 (Sun)
  63563274000, #      utc_end 2015-03-29 01:00:00 (Sun)
  63549975600, #  local_start 2014-10-26 03:00:00 (Sun)
  63563281200, #    local_end 2015-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63563274000, #    utc_start 2015-03-29 01:00:00 (Sun)
  63581418000, #      utc_end 2015-10-25 01:00:00 (Sun)
  63563284800, #  local_start 2015-03-29 04:00:00 (Sun)
  63581428800, #    local_end 2015-10-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63581418000, #    utc_start 2015-10-25 01:00:00 (Sun)
  63594723600, #      utc_end 2016-03-27 01:00:00 (Sun)
  63581425200, #  local_start 2015-10-25 03:00:00 (Sun)
  63594730800, #    local_end 2016-03-27 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63594723600, #    utc_start 2016-03-27 01:00:00 (Sun)
  63613472400, #      utc_end 2016-10-30 01:00:00 (Sun)
  63594734400, #  local_start 2016-03-27 04:00:00 (Sun)
  63613483200, #    local_end 2016-10-30 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63613472400, #    utc_start 2016-10-30 01:00:00 (Sun)
  63626173200, #      utc_end 2017-03-26 01:00:00 (Sun)
  63613479600, #  local_start 2016-10-30 03:00:00 (Sun)
  63626180400, #    local_end 2017-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63626173200, #    utc_start 2017-03-26 01:00:00 (Sun)
  63644922000, #      utc_end 2017-10-29 01:00:00 (Sun)
  63626184000, #  local_start 2017-03-26 04:00:00 (Sun)
  63644932800, #    local_end 2017-10-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63644922000, #    utc_start 2017-10-29 01:00:00 (Sun)
  63657622800, #      utc_end 2018-03-25 01:00:00 (Sun)
  63644929200, #  local_start 2017-10-29 03:00:00 (Sun)
  63657630000, #    local_end 2018-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63657622800, #    utc_start 2018-03-25 01:00:00 (Sun)
  63676371600, #      utc_end 2018-10-28 01:00:00 (Sun)
  63657633600, #  local_start 2018-03-25 04:00:00 (Sun)
  63676382400, #    local_end 2018-10-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63676371600, #    utc_start 2018-10-28 01:00:00 (Sun)
  63689677200, #      utc_end 2019-03-31 01:00:00 (Sun)
  63676378800, #  local_start 2018-10-28 03:00:00 (Sun)
  63689684400, #    local_end 2019-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63689677200, #    utc_start 2019-03-31 01:00:00 (Sun)
  63707821200, #      utc_end 2019-10-27 01:00:00 (Sun)
  63689688000, #  local_start 2019-03-31 04:00:00 (Sun)
  63707832000, #    local_end 2019-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63707821200, #    utc_start 2019-10-27 01:00:00 (Sun)
  63721126800, #      utc_end 2020-03-29 01:00:00 (Sun)
  63707828400, #  local_start 2019-10-27 03:00:00 (Sun)
  63721134000, #    local_end 2020-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63721126800, #    utc_start 2020-03-29 01:00:00 (Sun)
  63739270800, #      utc_end 2020-10-25 01:00:00 (Sun)
  63721137600, #  local_start 2020-03-29 04:00:00 (Sun)
  63739281600, #    local_end 2020-10-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63739270800, #    utc_start 2020-10-25 01:00:00 (Sun)
  63752576400, #      utc_end 2021-03-28 01:00:00 (Sun)
  63739278000, #  local_start 2020-10-25 03:00:00 (Sun)
  63752583600, #    local_end 2021-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63752576400, #    utc_start 2021-03-28 01:00:00 (Sun)
  63771325200, #      utc_end 2021-10-31 01:00:00 (Sun)
  63752587200, #  local_start 2021-03-28 04:00:00 (Sun)
  63771336000, #    local_end 2021-10-31 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63771325200, #    utc_start 2021-10-31 01:00:00 (Sun)
  63784026000, #      utc_end 2022-03-27 01:00:00 (Sun)
  63771332400, #  local_start 2021-10-31 03:00:00 (Sun)
  63784033200, #    local_end 2022-03-27 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63784026000, #    utc_start 2022-03-27 01:00:00 (Sun)
  63802774800, #      utc_end 2022-10-30 01:00:00 (Sun)
  63784036800, #  local_start 2022-03-27 04:00:00 (Sun)
  63802785600, #    local_end 2022-10-30 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63802774800, #    utc_start 2022-10-30 01:00:00 (Sun)
  63815475600, #      utc_end 2023-03-26 01:00:00 (Sun)
  63802782000, #  local_start 2022-10-30 03:00:00 (Sun)
  63815482800, #    local_end 2023-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63815475600, #    utc_start 2023-03-26 01:00:00 (Sun)
  63834224400, #      utc_end 2023-10-29 01:00:00 (Sun)
  63815486400, #  local_start 2023-03-26 04:00:00 (Sun)
  63834235200, #    local_end 2023-10-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63834224400, #    utc_start 2023-10-29 01:00:00 (Sun)
  63847530000, #      utc_end 2024-03-31 01:00:00 (Sun)
  63834231600, #  local_start 2023-10-29 03:00:00 (Sun)
  63847537200, #    local_end 2024-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63847530000, #    utc_start 2024-03-31 01:00:00 (Sun)
  63865674000, #      utc_end 2024-10-27 01:00:00 (Sun)
  63847540800, #  local_start 2024-03-31 04:00:00 (Sun)
  63865684800, #    local_end 2024-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63865674000, #    utc_start 2024-10-27 01:00:00 (Sun)
  63878979600, #      utc_end 2025-03-30 01:00:00 (Sun)
  63865681200, #  local_start 2024-10-27 03:00:00 (Sun)
  63878986800, #    local_end 2025-03-30 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63878979600, #    utc_start 2025-03-30 01:00:00 (Sun)
  63897123600, #      utc_end 2025-10-26 01:00:00 (Sun)
  63878990400, #  local_start 2025-03-30 04:00:00 (Sun)
  63897134400, #    local_end 2025-10-26 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63897123600, #    utc_start 2025-10-26 01:00:00 (Sun)
  63910429200, #      utc_end 2026-03-29 01:00:00 (Sun)
  63897130800, #  local_start 2025-10-26 03:00:00 (Sun)
  63910436400, #    local_end 2026-03-29 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63910429200, #    utc_start 2026-03-29 01:00:00 (Sun)
  63928573200, #      utc_end 2026-10-25 01:00:00 (Sun)
  63910440000, #  local_start 2026-03-29 04:00:00 (Sun)
  63928584000, #    local_end 2026-10-25 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63928573200, #    utc_start 2026-10-25 01:00:00 (Sun)
  63941878800, #      utc_end 2027-03-28 01:00:00 (Sun)
  63928580400, #  local_start 2026-10-25 03:00:00 (Sun)
  63941886000, #    local_end 2027-03-28 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63941878800, #    utc_start 2027-03-28 01:00:00 (Sun)
  63960627600, #      utc_end 2027-10-31 01:00:00 (Sun)
  63941889600, #  local_start 2027-03-28 04:00:00 (Sun)
  63960638400, #    local_end 2027-10-31 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63960627600, #    utc_start 2027-10-31 01:00:00 (Sun)
  63973328400, #      utc_end 2028-03-26 01:00:00 (Sun)
  63960634800, #  local_start 2027-10-31 03:00:00 (Sun)
  63973335600, #    local_end 2028-03-26 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  63973328400, #    utc_start 2028-03-26 01:00:00 (Sun)
  63992077200, #      utc_end 2028-10-29 01:00:00 (Sun)
  63973339200, #  local_start 2028-03-26 04:00:00 (Sun)
  63992088000, #    local_end 2028-10-29 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  63992077200, #    utc_start 2028-10-29 01:00:00 (Sun)
  64004778000, #      utc_end 2029-03-25 01:00:00 (Sun)
  63992084400, #  local_start 2028-10-29 03:00:00 (Sun)
  64004785200, #    local_end 2029-03-25 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  64004778000, #    utc_start 2029-03-25 01:00:00 (Sun)
  64023526800, #      utc_end 2029-10-28 01:00:00 (Sun)
  64004788800, #  local_start 2029-03-25 04:00:00 (Sun)
  64023537600, #    local_end 2029-10-28 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
      [
  64023526800, #    utc_start 2029-10-28 01:00:00 (Sun)
  64036832400, #      utc_end 2030-03-31 01:00:00 (Sun)
  64023534000, #  local_start 2029-10-28 03:00:00 (Sun)
  64036839600, #    local_end 2030-03-31 03:00:00 (Sun)
  7200,
  0,
  'EET',
      ],
      [
  64036832400, #    utc_start 2030-03-31 01:00:00 (Sun)
  64054976400, #      utc_end 2030-10-27 01:00:00 (Sun)
  64036843200, #  local_start 2030-03-31 04:00:00 (Sun)
  64054987200, #    local_end 2030-10-27 04:00:00 (Sun)
  10800,
  1,
  'EEST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {52}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { 7200 }
  
  my $last_observance = bless( {
    'format' => 'EE%sT',
    'gmtoff' => '2:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 728294,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 728294,
      'utc_rd_secs' => 0,
      'utc_year' => 1996
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => 7200,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 728293,
      'local_rd_secs' => 79200,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 728293,
      'utc_rd_secs' => 79200,
      'utc_year' => 1995
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '1:00u',
      'from' => '1996',
      'in' => 'Oct',
      'letter' => '',
      'name' => 'EU',
      'offset_from_std' => 0,
      'on' => 'lastSun',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '1:00u',
      'from' => '1981',
      'in' => 'Mar',
      'letter' => 'S',
      'name' => 'EU',
      'offset_from_std' => 3600,
      'on' => 'lastSun',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_EUROPE_ZAPOROZHYE

    $main::fatpacked{"DateTime/TimeZone/Europe/Zurich.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_EUROPE_ZURICH';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Europe::Zurich;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Europe::Zurich::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  58460484352, #      utc_end 1853-07-15 23:25:52 (Fri)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  58460486400, #    local_end 1853-07-16 00:00:00 (Sat)
  2048,
  0,
  'LMT',
      ],
      [
  58460484352, #    utc_start 1853-07-15 23:25:52 (Fri)
  59750436614, #      utc_end 1894-05-31 23:30:14 (Thu)
  58460486138, #  local_start 1853-07-15 23:55:38 (Fri)
  59750438400, #    local_end 1894-06-01 00:00:00 (Fri)
  1786,
  0,
  'BMT',
      ],
      [
  59750436614, #    utc_start 1894-05-31 23:30:14 (Thu)
  61231248000, #      utc_end 1941-05-05 00:00:00 (Mon)
  59750440214, #  local_start 1894-06-01 00:30:14 (Fri)
  61231251600, #    local_end 1941-05-05 01:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61231248000, #    utc_start 1941-05-05 00:00:00 (Mon)
  61244553600, #      utc_end 1941-10-06 00:00:00 (Mon)
  61231255200, #  local_start 1941-05-05 02:00:00 (Mon)
  61244560800, #    local_end 1941-10-06 02:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61244553600, #    utc_start 1941-10-06 00:00:00 (Mon)
  61262697600, #      utc_end 1942-05-04 00:00:00 (Mon)
  61244557200, #  local_start 1941-10-06 01:00:00 (Mon)
  61262701200, #    local_end 1942-05-04 01:00:00 (Mon)
  3600,
  0,
  'CET',
      ],
      [
  61262697600, #    utc_start 1942-05-04 00:00:00 (Mon)
  61276003200, #      utc_end 1942-10-05 00:00:00 (Mon)
  61262704800, #  local_start 1942-05-04 02:00:00 (Mon)
  61276010400, #    local_end 1942-10-05 02:00:00 (Mon)
  7200,
  1,
  'CEST',
      ],
      [
  61276003200, #    utc_start 1942-10-05 00:00:00 (Mon)
  62482834800, #      utc_end 1980-12-31 23:00:00 (Wed)
  61276006800, #  local_start 1942-10-05 01:00:00 (Mon)
  62482838400, #    local_end 1981-01-01 00:00:00 (Thu)
  3600,
  0,
  'CET',
      ],
      [
  62482834800, #    utc_start 1980-12-31 23:00:00 (Wed)
  62490358800, #      utc_end 1981-03-29 01:00:00 (Sun)
  62482838400, #  local_start 1981-01-01 00:00:00 (Thu)
  62490362400, #    local_end 1981-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62490358800, #    utc_start 1981-03-29 01:00:00 (Sun)
  62506083600, #      utc_end 1981-09-27 01:00:00 (Sun)
  62490366000, #  local_start 1981-03-29 03:00:00 (Sun)
  62506090800, #    local_end 1981-09-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62506083600, #    utc_start 1981-09-27 01:00:00 (Sun)
  62521808400, #      utc_end 1982-03-28 01:00:00 (Sun)
  62506087200, #  local_start 1981-09-27 02:00:00 (Sun)
  62521812000, #    local_end 1982-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62521808400, #    utc_start 1982-03-28 01:00:00 (Sun)
  62537533200, #      utc_end 1982-09-26 01:00:00 (Sun)
  62521815600, #  local_start 1982-03-28 03:00:00 (Sun)
  62537540400, #    local_end 1982-09-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62537533200, #    utc_start 1982-09-26 01:00:00 (Sun)
  62553258000, #      utc_end 1983-03-27 01:00:00 (Sun)
  62537536800, #  local_start 1982-09-26 02:00:00 (Sun)
  62553261600, #    local_end 1983-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62553258000, #    utc_start 1983-03-27 01:00:00 (Sun)
  62568982800, #      utc_end 1983-09-25 01:00:00 (Sun)
  62553265200, #  local_start 1983-03-27 03:00:00 (Sun)
  62568990000, #    local_end 1983-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62568982800, #    utc_start 1983-09-25 01:00:00 (Sun)
  62584707600, #      utc_end 1984-03-25 01:00:00 (Sun)
  62568986400, #  local_start 1983-09-25 02:00:00 (Sun)
  62584711200, #    local_end 1984-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62584707600, #    utc_start 1984-03-25 01:00:00 (Sun)
  62601037200, #      utc_end 1984-09-30 01:00:00 (Sun)
  62584714800, #  local_start 1984-03-25 03:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62601037200, #    utc_start 1984-09-30 01:00:00 (Sun)
  62616762000, #      utc_end 1985-03-31 01:00:00 (Sun)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62616762000, #    utc_start 1985-03-31 01:00:00 (Sun)
  62632486800, #      utc_end 1985-09-29 01:00:00 (Sun)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62632486800, #    utc_start 1985-09-29 01:00:00 (Sun)
  62648211600, #      utc_end 1986-03-30 01:00:00 (Sun)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62648211600, #    utc_start 1986-03-30 01:00:00 (Sun)
  62663936400, #      utc_end 1986-09-28 01:00:00 (Sun)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62663936400, #    utc_start 1986-09-28 01:00:00 (Sun)
  62679661200, #      utc_end 1987-03-29 01:00:00 (Sun)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62679661200, #    utc_start 1987-03-29 01:00:00 (Sun)
  62695386000, #      utc_end 1987-09-27 01:00:00 (Sun)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62695386000, #    utc_start 1987-09-27 01:00:00 (Sun)
  62711110800, #      utc_end 1988-03-27 01:00:00 (Sun)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62711110800, #    utc_start 1988-03-27 01:00:00 (Sun)
  62726835600, #      utc_end 1988-09-25 01:00:00 (Sun)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62726835600, #    utc_start 1988-09-25 01:00:00 (Sun)
  62742560400, #      utc_end 1989-03-26 01:00:00 (Sun)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62742560400, #    utc_start 1989-03-26 01:00:00 (Sun)
  62758285200, #      utc_end 1989-09-24 01:00:00 (Sun)
  62742567600, #  local_start 1989-03-26 03:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62758285200, #    utc_start 1989-09-24 01:00:00 (Sun)
  62774010000, #      utc_end 1990-03-25 01:00:00 (Sun)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62774010000, #    utc_start 1990-03-25 01:00:00 (Sun)
  62790339600, #      utc_end 1990-09-30 01:00:00 (Sun)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62790339600, #    utc_start 1990-09-30 01:00:00 (Sun)
  62806064400, #      utc_end 1991-03-31 01:00:00 (Sun)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62806064400, #    utc_start 1991-03-31 01:00:00 (Sun)
  62821789200, #      utc_end 1991-09-29 01:00:00 (Sun)
  62806071600, #  local_start 1991-03-31 03:00:00 (Sun)
  62821796400, #    local_end 1991-09-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62821789200, #    utc_start 1991-09-29 01:00:00 (Sun)
  62837514000, #      utc_end 1992-03-29 01:00:00 (Sun)
  62821792800, #  local_start 1991-09-29 02:00:00 (Sun)
  62837517600, #    local_end 1992-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62837514000, #    utc_start 1992-03-29 01:00:00 (Sun)
  62853238800, #      utc_end 1992-09-27 01:00:00 (Sun)
  62837521200, #  local_start 1992-03-29 03:00:00 (Sun)
  62853246000, #    local_end 1992-09-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62853238800, #    utc_start 1992-09-27 01:00:00 (Sun)
  62868963600, #      utc_end 1993-03-28 01:00:00 (Sun)
  62853242400, #  local_start 1992-09-27 02:00:00 (Sun)
  62868967200, #    local_end 1993-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62868963600, #    utc_start 1993-03-28 01:00:00 (Sun)
  62884688400, #      utc_end 1993-09-26 01:00:00 (Sun)
  62868970800, #  local_start 1993-03-28 03:00:00 (Sun)
  62884695600, #    local_end 1993-09-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62884688400, #    utc_start 1993-09-26 01:00:00 (Sun)
  62900413200, #      utc_end 1994-03-27 01:00:00 (Sun)
  62884692000, #  local_start 1993-09-26 02:00:00 (Sun)
  62900416800, #    local_end 1994-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62900413200, #    utc_start 1994-03-27 01:00:00 (Sun)
  62916138000, #      utc_end 1994-09-25 01:00:00 (Sun)
  62900420400, #  local_start 1994-03-27 03:00:00 (Sun)
  62916145200, #    local_end 1994-09-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62916138000, #    utc_start 1994-09-25 01:00:00 (Sun)
  62931862800, #      utc_end 1995-03-26 01:00:00 (Sun)
  62916141600, #  local_start 1994-09-25 02:00:00 (Sun)
  62931866400, #    local_end 1995-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62931862800, #    utc_start 1995-03-26 01:00:00 (Sun)
  62947587600, #      utc_end 1995-09-24 01:00:00 (Sun)
  62931870000, #  local_start 1995-03-26 03:00:00 (Sun)
  62947594800, #    local_end 1995-09-24 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62947587600, #    utc_start 1995-09-24 01:00:00 (Sun)
  62963917200, #      utc_end 1996-03-31 01:00:00 (Sun)
  62947591200, #  local_start 1995-09-24 02:00:00 (Sun)
  62963920800, #    local_end 1996-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62963917200, #    utc_start 1996-03-31 01:00:00 (Sun)
  62982061200, #      utc_end 1996-10-27 01:00:00 (Sun)
  62963924400, #  local_start 1996-03-31 03:00:00 (Sun)
  62982068400, #    local_end 1996-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  62982061200, #    utc_start 1996-10-27 01:00:00 (Sun)
  62995366800, #      utc_end 1997-03-30 01:00:00 (Sun)
  62982064800, #  local_start 1996-10-27 02:00:00 (Sun)
  62995370400, #    local_end 1997-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  62995366800, #    utc_start 1997-03-30 01:00:00 (Sun)
  63013510800, #      utc_end 1997-10-26 01:00:00 (Sun)
  62995374000, #  local_start 1997-03-30 03:00:00 (Sun)
  63013518000, #    local_end 1997-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63013510800, #    utc_start 1997-10-26 01:00:00 (Sun)
  63026816400, #      utc_end 1998-03-29 01:00:00 (Sun)
  63013514400, #  local_start 1997-10-26 02:00:00 (Sun)
  63026820000, #    local_end 1998-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63026816400, #    utc_start 1998-03-29 01:00:00 (Sun)
  63044960400, #      utc_end 1998-10-25 01:00:00 (Sun)
  63026823600, #  local_start 1998-03-29 03:00:00 (Sun)
  63044967600, #    local_end 1998-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63044960400, #    utc_start 1998-10-25 01:00:00 (Sun)
  63058266000, #      utc_end 1999-03-28 01:00:00 (Sun)
  63044964000, #  local_start 1998-10-25 02:00:00 (Sun)
  63058269600, #    local_end 1999-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63058266000, #    utc_start 1999-03-28 01:00:00 (Sun)
  63077014800, #      utc_end 1999-10-31 01:00:00 (Sun)
  63058273200, #  local_start 1999-03-28 03:00:00 (Sun)
  63077022000, #    local_end 1999-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63077014800, #    utc_start 1999-10-31 01:00:00 (Sun)
  63089715600, #      utc_end 2000-03-26 01:00:00 (Sun)
  63077018400, #  local_start 1999-10-31 02:00:00 (Sun)
  63089719200, #    local_end 2000-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63089715600, #    utc_start 2000-03-26 01:00:00 (Sun)
  63108464400, #      utc_end 2000-10-29 01:00:00 (Sun)
  63089722800, #  local_start 2000-03-26 03:00:00 (Sun)
  63108471600, #    local_end 2000-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63108464400, #    utc_start 2000-10-29 01:00:00 (Sun)
  63121165200, #      utc_end 2001-03-25 01:00:00 (Sun)
  63108468000, #  local_start 2000-10-29 02:00:00 (Sun)
  63121168800, #    local_end 2001-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63121165200, #    utc_start 2001-03-25 01:00:00 (Sun)
  63139914000, #      utc_end 2001-10-28 01:00:00 (Sun)
  63121172400, #  local_start 2001-03-25 03:00:00 (Sun)
  63139921200, #    local_end 2001-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63139914000, #    utc_start 2001-10-28 01:00:00 (Sun)
  63153219600, #      utc_end 2002-03-31 01:00:00 (Sun)
  63139917600, #  local_start 2001-10-28 02:00:00 (Sun)
  63153223200, #    local_end 2002-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63153219600, #    utc_start 2002-03-31 01:00:00 (Sun)
  63171363600, #      utc_end 2002-10-27 01:00:00 (Sun)
  63153226800, #  local_start 2002-03-31 03:00:00 (Sun)
  63171370800, #    local_end 2002-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63171363600, #    utc_start 2002-10-27 01:00:00 (Sun)
  63184669200, #      utc_end 2003-03-30 01:00:00 (Sun)
  63171367200, #  local_start 2002-10-27 02:00:00 (Sun)
  63184672800, #    local_end 2003-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63184669200, #    utc_start 2003-03-30 01:00:00 (Sun)
  63202813200, #      utc_end 2003-10-26 01:00:00 (Sun)
  63184676400, #  local_start 2003-03-30 03:00:00 (Sun)
  63202820400, #    local_end 2003-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63202813200, #    utc_start 2003-10-26 01:00:00 (Sun)
  63216118800, #      utc_end 2004-03-28 01:00:00 (Sun)
  63202816800, #  local_start 2003-10-26 02:00:00 (Sun)
  63216122400, #    local_end 2004-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63216118800, #    utc_start 2004-03-28 01:00:00 (Sun)
  63234867600, #      utc_end 2004-10-31 01:00:00 (Sun)
  63216126000, #  local_start 2004-03-28 03:00:00 (Sun)
  63234874800, #    local_end 2004-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63234867600, #    utc_start 2004-10-31 01:00:00 (Sun)
  63247568400, #      utc_end 2005-03-27 01:00:00 (Sun)
  63234871200, #  local_start 2004-10-31 02:00:00 (Sun)
  63247572000, #    local_end 2005-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63247568400, #    utc_start 2005-03-27 01:00:00 (Sun)
  63266317200, #      utc_end 2005-10-30 01:00:00 (Sun)
  63247575600, #  local_start 2005-03-27 03:00:00 (Sun)
  63266324400, #    local_end 2005-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63266317200, #    utc_start 2005-10-30 01:00:00 (Sun)
  63279018000, #      utc_end 2006-03-26 01:00:00 (Sun)
  63266320800, #  local_start 2005-10-30 02:00:00 (Sun)
  63279021600, #    local_end 2006-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63279018000, #    utc_start 2006-03-26 01:00:00 (Sun)
  63297766800, #      utc_end 2006-10-29 01:00:00 (Sun)
  63279025200, #  local_start 2006-03-26 03:00:00 (Sun)
  63297774000, #    local_end 2006-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63297766800, #    utc_start 2006-10-29 01:00:00 (Sun)
  63310467600, #      utc_end 2007-03-25 01:00:00 (Sun)
  63297770400, #  local_start 2006-10-29 02:00:00 (Sun)
  63310471200, #    local_end 2007-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63310467600, #    utc_start 2007-03-25 01:00:00 (Sun)
  63329216400, #      utc_end 2007-10-28 01:00:00 (Sun)
  63310474800, #  local_start 2007-03-25 03:00:00 (Sun)
  63329223600, #    local_end 2007-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63329216400, #    utc_start 2007-10-28 01:00:00 (Sun)
  63342522000, #      utc_end 2008-03-30 01:00:00 (Sun)
  63329220000, #  local_start 2007-10-28 02:00:00 (Sun)
  63342525600, #    local_end 2008-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63342522000, #    utc_start 2008-03-30 01:00:00 (Sun)
  63360666000, #      utc_end 2008-10-26 01:00:00 (Sun)
  63342529200, #  local_start 2008-03-30 03:00:00 (Sun)
  63360673200, #    local_end 2008-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63360666000, #    utc_start 2008-10-26 01:00:00 (Sun)
  63373971600, #      utc_end 2009-03-29 01:00:00 (Sun)
  63360669600, #  local_start 2008-10-26 02:00:00 (Sun)
  63373975200, #    local_end 2009-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63373971600, #    utc_start 2009-03-29 01:00:00 (Sun)
  63392115600, #      utc_end 2009-10-25 01:00:00 (Sun)
  63373978800, #  local_start 2009-03-29 03:00:00 (Sun)
  63392122800, #    local_end 2009-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63392115600, #    utc_start 2009-10-25 01:00:00 (Sun)
  63405421200, #      utc_end 2010-03-28 01:00:00 (Sun)
  63392119200, #  local_start 2009-10-25 02:00:00 (Sun)
  63405424800, #    local_end 2010-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63405421200, #    utc_start 2010-03-28 01:00:00 (Sun)
  63424170000, #      utc_end 2010-10-31 01:00:00 (Sun)
  63405428400, #  local_start 2010-03-28 03:00:00 (Sun)
  63424177200, #    local_end 2010-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63424170000, #    utc_start 2010-10-31 01:00:00 (Sun)
  63436870800, #      utc_end 2011-03-27 01:00:00 (Sun)
  63424173600, #  local_start 2010-10-31 02:00:00 (Sun)
  63436874400, #    local_end 2011-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63436870800, #    utc_start 2011-03-27 01:00:00 (Sun)
  63455619600, #      utc_end 2011-10-30 01:00:00 (Sun)
  63436878000, #  local_start 2011-03-27 03:00:00 (Sun)
  63455626800, #    local_end 2011-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63455619600, #    utc_start 2011-10-30 01:00:00 (Sun)
  63468320400, #      utc_end 2012-03-25 01:00:00 (Sun)
  63455623200, #  local_start 2011-10-30 02:00:00 (Sun)
  63468324000, #    local_end 2012-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63468320400, #    utc_start 2012-03-25 01:00:00 (Sun)
  63487069200, #      utc_end 2012-10-28 01:00:00 (Sun)
  63468327600, #  local_start 2012-03-25 03:00:00 (Sun)
  63487076400, #    local_end 2012-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63487069200, #    utc_start 2012-10-28 01:00:00 (Sun)
  63500374800, #      utc_end 2013-03-31 01:00:00 (Sun)
  63487072800, #  local_start 2012-10-28 02:00:00 (Sun)
  63500378400, #    local_end 2013-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63500374800, #    utc_start 2013-03-31 01:00:00 (Sun)
  63518518800, #      utc_end 2013-10-27 01:00:00 (Sun)
  63500382000, #  local_start 2013-03-31 03:00:00 (Sun)
  63518526000, #    local_end 2013-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63518518800, #    utc_start 2013-10-27 01:00:00 (Sun)
  63531824400, #      utc_end 2014-03-30 01:00:00 (Sun)
  63518522400, #  local_start 2013-10-27 02:00:00 (Sun)
  63531828000, #    local_end 2014-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63531824400, #    utc_start 2014-03-30 01:00:00 (Sun)
  63549968400, #      utc_end 2014-10-26 01:00:00 (Sun)
  63531831600, #  local_start 2014-03-30 03:00:00 (Sun)
  63549975600, #    local_end 2014-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63549968400, #    utc_start 2014-10-26 01:00:00 (Sun)
  63563274000, #      utc_end 2015-03-29 01:00:00 (Sun)
  63549972000, #  local_start 2014-10-26 02:00:00 (Sun)
  63563277600, #    local_end 2015-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63563274000, #    utc_start 2015-03-29 01:00:00 (Sun)
  63581418000, #      utc_end 2015-10-25 01:00:00 (Sun)
  63563281200, #  local_start 2015-03-29 03:00:00 (Sun)
  63581425200, #    local_end 2015-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63581418000, #    utc_start 2015-10-25 01:00:00 (Sun)
  63594723600, #      utc_end 2016-03-27 01:00:00 (Sun)
  63581421600, #  local_start 2015-10-25 02:00:00 (Sun)
  63594727200, #    local_end 2016-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63594723600, #    utc_start 2016-03-27 01:00:00 (Sun)
  63613472400, #      utc_end 2016-10-30 01:00:00 (Sun)
  63594730800, #  local_start 2016-03-27 03:00:00 (Sun)
  63613479600, #    local_end 2016-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63613472400, #    utc_start 2016-10-30 01:00:00 (Sun)
  63626173200, #      utc_end 2017-03-26 01:00:00 (Sun)
  63613476000, #  local_start 2016-10-30 02:00:00 (Sun)
  63626176800, #    local_end 2017-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63626173200, #    utc_start 2017-03-26 01:00:00 (Sun)
  63644922000, #      utc_end 2017-10-29 01:00:00 (Sun)
  63626180400, #  local_start 2017-03-26 03:00:00 (Sun)
  63644929200, #    local_end 2017-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63644922000, #    utc_start 2017-10-29 01:00:00 (Sun)
  63657622800, #      utc_end 2018-03-25 01:00:00 (Sun)
  63644925600, #  local_start 2017-10-29 02:00:00 (Sun)
  63657626400, #    local_end 2018-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63657622800, #    utc_start 2018-03-25 01:00:00 (Sun)
  63676371600, #      utc_end 2018-10-28 01:00:00 (Sun)
  63657630000, #  local_start 2018-03-25 03:00:00 (Sun)
  63676378800, #    local_end 2018-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63676371600, #    utc_start 2018-10-28 01:00:00 (Sun)
  63689677200, #      utc_end 2019-03-31 01:00:00 (Sun)
  63676375200, #  local_start 2018-10-28 02:00:00 (Sun)
  63689680800, #    local_end 2019-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63689677200, #    utc_start 2019-03-31 01:00:00 (Sun)
  63707821200, #      utc_end 2019-10-27 01:00:00 (Sun)
  63689684400, #  local_start 2019-03-31 03:00:00 (Sun)
  63707828400, #    local_end 2019-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63707821200, #    utc_start 2019-10-27 01:00:00 (Sun)
  63721126800, #      utc_end 2020-03-29 01:00:00 (Sun)
  63707824800, #  local_start 2019-10-27 02:00:00 (Sun)
  63721130400, #    local_end 2020-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63721126800, #    utc_start 2020-03-29 01:00:00 (Sun)
  63739270800, #      utc_end 2020-10-25 01:00:00 (Sun)
  63721134000, #  local_start 2020-03-29 03:00:00 (Sun)
  63739278000, #    local_end 2020-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63739270800, #    utc_start 2020-10-25 01:00:00 (Sun)
  63752576400, #      utc_end 2021-03-28 01:00:00 (Sun)
  63739274400, #  local_start 2020-10-25 02:00:00 (Sun)
  63752580000, #    local_end 2021-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63752576400, #    utc_start 2021-03-28 01:00:00 (Sun)
  63771325200, #      utc_end 2021-10-31 01:00:00 (Sun)
  63752583600, #  local_start 2021-03-28 03:00:00 (Sun)
  63771332400, #    local_end 2021-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63771325200, #    utc_start 2021-10-31 01:00:00 (Sun)
  63784026000, #      utc_end 2022-03-27 01:00:00 (Sun)
  63771328800, #  local_start 2021-10-31 02:00:00 (Sun)
  63784029600, #    local_end 2022-03-27 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63784026000, #    utc_start 2022-03-27 01:00:00 (Sun)
  63802774800, #      utc_end 2022-10-30 01:00:00 (Sun)
  63784033200, #  local_start 2022-03-27 03:00:00 (Sun)
  63802782000, #    local_end 2022-10-30 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63802774800, #    utc_start 2022-10-30 01:00:00 (Sun)
  63815475600, #      utc_end 2023-03-26 01:00:00 (Sun)
  63802778400, #  local_start 2022-10-30 02:00:00 (Sun)
  63815479200, #    local_end 2023-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63815475600, #    utc_start 2023-03-26 01:00:00 (Sun)
  63834224400, #      utc_end 2023-10-29 01:00:00 (Sun)
  63815482800, #  local_start 2023-03-26 03:00:00 (Sun)
  63834231600, #    local_end 2023-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63834224400, #    utc_start 2023-10-29 01:00:00 (Sun)
  63847530000, #      utc_end 2024-03-31 01:00:00 (Sun)
  63834228000, #  local_start 2023-10-29 02:00:00 (Sun)
  63847533600, #    local_end 2024-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63847530000, #    utc_start 2024-03-31 01:00:00 (Sun)
  63865674000, #      utc_end 2024-10-27 01:00:00 (Sun)
  63847537200, #  local_start 2024-03-31 03:00:00 (Sun)
  63865681200, #    local_end 2024-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63865674000, #    utc_start 2024-10-27 01:00:00 (Sun)
  63878979600, #      utc_end 2025-03-30 01:00:00 (Sun)
  63865677600, #  local_start 2024-10-27 02:00:00 (Sun)
  63878983200, #    local_end 2025-03-30 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63878979600, #    utc_start 2025-03-30 01:00:00 (Sun)
  63897123600, #      utc_end 2025-10-26 01:00:00 (Sun)
  63878986800, #  local_start 2025-03-30 03:00:00 (Sun)
  63897130800, #    local_end 2025-10-26 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63897123600, #    utc_start 2025-10-26 01:00:00 (Sun)
  63910429200, #      utc_end 2026-03-29 01:00:00 (Sun)
  63897127200, #  local_start 2025-10-26 02:00:00 (Sun)
  63910432800, #    local_end 2026-03-29 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63910429200, #    utc_start 2026-03-29 01:00:00 (Sun)
  63928573200, #      utc_end 2026-10-25 01:00:00 (Sun)
  63910436400, #  local_start 2026-03-29 03:00:00 (Sun)
  63928580400, #    local_end 2026-10-25 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63928573200, #    utc_start 2026-10-25 01:00:00 (Sun)
  63941878800, #      utc_end 2027-03-28 01:00:00 (Sun)
  63928576800, #  local_start 2026-10-25 02:00:00 (Sun)
  63941882400, #    local_end 2027-03-28 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63941878800, #    utc_start 2027-03-28 01:00:00 (Sun)
  63960627600, #      utc_end 2027-10-31 01:00:00 (Sun)
  63941886000, #  local_start 2027-03-28 03:00:00 (Sun)
  63960634800, #    local_end 2027-10-31 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63960627600, #    utc_start 2027-10-31 01:00:00 (Sun)
  63973328400, #      utc_end 2028-03-26 01:00:00 (Sun)
  63960631200, #  local_start 2027-10-31 02:00:00 (Sun)
  63973332000, #    local_end 2028-03-26 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  63973328400, #    utc_start 2028-03-26 01:00:00 (Sun)
  63992077200, #      utc_end 2028-10-29 01:00:00 (Sun)
  63973335600, #  local_start 2028-03-26 03:00:00 (Sun)
  63992084400, #    local_end 2028-10-29 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  63992077200, #    utc_start 2028-10-29 01:00:00 (Sun)
  64004778000, #      utc_end 2029-03-25 01:00:00 (Sun)
  63992080800, #  local_start 2028-10-29 02:00:00 (Sun)
  64004781600, #    local_end 2029-03-25 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  64004778000, #    utc_start 2029-03-25 01:00:00 (Sun)
  64023526800, #      utc_end 2029-10-28 01:00:00 (Sun)
  64004785200, #  local_start 2029-03-25 03:00:00 (Sun)
  64023534000, #    local_end 2029-10-28 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
      [
  64023526800, #    utc_start 2029-10-28 01:00:00 (Sun)
  64036832400, #      utc_end 2030-03-31 01:00:00 (Sun)
  64023530400, #  local_start 2029-10-28 02:00:00 (Sun)
  64036836000, #    local_end 2030-03-31 02:00:00 (Sun)
  3600,
  0,
  'CET',
      ],
      [
  64036832400, #    utc_start 2030-03-31 01:00:00 (Sun)
  64054976400, #      utc_end 2030-10-27 01:00:00 (Sun)
  64036839600, #  local_start 2030-03-31 03:00:00 (Sun)
  64054983600, #    local_end 2030-10-27 03:00:00 (Sun)
  7200,
  1,
  'CEST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {52}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { 3600 }
  
  my $last_observance = bless( {
    'format' => 'CE%sT',
    'gmtoff' => '1:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 723181,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 723181,
      'utc_rd_secs' => 0,
      'utc_year' => 1982
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => 3600,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 723180,
      'local_rd_secs' => 82800,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 723180,
      'utc_rd_secs' => 82800,
      'utc_year' => 1981
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '1:00u',
      'from' => '1996',
      'in' => 'Oct',
      'letter' => '',
      'name' => 'EU',
      'offset_from_std' => 0,
      'on' => 'lastSun',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '1:00u',
      'from' => '1981',
      'in' => 'Mar',
      'letter' => 'S',
      'name' => 'EU',
      'offset_from_std' => 3600,
      'on' => 'lastSun',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_EUROPE_ZURICH

    $main::fatpacked{"DateTime/TimeZone/Floating.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_FLOATING';
  package DateTime::TimeZone::Floating;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use parent 'Class::Singleton', 'DateTime::TimeZone::OffsetOnly';
  
  sub new {
      return shift->instance;
  }
  
  ## no critic (Subroutines::ProhibitUnusedPrivateSubroutines)
  sub _new_instance {
      my $class = shift;
  
      return bless {
          name   => 'floating',
          offset => 0
      }, $class;
  }
  ## use critic
  
  sub is_floating {1}
  
  sub STORABLE_thaw {
      my $self = shift;
  
      my $class = ref $self || $self;
  
      my $obj;
      if ( $class->isa(__PACKAGE__) ) {
          $obj = __PACKAGE__->new();
      }
      else {
          $obj = $class->new();
      }
  
      %$self = %$obj;
  
      return $self;
  }
  
  1;
  
  # ABSTRACT: A time zone that is always local
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  DateTime::TimeZone::Floating - A time zone that is always local
  
  =head1 VERSION
  
  version 2.36
  
  =head1 SYNOPSIS
  
    my $floating_tz = DateTime::TimeZone::Floating->new;
  
  =head1 DESCRIPTION
  
  This class is used to provide the DateTime::TimeZone API needed by
  DateTime.pm, but for floating times, as defined by the RFC 2445 spec.
  A floating time has no time zone, and has an effective offset of zero.
  
  =head1 USAGE
  
  This class has the same methods as a real time zone object. The
  C<short_name_for_datetime()> method returns the string "floating" and the
  C<category()> method returns C<undef>.
  
  =head1 SUPPORT
  
  Bugs may be submitted at L<https://github.com/houseabsolute/DateTime-TimeZone/issues>.
  
  I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
  
  =head1 SOURCE
  
  The source code repository for DateTime-TimeZone can be found at L<https://github.com/houseabsolute/DateTime-TimeZone>.
  
  =head1 AUTHOR
  
  Dave Rolsky <autarch@urth.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2019 by Dave Rolsky.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  The full text of the license can be found in the
  F<LICENSE> file included with this distribution.
  
  =cut
DATETIME_TIMEZONE_FLOATING

    $main::fatpacked{"DateTime/TimeZone/HST.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_HST';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::HST;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::HST::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  DateTime::TimeZone::INFINITY, #      utc_end
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  DateTime::TimeZone::INFINITY, #    local_end
  -36000,
  0,
  'HST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_HST

    $main::fatpacked{"DateTime/TimeZone/Indian/Chagos.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_INDIAN_CHAGOS';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/asia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Indian::Chagos;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Indian::Chagos::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60147515420, #      utc_end 1906-12-31 19:10:20 (Mon)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60147532800, #    local_end 1907-01-01 00:00:00 (Tue)
  17380,
  0,
  'LMT',
      ],
      [
  60147515420, #    utc_start 1906-12-31 19:10:20 (Mon)
  62956119600, #      utc_end 1995-12-31 19:00:00 (Sun)
  60147533420, #  local_start 1907-01-01 00:10:20 (Tue)
  62956137600, #    local_end 1996-01-01 00:00:00 (Mon)
  18000,
  0,
  '+05',
      ],
      [
  62956119600, #    utc_start 1995-12-31 19:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #      utc_end
  62956141200, #  local_start 1996-01-01 01:00:00 (Mon)
  DateTime::TimeZone::INFINITY, #    local_end
  21600,
  0,
  '+06',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_INDIAN_CHAGOS

    $main::fatpacked{"DateTime/TimeZone/Indian/Christmas.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_INDIAN_CHRISTMAS';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/australasia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Indian::Christmas;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Indian::Christmas::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59771581028, #      utc_end 1895-01-31 16:57:08 (Thu)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59771606400, #    local_end 1895-02-01 00:00:00 (Fri)
  25372,
  0,
  'LMT',
      ],
      [
  59771581028, #    utc_start 1895-01-31 16:57:08 (Thu)
  DateTime::TimeZone::INFINITY, #      utc_end
  59771606228, #  local_start 1895-01-31 23:57:08 (Thu)
  DateTime::TimeZone::INFINITY, #    local_end
  25200,
  0,
  '+07',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_INDIAN_CHRISTMAS

    $main::fatpacked{"DateTime/TimeZone/Indian/Cocos.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_INDIAN_COCOS';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/australasia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Indian::Cocos;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Indian::Cocos::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59926671140, #      utc_end 1899-12-31 17:32:20 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59926694400, #    local_end 1900-01-01 00:00:00 (Mon)
  23260,
  0,
  'LMT',
      ],
      [
  59926671140, #    utc_start 1899-12-31 17:32:20 (Sun)
  DateTime::TimeZone::INFINITY, #      utc_end
  59926694540, #  local_start 1900-01-01 00:02:20 (Mon)
  DateTime::TimeZone::INFINITY, #    local_end
  23400,
  0,
  '+0630',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_INDIAN_COCOS

    $main::fatpacked{"DateTime/TimeZone/Indian/Kerguelen.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_INDIAN_KERGUELEN';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/antarctica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Indian::Kerguelen;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Indian::Kerguelen::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  61504531200, #      utc_end 1950-01-01 00:00:00 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  61504531200, #    local_end 1950-01-01 00:00:00 (Sun)
  0,
  0,
  '-00',
      ],
      [
  61504531200, #    utc_start 1950-01-01 00:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #      utc_end
  61504549200, #  local_start 1950-01-01 05:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  18000,
  0,
  '+05',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_INDIAN_KERGUELEN

    $main::fatpacked{"DateTime/TimeZone/Indian/Mahe.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_INDIAN_MAHE';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/africa.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Indian::Mahe;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Indian::Mahe::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60129029892, #      utc_end 1906-05-31 20:18:12 (Thu)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60129043200, #    local_end 1906-06-01 00:00:00 (Fri)
  13308,
  0,
  'LMT',
      ],
      [
  60129029892, #    utc_start 1906-05-31 20:18:12 (Thu)
  DateTime::TimeZone::INFINITY, #      utc_end
  60129044292, #  local_start 1906-06-01 00:18:12 (Fri)
  DateTime::TimeZone::INFINITY, #    local_end
  14400,
  0,
  '+04',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_INDIAN_MAHE

    $main::fatpacked{"DateTime/TimeZone/Indian/Maldives.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_INDIAN_MALDIVES';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/asia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Indian::Maldives;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Indian::Maldives::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59295524760, #      utc_end 1879-12-31 19:06:00 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59295542400, #    local_end 1880-01-01 00:00:00 (Thu)
  17640,
  0,
  'LMT',
      ],
      [
  59295524760, #    utc_start 1879-12-31 19:06:00 (Wed)
  61820046360, #      utc_end 1959-12-31 19:06:00 (Thu)
  59295542400, #  local_start 1880-01-01 00:00:00 (Thu)
  61820064000, #    local_end 1960-01-01 00:00:00 (Fri)
  17640,
  0,
  'MMT',
      ],
      [
  61820046360, #    utc_start 1959-12-31 19:06:00 (Thu)
  DateTime::TimeZone::INFINITY, #      utc_end
  61820064360, #  local_start 1960-01-01 00:06:00 (Fri)
  DateTime::TimeZone::INFINITY, #    local_end
  18000,
  0,
  '+05',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_INDIAN_MALDIVES

    $main::fatpacked{"DateTime/TimeZone/Indian/Mauritius.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_INDIAN_MAURITIUS';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/africa.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Indian::Mauritius;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Indian::Mauritius::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60147519000, #      utc_end 1906-12-31 20:10:00 (Mon)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60147532800, #    local_end 1907-01-01 00:00:00 (Tue)
  13800,
  0,
  'LMT',
      ],
      [
  60147519000, #    utc_start 1906-12-31 20:10:00 (Mon)
  62538724800, #      utc_end 1982-10-09 20:00:00 (Sat)
  60147533400, #  local_start 1907-01-01 00:10:00 (Tue)
  62538739200, #    local_end 1982-10-10 00:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  62538724800, #    utc_start 1982-10-09 20:00:00 (Sat)
  62552718000, #      utc_end 1983-03-20 19:00:00 (Sun)
  62538742800, #  local_start 1982-10-10 01:00:00 (Sun)
  62552736000, #    local_end 1983-03-21 00:00:00 (Mon)
  18000,
  1,
  '+05',
      ],
      [
  62552718000, #    utc_start 1983-03-20 19:00:00 (Sun)
  63360655200, #      utc_end 2008-10-25 22:00:00 (Sat)
  62552732400, #  local_start 1983-03-20 23:00:00 (Sun)
  63360669600, #    local_end 2008-10-26 02:00:00 (Sun)
  14400,
  0,
  '+04',
      ],
      [
  63360655200, #    utc_start 2008-10-25 22:00:00 (Sat)
  63373957200, #      utc_end 2009-03-28 21:00:00 (Sat)
  63360673200, #  local_start 2008-10-26 03:00:00 (Sun)
  63373975200, #    local_end 2009-03-29 02:00:00 (Sun)
  18000,
  1,
  '+05',
      ],
      [
  63373957200, #    utc_start 2009-03-28 21:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  63373971600, #  local_start 2009-03-29 01:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  14400,
  0,
  '+04',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {2}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_INDIAN_MAURITIUS

    $main::fatpacked{"DateTime/TimeZone/Indian/Reunion.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_INDIAN_REUNION';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/africa.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Indian::Reunion;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Indian::Reunion::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60286796288, #      utc_end 1911-05-31 20:18:08 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60286809600, #    local_end 1911-06-01 00:00:00 (Thu)
  13312,
  0,
  'LMT',
      ],
      [
  60286796288, #    utc_start 1911-05-31 20:18:08 (Wed)
  DateTime::TimeZone::INFINITY, #      utc_end
  60286810688, #  local_start 1911-06-01 00:18:08 (Thu)
  DateTime::TimeZone::INFINITY, #    local_end
  14400,
  0,
  '+04',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_INDIAN_REUNION

    $main::fatpacked{"DateTime/TimeZone/Local.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_LOCAL';
  package DateTime::TimeZone::Local;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use DateTime::TimeZone;
  use File::Spec;
  use Module::Runtime qw( require_module );
  use Try::Tiny;
  
  sub TimeZone {
      my $class = shift;
  
      my $subclass = $class->_load_subclass();
  
      for my $meth ( $subclass->Methods() ) {
          my $tz = $subclass->$meth();
  
          return $tz if $tz;
      }
  
      die "Cannot determine local time zone\n";
  }
  
  {
      # Stolen from File::Spec. My theory is that other folks can write
      # the non-existent modules if they feel a need, and release them
      # to CPAN separately.
      my %subclass = (
          android => 'Android',
          cygwin  => 'Unix',
          dos     => 'OS2',
          epoc    => 'Epoc',
          MacOS   => 'Mac',
          MSWin32 => 'Win32',
          NetWare => 'Win32',
          os2     => 'OS2',
          symbian => 'Win32',
          VMS     => 'VMS',
      );
  
      sub _load_subclass {
          my $class = shift;
  
          my $os_name  = $subclass{$^O} || $^O;
          my $subclass = $class . '::' . $os_name;
  
          return $subclass if $subclass->can('Methods');
  
          return $subclass if try {
              ## no critic (Variables::RequireInitializationForLocalVars)
              local $SIG{__DIE__};
              require_module($subclass);
          };
  
          $subclass = $class . '::Unix';
  
          require_module($subclass);
  
          return $subclass;
      }
  }
  
  sub FromEnv {
      my $class = shift;
  
      foreach my $var ( $class->EnvVars() ) {
          if ( $class->_IsValidName( $ENV{$var} ) ) {
              my $tz = try {
                  ## no critic (Variables::RequireInitializationForLocalVars)
                  local $SIG{__DIE__};
                  DateTime::TimeZone->new( name => $ENV{$var} );
              };
  
              return $tz if $tz;
          }
      }
  
      return;
  }
  
  sub _IsValidName {
      shift;
  
      return 0 unless defined $_[0];
      return 0 if $_[0] eq 'local';
  
      return $_[0] =~ m{^[\w/\-\+]+$};
  }
  
  1;
  
  # ABSTRACT: Determine the local system's time zone
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  DateTime::TimeZone::Local - Determine the local system's time zone
  
  =head1 VERSION
  
  version 2.36
  
  =head1 SYNOPSIS
  
    my $tz = DateTime::TimeZone->new( name => 'local' );
  
    my $tz = DateTime::TimeZone::Local->TimeZone();
  
  =head1 DESCRIPTION
  
  This module provides an interface for determining the local system's
  time zone. Most of the functionality for doing this is in OS-specific
  subclasses.
  
  =head1 USAGE
  
  This class provides the following methods:
  
  =head2 DateTime::TimeZone::Local->TimeZone()
  
  This attempts to load an appropriate subclass and asks it to find the
  local time zone. This method is called by when you pass "local" as the
  time zone name to C<< DateTime:TimeZone->new() >>.
  
  If your OS is not explicitly handled, you can create a module with a
  name of the form C<DateTime::TimeZone::Local::$^O>. If it exists, it
  will be used instead of falling back to the Unix subclass.
  
  If no OS-specific module exists, we fall back to using the Unix
  subclass.
  
  See L<DateTime::TimeZone::Local::Unix>, L<DateTime::TimeZone::Local::Android>,
  L<DateTime::TimeZone::Local::hpux>, L<DateTime::TimeZone::Local::Win32>, and
  L<DateTime::TimeZone::Local::VMS> for OS-specific details.
  
  =head1 SUBCLASSING
  
  If you want to make a new OS-specific subclass, there are several
  methods provided by this module you should know about.
  
  =head2 $class->Methods()
  
  This method should be provided by your class. It should provide a list
  of methods that will be called to try to determine the local time
  zone.
  
  Each of these methods is expected to return a new C<DateTime::TimeZone> object
  if it can successfully determine the time zone.
  
  =head2 $class->FromEnv()
  
  This method tries to find a valid time zone in an C<%ENV> value. It
  calls C<< $class->EnvVars() >> to determine which keys to look at.
  
  To use this from a subclass, simply return "FromEnv" as one of the
  items from C<< $class->Methods() >>.
  
  =head2 $class->EnvVars()
  
  This method should be provided by your subclass. It should return a
  list of env vars to be checked by C<< $class->FromEnv() >>.
  
  Your class should always include the C<TZ> key as one of the variables to
  check.
  
  =head2 $class->_IsValidName($name)
  
  Given a possible time zone name, this returns a boolean indicating
  whether or not the name looks valid. It always return false for
  "local" in order to avoid infinite loops.
  
  =head1 EXAMPLE SUBCLASS
  
  Here is a simple example subclass:
  
    package DateTime::TimeZone::SomeOS;
  
    use strict;
    use warnings;
  
    use base 'DateTime::TimeZone::Local';
  
  
    sub Methods { qw( FromEnv FromEther ) }
  
    sub EnvVars { qw( TZ ZONE ) }
  
    sub FromEther
    {
        my $class = shift;
  
        ...
    }
  
  =head1 SUPPORT
  
  Bugs may be submitted at L<https://github.com/houseabsolute/DateTime-TimeZone/issues>.
  
  I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
  
  =head1 SOURCE
  
  The source code repository for DateTime-TimeZone can be found at L<https://github.com/houseabsolute/DateTime-TimeZone>.
  
  =head1 AUTHOR
  
  Dave Rolsky <autarch@urth.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2019 by Dave Rolsky.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  The full text of the license can be found in the
  F<LICENSE> file included with this distribution.
  
  =cut
DATETIME_TIMEZONE_LOCAL

    $main::fatpacked{"DateTime/TimeZone/Local/Android.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_LOCAL_ANDROID';
  package DateTime::TimeZone::Local::Android;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Try::Tiny;
  
  use parent 'DateTime::TimeZone::Local';
  
  sub Methods {
      return qw(
          FromEnv
          FromGetProp
          FromDefault
      );
  }
  
  sub EnvVars { return 'TZ' }
  
  # https://chromium.googlesource.com/native_client/nacl-bionic/+/upstream/master/libc/tzcode/localtime.c
  sub FromGetProp {
      ## no critic (InputOutput::ProhibitBacktickOperators)
      my $name = `getprop persist.sys.timezone`;
      chomp $name;
      my $tz = try {
          ## no critic (Variables::RequireInitializationForLocalVars)
          local $SIG{__DIE__};
          DateTime::TimeZone->new( name => $name );
      };
  
      return $tz if $tz;
  }
  
  # See the link above. Android always defaults to UTC
  sub FromDefault {
      return try {
          ## no critic (Variables::RequireInitializationForLocalVars)
          local $SIG{__DIE__};
          DateTime::TimeZone->new( name => 'UTC' );
      };
  }
  
  1;
DATETIME_TIMEZONE_LOCAL_ANDROID

    $main::fatpacked{"DateTime/TimeZone/Local/Unix.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_LOCAL_UNIX';
  package DateTime::TimeZone::Local::Unix;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Cwd 3;
  use Try::Tiny;
  
  use parent 'DateTime::TimeZone::Local';
  
  sub Methods {
      return qw(
          FromEnv
          FromEtcTimezone
          FromEtcLocaltime
          FromEtcTIMEZONE
          FromEtcSysconfigClock
          FromEtcDefaultInit
      );
  }
  
  sub EnvVars { return 'TZ' }
  
  ## no critic (Variables::ProhibitPackageVars)
  our $EtcDir = '/etc';
  ## use critic
  
  sub _EtcFile {
      shift;
      return File::Spec->catfile( $EtcDir, @_ );
  }
  
  sub FromEtcLocaltime {
      my $class = shift;
  
      my $lt_file = $class->_EtcFile('localtime');
      return unless -r $lt_file && -s _;
  
      my $real_name;
      if ( -l $lt_file ) {
  
          # The _Readlink sub exists so the test suite can mock it.
          $real_name = $class->_Readlink($lt_file);
      }
  
      $real_name ||= $class->_FindMatchingZoneinfoFile($lt_file);
  
      if ( defined $real_name ) {
          my ( undef, $dirs, $file ) = File::Spec->splitpath($real_name);
  
          my @parts = grep { defined && length } File::Spec->splitdir($dirs),
              $file;
  
          foreach my $x ( reverse 0 .. $#parts ) {
              my $name = (
                  $x < $#parts
                  ? join '/', @parts[ $x .. $#parts ]
                  : $parts[$x]
              );
  
              my $tz = try {
                  ## no critic (Variables::RequireInitializationForLocalVars)
                  local $SIG{__DIE__};
                  DateTime::TimeZone->new( name => $name );
              };
  
              return $tz if $tz;
          }
      }
  }
  
  sub _Readlink {
      my $link = $_[1];
  
      # Using abs_path will resolve multiple levels of link indirection,
      # whereas readlink just follows the link to the next target.
      return Cwd::abs_path($link);
  }
  
  ## no critic (Variables::ProhibitPackageVars)
  our $ZoneinfoDir = '/usr/share/zoneinfo';
  ## use critic
  
  # for systems where /etc/localtime is a copy of a zoneinfo file
  sub _FindMatchingZoneinfoFile {
      shift;
      my $file_to_match = shift;
  
      # For some reason, under at least macOS 10.13 High Sierra,
      # /usr/share/zoneinfo is a link to a link to a directory. And no, I didn't
      # stutter. This is fine, and it passes the -d below. But File::Find does
      # not understand a link to be a directory, so rather than incur the
      # overhead of telling File::Find::find() to follow symbolic links, we just
      # resolve it here.
      my $zone_info_dir = $ZoneinfoDir;
      $zone_info_dir = readlink $zone_info_dir while -l $zone_info_dir;
  
      return unless -d $zone_info_dir;
  
      require File::Basename;
      require File::Compare;
      require File::Find;
  
      my $size = -s $file_to_match;
  
      my $real_name;
      try {
          ## no critic (Variables::RequireInitializationForLocalVars)
          local $SIG{__DIE__};
          local $_;
  
          File::Find::find(
              {
                  wanted => sub {
                      if (
                             !defined $real_name
                          && -f $_
                          && !-l $_
                          && $size == -s _
  
                          # This fixes RT 24026 - apparently such a
                          # file exists on FreeBSD and it can cause a
                          # false positive
                          && File::Basename::basename($_) ne 'posixrules'
                          && File::Compare::compare( $_, $file_to_match ) == 0
                      ) {
                          $real_name = $_;
  
                          # File::Find has no mechanism for bailing in the
                          # middle of a find.
                          die { found => 1 };
                      }
                  },
                  no_chdir => 1,
              },
              $zone_info_dir,
          );
      }
      catch {
          die $_ unless ref $_ && $_->{found};
      };
  
      return $real_name;
  }
  
  sub FromEtcTimezone {
      my $class = shift;
  
      my $tz_file = $class->_EtcFile('timezone');
      return unless -f $tz_file && -r _;
  
      open my $fh, '<', $tz_file
          or die "Cannot read $tz_file: $!";
      my $name = do { local $/ = undef; <$fh> };
      close $fh or die $!;
  
      $name =~ s/^\s+|\s+$//g;
  
      return unless $class->_IsValidName($name);
  
      return try {
          ## no critic (Variables::RequireInitializationForLocalVars)
          local $SIG{__DIE__};
          DateTime::TimeZone->new( name => $name );
      };
  }
  
  sub FromEtcTIMEZONE {
      my $class = shift;
  
      my $tz_file = $class->_EtcFile('TIMEZONE');
      return unless -f $tz_file && -r _;
  
      ## no critic (InputOutput::RequireBriefOpen)
      open my $fh, '<', $tz_file
          or die "Cannot read $tz_file: $!";
  
      my $name;
      while ( defined( $name = <$fh> ) ) {
          if ( $name =~ /\A\s*TZ\s*=\s*(\S+)/ ) {
              $name = $1;
              last;
          }
      }
  
      close $fh or die $!;
  
      return unless $class->_IsValidName($name);
  
      return try {
          ## no critic (Variables::RequireInitializationForLocalVars)
          local $SIG{__DIE__};
          DateTime::TimeZone->new( name => $name );
      };
  }
  
  # RedHat uses this
  sub FromEtcSysconfigClock {
      my $class = shift;
  
      my $clock_file = $class->_EtcFile('sysconfig/clock');
      return unless -r $clock_file && -f _;
  
      my $name = $class->_ReadEtcSysconfigClock($clock_file);
  
      return unless $class->_IsValidName($name);
  
      return try {
          ## no critic (Variables::RequireInitializationForLocalVars)
          local $SIG{__DIE__};
          DateTime::TimeZone->new( name => $name );
      };
  }
  
  # this is a separate function so that it can be overridden in the test suite
  sub _ReadEtcSysconfigClock {
      shift;
      my $clock_file = shift;
  
      open my $fh, '<', $clock_file
          or die "Cannot read $clock_file: $!";
  
      ## no critic (Variables::RequireInitializationForLocalVars)
      local $_;
      while (<$fh>) {
          return $1 if /^(?:TIME)?ZONE="([^"]+)"/;
      }
  
      close $fh or die $!;
  }
  
  sub FromEtcDefaultInit {
      my $class = shift;
  
      my $init_file = $class->_EtcFile('default/init');
      return unless -r $init_file && -f _;
  
      my $name = $class->_ReadEtcDefaultInit($init_file);
  
      return unless $class->_IsValidName($name);
  
      return try {
          ## no critic (Variables::RequireInitializationForLocalVars)
          local $SIG{__DIE__};
          DateTime::TimeZone->new( name => $name );
      };
  }
  
  # this is a separate function so that it can be overridden in the test
  # suite
  sub _ReadEtcDefaultInit {
      shift;
      my $init_file = shift;
  
      open my $fh, '<', $init_file
          or die "Cannot read $init_file: $!";
  
      ## no critic (Variables::RequireInitializationForLocalVars)
      local $_;
      while (<$fh>) {
          return $1 if /^TZ=(.+)/;
      }
  
      close $fh or die $!;
  }
  
  1;
  
  # ABSTRACT: Determine the local system's time zone on Unix
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  DateTime::TimeZone::Local::Unix - Determine the local system's time zone on Unix
  
  =head1 VERSION
  
  version 2.36
  
  =head1 SYNOPSIS
  
    my $tz = DateTime::TimeZone->new( name => 'local' );
  
    my $tz = DateTime::TimeZone::Local->TimeZone();
  
  =head1 DESCRIPTION
  
  This module provides methods for determining the local time zone on a
  Unix platform.
  
  =head1 HOW THE TIME ZONE IS DETERMINED
  
  This class tries the following methods of determining the local time
  zone:
  
  =over 4
  
  =item * $ENV{TZ}
  
  It checks C<< $ENV{TZ} >> for a valid time zone name.
  
  =item * F</etc/localtime>
  
  If this file is a symlink to an Olson database time zone file (usually
  in F</usr/share/zoneinfo>) then it uses the target file's path name to
  determine the time zone name. For example, if the path is
  F</usr/share/zoneinfo/America/Chicago>, the time zone is
  "America/Chicago".
  
  Some systems just copy the relevant file to F</etc/localtime> instead
  of making a symlink.  In this case, we look in F</usr/share/zoneinfo>
  for a file that has the same size and content as F</etc/localtime> to
  determine the local time zone.
  
  =item * F</etc/timezone>
  
  If this file exists, it is read and its contents are used as a time
  zone name.
  
  =item * F</etc/TIMEZONE>
  
  If this file exists, it is opened and we look for a line starting like
  "TZ = ...". If this is found, it should indicate a time zone name.
  
  =item * F</etc/sysconfig/clock>
  
  If this file exists, it is opened and we look for a line starting like
  "TIMEZONE = ..." or "ZONE = ...". If this is found, it should indicate
  a time zone name.
  
  =item * F</etc/default/init>
  
  If this file exists, it is opened and we look for a line starting like
  "TZ=...". If this is found, it should indicate a time zone name.
  
  =back
  
  B<Note:> Some systems such as virtual machine boxes may lack any of these
  files. You can confirm that this is case by running:
  
      $ ls -l /etc/localtime /etc/timezone /etc/TIMEZONE \
          /etc/sysconfig/clock /etc/default/init
  
  If this is the case, then when checking for timezone handling you are
  likely to get an exception:
  
      $ perl -wle 'use DateTime; DateTime->now( time_zone => "local" )'
      Cannot determine local time zone
  
  In that case, you should consult your system F<man> pages for details on how
  to address that problem. In one such case reported to us, a FreeBSD virtual
  machine had been built without any of these files. The user was able to run
  the FreeBSD F<tzsetup> utility. That installed F</etc/localtime>, after which
  the above timezone diagnostic ran silently, I<i.e.>, without throwing an
  exception.
  
  =head1 SUPPORT
  
  Bugs may be submitted at L<https://github.com/houseabsolute/DateTime-TimeZone/issues>.
  
  I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
  
  =head1 SOURCE
  
  The source code repository for DateTime-TimeZone can be found at L<https://github.com/houseabsolute/DateTime-TimeZone>.
  
  =head1 AUTHOR
  
  Dave Rolsky <autarch@urth.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2019 by Dave Rolsky.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  The full text of the license can be found in the
  F<LICENSE> file included with this distribution.
  
  =cut
DATETIME_TIMEZONE_LOCAL_UNIX

    $main::fatpacked{"DateTime/TimeZone/Local/VMS.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_LOCAL_VMS';
  package DateTime::TimeZone::Local::VMS;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use parent 'DateTime::TimeZone::Local';
  
  sub Methods { return qw( FromEnv ) }
  
  sub EnvVars {
      return qw( TZ SYS$TIMEZONE_RULE SYS$TIMEZONE_NAME UCX$TZ TCPIP$TZ );
  }
  
  1;
  
  # ABSTRACT: Determine the local system's time zone on VMS
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  DateTime::TimeZone::Local::VMS - Determine the local system's time zone on VMS
  
  =head1 VERSION
  
  version 2.36
  
  =head1 SYNOPSIS
  
    my $tz = DateTime::TimeZone->new( name => 'local' );
  
    my $tz = DateTime::TimeZone::Local->TimeZone();
  
  =head1 DESCRIPTION
  
  This module provides methods for determining the local time zone on a
  VMS platform.
  
  NOTE: This is basically a stub pending an implementation by someone
  who knows something about VMS.
  
  =head1 HOW THE TIME ZONE IS DETERMINED
  
  This class tries the following methods of determining the local time
  zone:
  
  =over 4
  
  =item * %ENV
  
  We check the following environment variables:
  
  =over 8
  
  =item * TZ
  
  =item * SYS$TIMEZONE_RULE
  
  =item * SYS$TIMEZONE_NAME
  
  =item * UCX$TZ
  
  =item * TCPIP$TZ
  
  =back
  
  =back
  
  =head1 SUPPORT
  
  Bugs may be submitted at L<https://github.com/houseabsolute/DateTime-TimeZone/issues>.
  
  I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
  
  =head1 SOURCE
  
  The source code repository for DateTime-TimeZone can be found at L<https://github.com/houseabsolute/DateTime-TimeZone>.
  
  =head1 AUTHOR
  
  Dave Rolsky <autarch@urth.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2019 by Dave Rolsky.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  The full text of the license can be found in the
  F<LICENSE> file included with this distribution.
  
  =cut
DATETIME_TIMEZONE_LOCAL_VMS

    $main::fatpacked{"DateTime/TimeZone/MET.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_MET';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::MET;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::MET::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60441976800, #      utc_end 1916-04-30 22:00:00 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60441980400, #    local_end 1916-04-30 23:00:00 (Sun)
  3600,
  0,
  'MET',
      ],
      [
  60441976800, #    utc_start 1916-04-30 22:00:00 (Sun)
  60455199600, #      utc_end 1916-09-30 23:00:00 (Sat)
  60441984000, #  local_start 1916-05-01 00:00:00 (Mon)
  60455206800, #    local_end 1916-10-01 01:00:00 (Sun)
  7200,
  1,
  'MEST',
      ],
      [
  60455199600, #    utc_start 1916-09-30 23:00:00 (Sat)
  60472227600, #      utc_end 1917-04-16 01:00:00 (Mon)
  60455203200, #  local_start 1916-10-01 00:00:00 (Sun)
  60472231200, #    local_end 1917-04-16 02:00:00 (Mon)
  3600,
  0,
  'MET',
      ],
      [
  60472227600, #    utc_start 1917-04-16 01:00:00 (Mon)
  60485533200, #      utc_end 1917-09-17 01:00:00 (Mon)
  60472234800, #  local_start 1917-04-16 03:00:00 (Mon)
  60485540400, #    local_end 1917-09-17 03:00:00 (Mon)
  7200,
  1,
  'MEST',
      ],
      [
  60485533200, #    utc_start 1917-09-17 01:00:00 (Mon)
  60503677200, #      utc_end 1918-04-15 01:00:00 (Mon)
  60485536800, #  local_start 1917-09-17 02:00:00 (Mon)
  60503680800, #    local_end 1918-04-15 02:00:00 (Mon)
  3600,
  0,
  'MET',
      ],
      [
  60503677200, #    utc_start 1918-04-15 01:00:00 (Mon)
  60516982800, #      utc_end 1918-09-16 01:00:00 (Mon)
  60503684400, #  local_start 1918-04-15 03:00:00 (Mon)
  60516990000, #    local_end 1918-09-16 03:00:00 (Mon)
  7200,
  1,
  'MEST',
      ],
      [
  60516982800, #    utc_start 1918-09-16 01:00:00 (Mon)
  61196778000, #      utc_end 1940-04-01 01:00:00 (Mon)
  60516986400, #  local_start 1918-09-16 02:00:00 (Mon)
  61196781600, #    local_end 1940-04-01 02:00:00 (Mon)
  3600,
  0,
  'MET',
      ],
      [
  61196778000, #    utc_start 1940-04-01 01:00:00 (Mon)
  61278426000, #      utc_end 1942-11-02 01:00:00 (Mon)
  61196785200, #  local_start 1940-04-01 03:00:00 (Mon)
  61278433200, #    local_end 1942-11-02 03:00:00 (Mon)
  7200,
  1,
  'MEST',
      ],
      [
  61278426000, #    utc_start 1942-11-02 01:00:00 (Mon)
  61291126800, #      utc_end 1943-03-29 01:00:00 (Mon)
  61278429600, #  local_start 1942-11-02 02:00:00 (Mon)
  61291130400, #    local_end 1943-03-29 02:00:00 (Mon)
  3600,
  0,
  'MET',
      ],
      [
  61291126800, #    utc_start 1943-03-29 01:00:00 (Mon)
  61307456400, #      utc_end 1943-10-04 01:00:00 (Mon)
  61291134000, #  local_start 1943-03-29 03:00:00 (Mon)
  61307463600, #    local_end 1943-10-04 03:00:00 (Mon)
  7200,
  1,
  'MEST',
      ],
      [
  61307456400, #    utc_start 1943-10-04 01:00:00 (Mon)
  61323181200, #      utc_end 1944-04-03 01:00:00 (Mon)
  61307460000, #  local_start 1943-10-04 02:00:00 (Mon)
  61323184800, #    local_end 1944-04-03 02:00:00 (Mon)
  3600,
  0,
  'MET',
      ],
      [
  61323181200, #    utc_start 1944-04-03 01:00:00 (Mon)
  61338906000, #      utc_end 1944-10-02 01:00:00 (Mon)
  61323188400, #  local_start 1944-04-03 03:00:00 (Mon)
  61338913200, #    local_end 1944-10-02 03:00:00 (Mon)
  7200,
  1,
  'MEST',
      ],
      [
  61338906000, #    utc_start 1944-10-02 01:00:00 (Mon)
  61354630800, #      utc_end 1945-04-02 01:00:00 (Mon)
  61338909600, #  local_start 1944-10-02 02:00:00 (Mon)
  61354634400, #    local_end 1945-04-02 02:00:00 (Mon)
  3600,
  0,
  'MET',
      ],
      [
  61354630800, #    utc_start 1945-04-02 01:00:00 (Mon)
  61369059600, #      utc_end 1945-09-16 01:00:00 (Sun)
  61354638000, #  local_start 1945-04-02 03:00:00 (Mon)
  61369066800, #    local_end 1945-09-16 03:00:00 (Sun)
  7200,
  1,
  'MEST',
      ],
      [
  61369059600, #    utc_start 1945-09-16 01:00:00 (Sun)
  62364560400, #      utc_end 1977-04-03 01:00:00 (Sun)
  61369063200, #  local_start 1945-09-16 02:00:00 (Sun)
  62364564000, #    local_end 1977-04-03 02:00:00 (Sun)
  3600,
  0,
  'MET',
      ],
      [
  62364560400, #    utc_start 1977-04-03 01:00:00 (Sun)
  62379680400, #      utc_end 1977-09-25 01:00:00 (Sun)
  62364567600, #  local_start 1977-04-03 03:00:00 (Sun)
  62379687600, #    local_end 1977-09-25 03:00:00 (Sun)
  7200,
  1,
  'MEST',
      ],
      [
  62379680400, #    utc_start 1977-09-25 01:00:00 (Sun)
  62396010000, #      utc_end 1978-04-02 01:00:00 (Sun)
  62379684000, #  local_start 1977-09-25 02:00:00 (Sun)
  62396013600, #    local_end 1978-04-02 02:00:00 (Sun)
  3600,
  0,
  'MET',
      ],
      [
  62396010000, #    utc_start 1978-04-02 01:00:00 (Sun)
  62411734800, #      utc_end 1978-10-01 01:00:00 (Sun)
  62396017200, #  local_start 1978-04-02 03:00:00 (Sun)
  62411742000, #    local_end 1978-10-01 03:00:00 (Sun)
  7200,
  1,
  'MEST',
      ],
      [
  62411734800, #    utc_start 1978-10-01 01:00:00 (Sun)
  62427459600, #      utc_end 1979-04-01 01:00:00 (Sun)
  62411738400, #  local_start 1978-10-01 02:00:00 (Sun)
  62427463200, #    local_end 1979-04-01 02:00:00 (Sun)
  3600,
  0,
  'MET',
      ],
      [
  62427459600, #    utc_start 1979-04-01 01:00:00 (Sun)
  62443184400, #      utc_end 1979-09-30 01:00:00 (Sun)
  62427466800, #  local_start 1979-04-01 03:00:00 (Sun)
  62443191600, #    local_end 1979-09-30 03:00:00 (Sun)
  7200,
  1,
  'MEST',
      ],
      [
  62443184400, #    utc_start 1979-09-30 01:00:00 (Sun)
  62459514000, #      utc_end 1980-04-06 01:00:00 (Sun)
  62443188000, #  local_start 1979-09-30 02:00:00 (Sun)
  62459517600, #    local_end 1980-04-06 02:00:00 (Sun)
  3600,
  0,
  'MET',
      ],
      [
  62459514000, #    utc_start 1980-04-06 01:00:00 (Sun)
  62474634000, #      utc_end 1980-09-28 01:00:00 (Sun)
  62459521200, #  local_start 1980-04-06 03:00:00 (Sun)
  62474641200, #    local_end 1980-09-28 03:00:00 (Sun)
  7200,
  1,
  'MEST',
      ],
      [
  62474634000, #    utc_start 1980-09-28 01:00:00 (Sun)
  62490358800, #      utc_end 1981-03-29 01:00:00 (Sun)
  62474637600, #  local_start 1980-09-28 02:00:00 (Sun)
  62490362400, #    local_end 1981-03-29 02:00:00 (Sun)
  3600,
  0,
  'MET',
      ],
      [
  62490358800, #    utc_start 1981-03-29 01:00:00 (Sun)
  62506083600, #      utc_end 1981-09-27 01:00:00 (Sun)
  62490366000, #  local_start 1981-03-29 03:00:00 (Sun)
  62506090800, #    local_end 1981-09-27 03:00:00 (Sun)
  7200,
  1,
  'MEST',
      ],
      [
  62506083600, #    utc_start 1981-09-27 01:00:00 (Sun)
  62521808400, #      utc_end 1982-03-28 01:00:00 (Sun)
  62506087200, #  local_start 1981-09-27 02:00:00 (Sun)
  62521812000, #    local_end 1982-03-28 02:00:00 (Sun)
  3600,
  0,
  'MET',
      ],
      [
  62521808400, #    utc_start 1982-03-28 01:00:00 (Sun)
  62537533200, #      utc_end 1982-09-26 01:00:00 (Sun)
  62521815600, #  local_start 1982-03-28 03:00:00 (Sun)
  62537540400, #    local_end 1982-09-26 03:00:00 (Sun)
  7200,
  1,
  'MEST',
      ],
      [
  62537533200, #    utc_start 1982-09-26 01:00:00 (Sun)
  62553258000, #      utc_end 1983-03-27 01:00:00 (Sun)
  62537536800, #  local_start 1982-09-26 02:00:00 (Sun)
  62553261600, #    local_end 1983-03-27 02:00:00 (Sun)
  3600,
  0,
  'MET',
      ],
      [
  62553258000, #    utc_start 1983-03-27 01:00:00 (Sun)
  62568982800, #      utc_end 1983-09-25 01:00:00 (Sun)
  62553265200, #  local_start 1983-03-27 03:00:00 (Sun)
  62568990000, #    local_end 1983-09-25 03:00:00 (Sun)
  7200,
  1,
  'MEST',
      ],
      [
  62568982800, #    utc_start 1983-09-25 01:00:00 (Sun)
  62584707600, #      utc_end 1984-03-25 01:00:00 (Sun)
  62568986400, #  local_start 1983-09-25 02:00:00 (Sun)
  62584711200, #    local_end 1984-03-25 02:00:00 (Sun)
  3600,
  0,
  'MET',
      ],
      [
  62584707600, #    utc_start 1984-03-25 01:00:00 (Sun)
  62601037200, #      utc_end 1984-09-30 01:00:00 (Sun)
  62584714800, #  local_start 1984-03-25 03:00:00 (Sun)
  62601044400, #    local_end 1984-09-30 03:00:00 (Sun)
  7200,
  1,
  'MEST',
      ],
      [
  62601037200, #    utc_start 1984-09-30 01:00:00 (Sun)
  62616762000, #      utc_end 1985-03-31 01:00:00 (Sun)
  62601040800, #  local_start 1984-09-30 02:00:00 (Sun)
  62616765600, #    local_end 1985-03-31 02:00:00 (Sun)
  3600,
  0,
  'MET',
      ],
      [
  62616762000, #    utc_start 1985-03-31 01:00:00 (Sun)
  62632486800, #      utc_end 1985-09-29 01:00:00 (Sun)
  62616769200, #  local_start 1985-03-31 03:00:00 (Sun)
  62632494000, #    local_end 1985-09-29 03:00:00 (Sun)
  7200,
  1,
  'MEST',
      ],
      [
  62632486800, #    utc_start 1985-09-29 01:00:00 (Sun)
  62648211600, #      utc_end 1986-03-30 01:00:00 (Sun)
  62632490400, #  local_start 1985-09-29 02:00:00 (Sun)
  62648215200, #    local_end 1986-03-30 02:00:00 (Sun)
  3600,
  0,
  'MET',
      ],
      [
  62648211600, #    utc_start 1986-03-30 01:00:00 (Sun)
  62663936400, #      utc_end 1986-09-28 01:00:00 (Sun)
  62648218800, #  local_start 1986-03-30 03:00:00 (Sun)
  62663943600, #    local_end 1986-09-28 03:00:00 (Sun)
  7200,
  1,
  'MEST',
      ],
      [
  62663936400, #    utc_start 1986-09-28 01:00:00 (Sun)
  62679661200, #      utc_end 1987-03-29 01:00:00 (Sun)
  62663940000, #  local_start 1986-09-28 02:00:00 (Sun)
  62679664800, #    local_end 1987-03-29 02:00:00 (Sun)
  3600,
  0,
  'MET',
      ],
      [
  62679661200, #    utc_start 1987-03-29 01:00:00 (Sun)
  62695386000, #      utc_end 1987-09-27 01:00:00 (Sun)
  62679668400, #  local_start 1987-03-29 03:00:00 (Sun)
  62695393200, #    local_end 1987-09-27 03:00:00 (Sun)
  7200,
  1,
  'MEST',
      ],
      [
  62695386000, #    utc_start 1987-09-27 01:00:00 (Sun)
  62711110800, #      utc_end 1988-03-27 01:00:00 (Sun)
  62695389600, #  local_start 1987-09-27 02:00:00 (Sun)
  62711114400, #    local_end 1988-03-27 02:00:00 (Sun)
  3600,
  0,
  'MET',
      ],
      [
  62711110800, #    utc_start 1988-03-27 01:00:00 (Sun)
  62726835600, #      utc_end 1988-09-25 01:00:00 (Sun)
  62711118000, #  local_start 1988-03-27 03:00:00 (Sun)
  62726842800, #    local_end 1988-09-25 03:00:00 (Sun)
  7200,
  1,
  'MEST',
      ],
      [
  62726835600, #    utc_start 1988-09-25 01:00:00 (Sun)
  62742560400, #      utc_end 1989-03-26 01:00:00 (Sun)
  62726839200, #  local_start 1988-09-25 02:00:00 (Sun)
  62742564000, #    local_end 1989-03-26 02:00:00 (Sun)
  3600,
  0,
  'MET',
      ],
      [
  62742560400, #    utc_start 1989-03-26 01:00:00 (Sun)
  62758285200, #      utc_end 1989-09-24 01:00:00 (Sun)
  62742567600, #  local_start 1989-03-26 03:00:00 (Sun)
  62758292400, #    local_end 1989-09-24 03:00:00 (Sun)
  7200,
  1,
  'MEST',
      ],
      [
  62758285200, #    utc_start 1989-09-24 01:00:00 (Sun)
  62774010000, #      utc_end 1990-03-25 01:00:00 (Sun)
  62758288800, #  local_start 1989-09-24 02:00:00 (Sun)
  62774013600, #    local_end 1990-03-25 02:00:00 (Sun)
  3600,
  0,
  'MET',
      ],
      [
  62774010000, #    utc_start 1990-03-25 01:00:00 (Sun)
  62790339600, #      utc_end 1990-09-30 01:00:00 (Sun)
  62774017200, #  local_start 1990-03-25 03:00:00 (Sun)
  62790346800, #    local_end 1990-09-30 03:00:00 (Sun)
  7200,
  1,
  'MEST',
      ],
      [
  62790339600, #    utc_start 1990-09-30 01:00:00 (Sun)
  62806064400, #      utc_end 1991-03-31 01:00:00 (Sun)
  62790343200, #  local_start 1990-09-30 02:00:00 (Sun)
  62806068000, #    local_end 1991-03-31 02:00:00 (Sun)
  3600,
  0,
  'MET',
      ],
      [
  62806064400, #    utc_start 1991-03-31 01:00:00 (Sun)
  62821789200, #      utc_end 1991-09-29 01:00:00 (Sun)
  62806071600, #  local_start 1991-03-31 03:00:00 (Sun)
  62821796400, #    local_end 1991-09-29 03:00:00 (Sun)
  7200,
  1,
  'MEST',
      ],
      [
  62821789200, #    utc_start 1991-09-29 01:00:00 (Sun)
  62837514000, #      utc_end 1992-03-29 01:00:00 (Sun)
  62821792800, #  local_start 1991-09-29 02:00:00 (Sun)
  62837517600, #    local_end 1992-03-29 02:00:00 (Sun)
  3600,
  0,
  'MET',
      ],
      [
  62837514000, #    utc_start 1992-03-29 01:00:00 (Sun)
  62853238800, #      utc_end 1992-09-27 01:00:00 (Sun)
  62837521200, #  local_start 1992-03-29 03:00:00 (Sun)
  62853246000, #    local_end 1992-09-27 03:00:00 (Sun)
  7200,
  1,
  'MEST',
      ],
      [
  62853238800, #    utc_start 1992-09-27 01:00:00 (Sun)
  62868963600, #      utc_end 1993-03-28 01:00:00 (Sun)
  62853242400, #  local_start 1992-09-27 02:00:00 (Sun)
  62868967200, #    local_end 1993-03-28 02:00:00 (Sun)
  3600,
  0,
  'MET',
      ],
      [
  62868963600, #    utc_start 1993-03-28 01:00:00 (Sun)
  62884688400, #      utc_end 1993-09-26 01:00:00 (Sun)
  62868970800, #  local_start 1993-03-28 03:00:00 (Sun)
  62884695600, #    local_end 1993-09-26 03:00:00 (Sun)
  7200,
  1,
  'MEST',
      ],
      [
  62884688400, #    utc_start 1993-09-26 01:00:00 (Sun)
  62900413200, #      utc_end 1994-03-27 01:00:00 (Sun)
  62884692000, #  local_start 1993-09-26 02:00:00 (Sun)
  62900416800, #    local_end 1994-03-27 02:00:00 (Sun)
  3600,
  0,
  'MET',
      ],
      [
  62900413200, #    utc_start 1994-03-27 01:00:00 (Sun)
  62916138000, #      utc_end 1994-09-25 01:00:00 (Sun)
  62900420400, #  local_start 1994-03-27 03:00:00 (Sun)
  62916145200, #    local_end 1994-09-25 03:00:00 (Sun)
  7200,
  1,
  'MEST',
      ],
      [
  62916138000, #    utc_start 1994-09-25 01:00:00 (Sun)
  62931862800, #      utc_end 1995-03-26 01:00:00 (Sun)
  62916141600, #  local_start 1994-09-25 02:00:00 (Sun)
  62931866400, #    local_end 1995-03-26 02:00:00 (Sun)
  3600,
  0,
  'MET',
      ],
      [
  62931862800, #    utc_start 1995-03-26 01:00:00 (Sun)
  62947587600, #      utc_end 1995-09-24 01:00:00 (Sun)
  62931870000, #  local_start 1995-03-26 03:00:00 (Sun)
  62947594800, #    local_end 1995-09-24 03:00:00 (Sun)
  7200,
  1,
  'MEST',
      ],
      [
  62947587600, #    utc_start 1995-09-24 01:00:00 (Sun)
  62963917200, #      utc_end 1996-03-31 01:00:00 (Sun)
  62947591200, #  local_start 1995-09-24 02:00:00 (Sun)
  62963920800, #    local_end 1996-03-31 02:00:00 (Sun)
  3600,
  0,
  'MET',
      ],
      [
  62963917200, #    utc_start 1996-03-31 01:00:00 (Sun)
  62982061200, #      utc_end 1996-10-27 01:00:00 (Sun)
  62963924400, #  local_start 1996-03-31 03:00:00 (Sun)
  62982068400, #    local_end 1996-10-27 03:00:00 (Sun)
  7200,
  1,
  'MEST',
      ],
      [
  62982061200, #    utc_start 1996-10-27 01:00:00 (Sun)
  62995366800, #      utc_end 1997-03-30 01:00:00 (Sun)
  62982064800, #  local_start 1996-10-27 02:00:00 (Sun)
  62995370400, #    local_end 1997-03-30 02:00:00 (Sun)
  3600,
  0,
  'MET',
      ],
      [
  62995366800, #    utc_start 1997-03-30 01:00:00 (Sun)
  63013510800, #      utc_end 1997-10-26 01:00:00 (Sun)
  62995374000, #  local_start 1997-03-30 03:00:00 (Sun)
  63013518000, #    local_end 1997-10-26 03:00:00 (Sun)
  7200,
  1,
  'MEST',
      ],
      [
  63013510800, #    utc_start 1997-10-26 01:00:00 (Sun)
  63026816400, #      utc_end 1998-03-29 01:00:00 (Sun)
  63013514400, #  local_start 1997-10-26 02:00:00 (Sun)
  63026820000, #    local_end 1998-03-29 02:00:00 (Sun)
  3600,
  0,
  'MET',
      ],
      [
  63026816400, #    utc_start 1998-03-29 01:00:00 (Sun)
  63044960400, #      utc_end 1998-10-25 01:00:00 (Sun)
  63026823600, #  local_start 1998-03-29 03:00:00 (Sun)
  63044967600, #    local_end 1998-10-25 03:00:00 (Sun)
  7200,
  1,
  'MEST',
      ],
      [
  63044960400, #    utc_start 1998-10-25 01:00:00 (Sun)
  63058266000, #      utc_end 1999-03-28 01:00:00 (Sun)
  63044964000, #  local_start 1998-10-25 02:00:00 (Sun)
  63058269600, #    local_end 1999-03-28 02:00:00 (Sun)
  3600,
  0,
  'MET',
      ],
      [
  63058266000, #    utc_start 1999-03-28 01:00:00 (Sun)
  63077014800, #      utc_end 1999-10-31 01:00:00 (Sun)
  63058273200, #  local_start 1999-03-28 03:00:00 (Sun)
  63077022000, #    local_end 1999-10-31 03:00:00 (Sun)
  7200,
  1,
  'MEST',
      ],
      [
  63077014800, #    utc_start 1999-10-31 01:00:00 (Sun)
  63089715600, #      utc_end 2000-03-26 01:00:00 (Sun)
  63077018400, #  local_start 1999-10-31 02:00:00 (Sun)
  63089719200, #    local_end 2000-03-26 02:00:00 (Sun)
  3600,
  0,
  'MET',
      ],
      [
  63089715600, #    utc_start 2000-03-26 01:00:00 (Sun)
  63108464400, #      utc_end 2000-10-29 01:00:00 (Sun)
  63089722800, #  local_start 2000-03-26 03:00:00 (Sun)
  63108471600, #    local_end 2000-10-29 03:00:00 (Sun)
  7200,
  1,
  'MEST',
      ],
      [
  63108464400, #    utc_start 2000-10-29 01:00:00 (Sun)
  63121165200, #      utc_end 2001-03-25 01:00:00 (Sun)
  63108468000, #  local_start 2000-10-29 02:00:00 (Sun)
  63121168800, #    local_end 2001-03-25 02:00:00 (Sun)
  3600,
  0,
  'MET',
      ],
      [
  63121165200, #    utc_start 2001-03-25 01:00:00 (Sun)
  63139914000, #      utc_end 2001-10-28 01:00:00 (Sun)
  63121172400, #  local_start 2001-03-25 03:00:00 (Sun)
  63139921200, #    local_end 2001-10-28 03:00:00 (Sun)
  7200,
  1,
  'MEST',
      ],
      [
  63139914000, #    utc_start 2001-10-28 01:00:00 (Sun)
  63153219600, #      utc_end 2002-03-31 01:00:00 (Sun)
  63139917600, #  local_start 2001-10-28 02:00:00 (Sun)
  63153223200, #    local_end 2002-03-31 02:00:00 (Sun)
  3600,
  0,
  'MET',
      ],
      [
  63153219600, #    utc_start 2002-03-31 01:00:00 (Sun)
  63171363600, #      utc_end 2002-10-27 01:00:00 (Sun)
  63153226800, #  local_start 2002-03-31 03:00:00 (Sun)
  63171370800, #    local_end 2002-10-27 03:00:00 (Sun)
  7200,
  1,
  'MEST',
      ],
      [
  63171363600, #    utc_start 2002-10-27 01:00:00 (Sun)
  63184669200, #      utc_end 2003-03-30 01:00:00 (Sun)
  63171367200, #  local_start 2002-10-27 02:00:00 (Sun)
  63184672800, #    local_end 2003-03-30 02:00:00 (Sun)
  3600,
  0,
  'MET',
      ],
      [
  63184669200, #    utc_start 2003-03-30 01:00:00 (Sun)
  63202813200, #      utc_end 2003-10-26 01:00:00 (Sun)
  63184676400, #  local_start 2003-03-30 03:00:00 (Sun)
  63202820400, #    local_end 2003-10-26 03:00:00 (Sun)
  7200,
  1,
  'MEST',
      ],
      [
  63202813200, #    utc_start 2003-10-26 01:00:00 (Sun)
  63216118800, #      utc_end 2004-03-28 01:00:00 (Sun)
  63202816800, #  local_start 2003-10-26 02:00:00 (Sun)
  63216122400, #    local_end 2004-03-28 02:00:00 (Sun)
  3600,
  0,
  'MET',
      ],
      [
  63216118800, #    utc_start 2004-03-28 01:00:00 (Sun)
  63234867600, #      utc_end 2004-10-31 01:00:00 (Sun)
  63216126000, #  local_start 2004-03-28 03:00:00 (Sun)
  63234874800, #    local_end 2004-10-31 03:00:00 (Sun)
  7200,
  1,
  'MEST',
      ],
      [
  63234867600, #    utc_start 2004-10-31 01:00:00 (Sun)
  63247568400, #      utc_end 2005-03-27 01:00:00 (Sun)
  63234871200, #  local_start 2004-10-31 02:00:00 (Sun)
  63247572000, #    local_end 2005-03-27 02:00:00 (Sun)
  3600,
  0,
  'MET',
      ],
      [
  63247568400, #    utc_start 2005-03-27 01:00:00 (Sun)
  63266317200, #      utc_end 2005-10-30 01:00:00 (Sun)
  63247575600, #  local_start 2005-03-27 03:00:00 (Sun)
  63266324400, #    local_end 2005-10-30 03:00:00 (Sun)
  7200,
  1,
  'MEST',
      ],
      [
  63266317200, #    utc_start 2005-10-30 01:00:00 (Sun)
  63279018000, #      utc_end 2006-03-26 01:00:00 (Sun)
  63266320800, #  local_start 2005-10-30 02:00:00 (Sun)
  63279021600, #    local_end 2006-03-26 02:00:00 (Sun)
  3600,
  0,
  'MET',
      ],
      [
  63279018000, #    utc_start 2006-03-26 01:00:00 (Sun)
  63297766800, #      utc_end 2006-10-29 01:00:00 (Sun)
  63279025200, #  local_start 2006-03-26 03:00:00 (Sun)
  63297774000, #    local_end 2006-10-29 03:00:00 (Sun)
  7200,
  1,
  'MEST',
      ],
      [
  63297766800, #    utc_start 2006-10-29 01:00:00 (Sun)
  63310467600, #      utc_end 2007-03-25 01:00:00 (Sun)
  63297770400, #  local_start 2006-10-29 02:00:00 (Sun)
  63310471200, #    local_end 2007-03-25 02:00:00 (Sun)
  3600,
  0,
  'MET',
      ],
      [
  63310467600, #    utc_start 2007-03-25 01:00:00 (Sun)
  63329216400, #      utc_end 2007-10-28 01:00:00 (Sun)
  63310474800, #  local_start 2007-03-25 03:00:00 (Sun)
  63329223600, #    local_end 2007-10-28 03:00:00 (Sun)
  7200,
  1,
  'MEST',
      ],
      [
  63329216400, #    utc_start 2007-10-28 01:00:00 (Sun)
  63342522000, #      utc_end 2008-03-30 01:00:00 (Sun)
  63329220000, #  local_start 2007-10-28 02:00:00 (Sun)
  63342525600, #    local_end 2008-03-30 02:00:00 (Sun)
  3600,
  0,
  'MET',
      ],
      [
  63342522000, #    utc_start 2008-03-30 01:00:00 (Sun)
  63360666000, #      utc_end 2008-10-26 01:00:00 (Sun)
  63342529200, #  local_start 2008-03-30 03:00:00 (Sun)
  63360673200, #    local_end 2008-10-26 03:00:00 (Sun)
  7200,
  1,
  'MEST',
      ],
      [
  63360666000, #    utc_start 2008-10-26 01:00:00 (Sun)
  63373971600, #      utc_end 2009-03-29 01:00:00 (Sun)
  63360669600, #  local_start 2008-10-26 02:00:00 (Sun)
  63373975200, #    local_end 2009-03-29 02:00:00 (Sun)
  3600,
  0,
  'MET',
      ],
      [
  63373971600, #    utc_start 2009-03-29 01:00:00 (Sun)
  63392115600, #      utc_end 2009-10-25 01:00:00 (Sun)
  63373978800, #  local_start 2009-03-29 03:00:00 (Sun)
  63392122800, #    local_end 2009-10-25 03:00:00 (Sun)
  7200,
  1,
  'MEST',
      ],
      [
  63392115600, #    utc_start 2009-10-25 01:00:00 (Sun)
  63405421200, #      utc_end 2010-03-28 01:00:00 (Sun)
  63392119200, #  local_start 2009-10-25 02:00:00 (Sun)
  63405424800, #    local_end 2010-03-28 02:00:00 (Sun)
  3600,
  0,
  'MET',
      ],
      [
  63405421200, #    utc_start 2010-03-28 01:00:00 (Sun)
  63424170000, #      utc_end 2010-10-31 01:00:00 (Sun)
  63405428400, #  local_start 2010-03-28 03:00:00 (Sun)
  63424177200, #    local_end 2010-10-31 03:00:00 (Sun)
  7200,
  1,
  'MEST',
      ],
      [
  63424170000, #    utc_start 2010-10-31 01:00:00 (Sun)
  63436870800, #      utc_end 2011-03-27 01:00:00 (Sun)
  63424173600, #  local_start 2010-10-31 02:00:00 (Sun)
  63436874400, #    local_end 2011-03-27 02:00:00 (Sun)
  3600,
  0,
  'MET',
      ],
      [
  63436870800, #    utc_start 2011-03-27 01:00:00 (Sun)
  63455619600, #      utc_end 2011-10-30 01:00:00 (Sun)
  63436878000, #  local_start 2011-03-27 03:00:00 (Sun)
  63455626800, #    local_end 2011-10-30 03:00:00 (Sun)
  7200,
  1,
  'MEST',
      ],
      [
  63455619600, #    utc_start 2011-10-30 01:00:00 (Sun)
  63468320400, #      utc_end 2012-03-25 01:00:00 (Sun)
  63455623200, #  local_start 2011-10-30 02:00:00 (Sun)
  63468324000, #    local_end 2012-03-25 02:00:00 (Sun)
  3600,
  0,
  'MET',
      ],
      [
  63468320400, #    utc_start 2012-03-25 01:00:00 (Sun)
  63487069200, #      utc_end 2012-10-28 01:00:00 (Sun)
  63468327600, #  local_start 2012-03-25 03:00:00 (Sun)
  63487076400, #    local_end 2012-10-28 03:00:00 (Sun)
  7200,
  1,
  'MEST',
      ],
      [
  63487069200, #    utc_start 2012-10-28 01:00:00 (Sun)
  63500374800, #      utc_end 2013-03-31 01:00:00 (Sun)
  63487072800, #  local_start 2012-10-28 02:00:00 (Sun)
  63500378400, #    local_end 2013-03-31 02:00:00 (Sun)
  3600,
  0,
  'MET',
      ],
      [
  63500374800, #    utc_start 2013-03-31 01:00:00 (Sun)
  63518518800, #      utc_end 2013-10-27 01:00:00 (Sun)
  63500382000, #  local_start 2013-03-31 03:00:00 (Sun)
  63518526000, #    local_end 2013-10-27 03:00:00 (Sun)
  7200,
  1,
  'MEST',
      ],
      [
  63518518800, #    utc_start 2013-10-27 01:00:00 (Sun)
  63531824400, #      utc_end 2014-03-30 01:00:00 (Sun)
  63518522400, #  local_start 2013-10-27 02:00:00 (Sun)
  63531828000, #    local_end 2014-03-30 02:00:00 (Sun)
  3600,
  0,
  'MET',
      ],
      [
  63531824400, #    utc_start 2014-03-30 01:00:00 (Sun)
  63549968400, #      utc_end 2014-10-26 01:00:00 (Sun)
  63531831600, #  local_start 2014-03-30 03:00:00 (Sun)
  63549975600, #    local_end 2014-10-26 03:00:00 (Sun)
  7200,
  1,
  'MEST',
      ],
      [
  63549968400, #    utc_start 2014-10-26 01:00:00 (Sun)
  63563274000, #      utc_end 2015-03-29 01:00:00 (Sun)
  63549972000, #  local_start 2014-10-26 02:00:00 (Sun)
  63563277600, #    local_end 2015-03-29 02:00:00 (Sun)
  3600,
  0,
  'MET',
      ],
      [
  63563274000, #    utc_start 2015-03-29 01:00:00 (Sun)
  63581418000, #      utc_end 2015-10-25 01:00:00 (Sun)
  63563281200, #  local_start 2015-03-29 03:00:00 (Sun)
  63581425200, #    local_end 2015-10-25 03:00:00 (Sun)
  7200,
  1,
  'MEST',
      ],
      [
  63581418000, #    utc_start 2015-10-25 01:00:00 (Sun)
  63594723600, #      utc_end 2016-03-27 01:00:00 (Sun)
  63581421600, #  local_start 2015-10-25 02:00:00 (Sun)
  63594727200, #    local_end 2016-03-27 02:00:00 (Sun)
  3600,
  0,
  'MET',
      ],
      [
  63594723600, #    utc_start 2016-03-27 01:00:00 (Sun)
  63613472400, #      utc_end 2016-10-30 01:00:00 (Sun)
  63594730800, #  local_start 2016-03-27 03:00:00 (Sun)
  63613479600, #    local_end 2016-10-30 03:00:00 (Sun)
  7200,
  1,
  'MEST',
      ],
      [
  63613472400, #    utc_start 2016-10-30 01:00:00 (Sun)
  63626173200, #      utc_end 2017-03-26 01:00:00 (Sun)
  63613476000, #  local_start 2016-10-30 02:00:00 (Sun)
  63626176800, #    local_end 2017-03-26 02:00:00 (Sun)
  3600,
  0,
  'MET',
      ],
      [
  63626173200, #    utc_start 2017-03-26 01:00:00 (Sun)
  63644922000, #      utc_end 2017-10-29 01:00:00 (Sun)
  63626180400, #  local_start 2017-03-26 03:00:00 (Sun)
  63644929200, #    local_end 2017-10-29 03:00:00 (Sun)
  7200,
  1,
  'MEST',
      ],
      [
  63644922000, #    utc_start 2017-10-29 01:00:00 (Sun)
  63657622800, #      utc_end 2018-03-25 01:00:00 (Sun)
  63644925600, #  local_start 2017-10-29 02:00:00 (Sun)
  63657626400, #    local_end 2018-03-25 02:00:00 (Sun)
  3600,
  0,
  'MET',
      ],
      [
  63657622800, #    utc_start 2018-03-25 01:00:00 (Sun)
  63676371600, #      utc_end 2018-10-28 01:00:00 (Sun)
  63657630000, #  local_start 2018-03-25 03:00:00 (Sun)
  63676378800, #    local_end 2018-10-28 03:00:00 (Sun)
  7200,
  1,
  'MEST',
      ],
      [
  63676371600, #    utc_start 2018-10-28 01:00:00 (Sun)
  63689677200, #      utc_end 2019-03-31 01:00:00 (Sun)
  63676375200, #  local_start 2018-10-28 02:00:00 (Sun)
  63689680800, #    local_end 2019-03-31 02:00:00 (Sun)
  3600,
  0,
  'MET',
      ],
      [
  63689677200, #    utc_start 2019-03-31 01:00:00 (Sun)
  63707821200, #      utc_end 2019-10-27 01:00:00 (Sun)
  63689684400, #  local_start 2019-03-31 03:00:00 (Sun)
  63707828400, #    local_end 2019-10-27 03:00:00 (Sun)
  7200,
  1,
  'MEST',
      ],
      [
  63707821200, #    utc_start 2019-10-27 01:00:00 (Sun)
  63721126800, #      utc_end 2020-03-29 01:00:00 (Sun)
  63707824800, #  local_start 2019-10-27 02:00:00 (Sun)
  63721130400, #    local_end 2020-03-29 02:00:00 (Sun)
  3600,
  0,
  'MET',
      ],
      [
  63721126800, #    utc_start 2020-03-29 01:00:00 (Sun)
  63739270800, #      utc_end 2020-10-25 01:00:00 (Sun)
  63721134000, #  local_start 2020-03-29 03:00:00 (Sun)
  63739278000, #    local_end 2020-10-25 03:00:00 (Sun)
  7200,
  1,
  'MEST',
      ],
      [
  63739270800, #    utc_start 2020-10-25 01:00:00 (Sun)
  63752576400, #      utc_end 2021-03-28 01:00:00 (Sun)
  63739274400, #  local_start 2020-10-25 02:00:00 (Sun)
  63752580000, #    local_end 2021-03-28 02:00:00 (Sun)
  3600,
  0,
  'MET',
      ],
      [
  63752576400, #    utc_start 2021-03-28 01:00:00 (Sun)
  63771325200, #      utc_end 2021-10-31 01:00:00 (Sun)
  63752583600, #  local_start 2021-03-28 03:00:00 (Sun)
  63771332400, #    local_end 2021-10-31 03:00:00 (Sun)
  7200,
  1,
  'MEST',
      ],
      [
  63771325200, #    utc_start 2021-10-31 01:00:00 (Sun)
  63784026000, #      utc_end 2022-03-27 01:00:00 (Sun)
  63771328800, #  local_start 2021-10-31 02:00:00 (Sun)
  63784029600, #    local_end 2022-03-27 02:00:00 (Sun)
  3600,
  0,
  'MET',
      ],
      [
  63784026000, #    utc_start 2022-03-27 01:00:00 (Sun)
  63802774800, #      utc_end 2022-10-30 01:00:00 (Sun)
  63784033200, #  local_start 2022-03-27 03:00:00 (Sun)
  63802782000, #    local_end 2022-10-30 03:00:00 (Sun)
  7200,
  1,
  'MEST',
      ],
      [
  63802774800, #    utc_start 2022-10-30 01:00:00 (Sun)
  63815475600, #      utc_end 2023-03-26 01:00:00 (Sun)
  63802778400, #  local_start 2022-10-30 02:00:00 (Sun)
  63815479200, #    local_end 2023-03-26 02:00:00 (Sun)
  3600,
  0,
  'MET',
      ],
      [
  63815475600, #    utc_start 2023-03-26 01:00:00 (Sun)
  63834224400, #      utc_end 2023-10-29 01:00:00 (Sun)
  63815482800, #  local_start 2023-03-26 03:00:00 (Sun)
  63834231600, #    local_end 2023-10-29 03:00:00 (Sun)
  7200,
  1,
  'MEST',
      ],
      [
  63834224400, #    utc_start 2023-10-29 01:00:00 (Sun)
  63847530000, #      utc_end 2024-03-31 01:00:00 (Sun)
  63834228000, #  local_start 2023-10-29 02:00:00 (Sun)
  63847533600, #    local_end 2024-03-31 02:00:00 (Sun)
  3600,
  0,
  'MET',
      ],
      [
  63847530000, #    utc_start 2024-03-31 01:00:00 (Sun)
  63865674000, #      utc_end 2024-10-27 01:00:00 (Sun)
  63847537200, #  local_start 2024-03-31 03:00:00 (Sun)
  63865681200, #    local_end 2024-10-27 03:00:00 (Sun)
  7200,
  1,
  'MEST',
      ],
      [
  63865674000, #    utc_start 2024-10-27 01:00:00 (Sun)
  63878979600, #      utc_end 2025-03-30 01:00:00 (Sun)
  63865677600, #  local_start 2024-10-27 02:00:00 (Sun)
  63878983200, #    local_end 2025-03-30 02:00:00 (Sun)
  3600,
  0,
  'MET',
      ],
      [
  63878979600, #    utc_start 2025-03-30 01:00:00 (Sun)
  63897123600, #      utc_end 2025-10-26 01:00:00 (Sun)
  63878986800, #  local_start 2025-03-30 03:00:00 (Sun)
  63897130800, #    local_end 2025-10-26 03:00:00 (Sun)
  7200,
  1,
  'MEST',
      ],
      [
  63897123600, #    utc_start 2025-10-26 01:00:00 (Sun)
  63910429200, #      utc_end 2026-03-29 01:00:00 (Sun)
  63897127200, #  local_start 2025-10-26 02:00:00 (Sun)
  63910432800, #    local_end 2026-03-29 02:00:00 (Sun)
  3600,
  0,
  'MET',
      ],
      [
  63910429200, #    utc_start 2026-03-29 01:00:00 (Sun)
  63928573200, #      utc_end 2026-10-25 01:00:00 (Sun)
  63910436400, #  local_start 2026-03-29 03:00:00 (Sun)
  63928580400, #    local_end 2026-10-25 03:00:00 (Sun)
  7200,
  1,
  'MEST',
      ],
      [
  63928573200, #    utc_start 2026-10-25 01:00:00 (Sun)
  63941878800, #      utc_end 2027-03-28 01:00:00 (Sun)
  63928576800, #  local_start 2026-10-25 02:00:00 (Sun)
  63941882400, #    local_end 2027-03-28 02:00:00 (Sun)
  3600,
  0,
  'MET',
      ],
      [
  63941878800, #    utc_start 2027-03-28 01:00:00 (Sun)
  63960627600, #      utc_end 2027-10-31 01:00:00 (Sun)
  63941886000, #  local_start 2027-03-28 03:00:00 (Sun)
  63960634800, #    local_end 2027-10-31 03:00:00 (Sun)
  7200,
  1,
  'MEST',
      ],
      [
  63960627600, #    utc_start 2027-10-31 01:00:00 (Sun)
  63973328400, #      utc_end 2028-03-26 01:00:00 (Sun)
  63960631200, #  local_start 2027-10-31 02:00:00 (Sun)
  63973332000, #    local_end 2028-03-26 02:00:00 (Sun)
  3600,
  0,
  'MET',
      ],
      [
  63973328400, #    utc_start 2028-03-26 01:00:00 (Sun)
  63992077200, #      utc_end 2028-10-29 01:00:00 (Sun)
  63973335600, #  local_start 2028-03-26 03:00:00 (Sun)
  63992084400, #    local_end 2028-10-29 03:00:00 (Sun)
  7200,
  1,
  'MEST',
      ],
      [
  63992077200, #    utc_start 2028-10-29 01:00:00 (Sun)
  64004778000, #      utc_end 2029-03-25 01:00:00 (Sun)
  63992080800, #  local_start 2028-10-29 02:00:00 (Sun)
  64004781600, #    local_end 2029-03-25 02:00:00 (Sun)
  3600,
  0,
  'MET',
      ],
      [
  64004778000, #    utc_start 2029-03-25 01:00:00 (Sun)
  64023526800, #      utc_end 2029-10-28 01:00:00 (Sun)
  64004785200, #  local_start 2029-03-25 03:00:00 (Sun)
  64023534000, #    local_end 2029-10-28 03:00:00 (Sun)
  7200,
  1,
  'MEST',
      ],
      [
  64023526800, #    utc_start 2029-10-28 01:00:00 (Sun)
  64036832400, #      utc_end 2030-03-31 01:00:00 (Sun)
  64023530400, #  local_start 2029-10-28 02:00:00 (Sun)
  64036836000, #    local_end 2030-03-31 02:00:00 (Sun)
  3600,
  0,
  'MET',
      ],
      [
  64036832400, #    utc_start 2030-03-31 01:00:00 (Sun)
  64054976400, #      utc_end 2030-10-27 01:00:00 (Sun)
  64036839600, #  local_start 2030-03-31 03:00:00 (Sun)
  64054983600, #    local_end 2030-10-27 03:00:00 (Sun)
  7200,
  1,
  'MEST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {61}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { 3600 }
  
  my $last_observance = bless( {
    'format' => 'ME%sT',
    'gmtoff' => '1:00',
    'local_start_datetime' => {},
    'offset_from_std' => 0,
    'offset_from_utc' => 3600,
    'until' => [],
    'utc_start_datetime' => {}
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00s',
      'from' => '1996',
      'in' => 'Oct',
      'letter' => '',
      'name' => 'C-Eur',
      'offset_from_std' => 0,
      'on' => 'lastSun',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00s',
      'from' => '1981',
      'in' => 'Mar',
      'letter' => 'S',
      'name' => 'C-Eur',
      'offset_from_std' => 3600,
      'on' => 'lastSun',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_MET

    $main::fatpacked{"DateTime/TimeZone/MST.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_MST';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::MST;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::MST::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  DateTime::TimeZone::INFINITY, #      utc_end
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  DateTime::TimeZone::INFINITY, #    local_end
  -25200,
  0,
  'MST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_MST

    $main::fatpacked{"DateTime/TimeZone/MST7MDT.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_MST7MDT';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::MST7MDT;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::MST7MDT::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60502410000, #      utc_end 1918-03-31 09:00:00 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60502384800, #    local_end 1918-03-31 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  60502410000, #    utc_start 1918-03-31 09:00:00 (Sun)
  60520550400, #      utc_end 1918-10-27 08:00:00 (Sun)
  60502388400, #  local_start 1918-03-31 03:00:00 (Sun)
  60520528800, #    local_end 1918-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  60520550400, #    utc_start 1918-10-27 08:00:00 (Sun)
  60533859600, #      utc_end 1919-03-30 09:00:00 (Sun)
  60520525200, #  local_start 1918-10-27 01:00:00 (Sun)
  60533834400, #    local_end 1919-03-30 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  60533859600, #    utc_start 1919-03-30 09:00:00 (Sun)
  60552000000, #      utc_end 1919-10-26 08:00:00 (Sun)
  60533838000, #  local_start 1919-03-30 03:00:00 (Sun)
  60551978400, #    local_end 1919-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  60552000000, #    utc_start 1919-10-26 08:00:00 (Sun)
  61255472400, #      utc_end 1942-02-09 09:00:00 (Mon)
  60551974800, #  local_start 1919-10-26 01:00:00 (Sun)
  61255447200, #    local_end 1942-02-09 02:00:00 (Mon)
  -25200,
  0,
  'MST',
      ],
      [
  61255472400, #    utc_start 1942-02-09 09:00:00 (Mon)
  61366287600, #      utc_end 1945-08-14 23:00:00 (Tue)
  61255450800, #  local_start 1942-02-09 03:00:00 (Mon)
  61366266000, #    local_end 1945-08-14 17:00:00 (Tue)
  -21600,
  1,
  'MWT',
      ],
      [
  61366287600, #    utc_start 1945-08-14 23:00:00 (Tue)
  61370294400, #      utc_end 1945-09-30 08:00:00 (Sun)
  61366266000, #  local_start 1945-08-14 17:00:00 (Tue)
  61370272800, #    local_end 1945-09-30 02:00:00 (Sun)
  -21600,
  1,
  'MPT',
      ],
      [
  61370294400, #    utc_start 1945-09-30 08:00:00 (Sun)
  62051302800, #      utc_end 1967-04-30 09:00:00 (Sun)
  61370269200, #  local_start 1945-09-30 01:00:00 (Sun)
  62051277600, #    local_end 1967-04-30 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62051302800, #    utc_start 1967-04-30 09:00:00 (Sun)
  62067024000, #      utc_end 1967-10-29 08:00:00 (Sun)
  62051281200, #  local_start 1967-04-30 03:00:00 (Sun)
  62067002400, #    local_end 1967-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62067024000, #    utc_start 1967-10-29 08:00:00 (Sun)
  62082752400, #      utc_end 1968-04-28 09:00:00 (Sun)
  62066998800, #  local_start 1967-10-29 01:00:00 (Sun)
  62082727200, #    local_end 1968-04-28 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62082752400, #    utc_start 1968-04-28 09:00:00 (Sun)
  62098473600, #      utc_end 1968-10-27 08:00:00 (Sun)
  62082730800, #  local_start 1968-04-28 03:00:00 (Sun)
  62098452000, #    local_end 1968-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62098473600, #    utc_start 1968-10-27 08:00:00 (Sun)
  62114202000, #      utc_end 1969-04-27 09:00:00 (Sun)
  62098448400, #  local_start 1968-10-27 01:00:00 (Sun)
  62114176800, #    local_end 1969-04-27 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62114202000, #    utc_start 1969-04-27 09:00:00 (Sun)
  62129923200, #      utc_end 1969-10-26 08:00:00 (Sun)
  62114180400, #  local_start 1969-04-27 03:00:00 (Sun)
  62129901600, #    local_end 1969-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62129923200, #    utc_start 1969-10-26 08:00:00 (Sun)
  62145651600, #      utc_end 1970-04-26 09:00:00 (Sun)
  62129898000, #  local_start 1969-10-26 01:00:00 (Sun)
  62145626400, #    local_end 1970-04-26 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62145651600, #    utc_start 1970-04-26 09:00:00 (Sun)
  62161372800, #      utc_end 1970-10-25 08:00:00 (Sun)
  62145630000, #  local_start 1970-04-26 03:00:00 (Sun)
  62161351200, #    local_end 1970-10-25 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62161372800, #    utc_start 1970-10-25 08:00:00 (Sun)
  62177101200, #      utc_end 1971-04-25 09:00:00 (Sun)
  62161347600, #  local_start 1970-10-25 01:00:00 (Sun)
  62177076000, #    local_end 1971-04-25 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62177101200, #    utc_start 1971-04-25 09:00:00 (Sun)
  62193427200, #      utc_end 1971-10-31 08:00:00 (Sun)
  62177079600, #  local_start 1971-04-25 03:00:00 (Sun)
  62193405600, #    local_end 1971-10-31 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62193427200, #    utc_start 1971-10-31 08:00:00 (Sun)
  62209155600, #      utc_end 1972-04-30 09:00:00 (Sun)
  62193402000, #  local_start 1971-10-31 01:00:00 (Sun)
  62209130400, #    local_end 1972-04-30 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62209155600, #    utc_start 1972-04-30 09:00:00 (Sun)
  62224876800, #      utc_end 1972-10-29 08:00:00 (Sun)
  62209134000, #  local_start 1972-04-30 03:00:00 (Sun)
  62224855200, #    local_end 1972-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62224876800, #    utc_start 1972-10-29 08:00:00 (Sun)
  62240605200, #      utc_end 1973-04-29 09:00:00 (Sun)
  62224851600, #  local_start 1972-10-29 01:00:00 (Sun)
  62240580000, #    local_end 1973-04-29 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62240605200, #    utc_start 1973-04-29 09:00:00 (Sun)
  62256326400, #      utc_end 1973-10-28 08:00:00 (Sun)
  62240583600, #  local_start 1973-04-29 03:00:00 (Sun)
  62256304800, #    local_end 1973-10-28 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62256326400, #    utc_start 1973-10-28 08:00:00 (Sun)
  62262378000, #      utc_end 1974-01-06 09:00:00 (Sun)
  62256301200, #  local_start 1973-10-28 01:00:00 (Sun)
  62262352800, #    local_end 1974-01-06 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62262378000, #    utc_start 1974-01-06 09:00:00 (Sun)
  62287776000, #      utc_end 1974-10-27 08:00:00 (Sun)
  62262356400, #  local_start 1974-01-06 03:00:00 (Sun)
  62287754400, #    local_end 1974-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62287776000, #    utc_start 1974-10-27 08:00:00 (Sun)
  62298061200, #      utc_end 1975-02-23 09:00:00 (Sun)
  62287750800, #  local_start 1974-10-27 01:00:00 (Sun)
  62298036000, #    local_end 1975-02-23 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62298061200, #    utc_start 1975-02-23 09:00:00 (Sun)
  62319225600, #      utc_end 1975-10-26 08:00:00 (Sun)
  62298039600, #  local_start 1975-02-23 03:00:00 (Sun)
  62319204000, #    local_end 1975-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62319225600, #    utc_start 1975-10-26 08:00:00 (Sun)
  62334954000, #      utc_end 1976-04-25 09:00:00 (Sun)
  62319200400, #  local_start 1975-10-26 01:00:00 (Sun)
  62334928800, #    local_end 1976-04-25 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62334954000, #    utc_start 1976-04-25 09:00:00 (Sun)
  62351280000, #      utc_end 1976-10-31 08:00:00 (Sun)
  62334932400, #  local_start 1976-04-25 03:00:00 (Sun)
  62351258400, #    local_end 1976-10-31 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62351280000, #    utc_start 1976-10-31 08:00:00 (Sun)
  62366403600, #      utc_end 1977-04-24 09:00:00 (Sun)
  62351254800, #  local_start 1976-10-31 01:00:00 (Sun)
  62366378400, #    local_end 1977-04-24 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62366403600, #    utc_start 1977-04-24 09:00:00 (Sun)
  62382729600, #      utc_end 1977-10-30 08:00:00 (Sun)
  62366382000, #  local_start 1977-04-24 03:00:00 (Sun)
  62382708000, #    local_end 1977-10-30 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62382729600, #    utc_start 1977-10-30 08:00:00 (Sun)
  62398458000, #      utc_end 1978-04-30 09:00:00 (Sun)
  62382704400, #  local_start 1977-10-30 01:00:00 (Sun)
  62398432800, #    local_end 1978-04-30 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62398458000, #    utc_start 1978-04-30 09:00:00 (Sun)
  62414179200, #      utc_end 1978-10-29 08:00:00 (Sun)
  62398436400, #  local_start 1978-04-30 03:00:00 (Sun)
  62414157600, #    local_end 1978-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62414179200, #    utc_start 1978-10-29 08:00:00 (Sun)
  62429907600, #      utc_end 1979-04-29 09:00:00 (Sun)
  62414154000, #  local_start 1978-10-29 01:00:00 (Sun)
  62429882400, #    local_end 1979-04-29 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62429907600, #    utc_start 1979-04-29 09:00:00 (Sun)
  62445628800, #      utc_end 1979-10-28 08:00:00 (Sun)
  62429886000, #  local_start 1979-04-29 03:00:00 (Sun)
  62445607200, #    local_end 1979-10-28 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62445628800, #    utc_start 1979-10-28 08:00:00 (Sun)
  62461357200, #      utc_end 1980-04-27 09:00:00 (Sun)
  62445603600, #  local_start 1979-10-28 01:00:00 (Sun)
  62461332000, #    local_end 1980-04-27 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62461357200, #    utc_start 1980-04-27 09:00:00 (Sun)
  62477078400, #      utc_end 1980-10-26 08:00:00 (Sun)
  62461335600, #  local_start 1980-04-27 03:00:00 (Sun)
  62477056800, #    local_end 1980-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62477078400, #    utc_start 1980-10-26 08:00:00 (Sun)
  62492806800, #      utc_end 1981-04-26 09:00:00 (Sun)
  62477053200, #  local_start 1980-10-26 01:00:00 (Sun)
  62492781600, #    local_end 1981-04-26 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62492806800, #    utc_start 1981-04-26 09:00:00 (Sun)
  62508528000, #      utc_end 1981-10-25 08:00:00 (Sun)
  62492785200, #  local_start 1981-04-26 03:00:00 (Sun)
  62508506400, #    local_end 1981-10-25 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62508528000, #    utc_start 1981-10-25 08:00:00 (Sun)
  62524256400, #      utc_end 1982-04-25 09:00:00 (Sun)
  62508502800, #  local_start 1981-10-25 01:00:00 (Sun)
  62524231200, #    local_end 1982-04-25 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62524256400, #    utc_start 1982-04-25 09:00:00 (Sun)
  62540582400, #      utc_end 1982-10-31 08:00:00 (Sun)
  62524234800, #  local_start 1982-04-25 03:00:00 (Sun)
  62540560800, #    local_end 1982-10-31 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62540582400, #    utc_start 1982-10-31 08:00:00 (Sun)
  62555706000, #      utc_end 1983-04-24 09:00:00 (Sun)
  62540557200, #  local_start 1982-10-31 01:00:00 (Sun)
  62555680800, #    local_end 1983-04-24 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62555706000, #    utc_start 1983-04-24 09:00:00 (Sun)
  62572032000, #      utc_end 1983-10-30 08:00:00 (Sun)
  62555684400, #  local_start 1983-04-24 03:00:00 (Sun)
  62572010400, #    local_end 1983-10-30 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62572032000, #    utc_start 1983-10-30 08:00:00 (Sun)
  62587760400, #      utc_end 1984-04-29 09:00:00 (Sun)
  62572006800, #  local_start 1983-10-30 01:00:00 (Sun)
  62587735200, #    local_end 1984-04-29 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62587760400, #    utc_start 1984-04-29 09:00:00 (Sun)
  62603481600, #      utc_end 1984-10-28 08:00:00 (Sun)
  62587738800, #  local_start 1984-04-29 03:00:00 (Sun)
  62603460000, #    local_end 1984-10-28 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62603481600, #    utc_start 1984-10-28 08:00:00 (Sun)
  62619210000, #      utc_end 1985-04-28 09:00:00 (Sun)
  62603456400, #  local_start 1984-10-28 01:00:00 (Sun)
  62619184800, #    local_end 1985-04-28 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62619210000, #    utc_start 1985-04-28 09:00:00 (Sun)
  62634931200, #      utc_end 1985-10-27 08:00:00 (Sun)
  62619188400, #  local_start 1985-04-28 03:00:00 (Sun)
  62634909600, #    local_end 1985-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62634931200, #    utc_start 1985-10-27 08:00:00 (Sun)
  62650659600, #      utc_end 1986-04-27 09:00:00 (Sun)
  62634906000, #  local_start 1985-10-27 01:00:00 (Sun)
  62650634400, #    local_end 1986-04-27 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62650659600, #    utc_start 1986-04-27 09:00:00 (Sun)
  62666380800, #      utc_end 1986-10-26 08:00:00 (Sun)
  62650638000, #  local_start 1986-04-27 03:00:00 (Sun)
  62666359200, #    local_end 1986-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62666380800, #    utc_start 1986-10-26 08:00:00 (Sun)
  62680294800, #      utc_end 1987-04-05 09:00:00 (Sun)
  62666355600, #  local_start 1986-10-26 01:00:00 (Sun)
  62680269600, #    local_end 1987-04-05 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62680294800, #    utc_start 1987-04-05 09:00:00 (Sun)
  62697830400, #      utc_end 1987-10-25 08:00:00 (Sun)
  62680273200, #  local_start 1987-04-05 03:00:00 (Sun)
  62697808800, #    local_end 1987-10-25 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62697830400, #    utc_start 1987-10-25 08:00:00 (Sun)
  62711744400, #      utc_end 1988-04-03 09:00:00 (Sun)
  62697805200, #  local_start 1987-10-25 01:00:00 (Sun)
  62711719200, #    local_end 1988-04-03 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62711744400, #    utc_start 1988-04-03 09:00:00 (Sun)
  62729884800, #      utc_end 1988-10-30 08:00:00 (Sun)
  62711722800, #  local_start 1988-04-03 03:00:00 (Sun)
  62729863200, #    local_end 1988-10-30 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62729884800, #    utc_start 1988-10-30 08:00:00 (Sun)
  62743194000, #      utc_end 1989-04-02 09:00:00 (Sun)
  62729859600, #  local_start 1988-10-30 01:00:00 (Sun)
  62743168800, #    local_end 1989-04-02 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62743194000, #    utc_start 1989-04-02 09:00:00 (Sun)
  62761334400, #      utc_end 1989-10-29 08:00:00 (Sun)
  62743172400, #  local_start 1989-04-02 03:00:00 (Sun)
  62761312800, #    local_end 1989-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62761334400, #    utc_start 1989-10-29 08:00:00 (Sun)
  62774643600, #      utc_end 1990-04-01 09:00:00 (Sun)
  62761309200, #  local_start 1989-10-29 01:00:00 (Sun)
  62774618400, #    local_end 1990-04-01 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62774643600, #    utc_start 1990-04-01 09:00:00 (Sun)
  62792784000, #      utc_end 1990-10-28 08:00:00 (Sun)
  62774622000, #  local_start 1990-04-01 03:00:00 (Sun)
  62792762400, #    local_end 1990-10-28 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62792784000, #    utc_start 1990-10-28 08:00:00 (Sun)
  62806698000, #      utc_end 1991-04-07 09:00:00 (Sun)
  62792758800, #  local_start 1990-10-28 01:00:00 (Sun)
  62806672800, #    local_end 1991-04-07 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62806698000, #    utc_start 1991-04-07 09:00:00 (Sun)
  62824233600, #      utc_end 1991-10-27 08:00:00 (Sun)
  62806676400, #  local_start 1991-04-07 03:00:00 (Sun)
  62824212000, #    local_end 1991-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62824233600, #    utc_start 1991-10-27 08:00:00 (Sun)
  62838147600, #      utc_end 1992-04-05 09:00:00 (Sun)
  62824208400, #  local_start 1991-10-27 01:00:00 (Sun)
  62838122400, #    local_end 1992-04-05 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62838147600, #    utc_start 1992-04-05 09:00:00 (Sun)
  62855683200, #      utc_end 1992-10-25 08:00:00 (Sun)
  62838126000, #  local_start 1992-04-05 03:00:00 (Sun)
  62855661600, #    local_end 1992-10-25 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62855683200, #    utc_start 1992-10-25 08:00:00 (Sun)
  62869597200, #      utc_end 1993-04-04 09:00:00 (Sun)
  62855658000, #  local_start 1992-10-25 01:00:00 (Sun)
  62869572000, #    local_end 1993-04-04 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62869597200, #    utc_start 1993-04-04 09:00:00 (Sun)
  62887737600, #      utc_end 1993-10-31 08:00:00 (Sun)
  62869575600, #  local_start 1993-04-04 03:00:00 (Sun)
  62887716000, #    local_end 1993-10-31 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62887737600, #    utc_start 1993-10-31 08:00:00 (Sun)
  62901046800, #      utc_end 1994-04-03 09:00:00 (Sun)
  62887712400, #  local_start 1993-10-31 01:00:00 (Sun)
  62901021600, #    local_end 1994-04-03 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62901046800, #    utc_start 1994-04-03 09:00:00 (Sun)
  62919187200, #      utc_end 1994-10-30 08:00:00 (Sun)
  62901025200, #  local_start 1994-04-03 03:00:00 (Sun)
  62919165600, #    local_end 1994-10-30 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62919187200, #    utc_start 1994-10-30 08:00:00 (Sun)
  62932496400, #      utc_end 1995-04-02 09:00:00 (Sun)
  62919162000, #  local_start 1994-10-30 01:00:00 (Sun)
  62932471200, #    local_end 1995-04-02 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62932496400, #    utc_start 1995-04-02 09:00:00 (Sun)
  62950636800, #      utc_end 1995-10-29 08:00:00 (Sun)
  62932474800, #  local_start 1995-04-02 03:00:00 (Sun)
  62950615200, #    local_end 1995-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62950636800, #    utc_start 1995-10-29 08:00:00 (Sun)
  62964550800, #      utc_end 1996-04-07 09:00:00 (Sun)
  62950611600, #  local_start 1995-10-29 01:00:00 (Sun)
  62964525600, #    local_end 1996-04-07 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62964550800, #    utc_start 1996-04-07 09:00:00 (Sun)
  62982086400, #      utc_end 1996-10-27 08:00:00 (Sun)
  62964529200, #  local_start 1996-04-07 03:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  62982086400, #    utc_start 1996-10-27 08:00:00 (Sun)
  62996000400, #      utc_end 1997-04-06 09:00:00 (Sun)
  62982061200, #  local_start 1996-10-27 01:00:00 (Sun)
  62995975200, #    local_end 1997-04-06 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  62996000400, #    utc_start 1997-04-06 09:00:00 (Sun)
  63013536000, #      utc_end 1997-10-26 08:00:00 (Sun)
  62995978800, #  local_start 1997-04-06 03:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63013536000, #    utc_start 1997-10-26 08:00:00 (Sun)
  63027450000, #      utc_end 1998-04-05 09:00:00 (Sun)
  63013510800, #  local_start 1997-10-26 01:00:00 (Sun)
  63027424800, #    local_end 1998-04-05 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63027450000, #    utc_start 1998-04-05 09:00:00 (Sun)
  63044985600, #      utc_end 1998-10-25 08:00:00 (Sun)
  63027428400, #  local_start 1998-04-05 03:00:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63044985600, #    utc_start 1998-10-25 08:00:00 (Sun)
  63058899600, #      utc_end 1999-04-04 09:00:00 (Sun)
  63044960400, #  local_start 1998-10-25 01:00:00 (Sun)
  63058874400, #    local_end 1999-04-04 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63058899600, #    utc_start 1999-04-04 09:00:00 (Sun)
  63077040000, #      utc_end 1999-10-31 08:00:00 (Sun)
  63058878000, #  local_start 1999-04-04 03:00:00 (Sun)
  63077018400, #    local_end 1999-10-31 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63077040000, #    utc_start 1999-10-31 08:00:00 (Sun)
  63090349200, #      utc_end 2000-04-02 09:00:00 (Sun)
  63077014800, #  local_start 1999-10-31 01:00:00 (Sun)
  63090324000, #    local_end 2000-04-02 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63090349200, #    utc_start 2000-04-02 09:00:00 (Sun)
  63108489600, #      utc_end 2000-10-29 08:00:00 (Sun)
  63090327600, #  local_start 2000-04-02 03:00:00 (Sun)
  63108468000, #    local_end 2000-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63108489600, #    utc_start 2000-10-29 08:00:00 (Sun)
  63121798800, #      utc_end 2001-04-01 09:00:00 (Sun)
  63108464400, #  local_start 2000-10-29 01:00:00 (Sun)
  63121773600, #    local_end 2001-04-01 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63121798800, #    utc_start 2001-04-01 09:00:00 (Sun)
  63139939200, #      utc_end 2001-10-28 08:00:00 (Sun)
  63121777200, #  local_start 2001-04-01 03:00:00 (Sun)
  63139917600, #    local_end 2001-10-28 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63139939200, #    utc_start 2001-10-28 08:00:00 (Sun)
  63153853200, #      utc_end 2002-04-07 09:00:00 (Sun)
  63139914000, #  local_start 2001-10-28 01:00:00 (Sun)
  63153828000, #    local_end 2002-04-07 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63153853200, #    utc_start 2002-04-07 09:00:00 (Sun)
  63171388800, #      utc_end 2002-10-27 08:00:00 (Sun)
  63153831600, #  local_start 2002-04-07 03:00:00 (Sun)
  63171367200, #    local_end 2002-10-27 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63171388800, #    utc_start 2002-10-27 08:00:00 (Sun)
  63185302800, #      utc_end 2003-04-06 09:00:00 (Sun)
  63171363600, #  local_start 2002-10-27 01:00:00 (Sun)
  63185277600, #    local_end 2003-04-06 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63185302800, #    utc_start 2003-04-06 09:00:00 (Sun)
  63202838400, #      utc_end 2003-10-26 08:00:00 (Sun)
  63185281200, #  local_start 2003-04-06 03:00:00 (Sun)
  63202816800, #    local_end 2003-10-26 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63202838400, #    utc_start 2003-10-26 08:00:00 (Sun)
  63216752400, #      utc_end 2004-04-04 09:00:00 (Sun)
  63202813200, #  local_start 2003-10-26 01:00:00 (Sun)
  63216727200, #    local_end 2004-04-04 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63216752400, #    utc_start 2004-04-04 09:00:00 (Sun)
  63234892800, #      utc_end 2004-10-31 08:00:00 (Sun)
  63216730800, #  local_start 2004-04-04 03:00:00 (Sun)
  63234871200, #    local_end 2004-10-31 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63234892800, #    utc_start 2004-10-31 08:00:00 (Sun)
  63248202000, #      utc_end 2005-04-03 09:00:00 (Sun)
  63234867600, #  local_start 2004-10-31 01:00:00 (Sun)
  63248176800, #    local_end 2005-04-03 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63248202000, #    utc_start 2005-04-03 09:00:00 (Sun)
  63266342400, #      utc_end 2005-10-30 08:00:00 (Sun)
  63248180400, #  local_start 2005-04-03 03:00:00 (Sun)
  63266320800, #    local_end 2005-10-30 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63266342400, #    utc_start 2005-10-30 08:00:00 (Sun)
  63279651600, #      utc_end 2006-04-02 09:00:00 (Sun)
  63266317200, #  local_start 2005-10-30 01:00:00 (Sun)
  63279626400, #    local_end 2006-04-02 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63279651600, #    utc_start 2006-04-02 09:00:00 (Sun)
  63297792000, #      utc_end 2006-10-29 08:00:00 (Sun)
  63279630000, #  local_start 2006-04-02 03:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63297792000, #    utc_start 2006-10-29 08:00:00 (Sun)
  63309286800, #      utc_end 2007-03-11 09:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63309261600, #    local_end 2007-03-11 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63309286800, #    utc_start 2007-03-11 09:00:00 (Sun)
  63329846400, #      utc_end 2007-11-04 08:00:00 (Sun)
  63309265200, #  local_start 2007-03-11 03:00:00 (Sun)
  63329824800, #    local_end 2007-11-04 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63329846400, #    utc_start 2007-11-04 08:00:00 (Sun)
  63340736400, #      utc_end 2008-03-09 09:00:00 (Sun)
  63329821200, #  local_start 2007-11-04 01:00:00 (Sun)
  63340711200, #    local_end 2008-03-09 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63340736400, #    utc_start 2008-03-09 09:00:00 (Sun)
  63361296000, #      utc_end 2008-11-02 08:00:00 (Sun)
  63340714800, #  local_start 2008-03-09 03:00:00 (Sun)
  63361274400, #    local_end 2008-11-02 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63361296000, #    utc_start 2008-11-02 08:00:00 (Sun)
  63372186000, #      utc_end 2009-03-08 09:00:00 (Sun)
  63361270800, #  local_start 2008-11-02 01:00:00 (Sun)
  63372160800, #    local_end 2009-03-08 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63372186000, #    utc_start 2009-03-08 09:00:00 (Sun)
  63392745600, #      utc_end 2009-11-01 08:00:00 (Sun)
  63372164400, #  local_start 2009-03-08 03:00:00 (Sun)
  63392724000, #    local_end 2009-11-01 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63392745600, #    utc_start 2009-11-01 08:00:00 (Sun)
  63404240400, #      utc_end 2010-03-14 09:00:00 (Sun)
  63392720400, #  local_start 2009-11-01 01:00:00 (Sun)
  63404215200, #    local_end 2010-03-14 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63404240400, #    utc_start 2010-03-14 09:00:00 (Sun)
  63424800000, #      utc_end 2010-11-07 08:00:00 (Sun)
  63404218800, #  local_start 2010-03-14 03:00:00 (Sun)
  63424778400, #    local_end 2010-11-07 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63424800000, #    utc_start 2010-11-07 08:00:00 (Sun)
  63435690000, #      utc_end 2011-03-13 09:00:00 (Sun)
  63424774800, #  local_start 2010-11-07 01:00:00 (Sun)
  63435664800, #    local_end 2011-03-13 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63435690000, #    utc_start 2011-03-13 09:00:00 (Sun)
  63456249600, #      utc_end 2011-11-06 08:00:00 (Sun)
  63435668400, #  local_start 2011-03-13 03:00:00 (Sun)
  63456228000, #    local_end 2011-11-06 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63456249600, #    utc_start 2011-11-06 08:00:00 (Sun)
  63467139600, #      utc_end 2012-03-11 09:00:00 (Sun)
  63456224400, #  local_start 2011-11-06 01:00:00 (Sun)
  63467114400, #    local_end 2012-03-11 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63467139600, #    utc_start 2012-03-11 09:00:00 (Sun)
  63487699200, #      utc_end 2012-11-04 08:00:00 (Sun)
  63467118000, #  local_start 2012-03-11 03:00:00 (Sun)
  63487677600, #    local_end 2012-11-04 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63487699200, #    utc_start 2012-11-04 08:00:00 (Sun)
  63498589200, #      utc_end 2013-03-10 09:00:00 (Sun)
  63487674000, #  local_start 2012-11-04 01:00:00 (Sun)
  63498564000, #    local_end 2013-03-10 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63498589200, #    utc_start 2013-03-10 09:00:00 (Sun)
  63519148800, #      utc_end 2013-11-03 08:00:00 (Sun)
  63498567600, #  local_start 2013-03-10 03:00:00 (Sun)
  63519127200, #    local_end 2013-11-03 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63519148800, #    utc_start 2013-11-03 08:00:00 (Sun)
  63530038800, #      utc_end 2014-03-09 09:00:00 (Sun)
  63519123600, #  local_start 2013-11-03 01:00:00 (Sun)
  63530013600, #    local_end 2014-03-09 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63530038800, #    utc_start 2014-03-09 09:00:00 (Sun)
  63550598400, #      utc_end 2014-11-02 08:00:00 (Sun)
  63530017200, #  local_start 2014-03-09 03:00:00 (Sun)
  63550576800, #    local_end 2014-11-02 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63550598400, #    utc_start 2014-11-02 08:00:00 (Sun)
  63561488400, #      utc_end 2015-03-08 09:00:00 (Sun)
  63550573200, #  local_start 2014-11-02 01:00:00 (Sun)
  63561463200, #    local_end 2015-03-08 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63561488400, #    utc_start 2015-03-08 09:00:00 (Sun)
  63582048000, #      utc_end 2015-11-01 08:00:00 (Sun)
  63561466800, #  local_start 2015-03-08 03:00:00 (Sun)
  63582026400, #    local_end 2015-11-01 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63582048000, #    utc_start 2015-11-01 08:00:00 (Sun)
  63593542800, #      utc_end 2016-03-13 09:00:00 (Sun)
  63582022800, #  local_start 2015-11-01 01:00:00 (Sun)
  63593517600, #    local_end 2016-03-13 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63593542800, #    utc_start 2016-03-13 09:00:00 (Sun)
  63614102400, #      utc_end 2016-11-06 08:00:00 (Sun)
  63593521200, #  local_start 2016-03-13 03:00:00 (Sun)
  63614080800, #    local_end 2016-11-06 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63614102400, #    utc_start 2016-11-06 08:00:00 (Sun)
  63624992400, #      utc_end 2017-03-12 09:00:00 (Sun)
  63614077200, #  local_start 2016-11-06 01:00:00 (Sun)
  63624967200, #    local_end 2017-03-12 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63624992400, #    utc_start 2017-03-12 09:00:00 (Sun)
  63645552000, #      utc_end 2017-11-05 08:00:00 (Sun)
  63624970800, #  local_start 2017-03-12 03:00:00 (Sun)
  63645530400, #    local_end 2017-11-05 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63645552000, #    utc_start 2017-11-05 08:00:00 (Sun)
  63656442000, #      utc_end 2018-03-11 09:00:00 (Sun)
  63645526800, #  local_start 2017-11-05 01:00:00 (Sun)
  63656416800, #    local_end 2018-03-11 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63656442000, #    utc_start 2018-03-11 09:00:00 (Sun)
  63677001600, #      utc_end 2018-11-04 08:00:00 (Sun)
  63656420400, #  local_start 2018-03-11 03:00:00 (Sun)
  63676980000, #    local_end 2018-11-04 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63677001600, #    utc_start 2018-11-04 08:00:00 (Sun)
  63687891600, #      utc_end 2019-03-10 09:00:00 (Sun)
  63676976400, #  local_start 2018-11-04 01:00:00 (Sun)
  63687866400, #    local_end 2019-03-10 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63687891600, #    utc_start 2019-03-10 09:00:00 (Sun)
  63708451200, #      utc_end 2019-11-03 08:00:00 (Sun)
  63687870000, #  local_start 2019-03-10 03:00:00 (Sun)
  63708429600, #    local_end 2019-11-03 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63708451200, #    utc_start 2019-11-03 08:00:00 (Sun)
  63719341200, #      utc_end 2020-03-08 09:00:00 (Sun)
  63708426000, #  local_start 2019-11-03 01:00:00 (Sun)
  63719316000, #    local_end 2020-03-08 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63719341200, #    utc_start 2020-03-08 09:00:00 (Sun)
  63739900800, #      utc_end 2020-11-01 08:00:00 (Sun)
  63719319600, #  local_start 2020-03-08 03:00:00 (Sun)
  63739879200, #    local_end 2020-11-01 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63739900800, #    utc_start 2020-11-01 08:00:00 (Sun)
  63751395600, #      utc_end 2021-03-14 09:00:00 (Sun)
  63739875600, #  local_start 2020-11-01 01:00:00 (Sun)
  63751370400, #    local_end 2021-03-14 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63751395600, #    utc_start 2021-03-14 09:00:00 (Sun)
  63771955200, #      utc_end 2021-11-07 08:00:00 (Sun)
  63751374000, #  local_start 2021-03-14 03:00:00 (Sun)
  63771933600, #    local_end 2021-11-07 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63771955200, #    utc_start 2021-11-07 08:00:00 (Sun)
  63782845200, #      utc_end 2022-03-13 09:00:00 (Sun)
  63771930000, #  local_start 2021-11-07 01:00:00 (Sun)
  63782820000, #    local_end 2022-03-13 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63782845200, #    utc_start 2022-03-13 09:00:00 (Sun)
  63803404800, #      utc_end 2022-11-06 08:00:00 (Sun)
  63782823600, #  local_start 2022-03-13 03:00:00 (Sun)
  63803383200, #    local_end 2022-11-06 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63803404800, #    utc_start 2022-11-06 08:00:00 (Sun)
  63814294800, #      utc_end 2023-03-12 09:00:00 (Sun)
  63803379600, #  local_start 2022-11-06 01:00:00 (Sun)
  63814269600, #    local_end 2023-03-12 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63814294800, #    utc_start 2023-03-12 09:00:00 (Sun)
  63834854400, #      utc_end 2023-11-05 08:00:00 (Sun)
  63814273200, #  local_start 2023-03-12 03:00:00 (Sun)
  63834832800, #    local_end 2023-11-05 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63834854400, #    utc_start 2023-11-05 08:00:00 (Sun)
  63845744400, #      utc_end 2024-03-10 09:00:00 (Sun)
  63834829200, #  local_start 2023-11-05 01:00:00 (Sun)
  63845719200, #    local_end 2024-03-10 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63845744400, #    utc_start 2024-03-10 09:00:00 (Sun)
  63866304000, #      utc_end 2024-11-03 08:00:00 (Sun)
  63845722800, #  local_start 2024-03-10 03:00:00 (Sun)
  63866282400, #    local_end 2024-11-03 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63866304000, #    utc_start 2024-11-03 08:00:00 (Sun)
  63877194000, #      utc_end 2025-03-09 09:00:00 (Sun)
  63866278800, #  local_start 2024-11-03 01:00:00 (Sun)
  63877168800, #    local_end 2025-03-09 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63877194000, #    utc_start 2025-03-09 09:00:00 (Sun)
  63897753600, #      utc_end 2025-11-02 08:00:00 (Sun)
  63877172400, #  local_start 2025-03-09 03:00:00 (Sun)
  63897732000, #    local_end 2025-11-02 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63897753600, #    utc_start 2025-11-02 08:00:00 (Sun)
  63908643600, #      utc_end 2026-03-08 09:00:00 (Sun)
  63897728400, #  local_start 2025-11-02 01:00:00 (Sun)
  63908618400, #    local_end 2026-03-08 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63908643600, #    utc_start 2026-03-08 09:00:00 (Sun)
  63929203200, #      utc_end 2026-11-01 08:00:00 (Sun)
  63908622000, #  local_start 2026-03-08 03:00:00 (Sun)
  63929181600, #    local_end 2026-11-01 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63929203200, #    utc_start 2026-11-01 08:00:00 (Sun)
  63940698000, #      utc_end 2027-03-14 09:00:00 (Sun)
  63929178000, #  local_start 2026-11-01 01:00:00 (Sun)
  63940672800, #    local_end 2027-03-14 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63940698000, #    utc_start 2027-03-14 09:00:00 (Sun)
  63961257600, #      utc_end 2027-11-07 08:00:00 (Sun)
  63940676400, #  local_start 2027-03-14 03:00:00 (Sun)
  63961236000, #    local_end 2027-11-07 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63961257600, #    utc_start 2027-11-07 08:00:00 (Sun)
  63972147600, #      utc_end 2028-03-12 09:00:00 (Sun)
  63961232400, #  local_start 2027-11-07 01:00:00 (Sun)
  63972122400, #    local_end 2028-03-12 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  63972147600, #    utc_start 2028-03-12 09:00:00 (Sun)
  63992707200, #      utc_end 2028-11-05 08:00:00 (Sun)
  63972126000, #  local_start 2028-03-12 03:00:00 (Sun)
  63992685600, #    local_end 2028-11-05 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  63992707200, #    utc_start 2028-11-05 08:00:00 (Sun)
  64003597200, #      utc_end 2029-03-11 09:00:00 (Sun)
  63992682000, #  local_start 2028-11-05 01:00:00 (Sun)
  64003572000, #    local_end 2029-03-11 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  64003597200, #    utc_start 2029-03-11 09:00:00 (Sun)
  64024156800, #      utc_end 2029-11-04 08:00:00 (Sun)
  64003575600, #  local_start 2029-03-11 03:00:00 (Sun)
  64024135200, #    local_end 2029-11-04 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
      [
  64024156800, #    utc_start 2029-11-04 08:00:00 (Sun)
  64035046800, #      utc_end 2030-03-10 09:00:00 (Sun)
  64024131600, #  local_start 2029-11-04 01:00:00 (Sun)
  64035021600, #    local_end 2030-03-10 02:00:00 (Sun)
  -25200,
  0,
  'MST',
      ],
      [
  64035046800, #    utc_start 2030-03-10 09:00:00 (Sun)
  64055606400, #      utc_end 2030-11-03 08:00:00 (Sun)
  64035025200, #  local_start 2030-03-10 03:00:00 (Sun)
  64055584800, #    local_end 2030-11-03 02:00:00 (Sun)
  -21600,
  1,
  'MDT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {68}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -25200 }
  
  my $last_observance = bless( {
    'format' => 'M%sT',
    'gmtoff' => '-7:00',
    'local_start_datetime' => {},
    'offset_from_std' => 0,
    'offset_from_utc' => -25200,
    'until' => [],
    'utc_start_datetime' => {}
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Nov',
      'letter' => 'S',
      'name' => 'US',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Mar',
      'letter' => 'D',
      'name' => 'US',
      'offset_from_std' => 3600,
      'on' => 'Sun>=8',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_MST7MDT

    $main::fatpacked{"DateTime/TimeZone/OffsetOnly.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_OFFSETONLY';
  package DateTime::TimeZone::OffsetOnly;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use parent 'DateTime::TimeZone';
  
  use DateTime::TimeZone::UTC;
  use Params::ValidationCompiler 0.13 qw( validation_for );
  use Specio::Library::String;
  
  {
      my $validator = validation_for(
          name             => '_check_new_params',
          name_is_optional => 1,
          params           => {
              offset => {
                  type => t('NonEmptyStr'),
              },
          },
      );
  
      sub new {
          my $class = shift;
          my %p     = $validator->(@_);
  
          my $offset = DateTime::TimeZone::offset_as_seconds( $p{offset} );
  
          die "Invalid offset: $p{offset}\n" unless defined $offset;
  
          return DateTime::TimeZone::UTC->new unless $offset;
  
          my $self = {
              name   => DateTime::TimeZone::offset_as_string($offset),
              offset => $offset,
          };
  
          return bless $self, $class;
      }
  }
  
  sub is_dst_for_datetime {0}
  
  sub offset_for_datetime       { $_[0]->{offset} }
  sub offset_for_local_datetime { $_[0]->{offset} }
  
  sub is_utc {0}
  
  sub short_name_for_datetime { $_[0]->name }
  
  sub category {undef}
  
  sub STORABLE_freeze {
      my $self = shift;
  
      return $self->name;
  }
  
  sub STORABLE_thaw {
      my $self = shift;
      shift;
      my $serialized = shift;
  
      my $class = ref $self || $self;
  
      my $obj;
      if ( $class->isa(__PACKAGE__) ) {
          $obj = __PACKAGE__->new( offset => $serialized );
      }
      else {
          $obj = $class->new( offset => $serialized );
      }
  
      %$self = %$obj;
  
      return $self;
  }
  
  1;
  
  # ABSTRACT: A DateTime::TimeZone object that just contains an offset
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  DateTime::TimeZone::OffsetOnly - A DateTime::TimeZone object that just contains an offset
  
  =head1 VERSION
  
  version 2.36
  
  =head1 SYNOPSIS
  
    my $offset_tz = DateTime::TimeZone->new( name => '-0300' );
  
  =head1 DESCRIPTION
  
  This class is used to provide the DateTime::TimeZone API needed by
  DateTime.pm, but with a fixed offset.  An object in this class always
  returns the same offset as was given in its constructor, regardless of
  the date.
  
  =head1 USAGE
  
  This class has the same methods as a real time zone object, but the
  C<category()> method returns undef.
  
  =head2 DateTime::TimeZone::OffsetOnly->new ( offset => $offset )
  
  The value given to the offset parameter must be a string such as
  "+0300".  Strings will be converted into numbers by the
  C<DateTime::TimeZone::offset_as_seconds()> function.
  
  =head2 $tz->offset_for_datetime( $datetime )
  
  No matter what date is given, the offset provided to the constructor
  is always used.
  
  =head2 $tz->name()
  
  =head2 $tz->short_name_for_datetime()
  
  Both of these methods return the offset in string form.
  
  =head1 SUPPORT
  
  Bugs may be submitted at L<https://github.com/houseabsolute/DateTime-TimeZone/issues>.
  
  I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
  
  =head1 SOURCE
  
  The source code repository for DateTime-TimeZone can be found at L<https://github.com/houseabsolute/DateTime-TimeZone>.
  
  =head1 AUTHOR
  
  Dave Rolsky <autarch@urth.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2019 by Dave Rolsky.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  The full text of the license can be found in the
  F<LICENSE> file included with this distribution.
  
  =cut
DATETIME_TIMEZONE_OFFSETONLY

    $main::fatpacked{"DateTime/TimeZone/OlsonDB.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_OLSONDB';
  package DateTime::TimeZone::OlsonDB;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use DateTime::TimeZone::OlsonDB::Rule;
  use DateTime::TimeZone::OlsonDB::Zone;
  
  my $x = 1;
  our %MONTHS = map { $_ => $x++ } qw( Jan Feb Mar Apr May Jun
      Jul Aug Sep Oct Nov Dec);
  
  $x = 1;
  our %DAYS = map { $_ => $x++ } qw( Mon Tue Wed Thu Fri Sat Sun );
  
  our $PLUS_ONE_DAY_DUR  = DateTime::Duration->new( days => 1 );
  our $MINUS_ONE_DAY_DUR = DateTime::Duration->new( days => -1 );
  
  sub new {
      my $class = shift;
  
      return bless {
          rules => {},
          zones => {},
          links => {},
      }, $class;
  }
  
  sub parse_file {
      my $self = shift;
      my $file = shift;
  
      open my $fh, '<', $file
          or die "Cannot read $file: $!";
  
      while (<$fh>) {
          chomp;
          $self->_parse_line($_);
      }
  
      close $fh or die $!;
  }
  
  sub _parse_line {
      my $self = shift;
      my $line = shift;
  
      return if $line =~ /^\s+$/;
      return if $line =~ /^#/;
  
      # remove any comments at the end of the line
      $line =~ s/\s*#.+$//;
  
      if ( $self->{in_zone} && $line =~ /^[ \t]/ ) {
          $self->_parse_zone( $line, $self->{in_zone} );
          return;
      }
  
      foreach (qw( Rule Zone Link )) {
          if ( substr( $line, 0, 4 ) eq $_ ) {
              my $m = '_parse_' . lc $_;
              $self->$m($line);
          }
      }
  }
  
  ## no critic (Subroutines::ProhibitUnusedPrivateSubroutines)
  sub _parse_rule {
      my $self = shift;
      my $rule = shift;
  
      my @items = split /\s+/, $rule, 10;
  
      shift @items;
      my $name = shift @items;
  
      my %rule;
      @rule{qw( from to type in on at save letter )} = @items;
      delete $rule{letter} if $rule{letter} eq '-';
  
      # As of the 2003a data, there are no rules with a type set
      delete $rule{type} if $rule{type} eq '-';
  
      push @{ $self->{rules}{$name} },
          DateTime::TimeZone::OlsonDB::Rule->new( name => $name, %rule );
  
      undef $self->{in_zone};
  }
  
  sub _parse_zone {
      my $self = shift;
      my $zone = shift;
      my $name = shift;
  
      my $expect = $name ? 5 : 6;
      my @items  = grep { defined && length } split /\s+/, $zone, $expect;
  
      my %obs;
      unless ($name) {
          shift @items;    # remove "Zone"
          $name = shift @items;
      }
  
      @obs{qw( gmtoff rules format until )} = @items;
  
      if ( $obs{rules} =~ /\d\d?:\d\d/ ) {
          $obs{offset_from_std} = delete $obs{rules};
      }
      else {
          delete $obs{rules} if $obs{rules} eq '-';
      }
  
      delete $obs{until} unless defined $obs{until};
  
      push @{ $self->{zones}{$name} }, \%obs;
  
      $self->{in_zone} = $name;
  }
  
  sub _parse_link {
      my $self = shift;
      my $link = shift;
  
      my @items = split /\s+/, $link, 3;
  
      $self->{links}{ $items[2] } = $items[1];
  
      undef $self->{in_zone};
  }
  ## use critic
  
  sub links { %{ $_[0]->{links} } }
  
  sub zone_names { keys %{ $_[0]->{zones} } }
  
  sub zone {
      my $self = shift;
      my $name = shift;
  
      die "Invalid zone name $name"
          unless exists $self->{zones}{$name};
  
      return DateTime::TimeZone::OlsonDB::Zone->new(
          name        => $name,
          observances => $self->{zones}{$name},
          olson_db    => $self,
      );
  }
  
  sub expanded_zone {
      my $self = shift;
      my %p    = @_;
  
      $p{expand_to_year} ||= (localtime)[5] + 1910;
  
      my $zone = $self->zone( $p{name} );
  
      $zone->expand_observances( $self, $p{expand_to_year} );
  
      return $zone;
  }
  
  sub rules_by_name {
      my $self = shift;
      my $name = shift;
  
      return unless defined $name;
  
      die "Invalid rule name $name"
          unless exists $self->{rules}{$name};
  
      return @{ $self->{rules}{$name} };
  }
  
  sub parse_day_spec {
      my ( $day, $month, $year ) = @_;
  
      return ( $month, $day ) if $day =~ /^\d+$/;
  
      if ( $day =~ /^last(\w\w\w)$/ ) {
          my $dow = $DAYS{$1};
  
          my $last_day = DateTime->last_day_of_month(
              year      => $year,
              month     => $month,
              time_zone => 'floating',
          );
  
          my $dt = DateTime->new(
              year      => $year,
              month     => $month,
              day       => $last_day->day,
              time_zone => 'floating',
          );
  
          while ( $dt->day_of_week != $dow ) {
              $dt -= $PLUS_ONE_DAY_DUR;
          }
  
          return ( $dt->month, $dt->day );
      }
      elsif ( $day =~ /^(\w\w\w)([><])=(\d\d?)$/ ) {
          my $dow = $DAYS{$1};
  
          my $dt = DateTime->new(
              year      => $year,
              month     => $month,
              day       => $3,
              time_zone => 'floating',
          );
  
          my $dur = $2 eq '<' ? $MINUS_ONE_DAY_DUR : $PLUS_ONE_DAY_DUR;
  
          while ( $dt->day_of_week != $dow ) {
              $dt += $dur;
          }
  
          return ( $dt->month, $dt->day );
      }
      else {
          die "Invalid on spec for rule: $day\n";
      }
  }
  
  sub utc_datetime_for_time_spec {
      my %p = @_;
  
      # 'w'all - ignore it, because that's the default
      $p{spec} =~ s/w$//;
  
      # 'g'reenwich, 'u'tc, or 'z'ulu
      my $is_utc = $p{spec} =~ s/[guz]$//;
  
      # 's'tandard time - ignore DS offset
      my $is_std = $p{spec} =~ s/s$//;
  
      ## no critic (NamingConventions::ProhibitAmbiguousNames)
      my ( $hour, $minute, $second ) = split /:/, $p{spec};
      $minute = 0 unless defined $minute;
      $second = 0 unless defined $second;
  
      my $add_day = 0;
      if ( $hour >= 24 ) {
          $hour    = $hour - 24;
          $add_day = 1;
      }
  
      my $utc;
      if ($is_utc) {
          $utc = DateTime->new(
              year      => $p{year},
              month     => $p{month},
              day       => $p{day},
              hour      => $hour,
              minute    => $minute,
              second    => $second,
              time_zone => 'floating',
          );
      }
      else {
          my $local = DateTime->new(
              year      => $p{year},
              month     => $p{month},
              day       => $p{day},
              hour      => $hour,
              minute    => $minute,
              second    => $second,
              time_zone => 'floating',
          );
  
          $p{offset_from_std} = 0 if $is_std;
  
          my $dur = DateTime::Duration->new(
              seconds => $p{offset_from_utc} + $p{offset_from_std} );
  
          $utc = $local - $dur;
      }
  
      $utc->add( days => 1 ) if $add_day;
  
      return $utc;
  }
  
  1;
  
  # ABSTRACT: An object to represent an Olson time zone database
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  DateTime::TimeZone::OlsonDB - An object to represent an Olson time zone database
  
  =head1 VERSION
  
  version 2.36
  
  =head1 SYNOPSIS
  
    none yet
  
  =head1 DESCRIPTION
  
  This module parses the Olson database time zone definition files and
  creates various objects representing time zone data.
  
  Each time zone is broken down into several parts.  The first piece is
  an observance, which is an offset from UTC and an abbreviation.  A
  single zone may contain many observances, reflecting historical
  changes in that time zone over time.  An observance may also refer to
  a set of rules.
  
  Rules are named, and may apply to many different zones.  For example,
  the "US" rules apply to most of the time zones in the US,
  unsurprisingly.  Rules are made of an offset from standard time and a
  definition of when that offset changes.  Changes can be a one time
  thing, or they can recur at regular times through a span of years.
  
  Each rule may have an associated letter, which is used to generate an
  abbreviated name for the time zone, along with the offset's
  abbreviation.  For example, if the offset's abbreviation is "C%sT",
  and the a rule specifies the letter "S", then the abbreviation when
  that rule is in effect is "CST".
  
  =head1 USAGE
  
  Not yet documented.  This stuff is a mess.
  
  =head1 SUPPORT
  
  Bugs may be submitted at L<https://github.com/houseabsolute/DateTime-TimeZone/issues>.
  
  I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
  
  =head1 SOURCE
  
  The source code repository for DateTime-TimeZone can be found at L<https://github.com/houseabsolute/DateTime-TimeZone>.
  
  =head1 AUTHOR
  
  Dave Rolsky <autarch@urth.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2019 by Dave Rolsky.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  The full text of the license can be found in the
  F<LICENSE> file included with this distribution.
  
  =cut
DATETIME_TIMEZONE_OLSONDB

    $main::fatpacked{"DateTime/TimeZone/OlsonDB/Change.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_OLSONDB_CHANGE';
  package DateTime::TimeZone::OlsonDB::Change;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  sub new {
      my $class = shift;
      my %p     = @_;
  
      # These are almost always mutually exclusive, except when adding
      # an observance change and the last rule has no offset, but the
      # new observance has an anonymous rule.  In that case, prefer the
      # offset from std defined in the observance to that in the
      # previous rule (what a mess!).
      if ( $p{type} eq 'observance' ) {
          $p{offset_from_std} = $p{rule}->offset_from_std if defined $p{rule};
          $p{offset_from_std} = $p{observance}->offset_from_std
              if $p{observance}->offset_from_std;
          $p{offset_from_std} ||= 0;
      }
      else {
          $p{offset_from_std} = $p{observance}->offset_from_std;
          $p{offset_from_std} = $p{rule}->offset_from_std if defined $p{rule};
      }
  
      $p{offset_from_utc} = $p{observance}->offset_from_utc;
  
      $p{is_dst} = 0;
      $p{is_dst} = 1 if $p{rule} && $p{rule}->offset_from_std;
      $p{is_dst} = 1 if $p{observance}->offset_from_std;
  
      if ( $p{short_name} =~ m{([\-\+\w]+)/([\-\+\w]+)} ) {
          $p{short_name} = $p{is_dst} ? $2 : $1;
      }
  
      return bless \%p, $class;
  }
  
  sub utc_start_datetime   { $_[0]->{utc_start_datetime} }
  sub local_start_datetime { $_[0]->{local_start_datetime} }
  sub short_name           { $_[0]->{short_name} }
  sub is_dst               { $_[0]->{is_dst} }
  sub observance           { $_[0]->{observance} }
  sub rule                 { $_[0]->{rule} }
  sub offset_from_utc      { $_[0]->{offset_from_utc} }
  sub offset_from_std      { $_[0]->{offset_from_std} }
  sub total_offset         { $_[0]->offset_from_utc + $_[0]->offset_from_std }
  
  sub two_changes_as_span {
      my ( $c1, $c2 ) = @_;
  
      my ( $utc_start, $local_start );
  
      if ( defined $c1->utc_start_datetime ) {
          $utc_start   = $c1->utc_start_datetime->utc_rd_as_seconds;
          $local_start = $c1->local_start_datetime->utc_rd_as_seconds;
      }
      else {
          $utc_start = $local_start = '-inf';
      }
  
      my $utc_end   = $c2->utc_start_datetime->utc_rd_as_seconds;
      my $local_end = $utc_end + $c1->total_offset;
  
      return {
          utc_start   => $utc_start,
          utc_end     => $utc_end,
          local_start => $local_start,
          local_end   => $local_end,
          short_name  => $c1->short_name,
          offset      => $c1->total_offset,
          is_dst      => $c1->is_dst,
      };
  }
  
  ## no critic (Subroutines::ProhibitUnusedPrivateSubroutines, InputOutput::RequireCheckedSyscalls)
  sub _debug_output {
      my $self = shift;
  
      my $obs = $self->observance;
  
      if ( $self->utc_start_datetime ) {
          print ' UTC:        ', $self->utc_start_datetime->datetime,   "\n";
          print ' Local:      ', $self->local_start_datetime->datetime, "\n";
      }
      else {
          print " First change (starts at -inf)\n";
      }
  
      print ' Short name: ', $self->short_name,     "\n";
      print ' UTC offset: ', $obs->offset_from_utc, "\n";
  
      if ( $obs->offset_from_std || $self->rule ) {
          if ( $obs->offset_from_std ) {
              print ' Std offset: ', $obs->offset_from_std, "\n";
          }
  
          if ( $self->rule ) {
              print ' Std offset: ', $self->rule->offset_from_std, ' - ',
                  $self->rule->name, " rule\n";
          }
      }
      else {
          print " Std offset: 0 - no rule\n";
      }
  
      print "\n";
  }
  ## use critic
  
  1;
DATETIME_TIMEZONE_OLSONDB_CHANGE

    $main::fatpacked{"DateTime/TimeZone/OlsonDB/Observance.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_OLSONDB_OBSERVANCE';
  package DateTime::TimeZone::OlsonDB::Observance;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use DateTime::Duration;
  use DateTime::TimeZone::OlsonDB;
  use DateTime::TimeZone::OlsonDB::Change;
  use List::Util 1.33 qw( any first );
  
  sub new {
      my $class = shift;
      my %p     = @_;
  
      $p{until} ||= q{};
      $p{$_} ||= 0
          for qw( offset_from_std last_offset_from_std last_offset_from_utc );
  
      my $offset_from_utc
          = $p{gmtoff} =~ m/^[+-]?\d?\d$/ # only hours? need to handle specially
          ? 3600 * $p{gmtoff}
          : DateTime::TimeZone::offset_as_seconds( $p{gmtoff} );
  
      my $offset_from_std
          = DateTime::TimeZone::offset_as_seconds( $p{offset_from_std} );
  
      my $last_offset_from_utc = delete $p{last_offset_from_utc};
      my $last_offset_from_std = delete $p{last_offset_from_std};
  
      my $self = bless {
          %p,
          offset_from_utc => $offset_from_utc,
          offset_from_std => $offset_from_std,
          until           => [ split /\s+/, $p{until} ],
      }, $class;
  
      $self->{first_rule}
          = $self->_first_rule( $last_offset_from_utc, $last_offset_from_std );
  
      if ( $p{utc_start_datetime} ) {
          $offset_from_std += $self->{first_rule}->offset_from_std
              if $self->{first_rule};
  
          my $local_start_datetime = $p{utc_start_datetime}->clone;
  
          $local_start_datetime += DateTime::Duration->new(
              seconds => $offset_from_utc + $offset_from_std );
  
          $self->{local_start_datetime} = $local_start_datetime;
      }
  
      return $self;
  }
  
  sub offset_from_utc { $_[0]->{offset_from_utc} || 0 }
  sub offset_from_std { $_[0]->{offset_from_std} || 0 }
  sub total_offset    { $_[0]->offset_from_utc + $_[0]->offset_from_std }
  
  sub rules      { @{ $_[0]->{rules} } }
  sub first_rule { $_[0]->{first_rule} }
  
  ## no critic (Subroutines::ProhibitBuiltinHomonyms)
  sub format { $_[0]->{format} }
  ## use critic
  
  sub utc_start_datetime   { $_[0]->{utc_start_datetime} }
  sub local_start_datetime { $_[0]->{local_start_datetime} }
  
  sub formatted_short_name {
      my $self   = shift;
      my $letter = shift;
  
      my $format = $self->format;
      return $format unless $format =~ /%/;
  
      return sprintf( $format, $letter );
  }
  
  sub expand_from_rules {
      my $self = shift;
      my $zone = shift;
  
      # real max is year + 1 so we include max year
      my $max_year = (shift) + 1;
  
      my $min_year;
  
      if ( $self->utc_start_datetime ) {
          $min_year = $self->utc_start_datetime->year;
      }
      else {
  
          # There is at least one time zone that has an infinite
          # observance, but that observance has rules that only start at
          # a certain point - Pacific/Chatham
  
          # In this case we just find the earliest rule and start there
  
          $min_year
              = ( sort { $a <=> $b } map { $_->min_year } $self->rules )[0];
      }
  
      my $until = $self->until( $zone->last_change->offset_from_std );
      if ($until) {
          $max_year = $until->year;
      }
      else {
  
          # Some zones, like Asia/Tehran, have a predefined fixed set of
          # rules that go well into the future (2037 for Asia/Tehran)
          my $max_rule_year = 0;
          foreach my $rule ( $self->rules ) {
              $max_rule_year = $rule->max_year
                  if $rule->max_year && $rule->max_year > $max_rule_year;
          }
  
          $max_year = $max_rule_year if $max_rule_year > $max_year;
      }
  
      foreach my $year ( $min_year .. $max_year ) {
          my @rules = $self->_sorted_rules_for_year($year);
  
          for my $rule (@rules) {
              my $dt = $rule->utc_start_datetime_for_year(
                  $year,
                  $self->offset_from_utc, $zone->last_change->offset_from_std
              );
  
              next
                  if $self->utc_start_datetime
                  && $dt <= $self->utc_start_datetime;
  
              ## no critic (Variables::ProhibitReusedNames)
              my $until = $self->until( $zone->last_change->offset_from_std );
  
              next if $until && $dt >= $until;
  
              my $change = DateTime::TimeZone::OlsonDB::Change->new(
                  type                 => 'rule',
                  utc_start_datetime   => $dt,
                  local_start_datetime => $dt + DateTime::Duration->new(
                      seconds => $self->total_offset + $rule->offset_from_std
                  ),
                  short_name => $self->formatted_short_name( $rule->letter ),
                  observance => $self,
                  rule       => $rule,
              );
  
              if ($DateTime::TimeZone::OlsonDB::DEBUG) {
                  ## no critic (InputOutput::RequireCheckedSyscalls)
                  print "Adding rule change ...\n";
  
                  $change->_debug_output;
              }
  
              $zone->add_change($change);
          }
      }
  }
  
  sub _sorted_rules_for_year {
      my $self = shift;
      my $year = shift;
  
      ## no critic (BuiltinFunctions::ProhibitComplexMappings)
      my @rules = (
          map      { $_->[0] }
              sort { $a->[1] <=> $b->[1] }
              map {
              my $dt = $_->utc_start_datetime_for_year(
                  $year,
                  $self->offset_from_utc, 0
              );
              [ $_, $dt ]
              }
              grep {
              $_->min_year <= $year
                  && ( ( !$_->max_year ) || $_->max_year >= $year )
              } $self->rules
      );
  
      my %rules_by_month;
      for my $rule (@rules) {
          push @{ $rules_by_month{ $rule->month() } }, $rule;
      }
  
      # In some cases we have both a "max year" rule and a "this year" rule for
      # a given month's change. In that case, we want to pick the more specific
      # ("this year") rule, not apply both. This only matters for zones that
      # have a winter transition that follows the Islamic calendar to deal with
      # Ramadan. So far this has happened with Cairo, El_Aaiun, and other zones
      # in northern Africa.
      my @final_rules;
      for my $month ( sort { $a <=> $b } keys %rules_by_month ) {
          my @r = @{ $rules_by_month{$month} };
          if ( @r == 2 ) {
              my ($repeating) = grep { !defined $_->max_year() } @r;
              my ($this_year)
                  = grep { $_->max_year() && $_->max_year() == $year } @r;
              if ( $repeating && $this_year ) {
  
                  # We used to pick the repeating rule for year 2037 only
                  # because it seemed like that's what zic did in the past. Now
                  # it seems to pick the "this year" rule instead.
                  if ($DateTime::TimeZone::OlsonDB::DEBUG) {
                      ## no critic (InputOutput::RequireCheckedSyscalls)
                      print
                          "Found two rules for the same month, picking the one for this year\n";
                  }
  
                  push @final_rules, $this_year;
                  next;
              }
  
              push @final_rules, @r;
          }
          else {
              push @final_rules, @r;
          }
      }
  
      return @final_rules;
  }
  
  ## no critic (Subroutines::ProhibitBuiltinHomonyms)
  sub until {
      my $self            = shift;
      my $offset_from_std = shift || $self->offset_from_std;
  
      return unless defined $self->until_year;
  
      my $utc = DateTime::TimeZone::OlsonDB::utc_datetime_for_time_spec(
          spec            => $self->until_time_spec,
          year            => $self->until_year,
          month           => $self->until_month,
          day             => $self->until_day,
          offset_from_utc => $self->offset_from_utc,
          offset_from_std => $offset_from_std,
      );
  
      return $utc;
  }
  ## use critic
  
  sub until_year { $_[0]->{until}[0] }
  
  sub until_month {
      return 1 unless defined $_[0]->{until}[1];
      return $DateTime::TimeZone::OlsonDB::MONTHS{ $_[0]->{until}[1] };
  }
  
  sub until_day {
      return 1 unless defined $_[0]->{until}[2];
      my ( undef, $day ) = DateTime::TimeZone::OlsonDB::parse_day_spec(
          $_[0]->{until}[2],
          $_[0]->until_month,
          $_[0]->until_year,
      );
      return $day;
  }
  
  sub until_time_spec {
      defined $_[0]->{until}[3] ? $_[0]->{until}[3] : '00:00:00';
  }
  
  ## no critic (Subroutines::ProhibitExcessComplexity)
  sub _first_rule {
      my $self                 = shift;
      my $last_offset_from_utc = shift;
      my $last_offset_from_std = shift;
  
      return unless $self->rules;
  
      my $date = $self->utc_start_datetime
          or return $self->_first_no_dst_rule;
  
      my @rules = $self->rules;
  
      my %possible_rules;
  
      my $year = $date->year;
      foreach my $rule (@rules) {
  
          # We need to look at what the year _would_ be if we added the
          # rule's offset to the UTC date.  Otherwise we can end up with
          # a UTC date in year X, and a rule that starts in _local_ year
          # X + 1, where that rule really does apply to that UTC date.
          my $temp_year
              = $date->clone->add(
              seconds => $self->offset_from_utc + $rule->offset_from_std )
              ->year;
  
          # Save the highest value
          $year = $temp_year if $temp_year > $year;
  
          next if $rule->min_year > $temp_year;
  
          $possible_rules{$rule} = $rule;
      }
  
      my $earliest_year = $year - 1;
      foreach my $rule (@rules) {
          $earliest_year = $rule->min_year
              if $rule->min_year < $earliest_year;
      }
  
      # figure out what date each rule would start on _if_ that rule
      # were applied to this current observance.  this could be a rule
      # that started much earlier, but is only now active because of an
      # observance switch.  An obnoxious example of this is
      # America/Phoenix in 1944, which applies the US rule in April,
      # thus (re-)instating the "war time" rule from 1942.  Can you say
      # ridiculous crack-smoking stupidity?
      my @rule_dates;
      foreach my $y ( $earliest_year .. $year ) {
      RULE:
          foreach my $rule ( values %possible_rules ) {
  
              # skip rules that can't have applied the year before the
              # observance started.
              if ( $rule->min_year > $y ) {
                  ## no critic (InputOutput::RequireCheckedSyscalls)
                  print 'Skipping rule beginning in ', $rule->min_year,
                      ".  Year is $y.\n"
                      if $DateTime::TimeZone::OlsonDB::DEBUG;
  
                  next RULE;
              }
  
              if ( $rule->max_year && $rule->max_year < $y ) {
                  ## no critic (InputOutput::RequireCheckedSyscalls)
                  print 'Skipping rule ending in ', $rule->max_year,
                      ".     Year is $y.\n"
                      if $DateTime::TimeZone::OlsonDB::DEBUG;
  
                  next RULE;
              }
  
              my $rule_start = $rule->utc_start_datetime_for_year(
                  $y,
                  $last_offset_from_utc, $last_offset_from_std
              );
  
              push @rule_dates, [ $rule_start, $rule ];
          }
      }
  
      @rule_dates = sort { $a->[0] <=> $b->[0] } @rule_dates;
  
      ## no critic (InputOutput::RequireCheckedSyscalls)
      print "Looking for first rule ...\n"
          if $DateTime::TimeZone::OlsonDB::DEBUG;
      print ' Observance starts: ', $date->datetime, "\n\n"
          if $DateTime::TimeZone::OlsonDB::DEBUG;
      ## use critic
  
      # ... look through the rules to see if any are still in
      # effect at the beginning of the observance
  
      ## no critic (ControlStructures::ProhibitCStyleForLoops)
      for ( my $x = 0; $x < @rule_dates; $x++ ) {
          my ( $dt, $rule ) = @{ $rule_dates[$x] };
          my ( $next_dt, $next_rule )
              = $x < @rule_dates - 1 ? @{ $rule_dates[ $x + 1 ] } : undef;
  
          next if $next_dt && $next_dt < $date;
  
          ## no critic (InputOutput::RequireCheckedSyscalls)
          print ' This rule starts:  ', $dt->datetime, "\n"
              if $DateTime::TimeZone::OlsonDB::DEBUG;
  
          print ' Next rule starts:  ', $next_dt->datetime, "\n"
              if $next_dt && $DateTime::TimeZone::OlsonDB::DEBUG;
  
          print ' No next rule\n\n'
              if !$next_dt && $DateTime::TimeZone::OlsonDB::DEBUG;
          ## use critic
  
          if ( $dt <= $date ) {
              if ($next_dt) {
                  return $rule if $date < $next_dt;
                  return $next_rule if $date == $next_dt;
              }
              else {
                  return $rule;
              }
          }
      }
  
      # If this observance has rules, but the rules don't have any
      # defined changes until after the observance starts, we get the
      # earliest standard time rule and use it. If there is none, shit
      # blows up (but this is not the case for any time zones as of
      # 2009a). I really, really hate the Olson database a lot of the
      # time! Could this be more arbitrary?
      my $std_time_rule = $self->_first_no_dst_rule;
  
      die
          q{Cannot find a rule that applies to the observance's date range and cannot find a rule without DST to apply}
          unless $std_time_rule;
  
      return $std_time_rule;
  }
  ## use critic
  
  sub _first_no_dst_rule {
      my $self = shift;
  
      return first { !$_->offset_from_std }
      sort { $a->min_year <=> $b->min_year } $self->rules;
  }
  
  1;
DATETIME_TIMEZONE_OLSONDB_OBSERVANCE

    $main::fatpacked{"DateTime/TimeZone/OlsonDB/Rule.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_OLSONDB_RULE';
  package DateTime::TimeZone::OlsonDB::Rule;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use DateTime::Duration;
  use DateTime::TimeZone::OlsonDB;
  
  sub new {
      my $class = shift;
      my %p     = @_;
  
      $p{letter} ||= q{};
  
      my $save = $p{save};
  
      # The handling of q{-} and q{1} are to account for new syntax introduced
      # in 2009u (and hopefully gone in future versions).
      if ( $save && $save ne q{-} ) {
          if ( $save =~ /^\d+$/ ) {
              $p{offset_from_std} = 3600 * $save;
          }
          else {
              $p{offset_from_std}
                  = DateTime::TimeZone::offset_as_seconds($save);
          }
      }
      else {
          $p{offset_from_std} = 0;
      }
  
      return bless \%p, $class;
  }
  
  sub name            { $_[0]->{name} }
  sub offset_from_std { $_[0]->{offset_from_std} }
  sub letter          { $_[0]->{letter} }
  sub min_year        { $_[0]->{from} }
  
  sub max_year {
            $_[0]->{to} eq 'only' ? $_[0]->min_year
          : $_[0]->{to} eq 'max'  ? undef
          :                         $_[0]->{to};
  }
  
  sub is_infinite { $_[0]->{to} eq 'max' ? 1 : 0 }
  
  sub month { $DateTime::TimeZone::OlsonDB::MONTHS{ $_[0]->{in} } }
  sub on    { $_[0]->{on} }
  sub at    { $_[0]->{at} }
  
  sub utc_start_datetime_for_year {
      my $self            = shift;
      my $year            = shift;
      my $offset_from_utc = shift;
  
      # should be the offset of the _previous_ rule
      my $offset_from_std = shift;
  
      my ( $month, $day ) = DateTime::TimeZone::OlsonDB::parse_day_spec(
          $self->on,
          $self->month,
          $year,
      );
  
      my $utc = DateTime::TimeZone::OlsonDB::utc_datetime_for_time_spec(
          spec            => $self->at,
          year            => $year,
          month           => $month,
          day             => $day,
          offset_from_utc => $offset_from_utc,
          offset_from_std => $offset_from_std,
      );
  
      return $utc;
  }
  
  1;
DATETIME_TIMEZONE_OLSONDB_RULE

    $main::fatpacked{"DateTime/TimeZone/OlsonDB/Zone.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_OLSONDB_ZONE';
  package DateTime::TimeZone::OlsonDB::Zone;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  use DateTime::TimeZone::OlsonDB::Change;
  use DateTime::TimeZone::OlsonDB::Observance;
  use List::Util qw( first max );
  
  sub new {
      my $class = shift;
      my %p     = @_;
  
      my $self = {
          name           => $p{name},
          observances    => $p{observances},
          changes        => [],
          infinite_rules => {},
      };
  
      return bless $self, $class;
  }
  
  sub name { $_[0]->{name} }
  
  sub last_rules_year {
      my $self = shift;
      my $odb  = shift;
  
      my $last_rule = $self->{observances}[-1]{rules};
  
      return unless $last_rule;
  
      my @rules = $odb->rules_by_name($last_rule);
  
      return $rules[-1]->min_year();
  }
  
  sub expand_observances {
      my $self     = shift;
      my $odb      = shift;
      my $max_year = shift;
  
      my $prev_until;
      ## no critic (ControlStructures::ProhibitCStyleForLoops)
      for ( my $x = 0; $x < @{ $self->{observances} }; $x++ ) {
          my %p = %{ $self->{observances}[$x] };
  
          my $rules_name = delete $p{rules};
  
          my $last_offset_from_std
              = $self->last_change ? $self->last_change->offset_from_std : 0;
          my $last_offset_from_utc
              = $self->last_change ? $self->last_change->offset_from_utc : 0;
  
          my $obs = DateTime::TimeZone::OlsonDB::Observance->new(
              %p,
              utc_start_datetime   => $prev_until,
              rules                => [ $odb->rules_by_name($rules_name) ],
              last_offset_from_utc => $last_offset_from_utc,
              last_offset_from_std => $last_offset_from_std,
          );
  
          my $rule   = $obs->first_rule;
          my $letter = $rule ? $rule->letter : q{};
  
          my $change = DateTime::TimeZone::OlsonDB::Change->new(
              type                 => 'observance',
              utc_start_datetime   => $obs->utc_start_datetime,
              local_start_datetime => $obs->local_start_datetime,
              short_name           => $obs->formatted_short_name($letter),
              observance           => $obs,
              $rule ? ( rule => $rule ) : (),
          );
  
          if ($DateTime::TimeZone::OlsonDB::DEBUG) {
              ## no critic (InputOutput::RequireCheckedSyscalls)
              print "Adding observance change ...\n";
  
              $change->_debug_output;
          }
  
          $self->add_change($change);
  
          if ( $obs->rules ) {
              $obs->expand_from_rules( $self, $max_year );
          }
  
          $prev_until = $obs->until(
              $self->last_change ? $self->last_change->offset_from_std : 0 );
  
          # last observance
          if ( $x == $#{ $self->{observances} } ) {
              foreach my $rule ( $obs->rules ) {
                  if ( $rule->is_infinite ) {
                      $self->add_infinite_rule($rule);
                  }
              }
          }
      }
  }
  
  sub add_change {
      my $self   = shift;
      my $change = shift;
  
      if ( defined $change->utc_start_datetime ) {
          if (   @{ $self->{changes} }
              && $self->{changes}[-1]->utc_start_datetime
              && $self->{changes}[-1]->utc_start_datetime
              == $change->utc_start_datetime ) {
              if ( $self->{changes}[-1]->rule && $change->observance ) {
                  ## no critic (InputOutput::RequireCheckedSyscalls)
                  print
                      " Ignoring previous rule change, that starts the same time as current observance change\n\n"
                      if $DateTime::TimeZone::OlsonDB::DEBUG;
  
                  $self->{changes}[-1] = $change;
  
                  return;
              }
  
              die
                  "Cannot add two different changes that have the same UTC start datetime!\n";
          }
  
          my $last_change = $self->last_change;
  
          if (   $last_change->short_name eq $change->short_name
              && $last_change->total_offset == $change->total_offset
              && $last_change->is_dst == $change->is_dst
              && $last_change->observance eq $change->observance ) {
              my $last_rule = $last_change->rule || q{};
              my $new_rule  = $change->rule      || q{};
  
              if ( $last_rule eq $new_rule ) {
                  ## no critic (InputOutput::RequireCheckedSyscalls)
                  print "Skipping identical change\n"
                      if $DateTime::TimeZone::OlsonDB::DEBUG;
  
                  return;
              }
          }
  
          push @{ $self->{changes} }, $change;
      }
      else {
          if ( $self->{earliest} ) {
              die 'There can only be one earliest time zone change!';
          }
          else {
              $self->{earliest} = $change;
          }
      }
  }
  
  sub add_infinite_rule {
      $_[0]->{infinite_rules}{ $_[1] } = $_[1];
  }
  
  sub last_change {
      return unless @{ $_[0]->{changes} } || $_[0]->{earliest};
      return (
          @{ $_[0]->{changes} }
          ? $_[0]->{changes}[-1]
          : $_[0]->{earliest}
      );
  }
  
  sub sorted_changes {
      (
          ( defined $_[0]->{earliest} ? $_[0]->{earliest} : () ),
          sort { $a->utc_start_datetime <=> $b->utc_start_datetime }
              @{ $_[0]->{changes} }
      );
  }
  
  sub infinite_rules { values %{ $_[0]->{infinite_rules} } }
  
  1;
DATETIME_TIMEZONE_OLSONDB_ZONE

    $main::fatpacked{"DateTime/TimeZone/PST8PDT.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_PST8PDT';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::PST8PDT;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::PST8PDT::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60502413600, #      utc_end 1918-03-31 10:00:00 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60502384800, #    local_end 1918-03-31 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  60502413600, #    utc_start 1918-03-31 10:00:00 (Sun)
  60520554000, #      utc_end 1918-10-27 09:00:00 (Sun)
  60502388400, #  local_start 1918-03-31 03:00:00 (Sun)
  60520528800, #    local_end 1918-10-27 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  60520554000, #    utc_start 1918-10-27 09:00:00 (Sun)
  60533863200, #      utc_end 1919-03-30 10:00:00 (Sun)
  60520525200, #  local_start 1918-10-27 01:00:00 (Sun)
  60533834400, #    local_end 1919-03-30 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  60533863200, #    utc_start 1919-03-30 10:00:00 (Sun)
  60552003600, #      utc_end 1919-10-26 09:00:00 (Sun)
  60533838000, #  local_start 1919-03-30 03:00:00 (Sun)
  60551978400, #    local_end 1919-10-26 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  60552003600, #    utc_start 1919-10-26 09:00:00 (Sun)
  61255476000, #      utc_end 1942-02-09 10:00:00 (Mon)
  60551974800, #  local_start 1919-10-26 01:00:00 (Sun)
  61255447200, #    local_end 1942-02-09 02:00:00 (Mon)
  -28800,
  0,
  'PST',
      ],
      [
  61255476000, #    utc_start 1942-02-09 10:00:00 (Mon)
  61366287600, #      utc_end 1945-08-14 23:00:00 (Tue)
  61255450800, #  local_start 1942-02-09 03:00:00 (Mon)
  61366262400, #    local_end 1945-08-14 16:00:00 (Tue)
  -25200,
  1,
  'PWT',
      ],
      [
  61366287600, #    utc_start 1945-08-14 23:00:00 (Tue)
  61370298000, #      utc_end 1945-09-30 09:00:00 (Sun)
  61366262400, #  local_start 1945-08-14 16:00:00 (Tue)
  61370272800, #    local_end 1945-09-30 02:00:00 (Sun)
  -25200,
  1,
  'PPT',
      ],
      [
  61370298000, #    utc_start 1945-09-30 09:00:00 (Sun)
  62051306400, #      utc_end 1967-04-30 10:00:00 (Sun)
  61370269200, #  local_start 1945-09-30 01:00:00 (Sun)
  62051277600, #    local_end 1967-04-30 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62051306400, #    utc_start 1967-04-30 10:00:00 (Sun)
  62067027600, #      utc_end 1967-10-29 09:00:00 (Sun)
  62051281200, #  local_start 1967-04-30 03:00:00 (Sun)
  62067002400, #    local_end 1967-10-29 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62067027600, #    utc_start 1967-10-29 09:00:00 (Sun)
  62082756000, #      utc_end 1968-04-28 10:00:00 (Sun)
  62066998800, #  local_start 1967-10-29 01:00:00 (Sun)
  62082727200, #    local_end 1968-04-28 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62082756000, #    utc_start 1968-04-28 10:00:00 (Sun)
  62098477200, #      utc_end 1968-10-27 09:00:00 (Sun)
  62082730800, #  local_start 1968-04-28 03:00:00 (Sun)
  62098452000, #    local_end 1968-10-27 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62098477200, #    utc_start 1968-10-27 09:00:00 (Sun)
  62114205600, #      utc_end 1969-04-27 10:00:00 (Sun)
  62098448400, #  local_start 1968-10-27 01:00:00 (Sun)
  62114176800, #    local_end 1969-04-27 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62114205600, #    utc_start 1969-04-27 10:00:00 (Sun)
  62129926800, #      utc_end 1969-10-26 09:00:00 (Sun)
  62114180400, #  local_start 1969-04-27 03:00:00 (Sun)
  62129901600, #    local_end 1969-10-26 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62129926800, #    utc_start 1969-10-26 09:00:00 (Sun)
  62145655200, #      utc_end 1970-04-26 10:00:00 (Sun)
  62129898000, #  local_start 1969-10-26 01:00:00 (Sun)
  62145626400, #    local_end 1970-04-26 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62145655200, #    utc_start 1970-04-26 10:00:00 (Sun)
  62161376400, #      utc_end 1970-10-25 09:00:00 (Sun)
  62145630000, #  local_start 1970-04-26 03:00:00 (Sun)
  62161351200, #    local_end 1970-10-25 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62161376400, #    utc_start 1970-10-25 09:00:00 (Sun)
  62177104800, #      utc_end 1971-04-25 10:00:00 (Sun)
  62161347600, #  local_start 1970-10-25 01:00:00 (Sun)
  62177076000, #    local_end 1971-04-25 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62177104800, #    utc_start 1971-04-25 10:00:00 (Sun)
  62193430800, #      utc_end 1971-10-31 09:00:00 (Sun)
  62177079600, #  local_start 1971-04-25 03:00:00 (Sun)
  62193405600, #    local_end 1971-10-31 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62193430800, #    utc_start 1971-10-31 09:00:00 (Sun)
  62209159200, #      utc_end 1972-04-30 10:00:00 (Sun)
  62193402000, #  local_start 1971-10-31 01:00:00 (Sun)
  62209130400, #    local_end 1972-04-30 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62209159200, #    utc_start 1972-04-30 10:00:00 (Sun)
  62224880400, #      utc_end 1972-10-29 09:00:00 (Sun)
  62209134000, #  local_start 1972-04-30 03:00:00 (Sun)
  62224855200, #    local_end 1972-10-29 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62224880400, #    utc_start 1972-10-29 09:00:00 (Sun)
  62240608800, #      utc_end 1973-04-29 10:00:00 (Sun)
  62224851600, #  local_start 1972-10-29 01:00:00 (Sun)
  62240580000, #    local_end 1973-04-29 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62240608800, #    utc_start 1973-04-29 10:00:00 (Sun)
  62256330000, #      utc_end 1973-10-28 09:00:00 (Sun)
  62240583600, #  local_start 1973-04-29 03:00:00 (Sun)
  62256304800, #    local_end 1973-10-28 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62256330000, #    utc_start 1973-10-28 09:00:00 (Sun)
  62262381600, #      utc_end 1974-01-06 10:00:00 (Sun)
  62256301200, #  local_start 1973-10-28 01:00:00 (Sun)
  62262352800, #    local_end 1974-01-06 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62262381600, #    utc_start 1974-01-06 10:00:00 (Sun)
  62287779600, #      utc_end 1974-10-27 09:00:00 (Sun)
  62262356400, #  local_start 1974-01-06 03:00:00 (Sun)
  62287754400, #    local_end 1974-10-27 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62287779600, #    utc_start 1974-10-27 09:00:00 (Sun)
  62298064800, #      utc_end 1975-02-23 10:00:00 (Sun)
  62287750800, #  local_start 1974-10-27 01:00:00 (Sun)
  62298036000, #    local_end 1975-02-23 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62298064800, #    utc_start 1975-02-23 10:00:00 (Sun)
  62319229200, #      utc_end 1975-10-26 09:00:00 (Sun)
  62298039600, #  local_start 1975-02-23 03:00:00 (Sun)
  62319204000, #    local_end 1975-10-26 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62319229200, #    utc_start 1975-10-26 09:00:00 (Sun)
  62334957600, #      utc_end 1976-04-25 10:00:00 (Sun)
  62319200400, #  local_start 1975-10-26 01:00:00 (Sun)
  62334928800, #    local_end 1976-04-25 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62334957600, #    utc_start 1976-04-25 10:00:00 (Sun)
  62351283600, #      utc_end 1976-10-31 09:00:00 (Sun)
  62334932400, #  local_start 1976-04-25 03:00:00 (Sun)
  62351258400, #    local_end 1976-10-31 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62351283600, #    utc_start 1976-10-31 09:00:00 (Sun)
  62366407200, #      utc_end 1977-04-24 10:00:00 (Sun)
  62351254800, #  local_start 1976-10-31 01:00:00 (Sun)
  62366378400, #    local_end 1977-04-24 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62366407200, #    utc_start 1977-04-24 10:00:00 (Sun)
  62382733200, #      utc_end 1977-10-30 09:00:00 (Sun)
  62366382000, #  local_start 1977-04-24 03:00:00 (Sun)
  62382708000, #    local_end 1977-10-30 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62382733200, #    utc_start 1977-10-30 09:00:00 (Sun)
  62398461600, #      utc_end 1978-04-30 10:00:00 (Sun)
  62382704400, #  local_start 1977-10-30 01:00:00 (Sun)
  62398432800, #    local_end 1978-04-30 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62398461600, #    utc_start 1978-04-30 10:00:00 (Sun)
  62414182800, #      utc_end 1978-10-29 09:00:00 (Sun)
  62398436400, #  local_start 1978-04-30 03:00:00 (Sun)
  62414157600, #    local_end 1978-10-29 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62414182800, #    utc_start 1978-10-29 09:00:00 (Sun)
  62429911200, #      utc_end 1979-04-29 10:00:00 (Sun)
  62414154000, #  local_start 1978-10-29 01:00:00 (Sun)
  62429882400, #    local_end 1979-04-29 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62429911200, #    utc_start 1979-04-29 10:00:00 (Sun)
  62445632400, #      utc_end 1979-10-28 09:00:00 (Sun)
  62429886000, #  local_start 1979-04-29 03:00:00 (Sun)
  62445607200, #    local_end 1979-10-28 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62445632400, #    utc_start 1979-10-28 09:00:00 (Sun)
  62461360800, #      utc_end 1980-04-27 10:00:00 (Sun)
  62445603600, #  local_start 1979-10-28 01:00:00 (Sun)
  62461332000, #    local_end 1980-04-27 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62461360800, #    utc_start 1980-04-27 10:00:00 (Sun)
  62477082000, #      utc_end 1980-10-26 09:00:00 (Sun)
  62461335600, #  local_start 1980-04-27 03:00:00 (Sun)
  62477056800, #    local_end 1980-10-26 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62477082000, #    utc_start 1980-10-26 09:00:00 (Sun)
  62492810400, #      utc_end 1981-04-26 10:00:00 (Sun)
  62477053200, #  local_start 1980-10-26 01:00:00 (Sun)
  62492781600, #    local_end 1981-04-26 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62492810400, #    utc_start 1981-04-26 10:00:00 (Sun)
  62508531600, #      utc_end 1981-10-25 09:00:00 (Sun)
  62492785200, #  local_start 1981-04-26 03:00:00 (Sun)
  62508506400, #    local_end 1981-10-25 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62508531600, #    utc_start 1981-10-25 09:00:00 (Sun)
  62524260000, #      utc_end 1982-04-25 10:00:00 (Sun)
  62508502800, #  local_start 1981-10-25 01:00:00 (Sun)
  62524231200, #    local_end 1982-04-25 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62524260000, #    utc_start 1982-04-25 10:00:00 (Sun)
  62540586000, #      utc_end 1982-10-31 09:00:00 (Sun)
  62524234800, #  local_start 1982-04-25 03:00:00 (Sun)
  62540560800, #    local_end 1982-10-31 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62540586000, #    utc_start 1982-10-31 09:00:00 (Sun)
  62555709600, #      utc_end 1983-04-24 10:00:00 (Sun)
  62540557200, #  local_start 1982-10-31 01:00:00 (Sun)
  62555680800, #    local_end 1983-04-24 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62555709600, #    utc_start 1983-04-24 10:00:00 (Sun)
  62572035600, #      utc_end 1983-10-30 09:00:00 (Sun)
  62555684400, #  local_start 1983-04-24 03:00:00 (Sun)
  62572010400, #    local_end 1983-10-30 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62572035600, #    utc_start 1983-10-30 09:00:00 (Sun)
  62587764000, #      utc_end 1984-04-29 10:00:00 (Sun)
  62572006800, #  local_start 1983-10-30 01:00:00 (Sun)
  62587735200, #    local_end 1984-04-29 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62587764000, #    utc_start 1984-04-29 10:00:00 (Sun)
  62603485200, #      utc_end 1984-10-28 09:00:00 (Sun)
  62587738800, #  local_start 1984-04-29 03:00:00 (Sun)
  62603460000, #    local_end 1984-10-28 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62603485200, #    utc_start 1984-10-28 09:00:00 (Sun)
  62619213600, #      utc_end 1985-04-28 10:00:00 (Sun)
  62603456400, #  local_start 1984-10-28 01:00:00 (Sun)
  62619184800, #    local_end 1985-04-28 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62619213600, #    utc_start 1985-04-28 10:00:00 (Sun)
  62634934800, #      utc_end 1985-10-27 09:00:00 (Sun)
  62619188400, #  local_start 1985-04-28 03:00:00 (Sun)
  62634909600, #    local_end 1985-10-27 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62634934800, #    utc_start 1985-10-27 09:00:00 (Sun)
  62650663200, #      utc_end 1986-04-27 10:00:00 (Sun)
  62634906000, #  local_start 1985-10-27 01:00:00 (Sun)
  62650634400, #    local_end 1986-04-27 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62650663200, #    utc_start 1986-04-27 10:00:00 (Sun)
  62666384400, #      utc_end 1986-10-26 09:00:00 (Sun)
  62650638000, #  local_start 1986-04-27 03:00:00 (Sun)
  62666359200, #    local_end 1986-10-26 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62666384400, #    utc_start 1986-10-26 09:00:00 (Sun)
  62680298400, #      utc_end 1987-04-05 10:00:00 (Sun)
  62666355600, #  local_start 1986-10-26 01:00:00 (Sun)
  62680269600, #    local_end 1987-04-05 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62680298400, #    utc_start 1987-04-05 10:00:00 (Sun)
  62697834000, #      utc_end 1987-10-25 09:00:00 (Sun)
  62680273200, #  local_start 1987-04-05 03:00:00 (Sun)
  62697808800, #    local_end 1987-10-25 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62697834000, #    utc_start 1987-10-25 09:00:00 (Sun)
  62711748000, #      utc_end 1988-04-03 10:00:00 (Sun)
  62697805200, #  local_start 1987-10-25 01:00:00 (Sun)
  62711719200, #    local_end 1988-04-03 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62711748000, #    utc_start 1988-04-03 10:00:00 (Sun)
  62729888400, #      utc_end 1988-10-30 09:00:00 (Sun)
  62711722800, #  local_start 1988-04-03 03:00:00 (Sun)
  62729863200, #    local_end 1988-10-30 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62729888400, #    utc_start 1988-10-30 09:00:00 (Sun)
  62743197600, #      utc_end 1989-04-02 10:00:00 (Sun)
  62729859600, #  local_start 1988-10-30 01:00:00 (Sun)
  62743168800, #    local_end 1989-04-02 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62743197600, #    utc_start 1989-04-02 10:00:00 (Sun)
  62761338000, #      utc_end 1989-10-29 09:00:00 (Sun)
  62743172400, #  local_start 1989-04-02 03:00:00 (Sun)
  62761312800, #    local_end 1989-10-29 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62761338000, #    utc_start 1989-10-29 09:00:00 (Sun)
  62774647200, #      utc_end 1990-04-01 10:00:00 (Sun)
  62761309200, #  local_start 1989-10-29 01:00:00 (Sun)
  62774618400, #    local_end 1990-04-01 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62774647200, #    utc_start 1990-04-01 10:00:00 (Sun)
  62792787600, #      utc_end 1990-10-28 09:00:00 (Sun)
  62774622000, #  local_start 1990-04-01 03:00:00 (Sun)
  62792762400, #    local_end 1990-10-28 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62792787600, #    utc_start 1990-10-28 09:00:00 (Sun)
  62806701600, #      utc_end 1991-04-07 10:00:00 (Sun)
  62792758800, #  local_start 1990-10-28 01:00:00 (Sun)
  62806672800, #    local_end 1991-04-07 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62806701600, #    utc_start 1991-04-07 10:00:00 (Sun)
  62824237200, #      utc_end 1991-10-27 09:00:00 (Sun)
  62806676400, #  local_start 1991-04-07 03:00:00 (Sun)
  62824212000, #    local_end 1991-10-27 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62824237200, #    utc_start 1991-10-27 09:00:00 (Sun)
  62838151200, #      utc_end 1992-04-05 10:00:00 (Sun)
  62824208400, #  local_start 1991-10-27 01:00:00 (Sun)
  62838122400, #    local_end 1992-04-05 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62838151200, #    utc_start 1992-04-05 10:00:00 (Sun)
  62855686800, #      utc_end 1992-10-25 09:00:00 (Sun)
  62838126000, #  local_start 1992-04-05 03:00:00 (Sun)
  62855661600, #    local_end 1992-10-25 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62855686800, #    utc_start 1992-10-25 09:00:00 (Sun)
  62869600800, #      utc_end 1993-04-04 10:00:00 (Sun)
  62855658000, #  local_start 1992-10-25 01:00:00 (Sun)
  62869572000, #    local_end 1993-04-04 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62869600800, #    utc_start 1993-04-04 10:00:00 (Sun)
  62887741200, #      utc_end 1993-10-31 09:00:00 (Sun)
  62869575600, #  local_start 1993-04-04 03:00:00 (Sun)
  62887716000, #    local_end 1993-10-31 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62887741200, #    utc_start 1993-10-31 09:00:00 (Sun)
  62901050400, #      utc_end 1994-04-03 10:00:00 (Sun)
  62887712400, #  local_start 1993-10-31 01:00:00 (Sun)
  62901021600, #    local_end 1994-04-03 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62901050400, #    utc_start 1994-04-03 10:00:00 (Sun)
  62919190800, #      utc_end 1994-10-30 09:00:00 (Sun)
  62901025200, #  local_start 1994-04-03 03:00:00 (Sun)
  62919165600, #    local_end 1994-10-30 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62919190800, #    utc_start 1994-10-30 09:00:00 (Sun)
  62932500000, #      utc_end 1995-04-02 10:00:00 (Sun)
  62919162000, #  local_start 1994-10-30 01:00:00 (Sun)
  62932471200, #    local_end 1995-04-02 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62932500000, #    utc_start 1995-04-02 10:00:00 (Sun)
  62950640400, #      utc_end 1995-10-29 09:00:00 (Sun)
  62932474800, #  local_start 1995-04-02 03:00:00 (Sun)
  62950615200, #    local_end 1995-10-29 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62950640400, #    utc_start 1995-10-29 09:00:00 (Sun)
  62964554400, #      utc_end 1996-04-07 10:00:00 (Sun)
  62950611600, #  local_start 1995-10-29 01:00:00 (Sun)
  62964525600, #    local_end 1996-04-07 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62964554400, #    utc_start 1996-04-07 10:00:00 (Sun)
  62982090000, #      utc_end 1996-10-27 09:00:00 (Sun)
  62964529200, #  local_start 1996-04-07 03:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  62982090000, #    utc_start 1996-10-27 09:00:00 (Sun)
  62996004000, #      utc_end 1997-04-06 10:00:00 (Sun)
  62982061200, #  local_start 1996-10-27 01:00:00 (Sun)
  62995975200, #    local_end 1997-04-06 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  62996004000, #    utc_start 1997-04-06 10:00:00 (Sun)
  63013539600, #      utc_end 1997-10-26 09:00:00 (Sun)
  62995978800, #  local_start 1997-04-06 03:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63013539600, #    utc_start 1997-10-26 09:00:00 (Sun)
  63027453600, #      utc_end 1998-04-05 10:00:00 (Sun)
  63013510800, #  local_start 1997-10-26 01:00:00 (Sun)
  63027424800, #    local_end 1998-04-05 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63027453600, #    utc_start 1998-04-05 10:00:00 (Sun)
  63044989200, #      utc_end 1998-10-25 09:00:00 (Sun)
  63027428400, #  local_start 1998-04-05 03:00:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63044989200, #    utc_start 1998-10-25 09:00:00 (Sun)
  63058903200, #      utc_end 1999-04-04 10:00:00 (Sun)
  63044960400, #  local_start 1998-10-25 01:00:00 (Sun)
  63058874400, #    local_end 1999-04-04 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63058903200, #    utc_start 1999-04-04 10:00:00 (Sun)
  63077043600, #      utc_end 1999-10-31 09:00:00 (Sun)
  63058878000, #  local_start 1999-04-04 03:00:00 (Sun)
  63077018400, #    local_end 1999-10-31 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63077043600, #    utc_start 1999-10-31 09:00:00 (Sun)
  63090352800, #      utc_end 2000-04-02 10:00:00 (Sun)
  63077014800, #  local_start 1999-10-31 01:00:00 (Sun)
  63090324000, #    local_end 2000-04-02 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63090352800, #    utc_start 2000-04-02 10:00:00 (Sun)
  63108493200, #      utc_end 2000-10-29 09:00:00 (Sun)
  63090327600, #  local_start 2000-04-02 03:00:00 (Sun)
  63108468000, #    local_end 2000-10-29 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63108493200, #    utc_start 2000-10-29 09:00:00 (Sun)
  63121802400, #      utc_end 2001-04-01 10:00:00 (Sun)
  63108464400, #  local_start 2000-10-29 01:00:00 (Sun)
  63121773600, #    local_end 2001-04-01 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63121802400, #    utc_start 2001-04-01 10:00:00 (Sun)
  63139942800, #      utc_end 2001-10-28 09:00:00 (Sun)
  63121777200, #  local_start 2001-04-01 03:00:00 (Sun)
  63139917600, #    local_end 2001-10-28 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63139942800, #    utc_start 2001-10-28 09:00:00 (Sun)
  63153856800, #      utc_end 2002-04-07 10:00:00 (Sun)
  63139914000, #  local_start 2001-10-28 01:00:00 (Sun)
  63153828000, #    local_end 2002-04-07 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63153856800, #    utc_start 2002-04-07 10:00:00 (Sun)
  63171392400, #      utc_end 2002-10-27 09:00:00 (Sun)
  63153831600, #  local_start 2002-04-07 03:00:00 (Sun)
  63171367200, #    local_end 2002-10-27 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63171392400, #    utc_start 2002-10-27 09:00:00 (Sun)
  63185306400, #      utc_end 2003-04-06 10:00:00 (Sun)
  63171363600, #  local_start 2002-10-27 01:00:00 (Sun)
  63185277600, #    local_end 2003-04-06 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63185306400, #    utc_start 2003-04-06 10:00:00 (Sun)
  63202842000, #      utc_end 2003-10-26 09:00:00 (Sun)
  63185281200, #  local_start 2003-04-06 03:00:00 (Sun)
  63202816800, #    local_end 2003-10-26 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63202842000, #    utc_start 2003-10-26 09:00:00 (Sun)
  63216756000, #      utc_end 2004-04-04 10:00:00 (Sun)
  63202813200, #  local_start 2003-10-26 01:00:00 (Sun)
  63216727200, #    local_end 2004-04-04 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63216756000, #    utc_start 2004-04-04 10:00:00 (Sun)
  63234896400, #      utc_end 2004-10-31 09:00:00 (Sun)
  63216730800, #  local_start 2004-04-04 03:00:00 (Sun)
  63234871200, #    local_end 2004-10-31 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63234896400, #    utc_start 2004-10-31 09:00:00 (Sun)
  63248205600, #      utc_end 2005-04-03 10:00:00 (Sun)
  63234867600, #  local_start 2004-10-31 01:00:00 (Sun)
  63248176800, #    local_end 2005-04-03 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63248205600, #    utc_start 2005-04-03 10:00:00 (Sun)
  63266346000, #      utc_end 2005-10-30 09:00:00 (Sun)
  63248180400, #  local_start 2005-04-03 03:00:00 (Sun)
  63266320800, #    local_end 2005-10-30 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63266346000, #    utc_start 2005-10-30 09:00:00 (Sun)
  63279655200, #      utc_end 2006-04-02 10:00:00 (Sun)
  63266317200, #  local_start 2005-10-30 01:00:00 (Sun)
  63279626400, #    local_end 2006-04-02 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63279655200, #    utc_start 2006-04-02 10:00:00 (Sun)
  63297795600, #      utc_end 2006-10-29 09:00:00 (Sun)
  63279630000, #  local_start 2006-04-02 03:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63297795600, #    utc_start 2006-10-29 09:00:00 (Sun)
  63309290400, #      utc_end 2007-03-11 10:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63309261600, #    local_end 2007-03-11 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63309290400, #    utc_start 2007-03-11 10:00:00 (Sun)
  63329850000, #      utc_end 2007-11-04 09:00:00 (Sun)
  63309265200, #  local_start 2007-03-11 03:00:00 (Sun)
  63329824800, #    local_end 2007-11-04 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63329850000, #    utc_start 2007-11-04 09:00:00 (Sun)
  63340740000, #      utc_end 2008-03-09 10:00:00 (Sun)
  63329821200, #  local_start 2007-11-04 01:00:00 (Sun)
  63340711200, #    local_end 2008-03-09 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63340740000, #    utc_start 2008-03-09 10:00:00 (Sun)
  63361299600, #      utc_end 2008-11-02 09:00:00 (Sun)
  63340714800, #  local_start 2008-03-09 03:00:00 (Sun)
  63361274400, #    local_end 2008-11-02 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63361299600, #    utc_start 2008-11-02 09:00:00 (Sun)
  63372189600, #      utc_end 2009-03-08 10:00:00 (Sun)
  63361270800, #  local_start 2008-11-02 01:00:00 (Sun)
  63372160800, #    local_end 2009-03-08 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63372189600, #    utc_start 2009-03-08 10:00:00 (Sun)
  63392749200, #      utc_end 2009-11-01 09:00:00 (Sun)
  63372164400, #  local_start 2009-03-08 03:00:00 (Sun)
  63392724000, #    local_end 2009-11-01 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63392749200, #    utc_start 2009-11-01 09:00:00 (Sun)
  63404244000, #      utc_end 2010-03-14 10:00:00 (Sun)
  63392720400, #  local_start 2009-11-01 01:00:00 (Sun)
  63404215200, #    local_end 2010-03-14 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63404244000, #    utc_start 2010-03-14 10:00:00 (Sun)
  63424803600, #      utc_end 2010-11-07 09:00:00 (Sun)
  63404218800, #  local_start 2010-03-14 03:00:00 (Sun)
  63424778400, #    local_end 2010-11-07 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63424803600, #    utc_start 2010-11-07 09:00:00 (Sun)
  63435693600, #      utc_end 2011-03-13 10:00:00 (Sun)
  63424774800, #  local_start 2010-11-07 01:00:00 (Sun)
  63435664800, #    local_end 2011-03-13 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63435693600, #    utc_start 2011-03-13 10:00:00 (Sun)
  63456253200, #      utc_end 2011-11-06 09:00:00 (Sun)
  63435668400, #  local_start 2011-03-13 03:00:00 (Sun)
  63456228000, #    local_end 2011-11-06 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63456253200, #    utc_start 2011-11-06 09:00:00 (Sun)
  63467143200, #      utc_end 2012-03-11 10:00:00 (Sun)
  63456224400, #  local_start 2011-11-06 01:00:00 (Sun)
  63467114400, #    local_end 2012-03-11 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63467143200, #    utc_start 2012-03-11 10:00:00 (Sun)
  63487702800, #      utc_end 2012-11-04 09:00:00 (Sun)
  63467118000, #  local_start 2012-03-11 03:00:00 (Sun)
  63487677600, #    local_end 2012-11-04 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63487702800, #    utc_start 2012-11-04 09:00:00 (Sun)
  63498592800, #      utc_end 2013-03-10 10:00:00 (Sun)
  63487674000, #  local_start 2012-11-04 01:00:00 (Sun)
  63498564000, #    local_end 2013-03-10 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63498592800, #    utc_start 2013-03-10 10:00:00 (Sun)
  63519152400, #      utc_end 2013-11-03 09:00:00 (Sun)
  63498567600, #  local_start 2013-03-10 03:00:00 (Sun)
  63519127200, #    local_end 2013-11-03 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63519152400, #    utc_start 2013-11-03 09:00:00 (Sun)
  63530042400, #      utc_end 2014-03-09 10:00:00 (Sun)
  63519123600, #  local_start 2013-11-03 01:00:00 (Sun)
  63530013600, #    local_end 2014-03-09 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63530042400, #    utc_start 2014-03-09 10:00:00 (Sun)
  63550602000, #      utc_end 2014-11-02 09:00:00 (Sun)
  63530017200, #  local_start 2014-03-09 03:00:00 (Sun)
  63550576800, #    local_end 2014-11-02 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63550602000, #    utc_start 2014-11-02 09:00:00 (Sun)
  63561492000, #      utc_end 2015-03-08 10:00:00 (Sun)
  63550573200, #  local_start 2014-11-02 01:00:00 (Sun)
  63561463200, #    local_end 2015-03-08 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63561492000, #    utc_start 2015-03-08 10:00:00 (Sun)
  63582051600, #      utc_end 2015-11-01 09:00:00 (Sun)
  63561466800, #  local_start 2015-03-08 03:00:00 (Sun)
  63582026400, #    local_end 2015-11-01 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63582051600, #    utc_start 2015-11-01 09:00:00 (Sun)
  63593546400, #      utc_end 2016-03-13 10:00:00 (Sun)
  63582022800, #  local_start 2015-11-01 01:00:00 (Sun)
  63593517600, #    local_end 2016-03-13 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63593546400, #    utc_start 2016-03-13 10:00:00 (Sun)
  63614106000, #      utc_end 2016-11-06 09:00:00 (Sun)
  63593521200, #  local_start 2016-03-13 03:00:00 (Sun)
  63614080800, #    local_end 2016-11-06 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63614106000, #    utc_start 2016-11-06 09:00:00 (Sun)
  63624996000, #      utc_end 2017-03-12 10:00:00 (Sun)
  63614077200, #  local_start 2016-11-06 01:00:00 (Sun)
  63624967200, #    local_end 2017-03-12 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63624996000, #    utc_start 2017-03-12 10:00:00 (Sun)
  63645555600, #      utc_end 2017-11-05 09:00:00 (Sun)
  63624970800, #  local_start 2017-03-12 03:00:00 (Sun)
  63645530400, #    local_end 2017-11-05 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63645555600, #    utc_start 2017-11-05 09:00:00 (Sun)
  63656445600, #      utc_end 2018-03-11 10:00:00 (Sun)
  63645526800, #  local_start 2017-11-05 01:00:00 (Sun)
  63656416800, #    local_end 2018-03-11 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63656445600, #    utc_start 2018-03-11 10:00:00 (Sun)
  63677005200, #      utc_end 2018-11-04 09:00:00 (Sun)
  63656420400, #  local_start 2018-03-11 03:00:00 (Sun)
  63676980000, #    local_end 2018-11-04 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63677005200, #    utc_start 2018-11-04 09:00:00 (Sun)
  63687895200, #      utc_end 2019-03-10 10:00:00 (Sun)
  63676976400, #  local_start 2018-11-04 01:00:00 (Sun)
  63687866400, #    local_end 2019-03-10 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63687895200, #    utc_start 2019-03-10 10:00:00 (Sun)
  63708454800, #      utc_end 2019-11-03 09:00:00 (Sun)
  63687870000, #  local_start 2019-03-10 03:00:00 (Sun)
  63708429600, #    local_end 2019-11-03 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63708454800, #    utc_start 2019-11-03 09:00:00 (Sun)
  63719344800, #      utc_end 2020-03-08 10:00:00 (Sun)
  63708426000, #  local_start 2019-11-03 01:00:00 (Sun)
  63719316000, #    local_end 2020-03-08 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63719344800, #    utc_start 2020-03-08 10:00:00 (Sun)
  63739904400, #      utc_end 2020-11-01 09:00:00 (Sun)
  63719319600, #  local_start 2020-03-08 03:00:00 (Sun)
  63739879200, #    local_end 2020-11-01 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63739904400, #    utc_start 2020-11-01 09:00:00 (Sun)
  63751399200, #      utc_end 2021-03-14 10:00:00 (Sun)
  63739875600, #  local_start 2020-11-01 01:00:00 (Sun)
  63751370400, #    local_end 2021-03-14 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63751399200, #    utc_start 2021-03-14 10:00:00 (Sun)
  63771958800, #      utc_end 2021-11-07 09:00:00 (Sun)
  63751374000, #  local_start 2021-03-14 03:00:00 (Sun)
  63771933600, #    local_end 2021-11-07 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63771958800, #    utc_start 2021-11-07 09:00:00 (Sun)
  63782848800, #      utc_end 2022-03-13 10:00:00 (Sun)
  63771930000, #  local_start 2021-11-07 01:00:00 (Sun)
  63782820000, #    local_end 2022-03-13 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63782848800, #    utc_start 2022-03-13 10:00:00 (Sun)
  63803408400, #      utc_end 2022-11-06 09:00:00 (Sun)
  63782823600, #  local_start 2022-03-13 03:00:00 (Sun)
  63803383200, #    local_end 2022-11-06 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63803408400, #    utc_start 2022-11-06 09:00:00 (Sun)
  63814298400, #      utc_end 2023-03-12 10:00:00 (Sun)
  63803379600, #  local_start 2022-11-06 01:00:00 (Sun)
  63814269600, #    local_end 2023-03-12 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63814298400, #    utc_start 2023-03-12 10:00:00 (Sun)
  63834858000, #      utc_end 2023-11-05 09:00:00 (Sun)
  63814273200, #  local_start 2023-03-12 03:00:00 (Sun)
  63834832800, #    local_end 2023-11-05 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63834858000, #    utc_start 2023-11-05 09:00:00 (Sun)
  63845748000, #      utc_end 2024-03-10 10:00:00 (Sun)
  63834829200, #  local_start 2023-11-05 01:00:00 (Sun)
  63845719200, #    local_end 2024-03-10 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63845748000, #    utc_start 2024-03-10 10:00:00 (Sun)
  63866307600, #      utc_end 2024-11-03 09:00:00 (Sun)
  63845722800, #  local_start 2024-03-10 03:00:00 (Sun)
  63866282400, #    local_end 2024-11-03 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63866307600, #    utc_start 2024-11-03 09:00:00 (Sun)
  63877197600, #      utc_end 2025-03-09 10:00:00 (Sun)
  63866278800, #  local_start 2024-11-03 01:00:00 (Sun)
  63877168800, #    local_end 2025-03-09 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63877197600, #    utc_start 2025-03-09 10:00:00 (Sun)
  63897757200, #      utc_end 2025-11-02 09:00:00 (Sun)
  63877172400, #  local_start 2025-03-09 03:00:00 (Sun)
  63897732000, #    local_end 2025-11-02 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63897757200, #    utc_start 2025-11-02 09:00:00 (Sun)
  63908647200, #      utc_end 2026-03-08 10:00:00 (Sun)
  63897728400, #  local_start 2025-11-02 01:00:00 (Sun)
  63908618400, #    local_end 2026-03-08 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63908647200, #    utc_start 2026-03-08 10:00:00 (Sun)
  63929206800, #      utc_end 2026-11-01 09:00:00 (Sun)
  63908622000, #  local_start 2026-03-08 03:00:00 (Sun)
  63929181600, #    local_end 2026-11-01 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63929206800, #    utc_start 2026-11-01 09:00:00 (Sun)
  63940701600, #      utc_end 2027-03-14 10:00:00 (Sun)
  63929178000, #  local_start 2026-11-01 01:00:00 (Sun)
  63940672800, #    local_end 2027-03-14 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63940701600, #    utc_start 2027-03-14 10:00:00 (Sun)
  63961261200, #      utc_end 2027-11-07 09:00:00 (Sun)
  63940676400, #  local_start 2027-03-14 03:00:00 (Sun)
  63961236000, #    local_end 2027-11-07 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63961261200, #    utc_start 2027-11-07 09:00:00 (Sun)
  63972151200, #      utc_end 2028-03-12 10:00:00 (Sun)
  63961232400, #  local_start 2027-11-07 01:00:00 (Sun)
  63972122400, #    local_end 2028-03-12 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  63972151200, #    utc_start 2028-03-12 10:00:00 (Sun)
  63992710800, #      utc_end 2028-11-05 09:00:00 (Sun)
  63972126000, #  local_start 2028-03-12 03:00:00 (Sun)
  63992685600, #    local_end 2028-11-05 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  63992710800, #    utc_start 2028-11-05 09:00:00 (Sun)
  64003600800, #      utc_end 2029-03-11 10:00:00 (Sun)
  63992682000, #  local_start 2028-11-05 01:00:00 (Sun)
  64003572000, #    local_end 2029-03-11 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  64003600800, #    utc_start 2029-03-11 10:00:00 (Sun)
  64024160400, #      utc_end 2029-11-04 09:00:00 (Sun)
  64003575600, #  local_start 2029-03-11 03:00:00 (Sun)
  64024135200, #    local_end 2029-11-04 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
      [
  64024160400, #    utc_start 2029-11-04 09:00:00 (Sun)
  64035050400, #      utc_end 2030-03-10 10:00:00 (Sun)
  64024131600, #  local_start 2029-11-04 01:00:00 (Sun)
  64035021600, #    local_end 2030-03-10 02:00:00 (Sun)
  -28800,
  0,
  'PST',
      ],
      [
  64035050400, #    utc_start 2030-03-10 10:00:00 (Sun)
  64055610000, #      utc_end 2030-11-03 09:00:00 (Sun)
  64035025200, #  local_start 2030-03-10 03:00:00 (Sun)
  64055584800, #    local_end 2030-11-03 02:00:00 (Sun)
  -25200,
  1,
  'PDT',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {68}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -28800 }
  
  my $last_observance = bless( {
    'format' => 'P%sT',
    'gmtoff' => '-8:00',
    'local_start_datetime' => {},
    'offset_from_std' => 0,
    'offset_from_utc' => -28800,
    'until' => [],
    'utc_start_datetime' => {}
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Mar',
      'letter' => 'D',
      'name' => 'US',
      'offset_from_std' => 3600,
      'on' => 'Sun>=8',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00',
      'from' => '2007',
      'in' => 'Nov',
      'letter' => 'S',
      'name' => 'US',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_PST8PDT

    $main::fatpacked{"DateTime/TimeZone/Pacific/Apia.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_PACIFIC_APIA';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/australasia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Pacific::Apia;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Pacific::Apia::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59690258816, #      utc_end 1892-07-04 11:26:56 (Mon)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59690304000, #    local_end 1892-07-05 00:00:00 (Tue)
  45184,
  0,
  'LMT',
      ],
      [
  59690258816, #    utc_start 1892-07-04 11:26:56 (Mon)
  60273804416, #      utc_end 1911-01-01 11:26:56 (Sun)
  59690217600, #  local_start 1892-07-04 00:00:00 (Mon)
  60273763200, #    local_end 1911-01-01 00:00:00 (Sun)
  -41216,
  0,
  'LMT',
      ],
      [
  60273804416, #    utc_start 1911-01-01 11:26:56 (Sun)
  61504572600, #      utc_end 1950-01-01 11:30:00 (Sun)
  60273763016, #  local_start 1910-12-31 23:56:56 (Sat)
  61504531200, #    local_end 1950-01-01 00:00:00 (Sun)
  -41400,
  0,
  '-1130',
      ],
      [
  61504572600, #    utc_start 1950-01-01 11:30:00 (Sun)
  63421182000, #      utc_end 2010-09-26 11:00:00 (Sun)
  61504533000, #  local_start 1950-01-01 00:30:00 (Sun)
  63421142400, #    local_end 2010-09-26 00:00:00 (Sun)
  -39600,
  0,
  '-11',
      ],
      [
  63421182000, #    utc_start 2010-09-26 11:00:00 (Sun)
  63437436000, #      utc_end 2011-04-02 14:00:00 (Sat)
  63421146000, #  local_start 2010-09-26 01:00:00 (Sun)
  63437400000, #    local_end 2011-04-02 04:00:00 (Sat)
  -36000,
  1,
  '-10',
      ],
      [
  63437436000, #    utc_start 2011-04-02 14:00:00 (Sat)
  63452556000, #      utc_end 2011-09-24 14:00:00 (Sat)
  63437396400, #  local_start 2011-04-02 03:00:00 (Sat)
  63452516400, #    local_end 2011-09-24 03:00:00 (Sat)
  -39600,
  0,
  '-11',
      ],
      [
  63452556000, #    utc_start 2011-09-24 14:00:00 (Sat)
  63460922400, #      utc_end 2011-12-30 10:00:00 (Fri)
  63452520000, #  local_start 2011-09-24 04:00:00 (Sat)
  63460886400, #    local_end 2011-12-30 00:00:00 (Fri)
  -36000,
  1,
  '-10',
      ],
      [
  63460922400, #    utc_start 2011-12-30 10:00:00 (Fri)
  63468885600, #      utc_end 2012-03-31 14:00:00 (Sat)
  63460972800, #  local_start 2011-12-31 00:00:00 (Sat)
  63468936000, #    local_end 2012-04-01 04:00:00 (Sun)
  50400,
  1,
  '+14',
      ],
      [
  63468885600, #    utc_start 2012-03-31 14:00:00 (Sat)
  63484610400, #      utc_end 2012-09-29 14:00:00 (Sat)
  63468932400, #  local_start 2012-04-01 03:00:00 (Sun)
  63484657200, #    local_end 2012-09-30 03:00:00 (Sun)
  46800,
  0,
  '+13',
      ],
      [
  63484610400, #    utc_start 2012-09-29 14:00:00 (Sat)
  63500940000, #      utc_end 2013-04-06 14:00:00 (Sat)
  63484660800, #  local_start 2012-09-30 04:00:00 (Sun)
  63500990400, #    local_end 2013-04-07 04:00:00 (Sun)
  50400,
  1,
  '+14',
      ],
      [
  63500940000, #    utc_start 2013-04-06 14:00:00 (Sat)
  63516060000, #      utc_end 2013-09-28 14:00:00 (Sat)
  63500986800, #  local_start 2013-04-07 03:00:00 (Sun)
  63516106800, #    local_end 2013-09-29 03:00:00 (Sun)
  46800,
  0,
  '+13',
      ],
      [
  63516060000, #    utc_start 2013-09-28 14:00:00 (Sat)
  63532389600, #      utc_end 2014-04-05 14:00:00 (Sat)
  63516110400, #  local_start 2013-09-29 04:00:00 (Sun)
  63532440000, #    local_end 2014-04-06 04:00:00 (Sun)
  50400,
  1,
  '+14',
      ],
      [
  63532389600, #    utc_start 2014-04-05 14:00:00 (Sat)
  63547509600, #      utc_end 2014-09-27 14:00:00 (Sat)
  63532436400, #  local_start 2014-04-06 03:00:00 (Sun)
  63547556400, #    local_end 2014-09-28 03:00:00 (Sun)
  46800,
  0,
  '+13',
      ],
      [
  63547509600, #    utc_start 2014-09-27 14:00:00 (Sat)
  63563839200, #      utc_end 2015-04-04 14:00:00 (Sat)
  63547560000, #  local_start 2014-09-28 04:00:00 (Sun)
  63563889600, #    local_end 2015-04-05 04:00:00 (Sun)
  50400,
  1,
  '+14',
      ],
      [
  63563839200, #    utc_start 2015-04-04 14:00:00 (Sat)
  63578959200, #      utc_end 2015-09-26 14:00:00 (Sat)
  63563886000, #  local_start 2015-04-05 03:00:00 (Sun)
  63579006000, #    local_end 2015-09-27 03:00:00 (Sun)
  46800,
  0,
  '+13',
      ],
      [
  63578959200, #    utc_start 2015-09-26 14:00:00 (Sat)
  63595288800, #      utc_end 2016-04-02 14:00:00 (Sat)
  63579009600, #  local_start 2015-09-27 04:00:00 (Sun)
  63595339200, #    local_end 2016-04-03 04:00:00 (Sun)
  50400,
  1,
  '+14',
      ],
      [
  63595288800, #    utc_start 2016-04-02 14:00:00 (Sat)
  63610408800, #      utc_end 2016-09-24 14:00:00 (Sat)
  63595335600, #  local_start 2016-04-03 03:00:00 (Sun)
  63610455600, #    local_end 2016-09-25 03:00:00 (Sun)
  46800,
  0,
  '+13',
      ],
      [
  63610408800, #    utc_start 2016-09-24 14:00:00 (Sat)
  63626738400, #      utc_end 2017-04-01 14:00:00 (Sat)
  63610459200, #  local_start 2016-09-25 04:00:00 (Sun)
  63626788800, #    local_end 2017-04-02 04:00:00 (Sun)
  50400,
  1,
  '+14',
      ],
      [
  63626738400, #    utc_start 2017-04-01 14:00:00 (Sat)
  63641858400, #      utc_end 2017-09-23 14:00:00 (Sat)
  63626785200, #  local_start 2017-04-02 03:00:00 (Sun)
  63641905200, #    local_end 2017-09-24 03:00:00 (Sun)
  46800,
  0,
  '+13',
      ],
      [
  63641858400, #    utc_start 2017-09-23 14:00:00 (Sat)
  63658188000, #      utc_end 2018-03-31 14:00:00 (Sat)
  63641908800, #  local_start 2017-09-24 04:00:00 (Sun)
  63658238400, #    local_end 2018-04-01 04:00:00 (Sun)
  50400,
  1,
  '+14',
      ],
      [
  63658188000, #    utc_start 2018-03-31 14:00:00 (Sat)
  63673912800, #      utc_end 2018-09-29 14:00:00 (Sat)
  63658234800, #  local_start 2018-04-01 03:00:00 (Sun)
  63673959600, #    local_end 2018-09-30 03:00:00 (Sun)
  46800,
  0,
  '+13',
      ],
      [
  63673912800, #    utc_start 2018-09-29 14:00:00 (Sat)
  63690242400, #      utc_end 2019-04-06 14:00:00 (Sat)
  63673963200, #  local_start 2018-09-30 04:00:00 (Sun)
  63690292800, #    local_end 2019-04-07 04:00:00 (Sun)
  50400,
  1,
  '+14',
      ],
      [
  63690242400, #    utc_start 2019-04-06 14:00:00 (Sat)
  63705362400, #      utc_end 2019-09-28 14:00:00 (Sat)
  63690289200, #  local_start 2019-04-07 03:00:00 (Sun)
  63705409200, #    local_end 2019-09-29 03:00:00 (Sun)
  46800,
  0,
  '+13',
      ],
      [
  63705362400, #    utc_start 2019-09-28 14:00:00 (Sat)
  63721692000, #      utc_end 2020-04-04 14:00:00 (Sat)
  63705412800, #  local_start 2019-09-29 04:00:00 (Sun)
  63721742400, #    local_end 2020-04-05 04:00:00 (Sun)
  50400,
  1,
  '+14',
      ],
      [
  63721692000, #    utc_start 2020-04-04 14:00:00 (Sat)
  63736812000, #      utc_end 2020-09-26 14:00:00 (Sat)
  63721738800, #  local_start 2020-04-05 03:00:00 (Sun)
  63736858800, #    local_end 2020-09-27 03:00:00 (Sun)
  46800,
  0,
  '+13',
      ],
      [
  63736812000, #    utc_start 2020-09-26 14:00:00 (Sat)
  63753141600, #      utc_end 2021-04-03 14:00:00 (Sat)
  63736862400, #  local_start 2020-09-27 04:00:00 (Sun)
  63753192000, #    local_end 2021-04-04 04:00:00 (Sun)
  50400,
  1,
  '+14',
      ],
      [
  63753141600, #    utc_start 2021-04-03 14:00:00 (Sat)
  63768261600, #      utc_end 2021-09-25 14:00:00 (Sat)
  63753188400, #  local_start 2021-04-04 03:00:00 (Sun)
  63768308400, #    local_end 2021-09-26 03:00:00 (Sun)
  46800,
  0,
  '+13',
      ],
      [
  63768261600, #    utc_start 2021-09-25 14:00:00 (Sat)
  63784591200, #      utc_end 2022-04-02 14:00:00 (Sat)
  63768312000, #  local_start 2021-09-26 04:00:00 (Sun)
  63784641600, #    local_end 2022-04-03 04:00:00 (Sun)
  50400,
  1,
  '+14',
      ],
      [
  63784591200, #    utc_start 2022-04-02 14:00:00 (Sat)
  63799711200, #      utc_end 2022-09-24 14:00:00 (Sat)
  63784638000, #  local_start 2022-04-03 03:00:00 (Sun)
  63799758000, #    local_end 2022-09-25 03:00:00 (Sun)
  46800,
  0,
  '+13',
      ],
      [
  63799711200, #    utc_start 2022-09-24 14:00:00 (Sat)
  63816040800, #      utc_end 2023-04-01 14:00:00 (Sat)
  63799761600, #  local_start 2022-09-25 04:00:00 (Sun)
  63816091200, #    local_end 2023-04-02 04:00:00 (Sun)
  50400,
  1,
  '+14',
      ],
      [
  63816040800, #    utc_start 2023-04-01 14:00:00 (Sat)
  63831160800, #      utc_end 2023-09-23 14:00:00 (Sat)
  63816087600, #  local_start 2023-04-02 03:00:00 (Sun)
  63831207600, #    local_end 2023-09-24 03:00:00 (Sun)
  46800,
  0,
  '+13',
      ],
      [
  63831160800, #    utc_start 2023-09-23 14:00:00 (Sat)
  63848095200, #      utc_end 2024-04-06 14:00:00 (Sat)
  63831211200, #  local_start 2023-09-24 04:00:00 (Sun)
  63848145600, #    local_end 2024-04-07 04:00:00 (Sun)
  50400,
  1,
  '+14',
      ],
      [
  63848095200, #    utc_start 2024-04-06 14:00:00 (Sat)
  63863215200, #      utc_end 2024-09-28 14:00:00 (Sat)
  63848142000, #  local_start 2024-04-07 03:00:00 (Sun)
  63863262000, #    local_end 2024-09-29 03:00:00 (Sun)
  46800,
  0,
  '+13',
      ],
      [
  63863215200, #    utc_start 2024-09-28 14:00:00 (Sat)
  63879544800, #      utc_end 2025-04-05 14:00:00 (Sat)
  63863265600, #  local_start 2024-09-29 04:00:00 (Sun)
  63879595200, #    local_end 2025-04-06 04:00:00 (Sun)
  50400,
  1,
  '+14',
      ],
      [
  63879544800, #    utc_start 2025-04-05 14:00:00 (Sat)
  63894664800, #      utc_end 2025-09-27 14:00:00 (Sat)
  63879591600, #  local_start 2025-04-06 03:00:00 (Sun)
  63894711600, #    local_end 2025-09-28 03:00:00 (Sun)
  46800,
  0,
  '+13',
      ],
      [
  63894664800, #    utc_start 2025-09-27 14:00:00 (Sat)
  63910994400, #      utc_end 2026-04-04 14:00:00 (Sat)
  63894715200, #  local_start 2025-09-28 04:00:00 (Sun)
  63911044800, #    local_end 2026-04-05 04:00:00 (Sun)
  50400,
  1,
  '+14',
      ],
      [
  63910994400, #    utc_start 2026-04-04 14:00:00 (Sat)
  63926114400, #      utc_end 2026-09-26 14:00:00 (Sat)
  63911041200, #  local_start 2026-04-05 03:00:00 (Sun)
  63926161200, #    local_end 2026-09-27 03:00:00 (Sun)
  46800,
  0,
  '+13',
      ],
      [
  63926114400, #    utc_start 2026-09-26 14:00:00 (Sat)
  63942444000, #      utc_end 2027-04-03 14:00:00 (Sat)
  63926164800, #  local_start 2026-09-27 04:00:00 (Sun)
  63942494400, #    local_end 2027-04-04 04:00:00 (Sun)
  50400,
  1,
  '+14',
      ],
      [
  63942444000, #    utc_start 2027-04-03 14:00:00 (Sat)
  63957564000, #      utc_end 2027-09-25 14:00:00 (Sat)
  63942490800, #  local_start 2027-04-04 03:00:00 (Sun)
  63957610800, #    local_end 2027-09-26 03:00:00 (Sun)
  46800,
  0,
  '+13',
      ],
      [
  63957564000, #    utc_start 2027-09-25 14:00:00 (Sat)
  63973893600, #      utc_end 2028-04-01 14:00:00 (Sat)
  63957614400, #  local_start 2027-09-26 04:00:00 (Sun)
  63973944000, #    local_end 2028-04-02 04:00:00 (Sun)
  50400,
  1,
  '+14',
      ],
      [
  63973893600, #    utc_start 2028-04-01 14:00:00 (Sat)
  63989013600, #      utc_end 2028-09-23 14:00:00 (Sat)
  63973940400, #  local_start 2028-04-02 03:00:00 (Sun)
  63989060400, #    local_end 2028-09-24 03:00:00 (Sun)
  46800,
  0,
  '+13',
      ],
      [
  63989013600, #    utc_start 2028-09-23 14:00:00 (Sat)
  64005343200, #      utc_end 2029-03-31 14:00:00 (Sat)
  63989064000, #  local_start 2028-09-24 04:00:00 (Sun)
  64005393600, #    local_end 2029-04-01 04:00:00 (Sun)
  50400,
  1,
  '+14',
      ],
      [
  64005343200, #    utc_start 2029-03-31 14:00:00 (Sat)
  64021068000, #      utc_end 2029-09-29 14:00:00 (Sat)
  64005390000, #  local_start 2029-04-01 03:00:00 (Sun)
  64021114800, #    local_end 2029-09-30 03:00:00 (Sun)
  46800,
  0,
  '+13',
      ],
      [
  64021068000, #    utc_start 2029-09-29 14:00:00 (Sat)
  64037397600, #      utc_end 2030-04-06 14:00:00 (Sat)
  64021118400, #  local_start 2029-09-30 04:00:00 (Sun)
  64037448000, #    local_end 2030-04-07 04:00:00 (Sun)
  50400,
  1,
  '+14',
      ],
      [
  64037397600, #    utc_start 2030-04-06 14:00:00 (Sat)
  64052517600, #      utc_end 2030-09-28 14:00:00 (Sat)
  64037444400, #  local_start 2030-04-07 03:00:00 (Sun)
  64052564400, #    local_end 2030-09-29 03:00:00 (Sun)
  46800,
  0,
  '+13',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {22}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { 46800 }
  
  my $last_observance = bless( {
    'format' => '+13/+14',
    'gmtoff' => '13:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 734502,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 734502,
      'utc_rd_secs' => 0,
      'utc_year' => 2012
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => 46800,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 734501,
      'local_rd_secs' => 36000,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 734501,
      'utc_rd_secs' => 36000,
      'utc_year' => 2012
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '4:00',
      'from' => '2012',
      'in' => 'Apr',
      'letter' => '',
      'name' => 'WS',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '3:00',
      'from' => '2012',
      'in' => 'Sep',
      'letter' => '',
      'name' => 'WS',
      'offset_from_std' => 3600,
      'on' => 'lastSun',
      'save' => '1',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_PACIFIC_APIA

    $main::fatpacked{"DateTime/TimeZone/Pacific/Auckland.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_PACIFIC_AUCKLAND';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/australasia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Pacific::Auckland;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Pacific::Auckland::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  58943247656, #      utc_end 1868-11-01 12:20:56 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  58943289600, #    local_end 1868-11-02 00:00:00 (Mon)
  41944,
  0,
  'LMT',
      ],
      [
  58943247656, #    utc_start 1868-11-01 12:20:56 (Sun)
  60805348200, #      utc_end 1927-11-05 14:30:00 (Sat)
  58943289056, #  local_start 1868-11-01 23:50:56 (Sun)
  60805389600, #    local_end 1927-11-06 02:00:00 (Sun)
  41400,
  0,
  'NZMT',
      ],
      [
  60805348200, #    utc_start 1927-11-05 14:30:00 (Sat)
  60815626200, #      utc_end 1928-03-03 13:30:00 (Sat)
  60805393200, #  local_start 1927-11-06 03:00:00 (Sun)
  60815671200, #    local_end 1928-03-04 02:00:00 (Sun)
  45000,
  1,
  'NZST',
      ],
      [
  60815626200, #    utc_start 1928-03-03 13:30:00 (Sat)
  60834983400, #      utc_end 1928-10-13 14:30:00 (Sat)
  60815667600, #  local_start 1928-03-04 01:00:00 (Sun)
  60835024800, #    local_end 1928-10-14 02:00:00 (Sun)
  41400,
  0,
  'NZMT',
      ],
      [
  60834983400, #    utc_start 1928-10-13 14:30:00 (Sat)
  60848287200, #      utc_end 1929-03-16 14:00:00 (Sat)
  60835026600, #  local_start 1928-10-14 02:30:00 (Sun)
  60848330400, #    local_end 1929-03-17 02:00:00 (Sun)
  43200,
  1,
  'NZST',
      ],
      [
  60848287200, #    utc_start 1929-03-16 14:00:00 (Sat)
  60866433000, #      utc_end 1929-10-12 14:30:00 (Sat)
  60848328600, #  local_start 1929-03-17 01:30:00 (Sun)
  60866474400, #    local_end 1929-10-13 02:00:00 (Sun)
  41400,
  0,
  'NZMT',
      ],
      [
  60866433000, #    utc_start 1929-10-12 14:30:00 (Sat)
  60879736800, #      utc_end 1930-03-15 14:00:00 (Sat)
  60866476200, #  local_start 1929-10-13 02:30:00 (Sun)
  60879780000, #    local_end 1930-03-16 02:00:00 (Sun)
  43200,
  1,
  'NZST',
      ],
      [
  60879736800, #    utc_start 1930-03-15 14:00:00 (Sat)
  60897882600, #      utc_end 1930-10-11 14:30:00 (Sat)
  60879778200, #  local_start 1930-03-16 01:30:00 (Sun)
  60897924000, #    local_end 1930-10-12 02:00:00 (Sun)
  41400,
  0,
  'NZMT',
      ],
      [
  60897882600, #    utc_start 1930-10-11 14:30:00 (Sat)
  60911186400, #      utc_end 1931-03-14 14:00:00 (Sat)
  60897925800, #  local_start 1930-10-12 02:30:00 (Sun)
  60911229600, #    local_end 1931-03-15 02:00:00 (Sun)
  43200,
  1,
  'NZST',
      ],
      [
  60911186400, #    utc_start 1931-03-14 14:00:00 (Sat)
  60929332200, #      utc_end 1931-10-10 14:30:00 (Sat)
  60911227800, #  local_start 1931-03-15 01:30:00 (Sun)
  60929373600, #    local_end 1931-10-11 02:00:00 (Sun)
  41400,
  0,
  'NZMT',
      ],
      [
  60929332200, #    utc_start 1931-10-10 14:30:00 (Sat)
  60943240800, #      utc_end 1932-03-19 14:00:00 (Sat)
  60929375400, #  local_start 1931-10-11 02:30:00 (Sun)
  60943284000, #    local_end 1932-03-20 02:00:00 (Sun)
  43200,
  1,
  'NZST',
      ],
      [
  60943240800, #    utc_start 1932-03-19 14:00:00 (Sat)
  60960781800, #      utc_end 1932-10-08 14:30:00 (Sat)
  60943282200, #  local_start 1932-03-20 01:30:00 (Sun)
  60960823200, #    local_end 1932-10-09 02:00:00 (Sun)
  41400,
  0,
  'NZMT',
      ],
      [
  60960781800, #    utc_start 1932-10-08 14:30:00 (Sat)
  60974690400, #      utc_end 1933-03-18 14:00:00 (Sat)
  60960825000, #  local_start 1932-10-09 02:30:00 (Sun)
  60974733600, #    local_end 1933-03-19 02:00:00 (Sun)
  43200,
  1,
  'NZST',
      ],
      [
  60974690400, #    utc_start 1933-03-18 14:00:00 (Sat)
  60992231400, #      utc_end 1933-10-07 14:30:00 (Sat)
  60974731800, #  local_start 1933-03-19 01:30:00 (Sun)
  60992272800, #    local_end 1933-10-08 02:00:00 (Sun)
  41400,
  0,
  'NZMT',
      ],
      [
  60992231400, #    utc_start 1933-10-07 14:30:00 (Sat)
  61009768800, #      utc_end 1934-04-28 14:00:00 (Sat)
  60992274600, #  local_start 1933-10-08 02:30:00 (Sun)
  61009812000, #    local_end 1934-04-29 02:00:00 (Sun)
  43200,
  1,
  'NZST',
      ],
      [
  61009768800, #    utc_start 1934-04-28 14:00:00 (Sat)
  61023076200, #      utc_end 1934-09-29 14:30:00 (Sat)
  61009810200, #  local_start 1934-04-29 01:30:00 (Sun)
  61023117600, #    local_end 1934-09-30 02:00:00 (Sun)
  41400,
  0,
  'NZMT',
      ],
      [
  61023076200, #    utc_start 1934-09-29 14:30:00 (Sat)
  61041218400, #      utc_end 1935-04-27 14:00:00 (Sat)
  61023119400, #  local_start 1934-09-30 02:30:00 (Sun)
  61041261600, #    local_end 1935-04-28 02:00:00 (Sun)
  43200,
  1,
  'NZST',
      ],
      [
  61041218400, #    utc_start 1935-04-27 14:00:00 (Sat)
  61054525800, #      utc_end 1935-09-28 14:30:00 (Sat)
  61041259800, #  local_start 1935-04-28 01:30:00 (Sun)
  61054567200, #    local_end 1935-09-29 02:00:00 (Sun)
  41400,
  0,
  'NZMT',
      ],
      [
  61054525800, #    utc_start 1935-09-28 14:30:00 (Sat)
  61072668000, #      utc_end 1936-04-25 14:00:00 (Sat)
  61054569000, #  local_start 1935-09-29 02:30:00 (Sun)
  61072711200, #    local_end 1936-04-26 02:00:00 (Sun)
  43200,
  1,
  'NZST',
      ],
      [
  61072668000, #    utc_start 1936-04-25 14:00:00 (Sat)
  61085975400, #      utc_end 1936-09-26 14:30:00 (Sat)
  61072709400, #  local_start 1936-04-26 01:30:00 (Sun)
  61086016800, #    local_end 1936-09-27 02:00:00 (Sun)
  41400,
  0,
  'NZMT',
      ],
      [
  61085975400, #    utc_start 1936-09-26 14:30:00 (Sat)
  61104117600, #      utc_end 1937-04-24 14:00:00 (Sat)
  61086018600, #  local_start 1936-09-27 02:30:00 (Sun)
  61104160800, #    local_end 1937-04-25 02:00:00 (Sun)
  43200,
  1,
  'NZST',
      ],
      [
  61104117600, #    utc_start 1937-04-24 14:00:00 (Sat)
  61117425000, #      utc_end 1937-09-25 14:30:00 (Sat)
  61104159000, #  local_start 1937-04-25 01:30:00 (Sun)
  61117466400, #    local_end 1937-09-26 02:00:00 (Sun)
  41400,
  0,
  'NZMT',
      ],
      [
  61117425000, #    utc_start 1937-09-25 14:30:00 (Sat)
  61135567200, #      utc_end 1938-04-23 14:00:00 (Sat)
  61117468200, #  local_start 1937-09-26 02:30:00 (Sun)
  61135610400, #    local_end 1938-04-24 02:00:00 (Sun)
  43200,
  1,
  'NZST',
      ],
      [
  61135567200, #    utc_start 1938-04-23 14:00:00 (Sat)
  61148874600, #      utc_end 1938-09-24 14:30:00 (Sat)
  61135608600, #  local_start 1938-04-24 01:30:00 (Sun)
  61148916000, #    local_end 1938-09-25 02:00:00 (Sun)
  41400,
  0,
  'NZMT',
      ],
      [
  61148874600, #    utc_start 1938-09-24 14:30:00 (Sat)
  61167621600, #      utc_end 1939-04-29 14:00:00 (Sat)
  61148917800, #  local_start 1938-09-25 02:30:00 (Sun)
  61167664800, #    local_end 1939-04-30 02:00:00 (Sun)
  43200,
  1,
  'NZST',
      ],
      [
  61167621600, #    utc_start 1939-04-29 14:00:00 (Sat)
  61180324200, #      utc_end 1939-09-23 14:30:00 (Sat)
  61167663000, #  local_start 1939-04-30 01:30:00 (Sun)
  61180365600, #    local_end 1939-09-24 02:00:00 (Sun)
  41400,
  0,
  'NZMT',
      ],
      [
  61180324200, #    utc_start 1939-09-23 14:30:00 (Sat)
  61199071200, #      utc_end 1940-04-27 14:00:00 (Sat)
  61180367400, #  local_start 1939-09-24 02:30:00 (Sun)
  61199114400, #    local_end 1940-04-28 02:00:00 (Sun)
  43200,
  1,
  'NZST',
      ],
      [
  61199071200, #    utc_start 1940-04-27 14:00:00 (Sat)
  61212378600, #      utc_end 1940-09-28 14:30:00 (Sat)
  61199112600, #  local_start 1940-04-28 01:30:00 (Sun)
  61212420000, #    local_end 1940-09-29 02:00:00 (Sun)
  41400,
  0,
  'NZMT',
      ],
      [
  61212378600, #    utc_start 1940-09-28 14:30:00 (Sat)
  61378257600, #      utc_end 1945-12-31 12:00:00 (Mon)
  61212421800, #  local_start 1940-09-29 02:30:00 (Sun)
  61378300800, #    local_end 1946-01-01 00:00:00 (Tue)
  43200,
  1,
  'NZST',
      ],
      [
  61378257600, #    utc_start 1945-12-31 12:00:00 (Mon)
  62288316000, #      utc_end 1974-11-02 14:00:00 (Sat)
  61378300800, #  local_start 1946-01-01 00:00:00 (Tue)
  62288359200, #    local_end 1974-11-03 02:00:00 (Sun)
  43200,
  0,
  'NZST',
      ],
      [
  62288316000, #    utc_start 1974-11-02 14:00:00 (Sat)
  62297992800, #      utc_end 1975-02-22 14:00:00 (Sat)
  62288362800, #  local_start 1974-11-03 03:00:00 (Sun)
  62298039600, #    local_end 1975-02-23 03:00:00 (Sun)
  46800,
  1,
  'NZDT',
      ],
      [
  62297992800, #    utc_start 1975-02-22 14:00:00 (Sat)
  62319160800, #      utc_end 1975-10-25 14:00:00 (Sat)
  62298036000, #  local_start 1975-02-23 02:00:00 (Sun)
  62319204000, #    local_end 1975-10-26 02:00:00 (Sun)
  43200,
  0,
  'NZST',
      ],
      [
  62319160800, #    utc_start 1975-10-25 14:00:00 (Sat)
  62330652000, #      utc_end 1976-03-06 14:00:00 (Sat)
  62319207600, #  local_start 1975-10-26 03:00:00 (Sun)
  62330698800, #    local_end 1976-03-07 03:00:00 (Sun)
  46800,
  1,
  'NZDT',
      ],
      [
  62330652000, #    utc_start 1976-03-06 14:00:00 (Sat)
  62351215200, #      utc_end 1976-10-30 14:00:00 (Sat)
  62330695200, #  local_start 1976-03-07 02:00:00 (Sun)
  62351258400, #    local_end 1976-10-31 02:00:00 (Sun)
  43200,
  0,
  'NZST',
      ],
      [
  62351215200, #    utc_start 1976-10-30 14:00:00 (Sat)
  62362101600, #      utc_end 1977-03-05 14:00:00 (Sat)
  62351262000, #  local_start 1976-10-31 03:00:00 (Sun)
  62362148400, #    local_end 1977-03-06 03:00:00 (Sun)
  46800,
  1,
  'NZDT',
      ],
      [
  62362101600, #    utc_start 1977-03-05 14:00:00 (Sat)
  62382664800, #      utc_end 1977-10-29 14:00:00 (Sat)
  62362144800, #  local_start 1977-03-06 02:00:00 (Sun)
  62382708000, #    local_end 1977-10-30 02:00:00 (Sun)
  43200,
  0,
  'NZST',
      ],
      [
  62382664800, #    utc_start 1977-10-29 14:00:00 (Sat)
  62393551200, #      utc_end 1978-03-04 14:00:00 (Sat)
  62382711600, #  local_start 1977-10-30 03:00:00 (Sun)
  62393598000, #    local_end 1978-03-05 03:00:00 (Sun)
  46800,
  1,
  'NZDT',
      ],
      [
  62393551200, #    utc_start 1978-03-04 14:00:00 (Sat)
  62414114400, #      utc_end 1978-10-28 14:00:00 (Sat)
  62393594400, #  local_start 1978-03-05 02:00:00 (Sun)
  62414157600, #    local_end 1978-10-29 02:00:00 (Sun)
  43200,
  0,
  'NZST',
      ],
      [
  62414114400, #    utc_start 1978-10-28 14:00:00 (Sat)
  62425000800, #      utc_end 1979-03-03 14:00:00 (Sat)
  62414161200, #  local_start 1978-10-29 03:00:00 (Sun)
  62425047600, #    local_end 1979-03-04 03:00:00 (Sun)
  46800,
  1,
  'NZDT',
      ],
      [
  62425000800, #    utc_start 1979-03-03 14:00:00 (Sat)
  62445564000, #      utc_end 1979-10-27 14:00:00 (Sat)
  62425044000, #  local_start 1979-03-04 02:00:00 (Sun)
  62445607200, #    local_end 1979-10-28 02:00:00 (Sun)
  43200,
  0,
  'NZST',
      ],
      [
  62445564000, #    utc_start 1979-10-27 14:00:00 (Sat)
  62456450400, #      utc_end 1980-03-01 14:00:00 (Sat)
  62445610800, #  local_start 1979-10-28 03:00:00 (Sun)
  62456497200, #    local_end 1980-03-02 03:00:00 (Sun)
  46800,
  1,
  'NZDT',
      ],
      [
  62456450400, #    utc_start 1980-03-01 14:00:00 (Sat)
  62477013600, #      utc_end 1980-10-25 14:00:00 (Sat)
  62456493600, #  local_start 1980-03-02 02:00:00 (Sun)
  62477056800, #    local_end 1980-10-26 02:00:00 (Sun)
  43200,
  0,
  'NZST',
      ],
      [
  62477013600, #    utc_start 1980-10-25 14:00:00 (Sat)
  62487900000, #      utc_end 1981-02-28 14:00:00 (Sat)
  62477060400, #  local_start 1980-10-26 03:00:00 (Sun)
  62487946800, #    local_end 1981-03-01 03:00:00 (Sun)
  46800,
  1,
  'NZDT',
      ],
      [
  62487900000, #    utc_start 1981-02-28 14:00:00 (Sat)
  62508463200, #      utc_end 1981-10-24 14:00:00 (Sat)
  62487943200, #  local_start 1981-03-01 02:00:00 (Sun)
  62508506400, #    local_end 1981-10-25 02:00:00 (Sun)
  43200,
  0,
  'NZST',
      ],
      [
  62508463200, #    utc_start 1981-10-24 14:00:00 (Sat)
  62519954400, #      utc_end 1982-03-06 14:00:00 (Sat)
  62508510000, #  local_start 1981-10-25 03:00:00 (Sun)
  62520001200, #    local_end 1982-03-07 03:00:00 (Sun)
  46800,
  1,
  'NZDT',
      ],
      [
  62519954400, #    utc_start 1982-03-06 14:00:00 (Sat)
  62540517600, #      utc_end 1982-10-30 14:00:00 (Sat)
  62519997600, #  local_start 1982-03-07 02:00:00 (Sun)
  62540560800, #    local_end 1982-10-31 02:00:00 (Sun)
  43200,
  0,
  'NZST',
      ],
      [
  62540517600, #    utc_start 1982-10-30 14:00:00 (Sat)
  62551404000, #      utc_end 1983-03-05 14:00:00 (Sat)
  62540564400, #  local_start 1982-10-31 03:00:00 (Sun)
  62551450800, #    local_end 1983-03-06 03:00:00 (Sun)
  46800,
  1,
  'NZDT',
      ],
      [
  62551404000, #    utc_start 1983-03-05 14:00:00 (Sat)
  62571967200, #      utc_end 1983-10-29 14:00:00 (Sat)
  62551447200, #  local_start 1983-03-06 02:00:00 (Sun)
  62572010400, #    local_end 1983-10-30 02:00:00 (Sun)
  43200,
  0,
  'NZST',
      ],
      [
  62571967200, #    utc_start 1983-10-29 14:00:00 (Sat)
  62582853600, #      utc_end 1984-03-03 14:00:00 (Sat)
  62572014000, #  local_start 1983-10-30 03:00:00 (Sun)
  62582900400, #    local_end 1984-03-04 03:00:00 (Sun)
  46800,
  1,
  'NZDT',
      ],
      [
  62582853600, #    utc_start 1984-03-03 14:00:00 (Sat)
  62603416800, #      utc_end 1984-10-27 14:00:00 (Sat)
  62582896800, #  local_start 1984-03-04 02:00:00 (Sun)
  62603460000, #    local_end 1984-10-28 02:00:00 (Sun)
  43200,
  0,
  'NZST',
      ],
      [
  62603416800, #    utc_start 1984-10-27 14:00:00 (Sat)
  62614303200, #      utc_end 1985-03-02 14:00:00 (Sat)
  62603463600, #  local_start 1984-10-28 03:00:00 (Sun)
  62614350000, #    local_end 1985-03-03 03:00:00 (Sun)
  46800,
  1,
  'NZDT',
      ],
      [
  62614303200, #    utc_start 1985-03-02 14:00:00 (Sat)
  62634866400, #      utc_end 1985-10-26 14:00:00 (Sat)
  62614346400, #  local_start 1985-03-03 02:00:00 (Sun)
  62634909600, #    local_end 1985-10-27 02:00:00 (Sun)
  43200,
  0,
  'NZST',
      ],
      [
  62634866400, #    utc_start 1985-10-26 14:00:00 (Sat)
  62645752800, #      utc_end 1986-03-01 14:00:00 (Sat)
  62634913200, #  local_start 1985-10-27 03:00:00 (Sun)
  62645799600, #    local_end 1986-03-02 03:00:00 (Sun)
  46800,
  1,
  'NZDT',
      ],
      [
  62645752800, #    utc_start 1986-03-01 14:00:00 (Sat)
  62666316000, #      utc_end 1986-10-25 14:00:00 (Sat)
  62645796000, #  local_start 1986-03-02 02:00:00 (Sun)
  62666359200, #    local_end 1986-10-26 02:00:00 (Sun)
  43200,
  0,
  'NZST',
      ],
      [
  62666316000, #    utc_start 1986-10-25 14:00:00 (Sat)
  62677202400, #      utc_end 1987-02-28 14:00:00 (Sat)
  62666362800, #  local_start 1986-10-26 03:00:00 (Sun)
  62677249200, #    local_end 1987-03-01 03:00:00 (Sun)
  46800,
  1,
  'NZDT',
      ],
      [
  62677202400, #    utc_start 1987-02-28 14:00:00 (Sat)
  62697765600, #      utc_end 1987-10-24 14:00:00 (Sat)
  62677245600, #  local_start 1987-03-01 02:00:00 (Sun)
  62697808800, #    local_end 1987-10-25 02:00:00 (Sun)
  43200,
  0,
  'NZST',
      ],
      [
  62697765600, #    utc_start 1987-10-24 14:00:00 (Sat)
  62709256800, #      utc_end 1988-03-05 14:00:00 (Sat)
  62697812400, #  local_start 1987-10-25 03:00:00 (Sun)
  62709303600, #    local_end 1988-03-06 03:00:00 (Sun)
  46800,
  1,
  'NZDT',
      ],
      [
  62709256800, #    utc_start 1988-03-05 14:00:00 (Sat)
  62729820000, #      utc_end 1988-10-29 14:00:00 (Sat)
  62709300000, #  local_start 1988-03-06 02:00:00 (Sun)
  62729863200, #    local_end 1988-10-30 02:00:00 (Sun)
  43200,
  0,
  'NZST',
      ],
      [
  62729820000, #    utc_start 1988-10-29 14:00:00 (Sat)
  62740706400, #      utc_end 1989-03-04 14:00:00 (Sat)
  62729866800, #  local_start 1988-10-30 03:00:00 (Sun)
  62740753200, #    local_end 1989-03-05 03:00:00 (Sun)
  46800,
  1,
  'NZDT',
      ],
      [
  62740706400, #    utc_start 1989-03-04 14:00:00 (Sat)
  62759455200, #      utc_end 1989-10-07 14:00:00 (Sat)
  62740749600, #  local_start 1989-03-05 02:00:00 (Sun)
  62759498400, #    local_end 1989-10-08 02:00:00 (Sun)
  43200,
  0,
  'NZST',
      ],
      [
  62759455200, #    utc_start 1989-10-07 14:00:00 (Sat)
  62773365600, #      utc_end 1990-03-17 14:00:00 (Sat)
  62759502000, #  local_start 1989-10-08 03:00:00 (Sun)
  62773412400, #    local_end 1990-03-18 03:00:00 (Sun)
  46800,
  1,
  'NZDT',
      ],
      [
  62773365600, #    utc_start 1990-03-17 14:00:00 (Sat)
  62790904800, #      utc_end 1990-10-06 14:00:00 (Sat)
  62773408800, #  local_start 1990-03-18 02:00:00 (Sun)
  62790948000, #    local_end 1990-10-07 02:00:00 (Sun)
  43200,
  0,
  'NZST',
      ],
      [
  62790904800, #    utc_start 1990-10-06 14:00:00 (Sat)
  62804815200, #      utc_end 1991-03-16 14:00:00 (Sat)
  62790951600, #  local_start 1990-10-07 03:00:00 (Sun)
  62804862000, #    local_end 1991-03-17 03:00:00 (Sun)
  46800,
  1,
  'NZDT',
      ],
      [
  62804815200, #    utc_start 1991-03-16 14:00:00 (Sat)
  62822354400, #      utc_end 1991-10-05 14:00:00 (Sat)
  62804858400, #  local_start 1991-03-17 02:00:00 (Sun)
  62822397600, #    local_end 1991-10-06 02:00:00 (Sun)
  43200,
  0,
  'NZST',
      ],
      [
  62822354400, #    utc_start 1991-10-05 14:00:00 (Sat)
  62836264800, #      utc_end 1992-03-14 14:00:00 (Sat)
  62822401200, #  local_start 1991-10-06 03:00:00 (Sun)
  62836311600, #    local_end 1992-03-15 03:00:00 (Sun)
  46800,
  1,
  'NZDT',
      ],
      [
  62836264800, #    utc_start 1992-03-14 14:00:00 (Sat)
  62853804000, #      utc_end 1992-10-03 14:00:00 (Sat)
  62836308000, #  local_start 1992-03-15 02:00:00 (Sun)
  62853847200, #    local_end 1992-10-04 02:00:00 (Sun)
  43200,
  0,
  'NZST',
      ],
      [
  62853804000, #    utc_start 1992-10-03 14:00:00 (Sat)
  62868319200, #      utc_end 1993-03-20 14:00:00 (Sat)
  62853850800, #  local_start 1992-10-04 03:00:00 (Sun)
  62868366000, #    local_end 1993-03-21 03:00:00 (Sun)
  46800,
  1,
  'NZDT',
      ],
      [
  62868319200, #    utc_start 1993-03-20 14:00:00 (Sat)
  62885253600, #      utc_end 1993-10-02 14:00:00 (Sat)
  62868362400, #  local_start 1993-03-21 02:00:00 (Sun)
  62885296800, #    local_end 1993-10-03 02:00:00 (Sun)
  43200,
  0,
  'NZST',
      ],
      [
  62885253600, #    utc_start 1993-10-02 14:00:00 (Sat)
  62899768800, #      utc_end 1994-03-19 14:00:00 (Sat)
  62885300400, #  local_start 1993-10-03 03:00:00 (Sun)
  62899815600, #    local_end 1994-03-20 03:00:00 (Sun)
  46800,
  1,
  'NZDT',
      ],
      [
  62899768800, #    utc_start 1994-03-19 14:00:00 (Sat)
  62916703200, #      utc_end 1994-10-01 14:00:00 (Sat)
  62899812000, #  local_start 1994-03-20 02:00:00 (Sun)
  62916746400, #    local_end 1994-10-02 02:00:00 (Sun)
  43200,
  0,
  'NZST',
      ],
      [
  62916703200, #    utc_start 1994-10-01 14:00:00 (Sat)
  62931218400, #      utc_end 1995-03-18 14:00:00 (Sat)
  62916750000, #  local_start 1994-10-02 03:00:00 (Sun)
  62931265200, #    local_end 1995-03-19 03:00:00 (Sun)
  46800,
  1,
  'NZDT',
      ],
      [
  62931218400, #    utc_start 1995-03-18 14:00:00 (Sat)
  62948152800, #      utc_end 1995-09-30 14:00:00 (Sat)
  62931261600, #  local_start 1995-03-19 02:00:00 (Sun)
  62948196000, #    local_end 1995-10-01 02:00:00 (Sun)
  43200,
  0,
  'NZST',
      ],
      [
  62948152800, #    utc_start 1995-09-30 14:00:00 (Sat)
  62962668000, #      utc_end 1996-03-16 14:00:00 (Sat)
  62948199600, #  local_start 1995-10-01 03:00:00 (Sun)
  62962714800, #    local_end 1996-03-17 03:00:00 (Sun)
  46800,
  1,
  'NZDT',
      ],
      [
  62962668000, #    utc_start 1996-03-16 14:00:00 (Sat)
  62980207200, #      utc_end 1996-10-05 14:00:00 (Sat)
  62962711200, #  local_start 1996-03-17 02:00:00 (Sun)
  62980250400, #    local_end 1996-10-06 02:00:00 (Sun)
  43200,
  0,
  'NZST',
      ],
      [
  62980207200, #    utc_start 1996-10-05 14:00:00 (Sat)
  62994117600, #      utc_end 1997-03-15 14:00:00 (Sat)
  62980254000, #  local_start 1996-10-06 03:00:00 (Sun)
  62994164400, #    local_end 1997-03-16 03:00:00 (Sun)
  46800,
  1,
  'NZDT',
      ],
      [
  62994117600, #    utc_start 1997-03-15 14:00:00 (Sat)
  63011656800, #      utc_end 1997-10-04 14:00:00 (Sat)
  62994160800, #  local_start 1997-03-16 02:00:00 (Sun)
  63011700000, #    local_end 1997-10-05 02:00:00 (Sun)
  43200,
  0,
  'NZST',
      ],
      [
  63011656800, #    utc_start 1997-10-04 14:00:00 (Sat)
  63025567200, #      utc_end 1998-03-14 14:00:00 (Sat)
  63011703600, #  local_start 1997-10-05 03:00:00 (Sun)
  63025614000, #    local_end 1998-03-15 03:00:00 (Sun)
  46800,
  1,
  'NZDT',
      ],
      [
  63025567200, #    utc_start 1998-03-14 14:00:00 (Sat)
  63043106400, #      utc_end 1998-10-03 14:00:00 (Sat)
  63025610400, #  local_start 1998-03-15 02:00:00 (Sun)
  63043149600, #    local_end 1998-10-04 02:00:00 (Sun)
  43200,
  0,
  'NZST',
      ],
      [
  63043106400, #    utc_start 1998-10-03 14:00:00 (Sat)
  63057621600, #      utc_end 1999-03-20 14:00:00 (Sat)
  63043153200, #  local_start 1998-10-04 03:00:00 (Sun)
  63057668400, #    local_end 1999-03-21 03:00:00 (Sun)
  46800,
  1,
  'NZDT',
      ],
      [
  63057621600, #    utc_start 1999-03-20 14:00:00 (Sat)
  63074556000, #      utc_end 1999-10-02 14:00:00 (Sat)
  63057664800, #  local_start 1999-03-21 02:00:00 (Sun)
  63074599200, #    local_end 1999-10-03 02:00:00 (Sun)
  43200,
  0,
  'NZST',
      ],
      [
  63074556000, #    utc_start 1999-10-02 14:00:00 (Sat)
  63089071200, #      utc_end 2000-03-18 14:00:00 (Sat)
  63074602800, #  local_start 1999-10-03 03:00:00 (Sun)
  63089118000, #    local_end 2000-03-19 03:00:00 (Sun)
  46800,
  1,
  'NZDT',
      ],
      [
  63089071200, #    utc_start 2000-03-18 14:00:00 (Sat)
  63106005600, #      utc_end 2000-09-30 14:00:00 (Sat)
  63089114400, #  local_start 2000-03-19 02:00:00 (Sun)
  63106048800, #    local_end 2000-10-01 02:00:00 (Sun)
  43200,
  0,
  'NZST',
      ],
      [
  63106005600, #    utc_start 2000-09-30 14:00:00 (Sat)
  63120520800, #      utc_end 2001-03-17 14:00:00 (Sat)
  63106052400, #  local_start 2000-10-01 03:00:00 (Sun)
  63120567600, #    local_end 2001-03-18 03:00:00 (Sun)
  46800,
  1,
  'NZDT',
      ],
      [
  63120520800, #    utc_start 2001-03-17 14:00:00 (Sat)
  63138060000, #      utc_end 2001-10-06 14:00:00 (Sat)
  63120564000, #  local_start 2001-03-18 02:00:00 (Sun)
  63138103200, #    local_end 2001-10-07 02:00:00 (Sun)
  43200,
  0,
  'NZST',
      ],
      [
  63138060000, #    utc_start 2001-10-06 14:00:00 (Sat)
  63151970400, #      utc_end 2002-03-16 14:00:00 (Sat)
  63138106800, #  local_start 2001-10-07 03:00:00 (Sun)
  63152017200, #    local_end 2002-03-17 03:00:00 (Sun)
  46800,
  1,
  'NZDT',
      ],
      [
  63151970400, #    utc_start 2002-03-16 14:00:00 (Sat)
  63169509600, #      utc_end 2002-10-05 14:00:00 (Sat)
  63152013600, #  local_start 2002-03-17 02:00:00 (Sun)
  63169552800, #    local_end 2002-10-06 02:00:00 (Sun)
  43200,
  0,
  'NZST',
      ],
      [
  63169509600, #    utc_start 2002-10-05 14:00:00 (Sat)
  63183420000, #      utc_end 2003-03-15 14:00:00 (Sat)
  63169556400, #  local_start 2002-10-06 03:00:00 (Sun)
  63183466800, #    local_end 2003-03-16 03:00:00 (Sun)
  46800,
  1,
  'NZDT',
      ],
      [
  63183420000, #    utc_start 2003-03-15 14:00:00 (Sat)
  63200959200, #      utc_end 2003-10-04 14:00:00 (Sat)
  63183463200, #  local_start 2003-03-16 02:00:00 (Sun)
  63201002400, #    local_end 2003-10-05 02:00:00 (Sun)
  43200,
  0,
  'NZST',
      ],
      [
  63200959200, #    utc_start 2003-10-04 14:00:00 (Sat)
  63215474400, #      utc_end 2004-03-20 14:00:00 (Sat)
  63201006000, #  local_start 2003-10-05 03:00:00 (Sun)
  63215521200, #    local_end 2004-03-21 03:00:00 (Sun)
  46800,
  1,
  'NZDT',
      ],
      [
  63215474400, #    utc_start 2004-03-20 14:00:00 (Sat)
  63232408800, #      utc_end 2004-10-02 14:00:00 (Sat)
  63215517600, #  local_start 2004-03-21 02:00:00 (Sun)
  63232452000, #    local_end 2004-10-03 02:00:00 (Sun)
  43200,
  0,
  'NZST',
      ],
      [
  63232408800, #    utc_start 2004-10-02 14:00:00 (Sat)
  63246924000, #      utc_end 2005-03-19 14:00:00 (Sat)
  63232455600, #  local_start 2004-10-03 03:00:00 (Sun)
  63246970800, #    local_end 2005-03-20 03:00:00 (Sun)
  46800,
  1,
  'NZDT',
      ],
      [
  63246924000, #    utc_start 2005-03-19 14:00:00 (Sat)
  63263858400, #      utc_end 2005-10-01 14:00:00 (Sat)
  63246967200, #  local_start 2005-03-20 02:00:00 (Sun)
  63263901600, #    local_end 2005-10-02 02:00:00 (Sun)
  43200,
  0,
  'NZST',
      ],
      [
  63263858400, #    utc_start 2005-10-01 14:00:00 (Sat)
  63278373600, #      utc_end 2006-03-18 14:00:00 (Sat)
  63263905200, #  local_start 2005-10-02 03:00:00 (Sun)
  63278420400, #    local_end 2006-03-19 03:00:00 (Sun)
  46800,
  1,
  'NZDT',
      ],
      [
  63278373600, #    utc_start 2006-03-18 14:00:00 (Sat)
  63295308000, #      utc_end 2006-09-30 14:00:00 (Sat)
  63278416800, #  local_start 2006-03-19 02:00:00 (Sun)
  63295351200, #    local_end 2006-10-01 02:00:00 (Sun)
  43200,
  0,
  'NZST',
      ],
      [
  63295308000, #    utc_start 2006-09-30 14:00:00 (Sat)
  63309823200, #      utc_end 2007-03-17 14:00:00 (Sat)
  63295354800, #  local_start 2006-10-01 03:00:00 (Sun)
  63309870000, #    local_end 2007-03-18 03:00:00 (Sun)
  46800,
  1,
  'NZDT',
      ],
      [
  63309823200, #    utc_start 2007-03-17 14:00:00 (Sat)
  63326757600, #      utc_end 2007-09-29 14:00:00 (Sat)
  63309866400, #  local_start 2007-03-18 02:00:00 (Sun)
  63326800800, #    local_end 2007-09-30 02:00:00 (Sun)
  43200,
  0,
  'NZST',
      ],
      [
  63326757600, #    utc_start 2007-09-29 14:00:00 (Sat)
  63343087200, #      utc_end 2008-04-05 14:00:00 (Sat)
  63326804400, #  local_start 2007-09-30 03:00:00 (Sun)
  63343134000, #    local_end 2008-04-06 03:00:00 (Sun)
  46800,
  1,
  'NZDT',
      ],
      [
  63343087200, #    utc_start 2008-04-05 14:00:00 (Sat)
  63358207200, #      utc_end 2008-09-27 14:00:00 (Sat)
  63343130400, #  local_start 2008-04-06 02:00:00 (Sun)
  63358250400, #    local_end 2008-09-28 02:00:00 (Sun)
  43200,
  0,
  'NZST',
      ],
      [
  63358207200, #    utc_start 2008-09-27 14:00:00 (Sat)
  63374536800, #      utc_end 2009-04-04 14:00:00 (Sat)
  63358254000, #  local_start 2008-09-28 03:00:00 (Sun)
  63374583600, #    local_end 2009-04-05 03:00:00 (Sun)
  46800,
  1,
  'NZDT',
      ],
      [
  63374536800, #    utc_start 2009-04-04 14:00:00 (Sat)
  63389656800, #      utc_end 2009-09-26 14:00:00 (Sat)
  63374580000, #  local_start 2009-04-05 02:00:00 (Sun)
  63389700000, #    local_end 2009-09-27 02:00:00 (Sun)
  43200,
  0,
  'NZST',
      ],
      [
  63389656800, #    utc_start 2009-09-26 14:00:00 (Sat)
  63405986400, #      utc_end 2010-04-03 14:00:00 (Sat)
  63389703600, #  local_start 2009-09-27 03:00:00 (Sun)
  63406033200, #    local_end 2010-04-04 03:00:00 (Sun)
  46800,
  1,
  'NZDT',
      ],
      [
  63405986400, #    utc_start 2010-04-03 14:00:00 (Sat)
  63421106400, #      utc_end 2010-09-25 14:00:00 (Sat)
  63406029600, #  local_start 2010-04-04 02:00:00 (Sun)
  63421149600, #    local_end 2010-09-26 02:00:00 (Sun)
  43200,
  0,
  'NZST',
      ],
      [
  63421106400, #    utc_start 2010-09-25 14:00:00 (Sat)
  63437436000, #      utc_end 2011-04-02 14:00:00 (Sat)
  63421153200, #  local_start 2010-09-26 03:00:00 (Sun)
  63437482800, #    local_end 2011-04-03 03:00:00 (Sun)
  46800,
  1,
  'NZDT',
      ],
      [
  63437436000, #    utc_start 2011-04-02 14:00:00 (Sat)
  63452556000, #      utc_end 2011-09-24 14:00:00 (Sat)
  63437479200, #  local_start 2011-04-03 02:00:00 (Sun)
  63452599200, #    local_end 2011-09-25 02:00:00 (Sun)
  43200,
  0,
  'NZST',
      ],
      [
  63452556000, #    utc_start 2011-09-24 14:00:00 (Sat)
  63468885600, #      utc_end 2012-03-31 14:00:00 (Sat)
  63452602800, #  local_start 2011-09-25 03:00:00 (Sun)
  63468932400, #    local_end 2012-04-01 03:00:00 (Sun)
  46800,
  1,
  'NZDT',
      ],
      [
  63468885600, #    utc_start 2012-03-31 14:00:00 (Sat)
  63484610400, #      utc_end 2012-09-29 14:00:00 (Sat)
  63468928800, #  local_start 2012-04-01 02:00:00 (Sun)
  63484653600, #    local_end 2012-09-30 02:00:00 (Sun)
  43200,
  0,
  'NZST',
      ],
      [
  63484610400, #    utc_start 2012-09-29 14:00:00 (Sat)
  63500940000, #      utc_end 2013-04-06 14:00:00 (Sat)
  63484657200, #  local_start 2012-09-30 03:00:00 (Sun)
  63500986800, #    local_end 2013-04-07 03:00:00 (Sun)
  46800,
  1,
  'NZDT',
      ],
      [
  63500940000, #    utc_start 2013-04-06 14:00:00 (Sat)
  63516060000, #      utc_end 2013-09-28 14:00:00 (Sat)
  63500983200, #  local_start 2013-04-07 02:00:00 (Sun)
  63516103200, #    local_end 2013-09-29 02:00:00 (Sun)
  43200,
  0,
  'NZST',
      ],
      [
  63516060000, #    utc_start 2013-09-28 14:00:00 (Sat)
  63532389600, #      utc_end 2014-04-05 14:00:00 (Sat)
  63516106800, #  local_start 2013-09-29 03:00:00 (Sun)
  63532436400, #    local_end 2014-04-06 03:00:00 (Sun)
  46800,
  1,
  'NZDT',
      ],
      [
  63532389600, #    utc_start 2014-04-05 14:00:00 (Sat)
  63547509600, #      utc_end 2014-09-27 14:00:00 (Sat)
  63532432800, #  local_start 2014-04-06 02:00:00 (Sun)
  63547552800, #    local_end 2014-09-28 02:00:00 (Sun)
  43200,
  0,
  'NZST',
      ],
      [
  63547509600, #    utc_start 2014-09-27 14:00:00 (Sat)
  63563839200, #      utc_end 2015-04-04 14:00:00 (Sat)
  63547556400, #  local_start 2014-09-28 03:00:00 (Sun)
  63563886000, #    local_end 2015-04-05 03:00:00 (Sun)
  46800,
  1,
  'NZDT',
      ],
      [
  63563839200, #    utc_start 2015-04-04 14:00:00 (Sat)
  63578959200, #      utc_end 2015-09-26 14:00:00 (Sat)
  63563882400, #  local_start 2015-04-05 02:00:00 (Sun)
  63579002400, #    local_end 2015-09-27 02:00:00 (Sun)
  43200,
  0,
  'NZST',
      ],
      [
  63578959200, #    utc_start 2015-09-26 14:00:00 (Sat)
  63595288800, #      utc_end 2016-04-02 14:00:00 (Sat)
  63579006000, #  local_start 2015-09-27 03:00:00 (Sun)
  63595335600, #    local_end 2016-04-03 03:00:00 (Sun)
  46800,
  1,
  'NZDT',
      ],
      [
  63595288800, #    utc_start 2016-04-02 14:00:00 (Sat)
  63610408800, #      utc_end 2016-09-24 14:00:00 (Sat)
  63595332000, #  local_start 2016-04-03 02:00:00 (Sun)
  63610452000, #    local_end 2016-09-25 02:00:00 (Sun)
  43200,
  0,
  'NZST',
      ],
      [
  63610408800, #    utc_start 2016-09-24 14:00:00 (Sat)
  63626738400, #      utc_end 2017-04-01 14:00:00 (Sat)
  63610455600, #  local_start 2016-09-25 03:00:00 (Sun)
  63626785200, #    local_end 2017-04-02 03:00:00 (Sun)
  46800,
  1,
  'NZDT',
      ],
      [
  63626738400, #    utc_start 2017-04-01 14:00:00 (Sat)
  63641858400, #      utc_end 2017-09-23 14:00:00 (Sat)
  63626781600, #  local_start 2017-04-02 02:00:00 (Sun)
  63641901600, #    local_end 2017-09-24 02:00:00 (Sun)
  43200,
  0,
  'NZST',
      ],
      [
  63641858400, #    utc_start 2017-09-23 14:00:00 (Sat)
  63658188000, #      utc_end 2018-03-31 14:00:00 (Sat)
  63641905200, #  local_start 2017-09-24 03:00:00 (Sun)
  63658234800, #    local_end 2018-04-01 03:00:00 (Sun)
  46800,
  1,
  'NZDT',
      ],
      [
  63658188000, #    utc_start 2018-03-31 14:00:00 (Sat)
  63673912800, #      utc_end 2018-09-29 14:00:00 (Sat)
  63658231200, #  local_start 2018-04-01 02:00:00 (Sun)
  63673956000, #    local_end 2018-09-30 02:00:00 (Sun)
  43200,
  0,
  'NZST',
      ],
      [
  63673912800, #    utc_start 2018-09-29 14:00:00 (Sat)
  63690242400, #      utc_end 2019-04-06 14:00:00 (Sat)
  63673959600, #  local_start 2018-09-30 03:00:00 (Sun)
  63690289200, #    local_end 2019-04-07 03:00:00 (Sun)
  46800,
  1,
  'NZDT',
      ],
      [
  63690242400, #    utc_start 2019-04-06 14:00:00 (Sat)
  63705362400, #      utc_end 2019-09-28 14:00:00 (Sat)
  63690285600, #  local_start 2019-04-07 02:00:00 (Sun)
  63705405600, #    local_end 2019-09-29 02:00:00 (Sun)
  43200,
  0,
  'NZST',
      ],
      [
  63705362400, #    utc_start 2019-09-28 14:00:00 (Sat)
  63721692000, #      utc_end 2020-04-04 14:00:00 (Sat)
  63705409200, #  local_start 2019-09-29 03:00:00 (Sun)
  63721738800, #    local_end 2020-04-05 03:00:00 (Sun)
  46800,
  1,
  'NZDT',
      ],
      [
  63721692000, #    utc_start 2020-04-04 14:00:00 (Sat)
  63736812000, #      utc_end 2020-09-26 14:00:00 (Sat)
  63721735200, #  local_start 2020-04-05 02:00:00 (Sun)
  63736855200, #    local_end 2020-09-27 02:00:00 (Sun)
  43200,
  0,
  'NZST',
      ],
      [
  63736812000, #    utc_start 2020-09-26 14:00:00 (Sat)
  63753141600, #      utc_end 2021-04-03 14:00:00 (Sat)
  63736858800, #  local_start 2020-09-27 03:00:00 (Sun)
  63753188400, #    local_end 2021-04-04 03:00:00 (Sun)
  46800,
  1,
  'NZDT',
      ],
      [
  63753141600, #    utc_start 2021-04-03 14:00:00 (Sat)
  63768261600, #      utc_end 2021-09-25 14:00:00 (Sat)
  63753184800, #  local_start 2021-04-04 02:00:00 (Sun)
  63768304800, #    local_end 2021-09-26 02:00:00 (Sun)
  43200,
  0,
  'NZST',
      ],
      [
  63768261600, #    utc_start 2021-09-25 14:00:00 (Sat)
  63784591200, #      utc_end 2022-04-02 14:00:00 (Sat)
  63768308400, #  local_start 2021-09-26 03:00:00 (Sun)
  63784638000, #    local_end 2022-04-03 03:00:00 (Sun)
  46800,
  1,
  'NZDT',
      ],
      [
  63784591200, #    utc_start 2022-04-02 14:00:00 (Sat)
  63799711200, #      utc_end 2022-09-24 14:00:00 (Sat)
  63784634400, #  local_start 2022-04-03 02:00:00 (Sun)
  63799754400, #    local_end 2022-09-25 02:00:00 (Sun)
  43200,
  0,
  'NZST',
      ],
      [
  63799711200, #    utc_start 2022-09-24 14:00:00 (Sat)
  63816040800, #      utc_end 2023-04-01 14:00:00 (Sat)
  63799758000, #  local_start 2022-09-25 03:00:00 (Sun)
  63816087600, #    local_end 2023-04-02 03:00:00 (Sun)
  46800,
  1,
  'NZDT',
      ],
      [
  63816040800, #    utc_start 2023-04-01 14:00:00 (Sat)
  63831160800, #      utc_end 2023-09-23 14:00:00 (Sat)
  63816084000, #  local_start 2023-04-02 02:00:00 (Sun)
  63831204000, #    local_end 2023-09-24 02:00:00 (Sun)
  43200,
  0,
  'NZST',
      ],
      [
  63831160800, #    utc_start 2023-09-23 14:00:00 (Sat)
  63848095200, #      utc_end 2024-04-06 14:00:00 (Sat)
  63831207600, #  local_start 2023-09-24 03:00:00 (Sun)
  63848142000, #    local_end 2024-04-07 03:00:00 (Sun)
  46800,
  1,
  'NZDT',
      ],
      [
  63848095200, #    utc_start 2024-04-06 14:00:00 (Sat)
  63863215200, #      utc_end 2024-09-28 14:00:00 (Sat)
  63848138400, #  local_start 2024-04-07 02:00:00 (Sun)
  63863258400, #    local_end 2024-09-29 02:00:00 (Sun)
  43200,
  0,
  'NZST',
      ],
      [
  63863215200, #    utc_start 2024-09-28 14:00:00 (Sat)
  63879544800, #      utc_end 2025-04-05 14:00:00 (Sat)
  63863262000, #  local_start 2024-09-29 03:00:00 (Sun)
  63879591600, #    local_end 2025-04-06 03:00:00 (Sun)
  46800,
  1,
  'NZDT',
      ],
      [
  63879544800, #    utc_start 2025-04-05 14:00:00 (Sat)
  63894664800, #      utc_end 2025-09-27 14:00:00 (Sat)
  63879588000, #  local_start 2025-04-06 02:00:00 (Sun)
  63894708000, #    local_end 2025-09-28 02:00:00 (Sun)
  43200,
  0,
  'NZST',
      ],
      [
  63894664800, #    utc_start 2025-09-27 14:00:00 (Sat)
  63910994400, #      utc_end 2026-04-04 14:00:00 (Sat)
  63894711600, #  local_start 2025-09-28 03:00:00 (Sun)
  63911041200, #    local_end 2026-04-05 03:00:00 (Sun)
  46800,
  1,
  'NZDT',
      ],
      [
  63910994400, #    utc_start 2026-04-04 14:00:00 (Sat)
  63926114400, #      utc_end 2026-09-26 14:00:00 (Sat)
  63911037600, #  local_start 2026-04-05 02:00:00 (Sun)
  63926157600, #    local_end 2026-09-27 02:00:00 (Sun)
  43200,
  0,
  'NZST',
      ],
      [
  63926114400, #    utc_start 2026-09-26 14:00:00 (Sat)
  63942444000, #      utc_end 2027-04-03 14:00:00 (Sat)
  63926161200, #  local_start 2026-09-27 03:00:00 (Sun)
  63942490800, #    local_end 2027-04-04 03:00:00 (Sun)
  46800,
  1,
  'NZDT',
      ],
      [
  63942444000, #    utc_start 2027-04-03 14:00:00 (Sat)
  63957564000, #      utc_end 2027-09-25 14:00:00 (Sat)
  63942487200, #  local_start 2027-04-04 02:00:00 (Sun)
  63957607200, #    local_end 2027-09-26 02:00:00 (Sun)
  43200,
  0,
  'NZST',
      ],
      [
  63957564000, #    utc_start 2027-09-25 14:00:00 (Sat)
  63973893600, #      utc_end 2028-04-01 14:00:00 (Sat)
  63957610800, #  local_start 2027-09-26 03:00:00 (Sun)
  63973940400, #    local_end 2028-04-02 03:00:00 (Sun)
  46800,
  1,
  'NZDT',
      ],
      [
  63973893600, #    utc_start 2028-04-01 14:00:00 (Sat)
  63989013600, #      utc_end 2028-09-23 14:00:00 (Sat)
  63973936800, #  local_start 2028-04-02 02:00:00 (Sun)
  63989056800, #    local_end 2028-09-24 02:00:00 (Sun)
  43200,
  0,
  'NZST',
      ],
      [
  63989013600, #    utc_start 2028-09-23 14:00:00 (Sat)
  64005343200, #      utc_end 2029-03-31 14:00:00 (Sat)
  63989060400, #  local_start 2028-09-24 03:00:00 (Sun)
  64005390000, #    local_end 2029-04-01 03:00:00 (Sun)
  46800,
  1,
  'NZDT',
      ],
      [
  64005343200, #    utc_start 2029-03-31 14:00:00 (Sat)
  64021068000, #      utc_end 2029-09-29 14:00:00 (Sat)
  64005386400, #  local_start 2029-04-01 02:00:00 (Sun)
  64021111200, #    local_end 2029-09-30 02:00:00 (Sun)
  43200,
  0,
  'NZST',
      ],
      [
  64021068000, #    utc_start 2029-09-29 14:00:00 (Sat)
  64037397600, #      utc_end 2030-04-06 14:00:00 (Sat)
  64021114800, #  local_start 2029-09-30 03:00:00 (Sun)
  64037444400, #    local_end 2030-04-07 03:00:00 (Sun)
  46800,
  1,
  'NZDT',
      ],
      [
  64037397600, #    utc_start 2030-04-06 14:00:00 (Sat)
  64052517600, #      utc_end 2030-09-28 14:00:00 (Sat)
  64037440800, #  local_start 2030-04-07 02:00:00 (Sun)
  64052560800, #    local_end 2030-09-29 02:00:00 (Sun)
  43200,
  0,
  'NZST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {71}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { 43200 }
  
  my $last_observance = bless( {
    'format' => 'NZ%sT',
    'gmtoff' => '12:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 710397,
      'local_rd_secs' => 0,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 710397,
      'utc_rd_secs' => 0,
      'utc_year' => 1947
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => 43200,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 710396,
      'local_rd_secs' => 43200,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 710396,
      'utc_rd_secs' => 43200,
      'utc_year' => 1946
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00s',
      'from' => '2007',
      'in' => 'Sep',
      'letter' => 'D',
      'name' => 'NZ',
      'offset_from_std' => 3600,
      'on' => 'lastSun',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:00s',
      'from' => '2008',
      'in' => 'Apr',
      'letter' => 'S',
      'name' => 'NZ',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_PACIFIC_AUCKLAND

    $main::fatpacked{"DateTime/TimeZone/Pacific/Bougainville.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_PACIFIC_BOUGAINVILLE';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/australasia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Pacific::Bougainville;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Pacific::Bougainville::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59295505064, #      utc_end 1879-12-31 13:37:44 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59295542400, #    local_end 1880-01-01 00:00:00 (Thu)
  37336,
  0,
  'LMT',
      ],
      [
  59295505064, #    utc_start 1879-12-31 13:37:44 (Wed)
  59768892688, #      utc_end 1894-12-31 14:11:28 (Mon)
  59295540376, #  local_start 1879-12-31 23:26:16 (Wed)
  59768928000, #    local_end 1895-01-01 00:00:00 (Tue)
  35312,
  0,
  'PMMT',
      ],
      [
  59768892688, #    utc_start 1894-12-31 14:11:28 (Mon)
  61267672800, #      utc_end 1942-06-30 14:00:00 (Tue)
  59768928688, #  local_start 1895-01-01 00:11:28 (Tue)
  61267708800, #    local_end 1942-07-01 00:00:00 (Wed)
  36000,
  0,
  '+10',
      ],
      [
  61267672800, #    utc_start 1942-06-30 14:00:00 (Tue)
  61366777200, #      utc_end 1945-08-20 15:00:00 (Mon)
  61267705200, #  local_start 1942-06-30 23:00:00 (Tue)
  61366809600, #    local_end 1945-08-21 00:00:00 (Tue)
  32400,
  0,
  '+09',
      ],
      [
  61366777200, #    utc_start 1945-08-20 15:00:00 (Mon)
  63555379200, #      utc_end 2014-12-27 16:00:00 (Sat)
  61366813200, #  local_start 1945-08-21 01:00:00 (Tue)
  63555415200, #    local_end 2014-12-28 02:00:00 (Sun)
  36000,
  0,
  '+10',
      ],
      [
  63555379200, #    utc_start 2014-12-27 16:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  63555418800, #  local_start 2014-12-28 03:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  39600,
  0,
  '+11',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_PACIFIC_BOUGAINVILLE

    $main::fatpacked{"DateTime/TimeZone/Pacific/Chatham.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_PACIFIC_CHATHAM';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/australasia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Pacific::Chatham;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Pacific::Chatham::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  58943245572, #      utc_end 1868-11-01 11:46:12 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  58943289600, #    local_end 1868-11-02 00:00:00 (Mon)
  44028,
  0,
  'LMT',
      ],
      [
  58943245572, #    utc_start 1868-11-01 11:46:12 (Sun)
  61378256700, #      utc_end 1945-12-31 11:45:00 (Mon)
  58943289672, #  local_start 1868-11-02 00:01:12 (Mon)
  61378300800, #    local_end 1946-01-01 00:00:00 (Tue)
  44100,
  0,
  '+1215',
      ],
      [
  61378256700, #    utc_start 1945-12-31 11:45:00 (Mon)
  62288316000, #      utc_end 1974-11-02 14:00:00 (Sat)
  61378302600, #  local_start 1946-01-01 00:30:00 (Tue)
  62288361900, #    local_end 1974-11-03 02:45:00 (Sun)
  45900,
  0,
  '+1245',
      ],
      [
  62288316000, #    utc_start 1974-11-02 14:00:00 (Sat)
  62297992800, #      utc_end 1975-02-22 14:00:00 (Sat)
  62288365500, #  local_start 1974-11-03 03:45:00 (Sun)
  62298042300, #    local_end 1975-02-23 03:45:00 (Sun)
  49500,
  1,
  '+1345',
      ],
      [
  62297992800, #    utc_start 1975-02-22 14:00:00 (Sat)
  62319160800, #      utc_end 1975-10-25 14:00:00 (Sat)
  62298038700, #  local_start 1975-02-23 02:45:00 (Sun)
  62319206700, #    local_end 1975-10-26 02:45:00 (Sun)
  45900,
  0,
  '+1245',
      ],
      [
  62319160800, #    utc_start 1975-10-25 14:00:00 (Sat)
  62330652000, #      utc_end 1976-03-06 14:00:00 (Sat)
  62319210300, #  local_start 1975-10-26 03:45:00 (Sun)
  62330701500, #    local_end 1976-03-07 03:45:00 (Sun)
  49500,
  1,
  '+1345',
      ],
      [
  62330652000, #    utc_start 1976-03-06 14:00:00 (Sat)
  62351215200, #      utc_end 1976-10-30 14:00:00 (Sat)
  62330697900, #  local_start 1976-03-07 02:45:00 (Sun)
  62351261100, #    local_end 1976-10-31 02:45:00 (Sun)
  45900,
  0,
  '+1245',
      ],
      [
  62351215200, #    utc_start 1976-10-30 14:00:00 (Sat)
  62362101600, #      utc_end 1977-03-05 14:00:00 (Sat)
  62351264700, #  local_start 1976-10-31 03:45:00 (Sun)
  62362151100, #    local_end 1977-03-06 03:45:00 (Sun)
  49500,
  1,
  '+1345',
      ],
      [
  62362101600, #    utc_start 1977-03-05 14:00:00 (Sat)
  62382664800, #      utc_end 1977-10-29 14:00:00 (Sat)
  62362147500, #  local_start 1977-03-06 02:45:00 (Sun)
  62382710700, #    local_end 1977-10-30 02:45:00 (Sun)
  45900,
  0,
  '+1245',
      ],
      [
  62382664800, #    utc_start 1977-10-29 14:00:00 (Sat)
  62393551200, #      utc_end 1978-03-04 14:00:00 (Sat)
  62382714300, #  local_start 1977-10-30 03:45:00 (Sun)
  62393600700, #    local_end 1978-03-05 03:45:00 (Sun)
  49500,
  1,
  '+1345',
      ],
      [
  62393551200, #    utc_start 1978-03-04 14:00:00 (Sat)
  62414114400, #      utc_end 1978-10-28 14:00:00 (Sat)
  62393597100, #  local_start 1978-03-05 02:45:00 (Sun)
  62414160300, #    local_end 1978-10-29 02:45:00 (Sun)
  45900,
  0,
  '+1245',
      ],
      [
  62414114400, #    utc_start 1978-10-28 14:00:00 (Sat)
  62425000800, #      utc_end 1979-03-03 14:00:00 (Sat)
  62414163900, #  local_start 1978-10-29 03:45:00 (Sun)
  62425050300, #    local_end 1979-03-04 03:45:00 (Sun)
  49500,
  1,
  '+1345',
      ],
      [
  62425000800, #    utc_start 1979-03-03 14:00:00 (Sat)
  62445564000, #      utc_end 1979-10-27 14:00:00 (Sat)
  62425046700, #  local_start 1979-03-04 02:45:00 (Sun)
  62445609900, #    local_end 1979-10-28 02:45:00 (Sun)
  45900,
  0,
  '+1245',
      ],
      [
  62445564000, #    utc_start 1979-10-27 14:00:00 (Sat)
  62456450400, #      utc_end 1980-03-01 14:00:00 (Sat)
  62445613500, #  local_start 1979-10-28 03:45:00 (Sun)
  62456499900, #    local_end 1980-03-02 03:45:00 (Sun)
  49500,
  1,
  '+1345',
      ],
      [
  62456450400, #    utc_start 1980-03-01 14:00:00 (Sat)
  62477013600, #      utc_end 1980-10-25 14:00:00 (Sat)
  62456496300, #  local_start 1980-03-02 02:45:00 (Sun)
  62477059500, #    local_end 1980-10-26 02:45:00 (Sun)
  45900,
  0,
  '+1245',
      ],
      [
  62477013600, #    utc_start 1980-10-25 14:00:00 (Sat)
  62487900000, #      utc_end 1981-02-28 14:00:00 (Sat)
  62477063100, #  local_start 1980-10-26 03:45:00 (Sun)
  62487949500, #    local_end 1981-03-01 03:45:00 (Sun)
  49500,
  1,
  '+1345',
      ],
      [
  62487900000, #    utc_start 1981-02-28 14:00:00 (Sat)
  62508463200, #      utc_end 1981-10-24 14:00:00 (Sat)
  62487945900, #  local_start 1981-03-01 02:45:00 (Sun)
  62508509100, #    local_end 1981-10-25 02:45:00 (Sun)
  45900,
  0,
  '+1245',
      ],
      [
  62508463200, #    utc_start 1981-10-24 14:00:00 (Sat)
  62519954400, #      utc_end 1982-03-06 14:00:00 (Sat)
  62508512700, #  local_start 1981-10-25 03:45:00 (Sun)
  62520003900, #    local_end 1982-03-07 03:45:00 (Sun)
  49500,
  1,
  '+1345',
      ],
      [
  62519954400, #    utc_start 1982-03-06 14:00:00 (Sat)
  62540517600, #      utc_end 1982-10-30 14:00:00 (Sat)
  62520000300, #  local_start 1982-03-07 02:45:00 (Sun)
  62540563500, #    local_end 1982-10-31 02:45:00 (Sun)
  45900,
  0,
  '+1245',
      ],
      [
  62540517600, #    utc_start 1982-10-30 14:00:00 (Sat)
  62551404000, #      utc_end 1983-03-05 14:00:00 (Sat)
  62540567100, #  local_start 1982-10-31 03:45:00 (Sun)
  62551453500, #    local_end 1983-03-06 03:45:00 (Sun)
  49500,
  1,
  '+1345',
      ],
      [
  62551404000, #    utc_start 1983-03-05 14:00:00 (Sat)
  62571967200, #      utc_end 1983-10-29 14:00:00 (Sat)
  62551449900, #  local_start 1983-03-06 02:45:00 (Sun)
  62572013100, #    local_end 1983-10-30 02:45:00 (Sun)
  45900,
  0,
  '+1245',
      ],
      [
  62571967200, #    utc_start 1983-10-29 14:00:00 (Sat)
  62582853600, #      utc_end 1984-03-03 14:00:00 (Sat)
  62572016700, #  local_start 1983-10-30 03:45:00 (Sun)
  62582903100, #    local_end 1984-03-04 03:45:00 (Sun)
  49500,
  1,
  '+1345',
      ],
      [
  62582853600, #    utc_start 1984-03-03 14:00:00 (Sat)
  62603416800, #      utc_end 1984-10-27 14:00:00 (Sat)
  62582899500, #  local_start 1984-03-04 02:45:00 (Sun)
  62603462700, #    local_end 1984-10-28 02:45:00 (Sun)
  45900,
  0,
  '+1245',
      ],
      [
  62603416800, #    utc_start 1984-10-27 14:00:00 (Sat)
  62614303200, #      utc_end 1985-03-02 14:00:00 (Sat)
  62603466300, #  local_start 1984-10-28 03:45:00 (Sun)
  62614352700, #    local_end 1985-03-03 03:45:00 (Sun)
  49500,
  1,
  '+1345',
      ],
      [
  62614303200, #    utc_start 1985-03-02 14:00:00 (Sat)
  62634866400, #      utc_end 1985-10-26 14:00:00 (Sat)
  62614349100, #  local_start 1985-03-03 02:45:00 (Sun)
  62634912300, #    local_end 1985-10-27 02:45:00 (Sun)
  45900,
  0,
  '+1245',
      ],
      [
  62634866400, #    utc_start 1985-10-26 14:00:00 (Sat)
  62645752800, #      utc_end 1986-03-01 14:00:00 (Sat)
  62634915900, #  local_start 1985-10-27 03:45:00 (Sun)
  62645802300, #    local_end 1986-03-02 03:45:00 (Sun)
  49500,
  1,
  '+1345',
      ],
      [
  62645752800, #    utc_start 1986-03-01 14:00:00 (Sat)
  62666316000, #      utc_end 1986-10-25 14:00:00 (Sat)
  62645798700, #  local_start 1986-03-02 02:45:00 (Sun)
  62666361900, #    local_end 1986-10-26 02:45:00 (Sun)
  45900,
  0,
  '+1245',
      ],
      [
  62666316000, #    utc_start 1986-10-25 14:00:00 (Sat)
  62677202400, #      utc_end 1987-02-28 14:00:00 (Sat)
  62666365500, #  local_start 1986-10-26 03:45:00 (Sun)
  62677251900, #    local_end 1987-03-01 03:45:00 (Sun)
  49500,
  1,
  '+1345',
      ],
      [
  62677202400, #    utc_start 1987-02-28 14:00:00 (Sat)
  62697765600, #      utc_end 1987-10-24 14:00:00 (Sat)
  62677248300, #  local_start 1987-03-01 02:45:00 (Sun)
  62697811500, #    local_end 1987-10-25 02:45:00 (Sun)
  45900,
  0,
  '+1245',
      ],
      [
  62697765600, #    utc_start 1987-10-24 14:00:00 (Sat)
  62709256800, #      utc_end 1988-03-05 14:00:00 (Sat)
  62697815100, #  local_start 1987-10-25 03:45:00 (Sun)
  62709306300, #    local_end 1988-03-06 03:45:00 (Sun)
  49500,
  1,
  '+1345',
      ],
      [
  62709256800, #    utc_start 1988-03-05 14:00:00 (Sat)
  62729820000, #      utc_end 1988-10-29 14:00:00 (Sat)
  62709302700, #  local_start 1988-03-06 02:45:00 (Sun)
  62729865900, #    local_end 1988-10-30 02:45:00 (Sun)
  45900,
  0,
  '+1245',
      ],
      [
  62729820000, #    utc_start 1988-10-29 14:00:00 (Sat)
  62740706400, #      utc_end 1989-03-04 14:00:00 (Sat)
  62729869500, #  local_start 1988-10-30 03:45:00 (Sun)
  62740755900, #    local_end 1989-03-05 03:45:00 (Sun)
  49500,
  1,
  '+1345',
      ],
      [
  62740706400, #    utc_start 1989-03-04 14:00:00 (Sat)
  62759455200, #      utc_end 1989-10-07 14:00:00 (Sat)
  62740752300, #  local_start 1989-03-05 02:45:00 (Sun)
  62759501100, #    local_end 1989-10-08 02:45:00 (Sun)
  45900,
  0,
  '+1245',
      ],
      [
  62759455200, #    utc_start 1989-10-07 14:00:00 (Sat)
  62773365600, #      utc_end 1990-03-17 14:00:00 (Sat)
  62759504700, #  local_start 1989-10-08 03:45:00 (Sun)
  62773415100, #    local_end 1990-03-18 03:45:00 (Sun)
  49500,
  1,
  '+1345',
      ],
      [
  62773365600, #    utc_start 1990-03-17 14:00:00 (Sat)
  62790904800, #      utc_end 1990-10-06 14:00:00 (Sat)
  62773411500, #  local_start 1990-03-18 02:45:00 (Sun)
  62790950700, #    local_end 1990-10-07 02:45:00 (Sun)
  45900,
  0,
  '+1245',
      ],
      [
  62790904800, #    utc_start 1990-10-06 14:00:00 (Sat)
  62804815200, #      utc_end 1991-03-16 14:00:00 (Sat)
  62790954300, #  local_start 1990-10-07 03:45:00 (Sun)
  62804864700, #    local_end 1991-03-17 03:45:00 (Sun)
  49500,
  1,
  '+1345',
      ],
      [
  62804815200, #    utc_start 1991-03-16 14:00:00 (Sat)
  62822354400, #      utc_end 1991-10-05 14:00:00 (Sat)
  62804861100, #  local_start 1991-03-17 02:45:00 (Sun)
  62822400300, #    local_end 1991-10-06 02:45:00 (Sun)
  45900,
  0,
  '+1245',
      ],
      [
  62822354400, #    utc_start 1991-10-05 14:00:00 (Sat)
  62836264800, #      utc_end 1992-03-14 14:00:00 (Sat)
  62822403900, #  local_start 1991-10-06 03:45:00 (Sun)
  62836314300, #    local_end 1992-03-15 03:45:00 (Sun)
  49500,
  1,
  '+1345',
      ],
      [
  62836264800, #    utc_start 1992-03-14 14:00:00 (Sat)
  62853804000, #      utc_end 1992-10-03 14:00:00 (Sat)
  62836310700, #  local_start 1992-03-15 02:45:00 (Sun)
  62853849900, #    local_end 1992-10-04 02:45:00 (Sun)
  45900,
  0,
  '+1245',
      ],
      [
  62853804000, #    utc_start 1992-10-03 14:00:00 (Sat)
  62868319200, #      utc_end 1993-03-20 14:00:00 (Sat)
  62853853500, #  local_start 1992-10-04 03:45:00 (Sun)
  62868368700, #    local_end 1993-03-21 03:45:00 (Sun)
  49500,
  1,
  '+1345',
      ],
      [
  62868319200, #    utc_start 1993-03-20 14:00:00 (Sat)
  62885253600, #      utc_end 1993-10-02 14:00:00 (Sat)
  62868365100, #  local_start 1993-03-21 02:45:00 (Sun)
  62885299500, #    local_end 1993-10-03 02:45:00 (Sun)
  45900,
  0,
  '+1245',
      ],
      [
  62885253600, #    utc_start 1993-10-02 14:00:00 (Sat)
  62899768800, #      utc_end 1994-03-19 14:00:00 (Sat)
  62885303100, #  local_start 1993-10-03 03:45:00 (Sun)
  62899818300, #    local_end 1994-03-20 03:45:00 (Sun)
  49500,
  1,
  '+1345',
      ],
      [
  62899768800, #    utc_start 1994-03-19 14:00:00 (Sat)
  62916703200, #      utc_end 1994-10-01 14:00:00 (Sat)
  62899814700, #  local_start 1994-03-20 02:45:00 (Sun)
  62916749100, #    local_end 1994-10-02 02:45:00 (Sun)
  45900,
  0,
  '+1245',
      ],
      [
  62916703200, #    utc_start 1994-10-01 14:00:00 (Sat)
  62931218400, #      utc_end 1995-03-18 14:00:00 (Sat)
  62916752700, #  local_start 1994-10-02 03:45:00 (Sun)
  62931267900, #    local_end 1995-03-19 03:45:00 (Sun)
  49500,
  1,
  '+1345',
      ],
      [
  62931218400, #    utc_start 1995-03-18 14:00:00 (Sat)
  62948152800, #      utc_end 1995-09-30 14:00:00 (Sat)
  62931264300, #  local_start 1995-03-19 02:45:00 (Sun)
  62948198700, #    local_end 1995-10-01 02:45:00 (Sun)
  45900,
  0,
  '+1245',
      ],
      [
  62948152800, #    utc_start 1995-09-30 14:00:00 (Sat)
  62962668000, #      utc_end 1996-03-16 14:00:00 (Sat)
  62948202300, #  local_start 1995-10-01 03:45:00 (Sun)
  62962717500, #    local_end 1996-03-17 03:45:00 (Sun)
  49500,
  1,
  '+1345',
      ],
      [
  62962668000, #    utc_start 1996-03-16 14:00:00 (Sat)
  62980207200, #      utc_end 1996-10-05 14:00:00 (Sat)
  62962713900, #  local_start 1996-03-17 02:45:00 (Sun)
  62980253100, #    local_end 1996-10-06 02:45:00 (Sun)
  45900,
  0,
  '+1245',
      ],
      [
  62980207200, #    utc_start 1996-10-05 14:00:00 (Sat)
  62994117600, #      utc_end 1997-03-15 14:00:00 (Sat)
  62980256700, #  local_start 1996-10-06 03:45:00 (Sun)
  62994167100, #    local_end 1997-03-16 03:45:00 (Sun)
  49500,
  1,
  '+1345',
      ],
      [
  62994117600, #    utc_start 1997-03-15 14:00:00 (Sat)
  63011656800, #      utc_end 1997-10-04 14:00:00 (Sat)
  62994163500, #  local_start 1997-03-16 02:45:00 (Sun)
  63011702700, #    local_end 1997-10-05 02:45:00 (Sun)
  45900,
  0,
  '+1245',
      ],
      [
  63011656800, #    utc_start 1997-10-04 14:00:00 (Sat)
  63025567200, #      utc_end 1998-03-14 14:00:00 (Sat)
  63011706300, #  local_start 1997-10-05 03:45:00 (Sun)
  63025616700, #    local_end 1998-03-15 03:45:00 (Sun)
  49500,
  1,
  '+1345',
      ],
      [
  63025567200, #    utc_start 1998-03-14 14:00:00 (Sat)
  63043106400, #      utc_end 1998-10-03 14:00:00 (Sat)
  63025613100, #  local_start 1998-03-15 02:45:00 (Sun)
  63043152300, #    local_end 1998-10-04 02:45:00 (Sun)
  45900,
  0,
  '+1245',
      ],
      [
  63043106400, #    utc_start 1998-10-03 14:00:00 (Sat)
  63057621600, #      utc_end 1999-03-20 14:00:00 (Sat)
  63043155900, #  local_start 1998-10-04 03:45:00 (Sun)
  63057671100, #    local_end 1999-03-21 03:45:00 (Sun)
  49500,
  1,
  '+1345',
      ],
      [
  63057621600, #    utc_start 1999-03-20 14:00:00 (Sat)
  63074556000, #      utc_end 1999-10-02 14:00:00 (Sat)
  63057667500, #  local_start 1999-03-21 02:45:00 (Sun)
  63074601900, #    local_end 1999-10-03 02:45:00 (Sun)
  45900,
  0,
  '+1245',
      ],
      [
  63074556000, #    utc_start 1999-10-02 14:00:00 (Sat)
  63089071200, #      utc_end 2000-03-18 14:00:00 (Sat)
  63074605500, #  local_start 1999-10-03 03:45:00 (Sun)
  63089120700, #    local_end 2000-03-19 03:45:00 (Sun)
  49500,
  1,
  '+1345',
      ],
      [
  63089071200, #    utc_start 2000-03-18 14:00:00 (Sat)
  63106005600, #      utc_end 2000-09-30 14:00:00 (Sat)
  63089117100, #  local_start 2000-03-19 02:45:00 (Sun)
  63106051500, #    local_end 2000-10-01 02:45:00 (Sun)
  45900,
  0,
  '+1245',
      ],
      [
  63106005600, #    utc_start 2000-09-30 14:00:00 (Sat)
  63120520800, #      utc_end 2001-03-17 14:00:00 (Sat)
  63106055100, #  local_start 2000-10-01 03:45:00 (Sun)
  63120570300, #    local_end 2001-03-18 03:45:00 (Sun)
  49500,
  1,
  '+1345',
      ],
      [
  63120520800, #    utc_start 2001-03-17 14:00:00 (Sat)
  63138060000, #      utc_end 2001-10-06 14:00:00 (Sat)
  63120566700, #  local_start 2001-03-18 02:45:00 (Sun)
  63138105900, #    local_end 2001-10-07 02:45:00 (Sun)
  45900,
  0,
  '+1245',
      ],
      [
  63138060000, #    utc_start 2001-10-06 14:00:00 (Sat)
  63151970400, #      utc_end 2002-03-16 14:00:00 (Sat)
  63138109500, #  local_start 2001-10-07 03:45:00 (Sun)
  63152019900, #    local_end 2002-03-17 03:45:00 (Sun)
  49500,
  1,
  '+1345',
      ],
      [
  63151970400, #    utc_start 2002-03-16 14:00:00 (Sat)
  63169509600, #      utc_end 2002-10-05 14:00:00 (Sat)
  63152016300, #  local_start 2002-03-17 02:45:00 (Sun)
  63169555500, #    local_end 2002-10-06 02:45:00 (Sun)
  45900,
  0,
  '+1245',
      ],
      [
  63169509600, #    utc_start 2002-10-05 14:00:00 (Sat)
  63183420000, #      utc_end 2003-03-15 14:00:00 (Sat)
  63169559100, #  local_start 2002-10-06 03:45:00 (Sun)
  63183469500, #    local_end 2003-03-16 03:45:00 (Sun)
  49500,
  1,
  '+1345',
      ],
      [
  63183420000, #    utc_start 2003-03-15 14:00:00 (Sat)
  63200959200, #      utc_end 2003-10-04 14:00:00 (Sat)
  63183465900, #  local_start 2003-03-16 02:45:00 (Sun)
  63201005100, #    local_end 2003-10-05 02:45:00 (Sun)
  45900,
  0,
  '+1245',
      ],
      [
  63200959200, #    utc_start 2003-10-04 14:00:00 (Sat)
  63215474400, #      utc_end 2004-03-20 14:00:00 (Sat)
  63201008700, #  local_start 2003-10-05 03:45:00 (Sun)
  63215523900, #    local_end 2004-03-21 03:45:00 (Sun)
  49500,
  1,
  '+1345',
      ],
      [
  63215474400, #    utc_start 2004-03-20 14:00:00 (Sat)
  63232408800, #      utc_end 2004-10-02 14:00:00 (Sat)
  63215520300, #  local_start 2004-03-21 02:45:00 (Sun)
  63232454700, #    local_end 2004-10-03 02:45:00 (Sun)
  45900,
  0,
  '+1245',
      ],
      [
  63232408800, #    utc_start 2004-10-02 14:00:00 (Sat)
  63246924000, #      utc_end 2005-03-19 14:00:00 (Sat)
  63232458300, #  local_start 2004-10-03 03:45:00 (Sun)
  63246973500, #    local_end 2005-03-20 03:45:00 (Sun)
  49500,
  1,
  '+1345',
      ],
      [
  63246924000, #    utc_start 2005-03-19 14:00:00 (Sat)
  63263858400, #      utc_end 2005-10-01 14:00:00 (Sat)
  63246969900, #  local_start 2005-03-20 02:45:00 (Sun)
  63263904300, #    local_end 2005-10-02 02:45:00 (Sun)
  45900,
  0,
  '+1245',
      ],
      [
  63263858400, #    utc_start 2005-10-01 14:00:00 (Sat)
  63278373600, #      utc_end 2006-03-18 14:00:00 (Sat)
  63263907900, #  local_start 2005-10-02 03:45:00 (Sun)
  63278423100, #    local_end 2006-03-19 03:45:00 (Sun)
  49500,
  1,
  '+1345',
      ],
      [
  63278373600, #    utc_start 2006-03-18 14:00:00 (Sat)
  63295308000, #      utc_end 2006-09-30 14:00:00 (Sat)
  63278419500, #  local_start 2006-03-19 02:45:00 (Sun)
  63295353900, #    local_end 2006-10-01 02:45:00 (Sun)
  45900,
  0,
  '+1245',
      ],
      [
  63295308000, #    utc_start 2006-09-30 14:00:00 (Sat)
  63309823200, #      utc_end 2007-03-17 14:00:00 (Sat)
  63295357500, #  local_start 2006-10-01 03:45:00 (Sun)
  63309872700, #    local_end 2007-03-18 03:45:00 (Sun)
  49500,
  1,
  '+1345',
      ],
      [
  63309823200, #    utc_start 2007-03-17 14:00:00 (Sat)
  63326757600, #      utc_end 2007-09-29 14:00:00 (Sat)
  63309869100, #  local_start 2007-03-18 02:45:00 (Sun)
  63326803500, #    local_end 2007-09-30 02:45:00 (Sun)
  45900,
  0,
  '+1245',
      ],
      [
  63326757600, #    utc_start 2007-09-29 14:00:00 (Sat)
  63343087200, #      utc_end 2008-04-05 14:00:00 (Sat)
  63326807100, #  local_start 2007-09-30 03:45:00 (Sun)
  63343136700, #    local_end 2008-04-06 03:45:00 (Sun)
  49500,
  1,
  '+1345',
      ],
      [
  63343087200, #    utc_start 2008-04-05 14:00:00 (Sat)
  63358207200, #      utc_end 2008-09-27 14:00:00 (Sat)
  63343133100, #  local_start 2008-04-06 02:45:00 (Sun)
  63358253100, #    local_end 2008-09-28 02:45:00 (Sun)
  45900,
  0,
  '+1245',
      ],
      [
  63358207200, #    utc_start 2008-09-27 14:00:00 (Sat)
  63374536800, #      utc_end 2009-04-04 14:00:00 (Sat)
  63358256700, #  local_start 2008-09-28 03:45:00 (Sun)
  63374586300, #    local_end 2009-04-05 03:45:00 (Sun)
  49500,
  1,
  '+1345',
      ],
      [
  63374536800, #    utc_start 2009-04-04 14:00:00 (Sat)
  63389656800, #      utc_end 2009-09-26 14:00:00 (Sat)
  63374582700, #  local_start 2009-04-05 02:45:00 (Sun)
  63389702700, #    local_end 2009-09-27 02:45:00 (Sun)
  45900,
  0,
  '+1245',
      ],
      [
  63389656800, #    utc_start 2009-09-26 14:00:00 (Sat)
  63405986400, #      utc_end 2010-04-03 14:00:00 (Sat)
  63389706300, #  local_start 2009-09-27 03:45:00 (Sun)
  63406035900, #    local_end 2010-04-04 03:45:00 (Sun)
  49500,
  1,
  '+1345',
      ],
      [
  63405986400, #    utc_start 2010-04-03 14:00:00 (Sat)
  63421106400, #      utc_end 2010-09-25 14:00:00 (Sat)
  63406032300, #  local_start 2010-04-04 02:45:00 (Sun)
  63421152300, #    local_end 2010-09-26 02:45:00 (Sun)
  45900,
  0,
  '+1245',
      ],
      [
  63421106400, #    utc_start 2010-09-25 14:00:00 (Sat)
  63437436000, #      utc_end 2011-04-02 14:00:00 (Sat)
  63421155900, #  local_start 2010-09-26 03:45:00 (Sun)
  63437485500, #    local_end 2011-04-03 03:45:00 (Sun)
  49500,
  1,
  '+1345',
      ],
      [
  63437436000, #    utc_start 2011-04-02 14:00:00 (Sat)
  63452556000, #      utc_end 2011-09-24 14:00:00 (Sat)
  63437481900, #  local_start 2011-04-03 02:45:00 (Sun)
  63452601900, #    local_end 2011-09-25 02:45:00 (Sun)
  45900,
  0,
  '+1245',
      ],
      [
  63452556000, #    utc_start 2011-09-24 14:00:00 (Sat)
  63468885600, #      utc_end 2012-03-31 14:00:00 (Sat)
  63452605500, #  local_start 2011-09-25 03:45:00 (Sun)
  63468935100, #    local_end 2012-04-01 03:45:00 (Sun)
  49500,
  1,
  '+1345',
      ],
      [
  63468885600, #    utc_start 2012-03-31 14:00:00 (Sat)
  63484610400, #      utc_end 2012-09-29 14:00:00 (Sat)
  63468931500, #  local_start 2012-04-01 02:45:00 (Sun)
  63484656300, #    local_end 2012-09-30 02:45:00 (Sun)
  45900,
  0,
  '+1245',
      ],
      [
  63484610400, #    utc_start 2012-09-29 14:00:00 (Sat)
  63500940000, #      utc_end 2013-04-06 14:00:00 (Sat)
  63484659900, #  local_start 2012-09-30 03:45:00 (Sun)
  63500989500, #    local_end 2013-04-07 03:45:00 (Sun)
  49500,
  1,
  '+1345',
      ],
      [
  63500940000, #    utc_start 2013-04-06 14:00:00 (Sat)
  63516060000, #      utc_end 2013-09-28 14:00:00 (Sat)
  63500985900, #  local_start 2013-04-07 02:45:00 (Sun)
  63516105900, #    local_end 2013-09-29 02:45:00 (Sun)
  45900,
  0,
  '+1245',
      ],
      [
  63516060000, #    utc_start 2013-09-28 14:00:00 (Sat)
  63532389600, #      utc_end 2014-04-05 14:00:00 (Sat)
  63516109500, #  local_start 2013-09-29 03:45:00 (Sun)
  63532439100, #    local_end 2014-04-06 03:45:00 (Sun)
  49500,
  1,
  '+1345',
      ],
      [
  63532389600, #    utc_start 2014-04-05 14:00:00 (Sat)
  63547509600, #      utc_end 2014-09-27 14:00:00 (Sat)
  63532435500, #  local_start 2014-04-06 02:45:00 (Sun)
  63547555500, #    local_end 2014-09-28 02:45:00 (Sun)
  45900,
  0,
  '+1245',
      ],
      [
  63547509600, #    utc_start 2014-09-27 14:00:00 (Sat)
  63563839200, #      utc_end 2015-04-04 14:00:00 (Sat)
  63547559100, #  local_start 2014-09-28 03:45:00 (Sun)
  63563888700, #    local_end 2015-04-05 03:45:00 (Sun)
  49500,
  1,
  '+1345',
      ],
      [
  63563839200, #    utc_start 2015-04-04 14:00:00 (Sat)
  63578959200, #      utc_end 2015-09-26 14:00:00 (Sat)
  63563885100, #  local_start 2015-04-05 02:45:00 (Sun)
  63579005100, #    local_end 2015-09-27 02:45:00 (Sun)
  45900,
  0,
  '+1245',
      ],
      [
  63578959200, #    utc_start 2015-09-26 14:00:00 (Sat)
  63595288800, #      utc_end 2016-04-02 14:00:00 (Sat)
  63579008700, #  local_start 2015-09-27 03:45:00 (Sun)
  63595338300, #    local_end 2016-04-03 03:45:00 (Sun)
  49500,
  1,
  '+1345',
      ],
      [
  63595288800, #    utc_start 2016-04-02 14:00:00 (Sat)
  63610408800, #      utc_end 2016-09-24 14:00:00 (Sat)
  63595334700, #  local_start 2016-04-03 02:45:00 (Sun)
  63610454700, #    local_end 2016-09-25 02:45:00 (Sun)
  45900,
  0,
  '+1245',
      ],
      [
  63610408800, #    utc_start 2016-09-24 14:00:00 (Sat)
  63626738400, #      utc_end 2017-04-01 14:00:00 (Sat)
  63610458300, #  local_start 2016-09-25 03:45:00 (Sun)
  63626787900, #    local_end 2017-04-02 03:45:00 (Sun)
  49500,
  1,
  '+1345',
      ],
      [
  63626738400, #    utc_start 2017-04-01 14:00:00 (Sat)
  63641858400, #      utc_end 2017-09-23 14:00:00 (Sat)
  63626784300, #  local_start 2017-04-02 02:45:00 (Sun)
  63641904300, #    local_end 2017-09-24 02:45:00 (Sun)
  45900,
  0,
  '+1245',
      ],
      [
  63641858400, #    utc_start 2017-09-23 14:00:00 (Sat)
  63658188000, #      utc_end 2018-03-31 14:00:00 (Sat)
  63641907900, #  local_start 2017-09-24 03:45:00 (Sun)
  63658237500, #    local_end 2018-04-01 03:45:00 (Sun)
  49500,
  1,
  '+1345',
      ],
      [
  63658188000, #    utc_start 2018-03-31 14:00:00 (Sat)
  63673912800, #      utc_end 2018-09-29 14:00:00 (Sat)
  63658233900, #  local_start 2018-04-01 02:45:00 (Sun)
  63673958700, #    local_end 2018-09-30 02:45:00 (Sun)
  45900,
  0,
  '+1245',
      ],
      [
  63673912800, #    utc_start 2018-09-29 14:00:00 (Sat)
  63690242400, #      utc_end 2019-04-06 14:00:00 (Sat)
  63673962300, #  local_start 2018-09-30 03:45:00 (Sun)
  63690291900, #    local_end 2019-04-07 03:45:00 (Sun)
  49500,
  1,
  '+1345',
      ],
      [
  63690242400, #    utc_start 2019-04-06 14:00:00 (Sat)
  63705362400, #      utc_end 2019-09-28 14:00:00 (Sat)
  63690288300, #  local_start 2019-04-07 02:45:00 (Sun)
  63705408300, #    local_end 2019-09-29 02:45:00 (Sun)
  45900,
  0,
  '+1245',
      ],
      [
  63705362400, #    utc_start 2019-09-28 14:00:00 (Sat)
  63721692000, #      utc_end 2020-04-04 14:00:00 (Sat)
  63705411900, #  local_start 2019-09-29 03:45:00 (Sun)
  63721741500, #    local_end 2020-04-05 03:45:00 (Sun)
  49500,
  1,
  '+1345',
      ],
      [
  63721692000, #    utc_start 2020-04-04 14:00:00 (Sat)
  63736812000, #      utc_end 2020-09-26 14:00:00 (Sat)
  63721737900, #  local_start 2020-04-05 02:45:00 (Sun)
  63736857900, #    local_end 2020-09-27 02:45:00 (Sun)
  45900,
  0,
  '+1245',
      ],
      [
  63736812000, #    utc_start 2020-09-26 14:00:00 (Sat)
  63753141600, #      utc_end 2021-04-03 14:00:00 (Sat)
  63736861500, #  local_start 2020-09-27 03:45:00 (Sun)
  63753191100, #    local_end 2021-04-04 03:45:00 (Sun)
  49500,
  1,
  '+1345',
      ],
      [
  63753141600, #    utc_start 2021-04-03 14:00:00 (Sat)
  63768261600, #      utc_end 2021-09-25 14:00:00 (Sat)
  63753187500, #  local_start 2021-04-04 02:45:00 (Sun)
  63768307500, #    local_end 2021-09-26 02:45:00 (Sun)
  45900,
  0,
  '+1245',
      ],
      [
  63768261600, #    utc_start 2021-09-25 14:00:00 (Sat)
  63784591200, #      utc_end 2022-04-02 14:00:00 (Sat)
  63768311100, #  local_start 2021-09-26 03:45:00 (Sun)
  63784640700, #    local_end 2022-04-03 03:45:00 (Sun)
  49500,
  1,
  '+1345',
      ],
      [
  63784591200, #    utc_start 2022-04-02 14:00:00 (Sat)
  63799711200, #      utc_end 2022-09-24 14:00:00 (Sat)
  63784637100, #  local_start 2022-04-03 02:45:00 (Sun)
  63799757100, #    local_end 2022-09-25 02:45:00 (Sun)
  45900,
  0,
  '+1245',
      ],
      [
  63799711200, #    utc_start 2022-09-24 14:00:00 (Sat)
  63816040800, #      utc_end 2023-04-01 14:00:00 (Sat)
  63799760700, #  local_start 2022-09-25 03:45:00 (Sun)
  63816090300, #    local_end 2023-04-02 03:45:00 (Sun)
  49500,
  1,
  '+1345',
      ],
      [
  63816040800, #    utc_start 2023-04-01 14:00:00 (Sat)
  63831160800, #      utc_end 2023-09-23 14:00:00 (Sat)
  63816086700, #  local_start 2023-04-02 02:45:00 (Sun)
  63831206700, #    local_end 2023-09-24 02:45:00 (Sun)
  45900,
  0,
  '+1245',
      ],
      [
  63831160800, #    utc_start 2023-09-23 14:00:00 (Sat)
  63848095200, #      utc_end 2024-04-06 14:00:00 (Sat)
  63831210300, #  local_start 2023-09-24 03:45:00 (Sun)
  63848144700, #    local_end 2024-04-07 03:45:00 (Sun)
  49500,
  1,
  '+1345',
      ],
      [
  63848095200, #    utc_start 2024-04-06 14:00:00 (Sat)
  63863215200, #      utc_end 2024-09-28 14:00:00 (Sat)
  63848141100, #  local_start 2024-04-07 02:45:00 (Sun)
  63863261100, #    local_end 2024-09-29 02:45:00 (Sun)
  45900,
  0,
  '+1245',
      ],
      [
  63863215200, #    utc_start 2024-09-28 14:00:00 (Sat)
  63879544800, #      utc_end 2025-04-05 14:00:00 (Sat)
  63863264700, #  local_start 2024-09-29 03:45:00 (Sun)
  63879594300, #    local_end 2025-04-06 03:45:00 (Sun)
  49500,
  1,
  '+1345',
      ],
      [
  63879544800, #    utc_start 2025-04-05 14:00:00 (Sat)
  63894664800, #      utc_end 2025-09-27 14:00:00 (Sat)
  63879590700, #  local_start 2025-04-06 02:45:00 (Sun)
  63894710700, #    local_end 2025-09-28 02:45:00 (Sun)
  45900,
  0,
  '+1245',
      ],
      [
  63894664800, #    utc_start 2025-09-27 14:00:00 (Sat)
  63910994400, #      utc_end 2026-04-04 14:00:00 (Sat)
  63894714300, #  local_start 2025-09-28 03:45:00 (Sun)
  63911043900, #    local_end 2026-04-05 03:45:00 (Sun)
  49500,
  1,
  '+1345',
      ],
      [
  63910994400, #    utc_start 2026-04-04 14:00:00 (Sat)
  63926114400, #      utc_end 2026-09-26 14:00:00 (Sat)
  63911040300, #  local_start 2026-04-05 02:45:00 (Sun)
  63926160300, #    local_end 2026-09-27 02:45:00 (Sun)
  45900,
  0,
  '+1245',
      ],
      [
  63926114400, #    utc_start 2026-09-26 14:00:00 (Sat)
  63942444000, #      utc_end 2027-04-03 14:00:00 (Sat)
  63926163900, #  local_start 2026-09-27 03:45:00 (Sun)
  63942493500, #    local_end 2027-04-04 03:45:00 (Sun)
  49500,
  1,
  '+1345',
      ],
      [
  63942444000, #    utc_start 2027-04-03 14:00:00 (Sat)
  63957564000, #      utc_end 2027-09-25 14:00:00 (Sat)
  63942489900, #  local_start 2027-04-04 02:45:00 (Sun)
  63957609900, #    local_end 2027-09-26 02:45:00 (Sun)
  45900,
  0,
  '+1245',
      ],
      [
  63957564000, #    utc_start 2027-09-25 14:00:00 (Sat)
  63973893600, #      utc_end 2028-04-01 14:00:00 (Sat)
  63957613500, #  local_start 2027-09-26 03:45:00 (Sun)
  63973943100, #    local_end 2028-04-02 03:45:00 (Sun)
  49500,
  1,
  '+1345',
      ],
      [
  63973893600, #    utc_start 2028-04-01 14:00:00 (Sat)
  63989013600, #      utc_end 2028-09-23 14:00:00 (Sat)
  63973939500, #  local_start 2028-04-02 02:45:00 (Sun)
  63989059500, #    local_end 2028-09-24 02:45:00 (Sun)
  45900,
  0,
  '+1245',
      ],
      [
  63989013600, #    utc_start 2028-09-23 14:00:00 (Sat)
  64005343200, #      utc_end 2029-03-31 14:00:00 (Sat)
  63989063100, #  local_start 2028-09-24 03:45:00 (Sun)
  64005392700, #    local_end 2029-04-01 03:45:00 (Sun)
  49500,
  1,
  '+1345',
      ],
      [
  64005343200, #    utc_start 2029-03-31 14:00:00 (Sat)
  64021068000, #      utc_end 2029-09-29 14:00:00 (Sat)
  64005389100, #  local_start 2029-04-01 02:45:00 (Sun)
  64021113900, #    local_end 2029-09-30 02:45:00 (Sun)
  45900,
  0,
  '+1245',
      ],
      [
  64021068000, #    utc_start 2029-09-29 14:00:00 (Sat)
  64037397600, #      utc_end 2030-04-06 14:00:00 (Sat)
  64021117500, #  local_start 2029-09-30 03:45:00 (Sun)
  64037447100, #    local_end 2030-04-07 03:45:00 (Sun)
  49500,
  1,
  '+1345',
      ],
      [
  64037397600, #    utc_start 2030-04-06 14:00:00 (Sat)
  64052517600, #      utc_end 2030-09-28 14:00:00 (Sat)
  64037443500, #  local_start 2030-04-07 02:45:00 (Sun)
  64052563500, #    local_end 2030-09-29 02:45:00 (Sun)
  45900,
  0,
  '+1245',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {57}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { 45900 }
  
  my $last_observance = bless( {
    'format' => '+1245/+1345',
    'gmtoff' => '12:45',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 710397,
      'local_rd_secs' => 1800,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 710397,
      'utc_rd_secs' => 1800,
      'utc_year' => 1947
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => 45900,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 710396,
      'local_rd_secs' => 42300,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 710396,
      'utc_rd_secs' => 42300,
      'utc_year' => 1946
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:45s',
      'from' => '2007',
      'in' => 'Sep',
      'letter' => '',
      'name' => 'Chatham',
      'offset_from_std' => 3600,
      'on' => 'lastSun',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '2:45s',
      'from' => '2008',
      'in' => 'Apr',
      'letter' => '',
      'name' => 'Chatham',
      'offset_from_std' => 0,
      'on' => 'Sun>=1',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_PACIFIC_CHATHAM

    $main::fatpacked{"DateTime/TimeZone/Pacific/Chuuk.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_PACIFIC_CHUUK';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/australasia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Pacific::Chuuk;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Pacific::Chuuk::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  58191054772, #      utc_end 1844-12-31 13:52:52 (Tue)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  58191004800, #    local_end 1844-12-31 00:00:00 (Tue)
  -49972,
  0,
  'LMT',
      ],
      [
  58191054772, #    utc_start 1844-12-31 13:52:52 (Tue)
  59958193972, #      utc_end 1900-12-31 13:52:52 (Mon)
  58191091200, #  local_start 1845-01-01 00:00:00 (Wed)
  59958230400, #    local_end 1901-01-01 00:00:00 (Tue)
  36428,
  0,
  'LMT',
      ],
      [
  59958193972, #    utc_start 1900-12-31 13:52:52 (Mon)
  60392008800, #      utc_end 1914-09-30 14:00:00 (Wed)
  59958229972, #  local_start 1900-12-31 23:52:52 (Mon)
  60392044800, #    local_end 1914-10-01 00:00:00 (Thu)
  36000,
  0,
  '+10',
      ],
      [
  60392008800, #    utc_start 1914-09-30 14:00:00 (Wed)
  60528870000, #      utc_end 1919-01-31 15:00:00 (Fri)
  60392041200, #  local_start 1914-09-30 23:00:00 (Wed)
  60528902400, #    local_end 1919-02-01 00:00:00 (Sat)
  32400,
  0,
  '+09',
      ],
      [
  60528870000, #    utc_start 1919-01-31 15:00:00 (Fri)
  61228274400, #      utc_end 1941-03-31 14:00:00 (Mon)
  60528906000, #  local_start 1919-02-01 01:00:00 (Sat)
  61228310400, #    local_end 1941-04-01 00:00:00 (Tue)
  36000,
  0,
  '+10',
      ],
      [
  61228274400, #    utc_start 1941-03-31 14:00:00 (Mon)
  61365049200, #      utc_end 1945-07-31 15:00:00 (Tue)
  61228306800, #  local_start 1941-03-31 23:00:00 (Mon)
  61365081600, #    local_end 1945-08-01 00:00:00 (Wed)
  32400,
  0,
  '+09',
      ],
      [
  61365049200, #    utc_start 1945-07-31 15:00:00 (Tue)
  DateTime::TimeZone::INFINITY, #      utc_end
  61365085200, #  local_start 1945-08-01 01:00:00 (Wed)
  DateTime::TimeZone::INFINITY, #    local_end
  36000,
  0,
  '+10',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_PACIFIC_CHUUK

    $main::fatpacked{"DateTime/TimeZone/Pacific/Easter.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_PACIFIC_EASTER';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/southamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Pacific::Easter;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Pacific::Easter::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59611187848, #      utc_end 1890-01-01 07:17:28 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59611161600, #    local_end 1890-01-01 00:00:00 (Wed)
  -26248,
  0,
  'LMT',
      ],
      [
  59611187848, #    utc_start 1890-01-01 07:17:28 (Wed)
  60957559048, #      utc_end 1932-09-01 07:17:28 (Thu)
  59611161600, #  local_start 1890-01-01 00:00:00 (Wed)
  60957532800, #    local_end 1932-09-01 00:00:00 (Thu)
  -26248,
  0,
  'EMT',
      ],
      [
  60957559048, #    utc_start 1932-09-01 07:17:28 (Thu)
  62099064000, #      utc_end 1968-11-03 04:00:00 (Sun)
  60957533848, #  local_start 1932-09-01 00:17:28 (Thu)
  62099038800, #    local_end 1968-11-02 21:00:00 (Sat)
  -25200,
  0,
  '-07',
      ],
      [
  62099064000, #    utc_start 1968-11-03 04:00:00 (Sun)
  62111761200, #      utc_end 1969-03-30 03:00:00 (Sun)
  62099042400, #  local_start 1968-11-02 22:00:00 (Sat)
  62111739600, #    local_end 1969-03-29 21:00:00 (Sat)
  -21600,
  1,
  '-06',
      ],
      [
  62111761200, #    utc_start 1969-03-30 03:00:00 (Sun)
  62132328000, #      utc_end 1969-11-23 04:00:00 (Sun)
  62111736000, #  local_start 1969-03-29 20:00:00 (Sat)
  62132302800, #    local_end 1969-11-22 21:00:00 (Sat)
  -25200,
  0,
  '-07',
      ],
      [
  62132328000, #    utc_start 1969-11-23 04:00:00 (Sun)
  62143210800, #      utc_end 1970-03-29 03:00:00 (Sun)
  62132306400, #  local_start 1969-11-22 22:00:00 (Sat)
  62143189200, #    local_end 1970-03-28 21:00:00 (Sat)
  -21600,
  1,
  '-06',
      ],
      [
  62143210800, #    utc_start 1970-03-29 03:00:00 (Sun)
  62160148800, #      utc_end 1970-10-11 04:00:00 (Sun)
  62143185600, #  local_start 1970-03-28 20:00:00 (Sat)
  62160123600, #    local_end 1970-10-10 21:00:00 (Sat)
  -25200,
  0,
  '-07',
      ],
      [
  62160148800, #    utc_start 1970-10-11 04:00:00 (Sun)
  62173450800, #      utc_end 1971-03-14 03:00:00 (Sun)
  62160127200, #  local_start 1970-10-10 22:00:00 (Sat)
  62173429200, #    local_end 1971-03-13 21:00:00 (Sat)
  -21600,
  1,
  '-06',
      ],
      [
  62173450800, #    utc_start 1971-03-14 03:00:00 (Sun)
  62191598400, #      utc_end 1971-10-10 04:00:00 (Sun)
  62173425600, #  local_start 1971-03-13 20:00:00 (Sat)
  62191573200, #    local_end 1971-10-09 21:00:00 (Sat)
  -25200,
  0,
  '-07',
      ],
      [
  62191598400, #    utc_start 1971-10-10 04:00:00 (Sun)
  62204900400, #      utc_end 1972-03-12 03:00:00 (Sun)
  62191576800, #  local_start 1971-10-09 22:00:00 (Sat)
  62204878800, #    local_end 1972-03-11 21:00:00 (Sat)
  -21600,
  1,
  '-06',
      ],
      [
  62204900400, #    utc_start 1972-03-12 03:00:00 (Sun)
  62223652800, #      utc_end 1972-10-15 04:00:00 (Sun)
  62204875200, #  local_start 1972-03-11 20:00:00 (Sat)
  62223627600, #    local_end 1972-10-14 21:00:00 (Sat)
  -25200,
  0,
  '-07',
      ],
      [
  62223652800, #    utc_start 1972-10-15 04:00:00 (Sun)
  62236350000, #      utc_end 1973-03-11 03:00:00 (Sun)
  62223631200, #  local_start 1972-10-14 22:00:00 (Sat)
  62236328400, #    local_end 1973-03-10 21:00:00 (Sat)
  -21600,
  1,
  '-06',
      ],
      [
  62236350000, #    utc_start 1973-03-11 03:00:00 (Sun)
  62253892800, #      utc_end 1973-09-30 04:00:00 (Sun)
  62236324800, #  local_start 1973-03-10 20:00:00 (Sat)
  62253867600, #    local_end 1973-09-29 21:00:00 (Sat)
  -25200,
  0,
  '-07',
      ],
      [
  62253892800, #    utc_start 1973-09-30 04:00:00 (Sun)
  62267799600, #      utc_end 1974-03-10 03:00:00 (Sun)
  62253871200, #  local_start 1973-09-29 22:00:00 (Sat)
  62267778000, #    local_end 1974-03-09 21:00:00 (Sat)
  -21600,
  1,
  '-06',
      ],
      [
  62267799600, #    utc_start 1974-03-10 03:00:00 (Sun)
  62286552000, #      utc_end 1974-10-13 04:00:00 (Sun)
  62267774400, #  local_start 1974-03-09 20:00:00 (Sat)
  62286526800, #    local_end 1974-10-12 21:00:00 (Sat)
  -25200,
  0,
  '-07',
      ],
      [
  62286552000, #    utc_start 1974-10-13 04:00:00 (Sun)
  62299249200, #      utc_end 1975-03-09 03:00:00 (Sun)
  62286530400, #  local_start 1974-10-12 22:00:00 (Sat)
  62299227600, #    local_end 1975-03-08 21:00:00 (Sat)
  -21600,
  1,
  '-06',
      ],
      [
  62299249200, #    utc_start 1975-03-09 03:00:00 (Sun)
  62318001600, #      utc_end 1975-10-12 04:00:00 (Sun)
  62299224000, #  local_start 1975-03-08 20:00:00 (Sat)
  62317976400, #    local_end 1975-10-11 21:00:00 (Sat)
  -25200,
  0,
  '-07',
      ],
      [
  62318001600, #    utc_start 1975-10-12 04:00:00 (Sun)
  62331303600, #      utc_end 1976-03-14 03:00:00 (Sun)
  62317980000, #  local_start 1975-10-11 22:00:00 (Sat)
  62331282000, #    local_end 1976-03-13 21:00:00 (Sat)
  -21600,
  1,
  '-06',
      ],
      [
  62331303600, #    utc_start 1976-03-14 03:00:00 (Sun)
  62349451200, #      utc_end 1976-10-10 04:00:00 (Sun)
  62331278400, #  local_start 1976-03-13 20:00:00 (Sat)
  62349426000, #    local_end 1976-10-09 21:00:00 (Sat)
  -25200,
  0,
  '-07',
      ],
      [
  62349451200, #    utc_start 1976-10-10 04:00:00 (Sun)
  62362753200, #      utc_end 1977-03-13 03:00:00 (Sun)
  62349429600, #  local_start 1976-10-09 22:00:00 (Sat)
  62362731600, #    local_end 1977-03-12 21:00:00 (Sat)
  -21600,
  1,
  '-06',
      ],
      [
  62362753200, #    utc_start 1977-03-13 03:00:00 (Sun)
  62380900800, #      utc_end 1977-10-09 04:00:00 (Sun)
  62362728000, #  local_start 1977-03-12 20:00:00 (Sat)
  62380875600, #    local_end 1977-10-08 21:00:00 (Sat)
  -25200,
  0,
  '-07',
      ],
      [
  62380900800, #    utc_start 1977-10-09 04:00:00 (Sun)
  62394202800, #      utc_end 1978-03-12 03:00:00 (Sun)
  62380879200, #  local_start 1977-10-08 22:00:00 (Sat)
  62394181200, #    local_end 1978-03-11 21:00:00 (Sat)
  -21600,
  1,
  '-06',
      ],
      [
  62394202800, #    utc_start 1978-03-12 03:00:00 (Sun)
  62412955200, #      utc_end 1978-10-15 04:00:00 (Sun)
  62394177600, #  local_start 1978-03-11 20:00:00 (Sat)
  62412930000, #    local_end 1978-10-14 21:00:00 (Sat)
  -25200,
  0,
  '-07',
      ],
      [
  62412955200, #    utc_start 1978-10-15 04:00:00 (Sun)
  62425652400, #      utc_end 1979-03-11 03:00:00 (Sun)
  62412933600, #  local_start 1978-10-14 22:00:00 (Sat)
  62425630800, #    local_end 1979-03-10 21:00:00 (Sat)
  -21600,
  1,
  '-06',
      ],
      [
  62425652400, #    utc_start 1979-03-11 03:00:00 (Sun)
  62444404800, #      utc_end 1979-10-14 04:00:00 (Sun)
  62425627200, #  local_start 1979-03-10 20:00:00 (Sat)
  62444379600, #    local_end 1979-10-13 21:00:00 (Sat)
  -25200,
  0,
  '-07',
      ],
      [
  62444404800, #    utc_start 1979-10-14 04:00:00 (Sun)
  62457102000, #      utc_end 1980-03-09 03:00:00 (Sun)
  62444383200, #  local_start 1979-10-13 22:00:00 (Sat)
  62457080400, #    local_end 1980-03-08 21:00:00 (Sat)
  -21600,
  1,
  '-06',
      ],
      [
  62457102000, #    utc_start 1980-03-09 03:00:00 (Sun)
  62475854400, #      utc_end 1980-10-12 04:00:00 (Sun)
  62457076800, #  local_start 1980-03-08 20:00:00 (Sat)
  62475829200, #    local_end 1980-10-11 21:00:00 (Sat)
  -25200,
  0,
  '-07',
      ],
      [
  62475854400, #    utc_start 1980-10-12 04:00:00 (Sun)
  62489156400, #      utc_end 1981-03-15 03:00:00 (Sun)
  62475832800, #  local_start 1980-10-11 22:00:00 (Sat)
  62489134800, #    local_end 1981-03-14 21:00:00 (Sat)
  -21600,
  1,
  '-06',
      ],
      [
  62489156400, #    utc_start 1981-03-15 03:00:00 (Sun)
  62507304000, #      utc_end 1981-10-11 04:00:00 (Sun)
  62489131200, #  local_start 1981-03-14 20:00:00 (Sat)
  62507278800, #    local_end 1981-10-10 21:00:00 (Sat)
  -25200,
  0,
  '-07',
      ],
      [
  62507304000, #    utc_start 1981-10-11 04:00:00 (Sun)
  62520606000, #      utc_end 1982-03-14 03:00:00 (Sun)
  62507282400, #  local_start 1981-10-10 22:00:00 (Sat)
  62520584400, #    local_end 1982-03-13 21:00:00 (Sat)
  -21600,
  1,
  '-06',
      ],
      [
  62520606000, #    utc_start 1982-03-14 03:00:00 (Sun)
  62538753600, #      utc_end 1982-10-10 04:00:00 (Sun)
  62520584400, #  local_start 1982-03-13 21:00:00 (Sat)
  62538732000, #    local_end 1982-10-09 22:00:00 (Sat)
  -21600,
  0,
  '-06',
      ],
      [
  62538753600, #    utc_start 1982-10-10 04:00:00 (Sun)
  62552055600, #      utc_end 1983-03-13 03:00:00 (Sun)
  62538735600, #  local_start 1982-10-09 23:00:00 (Sat)
  62552037600, #    local_end 1983-03-12 22:00:00 (Sat)
  -18000,
  1,
  '-05',
      ],
      [
  62552055600, #    utc_start 1983-03-13 03:00:00 (Sun)
  62570203200, #      utc_end 1983-10-09 04:00:00 (Sun)
  62552034000, #  local_start 1983-03-12 21:00:00 (Sat)
  62570181600, #    local_end 1983-10-08 22:00:00 (Sat)
  -21600,
  0,
  '-06',
      ],
      [
  62570203200, #    utc_start 1983-10-09 04:00:00 (Sun)
  62583505200, #      utc_end 1984-03-11 03:00:00 (Sun)
  62570185200, #  local_start 1983-10-08 23:00:00 (Sat)
  62583487200, #    local_end 1984-03-10 22:00:00 (Sat)
  -18000,
  1,
  '-05',
      ],
      [
  62583505200, #    utc_start 1984-03-11 03:00:00 (Sun)
  62602257600, #      utc_end 1984-10-14 04:00:00 (Sun)
  62583483600, #  local_start 1984-03-10 21:00:00 (Sat)
  62602236000, #    local_end 1984-10-13 22:00:00 (Sat)
  -21600,
  0,
  '-06',
      ],
      [
  62602257600, #    utc_start 1984-10-14 04:00:00 (Sun)
  62614954800, #      utc_end 1985-03-10 03:00:00 (Sun)
  62602239600, #  local_start 1984-10-13 23:00:00 (Sat)
  62614936800, #    local_end 1985-03-09 22:00:00 (Sat)
  -18000,
  1,
  '-05',
      ],
      [
  62614954800, #    utc_start 1985-03-10 03:00:00 (Sun)
  62633707200, #      utc_end 1985-10-13 04:00:00 (Sun)
  62614933200, #  local_start 1985-03-09 21:00:00 (Sat)
  62633685600, #    local_end 1985-10-12 22:00:00 (Sat)
  -21600,
  0,
  '-06',
      ],
      [
  62633707200, #    utc_start 1985-10-13 04:00:00 (Sun)
  62646404400, #      utc_end 1986-03-09 03:00:00 (Sun)
  62633689200, #  local_start 1985-10-12 23:00:00 (Sat)
  62646386400, #    local_end 1986-03-08 22:00:00 (Sat)
  -18000,
  1,
  '-05',
      ],
      [
  62646404400, #    utc_start 1986-03-09 03:00:00 (Sun)
  62665156800, #      utc_end 1986-10-12 04:00:00 (Sun)
  62646382800, #  local_start 1986-03-08 21:00:00 (Sat)
  62665135200, #    local_end 1986-10-11 22:00:00 (Sat)
  -21600,
  0,
  '-06',
      ],
      [
  62665156800, #    utc_start 1986-10-12 04:00:00 (Sun)
  62680878000, #      utc_end 1987-04-12 03:00:00 (Sun)
  62665138800, #  local_start 1986-10-11 23:00:00 (Sat)
  62680860000, #    local_end 1987-04-11 22:00:00 (Sat)
  -18000,
  1,
  '-05',
      ],
      [
  62680878000, #    utc_start 1987-04-12 03:00:00 (Sun)
  62696606400, #      utc_end 1987-10-11 04:00:00 (Sun)
  62680856400, #  local_start 1987-04-11 21:00:00 (Sat)
  62696584800, #    local_end 1987-10-10 22:00:00 (Sat)
  -21600,
  0,
  '-06',
      ],
      [
  62696606400, #    utc_start 1987-10-11 04:00:00 (Sun)
  62709908400, #      utc_end 1988-03-13 03:00:00 (Sun)
  62696588400, #  local_start 1987-10-10 23:00:00 (Sat)
  62709890400, #    local_end 1988-03-12 22:00:00 (Sat)
  -18000,
  1,
  '-05',
      ],
      [
  62709908400, #    utc_start 1988-03-13 03:00:00 (Sun)
  62728056000, #      utc_end 1988-10-09 04:00:00 (Sun)
  62709886800, #  local_start 1988-03-12 21:00:00 (Sat)
  62728034400, #    local_end 1988-10-08 22:00:00 (Sat)
  -21600,
  0,
  '-06',
      ],
      [
  62728056000, #    utc_start 1988-10-09 04:00:00 (Sun)
  62741358000, #      utc_end 1989-03-12 03:00:00 (Sun)
  62728038000, #  local_start 1988-10-08 23:00:00 (Sat)
  62741340000, #    local_end 1989-03-11 22:00:00 (Sat)
  -18000,
  1,
  '-05',
      ],
      [
  62741358000, #    utc_start 1989-03-12 03:00:00 (Sun)
  62760110400, #      utc_end 1989-10-15 04:00:00 (Sun)
  62741336400, #  local_start 1989-03-11 21:00:00 (Sat)
  62760088800, #    local_end 1989-10-14 22:00:00 (Sat)
  -21600,
  0,
  '-06',
      ],
      [
  62760110400, #    utc_start 1989-10-15 04:00:00 (Sun)
  62772807600, #      utc_end 1990-03-11 03:00:00 (Sun)
  62760092400, #  local_start 1989-10-14 23:00:00 (Sat)
  62772789600, #    local_end 1990-03-10 22:00:00 (Sat)
  -18000,
  1,
  '-05',
      ],
      [
  62772807600, #    utc_start 1990-03-11 03:00:00 (Sun)
  62789140800, #      utc_end 1990-09-16 04:00:00 (Sun)
  62772786000, #  local_start 1990-03-10 21:00:00 (Sat)
  62789119200, #    local_end 1990-09-15 22:00:00 (Sat)
  -21600,
  0,
  '-06',
      ],
      [
  62789140800, #    utc_start 1990-09-16 04:00:00 (Sun)
  62804257200, #      utc_end 1991-03-10 03:00:00 (Sun)
  62789122800, #  local_start 1990-09-15 23:00:00 (Sat)
  62804239200, #    local_end 1991-03-09 22:00:00 (Sat)
  -18000,
  1,
  '-05',
      ],
      [
  62804257200, #    utc_start 1991-03-10 03:00:00 (Sun)
  62823009600, #      utc_end 1991-10-13 04:00:00 (Sun)
  62804235600, #  local_start 1991-03-09 21:00:00 (Sat)
  62822988000, #    local_end 1991-10-12 22:00:00 (Sat)
  -21600,
  0,
  '-06',
      ],
      [
  62823009600, #    utc_start 1991-10-13 04:00:00 (Sun)
  62836311600, #      utc_end 1992-03-15 03:00:00 (Sun)
  62822991600, #  local_start 1991-10-12 23:00:00 (Sat)
  62836293600, #    local_end 1992-03-14 22:00:00 (Sat)
  -18000,
  1,
  '-05',
      ],
      [
  62836311600, #    utc_start 1992-03-15 03:00:00 (Sun)
  62854459200, #      utc_end 1992-10-11 04:00:00 (Sun)
  62836290000, #  local_start 1992-03-14 21:00:00 (Sat)
  62854437600, #    local_end 1992-10-10 22:00:00 (Sat)
  -21600,
  0,
  '-06',
      ],
      [
  62854459200, #    utc_start 1992-10-11 04:00:00 (Sun)
  62867761200, #      utc_end 1993-03-14 03:00:00 (Sun)
  62854441200, #  local_start 1992-10-10 23:00:00 (Sat)
  62867743200, #    local_end 1993-03-13 22:00:00 (Sat)
  -18000,
  1,
  '-05',
      ],
      [
  62867761200, #    utc_start 1993-03-14 03:00:00 (Sun)
  62885908800, #      utc_end 1993-10-10 04:00:00 (Sun)
  62867739600, #  local_start 1993-03-13 21:00:00 (Sat)
  62885887200, #    local_end 1993-10-09 22:00:00 (Sat)
  -21600,
  0,
  '-06',
      ],
      [
  62885908800, #    utc_start 1993-10-10 04:00:00 (Sun)
  62899210800, #      utc_end 1994-03-13 03:00:00 (Sun)
  62885890800, #  local_start 1993-10-09 23:00:00 (Sat)
  62899192800, #    local_end 1994-03-12 22:00:00 (Sat)
  -18000,
  1,
  '-05',
      ],
      [
  62899210800, #    utc_start 1994-03-13 03:00:00 (Sun)
  62917358400, #      utc_end 1994-10-09 04:00:00 (Sun)
  62899189200, #  local_start 1994-03-12 21:00:00 (Sat)
  62917336800, #    local_end 1994-10-08 22:00:00 (Sat)
  -21600,
  0,
  '-06',
      ],
      [
  62917358400, #    utc_start 1994-10-09 04:00:00 (Sun)
  62930660400, #      utc_end 1995-03-12 03:00:00 (Sun)
  62917340400, #  local_start 1994-10-08 23:00:00 (Sat)
  62930642400, #    local_end 1995-03-11 22:00:00 (Sat)
  -18000,
  1,
  '-05',
      ],
      [
  62930660400, #    utc_start 1995-03-12 03:00:00 (Sun)
  62949412800, #      utc_end 1995-10-15 04:00:00 (Sun)
  62930638800, #  local_start 1995-03-11 21:00:00 (Sat)
  62949391200, #    local_end 1995-10-14 22:00:00 (Sat)
  -21600,
  0,
  '-06',
      ],
      [
  62949412800, #    utc_start 1995-10-15 04:00:00 (Sun)
  62962110000, #      utc_end 1996-03-10 03:00:00 (Sun)
  62949394800, #  local_start 1995-10-14 23:00:00 (Sat)
  62962092000, #    local_end 1996-03-09 22:00:00 (Sat)
  -18000,
  1,
  '-05',
      ],
      [
  62962110000, #    utc_start 1996-03-10 03:00:00 (Sun)
  62980862400, #      utc_end 1996-10-13 04:00:00 (Sun)
  62962088400, #  local_start 1996-03-09 21:00:00 (Sat)
  62980840800, #    local_end 1996-10-12 22:00:00 (Sat)
  -21600,
  0,
  '-06',
      ],
      [
  62980862400, #    utc_start 1996-10-13 04:00:00 (Sun)
  62995374000, #      utc_end 1997-03-30 03:00:00 (Sun)
  62980844400, #  local_start 1996-10-12 23:00:00 (Sat)
  62995356000, #    local_end 1997-03-29 22:00:00 (Sat)
  -18000,
  1,
  '-05',
      ],
      [
  62995374000, #    utc_start 1997-03-30 03:00:00 (Sun)
  63012312000, #      utc_end 1997-10-12 04:00:00 (Sun)
  62995352400, #  local_start 1997-03-29 21:00:00 (Sat)
  63012290400, #    local_end 1997-10-11 22:00:00 (Sat)
  -21600,
  0,
  '-06',
      ],
      [
  63012312000, #    utc_start 1997-10-12 04:00:00 (Sun)
  63025614000, #      utc_end 1998-03-15 03:00:00 (Sun)
  63012294000, #  local_start 1997-10-11 23:00:00 (Sat)
  63025596000, #    local_end 1998-03-14 22:00:00 (Sat)
  -18000,
  1,
  '-05',
      ],
      [
  63025614000, #    utc_start 1998-03-15 03:00:00 (Sun)
  63042552000, #      utc_end 1998-09-27 04:00:00 (Sun)
  63025592400, #  local_start 1998-03-14 21:00:00 (Sat)
  63042530400, #    local_end 1998-09-26 22:00:00 (Sat)
  -21600,
  0,
  '-06',
      ],
      [
  63042552000, #    utc_start 1998-09-27 04:00:00 (Sun)
  63058878000, #      utc_end 1999-04-04 03:00:00 (Sun)
  63042534000, #  local_start 1998-09-26 23:00:00 (Sat)
  63058860000, #    local_end 1999-04-03 22:00:00 (Sat)
  -18000,
  1,
  '-05',
      ],
      [
  63058878000, #    utc_start 1999-04-04 03:00:00 (Sun)
  63075211200, #      utc_end 1999-10-10 04:00:00 (Sun)
  63058856400, #  local_start 1999-04-03 21:00:00 (Sat)
  63075189600, #    local_end 1999-10-09 22:00:00 (Sat)
  -21600,
  0,
  '-06',
      ],
      [
  63075211200, #    utc_start 1999-10-10 04:00:00 (Sun)
  63088513200, #      utc_end 2000-03-12 03:00:00 (Sun)
  63075193200, #  local_start 1999-10-09 23:00:00 (Sat)
  63088495200, #    local_end 2000-03-11 22:00:00 (Sat)
  -18000,
  1,
  '-05',
      ],
      [
  63088513200, #    utc_start 2000-03-12 03:00:00 (Sun)
  63107265600, #      utc_end 2000-10-15 04:00:00 (Sun)
  63088491600, #  local_start 2000-03-11 21:00:00 (Sat)
  63107244000, #    local_end 2000-10-14 22:00:00 (Sat)
  -21600,
  0,
  '-06',
      ],
      [
  63107265600, #    utc_start 2000-10-15 04:00:00 (Sun)
  63119962800, #      utc_end 2001-03-11 03:00:00 (Sun)
  63107247600, #  local_start 2000-10-14 23:00:00 (Sat)
  63119944800, #    local_end 2001-03-10 22:00:00 (Sat)
  -18000,
  1,
  '-05',
      ],
      [
  63119962800, #    utc_start 2001-03-11 03:00:00 (Sun)
  63138715200, #      utc_end 2001-10-14 04:00:00 (Sun)
  63119941200, #  local_start 2001-03-10 21:00:00 (Sat)
  63138693600, #    local_end 2001-10-13 22:00:00 (Sat)
  -21600,
  0,
  '-06',
      ],
      [
  63138715200, #    utc_start 2001-10-14 04:00:00 (Sun)
  63151412400, #      utc_end 2002-03-10 03:00:00 (Sun)
  63138697200, #  local_start 2001-10-13 23:00:00 (Sat)
  63151394400, #    local_end 2002-03-09 22:00:00 (Sat)
  -18000,
  1,
  '-05',
      ],
      [
  63151412400, #    utc_start 2002-03-10 03:00:00 (Sun)
  63170164800, #      utc_end 2002-10-13 04:00:00 (Sun)
  63151390800, #  local_start 2002-03-09 21:00:00 (Sat)
  63170143200, #    local_end 2002-10-12 22:00:00 (Sat)
  -21600,
  0,
  '-06',
      ],
      [
  63170164800, #    utc_start 2002-10-13 04:00:00 (Sun)
  63182862000, #      utc_end 2003-03-09 03:00:00 (Sun)
  63170146800, #  local_start 2002-10-12 23:00:00 (Sat)
  63182844000, #    local_end 2003-03-08 22:00:00 (Sat)
  -18000,
  1,
  '-05',
      ],
      [
  63182862000, #    utc_start 2003-03-09 03:00:00 (Sun)
  63201614400, #      utc_end 2003-10-12 04:00:00 (Sun)
  63182840400, #  local_start 2003-03-08 21:00:00 (Sat)
  63201592800, #    local_end 2003-10-11 22:00:00 (Sat)
  -21600,
  0,
  '-06',
      ],
      [
  63201614400, #    utc_start 2003-10-12 04:00:00 (Sun)
  63214916400, #      utc_end 2004-03-14 03:00:00 (Sun)
  63201596400, #  local_start 2003-10-11 23:00:00 (Sat)
  63214898400, #    local_end 2004-03-13 22:00:00 (Sat)
  -18000,
  1,
  '-05',
      ],
      [
  63214916400, #    utc_start 2004-03-14 03:00:00 (Sun)
  63233064000, #      utc_end 2004-10-10 04:00:00 (Sun)
  63214894800, #  local_start 2004-03-13 21:00:00 (Sat)
  63233042400, #    local_end 2004-10-09 22:00:00 (Sat)
  -21600,
  0,
  '-06',
      ],
      [
  63233064000, #    utc_start 2004-10-10 04:00:00 (Sun)
  63246366000, #      utc_end 2005-03-13 03:00:00 (Sun)
  63233046000, #  local_start 2004-10-09 23:00:00 (Sat)
  63246348000, #    local_end 2005-03-12 22:00:00 (Sat)
  -18000,
  1,
  '-05',
      ],
      [
  63246366000, #    utc_start 2005-03-13 03:00:00 (Sun)
  63264513600, #      utc_end 2005-10-09 04:00:00 (Sun)
  63246344400, #  local_start 2005-03-12 21:00:00 (Sat)
  63264492000, #    local_end 2005-10-08 22:00:00 (Sat)
  -21600,
  0,
  '-06',
      ],
      [
  63264513600, #    utc_start 2005-10-09 04:00:00 (Sun)
  63277815600, #      utc_end 2006-03-12 03:00:00 (Sun)
  63264495600, #  local_start 2005-10-08 23:00:00 (Sat)
  63277797600, #    local_end 2006-03-11 22:00:00 (Sat)
  -18000,
  1,
  '-05',
      ],
      [
  63277815600, #    utc_start 2006-03-12 03:00:00 (Sun)
  63296568000, #      utc_end 2006-10-15 04:00:00 (Sun)
  63277794000, #  local_start 2006-03-11 21:00:00 (Sat)
  63296546400, #    local_end 2006-10-14 22:00:00 (Sat)
  -21600,
  0,
  '-06',
      ],
      [
  63296568000, #    utc_start 2006-10-15 04:00:00 (Sun)
  63309265200, #      utc_end 2007-03-11 03:00:00 (Sun)
  63296550000, #  local_start 2006-10-14 23:00:00 (Sat)
  63309247200, #    local_end 2007-03-10 22:00:00 (Sat)
  -18000,
  1,
  '-05',
      ],
      [
  63309265200, #    utc_start 2007-03-11 03:00:00 (Sun)
  63328017600, #      utc_end 2007-10-14 04:00:00 (Sun)
  63309243600, #  local_start 2007-03-10 21:00:00 (Sat)
  63327996000, #    local_end 2007-10-13 22:00:00 (Sat)
  -21600,
  0,
  '-06',
      ],
      [
  63328017600, #    utc_start 2007-10-14 04:00:00 (Sun)
  63342529200, #      utc_end 2008-03-30 03:00:00 (Sun)
  63327999600, #  local_start 2007-10-13 23:00:00 (Sat)
  63342511200, #    local_end 2008-03-29 22:00:00 (Sat)
  -18000,
  1,
  '-05',
      ],
      [
  63342529200, #    utc_start 2008-03-30 03:00:00 (Sun)
  63359467200, #      utc_end 2008-10-12 04:00:00 (Sun)
  63342507600, #  local_start 2008-03-29 21:00:00 (Sat)
  63359445600, #    local_end 2008-10-11 22:00:00 (Sat)
  -21600,
  0,
  '-06',
      ],
      [
  63359467200, #    utc_start 2008-10-12 04:00:00 (Sun)
  63372769200, #      utc_end 2009-03-15 03:00:00 (Sun)
  63359449200, #  local_start 2008-10-11 23:00:00 (Sat)
  63372751200, #    local_end 2009-03-14 22:00:00 (Sat)
  -18000,
  1,
  '-05',
      ],
      [
  63372769200, #    utc_start 2009-03-15 03:00:00 (Sun)
  63390916800, #      utc_end 2009-10-11 04:00:00 (Sun)
  63372747600, #  local_start 2009-03-14 21:00:00 (Sat)
  63390895200, #    local_end 2009-10-10 22:00:00 (Sat)
  -21600,
  0,
  '-06',
      ],
      [
  63390916800, #    utc_start 2009-10-11 04:00:00 (Sun)
  63406033200, #      utc_end 2010-04-04 03:00:00 (Sun)
  63390898800, #  local_start 2009-10-10 23:00:00 (Sat)
  63406015200, #    local_end 2010-04-03 22:00:00 (Sat)
  -18000,
  1,
  '-05',
      ],
      [
  63406033200, #    utc_start 2010-04-04 03:00:00 (Sun)
  63422366400, #      utc_end 2010-10-10 04:00:00 (Sun)
  63406011600, #  local_start 2010-04-03 21:00:00 (Sat)
  63422344800, #    local_end 2010-10-09 22:00:00 (Sat)
  -21600,
  0,
  '-06',
      ],
      [
  63422366400, #    utc_start 2010-10-10 04:00:00 (Sun)
  63440506800, #      utc_end 2011-05-08 03:00:00 (Sun)
  63422348400, #  local_start 2010-10-09 23:00:00 (Sat)
  63440488800, #    local_end 2011-05-07 22:00:00 (Sat)
  -18000,
  1,
  '-05',
      ],
      [
  63440506800, #    utc_start 2011-05-08 03:00:00 (Sun)
  63449582400, #      utc_end 2011-08-21 04:00:00 (Sun)
  63440485200, #  local_start 2011-05-07 21:00:00 (Sat)
  63449560800, #    local_end 2011-08-20 22:00:00 (Sat)
  -21600,
  0,
  '-06',
      ],
      [
  63449582400, #    utc_start 2011-08-21 04:00:00 (Sun)
  63471351600, #      utc_end 2012-04-29 03:00:00 (Sun)
  63449564400, #  local_start 2011-08-20 23:00:00 (Sat)
  63471333600, #    local_end 2012-04-28 22:00:00 (Sat)
  -18000,
  1,
  '-05',
      ],
      [
  63471351600, #    utc_start 2012-04-29 03:00:00 (Sun)
  63482241600, #      utc_end 2012-09-02 04:00:00 (Sun)
  63471330000, #  local_start 2012-04-28 21:00:00 (Sat)
  63482220000, #    local_end 2012-09-01 22:00:00 (Sat)
  -21600,
  0,
  '-06',
      ],
      [
  63482241600, #    utc_start 2012-09-02 04:00:00 (Sun)
  63502801200, #      utc_end 2013-04-28 03:00:00 (Sun)
  63482223600, #  local_start 2012-09-01 23:00:00 (Sat)
  63502783200, #    local_end 2013-04-27 22:00:00 (Sat)
  -18000,
  1,
  '-05',
      ],
      [
  63502801200, #    utc_start 2013-04-28 03:00:00 (Sun)
  63514296000, #      utc_end 2013-09-08 04:00:00 (Sun)
  63502779600, #  local_start 2013-04-27 21:00:00 (Sat)
  63514274400, #    local_end 2013-09-07 22:00:00 (Sat)
  -21600,
  0,
  '-06',
      ],
      [
  63514296000, #    utc_start 2013-09-08 04:00:00 (Sun)
  63534250800, #      utc_end 2014-04-27 03:00:00 (Sun)
  63514278000, #  local_start 2013-09-07 23:00:00 (Sat)
  63534232800, #    local_end 2014-04-26 22:00:00 (Sat)
  -18000,
  1,
  '-05',
      ],
      [
  63534250800, #    utc_start 2014-04-27 03:00:00 (Sun)
  63545745600, #      utc_end 2014-09-07 04:00:00 (Sun)
  63534229200, #  local_start 2014-04-26 21:00:00 (Sat)
  63545724000, #    local_end 2014-09-06 22:00:00 (Sat)
  -21600,
  0,
  '-06',
      ],
      [
  63545745600, #    utc_start 2014-09-07 04:00:00 (Sun)
  63598964400, #      utc_end 2016-05-15 03:00:00 (Sun)
  63545727600, #  local_start 2014-09-06 23:00:00 (Sat)
  63598946400, #    local_end 2016-05-14 22:00:00 (Sat)
  -18000,
  1,
  '-05',
      ],
      [
  63598964400, #    utc_start 2016-05-15 03:00:00 (Sun)
  63606830400, #      utc_end 2016-08-14 04:00:00 (Sun)
  63598942800, #  local_start 2016-05-14 21:00:00 (Sat)
  63606808800, #    local_end 2016-08-13 22:00:00 (Sat)
  -21600,
  0,
  '-06',
      ],
      [
  63606830400, #    utc_start 2016-08-14 04:00:00 (Sun)
  63630414000, #      utc_end 2017-05-14 03:00:00 (Sun)
  63606812400, #  local_start 2016-08-13 23:00:00 (Sat)
  63630396000, #    local_end 2017-05-13 22:00:00 (Sat)
  -18000,
  1,
  '-05',
      ],
      [
  63630414000, #    utc_start 2017-05-14 03:00:00 (Sun)
  63638280000, #      utc_end 2017-08-13 04:00:00 (Sun)
  63630392400, #  local_start 2017-05-13 21:00:00 (Sat)
  63638258400, #    local_end 2017-08-12 22:00:00 (Sat)
  -21600,
  0,
  '-06',
      ],
      [
  63638280000, #    utc_start 2017-08-13 04:00:00 (Sun)
  63661863600, #      utc_end 2018-05-13 03:00:00 (Sun)
  63638262000, #  local_start 2017-08-12 23:00:00 (Sat)
  63661845600, #    local_end 2018-05-12 22:00:00 (Sat)
  -18000,
  1,
  '-05',
      ],
      [
  63661863600, #    utc_start 2018-05-13 03:00:00 (Sun)
  63669729600, #      utc_end 2018-08-12 04:00:00 (Sun)
  63661842000, #  local_start 2018-05-12 21:00:00 (Sat)
  63669708000, #    local_end 2018-08-11 22:00:00 (Sat)
  -21600,
  0,
  '-06',
      ],
      [
  63669729600, #    utc_start 2018-08-12 04:00:00 (Sun)
  63690289200, #      utc_end 2019-04-07 03:00:00 (Sun)
  63669711600, #  local_start 2018-08-11 23:00:00 (Sat)
  63690271200, #    local_end 2019-04-06 22:00:00 (Sat)
  -18000,
  1,
  '-05',
      ],
      [
  63690289200, #    utc_start 2019-04-07 03:00:00 (Sun)
  63703598400, #      utc_end 2019-09-08 04:00:00 (Sun)
  63690267600, #  local_start 2019-04-06 21:00:00 (Sat)
  63703576800, #    local_end 2019-09-07 22:00:00 (Sat)
  -21600,
  0,
  '-06',
      ],
      [
  63703598400, #    utc_start 2019-09-08 04:00:00 (Sun)
  63721738800, #      utc_end 2020-04-05 03:00:00 (Sun)
  63703580400, #  local_start 2019-09-07 23:00:00 (Sat)
  63721720800, #    local_end 2020-04-04 22:00:00 (Sat)
  -18000,
  1,
  '-05',
      ],
      [
  63721738800, #    utc_start 2020-04-05 03:00:00 (Sun)
  63735048000, #      utc_end 2020-09-06 04:00:00 (Sun)
  63721717200, #  local_start 2020-04-04 21:00:00 (Sat)
  63735026400, #    local_end 2020-09-05 22:00:00 (Sat)
  -21600,
  0,
  '-06',
      ],
      [
  63735048000, #    utc_start 2020-09-06 04:00:00 (Sun)
  63753188400, #      utc_end 2021-04-04 03:00:00 (Sun)
  63735030000, #  local_start 2020-09-05 23:00:00 (Sat)
  63753170400, #    local_end 2021-04-03 22:00:00 (Sat)
  -18000,
  1,
  '-05',
      ],
      [
  63753188400, #    utc_start 2021-04-04 03:00:00 (Sun)
  63766497600, #      utc_end 2021-09-05 04:00:00 (Sun)
  63753166800, #  local_start 2021-04-03 21:00:00 (Sat)
  63766476000, #    local_end 2021-09-04 22:00:00 (Sat)
  -21600,
  0,
  '-06',
      ],
      [
  63766497600, #    utc_start 2021-09-05 04:00:00 (Sun)
  63784638000, #      utc_end 2022-04-03 03:00:00 (Sun)
  63766479600, #  local_start 2021-09-04 23:00:00 (Sat)
  63784620000, #    local_end 2022-04-02 22:00:00 (Sat)
  -18000,
  1,
  '-05',
      ],
      [
  63784638000, #    utc_start 2022-04-03 03:00:00 (Sun)
  63797947200, #      utc_end 2022-09-04 04:00:00 (Sun)
  63784616400, #  local_start 2022-04-02 21:00:00 (Sat)
  63797925600, #    local_end 2022-09-03 22:00:00 (Sat)
  -21600,
  0,
  '-06',
      ],
      [
  63797947200, #    utc_start 2022-09-04 04:00:00 (Sun)
  63816087600, #      utc_end 2023-04-02 03:00:00 (Sun)
  63797929200, #  local_start 2022-09-03 23:00:00 (Sat)
  63816069600, #    local_end 2023-04-01 22:00:00 (Sat)
  -18000,
  1,
  '-05',
      ],
      [
  63816087600, #    utc_start 2023-04-02 03:00:00 (Sun)
  63829396800, #      utc_end 2023-09-03 04:00:00 (Sun)
  63816066000, #  local_start 2023-04-01 21:00:00 (Sat)
  63829375200, #    local_end 2023-09-02 22:00:00 (Sat)
  -21600,
  0,
  '-06',
      ],
      [
  63829396800, #    utc_start 2023-09-03 04:00:00 (Sun)
  63848142000, #      utc_end 2024-04-07 03:00:00 (Sun)
  63829378800, #  local_start 2023-09-02 23:00:00 (Sat)
  63848124000, #    local_end 2024-04-06 22:00:00 (Sat)
  -18000,
  1,
  '-05',
      ],
      [
  63848142000, #    utc_start 2024-04-07 03:00:00 (Sun)
  63861451200, #      utc_end 2024-09-08 04:00:00 (Sun)
  63848120400, #  local_start 2024-04-06 21:00:00 (Sat)
  63861429600, #    local_end 2024-09-07 22:00:00 (Sat)
  -21600,
  0,
  '-06',
      ],
      [
  63861451200, #    utc_start 2024-09-08 04:00:00 (Sun)
  63879591600, #      utc_end 2025-04-06 03:00:00 (Sun)
  63861433200, #  local_start 2024-09-07 23:00:00 (Sat)
  63879573600, #    local_end 2025-04-05 22:00:00 (Sat)
  -18000,
  1,
  '-05',
      ],
      [
  63879591600, #    utc_start 2025-04-06 03:00:00 (Sun)
  63892900800, #      utc_end 2025-09-07 04:00:00 (Sun)
  63879570000, #  local_start 2025-04-05 21:00:00 (Sat)
  63892879200, #    local_end 2025-09-06 22:00:00 (Sat)
  -21600,
  0,
  '-06',
      ],
      [
  63892900800, #    utc_start 2025-09-07 04:00:00 (Sun)
  63911041200, #      utc_end 2026-04-05 03:00:00 (Sun)
  63892882800, #  local_start 2025-09-06 23:00:00 (Sat)
  63911023200, #    local_end 2026-04-04 22:00:00 (Sat)
  -18000,
  1,
  '-05',
      ],
      [
  63911041200, #    utc_start 2026-04-05 03:00:00 (Sun)
  63924350400, #      utc_end 2026-09-06 04:00:00 (Sun)
  63911019600, #  local_start 2026-04-04 21:00:00 (Sat)
  63924328800, #    local_end 2026-09-05 22:00:00 (Sat)
  -21600,
  0,
  '-06',
      ],
      [
  63924350400, #    utc_start 2026-09-06 04:00:00 (Sun)
  63942490800, #      utc_end 2027-04-04 03:00:00 (Sun)
  63924332400, #  local_start 2026-09-05 23:00:00 (Sat)
  63942472800, #    local_end 2027-04-03 22:00:00 (Sat)
  -18000,
  1,
  '-05',
      ],
      [
  63942490800, #    utc_start 2027-04-04 03:00:00 (Sun)
  63955800000, #      utc_end 2027-09-05 04:00:00 (Sun)
  63942469200, #  local_start 2027-04-03 21:00:00 (Sat)
  63955778400, #    local_end 2027-09-04 22:00:00 (Sat)
  -21600,
  0,
  '-06',
      ],
      [
  63955800000, #    utc_start 2027-09-05 04:00:00 (Sun)
  63973940400, #      utc_end 2028-04-02 03:00:00 (Sun)
  63955782000, #  local_start 2027-09-04 23:00:00 (Sat)
  63973922400, #    local_end 2028-04-01 22:00:00 (Sat)
  -18000,
  1,
  '-05',
      ],
      [
  63973940400, #    utc_start 2028-04-02 03:00:00 (Sun)
  63987249600, #      utc_end 2028-09-03 04:00:00 (Sun)
  63973918800, #  local_start 2028-04-01 21:00:00 (Sat)
  63987228000, #    local_end 2028-09-02 22:00:00 (Sat)
  -21600,
  0,
  '-06',
      ],
      [
  63987249600, #    utc_start 2028-09-03 04:00:00 (Sun)
  64005994800, #      utc_end 2029-04-08 03:00:00 (Sun)
  63987231600, #  local_start 2028-09-02 23:00:00 (Sat)
  64005976800, #    local_end 2029-04-07 22:00:00 (Sat)
  -18000,
  1,
  '-05',
      ],
      [
  64005994800, #    utc_start 2029-04-08 03:00:00 (Sun)
  64018699200, #      utc_end 2029-09-02 04:00:00 (Sun)
  64005973200, #  local_start 2029-04-07 21:00:00 (Sat)
  64018677600, #    local_end 2029-09-01 22:00:00 (Sat)
  -21600,
  0,
  '-06',
      ],
      [
  64018699200, #    utc_start 2029-09-02 04:00:00 (Sun)
  64037444400, #      utc_end 2030-04-07 03:00:00 (Sun)
  64018681200, #  local_start 2029-09-01 23:00:00 (Sat)
  64037426400, #    local_end 2030-04-06 22:00:00 (Sat)
  -18000,
  1,
  '-05',
      ],
      [
  64037444400, #    utc_start 2030-04-07 03:00:00 (Sun)
  64050753600, #      utc_end 2030-09-08 04:00:00 (Sun)
  64037422800, #  local_start 2030-04-06 21:00:00 (Sat)
  64050732000, #    local_end 2030-09-07 22:00:00 (Sat)
  -21600,
  0,
  '-06',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {62}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { -21600 }
  
  my $last_observance = bless( {
    'format' => '-06/-05',
    'gmtoff' => '-6:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 723617,
      'local_rd_secs' => 75600,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 723617,
      'utc_rd_secs' => 75600,
      'utc_year' => 1983
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => -21600,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 723618,
      'local_rd_secs' => 10800,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 723618,
      'utc_rd_secs' => 10800,
      'utc_year' => 1983
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '4:00u',
      'from' => '2019',
      'in' => 'Sep',
      'letter' => '',
      'name' => 'Chile',
      'offset_from_std' => 3600,
      'on' => 'Sun>=2',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '3:00u',
      'from' => '2019',
      'in' => 'Apr',
      'letter' => '',
      'name' => 'Chile',
      'offset_from_std' => 0,
      'on' => 'Sun>=2',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_PACIFIC_EASTER

    $main::fatpacked{"DateTime/TimeZone/Pacific/Efate.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_PACIFIC_EFATE';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/australasia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Pacific::Efate;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Pacific::Efate::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60306295604, #      utc_end 1912-01-12 12:46:44 (Fri)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60306336000, #    local_end 1912-01-13 00:00:00 (Sat)
  40396,
  0,
  'LMT',
      ],
      [
  60306295604, #    utc_start 1912-01-12 12:46:44 (Fri)
  62568939600, #      utc_end 1983-09-24 13:00:00 (Sat)
  60306335204, #  local_start 1912-01-12 23:46:44 (Fri)
  62568979200, #    local_end 1983-09-25 00:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62568939600, #    utc_start 1983-09-24 13:00:00 (Sat)
  62584660800, #      utc_end 1984-03-24 12:00:00 (Sat)
  62568982800, #  local_start 1983-09-25 01:00:00 (Sun)
  62584704000, #    local_end 1984-03-25 00:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  62584660800, #    utc_start 1984-03-24 12:00:00 (Sat)
  62602981200, #      utc_end 1984-10-22 13:00:00 (Mon)
  62584700400, #  local_start 1984-03-24 23:00:00 (Sat)
  62603020800, #    local_end 1984-10-23 00:00:00 (Tue)
  39600,
  0,
  '+11',
      ],
      [
  62602981200, #    utc_start 1984-10-22 13:00:00 (Mon)
  62616110400, #      utc_end 1985-03-23 12:00:00 (Sat)
  62603024400, #  local_start 1984-10-23 01:00:00 (Tue)
  62616153600, #    local_end 1985-03-24 00:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  62616110400, #    utc_start 1985-03-23 12:00:00 (Sat)
  62632443600, #      utc_end 1985-09-28 13:00:00 (Sat)
  62616150000, #  local_start 1985-03-23 23:00:00 (Sat)
  62632483200, #    local_end 1985-09-29 00:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62632443600, #    utc_start 1985-09-28 13:00:00 (Sat)
  62647560000, #      utc_end 1986-03-22 12:00:00 (Sat)
  62632486800, #  local_start 1985-09-29 01:00:00 (Sun)
  62647603200, #    local_end 1986-03-23 00:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  62647560000, #    utc_start 1986-03-22 12:00:00 (Sat)
  62663893200, #      utc_end 1986-09-27 13:00:00 (Sat)
  62647599600, #  local_start 1986-03-22 23:00:00 (Sat)
  62663932800, #    local_end 1986-09-28 00:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62663893200, #    utc_start 1986-09-27 13:00:00 (Sat)
  62679614400, #      utc_end 1987-03-28 12:00:00 (Sat)
  62663936400, #  local_start 1986-09-28 01:00:00 (Sun)
  62679657600, #    local_end 1987-03-29 00:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  62679614400, #    utc_start 1987-03-28 12:00:00 (Sat)
  62695342800, #      utc_end 1987-09-26 13:00:00 (Sat)
  62679654000, #  local_start 1987-03-28 23:00:00 (Sat)
  62695382400, #    local_end 1987-09-27 00:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62695342800, #    utc_start 1987-09-26 13:00:00 (Sat)
  62711064000, #      utc_end 1988-03-26 12:00:00 (Sat)
  62695386000, #  local_start 1987-09-27 01:00:00 (Sun)
  62711107200, #    local_end 1988-03-27 00:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  62711064000, #    utc_start 1988-03-26 12:00:00 (Sat)
  62726792400, #      utc_end 1988-09-24 13:00:00 (Sat)
  62711103600, #  local_start 1988-03-26 23:00:00 (Sat)
  62726832000, #    local_end 1988-09-25 00:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62726792400, #    utc_start 1988-09-24 13:00:00 (Sat)
  62742513600, #      utc_end 1989-03-25 12:00:00 (Sat)
  62726835600, #  local_start 1988-09-25 01:00:00 (Sun)
  62742556800, #    local_end 1989-03-26 00:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  62742513600, #    utc_start 1989-03-25 12:00:00 (Sat)
  62758242000, #      utc_end 1989-09-23 13:00:00 (Sat)
  62742553200, #  local_start 1989-03-25 23:00:00 (Sat)
  62758281600, #    local_end 1989-09-24 00:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62758242000, #    utc_start 1989-09-23 13:00:00 (Sat)
  62773963200, #      utc_end 1990-03-24 12:00:00 (Sat)
  62758285200, #  local_start 1989-09-24 01:00:00 (Sun)
  62774006400, #    local_end 1990-03-25 00:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  62773963200, #    utc_start 1990-03-24 12:00:00 (Sat)
  62789691600, #      utc_end 1990-09-22 13:00:00 (Sat)
  62774002800, #  local_start 1990-03-24 23:00:00 (Sat)
  62789731200, #    local_end 1990-09-23 00:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62789691600, #    utc_start 1990-09-22 13:00:00 (Sat)
  62805412800, #      utc_end 1991-03-23 12:00:00 (Sat)
  62789734800, #  local_start 1990-09-23 01:00:00 (Sun)
  62805456000, #    local_end 1991-03-24 00:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  62805412800, #    utc_start 1991-03-23 12:00:00 (Sat)
  62821746000, #      utc_end 1991-09-28 13:00:00 (Sat)
  62805452400, #  local_start 1991-03-23 23:00:00 (Sat)
  62821785600, #    local_end 1991-09-29 00:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62821746000, #    utc_start 1991-09-28 13:00:00 (Sat)
  62832024000, #      utc_end 1992-01-25 12:00:00 (Sat)
  62821789200, #  local_start 1991-09-29 01:00:00 (Sun)
  62832067200, #    local_end 1992-01-26 00:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  62832024000, #    utc_start 1992-01-25 12:00:00 (Sat)
  62855614800, #      utc_end 1992-10-24 13:00:00 (Sat)
  62832063600, #  local_start 1992-01-25 23:00:00 (Sat)
  62855654400, #    local_end 1992-10-25 00:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62855614800, #    utc_start 1992-10-24 13:00:00 (Sat)
  62863473600, #      utc_end 1993-01-23 12:00:00 (Sat)
  62855658000, #  local_start 1992-10-25 01:00:00 (Sun)
  62863516800, #    local_end 1993-01-24 00:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  62863473600, #    utc_start 1993-01-23 12:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  62863513200, #  local_start 1993-01-23 23:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #    local_end
  39600,
  0,
  '+11',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {10}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_PACIFIC_EFATE

    $main::fatpacked{"DateTime/TimeZone/Pacific/Enderbury.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_PACIFIC_ENDERBURY';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/australasia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Pacific::Enderbury;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Pacific::Enderbury::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59958271460, #      utc_end 1901-01-01 11:24:20 (Tue)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59958230400, #    local_end 1901-01-01 00:00:00 (Tue)
  -41060,
  0,
  'LMT',
      ],
      [
  59958271460, #    utc_start 1901-01-01 11:24:20 (Tue)
  62443310400, #      utc_end 1979-10-01 12:00:00 (Mon)
  59958228260, #  local_start 1900-12-31 23:24:20 (Mon)
  62443267200, #    local_end 1979-10-01 00:00:00 (Mon)
  -43200,
  0,
  '-12',
      ],
      [
  62443310400, #    utc_start 1979-10-01 12:00:00 (Mon)
  62924554800, #      utc_end 1994-12-31 11:00:00 (Sat)
  62443270800, #  local_start 1979-10-01 01:00:00 (Mon)
  62924515200, #    local_end 1994-12-31 00:00:00 (Sat)
  -39600,
  0,
  '-11',
      ],
      [
  62924554800, #    utc_start 1994-12-31 11:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  62924601600, #  local_start 1995-01-01 00:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  46800,
  0,
  '+13',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_PACIFIC_ENDERBURY

    $main::fatpacked{"DateTime/TimeZone/Pacific/Fakaofo.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_PACIFIC_FAKAOFO';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/australasia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Pacific::Fakaofo;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Pacific::Fakaofo::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59958271496, #      utc_end 1901-01-01 11:24:56 (Tue)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59958230400, #    local_end 1901-01-01 00:00:00 (Tue)
  -41096,
  0,
  'LMT',
      ],
      [
  59958271496, #    utc_start 1901-01-01 11:24:56 (Tue)
  63460926000, #      utc_end 2011-12-30 11:00:00 (Fri)
  59958231896, #  local_start 1901-01-01 00:24:56 (Tue)
  63460886400, #    local_end 2011-12-30 00:00:00 (Fri)
  -39600,
  0,
  '-11',
      ],
      [
  63460926000, #    utc_start 2011-12-30 11:00:00 (Fri)
  DateTime::TimeZone::INFINITY, #      utc_end
  63460972800, #  local_start 2011-12-31 00:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #    local_end
  46800,
  0,
  '+13',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_PACIFIC_FAKAOFO

    $main::fatpacked{"DateTime/TimeZone/Pacific/Fiji.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_PACIFIC_FIJI';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/australasia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Pacific::Fiji;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Pacific::Fiji::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60425697856, #      utc_end 1915-10-25 12:04:16 (Mon)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60425740800, #    local_end 1915-10-26 00:00:00 (Tue)
  42944,
  0,
  'LMT',
      ],
      [
  60425697856, #    utc_start 1915-10-25 12:04:16 (Mon)
  63045525600, #      utc_end 1998-10-31 14:00:00 (Sat)
  60425741056, #  local_start 1915-10-26 00:04:16 (Tue)
  63045568800, #    local_end 1998-11-01 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  63045525600, #    utc_start 1998-10-31 14:00:00 (Sat)
  63055807200, #      utc_end 1999-02-27 14:00:00 (Sat)
  63045572400, #  local_start 1998-11-01 03:00:00 (Sun)
  63055854000, #    local_end 1999-02-28 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  63055807200, #    utc_start 1999-02-27 14:00:00 (Sat)
  63077580000, #      utc_end 1999-11-06 14:00:00 (Sat)
  63055850400, #  local_start 1999-02-28 02:00:00 (Sun)
  63077623200, #    local_end 1999-11-07 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  63077580000, #    utc_start 1999-11-06 14:00:00 (Sat)
  63087256800, #      utc_end 2000-02-26 14:00:00 (Sat)
  63077626800, #  local_start 1999-11-07 03:00:00 (Sun)
  63087303600, #    local_end 2000-02-27 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  63087256800, #    utc_start 2000-02-26 14:00:00 (Sat)
  63395100000, #      utc_end 2009-11-28 14:00:00 (Sat)
  63087300000, #  local_start 2000-02-27 02:00:00 (Sun)
  63395143200, #    local_end 2009-11-29 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  63395100000, #    utc_start 2009-11-28 14:00:00 (Sat)
  63405381600, #      utc_end 2010-03-27 14:00:00 (Sat)
  63395146800, #  local_start 2009-11-29 03:00:00 (Sun)
  63405428400, #    local_end 2010-03-28 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  63405381600, #    utc_start 2010-03-27 14:00:00 (Sat)
  63423525600, #      utc_end 2010-10-23 14:00:00 (Sat)
  63405424800, #  local_start 2010-03-28 02:00:00 (Sun)
  63423568800, #    local_end 2010-10-24 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  63423525600, #    utc_start 2010-10-23 14:00:00 (Sat)
  63435016800, #      utc_end 2011-03-05 14:00:00 (Sat)
  63423572400, #  local_start 2010-10-24 03:00:00 (Sun)
  63435063600, #    local_end 2011-03-06 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  63435016800, #    utc_start 2011-03-05 14:00:00 (Sat)
  63454975200, #      utc_end 2011-10-22 14:00:00 (Sat)
  63435060000, #  local_start 2011-03-06 02:00:00 (Sun)
  63455018400, #    local_end 2011-10-23 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  63454975200, #    utc_start 2011-10-22 14:00:00 (Sat)
  63462837600, #      utc_end 2012-01-21 14:00:00 (Sat)
  63455022000, #  local_start 2011-10-23 03:00:00 (Sun)
  63462884400, #    local_end 2012-01-22 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  63462837600, #    utc_start 2012-01-21 14:00:00 (Sat)
  63486424800, #      utc_end 2012-10-20 14:00:00 (Sat)
  63462880800, #  local_start 2012-01-22 02:00:00 (Sun)
  63486468000, #    local_end 2012-10-21 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  63486424800, #    utc_start 2012-10-20 14:00:00 (Sat)
  63494287200, #      utc_end 2013-01-19 14:00:00 (Sat)
  63486471600, #  local_start 2012-10-21 03:00:00 (Sun)
  63494334000, #    local_end 2013-01-20 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  63494287200, #    utc_start 2013-01-19 14:00:00 (Sat)
  63518479200, #      utc_end 2013-10-26 14:00:00 (Sat)
  63494330400, #  local_start 2013-01-20 02:00:00 (Sun)
  63518522400, #    local_end 2013-10-27 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  63518479200, #    utc_start 2013-10-26 14:00:00 (Sat)
  63525733200, #      utc_end 2014-01-18 13:00:00 (Sat)
  63518526000, #  local_start 2013-10-27 03:00:00 (Sun)
  63525780000, #    local_end 2014-01-19 02:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  63525733200, #    utc_start 2014-01-18 13:00:00 (Sat)
  63550533600, #      utc_end 2014-11-01 14:00:00 (Sat)
  63525776400, #  local_start 2014-01-19 01:00:00 (Sun)
  63550576800, #    local_end 2014-11-02 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  63550533600, #    utc_start 2014-11-01 14:00:00 (Sat)
  63557186400, #      utc_end 2015-01-17 14:00:00 (Sat)
  63550580400, #  local_start 2014-11-02 03:00:00 (Sun)
  63557233200, #    local_end 2015-01-18 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  63557186400, #    utc_start 2015-01-17 14:00:00 (Sat)
  63581983200, #      utc_end 2015-10-31 14:00:00 (Sat)
  63557229600, #  local_start 2015-01-18 02:00:00 (Sun)
  63582026400, #    local_end 2015-11-01 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  63581983200, #    utc_start 2015-10-31 14:00:00 (Sat)
  63588636000, #      utc_end 2016-01-16 14:00:00 (Sat)
  63582030000, #  local_start 2015-11-01 03:00:00 (Sun)
  63588682800, #    local_end 2016-01-17 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  63588636000, #    utc_start 2016-01-16 14:00:00 (Sat)
  63614037600, #      utc_end 2016-11-05 14:00:00 (Sat)
  63588679200, #  local_start 2016-01-17 02:00:00 (Sun)
  63614080800, #    local_end 2016-11-06 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  63614037600, #    utc_start 2016-11-05 14:00:00 (Sat)
  63620085600, #      utc_end 2017-01-14 14:00:00 (Sat)
  63614084400, #  local_start 2016-11-06 03:00:00 (Sun)
  63620132400, #    local_end 2017-01-15 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  63620085600, #    utc_start 2017-01-14 14:00:00 (Sat)
  63645487200, #      utc_end 2017-11-04 14:00:00 (Sat)
  63620128800, #  local_start 2017-01-15 02:00:00 (Sun)
  63645530400, #    local_end 2017-11-05 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  63645487200, #    utc_start 2017-11-04 14:00:00 (Sat)
  63651535200, #      utc_end 2018-01-13 14:00:00 (Sat)
  63645534000, #  local_start 2017-11-05 03:00:00 (Sun)
  63651582000, #    local_end 2018-01-14 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  63651535200, #    utc_start 2018-01-13 14:00:00 (Sat)
  63676936800, #      utc_end 2018-11-03 14:00:00 (Sat)
  63651578400, #  local_start 2018-01-14 02:00:00 (Sun)
  63676980000, #    local_end 2018-11-04 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  63676936800, #    utc_start 2018-11-03 14:00:00 (Sat)
  63682984800, #      utc_end 2019-01-12 14:00:00 (Sat)
  63676983600, #  local_start 2018-11-04 03:00:00 (Sun)
  63683031600, #    local_end 2019-01-13 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  63682984800, #    utc_start 2019-01-12 14:00:00 (Sat)
  63708386400, #      utc_end 2019-11-02 14:00:00 (Sat)
  63683028000, #  local_start 2019-01-13 02:00:00 (Sun)
  63708429600, #    local_end 2019-11-03 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  63708386400, #    utc_start 2019-11-02 14:00:00 (Sat)
  63715039200, #      utc_end 2020-01-18 14:00:00 (Sat)
  63708433200, #  local_start 2019-11-03 03:00:00 (Sun)
  63715086000, #    local_end 2020-01-19 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  63715039200, #    utc_start 2020-01-18 14:00:00 (Sat)
  63739836000, #      utc_end 2020-10-31 14:00:00 (Sat)
  63715082400, #  local_start 2020-01-19 02:00:00 (Sun)
  63739879200, #    local_end 2020-11-01 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  63739836000, #    utc_start 2020-10-31 14:00:00 (Sat)
  63746488800, #      utc_end 2021-01-16 14:00:00 (Sat)
  63739882800, #  local_start 2020-11-01 03:00:00 (Sun)
  63746535600, #    local_end 2021-01-17 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  63746488800, #    utc_start 2021-01-16 14:00:00 (Sat)
  63771890400, #      utc_end 2021-11-06 14:00:00 (Sat)
  63746532000, #  local_start 2021-01-17 02:00:00 (Sun)
  63771933600, #    local_end 2021-11-07 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  63771890400, #    utc_start 2021-11-06 14:00:00 (Sat)
  63777938400, #      utc_end 2022-01-15 14:00:00 (Sat)
  63771937200, #  local_start 2021-11-07 03:00:00 (Sun)
  63777985200, #    local_end 2022-01-16 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  63777938400, #    utc_start 2022-01-15 14:00:00 (Sat)
  63803340000, #      utc_end 2022-11-05 14:00:00 (Sat)
  63777981600, #  local_start 2022-01-16 02:00:00 (Sun)
  63803383200, #    local_end 2022-11-06 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  63803340000, #    utc_start 2022-11-05 14:00:00 (Sat)
  63809388000, #      utc_end 2023-01-14 14:00:00 (Sat)
  63803386800, #  local_start 2022-11-06 03:00:00 (Sun)
  63809434800, #    local_end 2023-01-15 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  63809388000, #    utc_start 2023-01-14 14:00:00 (Sat)
  63834789600, #      utc_end 2023-11-04 14:00:00 (Sat)
  63809431200, #  local_start 2023-01-15 02:00:00 (Sun)
  63834832800, #    local_end 2023-11-05 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  63834789600, #    utc_start 2023-11-04 14:00:00 (Sat)
  63840837600, #      utc_end 2024-01-13 14:00:00 (Sat)
  63834836400, #  local_start 2023-11-05 03:00:00 (Sun)
  63840884400, #    local_end 2024-01-14 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  63840837600, #    utc_start 2024-01-13 14:00:00 (Sat)
  63866239200, #      utc_end 2024-11-02 14:00:00 (Sat)
  63840880800, #  local_start 2024-01-14 02:00:00 (Sun)
  63866282400, #    local_end 2024-11-03 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  63866239200, #    utc_start 2024-11-02 14:00:00 (Sat)
  63872892000, #      utc_end 2025-01-18 14:00:00 (Sat)
  63866286000, #  local_start 2024-11-03 03:00:00 (Sun)
  63872938800, #    local_end 2025-01-19 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  63872892000, #    utc_start 2025-01-18 14:00:00 (Sat)
  63897688800, #      utc_end 2025-11-01 14:00:00 (Sat)
  63872935200, #  local_start 2025-01-19 02:00:00 (Sun)
  63897732000, #    local_end 2025-11-02 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  63897688800, #    utc_start 2025-11-01 14:00:00 (Sat)
  63904341600, #      utc_end 2026-01-17 14:00:00 (Sat)
  63897735600, #  local_start 2025-11-02 03:00:00 (Sun)
  63904388400, #    local_end 2026-01-18 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  63904341600, #    utc_start 2026-01-17 14:00:00 (Sat)
  63929138400, #      utc_end 2026-10-31 14:00:00 (Sat)
  63904384800, #  local_start 2026-01-18 02:00:00 (Sun)
  63929181600, #    local_end 2026-11-01 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  63929138400, #    utc_start 2026-10-31 14:00:00 (Sat)
  63935791200, #      utc_end 2027-01-16 14:00:00 (Sat)
  63929185200, #  local_start 2026-11-01 03:00:00 (Sun)
  63935838000, #    local_end 2027-01-17 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  63935791200, #    utc_start 2027-01-16 14:00:00 (Sat)
  63961192800, #      utc_end 2027-11-06 14:00:00 (Sat)
  63935834400, #  local_start 2027-01-17 02:00:00 (Sun)
  63961236000, #    local_end 2027-11-07 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  63961192800, #    utc_start 2027-11-06 14:00:00 (Sat)
  63967240800, #      utc_end 2028-01-15 14:00:00 (Sat)
  63961239600, #  local_start 2027-11-07 03:00:00 (Sun)
  63967287600, #    local_end 2028-01-16 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  63967240800, #    utc_start 2028-01-15 14:00:00 (Sat)
  63992642400, #      utc_end 2028-11-04 14:00:00 (Sat)
  63967284000, #  local_start 2028-01-16 02:00:00 (Sun)
  63992685600, #    local_end 2028-11-05 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  63992642400, #    utc_start 2028-11-04 14:00:00 (Sat)
  63998690400, #      utc_end 2029-01-13 14:00:00 (Sat)
  63992689200, #  local_start 2028-11-05 03:00:00 (Sun)
  63998737200, #    local_end 2029-01-14 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  63998690400, #    utc_start 2029-01-13 14:00:00 (Sat)
  64024092000, #      utc_end 2029-11-03 14:00:00 (Sat)
  63998733600, #  local_start 2029-01-14 02:00:00 (Sun)
  64024135200, #    local_end 2029-11-04 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
      [
  64024092000, #    utc_start 2029-11-03 14:00:00 (Sat)
  64030140000, #      utc_end 2030-01-12 14:00:00 (Sat)
  64024138800, #  local_start 2029-11-04 03:00:00 (Sun)
  64030186800, #    local_end 2030-01-13 03:00:00 (Sun)
  46800,
  1,
  '+13',
      ],
      [
  64030140000, #    utc_start 2030-01-12 14:00:00 (Sat)
  64055541600, #      utc_end 2030-11-02 14:00:00 (Sat)
  64030183200, #  local_start 2030-01-13 02:00:00 (Sun)
  64055584800, #    local_end 2030-11-03 02:00:00 (Sun)
  43200,
  0,
  '+12',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {24}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { 43200 }
  
  my $last_observance = bless( {
    'format' => '+12/+13',
    'gmtoff' => '12:00',
    'local_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 699372,
      'local_rd_secs' => 256,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 699372,
      'utc_rd_secs' => 256,
      'utc_year' => 1916
    }, 'DateTime' ),
    'offset_from_std' => 0,
    'offset_from_utc' => 43200,
    'until' => [],
    'utc_start_datetime' => bless( {
      'formatter' => undef,
      'local_rd_days' => 699371,
      'local_rd_secs' => 43456,
      'offset_modifier' => 0,
      'rd_nanosecs' => 0,
      'tz' => bless( {
        'name' => 'floating',
        'offset' => 0
      }, 'DateTime::TimeZone::Floating' ),
      'utc_rd_days' => 699371,
      'utc_rd_secs' => 43456,
      'utc_year' => 1916
    }, 'DateTime' )
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '2:00',
      'from' => '2014',
      'in' => 'Nov',
      'letter' => '',
      'name' => 'Fiji',
      'offset_from_std' => 3600,
      'on' => 'Sun>=1',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '3:00',
      'from' => '2015',
      'in' => 'Jan',
      'letter' => '',
      'name' => 'Fiji',
      'offset_from_std' => 0,
      'on' => 'Sun>=13',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_PACIFIC_FIJI

    $main::fatpacked{"DateTime/TimeZone/Pacific/Funafuti.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_PACIFIC_FUNAFUTI';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/australasia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Pacific::Funafuti;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Pacific::Funafuti::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59958187388, #      utc_end 1900-12-31 12:03:08 (Mon)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59958230400, #    local_end 1901-01-01 00:00:00 (Tue)
  43012,
  0,
  'LMT',
      ],
      [
  59958187388, #    utc_start 1900-12-31 12:03:08 (Mon)
  DateTime::TimeZone::INFINITY, #      utc_end
  59958230588, #  local_start 1901-01-01 00:03:08 (Tue)
  DateTime::TimeZone::INFINITY, #    local_end
  43200,
  0,
  '+12',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_PACIFIC_FUNAFUTI

    $main::fatpacked{"DateTime/TimeZone/Pacific/Galapagos.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_PACIFIC_GALAPAGOS';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/southamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Pacific::Galapagos;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Pacific::Galapagos::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60904936704, #      utc_end 1931-01-01 05:58:24 (Thu)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60904915200, #    local_end 1931-01-01 00:00:00 (Thu)
  -21504,
  0,
  'LMT',
      ],
      [
  60904936704, #    utc_start 1931-01-01 05:58:24 (Thu)
  62640622800, #      utc_end 1986-01-01 05:00:00 (Wed)
  60904918704, #  local_start 1931-01-01 00:58:24 (Thu)
  62640604800, #    local_end 1986-01-01 00:00:00 (Wed)
  -18000,
  0,
  '-05',
      ],
      [
  62640622800, #    utc_start 1986-01-01 05:00:00 (Wed)
  62858613600, #      utc_end 1992-11-28 06:00:00 (Sat)
  62640601200, #  local_start 1985-12-31 23:00:00 (Tue)
  62858592000, #    local_end 1992-11-28 00:00:00 (Sat)
  -21600,
  0,
  '-06',
      ],
      [
  62858613600, #    utc_start 1992-11-28 06:00:00 (Sat)
  62864571600, #      utc_end 1993-02-05 05:00:00 (Fri)
  62858595600, #  local_start 1992-11-28 01:00:00 (Sat)
  62864553600, #    local_end 1993-02-05 00:00:00 (Fri)
  -18000,
  1,
  '-05',
      ],
      [
  62864571600, #    utc_start 1993-02-05 05:00:00 (Fri)
  DateTime::TimeZone::INFINITY, #      utc_end
  62864550000, #  local_start 1993-02-04 23:00:00 (Thu)
  DateTime::TimeZone::INFINITY, #    local_end
  -21600,
  0,
  '-06',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {1}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_PACIFIC_GALAPAGOS

    $main::fatpacked{"DateTime/TimeZone/Pacific/Gambier.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_PACIFIC_GAMBIER';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/australasia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Pacific::Gambier;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Pacific::Gambier::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60329005188, #      utc_end 1912-10-01 08:59:48 (Tue)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60328972800, #    local_end 1912-10-01 00:00:00 (Tue)
  -32388,
  0,
  'LMT',
      ],
      [
  60329005188, #    utc_start 1912-10-01 08:59:48 (Tue)
  DateTime::TimeZone::INFINITY, #      utc_end
  60328972788, #  local_start 1912-09-30 23:59:48 (Mon)
  DateTime::TimeZone::INFINITY, #    local_end
  -32400,
  0,
  '-09',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_PACIFIC_GAMBIER

    $main::fatpacked{"DateTime/TimeZone/Pacific/Guadalcanal.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_PACIFIC_GUADALCANAL';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/australasia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Pacific::Guadalcanal;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Pacific::Guadalcanal::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60328934412, #      utc_end 1912-09-30 13:20:12 (Mon)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60328972800, #    local_end 1912-10-01 00:00:00 (Tue)
  38388,
  0,
  'LMT',
      ],
      [
  60328934412, #    utc_start 1912-09-30 13:20:12 (Mon)
  DateTime::TimeZone::INFINITY, #      utc_end
  60328974012, #  local_start 1912-10-01 00:20:12 (Tue)
  DateTime::TimeZone::INFINITY, #    local_end
  39600,
  0,
  '+11',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_PACIFIC_GUADALCANAL

    $main::fatpacked{"DateTime/TimeZone/Pacific/Guam.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_PACIFIC_GUAM';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/australasia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Pacific::Guam;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Pacific::Guam::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  58191056460, #      utc_end 1844-12-31 14:21:00 (Tue)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  58191004800, #    local_end 1844-12-31 00:00:00 (Tue)
  -51660,
  0,
  'LMT',
      ],
      [
  58191056460, #    utc_start 1844-12-31 14:21:00 (Tue)
  59958195660, #      utc_end 1900-12-31 14:21:00 (Mon)
  58191091200, #  local_start 1845-01-01 00:00:00 (Wed)
  59958230400, #    local_end 1901-01-01 00:00:00 (Tue)
  34740,
  0,
  'LMT',
      ],
      [
  59958195660, #    utc_start 1900-12-31 14:21:00 (Mon)
  61250133600, #      utc_end 1941-12-09 14:00:00 (Tue)
  59958231660, #  local_start 1901-01-01 00:21:00 (Tue)
  61250169600, #    local_end 1941-12-10 00:00:00 (Wed)
  36000,
  0,
  'GST',
      ],
      [
  61250133600, #    utc_start 1941-12-09 14:00:00 (Tue)
  61333426800, #      utc_end 1944-07-30 15:00:00 (Sun)
  61250166000, #  local_start 1941-12-09 23:00:00 (Tue)
  61333459200, #    local_end 1944-07-31 00:00:00 (Mon)
  32400,
  0,
  '+09',
      ],
      [
  61333426800, #    utc_start 1944-07-30 15:00:00 (Sun)
  61803792000, #      utc_end 1959-06-26 16:00:00 (Fri)
  61333462800, #  local_start 1944-07-31 01:00:00 (Mon)
  61803828000, #    local_end 1959-06-27 02:00:00 (Sat)
  36000,
  0,
  'GST',
      ],
      [
  61803792000, #    utc_start 1959-06-26 16:00:00 (Fri)
  61854073200, #      utc_end 1961-01-28 15:00:00 (Sat)
  61803831600, #  local_start 1959-06-27 03:00:00 (Sat)
  61854112800, #    local_end 1961-01-29 02:00:00 (Sun)
  39600,
  1,
  'GDT',
      ],
      [
  61854073200, #    utc_start 1961-01-28 15:00:00 (Sat)
  62061955200, #      utc_end 1967-08-31 16:00:00 (Thu)
  61854109200, #  local_start 1961-01-29 01:00:00 (Sun)
  62061991200, #    local_end 1967-09-01 02:00:00 (Fri)
  36000,
  0,
  'GST',
      ],
      [
  62061955200, #    utc_start 1967-08-31 16:00:00 (Thu)
  62106267660, #      utc_end 1969-01-25 13:01:00 (Sat)
  62061994800, #  local_start 1967-09-01 03:00:00 (Fri)
  62106307260, #    local_end 1969-01-26 00:01:00 (Sun)
  39600,
  1,
  'GDT',
      ],
      [
  62106267660, #    utc_start 1969-01-25 13:01:00 (Sat)
  62118979200, #      utc_end 1969-06-21 16:00:00 (Sat)
  62106303660, #  local_start 1969-01-25 23:01:00 (Sat)
  62119015200, #    local_end 1969-06-22 02:00:00 (Sun)
  36000,
  0,
  'GST',
      ],
      [
  62118979200, #    utc_start 1969-06-21 16:00:00 (Sat)
  62125023600, #      utc_end 1969-08-30 15:00:00 (Sat)
  62119018800, #  local_start 1969-06-22 03:00:00 (Sun)
  62125063200, #    local_end 1969-08-31 02:00:00 (Sun)
  39600,
  1,
  'GDT',
      ],
      [
  62125023600, #    utc_start 1969-08-30 15:00:00 (Sat)
  62145590400, #      utc_end 1970-04-25 16:00:00 (Sat)
  62125059600, #  local_start 1969-08-31 01:00:00 (Sun)
  62145626400, #    local_end 1970-04-26 02:00:00 (Sun)
  36000,
  0,
  'GST',
      ],
      [
  62145590400, #    utc_start 1970-04-25 16:00:00 (Sat)
  62157078000, #      utc_end 1970-09-05 15:00:00 (Sat)
  62145630000, #  local_start 1970-04-26 03:00:00 (Sun)
  62157117600, #    local_end 1970-09-06 02:00:00 (Sun)
  39600,
  1,
  'GDT',
      ],
      [
  62157078000, #    utc_start 1970-09-05 15:00:00 (Sat)
  62177040000, #      utc_end 1971-04-24 16:00:00 (Sat)
  62157114000, #  local_start 1970-09-06 01:00:00 (Sun)
  62177076000, #    local_end 1971-04-25 02:00:00 (Sun)
  36000,
  0,
  'GST',
      ],
      [
  62177040000, #    utc_start 1971-04-24 16:00:00 (Sat)
  62188527600, #      utc_end 1971-09-04 15:00:00 (Sat)
  62177079600, #  local_start 1971-04-25 03:00:00 (Sun)
  62188567200, #    local_end 1971-09-05 02:00:00 (Sun)
  39600,
  1,
  'GDT',
      ],
      [
  62188527600, #    utc_start 1971-09-04 15:00:00 (Sat)
  62260502400, #      utc_end 1973-12-15 16:00:00 (Sat)
  62188563600, #  local_start 1971-09-05 01:00:00 (Sun)
  62260538400, #    local_end 1973-12-16 02:00:00 (Sun)
  36000,
  0,
  'GST',
      ],
      [
  62260502400, #    utc_start 1973-12-15 16:00:00 (Sat)
  62266546800, #      utc_end 1974-02-23 15:00:00 (Sat)
  62260542000, #  local_start 1973-12-16 03:00:00 (Sun)
  62266586400, #    local_end 1974-02-24 02:00:00 (Sun)
  39600,
  1,
  'GDT',
      ],
      [
  62266546800, #    utc_start 1974-02-23 15:00:00 (Sat)
  62337571200, #      utc_end 1976-05-25 16:00:00 (Tue)
  62266582800, #  local_start 1974-02-24 01:00:00 (Sun)
  62337607200, #    local_end 1976-05-26 02:00:00 (Wed)
  36000,
  0,
  'GST',
      ],
      [
  62337571200, #    utc_start 1976-05-25 16:00:00 (Tue)
  62345170860, #      utc_end 1976-08-21 15:01:00 (Sat)
  62337610800, #  local_start 1976-05-26 03:00:00 (Wed)
  62345210460, #    local_end 1976-08-22 02:01:00 (Sun)
  39600,
  1,
  'GDT',
      ],
      [
  62345170860, #    utc_start 1976-08-21 15:01:00 (Sat)
  62366342400, #      utc_end 1977-04-23 16:00:00 (Sat)
  62345206860, #  local_start 1976-08-22 01:01:00 (Sun)
  62366378400, #    local_end 1977-04-24 02:00:00 (Sun)
  36000,
  0,
  'GST',
      ],
      [
  62366342400, #    utc_start 1977-04-23 16:00:00 (Sat)
  62377225200, #      utc_end 1977-08-27 15:00:00 (Sat)
  62366382000, #  local_start 1977-04-24 03:00:00 (Sun)
  62377264800, #    local_end 1977-08-28 02:00:00 (Sun)
  39600,
  1,
  'GDT',
      ],
      [
  62377225200, #    utc_start 1977-08-27 15:00:00 (Sat)
  63113176800, #      utc_end 2000-12-22 14:00:00 (Fri)
  62377261200, #  local_start 1977-08-28 01:00:00 (Sun)
  63113212800, #    local_end 2000-12-23 00:00:00 (Sat)
  36000,
  0,
  'GST',
      ],
      [
  63113176800, #    utc_start 2000-12-22 14:00:00 (Fri)
  DateTime::TimeZone::INFINITY, #      utc_end
  63113212800, #  local_start 2000-12-23 00:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #    local_end
  36000,
  0,
  'ChST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {8}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_PACIFIC_GUAM

    $main::fatpacked{"DateTime/TimeZone/Pacific/Honolulu.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_PACIFIC_HONOLULU';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/northamerica.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Pacific::Honolulu;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Pacific::Honolulu::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59801581886, #      utc_end 1896-01-13 22:31:26 (Mon)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59801544000, #    local_end 1896-01-13 12:00:00 (Mon)
  -37886,
  0,
  'LMT',
      ],
      [
  59801581886, #    utc_start 1896-01-13 22:31:26 (Mon)
  60978400200, #      utc_end 1933-04-30 12:30:00 (Sun)
  59801544086, #  local_start 1896-01-13 12:01:26 (Mon)
  60978362400, #    local_end 1933-04-30 02:00:00 (Sun)
  -37800,
  0,
  'HST',
      ],
      [
  60978400200, #    utc_start 1933-04-30 12:30:00 (Sun)
  60980247000, #      utc_end 1933-05-21 21:30:00 (Sun)
  60978366000, #  local_start 1933-04-30 03:00:00 (Sun)
  60980212800, #    local_end 1933-05-21 12:00:00 (Sun)
  -34200,
  1,
  'HDT',
      ],
      [
  60980247000, #    utc_start 1933-05-21 21:30:00 (Sun)
  61255485000, #      utc_end 1942-02-09 12:30:00 (Mon)
  60980209200, #  local_start 1933-05-21 11:00:00 (Sun)
  61255447200, #    local_end 1942-02-09 02:00:00 (Mon)
  -37800,
  0,
  'HST',
      ],
      [
  61255485000, #    utc_start 1942-02-09 12:30:00 (Mon)
  61366287600, #      utc_end 1945-08-14 23:00:00 (Tue)
  61255450800, #  local_start 1942-02-09 03:00:00 (Mon)
  61366253400, #    local_end 1945-08-14 13:30:00 (Tue)
  -34200,
  1,
  'HWT',
      ],
      [
  61366287600, #    utc_start 1945-08-14 23:00:00 (Tue)
  61370307000, #      utc_end 1945-09-30 11:30:00 (Sun)
  61366253400, #  local_start 1945-08-14 13:30:00 (Tue)
  61370272800, #    local_end 1945-09-30 02:00:00 (Sun)
  -34200,
  1,
  'HPT',
      ],
      [
  61370307000, #    utc_start 1945-09-30 11:30:00 (Sun)
  61423533000, #      utc_end 1947-06-08 12:30:00 (Sun)
  61370269200, #  local_start 1945-09-30 01:00:00 (Sun)
  61423495200, #    local_end 1947-06-08 02:00:00 (Sun)
  -37800,
  0,
  'HST',
      ],
      [
  61423533000, #    utc_start 1947-06-08 12:30:00 (Sun)
  DateTime::TimeZone::INFINITY, #      utc_end
  61423497000, #  local_start 1947-06-08 02:30:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  -36000,
  0,
  'HST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {3}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_PACIFIC_HONOLULU

    $main::fatpacked{"DateTime/TimeZone/Pacific/Kiritimati.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_PACIFIC_KIRITIMATI';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/australasia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Pacific::Kiritimati;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Pacific::Kiritimati::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59958268160, #      utc_end 1901-01-01 10:29:20 (Tue)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59958230400, #    local_end 1901-01-01 00:00:00 (Tue)
  -37760,
  0,
  'LMT',
      ],
      [
  59958268160, #    utc_start 1901-01-01 10:29:20 (Tue)
  62443305600, #      utc_end 1979-10-01 10:40:00 (Mon)
  59958229760, #  local_start 1900-12-31 23:49:20 (Mon)
  62443267200, #    local_end 1979-10-01 00:00:00 (Mon)
  -38400,
  0,
  '-1040',
      ],
      [
  62443305600, #    utc_start 1979-10-01 10:40:00 (Mon)
  62924551200, #      utc_end 1994-12-31 10:00:00 (Sat)
  62443269600, #  local_start 1979-10-01 00:40:00 (Mon)
  62924515200, #    local_end 1994-12-31 00:00:00 (Sat)
  -36000,
  0,
  '-10',
      ],
      [
  62924551200, #    utc_start 1994-12-31 10:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  62924601600, #  local_start 1995-01-01 00:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  50400,
  0,
  '+14',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_PACIFIC_KIRITIMATI

    $main::fatpacked{"DateTime/TimeZone/Pacific/Kosrae.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_PACIFIC_KOSRAE';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/australasia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Pacific::Kosrae;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Pacific::Kosrae::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  58191052084, #      utc_end 1844-12-31 13:08:04 (Tue)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  58191004800, #    local_end 1844-12-31 00:00:00 (Tue)
  -47284,
  0,
  'LMT',
      ],
      [
  58191052084, #    utc_start 1844-12-31 13:08:04 (Tue)
  59958191284, #      utc_end 1900-12-31 13:08:04 (Mon)
  58191091200, #  local_start 1845-01-01 00:00:00 (Wed)
  59958230400, #    local_end 1901-01-01 00:00:00 (Tue)
  39116,
  0,
  'LMT',
      ],
      [
  59958191284, #    utc_start 1900-12-31 13:08:04 (Mon)
  60392005200, #      utc_end 1914-09-30 13:00:00 (Wed)
  59958230884, #  local_start 1901-01-01 00:08:04 (Tue)
  60392044800, #    local_end 1914-10-01 00:00:00 (Thu)
  39600,
  0,
  '+11',
      ],
      [
  60392005200, #    utc_start 1914-09-30 13:00:00 (Wed)
  60528870000, #      utc_end 1919-01-31 15:00:00 (Fri)
  60392037600, #  local_start 1914-09-30 22:00:00 (Wed)
  60528902400, #    local_end 1919-02-01 00:00:00 (Sat)
  32400,
  0,
  '+09',
      ],
      [
  60528870000, #    utc_start 1919-01-31 15:00:00 (Fri)
  61094264400, #      utc_end 1936-12-31 13:00:00 (Thu)
  60528909600, #  local_start 1919-02-01 02:00:00 (Sat)
  61094304000, #    local_end 1937-01-01 00:00:00 (Fri)
  39600,
  0,
  '+11',
      ],
      [
  61094264400, #    utc_start 1936-12-31 13:00:00 (Thu)
  61228274400, #      utc_end 1941-03-31 14:00:00 (Mon)
  61094300400, #  local_start 1936-12-31 23:00:00 (Thu)
  61228310400, #    local_end 1941-04-01 00:00:00 (Tue)
  36000,
  0,
  '+10',
      ],
      [
  61228274400, #    utc_start 1941-03-31 14:00:00 (Mon)
  61365049200, #      utc_end 1945-07-31 15:00:00 (Tue)
  61228306800, #  local_start 1941-03-31 23:00:00 (Mon)
  61365081600, #    local_end 1945-08-01 00:00:00 (Wed)
  32400,
  0,
  '+09',
      ],
      [
  61365049200, #    utc_start 1945-07-31 15:00:00 (Tue)
  62127694800, #      utc_end 1969-09-30 13:00:00 (Tue)
  61365088800, #  local_start 1945-08-01 02:00:00 (Wed)
  62127734400, #    local_end 1969-10-01 00:00:00 (Wed)
  39600,
  0,
  '+11',
      ],
      [
  62127694800, #    utc_start 1969-09-30 13:00:00 (Tue)
  63050788800, #      utc_end 1998-12-31 12:00:00 (Thu)
  62127738000, #  local_start 1969-10-01 01:00:00 (Wed)
  63050832000, #    local_end 1999-01-01 00:00:00 (Fri)
  43200,
  0,
  '+12',
      ],
      [
  63050788800, #    utc_start 1998-12-31 12:00:00 (Thu)
  DateTime::TimeZone::INFINITY, #      utc_end
  63050828400, #  local_start 1998-12-31 23:00:00 (Thu)
  DateTime::TimeZone::INFINITY, #    local_end
  39600,
  0,
  '+11',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_PACIFIC_KOSRAE

    $main::fatpacked{"DateTime/TimeZone/Pacific/Kwajalein.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_PACIFIC_KWAJALEIN';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/australasia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Pacific::Kwajalein;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Pacific::Kwajalein::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59958190240, #      utc_end 1900-12-31 12:50:40 (Mon)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59958230400, #    local_end 1901-01-01 00:00:00 (Tue)
  40160,
  0,
  'LMT',
      ],
      [
  59958190240, #    utc_start 1900-12-31 12:50:40 (Mon)
  61094264400, #      utc_end 1936-12-31 13:00:00 (Thu)
  59958229840, #  local_start 1900-12-31 23:50:40 (Mon)
  61094304000, #    local_end 1937-01-01 00:00:00 (Fri)
  39600,
  0,
  '+11',
      ],
      [
  61094264400, #    utc_start 1936-12-31 13:00:00 (Thu)
  61228274400, #      utc_end 1941-03-31 14:00:00 (Mon)
  61094300400, #  local_start 1936-12-31 23:00:00 (Thu)
  61228310400, #    local_end 1941-04-01 00:00:00 (Tue)
  36000,
  0,
  '+10',
      ],
      [
  61228274400, #    utc_start 1941-03-31 14:00:00 (Mon)
  61318220400, #      utc_end 1944-02-05 15:00:00 (Sat)
  61228306800, #  local_start 1941-03-31 23:00:00 (Mon)
  61318252800, #    local_end 1944-02-06 00:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  61318220400, #    utc_start 1944-02-05 15:00:00 (Sat)
  62127694800, #      utc_end 1969-09-30 13:00:00 (Tue)
  61318260000, #  local_start 1944-02-06 02:00:00 (Sun)
  62127734400, #    local_end 1969-10-01 00:00:00 (Wed)
  39600,
  0,
  '+11',
      ],
      [
  62127694800, #    utc_start 1969-09-30 13:00:00 (Tue)
  62881617600, #      utc_end 1993-08-21 12:00:00 (Sat)
  62127651600, #  local_start 1969-09-30 01:00:00 (Tue)
  62881574400, #    local_end 1993-08-21 00:00:00 (Sat)
  -43200,
  0,
  '-12',
      ],
      [
  62881617600, #    utc_start 1993-08-21 12:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  62881660800, #  local_start 1993-08-22 00:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  43200,
  0,
  '+12',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_PACIFIC_KWAJALEIN

    $main::fatpacked{"DateTime/TimeZone/Pacific/Majuro.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_PACIFIC_MAJURO';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/australasia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Pacific::Majuro;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Pacific::Majuro::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59958189312, #      utc_end 1900-12-31 12:35:12 (Mon)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59958230400, #    local_end 1901-01-01 00:00:00 (Tue)
  41088,
  0,
  'LMT',
      ],
      [
  59958189312, #    utc_start 1900-12-31 12:35:12 (Mon)
  60392005200, #      utc_end 1914-09-30 13:00:00 (Wed)
  59958228912, #  local_start 1900-12-31 23:35:12 (Mon)
  60392044800, #    local_end 1914-10-01 00:00:00 (Thu)
  39600,
  0,
  '+11',
      ],
      [
  60392005200, #    utc_start 1914-09-30 13:00:00 (Wed)
  60528870000, #      utc_end 1919-01-31 15:00:00 (Fri)
  60392037600, #  local_start 1914-09-30 22:00:00 (Wed)
  60528902400, #    local_end 1919-02-01 00:00:00 (Sat)
  32400,
  0,
  '+09',
      ],
      [
  60528870000, #    utc_start 1919-01-31 15:00:00 (Fri)
  61094264400, #      utc_end 1936-12-31 13:00:00 (Thu)
  60528909600, #  local_start 1919-02-01 02:00:00 (Sat)
  61094304000, #    local_end 1937-01-01 00:00:00 (Fri)
  39600,
  0,
  '+11',
      ],
      [
  61094264400, #    utc_start 1936-12-31 13:00:00 (Thu)
  61228274400, #      utc_end 1941-03-31 14:00:00 (Mon)
  61094300400, #  local_start 1936-12-31 23:00:00 (Thu)
  61228310400, #    local_end 1941-04-01 00:00:00 (Tue)
  36000,
  0,
  '+10',
      ],
      [
  61228274400, #    utc_start 1941-03-31 14:00:00 (Mon)
  61317615600, #      utc_end 1944-01-29 15:00:00 (Sat)
  61228306800, #  local_start 1941-03-31 23:00:00 (Mon)
  61317648000, #    local_end 1944-01-30 00:00:00 (Sun)
  32400,
  0,
  '+09',
      ],
      [
  61317615600, #    utc_start 1944-01-29 15:00:00 (Sat)
  62127694800, #      utc_end 1969-09-30 13:00:00 (Tue)
  61317655200, #  local_start 1944-01-30 02:00:00 (Sun)
  62127734400, #    local_end 1969-10-01 00:00:00 (Wed)
  39600,
  0,
  '+11',
      ],
      [
  62127694800, #    utc_start 1969-09-30 13:00:00 (Tue)
  DateTime::TimeZone::INFINITY, #      utc_end
  62127738000, #  local_start 1969-10-01 01:00:00 (Wed)
  DateTime::TimeZone::INFINITY, #    local_end
  43200,
  0,
  '+12',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_PACIFIC_MAJURO

    $main::fatpacked{"DateTime/TimeZone/Pacific/Marquesas.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_PACIFIC_MARQUESAS';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/australasia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Pacific::Marquesas;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Pacific::Marquesas::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60329006280, #      utc_end 1912-10-01 09:18:00 (Tue)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60328972800, #    local_end 1912-10-01 00:00:00 (Tue)
  -33480,
  0,
  'LMT',
      ],
      [
  60329006280, #    utc_start 1912-10-01 09:18:00 (Tue)
  DateTime::TimeZone::INFINITY, #      utc_end
  60328972080, #  local_start 1912-09-30 23:48:00 (Mon)
  DateTime::TimeZone::INFINITY, #    local_end
  -34200,
  0,
  '-0930',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_PACIFIC_MARQUESAS

    $main::fatpacked{"DateTime/TimeZone/Pacific/Nauru.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_PACIFIC_NAURU';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/australasia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Pacific::Nauru;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Pacific::Nauru::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60590551940, #      utc_end 1921-01-14 12:52:20 (Fri)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60590592000, #    local_end 1921-01-15 00:00:00 (Sat)
  40060,
  0,
  'LMT',
      ],
      [
  60590551940, #    utc_start 1921-01-14 12:52:20 (Fri)
  61272765000, #      utc_end 1942-08-28 12:30:00 (Fri)
  60590593340, #  local_start 1921-01-15 00:22:20 (Sat)
  61272806400, #    local_end 1942-08-29 00:00:00 (Sat)
  41400,
  0,
  '+1130',
      ],
      [
  61272765000, #    utc_start 1942-08-28 12:30:00 (Fri)
  61368332400, #      utc_end 1945-09-07 15:00:00 (Fri)
  61272797400, #  local_start 1942-08-28 21:30:00 (Fri)
  61368364800, #    local_end 1945-09-08 00:00:00 (Sat)
  32400,
  0,
  '+09',
      ],
      [
  61368332400, #    utc_start 1945-09-07 15:00:00 (Fri)
  62423101800, #      utc_end 1979-02-09 14:30:00 (Fri)
  61368373800, #  local_start 1945-09-08 02:30:00 (Sat)
  62423143200, #    local_end 1979-02-10 02:00:00 (Sat)
  41400,
  0,
  '+1130',
      ],
      [
  62423101800, #    utc_start 1979-02-09 14:30:00 (Fri)
  DateTime::TimeZone::INFINITY, #      utc_end
  62423145000, #  local_start 1979-02-10 02:30:00 (Sat)
  DateTime::TimeZone::INFINITY, #    local_end
  43200,
  0,
  '+12',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_PACIFIC_NAURU

    $main::fatpacked{"DateTime/TimeZone/Pacific/Niue.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_PACIFIC_NIUE';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/australasia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Pacific::Niue;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Pacific::Niue::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59958271180, #      utc_end 1901-01-01 11:19:40 (Tue)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59958230400, #    local_end 1901-01-01 00:00:00 (Tue)
  -40780,
  0,
  'LMT',
      ],
      [
  59958271180, #    utc_start 1901-01-01 11:19:40 (Tue)
  61536108000, #      utc_end 1951-01-01 11:20:00 (Mon)
  59958230380, #  local_start 1900-12-31 23:59:40 (Mon)
  61536067200, #    local_end 1951-01-01 00:00:00 (Mon)
  -40800,
  0,
  '-1120',
      ],
      [
  61536108000, #    utc_start 1951-01-01 11:20:00 (Mon)
  62411772600, #      utc_end 1978-10-01 11:30:00 (Sun)
  61536066600, #  local_start 1950-12-31 23:50:00 (Sun)
  62411731200, #    local_end 1978-10-01 00:00:00 (Sun)
  -41400,
  0,
  '-1130',
      ],
      [
  62411772600, #    utc_start 1978-10-01 11:30:00 (Sun)
  DateTime::TimeZone::INFINITY, #      utc_end
  62411733000, #  local_start 1978-10-01 00:30:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  -39600,
  0,
  '-11',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_PACIFIC_NIUE

    $main::fatpacked{"DateTime/TimeZone/Pacific/Norfolk.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_PACIFIC_NORFOLK';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/australasia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Pacific::Norfolk;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Pacific::Norfolk::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59958190088, #      utc_end 1900-12-31 12:48:08 (Mon)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59958230400, #    local_end 1901-01-01 00:00:00 (Tue)
  40312,
  0,
  'LMT',
      ],
      [
  59958190088, #    utc_start 1900-12-31 12:48:08 (Mon)
  61536026880, #      utc_end 1950-12-31 12:48:00 (Sun)
  59958230408, #  local_start 1901-01-01 00:00:08 (Tue)
  61536067200, #    local_end 1951-01-01 00:00:00 (Mon)
  40320,
  0,
  '+1112',
      ],
      [
  61536026880, #    utc_start 1950-12-31 12:48:00 (Sun)
  62287713000, #      utc_end 1974-10-26 14:30:00 (Sat)
  61536068280, #  local_start 1951-01-01 00:18:00 (Mon)
  62287754400, #    local_end 1974-10-27 02:00:00 (Sun)
  41400,
  0,
  '+1130',
      ],
      [
  62287713000, #    utc_start 1974-10-26 14:30:00 (Sat)
  62298595800, #      utc_end 1975-03-01 13:30:00 (Sat)
  62287758000, #  local_start 1974-10-27 03:00:00 (Sun)
  62298640800, #    local_end 1975-03-02 02:00:00 (Sun)
  45000,
  1,
  '+1230',
      ],
      [
  62298595800, #    utc_start 1975-03-01 13:30:00 (Sat)
  63579565800, #      utc_end 2015-10-03 14:30:00 (Sat)
  62298637200, #  local_start 1975-03-02 01:00:00 (Sun)
  63579607200, #    local_end 2015-10-04 02:00:00 (Sun)
  41400,
  0,
  '+1130',
      ],
      [
  63579565800, #    utc_start 2015-10-03 14:30:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  63579605400, #  local_start 2015-10-04 01:30:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  39600,
  0,
  '+11',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {1}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_PACIFIC_NORFOLK

    $main::fatpacked{"DateTime/TimeZone/Pacific/Noumea.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_PACIFIC_NOUMEA';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/australasia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Pacific::Noumea;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Pacific::Noumea::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60306296052, #      utc_end 1912-01-12 12:54:12 (Fri)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60306336000, #    local_end 1912-01-13 00:00:00 (Sat)
  39948,
  0,
  'LMT',
      ],
      [
  60306296052, #    utc_start 1912-01-12 12:54:12 (Fri)
  62385685200, #      utc_end 1977-12-03 13:00:00 (Sat)
  60306335652, #  local_start 1912-01-12 23:54:12 (Fri)
  62385724800, #    local_end 1977-12-04 00:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62385685200, #    utc_start 1977-12-03 13:00:00 (Sat)
  62393025600, #      utc_end 1978-02-26 12:00:00 (Sun)
  62385728400, #  local_start 1977-12-04 01:00:00 (Sun)
  62393068800, #    local_end 1978-02-27 00:00:00 (Mon)
  43200,
  1,
  '+12',
      ],
      [
  62393025600, #    utc_start 1978-02-26 12:00:00 (Sun)
  62417134800, #      utc_end 1978-12-02 13:00:00 (Sat)
  62393065200, #  local_start 1978-02-26 23:00:00 (Sun)
  62417174400, #    local_end 1978-12-03 00:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62417134800, #    utc_start 1978-12-02 13:00:00 (Sat)
  62424561600, #      utc_end 1979-02-26 12:00:00 (Mon)
  62417178000, #  local_start 1978-12-03 01:00:00 (Sun)
  62424604800, #    local_end 1979-02-27 00:00:00 (Tue)
  43200,
  1,
  '+12',
      ],
      [
  62424561600, #    utc_start 1979-02-26 12:00:00 (Mon)
  62985049200, #      utc_end 1996-11-30 15:00:00 (Sat)
  62424601200, #  local_start 1979-02-26 23:00:00 (Mon)
  62985088800, #    local_end 1996-12-01 02:00:00 (Sun)
  39600,
  0,
  '+11',
      ],
      [
  62985049200, #    utc_start 1996-11-30 15:00:00 (Sat)
  62992911600, #      utc_end 1997-03-01 15:00:00 (Sat)
  62985092400, #  local_start 1996-12-01 03:00:00 (Sun)
  62992954800, #    local_end 1997-03-02 03:00:00 (Sun)
  43200,
  1,
  '+12',
      ],
      [
  62992911600, #    utc_start 1997-03-01 15:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  62992951200, #  local_start 1997-03-02 02:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  39600,
  0,
  '+11',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {3}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_PACIFIC_NOUMEA

    $main::fatpacked{"DateTime/TimeZone/Pacific/Pago_Pago.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_PACIFIC_PAGO_PAGO';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/australasia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Pacific::Pago_Pago;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Pacific::Pago_Pago::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59690258568, #      utc_end 1892-07-04 11:22:48 (Mon)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59690304000, #    local_end 1892-07-05 00:00:00 (Tue)
  45432,
  0,
  'LMT',
      ],
      [
  59690258568, #    utc_start 1892-07-04 11:22:48 (Mon)
  60273804168, #      utc_end 1911-01-01 11:22:48 (Sun)
  59690217600, #  local_start 1892-07-04 00:00:00 (Mon)
  60273763200, #    local_end 1911-01-01 00:00:00 (Sun)
  -40968,
  0,
  'LMT',
      ],
      [
  60273804168, #    utc_start 1911-01-01 11:22:48 (Sun)
  DateTime::TimeZone::INFINITY, #      utc_end
  60273764568, #  local_start 1911-01-01 00:22:48 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  -39600,
  0,
  'SST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_PACIFIC_PAGO_PAGO

    $main::fatpacked{"DateTime/TimeZone/Pacific/Palau.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_PACIFIC_PALAU';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/australasia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Pacific::Palau;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Pacific::Palau::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  58191058924, #      utc_end 1844-12-31 15:02:04 (Tue)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  58191004800, #    local_end 1844-12-31 00:00:00 (Tue)
  -54124,
  0,
  'LMT',
      ],
      [
  58191058924, #    utc_start 1844-12-31 15:02:04 (Tue)
  59958198124, #      utc_end 1900-12-31 15:02:04 (Mon)
  58191091200, #  local_start 1845-01-01 00:00:00 (Wed)
  59958230400, #    local_end 1901-01-01 00:00:00 (Tue)
  32276,
  0,
  'LMT',
      ],
      [
  59958198124, #    utc_start 1900-12-31 15:02:04 (Mon)
  DateTime::TimeZone::INFINITY, #      utc_end
  59958230524, #  local_start 1901-01-01 00:02:04 (Tue)
  DateTime::TimeZone::INFINITY, #    local_end
  32400,
  0,
  '+09',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_PACIFIC_PALAU

    $main::fatpacked{"DateTime/TimeZone/Pacific/Pitcairn.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_PACIFIC_PITCAIRN';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/australasia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Pacific::Pitcairn;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Pacific::Pitcairn::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59958261620, #      utc_end 1901-01-01 08:40:20 (Tue)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59958230400, #    local_end 1901-01-01 00:00:00 (Tue)
  -31220,
  0,
  'LMT',
      ],
      [
  59958261620, #    utc_start 1901-01-01 08:40:20 (Tue)
  63029349000, #      utc_end 1998-04-27 08:30:00 (Mon)
  59958231020, #  local_start 1901-01-01 00:10:20 (Tue)
  63029318400, #    local_end 1998-04-27 00:00:00 (Mon)
  -30600,
  0,
  '-0830',
      ],
      [
  63029349000, #    utc_start 1998-04-27 08:30:00 (Mon)
  DateTime::TimeZone::INFINITY, #      utc_end
  63029320200, #  local_start 1998-04-27 00:30:00 (Mon)
  DateTime::TimeZone::INFINITY, #    local_end
  -28800,
  0,
  '-08',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_PACIFIC_PITCAIRN

    $main::fatpacked{"DateTime/TimeZone/Pacific/Pohnpei.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_PACIFIC_POHNPEI';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/australasia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Pacific::Pohnpei;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Pacific::Pohnpei::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  58191053228, #      utc_end 1844-12-31 13:27:08 (Tue)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  58191004800, #    local_end 1844-12-31 00:00:00 (Tue)
  -48428,
  0,
  'LMT',
      ],
      [
  58191053228, #    utc_start 1844-12-31 13:27:08 (Tue)
  59958192428, #      utc_end 1900-12-31 13:27:08 (Mon)
  58191091200, #  local_start 1845-01-01 00:00:00 (Wed)
  59958230400, #    local_end 1901-01-01 00:00:00 (Tue)
  37972,
  0,
  'LMT',
      ],
      [
  59958192428, #    utc_start 1900-12-31 13:27:08 (Mon)
  60392005200, #      utc_end 1914-09-30 13:00:00 (Wed)
  59958232028, #  local_start 1901-01-01 00:27:08 (Tue)
  60392044800, #    local_end 1914-10-01 00:00:00 (Thu)
  39600,
  0,
  '+11',
      ],
      [
  60392005200, #    utc_start 1914-09-30 13:00:00 (Wed)
  60528870000, #      utc_end 1919-01-31 15:00:00 (Fri)
  60392037600, #  local_start 1914-09-30 22:00:00 (Wed)
  60528902400, #    local_end 1919-02-01 00:00:00 (Sat)
  32400,
  0,
  '+09',
      ],
      [
  60528870000, #    utc_start 1919-01-31 15:00:00 (Fri)
  61094264400, #      utc_end 1936-12-31 13:00:00 (Thu)
  60528909600, #  local_start 1919-02-01 02:00:00 (Sat)
  61094304000, #    local_end 1937-01-01 00:00:00 (Fri)
  39600,
  0,
  '+11',
      ],
      [
  61094264400, #    utc_start 1936-12-31 13:00:00 (Thu)
  61228274400, #      utc_end 1941-03-31 14:00:00 (Mon)
  61094300400, #  local_start 1936-12-31 23:00:00 (Thu)
  61228310400, #    local_end 1941-04-01 00:00:00 (Tue)
  36000,
  0,
  '+10',
      ],
      [
  61228274400, #    utc_start 1941-03-31 14:00:00 (Mon)
  61365049200, #      utc_end 1945-07-31 15:00:00 (Tue)
  61228306800, #  local_start 1941-03-31 23:00:00 (Mon)
  61365081600, #    local_end 1945-08-01 00:00:00 (Wed)
  32400,
  0,
  '+09',
      ],
      [
  61365049200, #    utc_start 1945-07-31 15:00:00 (Tue)
  DateTime::TimeZone::INFINITY, #      utc_end
  61365088800, #  local_start 1945-08-01 02:00:00 (Wed)
  DateTime::TimeZone::INFINITY, #    local_end
  39600,
  0,
  '+11',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_PACIFIC_POHNPEI

    $main::fatpacked{"DateTime/TimeZone/Pacific/Port_Moresby.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_PACIFIC_PORT_MORESBY';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/australasia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Pacific::Port_Moresby;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Pacific::Port_Moresby::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59295507080, #      utc_end 1879-12-31 14:11:20 (Wed)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59295542400, #    local_end 1880-01-01 00:00:00 (Thu)
  35320,
  0,
  'LMT',
      ],
      [
  59295507080, #    utc_start 1879-12-31 14:11:20 (Wed)
  59768892688, #      utc_end 1894-12-31 14:11:28 (Mon)
  59295542392, #  local_start 1879-12-31 23:59:52 (Wed)
  59768928000, #    local_end 1895-01-01 00:00:00 (Tue)
  35312,
  0,
  'PMMT',
      ],
      [
  59768892688, #    utc_start 1894-12-31 14:11:28 (Mon)
  DateTime::TimeZone::INFINITY, #      utc_end
  59768928688, #  local_start 1895-01-01 00:11:28 (Tue)
  DateTime::TimeZone::INFINITY, #    local_end
  36000,
  0,
  '+10',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_PACIFIC_PORT_MORESBY

    $main::fatpacked{"DateTime/TimeZone/Pacific/Rarotonga.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_PACIFIC_RAROTONGA';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/australasia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Pacific::Rarotonga;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Pacific::Rarotonga::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59958268744, #      utc_end 1901-01-01 10:39:04 (Tue)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59958230400, #    local_end 1901-01-01 00:00:00 (Tue)
  -38344,
  0,
  'LMT',
      ],
      [
  59958268744, #    utc_start 1901-01-01 10:39:04 (Tue)
  62415397800, #      utc_end 1978-11-12 10:30:00 (Sun)
  59958230944, #  local_start 1901-01-01 00:09:04 (Tue)
  62415360000, #    local_end 1978-11-12 00:00:00 (Sun)
  -37800,
  0,
  '-1030',
      ],
      [
  62415397800, #    utc_start 1978-11-12 10:30:00 (Sun)
  62425071000, #      utc_end 1979-03-04 09:30:00 (Sun)
  62415363600, #  local_start 1978-11-12 01:00:00 (Sun)
  62425036800, #    local_end 1979-03-04 00:00:00 (Sun)
  -34200,
  1,
  '-0930',
      ],
      [
  62425071000, #    utc_start 1979-03-04 09:30:00 (Sun)
  62445636000, #      utc_end 1979-10-28 10:00:00 (Sun)
  62425035000, #  local_start 1979-03-03 23:30:00 (Sat)
  62445600000, #    local_end 1979-10-28 00:00:00 (Sun)
  -36000,
  0,
  '-10',
      ],
      [
  62445636000, #    utc_start 1979-10-28 10:00:00 (Sun)
  62456520600, #      utc_end 1980-03-02 09:30:00 (Sun)
  62445601800, #  local_start 1979-10-28 00:30:00 (Sun)
  62456486400, #    local_end 1980-03-02 00:00:00 (Sun)
  -34200,
  1,
  '-0930',
      ],
      [
  62456520600, #    utc_start 1980-03-02 09:30:00 (Sun)
  62477085600, #      utc_end 1980-10-26 10:00:00 (Sun)
  62456484600, #  local_start 1980-03-01 23:30:00 (Sat)
  62477049600, #    local_end 1980-10-26 00:00:00 (Sun)
  -36000,
  0,
  '-10',
      ],
      [
  62477085600, #    utc_start 1980-10-26 10:00:00 (Sun)
  62487970200, #      utc_end 1981-03-01 09:30:00 (Sun)
  62477051400, #  local_start 1980-10-26 00:30:00 (Sun)
  62487936000, #    local_end 1981-03-01 00:00:00 (Sun)
  -34200,
  1,
  '-0930',
      ],
      [
  62487970200, #    utc_start 1981-03-01 09:30:00 (Sun)
  62508535200, #      utc_end 1981-10-25 10:00:00 (Sun)
  62487934200, #  local_start 1981-02-28 23:30:00 (Sat)
  62508499200, #    local_end 1981-10-25 00:00:00 (Sun)
  -36000,
  0,
  '-10',
      ],
      [
  62508535200, #    utc_start 1981-10-25 10:00:00 (Sun)
  62520024600, #      utc_end 1982-03-07 09:30:00 (Sun)
  62508501000, #  local_start 1981-10-25 00:30:00 (Sun)
  62519990400, #    local_end 1982-03-07 00:00:00 (Sun)
  -34200,
  1,
  '-0930',
      ],
      [
  62520024600, #    utc_start 1982-03-07 09:30:00 (Sun)
  62540589600, #      utc_end 1982-10-31 10:00:00 (Sun)
  62519988600, #  local_start 1982-03-06 23:30:00 (Sat)
  62540553600, #    local_end 1982-10-31 00:00:00 (Sun)
  -36000,
  0,
  '-10',
      ],
      [
  62540589600, #    utc_start 1982-10-31 10:00:00 (Sun)
  62551474200, #      utc_end 1983-03-06 09:30:00 (Sun)
  62540555400, #  local_start 1982-10-31 00:30:00 (Sun)
  62551440000, #    local_end 1983-03-06 00:00:00 (Sun)
  -34200,
  1,
  '-0930',
      ],
      [
  62551474200, #    utc_start 1983-03-06 09:30:00 (Sun)
  62572039200, #      utc_end 1983-10-30 10:00:00 (Sun)
  62551438200, #  local_start 1983-03-05 23:30:00 (Sat)
  62572003200, #    local_end 1983-10-30 00:00:00 (Sun)
  -36000,
  0,
  '-10',
      ],
      [
  62572039200, #    utc_start 1983-10-30 10:00:00 (Sun)
  62582923800, #      utc_end 1984-03-04 09:30:00 (Sun)
  62572005000, #  local_start 1983-10-30 00:30:00 (Sun)
  62582889600, #    local_end 1984-03-04 00:00:00 (Sun)
  -34200,
  1,
  '-0930',
      ],
      [
  62582923800, #    utc_start 1984-03-04 09:30:00 (Sun)
  62603488800, #      utc_end 1984-10-28 10:00:00 (Sun)
  62582887800, #  local_start 1984-03-03 23:30:00 (Sat)
  62603452800, #    local_end 1984-10-28 00:00:00 (Sun)
  -36000,
  0,
  '-10',
      ],
      [
  62603488800, #    utc_start 1984-10-28 10:00:00 (Sun)
  62614373400, #      utc_end 1985-03-03 09:30:00 (Sun)
  62603454600, #  local_start 1984-10-28 00:30:00 (Sun)
  62614339200, #    local_end 1985-03-03 00:00:00 (Sun)
  -34200,
  1,
  '-0930',
      ],
      [
  62614373400, #    utc_start 1985-03-03 09:30:00 (Sun)
  62634938400, #      utc_end 1985-10-27 10:00:00 (Sun)
  62614337400, #  local_start 1985-03-02 23:30:00 (Sat)
  62634902400, #    local_end 1985-10-27 00:00:00 (Sun)
  -36000,
  0,
  '-10',
      ],
      [
  62634938400, #    utc_start 1985-10-27 10:00:00 (Sun)
  62645823000, #      utc_end 1986-03-02 09:30:00 (Sun)
  62634904200, #  local_start 1985-10-27 00:30:00 (Sun)
  62645788800, #    local_end 1986-03-02 00:00:00 (Sun)
  -34200,
  1,
  '-0930',
      ],
      [
  62645823000, #    utc_start 1986-03-02 09:30:00 (Sun)
  62666388000, #      utc_end 1986-10-26 10:00:00 (Sun)
  62645787000, #  local_start 1986-03-01 23:30:00 (Sat)
  62666352000, #    local_end 1986-10-26 00:00:00 (Sun)
  -36000,
  0,
  '-10',
      ],
      [
  62666388000, #    utc_start 1986-10-26 10:00:00 (Sun)
  62677272600, #      utc_end 1987-03-01 09:30:00 (Sun)
  62666353800, #  local_start 1986-10-26 00:30:00 (Sun)
  62677238400, #    local_end 1987-03-01 00:00:00 (Sun)
  -34200,
  1,
  '-0930',
      ],
      [
  62677272600, #    utc_start 1987-03-01 09:30:00 (Sun)
  62697837600, #      utc_end 1987-10-25 10:00:00 (Sun)
  62677236600, #  local_start 1987-02-28 23:30:00 (Sat)
  62697801600, #    local_end 1987-10-25 00:00:00 (Sun)
  -36000,
  0,
  '-10',
      ],
      [
  62697837600, #    utc_start 1987-10-25 10:00:00 (Sun)
  62709327000, #      utc_end 1988-03-06 09:30:00 (Sun)
  62697803400, #  local_start 1987-10-25 00:30:00 (Sun)
  62709292800, #    local_end 1988-03-06 00:00:00 (Sun)
  -34200,
  1,
  '-0930',
      ],
      [
  62709327000, #    utc_start 1988-03-06 09:30:00 (Sun)
  62729892000, #      utc_end 1988-10-30 10:00:00 (Sun)
  62709291000, #  local_start 1988-03-05 23:30:00 (Sat)
  62729856000, #    local_end 1988-10-30 00:00:00 (Sun)
  -36000,
  0,
  '-10',
      ],
      [
  62729892000, #    utc_start 1988-10-30 10:00:00 (Sun)
  62740776600, #      utc_end 1989-03-05 09:30:00 (Sun)
  62729857800, #  local_start 1988-10-30 00:30:00 (Sun)
  62740742400, #    local_end 1989-03-05 00:00:00 (Sun)
  -34200,
  1,
  '-0930',
      ],
      [
  62740776600, #    utc_start 1989-03-05 09:30:00 (Sun)
  62761341600, #      utc_end 1989-10-29 10:00:00 (Sun)
  62740740600, #  local_start 1989-03-04 23:30:00 (Sat)
  62761305600, #    local_end 1989-10-29 00:00:00 (Sun)
  -36000,
  0,
  '-10',
      ],
      [
  62761341600, #    utc_start 1989-10-29 10:00:00 (Sun)
  62772226200, #      utc_end 1990-03-04 09:30:00 (Sun)
  62761307400, #  local_start 1989-10-29 00:30:00 (Sun)
  62772192000, #    local_end 1990-03-04 00:00:00 (Sun)
  -34200,
  1,
  '-0930',
      ],
      [
  62772226200, #    utc_start 1990-03-04 09:30:00 (Sun)
  62792791200, #      utc_end 1990-10-28 10:00:00 (Sun)
  62772190200, #  local_start 1990-03-03 23:30:00 (Sat)
  62792755200, #    local_end 1990-10-28 00:00:00 (Sun)
  -36000,
  0,
  '-10',
      ],
      [
  62792791200, #    utc_start 1990-10-28 10:00:00 (Sun)
  62803675800, #      utc_end 1991-03-03 09:30:00 (Sun)
  62792757000, #  local_start 1990-10-28 00:30:00 (Sun)
  62803641600, #    local_end 1991-03-03 00:00:00 (Sun)
  -34200,
  1,
  '-0930',
      ],
      [
  62803675800, #    utc_start 1991-03-03 09:30:00 (Sun)
  DateTime::TimeZone::INFINITY, #      utc_end
  62803639800, #  local_start 1991-03-02 23:30:00 (Sat)
  DateTime::TimeZone::INFINITY, #    local_end
  -36000,
  0,
  '-10',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {13}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_PACIFIC_RAROTONGA

    $main::fatpacked{"DateTime/TimeZone/Pacific/Tahiti.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_PACIFIC_TAHITI';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/australasia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Pacific::Tahiti;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Pacific::Tahiti::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  60329008696, #      utc_end 1912-10-01 09:58:16 (Tue)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  60328972800, #    local_end 1912-10-01 00:00:00 (Tue)
  -35896,
  0,
  'LMT',
      ],
      [
  60329008696, #    utc_start 1912-10-01 09:58:16 (Tue)
  DateTime::TimeZone::INFINITY, #      utc_end
  60328972696, #  local_start 1912-09-30 23:58:16 (Mon)
  DateTime::TimeZone::INFINITY, #    local_end
  -36000,
  0,
  '-10',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_PACIFIC_TAHITI

    $main::fatpacked{"DateTime/TimeZone/Pacific/Tarawa.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_PACIFIC_TARAWA';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/australasia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Pacific::Tarawa;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Pacific::Tarawa::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59958188876, #      utc_end 1900-12-31 12:27:56 (Mon)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59958230400, #    local_end 1901-01-01 00:00:00 (Tue)
  41524,
  0,
  'LMT',
      ],
      [
  59958188876, #    utc_start 1900-12-31 12:27:56 (Mon)
  DateTime::TimeZone::INFINITY, #      utc_end
  59958232076, #  local_start 1901-01-01 00:27:56 (Tue)
  DateTime::TimeZone::INFINITY, #    local_end
  43200,
  0,
  '+12',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_PACIFIC_TARAWA

    $main::fatpacked{"DateTime/TimeZone/Pacific/Tongatapu.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_PACIFIC_TONGATAPU';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/australasia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Pacific::Tongatapu;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Pacific::Tongatapu::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59958186040, #      utc_end 1900-12-31 11:40:40 (Mon)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59958230400, #    local_end 1901-01-01 00:00:00 (Tue)
  44360,
  0,
  'LMT',
      ],
      [
  59958186040, #    utc_start 1900-12-31 11:40:40 (Mon)
  61220490000, #      utc_end 1940-12-31 11:40:00 (Tue)
  59958230440, #  local_start 1901-01-01 00:00:40 (Tue)
  61220534400, #    local_end 1941-01-01 00:00:00 (Wed)
  44400,
  0,
  '+1220',
      ],
      [
  61220490000, #    utc_start 1940-12-31 11:40:00 (Tue)
  63050785200, #      utc_end 1998-12-31 11:00:00 (Thu)
  61220536800, #  local_start 1941-01-01 00:40:00 (Wed)
  63050832000, #    local_end 1999-01-01 00:00:00 (Fri)
  46800,
  0,
  '+13',
      ],
      [
  63050785200, #    utc_start 1998-12-31 11:00:00 (Thu)
  63074898000, #      utc_end 1999-10-06 13:00:00 (Wed)
  63050832000, #  local_start 1999-01-01 00:00:00 (Fri)
  63074944800, #    local_end 1999-10-07 02:00:00 (Thu)
  46800,
  0,
  '+13',
      ],
      [
  63074898000, #    utc_start 1999-10-06 13:00:00 (Wed)
  63089067600, #      utc_end 2000-03-18 13:00:00 (Sat)
  63074948400, #  local_start 1999-10-07 03:00:00 (Thu)
  63089118000, #    local_end 2000-03-19 03:00:00 (Sun)
  50400,
  1,
  '+14',
      ],
      [
  63089067600, #    utc_start 2000-03-18 13:00:00 (Sat)
  63109026000, #      utc_end 2000-11-04 13:00:00 (Sat)
  63089114400, #  local_start 2000-03-19 02:00:00 (Sun)
  63109072800, #    local_end 2000-11-05 02:00:00 (Sun)
  46800,
  0,
  '+13',
      ],
      [
  63109026000, #    utc_start 2000-11-04 13:00:00 (Sat)
  63116280000, #      utc_end 2001-01-27 12:00:00 (Sat)
  63109076400, #  local_start 2000-11-05 03:00:00 (Sun)
  63116330400, #    local_end 2001-01-28 02:00:00 (Sun)
  50400,
  1,
  '+14',
      ],
      [
  63116280000, #    utc_start 2001-01-27 12:00:00 (Sat)
  63140475600, #      utc_end 2001-11-03 13:00:00 (Sat)
  63116326800, #  local_start 2001-01-28 01:00:00 (Sun)
  63140522400, #    local_end 2001-11-04 02:00:00 (Sun)
  46800,
  0,
  '+13',
      ],
      [
  63140475600, #    utc_start 2001-11-03 13:00:00 (Sat)
  63147729600, #      utc_end 2002-01-26 12:00:00 (Sat)
  63140526000, #  local_start 2001-11-04 03:00:00 (Sun)
  63147780000, #    local_end 2002-01-27 02:00:00 (Sun)
  50400,
  1,
  '+14',
      ],
      [
  63147729600, #    utc_start 2002-01-26 12:00:00 (Sat)
  63614034000, #      utc_end 2016-11-05 13:00:00 (Sat)
  63147776400, #  local_start 2002-01-27 01:00:00 (Sun)
  63614080800, #    local_end 2016-11-06 02:00:00 (Sun)
  46800,
  0,
  '+13',
      ],
      [
  63614034000, #    utc_start 2016-11-05 13:00:00 (Sat)
  63620082000, #      utc_end 2017-01-14 13:00:00 (Sat)
  63614084400, #  local_start 2016-11-06 03:00:00 (Sun)
  63620132400, #    local_end 2017-01-15 03:00:00 (Sun)
  50400,
  1,
  '+14',
      ],
      [
  63620082000, #    utc_start 2017-01-14 13:00:00 (Sat)
  DateTime::TimeZone::INFINITY, #      utc_end
  63620128800, #  local_start 2017-01-15 02:00:00 (Sun)
  DateTime::TimeZone::INFINITY, #    local_end
  46800,
  0,
  '+13',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {4}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_PACIFIC_TONGATAPU

    $main::fatpacked{"DateTime/TimeZone/Pacific/Wake.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_PACIFIC_WAKE';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/australasia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Pacific::Wake;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Pacific::Wake::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59958190412, #      utc_end 1900-12-31 12:53:32 (Mon)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59958230400, #    local_end 1901-01-01 00:00:00 (Tue)
  39988,
  0,
  'LMT',
      ],
      [
  59958190412, #    utc_start 1900-12-31 12:53:32 (Mon)
  DateTime::TimeZone::INFINITY, #      utc_end
  59958233612, #  local_start 1901-01-01 00:53:32 (Tue)
  DateTime::TimeZone::INFINITY, #    local_end
  43200,
  0,
  '+12',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_PACIFIC_WAKE

    $main::fatpacked{"DateTime/TimeZone/Pacific/Wallis.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_PACIFIC_WALLIS';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/australasia.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::Pacific::Wallis;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::Pacific::Wallis::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  59958186280, #      utc_end 1900-12-31 11:44:40 (Mon)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  59958230400, #    local_end 1901-01-01 00:00:00 (Tue)
  44120,
  0,
  'LMT',
      ],
      [
  59958186280, #    utc_start 1900-12-31 11:44:40 (Mon)
  DateTime::TimeZone::INFINITY, #      utc_end
  59958229480, #  local_start 1900-12-31 23:44:40 (Mon)
  DateTime::TimeZone::INFINITY, #    local_end
  43200,
  0,
  '+12',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {0}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  
  
  1;
  
DATETIME_TIMEZONE_PACIFIC_WALLIS

    $main::fatpacked{"DateTime/TimeZone/UTC.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_UTC';
  package DateTime::TimeZone::UTC;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use parent 'Class::Singleton', 'DateTime::TimeZone';
  
  sub new {
      return shift->instance;
  }
  
  ## no critic (Subroutines::ProhibitUnusedPrivateSubroutines)
  sub _new_instance {
      my $class = shift;
  
      return bless { name => 'UTC' }, $class;
  }
  ## use critic
  
  sub is_dst_for_datetime {0}
  
  sub offset_for_datetime       {0}
  sub offset_for_local_datetime {0}
  
  sub short_name_for_datetime {'UTC'}
  
  sub category {undef}
  
  sub is_utc {1}
  
  1;
  
  # ABSTRACT: The UTC time zone
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  DateTime::TimeZone::UTC - The UTC time zone
  
  =head1 VERSION
  
  version 2.36
  
  =head1 SYNOPSIS
  
    my $utc_tz = DateTime::TimeZone::UTC->new;
  
  =head1 DESCRIPTION
  
  This class is used to provide the DateTime::TimeZone API needed by
  DateTime.pm for the UTC time zone, which is not explicitly included in
  the Olson time zone database.
  
  The offset for this object will always be zero.
  
  =head1 USAGE
  
  This class has the same methods as a real time zone object, but the
  C<category()> method returns undef and C<is_utc()> returns true.
  
  =head1 SUPPORT
  
  Bugs may be submitted at L<https://github.com/houseabsolute/DateTime-TimeZone/issues>.
  
  I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
  
  =head1 SOURCE
  
  The source code repository for DateTime-TimeZone can be found at L<https://github.com/houseabsolute/DateTime-TimeZone>.
  
  =head1 AUTHOR
  
  Dave Rolsky <autarch@urth.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2019 by Dave Rolsky.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  The full text of the license can be found in the
  F<LICENSE> file included with this distribution.
  
  =cut
DATETIME_TIMEZONE_UTC

    $main::fatpacked{"DateTime/TimeZone/WET.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TIMEZONE_WET';
  # This file is auto-generated by the Perl DateTime Suite time zone
  # code generator (0.08) This code generator comes with the
  # DateTime::TimeZone module distribution in the tools/ directory
  
  #
  # Generated from /tmp/tRZSIOcmOW/europe.  Olson data version 2019b
  #
  # Do not edit this file directly.
  #
  package DateTime::TimeZone::WET;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '2.36';
  
  use Class::Singleton 1.03;
  use DateTime::TimeZone;
  use DateTime::TimeZone::OlsonDB;
  
  @DateTime::TimeZone::WET::ISA = ( 'Class::Singleton', 'DateTime::TimeZone' );
  
  my $spans =
  [
      [
  DateTime::TimeZone::NEG_INFINITY, #    utc_start
  62364560400, #      utc_end 1977-04-03 01:00:00 (Sun)
  DateTime::TimeZone::NEG_INFINITY, #  local_start
  62364560400, #    local_end 1977-04-03 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62364560400, #    utc_start 1977-04-03 01:00:00 (Sun)
  62379680400, #      utc_end 1977-09-25 01:00:00 (Sun)
  62364564000, #  local_start 1977-04-03 02:00:00 (Sun)
  62379684000, #    local_end 1977-09-25 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62379680400, #    utc_start 1977-09-25 01:00:00 (Sun)
  62396010000, #      utc_end 1978-04-02 01:00:00 (Sun)
  62379680400, #  local_start 1977-09-25 01:00:00 (Sun)
  62396010000, #    local_end 1978-04-02 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62396010000, #    utc_start 1978-04-02 01:00:00 (Sun)
  62411734800, #      utc_end 1978-10-01 01:00:00 (Sun)
  62396013600, #  local_start 1978-04-02 02:00:00 (Sun)
  62411738400, #    local_end 1978-10-01 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62411734800, #    utc_start 1978-10-01 01:00:00 (Sun)
  62427459600, #      utc_end 1979-04-01 01:00:00 (Sun)
  62411734800, #  local_start 1978-10-01 01:00:00 (Sun)
  62427459600, #    local_end 1979-04-01 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62427459600, #    utc_start 1979-04-01 01:00:00 (Sun)
  62443184400, #      utc_end 1979-09-30 01:00:00 (Sun)
  62427463200, #  local_start 1979-04-01 02:00:00 (Sun)
  62443188000, #    local_end 1979-09-30 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62443184400, #    utc_start 1979-09-30 01:00:00 (Sun)
  62459514000, #      utc_end 1980-04-06 01:00:00 (Sun)
  62443184400, #  local_start 1979-09-30 01:00:00 (Sun)
  62459514000, #    local_end 1980-04-06 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62459514000, #    utc_start 1980-04-06 01:00:00 (Sun)
  62474634000, #      utc_end 1980-09-28 01:00:00 (Sun)
  62459517600, #  local_start 1980-04-06 02:00:00 (Sun)
  62474637600, #    local_end 1980-09-28 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62474634000, #    utc_start 1980-09-28 01:00:00 (Sun)
  62490358800, #      utc_end 1981-03-29 01:00:00 (Sun)
  62474634000, #  local_start 1980-09-28 01:00:00 (Sun)
  62490358800, #    local_end 1981-03-29 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62490358800, #    utc_start 1981-03-29 01:00:00 (Sun)
  62506083600, #      utc_end 1981-09-27 01:00:00 (Sun)
  62490362400, #  local_start 1981-03-29 02:00:00 (Sun)
  62506087200, #    local_end 1981-09-27 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62506083600, #    utc_start 1981-09-27 01:00:00 (Sun)
  62521808400, #      utc_end 1982-03-28 01:00:00 (Sun)
  62506083600, #  local_start 1981-09-27 01:00:00 (Sun)
  62521808400, #    local_end 1982-03-28 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62521808400, #    utc_start 1982-03-28 01:00:00 (Sun)
  62537533200, #      utc_end 1982-09-26 01:00:00 (Sun)
  62521812000, #  local_start 1982-03-28 02:00:00 (Sun)
  62537536800, #    local_end 1982-09-26 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62537533200, #    utc_start 1982-09-26 01:00:00 (Sun)
  62553258000, #      utc_end 1983-03-27 01:00:00 (Sun)
  62537533200, #  local_start 1982-09-26 01:00:00 (Sun)
  62553258000, #    local_end 1983-03-27 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62553258000, #    utc_start 1983-03-27 01:00:00 (Sun)
  62568982800, #      utc_end 1983-09-25 01:00:00 (Sun)
  62553261600, #  local_start 1983-03-27 02:00:00 (Sun)
  62568986400, #    local_end 1983-09-25 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62568982800, #    utc_start 1983-09-25 01:00:00 (Sun)
  62584707600, #      utc_end 1984-03-25 01:00:00 (Sun)
  62568982800, #  local_start 1983-09-25 01:00:00 (Sun)
  62584707600, #    local_end 1984-03-25 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62584707600, #    utc_start 1984-03-25 01:00:00 (Sun)
  62601037200, #      utc_end 1984-09-30 01:00:00 (Sun)
  62584711200, #  local_start 1984-03-25 02:00:00 (Sun)
  62601040800, #    local_end 1984-09-30 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62601037200, #    utc_start 1984-09-30 01:00:00 (Sun)
  62616762000, #      utc_end 1985-03-31 01:00:00 (Sun)
  62601037200, #  local_start 1984-09-30 01:00:00 (Sun)
  62616762000, #    local_end 1985-03-31 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62616762000, #    utc_start 1985-03-31 01:00:00 (Sun)
  62632486800, #      utc_end 1985-09-29 01:00:00 (Sun)
  62616765600, #  local_start 1985-03-31 02:00:00 (Sun)
  62632490400, #    local_end 1985-09-29 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62632486800, #    utc_start 1985-09-29 01:00:00 (Sun)
  62648211600, #      utc_end 1986-03-30 01:00:00 (Sun)
  62632486800, #  local_start 1985-09-29 01:00:00 (Sun)
  62648211600, #    local_end 1986-03-30 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62648211600, #    utc_start 1986-03-30 01:00:00 (Sun)
  62663936400, #      utc_end 1986-09-28 01:00:00 (Sun)
  62648215200, #  local_start 1986-03-30 02:00:00 (Sun)
  62663940000, #    local_end 1986-09-28 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62663936400, #    utc_start 1986-09-28 01:00:00 (Sun)
  62679661200, #      utc_end 1987-03-29 01:00:00 (Sun)
  62663936400, #  local_start 1986-09-28 01:00:00 (Sun)
  62679661200, #    local_end 1987-03-29 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62679661200, #    utc_start 1987-03-29 01:00:00 (Sun)
  62695386000, #      utc_end 1987-09-27 01:00:00 (Sun)
  62679664800, #  local_start 1987-03-29 02:00:00 (Sun)
  62695389600, #    local_end 1987-09-27 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62695386000, #    utc_start 1987-09-27 01:00:00 (Sun)
  62711110800, #      utc_end 1988-03-27 01:00:00 (Sun)
  62695386000, #  local_start 1987-09-27 01:00:00 (Sun)
  62711110800, #    local_end 1988-03-27 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62711110800, #    utc_start 1988-03-27 01:00:00 (Sun)
  62726835600, #      utc_end 1988-09-25 01:00:00 (Sun)
  62711114400, #  local_start 1988-03-27 02:00:00 (Sun)
  62726839200, #    local_end 1988-09-25 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62726835600, #    utc_start 1988-09-25 01:00:00 (Sun)
  62742560400, #      utc_end 1989-03-26 01:00:00 (Sun)
  62726835600, #  local_start 1988-09-25 01:00:00 (Sun)
  62742560400, #    local_end 1989-03-26 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62742560400, #    utc_start 1989-03-26 01:00:00 (Sun)
  62758285200, #      utc_end 1989-09-24 01:00:00 (Sun)
  62742564000, #  local_start 1989-03-26 02:00:00 (Sun)
  62758288800, #    local_end 1989-09-24 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62758285200, #    utc_start 1989-09-24 01:00:00 (Sun)
  62774010000, #      utc_end 1990-03-25 01:00:00 (Sun)
  62758285200, #  local_start 1989-09-24 01:00:00 (Sun)
  62774010000, #    local_end 1990-03-25 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62774010000, #    utc_start 1990-03-25 01:00:00 (Sun)
  62790339600, #      utc_end 1990-09-30 01:00:00 (Sun)
  62774013600, #  local_start 1990-03-25 02:00:00 (Sun)
  62790343200, #    local_end 1990-09-30 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62790339600, #    utc_start 1990-09-30 01:00:00 (Sun)
  62806064400, #      utc_end 1991-03-31 01:00:00 (Sun)
  62790339600, #  local_start 1990-09-30 01:00:00 (Sun)
  62806064400, #    local_end 1991-03-31 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62806064400, #    utc_start 1991-03-31 01:00:00 (Sun)
  62821789200, #      utc_end 1991-09-29 01:00:00 (Sun)
  62806068000, #  local_start 1991-03-31 02:00:00 (Sun)
  62821792800, #    local_end 1991-09-29 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62821789200, #    utc_start 1991-09-29 01:00:00 (Sun)
  62837514000, #      utc_end 1992-03-29 01:00:00 (Sun)
  62821789200, #  local_start 1991-09-29 01:00:00 (Sun)
  62837514000, #    local_end 1992-03-29 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62837514000, #    utc_start 1992-03-29 01:00:00 (Sun)
  62853238800, #      utc_end 1992-09-27 01:00:00 (Sun)
  62837517600, #  local_start 1992-03-29 02:00:00 (Sun)
  62853242400, #    local_end 1992-09-27 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62853238800, #    utc_start 1992-09-27 01:00:00 (Sun)
  62868963600, #      utc_end 1993-03-28 01:00:00 (Sun)
  62853238800, #  local_start 1992-09-27 01:00:00 (Sun)
  62868963600, #    local_end 1993-03-28 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62868963600, #    utc_start 1993-03-28 01:00:00 (Sun)
  62884688400, #      utc_end 1993-09-26 01:00:00 (Sun)
  62868967200, #  local_start 1993-03-28 02:00:00 (Sun)
  62884692000, #    local_end 1993-09-26 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62884688400, #    utc_start 1993-09-26 01:00:00 (Sun)
  62900413200, #      utc_end 1994-03-27 01:00:00 (Sun)
  62884688400, #  local_start 1993-09-26 01:00:00 (Sun)
  62900413200, #    local_end 1994-03-27 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62900413200, #    utc_start 1994-03-27 01:00:00 (Sun)
  62916138000, #      utc_end 1994-09-25 01:00:00 (Sun)
  62900416800, #  local_start 1994-03-27 02:00:00 (Sun)
  62916141600, #    local_end 1994-09-25 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62916138000, #    utc_start 1994-09-25 01:00:00 (Sun)
  62931862800, #      utc_end 1995-03-26 01:00:00 (Sun)
  62916138000, #  local_start 1994-09-25 01:00:00 (Sun)
  62931862800, #    local_end 1995-03-26 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62931862800, #    utc_start 1995-03-26 01:00:00 (Sun)
  62947587600, #      utc_end 1995-09-24 01:00:00 (Sun)
  62931866400, #  local_start 1995-03-26 02:00:00 (Sun)
  62947591200, #    local_end 1995-09-24 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62947587600, #    utc_start 1995-09-24 01:00:00 (Sun)
  62963917200, #      utc_end 1996-03-31 01:00:00 (Sun)
  62947587600, #  local_start 1995-09-24 01:00:00 (Sun)
  62963917200, #    local_end 1996-03-31 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62963917200, #    utc_start 1996-03-31 01:00:00 (Sun)
  62982061200, #      utc_end 1996-10-27 01:00:00 (Sun)
  62963920800, #  local_start 1996-03-31 02:00:00 (Sun)
  62982064800, #    local_end 1996-10-27 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  62982061200, #    utc_start 1996-10-27 01:00:00 (Sun)
  62995366800, #      utc_end 1997-03-30 01:00:00 (Sun)
  62982061200, #  local_start 1996-10-27 01:00:00 (Sun)
  62995366800, #    local_end 1997-03-30 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  62995366800, #    utc_start 1997-03-30 01:00:00 (Sun)
  63013510800, #      utc_end 1997-10-26 01:00:00 (Sun)
  62995370400, #  local_start 1997-03-30 02:00:00 (Sun)
  63013514400, #    local_end 1997-10-26 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63013510800, #    utc_start 1997-10-26 01:00:00 (Sun)
  63026816400, #      utc_end 1998-03-29 01:00:00 (Sun)
  63013510800, #  local_start 1997-10-26 01:00:00 (Sun)
  63026816400, #    local_end 1998-03-29 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63026816400, #    utc_start 1998-03-29 01:00:00 (Sun)
  63044960400, #      utc_end 1998-10-25 01:00:00 (Sun)
  63026820000, #  local_start 1998-03-29 02:00:00 (Sun)
  63044964000, #    local_end 1998-10-25 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63044960400, #    utc_start 1998-10-25 01:00:00 (Sun)
  63058266000, #      utc_end 1999-03-28 01:00:00 (Sun)
  63044960400, #  local_start 1998-10-25 01:00:00 (Sun)
  63058266000, #    local_end 1999-03-28 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63058266000, #    utc_start 1999-03-28 01:00:00 (Sun)
  63077014800, #      utc_end 1999-10-31 01:00:00 (Sun)
  63058269600, #  local_start 1999-03-28 02:00:00 (Sun)
  63077018400, #    local_end 1999-10-31 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63077014800, #    utc_start 1999-10-31 01:00:00 (Sun)
  63089715600, #      utc_end 2000-03-26 01:00:00 (Sun)
  63077014800, #  local_start 1999-10-31 01:00:00 (Sun)
  63089715600, #    local_end 2000-03-26 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63089715600, #    utc_start 2000-03-26 01:00:00 (Sun)
  63108464400, #      utc_end 2000-10-29 01:00:00 (Sun)
  63089719200, #  local_start 2000-03-26 02:00:00 (Sun)
  63108468000, #    local_end 2000-10-29 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63108464400, #    utc_start 2000-10-29 01:00:00 (Sun)
  63121165200, #      utc_end 2001-03-25 01:00:00 (Sun)
  63108464400, #  local_start 2000-10-29 01:00:00 (Sun)
  63121165200, #    local_end 2001-03-25 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63121165200, #    utc_start 2001-03-25 01:00:00 (Sun)
  63139914000, #      utc_end 2001-10-28 01:00:00 (Sun)
  63121168800, #  local_start 2001-03-25 02:00:00 (Sun)
  63139917600, #    local_end 2001-10-28 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63139914000, #    utc_start 2001-10-28 01:00:00 (Sun)
  63153219600, #      utc_end 2002-03-31 01:00:00 (Sun)
  63139914000, #  local_start 2001-10-28 01:00:00 (Sun)
  63153219600, #    local_end 2002-03-31 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63153219600, #    utc_start 2002-03-31 01:00:00 (Sun)
  63171363600, #      utc_end 2002-10-27 01:00:00 (Sun)
  63153223200, #  local_start 2002-03-31 02:00:00 (Sun)
  63171367200, #    local_end 2002-10-27 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63171363600, #    utc_start 2002-10-27 01:00:00 (Sun)
  63184669200, #      utc_end 2003-03-30 01:00:00 (Sun)
  63171363600, #  local_start 2002-10-27 01:00:00 (Sun)
  63184669200, #    local_end 2003-03-30 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63184669200, #    utc_start 2003-03-30 01:00:00 (Sun)
  63202813200, #      utc_end 2003-10-26 01:00:00 (Sun)
  63184672800, #  local_start 2003-03-30 02:00:00 (Sun)
  63202816800, #    local_end 2003-10-26 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63202813200, #    utc_start 2003-10-26 01:00:00 (Sun)
  63216118800, #      utc_end 2004-03-28 01:00:00 (Sun)
  63202813200, #  local_start 2003-10-26 01:00:00 (Sun)
  63216118800, #    local_end 2004-03-28 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63216118800, #    utc_start 2004-03-28 01:00:00 (Sun)
  63234867600, #      utc_end 2004-10-31 01:00:00 (Sun)
  63216122400, #  local_start 2004-03-28 02:00:00 (Sun)
  63234871200, #    local_end 2004-10-31 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63234867600, #    utc_start 2004-10-31 01:00:00 (Sun)
  63247568400, #      utc_end 2005-03-27 01:00:00 (Sun)
  63234867600, #  local_start 2004-10-31 01:00:00 (Sun)
  63247568400, #    local_end 2005-03-27 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63247568400, #    utc_start 2005-03-27 01:00:00 (Sun)
  63266317200, #      utc_end 2005-10-30 01:00:00 (Sun)
  63247572000, #  local_start 2005-03-27 02:00:00 (Sun)
  63266320800, #    local_end 2005-10-30 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63266317200, #    utc_start 2005-10-30 01:00:00 (Sun)
  63279018000, #      utc_end 2006-03-26 01:00:00 (Sun)
  63266317200, #  local_start 2005-10-30 01:00:00 (Sun)
  63279018000, #    local_end 2006-03-26 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63279018000, #    utc_start 2006-03-26 01:00:00 (Sun)
  63297766800, #      utc_end 2006-10-29 01:00:00 (Sun)
  63279021600, #  local_start 2006-03-26 02:00:00 (Sun)
  63297770400, #    local_end 2006-10-29 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63297766800, #    utc_start 2006-10-29 01:00:00 (Sun)
  63310467600, #      utc_end 2007-03-25 01:00:00 (Sun)
  63297766800, #  local_start 2006-10-29 01:00:00 (Sun)
  63310467600, #    local_end 2007-03-25 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63310467600, #    utc_start 2007-03-25 01:00:00 (Sun)
  63329216400, #      utc_end 2007-10-28 01:00:00 (Sun)
  63310471200, #  local_start 2007-03-25 02:00:00 (Sun)
  63329220000, #    local_end 2007-10-28 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63329216400, #    utc_start 2007-10-28 01:00:00 (Sun)
  63342522000, #      utc_end 2008-03-30 01:00:00 (Sun)
  63329216400, #  local_start 2007-10-28 01:00:00 (Sun)
  63342522000, #    local_end 2008-03-30 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63342522000, #    utc_start 2008-03-30 01:00:00 (Sun)
  63360666000, #      utc_end 2008-10-26 01:00:00 (Sun)
  63342525600, #  local_start 2008-03-30 02:00:00 (Sun)
  63360669600, #    local_end 2008-10-26 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63360666000, #    utc_start 2008-10-26 01:00:00 (Sun)
  63373971600, #      utc_end 2009-03-29 01:00:00 (Sun)
  63360666000, #  local_start 2008-10-26 01:00:00 (Sun)
  63373971600, #    local_end 2009-03-29 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63373971600, #    utc_start 2009-03-29 01:00:00 (Sun)
  63392115600, #      utc_end 2009-10-25 01:00:00 (Sun)
  63373975200, #  local_start 2009-03-29 02:00:00 (Sun)
  63392119200, #    local_end 2009-10-25 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63392115600, #    utc_start 2009-10-25 01:00:00 (Sun)
  63405421200, #      utc_end 2010-03-28 01:00:00 (Sun)
  63392115600, #  local_start 2009-10-25 01:00:00 (Sun)
  63405421200, #    local_end 2010-03-28 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63405421200, #    utc_start 2010-03-28 01:00:00 (Sun)
  63424170000, #      utc_end 2010-10-31 01:00:00 (Sun)
  63405424800, #  local_start 2010-03-28 02:00:00 (Sun)
  63424173600, #    local_end 2010-10-31 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63424170000, #    utc_start 2010-10-31 01:00:00 (Sun)
  63436870800, #      utc_end 2011-03-27 01:00:00 (Sun)
  63424170000, #  local_start 2010-10-31 01:00:00 (Sun)
  63436870800, #    local_end 2011-03-27 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63436870800, #    utc_start 2011-03-27 01:00:00 (Sun)
  63455619600, #      utc_end 2011-10-30 01:00:00 (Sun)
  63436874400, #  local_start 2011-03-27 02:00:00 (Sun)
  63455623200, #    local_end 2011-10-30 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63455619600, #    utc_start 2011-10-30 01:00:00 (Sun)
  63468320400, #      utc_end 2012-03-25 01:00:00 (Sun)
  63455619600, #  local_start 2011-10-30 01:00:00 (Sun)
  63468320400, #    local_end 2012-03-25 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63468320400, #    utc_start 2012-03-25 01:00:00 (Sun)
  63487069200, #      utc_end 2012-10-28 01:00:00 (Sun)
  63468324000, #  local_start 2012-03-25 02:00:00 (Sun)
  63487072800, #    local_end 2012-10-28 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63487069200, #    utc_start 2012-10-28 01:00:00 (Sun)
  63500374800, #      utc_end 2013-03-31 01:00:00 (Sun)
  63487069200, #  local_start 2012-10-28 01:00:00 (Sun)
  63500374800, #    local_end 2013-03-31 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63500374800, #    utc_start 2013-03-31 01:00:00 (Sun)
  63518518800, #      utc_end 2013-10-27 01:00:00 (Sun)
  63500378400, #  local_start 2013-03-31 02:00:00 (Sun)
  63518522400, #    local_end 2013-10-27 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63518518800, #    utc_start 2013-10-27 01:00:00 (Sun)
  63531824400, #      utc_end 2014-03-30 01:00:00 (Sun)
  63518518800, #  local_start 2013-10-27 01:00:00 (Sun)
  63531824400, #    local_end 2014-03-30 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63531824400, #    utc_start 2014-03-30 01:00:00 (Sun)
  63549968400, #      utc_end 2014-10-26 01:00:00 (Sun)
  63531828000, #  local_start 2014-03-30 02:00:00 (Sun)
  63549972000, #    local_end 2014-10-26 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63549968400, #    utc_start 2014-10-26 01:00:00 (Sun)
  63563274000, #      utc_end 2015-03-29 01:00:00 (Sun)
  63549968400, #  local_start 2014-10-26 01:00:00 (Sun)
  63563274000, #    local_end 2015-03-29 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63563274000, #    utc_start 2015-03-29 01:00:00 (Sun)
  63581418000, #      utc_end 2015-10-25 01:00:00 (Sun)
  63563277600, #  local_start 2015-03-29 02:00:00 (Sun)
  63581421600, #    local_end 2015-10-25 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63581418000, #    utc_start 2015-10-25 01:00:00 (Sun)
  63594723600, #      utc_end 2016-03-27 01:00:00 (Sun)
  63581418000, #  local_start 2015-10-25 01:00:00 (Sun)
  63594723600, #    local_end 2016-03-27 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63594723600, #    utc_start 2016-03-27 01:00:00 (Sun)
  63613472400, #      utc_end 2016-10-30 01:00:00 (Sun)
  63594727200, #  local_start 2016-03-27 02:00:00 (Sun)
  63613476000, #    local_end 2016-10-30 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63613472400, #    utc_start 2016-10-30 01:00:00 (Sun)
  63626173200, #      utc_end 2017-03-26 01:00:00 (Sun)
  63613472400, #  local_start 2016-10-30 01:00:00 (Sun)
  63626173200, #    local_end 2017-03-26 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63626173200, #    utc_start 2017-03-26 01:00:00 (Sun)
  63644922000, #      utc_end 2017-10-29 01:00:00 (Sun)
  63626176800, #  local_start 2017-03-26 02:00:00 (Sun)
  63644925600, #    local_end 2017-10-29 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63644922000, #    utc_start 2017-10-29 01:00:00 (Sun)
  63657622800, #      utc_end 2018-03-25 01:00:00 (Sun)
  63644922000, #  local_start 2017-10-29 01:00:00 (Sun)
  63657622800, #    local_end 2018-03-25 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63657622800, #    utc_start 2018-03-25 01:00:00 (Sun)
  63676371600, #      utc_end 2018-10-28 01:00:00 (Sun)
  63657626400, #  local_start 2018-03-25 02:00:00 (Sun)
  63676375200, #    local_end 2018-10-28 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63676371600, #    utc_start 2018-10-28 01:00:00 (Sun)
  63689677200, #      utc_end 2019-03-31 01:00:00 (Sun)
  63676371600, #  local_start 2018-10-28 01:00:00 (Sun)
  63689677200, #    local_end 2019-03-31 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63689677200, #    utc_start 2019-03-31 01:00:00 (Sun)
  63707821200, #      utc_end 2019-10-27 01:00:00 (Sun)
  63689680800, #  local_start 2019-03-31 02:00:00 (Sun)
  63707824800, #    local_end 2019-10-27 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63707821200, #    utc_start 2019-10-27 01:00:00 (Sun)
  63721126800, #      utc_end 2020-03-29 01:00:00 (Sun)
  63707821200, #  local_start 2019-10-27 01:00:00 (Sun)
  63721126800, #    local_end 2020-03-29 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63721126800, #    utc_start 2020-03-29 01:00:00 (Sun)
  63739270800, #      utc_end 2020-10-25 01:00:00 (Sun)
  63721130400, #  local_start 2020-03-29 02:00:00 (Sun)
  63739274400, #    local_end 2020-10-25 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63739270800, #    utc_start 2020-10-25 01:00:00 (Sun)
  63752576400, #      utc_end 2021-03-28 01:00:00 (Sun)
  63739270800, #  local_start 2020-10-25 01:00:00 (Sun)
  63752576400, #    local_end 2021-03-28 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63752576400, #    utc_start 2021-03-28 01:00:00 (Sun)
  63771325200, #      utc_end 2021-10-31 01:00:00 (Sun)
  63752580000, #  local_start 2021-03-28 02:00:00 (Sun)
  63771328800, #    local_end 2021-10-31 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63771325200, #    utc_start 2021-10-31 01:00:00 (Sun)
  63784026000, #      utc_end 2022-03-27 01:00:00 (Sun)
  63771325200, #  local_start 2021-10-31 01:00:00 (Sun)
  63784026000, #    local_end 2022-03-27 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63784026000, #    utc_start 2022-03-27 01:00:00 (Sun)
  63802774800, #      utc_end 2022-10-30 01:00:00 (Sun)
  63784029600, #  local_start 2022-03-27 02:00:00 (Sun)
  63802778400, #    local_end 2022-10-30 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63802774800, #    utc_start 2022-10-30 01:00:00 (Sun)
  63815475600, #      utc_end 2023-03-26 01:00:00 (Sun)
  63802774800, #  local_start 2022-10-30 01:00:00 (Sun)
  63815475600, #    local_end 2023-03-26 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63815475600, #    utc_start 2023-03-26 01:00:00 (Sun)
  63834224400, #      utc_end 2023-10-29 01:00:00 (Sun)
  63815479200, #  local_start 2023-03-26 02:00:00 (Sun)
  63834228000, #    local_end 2023-10-29 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63834224400, #    utc_start 2023-10-29 01:00:00 (Sun)
  63847530000, #      utc_end 2024-03-31 01:00:00 (Sun)
  63834224400, #  local_start 2023-10-29 01:00:00 (Sun)
  63847530000, #    local_end 2024-03-31 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63847530000, #    utc_start 2024-03-31 01:00:00 (Sun)
  63865674000, #      utc_end 2024-10-27 01:00:00 (Sun)
  63847533600, #  local_start 2024-03-31 02:00:00 (Sun)
  63865677600, #    local_end 2024-10-27 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63865674000, #    utc_start 2024-10-27 01:00:00 (Sun)
  63878979600, #      utc_end 2025-03-30 01:00:00 (Sun)
  63865674000, #  local_start 2024-10-27 01:00:00 (Sun)
  63878979600, #    local_end 2025-03-30 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63878979600, #    utc_start 2025-03-30 01:00:00 (Sun)
  63897123600, #      utc_end 2025-10-26 01:00:00 (Sun)
  63878983200, #  local_start 2025-03-30 02:00:00 (Sun)
  63897127200, #    local_end 2025-10-26 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63897123600, #    utc_start 2025-10-26 01:00:00 (Sun)
  63910429200, #      utc_end 2026-03-29 01:00:00 (Sun)
  63897123600, #  local_start 2025-10-26 01:00:00 (Sun)
  63910429200, #    local_end 2026-03-29 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63910429200, #    utc_start 2026-03-29 01:00:00 (Sun)
  63928573200, #      utc_end 2026-10-25 01:00:00 (Sun)
  63910432800, #  local_start 2026-03-29 02:00:00 (Sun)
  63928576800, #    local_end 2026-10-25 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63928573200, #    utc_start 2026-10-25 01:00:00 (Sun)
  63941878800, #      utc_end 2027-03-28 01:00:00 (Sun)
  63928573200, #  local_start 2026-10-25 01:00:00 (Sun)
  63941878800, #    local_end 2027-03-28 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63941878800, #    utc_start 2027-03-28 01:00:00 (Sun)
  63960627600, #      utc_end 2027-10-31 01:00:00 (Sun)
  63941882400, #  local_start 2027-03-28 02:00:00 (Sun)
  63960631200, #    local_end 2027-10-31 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63960627600, #    utc_start 2027-10-31 01:00:00 (Sun)
  63973328400, #      utc_end 2028-03-26 01:00:00 (Sun)
  63960627600, #  local_start 2027-10-31 01:00:00 (Sun)
  63973328400, #    local_end 2028-03-26 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  63973328400, #    utc_start 2028-03-26 01:00:00 (Sun)
  63992077200, #      utc_end 2028-10-29 01:00:00 (Sun)
  63973332000, #  local_start 2028-03-26 02:00:00 (Sun)
  63992080800, #    local_end 2028-10-29 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  63992077200, #    utc_start 2028-10-29 01:00:00 (Sun)
  64004778000, #      utc_end 2029-03-25 01:00:00 (Sun)
  63992077200, #  local_start 2028-10-29 01:00:00 (Sun)
  64004778000, #    local_end 2029-03-25 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  64004778000, #    utc_start 2029-03-25 01:00:00 (Sun)
  64023526800, #      utc_end 2029-10-28 01:00:00 (Sun)
  64004781600, #  local_start 2029-03-25 02:00:00 (Sun)
  64023530400, #    local_end 2029-10-28 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
      [
  64023526800, #    utc_start 2029-10-28 01:00:00 (Sun)
  64036832400, #      utc_end 2030-03-31 01:00:00 (Sun)
  64023526800, #  local_start 2029-10-28 01:00:00 (Sun)
  64036832400, #    local_end 2030-03-31 01:00:00 (Sun)
  0,
  0,
  'WET',
      ],
      [
  64036832400, #    utc_start 2030-03-31 01:00:00 (Sun)
  64054976400, #      utc_end 2030-10-27 01:00:00 (Sun)
  64036836000, #  local_start 2030-03-31 02:00:00 (Sun)
  64054980000, #    local_end 2030-10-27 02:00:00 (Sun)
  3600,
  1,
  'WEST',
      ],
  ];
  
  sub olson_version {'2019b'}
  
  sub has_dst_changes {54}
  
  sub _max_year {2029}
  
  sub _new_instance {
      return shift->_init( @_, spans => $spans );
  }
  
  sub _last_offset { 0 }
  
  my $last_observance = bless( {
    'format' => 'WE%sT',
    'gmtoff' => '0:00',
    'local_start_datetime' => {},
    'offset_from_std' => 0,
    'offset_from_utc' => 0,
    'until' => [],
    'utc_start_datetime' => {}
  }, 'DateTime::TimeZone::OlsonDB::Observance' )
  ;
  sub _last_observance { $last_observance }
  
  my $rules = [
    bless( {
      'at' => '1:00u',
      'from' => '1981',
      'in' => 'Mar',
      'letter' => 'S',
      'name' => 'EU',
      'offset_from_std' => 3600,
      'on' => 'lastSun',
      'save' => '1:00',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' ),
    bless( {
      'at' => '1:00u',
      'from' => '1996',
      'in' => 'Oct',
      'letter' => '',
      'name' => 'EU',
      'offset_from_std' => 0,
      'on' => 'lastSun',
      'save' => '0',
      'to' => 'max'
    }, 'DateTime::TimeZone::OlsonDB::Rule' )
  ]
  ;
  sub _rules { $rules }
  
  
  1;
  
DATETIME_TIMEZONE_WET

    $main::fatpacked{"DateTime/Types.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DATETIME_TYPES';
  package DateTime::Types;
  
  use strict;
  use warnings;
  use namespace::autoclean;
  
  our $VERSION = '1.51';
  
  use parent 'Specio::Exporter';
  
  use Specio 0.18;
  use Specio::Declare;
  use Specio::Library::Builtins -reexport;
  use Specio::Library::Numeric -reexport;
  use Specio::Library::String;
  
  any_can_type(
      'ConvertibleObject',
      methods => ['utc_rd_values'],
  );
  
  declare(
      'DayOfMonth',
      parent => t('Int'),
      inline => sub {
          $_[0]->parent->inline_check( $_[1] )
              . " && $_[1] >= 1 && $_[1] <= 31";
      },
  );
  
  declare(
      'DayOfYear',
      parent => t('Int'),
      inline => sub {
          $_[0]->parent->inline_check( $_[1] )
              . " && $_[1] >= 1 && $_[1] <= 366";
      },
  );
  
  object_isa_type(
      'Duration',
      class => 'DateTime::Duration',
  );
  
  enum(
      'EndOfMonthMode',
      values => [qw( wrap limit preserve )],
  );
  
  any_can_type(
      'Formatter',
      methods => ['format_datetime'],
  );
  
  my $locale_object = declare(
      'LocaleObject',
      parent => t('Object'),
      inline => sub {
  
          # Can't use $_[1] directly because 5.8 gives very weird errors
          my $var = $_[1];
          <<"EOF";
  (
      $var->isa('DateTime::Locale::FromData')
      || $var->isa('DateTime::Locale::Base')
  )
  EOF
      },
  );
  
  union(
      'Locale',
      of => [ t('NonEmptySimpleStr'), $locale_object ],
  );
  
  my $time_zone_object = object_can_type(
      'TZObject',
      methods => [
          qw(
              is_floating
              is_utc
              name
              offset_for_datetime
              short_name_for_datetime
              )
      ],
  );
  
  declare(
      'TimeZone',
      of => [ t('NonEmptySimpleStr'), $time_zone_object ],
  );
  
  declare(
      'Hour',
      parent => t('PositiveOrZeroInt'),
      inline => sub {
          $_[0]->parent->inline_check( $_[1] )
              . " && $_[1] >= 0 && $_[1] <= 23";
      },
  );
  
  declare(
      'Minute',
      parent => t('PositiveOrZeroInt'),
      inline => sub {
          $_[0]->parent->inline_check( $_[1] )
              . " && $_[1] >= 0 && $_[1] <= 59";
      },
  );
  
  declare(
      'Month',
      parent => t('PositiveInt'),
      inline => sub {
          $_[0]->parent->inline_check( $_[1] )
              . " && $_[1] >= 1 && $_[1] <= 12";
      },
  );
  
  declare(
      'Nanosecond',
      parent => t('PositiveOrZeroInt'),
  );
  
  declare(
      'Second',
      parent => t('PositiveOrZeroInt'),
      inline => sub {
          $_[0]->parent->inline_check( $_[1] )
              . " && $_[1] >= 0 && $_[1] <= 61";
      },
  );
  
  enum(
      'TruncationLevel',
      values => [
          qw(
              year
              quarter
              month
              day hour
              minute
              second
              nanosecond
              week
              local_week
              )
      ],
  );
  
  declare(
      'Year',
      parent => t('Int'),
  );
  
  1;
  
  # ABSTRACT: Types used for parameter checking in DateTime
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  DateTime::Types - Types used for parameter checking in DateTime
  
  =head1 VERSION
  
  version 1.51
  
  =head1 DESCRIPTION
  
  This module has no user-facing parts.
  
  =for Pod::Coverage .*
  
  =head1 SUPPORT
  
  Bugs may be submitted at L<https://github.com/houseabsolute/DateTime.pm/issues>.
  
  There is a mailing list available for users of this distribution,
  L<mailto:datetime@perl.org>.
  
  I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
  
  =head1 SOURCE
  
  The source code repository for DateTime can be found at L<https://github.com/houseabsolute/DateTime.pm>.
  
  =head1 AUTHOR
  
  Dave Rolsky <autarch@urth.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is Copyright (c) 2003 - 2019 by Dave Rolsky.
  
  This is free software, licensed under:
  
    The Artistic License 2.0 (GPL Compatible)
  
  The full text of the license can be found in the
  F<LICENSE> file included with this distribution.
  
  =cut
DATETIME_TYPES

    $main::fatpacked{"Devel/Caller/Util.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DEVEL_CALLER_UTIL';
  package Devel::Caller::Util;
  
  our $DATE = '2019-04-12'; # DATE
  our $VERSION = '0.042'; # VERSION
  
  use warnings;
  use strict;
  
  use Exporter qw(import);
  our @EXPORT_OK = qw(caller callers);
  
  my $_is_caller;
  
  sub callers {
      my ($start, $with_args, $packages_to_ignore, $subroutines_to_ignore) = @_;
      $start = 0 unless defined $start;
  
      my @res;
      my $i = 1;
  
      while (1) {
          my @caller;
          if ($with_args) {
              {
                  package # hide from PAUSE
                      DB;
                  @caller = caller($i);
                  $caller[11] = [@DB::args] if @caller;
              }
          } else {
              @caller = caller($i);
          }
          last unless @caller;
          $i++;
  
          if ($packages_to_ignore) {
              if (ref $packages_to_ignore eq 'ARRAY') {
                  next if grep { $_ eq $caller[0] } @$packages_to_ignore;
              } else {
                  next if $caller[0] =~ $packages_to_ignore;
              }
          }
  
          if ($subroutines_to_ignore) {
              if (ref $subroutines_to_ignore eq 'ARRAY') {
                  next if grep { $_ eq $caller[3] } @$subroutines_to_ignore;
              } else {
                  next if $caller[3] =~ $subroutines_to_ignore;
              }
          }
  
          push @res, \@caller;
          do { $_is_caller = 0; return @caller } if $_is_caller && @res == $start+1;
      }
  
      splice @res, 0, $start if $start;
      $_is_caller = 0;
      @res;
  }
  
  sub caller {
      $_is_caller = 1; # "local" doesn't work here
      goto &callers;
  }
  
  1;
  # ABSTRACT: caller()-related utility routines
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Devel::Caller::Util - caller()-related utility routines
  
  =head1 VERSION
  
  This document describes version 0.042 of Devel::Caller::Util (from Perl distribution Devel-Caller-Util), released on 2019-04-12.
  
  =head1 SYNOPSIS
  
   use Devel::Util::Caller qw(caller callers);
  
   my @info = caller(3);
  
   my @callers = callers();
  
  =head1 FUNCTIONS
  
  =head2 caller
  
  Usage:
  
   caller([ $offset [, $with_args [, $packages_to_ignore [, $subroutines_to_ignore ] ] ] ]) => LIST
  
  Just like the built-in C<caller()>, except with three additional optional
  arguments. Will return this list:
  
       #  0          1           2       3             4          5            6           7             8        9          10
       ($package1, $filename1, $line1, $subroutine1, $hasargs1, $wantarray1, $evaltext1, $is_require1, $hints1, $bitmask1, $hinthash1)
  
  If C<$with_args> is true, will also return subroutine arguments in the 11th
  element of the result, produced by retrieving C<@DB::args>.
  
  C<$packages_to_ignore> can be set to a regex (will be matched against
  C<$packageI>) or an arrayref of package names.
  
  Similarly, C<$subroutines_to_ignore> can be set to a regex or an arrayref of
  subroutine names. Note that subroutine names are B<fully qualified names>.
  
  =head2 callers([ $start=0 [, $with_args [, $packages_to_ignore [, $subroutines_to_ignore ] ] ] ]) => LIST
  
  A convenience function to return the whole callers stack, produced by calling
  C<caller()> repeatedly from frame C<$start+1> until C<caller()> returns empty.
  Result will be like:
  
   (
       #  0          1           2       3             4          5            6           7             8        9          10
       [$package1, $filename1, $line1, $subroutine1, $hasargs1, $wantarray1, $evaltext1, $is_require1, $hints1, $bitmask1, $hinthash1],
       [$package2, $filename2, $line2, ...],
       ...
   )
  
  See L</caller> for more information about the three additional, optional
  arguments.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Devel-Caller-Util>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Devel-Caller-Util>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Devel-Caller-Util>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2019, 2015 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DEVEL_CALLER_UTIL

    $main::fatpacked{"Devel/StackTrace.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DEVEL_STACKTRACE';
  package Devel::StackTrace;
  
  use 5.006;
  
  use strict;
  use warnings;
  
  our $VERSION = '2.04';
  
  use Devel::StackTrace::Frame;
  use File::Spec;
  use Scalar::Util qw( blessed );
  
  use overload
      '""'     => \&as_string,
      fallback => 1;
  
  sub new {
      my $class = shift;
      my %p     = @_;
  
      $p{unsafe_ref_capture} = !delete $p{no_refs}
          if exists $p{no_refs};
  
      my $self = bless {
          index  => undef,
          frames => [],
          raw    => [],
          %p,
      }, $class;
  
      $self->_record_caller_data;
  
      return $self;
  }
  
  sub _record_caller_data {
      my $self = shift;
  
      my $filter = $self->{filter_frames_early} && $self->_make_frame_filter;
  
      # We exclude this method by starting at least one frame back.
      my $x = 1 + ( $self->{skip_frames} || 0 );
  
      while (
          my @c
          = $self->{no_args}
          ? caller( $x++ )
          : do {
              ## no critic (Modules::ProhibitMultiplePackages, Variables::ProhibitPackageVars)
              package    # the newline keeps dzil from adding a version here
                  DB;
              @DB::args = ();
              caller( $x++ );
          }
      ) {
  
          my @args;
  
          ## no critic (Variables::ProhibitPackageVars, BuiltinFunctions::ProhibitComplexMappings)
          unless ( $self->{no_args} ) {
  
              # This is the same workaroud as was applied to Carp.pm a little
              # while back
              # (https://rt.perl.org/Public/Bug/Display.html?id=131046):
              #
              #   Guard our serialization of the stack from stack refcounting
              #   bugs NOTE this is NOT a complete solution, we cannot 100%
              #   guard against these bugs. However in many cases Perl *is*
              #   capable of detecting them and throws an error when it
              #   does. Unfortunately serializing the arguments on the stack is
              #   a perfect way of finding these bugs, even when they would not
              #   affect normal program flow that did not poke around inside the
              #   stack. Inside of Carp.pm it makes little sense reporting these
              #   bugs, as Carp's job is to report the callers errors, not the
              #   ones it might happen to tickle while doing so.  See:
              #   https://rt.perl.org/Public/Bug/Display.html?id=131046 and:
              #   https://rt.perl.org/Public/Bug/Display.html?id=52610 for more
              #   details and discussion. - Yves
              @args = map {
                  my $arg;
                  local $@ = $@;
                  eval {
                      $arg = $_;
                      1;
                  } or do {
                      $arg = '** argument not available anymore **';
                  };
                  $arg;
              } @DB::args;
          }
          ## use critic
  
          my $raw = {
              caller => \@c,
              args   => \@args,
          };
  
          next if $filter && !$filter->($raw);
  
          unless ( $self->{unsafe_ref_capture} ) {
              $raw->{args} = [ map { ref $_ ? $self->_ref_to_string($_) : $_ }
                      @{ $raw->{args} } ];
          }
  
          push @{ $self->{raw} }, $raw;
      }
  }
  
  sub _ref_to_string {
      my $self = shift;
      my $ref  = shift;
  
      return overload::AddrRef($ref)
          if blessed $ref && $ref->isa('Exception::Class::Base');
  
      return overload::AddrRef($ref) unless $self->{respect_overload};
  
      ## no critic (Variables::RequireInitializationForLocalVars)
      local $@;
      local $SIG{__DIE__};
      ## use critic
  
      my $str = eval { $ref . q{} };
  
      return $@ ? overload::AddrRef($ref) : $str;
  }
  
  sub _make_frames {
      my $self = shift;
  
      my $filter = !$self->{filter_frames_early} && $self->_make_frame_filter;
  
      my $raw = delete $self->{raw};
      for my $r ( @{$raw} ) {
          next if $filter && !$filter->($r);
  
          $self->_add_frame( $r->{caller}, $r->{args} );
      }
  }
  
  my $default_filter = sub {1};
  
  sub _make_frame_filter {
      my $self = shift;
  
      my ( @i_pack_re, %i_class );
      if ( $self->{ignore_package} ) {
          ## no critic (Variables::RequireInitializationForLocalVars)
          local $@;
          local $SIG{__DIE__};
          ## use critic
  
          $self->{ignore_package} = [ $self->{ignore_package} ]
              unless eval { @{ $self->{ignore_package} } };
  
          @i_pack_re
              = map { ref $_ ? $_ : qr/^\Q$_\E$/ } @{ $self->{ignore_package} };
      }
  
      my $p = __PACKAGE__;
      push @i_pack_re, qr/^\Q$p\E$/;
  
      if ( $self->{ignore_class} ) {
          $self->{ignore_class} = [ $self->{ignore_class} ]
              unless ref $self->{ignore_class};
          %i_class = map { $_ => 1 } @{ $self->{ignore_class} };
      }
  
      my $user_filter = $self->{frame_filter};
  
      return sub {
          return 0 if grep { $_[0]{caller}[0] =~ /$_/ } @i_pack_re;
          return 0 if grep { $_[0]{caller}[0]->isa($_) } keys %i_class;
  
          if ($user_filter) {
              return $user_filter->( $_[0] );
          }
  
          return 1;
      };
  }
  
  sub _add_frame {
      my $self = shift;
      my $c    = shift;
      my $p    = shift;
  
      # eval and is_require are only returned when applicable under 5.00503.
      push @$c, ( undef, undef ) if scalar @$c == 6;
  
      push @{ $self->{frames} },
          Devel::StackTrace::Frame->new(
          $c,
          $p,
          $self->{respect_overload},
          $self->{max_arg_length},
          $self->{message},
          $self->{indent}
          );
  }
  
  sub next_frame {
      my $self = shift;
  
      # reset to top if necessary.
      $self->{index} = -1 unless defined $self->{index};
  
      my @f = $self->frames;
      if ( defined $f[ $self->{index} + 1 ] ) {
          return $f[ ++$self->{index} ];
      }
      else {
          $self->{index} = undef;
          ## no critic (Subroutines::ProhibitExplicitReturnUndef)
          return undef;
      }
  }
  
  sub prev_frame {
      my $self = shift;
  
      my @f = $self->frames;
  
      # reset to top if necessary.
      $self->{index} = scalar @f unless defined $self->{index};
  
      if ( defined $f[ $self->{index} - 1 ] && $self->{index} >= 1 ) {
          return $f[ --$self->{index} ];
      }
      else {
          ## no critic (Subroutines::ProhibitExplicitReturnUndef)
          $self->{index} = undef;
          return undef;
      }
  }
  
  sub reset_pointer {
      my $self = shift;
  
      $self->{index} = undef;
  
      return;
  }
  
  sub frames {
      my $self = shift;
  
      if (@_) {
          die
              "Devel::StackTrace->frames can only take Devel::StackTrace::Frame args\n"
              if grep { !$_->isa('Devel::StackTrace::Frame') } @_;
  
          $self->{frames} = \@_;
          delete $self->{raw};
      }
      else {
          $self->_make_frames if $self->{raw};
      }
  
      return @{ $self->{frames} };
  }
  
  sub frame {
      my $self = shift;
      my $i    = shift;
  
      return unless defined $i;
  
      return ( $self->frames )[$i];
  }
  
  sub frame_count {
      my $self = shift;
  
      return scalar( $self->frames );
  }
  
  sub message { $_[0]->{message} }
  
  sub as_string {
      my $self = shift;
      my $p    = shift;
  
      my @frames = $self->frames;
      if (@frames) {
          my $st    = q{};
          my $first = 1;
          for my $f (@frames) {
              $st .= $f->as_string( $first, $p ) . "\n";
              $first = 0;
          }
  
          return $st;
      }
  
      my $msg = $self->message;
      return $msg if defined $msg;
  
      return 'Trace begun';
  }
  
  {
      ## no critic (Modules::ProhibitMultiplePackages, ClassHierarchies::ProhibitExplicitISA)
      package    # hide from PAUSE
          Devel::StackTraceFrame;
  
      our @ISA = 'Devel::StackTrace::Frame';
  }
  
  1;
  
  # ABSTRACT: An object representing a stack trace
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Devel::StackTrace - An object representing a stack trace
  
  =head1 VERSION
  
  version 2.04
  
  =head1 SYNOPSIS
  
    use Devel::StackTrace;
  
    my $trace = Devel::StackTrace->new;
  
    print $trace->as_string; # like carp
  
    # from top (most recent) of stack to bottom.
    while ( my $frame = $trace->next_frame ) {
        print "Has args\n" if $frame->hasargs;
    }
  
    # from bottom (least recent) of stack to top.
    while ( my $frame = $trace->prev_frame ) {
        print "Sub: ", $frame->subroutine, "\n";
    }
  
  =head1 DESCRIPTION
  
  The C<Devel::StackTrace> module contains two classes, C<Devel::StackTrace> and
  L<Devel::StackTrace::Frame>. These objects encapsulate the information that
  can retrieved via Perl's C<caller> function, as well as providing a simple
  interface to this data.
  
  The C<Devel::StackTrace> object contains a set of C<Devel::StackTrace::Frame>
  objects, one for each level of the stack. The frames contain all the data
  available from C<caller>.
  
  This code was created to support my L<Exception::Class::Base> class (part of
  L<Exception::Class>) but may be useful in other contexts.
  
  =head1 'TOP' AND 'BOTTOM' OF THE STACK
  
  When describing the methods of the trace object, I use the words 'top' and
  'bottom'. In this context, the 'top' frame on the stack is the most recent
  frame and the 'bottom' is the least recent.
  
  Here's an example:
  
    foo();  # bottom frame is here
  
    sub foo {
       bar();
    }
  
    sub bar {
       Devel::StackTrace->new;  # top frame is here.
    }
  
  =head1 METHODS
  
  This class provide the following methods:
  
  =head2 Devel::StackTrace->new(%named_params)
  
  Returns a new Devel::StackTrace object.
  
  Takes the following parameters:
  
  =over 4
  
  =item * frame_filter => $sub
  
  By default, Devel::StackTrace will include all stack frames before the call to
  its constructor.
  
  However, you may want to filter out some frames with more granularity than
  'ignore_package' or 'ignore_class' allow.
  
  You can provide a subroutine which is called with the raw frame data for each
  frame. This is a hash reference with two keys, "caller", and "args", both of
  which are array references. The "caller" key is the raw data as returned by
  Perl's C<caller> function, and the "args" key are the subroutine arguments
  found in C<@DB::args>.
  
  The filter should return true if the frame should be included, or false if it
  should be skipped.
  
  =item * filter_frames_early => $boolean
  
  If this parameter is true, C<frame_filter> will be called as soon as the
  stacktrace is created, and before refs are stringified (if
  C<unsafe_ref_capture> is not set), rather than being filtered lazily when
  L<Devel::StackTrace::Frame> objects are first needed.
  
  This is useful if you want to filter based on the frame's arguments and want
  to be able to examine object properties, for example.
  
  =item * ignore_package => $package_name OR \@package_names
  
  Any frames where the package is one of these packages will not be on the
  stack.
  
  =item * ignore_class => $package_name OR \@package_names
  
  Any frames where the package is a subclass of one of these packages (or is the
  same package) will not be on the stack.
  
  Devel::StackTrace internally adds itself to the 'ignore_package' parameter,
  meaning that the Devel::StackTrace package is B<ALWAYS> ignored. However, if
  you create a subclass of Devel::StackTrace it will not be ignored.
  
  =item * skip_frames => $integer
  
  This will cause this number of stack frames to be excluded from top of the
  stack trace. This prevents the frames from being captured at all, and applies
  before the C<frame_filter>, C<ignore_package>, or C<ignore_class> options,
  even with C<filter_frames_early>.
  
  =item * unsafe_ref_capture => $boolean
  
  If this parameter is true, then Devel::StackTrace will store references
  internally when generating stacktrace frames.
  
  B<This option is very dangerous, and should never be used with exception
  objects>. Using this option will keep any objects or references alive past
  their normal lifetime, until the stack trace object goes out of scope. It can
  keep objects alive even after their C<DESTROY> sub is called, resulting it it
  being called multiple times on the same object.
  
  If not set, Devel::StackTrace replaces any references with their stringified
  representation.
  
  =item * no_args => $boolean
  
  If this parameter is true, then Devel::StackTrace will not store caller
  arguments in stack trace frames at all.
  
  =item * respect_overload => $boolean
  
  By default, Devel::StackTrace will call C<overload::AddrRef> to get the
  underlying string representation of an object, instead of respecting the
  object's stringification overloading. If you would prefer to see the
  overloaded representation of objects in stack traces, then set this parameter
  to true.
  
  =item * max_arg_length => $integer
  
  By default, Devel::StackTrace will display the entire argument for each
  subroutine call. Setting this parameter causes truncates each subroutine
  argument's string representation if it is longer than this number of
  characters.
  
  =item * message => $string
  
  By default, Devel::StackTrace will use 'Trace begun' as the message for the
  first stack frame when you call C<as_string>. You can supply an alternative
  message using this option.
  
  =item * indent => $boolean
  
  If this parameter is true, each stack frame after the first will start with a
  tab character, just like C<Carp::confess>.
  
  =back
  
  =head2 $trace->next_frame
  
  Returns the next L<Devel::StackTrace::Frame> object on the stack, going
  down. If this method hasn't been called before it returns the first frame. It
  returns C<undef> when it reaches the bottom of the stack and then resets its
  pointer so the next call to C<< $trace->next_frame >> or C<<
  $trace->prev_frame >> will work properly.
  
  =head2 $trace->prev_frame
  
  Returns the next L<Devel::StackTrace::Frame> object on the stack, going up. If
  this method hasn't been called before it returns the last frame. It returns
  undef when it reaches the top of the stack and then resets its pointer so the
  next call to C<< $trace->next_frame >> or C<< $trace->prev_frame >> will work
  properly.
  
  =head2 $trace->reset_pointer
  
  Resets the pointer so that the next call to C<< $trace->next_frame >> or C<<
  $trace->prev_frame >> will start at the top or bottom of the stack, as
  appropriate.
  
  =head2 $trace->frames
  
  When this method is called with no arguments, it returns a list of
  L<Devel::StackTrace::Frame> objects. They are returned in order from top (most
  recent) to bottom.
  
  This method can also be used to set the object's frames if you pass it a list
  of L<Devel::StackTrace::Frame> objects.
  
  This is useful if you want to filter the list of frames in ways that are more
  complex than can be handled by the C<< $trace->filter_frames >> method:
  
    $stacktrace->frames( my_filter( $stacktrace->frames ) );
  
  =head2 $trace->frame($index)
  
  Given an index, this method returns the relevant frame, or undef if there is
  no frame at that index. The index is exactly like a Perl array. The first
  frame is 0 and negative indexes are allowed.
  
  =head2 $trace->frame_count
  
  Returns the number of frames in the trace object.
  
  =head2 $trace->as_string(\%p)
  
  Calls C<< $frame->as_string >> on each frame from top to bottom, producing
  output quite similar to the Carp module's cluck/confess methods.
  
  The optional C<\%p> parameter only has one option. The C<max_arg_length>
  parameter truncates each subroutine argument's string representation if it is
  longer than this number of characters.
  
  If all the frames in a trace are skipped then this just returns the C<message>
  passed to the constructor or the string C<"Trace begun">.
  
  =head2 $trace->message
  
  Returns the message passed to the constructor. If this wasn't passed then this
  method returns C<undef>.
  
  =head1 SUPPORT
  
  Bugs may be submitted at L<https://github.com/houseabsolute/Devel-StackTrace/issues>.
  
  I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
  
  =head1 SOURCE
  
  The source code repository for Devel-StackTrace can be found at L<https://github.com/houseabsolute/Devel-StackTrace>.
  
  =head1 DONATIONS
  
  If you'd like to thank me for the work I've done on this module, please
  consider making a "donation" to me via PayPal. I spend a lot of free time
  creating free software, and would appreciate any support you'd care to offer.
  
  Please note that B<I am not suggesting that you must do this> in order for me
  to continue working on this particular software. I will continue to do so,
  inasmuch as I have in the past, for as long as it interests me.
  
  Similarly, a donation made in this way will probably not make me work on this
  software much more, unless I get so many donations that I can consider working
  on free software full time (let's all have a chuckle at that together).
  
  To donate, log into PayPal and send money to autarch@urth.org, or use the
  button at L<http://www.urth.org/~autarch/fs-donation.html>.
  
  =head1 AUTHOR
  
  Dave Rolsky <autarch@urth.org>
  
  =head1 CONTRIBUTORS
  
  =for stopwords Dagfinn Ilmari Mannsåker David Cantrell Graham Knop Ivan Bessarabov Mark Fowler Pali Ricardo Signes
  
  =over 4
  
  =item *
  
  Dagfinn Ilmari Mannsåker <ilmari@ilmari.org>
  
  =item *
  
  David Cantrell <david@cantrell.org.uk>
  
  =item *
  
  Graham Knop <haarg@haarg.org>
  
  =item *
  
  Ivan Bessarabov <ivan@bessarabov.ru>
  
  =item *
  
  Mark Fowler <mark@twoshortplanks.com>
  
  =item *
  
  Pali <pali@cpan.org>
  
  =item *
  
  Ricardo Signes <rjbs@cpan.org>
  
  =back
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is Copyright (c) 2000 - 2019 by David Rolsky.
  
  This is free software, licensed under:
  
    The Artistic License 2.0 (GPL Compatible)
  
  The full text of the license can be found in the
  F<LICENSE> file included with this distribution.
  
  =cut
DEVEL_STACKTRACE

    $main::fatpacked{"Devel/StackTrace/Frame.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DEVEL_STACKTRACE_FRAME';
  package Devel::StackTrace::Frame;
  
  use strict;
  use warnings;
  
  our $VERSION = '2.04';
  
  # Create accessor routines
  BEGIN {
      ## no critic (TestingAndDebugging::ProhibitNoStrict)
      no strict 'refs';
  
      my @attrs = qw(
          package
          filename
          line
          subroutine
          hasargs
          wantarray
          evaltext
          is_require
          hints
          bitmask
      );
  
      for my $attr (@attrs) {
          *{$attr} = sub { my $s = shift; return $s->{$attr} };
      }
  }
  
  {
      my @args = qw(
          package
          filename
          line
          subroutine
          hasargs
          wantarray
          evaltext
          is_require
          hints
          bitmask
      );
  
      sub new {
          my $proto = shift;
          my $class = ref $proto || $proto;
  
          my $self = bless {}, $class;
  
          @{$self}{@args} = @{ shift() };
          $self->{args}             = shift;
          $self->{respect_overload} = shift;
          $self->{max_arg_length}   = shift;
          $self->{message}          = shift;
          $self->{indent}           = shift;
  
          # fixup unix-style paths on win32
          $self->{filename} = File::Spec->canonpath( $self->{filename} );
  
          return $self;
      }
  }
  
  sub args {
      my $self = shift;
  
      return @{ $self->{args} };
  }
  
  sub as_string {
      my $self  = shift;
      my $first = shift;
      my $p     = shift;
  
      my $sub = $self->subroutine;
  
      # This code stolen straight from Carp.pm and then tweaked. All
      # errors are probably my fault  -dave
      if ($first) {
          $sub
              = defined $self->{message}
              ? $self->{message}
              : 'Trace begun';
      }
      else {
  
          # Build a string, $sub, which names the sub-routine called.
          # This may also be "require ...", "eval '...' or "eval {...}"
          if ( my $eval = $self->evaltext ) {
              if ( $self->is_require ) {
                  $sub = "require $eval";
              }
              else {
                  $eval =~ s/([\\\'])/\\$1/g;
                  $sub = "eval '$eval'";
              }
          }
          elsif ( $sub eq '(eval)' ) {
              $sub = 'eval {...}';
          }
  
          # if there are any arguments in the sub-routine call, format
          # them according to the format variables defined earlier in
          # this file and join them onto the $sub sub-routine string
          #
          # We copy them because they're going to be modified.
          #
          if ( my @a = $self->args ) {
              for (@a) {
  
                  # set args to the string "undef" if undefined
                  unless ( defined $_ ) {
                      $_ = 'undef';
                      next;
                  }
  
                  # hack!
                  ## no critic (Subroutines::ProtectPrivateSubs)
                  $_ = $self->Devel::StackTrace::_ref_to_string($_)
                      if ref $_;
                  ## use critic;
  
                  ## no critic (Variables::RequireInitializationForLocalVars)
                  local $SIG{__DIE__};
                  local $@;
                  ## use critic;
  
                  ## no critic (ErrorHandling::RequireCheckingReturnValueOfEval)
                  eval {
                      my $max_arg_length
                          = exists $p->{max_arg_length}
                          ? $p->{max_arg_length}
                          : $self->{max_arg_length};
  
                      if ( $max_arg_length
                          && length $_ > $max_arg_length ) {
                          ## no critic (BuiltinFunctions::ProhibitLvalueSubstr)
                          substr( $_, $max_arg_length ) = '...';
                      }
  
                      s/'/\\'/g;
  
                      # 'quote' arg unless it looks like a number
                      $_ = "'$_'" unless /^-?[\d.]+$/;
  
                      # print control/high ASCII chars as 'M-<char>' or '^<char>'
                      s/([\200-\377])/sprintf("M-%c",ord($1)&0177)/eg;
                      s/([\0-\37\177])/sprintf("^%c",ord($1)^64)/eg;
                  };
                  ## use critic
  
                  if ( my $e = $@ ) {
                      $_ = $e =~ /malformed utf-8/i ? '(bad utf-8)' : '?';
                  }
              }
  
              # append ('all', 'the', 'arguments') to the $sub string
              $sub .= '(' . join( ', ', @a ) . ')';
              $sub .= ' called';
          }
      }
  
      # If the user opted into indentation (a la Carp::confess), pre-add a tab
      my $tab = $self->{indent} && !$first ? "\t" : q{};
  
      return "${tab}$sub at " . $self->filename . ' line ' . $self->line;
  }
  
  1;
  
  # ABSTRACT: A single frame in a stack trace
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Devel::StackTrace::Frame - A single frame in a stack trace
  
  =head1 VERSION
  
  version 2.04
  
  =head1 DESCRIPTION
  
  See L<Devel::StackTrace> for details.
  
  =for Pod::Coverage new
  
  =head1 METHODS
  
  See Perl's C<caller> documentation for more information on what these
  methods return.
  
  =head2 $frame->package
  
  =head2 $frame->filename
  
  =head2 $frame->line
  
  =head2 $frame->subroutine
  
  =head2 $frame->hasargs
  
  =head2 $frame->wantarray
  
  =head2 $frame->evaltext
  
  Returns undef if the frame was not part of an eval.
  
  =head2 $frame->is_require
  
  Returns undef if the frame was not part of a require.
  
  =head2 $frame->args
  
  Returns the arguments passed to the frame. Note that any arguments that are
  references are returned as references, not copies.
  
  =head2 $frame->hints
  
  =head2 $frame->bitmask
  
  =head2 $frame->as_string
  
  Returns a string containing a description of the frame.
  
  =head1 SUPPORT
  
  Bugs may be submitted at L<https://github.com/houseabsolute/Devel-StackTrace/issues>.
  
  I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
  
  =head1 SOURCE
  
  The source code repository for Devel-StackTrace can be found at L<https://github.com/houseabsolute/Devel-StackTrace>.
  
  =head1 AUTHOR
  
  Dave Rolsky <autarch@urth.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is Copyright (c) 2000 - 2019 by David Rolsky.
  
  This is free software, licensed under:
  
    The Artistic License 2.0 (GPL Compatible)
  
  The full text of the license can be found in the
  F<LICENSE> file included with this distribution.
  
  =cut
DEVEL_STACKTRACE_FRAME

    $main::fatpacked{"Dist/CheckConflicts.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'DIST_CHECKCONFLICTS';
  package Dist::CheckConflicts;
  BEGIN {
    $Dist::CheckConflicts::AUTHORITY = 'cpan:DOY';
  }
  $Dist::CheckConflicts::VERSION = '0.11';
  use strict;
  use warnings;
  use 5.006;
  # ABSTRACT: declare version conflicts for your dist
  
  use base 'Exporter';
  our @EXPORT = our @EXPORT_OK = (
      qw(conflicts check_conflicts calculate_conflicts dist)
  );
  
  use Carp;
  use Module::Runtime 0.009 'module_notional_filename', 'require_module';
  
  
  my %CONFLICTS;
  my %HAS_CONFLICTS;
  my %DISTS;
  
  sub import {
      my $pkg = shift;
      my $for = caller;
  
      my ($conflicts, $alsos, $dist);
      ($conflicts, @_) = _strip_opt('-conflicts' => @_);
      ($alsos, @_)     = _strip_opt('-also' => @_);
      ($dist, @_)      = _strip_opt('-dist' => @_);
  
      my %conflicts = %{ $conflicts || {} };
      for my $also (@{ $alsos || [] }) {
          eval { require_module($also) } or next;
          if (!exists $CONFLICTS{$also}) {
              $also .= '::Conflicts';
              eval { require_module($also) } or next;
          }
          if (!exists $CONFLICTS{$also}) {
              next;
          }
          my %also_confs = $also->conflicts;
          for my $also_conf (keys %also_confs) {
              $conflicts{$also_conf} = $also_confs{$also_conf}
                  if !exists $conflicts{$also_conf}
                  || $conflicts{$also_conf} lt $also_confs{$also_conf};
          }
      }
  
      $CONFLICTS{$for} = \%conflicts;
      $DISTS{$for}     = $dist || $for;
  
      if (grep { $_ eq ':runtime' } @_) {
          for my $conflict (keys %conflicts) {
              $HAS_CONFLICTS{$conflict} ||= [];
              push @{ $HAS_CONFLICTS{$conflict} }, $for;
          }
  
          # warn for already loaded things...
          for my $conflict (keys %conflicts) {
              if (exists $INC{module_notional_filename($conflict)}) {
                  _check_version([$for], $conflict);
              }
          }
  
          # and warn for subsequently loaded things...
          @INC = grep {
              !(ref($_) eq 'ARRAY' && @$_ > 1 && $_->[1] == \%CONFLICTS)
          } @INC;
          unshift @INC, [
              sub {
                  my ($sub, $file) = @_;
  
                  (my $mod = $file) =~ s{\.pm$}{};
                  $mod =~ s{/}{::}g;
                  return unless $mod =~ /[\w:]+/;
  
                  return unless defined $HAS_CONFLICTS{$mod};
  
                  {
                      local $HAS_CONFLICTS{$mod};
                      require $file;
                  }
  
                  _check_version($HAS_CONFLICTS{$mod}, $mod);
  
                  # the previous require already handled it
                  my $called;
                  return sub {
                      return 0 if $called;
                      $_ = "1;";
                      $called = 1;
                      return 1;
                  };
              },
              \%CONFLICTS, # arbitrary but unique, see above
          ];
      }
  
      $pkg->export_to_level(1, @_);
  }
  
  sub _strip_opt {
      my ($opt, @args) = @_;
  
      my $val;
      for my $idx ( 0 .. $#args - 1 ) {
          if (defined $args[$idx] && $args[$idx] eq $opt) {
              $val = (splice @args, $idx, 2)[1];
              last;
          }
      }
  
      return ( $val, @args );
  }
  
  sub _check_version {
      my ($fors, $mod) = @_;
  
      for my $for (@$fors) {
          my $conflict_ver = $CONFLICTS{$for}{$mod};
          my $version = do {
              no strict 'refs';
              ${ ${ $mod . '::' }{VERSION} };
          };
  
          if ($version le $conflict_ver) {
              warn <<EOF;
  Conflict detected for $DISTS{$for}:
    $mod is version $version, but must be greater than version $conflict_ver
  EOF
              return;
          }
      }
  }
  
  
  sub conflicts {
      my $package = shift;
      return %{ $CONFLICTS{ $package } };
  }
  
  
  sub dist {
      my $package = shift;
      return $DISTS{ $package };
  }
  
  
  sub check_conflicts {
      my $package = shift;
      my $dist = $package->dist;
      my @conflicts = $package->calculate_conflicts;
      return unless @conflicts;
  
      my $err = "Conflicts detected for $dist:\n";
      for my $conflict (@conflicts) {
          $err .= "  $conflict->{package} is version "
                  . "$conflict->{installed}, but must be greater than version "
                  . "$conflict->{required}\n";
      }
      die $err;
  }
  
  
  sub calculate_conflicts {
      my $package = shift;
      my %conflicts = $package->conflicts;
  
      my @ret;
  
  
      CONFLICT:
      for my $conflict (keys %conflicts) {
          my $success = do {
              local $SIG{__WARN__} = sub {};
              eval { require_module($conflict) };
          };
          my $error = $@;
          my $file = module_notional_filename($conflict);
          next if not $success and $error =~ /Can't locate \Q$file\E in \@INC/;
  
          warn "Warning: $conflict did not compile" if not $success;
          my $installed = $success ? $conflict->VERSION : 'unknown';
          push @ret, {
              package   => $conflict,
              installed => $installed,
              required  => $conflicts{$conflict},
          } if not $success or $installed le $conflicts{$conflict};
      }
  
      return sort { $a->{package} cmp $b->{package} } @ret;
  }
  
  
  1;
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Dist::CheckConflicts - declare version conflicts for your dist
  
  =head1 VERSION
  
  version 0.11
  
  =head1 SYNOPSIS
  
      use Dist::CheckConflicts
          -dist => 'Class-MOP',
          -conflicts => {
              'Moose'                => '1.14',
              'namespace::autoclean' => '0.08',
          },
          -also => [
              'Package::Stash::Conflicts',
          ];
  
      __PACKAGE__->check_conflicts;
  
  =head1 DESCRIPTION
  
  One shortcoming of the CPAN clients that currently exist is that they have no
  way of specifying conflicting downstream dependencies of modules. This module
  attempts to work around this issue by allowing you to specify conflicting
  versions of modules separately, and deal with them after the module is done
  installing.
  
  For instance, say you have a module C<Foo>, and some other module C<Bar> uses
  C<Foo>. If C<Foo> were to change its API in a non-backwards-compatible way,
  this would cause C<Bar> to break until it is updated to use the new API. C<Foo>
  can't just depend on the fixed version of C<Bar>, because this will cause a
  circular dependency (because C<Bar> is already depending on C<Foo>), and this
  doesn't express intent properly anyway - C<Foo> doesn't use C<Bar> at all. The
  ideal solution would be for there to be a way to specify conflicting versions
  of modules in a way that would let CPAN clients update conflicting modules
  automatically after an existing module is upgraded, but until that happens,
  this module will allow users to do this manually.
  
  This module accepts a hash of options passed to its C<use> statement, with
  these keys being valid:
  
  =over 4
  
  =item -conflicts
  
  A hashref of conflict specifications, where keys are module names, and values
  are the last broken version - any version greater than the specified version
  should work.
  
  =item -also
  
  Additional modules to get conflicts from (potentially recursively). This should
  generally be a list of modules which use Dist::CheckConflicts, which correspond
  to the dists that your dist depends on. (In an ideal world, this would be
  intuited directly from your dependency list, but the dependency list isn't
  available outside of build time).
  
  =item -dist
  
  The name of the distribution, to make the error message from check_conflicts
  more user-friendly.
  
  =back
  
  The methods listed below are exported by this module into the module that uses
  it, so you should call these methods on your module, not Dist::CheckConflicts.
  
  As an example, this command line can be used to update your modules, after
  installing the C<Foo> dist (assuming that C<Foo::Conflicts> is the module in
  the C<Foo> dist which uses Dist::CheckConflicts):
  
      perl -MFoo::Conflicts -e'print "$_\n"
          for map { $_->{package} } Foo::Conflicts->calculate_conflicts' | cpanm
  
  As an added bonus, loading your conflicts module will provide warnings at
  runtime if conflicting modules are detected (regardless of whether they are
  loaded before or afterwards).
  
  =head1 METHODS
  
  =head2 conflicts
  
  Returns the conflict specification (the C<-conflicts> parameter to
  C<import()>), as a hash.
  
  =head2 dist
  
  Returns the dist name (either as specified by the C<-dist> parameter to
  C<import()>, or the package name which C<use>d this module).
  
  =head2 check_conflicts
  
  Examine the modules that are currently installed, and throw an exception with
  useful information if any modules are at versions which conflict with the dist.
  
  =head2 calculate_conflicts
  
  Examine the modules that are currently installed, and return a list of modules
  which conflict with the dist. The modules will be returned as a list of
  hashrefs, each containing C<package>, C<installed>, and C<required> keys.
  
  =head1 BUGS
  
  No known bugs.
  
  Please report any bugs to GitHub Issues at
  L<https://github.com/doy/dist-checkconflicts/issues>.
  
  =head1 SEE ALSO
  
  L<Module::Install::CheckConflicts>
  
  L<Dist::Zilla::Plugin::Conflicts>
  
  =head1 SUPPORT
  
  You can find this documentation for this module with the perldoc command.
  
      perldoc Dist::CheckConflicts
  
  You can also look for information at:
  
  =over 4
  
  =item * MetaCPAN
  
  L<https://metacpan.org/release/Dist-CheckConflicts>
  
  =item * Github
  
  L<https://github.com/doy/dist-checkconflicts>
  
  =item * RT: CPAN's request tracker
  
  L<http://rt.cpan.org/NoAuth/Bugs.html?Dist=Dist-CheckConflicts>
  
  =item * CPAN Ratings
  
  L<http://cpanratings.perl.org/d/Dist-CheckConflicts>
  
  =back
  
  =head1 AUTHOR
  
  Jesse Luehrs <doy@tozt.net>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2014 by Jesse Luehrs.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
DIST_CHECKCONFLICTS

    $main::fatpacked{"Encode/Locale.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'ENCODE_LOCALE';
  package Encode::Locale;
  
  use strict;
  our $VERSION = "1.05";
  
  use base 'Exporter';
  our @EXPORT_OK = qw(
      decode_argv env
      $ENCODING_LOCALE $ENCODING_LOCALE_FS
      $ENCODING_CONSOLE_IN $ENCODING_CONSOLE_OUT
  );
  
  use Encode ();
  use Encode::Alias ();
  
  our $ENCODING_LOCALE;
  our $ENCODING_LOCALE_FS;
  our $ENCODING_CONSOLE_IN;
  our $ENCODING_CONSOLE_OUT;
  
  sub DEBUG () { 0 }
  
  sub _init {
      if ($^O eq "MSWin32") {
  	unless ($ENCODING_LOCALE) {
  	    # Try to obtain what the Windows ANSI code page is
  	    eval {
  		unless (defined &GetACP) {
  		    require Win32;
                      eval { Win32::GetACP() };
  		    *GetACP = sub { &Win32::GetACP } unless $@;
  		}
  		unless (defined &GetACP) {
  		    require Win32::API;
  		    Win32::API->Import('kernel32', 'int GetACP()');
  		}
  		if (defined &GetACP) {
  		    my $cp = GetACP();
  		    $ENCODING_LOCALE = "cp$cp" if $cp;
  		}
  	    };
  	}
  
  	unless ($ENCODING_CONSOLE_IN) {
              # only test one since set together
              unless (defined &GetInputCP) {
                  eval {
                      require Win32;
                      eval { Win32::GetConsoleCP() };
                      # manually "import" it since Win32->import refuses
                      *GetInputCP = sub { &Win32::GetConsoleCP } unless $@;
                      *GetOutputCP = sub { &Win32::GetConsoleOutputCP } unless $@;
                  };
                  unless (defined &GetInputCP) {
                      eval {
                          # try Win32::Console module for codepage to use
                          require Win32::Console;
                          eval { Win32::Console::InputCP() };
                          *GetInputCP = sub { &Win32::Console::InputCP }
                              unless $@;
                          *GetOutputCP = sub { &Win32::Console::OutputCP }
                              unless $@;
                      };
                  }
                  unless (defined &GetInputCP) {
                      # final fallback
                      *GetInputCP = *GetOutputCP = sub {
                          # another fallback that could work is:
                          # reg query HKLM\System\CurrentControlSet\Control\Nls\CodePage /v ACP
                          ((qx(chcp) || '') =~ /^Active code page: (\d+)/)
                              ? $1 : ();
                      };
                  }
  	    }
              my $cp = GetInputCP();
              $ENCODING_CONSOLE_IN = "cp$cp" if $cp;
              $cp = GetOutputCP();
              $ENCODING_CONSOLE_OUT = "cp$cp" if $cp;
  	}
      }
  
      unless ($ENCODING_LOCALE) {
  	eval {
  	    require I18N::Langinfo;
  	    $ENCODING_LOCALE = I18N::Langinfo::langinfo(I18N::Langinfo::CODESET());
  
  	    # Workaround of Encode < v2.25.  The "646" encoding  alias was
  	    # introduced in Encode-2.25, but we don't want to require that version
  	    # quite yet.  Should avoid the CPAN testers failure reported from
  	    # openbsd-4.7/perl-5.10.0 combo.
  	    $ENCODING_LOCALE = "ascii" if $ENCODING_LOCALE eq "646";
  
  	    # https://rt.cpan.org/Ticket/Display.html?id=66373
  	    $ENCODING_LOCALE = "hp-roman8" if $^O eq "hpux" && $ENCODING_LOCALE eq "roman8";
  	};
  	$ENCODING_LOCALE ||= $ENCODING_CONSOLE_IN;
      }
  
      if ($^O eq "darwin") {
  	$ENCODING_LOCALE_FS ||= "UTF-8";
      }
  
      # final fallback
      $ENCODING_LOCALE ||= $^O eq "MSWin32" ? "cp1252" : "UTF-8";
      $ENCODING_LOCALE_FS ||= $ENCODING_LOCALE;
      $ENCODING_CONSOLE_IN ||= $ENCODING_LOCALE;
      $ENCODING_CONSOLE_OUT ||= $ENCODING_CONSOLE_IN;
  
      unless (Encode::find_encoding($ENCODING_LOCALE)) {
  	my $foundit;
  	if (lc($ENCODING_LOCALE) eq "gb18030") {
  	    eval {
  		require Encode::HanExtra;
  	    };
  	    if ($@) {
  		die "Need Encode::HanExtra to be installed to support locale codeset ($ENCODING_LOCALE), stopped";
  	    }
  	    $foundit++ if Encode::find_encoding($ENCODING_LOCALE);
  	}
  	die "The locale codeset ($ENCODING_LOCALE) isn't one that perl can decode, stopped"
  	    unless $foundit;
  
      }
  
      # use Data::Dump; ddx $ENCODING_LOCALE, $ENCODING_LOCALE_FS, $ENCODING_CONSOLE_IN, $ENCODING_CONSOLE_OUT;
  }
  
  _init();
  Encode::Alias::define_alias(sub {
      no strict 'refs';
      no warnings 'once';
      return ${"ENCODING_" . uc(shift)};
  }, "locale");
  
  sub _flush_aliases {
      no strict 'refs';
      for my $a (keys %Encode::Alias::Alias) {
  	if (defined ${"ENCODING_" . uc($a)}) {
  	    delete $Encode::Alias::Alias{$a};
  	    warn "Flushed alias cache for $a" if DEBUG;
  	}
      }
  }
  
  sub reinit {
      $ENCODING_LOCALE = shift;
      $ENCODING_LOCALE_FS = shift;
      $ENCODING_CONSOLE_IN = $ENCODING_LOCALE;
      $ENCODING_CONSOLE_OUT = $ENCODING_LOCALE;
      _init();
      _flush_aliases();
  }
  
  sub decode_argv {
      die if defined wantarray;
      for (@ARGV) {
  	$_ = Encode::decode(locale => $_, @_);
      }
  }
  
  sub env {
      my $k = Encode::encode(locale => shift);
      my $old = $ENV{$k};
      if (@_) {
  	my $v = shift;
  	if (defined $v) {
  	    $ENV{$k} = Encode::encode(locale => $v);
  	}
  	else {
  	    delete $ENV{$k};
  	}
      }
      return Encode::decode(locale => $old) if defined wantarray;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Encode::Locale - Determine the locale encoding
  
  =head1 SYNOPSIS
  
    use Encode::Locale;
    use Encode;
  
    $string = decode(locale => $bytes);
    $bytes = encode(locale => $string);
  
    if (-t) {
        binmode(STDIN, ":encoding(console_in)");
        binmode(STDOUT, ":encoding(console_out)");
        binmode(STDERR, ":encoding(console_out)");
    }
  
    # Processing file names passed in as arguments
    my $uni_filename = decode(locale => $ARGV[0]);
    open(my $fh, "<", encode(locale_fs => $uni_filename))
       || die "Can't open '$uni_filename': $!";
    binmode($fh, ":encoding(locale)");
    ...
  
  =head1 DESCRIPTION
  
  In many applications it's wise to let Perl use Unicode for the strings it
  processes.  Most of the interfaces Perl has to the outside world are still byte
  based.  Programs therefore need to decode byte strings that enter the program
  from the outside and encode them again on the way out.
  
  The POSIX locale system is used to specify both the language conventions
  requested by the user and the preferred character set to consume and
  output.  The C<Encode::Locale> module looks up the charset and encoding (called
  a CODESET in the locale jargon) and arranges for the L<Encode> module to know
  this encoding under the name "locale".  It means bytes obtained from the
  environment can be converted to Unicode strings by calling C<<
  Encode::encode(locale => $bytes) >> and converted back again with C<<
  Encode::decode(locale => $string) >>.
  
  Where file systems interfaces pass file names in and out of the program we also
  need care.  The trend is for operating systems to use a fixed file encoding
  that don't actually depend on the locale; and this module determines the most
  appropriate encoding for file names. The L<Encode> module will know this
  encoding under the name "locale_fs".  For traditional Unix systems this will
  be an alias to the same encoding as "locale".
  
  For programs running in a terminal window (called a "Console" on some systems)
  the "locale" encoding is usually a good choice for what to expect as input and
  output.  Some systems allows us to query the encoding set for the terminal and
  C<Encode::Locale> will do that if available and make these encodings known
  under the C<Encode> aliases "console_in" and "console_out".  For systems where
  we can't determine the terminal encoding these will be aliased as the same
  encoding as "locale".  The advice is to use "console_in" for input known to
  come from the terminal and "console_out" for output to the terminal.
  
  In addition to arranging for various Encode aliases the following functions and
  variables are provided:
  
  =over
  
  =item decode_argv( )
  
  =item decode_argv( Encode::FB_CROAK )
  
  This will decode the command line arguments to perl (the C<@ARGV> array) in-place.
  
  The function will by default replace characters that can't be decoded by
  "\x{FFFD}", the Unicode replacement character.
  
  Any argument provided is passed as CHECK to underlying Encode::decode() call.
  Pass the value C<Encode::FB_CROAK> to have the decoding croak if not all the
  command line arguments can be decoded.  See L<Encode/"Handling Malformed Data">
  for details on other options for CHECK.
  
  =item env( $uni_key )
  
  =item env( $uni_key => $uni_value )
  
  Interface to get/set environment variables.  Returns the current value as a
  Unicode string. The $uni_key and $uni_value arguments are expected to be
  Unicode strings as well.  Passing C<undef> as $uni_value deletes the
  environment variable named $uni_key.
  
  The returned value will have the characters that can't be decoded replaced by
  "\x{FFFD}", the Unicode replacement character.
  
  There is no interface to request alternative CHECK behavior as for
  decode_argv().  If you need that you need to call encode/decode yourself.
  For example:
  
      my $key = Encode::encode(locale => $uni_key, Encode::FB_CROAK);
      my $uni_value = Encode::decode(locale => $ENV{$key}, Encode::FB_CROAK);
  
  =item reinit( )
  
  =item reinit( $encoding )
  
  Reinitialize the encodings from the locale.  You want to call this function if
  you changed anything in the environment that might influence the locale.
  
  This function will croak if the determined encoding isn't recognized by
  the Encode module.
  
  With argument force $ENCODING_... variables to set to the given value.
  
  =item $ENCODING_LOCALE
  
  The encoding name determined to be suitable for the current locale.
  L<Encode> know this encoding as "locale".
  
  =item $ENCODING_LOCALE_FS
  
  The encoding name determined to be suitable for file system interfaces
  involving file names.
  L<Encode> know this encoding as "locale_fs".
  
  =item $ENCODING_CONSOLE_IN
  
  =item $ENCODING_CONSOLE_OUT
  
  The encodings to be used for reading and writing output to the a console.
  L<Encode> know these encodings as "console_in" and "console_out".
  
  =back
  
  =head1 NOTES
  
  This table summarizes the mapping of the encodings set up
  by the C<Encode::Locale> module:
  
    Encode      |         |              |
    Alias       | Windows | Mac OS X     | POSIX
    ------------+---------+--------------+------------
    locale      | ANSI    | nl_langinfo  | nl_langinfo
    locale_fs   | ANSI    | UTF-8        | nl_langinfo
    console_in  | OEM     | nl_langinfo  | nl_langinfo
    console_out | OEM     | nl_langinfo  | nl_langinfo
  
  =head2 Windows
  
  Windows has basically 2 sets of APIs.  A wide API (based on passing UTF-16
  strings) and a byte based API based a character set called ANSI.  The
  regular Perl interfaces to the OS currently only uses the ANSI APIs.
  Unfortunately ANSI is not a single character set.
  
  The encoding that corresponds to ANSI varies between different editions of
  Windows.  For many western editions of Windows ANSI corresponds to CP-1252
  which is a character set similar to ISO-8859-1.  Conceptually the ANSI
  character set is a similar concept to the POSIX locale CODESET so this module
  figures out what the ANSI code page is and make this available as
  $ENCODING_LOCALE and the "locale" Encoding alias.
  
  Windows systems also operate with another byte based character set.
  It's called the OEM code page.  This is the encoding that the Console
  takes as input and output.  It's common for the OEM code page to
  differ from the ANSI code page.
  
  =head2 Mac OS X
  
  On Mac OS X the file system encoding is always UTF-8 while the locale
  can otherwise be set up as normal for POSIX systems.
  
  File names on Mac OS X will at the OS-level be converted to
  NFD-form.  A file created by passing a NFC-filename will come
  in NFD-form from readdir().  See L<Unicode::Normalize> for details
  of NFD/NFC.
  
  Actually, Apple does not follow the Unicode NFD standard since not all
  character ranges are decomposed.  The claim is that this avoids problems with
  round trip conversions from old Mac text encodings.  See L<Encode::UTF8Mac> for
  details.
  
  =head2 POSIX (Linux and other Unixes)
  
  File systems might vary in what encoding is to be used for
  filenames.  Since this module has no way to actually figure out
  what the is correct it goes with the best guess which is to
  assume filenames are encoding according to the current locale.
  Users are advised to always specify UTF-8 as the locale charset.
  
  =head1 SEE ALSO
  
  L<I18N::Langinfo>, L<Encode>, L<Term::Encoding>
  
  =head1 AUTHOR
  
  Copyright 2010 Gisle Aas <gisle@aas.no>.
  
  This library is free software; you can redistribute it and/or
  modify it under the same terms as Perl itself.
  
  =cut
ENCODE_LOCALE

    $main::fatpacked{"Eval/Closure.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'EVAL_CLOSURE';
  package Eval::Closure;
  BEGIN {
    $Eval::Closure::AUTHORITY = 'cpan:DOY';
  }
  $Eval::Closure::VERSION = '0.14';
  use strict;
  use warnings;
  # ABSTRACT: safely and cleanly create closures via string eval
  
  use Exporter 'import';
  @Eval::Closure::EXPORT = @Eval::Closure::EXPORT_OK = 'eval_closure';
  
  use Carp;
  use overload ();
  use Scalar::Util qw(reftype);
  
  use constant HAS_LEXICAL_SUBS => $] >= 5.018;
  
  
  
  sub eval_closure {
      my (%args) = @_;
  
      # default to copying environment
      $args{alias} = 0 if !exists $args{alias};
  
      $args{source} = _canonicalize_source($args{source});
      _validate_env($args{environment} ||= {});
  
      $args{source} = _line_directive(@args{qw(line description)})
                    . $args{source}
          if defined $args{description} && !($^P & 0x10);
  
      my ($code, $e) = _clean_eval_closure(@args{qw(source environment alias)});
  
      if (!$code) {
          if ($args{terse_error}) {
              die "$e\n";
          }
          else {
              croak("Failed to compile source: $e\n\nsource:\n$args{source}")
          }
      }
  
      return $code;
  }
  
  sub _canonicalize_source {
      my ($source) = @_;
  
      if (defined($source)) {
          if (ref($source)) {
              if (reftype($source) eq 'ARRAY'
               || overload::Method($source, '@{}')) {
                  return join "\n", @$source;
              }
              elsif (overload::Method($source, '""')) {
                  return "$source";
              }
              else {
                  croak("The 'source' parameter to eval_closure must be a "
                      . "string or array reference");
              }
          }
          else {
              return $source;
          }
      }
      else {
          croak("The 'source' parameter to eval_closure is required");
      }
  }
  
  sub _validate_env {
      my ($env) = @_;
  
      croak("The 'environment' parameter must be a hashref")
          unless reftype($env) eq 'HASH';
  
      for my $var (keys %$env) {
          if (HAS_LEXICAL_SUBS) {
              croak("Environment key '$var' should start with \@, \%, \$, or \&")
                  if index('$@%&', substr($var, 0, 1)) < 0;
          }
          else {
              croak("Environment key '$var' should start with \@, \%, or \$")
                  if index('$@%', substr($var, 0, 1)) < 0;
          }
          croak("Environment values must be references, not $env->{$var}")
              unless ref($env->{$var});
      }
  }
  
  sub _line_directive {
      my ($line, $description) = @_;
  
      $line = 1 unless defined($line);
  
      return qq{#line $line "$description"\n};
  }
  
  sub _clean_eval_closure {
      my ($source, $captures, $alias) = @_;
  
      my @capture_keys = keys %$captures;
  
      if ($ENV{EVAL_CLOSURE_PRINT_SOURCE}) {
          _dump_source(_make_compiler_source($source, $alias, @capture_keys));
      }
  
      my ($compiler, $e) = _make_compiler($source, $alias, @capture_keys);
      return (undef, $e) unless defined $compiler;
  
      my $code = $compiler->(@$captures{@capture_keys});
  
      if (!defined $code) {
          return (
              undef,
              "The 'source' parameter must return a subroutine reference, "
              . "not undef"
          )
      }
      if (!ref($code) || ref($code) ne 'CODE') {
          return (
              undef,
              "The 'source' parameter must return a subroutine reference, not "
              . ref($code)
          )
      }
  
      if ($alias) {
          require Devel::LexAlias;
          Devel::LexAlias::lexalias($code, $_, $captures->{$_})
              for grep substr($_, 0, 1) ne '&', @capture_keys;
      }
  
      return ($code, $e);
  }
  
  sub _make_compiler {
      my $source = _make_compiler_source(@_);
  
      _clean_eval($source)
  }
  
  sub _clean_eval {
      local $@;
      local $SIG{__DIE__};
      my $compiler = eval $_[0];
      my $e = $@;
      ( $compiler, $e )
  }
  
  $Eval::Closure::SANDBOX_ID = 0;
  
  sub _make_compiler_source {
      my ($source, $alias, @capture_keys) = @_;
      $Eval::Closure::SANDBOX_ID++;
      my $i = 0;
      return join "\n", (
          "package Eval::Closure::Sandbox_$Eval::Closure::SANDBOX_ID;",
          'sub {',
              (map { _make_lexical_assignment($_, $i++, $alias) } @capture_keys),
              $source,
          '}',
      );
  }
  
  sub _make_lexical_assignment {
      my ($key, $index, $alias) = @_;
      my $sigil = substr($key, 0, 1);
      my $name = substr($key, 1);
      if (HAS_LEXICAL_SUBS && $sigil eq '&') {
          my $tmpname = '$__' . $name . '__' . $index;
          return 'use feature "lexical_subs"; '
               . 'no warnings "experimental::lexical_subs"; '
               . 'my ' . $tmpname . ' = $_[' . $index . ']; '
               . 'my sub ' . $name . ' { goto ' . $tmpname . ' }';
      }
      if ($alias) {
          return 'my ' . $key . ';';
      }
      else {
          return 'my ' . $key . ' = ' . $sigil . '{$_[' . $index . ']};';
      }
  }
  
  sub _dump_source {
      my ($source) = @_;
  
      my $output;
      local $@;
      if (eval { require Perl::Tidy; 1 }) {
          Perl::Tidy::perltidy(
              source      => \$source,
              destination => \$output,
              argv        => [],
          );
      }
      else {
          $output = $source;
      }
  
      warn "$output\n";
  }
  
  
  1;
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Eval::Closure - safely and cleanly create closures via string eval
  
  =head1 VERSION
  
  version 0.14
  
  =head1 SYNOPSIS
  
    use Eval::Closure;
  
    my $code = eval_closure(
        source      => 'sub { $foo++ }',
        environment => {
            '$foo' => \1,
        },
    );
  
    warn $code->(); # 1
    warn $code->(); # 2
  
    my $code2 = eval_closure(
        source => 'sub { $code->() }',
    ); # dies, $code isn't in scope
  
  =head1 DESCRIPTION
  
  String eval is often used for dynamic code generation. For instance, C<Moose>
  uses it heavily, to generate inlined versions of accessors and constructors,
  which speeds code up at runtime by a significant amount. String eval is not
  without its issues however - it's difficult to control the scope it's used in
  (which determines which variables are in scope inside the eval), and it's easy
  to miss compilation errors, since eval catches them and sticks them in $@
  instead.
  
  This module attempts to solve these problems. It provides an C<eval_closure>
  function, which evals a string in a clean environment, other than a fixed list
  of specified variables. Compilation errors are rethrown automatically.
  
  =head1 FUNCTIONS
  
  =head2 eval_closure(%args)
  
  This function provides the main functionality of this module. It is exported by
  default. It takes a hash of parameters, with these keys being valid:
  
  =over 4
  
  =item source
  
  The string to be evaled. It should end by returning a code reference. It can
  access any variable declared in the C<environment> parameter (and only those
  variables). It can be either a string, or an arrayref of lines (which will be
  joined with newlines to produce the string).
  
  =item environment
  
  The environment to provide to the eval. This should be a hashref, mapping
  variable names (including sigils) to references of the appropriate type. For
  instance, a valid value for environment would be C<< { '@foo' => [] } >> (which
  would allow the generated function to use an array named C<@foo>). Generally,
  this is used to allow the generated function to access externally defined
  variables (so you would pass in a reference to a variable that already exists).
  
  In perl 5.18 and greater, the environment hash can contain variables with a
  sigil of C<&>. This will create a lexical sub in the evaluated code (see
  L<feature/The 'lexical_subs' feature>). Using a C<&> sigil on perl versions
  before lexical subs were available will throw an error.
  
  =item alias
  
  If set to true, the coderef returned closes over the variables referenced in
  the environment hashref. (This feature requires L<Devel::LexAlias>.) If set to
  false, the coderef closes over a I<< shallow copy >> of the variables.
  
  If this argument is omitted, Eval::Closure will currently assume false, but
  this assumption may change in a future version.
  
  =item description
  
  This lets you provide a bit more information in backtraces. Normally, when a
  function that was generated through string eval is called, that stack frame
  will show up as "(eval n)", where 'n' is a sequential identifier for every
  string eval that has happened so far in the program. Passing a C<description>
  parameter lets you override that to something more useful (for instance,
  L<Moose> overrides the description for accessors to something like "accessor
  foo at MyClass.pm, line 123").
  
  =item line
  
  This lets you override the particular line number that appears in backtraces,
  much like the C<description> option. The default is 1.
  
  =item terse_error
  
  Normally, this function appends the source code that failed to compile, and
  prepends some explanatory text. Setting this option to true suppresses that
  behavior so you get only the compilation error that Perl actually reported.
  
  =back
  
  =head1 BUGS
  
  No known bugs.
  
  Please report any bugs to GitHub Issues at
  L<https://github.com/doy/eval-closure/issues>.
  
  =head1 SEE ALSO
  
  =over 4
  
  =item * L<Class::MOP::Method::Accessor>
  
  This module is a factoring out of code that used to live here
  
  =back
  
  =head1 SUPPORT
  
  You can find this documentation for this module with the perldoc command.
  
      perldoc Eval::Closure
  
  You can also look for information at:
  
  =over 4
  
  =item * MetaCPAN
  
  L<https://metacpan.org/release/Eval-Closure>
  
  =item * Github
  
  L<https://github.com/doy/eval-closure>
  
  =item * RT: CPAN's request tracker
  
  L<http://rt.cpan.org/NoAuth/Bugs.html?Dist=Eval-Closure>
  
  =item * CPAN Ratings
  
  L<http://cpanratings.perl.org/d/Eval-Closure>
  
  =back
  
  =head1 NOTES
  
  Based on code from L<Class::MOP::Method::Accessor>, by Stevan Little and the
  Moose Cabal.
  
  =head1 AUTHOR
  
  Jesse Luehrs <doy@tozt.net>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2016 by Jesse Luehrs.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
EVAL_CLOSURE

    $main::fatpacked{"Exception/Class.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'EXCEPTION_CLASS';
  package Exception::Class;
  
  use 5.008001;
  
  use strict;
  use warnings;
  
  our $VERSION = '1.44';
  
  use Exception::Class::Base;
  use Scalar::Util qw( blessed reftype );
  
  our $BASE_EXC_CLASS;
  BEGIN { $BASE_EXC_CLASS ||= 'Exception::Class::Base'; }
  
  our %CLASSES;
  
  sub import {
      my $class = shift;
  
      ## no critic (Variables::ProhibitPackageVars)
      local $Exception::Class::Caller = caller();
  
      my %c;
  
      my %needs_parent;
      while ( my $subclass = shift ) {
          my $def = ref $_[0] ? shift : {};
          $def->{isa}
              = $def->{isa}
              ? ( ref $def->{isa} ? $def->{isa} : [ $def->{isa} ] )
              : [];
  
          $c{$subclass} = $def;
      }
  
      # We need to sort by length because if we check for keys in the
      # Foo::Bar:: stash, this creates a "Bar::" key in the Foo:: stash!
  MAKE_CLASSES:
      foreach my $subclass ( sort { length $a <=> length $b } keys %c ) {
          my $def = $c{$subclass};
  
          # We already made this one.
          next if $CLASSES{$subclass};
  
          {
              ## no critic (TestingAndDebugging::ProhibitNoStrict)
              no strict 'refs';
              foreach my $parent ( @{ $def->{isa} } ) {
                  unless ( keys %{"$parent\::"} ) {
                      $needs_parent{$subclass} = {
                          parents => $def->{isa},
                          def     => $def
                      };
                      next MAKE_CLASSES;
                  }
              }
          }
  
          $class->_make_subclass(
              subclass => $subclass,
              def      => $def || {},
          );
      }
  
      foreach my $subclass ( keys %needs_parent ) {
  
          # This will be used to spot circular references.
          my %seen;
          $class->_make_parents( \%needs_parent, $subclass, \%seen );
      }
  }
  
  sub _make_parents {
      my $class    = shift;
      my $needs    = shift;
      my $subclass = shift;
      my $seen     = shift;
      my $child    = shift;    # Just for error messages.
  
      ## no critic (TestingAndDebugging::ProhibitNoStrict, TestingAndDebugging::ProhibitProlongedStrictureOverride)
      no strict 'refs';
  
      # What if someone makes a typo in specifying their 'isa' param?
      # This should catch it. Either it's been made because it didn't
      # have missing parents OR it's in our hash as needing a parent.
      # If neither of these is true then the _only_ place it is
      # mentioned is in the 'isa' param for some other class, which is
      # not a good enough reason to make a new class.
      die
          "Class $subclass appears to be a typo as it is only specified in the 'isa' param for $child\n"
          unless exists $needs->{$subclass}
          || $CLASSES{$subclass}
          || keys %{"$subclass\::"};
  
      foreach my $c ( @{ $needs->{$subclass}{parents} } ) {
  
          # It's been made
          next if $CLASSES{$c} || keys %{"$c\::"};
  
          die "There appears to be some circularity involving $subclass\n"
              if $seen->{$subclass};
  
          $seen->{$subclass} = 1;
  
          $class->_make_parents( $needs, $c, $seen, $subclass );
      }
  
      return if $CLASSES{$subclass} || keys %{"$subclass\::"};
  
      $class->_make_subclass(
          subclass => $subclass,
          def      => $needs->{$subclass}{def}
      );
  }
  
  sub _make_subclass {
      my $class = shift;
      my %p     = @_;
  
      my $subclass = $p{subclass};
      my $def      = $p{def};
  
      my $isa;
      if ( $def->{isa} ) {
          $isa = ref $def->{isa} ? join q{ }, @{ $def->{isa} } : $def->{isa};
      }
      $isa ||= $BASE_EXC_CLASS;
  
      my $version_name = 'VERSION';
  
      my $code = <<"EOPERL";
  package $subclass;
  
  use base qw($isa);
  
  our \$$version_name = '1.1';
  
  1;
  
  EOPERL
  
      if ( $def->{description} ) {
          ( my $desc = $def->{description} ) =~ s/([\\\'])/\\$1/g;
          $code .= <<"EOPERL";
  sub description
  {
      return '$desc';
  }
  EOPERL
      }
  
      my @fields;
      if ( my $fields = $def->{fields} ) {
          @fields
              = ref $fields && reftype $fields eq 'ARRAY' ? @$fields : $fields;
  
          $code
              .= 'sub Fields { return ($_[0]->SUPER::Fields, '
              . join( ', ', map {"'$_'"} @fields )
              . ") }\n\n";
  
          foreach my $field (@fields) {
              $code .= sprintf( "sub %s { \$_[0]->{%s} }\n", $field, $field );
          }
      }
  
      if ( my $alias = $def->{alias} ) {
          ## no critic (Variables::ProhibitPackageVars)
          die 'Cannot make alias without caller'
              unless defined $Exception::Class::Caller;
  
          ## no critic (TestingAndDebugging::ProhibitNoStrict)
          no strict 'refs';
          *{"$Exception::Class::Caller\::$alias"}
              = sub { $subclass->throw(@_) };
      }
  
      if ( my $defaults = $def->{defaults} ) {
          $code
              .= "sub _defaults { return shift->SUPER::_defaults, our \%_DEFAULTS }\n";
          ## no critic (TestingAndDebugging::ProhibitNoStrict)
          no strict 'refs';
          *{"$subclass\::_DEFAULTS"} = {%$defaults};
      }
  
      ## no critic (BuiltinFunctions::ProhibitStringyEval, ErrorHandling::RequireCheckingReturnValueOfEval)
      eval $code;
      die $@ if $@;
  
      ( my $filename = "$subclass.pm" ) =~ s{::}{/}g;
      $INC{$filename} = __FILE__;
  
      $CLASSES{$subclass} = 1;
  }
  
  sub caught {
      my $e = $@;
  
      return $e unless $_[1];
  
      return unless blessed($e) && $e->isa( $_[1] );
      return $e;
  }
  
  sub Classes { sort keys %Exception::Class::CLASSES }
  
  1;
  
  # ABSTRACT: A module that allows you to declare real exception classes in Perl
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Exception::Class - A module that allows you to declare real exception classes in Perl
  
  =head1 VERSION
  
  version 1.44
  
  =head1 SYNOPSIS
  
    use Exception::Class (
        'MyException',
  
        'AnotherException' => { isa => 'MyException' },
  
        'YetAnotherException' => {
            isa         => 'AnotherException',
            description => 'These exceptions are related to IPC'
        },
  
        'ExceptionWithFields' => {
            isa    => 'YetAnotherException',
            fields => [ 'grandiosity', 'quixotic' ],
            alias  => 'throw_fields',
        },
    );
    use Scalar::Util qw( blessed );
    use Try::Tiny;
  
    try {
        MyException->throw( error => 'I feel funny.' );
    }
    catch {
        die $_ unless blessed $_ && $_->can('rethrow');
  
        if ( $_->isa('Exception::Class') ) {
            warn $_->error, "\n", $_->trace->as_string, "\n";
            warn join ' ', $_->euid, $_->egid, $_->uid, $_->gid, $_->pid, $_->time;
  
            exit;
        }
        elsif ( $_->isa('ExceptionWithFields') ) {
            if ( $_->quixotic ) {
                handle_quixotic_exception();
            }
            else {
                handle_non_quixotic_exception();
            }
        }
        else {
            $_->rethrow;
        }
    };
  
    # without Try::Tiny
    eval { ... };
    if ( my $e = Exception::Class->caught ) { ... }
  
    # use an alias - without parens subroutine name is checked at
    # compile time
    throw_fields error => "No strawberry", grandiosity => "quite a bit";
  
  =head1 DESCRIPTION
  
  B<RECOMMENDATION 1>: If you are writing modern Perl code with L<Moose> or
  L<Moo> I highly recommend using L<Throwable> instead of this module.
  
  B<RECOMMENDATION 2>: Whether or not you use L<Throwable>, you should use
  L<Try::Tiny>.
  
  Exception::Class allows you to declare exception hierarchies in your modules
  in a "Java-esque" manner.
  
  It features a simple interface allowing programmers to 'declare' exception
  classes at compile time. It also has a base exception class,
  L<Exception::Class::Base>, that can be easily extended.
  
  It is designed to make structured exception handling simpler and better by
  encouraging people to use hierarchies of exceptions in their applications, as
  opposed to a single catch-all exception class.
  
  This module does not implement any try/catch syntax. Please see the "OTHER
  EXCEPTION MODULES (try/catch syntax)" section for more information on how to
  get this syntax.
  
  You will also want to look at the documentation for L<Exception::Class::Base>,
  which is the default base class for all exception objects created by this
  module.
  
  =for Pod::Coverage     Classes
      caught
  
  =head1 DECLARING EXCEPTION CLASSES
  
  Importing C<Exception::Class> allows you to automagically create
  L<Exception::Class::Base> subclasses. You can also create subclasses via the
  traditional means of defining your own subclass with C<@ISA>.  These two
  methods may be easily combined, so that you could subclass an exception class
  defined via the automagic import, if you desired this.
  
  The syntax for the magic declarations is as follows:
  
    'MANDATORY CLASS NAME' => \%optional_hashref
  
  The hashref may contain the following options:
  
  =over 4
  
  =item * isa
  
  This is the class's parent class. If this isn't provided then the class name
  in C<$Exception::Class::BASE_EXC_CLASS> is assumed to be the parent (see
  below).
  
  This parameter lets you create arbitrarily deep class hierarchies.  This can
  be any other L<Exception::Class::Base> subclass in your declaration I<or> a
  subclass loaded from a module.
  
  To change the default exception class you will need to change the value of
  C<$Exception::Class::BASE_EXC_CLASS> I<before> calling C<import>. To do this
  simply do something like this:
  
    BEGIN { $Exception::Class::BASE_EXC_CLASS = 'SomeExceptionClass'; }
  
  If anyone can come up with a more elegant way to do this please let me know.
  
  CAVEAT: If you want to automagically subclass an L<Exception::Class::Base>
  subclass loaded from a file, then you I<must> compile the class (via use or
  require or some other magic) I<before> you import C<Exception::Class> or
  you'll get a compile time error.
  
  =item * fields
  
  This allows you to define additional attributes for your exception class. Any
  field you define can be passed to the C<throw> or C<new> methods as additional
  parameters for the constructor. In addition, your exception object will have
  an accessor method for the fields you define.
  
  This parameter can be either a scalar (for a single field) or an array
  reference if you need to define multiple fields.
  
  Fields will be inherited by subclasses.
  
  =item * alias
  
  Specifying an alias causes this class to create a subroutine of the specified
  name in the I<caller's> namespace. Calling this subroutine is equivalent to
  calling C<< <class>->throw(@_) >> for the given exception class.
  
  Besides convenience, using aliases also allows for additional compile time
  checking. If the alias is called I<without parentheses>, as in C<throw_fields
  "an error occurred">, then Perl checks for the existence of the
  C<throw_fields> subroutine at compile time. If instead you do C<<
  ExceptionWithFields->throw(...) >>, then Perl checks the class name at
  runtime, meaning that typos may sneak through.
  
  =item * description
  
  Each exception class has a description method that returns a fixed
  string. This should describe the exception I<class> (as opposed to any
  particular exception object). This may be useful for debugging if you start
  catching exceptions you weren't expecting (particularly if someone forgot to
  document them) and you don't understand the error messages.
  
  =back
  
  The C<Exception::Class> magic attempts to detect circular class hierarchies
  and will die if it finds one. It also detects missing links in a chain, for
  example if you declare Bar to be a subclass of Foo and never declare Foo.
  
  =head1 L<Try::Tiny>
  
  If you are interested in adding try/catch/finally syntactic sugar to your code
  then I recommend you check out L<Try::Tiny>. This is a great module that helps
  you ignore some of the weirdness with C<eval> and C<$@>. Here's an example of
  how the two modules work together:
  
    use Exception::Class ( 'My::Exception' );
    use Scalar::Util qw( blessed );
    use Try::Tiny;
  
    try {
        might_throw();
    }
    catch {
        if ( blessed $_ && $_->isa('My::Exception') ) {
            handle_it();
        }
        else {
            die $_;
        }
    };
  
  Note that you B<cannot> use C<< Exception::Class->caught >> with L<Try::Tiny>.
  
  =head1 Catching Exceptions Without L<Try::Tiny>
  
  C<Exception::Class> provides some syntactic sugar for catching exceptions in a
  safe manner:
  
    eval {...};
  
    if ( my $e = Exception::Class->caught('My::Error') ) {
        cleanup();
        do_something_with_exception($e);
    }
  
  The C<caught> method takes a class name and returns an exception object if the
  last thrown exception is of the given class, or a subclass of that class. If
  it is not given any arguments, it simply returns C<$@>.
  
  You should B<always> make a copy of the exception object, rather than using
  C<$@> directly. This is necessary because if your C<cleanup> function uses
  C<eval>, or calls something which uses it, then C<$@> is overwritten. Copying
  the exception preserves it for the call to C<do_something_with_exception>.
  
  Exception objects also provide a caught method so you can write:
  
    if ( my $e = My::Error->caught ) {
        cleanup();
        do_something_with_exception($e);
    }
  
  =head2 Uncatchable Exceptions
  
  Internally, the C<caught> method will call C<isa> on the exception object. You
  could make an exception "uncatchable" by overriding C<isa> in that class like
  this:
  
   package Exception::Uncatchable;
  
   sub isa { shift->rethrow }
  
  Of course, this only works if you always call C<< Exception::Class->caught >>
  after an C<eval>.
  
  =head1 USAGE RECOMMENDATION
  
  If you're creating a complex system that throws lots of different types of
  exceptions, consider putting all the exception declarations in one place. For
  an app called Foo you might make a C<Foo::Exceptions> module and use that in
  all your code. This module could just contain the code to make
  C<Exception::Class> do its automagic class creation. Doing this allows you to
  more easily see what exceptions you have, and makes it easier to keep track of
  them.
  
  This might look something like this:
  
    package Foo::Bar::Exceptions;
  
    use Exception::Class (
        Foo::Bar::Exception::Senses =>
            { description => 'sense-related exception' },
  
        Foo::Bar::Exception::Smell => {
            isa         => 'Foo::Bar::Exception::Senses',
            fields      => 'odor',
            description => 'stinky!'
        },
  
        Foo::Bar::Exception::Taste => {
            isa         => 'Foo::Bar::Exception::Senses',
            fields      => [ 'taste', 'bitterness' ],
            description => 'like, gag me with a spoon!'
        },
  
        ...
    );
  
  You may want to create a real module to subclass L<Exception::Class::Base> as
  well, particularly if you want your exceptions to have more methods.
  
  =head2 Subclassing Exception::Class::Base
  
  As part of your usage of C<Exception::Class>, you may want to create your own
  base exception class which subclasses L<Exception::Class::Base>. You should
  feel free to subclass any of the methods documented above. For example, you
  may want to subclass C<new> to add additional information to your exception
  objects.
  
  =head1 Exception::Class FUNCTIONS
  
  The C<Exception::Class> method offers one function, C<Classes>, which is not
  exported. This method returns a list of the classes that have been created by
  calling the C<Exception::Class> C<import> method.  Note that this is I<all>
  the subclasses that have been created, so it may include subclasses created by
  things like CPAN modules, etc. Also note that if you simply define a subclass
  via the normal Perl method of setting C<@ISA> or C<use base>, then your
  subclass will not be included.
  
  =head1 SUPPORT
  
  Bugs may be submitted at L<https://github.com/houseabsolute/Exception-Class/issues>.
  
  I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
  
  =head1 SOURCE
  
  The source code repository for Exception-Class can be found at L<https://github.com/houseabsolute/Exception-Class>.
  
  =head1 DONATIONS
  
  If you'd like to thank me for the work I've done on this module, please
  consider making a "donation" to me via PayPal. I spend a lot of free time
  creating free software, and would appreciate any support you'd care to offer.
  
  Please note that B<I am not suggesting that you must do this> in order for me
  to continue working on this particular software. I will continue to do so,
  inasmuch as I have in the past, for as long as it interests me.
  
  Similarly, a donation made in this way will probably not make me work on this
  software much more, unless I get so many donations that I can consider working
  on free software full time (let's all have a chuckle at that together).
  
  To donate, log into PayPal and send money to autarch@urth.org, or use the
  button at L<http://www.urth.org/~autarch/fs-donation.html>.
  
  =head1 AUTHOR
  
  Dave Rolsky <autarch@urth.org>
  
  =head1 CONTRIBUTORS
  
  =for stopwords Alexander Batyrshin Leon Timmermans Ricardo Signes
  
  =over 4
  
  =item *
  
  Alexander Batyrshin <0x62ash@gmail.com>
  
  =item *
  
  Leon Timmermans <fawaka@gmail.com>
  
  =item *
  
  Ricardo Signes <rjbs@cpan.org>
  
  =back
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2017 by Dave Rolsky.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  The full text of the license can be found in the
  F<LICENSE> file included with this distribution.
  
  =cut
EXCEPTION_CLASS

    $main::fatpacked{"Exception/Class/Base.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'EXCEPTION_CLASS_BASE';
  package Exception::Class::Base;
  
  use strict;
  use warnings;
  
  our $VERSION = '1.44';
  
  use Class::Data::Inheritable 0.02;
  use Devel::StackTrace 2.00;
  use Scalar::Util qw( blessed );
  
  use base qw(Class::Data::Inheritable);
  
  BEGIN {
      __PACKAGE__->mk_classdata('Trace');
      __PACKAGE__->mk_classdata('UnsafeRefCapture');
  
      __PACKAGE__->mk_classdata('NoContextInfo');
      __PACKAGE__->NoContextInfo(0);
  
      __PACKAGE__->mk_classdata('RespectOverload');
      __PACKAGE__->RespectOverload(0);
  
      __PACKAGE__->mk_classdata('MaxArgLength');
      __PACKAGE__->MaxArgLength(0);
  
      sub NoRefs {
          my $self = shift;
          if (@_) {
              my $val = shift;
              return $self->UnsafeRefCapture( !$val );
          }
          else {
              return $self->UnsafeRefCapture;
          }
      }
  
      sub Fields { () }
  }
  
  use overload
  
      # an exception is always true
      bool => sub {1}, '""' => 'as_string', fallback => 1;
  
  # Create accessor routines
  BEGIN {
      my @fields = qw( message pid uid euid gid egid time trace );
  
      foreach my $f (@fields) {
          my $sub = sub { my $s = shift; return $s->{$f}; };
  
          ## no critic (TestingAndDebugging::ProhibitNoStrict)
          no strict 'refs';
          *{$f} = $sub;
      }
      *error = \&message;
  
      my %trace_fields = (
          package => 'package',
          file    => 'filename',
          line    => 'line',
      );
  
      while ( my ( $f, $m ) = each %trace_fields ) {
          my $sub = sub {
              my $s = shift;
              return $s->{$f} if exists $s->{$f};
  
              my $frame = $s->trace->frame(0);
  
              return $s->{$f} = $frame ? $frame->$m : undef;
          };
  
          ## no critic (TestingAndDebugging::ProhibitNoStrict)
          no strict 'refs';
          *{$f} = $sub;
      }
  }
  
  sub Classes { Exception::Class::Classes() }
  
  sub throw {
      my $proto = shift;
  
      $proto->rethrow if ref $proto;
  
      die $proto->new(@_);
  }
  
  sub rethrow {
      my $self = shift;
  
      die $self;
  }
  
  sub new {
      my $proto = shift;
      my $class = ref $proto || $proto;
  
      my $self = bless {}, $class;
  
      $self->_initialize(@_);
  
      return $self;
  }
  
  sub _initialize {
      my $self = shift;
      my %p = @_ == 1 ? ( error => $_[0] ) : @_;
  
      $self->{message} = $p{message} || $p{error} || q{};
  
      $self->{show_trace} = $p{show_trace} if exists $p{show_trace};
  
      if ( $self->NoContextInfo ) {
          $self->{show_trace} = 0;
          $self->{package} = $self->{file} = $self->{line} = undef;
      }
      else {
          # CORE::time is important to fix an error with some versions of
          # Perl
          $self->{time} = CORE::time();
          $self->{pid}  = $$;
          $self->{uid}  = $<;
          $self->{euid} = $>;
          $self->{gid}  = $(;
          $self->{egid} = $);
  
          my @ignore_class   = (__PACKAGE__);
          my @ignore_package = 'Exception::Class';
  
          if ( my $i = delete $p{ignore_class} ) {
              push @ignore_class, ( ref($i) eq 'ARRAY' ? @$i : $i );
          }
  
          if ( my $i = delete $p{ignore_package} ) {
              push @ignore_package, ( ref($i) eq 'ARRAY' ? @$i : $i );
          }
  
          $self->{trace} = Devel::StackTrace->new(
              ignore_class       => \@ignore_class,
              ignore_package     => \@ignore_package,
              unsafe_ref_capture => $self->UnsafeRefCapture,
              respect_overload   => $self->RespectOverload,
              max_arg_length     => $self->MaxArgLength,
              map { $p{$_} ? ( $_ => delete $p{$_} ) : () } qw(
                  frame_filter
                  filter_frames_early
                  skip_frames
                  ),
          );
      }
  
      my %fields = map { $_ => 1 } $self->Fields;
      while ( my ( $key, $value ) = each %p ) {
          next if $key =~ /^(?:error|message|show_trace)$/;
  
          if ( $fields{$key} ) {
              $self->{$key} = $value;
          }
          else {
              Exception::Class::Base->throw(
                  error => "unknown field $key passed to constructor for class "
                      . ref $self );
          }
      }
  }
  
  sub context_hash {
      my $self = shift;
  
      return {
          time => $self->{time},
          pid  => $self->{pid},
          uid  => $self->{uid},
          euid => $self->{euid},
          gid  => $self->{gid},
          egid => $self->{egid},
      };
  }
  
  sub field_hash {
      my $self = shift;
  
      my $hash = {};
  
      for my $field ( $self->Fields ) {
          $hash->{$field} = $self->$field;
      }
  
      return $hash;
  }
  
  sub description {
      return 'Generic exception';
  }
  
  sub show_trace {
      my $self = shift;
  
      return 0 unless $self->{trace};
  
      if (@_) {
          $self->{show_trace} = shift;
      }
  
      return exists $self->{show_trace} ? $self->{show_trace} : $self->Trace;
  }
  
  sub as_string {
      my $self = shift;
  
      my $str = $self->full_message;
      unless ( defined $str && length $str ) {
          my $desc = $self->description;
          $str = defined $desc
              && length $desc ? "[$desc]" : '[Generic exception]';
      }
  
      $str .= "\n\n" . $self->trace->as_string
          if $self->show_trace;
  
      return $str;
  }
  
  sub full_message { $_[0]->message }
  
  #
  # The %seen bit protects against circular inheritance.
  #
  ## no critic (BuiltinFunctions::ProhibitStringyEval, ErrorHandling::RequireCheckingReturnValueOfEval)
  eval <<'EOF' if $] == 5.006;
  sub isa {
      my ( $inheritor, $base ) = @_;
      $inheritor = ref($inheritor) if ref($inheritor);
  
      my %seen;
  
      no strict 'refs';
      my @parents = ( $inheritor, @{"$inheritor\::ISA"} );
      while ( my $class = shift @parents ) {
          return 1 if $class eq $base;
  
          push @parents, grep { !$seen{$_}++ } @{"$class\::ISA"};
      }
      return 0;
  }
  EOF
  
  sub caught {
      my $class = shift;
  
      my $e = $@;
  
      return unless defined $e && blessed($e) && $e->isa($class);
      return $e;
  }
  
  1;
  
  # ABSTRACT: A base class for exception objects
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Exception::Class::Base - A base class for exception objects
  
  =head1 VERSION
  
  version 1.44
  
  =head1 SYNOPSIS
  
    use Exception::Class 'MyException';
  
    eval { MyException->throw( error => 'I feel funny.' ) };
  
    print $@->error;
  
  =head1 DESCRIPTION
  
  This class is the base class for all exceptions created by
  L<Exception::Class>. It provides a number of methods for getting information
  about the exception.
  
  =for Pod::Coverage     Classes
      caught
      NoRefs
  
  =head1 METHODS
  
  =head2 MyException->Trace($boolean)
  
  Each C<Exception::Class::Base> subclass can be set individually to include a
  stacktrace when the C<as_string> method is called. The default is to not
  include a stacktrace. Calling this method with a value changes this
  behavior. It always returns the current value (after any change is applied).
  
  This value is inherited by any subclasses. However, if this value is set for a
  subclass, it will thereafter be independent of the value in
  C<Exception::Class::Base>.
  
  Do not call this on the C<Exception::Class::Base> class directly or you'll
  change it for all exception classes that use L<Exception::Class>, including
  ones created in modules you don't control.
  
  This is a class method, not an object method.
  
  =head2 MyException->UnsafeRefCapture($boolean)
  
  When a C<Devel::StackTrace> object is created, it walks through the stack and
  stores the arguments which were passed to each subroutine on the stack. If any
  of these arguments are references, then that means that the
  C<Devel::StackTrace> ends up increasing the ref count of these references,
  delaying their destruction.
  
  Since C<Exception::Class::Base> uses C<Devel::StackTrace> internally, this
  method provides a way to tell C<Devel::StackTrace> not to store these
  references. Instead, C<Devel::StackTrace> replaces references with their
  stringified representation.
  
  This method defaults to false. As with C<Trace>, it is inherited by subclasses
  but setting it in a subclass makes it independent thereafter.
  
  Do not call this on the C<Exception::Class::Base> class directly or you'll
  change it for all exception classes that use L<Exception::Class>, including
  ones created in modules you don't control.
  
  =head2 MyException->RespectOverload($boolean)
  
  When a C<Devel::StackTrace> object stringifies, by default it ignores
  stringification overloading on any objects being dealt with.
  
  Since C<Exception::Class::Base> uses C<Devel::StackTrace> internally, this
  method provides a way to tell C<Devel::StackTrace> to respect overloading.
  
  This method defaults to false. As with C<Trace>, it is inherited by subclasses
  but setting it in a subclass makes it independent thereafter.
  
  Do not call this on the C<Exception::Class::Base> class directly or you'll
  change it for all exception classes that use L<Exception::Class>, including
  ones created in modules you don't control.
  
  =head2 MyException->MaxArgLength($boolean)
  
  When a C<Devel::StackTrace> object stringifies, by default it displays the
  full argument for each function. This parameter can be used to limit the
  maximum length of each argument.
  
  Since C<Exception::Class::Base> uses C<Devel::StackTrace> internally, this
  method provides a way to tell C<Devel::StackTrace> to limit the length of
  arguments.
  
  This method defaults to 0. As with C<Trace>, it is inherited by subclasses but
  setting it in a subclass makes it independent thereafter.
  
  Do not call this on the C<Exception::Class::Base> class directly or you'll
  change it for all exception classes that use L<Exception::Class>, including
  ones created in modules you don't control.
  
  =head2 MyException->Fields
  
  This method returns the extra fields defined for the given class, as a list.
  
  Do not call this on the C<Exception::Class::Base> class directly or you'll
  change it for all exception classes that use L<Exception::Class>, including
  ones created in modules you don't control.
  
  =head2 MyException->throw( $message )
  
  =head2 MyException->throw( message => $message )
  
  =head2 MyException->throw( error => $error )
  
  This method creates a new object with the given error message. If no error
  message is given, this will be an empty string. It then dies with this object
  as its argument.
  
  This method also takes a C<show_trace> parameter which indicates whether or
  not the particular exception object being created should show a stacktrace
  when its C<as_string> method is called. This overrides the value of C<Trace>
  for this class if it is given.
  
  The frames included in the trace can be controlled by the C<ignore_class> and
  C<ignore_package> parameters. These are passed directly to Devel::Stacktrace's
  constructor. See C<Devel::Stacktrace> for more details. This class B<always>
  passes C<__PACKAGE__> for C<ignore_class> and C<'Exception::Class'> for
  C<ignore_package>, in addition to any arguments you provide.
  
  If only a single value is given to the constructor it is assumed to be the
  message parameter.
  
  Additional keys corresponding to the fields defined for the particular
  exception subclass will also be accepted.
  
  =head2 MyException->new(...)
  
  This method takes the same parameters as C<throw>, but instead of dying simply
  returns a new exception object.
  
  This method is always called when constructing a new exception object via the
  C<throw> method.
  
  =head2 MyException->description
  
  Returns the description for the given C<Exception::Class::Base> subclass. The
  C<Exception::Class::Base> class's description is "Generic exception" (this may
  change in the future). This is also an object method.
  
  =head2 $exception->rethrow
  
  Simply dies with the object as its sole argument. It's just syntactic
  sugar. This does not change any of the object's attribute values.  However, it
  will cause C<caller> to report the die as coming from within the
  C<Exception::Class::Base> class rather than where rethrow was called.
  
  Of course, you always have access to the original stacktrace for the exception
  object.
  
  =head2 $exception->message
  
  =head2 $exception->error
  
  Returns the error/message associated with the exception.
  
  =head2 $exception->pid
  
  Returns the pid at the time the exception was thrown.
  
  =head2 $exception->uid
  
  Returns the real user id at the time the exception was thrown.
  
  =head2 $exception->gid
  
  Returns the real group id at the time the exception was thrown.
  
  =head2 $exception->euid
  
  Returns the effective user id at the time the exception was thrown.
  
  =head2 $exception->egid
  
  Returns the effective group id at the time the exception was thrown.
  
  =head2 $exception->time
  
  Returns the time in seconds since the epoch at the time the exception was
  thrown.
  
  =head2 $exception->package
  
  Returns the package from which the exception was thrown.
  
  =head2 $exception->file
  
  Returns the file within which the exception was thrown.
  
  =head2 $exception->line
  
  Returns the line where the exception was thrown.
  
  =head2 $exception->context_hash
  
  Returns a hash reference with the following keys:
  
  =over 4
  
  =item * time
  
  =item * pid
  
  =item * uid
  
  =item * euid
  
  =item * gid
  
  =item * egid
  
  =back
  
  =head2 $exception->field_hash
  
  Returns a hash reference where the keys are any fields defined for the
  exception class and the values are the values associated with the field in the
  given object.
  
  =head2 $exception->trace
  
  Returns the trace object associated with the object.
  
  =head2 $exception->show_trace($boolean)
  
  This method can be used to set whether or not a stack trace is included when
  the as_string method is called or the object is stringified.
  
  =head2 $exception->as_string
  
  Returns a string form of the error message (something like what you'd expect
  from die). If the class or object is set to show traces then then the full
  trace is also included. The result looks like C<Carp::confess>.
  
  =head2 $exception->full_message
  
  Called by the C<as_string> method to get the message. By default, this is the
  same as calling the C<message> method, but may be overridden by a
  subclass. See below for details.
  
  =head1 LIGHTWEIGHT EXCEPTIONS
  
  A lightweight exception is one which records no information about its context
  when it is created. This can be achieved by setting C<< $class->NoContextInfo
  >> to a true value.
  
  You can make this the default for a class of exceptions by setting it after
  creating the class:
  
    use Exception::Class (
        'LightWeight',
        'HeavyWeight',
    );
  
    LightWeight->NoContextInfo(1);
  
  A lightweight exception does have a stack trace object, nor does it record the
  time, pid, uid, euid, gid, or egid. It only has a message.
  
  =head1 OVERLOADING
  
  C<Exception::Class::Base> objects are overloaded so that stringification
  produces a normal error message. This just calls the C<< $exception->as_string
  >> method described above. This means that you can just C<print $@> after an
  C<eval> and not worry about whether or not its an actual object. It also means
  an application or module could do this:
  
    $SIG{__DIE__} = sub { Exception::Class::Base->throw( error => join '', @_ ); };
  
  and this would probably not break anything (unless someone was expecting a
  different type of exception object from C<die>).
  
  =head1 OVERRIDING THE as_string METHOD
  
  By default, the C<as_string> method simply returns the value C<message> or
  C<error> param plus a stack trace, if the class's C<Trace> method returns a
  true value or C<show_trace> was set when creating the exception.
  
  However, once you add new fields to a subclass, you may want to include those
  fields in the stringified error.
  
  Inside the C<as_string> method, the message (non-stack trace) portion of the
  error is generated by calling the C<full_message> method. This can be easily
  overridden. For example:
  
    sub full_message {
        my $self = shift;
  
        my $msg = $self->message;
  
        $msg .= " and foo was " . $self->foo;
  
        return $msg;
    }
  
  =head1 SUPPORT
  
  Bugs may be submitted at L<https://github.com/houseabsolute/Exception-Class/issues>.
  
  I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
  
  =head1 SOURCE
  
  The source code repository for Exception-Class can be found at L<https://github.com/houseabsolute/Exception-Class>.
  
  =head1 AUTHOR
  
  Dave Rolsky <autarch@urth.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2017 by Dave Rolsky.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  The full text of the license can be found in the
  F<LICENSE> file included with this distribution.
  
  =cut
EXCEPTION_CLASS_BASE

    $main::fatpacked{"File/Flock/Retry.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'FILE_FLOCK_RETRY';
  package File::Flock::Retry;
  
  our $DATE = '2019-03-12'; # DATE
  our $VERSION = '0.631'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  use Fcntl ':DEFAULT', ':flock';
  
  sub lock {
      my ($class, $path, $opts) = @_;
      $opts //= {};
      my %h;
  
      defined($path) or die "Please specify path";
      $h{path}    = $path;
      $h{retries} = $opts->{retries} // 60;
      $h{shared}  = $opts->{shared} // 0;
      $h{mode}    = $opts->{mode} // (O_CREAT | O_RDWR);
  
      my $self = bless \%h, $class;
      $self->_lock;
      $self;
  }
  
  # return 1 if we lock, 0 if already locked. die on failure.
  sub _lock {
      my $self = shift;
  
      # already locked
      return 0 if $self->{_fh};
  
      my $path = $self->{path};
      my $existed = -f $path;
      my $exists;
      my $tries = 0;
    TRY:
      while (1) {
          $tries++;
  
          # 1
          sysopen $self->{_fh}, $path, $self->{mode}
              or die "Can't open lock file '$path': $!";
  
          # 2
          my @st1 = stat($self->{_fh}); # stat before lock
  
          # 3
          if (flock($self->{_fh}, ($self->{shared} ? LOCK_SH : LOCK_EX) | LOCK_NB)) {
              # if file is unlinked by another process between 1 & 2, @st1 will be
              # empty and we check here.
              redo TRY unless @st1;
  
              # 4
              my @st2 = stat($path); # stat after lock
  
              # if file is unlinked between 3 & 4, @st2 will be empty and we check
              # here.
              redo TRY unless @st2;
  
              # if file is recreated between 2 & 4, @st1 and @st2 will differ in
              # dev/inode, we check here.
              redo TRY if $st1[0] != $st2[0] || $st1[1] != $st2[1];
  
              # everything seems okay
              last;
          } else {
              $tries <= $self->{retries}
                  or die "Can't acquire lock on '$path' after $tries seconds";
              sleep 1;
          }
      }
      $self->{_created} = !$existed;
      1;
  }
  
  # return 1 if we unlock, 0 if already unlocked. die on failure.
  sub _unlock {
      my ($self) = @_;
  
      my $path = $self->{path};
  
      # don't unlock if we are not holding the lock
      return 0 unless $self->{_fh};
  
      unlink $self->{path} if $self->{_created} && !(-s $self->{path});
  
      {
          # to shut up warning about flock on closed filehandle (XXX but why
          # closed if we are holding the lock?)
          no warnings;
  
          flock $self->{_fh}, LOCK_UN;
      }
      close delete($self->{_fh});
      1;
  }
  
  sub release {
      my $self = shift;
      $self->_unlock;
  }
  
  sub unlock {
      my $self = shift;
      $self->_unlock;
  }
  
  sub handle {
      my $self = shift;
      $self->{_fh};
  }
  
  sub DESTROY {
      my $self = shift;
      $self->_unlock;
  }
  
  1;
  # ABSTRACT: Yet another flock module
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  File::Flock::Retry - Yet another flock module
  
  =head1 VERSION
  
  This document describes version 0.631 of File::Flock::Retry (from Perl distribution File-Flock-Retry), released on 2019-03-12.
  
  =head1 SYNOPSIS
  
   use File::Flock::Retry;
  
   # try to acquire exclusive lock. if fail to acquire lock within 60s, die.
   my $lock = File::Flock::Retry->lock($file);
  
   # explicitly unlock
   $lock->release;
  
   # automatically unlock if object is DESTROY-ed.
   undef $lock;
  
  =head1 DESCRIPTION
  
  This is yet another flock module. It is a more lightweight alternative to
  L<File::Flock> with some other differences:
  
  =over 4
  
  =item * OO interface only
  
  =item * Autoretry (by default for 60s) when trying to acquire lock
  
  I prefer this approach to blocking/waiting indefinitely or failing immediately.
  
  =back
  
  =for Pod::Coverage ^(DESTROY)$
  
  =head1 CAVEATS
  
  Not yet tested on Windows. Some filesystems do not support inode?
  
  =head1 METHODS
  
  =head2 lock
  
  Usage:
  
   $lock = File::Flock::Retry->lock($path, \%opts)
  
  Attempt to acquire an exclusive lock on C<$path>. By default, C<$path> will be
  created if not already exists (see L</mode>). If C<$path> is already locked by
  another process, will retry every second for a number of seconds (by default
  60). Will die if failed to acquire lock after all retries.
  
  Will automatically unlock if C<$lock> goes out of scope. Upon unlock, will
  remove C<$path> if it was created by L</lock> and is still empty (this behavior
  is the same as C<File::Flock>).
  
  Available options:
  
  =over
  
  =item * mode
  
  Integer. Default: O_CREAT | O_RDWR.
  
  File open mode, to be passed to Perl's C<sysopen()>. For example, if you want to
  avoid race condition between creating and locking the file, you might want to
  use C<< O_CREAT | O_EXCL | O_RDWR >> to fail when the file already exists. Note
  that the constants are available after you do a C<< use Fcntl ':DEFAULT'; >>.
  
  =item * retries
  
  Integer. Default: 60.
  
  Number of retries (equals number of seconds, since retry is done every second).
  
  =item * shared
  
  Boolean. Default: 0.
  
  By default, an exclusive lock (LOCK_EX) is attempted. However, if this option is
  set to true, a shared lock (LOCK_SH) is attempted.
  
  =back
  
  =head2 unlock
  
  Usage:
  
   $lock->unlock
  
  Unlock. will remove lock file if it was created by L</lock> and is still empty
  (this behavior is the same as C<File::Flock>).
  
  =head2 release
  
  Usage:
  
   $lock->release
  
  Synonym for L</unlock>.
  
  =head2 handle
  
  Usage:
  
   my $fh = $lock->handle;
  
  Return the file handle.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/File-Flock-Retry>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-File-Flock-Retry>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=File-Flock-Retry>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<File::Flock>, a bit too heavy in terms of dependencies and startup overhead,
  for my taste. It depends on things like L<File::Slurp> and
  L<Data::Structure::Util> (which loads L<Digest::MD5>, L<Storable>, among
  others).
  
  L<File::Flock::Tiny> which is also tiny, but does not have the autoremove and
  autoretry capability which I want. See also:
  L<https://github.com/trinitum/perl-File-Flock-Tiny/issues/1>
  
  flock() Perl function.
  
  An alternative to flock() is just using sysopen() with O_CREAT|O_EXCL mode to
  create lock files. This is supported on more filesystems (particularly network
  filesystems which lack flock()).
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2019, 2017, 2015, 2014 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
FILE_FLOCK_RETRY

    $main::fatpacked{"File/HomeDir.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'FILE_HOMEDIR';
  package File::HomeDir;
  
  # See POD at end for documentation
  
  use 5.008003;
  use strict;
  use warnings;
  use Carp        ();
  use Config      ();
  use File::Spec  ();
  use File::Which ();
  
  # Globals
  use vars qw{$VERSION @EXPORT @EXPORT_OK $IMPLEMENTED_BY};    ## no critic qw(AutomaticExportation)
  use base qw(Exporter);
  
  BEGIN
  {
      $VERSION = '1.004';
  
      # Inherit manually
      require Exporter;
      @EXPORT    = qw{home};
      @EXPORT_OK = qw{
        home
        my_home
        my_desktop
        my_documents
        my_music
        my_pictures
        my_videos
        my_data
        my_dist_config
        my_dist_data
        users_home
        users_desktop
        users_documents
        users_music
        users_pictures
        users_videos
        users_data
      };
  }
  
  # Inlined Params::Util functions
  sub _CLASS ($)    ## no critic qw(SubroutinePrototypes)
  {
      (defined $_[0] and not ref $_[0] and $_[0] =~ m/^[^\W\d]\w*(?:::\w+)*\z/s) ? $_[0] : undef;
  }
  
  sub _DRIVER ($$)    ## no critic qw(SubroutinePrototypes)
  {
      (defined _CLASS($_[0]) and eval "require $_[0]; 1" and $_[0]->isa($_[1]) and $_[0] ne $_[1]) ? $_[0] : undef;
  }
  
  # Platform detection
  if ($IMPLEMENTED_BY)
  {
      # Allow for custom HomeDir classes
      # Leave it as the existing value
  }
  elsif ($^O eq 'MSWin32')
  {
      # All versions of Windows
      $IMPLEMENTED_BY = 'File::HomeDir::Windows';
  }
  elsif ($^O eq 'darwin')
  {
      # 1st: try Mac::SystemDirectory by chansen
      if (eval "require Mac::SystemDirectory; 1")
      {
          $IMPLEMENTED_BY = 'File::HomeDir::Darwin::Cocoa';
      }
      elsif (eval "require Mac::Files; 1")
      {
          # 2nd try Mac::Files: Carbon - unmaintained since 2006 except some 64bit fixes
          $IMPLEMENTED_BY = 'File::HomeDir::Darwin::Carbon';
      }
      else
      {
          # 3rd: fallback: pure perl
          $IMPLEMENTED_BY = 'File::HomeDir::Darwin';
      }
  }
  elsif ($^O eq 'MacOS')
  {
      # Legacy Mac OS
      $IMPLEMENTED_BY = 'File::HomeDir::MacOS9';
  }
  elsif (File::Which::which('xdg-user-dir'))
  {
      # freedesktop unixes
      $IMPLEMENTED_BY = 'File::HomeDir::FreeDesktop';
  }
  else
  {
      # Default to Unix semantics
      $IMPLEMENTED_BY = 'File::HomeDir::Unix';
  }
  
  unless (_DRIVER($IMPLEMENTED_BY, 'File::HomeDir::Driver'))
  {
      Carp::croak("Missing or invalid File::HomeDir driver $IMPLEMENTED_BY");
  }
  
  #####################################################################
  # Current User Methods
  
  sub my_home
  {
      $IMPLEMENTED_BY->my_home;
  }
  
  sub my_desktop
  {
      $IMPLEMENTED_BY->can('my_desktop')
        ? $IMPLEMENTED_BY->my_desktop
        : Carp::croak("The my_desktop method is not implemented on this platform");
  }
  
  sub my_documents
  {
      $IMPLEMENTED_BY->can('my_documents')
        ? $IMPLEMENTED_BY->my_documents
        : Carp::croak("The my_documents method is not implemented on this platform");
  }
  
  sub my_music
  {
      $IMPLEMENTED_BY->can('my_music')
        ? $IMPLEMENTED_BY->my_music
        : Carp::croak("The my_music method is not implemented on this platform");
  }
  
  sub my_pictures
  {
      $IMPLEMENTED_BY->can('my_pictures')
        ? $IMPLEMENTED_BY->my_pictures
        : Carp::croak("The my_pictures method is not implemented on this platform");
  }
  
  sub my_videos
  {
      $IMPLEMENTED_BY->can('my_videos')
        ? $IMPLEMENTED_BY->my_videos
        : Carp::croak("The my_videos method is not implemented on this platform");
  }
  
  sub my_data
  {
      $IMPLEMENTED_BY->can('my_data')
        ? $IMPLEMENTED_BY->my_data
        : Carp::croak("The my_data method is not implemented on this platform");
  }
  
  sub my_dist_data
  {
      my $params = ref $_[-1] eq 'HASH' ? pop : {};
      my $dist = pop or Carp::croak("The my_dist_data method requires an argument");
      my $data = my_data();
  
      # If datadir is not defined, there's nothing we can do: bail out
      # and return nothing...
      return undef unless defined $data;
  
      # On traditional unixes, hide the top-level directory
      my $var =
        $data eq home()
        ? File::Spec->catdir($data, '.perl', 'dist', $dist)
        : File::Spec->catdir($data, 'Perl',  'dist', $dist);
  
      # directory exists: return it
      return $var if -d $var;
  
      # directory doesn't exist: check if we need to create it...
      return undef unless $params->{create};
  
      # user requested directory creation
      require File::Path;
      File::Path::mkpath($var);
      return $var;
  }
  
  sub my_dist_config
  {
      my $params = ref $_[-1] eq 'HASH' ? pop : {};
      my $dist = pop or Carp::croak("The my_dist_config method requires an argument");
  
      # not all platforms support a specific my_config() method
      my $config =
          $IMPLEMENTED_BY->can('my_config')
        ? $IMPLEMENTED_BY->my_config
        : $IMPLEMENTED_BY->my_documents;
  
      # If neither configdir nor my_documents is defined, there's
      # nothing we can do: bail out and return nothing...
      return undef unless defined $config;
  
      # On traditional unixes, hide the top-level dir
      my $etc =
        $config eq home()
        ? File::Spec->catdir($config, '.perl', $dist)
        : File::Spec->catdir($config, 'Perl',  $dist);
  
      # directory exists: return it
      return $etc if -d $etc;
  
      # directory doesn't exist: check if we need to create it...
      return undef unless $params->{create};
  
      # user requested directory creation
      require File::Path;
      File::Path::mkpath($etc);
      return $etc;
  }
  
  #####################################################################
  # General User Methods
  
  sub users_home
  {
      $IMPLEMENTED_BY->can('users_home')
        ? $IMPLEMENTED_BY->users_home($_[-1])
        : Carp::croak("The users_home method is not implemented on this platform");
  }
  
  sub users_desktop
  {
      $IMPLEMENTED_BY->can('users_desktop')
        ? $IMPLEMENTED_BY->users_desktop($_[-1])
        : Carp::croak("The users_desktop method is not implemented on this platform");
  }
  
  sub users_documents
  {
      $IMPLEMENTED_BY->can('users_documents')
        ? $IMPLEMENTED_BY->users_documents($_[-1])
        : Carp::croak("The users_documents method is not implemented on this platform");
  }
  
  sub users_music
  {
      $IMPLEMENTED_BY->can('users_music')
        ? $IMPLEMENTED_BY->users_music($_[-1])
        : Carp::croak("The users_music method is not implemented on this platform");
  }
  
  sub users_pictures
  {
      $IMPLEMENTED_BY->can('users_pictures')
        ? $IMPLEMENTED_BY->users_pictures($_[-1])
        : Carp::croak("The users_pictures method is not implemented on this platform");
  }
  
  sub users_videos
  {
      $IMPLEMENTED_BY->can('users_videos')
        ? $IMPLEMENTED_BY->users_videos($_[-1])
        : Carp::croak("The users_videos method is not implemented on this platform");
  }
  
  sub users_data
  {
      $IMPLEMENTED_BY->can('users_data')
        ? $IMPLEMENTED_BY->users_data($_[-1])
        : Carp::croak("The users_data method is not implemented on this platform");
  }
  
  #####################################################################
  # Legacy Methods
  
  # Find the home directory of an arbitrary user
  sub home (;$)    ## no critic qw(SubroutinePrototypes)
  {
      # Allow to be called as a method
      if ($_[0] and $_[0] eq 'File::HomeDir')
      {
          shift();
      }
  
      # No params means my home
      return my_home() unless @_;
  
      # Check the param
      my $name = shift;
      if (!defined $name)
      {
          Carp::croak("Can't use undef as a username");
      }
      if (!length $name)
      {
          Carp::croak("Can't use empty-string (\"\") as a username");
      }
  
      # A dot also means my home
      ### Is this meant to mean File::Spec->curdir?
      if ($name eq '.')
      {
          return my_home();
      }
  
      # Now hand off to the implementor
      $IMPLEMENTED_BY->users_home($name);
  }
  
  1;
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  File::HomeDir - Find your home and other directories on any platform
  
  =begin html
  
  <a href="https://travis-ci.org/perl5-utils/File-HomeDir"><img src="https://travis-ci.org/perl5-utils/File-HomeDir.svg?branch=master" alt="Travis CI"/></a>
  <a href='https://coveralls.io/github/perl5-utils/File-HomeDir?branch=master'><img src='https://coveralls.io/repos/github/perl5-utils/File-HomeDir/badge.svg?branch=master' alt='Coverage Status'/></a>
  
  =end html
  
  =head1 SYNOPSIS
  
    use File::HomeDir;
    
    # Modern Interface (Current User)
    $home     = File::HomeDir->my_home;
    $desktop  = File::HomeDir->my_desktop;
    $docs     = File::HomeDir->my_documents;
    $music    = File::HomeDir->my_music;
    $pics     = File::HomeDir->my_pictures;
    $videos   = File::HomeDir->my_videos;
    $data     = File::HomeDir->my_data;
    $dist     = File::HomeDir->my_dist_data('File-HomeDir');
    $dist     = File::HomeDir->my_dist_config('File-HomeDir');
    
    # Modern Interface (Other Users)
    $home    = File::HomeDir->users_home('foo');
    $desktop = File::HomeDir->users_desktop('foo');
    $docs    = File::HomeDir->users_documents('foo');
    $music   = File::HomeDir->users_music('foo');
    $pics    = File::HomeDir->users_pictures('foo');
    $video   = File::HomeDir->users_videos('foo');
    $data    = File::HomeDir->users_data('foo');
  
  =head1 DESCRIPTION
  
  B<File::HomeDir> is a module for locating the directories that are "owned"
  by a user (typically your user) and to solve the various issues that arise
  trying to find them consistently across a wide variety of platforms.
  
  The end result is a single API that can find your resources on any platform,
  making it relatively trivial to create Perl software that works elegantly
  and correctly no matter where you run it.
  
  =head2 Platform Neutrality
  
  In the Unix world, many different types of data can be mixed together
  in your home directory (although on some Unix platforms this is no longer
  the case, particularly for "desktop"-oriented platforms).
  
  On some non-Unix platforms, separate directories are allocated for
  different types of data and have been for a long time.
  
  When writing applications on top of B<File::HomeDir>, you should thus
  always try to use the most specific method you can. User documents should
  be saved in C<my_documents>, data that supports an application but isn't
  normally editing by the user directory should go into C<my_data>.
  
  On platforms that do not make any distinction, all these different
  methods will harmlessly degrade to the main home directory, but on
  platforms that care B<File::HomeDir> will always try to Do The Right
  Thing(tm).
  
  =head1 METHODS
  
  Two types of methods are provided. The C<my_method> series of methods for
  finding resources for the current user, and the C<users_method> (read as
  "user's method") series for finding resources for arbitrary users.
  
  This split is necessary, as on most platforms it is B<much> easier to find
  information about the current user compared to other users, and indeed
  on a number you cannot find out information such as C<users_desktop> at
  all, due to security restrictions.
  
  All methods will double check (using a C<-d> test) that a directory
  actually exists before returning it, so you may trust in the values
  that are returned (subject to the usual caveats of race conditions of
  directories being deleted at the moment between a directory being returned
  and you using it).
  
  However, because in some cases platforms may not support the concept of home
  directories at all, any method may return C<undef> (both in scalar and list
  context) to indicate that there is no matching directory on the system.
  
  For example, most untrusted 'nobody'-type users do not have a home
  directory. So any modules that are used in a CGI application that
  at some level of recursion use your code, will result in calls to
  File::HomeDir returning undef, even for a basic home() call.
  
  =head2 my_home
  
  The C<my_home> method takes no arguments and returns the main home/profile
  directory for the current user.
  
  If the distinction is important to you, the term "current" refers to the
  real user, and not the effective user.
  
  This is also the case for all of the other "my" methods.
  
  Returns the directory path as a string, C<undef> if the current user
  does not have a home directory, or dies on error.
  
  =head2 my_desktop
  
  The C<my_desktop> method takes no arguments and returns the "desktop"
  directory for the current user.
  
  Due to the diversity and complexity of implementations required to deal with
  implementing the required functionality fully and completely, the
  C<my_desktop> method may or may not be implemented on each platform.
  
  That said, I am extremely interested in code to implement C<my_desktop> on
  Unix, as long as it is capable of dealing (as the Windows implementation
  does) with internationalization. It should also avoid false positive
  results by making sure it only returns the appropriate directories for the
  appropriate platforms.
  
  Returns the directory path as a string, C<undef> if the current user
  does not have a desktop directory, or dies on error.
  
  =head2 my_documents
  
  The C<my_documents> method takes no arguments and returns the directory (for
  the current user) where the user's documents are stored.
  
  Returns the directory path as a string, C<undef> if the current user
  does not have a documents directory, or dies on error.
  
  =head2 my_music
  
  The C<my_music> method takes no arguments and returns the directory
  where the current user's music is stored.
  
  No bias is made to any particular music type or music program, rather the
  concept of a directory to hold the user's music is made at the level of the
  underlying operating system or (at least) desktop environment.
  
  Returns the directory path as a string, C<undef> if the current user
  does not have a suitable directory, or dies on error.
  
  =head2 my_pictures
  
  The C<my_pictures> method takes no arguments and returns the directory
  where the current user's pictures are stored.
  
  No bias is made to any particular picture type or picture program, rather the
  concept of a directory to hold the user's pictures is made at the level of the
  underlying operating system or (at least) desktop environment.
  
  Returns the directory path as a string, C<undef> if the current user
  does not have a suitable directory, or dies on error.
  
  =head2 my_videos
  
  The C<my_videos> method takes no arguments and returns the directory
  where the current user's videos are stored.
  
  No bias is made to any particular video type or video program, rather the
  concept of a directory to hold the user's videos is made at the level of the
  underlying operating system or (at least) desktop environment.
  
  Returns the directory path as a string, C<undef> if the current user
  does not have a suitable directory, or dies on error.
  
  =head2 my_data
  
  The C<my_data> method takes no arguments and returns the directory where
  local applications should store their internal data for the current
  user.
  
  Generally an application would create a subdirectory such as C<.foo>,
  beneath this directory, and store its data there. By creating your
  directory this way, you get an accurate result on the maximum number of
  platforms. But see the documentation about C<my_dist_config()> or
  C<my_dist_data()> below.
  
  For example, on Unix you get C<~/.foo> and on Win32 you get
  C<~/Local Settings/Application Data/.foo>
  
  Returns the directory path as a string, C<undef> if the current user
  does not have a data directory, or dies on error.
  
  
  =head2 my_dist_config
  
    File::HomeDir->my_dist_config( $dist [, \%params] );
    
    # For example...
    
    File::HomeDir->my_dist_config( 'File-HomeDir' );
    File::HomeDir->my_dist_config( 'File-HomeDir', { create => 1 } );
  
  The C<my_dist_config> method takes a distribution name as argument and
  returns an application-specific directory where they should store their
  internal configuration.
  
  The base directory will be either C<my_config> if the platform supports
  it, or C<my_documents> otherwise. The subdirectory itself will be 
  C<BASE/Perl/Dist-Name>. If the base directory is the user's home directory,
  C<my_dist_config> will be in C<~/.perl/Dist-Name> (and thus be hidden on
  all Unixes).
  
  The optional last argument is a hash reference to tweak the method
  behaviour. The following hash keys are recognized:
  
  =over 4
  
  =item * create
  
  Passing a true value to this key will force the creation of the
  directory if it doesn't exist (remember that C<File::HomeDir>'s policy
  is to return C<undef> if the directory doesn't exist).
  
  Defaults to false, meaning no automatic creation of directory.
  
  =back
  
  
  =head2 my_dist_data
  
    File::HomeDir->my_dist_data( $dist [, \%params] );
    
    # For example...
    
    File::HomeDir->my_dist_data( 'File-HomeDir' );
    File::HomeDir->my_dist_data( 'File-HomeDir', { create => 1 } );
  
  The C<my_dist_data> method takes a distribution name as argument and
  returns an application-specific directory where they should store their
  internal data.
  
  This directory will be of course a subdirectory of C<my_data>. Platforms
  supporting data-specific directories will use
  C<DATA_DIR/perl/dist/Dist-Name> following the common
  "DATA/vendor/application" pattern. If the C<my_data> directory is the
  user's home directory, C<my_dist_data> will be in C<~/.perl/dist/Dist-Name>
  (and thus be hidden on all Unixes).
  
  The optional last argument is a hash reference to tweak the method
  behaviour. The following hash keys are recognized:
  
  =over 4
  
  =item * create
  
  Passing a true value to this key will force the creation of the
  directory if it doesn't exist (remember that C<File::HomeDir>'s policy
  is to return C<undef> if the directory doesn't exist).
  
  Defaults to false, meaning no automatic creation of directory.
  
  =back
  
  =head2 users_home
  
    $home = File::HomeDir->users_home('foo');
  
  The C<users_home> method takes a single parameter and is used to locate the
  parent home/profile directory for an identified user on the system.
  
  While most of the time this identifier would be some form of user name,
  it is permitted to vary per-platform to support user ids or UUIDs as
  applicable for that platform.
  
  Returns the directory path as a string, C<undef> if that user
  does not have a home directory, or dies on error.
  
  =head2 users_documents
  
    $docs = File::HomeDir->users_documents('foo');
  
  Returns the directory path as a string, C<undef> if that user
  does not have a documents directory, or dies on error.
  
  =head2 users_data
  
    $data = File::HomeDir->users_data('foo');
  
  Returns the directory path as a string, C<undef> if that user
  does not have a data directory, or dies on error.
  
  =head2 users_desktop
  
    $docs = File::HomeDir->users_desktop('foo');
  
  Returns the directory path as a string, C<undef> if that user
  does not have a desktop directory, or dies on error.
  
  =head2 users_music
  
    $docs = File::HomeDir->users_music('foo');
  
  Returns the directory path as a string, C<undef> if that user
  does not have a music directory, or dies on error.
  
  =head2 users_pictures
  
    $docs = File::HomeDir->users_pictures('foo');
  
  Returns the directory path as a string, C<undef> if that user
  does not have a pictures directory, or dies on error.
  
  =head2 users_videos
  
    $docs = File::HomeDir->users_videos('foo');
  
  Returns the directory path as a string, C<undef> if that user
  does not have a videos directory, or dies on error.
  
  =head1 FUNCTIONS
  
  =head2 home
  
    use File::HomeDir;
    $home = home();
    $home = home('foo');
    $home = File::HomeDir::home();
    $home = File::HomeDir::home('foo');
  
  The C<home> function is exported by default and is provided for
  compatibility with legacy applications. In new applications, you should
  use the newer method-based interface above.
  
  Returns the directory path to a named user's home/profile directory.
  
  If provided no parameter, returns the directory path to the current user's
  home/profile directory.
  
  =head1 TO DO
  
  =over 4
  
  =item * Add more granularity to Unix, and add support to VMS and other
  esoteric platforms, so we can consider going core.
  
  =item * Add consistent support for users_* methods 
  
  =back
  
  =head1 SUPPORT
  
  This module is stored in an Open Repository at the following address.
  
  L<http://svn.ali.as/cpan/trunk/File-HomeDir>
  
  Write access to the repository is made available automatically to any
  published CPAN author, and to most other volunteers on request.
  
  If you are able to submit your bug report in the form of new (failing)
  unit tests, or can apply your fix directly instead of submitting a patch,
  you are B<strongly> encouraged to do so as the author currently maintains
  over 100 modules and it can take some time to deal with non-Critical bug
  reports or patches.
  
  This will guarantee that your issue will be addressed in the next
  release of the module.
  
  If you cannot provide a direct test or fix, or don't have time to do so,
  then regular bug reports are still accepted and appreciated via the CPAN
  bug tracker.
  
  L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=File-HomeDir>
  
  For other issues, for commercial enhancement or support, or to have your
  write access enabled for the repository, contact the author at the email
  address above.
  
  =head1 ACKNOWLEDGEMENTS
  
  The biggest acknowledgement goes to Chris Nandor, who wielded his
  legendary Mac-fu and turned my initial fairly ordinary Darwin
  implementation into something that actually worked properly everywhere,
  and then donated a Mac OS X license to allow it to be maintained properly.
  
  =head1 AUTHORS
  
  Adam Kennedy E<lt>adamk@cpan.orgE<gt>
  
  Sean M. Burke E<lt>sburke@cpan.orgE<gt>
  
  Chris Nandor E<lt>cnandor@cpan.orgE<gt>
  
  Stephen Steneker E<lt>stennie@cpan.orgE<gt>
  
  =head1 SEE ALSO
  
  L<File::ShareDir>, L<File::HomeDir::Win32> (legacy)
  
  =head1 COPYRIGHT
  
  Copyright 2005 - 2012 Adam Kennedy.
  
  Some parts copyright 2000 Sean M. Burke.
  
  Some parts copyright 2006 Chris Nandor.
  
  Some parts copyright 2006 Stephen Steneker.
  
  Some parts copyright 2009-2011 Jérôme Quelin.
  
  This program is free software; you can redistribute
  it and/or modify it under the same terms as Perl itself.
  
  The full text of the license can be found in the
  LICENSE file included with this module.
  
  =cut
FILE_HOMEDIR

    $main::fatpacked{"File/HomeDir/Darwin.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'FILE_HOMEDIR_DARWIN';
  package File::HomeDir::Darwin;
  
  use 5.008003;
  use strict;
  use warnings;
  use Cwd                 ();
  use Carp                ();
  use File::HomeDir::Unix ();
  
  use vars qw{$VERSION};
  use base "File::HomeDir::Unix";
  
  BEGIN
  {
      $VERSION = '1.004';
  }
  
  #####################################################################
  # Current User Methods
  
  sub _my_home
  {
      my ($class, $path) = @_;
      my $home = $class->my_home;
      return undef unless defined $home;
  
      my $folder = "$home/$path";
      unless (-d $folder)
      {
          # Make sure that symlinks resolve to directories.
          return undef unless -l $folder;
          my $dir = readlink $folder or return;
          return undef unless -d $dir;
      }
  
      return Cwd::abs_path($folder);
  }
  
  sub my_desktop
  {
      my $class = shift;
      $class->_my_home('Desktop');
  }
  
  sub my_documents
  {
      my $class = shift;
      $class->_my_home('Documents');
  }
  
  sub my_data
  {
      my $class = shift;
      $class->_my_home('Library/Application Support');
  }
  
  sub my_music
  {
      my $class = shift;
      $class->_my_home('Music');
  }
  
  sub my_pictures
  {
      my $class = shift;
      $class->_my_home('Pictures');
  }
  
  sub my_videos
  {
      my $class = shift;
      $class->_my_home('Movies');
  }
  
  #####################################################################
  # Arbitrary User Methods
  
  sub users_home
  {
      my $class = shift;
      my $home  = $class->SUPER::users_home(@_);
      return defined $home ? Cwd::abs_path($home) : undef;
  }
  
  sub users_desktop
  {
      my ($class, $name) = @_;
      return undef if $name eq 'root';
      $class->_to_user($class->my_desktop, $name);
  }
  
  sub users_documents
  {
      my ($class, $name) = @_;
      return undef if $name eq 'root';
      $class->_to_user($class->my_documents, $name);
  }
  
  sub users_data
  {
      my ($class, $name) = @_;
      $class->_to_user($class->my_data, $name)
        || $class->users_home($name);
  }
  
  # cheap hack ... not entirely reliable, perhaps, but ... c'est la vie, since
  # there's really no other good way to do it at this time, that i know of -- pudge
  sub _to_user
  {
      my ($class, $path, $name) = @_;
      my $my_home    = $class->my_home;
      my $users_home = $class->users_home($name);
      defined $users_home or return undef;
      $path =~ s/^\Q$my_home/$users_home/;
      return $path;
  }
  
  1;
  
  =pod
  
  =head1 NAME
  
  File::HomeDir::Darwin - Find your home and other directories on Darwin (OS X)
  
  =head1 DESCRIPTION
  
  This module provides Mac OS X specific file path for determining
  common user directories in pure perl, by just using C<$ENV{HOME}>
  without Carbon nor Cocoa API calls. In normal usage this module will
  always be used via L<File::HomeDir>.
  
  =head1 SYNOPSIS
  
    use File::HomeDir;
    
    # Find directories for the current user
    $home    = File::HomeDir->my_home;      # /Users/mylogin
    $desktop = File::HomeDir->my_desktop;   # /Users/mylogin/Desktop
    $docs    = File::HomeDir->my_documents; # /Users/mylogin/Documents
    $music   = File::HomeDir->my_music;     # /Users/mylogin/Music
    $pics    = File::HomeDir->my_pictures;  # /Users/mylogin/Pictures
    $videos  = File::HomeDir->my_videos;    # /Users/mylogin/Movies
    $data    = File::HomeDir->my_data;      # /Users/mylogin/Library/Application Support
  
  =cut
FILE_HOMEDIR_DARWIN

    $main::fatpacked{"File/HomeDir/Darwin/Carbon.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'FILE_HOMEDIR_DARWIN_CARBON';
  package File::HomeDir::Darwin::Carbon;
  
  # Basic implementation for the Dawin family of operating systems.
  # This includes (most prominently) Mac OS X.
  
  use 5.008003;
  use strict;
  use warnings;
  use Cwd                   ();
  use Carp                  ();
  use File::HomeDir::Darwin ();
  
  use vars qw{$VERSION};
  
  # This is only a child class of the pure Perl darwin
  # class so that we can do homedir detection of all three
  # drivers at one via ->isa.
  use base "File::HomeDir::Darwin";
  
  BEGIN
  {
      $VERSION = '1.004';
  
      # Load early if in a forking environment and we have
      # prefork, or at run-time if not.
      local $@;                           ## no critic (Variables::RequireInitializationForLocalVars)
      eval "use prefork 'Mac::Files'";    ## no critic (ErrorHandling::RequireCheckingReturnValueOfEval)
  }
  
  #####################################################################
  # Current User Methods
  
  ## no critic qw(UnusedPrivateSubroutines)
  sub _guess_determined_home
  {
      my $class = shift;
  
      require Mac::Files;
      my $home = $class->_find_folder(Mac::Files::kCurrentUserFolderType(),);
      $home ||= $class->SUPER::_guess_determined_home($@);
      return $home;
  }
  
  sub my_desktop
  {
      my $class = shift;
  
      require Mac::Files;
      $class->_find_folder(Mac::Files::kDesktopFolderType(),);
  }
  
  sub my_documents
  {
      my $class = shift;
  
      require Mac::Files;
      $class->_find_folder(Mac::Files::kDocumentsFolderType(),);
  }
  
  sub my_data
  {
      my $class = shift;
  
      require Mac::Files;
      $class->_find_folder(Mac::Files::kApplicationSupportFolderType(),);
  }
  
  sub my_music
  {
      my $class = shift;
  
      require Mac::Files;
      $class->_find_folder(Mac::Files::kMusicDocumentsFolderType(),);
  }
  
  sub my_pictures
  {
      my $class = shift;
  
      require Mac::Files;
      $class->_find_folder(Mac::Files::kPictureDocumentsFolderType(),);
  }
  
  sub my_videos
  {
      my $class = shift;
  
      require Mac::Files;
      $class->_find_folder(Mac::Files::kMovieDocumentsFolderType(),);
  }
  
  sub _find_folder
  {
      my $class = shift;
      my $name  = shift;
  
      require Mac::Files;
      my $folder = Mac::Files::FindFolder(Mac::Files::kUserDomain(), $name,);
      return undef unless defined $folder;
  
      unless (-d $folder)
      {
          # Make sure that symlinks resolve to directories.
          return undef unless -l $folder;
          my $dir = readlink $folder or return;
          return undef unless -d $dir;
      }
  
      return Cwd::abs_path($folder);
  }
  
  #####################################################################
  # Arbitrary User Methods
  
  sub users_home
  {
      my $class = shift;
      my $home  = $class->SUPER::users_home(@_);
      return defined $home ? Cwd::abs_path($home) : undef;
  }
  
  # in theory this can be done, but for now, let's cheat, since the
  # rest is Hard
  sub users_desktop
  {
      my ($class, $name) = @_;
      return undef if $name eq 'root';
      $class->_to_user($class->my_desktop, $name);
  }
  
  sub users_documents
  {
      my ($class, $name) = @_;
      return undef if $name eq 'root';
      $class->_to_user($class->my_documents, $name);
  }
  
  sub users_data
  {
      my ($class, $name) = @_;
      $class->_to_user($class->my_data, $name)
        || $class->users_home($name);
  }
  
  # cheap hack ... not entirely reliable, perhaps, but ... c'est la vie, since
  # there's really no other good way to do it at this time, that i know of -- pudge
  sub _to_user
  {
      my ($class, $path, $name) = @_;
      my $my_home    = $class->my_home;
      my $users_home = $class->users_home($name);
      defined $users_home or return undef;
      $path =~ s/^\Q$my_home/$users_home/;
      return $path;
  }
  
  1;
  
  =pod
  
  =head1 NAME
  
  File::HomeDir::Darwin - Find your home and other directories on Darwin (OS X)
  
  =head1 DESCRIPTION
  
  This module provides Darwin-specific implementations for determining
  common user directories.  In normal usage this module will always be
  used via L<File::HomeDir>.
  
  Note -- since this module requires Mac::Carbon and Mac::Carbon does
  not work with 64-bit perls, on such systems, File::HomeDir will try
  L<File::HomeDir::Darwin::Cocoa> and then fall back to the (pure Perl)
  L<File::HomeDir::Darwin>.
  
  =head1 SYNOPSIS
  
    use File::HomeDir;
  
    # Find directories for the current user
    $home    = File::HomeDir->my_home;      # /Users/mylogin
    $desktop = File::HomeDir->my_desktop;   # /Users/mylogin/Desktop
    $docs    = File::HomeDir->my_documents; # /Users/mylogin/Documents
    $music   = File::HomeDir->my_music;     # /Users/mylogin/Music
    $pics    = File::HomeDir->my_pictures;  # /Users/mylogin/Pictures
    $videos  = File::HomeDir->my_videos;    # /Users/mylogin/Movies
    $data    = File::HomeDir->my_data;      # /Users/mylogin/Library/Application Support
  
  =head1 TODO
  
  =over 4
  
  =item * Test with Mac OS (versions 7, 8, 9)
  
  =item * Some better way for users_* ?
  
  =back
FILE_HOMEDIR_DARWIN_CARBON

    $main::fatpacked{"File/HomeDir/Darwin/Cocoa.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'FILE_HOMEDIR_DARWIN_COCOA';
  package File::HomeDir::Darwin::Cocoa;
  
  use 5.008003;
  use strict;
  use warnings;
  use Cwd                   ();
  use Carp                  ();
  use File::HomeDir::Darwin ();
  
  use vars qw{$VERSION};
  use base "File::HomeDir::Darwin";
  
  BEGIN
  {
      $VERSION = '1.004';
  
      # Load early if in a forking environment and we have
      # prefork, or at run-time if not.
      local $@;                                     ## no critic (Variables::RequireInitializationForLocalVars)
      eval "use prefork 'Mac::SystemDirectory'";    ## no critic (ErrorHandling::RequireCheckingReturnValueOfEval)
  }
  
  #####################################################################
  # Current User Methods
  
  ## no critic qw(UnusedPrivateSubroutines)
  sub _guess_determined_home
  {
      my $class = shift;
  
      require Mac::SystemDirectory;
      my $home = Mac::SystemDirectory::HomeDirectory();
      $home ||= $class->SUPER::_guess_determined_home($@);
      return $home;
  }
  
  # from 10.4
  sub my_desktop
  {
      my $class = shift;
  
      require Mac::SystemDirectory;
      eval { $class->_find_folder(Mac::SystemDirectory::NSDesktopDirectory()) }
        || $class->SUPER::my_desktop;
  }
  
  # from 10.2
  sub my_documents
  {
      my $class = shift;
  
      require Mac::SystemDirectory;
      eval { $class->_find_folder(Mac::SystemDirectory::NSDocumentDirectory()) }
        || $class->SUPER::my_documents;
  }
  
  # from 10.4
  sub my_data
  {
      my $class = shift;
  
      require Mac::SystemDirectory;
      eval { $class->_find_folder(Mac::SystemDirectory::NSApplicationSupportDirectory()) }
        || $class->SUPER::my_data;
  }
  
  # from 10.6
  sub my_music
  {
      my $class = shift;
  
      require Mac::SystemDirectory;
      eval { $class->_find_folder(Mac::SystemDirectory::NSMusicDirectory()) }
        || $class->SUPER::my_music;
  }
  
  # from 10.6
  sub my_pictures
  {
      my $class = shift;
  
      require Mac::SystemDirectory;
      eval { $class->_find_folder(Mac::SystemDirectory::NSPicturesDirectory()) }
        || $class->SUPER::my_pictures;
  }
  
  # from 10.6
  sub my_videos
  {
      my $class = shift;
  
      require Mac::SystemDirectory;
      eval { $class->_find_folder(Mac::SystemDirectory::NSMoviesDirectory()) }
        || $class->SUPER::my_videos;
  }
  
  sub _find_folder
  {
      my $class = shift;
      my $name  = shift;
  
      require Mac::SystemDirectory;
      my $folder = Mac::SystemDirectory::FindDirectory($name);
      return undef unless defined $folder;
  
      unless (-d $folder)
      {
          # Make sure that symlinks resolve to directories.
          return undef unless -l $folder;
          my $dir = readlink $folder or return;
          return undef unless -d $dir;
      }
  
      return Cwd::abs_path($folder);
  }
  
  1;
  
  =pod
  
  =head1 NAME
  
  File::HomeDir::Darwin::Cocoa - Find your home and other directories on Darwin (OS X)
  
  =head1 DESCRIPTION
  
  This module provides Darwin-specific implementations for determining
  common user directories using Cocoa API through
  L<Mac::SystemDirectory>.  In normal usage this module will always be
  used via L<File::HomeDir>.
  
  Theoretically, this should return the same paths as both of the other
  Darwin drivers.
  
  Because this module requires L<Mac::SystemDirectory>, if the module
  is not installed, L<File::HomeDir> will fall back to L<File::HomeDir::Darwin>.
  
  =head1 SYNOPSIS
  
    use File::HomeDir;
    
    # Find directories for the current user
    $home    = File::HomeDir->my_home;      # /Users/mylogin
    $desktop = File::HomeDir->my_desktop;   # /Users/mylogin/Desktop
    $docs    = File::HomeDir->my_documents; # /Users/mylogin/Documents
    $music   = File::HomeDir->my_music;     # /Users/mylogin/Music
    $pics    = File::HomeDir->my_pictures;  # /Users/mylogin/Pictures
    $videos  = File::HomeDir->my_videos;    # /Users/mylogin/Movies
    $data    = File::HomeDir->my_data;      # /Users/mylogin/Library/Application Support
  
  =cut
FILE_HOMEDIR_DARWIN_COCOA

    $main::fatpacked{"File/HomeDir/Driver.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'FILE_HOMEDIR_DRIVER';
  package File::HomeDir::Driver;
  
  # Abstract base class that provides no functionality,
  # but confirms the class is a File::HomeDir driver class.
  
  use 5.008003;
  use strict;
  use warnings;
  use Carp ();
  
  use vars qw{$VERSION};
  
  BEGIN
  {
      $VERSION = '1.004';
  }
  
  sub my_home
  {
      Carp::croak("$_[0] does not implement compulsory method $_[1]");
  }
  
  1;
  
  =pod
  
  =head1 NAME
  
  File::HomeDir::Driver - Base class for all File::HomeDir drivers
  
  =head1 DESCRIPTION
  
  This module is the base class for all L<File::HomeDir> drivers, and must
  be inherited from to identify a class as a driver.
  
  It is primarily provided as a convenience for this specific identification
  purpose, as L<File::HomeDir> supports the specification of custom drivers
  and an C<-E<gt>isa> check is used during the loading of the driver.
  
  =head1 AUTHOR
  
  Adam Kennedy E<lt>adamk@cpan.orgE<gt>
  
  =head1 SEE ALSO
  
  L<File::HomeDir>
  
  =head1 COPYRIGHT
  
  Copyright 2009 - 2011 Adam Kennedy.
  
  This program is free software; you can redistribute
  it and/or modify it under the same terms as Perl itself.
  
  The full text of the license can be found in the
  LICENSE file included with this module.
  
  =cut
FILE_HOMEDIR_DRIVER

    $main::fatpacked{"File/HomeDir/FreeDesktop.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'FILE_HOMEDIR_FREEDESKTOP';
  package File::HomeDir::FreeDesktop;
  
  # Specific functionality for unixes running free desktops
  # compatible with (but not using) File-BaseDir-0.03
  
  # See POD at the end of the file for more documentation.
  
  use 5.008003;
  use strict;
  use warnings;
  use Carp                ();
  use File::Spec          ();
  use File::Which         ();
  use File::HomeDir::Unix ();
  
  use vars qw{$VERSION};
  use base "File::HomeDir::Unix";
  
  BEGIN
  {
      $VERSION = '1.004';
  }
  
  # xdg uses $ENV{XDG_CONFIG_HOME}/user-dirs.dirs to know where are the
  # various "my xxx" directories. That is a shell file. The official API
  # is the xdg-user-dir executable. It has no provision for assessing
  # the directories of a user that is different than the one we are
  # running under; the standard substitute user mechanisms are needed to
  # overcome this.
  
  my $xdgprog = File::Which::which('xdg-user-dir');
  
  sub _my
  {
      # No quoting because input is hard-coded and only comes from this module
      my $thingy = qx($xdgprog $_[1]);
      chomp $thingy;
      return $thingy;
  }
  
  # Simple stuff
  sub my_desktop   { shift->_my('DESKTOP') }
  sub my_documents { shift->_my('DOCUMENTS') }
  sub my_music     { shift->_my('MUSIC') }
  sub my_pictures  { shift->_my('PICTURES') }
  sub my_videos    { shift->_my('VIDEOS') }
  
  sub my_data
  {
      $ENV{XDG_DATA_HOME}
        or File::Spec->catdir(shift->my_home, qw{ .local share });
  }
  
  sub my_config
  {
      $ENV{XDG_CONFIG_HOME}
        or File::Spec->catdir(shift->my_home, qw{ .config });
  }
  
  # Custom locations (currently undocumented)
  sub my_download    { shift->_my('DOWNLOAD') }
  sub my_publicshare { shift->_my('PUBLICSHARE') }
  sub my_templates   { shift->_my('TEMPLATES') }
  
  sub my_cache
  {
      $ENV{XDG_CACHE_HOME}
        || File::Spec->catdir(shift->my_home, qw{ .cache });
  }
  
  #####################################################################
  # General User Methods
  
  sub users_desktop   { Carp::croak('The users_desktop method is not available on an XDG based system.'); }
  sub users_documents { Carp::croak('The users_documents method is not available on an XDG based system.'); }
  sub users_music     { Carp::croak('The users_music method is not available on an XDG based system.'); }
  sub users_pictures  { Carp::croak('The users_pictures method is not available on an XDG based system.'); }
  sub users_videos    { Carp::croak('The users_videos method is not available on an XDG based system.'); }
  sub users_data      { Carp::croak('The users_data method is not available on an XDG based system.'); }
  
  1;
  
  =pod
  
  =head1 NAME
  
  File::HomeDir::FreeDesktop - Find your home and other directories on FreeDesktop.org Unix
  
  =head1 DESCRIPTION
  
  This module provides implementations for determining common user
  directories.  In normal usage this module will always be
  used via L<File::HomeDir>.
  
  This module can operate only when the command C<xdg-user-dir> is available
  and executable, which is typically achieved by installed a package named
  C<xdg-user-dirs> or similar.
  
  One can find the latest spec at L<https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html>.
  
  =head1 SYNOPSIS
  
    use File::HomeDir;
    
    # Find directories for the current user
    $home     = File::HomeDir->my_home;        # /home/mylogin
    $desktop  = File::HomeDir->my_desktop;
    $docs     = File::HomeDir->my_documents;
    $music    = File::HomeDir->my_music;
    $pics     = File::HomeDir->my_pictures;
    $videos   = File::HomeDir->my_videos;
    $data     = File::HomeDir->my_data;
    $config   = File::HomeDir->my_config;
    
    # Some undocumented ones, expect they don't work - use with caution
    $download    = File::HomeDir->my_download;
    $publicshare = File::HomeDir->my_publicshare;
    $templates   = File::HomeDir->my_templates;
    $cache       = File::HomeDir->my_cache;
  
  =head1 AUTHORS
  
  Jerome Quelin E<lt>jquellin@cpan.org<gt>
  
  Adam Kennedy E<lt>adamk@cpan.orgE<gt>
  
  =head1 SEE ALSO
  
  L<File::HomeDir>, L<File::HomeDir::Win32> (legacy)
  
  =head1 COPYRIGHT
  
  Copyright 2009 - 2011 Jerome Quelin.
  
  Some parts copyright 2010 Adam Kennedy.
  
  This program is free software; you can redistribute
  it and/or modify it under the same terms as Perl itself.
  
  The full text of the license can be found in the
  LICENSE file included with this module.
  
  =cut
FILE_HOMEDIR_FREEDESKTOP

    $main::fatpacked{"File/HomeDir/MacOS9.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'FILE_HOMEDIR_MACOS9';
  package File::HomeDir::MacOS9;
  
  # Half-assed implementation for the legacy Mac OS9 operating system.
  # Provided mainly to provide legacy compatibility. May be removed at
  # a later date.
  
  use 5.008003;
  use strict;
  use warnings;
  use Carp                  ();
  use File::HomeDir::Driver ();
  
  use vars qw{$VERSION};
  use base "File::HomeDir::Driver";
  
  BEGIN
  {
      $VERSION = '1.004';
  }
  
  # Load early if in a forking environment and we have
  # prefork, or at run-time if not.
  SCOPE:
  {
      ## no critic qw(RequireInitializationForLocalVars, RequireCheckingReturnValueOfEval)
      local $@;
      eval "use prefork 'Mac::Files'";
  }
  
  #####################################################################
  # Current User Methods
  
  sub my_home
  {
      my $class = shift;
  
      # Try for $ENV{HOME} if we have it
      if (defined $ENV{HOME})
      {
          return $ENV{HOME};
      }
  
      ### DESPERATION SETS IN
  
      # We could use the desktop
    SCOPE:
      {
          ## no critic qw(RequireInitializationForLocalVars, RequireCheckingReturnValueOfEval)
          local $@;
          eval {
              my $home = $class->my_desktop;
              return $home if $home and -d $home;
          };
      }
  
      # Desperation on any platform
    SCOPE:
      {
          # On some platforms getpwuid dies if called at all
          local $SIG{'__DIE__'} = '';
          my $home = (getpwuid($<))[7];
          return $home if $home and -d $home;
      }
  
      Carp::croak("Could not locate current user's home directory");
  }
  
  sub my_desktop
  {
      my $class = shift;
  
      # Find the desktop via Mac::Files
      local $SIG{'__DIE__'} = '';
      require Mac::Files;
      my $home = Mac::Files::FindFolder(Mac::Files::kOnSystemDisk(), Mac::Files::kDesktopFolderType(),);
      return $home if $home and -d $home;
  
      Carp::croak("Could not locate current user's desktop");
  }
  
  #####################################################################
  # General User Methods
  
  sub users_home
  {
      my ($class, $name) = @_;
  
    SCOPE:
      {
          # On some platforms getpwnam dies if called at all
          local $SIG{'__DIE__'} = '';
          my $home = (getpwnam($name))[7];
          return $home if defined $home and -d $home;
      }
  
      Carp::croak("Failed to find home directory for user '$name'");
  }
  
  1;
  
  =pod
  
  =head1 NAME
  
  File::HomeDir::MacOS9 - Find your home and other directories on legacy Macintosh systems
  
  =head1 SYNOPSIS
  
    use File::HomeDir;
    
    # Find directories for the current user
    $home    = File::HomeDir->my_home;
    $desktop = File::HomeDir->my_desktop;
  
  =head1 DESCRIPTION
  
  This module provides implementations for determining common user
  directories on legacy Mac hosts. In normal usage this module will always be
  used via L<File::HomeDir>.
  
  This module is no longer actively maintained, and is included only for
  extreme back-compatibility.
  
  Only the C<my_home> and C<my_desktop> methods are supported.
  
  =head1 SUPPORT
  
  See the support section the main L<File::HomeDir> module.
  
  =head1 AUTHORS
  
  Adam Kennedy E<lt>adamk@cpan.orgE<gt>
  
  Sean M. Burke E<lt>sburke@cpan.orgE<gt>
  
  =head1 SEE ALSO
  
  L<File::HomeDir>
  
  =head1 COPYRIGHT
  
  Copyright 2005 - 2011 Adam Kennedy.
  
  Some parts copyright 2000 Sean M. Burke.
  
  This program is free software; you can redistribute
  it and/or modify it under the same terms as Perl itself.
  
  The full text of the license can be found in the
  LICENSE file included with this module.
  
  =cut
FILE_HOMEDIR_MACOS9

    $main::fatpacked{"File/HomeDir/Test.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'FILE_HOMEDIR_TEST';
  package File::HomeDir::Test;
  
  use 5.008003;
  use strict;
  use warnings;
  use Carp                  ();
  use File::Spec            ();
  use File::Temp            ();
  use File::HomeDir::Driver ();
  
  use vars qw{$VERSION %DIR $ENABLED};
  use base "File::HomeDir::Driver";
  
  BEGIN
  {
      $VERSION = '1.004';
      %DIR     = ();
      $ENABLED = 0;
  }
  
  # Special magic use in test scripts
  sub import
  {
      my $class = shift;
      Carp::croak "Attempted to initialise File::HomeDir::Test trice" if %DIR;
  
      # Fill the test directories
      my $BASE = File::Temp::tempdir(CLEANUP => 1);
      %DIR = map { $_ => File::Spec->catdir($BASE, $_) } qw{
        my_home
        my_desktop
        my_documents
        my_data
        my_music
        my_pictures
        my_videos
      };
  
      # Hijack HOME to the home directory
      $ENV{HOME} = $DIR{my_home};    ## no critic qw(LocalizedPunctuationVars)
  
      # Make File::HomeDir load us instead of the native driver
      $File::HomeDir::IMPLEMENTED_BY =    # Prevent a warning
        $File::HomeDir::IMPLEMENTED_BY = 'File::HomeDir::Test';
  
      # Ready to go
      $ENABLED = 1;
  }
  
  #####################################################################
  # Current User Methods
  
  sub my_home
  {
      mkdir($DIR{my_home}, oct(755)) unless -d $DIR{my_home};
      return $DIR{my_home};
  }
  
  sub my_desktop
  {
      mkdir($DIR{my_desktop}, oct(755)) unless -d $DIR{my_desktop};
      return $DIR{my_desktop};
  }
  
  sub my_documents
  {
      mkdir($DIR{my_documents}, oct(755)) unless -f $DIR{my_documents};
      return $DIR{my_documents};
  }
  
  sub my_data
  {
      mkdir($DIR{my_data}, oct(755)) unless -d $DIR{my_data};
      return $DIR{my_data};
  }
  
  sub my_music
  {
      mkdir($DIR{my_music}, oct(755)) unless -d $DIR{my_music};
      return $DIR{my_music};
  }
  
  sub my_pictures
  {
      mkdir($DIR{my_pictures}, oct(755)) unless -d $DIR{my_pictures};
      return $DIR{my_pictures};
  }
  
  sub my_videos
  {
      mkdir($DIR{my_videos}, oct(755)) unless -d $DIR{my_videos};
      return $DIR{my_videos};
  }
  
  sub users_home
  {
      return undef;
  }
  
  1;
  
  __END__
  
  =pod
  
  =head1 NAME
  
  File::HomeDir::Test - Prevent the accidental creation of user-owned files during testing
  
  =head1 SYNOPSIS
  
    use Test::More test => 1;
    use File::HomeDir::Test;
    use File::HomeDir;
  
  =head1 DESCRIPTION
  
  B<File::HomeDir::Test> is a L<File::HomeDir> driver intended for use in the test scripts
  of modules or applications that write files into user-owned directories.
  
  It is designed to prevent the pollution of user directories with files that are not part
  of the application install itself, but were created during testing. These files can leak
  state information from the tests into the run-time usage of an application, and on Unix
  systems also prevents tests (which may be executed as root via sudo) from writing files
  which cannot later be modified or removed by the regular user.
  
  =head1 SUPPORT
  
  See the support section of the main L<File::HomeDir> documentation.
  
  =head1 AUTHOR
  
  Adam Kennedy E<lt>adamk@cpan.orgE<gt>
  
  =head1 COPYRIGHT
  
  Copyright 2005 - 2011 Adam Kennedy.
  
  This program is free software; you can redistribute
  it and/or modify it under the same terms as Perl itself.
  
  The full text of the license can be found in the
  LICENSE file included with this module.
  
  =cut
FILE_HOMEDIR_TEST

    $main::fatpacked{"File/HomeDir/Unix.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'FILE_HOMEDIR_UNIX';
  package File::HomeDir::Unix;
  
  # See POD at the end of the file for documentation
  
  use 5.008003;
  use strict;
  use warnings;
  use Carp                  ();
  use File::HomeDir::Driver ();
  
  use vars qw{$VERSION};
  use base "File::HomeDir::Driver";
  
  BEGIN
  {
      $VERSION = '1.004';
  }
  
  #####################################################################
  # Current User Methods
  
  sub my_home
  {
      my $class = shift;
      my $home  = $class->_guess_home(@_);
  
      # On Unix in general, a non-existent home means "no home"
      # For example, "nobody"-like users might use /nonexistent
      if (defined $home and not -d $home)
      {
          $home = undef;
      }
  
      return $home;
  }
  
  sub _guess_env_home
  {
      my $class = shift;
      if (exists $ENV{HOME} and defined $ENV{HOME} and length $ENV{HOME})
      {
          return $ENV{HOME};
      }
  
      # This is from the original code, but I'm guessing
      # it means "login directory" and exists on some Unixes.
      if (exists $ENV{LOGDIR} and $ENV{LOGDIR})
      {
          return $ENV{LOGDIR};
      }
  
      return;
  }
  
  sub _guess_determined_home
  {
      my $class = shift;
  
      # Light desperation on any (Unixish) platform
    SCOPE:
      {
          my $home = (getpwuid($<))[7];
          return $home if $home and -d $home;
      }
  
      return;
  }
  
  sub _guess_home
  {
      my $class = shift;
      my $home  = $class->_guess_env_home($@);
      $home ||= $class->_guess_determined_home($@);
      return $home;
  }
  
  # On unix by default, everything is under the same folder
  sub my_desktop
  {
      shift->my_home;
  }
  
  sub my_documents
  {
      shift->my_home;
  }
  
  sub my_data
  {
      shift->my_home;
  }
  
  sub my_music
  {
      shift->my_home;
  }
  
  sub my_pictures
  {
      shift->my_home;
  }
  
  sub my_videos
  {
      shift->my_home;
  }
  
  #####################################################################
  # General User Methods
  
  sub users_home
  {
      my ($class, $name) = @_;
  
      # IF and only if we have getpwuid support, and the
      # name of the user is our own, shortcut to my_home.
      # This is needed to handle HOME environment settings.
      if ($name eq getpwuid($<))
      {
          return $class->my_home;
      }
  
    SCOPE:
      {
          my $home = (getpwnam($name))[7];
          return $home if $home and -d $home;
      }
  
      return undef;
  }
  
  sub users_desktop
  {
      shift->users_home(@_);
  }
  
  sub users_documents
  {
      shift->users_home(@_);
  }
  
  sub users_data
  {
      shift->users_home(@_);
  }
  
  sub users_music
  {
      shift->users_home(@_);
  }
  
  sub users_pictures
  {
      shift->users_home(@_);
  }
  
  sub users_videos
  {
      shift->users_home(@_);
  }
  
  1;
  
  =pod
  
  =head1 NAME
  
  File::HomeDir::Unix - Find your home and other directories on legacy Unix
  
  =head1 SYNOPSIS
  
    use File::HomeDir;
    
    # Find directories for the current user
    $home    = File::HomeDir->my_home;        # /home/mylogin
    $desktop = File::HomeDir->my_desktop;     # All of these will... 
    $docs    = File::HomeDir->my_documents;   # ...default to home...
    $music   = File::HomeDir->my_music;       # ...directory
    $pics    = File::HomeDir->my_pictures;    #
    $videos  = File::HomeDir->my_videos;      #
    $data    = File::HomeDir->my_data;        # 
  
  =head1 DESCRIPTION
  
  This module provides implementations for determining common user
  directories.  In normal usage this module will always be
  used via L<File::HomeDir>.
  
  =head1 SUPPORT
  
  See the support section the main L<File::HomeDir> module.
  
  =head1 AUTHORS
  
  Adam Kennedy E<lt>adamk@cpan.orgE<gt>
  
  Sean M. Burke E<lt>sburke@cpan.orgE<gt>
  
  =head1 SEE ALSO
  
  L<File::HomeDir>, L<File::HomeDir::Win32> (legacy)
  
  =head1 COPYRIGHT
  
  Copyright 2005 - 2011 Adam Kennedy.
  
  Some parts copyright 2000 Sean M. Burke.
  
  This program is free software; you can redistribute
  it and/or modify it under the same terms as Perl itself.
  
  The full text of the license can be found in the
  LICENSE file included with this module.
  
  =cut
FILE_HOMEDIR_UNIX

    $main::fatpacked{"File/HomeDir/Windows.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'FILE_HOMEDIR_WINDOWS';
  package File::HomeDir::Windows;
  
  # See POD at the end of the file for documentation
  
  use 5.008003;
  use strict;
  use warnings;
  use Carp                  ();
  use File::Spec            ();
  use File::HomeDir::Driver ();
  
  use vars qw{$VERSION};
  use base "File::HomeDir::Driver";
  
  BEGIN
  {
      $VERSION = '1.004';
  }
  
  sub CREATE () { 1 }
  
  #####################################################################
  # Current User Methods
  
  sub my_home
  {
      my $class = shift;
  
      # A lot of unix people and unix-derived tools rely on
      # the ability to overload HOME. We will support it too
      # so that they can replace raw HOME calls with File::HomeDir.
      if (exists $ENV{HOME} and defined $ENV{HOME} and length $ENV{HOME})
      {
          return $ENV{HOME};
      }
  
      # Do we have a user profile?
      if (exists $ENV{USERPROFILE} and $ENV{USERPROFILE})
      {
          return $ENV{USERPROFILE};
      }
  
      # Some Windows use something like $ENV{HOME}
      if (exists $ENV{HOMEDRIVE} and exists $ENV{HOMEPATH} and $ENV{HOMEDRIVE} and $ENV{HOMEPATH})
      {
          return File::Spec->catpath($ENV{HOMEDRIVE}, $ENV{HOMEPATH}, '',);
      }
  
      return undef;
  }
  
  sub my_desktop
  {
      my $class = shift;
  
      # The most correct way to find the desktop
    SCOPE:
      {
          require Win32;
          my $dir = Win32::GetFolderPath(Win32::CSIDL_DESKTOP(), CREATE);
          return $dir if $dir and $class->_d($dir);
      }
  
      # MSWindows sets WINDIR, MS WinNT sets USERPROFILE.
      foreach my $e ('USERPROFILE', 'WINDIR')
      {
          next unless $ENV{$e};
          my $desktop = File::Spec->catdir($ENV{$e}, 'Desktop');
          return $desktop if $desktop and $class->_d($desktop);
      }
  
      # As a last resort, try some hard-wired values
      foreach my $fixed (
          # The reason there are both types of slash here is because
          # this set of paths has been kept from the original version
          # of File::HomeDir::Win32 (before it was rewritten).
          # I can only assume this is Cygwin-related stuff.
          "C:\\windows\\desktop",
          "C:\\win95\\desktop",
          "C:/win95/desktop",
          "C:/windows/desktop",
        )
      {
          return $fixed if $class->_d($fixed);
      }
  
      return undef;
  }
  
  sub my_documents
  {
      my $class = shift;
  
      # The most correct way to find my documents
    SCOPE:
      {
          require Win32;
          my $dir = Win32::GetFolderPath(Win32::CSIDL_PERSONAL(), CREATE);
          return $dir if $dir and $class->_d($dir);
      }
  
      return undef;
  }
  
  sub my_data
  {
      my $class = shift;
  
      # The most correct way to find my documents
    SCOPE:
      {
          require Win32;
          my $dir = Win32::GetFolderPath(Win32::CSIDL_LOCAL_APPDATA(), CREATE);
          return $dir if $dir and $class->_d($dir);
      }
  
      return undef;
  }
  
  sub my_music
  {
      my $class = shift;
  
      # The most correct way to find my music
    SCOPE:
      {
          require Win32;
          my $dir = Win32::GetFolderPath(Win32::CSIDL_MYMUSIC(), CREATE);
          return $dir if $dir and $class->_d($dir);
      }
  
      return undef;
  }
  
  sub my_pictures
  {
      my $class = shift;
  
      # The most correct way to find my pictures
    SCOPE:
      {
          require Win32;
          my $dir = Win32::GetFolderPath(Win32::CSIDL_MYPICTURES(), CREATE);
          return $dir if $dir and $class->_d($dir);
      }
  
      return undef;
  }
  
  sub my_videos
  {
      my $class = shift;
  
      # The most correct way to find my videos
    SCOPE:
      {
          require Win32;
          my $dir = Win32::GetFolderPath(Win32::CSIDL_MYVIDEO(), CREATE);
          return $dir if $dir and $class->_d($dir);
      }
  
      return undef;
  }
  
  # Special case version of -d
  sub _d
  {
      my $self = shift;
      my $path = shift;
  
      # Window can legally return a UNC path from GetFolderPath.
      # Not only is the meaning of -d complicated in this situation,
      # but even on a local network calling -d "\\\\cifs\\path" can
      # take several seconds. UNC can also do even weirder things,
      # like launching processes and such.
      # To avoid various crazy bugs caused by this, we do NOT attempt
      # to validate UNC paths at all so that the code that is calling
      # us has an opportunity to take special actions without our
      # blundering getting in the way.
      if ($path =~ /\\\\/)
      {
          return 1;
      }
  
      # Otherwise do a stat as normal
      return -d $path;
  }
  
  1;
  
  =pod
  
  =head1 NAME
  
  File::HomeDir::Windows - Find your home and other directories on Windows
  
  =head1 SYNOPSIS
  
    use File::HomeDir;
    
    # Find directories for the current user (eg. using Windows XP Professional)
    $home    = File::HomeDir->my_home;        # C:\Documents and Settings\mylogin
    $desktop = File::HomeDir->my_desktop;     # C:\Documents and Settings\mylogin\Desktop
    $docs    = File::HomeDir->my_documents;   # C:\Documents and Settings\mylogin\My Documents
    $music   = File::HomeDir->my_music;       # C:\Documents and Settings\mylogin\My Documents\My Music
    $pics    = File::HomeDir->my_pictures;    # C:\Documents and Settings\mylogin\My Documents\My Pictures
    $videos  = File::HomeDir->my_videos;      # C:\Documents and Settings\mylogin\My Documents\My Video
    $data    = File::HomeDir->my_data;        # C:\Documents and Settings\mylogin\Local Settings\Application Data
  
  =head1 DESCRIPTION
  
  This module provides Windows-specific implementations for determining
  common user directories.  In normal usage this module will always be
  used via L<File::HomeDir>.
  
  Internally this module will use L<Win32>::GetFolderPath to fetch the location
  of your directories. As a result of this, in certain unusual situations
  (usually found inside large organizations) the methods may return UNC paths
  such as C<\\cifs.local\home$>.
  
  If your application runs on Windows and you want to have it work comprehensively
  everywhere, you may need to implement your own handling for these paths as they
  can cause strange behaviour.
  
  For example, stat calls to UNC paths may work but block for several seconds, but
  opendir() may not be able to read any files (creating the appearance of an existing
  but empty directory).
  
  To avoid complicating the problem any further, in the rare situation that a UNC path
  is returned by C<GetFolderPath> the usual -d validation checks will B<not> be done.
  
  =head1 SUPPORT
  
  See the support section the main L<File::HomeDir> module.
  
  =head1 AUTHORS
  
  Adam Kennedy E<lt>adamk@cpan.orgE<gt>
  
  Sean M. Burke E<lt>sburke@cpan.orgE<gt>
  
  =head1 SEE ALSO
  
  L<File::HomeDir>, L<File::HomeDir::Win32> (legacy)
  
  =head1 COPYRIGHT
  
  Copyright 2005 - 2011 Adam Kennedy.
  
  Some parts copyright 2000 Sean M. Burke.
  
  This program is free software; you can redistribute
  it and/or modify it under the same terms as Perl itself.
  
  The full text of the license can be found in the
  LICENSE file included with this module.
  
  =cut
FILE_HOMEDIR_WINDOWS

    $main::fatpacked{"File/Listing.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'FILE_LISTING';
  package File::Listing;
  
  sub Version { $VERSION; }
  $VERSION = "6.04";
  
  require Exporter;
  @ISA = qw(Exporter);
  @EXPORT = qw(parse_dir);
  
  use strict;
  
  use Carp ();
  use HTTP::Date qw(str2time);
  
  
  
  sub parse_dir ($;$$$)
  {
     my($dir, $tz, $fstype, $error) = @_;
  
     $fstype ||= 'unix';
     $fstype = "File::Listing::" . lc $fstype;
  
     my @args = $_[0];
     push(@args, $tz) if(@_ >= 2);
     push(@args, $error) if(@_ >= 4);
  
     $fstype->parse(@args);
  }
  
  
  sub line { Carp::croak("Not implemented yet"); }
  sub init { } # Dummy sub
  
  
  sub file_mode ($)
  {
      Carp::croak("Input to file_mode() must be a 10 character string.")
          unless length($_[0]) == 10;
  
      # This routine was originally borrowed from Graham Barr's
      # Net::FTP package.
  
      local $_ = shift;
      my $mode = 0;
      my($type);
  
      s/^(.)// and $type = $1;
  
      # When the set-group-ID bit (file mode bit 02000) is set, and the group
      # execution bit (file mode bit 00020) is unset, and it is a regular file,
      # some implementations of `ls' use the letter `S', others use `l' or `L'.
      # Convert this `S'.
  
      s/[Ll](...)$/S$1/;
  
      while (/(.)/g) {
  	$mode <<= 1;
  	$mode |= 1 if $1 ne "-" &&
  		      $1 ne 'S' &&
  		      $1 ne 'T';
      }
  
      $mode |= 0004000 if /^..s....../i;
      $mode |= 0002000 if /^.....s.../i;
      $mode |= 0001000 if /^........t/i;
  
      # De facto standard definitions. From 'stat.h' on Solaris 9.
  
      $type eq "p" and $mode |= 0010000 or        # fifo
      $type eq "c" and $mode |= 0020000 or        # character special
      $type eq "d" and $mode |= 0040000 or        # directory
      $type eq "b" and $mode |= 0060000 or        # block special
      $type eq "-" and $mode |= 0100000 or        # regular
      $type eq "l" and $mode |= 0120000 or        # symbolic link
      $type eq "s" and $mode |= 0140000 or        # socket
      $type eq "D" and $mode |= 0150000 or        # door
        Carp::croak("Unknown file type: $type");
  
      $mode;
  }
  
  
  sub parse
  {
     my($pkg, $dir, $tz, $error) = @_;
  
     # First let's try to determine what kind of dir parameter we have
     # received.  We allow both listings, reference to arrays and
     # file handles to read from.
  
     if (ref($dir) eq 'ARRAY') {
         # Already splitted up
     }
     elsif (ref($dir) eq 'GLOB') {
         # A file handle
     }
     elsif (ref($dir)) {
        Carp::croak("Illegal argument to parse_dir()");
     }
     elsif ($dir =~ /^\*\w+(::\w+)+$/) {
        # This scalar looks like a file handle, so we assume it is
     }
     else {
        # A normal scalar listing
        $dir = [ split(/\n/, $dir) ];
     }
  
     $pkg->init();
  
     my @files = ();
     if (ref($dir) eq 'ARRAY') {
         for (@$dir) {
  	   push(@files, $pkg->line($_, $tz, $error));
         }
     }
     else {
         local($_);
         while (<$dir>) {
  	   chomp;
  	   push(@files, $pkg->line($_, $tz, $error));
         }
     }
     wantarray ? @files : \@files;
  }
  
  
  
  package File::Listing::unix;
  
  use HTTP::Date qw(str2time);
  
  # A place to remember current directory from last line parsed.
  use vars qw($curdir @ISA);
  
  @ISA = qw(File::Listing);
  
  
  
  sub init
  {
      $curdir = '';
  }
  
  
  sub line
  {
      shift; # package name
      local($_) = shift;
      my($tz, $error) = @_;
  
      s/\015//g;
      #study;
  
      my ($kind, $size, $date, $name);
      if (($kind, $size, $date, $name) =
  	/^([\-FlrwxsStTdD]{10})                   # Type and permission bits
  	 .*                                       # Graps
  	 \D(\d+)                                  # File size
  	 \s+                                      # Some space
  	 (\w{3}\s+\d+\s+(?:\d{1,2}:\d{2}|\d{4})|\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2})  # Date
  	 \s+                                      # Some more space
  	 (.*)$                                    # File name
  	/x )
  
      {
  	return if $name eq '.' || $name eq '..';
  	$name = "$curdir/$name" if length $curdir;
  	my $type = '?';
  	if ($kind =~ /^l/ && $name =~ /(.*) -> (.*)/ ) {
  	    $name = $1;
  	    $type = "l $2";
  	}
  	elsif ($kind =~ /^[\-F]/) { # (hopefully) a regular file
  	    $type = 'f';
  	}
  	elsif ($kind =~ /^[dD]/) {
  	    $type = 'd';
  	    $size = undef;  # Don't believe the reported size
  	}
  	return [$name, $type, $size, str2time($date, $tz), 
                File::Listing::file_mode($kind)];
  
      }
      elsif (/^(.+):$/ && !/^[dcbsp].*\s.*\s.*:$/ ) {
  	my $dir = $1;
  	return () if $dir eq '.';
  	$curdir = $dir;
  	return ();
      }
      elsif (/^[Tt]otal\s+(\d+)$/ || /^\s*$/) {
  	return ();
      }
      elsif (/not found/    || # OSF1, HPUX, and SunOS return
               # "$file not found"
               /No such file/ || # IRIX returns
               # "UX:ls: ERROR: Cannot access $file: No such file or directory"
                                 # Solaris returns
               # "$file: No such file or directory"
               /cannot find/     # Windows NT returns
               # "The system cannot find the path specified."
               ) {
  	return () unless defined $error;
  	&$error($_) if ref($error) eq 'CODE';
  	warn "Error: $_\n" if $error eq 'warn';
  	return ();
      }
      elsif ($_ eq '') {       # AIX, and Linux return nothing
  	return () unless defined $error;
  	&$error("No such file or directory") if ref($error) eq 'CODE';
  	warn "Warning: No such file or directory\n" if $error eq 'warn';
  	return ();
      }
      else {
          # parse failed, check if the dosftp parse understands it
          File::Listing::dosftp->init();
          return(File::Listing::dosftp->line($_,$tz,$error));
      }
  
  }
  
  
  
  package File::Listing::dosftp;
  
  use HTTP::Date qw(str2time);
  
  # A place to remember current directory from last line parsed.
  use vars qw($curdir @ISA);
  
  @ISA = qw(File::Listing);
  
  
  
  sub init
  {
      $curdir = '';
  }
  
  
  sub line
  {
      shift; # package name
      local($_) = shift;
      my($tz, $error) = @_;
  
      s/\015//g;
  
      my ($date, $size_or_dir, $name, $size);
  
      # 02-05-96  10:48AM                 1415 src.slf
      # 09-10-96  09:18AM       <DIR>          sl_util
      if (($date, $size_or_dir, $name) =
          /^(\d\d-\d\d-\d\d\s+\d\d:\d\d\wM)         # Date and time info
           \s+                                      # Some space
           (<\w{3}>|\d+)                            # Dir or Size
           \s+                                      # Some more space
           (.+)$                                    # File name
          /x )
      {
  	return if $name eq '.' || $name eq '..';
  	$name = "$curdir/$name" if length $curdir;
  	my $type = '?';
  	if ($size_or_dir eq '<DIR>') {
  	    $type = "d";
              $size = ""; # directories have no size in the pc listing
          }
          else {
  	    $type = 'f';
              $size = $size_or_dir;
  	}
  	return [$name, $type, $size, str2time($date, $tz), undef];
      }
      else {
  	return () unless defined $error;
  	&$error($_) if ref($error) eq 'CODE';
  	warn "Can't parse: $_\n" if $error eq 'warn';
  	return ();
      }
  
  }
  
  
  
  package File::Listing::vms;
  @File::Listing::vms::ISA = qw(File::Listing);
  
  package File::Listing::netware;
  @File::Listing::netware::ISA = qw(File::Listing);
  
  
  
  package File::Listing::apache;
  
  use vars qw(@ISA);
  
  @ISA = qw(File::Listing);
  
  
  sub init { }
  
  
  sub line {
      shift; # package name
      local($_) = shift;
      my($tz, $error) = @_; # ignored for now...
  
      s!</?t[rd][^>]*>! !g;  # clean away various table stuff
      if (m!<A\s+HREF=\"([^\"]+)\">.*</A>.*?(\d+)-([a-zA-Z]+|\d+)-(\d+)\s+(\d+):(\d+)\s+(?:([\d\.]+[kMG]?|-))!i) {
  	my($filename, $filesize) = ($1, $7);
  	my($d,$m,$y, $H,$M) = ($2,$3,$4,$5,$6);
  	if ($m =~ /^\d+$/) {
  	    ($d,$y) = ($y,$d) # iso date
  	}
  	else {
  	    $m = _monthabbrev_number($m);
  	}
  
  	$filesize = 0 if $filesize eq '-';
  	if ($filesize =~ s/k$//i) {
  	    $filesize *= 1024;
  	}
  	elsif ($filesize =~ s/M$//) {
  	    $filesize *= 1024*1024;
  	}
  	elsif ($filesize =~ s/G$//) {
  	    $filesize *= 1024*1024*1024;
  	}
  	$filesize = int $filesize;
  
  	require Time::Local;
  	my $filetime = Time::Local::timelocal(0,$M,$H,$d,$m-1,_guess_year($y)-1900);
  	my $filetype = ($filename =~ s|/$|| ? "d" : "f");
  	return [$filename, $filetype, $filesize, $filetime, undef];
      }
  
      return ();
  }
  
  
  sub _guess_year {
      my $y = shift;
      if ($y >= 90) {
  	$y = 1900+$y;
      }
      elsif ($y < 100) {
  	$y = 2000+$y;
      }
      $y;
  }
  
  
  sub _monthabbrev_number {
      my $mon = shift;
      +{'Jan' => 1,
        'Feb' => 2,
        'Mar' => 3,
        'Apr' => 4,
        'May' => 5,
        'Jun' => 6,
        'Jul' => 7,
        'Aug' => 8,
        'Sep' => 9,
        'Oct' => 10,
        'Nov' => 11,
        'Dec' => 12,
       }->{$mon};
  }
  
  
  1;
  
  __END__
  
  =head1 NAME
  
  File::Listing - parse directory listing
  
  =head1 SYNOPSIS
  
   use File::Listing qw(parse_dir);
   $ENV{LANG} = "C";  # dates in non-English locales not supported
   for (parse_dir(`ls -l`)) {
       ($name, $type, $size, $mtime, $mode) = @$_;
       next if $type ne 'f'; # plain file
       #...
   }
  
   # directory listing can also be read from a file
   open(LISTING, "zcat ls-lR.gz|");
   $dir = parse_dir(\*LISTING, '+0000');
  
  =head1 DESCRIPTION
  
  This module exports a single function called parse_dir(), which can be
  used to parse directory listings.
  
  The first parameter to parse_dir() is the directory listing to parse.
  It can be a scalar, a reference to an array of directory lines or a
  glob representing a filehandle to read the directory listing from.
  
  The second parameter is the time zone to use when parsing time stamps
  in the listing. If this value is undefined, then the local time zone is
  assumed.
  
  The third parameter is the type of listing to assume.  Currently
  supported formats are 'unix', 'apache' and 'dosftp'.  The default
  value is 'unix'.  Ideally, the listing type should be determined
  automatically.
  
  The fourth parameter specifies how unparseable lines should be treated.
  Values can be 'ignore', 'warn' or a code reference.  Warn means that
  the perl warn() function will be called.  If a code reference is
  passed, then this routine will be called and the return value from it
  will be incorporated in the listing.  The default is 'ignore'.
  
  Only the first parameter is mandatory.
  
  The return value from parse_dir() is a list of directory entries.  In
  a scalar context the return value is a reference to the list.  The
  directory entries are represented by an array consisting of [
  $filename, $filetype, $filesize, $filetime, $filemode ].  The
  $filetype value is one of the letters 'f', 'd', 'l' or '?'.  The
  $filetime value is the seconds since Jan 1, 1970.  The
  $filemode is a bitmask like the mode returned by stat().
  
  =head1 COPYRIGHT
  
  Copyright 1996-2010, Gisle Aas
  
  Based on lsparse.pl (from Lee McLoughlin's ftp mirror package) and
  Net::FTP's parse_dir (Graham Barr).
  
  This library is free software; you can redistribute it and/or
  modify it under the same terms as Perl itself.
FILE_LISTING

    $main::fatpacked{"File/Path.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'FILE_PATH';
  package File::Path;
  
  use 5.005_04;
  use strict;
  
  use Cwd 'getcwd';
  use File::Basename ();
  use File::Spec     ();
  
  BEGIN {
      if ( $] < 5.006 ) {
  
          # can't say 'opendir my $dh, $dirname'
          # need to initialise $dh
          eval 'use Symbol';
      }
  }
  
  use Exporter ();
  use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);
  $VERSION   = '2.16';
  $VERSION   = eval $VERSION;
  @ISA       = qw(Exporter);
  @EXPORT    = qw(mkpath rmtree);
  @EXPORT_OK = qw(make_path remove_tree);
  
  BEGIN {
    for (qw(VMS MacOS MSWin32 os2)) {
      no strict 'refs';
      *{"_IS_\U$_"} = $^O eq $_ ? sub () { 1 } : sub () { 0 };
    }
  
    # These OSes complain if you want to remove a file that you have no
    # write permission to:
    *_FORCE_WRITABLE = (
      grep { $^O eq $_ } qw(amigaos dos epoc MSWin32 MacOS os2)
    ) ? sub () { 1 } : sub () { 0 };
  
    # Unix-like systems need to stat each directory in order to detect
    # race condition. MS-Windows is immune to this particular attack.
    *_NEED_STAT_CHECK = !(_IS_MSWIN32()) ? sub () { 1 } : sub () { 0 };
  }
  
  sub _carp {
      require Carp;
      goto &Carp::carp;
  }
  
  sub _croak {
      require Carp;
      goto &Carp::croak;
  }
  
  sub _error {
      my $arg     = shift;
      my $message = shift;
      my $object  = shift;
  
      if ( $arg->{error} ) {
          $object = '' unless defined $object;
          $message .= ": $!" if $!;
          push @{ ${ $arg->{error} } }, { $object => $message };
      }
      else {
          _carp( defined($object) ? "$message for $object: $!" : "$message: $!" );
      }
  }
  
  sub __is_arg {
      my ($arg) = @_;
  
      # If client code blessed an array ref to HASH, this will not work
      # properly. We could have done $arg->isa() wrapped in eval, but
      # that would be expensive. This implementation should suffice.
      # We could have also used Scalar::Util:blessed, but we choose not
      # to add this dependency
      return ( ref $arg eq 'HASH' );
  }
  
  sub make_path {
      push @_, {} unless @_ and __is_arg( $_[-1] );
      goto &mkpath;
  }
  
  sub mkpath {
      my $old_style = !( @_ and __is_arg( $_[-1] ) );
  
      my $data;
      my $paths;
  
      if ($old_style) {
          my ( $verbose, $mode );
          ( $paths, $verbose, $mode ) = @_;
          $paths = [$paths] unless UNIVERSAL::isa( $paths, 'ARRAY' );
          $data->{verbose} = $verbose;
          $data->{mode} = defined $mode ? $mode : oct '777';
      }
      else {
          my %args_permitted = map { $_ => 1 } ( qw|
              chmod
              error
              group
              mask
              mode
              owner
              uid
              user
              verbose
          | );
          my %not_on_win32_args = map { $_ => 1 } ( qw|
              group
              owner
              uid
              user
          | );
          my @bad_args = ();
          my @win32_implausible_args = ();
          my $arg = pop @_;
          for my $k (sort keys %{$arg}) {
              if (! $args_permitted{$k}) {
                  push @bad_args, $k;
              }
              elsif ($not_on_win32_args{$k} and _IS_MSWIN32) {
                  push @win32_implausible_args, $k;
              }
              else {
                  $data->{$k} = $arg->{$k};
              }
          }
          _carp("Unrecognized option(s) passed to mkpath() or make_path(): @bad_args")
              if @bad_args;
          _carp("Option(s) implausible on Win32 passed to mkpath() or make_path(): @win32_implausible_args")
              if @win32_implausible_args;
          $data->{mode} = delete $data->{mask} if exists $data->{mask};
          $data->{mode} = oct '777' unless exists $data->{mode};
          ${ $data->{error} } = [] if exists $data->{error};
          unless (@win32_implausible_args) {
              $data->{owner} = delete $data->{user} if exists $data->{user};
              $data->{owner} = delete $data->{uid}  if exists $data->{uid};
              if ( exists $data->{owner} and $data->{owner} =~ /\D/ ) {
                  my $uid = ( getpwnam $data->{owner} )[2];
                  if ( defined $uid ) {
                      $data->{owner} = $uid;
                  }
                  else {
                      _error( $data,
                              "unable to map $data->{owner} to a uid, ownership not changed"
                            );
                      delete $data->{owner};
                  }
              }
              if ( exists $data->{group} and $data->{group} =~ /\D/ ) {
                  my $gid = ( getgrnam $data->{group} )[2];
                  if ( defined $gid ) {
                      $data->{group} = $gid;
                  }
                  else {
                      _error( $data,
                              "unable to map $data->{group} to a gid, group ownership not changed"
                      );
                      delete $data->{group};
                  }
              }
              if ( exists $data->{owner} and not exists $data->{group} ) {
                  $data->{group} = -1;    # chown will leave group unchanged
              }
              if ( exists $data->{group} and not exists $data->{owner} ) {
                  $data->{owner} = -1;    # chown will leave owner unchanged
              }
          }
          $paths = [@_];
      }
      return _mkpath( $data, $paths );
  }
  
  sub _mkpath {
      my $data   = shift;
      my $paths = shift;
  
      my ( @created );
      foreach my $path ( @{$paths} ) {
          next unless defined($path) and length($path);
          $path .= '/' if _IS_OS2 and $path =~ /^\w:\z/s; # feature of CRT
  
          # Logic wants Unix paths, so go with the flow.
          if (_IS_VMS) {
              next if $path eq '/';
              $path = VMS::Filespec::unixify($path);
          }
          next if -d $path;
          my $parent = File::Basename::dirname($path);
          # Coverage note:  It's not clear how we would test the condition:
          # '-d $parent or $path eq $parent'
          unless ( -d $parent or $path eq $parent ) {
              push( @created, _mkpath( $data, [$parent] ) );
          }
          print "mkdir $path\n" if $data->{verbose};
          if ( mkdir( $path, $data->{mode} ) ) {
              push( @created, $path );
              if ( exists $data->{owner} ) {
  
                  # NB: $data->{group} guaranteed to be set during initialisation
                  if ( !chown $data->{owner}, $data->{group}, $path ) {
                      _error( $data,
                          "Cannot change ownership of $path to $data->{owner}:$data->{group}"
                      );
                  }
              }
              if ( exists $data->{chmod} ) {
                  # Coverage note:  It's not clear how we would trigger the next
                  # 'if' block.  Failure of 'chmod' might first result in a
                  # system error: "Permission denied".
                  if ( !chmod $data->{chmod}, $path ) {
                      _error( $data,
                          "Cannot change permissions of $path to $data->{chmod}" );
                  }
              }
          }
          else {
              my $save_bang = $!;
  
              # From 'perldoc perlvar': $EXTENDED_OS_ERROR ($^E) is documented
              # as:
              # Error information specific to the current operating system. At the
              # moment, this differs from "$!" under only VMS, OS/2, and Win32
              # (and for MacPerl). On all other platforms, $^E is always just the
              # same as $!.
  
              my ( $e, $e1 ) = ( $save_bang, $^E );
              $e .= "; $e1" if $e ne $e1;
  
              # allow for another process to have created it meanwhile
              if ( ! -d $path ) {
                  $! = $save_bang;
                  if ( $data->{error} ) {
                      push @{ ${ $data->{error} } }, { $path => $e };
                  }
                  else {
                      _croak("mkdir $path: $e");
                  }
              }
          }
      }
      return @created;
  }
  
  sub remove_tree {
      push @_, {} unless @_ and __is_arg( $_[-1] );
      goto &rmtree;
  }
  
  sub _is_subdir {
      my ( $dir, $test ) = @_;
  
      my ( $dv, $dd ) = File::Spec->splitpath( $dir,  1 );
      my ( $tv, $td ) = File::Spec->splitpath( $test, 1 );
  
      # not on same volume
      return 0 if $dv ne $tv;
  
      my @d = File::Spec->splitdir($dd);
      my @t = File::Spec->splitdir($td);
  
      # @t can't be a subdir if it's shorter than @d
      return 0 if @t < @d;
  
      return join( '/', @d ) eq join( '/', splice @t, 0, +@d );
  }
  
  sub rmtree {
      my $old_style = !( @_ and __is_arg( $_[-1] ) );
  
      my ($arg, $data, $paths);
  
      if ($old_style) {
          my ( $verbose, $safe );
          ( $paths, $verbose, $safe ) = @_;
          $data->{verbose} = $verbose;
          $data->{safe} = defined $safe ? $safe : 0;
  
          if ( defined($paths) and length($paths) ) {
              $paths = [$paths] unless UNIVERSAL::isa( $paths, 'ARRAY' );
          }
          else {
              _carp("No root path(s) specified\n");
              return 0;
          }
      }
      else {
          my %args_permitted = map { $_ => 1 } ( qw|
              error
              keep_root
              result
              safe
              verbose
          | );
          my @bad_args = ();
          my $arg = pop @_;
          for my $k (sort keys %{$arg}) {
              if (! $args_permitted{$k}) {
                  push @bad_args, $k;
              }
              else {
                  $data->{$k} = $arg->{$k};
              }
          }
          _carp("Unrecognized option(s) passed to remove_tree(): @bad_args")
              if @bad_args;
          ${ $data->{error} }  = [] if exists $data->{error};
          ${ $data->{result} } = [] if exists $data->{result};
  
          # Wouldn't it make sense to do some validation on @_ before assigning
          # to $paths here?
          # In the $old_style case we guarantee that each path is both defined
          # and non-empty.  We don't check that here, which means we have to
          # check it later in the first condition in this line:
          #     if ( $ortho_root_length && _is_subdir( $ortho_root, $ortho_cwd ) ) {
          # Granted, that would be a change in behavior for the two
          # non-old-style interfaces.
  
          $paths = [@_];
      }
  
      $data->{prefix} = '';
      $data->{depth}  = 0;
  
      my @clean_path;
      $data->{cwd} = getcwd() or do {
          _error( $data, "cannot fetch initial working directory" );
          return 0;
      };
      for ( $data->{cwd} ) { /\A(.*)\Z/s; $_ = $1 }    # untaint
  
      for my $p (@$paths) {
  
          # need to fixup case and map \ to / on Windows
          my $ortho_root = _IS_MSWIN32 ? _slash_lc($p) : $p;
          my $ortho_cwd =
            _IS_MSWIN32 ? _slash_lc( $data->{cwd} ) : $data->{cwd};
          my $ortho_root_length = length($ortho_root);
          $ortho_root_length-- if _IS_VMS;   # don't compare '.' with ']'
          if ( $ortho_root_length && _is_subdir( $ortho_root, $ortho_cwd ) ) {
              local $! = 0;
              _error( $data, "cannot remove path when cwd is $data->{cwd}", $p );
              next;
          }
  
          if (_IS_MACOS) {
              $p = ":$p" unless $p =~ /:/;
              $p .= ":" unless $p =~ /:\z/;
          }
          elsif ( _IS_MSWIN32 ) {
              $p =~ s{[/\\]\z}{};
          }
          else {
              $p =~ s{/\z}{};
          }
          push @clean_path, $p;
      }
  
      @{$data}{qw(device inode)} = ( lstat $data->{cwd} )[ 0, 1 ] or do {
          _error( $data, "cannot stat initial working directory", $data->{cwd} );
          return 0;
      };
  
      return _rmtree( $data, \@clean_path );
  }
  
  sub _rmtree {
      my $data   = shift;
      my $paths = shift;
  
      my $count  = 0;
      my $curdir = File::Spec->curdir();
      my $updir  = File::Spec->updir();
  
      my ( @files, $root );
    ROOT_DIR:
      foreach my $root (@$paths) {
  
          # since we chdir into each directory, it may not be obvious
          # to figure out where we are if we generate a message about
          # a file name. We therefore construct a semi-canonical
          # filename, anchored from the directory being unlinked (as
          # opposed to being truly canonical, anchored from the root (/).
  
          my $canon =
            $data->{prefix}
            ? File::Spec->catfile( $data->{prefix}, $root )
            : $root;
  
          my ( $ldev, $lino, $perm ) = ( lstat $root )[ 0, 1, 2 ]
            or next ROOT_DIR;
  
          if ( -d _ ) {
              $root = VMS::Filespec::vmspath( VMS::Filespec::pathify($root) )
                if _IS_VMS;
  
              if ( !chdir($root) ) {
  
                  # see if we can escalate privileges to get in
                  # (e.g. funny protection mask such as -w- instead of rwx)
                  # This uses fchmod to avoid traversing outside of the proper
                  # location (CVE-2017-6512)
                  my $root_fh;
                  if (open($root_fh, '<', $root)) {
                      my ($fh_dev, $fh_inode) = (stat $root_fh )[0,1];
                      $perm &= oct '7777';
                      my $nperm = $perm | oct '700';
                      local $@;
                      if (
                          !(
                              $data->{safe}
                             or $nperm == $perm
                             or !-d _
                             or $fh_dev ne $ldev
                             or $fh_inode ne $lino
                             or eval { chmod( $nperm, $root_fh ) }
                          )
                        )
                      {
                          _error( $data,
                              "cannot make child directory read-write-exec", $canon );
                          next ROOT_DIR;
                      }
                      close $root_fh;
                  }
                  if ( !chdir($root) ) {
                      _error( $data, "cannot chdir to child", $canon );
                      next ROOT_DIR;
                  }
              }
  
              my ( $cur_dev, $cur_inode, $perm ) = ( stat $curdir )[ 0, 1, 2 ]
                or do {
                  _error( $data, "cannot stat current working directory", $canon );
                  next ROOT_DIR;
                };
  
              if (_NEED_STAT_CHECK) {
                  ( $ldev eq $cur_dev and $lino eq $cur_inode )
                    or _croak(
  "directory $canon changed before chdir, expected dev=$ldev ino=$lino, actual dev=$cur_dev ino=$cur_inode, aborting."
                    );
              }
  
              $perm &= oct '7777';    # don't forget setuid, setgid, sticky bits
              my $nperm = $perm | oct '700';
  
              # notabene: 0700 is for making readable in the first place,
              # it's also intended to change it to writable in case we have
              # to recurse in which case we are better than rm -rf for
              # subtrees with strange permissions
  
              if (
                  !(
                         $data->{safe}
                      or $nperm == $perm
                      or chmod( $nperm, $curdir )
                  )
                )
              {
                  _error( $data, "cannot make directory read+writeable", $canon );
                  $nperm = $perm;
              }
  
              my $d;
              $d = gensym() if $] < 5.006;
              if ( !opendir $d, $curdir ) {
                  _error( $data, "cannot opendir", $canon );
                  @files = ();
              }
              else {
                  if ( !defined ${^TAINT} or ${^TAINT} ) {
                      # Blindly untaint dir names if taint mode is active
                      @files = map { /\A(.*)\z/s; $1 } readdir $d;
                  }
                  else {
                      @files = readdir $d;
                  }
                  closedir $d;
              }
  
              if (_IS_VMS) {
  
                  # Deleting large numbers of files from VMS Files-11
                  # filesystems is faster if done in reverse ASCIIbetical order.
                  # include '.' to '.;' from blead patch #31775
                  @files = map { $_ eq '.' ? '.;' : $_ } reverse @files;
              }
  
              @files = grep { $_ ne $updir and $_ ne $curdir } @files;
  
              if (@files) {
  
                  # remove the contained files before the directory itself
                  my $narg = {%$data};
                  @{$narg}{qw(device inode cwd prefix depth)} =
                    ( $cur_dev, $cur_inode, $updir, $canon, $data->{depth} + 1 );
                  $count += _rmtree( $narg, \@files );
              }
  
              # restore directory permissions of required now (in case the rmdir
              # below fails), while we are still in the directory and may do so
              # without a race via '.'
              if ( $nperm != $perm and not chmod( $perm, $curdir ) ) {
                  _error( $data, "cannot reset chmod", $canon );
              }
  
              # don't leave the client code in an unexpected directory
              chdir( $data->{cwd} )
                or
                _croak("cannot chdir to $data->{cwd} from $canon: $!, aborting.");
  
              # ensure that a chdir upwards didn't take us somewhere other
              # than we expected (see CVE-2002-0435)
              ( $cur_dev, $cur_inode ) = ( stat $curdir )[ 0, 1 ]
                or _croak(
                  "cannot stat prior working directory $data->{cwd}: $!, aborting."
                );
  
              if (_NEED_STAT_CHECK) {
                  ( $data->{device} eq $cur_dev and $data->{inode} eq $cur_inode )
                    or _croak(  "previous directory $data->{cwd} "
                              . "changed before entering $canon, "
                              . "expected dev=$ldev ino=$lino, "
                              . "actual dev=$cur_dev ino=$cur_inode, aborting."
                    );
              }
  
              if ( $data->{depth} or !$data->{keep_root} ) {
                  if ( $data->{safe}
                      && ( _IS_VMS
                          ? !&VMS::Filespec::candelete($root)
                          : !-w $root ) )
                  {
                      print "skipped $root\n" if $data->{verbose};
                      next ROOT_DIR;
                  }
                  if ( _FORCE_WRITABLE and !chmod $perm | oct '700', $root ) {
                      _error( $data, "cannot make directory writeable", $canon );
                  }
                  print "rmdir $root\n" if $data->{verbose};
                  if ( rmdir $root ) {
                      push @{ ${ $data->{result} } }, $root if $data->{result};
                      ++$count;
                  }
                  else {
                      _error( $data, "cannot remove directory", $canon );
                      if (
                          _FORCE_WRITABLE
                          && !chmod( $perm,
                              ( _IS_VMS ? VMS::Filespec::fileify($root) : $root )
                          )
                        )
                      {
                          _error(
                              $data,
                              sprintf( "cannot restore permissions to 0%o",
                                  $perm ),
                              $canon
                          );
                      }
                  }
              }
          }
          else {
              # not a directory
              $root = VMS::Filespec::vmsify("./$root")
                if _IS_VMS
                && !File::Spec->file_name_is_absolute($root)
                && ( $root !~ m/(?<!\^)[\]>]+/ );    # not already in VMS syntax
  
              if (
                  $data->{safe}
                  && (
                      _IS_VMS
                      ? !&VMS::Filespec::candelete($root)
                      : !( -l $root || -w $root )
                  )
                )
              {
                  print "skipped $root\n" if $data->{verbose};
                  next ROOT_DIR;
              }
  
              my $nperm = $perm & oct '7777' | oct '600';
              if (    _FORCE_WRITABLE
                  and $nperm != $perm
                  and not chmod $nperm, $root )
              {
                  _error( $data, "cannot make file writeable", $canon );
              }
              print "unlink $canon\n" if $data->{verbose};
  
              # delete all versions under VMS
              for ( ; ; ) {
                  if ( unlink $root ) {
                      push @{ ${ $data->{result} } }, $root if $data->{result};
                  }
                  else {
                      _error( $data, "cannot unlink file", $canon );
                      _FORCE_WRITABLE and chmod( $perm, $root )
                        or _error( $data,
                          sprintf( "cannot restore permissions to 0%o", $perm ),
                          $canon );
                      last;
                  }
                  ++$count;
                  last unless _IS_VMS && lstat $root;
              }
          }
      }
      return $count;
  }
  
  sub _slash_lc {
  
      # fix up slashes and case on MSWin32 so that we can determine that
      # c:\path\to\dir is underneath C:/Path/To
      my $path = shift;
      $path =~ tr{\\}{/};
      return lc($path);
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  File::Path - Create or remove directory trees
  
  =head1 VERSION
  
  2.16 - released August 31 2018.
  
  =head1 SYNOPSIS
  
      use File::Path qw(make_path remove_tree);
  
      @created = make_path('foo/bar/baz', '/zug/zwang');
      @created = make_path('foo/bar/baz', '/zug/zwang', {
          verbose => 1,
          mode => 0711,
      });
      make_path('foo/bar/baz', '/zug/zwang', {
          chmod => 0777,
      });
  
      $removed_count = remove_tree('foo/bar/baz', '/zug/zwang', {
          verbose => 1,
          error  => \my $err_list,
          safe => 1,
      });
  
      # legacy (interface promoted before v2.00)
      @created = mkpath('/foo/bar/baz');
      @created = mkpath('/foo/bar/baz', 1, 0711);
      @created = mkpath(['/foo/bar/baz', 'blurfl/quux'], 1, 0711);
      $removed_count = rmtree('foo/bar/baz', 1, 1);
      $removed_count = rmtree(['foo/bar/baz', 'blurfl/quux'], 1, 1);
  
      # legacy (interface promoted before v2.06)
      @created = mkpath('foo/bar/baz', '/zug/zwang', { verbose => 1, mode => 0711 });
      $removed_count = rmtree('foo/bar/baz', '/zug/zwang', { verbose => 1, mode => 0711 });
  
  =head1 DESCRIPTION
  
  This module provides a convenient way to create directories of
  arbitrary depth and to delete an entire directory subtree from the
  filesystem.
  
  The following functions are provided:
  
  =over
  
  =item make_path( $dir1, $dir2, .... )
  
  =item make_path( $dir1, $dir2, ...., \%opts )
  
  The C<make_path> function creates the given directories if they don't
  exist before, much like the Unix command C<mkdir -p>.
  
  The function accepts a list of directories to be created. Its
  behaviour may be tuned by an optional hashref appearing as the last
  parameter on the call.
  
  The function returns the list of directories actually created during
  the call; in scalar context the number of directories created.
  
  The following keys are recognised in the option hash:
  
  =over
  
  =item mode => $num
  
  The numeric permissions mode to apply to each created directory
  (defaults to C<0777>), to be modified by the current C<umask>. If the
  directory already exists (and thus does not need to be created),
  the permissions will not be modified.
  
  C<mask> is recognised as an alias for this parameter.
  
  =item chmod => $num
  
  Takes a numeric mode to apply to each created directory (not
  modified by the current C<umask>). If the directory already exists
  (and thus does not need to be created), the permissions will
  not be modified.
  
  =item verbose => $bool
  
  If present, will cause C<make_path> to print the name of each directory
  as it is created. By default nothing is printed.
  
  =item error => \$err
  
  If present, it should be a reference to a scalar.
  This scalar will be made to reference an array, which will
  be used to store any errors that are encountered.  See the L</"ERROR
  HANDLING"> section for more information.
  
  If this parameter is not used, certain error conditions may raise
  a fatal error that will cause the program to halt, unless trapped
  in an C<eval> block.
  
  =item owner => $owner
  
  =item user => $owner
  
  =item uid => $owner
  
  If present, will cause any created directory to be owned by C<$owner>.
  If the value is numeric, it will be interpreted as a uid; otherwise a
  username is assumed. An error will be issued if the username cannot be
  mapped to a uid, the uid does not exist or the process lacks the
  privileges to change ownership.
  
  Ownership of directories that already exist will not be changed.
  
  C<user> and C<uid> are aliases of C<owner>.
  
  =item group => $group
  
  If present, will cause any created directory to be owned by the group
  C<$group>.  If the value is numeric, it will be interpreted as a gid;
  otherwise a group name is assumed. An error will be issued if the
  group name cannot be mapped to a gid, the gid does not exist or the
  process lacks the privileges to change group ownership.
  
  Group ownership of directories that already exist will not be changed.
  
      make_path '/var/tmp/webcache', {owner=>'nobody', group=>'nogroup'};
  
  =back
  
  =item mkpath( $dir )
  
  =item mkpath( $dir, $verbose, $mode )
  
  =item mkpath( [$dir1, $dir2,...], $verbose, $mode )
  
  =item mkpath( $dir1, $dir2,..., \%opt )
  
  The C<mkpath()> function provide the legacy interface of
  C<make_path()> with a different interpretation of the arguments
  passed.  The behaviour and return value of the function is otherwise
  identical to C<make_path()>.
  
  =item remove_tree( $dir1, $dir2, .... )
  
  =item remove_tree( $dir1, $dir2, ...., \%opts )
  
  The C<remove_tree> function deletes the given directories and any
  files and subdirectories they might contain, much like the Unix
  command C<rm -rf> or the Windows commands C<rmdir /s> and C<rd /s>.
  
  The function accepts a list of directories to be removed. (In point of fact,
  it will also accept filesystem entries which are not directories, such as
  regular files and symlinks.  But, as its name suggests, its intent is to
  remove trees rather than individual files.)
  
  C<remove_tree()>'s behaviour may be tuned by an optional hashref
  appearing as the last parameter on the call.  If an empty string is
  passed to C<remove_tree>, an error will occur.
  
  B<NOTE:>  For security reasons, we strongly advise use of the
  hashref-as-final-argument syntax -- specifically, with a setting of the C<safe>
  element to a true value.
  
      remove_tree( $dir1, $dir2, ....,
          {
              safe => 1,
              ...         # other key-value pairs
          },
      );
  
  The function returns the number of files successfully deleted.
  
  The following keys are recognised in the option hash:
  
  =over
  
  =item verbose => $bool
  
  If present, will cause C<remove_tree> to print the name of each file as
  it is unlinked. By default nothing is printed.
  
  =item safe => $bool
  
  When set to a true value, will cause C<remove_tree> to skip the files
  for which the process lacks the required privileges needed to delete
  files, such as delete privileges on VMS. In other words, the code
  will make no attempt to alter file permissions. Thus, if the process
  is interrupted, no filesystem object will be left in a more
  permissive mode.
  
  =item keep_root => $bool
  
  When set to a true value, will cause all files and subdirectories
  to be removed, except the initially specified directories. This comes
  in handy when cleaning out an application's scratch directory.
  
      remove_tree( '/tmp', {keep_root => 1} );
  
  =item result => \$res
  
  If present, it should be a reference to a scalar.
  This scalar will be made to reference an array, which will
  be used to store all files and directories unlinked
  during the call. If nothing is unlinked, the array will be empty.
  
      remove_tree( '/tmp', {result => \my $list} );
      print "unlinked $_\n" for @$list;
  
  This is a useful alternative to the C<verbose> key.
  
  =item error => \$err
  
  If present, it should be a reference to a scalar.
  This scalar will be made to reference an array, which will
  be used to store any errors that are encountered.  See the L</"ERROR
  HANDLING"> section for more information.
  
  Removing things is a much more dangerous proposition than
  creating things. As such, there are certain conditions that
  C<remove_tree> may encounter that are so dangerous that the only
  sane action left is to kill the program.
  
  Use C<error> to trap all that is reasonable (problems with
  permissions and the like), and let it die if things get out
  of hand. This is the safest course of action.
  
  =back
  
  =item rmtree( $dir )
  
  =item rmtree( $dir, $verbose, $safe )
  
  =item rmtree( [$dir1, $dir2,...], $verbose, $safe )
  
  =item rmtree( $dir1, $dir2,..., \%opt )
  
  The C<rmtree()> function provide the legacy interface of
  C<remove_tree()> with a different interpretation of the arguments
  passed. The behaviour and return value of the function is otherwise
  identical to C<remove_tree()>.
  
  B<NOTE:>  For security reasons, we strongly advise use of the
  hashref-as-final-argument syntax, specifically with a setting of the C<safe>
  element to a true value.
  
      rmtree( $dir1, $dir2, ....,
          {
              safe => 1,
              ...         # other key-value pairs
          },
      );
  
  =back
  
  =head2 ERROR HANDLING
  
  =over 4
  
  =item B<NOTE:>
  
  The following error handling mechanism is consistent throughout all
  code paths EXCEPT in cases where the ROOT node is nonexistent.  In
  version 2.11 the maintainers attempted to rectify this inconsistency
  but too many downstream modules encountered problems.  In such case,
  if you require root node evaluation or error checking prior to calling
  C<make_path> or C<remove_tree>, you should take additional precautions.
  
  =back
  
  If C<make_path> or C<remove_tree> encounters an error, a diagnostic
  message will be printed to C<STDERR> via C<carp> (for non-fatal
  errors) or via C<croak> (for fatal errors).
  
  If this behaviour is not desirable, the C<error> attribute may be
  used to hold a reference to a variable, which will be used to store
  the diagnostics. The variable is made a reference to an array of hash
  references.  Each hash contain a single key/value pair where the key
  is the name of the file, and the value is the error message (including
  the contents of C<$!> when appropriate).  If a general error is
  encountered the diagnostic key will be empty.
  
  An example usage looks like:
  
    remove_tree( 'foo/bar', 'bar/rat', {error => \my $err} );
    if ($err && @$err) {
        for my $diag (@$err) {
            my ($file, $message) = %$diag;
            if ($file eq '') {
                print "general error: $message\n";
            }
            else {
                print "problem unlinking $file: $message\n";
            }
        }
    }
    else {
        print "No error encountered\n";
    }
  
  Note that if no errors are encountered, C<$err> will reference an
  empty array.  This means that C<$err> will always end up TRUE; so you
  need to test C<@$err> to determine if errors occurred.
  
  =head2 NOTES
  
  C<File::Path> blindly exports C<mkpath> and C<rmtree> into the
  current namespace. These days, this is considered bad style, but
  to change it now would break too much code. Nonetheless, you are
  invited to specify what it is you are expecting to use:
  
    use File::Path 'rmtree';
  
  The routines C<make_path> and C<remove_tree> are B<not> exported
  by default. You must specify which ones you want to use.
  
    use File::Path 'remove_tree';
  
  Note that a side-effect of the above is that C<mkpath> and C<rmtree>
  are no longer exported at all. This is due to the way the C<Exporter>
  module works. If you are migrating a codebase to use the new
  interface, you will have to list everything explicitly. But that's
  just good practice anyway.
  
    use File::Path qw(remove_tree rmtree);
  
  =head3 API CHANGES
  
  The API was changed in the 2.0 branch. For a time, C<mkpath> and
  C<rmtree> tried, unsuccessfully, to deal with the two different
  calling mechanisms. This approach was considered a failure.
  
  The new semantics are now only available with C<make_path> and
  C<remove_tree>. The old semantics are only available through
  C<mkpath> and C<rmtree>. Users are strongly encouraged to upgrade
  to at least 2.08 in order to avoid surprises.
  
  =head3 SECURITY CONSIDERATIONS
  
  There were race conditions in the 1.x implementations of File::Path's
  C<rmtree> function (although sometimes patched depending on the OS
  distribution or platform). The 2.0 version contains code to avoid the
  problem mentioned in CVE-2002-0435.
  
  See the following pages for more information:
  
      http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=286905
      http://www.nntp.perl.org/group/perl.perl5.porters/2005/01/msg97623.html
      http://www.debian.org/security/2005/dsa-696
  
  Additionally, unless the C<safe> parameter is set (or the
  third parameter in the traditional interface is TRUE), should a
  C<remove_tree> be interrupted, files that were originally in read-only
  mode may now have their permissions set to a read-write (or "delete
  OK") mode.
  
  The following CVE reports were previously filed against File-Path and are
  believed to have been addressed:
  
  =over 4
  
  =item * L<http://cve.circl.lu/cve/CVE-2004-0452>
  
  =item * L<http://cve.circl.lu/cve/CVE-2005-0448>
  
  =back
  
  In February 2017 the cPanel Security Team reported an additional vulnerability
  in File-Path.  The C<chmod()> logic to make directories traversable can be
  abused to set the mode on an attacker-chosen file to an attacker-chosen value.
  This is due to the time-of-check-to-time-of-use (TOCTTOU) race condition
  (L<https://en.wikipedia.org/wiki/Time_of_check_to_time_of_use>) between the
  C<stat()> that decides the inode is a directory and the C<chmod()> that tries
  to make it user-rwx.  CPAN versions 2.13 and later incorporate a patch
  provided by John Lightsey to address this problem.  This vulnerability has
  been reported as CVE-2017-6512.
  
  =head1 DIAGNOSTICS
  
  FATAL errors will cause the program to halt (C<croak>), since the
  problem is so severe that it would be dangerous to continue. (This
  can always be trapped with C<eval>, but it's not a good idea. Under
  the circumstances, dying is the best thing to do).
  
  SEVERE errors may be trapped using the modern interface. If the
  they are not trapped, or if the old interface is used, such an error
  will cause the program will halt.
  
  All other errors may be trapped using the modern interface, otherwise
  they will be C<carp>ed about. Program execution will not be halted.
  
  =over 4
  
  =item mkdir [path]: [errmsg] (SEVERE)
  
  C<make_path> was unable to create the path. Probably some sort of
  permissions error at the point of departure or insufficient resources
  (such as free inodes on Unix).
  
  =item No root path(s) specified
  
  C<make_path> was not given any paths to create. This message is only
  emitted if the routine is called with the traditional interface.
  The modern interface will remain silent if given nothing to do.
  
  =item No such file or directory
  
  On Windows, if C<make_path> gives you this warning, it may mean that
  you have exceeded your filesystem's maximum path length.
  
  =item cannot fetch initial working directory: [errmsg]
  
  C<remove_tree> attempted to determine the initial directory by calling
  C<Cwd::getcwd>, but the call failed for some reason. No attempt
  will be made to delete anything.
  
  =item cannot stat initial working directory: [errmsg]
  
  C<remove_tree> attempted to stat the initial directory (after having
  successfully obtained its name via C<getcwd>), however, the call
  failed for some reason. No attempt will be made to delete anything.
  
  =item cannot chdir to [dir]: [errmsg]
  
  C<remove_tree> attempted to set the working directory in order to
  begin deleting the objects therein, but was unsuccessful. This is
  usually a permissions issue. The routine will continue to delete
  other things, but this directory will be left intact.
  
  =item directory [dir] changed before chdir, expected dev=[n] ino=[n], actual dev=[n] ino=[n], aborting. (FATAL)
  
  C<remove_tree> recorded the device and inode of a directory, and then
  moved into it. It then performed a C<stat> on the current directory
  and detected that the device and inode were no longer the same. As
  this is at the heart of the race condition problem, the program
  will die at this point.
  
  =item cannot make directory [dir] read+writeable: [errmsg]
  
  C<remove_tree> attempted to change the permissions on the current directory
  to ensure that subsequent unlinkings would not run into problems,
  but was unable to do so. The permissions remain as they were, and
  the program will carry on, doing the best it can.
  
  =item cannot read [dir]: [errmsg]
  
  C<remove_tree> tried to read the contents of the directory in order
  to acquire the names of the directory entries to be unlinked, but
  was unsuccessful. This is usually a permissions issue. The
  program will continue, but the files in this directory will remain
  after the call.
  
  =item cannot reset chmod [dir]: [errmsg]
  
  C<remove_tree>, after having deleted everything in a directory, attempted
  to restore its permissions to the original state but failed. The
  directory may wind up being left behind.
  
  =item cannot remove [dir] when cwd is [dir]
  
  The current working directory of the program is F</some/path/to/here>
  and you are attempting to remove an ancestor, such as F</some/path>.
  The directory tree is left untouched.
  
  The solution is to C<chdir> out of the child directory to a place
  outside the directory tree to be removed.
  
  =item cannot chdir to [parent-dir] from [child-dir]: [errmsg], aborting. (FATAL)
  
  C<remove_tree>, after having deleted everything and restored the permissions
  of a directory, was unable to chdir back to the parent. The program
  halts to avoid a race condition from occurring.
  
  =item cannot stat prior working directory [dir]: [errmsg], aborting. (FATAL)
  
  C<remove_tree> was unable to stat the parent directory after having returned
  from the child. Since there is no way of knowing if we returned to
  where we think we should be (by comparing device and inode) the only
  way out is to C<croak>.
  
  =item previous directory [parent-dir] changed before entering [child-dir], expected dev=[n] ino=[n], actual dev=[n] ino=[n], aborting. (FATAL)
  
  When C<remove_tree> returned from deleting files in a child directory, a
  check revealed that the parent directory it returned to wasn't the one
  it started out from. This is considered a sign of malicious activity.
  
  =item cannot make directory [dir] writeable: [errmsg]
  
  Just before removing a directory (after having successfully removed
  everything it contained), C<remove_tree> attempted to set the permissions
  on the directory to ensure it could be removed and failed. Program
  execution continues, but the directory may possibly not be deleted.
  
  =item cannot remove directory [dir]: [errmsg]
  
  C<remove_tree> attempted to remove a directory, but failed. This may be because
  some objects that were unable to be removed remain in the directory, or
  it could be a permissions issue. The directory will be left behind.
  
  =item cannot restore permissions of [dir] to [0nnn]: [errmsg]
  
  After having failed to remove a directory, C<remove_tree> was unable to
  restore its permissions from a permissive state back to a possibly
  more restrictive setting. (Permissions given in octal).
  
  =item cannot make file [file] writeable: [errmsg]
  
  C<remove_tree> attempted to force the permissions of a file to ensure it
  could be deleted, but failed to do so. It will, however, still attempt
  to unlink the file.
  
  =item cannot unlink file [file]: [errmsg]
  
  C<remove_tree> failed to remove a file. Probably a permissions issue.
  
  =item cannot restore permissions of [file] to [0nnn]: [errmsg]
  
  After having failed to remove a file, C<remove_tree> was also unable
  to restore the permissions on the file to a possibly less permissive
  setting. (Permissions given in octal).
  
  =item unable to map [owner] to a uid, ownership not changed");
  
  C<make_path> was instructed to give the ownership of created
  directories to the symbolic name [owner], but C<getpwnam> did
  not return the corresponding numeric uid. The directory will
  be created, but ownership will not be changed.
  
  =item unable to map [group] to a gid, group ownership not changed
  
  C<make_path> was instructed to give the group ownership of created
  directories to the symbolic name [group], but C<getgrnam> did
  not return the corresponding numeric gid. The directory will
  be created, but group ownership will not be changed.
  
  =back
  
  =head1 SEE ALSO
  
  =over 4
  
  =item *
  
  L<File::Remove>
  
  Allows files and directories to be moved to the Trashcan/Recycle
  Bin (where they may later be restored if necessary) if the operating
  system supports such functionality. This feature may one day be
  made available directly in C<File::Path>.
  
  =item *
  
  L<File::Find::Rule>
  
  When removing directory trees, if you want to examine each file to
  decide whether to delete it (and possibly leaving large swathes
  alone), F<File::Find::Rule> offers a convenient and flexible approach
  to examining directory trees.
  
  =back
  
  =head1 BUGS AND LIMITATIONS
  
  The following describes F<File::Path> limitations and how to report bugs.
  
  =head2 MULTITHREADED APPLICATIONS
  
  F<File::Path> C<rmtree> and C<remove_tree> will not work with
  multithreaded applications due to its use of C<chdir>.  At this time,
  no warning or error is generated in this situation.  You will
  certainly encounter unexpected results.
  
  The implementation that surfaces this limitation will not be changed. See the
  F<File::Path::Tiny> module for functionality similar to F<File::Path> but which does
  not C<chdir>.
  
  =head2 NFS Mount Points
  
  F<File::Path> is not responsible for triggering the automounts, mirror mounts,
  and the contents of network mounted filesystems.  If your NFS implementation
  requires an action to be performed on the filesystem in order for
  F<File::Path> to perform operations, it is strongly suggested you assure
  filesystem availability by reading the root of the mounted filesystem.
  
  =head2 REPORTING BUGS
  
  Please report all bugs on the RT queue, either via the web interface:
  
  L<http://rt.cpan.org/NoAuth/Bugs.html?Dist=File-Path>
  
  or by email:
  
      bug-File-Path@rt.cpan.org
  
  In either case, please B<attach> patches to the bug report rather than
  including them inline in the web post or the body of the email.
  
  You can also send pull requests to the Github repository:
  
  L<https://github.com/rpcme/File-Path>
  
  =head1 ACKNOWLEDGEMENTS
  
  Paul Szabo identified the race condition originally, and Brendan
  O'Dea wrote an implementation for Debian that addressed the problem.
  That code was used as a basis for the current code. Their efforts
  are greatly appreciated.
  
  Gisle Aas made a number of improvements to the documentation for
  2.07 and his advice and assistance is also greatly appreciated.
  
  =head1 AUTHORS
  
  Prior authors and maintainers: Tim Bunce, Charles Bailey, and
  David Landgren <F<david@landgren.net>>.
  
  Current maintainers are Richard Elberger <F<riche@cpan.org>> and
  James (Jim) Keenan <F<jkeenan@cpan.org>>.
  
  =head1 CONTRIBUTORS
  
  Contributors to File::Path, in alphabetical order by first name.
  
  =over 1
  
  =item <F<bulkdd@cpan.org>>
  
  =item Charlie Gonzalez <F<itcharlie@cpan.org>>
  
  =item Craig A. Berry <F<craigberry@mac.com>>
  
  =item James E Keenan <F<jkeenan@cpan.org>>
  
  =item John Lightsey <F<john@perlsec.org>>
  
  =item Nigel Horne <F<njh@bandsman.co.uk>>
  
  =item Richard Elberger <F<riche@cpan.org>>
  
  =item Ryan Yee <F<ryee@cpan.org>>
  
  =item Skye Shaw <F<shaw@cpan.org>>
  
  =item Tom Lutz <F<tommylutz@gmail.com>>
  
  =item Will Sheppard <F<willsheppard@github>>
  
  =back
  
  =head1 COPYRIGHT
  
  This module is copyright (C) Charles Bailey, Tim Bunce, David Landgren,
  James Keenan and Richard Elberger 1995-2018. All rights reserved.
  
  =head1 LICENSE
  
  This library is free software; you can redistribute it and/or modify
  it under the same terms as Perl itself.
  
  =cut
FILE_PATH

    $main::fatpacked{"File/ShareDir.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'FILE_SHAREDIR';
  package File::ShareDir;
  
  =pod
  
  =head1 NAME
  
  File::ShareDir - Locate per-dist and per-module shared files
  
  =begin html
  
  <a href="https://travis-ci.org/perl5-utils/File-ShareDir"><img src="https://travis-ci.org/perl5-utils/File-ShareDir.svg?branch=master" alt="Travis CI"/></a>
  <a href='https://coveralls.io/github/perl5-utils/File-ShareDir?branch=master'><img src='https://coveralls.io/repos/github/perl5-utils/File-ShareDir/badge.svg?branch=master' alt='Coverage Status' /></a>
  <a href="https://saythanks.io/to/rehsack"><img src="https://img.shields.io/badge/Say%20Thanks-!-1EAEDB.svg" alt="Say Thanks" /></a>
  
  =end html
  
  =head1 SYNOPSIS
  
    use File::ShareDir ':ALL';
    
    # Where are distribution-level shared data files kept
    $dir = dist_dir('File-ShareDir');
    
    # Where are module-level shared data files kept
    $dir = module_dir('File::ShareDir');
    
    # Find a specific file in our dist/module shared dir
    $file = dist_file(  'File-ShareDir',  'file/name.txt');
    $file = module_file('File::ShareDir', 'file/name.txt');
    
    # Like module_file, but search up the inheritance tree
    $file = class_file( 'Foo::Bar', 'file/name.txt' );
  
  =head1 DESCRIPTION
  
  The intent of L<File::ShareDir> is to provide a companion to
  L<Class::Inspector> and L<File::HomeDir>, modules that take a
  process that is well-known by advanced Perl developers but gets a
  little tricky, and make it more available to the larger Perl community.
  
  Quite often you want or need your Perl module (CPAN or otherwise)
  to have access to a large amount of read-only data that is stored
  on the file-system at run-time.
  
  On a linux-like system, this would be in a place such as /usr/share,
  however Perl runs on a wide variety of different systems, and so
  the use of any one location is unreliable.
  
  Perl provides a little-known method for doing this, but almost
  nobody is aware that it exists. As a result, module authors often
  go through some very strange ways to make the data available to
  their code.
  
  The most common of these is to dump the data out to an enormous
  Perl data structure and save it into the module itself. The
  result are enormous multi-megabyte .pm files that chew up a
  lot of memory needlessly.
  
  Another method is to put the data "file" after the __DATA__ compiler
  tag and limit yourself to access as a filehandle.
  
  The problem to solve is really quite simple.
  
    1. Write the data files to the system at install time.
    
    2. Know where you put them at run-time.
  
  Perl's install system creates an "auto" directory for both
  every distribution and for every module file.
  
  These are used by a couple of different auto-loading systems
  to store code fragments generated at install time, and various
  other modules written by the Perl "ancient masters".
  
  But the same mechanism is available to any dist or module to
  store any sort of data.
  
  =head2 Using Data in your Module
  
  C<File::ShareDir> forms one half of a two part solution.
  
  Once the files have been installed to the correct directory,
  you can use C<File::ShareDir> to find your files again after
  the installation.
  
  For the installation half of the solution, see L<File::ShareDir::Install>
  and its C<install_share> directive.
  
  Using L<File::ShareDir::Install> together with L<File::ShareDir>
  allows one to rely on the files in appropriate C<dist_dir()>
  or C<module_dir()> in development phase, too.
  
  =head1 FUNCTIONS
  
  C<File::ShareDir> provides four functions for locating files and
  directories.
  
  For greater maintainability, none of these are exported by default
  and you are expected to name the ones you want at use-time, or provide
  the C<':ALL'> tag. All of the following are equivalent.
  
    # Load but don't import, and then call directly
    use File::ShareDir;
    $dir = File::ShareDir::dist_dir('My-Dist');
    
    # Import a single function
    use File::ShareDir 'dist_dir';
    dist_dir('My-Dist');
    
    # Import all the functions
    use File::ShareDir ':ALL';
    dist_dir('My-Dist');
  
  All of the functions will check for you that the dir/file actually
  exists, and that you have read permissions, or they will throw an
  exception.
  
  =cut
  
  use 5.005;
  use strict;
  use warnings;
  
  use base ('Exporter');
  use constant IS_MACOS => !!($^O eq 'MacOS');
  use constant IS_WIN32 => !!($^O eq 'MSWin32');
  
  use Carp             ();
  use Exporter         ();
  use File::Spec       ();
  use Class::Inspector ();
  
  our %DIST_SHARE;
  our %MODULE_SHARE;
  
  our @CARP_NOT;
  our @EXPORT_OK = qw{
    dist_dir
    dist_file
    module_dir
    module_file
    class_dir
    class_file
  };
  our %EXPORT_TAGS = (
      ALL => [@EXPORT_OK],
  );
  our $VERSION = '1.116';
  
  #####################################################################
  # Interface Functions
  
  =pod
  
  =head2 dist_dir
  
    # Get a distribution's shared files directory
    my $dir = dist_dir('My-Distribution');
  
  The C<dist_dir> function takes a single parameter of the name of an
  installed (CPAN or otherwise) distribution, and locates the shared
  data directory created at install time for it.
  
  Returns the directory path as a string, or dies if it cannot be
  located or is not readable.
  
  =cut
  
  sub dist_dir
  {
      my $dist = _DIST(shift);
      my $dir;
  
      # Try the new version, then fall back to the legacy version
      $dir = _dist_dir_new($dist) || _dist_dir_old($dist);
  
      return $dir if defined $dir;
  
      # Ran out of options
      Carp::croak("Failed to find share dir for dist '$dist'");
  }
  
  sub _dist_dir_new
  {
      my $dist = shift;
  
      return $DIST_SHARE{$dist} if exists $DIST_SHARE{$dist};
  
      # Create the subpath
      my $path = File::Spec->catdir('auto', 'share', 'dist', $dist);
  
      # Find the full dir within @INC
      return _search_inc_path($path);
  }
  
  sub _dist_dir_old
  {
      my $dist = shift;
  
      # Create the subpath
      my $path = File::Spec->catdir('auto', split(/-/, $dist),);
  
      # Find the full dir within @INC
      return _search_inc_path($path);
  }
  
  =pod
  
  =head2 module_dir
  
    # Get a module's shared files directory
    my $dir = module_dir('My::Module');
  
  The C<module_dir> function takes a single parameter of the name of an
  installed (CPAN or otherwise) module, and locates the shared data
  directory created at install time for it.
  
  In order to find the directory, the module B<must> be loaded when
  calling this function.
  
  Returns the directory path as a string, or dies if it cannot be
  located or is not readable.
  
  =cut
  
  sub module_dir
  {
      my $module = _MODULE(shift);
  
      return $MODULE_SHARE{$module} if exists $MODULE_SHARE{$module};
  
      # Try the new version first, then fall back to the legacy version
      return _module_dir_new($module) || _module_dir_old($module);
  }
  
  sub _module_dir_new
  {
      my $module = shift;
  
      # Create the subpath
      my $path = File::Spec->catdir('auto', 'share', 'module', _module_subdir($module),);
  
      # Find the full dir within @INC
      return _search_inc_path($path);
  }
  
  sub _module_dir_old
  {
      my $module = shift;
      my $short  = Class::Inspector->filename($module);
      my $long   = Class::Inspector->loaded_filename($module);
      $short =~ tr{/}{:}   if IS_MACOS;
      $short =~ tr{\\} {/} if IS_WIN32;
      $long =~ tr{\\} {/}  if IS_WIN32;
      substr($short, -3, 3, '');
      $long =~ m/^(.*)\Q$short\E\.pm\z/s or Carp::croak("Failed to find base dir");
      my $dir = File::Spec->catdir("$1", 'auto', $short);
  
      -d $dir or Carp::croak("Directory '$dir': No such directory");
      -r $dir or Carp::croak("Directory '$dir': No read permission");
  
      return $dir;
  }
  
  =pod
  
  =head2 dist_file
  
    # Find a file in our distribution shared dir
    my $dir = dist_file('My-Distribution', 'file/name.txt');
  
  The C<dist_file> function takes two parameters of the distribution name
  and file name, locates the dist directory, and then finds the file within
  it, verifying that the file actually exists, and that it is readable.
  
  The filename should be a relative path in the format of your local
  filesystem. It will simply added to the directory using L<File::Spec>'s
  C<catfile> method.
  
  Returns the file path as a string, or dies if the file or the dist's
  directory cannot be located, or the file is not readable.
  
  =cut
  
  sub dist_file
  {
      my $dist = _DIST(shift);
      my $file = _FILE(shift);
  
      # Try the new version first, in doubt hand off to the legacy version
      my $path = _dist_file_new($dist, $file) || _dist_file_old($dist, $file);
      $path or Carp::croak("Failed to find shared file '$file' for dist '$dist'");
  
      -f $path or Carp::croak("File '$path': No such file");
      -r $path or Carp::croak("File '$path': No read permission");
  
      return $path;
  }
  
  sub _dist_file_new
  {
      my $dist = shift;
      my $file = shift;
  
      # If it exists, what should the path be
      my $dir = _dist_dir_new($dist);
      return undef unless defined $dir;
      my $path = File::Spec->catfile($dir, $file);
  
      # Does the file exist
      return undef unless -e $path;
  
      return $path;
  }
  
  sub _dist_file_old
  {
      my $dist = shift;
      my $file = shift;
  
      # If it exists, what should the path be
      my $dir = _dist_dir_old($dist);
      return undef unless defined $dir;
      my $path = File::Spec->catfile($dir, $file);
  
      # Does the file exist
      return undef unless -e $path;
  
      return $path;
  }
  
  =pod
  
  =head2 module_file
  
    # Find a file in our module shared dir
    my $dir = module_file('My::Module', 'file/name.txt');
  
  The C<module_file> function takes two parameters of the module name
  and file name. It locates the module directory, and then finds the file
  within it, verifying that the file actually exists, and that it is readable.
  
  In order to find the directory, the module B<must> be loaded when
  calling this function.
  
  The filename should be a relative path in the format of your local
  filesystem. It will simply added to the directory using L<File::Spec>'s
  C<catfile> method.
  
  Returns the file path as a string, or dies if the file or the dist's
  directory cannot be located, or the file is not readable.
  
  =cut
  
  sub module_file
  {
      my $module = _MODULE(shift);
      my $file   = _FILE(shift);
      my $dir    = module_dir($module);
      my $path   = File::Spec->catfile($dir, $file);
  
      -e $path or Carp::croak("File '$path' does not exist in module dir");
      -r $path or Carp::croak("File '$path': No read permission");
  
      return $path;
  }
  
  =pod
  
  =head2 class_file
  
    # Find a file in our module shared dir, or in our parent class
    my $dir = class_file('My::Module', 'file/name.txt');
  
  The C<module_file> function takes two parameters of the module name
  and file name. It locates the module directory, and then finds the file
  within it, verifying that the file actually exists, and that it is readable.
  
  In order to find the directory, the module B<must> be loaded when
  calling this function.
  
  The filename should be a relative path in the format of your local
  filesystem. It will simply added to the directory using L<File::Spec>'s
  C<catfile> method.
  
  If the file is NOT found for that module, C<class_file> will scan up
  the module's @ISA tree, looking for the file in all of the parent
  classes.
  
  This allows you to, in effect, "subclass" shared files.
  
  Returns the file path as a string, or dies if the file or the dist's
  directory cannot be located, or the file is not readable.
  
  =cut
  
  sub class_file
  {
      my $module = _MODULE(shift);
      my $file   = _FILE(shift);
  
      # Get the super path ( not including UNIVERSAL )
      # Rather than using Class::ISA, we'll use an inlined version
      # that implements the same basic algorithm.
      my @path  = ();
      my @queue = ($module);
      my %seen  = ($module => 1);
      while (my $cl = shift @queue)
      {
          push @path, $cl;
          no strict 'refs';    ## no critic (TestingAndDebugging::ProhibitNoStrict)
          unshift @queue, grep { !$seen{$_}++ }
            map { my $s = $_; $s =~ s/^::/main::/; $s =~ s/\'/::/g; $s } (@{"${cl}::ISA"});
      }
  
      # Search up the path
      foreach my $class (@path)
      {
          my $dir = eval { module_dir($class); };
          next if $@;
          my $path = File::Spec->catfile($dir, $file);
          -e $path or next;
          -r $path or Carp::croak("File '$file' cannot be read, no read permissions");
          return $path;
      }
      Carp::croak("File '$file' does not exist in class or parent shared files");
  }
  
  ## no critic (BuiltinFunctions::ProhibitStringyEval)
  if (eval "use List::MoreUtils 0.428; 1;")
  {
      List::MoreUtils->import("firstres");
  }
  else
  {
      ## no critic (ErrorHandling::RequireCheckingReturnValueOfEval)
      eval <<'END_OF_BORROWED_CODE';
  sub firstres (&@)
  {
      my $test = shift;
      foreach (@_)
      {
          my $testval = $test->();
          $testval and return $testval;
      }
      return undef;
  }
  END_OF_BORROWED_CODE
  }
  
  #####################################################################
  # Support Functions
  
  sub _search_inc_path
  {
      my $path = shift;
  
      # Find the full dir within @INC
      my $dir = firstres(
          sub {
              my $d;
              $d = File::Spec->catdir($_, $path) if defined _STRING($_);
              defined $d and -d $d ? $d : 0;
          },
          @INC
      ) or return;
  
      Carp::croak("Found directory '$dir', but no read permissions") unless -r $dir;
  
      return $dir;
  }
  
  sub _module_subdir
  {
      my $module = shift;
      $module =~ s/::/-/g;
      return $module;
  }
  
  ## no critic (BuiltinFunctions::ProhibitStringyEval)
  if (eval "use Params::Util 1.07; 1;")
  {
      Params::Util->import("_CLASS", "_STRING");
  }
  else
  {
      ## no critic (ErrorHandling::RequireCheckingReturnValueOfEval)
      eval <<'END_OF_BORROWED_CODE';
  # Inlined from Params::Util pure perl version
  sub _CLASS ($)
  {
      return (defined $_[0] and !ref $_[0] and $_[0] =~ m/^[^\W\d]\w*(?:::\w+)*\z/s) ? $_[0] : undef;
  }
  
  sub _STRING ($)
  {
      (defined $_[0] and ! ref $_[0] and length($_[0])) ? $_[0] : undef;
  }
  END_OF_BORROWED_CODE
  }
  
  # Maintainer note: The following private functions are used by
  #                  File::ShareDir::PAR. (It has to or else it would have to copy&fork)
  #                  So if you significantly change or even remove them, please
  #                  notify the File::ShareDir::PAR maintainer(s). Thank you!
  
  # Matches a valid distribution name
  ### This is a total guess at this point
  sub _DIST    ## no critic (Subroutines::RequireArgUnpacking)
  {
      defined _STRING($_[0]) and $_[0] =~ /^[a-z0-9+_-]+$/is and return $_[0];
      Carp::croak("Not a valid distribution name");
  }
  
  # A valid and loaded module name
  sub _MODULE
  {
      my $module = _CLASS(shift) or Carp::croak("Not a valid module name");
      Class::Inspector->loaded($module) and return $module;
      Carp::croak("Module '$module' is not loaded");
  }
  
  # A valid file name
  sub _FILE
  {
      my $file = shift;
      _STRING($file) or Carp::croak("Did not pass a file name");
      File::Spec->file_name_is_absolute($file) and Carp::croak("Cannot use absolute file name '$file'");
      return $file;
  }
  
  1;
  
  =pod
  
  =head1 EXTENDING
  
  =head2 Overriding Directory Resolution
  
  C<File::ShareDir> has two convenience hashes for people who have advanced usage
  requirements of C<File::ShareDir> such as using uninstalled C<share>
  directories during development.
  
    #
    # Dist-Name => /absolute/path/for/DistName/share/dir
    #
    %File::ShareDir::DIST_SHARE
  
    #
    # Module::Name => /absolute/path/for/Module/Name/share/dir
    #
    %File::ShareDir::MODULE_SHARE
  
  Setting these values any time before the corresponding calls
  
    dist_dir('Dist-Name')
    dist_file('Dist-Name','some/file');
  
    module_dir('Module::Name');
    module_file('Module::Name','some/file');
  
  Will override the base directory for resolving those calls.
  
  An example of where this would be useful is in a test for a module that
  depends on files installed into a share directory, to enable the tests
  to use the development copy without needing to install them first.
  
    use File::ShareDir;
    use Cwd qw( getcwd );
    use File::Spec::Functions qw( rel2abs catdir );
  
    $File::ShareDir::MODULE_SHARE{'Foo::Module'} = rel2abs(catfile(getcwd,'share'));
  
    use Foo::Module;
  
    # interal calls in Foo::Module to module_file('Foo::Module','bar') now resolves to
    # the source trees share/ directory instead of something in @INC
  
  =head1 SUPPORT
  
  Bugs should always be submitted via the CPAN request tracker, see below.
  
  You can find documentation for this module with the perldoc command.
  
      perldoc File::ShareDir
  
  You can also look for information at:
  
  =over 4
  
  =item * RT: CPAN's request tracker
  
  L<http://rt.cpan.org/NoAuth/Bugs.html?Dist=File-ShareDir>
  
  =item * AnnoCPAN: Annotated CPAN documentation
  
  L<http://annocpan.org/dist/File-ShareDir>
  
  =item * CPAN Ratings
  
  L<http://cpanratings.perl.org/s/File-ShareDir>
  
  =item * CPAN Search
  
  L<http://search.cpan.org/dist/File-ShareDir/>
  
  =back
  
  =head2 Where can I go for other help?
  
  If you have a bug report, a patch or a suggestion, please open a new
  report ticket at CPAN (but please check previous reports first in case
  your issue has already been addressed).
  
  Report tickets should contain a detailed description of the bug or
  enhancement request and at least an easily verifiable way of
  reproducing the issue or fix. Patches are always welcome, too.
  
  =head2 Where can I go for help with a concrete version?
  
  Bugs and feature requests are accepted against the latest version
  only. To get patches for earlier versions, you need to get an
  agreement with a developer of your choice - who may or not report the
  issue and a suggested fix upstream (depends on the license you have
  chosen).
  
  =head2 Business support and maintenance
  
  For business support you can contact the maintainer via his CPAN
  email address. Please keep in mind that business support is neither
  available for free nor are you eligible to receive any support
  based on the license distributed with this package.
  
  =head1 AUTHOR
  
  Adam Kennedy E<lt>adamk@cpan.orgE<gt>
  
  =head2 MAINTAINER
  
  Jens Rehsack E<lt>rehsack@cpan.orgE<gt>
  
  =head1 SEE ALSO
  
  L<File::ShareDir::Install>,
  L<File::ConfigDir>, L<File::HomeDir>,
  L<Module::Install>, L<Module::Install::Share>,
  L<File::ShareDir::PAR>, L<Dist::Zilla::Plugin::ShareDir>
  
  =head1 COPYRIGHT
  
  Copyright 2005 - 2011 Adam Kennedy,
  Copyright 2014 - 2018 Jens Rehsack.
  
  This program is free software; you can redistribute
  it and/or modify it under the same terms as Perl itself.
  
  The full text of the license can be found in the
  LICENSE file included with this module.
  
  =cut
FILE_SHAREDIR

    $main::fatpacked{"File/ShareDir/Tarball.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'FILE_SHAREDIR_TARBALL';
  package File::ShareDir::Tarball;
  BEGIN {
    $File::ShareDir::Tarball::AUTHORITY = 'cpan:YANICK';
  }
  {
    $File::ShareDir::Tarball::VERSION = '0.2.2';
  }
  # ABSTRACT: Deal transparently with shared files distributed as tarballs
  
  
  use strict;
  use warnings;
  
  use parent qw/ Exporter /;
  
  use Carp;
  
  use File::ShareDir;
  use Archive::Tar;
  use File::Temp qw/ tempdir /;
  use File::chdir;
  
  our @EXPORT_OK   = qw{
      dist_dir dist_file
  };
  our %EXPORT_TAGS = (
      all => [ @EXPORT_OK ],
  );
  
  my $shared_files_tarball = 'shared-files.tar.gz';
  
  # we don't want to extract the same dirs again and 
  # again within a single program
  my %DIR_CACHE;
  
  sub dist_dir {
      my $dist = shift;
  
      return $DIR_CACHE{$dist} if $DIR_CACHE{$dist};
  
      my $dir = File::ShareDir::dist_dir($dist);
  
      # no tarball? Assume regular shared dir
      return $DIR_CACHE{$dist} = $dir 
          unless -f "$dir/$shared_files_tarball";
  
      my $archive = Archive::Tar->new;
      $archive->read("$dir/$shared_files_tarball");
  
      # because that would be a veeery bad idea
      croak "archive '$shared_files_tarball' contains files with absolute path, aborting"
          if grep { m#^/# } $archive->list_files;
  
      my $tmpdir = tempdir( CLEANUP => 1 );
      local $CWD = $tmpdir;
  
      $archive->extract;
  
      return $DIR_CACHE{$dist} = $tmpdir;
  }
  
  sub dist_file {
      my $dist = File::ShareDir::_DIST(shift);
      my $file = File::ShareDir::_FILE(shift);
  
      my $path = dist_dir($dist).'/'.$file;
  
  	return undef unless -e $path;
  
      croak("Found dist_file '$path', but not a file") 
          unless -f $path;
  
      croak("File '$path', no read permissions") 
          unless -r $path;
  
  	return $path;
  }
  
  
  1;
  
  __END__
  
  =pod
  
  =head1 NAME
  
  File::ShareDir::Tarball - Deal transparently with shared files distributed as tarballs
  
  =head1 VERSION
  
  version 0.2.2
  
  =head1 SYNOPSIS
  
      use File::ShareDir::Tarball ':all';
  
      # use exactly like File::ShareDir
      $dir = dist_dir('File-ShareDir');
  
  =head1 DESCRIPTION
  
  If the shared files of a distribution are contained in a
  tarball (see L<Dist::Zilla::Plugin::ShareDir::Tarball> for
  why you would want to do that), automatically 
  extract the archive in a temporary
  directory and return the path to that directory. If called for a regular distribution without a bundle file
  (C<shared-files.tar.gz>), it'll return the original shared dir. 
  In other words,
  from the consumer point of view, it'll behave just like L<File::ShareDir>.
  
  =head1 EXPORT TAGS
  
  =head2 :all
  
  Exports C<dist_dir()> and C<dist_file()>.
  
  =head1 EXPORTABLE FUNCTIONS
  
  =head2 dist_dir( $distribution )
  
  Behaves just like C<dist_dir()> from L<File::ShareDir>.
  
  =head2 dist_file( $distribution, $file )
  
  Behaves just like C<dist_file()> from L<File::ShareDir>.
  
  =head1 SEE ALSO
  
  =over
  
  =item L<Test::File::ShareDir>
  
  To test or use a shared dir that is not deployed yet. 
  
  =item L<Dist::Zilla::Plugin::ShareDir::Tarball>
  
  L<Dist::Zilla> plugin to create the tarball effortlessly.
  
  =item L<Module::Build::CleanInstall>
  
  Provides an alternative to this module by subclassing L<Module::Build> and,
  upon installation, remove the files from previous installations as given in
  the I<packlist>.
  
  =back
  
  =head1 AUTHOR
  
  Yanick Champoux <yanick@babyl.dyndns.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2012 by Yanick Champoux.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
FILE_SHAREDIR_TARBALL

    $main::fatpacked{"File/Slurper.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'FILE_SLURPER';
  package File::Slurper;
  $File::Slurper::VERSION = '0.012';
  use strict;
  use warnings;
  
  use Carp 'croak';
  use Exporter 5.57 'import';
  
  use Encode 2.11 qw/FB_CROAK STOP_AT_PARTIAL/;
  use PerlIO::encoding;
  
  our @EXPORT_OK = qw/read_binary read_text read_lines write_binary write_text read_dir/;
  
  sub read_binary {
  	my $filename = shift;
  
  	# This logic is a bit ugly, but gives a significant speed boost
  	# because slurpy readline is not optimized for non-buffered usage
  	open my $fh, '<:unix', $filename or croak "Couldn't open $filename: $!";
  	if (my $size = -s $fh) {
  		my $buf;
  		my ($pos, $read) = 0;
  		do {
  			defined($read = read $fh, ${$buf}, $size - $pos, $pos) or croak "Couldn't read $filename: $!";
  			$pos += $read;
  		} while ($read && $pos < $size);
  		return ${$buf};
  	}
  	else {
  		return do { local $/; <$fh> };
  	}
  }
  
  use constant {
  	CRLF_DEFAULT => $^O eq 'MSWin32',
  	HAS_UTF8_STRICT => scalar do { local $@; eval { require PerlIO::utf8_strict } },
  };
  
  sub _text_layers {
  	my ($encoding, $crlf) = @_;
  	$crlf = CRLF_DEFAULT if $crlf && $crlf eq 'auto';
  
  	if (HAS_UTF8_STRICT && $encoding =~ /^utf-?8\b/i) {
  		return $crlf ? ':unix:utf8_strict:crlf' : ':unix:utf8_strict';
  	}
  	else {
  		# non-ascii compatible encodings such as UTF-16 need encoding before crlf
  		return $crlf ? ":raw:encoding($encoding):crlf" : ":raw:encoding($encoding)";
  	}
  }
  
  sub read_text {
  	my ($filename, $encoding, $crlf) = @_;
  	$encoding ||= 'utf-8';
  	my $layer = _text_layers($encoding, $crlf);
  
  	local $PerlIO::encoding::fallback = STOP_AT_PARTIAL | FB_CROAK;
  	open my $fh, "<$layer", $filename or croak "Couldn't open $filename: $!";
  	return do { local $/; <$fh> };
  }
  
  sub write_text {
  	my ($filename, undef, $encoding, $crlf) = @_;
  	$encoding ||= 'utf-8';
  	my $layer = _text_layers($encoding, $crlf);
  
  	local $PerlIO::encoding::fallback = STOP_AT_PARTIAL | FB_CROAK;
  	open my $fh, ">$layer", $filename or croak "Couldn't open $filename: $!";
  	print $fh $_[1] or croak "Couldn't write to $filename: $!";
  	close $fh or croak "Couldn't write to $filename: $!";
  	return;
  }
  
  sub write_binary {
  	my $filename = $_[0];
  	open my $fh, ">:raw", $filename or croak "Couldn't open $filename: $!";
  	print $fh $_[1] or croak "Couldn't write to $filename: $!";
  	close $fh or croak "Couldn't write to $filename: $!";
  	return;
  }
  
  sub read_lines {
  	my ($filename, $encoding, $crlf, $skip_chomp) = @_;
  	$encoding ||= 'utf-8';
  	my $layer = _text_layers($encoding, $crlf);
  
  	local $PerlIO::encoding::fallback = STOP_AT_PARTIAL | FB_CROAK;
  	open my $fh, "<$layer", $filename or croak "Couldn't open $filename: $!";
  	return <$fh> if $skip_chomp;
  	my @buf = <$fh>;
  	close $fh;
  	chomp @buf;
  	return @buf;
  }
  
  sub read_dir {
  	my ($dirname) = @_;
  	opendir my ($dir), $dirname or croak "Could not open $dirname: $!";
  	return grep { not m/ \A \.\.? \z /x } readdir $dir;
  }
  
  1;
  
  # ABSTRACT: A simple, sane and efficient module to slurp a file
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  File::Slurper - A simple, sane and efficient module to slurp a file
  
  =head1 VERSION
  
  version 0.012
  
  =head1 SYNOPSIS
  
   use File::Slurper 'read_text';
   my $content = read_text($filename);
  
  =head1 DESCRIPTION
  
  This module provides functions for fast and correct slurping and spewing. All functions are optionally exported. All functions throw exceptions on errors, write functions don't return any meaningful value.
  
  =head1 FUNCTIONS
  
  =head2 read_text($filename, $encoding, $crlf)
  
  Reads file C<$filename> into a scalar and decodes it from C<$encoding> (which defaults to UTF-8). If C<$crlf> is true, crlf translation is performed. The default for this argument is off. The special value C<'auto'> will set it to a platform specific default value.
  
  =head2 read_binary($filename)
  
  Reads file C<$filename> into a scalar without any decoding or transformation.
  
  =head2 read_lines($filename, $encoding, $crlf, $skip_chomp)
  
  Reads file C<$filename> into a list/array line-by-line, after decoding from C<$encoding>, optional crlf translation and chomping.
  
  =head2 write_text($filename, $content, $encoding, $crlf)
  
  Writes C<$content> to file C<$filename>, encoding it to C<$encoding> (which defaults to UTF-8). It can also take a C<crlf> argument that works exactly as in read_text.
  
  =head2 write_binary($filename, $content)
  
  Writes C<$content> to file C<$filename> as binary data.
  
  =head2 read_dir($dirname)
  
  Open C<dirname> and return all entries except C<.> and C<..>.
  
  =head1 RATIONALE
  
  This module tries to make it as easy as possible to read and write files correctly and fast. The most correct way of doing this is not always obvious (e.g. L<#83126|https://rt.cpan.org/Public/Bug/Display.html?id=83126>), and just as often the most obvious correct way is not the fastest correct way. This module hides away all such complications behind an easy intuitive interface.
  
  =head1 DEPENDENCIES
  
  This module has an optional dependency on L<PerlIO::utf8_strict|PerlIO::utf8_strict>. Installing this will make UTF-8 encoded IO significantly faster, but should not otherwise affect the operation of this module. This may change into a dependency on the related Unicode::UTF8 in the future.
  
  =head1 SEE ALSO
  
  =over 4
  
  =item * L<Path::Tiny|Path::Tiny>
  
  A minimalistic abstraction handling not only IO but also paths.
  
  =item * L<IO::All|IO::All>
  
  An attempt to expose as many IO related features as possible via a single API.
  
  =item * L<File::Slurp|File::Slurp>
  
  This is a previous generation file slurping module. It has a number of issues, as described L<here|http://blogs.perl.org/users/leon_timmermans/2015/08/fileslurp-is-broken-and-wrong.html>.
  
  =item * L<File::Slurp::Tiny|File::Slurp::Tiny>
  
  This was my previous attempt at a better file slurping module. It's mostly (but not entirely) a drop-in replacement for File::Slurp, which is both a feature (easy conversion) and a bug (interface issues).
  
  =back
  
  =head1 TODO
  
  =over 4
  
  =item * C<open_text>/C<open_binary>?
  
  =item * C<drain_handle>?
  
  =back
  
  =head1 AUTHOR
  
  Leon Timmermans <leont@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2014 by Leon Timmermans.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
FILE_SLURPER

    $main::fatpacked{"File/Which.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'FILE_WHICH';
  package File::Which;
  
  use strict;
  use warnings;
  use Exporter   ();
  use File::Spec ();
  
  # ABSTRACT: Perl implementation of the which utility as an API
  our $VERSION = '1.23'; # VERSION
  
  
  our @ISA       = 'Exporter';
  our @EXPORT    = 'which';
  our @EXPORT_OK = 'where';
  
  use constant IS_VMS => ($^O eq 'VMS');
  use constant IS_MAC => ($^O eq 'MacOS');
  use constant IS_WIN => ($^O eq 'MSWin32' or $^O eq 'dos' or $^O eq 'os2');
  use constant IS_DOS => IS_WIN();
  use constant IS_CYG => ($^O eq 'cygwin' || $^O eq 'msys');
  
  our $IMPLICIT_CURRENT_DIR = IS_WIN || IS_VMS || IS_MAC;
  
  # For Win32 systems, stores the extensions used for
  # executable files
  # For others, the empty string is used
  # because 'perl' . '' eq 'perl' => easier
  my @PATHEXT = ('');
  if ( IS_WIN ) {
    # WinNT. PATHEXT might be set on Cygwin, but not used.
    if ( $ENV{PATHEXT} ) {
      push @PATHEXT, split ';', $ENV{PATHEXT};
    } else {
      # Win9X or other: doesn't have PATHEXT, so needs hardcoded.
      push @PATHEXT, qw{.com .exe .bat};
    }
  } elsif ( IS_VMS ) {
    push @PATHEXT, qw{.exe .com};
  } elsif ( IS_CYG ) {
    # See this for more info
    # http://cygwin.com/cygwin-ug-net/using-specialnames.html#pathnames-exe
    push @PATHEXT, qw{.exe .com};
  }
  
  
  sub which {
    my ($exec) = @_;
  
    return undef unless defined $exec;
    return undef if $exec eq '';
  
    my $all = wantarray;
    my @results = ();
  
    # check for aliases first
    if ( IS_VMS ) {
      my $symbol = `SHOW SYMBOL $exec`;
      chomp($symbol);
      unless ( $? ) {
        return $symbol unless $all;
        push @results, $symbol;
      }
    }
    if ( IS_MAC ) {
      my @aliases = split /\,/, $ENV{Aliases};
      foreach my $alias ( @aliases ) {
        # This has not been tested!!
        # PPT which says MPW-Perl cannot resolve `Alias $alias`,
        # let's just hope it's fixed
        if ( lc($alias) eq lc($exec) ) {
          chomp(my $file = `Alias $alias`);
          last unless $file;  # if it failed, just go on the normal way
          return $file unless $all;
          push @results, $file;
          # we can stop this loop as if it finds more aliases matching,
          # it'll just be the same result anyway
          last;
        }
      }
    }
  
    return $exec
            if !IS_VMS and !IS_MAC and !IS_WIN and $exec =~ /\// and -f $exec and -x $exec;
  
    my @path;
    if($^O eq 'MSWin32') {
      # File::Spec (at least recent versions)
      # add the implicit . for you on MSWin32,
      # but we may or may not want to include
      # that.
      @path = split(';', $ENV{PATH});
      s/"//g for @path;
      @path = grep length, @path;
    } else {
      @path = File::Spec->path;
    }
    if ( $IMPLICIT_CURRENT_DIR ) {
      unshift @path, File::Spec->curdir;
    }
  
    foreach my $base ( map { File::Spec->catfile($_, $exec) } @path ) {
      for my $ext ( @PATHEXT ) {
        my $file = $base.$ext;
  
        # We don't want dirs (as they are -x)
        next if -d $file;
  
        if (
          # Executable, normal case
          -x _
          or (
            # MacOS doesn't mark as executable so we check -e
            IS_MAC
            ||
            (
              ( IS_WIN or IS_CYG )
              and
              grep {
                $file =~ /$_\z/i
              } @PATHEXT[1..$#PATHEXT]
            )
            # DOSish systems don't pass -x on
            # non-exe/bat/com files. so we check -e.
            # However, we don't want to pass -e on files
            # that aren't in PATHEXT, like README.
            and -e _
          )
        ) {
          return $file unless $all;
          push @results, $file;
        }
      }
    }
  
    if ( $all ) {
      return @results;
    } else {
      return undef;
    }
  }
  
  
  sub where {
    # force wantarray
    my @res = which($_[0]);
    return @res;
  }
  
  1;
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  File::Which - Perl implementation of the which utility as an API
  
  =head1 VERSION
  
  version 1.23
  
  =head1 SYNOPSIS
  
   use File::Which;                  # exports which()
   use File::Which qw(which where);  # exports which() and where()
   
   my $exe_path = which 'perldoc';
   
   my @paths = where 'perl';
   # Or
   my @paths = which 'perl'; # an array forces search for all of them
  
  =head1 DESCRIPTION
  
  L<File::Which> finds the full or relative paths to executable programs on
  the system.  This is normally the function of C<which> utility.  C<which> is
  typically implemented as either a program or a built in shell command.  On
  some platforms, such as Microsoft Windows it is not provided as part of the
  core operating system.  This module provides a consistent API to this
  functionality regardless of the underlying platform.
  
  The focus of this module is correctness and portability.  As a consequence
  platforms where the current directory is implicitly part of the search path
  such as Microsoft Windows will find executables in the current directory,
  whereas on platforms such as UNIX where this is not the case executables
  in the current directory will only be found if the current directory is
  explicitly added to the path.
  
  If you need a portable C<which> on the command line in an environment that
  does not provide it, install L<App::pwhich> which provides a command line
  interface to this API.
  
  =head2 Implementations
  
  L<File::Which> searches the directories of the user's C<PATH> (the current
  implementation uses L<File::Spec#path> to determine the correct C<PATH>),
  looking for executable files having the name specified as a parameter to
  L</which>. Under Win32 systems, which do not have a notion of directly
  executable files, but uses special extensions such as C<.exe> and C<.bat>
  to identify them, C<File::Which> takes extra steps to assure that
  you will find the correct file (so for example, you might be searching for
  C<perl>, it'll try F<perl.exe>, F<perl.bat>, etc.)
  
  =head3 Linux, *BSD and other UNIXes
  
  There should not be any surprises here.  The current directory will not be
  searched unless it is explicitly added to the path.
  
  =head3 Modern Windows (including NT, XP, Vista, 7, 8, 10 etc)
  
  Windows NT has a special environment variable called C<PATHEXT>, which is used
  by the shell to look for executable files. Usually, it will contain a list in
  the form C<.EXE;.BAT;.COM;.JS;.VBS> etc. If C<File::Which> finds such an
  environment variable, it parses the list and uses it as the different
  extensions.
  
  =head3 Cygwin
  
  Cygwin provides a Unix-like environment for Microsoft Windows users.  In most
  ways it works like other Unix and Unix-like environments, but in a few key
  aspects it works like Windows.  As with other Unix environments, the current
  directory is not included in the search unless it is explicitly included in
  the search path.  Like on Windows, files with C<.EXE> or <.BAT> extensions will
  be discovered even if they are not part of the query.  C<.COM> or extensions
  specified using the C<PATHEXT> environment variable will NOT be discovered
  without the fully qualified name, however.
  
  =head3 Windows ME, 98, 95, MS-DOS, OS/2
  
  This set of operating systems don't have the C<PATHEXT> variable, and usually
  you will find executable files there with the extensions C<.exe>, C<.bat> and
  (less likely) C<.com>. C<File::Which> uses this hardcoded list if it's running
  under Win32 but does not find a C<PATHEXT> variable.
  
  As of 2015 none of these platforms are tested frequently (or perhaps ever),
  but the current maintainer is determined not to intentionally remove support
  for older operating systems.
  
  =head3 VMS
  
  Same case as Windows 9x: uses C<.exe> and C<.com> (in that order).
  
  As of 2015 the current maintainer does not test on VMS, and is in fact not
  certain it has ever been tested on VMS.  If this platform is important to you
  and you can help me verify and or support it on that platform please contact
  me.
  
  =head1 FUNCTIONS
  
  =head2 which
  
   my $path = which $short_exe_name;
   my @paths = which $short_exe_name;
  
  Exported by default.
  
  C<$short_exe_name> is the name used in the shell to call the program (for
  example, C<perl>).
  
  If it finds an executable with the name you specified, C<which()> will return
  the absolute path leading to this executable (for example, F</usr/bin/perl> or
  F<C:\Perl\Bin\perl.exe>).
  
  If it does I<not> find the executable, it returns C<undef>.
  
  If C<which()> is called in list context, it will return I<all> the
  matches.
  
  =head2 where
  
   my @paths = where $short_exe_name;
  
  Not exported by default.
  
  Same as L</which> in array context.  Similar to the C<where> csh
  built-in command or C<which -a> command for platforms that support the
  C<-a> option. Will return an array containing all the path names
  matching C<$short_exe_name>.
  
  =head1 GLOBALS
  
  =head2 $IMPLICIT_CURRENT_DIR
  
  True if the current directory is included in the search implicitly on
  whatever platform you are using.  Normally the default is reasonable,
  but on Windows the current directory is included implicitly for older
  shells like C<cmd.exe> and C<command.com>, but not for newer shells
  like PowerShell.  If you overrule this default, you should ALWAYS
  localize the variable to the tightest scope possible, since setting
  this variable from a module can affect other modules.  Thus on Windows
  you can get the correct result if the user is running either C<cmd.exe>
  or PowerShell on Windows you can do this:
  
   use File::Which qw( which );
   use Shell::Guess;
  
   my $path = do {
     my $is_power = Shell::Guess->running_shell->is_power;
     local $File::Which::IMPLICIT_CURRENT_DIR = !$is_power;
     which 'foo';
   };
  
  For a variety of reasons it is difficult to accurately compute the
  shell that a user is using, but L<Shell::Guess> makes a reasonable
  effort.
  
  =head1 CAVEATS
  
  This module has no non-core requirements for Perl 5.6.2 and better.
  
  This module is fully supported back to Perl 5.8.1.  It may work on 5.8.0.
  It should work on Perl 5.6.x and I may even test on 5.6.2.  I will accept
  patches to maintain compatibility for such older Perls, but you may
  need to fix it on 5.6.x / 5.8.0 and send me a patch.
  
  Not tested on VMS although there is platform specific code
  for those. Anyone who haves a second would be very kind to send me a
  report of how it went.
  
  =head1 SUPPORT
  
  Bugs should be reported via the GitHub issue tracker
  
  L<https://github.com/plicease/File-Which/issues>
  
  For other issues, contact the maintainer.
  
  =head1 SEE ALSO
  
  =over 4
  
  =item L<pwhich>, L<App::pwhich>
  
  Command line interface to this module.
  
  =item L<IPC::Cmd>
  
  This module provides (among other things) a C<can_run> function, which is
  similar to C<which>.  It is a much heavier module since it does a lot more,
  and if you use C<can_run> it pulls in L<ExtUtils::MakeMaker>.  This combination
  may be overkill for applications which do not need L<IPC::Cmd>'s complicated
  interface for running programs, or do not need the memory overhead required
  for installing Perl modules.
  
  At least some older versions will find executables in the current directory,
  even if the current directory is not in the search path (which is the default
  on modern Unix).
  
  C<can_run> converts directory path name to the 8.3 version on Windows using
  C<Win32::GetShortPathName> in some cases.  This is frequently useful for tools
  that just need to run something using C<system> in scalar mode, but may be
  inconvenient for tools like L<App::pwhich> where user readability is a premium.
  Relying on C<Win32::GetShortPathName> to produce filenames without spaces
  is problematic, as 8.3 filenames can be turned off with tweaks to the
  registry (see L<https://technet.microsoft.com/en-us/library/cc959352.aspx>).
  
  =item L<Devel::CheckBin>
  
  This module purports to "check that a command is available", but does not
  provide any documentation on how you might use it.
  
  =back
  
  =head1 AUTHORS
  
  =over 4
  
  =item *
  
  Per Einar Ellefsen <pereinar@cpan.org>
  
  =item *
  
  Adam Kennedy <adamk@cpan.org>
  
  =item *
  
  Graham Ollis <plicease@cpan.org>
  
  =back
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2002 by Per Einar Ellefsen <pereinar@cpan.org>.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
FILE_WHICH

    $main::fatpacked{"File/chdir.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'FILE_CHDIR';
  package File::chdir;
  use 5.004;
  use strict;
  use vars qw($VERSION @ISA @EXPORT $CWD @CWD);
  # ABSTRACT: a more sensible way to change directories
  
  our $VERSION = '0.1010';
  
  require Exporter;
  @ISA = qw(Exporter);
  @EXPORT = qw(*CWD);
  
  use Carp;
  use Cwd 3.16;
  use File::Spec::Functions 3.27 qw/canonpath splitpath catpath splitdir catdir/;
  
  tie $CWD, 'File::chdir::SCALAR' or die "Can't tie \$CWD";
  tie @CWD, 'File::chdir::ARRAY'  or die "Can't tie \@CWD";
  
  sub _abs_path {
      # Otherwise we'll never work under taint mode.
      my($cwd) = Cwd::getcwd =~ /(.*)/s;
      # Run through File::Spec, since everything else uses it
      return canonpath($cwd);
  }
  
  # splitpath but also split directory
  sub _split_cwd {
      my ($vol, $dir) = splitpath(_abs_path, 1);
      my @dirs = splitdir( $dir );
      shift @dirs; # get rid of leading empty "root" directory
      return ($vol, @dirs);
  }
  
  # catpath, but take list of directories
  # restore the empty root dir and provide an empty file to avoid warnings
  sub _catpath {
      my ($vol, @dirs) = @_;
      return catpath($vol, catdir(q{}, @dirs), q{});
  }
  
  sub _chdir {
      # Untaint target directory
      my ($new_dir) = $_[0] =~ /(.*)/s;
  
      local $Carp::CarpLevel = $Carp::CarpLevel + 1;
      if ( ! CORE::chdir($new_dir) ) {
          croak "Failed to change directory to '$new_dir': $!";
      };
      return 1;
  }
  
  {
      package File::chdir::SCALAR;
      use Carp;
  
      BEGIN {
          *_abs_path = \&File::chdir::_abs_path;
          *_chdir = \&File::chdir::_chdir;
          *_split_cwd = \&File::chdir::_split_cwd;
          *_catpath = \&File::chdir::_catpath;
      }
  
      sub TIESCALAR {
          bless [], $_[0];
      }
  
      # To be safe, in case someone chdir'd out from under us, we always
      # check the Cwd explicitly.
      sub FETCH {
          return _abs_path;
      }
  
      sub STORE {
          return unless defined $_[1];
          _chdir($_[1]);
      }
  }
  
  
  {
      package File::chdir::ARRAY;
      use Carp;
  
      BEGIN {
          *_abs_path = \&File::chdir::_abs_path;
          *_chdir = \&File::chdir::_chdir;
          *_split_cwd = \&File::chdir::_split_cwd;
          *_catpath = \&File::chdir::_catpath;
      }
  
      sub TIEARRAY {
          bless {}, $_[0];
      }
  
      sub FETCH {
          my($self, $idx) = @_;
          my ($vol, @cwd) = _split_cwd;
          return $cwd[$idx];
      }
  
      sub STORE {
          my($self, $idx, $val) = @_;
  
          my ($vol, @cwd) = _split_cwd;
          if( $self->{Cleared} ) {
              @cwd = ();
              $self->{Cleared} = 0;
          }
  
          $cwd[$idx] = $val;
          my $dir = _catpath($vol,@cwd);
  
          _chdir($dir);
          return $cwd[$idx];
      }
  
      sub FETCHSIZE {
          my ($vol, @cwd) = _split_cwd;
          return scalar @cwd;
      }
      sub STORESIZE {}
  
      sub PUSH {
          my($self) = shift;
  
          my $dir = _catpath(_split_cwd, @_);
          _chdir($dir);
          return $self->FETCHSIZE;
      }
  
      sub POP {
          my($self) = shift;
  
          my ($vol, @cwd) = _split_cwd;
          my $popped = pop @cwd;
          my $dir = _catpath($vol,@cwd);
          _chdir($dir);
          return $popped;
      }
  
      sub SHIFT {
          my($self) = shift;
  
          my ($vol, @cwd) = _split_cwd;
          my $shifted = shift @cwd;
          my $dir = _catpath($vol,@cwd);
          _chdir($dir);
          return $shifted;
      }
  
      sub UNSHIFT {
          my($self) = shift;
  
          my ($vol, @cwd) = _split_cwd;
          my $dir = _catpath($vol, @_, @cwd);
          _chdir($dir);
          return $self->FETCHSIZE;
      }
  
      sub CLEAR  {
          my($self) = shift;
          $self->{Cleared} = 1;
      }
  
      sub SPLICE {
          my $self = shift;
          my $offset = shift || 0;
          my $len = shift || $self->FETCHSIZE - $offset;
          my @new_dirs = @_;
  
          my ($vol, @cwd) = _split_cwd;
          my @orig_dirs = splice @cwd, $offset, $len, @new_dirs;
          my $dir = _catpath($vol, @cwd);
          _chdir($dir);
          return @orig_dirs;
      }
  
      sub EXTEND { }
      sub EXISTS {
          my($self, $idx) = @_;
          return $self->FETCHSIZE >= $idx ? 1 : 0;
      }
  
      sub DELETE {
          my($self, $idx) = @_;
          croak "Can't delete except at the end of \@CWD"
              if $idx < $self->FETCHSIZE - 1;
          local $Carp::CarpLevel = $Carp::CarpLevel + 1;
          $self->POP;
      }
  }
  
  1;
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  File::chdir - a more sensible way to change directories
  
  =head1 VERSION
  
  version 0.1010
  
  =head1 SYNOPSIS
  
    use File::chdir;
  
    $CWD = "/foo/bar";     # now in /foo/bar
    {
        local $CWD = "/moo/baz";  # now in /moo/baz
        ...
    }
  
    # still in /foo/bar!
  
  =head1 DESCRIPTION
  
  Perl's C<chdir()> has the unfortunate problem of being very, very, very
  global.  If any part of your program calls C<chdir()> or if any library
  you use calls C<chdir()>, it changes the current working directory for
  the *whole* program.
  
  This sucks.
  
  File::chdir gives you an alternative, C<$CWD> and C<@CWD>.  These two
  variables combine all the power of C<chdir()>, L<File::Spec> and L<Cwd>.
  
  =head1 $CWD
  
  Use the C<$CWD> variable instead of C<chdir()> and Cwd.
  
      use File::chdir;
      $CWD = $dir;  # just like chdir($dir)!
      print $CWD;   # prints the current working directory
  
  It can be localized, and it does the right thing.
  
      $CWD = "/foo";      # it's /foo out here.
      {
          local $CWD = "/bar";  # /bar in here
      }
      # still /foo out here!
  
  C<$CWD> always returns the absolute path in the native form for the
  operating system.
  
  C<$CWD> and normal C<chdir()> work together just fine.
  
  =head1 @CWD
  
  C<@CWD> represents the current working directory as an array, each
  directory in the path is an element of the array.  This can often make
  the directory easier to manipulate, and you don't have to fumble with
  C<File::Spec->splitpath> and C<File::Spec->catdir> to make portable code.
  
    # Similar to chdir("/usr/local/src/perl")
    @CWD = qw(usr local src perl);
  
  pop, push, shift, unshift and splice all work.  pop and push are
  probably the most useful.
  
    pop @CWD;                 # same as chdir(File::Spec->updir)
    push @CWD, 'some_dir'     # same as chdir('some_dir')
  
  C<@CWD> and C<$CWD> both work fine together.
  
  *NOTE* Due to a perl bug you can't localize C<@CWD>.  See L</CAVEATS> for a work around.
  
  =head1 EXAMPLES
  
  (We omit the C<use File::chdir> from these examples for terseness)
  
  Here's C<$CWD> instead of C<chdir()>:
  
      $CWD = 'foo';           # chdir('foo')
  
  and now instead of Cwd.
  
      print $CWD;             # use Cwd;  print Cwd::abs_path
  
  you can even do zsh style C<cd foo bar>
  
      $CWD = '/usr/local/foo';
      $CWD =~ s/usr/var/;
  
  if you want to localize that, make sure you get the parens right
  
      {
          (local $CWD) =~ s/usr/var/;
          ...
      }
  
  It's most useful for writing polite subroutines which don't leave the
  program in some strange directory:
  
      sub foo {
          local $CWD = 'some/other/dir';
          ...do your work...
      }
  
  which is much simpler than the equivalent:
  
      sub foo {
          use Cwd;
          my $orig_dir = Cwd::getcwd;
          chdir('some/other/dir');
  
          ...do your work...
  
          chdir($orig_dir);
      }
  
  C<@CWD> comes in handy when you want to start moving up and down the
  directory hierarchy in a cross-platform manner without having to use
  File::Spec.
  
      pop @CWD;                   # chdir(File::Spec->updir);
      push @CWD, 'some', 'dir'    # chdir(File::Spec->catdir(qw(some dir)));
  
  You can easily change your parent directory:
  
      # chdir from /some/dir/bar/moo to /some/dir/foo/moo
      $CWD[-2] = 'foo';
  
  =head1 CAVEATS
  
  =head2 C<local @CWD> does not work.
  
  C<local @CWD> will not localize C<@CWD>.  This is a bug in Perl, you
  can't localize tied arrays.  As a work around localizing $CWD will
  effectively localize @CWD.
  
      {
          local $CWD;
          pop @CWD;
          ...
      }
  
  =head2 Assigning to C<@CWD> calls C<chdir()> for each element
  
      @CWD = qw/a b c d/;
  
  Internally, Perl clears C<@CWD> and assigns each element in turn.  Thus, this
  code above will do this:
  
      chdir 'a';
      chdir 'a/b';
      chdir 'a/b/c';
      chdir 'a/b/c/d';
  
  Generally, avoid assigning to C<@CWD> and just use push and pop instead.
  
  =head2 Volumes not handled
  
  There is currently no way to change the current volume via File::chdir.
  
  =head1 NOTES
  
  C<$CWD> returns the current directory using native path separators, i.e. \
  on Win32.  This ensures that C<$CWD> will compare correctly with directories
  created using File::Spec.  For example:
  
      my $working_dir = File::Spec->catdir( $CWD, "foo" );
      $CWD = $working_dir;
      doing_stuff_might_chdir();
      is( $CWD, $working_dir, "back to original working_dir?" );
  
  Deleting the last item of C<@CWD> will act like a pop.  Deleting from the
  middle will throw an exception.
  
      delete @CWD[-1]; # OK
      delete @CWD[-2]; # Dies
  
  What should %CWD do?  Something with volumes?
  
      # chdir to C:\Program Files\Sierra\Half Life ?
      $CWD{C} = '\\Program Files\\Sierra\\Half Life';
  
  =head1 DIAGNOSTICS
  
  If an error is encountered when changing C<$CWD> or C<@CWD>, one of
  the following exceptions will be thrown:
  
  * ~Can't delete except at the end of @CWD~
  * ~Failed to change directory to '$dir'~
  
  =head1 HISTORY
  
  Michael wanted C<local chdir> to work.  p5p didn't.  But it wasn't over!
  Was it over when the Germans bombed Pearl Harbor?  Hell, no!
  
  Abigail and/or Bryan Warnock suggested the C<$CWD> thing (Michael forgets
  which).  They were right.
  
  The C<chdir()> override was eliminated in 0.04.
  
  David became co-maintainer with 0.06_01 to fix some chronic
  Win32 path bugs.
  
  As of 0.08, if changing C<$CWD> or C<@CWD> fails to change the directory, an
  error will be thrown.
  
  =head1 SEE ALSO
  
  L<File::pushd>, L<File::Spec>, L<Cwd>, L<perlfunc/chdir>,
  "Animal House" L<http://www.imdb.com/title/tt0077975/quotes>
  
  =for :stopwords cpan testmatrix url annocpan anno bugtracker rt cpants kwalitee diff irc mailto metadata placeholders metacpan
  
  =head1 SUPPORT
  
  =head2 Bugs / Feature Requests
  
  Please report any bugs or feature requests through the issue tracker
  at L<https://github.com/dagolden/File-chdir/issues>.
  You will be notified automatically of any progress on your issue.
  
  =head2 Source Code
  
  This is open source software.  The code repository is available for
  public review and contribution under the terms of the license.
  
  L<https://github.com/dagolden/File-chdir>
  
    git clone https://github.com/dagolden/File-chdir.git
  
  =head1 AUTHORS
  
  =over 4
  
  =item *
  
  David Golden <dagolden@cpan.org>
  
  =item *
  
  Michael G. Schwern <schwern@pobox.com>
  
  =back
  
  =head1 CONTRIBUTOR
  
  =for stopwords Joel Berger
  
  Joel Berger <joel.a.berger@gmail.com>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2015 by Michael G. Schwern and David Golden.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
FILE_CHDIR

    $main::fatpacked{"Finance/Bank/ID/BCA.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'FINANCE_BANK_ID_BCA';
  package Finance::Bank::ID::BCA;
  
  our $DATE = '2019-05-10'; # DATE
  our $VERSION = '0.500'; # VERSION
  
  use 5.010001;
  use Moo;
  
  use HTTP::UserAgentStr::Util::ByNickname qw(newest_firefox);
  
  extends 'Finance::Bank::ID::Base';
  
  has _variant => (is => 'rw'); # bisnis or perorangan
  
  sub BUILD {
      my ($self, $args) = @_;
  
      $self->site("https://ibank.klikbca.com") unless $self->site;
      $self->https_host("ibank.klikbca.com")   unless $self->https_host;
      $self->_set_default_mech unless $self->mech;
      $self->mech->agent(newest_firefox());
  }
  
  sub _req {
      my ($self, @args) = @_;
  
      # 2012-03-12 - KlikBCA server since a few week ago rejects TE request
      # header, so we do not send them.
      local @LWP::Protocol::http::EXTRA_SOCK_OPTS =
          @LWP::Protocol::http::EXTRA_SOCK_OPTS;
      push(@LWP::Protocol::http::EXTRA_SOCK_OPTS, SendTE => 0);
      #$log->tracef("EXTRA_SOCK_OPTS=%s", \@LWP::Protocol::http::EXTRA_SOCK_OPTS);
  
      $self->SUPER::_req(@args);
  }
  
  sub login {
      my ($self) = @_;
      my $s = $self->site;
  
      return 1 if $self->logged_in;
      die "400 Username not supplied" unless $self->username;
      die "400 Password not supplied" unless $self->password;
  
      $self->logger->debug('Logging in ...');
      $self->_req(get => [$s], {id=>'login_form'});
      $self->_req(submit_form => [
                                  form_number => 1,
                                  fields => {'value(user_id)'=>$self->username,
                                             'value(pswd)'=>$self->password,
                                             },
                                  button => 'value(Submit)',
                                  ],
                  {
                      id => 'login',
                      after_request => sub {
                          my ($mech) = @_;
                          $mech->content =~ /var err='(.+?)'/ and return $1;
                          $mech->content =~ /=logout"/ and return;
                          "unknown login result page";
                      },
                  });
      $self->logged_in(1);
      $self->_req(get => ["$s/authentication.do?value(actions)=welcome"],
                  {id=>'welcome'});
      #$self->_req(get => ["$s/nav_bar_indo/menu_nav.htm"], {id=>'navbar'}); # failed?
  }
  
  sub logout {
      my ($self) = @_;
  
      return 1 unless $self->logged_in;
      $self->logger->debug('Logging out ...');
      $self->_req(get => [$self->site . "/authentication.do?value(actions)=logout"],
                  {id=>'logout'});
      $self->logged_in(0);
  }
  
  sub _menu {
      my ($self) = @_;
      my $s = $self->site;
      $self->_req(get => ["$s/nav_bar_indo/account_information_menu.htm"],
                  {id=>'accinfo_menu'});
  }
  
  sub _menu_estatement {
      my ($self) = @_;
      my $s = $self->site;
      $self->_req(get => ["$s/nav_bar_indo/estatement.htm"],
                  {id=>'estatement_menu'});
  }
  
  sub list_accounts {
      my ($self) = @_;
      $self->login;
      $self->logger->info("Listing accounts");
      map { $_->{account} } $self->_check_balances;
  }
  
  sub _check_balances {
      my ($self) = @_;
      my $s = $self->site;
  
      my $re = qr!
  <tr>\s*
    <td[^>]+>\s*<div[^>]+>\s*<font[^>]+>\s*(\d+)\s*</font>\s*</div>\s*</td>\s*
    <td[^>]+>\s*<div[^>]+>\s*<font[^>]+>\s*([^<]*?)\s*</font>\s*</div>\s*</td>\s*
    <td[^>]+>\s*<div[^>]+>\s*<font[^>]+>\s*([A-Z]+)\s*</font>\s*</div>\s*</td>\s*
    <td[^>]+>\s*<div[^>]+>\s*<font[^>]+>\s*([0-9,.]+)\.(\d\d)\s*</font>\s*</div>\s*</td>
  !x;
  
      $self->login;
      $self->_menu;
      $self->_req(post => ["$s/balanceinquiry.do"],
                  {
                      id => 'check_balance',
                      after_request => sub {
                          my ($mech) = @_;
                          my $errmsg = $self->_get_bca_errmsg;
                          return "BCA errmsg: $errmsg" if $errmsg;
                          $mech->content =~ $re or
                              return "can't find balances, maybe page layout changed?";
                          '';
                      },
                  });
  
      my @res;
      my $content = $self->mech->content;
      while ($content =~ m/$re/og) {
          push @res, { account => $1,
                       account_type => $2,
                       currency => $3,
                       balance => $self->_stripD($4) + 0.01*$5,
                   };
      }
      @res;
  }
  
  # parse error message from error page, often shown when we want to check
  # statement or balance.
  sub _get_bca_errmsg {
      my $self = shift;
      my $mech = $self->mech;
      my $ct = $mech->content;
      return $1 if $ct =~ m!^<font.+?red><b>(.+)</b></font>!m;
  }
  
  sub check_balance {
      my ($self, $account) = @_;
      my @bals = $self->_check_balances;
      return unless @bals;
      return $bals[0]{balance} if !$account;
      for (@bals) {
          return $_->{balance} if $_->{account} eq $account;
      }
      return;
  }
  
  sub get_statement {
      require DateTime;
  
      my ($self, %args) = @_;
      my $s = $self->site;
      my $max_days = 31;
  
      $self->login;
      $self->_menu;
      $self->logger->info(
          "Getting statement for ".
              ($args{account} ? "account `$args{account}'" : "default account").
              " ...");
      $self->_req(post => ["$s/accountstmt.do?value(actions)=acct_stmt"],
                  {
                      id => 'get_statement_form',
                      after_request => sub {
                          my ($mech) = @_;
                          my $errmsg = $self->_get_bca_errmsg;
                          return "BCA errmsg: $errmsg" if $errmsg;
                          $mech->content =~ /<form/i or
                              return "no form found, maybe we got logged out?";
                          '';
                      },
                  });
  
      my $form = $self->mech->form_number(1);
  
      # in the site this is done by javascript onSubmit(), so we emulate it here
      $form->action("$s/accountstmt.do?value(actions)=acctstmtview");
  
      # in the case of the current date being a saturday/sunday/holiday, end
      # date will be forwarded 1 or more days from the current date by the site,
      # so we need to know end date and optionally forward start date when needed,
      # to avoid total number of days being > 31.
  
      my $today = DateTime->today;
      my $max_dt = DateTime->new(day   => $form->value("value(endDt)"),
                                 month => $form->value("value(endMt)"),
                                 year  => $form->value("value(endYr)"));
      my $cmp = DateTime->compare($today, $max_dt);
      my $delta_days = $cmp * $today->subtract_datetime($max_dt, $today)->days;
      if ($delta_days > 0) {
          $self->logger->warn("Something weird is going on, end date is being ".
                              "set less than today's date by the site (".
                              $self->_fmtdate($max_dt)."). ".
                              "Please check your computer's date setting. ".
                              "Continuing anyway.");
      }
      my $min_dt = $max_dt->clone->subtract(days => ($max_days-1));
  
      my $end_dt = $args{end_date} || $max_dt;
      my $start_dt = $args{start_date} ||
          $end_dt->clone->subtract(days => (($args{days} || $max_days)-1));
      if (DateTime->compare($start_dt, $min_dt) == -1) {
          $self->logger->warn("Start date ".$self->_fmtdate($start_dt)." is less than ".
                              "minimum date ".$self->_fmtdate($min_dt).". Setting to ".
                              "minimum date instead.");
          $start_dt = $min_dt;
      }
      if (DateTime->compare($start_dt, $max_dt) == 1) {
          $self->logger->warn("Start date ".$self->_fmtdate($start_dt)." is greater than ".
                              "maximum date ".$self->_fmtdate($max_dt).". Setting to ".
                              "maximum date instead.");
          $start_dt = $max_dt;
      }
      if (DateTime->compare($end_dt, $min_dt) == -1) {
          $self->logger->warn("End date ".$self->_fmtdate($end_dt)." is less than ".
                              "minimum date ".$self->_fmtdate($min_dt).". Setting to ".
                              "minimum date instead.");
          $end_dt = $min_dt;
      }
      if (DateTime->compare($end_dt, $max_dt) == 1) {
          $self->logger->warn("End date ".$self->_fmtdate($end_dt)." is greater than ".
                              "maximum date ".$self->_fmtdate($max_dt).". Setting to ".
                              "maximum date instead.");
          $end_dt = $max_dt;
      }
      if (DateTime->compare($start_dt, $end_dt) == 1) {
          $self->logger->warn("Start date ".$self->_fmtdate($start_dt)." is greater than ".
                              "end date ".$self->_fmtdate($end_dt).". Setting to ".
                              "end date instead.");
          $start_dt = $end_dt;
      }
  
      my $select = $form->find_input("value(D1)");
      my $d1 = $select->value;
      if ($args{account}) {
          my @d1 = $select->possible_values;
          my @accts = $select->value_names;
          for (0..$#accts) {
              if ($args{account} eq $accts[$_]) {
                  $d1 = $d1[$_];
                  last;
              }
          }
      }
  
      $self->_req(submit_form => [
                                  form_number => 1,
                                  fields => {
                                      "value(D1)" => $d1,
                                      "value(startDt)" => $start_dt->day,
                                      "value(startMt)" => $start_dt->month,
                                      "value(startYr)" => $start_dt->year,
                                      "value(endDt)" => $end_dt->day,
                                      "value(endMt)" => $end_dt->month,
                                      "value(endYr)" => $end_dt->year,
                                            },
                                  ],
                  {
                      id => 'get_statement',
                      after_request => sub {
                          my ($mech) = @_;
                          my $errmsg = $self->_get_bca_errmsg;
                          return "BCA errmsg: $errmsg" if $errmsg;
                          '';
                      },
                  });
      my $parse_opts = $args{parse_opts} // {};
      my $resp = $self->parse_statement($self->mech->content, %$parse_opts);
      return if !$resp || $resp->[0] != 200;
      $resp->[2];
  }
  
  sub _ps_detect {
      my ($self, $page) = @_;
      unless ($page =~ /(?:^\s*|&nbsp;)(?:INFORMASI REKENING - MUTASI REKENING|ACCOUNT INFORMATION - ACCOUNT STATEMENT)/mi) {
          return "No KlikBCA statement page signature found";
      }
      $self->_variant($page =~ /^(?:Kode Mata Uang|Currency)/m ? 'bisnis' : 'perorangan');
      "";
  }
  
  sub _ps_get_metadata {
      require DateTime;
  
      my ($self, $page, $stmt) = @_;
  
      unless ($page =~ /\s*(?:(?:Nomor|No\.) [Rr]ekening|Account Number)\s*(?:<[^>]+>\s*)*[:\t]\s*(?:<[^>]+>\s*)*([\d-]+)/m) {
          return "can't get account number";
      }
      $stmt->{account} = $self->_stripD($1);
      $stmt->{account} =~ s/\D+//g;
  
      my $adv1 = "probably the statement format changed, or input incomplete";
  
      unless ($page =~ m!(?:^\s*|>)(?:Periode|Period)\s*(?:<[^>]+>\s*)*[:\t]\s*(?:<[^>]+>\s*)*(\d\d)/(\d\d)/(\d\d\d\d) - (\d\d)/(\d\d)/(\d\d\d\d)!m) {
          return "can't get statement period, $adv1";
      }
      $stmt->{start_date} = DateTime->new(day=>$1, month=>$2, year=>$3);
      $stmt->{end_date}   = DateTime->new(day=>$4, month=>$5, year=>$6);
  
      unless ($page =~ /(?:^|>)(?:(?:Kode )?Mata Uang|Currency)\s*(?:<[^>]+>\s*)*[:\t]\s*(?:<[^>]+>\s*)*(Rp|[A-Z]+)/m) {
          return "can't get currency, $adv1";
      }
      $stmt->{currency} = ($1 eq 'Rp' ? 'IDR' : $1);
  
      unless ($page =~ /(?:^|>)(?:Nama|Name)\s*(?:<[^>]+>\s*)*[:\t]\s*(?:<[^>]+>\s*)*([^<\015\012]+)/m) {
          return "can't get account holder, $adv1";
      }
      $stmt->{account_holder} = $1;
  
      unless ($page =~ /(?:^|>)(?:Mutasi Kredit|Total Credits)\s*(?:<[^>]+>\s*)*[:\t]\s*(?:<[^>]+>\s*)*([0-9,.]+)\.(\d\d)(?:\s*\t\s*(\d+))?/m) {
          return "can't get total credit, $adv1";
      }
      $stmt->{_total_credit_in_stmt}  = $self->_stripD($1) + 0.01*$2;
      $stmt->{_num_credit_tx_in_stmt} = $3 if $3;
  
      unless ($page =~ /(?:^|>)(?:Mutasi Debet|Total Debits)\s*(?:<[^>]+>\s*)*[:\t]\s*(?:<[^>]+>\s*)*([0-9,.]+)\.(\d\d)(?:\s*\t\s*(\d+))?/m) {
          return "can't get total credit, $adv1";
      }
      $stmt->{_total_debit_in_stmt}  = $self->_stripD($1) + 0.01*$2;
      $stmt->{_num_debit_tx_in_stmt} = $3 if $3;
      "";
  }
  
  sub _ps_get_transactions {
      require DateTime;
  
      my ($self, $page, $stmt) = @_;
  
      my @e;
      # text version
      while ($page =~ m!^
  (\d\d/\d\d|\s?PEND|\s?NEXT) # 1) date
    (?:\s*\t\s*|\n)+
  ((?:[^\t]|\n)*?) # 2) description
    (?:\s*\t\s*|\n)+
  (\d{4}) # 3) branch code
    (?:\s*\t\s*|\n)+
  ([0-9,]+)\.(\d\d) # 4+5) amount
    (?:\s*\t?\s*|\n)+
  (CR|DB) # 6)
    (?:\s*\t\s*|\n)+
  ([0-9,]+)\.(\d\d) # 7+8) balance
      !mxg) {
          push @e, {date=>$1, desc=>$2, br=>$3, amt=>$4, amtf=>$5, crdb=>$6, bal=>$7, balf=>$8};
      }
      if (!@e) {
          # HTML version
          while ($page =~ m!^
  <tr>\s*
    <td[^>]+>(?:\s*<[^>]+>\s*)*  (\d\d/\d\d|\s?PEND|\s?NEXT)  (?:\s*<[^>]+>\s*)*</td>\s*
    <td[^>]+>(?:\s*<[^>]+>\s*)*  ((?:[^\t]|\n)*?)             (?:\s*<[^>]+>\s*)*</td>\s*
    <td[^>]+>(?:\s*<[^>]+>\s*)*  (\d{4})                      (?:\s*<[^>]+>\s*)*</td>\s*
    <td[^>]+>(?:\s*<[^>]+>\s*)*  ([0-9,]+)\.(\d\d)            (?:\s*<[^>]+>\s*)*</td>\s*
    <td[^>]+>(?:\s*<[^>]+>\s*)*  (CR|DB)                      (?:\s*<[^>]+>\s*)*</td>\s*
    <td[^>]+>(?:\s*<[^>]+>\s*)*  ([0-9,]+)\.(\d\d)            (?:\s*<[^>]+>\s*)*</td>\s*
  </tr>
                           !smxg) {
              push @e, {date=>$1, desc=>$2, br=>$3, amt=>$4, amtf=>$5, crdb=>$6, bal=>$7, balf=>$8};
          }
          for (@e) { $_->{desc} =~ s!<br ?/?>!\n!ig }
      }
  
      my @tx;
      my @skipped_tx;
      my $last_date;
      my $seq;
      my $i = 0;
      for my $e (@e) {
          $i++;
          my $tx = {};
          #$tx->{stmt_start_date} = $stmt->{start_date};
  
          if ($e->{date} =~ /NEXT/) {
              $tx->{date} = $stmt->{end_date};
              $tx->{is_next} = 1;
          } elsif ($e->{date} =~ /PEND/) {
              $tx->{date} = $stmt->{end_date};
              $tx->{is_pending} = 1;
          } else {
              my ($day, $mon) = split m!/!, $e->{date};
              my $last_nonpend_date = DateTime->new(
                                                    year => ($mon < $stmt->{start_date}->month ?
                                                             $stmt->{end_date}->year :
                                                             $stmt->{start_date}->year),
                                                    month => $mon,
                                                    day => $day);
              $tx->{date} = $last_nonpend_date;
              $tx->{is_pending} = 0;
          }
  
          $tx->{description} = $e->{desc};
  
          $tx->{branch} = $e->{br};
  
          $tx->{amount}  = ($e->{crdb} =~ /CR/ ? 1 : -1) * ($self->_stripD($e->{amt}) + 0.01*$e->{amtf});
          $tx->{balance} = ($self->_stripD($e->{bal}) + 0.01*$e->{balf});
  
          if (!$last_date || DateTime->compare($last_date, $tx->{date})) {
              $seq = 1;
              $last_date = $tx->{date};
          } else {
              $seq++;
          }
          $tx->{seq} = $seq;
  
          if ($self->_variant eq 'perorangan' &&
              $tx->{date}->dow =~ /6|7/ &&
              $tx->{description} !~ /^(BIAYA ADM|BUNGA|(CR|DR) KOREKSI BUNGA|PAJAK BUNGA)\s*$/) {
              return "check failed in tx#$i: In KlikBCA Perorangan, all ".
                  "transactions must not be in Sat/Sun except for Interest and ".
                  "Admin Fee: <$tx->{description}> ($tx->{date})";
              # note: in Tahapan perorangan, BIAYA ADM is set on
              # Fridays, but for Tapres (?) on last day of the month
          }
  
          if ($self->_variant eq 'bisnis' &&
              $tx->{date}->dow =~ /6|7/ &&
              $tx->{description} !~ /^(BIAYA ADM|BUNGA|(CR|DR) KOREKSI BUNGA|PAJAK BUNGA)\s*$/) {
              return "check failed in tx#$i: In KlikBCA Bisnis, all ".
                  "transactions must not be in Sat/Sun except for Interest and ".
                  "Admin Fee: <$tx->{description}> ($tx->{date})";
              # note: in KlikBCA bisnis, BIAYA ADM is set on the last day of the
              # month, regardless of whether it's Sat/Sun or not
          }
  
          push @tx, $tx;
      }
      $stmt->{transactions} = \@tx;
      $stmt->{skipped_transactions} = \@skipped_tx;
      "";
  }
  
  sub get_estatement {
      my ($self, %args) = @_;
      my $s = $self->site;
  
      $self->login;
      $self->_menu;
      $self->_menu_estatement;
      $self->logger->info(
          "Getting e-statement for ".
              ($args{account} ? "account `$args{account}'" : "default account").
              " ...");
      $self->_req(post => ["$s/estatement.do?value(actions)=estmt"],
                  {
                      id => 'get_estatement_form',
                      after_request => sub {
                          my ($mech) = @_;
                          my $errmsg = $self->_get_bca_errmsg;
                          return "BCA errmsg: $errmsg" if $errmsg;
                          $mech->content =~ /<form/i or
                              return "no form found, maybe we got logged out?";
                          '';
                      },
                  });
      $self->_req(submit_form => [
                                  form_number => 1,
                                  fields => {
                                      "value(monthVal)" => $args{month},
                                      "value(yearVal)"  => $args{year},
                                  },
                              ],
                  {
                      id => 'get_estatement',
                      after_request => sub {
                          my ($mech) = @_;
                          my $errmsg = $self->_get_bca_errmsg;
                          return "BCA errmsg: $errmsg" if $errmsg;
                          '';
                      },
                  });
      return [
          $self->mech->response->code,
          $self->mech->response->code,
          $self->mech->content];
  }
  
  1;
  # ABSTRACT: Check your BCA accounts from Perl
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Finance::Bank::ID::BCA - Check your BCA accounts from Perl
  
  =head1 VERSION
  
  This document describes version 0.500 of Finance::Bank::ID::BCA (from Perl distribution Finance-Bank-ID-BCA), released on 2019-05-10.
  
  =head1 SYNOPSIS
  
  If you just want to download banking statements, and you use Linux/Unix, you
  might want to use the L<download-bca> script instead of having to deal with this
  library directly.
  
  If you want to use the library in your Perl application:
  
      use Finance::Bank::ID::BCA;
  
      # FBI::BCA uses Log::ger. to show logs to, for example, screen:
      use Log::ger::Output 'Screen';
  
      my $ibank = Finance::Bank::ID::BCA->new(
          username => 'ABCDEFGH1234', # opt if only using parse_statement()
          password => '123456',       # idem
          verify_https => 1,          # default is 0
          #https_ca_dir => '/etc/ssl/certs', # default is already /etc/ssl/certs
      );
  
      eval {
          $ibank->login(); # dies on error
  
          my @accts = $ibank->list_accounts();
  
          my $bal = $ibank->check_balance($acct); # $acct is optional
  
          my $stmt = $ibank->get_statement(
              account    => ..., # opt, default account will be used if undef
              days       => 31,  # opt
              start_date => DateTime->new(year=>2009, month=>10, day=>6),
                                 # opt, takes precedence over 'days'
              end_date   => DateTime->today, # opt, takes precedence over 'days'
          );
  
          print "Transactions: ";
          for my $tx (@{ $stmt->{transactions} }) {
              print "$tx->{date} $tx->{amount} $tx->{description}\n";
          }
      };
      warn if $@;
  
      # remember to call this, otherwise you will have trouble logging in again
      # for some time
      $ibank->logout();
  
  Utility routines:
  
      # parse HTML statement directly
      my $res = $ibank->parse_statement($html);
  
  =head1 DESCRIPTION
  
  This module provide a rudimentary interface to the web-based online banking
  interface of the Indonesian B<Bank Central Asia> (BCA) at
  https://ibank.klikbca.com. You will need either L<Crypt::SSLeay> or
  L<IO::Socket::SSL> installed for HTTPS support to work (and strictly
  Crypt::SSLeay to enable certificate verification). L<WWW::Mechanize> is required
  but you can supply your own mech-like object.
  
  This module can only login to the retail/personal version of the site (KlikBCA
  perorangan) and not the corporate/business version (KlikBCA bisnis) as the later
  requires VPN and token input on login. But this module can parse statement page
  from both versions.
  
  This module has been tested with the following savings products: Tahapan (IDR),
  BCA Dolar (USD).
  
  Warning: This module is neither offical nor is it tested to be 100% safe!
  Because of the nature of web-robots, everything may break from one day to the
  other when the underlying web interface changes.
  
  =head1 WARNING
  
  This warning is from Simon Cozens' C<Finance::Bank::LloydsTSB>, and seems just
  as apt here.
  
  This is code for B<online banking>, and that means B<your money>, and that means
  B<BE CAREFUL>. You are encouraged, nay, expected, to audit the source of this
  module yourself to reassure yourself that I am not doing anything untoward with
  your banking data. This software is useful to me, but is provided under B<NO
  GUARANTEE>, explicit or implied.
  
  =head1 ERROR HANDLING AND DEBUGGING
  
  Most methods die() when encountering errors, so you can use eval() to trap them.
  
  Full response headers and bodies are dumped to a separate logger. See
  documentation on C<new()> below and the sample script in examples/ subdirectory
  in the distribution.
  
  =head1 ATTRIBUTES
  
  =head1 METHODS
  
  =for Pod::Coverage (BUILD|get_estatement)
  
  =head2 new(%args)
  
  Create a new instance. %args keys:
  
  =over 4
  
  =item * username
  
  Optional if you are just using utility methods like C<parse_statement()> and not
  C<login()> etc.
  
  =item * password
  
  Optional if you are just using utility methods like C<parse_statement()> and not
  C<login()> etc.
  
  =item * mech
  
  Optional. A L<WWW::Mechanize>-like object. By default this module instantiate a
  new L<Finance::BankUtils::ID::Mechanize> (a WWW::Mechanize subclass) object to
  retrieve web pages, but if you want to use a custom/different one, you are
  allowed to do so here. Use cases include: you want to retry and increase timeout
  due to slow/unreliable network connection (using
  L<WWW::Mechanize::Plugin::Retry>), you want to slow things down using
  L<WWW::Mechanize::Sleepy>, you want to use IE engine using
  L<Win32::IE::Mechanize>, etc.
  
  =item * verify_https
  
  Optional. If you are using the default mech object (see previous option), you
  can set this option to 1 to enable SSL certificate verification (recommended for
  security). Default is 0.
  
  SSL verification will require a CA bundle directory, default is /etc/ssl/certs.
  Adjust B<https_ca_dir> option if your CA bundle is not located in that
  directory.
  
  =item * https_ca_dir
  
  Optional. Default is /etc/ssl/certs. Used to set HTTPS_CA_DIR environment
  variable for enabling certificate checking in Crypt::SSLeay. Only used if
  B<verify_https> is on.
  
  =item * logger
  
  Optional. You can supply any object that responds to trace(), debug(), info(),
  warn(), error(), or fatal() here. If not specified, this module will use a
  default logger.
  
  =item * logger_dump
  
  Optional. This is just like C<logger> but this module will log contents of
  response here instead of to C<logger> for debugging purposes. You can configure
  something like L<Log::ger::Output::DirWriteRotate> to save web pages more
  conveniently as separate files. If unspecified, the default logger is used (same
  as C<logger>).
  
  =back
  
  =head2 login()
  
  Login to the net banking site. You actually do not have to do this explicitly as
  login() is called by other methods like C<check_balance()> or
  C<get_statement()>.
  
  If login is successful, C<logged_in> will be set to true and subsequent calls to
  C<login()> will become a no-op until C<logout()> is called.
  
  Dies on failure.
  
  =head2 logout()
  
  Logout from the net banking site. You need to call this at the end of your
  program, otherwise the site will prevent you from re-logging in for some time
  (e.g. 10 minutes).
  
  If logout is successful, C<logged_in> will be set to false and subsequent calls
  to C<logout()> will become a no-op until C<login()> is called.
  
  Dies on failure.
  
  =head2 list_accounts()
  
  Return an array containing all account numbers that are associated with the
  current net banking login.
  
  =head2 check_balance([$account])
  
  Return balance for specified account, or the default account if C<$account> is
  not specified.
  
  =head2 get_statement(%args) => $stmt
  
  Get account statement. %args keys:
  
  =over 4
  
  =item * account
  
  Optional. Select the account to get statement of. If not specified, will use the
  already selected account.
  
  =item * days
  
  Optional. Number of days between 1 and 31. If days is 1, then start date and end
  date will be the same. Default is 31.
  
  =item * start_date
  
  Optional. Default is end_date - days.
  
  =item * end_date
  
  Optional. Default is today (or some 1+ days from today if today is a
  Saturday/Sunday/holiday, depending on the default value set by the site's form).
  
  =back
  
  See parse_statement() on structure of $stmt.
  
  =head2 parse_statement($html, %opts) => $res
  
  Given the HTML text of the account statement results page, parse it into
  structured data:
  
   $stmt = {
      start_date     => $start_dt, # a DateTime object
      end_date       => $end_dt,   # a DateTime object
      account_holder => STRING,
      account        => STRING,    # account number
      currency       => STRING,    # 3-digit currency code
      transactions   => [
          # first transaction
          {
            date        => $dt,  # a DateTime obj, book date ("tanggal pembukuan")
            seq         => INT,  # a number >= 1 which marks the sequence of
                                 # transactions for the day
            amount      => REAL, # a real number, positive means credit (deposit),
                                 # negative means debit (withdrawal)
            description => STRING,
            is_pending  => BOOL,
            branch      => STRING, # a 4-digit branch/ATM code
            balance     => REAL,
          },
          # second transaction
          ...
      ]
   }
  
  Returns:
  
   [$status, $err_details, $stmt]
  
  C<$status> is 200 if successful or some other 3-digit code if parsing failed.
  C<$stmt> is the result (structure as above, or undef if parsing failed).
  
  Options:
  
  =over 4
  
  =item * return_datetime_obj => BOOL
  
  Default is true. If set to false, the method will return dates as strings with
  this format: 'YYYY-MM-DD HH::mm::SS' (produced by DateTime->dmy . ' ' .
  DateTime->hms). This is to make it easy to pass the data structure into YAML,
  JSON, MySQL, etc. Nevertheless, internally DateTime objects are still used.
  
  =back
  
  Additional notes:
  
  The method can also handle some copy-pasted text from the GUI browser, but this
  is no longer documented or guaranteed to keep working.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Finance-Bank-ID-BCA>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Finance-Bank-ID-BCA>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Finance-Bank-ID-BCA>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2019, 2017, 2015, 2014, 2013, 2012, 2011, 2010 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
FINANCE_BANK_ID_BCA

    $main::fatpacked{"Finance/Bank/ID/Base.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'FINANCE_BANK_ID_BASE';
  package Finance::Bank::ID::Base;
  
  our $DATE = '2019-05-10'; # DATE
  our $VERSION = '0.500'; # VERSION
  
  use 5.010;
  use Moo;
  use Log::ger;
  
  use Data::Dmp;
  
  has mech        => (is => 'rw');
  has username    => (is => 'rw');
  has password    => (is => 'rw');
  has logged_in   => (is => 'rw');
  has accounts    => (is => 'rw');
  has logger      => (is => 'rw',
                      default => sub { Log::ger->get_logger() } );
  has logger_dump => (is => 'rw',
                      default => sub { Log::ger->get_logger() } );
  
  has site => (is => 'rw');
  
  has _req_counter => (is => 'rw', default => sub{0});
  
  has verify_https => (is => 'rw', default => sub{0});
  has https_ca_dir => (is => 'rw', default => sub{'/etc/ssl/certs'});
  has https_host   => (is => 'rw');
  has mode         => (is => 'rw', default => sub{''});
  has save_dir     => (is => 'rw');
  
  sub _fmtdate {
      my ($self, $dt) = @_;
      $dt->ymd;
  }
  
  sub _fmtdt {
      my ($self, $dt) = @_;
      $dt->datetime;
  }
  
  # strip non-digit characters
  sub _stripD {
      my ($self, $s) = @_;
      $s =~ s/\D+//g;
      $s;
  }
  
  sub BUILD {
      my ($self, $args) = @_;
  
      # alias
      $self->username($args->{login}) if $args->{login} && !$self->username;
      $self->username($args->{user})  if $args->{user}  && !$self->username;
      $self->password($args->{pin})   if $args->{pin}   && !$self->password;
  }
  
  sub _set_default_mech {
      require Finance::BankUtils::ID::Mechanize;
  
      my ($self) = @_;
      $self->mech(
          Finance::BankUtils::ID::Mechanize->new(
              verify_https => $self->verify_https,
              https_ca_dir => $self->https_ca_dir,
              https_host   => $self->https_host,
          )
      );
  }
  
  sub _req {
      my ($self, $meth, $args, $opts) = @_;
  
      if (ref($opts) ne 'HASH') {
          die "Please update your module, 3rd arg is now a hashref since ".__PACKAGE__." 0.27";
      }
  
      $opts->{id} or die "BUG: Request does not have id";
      $opts->{id} =~ /\A[\w-]+\z/ or die "BUG: Invalid syntax in id '$opts->{id}'";
  
      $self->_set_default_mech unless $self->mech;
      my $mech = $self->mech;
      my $c = $self->_req_counter + 1;
      $self->_req_counter($c);
      $self->logger->debug("mech request #$c: $meth ".dmp($args)."");
      my $errmsg = "";
  
      eval {
          if ($self->mode eq 'simulation' &&
                  $self->save_dir && (-f $self->save_dir . "/$opts->{id}.yaml")) {
              require YAML::Syck;
              $Finance::BankUtils::ID::Mechanize::saved_resp =
                  YAML::Syck::LoadFile($self->save_dir . "/$opts->{id}.yaml");
          }
          $mech->$meth(@$args);
          if ($self->save_dir && $self->mode ne 'simulation') {
              require YAML::Syck;
              YAML::Syck::DumpFile($self->save_dir . "/$opts->{id}.yaml", $mech->response);
          }
      };
      my $evalerr = $@;
  
      eval {
          $self->logger_dump->debug(
              "<!-- result of mech request #$c ($meth ".dmp($args)."):\n".
              $mech->response->status_line."\n".
              $mech->response->headers->as_string."\n".
              "-->\n".
              $mech->content
              );
      };
  
      if ($evalerr) {
          # mech dies on error, we catch it so we can log it
          $errmsg = "die: $evalerr";
      } elsif (!$mech->success) {
          # actually mech usually dies if unsuccessful (see above), but
          # this is just in case
          $errmsg = "network error: " . $mech->response->status_line;
      } elsif ($opts->{after_request}) {
          $errmsg = $opts->{after_request}->($mech);
          $errmsg = "after_request check error: $errmsg" if $errmsg;
      }
      if ($errmsg) {
          $errmsg = "mech request #$c failed: $errmsg";
          $self->logger->fatal($errmsg);
          die $errmsg;
      }
  }
  
  sub login {
      die "Should be implemented by child";
  }
  
  sub logout {
      die "Should be implemented by child";
  }
  
  sub list_accounts {
      die "Should be implemented by child";
  }
  
  sub check_balance {
      die "Should be implemented by child";
  }
  
  sub get_balance { check_balance(@_) }
  
  sub get_statement {
      die "Should be implemented by child";
  }
  
  sub check_statement { get_statement(@_) }
  
  sub account_statement { get_statement(@_) }
  
  sub parse_statement {
      my ($self, $page, %opts) = @_;
      my $status = 500;
      my $error = "";
      my $stmt = {};
  
      while (1) {
          my $err;
          if ($err = $self->_ps_detect($page, $stmt)) {
              $status = 400; $error = "Can't detect: $err"; last;
          }
          if ($err = $self->_ps_get_metadata($page, $stmt)) {
              $status = 400; $error = "Can't get metadata: $err"; last;
          }
          if ($err = $self->_ps_get_transactions($page, $stmt)) {
              $status = 400; $error = "Can't get transactions: $err"; last;
          }
  
          if (defined($stmt->{_total_debit_in_stmt})) {
              my $na = $stmt->{_total_debit_in_stmt};
              my $nb = 0;
              my $ntx = 0;
              for (@{ $stmt->{transactions} },
                   @{ $stmt->{skipped_transactions} }) {
                  if ($_->{amount} < 0) {
                      $nb += -$_->{amount}; $ntx++;
                  }
              }
              if (abs($na-$nb) >= 0.01) {
                  log_warn(
                      "Check failed: total debit do not match ".
                          "($na in summary line vs $nb when totalled from ".
                          "$ntx transactions(s))");
              }
          }
          if (defined($stmt->{_total_credit_in_stmt})) {
              my $na = $stmt->{_total_credit_in_stmt};
              my $nb = 0;
              my $ntx = 0;
              for (@{ $stmt->{transactions} },
                   @{ $stmt->{skipped_transactions} }) {
                  if ($_->{amount} > 0) {
                      $nb += $_->{amount}; $ntx++;
                  }
              }
              if (abs($na-$nb) >= 0.01) {
                  log_warn(
                      "Check failed: total credit do not match ".
                          "($na in summary line vs $nb when totalled from ".
                          "$ntx transactions(s))");
              }
          }
          if (defined($stmt->{_num_debit_tx_in_stmt})) {
              my $na = $stmt->{_num_debit_tx_in_stmt};
              my $nb = 0;
              for (@{ $stmt->{transactions} },
                   @{ $stmt->{skipped_transactions} }) {
                  $nb += $_->{amount} < 0 ? 1 : 0;
              }
              if ($na != $nb) {
                  $status = 400;
                  $error = "Check failed: number of debit transactions ".
                      "do not match ($na in summary line vs $nb when totalled)";
                  last;
              }
          }
          if (defined($stmt->{_num_credit_tx_in_stmt})) {
              my $na = $stmt->{_num_credit_tx_in_stmt};
              my $nb = 0;
              for (@{ $stmt->{transactions} },
                   @{ $stmt->{skipped_transactions} }) {
                  $nb += $_->{amount} > 0 ? 1 : 0;
              }
              if ($na != $nb) {
                  $status = 400;
                  $error = "Check failed: number of credit transactions ".
                      "do not match ($na in summary line vs $nb when totalled)";
                  last;
              }
          }
  
          $status = 200;
          last;
      }
  
      $self->logger->debug("parse_statement(): Temporary result: ".dmp($stmt));
      $self->logger->debug("parse_statement(): Status: $status ($error)");
  
      $stmt = undef unless $status == 200;
      $self->logger->debug("parse_statement(): Result: ".dmp($stmt));
  
      unless ($opts{return_datetime_obj} // 1) {
          # $_[0]{seen} = {} is a trick to allow multiple places which mention the
          # same object to be converted (defeat circular checking)
          require Data::Rmap;
          Data::Rmap::rmap_ref(sub {
              $_[0]{seen} = {};
              $_ = $self->_fmtdt($_) if UNIVERSAL::isa($_, "DateTime");
          }, $stmt);
      }
  
      [$status, $error, $stmt];
  }
  
  1;
  # ABSTRACT: Base class for Finance::Bank::ID::BCA etc
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Finance::Bank::ID::Base - Base class for Finance::Bank::ID::BCA etc
  
  =head1 VERSION
  
  This document describes version 0.500 of Finance::Bank::ID::Base (from Perl distribution Finance-Bank-ID-BCA), released on 2019-05-10.
  
  =head1 SYNOPSIS
  
      # Don't use this module directly, use one of its subclasses instead.
  
  =head1 DESCRIPTION
  
  This module provides a base implementation for L<Finance::Bank::ID::BCA> and
  L<Finance::Bank::ID::Mandiri>.
  
  =head1 ATTRIBUTES
  
  =head2 accounts
  
  =head2 https_ca_dir
  
  =head2 https_host
  
  =head2 logged_in
  
  =head2 logger
  
  =head2 logger_dump
  
  =head2 mech
  
  =head2 password
  
  =head2 site
  
  =head2 username
  
  =head2 verify_https
  
  =head2 save_dir => STR
  
  If set, each HTP response will be saved as YAML files in this dir. Existing
  files will be overwritten.
  
  =head2 mode => STR
  
  Can be set to C<simulation> for simulation mode. In this mode, instead of
  actually sending requests to network, each request will use responses saved
  previously in C<save_dir>.
  
  =head1 METHODS
  
  =for Pod::Coverage ^(BUILD)$
  
  =head2 new(%args) => OBJ
  
  Create a new instance.
  
  =head2 $obj->login()
  
  Login to netbanking site.
  
  =head2 $obj->logout()
  
  Logout from netbanking site.
  
  =head2 $obj->list_accounts()
  
  List accounts.
  
  =head2 $obj->check_balance([$acct])
  
  =head2 $obj->get_balance()
  
  Synonym for check_balance.
  
  =head2 $obj->get_statement(%args)
  
  Get account statement.
  
  =head2 $obj->check_statement()
  
  Alias for get_statement
  
  =head2 $obj->account_statement()
  
  Alias for get_statement
  
  =head2 $obj->parse_statement($html_or_text, %opts)
  
  Parse HTML/text into statement data.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Finance-Bank-ID-BCA>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Finance-Bank-ID-BCA>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Finance-Bank-ID-BCA>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2019, 2017, 2015, 2014, 2013, 2012, 2011, 2010 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
FINANCE_BANK_ID_BASE

    $main::fatpacked{"Finance/BankUtils/ID/Mechanize.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'FINANCE_BANKUTILS_ID_MECHANIZE';
  package Finance::BankUtils::ID::Mechanize;
  
  our $DATE = '2019-05-10'; # DATE
  our $VERSION = '0.500'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  use Log::ger;
  
  use parent qw(WWW::Mechanize);
  
  use String::Indent ();
  
  sub new {
      my ($class, %args) = @_;
      my $mech = WWW::Mechanize->new;
      $mech->{verify_https} = $args{verify_https} // 0;
      $mech->{https_ca_dir} = $args{https_ca_dir} // "/etc/ssl/certs";
      $mech->{https_host}   = $args{https_host};
      bless $mech, $class;
  }
  
  # will be set by some other code, and will be immediately consumed and emptied
  # by _make_request().
  our $saved_resp;
  
  sub _make_request {
      my $self = shift;
      my $req = shift;
      local $ENV{HTTPS_CA_DIR} = $self->{verify_https} ?
          $self->{https_ca_dir} : '';
      log_trace("HTTPS_CA_DIR = %s", $ENV{HTTPS_CA_DIR});
      if ($self->{verify_https} && $self->{https_host}) {
          $req->header('If-SSL-Cert-Subject',
                       qr!\Q/CN=$self->{https_host}\E(/|$)!);
      }
      log_trace("Mech request:\n" . String::Indent::indent('  ', $req->headers_as_string));
      my $resp;
      if ($saved_resp) {
          $resp = $saved_resp;
          $saved_resp = undef;
          log_trace("Mech response (from saved):" .
                          String::Indent::indent('  ', $resp->headers_as_string));
      } else {
          $resp = $self->SUPER::_make_request($req, @_);
          log_trace("Mech response:\n" . String::Indent::indent('  ', $resp->headers_as_string));
      }
      $resp;
  }
  
  1;
  # ABSTRACT: A subclass of WWW::Mechanize
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Finance::BankUtils::ID::Mechanize - A subclass of WWW::Mechanize
  
  =head1 VERSION
  
  This document describes version 0.500 of Finance::BankUtils::ID::Mechanize (from Perl distribution Finance-Bank-ID-BCA), released on 2019-05-10.
  
  =head1 SYNOPSIS
  
   my $mech = Finance::BankUtils::ID::Mechanize->new(
       verify_https => 1,
       #https_ca_dir => '/etc/ssl/certs',
       https_host   => 'example.com',
   );
   # use as you would WWW::Mechanize object ...
  
  =head1 DESCRIPTION
  
  This is a subclass of WWW::Mechanize that can do some extra stuffs:
  
  =over
  
  =item * HTTPS certificate verification
  
  =item * use saved response from a file
  
  =item * log using Log::ger
  
  =back
  
  =head1 METHODS
  
  =head2 new()
  
  =head2 request()
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Finance-Bank-ID-BCA>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Finance-Bank-ID-BCA>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Finance-Bank-ID-BCA>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2019, 2017, 2015, 2014, 2013, 2012, 2011, 2010 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
FINANCE_BANKUTILS_ID_MECHANIZE

    $main::fatpacked{"Function/Fallback/CoreOrPP.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'FUNCTION_FALLBACK_COREORPP';
  package Function::Fallback::CoreOrPP;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-02-03'; # DATE
  our $DIST = 'Function-Fallback-CoreOrPP'; # DIST
  our $VERSION = '0.090'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  our $USE_NONCORE_XS_FIRST = 1;
  
  require Exporter;
  our @ISA       = qw(Exporter);
  our @EXPORT_OK = qw(
                         clone
                         clone_list
                         unbless
                         uniq
                 );
  
  sub clone {
      my $data = shift;
      goto FALLBACK unless $USE_NONCORE_XS_FIRST;
      goto FALLBACK unless eval { require Data::Clone; 1 };
  
    STANDARD:
      return Data::Clone::clone($data);
  
    FALLBACK:
      require Clone::PP;
      return Clone::PP::clone($data);
  }
  
  sub clone_list {
      map { clone($_) } @_;
  }
  
  sub _unbless_fallback {
      my $ref = shift;
  
      my $r = ref($ref);
      # not a reference
      return $ref unless $r;
  
      # return if not a blessed ref
      my ($r2, $r3) = "$ref" =~ /(.+)=(.+?)\(/
          or return $ref;
  
      if ($r3 eq 'HASH') {
          return { %$ref };
      } elsif ($r3 eq 'ARRAY') {
          return [ @$ref ];
      } elsif ($r3 eq 'SCALAR') {
          return \( my $copy = ${$ref} );
      } elsif ($r3 eq 'CODE') {
          return sub { goto &$ref };
      } else {
          die "Can't handle $ref";
      }
  }
  
  sub unbless {
      my $ref = shift;
  
      goto FALLBACK unless $USE_NONCORE_XS_FIRST;
      goto FALLBACK unless eval { require Acme::Damn; 1 };
  
    STANDARD:
      return Acme::Damn::damn($ref);
  
    FALLBACK:
      return _unbless_fallback($ref);
  }
  
  sub uniq {
      goto FALLBACK unless $USE_NONCORE_XS_FIRST;
      goto FALLBACK unless eval { require List::MoreUtils; 1 };
  
    STANDARD:
      return List::MoreUtils::uniq(@_);
  
    FALLBACK:
      my %h;
      my @res;
      for (@_) {
          push @res, $_ unless $h{$_}++;
      }
      return @res;
  }
  
  1;
  # ABSTRACT: Functions that use non-core XS module but provide pure-Perl/core fallback
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Function::Fallback::CoreOrPP - Functions that use non-core XS module but provide pure-Perl/core fallback
  
  =head1 VERSION
  
  This document describes version 0.090 of Function::Fallback::CoreOrPP (from Perl distribution Function-Fallback-CoreOrPP), released on 2020-02-03.
  
  =head1 SYNOPSIS
  
   use Function::Fallback::CoreOrPP qw(clone unbless uniq);
  
   my $clone = clone({blah=>1});
   my $unblessed = unbless($blessed_ref);
   my @uniq  = uniq(1, 3, 2, 1, 4);  # -> (1, 3, 2, 4)
  
  =head1 DESCRIPTION
  
  This module provides functions that use non-core XS modules (for best speed,
  reliability, feature, etc) but falls back to those that use core XS or pure-Perl
  modules when the non-core XS module is not available.
  
  This module helps when you want to bootstrap your Perl application with a
  portable, dependency-free Perl script. In a vanilla Perl installation (having
  only core modules), you can use L<App::FatPacker> to include non-core pure-Perl
  dependencies to your script.
  
  =for Pod::Coverage ^()$
  
  =head1 FUNCTIONS
  
  =head2 clone($data) => $cloned
  
  Try to use L<Data::Clone>'s C<clone>, but fall back to using L<Clone::PP>'s
  C<clone>.
  
  =head2 clone_list(@data) => @data
  
  A shortcut for:
  
   return map {clone($_)} @data
  
  =head2 unbless($ref) => $unblessed_ref
  
  Try to use L<Acme::Damn>'s C<damn> to unbless a reference but fall back to
  shallow copying.
  
  NOTE: C<damn()> B<MODIFIES> the original reference. (XXX in the future an option
  to clone the reference first will be provided), while shallow copying will
  return a shallow copy.
  
  NOTE: The shallow copy method currently only handles blessed
  {scalar,array,hash}ref as those are the most common.
  
  =head2 uniq(@ary) => @uniq_ary
  
  Try to use L<List::MoreUtils>'s C<uniq>, but fall back to using slower,
  pure-Perl implementation.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Function-Fallback-CoreOrPP>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Function-Fallback-CoreOrPP>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Function-Fallback-CoreOrPP>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Clone::Any> can also use multiple backends. I used to avoid it because
  L<Storable>'s C<dclone> (which is used as the backend) did not support Regexp
  objects out of the box until version 3.08. Plus must use deparse to handle
  coderefs.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2017, 2016, 2014 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
FUNCTION_FALLBACK_COREORPP

    $main::fatpacked{"Getopt/Long/Negate/EN.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'GETOPT_LONG_NEGATE_EN';
  package Getopt::Long::Negate::EN;
  
  our $DATE = '2019-04-23'; # DATE
  our $VERSION = '0.060'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  use Exporter qw(import);
  our @EXPORT_OK = qw(negations_for_option);
  
  sub negations_for_option {
      my $word = shift;
  
      if    ($word =~ /\Awith([_-].+)/   ) { return ("without$1") }
      elsif ($word =~ /\Awithout([_-].+)/) { return ("with$1")    }
  
      elsif ($word =~ /\Ais([_-].+)/     ) { return ("isnt$1")    }
      elsif ($word =~ /\Aisnt([_-].+)/   ) { return ("is$1")      }
      elsif ($word =~ /\Aare([_-].+)/    ) { return ("arent$1")   }
      elsif ($word =~ /\Aarent([_-].+)/  ) { return ("are$1")     }
  
      elsif ($word =~ /\Ahas([_-].+)/    ) { return ("hasnt$1")   }
      elsif ($word =~ /\Ahave([_-].+)/   ) { return ("havent$1")  }
      elsif ($word =~ /\Ahasnt([_-].+)/  ) { return ("has$1")     }
      elsif ($word =~ /\Ahavent([_-].+)/ ) { return ("have$1")    }
  
      elsif ($word =~ /\Acan([_-].+)/    ) { return ("cant$1")    }
      elsif ($word =~ /\Acant([_-].+)/   ) { return ("can$1")     }
  
      elsif ($word =~ /\Aenabled([_-].+)/ ) { return ("disabled$1") }
      elsif ($word =~ /\Adisabled([_-].+)/) { return ("enabled$1")  }
      elsif ($word =~ /\Aenable([_-].+)/ )  { return ("disable$1")  }
      elsif ($word =~ /\Adisable([_-].+)/)  { return ("enable$1")   }
  
      elsif ($word =~ /\Aallowed([_-].+)/ )   { return ("disallowed$1") }
      elsif ($word =~ /\Adisallowed([_-].+)/) { return ("allowed$1")    }
      elsif ($word =~ /\Aallow([_-].+)/ )     { return ("disallow$1")   }
      elsif ($word =~ /\Adisallow([_-].+)/)   { return ("allow$1")      }
  
      elsif ($word =~ /\Ainclude([_-].+)/ ) { return ("exclude$1") }
      elsif ($word =~ /\Aexclude([_-].+)/ ) { return ("include$1") }
  
      elsif ($word =~ /\Ano[_-](.+)/     ) { return ($1)          }
  
      else {
          # default from Getopt::Long
          return ("no-$word", "no$word");
      }
  }
  
  1;
  # ABSTRACT: Better negation of boolean option names
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Getopt::Long::Negate::EN - Better negation of boolean option names
  
  =head1 VERSION
  
  This document describes version 0.060 of Getopt::Long::Negate::EN (from Perl distribution Getopt-Long-Negate-EN), released on 2019-04-23.
  
  =head1 SYNOPSIS
  
   use Getopt::Long::Negate::EN qw(negations_for_option);
  
   # the Getopt::Long's default
   @negs = negations_for_option('foo'); # ('no-foo', 'nofoo')
  
   @negs = negations_for_option('with-foo');    # ('without-foo')
   @negs = negations_for_option('without-foo'); # ('with-foo')
  
   @negs = negations_for_option('is-foo');      # ('isnt-foo')
   @negs = negations_for_option('isnt-foo');    # ('is-foo')
   @negs = negations_for_option('are-foo');     # ('isnt-foo')
   @negs = negations_for_option('arent-foo');   # ('arent-foo')
  
   @negs = negations_for_option('has-foo');     # ('hasnt-foo')
   @negs = negations_for_option('hasnt-foo');   # ('has-foo')
   @negs = negations_for_option('have-foo');    # ('havent-foo')
   @negs = negations_for_option('havent-foo');  # ('have-foo')
  
   @negs = negations_for_option('can-foo');     # ('cant-foo')
   @negs = negations_for_option('cant-foo');    # ('can-foo')
  
   @negs = negations_for_option('enabled-foo'); # ('disabled-foo')
   @negs = negations_for_option('disabled-foo');# ('enabled-foo')
   @negs = negations_for_option('enable-foo');  # ('disable-foo')
   @negs = negations_for_option('disable-foo'); # ('enable-foo')
  
   @negs = negations_for_option('allowed-foo');    # ('disallowed-foo')
   @negs = negations_for_option('disallowed-foo'); # ('allowed-foo')
   @negs = negations_for_option('allow-foo');      # ('disallow-foo')
   @negs = negations_for_option('disallow-foo');   # ('allow-foo')
  
   @negs = negations_for_option('include-foo'); # ('exclude-foo')
   @negs = negations_for_option('exclude-foo'); # ('include-foo')
  
   @negs = negations_for_option('no-foo');      # ('foo')
  
  =head1 DESCRIPTION
  
  This module aims to provide a nicer negative boolean option names. By default,
  L<Getopt::Long> provides options C<--foo> as well as C<--no-foo> and C<--nofoo>
  if you specify boolean option specification C<foo!>. But this produces
  awkward/incorrect English word like C<--nowith-foo> or C<--no-is-foo>. In those
  two cases, C<--without-foo> and C<--isnt-foo> are better option names.
  
  =head1 FUNCTIONS
  
  None are exported by default, but they are exportable.
  
  =head2 negations_for_option($str) => list
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Getopt-Long-Negate-EN>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Getopt-Long-Negate-EN>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Getopt-Long-Negate-EN>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2019, 2016, 2015 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
GETOPT_LONG_NEGATE_EN

    $main::fatpacked{"Getopt/Long/Util.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'GETOPT_LONG_UTIL';
  package Getopt::Long::Util;
  
  our $DATE = '2017-08-10'; # DATE
  our $VERSION = '0.890'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  require Exporter;
  our @ISA       = qw(Exporter);
  our @EXPORT_OK = qw(
                         parse_getopt_long_opt_spec
                         humanize_getopt_long_opt_spec
                         detect_getopt_long_script
                         gen_getopt_long_spec_from_getopt_std_spec
                 );
  
  our %SPEC;
  
  $SPEC{parse_getopt_long_opt_spec} = {
      v => 1.1,
      summary => 'Parse a single Getopt::Long option specification',
      description => <<'_',
  
  Will produce a hash with some keys:
  
  * `is_arg` (if true, then option specification is the special `<>` for argument
    callback)
  * `opts` (array of option names, in the order specified in the opt spec)
  * `type` (string, type name)
  * `desttype` (either '', or '@' or '%'),
  * `is_neg` (true for `--opt!`)
  * `is_inc` (true for `--opt+`)
  * `min_vals` (int, usually 0 or 1)
  * `max_vals` (int, usually 0 or 1 except for option that requires multiple
    values)
  
  Will return undef if it can't parse the string.
  
  _
      args => {
          optspec => {
              schema => 'str*',
              req => 1,
              pos => 0,
          },
      },
      args_as => 'array',
      result_naked => 1,
      result => {
          schema => 'hash*',
      },
      examples => [
          {
              args => {optspec => 'help|h|?'},
              result => {dash_prefix=>'', opts=>['help', 'h', '?']},
          },
          {
              args => {optspec=>'--foo=s'},
              result => {dash_prefix=>'--', opts=>['foo'], type=>'s', desttype=>''},
          },
      ],
  };
  # BEGIN_BLOCK: parse_getopt_long_opt_spec
  sub parse_getopt_long_opt_spec {
      my $optspec = shift;
      return {is_arg=>1, dash_prefix=>'', opts=>[]}
          if $optspec eq '<>';
      $optspec =~ qr/\A
                 (?P<dash_prefix>-{0,2})
                 (?P<name>[A-Za-z0-9_][A-Za-z0-9_-]*)
                 (?P<aliases> (?: \| (?:[^:|!+=:-][^:|!+=:]*) )*)?
                 (?:
                     (?P<is_neg>!) |
                     (?P<is_inc>\+) |
                     (?:
                         =
                         (?P<type>[siof])
                         (?P<desttype>|[%@])?
                         (?:
                             \{
                             (?: (?P<min_vals>\d+), )?
                             (?P<max_vals>\d+)
                             \}
                         )?
                     ) |
                     (?:
                         :
                         (?P<opttype>[siof])
                         (?P<desttype>|[%@])
                     ) |
                     (?:
                         :
                         (?P<optnum>\d+)
                         (?P<desttype>|[%@])
                     )
                     (?:
                         :
                         (?P<optplus>\+)
                         (?P<desttype>|[%@])
                     )
                 )?
                 \z/x
                     or return undef;
      my %res = %+;
  
      if ($res{aliases}) {
          my @als;
          for my $al (split /\|/, $res{aliases}) {
              next unless length $al;
              next if $al eq $res{name};
              next if grep {$_ eq $al} @als;
              push @als, $al;
          }
          $res{opts} = [$res{name}, @als];
      } else {
          $res{opts} = [$res{name}];
      }
      delete $res{name};
      delete $res{aliases};
  
      $res{is_neg} = 1 if $res{is_neg};
      $res{is_inc} = 1 if $res{is_inc};
  
      \%res;
  }
  # END_BLOCK: parse_getopt_long_opt_spec
  
  $SPEC{humanize_getopt_long_opt_spec} = {
      v => 1.1,
      description => <<'_',
  
  Convert <pm:Getopt::Long> option specification like `help|h|?` or `--foo=s` or
  `debug!` into, respectively, `--help, -h, -?` or `--foo=s` or `--(no)debug`.
  Will die if can't parse the string. The output is suitable for including in
  help/usage text.
  
  _
      args => {
          optspec => {
              schema => 'str*',
              req => 1,
              pos => 0,
          },
      },
      args_as => 'array',
      result_naked => 1,
      result => {
          schema => 'str*',
      },
  };
  sub humanize_getopt_long_opt_spec {
      my $optspec = shift;
  
      my $parse = parse_getopt_long_opt_spec($optspec)
          or die "Can't parse opt spec $optspec";
  
      return "argument" if $parse->{is_arg};
  
      my $res = '';
      my $i = 0;
      for (@{ $parse->{opts} }) {
          $i++;
          $res .= ", " if length($res);
          if ($parse->{is_neg} && length($_) > 1) {
              $res .= "--(no)$_";
          } else {
              if (length($_) > 1) {
                  $res .= "--$_";
              } else {
                  $res .= "-$_";
              }
              $res .= "=$parse->{type}" if $i==1 && $parse->{type};
          }
      }
      $res;
  }
  
  $SPEC{detect_getopt_long_script} = {
      v => 1.1,
      summary => 'Detect whether a file is a Getopt::Long-based CLI script',
      description => <<'_',
  
  The criteria are:
  
  * the file must exist and readable;
  
  * (optional, if `include_noexec` is false) file must have its executable mode
    bit set;
  
  * content must start with a shebang C<#!>;
  
  * either: must be perl script (shebang line contains 'perl') and must contain
    something like `use Getopt::Long`;
  
  _
      args => {
          filename => {
              summary => 'Path to file to be checked',
              schema => 'str*',
              pos => 0,
              cmdline_aliases => {f=>{}},
          },
          string => {
              summary => 'String to be checked',
              schema => 'buf*',
          },
          include_noexec => {
              summary => 'Include scripts that do not have +x mode bit set',
              schema  => 'bool*',
              default => 1,
          },
      },
      args_rels => {
          'req_one' => ['filename', 'string'],
      },
  };
  sub detect_getopt_long_script {
      my %args = @_;
  
      (defined($args{filename}) xor defined($args{string}))
          or return [400, "Please specify either filename or string"];
      my $include_noexec  = $args{include_noexec}  // 1;
  
      my $yesno = 0;
      my $reason = "";
      my %extrameta;
  
      my $str = $args{string};
    DETECT:
      {
          if (defined $args{filename}) {
              my $fn = $args{filename};
              unless (-f $fn) {
                  $reason = "'$fn' is not a file";
                  last;
              };
              if (!$include_noexec && !(-x _)) {
                  $reason = "'$fn' is not an executable";
                  last;
              }
              my $fh;
              unless (open $fh, "<", $fn) {
                  $reason = "Can't be read";
                  last;
              }
              # for efficiency, we read a bit only here
              read $fh, $str, 2;
              unless ($str eq '#!') {
                  $reason = "Does not start with a shebang (#!) sequence";
                  last;
              }
              my $shebang = <$fh>;
              unless ($shebang =~ /perl/) {
                  $reason = "Does not have 'perl' in the shebang line";
                  last;
              }
              seek $fh, 0, 0;
              {
                  local $/;
                  $str = <$fh>;
              }
              close $fh;
          }
          unless ($str =~ /\A#!/) {
              $reason = "Does not start with a shebang (#!) sequence";
              last;
          }
          unless ($str =~ /\A#!.*perl/) {
              $reason = "Does not have 'perl' in the shebang line";
              last;
          }
  
          # NOTE: the presence of \s* pattern after ^ causes massive slowdown of
          # the regex when we reach many thousands of lines, so we use split()
  
          #if ($str =~ /^\s*(use|require)\s+(Getopt::Long(?:::Complete)?)(\s|;)/m) {
          #    $yesno = 1;
          #    $extrameta{'func.module'} = $2;
          #    last DETECT;
          #}
  
          for (split /^/, $str) {
              if (/^\s*(use|require)\s+(Getopt::Long(?:::Complete|::Less|::EvenLess)?)(\s|;|$)/) {
                  $yesno = 1;
                  $extrameta{'func.module'} = $2;
                  last DETECT;
              }
          }
  
          $reason = "Can't find any statement requiring Getopt::Long(?::Complete|::Less|::EvenLess)? module";
      } # DETECT
  
      [200, "OK", $yesno, {"func.reason"=>$reason, %extrameta}];
  }
  
  $SPEC{gen_getopt_long_spec_from_getopt_std_spec} = {
      v => 1.1,
      summary => 'Generate Getopt::Long spec from Getopt::Std spec',
      args => {
          spec => {
              summary => 'Getopt::Std spec string',
              schema => 'str*',
              req => 1,
              pos => 0,
          },
          is_getopt => {
              summary => 'Whether to assume spec is for getopt() or getopts()',
              description => <<'_',
  
  By default spec is assumed to be for getopts() instead of getopt(). This means
  that for a spec like `abc:`, `a` and `b` don't take argument while `c` does. But
  if `is_getopt` is true, the meaning of `:` is reversed: `a` and `b` take
  arguments while `c` doesn't.
  
  _
              schema => 'bool',
          },
      },
      result_naked => 1,
      result => {
          schema => 'hash*',
      },
  };
  sub gen_getopt_long_spec_from_getopt_std_spec {
      my %args = @_;
  
      my $is_getopt = $args{is_getopt};
      my $spec = {};
  
      while ($args{spec} =~ /(.)(:?)/g) {
          $spec->{$1 . ($is_getopt ? ($2 ? "" : "=s") : ($2 ? "=s" : ""))} =
              sub {};
      }
  
      $spec;
  }
  
  1;
  # ABSTRACT: Utilities for Getopt::Long
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Getopt::Long::Util - Utilities for Getopt::Long
  
  =head1 VERSION
  
  This document describes version 0.890 of Getopt::Long::Util (from Perl distribution Getopt-Long-Util), released on 2017-08-10.
  
  =head1 FUNCTIONS
  
  
  =head2 detect_getopt_long_script
  
  Usage:
  
   detect_getopt_long_script(%args) -> [status, msg, result, meta]
  
  Detect whether a file is a Getopt::Long-based CLI script.
  
  The criteria are:
  
  =over
  
  =item * the file must exist and readable;
  
  =item * (optional, if C<include_noexec> is false) file must have its executable mode
  bit set;
  
  =item * content must start with a shebang C<#!>;
  
  =item * either: must be perl script (shebang line contains 'perl') and must contain
  something like C<use Getopt::Long>;
  
  =back
  
  This function is not exported by default, but exportable.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<filename> => I<str>
  
  Path to file to be checked.
  
  =item * B<include_noexec> => I<bool> (default: 1)
  
  Include scripts that do not have +x mode bit set.
  
  =item * B<string> => I<buf>
  
  String to be checked.
  
  =back
  
  Returns an enveloped result (an array).
  
  First element (status) is an integer containing HTTP status code
  (200 means OK, 4xx caller error, 5xx function error). Second element
  (msg) is a string containing error message, or 'OK' if status is
  200. Third element (result) is optional, the actual result. Fourth
  element (meta) is called result metadata and is optional, a hash
  that contains extra information.
  
  Return value:  (any)
  
  
  =head2 gen_getopt_long_spec_from_getopt_std_spec
  
  Usage:
  
   gen_getopt_long_spec_from_getopt_std_spec(%args) -> hash
  
  Generate Getopt::Long spec from Getopt::Std spec.
  
  This function is not exported by default, but exportable.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<is_getopt> => I<bool>
  
  Whether to assume spec is for getopt() or getopts().
  
  By default spec is assumed to be for getopts() instead of getopt(). This means
  that for a spec like C<abc:>, C<a> and C<b> don't take argument while C<c> does. But
  if C<is_getopt> is true, the meaning of C<:> is reversed: C<a> and C<b> take
  arguments while C<c> doesn't.
  
  =item * B<spec>* => I<str>
  
  Getopt::Std spec string.
  
  =back
  
  Return value:  (hash)
  
  
  =head2 humanize_getopt_long_opt_spec
  
  Usage:
  
   humanize_getopt_long_opt_spec($optspec) -> str
  
  Convert L<Getopt::Long> option specification like C<help|h|?> or C<--foo=s> or
  C<debug!> into, respectively, C<--help, -h, -?> or C<--foo=s> or C<--(no)debug>.
  Will die if can't parse the string. The output is suitable for including in
  help/usage text.
  
  This function is not exported by default, but exportable.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<$optspec>* => I<str>
  
  =back
  
  Return value:  (str)
  
  
  =head2 parse_getopt_long_opt_spec
  
  Usage:
  
   parse_getopt_long_opt_spec($optspec) -> hash
  
  Parse a single Getopt::Long option specification.
  
  Examples:
  
  =over
  
  =item * Example #1:
  
   parse_getopt_long_opt_spec("help|h|?"); # -> { dash_prefix => "", opts => ["help", "h", "?"] }
  
  =item * Example #2:
  
   parse_getopt_long_opt_spec("--foo=s"); # -> { dash_prefix => "--", desttype => "", opts => ["foo"], type => "s" }
  
  =back
  
  Will produce a hash with some keys:
  
  =over
  
  =item * C<is_arg> (if true, then option specification is the special C<< E<lt>E<gt> >> for argument
  callback)
  
  =item * C<opts> (array of option names, in the order specified in the opt spec)
  
  =item * C<type> (string, type name)
  
  =item * C<desttype> (either '', or '@' or '%'),
  
  =item * C<is_neg> (true for C<--opt!>)
  
  =item * C<is_inc> (true for C<--opt+>)
  
  =item * C<min_vals> (int, usually 0 or 1)
  
  =item * C<max_vals> (int, usually 0 or 1 except for option that requires multiple
  values)
  
  =back
  
  Will return undef if it can't parse the string.
  
  This function is not exported by default, but exportable.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<$optspec>* => I<str>
  
  =back
  
  Return value:  (hash)
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Getopt-Long-Util>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/sharyanto/perl-Getopt-Long-Util>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Getopt-Long-Util>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Getopt::Long>
  
  L<Getopt::Long::Spec>, which can also parse Getopt::Long spec into hash as well
  as transform back the hash to Getopt::Long spec. OO interface. I should've found
  this module first before writing my own C<parse_getopt_long_opt_spec()>. But at
  least currently C<parse_getopt_long_opt_spec()> is at least about 30-100+%
  faster than Getopt::Long::Spec::Parser, has a much simpler implementation (a
  single regex match), and can handle valid Getopt::Long specs that
  Getopt::Long::Spec::Parser fails to parse, e.g. C<foo|f=s@>.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2017, 2016, 2015, 2014 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
GETOPT_LONG_UTIL

    $main::fatpacked{"HTML/AsSubs.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'HTML_ASSUBS';
  package HTML::AsSubs;
  
  # ABSTRACT: functions that construct a HTML syntax tree
  
  
  use warnings;
  use strict;
  use vars qw(@ISA @EXPORT);
  
  our $VERSION = '5.07'; # VERSION from OurPkgVersion
  
  require HTML::Element;
  require Exporter;
  @ISA = qw(Exporter);
  
  # Problem: exports so damned much.  Has no concept of "export only HTML4
  #  elements".  TODO:?? make something that make functions that just
  #  wrap XML::Generator calls?
  
  
  use vars qw(@TAGS);
  @TAGS = qw(html
      head title base link meta isindex nextid script style
      body h1 h2 h3 h4 h5 h6 p pre div blockquote
      a img br hr
      ol ul dir menu li
      dl dt dd
      dfn cite code em kbd samp strong var address span
      b i u tt
      center font big small strike
      sub sup
      table tr td th caption
      form input select option textarea
      object applet param
      map area
      frame frameset noframe
  );
  
  for (@TAGS) {
      my $code;
      $code = "sub $_ { _elem('$_', \@_); }\n";
      push( @EXPORT, $_ );
  ## no critic
      eval $code;
  ## use critic
      if ($@) {
          die $@;
      }
  }
  
  
  sub _elem {
      my $tag = shift;
      my $attributes;
      if ( @_ and defined $_[0] and ref( $_[0] ) eq "HASH" ) {
          $attributes = shift;
      }
      my $elem = HTML::Element->new( $tag, %$attributes );
      $elem->push_content(@_);
      $elem;
  }
  
  1;
  
  __END__
  
  =pod
  
  =head1 NAME
  
  HTML::AsSubs - functions that construct a HTML syntax tree
  
  =head1 VERSION
  
  This document describes version 5.07 of
  HTML::AsSubs, released August 31, 2017
  as part of L<HTML-Tree|HTML::Tree>.
  
  =head1 SYNOPSIS
  
   use HTML::AsSubs;
   $h = body(
  	   h1("This is the heading"),
  	   p("This is the first paragraph which contains a ",
  	     a({href=>'link.html'}, "link"),
  	     " and an ",
  	     img({src=>'img.gif', alt=>'image'}),
  	     "."
  	    ),
  	  );
   print $h->as_HTML;
  
  =head1 DESCRIPTION
  
  This module exports functions that can be used to construct various
  HTML elements. The functions are named after the tags of the
  corresponding HTML element and are all written in lower case. If the
  first argument is a hash reference then it will be used to initialize the
  attributes of this element. The remaining arguments are regarded as
  content.
  
  For a similar idea (i.e., it's another case where the syntax tree
  of the Perl source mirrors the syntax tree of the HTML produced),
  see HTML::Element's C<new_from_lol> method.
  
  For what I now think is a cleaner implementation of this same idea,
  see the excellent module C<XML::Generator>, which is what I suggest
  for actual real-life use.  (I suggest this over C<HTML::AsSubs> and
  over C<CGI.pm>'s HTML-making functions.)
  
  =head1 ACKNOWLEDGEMENT
  
  This module was inspired by the following message:
  
   Date: Tue, 4 Oct 1994 16:11:30 +0100
   Subject: Wow! I have a large lightbulb above my head!
  
   Take a moment to consider these lines:
  
   %OVERLOAD=( '""' => sub { join("", @{$_[0]}) } );
  
   sub html { my($type)=shift; bless ["<$type>", @_, "</$type>"]; }
  
   :-)  I *love* Perl 5!  Thankyou Larry and Ilya.
  
   Regards,
   Tim Bunce.
  
   p.s. If you didn't get it, think about recursive data types: html(html())
   p.p.s. I'll turn this into a much more practical example in a day or two.
   p.p.p.s. It's a pity that overloads are not inherited. Is this a bug?
  
  =head1 BUGS
  
  The exported link() function overrides the builtin link() function.
  The exported tr() function must be called using &tr(...) syntax
  because it clashes with the builtin tr/../../ operator.
  
  =head1 SEE ALSO
  
  L<HTML::Element>, L<XML::Generator>
  
  =head2 html head title base link meta isindex nextid script style body h1 h2 h3 h4 h5 h6 p pre div blockquote a img br hr ol ul dir menu li dl dt dd dfn cite code em kbd samp strong var address span b i u tt center font big small strike sub sup table tr td th caption form input select option textarea object applet param map area frame frameset noframe
  
  A bunch of methods for creating tags.
  
  =head1 Private Functions
  
  =head2 _elem()
  
  The _elem() function is wrapped by all the html 'tag' functions. It
  takes a tag-name, optional hashref of attributes and a list of content
  as parameters.
  
  =head1 AUTHOR
  
  Current maintainers:
  
  =over
  
  =item * Christopher J. Madsen S<C<< <perl AT cjmweb.net> >>>
  
  =item * Jeff Fearn S<C<< <jfearn AT cpan.org> >>>
  
  =back
  
  Original HTML-Tree author:
  
  =over
  
  =item * Gisle Aas
  
  =back
  
  Former maintainers:
  
  =over
  
  =item * Sean M. Burke
  
  =item * Andy Lester
  
  =item * Pete Krawczyk S<C<< <petek AT cpan.org> >>>
  
  =back
  
  You can follow or contribute to HTML-Tree's development at
  L<< https://github.com/kentfredric/HTML-Tree >>.
  
  =head1 COPYRIGHT AND LICENSE
  
  Copyright 1995-1998 Gisle Aas, 1999-2004 Sean M. Burke,
  2005 Andy Lester, 2006 Pete Krawczyk, 2010 Jeff Fearn,
  2012 Christopher J. Madsen.
  
  This library is free software; you can redistribute it and/or
  modify it under the same terms as Perl itself.
  
  The programs in this library are distributed in the hope that they
  will be useful, but without any warranty; without even the implied
  warranty of merchantability or fitness for a particular purpose.
  
  =cut
HTML_ASSUBS

    $main::fatpacked{"HTML/Element.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'HTML_ELEMENT';
  package HTML::Element;
  
  # ABSTRACT: Class for objects that represent HTML elements
  
  use strict;
  use warnings;
  
  our $VERSION = '5.07'; # VERSION from OurPkgVersion
  
  use Carp           ();
  use HTML::Entities ();
  use HTML::Tagset   ();
  use integer;    # vroom vroom!
  
  # This controls encoding entities on output.
  # When set entities won't be re-encoded.
  # Defaulting off because parser defaults to unencoding entities
  our $encoded_content = 0;
  
  use vars qw($html_uc $Debug $ID_COUNTER $VERSION %list_type_to_sub);
  
  # Set up support for weak references, if possible:
  my $using_weaken;
  
  #=head1 CLASS METHODS
  
  
  sub Use_Weak_Refs {
      my $self_or_class = shift;
  
      if (@_) {    # set
          $using_weaken = !! shift; # Normalize boolean value
          Carp::croak("The installed Scalar::Util lacks support for weak references")
                if $using_weaken and not defined &Scalar::Util::weaken;
  
          no warnings 'redefine';
          *_weaken = $using_weaken ? \&Scalar::Util::weaken : sub ($) {};
      } # end if setting value
  
      return $using_weaken;
  } # end Use_Weak_Refs
  
  BEGIN {
      # Attempt to import weaken from Scalar::Util, but don't complain
      # if we can't.  Also, rename it to _weaken.
      require Scalar::Util;
  
      __PACKAGE__->Use_Weak_Refs(defined &Scalar::Util::weaken);
  }
  
  sub import {
      my $class = shift;
  
      for (@_) {
          if (/^-(no_?)?weak$/) {
              $class->Use_Weak_Refs(not $1);
          } else {
              Carp::croak("$_ is not exported by the $class module");
          }
      }
  } # end import
  
  
  $Debug = 0 unless defined $Debug;
  
  #=head1 SUBROUTINES
  
  
  sub Version {
      Carp::carp("Deprecated subroutine HTML::Element::Version called");
      $VERSION;
  }
  
  my $nillio = [];
  
  *HTML::Element::emptyElement   = \%HTML::Tagset::emptyElement;      # legacy
  *HTML::Element::optionalEndTag = \%HTML::Tagset::optionalEndTag;    # legacy
  *HTML::Element::linkElements   = \%HTML::Tagset::linkElements;      # legacy
  *HTML::Element::boolean_attr   = \%HTML::Tagset::boolean_attr;      # legacy
  *HTML::Element::canTighten     = \%HTML::Tagset::canTighten;        # legacy
  
  # Constants for signalling back to the traverser:
  my $travsignal_package = __PACKAGE__ . '::_travsignal';
  my ( $ABORT, $PRUNE, $PRUNE_SOFTLY, $OK, $PRUNE_UP )
      = map { my $x = $_; bless \$x, $travsignal_package; }
      qw(
      ABORT  PRUNE   PRUNE_SOFTLY   OK   PRUNE_UP
  );
  
  
  ## Comments from Father Chrysostomos RT #58880
  ## The sole purpose for empty parentheses after a sub name is to make it
  ## parse as a 0-ary (nihilary?) function. I.e., ABORT+1 should parse as
  ## ABORT()+1, not ABORT(+1). The parentheses also tell perl that it can
  ### be inlined.
  ##Deparse is really useful for demonstrating this:
  ##$ perl -MO=Deparse,-p -e 'sub ABORT {7} print ABORT+8'
  # Vs
  # perl -MO=Deparse,-p -e 'sub ABORT() {7} print ABORT+8'
  #
  # With the parentheses, it not only makes it parse as a term.
  # It even resolves the constant at compile-time, making the code run faster.
  
  ## no critic
  sub ABORT ()        {$ABORT}
  sub PRUNE ()        {$PRUNE}
  sub PRUNE_SOFTLY () {$PRUNE_SOFTLY}
  sub OK ()           {$OK}
  sub PRUNE_UP ()     {$PRUNE_UP}
  ## use critic
  
  $html_uc = 0;
  
  # set to 1 if you want tag and attribute names from starttag and endtag
  #  to be uc'd
  
  # regexs for XML names
  # http://www.w3.org/TR/2006/REC-xml11-20060816/NT-NameStartChar
  my $START_CHAR
      = qr/(?:\:|[A-Z]|_|[a-z]|[\x{C0}-\x{D6}]|[\x{D8}-\x{F6}]|[\x{F8}-\x{2FF}]|[\x{370}-\x{37D}]|[\x{37F}-\x{1FFF}]|[\x{200C}-\x{200D}]|[\x{2070}-\x{218F}]|[\x{2C00}-\x{2FEF}]|[\x{3001}-\x{D7FF}]|[\x{F900}-\x{FDCF}]|[\x{FDF0}-\x{FFFD}]|[\x{10000}-\x{EFFFF}])/;
  
  # http://www.w3.org/TR/2006/REC-xml11-20060816/#NT-NameChar
  my $NAME_CHAR
      = qr/(?:$START_CHAR|-|\.|[0-9]|\x{B7}|[\x{0300}-\x{036F}]|[\x{203F}-\x{2040}])/;
  
  # Elements that does not have corresponding end tags (i.e. are empty)
  
  #==========================================================================
  
  #=head1 BASIC METHODS
  
  
  #
  # An HTML::Element is represented by blessed hash reference, much like
  # Tree::DAG_Node objects.  Key-names not starting with '_' are reserved
  # for the SGML attributes of the element.
  # The following special keys are used:
  #
  #    '_tag':    The tag name (i.e., the generic identifier)
  #    '_parent': A reference to the HTML::Element above (when forming a tree)
  #    '_pos':    The current position (a reference to a HTML::Element) is
  #               where inserts will be placed (look at the insert_element
  #               method)  If not set, the implicit value is the object itself.
  #    '_content': A ref to an array of nodes under this.
  #                It might not be set.
  #
  # Example: <img src="gisle.jpg" alt="Gisle's photo"> is represented like this:
  #
  #  bless {
  #     _tag => 'img',
  #     src  => 'gisle.jpg',
  #     alt  => "Gisle's photo",
  #  }, 'HTML::Element';
  #
  
  sub new {
      my $class = shift;
      $class = ref($class) || $class;
  
      my $tag = shift;
      Carp::croak("No tagname") unless defined $tag and length $tag;
      Carp::croak "\"$tag\" isn't a good tag name!"
          if $tag =~ m/[<>\/\x00-\x20]/;    # minimal sanity, certainly!
      my $self = bless { _tag => scalar( $class->_fold_case($tag) ) }, $class;
      my ( $attr, $val );
      while ( ( $attr, $val ) = splice( @_, 0, 2 ) ) {
  ## RT #42209 why does this default to the attribute name and not remain unset or the empty string?
          $val = $attr unless defined $val;
          $self->{ $class->_fold_case($attr) } = $val;
      }
      if ( $tag eq 'html' ) {
          $self->{'_pos'} = undef;
      }
      _weaken($self->{'_parent'}) if $self->{'_parent'};
      return $self;
  }
  
  
  sub attr {
      my $self = shift;
      my $attr = scalar( $self->_fold_case(shift) );
      if (@_) {    # set
          if ( defined $_[0] ) {
              my $old = $self->{$attr};
              $self->{$attr} = $_[0];
              return $old;
          }
          else {    # delete, actually
              return delete $self->{$attr};
          }
      }
      else {        # get
          return $self->{$attr};
      }
  }
  
  
  sub tag {
      my $self = shift;
      if (@_) {    # set
          $self->{'_tag'} = $self->_fold_case( $_[0] );
      }
      else {       # get
          $self->{'_tag'};
      }
  }
  
  
  sub parent {
      my $self = shift;
      if (@_) {    # set
          Carp::croak "an element can't be made its own parent"
              if defined $_[0] and ref $_[0] and $self eq $_[0];    # sanity
          _weaken($self->{'_parent'} = $_[0]);
      }
      else {
          $self->{'_parent'};                                       # get
      }
  }
  
  
  sub content_list {
      return wantarray
          ? @{ shift->{'_content'} || return () }
          : scalar @{ shift->{'_content'} || return 0 };
  }
  
  
  # a read-only method!  can't say $h->content( [] )!
  sub content {
      return shift->{'_content'};
  }
  
  
  sub content_array_ref {
      return shift->{'_content'} ||= [];
  }
  
  
  sub content_refs_list {
      return \( @{ shift->{'_content'} || return () } );
  }
  
  
  sub implicit {
      return shift->attr( '_implicit', @_ );
  }
  
  
  sub pos {
      my $self = shift;
      my $pos  = $self->{'_pos'};
      if (@_) {    # set
          my $parm = shift;
          if ( defined $parm and $parm ne $self ) {
              $self->{'_pos'} = $parm;    # means that element
          }
          else {
              $self->{'_pos'} = undef;    # means $self
          }
      }
      return $pos if defined($pos);
      return $self;
  }
  
  
  sub all_attr {
      return %{ $_[0] };
  
      # Yes, trivial.  But no other way for the user to do the same
      #  without breaking encapsulation.
      # And if our object representation changes, this method's behavior
      #  should stay the same.
  }
  
  sub all_attr_names {
      return keys %{ $_[0] };
  }
  
  
  sub all_external_attr {
      my $self = $_[0];
      return map( ( length($_) && substr( $_, 0, 1 ) eq '_' )
          ? ()
          : ( $_, $self->{$_} ),
          keys %$self );
  }
  
  sub all_external_attr_names {
      return grep !( length($_) && substr( $_, 0, 1 ) eq '_' ), keys %{ $_[0] };
  }
  
  
  sub id {
      if ( @_ == 1 ) {
          return $_[0]{'id'};
      }
      elsif ( @_ == 2 ) {
          if ( defined $_[1] ) {
              return $_[0]{'id'} = $_[1];
          }
          else {
              return delete $_[0]{'id'};
          }
      }
      else {
          Carp::croak '$node->id can\'t take ' . scalar(@_) . ' parameters!';
      }
  }
  
  
  sub _gensym {
      unless ( defined $ID_COUNTER ) {
  
          # start it out...
          $ID_COUNTER = sprintf( '%04x', rand(0x1000) );
          $ID_COUNTER =~ tr<0-9a-f><J-NP-Z>;    # yes, skip letter "oh"
          $ID_COUNTER .= '00000';
      }
      ++$ID_COUNTER;
  }
  
  sub idf {
      my $nparms = scalar @_;
  
      if ( $nparms == 1 ) {
          my $x;
          if ( defined( $x = $_[0]{'id'} ) and length $x ) {
              return $x;
          }
          else {
              return $_[0]{'id'} = _gensym();
          }
      }
      if ( $nparms == 2 ) {
          if ( defined $_[1] ) {
              return $_[0]{'id'} = $_[1];
          }
          else {
              return delete $_[0]{'id'};
          }
      }
      Carp::croak '$node->idf can\'t take ' . scalar(@_) . ' parameters!';
  }
  
  
  sub push_content {
      my $self = shift;
      return $self unless @_;
  
      my $content = ( $self->{'_content'} ||= [] );
      for (@_) {
          if ( ref($_) eq 'ARRAY' ) {
  
              # magically call new_from_lol
              push @$content, $self->new_from_lol($_);
              _weaken($content->[-1]->{'_parent'} = $self);
          }
          elsif ( ref($_) ) {    # insert an element
              $_->detach if $_->{'_parent'};
              _weaken($_->{'_parent'} = $self);
              push( @$content, $_ );
          }
          else {                 # insert text segment
              if ( @$content && !ref $content->[-1] ) {
  
                  # last content element is also text segment -- append
                  $content->[-1] .= $_;
              }
              else {
                  push( @$content, $_ );
              }
          }
      }
      return $self;
  }
  
  
  sub unshift_content {
      my $self = shift;
      return $self unless @_;
  
      my $content = ( $self->{'_content'} ||= [] );
      for ( reverse @_ ) {    # so they get added in the order specified
          if ( ref($_) eq 'ARRAY' ) {
  
              # magically call new_from_lol
              unshift @$content, $self->new_from_lol($_);
              _weaken($content->[0]->{'_parent'} = $self);
          }
          elsif ( ref $_ ) {    # insert an element
              $_->detach if $_->{'_parent'};
              _weaken($_->{'_parent'} = $self);
              unshift( @$content, $_ );
          }
          else {                # insert text segment
              if ( @$content && !ref $content->[0] ) {
  
                  # last content element is also text segment -- prepend
                  $content->[0] = $_ . $content->[0];
              }
              else {
                  unshift( @$content, $_ );
              }
          }
      }
      return $self;
  }
  
  # Cf.  splice ARRAY,OFFSET,LENGTH,LIST
  
  
  sub splice_content {
      my ( $self, $offset, $length, @to_add ) = @_;
      Carp::croak "splice_content requires at least one argument"
          if @_ < 2;    # at least $h->splice_content($offset);
  
      my $content = ( $self->{'_content'} ||= [] );
  
      # prep the list
  
      my @out;
      if ( @_ > 2 ) {    # self, offset, length, ...
          foreach my $n (@to_add) {
              if ( ref($n) eq 'ARRAY' ) {
                  $n = $self->new_from_lol($n);
                  _weaken($n->{'_parent'} = $self);
              }
              elsif ( ref($n) ) {
                  $n->detach;
                  _weaken($n->{'_parent'} = $self);
              }
          }
          @out = splice @$content, $offset, $length, @to_add;
      }
      else {    #  self, offset
          @out = splice @$content, $offset;
      }
      foreach my $n (@out) {
          $n->{'_parent'} = undef if ref $n;
      }
      return @out;
  }
  
  
  sub detach {
      my $self = $_[0];
      return undef unless ( my $parent = $self->{'_parent'} );
      $self->{'_parent'} = undef;
      my $cohort = $parent->{'_content'} || return $parent;
      @$cohort = grep { not( ref($_) and $_ eq $self ) } @$cohort;
  
      # filter $self out, if parent has any evident content
  
      return $parent;
  }
  
  
  sub detach_content {
      my $c = $_[0]->{'_content'} || return ();    # in case of no content
      for (@$c) {
          $_->{'_parent'} = undef if ref $_;
      }
      return splice @$c;
  }
  
  
  sub replace_with {
      my ( $self, @replacers ) = @_;
      Carp::croak "the target node has no parent"
          unless my ($parent) = $self->{'_parent'};
  
      my $parent_content = $parent->{'_content'};
      Carp::croak "the target node's parent has no content!?"
          unless $parent_content and @$parent_content;
  
      my $replacers_contains_self;
      for (@replacers) {
          if ( !ref $_ ) {
  
              # noop
          }
          elsif ( $_ eq $self ) {
  
              # noop, but check that it's there just once.
              Carp::croak "Replacement list contains several copies of target!"
                  if $replacers_contains_self++;
          }
          elsif ( $_ eq $parent ) {
              Carp::croak "Can't replace an item with its parent!";
          }
          elsif ( ref($_) eq 'ARRAY' ) {
              $_ = $self->new_from_lol($_);
              _weaken($_->{'_parent'} = $parent);
          }
          else {
              $_->detach;
              _weaken($_->{'_parent'} = $parent);
  
              # each of these are necessary
          }
      }    # for @replacers
      @$parent_content = map { ( ref($_) and $_ eq $self ) ? @replacers : $_ }
          @$parent_content;
  
      $self->{'_parent'} = undef unless $replacers_contains_self;
  
      # if replacers does contain self, then the parent attribute is fine as-is
  
      return $self;
  }
  
  
  sub preinsert {
      my $self = shift;
      return $self unless @_;
      return $self->replace_with( @_, $self );
  }
  
  
  sub postinsert {
      my $self = shift;
      return $self unless @_;
      return $self->replace_with( $self, @_ );
  }
  
  
  sub replace_with_content {
      my $self = $_[0];
      Carp::croak "the target node has no parent"
          unless my ($parent) = $self->{'_parent'};
  
      my $parent_content = $parent->{'_content'};
      Carp::croak "the target node's parent has no content!?"
          unless $parent_content and @$parent_content;
  
      my $content_r = $self->{'_content'} || [];
      @$parent_content = map { ( ref($_) and $_ eq $self ) ? @$content_r : $_ }
          @$parent_content;
  
      $self->{'_parent'} = undef;    # detach $self from its parent
  
      # Update parentage link, removing from $self's content list
      for ( splice @$content_r ) { _weaken($_->{'_parent'} = $parent) if ref $_ }
  
      return $self;                  # note: doesn't destroy it.
  }
  
  
  sub delete_content {
      for (
          splice @{
              delete( $_[0]->{'_content'} )
  
                  # Deleting it here (while holding its value, for the moment)
                  #  will keep calls to detach() from trying to uselessly filter
                  #  the list (as they won't be able to see it once it's been
                  #  deleted)
                  || return ( $_[0] )    # in case of no content
          },
          0
  
          # the splice is so we can null the array too, just in case
          # something somewhere holds a ref to it
          )
      {
          $_->delete if ref $_;
      }
      $_[0];
  }
  
  
  # two handy aliases
  sub destroy         { shift->delete(@_) }
  sub destroy_content { shift->delete_content(@_) }
  
  sub delete {
      my $self = $_[0];
      $self->delete_content    # recurse down
          if $self->{'_content'} && @{ $self->{'_content'} };
  
      $self->detach if $self->{'_parent'} and $self->{'_parent'}{'_content'};
  
      # not the typical case
  
      %$self = ();             # null out the whole object on the way out
      return;
  }
  
  
  sub clone {
  
      #print "Cloning $_[0]\n";
      my $it = shift;
      Carp::croak "clone() can be called only as an object method"
          unless ref $it;
      Carp::croak "clone() takes no arguments" if @_;
  
      my $new = bless {%$it}, ref($it);    # COPY!!! HOOBOY!
      delete @$new{ '_content', '_parent', '_pos', '_head', '_body' };
  
      # clone any contents
      if ( $it->{'_content'} and @{ $it->{'_content'} } ) {
          $new->{'_content'}
              = [ ref($it)->clone_list( @{ $it->{'_content'} } ) ];
          for ( @{ $new->{'_content'} } ) {
              _weaken($_->{'_parent'} = $new) if ref $_;
          }
      }
  
      return $new;
  }
  
  
  sub clone_list {
      Carp::croak "clone_list can be called only as a class method"
          if ref shift @_;
  
      # all that does is get me here
      return map {
          ref($_)
              ? $_->clone    # copy by method
              : $_           # copy by evaluation
      } @_;
  }
  
  
  sub normalize_content {
      my $start = $_[0];
      my $c;
      return
          unless $c = $start->{'_content'} and ref $c and @$c;   # nothing to do
          # TODO: if we start having text elements, deal with catenating those too?
      my @stretches = (undef);    # start with a barrier
  
      # I suppose this could be rewritten to treat stretches as it goes, instead
      #  of at the end.  But feh.
  
      # Scan:
      for ( my $i = 0; $i < @$c; ++$i ) {
          if ( defined $c->[$i] and ref $c->[$i] ) {    # not a text segment
              if ( $stretches[0] ) {
  
                  # put in a barrier
                  if ( $stretches[0][1] == 1 ) {
  
                      #print "Nixing stretch at ", $i-1, "\n";
                      undef $stretches[0]; # nix the previous one-node "stretch"
                  }
                  else {
  
                      #print "End of stretch at ", $i-1, "\n";
                      unshift @stretches, undef;
                  }
              }
  
              # else no need for a barrier
          }
          else {                           # text segment
              $c->[$i] = '' unless defined $c->[$i];
              if ( $stretches[0] ) {
                  ++$stretches[0][1];      # increase length
              }
              else {
  
                  #print "New stretch at $i\n";
                  unshift @stretches, [ $i, 1 ];    # start and length
              }
          }
      }
  
      # Now combine.  Note that @stretches is in reverse order, so the indexes
      # still make sense as we work our way thru (i.e., backwards thru $c).
      foreach my $s (@stretches) {
          if ( $s and $s->[1] > 1 ) {
  
              #print "Stretch at ", $s->[0], " for ", $s->[1], "\n";
              $c->[ $s->[0] ]
                  .= join( '', splice( @$c, $s->[0] + 1, $s->[1] - 1 ) )
  
                  # append the subsequent ones onto the first one.
          }
      }
      return;
  }
  
  
  sub delete_ignorable_whitespace {
  
      # This doesn't delete all sorts of whitespace that won't actually
      #  be used in rendering, tho -- that's up to the rendering application.
      # For example:
      #   <input type='text' name='foo'>
      #     [some whitespace]
      #   <input type='text' name='bar'>
      # The WS between the two elements /will/ get used by the renderer.
      # But here:
      #   <input type='hidden' name='foo' value='1'>
      #     [some whitespace]
      #   <input type='text' name='bar' value='2'>
      # the WS between them won't be rendered in any way, presumably.
  
      #my $Debug = 4;
      die "delete_ignorable_whitespace can be called only as an object method"
          unless ref $_[0];
  
      print "About to tighten up...\n" if $Debug > 2;
      my (@to_do) = ( $_[0] );    # Start off.
      my ( $i, $sibs, $ptag, $this );    # scratch for the loop...
      while (@to_do) {
          if (   ( $ptag = ( $this = shift @to_do )->{'_tag'} ) eq 'pre'
              or $ptag eq 'textarea'
              or $HTML::Tagset::isCDATA_Parent{$ptag} )
          {
  
              # block the traversal under those
              print "Blocking traversal under $ptag\n" if $Debug;
              next;
          }
          next unless ( $sibs = $this->{'_content'} and @$sibs );
          for ( $i = $#$sibs; $i >= 0; --$i ) {   # work backwards thru the list
              if ( ref $sibs->[$i] ) {
                  unshift @to_do, $sibs->[$i];
  
                  # yes, this happens in pre order -- we're going backwards
                  # thru this sibling list.  I doubt it actually matters, tho.
                  next;
              }
              next if $sibs->[$i] =~ m<[^\n\r\f\t ]>s;   # it's /all/ whitespace
  
              print "Under $ptag whose canTighten ",
                  "value is ", 0 + $HTML::Element::canTighten{$ptag}, ".\n"
                  if $Debug > 3;
  
              # It's all whitespace...
  
              if ( $i == 0 ) {
                  if ( @$sibs == 1 ) {                   # I'm an only child
                      next unless $HTML::Element::canTighten{$ptag};    # parent
                  }
                  else {    # I'm leftmost of many
                            # if either my parent or sib are eligible, I'm good.
                      next
                          unless $HTML::Element::canTighten{$ptag}    # parent
                              or (ref $sibs->[1]
                                  and $HTML::Element::canTighten{ $sibs->[1]
                                          {'_tag'} }    # right sib
                              );
                  }
              }
              elsif ( $i == $#$sibs ) {                 # I'm rightmost of many
                      # if either my parent or sib are eligible, I'm good.
                  next
                      unless $HTML::Element::canTighten{$ptag}    # parent
                          or (ref $sibs->[ $i - 1 ]
                              and $HTML::Element::canTighten{ $sibs->[ $i - 1 ]
                                      {'_tag'} }                  # left sib
                          );
              }
              else {    # I'm the piggy in the middle
                        # My parent doesn't matter -- it all depends on my sibs
                  next
                      unless ref $sibs->[ $i - 1 ]
                          or ref $sibs->[ $i + 1 ];
  
                  # if NEITHER sib is a node, quit
  
                  next if
  
                      # bailout condition: if BOTH are INeligible nodes
                      #  (as opposed to being text, or being eligible nodes)
                      ref $sibs->[ $i - 1 ]
                          and ref $sibs->[ $i + 1 ]
                          and !$HTML::Element::canTighten{ $sibs->[ $i - 1 ]
                                  {'_tag'} }    # left sib
                          and !$HTML::Element::canTighten{ $sibs->[ $i + 1 ]
                                  {'_tag'} }    # right sib
                  ;
              }
  
         # Unknown tags aren't in canTighten and so AREN'T subject to tightening
  
              print "  delendum: child $i of $ptag\n" if $Debug > 3;
              splice @$sibs, $i, 1;
          }
  
          # end of the loop-over-children
      }
  
      # end of the while loop.
  
      return;
  }
  
  
  sub insert_element {
      my ( $self, $tag, $implicit ) = @_;
      return $self->pos() unless $tag;    # noop if nothing to insert
  
      my $e;
      if ( ref $tag ) {
          $e   = $tag;
          $tag = $e->tag;
      }
      else {    # just a tag name -- so make the element
          $e = $self->element_class->new($tag);
          ++( $self->{'_element_count'} ) if exists $self->{'_element_count'};
  
          # undocumented.  see TreeBuilder.
      }
  
      $e->{'_implicit'} = 1 if $implicit;
  
      my $pos = $self->{'_pos'};
      $pos = $self unless defined $pos;
  
      $pos->push_content($e);
  
      $self->{'_pos'} = $pos = $e
          unless $self->_empty_element_map->{$tag} || $e->{'_empty_element'};
  
      $pos;
  }
  
  #==========================================================================
  # Some things to override in XML::Element
  
  sub _empty_element_map {
      \%HTML::Element::emptyElement;
  }
  
  sub _fold_case_LC {
      if (wantarray) {
          shift;
          map lc($_), @_;
      }
      else {
          return lc( $_[1] );
      }
  }
  
  sub _fold_case_NOT {
      if (wantarray) {
          shift;
          @_;
      }
      else {
          return $_[1];
      }
  }
  
  *_fold_case = \&_fold_case_LC;
  
  #==========================================================================
  
  #=head1 DUMPING METHODS
  
  
  sub dump {
      my ( $self, $fh, $depth ) = @_;
      $fh    = *STDOUT{IO} unless defined $fh;
      $depth = 0           unless defined $depth;
      print $fh "  " x $depth, $self->starttag, " \@", $self->address,
          $self->{'_implicit'} ? " (IMPLICIT)\n" : "\n";
      for ( @{ $self->{'_content'} } ) {
          if ( ref $_ ) {    # element
              $_->dump( $fh, $depth + 1 );    # recurse
          }
          else {                              # text node
              print $fh "  " x ( $depth + 1 );
              if ( length($_) > 65 or m<[\x00-\x1F]> ) {
  
                  # it needs prettyin' up somehow or other
                  my $x
                      = ( length($_) <= 65 )
                      ? $_
                      : ( substr( $_, 0, 65 ) . '...' );
                  $x =~ s<([\x00-\x1F])>
                       <'\\x'.(unpack("H2",$1))>eg;
                  print $fh qq{"$x"\n};
              }
              else {
                  print $fh qq{"$_"\n};
              }
          }
      }
  }
  
  
  sub as_HTML {
      my ( $self, $entities, $indent, $omissible_map ) = @_;
  
      #my $indent_on = defined($indent) && length($indent);
      my @html = ();
  
      $omissible_map ||= \%HTML::Element::optionalEndTag;
      my $empty_element_map = $self->_empty_element_map;
  
      my $last_tag_tightenable    = 0;
      my $this_tag_tightenable    = 0;
      my $nonindentable_ancestors = 0;    # count of nonindentible tags over us.
  
      my ( $tag, $node, $start, $depth ); # per-iteration scratch
  
      if ( defined($indent) && length($indent) ) {
          $self->traverse(
              sub {
                  ( $node, $start, $depth ) = @_;
                  if ( ref $node ) {      # it's an element
  
                      # detect bogus classes. RT #35948, #61673
                      $node->can('starttag')
                          or Carp::confess( "Object of class "
                              . ref($node)
                              . " cannot be processed by HTML::Element" );
  
                      $tag = $node->{'_tag'};
  
                      if ($start) {       # on the way in
                          if ((   $this_tag_tightenable
                                  = $HTML::Element::canTighten{$tag}
                              )
                              and !$nonindentable_ancestors
                              and $last_tag_tightenable
                              )
                          {
                              push
                                  @html,
                                  "\n",
                                  $indent x $depth,
                                  $node->starttag($entities),
                                  ;
                          }
                          else {
                              push( @html, $node->starttag($entities) );
                          }
                          $last_tag_tightenable = $this_tag_tightenable;
  
                          ++$nonindentable_ancestors
                              if $tag eq 'pre' or $tag eq 'textarea'
                                  or $HTML::Tagset::isCDATA_Parent{$tag};
  
                      }
                      elsif (
                          not(   $empty_element_map->{$tag}
                              or $omissible_map->{$tag} )
                          )
                      {
  
                          # on the way out
                          if (   $tag eq 'pre' or $tag eq 'textarea'
                              or $HTML::Tagset::isCDATA_Parent{$tag} )
                          {
                              --$nonindentable_ancestors;
                              $last_tag_tightenable
                                  = $HTML::Element::canTighten{$tag};
                              push @html, $node->endtag;
  
                          }
                          else {    # general case
                              if ((   $this_tag_tightenable
                                      = $HTML::Element::canTighten{$tag}
                                  )
                                  and !$nonindentable_ancestors
                                  and $last_tag_tightenable
                                  )
                              {
                                  push
                                      @html,
                                      "\n",
                                      $indent x $depth,
                                      $node->endtag,
                                      ;
                              }
                              else {
                                  push @html, $node->endtag;
                              }
                              $last_tag_tightenable = $this_tag_tightenable;
  
                             #print "$tag tightenable: $this_tag_tightenable\n";
                          }
                      }
                  }
                  else {    # it's a text segment
  
                      $last_tag_tightenable = 0;    # I guess this is right
                      HTML::Entities::encode_entities( $node, $entities )
  
                          # That does magic things if $entities is undef.
                          unless (
                          ( defined($entities) && !length($entities) )
  
                          # If there's no entity to encode, don't call it
                          || $HTML::Tagset::isCDATA_Parent{ $_[3]{'_tag'} }
  
                          # To keep from amp-escaping children of script et al.
                          # That doesn't deal with descendants; but then, CDATA
                          #  parents shouldn't /have/ descendants other than a
                          #  text children (or comments?)
                          || $encoded_content
                          );
                      if ($nonindentable_ancestors) {
                          push @html, $node;    # say no go
                      }
                      else {
                          if ($last_tag_tightenable) {
                              $node =~ s<[\n\r\f\t ]+>< >s;
  
                              #$node =~ s< $><>s;
                              $node =~ s<^ ><>s;
                              push
                                  @html,
                                  "\n",
                                  $indent x $depth,
                                  $node,
  
             #Text::Wrap::wrap($indent x $depth, $indent x $depth, "\n" . $node)
                                  ;
                          }
                          else {
                              push
                                  @html,
                                  $node,
  
                                  #Text::Wrap::wrap('', $indent x $depth, $node)
                                  ;
                          }
                      }
                  }
                  1;    # keep traversing
              }
          );            # End of parms to traverse()
      }
      else {            # no indenting -- much simpler code
          $self->traverse(
              sub {
                  ( $node, $start ) = @_;
                  if ( ref $node ) {
  
                      # detect bogus classes. RT #35948
                      $node->isa( $self->element_class )
                          or Carp::confess( "Object of class "
                              . ref($node)
                              . " cannot be processed by HTML::Element" );
  
                      $tag = $node->{'_tag'};
                      if ($start) {    # on the way in
                          push( @html, $node->starttag($entities) );
                      }
                      elsif (
                          not(   $empty_element_map->{$tag}
                              or $omissible_map->{$tag} )
                          )
                      {
  
                          # on the way out
                          push( @html, $node->endtag );
                      }
                  }
                  else {
  
                      # simple text content
                      HTML::Entities::encode_entities( $node, $entities )
  
                          # That does magic things if $entities is undef.
                          unless (
                          ( defined($entities) && !length($entities) )
  
                          # If there's no entity to encode, don't call it
                          || $HTML::Tagset::isCDATA_Parent{ $_[3]{'_tag'} }
  
                          # To keep from amp-escaping children of script et al.
                          # That doesn't deal with descendants; but then, CDATA
                          #  parents shouldn't /have/ descendants other than a
                          #  text children (or comments?)
                          || $encoded_content
                          );
                      push( @html, $node );
                  }
                  1;    # keep traversing
              }
          );            # End of parms to traverse()
      }
  
      if ( $self->{_store_declarations} && defined $self->{_decl} ) {
          unshift @html, sprintf "<!%s>\n", $self->{_decl}->{text};
      }
  
      return join( '', @html );
  }
  
  
  sub as_text {
  
      # Yet another iteratively implemented traverser
      my ( $this, %options ) = @_;
      my $skip_dels = $options{'skip_dels'} || 0;
      my (@pile) = ($this);
      my $tag;
      my $text = '';
      while (@pile) {
          if ( !defined( $pile[0] ) ) {    # undef!
                                           # no-op
          }
          elsif ( !ref( $pile[0] ) ) {     # text bit!  save it!
              $text .= shift @pile;
          }
          else {                           # it's a ref -- traverse under it
              unshift @pile, @{ $this->{'_content'} || $nillio }
                  unless ( $tag = ( $this = shift @pile )->{'_tag'} ) eq 'style'
                  or $tag eq 'script'
                  or ( $skip_dels and $tag eq 'del' );
          }
      }
      return $text;
  }
  
  # extra_chars added for RT #26436
  sub as_trimmed_text {
      my ( $this, %options ) = @_;
      my $text = $this->as_text(%options);
      my $extra_chars = defined $options{'extra_chars'}
                          ? $options{'extra_chars'} : '';
  
      $text =~ s/[\n\r\f\t$extra_chars ]+$//s;
      $text =~ s/^[\n\r\f\t$extra_chars ]+//s;
      $text =~ s/[\n\r\f\t$extra_chars ]+/ /g;
      return $text;
  }
  
  sub as_text_trimmed { shift->as_trimmed_text(@_) }   # alias, because I forget
  
  
  # TODO: make it wrap, if not indent?
  
  sub as_XML {
  
      # based an as_HTML
      my ($self) = @_;
  
      #my $indent_on = defined($indent) && length($indent);
      my @xml               = ();
      my $empty_element_map = $self->_empty_element_map;
  
      my ( $tag, $node, $start );    # per-iteration scratch
      $self->traverse(
          sub {
              ( $node, $start ) = @_;
              if ( ref $node ) {     # it's an element
                  $tag = $node->{'_tag'};
                  if ($start) {      # on the way in
  
                      foreach my $attr ( $node->all_attr_names() ) {
                          Carp::croak(
                              "$tag has an invalid attribute name '$attr'")
                              unless ( $attr eq '/' || $self->_valid_name($attr) );
                      }
  
                      if ( $empty_element_map->{$tag}
                          and !@{ $node->{'_content'} || $nillio } )
                      {
                          push( @xml, $node->starttag_XML( undef, 1 ) );
                      }
                      else {
                          push( @xml, $node->starttag_XML(undef) );
                      }
                  }
                  else {    # on the way out
                      unless ( $empty_element_map->{$tag}
                          and !@{ $node->{'_content'} || $nillio } )
                      {
                          push( @xml, $node->endtag_XML() );
                      }     # otherwise it will have been an <... /> tag.
                  }
              }
              else {        # it's just text
                  _xml_escape($node);
                  push( @xml, $node );
              }
              1;            # keep traversing
          }
      );
  
      join( '', @xml, "\n" );
  }
  
  sub _xml_escape {
  
  # DESTRUCTIVE (a.k.a. "in-place")
  # Five required escapes: http://www.w3.org/TR/2006/REC-xml11-20060816/#syntax
  # We allow & if it's part of a valid escape already: http://www.w3.org/TR/2006/REC-xml11-20060816/#sec-references
      foreach my $x (@_) {
  
          # In strings with no encoded entities all & should be encoded.
          if ($encoded_content) {
              $x
                  =~ s/&(?!                 # An ampersand that isn't followed by...
                  (\#\d+; |                 # A hash mark, digits and semicolon, or
                  \#x[\da-f]+; |            # A hash mark, "x", hex digits and semicolon, or
                  $START_CHAR$NAME_CHAR+; ) # A valid unicode entity name and semicolon
             )/&amp;/gx;    # Needs to be escaped to amp
          }
          else {
              $x =~ s/&/&amp;/g;
          }
  
          # simple character escapes
          $x =~ s/</&lt;/g;
          $x =~ s/>/&gt;/g;
          $x =~ s/"/&quot;/g;
          $x =~ s/'/&apos;/g;
      }
      return;
  }
  
  
  # NOTES:
  #
  # It's been suggested that attribute names be made :-keywords:
  #   (:_tag "img" :border 0 :src "pie.png" :usemap "#main.map")
  # However, it seems that Scheme has no such data type as :-keywords.
  # So, for the moment at least, I tend toward simplicity, uniformity,
  #  and universality, where everything a string or a list.
  
  sub as_Lisp_form {
      my @out;
  
      my $sub;
      my $depth = 0;
      my ( @list, $val );
      $sub = sub {    # Recursor
          my $self = $_[0];
          @list = ( '_tag', $self->{'_tag'} );
          @list = () unless defined $list[-1];    # unlikely
  
          for ( sort keys %$self ) {              # predictable ordering
              next
                  if $_ eq '_content'
                      or $_ eq '_tag'
                      or $_ eq '_parent'
                      or $_ eq '/';
  
              # Leave the other private attributes, I guess.
              push @list, $_, $val
                  if defined( $val = $self->{$_} );    # and !ref $val;
          }
  
          for (@list) {
  
              # octal-escape it
              s<([^\x20\x21\x23\x27-\x5B\x5D-\x7E])>
           <sprintf('\\%03o',ord($1))>eg;
              $_ = qq{"$_"};
          }
          push @out, ( '  ' x $depth ) . '(' . join ' ', splice @list;
          if ( @{ $self->{'_content'} || $nillio } ) {
              $out[-1] .= " \"_content\" (\n";
              ++$depth;
              foreach my $c ( @{ $self->{'_content'} } ) {
                  if ( ref($c) ) {
  
                      # an element -- recurse
                      $sub->($c);
                  }
                  else {
  
                      # a text segment -- stick it in and octal-escape it
                      push @out, $c;
                      $out[-1] =~ s<([^\x20\x21\x23\x27-\x5B\x5D-\x7E])>
               <sprintf('\\%03o',ord($1))>eg;
  
                      # And quote and indent it.
                      $out[-1] .= "\"\n";
                      $out[-1] = ( '  ' x $depth ) . '"' . $out[-1];
                  }
              }
              --$depth;
              substr( $out[-1], -1 )
                  = "))\n";    # end of _content and of the element
          }
          else {
              $out[-1] .= ")\n";
          }
          return;
      };
  
      $sub->( $_[0] );
      undef $sub;
      return join '', @out;
  }
  
  
  sub format {
      my ( $self, $formatter ) = @_;
      unless ( defined $formatter ) {
          # RECOMMEND PREREQ: HTML::FormatText
          require HTML::FormatText;
          $formatter = HTML::FormatText->new();
      }
      $formatter->format($self);
  }
  
  
  sub starttag {
      my ( $self, $entities ) = @_;
  
      my $name = $self->{'_tag'};
  
      return $self->{'text'}              if $name eq '~literal';
      return "<!" . $self->{'text'} . ">" if $name eq '~declaration';
      return "<?" . $self->{'text'} . ">" if $name eq '~pi';
  
      if ( $name eq '~comment' ) {
          if ( ref( $self->{'text'} || '' ) eq 'ARRAY' ) {
  
              # Does this ever get used?  And is this right?
              return
                  "<!"
                  . join( ' ', map( "--$_--", @{ $self->{'text'} } ) ) . ">";
          }
          else {
              return "<!--" . $self->{'text'} . "-->";
          }
      }
  
      my $tag = $html_uc ? "<\U$name" : "<\L$name";
      my $val;
      for ( sort keys %$self ) {    # predictable ordering
          next if !length $_ or m/^_/s or $_ eq '/';
          $val = $self->{$_};
          next if !defined $val;    # or ref $val;
          if ($_ eq $val &&         # if attribute is boolean, for this element
              exists( $HTML::Element::boolean_attr{$name} )
              && (ref( $HTML::Element::boolean_attr{$name} )
                  ? $HTML::Element::boolean_attr{$name}{$_}
                  : $HTML::Element::boolean_attr{$name} eq $_
              )
              )
          {
              $tag .= $html_uc ? " \U$_" : " \L$_";
          }
          else {                    # non-boolean attribute
  
              if ( ref $val eq 'HTML::Element'
                  and $val->{_tag} eq '~literal' )
              {
                  $val = $val->{text};
              }
              else {
                  HTML::Entities::encode_entities( $val, $entities )
                      unless (
                      defined($entities) && !length($entities)
                      || $encoded_content
  
                      );
              }
  
              $val = qq{"$val"};
              $tag .= $html_uc ? qq{ \U$_\E=$val} : qq{ \L$_\E=$val};
          }
      }    # for keys
      if ( scalar $self->content_list == 0
          && $self->_empty_element_map->{ $self->tag } )
      {
          return $tag . " />";
      }
      else {
          return $tag . ">";
      }
  }
  
  
  sub starttag_XML {
      my ($self) = @_;
  
      # and a third parameter to signal emptiness?
  
      my $name = $self->{'_tag'};
  
      return $self->{'text'}               if $name eq '~literal';
      return '<!' . $self->{'text'} . '>'  if $name eq '~declaration';
      return "<?" . $self->{'text'} . "?>" if $name eq '~pi';
  
      if ( $name eq '~comment' ) {
          if ( ref( $self->{'text'} || '' ) eq 'ARRAY' ) {
  
              # Does this ever get used?  And is this right?
              $name = join( ' ', @{ $self->{'text'} } );
          }
          else {
              $name = $self->{'text'};
          }
          $name =~ s/--/-&#45;/g;    # can't have double --'s in XML comments
          return "<!--$name-->";
      }
  
      my $tag = "<$name";
      my $val;
      for ( sort keys %$self ) {     # predictable ordering
          next if !length $_ or m/^_/s or $_ eq '/';
  
          # Hm -- what to do if val is undef?
          # I suppose that shouldn't ever happen.
          next if !defined( $val = $self->{$_} );    # or ref $val;
          _xml_escape($val);
          $tag .= qq{ $_="$val"};
      }
      @_ == 3 ? "$tag />" : "$tag>";
  }
  
  
  sub endtag {
      $html_uc ? "</\U$_[0]->{'_tag'}>" : "</\L$_[0]->{'_tag'}>";
  }
  
  sub endtag_XML {
      "</$_[0]->{'_tag'}>";
  }
  
  #==========================================================================
  # This, ladies and germs, is an iterative implementation of a
  # recursive algorithm.  DON'T TRY THIS AT HOME.
  # Basically, the algorithm says:
  #
  # To traverse:
  #   1: pre-order visit this node
  #   2: traverse any children of this node
  #   3: post-order visit this node, unless it's a text segment,
  #       or a prototypically empty node (like "br", etc.)
  # Add to that the consideration of the callbacks' return values,
  # so you can block visitation of the children, or siblings, or
  # abort the whole excursion, etc.
  #
  # So, why all this hassle with making the code iterative?
  # It makes for real speed, because it eliminates the whole
  # hassle of Perl having to allocate scratch space for each
  # instance of the recursive sub.  Since the algorithm
  # is basically simple (and not all recursive ones are!) and
  # has few necessary lexicals (basically just the current node's
  # content list, and the current position in it), it was relatively
  # straightforward to store that information not as the frame
  # of a sub, but as a stack, i.e., a simple Perl array (well, two
  # of them, actually: one for content-listrefs, one for indexes of
  # current position in each of those).
  
  my $NIL = [];
  
  sub traverse {
      my ( $start, $callback, $ignore_text ) = @_;
  
      Carp::croak "traverse can be called only as an object method"
          unless ref $start;
  
      Carp::croak('must provide a callback for traverse()!')
          unless defined $callback and ref $callback;
  
      # Elementary type-checking:
      my ( $c_pre, $c_post );
      if ( UNIVERSAL::isa( $callback, 'CODE' ) ) {
          $c_pre = $c_post = $callback;
      }
      elsif ( UNIVERSAL::isa( $callback, 'ARRAY' ) ) {
          ( $c_pre, $c_post ) = @$callback;
          Carp::croak(
              "pre-order callback \"$c_pre\" is true but not a coderef!")
              if $c_pre and not UNIVERSAL::isa( $c_pre, 'CODE' );
          Carp::croak(
              "pre-order callback \"$c_post\" is true but not a coderef!")
              if $c_post and not UNIVERSAL::isa( $c_post, 'CODE' );
          return $start unless $c_pre or $c_post;
  
          # otherwise there'd be nothing to actually do!
      }
      else {
          Carp::croak("$callback is not a known kind of reference")
              unless ref($callback);
      }
  
      my $empty_element_map = $start->_empty_element_map;
  
      my (@C) = [$start];    # a stack containing lists of children
      my (@I) = (-1);        # initial value must be -1 for each list
           # a stack of indexes to current position in corresponding lists in @C
           # In each of these, 0 is the active point
  
      # scratch:
      my ($rv,           # return value of callback
          $this,         # current node
          $content_r,    # child list of $this
      );
  
      # THE BIG LOOP
      while (@C) {
  
          # Move to next item in this frame
          if ( !defined( $I[0] ) or ++$I[0] >= @{ $C[0] } ) {
  
              # We either went off the end of this list, or aborted the list
              # So call the post-order callback:
              if (    $c_post
                  and defined $I[0]
                  and @C > 1
  
                  # to keep the next line from autovivifying
                  and defined( $this = $C[1][ $I[1] ] )    # sanity, and
                       # suppress callbacks on exiting the fictional top frame
                  and ref($this)    # sanity
                  and not(
                      $this->{'_empty_element'}
                      || ( $empty_element_map->{ $this->{'_tag'} || '' }
                          && !@{ $this->{'_content'} } )    # RT #49932
                  )    # things that don't get post-order callbacks
                  )
              {
                  shift @I;
                  shift @C;
  
                  #print "Post! at depth", scalar(@I), "\n";
                  $rv = $c_post->(
  
                      #map $_, # copy to avoid any messiness
                      $this,     # 0: this
                      0,         # 1: startflag (0 for post-order call)
                      @I - 1,    # 2: depth
                  );
  
                  if ( defined($rv) and ref($rv) eq $travsignal_package ) {
                      $rv = $$rv;    #deref
                      if ( $rv eq 'ABORT' ) {
                          last;      # end of this excursion!
                      }
                      elsif ( $rv eq 'PRUNE' ) {
  
                          # NOOP on post!!
                      }
                      elsif ( $rv eq 'PRUNE_SOFTLY' ) {
  
                          # NOOP on post!!
                      }
                      elsif ( $rv eq 'OK' ) {
  
                          # noop
                      }
                      elsif ( $rv eq 'PRUNE_UP' ) {
                          $I[0] = undef;
                      }
                      else {
                          die "Unknown travsignal $rv\n";
  
                          # should never happen
                      }
                  }
              }
              else {
                  shift @I;
                  shift @C;
              }
              next;
          }
  
          $this = $C[0][ $I[0] ];
  
          if ($c_pre) {
              if ( defined $this and ref $this ) {    # element
                  $rv = $c_pre->(
  
                      #map $_, # copy to avoid any messiness
                      $this,     # 0: this
                      1,         # 1: startflag (1 for pre-order call)
                      @I - 1,    # 2: depth
                  );
              }
              else {             # text segment
                  next if $ignore_text;
                  $rv = $c_pre->(
  
                      #map $_, # copy to avoid any messiness
                      $this,           # 0: this
                      1,               # 1: startflag (1 for pre-order call)
                      @I - 1,          # 2: depth
                      $C[1][ $I[1] ],  # 3: parent
                                       # And there will always be a $C[1], since
                               #  we can't start traversing at a text node
                      $I[0]    # 4: index of self in parent's content list
                  );
              }
              if ( not $rv ) {    # returned false.  Same as PRUNE.
                  next;           # prune
              }
              elsif ( ref($rv) eq $travsignal_package ) {
                  $rv = $$rv;     # deref
                  if ( $rv eq 'ABORT' ) {
                      last;       # end of this excursion!
                  }
                  elsif ( $rv eq 'PRUNE' ) {
                      next;
                  }
                  elsif ( $rv eq 'PRUNE_SOFTLY' ) {
                      if (ref($this)
                          and not( $this->{'_empty_element'}
                              || $empty_element_map->{ $this->{'_tag'} || '' } )
                          )
                      {
  
               # push a dummy empty content list just to trigger a post callback
                          unshift @I, -1;
                          unshift @C, $NIL;
                      }
                      next;
                  }
                  elsif ( $rv eq 'OK' ) {
  
                      # noop
                  }
                  elsif ( $rv eq 'PRUNE_UP' ) {
                      $I[0] = undef;
                      next;
  
                      # equivalent of last'ing out of the current child list.
  
              # Used to have PRUNE_UP_SOFTLY and ABORT_SOFTLY here, but the code
              # for these was seriously upsetting, served no particularly clear
              # purpose, and could not, I think, be easily implemented with a
              # recursive routine.  All bad things!
                  }
                  else {
                      die "Unknown travsignal $rv\n";
  
                      # should never happen
                  }
              }
  
              # else fall thru to meaning same as \'OK'.
          }
  
          # end of pre-order calling
  
          # Now queue up content list for the current element...
          if (ref $this
              and not(    # ...except for those which...
                  not( $content_r = $this->{'_content'} and @$content_r )
  
                  # ...have empty content lists...
                  and $this->{'_empty_element'}
                  || $empty_element_map->{ $this->{'_tag'} || '' }
  
                  # ...and that don't get post-order callbacks
              )
              )
          {
              unshift @I, -1;
              unshift @C, $content_r || $NIL;
  
              #print $this->{'_tag'}, " ($this) adds content_r ", $C[0], "\n";
          }
      }
      return $start;
  }
  
  
  sub is_inside {
      my $self = shift;
      return 0 unless @_; # if no items specified, I guess this is right.
  
      my $current = $self;
      # the loop starts by looking at the given element
  
      if (scalar @_ == 1) {
          while ( defined $current and ref $current ) {
              return 1 if $current eq $_[0] || $current->{'_tag'} eq $_[0];
              $current = $current->{'_parent'};
          }
          return 0;
      } else {
          my %elements = map { $_ => 1 } @_;
          while ( defined $current and ref $current ) {
              return 1 if $elements{$current} || $elements{ $current->{'_tag'} };
              $current = $current->{'_parent'};
          }
      }
      return 0;
  }
  
  
  sub is_empty {
      my $self = shift;
      !$self->{'_content'} || !@{ $self->{'_content'} };
  }
  
  
  sub pindex {
      my $self = shift;
  
      my $parent = $self->{'_parent'}    || return undef;
      my $pc     = $parent->{'_content'} || return undef;
      for ( my $i = 0; $i < @$pc; ++$i ) {
          return $i if ref $pc->[$i] and $pc->[$i] eq $self;
      }
      return undef;               # we shouldn't ever get here
  }
  
  #--------------------------------------------------------------------------
  
  
  sub left {
      Carp::croak "left() is supposed to be an object method"
          unless ref $_[0];
      my $pc = ( $_[0]->{'_parent'} || return )->{'_content'}
          || die "parent is childless?";
  
      die "parent is childless" unless @$pc;
      return if @$pc == 1;    # I'm an only child
  
      if (wantarray) {
          my @out;
          foreach my $j (@$pc) {
              return @out if ref $j and $j eq $_[0];
              push @out, $j;
          }
      }
      else {
          for ( my $i = 0; $i < @$pc; ++$i ) {
              return $i ? $pc->[ $i - 1 ] : undef
                  if ref $pc->[$i] and $pc->[$i] eq $_[0];
          }
      }
  
      die "I'm not in my parent's content list?";
      return;
  }
  
  
  sub right {
      Carp::croak "right() is supposed to be an object method"
          unless ref $_[0];
      my $pc = ( $_[0]->{'_parent'} || return )->{'_content'}
          || die "parent is childless?";
  
      die "parent is childless" unless @$pc;
      return if @$pc == 1;    # I'm an only child
  
      if (wantarray) {
          my ( @out, $seen );
          foreach my $j (@$pc) {
              if ($seen) {
                  push @out, $j;
              }
              else {
                  $seen = 1 if ref $j and $j eq $_[0];
              }
          }
          die "I'm not in my parent's content list?" unless $seen;
          return @out;
      }
      else {
          for ( my $i = 0; $i < @$pc; ++$i ) {
              return +( $i == $#$pc ) ? undef : $pc->[ $i + 1 ]
                  if ref $pc->[$i] and $pc->[$i] eq $_[0];
          }
          die "I'm not in my parent's content list?";
          return;
      }
  }
  
  #--------------------------------------------------------------------------
  
  
  sub address {
      if ( @_ == 1 ) {    # report-address form
          return join(
              '.',
              reverse(    # so it starts at the top
                  map( $_->pindex() || '0',    # so that root's undef -> '0'
                      $_[0],                   # self and...
                      $_[0]->lineage )
              )
          );
      }
      else {                                   # get-node-at-address
          my @stack = split( /\./, $_[1] );
          my $here;
  
          if ( @stack and !length $stack[0] ) {    # relative addressing
              $here = $_[0];
              shift @stack;
          }
          else {                                   # absolute addressing
              return undef unless 0 == shift @stack; # pop the initial 0-for-root
              $here = $_[0]->root;
          }
  
          while (@stack) {
              return undef
                  unless $here->{'_content'}
                      and @{ $here->{'_content'} } > $stack[0];
  
              # make sure the index isn't too high
              $here = $here->{'_content'}[ shift @stack ];
              return undef if @stack and not ref $here;
  
              # we hit a text node when we expected a non-terminal element node
          }
  
          return $here;
      }
  }
  
  
  sub depth {
      my $here  = $_[0];
      my $depth = 0;
      while ( defined( $here = $here->{'_parent'} ) and ref($here) ) {
          ++$depth;
      }
      return $depth;
  }
  
  
  sub root {
      my $here = my $root = shift;
      while ( defined( $here = $here->{'_parent'} ) and ref($here) ) {
          $root = $here;
      }
      return $root;
  }
  
  
  sub lineage {
      my $here = shift;
      my @lineage;
      while ( defined( $here = $here->{'_parent'} ) and ref($here) ) {
          push @lineage, $here;
      }
      return @lineage;
  }
  
  
  sub lineage_tag_names {
      my $here = my $start = shift;
      my @lineage_names;
      while ( defined( $here = $here->{'_parent'} ) and ref($here) ) {
          push @lineage_names, $here->{'_tag'};
      }
      return @lineage_names;
  }
  
  
  sub descendents { shift->descendants(@_) }
  
  sub descendants {
      my $start = shift;
      if (wantarray) {
          my @descendants;
          $start->traverse(
              [    # pre-order sub only
                  sub {
                      push( @descendants, $_[0] );
                      return 1;
                  },
                  undef    # no post
              ],
              1,           # ignore text
          );
          shift @descendants;    # so $self doesn't appear in the list
          return @descendants;
      }
      else {                     # just returns a scalar
          my $descendants = -1;    # to offset $self being counted
          $start->traverse(
              [                    # pre-order sub only
                  sub {
                      ++$descendants;
                      return 1;
                  },
                  undef            # no post
              ],
              1,                   # ignore text
          );
          return $descendants;
      }
  }
  
  
  sub find { shift->find_by_tag_name(@_) }
  
  # yup, a handy alias
  
  sub find_by_tag_name {
      my (@pile) = shift(@_);    # start out the to-do stack for the traverser
      Carp::croak "find_by_tag_name can be called only as an object method"
          unless ref $pile[0];
      return () unless @_;
      my (@tags) = $pile[0]->_fold_case(@_);
      my ( @matching, $this, $this_tag );
      while (@pile) {
          $this_tag = ( $this = shift @pile )->{'_tag'};
          foreach my $t (@tags) {
              if ( $t eq $this_tag ) {
                  if (wantarray) {
                      push @matching, $this;
                      last;
                  }
                  else {
                      return $this;
                  }
              }
          }
          unshift @pile, grep ref($_), @{ $this->{'_content'} || next };
      }
      return @matching if wantarray;
      return;
  }
  
  
  sub find_by_attribute {
  
      # We could limit this to non-internal attributes, but hey.
      my ( $self, $attribute, $value ) = @_;
      Carp::croak "Attribute must be a defined value!"
          unless defined $attribute;
      $attribute = $self->_fold_case($attribute);
  
      my @matching;
      my $wantarray = wantarray;
      my $quit;
      $self->traverse(
          [    # pre-order only
              sub {
                  if ( exists $_[0]{$attribute}
                      and $_[0]{$attribute} eq $value )
                  {
                      push @matching, $_[0];
                      return HTML::Element::ABORT
                          unless $wantarray;    # only take the first
                  }
                  1;                            # keep traversing
              },
              undef                             # no post
          ],
          1,                                    # yes, ignore text nodes.
      );
  
      if ($wantarray) {
          return @matching;
      }
      else {
          return $matching[0];
      }
  }
  
  #--------------------------------------------------------------------------
  
  
  sub look_down {
      ref( $_[0] ) or Carp::croak "look_down works only as an object method";
  
      my @criteria;
      for ( my $i = 1; $i < @_; ) {
          Carp::croak "Can't use undef as an attribute name"
              unless defined $_[$i];
          if ( ref $_[$i] ) {
              Carp::croak "A " . ref( $_[$i] ) . " value is not a criterion"
                  unless ref $_[$i] eq 'CODE';
              push @criteria, $_[ $i++ ];
          }
          else {
              Carp::croak "param list to look_down ends in a key!" if $i == $#_;
              push @criteria, [
                  scalar( $_[0]->_fold_case( $_[$i] ) ),
                  defined( $_[ $i + 1 ] )
                  ? ( ( ref $_[ $i + 1 ] ? $_[ $i + 1 ] : lc( $_[ $i + 1 ] ) ),
                      ref( $_[ $i + 1 ] )
                      )
  
                      # yes, leave that LC!
                  : undef
              ];
              $i += 2;
          }
      }
      Carp::croak "No criteria?" unless @criteria;
  
      my (@pile) = ( $_[0] );
      my ( @matching, $val, $this );
  Node:
      while ( defined( $this = shift @pile ) ) {
  
          # Yet another traverser implemented with merely iterative code.
          foreach my $c (@criteria) {
              if ( ref($c) eq 'CODE' ) {
                  next Node unless $c->($this);    # jump to the continue block
              }
              else {                               # it's an attr-value pair
                  next Node                        # jump to the continue block
                      if                           # two values are unequal if:
                          ( defined( $val = $this->{ $c->[0] } ) )
                      ? (     !defined $c->[ 1
                                  ]    # actual is def, critval is undef => fail
                                       # allow regex matching
                                       # allow regex matching
                                  or (
                                    $c->[2] eq 'Regexp'
                                  ? $val !~ $c->[1]
                                  : ( ref $val ne $c->[2]
  
                                          # have unequal ref values => fail
                                          or lc($val) ne lc( $c->[1] )
  
                                         # have unequal lc string values => fail
                                  )
                                  )
                          )
                      : (     defined $c->[1]
                          )    # actual is undef, critval is def => fail
              }
          }
  
          # We make it this far only if all the criteria passed.
          return $this unless wantarray;
          push @matching, $this;
      }
      continue {
          unshift @pile, grep ref($_), @{ $this->{'_content'} || $nillio };
      }
      return @matching if wantarray;
      return;
  }
  
  
  sub look_up {
      ref( $_[0] ) or Carp::croak "look_up works only as an object method";
  
      my @criteria;
      for ( my $i = 1; $i < @_; ) {
          Carp::croak "Can't use undef as an attribute name"
              unless defined $_[$i];
          if ( ref $_[$i] ) {
              Carp::croak "A " . ref( $_[$i] ) . " value is not a criterion"
                  unless ref $_[$i] eq 'CODE';
              push @criteria, $_[ $i++ ];
          }
          else {
              Carp::croak "param list to look_up ends in a key!" if $i == $#_;
              push @criteria, [
                  scalar( $_[0]->_fold_case( $_[$i] ) ),
                  defined( $_[ $i + 1 ] )
                  ? ( ( ref $_[ $i + 1 ] ? $_[ $i + 1 ] : lc( $_[ $i + 1 ] ) ),
                      ref( $_[ $i + 1 ] )
                      )
                  : undef    # Yes, leave that LC!
              ];
              $i += 2;
          }
      }
      Carp::croak "No criteria?" unless @criteria;
  
      my ( @matching, $val );
      my $this = $_[0];
  Node:
      while (1) {
  
         # You'll notice that the code here is almost the same as for look_down.
          foreach my $c (@criteria) {
              if ( ref($c) eq 'CODE' ) {
                  next Node unless $c->($this);    # jump to the continue block
              }
              else {                               # it's an attr-value pair
                  next Node                        # jump to the continue block
                      if                           # two values are unequal if:
                          ( defined( $val = $this->{ $c->[0] } ) )
                      ? (     !defined $c->[ 1
                                  ]    # actual is def, critval is undef => fail
                                  or (
                                    $c->[2] eq 'Regexp'
                                  ? $val !~ $c->[1]
                                  : ( ref $val ne $c->[2]
  
                                          # have unequal ref values => fail
                                          or lc($val) ne $c->[1]
  
                                         # have unequal lc string values => fail
                                  )
                                  )
                          )
                      : (     defined $c->[1]
                          )    # actual is undef, critval is def => fail
              }
          }
  
          # We make it this far only if all the criteria passed.
          return $this unless wantarray;
          push @matching, $this;
      }
      continue {
          last unless defined( $this = $this->{'_parent'} ) and ref $this;
      }
  
      return @matching if wantarray;
      return;
  }
  
  #--------------------------------------------------------------------------
  
  
  sub attr_get_i {
      if ( @_ > 2 ) {
          my $self = shift;
          Carp::croak "No attribute names can be undef!"
              if grep !defined($_), @_;
          my @attributes = $self->_fold_case(@_);
          if (wantarray) {
              my @out;
              foreach my $x ( $self, $self->lineage ) {
                  push @out,
                      map { exists( $x->{$_} ) ? $x->{$_} : () } @attributes;
              }
              return @out;
          }
          else {
              foreach my $x ( $self, $self->lineage ) {
                  foreach my $attribute (@attributes) {
                      return $x->{$attribute}
                          if exists $x->{$attribute};    # found
                  }
              }
              return;                                    # never found
          }
      }
      else {
  
          # Single-attribute search.  Simpler, most common, so optimize
          #  for the most common case
          Carp::croak "Attribute name must be a defined value!"
              unless defined $_[1];
          my $self      = $_[0];
          my $attribute = $self->_fold_case( $_[1] );
          if (wantarray) {                               # list context
              return
                  map { exists( $_->{$attribute} ) ? $_->{$attribute} : () }
                  $self, $self->lineage;
          }
          else {                                         # scalar context
              foreach my $x ( $self, $self->lineage ) {
                  return $x->{$attribute} if exists $x->{$attribute};    # found
              }
              return;    # never found
          }
      }
  }
  
  
  sub tagname_map {
      my (@pile) = $_[0];    # start out the to-do stack for the traverser
      Carp::croak "find_by_tag_name can be called only as an object method"
          unless ref $pile[0];
      my ( %map, $this_tag, $this );
      while (@pile) {
          $this_tag = ''
              unless defined( $this_tag = ( $this = shift @pile )->{'_tag'} )
          ;    # dance around the strange case of having an undef tagname.
          push @{ $map{$this_tag} ||= [] }, $this;    # add to map
          unshift @pile, grep ref($_),
              @{ $this->{'_content'} || next };       # traverse
      }
      return \%map;
  }
  
  
  sub extract_links {
      my $start = shift;
  
      my %wantType;
      @wantType{ $start->_fold_case(@_) } = (1) x @_;    # if there were any
      my $wantType = scalar(@_);
  
      my @links;
  
      # TODO: add xml:link?
  
      my ( $link_attrs, $tag, $self, $val );    # scratch for each iteration
      $start->traverse(
          [   sub {                             # pre-order call only
                  $self = $_[0];
  
                  $tag = $self->{'_tag'};
                  return 1
                      if $wantType && !$wantType{$tag};    # if we're selective
  
                  if (defined(
                          $link_attrs = $HTML::Element::linkElements{$tag}
                      )
                      )
                  {
  
                      # If this is a tag that has any link attributes,
                      #  look over possibly present link attributes,
                      #  saving the value, if found.
                      for ( ref($link_attrs) ? @$link_attrs : $link_attrs ) {
                          if ( defined( $val = $self->attr($_) ) ) {
                              push( @links, [ $val, $self, $_, $tag ] );
                          }
                      }
                  }
                  1;    # return true, so we keep recursing
              },
              undef
          ],
          1,            # ignore text nodes
      );
      \@links;
  }
  
  
  sub simplify_pres {
      my $pre = 0;
  
      my $sub;
      my $line;
      $sub = sub {
          ++$pre if $_[0]->{'_tag'} eq 'pre';
          foreach my $it ( @{ $_[0]->{'_content'} || return } ) {
              if ( ref $it ) {
                  $sub->($it);    # recurse!
              }
              elsif ($pre) {
  
                  #$it =~ s/(?:(?:\cm\cj*)|(?:\cj))/\n/g;
  
                  $it = join "\n", map {
                      ;
                      $line = $_;
                      while (
                          $line
                          =~ s/^([^\t]*)(\t+)/$1.(" " x ((length($2)<<3)-(length($1)&7)))/e
  
                # Sort of adapted from Text::Tabs -- yes, it's hardwired-in that
                # tabs are at every EIGHTH column.
                          )
                      {
                      }
                      $line;
                      }
                      split /(?:(?:\cm\cj*)|(?:\cj))/, $it, -1;
              }
          }
          --$pre if $_[0]->{'_tag'} eq 'pre';
          return;
      };
      $sub->( $_[0] );
  
      undef $sub;
      return;
  }
  
  
  sub same_as {
      die 'same_as() takes only one argument: $h->same_as($i)' unless @_ == 2;
      my ( $h, $i ) = @_[ 0, 1 ];
      die "same_as() can be called only as an object method" unless ref $h;
  
      return 0 unless defined $i and ref $i;
  
      # An element can't be same_as anything but another element!
      # They needn't be of the same class, tho.
  
      return 1 if $h eq $i;
  
      # special (if rare) case: anything is the same as... itself!
  
      # assumes that no content lists in/under $h or $i contain subsequent
      #  text segments, like: ['foo', ' bar']
  
      # compare attributes now.
      #print "Comparing tags of $h and $i...\n";
  
      return 0 unless $h->{'_tag'} eq $i->{'_tag'};
  
      # only significant attribute whose name starts with "_"
  
      #print "Comparing attributes of $h and $i...\n";
      # Compare attributes, but only the real ones.
      {
  
          # Bear in mind that the average element has very few attributes,
          #  and that element names are rather short.
          # (Values are a different story.)
  
      # XXX I would think that /^[^_]/ would be faster, at least easier to read.
          my @keys_h
              = sort grep { length $_ and substr( $_, 0, 1 ) ne '_' } keys %$h;
          my @keys_i
              = sort grep { length $_ and substr( $_, 0, 1 ) ne '_' } keys %$i;
  
          return 0 unless @keys_h == @keys_i;
  
          # different number of real attributes?  they're different.
          for ( my $x = 0; $x < @keys_h; ++$x ) {
              return 0
                  unless $keys_h[$x] eq $keys_i[$x] and    # same key name
                      $h->{ $keys_h[$x] } eq $i->{ $keys_h[$x] };   # same value
               # Should this test for definedness on values?
               # People shouldn't be putting undef in attribute values, I think.
          }
      }
  
      #print "Comparing children of $h and $i...\n";
      my $hcl = $h->{'_content'} || [];
      my $icl = $i->{'_content'} || [];
  
      return 0 unless @$hcl == @$icl;
  
      # different numbers of children?  they're different.
  
      if (@$hcl) {
  
          # compare each of the children:
          for ( my $x = 0; $x < @$hcl; ++$x ) {
              if ( ref $hcl->[$x] ) {
                  return 0 unless ref( $icl->[$x] );
  
                  # an element can't be the same as a text segment
                  # Both elements:
                  return 0 unless $hcl->[$x]->same_as( $icl->[$x] );  # RECURSE!
              }
              else {
                  return 0 if ref( $icl->[$x] );
  
                  # a text segment can't be the same as an element
                  # Both text segments:
                  return 0 unless $hcl->[$x] eq $icl->[$x];
              }
          }
      }
  
      return 1;    # passed all the tests!
  }
  
  
  sub new_from_lol {
      my $class = shift;
      $class = ref($class) || $class;
  
    # calling as an object method is just the same as ref($h)->new_from_lol(...)
      my $lol = $_[1];
  
      my @ancestor_lols;
  
      # So we can make sure there's no cyclicities in this lol.
      # That would be perverse, but one never knows.
      my ( $sub, $k, $v, $node );    # last three are scratch values
      $sub = sub {
  
          #print "Building for $_[0]\n";
          my $lol = $_[0];
          return unless @$lol;
          my ( @attributes, @children );
          Carp::croak "Cyclicity detected in source LOL tree, around $lol?!?"
              if grep( $_ eq $lol, @ancestor_lols );
          push @ancestor_lols, $lol;
  
          my $tag_name = 'null';
  
          # Recursion in in here:
          for ( my $i = 0; $i < @$lol; ++$i ) {    # Iterate over children
              if ( ref( $lol->[$i] ) eq 'ARRAY' )
              {    # subtree: most common thing in loltree
                  push @children, $sub->( $lol->[$i] );
              }
              elsif ( !ref( $lol->[$i] ) ) {
                  if ( $i == 0 ) {    # name
                      $tag_name = $lol->[$i];
                      Carp::croak "\"$tag_name\" isn't a good tag name!"
                          if $tag_name =~ m/[<>\/\x00-\x20]/
                      ;               # minimal sanity, certainly!
                  }
                  else {              # text segment child
                      push @children, $lol->[$i];
                  }
              }
              elsif ( ref( $lol->[$i] ) eq 'HASH' ) {    # attribute hashref
                  keys %{ $lol->[$i] };   # reset the each-counter, just in case
                  while ( ( $k, $v ) = each %{ $lol->[$i] } ) {
                      push @attributes, $class->_fold_case($k), $v
                          if defined $v
                              and $k ne '_name'
                              and $k ne '_content'
                              and $k ne '_parent';
  
                      # enforce /some/ sanity!
                  }
              }
              elsif ( UNIVERSAL::isa( $lol->[$i], __PACKAGE__ ) ) {
                  if ( $lol->[$i]->{'_parent'} ) {    # if claimed
                          #print "About to clone ", $lol->[$i], "\n";
                      push @children, $lol->[$i]->clone();
                  }
                  else {
                      push @children, $lol->[$i];    # if unclaimed...
                           #print "Claiming ", $lol->[$i], "\n";
                      $lol->[$i]->{'_parent'} = 1;    # claim it NOW
                        # This WILL be replaced by the correct value once we actually
                        #  construct the parent, just after the end of this loop...
                  }
              }
              else {
                  Carp::croak "new_from_lol doesn't handle references of type "
                      . ref( $lol->[$i] );
              }
          }
  
          pop @ancestor_lols;
          $node = $class->new($tag_name);
  
          #print "Children: @children\n";
  
          if ( $class eq __PACKAGE__ ) {    # Special-case it, for speed:
              %$node = ( %$node, @attributes ) if @attributes;
  
              #print join(' ', $node, ' ' , map("<$_>", %$node), "\n");
              if (@children) {
                  $node->{'_content'} = \@children;
                  foreach my $c (@children) {
                      _weaken($c->{'_parent'} = $node)
                          if ref $c;
                  }
              }
          }
          else {                            # Do it the clean way...
                                            #print "Done neatly\n";
              while (@attributes) { $node->attr( splice @attributes, 0, 2 ) }
              $node->push_content(
                    map { _weaken($_->{'_parent'} = $node) if ref $_; $_ }
                      @children )
                  if @children;
          }
  
          return $node;
      };
  
      # End of sub definition.
  
      if (wantarray) {
          my (@nodes) = map { ; ( ref($_) eq 'ARRAY' ) ? $sub->($_) : $_ } @_;
          # Let text bits pass thru, I guess.  This makes this act more like
          #  unshift_content et al.  Undocumented.
  
          undef $sub;
          # so it won't be in its own frame, so its refcount can hit 0
  
          return @nodes;
      }
      else {
          Carp::croak "new_from_lol in scalar context needs exactly one lol"
              unless @_ == 1;
          return $_[0] unless ref( $_[0] ) eq 'ARRAY';
          # used to be a fatal error.  still undocumented tho.
  
          $node = $sub->( $_[0] );
          undef $sub;
          # so it won't be in its own frame, so its refcount can hit 0
  
          return $node;
      }
  }
  
  
  sub objectify_text {
      my (@stack) = ( $_[0] );
  
      my ($this);
      while (@stack) {
          foreach my $c ( @{ ( $this = shift @stack )->{'_content'} } ) {
              if ( ref($c) ) {
                  unshift @stack, $c;    # visit it later.
              }
              else {
                  $c = $this->element_class->new(
                      '~text',
                      'text'    => $c,
                      '_parent' => $this
                  );
              }
          }
      }
      return;
  }
  
  sub deobjectify_text {
      my (@stack) = ( $_[0] );
      my ($old_node);
  
      if ( $_[0]{'_tag'} eq '~text' ) {    # special case
              # Puts the $old_node variable to a different purpose
          if ( $_[0]{'_parent'} ) {
              $_[0]->replace_with( $old_node = delete $_[0]{'text'} )->delete;
          }
          else {    # well, that's that, then!
              $old_node = delete $_[0]{'text'};
          }
  
          if ( ref( $_[0] ) eq __PACKAGE__ ) {    # common case
              %{ $_[0] } = ();                    # poof!
          }
          else {
  
              # play nice:
              delete $_[0]{'_parent'};
              $_[0]->delete;
          }
          return '' unless defined $old_node;     # sanity!
          return $old_node;
      }
  
      while (@stack) {
          foreach my $c ( @{ ( shift @stack )->{'_content'} } ) {
              if ( ref($c) ) {
                  if ( $c->{'_tag'} eq '~text' ) {
                      $c = ( $old_node = $c )->{'text'};
                      if ( ref($old_node) eq __PACKAGE__ ) {    # common case
                          %$old_node = ();                      # poof!
                      }
                      else {
  
                          # play nice:
                          delete $old_node->{'_parent'};
                          $old_node->delete;
                      }
                  }
                  else {
                      unshift @stack, $c;    # visit it later.
                  }
              }
          }
      }
  
      return undef;
  }
  
  
  {
  
      # The next three subs are basically copied from Number::Latin,
      # based on a one-liner by Abigail.  Yes, I could simply require that
      # module, and a Roman numeral module too, but really, HTML-Tree already
      # has enough dependecies as it is; and anyhow, I don't need the functions
      # that do latin2int or roman2int.
      no integer;
  
      sub _int2latin {
          return unless defined $_[0];
          return '0' if $_[0] < 1 and $_[0] > -1;
          return '-' . _i2l( abs int $_[0] )
              if $_[0] <= -1;    # tolerate negatives
          return _i2l( int $_[0] );
      }
  
      sub _int2LATIN {
  
          # just the above plus uc
          return unless defined $_[0];
          return '0' if $_[0] < 1 and $_[0] > -1;
          return '-' . uc( _i2l( abs int $_[0] ) )
              if $_[0] <= -1;    # tolerate negs
          return uc( _i2l( int $_[0] ) );
      }
  
      my @alpha = ( 'a' .. 'z' );
  
      sub _i2l {                 # the real work
          my $int = $_[0] || return "";
          _i2l( int( ( $int - 1 ) / 26 ) )
              . $alpha[ $int % 26 - 1 ];    # yes, recursive
              # Yes, 26 => is (26 % 26 - 1), which is -1 => Z!
      }
  }
  
  {
  
      # And now, some much less impressive Roman numerals code:
  
      my (@i) = ( '', qw(I II III IV V VI VII VIII IX) );
      my (@x) = ( '', qw(X XX XXX XL L LX LXX LXXX XC) );
      my (@c) = ( '', qw(C CC CCC CD D DC DCC DCCC CM) );
      my (@m) = ( '', qw(M MM MMM) );
  
      sub _int2ROMAN {
          my ( $i, $pref );
          return '0'
              if 0 == ( $i = int( $_[0] || 0 ) );    # zero is a special case
          return $i + 0 if $i <= -4000 or $i >= 4000;
  
         # Because over 3999 would require non-ASCII chars, like D-with-)-inside
          if ( $i < 0 ) {    # grumble grumble tolerate negatives grumble
              $pref = '-';
              $i    = abs($i);
          }
          else {
              $pref = '';    # normal case
          }
  
          my ( $x, $c, $m ) = ( 0, 0, 0 );
          if ( $i >= 10 ) {
              $x = $i / 10;
              $i %= 10;
              if ( $x >= 10 ) {
                  $c = $x / 10;
                  $x %= 10;
                  if ( $c >= 10 ) { $m = $c / 10; $c %= 10; }
              }
          }
  
          #print "m$m c$c x$x i$i\n";
  
          return join( '', $pref, $m[$m], $c[$c], $x[$x], $i[$i] );
      }
  
      sub _int2roman { lc( _int2ROMAN( $_[0] ) ) }
  }
  
  sub _int2int { $_[0] }    # dummy
  
  %list_type_to_sub = (
      'I' => \&_int2ROMAN,
      'i' => \&_int2roman,
      'A' => \&_int2LATIN,
      'a' => \&_int2latin,
      '1' => \&_int2int,
  );
  
  sub number_lists {
      my (@stack) = ( $_[0] );
      my ( $this, $tag, $counter, $numberer );    # scratch
      while (@stack) {    # yup, pre-order-traverser idiom
          if ( ( $tag = ( $this = shift @stack )->{'_tag'} ) eq 'ol' ) {
  
              # Prep some things:
              $counter
                  = ( ( $this->{'start'} || '' ) =~ m<^\s*(\d{1,7})\s*$>s )
                  ? $1
                  : 1;
              $numberer = $list_type_to_sub{ $this->{'type'} || '' }
                  || $list_type_to_sub{'1'};
  
              # Immeditately iterate over all children
              foreach my $c ( @{ $this->{'_content'} || next } ) {
                  next unless ref $c;
                  unshift @stack, $c;
                  if ( $c->{'_tag'} eq 'li' ) {
                      $counter = $1
                          if (
                          ( $c->{'value'} || '' ) =~ m<^\s*(\d{1,7})\s*$>s );
                      $c->{'_bullet'} = $numberer->($counter) . '.';
                      ++$counter;
                  }
              }
  
          }
          elsif ( $tag eq 'ul' or $tag eq 'dir' or $tag eq 'menu' ) {
  
              # Immeditately iterate over all children
              foreach my $c ( @{ $this->{'_content'} || next } ) {
                  next unless ref $c;
                  unshift @stack, $c;
                  $c->{'_bullet'} = '*' if $c->{'_tag'} eq 'li';
              }
  
          }
          else {
              foreach my $c ( @{ $this->{'_content'} || next } ) {
                  unshift @stack, $c if ref $c;
              }
          }
      }
      return;
  }
  
  
  sub has_insane_linkage {
      my @pile = ( $_[0] );
      my ( $c, $i, $p, $this );    # scratch
  
      # Another iterative traverser; this time much simpler because
      #  only in pre-order:
      my %parent_of = ( $_[0], 'TOP-OF-SCAN' );
      while (@pile) {
          $this = shift @pile;
          $c = $this->{'_content'} || next;
          return ( $this, "_content attribute is true but nonref." )
              unless ref($c) eq 'ARRAY';
          next unless @$c;
          for ( $i = 0; $i < @$c; ++$i ) {
              return ( $this, "Child $i is undef" )
                  unless defined $c->[$i];
              if ( ref( $c->[$i] ) ) {
                  return ( $c->[$i], "appears in its own content list" )
                      if $c->[$i] eq $this;
                  return ( $c->[$i],
                      "appears twice in the tree: once under $this, once under $parent_of{$c->[$i]}"
                  ) if exists $parent_of{ $c->[$i] };
                  $parent_of{ $c->[$i] } = '' . $this;
  
                  # might as well just use the stringification of it.
  
                  return ( $c->[$i],
                      "_parent attribute is wrong (not defined)" )
                      unless defined( $p = $c->[$i]{'_parent'} );
                  return ( $c->[$i], "_parent attribute is wrong (nonref)" )
                      unless ref($p);
                  return ( $c->[$i],
                      "_parent attribute is wrong (is $p; should be $this)" )
                      unless $p eq $this;
              }
          }
          unshift @pile, grep ref($_), @$c;
  
          # queue up more things on the pile stack
      }
      return;    #okay
  }
  
  sub _asserts_fail {    # to be run on trusted documents only
      my (@pile) = ( $_[0] );
      my ( @errors, $this, $id, $assert, $parent, $rv );
      while (@pile) {
          $this = shift @pile;
          if ( defined( $assert = $this->{'assert'} ) ) {
              $id = ( $this->{'id'} ||= $this->address )
                  ;      # don't use '0' as an ID, okay?
              unless ( ref($assert) ) {
  
                  package main;
  ## no critic
                  $assert = $this->{'assert'} = (
                      $assert =~ m/\bsub\b/
                      ? eval($assert)
                      : eval("sub {  $assert\n}")
                  );
  ## use critic
                  if ($@) {
                      push @errors,
                          [ $this, "assertion at $id broke in eval: $@" ];
                      $assert = $this->{'assert'} = sub { };
                  }
              }
              $parent = $this->{'_parent'};
              $rv     = undef;
              eval {
                  $rv = $assert->(
                      $this, $this->{'_tag'}, $this->{'_id'},    # 0,1,2
                      $parent
                      ? ( $parent, $parent->{'_tag'}, $parent->{'id'} )
                      : ()                                       # 3,4,5
                  );
              };
              if ($@) {
                  push @errors, [ $this, "assertion at $id died: $@" ];
              }
              elsif ( !$rv ) {
                  push @errors, [ $this, "assertion at $id failed" ];
              }
  
              # else OK
          }
          push @pile, grep ref($_), @{ $this->{'_content'} || next };
      }
      return @errors;
  }
  
  ## _valid_name
  #  validate XML style attribute names
  #  http://www.w3.org/TR/2006/REC-xml11-20060816/#NT-Name
  
  sub _valid_name {
      my $self = shift;
      my $attr = shift
          or Carp::croak("sub valid_name requires an attribute name");
  
      return (0) unless ( $attr =~ /^$START_CHAR$NAME_CHAR+$/ );
  
      return (1);
  }
  
  
  sub element_class {
      $_[0]->{_element_class} || __PACKAGE__;
  }
  
  1;
  
  
  1;
  
  __END__
  
  =pod
  
  =head1 NAME
  
  HTML::Element - Class for objects that represent HTML elements
  
  =head1 VERSION
  
  This document describes version 5.07 of
  HTML::Element, released August 31, 2017
  as part of L<HTML-Tree|HTML::Tree>.
  
  =head1 SYNOPSIS
  
      use HTML::Element;
      $a = HTML::Element->new('a', href => 'http://www.perl.com/');
      $a->push_content("The Perl Homepage");
  
      $tag = $a->tag;
      print "$tag starts out as:",  $a->starttag, "\n";
      print "$tag ends as:",  $a->endtag, "\n";
      print "$tag\'s href attribute is: ", $a->attr('href'), "\n";
  
      $links_r = $a->extract_links();
      print "Hey, I found ", scalar(@$links_r), " links.\n";
  
      print "And that, as HTML, is: ", $a->as_HTML, "\n";
      $a = $a->delete;
  
  =head1 DESCRIPTION
  
  (This class is part of the L<HTML::Tree|HTML::Tree> dist.)
  
  Objects of the HTML::Element class can be used to represent elements
  of HTML document trees.  These objects have attributes, notably attributes that
  designates each element's parent and content.  The content is an array
  of text segments and other HTML::Element objects.  A tree with HTML::Element
  objects as nodes can represent the syntax tree for a HTML document.
  
  =head1 HOW WE REPRESENT TREES
  
  Consider this HTML document:
  
    <html lang='en-US'>
      <head>
        <title>Stuff</title>
        <meta name='author' content='Jojo'>
      </head>
      <body>
       <h1>I like potatoes!</h1>
      </body>
    </html>
  
  Building a syntax tree out of it makes a tree-structure in memory
  that could be diagrammed as:
  
                       html (lang='en-US')
                        / \
                      /     \
                    /         \
                  head        body
                 /\               \
               /    \               \
             /        \               \
           title     meta              h1
            |       (name='author',     |
         "Stuff"    content='Jojo')    "I like potatoes"
  
  This is the traditional way to diagram a tree, with the "root" at the
  top, and it's this kind of diagram that people have in mind when they
  say, for example, that "the meta element is under the head element
  instead of under the body element".  (The same is also said with
  "inside" instead of "under" -- the use of "inside" makes more sense
  when you're looking at the HTML source.)
  
  Another way to represent the above tree is with indenting:
  
    html (attributes: lang='en-US')
      head
        title
          "Stuff"
        meta (attributes: name='author' content='Jojo')
      body
        h1
          "I like potatoes"
  
  Incidentally, diagramming with indenting works much better for very
  large trees, and is easier for a program to generate.  The C<< $tree->dump >>
  method uses indentation just that way.
  
  However you diagram the tree, it's stored the same in memory -- it's a
  network of objects, each of which has attributes like so:
  
    element #1:  _tag: 'html'
                 _parent: none
                 _content: [element #2, element #5]
                 lang: 'en-US'
  
    element #2:  _tag: 'head'
                 _parent: element #1
                 _content: [element #3, element #4]
  
    element #3:  _tag: 'title'
                 _parent: element #2
                 _content: [text segment "Stuff"]
  
    element #4   _tag: 'meta'
                 _parent: element #2
                 _content: none
                 name: author
                 content: Jojo
  
    element #5   _tag: 'body'
                 _parent: element #1
                 _content: [element #6]
  
    element #6   _tag: 'h1'
                 _parent: element #5
                 _content: [text segment "I like potatoes"]
  
  The "treeness" of the tree-structure that these elements comprise is
  not an aspect of any particular object, but is emergent from the
  relatedness attributes (_parent and _content) of these element-objects
  and from how you use them to get from element to element.
  
  While you could access the content of a tree by writing code that says
  "access the 'src' attribute of the root's I<first> child's I<seventh>
  child's I<third> child", you're more likely to have to scan the contents
  of a tree, looking for whatever nodes, or kinds of nodes, you want to
  do something with.  The most straightforward way to look over a tree
  is to "traverse" it; an HTML::Element method (C<< $h->traverse >>) is
  provided for this purpose; and several other HTML::Element methods are
  based on it.
  
  (For everything you ever wanted to know about trees, and then some,
  see Niklaus Wirth's I<Algorithms + Data Structures = Programs> or
  Donald Knuth's I<The Art of Computer Programming, Volume 1>.)
  
  =head2 Weak References
  
  TL;DR summary: S<C<use HTML::TreeBuilder 5 -weak;>> and forget about
  the C<delete> method (except for pruning a node from a tree).
  
  Because HTML::Element stores a reference to the parent element, Perl's
  reference-count garbage collection doesn't work properly with
  HTML::Element trees.  Starting with version 5.00, HTML::Element uses
  weak references (if available) to prevent that problem.  Weak
  references were introduced in Perl 5.6.0, but you also need a version
  of L<Scalar::Util> that provides the C<weaken> function.
  
  Weak references are enabled by default.  If you want to be certain
  they're in use, you can say S<C<use HTML::Element 5 -weak;>>.  You
  must include the version number; previous versions of HTML::Element
  ignored the import list entirely.
  
  To disable weak references, you can say S<C<use HTML::Element -noweak;>>.
  This is a global setting.  B<This feature is deprecated> and is
  provided only as a quick fix for broken code.  If your code does not
  work properly with weak references, you should fix it immediately, as
  weak references may become mandatory in a future version.  Generally,
  all you need to do is keep a reference to the root of the tree until
  you're done working with it.
  
  Because HTML::TreeBuilder is a subclass of HTML::Element, you can also
  import C<-weak> or C<-noweak> from HTML::TreeBuilder: e.g.
  S<C<use HTML::TreeBuilder: 5 -weak;>>.
  
  =head1 BASIC METHODS
  
  =head2 new
  
    $h = HTML::Element->new('tag', 'attrname' => 'value', ... );
  
  This constructor method returns a new HTML::Element object.  The tag
  name is a required argument; it will be forced to lowercase.
  Optionally, you can specify other initial attributes at object
  creation time.
  
  =head2 attr
  
    $value = $h->attr('attr');
    $old_value = $h->attr('attr', $new_value);
  
  Returns (optionally sets) the value of the given attribute of C<$h>.  The
  attribute name (but not the value, if provided) is forced to
  lowercase.  If trying to read the value of an attribute not present
  for this element, the return value is undef.
  If setting a new value, the old value of that attribute is
  returned.
  
  If methods are provided for accessing an attribute (like C<< $h->tag >> for
  "_tag", C<< $h->content_list >>, etc. below), use those instead of calling
  attr C<< $h->attr >>, whether for reading or setting.
  
  Note that setting an attribute to C<undef> (as opposed to "", the empty
  string) actually deletes the attribute.
  
  =head2 tag
  
    $tagname = $h->tag();
    $h->tag('tagname');
  
  Returns (optionally sets) the tag name (also known as the generic
  identifier) for the element C<$h>.  In setting, the tag name is always
  converted to lower case.
  
  There are four kinds of "pseudo-elements" that show up as
  HTML::Element objects:
  
  =over
  
  =item Comment pseudo-elements
  
  These are element objects with a C<$h-E<gt>tag> value of "~comment",
  and the content of the comment is stored in the "text" attribute
  (C<$h-E<gt>attr("text")>).  For example, parsing this code with
  HTML::TreeBuilder...
  
    <!-- I like Pie.
       Pie is good
    -->
  
  produces an HTML::Element object with these attributes:
  
    "_tag",
    "~comment",
    "text",
    " I like Pie.\n     Pie is good\n  "
  
  =item Declaration pseudo-elements
  
  Declarations (rarely encountered) are represented as HTML::Element
  objects with a tag name of "~declaration", and content in the "text"
  attribute.  For example, this:
  
    <!DOCTYPE foo>
  
  produces an element whose attributes include:
  
    "_tag", "~declaration", "text", "DOCTYPE foo"
  
  =item Processing instruction pseudo-elements
  
  PIs (rarely encountered) are represented as HTML::Element objects with
  a tag name of "~pi", and content in the "text" attribute.  For
  example, this:
  
    <?stuff foo?>
  
  produces an element whose attributes include:
  
    "_tag", "~pi", "text", "stuff foo?"
  
  (assuming a recent version of HTML::Parser)
  
  =item ~literal pseudo-elements
  
  These objects are not currently produced by HTML::TreeBuilder, but can
  be used to represent a "super-literal" -- i.e., a literal you want to
  be immune from escaping.  (Yes, I just made that term up.)
  
  That is, this is useful if you want to insert code into a tree that
  you plan to dump out with C<as_HTML>, where you want, for some reason,
  to suppress C<as_HTML>'s normal behavior of amp-quoting text segments.
  
  For example, this:
  
    my $literal = HTML::Element->new('~literal',
      'text' => 'x < 4 & y > 7'
    );
    my $span = HTML::Element->new('span');
    $span->push_content($literal);
    print $span->as_HTML;
  
  prints this:
  
    <span>x < 4 & y > 7</span>
  
  Whereas this:
  
    my $span = HTML::Element->new('span');
    $span->push_content('x < 4 & y > 7');
      # normal text segment
    print $span->as_HTML;
  
  prints this:
  
    <span>x &lt; 4 &amp; y &gt; 7</span>
  
  Unless you're inserting lots of pre-cooked code into existing trees,
  and dumping them out again, it's not likely that you'll find
  C<~literal> pseudo-elements useful.
  
  =back
  
  =head2 parent
  
    $parent = $h->parent();
    $h->parent($new_parent);
  
  Returns (optionally sets) the parent (aka "container") for this element.
  The parent should either be undef, or should be another element.
  
  You B<should not> use this to directly set the parent of an element.
  Instead use any of the other methods under "Structure-Modifying
  Methods", below.
  
  Note that C<< not($h->parent) >> is a simple test for whether C<$h> is the
  root of its subtree.
  
  =head2 content_list
  
    @content = $h->content_list();
    $num_children = $h->content_list();
  
  Returns a list of the child nodes of this element -- i.e., what
  nodes (elements or text segments) are inside/under this element. (Note
  that this may be an empty list.)
  
  In a scalar context, this returns the count of the items,
  as you may expect.
  
  =head2 content
  
    $content_array_ref = $h->content(); # may return undef
  
  This somewhat deprecated method returns the content of this element;
  but unlike content_list, this returns either undef (which you should
  understand to mean no content), or a I<reference to the array> of
  content items, each of which is either a text segment (a string, i.e.,
  a defined non-reference scalar value), or an HTML::Element object.
  Note that even if an arrayref is returned, it may be a reference to an
  empty array.
  
  While older code should feel free to continue to use C<< $h->content >>,
  new code should use C<< $h->content_list >> in almost all conceivable
  cases.  It is my experience that in most cases this leads to simpler
  code anyway, since it means one can say:
  
      @children = $h->content_list;
  
  instead of the inelegant:
  
      @children = @{$h->content || []};
  
  If you do use C<< $h->content >> (or C<< $h->content_array_ref >>), you should not
  use the reference returned by it (assuming it returned a reference,
  and not undef) to directly set or change the content of an element or
  text segment!  Instead use L<content_refs_list> or any of the other
  methods under "Structure-Modifying Methods", below.
  
  =head2 content_array_ref
  
    $content_array_ref = $h->content_array_ref(); # never undef
  
  This is like C<content> (with all its caveats and deprecations) except
  that it is guaranteed to return an array reference.  That is, if the
  given node has no C<_content> attribute, the C<content> method would
  return that undef, but C<content_array_ref> would set the given node's
  C<_content> value to C<[]> (a reference to a new, empty array), and
  return that.
  
  =head2 content_refs_list
  
    @content_refs = $h->content_refs_list;
  
  This returns a list of scalar references to each element of C<$h>'s
  content list.  This is useful in case you want to in-place edit any
  large text segments without having to get a copy of the current value
  of that segment value, modify that copy, then use the
  C<splice_content> to replace the old with the new.  Instead, here you
  can in-place edit:
  
      foreach my $item_r ($h->content_refs_list) {
          next if ref $$item_r;
          $$item_r =~ s/honour/honor/g;
      }
  
  You I<could> currently achieve the same affect with:
  
      foreach my $item (@{ $h->content_array_ref }) {
          # deprecated!
          next if ref $item;
          $item =~ s/honour/honor/g;
      }
  
  ...except that using the return value of C<< $h->content >> or
  C<< $h->content_array_ref >> to do that is deprecated, and just might stop
  working in the future.
  
  =head2 implicit
  
    $is_implicit = $h->implicit();
    $h->implicit($make_implicit);
  
  Returns (optionally sets) the "_implicit" attribute.  This attribute is
  a flag that's used for indicating that the element was not originally
  present in the source, but was added to the parse tree (by
  HTML::TreeBuilder, for example) in order to conform to the rules of
  HTML structure.
  
  =head2 pos
  
    $pos = $h->pos();
    $h->pos($element);
  
  Returns (and optionally sets) the "_pos" (for "current I<pos>ition")
  pointer of C<$h>.  This attribute is a pointer used during some
  parsing operations, whose value is whatever HTML::Element element
  at or under C<$h> is currently "open", where C<< $h->insert_element(NEW) >>
  will actually insert a new element.
  
  (This has nothing to do with the Perl function called C<pos>, for
  controlling where regular expression matching starts.)
  
  If you set C<< $h->pos($element) >>, be sure that C<$element> is
  either C<$h>, or an element under C<$h>.
  
  If you've been modifying the tree under C<$h> and are no longer
  sure C<< $h->pos >> is valid, you can enforce validity with:
  
      $h->pos(undef) unless $h->pos->is_inside($h);
  
  =head2 all_attr
  
    %attr = $h->all_attr();
  
  Returns all this element's attributes and values, as key-value pairs.
  This will include any "internal" attributes (i.e., ones not present
  in the original element, and which will not be represented if/when you
  call C<< $h->as_HTML >>).  Internal attributes are distinguished by the fact
  that the first character of their key (not value! key!) is an
  underscore ("_").
  
  Example output of C<< $h->all_attr() >> :
  C<'_parent', >I<[object_value]>C< , '_tag', 'em', 'lang', 'en-US',
  '_content', >I<[array-ref value]>.
  
  =head2 all_attr_names
  
    @names = $h->all_attr_names();
    $num_attrs = $h->all_attr_names();
  
  Like C<all_attr>, but only returns the names of the attributes.
  In scalar context, returns the number of attributes.
  
  Example output of C<< $h->all_attr_names() >> :
  C<'_parent', '_tag', 'lang', '_content', >.
  
  =head2 all_external_attr
  
    %attr = $h->all_external_attr();
  
  Like C<all_attr>, except that internal attributes are not present.
  
  =head2 all_external_attr_names
  
    @names = $h->all_external_attr_names();
    $num_attrs = $h->all_external_attr_names();
  
  Like C<all_attr_names>, except that internal attributes' names
  are not present (or counted).
  
  =head2 id
  
    $id = $h->id();
    $h->id($string);
  
  Returns (optionally sets to C<$string>) the "id" attribute.
  C<< $h->id(undef) >> deletes the "id" attribute.
  
  C<< $h->id(...) >> is basically equivalent to C<< $h->attr('id', ...) >>,
  except that when setting the attribute, this method returns the new value,
  not the old value.
  
  =head2 idf
  
    $id = $h->idf();
    $h->idf($string);
  
  Just like the C<id> method, except that if you call C<< $h->idf() >> and
  no "id" attribute is defined for this element, then it's set to a
  likely-to-be-unique value, and returned.  (The "f" is for "force".)
  
  =head1 STRUCTURE-MODIFYING METHODS
  
  These methods are provided for modifying the content of trees
  by adding or changing nodes as parents or children of other nodes.
  
  =head2 push_content
  
    $h->push_content($element_or_text, ...);
  
  Adds the specified items to the I<end> of the content list of the
  element C<$h>.  The items of content to be added should each be either a
  text segment (a string), an HTML::Element object, or an arrayref.
  Arrayrefs are fed thru C<< $h->new_from_lol(that_arrayref) >> to
  convert them into elements, before being added to the content
  list of C<$h>.  This means you can say things concise things like:
  
    $body->push_content(
      ['br'],
      ['ul',
        map ['li', $_], qw(Peaches Apples Pears Mangos)
      ]
    );
  
  See the L</new_from_lol> method's documentation, far below, for more
  explanation.
  
  Returns C<$h> (the element itself).
  
  The push_content method will try to consolidate adjacent text segments
  while adding to the content list.  That's to say, if C<$h>'s C<content_list> is
  
    ('foo bar ', $some_node, 'baz!')
  
  and you call
  
     $h->push_content('quack?');
  
  then the resulting content list will be this:
  
    ('foo bar ', $some_node, 'baz!quack?')
  
  and not this:
  
    ('foo bar ', $some_node, 'baz!', 'quack?')
  
  If that latter is what you want, you'll have to override the
  feature of consolidating text by using splice_content,
  as in:
  
    $h->splice_content(scalar($h->content_list),0,'quack?');
  
  Similarly, if you wanted to add 'Skronk' to the beginning of
  the content list, calling this:
  
     $h->unshift_content('Skronk');
  
  then the resulting content list will be this:
  
    ('Skronkfoo bar ', $some_node, 'baz!')
  
  and not this:
  
    ('Skronk', 'foo bar ', $some_node, 'baz!')
  
  What you'd to do get the latter is:
  
    $h->splice_content(0,0,'Skronk');
  
  =head2 unshift_content
  
    $h->unshift_content($element_or_text, ...)
  
  Just like C<push_content>, but adds to the I<beginning> of the C<$h>
  element's content list.
  
  The items of content to be added should each be
  either a text segment (a string), an HTML::Element object, or
  an arrayref (which is fed thru C<new_from_lol>).
  
  The unshift_content method will try to consolidate adjacent text segments
  while adding to the content list.  See above for a discussion of this.
  
  Returns C<$h> (the element itself).
  
  =head2 splice_content
  
    @removed = $h->splice_content($offset, $length,
                                  $element_or_text, ...);
  
  Detaches the elements from C<$h>'s list of content-nodes, starting at
  C<$offset> and continuing for C<$length> items, replacing them with the
  elements of the following list, if any.  Returns the elements (if any)
  removed from the content-list.  If C<$offset> is negative, then it starts
  that far from the end of the array, just like Perl's normal C<splice>
  function.  If C<$length> and the following list is omitted, removes
  everything from C<$offset> onward.
  
  The items of content to be added (if any) should each be either a text
  segment (a string), an arrayref (which is fed thru L</new_from_lol>),
  or an HTML::Element object that's not already
  a child of C<$h>.
  
  =head2 detach
  
    $old_parent = $h->detach();
  
  This unlinks C<$h> from its parent, by setting its 'parent' attribute to
  undef, and by removing it from the content list of its parent (if it
  had one).  The return value is the parent that was detached from (or
  undef, if C<$h> had no parent to start with).  Note that neither C<$h> nor
  its parent are explicitly destroyed.
  
  =head2 detach_content
  
    @old_content = $h->detach_content();
  
  This unlinks all of C<$h>'s children from C<$h>, and returns them.
  Note that these are not explicitly destroyed; for that, you
  can just use C<< $h->delete_content >>.
  
  =head2 replace_with
  
    $h->replace_with( $element_or_text, ... )
  
  This replaces C<$h> in its parent's content list with the nodes
  specified.  The element C<$h> (which by then may have no parent)
  is returned.  This causes a fatal error if C<$h> has no parent.
  The list of nodes to insert may contain C<$h>, but at most once.
  Aside from that possible exception, the nodes to insert should not
  already be children of C<$h>'s parent.
  
  Also, note that this method does not destroy C<$h> if weak references are
  turned off -- use C<< $h->replace_with(...)->delete >> if you need that.
  
  =head2 preinsert
  
    $h->preinsert($element_or_text...);
  
  Inserts the given nodes right BEFORE C<$h> in C<$h>'s parent's
  content list.  This causes a fatal error if C<$h> has no parent.
  None of the given nodes should be C<$h> or other children of C<$h>.
  Returns C<$h>.
  
  =head2 postinsert
  
    $h->postinsert($element_or_text...)
  
  Inserts the given nodes right AFTER C<$h> in C<$h>'s parent's content
  list.  This causes a fatal error if C<$h> has no parent.  None of
  the given nodes should be C<$h> or other children of C<$h>.  Returns
  C<$h>.
  
  =head2 replace_with_content
  
    $h->replace_with_content();
  
  This replaces C<$h> in its parent's content list with its own content.
  The element C<$h> (which by then has no parent or content of its own) is
  returned.  This causes a fatal error if C<$h> has no parent.  Also, note
  that this does not destroy C<$h> if weak references are turned off -- use
  C<< $h->replace_with_content->delete >> if you need that.
  
  =head2 delete_content
  
    $h->delete_content();
    $h->destroy_content(); # alias
  
  Clears the content of C<$h>, calling C<< $h->delete >> for each content
  element.  Compare with C<< $h->detach_content >>.
  
  Returns C<$h>.
  
  C<destroy_content> is an alias for this method.
  
  =head2 delete
  
    $h->delete();
    $h->destroy(); # alias
  
  Detaches this element from its parent (if it has one) and explicitly
  destroys the element and all its descendants.  The return value is
  the empty list (or C<undef> in scalar context).
  
  Before version 5.00 of HTML::Element, you had to call C<delete> when
  you were finished with the tree, or your program would leak memory.
  This is no longer necessary if weak references are enabled, see
  L</"Weak References">.
  
  =head2 destroy
  
  An alias for L</delete>.
  
  =head2 destroy_content
  
  An alias for L</delete_content>.
  
  =head2 clone
  
    $copy = $h->clone();
  
  Returns a copy of the element (whose children are clones (recursively)
  of the original's children, if any).
  
  The returned element is parentless.  Any '_pos' attributes present in the
  source element/tree will be absent in the copy.  For that and other reasons,
  the clone of an HTML::TreeBuilder object that's in mid-parse (i.e, the head
  of a tree that HTML::TreeBuilder is elaborating) cannot (currently) be used
  to continue the parse.
  
  You are free to clone HTML::TreeBuilder trees, just as long as:
  1) they're done being parsed, or 2) you don't expect to resume parsing
  into the clone.  (You can continue parsing into the original; it is
  never affected.)
  
  =head2 clone_list
  
    @copies = HTML::Element->clone_list(...nodes...);
  
  Returns a list consisting of a copy of each node given.
  Text segments are simply copied; elements are cloned by
  calling C<< $it->clone >> on each of them.
  
  Note that this must be called as a class method, not as an instance
  method.  C<clone_list> will croak if called as an instance method.
  You can also call it like so:
  
      ref($h)->clone_list(...nodes...)
  
  =head2 normalize_content
  
    $h->normalize_content
  
  Normalizes the content of C<$h> -- i.e., concatenates any adjacent
  text nodes.  (Any undefined text segments are turned into empty-strings.)
  Note that this does not recurse into C<$h>'s descendants.
  
  =head2 delete_ignorable_whitespace
  
    $h->delete_ignorable_whitespace()
  
  This traverses under C<$h> and deletes any text segments that are ignorable
  whitespace.  You should not use this if C<$h> is under a C<< <pre> >> element.
  
  =head2 insert_element
  
    $h->insert_element($element, $implicit);
  
  Inserts (via push_content) a new element under the element at
  C<< $h->pos() >>.  Then updates C<< $h->pos() >> to point to the inserted
  element, unless $element is a prototypically empty element like
  C<< <br> >>, C<< <hr> >>, C<< <img> >>, etc.
  The new C<< $h->pos() >> is returned.  This
  method is useful only if your particular tree task involves setting
  C<< $h->pos() >>.
  
  =head1 DUMPING METHODS
  
  =head2 dump
  
    $h->dump()
    $h->dump(*FH)  ; # or *FH{IO} or $fh_obj
  
  Prints the element and all its children to STDOUT (or to a specified
  filehandle), in a format useful
  only for debugging.  The structure of the document is shown by
  indentation (no end tags).
  
  =head2 as_HTML
  
    $s = $h->as_HTML();
    $s = $h->as_HTML($entities);
    $s = $h->as_HTML($entities, $indent_char);
    $s = $h->as_HTML($entities, $indent_char, \%optional_end_tags);
  
  Returns a string representing in HTML the element and its
  descendants.  The optional argument C<$entities> specifies a string of
  the entities to encode.  For compatibility with previous versions,
  specify C<'E<lt>E<gt>&'> here.  If omitted or undef, I<all> unsafe
  characters are encoded as HTML entities.  See L<HTML::Entities> for
  details.  If passed an empty string, no entities are encoded.
  
  If $indent_char is specified and defined, the HTML to be output is
  intented, using the string you specify (which you probably should
  set to "\t", or some number of spaces, if you specify it).
  
  If C<\%optional_end_tags> is specified and defined, it should be
  a reference to a hash that holds a true value for every tag name
  whose end tag is optional.  Defaults to
  C<\%HTML::Element::optionalEndTag>, which is an alias to
  C<%HTML::Tagset::optionalEndTag>, which, at time of writing, contains
  true values for C<p, li, dt, dd>.  A useful value to pass is an empty
  hashref, C<{}>, which means that no end-tags are optional for this dump.
  Otherwise, possibly consider copying C<%HTML::Tagset::optionalEndTag> to a
  hash of your own, adding or deleting values as you like, and passing
  a reference to that hash.
  
  =head2 as_text
  
    $s = $h->as_text();
    $s = $h->as_text(skip_dels => 1);
  
  Returns a string consisting of only the text parts of the element's
  descendants.  Any whitespace inside the element is included unchanged,
  but whitespace not in the tree is never added.  But remember that
  whitespace may be ignored or compacted by HTML::TreeBuilder during
  parsing (depending on the value of the C<ignore_ignorable_whitespace>
  and C<no_space_compacting> attributes).  Also, since whitespace is
  never added during parsing,
  
    HTML::TreeBuilder->new_from_content("<p>a</p><p>b</p>")
                     ->as_text;
  
  returns C<"ab">, not C<"a b"> or C<"a\nb">.
  
  Text under C<< <script> >> or C<< <style> >> elements is never
  included in what's returned.  If C<skip_dels> is true, then text
  content under C<< <del> >> nodes is not included in what's returned.
  
  =head2 as_trimmed_text
  
    $s = $h->as_trimmed_text(...);
    $s = $h->as_trimmed_text(extra_chars => '\xA0'); # remove &nbsp;
    $s = $h->as_text_trimmed(...); # alias
  
  This is just like C<as_text(...)> except that leading and trailing
  whitespace is deleted, and any internal whitespace is collapsed.
  
  This will not remove non-breaking spaces, Unicode spaces, or any other
  non-ASCII whitespace unless you supply the extra characters as
  a string argument (e.g. C<< $h->as_trimmed_text(extra_chars => '\xA0') >>).
  C<extra_chars> may be any string that can appear inside a character
  class, including ranges like C<a-z>, POSIX character classes like
  C<[:alpha:]>, and character class escapes like C<\p{Zs}>.
  
  =head2 as_XML
  
    $s = $h->as_XML()
  
  Returns a string representing in XML the element and its descendants.
  
  The XML is not indented.
  
  =head2 as_Lisp_form
  
    $s = $h->as_Lisp_form();
  
  Returns a string representing the element and its descendants as a
  Lisp form.  Unsafe characters are encoded as octal escapes.
  
  The Lisp form is indented, and contains external ("href", etc.)  as
  well as internal attributes ("_tag", "_content", "_implicit", etc.),
  except for "_parent", which is omitted.
  
  Current example output for a given element:
  
    ("_tag" "img" "border" "0" "src" "pie.png" "usemap" "#main.map")
  
  =head2 format
  
    $s = $h->format; # use HTML::FormatText
    $s = $h->format($formatter);
  
  Formats text output. Defaults to HTML::FormatText.
  
  Takes a second argument that is a reference to a formatter.
  
  =head2 starttag
  
    $start = $h->starttag();
    $start = $h->starttag($entities);
  
  Returns a string representing the complete start tag for the element.
  I.e., leading "<", tag name, attributes, and trailing ">".
  All values are surrounded with
  double-quotes, and appropriate characters are encoded.  If C<$entities>
  is omitted or undef, I<all> unsafe characters are encoded as HTML
  entities.  See L<HTML::Entities> for details.  If you specify some
  value for C<$entities>, remember to include the double-quote character in
  it.  (Previous versions of this module would basically behave as if
  C<'&"E<gt>'> were specified for C<$entities>.)  If C<$entities> is
  an empty string, no entity is escaped.
  
  =head2 starttag_XML
  
    $start = $h->starttag_XML();
  
  Returns a string representing the complete start tag for the element.
  
  =head2 endtag
  
    $end = $h->endtag();
  
  Returns a string representing the complete end tag for this element.
  I.e., "</", tag name, and ">".
  
  =head2 endtag_XML
  
    $end = $h->endtag_XML();
  
  Returns a string representing the complete end tag for this element.
  I.e., "</", tag name, and ">".
  
  =head1 SECONDARY STRUCTURAL METHODS
  
  These methods all involve some structural aspect of the tree;
  either they report some aspect of the tree's structure, or they involve
  traversal down the tree, or walking up the tree.
  
  =head2 is_inside
  
    $inside = $h->is_inside('tag', $element, ...);
  
  Returns true if the C<$h> element is, or is contained anywhere inside an
  element that is any of the ones listed, or whose tag name is any of
  the tag names listed.  You can use any mix of elements and tag names.
  
  =head2 is_empty
  
    $empty = $h->is_empty();
  
  Returns true if C<$h> has no content, i.e., has no elements or text
  segments under it.  In other words, this returns true if C<$h> is a leaf
  node, AKA a terminal node.  Do not confuse this sense of "empty" with
  another sense that it can have in SGML/HTML/XML terminology, which
  means that the element in question is of the type (like HTML's C<< <hr> >>,
  C<< <br> >>, C<< <img> >>, etc.) that I<can't> have any content.
  
  That is, a particular C<< <p> >> element may happen to have no content, so
  $that_p_element->is_empty will be true -- even though the prototypical
  C<< <p> >> element isn't "empty" (not in the way that the prototypical
  C<< <hr> >> element is).
  
  If you think this might make for potentially confusing code, consider
  simply using the clearer exact equivalent:  C<< not($h->content_list) >>.
  
  =head2 pindex
  
    $index = $h->pindex();
  
  Return the index of the element in its parent's contents array, such
  that C<$h> would equal
  
    $h->parent->content->[$h->pindex]
    # or
    ($h->parent->content_list)[$h->pindex]
  
  assuming C<$h> isn't root.  If the element C<$h> is root, then
  C<< $h->pindex >> returns C<undef>.
  
  =head2 left
  
    $element = $h->left();
    @elements = $h->left();
  
  In scalar context: returns the node that's the immediate left sibling
  of C<$h>.  If C<$h> is the leftmost (or only) child of its parent (or has no
  parent), then this returns undef.
  
  In list context: returns all the nodes that're the left siblings of C<$h>
  (starting with the leftmost).  If C<$h> is the leftmost (or only) child
  of its parent (or has no parent), then this returns an empty list.
  
  (See also C<< $h->preinsert(LIST) >>.)
  
  =head2 right
  
    $element = $h->right();
    @elements = $h->right();
  
  In scalar context: returns the node that's the immediate right sibling
  of C<$h>.  If C<$h> is the rightmost (or only) child of its parent (or has
  no parent), then this returns C<undef>.
  
  In list context: returns all the nodes that're the right siblings of
  C<$h>, starting with the leftmost.  If C<$h> is the rightmost (or only) child
  of its parent (or has no parent), then this returns an empty list.
  
  (See also C<< $h->postinsert(LIST) >>.)
  
  =head2 address
  
    $address = $h->address();
    $element_or_text = $h->address($address);
  
  The first form (with no parameter) returns a string representing the
  location of C<$h> in the tree it is a member of.
  The address consists of numbers joined by a '.', starting with '0',
  and followed by the pindexes of the nodes in the tree that are
  ancestors of C<$h>, starting from the top.
  
  So if the way to get to a node starting at the root is to go to child
  2 of the root, then child 10 of that, and then child 0 of that, and
  then you're there -- then that node's address is "0.2.10.0".
  
  As a bit of a special case, the address of the root is simply "0".
  
  I forsee this being used mainly for debugging, but you may
  find your own uses for it.
  
    $element_or_text = $h->address($address);
  
  This form returns the node (whether element or text-segment) at
  the given address in the tree that C<$h> is a part of.  (That is,
  the address is resolved starting from C<< $h->root >>.)
  
  If there is no node at the given address, this returns C<undef>.
  
  You can specify "relative addressing" (i.e., that indexing is supposed
  to start from C<$h> and not from C<< $h->root >>) by having the address start
  with a period -- e.g., C<< $h->address(".3.2") >> will look at child 3 of C<$h>,
  and child 2 of that.
  
  =head2 depth
  
    $depth = $h->depth();
  
  Returns a number expressing C<$h>'s depth within its tree, i.e., how many
  steps away it is from the root.  If C<$h> has no parent (i.e., is root),
  its depth is 0.
  
  =head2 root
  
    $root = $h->root();
  
  Returns the element that's the top of C<$h>'s tree.  If C<$h> is
  root, this just returns C<$h>.  (If you want to test whether C<$h>
  I<is> the root, instead of asking what its root is, just test
  C<< not($h->parent) >>.)
  
  =head2 lineage
  
    @lineage = $h->lineage();
  
  Returns the list of C<$h>'s ancestors, starting with its parent,
  and then that parent's parent, and so on, up to the root.  If C<$h>
  is root, this returns an empty list.
  
  If you simply want a count of the number of elements in C<$h>'s lineage,
  use C<< $h->depth >>.
  
  =head2 lineage_tag_names
  
    @names = $h->lineage_tag_names();
  
  Returns the list of the tag names of C<$h>'s ancestors, starting
  with its parent, and that parent's parent, and so on, up to the
  root.  If C<$h> is root, this returns an empty list.
  Example output: C<('em', 'td', 'tr', 'table', 'body', 'html')>
  
  Equivalent to:
  
    map { $_->tag } $h->lineage;
  
  =head2 descendants
  
    @descendants = $h->descendants();
  
  In list context, returns the list of all C<$h>'s descendant elements,
  listed in pre-order (i.e., an element appears before its
  content-elements).  Text segments DO NOT appear in the list.
  In scalar context, returns a count of all such elements.
  
  =head2 descendents
  
  This is just an alias to the C<descendants> method, for people who
  can't spell.
  
  =head2 find_by_tag_name
  
    @elements = $h->find_by_tag_name('tag', ...);
    $first_match = $h->find_by_tag_name('tag', ...);
  
  In list context, returns a list of elements at or under C<$h> that have
  any of the specified tag names.  In scalar context, returns the first
  (in pre-order traversal of the tree) such element found, or undef if
  none.
  
  =head2 find
  
  This is just an alias to C<find_by_tag_name>.  (There was once
  going to be a whole find_* family of methods, but then C<look_down>
  filled that niche, so there turned out not to be much reason for the
  verboseness of the name "find_by_tag_name".)
  
  =head2 find_by_attribute
  
    @elements = $h->find_by_attribute('attribute', 'value');
    $first_match = $h->find_by_attribute('attribute', 'value');
  
  In a list context, returns a list of elements at or under C<$h> that have
  the specified attribute, and have the given value for that attribute.
  In a scalar context, returns the first (in pre-order traversal of the
  tree) such element found, or undef if none.
  
  This method is B<deprecated> in favor of the more expressive
  C<look_down> method, which new code should use instead.
  
  =head2 look_down
  
    @elements = $h->look_down( ...criteria... );
    $first_match = $h->look_down( ...criteria... );
  
  This starts at C<$h> and looks thru its element descendants (in
  pre-order), looking for elements matching the criteria you specify.
  In list context, returns all elements that match all the given
  criteria; in scalar context, returns the first such element (or undef,
  if nothing matched).
  
  There are three kinds of criteria you can specify:
  
  =over
  
  =item (attr_name, attr_value)
  
  This means you're looking for an element with that value for that
  attribute.  Example: C<"alt", "pix!">.  Consider that you can search
  on internal attribute values too: C<"_tag", "p">.
  
  =item (attr_name, qr/.../)
  
  This means you're looking for an element whose value for that
  attribute matches the specified Regexp object.
  
  =item a coderef
  
  This means you're looking for elements where coderef->(each_element)
  returns true.  Example:
  
    my @wide_pix_images = $h->look_down(
      _tag => "img",
      alt  => "pix!",
      sub { $_[0]->attr('width') > 350 }
    );
  
  =back
  
  Note that C<(attr_name, attr_value)> and C<(attr_name, qr/.../)>
  criteria are almost always faster than coderef
  criteria, so should presumably be put before them in your list of
  criteria.  That is, in the example above, the sub ref is called only
  for elements that have already passed the criteria of having a "_tag"
  attribute with value "img", and an "alt" attribute with value "pix!".
  If the coderef were first, it would be called on every element, and
  I<then> what elements pass that criterion (i.e., elements for which
  the coderef returned true) would be checked for their "_tag" and "alt"
  attributes.
  
  Note that comparison of string attribute-values against the string
  value in C<(attr_name, attr_value)> is case-INsensitive!  A criterion
  of C<('align', 'right')> I<will> match an element whose "align" value
  is "RIGHT", or "right" or "rIGhT", etc.
  
  Note also that C<look_down> considers "" (empty-string) and undef to
  be different things, in attribute values.  So this:
  
    $h->look_down("alt", "")
  
  will find elements I<with> an "alt" attribute, but where the value for
  the "alt" attribute is "".  But this:
  
    $h->look_down("alt", undef)
  
  is the same as:
  
    $h->look_down(sub { !defined($_[0]->attr('alt')) } )
  
  That is, it finds elements that do not have an "alt" attribute at all
  (or that do have an "alt" attribute, but with a value of undef --
  which is not normally possible).
  
  Note that when you give several criteria, this is taken to mean you're
  looking for elements that match I<all> your criterion, not just I<any>
  of them.  In other words, there is an implicit "and", not an "or".  So
  if you wanted to express that you wanted to find elements with a
  "name" attribute with the value "foo" I<or> with an "id" attribute
  with the value "baz", you'd have to do it like:
  
    @them = $h->look_down(
      sub {
        # the lcs are to fold case
        lc($_[0]->attr('name')) eq 'foo'
        or lc($_[0]->attr('id')) eq 'baz'
      }
    );
  
  Coderef criteria are more expressive than C<(attr_name, attr_value)>
  and C<(attr_name, qr/.../)>
  criteria, and all C<(attr_name, attr_value)>
  and C<(attr_name, qr/.../)>
  criteria could be
  expressed in terms of coderefs.  However, C<(attr_name, attr_value)>
  and C<(attr_name, qr/.../)>
  criteria are a convenient shorthand.  (In fact, C<look_down> itself is
  basically "shorthand" too, since anything you can do with C<look_down>
  you could do by traversing the tree, either with the C<traverse>
  method or with a routine of your own.  However, C<look_down> often
  makes for very concise and clear code.)
  
  =head2 look_up
  
    @elements = $h->look_up( ...criteria... );
    $first_match = $h->look_up( ...criteria... );
  
  This is identical to C<< $h->look_down >>, except that whereas
  C<< $h->look_down >>
  basically scans over the list:
  
     ($h, $h->descendants)
  
  C<< $h->look_up >> instead scans over the list
  
     ($h, $h->lineage)
  
  So, for example, this returns all ancestors of C<$h> (possibly including
  C<$h> itself) that are C<< <td> >> elements with an "align" attribute with a
  value of "right" (or "RIGHT", etc.):
  
     $h->look_up("_tag", "td", "align", "right");
  
  =head2 traverse
  
    $h->traverse(...options...)
  
  Lengthy discussion of HTML::Element's unnecessary and confusing
  C<traverse> method has been moved to a separate file:
  L<HTML::Element::traverse>
  
  =head2 attr_get_i
  
    @values = $h->attr_get_i('attribute');
    $first_value = $h->attr_get_i('attribute');
  
  In list context, returns a list consisting of the values of the given
  attribute for C<$h> and for all its ancestors starting from C<$h> and
  working its way up.  Nodes with no such attribute are skipped.
  ("attr_get_i" stands for "attribute get, with inheritance".)
  In scalar context, returns the first such value, or undef if none.
  
  Consider a document consisting of:
  
     <html lang='i-klingon'>
       <head><title>Pati Pata</title></head>
       <body>
         <h1 lang='la'>Stuff</h1>
         <p lang='es-MX' align='center'>
           Foo bar baz <cite>Quux</cite>.
         </p>
         <p>Hooboy.</p>
       </body>
     </html>
  
  If C<$h> is the C<< <cite> >> element, C<< $h->attr_get_i("lang") >>
  in list context will return the list C<('es-MX', 'i-klingon')>.
  In scalar context, it will return the value C<'es-MX'>.
  
  If you call with multiple attribute names...
  
    @values = $h->attr_get_i('a1', 'a2', 'a3');
    $first_value = $h->attr_get_i('a1', 'a2', 'a3');
  
  ...in list context, this will return a list consisting of
  the values of these attributes which exist in C<$h> and its ancestors.
  In scalar context, this returns the first value (i.e., the value of
  the first existing attribute from the first element that has
  any of the attributes listed).  So, in the above example,
  
    $h->attr_get_i('lang', 'align');
  
  will return:
  
     ('es-MX', 'center', 'i-klingon') # in list context
    or
     'es-MX' # in scalar context.
  
  But note that this:
  
   $h->attr_get_i('align', 'lang');
  
  will return:
  
     ('center', 'es-MX', 'i-klingon') # in list context
    or
     'center' # in scalar context.
  
  =head2 tagname_map
  
    $hash_ref = $h->tagname_map();
  
  Scans across C<$h> and all its descendants, and makes a hash (a
  reference to which is returned) where each entry consists of a key
  that's a tag name, and a value that's a reference to a list to all
  elements that have that tag name.  I.e., this method returns:
  
     {
       # Across $h and all descendants...
       'a'   => [ ...list of all <a>   elements... ],
       'em'  => [ ...list of all <em>  elements... ],
       'img' => [ ...list of all <img> elements... ],
     }
  
  (There are entries in the hash for only those tagnames that occur
  at/under C<$h> -- so if there's no C<< <img> >> elements, there'll be no
  "img" entry in the returned hashref.)
  
  Example usage:
  
      my $map_r = $h->tagname_map();
      my @heading_tags = sort grep m/^h\d$/s, keys %$map_r;
      if(@heading_tags) {
        print "Heading levels used: @heading_tags\n";
      } else {
        print "No headings.\n"
      }
  
  =head2 extract_links
  
    $links_array_ref = $h->extract_links();
    $links_array_ref = $h->extract_links(@wantedTypes);
  
  Returns links found by traversing the element and all of its children
  and looking for attributes (like "href" in an C<< <a> >> element, or "src" in
  an C<< <img> >> element) whose values represent links.  The return value is a
  I<reference> to an array.  Each element of the array is reference to
  an array with I<four> items: the link-value, the element that has the
  attribute with that link-value, and the name of that attribute, and
  the tagname of that element.
  (Example: C<['http://www.suck.com/',> I<$elem_obj> C<, 'href', 'a']>.)
  You may or may not end up using the
  element itself -- for some purposes, you may use only the link value.
  
  You might specify that you want to extract links from just some kinds
  of elements (instead of the default, which is to extract links from
  I<all> the kinds of elements known to have attributes whose values
  represent links).  For instance, if you want to extract links from
  only C<< <a> >> and C<< <img> >> elements, you could code it like this:
  
    for (@{  $e->extract_links('a', 'img')  }) {
        my($link, $element, $attr, $tag) = @$_;
        print
          "Hey, there's a $tag that links to ",
          $link, ", in its $attr attribute, at ",
          $element->address(), ".\n";
    }
  
  =head2 simplify_pres
  
    $h->simplify_pres();
  
  In text bits under PRE elements that are at/under C<$h>, this routine
  nativizes all newlines, and expands all tabs.
  
  That is, if you read a file with lines delimited by C<\cm\cj>'s, the
  text under PRE areas will have C<\cm\cj>'s instead of C<\n>'s. Calling
  C<< $h->simplify_pres >> on such a tree will turn C<\cm\cj>'s into
  C<\n>'s.
  
  Tabs are expanded to however many spaces it takes to get
  to the next 8th column -- the usual way of expanding them.
  
  =head2 same_as
  
    $equal = $h->same_as($i)
  
  Returns true if C<$h> and C<$i> are both elements representing the same tree
  of elements, each with the same tag name, with the same explicit
  attributes (i.e., not counting attributes whose names start with "_"),
  and with the same content (textual, comments, etc.).
  
  Sameness of descendant elements is tested, recursively, with
  C<< $child1->same_as($child_2) >>, and sameness of text segments is tested
  with C<$segment1 eq $segment2>.
  
  =head2 new_from_lol
  
    $h = HTML::Element->new_from_lol($array_ref);
    @elements = HTML::Element->new_from_lol($array_ref, ...);
  
  Resursively constructs a tree of nodes, based on the (non-cyclic)
  data structure represented by each C<$array_ref>, where that is a reference
  to an array of arrays (of arrays (of arrays (etc.))).
  
  In each arrayref in that structure, different kinds of values are
  treated as follows:
  
  =over
  
  =item * Arrayrefs
  
  Arrayrefs are considered to
  designate a sub-tree representing children for the node constructed
  from the current arrayref.
  
  =item * Hashrefs
  
  Hashrefs are considered to contain
  attribute-value pairs to add to the element to be constructed from
  the current arrayref
  
  =item * Text segments
  
  Text segments at the start of any arrayref
  will be considered to specify the name of the element to be
  constructed from the current arrayref; all other text segments will
  be considered to specify text segments as children for the current
  arrayref.
  
  =item * Elements
  
  Existing element objects are either inserted into the treelet
  constructed, or clones of them are.  That is, when the lol-tree is
  being traversed and elements constructed based what's in it, if
  an existing element object is found, if it has no parent, then it is
  added directly to the treelet constructed; but if it has a parent,
  then C<$that_node-E<gt>clone> is added to the treelet at the
  appropriate place.
  
  =back
  
  An example will hopefully make this more obvious:
  
    my $h = HTML::Element->new_from_lol(
      ['html',
        ['head',
          [ 'title', 'I like stuff!' ],
        ],
        ['body',
          {'lang', 'en-JP', _implicit => 1},
          'stuff',
          ['p', 'um, p < 4!', {'class' => 'par123'}],
          ['div', {foo => 'bar'}, '123'],
        ]
      ]
    );
    $h->dump;
  
  Will print this:
  
    <html> @0
      <head> @0.0
        <title> @0.0.0
          "I like stuff!"
      <body lang="en-JP"> @0.1 (IMPLICIT)
        "stuff"
        <p class="par123"> @0.1.1
          "um, p < 4!"
        <div foo="bar"> @0.1.2
          "123"
  
  And printing $h->as_HTML will give something like:
  
    <html><head><title>I like stuff!</title></head>
    <body lang="en-JP">stuff<p class="par123">um, p &lt; 4!
    <div foo="bar">123</div></body></html>
  
  You can even do fancy things with C<map>:
  
    $body->push_content(
      # push_content implicitly calls new_from_lol on arrayrefs...
      ['br'],
      ['blockquote',
        ['h2', 'Pictures!'],
        map ['p', $_],
        $body2->look_down("_tag", "img"),
          # images, to be copied from that other tree.
      ],
      # and more stuff:
      ['ul',
        map ['li', ['a', {'href'=>"$_.png"}, $_ ] ],
        qw(Peaches Apples Pears Mangos)
      ],
    );
  
  In scalar context, you must supply exactly one arrayref.  In list
  context, you can pass a list of arrayrefs, and L<new_from_lol> will
  return a list of elements, one for each arrayref.
  
    @elements = HTML::Element->new_from_lol(
      ['hr'],
      ['p', 'And there, on the door, was a hook!'],
    );
     # constructs two elements.
  
  =head2 objectify_text
  
    $h->objectify_text();
  
  This turns any text nodes under C<$h> from mere text segments (strings)
  into real objects, pseudo-elements with a tag-name of "~text", and the
  actual text content in an attribute called "text".  (For a discussion
  of pseudo-elements, see the L</"tag"> method, far above.)  This method is
  provided because, for some purposes, it is convenient or necessary to
  be able, for a given text node, to ask what element is its parent; and
  clearly this is not possible if a node is just a text string.
  
  Note that these "~text" objects are not recognized as text nodes by
  methods like L</as_text>.  Presumably you will want to call
  C<< $h->objectify_text >>, perform whatever task that you needed that for,
  and then call C<< $h->deobjectify_text >> before calling anything like
  C<< $h->as_text >>.
  
  =head2 deobjectify_text
  
    $h->deobjectify_text();
  
  This undoes the effect of C<< $h->objectify_text >>.  That is, it takes any
  "~text" pseudo-elements in the tree at/under C<$h>, and deletes each one,
  replacing each with the content of its "text" attribute.
  
  Note that if C<$h> itself is a "~text" pseudo-element, it will be
  destroyed -- a condition you may need to treat specially in your
  calling code (since it means you can't very well do anything with C<$h>
  after that).  So that you can detect that condition, if C<$h> is itself a
  "~text" pseudo-element, then this method returns the value of the
  "text" attribute, which should be a defined value; in all other cases,
  it returns undef.
  
  (This method assumes that no "~text" pseudo-element has any children.)
  
  =head2 number_lists
  
    $h->number_lists();
  
  For every UL, OL, DIR, and MENU element at/under C<$h>, this sets a
  "_bullet" attribute for every child LI element.  For LI children of an
  OL, the "_bullet" attribute's value will be something like "4.", "d.",
  "D.", "IV.", or "iv.", depending on the OL element's "type" attribute.
  LI children of a UL, DIR, or MENU get their "_bullet" attribute set
  to "*".
  There should be no other LIs (i.e., except as children of OL, UL, DIR,
  or MENU elements), and if there are, they are unaffected.
  
  =head2 has_insane_linkage
  
    $h->has_insane_linkage
  
  This method is for testing whether this element or the elements
  under it have linkage attributes (_parent and _content) whose values
  are deeply aberrant: if there are undefs in a content list; if an
  element appears in the content lists of more than one element;
  if the _parent attribute of an element doesn't match its actual
  parent; or if an element appears as its own descendant (i.e.,
  if there is a cyclicity in the tree).
  
  This returns empty list (or false, in scalar context) if the subtree's
  linkage methods are sane; otherwise it returns two items (or true, in
  scalar context): the element where the error occurred, and a string
  describing the error.
  
  This method is provided is mainly for debugging and troubleshooting --
  it should be I<quite impossible> for any document constructed via
  HTML::TreeBuilder to parse into a non-sane tree (since it's not
  the content of the tree per se that's in question, but whether
  the tree in memory was properly constructed); and it I<should> be
  impossible for you to produce an insane tree just thru reasonable
  use of normal documented structure-modifying methods.  But if you're
  constructing your own trees, and your program is going into infinite
  loops as during calls to traverse() or any of the secondary
  structural methods, as part of debugging, consider calling
  C<has_insane_linkage> on the tree.
  
  =head2 element_class
  
    $classname = $h->element_class();
  
  This method returns the class which will be used for new elements.  It
  defaults to HTML::Element, but can be overridden by subclassing or esoteric
  means best left to those will will read the source and then not complain when
  those esoteric means change.  (Just subclass.)
  
  =head1 CLASS METHODS
  
  =head2 Use_Weak_Refs
  
    $enabled = HTML::Element->Use_Weak_Refs;
    HTML::Element->Use_Weak_Refs( $enabled );
  
  This method allows you to check whether weak reference support is
  enabled, and to enable or disable it. For details, see L</"Weak References">.
  C<$enabled> is true if weak references are enabled.
  
  You should not switch this in the middle of your program, and you
  probably shouldn't use it at all.  Existing trees are not affected by
  this method (until you start modifying nodes in them).
  
  Throws an exception if you attempt to enable weak references and your
  Perl or Scalar::Util does not support them.
  
  Disabling weak reference support is deprecated.
  
  =head1 SUBROUTINES
  
  =head2 Version
  
  This subroutine is deprecated.  Please use the standard VERSION method
  (e.g. C<< HTML::Element->VERSION >>) instead.
  
  =head2 ABORT OK PRUNE PRUNE_SOFTLY PRUNE_UP
  
  Constants for signalling back to the traverser
  
  =for Pod::Coverage as_text_trimmed
  
  =head1 BUGS
  
  * If you want to free the memory associated with a tree built of
  HTML::Element nodes, and you have disabled weak references, then you
  will have to delete it explicitly using the L</delete> method.
  See L</"Weak References">.
  
  * There's almost nothing to stop you from making a "tree" with
  cyclicities (loops) in it, which could, for example, make the
  traverse method go into an infinite loop.  So don't make
  cyclicities!  (If all you're doing is parsing HTML files,
  and looking at the resulting trees, this will never be a problem
  for you.)
  
  * There's no way to represent comments or processing directives
  in a tree with HTML::Elements.  Not yet, at least.
  
  * There's (currently) nothing to stop you from using an undefined
  value as a text segment.  If you're running under C<perl -w>, however,
  this may make HTML::Element's code produce a slew of warnings.
  
  =head1 NOTES ON SUBCLASSING
  
  You are welcome to derive subclasses from HTML::Element, but you
  should be aware that the code in HTML::Element makes certain
  assumptions about elements (and I'm using "element" to mean ONLY an
  object of class HTML::Element, or of a subclass of HTML::Element):
  
  * The value of an element's _parent attribute must either be undef or
  otherwise false, or must be an element.
  
  * The value of an element's _content attribute must either be undef or
  otherwise false, or a reference to an (unblessed) array.  The array
  may be empty; but if it has items, they must ALL be either mere
  strings (text segments), or elements.
  
  * The value of an element's _tag attribute should, at least, be a
  string of printable characters.
  
  Moreover, bear these rules in mind:
  
  * Do not break encapsulation on objects.  That is, access their
  contents only thru $obj->attr or more specific methods.
  
  * You should think twice before completely overriding any of the
  methods that HTML::Element provides.  (Overriding with a method that
  calls the superclass method is not so bad, though.)
  
  =head1 SEE ALSO
  
  L<HTML::Tree>; L<HTML::TreeBuilder>; L<HTML::AsSubs>; L<HTML::Tagset>;
  and, for the morbidly curious, L<HTML::Element::traverse>.
  
  =head1 ACKNOWLEDGEMENTS
  
  Thanks to Mark-Jason Dominus for a POD suggestion.
  
  =head1 AUTHOR
  
  Current maintainers:
  
  =over
  
  =item * Christopher J. Madsen S<C<< <perl AT cjmweb.net> >>>
  
  =item * Jeff Fearn S<C<< <jfearn AT cpan.org> >>>
  
  =back
  
  Original HTML-Tree author:
  
  =over
  
  =item * Gisle Aas
  
  =back
  
  Former maintainers:
  
  =over
  
  =item * Sean M. Burke
  
  =item * Andy Lester
  
  =item * Pete Krawczyk S<C<< <petek AT cpan.org> >>>
  
  =back
  
  You can follow or contribute to HTML-Tree's development at
  L<< https://github.com/kentfredric/HTML-Tree >>.
  
  =head1 COPYRIGHT AND LICENSE
  
  Copyright 1995-1998 Gisle Aas, 1999-2004 Sean M. Burke,
  2005 Andy Lester, 2006 Pete Krawczyk, 2010 Jeff Fearn,
  2012 Christopher J. Madsen.
  
  This library is free software; you can redistribute it and/or
  modify it under the same terms as Perl itself.
  
  The programs in this library are distributed in the hope that they
  will be useful, but without any warranty; without even the implied
  warranty of merchantability or fitness for a particular purpose.
  
  =cut
HTML_ELEMENT

    $main::fatpacked{"HTML/Element/traverse.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'HTML_ELEMENT_TRAVERSE';
  
  # This is a .pm just to (try to) make some CPAN document converters
  #  convert it happily as part of the dist's documentation tree.
  package HTML::Element::traverse;
  
  # ABSTRACT: discussion of HTML::Element's traverse method
  
  use warnings;
  use strict;
  
  our $VERSION = '5.07'; # VERSION from OurPkgVersion
  
  use HTML::Element ();
  1;
  
  __END__
  
  =pod
  
  =head1 NAME
  
  HTML::Element::traverse - discussion of HTML::Element's traverse method
  
  =head1 VERSION
  
  This document describes version 5.07 of
  HTML::Element::traverse, released August 31, 2017
  as part of L<HTML-Tree|HTML::Tree>.
  
  =head1 SYNOPSIS
  
    # $element->traverse is unnecessary and obscure.
    #   Don't use it in new code.
  
  =head1 DESCRIPTION
  
  C<HTML::Element> provides a method C<traverse> that traverses the tree
  and calls user-specified callbacks for each node, in pre- or
  post-order.  However, use of the method is quite superfluous: if you
  want to recursively visit every node in the tree, it's almost always
  simpler to write a subroutine does just that, than it is to bundle up
  the pre- and/or post-order code in callbacks for the C<traverse>
  method.
  
  =head1 EXAMPLES
  
  Suppose you want to traverse at/under a node $tree and give elements
  an 'id' attribute unless they already have one.
  
  You can use the C<traverse> method:
  
    {
      my $counter = 'x0000';
      $start_node->traverse(
        [ # Callbacks;
          # pre-order callback:
          sub {
            my $x = $_[0];
            $x->attr('id', $counter++) unless defined $x->attr('id');
            return HTML::Element::OK; # keep traversing
          },
          # post-order callback:
          undef
        ],
        1, # don't call the callbacks for text nodes
      );
    }
  
  or you can just be simple and clear (and not have to understand the
  calling format for C<traverse>) by writing a sub that traverses the
  tree by just calling itself:
  
    {
      my $counter = 'x0000';
      sub give_id {
        my $x = $_[0];
        $x->attr('id', $counter++) unless defined $x->attr('id');
        foreach my $c ($x->content_list) {
          give_id($c) if ref $c; # ignore text nodes
        }
      };
      give_id($start_node);
    }
  
  See, isn't that nice and clear?
  
  But, if you really need to know:
  
  =head1 THE TRAVERSE METHOD
  
  The C<traverse()> method is a general object-method for traversing a
  tree or subtree and calling user-specified callbacks.  It accepts the
  following syntaxes:
  
  =over
  
  =item $h->traverse(\&callback)
  
  =item or $h->traverse(\&callback, $ignore_text)
  
  =item or $h->traverse( [\&pre_callback,\&post_callback] , $ignore_text)
  
  =back
  
  These all mean to traverse the element and all of its children.  That
  is, this method starts at node $h, "pre-order visits" $h, traverses its
  children, and then will "post-order visit" $h.  "Visiting" means that
  the callback routine is called, with these arguments:
  
      $_[0] : the node (element or text segment),
      $_[1] : a startflag, and
      $_[2] : the depth
  
  If the $ignore_text parameter is given and true, then the pre-order
  call I<will not> be happen for text content.
  
  The startflag is 1 when we enter a node (i.e., in pre-order calls) and
  0 when we leave the node (in post-order calls).
  
  Note, however, that post-order calls don't happen for nodes that are
  text segments or are elements that are prototypically empty (like "br",
  "hr", etc.).
  
  If we visit text nodes (i.e., unless $ignore_text is given and true),
  then when text nodes are visited, we will also pass two extra
  arguments to the callback:
  
      $_[3] : the element that's the parent
               of this text node
      $_[4] : the index of this text node
               in its parent's content list
  
  Note that you can specify that the pre-order routine can
  be a different routine from the post-order one:
  
      $h->traverse( [\&pre_callback,\&post_callback], ...);
  
  You can also specify that no post-order calls are to be made,
  by providing a false value as the post-order routine:
  
      $h->traverse([ \&pre_callback,0 ], ...);
  
  And similarly for suppressing pre-order callbacks:
  
      $h->traverse([ 0,\&post_callback ], ...);
  
  Note that these two syntaxes specify the same operation:
  
      $h->traverse([\&foo,\&foo], ...);
      $h->traverse( \&foo       , ...);
  
  The return values from calls to your pre- or post-order
  routines are significant, and are used to control recursion
  into the tree.
  
  These are the values you can return, listed in descending order
  of my estimation of their usefulness:
  
  =over
  
  =item HTML::Element::OK, 1, or any other true value
  
  ...to keep on traversing.
  
  Note that C<HTML::Element::OK> et
  al are constants.  So if you're running under C<use strict>
  (as I hope you are), and you say:
  C<return HTML::Element::PRUEN>
  the compiler will flag this as an error (an unallowable
  bareword, specifically), whereas if you spell PRUNE correctly,
  the compiler will not complain.
  
  =item undef, 0, '0', '', or HTML::Element::PRUNE
  
  ...to block traversing under the current element's content.
  (This is ignored if received from a post-order callback,
  since by then the recursion has already happened.)
  If this is returned by a pre-order callback, no
  post-order callback for the current node will happen.
  (Recall that if your callback exits with just C<return;>,
  it is returning undef -- at least in scalar context, and
  C<traverse> always calls your callbacks in scalar context.)
  
  =item HTML::Element::ABORT
  
  ...to abort the whole traversal immediately.
  This is often useful when you're looking for just the first
  node in the tree that meets some criterion of yours.
  
  =item HTML::Element::PRUNE_UP
  
  ...to abort continued traversal into this node and its parent
  node.  No post-order callback for the current or parent
  node will happen.
  
  =item HTML::Element::PRUNE_SOFTLY
  
  Like PRUNE, except that the post-order call for the current
  node is not blocked.
  
  =back
  
  Almost every task to do with extracting information from a tree can be
  expressed in terms of traverse operations (usually in only one pass,
  and usually paying attention to only pre-order, or to only
  post-order), or operations based on traversing. (In fact, many of the
  other methods in this class are basically calls to traverse() with
  particular arguments.)
  
  The source code for HTML::Element and HTML::TreeBuilder contain
  several examples of the use of the "traverse" method to gather
  information about the content of trees and subtrees.
  
  (Note: you should not change the structure of a tree I<while> you are
  traversing it.)
  
  [End of documentation for the C<traverse()> method]
  
  =head2 Traversing with Recursive Anonymous Routines
  
  Now, if you've been reading
  I<Structure and Interpretation of Computer Programs> too much, maybe
  you even want a recursive lambda.  Go ahead:
  
    {
      my $counter = 'x0000';
      my $give_id;
      $give_id = sub {
        my $x = $_[0];
        $x->attr('id', $counter++) unless defined $x->attr('id');
        foreach my $c ($x->content_list) {
          $give_id->($c) if ref $c; # ignore text nodes
        }
      };
      $give_id->($start_node);
      undef $give_id;
    }
  
  It's a bit nutty, and it's I<still> more concise than a call to the
  C<traverse> method!
  
  It is left as an exercise to the reader to figure out how to do the
  same thing without using a C<$give_id> symbol at all.
  
  It is also left as an exercise to the reader to figure out why I
  undefine C<$give_id>, above; and why I could achieved the same effect
  with any of:
  
      $give_id = 'I like pie!';
     # or...
      $give_id = [];
     # or even;
      $give_id = sub { print "Mmmm pie!\n" };
  
  But not:
  
      $give_id = sub { print "I'm $give_id and I like pie!\n" };
     # nor...
      $give_id = \$give_id;
     # nor...
      $give_id = { 'pie' => \$give_id, 'mode' => 'a la' };
  
  =head2 Doing Recursive Things Iteratively
  
  Note that you may at times see an iterative implementation of
  pre-order traversal, like so:
  
     {
       my @to_do = ($tree); # start-node
       while(@to_do) {
         my $this = shift @to_do;
  
         # "Visit" the node:
         $this->attr('id', $counter++)
          unless defined $this->attr('id');
  
         unshift @to_do, grep ref $_, $this->content_list;
          # Put children on the stack -- they'll be visited next
       }
     }
  
  This can I<under certain circumstances> be more efficient than just a
  normal recursive routine, but at the cost of being rather obscure.  It
  gains efficiency by avoiding the overhead of function-calling, but
  since there are several method dispatches however you do it (to
  C<attr> and C<content_list>), the overhead for a simple function call
  is insignificant.
  
  =head2 Pruning and Whatnot
  
  The C<traverse> method does have the fairly neat features of
  the C<ABORT>, C<PRUNE_UP> and C<PRUNE_SOFTLY> signals.  None of these
  can be implemented I<totally> straightforwardly with recursive
  routines, but it is quite possible.  C<ABORT>-like behavior can be
  implemented either with using non-local returning with C<eval>/C<die>:
  
    my $died_on; # if you need to know where...
    sub thing {
      ... visits $_[0]...
      ... maybe set $died_on to $_[0] and die "ABORT_TRAV" ...
      ... else call thing($child) for each child...
      ...any post-order visiting $_[0]...
    }
    eval { thing($node) };
    if($@) {
      if($@ =~ m<^ABORT_TRAV>) {
        ...it died (aborted) on $died_on...
      } else {
        die $@; # some REAL error happened
      }
    }
  
  or you can just do it with flags:
  
    my($abort_flag, $died_on);
    sub thing {
      ... visits $_[0]...
      ... maybe set $abort_flag = 1; $died_on = $_[0]; return;
      foreach my $c ($_[0]->content_list) {
        thing($c);
        return if $abort_flag;
      }
      ...any post-order visiting $_[0]...
      return;
    }
  
    $abort_flag = $died_on = undef;
    thing($node);
    ...if defined $abort_flag, it died on $died_on
  
  =head1 SEE ALSO
  
  L<HTML::Element>
  
  =head1 AUTHOR
  
  Current maintainers:
  
  =over
  
  =item * Christopher J. Madsen S<C<< <perl AT cjmweb.net> >>>
  
  =item * Jeff Fearn S<C<< <jfearn AT cpan.org> >>>
  
  =back
  
  Original HTML-Tree author:
  
  =over
  
  =item * Gisle Aas
  
  =back
  
  Former maintainers:
  
  =over
  
  =item * Sean M. Burke
  
  =item * Andy Lester
  
  =item * Pete Krawczyk S<C<< <petek AT cpan.org> >>>
  
  =back
  
  You can follow or contribute to HTML-Tree's development at
  L<< https://github.com/kentfredric/HTML-Tree >>.
  
  =head1 COPYRIGHT
  
  Copyright 2000,2001 Sean M. Burke
  
  =cut
HTML_ELEMENT_TRAVERSE

    $main::fatpacked{"HTML/Form.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'HTML_FORM';
  package HTML::Form;
  
  use strict;
  use URI;
  use Carp ();
  use Encode ();
  
  use vars qw($VERSION);
  our $VERSION = '6.04';
  
  my %form_tags = map {$_ => 1} qw(input textarea button select option);
  
  my %type2class = (
   text     => "TextInput",
   password => "TextInput",
   hidden   => "TextInput",
   textarea => "TextInput",
  
   "reset"  => "IgnoreInput",
  
   radio    => "ListInput",
   checkbox => "ListInput",
   option   => "ListInput",
  
   button   => "SubmitInput",
   submit   => "SubmitInput",
   image    => "ImageInput",
   file     => "FileInput",
  
   keygen   => "KeygenInput",
  );
  
  # The new HTML5 input types
  %type2class = (%type2class, map { $_ => 'TextInput' } qw(
      tel search url email
      datetime date month week time datetime-local
      number range color
  ));
  
  =head1 NAME
  
  HTML::Form - Class that represents an HTML form element
  
  =head1 SYNOPSIS
  
   use HTML::Form;
   $form = HTML::Form->parse($html, $base_uri);
   $form->value(query => "Perl");
  
   use LWP::UserAgent;
   $ua = LWP::UserAgent->new;
   $response = $ua->request($form->click);
  
  =head1 DESCRIPTION
  
  Objects of the C<HTML::Form> class represents a single HTML
  C<E<lt>formE<gt> ... E<lt>/formE<gt>> instance.  A form consists of a
  sequence of inputs that usually have names, and which can take on
  various values.  The state of a form can be tweaked and it can then be
  asked to provide C<HTTP::Request> objects that can be passed to the
  request() method of C<LWP::UserAgent>.
  
  The following methods are available:
  
  =over 4
  
  =item @forms = HTML::Form->parse( $html_document, $base_uri )
  
  =item @forms = HTML::Form->parse( $html_document, base => $base_uri, %opt )
  
  =item @forms = HTML::Form->parse( $response, %opt )
  
  The parse() class method will parse an HTML document and build up
  C<HTML::Form> objects for each <form> element found.  If called in scalar
  context only returns the first <form>.  Returns an empty list if there
  are no forms to be found.
  
  The required arguments is the HTML document to parse ($html_document) and the
  URI used to retrieve the document ($base_uri).  The base URI is needed to resolve
  relative action URIs.  The provided HTML document should be a Unicode string
  (or US-ASCII).
  
  By default HTML::Form assumes that the original document was UTF-8 encoded and
  thus encode forms that don't specify an explicit I<accept-charset> as UTF-8.
  The charset assumed can be overridden by providing the C<charset> option to
  parse().  It's a good idea to be explicit about this parameter as well, thus
  the recommended simplest invocation becomes:
  
      my @forms = HTML::Form->parse(
          Encode::decode($encoding, $html_document_bytes),
          base => $base_uri,
  	charset => $encoding,
      );
  
  If the document was retrieved with LWP then the response object provide methods
  to obtain a proper value for C<base> and C<charset>:
  
      my $ua = LWP::UserAgent->new;
      my $response = $ua->get("http://www.example.com/form.html");
      my @forms = HTML::Form->parse($response->decoded_content,
  	base => $response->base,
  	charset => $response->content_charset,
      );
  
  In fact, the parse() method can parse from an C<HTTP::Response> object
  directly, so the example above can be more conveniently written as:
  
      my $ua = LWP::UserAgent->new;
      my $response = $ua->get("http://www.example.com/form.html");
      my @forms = HTML::Form->parse($response);
  
  Note that any object that implements a decoded_content(), base() and
  content_charset() method with similar behaviour as C<HTTP::Response> will do.
  
  Additional options might be passed in to control how the parse method
  behaves.  The following are all the options currently recognized:
  
  =over
  
  =item C<< base => $uri >>
  
  This is the URI used to retrieve the original document.  This option is not optional ;-)
  
  =item C<< charset => $str >>
  
  Specify what charset the original document was encoded in.  This is used as
  the default for accept_charset.  If not provided this defaults to "UTF-8".
  
  =item C<< verbose => $bool >>
  
  Warn (print messages to STDERR) about any bad HTML form constructs found.
  You can trap these with $SIG{__WARN__}.  The default is not to issue warnings.
  
  =item C<< strict => $bool >>
  
  Initialize any form objects with the given strict attribute.
  If the strict is turned on the methods that change values of the form will croak if you try
  to set illegal values or modify readonly fields.
  The default is not to be strict.
  
  =back
  
  =cut
  
  sub parse
  {
      my $class = shift;
      my $html = shift;
      unshift(@_, "base") if @_ == 1;
      my %opt = @_;
  
      require HTML::TokeParser;
      my $p = HTML::TokeParser->new(ref($html) ? $html->decoded_content(ref => 1) : \$html);
      die "Failed to create HTML::TokeParser object" unless $p;
  
      my $base_uri = delete $opt{base};
      my $charset = delete $opt{charset};
      my $strict = delete $opt{strict};
      my $verbose = delete $opt{verbose};
  
      if ($^W) {
  	Carp::carp("Unrecognized option $_ in HTML::Form->parse") for sort keys %opt;
      }
  
      unless (defined $base_uri) {
  	if (ref($html)) {
  	    $base_uri = $html->base;
  	}
  	else {
  	    Carp::croak("HTML::Form::parse: No \$base_uri provided");
  	}
      }
      unless (defined $charset) {
  	if (ref($html) and $html->can("content_charset")) {
  	    $charset = $html->content_charset;
  	}
  	unless ($charset) {
  	    $charset = "UTF-8";
  	}
      }
  
      my @forms;
      my $f;  # current form
  
      my %openselect; # index to the open instance of a select
  
      while (my $t = $p->get_tag) {
  	my($tag,$attr) = @$t;
  	if ($tag eq "form") {
  	    my $action = delete $attr->{'action'};
  	    $action = "" unless defined $action;
  	    $action = URI->new_abs($action, $base_uri);
  	    $f = $class->new($attr->{'method'},
  			     $action,
  			     $attr->{'enctype'});
              $f->accept_charset($attr->{'accept-charset'}) if $attr->{'accept-charset'};
  	    $f->{default_charset} = $charset;
  	    $f->{attr} = $attr;
  	    $f->strict(1) if $strict;
              %openselect = ();
  	    push(@forms, $f);
  	    my(%labels, $current_label);
  	    while (my $t = $p->get_tag) {
  		my($tag, $attr) = @$t;
  		last if $tag eq "/form";
  
  		if ($tag ne 'textarea') {
  		    # if we are inside a label tag, then keep
  		    # appending any text to the current label
  		    if(defined $current_label) {
  		        $current_label = join " ",
  		            grep { defined and length }
  		            $current_label,
  		            $p->get_phrase;
  		    }
  		}
  
  		if ($tag eq "input") {
  		    $attr->{value_name} =
  		        exists $attr->{id} && exists $labels{$attr->{id}} ? $labels{$attr->{id}} :
  			defined $current_label                            ?  $current_label      :
  		        $p->get_phrase;
  		}
  
  		if ($tag eq "label") {
  		    $current_label = $p->get_phrase;
  		    $labels{ $attr->{for} } = $current_label
  		        if exists $attr->{for};
  		}
  		elsif ($tag eq "/label") {
  		    $current_label = undef;
  		}
  		elsif ($tag eq "input") {
  		    my $type = delete $attr->{type} || "text";
  		    $f->push_input($type, $attr, $verbose);
  		}
                  elsif ($tag eq "button") {
                      my $type = delete $attr->{type} || "submit";
                      $f->push_input($type, $attr, $verbose);
                  }
  		elsif ($tag eq "textarea") {
  		    $attr->{textarea_value} = $attr->{value}
  		        if exists $attr->{value};
  		    my $text = $p->get_text("/textarea");
  		    $attr->{value} = $text;
  		    $f->push_input("textarea", $attr, $verbose);
  		}
  		elsif ($tag eq "select") {
  		    # rename attributes reserved to come for the option tag
  		    for ("value", "value_name") {
  			$attr->{"select_$_"} = delete $attr->{$_}
  			    if exists $attr->{$_};
  		    }
  		    # count this new select option separately
  		    my $name = $attr->{name};
  		    $name = "" unless defined $name;
  		    $openselect{$name}++;
  
  		    while ($t = $p->get_tag) {
  			my $tag = shift @$t;
  			last if $tag eq "/select";
  			next if $tag =~ m,/?optgroup,;
  			next if $tag eq "/option";
  			if ($tag eq "option") {
  			    my %a = %{$t->[0]};
  			    # rename keys so they don't clash with %attr
  			    for (keys %a) {
  				next if $_ eq "value";
  				$a{"option_$_"} = delete $a{$_};
  			    }
  			    while (my($k,$v) = each %$attr) {
  				$a{$k} = $v;
  			    }
  			    $a{value_name} = $p->get_trimmed_text;
  			    $a{value} = delete $a{value_name}
  				unless defined $a{value};
  			    $a{idx} = $openselect{$name};
  			    $f->push_input("option", \%a, $verbose);
  			}
  			else {
  			    warn("Bad <select> tag '$tag' in $base_uri\n") if $verbose;
  			    if ($tag eq "/form" ||
  				$tag eq "input" ||
  				$tag eq "textarea" ||
  				$tag eq "select" ||
  				$tag eq "keygen")
  			    {
  				# MSIE implicitly terminates the <select> here, so we
  				# try to do the same.  Actually the MSIE behaviour
  				# appears really strange:  <input> and <textarea>
  				# do implicitly close, but not <select>, <keygen> or
  				# </form>.
  				my $type = ($tag =~ s,^/,,) ? "E" : "S";
  				$p->unget_token([$type, $tag, @$t]);
  				last;
  			    }
  			}
  		    }
  		}
  		elsif ($tag eq "keygen") {
  		    $f->push_input("keygen", $attr, $verbose);
  		}
  	    }
  	}
  	elsif ($form_tags{$tag}) {
  	    warn("<$tag> outside <form> in $base_uri\n") if $verbose;
  	}
      }
      for (@forms) {
  	$_->fixup;
      }
  
      wantarray ? @forms : $forms[0];
  }
  
  sub new {
      my $class = shift;
      my $self = bless {}, $class;
      $self->{method} = uc(shift  || "GET");
      $self->{action} = shift  || Carp::croak("No action defined");
      $self->{enctype} = lc(shift || "application/x-www-form-urlencoded");
      $self->{accept_charset} = "UNKNOWN";
      $self->{default_charset} = "UTF-8";
      $self->{inputs} = [@_];
      $self;
  }
  
  
  sub push_input
  {
      my($self, $type, $attr, $verbose) = @_;
      $type = lc $type;
      my $class = $type2class{$type};
      unless ($class) {
  	Carp::carp("Unknown input type '$type'") if $verbose;
  	$class = "TextInput";
      }
      $class = "HTML::Form::$class";
      my @extra;
      push(@extra, readonly => 1) if $type eq "hidden";
      push(@extra, strict => 1) if $self->{strict};
      if ($type eq "file" && exists $attr->{value}) {
  	# it's not safe to trust the value set by the server
  	# the user always needs to explicitly set the names of files to upload
  	$attr->{orig_value} = delete $attr->{value};
      }
      delete $attr->{type}; # don't confuse the type argument
      my $input = $class->new(type => $type, %$attr, @extra);
      $input->add_to_form($self);
  }
  
  
  =item $method = $form->method
  
  =item $form->method( $new_method )
  
  This method is gets/sets the I<method> name used for the
  C<HTTP::Request> generated.  It is a string like "GET" or "POST".
  
  =item $action = $form->action
  
  =item $form->action( $new_action )
  
  This method gets/sets the URI which we want to apply the request
  I<method> to.
  
  =item $enctype = $form->enctype
  
  =item $form->enctype( $new_enctype )
  
  This method gets/sets the encoding type for the form data.  It is a
  string like "application/x-www-form-urlencoded" or "multipart/form-data".
  
  =item $accept = $form->accept_charset
  
  =item $form->accept_charset( $new_accept )
  
  This method gets/sets the list of charset encodings that the server processing
  the form accepts. Current implementation supports only one-element lists.
  Default value is "UNKNOWN" which we interpret as a request to use document
  charset as specified by the 'charset' parameter of the parse() method.
  
  =cut
  
  BEGIN {
      # Set up some accessors
      for (qw(method action enctype accept_charset)) {
  	my $m = $_;
  	no strict 'refs';
  	*{$m} = sub {
  	    my $self = shift;
  	    my $old = $self->{$m};
  	    $self->{$m} = shift if @_;
  	    $old;
  	};
      }
      *uri = \&action;  # alias
  }
  
  =item $value = $form->attr( $name )
  
  =item $form->attr( $name, $new_value )
  
  This method give access to the original HTML attributes of the <form> tag.
  The $name should always be passed in lower case.
  
  Example:
  
     @f = HTML::Form->parse( $html, $foo );
     @f = grep $_->attr("id") eq "foo", @f;
     die "No form named 'foo' found" unless @f;
     $foo = shift @f;
  
  =cut
  
  sub attr {
      my $self = shift;
      my $name = shift;
      return undef unless defined $name;
  
      my $old = $self->{attr}{$name};
      $self->{attr}{$name} = shift if @_;
      return $old;
  }
  
  =item $bool = $form->strict
  
  =item $form->strict( $bool )
  
  Gets/sets the strict attribute of a form.  If the strict is turned on
  the methods that change values of the form will croak if you try to
  set illegal values or modify readonly fields.  The default is not to be strict.
  
  =cut
  
  sub strict {
      my $self = shift;
      my $old = $self->{strict};
      if (@_) {
  	$self->{strict} = shift;
  	for my $input (@{$self->{inputs}}) {
  	    $input->strict($self->{strict});
  	}
      }
      return $old;
  }
  
  
  =item @inputs = $form->inputs
  
  This method returns the list of inputs in the form.  If called in
  scalar context it returns the number of inputs contained in the form.
  See L</INPUTS> for what methods are available for the input objects
  returned.
  
  =cut
  
  sub inputs
  {
      my $self = shift;
      @{$self->{'inputs'}};
  }
  
  
  =item $input = $form->find_input( $selector )
  
  =item $input = $form->find_input( $selector, $type )
  
  =item $input = $form->find_input( $selector, $type, $index )
  
  This method is used to locate specific inputs within the form.  All
  inputs that match the arguments given are returned.  In scalar context
  only the first is returned, or C<undef> if none match.
  
  If $selector is not C<undef>, then the input's name, id, class attribute must
  match.  A selector prefixed with '#' must match the id attribute of the input.
  A selector prefixed with '.' matches the class attribute.  A selector prefixed
  with '^' or with no prefix matches the name attribute.
  
  If $type is not C<undef>, then the input must have the specified type.
  The following type names are used: "text", "password", "hidden",
  "textarea", "file", "image", "submit", "radio", "checkbox" and "option".
  
  The $index is the sequence number of the input matched where 1 is the
  first.  If combined with $name and/or $type, then it selects the I<n>th
  input with the given name and/or type.
  
  =cut
  
  sub find_input
  {
      my($self, $name, $type, $no) = @_;
      if (wantarray) {
  	my @res;
  	my $c;
  	for (@{$self->{'inputs'}}) {
  	    next if defined($name) && !$_->selected($name);
  	    next if $type && $type ne $_->{type};
  	    $c++;
  	    next if $no && $no != $c;
  	    push(@res, $_);
  	}
  	return @res;
  
      }
      else {
  	$no ||= 1;
  	for (@{$self->{'inputs'}}) {
  	    next if defined($name) && !$_->selected($name);
  	    next if $type && $type ne $_->{type};
  	    next if --$no;
  	    return $_;
  	}
  	return undef;
      }
  }
  
  sub fixup
  {
      my $self = shift;
      for (@{$self->{'inputs'}}) {
  	$_->fixup;
      }
  }
  
  
  =item $value = $form->value( $selector )
  
  =item $form->value( $selector, $new_value )
  
  The value() method can be used to get/set the value of some input.  If
  strict is enabled and no input has the indicated name, then this method will croak.
  
  If multiple inputs have the same name, only the first one will be
  affected.
  
  The call:
  
      $form->value('foo')
  
  is basically a short-hand for:
  
      $form->find_input('foo')->value;
  
  =cut
  
  sub value
  {
      my $self = shift;
      my $key  = shift;
      my $input = $self->find_input($key);
      unless ($input) {
  	Carp::croak("No such field '$key'") if $self->{strict};
  	return undef unless @_;
  	$input = $self->push_input("text", { name => $key, value => "" });
      }
      local $Carp::CarpLevel = 1;
      $input->value(@_);
  }
  
  =item @names = $form->param
  
  =item @values = $form->param( $name )
  
  =item $form->param( $name, $value, ... )
  
  =item $form->param( $name, \@values )
  
  Alternative interface to examining and setting the values of the form.
  
  If called without arguments then it returns the names of all the
  inputs in the form.  The names will not repeat even if multiple inputs
  have the same name.  In scalar context the number of different names
  is returned.
  
  If called with a single argument then it returns the value or values
  of inputs with the given name.  If called in scalar context only the
  first value is returned.  If no input exists with the given name, then
  C<undef> is returned.
  
  If called with 2 or more arguments then it will set values of the
  named inputs.  This form will croak if no inputs have the given name
  or if any of the values provided does not fit.  Values can also be
  provided as a reference to an array.  This form will allow unsetting
  all values with the given name as well.
  
  This interface resembles that of the param() function of the CGI
  module.
  
  =cut
  
  sub param {
      my $self = shift;
      if (@_) {
          my $name = shift;
          my @inputs;
          for ($self->inputs) {
              my $n = $_->name;
              next if !defined($n) || $n ne $name;
              push(@inputs, $_);
          }
  
          if (@_) {
              # set
              die "No '$name' parameter exists" unless @inputs;
  	    my @v = @_;
  	    @v = @{$v[0]} if @v == 1 && ref($v[0]);
              while (@v) {
                  my $v = shift @v;
                  my $err;
                  for my $i (0 .. @inputs-1) {
                      eval {
                          $inputs[$i]->value($v);
                      };
                      unless ($@) {
                          undef($err);
                          splice(@inputs, $i, 1);
                          last;
                      }
                      $err ||= $@;
                  }
                  die $err if $err;
              }
  
  	    # the rest of the input should be cleared
  	    for (@inputs) {
  		$_->value(undef);
  	    }
          }
          else {
              # get
              my @v;
              for (@inputs) {
  		if (defined(my $v = $_->value)) {
  		    push(@v, $v);
  		}
              }
              return wantarray ? @v : $v[0];
          }
      }
      else {
          # list parameter names
          my @n;
          my %seen;
          for ($self->inputs) {
              my $n = $_->name;
              next if !defined($n) || $seen{$n}++;
              push(@n, $n);
          }
          return @n;
      }
  }
  
  
  =item $form->try_others( \&callback )
  
  This method will iterate over all permutations of unvisited enumerated
  values (<select>, <radio>, <checkbox>) and invoke the callback for
  each.  The callback is passed the $form as argument.  The return value
  from the callback is ignored and the try_others() method itself does
  not return anything.
  
  =cut
  
  sub try_others
  {
      my($self, $cb) = @_;
      my @try;
      for (@{$self->{'inputs'}}) {
  	my @not_tried_yet = $_->other_possible_values;
  	next unless @not_tried_yet;
  	push(@try, [\@not_tried_yet, $_]);
      }
      return unless @try;
      $self->_try($cb, \@try, 0);
  }
  
  sub _try
  {
      my($self, $cb, $try, $i) = @_;
      for (@{$try->[$i][0]}) {
  	$try->[$i][1]->value($_);
  	&$cb($self);
  	$self->_try($cb, $try, $i+1) if $i+1 < @$try;
      }
  }
  
  
  =item $request = $form->make_request
  
  Will return an C<HTTP::Request> object that reflects the current setting
  of the form.  You might want to use the click() method instead.
  
  =cut
  
  sub make_request
  {
      my $self = shift;
      my $method  = uc $self->{'method'};
      my $uri     = $self->{'action'};
      my $enctype = $self->{'enctype'};
      my @form    = $self->form;
  
      my $charset = $self->accept_charset eq "UNKNOWN" ? $self->{default_charset} : $self->accept_charset;
      foreach my $fi (@form) {
  	$fi = Encode::encode($charset, $fi) unless ref($fi);
      }
  
      if ($method eq "GET") {
  	require HTTP::Request;
  	$uri = URI->new($uri, "http");
  	$uri->query_form(@form);
  	return HTTP::Request->new(GET => $uri);
      }
      elsif ($method eq "POST") {
  	require HTTP::Request::Common;
  	return HTTP::Request::Common::POST($uri, \@form,
  					   Content_Type => $enctype);
      }
      else {
  	Carp::croak("Unknown method '$method'");
      }
  }
  
  
  =item $request = $form->click
  
  =item $request = $form->click( $selector )
  
  =item $request = $form->click( $x, $y )
  
  =item $request = $form->click( $selector, $x, $y )
  
  Will "click" on the first clickable input (which will be of type
  C<submit> or C<image>).  The result of clicking is an C<HTTP::Request>
  object that can then be passed to C<LWP::UserAgent> if you want to
  obtain the server response.
  
  If a $selector is specified, we will click on the first clickable input
  matching the selector, and the method will croak if no matching clickable
  input is found.  If $selector is I<not> specified, then it
  is ok if the form contains no clickable inputs.  In this case the
  click() method returns the same request as the make_request() method
  would do.  See description of the find_input() method above for how
  the $selector is specified.
  
  If there are multiple clickable inputs with the same name, then there
  is no way to get the click() method of the C<HTML::Form> to click on
  any but the first.  If you need this you would have to locate the
  input with find_input() and invoke the click() method on the given
  input yourself.
  
  A click coordinate pair can also be provided, but this only makes a
  difference if you clicked on an image.  The default coordinate is
  (1,1).  The upper-left corner of the image is (0,0), but some badly
  coded CGI scripts are known to not recognize this.  Therefore (1,1) was
  selected as a safer default.
  
  =cut
  
  sub click
  {
      my $self = shift;
      my $name;
      $name = shift if (@_ % 2) == 1;  # odd number of arguments
  
      # try to find first submit button to activate
      for (@{$self->{'inputs'}}) {
          next unless $_->can("click");
          next if $name && !$_->selected($name);
  	next if $_->disabled;
  	return $_->click($self, @_);
      }
      Carp::croak("No clickable input with name $name") if $name;
      $self->make_request;
  }
  
  
  =item @kw = $form->form
  
  Returns the current setting as a sequence of key/value pairs.  Note
  that keys might be repeated, which means that some values might be
  lost if the return values are assigned to a hash.
  
  In scalar context this method returns the number of key/value pairs
  generated.
  
  =cut
  
  sub form
  {
      my $self = shift;
      map { $_->form_name_value($self) } @{$self->{'inputs'}};
  }
  
  
  =item $form->dump
  
  Returns a textual representation of current state of the form.  Mainly
  useful for debugging.  If called in void context, then the dump is
  printed on STDERR.
  
  =cut
  
  sub dump
  {
      my $self = shift;
      my $method  = $self->{'method'};
      my $uri     = $self->{'action'};
      my $enctype = $self->{'enctype'};
      my $dump = "$method $uri";
      $dump .= " ($enctype)"
  	if $enctype ne "application/x-www-form-urlencoded";
      $dump .= " [$self->{attr}{name}]"
      	if exists $self->{attr}{name};
      $dump .= "\n";
      for ($self->inputs) {
  	$dump .= "  " . $_->dump . "\n";
      }
      print STDERR $dump unless defined wantarray;
      $dump;
  }
  
  
  #---------------------------------------------------
  package HTML::Form::Input;
  
  =back
  
  =head1 INPUTS
  
  An C<HTML::Form> objects contains a sequence of I<inputs>.  References to
  the inputs can be obtained with the $form->inputs or $form->find_input
  methods.
  
  Note that there is I<not> a one-to-one correspondence between input
  I<objects> and E<lt>inputE<gt> I<elements> in the HTML document.  An
  input object basically represents a name/value pair, so when multiple
  HTML elements contribute to the same name/value pair in the submitted
  form they are combined.
  
  The input elements that are mapped one-to-one are "text", "textarea",
  "password", "hidden", "file", "image", "submit" and "checkbox".  For
  the "radio" and "option" inputs the story is not as simple: All
  E<lt>input type="radio"E<gt> elements with the same name will
  contribute to the same input radio object.  The number of radio input
  objects will be the same as the number of distinct names used for the
  E<lt>input type="radio"E<gt> elements.  For a E<lt>selectE<gt> element
  without the C<multiple> attribute there will be one input object of
  type of "option".  For a E<lt>select multipleE<gt> element there will
  be one input object for each contained E<lt>optionE<gt> element.  Each
  one of these option objects will have the same name.
  
  The following methods are available for the I<input> objects:
  
  =over 4
  
  =cut
  
  sub new
  {
      my $class = shift;
      my $self = bless {@_}, $class;
      $self;
  }
  
  sub add_to_form
  {
      my($self, $form) = @_;
      push(@{$form->{'inputs'}}, $self);
      $self;
  }
  
  sub strict {
      my $self = shift;
      my $old = $self->{strict};
      if (@_) {
  	$self->{strict} = shift;
      }
      $old;
  }
  
  sub fixup {}
  
  
  =item $input->type
  
  Returns the type of this input.  The type is one of the following
  strings: "text", "password", "hidden", "textarea", "file", "image", "submit",
  "radio", "checkbox" or "option".
  
  =cut
  
  sub type
  {
      shift->{type};
  }
  
  =item $name = $input->name
  
  =item $input->name( $new_name )
  
  This method can be used to get/set the current name of the input.
  
  =item $input->id
  
  =item $input->class
  
  These methods can be used to get/set the current id or class attribute for the input.
  
  =item $input->selected( $selector )
  
  Returns TRUE if the given selector matched the input.  See the description of
  the find_input() method above for a description of the selector syntax.
  
  =item $value = $input->value
  
  =item $input->value( $new_value )
  
  This method can be used to get/set the current value of an
  input.
  
  If strict is enabled and the input only can take an enumerated list of values,
  then it is an error to try to set it to something else and the method will
  croak if you try.
  
  You will also be able to set the value of read-only inputs, but a
  warning will be generated if running under C<perl -w>.
  
  =item $autocomplete = $input->autocomplete
  
  =item $input->autocomplete( $new_autocomplete )
  
  This method can be used to get/set the current value (if any) of C<autcomplete> for the input.
  =cut
  
  sub name
  {
      my $self = shift;
      my $old = $self->{name};
      $self->{name} = shift if @_;
      $old;
  }
  
  sub id
  {
      my $self = shift;
      my $old = $self->{id};
      $self->{id} = shift if @_;
      $old;
  }
  
  sub class
  {
      my $self = shift;
      my $old = $self->{class};
      $self->{class} = shift if @_;
      $old;
  }
  
  sub selected {
      my($self, $sel) = @_;
      return undef unless defined $sel;
      my $attr =
          $sel =~ s/^\^// ? "name"  :
          $sel =~ s/^#//  ? "id"    :
          $sel =~ s/^\.// ? "class" :
  	                  "name";
      return 0 unless defined $self->{$attr};
      return $self->{$attr} eq $sel;
  }
  
  sub value
  {
      my $self = shift;
      my $old = $self->{value};
      $self->{value} = shift if @_;
      $old;
  }
  
  sub autocomplete
  {
      my $self = shift;
      my $old = $self->{autocomplete};
      $self->{autocomplete} = shift if @_;
      $old;
  }
  
  =item $input->possible_values
  
  Returns a list of all values that an input can take.  For inputs that
  do not have discrete values, this returns an empty list.
  
  =cut
  
  sub possible_values
  {
      return;
  }
  
  =item $input->other_possible_values
  
  Returns a list of all values not tried yet.
  
  =cut
  
  sub other_possible_values
  {
      return;
  }
  
  =item $input->value_names
  
  For some inputs the values can have names that are different from the
  values themselves.  The number of names returned by this method will
  match the number of values reported by $input->possible_values.
  
  When setting values using the value() method it is also possible to
  use the value names in place of the value itself.
  
  =cut
  
  sub value_names {
      return
  }
  
  =item $bool = $input->readonly
  
  =item $input->readonly( $bool )
  
  This method is used to get/set the value of the readonly attribute.
  You are allowed to modify the value of readonly inputs, but setting
  the value will generate some noise when warnings are enabled.  Hidden
  fields always start out readonly.
  
  =cut
  
  sub readonly {
      my $self = shift;
      my $old = $self->{readonly};
      $self->{readonly} = shift if @_;
      $old;
  }
  
  =item $bool = $input->disabled
  
  =item $input->disabled( $bool )
  
  This method is used to get/set the value of the disabled attribute.
  Disabled inputs do not contribute any key/value pairs for the form
  value.
  
  =cut
  
  sub disabled {
      my $self = shift;
      my $old = $self->{disabled};
      $self->{disabled} = shift if @_;
      $old;
  }
  
  =item $input->form_name_value
  
  Returns a (possible empty) list of key/value pairs that should be
  incorporated in the form value from this input.
  
  =cut
  
  sub form_name_value
  {
      my $self = shift;
      my $name = $self->{'name'};
      return unless defined $name;
      return if $self->disabled;
      my $value = $self->value;
      return unless defined $value;
      return ($name => $value);
  }
  
  sub dump
  {
      my $self = shift;
      my $name = $self->name;
      $name = "<NONAME>" unless defined $name;
      my $value = $self->value;
      $value = "<UNDEF>" unless defined $value;
      my $dump = "$name=$value";
  
      my $type = $self->type;
  
      $type .= " disabled" if $self->disabled;
      $type .= " readonly" if $self->readonly;
      return sprintf "%-30s %s", $dump, "($type)" unless $self->{menu};
  
      my @menu;
      my $i = 0;
      for (@{$self->{menu}}) {
  	my $opt = $_->{value};
  	$opt = "<UNDEF>" unless defined $opt;
  	$opt .= "/$_->{name}"
  	    if defined $_->{name} && length $_->{name} && $_->{name} ne $opt;
  	substr($opt,0,0) = "-" if $_->{disabled};
  	if (exists $self->{current} && $self->{current} == $i) {
  	    substr($opt,0,0) = "!" unless $_->{seen};
  	    substr($opt,0,0) = "*";
  	}
  	else {
  	    substr($opt,0,0) = ":" if $_->{seen};
  	}
  	push(@menu, $opt);
  	$i++;
      }
  
      return sprintf "%-30s %-10s %s", $dump, "($type)", "[" . join("|", @menu) . "]";
  }
  
  
  #---------------------------------------------------
  package HTML::Form::TextInput;
  @HTML::Form::TextInput::ISA=qw(HTML::Form::Input);
  
  #input/text
  #input/password
  #input/hidden
  #textarea
  
  sub value
  {
      my $self = shift;
      my $old = $self->{value};
      $old = "" unless defined $old;
      if (@_) {
          Carp::croak("Input '$self->{name}' is readonly")
  	    if $self->{strict} && $self->{readonly};
          my $new = shift;
          my $n = exists $self->{maxlength} ? $self->{maxlength} : undef;
          Carp::croak("Input '$self->{name}' has maxlength '$n'")
  	    if $self->{strict} && defined($n) && defined($new) && length($new) > $n;
  	$self->{value} = $new;
      }
      $old;
  }
  
  #---------------------------------------------------
  package HTML::Form::IgnoreInput;
  @HTML::Form::IgnoreInput::ISA=qw(HTML::Form::Input);
  
  #input/button
  #input/reset
  
  sub value { return }
  
  
  #---------------------------------------------------
  package HTML::Form::ListInput;
  @HTML::Form::ListInput::ISA=qw(HTML::Form::Input);
  
  #select/option   (val1, val2, ....)
  #input/radio     (undef, val1, val2,...)
  #input/checkbox  (undef, value)
  #select-multiple/option (undef, value)
  
  sub new
  {
      my $class = shift;
      my $self = $class->SUPER::new(@_);
  
      my $value = delete $self->{value};
      my $value_name = delete $self->{value_name};
      my $type = $self->{type};
  
      if ($type eq "checkbox") {
  	$value = "on" unless defined $value;
  	$self->{menu} = [
  	    { value => undef, name => "off", },
              { value => $value, name => $value_name, },
          ];
  	$self->{current} = (delete $self->{checked}) ? 1 : 0;
  	;
      }
      else {
  	$self->{option_disabled}++
  	    if $type eq "radio" && delete $self->{disabled};
  	$self->{menu} = [
              {value => $value, name => $value_name},
          ];
  	my $checked = $self->{checked} || $self->{option_selected};
  	delete $self->{checked};
  	delete $self->{option_selected};
  	if (exists $self->{multiple}) {
  	    unshift(@{$self->{menu}}, { value => undef, name => "off"});
  	    $self->{current} = $checked ? 1 : 0;
  	}
  	else {
  	    $self->{current} = 0 if $checked;
  	}
      }
      $self;
  }
  
  sub add_to_form
  {
      my($self, $form) = @_;
      my $type = $self->type;
  
      return $self->SUPER::add_to_form($form)
  	if $type eq "checkbox";
  
      if ($type eq "option" && exists $self->{multiple}) {
  	$self->{disabled} ||= delete $self->{option_disabled};
  	return $self->SUPER::add_to_form($form);
      }
  
      die "Assert" if @{$self->{menu}} != 1;
      my $m = $self->{menu}[0];
      $m->{disabled}++ if delete $self->{option_disabled};
  
      my $prev = $form->find_input($self->{name}, $self->{type}, $self->{idx});
      return $self->SUPER::add_to_form($form) unless $prev;
  
      # merge menus
      $prev->{current} = @{$prev->{menu}} if exists $self->{current};
      push(@{$prev->{menu}}, $m);
  }
  
  sub fixup
  {
      my $self = shift;
      if ($self->{type} eq "option" && !(exists $self->{current})) {
  	$self->{current} = 0;
      }
      $self->{menu}[$self->{current}]{seen}++ if exists $self->{current};
  }
  
  sub disabled
  {
      my $self = shift;
      my $type = $self->type;
  
      my $old = $self->{disabled} || _menu_all_disabled(@{$self->{menu}});
      if (@_) {
  	my $v = shift;
  	$self->{disabled} = $v;
          for (@{$self->{menu}}) {
              $_->{disabled} = $v;
          }
      }
      return $old;
  }
  
  sub _menu_all_disabled {
      for (@_) {
  	return 0 unless $_->{disabled};
      }
      return 1;
  }
  
  sub value
  {
      my $self = shift;
      my $old;
      $old = $self->{menu}[$self->{current}]{value} if exists $self->{current};
      $old = $self->{value} if exists $self->{value};
      if (@_) {
  	my $i = 0;
  	my $val = shift;
  	my $cur;
  	my $disabled;
  	for (@{$self->{menu}}) {
  	    if ((defined($val) && defined($_->{value}) && $val eq $_->{value}) ||
  		(!defined($val) && !defined($_->{value}))
  	       )
  	    {
  		$cur = $i;
  		$disabled = $_->{disabled};
  		last unless $disabled;
  	    }
  	    $i++;
  	}
  	if (!(defined $cur) || $disabled) {
  	    if (defined $val) {
  		# try to search among the alternative names as well
  		my $i = 0;
  		my $cur_ignorecase;
  		my $lc_val = lc($val);
  		for (@{$self->{menu}}) {
  		    if (defined $_->{name}) {
  			if ($val eq $_->{name}) {
  			    $disabled = $_->{disabled};
  			    $cur = $i;
  			    last unless $disabled;
  			}
  			if (!defined($cur_ignorecase) && $lc_val eq lc($_->{name})) {
  			    $cur_ignorecase = $i;
  			}
  		    }
  		    $i++;
  		}
  		unless (defined $cur) {
  		    $cur = $cur_ignorecase;
  		    if (defined $cur) {
  			$disabled = $self->{menu}[$cur]{disabled};
  		    }
  		    elsif ($self->{strict}) {
  			my $n = $self->name;
  		        Carp::croak("Illegal value '$val' for field '$n'");
  		    }
  		}
  	    }
  	    elsif ($self->{strict}) {
  		my $n = $self->name;
  	        Carp::croak("The '$n' field can't be unchecked");
  	    }
  	}
  	if ($self->{strict} && $disabled) {
  	    my $n = $self->name;
  	    Carp::croak("The value '$val' has been disabled for field '$n'");
  	}
  	if (defined $cur) {
  	    $self->{current} = $cur;
  	    $self->{menu}[$cur]{seen}++;
  	    delete $self->{value};
  	}
  	else {
  	    $self->{value} = $val;
  	    delete $self->{current};
  	}
      }
      $old;
  }
  
  =item $input->check
  
  Some input types represent toggles that can be turned on/off.  This
  includes "checkbox" and "option" inputs.  Calling this method turns
  this input on without having to know the value name.  If the input is
  already on, then nothing happens.
  
  This has the same effect as:
  
      $input->value($input->possible_values[1]);
  
  The input can be turned off with:
  
      $input->value(undef);
  
  =cut
  
  sub check
  {
      my $self = shift;
      $self->{current} = 1;
      $self->{menu}[1]{seen}++;
  }
  
  sub possible_values
  {
      my $self = shift;
      map $_->{value}, grep !$_->{disabled}, @{$self->{menu}};
  }
  
  sub other_possible_values
  {
      my $self = shift;
      map $_->{value}, grep !$_->{seen} && !$_->{disabled}, @{$self->{menu}};
  }
  
  sub value_names {
      my $self = shift;
      my @names;
      for (@{$self->{menu}}) {
  	my $n = $_->{name};
  	$n = $_->{value} unless defined $n;
  	push(@names, $n);
      }
      @names;
  }
  
  
  #---------------------------------------------------
  package HTML::Form::SubmitInput;
  @HTML::Form::SubmitInput::ISA=qw(HTML::Form::Input);
  
  #input/image
  #input/submit
  
  =item $input->click($form, $x, $y)
  
  Some input types (currently "submit" buttons and "images") can be
  clicked to submit the form.  The click() method returns the
  corresponding C<HTTP::Request> object.
  
  =cut
  
  sub click
  {
      my($self,$form,$x,$y) = @_;
      for ($x, $y) { $_ = 1 unless defined; }
      local($self->{clicked}) = [$x,$y];
      return $form->make_request;
  }
  
  sub form_name_value
  {
      my $self = shift;
      return unless $self->{clicked};
      return $self->SUPER::form_name_value(@_);
  }
  
  
  #---------------------------------------------------
  package HTML::Form::ImageInput;
  @HTML::Form::ImageInput::ISA=qw(HTML::Form::SubmitInput);
  
  sub form_name_value
  {
      my $self = shift;
      my $clicked = $self->{clicked};
      return unless $clicked;
      return if $self->{disabled};
      my $name = $self->{name};
      $name = (defined($name) && length($name)) ? "$name." : "";
      return ("${name}x" => $clicked->[0],
  	    "${name}y" => $clicked->[1]
  	   );
  }
  
  #---------------------------------------------------
  package HTML::Form::FileInput;
  @HTML::Form::FileInput::ISA=qw(HTML::Form::TextInput);
  
  =back
  
  If the input is of type C<file>, then it has these additional methods:
  
  =over 4
  
  =item $input->file
  
  This is just an alias for the value() method.  It sets the filename to
  read data from.
  
  For security reasons this field will never be initialized from the parsing
  of a form.  This prevents the server from triggering stealth uploads of
  arbitrary files from the client machine.
  
  =cut
  
  sub file {
      my $self = shift;
      $self->value(@_);
  }
  
  =item $filename = $input->filename
  
  =item $input->filename( $new_filename )
  
  This get/sets the filename reported to the server during file upload.
  This attribute defaults to the value reported by the file() method.
  
  =cut
  
  sub filename {
      my $self = shift;
      my $old = $self->{filename};
      $self->{filename} = shift if @_;
      $old = $self->file unless defined $old;
      $old;
  }
  
  =item $content = $input->content
  
  =item $input->content( $new_content )
  
  This get/sets the file content provided to the server during file
  upload.  This method can be used if you do not want the content to be
  read from an actual file.
  
  =cut
  
  sub content {
      my $self = shift;
      my $old = $self->{content};
      $self->{content} = shift if @_;
      $old;
  }
  
  =item @headers = $input->headers
  
  =item input->headers($key => $value, .... )
  
  This get/set additional header fields describing the file uploaded.
  This can for instance be used to set the C<Content-Type> reported for
  the file.
  
  =cut
  
  sub headers {
      my $self = shift;
      my $old = $self->{headers} || [];
      $self->{headers} = [@_] if @_;
      @$old;
  }
  
  sub form_name_value {
      my($self, $form) = @_;
      return $self->SUPER::form_name_value($form)
  	if $form->method ne "POST" ||
  	   $form->enctype ne "multipart/form-data";
  
      my $name = $self->name;
      return unless defined $name;
      return if $self->{disabled};
  
      my $file = $self->file;
      my $filename = $self->filename;
      my @headers = $self->headers;
      my $content = $self->content;
      if (defined $content) {
  	$filename = $file unless defined $filename;
  	$file = undef;
  	unshift(@headers, "Content" => $content);
      }
      elsif (!defined($file) || length($file) == 0) {
  	return;
      }
  
      # legacy (this used to be the way to do it)
      if (ref($file) eq "ARRAY") {
  	my $f = shift @$file;
  	my $fn = shift @$file;
  	push(@headers, @$file);
  	$file = $f;
  	$filename = $fn unless defined $filename;
      }
  
      return ($name => [$file, $filename, @headers]);
  }
  
  package HTML::Form::KeygenInput;
  @HTML::Form::KeygenInput::ISA=qw(HTML::Form::Input);
  
  sub challenge {
      my $self = shift;
      return $self->{challenge};
  }
  
  sub keytype {
      my $self = shift;
      return lc($self->{keytype} || 'rsa');
  }
  
  1;
  
  __END__
  
  =back
  
  =head1 SEE ALSO
  
  L<LWP>, L<LWP::UserAgent>, L<HTML::Parser>
  
  =head1 COPYRIGHT
  
  Copyright 1998-2008 Gisle Aas.
  
  This library is free software; you can redistribute it and/or
  modify it under the same terms as Perl itself.
  
  =cut
HTML_FORM

    $main::fatpacked{"HTML/Parse.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'HTML_PARSE';
  package HTML::Parse;
  
  use 5.008;
  
  #ABSTRACT: Deprecated, a wrapper around HTML::TreeBuilder
  
  
  use warnings;
  use strict;
  
  our $VERSION = '5.07'; # VERSION from OurPkgVersion
  
  use vars qw(@ISA @EXPORT
      $IMPLICIT_TAGS $IGNORE_UNKNOWN $IGNORE_TEXT $WARN
  );
  
  require Exporter;
  @ISA    = qw(Exporter);
  @EXPORT = qw(parse_html parse_htmlfile);
  
  # Backwards compatability
  $IMPLICIT_TAGS  = 1;
  $IGNORE_UNKNOWN = 1;
  $IGNORE_TEXT    = 0;
  $WARN           = 0;
  
  require HTML::TreeBuilder;
  
  sub parse_html {
      my $p = $_[1];
      $p = _new_tree_maker() unless $p;
      $p->parse( $_[0] );
  }
  
  sub parse_htmlfile {
      my ( $file, $p ) = @_;
      my ($HTML);
      open( $HTML, "<", $file ) or return;
      $p = _new_tree_maker() unless $p;
      $p->parse_file($HTML);
  }
  
  sub _new_tree_maker {
      my $p = HTML::TreeBuilder->new(
          implicit_tags  => $IMPLICIT_TAGS,
          ignore_unknown => $IGNORE_UNKNOWN,
          ignore_text    => $IGNORE_TEXT,
          'warn'         => $WARN,
      );
      $p->strict_comment(1);
      $p;
  }
  
  1;
  
  __END__
  
  =pod
  
  =head1 NAME
  
  HTML::Parse - Deprecated, a wrapper around HTML::TreeBuilder
  
  =head1 VERSION
  
  This document describes version 5.07 of
  HTML::Parse, released August 31, 2017
  as part of L<HTML-Tree|HTML::Tree>.
  
  =head1 SYNOPSIS
  
    See the documentation for HTML::TreeBuilder
  
  =head1 DESCRIPTION
  
  Disclaimer: This module is provided only for backwards compatibility
  with earlier versions of this library.  New code should I<not> use
  this module, and should really use the HTML::Parser and
  HTML::TreeBuilder modules directly, instead.
  
  The C<HTML::Parse> module provides functions to parse HTML documents.
  There are two functions exported by this module:
  
  =over 4
  
  =item parse_html($html) or parse_html($html, $obj)
  
  This function is really just a synonym for $obj->parse($html) and $obj
  is assumed to be a subclass of C<HTML::Parser>.  Refer to
  L<HTML::Parser> for more documentation.
  
  If $obj is not specified, the $obj will default to an internally
  created new C<HTML::TreeBuilder> object configured with strict_comment()
  turned on.  That class implements a parser that builds (and is) a HTML
  syntax tree with HTML::Element objects as nodes.
  
  The return value from parse_html() is $obj.
  
  =item parse_htmlfile($file, [$obj])
  
  Same as parse_html(), but pulls the HTML to parse, from the named file.
  
  Returns C<undef> if the file could not be opened, or $obj otherwise.
  
  =back
  
  When a C<HTML::TreeBuilder> object is created, the following variables
  control how parsing takes place:
  
  =over 4
  
  =item $HTML::Parse::IMPLICIT_TAGS
  
  Setting this variable to true will instruct the parser to try to
  deduce implicit elements and implicit end tags.  If this variable is
  false you get a parse tree that just reflects the text as it stands.
  Might be useful for quick & dirty parsing.  Default is true.
  
  Implicit elements have the implicit() attribute set.
  
  =item $HTML::Parse::IGNORE_UNKNOWN
  
  This variable contols whether unknow tags should be represented as
  elements in the parse tree.  Default is true.
  
  =item $HTML::Parse::IGNORE_TEXT
  
  Do not represent the text content of elements.  This saves space if
  all you want is to examine the structure of the document.  Default is
  false.
  
  =item $HTML::Parse::WARN
  
  Call warn() with an appropriate message for syntax errors.  Default is
  false.
  
  =back
  
  =head1 REMEMBER!
  
  HTML::TreeBuilder objects should be explicitly destroyed when you're
  finished with them.  See L<HTML::TreeBuilder>.
  
  =head1 SEE ALSO
  
  L<HTML::Parser>, L<HTML::TreeBuilder>, L<HTML::Element>
  
  =head1 AUTHOR
  
  Current maintainers:
  
  =over
  
  =item * Christopher J. Madsen S<C<< <perl AT cjmweb.net> >>>
  
  =item * Jeff Fearn S<C<< <jfearn AT cpan.org> >>>
  
  =back
  
  Original HTML-Tree author:
  
  =over
  
  =item * Gisle Aas
  
  =back
  
  Former maintainers:
  
  =over
  
  =item * Sean M. Burke
  
  =item * Andy Lester
  
  =item * Pete Krawczyk S<C<< <petek AT cpan.org> >>>
  
  =back
  
  You can follow or contribute to HTML-Tree's development at
  L<< https://github.com/kentfredric/HTML-Tree >>.
  
  =head1 COPYRIGHT AND LICENSE
  
  Copyright 1995-1998 Gisle Aas, 1999-2004 Sean M. Burke,
  2005 Andy Lester, 2006 Pete Krawczyk, 2010 Jeff Fearn,
  2012 Christopher J. Madsen.
  
  This library is free software; you can redistribute it and/or
  modify it under the same terms as Perl itself.
  
  The programs in this library are distributed in the hope that they
  will be useful, but without any warranty; without even the implied
  warranty of merchantability or fitness for a particular purpose.
  
  =cut
HTML_PARSE

    $main::fatpacked{"HTML/Tree.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'HTML_TREE';
  package HTML::Tree;
  
  # ABSTRACT: build and scan parse-trees of HTML
  
  # HTML::Tree is basically just a happy alias to HTML::TreeBuilder.
  
  use warnings;
  use strict;
  
  our $VERSION = '5.07'; # VERSION from OurPkgVersion
  
  use HTML::TreeBuilder ();
  
  
  sub new {
      shift;
      unshift @_, 'HTML::TreeBuilder';
      goto &HTML::TreeBuilder::new;
  }
  
  sub new_from_file {
      shift;
      unshift @_, 'HTML::TreeBuilder';
      goto &HTML::TreeBuilder::new_from_file;
  }
  
  sub new_from_content {
      shift;
      unshift @_, 'HTML::TreeBuilder';
      goto &HTML::TreeBuilder::new_from_content;
  }
  
  sub new_from_url {
      shift;
      unshift @_, 'HTML::TreeBuilder';
      goto &HTML::TreeBuilder::new_from_url;
  }
  
  1;
  
  __END__
  
  =pod
  
  =head1 NAME
  
  HTML::Tree - build and scan parse-trees of HTML
  
  =head1 VERSION
  
  This document describes version 5.07 of
  HTML::Tree, released August 31, 2017
  as part of L<HTML-Tree|HTML::Tree>.
  
  =head1 SYNOPSIS
  
      use HTML::TreeBuilder;
      my $tree = HTML::TreeBuilder->new();
      $tree->parse_file($filename);
  
          # Then do something with the tree, using HTML::Element
          # methods -- for example:
  
      $tree->dump
  
          # Finally:
  
      $tree->delete;
  
  =head1 DESCRIPTION
  
  HTML-Tree is a suite of Perl modules for making parse trees out of
  HTML source.  It consists of mainly two modules, whose documentation
  you should refer to: L<HTML::TreeBuilder|HTML::TreeBuilder>
  and L<HTML::Element|HTML::Element>.
  
  HTML::TreeBuilder is the module that builds the parse trees.  (It uses
  HTML::Parser to do the work of breaking the HTML up into tokens.)
  
  The tree that TreeBuilder builds for you is made up of objects of the
  class HTML::Element.
  
  If you find that you do not properly understand the documentation
  for HTML::TreeBuilder and HTML::Element, it may be because you are
  unfamiliar with tree-shaped data structures, or with object-oriented
  modules in general. Sean Burke has written some articles for
  I<The Perl Journal> (C<www.tpj.com>) that seek to provide that background.
  The full text of those articles is contained in this distribution, as:
  
  =over 4
  
  =item L<HTML::Tree::AboutObjects|HTML::Tree::AboutObjects>
  
  "User's View of Object-Oriented Modules" from TPJ17.
  
  =item L<HTML::Tree::AboutTrees|HTML::Tree::AboutTrees>
  
  "Trees" from TPJ18
  
  =item L<HTML::Tree::Scanning|HTML::Tree::Scanning>
  
  "Scanning HTML" from TPJ19
  
  =back
  
  Readers already familiar with object-oriented modules and tree-shaped
  data structures should read just the last article.  Readers without
  that background should read the first, then the second, and then the
  third.
  
  =head1 METHODS
  
  All these methods simply redirect to the corresponding method in
  HTML::TreeBuilder.  It's more efficient to use HTML::TreeBuilder
  directly, and skip loading HTML::Tree at all.
  
  =head2 new
  
  Redirects to L<HTML::TreeBuilder/new>.
  
  =head2 new_from_file
  
  Redirects to L<HTML::TreeBuilder/new_from_file>.
  
  =head2 new_from_content
  
  Redirects to L<HTML::TreeBuilder/new_from_content>.
  
  =head2 new_from_url
  
  Redirects to L<HTML::TreeBuilder/new_from_url>.
  
  =head1 SUPPORT
  
  You can find documentation for this module with the perldoc command.
  
      perldoc HTML::Tree
  
      You can also look for information at:
  
  =over 4
  
  =item * AnnoCPAN: Annotated CPAN documentation
  
  L<http://annocpan.org/dist/HTML-Tree>
  
  =item * CPAN Ratings
  
  L<http://cpanratings.perl.org/d/HTML-Tree>
  
  =item * RT: CPAN's request tracker
  
  L<http://rt.cpan.org/NoAuth/Bugs.html?Dist=HTML-Tree>
  
  =item * Search CPAN
  
  L<http://search.cpan.org/dist/HTML-Tree>
  
  =item * Stack Overflow
  
  L<http://stackoverflow.com/questions/tagged/html-tree>
  
  If you have a question about how to use HTML-Tree, Stack Overflow is
  the place to ask it.  Make sure you tag it both C<perl> and C<html-tree>.
  
  =back
  
  =head1 SEE ALSO
  
  L<HTML::TreeBuilder>, L<HTML::Element>, L<HTML::Tagset>,
  L<HTML::Parser>, L<HTML::DOMbo>
  
  The book I<Perl & LWP> by Sean M. Burke published by
  O'Reilly and Associates, 2002.  ISBN: 0-596-00178-9
  
  It has several chapters to do with HTML processing in general,
  and HTML-Tree specifically.  There's more info at:
  
      http://www.oreilly.com/catalog/perllwp/
  
      http://www.amazon.com/exec/obidos/ASIN/0596001789
  
  =head1 SOURCE REPOSITORY
  
  HTML-Tree is now maintained using Git.  The main public repository is
  L<< https://github.com/kentfredric/HTML-Tree >>.
  
  The best way to send a patch is to make a pull request there.
  
  =head1 ACKNOWLEDGEMENTS
  
  Thanks to Gisle Aas, Sean Burke and Andy Lester for their original work.
  
  Thanks to Chicago Perl Mongers (http://chicago.pm.org) for their
  patches submitted to HTML::Tree as part of the Phalanx project
  (http://qa.perl.org/phalanx).
  
  Thanks to the following people for additional patches and documentation:
  Terrence Brannon, Gordon Lack, Chris Madsen and Ricardo Signes.
  
  =head1 AUTHOR
  
  Current maintainers:
  
  =over
  
  =item * Christopher J. Madsen S<C<< <perl AT cjmweb.net> >>>
  
  =item * Jeff Fearn S<C<< <jfearn AT cpan.org> >>>
  
  =back
  
  Original HTML-Tree author:
  
  =over
  
  =item * Gisle Aas
  
  =back
  
  Former maintainers:
  
  =over
  
  =item * Sean M. Burke
  
  =item * Andy Lester
  
  =item * Pete Krawczyk S<C<< <petek AT cpan.org> >>>
  
  =back
  
  You can follow or contribute to HTML-Tree's development at
  L<< https://github.com/kentfredric/HTML-Tree >>.
  
  =head1 COPYRIGHT AND LICENSE
  
  Copyright 1995-1998 Gisle Aas, 1999-2004 Sean M. Burke,
  2005 Andy Lester, 2006 Pete Krawczyk, 2010 Jeff Fearn,
  2012 Christopher J. Madsen.
  (Except the articles contained in HTML::Tree::AboutObjects,
  HTML::Tree::AboutTrees, and HTML::Tree::Scanning, which are all
  copyright 2000 The Perl Journal.)
  
  Except for those three TPJ articles, the whole HTML-Tree distribution,
  of which this file is a part, is free software; you can redistribute
  it and/or modify it under the same terms as Perl itself.
  
  Those three TPJ articles may be distributed under the same terms as
  Perl itself.
  
  The programs in this library are distributed in the hope that they
  will be useful, but without any warranty; without even the implied
  warranty of merchantability or fitness for a particular purpose.
  
  =cut
HTML_TREE

    $main::fatpacked{"HTML/TreeBuilder.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'HTML_TREEBUILDER';
  package HTML::TreeBuilder;
  
  # ABSTRACT: Parser that builds a HTML syntax tree
  
  use warnings;
  use strict;
  use integer;    # vroom vroom!
  use Carp ();
  
  our $VERSION = '5.07'; # VERSION from OurPkgVersion
  
  #---------------------------------------------------------------------------
  # Make a 'DEBUG' constant...
  
  our $DEBUG; # Must be set BEFORE loading this file
  BEGIN {
  
      # We used to have things like
      #  print $indent, "lalala" if $Debug;
      # But there were an awful lot of having to evaluate $Debug's value.
      # If we make that depend on a constant, like so:
      #   sub DEBUG () { 1 } # or whatever value.
      #   ...
      #   print $indent, "lalala" if DEBUG;
      # Which at compile-time (thru the miracle of constant folding) turns into:
      #   print $indent, "lalala";
      # or, if DEBUG is a constant with a true value, then that print statement
      # is simply optimized away, and doesn't appear in the target code at all.
      # If you don't believe me, run:
      #    perl -MO=Deparse,-uHTML::TreeBuilder -e 'BEGIN { \
      #      $HTML::TreeBuilder::DEBUG = 4}  use HTML::TreeBuilder'
      # and see for yourself (substituting whatever value you want for $DEBUG
      # there).
  ## no critic
      if ( defined &DEBUG ) {
  
          # Already been defined!  Do nothing.
      }
      elsif ( $] < 5.00404 ) {
  
          # Grudgingly accomodate ancient (pre-constant) versions.
          eval 'sub DEBUG { $Debug } ';
      }
      elsif ( !$DEBUG ) {
          eval 'sub DEBUG () {0}';    # Make it a constant.
      }
      elsif ( $DEBUG =~ m<^\d+$>s ) {
          eval 'sub DEBUG () { ' . $DEBUG . ' }';    # Make THAT a constant.
      }
      else {                                         # WTF?
          warn "Non-numeric value \"$DEBUG\" in \$HTML::Element::DEBUG";
          eval 'sub DEBUG () { $DEBUG }';            # I guess.
      }
  ## use critic
  }
  
  #---------------------------------------------------------------------------
  
  use HTML::Entities ();
  use HTML::Tagset 3.02 ();
  
  use HTML::Element ();
  use HTML::Parser 3.46 ();
  our @ISA = qw(HTML::Element HTML::Parser);
  
  # This looks schizoid, I know.
  # It's not that we ARE an element AND a parser.
  # We ARE an element, but one that knows how to handle signals
  #  (method calls) from Parser in order to elaborate its subtree.
  
  # Legacy aliases:
  *HTML::TreeBuilder::isKnown             = \%HTML::Tagset::isKnown;
  *HTML::TreeBuilder::canTighten          = \%HTML::Tagset::canTighten;
  *HTML::TreeBuilder::isHeadElement       = \%HTML::Tagset::isHeadElement;
  *HTML::TreeBuilder::isBodyElement       = \%HTML::Tagset::isBodyElement;
  *HTML::TreeBuilder::isPhraseMarkup      = \%HTML::Tagset::isPhraseMarkup;
  *HTML::TreeBuilder::isHeadOrBodyElement = \%HTML::Tagset::isHeadOrBodyElement;
  *HTML::TreeBuilder::isList              = \%HTML::Tagset::isList;
  *HTML::TreeBuilder::isTableElement      = \%HTML::Tagset::isTableElement;
  *HTML::TreeBuilder::isFormElement       = \%HTML::Tagset::isFormElement;
  *HTML::TreeBuilder::p_closure_barriers  = \@HTML::Tagset::p_closure_barriers;
  
  #==========================================================================
  # Two little shortcut constructors:
  
  sub new_from_file {    # or from a FH
      my $class = shift;
      Carp::croak("new_from_file takes only one argument")
          unless @_ == 1;
      Carp::croak("new_from_file is a class method only")
          if ref $class;
      my $new = $class->new();
      defined $new->parse_file( $_[0] )
          or Carp::croak("unable to parse file: $!");
      return $new;
  }
  
  sub new_from_content {    # from any number of scalars
      my $class = shift;
      Carp::croak("new_from_content is a class method only")
          if ref $class;
      my $new = $class->new();
      foreach my $whunk (@_) {
          if ( ref($whunk) eq 'SCALAR' ) {
              $new->parse($$whunk);
          }
          else {
              $new->parse($whunk);
          }
          last if $new->{'_stunted'};    # might as well check that.
      }
      $new->eof();
      return $new;
  }
  
  sub new_from_url {                     # should accept anything that LWP does.
      undef our $lwp_response;
      my $class = shift;
      Carp::croak("new_from_url takes only one argument")
          unless @_ == 1;
      Carp::croak("new_from_url is a class method only")
          if ref $class;
      my $url = shift;
      my $new = $class->new();
  
      require LWP::UserAgent;
      # RECOMMEND PREREQ: LWP::UserAgent 5.815
      LWP::UserAgent->VERSION( 5.815 ); # HTTP::Headers content_is_html method
      $lwp_response = LWP::UserAgent->new->get( $url );
  
      Carp::croak("GET failed on $url: " . $lwp_response->status_line)
            unless $lwp_response->is_success;
      Carp::croak("$url returned " . $lwp_response->content_type . " not HTML")
            unless $lwp_response->content_is_html;
  
      $new->parse( $lwp_response->decoded_content );
      $new->eof;
      undef $lwp_response;        # Processed successfully
      return $new;
  }
  
  # TODO: document more fully?
  sub parse_content {    # from any number of scalars
      my $tree = shift;
      my $retval;
      foreach my $whunk (@_) {
          if ( ref($whunk) eq 'SCALAR' ) {
              $retval = $tree->parse($$whunk);
          }
          else {
              $retval = $tree->parse($whunk);
          }
          last if $tree->{'_stunted'};    # might as well check that.
      }
      $tree->eof();
      return $retval;
  }
  
  #---------------------------------------------------------------------------
  
  sub new {                               # constructor!
      my $class = shift;
      $class = ref($class) || $class;
  
      # Initialize HTML::Element part
      my $self = $class->element_class->new('html');
  
      {
  
          # A hack for certain strange versions of Parser:
          my $other_self = HTML::Parser->new();
          %$self = ( %$self, %$other_self );    # copy fields
             # Yes, multiple inheritance is messy.  Kids, don't try this at home.
          bless $other_self, "HTML::TreeBuilder::_hideyhole";
  
          # whack it out of the HTML::Parser class, to avoid the destructor
      }
  
      # The root of the tree is special, as it has these funny attributes,
      # and gets reblessed into this class.
  
      # Initialize parser settings
      $self->{'_implicit_tags'}       = 1;
      $self->{'_implicit_body_p_tag'} = 0;
  
      # If true, trying to insert text, or any of %isPhraseMarkup right
      #  under 'body' will implicate a 'p'.  If false, will just go there.
  
      $self->{'_tighten'} = 1;
  
      # whether ignorable WS in this tree should be deleted
  
      $self->{'_implicit'} = 1; # to delete, once we find a real open-"html" tag
  
      $self->{'_ignore_unknown'}      = 1;
      $self->{'_ignore_text'}         = 0;
      $self->{'_warn'}                = 0;
      $self->{'_no_space_compacting'} = 0;
      $self->{'_store_comments'}      = 0;
      $self->{'_store_declarations'}  = 1;
      $self->{'_store_pis'}           = 0;
      $self->{'_p_strict'}            = 0;
      $self->{'_no_expand_entities'}  = 0;
  
      # Parse attributes passed in as arguments
      if (@_) {
          my %attr = @_;
          for ( keys %attr ) {
              $self->{"_$_"} = $attr{$_};
          }
      }
  
      $HTML::Element::encoded_content = $self->{'_no_expand_entities'};
  
      # rebless to our class
      bless $self, $class;
  
      $self->{'_element_count'} = 1;
  
      # undocumented, informal, and maybe not exactly correct
  
      $self->{'_head'} = $self->insert_element( 'head', 1 );
      $self->{'_pos'}  = undef;                                # pull it back up
      $self->{'_body'} = $self->insert_element( 'body', 1 );
      $self->{'_pos'} = undef;    # pull it back up again
  
      return $self;
  }
  
  #==========================================================================
  
  sub _elem                       # universal accessor...
  {
      my ( $self, $elem, $val ) = @_;
      my $old = $self->{$elem};
      $self->{$elem} = $val if defined $val;
      return $old;
  }
  
  # accessors....
  sub implicit_tags       { shift->_elem( '_implicit_tags',       @_ ); }
  sub implicit_body_p_tag { shift->_elem( '_implicit_body_p_tag', @_ ); }
  sub p_strict            { shift->_elem( '_p_strict',            @_ ); }
  sub no_space_compacting { shift->_elem( '_no_space_compacting', @_ ); }
  sub ignore_unknown      { shift->_elem( '_ignore_unknown',      @_ ); }
  sub ignore_text         { shift->_elem( '_ignore_text',         @_ ); }
  sub ignore_ignorable_whitespace { shift->_elem( '_tighten',            @_ ); }
  sub store_comments              { shift->_elem( '_store_comments',     @_ ); }
  sub store_declarations          { shift->_elem( '_store_declarations', @_ ); }
  sub store_pis                   { shift->_elem( '_store_pis',          @_ ); }
  sub warn                        { shift->_elem( '_warn',               @_ ); }
  
  sub no_expand_entities {
      shift->_elem( '_no_expand_entities', @_ );
      $HTML::Element::encoded_content = @_;
  }
  
  #==========================================================================
  
  sub warning {
      my $self = shift;
      CORE::warn("HTML::Parse: $_[0]\n") if $self->{'_warn'};
  
      # should maybe say HTML::TreeBuilder instead
  }
  
  #==========================================================================
  
  {
  
      # To avoid having to rebuild these lists constantly...
      my $_Closed_by_structurals = [qw(p h1 h2 h3 h4 h5 h6 pre textarea)];
      my $indent;
  
      sub start {
          return if $_[0]{'_stunted'};
  
          # Accept a signal from HTML::Parser for start-tags.
          my ( $self, $tag, $attr ) = @_;
  
          # Parser passes more, actually:
          #   $self->start($tag, $attr, $attrseq, $origtext)
          # But we can merrily ignore $attrseq and $origtext.
  
          if ( $tag eq 'x-html' ) {
              print "Ignoring open-x-html tag.\n" if DEBUG;
  
              # inserted by some lame code-generators.
              return;    # bypass tweaking.
          }
  
          $tag =~ s{/$}{}s;    # So <b/> turns into <b>.  Silently forgive.
  
          unless ( $tag =~ m/^[-_a-zA-Z0-9:%]+$/s ) {
              DEBUG and print "Start-tag name $tag is no good.  Skipping.\n";
              return;
  
              # This avoids having Element's new() throw an exception.
          }
  
          my $ptag = ( my $pos = $self->{'_pos'} || $self )->{'_tag'};
          my $already_inserted;
  
          #my($indent);
          if (DEBUG) {
  
         # optimization -- don't figure out indenting unless we're in debug mode
              my @lineage = $pos->lineage;
              $indent = '  ' x ( 1 + @lineage );
              print $indent, "Proposing a new \U$tag\E under ",
                  join( '/', map $_->{'_tag'}, reverse( $pos, @lineage ) )
                  || 'Root',
                  ".\n";
  
              #} else {
              #  $indent = ' ';
          }
  
          #print $indent, "POS: $pos ($ptag)\n" if DEBUG > 2;
          # $attr = {%$attr};
  
          foreach my $k ( keys %$attr ) {
  
              # Make sure some stooge doesn't have "<span _content='pie'>".
              # That happens every few million Web pages.
              $attr->{ ' ' . $k } = delete $attr->{$k}
                  if length $k and substr( $k, 0, 1 ) eq '_';
  
              # Looks bad, but is fine for round-tripping.
          }
  
          my $e = $self->element_class->new( $tag, %$attr );
  
          # Make a new element object.
          # (Only rarely do we end up just throwing it away later in this call.)
  
        # Some prep -- custom messiness for those damned tables, and strict P's.
          if ( $self->{'_implicit_tags'} ) {    # wallawallawalla!
  
              unless ( $HTML::TreeBuilder::isTableElement{$tag} ) {
                  if ( $ptag eq 'table' ) {
                      print $indent,
                          " * Phrasal \U$tag\E right under TABLE makes implicit TR and TD\n"
                          if DEBUG > 1;
                      $self->insert_element( 'tr', 1 );
                      $pos = $self->insert_element( 'td', 1 )
                          ;                     # yes, needs updating
                  }
                  elsif ( $ptag eq 'tr' ) {
                      print $indent,
                          " * Phrasal \U$tag\E right under TR makes an implicit TD\n"
                          if DEBUG > 1;
                      $pos = $self->insert_element( 'td', 1 )
                          ;                     # yes, needs updating
                  }
                  $ptag = $pos->{'_tag'};       # yes, needs updating
              }
  
              # end of table-implication block.
  
              # Now maybe do a little dance to enforce P-strictness.
              # This seems like it should be integrated with the big
              # "ALL HOPE..." block, further below, but that doesn't
              # seem feasable.
              if (    $self->{'_p_strict'}
                  and $HTML::TreeBuilder::isKnown{$tag}
                  and not $HTML::Tagset::is_Possible_Strict_P_Content{$tag} )
              {
                  my $here     = $pos;
                  my $here_tag = $ptag;
                  while (1) {
                      if ( $here_tag eq 'p' ) {
                          print $indent, " * Inserting $tag closes strict P.\n"
                              if DEBUG > 1;
                          $self->end( \q{p} );
  
                      # NB: same as \'q', but less confusing to emacs cperl-mode
                          last;
                      }
  
                      #print("Lasting from $here_tag\n"),
                      last
                          if $HTML::TreeBuilder::isKnown{$here_tag}
                              and
                              not $HTML::Tagset::is_Possible_Strict_P_Content{
                                  $here_tag};
  
                 # Don't keep looking up the tree if we see something that can't
                 #  be strict-P content.
  
                      $here_tag
                          = ( $here = $here->{'_parent'} || last )->{'_tag'};
                  }    # end while
                  $ptag = ( $pos = $self->{'_pos'} || $self )
                      ->{'_tag'};    # better update!
              }
  
              # end of strict-p block.
          }
  
         # And now, get busy...
         #----------------------------------------------------------------------
          if ( !$self->{'_implicit_tags'} ) {    # bimskalabim
                                                 # do nothing
              print $indent, " * _implicit_tags is off.  doing nothing\n"
                  if DEBUG > 1;
  
         #----------------------------------------------------------------------
          }
          elsif ( $HTML::TreeBuilder::isHeadOrBodyElement{$tag} ) {
              if ( $pos->is_inside('body') ) {    # all is well
                  print $indent,
                      " * ambilocal element \U$tag\E is fine under BODY.\n"
                      if DEBUG > 1;
              }
              elsif ( $pos->is_inside('head') ) {
                  print $indent,
                      " * ambilocal element \U$tag\E is fine under HEAD.\n"
                      if DEBUG > 1;
              }
              else {
  
                  # In neither head nor body!  mmmmm... put under head?
  
                  if ( $ptag eq 'html' ) {    # expected case
                       # TODO?? : would there ever be a case where _head would be
                       #  absent from a tree that would ever be accessed at this
                       #  point?
                      die "Where'd my head go?" unless ref $self->{'_head'};
                      if ( $self->{'_head'}{'_implicit'} ) {
                          print $indent,
                              " * ambilocal element \U$tag\E makes an implicit HEAD.\n"
                              if DEBUG > 1;
  
                          # or rather, points us at it.
                          $self->{'_pos'}
                              = $self->{'_head'};    # to insert under...
                      }
                      else {
                          $self->warning(
                              "Ambilocal element <$tag> not under HEAD or BODY!?"
                          );
  
                          # Put it under HEAD by default, I guess
                          $self->{'_pos'}
                              = $self->{'_head'};    # to insert under...
                      }
  
                  }
                  else {
  
               # Neither under head nor body, nor right under html... pass thru?
                      $self->warning(
                          "Ambilocal element <$tag> neither under head nor body, nor right under html!?"
                      );
                  }
              }
  
         #----------------------------------------------------------------------
          }
          elsif ( $HTML::TreeBuilder::isBodyElement{$tag} ) {
  
              # Ensure that we are within <body>
              if ( $ptag eq 'body' ) {
  
                  # We're good.
              }
              elsif (
                  $HTML::TreeBuilder::isBodyElement{$ptag}    # glarg
                  and not $HTML::TreeBuilder::isHeadOrBodyElement{$ptag}
                  )
              {
  
                # Special case: Save ourselves a call to is_inside further down.
                # If our $ptag is an isBodyElement element (but not an
                # isHeadOrBodyElement element), then we must be under body!
                  print $indent, " * Inferring that $ptag is under BODY.\n",
                      if DEBUG > 3;
  
                  # I think this and the test for 'body' trap everything
                  # bodyworthy, except the case where the parent element is
                  # under an unknown element that's a descendant of body.
              }
              elsif ( $pos->is_inside('head') ) {
                  print $indent,
                      " * body-element \U$tag\E minimizes HEAD, makes implicit BODY.\n"
                      if DEBUG > 1;
                  $ptag = (
                      $pos = $self->{'_pos'}
                          = $self->{'_body'}    # yes, needs updating
                          || die "Where'd my body go?"
                  )->{'_tag'};                  # yes, needs updating
              }
              elsif ( !$pos->is_inside('body') ) {
                  print $indent,
                      " * body-element \U$tag\E makes implicit BODY.\n"
                      if DEBUG > 1;
                  $ptag = (
                      $pos = $self->{'_pos'}
                          = $self->{'_body'}    # yes, needs updating
                          || die "Where'd my body go?"
                  )->{'_tag'};                  # yes, needs updating
              }
  
              # else we ARE under body, so okay.
  
              # Handle implicit endings and insert based on <tag> and position
              # ... ALL HOPE ABANDON ALL YE WHO ENTER HERE ...
              if (   $tag eq 'p'
                  or $tag eq 'h1'
                  or $tag eq 'h2'
                  or $tag eq 'h3'
                  or $tag eq 'h4'
                  or $tag eq 'h5'
                  or $tag eq 'h6'
                  or $tag eq 'form'
  
                  # Hm, should <form> really be here?!
                  )
              {
  
                  # Can't have <p>, <h#> or <form> inside these
                  $self->end(
                      $_Closed_by_structurals,
                      @HTML::TreeBuilder::p_closure_barriers
  
                          # used to be just li!
                  );
  
              }
              elsif ( $tag eq 'ol' or $tag eq 'ul' or $tag eq 'dl' ) {
  
                  # Can't have lists inside <h#> -- in the unlikely
                  #  event anyone tries to put them there!
                  if (   $ptag eq 'h1'
                      or $ptag eq 'h2'
                      or $ptag eq 'h3'
                      or $ptag eq 'h4'
                      or $ptag eq 'h5'
                      or $ptag eq 'h6' )
                  {
                      $self->end( \$ptag );
                  }
  
                  # TODO: Maybe keep closing up the tree until
                  #  the ptag isn't any of the above?
                  # But anyone that says <h1><h2><ul>...
                  #  deserves what they get anyway.
  
              }
              elsif ( $tag eq 'li' ) {    # list item
                      # Get under a list tag, one way or another
                  unless (
                      exists $HTML::TreeBuilder::isList{$ptag}
                      or $self->end( \q{*}, keys %HTML::TreeBuilder::isList ) #'
                      )
                  {
                      print $indent,
                          " * inserting implicit UL for lack of containing ",
                          join( '|', keys %HTML::TreeBuilder::isList ), ".\n"
                          if DEBUG > 1;
                      $self->insert_element( 'ul', 1 );
                  }
  
              }
              elsif ( $tag eq 'dt' or $tag eq 'dd' ) {
  
                  # Get under a DL, one way or another
                  unless ( $ptag eq 'dl' or $self->end( \q{*}, 'dl' ) ) {    #'
                      print $indent,
                          " * inserting implicit DL for lack of containing DL.\n"
                          if DEBUG > 1;
                      $self->insert_element( 'dl', 1 );
                  }
  
              }
              elsif ( $HTML::TreeBuilder::isFormElement{$tag} ) {
                  if ($self->{
                          '_ignore_formies_outside_form'}  # TODO: document this
                      and not $pos->is_inside('form')
                      )
                  {
                      print $indent,
                          " * ignoring \U$tag\E because not in a FORM.\n"
                          if DEBUG > 1;
                      return;                              # bypass tweaking.
                  }
                  if ( $tag eq 'option' ) {
  
                      # return unless $ptag eq 'select';
                      $self->end( \q{option} );
                      $ptag = ( $self->{'_pos'} || $self )->{'_tag'};
                      unless ( $ptag eq 'select' or $ptag eq 'optgroup' ) {
                          print $indent,
                              " * \U$tag\E makes an implicit SELECT.\n"
                              if DEBUG > 1;
                          $pos = $self->insert_element( 'select', 1 );
  
                      # but not a very useful select -- has no 'name' attribute!
                      # is $pos's value used after this?
                      }
                  }
              }
              elsif ( $HTML::TreeBuilder::isTableElement{$tag} ) {
                  if ( !$pos->is_inside('table') ) {
                      print $indent, " * \U$tag\E makes an implicit TABLE\n"
                          if DEBUG > 1;
                      $self->insert_element( 'table', 1 );
                  }
  
                  if ( $tag eq 'td' or $tag eq 'th' ) {
  
                      # Get under a tr one way or another
                      unless (
                          $ptag eq 'tr'    # either under a tr
                          or $self->end( \q{*}, 'tr',
                              'table' )    #or we can get under one
                          )
                      {
                          print $indent,
                              " * \U$tag\E under \U$ptag\E makes an implicit TR\n"
                              if DEBUG > 1;
                          $self->insert_element( 'tr', 1 );
  
                          # presumably pos's value isn't used after this.
                      }
                  }
                  else {
                      $self->end( \$tag, 'table' );    #'
                  }
  
                  # Hmm, I guess this is right.  To work it out:
                  #   tr closes any open tr (limited at a table)
                  #   thead closes any open thead (limited at a table)
                  #   tbody closes any open tbody (limited at a table)
                  #   tfoot closes any open tfoot (limited at a table)
                  #   colgroup closes any open colgroup (limited at a table)
                  #   col can try, but will always fail, at the enclosing table,
                  #     as col is empty, and therefore never open!
                  # But!
                  #   td closes any open td OR th (limited at a table)
                  #   th closes any open th OR td (limited at a table)
                  #   ...implementable as "close to a tr, or make a tr"
  
              }
              elsif ( $HTML::TreeBuilder::isPhraseMarkup{$tag} ) {
                  if ( $ptag eq 'body' and $self->{'_implicit_body_p_tag'} ) {
                      print
                          " * Phrasal \U$tag\E right under BODY makes an implicit P\n"
                          if DEBUG > 1;
                      $pos = $self->insert_element( 'p', 1 );
  
                      # is $pos's value used after this?
                  }
              }
  
              # End of implicit endings logic
  
         # End of "elsif ($HTML::TreeBuilder::isBodyElement{$tag}"
         #----------------------------------------------------------------------
  
          }
          elsif ( $HTML::TreeBuilder::isHeadElement{$tag} ) {
              if ( $pos->is_inside('body') ) {
                  print $indent, " * head element \U$tag\E found inside BODY!\n"
                      if DEBUG;
                  $self->warning("Header element <$tag> in body");    # [sic]
              }
              elsif ( !$pos->is_inside('head') ) {
                  print $indent,
                      " * head element \U$tag\E makes an implicit HEAD.\n"
                      if DEBUG > 1;
              }
              else {
                  print $indent,
                      " * head element \U$tag\E goes inside existing HEAD.\n"
                      if DEBUG > 1;
              }
              $self->{'_pos'} = $self->{'_head'} || die "Where'd my head go?";
  
         #----------------------------------------------------------------------
          }
          elsif ( $tag eq 'html' ) {
              if ( delete $self->{'_implicit'} ) {    # first time here
                  print $indent, " * good! found the real HTML element!\n"
                      if DEBUG > 1;
              }
              else {
                  print $indent, " * Found a second HTML element\n"
                      if DEBUG;
                  $self->warning("Found a nested <html> element");
              }
  
              # in either case, migrate attributes to the real element
              for ( keys %$attr ) {
                  $self->attr( $_, $attr->{$_} );
              }
              $self->{'_pos'} = undef;
              return $self;    # bypass tweaking.
  
         #----------------------------------------------------------------------
          }
          elsif ( $tag eq 'head' ) {
              my $head = $self->{'_head'} || die "Where'd my head go?";
              if ( delete $head->{'_implicit'} ) {    # first time here
                  print $indent, " * good! found the real HEAD element!\n"
                      if DEBUG > 1;
              }
              else {                                  # been here before
                  print $indent, " * Found a second HEAD element\n"
                      if DEBUG;
                  $self->warning("Found a second <head> element");
              }
  
              # in either case, migrate attributes to the real element
              for ( keys %$attr ) {
                  $head->attr( $_, $attr->{$_} );
              }
              return $self->{'_pos'} = $head;         # bypass tweaking.
  
         #----------------------------------------------------------------------
          }
          elsif ( $tag eq 'body' ) {
              my $body = $self->{'_body'} || die "Where'd my body go?";
              if ( delete $body->{'_implicit'} ) {    # first time here
                  print $indent, " * good! found the real BODY element!\n"
                      if DEBUG > 1;
              }
              else {                                  # been here before
                  print $indent, " * Found a second BODY element\n"
                      if DEBUG;
                  $self->warning("Found a second <body> element");
              }
  
              # in either case, migrate attributes to the real element
              for ( keys %$attr ) {
                  $body->attr( $_, $attr->{$_} );
              }
              return $self->{'_pos'} = $body;         # bypass tweaking.
  
         #----------------------------------------------------------------------
          }
          elsif ( $tag eq 'frameset' ) {
              if (!( $self->{'_frameset_seen'}++ )    # first frameset seen
                  and !$self->{'_noframes_seen'}
  
                  # otherwise it'll be under the noframes already
                  and !$self->is_inside('body')
                  )
              {
  
             # The following is a bit of a hack.  We don't use the normal
             #  insert_element because 1) we don't want it as _pos, but instead
             #  right under $self, and 2), more importantly, that we don't want
             #  this inserted at the /end/ of $self's content_list, but instead
             #  in the middle of it, specifically right before the body element.
             #
                  my $c    = $self->{'_content'} || die "Contentless root?";
                  my $body = $self->{'_body'}    || die "Where'd my BODY go?";
                  for ( my $i = 0; $i < @$c; ++$i ) {
                      if ( $c->[$i] eq $body ) {
                          splice( @$c, $i, 0, $self->{'_pos'} = $pos = $e );
                          HTML::Element::_weaken($e->{'_parent'} = $self);
                          $already_inserted = 1;
                          print $indent,
                              " * inserting 'frameset' right before BODY.\n"
                              if DEBUG > 1;
                          last;
                      }
                  }
                  die "BODY not found in children of root?"
                      unless $already_inserted;
              }
  
          }
          elsif ( $tag eq 'frame' ) {
  
              # Okay, fine, pass thru.
              # Should probably enforce that these should be under a frameset.
              # But hey.  Ditto for enforcing that 'noframes' should be under
              # a 'frameset', as the DTDs say.
  
          }
          elsif ( $tag eq 'noframes' ) {
  
             # This basically assumes there'll be exactly one 'noframes' element
             #  per document.  At least, only the first one gets to have the
             #  body under it.  And if there are no noframes elements, then
             #  the body pretty much stays where it is.  Is that ever a problem?
              if ( $self->{'_noframes_seen'}++ ) {
                  print $indent, " * ANOTHER noframes element?\n" if DEBUG;
              }
              else {
                  if ( $pos->is_inside('body') ) {
                      print $indent, " * 'noframes' inside 'body'.  Odd!\n"
                          if DEBUG;
  
                 # In that odd case, we /can't/ make body a child of 'noframes',
                 # because it's an ancestor of the 'noframes'!
                  }
                  else {
                      $e->push_content( $self->{'_body'}
                              || die "Where'd my body go?" );
                      print $indent, " * Moving body to be under noframes.\n"
                          if DEBUG;
                  }
              }
  
         #----------------------------------------------------------------------
          }
          else {
  
              # unknown tag
              if ( $self->{'_ignore_unknown'} ) {
                  print $indent, " * Ignoring unknown tag \U$tag\E\n" if DEBUG;
                  $self->warning("Skipping unknown tag $tag");
                  return;
              }
              else {
                  print $indent, " * Accepting unknown tag \U$tag\E\n"
                      if DEBUG;
              }
          }
  
         #----------------------------------------------------------------------
         # End of mumbo-jumbo
  
          print $indent, "(Attaching ", $e->{'_tag'}, " under ",
              ( $self->{'_pos'} || $self )->{'_tag'}, ")\n"
  
              # because if _pos isn't defined, it goes under self
              if DEBUG;
  
          # The following if-clause is to delete /some/ ignorable whitespace
          #  nodes, as we're making the tree.
          # This'd be a node we'd catch later anyway, but we might as well
          #  nip it in the bud now.
          # This doesn't catch /all/ deletable WS-nodes, so we do have to call
          #  the tightener later to catch the rest.
  
          if ( $self->{'_tighten'} and !$self->{'_ignore_text'} )
          {    # if tightenable
              my ( $sibs, $par );
              if (( $sibs = ( $par = $self->{'_pos'} || $self )->{'_content'} )
                  and @$sibs            # parent already has content
                  and !
                  ref( $sibs->[-1] )    # and the last one there is a text node
                  and $sibs->[-1] !~ m<[^\n\r\f\t ]>s  # and it's all whitespace
  
                  and (    # one of these has to be eligible...
                      $HTML::TreeBuilder::canTighten{$tag}
                      or (( @$sibs == 1 )
                          ?    # WS is leftmost -- so parent matters
                          $HTML::TreeBuilder::canTighten{ $par->{'_tag'} }
                          :    # WS is after another node -- it matters
                          (   ref $sibs->[-2]
                                  and
                                  $HTML::TreeBuilder::canTighten{ $sibs->[-2]
                                      {'_tag'} }
                          )
                      )
                  )
  
                  and !$par->is_inside( 'pre', 'xmp', 'textarea', 'plaintext' )
  
                  # we're clear
                  )
              {
                  pop @$sibs;
                  print $indent, "Popping a preceding all-WS node\n" if DEBUG;
              }
          }
  
          $self->insert_element($e) unless $already_inserted;
  
          if (DEBUG) {
              if ( $self->{'_pos'} ) {
                  print $indent, "(Current lineage of pos:  \U$tag\E under ",
                      join(
                      '/',
                      reverse(
  
                          # $self->{'_pos'}{'_tag'},  # don't list myself!
                          $self->{'_pos'}->lineage_tag_names
                      )
                      ),
                      ".)\n";
              }
              else {
                  print $indent, "(Pos points nowhere!?)\n";
              }
          }
  
          unless ( ( $self->{'_pos'} || '' ) eq $e ) {
  
              # if it's an empty element -- i.e., if it didn't change the _pos
              &{         $self->{"_tweak_$tag"}
                      || $self->{'_tweak_*'}
                      || return $e }( map $_, $e, $tag, $self )
                  ;    # make a list so the user can't clobber
          }
  
          return $e;
      }
  }
  
  #==========================================================================
  
  {
      my $indent;
  
      sub end {
          return if $_[0]{'_stunted'};
  
         # Either: Acccept an end-tag signal from HTML::Parser
         # Or: Method for closing currently open elements in some fairly complex
         #  way, as used by other methods in this class.
          my ( $self, $tag, @stop ) = @_;
          if ( $tag eq 'x-html' ) {
              print "Ignoring close-x-html tag.\n" if DEBUG;
  
              # inserted by some lame code-generators.
              return;
          }
  
          unless ( ref($tag) or $tag =~ m/^[-_a-zA-Z0-9:%]+$/s ) {
              DEBUG and print "End-tag name $tag is no good.  Skipping.\n";
              return;
  
              # This avoids having Element's new() throw an exception.
          }
  
         # This method accepts two calling formats:
         #  1) from Parser:  $self->end('tag_name', 'origtext')
         #        in which case we shouldn't mistake origtext as a blocker tag
         #  2) from myself:  $self->end(\q{tagname1}, 'blk1', ... )
         #     from myself:  $self->end(['tagname1', 'tagname2'], 'blk1',  ... )
  
          # End the specified tag, but don't move above any of the blocker tags.
          # The tag can also be a reference to an array.  Terminate the first
          # tag found.
  
          my $ptag = ( my $p = $self->{'_pos'} || $self )->{'_tag'};
  
          # $p and $ptag are sort-of stratch
  
          if ( ref($tag) ) {
  
              # First param is a ref of one sort or another --
              #  THE CALL IS COMING FROM INSIDE THE HOUSE!
              $tag = $$tag if ref($tag) eq 'SCALAR';
  
              # otherwise it's an arrayref.
          }
          else {
  
              # the call came from Parser -- just ignore origtext
              # except in a table ignore unmatched table tags RT #59980
              @stop = $tag =~ /^t[hdr]\z/ ? 'table' : ();
          }
  
          #my($indent);
          if (DEBUG) {
  
             # optimization -- don't figure out depth unless we're in debug mode
              my @lineage_tags = $p->lineage_tag_names;
              $indent = '  ' x ( 1 + @lineage_tags );
  
              # now announce ourselves
              print $indent, "Ending ",
                  ref($tag) ? ( '[', join( ' ', @$tag ), ']' ) : "\U$tag\E",
                  scalar(@stop)
                  ? ( " no higher than [", join( ' ', @stop ), "]" )
                  : (), ".\n";
  
              print $indent, " (Current lineage: ", join( '/', @lineage_tags ),
                  ".)\n"
                  if DEBUG > 1;
  
              if ( DEBUG > 3 ) {
  
                  #my(
                  # $package, $filename, $line, $subroutine,
                  # $hasargs, $wantarray, $evaltext, $is_require) = caller;
                  print $indent,
                      " (Called from ", ( caller(1) )[3], ' line ',
                      ( caller(1) )[2],
                      ")\n";
              }
  
              #} else {
              #  $indent = ' ';
          }
  
          # End of if DEBUG
  
          # Now actually do it
          my @to_close;
          if ( $tag eq '*' ) {
  
          # Special -- close everything up to (but not including) the first
          #  limiting tag, or return if none found.  Somewhat of a special case.
          PARENT:
              while ( defined $p ) {
                  $ptag = $p->{'_tag'};
                  print $indent, " (Looking at $ptag.)\n" if DEBUG > 2;
                  for (@stop) {
                      if ( $ptag eq $_ ) {
                          print $indent,
                              " (Hit a $_; closing everything up to here.)\n"
                              if DEBUG > 2;
                          last PARENT;
                      }
                  }
                  push @to_close, $p;
                  $p = $p->{'_parent'};    # no match so far? keep moving up
                  print $indent,
                      " (Moving on up to ", $p ? $p->{'_tag'} : 'nil', ")\n"
                      if DEBUG > 1;
              }
              unless ( defined $p ) { # We never found what we were looking for.
                  print $indent, " (We never found a limit.)\n" if DEBUG > 1;
                  return;
              }
  
              #print
              #   $indent,
              #   " (To close: ", join('/', map $_->tag, @to_close), ".)\n"
              #  if DEBUG > 4;
  
              # Otherwise update pos and fall thru.
              $self->{'_pos'} = $p;
          }
          elsif ( ref $tag ) {
  
             # Close the first of any of the matching tags, giving up if you hit
             #  any of the stop-tags.
          PARENT:
              while ( defined $p ) {
                  $ptag = $p->{'_tag'};
                  print $indent, " (Looking at $ptag.)\n" if DEBUG > 2;
                  for (@$tag) {
                      if ( $ptag eq $_ ) {
                          print $indent, " (Closing $_.)\n" if DEBUG > 2;
                          last PARENT;
                      }
                  }
                  for (@stop) {
                      if ( $ptag eq $_ ) {
                          print $indent,
                              " (Hit a limiting $_ -- bailing out.)\n"
                              if DEBUG > 1;
                          return;    # so it was all for naught
                      }
                  }
                  push @to_close, $p;
                  $p = $p->{'_parent'};
              }
              return unless defined $p;    # We went off the top of the tree.
                 # Otherwise specified element was found; set pos to its parent.
              push @to_close, $p;
              $self->{'_pos'} = $p->{'_parent'};
          }
          else {
  
              # Close the first of the specified tag, giving up if you hit
              #  any of the stop-tags.
              while ( defined $p ) {
                  $ptag = $p->{'_tag'};
                  print $indent, " (Looking at $ptag.)\n" if DEBUG > 2;
                  if ( $ptag eq $tag ) {
                      print $indent, " (Closing $tag.)\n" if DEBUG > 2;
                      last;
                  }
                  for (@stop) {
                      if ( $ptag eq $_ ) {
                          print $indent,
                              " (Hit a limiting $_ -- bailing out.)\n"
                              if DEBUG > 1;
                          return;    # so it was all for naught
                      }
                  }
                  push @to_close, $p;
                  $p = $p->{'_parent'};
              }
              return unless defined $p;    # We went off the top of the tree.
                 # Otherwise specified element was found; set pos to its parent.
              push @to_close, $p;
              $self->{'_pos'} = $p->{'_parent'};
          }
  
          $self->{'_pos'} = undef if $self eq ( $self->{'_pos'} || '' );
          print $indent, "(Pos now points to ",
              $self->{'_pos'} ? $self->{'_pos'}{'_tag'} : '???', ".)\n"
              if DEBUG > 1;
  
          ### EXPENSIVE, because has to check that it's not under a pre
          ### or a CDATA-parent.  That's one more method call per end()!
          ### Might as well just do this at the end of the tree-parse, I guess,
          ### at which point we'd be parsing top-down, and just not traversing
          ### under pre's or CDATA-parents.
          ##
          ## Take this opportunity to nix any terminal whitespace nodes.
          ## TODO: consider whether this (plus the logic in start(), above)
          ## would ever leave any WS nodes in the tree.
          ## If not, then there's no reason to have eof() call
          ## delete_ignorable_whitespace on the tree, is there?
          ##
      #if(@to_close and $self->{'_tighten'} and !$self->{'_ignore_text'} and
      #  ! $to_close[-1]->is_inside('pre', keys %HTML::Tagset::isCDATA_Parent)
      #) {  # if tightenable
      #  my($children, $e_tag);
      #  foreach my $e (reverse @to_close) { # going top-down
      #    last if 'pre' eq ($e_tag = $e->{'_tag'}) or
      #     $HTML::Tagset::isCDATA_Parent{$e_tag};
      #
      #    if(
      #      $children = $e->{'_content'}
      #      and @$children      # has children
      #      and !ref($children->[-1])
      #      and $children->[-1] =~ m<^\s+$>s # last node is all-WS
      #      and
      #        (
      #         # has a tightable parent:
      #         $HTML::TreeBuilder::canTighten{ $e_tag }
      #         or
      #          ( # has a tightenable left sibling:
      #            @$children > 1 and
      #            ref($children->[-2])
      #            and $HTML::TreeBuilder::canTighten{ $children->[-2]{'_tag'} }
      #          )
      #        )
      #    ) {
      #      pop @$children;
      #      #print $indent, "Popping a terminal WS node from ", $e->{'_tag'},
      #      #  " (", $e->address, ") while exiting.\n" if DEBUG;
      #    }
      #  }
      #}
  
          foreach my $e (@to_close) {
  
              # Call the applicable callback, if any
              $ptag = $e->{'_tag'};
              &{         $self->{"_tweak_$ptag"}
                      || $self->{'_tweak_*'}
                      || next }( map $_, $e, $ptag, $self );
              print $indent, "Back from tweaking.\n" if DEBUG;
              last
                  if $self->{ '_stunted'
                      };    # in case one of the handlers called stunt
          }
          return @to_close;
      }
  }
  
  #==========================================================================
  {
      my ( $indent, $nugget );
  
      sub text {
          return if $_[0]{'_stunted'};
  
          # Accept a "here's a text token" signal from HTML::Parser.
          my ( $self, $text, $is_cdata ) = @_;
  
          # the >3.0 versions of Parser may pass a cdata node.
          # Thanks to Gisle Aas for pointing this out.
  
          return unless length $text;    # I guess that's always right
  
          my $ignore_text         = $self->{'_ignore_text'};
          my $no_space_compacting = $self->{'_no_space_compacting'};
          my $no_expand_entities  = $self->{'_no_expand_entities'};
          my $pos                 = $self->{'_pos'} || $self;
  
          HTML::Entities::decode($text)
              unless $ignore_text
                  || $is_cdata
                  || $HTML::Tagset::isCDATA_Parent{ $pos->{'_tag'} }
                  || $no_expand_entities;
  
          #my($indent, $nugget);
          if (DEBUG) {
  
             # optimization -- don't figure out depth unless we're in debug mode
              my @lineage_tags = $pos->lineage_tag_names;
              $indent = '  ' x ( 1 + @lineage_tags );
  
              $nugget
                  = ( length($text) <= 25 )
                  ? $text
                  : ( substr( $text, 0, 25 ) . '...' );
              $nugget =~ s<([\x00-\x1F])>
                   <'\\x'.(unpack("H2",$1))>eg;
              print $indent, "Proposing a new text node ($nugget) under ",
                  join( '/', reverse( $pos->{'_tag'}, @lineage_tags ) )
                  || 'Root',
                  ".\n";
  
              #} else {
              #  $indent = ' ';
          }
  
          my $ptag;
          if ($HTML::Tagset::isCDATA_Parent{ $ptag = $pos->{'_tag'} }
  
              #or $pos->is_inside('pre')
              or $pos->is_inside( 'pre', 'textarea' )
              )
          {
              return if $ignore_text;
              $pos->push_content($text);
          }
          else {
  
              # return unless $text =~ /\S/;  # This is sometimes wrong
  
              if ( !$self->{'_implicit_tags'} || $text !~ /[^\n\r\f\t ]/ ) {
  
                  # don't change anything
              }
              elsif ( $ptag eq 'head' or $ptag eq 'noframes' ) {
                  if ( $self->{'_implicit_body_p_tag'} ) {
                      print $indent,
                          " * Text node under \U$ptag\E closes \U$ptag\E, implicates BODY and P.\n"
                          if DEBUG > 1;
                      $self->end( \$ptag );
                      $pos = $self->{'_body'}
                          ? ( $self->{'_pos'}
                              = $self->{'_body'} )    # expected case
                          : $self->insert_element( 'body', 1 );
                      $pos = $self->insert_element( 'p', 1 );
                  }
                  else {
                      print $indent,
                          " * Text node under \U$ptag\E closes, implicates BODY.\n"
                          if DEBUG > 1;
                      $self->end( \$ptag );
                      $pos = $self->{'_body'}
                          ? ( $self->{'_pos'}
                              = $self->{'_body'} )    # expected case
                          : $self->insert_element( 'body', 1 );
                  }
              }
              elsif ( $ptag eq 'html' ) {
                  if ( $self->{'_implicit_body_p_tag'} ) {
                      print $indent,
                          " * Text node under HTML implicates BODY and P.\n"
                          if DEBUG > 1;
                      $pos = $self->{'_body'}
                          ? ( $self->{'_pos'}
                              = $self->{'_body'} )    # expected case
                          : $self->insert_element( 'body', 1 );
                      $pos = $self->insert_element( 'p', 1 );
                  }
                  else {
                      print $indent,
                          " * Text node under HTML implicates BODY.\n"
                          if DEBUG > 1;
                      $pos = $self->{'_body'}
                          ? ( $self->{'_pos'}
                              = $self->{'_body'} )    # expected case
                          : $self->insert_element( 'body', 1 );
  
                      #print "POS is $pos, ", $pos->{'_tag'}, "\n";
                  }
              }
              elsif ( $ptag eq 'body' ) {
                  if ( $self->{'_implicit_body_p_tag'} ) {
                      print $indent, " * Text node under BODY implicates P.\n"
                          if DEBUG > 1;
                      $pos = $self->insert_element( 'p', 1 );
                  }
              }
              elsif ( $ptag eq 'table' ) {
                  print $indent,
                      " * Text node under TABLE implicates TR and TD.\n"
                      if DEBUG > 1;
                  $self->insert_element( 'tr', 1 );
                  $pos = $self->insert_element( 'td', 1 );
  
                  # double whammy!
              }
              elsif ( $ptag eq 'tr' ) {
                  print $indent, " * Text node under TR implicates TD.\n"
                      if DEBUG > 1;
                  $pos = $self->insert_element( 'td', 1 );
              }
  
              # elsif (
              #       # $ptag eq 'li'   ||
              #       # $ptag eq 'dd'   ||
              #         $ptag eq 'form') {
              #    $pos = $self->insert_element('p', 1);
              #}
  
              # Whatever we've done above should have had the side
              # effect of updating $self->{'_pos'}
  
              #print "POS is now $pos, ", $pos->{'_tag'}, "\n";
  
              return if $ignore_text;
              $text =~ s/[\n\r\f\t ]+/ /g    # canonical space
                  unless $no_space_compacting;
  
              print $indent, " (Attaching text node ($nugget) under ",
  
             # was: $self->{'_pos'} ? $self->{'_pos'}{'_tag'} : $self->{'_tag'},
                  $pos->{'_tag'}, ").\n"
                  if DEBUG > 1;
  
              $pos->push_content($text);
          }
  
          &{ $self->{'_tweak_~text'} || return }( $text, $pos,
              $pos->{'_tag'} . '' );
  
          # Note that this is very exceptional -- it doesn't fall back to
          #  _tweak_*, and it gives its tweak different arguments.
          return;
      }
  }
  
  #==========================================================================
  
  # TODO: test whether comment(), declaration(), and process(), do the right
  #  thing as far as tightening and whatnot.
  # Also, currently, doctypes and comments that appear before head or body
  #  show up in the tree in the wrong place.  Something should be done about
  #  this.  Tricky.  Maybe this whole business of pre-making the body and
  #  whatnot is wrong.
  
  sub comment {
      return if $_[0]{'_stunted'};
  
      # Accept a "here's a comment" signal from HTML::Parser.
  
      my ( $self, $text ) = @_;
      my $pos = $self->{'_pos'} || $self;
      return
          unless $self->{'_store_comments'}
              || $HTML::Tagset::isCDATA_Parent{ $pos->{'_tag'} };
  
      if (DEBUG) {
          my @lineage_tags = $pos->lineage_tag_names;
          my $indent = '  ' x ( 1 + @lineage_tags );
  
          my $nugget
              = ( length($text) <= 25 )
              ? $text
              : ( substr( $text, 0, 25 ) . '...' );
          $nugget =~ s<([\x00-\x1F])>
                   <'\\x'.(unpack("H2",$1))>eg;
          print $indent, "Proposing a Comment ($nugget) under ",
              join( '/', reverse( $pos->{'_tag'}, @lineage_tags ) ) || 'Root',
              ".\n";
      }
  
      ( my $e = $self->element_class->new('~comment') )->{'text'} = $text;
      $pos->push_content($e);
      ++( $self->{'_element_count'} );
  
      &{         $self->{'_tweak_~comment'}
              || $self->{'_tweak_*'}
              || return $e }( map $_, $e, '~comment', $self );
  
      return $e;
  }
  
  sub declaration {
      return if $_[0]{'_stunted'};
  
      # Accept a "here's a markup declaration" signal from HTML::Parser.
  
      my ( $self, $text ) = @_;
      my $pos = $self->{'_pos'} || $self;
  
      if (DEBUG) {
          my @lineage_tags = $pos->lineage_tag_names;
          my $indent = '  ' x ( 1 + @lineage_tags );
  
          my $nugget
              = ( length($text) <= 25 )
              ? $text
              : ( substr( $text, 0, 25 ) . '...' );
          $nugget =~ s<([\x00-\x1F])>
                   <'\\x'.(unpack("H2",$1))>eg;
          print $indent, "Proposing a Declaration ($nugget) under ",
              join( '/', reverse( $pos->{'_tag'}, @lineage_tags ) ) || 'Root',
              ".\n";
      }
      ( my $e = $self->element_class->new('~declaration') )->{'text'} = $text;
  
      $self->{_decl} = $e;
      return $e;
  }
  
  #==========================================================================
  
  sub process {
      return if $_[0]{'_stunted'};
  
      # Accept a "here's a PI" signal from HTML::Parser.
  
      return unless $_[0]->{'_store_pis'};
      my ( $self, $text ) = @_;
      my $pos = $self->{'_pos'} || $self;
  
      if (DEBUG) {
          my @lineage_tags = $pos->lineage_tag_names;
          my $indent = '  ' x ( 1 + @lineage_tags );
  
          my $nugget
              = ( length($text) <= 25 )
              ? $text
              : ( substr( $text, 0, 25 ) . '...' );
          $nugget =~ s<([\x00-\x1F])>
                   <'\\x'.(unpack("H2",$1))>eg;
          print $indent, "Proposing a PI ($nugget) under ",
              join( '/', reverse( $pos->{'_tag'}, @lineage_tags ) ) || 'Root',
              ".\n";
      }
      ( my $e = $self->element_class->new('~pi') )->{'text'} = $text;
      $pos->push_content($e);
      ++( $self->{'_element_count'} );
  
      &{ $self->{'_tweak_~pi'} || $self->{'_tweak_*'} || return $e }( map $_,
          $e, '~pi', $self );
  
      return $e;
  }
  
  #==========================================================================
  
  #When you call $tree->parse_file($filename), and the
  #tree's ignore_ignorable_whitespace attribute is on (as it is
  #by default), HTML::TreeBuilder's logic will manage to avoid
  #creating some, but not all, nodes that represent ignorable
  #whitespace.  However, at the end of its parse, it traverses the
  #tree and deletes any that it missed.  (It does this with an
  #around-method around HTML::Parser's eof method.)
  #
  #However, with $tree->parse($content), the cleanup-traversal step
  #doesn't happen automatically -- so when you're done parsing all
  #content for a document (regardless of whether $content is the only
  #bit, or whether it's just another chunk of content you're parsing into
  #the tree), call $tree->eof() to signal that you're at the end of the
  #text you're inputting to the tree.  Besides properly cleaning any bits
  #of ignorable whitespace from the tree, this will also ensure that
  #HTML::Parser's internal buffer is flushed.
  
  sub eof {
  
      # Accept an "end-of-file" signal from HTML::Parser, or thrown by the user.
  
      return if $_[0]->{'_done'};    # we've already been here
  
      return $_[0]->SUPER::eof() if $_[0]->{'_stunted'};
  
      my $x = $_[0];
      print "EOF received.\n" if DEBUG;
      my (@rv);
      if (wantarray) {
  
          # I don't think this makes any difference for this particular
          #  method, but let's be scrupulous, for once.
          @rv = $x->SUPER::eof();
      }
      else {
          $rv[0] = $x->SUPER::eof();
      }
  
      $x->end('html') unless $x eq ( $x->{'_pos'} || $x );
  
      # That SHOULD close everything, and will run the appropriate tweaks.
      # We /could/ be running under some insane mode such that there's more
      #  than one HTML element, but really, that's just insane to do anyhow.
  
      unless ( $x->{'_implicit_tags'} ) {
  
          # delete those silly implicit head and body in case we put
          # them there in implicit tags mode
          foreach my $node ( $x->{'_head'}, $x->{'_body'} ) {
              $node->replace_with_content
                  if defined $node
                      and ref $node
                      and $node->{'_implicit'}
                      and $node->{'_parent'};
  
              # I think they should be empty anyhow, since the only
              # logic that'd insert under them can apply only, I think,
              # in the case where _implicit_tags is on
          }
  
          # this may still leave an implicit 'html' at the top, but there's
          # nothing we can do about that, is there?
      }
  
      $x->delete_ignorable_whitespace()
  
          # this's why we trap this -- an after-method
          if $x->{'_tighten'} and !$x->{'_ignore_text'};
      $x->{'_done'} = 1;
  
      return @rv if wantarray;
      return $rv[0];
  }
  
  #==========================================================================
  
  # TODO: document
  
  sub stunt {
      my $self = $_[0];
      print "Stunting the tree.\n" if DEBUG;
      $self->{'_done'} = 1;
  
      if ( $HTML::Parser::VERSION < 3 ) {
  
          #This is a MEAN MEAN HACK.  And it works most of the time!
          $self->{'_buf'} = '';
          my $fh = *HTML::Parser::F{IO};
  
          # the local'd FH used by parse_file loop
          if ( defined $fh ) {
              print "Closing Parser's filehandle $fh\n" if DEBUG;
              close($fh);
          }
  
        # But if they called $tree->parse_file($filehandle)
        #  or $tree->parse_file(*IO), then there will be no *HTML::Parser::F{IO}
        #  to close.  Ahwell.  Not a problem for most users these days.
  
      }
      else {
          $self->SUPER::eof();
  
          # Under 3+ versions, calling eof from inside a parse will abort the
          #  parse / parse_file
      }
  
      # In the off chance that the above didn't work, we'll throw
      #  this flag to make any future events be no-ops.
      $self->stunted(1);
      return;
  }
  
  # TODO: document
  sub stunted { shift->_elem( '_stunted', @_ ); }
  sub done    { shift->_elem( '_done',    @_ ); }
  
  #==========================================================================
  
  sub delete {
  
      # Override Element's delete method.
      # This does most, if not all, of what Element's delete does anyway.
      # Deletes content, including content in some special attributes.
      # But doesn't empty out the hash.
  
      $_[0]->{'_element_count'} = 1;    # never hurts to be scrupulously correct
  
      delete @{ $_[0] }{ '_body', '_head', '_pos' };
      for (
          @{ delete( $_[0]->{'_content'} ) || [] },    # all/any content
  
       #       delete @{$_[0]}{'_body', '_head', '_pos'}
       # ...and these, in case these elements don't appear in the
       #   content, which is possible.  If they did appear (as they
       #   usually do), then calling $_->delete on them again is harmless.
       #  I don't think that's such a hot idea now.  Thru creative reattachment,
       #  those could actually now point to elements in OTHER trees (which we do
       #  NOT want to delete!).
  ## Reasoned out:
    #  If these point to elements not in the content list of any element in this
    #   tree, but not in the content list of any element in any OTHER tree, then
    #   just deleting these will make their refcounts hit zero.
    #  If these point to elements in the content lists of elements in THIS tree,
    #   then we'll get to deleting them when we delete from the top.
    #  If these point to elements in the content lists of elements in SOME OTHER
    #   tree, then they're not to be deleted.
          )
      {
          $_->delete
              if defined $_ and ref $_    #  Make sure it's an object.
                  and $_ ne $_[0];    #  And avoid hitting myself, just in case!
      }
  
      $_[0]->detach if $_[0]->{'_parent'} and $_[0]->{'_parent'}{'_content'};
  
      # An 'html' element having a parent is quite unlikely.
  
      return;
  }
  
  sub tighten_up {                    # legacy
      shift->delete_ignorable_whitespace(@_);
  }
  
  sub elementify {
  
      # Rebless this object down into the normal element class.
      my $self     = $_[0];
      my $to_class = $self->element_class;
      delete @{$self}{
          grep {
              ;
              length $_ and substr( $_, 0, 1 ) eq '_'
  
                  # The private attributes that we'll retain:
                  and $_ ne '_tag'
                  and $_ ne '_parent'
                  and $_ ne '_content'
                  and $_ ne '_implicit'
                  and $_ ne '_pos'
                  and $_ ne '_element_class'
              } keys %$self
          };
      bless $self, $to_class;    # Returns the same object we were fed
  }
  
  sub element_class {
      return 'HTML::Element' if not ref $_[0];
      return $_[0]->{_element_class} || 'HTML::Element';
  }
  
  #--------------------------------------------------------------------------
  
  sub guts {
      my @out;
      my @stack       = ( $_[0] );
      my $destructive = $_[1];
      my $this;
      while (@stack) {
          $this = shift @stack;
          if ( !ref $this ) {
              push @out, $this;    # yes, it can include text nodes
          }
          elsif ( !$this->{'_implicit'} ) {
              push @out, $this;
              delete $this->{'_parent'} if $destructive;
          }
          else {
  
              # it's an implicit node.  Delete it and recurse
              delete $this->{'_parent'} if $destructive;
              unshift @stack,
                  @{
                  (   $destructive
                      ? delete( $this->{'_content'} )
                      : $this->{'_content'}
                      )
                      || []
                  };
          }
      }
  
      # Doesn't call a real $root->delete on the (when implicit) root,
      #  but I don't think it needs to.
  
      return @out if wantarray;    # one simple normal case.
      return unless @out;
      return $out[0] if @out == 1 and ref( $out[0] );
      my $x = HTML::Element->new( 'div', '_implicit' => 1 );
      $x->push_content(@out);
      return $x;
  }
  
  sub disembowel { $_[0]->guts(1) }
  
  #--------------------------------------------------------------------------
  1;
  
  __END__
  
  =pod
  
  =head1 NAME
  
  HTML::TreeBuilder - Parser that builds a HTML syntax tree
  
  =head1 VERSION
  
  This document describes version 5.07 of
  HTML::TreeBuilder, released August 31, 2017
  as part of L<HTML-Tree|HTML::Tree>.
  
  =head1 SYNOPSIS
  
    use HTML::TreeBuilder 5 -weak; # Ensure weak references in use
  
    foreach my $file_name (@ARGV) {
      my $tree = HTML::TreeBuilder->new; # empty tree
      $tree->parse_file($file_name);
      print "Hey, here's a dump of the parse tree of $file_name:\n";
      $tree->dump; # a method we inherit from HTML::Element
      print "And here it is, bizarrely rerendered as HTML:\n",
        $tree->as_HTML, "\n";
  
      # Now that we're done with it, we must destroy it.
      # $tree = $tree->delete; # Not required with weak references
    }
  
  =head1 DESCRIPTION
  
  (This class is part of the L<HTML::Tree|HTML::Tree> dist.)
  
  This class is for HTML syntax trees that get built out of HTML
  source.  The way to use it is to:
  
  1. start a new (empty) HTML::TreeBuilder object,
  
  2. then use one of the methods from HTML::Parser (presumably with
  C<< $tree->parse_file($filename) >> for files, or with
  C<< $tree->parse($document_content) >> and C<< $tree->eof >> if you've got
  the content in a string) to parse the HTML
  document into the tree C<$tree>.
  
  (You can combine steps 1 and 2 with the "new_from_file" or
  "new_from_content" methods.)
  
  2b. call C<< $root->elementify() >> if you want.
  
  3. do whatever you need to do with the syntax tree, presumably
  involving traversing it looking for some bit of information in it,
  
  4. previous versions of HTML::TreeBuilder required you to call
  C<< $tree->delete() >> to erase the contents of the tree from memory
  when you're done with the tree.  This is not normally required anymore.
  See L<HTML::Element/"Weak References"> for details.
  
  =head1 ATTRIBUTES
  
  Most of the following attributes native to HTML::TreeBuilder control how
  parsing takes place; they should be set I<before> you try parsing into
  the given object.  You can set the attributes by passing a TRUE or
  FALSE value as argument.  E.g., C<< $root->implicit_tags >> returns
  the current setting for the C<implicit_tags> option,
  C<< $root->implicit_tags(1) >> turns that option on,
  and C<< $root->implicit_tags(0) >> turns it off.
  
  =head2 implicit_tags
  
  Setting this attribute to true will instruct the parser to try to
  deduce implicit elements and implicit end tags.  If it is false you
  get a parse tree that just reflects the text as it stands, which is
  unlikely to be useful for anything but quick and dirty parsing.
  (In fact, I'd be curious to hear from anyone who finds it useful to
  have C<implicit_tags> set to false.)
  Default is true.
  
  Implicit elements have the L<HTML::Element/implicit> attribute set.
  
  =head2 implicit_body_p_tag
  
  This controls an aspect of implicit element behavior, if C<implicit_tags>
  is on:  If a text element (PCDATA) or a phrasal element (such as
  C<< <em> >>) is to be inserted under C<< <body> >>, two things
  can happen: if C<implicit_body_p_tag> is true, it's placed under a new,
  implicit C<< <p> >> tag.  (Past DTDs suggested this was the only
  correct behavior, and this is how past versions of this module
  behaved.)  But if C<implicit_body_p_tag> is false, nothing is implicated
  -- the PCDATA or phrasal element is simply placed under
  C<< <body> >>.  Default is false.
  
  =head2 no_expand_entities
  
  This attribute controls whether entities are decoded during the initial
  parse of the source. Enable this if you don't want entities decoded to
  their character value. e.g. '&amp;' is decoded to '&' by default, but
  will be unchanged if this is enabled.
  Default is false (entities will be decoded.)
  
  =head2 ignore_unknown
  
  This attribute controls whether unknown tags should be represented as
  elements in the parse tree, or whether they should be ignored.
  Default is true (to ignore unknown tags.)
  
  =head2 ignore_text
  
  Do not represent the text content of elements.  This saves space if
  all you want is to examine the structure of the document.  Default is
  false.
  
  =head2 ignore_ignorable_whitespace
  
  If set to true, TreeBuilder will try to avoid
  creating ignorable whitespace text nodes in the tree.  Default is
  true.  (In fact, I'd be interested in hearing if there's ever a case
  where you need this off, or where leaving it on leads to incorrect
  behavior.)
  
  =head2 no_space_compacting
  
  This determines whether TreeBuilder compacts all whitespace strings
  in the document (well, outside of PRE or TEXTAREA elements), or
  leaves them alone.  Normally (default, value of 0), each string of
  contiguous whitespace in the document is turned into a single space.
  But that's not done if C<no_space_compacting> is set to 1.
  
  Setting C<no_space_compacting> to 1 might be useful if you want
  to read in a tree just to make some minor changes to it before
  writing it back out.
  
  This method is experimental.  If you use it, be sure to report
  any problems you might have with it.
  
  =head2 p_strict
  
  If set to true (and it defaults to false), TreeBuilder will take a
  narrower than normal view of what can be under a C<< <p> >> element; if it sees
  a non-phrasal element about to be inserted under a C<< <p> >>, it will
  close that C<< <p> >>.  Otherwise it will close C<< <p> >> elements only for
  other C<< <p> >>'s, headings, and C<< <form> >> (although the latter may be
  removed in future versions).
  
  For example, when going thru this snippet of code,
  
    <p>stuff
    <ul>
  
  TreeBuilder will normally (with C<p_strict> false) put the C<< <ul> >> element
  under the C<< <p> >> element.  However, with C<p_strict> set to true, it will
  close the C<< <p> >> first.
  
  In theory, there should be strictness options like this for other/all
  elements besides just C<< <p> >>; but I treat this as a special case simply
  because of the fact that C<< <p> >> occurs so frequently and its end-tag is
  omitted so often; and also because application of strictness rules
  at parse-time across all elements often makes tiny errors in HTML
  coding produce drastically bad parse-trees, in my experience.
  
  If you find that you wish you had an option like this to enforce
  content-models on all elements, then I suggest that what you want is
  content-model checking as a stage after TreeBuilder has finished
  parsing.
  
  =head2 store_comments
  
  This determines whether TreeBuilder will normally store comments found
  while parsing content into C<$root>.  Currently, this is off by default.
  
  =head2 store_declarations
  
  This determines whether TreeBuilder will normally store markup
  declarations found while parsing content into C<$root>.  This is on
  by default.
  
  =head2 store_pis
  
  This determines whether TreeBuilder will normally store processing
  instructions found while parsing content into C<$root> -- assuming a
  recent version of HTML::Parser (old versions won't parse PIs
  correctly).  Currently, this is off (false) by default.
  
  It is somewhat of a known bug (to be fixed one of these days, if
  anyone needs it?) that PIs in the preamble (before the C<< <html> >>
  start-tag) end up actually I<under> the C<< <html> >> element.
  
  =head2 warn
  
  This determines whether syntax errors during parsing should generate
  warnings, emitted via Perl's C<warn> function.
  
  This is off (false) by default.
  
  =head1 METHODS
  
  Objects of this class inherit the methods of both HTML::Parser and
  HTML::Element.  The methods inherited from HTML::Parser are used for
  building the HTML tree, and the methods inherited from HTML::Element
  are what you use to scrutinize the tree.  Besides this
  (HTML::TreeBuilder) documentation, you must also carefully read the
  HTML::Element documentation, and also skim the HTML::Parser
  documentation -- probably only its parse and parse_file methods are of
  interest.
  
  =head2 new_from_file
  
    $root = HTML::TreeBuilder->new_from_file($filename_or_filehandle);
  
  This "shortcut" constructor merely combines constructing a new object
  (with the L</new> method, below), and calling C<< $new->parse_file(...) >> on
  it.  Returns the new object.  Note that this provides no way of
  setting any parse options like C<store_comments> (for that, call C<new>, and
  then set options, before calling C<parse_file>).  See the notes (below)
  on parameters to L</parse_file>.
  
  If HTML::TreeBuilder is unable to read the file, then C<new_from_file>
  dies.  The error can also be found in C<$!>.  (This behavior is new in
  HTML-Tree 5. Previous versions returned a tree with only implicit elements.)
  
  =head2 new_from_content
  
    $root = HTML::TreeBuilder->new_from_content(...);
  
  This "shortcut" constructor merely combines constructing a new object
  (with the L</new> method, below), and calling C<< for(...){$new->parse($_)} >>
  and C<< $new->eof >> on it.  Returns the new object.  Note that this provides
  no way of setting any parse options like C<store_comments> (for that,
  call C<new>, and then set options, before calling C<parse>).  Example
  usages: C<< HTML::TreeBuilder->new_from_content(@lines) >>, or
  C<< HTML::TreeBuilder->new_from_content($content) >>.
  
  =head2 new_from_url
  
    $root = HTML::TreeBuilder->new_from_url($url)
  
  This "shortcut" constructor combines constructing a new object (with
  the L</new> method, below), loading L<LWP::UserAgent>, fetching the
  specified URL, and calling C<< $new->parse( $response->decoded_content) >>
  and C<< $new->eof >> on it.
  Returns the new object.  Note that this provides no way of setting any
  parse options like C<store_comments>.
  
  If LWP is unable to fetch the URL, or the response is not HTML (as
  determined by L<HTTP::Headers/content_is_html>), then C<new_from_url>
  dies, and the HTTP::Response object is found in
  C<$HTML::TreeBuilder::lwp_response>.
  
  You must have installed LWP::UserAgent for this method to work.  LWP
  is not installed automatically, because it's a large set of modules
  and you might not need it.
  
  =head2 new
  
    $root = HTML::TreeBuilder->new();
  
  This creates a new HTML::TreeBuilder object.  This method takes no
  attributes.
  
  =head2 parse_file
  
   $root->parse_file(...)
  
  [An important method inherited from L<HTML::Parser|HTML::Parser>, which
  see.  Current versions of HTML::Parser can take a filespec, or a
  filehandle object, like *FOO, or some object from class IO::Handle,
  IO::File, IO::Socket) or the like.
  I think you should check that a given file exists I<before> calling
  C<< $root->parse_file($filespec) >>.]
  
  When you pass a filename to C<parse_file>, HTML::Parser opens it in
  binary mode, which means it's interpreted as Latin-1 (ISO-8859-1).  If
  the file is in another encoding, like UTF-8 or UTF-16, this will not
  do the right thing.
  
  One solution is to open the file yourself using the proper
  C<:encoding> layer, and pass the filehandle to C<parse_file>.  You can
  automate this process by using L<IO::HTML/html_file>, which will use
  the HTML5 encoding sniffing algorithm to automatically determine the
  proper C<:encoding> layer and apply it.
  
  In the next major release of HTML-Tree, I plan to have it use IO::HTML
  automatically.  If you really want your file opened in binary mode,
  you should open it yourself and pass the filehandle to C<parse_file>.
  
  The return value is C<undef> if there's an error opening the file.  In
  that case, the error will be in C<$!>.
  
  =head2 parse
  
    $root->parse(...)
  
  [A important method inherited from L<HTML::Parser|HTML::Parser>, which
  see.  See the note below for C<< $root->eof() >>.]
  
  =head2 eof
  
    $root->eof();
  
  This signals that you're finished parsing content into this tree; this
  runs various kinds of crucial cleanup on the tree.  This is called
  I<for you> when you call C<< $root->parse_file(...) >>, but not when
  you call C<< $root->parse(...) >>.  So if you call
  C<< $root->parse(...) >>, then you I<must> call C<< $root->eof() >>
  once you've finished feeding all the chunks to C<parse(...)>, and
  before you actually start doing anything else with the tree in C<$root>.
  
  =head2 parse_content
  
    $root->parse_content(...);
  
  Basically a handy alias for C<< $root->parse(...); $root->eof >>.
  Takes the exact same arguments as C<< $root->parse() >>.
  
  =head2 delete
  
    $root->delete();
  
  [A previously important method inherited from L<HTML::Element|HTML::Element>,
  which see.]
  
  =head2 elementify
  
    $root->elementify();
  
  This changes the class of the object in C<$root> from
  HTML::TreeBuilder to the class used for all the rest of the elements
  in that tree (generally HTML::Element).  Returns C<$root>.
  
  For most purposes, this is unnecessary, but if you call this after
  (after!!)
  you've finished building a tree, then it keeps you from accidentally
  trying to call anything but HTML::Element methods on it.  (I.e., if
  you accidentally call C<$root-E<gt>parse_file(...)> on the
  already-complete and elementified tree, then instead of charging ahead
  and I<wreaking havoc>, it'll throw a fatal error -- since C<$root> is
  now an object just of class HTML::Element which has no C<parse_file>
  method.
  
  Note that C<elementify> currently deletes all the private attributes of
  C<$root> except for "_tag", "_parent", "_content", "_pos", and
  "_implicit".  If anyone requests that I change this to leave in yet
  more private attributes, I might do so, in future versions.
  
  =head2 guts
  
   @nodes = $root->guts();
   $parent_for_nodes = $root->guts();
  
  In list context (as in the first case), this method returns the topmost
  non-implicit nodes in a tree.  This is useful when you're parsing HTML
  code that you know doesn't expect an HTML document, but instead just
  a fragment of an HTML document.  For example, if you wanted the parse
  tree for a file consisting of just this:
  
    <li>I like pie!
  
  Then you would get that with C<< @nodes = $root->guts(); >>.
  It so happens that in this case, C<@nodes> will contain just one
  element object, representing the C<< <li> >> node (with "I like pie!" being
  its text child node).  However, consider if you were parsing this:
  
    <hr>Hooboy!<hr>
  
  In that case, C<< $root->guts() >> would return three items:
  an element object for the first C<< <hr> >>, a text string "Hooboy!", and
  another C<< <hr> >> element object.
  
  For cases where you want definitely one element (so you can treat it as
  a "document fragment", roughly speaking), call C<guts()> in scalar
  context, as in C<< $parent_for_nodes = $root->guts() >>. That works like
  C<guts()> in list context; in fact, C<guts()> in list context would
  have returned exactly one value, and if it would have been an object (as
  opposed to a text string), then that's what C<guts> in scalar context
  will return.  Otherwise, if C<guts()> in list context would have returned
  no values at all, then C<guts()> in scalar context returns undef.  In
  all other cases, C<guts()> in scalar context returns an implicit C<< <div> >>
  element node, with children consisting of whatever nodes C<guts()>
  in list context would have returned.  Note that that may detach those
  nodes from C<$root>'s tree.
  
  =head2 disembowel
  
    @nodes = $root->disembowel();
    $parent_for_nodes = $root->disembowel();
  
  The C<disembowel()> method works just like the C<guts()> method, except
  that disembowel definitively destroys the tree above the nodes that
  are returned.  Usually when you want the guts from a tree, you're just
  going to toss out the rest of the tree anyway, so this saves you the
  bother.  (Remember, "disembowel" means "remove the guts from".)
  
  =head1 INTERNAL METHODS
  
  You should not need to call any of the following methods directly.
  
  =head2 element_class
  
    $classname = $h->element_class;
  
  This method returns the class which will be used for new elements.  It
  defaults to HTML::Element, but can be overridden by subclassing or esoteric
  means best left to those will will read the source and then not complain when
  those esoteric means change.  (Just subclass.)
  
  =head2 comment
  
  Accept a "here's a comment" signal from HTML::Parser.
  
  =head2 declaration
  
  Accept a "here's a markup declaration" signal from HTML::Parser.
  
  =head2 done
  
  TODO: document
  
  =head2 end
  
  Either: Acccept an end-tag signal from HTML::Parser
  Or: Method for closing currently open elements in some fairly complex
  way, as used by other methods in this class.
  
  TODO: Why is this hidden?
  
  =head2 process
  
  Accept a "here's a PI" signal from HTML::Parser.
  
  =head2 start
  
  Accept a signal from HTML::Parser for start-tags.
  
  TODO: Why is this hidden?
  
  =head2 stunt
  
  TODO: document
  
  =head2 stunted
  
  TODO: document
  
  =head2 text
  
  Accept a "here's a text token" signal from HTML::Parser.
  
  TODO: Why is this hidden?
  
  =head2 tighten_up
  
  Legacy
  
  Redirects to L<HTML::Element/delete_ignorable_whitespace>.
  
  =head2 warning
  
  Wrapper for CORE::warn
  
  TODO: why not just use carp?
  
  =head1 SUBROUTINES
  
  =head2 DEBUG
  
  Are we in Debug mode?  This is a constant subroutine, to allow
  compile-time optimizations.  To control debug mode, set
  C<$HTML::TreeBuilder::DEBUG> I<before> loading HTML::TreeBuilder.
  
  =head1 HTML AND ITS DISCONTENTS
  
  HTML is rather harder to parse than people who write it generally
  suspect.
  
  Here's the problem: HTML is a kind of SGML that permits "minimization"
  and "implication".  In short, this means that you don't have to close
  every tag you open (because the opening of a subsequent tag may
  implicitly close it), and if you use a tag that can't occur in the
  context you seem to using it in, under certain conditions the parser
  will be able to realize you mean to leave the current context and
  enter the new one, that being the only one that your code could
  correctly be interpreted in.
  
  Now, this would all work flawlessly and unproblematically if: 1) all
  the rules that both prescribe and describe HTML were (and had been)
  clearly set out, and 2) everyone was aware of these rules and wrote
  their code in compliance to them.
  
  However, it didn't happen that way, and so most HTML pages are
  difficult if not impossible to correctly parse with nearly any set of
  straightforward SGML rules.  That's why the internals of
  HTML::TreeBuilder consist of lots and lots of special cases -- instead
  of being just a generic SGML parser with HTML DTD rules plugged in.
  
  =head1 TRANSLATIONS?
  
  The techniques that HTML::TreeBuilder uses to perform what I consider
  very robust parses on everyday code are not things that can work only
  in Perl.  To date, the algorithms at the center of HTML::TreeBuilder
  have been implemented only in Perl, as far as I know; and I don't
  foresee getting around to implementing them in any other language any
  time soon.
  
  If, however, anyone is looking for a semester project for an applied
  programming class (or if they merely enjoy I<extra-curricular>
  masochism), they might do well to see about choosing as a topic the
  implementation/adaptation of these routines to any other interesting
  programming language that you feel currently suffers from a lack of
  robust HTML-parsing.  I welcome correspondence on this subject, and
  point out that one can learn a great deal about languages by trying to
  translate between them, and then comparing the result.
  
  The HTML::TreeBuilder source may seem long and complex, but it is
  rather well commented, and symbol names are generally
  self-explanatory.  (You are encouraged to read the Mozilla HTML parser
  source for comparison.)  Some of the complexity comes from little-used
  features, and some of it comes from having the HTML tokenizer
  (HTML::Parser) being a separate module, requiring somewhat of a
  different interface than you'd find in a combined tokenizer and
  tree-builder.  But most of the length of the source comes from the fact
  that it's essentially a long list of special cases, with lots and lots
  of sanity-checking, and sanity-recovery -- because, as Roseanne
  Rosannadanna once said, "it's always I<something>".
  
  Users looking to compare several HTML parsers should look at the
  source for Raggett's Tidy
  (C<E<lt>http://www.w3.org/People/Raggett/tidy/E<gt>>),
  Mozilla
  (C<E<lt>http://www.mozilla.org/E<gt>>),
  and possibly root around the browsers section of Yahoo
  to find the various open-source ones
  (C<E<lt>http://dir.yahoo.com/Computers_and_Internet/Software/Internet/World_Wide_Web/Browsers/E<gt>>).
  
  =head1 BUGS
  
  * Framesets seem to work correctly now.  Email me if you get a strange
  parse from a document with framesets.
  
  * Really bad HTML code will, often as not, make for a somewhat
  objectionable parse tree.  Regrettable, but unavoidably true.
  
  * If you're running with C<implicit_tags> off (God help you!), consider
  that C<< $tree->content_list >> probably contains the tree or grove from the
  parse, and not C<$tree> itself (which will, oddly enough, be an implicit
  C<< <html> >> element).  This seems counter-intuitive and problematic; but
  seeing as how almost no HTML ever parses correctly with C<implicit_tags>
  off, this interface oddity seems the least of your problems.
  
  =head1 BUG REPORTS
  
  When a document parses in a way different from how you think it
  should, I ask that you report this to me as a bug.  The first thing
  you should do is copy the document, trim out as much of it as you can
  while still producing the bug in question, and I<then> email me that
  mini-document I<and> the code you're using to parse it, to the HTML::Tree
  bug queue at S<C<< <bug-html-tree at rt.cpan.org> >>>.
  
  Include a note as to how it
  parses (presumably including its C<< $tree->dump >> output), and then a
  I<careful and clear> explanation of where you think the parser is
  going astray, and how you would prefer that it work instead.
  
  =head1 SEE ALSO
  
  For more information about the HTML-Tree distribution: L<HTML::Tree>.
  
  Modules used by HTML::TreeBuilder:
  L<HTML::Parser>, L<HTML::Element>, L<HTML::Tagset>.
  
  For converting between L<XML::DOM::Node>, L<HTML::Element>, and
  L<XML::Element> trees: L<HTML::DOMbo>.
  
  For opening a HTML file with automatic charset detection: L<IO::HTML>.
  
  =head1 AUTHOR
  
  Current maintainers:
  
  =over
  
  =item * Christopher J. Madsen S<C<< <perl AT cjmweb.net> >>>
  
  =item * Jeff Fearn S<C<< <jfearn AT cpan.org> >>>
  
  =back
  
  Original HTML-Tree author:
  
  =over
  
  =item * Gisle Aas
  
  =back
  
  Former maintainers:
  
  =over
  
  =item * Sean M. Burke
  
  =item * Andy Lester
  
  =item * Pete Krawczyk S<C<< <petek AT cpan.org> >>>
  
  =back
  
  You can follow or contribute to HTML-Tree's development at
  L<< https://github.com/kentfredric/HTML-Tree >>.
  
  =head1 COPYRIGHT AND LICENSE
  
  Copyright 1995-1998 Gisle Aas, 1999-2004 Sean M. Burke,
  2005 Andy Lester, 2006 Pete Krawczyk, 2010 Jeff Fearn,
  2012 Christopher J. Madsen.
  
  This library is free software; you can redistribute it and/or
  modify it under the same terms as Perl itself.
  
  The programs in this library are distributed in the hope that they
  will be useful, but without any warranty; without even the implied
  warranty of merchantability or fitness for a particular purpose.
  
  =cut
HTML_TREEBUILDER

    $main::fatpacked{"HTTP/BrowserDetect.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'HTTP_BROWSERDETECT';
  use strict;
  use warnings;
  
  use 5.006;
  
  package HTTP::BrowserDetect;
  
  our $VERSION = '3.23';
  
  use vars qw(@ALL_TESTS);
  
  # Operating Systems
  our @OS_TESTS = qw(
      windows  mac     os2
      unix     linux   vms
      bsd      amiga   brew
      bb10     rimtabletos
      chromeos ios
      firefoxos
  );
  
  # More precise Windows
  our @WINDOWS_TESTS = qw(
      win16      win3x        win31
      win95      win98        winnt
      winme      win32        win2k
      winxp      win2k3       winvista
      win7       win8         win8_0
      win8_1     win10        win10_0
      wince      winphone     winphone7
      winphone7_5 winphone8   winphone8_1
      winphone10
  );
  
  # More precise Mac
  our @MAC_TESTS = qw(
      macosx mac68k macppc
  );
  
  # More precise Unix
  our @UNIX_TESTS = qw(
      sun     sun4     sun5
      suni86  irix     irix5
      irix6   hpux     hpux9
      hpux10  aix      aix1
      aix2    aix3     aix4
      sco     unixware mpras
      reliant dec      sinix
  );
  
  # More precise BSDs
  our @BSD_TESTS = qw(
      freebsd
  );
  
  # Gaming devices
  our @GAMING_TESTS = qw(
      ps3gameos pspgameos
  );
  
  # Device related tests
  our @DEVICE_TESTS = qw(
      android audrey blackberry dsi iopener ipad
      iphone ipod kindle kindlefire n3ds palm ps3 psp wap webos
      mobile tablet
  );
  
  # Browsers
  our @BROWSER_TESTS = qw(
      mosaic         netscape         firefox
      chrome         safari           ie
      opera          lynx             links
      elinks         neoplanet        neoplanet2
      avantgo        emacs            mozilla
      konqueror      realplayer       netfront
      mobile_safari  obigo            aol
      lotusnotes     staroffice       icab
      webtv          browsex          silk
      applecoremedia galeon           seamonkey
      epiphany       ucbrowser        dalvik
      edge           pubsub           adm
      brave          imagesearcherpro polaris
  );
  
  our @IE_TESTS = qw(
      ie3         ie4         ie4up
      ie5         ie5up       ie55
      ie55up      ie6         ie7
      ie8         ie9         ie10
      ie11
      ie_compat_mode
  );
  
  our @OPERA_TESTS = qw(
      opera3      opera4     opera5
      opera6      opera7
  );
  
  our @AOL_TESTS = qw(
      aol3        aol4
      aol5        aol6
  );
  
  our @NETSCAPE_TESTS = qw(
      nav2   nav3   nav4
      nav4up nav45  nav45up
      nav6   nav6up navgold
  );
  
  # Firefox variants
  our @FIREFOX_TESTS = qw(
      firebird    iceweasel   phoenix
      namoroka
  );
  
  # Engine tests
  our @ENGINE_TESTS = qw(
      gecko       trident     webkit
      presto      khtml       edgehtml
  );
  
  # These bot names get turned into methods.  Crazy, right?  (I don't even think
  # this is documented anymore.)  We'll leave this in place for back compat, but
  # we won't add any new methods moving forward.
  
  my @OLD_ROBOT_TESTS = qw(
      ahrefs
      altavista
      apache
      askjeeves
      baidu
      bingbot
      curl
      facebook
      getright
      golib
      google
      googleadsbot
      googleadsense
      googlebotimage
      googlebotnews
      googlebotvideo
      googlefavicon
      googlemobile
      indy
      infoseek
      ipsagent
      java
      linkchecker
      linkexchange
      lwp
      lycos
      malware
      mj12bot
      msn
      msnmobile
      msoffice
      nutch
      phplib
      puf
      rubylib
      slurp
      specialarchiver
      wget
      yahoo
      yandex
      yandeximages
  );
  
  our @ROBOT_TESTS = (
      [ 'Applebot',                           'apple' ],
      [ 'baiduspider',                        'baidu' ],
      [ 'bitlybot',                           'bitly' ],
      [ 'developers.google.com//web/snippet', 'google-plus-snippet' ],
      [ 'Discordbot',                         'discordbot' ],
      [ 'embedly',                            'embedly' ],
      [ 'facebookexternalhit',                'facebook' ],
      [ 'flipboard',                          'flipboard' ],
      [ 'Google Page Speed',                  'google-page-speed' ],
      [ 'ltx71',                              'ltx71' ],
      [ 'linkedinbot',                        'linkedin' ],
      [ 'nuzzel',                             'nuzzel' ],
      [ 'outbrain',                           'outbrain' ],
      [ 'pinterest/0.',                       'pinterest' ],
      [ 'pinterestbot',                       'pinterest' ],
      [ 'Pro-Sitemaps',                       'pro-sitemaps' ],
      [ 'quora link preview',                 'quora-link-preview' ],
      [ 'Qwantify',                           'qwantify' ],
      [ 'redditbot',                          'reddit', ],
      [ 'researchscan',                       'researchscan' ],
      [ 'rogerbot',                           'rogerbot' ],
      [ 'ShowyouBot',                         'showyou' ],
      [ 'SkypeUriPreview',                    'skype-uri-preview' ],
      [ 'slackbot',                           'slack' ],
      [ 'Swiftbot',                           'swiftbot' ],
      [ 'tumblr',                             'tumblr' ],
      [ 'twitterbot',                         'twitter' ],
      [ 'vkShare',                            'vkshare' ],
      [ 'W3C_Validator',                      'w3c-validator' ],
      [ 'WhatsApp',                           'whatsapp' ],
  );
  
  our @MISC_TESTS = qw(
      dotnet      x11
      webview
  );
  
  push @ALL_TESTS,
      (
      @OS_TESTS,        @WINDOWS_TESTS,
      @MAC_TESTS,       @UNIX_TESTS,
      @BSD_TESTS,       @GAMING_TESTS,
      @DEVICE_TESTS,    @BROWSER_TESTS,
      @IE_TESTS,        @OPERA_TESTS,
      @AOL_TESTS,       @NETSCAPE_TESTS,
      @FIREFOX_TESTS,   @ENGINE_TESTS,
      @OLD_ROBOT_TESTS, @MISC_TESTS,
      );
  
  # https://support.google.com/webmasters/answer/1061943?hl=en
  
  my %ROBOT_NAMES = (
      ahrefs                => 'Ahrefs',
      altavista             => 'AltaVista',
      'apache-http-client'  => 'Apache HttpClient',
      apple                 => 'Apple',
      'archive-org'         => 'Internet Archive',
      askjeeves             => 'AskJeeves',
      baidu                 => 'Baidu',
      baiduspider           => 'Baidu Spider',
      bingbot               => 'Bingbot',
      bitly                 => 'Bitly',
      curl                  => 'curl',
      discordbot            => 'Discord',
      embedly               => 'Embedly',
      facebook              => 'Facebook',
      facebookexternalhit   => 'Facebook',
      flipboard             => 'Flipboard',
      getright              => 'GetRight',
      golib                 => 'Go language http library',
      google                => 'Googlebot',
      'google-adsbot'       => 'Google AdsBot',
      'google-adsense'      => 'Google AdSense',
      'googlebot'           => 'Googlebot',
      'googlebot-image'     => 'Googlebot Images',
      'googlebot-mobile'    => 'Googlebot Mobile',
      'googlebot-news'      => 'Googlebot News',
      'googlebot-video'     => 'Googlebot Video',
      'google-favicon'      => 'Google Favicon',
      'google-mobile'       => 'Googlebot Mobile',
      'google-page-speed'   => 'Google Page Speed',
      'google-plus-snippet' => 'Google+ Snippet',
      'indy-library'        => 'Indy Library',
      infoseek              => 'InfoSeek',
      java                  => 'Java',
      'libwww-perl'         => 'LWP::UserAgent',
      linkchecker           => 'LinkChecker',
      linkedin              => 'LinkedIn',
      linkexchange          => 'LinkExchange',
      ltx71                 => 'ltx71',
      lycos                 => 'Lycos',
      malware               => 'Malware / hack attempt',
      'microsoft-office'    => 'Microsoft Office',
      mj12bot               => 'Majestic-12 DSearch',
      msn                   => 'MSN',
      'msn-mobile'          => 'MSN Mobile',
      nutch                 => 'Apache Nutch',
      nuzzel                => 'Nuzzel',
      outbrain              => 'Outbrain',
      phplib                => 'PHP http library',
      pinterest             => 'Pinterest',
      'pro-sitemaps'        => 'Pro Sitemap Service',
      puf                   => 'puf',
      'quora-link-preview'  => 'Quora Link Preview',
      qwantify              => 'Qwantify',
      researchscan          => 'Researchscan RWTH Aachen',
      reddit                => 'Reddit',
      robot                 => 'robot',
      rogerbot              => 'Moz',
      'ruby-http-library'   => 'Ruby http library',
      showyou               => 'Showyou',
      'skype-uri-preview'   => 'Skype URI Preview',
      slack                 => 'slack',
      swiftbot              => 'Swiftbot',
      tumblr                => 'Tumblr',
      twitter               => 'Twitter',
      unknown               => 'Unknown Bot',
      'verisign-ips-agent'  => 'Verisign ips-agent',
      vkshare               => 'VK Share',
      'w3c-validator'       => 'W3C Validator',
      wget                  => 'Wget',
      whatsapp              => 'WhatsApp',
      yahoo                 => 'Yahoo',
      'yahoo-slurp'         => 'Yahoo! Slurp',
      yandex                => 'Yandex',
      'yandex-images'       => 'YandexImages',
  );
  
  my %ROBOT_IDS = (
      ahrefs          => 'ahrefs',
      altavista       => 'altavista',
      apache          => 'apache-http-client',
      askjeeves       => 'askjeeves',
      baidu           => 'baidu',
      baiduspider     => 'baidu',
      bingbot         => 'bingbot',
      curl            => 'curl',
      facebook        => 'facebook',
      getright        => 'getright',
      golib           => 'golib',
      google          => 'googlebot',
      googleadsbot    => 'google-adsbot',
      googleadsense   => 'google-adsense',
      googlebotimage  => 'googlebot-image',
      googlebotnews   => 'googlebot-news',
      googlebotvideo  => 'googlebot-video',
      googlefavicon   => 'google-favicon',
      googlemobile    => 'googlebot-mobile',
      indy            => 'indy-library',
      infoseek        => 'infoseek',
      ipsagent        => 'verisign-ips-agent',
      java            => 'java',
      linkchecker     => 'linkchecker',
      linkexchange    => 'linkexchange',
      ltx71           => 'ltx71',
      lwp             => 'libwww-perl',
      lycos           => 'lycos',
      malware         => 'malware',
      mj12bot         => 'mj12bot',
      msn             => 'msn',
      msnmobile       => 'msn-mobile',
      msoffice        => 'microsoft-office',
      nutch           => 'nutch',
      phplib          => 'phplib',
      puf             => 'puf',
      robot           => 'robot',
      rubylib         => 'ruby-http-library',
      researchscan    => 'researchscan',
      slurp           => 'yahoo-slurp',
      specialarchiver => 'archive-org',
      wget            => 'wget',
      yahoo           => 'yahoo',
      yandex          => 'yandex',
      yandeximages    => 'yandex-images',
  );
  
  my %BROWSER_NAMES = (
      adm              => 'Android Download Manager',
      aol              => 'AOL Browser',
      applecoremedia   => 'AppleCoreMedia',
      blackberry       => 'BlackBerry',
      brave            => 'Brave',
      browsex          => 'BrowseX',
      chrome           => 'Chrome',
      curl             => 'curl',
      dalvik           => 'Dalvik',
      dsi              => 'Nintendo DSi',
      edge             => 'Edge',
      elinks           => 'ELinks',
      epiphany         => 'Epiphany',
      firefox          => 'Firefox',
      galeon           => 'Galeon',
      icab             => 'iCab',
      iceweasel        => 'IceWeasel',
      ie               => 'MSIE',
      imagesearcherpro => 'ImageSearcherPro',
      konqueror        => 'Konqueror',
      links            => 'Links',
      lotusnotes       => 'Lotus Notes',
      lynx             => 'Lynx',
      mobile_safari    => 'Mobile Safari',
      mosaic           => 'Mosaic',
      mozilla          => 'Mozilla',
      n3ds             => 'Nintendo 3DS',
      netfront         => 'NetFront',
      netscape         => 'Netscape',
      obigo            => 'Obigo',
      opera            => 'Opera',
      polaris          => 'Polaris',
      pubsub           => 'Safari RSS Reader',
      puf              => 'puf',
      realplayer       => 'RealPlayer',
      safari           => 'Safari',
      seamonkey        => 'SeaMonkey',
      silk             => 'Silk',
      staroffice       => 'StarOffice',
      ucbrowser        => 'UCBrowser',
      webtv            => 'WebTV',
  );
  
  # Device names
  my %DEVICE_NAMES = (
      android    => 'Android',
      audrey     => 'Audrey',
      blackberry => 'BlackBerry',
      dsi        => 'Nintendo DSi',
      iopener    => 'iopener',
      ipad       => 'iPad',
      iphone     => 'iPhone',
      ipod       => 'iPod',
      kindle     => 'Amazon Kindle',
      n3ds       => 'Nintendo 3DS',
      palm       => 'Palm',
      ps3        => 'Sony PlayStation 3',
      psp        => 'Sony PlayStation Portable',
      wap        => 'WAP capable phone',
      webos      => 'webOS',
  );
  
  my %OS_NAMES = (
      amiga       => 'Amiga',
      android     => 'Android',
      bb10        => 'BlackBerry 10',
      brew        => 'Brew',
      chromeos    => 'Chrome OS',
      firefoxos   => 'Firefox OS',
      ios         => 'iOS',
      linux       => 'Linux',
      mac         => 'Mac',
      macosx      => 'Mac OS X',
      os2         => 'OS/2',
      ps3gameos   => 'Playstation 3 GameOS',
      pspgameos   => 'Playstation Portable GameOS',
      rimtabletos => 'RIM Tablet OS',
      unix        => 'Unix',
      vms         => 'VMS',
      win2k       => 'Win2k',
      win2k3      => 'Win2k3',
      win3x       => 'Win3x',
      win7        => 'Win7',
      win8        => 'Win8',
      win8_0      => 'Win8.0',
      win8_1      => 'Win8.1',
      win10       => 'Win10',
      win10_0     => 'Win10.0',
      win95       => 'Win95',
      win98       => 'Win98',
      winme       => 'WinME',
      winnt       => 'WinNT',
      winphone    => 'Windows Phone',
      winvista    => 'WinVista',
      winxp       => 'WinXP',
  );
  
  # Safari build -> version map for versions prior to 3.0
  # (since then, version appears in the user-agent string)
  
  my %safari_build_to_version = qw(
      48      0.8
      51      0.8.1
      60      0.8.2
      73      0.9
      74      1.0b2v74
      85      1.0
      85.7    1.0.2
      85.8    1.0.3
      100     1.1
      100.1   1.1.1
      125     1.2
      125.1   1.2.1
      125.7   1.2.2
      125.9   1.2.3
      125.11  1.2.4
      312     1.3
      312.3   1.3.1
      312.5   1.3.2
      412     2.0
      412.5   2.0.1
      416.12  2.0.2
      417.8   2.0.3
      419.3   2.0.4
  );
  
  #######################################################################################################
  # BROWSER OBJECT
  
  my $default = undef;
  
  sub new {
      my ( $class, $user_agent ) = @_;
  
      my $self = {};
      bless $self, $class;
  
      unless ( defined $user_agent ) {
          $user_agent = $ENV{'HTTP_USER_AGENT'};
      }
  
      $self->{user_agent} = defined $user_agent ? $user_agent : q{};
      $self->_init_core;
  
      return $self;
  }
  
  ### Accessors for computed-on-demand test attributes
  
  foreach my $test ( @ENGINE_TESTS, @MISC_TESTS ) {
      no strict 'refs';
      *{$test} = sub {
          my ($self) = @_;
          return $self->{tests}->{$test} || 0;
      };
  }
  
  foreach my $test (
      @OS_TESTS,  @WINDOWS_TESTS, @MAC_TESTS, @UNIX_TESTS,
      @BSD_TESTS, @GAMING_TESTS
  ) {
      no strict 'refs';
      *{$test} = sub {
          my ($self) = @_;
          $self->_init_os() unless $self->{os_tests};
          return $self->{os_tests}->{$test} || 0;
      };
  }
  
  foreach my $test ( @BROWSER_TESTS, @FIREFOX_TESTS ) {
      no strict 'refs';
      *{$test} = sub {
          my ($self) = @_;
          return $self->{browser_tests}->{$test} || 0;
      };
  }
  
  foreach my $test (@OLD_ROBOT_TESTS) {
      no strict 'refs';
  
      # For the 'robot' test, we return undef instead of 0 if it's
      # false, to match os() and browser() and the like.
      my $false_result = ( $test eq 'robot' ? undef : 0 );
  
      *{$test} = sub {
          my ($self) = @_;
          $self->_init_robots() unless $self->{robot_tests};
          return $self->{robot_tests}->{$test} || $false_result;
      };
  }
  
  foreach my $test (
      @NETSCAPE_TESTS, @IE_TESTS, @AOL_TESTS,
      @OPERA_TESTS
  ) {
      no strict 'refs';
      *{$test} = sub {
          my ($self) = @_;
          $self->_init_version() unless $self->{version_tests};
          return $self->{version_tests}->{$test} || 0;
      };
  }
  
  foreach my $test (@DEVICE_TESTS) {
      no strict 'refs';
      *{$test} = sub {
          my ($self) = @_;
          $self->_init_device() unless $self->{device_tests};
          return $self->{device_tests}->{$test} || 0;
      };
  }
  
  sub user_agent {
      my ( $self, $user_agent ) = @_;
      if ( defined($user_agent) ) {
          die
              'Calling HTTP::BrowserDetect::user_agent() with an argument is no longer allowed; please use new().';
      }
      else {
          return $self->{user_agent};
      }
  }
  
  ### Code for initializing various pieces of the object. Since it would
  ### be needlessly slow if we examined every user agent for every piece
  ### of information we might possibly need, we only initialize things
  ### when they're actually queried about. Specifically:
  ###
  ### _init_core() sets up:
  ###     $self->{browser_tests}
  ###     $self->{browser}
  ###     $self->{browser_string}
  ###     $self->{tests}
  ###     $self->{engine_version}
  ###     $self->{realplayer_version}
  ###
  ### _init_version() sets up:
  ###     $self->{version_tests}
  ###     $self->{major}
  ###     $self->{minor}
  ###     $self->{beta}
  ###     $self->{realplayer_version}
  ###
  ### _init_os() sets up:
  ###     $self->{os}
  ###     $self->{os_string}
  ###     $self->{os_tests}
  ###     $self->{os_version}
  ###
  ### _init_os_version() sets up:
  ###     $self->{os_version}
  ###
  ### _init_device() sets up:
  ###     $self->{device_tests}
  ###     $self->{device}
  ###     $self->{device_string}
  ###
  ### _init_robots() sets up:
  ###     $self->{robot}
  ###     $self->{robot_tests}
  ###     $self->{robot_string}
  ###     $self->{robot_version}
  ###
  
  # Private method -- Set up the basics (browser and misc attributes)
  # for a new user-agent string
  sub _init_core {
      my ( $self, $new_ua ) = @_;
  
      my $ua = lc $self->{user_agent};
  
      # any UA via Google Translate gets this appended
      $ua =~ s{,gzip\(gfe\)\z}{};
  
      # These get filled in immediately
      $self->{tests}         = {};
      $self->{browser_tests} = {};
  
      my $tests          = $self->{tests};
      my $browser_tests  = $self->{browser_tests};
      my $browser        = undef;
      my $browser_string = undef;
  
      # Detect engine
      $self->{engine_version} = undef;
  
      if ( $ua =~ m{edge/([\d.]+)$} ) {
          $tests->{edgehtml}      = 1;
          $self->{engine_version} = $1;
      }
      elsif ( $ua =~ /trident\/([\w\.\d]*)/ ) {
          $tests->{trident}       = 1;
          $self->{engine_version} = $1;
      }
      elsif ( index( $ua, 'gecko' ) != -1 && index( $ua, 'like gecko' ) == -1 )
      {
          $tests->{gecko} = 1;
          if ( $ua =~ /\([^)]*rv:([\w.\d]*)/ ) {
              $self->{engine_version} = $1;
          }
      }
      elsif ( $ua =~ m{applewebkit/([\d.\+]+)} ) {
          $tests->{webkit}        = 1;
          $self->{engine_version} = $1;
      }
      elsif ( $ua =~ m{presto/([\d.]+)} ) {
          $tests->{presto}        = 1;
          $self->{engine_version} = $1;
      }
      elsif ( $ua =~ m{khtml/([\d.]+)} ) {
          $tests->{khtml}         = 1;
          $self->{engine_version} = $1;
      }
  
      # Detect browser
  
      if ( index( $ua, 'galeon' ) != -1 ) {
  
          # Needs to go above firefox
  
          $browser = 'galeon';
          $browser_tests->{galeon} = 1;
      }
      elsif ( index( $ua, 'epiphany' ) != -1 ) {
  
          # Needs to go above firefox + mozilla
  
          $browser = 'epiphany';
          $browser_tests->{epiphany} = 1;
      }
      elsif ( $ua
          =~ m{^mozilla/[\d.]+ [(]windows (?:nt|phone) \d{2}\..+?[)] applewebkit/[\d.]+ [(]khtml,? like gecko[)] chrome/[\d.]+ (?:mobile )?safari/[\d.]+ edge/[\d.]+$}
      ) {
          $browser        = 'edge';
          $browser_string = 'Edge';
  
          $browser_tests->{edge} = 1;
      }
      elsif (
          $ua =~ m{
                  (firebird|iceweasel|phoenix|namoroka|firefox)
                  \/
                  ( [^.]* )           # Major version number is everything before first dot
                  \.                  # The first dot
                  ( [\d]* )           # Minor version nnumber is digits after first dot
              }xo
          && index( $ua, 'not firefox' ) == -1
          )    # Hack for Yahoo Slurp
      {
          # Browser is Firefox, possibly under an alternate name
  
          $browser        = 'firefox';
          $browser_string = ucfirst $1;
  
          $browser_tests->{$1} = 1;
          $browser_tests->{firefox} = 1;
      }
      elsif ( $ua =~ m{opera|opr\/} ) {
  
          # Browser is Opera
  
          $browser = 'opera';
          $browser_tests->{opera} = 1;
      }
      elsif ($tests->{trident}
          || index( $ua, 'msie' ) != -1
          || index( $ua, 'microsoft internet explorer' ) != -1 ) {
  
          # Browser is MSIE (possibly AOL branded)
  
          $browser = 'ie';
          $browser_tests->{ie} = 1;
  
          if (   index( $ua, 'aol' ) != -1
              || index( $ua, 'america online browser' ) != -1 ) {
              $browser_string = 'AOL Browser';
              $browser_tests->{aol} = 1;
          }
  
          # Disabled for now -- need to figure out how to deal with version numbers
          #elsif ( index ( $ua, 'acoobrowser' ) != -1 ) {
          #    $browser_string = 'Acoo Browser';
          #}
          #elsif ( index( $ua, 'avant' ) != -1 ) {
          #    $browser_string = 'Avant Browser';
          #}
          #elsif ( index( $ua, 'crazy browser' ) != -1 ) {
          #    $browser_string = 'Crazy Browser';
          #}
          #elsif ( index( $ua, 'deepnet explorer' ) != -1 ) {
          #    $browser_string = 'Deepnet Explorer';
          #}
          #elsif ( index( $ua, 'maxthon' ) != -1 ) {
          #    $browser_string = 'Maxthon';
          #}
      }
      elsif ( index( $ua, 'brave' ) != -1 ) {
  
          # Has to go above Chrome, it includes 'like Chrome/'
  
          $browser = 'brave';
          $browser_tests->{$browser} = 1;
      }
      elsif ( index( $ua, 'silk' ) != -1 ) {
  
          # Has to go above Chrome, it includes 'like Chrome/'
  
          $browser = 'silk';
          $browser_tests->{$browser} = 1;
      }
      elsif (index( $ua, 'chrome/' ) != -1
          || index( $ua, 'crios' ) != -1 ) {
  
          # Browser is Chrome
  
          $browser = 'chrome';
          $browser_tests->{chrome} = 1;
  
          if ( index( $ua, 'chromium' ) != -1 ) {
              $browser_string = 'Chromium';
          }
      }
      elsif (index( $ua, 'blackberry' ) != -1
          || index( $ua, 'bb10' ) != -1
          || index( $ua, 'rim tablet os' ) != -1 ) {
  
          # Has to go above Safari
          $browser = 'blackberry';    # test gets set during device check
      }
      elsif ( index( $ua, 'ucbrowser' ) != -1 ) {
  
          # Has to go above both Safari and Mozilla
  
          $browser = 'ucbrowser';
          $browser_tests->{$browser} = 1;
      }
      elsif (( index( $ua, 'safari' ) != -1 )
          || ( index( $ua, 'applewebkit' ) != -1 ) ) {
  
          # Browser is Safari
  
          $browser_tests->{safari} = 1;
          $browser = 'safari';
          if (   index( $ua, ' mobile safari/' ) != -1
              || index( $ua, 'mobilesafari' ) != -1 ) {
              $browser_string = 'Mobile Safari';
              $browser_tests->{mobile_safari} = 1;
          }
          if ( index( $ua, 'puffin' ) != -1 ) {
              $browser_string = 'Puffin';
          }
      }
      elsif ( index( $ua, 'neoplanet' ) != -1 ) {
  
          # Browser is Neoplanet
  
          $browser                    = 'ie';
          $browser_tests->{$browser}  = 1;
          $browser_tests->{neoplanet} = 1;
          $browser_tests->{neoplanet2} = 1 if ( index( $ua, '2.' ) != -1 );
      }
  
      ## The following browsers all need to be tested for *before*
      ## Mozilla, otherwise we'll think they are Mozilla because they
      ## look very much like it.
      elsif ( index( $ua, 'webtv' ) != -1 ) {
          $browser = 'webtv';
          $browser_tests->{$browser} = 1;
      }
      elsif ( index( $ua, 'nintendo 3ds' ) != -1 ) {
          $browser = 'n3ds';    # Test gets set during device check
      }
      elsif ( index( $ua, 'nintendo dsi' ) != -1 ) {
          $browser = 'dsi';     # Test gets set during device check
      }
      elsif (index( $ua, 'playstation 3' ) != -1
          || index( $ua, 'playstation portable' ) != -1
          || index( $ua, 'netfront' ) != -1 ) {
          $browser = 'netfront';
          $browser_tests->{$browser} = 1;
      }
      elsif ( index( $ua, 'browsex' ) != -1 ) {
          $browser = 'browsex';
          $browser_tests->{$browser} = 1;
      }
      elsif ( index( $ua, 'polaris' ) != -1 ) {
          $browser = 'polaris';
          $browser_tests->{$browser} = 1;
      }
  
      ## At this point if it looks like Mozilla but we haven't found
      ## anything else for it to be, it's probably Mozilla.
      elsif (index( $ua, 'mozilla' ) != -1
          && index( $ua, 'compatible' ) == -1 ) {
  
          # Browser is a Gecko-powered Netscape (i.e. Mozilla) version
  
          $browser = 'mozilla';
          if ( index( $ua, 'netscape' ) != -1
              || !$tests->{gecko} ) {
              $browser = 'netscape';
          }
          elsif ( index( $ua, 'seamonkey' ) != -1 ) {
              $browser = 'seamonkey';
          }
          $browser_tests->{$browser} = 1;
          $browser_tests->{netscape} = 1;
          $browser_tests->{mozilla}  = ( $tests->{gecko} );
      }
  
      ## Long series of unlikely browsers (ones that don't look like Mozilla)
      elsif ( index( $ua, 'staroffice' ) != -1 ) {
          $browser = 'staroffice';
          $browser_tests->{$browser} = 1;
      }
      elsif ( index( $ua, 'icab' ) != -1 ) {
          $browser = 'icab';
          $browser_tests->{$browser} = 1;
      }
      elsif ( index( $ua, 'lotus-notes' ) != -1 ) {
          $browser = 'lotusnotes';
          $browser_tests->{$browser} = 1;
      }
      elsif ( index( $ua, 'konqueror' ) != -1 ) {
          $browser = 'konqueror';
          $browser_tests->{$browser} = 1;
      }
      elsif ( index( $ua, 'lynx' ) != -1 ) {
          $browser = 'lynx';
          $browser_tests->{$browser} = 1;
      }
      elsif ( index( $ua, 'elinks' ) != -1 ) {
          $browser = 'elinks';
          $browser_tests->{$browser} = 1;
      }
      elsif ( index( $ua, 'links' ) != -1 ) {
          $browser = 'links';
          $browser_tests->{$browser} = 1;
      }
      elsif ( index( $ua, 'mosaic' ) != -1 ) {
          $browser = 'mosaic';
          $browser_tests->{$browser} = 1;
      }
      elsif ( index( $ua, 'emacs' ) != -1 ) {
          $browser = 'emacs';
          $browser_tests->{$browser} = 1;
      }
      elsif ( index( $ua, 'obigo' ) != -1 ) {
          $browser = 'obigo';
          $browser_tests->{$browser} = 1;
      }
      elsif ( index( $ua, 'teleca' ) != -1 ) {
          $browser                   = 'obigo';
          $browser_string            = 'Teleca';
          $browser_tests->{$browser} = 1;
      }
      elsif ( index( $ua, 'libcurl' ) != -1 || $ua =~ /^curl/ ) {
          $browser = 'curl';    # Test gets set during robot check
      }
      elsif ( index( $ua, 'puf/' ) != -1 ) {
          $browser = 'puf';     # Test gets set during robot check
      }
      elsif ( index( $ua, 'applecoremedia/' ) != -1 ) {
          $browser = 'applecoremedia';
          $browser_tests->{$browser} = 1;
      }
      elsif ( index( $ua, 'androiddownloadmanager' ) != -1 ) {
          $browser = 'adm';
          $browser_tests->{$browser} = 1;
      }
      elsif ( index( $ua, 'dalvik' ) != -1 ) {
          $browser = 'dalvik';
          $browser_tests->{$browser} = 1;
      }
      elsif ( index( $ua, 'apple-pubsub' ) != -1 ) {
          $browser = 'pubsub';
          $browser_tests->{$browser} = 1;
      }
      elsif ( index( $ua, 'imagesearcherpro' ) != -1 ) {
          $browser = 'imagesearcherpro';
          $browser_tests->{$browser} = 1;
      }
  
      $self->{browser}        = $browser;
      $self->{browser_string} = $browser_string || $BROWSER_NAMES{$browser}
          if defined $browser;
  
      # Other random tests
  
      $tests->{x11}    = 1 if index( $ua, 'x11' ) != -1;
      $tests->{dotnet} = 1 if index( $ua, '.net clr' ) != -1;
  
      if ( index( $ua, 'realplayer' ) != -1 ) {
  
          # Hack for Realplayer -- fix the version and 'real' browser
  
          $self->_init_version;  # Set appropriate tests for whatever the 'real'
                                 # browser is.
  
          # Now set the browser to Realplayer.
          $self->{browser}             = 'realplayer';
          $self->{browser_string}      = 'RealPlayer';
          $browser_tests->{realplayer} = 1;
  
          # Now override the version with the Realplayer version (but leave
          # alone the tests we already set, which might have been based on the
          # 'real' browser's version).
          $self->{realplayer_version} = undef;
  
          if ( $ua =~ /realplayer\/([\d+\.]+)/ ) {
              $self->{realplayer_version} = $1;
              ( $self->{major}, $self->{minor} )
                  = split( /\./, $self->{realplayer_version} );
              $self->{minor} = ".$self->{minor}" if defined $self->{minor};
          }
          elsif ( $ua =~ /realplayer\s(\w+)/ ) {
              $self->{realplayer_version} = $1;
          }
      }
  
      if ( index( $ua, '(r1 ' ) != -1 ) {
  
          # Realplayer plugin -- don't override browser but do set property
          $browser_tests->{realplayer} = 1;
      }
  
      # Details: https://developer.chrome.com/multidevice/user-agent#webview_user_agent
      if (   ( $self->android && index( $ua, '; wv)' ) > 0 )
          || ( $self->chrome && $self->android && $self->browser_major >= 30 ) )
      {
          $tests->{webview} = 1;
      }
  
  }
  
  # Any of these fragments within a user-agent generally indicates it's
  # a robot.
  my @ROBOT_FRAGMENTS = qw(
      agent
      analy
      appender
      babya
      checker
      bot
      copy
      crawl
      explorador
      fetch
      find
      ia_archive
      index
      netcraft
      reap
      resolver
      sleuth
      scan
      service
      spider
      thumbtack-thunderdome
      tiscali
      validator
      verif
      webcapture
      worm
      zyborg
  );
  
  my %ROBOT_FRAGMENT_EXCEPTIONS = (
      bot => ['cubot'],
  );
  
  sub _init_robots {
      my $self = shift;
  
      my $ua            = lc $self->{user_agent};
      my $tests         = $self->{tests};
      my $browser_tests = $self->{browser_tests};
  
      my $robot_tests = $self->{robot_tests} = {};
      my $id;
      my $r;
  
      my $robot_fragment;    # The text that indicates it's a robot (we'll
                             # use this later to detect robot version, and
                             # maybe robot_string)
  
      if ( index( $ua, 'libwww-perl' ) != -1 || index( $ua, 'lwp-' ) != -1 ) {
          $r                  = 'lwp';
          $robot_tests->{lib} = 1;
          $robot_fragment     = (
              ( index( $ua, 'libwww-perl' ) != -1 ) ? 'libwww-perl' : 'lwp-' );
      }
      elsif ( index( $ua, 'slurp' ) != -1 ) {
          $r = 'slurp';
          $robot_tests->{yahoo} = 1;
      }
      elsif (index( $ua, 'yahoo' ) != -1
          && index( $ua, 'jp.co.yahoo.android' ) == -1 ) {
          $r = 'yahoo';
      }
      elsif ( index( $ua, 'msnbot-mobile' ) != -1 ) {
          $r                  = 'msnmobile';
          $robot_tests->{msn} = 1;
          $robot_fragment     = 'msnbot';
      }
      elsif ( index( $ua, 'bingbot-mobile' ) != -1 ) {
          $r                      = 'bingbot';
          $robot_tests->{bingbot} = 1;
          $robot_fragment         = 'bingbot';
      }
      elsif ( index( $ua, 'msnbot' ) != -1 ) {
          $r              = 'msn';
          $robot_fragment = 'msnbot';
      }
      elsif (index( $ua, 'binglocalsearch' ) != -1
          || index( $ua, 'bingbot' ) != -1
          || index( $ua, 'bingpreview' ) != -1 ) {
          $r                      = 'bingbot';
          $robot_tests->{bingbot} = 1;
          $robot_fragment         = 'bingbot';
      }
      elsif ( index( $ua, 'microsoft office existence discovery' ) != -1 ) {
          $r              = 'msoffice';
          $robot_fragment = 'office';
      }
      elsif ( index( $ua, 'ahrefsbot' ) != -1 ) {
          $r = 'ahrefs';
      }
      elsif ( index( $ua, 'altavista' ) != -1 ) {
          $r = 'altavista';
      }
      elsif ( index( $ua, 'apache-httpclient' ) != -1 ) {
          $r = 'apache';
      }
      elsif ( $ua =~ m{\( *\) *\{ *\: *\; *} ) {
  
          # Shellcode for spawning a process, i.e. (){:;} with some kind of whitespace interleaved
          $r = 'malware';
      }
      elsif ( index( $ua, 'ask jeeves/teoma' ) != -1 ) {
          $r              = 'askjeeves';
          $robot_fragment = 'teoma';
      }
      elsif ( index( $ua, 'baiduspider' ) != -1 ) {
          $r = 'baidu';
      }
      elsif ( index( $ua, 'libcurl' ) != -1 || $ua =~ /^curl/ ) {
          $r = 'curl';
          $robot_tests->{lib} = 1;
      }
      elsif ( index( $ua, 'facebookexternalhit' ) != -1 ) {
          $r = 'facebook';
      }
      elsif ( index( $ua, 'getright' ) != -1 ) {
          $r = 'getright';
      }
      elsif ( index( $ua, 'adsbot-google' ) != -1 ) {
          $r                     = 'googleadsbot';
          $robot_tests->{google} = 1;
          $robot_fragment        = 'adsbot-google';
      }
      elsif ( index( $ua, 'mediapartners-google' ) != -1 ) {
          $r                     = 'googleadsense';
          $robot_tests->{google} = 1;
          $robot_fragment        = 'mediapartners-google';
      }
      elsif ( index( $ua, 'google favicon' ) != -1 ) {
          $r                     = 'googlefavicon';
          $robot_tests->{google} = 1;
          $robot_fragment        = 'favicon';
      }
      elsif ( index( $ua, 'googlebot-image' ) != -1 ) {
          $r                     = 'googlebotimage';
          $robot_tests->{google} = 1;
          $robot_fragment        = 'googlebot-image';
      }
      elsif ( index( $ua, 'googlebot-news' ) != -1 ) {
          $r                     = 'googlebotnews';
          $robot_tests->{google} = 1;
          $robot_fragment        = 'googlebot-news';
      }
      elsif ( index( $ua, 'googlebot-video' ) != -1 ) {
          $r                     = 'googlebotvideo';
          $robot_tests->{google} = 1;
          $robot_fragment        = 'googlebot-video';
      }
      elsif ( index( $ua, 'googlebot-mobile' ) != -1 ) {
          $r                     = 'googlemobile';
          $robot_tests->{google} = 1;
          $robot_fragment        = 'googlebot-mobile';
      }
      elsif ( index( $ua, 'googlebot' ) != -1 ) {
          $r = 'google';
      }
      elsif ( $ua =~ m{go.*package http} ) {
          $r                  = 'golib';
          $robot_tests->{lib} = 1;
          $robot_fragment     = 'package';
      }
      elsif ( $ua =~ m{^http_request} ) {
          $r                  = 'phplib';
          $robot_tests->{lib} = 1;
          $robot_fragment     = 'http_request';
      }
      elsif ( $ua =~ m{^http_request} ) {
          $r = 'phplib';
          $robot_tests->{lib} = 1;
      }
      elsif ( index( $ua, 'indy library' ) != -1 ) {
          $r = 'indy';
          $robot_tests->{lib} = 1;
      }
      elsif ( index( $ua, 'infoseek' ) != -1 ) {
          $r = 'infoseek';
      }
      elsif ( index( $ua, 'ips-agent' ) != -1 ) {
          $r              = 'ipsagent';
          $robot_fragment = 'ips-agent';
      }
      elsif ( index( $ua, 'lecodechecker' ) != -1 ) {
          $r              = 'linkexchange';
          $robot_fragment = 'lecodechecker';
      }
      elsif ( index( $ua, 'linkchecker' ) != -1 ) {
          $r = 'linkchecker';
      }
      elsif ( index( $ua, 'lycos' ) != -1 ) {
          $r = 'lycos';
      }
      elsif ( index( $ua, 'mechanize' ) != -1 ) {
          $r                  = 'rubylib';
          $robot_tests->{lib} = 1;
          $robot_fragment     = 'mechanize';
      }
      elsif ( index( $ua, 'mj12bot/' ) != -1 ) {
          $r = 'mj12bot';
      }
      elsif ( index( $ua, 'nutch' ) != -1 ) {
          $r = 'nutch';
      }
      elsif ( index( $ua, 'puf/' ) != -1 ) {
          $r = 'puf';
          $robot_tests->{lib} = 1;
      }
      elsif ( index( $ua, 'scooter' ) != -1 ) {
          $r = 'scooter';
      }
      elsif ( index( $ua, 'special_archiver' ) != -1 ) {
          $r              = 'specialarchiver';
          $robot_fragment = 'special_archiver';
      }
      elsif ( index( $ua, 'wget' ) == 0 ) {
          $r = 'wget';
      }
      elsif ( index( $ua, 'yandexbot' ) != -1 ) {
          $r = 'yandex';
      }
      elsif ( index( $ua, 'yandeximages' ) != -1 ) {
          $r = 'yandeximages';
      }
      elsif ( $ua =~ m{^java} && !$self->{browser} ) {
          $r = 'java';
          $robot_tests->{lib} = 1;
      }
      elsif ( index( $ua, 'jdk' ) != -1 ) {
          $r                  = 'java';
          $robot_tests->{lib} = 1;
          $robot_fragment     = 'jdk';
      }
      elsif ( index( $ua, 'jakarta commons-httpclient' ) != -1 ) {
          $r                  = 'java';
          $robot_tests->{lib} = 1;
          $robot_fragment     = 'jakarta';
      }
      elsif ( index( $ua, 'google-http-java-client' ) != -1 ) {
          $r                  = 'java';
          $robot_tests->{lib} = 1;
          $robot_fragment     = 'google';
      }
      elsif ( index( $ua, 'researchscan.comsys.rwth-aachen.de' ) != -1 ) {
          $r = 'researchscan';
      }
  
      # These @ROBOT_TESTS were added in 3.15.  Some of them may need more
      # individualized treatment, but get them identified as bots for now.
  
      # XXX
      else {
      TEST:
          for my $set (@ROBOT_TESTS) {
              my $match = lc $set->[0];
  
              if ( index( $ua, lc($match) ) != -1 ) {
                  $id             = $set->[1];
                  $r              = $id;
                  $robot_fragment = lc $match;
                  last TEST;
              }
          }
      }
  
      if (   $browser_tests->{applecoremedia}
          || $browser_tests->{dalvik}
          || $browser_tests->{adm} ) {
          $robot_tests->{lib} = 1;
      }
  
      if ($r) {
  
          # Got a named robot
          $robot_tests->{$r} = 1;
          if ( !$id ) {
              $id = $ROBOT_IDS{$r};
          }
  
          if ( !exists $robot_tests->{robot_id} ) {
              $robot_tests->{robot_id} = $id;
          }
  
          # This isn't all keyed on ids (yet)
          $self->{robot_string} = $ROBOT_NAMES{$id} || $ROBOT_NAMES{$r};
          $robot_tests->{robot} = $r;
          $robot_fragment = $r if !defined $robot_fragment;
      }
      elsif ( $ua =~ /seek (?! mo (?: toolbar )? \s+ \d+\.\d+ )/x ) {
  
          # Store the fragment for later, to determine full name
          $robot_fragment = 'seek';
          $robot_tests->{robot} = 'unknown';
      }
      elsif ( $ua =~ /search (?! [\w\s]* toolbar \b | bar \b | erpro \b )/x ) {
  
          # Store the fragment for later, to determine full name
          $robot_fragment = 'search';
          $robot_tests->{robot} = 'unknown';
      }
      elsif ( $self->{user_agent} =~ /([\w \/\.\-]+)[ \;\(\)]*\+https?\:/i ) {
  
          # Something followed by +http
          $self->{robot_string} = $1;
          $self->{robot_string} =~ s/^ *(.+?)[ \;\(\)]*?( *\/[\d\.]+ *)?$/$1/;
          $robot_fragment = $1;
          $robot_tests->{robot} = 'unknown';
      }
      else {
          # See if we have a simple fragment
      FRAGMENT:
          for my $fragment (@ROBOT_FRAGMENTS) {
              if ( $ROBOT_FRAGMENT_EXCEPTIONS{$fragment} ) {
                  for my $exception (
                      @{ $ROBOT_FRAGMENT_EXCEPTIONS{$fragment} || [] } ) {
                      if ( index( $ua, $exception ) != -1 ) {
                          next FRAGMENT;
                      }
                  }
              }
  
              if ( index( $ua, $fragment ) != -1 ) {
                  $robot_fragment = $fragment;
                  $robot_tests->{robot} = 'unknown';
                  last;
              }
          }
      }
  
      if ( exists $robot_tests->{robot} && $robot_tests->{robot} eq 'unknown' )
      {
          $robot_tests->{robot_id} = 'unknown';
      }
  
      if ( defined $robot_fragment ) {
  
          # Examine what surrounds the fragment; that leads us to the
          # version and the string (if we haven't explicitly set one).
  
          if (
              $self->{user_agent} =~ m{\s*                # Beginning whitespace
                                        ([\w .:,\-\@\/]*  # Words before fragment
                                         $robot_fragment  # Match the fragment
                                         [\w .:,\-\@\/]*) # Words after fragment
                                       }ix
          ) {
              my $full_string = $1;
              $full_string =~ s/ *$//;    # Trim whitespace at end
              if (
                     $self->{user_agent} eq $full_string
                  && $self->{user_agent} =~ m{\/.*\/}
                  && $self->{user_agent} =~ m{
                                        ([\w]*               # Words before fragment
                                             $robot_fragment     # Match the fragment
                                             (\/[\d\.]+)?        # Version
                                             [\w]*)              # Beta stuff
                                           }ix
              ) {
                  # We matched the whole string, but it seems to
                  # make more sense as whitespace-separated
                  # 'thing/ver' tokens
                  $full_string = $1;
              }
  
              # Figure out robot version based on the string
              if (    $full_string
                  and $full_string =~ s/[\/ \.v]*(\d+)(\.\d+)?([\.\w]*)$// ) {
                  $self->{robot_version} = [ $1, $2, $3 ];
              }
              else {
                  $self->{robot_version} = undef;
              }
  
              # Set robot_string, if we don't already have an explictly set
              # one
              if ( !defined $self->{robot_string} ) {
                  $self->{robot_string} = $full_string;
              }
          }
      }
  
      if ( !exists( $self->{robot_version} ) ) {
          $self->{robot_version} = undef;
      }
  }
  
  ### OS tests, only run on demand
  
  sub _init_os {
      my $self = shift;
  
      my $tests         = $self->{tests};
      my $browser_tests = $self->{browser_tests};
      my $ua            = lc $self->{user_agent};
  
      my $os_tests = $self->{os_tests} = {};
      my $os       = undef;
      my $os_string = undef;
  
      # Windows
  
      if ( index( $ua, '16bit' ) != -1 ) {
          $os        = 'windows';
          $os_string = '16-bit Windows';
          $os_tests->{win16} = $os_tests->{windows} = 1;
      }
  
      if ( index( $ua, 'win' ) != -1 ) {
          if (   index( $ua, 'win16' ) != -1
              || index( $ua, 'windows 3' ) != -1
              || index( $ua, 'windows 16-bit' ) != -1 ) {
              $os_tests->{win16} = 1;
              $os_tests->{win3x} = 1;
              $os                = 'windows';
              if ( index( $ua, 'windows 3.1' ) != -1 ) {
                  $os_tests->{win31} = 1;
                  $os_string = 'Win3x';    # FIXME bug compatibility
              }
              else {
                  $os_string = 'Win3x';
              }
          }
          elsif (index( $ua, 'win95' ) != -1
              || index( $ua, 'windows 95' ) != -1 ) {
              $os        = 'windows';
              $os_string = 'Win95';
              $os_tests->{win95} = $os_tests->{win32} = 1;
          }
          elsif (
              index( $ua, 'win 9x 4.90' ) != -1    # whatever
              || index( $ua, 'windows me' ) != -1
          ) {
              $os        = 'windows';
              $os_string = 'WinME';
              $os_tests->{winme} = $os_tests->{win32} = 1;
          }
          elsif (index( $ua, 'win98' ) != -1
              || index( $ua, 'windows 98' ) != -1 ) {
              $os        = 'windows';
              $os_string = 'Win98';
              $os_tests->{win98} = $os_tests->{win32} = 1;
          }
          elsif ( index( $ua, 'windows 2000' ) != -1 ) {
              $os        = 'windows';
              $os_string = 'Win2k';
              $os_tests->{win2k} = $os_tests->{winnt} = $os_tests->{win32} = 1;
          }
          elsif ( index( $ua, 'windows ce' ) != -1 ) {
              $os                = 'windows';
              $os_string         = 'WinCE';
              $os_tests->{wince} = 1;
          }
          elsif ( index( $ua, 'windows phone' ) != -1 ) {
              $os = 'winphone';
              $os_tests->{winphone} = 1;
  
              if ( index( $ua, 'windows phone os 7.0' ) != -1 ) {
                  $os_tests->{winphone7} = 1;
              }
              elsif ( index( $ua, 'windows phone os 7.5' ) != -1 ) {
                  $os_tests->{winphone7_5} = 1;
              }
              elsif ( index( $ua, 'windows phone 8.0' ) != -1 ) {
                  $os_tests->{winphone8} = 1;
              }
              elsif ( index( $ua, 'windows phone 8.1' ) != -1 ) {
                  $os_tests->{winphone8_1} = 1;
              }
              elsif ( index( $ua, 'windows phone 10.0' ) != -1 ) {
                  $os_tests->{winphone10} = 1;
              }
          }
      }
  
      if ( index( $ua, 'nt' ) != -1 ) {
          if (   index( $ua, 'nt 5.0' ) != -1
              || index( $ua, 'nt5' ) != -1 ) {
              $os        = 'windows';
              $os_string = 'Win2k';
              $os_tests->{win2k} = $os_tests->{winnt} = $os_tests->{win32} = 1;
          }
          elsif ( index( $ua, 'nt 5.1' ) != -1 ) {
              $os        = 'windows';
              $os_string = 'WinXP';
              $os_tests->{winxp} = $os_tests->{winnt} = $os_tests->{win32} = 1;
          }
          elsif ( index( $ua, 'nt 5.2' ) != -1 ) {
              $os        = 'windows';
              $os_string = 'Win2k3';
              $os_tests->{win2k3} = $os_tests->{winnt} = $os_tests->{win32} = 1;
          }
          elsif ( index( $ua, 'nt 6.0' ) != -1 ) {
              $os        = 'windows';
              $os_string = 'WinVista';
              $os_tests->{winvista} = $os_tests->{winnt} = $os_tests->{win32}
                  = 1;
          }
          elsif ( index( $ua, 'nt 6.1' ) != -1 ) {
              $os        = 'windows';
              $os_string = 'Win7';
              $os_tests->{win7} = $os_tests->{winnt} = $os_tests->{win32} = 1;
          }
          elsif ( index( $ua, 'nt 6.2' ) != -1 ) {
              $os        = 'windows';
              $os_string = 'Win8.0';
              $os_tests->{win8_0} = $os_tests->{win8} = $os_tests->{winnt}
                  = $os_tests->{win32} = 1;
          }
          elsif ( index( $ua, 'nt 6.3' ) != -1 ) {
              $os        = 'windows';
              $os_string = 'Win8.1';
              $os_tests->{win8_1} = $os_tests->{win8} = $os_tests->{winnt}
                  = $os_tests->{win32} = 1;
          }
          elsif ( index( $ua, 'nt 10.0' ) != -1 ) {
              $os        = 'windows';
              $os_string = 'Win10.0';
              $os_tests->{win10_0} = $os_tests->{win10} = $os_tests->{winnt}
                  = $os_tests->{win32} = 1;
          }
          elsif (index( $ua, 'winnt' ) != -1
              || index( $ua, 'windows nt' ) != -1
              || index( $ua, 'nt4' ) != -1
              || index( $ua, 'nt3' ) != -1 ) {
              $os        = 'windows';
              $os_string = 'WinNT';
              $os_tests->{winnt} = $os_tests->{win32} = 1;
          }
      }
  
      if ($os) {
  
          # windows, set through some path above
          $os_tests->{windows} = 1;
          $os_tests->{win32}   = 1 if index( $ua, 'win32' ) != -1;
      }
      elsif ( index( $ua, 'macintosh' ) != -1 || index( $ua, 'mac_' ) != -1 ) {
  
          # Mac operating systems
          $os_tests->{mac} = 1;
          if ( index( $ua, 'mac os x' ) != -1 ) {
              $os = 'macosx';
              $os_tests->{$os} = 1;
          }
          else {
              $os = 'mac';
          }
          if ( index( $ua, '68k' ) != -1 || index( $ua, '68000' ) != -1 ) {
              $os_tests->{mac68k} = 1;
          }
          elsif ( index( $ua, 'ppc' ) != -1 || index( $ua, 'powerpc' ) != -1 ) {
              $os_tests->{macppc} = 1;
          }
      }
      elsif (index( $ua, 'ipod' ) != -1
          || index( $ua, 'iphone' ) != -1
          || index( $ua, 'ipad' ) != -1 ) {
  
          # iOS
          $os = 'ios';
          $os_tests->{$os} = 1;
      }
      elsif ( index( $ua, 'android' ) != -1 ) {
  
          # Android
          $os = 'android';    # Test gets set in the device testing
      }
      elsif ( index( $ua, 'inux' ) != -1 ) {
  
          # Linux
          $os = 'linux';
          $os_tests->{linux} = $os_tests->{unix} = 1;
      }
      elsif ( $tests->{x11} && index( $ua, 'cros' ) != -1 ) {
  
          # ChromeOS
          $os = 'chromeos';
          $os_tests->{chromeos} = 1;
      }
      ## Long series of unlikely OSs
      elsif ( index( $ua, 'amiga' ) != -1 ) {
          $os = 'amiga';
          $os_tests->{$os} = 1;
      }
      elsif ( index( $ua, 'os/2' ) != -1 ) {
          $os = 'os2';
          $os_tests->{$os} = 1;
      }
      elsif ( index( $ua, 'solaris' ) != -1 ) {
          $os        = 'unix';
          $os_string = 'Solaris';
          $os_tests->{sun} = $os_tests->{unix} = 1;
      }
      elsif ( index( $ua, 'samsung' ) == -1 && index( $ua, 'sun' ) != -1 ) {
          $os        = 'unix';
          $os_string = 'SunOS';
          $os_tests->{sun} = $os_tests->{unix} = 1;
          $os_tests->{suni86} = 1 if index( $ua, 'i86' ) != -1;
          $os_tests->{sun4}   = 1 if index( $ua, 'sunos 4' ) != -1;
          $os_tests->{sun5}   = 1 if index( $ua, 'sunos 5' ) != -1;
      }
      elsif ( index( $ua, 'irix' ) != -1 ) {
          $os        = 'unix';
          $os_string = 'Irix';
          $os_tests->{irix} = $os_tests->{unix} = 1;
          $os_tests->{irix5} = 1 if ( index( $ua, 'irix5' ) != -1 );
          $os_tests->{irix6} = 1 if ( index( $ua, 'irix6' ) != -1 );
      }
      elsif ( index( $ua, 'hp-ux' ) != -1 ) {
          $os        = 'unix';
          $os_string = 'HP-UX';
          $os_tests->{hpux} = $os_tests->{unix} = 1;
          $os_tests->{hpux9}  = 1 if index( $ua, '09.' ) != -1;
          $os_tests->{hpux10} = 1 if index( $ua, '10.' ) != -1;
      }
      elsif ( index( $ua, 'aix' ) != -1 ) {
          $os        = 'unix';
          $os_string = 'AIX';
          $os_tests->{aix} = $os_tests->{unix} = 1;
          $os_tests->{aix1} = 1 if ( index( $ua, 'aix 1' ) != -1 );
          $os_tests->{aix2} = 1 if ( index( $ua, 'aix 2' ) != -1 );
          $os_tests->{aix3} = 1 if ( index( $ua, 'aix 3' ) != -1 );
          $os_tests->{aix4} = 1 if ( index( $ua, 'aix 4' ) != -1 );
      }
      elsif ( $ua =~ m{\bsco\b} || index( $ua, 'unix_sv' ) != -1 ) {
          $os        = 'unix';
          $os_string = 'SCO Unix';
          $os_tests->{sco} = $os_tests->{unix} = 1;
      }
      elsif ( index( $ua, 'unix_system_v' ) != -1 ) {
          $os        = 'unix';
          $os_string = 'System V Unix';
          $os_tests->{unixware} = $os_tests->{unix} = 1;
      }
      elsif ( $ua =~ m{\bncr\b} ) {
          $os        = 'unix';
          $os_string = 'NCR Unix';
          $os_tests->{mpras} = $os_tests->{unix} = 1;
      }
      elsif ( index( $ua, 'reliantunix' ) != -1 ) {
          $os        = 'unix';
          $os_string = 'Reliant Unix';
          $os_tests->{reliant} = $os_tests->{unix} = 1;
      }
      elsif (index( $ua, 'dec' ) != -1
          || index( $ua, 'osf1' ) != -1
          || index( $ua, 'declpha' ) != -1
          || index( $ua, 'alphaserver' ) != -1
          || index( $ua, 'ultrix' ) != -1
          || index( $ua, 'alphastation' ) != -1 ) {
          $os = 'unix';
          $os_tests->{dec} = $os_tests->{unix} = 1;
      }
      elsif ( index( $ua, 'sinix' ) != -1 ) {
          $os = 'unix';
          $os_tests->{sinix} = $os_tests->{unix} = 1;
      }
      elsif ( index( $ua, 'bsd' ) != -1 ) {
          $os = 'unix';
          if ( $self->{user_agent} =~ m{(\w*bsd\w*)}i ) {
              $os_string = $1;
          }
          $os_tests->{bsd} = $os_tests->{unix} = 1;
          $os_tests->{freebsd} = 1 if index( $ua, 'freebsd' ) != -1;
      }
      elsif ( $tests->{x11} ) {
  
          # Some Unix we didn't identify
          $os = 'unix';
          $os_tests->{unix} = 1;
      }
      elsif ( index( $ua, 'vax' ) != -1 || index( $ua, 'openvms' ) != -1 ) {
  
          $os = 'vms';
          $os_tests->{vms} = 1;
      }
      elsif ( index( $ua, 'bb10' ) != -1 ) {
          $os = 'bb10';
          $os_tests->{bb10} = 1;
      }
      elsif ( index( $ua, 'rim tablet os' ) != -1 ) {
          $os = 'rimtabletos';
          $os_tests->{rimtabletos} = 1;
      }
      elsif ( index( $ua, 'playstation 3' ) != -1 ) {
          $os = 'ps3gameos';
          $os_tests->{ps3gameos} = 1;
      }
      elsif ( index( $ua, 'playstation portable' ) != -1 ) {
          $os = 'pspgameos';
          $os_tests->{pspgameos} = 1;
      }
      elsif ( index( $ua, 'windows' ) != -1 ) {
  
          # Windows again, the super generic version
          $os_tests->{windows} = 1;
      }
      elsif ( index( $ua, 'win32' ) != -1 ) {
          $os_tests->{win32} = $os_tests->{windows} = 1;
      }
      elsif ( $self->{user_agent} =~ m{(brew)|(\bbmp\b)}i ) {
          $os = 'brew';
          if ($1) {
              $os_string = 'Brew';
          }
          else {
              $os_string = 'Brew MP';
          }
          $os_tests->{brew} = 1;
      }
      else {
          $os = undef;
      }
  
      # To deal with FirefoxOS we seem to have to load-on-demand devices
      # also, by calling ->mobile and ->tablet. We have to be careful;
      # if we ever created a loop back from _init_devices to _init_os
      # we'd run forever.
      if (  !$os
          && $browser_tests->{firefox}
          && index( $ua, 'fennec' ) == -1
          && ( $self->mobile || $self->tablet ) ) {
          $os = 'firefoxos';
          $os_tests->{firefoxos} = 1;
      }
  
      $self->{os} = $os;
      if ( $os and !$os_string ) {
          $os_string = $OS_NAMES{$os};
      }
      $self->{os_string} = $os_string;
  }
  
  sub _init_os_version {
      my ($self) = @_;
  
      my $os        = $self->os;
      my $os_string = $self->os_string;
      my $ua        = lc $self->{user_agent};
  
      my $os_version = undef;
  
      if ( !defined $os ) {
  
          # Nothing is going to work if we have no OS. Skip everything.
      }
      elsif ( $os eq 'winphone' ) {
          if ( $ua =~ m{windows phone (?:os )?(\d+)(\.?\d*)([\.\d]*)} ) {
              $os_version = [ $1, $2, $3 ];
          }
      }
      elsif ( $os eq 'macosx' ) {
          if ( $ua =~ m{os x (\d+)[\._](\d+)[\._]?(\d*)} ) {
              $os_version = [ $1, ".$2", length($3) ? ".$3" : q{} ];
          }
      }
      elsif ( $os eq 'ios' ) {
          if ( $ua =~ m{ os (\d+)[\._ ](\d+)[\._ ]?(\d*)} ) {
              $os_version = [ $1, ".$2", length($3) ? ".$3" : q{} ];
          }
      }
      elsif ( $os eq 'chromeos' ) {
          if ( $ua =~ m{ cros \S* (\d+)(\.?\d*)([\.\d]*)} ) {
              $os_version = [ $1, $2, $3 ];
          }
      }
      elsif ( $os eq 'android' ) {
          if ( $ua =~ m{android (\d+)(\.?\d*)([\w\-\.]*)[\;\)]} ) {
              $os_version = [ $1, $2, $3 ];
          }
      }
      elsif ( $os eq 'firefoxos' ) {
          if ( $ua =~ m{firefox/(\d+)(\.?\d*)([\.\d]*)} ) {
              $os_version = [ $1, $2, $3 ];
          }
      }
      elsif ( $os eq 'brew' ) {
          if ( $ua =~ m{(brew|\bbmp) (\d+)(\.?\d*)([\.\d]*)} ) {
              $os_version = [ $2, $3, $4 ];
          }
      }
  
      # Set the version. It might be set to undef, in which case we know
      # not to go through this next time.
      $self->{os_version} = $os_version;
  }
  
  ### Version determination, only run on demand
  
  sub _init_version {
      my ($self) = @_;
  
      my $ua            = lc $self->{user_agent};
      my $tests         = $self->{tests};
      my $browser_tests = $self->{browser_tests};
      my $browser       = $self->{browser};
  
      $self->{version_tests} = {};
      my $version_tests = $self->{version_tests};
  
      my ( $major, $minor, $beta );
  
      ### First figure out version numbers. First, we test if we're
      ### using a browser that needs some special method to determine
      ### the version.
  
      if ( defined $browser && $browser eq 'opera' ) {
  
          # Opera has a 'compatible; ' section, but lies sometimes. It needs
          # special handling.
  
          # http://dev.opera.com/articles/view/opera-ua-string-changes/
          # http://my.opera.com/community/openweb/idopera/
          # Opera/9.80 (S60; SymbOS; Opera Mobi/320; U; sv) Presto/2.4.15 Version/10.00
          # Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.52 Safari/537.36 OPR/15.0.1147.100
  
          if ( $ua =~ m{\AOpera.*\sVersion/(\d*)\.(\d*)\z}i ) {
              $major = $1;
              $minor = $2;
          }
          elsif ( $ua =~ m{\bOPR/(\d+)\.(\d+)}i ) {
              $major = $1;
              $minor = $2;
          }
          elsif ( $ua =~ m{Opera[ /](\d+).(\d+)}i ) {
              $major = $1;
              $minor = $2;
          }
      }
      elsif ( $ua
          =~ m{\b compatible; \s* [\w\-]* [/\s] ( [0-9]+ ) (?: .([0-9]+) (\S*) )? ;}x
      ) {
          # MSIE and some others use a 'compatible' format
          ( $major, $minor, $beta ) = ( $1, $2, $3 );
      }
      elsif ( !$browser ) {
  
          # Nothing else is going to work if $browser isn't defined; skip the
          # specific approaches and go straight to the generic ones.
      }
      elsif ( $browser_tests->{edge} ) {
          ( $major, $minor, $beta ) = $ua =~ m{Edge/(\d+)(.\d+)(.\d+)?};
      }
      elsif ( $browser_tests->{safari} ) {
  
          # Safari Version
  
          if (
              0
              && $ua =~ m{ # Disabled for bug compatibility
                  version/
                  ( \d+ )       # Major version number is everything before first dot
                  \.            # First dot
                  ( \d+ )?      # Minor version number follows dot
              }x
          ) {
              # Safari starting with version 3.0 provides its own public version
              ( $major, $minor ) = ( $1, $2, undef );
          }
          elsif ( $ua =~ m{ safari/ ( \d+ (?: \.\d+ )* ) }x ) {
              if ( my ( $safari_build, $safari_minor ) = split /\./, $1 ) {
                  $major = int( $safari_build / 100 );
                  $minor = int( $safari_build % 100 );
                  $beta  = ".$safari_minor" if defined $safari_minor;
              }
          }
          elsif ( $ua =~ m{applewebkit\/([\d\.]{1,})}xi ) {
              if ( my ( $safari_build, $safari_minor ) = split /\./, $1 ) {
                  $major = int( $safari_build / 100 );
                  $minor = int( $safari_build % 100 );
                  $beta  = ".$safari_minor" if $safari_minor;
              }
          }
      }
      elsif ( $browser_tests->{ie} ) {
  
          # MSIE
  
          if ( $ua =~ m{\b msie \s ( [0-9\.]+ ) (?: [a-z]+ [a-z0-9]* )? ;}x ) {
  
              # Internet Explorer
              ( $major, $minor, $beta ) = split /\./, $1;
          }
          elsif ( $ua =~ m{\b rv: ( [0-9\.]+ ) \b}x ) {
  
              # MSIE masking as Gecko really well ;)
              ( $major, $minor, $beta ) = split /\./, $1;
          }
      }
      elsif ( $browser eq 'n3ds' ) {
          if ( $ua =~ m{Nintendo 3DS;.*\sVersion/(\d*)\.(\d*)}i ) {
              $major = $1;
              $minor = $2;
          }
      }
      elsif ( $browser eq 'browsex' ) {
          if ( $ua =~ m{BrowseX \((\d+)\.(\d+)([\d.]*)}i ) {
              $major = $1;
              $minor = $2;
              $beta  = $3;
          }
      }
      elsif ( $ua =~ m{netscape6/(\d+)\.(\d+)([\d.]*)} ) {
  
          # Other cases get handled below, we just need this to skip the '6'
          $major = $1;
          $minor = $2;
          $beta  = $3;
      }
      elsif ( $browser eq 'brave' ) {
  
          # Note: since 0.7.10, Brave has changed the branding
          # of GitHub's 'Electron' (http://electron.atom.io/) to 'Brave'.
          # This means the browser string has both 'brave/' (the browser)
          # and 'Brave/' (re-branded Electron) in it.
          # The generic section below looks at $self->{browser_string}, which is 'Brave'
          # (Electron) and not $self->{browser} which is 'brave'.
          # Caveat parser.
          if ( $ua =~ m{brave/(\d+)\.(\d+)([\d.]*)} ) {
              $major = $1;
              $minor = $2;
              $beta  = $3;
          }
      }
      elsif ($browser eq 'chrome'
          && $ua =~ m{crios/(\d+)\.(\d+)([\d.]*)} ) {
          $major = $1;
          $minor = $2;
          $beta  = $3;
      }
      elsif ($browser eq 'pubsub'
          && $ua =~ m{apple-pubsub/(\d+)\.?(\d+)?([\d.]*)} ) {
          $major = $1;
          $minor = $2;
          $beta  = $3;
      }
      elsif ($browser eq 'obigo'
          && $self->{user_agent} =~ m{(obigo[\w\-]*|teleca)[\/ ]\w(\d+)(\w*)}i )
      {
          $major = $2;
          $minor = q{};
          $beta  = $3;
      }
      elsif ($browser eq 'polaris'
          && $ua =~ m{polaris[ \/](\d+)\.?(\d+)?([\d\.]*)} ) {
          $major = $1;
          $minor = $2;
          $beta  = $3;
      }
      elsif ($browser eq 'ucbrowser'
          && $ua =~ m{ucbrowser[\/ ]*(\d+)\.?(\d+)?([\d\.]*)} ) {
          $major = $1;
          $minor = $2;
          $beta  = $3;
      }
  
      # If we didn't match a browser-specific test, we look for
      # '$browser/x.y.z'
      if ( !defined $major && defined $self->{browser_string} ) {
          my $version_index = index( $ua, lc "$self->{browser_string}/" );
          if ( $version_index != -1 ) {
              my $version_str
                  = substr( $ua, $version_index + length($browser) );
              if ( $version_str =~ m{/(\d+)\.(\d+)([\w.]*)} ) {
                  $major = $1;
                  $minor = $2;
                  $beta  = $3;
              }
          }
      }
  
      # If that didn't work, we try 'Version/x.y.z'
      if ( !defined $major ) {
          if ( $ua =~ m{version/(\d+)\.(\d+)([\w.]*)} ) {
              $major = $1;
              $minor = $2;
              $beta  = $3;
          }
      }
  
      # If that didn't work, we start guessing. Just grab
      # anything after a word and a slash.
      if ( !defined $major ) {
  
          ( $major, $minor, $beta ) = (
              $ua =~ m{
                  \S+        # Greedily catch anything leading up to forward slash.
                  \/                # Version starts with a slash
                  [A-Za-z]*         # Eat any letters before the major version
                  ( [0-9]+ )        # Major version number is everything before the first dot
                   \.               # The first dot
                  ([\d]* )          # Minor version number is every digit after the first dot
                                    # Throw away remaining numbers and dots
                  ( [^\s]* )        # Beta version string is up to next space
              }x
          );
      }
  
      # If that didn't work, try even more generic.
      if ( !defined $major ) {
  
          if ( $ua =~ /[A-Za-z]+\/(\d+)\;/ ) {
              $major = $1;
              $minor = 0;
          }
      }
  
      # If that didn't work, give up.
      $major = 0     if !$major;
      $minor = 0     if !$minor;
      $beta  = undef if ( defined $beta && $beta eq q{} );
  
      # Now set version tests
  
      if ( $browser_tests->{netscape} ) {
  
          # Netscape browsers
          $version_tests->{nav2}   = 1 if $major == 2;
          $version_tests->{nav3}   = 1 if $major == 3;
          $version_tests->{nav4}   = 1 if $major == 4;
          $version_tests->{nav4up} = 1 if $major >= 4;
          $version_tests->{nav45}  = 1 if $major == 4 && $minor == 5;
          $version_tests->{nav45up} = 1
              if ( $major == 4 && ".$minor" >= .5 )
              || $major >= 5;
          $version_tests->{navgold} = 1
              if defined $beta && ( index( $beta, 'gold' ) != -1 );
          $version_tests->{nav6} = 1
              if ( $major == 5 || $major == 6 );    # go figure
          $version_tests->{nav6up} = 1 if $major >= 5;
  
          if ( $browser eq 'seamonkey' ) {
  
              # Ugh, seamonkey versions started back at 1.
              $version_tests->{nav2}    = 0;
              $version_tests->{nav4up}  = 1;
              $version_tests->{nav45up} = 1;
              $version_tests->{nav6}    = 1;
              $version_tests->{nav6up}  = 1;
          }
      }
  
      if ( $browser_tests->{ie} ) {
          $version_tests->{ie3}    = 1 if ( $major == 3 );
          $version_tests->{ie4}    = 1 if ( $major == 4 );
          $version_tests->{ie4up}  = 1 if ( $major >= 4 );
          $version_tests->{ie5}    = 1 if ( $major == 5 );
          $version_tests->{ie5up}  = 1 if ( $major >= 5 );
          $version_tests->{ie55}   = 1 if ( $major == 5 && $minor == 5 );
          $version_tests->{ie55up} = 1 if ( ".$minor" >= .5 || $major >= 6 );
          $version_tests->{ie6}    = 1 if ( $major == 6 );
          $version_tests->{ie7}    = 1 if ( $major == 7 );
          $version_tests->{ie8}    = 1 if ( $major == 8 );
          $version_tests->{ie9}    = 1 if ( $major == 9 );
          $version_tests->{ie10}   = 1 if ( $major == 10 );
          $version_tests->{ie11}   = 1 if ( $major == 11 );
  
          $version_tests->{ie_compat_mode}
              = (    $version_tests->{ie7}
                  && $tests->{trident}
                  && defined $self->engine_version
                  && $self->engine_version >= 4 );
      }
  
      if ( $browser_tests->{aol} ) {
          $version_tests->{aol3} = 1
              if ( index( $ua, 'aol 3.0' ) != -1
              || $version_tests->{ie3} );
          $version_tests->{aol4} = 1
              if ( index( $ua, 'aol 4.0' ) != -1 )
              || $version_tests->{ie4};
          $version_tests->{aol5}  = 1 if index( $ua, 'aol 5.0' ) != -1;
          $version_tests->{aol6}  = 1 if index( $ua, 'aol 6.0' ) != -1;
          $version_tests->{aoltv} = 1 if index( $ua, 'navio' ) != -1;
      }
  
      if ( $browser_tests->{opera} ) {
          $version_tests->{opera3} = 1
              if index( $ua, 'opera 3' ) != -1 || index( $ua, 'opera/3' ) != -1;
          $version_tests->{opera4} = 1
              if ( index( $ua, 'opera 4' ) != -1 )
              || ( index( $ua, 'opera/4' ) != -1
              && ( index( $ua, 'nintendo dsi' ) == -1 ) );
          $version_tests->{opera5} = 1
              if ( index( $ua, 'opera 5' ) != -1 )
              || ( index( $ua, 'opera/5' ) != -1 );
          $version_tests->{opera6} = 1
              if ( index( $ua, 'opera 6' ) != -1 )
              || ( index( $ua, 'opera/6' ) != -1 );
          $version_tests->{opera7} = 1
              if ( index( $ua, 'opera 7' ) != -1 )
              || ( index( $ua, 'opera/7' ) != -1 );
  
      }
  
      $minor = ".$minor";
  
      $self->{major} = $major;
      $self->{minor} = $minor;
      $self->{beta}  = $beta;
  }
  
  ### Device tests, only run on demand
  
  sub _init_device {
      my ($self) = @_;
  
      my $ua            = lc $self->{user_agent};
      my $browser_tests = $self->{browser_tests};
      my $tests         = $self->{tests};
  
      my ( $device, $device_string );
      my $device_tests = $self->{device_tests} = {};
  
      if ( index( $ua, 'windows phone' ) != -1 ) {
          $device = 'winphone';
  
          # Test is set in _init_os()
      }
      elsif (index( $ua, 'android' ) != -1
          || index( $ua, 'silk-accelerated' ) != -1 ) {
  
          # Silk-accelerated indicates a 1st generation Kindle Fire,
          # which may not have other indications of being an Android
          # device.
          $device = 'android';
          $device_tests->{$device} = 1;
      }
      elsif (index( $ua, 'blackberry' ) != -1
          || index( $ua, 'bb10' ) != -1
          || index( $ua, 'rim tablet os' ) != -1 ) {
          $device = 'blackberry';
          $device_tests->{$device} = 1;
      }
      elsif ( index( $ua, 'ipod' ) != -1 ) {
          $device = 'ipod';
          $device_tests->{$device} = 1;
      }
      elsif ( index( $ua, 'ipad' ) != -1 ) {
          $device = 'ipad';
          $device_tests->{$device} = 1;
      }
      elsif ( index( $ua, 'iphone' ) != -1 ) {
          $device = 'iphone';
          $device_tests->{$device} = 1;
      }
      elsif ( index( $ua, 'webos' ) != -1 ) {
          $device = 'webos';
          $device_tests->{$device} = 1;
      }
      elsif ( index( $ua, 'kindle' ) != -1 ) {
          $device = 'kindle';
          $device_tests->{$device} = 1;
      }
      elsif ( index( $ua, 'audrey' ) != -1 ) {
          $device = 'audrey';
          $device_tests->{$device} = 1;
      }
      elsif ( index( $ua, 'i-opener' ) != -1 ) {
          $device = 'iopener';
          $device_tests->{$device} = 1;
      }
      elsif ( index( $ua, 'avantgo' ) != -1 ) {
          $device                  = 'avantgo';
          $device_tests->{$device} = 1;
          $device_tests->{palm}    = 1;
      }
      elsif ( index( $ua, 'palmos' ) != -1 ) {
          $device = 'palm';
          $device_tests->{$device} = 1;
      }
      elsif ( index( $ua, 'playstation 3' ) != -1 ) {
          $device = 'ps3';
          $device_tests->{$device} = 1;
      }
      elsif ( index( $ua, 'playstation portable' ) != -1 ) {
          $device = 'psp';
          $device_tests->{$device} = 1;
      }
      elsif ( index( $ua, 'nintendo dsi' ) != -1 ) {
          $device = 'dsi';
          $device_tests->{$device} = 1;
      }
      elsif ( index( $ua, 'nintendo 3ds' ) != -1 ) {
          $device = 'n3ds';
          $device_tests->{$device} = 1;
      }
      elsif (
             $browser_tests->{obigo}
          || $browser_tests->{ucbrowser}
          || index( $ua, 'up.browser' ) != -1
          || (   index( $ua, 'nokia' ) != -1
              && index( $ua, 'windows phone' ) == -1 )
          || index( $ua, 'alcatel' ) != -1
          || $ua =~ m{\bbrew\b}
          || $ua =~ m{\bbmp\b}
          || index( $ua, 'ericsson' ) != -1
          || index( $ua, 'sie-' ) == 0
          || index( $ua, 'wmlib' ) != -1
          || index( $ua, ' wap' ) != -1
          || index( $ua, 'wap ' ) != -1
          || index( $ua, 'wap/' ) != -1
          || index( $ua, '-wap' ) != -1
          || index( $ua, 'wap-' ) != -1
          || index( $ua, 'wap' ) == 0
          || index( $ua, 'wapper' ) != -1
          || index( $ua, 'zetor' ) != -1
      ) {
          $device = 'wap';
          $device_tests->{$device} = 1;
      }
  
      $device_tests->{tablet} = (
          index( $ua, 'ipad' ) != -1
              || ( $browser_tests->{ie}
              && index( $ua, 'windows phone' ) == -1
              && index( $ua, 'arm' ) != -1 )
              || ( index( $ua, 'android' ) != -1
              && index( $ua, 'mobile' ) == -1
              && index( $ua, 'safari' ) != -1 )
              || ( $browser_tests->{firefox} && index( $ua, 'tablet' ) != -1 )
              || index( $ua, 'kindle' ) != -1
              || index( $ua, 'xoom' ) != -1
              || index( $ua, 'flyer' ) != -1
              || index( $ua, 'jetstream' ) != -1
              || index( $ua, 'transformer' ) != -1
              || index( $ua, 'novo7' ) != -1
              || index( $ua, 'an10g2' ) != -1
              || index( $ua, 'an7bg3' ) != -1
              || index( $ua, 'an7fg3' ) != -1
              || index( $ua, 'an8g3' ) != -1
              || index( $ua, 'an8cg3' ) != -1
              || index( $ua, 'an7g3' ) != -1
              || index( $ua, 'an9g3' ) != -1
              || index( $ua, 'an7dg3' ) != -1
              || index( $ua, 'an7dg3st' ) != -1
              || index( $ua, 'an7dg3childpad' ) != -1
              || index( $ua, 'an10bg3' ) != -1
              || index( $ua, 'an10bg3dt' ) != -1
              || index( $ua, 'opera tablet' ) != -1
              || index( $ua, 'rim tablet' ) != -1
              || index( $ua, 'hp-tablet' ) != -1
      );
  
      if ( !$device_tests->{tablet} ) {
          $device_tests->{mobile} = (
              ( $browser_tests->{firefox} && index( $ua, 'mobile' ) != -1 )
                  || ( $browser_tests->{ie}
                  && index( $ua, 'windows phone' ) == -1
                  && index( $ua, 'arm' ) != -1 )
                  || index( $ua, 'windows phone' ) != -1
                  || index( $ua, 'up.browser' ) != -1
                  || index( $ua, 'nokia' ) != -1
                  || index( $ua, 'alcatel' ) != -1
                  || index( $ua, 'ericsson' ) != -1
                  || index( $ua, 'sie-' ) == 0
                  || index( $ua, 'wmlib' ) != -1
                  || index( $ua, ' wap' ) != -1
                  || index( $ua, 'wap ' ) != -1
                  || index( $ua, 'wap/' ) != -1
                  || index( $ua, '-wap' ) != -1
                  || index( $ua, 'wap-' ) != -1
                  || index( $ua, 'wap' ) == 0
                  || index( $ua, 'wapper' ) != -1
                  || index( $ua, 'blackberry' ) != -1
                  || index( $ua, 'mobile' ) != -1
                  || index( $ua, 'palm' ) != -1
                  || index( $ua, 'smartphone' ) != -1
                  || index( $ua, 'windows ce' ) != -1
                  || index( $ua, 'palmsource' ) != -1
                  || index( $ua, 'iphone' ) != -1
                  || index( $ua, 'ipod' ) != -1
                  || index( $ua, 'ipad' ) != -1
                  || ( index( $ua, 'opera mini' ) != -1
                  && index( $ua, 'tablet' ) == -1 )
                  || index( $ua, 'htc_' ) != -1
                  || index( $ua, 'symbian' ) != -1
                  || index( $ua, 'webos' ) != -1
                  || index( $ua, 'samsung' ) != -1
                  || index( $ua, 'samsung' ) != -1
                  || index( $ua, 'zetor' ) != -1
                  || index( $ua, 'android' ) != -1
                  || index( $ua, 'symbos' ) != -1
                  || index( $ua, 'opera mobi' ) != -1
                  || index( $ua, 'fennec' ) != -1
                  || $ua =~ m{\bbrew\b}
                  || index( $ua, 'obigo' ) != -1
                  || index( $ua, 'teleca' ) != -1
                  || index( $ua, 'polaris' ) != -1
                  || index( $ua, 'opera tablet' ) != -1
                  || index( $ua, 'rim tablet' ) != -1
                  || ( index( $ua, 'bb10' ) != -1
                  && index( $ua, 'mobile' ) != -1 )
                  || $device_tests->{psp}
                  || $device_tests->{dsi}
                  || $device_tests->{'n3ds'}
          );
      }
  
      if (
          $browser_tests->{ucbrowser}
          && ( $self->{user_agent}
              =~ m{ucweb/2.0\s*\(([^\;\)]*\;){4}\s*([^\;\)]*?)\s*\)}i
              || $self->{user_agent}
              =~ m{ucweb/2.0\s*\(([^\;\)]*\;){3}\s*([^\;\)]*?)\s*\)}i )
      ) {
          $device_string = $2;
      }
      elsif ( $ua =~ /^(\bmot-[^ \/]+)/ ) {
          $device_string = substr $self->{user_agent}, 0, length $1;
          $device_string =~ s/^MOT-/Motorola /i;
      }
      elsif ( ( $browser_tests->{obigo} || index( $ua, 'brew' ) != -1 )
          && $self->{user_agent} =~ m{\d+x\d+ ([\d\w\- ]+?)( \S+\/\S+)*$}i ) {
          $device_string = $1;
      }
      elsif (
          $ua =~ /windows phone os [^\)]+ iemobile\/[^;]+; ([^;]+; [^;\)]+)/g )
      {
          # windows phone 7.x
          $device_string = substr $self->{user_agent},
              pos($ua) - length $1, length $1;
          $device_string =~ s/; / /;
      }
      elsif ( $ua
          =~ /windows phone [^\)]+ iemobile\/[^;]+; arm; touch; ([^;]+; [^;\)]+)/g
      ) {
          # windows phone 8.0
          $device_string = substr $self->{user_agent},
              pos($ua) - length $1, length $1;
          $device_string =~ s/; / /;
      }
      elsif (
          $ua =~ /windows phone 8[^\)]+ iemobile\/[^;]+; ([^;]+; [^;\)]+)/g ) {
  
          # windows phone 8.1
          $device_string = substr $self->{user_agent},
              pos($ua) - length $1, length $1;
          $device_string =~ s/; / /;
      }
      elsif ( $ua =~ /bb10; ([^;\)]+)/g ) {
          $device_string = 'BlackBerry ' . substr $self->{user_agent},
              pos($ua) - length $1, length $1;
          $device_string =~ s/Kbd/Q10/;
      }
      elsif ( $ua =~ /blackberry ([\w.]+)/ ) {
          $device_string = "BlackBerry $1";
      }
      elsif ( $ua =~ /blackberry(\d+)\// ) {
          $device_string = "BlackBerry $1";
      }
      elsif ( $ua =~ /silk-accelerated/ ) {
  
          # Only first generation Kindle Fires have that string
          $device_string = 'Kindle Fire';
          $device_tests->{kindlefire} = 1;
      }
      elsif ( $self->{user_agent} =~ /android .*\; ([^;]*) build/i ) {
          my $model = $1;
          if ( $model =~ m{^KF} || $model =~ m{kindle fire}i ) {
  
              # We might hit this even if tablet() is false, if we have
              # a Kindle Fire masquerading as a mobile device.
              $device_string = 'Kindle Fire';
              $device_tests->{kindlefire} = 1;
          }
          elsif ( $device_tests->{tablet} ) {
              $device_string = "Android tablet ($model)";
          }
          else {
              $device_string = "Android ($model)";
          }
      }
      elsif ( $self->{user_agent}
          =~ /\b((alcatel|huawei|lg|nokia|samsung|sonyericsson)[\w\-]*)\//i ) {
          $device_string = $1;
      }
      elsif ($device) {
          $device_string = $DEVICE_NAMES{$device};
      }
      else {
          $device_string = undef;
      }
  
      if ($device) {
          $self->{device} = $device;
      }
      else {
          $self->{device}
              = undef;    # Means we cache the fact that we found nothing
      }
  
      if ($device_string) {
          $self->{device_string} = $device_string;
      }
  }
  
  ### Now a big block of public accessors for tests and information
  
  sub browser {
      my ($self) = @_;
      return undef unless defined $self->{user_agent};
      return $self->{browser};
  }
  
  sub browser_string {
      my ($self) = @_;
      return undef unless defined $self->{user_agent};
      return $self->{browser_string};
  }
  
  sub robot {
      my $self = shift;
  
      $self->_init_robots unless exists( $self->{robot_string} );
      return $self->{robot_tests}->{robot};
  }
  
  sub robot_string {
      my $self = shift;
  
      $self->_init_robots unless exists( $self->{robot_string} );
      return $self->{robot_string};
  }
  
  sub robot_name {
      my $self = shift;
      return $self->robot_string;
  }
  
  sub robot_id {
      my $self = shift;
      return
            $self->{robot_tests}->{robot_id} ? $self->{robot_tests}->{robot_id}
          : $self->robot                     ? $ROBOT_IDS{ $self->robot }
          :                                    undef;
  }
  
  sub _robot_version {
      my ($self) = @_;
      $self->_init_robots unless exists( $self->{robot_string} );
      if ( $self->{robot_version} ) {
          return @{ $self->{robot_version} };
      }
      else {
          return ( undef, undef, undef );
      }
  }
  
  sub robot_version {
      my ($self) = @_;
      my ( $major, $minor, $beta ) = $self->_robot_version;
      if ( defined $major ) {
          if ( defined $minor ) {
              return "$major$minor";
          }
          else {
              return $major;
          }
      }
      else {
          return undef;
      }
  }
  
  sub robot_major {
      my ($self) = @_;
      my ( $major, $minor, $beta ) = $self->_robot_version;
      return $major;
  }
  
  sub robot_minor {
      my ($self) = @_;
      my ( $major, $minor, $beta ) = $self->_robot_version;
      return $minor;
  }
  
  sub robot_beta {
      my ($self) = @_;
      my ( $major, $minor, $beta ) = $self->_robot_version;
      return $beta;
  }
  
  sub os {
      my ($self) = @_;
  
      return undef unless defined $self->{user_agent};
      $self->_init_os unless $self->{os_tests};
      return $self->{os};
  }
  
  sub os_string {
      my ($self) = @_;
  
      return undef unless defined $self->{user_agent};
      $self->_init_os unless $self->{os_tests};
      return $self->{os_string};
  }
  
  sub _os_version {
      my ($self) = @_;
      $self->_init_os_version if !exists( $self->{os_version} );
      if ( $self->{os_version} ) {
          return @{ $self->{os_version} };
      }
      else {
          return ( undef, undef, undef );
      }
  }
  
  sub os_version {
      my ($self) = @_;
      my ( $major, $minor, $beta ) = $self->_os_version;
      return defined $major ? "$major$minor" : undef;
  }
  
  sub os_major {
      my ($self) = @_;
      my ( $major, $minor, $beta ) = $self->_os_version;
      return $major;
  }
  
  sub os_minor {
      my ($self) = @_;
      my ( $major, $minor, $beta ) = $self->_os_version;
      return $minor;
  }
  
  sub os_beta {
      my ($self) = @_;
      my ( $major, $minor, $beta ) = $self->_os_version;
      return $beta;
  }
  
  sub _realplayer_version {
      my ($self) = @_;
  
      $self->_init_version unless $self->{version_tests};
      return $self->{realplayer_version} || 0;
  }
  
  sub realplayer_browser {
      my ($self) = @_;
      return defined( $self->{browser} ) && $self->{browser} eq 'realplayer';
  }
  
  sub gecko_version {
      my ($self) = @_;
  
      if ( $self->gecko ) {
          return $self->{engine_version};
      }
      else {
          return undef;
      }
  }
  
  sub version {
      my ($self) = @_;
      $self->_init_version() unless $self->{version_tests};
  
      return defined $self->{major} ? "$self->{major}$self->{minor}" : undef;
  }
  
  sub major {
      my ($self) = @_;
      $self->_init_version() unless $self->{version_tests};
  
      my ($version) = $self->{major};
      return $version;
  }
  
  sub minor {
      my ($self) = @_;
      $self->_init_version() unless $self->{version_tests};
  
      my ($version) = $self->{minor};
      return $version;
  }
  
  sub public_version {
      my ($self) = @_;
      my ( $major, $minor ) = $self->_public;
  
      $minor ||= q{};
      return defined $major ? "$major$minor" : undef;
  }
  
  sub public_major {
      my ($self) = @_;
      my ( $major, $minor ) = $self->_public;
  
      return $major;
  }
  
  sub public_minor {
      my ($self) = @_;
      my ( $major, $minor ) = $self->_public;
  
      return $minor;
  }
  
  sub public_beta {
      my ($self) = @_;
      my ( $major, $minor, $beta ) = $self->_public;
  
      return $beta;
  }
  
  sub browser_version {
      my ($self) = @_;
      my ( $major, $minor ) = $self->_public;
      $minor ||= q{};
  
      return defined $major ? "$major$minor" : undef;
  }
  
  sub browser_major {
      my ($self) = @_;
      my ( $major, $minor ) = $self->_public;
  
      return $major;
  }
  
  sub browser_minor {
      my ($self) = @_;
      my ( $major, $minor ) = $self->_public;
  
      return $minor;
  }
  
  sub browser_beta {
      my ($self) = @_;
      my ( $major, $minor, $beta ) = $self->_public;
  
      return $beta;
  }
  
  sub _public {
      my ($self) = @_;
  
      # Return Public version of Safari. See RT #48727.
      if ( $self->safari ) {
          my $ua = lc $self->{user_agent};
  
          # Safari starting with version 3.0 provides its own public version
          if (
              $ua =~ m{
                  version/
                  ( \d+ )       # Major version number is everything before first dot
                  ( \. \d+ )?   # Minor version number is first dot and following digits
              }x
          ) {
              return ( $1, $2, undef );
          }
  
          # Safari before version 3.0 had only build numbers; use a lookup table
          # provided by Apple to convert to version numbers
  
          if ( $ua =~ m{ safari/ ( \d+ (?: \.\d+ )* ) }x ) {
              my $build   = $1;
              my $version = $safari_build_to_version{$build};
              unless ($version) {
  
                  # if exact build -> version mapping doesn't exist, find next
                  # lower build
  
                  for my $maybe_build (
                      sort { $self->_cmp_versions( $b, $a ) }
                      keys %safari_build_to_version
                  ) {
                      $version = $safari_build_to_version{$maybe_build}, last
                          if $self->_cmp_versions( $build, $maybe_build ) >= 0;
                  }
  
                  # Special case for specific worm that uses a malformed user agent
                  return ( '1', '.2', undef ) if $ua =~ m{safari/12x};
              }
  
              return ( undef, undef, undef ) unless defined $version;
              my ( $major, $minor ) = split /\./, $version;
              my $beta;
              $minor =~ s/(\D.*)// and $beta = $1;
              $minor = ( '.' . $minor );
              return ( $major, $minor, ( $beta ? 1 : undef ) );
          }
      }
  
      $self->_init_version() unless $self->{version_tests};
      return ( $self->{major}, $self->{minor}, $self->{beta} );
  }
  
  sub _cmp_versions {
      my ( $self, $a, $b ) = @_;
  
      my @a = split /\./, $a;
      my @b = split /\./, $b;
  
      while (@b) {
          return -1 if @a == 0 || $a[0] < $b[0];
          return 1  if @b == 0 || $b[0] < $a[0];
          shift @a;
          shift @b;
      }
  
      return @a <=> @b;
  }
  
  sub engine {
      my ($self) = @_;
  
      # *shrug*
      if ( my $engine_string = $self->engine_string ) {
          if ( $engine_string eq 'MSIE' ) {
              return 'ie';
          }
          else {
              return lc $engine_string;
          }
      }
      else {
          return undef;
      }
  }
  
  sub engine_string {
      my ($self) = @_;
  
      if ( $self->gecko ) {
          return 'Gecko';
      }
  
      if ( $self->trident ) {
          return 'Trident';
      }
  
      if ( $self->ie ) {
          return 'MSIE';
      }
  
      if ( $self->edge ) {
          return 'EdgeHTML';
      }
  
      if ( $self->webkit ) {
          return 'WebKit';
      }
  
      if ( $self->presto ) {
          return 'Presto';
      }
  
      if ( $self->netfront ) {
          return 'NetFront';
      }
  
      if ( $self->khtml ) {
          return 'KHTML';
      }
  
      return undef;
  }
  
  sub engine_version {
      my ($self) = @_;
  
      if ( $self->{engine_version} ) {
          if ( $self->{engine_version} =~ m{^(\d+(\.\d+)?)} ) {
              return $1;
          }
      }
  
      return undef;
  }
  
  sub engine_major {
      my ($self) = @_;
  
      if ( $self->{engine_version} ) {
          if ( $self->{engine_version} =~ m{^(\d+)} ) {
              return $1;
          }
      }
  
      return undef;
  }
  
  sub engine_minor {
      my ($self) = @_;
  
      if ( $self->{engine_version} ) {
          if ( $self->{engine_version} =~ m{^\d+(\.\d+)} ) {
              return $1;
          }
      }
  
      return undef;
  }
  
  sub engine_beta {
      my ($self) = @_;
  
      if ( $self->{engine_version} ) {
          if ( $self->{engine_version} =~ m{^\d+\.\d+([\.\d\+]*)} ) {
              return $1;
          }
      }
  
      return undef;
  }
  
  sub beta {
      my ($self) = @_;
  
      $self->_init_version unless $self->{version_tests};
  
      my ($version) = $self->{beta};
      return $version;
  }
  
  sub language {
      my ($self) = @_;
  
      my $parsed = $self->_language_country();
      return $parsed->{'language'};
  }
  
  sub country {
      my ($self) = @_;
  
      my $parsed = $self->_language_country();
      return $parsed->{'country'};
  }
  
  sub device {
      my ($self) = @_;
  
      $self->_init_device if !exists( $self->{device} );
      return $self->{device};
  }
  
  sub device_string {
      my ($self) = @_;
  
      $self->_init_device if !exists( $self->{device_string} );
      return $self->{device_string};
  }
  
  sub device_name {
      my ($self) = @_;
      return $self->device_string;
  }
  
  sub _language_country {
      my ($self) = @_;
  
      if ( $self->safari ) {
          if (   $self->major == 1
              && $self->{user_agent} =~ m/\s ( [a-z]{2} ) \)/xms ) {
              return { language => uc $1 };
          }
          if ( $self->{user_agent} =~ m/\s ([a-z]{2})-([A-Za-z]{2})/xms ) {
              return { language => uc $1, country => uc $2 };
          }
      }
  
      if (   $self->aol
          && $self->{user_agent} =~ m/;([A-Z]{2})_([A-Z]{2})\)/ ) {
          return { language => $1, country => $2 };
      }
  
      if ( $self->{user_agent} =~ m/\b([a-z]{2})-([A-Za-z]{2})\b/xms ) {
          return { language => uc $1, country => uc $2 };
      }
  
      if ( $self->{user_agent} =~ m/\[([a-z]{2})\]/xms ) {
          return { language => uc $1 };
      }
  
      if ( $self->{user_agent} =~ m/\(([^)]+)\)/xms ) {
          my @parts = split( /;/, $1 );
          foreach my $part (@parts) {
  
              # 'vw' for WebView is not language code. Details here: https://developer.chrome.com/multidevice/user-agent#webview_user_agent
              if ( $part =~ /^\s*([a-z]{2})\s*$/
                  && !( $self->webview && $1 eq 'wv' ) ) {
                  return { language => uc $1 };
              }
          }
      }
  
      return { language => undef, country => undef };
  }
  
  sub browser_properties {
      my ($self) = @_;
  
      my @browser_properties;
  
      my ( $test, $value );
  
      while ( ( $test, $value ) = each %{ $self->{tests} } ) {
          push @browser_properties, $test if $value;
      }
      while ( ( $test, $value ) = each %{ $self->{browser_tests} } ) {
          push @browser_properties, $test if $value;
      }
  
      $self->_init_device  unless $self->{device_tests};
      $self->_init_os      unless $self->{os_tests};
      $self->_init_robots  unless $self->{robot_tests};
      $self->_init_version unless $self->{version_tests};
  
      while ( ( $test, $value ) = each %{ $self->{device_tests} } ) {
          push @browser_properties, $test if $value;
      }
      while ( ( $test, $value ) = each %{ $self->{os_tests} } ) {
          push @browser_properties, $test if $value;
      }
      while ( ( $test, $value ) = each %{ $self->{robot_tests} } ) {
          push @browser_properties, $test if $value;
      }
      while ( ( $test, $value ) = each %{ $self->{version_tests} } ) {
          push @browser_properties, $test if $value;
      }
  
      # devices are a property too but it's not stored in %tests
      # so I explicitly test for it and add it
      push @browser_properties, 'device' if ( $self->device() );
  
      return sort @browser_properties;
  }
  
  sub lib {
      my $self = shift;
      $self->_init_robots() unless $self->{robot_tests};
      return $self->{robot_tests}->{lib};
  }
  
  sub all_robot_ids {
      my $self = shift;
      return keys %ROBOT_NAMES;
  }
  
  # The list of U2F supported browsers is expected to increase:
  # https://www.bit-tech.net/news/tech/software/w3c-adopts-fidos-webauthn-standard/1/
  
  sub u2f {
      my $self = shift;
  
      # Chrome version 41 and up can U2F
      return 1
          if $self->chrome
          && $self->browser_major
          && $self->browser_major >= 41;
  
      # Opera versions 40 and >= 42 can U2F
      return 1
          if $self->opera
          && $self->browser_major
          && ( $self->browser_major == 40
          || $self->browser_major >= 42 );
  
      return undef;
  }
  
  # These method are only used by the test suite.
  sub _all_tests {
      return @ALL_TESTS;
  }
  
  sub _robot_names {
      return %ROBOT_NAMES;
  }
  
  sub _robot_tests {
      return @ROBOT_TESTS;
  }
  
  sub _robot_ids {
      return %ROBOT_IDS;
  }
  
  1;
  
  # ABSTRACT: Determine Web browser, version, and platform from an HTTP user agent string
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  HTTP::BrowserDetect - Determine Web browser, version, and platform from an HTTP user agent string
  
  =head1 VERSION
  
  version 3.23
  
  =head1 SYNOPSIS
  
      use HTTP::BrowserDetect;
  
      my $user_agent_string
          = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36';
      my $ua = HTTP::BrowserDetect->new($user_agent_string);
  
      # Print general information
      print "Browser: $ua->browser_string\n"
          if $ua->browser_string;
      print "Version: $ua->browser_version$ua->browser_beta\n"
          if $ua->browser_version;
      print "OS: $ua->os_string\n"
          if $ua->os_string;
  
      # Detect operating system
      if ( $ua->windows ) {
          if ( $ua->winnt ) {
              # do something
          }
          if ( $ua->win95 ) {
              # do something
          }
      }
      print "Mac\n" if $ua->macosx;
  
      # Detect browser vendor and version
      print "Safari\n" if $ua->safari;
      print "MSIE\n" if $ua->ie;
      print "Mobile\n" if $ua->mobile;
      if ( $ua->browser_major(4) ) {
          if ( $ua->browser_minor > .5 ) {
              # ...;
          }
      }
      if ( $ua->browser_version > 4.5 ) {
          # ...;
      }
  
  =head1 DESCRIPTION
  
  The HTTP::BrowserDetect object does a number of tests on an HTTP user agent
  string. The results of these tests are available via methods of the object.
  
  For an online demonstration of this module's parsing, you can check out
  L<http://www.browserdetect.org/>
  
  This module was originally based upon the JavaScript browser detection
  code available at
  L<http://www.mozilla.org/docs/web-developer/sniffer/browser_type.html>.
  
  =head1 CONSTRUCTOR AND STARTUP
  
  =head2 new()
  
      HTTP::BrowserDetect->new( $user_agent_string )
  
  The constructor may be called with a user agent string specified. Otherwise, it
  will use the value specified by $ENV{'HTTP_USER_AGENT'}, which is set by the
  web server when calling a CGI script.
  
  =head1 SUBROUTINES/METHODS
  
  =head1 Browser Information
  
  =head2 browser()
  
  Returns the browser, as one of the following values:
  
  chrome, firefox, ie, opera, safari, adm, applecoremedia, blackberry,
  brave, browsex, dalvik, elinks, links, lynx, emacs, epiphany, galeon,
  konqueror, icab, lotusnotes, mosaic, mozilla, netfront, netscape,
  n3ds, dsi, obigo, polaris, pubsub, realplayer, seamonkey, silk,
  staroffice, ucbrowser, webtv
  
  If the browser could not be identified (either because unrecognized
  or because it is a robot), returns C<undef>.
  
  =head2 browser_string()
  
  Returns a human formatted version of the browser name. These names are
  subject to change and are meant for display purposes. This may include
  information additional to what's in browser() (e.g. distinguishing
  Firefox from Iceweasel).
  
  If the user agent could not be identified, or if it was identified as
  a robot instead, returns C<undef>.
  
  =head1 Browser Version
  
  Please note that that the version(), major() and minor() methods have been
  deprecated as of release 1.78 of this module. They should be replaced
  with browser_version(), browser_major(), browser_minor(), and browser_beta().
  
  The reasoning behind this is that version() method will, in the case of Safari,
  return the Safari/XXX numbers even when Version/XXX numbers are present in the
  UserAgent string (i.e. it will return incorrect versions for Safari in
  some cases).
  
  =head2 browser_version()
  
  Returns the browser version (major and minor) as a string. For
  example, for Chrome 36.0.1985.67, this returns "36.0".
  
  =head2 browser_major()
  
  Returns the major part of the version as a string. For example, for
  Chrome 36.0.1985.67, this returns "36".
  
  Returns undef if no version information can be detected.
  
  =head2 browser_minor()
  
  Returns the minor part of the version as a string. This includes the
  decimal point; for example, for Chrome 36.0.1985.67, this returns
  ".0".
  
  Returns undef if no version information can be detected.
  
  =head2 browser_beta()
  
  Returns any part of the version after the major and minor version, as
  a string. For example, for Chrome 36.0.1985.67, this returns
  ".1985.67". The beta part of the string can contain any type of
  alphanumeric characters.
  
  Returns undef if no version information can be detected. Returns an
  empty string if version information is detected but it contains only
  a major and minor version with nothing following.
  
  =head1 Operating System
  
  =head2 os()
  
  Returns one of the following strings, or C<undef>:
  
    windows, winphone, mac, macosx, linux, android, ios, os2, unix, vms,
    chromeos, firefoxos, ps3, psp, rimtabletos, blackberry, amiga, brew
  
  =head2 os_string()
  
  Returns a human formatted version of the OS name.  These names are
  subject to change and are really meant for display purposes. This may
  include information additional to what's in os() (e.g. distinguishing
  various editions of Windows from one another) (although for a way to
  do that that's more suitable for use in program logic, see below under
  "OS related properties").
  
  Returns C<undef> if no OS information could be detected.
  
  =head2 os_version(), os_major(), os_minor(), os_beta()
  
  Returns version information for the OS, if any could be detected. The
  format is the same as for the browser_version() functions.
  
  =head1 Mobile Devices
  
  =head2 mobile()
  
  Returns true if the browser appears to belong to a mobile phone or
  similar device (i.e. one small enough that the mobile version of a
  page is probably preferable over the desktop version).
  
  In previous versions, tablet devices sometimes had mobile() return
  true. They are now mutually exclusive.
  
  =head2 tablet()
  
  Returns true if the browser appears to belong to a tablet device.
  
  =head2 device()
  
  Returns the type of mobile / tablet hardware, if it can be detected.
  
  Currently returns one of: android, audrey, avantgo, blackberry, dsi, iopener, ipad,
  iphone, ipod, kindle, n3ds, palm, ps3, psp, wap, webos, winphone.
  
  Returns C<undef> if this is not a tablet/mobile device or no hardware
  information can be detected.
  
  =head2 device_string()
  
  Returns a human formatted version of the hardware device name.  These names are
  subject to change and are really meant for display purposes.  You should use
  the device() method in your logic. This may include additional
  information (such as the model of phone if it is detectable).
  
  Returns C<undef> if this is not a portable device or if no device name
  can be detected.
  
  =head1 Robots
  
  =head2 robot()
  
  If the user agent appears to be a robot, spider, crawler, or other
  automated Web client, this returns one of the following values:
  
  lwp, slurp, yahoo, bingbot, msnmobile, msn, msoffice, ahrefs,
  altavista, apache, askjeeves, baidu, curl, facebook, getright,
  googleadsbot, googleadsense, googlebotimage, googlebotnews,
  googlebotvideo, googlefavicon, googlemobile, google, golib, indy,
  infoseek, ipsagent, linkchecker, linkexchange, lycos, malware,
  mj12bot, nutch, phplib, puf, rubylib, scooter, specialarchiver,
  wget, yandexbot, yandeximages, java, unknown
  
  Returns "unknown" when the user agent is believed to be a robot but
  is not identified as one of the above specific robots.
  
  Returns C<undef> if the user agent is not a robot or cannot be
  identified.
  
  Note that if a robot crafts a user agent designed to impersonate a
  particular browser, we generally set properties appropriate to both
  the actual robot, and the browser it is impersonating. For example,
  googlebot-mobile pretends to be mobile safari so that it will get
  mobile versions of pages. In this case, browser() will return
  'safari', the properties will generally be set as if for Mobile
  Safari, the 'robot' property will be set, and robot() will return
  'googlemobile'.
  
  =head3 lib()
  
  Returns true if the user agent appears to be an HTTP library or tool
  (e.g. LWP, curl, wget, java). Generally libraries are also classified
  as robots, although it is impossible to tell whether they are being
  operated by an automated system or a human.
  
  =head3 robot_string()
  
  Returns a human formatted version of the robot name. These names are
  subject to change and are meant for display purposes. This may include
  additional information (e.g. robots which return "unknown" from
  robot() generally can be identified in a human-readable fashion by
  reading robot_string() ).
  
  =head3 robot_id()
  
  This method is currently in beta.
  
  Returns an id consisting of lower case letters, numbers and dashes.  This id
  will remain constant, so you can use it for matching against a particular
  robot.  The ids were introduced in version 3.14.  There may still be a few
  corrections to ids in subsequent releases.  Once this method becomes stable the
  ids will also be frozen.
  
  =head3 all_robot_ids()
  
  This method returns an C<ArrayRef> of all possible C<robot_id> values.
  
  =head2 robot_version(), robot_major(), robot_minor(), robot_beta()
  
  Returns version information for the robot, if any could be
  detected. The format is the same as for the browser_version()
  functions.
  
  Note that if a robot crafts a user agent designed to impersonate a
  particular browser, we generally return results appropriate to both
  the actual robot, and the browser it is impersonating. For example,
  googlebot-mobile pretends to be mobile safari so that it will get
  mobile versions of pages. In this case, robot_version() will return
  the version of googlebot-mobile, and browser_version() will return the
  version of Safari that googlebot-mobile is impersonating.
  
  =head1 Browser Properties
  
  Operating systems, devices, browser names, rendering engines, and
  true-or-false methods (e.g. "mobile" and "lib") are all browser
  properties. For example, calling browser_properties() for Mobile
  Safari running on an Android will return this list:
  
  ('android', 'device', 'mobile', 'mobile_safari', 'safari', 'webkit')
  
  =head2 browser_properties()
  
  Returns all properties for this user agent, as a list. Note that
  because a large number of cases must be considered, this will take
  significantly more time than simply querying the particular methods
  you care about.
  
  A mostly complete list of properties follows (i.e. each of these
  methods is both a method you can call, and also a property that may
  be in the list returned by browser_properties() ). In addition to this
  list, robot(), lib(), device(), mobile(), and tablet() are all
  browser properties.
  
  =head2 OS related properties
  
  The following methods are available, each returning a true or false value.
  Some methods also test for the operating system version. The indentations
  below show the hierarchy of tests (for example, win2k is considered a type of
  winnt, which is a type of win32)
  
  =head3 windows()
  
      win16 win3x win31
      win32
          winme win95 win98
          winnt
              win2k winxp win2k3 winvista win7
              win8
                  win8_0 win8_1
              win10
                  win10_0
      wince
      winphone
          winphone7 winphone7_5 winphone8 winphone10
  
  =head3 dotnet()
  
  =head3 x11()
  
  =head3 webview()
  
  =head3 chromeos()
  
  =head3 firefoxos()
  
  =head3 mac()
  
  mac68k macppc macosx ios
  
  =head3 os2()
  
  =head3 bb10()
  
  =head3 rimtabletos()
  
  =head3 unix()
  
    sun sun4 sun5 suni86 irix irix5 irix6 hpux hpux9 hpux10
    aix aix1 aix2 aix3 aix4 linux sco unixware mpras reliant
    dec sinix freebsd bsd
  
  =head3 vms()
  
  =head3 amiga()
  
  =head3 ps3gameos()
  
  =head3 pspgameos()
  
  It may not be possible to detect Win98 in Netscape 4.x and earlier. On Opera
  3.0, the userAgent string includes "Windows 95/NT4" on all Win32, so you can't
  distinguish between Win95 and WinNT.
  
  =head2 Browser related properties
  
  The following methods are available, each returning a true or false value.
  Some methods also test for the browser version, saving you from checking the
  version separately.
  
  =head3 adm
  
  =head3 aol aol3 aol4 aol5 aol6
  
  =head3 applecoremedia
  
  =head3 avantgo
  
  =head3 browsex
  
  =head3 chrome
  
  =head3 dalvik
  
  =head3 emacs
  
  =head3 epiphany
  
  =head3 firefox
  
  =head3 galeon
  
  =head3 icab
  
  =head3 ie ie3 ie4 ie4up ie5 ie5up ie55 ie55up ie6 ie7 ie8 ie9 ie10 ie11
  
  =head3 ie_compat_mode
  
  The ie_compat_mode is used to determine if the IE user agent is for
  the compatibility mode view, in which case the real version of IE is
  higher than that detected. The true version of IE can be inferred from
  the version of Trident in the engine_version method.
  
  =head3 konqueror
  
  =head3 lotusnotes
  
  =head3 lynx links elinks
  
  =head3 mobile_safari
  
  =head3 mosaic
  
  =head3 mozilla
  
  =head3 neoplanet neoplanet2
  
  =head3 netfront
  
  =head3 netscape nav2 nav3 nav4 nav4up nav45 nav45up navgold nav6 nav6up
  
  =head3 obigo
  
  =head3 opera opera3 opera4 opera5 opera6 opera7
  
  =head3 polaris
  
  =head3 pubsub
  
  =head3 realplayer
  
  The realplayer method above tests for the presence of either the RealPlayer
  plug-in "(r1 " or the browser "RealPlayer".
  
  =head3 realplayer_browser
  
  The realplayer_browser method tests for the presence of the RealPlayer
  browser (but returns 0 for the plugin).
  
  =head3 safari
  
  =head3 seamonkey
  
  =head3 silk
  
  =head3 staroffice
  
  =head3 ucbrowser
  
  =head3 webtv
  
  Netscape 6, even though it's called six, in the User-Agent string has version
  number 5. The nav6 and nav6up methods correctly handle this quirk. The Firefox
  test correctly detects the older-named versions of the browser (Phoenix,
  Firebird).
  
  =head2 Device related properties
  
  The following methods are available, each returning a true or false value.
  
  =head3 android
  
  =head3 audrey
  
  =head3 avantgo
  
  =head3 blackberry
  
  =head3 dsi
  
  =head3 iopener
  
  =head3 iphone
  
  =head3 ipod
  
  =head3 ipad
  
  =head3 kindle
  
  =head3 kindlefire
  
  =head3 n3ds
  
  =head3 palm
  
  =head3 webos
  
  =head3 wap
  
  Note that 'wap' indicates that the device is capable of WAP, not
  necessarily that the device is limited to WAP only. Most modern WAP
  devices are also capable of rendering standard HTML.
  
  =head3 psp
  
  =head3 ps3
  
  =head2 Robot properties
  
  These methods are now deprecated and will be removed in a future release.
  Please use the C<robot()> and C<robot_id()> methods to identify the bots.  Use
  C<robot_id()> if you need to match on a string, since the value that is
  returned by C<robot> could possibly change in a future release.
  
  The following additional methods are available, each returning a true or false
  value. This is by no means a complete list of robots that exist on the Web.
  
  =head3 ahrefs
  
  =head3 altavista
  
  =head3 apache
  
  =head3 askjeeves
  
  =head3 baidu
  
  =head3 bingbot
  
  =head3 curl
  
  =head3 facebook
  
  =head3 getright
  
  =head3 golib
  
  =head3 google
  
  =head3 googleadsbot
  
  =head3 googleadsense
  
  =head3 googlemobile
  
  =head3 indy
  
  =head3 infoseek
  
  =head3 ipsagent
  
  =head3 java
  
  =head3 linkexchange
  
  =head3 lwp
  
  =head3 lycos
  
  =head3 malware
  
  =head3 mj12bot
  
  =head3 msn
  
  =head3 msoffice
  
  =head3 puf
  
  =head3 rubylib
  
  =head3 slurp
  
  =head3 wget
  
  =head3 yahoo
  
  =head3 yandex
  
  =head3 yandeximages
  
  =head2 Engine properties
  
  The following properties indicate if a particular rendering engine is
  being used.
  
  =head3 webkit
  
  =head3 gecko
  
  =head3 trident
  
  =head3 presto
  
  =head3 khtml
  
  =head1 Other methods
  
  =head2 user_agent()
  
  Returns the value of the user agent string.
  
  Calling this method with a parameter to set the user agent has now
  been removed; please use HTTP::BrowserDetect->new() to pass the user
  agent string.
  
  =head2 u2f()
  
  Returns true if this browser and version are known to support Universal Second
  Factor (U2F).  This method will need future updates as more browsers fully
  support this standard.
  
  =head2 country()
  
  Returns the country string as it may be found in the user agent string. This
  will be in the form of an upper case 2 character code. ie: US, DE, etc
  
  =head2 language()
  
  Returns the language string as it is found in the user agent string. This will
  be in the form of an upper case 2 character code. ie: EN, DE, etc
  
  =head2 engine()
  
  Returns the rendering engine, one of the following:
  
  gecko, webkit, khtml, trident, ie, presto, netfront
  
  Note that this returns "webkit" for webkit based browsers (including
  Chrome/Blink). This is a change from previous versions of this
  library, which returned "KHTML" for webkit.
  
  Returns C<undef> if none of the above rendering engines can be
  detected.
  
  =head2 engine_string()
  
  Returns a human formatted version of the rendering engine.
  
  Note that this returns "WebKit" for webkit based browsers (including
  Chrome/Blink). This is a change from previous versions of this
  library, which returned "KHTML" for webkit.
  
  Returns C<undef> if none of the known rendering engines can be
  detected.
  
  =head2 engine_version(), engine_major(), engine_minor(), engine_beta()
  
  Returns version information for the rendering engine, if any could be
  detected. The format is the same as for the browser_version()
  functions.
  
  =head1 Deprecated methods
  
  =head2 device_name()
  
  Deprecated alternate name for device_string()
  
  =head2 version()
  
  This is probably not what you want.  Please use either browser_version() or
  engine_version() instead.
  
  Returns the version (major and minor) as a string.
  
  This function returns wrong values for some Safari versions, for
  compatibility with earlier code. browser_version() returns correct
  version numbers for Safari.
  
  =head2 major()
  
  This is probably not what you want. Please use either browser_major()
  or engine_major() instead.
  
  Returns the integer portion of the browser version as a string.
  
  This function returns wrong values for some Safari versions, for
  compatibility with earlier code. browser_version() returns correct
  version numbers for Safari.
  
  =head2 minor()
  
  This is probably not what you want. Please use either browser_minor()
  or engine_minor() instead.
  
  Returns the decimal portion of the browser version as a string.
  
  This function returns wrong values for some Safari versions, for
  compatibility with earlier code. browser_version() returns correct
  version numbers for Safari.
  
  =head2 beta()
  
  This is probably not what you want. Please use browser_beta() instead.
  
  Returns the beta version, consisting of any characters after the major
  and minor version number, as a string.
  
  This function returns wrong values for some Safari versions, for
  compatibility with earlier code. browser_version() returns correct
  version numbers for Safari.
  
  =head2 public_version(), public_major(), public_minor(), public_beta()
  
  Deprecated.  Please use browser_version() and related functions
  instead.
  
  =head2 gecko_version()
  
  If a Gecko rendering engine is used (as in Mozilla or Firefox), returns the
  engine version. If no Gecko browser is being used, or the version
  number can't be detected, returns undef.
  
  This is an old function, preserved for compatibility; please use
  engine_version() in new code.
  
  =head1 CREDITS
  
  Lee Semel, lee@semel.net (Original Author)
  
  Peter Walsham (co-maintainer)
  
  Olaf Alders, C<olaf at wundercounter.com> (co-maintainer)
  
  =head1 ACKNOWLEDGEMENTS
  
  Thanks to the following for their contributions:
  
  cho45
  
  Leonardo Herrera
  
  Denis F. Latypoff
  
  merlynkline
  
  Simon Waters
  
  Toni Cebrin
  
  Florian Merges
  
  david.hilton.p
  
  Steve Purkis
  
  Andrew McGregor
  
  Robin Smidsrod
  
  Richard Noble
  
  Josh Ritter
  
  Mike Clarke
  
  Marc Sebastian Pelzer
  
  Alexey Surikov
  
  Maros Kollar
  
  Jay Rifkin
  
  Luke Saunders
  
  Jacob Rask
  
  Heiko Weber
  
  Jon Jensen
  
  Jesse Thompson
  
  Graham Barr
  
  Enrico Sorcinelli
  
  Olivier Bilodeau
  
  Yoshiki Kurihara
  
  Paul Findlay
  
  Uwe Voelker
  
  Douglas Christopher Wilson
  
  John Oatis
  
  Atsushi Kato
  
  Ronald J. Kimball
  
  Bill Rhodes
  
  Thom Blake
  
  Aran Deltac
  
  yeahoffline
  
  David Ihnen
  
  Hao Wu
  
  Perlover
  
  Daniel Stadie
  
  ben hengst
  
  Andrew Moise
  
  Atsushi Kato
  
  Marco Fontani
  
  Nicolas Doye
  
  =head1 TO DO
  
  POD coverage is not 100%.
  
  =head1 SEE ALSO
  
  "Browser ID (User-Agent) Strings", L<http://www.zytrax.com/tech/web/browser_ids.htm>
  
  L<HTML::ParseBrowser>.
  
  =head1
  
  =head1 SUPPORT
  
  You can find documentation for this module with the perldoc command.
  
      perldoc HTTP::BrowserDetect
  
  You can also look for information at:
  
  =over 4
  
  =item * GitHub Source Repository
  
  L<http://github.com/oalders/http-browserdetect>
  
  =item * Reporting Issues
  
  L<https://github.com/oalders/http-browserdetect/issues>
  
  =item * AnnoCPAN: Annotated CPAN documentation
  
  L<http://annocpan.org/dist/HTTP-BrowserDetect>
  
  =item * CPAN Ratings
  
  L<http://cpanratings.perl.org/d/HTTP-BrowserDetect>
  
  =item * Search CPAN
  
  L<https://metacpan.org/module/HTTP::BrowserDetect>
  
  =back
  
  =head1 BUGS AND LIMITATIONS
  
  The biggest limitation at this point is the test suite, which really needs to
  have many more UserAgent strings to test against.
  
  =head1 CONTRIBUTING
  
  Patches are certainly welcome, with many thanks for the excellent contributions
  which have already been received. The preferred method of patching would be to
  fork the GitHub repo and then send me a pull request, but plain old patch files
  are also welcome.
  
  If you're able to add test cases, this will speed up the time to release your
  changes. Just edit t/useragents.json so that the test coverage includes any
  changes you have made. Please contact me if you have any questions.
  
  This distribution uses L<Dist::Zilla>. If you're not familiar with this module,
  please see L<https://github.com/oalders/http-browserdetect/issues/5> for some
  helpful tips to get you started.
  
  =head1 AUTHORS
  
  =over 4
  
  =item *
  
  Lee Semel <lee@semel.net>
  
  =item *
  
  Peter Walsham
  
  =item *
  
  Olaf Alders <olaf@wundercounter.com> (current maintainer)
  
  =back
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2019 by Lee Semel.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
HTTP_BROWSERDETECT

    $main::fatpacked{"HTTP/Config.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'HTTP_CONFIG';
  package HTTP::Config;
  
  use strict;
  use warnings;
  
  our $VERSION = '6.18';
  
  use URI;
  
  sub new {
      my $class = shift;
      return bless [], $class;
  }
  
  sub entries {
      my $self = shift;
      @$self;
  }
  
  sub empty {
      my $self = shift;
      not @$self;
  }
  
  sub add {
      if (@_ == 2) {
          my $self = shift;
          push(@$self, shift);
          return;
      }
      my($self, %spec) = @_;
      push(@$self, \%spec);
      return;
  }
  
  sub find2 {
      my($self, %spec) = @_;
      my @found;
      my @rest;
   ITEM:
      for my $item (@$self) {
          for my $k (keys %spec) {
              no warnings 'uninitialized';
              if (!exists $item->{$k} || $spec{$k} ne $item->{$k}) {
                  push(@rest, $item);
                  next ITEM;
              }
          }
          push(@found, $item);
      }
      return \@found unless wantarray;
      return \@found, \@rest;
  }
  
  sub find {
      my $self = shift;
      my $f = $self->find2(@_);
      return @$f if wantarray;
      return $f->[0];
  }
  
  sub remove {
      my($self, %spec) = @_;
      my($removed, $rest) = $self->find2(%spec);
      @$self = @$rest if @$removed;
      return @$removed;
  }
  
  my %MATCH = (
      m_scheme => sub {
          my($v, $uri) = @_;
          return $uri->_scheme eq $v;  # URI known to be canonical
      },
      m_secure => sub {
          my($v, $uri) = @_;
          my $secure = $uri->can("secure") ? $uri->secure : $uri->_scheme eq "https";
          return $secure == !!$v;
      },
      m_host_port => sub {
          my($v, $uri) = @_;
          return unless $uri->can("host_port");
          return $uri->host_port eq $v, 7;
      },
      m_host => sub {
          my($v, $uri) = @_;
          return unless $uri->can("host");
          return $uri->host eq $v, 6;
      },
      m_port => sub {
          my($v, $uri) = @_;
          return unless $uri->can("port");
          return $uri->port eq $v;
      },
      m_domain => sub {
          my($v, $uri) = @_;
          return unless $uri->can("host");
          my $h = $uri->host;
          $h = "$h.local" unless $h =~ /\./;
          $v = ".$v" unless $v =~ /^\./;
          return length($v), 5 if substr($h, -length($v)) eq $v;
          return 0;
      },
      m_path => sub {
          my($v, $uri) = @_;
          return unless $uri->can("path");
          return $uri->path eq $v, 4;
      },
      m_path_prefix => sub {
          my($v, $uri) = @_;
          return unless $uri->can("path");
          my $path = $uri->path;
          my $len = length($v);
          return $len, 3 if $path eq $v;
          return 0 if length($path) <= $len;
          $v .= "/" unless $v =~ m,/\z,,;
          return $len, 3 if substr($path, 0, length($v)) eq $v;
          return 0;
      },
      m_path_match => sub {
          my($v, $uri) = @_;
          return unless $uri->can("path");
          return $uri->path =~ $v;
      },
      m_uri__ => sub {
          my($v, $k, $uri) = @_;
          return unless $uri->can($k);
          return 1 unless defined $v;
          return $uri->$k eq $v;
      },
      m_method => sub {
          my($v, $uri, $request) = @_;
          return $request && $request->method eq $v;
      },
      m_proxy => sub {
          my($v, $uri, $request) = @_;
          return $request && ($request->{proxy} || "") eq $v;
      },
      m_code => sub {
          my($v, $uri, $request, $response) = @_;
          $v =~ s/xx\z//;
          return unless $response;
          return length($v), 2 if substr($response->code, 0, length($v)) eq $v;
      },
      m_media_type => sub {  # for request too??
          my($v, $uri, $request, $response) = @_;
          return unless $response;
          return 1, 1 if $v eq "*/*";
          my $ct = $response->content_type;
          return 2, 1 if $v =~ s,/\*\z,, && $ct =~ m,^\Q$v\E/,;
          return 3, 1 if $v eq "html" && $response->content_is_html;
          return 4, 1 if $v eq "xhtml" && $response->content_is_xhtml;
          return 10, 1 if $v eq $ct;
          return 0;
      },
      m_header__ => sub {
          my($v, $k, $uri, $request, $response) = @_;
          return unless $request;
          return 1 if $request->header($k) eq $v;
          return 1 if $response && $response->header($k) eq $v;
          return 0;
      },
      m_response_attr__ => sub {
          my($v, $k, $uri, $request, $response) = @_;
          return unless $response;
          return 1 if !defined($v) && exists $response->{$k};
          return 0 unless exists $response->{$k};
          return 1 if $response->{$k} eq $v;
          return 0;
      },
  );
  
  sub matching {
      my $self = shift;
      if (@_ == 1) {
          if ($_[0]->can("request")) {
              unshift(@_, $_[0]->request);
              unshift(@_, undef) unless defined $_[0];
          }
          unshift(@_, $_[0]->uri_canonical) if $_[0] && $_[0]->can("uri_canonical");
      }
      my($uri, $request, $response) = @_;
      $uri = URI->new($uri) unless ref($uri);
  
      my @m;
   ITEM:
      for my $item (@$self) {
          my $order;
          for my $ikey (keys %$item) {
              my $mkey = $ikey;
              my $k;
              $k = $1 if $mkey =~ s/__(.*)/__/;
              if (my $m = $MATCH{$mkey}) {
                  #print "$ikey $mkey\n";
                  my($c, $o);
                  my @arg = (
                      defined($k) ? $k : (),
                      $uri, $request, $response
                  );
                  my $v = $item->{$ikey};
                  $v = [$v] unless ref($v) eq "ARRAY";
                  for (@$v) {
                      ($c, $o) = $m->($_, @arg);
                      #print "  - $_ ==> $c $o\n";
                      last if $c;
                  }
                  next ITEM unless $c;
                  $order->[$o || 0] += $c;
              }
          }
          $order->[7] ||= 0;
          $item->{_order} = join(".", reverse map sprintf("%03d", $_ || 0), @$order);
          push(@m, $item);
      }
      @m = sort { $b->{_order} cmp $a->{_order} } @m;
      delete $_->{_order} for @m;
      return @m if wantarray;
      return $m[0];
  }
  
  sub add_item {
      my $self = shift;
      my $item = shift;
      return $self->add(item => $item, @_);
  }
  
  sub remove_items {
      my $self = shift;
      return map $_->{item}, $self->remove(@_);
  }
  
  sub matching_items {
      my $self = shift;
      return map $_->{item}, $self->matching(@_);
  }
  
  1;
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  HTTP::Config - Configuration for request and response objects
  
  =head1 VERSION
  
  version 6.18
  
  =head1 SYNOPSIS
  
   use HTTP::Config;
   my $c = HTTP::Config->new;
   $c->add(m_domain => ".example.com", m_scheme => "http", verbose => 1);
   
   use HTTP::Request;
   my $request = HTTP::Request->new(GET => "http://www.example.com");
   
   if (my @m = $c->matching($request)) {
      print "Yadayada\n" if $m[0]->{verbose};
   }
  
  =head1 DESCRIPTION
  
  An C<HTTP::Config> object is a list of entries that
  can be matched against request or request/response pairs.  Its
  purpose is to hold configuration data that can be looked up given a
  request or response object.
  
  Each configuration entry is a hash.  Some keys specify matching to
  occur against attributes of request/response objects.  Other keys can
  be used to hold user data.
  
  The following methods are provided:
  
  =over 4
  
  =item $conf = HTTP::Config->new
  
  Constructs a new empty C<HTTP::Config> object and returns it.
  
  =item $conf->entries
  
  Returns the list of entries in the configuration object.
  In scalar context returns the number of entries.
  
  =item $conf->empty
  
  Return true if there are no entries in the configuration object.
  This is just a shorthand for C<< not $conf->entries >>.
  
  =item $conf->add( %matchspec, %other )
  
  =item $conf->add( \%entry )
  
  Adds a new entry to the configuration.
  You can either pass separate key/value pairs or a hash reference.
  
  =item $conf->remove( %spec )
  
  Removes (and returns) the entries that have matches for all the key/value pairs in %spec.
  If %spec is empty this will match all entries; so it will empty the configuration object.
  
  =item $conf->matching( $uri, $request, $response )
  
  =item $conf->matching( $uri )
  
  =item $conf->matching( $request )
  
  =item $conf->matching( $response )
  
  Returns the entries that match the given $uri, $request and $response triplet.
  
  If called with a single $request object then the $uri is obtained by calling its 'uri_canonical' method.
  If called with a single $response object, then the request object is obtained by calling its 'request' method;
  and then the $uri is obtained as if a single $request was provided.
  
  The entries are returned with the most specific matches first.
  In scalar context returns the most specific match or C<undef> in none match.
  
  =item $conf->add_item( $item, %matchspec )
  
  =item $conf->remove_items( %spec )
  
  =item $conf->matching_items( $uri, $request, $response )
  
  Wrappers that hides the entries themselves.
  
  =back
  
  =head2 Matching
  
  The following keys on a configuration entry specify matching.  For all
  of these you can provide an array of values instead of a single value.
  The entry matches if at least one of the values in the array matches.
  
  Entries that require match against a response object attribute will never match
  unless a response object was provided.
  
  =over
  
  =item m_scheme => $scheme
  
  Matches if the URI uses the specified scheme; e.g. "http".
  
  =item m_secure => $bool
  
  If $bool is TRUE; matches if the URI uses a secure scheme.  If $bool
  is FALSE; matches if the URI does not use a secure scheme.  An example
  of a secure scheme is "https".
  
  =item m_host_port => "$hostname:$port"
  
  Matches if the URI's host_port method return the specified value.
  
  =item m_host => $hostname
  
  Matches if the URI's host method returns the specified value.
  
  =item m_port => $port
  
  Matches if the URI's port method returns the specified value.
  
  =item m_domain => ".$domain"
  
  Matches if the URI's host method return a value that within the given
  domain.  The hostname "www.example.com" will for instance match the
  domain ".com".
  
  =item m_path => $path
  
  Matches if the URI's path method returns the specified value.
  
  =item m_path_prefix => $path
  
  Matches if the URI's path is the specified path or has the specified
  path as prefix.
  
  =item m_path_match => $Regexp
  
  Matches if the regular expression matches the URI's path.  Eg. qr/\.html$/.
  
  =item m_method => $method
  
  Matches if the request method matches the specified value. Eg. "GET" or "POST".
  
  =item m_code => $digit
  
  =item m_code => $status_code
  
  Matches if the response status code matches.  If a single digit is
  specified; matches for all response status codes beginning with that digit.
  
  =item m_proxy => $url
  
  Matches if the request is to be sent to the given Proxy server.
  
  =item m_media_type => "*/*"
  
  =item m_media_type => "text/*"
  
  =item m_media_type => "html"
  
  =item m_media_type => "xhtml"
  
  =item m_media_type => "text/html"
  
  Matches if the response media type matches.
  
  With a value of "html" matches if $response->content_is_html returns TRUE.
  With a value of "xhtml" matches if $response->content_is_xhtml returns TRUE.
  
  =item m_uri__I<$method> => undef
  
  Matches if the URI object provides the method.
  
  =item m_uri__I<$method> => $string
  
  Matches if the URI's $method method returns the given value.
  
  =item m_header__I<$field> => $string
  
  Matches if either the request or the response have a header $field with the given value.
  
  =item m_response_attr__I<$key> => undef
  
  =item m_response_attr__I<$key> => $string
  
  Matches if the response object has that key, or the entry has the given value.
  
  =back
  
  =head1 SEE ALSO
  
  L<URI>, L<HTTP::Request>, L<HTTP::Response>
  
  =head1 AUTHOR
  
  Gisle Aas <gisle@activestate.com>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 1994-2017 by Gisle Aas.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
  
  __END__
  
  
  #ABSTRACT: Configuration for request and response objects
  
HTTP_CONFIG

    $main::fatpacked{"HTTP/Cookies.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'HTTP_COOKIES';
  package HTTP::Cookies;
  
  use strict;
  use HTTP::Date qw(str2time parse_date time2str);
  use HTTP::Headers::Util qw(_split_header_words join_header_words);
  
  use vars qw($EPOCH_OFFSET);
  our $VERSION = '6.04';
  
  # Legacy: because "use "HTTP::Cookies" used be the ONLY way
  #  to load the class HTTP::Cookies::Netscape.
  require HTTP::Cookies::Netscape;
  
  $EPOCH_OFFSET = 0;  # difference from Unix epoch
  if ($^O eq "MacOS") {
      require Time::Local;
      $EPOCH_OFFSET = Time::Local::timelocal(0,0,0,1,0,70);
  }
  
  # A HTTP::Cookies object is a hash.  The main attribute is the
  # COOKIES 3 level hash:  $self->{COOKIES}{$domain}{$path}{$key}.
  
  sub new
  {
      my $class = shift;
      my $self = bless {
  	COOKIES => {},
      }, $class;
      my %cnf = @_;
      for (keys %cnf) {
  	$self->{lc($_)} = $cnf{$_};
      }
      $self->load;
      $self;
  }
  
  
  sub add_cookie_header
  {
      my $self = shift;
      my $request = shift || return;
      my $url = $request->uri;
      my $scheme = $url->scheme;
      unless ($scheme =~ /^https?\z/) {
  	return;
      }
  
      my $domain = _host($request, $url);
      $domain = "$domain.local" unless $domain =~ /\./;
      my $secure_request = ($scheme eq "https");
      my $req_path = _url_path($url);
      my $req_port = $url->port;
      my $now = time();
      _normalize_path($req_path) if $req_path =~ /%/;
  
      my @cval;    # cookie values for the "Cookie" header
      my $set_ver;
      my $netscape_only = 0; # An exact domain match applies to any cookie
  
      while ($domain =~ /\./) {
          # Checking $domain for cookies"
  	my $cookies = $self->{COOKIES}{$domain};
  	next unless $cookies;
  	if ($self->{delayload} && defined($cookies->{'//+delayload'})) {
  	    my $cookie_data = $cookies->{'//+delayload'}{'cookie'};
  	    delete $self->{COOKIES}{$domain};
  	    $self->load_cookie($cookie_data->[1]);
  	    $cookies = $self->{COOKIES}{$domain};
  	    next unless $cookies;  # should not really happen
  	}
  
  	# Want to add cookies corresponding to the most specific paths
  	# first (i.e. longest path first)
  	my $path;
  	for $path (sort {length($b) <=> length($a) } keys %$cookies) {
  	    if (index($req_path, $path) != 0) {
  		next;
  	    }
  
  	    my($key,$array);
  	    while (($key,$array) = each %{$cookies->{$path}}) {
  		my($version,$val,$port,$path_spec,$secure,$expires) = @$array;
  		if ($secure && !$secure_request) {
  		    next;
  		}
  		if ($expires && $expires < $now) {
  		    next;
  		}
  		if ($port) {
  		    my $found;
  		    if ($port =~ s/^_//) {
  			# The corresponding Set-Cookie attribute was empty
  			$found++ if $port eq $req_port;
  			$port = "";
  		    }
  		    else {
  			my $p;
  			for $p (split(/,/, $port)) {
  			    $found++, last if $p eq $req_port;
  			}
  		    }
  		    unless ($found) {
  			next;
  		    }
  		}
  		if ($version > 0 && $netscape_only) {
  		    next;
  		}
  
  		# set version number of cookie header.
  	        # XXX: What should it be if multiple matching
                  #      Set-Cookie headers have different versions themselves
  		if (!$set_ver++) {
  		    if ($version >= 1) {
  			push(@cval, "\$Version=$version");
  		    }
  		    elsif (!$self->{hide_cookie2}) {
  			$request->header(Cookie2 => '$Version="1"');
  		    }
  		}
  
  		# do we need to quote the value
  		if ($val =~ /\W/ && $version) {
  		    $val =~ s/([\\\"])/\\$1/g;
  		    $val = qq("$val");
  		}
  
  		# and finally remember this cookie
  		push(@cval, "$key=$val");
  		if ($version >= 1) {
  		    push(@cval, qq(\$Path="$path"))     if $path_spec;
  		    push(@cval, qq(\$Domain="$domain")) if $domain =~ /^\./;
  		    if (defined $port) {
  			my $p = '$Port';
  			$p .= qq(="$port") if length $port;
  			push(@cval, $p);
  		    }
  		}
  
  	    }
          }
  
      } continue {
  	# Try with a more general domain, alternately stripping
  	# leading name components and leading dots.  When this
  	# results in a domain with no leading dot, it is for
  	# Netscape cookie compatibility only:
  	#
  	# a.b.c.net	Any cookie
  	# .b.c.net	Any cookie
  	# b.c.net	Netscape cookie only
  	# .c.net	Any cookie
  
  	if ($domain =~ s/^\.+//) {
  	    $netscape_only = 1;
  	}
  	else {
  	    $domain =~ s/[^.]*//;
  	    $netscape_only = 0;
  	}
      }
  
      if (@cval) {
  	if (my $old = $request->header("Cookie")) {
  	    unshift(@cval, $old);
  	}
  	$request->header(Cookie => join("; ", @cval));
  	if (my $hash = $request->{_http_cookies}) {
  	    %$hash = (map split(/=/, $_, 2), @cval);
  	}
      }
  
      $request;
  }
  
  
  sub get_cookies
  {
      my $self = shift;
      my $url = shift;
      $url = "https://$url" unless $url =~ m,^[a-zA-Z][a-zA-Z0-9.+\-]*:,;
      require HTTP::Request;
      my $req = HTTP::Request->new(GET => $url);
      my $cookies = $req->{_http_cookies} = {};
      $self->add_cookie_header($req);
      if (@_) {
  	return map $cookies->{$_}, @_ if wantarray;
  	return $cookies->{$_[0]};
      }
      return $cookies;
  }
  
  
  sub extract_cookies
  {
      my $self = shift;
      my $response = shift || return;
  
      my @set = _split_header_words($response->_header("Set-Cookie2"));
      my @ns_set = $response->_header("Set-Cookie");
  
      return $response unless @set || @ns_set;  # quick exit
  
      my $request = $response->request;
      my $url = $request->uri;
      my $req_host = _host($request, $url);
      $req_host = "$req_host.local" unless $req_host =~ /\./;
      my $req_port = $url->port;
      my $req_path = _url_path($url);
      _normalize_path($req_path) if $req_path =~ /%/;
  
      if (@ns_set) {
  	# The old Netscape cookie format for Set-Cookie
  	# http://curl.haxx.se/rfc/cookie_spec.html
  	# can for instance contain an unquoted "," in the expires
  	# field, so we have to use this ad-hoc parser.
  	my $now = time();
  
  	# Build a hash of cookies that was present in Set-Cookie2
  	# headers.  We need to skip them if we also find them in a
  	# Set-Cookie header.
  	my %in_set2;
  	for (@set) {
  	    $in_set2{$_->[0]}++;
  	}
  
  	my $set;
  	for $set (@ns_set) {
              $set =~ s/^\s+//;
  	    my @cur;
  	    my $param;
  	    my $expires;
  	    my $first_param = 1;
  	    for $param (split(/;\s*/, $set)) {
                  next unless length($param);
  		my($k,$v) = split(/\s*=\s*/, $param, 2);
  		if (defined $v) {
  		    $v =~ s/\s+$//;
  		    #print "$k => $v\n";
  		}
  		else {
  		    $k =~ s/\s+$//;
  		    #print "$k => undef";
  		}
  		if (!$first_param && lc($k) eq "expires") {
  		    my $etime = str2time($v);
  		    if (defined $etime) {
  			push(@cur, "Max-Age" => $etime - $now);
  			$expires++;
  		    }
  		    else {
  			# parse_date can deal with years outside the range of time_t,
  			my($year, $mon, $day, $hour, $min, $sec, $tz) = parse_date($v);
  			if ($year) {
  			    my $thisyear = (gmtime)[5] + 1900;
  			    if ($year < $thisyear) {
  				push(@cur, "Max-Age" => -1);  # any negative value will do
  				$expires++;
  			    }
  			    elsif ($year >= $thisyear + 10) {
  				# the date is at least 10 years into the future, just replace
  				# it with something approximate
  				push(@cur, "Max-Age" => 10 * 365 * 24 * 60 * 60);
  				$expires++;
  			    }
  			}
  		    }
  		}
                  elsif (!$first_param && lc($k) =~ /^(?:version|discard|ns-cookie)/) {
                      # ignore
                  }
  		else {
  		    push(@cur, $k => $v);
  		}
  		$first_param = 0;
  	    }
              next unless @cur;
  	    next if $in_set2{$cur[0]};
  
  #	    push(@cur, "Port" => $req_port);
  	    push(@cur, "Discard" => undef) unless $expires;
  	    push(@cur, "Version" => 0);
  	    push(@cur, "ns-cookie" => 1);
  	    push(@set, \@cur);
  	}
      }
  
    SET_COOKIE:
      for my $set (@set) {
  	next unless @$set >= 2;
  
  	my $key = shift @$set;
  	my $val = shift @$set;
  
  	my %hash;
  	while (@$set) {
  	    my $k = shift @$set;
  	    my $v = shift @$set;
  	    my $lc = lc($k);
  	    # don't loose case distinction for unknown fields
  	    $k = $lc if $lc =~ /^(?:discard|domain|max-age|
                                      path|port|secure|version)$/x;
  	    if ($k eq "discard" || $k eq "secure") {
  		$v = 1 unless defined $v;
  	    }
  	    next if exists $hash{$k};  # only first value is significant
  	    $hash{$k} = $v;
  	};
  
  	my %orig_hash = %hash;
  	my $version   = delete $hash{version};
  	$version = 1 unless defined($version);
  	my $discard   = delete $hash{discard};
  	my $secure    = delete $hash{secure};
  	my $maxage    = delete $hash{'max-age'};
  	my $ns_cookie = delete $hash{'ns-cookie'};
  
  	# Check domain
  	my $domain  = delete $hash{domain};
  	$domain = lc($domain) if defined $domain;
  	if (defined($domain)
  	    && $domain ne $req_host && $domain ne ".$req_host") {
  	    if ($domain !~ /\./ && $domain ne "local") {
  		next SET_COOKIE;
  	    }
  	    $domain = ".$domain" unless $domain =~ /^\./;
  	    if ($domain =~ /\.\d+$/) {
  		next SET_COOKIE;
  	    }
  	    my $len = length($domain);
  	    unless (substr($req_host, -$len) eq $domain) {
  		next SET_COOKIE;
  	    }
  	    my $hostpre = substr($req_host, 0, length($req_host) - $len);
  	    if ($hostpre =~ /\./ && !$ns_cookie) {
  		next SET_COOKIE;
  	    }
  	}
  	else {
  	    $domain = $req_host;
  	}
  
  	my $path = delete $hash{path};
  	my $path_spec;
  	if (defined $path && $path ne '') {
  	    $path_spec++;
  	    _normalize_path($path) if $path =~ /%/;
  	    if (!$ns_cookie &&
                  substr($req_path, 0, length($path)) ne $path) {
  		next SET_COOKIE;
  	    }
  	}
  	else {
  	    $path = $req_path;
  	    $path =~ s,/[^/]*$,,;
  	    $path = "/" unless length($path);
  	}
  
  	my $port;
  	if (exists $hash{port}) {
  	    $port = delete $hash{port};
  	    if (defined $port) {
  		$port =~ s/\s+//g;
  		my $found;
  		for my $p (split(/,/, $port)) {
  		    unless ($p =~ /^\d+$/) {
  			next SET_COOKIE;
  		    }
  		    $found++ if $p eq $req_port;
  		}
  		unless ($found) {
  		    next SET_COOKIE;
  		}
  	    }
  	    else {
  		$port = "_$req_port";
  	    }
  	}
  	$self->set_cookie($version,$key,$val,$path,$domain,$port,$path_spec,$secure,$maxage,$discard, \%hash)
  	    if $self->set_cookie_ok(\%orig_hash);
      }
  
      $response;
  }
  
  sub set_cookie_ok
  {
      1;
  }
  
  
  sub set_cookie
  {
      my $self = shift;
      my($version,
         $key, $val, $path, $domain, $port,
         $path_spec, $secure, $maxage, $discard, $rest) = @_;
  
      # path and key can not be empty (key can't start with '$')
      return $self if !defined($path) || $path !~ m,^/, ||
  	            !defined($key)  || $key  =~ m,^\$,;
  
      # ensure legal port
      if (defined $port) {
  	return $self unless $port =~ /^_?\d+(?:,\d+)*$/;
      }
  
      my $expires;
      if (defined $maxage) {
  	if ($maxage <= 0) {
  	    delete $self->{COOKIES}{$domain}{$path}{$key};
  	    return $self;
  	}
  	$expires = time() + $maxage;
      }
      $version = 0 unless defined $version;
  
      my @array = ($version, $val,$port,
  		 $path_spec,
  		 $secure, $expires, $discard);
      push(@array, {%$rest}) if defined($rest) && %$rest;
      # trim off undefined values at end
      pop(@array) while !defined $array[-1];
  
      $self->{COOKIES}{$domain}{$path}{$key} = \@array;
      $self;
  }
  
  
  sub save
  {
      my $self = shift;
      my $file = shift || $self->{'file'} || return;
      open(my $fh, '>', $file) or die "Can't open $file: $!";
      print {$fh} "#LWP-Cookies-1.0\n";
      print {$fh} $self->as_string(!$self->{ignore_discard});
      1;
  }
  
  
  sub load
  {
      my $self = shift;
      my $file = shift || $self->{'file'} || return;
  
      local $/ = "\n";  # make sure we got standard record separator
      open(my $fh, '<', $file) or return;
  
      # check that we have the proper header
      my $magic = <$fh>;
      chomp $magic;
      unless ($magic =~ /^#LWP-Cookies-\d+\.\d+/) {
          warn "$file does not seem to contain cookies";
          return;
      }
  
      # go through the file
      while (my $line = <$fh>) {
          chomp $line;
          next unless $line =~ s/^Set-Cookie3:\s*//;
          my $cookie;
          for $cookie (_split_header_words($line)) {
              my($key,$val) = splice(@$cookie, 0, 2);
              my %hash;
              while (@$cookie) {
                  my $k = shift @$cookie;
                  my $v = shift @$cookie;
                  $hash{$k} = $v;
              }
              my $version   = delete $hash{version};
              my $path      = delete $hash{path};
              my $domain    = delete $hash{domain};
              my $port      = delete $hash{port};
              my $expires   = str2time(delete $hash{expires});
  
              my $path_spec = exists $hash{path_spec}; delete $hash{path_spec};
              my $secure    = exists $hash{secure};    delete $hash{secure};
              my $discard   = exists $hash{discard};   delete $hash{discard};
  
              my @array = ($version, $val, $port, $path_spec, $secure, $expires,
                  $discard);
              push(@array, \%hash) if %hash;
              $self->{COOKIES}{$domain}{$path}{$key} = \@array;
          }
      }
      1;
  }
  
  
  sub revert
  {
      my $self = shift;
      $self->clear->load;
      $self;
  }
  
  
  sub clear
  {
      my $self = shift;
      if (@_ == 0) {
  	$self->{COOKIES} = {};
      }
      elsif (@_ == 1) {
  	delete $self->{COOKIES}{$_[0]};
      }
      elsif (@_ == 2) {
  	delete $self->{COOKIES}{$_[0]}{$_[1]};
      }
      elsif (@_ == 3) {
  	delete $self->{COOKIES}{$_[0]}{$_[1]}{$_[2]};
      }
      else {
  	require Carp;
          Carp::carp('Usage: $c->clear([domain [,path [,key]]])');
      }
      $self;
  }
  
  
  sub clear_temporary_cookies
  {
      my($self) = @_;
  
      $self->scan(sub {
          if($_[9] or        # "Discard" flag set
             not $_[8]) {    # No expire field?
              $_[8] = -1;            # Set the expire/max_age field
              $self->set_cookie(@_); # Clear the cookie
          }
        });
  }
  
  
  sub DESTROY
  {
      my $self = shift;
      local($., $@, $!, $^E, $?);
      $self->save if $self->{'autosave'};
  }
  
  
  sub scan
  {
      my($self, $cb) = @_;
      my($domain,$path,$key);
      for $domain (sort keys %{$self->{COOKIES}}) {
  	for $path (sort keys %{$self->{COOKIES}{$domain}}) {
  	    for $key (sort keys %{$self->{COOKIES}{$domain}{$path}}) {
  		my($version,$val,$port,$path_spec,
  		   $secure,$expires,$discard,$rest) =
  		       @{$self->{COOKIES}{$domain}{$path}{$key}};
  		$rest = {} unless defined($rest);
  		&$cb($version,$key,$val,$path,$domain,$port,
  		     $path_spec,$secure,$expires,$discard,$rest);
  	    }
  	}
      }
  }
  
  
  sub as_string
  {
      my($self, $skip_discard) = @_;
      my @res;
      $self->scan(sub {
  	my($version,$key,$val,$path,$domain,$port,
  	   $path_spec,$secure,$expires,$discard,$rest) = @_;
  	return if $discard && $skip_discard;
  	my @h = ($key, $val);
  	push(@h, "path", $path);
  	push(@h, "domain" => $domain);
  	push(@h, "port" => $port) if defined $port;
  	push(@h, "path_spec" => undef) if $path_spec;
  	push(@h, "secure" => undef) if $secure;
  	push(@h, "expires" => HTTP::Date::time2isoz($expires)) if $expires;
  	push(@h, "discard" => undef) if $discard;
  	my $k;
  	for $k (sort keys %$rest) {
  	    push(@h, $k, $rest->{$k});
  	}
  	push(@h, "version" => $version);
  	push(@res, "Set-Cookie3: " . join_header_words(\@h));
      });
      join("\n", @res, "");
  }
  
  sub _host
  {
      my($request, $url) = @_;
      if (my $h = $request->header("Host")) {
  	$h =~ s/:\d+$//;  # might have a port as well
  	return lc($h);
      }
      return lc($url->host);
  }
  
  sub _url_path
  {
      my $url = shift;
      my $path;
      if($url->can('epath')) {
         $path = $url->epath;    # URI::URL method
      }
      else {
         $path = $url->path;           # URI::_generic method
      }
      $path = "/" unless length $path;
      $path;
  }
  
  sub _normalize_path  # so that plain string compare can be used
  {
      my $x;
      $_[0] =~ s/%([0-9a-fA-F][0-9a-fA-F])/
  	         $x = uc($1);
                   $x eq "2F" || $x eq "25" ? "%$x" :
                                              pack("C", hex($x));
                /eg;
      $_[0] =~ s/([\0-\x20\x7f-\xff])/sprintf("%%%02X",ord($1))/eg;
  }
  
  1;
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  HTTP::Cookies - HTTP cookie jars
  
  =head1 VERSION
  
  version 6.04
  
  =head1 SYNOPSIS
  
    use HTTP::Cookies;
    $cookie_jar = HTTP::Cookies->new(
      file => "$ENV{'HOME'}/lwp_cookies.dat",
      autosave => 1,
    );
  
    use LWP;
    my $browser = LWP::UserAgent->new;
    $browser->cookie_jar($cookie_jar);
  
  Or for an empty and temporary cookie jar:
  
    use LWP;
    my $browser = LWP::UserAgent->new;
    $browser->cookie_jar( {} );
  
  =head1 DESCRIPTION
  
  This class is for objects that represent a "cookie jar" -- that is, a
  database of all the HTTP cookies that a given LWP::UserAgent object
  knows about.
  
  Cookies are a general mechanism which server side connections can use
  to both store and retrieve information on the client side of the
  connection.  For more information about cookies refer to
  <URL:http://curl.haxx.se/rfc/cookie_spec.html> and
  <URL:http://www.cookiecentral.com/>.  This module also implements the
  new style cookies described in L<RFC 2965|https://tools.ietf.org/html/rfc2965>.
  The two variants of cookies are supposed to be able to coexist happily.
  
  Instances of the class I<HTTP::Cookies> are able to store a collection
  of Set-Cookie2: and Set-Cookie: headers and are able to use this
  information to initialize Cookie-headers in I<HTTP::Request> objects.
  The state of a I<HTTP::Cookies> object can be saved in and restored from
  files.
  
  =head1 LIMITATIONS
  
  This module does not support L<< Public Suffix|https://publicsuffix.org/
  >> encouraged by a more recent standard, L<< RFC
  6265|https://tools.ietf.org/html/rfc6265 >>.
  
  This module's shortcomings mean that a malicious Web site can set
  cookies to track your user agent across all sites under a top level
  domain.  See F<< t/publicsuffix.t >> in this module's distribution for
  details.
  
  L<< HTTP::CookieJar::LWP >> supports Public Suffix, but only provides a
  limited subset of this module's functionality and L<< does not
  support|HTTP::CookieJar/LIMITATIONS-AND-CAVEATS >> standards older than
  I<RFC 6265>.
  
  =head1 METHODS
  
  The following methods are provided:
  
  =over 4
  
  =item $cookie_jar = HTTP::Cookies->new
  
  The constructor takes hash style parameters.  The following
  parameters are recognized:
  
    file:            name of the file to restore cookies from and save cookies to
    autosave:        save during destruction (bool)
    ignore_discard:  save even cookies that are requested to be discarded (bool)
    hide_cookie2:    do not add Cookie2 header to requests
  
  Future parameters might include (not yet implemented):
  
    max_cookies               300
    max_cookies_per_domain    20
    max_cookie_size           4096
  
    no_cookies   list of domain names that we never return cookies to
  
  =item $cookie_jar->get_cookies( $url_or_domain )
  
  =item $cookie_jar->get_cookies( $url_or_domain, $cookie_key,... )
  
  Returns a hash of the cookies that applies to the given URL. If a
  domainname is given as argument, then a prefix of "https://" is assumed.
  
  If one or more $cookie_key parameters are provided return the given values,
  or C<undef> if the cookie isn't available.
  
  =item $cookie_jar->add_cookie_header( $request )
  
  The add_cookie_header() method will set the appropriate Cookie:-header
  for the I<HTTP::Request> object given as argument.  The $request must
  have a valid url attribute before this method is called.
  
  =item $cookie_jar->extract_cookies( $response )
  
  The extract_cookies() method will look for Set-Cookie: and
  Set-Cookie2: headers in the I<HTTP::Response> object passed as
  argument.  Any of these headers that are found are used to update
  the state of the $cookie_jar.
  
  =item $cookie_jar->set_cookie( $version, $key, $val, $path, $domain, $port, $path_spec, $secure, $maxage, $discard, \%rest )
  
  The set_cookie() method updates the state of the $cookie_jar.  The
  $key, $val, $domain, $port and $path arguments are strings.  The
  $path_spec, $secure, $discard arguments are boolean values. The $maxage
  value is a number indicating number of seconds that this cookie will
  live.  A value of $maxage <= 0 will delete this cookie.  %rest defines
  various other attributes like "Comment" and "CommentURL".
  
  =item $cookie_jar->save
  
  =item $cookie_jar->save( $file )
  
  This method file saves the state of the $cookie_jar to a file.
  The state can then be restored later using the load() method.  If a
  filename is not specified we will use the name specified during
  construction.  If the attribute I<ignore_discard> is set, then we
  will even save cookies that are marked to be discarded.
  
  The default is to save a sequence of "Set-Cookie3" lines.
  "Set-Cookie3" is a proprietary LWP format, not known to be compatible
  with any browser.  The I<HTTP::Cookies::Netscape> sub-class can
  be used to save in a format compatible with Netscape.
  
  =item $cookie_jar->load
  
  =item $cookie_jar->load( $file )
  
  This method reads the cookies from the file and adds them to the
  $cookie_jar.  The file must be in the format written by the save()
  method.
  
  =item $cookie_jar->revert
  
  This method empties the $cookie_jar and re-loads the $cookie_jar
  from the last save file.
  
  =item $cookie_jar->clear
  
  =item $cookie_jar->clear( $domain )
  
  =item $cookie_jar->clear( $domain, $path )
  
  =item $cookie_jar->clear( $domain, $path, $key )
  
  Invoking this method without arguments will empty the whole
  $cookie_jar.  If given a single argument only cookies belonging to
  that domain will be removed.  If given two arguments, cookies
  belonging to the specified path within that domain are removed.  If
  given three arguments, then the cookie with the specified key, path
  and domain is removed.
  
  =item $cookie_jar->clear_temporary_cookies
  
  Discard all temporary cookies. Scans for all cookies in the jar
  with either no expire field or a true C<discard> flag. To be
  called when the user agent shuts down according to RFC 2965.
  
  =item $cookie_jar->scan( \&callback )
  
  The argument is a subroutine that will be invoked for each cookie
  stored in the $cookie_jar.  The subroutine will be invoked with
  the following arguments:
  
    0  version
    1  key
    2  val
    3  path
    4  domain
    5  port
    6  path_spec
    7  secure
    8  expires
    9  discard
   10  hash
  
  =item $cookie_jar->as_string
  
  =item $cookie_jar->as_string( $skip_discardables )
  
  The as_string() method will return the state of the $cookie_jar
  represented as a sequence of "Set-Cookie3" header lines separated by
  "\n".  If $skip_discardables is TRUE, it will not return lines for
  cookies with the I<Discard> attribute.
  
  =back
  
  =head1 SEE ALSO
  
  L<HTTP::Cookies::Netscape>, L<HTTP::Cookies::Microsoft>
  
  =head1 AUTHOR
  
  Gisle Aas <gisle@activestate.com>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2002-2017 by Gisle Aas.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
  
  __END__
  #ABSTRACT: HTTP cookie jars
  
HTTP_COOKIES

    $main::fatpacked{"HTTP/Cookies/Microsoft.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'HTTP_COOKIES_MICROSOFT';
  package HTTP::Cookies::Microsoft;
  
  use strict;
  
  use vars qw(@ISA);
  
  our $VERSION = '6.04';
  
  require HTTP::Cookies;
  @ISA=qw(HTTP::Cookies);
  
  sub load_cookies_from_file
  {
      my ($file) = @_;
      my @cookies;
  
      open (my $fh, '<', $file) || return;
  
      while (my $key = <$fh>) {
          chomp $key;
          my ($value, $domain_path, $flags, $lo_expire, $hi_expire);
          my ($lo_create, $hi_create, $sep);
          chomp($value     = <$fh>);
          chomp($domain_path= <$fh>);
          chomp($flags     = <$fh>); # 0x0001 bit is for secure
          chomp($lo_expire = <$fh>);
          chomp($hi_expire = <$fh>);
          chomp($lo_create = <$fh>);
          chomp($hi_create = <$fh>);
          chomp($sep       = <$fh>);
  
          if (!defined($key) || !defined($value) || !defined($domain_path) ||
              !defined($flags) || !defined($hi_expire) || !defined($lo_expire) ||
              !defined($hi_create) || !defined($lo_create) || !defined($sep) ||
              ($sep ne '*'))
          {
              last;
          }
  
          if ($domain_path =~ /^([^\/]+)(\/.*)$/) {
              my $domain = $1;
              my $path = $2;
  
              push @cookies, {
                  KEY => $key, VALUE => $value, DOMAIN => $domain,
                  PATH => $path, FLAGS =>$flags, HIXP =>$hi_expire,
                  LOXP => $lo_expire, HICREATE => $hi_create,
                  LOCREATE => $lo_create
              };
          }
      }
  
      return \@cookies;
  }
  
  sub get_user_name
  {
  	use Win32;
  	use locale;
  	my $user = lc(Win32::LoginName());
  
  	return $user;
  }
  
  # MSIE stores create and expire times as Win32 FILETIME,
  # which is 64 bits of 100 nanosecond intervals since Jan 01 1601
  #
  # But Cookies code expects time in 32-bit value expressed
  # in seconds since Jan 01 1970
  #
  sub epoch_time_offset_from_win32_filetime
  {
  	my ($high, $low) = @_;
  
  	#--------------------------------------------------------
  	# USEFUL CONSTANT
  	#--------------------------------------------------------
  	# 0x019db1de 0xd53e8000 is 1970 Jan 01 00:00:00 in Win32 FILETIME
  	#
  	# 100 nanosecond intervals == 0.1 microsecond intervals
  
  	my $filetime_low32_1970 = 0xd53e8000;
  	my $filetime_high32_1970 = 0x019db1de;
  
  	#------------------------------------
  	# ALGORITHM
  	#------------------------------------
  	# To go from 100 nanosecond intervals to seconds since 00:00 Jan 01 1970:
  	#
  	# 1. Adjust 100 nanosecond intervals to Jan 01 1970 base
  	# 2. Divide by 10 to get to microseconds (1/millionth second)
  	# 3. Divide by 1000000 (10 ^ 6) to get to seconds
  	#
  	# We can combine Step 2 & 3 into one divide.
  	#
  	# After much trial and error, I came up with the following code which
  	# avoids using Math::BigInt or floating pt, but still gives correct answers
  
  	# If the filetime is before the epoch, return 0
  	if (($high < $filetime_high32_1970) ||
  	    (($high == $filetime_high32_1970) && ($low < $filetime_low32_1970)))
      	{
  		return 0;
  	}
  
  	# Can't multiply by 0x100000000, (1 << 32),
  	# without Perl issuing an integer overflow warning
  	#
  	# So use two multiplies by 0x10000 instead of one multiply by 0x100000000
  	#
  	# The result is the same.
  	#
  	my $date1970 = (($filetime_high32_1970 * 0x10000) * 0x10000) + $filetime_low32_1970;
  	my $time = (($high * 0x10000) * 0x10000) + $low;
  
  	$time -= $date1970;
  	$time /= 10000000;
  
  	return $time;
  }
  
  sub load_cookie
  {
  	my($self, $file) = @_;
          my $now = time() - $HTTP::Cookies::EPOCH_OFFSET;
  	my $cookie_data;
  
          if (-f $file)
          {
  		# open the cookie file and get the data
  		$cookie_data = load_cookies_from_file($file);
  
  		foreach my $cookie (@{$cookie_data})
  		{
  			my $secure = ($cookie->{FLAGS} & 1) != 0;
  			my $expires = epoch_time_offset_from_win32_filetime($cookie->{HIXP}, $cookie->{LOXP});
  
  			$self->set_cookie(undef, $cookie->{KEY}, $cookie->{VALUE},
  					  $cookie->{PATH}, $cookie->{DOMAIN}, undef,
  					  0, $secure, $expires-$now, 0);
  		}
  	}
  }
  
  sub load
  {
      my($self, $cookie_index) = @_;
      my $now = time() - $HTTP::Cookies::EPOCH_OFFSET;
      my $cookie_dir = '';
      my $delay_load = (defined($self->{'delayload'}) && $self->{'delayload'});
      my $user_name = get_user_name();
      my $data;
  
      $cookie_index ||= $self->{'file'} || return;
      if ($cookie_index =~ /[\\\/][^\\\/]+$/) {
          $cookie_dir = $` . "\\";
      }
  
      open (my $fh, '<:raw', $cookie_index) || return;
      if (256 != read($fh, $data, 256)) {
          warn "$cookie_index file is not large enough";
          return;
      }
  
      # Cookies' index.dat file starts with 32 bytes of signature
      # followed by an offset to the first record, stored as a little-endian DWORD
      my ($sig, $size) = unpack('a32 V', $data);
  
      # check that sig is valid (only tested in IE6.0)
      if (($sig !~ /^Client UrlCache MMF Ver 5\.2/) || (0x4000 != $size)) {
          warn "$cookie_index ['$sig' $size] does not seem to contain cookies";
          return;
      }
  
      # move the file ptr to start of the first record
      if (0 == seek($fh, $size, 0)) {
          return;
      }
  
      # Cookies are usually stored in 'URL ' records in two contiguous 0x80 byte sectors (256 bytes)
      # so read in two 0x80 byte sectors and adjust if not a Cookie.
      while (256 == read($fh, $data, 256)) {
          # each record starts with a 4-byte signature
          # and a count (little-endian DWORD) of 0x80 byte sectors for the record
          ($sig, $size) = unpack('a4 V', $data);
  
          # Cookies are found in 'URL ' records
          if ('URL ' ne $sig) {
              # skip over uninteresting record: I've seen 'HASH' and 'LEAK' records
              if (($sig eq 'HASH') || ($sig eq 'LEAK')) {
                  # '-2' takes into account the two 0x80 byte sectors we've just read in
                  if (($size > 0) && ($size != 2)) {
                      if (0 == seek($fh, ($size-2)*0x80, 1)) {
                          # Seek failed. Something's wrong. Gonna stop.
                          last;
                      }
                  }
              }
              next;
          }
  
          #$REMOVE Need to check if URL records in Cookies' index.dat will
          #        ever use more than two 0x80 byte sectors
          if ($size > 2) {
              my $more_data = ($size-2)*0x80;
  
              if ($more_data != read($fh, $data, $more_data, 256)) {
                  last;
              }
          }
  
          (my $user_name2 = $user_name) =~ s/ /_/g;
          if ($data =~ /Cookie:\Q$user_name\E@([\x21-\xFF]+).*?((?:\Q$user_name\E|\Q$user_name2\E)@[\x21-\xFF]+\.txt)/) {
              my $cookie_file = $cookie_dir . $2; # form full pathname
  
              if (!$delay_load) {
                  $self->load_cookie($cookie_file);
              }
              else {
                  my $domain = $1;
  
                  # grab only the domain name, drop everything from the first dir sep on
                  if ($domain =~ m{[\\/]}) {
                      $domain = $`;
                  }
  
                  # set the delayload cookie for this domain with
                  # the cookie_file as cookie for later-loading info
                  $self->set_cookie(undef, 'cookie', $cookie_file, '//+delayload', $domain, undef, 0, 0, $now+86400, 0);
              }
          }
      }
  
      1;
  }
  
  1;
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  HTTP::Cookies::Microsoft - Access to Microsoft cookies files
  
  =head1 VERSION
  
  version 6.04
  
  =head1 SYNOPSIS
  
   use LWP;
   use HTTP::Cookies::Microsoft;
   use Win32::TieRegistry(Delimiter => "/");
   my $cookies_dir = $Registry->
        {"CUser/Software/Microsoft/Windows/CurrentVersion/Explorer/Shell Folders/Cookies"};
  
   $cookie_jar = HTTP::Cookies::Microsoft->new(
                     file     => "$cookies_dir\\index.dat",
                     'delayload' => 1,
                 );
   my $browser = LWP::UserAgent->new;
   $browser->cookie_jar( $cookie_jar );
  
  =head1 DESCRIPTION
  
  This is a subclass of C<HTTP::Cookies> which
  loads Microsoft Internet Explorer 5.x and 6.x for Windows (MSIE)
  cookie files.
  
  See the documentation for L<HTTP::Cookies>.
  
  =head1 METHODS
  
  The following methods are provided:
  
  =over 4
  
  =item $cookie_jar = HTTP::Cookies::Microsoft->new;
  
  The constructor takes hash style parameters. In addition
  to the regular HTTP::Cookies parameters, HTTP::Cookies::Microsoft
  recognizes the following:
  
    delayload:       delay loading of cookie data until a request
                     is actually made. This results in faster
                     runtime unless you use most of the cookies
                     since only the domain's cookie data
                     is loaded on demand.
  
  =back
  
  =head1 CAVEATS
  
  Please note that the code DOESN'T support saving to the MSIE
  cookie file format.
  
  =head1 AUTHOR
  
  Johnny Lee <typo_pl@hotmail.com>
  
  =head1 COPYRIGHT
  
  Copyright 2002 Johnny Lee
  
  This library is free software; you can redistribute it and/or
  modify it under the same terms as Perl itself.
  
  =head1 AUTHOR
  
  Gisle Aas <gisle@activestate.com>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2002-2017 by Gisle Aas.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
  
  __END__
  
  #ABSTRACT: Access to Microsoft cookies files
  
HTTP_COOKIES_MICROSOFT

    $main::fatpacked{"HTTP/Cookies/Netscape.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'HTTP_COOKIES_NETSCAPE';
  package HTTP::Cookies::Netscape;
  
  use strict;
  use vars qw(@ISA);
  
  our $VERSION = '6.04';
  
  require HTTP::Cookies;
  @ISA=qw(HTTP::Cookies);
  
  sub load
  {
      my ($self, $file) = @_;
      $file ||= $self->{'file'} || return;
  
      local $/ = "\n";  # make sure we got standard record separator
      open (my $fh, '<', $file) || return;
      my $magic = <$fh>;
      chomp $magic;
      unless ($magic =~ /^#(?: Netscape)? HTTP Cookie File/) {
          warn "$file does not look like a netscape cookies file";
          return;
      }
  
      my $now = time() - $HTTP::Cookies::EPOCH_OFFSET;
      while (my $line = <$fh>) {
          chomp($line);
          next if $line =~ /^\s*\#/;
          next if $line =~ /^\s*$/;
          $line =~ tr/\n\r//d;
          my($domain,$bool1,$path,$secure, $expires,$key,$val) = split(/\t/, $line);
          $secure = ($secure eq "TRUE");
          $self->set_cookie(undef, $key, $val, $path, $domain, undef, 0, $secure, $expires-$now, 0);
      }
      1;
  }
  
  sub save
  {
      my($self, $file) = @_;
      $file ||= $self->{'file'} || return;
  
      open(my $fh, '>', $file) || return;
  
      # Use old, now broken link to the old cookie spec just in case something
      # else (not us!) requires the comment block exactly this way.
      print {$fh} <<EOT;
  # Netscape HTTP Cookie File
  # http://www.netscape.com/newsref/std/cookie_spec.html
  # This is a generated file!  Do not edit.
  
  EOT
  
      my $now = time - $HTTP::Cookies::EPOCH_OFFSET;
      $self->scan(sub {
          my ($version, $key, $val, $path, $domain, $port, $path_spec, $secure, $expires, $discard, $rest) = @_;
          return if $discard && !$self->{ignore_discard};
          $expires = $expires ? $expires - $HTTP::Cookies::EPOCH_OFFSET : 0;
          return if $now > $expires;
          $secure = $secure ? "TRUE" : "FALSE";
          my $bool = $domain =~ /^\./ ? "TRUE" : "FALSE";
          print {$fh} join("\t", $domain, $bool, $path, $secure, $expires, $key, $val), "\n";
      });
      1;
  }
  
  1;
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  HTTP::Cookies::Netscape - Access to Netscape cookies files
  
  =head1 VERSION
  
  version 6.04
  
  =head1 SYNOPSIS
  
   use LWP;
   use HTTP::Cookies::Netscape;
   $cookie_jar = HTTP::Cookies::Netscape->new(
     file => "c:/program files/netscape/users/ZombieCharity/cookies.txt",
   );
   my $browser = LWP::UserAgent->new;
   $browser->cookie_jar( $cookie_jar );
  
  =head1 DESCRIPTION
  
  This is a subclass of C<HTTP::Cookies> that reads (and optionally
  writes) Netscape/Mozilla cookie files.
  
  See the documentation for L<HTTP::Cookies>.
  
  =head1 CAVEATS
  
  Please note that the Netscape/Mozilla cookie file format can't store
  all the information available in the Set-Cookie2 headers, so you will
  probably lose some information if you save in this format.
  
  At time of writing, this module seems to work fine with Mozilla
  Phoenix/Firebird.
  
  =head1 SEE ALSO
  
  L<HTTP::Cookies::Microsoft>
  
  =head1 AUTHOR
  
  Gisle Aas <gisle@activestate.com>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2002-2017 by Gisle Aas.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
  
  __END__
  
  #ABSTRACT: Access to Netscape cookies files
  
HTTP_COOKIES_NETSCAPE

    $main::fatpacked{"HTTP/Daemon.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'HTTP_DAEMON';
  package HTTP::Daemon; # git description: v6.04-8-g7c078c8
  
  # ABSTRACT: A simple http server class
  
  use strict;
  use warnings;
  
  our $VERSION = '6.05';
  
  use Socket qw(
      AF_INET AF_INET6 INADDR_ANY IN6ADDR_ANY INADDR_LOOPBACK IN6ADDR_LOOPBACK
      inet_ntop sockaddr_family
  );
  use IO::Socket::IP;
  our @ISA = qw(IO::Socket::IP);
  
  our $PROTO = "HTTP/1.1";
  
  our $DEBUG;
  
  sub new {
      my ($class, %args) = @_;
      $args{Listen} ||= 5;
      $args{Proto}  ||= 'tcp';
      return $class->SUPER::new(%args);
  }
  
  sub accept {
      my $self = shift;
      my $pkg  = shift || "HTTP::Daemon::ClientConn";
      my ($sock, $peer) = $self->SUPER::accept($pkg);
      if ($sock) {
          ${*$sock}{'httpd_daemon'} = $self;
          return wantarray ? ($sock, $peer) : $sock;
      }
      else {
          return;
      }
  }
  
  sub url {
      my $self = shift;
      my $url  = $self->_default_scheme . "://";
      my $addr = $self->sockaddr;
      if (!$addr || $addr eq INADDR_ANY || $addr eq IN6ADDR_ANY) {
          require Sys::Hostname;
          $url .= lc Sys::Hostname::hostname();
      }
      elsif ($addr eq INADDR_LOOPBACK) {
          $url .= inet_ntop(AF_INET, $addr);
      }
      elsif ($addr eq IN6ADDR_LOOPBACK) {
          $url .= '[' . inet_ntop(AF_INET6, $addr) . ']';
      }
      else {
          my $host = $self->sockhostname;
          if (!defined $host) {
              my $family = sockaddr_family($self->sockname);
              if ($family && $family == AF_INET6) {
                  $host = '[' . inet_ntop(AF_INET6, $addr) . ']';
              }
              elsif ($family && $family == AF_INET) {
                  $host = inet_ntop(AF_INET, $addr);
              }
              else {
                  die "Unknown family";
              }
          }
          $url .= $host;
      }
      my $port = $self->sockport;
      $url .= ":$port" if $port != $self->_default_port;
      $url .= "/";
      $url;
  }
  
  sub _default_port {
      80;
  }
  
  sub _default_scheme {
      "http";
  }
  
  sub product_tokens {
      "libwww-perl-daemon/$HTTP::Daemon::VERSION";
  }
  
  package    # hide from PAUSE
      HTTP::Daemon::ClientConn;
  
  use strict;
  use warnings;
  
  use IO::Socket::IP ();
  our @ISA = qw(IO::Socket::IP);
  our $DEBUG;
  *DEBUG = \$HTTP::Daemon::DEBUG;
  
  use HTTP::Request  ();
  use HTTP::Response ();
  use HTTP::Status;
  use HTTP::Date qw(time2str);
  use LWP::MediaTypes qw(guess_media_type);
  use Carp ();
  
  # "\r\n" is not portable
  my $CRLF     = "\015\012";
  my $HTTP_1_0 = _http_version("HTTP/1.0");
  my $HTTP_1_1 = _http_version("HTTP/1.1");
  
  
  sub get_request {
      my ($self, $only_headers) = @_;
      if (${*$self}{'httpd_nomore'}) {
          $self->reason("No more requests from this connection");
          return;
      }
  
      $self->reason("");
      my $buf = ${*$self}{'httpd_rbuf'};
      $buf = "" unless defined $buf;
  
      my $timeout = ${*$self}{'io_socket_timeout'};
      my $fdset   = "";
      vec($fdset, $self->fileno, 1) = 1;
      local ($_);
  
  READ_HEADER:
      while (1) {
  
          # loop until we have the whole header in $buf
          $buf =~ s/^(?:\015?\012)+//;    # ignore leading blank lines
          if ($buf =~ /\012/) {           # potential, has at least one line
              if ($buf =~ /^\w+[^\012]+HTTP\/\d+\.\d+\015?\012/) {
                  if ($buf =~ /\015?\012\015?\012/) {
                      last READ_HEADER;    # we have it
                  }
                  elsif (length($buf) > 16 * 1024) {
                      $self->send_error(413);    # REQUEST_ENTITY_TOO_LARGE
                      $self->reason("Very long header");
                      return;
                  }
              }
              else {
                  last READ_HEADER;              # HTTP/0.9 client
              }
          }
          elsif (length($buf) > 16 * 1024) {
              $self->send_error(414);            # REQUEST_URI_TOO_LARGE
              $self->reason("Very long first line");
              return;
          }
          print STDERR "Need more data for complete header\n" if $DEBUG;
          return unless $self->_need_more($buf, $timeout, $fdset);
      }
      if ($buf !~ s/^(\S+)[ \t]+(\S+)(?:[ \t]+(HTTP\/\d+\.\d+))?[^\012]*\012//) {
          ${*$self}{'httpd_client_proto'} = _http_version("HTTP/1.0");
          $self->send_error(400);                # BAD_REQUEST
          $self->reason("Bad request line: $buf");
          return;
      }
      my $method = $1;
      my $uri    = $2;
      my $proto  = $3 || "HTTP/0.9";
      $uri = "http://$uri" if $method eq "CONNECT";
      $uri = $HTTP::URI_CLASS->new($uri, $self->daemon->url);
      my $r = HTTP::Request->new($method, $uri);
      $r->protocol($proto);
      ${*$self}{'httpd_client_proto'} = $proto = _http_version($proto);
      ${*$self}{'httpd_head'} = ($method eq "HEAD");
  
      if ($proto >= $HTTP_1_0) {
  
          # we expect to find some headers
          my ($key, $val);
      HEADER:
          while ($buf =~ s/^([^\012]*)\012//) {
              $_ = $1;
              s/\015$//;
              if (/^([^:\s]+)\s*:\s*(.*)/) {
                  $r->push_header($key, $val) if $key;
                  ($key, $val) = ($1, $2);
              }
              elsif (/^\s+(.*)/) {
                  $val .= " $1";
              }
              else {
                  last HEADER;
              }
          }
          $r->push_header($key, $val) if $key;
      }
  
      my $conn = $r->header('Connection');
      if ($proto >= $HTTP_1_1) {
          ${*$self}{'httpd_nomore'}++ if $conn && lc($conn) =~ /\bclose\b/;
      }
      else {
          ${*$self}{'httpd_nomore'}++
              unless $conn && lc($conn) =~ /\bkeep-alive\b/;
      }
  
      if ($only_headers) {
          ${*$self}{'httpd_rbuf'} = $buf;
          return $r;
      }
  
      # Find out how much content to read
      my $te  = $r->header('Transfer-Encoding');
      my $ct  = $r->header('Content-Type');
      my $len = $r->header('Content-Length');
  
      # Act on the Expect header, if it's there
      for my $e ($r->header('Expect')) {
          if (lc($e) eq '100-continue') {
              $self->send_status_line(100);
              $self->send_crlf;
          }
          else {
              $self->send_error(417);
              $self->reason("Unsupported Expect header value");
              return;
          }
      }
  
      if ($te && lc($te) eq 'chunked') {
  
          # Handle chunked transfer encoding
          my $body = "";
      CHUNK:
          while (1) {
              print STDERR "Chunked\n" if $DEBUG;
              if ($buf =~ s/^([^\012]*)\012//) {
                  my $chunk_head = $1;
                  unless ($chunk_head =~ /^([0-9A-Fa-f]+)/) {
                      $self->send_error(400);
                      $self->reason("Bad chunk header $chunk_head");
                      return;
                  }
                  my $size = hex($1);
                  last CHUNK if $size == 0;
  
                  my $missing = $size - length($buf) + 2;    # 2=CRLF at chunk end
                       # must read until we have a complete chunk
                  while ($missing > 0) {
                      print STDERR "Need $missing more bytes\n" if $DEBUG;
                      my $n = $self->_need_more($buf, $timeout, $fdset);
                      return unless $n;
                      $missing -= $n;
                  }
                  $body .= substr($buf, 0, $size);
                  substr($buf, 0, $size + 2) = '';
  
              }
              else {
                  # need more data in order to have a complete chunk header
                  return unless $self->_need_more($buf, $timeout, $fdset);
              }
          }
          $r->content($body);
  
          # pretend it was a normal entity body
          $r->remove_header('Transfer-Encoding');
          $r->header('Content-Length', length($body));
  
          my ($key, $val);
      FOOTER:
          while (1) {
              if ($buf !~ /\012/) {
  
                  # need at least one line to look at
                  return unless $self->_need_more($buf, $timeout, $fdset);
              }
              else {
                  $buf =~ s/^([^\012]*)\012//;
                  $_ = $1;
                  s/\015$//;
                  if (/^([\w\-]+)\s*:\s*(.*)/) {
                      $r->push_header($key, $val) if $key;
                      ($key, $val) = ($1, $2);
                  }
                  elsif (/^\s+(.*)/) {
                      $val .= " $1";
                  }
                  elsif (!length) {
                      last FOOTER;
                  }
                  else {
                      $self->reason("Bad footer syntax");
                      return;
                  }
              }
          }
          $r->push_header($key, $val) if $key;
  
      }
      elsif ($te) {
          $self->send_error(501);    # Unknown transfer encoding
          $self->reason("Unknown transfer encoding '$te'");
          return;
  
      }
      elsif ($len) {
  
          # Plain body specified by "Content-Length"
          my $missing = $len - length($buf);
          while ($missing > 0) {
              print "Need $missing more bytes of content\n" if $DEBUG;
              my $n = $self->_need_more($buf, $timeout, $fdset);
              return unless $n;
              $missing -= $n;
          }
          if (length($buf) > $len) {
              $r->content(substr($buf, 0, $len));
              substr($buf, 0, $len) = '';
          }
          else {
              $r->content($buf);
              $buf = '';
          }
      }
      elsif ($ct && $ct =~ m/^multipart\/\w+\s*;.*boundary\s*=\s*("?)(\w+)\1/i) {
  
          # Handle multipart content type
          my $boundary = "$CRLF--$2--";
          my $index;
          while (1) {
              $index = index($buf, $boundary);
              last if $index >= 0;
  
              # end marker not yet found
              return unless $self->_need_more($buf, $timeout, $fdset);
          }
          $index += length($boundary);
          $r->content(substr($buf, 0, $index));
          substr($buf, 0, $index) = '';
  
      }
      ${*$self}{'httpd_rbuf'} = $buf;
  
      $r;
  }
  
  sub _need_more {
      my $self = shift;
  
      #my($buf,$timeout,$fdset) = @_;
      if ($_[1]) {
          my ($timeout, $fdset) = @_[1, 2];
          print STDERR "select(,,,$timeout)\n" if $DEBUG;
          my $n = select($fdset, undef, undef, $timeout);
          unless ($n) {
              $self->reason(defined($n) ? "Timeout" : "select: $!");
              return;
          }
      }
      print STDERR "sysread()\n" if $DEBUG;
      my $n = sysread($self, $_[0], 2048, length($_[0]));
      $self->reason(defined($n) ? "Client closed" : "sysread: $!") unless $n;
      $n;
  }
  
  sub read_buffer {
      my $self = shift;
      my $old  = ${*$self}{'httpd_rbuf'};
      if (@_) {
          ${*$self}{'httpd_rbuf'} = shift;
      }
      $old;
  }
  
  sub reason {
      my $self = shift;
      my $old  = ${*$self}{'httpd_reason'};
      if (@_) {
          ${*$self}{'httpd_reason'} = shift;
      }
      $old;
  }
  
  sub proto_ge {
      my $self = shift;
      ${*$self}{'httpd_client_proto'} >= _http_version(shift);
  }
  
  sub _http_version {
      local ($_) = shift;
      return 0 unless m,^(?:HTTP/)?(\d+)\.(\d+)$,i;
      $1 * 1000 + $2;
  }
  
  sub antique_client {
      my $self = shift;
      ${*$self}{'httpd_client_proto'} < $HTTP_1_0;
  }
  
  sub force_last_request {
      my $self = shift;
      ${*$self}{'httpd_nomore'}++;
  }
  
  sub head_request {
      my $self = shift;
      ${*$self}{'httpd_head'};
  }
  
  
  sub send_status_line {
      my ($self, $status, $message, $proto) = @_;
      return if $self->antique_client;
      $status  ||= RC_OK;
      $message ||= status_message($status) || "";
      $proto   ||= $HTTP::Daemon::PROTO || "HTTP/1.1";
      print $self "$proto $status $message$CRLF";
  }
  
  sub send_crlf {
      my $self = shift;
      print $self $CRLF;
  }
  
  sub send_basic_header {
      my $self = shift;
      return if $self->antique_client;
      $self->send_status_line(@_);
      print $self "Date: ", time2str(time), $CRLF;
      my $product = $self->daemon->product_tokens;
      print $self "Server: $product$CRLF" if $product;
  }
  
  sub send_header {
      my $self = shift;
      while (@_) {
          my ($k, $v) = splice(@_, 0, 2);
          $v = "" unless defined($v);
          print $self "$k: $v$CRLF";
      }
  }
  
  sub send_response {
      my $self = shift;
      my $res  = shift;
      if (!ref $res) {
          $res ||= RC_OK;
          $res = HTTP::Response->new($res, @_);
      }
      my $content = $res->content;
      my $chunked;
      unless ($self->antique_client) {
          my $code = $res->code;
          $self->send_basic_header($code, $res->message, $res->protocol);
          if ($code =~ /^(1\d\d|[23]04)$/) {
  
              # make sure content is empty
              $res->remove_header("Content-Length");
              $content = "";
          }
          elsif ($res->request && $res->request->method eq "HEAD") {
  
              # probably OK
          }
          elsif (ref($content) eq "CODE") {
              if ($self->proto_ge("HTTP/1.1")) {
                  $res->push_header("Transfer-Encoding" => "chunked");
                  $chunked++;
              }
              else {
                  $self->force_last_request;
              }
          }
          elsif (length($content)) {
              $res->header("Content-Length" => length($content));
          }
          else {
              $self->force_last_request;
              $res->header('connection', 'close');
          }
          print $self $res->headers_as_string($CRLF);
          print $self $CRLF;    # separates headers and content
      }
      if ($self->head_request) {
  
          # no content
      }
      elsif (ref($content) eq "CODE") {
          while (1) {
              my $chunk = &$content();
              last unless defined($chunk) && length($chunk);
              if ($chunked) {
                  printf $self "%x%s%s%s", length($chunk), $CRLF, $chunk, $CRLF;
              }
              else {
                  print $self $chunk;
              }
          }
          print $self "0$CRLF$CRLF" if $chunked;    # no trailers either
      }
      elsif (length $content) {
          print $self $content;
      }
  }
  
  sub send_redirect {
      my ($self, $loc, $status, $content) = @_;
      $status ||= RC_MOVED_PERMANENTLY;
      Carp::croak("Status '$status' is not redirect") unless is_redirect($status);
      $self->send_basic_header($status);
      my $base = $self->daemon->url;
      $loc = $HTTP::URI_CLASS->new($loc, $base) unless ref($loc);
      $loc = $loc->abs($base);
      print $self "Location: $loc$CRLF";
  
      if ($content) {
          my $ct = $content =~ /^\s*</ ? "text/html" : "text/plain";
          print $self "Content-Type: $ct$CRLF";
      }
      print $self $CRLF;
      print $self $content if $content && !$self->head_request;
      $self->force_last_request;    # no use keeping the connection open
  }
  
  sub send_error {
      my ($self, $status, $error) = @_;
      $status ||= RC_BAD_REQUEST;
      Carp::croak("Status '$status' is not an error") unless is_error($status);
      my $mess = status_message($status);
      $error ||= "";
      $mess = <<EOT;
  <title>$status $mess</title>
  <h1>$status $mess</h1>
  $error
  EOT
      unless ($self->antique_client) {
          $self->send_basic_header($status);
          print $self "Content-Type: text/html$CRLF";
          print $self "Content-Length: " . length($mess) . $CRLF;
          print $self $CRLF;
      }
      print $self $mess unless $self->head_request;
      $status;
  }
  
  sub send_file_response {
      my ($self, $file) = @_;
      if (-d $file) {
          $self->send_dir($file);
      }
      elsif (-f _) {
  
          # plain file
          local (*F);
          sysopen(F, $file, 0) or return $self->send_error(RC_FORBIDDEN);
          binmode(F);
          my ($ct, $ce) = guess_media_type($file);
          my ($size, $mtime) = (stat _)[7, 9];
          unless ($self->antique_client) {
              $self->send_basic_header;
              print $self "Content-Type: $ct$CRLF";
              print $self "Content-Encoding: $ce$CRLF" if $ce;
              print $self "Content-Length: $size$CRLF" if $size;
              print $self "Last-Modified: ", time2str($mtime), "$CRLF" if $mtime;
              print $self $CRLF;
          }
          $self->send_file(\*F) unless $self->head_request;
          return RC_OK;
      }
      else {
          $self->send_error(RC_NOT_FOUND);
      }
  }
  
  sub send_dir {
      my ($self, $dir) = @_;
      $self->send_error(RC_NOT_FOUND) unless -d $dir;
      $self->send_error(RC_NOT_IMPLEMENTED);
  }
  
  sub send_file {
      my ($self, $file) = @_;
      my $opened = 0;
      local (*FILE);
      if (!ref($file)) {
          open(FILE, $file) || return undef;
          binmode(FILE);
          $file = \*FILE;
          $opened++;
      }
      my $cnt = 0;
      my $buf = "";
      my $n;
      while ($n = sysread($file, $buf, 8 * 1024)) {
          last if !$n;
          $cnt += $n;
          print $self $buf;
      }
      close($file) if $opened;
      $cnt;
  }
  
  sub daemon {
      my $self = shift;
      ${*$self}{'httpd_daemon'};
  }
  
  
  1;
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  HTTP::Daemon - A simple http server class
  
  =head1 VERSION
  
  version 6.05
  
  =head1 SYNOPSIS
  
    use HTTP::Daemon;
    use HTTP::Status;
  
    my $d = HTTP::Daemon->new || die;
    print "Please contact me at: <URL:", $d->url, ">\n";
    while (my $c = $d->accept) {
        while (my $r = $c->get_request) {
  	  if ($r->method eq 'GET' and $r->uri->path eq "/xyzzy") {
                # remember, this is *not* recommended practice :-)
  	      $c->send_file_response("/etc/passwd");
  	  }
  	  else {
  	      $c->send_error(RC_FORBIDDEN)
  	  }
        }
        $c->close;
        undef($c);
    }
  
  =head1 DESCRIPTION
  
  Instances of the C<HTTP::Daemon> class are HTTP/1.1 servers that
  listen on a socket for incoming requests. The C<HTTP::Daemon> is a
  subclass of C<IO::Socket::IP>, so you can perform socket operations
  directly on it too.
  
  The accept() method will return when a connection from a client is
  available.  The returned value will be an C<HTTP::Daemon::ClientConn>
  object which is another C<IO::Socket::IP> subclass.  Calling the
  get_request() method on this object will read data from the client and
  return an C<HTTP::Request> object.  The ClientConn object also provide
  methods to send back various responses.
  
  This HTTP daemon does not fork(2) for you.  Your application, i.e. the
  user of the C<HTTP::Daemon> is responsible for forking if that is
  desirable.  Also note that the user is responsible for generating
  responses that conform to the HTTP/1.1 protocol.
  
  The following methods of C<HTTP::Daemon> are new (or enhanced) relative
  to the C<IO::Socket::IP> base class:
  
  =over 4
  
  =item $d = HTTP::Daemon->new
  
  =item $d = HTTP::Daemon->new( %opts )
  
  The constructor method takes the same arguments as the
  C<IO::Socket::IP> constructor, but unlike its base class it can also
  be called without any arguments.  The daemon will then set up a listen
  queue of 5 connections and allocate some random port number.
  
  A server that wants to bind to some specific address on the standard
  HTTP port will be constructed like this:
  
    $d = HTTP::Daemon->new(
             LocalAddr => 'www.thisplace.com',
             LocalPort => 80,
         );
  
  See L<IO::Socket::IP> for a description of other arguments that can
  be used configure the daemon during construction.
  
  =item $c = $d->accept
  
  =item $c = $d->accept( $pkg )
  
  =item ($c, $peer_addr) = $d->accept
  
  This method works the same the one provided by the base class, but it
  returns an C<HTTP::Daemon::ClientConn> reference by default.  If a
  package name is provided as argument, then the returned object will be
  blessed into the given class.  It is probably a good idea to make that
  class a subclass of C<HTTP::Daemon::ClientConn>.
  
  The accept method will return C<undef> if timeouts have been enabled
  and no connection is made within the given time.  The timeout() method
  is described in L<IO::Socket::IP>.
  
  In list context both the client object and the peer address will be
  returned; see the description of the accept method L<IO::Socket> for
  details.
  
  =item $d->url
  
  Returns a URL string that can be used to access the server root.
  
  =item $d->product_tokens
  
  Returns the name that this server will use to identify itself.  This
  is the string that is sent with the C<Server> response header.  The
  main reason to have this method is that subclasses can override it if
  they want to use another product name.
  
  The default is the string "libwww-perl-daemon/#.##" where "#.##" is
  replaced with the version number of this module.
  
  =back
  
  The C<HTTP::Daemon::ClientConn> is a C<IO::Socket::IP>
  subclass. Instances of this class are returned by the accept() method
  of C<HTTP::Daemon>.  The following methods are provided:
  
  =over 4
  
  =item $c->get_request
  
  =item $c->get_request( $headers_only )
  
  This method reads data from the client and turns it into an
  C<HTTP::Request> object which is returned.  It returns C<undef>
  if reading fails.  If it fails, then the C<HTTP::Daemon::ClientConn>
  object ($c) should be discarded, and you should not try call this
  method again on it.  The $c->reason method might give you some
  information about why $c->get_request failed.
  
  The get_request() method will normally not return until the whole
  request has been received from the client.  This might not be what you
  want if the request is an upload of a large file (and with chunked
  transfer encoding HTTP can even support infinite request messages -
  uploading live audio for instance).  If you pass a TRUE value as the
  $headers_only argument, then get_request() will return immediately
  after parsing the request headers and you are responsible for reading
  the rest of the request content.  If you are going to call
  $c->get_request again on the same connection you better read the
  correct number of bytes.
  
  =item $c->read_buffer
  
  =item $c->read_buffer( $new_value )
  
  Bytes read by $c->get_request, but not used are placed in the I<read
  buffer>.  The next time $c->get_request is called it will consume the
  bytes in this buffer before reading more data from the network
  connection itself.  The read buffer is invalid after $c->get_request
  has failed.
  
  If you handle the reading of the request content yourself you need to
  empty this buffer before you read more and you need to place
  unconsumed bytes here.  You also need this buffer if you implement
  services like I<101 Switching Protocols>.
  
  This method always returns the old buffer content and can optionally
  replace the buffer content if you pass it an argument.
  
  =item $c->reason
  
  When $c->get_request returns C<undef> you can obtain a short string
  describing why it happened by calling $c->reason.
  
  =item $c->proto_ge( $proto )
  
  Return TRUE if the client announced a protocol with version number
  greater or equal to the given argument.  The $proto argument can be a
  string like "HTTP/1.1" or just "1.1".
  
  =item $c->antique_client
  
  Return TRUE if the client speaks the HTTP/0.9 protocol.  No status
  code and no headers should be returned to such a client.  This should
  be the same as !$c->proto_ge("HTTP/1.0").
  
  =item $c->head_request
  
  Return TRUE if the last request was a C<HEAD> request.  No content
  body must be generated for these requests.
  
  =item $c->force_last_request
  
  Make sure that $c->get_request will not try to read more requests off
  this connection.  If you generate a response that is not self
  delimiting, then you should signal this fact by calling this method.
  
  This attribute is turned on automatically if the client announces
  protocol HTTP/1.0 or worse and does not include a "Connection:
  Keep-Alive" header.  It is also turned on automatically when HTTP/1.1
  or better clients send the "Connection: close" request header.
  
  =item $c->send_status_line
  
  =item $c->send_status_line( $code )
  
  =item $c->send_status_line( $code, $mess )
  
  =item $c->send_status_line( $code, $mess, $proto )
  
  Send the status line back to the client.  If $code is omitted 200 is
  assumed.  If $mess is omitted, then a message corresponding to $code
  is inserted.  If $proto is missing the content of the
  $HTTP::Daemon::PROTO variable is used.
  
  =item $c->send_crlf
  
  Send the CRLF sequence to the client.
  
  =item $c->send_basic_header
  
  =item $c->send_basic_header( $code )
  
  =item $c->send_basic_header( $code, $mess )
  
  =item $c->send_basic_header( $code, $mess, $proto )
  
  Send the status line and the "Date:" and "Server:" headers back to
  the client.  This header is assumed to be continued and does not end
  with an empty CRLF line.
  
  See the description of send_status_line() for the description of the
  accepted arguments.
  
  =item $c->send_header( $field, $value )
  
  =item $c->send_header( $field1, $value1, $field2, $value2, ... )
  
  Send one or more header lines.
  
  =item $c->send_response( $res )
  
  Write a C<HTTP::Response> object to the
  client as a response.  We try hard to make sure that the response is
  self delimiting so that the connection can stay persistent for further
  request/response exchanges.
  
  The content attribute of the C<HTTP::Response> object can be a normal
  string or a subroutine reference.  If it is a subroutine, then
  whatever this callback routine returns is written back to the
  client as the response content.  The routine will be called until it
  return an undefined or empty value.  If the client is HTTP/1.1 aware
  then we will use chunked transfer encoding for the response.
  
  =item $c->send_redirect( $loc )
  
  =item $c->send_redirect( $loc, $code )
  
  =item $c->send_redirect( $loc, $code, $entity_body )
  
  Send a redirect response back to the client.  The location ($loc) can
  be an absolute or relative URL. The $code must be one the redirect
  status codes, and defaults to "301 Moved Permanently"
  
  =item $c->send_error
  
  =item $c->send_error( $code )
  
  =item $c->send_error( $code, $error_message )
  
  Send an error response back to the client.  If the $code is missing a
  "Bad Request" error is reported.  The $error_message is a string that
  is incorporated in the body of the HTML entity body.
  
  =item $c->send_file_response( $filename )
  
  Send back a response with the specified $filename as content.  If the
  file is a directory we try to generate an HTML index of it.
  
  =item $c->send_file( $filename )
  
  =item $c->send_file( $fd )
  
  Copy the file to the client.  The file can be a string (which
  will be interpreted as a filename) or a reference to an C<IO::Handle>
  or glob.
  
  =item $c->daemon
  
  Return a reference to the corresponding C<HTTP::Daemon> object.
  
  =back
  
  =head1 SEE ALSO
  
  RFC 2616
  
  L<IO::Socket::IP>, L<IO::Socket>
  
  =head1 SUPPORT
  
  bugs may be submitted through L<https://github.com/libwww-perl/HTTP-Daemon/issues>.
  
  There is also a mailing list available for users of this distribution, at
  L<mailto:libwww@perl.org>.
  
  There is also an irc channel available for users of this distribution, at
  L<C<#lwp> on C<irc.perl.org>|irc://irc.perl.org/#lwp>.
  
  =head1 AUTHOR
  
  Gisle Aas <gisle@activestate.com>
  
  =head1 CONTRIBUTORS
  
  =for stopwords Ville Skyttä Olaf Alders Mark Stosberg Karen Etheridge Chase Whitener Slaven Rezic Zefram Tom Hukins Mike Schilli Alexey Tourbin Bron Gondwana Hans-H. Froehlich Ian Kilgore Jacob J Ondrej Hanak Perlover Peter Rabbitson Robert Stone Rolf Grossmann Sean M. Burke Spiros Denaxas Steve Hay Todd Lipcon Tony Finch Toru Yamaguchi Yuri Karaban amire80 jefflee john9art murphy phrstbrn ruff Adam Kennedy sasao Sjogren Alex Kapranoff Andreas J. Koenig Bill Mann DAVIDRW Daniel Hedlund David E. Wheeler FWILES Father Chrysostomos Gavin Peters Graeme Thompson
  
  =over 4
  
  =item *
  
  Ville Skyttä <ville.skytta@iki.fi>
  
  =item *
  
  Olaf Alders <olaf@wundersolutions.com>
  
  =item *
  
  Mark Stosberg <MARKSTOS@cpan.org>
  
  =item *
  
  Karen Etheridge <ether@cpan.org>
  
  =item *
  
  Chase Whitener <capoeirab@cpan.org>
  
  =item *
  
  Slaven Rezic <slaven@rezic.de>
  
  =item *
  
  Zefram <zefram@fysh.org>
  
  =item *
  
  Tom Hukins <tom@eborcom.com>
  
  =item *
  
  Mike Schilli <mschilli@yahoo-inc.com>
  
  =item *
  
  Alexey Tourbin <at@altlinux.ru>
  
  =item *
  
  Bron Gondwana <brong@fastmail.fm>
  
  =item *
  
  Hans-H. Froehlich <hfroehlich@co-de-co.de>
  
  =item *
  
  Ian Kilgore <iank@cpan.org>
  
  =item *
  
  Jacob J <waif@chaos2.org>
  
  =item *
  
  Ondrej Hanak <ondrej.hanak@ubs.com>
  
  =item *
  
  Perlover <perlover@perlover.com>
  
  =item *
  
  Peter Rabbitson <ribasushi@cpan.org>
  
  =item *
  
  Robert Stone <talby@trap.mtview.ca.us>
  
  =item *
  
  Rolf Grossmann <rg@progtech.net>
  
  =item *
  
  Sean M. Burke <sburke@cpan.org>
  
  =item *
  
  Spiros Denaxas <s.denaxas@gmail.com>
  
  =item *
  
  Steve Hay <SteveHay@planit.com>
  
  =item *
  
  Todd Lipcon <todd@amiestreet.com>
  
  =item *
  
  Tony Finch <dot@dotat.at>
  
  =item *
  
  Toru Yamaguchi <zigorou@cpan.org>
  
  =item *
  
  Yuri Karaban <tech@askold.net>
  
  =item *
  
  amire80 <amir.aharoni@gmail.com>
  
  =item *
  
  jefflee <shaohua@gmail.com>
  
  =item *
  
  john9art <john9art@yahoo.com>
  
  =item *
  
  murphy <murphy@genome.chop.edu>
  
  =item *
  
  phrstbrn <phrstbrn@gmail.com>
  
  =item *
  
  ruff <ruff@ukrpost.net>
  
  =item *
  
  Adam Kennedy <adamk@cpan.org>
  
  =item *
  
  sasao <sasao@yugen.org>
  
  =item *
  
  Adam Sjogren <asjo@koldfront.dk>
  
  =item *
  
  Alex Kapranoff <ka@nadoby.ru>
  
  =item *
  
  Andreas J. Koenig <andreas.koenig@anima.de>
  
  =item *
  
  Bill Mann <wfmann@alum.mit.edu>
  
  =item *
  
  DAVIDRW <davidrw@cpan.org>
  
  =item *
  
  Daniel Hedlund <Daniel.Hedlund@eprize.com>
  
  =item *
  
  David E. Wheeler <david@justatheory.com>
  
  =item *
  
  FWILES <FWILES@cpan.org>
  
  =item *
  
  Father Chrysostomos <sprout@cpan.org>
  
  =item *
  
  Gavin Peters <gpeters@deepsky.com>
  
  =item *
  
  Graeme Thompson <Graeme.Thompson@mobilecohesion.com>
  
  =back
  
  =head1 COPYRIGHT AND LICENCE
  
  This software is copyright (c) 1995 by Gisle Aas.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
HTTP_DAEMON

    $main::fatpacked{"HTTP/Date.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'HTTP_DATE';
  package HTTP::Date;
  
  $VERSION = "6.02";
  
  require Exporter;
  @ISA = qw(Exporter);
  @EXPORT = qw(time2str str2time);
  @EXPORT_OK = qw(parse_date time2iso time2isoz);
  
  use strict;
  require Time::Local;
  
  use vars qw(@DoW @MoY %MoY);
  @DoW = qw(Sun Mon Tue Wed Thu Fri Sat);
  @MoY = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec);
  @MoY{@MoY} = (1..12);
  
  my %GMT_ZONE = (GMT => 1, UTC => 1, UT => 1, Z => 1);
  
  
  sub time2str (;$)
  {
      my $time = shift;
      $time = time unless defined $time;
      my ($sec, $min, $hour, $mday, $mon, $year, $wday) = gmtime($time);
      sprintf("%s, %02d %s %04d %02d:%02d:%02d GMT",
  	    $DoW[$wday],
  	    $mday, $MoY[$mon], $year+1900,
  	    $hour, $min, $sec);
  }
  
  
  sub str2time ($;$)
  {
      my $str = shift;
      return undef unless defined $str;
  
      # fast exit for strictly conforming string
      if ($str =~ /^[SMTWF][a-z][a-z], (\d\d) ([JFMAJSOND][a-z][a-z]) (\d\d\d\d) (\d\d):(\d\d):(\d\d) GMT$/) {
  	return eval {
  	    my $t = Time::Local::timegm($6, $5, $4, $1, $MoY{$2}-1, $3);
  	    $t < 0 ? undef : $t;
  	};
      }
  
      my @d = parse_date($str);
      return undef unless @d;
      $d[1]--;        # month
  
      my $tz = pop(@d);
      unless (defined $tz) {
  	unless (defined($tz = shift)) {
  	    return eval { my $frac = $d[-1]; $frac -= ($d[-1] = int($frac));
  			  my $t = Time::Local::timelocal(reverse @d) + $frac;
  			  $t < 0 ? undef : $t;
  		        };
  	}
      }
  
      my $offset = 0;
      if ($GMT_ZONE{uc $tz}) {
  	# offset already zero
      }
      elsif ($tz =~ /^([-+])?(\d\d?):?(\d\d)?$/) {
  	$offset = 3600 * $2;
  	$offset += 60 * $3 if $3;
  	$offset *= -1 if $1 && $1 eq '-';
      }
      else {
  	eval { require Time::Zone } || return undef;
  	$offset = Time::Zone::tz_offset($tz);
  	return undef unless defined $offset;
      }
  
      return eval { my $frac = $d[-1]; $frac -= ($d[-1] = int($frac));
  		  my $t = Time::Local::timegm(reverse @d) + $frac;
  		  $t < 0 ? undef : $t - $offset;
  		};
  }
  
  
  sub parse_date ($)
  {
      local($_) = shift;
      return unless defined;
  
      # More lax parsing below
      s/^\s+//;  # kill leading space
      s/^(?:Sun|Mon|Tue|Wed|Thu|Fri|Sat)[a-z]*,?\s*//i; # Useless weekday
  
      my($day, $mon, $yr, $hr, $min, $sec, $tz, $ampm);
  
      # Then we are able to check for most of the formats with this regexp
      (($day,$mon,$yr,$hr,$min,$sec,$tz) =
          /^
  	 (\d\d?)               # day
  	    (?:\s+|[-\/])
  	 (\w+)                 # month
  	    (?:\s+|[-\/])
  	 (\d+)                 # year
  	 (?:
  	       (?:\s+|:)       # separator before clock
  	    (\d\d?):(\d\d)     # hour:min
  	    (?::(\d\d))?       # optional seconds
  	 )?                    # optional clock
  	    \s*
  	 ([-+]?\d{2,4}|(?![APap][Mm]\b)[A-Za-z]+)? # timezone
  	    \s*
  	 (?:\(\w+\)|\w{3,})?   # ASCII representation of timezone.
  	    \s*$
  	/x)
  
      ||
  
      # Try the ctime and asctime format
      (($mon, $day, $hr, $min, $sec, $tz, $yr) =
  	/^
  	 (\w{1,3})             # month
  	    \s+
  	 (\d\d?)               # day
  	    \s+
  	 (\d\d?):(\d\d)        # hour:min
  	 (?::(\d\d))?          # optional seconds
  	    \s+
  	 (?:([A-Za-z]+)\s+)?   # optional timezone
  	 (\d+)                 # year
  	    \s*$               # allow trailing whitespace
  	/x)
  
      ||
  
      # Then the Unix 'ls -l' date format
      (($mon, $day, $yr, $hr, $min, $sec) =
  	/^
  	 (\w{3})               # month
  	    \s+
  	 (\d\d?)               # day
  	    \s+
  	 (?:
  	    (\d\d\d\d) |       # year
  	    (\d{1,2}):(\d{2})  # hour:min
              (?::(\d\d))?       # optional seconds
  	 )
  	 \s*$
         /x)
  
      ||
  
      # ISO 8601 format '1996-02-29 12:00:00 -0100' and variants
      (($yr, $mon, $day, $hr, $min, $sec, $tz) =
  	/^
  	  (\d{4})              # year
  	     [-\/]?
  	  (\d\d?)              # numerical month
  	     [-\/]?
  	  (\d\d?)              # day
  	 (?:
  	       (?:\s+|[-:Tt])  # separator before clock
  	    (\d\d?):?(\d\d)    # hour:min
  	    (?::?(\d\d(?:\.\d*)?))?  # optional seconds (and fractional)
  	 )?                    # optional clock
  	    \s*
  	 ([-+]?\d\d?:?(:?\d\d)?
  	  |Z|z)?               # timezone  (Z is "zero meridian", i.e. GMT)
  	    \s*$
  	/x)
  
      ||
  
      # Windows 'dir' 11-12-96  03:52PM
      (($mon, $day, $yr, $hr, $min, $ampm) =
          /^
            (\d{2})                # numerical month
               -
            (\d{2})                # day
               -
            (\d{2})                # year
               \s+
            (\d\d?):(\d\d)([APap][Mm])  # hour:min AM or PM
               \s*$
          /x)
  
      ||
      return;  # unrecognized format
  
      # Translate month name to number
      $mon = $MoY{$mon} ||
             $MoY{"\u\L$mon"} ||
  	   ($mon =~ /^\d\d?$/ && $mon >= 1 && $mon <= 12 && int($mon)) ||
             return;
  
      # If the year is missing, we assume first date before the current,
      # because of the formats we support such dates are mostly present
      # on "ls -l" listings.
      unless (defined $yr) {
  	my $cur_mon;
  	($cur_mon, $yr) = (localtime)[4, 5];
  	$yr += 1900;
  	$cur_mon++;
  	$yr-- if $mon > $cur_mon;
      }
      elsif (length($yr) < 3) {
  	# Find "obvious" year
  	my $cur_yr = (localtime)[5] + 1900;
  	my $m = $cur_yr % 100;
  	my $tmp = $yr;
  	$yr += $cur_yr - $m;
  	$m -= $tmp;
  	$yr += ($m > 0) ? 100 : -100
  	    if abs($m) > 50;
      }
  
      # Make sure clock elements are defined
      $hr  = 0 unless defined($hr);
      $min = 0 unless defined($min);
      $sec = 0 unless defined($sec);
  
      # Compensate for AM/PM
      if ($ampm) {
  	$ampm = uc $ampm;
  	$hr = 0 if $hr == 12 && $ampm eq 'AM';
  	$hr += 12 if $ampm eq 'PM' && $hr != 12;
      }
  
      return($yr, $mon, $day, $hr, $min, $sec, $tz)
  	if wantarray;
  
      if (defined $tz) {
  	$tz = "Z" if $tz =~ /^(GMT|UTC?|[-+]?0+)$/;
      }
      else {
  	$tz = "";
      }
      return sprintf("%04d-%02d-%02d %02d:%02d:%02d%s",
  		   $yr, $mon, $day, $hr, $min, $sec, $tz);
  }
  
  
  sub time2iso (;$)
  {
      my $time = shift;
      $time = time unless defined $time;
      my($sec,$min,$hour,$mday,$mon,$year) = localtime($time);
      sprintf("%04d-%02d-%02d %02d:%02d:%02d",
  	    $year+1900, $mon+1, $mday, $hour, $min, $sec);
  }
  
  
  sub time2isoz (;$)
  {
      my $time = shift;
      $time = time unless defined $time;
      my($sec,$min,$hour,$mday,$mon,$year) = gmtime($time);
      sprintf("%04d-%02d-%02d %02d:%02d:%02dZ",
              $year+1900, $mon+1, $mday, $hour, $min, $sec);
  }
  
  1;
  
  
  __END__
  
  =head1 NAME
  
  HTTP::Date - date conversion routines
  
  =head1 SYNOPSIS
  
   use HTTP::Date;
  
   $string = time2str($time);    # Format as GMT ASCII time
   $time = str2time($string);    # convert ASCII date to machine time
  
  =head1 DESCRIPTION
  
  This module provides functions that deal the date formats used by the
  HTTP protocol (and then some more).  Only the first two functions,
  time2str() and str2time(), are exported by default.
  
  =over 4
  
  =item time2str( [$time] )
  
  The time2str() function converts a machine time (seconds since epoch)
  to a string.  If the function is called without an argument or with an
  undefined argument, it will use the current time.
  
  The string returned is in the format preferred for the HTTP protocol.
  This is a fixed length subset of the format defined by RFC 1123,
  represented in Universal Time (GMT).  An example of a time stamp
  in this format is:
  
     Sun, 06 Nov 1994 08:49:37 GMT
  
  =item str2time( $str [, $zone] )
  
  The str2time() function converts a string to machine time.  It returns
  C<undef> if the format of $str is unrecognized, otherwise whatever the
  C<Time::Local> functions can make out of the parsed time.  Dates
  before the system's epoch may not work on all operating systems.  The
  time formats recognized are the same as for parse_date().
  
  The function also takes an optional second argument that specifies the
  default time zone to use when converting the date.  This parameter is
  ignored if the zone is found in the date string itself.  If this
  parameter is missing, and the date string format does not contain any
  zone specification, then the local time zone is assumed.
  
  If the zone is not "C<GMT>" or numerical (like "C<-0800>" or
  "C<+0100>"), then the C<Time::Zone> module must be installed in order
  to get the date recognized.
  
  =item parse_date( $str )
  
  This function will try to parse a date string, and then return it as a
  list of numerical values followed by a (possible undefined) time zone
  specifier; ($year, $month, $day, $hour, $min, $sec, $tz).  The $year
  will be the full 4-digit year, and $month numbers start with 1 (for January).
  
  In scalar context the numbers are interpolated in a string of the
  "YYYY-MM-DD hh:mm:ss TZ"-format and returned.
  
  If the date is unrecognized, then the empty list is returned (C<undef> in
  scalar context).
  
  The function is able to parse the following formats:
  
   "Wed, 09 Feb 1994 22:23:32 GMT"       -- HTTP format
   "Thu Feb  3 17:03:55 GMT 1994"        -- ctime(3) format
   "Thu Feb  3 00:00:00 1994",           -- ANSI C asctime() format
   "Tuesday, 08-Feb-94 14:15:29 GMT"     -- old rfc850 HTTP format
   "Tuesday, 08-Feb-1994 14:15:29 GMT"   -- broken rfc850 HTTP format
  
   "03/Feb/1994:17:03:55 -0700"   -- common logfile format
   "09 Feb 1994 22:23:32 GMT"     -- HTTP format (no weekday)
   "08-Feb-94 14:15:29 GMT"       -- rfc850 format (no weekday)
   "08-Feb-1994 14:15:29 GMT"     -- broken rfc850 format (no weekday)
  
   "1994-02-03 14:15:29 -0100"    -- ISO 8601 format
   "1994-02-03 14:15:29"          -- zone is optional
   "1994-02-03"                   -- only date
   "1994-02-03T14:15:29"          -- Use T as separator
   "19940203T141529Z"             -- ISO 8601 compact format
   "19940203"                     -- only date
  
   "08-Feb-94"         -- old rfc850 HTTP format    (no weekday, no time)
   "08-Feb-1994"       -- broken rfc850 HTTP format (no weekday, no time)
   "09 Feb 1994"       -- proposed new HTTP format  (no weekday, no time)
   "03/Feb/1994"       -- common logfile format     (no time, no offset)
  
   "Feb  3  1994"      -- Unix 'ls -l' format
   "Feb  3 17:03"      -- Unix 'ls -l' format
  
   "11-15-96  03:52PM" -- Windows 'dir' format
  
  The parser ignores leading and trailing whitespace.  It also allow the
  seconds to be missing and the month to be numerical in most formats.
  
  If the year is missing, then we assume that the date is the first
  matching date I<before> current month.  If the year is given with only
  2 digits, then parse_date() will select the century that makes the
  year closest to the current date.
  
  =item time2iso( [$time] )
  
  Same as time2str(), but returns a "YYYY-MM-DD hh:mm:ss"-formatted
  string representing time in the local time zone.
  
  =item time2isoz( [$time] )
  
  Same as time2str(), but returns a "YYYY-MM-DD hh:mm:ssZ"-formatted
  string representing Universal Time.
  
  
  =back
  
  =head1 SEE ALSO
  
  L<perlfunc/time>, L<Time::Zone>
  
  =head1 COPYRIGHT
  
  Copyright 1995-1999, Gisle Aas
  
  This library is free software; you can redistribute it and/or
  modify it under the same terms as Perl itself.
  
  =cut
HTTP_DATE

    $main::fatpacked{"HTTP/Headers.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'HTTP_HEADERS';
  package HTTP::Headers;
  
  use strict;
  use warnings;
  
  our $VERSION = '6.18';
  
  use Carp ();
  
  # The $TRANSLATE_UNDERSCORE variable controls whether '_' can be used
  # as a replacement for '-' in header field names.
  our $TRANSLATE_UNDERSCORE = 1 unless defined $TRANSLATE_UNDERSCORE;
  
  # "Good Practice" order of HTTP message headers:
  #    - General-Headers
  #    - Request-Headers
  #    - Response-Headers
  #    - Entity-Headers
  
  my @general_headers = qw(
      Cache-Control Connection Date Pragma Trailer Transfer-Encoding Upgrade
      Via Warning
  );
  
  my @request_headers = qw(
      Accept Accept-Charset Accept-Encoding Accept-Language
      Authorization Expect From Host
      If-Match If-Modified-Since If-None-Match If-Range If-Unmodified-Since
      Max-Forwards Proxy-Authorization Range Referer TE User-Agent
  );
  
  my @response_headers = qw(
      Accept-Ranges Age ETag Location Proxy-Authenticate Retry-After Server
      Vary WWW-Authenticate
  );
  
  my @entity_headers = qw(
      Allow Content-Encoding Content-Language Content-Length Content-Location
      Content-MD5 Content-Range Content-Type Expires Last-Modified
  );
  
  my %entity_header = map { lc($_) => 1 } @entity_headers;
  
  my @header_order = (
      @general_headers,
      @request_headers,
      @response_headers,
      @entity_headers,
  );
  
  # Make alternative representations of @header_order.  This is used
  # for sorting and case matching.
  my %header_order;
  my %standard_case;
  
  {
      my $i = 0;
      for (@header_order) {
  	my $lc = lc $_;
  	$header_order{$lc} = ++$i;
  	$standard_case{$lc} = $_;
      }
  }
  
  
  
  sub new
  {
      my($class) = shift;
      my $self = bless {}, $class;
      $self->header(@_) if @_; # set up initial headers
      $self;
  }
  
  
  sub header
  {
      my $self = shift;
      Carp::croak('Usage: $h->header($field, ...)') unless @_;
      my(@old);
      my %seen;
      while (@_) {
  	my $field = shift;
          my $op = @_ ? ($seen{lc($field)}++ ? 'PUSH' : 'SET') : 'GET';
  	@old = $self->_header($field, shift, $op);
      }
      return @old if wantarray;
      return $old[0] if @old <= 1;
      join(", ", @old);
  }
  
  sub clear
  {
      my $self = shift;
      %$self = ();
  }
  
  
  sub push_header
  {
      my $self = shift;
      return $self->_header(@_, 'PUSH_H') if @_ == 2;
      while (@_) {
  	$self->_header(splice(@_, 0, 2), 'PUSH_H');
      }
  }
  
  
  sub init_header
  {
      Carp::croak('Usage: $h->init_header($field, $val)') if @_ != 3;
      shift->_header(@_, 'INIT');
  }
  
  
  sub remove_header
  {
      my($self, @fields) = @_;
      my $field;
      my @values;
      foreach $field (@fields) {
  	$field =~ tr/_/-/ if $field !~ /^:/ && $TRANSLATE_UNDERSCORE;
  	my $v = delete $self->{lc $field};
  	push(@values, ref($v) eq 'ARRAY' ? @$v : $v) if defined $v;
      }
      return @values;
  }
  
  sub remove_content_headers
  {
      my $self = shift;
      unless (defined(wantarray)) {
  	# fast branch that does not create return object
  	delete @$self{grep $entity_header{$_} || /^content-/, keys %$self};
  	return;
      }
  
      my $c = ref($self)->new;
      for my $f (grep $entity_header{$_} || /^content-/, keys %$self) {
  	$c->{$f} = delete $self->{$f};
      }
      if (exists $self->{'::std_case'}) {
  	$c->{'::std_case'} = $self->{'::std_case'};
      }
      $c;
  }
  
  
  sub _header
  {
      my($self, $field, $val, $op) = @_;
  
      Carp::croak("Illegal field name '$field'")
          if rindex($field, ':') > 1 || !length($field);
  
      unless ($field =~ /^:/) {
  	$field =~ tr/_/-/ if $TRANSLATE_UNDERSCORE;
  	my $old = $field;
  	$field = lc $field;
  	unless($standard_case{$field} || $self->{'::std_case'}{$field}) {
  	    # generate a %std_case entry for this field
  	    $old =~ s/\b(\w)/\u$1/g;
  	    $self->{'::std_case'}{$field} = $old;
  	}
      }
  
      $op ||= defined($val) ? 'SET' : 'GET';
      if ($op eq 'PUSH_H') {
  	# Like PUSH but where we don't care about the return value
  	if (exists $self->{$field}) {
  	    my $h = $self->{$field};
  	    if (ref($h) eq 'ARRAY') {
  		push(@$h, ref($val) eq "ARRAY" ? @$val : $val);
  	    }
  	    else {
  		$self->{$field} = [$h, ref($val) eq "ARRAY" ? @$val : $val]
  	    }
  	    return;
  	}
  	$self->{$field} = $val;
  	return;
      }
  
      my $h = $self->{$field};
      my @old = ref($h) eq 'ARRAY' ? @$h : (defined($h) ? ($h) : ());
  
      unless ($op eq 'GET' || ($op eq 'INIT' && @old)) {
  	if (defined($val)) {
  	    my @new = ($op eq 'PUSH') ? @old : ();
  	    if (ref($val) ne 'ARRAY') {
  		push(@new, $val);
  	    }
  	    else {
  		push(@new, @$val);
  	    }
  	    $self->{$field} = @new > 1 ? \@new : $new[0];
  	}
  	elsif ($op ne 'PUSH') {
  	    delete $self->{$field};
  	}
      }
      @old;
  }
  
  
  sub _sorted_field_names
  {
      my $self = shift;
      return [ sort {
          ($header_order{$a} || 999) <=> ($header_order{$b} || 999) ||
           $a cmp $b
      } grep !/^::/, keys %$self ];
  }
  
  
  sub header_field_names {
      my $self = shift;
      return map $standard_case{$_} || $self->{'::std_case'}{$_} || $_, @{ $self->_sorted_field_names },
  	if wantarray;
      return grep !/^::/, keys %$self;
  }
  
  
  sub scan
  {
      my($self, $sub) = @_;
      my $key;
      for $key (@{ $self->_sorted_field_names }) {
  	my $vals = $self->{$key};
  	if (ref($vals) eq 'ARRAY') {
  	    my $val;
  	    for $val (@$vals) {
  		$sub->($standard_case{$key} || $self->{'::std_case'}{$key} || $key, $val);
  	    }
  	}
  	else {
  	    $sub->($standard_case{$key} || $self->{'::std_case'}{$key} || $key, $vals);
  	}
      }
  }
  
  sub flatten {
  	my($self)=@_;
  
  	(
  		map {
  			my $k = $_;
  			map {
  				( $k => $_ )
  			} $self->header($_);
  		} $self->header_field_names
  	);
  }
  
  sub as_string
  {
      my($self, $endl) = @_;
      $endl = "\n" unless defined $endl;
  
      my @result = ();
      for my $key (@{ $self->_sorted_field_names }) {
  	next if index($key, '_') == 0;
  	my $vals = $self->{$key};
  	if ( ref($vals) eq 'ARRAY' ) {
  	    for my $val (@$vals) {
  		$val = '' if not defined $val;
  		my $field = $standard_case{$key} || $self->{'::std_case'}{$key} || $key;
  		$field =~ s/^://;
  		if ( index($val, "\n") >= 0 ) {
  		    $val = _process_newline($val, $endl);
  		}
  		push @result, $field . ': ' . $val;
  	    }
  	}
  	else {
  	    $vals = '' if not defined $vals;
  	    my $field = $standard_case{$key} || $self->{'::std_case'}{$key} || $key;
  	    $field =~ s/^://;
  	    if ( index($vals, "\n") >= 0 ) {
  		$vals = _process_newline($vals, $endl);
  	    }
  	    push @result, $field . ': ' . $vals;
  	}
      }
  
      join($endl, @result, '');
  }
  
  sub _process_newline {
      local $_ = shift;
      my $endl = shift;
      # must handle header values with embedded newlines with care
      s/\s+$//;        # trailing newlines and space must go
      s/\n(\x0d?\n)+/\n/g;     # no empty lines
      s/\n([^\040\t])/\n $1/g; # initial space for continuation
      s/\n/$endl/g;    # substitute with requested line ending
      $_;
  }
  
  
  
  if (eval { require Storable; 1 }) {
      *clone = \&Storable::dclone;
  } else {
      *clone = sub {
  	my $self = shift;
  	my $clone = HTTP::Headers->new;
  	$self->scan(sub { $clone->push_header(@_);} );
  	$clone;
      };
  }
  
  
  sub _date_header
  {
      require HTTP::Date;
      my($self, $header, $time) = @_;
      my($old) = $self->_header($header);
      if (defined $time) {
  	$self->_header($header, HTTP::Date::time2str($time));
      }
      $old =~ s/;.*// if defined($old);
      HTTP::Date::str2time($old);
  }
  
  
  sub date                { shift->_date_header('Date',                @_); }
  sub expires             { shift->_date_header('Expires',             @_); }
  sub if_modified_since   { shift->_date_header('If-Modified-Since',   @_); }
  sub if_unmodified_since { shift->_date_header('If-Unmodified-Since', @_); }
  sub last_modified       { shift->_date_header('Last-Modified',       @_); }
  
  # This is used as a private LWP extension.  The Client-Date header is
  # added as a timestamp to a response when it has been received.
  sub client_date         { shift->_date_header('Client-Date',         @_); }
  
  # The retry_after field is dual format (can also be a expressed as
  # number of seconds from now), so we don't provide an easy way to
  # access it until we have know how both these interfaces can be
  # addressed.  One possibility is to return a negative value for
  # relative seconds and a positive value for epoch based time values.
  #sub retry_after       { shift->_date_header('Retry-After',       @_); }
  
  sub content_type      {
      my $self = shift;
      my $ct = $self->{'content-type'};
      $self->{'content-type'} = shift if @_;
      $ct = $ct->[0] if ref($ct) eq 'ARRAY';
      return '' unless defined($ct) && length($ct);
      my @ct = split(/;\s*/, $ct, 2);
      for ($ct[0]) {
  	s/\s+//g;
  	$_ = lc($_);
      }
      wantarray ? @ct : $ct[0];
  }
  
  sub content_type_charset {
      my $self = shift;
      require HTTP::Headers::Util;
      my $h = $self->{'content-type'};
      $h = $h->[0] if ref($h);
      $h = "" unless defined $h;
      my @v = HTTP::Headers::Util::split_header_words($h);
      if (@v) {
  	my($ct, undef, %ct_param) = @{$v[0]};
  	my $charset = $ct_param{charset};
  	if ($ct) {
  	    $ct = lc($ct);
  	    $ct =~ s/\s+//;
  	}
  	if ($charset) {
  	    $charset = uc($charset);
  	    $charset =~ s/^\s+//;  $charset =~ s/\s+\z//;
  	    undef($charset) if $charset eq "";
  	}
  	return $ct, $charset if wantarray;
  	return $charset;
      }
      return undef, undef if wantarray;
      return undef;
  }
  
  sub content_is_text {
      my $self = shift;
      return $self->content_type =~ m,^text/,;
  }
  
  sub content_is_html {
      my $self = shift;
      return $self->content_type eq 'text/html' || $self->content_is_xhtml;
  }
  
  sub content_is_xhtml {
      my $ct = shift->content_type;
      return $ct eq "application/xhtml+xml" ||
             $ct eq "application/vnd.wap.xhtml+xml";
  }
  
  sub content_is_xml {
      my $ct = shift->content_type;
      return 1 if $ct eq "text/xml";
      return 1 if $ct eq "application/xml";
      return 1 if $ct =~ /\+xml$/;
      return 0;
  }
  
  sub referer           {
      my $self = shift;
      if (@_ && $_[0] =~ /#/) {
  	# Strip fragment per RFC 2616, section 14.36.
  	my $uri = shift;
  	if (ref($uri)) {
  	    $uri = $uri->clone;
  	    $uri->fragment(undef);
  	}
  	else {
  	    $uri =~ s/\#.*//;
  	}
  	unshift @_, $uri;
      }
      ($self->_header('Referer', @_))[0];
  }
  *referrer = \&referer;  # on tchrist's request
  
  sub title             { (shift->_header('Title',            @_))[0] }
  sub content_encoding  { (shift->_header('Content-Encoding', @_))[0] }
  sub content_language  { (shift->_header('Content-Language', @_))[0] }
  sub content_length    { (shift->_header('Content-Length',   @_))[0] }
  
  sub user_agent        { (shift->_header('User-Agent',       @_))[0] }
  sub server            { (shift->_header('Server',           @_))[0] }
  
  sub from              { (shift->_header('From',             @_))[0] }
  sub warning           { (shift->_header('Warning',          @_))[0] }
  
  sub www_authenticate  { (shift->_header('WWW-Authenticate', @_))[0] }
  sub authorization     { (shift->_header('Authorization',    @_))[0] }
  
  sub proxy_authenticate  { (shift->_header('Proxy-Authenticate',  @_))[0] }
  sub proxy_authorization { (shift->_header('Proxy-Authorization', @_))[0] }
  
  sub authorization_basic       { shift->_basic_auth("Authorization",       @_) }
  sub proxy_authorization_basic { shift->_basic_auth("Proxy-Authorization", @_) }
  
  sub _basic_auth {
      require MIME::Base64;
      my($self, $h, $user, $passwd) = @_;
      my($old) = $self->_header($h);
      if (defined $user) {
  	Carp::croak("Basic authorization user name can't contain ':'")
  	  if $user =~ /:/;
  	$passwd = '' unless defined $passwd;
  	$self->_header($h => 'Basic ' .
                               MIME::Base64::encode("$user:$passwd", ''));
      }
      if (defined $old && $old =~ s/^\s*Basic\s+//) {
  	my $val = MIME::Base64::decode($old);
  	return $val unless wantarray;
  	return split(/:/, $val, 2);
      }
      return;
  }
  
  
  1;
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  HTTP::Headers - Class encapsulating HTTP Message headers
  
  =head1 VERSION
  
  version 6.18
  
  =head1 SYNOPSIS
  
   require HTTP::Headers;
   $h = HTTP::Headers->new;
  
   $h->header('Content-Type' => 'text/plain');  # set
   $ct = $h->header('Content-Type');            # get
   $h->remove_header('Content-Type');           # delete
  
  =head1 DESCRIPTION
  
  The C<HTTP::Headers> class encapsulates HTTP-style message headers.
  The headers consist of attribute-value pairs also called fields, which
  may be repeated, and which are printed in a particular order.  The
  field names are cases insensitive.
  
  Instances of this class are usually created as member variables of the
  C<HTTP::Request> and C<HTTP::Response> classes, internal to the
  library.
  
  The following methods are available:
  
  =over 4
  
  =item $h = HTTP::Headers->new
  
  Constructs a new C<HTTP::Headers> object.  You might pass some initial
  attribute-value pairs as parameters to the constructor.  I<E.g.>:
  
   $h = HTTP::Headers->new(
         Date         => 'Thu, 03 Feb 1994 00:00:00 GMT',
         Content_Type => 'text/html; version=3.2',
         Content_Base => 'http://www.perl.org/');
  
  The constructor arguments are passed to the C<header> method which is
  described below.
  
  =item $h->clone
  
  Returns a copy of this C<HTTP::Headers> object.
  
  =item $h->header( $field )
  
  =item $h->header( $field => $value )
  
  =item $h->header( $f1 => $v1, $f2 => $v2, ... )
  
  Get or set the value of one or more header fields.  The header field
  name ($field) is not case sensitive.  To make the life easier for perl
  users who wants to avoid quoting before the => operator, you can use
  '_' as a replacement for '-' in header names.
  
  The header() method accepts multiple ($field => $value) pairs, which
  means that you can update several fields with a single invocation.
  
  The $value argument may be a plain string or a reference to an array
  of strings for a multi-valued field. If the $value is provided as
  C<undef> then the field is removed.  If the $value is not given, then
  that header field will remain unchanged.
  
  The old value (or values) of the last of the header fields is returned.
  If no such field exists C<undef> will be returned.
  
  A multi-valued field will be returned as separate values in list
  context and will be concatenated with ", " as separator in scalar
  context.  The HTTP spec (RFC 2616) promises that joining multiple
  values in this way will not change the semantic of a header field, but
  in practice there are cases like old-style Netscape cookies (see
  L<HTTP::Cookies>) where "," is used as part of the syntax of a single
  field value.
  
  Examples:
  
   $header->header(MIME_Version => '1.0',
  		 User_Agent   => 'My-Web-Client/0.01');
   $header->header(Accept => "text/html, text/plain, image/*");
   $header->header(Accept => [qw(text/html text/plain image/*)]);
   @accepts = $header->header('Accept');  # get multiple values
   $accepts = $header->header('Accept');  # get values as a single string
  
  =item $h->push_header( $field => $value )
  
  =item $h->push_header( $f1 => $v1, $f2 => $v2, ... )
  
  Add a new field value for the specified header field.  Previous values
  for the same field are retained.
  
  As for the header() method, the field name ($field) is not case
  sensitive and '_' can be used as a replacement for '-'.
  
  The $value argument may be a scalar or a reference to a list of
  scalars.
  
   $header->push_header(Accept => 'image/jpeg');
   $header->push_header(Accept => [map "image/$_", qw(gif png tiff)]);
  
  =item $h->init_header( $field => $value )
  
  Set the specified header to the given value, but only if no previous
  value for that field is set.
  
  The header field name ($field) is not case sensitive and '_'
  can be used as a replacement for '-'.
  
  The $value argument may be a scalar or a reference to a list of
  scalars.
  
  =item $h->remove_header( $field, ... )
  
  This function removes the header fields with the specified names.
  
  The header field names ($field) are not case sensitive and '_'
  can be used as a replacement for '-'.
  
  The return value is the values of the fields removed.  In scalar
  context the number of fields removed is returned.
  
  Note that if you pass in multiple field names then it is generally not
  possible to tell which of the returned values belonged to which field.
  
  =item $h->remove_content_headers
  
  This will remove all the header fields used to describe the content of
  a message.  All header field names prefixed with C<Content-> fall
  into this category, as well as C<Allow>, C<Expires> and
  C<Last-Modified>.  RFC 2616 denotes these fields as I<Entity Header
  Fields>.
  
  The return value is a new C<HTTP::Headers> object that contains the
  removed headers only.
  
  =item $h->clear
  
  This will remove all header fields.
  
  =item $h->header_field_names
  
  Returns the list of distinct names for the fields present in the
  header.  The field names have case as suggested by HTTP spec, and the
  names are returned in the recommended "Good Practice" order.
  
  In scalar context return the number of distinct field names.
  
  =item $h->scan( \&process_header_field )
  
  Apply a subroutine to each header field in turn.  The callback routine
  is called with two parameters; the name of the field and a single
  value (a string).  If a header field is multi-valued, then the
  routine is called once for each value.  The field name passed to the
  callback routine has case as suggested by HTTP spec, and the headers
  will be visited in the recommended "Good Practice" order.
  
  Any return values of the callback routine are ignored.  The loop can
  be broken by raising an exception (C<die>), but the caller of scan()
  would have to trap the exception itself.
  
  =item $h->flatten()
  
  Returns the list of pairs of keys and values.
  
  =item $h->as_string
  
  =item $h->as_string( $eol )
  
  Return the header fields as a formatted MIME header.  Since it
  internally uses the C<scan> method to build the string, the result
  will use case as suggested by HTTP spec, and it will follow
  recommended "Good Practice" of ordering the header fields.  Long header
  values are not folded.
  
  The optional $eol parameter specifies the line ending sequence to
  use.  The default is "\n".  Embedded "\n" characters in header field
  values will be substituted with this line ending sequence.
  
  =back
  
  =head1 CONVENIENCE METHODS
  
  The most frequently used headers can also be accessed through the
  following convenience methods.  Most of these methods can both be used to read
  and to set the value of a header.  The header value is set if you pass
  an argument to the method.  The old header value is always returned.
  If the given header did not exist then C<undef> is returned.
  
  Methods that deal with dates/times always convert their value to system
  time (seconds since Jan 1, 1970) and they also expect this kind of
  value when the header value is set.
  
  =over 4
  
  =item $h->date
  
  This header represents the date and time at which the message was
  originated. I<E.g.>:
  
    $h->date(time);  # set current date
  
  =item $h->expires
  
  This header gives the date and time after which the entity should be
  considered stale.
  
  =item $h->if_modified_since
  
  =item $h->if_unmodified_since
  
  These header fields are used to make a request conditional.  If the requested
  resource has (or has not) been modified since the time specified in this field,
  then the server will return a C<304 Not Modified> response instead of
  the document itself.
  
  =item $h->last_modified
  
  This header indicates the date and time at which the resource was last
  modified. I<E.g.>:
  
    # check if document is more than 1 hour old
    if (my $last_mod = $h->last_modified) {
        if ($last_mod < time - 60*60) {
  	  ...
        }
    }
  
  =item $h->content_type
  
  The Content-Type header field indicates the media type of the message
  content. I<E.g.>:
  
    $h->content_type('text/html');
  
  The value returned will be converted to lower case, and potential
  parameters will be chopped off and returned as a separate value if in
  an array context.  If there is no such header field, then the empty
  string is returned.  This makes it safe to do the following:
  
    if ($h->content_type eq 'text/html') {
       # we enter this place even if the real header value happens to
       # be 'TEXT/HTML; version=3.0'
       ...
    }
  
  =item $h->content_type_charset
  
  Returns the upper-cased charset specified in the Content-Type header.  In list
  context return the lower-cased bare content type followed by the upper-cased
  charset.  Both values will be C<undef> if not specified in the header.
  
  =item $h->content_is_text
  
  Returns TRUE if the Content-Type header field indicate that the
  content is textual.
  
  =item $h->content_is_html
  
  Returns TRUE if the Content-Type header field indicate that the
  content is some kind of HTML (including XHTML).  This method can't be
  used to set Content-Type.
  
  =item $h->content_is_xhtml
  
  Returns TRUE if the Content-Type header field indicate that the
  content is XHTML.  This method can't be used to set Content-Type.
  
  =item $h->content_is_xml
  
  Returns TRUE if the Content-Type header field indicate that the
  content is XML.  This method can't be used to set Content-Type.
  
  =item $h->content_encoding
  
  The Content-Encoding header field is used as a modifier to the
  media type.  When present, its value indicates what additional
  encoding mechanism has been applied to the resource.
  
  =item $h->content_length
  
  A decimal number indicating the size in bytes of the message content.
  
  =item $h->content_language
  
  The natural language(s) of the intended audience for the message
  content.  The value is one or more language tags as defined by RFC
  1766.  Eg. "no" for some kind of Norwegian and "en-US" for English the
  way it is written in the US.
  
  =item $h->title
  
  The title of the document.  In libwww-perl this header will be
  initialized automatically from the E<lt>TITLE>...E<lt>/TITLE> element
  of HTML documents.  I<This header is no longer part of the HTTP
  standard.>
  
  =item $h->user_agent
  
  This header field is used in request messages and contains information
  about the user agent originating the request.  I<E.g.>:
  
    $h->user_agent('Mozilla/5.0 (compatible; MSIE 7.0; Windows NT 6.0)');
  
  =item $h->server
  
  The server header field contains information about the software being
  used by the originating server program handling the request.
  
  =item $h->from
  
  This header should contain an Internet e-mail address for the human
  user who controls the requesting user agent.  The address should be
  machine-usable, as defined by RFC822.  E.g.:
  
    $h->from('King Kong <king@kong.com>');
  
  I<This header is no longer part of the HTTP standard.>
  
  =item $h->referer
  
  Used to specify the address (URI) of the document from which the
  requested resource address was obtained.
  
  The "Free On-line Dictionary of Computing" as this to say about the
  word I<referer>:
  
       <World-Wide Web> A misspelling of "referrer" which
       somehow made it into the {HTTP} standard.  A given {web
       page}'s referer (sic) is the {URL} of whatever web page
       contains the link that the user followed to the current
       page.  Most browsers pass this information as part of a
       request.
  
       (1998-10-19)
  
  By popular demand C<referrer> exists as an alias for this method so you
  can avoid this misspelling in your programs and still send the right
  thing on the wire.
  
  When setting the referrer, this method removes the fragment from the
  given URI if it is present, as mandated by RFC2616.  Note that
  the removal does I<not> happen automatically if using the header(),
  push_header() or init_header() methods to set the referrer.
  
  =item $h->www_authenticate
  
  This header must be included as part of a C<401 Unauthorized> response.
  The field value consist of a challenge that indicates the
  authentication scheme and parameters applicable to the requested URI.
  
  =item $h->proxy_authenticate
  
  This header must be included in a C<407 Proxy Authentication Required>
  response.
  
  =item $h->authorization
  
  =item $h->proxy_authorization
  
  A user agent that wishes to authenticate itself with a server or a
  proxy, may do so by including these headers.
  
  =item $h->authorization_basic
  
  This method is used to get or set an authorization header that use the
  "Basic Authentication Scheme".  In array context it will return two
  values; the user name and the password.  In scalar context it will
  return I<"uname:password"> as a single string value.
  
  When used to set the header value, it expects two arguments.  I<E.g.>:
  
    $h->authorization_basic($uname, $password);
  
  The method will croak if the $uname contains a colon ':'.
  
  =item $h->proxy_authorization_basic
  
  Same as authorization_basic() but will set the "Proxy-Authorization"
  header instead.
  
  =back
  
  =head1 NON-CANONICALIZED FIELD NAMES
  
  The header field name spelling is normally canonicalized including the
  '_' to '-' translation.  There are some application where this is not
  appropriate.  Prefixing field names with ':' allow you to force a
  specific spelling.  For example if you really want a header field name
  to show up as C<foo_bar> instead of "Foo-Bar", you might set it like
  this:
  
    $h->header(":foo_bar" => 1);
  
  These field names are returned with the ':' intact for
  $h->header_field_names and the $h->scan callback, but the colons do
  not show in $h->as_string.
  
  =head1 AUTHOR
  
  Gisle Aas <gisle@activestate.com>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 1994-2017 by Gisle Aas.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
  
  __END__
  
  
  #ABSTRACT: Class encapsulating HTTP Message headers
  
HTTP_HEADERS

    $main::fatpacked{"HTTP/Headers/Auth.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'HTTP_HEADERS_AUTH';
  package HTTP::Headers::Auth;
  
  use strict;
  use warnings;
  
  our $VERSION = '6.18';
  
  use HTTP::Headers;
  
  package
      HTTP::Headers;
  
  BEGIN {
      # we provide a new (and better) implementations below
      undef(&www_authenticate);
      undef(&proxy_authenticate);
  }
  
  require HTTP::Headers::Util;
  
  sub _parse_authenticate
  {
      my @ret;
      for (HTTP::Headers::Util::split_header_words(@_)) {
  	if (!defined($_->[1])) {
  	    # this is a new auth scheme
  	    push(@ret, shift(@$_) => {});
  	    shift @$_;
  	}
  	if (@ret) {
  	    # this a new parameter pair for the last auth scheme
  	    while (@$_) {
  		my $k = shift @$_;
  		my $v = shift @$_;
  	        $ret[-1]{$k} = $v;
  	    }
  	}
  	else {
  	    # something wrong, parameter pair without any scheme seen
  	    # IGNORE
  	}
      }
      @ret;
  }
  
  sub _authenticate
  {
      my $self = shift;
      my $header = shift;
      my @old = $self->_header($header);
      if (@_) {
  	$self->remove_header($header);
  	my @new = @_;
  	while (@new) {
  	    my $a_scheme = shift(@new);
  	    if ($a_scheme =~ /\s/) {
  		# assume complete valid value, pass it through
  		$self->push_header($header, $a_scheme);
  	    }
  	    else {
  		my @param;
  		if (@new) {
  		    my $p = $new[0];
  		    if (ref($p) eq "ARRAY") {
  			@param = @$p;
  			shift(@new);
  		    }
  		    elsif (ref($p) eq "HASH") {
  			@param = %$p;
  			shift(@new);
  		    }
  		}
  		my $val = ucfirst(lc($a_scheme));
  		if (@param) {
  		    my $sep = " ";
  		    while (@param) {
  			my $k = shift @param;
  			my $v = shift @param;
  			if ($v =~ /[^0-9a-zA-Z]/ || lc($k) eq "realm") {
  			    # must quote the value
  			    $v =~ s,([\\\"]),\\$1,g;
  			    $v = qq("$v");
  			}
  			$val .= "$sep$k=$v";
  			$sep = ", ";
  		    }
  		}
  		$self->push_header($header, $val);
  	    }
  	}
      }
      return unless defined wantarray;
      wantarray ? _parse_authenticate(@old) : join(", ", @old);
  }
  
  
  sub www_authenticate    { shift->_authenticate("WWW-Authenticate", @_)   }
  sub proxy_authenticate  { shift->_authenticate("Proxy-Authenticate", @_) }
  
  1;
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  HTTP::Headers::Auth
  
  =head1 VERSION
  
  version 6.18
  
  =head1 AUTHOR
  
  Gisle Aas <gisle@activestate.com>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 1994-2017 by Gisle Aas.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
HTTP_HEADERS_AUTH

    $main::fatpacked{"HTTP/Headers/ETag.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'HTTP_HEADERS_ETAG';
  package HTTP::Headers::ETag;
  
  use strict;
  use warnings;
  
  our $VERSION = '6.18';
  
  require HTTP::Date;
  
  require HTTP::Headers;
  package
      HTTP::Headers;
  
  sub _etags
  {
      my $self = shift;
      my $header = shift;
      my @old = _split_etag_list($self->_header($header));
      if (@_) {
  	$self->_header($header => join(", ", _split_etag_list(@_)));
      }
      wantarray ? @old : join(", ", @old);
  }
  
  sub etag          { shift->_etags("ETag", @_); }
  sub if_match      { shift->_etags("If-Match", @_); }
  sub if_none_match { shift->_etags("If-None-Match", @_); }
  
  sub if_range {
      # Either a date or an entity-tag
      my $self = shift;
      my @old = $self->_header("If-Range");
      if (@_) {
  	my $new = shift;
  	if (!defined $new) {
  	    $self->remove_header("If-Range");
  	}
  	elsif ($new =~ /^\d+$/) {
  	    $self->_date_header("If-Range", $new);
  	}
  	else {
  	    $self->_etags("If-Range", $new);
  	}
      }
      return unless defined(wantarray);
      for (@old) {
  	my $t = HTTP::Date::str2time($_);
  	$_ = $t if $t;
      }
      wantarray ? @old : join(", ", @old);
  }
  
  
  # Split a list of entity tag values.  The return value is a list
  # consisting of one element per entity tag.  Suitable for parsing
  # headers like C<If-Match>, C<If-None-Match>.  You might even want to
  # use it on C<ETag> and C<If-Range> entity tag values, because it will
  # normalize them to the common form.
  #
  #  entity-tag	  = [ weak ] opaque-tag
  #  weak		  = "W/"
  #  opaque-tag	  = quoted-string
  
  
  sub _split_etag_list
  {
      my(@val) = @_;
      my @res;
      for (@val) {
          while (length) {
              my $weak = "";
  	    $weak = "W/" if s,^\s*[wW]/,,;
              my $etag = "";
  	    if (s/^\s*(\"[^\"\\]*(?:\\.[^\"\\]*)*\")//) {
  		push(@res, "$weak$1");
              }
              elsif (s/^\s*,//) {
                  push(@res, qq(W/"")) if $weak;
              }
              elsif (s/^\s*([^,\s]+)//) {
                  $etag = $1;
  		$etag =~ s/([\"\\])/\\$1/g;
  	        push(@res, qq($weak"$etag"));
              }
              elsif (s/^\s+// || !length) {
                  push(@res, qq(W/"")) if $weak;
              }
              else {
  	 	die "This should not happen: '$_'";
              }
          }
     }
     @res;
  }
  
  1;
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  HTTP::Headers::ETag
  
  =head1 VERSION
  
  version 6.18
  
  =head1 AUTHOR
  
  Gisle Aas <gisle@activestate.com>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 1994-2017 by Gisle Aas.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
HTTP_HEADERS_ETAG

    $main::fatpacked{"HTTP/Headers/Util.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'HTTP_HEADERS_UTIL';
  package HTTP::Headers::Util;
  
  use strict;
  use warnings;
  
  our $VERSION = '6.18';
  
  use base 'Exporter';
  
  our @EXPORT_OK=qw(split_header_words _split_header_words join_header_words);
  
  
  sub split_header_words {
      my @res = &_split_header_words;
      for my $arr (@res) {
  	for (my $i = @$arr - 2; $i >= 0; $i -= 2) {
  	    $arr->[$i] = lc($arr->[$i]);
  	}
      }
      return @res;
  }
  
  sub _split_header_words
  {
      my(@val) = @_;
      my @res;
      for (@val) {
  	my @cur;
  	while (length) {
  	    if (s/^\s*(=*[^\s=;,]+)//) {  # 'token' or parameter 'attribute'
  		push(@cur, $1);
  		# a quoted value
  		if (s/^\s*=\s*\"([^\"\\]*(?:\\.[^\"\\]*)*)\"//) {
  		    my $val = $1;
  		    $val =~ s/\\(.)/$1/g;
  		    push(@cur, $val);
  		# some unquoted value
  		}
  		elsif (s/^\s*=\s*([^;,\s]*)//) {
  		    my $val = $1;
  		    $val =~ s/\s+$//;
  		    push(@cur, $val);
  		# no value, a lone token
  		}
  		else {
  		    push(@cur, undef);
  		}
  	    }
  	    elsif (s/^\s*,//) {
  		push(@res, [@cur]) if @cur;
  		@cur = ();
  	    }
  	    elsif (s/^\s*;// || s/^\s+//) {
  		# continue
  	    }
  	    else {
  		die "This should not happen: '$_'";
  	    }
  	}
  	push(@res, \@cur) if @cur;
      }
      @res;
  }
  
  
  sub join_header_words
  {
      @_ = ([@_]) if @_ && !ref($_[0]);
      my @res;
      for (@_) {
  	my @cur = @$_;
  	my @attr;
  	while (@cur) {
  	    my $k = shift @cur;
  	    my $v = shift @cur;
  	    if (defined $v) {
  		if ($v =~ /[\x00-\x20()<>@,;:\\\"\/\[\]?={}\x7F-\xFF]/ || !length($v)) {
  		    $v =~ s/([\"\\])/\\$1/g;  # escape " and \
  		    $k .= qq(="$v");
  		}
  		else {
  		    # token
  		    $k .= "=$v";
  		}
  	    }
  	    push(@attr, $k);
  	}
  	push(@res, join("; ", @attr)) if @attr;
      }
      join(", ", @res);
  }
  
  
  1;
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  HTTP::Headers::Util - Header value parsing utility functions
  
  =head1 VERSION
  
  version 6.18
  
  =head1 SYNOPSIS
  
    use HTTP::Headers::Util qw(split_header_words);
    @values = split_header_words($h->header("Content-Type"));
  
  =head1 DESCRIPTION
  
  This module provides a few functions that helps parsing and
  construction of valid HTTP header values.  None of the functions are
  exported by default.
  
  The following functions are available:
  
  =over 4
  
  =item split_header_words( @header_values )
  
  This function will parse the header values given as argument into a
  list of anonymous arrays containing key/value pairs.  The function
  knows how to deal with ",", ";" and "=" as well as quoted values after
  "=".  A list of space separated tokens are parsed as if they were
  separated by ";".
  
  If the @header_values passed as argument contains multiple values,
  then they are treated as if they were a single value separated by
  comma ",".
  
  This means that this function is useful for parsing header fields that
  follow this syntax (BNF as from the HTTP/1.1 specification, but we relax
  the requirement for tokens).
  
    headers           = #header
    header            = (token | parameter) *( [";"] (token | parameter))
  
    token             = 1*<any CHAR except CTLs or separators>
    separators        = "(" | ")" | "<" | ">" | "@"
                      | "," | ";" | ":" | "\" | <">
                      | "/" | "[" | "]" | "?" | "="
                      | "{" | "}" | SP | HT
  
    quoted-string     = ( <"> *(qdtext | quoted-pair ) <"> )
    qdtext            = <any TEXT except <">>
    quoted-pair       = "\" CHAR
  
    parameter         = attribute "=" value
    attribute         = token
    value             = token | quoted-string
  
  Each I<header> is represented by an anonymous array of key/value
  pairs.  The keys will be all be forced to lower case.
  The value for a simple token (not part of a parameter) is C<undef>.
  Syntactically incorrect headers will not necessarily be parsed as you
  would want.
  
  This is easier to describe with some examples:
  
     split_header_words('foo="bar"; port="80,81"; DISCARD, BAR=baz');
     split_header_words('text/html; charset="iso-8859-1"');
     split_header_words('Basic realm="\\"foo\\\\bar\\""');
  
  will return
  
     [foo=>'bar', port=>'80,81', discard=> undef], [bar=>'baz' ]
     ['text/html' => undef, charset => 'iso-8859-1']
     [basic => undef, realm => "\"foo\\bar\""]
  
  If you don't want the function to convert tokens and attribute keys to
  lower case you can call it as C<_split_header_words> instead (with a
  leading underscore).
  
  =item join_header_words( @arrays )
  
  This will do the opposite of the conversion done by split_header_words().
  It takes a list of anonymous arrays as arguments (or a list of
  key/value pairs) and produces a single header value.  Attribute values
  are quoted if needed.
  
  Example:
  
     join_header_words(["text/plain" => undef, charset => "iso-8859/1"]);
     join_header_words("text/plain" => undef, charset => "iso-8859/1");
  
  will both return the string:
  
     text/plain; charset="iso-8859/1"
  
  =back
  
  =head1 AUTHOR
  
  Gisle Aas <gisle@activestate.com>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 1994-2017 by Gisle Aas.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
  
  __END__
  
  
  #ABSTRACT: Header value parsing utility functions
  
HTTP_HEADERS_UTIL

    $main::fatpacked{"HTTP/Message.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'HTTP_MESSAGE';
  package HTTP::Message;
  
  use strict;
  use warnings;
  
  our $VERSION = '6.18';
  
  require HTTP::Headers;
  require Carp;
  
  my $CRLF = "\015\012";   # "\r\n" is not portable
  unless ($HTTP::URI_CLASS) {
      if ($ENV{PERL_HTTP_URI_CLASS}
      &&  $ENV{PERL_HTTP_URI_CLASS} =~ /^([\w:]+)$/) {
          $HTTP::URI_CLASS = $1;
      } else {
          $HTTP::URI_CLASS = "URI";
      }
  }
  eval "require $HTTP::URI_CLASS"; die $@ if $@;
  
  *_utf8_downgrade = defined(&utf8::downgrade) ?
      sub {
          utf8::downgrade($_[0], 1) or
              Carp::croak("HTTP::Message content must be bytes")
      }
      :
      sub {
      };
  
  sub new
  {
      my($class, $header, $content) = @_;
      if (defined $header) {
  	Carp::croak("Bad header argument") unless ref $header;
          if (ref($header) eq "ARRAY") {
  	    $header = HTTP::Headers->new(@$header);
  	}
  	else {
  	    $header = $header->clone;
  	}
      }
      else {
  	$header = HTTP::Headers->new;
      }
      if (defined $content) {
          _utf8_downgrade($content);
      }
      else {
          $content = '';
      }
  
      bless {
  	'_headers' => $header,
  	'_content' => $content,
      }, $class;
  }
  
  
  sub parse
  {
      my($class, $str) = @_;
  
      my @hdr;
      while (1) {
  	if ($str =~ s/^([^\s:]+)[ \t]*: ?(.*)\n?//) {
  	    push(@hdr, $1, $2);
  	    $hdr[-1] =~ s/\r\z//;
  	}
  	elsif (@hdr && $str =~ s/^([ \t].*)\n?//) {
  	    $hdr[-1] .= "\n$1";
  	    $hdr[-1] =~ s/\r\z//;
  	}
  	else {
  	    $str =~ s/^\r?\n//;
  	    last;
  	}
      }
      local $HTTP::Headers::TRANSLATE_UNDERSCORE;
      new($class, \@hdr, $str);
  }
  
  
  sub clone
  {
      my $self  = shift;
      my $clone = HTTP::Message->new($self->headers,
  				   $self->content);
      $clone->protocol($self->protocol);
      $clone;
  }
  
  
  sub clear {
      my $self = shift;
      $self->{_headers}->clear;
      $self->content("");
      delete $self->{_parts};
      return;
  }
  
  
  sub protocol {
      shift->_elem('_protocol',  @_);
  }
  
  sub headers {
      my $self = shift;
  
      # recalculation of _content might change headers, so we
      # need to force it now
      $self->_content unless exists $self->{_content};
  
      $self->{_headers};
  }
  
  sub headers_as_string {
      shift->headers->as_string(@_);
  }
  
  
  sub content  {
  
      my $self = $_[0];
      if (defined(wantarray)) {
  	$self->_content unless exists $self->{_content};
  	my $old = $self->{_content};
  	$old = $$old if ref($old) eq "SCALAR";
  	&_set_content if @_ > 1;
  	return $old;
      }
  
      if (@_ > 1) {
  	&_set_content;
      }
      else {
  	Carp::carp("Useless content call in void context") if $^W;
      }
  }
  
  
  sub _set_content {
      my $self = $_[0];
      _utf8_downgrade($_[1]);
      if (!ref($_[1]) && ref($self->{_content}) eq "SCALAR") {
  	${$self->{_content}} = defined( $_[1] ) ? $_[1] : '';
      }
      else {
  	die "Can't set content to be a scalar reference" if ref($_[1]) eq "SCALAR";
  	$self->{_content} = defined( $_[1] ) ? $_[1] : '';
  	delete $self->{_content_ref};
      }
      delete $self->{_parts} unless $_[2];
  }
  
  
  sub add_content
  {
      my $self = shift;
      $self->_content unless exists $self->{_content};
      my $chunkref = \$_[0];
      $chunkref = $$chunkref if ref($$chunkref);  # legacy
  
      _utf8_downgrade($$chunkref);
  
      my $ref = ref($self->{_content});
      if (!$ref) {
  	$self->{_content} .= $$chunkref;
      }
      elsif ($ref eq "SCALAR") {
  	${$self->{_content}} .= $$chunkref;
      }
      else {
  	Carp::croak("Can't append to $ref content");
      }
      delete $self->{_parts};
  }
  
  sub add_content_utf8 {
      my($self, $buf)  = @_;
      utf8::upgrade($buf);
      utf8::encode($buf);
      $self->add_content($buf);
  }
  
  sub content_ref
  {
      my $self = shift;
      $self->_content unless exists $self->{_content};
      delete $self->{_parts};
      my $old = \$self->{_content};
      my $old_cref = $self->{_content_ref};
      if (@_) {
  	my $new = shift;
  	Carp::croak("Setting content_ref to a non-ref") unless ref($new);
  	delete $self->{_content};  # avoid modifying $$old
  	$self->{_content} = $new;
  	$self->{_content_ref}++;
      }
      $old = $$old if $old_cref;
      return $old;
  }
  
  
  sub content_charset
  {
      my $self = shift;
      if (my $charset = $self->content_type_charset) {
  	return $charset;
      }
  
      # time to start guessing
      my $cref = $self->decoded_content(ref => 1, charset => "none");
  
      # Unicode BOM
      for ($$cref) {
  	return "UTF-8"     if /^\xEF\xBB\xBF/;
  	return "UTF-32LE" if /^\xFF\xFE\x00\x00/;
  	return "UTF-32BE" if /^\x00\x00\xFE\xFF/;
  	return "UTF-16LE" if /^\xFF\xFE/;
  	return "UTF-16BE" if /^\xFE\xFF/;
      }
  
      if ($self->content_is_xml) {
  	# http://www.w3.org/TR/2006/REC-xml-20060816/#sec-guessing
  	# XML entity not accompanied by external encoding information and not
  	# in UTF-8 or UTF-16 encoding must begin with an XML encoding declaration,
  	# in which the first characters must be '<?xml'
  	for ($$cref) {
  	    return "UTF-32BE" if /^\x00\x00\x00</;
  	    return "UTF-32LE" if /^<\x00\x00\x00/;
  	    return "UTF-16BE" if /^(?:\x00\s)*\x00</;
  	    return "UTF-16LE" if /^(?:\s\x00)*<\x00/;
  	    if (/^\s*(<\?xml[^\x00]*?\?>)/) {
  		if ($1 =~ /\sencoding\s*=\s*(["'])(.*?)\1/) {
  		    my $enc = $2;
  		    $enc =~ s/^\s+//; $enc =~ s/\s+\z//;
  		    return $enc if $enc;
  		}
  	    }
  	}
  	return "UTF-8";
      }
      elsif ($self->content_is_html) {
  	# look for <META charset="..."> or <META content="...">
  	# http://dev.w3.org/html5/spec/Overview.html#determining-the-character-encoding
  	require IO::HTML;
  	# Use relaxed search to match previous versions of HTTP::Message:
  	my $encoding = IO::HTML::find_charset_in($$cref, { encoding    => 1,
  	                                                   need_pragma => 0 });
  	return $encoding->mime_name if $encoding;
      }
      elsif ($self->content_type eq "application/json") {
  	for ($$cref) {
  	    # RFC 4627, ch 3
  	    return "UTF-32BE" if /^\x00\x00\x00./s;
  	    return "UTF-32LE" if /^.\x00\x00\x00/s;
  	    return "UTF-16BE" if /^\x00.\x00./s;
  	    return "UTF-16LE" if /^.\x00.\x00/s;
  	    return "UTF-8";
  	}
      }
      if ($self->content_type =~ /^text\//) {
  	for ($$cref) {
  	    if (length) {
  		return "US-ASCII" unless /[\x80-\xFF]/;
  		require Encode;
  		eval {
  		    Encode::decode_utf8($_, Encode::FB_CROAK() | Encode::LEAVE_SRC());
  		};
  		return "UTF-8" unless $@;
  		return "ISO-8859-1";
  	    }
  	}
      }
  
      return undef;
  }
  
  
  sub decoded_content
  {
      my($self, %opt) = @_;
      my $content_ref;
      my $content_ref_iscopy;
  
      eval {
  	$content_ref = $self->content_ref;
  	die "Can't decode ref content" if ref($content_ref) ne "SCALAR";
  
  	if (my $h = $self->header("Content-Encoding")) {
  	    $h =~ s/^\s+//;
  	    $h =~ s/\s+$//;
  	    for my $ce (reverse split(/\s*,\s*/, lc($h))) {
  		next unless $ce;
  		next if $ce eq "identity" || $ce eq "none";
  		if ($ce eq "gzip" || $ce eq "x-gzip") {
  		    require IO::Uncompress::Gunzip;
  		    my $output;
  		    IO::Uncompress::Gunzip::gunzip($content_ref, \$output, Transparent => 0)
  			or die "Can't gunzip content: $IO::Uncompress::Gunzip::GunzipError";
  		    $content_ref = \$output;
  		    $content_ref_iscopy++;
  		}
  		elsif ($ce eq "x-bzip2" or $ce eq "bzip2") {
  		    require IO::Uncompress::Bunzip2;
  		    my $output;
  		    IO::Uncompress::Bunzip2::bunzip2($content_ref, \$output, Transparent => 0)
  			or die "Can't bunzip content: $IO::Uncompress::Bunzip2::Bunzip2Error";
  		    $content_ref = \$output;
  		    $content_ref_iscopy++;
  		}
  		elsif ($ce eq "deflate") {
  		    require IO::Uncompress::Inflate;
  		    my $output;
  		    my $status = IO::Uncompress::Inflate::inflate($content_ref, \$output, Transparent => 0);
  		    my $error = $IO::Uncompress::Inflate::InflateError;
  		    unless ($status) {
  			# "Content-Encoding: deflate" is supposed to mean the
  			# "zlib" format of RFC 1950, but Microsoft got that
  			# wrong, so some servers sends the raw compressed
  			# "deflate" data.  This tries to inflate this format.
  			$output = undef;
  			require IO::Uncompress::RawInflate;
  			unless (IO::Uncompress::RawInflate::rawinflate($content_ref, \$output)) {
  			    $self->push_header("Client-Warning" =>
  				"Could not raw inflate content: $IO::Uncompress::RawInflate::RawInflateError");
  			    $output = undef;
  			}
  		    }
  		    die "Can't inflate content: $error" unless defined $output;
  		    $content_ref = \$output;
  		    $content_ref_iscopy++;
  		}
  		elsif ($ce eq "compress" || $ce eq "x-compress") {
  		    die "Can't uncompress content";
  		}
  		elsif ($ce eq "base64") {  # not really C-T-E, but should be harmless
  		    require MIME::Base64;
  		    $content_ref = \MIME::Base64::decode($$content_ref);
  		    $content_ref_iscopy++;
  		}
  		elsif ($ce eq "quoted-printable") { # not really C-T-E, but should be harmless
  		    require MIME::QuotedPrint;
  		    $content_ref = \MIME::QuotedPrint::decode($$content_ref);
  		    $content_ref_iscopy++;
  		}
  		else {
  		    die "Don't know how to decode Content-Encoding '$ce'";
  		}
  	    }
  	}
  
  	if ($self->content_is_text || (my $is_xml = $self->content_is_xml)) {
  	    my $charset = lc(
  	        $opt{charset} ||
  		$self->content_type_charset ||
  		$opt{default_charset} ||
  		$self->content_charset ||
  		"ISO-8859-1"
  	    );
  	    if ($charset eq "none") {
  		# leave it as is
  	    }
  	    elsif ($charset eq "us-ascii" || $charset eq "iso-8859-1") {
  		if ($$content_ref =~ /[^\x00-\x7F]/ && defined &utf8::upgrade) {
  		    unless ($content_ref_iscopy) {
  			my $copy = $$content_ref;
  			$content_ref = \$copy;
  			$content_ref_iscopy++;
  		    }
  		    utf8::upgrade($$content_ref);
  		}
  	    }
  	    else {
  		require Encode;
  		eval {
  		    $content_ref = \Encode::decode($charset, $$content_ref,
  			 ($opt{charset_strict} ? Encode::FB_CROAK() : 0) | Encode::LEAVE_SRC());
  		};
  		if ($@) {
  		    my $retried;
  		    if ($@ =~ /^Unknown encoding/) {
  			my $alt_charset = lc($opt{alt_charset} || "");
  			if ($alt_charset && $charset ne $alt_charset) {
  			    # Retry decoding with the alternative charset
  			    $content_ref = \Encode::decode($alt_charset, $$content_ref,
  				 ($opt{charset_strict} ? Encode::FB_CROAK() : 0) | Encode::LEAVE_SRC())
  			        unless $alt_charset eq "none";
  			    $retried++;
  			}
  		    }
  		    die unless $retried;
  		}
  		die "Encode::decode() returned undef improperly" unless defined $$content_ref;
  		if ($is_xml) {
  		    # Get rid of the XML encoding declaration if present
  		    $$content_ref =~ s/^\x{FEFF}//;
  		    if ($$content_ref =~ /^(\s*<\?xml[^\x00]*?\?>)/) {
  			substr($$content_ref, 0, length($1)) =~ s/\sencoding\s*=\s*(["']).*?\1//;
  		    }
  		}
  	    }
  	}
      };
      if ($@) {
  	Carp::croak($@) if $opt{raise_error};
  	return undef;
      }
  
      return $opt{ref} ? $content_ref : $$content_ref;
  }
  
  
  sub decodable
  {
      # should match the Content-Encoding values that decoded_content can deal with
      my $self = shift;
      my @enc;
      # XXX preferably we should determine if the modules are available without loading
      # them here
      eval {
          require IO::Uncompress::Gunzip;
          push(@enc, "gzip", "x-gzip");
      };
      eval {
          require IO::Uncompress::Inflate;
          require IO::Uncompress::RawInflate;
          push(@enc, "deflate");
      };
      eval {
          require IO::Uncompress::Bunzip2;
          push(@enc, "x-bzip2", "bzip2");
      };
      # we don't care about announcing the 'identity', 'base64' and
      # 'quoted-printable' stuff
      return wantarray ? @enc : join(", ", @enc);
  }
  
  
  sub decode
  {
      my $self = shift;
      return 1 unless $self->header("Content-Encoding");
      if (defined(my $content = $self->decoded_content(charset => "none"))) {
  	$self->remove_header("Content-Encoding", "Content-Length", "Content-MD5");
  	$self->content($content);
  	return 1;
      }
      return 0;
  }
  
  
  sub encode
  {
      my($self, @enc) = @_;
  
      Carp::croak("Can't encode multipart/* messages") if $self->content_type =~ m,^multipart/,;
      Carp::croak("Can't encode message/* messages") if $self->content_type =~ m,^message/,;
  
      return 1 unless @enc;  # nothing to do
  
      my $content = $self->content;
      for my $encoding (@enc) {
  	if ($encoding eq "identity" || $encoding eq "none") {
  	    # nothing to do
  	}
  	elsif ($encoding eq "base64") {
  	    require MIME::Base64;
  	    $content = MIME::Base64::encode($content);
  	}
  	elsif ($encoding eq "gzip" || $encoding eq "x-gzip") {
  	    require IO::Compress::Gzip;
  	    my $output;
  	    IO::Compress::Gzip::gzip(\$content, \$output, Minimal => 1)
  		or die "Can't gzip content: $IO::Compress::Gzip::GzipError";
  	    $content = $output;
  	}
  	elsif ($encoding eq "deflate") {
  	    require IO::Compress::Deflate;
  	    my $output;
  	    IO::Compress::Deflate::deflate(\$content, \$output)
  		or die "Can't deflate content: $IO::Compress::Deflate::DeflateError";
  	    $content = $output;
  	}
  	elsif ($encoding eq "x-bzip2" || $encoding eq "bzip2") {
  	    require IO::Compress::Bzip2;
  	    my $output;
  	    IO::Compress::Bzip2::bzip2(\$content, \$output)
  		or die "Can't bzip2 content: $IO::Compress::Bzip2::Bzip2Error";
  	    $content = $output;
  	}
  	elsif ($encoding eq "rot13") {  # for the fun of it
  	    $content =~ tr/A-Za-z/N-ZA-Mn-za-m/;
  	}
  	else {
  	    return 0;
  	}
      }
      my $h = $self->header("Content-Encoding");
      unshift(@enc, $h) if $h;
      $self->header("Content-Encoding", join(", ", @enc));
      $self->remove_header("Content-Length", "Content-MD5");
      $self->content($content);
      return 1;
  }
  
  
  sub as_string
  {
      my($self, $eol) = @_;
      $eol = "\n" unless defined $eol;
  
      # The calculation of content might update the headers
      # so we need to do that first.
      my $content = $self->content;
  
      return join("", $self->{'_headers'}->as_string($eol),
  		    $eol,
  		    $content,
  		    (@_ == 1 && length($content) &&
  		     $content !~ /\n\z/) ? "\n" : "",
  		);
  }
  
  
  sub dump
  {
      my($self, %opt) = @_;
      my $content = $self->content;
      my $chopped = 0;
      if (!ref($content)) {
  	my $maxlen = $opt{maxlength};
  	$maxlen = 512 unless defined($maxlen);
  	if ($maxlen && length($content) > $maxlen * 1.1 + 3) {
  	    $chopped = length($content) - $maxlen;
  	    $content = substr($content, 0, $maxlen) . "...";
  	}
  
  	$content =~ s/\\/\\\\/g;
  	$content =~ s/\t/\\t/g;
  	$content =~ s/\r/\\r/g;
  
  	# no need for 3 digits in escape for these
  	$content =~ s/([\0-\11\13-\037])(?!\d)/sprintf('\\%o',ord($1))/eg;
  
  	$content =~ s/([\0-\11\13-\037\177-\377])/sprintf('\\x%02X',ord($1))/eg;
  	$content =~ s/([^\12\040-\176])/sprintf('\\x{%X}',ord($1))/eg;
  
  	# remaining whitespace
  	$content =~ s/( +)\n/("\\40" x length($1)) . "\n"/eg;
  	$content =~ s/(\n+)\n/("\\n" x length($1)) . "\n"/eg;
  	$content =~ s/\n\z/\\n/;
  
  	my $no_content = $opt{no_content};
  	$no_content = "(no content)" unless defined $no_content;
  	if ($content eq $no_content) {
  	    # escape our $no_content marker
  	    $content =~ s/^(.)/sprintf('\\x%02X',ord($1))/eg;
  	}
  	elsif ($content eq "") {
  	    $content = $no_content;
  	}
      }
  
      my @dump;
      push(@dump, $opt{preheader}) if $opt{preheader};
      push(@dump, $self->{_headers}->as_string, $content);
      push(@dump, "(+ $chopped more bytes not shown)") if $chopped;
  
      my $dump = join("\n", @dump, "");
      $dump =~ s/^/$opt{prefix}/gm if $opt{prefix};
  
      print $dump unless defined wantarray;
      return $dump;
  }
  
  # allow subclasses to override what will handle individual parts
  sub _part_class {
      return __PACKAGE__;
  }
  
  sub parts {
      my $self = shift;
      if (defined(wantarray) && (!exists $self->{_parts} || ref($self->{_content}) eq "SCALAR")) {
  	$self->_parts;
      }
      my $old = $self->{_parts};
      if (@_) {
  	my @parts = map { ref($_) eq 'ARRAY' ? @$_ : $_ } @_;
  	my $ct = $self->content_type || "";
  	if ($ct =~ m,^message/,) {
  	    Carp::croak("Only one part allowed for $ct content")
  		if @parts > 1;
  	}
  	elsif ($ct !~ m,^multipart/,) {
  	    $self->remove_content_headers;
  	    $self->content_type("multipart/mixed");
  	}
  	$self->{_parts} = \@parts;
  	_stale_content($self);
      }
      return @$old if wantarray;
      return $old->[0];
  }
  
  sub add_part {
      my $self = shift;
      if (($self->content_type || "") !~ m,^multipart/,) {
  	my $p = $self->_part_class->new(
  	    $self->remove_content_headers,
  	    $self->content(""),
  	);
  	$self->content_type("multipart/mixed");
  	$self->{_parts} = [];
          if ($p->headers->header_field_names || $p->content ne "") {
              push(@{$self->{_parts}}, $p);
          }
      }
      elsif (!exists $self->{_parts} || ref($self->{_content}) eq "SCALAR") {
  	$self->_parts;
      }
  
      push(@{$self->{_parts}}, @_);
      _stale_content($self);
      return;
  }
  
  sub _stale_content {
      my $self = shift;
      if (ref($self->{_content}) eq "SCALAR") {
  	# must recalculate now
  	$self->_content;
      }
      else {
  	# just invalidate cache
  	delete $self->{_content};
  	delete $self->{_content_ref};
      }
  }
  
  
  # delegate all other method calls to the headers object.
  our $AUTOLOAD;
  sub AUTOLOAD
  {
      my $method = substr($AUTOLOAD, rindex($AUTOLOAD, '::')+2);
  
      # We create the function here so that it will not need to be
      # autoloaded the next time.
      no strict 'refs';
      *$method = sub { local $Carp::Internal{+__PACKAGE__} = 1; shift->headers->$method(@_) };
      goto &$method;
  }
  
  
  sub DESTROY {}  # avoid AUTOLOADing it
  
  
  # Private method to access members in %$self
  sub _elem
  {
      my $self = shift;
      my $elem = shift;
      my $old = $self->{$elem};
      $self->{$elem} = $_[0] if @_;
      return $old;
  }
  
  
  # Create private _parts attribute from current _content
  sub _parts {
      my $self = shift;
      my $ct = $self->content_type;
      if ($ct =~ m,^multipart/,) {
  	require HTTP::Headers::Util;
  	my @h = HTTP::Headers::Util::split_header_words($self->header("Content-Type"));
  	die "Assert" unless @h;
  	my %h = @{$h[0]};
  	if (defined(my $b = $h{boundary})) {
  	    my $str = $self->content;
  	    $str =~ s/\r?\n--\Q$b\E--.*//s;
  	    if ($str =~ s/(^|.*?\r?\n)--\Q$b\E\r?\n//s) {
  		$self->{_parts} = [map $self->_part_class->parse($_),
  				   split(/\r?\n--\Q$b\E\r?\n/, $str)]
  	    }
  	}
      }
      elsif ($ct eq "message/http") {
  	require HTTP::Request;
  	require HTTP::Response;
  	my $content = $self->content;
  	my $class = ($content =~ m,^(HTTP/.*)\n,) ?
  	    "HTTP::Response" : "HTTP::Request";
  	$self->{_parts} = [$class->parse($content)];
      }
      elsif ($ct =~ m,^message/,) {
  	$self->{_parts} = [ $self->_part_class->parse($self->content) ];
      }
  
      $self->{_parts} ||= [];
  }
  
  
  # Create private _content attribute from current _parts
  sub _content {
      my $self = shift;
      my $ct = $self->{_headers}->header("Content-Type") || "multipart/mixed";
      if ($ct =~ m,^\s*message/,i) {
  	_set_content($self, $self->{_parts}[0]->as_string($CRLF), 1);
  	return;
      }
  
      require HTTP::Headers::Util;
      my @v = HTTP::Headers::Util::split_header_words($ct);
      Carp::carp("Multiple Content-Type headers") if @v > 1;
      @v = @{$v[0]};
  
      my $boundary;
      my $boundary_index;
      for (my @tmp = @v; @tmp;) {
  	my($k, $v) = splice(@tmp, 0, 2);
  	if ($k eq "boundary") {
  	    $boundary = $v;
  	    $boundary_index = @v - @tmp - 1;
  	    last;
  	}
      }
  
      my @parts = map $_->as_string($CRLF), @{$self->{_parts}};
  
      my $bno = 0;
      $boundary = _boundary() unless defined $boundary;
   CHECK_BOUNDARY:
      {
  	for (@parts) {
  	    if (index($_, $boundary) >= 0) {
  		# must have a better boundary
  		$boundary = _boundary(++$bno);
  		redo CHECK_BOUNDARY;
  	    }
  	}
      }
  
      if ($boundary_index) {
  	$v[$boundary_index] = $boundary;
      }
      else {
  	push(@v, boundary => $boundary);
      }
  
      $ct = HTTP::Headers::Util::join_header_words(@v);
      $self->{_headers}->header("Content-Type", $ct);
  
      _set_content($self, "--$boundary$CRLF" .
  	                join("$CRLF--$boundary$CRLF", @parts) .
  			"$CRLF--$boundary--$CRLF",
                          1);
  }
  
  
  sub _boundary
  {
      my $size = shift || return "xYzZY";
      require MIME::Base64;
      my $b = MIME::Base64::encode(join("", map chr(rand(256)), 1..$size*3), "");
      $b =~ s/[\W]/X/g;  # ensure alnum only
      $b;
  }
  
  
  1;
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  HTTP::Message - HTTP style message (base class)
  
  =head1 VERSION
  
  version 6.18
  
  =head1 SYNOPSIS
  
   use base 'HTTP::Message';
  
  =head1 DESCRIPTION
  
  An C<HTTP::Message> object contains some headers and a content body.
  The following methods are available:
  
  =over 4
  
  =item $mess = HTTP::Message->new
  
  =item $mess = HTTP::Message->new( $headers )
  
  =item $mess = HTTP::Message->new( $headers, $content )
  
  This constructs a new message object.  Normally you would want
  construct C<HTTP::Request> or C<HTTP::Response> objects instead.
  
  The optional $header argument should be a reference to an
  C<HTTP::Headers> object or a plain array reference of key/value pairs.
  If an C<HTTP::Headers> object is provided then a copy of it will be
  embedded into the constructed message, i.e. it will not be owned and
  can be modified afterwards without affecting the message.
  
  The optional $content argument should be a string of bytes.
  
  =item $mess = HTTP::Message->parse( $str )
  
  This constructs a new message object by parsing the given string.
  
  =item $mess->headers
  
  Returns the embedded C<HTTP::Headers> object.
  
  =item $mess->headers_as_string
  
  =item $mess->headers_as_string( $eol )
  
  Call the as_string() method for the headers in the
  message.  This will be the same as
  
      $mess->headers->as_string
  
  but it will make your program a whole character shorter :-)
  
  =item $mess->content
  
  =item $mess->content( $bytes )
  
  The content() method sets the raw content if an argument is given.  If no
  argument is given the content is not touched.  In either case the
  original raw content is returned.
  
  If the C<undef> argument is given, the content is reset to its default value,
  which is an empty string.
  
  Note that the content should be a string of bytes.  Strings in perl
  can contain characters outside the range of a byte.  The C<Encode>
  module can be used to turn such strings into a string of bytes.
  
  =item $mess->add_content( $bytes )
  
  The add_content() methods appends more data bytes to the end of the
  current content buffer.
  
  =item $mess->add_content_utf8( $string )
  
  The add_content_utf8() method appends the UTF-8 bytes representing the
  string to the end of the current content buffer.
  
  =item $mess->content_ref
  
  =item $mess->content_ref( \$bytes )
  
  The content_ref() method will return a reference to content buffer string.
  It can be more efficient to access the content this way if the content
  is huge, and it can even be used for direct manipulation of the content,
  for instance:
  
    ${$res->content_ref} =~ s/\bfoo\b/bar/g;
  
  This example would modify the content buffer in-place.
  
  If an argument is passed it will setup the content to reference some
  external source.  The content() and add_content() methods
  will automatically dereference scalar references passed this way.  For
  other references content() will return the reference itself and
  add_content() will refuse to do anything.
  
  =item $mess->content_charset
  
  This returns the charset used by the content in the message.  The
  charset is either found as the charset attribute of the
  C<Content-Type> header or by guessing.
  
  See L<http://www.w3.org/TR/REC-html40/charset.html#spec-char-encoding>
  for details about how charset is determined.
  
  =item $mess->decoded_content( %options )
  
  Returns the content with any C<Content-Encoding> undone and for textual content
  the raw content encoded to Perl's Unicode strings.  If the C<Content-Encoding>
  or C<charset> of the message is unknown this method will fail by returning
  C<undef>.
  
  The following options can be specified.
  
  =over
  
  =item C<charset>
  
  This override the charset parameter for text content.  The value
  C<none> can used to suppress decoding of the charset.
  
  =item C<default_charset>
  
  This override the default charset guessed by content_charset() or
  if that fails "ISO-8859-1".
  
  =item C<alt_charset>
  
  If decoding fails because the charset specified in the Content-Type header
  isn't recognized by Perl's Encode module, then try decoding using this charset
  instead of failing.  The C<alt_charset> might be specified as C<none> to simply
  return the string without any decoding of charset as alternative.
  
  =item C<charset_strict>
  
  Abort decoding if malformed characters is found in the content.  By
  default you get the substitution character ("\x{FFFD}") in place of
  malformed characters.
  
  =item C<raise_error>
  
  If TRUE then raise an exception if not able to decode content.  Reason
  might be that the specified C<Content-Encoding> or C<charset> is not
  supported.  If this option is FALSE, then decoded_content() will return
  C<undef> on errors, but will still set $@.
  
  =item C<ref>
  
  If TRUE then a reference to decoded content is returned.  This might
  be more efficient in cases where the decoded content is identical to
  the raw content as no data copying is required in this case.
  
  =back
  
  =item $mess->decodable
  
  =item HTTP::Message::decodable()
  
  This returns the encoding identifiers that decoded_content() can
  process.  In scalar context returns a comma separated string of
  identifiers.
  
  This value is suitable for initializing the C<Accept-Encoding> request
  header field.
  
  =item $mess->decode
  
  This method tries to replace the content of the message with the
  decoded version and removes the C<Content-Encoding> header.  Returns
  TRUE if successful and FALSE if not.
  
  If the message does not have a C<Content-Encoding> header this method
  does nothing and returns TRUE.
  
  Note that the content of the message is still bytes after this method
  has been called and you still need to call decoded_content() if you
  want to process its content as a string.
  
  =item $mess->encode( $encoding, ... )
  
  Apply the given encodings to the content of the message.  Returns TRUE
  if successful. The "identity" (non-)encoding is always supported; other
  currently supported encodings, subject to availability of required
  additional modules, are "gzip", "deflate", "x-bzip2" and "base64".
  
  A successful call to this function will set the C<Content-Encoding>
  header.
  
  Note that C<multipart/*> or C<message/*> messages can't be encoded and
  this method will croak if you try.
  
  =item $mess->parts
  
  =item $mess->parts( @parts )
  
  =item $mess->parts( \@parts )
  
  Messages can be composite, i.e. contain other messages.  The composite
  messages have a content type of C<multipart/*> or C<message/*>.  This
  method give access to the contained messages.
  
  The argumentless form will return a list of C<HTTP::Message> objects.
  If the content type of $msg is not C<multipart/*> or C<message/*> then
  this will return the empty list.  In scalar context only the first
  object is returned.  The returned message parts should be regarded as
  read-only (future versions of this library might make it possible
  to modify the parent by modifying the parts).
  
  If the content type of $msg is C<message/*> then there will only be
  one part returned.
  
  If the content type is C<message/http>, then the return value will be
  either an C<HTTP::Request> or an C<HTTP::Response> object.
  
  If a @parts argument is given, then the content of the message will be
  modified. The array reference form is provided so that an empty list
  can be provided.  The @parts array should contain C<HTTP::Message>
  objects.  The @parts objects are owned by $mess after this call and
  should not be modified or made part of other messages.
  
  When updating the message with this method and the old content type of
  $mess is not C<multipart/*> or C<message/*>, then the content type is
  set to C<multipart/mixed> and all other content headers are cleared.
  
  This method will croak if the content type is C<message/*> and more
  than one part is provided.
  
  =item $mess->add_part( $part )
  
  This will add a part to a message.  The $part argument should be
  another C<HTTP::Message> object.  If the previous content type of
  $mess is not C<multipart/*> then the old content (together with all
  content headers) will be made part #1 and the content type made
  C<multipart/mixed> before the new part is added.  The $part object is
  owned by $mess after this call and should not be modified or made part
  of other messages.
  
  There is no return value.
  
  =item $mess->clear
  
  Will clear the headers and set the content to the empty string.  There
  is no return value
  
  =item $mess->protocol
  
  =item $mess->protocol( $proto )
  
  Sets the HTTP protocol used for the message.  The protocol() is a string
  like C<HTTP/1.0> or C<HTTP/1.1>.
  
  =item $mess->clone
  
  Returns a copy of the message object.
  
  =item $mess->as_string
  
  =item $mess->as_string( $eol )
  
  Returns the message formatted as a single string.
  
  The optional $eol parameter specifies the line ending sequence to use.
  The default is "\n".  If no $eol is given then as_string will ensure
  that the returned string is newline terminated (even when the message
  content is not).  No extra newline is appended if an explicit $eol is
  passed.
  
  =item $mess->dump( %opt )
  
  Returns the message formatted as a string.  In void context print the string.
  
  This differs from C<< $mess->as_string >> in that it escapes the bytes
  of the content so that it's safe to print them and it limits how much
  content to print.  The escapes syntax used is the same as for Perl's
  double quoted strings.  If there is no content the string "(no
  content)" is shown in its place.
  
  Options to influence the output can be passed as key/value pairs. The
  following options are recognized:
  
  =over
  
  =item maxlength => $num
  
  How much of the content to show.  The default is 512.  Set this to 0
  for unlimited.
  
  If the content is longer then the string is chopped at the limit and
  the string "...\n(### more bytes not shown)" appended.
  
  =item no_content => $str
  
  Replaces the "(no content)" marker.
  
  =item prefix => $str
  
  A string that will be prefixed to each line of the dump.
  
  =back
  
  =back
  
  All methods unknown to C<HTTP::Message> itself are delegated to the
  C<HTTP::Headers> object that is part of every message.  This allows
  convenient access to these methods.  Refer to L<HTTP::Headers> for
  details of these methods:
  
      $mess->header( $field => $val )
      $mess->push_header( $field => $val )
      $mess->init_header( $field => $val )
      $mess->remove_header( $field )
      $mess->remove_content_headers
      $mess->header_field_names
      $mess->scan( \&doit )
  
      $mess->date
      $mess->expires
      $mess->if_modified_since
      $mess->if_unmodified_since
      $mess->last_modified
      $mess->content_type
      $mess->content_encoding
      $mess->content_length
      $mess->content_language
      $mess->title
      $mess->user_agent
      $mess->server
      $mess->from
      $mess->referer
      $mess->www_authenticate
      $mess->authorization
      $mess->proxy_authorization
      $mess->authorization_basic
      $mess->proxy_authorization_basic
  
  =head1 AUTHOR
  
  Gisle Aas <gisle@activestate.com>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 1994-2017 by Gisle Aas.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
  
  __END__
  
  
  #ABSTRACT: HTTP style message (base class)
  
HTTP_MESSAGE

    $main::fatpacked{"HTTP/Negotiate.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'HTTP_NEGOTIATE';
  package HTTP::Negotiate;
  
  $VERSION = "6.01";
  sub Version { $VERSION; }
  
  require Exporter;
  @ISA = qw(Exporter);
  @EXPORT = qw(choose);
  
  require HTTP::Headers;
  
  $DEBUG = 0;
  
  sub choose ($;$)
  {
      my($variants, $request) = @_;
      my(%accept);
  
      unless (defined $request) {
  	# Create a request object from the CGI environment variables
  	$request = HTTP::Headers->new;
  	$request->header('Accept', $ENV{HTTP_ACCEPT})
  	  if $ENV{HTTP_ACCEPT};
  	$request->header('Accept-Charset', $ENV{HTTP_ACCEPT_CHARSET})
  	  if $ENV{HTTP_ACCEPT_CHARSET};
  	$request->header('Accept-Encoding', $ENV{HTTP_ACCEPT_ENCODING})
  	  if $ENV{HTTP_ACCEPT_ENCODING};
  	$request->header('Accept-Language', $ENV{HTTP_ACCEPT_LANGUAGE})
  	  if $ENV{HTTP_ACCEPT_LANGUAGE};
      }
  
      # Get all Accept values from the request.  Build a hash initialized
      # like this:
      #
      #   %accept = ( type =>     { 'audio/*'     => { q => 0.2, mbx => 20000 },
      #                             'audio/basic' => { q => 1 },
      #                           },
      #               language => { 'no'          => { q => 1 },
      #                           }
      #             );
  
      $request->scan(sub {
  	my($key, $val) = @_;
  
  	my $type;
  	if ($key =~ s/^Accept-//) {
  	    $type = lc($key);
  	}
  	elsif ($key eq "Accept") {
  	    $type = "type";
  	}
  	else {
  	    return;
  	}
  
  	$val =~ s/\s+//g;
  	my $default_q = 1;
  	for my $name (split(/,/, $val)) {
  	    my(%param, $param);
  	    if ($name =~ s/;(.*)//) {
  		for $param (split(/;/, $1)) {
  		    my ($pk, $pv) = split(/=/, $param, 2);
  		    $param{lc $pk} = $pv;
  		}
  	    }
  	    $name = lc $name;
  	    if (defined $param{'q'}) {
  		$param{'q'} = 1 if $param{'q'} > 1;
  		$param{'q'} = 0 if $param{'q'} < 0;
  	    }
  	    else {
  		$param{'q'} = $default_q;
  
  		# This makes sure that the first ones are slightly better off
  		# and therefore more likely to be chosen.
  		$default_q -= 0.0001;
  	    }
  	    $accept{$type}{$name} = \%param;
  	}
      });
  
      # Check if any of the variants specify a language.  We do this
      # because it influences how we treat those without (they default to
      # 0.5 instead of 1).
      my $any_lang = 0;
      for $var (@$variants) {
  	if ($var->[5]) {
  	    $any_lang = 1;
  	    last;
  	}
      }
  
      if ($DEBUG) {
  	print "Negotiation parameters in the request\n";
  	for $type (keys %accept) {
  	    print " $type:\n";
  	    for $name (keys %{$accept{$type}}) {
  		print "    $name\n";
  		for $pv (keys %{$accept{$type}{$name}}) {
  		    print "      $pv = $accept{$type}{$name}{$pv}\n";
  		}
  	    }
  	}
      }
  
      my @Q = ();  # This is where we collect the results of the
  		 # quality calculations
  
      # Calculate quality for all the variants that are available.
      for (@$variants) {
  	my($id, $qs, $ct, $enc, $cs, $lang, $bs) = @$_;
  	$qs = 1 unless defined $qs;
          $ct = '' unless defined $ct;
  	$bs = 0 unless defined $bs;
  	$lang = lc($lang) if $lang; # lg tags are always case-insensitive
  	if ($DEBUG) {
  	    print "\nEvaluating $id (ct='$ct')\n";
  	    printf "  qs   = %.3f\n", $qs;
  	    print  "  enc  = $enc\n"  if $enc && !ref($enc);
  	    print  "  enc  = @$enc\n" if $enc && ref($enc);
  	    print  "  cs   = $cs\n"   if $cs;
  	    print  "  lang = $lang\n" if $lang;
  	    print  "  bs   = $bs\n"   if $bs;
  	}
  
  	# Calculate encoding quality
  	my $qe = 1;
  	# If the variant has no assigned Content-Encoding, or if no
  	# Accept-Encoding field is present, then the value assigned
  	# is "qe=1".  If *all* of the variant's content encodings
  	# are listed in the Accept-Encoding field, then the value
  	# assigned is "qw=1".  If *any* of the variant's content
  	# encodings are not listed in the provided Accept-Encoding
  	# field, then the value assigned is "qe=0"
  	if (exists $accept{'encoding'} && $enc) {
  	    my @enc = ref($enc) ? @$enc : ($enc);
  	    for (@enc) {
  		print "Is encoding $_ accepted? " if $DEBUG;
  		unless(exists $accept{'encoding'}{$_}) {
  		    print "no\n" if $DEBUG;
  		    $qe = 0;
  		    last;
  		}
  		else {
  		    print "yes\n" if $DEBUG;
  		}
  	    }
  	}
  
  	# Calculate charset quality
  	my $qc  = 1;
  	# If the variant's media-type has no charset parameter,
  	# or the variant's charset is US-ASCII, or if no Accept-Charset
  	# field is present, then the value assigned is "qc=1".  If the
  	# variant's charset is listed in the Accept-Charset field,
  	# then the value assigned is "qc=1.  Otherwise, if the variant's
  	# charset is not listed in the provided Accept-Encoding field,
  	# then the value assigned is "qc=0".
  	if (exists $accept{'charset'} && $cs && $cs ne 'us-ascii' ) {
  	    $qc = 0 unless $accept{'charset'}{$cs};
  	}
  
  	# Calculate language quality
  	my $ql  = 1;
  	if ($lang && exists $accept{'language'}) {
  	    my @lang = ref($lang) ? @$lang : ($lang);
  	    # If any of the variant's content languages are listed
  	    # in the Accept-Language field, the the value assigned is
  	    # the largest of the "q" parameter values for those language
  	    # tags.
  	    my $q = undef;
  	    for (@lang) {
  		next unless exists $accept{'language'}{$_};
  		my $this_q = $accept{'language'}{$_}{'q'};
  		$q = $this_q unless defined $q;
  		$q = $this_q if $this_q > $q;
  	    }
  	    if(defined $q) {
  	        $DEBUG and print " -- Exact language match at q=$q\n";
  	    }
  	    else {
  		# If there was no exact match and at least one of
  		# the Accept-Language field values is a complete
  		# subtag prefix of the content language tag(s), then
  		# the "q" parameter value of the largest matching
  		# prefix is used.
  		$DEBUG and print " -- No exact language match\n";
  		my $selected = undef;
  		for $al (keys %{ $accept{'language'} }) {
  		    if (index($al, "$lang-") == 0) {
  		        # $lang starting with $al isn't enough, or else
  		        #  Accept-Language: hu (Hungarian) would seem
  		        #  to accept a document in hup (Hupa)
  		        $DEBUG and print " -- $al ISA $lang\n";
  			$selected = $al unless defined $selected;
  			$selected = $al if length($al) > length($selected);
  		    }
  		    else {
  		        $DEBUG and print " -- $lang  isn't a $al\n";
  		    }
  		}
  		$q = $accept{'language'}{$selected}{'q'} if $selected;
  
  		# If none of the variant's content language tags or
  		# tag prefixes are listed in the provided
  		# Accept-Language field, then the value assigned
  		# is "ql=0.001"
  		$q = 0.001 unless defined $q;
  	    }
  	    $ql = $q;
  	}
  	else {
  	    $ql = 0.5 if $any_lang && exists $accept{'language'};
  	}
  
  	my $q   = 1;
  	my $mbx = undef;
  	# If no Accept field is given, then the value assigned is "q=1".
  	# If at least one listed media range matches the variant's media
  	# type, then the "q" parameter value assigned to the most specific
  	# of those matched is used (e.g. "text/html;version=3.0" is more
  	# specific than "text/html", which is more specific than "text/*",
  	# which in turn is more specific than "*/*"). If not media range
  	# in the provided Accept field matches the variant's media type,
  	# then the value assigned is "q=0".
  	if (exists $accept{'type'} && $ct) {
  	    # First we clean up our content-type
  	    $ct =~ s/\s+//g;
  	    my $params = "";
  	    $params = $1 if $ct =~ s/;(.*)//;
  	    my($type, $subtype) = split("/", $ct, 2);
  	    my %param = ();
  	    for $param (split(/;/, $params)) {
  		my($pk,$pv) = split(/=/, $param, 2);
  		$param{$pk} = $pv;
  	    }
  
  	    my $sel_q = undef;
  	    my $sel_mbx = undef;
  	    my $sel_specificness = 0;
  
  	    ACCEPT_TYPE:
  	    for $at (keys %{ $accept{'type'} }) {
  		print "Consider $at...\n" if $DEBUG;
  		my($at_type, $at_subtype) = split("/", $at, 2);
  		# Is it a match on the type
  		next if $at_type    ne '*' && $at_type    ne $type;
  		next if $at_subtype ne '*' && $at_subtype ne $subtype;
  		my $specificness = 0;
  		$specificness++ if $at_type ne '*';
  		$specificness++ if $at_subtype ne '*';
  		# Let's see if content-type parameters also match
  		while (($pk, $pv) = each %param) {
  		    print "Check if $pk = $pv is true\n" if $DEBUG;
  		    next unless exists $accept{'type'}{$at}{$pk};
  		    next ACCEPT_TYPE
  		      unless $accept{'type'}{$at}{$pk} eq $pv;
  		    print "yes it is!!\n" if $DEBUG;
  		    $specificness++;
  		}
  		print "Hurray, type match with specificness = $specificness\n"
  		  if $DEBUG;
  
  		if (!defined($sel_q) || $sel_specificness < $specificness) {
  		    $sel_q   = $accept{'type'}{$at}{'q'};
  		    $sel_mbx = $accept{'type'}{$at}{'mbx'};
  		    $sel_specificness = $specificness;
  		}
  	    }
  	    $q   = $sel_q || 0;
  	    $mbx = $sel_mbx;
  	}
  
  	my $Q;
  	if (!defined($mbx) || $mbx >= $bs) {
  	    $Q = $qs * $qe * $qc * $ql * $q;
  	}
  	else {
  	    $Q = 0;
  	    print "Variant's size is too large ==> Q=0\n" if $DEBUG;
  	}
  
  	if ($DEBUG) {
  	    $mbx = "undef" unless defined $mbx;
  	    printf "Q=%.4f", $Q;
  	    print "  (q=$q, mbx=$mbx, qe=$qe, qc=$qc, ql=$ql, qs=$qs)\n";
  	}
  
  	push(@Q, [$id, $Q, $bs]);
      }
  
  
      @Q = sort { $b->[1] <=> $a->[1] || $a->[2] <=> $b->[2] } @Q;
  
      return @Q if wantarray;
      return undef unless @Q;
      return undef if $Q[0][1] == 0;
      $Q[0][0];
  }
  
  1;
  
  __END__
  
  
  =head1 NAME
  
  HTTP::Negotiate - choose a variant to serve
  
  =head1 SYNOPSIS
  
   use HTTP::Negotiate qw(choose);
  
   #  ID       QS     Content-Type   Encoding Char-Set        Lang   Size
   $variants =
    [['var1',  1.000, 'text/html',   undef,   'iso-8859-1',   'en',   3000],
     ['var2',  0.950, 'text/plain',  'gzip',  'us-ascii',     'no',    400],
     ['var3',  0.3,   'image/gif',   undef,   undef,          undef, 43555],
    ];
  
   @preferred = choose($variants, $request_headers);
   $the_one   = choose($variants);
  
  =head1 DESCRIPTION
  
  This module provides a complete implementation of the HTTP content
  negotiation algorithm specified in F<draft-ietf-http-v11-spec-00.ps>
  chapter 12.  Content negotiation allows for the selection of a
  preferred content representation based upon attributes of the
  negotiable variants and the value of the various Accept* header fields
  in the request.
  
  The variants are ordered by preference by calling the function
  choose().
  
  The first parameter is reference to an array of the variants to
  choose among.
  Each element in this array is an array with the values [$id, $qs,
  $content_type, $content_encoding, $charset, $content_language,
  $content_length] whose meanings are described
  below. The $content_encoding and $content_language can be either a
  single scalar value or an array reference if there are several values.
  
  The second optional parameter is either a HTTP::Headers or a HTTP::Request
  object which is searched for "Accept*" headers.  If this
  parameter is missing, then the accept specification is initialized
  from the CGI environment variables HTTP_ACCEPT, HTTP_ACCEPT_CHARSET,
  HTTP_ACCEPT_ENCODING and HTTP_ACCEPT_LANGUAGE.
  
  In an array context, choose() returns a list of [variant
  identifier, calculated quality, size] tuples.  The values are sorted by
  quality, highest quality first.  If the calculated quality is the same
  for two variants, then they are sorted by size (smallest first). I<E.g.>:
  
    (['var1', 1, 2000], ['var2', 0.3, 512], ['var3', 0.3, 1024]);
  
  Note that also zero quality variants are included in the return list
  even if these should never be served to the client.
  
  In a scalar context, it returns the identifier of the variant with the
  highest score or C<undef> if none have non-zero quality.
  
  If the $HTTP::Negotiate::DEBUG variable is set to TRUE, then a lot of
  noise is generated on STDOUT during evaluation of choose().
  
  =head1 VARIANTS
  
  A variant is described by a list of the following values.  If the
  attribute does not make sense or is unknown for a variant, then use
  C<undef> instead.
  
  =over 3
  
  =item identifier
  
  This is a string that you use as the name for the variant.  This
  identifier for the preferred variants returned by choose().
  
  =item qs
  
  This is a number between 0.000 and 1.000 that describes the "source
  quality".  This is what F<draft-ietf-http-v11-spec-00.ps> says about this
  value:
  
  Source quality is measured by the content provider as representing the
  amount of degradation from the original source.  For example, a
  picture in JPEG form would have a lower qs when translated to the XBM
  format, and much lower qs when translated to an ASCII-art
  representation.  Note, however, that this is a function of the source
  - an original piece of ASCII-art may degrade in quality if it is
  captured in JPEG form.  The qs values should be assigned to each
  variant by the content provider; if no qs value has been assigned, the
  default is generally "qs=1".
  
  =item content-type
  
  This is the media type of the variant.  The media type does not
  include a charset attribute, but might contain other parameters.
  Examples are:
  
    text/html
    text/html;version=2.0
    text/plain
    image/gif
    image/jpg
  
  =item content-encoding
  
  This is one or more content encodings that has been applied to the
  variant.  The content encoding is generally used as a modifier to the
  content media type.  The most common content encodings are:
  
    gzip
    compress
  
  =item content-charset
  
  This is the character set used when the variant contains text.
  The charset value should generally be C<undef> or one of these:
  
    us-ascii
    iso-8859-1 ... iso-8859-9
    iso-2022-jp
    iso-2022-jp-2
    iso-2022-kr
    unicode-1-1
    unicode-1-1-utf-7
    unicode-1-1-utf-8
  
  =item content-language
  
  This describes one or more languages that are used in the variant.
  Language is described like this in F<draft-ietf-http-v11-spec-00.ps>: A
  language is in this context a natural language spoken, written, or
  otherwise conveyed by human beings for communication of information to
  other human beings.  Computer languages are explicitly excluded.
  
  The language tags are defined by RFC 3066.  Examples
  are:
  
    no               Norwegian
    en               International English
    en-US            US English
    en-cockney
  
  =item content-length
  
  This is the number of bytes used to represent the content.
  
  =back
  
  =head1 ACCEPT HEADERS
  
  The following Accept* headers can be used for describing content
  preferences in a request (This description is an edited extract from
  F<draft-ietf-http-v11-spec-00.ps>):
  
  =over 3
  
  =item Accept
  
  This header can be used to indicate a list of media ranges which are
  acceptable as a response to the request.  The "*" character is used to
  group media types into ranges, with "*/*" indicating all media types
  and "type/*" indicating all subtypes of that type.
  
  The parameter q is used to indicate the quality factor, which
  represents the user's preference for that range of media types.  The
  parameter mbx gives the maximum acceptable size of the response
  content. The default values are: q=1 and mbx=infinity. If no Accept
  header is present, then the client accepts all media types with q=1.
  
  For example:
  
    Accept: audio/*;q=0.2;mbx=200000, audio/basic
  
  would mean: "I prefer audio/basic (of any size), but send me any audio
  type if it is the best available after an 80% mark-down in quality and
  its size is less than 200000 bytes"
  
  
  =item Accept-Charset
  
  Used to indicate what character sets are acceptable for the response.
  The "us-ascii" character set is assumed to be acceptable for all user
  agents.  If no Accept-Charset field is given, the default is that any
  charset is acceptable.  Example:
  
    Accept-Charset: iso-8859-1, unicode-1-1
  
  
  =item Accept-Encoding
  
  Restricts the Content-Encoding values which are acceptable in the
  response.  If no Accept-Encoding field is present, the server may
  assume that the client will accept any content encoding.  An empty
  Accept-Encoding means that no content encoding is acceptable.  Example:
  
    Accept-Encoding: compress, gzip
  
  
  =item Accept-Language
  
  This field is similar to Accept, but restricts the set of natural
  languages that are preferred in a response.  Each language may be
  given an associated quality value which represents an estimate of the
  user's comprehension of that language.  For example:
  
    Accept-Language: no, en-gb;q=0.8, de;q=0.55
  
  would mean: "I prefer Norwegian, but will accept British English (with
  80% comprehension) or German (with 55% comprehension).
  
  =back
  
  
  =head1 COPYRIGHT
  
  Copyright 1996,2001 Gisle Aas.
  
  This library is free software; you can redistribute it and/or
  modify it under the same terms as Perl itself.
  
  =head1 AUTHOR
  
  Gisle Aas <gisle@aas.no>
  
  =cut
HTTP_NEGOTIATE

    $main::fatpacked{"HTTP/Request.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'HTTP_REQUEST';
  package HTTP::Request;
  
  use strict;
  use warnings;
  
  our $VERSION = '6.18';
  
  use base 'HTTP::Message';
  
  sub new
  {
      my($class, $method, $uri, $header, $content) = @_;
      my $self = $class->SUPER::new($header, $content);
      $self->method($method);
      $self->uri($uri);
      $self;
  }
  
  
  sub parse
  {
      my($class, $str) = @_;
      Carp::carp('Undefined argument to parse()') if $^W && ! defined $str;
      my $request_line;
      if (defined $str && $str =~ s/^(.*)\n//) {
  	$request_line = $1;
      }
      else {
  	$request_line = $str;
  	$str = "";
      }
  
      my $self = $class->SUPER::parse($str);
      if (defined $request_line) {
          my($method, $uri, $protocol) = split(' ', $request_line);
          $self->method($method);
          $self->uri($uri) if defined($uri);
          $self->protocol($protocol) if $protocol;
      }
      $self;
  }
  
  
  sub clone
  {
      my $self = shift;
      my $clone = bless $self->SUPER::clone, ref($self);
      $clone->method($self->method);
      $clone->uri($self->uri);
      $clone;
  }
  
  
  sub method
  {
      shift->_elem('_method', @_);
  }
  
  
  sub uri
  {
      my $self = shift;
      my $old = $self->{'_uri'};
      if (@_) {
  	my $uri = shift;
  	if (!defined $uri) {
  	    # that's ok
  	}
  	elsif (ref $uri) {
  	    Carp::croak("A URI can't be a " . ref($uri) . " reference")
  		if ref($uri) eq 'HASH' or ref($uri) eq 'ARRAY';
  	    Carp::croak("Can't use a " . ref($uri) . " object as a URI")
  		unless $uri->can('scheme') && $uri->can('canonical');
  	    $uri = $uri->clone;
  	    unless ($HTTP::URI_CLASS eq "URI") {
  		# Argh!! Hate this... old LWP legacy!
  		eval { local $SIG{__DIE__}; $uri = $uri->abs; };
  		die $@ if $@ && $@ !~ /Missing base argument/;
  	    }
  	}
  	else {
  	    $uri = $HTTP::URI_CLASS->new($uri);
  	}
  	$self->{'_uri'} = $uri;
          delete $self->{'_uri_canonical'};
      }
      $old;
  }
  
  *url = \&uri;  # legacy
  
  sub uri_canonical
  {
      my $self = shift;
      return $self->{'_uri_canonical'} ||= $self->{'_uri'}->canonical;
  }
  
  
  sub accept_decodable
  {
      my $self = shift;
      $self->header("Accept-Encoding", scalar($self->decodable));
  }
  
  sub as_string
  {
      my $self = shift;
      my($eol) = @_;
      $eol = "\n" unless defined $eol;
  
      my $req_line = $self->method || "-";
      my $uri = $self->uri;
      $uri = (defined $uri) ? $uri->as_string : "-";
      $req_line .= " $uri";
      my $proto = $self->protocol;
      $req_line .= " $proto" if $proto;
  
      return join($eol, $req_line, $self->SUPER::as_string(@_));
  }
  
  sub dump
  {
      my $self = shift;
      my @pre = ($self->method || "-", $self->uri || "-");
      if (my $prot = $self->protocol) {
  	push(@pre, $prot);
      }
  
      return $self->SUPER::dump(
          preheader => join(" ", @pre),
  	@_,
      );
  }
  
  
  1;
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  HTTP::Request - HTTP style request message
  
  =head1 VERSION
  
  version 6.18
  
  =head1 SYNOPSIS
  
   require HTTP::Request;
   $request = HTTP::Request->new(GET => 'http://www.example.com/');
  
  and usually used like this:
  
   $ua = LWP::UserAgent->new;
   $response = $ua->request($request);
  
  =head1 DESCRIPTION
  
  C<HTTP::Request> is a class encapsulating HTTP style requests,
  consisting of a request line, some headers, and a content body. Note
  that the LWP library uses HTTP style requests even for non-HTTP
  protocols.  Instances of this class are usually passed to the
  request() method of an C<LWP::UserAgent> object.
  
  C<HTTP::Request> is a subclass of C<HTTP::Message> and therefore
  inherits its methods.  The following additional methods are available:
  
  =over 4
  
  =item $r = HTTP::Request->new( $method, $uri )
  
  =item $r = HTTP::Request->new( $method, $uri, $header )
  
  =item $r = HTTP::Request->new( $method, $uri, $header, $content )
  
  Constructs a new C<HTTP::Request> object describing a request on the
  object $uri using method $method.  The $method argument must be a
  string.  The $uri argument can be either a string, or a reference to a
  C<URI> object.  The optional $header argument should be a reference to
  an C<HTTP::Headers> object or a plain array reference of key/value
  pairs.  The optional $content argument should be a string of bytes.
  
  =item $r = HTTP::Request->parse( $str )
  
  This constructs a new request object by parsing the given string.
  
  =item $r->method
  
  =item $r->method( $val )
  
  This is used to get/set the method attribute.  The method should be a
  short string like "GET", "HEAD", "PUT", "PATCH" or "POST".
  
  =item $r->uri
  
  =item $r->uri( $val )
  
  This is used to get/set the uri attribute.  The $val can be a
  reference to a URI object or a plain string.  If a string is given,
  then it should be parsable as an absolute URI.
  
  =item $r->header( $field )
  
  =item $r->header( $field => $value )
  
  This is used to get/set header values and it is inherited from
  C<HTTP::Headers> via C<HTTP::Message>.  See L<HTTP::Headers> for
  details and other similar methods that can be used to access the
  headers.
  
  =item $r->accept_decodable
  
  This will set the C<Accept-Encoding> header to the list of encodings
  that decoded_content() can decode.
  
  =item $r->content
  
  =item $r->content( $bytes )
  
  This is used to get/set the content and it is inherited from the
  C<HTTP::Message> base class.  See L<HTTP::Message> for details and
  other methods that can be used to access the content.
  
  Note that the content should be a string of bytes.  Strings in perl
  can contain characters outside the range of a byte.  The C<Encode>
  module can be used to turn such strings into a string of bytes.
  
  =item $r->as_string
  
  =item $r->as_string( $eol )
  
  Method returning a textual representation of the request.
  
  =back
  
  =head1 EXAMPLES
  
  Creating requests to be sent with L<LWP::UserAgent> or others can be easy. Here
  are a few examples.
  
  =head2 Simple POST
  
  Here, we'll create a simple POST request that could be used to send JSON data
  to an endpoint.
  
      #!/usr/bin/env perl
  
      use strict;
      use warnings;
  
      use Encode qw(encode_utf8);
      use HTTP::Request ();
      use JSON::MaybeXS qw(encode_json);
  
      my $url = 'https://www.example.com/api/user/123';
      my $header = ['Content-Type' => 'application/json; charset=UTF-8'];
      my $data = {foo => 'bar', baz => 'quux'};
      my $encoded_data = encode_utf8(encode_json($data));
  
      my $r = HTTP::Request->new('POST', $url, $header, $encoded_data);
      # at this point, we could send it via LWP::UserAgent
      # my $ua = LWP::UserAgent->new();
      # my $res = $ua->request($r);
  
  =head2 Batch POST Request
  
  Some services, like Google, allow multiple requests to be sent in one batch.
  L<https://developers.google.com/drive/v3/web/batch> for example. Using the
  C<add_part> method from L<HTTP::Message> makes this simple.
  
      #!/usr/bin/env perl
  
      use strict;
      use warnings;
  
      use Encode qw(encode_utf8);
      use HTTP::Request ();
      use JSON::MaybeXS qw(encode_json);
  
      my $auth_token = 'auth_token';
      my $batch_url = 'https://www.googleapis.com/batch';
      my $url = 'https://www.googleapis.com/drive/v3/files/fileId/permissions?fields=id';
      my $url_no_email = 'https://www.googleapis.com/drive/v3/files/fileId/permissions?fields=id&sendNotificationEmail=false';
  
      # generate a JSON post request for one of the batch entries
      my $req1 = build_json_request($url, {
          emailAddress => 'example@appsrocks.com',
          role => "writer",
          type => "user",
      });
  
      # generate a JSON post request for one of the batch entries
      my $req2 = build_json_request($url_no_email, {
          domain => "appsrocks.com",
          role => "reader",
          type => "domain",
      });
  
      # generate a multipart request to send all of the other requests
      my $r = HTTP::Request->new('POST', $batch_url, [
          'Accept-Encoding' => 'gzip',
          # if we don't provide a boundary here, HTTP::Message will generate
          # one for us. We could use UUID::uuid() here if we wanted.
          'Content-Type' => 'multipart/mixed; boundary=END_OF_PART'
      ]);
  
      # add the two POST requests to the main request
      $r->add_part($req1, $req2);
      # at this point, we could send it via LWP::UserAgent
      # my $ua = LWP::UserAgent->new();
      # my $res = $ua->request($r);
      exit();
  
      sub build_json_request {
          my ($url, $href) = @_;
          my $header = ['Authorization' => "Bearer $auth_token", 'Content-Type' => 'application/json; charset=UTF-8'];
          return HTTP::Request->new('POST', $url, $header, encode_utf8(encode_json($href)));
      }
  
  =head1 SEE ALSO
  
  L<HTTP::Headers>, L<HTTP::Message>, L<HTTP::Request::Common>,
  L<HTTP::Response>
  
  =head1 AUTHOR
  
  Gisle Aas <gisle@activestate.com>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 1994-2017 by Gisle Aas.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
  
  __END__
  
  
  #ABSTRACT: HTTP style request message
HTTP_REQUEST

    $main::fatpacked{"HTTP/Request/Common.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'HTTP_REQUEST_COMMON';
  package HTTP::Request::Common;
  
  use strict;
  use warnings;
  
  our $VERSION = '6.18';
  
  our $DYNAMIC_FILE_UPLOAD ||= 0;  # make it defined (don't know why)
  
  use Exporter 5.57 'import';
  
  our @EXPORT =qw(GET HEAD PUT PATCH POST);
  our @EXPORT_OK = qw($DYNAMIC_FILE_UPLOAD DELETE);
  
  require HTTP::Request;
  use Carp();
  
  my $CRLF = "\015\012";   # "\r\n" is not portable
  
  sub GET  { _simple_req('GET',  @_); }
  sub HEAD { _simple_req('HEAD', @_); }
  sub DELETE { _simple_req('DELETE', @_); }
  sub PATCH { request_type_with_data('PATCH', @_); }
  sub POST { request_type_with_data('POST', @_); }
  sub PUT { request_type_with_data('PUT', @_); }
  
  sub request_type_with_data
  {
      my $type = shift;
      my $url  = shift;
      my $req = HTTP::Request->new($type => $url);
      my $content;
      $content = shift if @_ and ref $_[0];
      my($k, $v);
      while (($k,$v) = splice(@_, 0, 2)) {
  	if (lc($k) eq 'content') {
  	    $content = $v;
  	}
  	else {
  	    $req->push_header($k, $v);
  	}
      }
      my $ct = $req->header('Content-Type');
      unless ($ct) {
  	$ct = 'application/x-www-form-urlencoded';
      }
      elsif ($ct eq 'form-data') {
  	$ct = 'multipart/form-data';
      }
  
      if (ref $content) {
  	if ($ct =~ m,^multipart/form-data\s*(;|$),i) {
  	    require HTTP::Headers::Util;
  	    my @v = HTTP::Headers::Util::split_header_words($ct);
  	    Carp::carp("Multiple Content-Type headers") if @v > 1;
  	    @v = @{$v[0]};
  
  	    my $boundary;
  	    my $boundary_index;
  	    for (my @tmp = @v; @tmp;) {
  		my($k, $v) = splice(@tmp, 0, 2);
  		if ($k eq "boundary") {
  		    $boundary = $v;
  		    $boundary_index = @v - @tmp - 1;
  		    last;
  		}
  	    }
  
  	    ($content, $boundary) = form_data($content, $boundary, $req);
  
  	    if ($boundary_index) {
  		$v[$boundary_index] = $boundary;
  	    }
  	    else {
  		push(@v, boundary => $boundary);
  	    }
  
  	    $ct = HTTP::Headers::Util::join_header_words(@v);
  	}
  	else {
  	    # We use a temporary URI object to format
  	    # the application/x-www-form-urlencoded content.
  	    require URI;
  	    my $url = URI->new('http:');
  	    $url->query_form(ref($content) eq "HASH" ? %$content : @$content);
  	    $content = $url->query;
  
  	    # HTML/4.01 says that line breaks are represented as "CR LF" pairs (i.e., `%0D%0A')
  	    $content =~ s/(?<!%0D)%0A/%0D%0A/g if defined($content);
  	}
      }
  
      $req->header('Content-Type' => $ct);  # might be redundant
      if (defined($content)) {
  	$req->header('Content-Length' =>
  		     length($content)) unless ref($content);
  	$req->content($content);
      }
      else {
          $req->header('Content-Length' => 0);
      }
      $req;
  }
  
  
  sub _simple_req
  {
      my($method, $url) = splice(@_, 0, 2);
      my $req = HTTP::Request->new($method => $url);
      my($k, $v);
      my $content;
      while (($k,$v) = splice(@_, 0, 2)) {
  	if (lc($k) eq 'content') {
  	    $req->add_content($v);
              $content++;
  	}
  	else {
  	    $req->push_header($k, $v);
  	}
      }
      if ($content && !defined($req->header("Content-Length"))) {
          $req->header("Content-Length", length(${$req->content_ref}));
      }
      $req;
  }
  
  
  sub form_data   # RFC1867
  {
      my($data, $boundary, $req) = @_;
      my @data = ref($data) eq "HASH" ? %$data : @$data;  # copy
      my $fhparts;
      my @parts;
      while (my ($k,$v) = splice(@data, 0, 2)) {
  	if (!ref($v)) {
  	    $k =~ s/([\\\"])/\\$1/g;  # escape quotes and backslashes
              no warnings 'uninitialized';
  	    push(@parts,
  		 qq(Content-Disposition: form-data; name="$k"$CRLF$CRLF$v));
  	}
  	else {
  	    my($file, $usename, @headers) = @$v;
  	    unless (defined $usename) {
  		$usename = $file;
  		$usename =~ s,.*/,, if defined($usename);
  	    }
              $k =~ s/([\\\"])/\\$1/g;
  	    my $disp = qq(form-data; name="$k");
              if (defined($usename) and length($usename)) {
                  $usename =~ s/([\\\"])/\\$1/g;
                  $disp .= qq(; filename="$usename");
              }
  	    my $content = "";
  	    my $h = HTTP::Headers->new(@headers);
  	    if ($file) {
  		open(my $fh, "<", $file) or Carp::croak("Can't open file $file: $!");
  		binmode($fh);
  		if ($DYNAMIC_FILE_UPLOAD) {
  		    # will read file later, close it now in order to
                      # not accumulate to many open file handles
                      close($fh);
  		    $content = \$file;
  		}
  		else {
  		    local($/) = undef; # slurp files
  		    $content = <$fh>;
  		    close($fh);
  		}
  		unless ($h->header("Content-Type")) {
  		    require LWP::MediaTypes;
  		    LWP::MediaTypes::guess_media_type($file, $h);
  		}
  	    }
  	    if ($h->header("Content-Disposition")) {
  		# just to get it sorted first
  		$disp = $h->header("Content-Disposition");
  		$h->remove_header("Content-Disposition");
  	    }
  	    if ($h->header("Content")) {
  		$content = $h->header("Content");
  		$h->remove_header("Content");
  	    }
  	    my $head = join($CRLF, "Content-Disposition: $disp",
  			           $h->as_string($CRLF),
  			           "");
  	    if (ref $content) {
  		push(@parts, [$head, $$content]);
  		$fhparts++;
  	    }
  	    else {
  		push(@parts, $head . $content);
  	    }
  	}
      }
      return ("", "none") unless @parts;
  
      my $content;
      if ($fhparts) {
  	$boundary = boundary(10) # hopefully enough randomness
  	    unless $boundary;
  
  	# add the boundaries to the @parts array
  	for (1..@parts-1) {
  	    splice(@parts, $_*2-1, 0, "$CRLF--$boundary$CRLF");
  	}
  	unshift(@parts, "--$boundary$CRLF");
  	push(@parts, "$CRLF--$boundary--$CRLF");
  
  	# See if we can generate Content-Length header
  	my $length = 0;
  	for (@parts) {
  	    if (ref $_) {
  	 	my ($head, $f) = @$_;
  		my $file_size;
  		unless ( -f $f && ($file_size = -s _) ) {
  		    # The file is either a dynamic file like /dev/audio
  		    # or perhaps a file in the /proc file system where
  		    # stat may return a 0 size even though reading it
  		    # will produce data.  So we cannot make
  		    # a Content-Length header.
  		    undef $length;
  		    last;
  		}
  	    	$length += $file_size + length $head;
  	    }
  	    else {
  		$length += length;
  	    }
          }
          $length && $req->header('Content-Length' => $length);
  
  	# set up a closure that will return content piecemeal
  	$content = sub {
  	    for (;;) {
  		unless (@parts) {
  		    defined $length && $length != 0 &&
  		    	Carp::croak "length of data sent did not match calculated Content-Length header.  Probably because uploaded file changed in size during transfer.";
  		    return;
  		}
  		my $p = shift @parts;
  		unless (ref $p) {
  		    $p .= shift @parts while @parts && !ref($parts[0]);
  		    defined $length && ($length -= length $p);
  		    return $p;
  		}
  		my($buf, $fh) = @$p;
                  unless (ref($fh)) {
                      my $file = $fh;
                      undef($fh);
                      open($fh, "<", $file) || Carp::croak("Can't open file $file: $!");
                      binmode($fh);
                  }
  		my $buflength = length $buf;
  		my $n = read($fh, $buf, 2048, $buflength);
  		if ($n) {
  		    $buflength += $n;
  		    unshift(@parts, ["", $fh]);
  		}
  		else {
  		    close($fh);
  		}
  		if ($buflength) {
  		    defined $length && ($length -= $buflength);
  		    return $buf
  	    	}
  	    }
  	};
  
      }
      else {
  	$boundary = boundary() unless $boundary;
  
  	my $bno = 0;
        CHECK_BOUNDARY:
  	{
  	    for (@parts) {
  		if (index($_, $boundary) >= 0) {
  		    # must have a better boundary
  		    $boundary = boundary(++$bno);
  		    redo CHECK_BOUNDARY;
  		}
  	    }
  	    last;
  	}
  	$content = "--$boundary$CRLF" .
  	           join("$CRLF--$boundary$CRLF", @parts) .
  		   "$CRLF--$boundary--$CRLF";
      }
  
      wantarray ? ($content, $boundary) : $content;
  }
  
  
  sub boundary
  {
      my $size = shift || return "xYzZY";
      require MIME::Base64;
      my $b = MIME::Base64::encode(join("", map chr(rand(256)), 1..$size*3), "");
      $b =~ s/[\W]/X/g;  # ensure alnum only
      $b;
  }
  
  1;
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  HTTP::Request::Common - Construct common HTTP::Request objects
  
  =head1 VERSION
  
  version 6.18
  
  =head1 SYNOPSIS
  
    use HTTP::Request::Common;
    $ua = LWP::UserAgent->new;
    $ua->request(GET 'http://www.sn.no/');
    $ua->request(POST 'http://somewhere/foo', [foo => bar, bar => foo]);
    $ua->request(PATCH 'http://somewhere/foo', [foo => bar, bar => foo]);
    $ua->request(PUT 'http://somewhere/foo', [foo => bar, bar => foo]);
  
  =head1 DESCRIPTION
  
  This module provides functions that return newly created C<HTTP::Request>
  objects.  These functions are usually more convenient to use than the
  standard C<HTTP::Request> constructor for the most common requests.
  
  Note that L<LWP::UserAgent> has several convenience methods, including
  C<get>, C<head>, C<delete>, C<post> and C<put>.
  
  The following functions are provided:
  
  =over 4
  
  =item GET $url
  
  =item GET $url, Header => Value,...
  
  The C<GET> function returns an L<HTTP::Request> object initialized with
  the "GET" method and the specified URL.  It is roughly equivalent to the
  following call
  
    HTTP::Request->new(
       GET => $url,
       HTTP::Headers->new(Header => Value,...),
    )
  
  but is less cluttered.  What is different is that a header named
  C<Content> will initialize the content part of the request instead of
  setting a header field.  Note that GET requests should normally not
  have a content, so this hack makes more sense for the C<PUT>, C<PATCH>
   and C<POST> functions described below.
  
  The C<get(...)> method of L<LWP::UserAgent> exists as a shortcut for
  C<< $ua->request(GET ...) >>.
  
  =item HEAD $url
  
  =item HEAD $url, Header => Value,...
  
  Like GET() but the method in the request is "HEAD".
  
  The C<head(...)>  method of L<LWP::UserAgent> exists as a shortcut for
  C<< $ua->request(HEAD ...) >>.
  
  =item DELETE $url
  
  =item DELETE $url, Header => Value,...
  
  Like C<GET> but the method in the request is C<DELETE>.  This function
  is not exported by default.
  
  =item PATCH $url
  
  =item PATCH $url, Header => Value,...
  
  =item PATCH $url, $form_ref, Header => Value,...
  
  =item PATCH $url, Header => Value,..., Content => $form_ref
  
  =item PATCH $url, Header => Value,..., Content => $content
  
  The same as C<POST> below, but the method in the request is C<PATCH>.
  
  =item PUT $url
  
  =item PUT $url, Header => Value,...
  
  =item PUT $url, $form_ref, Header => Value,...
  
  =item PUT $url, Header => Value,..., Content => $form_ref
  
  =item PUT $url, Header => Value,..., Content => $content
  
  The same as C<POST> below, but the method in the request is C<PUT>
  
  =item POST $url
  
  =item POST $url, Header => Value,...
  
  =item POST $url, $form_ref, Header => Value,...
  
  =item POST $url, Header => Value,..., Content => $form_ref
  
  =item POST $url, Header => Value,..., Content => $content
  
  C<POST>, C<PATCH> and C<PUT> all work with the same parameters.
  
    %data = ( title => 'something', body => something else' );
    $ua = LWP::UserAgent->new();
    $request = HTTP::Request::Common::POST( $url, [ %data ] );
    $response = $ua->request($request);
  
  They take a second optional array or hash reference
  parameter C<$form_ref>.  The content can also be specified
  directly using the C<Content> pseudo-header, and you may also provide
  the C<$form_ref> this way.
  
  The C<Content> pseudo-header steals a bit of the header field namespace as
  there is no way to directly specify a header that is actually called
  "Content".  If you really need this you must update the request
  returned in a separate statement.
  
  The C<$form_ref> argument can be used to pass key/value pairs for the
  form content.  By default we will initialize a request using the
  C<application/x-www-form-urlencoded> content type.  This means that
  you can emulate an HTML E<lt>form> POSTing like this:
  
    POST 'http://www.perl.org/survey.cgi',
         [ name   => 'Gisle Aas',
           email  => 'gisle@aas.no',
           gender => 'M',
           born   => '1964',
           perc   => '3%',
         ];
  
  This will create an L<HTTP::Request> object that looks like this:
  
    POST http://www.perl.org/survey.cgi
    Content-Length: 66
    Content-Type: application/x-www-form-urlencoded
  
    name=Gisle%20Aas&email=gisle%40aas.no&gender=M&born=1964&perc=3%25
  
  Multivalued form fields can be specified by either repeating the field
  name or by passing the value as an array reference.
  
  The POST method also supports the C<multipart/form-data> content used
  for I<Form-based File Upload> as specified in RFC 1867.  You trigger
  this content format by specifying a content type of C<'form-data'> as
  one of the request headers.  If one of the values in the C<$form_ref> is
  an array reference, then it is treated as a file part specification
  with the following interpretation:
  
    [ $file, $filename, Header => Value... ]
    [ undef, $filename, Header => Value,..., Content => $content ]
  
  The first value in the array ($file) is the name of a file to open.
  This file will be read and its content placed in the request.  The
  routine will croak if the file can't be opened.  Use an C<undef> as
  $file value if you want to specify the content directly with a
  C<Content> header.  The $filename is the filename to report in the
  request.  If this value is undefined, then the basename of the $file
  will be used.  You can specify an empty string as $filename if you
  want to suppress sending the filename when you provide a $file value.
  
  If a $file is provided by no C<Content-Type> header, then C<Content-Type>
  and C<Content-Encoding> will be filled in automatically with the values
  returned by C<LWP::MediaTypes::guess_media_type()>
  
  Sending my F<~/.profile> to the survey used as example above can be
  achieved by this:
  
    POST 'http://www.perl.org/survey.cgi',
         Content_Type => 'form-data',
         Content      => [ name  => 'Gisle Aas',
                           email => 'gisle@aas.no',
                           gender => 'M',
                           born   => '1964',
                           init   => ["$ENV{HOME}/.profile"],
                         ]
  
  This will create an L<HTTP::Request> object that almost looks this (the
  boundary and the content of your F<~/.profile> is likely to be
  different):
  
    POST http://www.perl.org/survey.cgi
    Content-Length: 388
    Content-Type: multipart/form-data; boundary="6G+f"
  
    --6G+f
    Content-Disposition: form-data; name="name"
  
    Gisle Aas
    --6G+f
    Content-Disposition: form-data; name="email"
  
    gisle@aas.no
    --6G+f
    Content-Disposition: form-data; name="gender"
  
    M
    --6G+f
    Content-Disposition: form-data; name="born"
  
    1964
    --6G+f
    Content-Disposition: form-data; name="init"; filename=".profile"
    Content-Type: text/plain
  
    PATH=/local/perl/bin:$PATH
    export PATH
  
    --6G+f--
  
  If you set the C<$DYNAMIC_FILE_UPLOAD> variable (exportable) to some TRUE
  value, then you get back a request object with a subroutine closure as
  the content attribute.  This subroutine will read the content of any
  files on demand and return it in suitable chunks.  This allow you to
  upload arbitrary big files without using lots of memory.  You can even
  upload infinite files like F</dev/audio> if you wish; however, if
  the file is not a plain file, there will be no C<Content-Length> header
  defined for the request.  Not all servers (or server
  applications) like this.  Also, if the file(s) change in size between
  the time the C<Content-Length> is calculated and the time that the last
  chunk is delivered, the subroutine will C<Croak>.
  
  The C<post(...)>  method of L<LWP::UserAgent> exists as a shortcut for
  C<< $ua->request(POST ...) >>.
  
  =back
  
  =head1 SEE ALSO
  
  L<HTTP::Request>, L<LWP::UserAgent>
  
  Also, there are some examples in L<HTTP::Request/"EXAMPLES"> that you might
  find useful. For example, batch requests are explained there.
  
  =head1 AUTHOR
  
  Gisle Aas <gisle@activestate.com>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 1994-2017 by Gisle Aas.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
  
  __END__
  
  
  #ABSTRACT: Construct common HTTP::Request objects
HTTP_REQUEST_COMMON

    $main::fatpacked{"HTTP/Response.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'HTTP_RESPONSE';
  package HTTP::Response;
  
  use strict;
  use warnings;
  
  our $VERSION = '6.18';
  
  use base 'HTTP::Message';
  
  use HTTP::Status ();
  
  
  sub new
  {
      my($class, $rc, $msg, $header, $content) = @_;
      my $self = $class->SUPER::new($header, $content);
      $self->code($rc);
      $self->message($msg);
      $self;
  }
  
  
  sub parse
  {
      my($class, $str) = @_;
      Carp::carp('Undefined argument to parse()') if $^W && ! defined $str;
      my $status_line;
      if (defined $str && $str =~ s/^(.*)\n//) {
  	$status_line = $1;
      }
      else {
  	$status_line = $str;
  	$str = "";
      }
  
      $status_line =~ s/\r\z// if defined $status_line;
  
      my $self = $class->SUPER::parse($str);
      if (defined $status_line) {
          my($protocol, $code, $message);
          if ($status_line =~ /^\d{3} /) {
             # Looks like a response created by HTTP::Response->new
             ($code, $message) = split(' ', $status_line, 2);
          } else {
             ($protocol, $code, $message) = split(' ', $status_line, 3);
          }
          $self->protocol($protocol) if $protocol;
          $self->code($code) if defined($code);
          $self->message($message) if defined($message);
      }
      $self;
  }
  
  
  sub clone
  {
      my $self = shift;
      my $clone = bless $self->SUPER::clone, ref($self);
      $clone->code($self->code);
      $clone->message($self->message);
      $clone->request($self->request->clone) if $self->request;
      # we don't clone previous
      $clone;
  }
  
  
  sub code      { shift->_elem('_rc',      @_); }
  sub message   { shift->_elem('_msg',     @_); }
  sub previous  { shift->_elem('_previous',@_); }
  sub request   { shift->_elem('_request', @_); }
  
  
  sub status_line
  {
      my $self = shift;
      my $code = $self->{'_rc'}  || "000";
      my $mess = $self->{'_msg'} || HTTP::Status::status_message($code) || "Unknown code";
      return "$code $mess";
  }
  
  
  sub base
  {
      my $self = shift;
      my $base = (
  	$self->header('Content-Base'),        # used to be HTTP/1.1
  	$self->header('Content-Location'),    # HTTP/1.1
  	$self->header('Base'),                # HTTP/1.0
      )[0];
      if ($base && $base =~ /^$URI::scheme_re:/o) {
  	# already absolute
  	return $HTTP::URI_CLASS->new($base);
      }
  
      my $req = $self->request;
      if ($req) {
          # if $base is undef here, the return value is effectively
          # just a copy of $self->request->uri.
          return $HTTP::URI_CLASS->new_abs($base, $req->uri);
      }
  
      # can't find an absolute base
      return undef;
  }
  
  
  sub redirects {
      my $self = shift;
      my @r;
      my $r = $self;
      while (my $p = $r->previous) {
          push(@r, $p);
          $r = $p;
      }
      return @r unless wantarray;
      return reverse @r;
  }
  
  
  sub filename
  {
      my $self = shift;
      my $file;
  
      my $cd = $self->header('Content-Disposition');
      if ($cd) {
  	require HTTP::Headers::Util;
  	if (my @cd = HTTP::Headers::Util::split_header_words($cd)) {
  	    my ($disposition, undef, %cd_param) = @{$cd[-1]};
  	    $file = $cd_param{filename};
  
  	    # RFC 2047 encoded?
  	    if ($file && $file =~ /^=\?(.+?)\?(.+?)\?(.+)\?=$/) {
  		my $charset = $1;
  		my $encoding = uc($2);
  		my $encfile = $3;
  
  		if ($encoding eq 'Q' || $encoding eq 'B') {
  		    local($SIG{__DIE__});
  		    eval {
  			if ($encoding eq 'Q') {
  			    $encfile =~ s/_/ /g;
  			    require MIME::QuotedPrint;
  			    $encfile = MIME::QuotedPrint::decode($encfile);
  			}
  			else { # $encoding eq 'B'
  			    require MIME::Base64;
  			    $encfile = MIME::Base64::decode($encfile);
  			}
  
  			require Encode;
  			require Encode::Locale;
  			Encode::from_to($encfile, $charset, "locale_fs");
  		    };
  
  		    $file = $encfile unless $@;
  		}
  	    }
  	}
      }
  
      unless (defined($file) && length($file)) {
  	my $uri;
  	if (my $cl = $self->header('Content-Location')) {
  	    $uri = URI->new($cl);
  	}
  	elsif (my $request = $self->request) {
  	    $uri = $request->uri;
  	}
  
  	if ($uri) {
  	    $file = ($uri->path_segments)[-1];
  	}
      }
  
      if ($file) {
  	$file =~ s,.*[\\/],,;  # basename
      }
  
      if ($file && !length($file)) {
  	$file = undef;
      }
  
      $file;
  }
  
  
  sub as_string
  {
      my $self = shift;
      my($eol) = @_;
      $eol = "\n" unless defined $eol;
  
      my $status_line = $self->status_line;
      my $proto = $self->protocol;
      $status_line = "$proto $status_line" if $proto;
  
      return join($eol, $status_line, $self->SUPER::as_string(@_));
  }
  
  
  sub dump
  {
      my $self = shift;
  
      my $status_line = $self->status_line;
      my $proto = $self->protocol;
      $status_line = "$proto $status_line" if $proto;
  
      return $self->SUPER::dump(
  	preheader => $status_line,
          @_,
      );
  }
  
  
  sub is_info     { HTTP::Status::is_info     (shift->{'_rc'}); }
  sub is_success  { HTTP::Status::is_success  (shift->{'_rc'}); }
  sub is_redirect { HTTP::Status::is_redirect (shift->{'_rc'}); }
  sub is_error    { HTTP::Status::is_error    (shift->{'_rc'}); }
  sub is_client_error { HTTP::Status::is_client_error (shift->{'_rc'}); }
  sub is_server_error { HTTP::Status::is_server_error (shift->{'_rc'}); }
  
  
  sub error_as_HTML
  {
      my $self = shift;
      my $title = 'An Error Occurred';
      my $body  = $self->status_line;
      $body =~ s/&/&amp;/g;
      $body =~ s/</&lt;/g;
      return <<EOM;
  <html>
  <head><title>$title</title></head>
  <body>
  <h1>$title</h1>
  <p>$body</p>
  </body>
  </html>
  EOM
  }
  
  
  sub current_age
  {
      my $self = shift;
      my $time = shift;
  
      # Implementation of RFC 2616 section 13.2.3
      # (age calculations)
      my $response_time = $self->client_date;
      my $date = $self->date;
  
      my $age = 0;
      if ($response_time && $date) {
  	$age = $response_time - $date;  # apparent_age
  	$age = 0 if $age < 0;
      }
  
      my $age_v = $self->header('Age');
      if ($age_v && $age_v > $age) {
  	$age = $age_v;   # corrected_received_age
      }
  
      if ($response_time) {
  	my $request = $self->request;
  	if ($request) {
  	    my $request_time = $request->date;
  	    if ($request_time && $request_time < $response_time) {
  		# Add response_delay to age to get 'corrected_initial_age'
  		$age += $response_time - $request_time;
  	    }
  	}
  	$age += ($time || time) - $response_time;
      }
      return $age;
  }
  
  
  sub freshness_lifetime
  {
      my($self, %opt) = @_;
  
      # First look for the Cache-Control: max-age=n header
      for my $cc ($self->header('Cache-Control')) {
  	for my $cc_dir (split(/\s*,\s*/, $cc)) {
  	    return $1 if $cc_dir =~ /^max-age\s*=\s*(\d+)/i;
  	}
      }
  
      # Next possibility is to look at the "Expires" header
      my $date = $self->date || $self->client_date || $opt{time} || time;
      if (my $expires = $self->expires) {
  	return $expires - $date;
      }
  
      # Must apply heuristic expiration
      return undef if exists $opt{heuristic_expiry} && !$opt{heuristic_expiry};
  
      # Default heuristic expiration parameters
      $opt{h_min} ||= 60;
      $opt{h_max} ||= 24 * 3600;
      $opt{h_lastmod_fraction} ||= 0.10; # 10% since last-mod suggested by RFC2616
      $opt{h_default} ||= 3600;
  
      # Should give a warning if more than 24 hours according to
      # RFC 2616 section 13.2.4.  Here we just make this the default
      # maximum value.
  
      if (my $last_modified = $self->last_modified) {
  	my $h_exp = ($date - $last_modified) * $opt{h_lastmod_fraction};
  	return $opt{h_min} if $h_exp < $opt{h_min};
  	return $opt{h_max} if $h_exp > $opt{h_max};
  	return $h_exp;
      }
  
      # default when all else fails
      return $opt{h_min} if $opt{h_min} > $opt{h_default};
      return $opt{h_default};
  }
  
  
  sub is_fresh
  {
      my($self, %opt) = @_;
      $opt{time} ||= time;
      my $f = $self->freshness_lifetime(%opt);
      return undef unless defined($f);
      return $f > $self->current_age($opt{time});
  }
  
  
  sub fresh_until
  {
      my($self, %opt) = @_;
      $opt{time} ||= time;
      my $f = $self->freshness_lifetime(%opt);
      return undef unless defined($f);
      return $f - $self->current_age($opt{time}) + $opt{time};
  }
  
  1;
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  HTTP::Response - HTTP style response message
  
  =head1 VERSION
  
  version 6.18
  
  =head1 SYNOPSIS
  
  Response objects are returned by the request() method of the C<LWP::UserAgent>:
  
      # ...
      $response = $ua->request($request);
      if ($response->is_success) {
          print $response->decoded_content;
      }
      else {
          print STDERR $response->status_line, "\n";
      }
  
  =head1 DESCRIPTION
  
  The C<HTTP::Response> class encapsulates HTTP style responses.  A
  response consists of a response line, some headers, and a content
  body. Note that the LWP library uses HTTP style responses even for
  non-HTTP protocol schemes.  Instances of this class are usually
  created and returned by the request() method of an C<LWP::UserAgent>
  object.
  
  C<HTTP::Response> is a subclass of C<HTTP::Message> and therefore
  inherits its methods.  The following additional methods are available:
  
  =over 4
  
  =item $r = HTTP::Response->new( $code )
  
  =item $r = HTTP::Response->new( $code, $msg )
  
  =item $r = HTTP::Response->new( $code, $msg, $header )
  
  =item $r = HTTP::Response->new( $code, $msg, $header, $content )
  
  Constructs a new C<HTTP::Response> object describing a response with
  response code $code and optional message $msg.  The optional $header
  argument should be a reference to an C<HTTP::Headers> object or a
  plain array reference of key/value pairs.  The optional $content
  argument should be a string of bytes.  The meanings of these arguments are
  described below.
  
  =item $r = HTTP::Response->parse( $str )
  
  This constructs a new response object by parsing the given string.
  
  =item $r->code
  
  =item $r->code( $code )
  
  This is used to get/set the code attribute.  The code is a 3 digit
  number that encode the overall outcome of an HTTP response.  The
  C<HTTP::Status> module provide constants that provide mnemonic names
  for the code attribute.
  
  =item $r->message
  
  =item $r->message( $message )
  
  This is used to get/set the message attribute.  The message is a short
  human readable single line string that explains the response code.
  
  =item $r->header( $field )
  
  =item $r->header( $field => $value )
  
  This is used to get/set header values and it is inherited from
  C<HTTP::Headers> via C<HTTP::Message>.  See L<HTTP::Headers> for
  details and other similar methods that can be used to access the
  headers.
  
  =item $r->content
  
  =item $r->content( $bytes )
  
  This is used to get/set the raw content and it is inherited from the
  C<HTTP::Message> base class.  See L<HTTP::Message> for details and
  other methods that can be used to access the content.
  
  =item $r->decoded_content( %options )
  
  This will return the content after any C<Content-Encoding> and
  charsets have been decoded.  See L<HTTP::Message> for details.
  
  =item $r->request
  
  =item $r->request( $request )
  
  This is used to get/set the request attribute.  The request attribute
  is a reference to the request that caused this response.  It does
  not have to be the same request passed to the $ua->request() method,
  because there might have been redirects and authorization retries in
  between.
  
  =item $r->previous
  
  =item $r->previous( $response )
  
  This is used to get/set the previous attribute.  The previous
  attribute is used to link together chains of responses.  You get
  chains of responses if the first response is redirect or unauthorized.
  The value is C<undef> if this is the first response in a chain.
  
  Note that the method $r->redirects is provided as a more convenient
  way to access the response chain.
  
  =item $r->status_line
  
  Returns the string "E<lt>code> E<lt>message>".  If the message attribute
  is not set then the official name of E<lt>code> (see L<HTTP::Status>)
  is substituted.
  
  =item $r->base
  
  Returns the base URI for this response.  The return value will be a
  reference to a URI object.
  
  The base URI is obtained from one the following sources (in priority
  order):
  
  =over 4
  
  =item 1.
  
  Embedded in the document content, for instance <BASE HREF="...">
  in HTML documents.
  
  =item 2.
  
  A "Content-Base:" or a "Content-Location:" header in the response.
  
  For backwards compatibility with older HTTP implementations we will
  also look for the "Base:" header.
  
  =item 3.
  
  The URI used to request this response. This might not be the original
  URI that was passed to $ua->request() method, because we might have
  received some redirect responses first.
  
  =back
  
  If none of these sources provide an absolute URI, undef is returned.
  
  When the LWP protocol modules produce the HTTP::Response object, then any base
  URI embedded in the document (step 1) will already have initialized the
  "Content-Base:" header. (See L<LWP::UserAgent/parse_head>).  This means that
  this method only performs the last 2 steps (the content is not always available
  either).
  
  =item $r->filename
  
  Returns a filename for this response.  Note that doing sanity checks
  on the returned filename (eg. removing characters that cannot be used
  on the target filesystem where the filename would be used, and
  laundering it for security purposes) are the caller's responsibility;
  the only related thing done by this method is that it makes a simple
  attempt to return a plain filename with no preceding path segments.
  
  The filename is obtained from one the following sources (in priority
  order):
  
  =over 4
  
  =item 1.
  
  A "Content-Disposition:" header in the response.  Proper decoding of
  RFC 2047 encoded filenames requires the C<MIME::QuotedPrint> (for "Q"
  encoding), C<MIME::Base64> (for "B" encoding), and C<Encode> modules.
  
  =item 2.
  
  A "Content-Location:" header in the response.
  
  =item 3.
  
  The URI used to request this response. This might not be the original
  URI that was passed to $ua->request() method, because we might have
  received some redirect responses first.
  
  =back
  
  If a filename cannot be derived from any of these sources, undef is
  returned.
  
  =item $r->as_string
  
  =item $r->as_string( $eol )
  
  Returns a textual representation of the response.
  
  =item $r->is_info
  
  =item $r->is_success
  
  =item $r->is_redirect
  
  =item $r->is_error
  
  =item $r->is_client_error
  
  =item $r->is_server_error
  
  These methods indicate if the response was informational, successful, a
  redirection, or an error.  See L<HTTP::Status> for the meaning of these.
  
  =item $r->error_as_HTML
  
  Returns a string containing a complete HTML document indicating what
  error occurred.  This method should only be called when $r->is_error
  is TRUE.
  
  =item $r->redirects
  
  Returns the list of redirect responses that lead up to this response
  by following the $r->previous chain.  The list order is oldest first.
  
  In scalar context return the number of redirect responses leading up
  to this one.
  
  =item $r->current_age
  
  Calculates the "current age" of the response as specified by RFC 2616
  section 13.2.3.  The age of a response is the time since it was sent
  by the origin server.  The returned value is a number representing the
  age in seconds.
  
  =item $r->freshness_lifetime( %opt )
  
  Calculates the "freshness lifetime" of the response as specified by
  RFC 2616 section 13.2.4.  The "freshness lifetime" is the length of
  time between the generation of a response and its expiration time.
  The returned value is the number of seconds until expiry.
  
  If the response does not contain an "Expires" or a "Cache-Control"
  header, then this function will apply some simple heuristic based on
  the "Last-Modified" header to determine a suitable lifetime.  The
  following options might be passed to control the heuristics:
  
  =over
  
  =item heuristic_expiry => $bool
  
  If passed as a FALSE value, don't apply heuristics and just return
  C<undef> when "Expires" or "Cache-Control" is lacking.
  
  =item h_lastmod_fraction => $num
  
  This number represent the fraction of the difference since the
  "Last-Modified" timestamp to make the expiry time.  The default is
  C<0.10>, the suggested typical setting of 10% in RFC 2616.
  
  =item h_min => $sec
  
  This is the lower limit of the heuristic expiry age to use.  The
  default is C<60> (1 minute).
  
  =item h_max => $sec
  
  This is the upper limit of the heuristic expiry age to use.  The
  default is C<86400> (24 hours).
  
  =item h_default => $sec
  
  This is the expiry age to use when nothing else applies.  The default
  is C<3600> (1 hour) or "h_min" if greater.
  
  =back
  
  =item $r->is_fresh( %opt )
  
  Returns TRUE if the response is fresh, based on the values of
  freshness_lifetime() and current_age().  If the response is no longer
  fresh, then it has to be re-fetched or re-validated by the origin
  server.
  
  Options might be passed to control expiry heuristics, see the
  description of freshness_lifetime().
  
  =item $r->fresh_until( %opt )
  
  Returns the time (seconds since epoch) when this entity is no longer fresh.
  
  Options might be passed to control expiry heuristics, see the
  description of freshness_lifetime().
  
  =back
  
  =head1 SEE ALSO
  
  L<HTTP::Headers>, L<HTTP::Message>, L<HTTP::Status>, L<HTTP::Request>
  
  =head1 AUTHOR
  
  Gisle Aas <gisle@activestate.com>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 1994-2017 by Gisle Aas.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
  
  __END__
  
  
  #ABSTRACT: HTTP style response message
  
HTTP_RESPONSE

    $main::fatpacked{"HTTP/Status.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'HTTP_STATUS';
  package HTTP::Status;
  
  use strict;
  use warnings;
  
  our $VERSION = '6.18';
  
  require 5.002;   # because we use prototypes
  
  use base 'Exporter';
  our @EXPORT = qw(is_info is_success is_redirect is_error status_message);
  our @EXPORT_OK = qw(is_client_error is_server_error is_cacheable_by_default);
  
  # Note also addition of mnemonics to @EXPORT below
  
  # Unmarked codes are from RFC 7231 (2017-12-20)
  # See also:
  # https://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml
  
  my %StatusCode = (
      100 => 'Continue',
      101 => 'Switching Protocols',
      102 => 'Processing',                      # RFC 2518: WebDAV
      103 => 'Early Hints',                     # RFC 8297: Indicating Hints
  #   104 .. 199
      200 => 'OK',
      201 => 'Created',
      202 => 'Accepted',
      203 => 'Non-Authoritative Information',
      204 => 'No Content',
      205 => 'Reset Content',
      206 => 'Partial Content',                 # RFC 7233: Range Requests
      207 => 'Multi-Status',                    # RFC 4918: WebDAV
      208 => 'Already Reported',                # RFC 5842: WebDAV bindings
  #   209 .. 225
      226 => 'IM used',                         # RFC 3229: Delta encoding
  #   227 .. 299
      300 => 'Multiple Choices',
      301 => 'Moved Permanently',
      302 => 'Found',
      303 => 'See Other',
      304 => 'Not Modified',                    # RFC 7232: Conditional Request
      305 => 'Use Proxy',
      307 => 'Temporary Redirect',
      308 => 'Permanent Redirect',              # RFC 7528: Permanent Redirect
  #   309 .. 399
      400 => 'Bad Request',
      401 => 'Unauthorized',                    # RFC 7235: Authentication
      402 => 'Payment Required',
      403 => 'Forbidden',
      404 => 'Not Found',
      405 => 'Method Not Allowed',
      406 => 'Not Acceptable',
      407 => 'Proxy Authentication Required',   # RFC 7235: Authentication
      408 => 'Request Timeout',
      409 => 'Conflict',
      410 => 'Gone',
      411 => 'Length Required',
      412 => 'Precondition Failed',             # RFC 7232: Conditional Request
      413 => 'Request Entity Too Large',
      414 => 'Request-URI Too Large',
      415 => 'Unsupported Media Type',
      416 => 'Request Range Not Satisfiable',   # RFC 7233: Range Requests
      417 => 'Expectation Failed',
  #   418 .. 420
      421 => 'Misdirected Request',             # RFC 7540: HTTP/2
      422 => 'Unprocessable Entity',            # RFC 4918: WebDAV
      423 => 'Locked',                          # RFC 4918: WebDAV
      424 => 'Failed Dependency',               # RFC 4918: WebDAV
  #   425
      426 => 'Upgrade Required',
  #   427
      428 => 'Precondition Required',           # RFC 6585: Additional Codes
      429 => 'Too Many Requests',               # RFC 6585: Additional Codes
  #   430
      431 => 'Request Header Fields Too Large', # RFC 6585: Additional Codes
  #   432 .. 450
      451 => 'Unavailable For Legal Reasons',   # RFC 7724: Legal Obstacles
  #   452 .. 499
      500 => 'Internal Server Error',
      501 => 'Not Implemented',
      502 => 'Bad Gateway',
      503 => 'Service Unavailable',
      504 => 'Gateway Timeout',
      505 => 'HTTP Version Not Supported',
      506 => 'Variant Also Negotiates',         # RFC 2295: Transparant Ngttn
      507 => 'Insufficient Storage',            # RFC 4918: WebDAV
      508 => 'Loop Detected',                   # RFC 5842: WebDAV bindings
  #   509
      510 => 'Not Extended',                    # RFC 2774: Extension Framework
      511 => 'Network Authentication Required', # RFC 6585: Additional Codes
  );
  
  # keep some unofficial codes that used to be in this distribution
  %StatusCode = (
      %StatusCode,
      418 => 'I\'m a teapot',                   # RFC 2324: HTCPC/1.0  1-april
      425 => 'Unordered Collection',            #           WebDAV Draft
      449 => 'Retry with',                      #           microsoft
      509 => 'Bandwidth Limit Exceeded',        #           Apache / cPanel
  );
  
  my $mnemonicCode = '';
  my ($code, $message);
  while (($code, $message) = each %StatusCode) {
      # create mnemonic subroutines
      $message =~ s/I'm/I am/;
      $message =~ tr/a-z \-/A-Z__/;
      $mnemonicCode .= "sub HTTP_$message () { $code }\n";
      $mnemonicCode .= "*RC_$message = \\&HTTP_$message;\n";  # legacy
      $mnemonicCode .= "push(\@EXPORT_OK, 'HTTP_$message');\n";
      $mnemonicCode .= "push(\@EXPORT, 'RC_$message');\n";
  }
  eval $mnemonicCode; # only one eval for speed
  die if $@;
  
  # backwards compatibility
  *RC_MOVED_TEMPORARILY = \&RC_FOUND;  # 302 was renamed in the standard
  push(@EXPORT, "RC_MOVED_TEMPORARILY");
  
  *RC_NO_CODE = \&RC_UNORDERED_COLLECTION;
  push(@EXPORT, "RC_NO_CODE");
  
  our %EXPORT_TAGS = (
     constants => [grep /^HTTP_/, @EXPORT_OK],
     is => [grep /^is_/, @EXPORT, @EXPORT_OK],
  );
  
  
  sub status_message  ($) { $StatusCode{$_[0]}; }
  
  sub is_info                 ($) { $_[0] && $_[0] >= 100 && $_[0] < 200; }
  sub is_success              ($) { $_[0] && $_[0] >= 200 && $_[0] < 300; }
  sub is_redirect             ($) { $_[0] && $_[0] >= 300 && $_[0] < 400; }
  sub is_error                ($) { $_[0] && $_[0] >= 400 && $_[0] < 600; }
  sub is_client_error         ($) { $_[0] && $_[0] >= 400 && $_[0] < 500; }
  sub is_server_error         ($) { $_[0] && $_[0] >= 500 && $_[0] < 600; }
  sub is_cacheable_by_default ($) { $_[0] && ( $_[0] == 200 # OK
                                            || $_[0] == 203 # Non-Authoritative Information
                                            || $_[0] == 204 # No Content
                                            || $_[0] == 206 # Not Acceptable
                                            || $_[0] == 300 # Multiple Choices
                                            || $_[0] == 301 # Moved Permanently
                                            || $_[0] == 404 # Not Found
                                            || $_[0] == 405 # Method Not Allowed
                                            || $_[0] == 410 # Gone
                                            || $_[0] == 414 # Request-URI Too Large
                                            || $_[0] == 451 # Unavailable For Legal Reasons
                                            || $_[0] == 501 # Not Implemented
                                              );
  }
  
  1;
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  HTTP::Status - HTTP Status code processing
  
  =head1 VERSION
  
  version 6.18
  
  =head1 SYNOPSIS
  
   use HTTP::Status qw(:constants :is status_message);
  
   if ($rc != HTTP_OK) {
       print status_message($rc), "\n";
   }
  
   if (is_success($rc)) { ... }
   if (is_error($rc)) { ... }
   if (is_redirect($rc)) { ... }
  
  =head1 DESCRIPTION
  
  I<HTTP::Status> is a library of routines for defining and
  classifying HTTP status codes for libwww-perl.  Status codes are
  used to encode the overall outcome of an HTTP response message.  Codes
  correspond to those defined in RFC 2616 and RFC 2518.
  
  =head1 CONSTANTS
  
  The following constant functions can be used as mnemonic status code
  names.  None of these are exported by default.  Use the C<:constants>
  tag to import them all.
  
     HTTP_CONTINUE                        (100)
     HTTP_SWITCHING_PROTOCOLS             (101)
     HTTP_PROCESSING                      (102)
     HTTP_EARLY_HINTS                     (103)
  
     HTTP_OK                              (200)
     HTTP_CREATED                         (201)
     HTTP_ACCEPTED                        (202)
     HTTP_NON_AUTHORITATIVE_INFORMATION   (203)
     HTTP_NO_CONTENT                      (204)
     HTTP_RESET_CONTENT                   (205)
     HTTP_PARTIAL_CONTENT                 (206)
     HTTP_MULTI_STATUS                    (207)
     HTTP_ALREADY_REPORTED                (208)
  
     HTTP_IM_USED                         (226)
  
     HTTP_MULTIPLE_CHOICES                (300)
     HTTP_MOVED_PERMANENTLY               (301)
     HTTP_FOUND                           (302)
     HTTP_SEE_OTHER                       (303)
     HTTP_NOT_MODIFIED                    (304)
     HTTP_USE_PROXY                       (305)
     HTTP_TEMPORARY_REDIRECT              (307)
     HTTP_PERMANENT_REDIRECT              (308)
  
     HTTP_BAD_REQUEST                     (400)
     HTTP_UNAUTHORIZED                    (401)
     HTTP_PAYMENT_REQUIRED                (402)
     HTTP_FORBIDDEN                       (403)
     HTTP_NOT_FOUND                       (404)
     HTTP_METHOD_NOT_ALLOWED              (405)
     HTTP_NOT_ACCEPTABLE                  (406)
     HTTP_PROXY_AUTHENTICATION_REQUIRED   (407)
     HTTP_REQUEST_TIMEOUT                 (408)
     HTTP_CONFLICT                        (409)
     HTTP_GONE                            (410)
     HTTP_LENGTH_REQUIRED                 (411)
     HTTP_PRECONDITION_FAILED             (412)
     HTTP_REQUEST_ENTITY_TOO_LARGE        (413)
     HTTP_REQUEST_URI_TOO_LARGE           (414)
     HTTP_UNSUPPORTED_MEDIA_TYPE          (415)
     HTTP_REQUEST_RANGE_NOT_SATISFIABLE   (416)
     HTTP_EXPECTATION_FAILED              (417)
     HTTP_MISDIRECTED REQUEST             (421)
     HTTP_UNPROCESSABLE_ENTITY            (422)
     HTTP_LOCKED                          (423)
     HTTP_FAILED_DEPENDENCY               (424)
     HTTP_UPGRADE_REQUIRED                (426)
     HTTP_PRECONDITION_REQUIRED           (428)
     HTTP_TOO_MANY_REQUESTS               (429)
     HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE (431)
     HTTP_UNAVAILABLE_FOR_LEGAL_REASONS   (451)
  
     HTTP_INTERNAL_SERVER_ERROR           (500)
     HTTP_NOT_IMPLEMENTED                 (501)
     HTTP_BAD_GATEWAY                     (502)
     HTTP_SERVICE_UNAVAILABLE             (503)
     HTTP_GATEWAY_TIMEOUT                 (504)
     HTTP_HTTP_VERSION_NOT_SUPPORTED      (505)
     HTTP_VARIANT_ALSO_NEGOTIATES         (506)
     HTTP_INSUFFICIENT_STORAGE            (507)
     HTTP_LOOP_DETECTED                   (508)
     HTTP_NOT_EXTENDED                    (510)
     HTTP_NETWORK_AUTHENTICATION_REQUIRED (511)
  
  =head1 FUNCTIONS
  
  The following additional functions are provided.  Most of them are
  exported by default.  The C<:is> import tag can be used to import all
  the classification functions.
  
  =over 4
  
  =item status_message( $code )
  
  The status_message() function will translate status codes to human
  readable strings. The string is the same as found in the constant
  names above. If the $code is not registered in the L<list of IANA HTTP Status
  Codes|https://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml>
  then C<undef> is returned. 
  
  =item is_info( $code )
  
  Return TRUE if C<$code> is an I<Informational> status code (1xx).  This
  class of status code indicates a provisional response which can't have
  any content.
  
  =item is_success( $code )
  
  Return TRUE if C<$code> is a I<Successful> status code (2xx).
  
  =item is_redirect( $code )
  
  Return TRUE if C<$code> is a I<Redirection> status code (3xx). This class of
  status code indicates that further action needs to be taken by the
  user agent in order to fulfill the request.
  
  =item is_error( $code )
  
  Return TRUE if C<$code> is an I<Error> status code (4xx or 5xx).  The function
  returns TRUE for both client and server error status codes.
  
  =item is_client_error( $code )
  
  Return TRUE if C<$code> is a I<Client Error> status code (4xx). This class
  of status code is intended for cases in which the client seems to have
  erred.
  
  This function is B<not> exported by default.
  
  =item is_server_error( $code )
  
  Return TRUE if C<$code> is a I<Server Error> status code (5xx). This class
  of status codes is intended for cases in which the server is aware
  that it has erred or is incapable of performing the request.
  
  This function is B<not> exported by default.
  
  =item is_cacheable_by_default( $code )
  
  Return TRUE if C<$code> indicates that a response is cacheable by default, and
  it can be reused by a cache with heuristic expiration. All other status codes
  are not cacheable by default. See L<RFC 7231 - HTTP/1.1 Semantics and Content,
  Section 6.1. Overview of Status Codes|https://tools.ietf.org/html/rfc7231#section-6.1>.
  
  This function is B<not> exported by default.
  
  =back
  
  =head1 SEE ALSO
  
  L<IANA HTTP Status Codes|https://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml>
  
  =head1 BUGS
  
  For legacy reasons all the C<HTTP_> constants are exported by default
  with the prefix C<RC_>.  It's recommended to use explicit imports and
  the C<:constants> tag instead of relying on this.
  
  =head1 AUTHOR
  
  Gisle Aas <gisle@activestate.com>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 1994-2017 by Gisle Aas.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
  
  __END__
  
  
  #ABSTRACT: HTTP Status code processing
HTTP_STATUS

    $main::fatpacked{"HTTP/Tiny.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'HTTP_TINY';
  # vim: ts=4 sts=4 sw=4 et:
  package HTTP::Tiny;
  use strict;
  use warnings;
  # ABSTRACT: A small, simple, correct HTTP/1.1 client
  
  our $VERSION = '0.076';
  
  sub _croak { require Carp; Carp::croak(@_) }
  
  #pod =method new
  #pod
  #pod     $http = HTTP::Tiny->new( %attributes );
  #pod
  #pod This constructor returns a new HTTP::Tiny object.  Valid attributes include:
  #pod
  #pod =for :list
  #pod * C<agent> — A user-agent string (defaults to 'HTTP-Tiny/$VERSION'). If
  #pod   C<agent> — ends in a space character, the default user-agent string is
  #pod   appended.
  #pod * C<cookie_jar> — An instance of L<HTTP::CookieJar> — or equivalent class
  #pod   that supports the C<add> and C<cookie_header> methods
  #pod * C<default_headers> — A hashref of default headers to apply to requests
  #pod * C<local_address> — The local IP address to bind to
  #pod * C<keep_alive> — Whether to reuse the last connection (if for the same
  #pod   scheme, host and port) (defaults to 1)
  #pod * C<max_redirect> — Maximum number of redirects allowed (defaults to 5)
  #pod * C<max_size> — Maximum response size in bytes (only when not using a data
  #pod   callback).  If defined, responses larger than this will return an
  #pod   exception.
  #pod * C<http_proxy> — URL of a proxy server to use for HTTP connections
  #pod   (default is C<$ENV{http_proxy}> — if set)
  #pod * C<https_proxy> — URL of a proxy server to use for HTTPS connections
  #pod   (default is C<$ENV{https_proxy}> — if set)
  #pod * C<proxy> — URL of a generic proxy server for both HTTP and HTTPS
  #pod   connections (default is C<$ENV{all_proxy}> — if set)
  #pod * C<no_proxy> — List of domain suffixes that should not be proxied.  Must
  #pod   be a comma-separated string or an array reference. (default is
  #pod   C<$ENV{no_proxy}> —)
  #pod * C<timeout> — Request timeout in seconds (default is 60) If a socket open,
  #pod   read or write takes longer than the timeout, an exception is thrown.
  #pod * C<verify_SSL> — A boolean that indicates whether to validate the SSL
  #pod   certificate of an C<https> — connection (default is false)
  #pod * C<SSL_options> — A hashref of C<SSL_*> — options to pass through to
  #pod   L<IO::Socket::SSL>
  #pod
  #pod Passing an explicit C<undef> for C<proxy>, C<http_proxy> or C<https_proxy> will
  #pod prevent getting the corresponding proxies from the environment.
  #pod
  #pod Exceptions from C<max_size>, C<timeout> or other errors will result in a
  #pod pseudo-HTTP status code of 599 and a reason of "Internal Exception". The
  #pod content field in the response will contain the text of the exception.
  #pod
  #pod The C<keep_alive> parameter enables a persistent connection, but only to a
  #pod single destination scheme, host and port.  Also, if any connection-relevant
  #pod attributes are modified, or if the process ID or thread ID change, the
  #pod persistent connection will be dropped.  If you want persistent connections
  #pod across multiple destinations, use multiple HTTP::Tiny objects.
  #pod
  #pod See L</SSL SUPPORT> for more on the C<verify_SSL> and C<SSL_options> attributes.
  #pod
  #pod =cut
  
  my @attributes;
  BEGIN {
      @attributes = qw(
          cookie_jar default_headers http_proxy https_proxy keep_alive
          local_address max_redirect max_size proxy no_proxy
          SSL_options verify_SSL
      );
      my %persist_ok = map {; $_ => 1 } qw(
          cookie_jar default_headers max_redirect max_size
      );
      no strict 'refs';
      no warnings 'uninitialized';
      for my $accessor ( @attributes ) {
          *{$accessor} = sub {
              @_ > 1
                  ? do {
                      delete $_[0]->{handle} if !$persist_ok{$accessor} && $_[1] ne $_[0]->{$accessor};
                      $_[0]->{$accessor} = $_[1]
                  }
                  : $_[0]->{$accessor};
          };
      }
  }
  
  sub agent {
      my($self, $agent) = @_;
      if( @_ > 1 ){
          $self->{agent} =
              (defined $agent && $agent =~ / $/) ? $agent . $self->_agent : $agent;
      }
      return $self->{agent};
  }
  
  sub timeout {
      my ($self, $timeout) = @_;
      if ( @_ > 1 ) {
          $self->{timeout} = $timeout;
          if ($self->{handle}) {
              $self->{handle}->timeout($timeout);
          }
      }
      return $self->{timeout};
  }
  
  sub new {
      my($class, %args) = @_;
  
      my $self = {
          max_redirect => 5,
          timeout      => defined $args{timeout} ? $args{timeout} : 60,
          keep_alive   => 1,
          verify_SSL   => $args{verify_SSL} || $args{verify_ssl} || 0, # no verification by default
          no_proxy     => $ENV{no_proxy},
      };
  
      bless $self, $class;
  
      $class->_validate_cookie_jar( $args{cookie_jar} ) if $args{cookie_jar};
  
      for my $key ( @attributes ) {
          $self->{$key} = $args{$key} if exists $args{$key}
      }
  
      $self->agent( exists $args{agent} ? $args{agent} : $class->_agent );
  
      $self->_set_proxies;
  
      return $self;
  }
  
  sub _set_proxies {
      my ($self) = @_;
  
      # get proxies from %ENV only if not provided; explicit undef will disable
      # getting proxies from the environment
  
      # generic proxy
      if (! exists $self->{proxy} ) {
          $self->{proxy} = $ENV{all_proxy} || $ENV{ALL_PROXY};
      }
  
      if ( defined $self->{proxy} ) {
          $self->_split_proxy( 'generic proxy' => $self->{proxy} ); # validate
      }
      else {
          delete $self->{proxy};
      }
  
      # http proxy
      if (! exists $self->{http_proxy} ) {
          # under CGI, bypass HTTP_PROXY as request sets it from Proxy header
          local $ENV{HTTP_PROXY} if $ENV{REQUEST_METHOD};
          $self->{http_proxy} = $ENV{http_proxy} || $ENV{HTTP_PROXY} || $self->{proxy};
      }
  
      if ( defined $self->{http_proxy} ) {
          $self->_split_proxy( http_proxy => $self->{http_proxy} ); # validate
          $self->{_has_proxy}{http} = 1;
      }
      else {
          delete $self->{http_proxy};
      }
  
      # https proxy
      if (! exists $self->{https_proxy} ) {
          $self->{https_proxy} = $ENV{https_proxy} || $ENV{HTTPS_PROXY} || $self->{proxy};
      }
  
      if ( $self->{https_proxy} ) {
          $self->_split_proxy( https_proxy => $self->{https_proxy} ); # validate
          $self->{_has_proxy}{https} = 1;
      }
      else {
          delete $self->{https_proxy};
      }
  
      # Split no_proxy to array reference if not provided as such
      unless ( ref $self->{no_proxy} eq 'ARRAY' ) {
          $self->{no_proxy} =
              (defined $self->{no_proxy}) ? [ split /\s*,\s*/, $self->{no_proxy} ] : [];
      }
  
      return;
  }
  
  #pod =method get|head|put|post|delete
  #pod
  #pod     $response = $http->get($url);
  #pod     $response = $http->get($url, \%options);
  #pod     $response = $http->head($url);
  #pod
  #pod These methods are shorthand for calling C<request()> for the given method.  The
  #pod URL must have unsafe characters escaped and international domain names encoded.
  #pod See C<request()> for valid options and a description of the response.
  #pod
  #pod The C<success> field of the response will be true if the status code is 2XX.
  #pod
  #pod =cut
  
  for my $sub_name ( qw/get head put post delete/ ) {
      my $req_method = uc $sub_name;
      no strict 'refs';
      eval <<"HERE"; ## no critic
      sub $sub_name {
          my (\$self, \$url, \$args) = \@_;
          \@_ == 2 || (\@_ == 3 && ref \$args eq 'HASH')
          or _croak(q/Usage: \$http->$sub_name(URL, [HASHREF])/ . "\n");
          return \$self->request('$req_method', \$url, \$args || {});
      }
  HERE
  }
  
  #pod =method post_form
  #pod
  #pod     $response = $http->post_form($url, $form_data);
  #pod     $response = $http->post_form($url, $form_data, \%options);
  #pod
  #pod This method executes a C<POST> request and sends the key/value pairs from a
  #pod form data hash or array reference to the given URL with a C<content-type> of
  #pod C<application/x-www-form-urlencoded>.  If data is provided as an array
  #pod reference, the order is preserved; if provided as a hash reference, the terms
  #pod are sorted on key and value for consistency.  See documentation for the
  #pod C<www_form_urlencode> method for details on the encoding.
  #pod
  #pod The URL must have unsafe characters escaped and international domain names
  #pod encoded.  See C<request()> for valid options and a description of the response.
  #pod Any C<content-type> header or content in the options hashref will be ignored.
  #pod
  #pod The C<success> field of the response will be true if the status code is 2XX.
  #pod
  #pod =cut
  
  sub post_form {
      my ($self, $url, $data, $args) = @_;
      (@_ == 3 || @_ == 4 && ref $args eq 'HASH')
          or _croak(q/Usage: $http->post_form(URL, DATAREF, [HASHREF])/ . "\n");
  
      my $headers = {};
      while ( my ($key, $value) = each %{$args->{headers} || {}} ) {
          $headers->{lc $key} = $value;
      }
      delete $args->{headers};
  
      return $self->request('POST', $url, {
              %$args,
              content => $self->www_form_urlencode($data),
              headers => {
                  %$headers,
                  'content-type' => 'application/x-www-form-urlencoded'
              },
          }
      );
  }
  
  #pod =method mirror
  #pod
  #pod     $response = $http->mirror($url, $file, \%options)
  #pod     if ( $response->{success} ) {
  #pod         print "$file is up to date\n";
  #pod     }
  #pod
  #pod Executes a C<GET> request for the URL and saves the response body to the file
  #pod name provided.  The URL must have unsafe characters escaped and international
  #pod domain names encoded.  If the file already exists, the request will include an
  #pod C<If-Modified-Since> header with the modification timestamp of the file.  You
  #pod may specify a different C<If-Modified-Since> header yourself in the C<<
  #pod $options->{headers} >> hash.
  #pod
  #pod The C<success> field of the response will be true if the status code is 2XX
  #pod or if the status code is 304 (unmodified).
  #pod
  #pod If the file was modified and the server response includes a properly
  #pod formatted C<Last-Modified> header, the file modification time will
  #pod be updated accordingly.
  #pod
  #pod =cut
  
  sub mirror {
      my ($self, $url, $file, $args) = @_;
      @_ == 3 || (@_ == 4 && ref $args eq 'HASH')
        or _croak(q/Usage: $http->mirror(URL, FILE, [HASHREF])/ . "\n");
  
      if ( exists $args->{headers} ) {
          my $headers = {};
          while ( my ($key, $value) = each %{$args->{headers} || {}} ) {
              $headers->{lc $key} = $value;
          }
          $args->{headers} = $headers;
      }
  
      if ( -e $file and my $mtime = (stat($file))[9] ) {
          $args->{headers}{'if-modified-since'} ||= $self->_http_date($mtime);
      }
      my $tempfile = $file . int(rand(2**31));
  
      require Fcntl;
      sysopen my $fh, $tempfile, Fcntl::O_CREAT()|Fcntl::O_EXCL()|Fcntl::O_WRONLY()
         or _croak(qq/Error: Could not create temporary file $tempfile for downloading: $!\n/);
      binmode $fh;
      $args->{data_callback} = sub { print {$fh} $_[0] };
      my $response = $self->request('GET', $url, $args);
      close $fh
          or _croak(qq/Error: Caught error closing temporary file $tempfile: $!\n/);
  
      if ( $response->{success} ) {
          rename $tempfile, $file
              or _croak(qq/Error replacing $file with $tempfile: $!\n/);
          my $lm = $response->{headers}{'last-modified'};
          if ( $lm and my $mtime = $self->_parse_http_date($lm) ) {
              utime $mtime, $mtime, $file;
          }
      }
      $response->{success} ||= $response->{status} eq '304';
      unlink $tempfile;
      return $response;
  }
  
  #pod =method request
  #pod
  #pod     $response = $http->request($method, $url);
  #pod     $response = $http->request($method, $url, \%options);
  #pod
  #pod Executes an HTTP request of the given method type ('GET', 'HEAD', 'POST',
  #pod 'PUT', etc.) on the given URL.  The URL must have unsafe characters escaped and
  #pod international domain names encoded.
  #pod
  #pod B<NOTE>: Method names are B<case-sensitive> per the HTTP/1.1 specification.
  #pod Don't use C<get> when you really want C<GET>.  See L<LIMITATIONS> for
  #pod how this applies to redirection.
  #pod
  #pod If the URL includes a "user:password" stanza, they will be used for Basic-style
  #pod authorization headers.  (Authorization headers will not be included in a
  #pod redirected request.) For example:
  #pod
  #pod     $http->request('GET', 'http://Aladdin:open sesame@example.com/');
  #pod
  #pod If the "user:password" stanza contains reserved characters, they must
  #pod be percent-escaped:
  #pod
  #pod     $http->request('GET', 'http://john%40example.com:password@example.com/');
  #pod
  #pod A hashref of options may be appended to modify the request.
  #pod
  #pod Valid options are:
  #pod
  #pod =for :list
  #pod * C<headers> —
  #pod     A hashref containing headers to include with the request.  If the value for
  #pod     a header is an array reference, the header will be output multiple times with
  #pod     each value in the array.  These headers over-write any default headers.
  #pod * C<content> —
  #pod     A scalar to include as the body of the request OR a code reference
  #pod     that will be called iteratively to produce the body of the request
  #pod * C<trailer_callback> —
  #pod     A code reference that will be called if it exists to provide a hashref
  #pod     of trailing headers (only used with chunked transfer-encoding)
  #pod * C<data_callback> —
  #pod     A code reference that will be called for each chunks of the response
  #pod     body received.
  #pod * C<peer> —
  #pod     Override host resolution and force all connections to go only to a
  #pod     specific peer address, regardless of the URL of the request.  This will
  #pod     include any redirections!  This options should be used with extreme
  #pod     caution (e.g. debugging or very special circumstances). It can be given as
  #pod     either a scalar or a code reference that will receive the hostname and
  #pod     whose response will be taken as the address.
  #pod
  #pod The C<Host> header is generated from the URL in accordance with RFC 2616.  It
  #pod is a fatal error to specify C<Host> in the C<headers> option.  Other headers
  #pod may be ignored or overwritten if necessary for transport compliance.
  #pod
  #pod If the C<content> option is a code reference, it will be called iteratively
  #pod to provide the content body of the request.  It should return the empty
  #pod string or undef when the iterator is exhausted.
  #pod
  #pod If the C<content> option is the empty string, no C<content-type> or
  #pod C<content-length> headers will be generated.
  #pod
  #pod If the C<data_callback> option is provided, it will be called iteratively until
  #pod the entire response body is received.  The first argument will be a string
  #pod containing a chunk of the response body, the second argument will be the
  #pod in-progress response hash reference, as described below.  (This allows
  #pod customizing the action of the callback based on the C<status> or C<headers>
  #pod received prior to the content body.)
  #pod
  #pod The C<request> method returns a hashref containing the response.  The hashref
  #pod will have the following keys:
  #pod
  #pod =for :list
  #pod * C<success> —
  #pod     Boolean indicating whether the operation returned a 2XX status code
  #pod * C<url> —
  #pod     URL that provided the response. This is the URL of the request unless
  #pod     there were redirections, in which case it is the last URL queried
  #pod     in a redirection chain
  #pod * C<status> —
  #pod     The HTTP status code of the response
  #pod * C<reason> —
  #pod     The response phrase returned by the server
  #pod * C<content> —
  #pod     The body of the response.  If the response does not have any content
  #pod     or if a data callback is provided to consume the response body,
  #pod     this will be the empty string
  #pod * C<headers> —
  #pod     A hashref of header fields.  All header field names will be normalized
  #pod     to be lower case. If a header is repeated, the value will be an arrayref;
  #pod     it will otherwise be a scalar string containing the value
  #pod * C<protocol> -
  #pod     If this field exists, it is the protocol of the response
  #pod     such as HTTP/1.0 or HTTP/1.1
  #pod * C<redirects>
  #pod     If this field exists, it is an arrayref of response hash references from
  #pod     redirects in the same order that redirections occurred.  If it does
  #pod     not exist, then no redirections occurred.
  #pod
  #pod On an exception during the execution of the request, the C<status> field will
  #pod contain 599, and the C<content> field will contain the text of the exception.
  #pod
  #pod =cut
  
  my %idempotent = map { $_ => 1 } qw/GET HEAD PUT DELETE OPTIONS TRACE/;
  
  sub request {
      my ($self, $method, $url, $args) = @_;
      @_ == 3 || (@_ == 4 && ref $args eq 'HASH')
        or _croak(q/Usage: $http->request(METHOD, URL, [HASHREF])/ . "\n");
      $args ||= {}; # we keep some state in this during _request
  
      # RFC 2616 Section 8.1.4 mandates a single retry on broken socket
      my $response;
      for ( 0 .. 1 ) {
          $response = eval { $self->_request($method, $url, $args) };
          last unless $@ && $idempotent{$method}
              && $@ =~ m{^(?:Socket closed|Unexpected end)};
      }
  
      if (my $e = $@) {
          # maybe we got a response hash thrown from somewhere deep
          if ( ref $e eq 'HASH' && exists $e->{status} ) {
              $e->{redirects} = delete $args->{_redirects} if @{ $args->{_redirects} || []};
              return $e;
          }
  
          # otherwise, stringify it
          $e = "$e";
          $response = {
              url     => $url,
              success => q{},
              status  => 599,
              reason  => 'Internal Exception',
              content => $e,
              headers => {
                  'content-type'   => 'text/plain',
                  'content-length' => length $e,
              },
              ( @{$args->{_redirects} || []} ? (redirects => delete $args->{_redirects}) : () ),
          };
      }
      return $response;
  }
  
  #pod =method www_form_urlencode
  #pod
  #pod     $params = $http->www_form_urlencode( $data );
  #pod     $response = $http->get("http://example.com/query?$params");
  #pod
  #pod This method converts the key/value pairs from a data hash or array reference
  #pod into a C<x-www-form-urlencoded> string.  The keys and values from the data
  #pod reference will be UTF-8 encoded and escaped per RFC 3986.  If a value is an
  #pod array reference, the key will be repeated with each of the values of the array
  #pod reference.  If data is provided as a hash reference, the key/value pairs in the
  #pod resulting string will be sorted by key and value for consistent ordering.
  #pod
  #pod =cut
  
  sub www_form_urlencode {
      my ($self, $data) = @_;
      (@_ == 2 && ref $data)
          or _croak(q/Usage: $http->www_form_urlencode(DATAREF)/ . "\n");
      (ref $data eq 'HASH' || ref $data eq 'ARRAY')
          or _croak("form data must be a hash or array reference\n");
  
      my @params = ref $data eq 'HASH' ? %$data : @$data;
      @params % 2 == 0
          or _croak("form data reference must have an even number of terms\n");
  
      my @terms;
      while( @params ) {
          my ($key, $value) = splice(@params, 0, 2);
          if ( ref $value eq 'ARRAY' ) {
              unshift @params, map { $key => $_ } @$value;
          }
          else {
              push @terms, join("=", map { $self->_uri_escape($_) } $key, $value);
          }
      }
  
      return join("&", (ref $data eq 'ARRAY') ? (@terms) : (sort @terms) );
  }
  
  #pod =method can_ssl
  #pod
  #pod     $ok         = HTTP::Tiny->can_ssl;
  #pod     ($ok, $why) = HTTP::Tiny->can_ssl;
  #pod     ($ok, $why) = $http->can_ssl;
  #pod
  #pod Indicates if SSL support is available.  When called as a class object, it
  #pod checks for the correct version of L<Net::SSLeay> and L<IO::Socket::SSL>.
  #pod When called as an object methods, if C<SSL_verify> is true or if C<SSL_verify_mode>
  #pod is set in C<SSL_options>, it checks that a CA file is available.
  #pod
  #pod In scalar context, returns a boolean indicating if SSL is available.
  #pod In list context, returns the boolean and a (possibly multi-line) string of
  #pod errors indicating why SSL isn't available.
  #pod
  #pod =cut
  
  sub can_ssl {
      my ($self) = @_;
  
      my($ok, $reason) = (1, '');
  
      # Need IO::Socket::SSL 1.42 for SSL_create_ctx_callback
      local @INC = @INC;
      pop @INC if $INC[-1] eq '.';
      unless (eval {require IO::Socket::SSL; IO::Socket::SSL->VERSION(1.42)}) {
          $ok = 0;
          $reason .= qq/IO::Socket::SSL 1.42 must be installed for https support\n/;
      }
  
      # Need Net::SSLeay 1.49 for MODE_AUTO_RETRY
      unless (eval {require Net::SSLeay; Net::SSLeay->VERSION(1.49)}) {
          $ok = 0;
          $reason .= qq/Net::SSLeay 1.49 must be installed for https support\n/;
      }
  
      # If an object, check that SSL config lets us get a CA if necessary
      if ( ref($self) && ( $self->{verify_SSL} || $self->{SSL_options}{SSL_verify_mode} ) ) {
          my $handle = HTTP::Tiny::Handle->new(
              SSL_options => $self->{SSL_options},
              verify_SSL  => $self->{verify_SSL},
          );
          unless ( eval { $handle->_find_CA_file; 1 } ) {
              $ok = 0;
              $reason .= "$@";
          }
      }
  
      wantarray ? ($ok, $reason) : $ok;
  }
  
  #pod =method connected
  #pod
  #pod     $host = $http->connected;
  #pod     ($host, $port) = $http->connected;
  #pod
  #pod Indicates if a connection to a peer is being kept alive, per the C<keep_alive>
  #pod option.
  #pod
  #pod In scalar context, returns the peer host and port, joined with a colon, or
  #pod C<undef> (if no peer is connected).
  #pod In list context, returns the peer host and port or an empty list (if no peer
  #pod is connected).
  #pod
  #pod B<Note>: This method cannot reliably be used to discover whether the remote
  #pod host has closed its end of the socket.
  #pod
  #pod =cut
  
  sub connected {
      my ($self) = @_;
  
      # If a socket exists...
      if ($self->{handle} && $self->{handle}{fh}) {
          my $socket = $self->{handle}{fh};
  
          # ...and is connected, return the peer host and port.
          if ($socket->connected) {
              return wantarray
                  ? ($socket->peerhost, $socket->peerport)
                  : join(':', $socket->peerhost, $socket->peerport);
          }
      }
      return;
  }
  
  #--------------------------------------------------------------------------#
  # private methods
  #--------------------------------------------------------------------------#
  
  my %DefaultPort = (
      http => 80,
      https => 443,
  );
  
  sub _agent {
      my $class = ref($_[0]) || $_[0];
      (my $default_agent = $class) =~ s{::}{-}g;
      return $default_agent . "/" . $class->VERSION;
  }
  
  sub _request {
      my ($self, $method, $url, $args) = @_;
  
      my ($scheme, $host, $port, $path_query, $auth) = $self->_split_url($url);
  
      my $request = {
          method    => $method,
          scheme    => $scheme,
          host      => $host,
          port      => $port,
          host_port => ($port == $DefaultPort{$scheme} ? $host : "$host:$port"),
          uri       => $path_query,
          headers   => {},
      };
  
      my $peer = $args->{peer} || $host;
  
      # Allow 'peer' to be a coderef.
      if ('CODE' eq ref $peer) {
          $peer = $peer->($host);
      }
  
      # We remove the cached handle so it is not reused in the case of redirect.
      # If all is well, it will be recached at the end of _request.  We only
      # reuse for the same scheme, host and port
      my $handle = delete $self->{handle};
      if ( $handle ) {
          unless ( $handle->can_reuse( $scheme, $host, $port, $peer ) ) {
              $handle->close;
              undef $handle;
          }
      }
      $handle ||= $self->_open_handle( $request, $scheme, $host, $port, $peer );
  
      $self->_prepare_headers_and_cb($request, $args, $url, $auth);
      $handle->write_request($request);
  
      my $response;
      do { $response = $handle->read_response_header }
          until (substr($response->{status},0,1) ne '1');
  
      $self->_update_cookie_jar( $url, $response ) if $self->{cookie_jar};
      my @redir_args = $self->_maybe_redirect($request, $response, $args);
  
      my $known_message_length;
      if ($method eq 'HEAD' || $response->{status} =~ /^[23]04/) {
          # response has no message body
          $known_message_length = 1;
      }
      else {
          # Ignore any data callbacks during redirection.
          my $cb_args = @redir_args ? +{} : $args;
          my $data_cb = $self->_prepare_data_cb($response, $cb_args);
          $known_message_length = $handle->read_body($data_cb, $response);
      }
  
      if ( $self->{keep_alive}
          && $known_message_length
          && $response->{protocol} eq 'HTTP/1.1'
          && ($response->{headers}{connection} || '') ne 'close'
      ) {
          $self->{handle} = $handle;
      }
      else {
          $handle->close;
      }
  
      $response->{success} = substr( $response->{status}, 0, 1 ) eq '2';
      $response->{url} = $url;
  
      # Push the current response onto the stack of redirects if redirecting.
      if (@redir_args) {
          push @{$args->{_redirects}}, $response;
          return $self->_request(@redir_args, $args);
      }
  
      # Copy the stack of redirects into the response before returning.
      $response->{redirects} = delete $args->{_redirects}
        if @{$args->{_redirects}};
      return $response;
  }
  
  sub _open_handle {
      my ($self, $request, $scheme, $host, $port, $peer) = @_;
  
      my $handle  = HTTP::Tiny::Handle->new(
          timeout         => $self->{timeout},
          SSL_options     => $self->{SSL_options},
          verify_SSL      => $self->{verify_SSL},
          local_address   => $self->{local_address},
          keep_alive      => $self->{keep_alive}
      );
  
      if ($self->{_has_proxy}{$scheme} && ! grep { $host =~ /\Q$_\E$/ } @{$self->{no_proxy}}) {
          return $self->_proxy_connect( $request, $handle );
      }
      else {
          return $handle->connect($scheme, $host, $port, $peer);
      }
  }
  
  sub _proxy_connect {
      my ($self, $request, $handle) = @_;
  
      my @proxy_vars;
      if ( $request->{scheme} eq 'https' ) {
          _croak(qq{No https_proxy defined}) unless $self->{https_proxy};
          @proxy_vars = $self->_split_proxy( https_proxy => $self->{https_proxy} );
          if ( $proxy_vars[0] eq 'https' ) {
              _croak(qq{Can't proxy https over https: $request->{uri} via $self->{https_proxy}});
          }
      }
      else {
          _croak(qq{No http_proxy defined}) unless $self->{http_proxy};
          @proxy_vars = $self->_split_proxy( http_proxy => $self->{http_proxy} );
      }
  
      my ($p_scheme, $p_host, $p_port, $p_auth) = @proxy_vars;
  
      if ( length $p_auth && ! defined $request->{headers}{'proxy-authorization'} ) {
          $self->_add_basic_auth_header( $request, 'proxy-authorization' => $p_auth );
      }
  
      $handle->connect($p_scheme, $p_host, $p_port, $p_host);
  
      if ($request->{scheme} eq 'https') {
          $self->_create_proxy_tunnel( $request, $handle );
      }
      else {
          # non-tunneled proxy requires absolute URI
          $request->{uri} = "$request->{scheme}://$request->{host_port}$request->{uri}";
      }
  
      return $handle;
  }
  
  sub _split_proxy {
      my ($self, $type, $proxy) = @_;
  
      my ($scheme, $host, $port, $path_query, $auth) = eval { $self->_split_url($proxy) };
  
      unless(
          defined($scheme) && length($scheme) && length($host) && length($port)
          && $path_query eq '/'
      ) {
          _croak(qq{$type URL must be in format http[s]://[auth@]<host>:<port>/\n});
      }
  
      return ($scheme, $host, $port, $auth);
  }
  
  sub _create_proxy_tunnel {
      my ($self, $request, $handle) = @_;
  
      $handle->_assert_ssl;
  
      my $agent = exists($request->{headers}{'user-agent'})
          ? $request->{headers}{'user-agent'} : $self->{agent};
  
      my $connect_request = {
          method    => 'CONNECT',
          uri       => "$request->{host}:$request->{port}",
          headers   => {
              host => "$request->{host}:$request->{port}",
              'user-agent' => $agent,
          }
      };
  
      if ( $request->{headers}{'proxy-authorization'} ) {
          $connect_request->{headers}{'proxy-authorization'} =
              delete $request->{headers}{'proxy-authorization'};
      }
  
      $handle->write_request($connect_request);
      my $response;
      do { $response = $handle->read_response_header }
          until (substr($response->{status},0,1) ne '1');
  
      # if CONNECT failed, throw the response so it will be
      # returned from the original request() method;
      unless (substr($response->{status},0,1) eq '2') {
          die $response;
      }
  
      # tunnel established, so start SSL handshake
      $handle->start_ssl( $request->{host} );
  
      return;
  }
  
  sub _prepare_headers_and_cb {
      my ($self, $request, $args, $url, $auth) = @_;
  
      for ($self->{default_headers}, $args->{headers}) {
          next unless defined;
          while (my ($k, $v) = each %$_) {
              $request->{headers}{lc $k} = $v;
              $request->{header_case}{lc $k} = $k;
          }
      }
  
      if (exists $request->{headers}{'host'}) {
          die(qq/The 'Host' header must not be provided as header option\n/);
      }
  
      $request->{headers}{'host'}         = $request->{host_port};
      $request->{headers}{'user-agent'} ||= $self->{agent};
      $request->{headers}{'connection'}   = "close"
          unless $self->{keep_alive};
  
      if ( defined $args->{content} ) {
          if (ref $args->{content} eq 'CODE') {
              $request->{headers}{'content-type'} ||= "application/octet-stream";
              $request->{headers}{'transfer-encoding'} = 'chunked'
                unless $request->{headers}{'content-length'}
                    || $request->{headers}{'transfer-encoding'};
              $request->{cb} = $args->{content};
          }
          elsif ( length $args->{content} ) {
              my $content = $args->{content};
              if ( $] ge '5.008' ) {
                  utf8::downgrade($content, 1)
                      or die(qq/Wide character in request message body\n/);
              }
              $request->{headers}{'content-type'} ||= "application/octet-stream";
              $request->{headers}{'content-length'} = length $content
                unless $request->{headers}{'content-length'}
                    || $request->{headers}{'transfer-encoding'};
              $request->{cb} = sub { substr $content, 0, length $content, '' };
          }
          $request->{trailer_cb} = $args->{trailer_callback}
              if ref $args->{trailer_callback} eq 'CODE';
      }
  
      ### If we have a cookie jar, then maybe add relevant cookies
      if ( $self->{cookie_jar} ) {
          my $cookies = $self->cookie_jar->cookie_header( $url );
          $request->{headers}{cookie} = $cookies if length $cookies;
      }
  
      # if we have Basic auth parameters, add them
      if ( length $auth && ! defined $request->{headers}{authorization} ) {
          $self->_add_basic_auth_header( $request, 'authorization' => $auth );
      }
  
      return;
  }
  
  sub _add_basic_auth_header {
      my ($self, $request, $header, $auth) = @_;
      require MIME::Base64;
      $request->{headers}{$header} =
          "Basic " . MIME::Base64::encode_base64($auth, "");
      return;
  }
  
  sub _prepare_data_cb {
      my ($self, $response, $args) = @_;
      my $data_cb = $args->{data_callback};
      $response->{content} = '';
  
      if (!$data_cb || $response->{status} !~ /^2/) {
          if (defined $self->{max_size}) {
              $data_cb = sub {
                  $_[1]->{content} .= $_[0];
                  die(qq/Size of response body exceeds the maximum allowed of $self->{max_size}\n/)
                    if length $_[1]->{content} > $self->{max_size};
              };
          }
          else {
              $data_cb = sub { $_[1]->{content} .= $_[0] };
          }
      }
      return $data_cb;
  }
  
  sub _update_cookie_jar {
      my ($self, $url, $response) = @_;
  
      my $cookies = $response->{headers}->{'set-cookie'};
      return unless defined $cookies;
  
      my @cookies = ref $cookies ? @$cookies : $cookies;
  
      $self->cookie_jar->add( $url, $_ ) for @cookies;
  
      return;
  }
  
  sub _validate_cookie_jar {
      my ($class, $jar) = @_;
  
      # duck typing
      for my $method ( qw/add cookie_header/ ) {
          _croak(qq/Cookie jar must provide the '$method' method\n/)
              unless ref($jar) && ref($jar)->can($method);
      }
  
      return;
  }
  
  sub _maybe_redirect {
      my ($self, $request, $response, $args) = @_;
      my $headers = $response->{headers};
      my ($status, $method) = ($response->{status}, $request->{method});
      $args->{_redirects} ||= [];
  
      if (($status eq '303' or ($status =~ /^30[1278]/ && $method =~ /^GET|HEAD$/))
          and $headers->{location}
          and @{$args->{_redirects}} < $self->{max_redirect}
      ) {
          my $location = ($headers->{location} =~ /^\//)
              ? "$request->{scheme}://$request->{host_port}$headers->{location}"
              : $headers->{location} ;
          return (($status eq '303' ? 'GET' : $method), $location);
      }
      return;
  }
  
  sub _split_url {
      my $url = pop;
  
      # URI regex adapted from the URI module
      my ($scheme, $host, $path_query) = $url =~ m<\A([^:/?#]+)://([^/?#]*)([^#]*)>
        or die(qq/Cannot parse URL: '$url'\n/);
  
      $scheme     = lc $scheme;
      $path_query = "/$path_query" unless $path_query =~ m<\A/>;
  
      my $auth = '';
      if ( (my $i = index $host, '@') != -1 ) {
          # user:pass@host
          $auth = substr $host, 0, $i, ''; # take up to the @ for auth
          substr $host, 0, 1, '';          # knock the @ off the host
  
          # userinfo might be percent escaped, so recover real auth info
          $auth =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg;
      }
      my $port = $host =~ s/:(\d*)\z// && length $1 ? $1
               : $scheme eq 'http'                  ? 80
               : $scheme eq 'https'                 ? 443
               : undef;
  
      return ($scheme, (length $host ? lc $host : "localhost") , $port, $path_query, $auth);
  }
  
  # Date conversions adapted from HTTP::Date
  my $DoW = "Sun|Mon|Tue|Wed|Thu|Fri|Sat";
  my $MoY = "Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec";
  sub _http_date {
      my ($sec, $min, $hour, $mday, $mon, $year, $wday) = gmtime($_[1]);
      return sprintf("%s, %02d %s %04d %02d:%02d:%02d GMT",
          substr($DoW,$wday*4,3),
          $mday, substr($MoY,$mon*4,3), $year+1900,
          $hour, $min, $sec
      );
  }
  
  sub _parse_http_date {
      my ($self, $str) = @_;
      require Time::Local;
      my @tl_parts;
      if ($str =~ /^[SMTWF][a-z]+, +(\d{1,2}) ($MoY) +(\d\d\d\d) +(\d\d):(\d\d):(\d\d) +GMT$/) {
          @tl_parts = ($6, $5, $4, $1, (index($MoY,$2)/4), $3);
      }
      elsif ($str =~ /^[SMTWF][a-z]+, +(\d\d)-($MoY)-(\d{2,4}) +(\d\d):(\d\d):(\d\d) +GMT$/ ) {
          @tl_parts = ($6, $5, $4, $1, (index($MoY,$2)/4), $3);
      }
      elsif ($str =~ /^[SMTWF][a-z]+ +($MoY) +(\d{1,2}) +(\d\d):(\d\d):(\d\d) +(?:[^0-9]+ +)?(\d\d\d\d)$/ ) {
          @tl_parts = ($5, $4, $3, $2, (index($MoY,$1)/4), $6);
      }
      return eval {
          my $t = @tl_parts ? Time::Local::timegm(@tl_parts) : -1;
          $t < 0 ? undef : $t;
      };
  }
  
  # URI escaping adapted from URI::Escape
  # c.f. http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4.1
  # perl 5.6 ready UTF-8 encoding adapted from JSON::PP
  my %escapes = map { chr($_) => sprintf("%%%02X", $_) } 0..255;
  $escapes{' '}="+";
  my $unsafe_char = qr/[^A-Za-z0-9\-\._~]/;
  
  sub _uri_escape {
      my ($self, $str) = @_;
      if ( $] ge '5.008' ) {
          utf8::encode($str);
      }
      else {
          $str = pack("U*", unpack("C*", $str)) # UTF-8 encode a byte string
              if ( length $str == do { use bytes; length $str } );
          $str = pack("C*", unpack("C*", $str)); # clear UTF-8 flag
      }
      $str =~ s/($unsafe_char)/$escapes{$1}/g;
      return $str;
  }
  
  package
      HTTP::Tiny::Handle; # hide from PAUSE/indexers
  use strict;
  use warnings;
  
  use Errno      qw[EINTR EPIPE];
  use IO::Socket qw[SOCK_STREAM];
  use Socket     qw[SOL_SOCKET SO_KEEPALIVE];
  
  # PERL_HTTP_TINY_IPV4_ONLY is a private environment variable to force old
  # behavior if someone is unable to boostrap CPAN from a new perl install; it is
  # not intended for general, per-client use and may be removed in the future
  my $SOCKET_CLASS =
      $ENV{PERL_HTTP_TINY_IPV4_ONLY} ? 'IO::Socket::INET' :
      eval { require IO::Socket::IP; IO::Socket::IP->VERSION(0.25) } ? 'IO::Socket::IP' :
      'IO::Socket::INET';
  
  sub BUFSIZE () { 32768 } ## no critic
  
  my $Printable = sub {
      local $_ = shift;
      s/\r/\\r/g;
      s/\n/\\n/g;
      s/\t/\\t/g;
      s/([^\x20-\x7E])/sprintf('\\x%.2X', ord($1))/ge;
      $_;
  };
  
  my $Token = qr/[\x21\x23-\x27\x2A\x2B\x2D\x2E\x30-\x39\x41-\x5A\x5E-\x7A\x7C\x7E]/;
  my $Field_Content = qr/[[:print:]]+ (?: [\x20\x09]+ [[:print:]]+ )*/x;
  
  sub new {
      my ($class, %args) = @_;
      return bless {
          rbuf             => '',
          timeout          => 60,
          max_line_size    => 16384,
          max_header_lines => 64,
          verify_SSL       => 0,
          SSL_options      => {},
          %args
      }, $class;
  }
  
  sub timeout {
      my ($self, $timeout) = @_;
      if ( @_ > 1 ) {
          $self->{timeout} = $timeout;
          if ( $self->{fh} && $self->{fh}->can('timeout') ) {
              $self->{fh}->timeout($timeout);
          }
      }
      return $self->{timeout};
  }
  
  sub connect {
      @_ == 5 || die(q/Usage: $handle->connect(scheme, host, port, peer)/ . "\n");
      my ($self, $scheme, $host, $port, $peer) = @_;
  
      if ( $scheme eq 'https' ) {
          $self->_assert_ssl;
      }
      elsif ( $scheme ne 'http' ) {
        die(qq/Unsupported URL scheme '$scheme'\n/);
      }
      $self->{fh} = $SOCKET_CLASS->new(
          PeerHost  => $peer,
          PeerPort  => $port,
          $self->{local_address} ?
              ( LocalAddr => $self->{local_address} ) : (),
          Proto     => 'tcp',
          Type      => SOCK_STREAM,
          Timeout   => $self->{timeout},
      ) or die(qq/Could not connect to '$host:$port': $@\n/);
  
      binmode($self->{fh})
        or die(qq/Could not binmode() socket: '$!'\n/);
  
      if ( $self->{keep_alive} ) {
          unless ( defined( $self->{fh}->setsockopt( SOL_SOCKET, SO_KEEPALIVE, 1 ) ) ) {
              CORE::close($self->{fh});
              die(qq/Could not set SO_KEEPALIVE on socket: '$!'\n/);
          }
      }
  
      $self->start_ssl($host) if $scheme eq 'https';
  
      $self->{scheme} = $scheme;
      $self->{host} = $host;
      $self->{peer} = $peer;
      $self->{port} = $port;
      $self->{pid} = $$;
      $self->{tid} = _get_tid();
  
      return $self;
  }
  
  sub start_ssl {
      my ($self, $host) = @_;
  
      # As this might be used via CONNECT after an SSL session
      # to a proxy, we shut down any existing SSL before attempting
      # the handshake
      if ( ref($self->{fh}) eq 'IO::Socket::SSL' ) {
          unless ( $self->{fh}->stop_SSL ) {
              my $ssl_err = IO::Socket::SSL->errstr;
              die(qq/Error halting prior SSL connection: $ssl_err/);
          }
      }
  
      my $ssl_args = $self->_ssl_args($host);
      IO::Socket::SSL->start_SSL(
          $self->{fh},
          %$ssl_args,
          SSL_create_ctx_callback => sub {
              my $ctx = shift;
              Net::SSLeay::CTX_set_mode($ctx, Net::SSLeay::MODE_AUTO_RETRY());
          },
      );
  
      unless ( ref($self->{fh}) eq 'IO::Socket::SSL' ) {
          my $ssl_err = IO::Socket::SSL->errstr;
          die(qq/SSL connection failed for $host: $ssl_err\n/);
      }
  }
  
  sub close {
      @_ == 1 || die(q/Usage: $handle->close()/ . "\n");
      my ($self) = @_;
      CORE::close($self->{fh})
        or die(qq/Could not close socket: '$!'\n/);
  }
  
  sub write {
      @_ == 2 || die(q/Usage: $handle->write(buf)/ . "\n");
      my ($self, $buf) = @_;
  
      if ( $] ge '5.008' ) {
          utf8::downgrade($buf, 1)
              or die(qq/Wide character in write()\n/);
      }
  
      my $len = length $buf;
      my $off = 0;
  
      local $SIG{PIPE} = 'IGNORE';
  
      while () {
          $self->can_write
            or die(qq/Timed out while waiting for socket to become ready for writing\n/);
          my $r = syswrite($self->{fh}, $buf, $len, $off);
          if (defined $r) {
              $len -= $r;
              $off += $r;
              last unless $len > 0;
          }
          elsif ($! == EPIPE) {
              die(qq/Socket closed by remote server: $!\n/);
          }
          elsif ($! != EINTR) {
              if ($self->{fh}->can('errstr')){
                  my $err = $self->{fh}->errstr();
                  die (qq/Could not write to SSL socket: '$err'\n /);
              }
              else {
                  die(qq/Could not write to socket: '$!'\n/);
              }
  
          }
      }
      return $off;
  }
  
  sub read {
      @_ == 2 || @_ == 3 || die(q/Usage: $handle->read(len [, allow_partial])/ . "\n");
      my ($self, $len, $allow_partial) = @_;
  
      my $buf  = '';
      my $got = length $self->{rbuf};
  
      if ($got) {
          my $take = ($got < $len) ? $got : $len;
          $buf  = substr($self->{rbuf}, 0, $take, '');
          $len -= $take;
      }
  
      while ($len > 0) {
          $self->can_read
            or die(q/Timed out while waiting for socket to become ready for reading/ . "\n");
          my $r = sysread($self->{fh}, $buf, $len, length $buf);
          if (defined $r) {
              last unless $r;
              $len -= $r;
          }
          elsif ($! != EINTR) {
              if ($self->{fh}->can('errstr')){
                  my $err = $self->{fh}->errstr();
                  die (qq/Could not read from SSL socket: '$err'\n /);
              }
              else {
                  die(qq/Could not read from socket: '$!'\n/);
              }
          }
      }
      if ($len && !$allow_partial) {
          die(qq/Unexpected end of stream\n/);
      }
      return $buf;
  }
  
  sub readline {
      @_ == 1 || die(q/Usage: $handle->readline()/ . "\n");
      my ($self) = @_;
  
      while () {
          if ($self->{rbuf} =~ s/\A ([^\x0D\x0A]* \x0D?\x0A)//x) {
              return $1;
          }
          if (length $self->{rbuf} >= $self->{max_line_size}) {
              die(qq/Line size exceeds the maximum allowed size of $self->{max_line_size}\n/);
          }
          $self->can_read
            or die(qq/Timed out while waiting for socket to become ready for reading\n/);
          my $r = sysread($self->{fh}, $self->{rbuf}, BUFSIZE, length $self->{rbuf});
          if (defined $r) {
              last unless $r;
          }
          elsif ($! != EINTR) {
              if ($self->{fh}->can('errstr')){
                  my $err = $self->{fh}->errstr();
                  die (qq/Could not read from SSL socket: '$err'\n /);
              }
              else {
                  die(qq/Could not read from socket: '$!'\n/);
              }
          }
      }
      die(qq/Unexpected end of stream while looking for line\n/);
  }
  
  sub read_header_lines {
      @_ == 1 || @_ == 2 || die(q/Usage: $handle->read_header_lines([headers])/ . "\n");
      my ($self, $headers) = @_;
      $headers ||= {};
      my $lines   = 0;
      my $val;
  
      while () {
           my $line = $self->readline;
  
           if (++$lines >= $self->{max_header_lines}) {
               die(qq/Header lines exceeds maximum number allowed of $self->{max_header_lines}\n/);
           }
           elsif ($line =~ /\A ([^\x00-\x1F\x7F:]+) : [\x09\x20]* ([^\x0D\x0A]*)/x) {
               my ($field_name) = lc $1;
               if (exists $headers->{$field_name}) {
                   for ($headers->{$field_name}) {
                       $_ = [$_] unless ref $_ eq "ARRAY";
                       push @$_, $2;
                       $val = \$_->[-1];
                   }
               }
               else {
                   $val = \($headers->{$field_name} = $2);
               }
           }
           elsif ($line =~ /\A [\x09\x20]+ ([^\x0D\x0A]*)/x) {
               $val
                 or die(qq/Unexpected header continuation line\n/);
               next unless length $1;
               $$val .= ' ' if length $$val;
               $$val .= $1;
           }
           elsif ($line =~ /\A \x0D?\x0A \z/x) {
              last;
           }
           else {
              die(q/Malformed header line: / . $Printable->($line) . "\n");
           }
      }
      return $headers;
  }
  
  sub write_request {
      @_ == 2 || die(q/Usage: $handle->write_request(request)/ . "\n");
      my($self, $request) = @_;
      $self->write_request_header(@{$request}{qw/method uri headers header_case/});
      $self->write_body($request) if $request->{cb};
      return;
  }
  
  # Standard request header names/case from HTTP/1.1 RFCs
  my @rfc_request_headers = qw(
    Accept Accept-Charset Accept-Encoding Accept-Language Authorization
    Cache-Control Connection Content-Length Expect From Host
    If-Match If-Modified-Since If-None-Match If-Range If-Unmodified-Since
    Max-Forwards Pragma Proxy-Authorization Range Referer TE Trailer
    Transfer-Encoding Upgrade User-Agent Via
  );
  
  my @other_request_headers = qw(
    Content-Encoding Content-MD5 Content-Type Cookie DNT Date Origin
    X-XSS-Protection
  );
  
  my %HeaderCase = map { lc($_) => $_ } @rfc_request_headers, @other_request_headers;
  
  # to avoid multiple small writes and hence nagle, you can pass the method line or anything else to
  # combine writes.
  sub write_header_lines {
      (@_ >= 2 && @_ <= 4 && ref $_[1] eq 'HASH') || die(q/Usage: $handle->write_header_lines(headers, [header_case, prefix])/ . "\n");
      my($self, $headers, $header_case, $prefix_data) = @_;
      $header_case ||= {};
  
      my $buf = (defined $prefix_data ? $prefix_data : '');
  
      # Per RFC, control fields should be listed first
      my %seen;
      for my $k ( qw/host cache-control expect max-forwards pragma range te/ ) {
          next unless exists $headers->{$k};
          $seen{$k}++;
          my $field_name = $HeaderCase{$k};
          my $v = $headers->{$k};
          for (ref $v eq 'ARRAY' ? @$v : $v) {
              $_ = '' unless defined $_;
              $buf .= "$field_name: $_\x0D\x0A";
          }
      }
  
      # Other headers sent in arbitrary order
      while (my ($k, $v) = each %$headers) {
          my $field_name = lc $k;
          next if $seen{$field_name};
          if (exists $HeaderCase{$field_name}) {
              $field_name = $HeaderCase{$field_name};
          }
          else {
              if (exists $header_case->{$field_name}) {
                  $field_name = $header_case->{$field_name};
              }
              else {
                  $field_name =~ s/\b(\w)/\u$1/g;
              }
              $field_name =~ /\A $Token+ \z/xo
                or die(q/Invalid HTTP header field name: / . $Printable->($field_name) . "\n");
              $HeaderCase{lc $field_name} = $field_name;
          }
          for (ref $v eq 'ARRAY' ? @$v : $v) {
              # unwrap a field value if pre-wrapped by user
              s/\x0D?\x0A\s+/ /g;
              die(qq/Invalid HTTP header field value ($field_name): / . $Printable->($_). "\n")
                unless $_ eq '' || /\A $Field_Content \z/xo;
              $_ = '' unless defined $_;
              $buf .= "$field_name: $_\x0D\x0A";
          }
      }
      $buf .= "\x0D\x0A";
      return $self->write($buf);
  }
  
  # return value indicates whether message length was defined; this is generally
  # true unless there was no content-length header and we just read until EOF.
  # Other message length errors are thrown as exceptions
  sub read_body {
      @_ == 3 || die(q/Usage: $handle->read_body(callback, response)/ . "\n");
      my ($self, $cb, $response) = @_;
      my $te = $response->{headers}{'transfer-encoding'} || '';
      my $chunked = grep { /chunked/i } ( ref $te eq 'ARRAY' ? @$te : $te ) ;
      return $chunked
          ? $self->read_chunked_body($cb, $response)
          : $self->read_content_body($cb, $response);
  }
  
  sub write_body {
      @_ == 2 || die(q/Usage: $handle->write_body(request)/ . "\n");
      my ($self, $request) = @_;
      if ($request->{headers}{'content-length'}) {
          return $self->write_content_body($request);
      }
      else {
          return $self->write_chunked_body($request);
      }
  }
  
  sub read_content_body {
      @_ == 3 || @_ == 4 || die(q/Usage: $handle->read_content_body(callback, response, [read_length])/ . "\n");
      my ($self, $cb, $response, $content_length) = @_;
      $content_length ||= $response->{headers}{'content-length'};
  
      if ( defined $content_length ) {
          my $len = $content_length;
          while ($len > 0) {
              my $read = ($len > BUFSIZE) ? BUFSIZE : $len;
              $cb->($self->read($read, 0), $response);
              $len -= $read;
          }
          return length($self->{rbuf}) == 0;
      }
  
      my $chunk;
      $cb->($chunk, $response) while length( $chunk = $self->read(BUFSIZE, 1) );
  
      return;
  }
  
  sub write_content_body {
      @_ == 2 || die(q/Usage: $handle->write_content_body(request)/ . "\n");
      my ($self, $request) = @_;
  
      my ($len, $content_length) = (0, $request->{headers}{'content-length'});
      while () {
          my $data = $request->{cb}->();
  
          defined $data && length $data
            or last;
  
          if ( $] ge '5.008' ) {
              utf8::downgrade($data, 1)
                  or die(qq/Wide character in write_content()\n/);
          }
  
          $len += $self->write($data);
      }
  
      $len == $content_length
        or die(qq/Content-Length mismatch (got: $len expected: $content_length)\n/);
  
      return $len;
  }
  
  sub read_chunked_body {
      @_ == 3 || die(q/Usage: $handle->read_chunked_body(callback, $response)/ . "\n");
      my ($self, $cb, $response) = @_;
  
      while () {
          my $head = $self->readline;
  
          $head =~ /\A ([A-Fa-f0-9]+)/x
            or die(q/Malformed chunk head: / . $Printable->($head) . "\n");
  
          my $len = hex($1)
            or last;
  
          $self->read_content_body($cb, $response, $len);
  
          $self->read(2) eq "\x0D\x0A"
            or die(qq/Malformed chunk: missing CRLF after chunk data\n/);
      }
      $self->read_header_lines($response->{headers});
      return 1;
  }
  
  sub write_chunked_body {
      @_ == 2 || die(q/Usage: $handle->write_chunked_body(request)/ . "\n");
      my ($self, $request) = @_;
  
      my $len = 0;
      while () {
          my $data = $request->{cb}->();
  
          defined $data && length $data
            or last;
  
          if ( $] ge '5.008' ) {
              utf8::downgrade($data, 1)
                  or die(qq/Wide character in write_chunked_body()\n/);
          }
  
          $len += length $data;
  
          my $chunk  = sprintf '%X', length $data;
             $chunk .= "\x0D\x0A";
             $chunk .= $data;
             $chunk .= "\x0D\x0A";
  
          $self->write($chunk);
      }
      $self->write("0\x0D\x0A");
      if ( ref $request->{trailer_cb} eq 'CODE' ) {
          $self->write_header_lines($request->{trailer_cb}->())
      }
      else {
          $self->write("\x0D\x0A");
      }
      return $len;
  }
  
  sub read_response_header {
      @_ == 1 || die(q/Usage: $handle->read_response_header()/ . "\n");
      my ($self) = @_;
  
      my $line = $self->readline;
  
      $line =~ /\A (HTTP\/(0*\d+\.0*\d+)) [\x09\x20]+ ([0-9]{3}) [\x09\x20]+ ([^\x0D\x0A]*) \x0D?\x0A/x
        or die(q/Malformed Status-Line: / . $Printable->($line). "\n");
  
      my ($protocol, $version, $status, $reason) = ($1, $2, $3, $4);
  
      die (qq/Unsupported HTTP protocol: $protocol\n/)
          unless $version =~ /0*1\.0*[01]/;
  
      return {
          status       => $status,
          reason       => $reason,
          headers      => $self->read_header_lines,
          protocol     => $protocol,
      };
  }
  
  sub write_request_header {
      @_ == 5 || die(q/Usage: $handle->write_request_header(method, request_uri, headers, header_case)/ . "\n");
      my ($self, $method, $request_uri, $headers, $header_case) = @_;
  
      return $self->write_header_lines($headers, $header_case, "$method $request_uri HTTP/1.1\x0D\x0A");
  }
  
  sub _do_timeout {
      my ($self, $type, $timeout) = @_;
      $timeout = $self->{timeout}
          unless defined $timeout && $timeout >= 0;
  
      my $fd = fileno $self->{fh};
      defined $fd && $fd >= 0
        or die(qq/select(2): 'Bad file descriptor'\n/);
  
      my $initial = time;
      my $pending = $timeout;
      my $nfound;
  
      vec(my $fdset = '', $fd, 1) = 1;
  
      while () {
          $nfound = ($type eq 'read')
              ? select($fdset, undef, undef, $pending)
              : select(undef, $fdset, undef, $pending) ;
          if ($nfound == -1) {
              $! == EINTR
                or die(qq/select(2): '$!'\n/);
              redo if !$timeout || ($pending = $timeout - (time - $initial)) > 0;
              $nfound = 0;
          }
          last;
      }
      $! = 0;
      return $nfound;
  }
  
  sub can_read {
      @_ == 1 || @_ == 2 || die(q/Usage: $handle->can_read([timeout])/ . "\n");
      my $self = shift;
      if ( ref($self->{fh}) eq 'IO::Socket::SSL' ) {
          return 1 if $self->{fh}->pending;
      }
      return $self->_do_timeout('read', @_)
  }
  
  sub can_write {
      @_ == 1 || @_ == 2 || die(q/Usage: $handle->can_write([timeout])/ . "\n");
      my $self = shift;
      return $self->_do_timeout('write', @_)
  }
  
  sub _assert_ssl {
      my($ok, $reason) = HTTP::Tiny->can_ssl();
      die $reason unless $ok;
  }
  
  sub can_reuse {
      my ($self,$scheme,$host,$port,$peer) = @_;
      return 0 if
          $self->{pid} != $$
          || $self->{tid} != _get_tid()
          || length($self->{rbuf})
          || $scheme ne $self->{scheme}
          || $host ne $self->{host}
          || $port ne $self->{port}
          || $peer ne $self->{peer}
          || eval { $self->can_read(0) }
          || $@ ;
          return 1;
  }
  
  # Try to find a CA bundle to validate the SSL cert,
  # prefer Mozilla::CA or fallback to a system file
  sub _find_CA_file {
      my $self = shift();
  
      my $ca_file =
        defined( $self->{SSL_options}->{SSL_ca_file} )
        ? $self->{SSL_options}->{SSL_ca_file}
        : $ENV{SSL_CERT_FILE};
  
      if ( defined $ca_file ) {
          unless ( -r $ca_file ) {
              die qq/SSL_ca_file '$ca_file' not found or not readable\n/;
          }
          return $ca_file;
      }
  
      local @INC = @INC;
      pop @INC if $INC[-1] eq '.';
      return Mozilla::CA::SSL_ca_file()
          if eval { require Mozilla::CA; 1 };
  
      # cert list copied from golang src/crypto/x509/root_unix.go
      foreach my $ca_bundle (
          "/etc/ssl/certs/ca-certificates.crt",     # Debian/Ubuntu/Gentoo etc.
          "/etc/pki/tls/certs/ca-bundle.crt",       # Fedora/RHEL
          "/etc/ssl/ca-bundle.pem",                 # OpenSUSE
          "/etc/openssl/certs/ca-certificates.crt", # NetBSD
          "/etc/ssl/cert.pem",                      # OpenBSD
          "/usr/local/share/certs/ca-root-nss.crt", # FreeBSD/DragonFly
          "/etc/pki/tls/cacert.pem",                # OpenELEC
          "/etc/certs/ca-certificates.crt",         # Solaris 11.2+
      ) {
          return $ca_bundle if -e $ca_bundle;
      }
  
      die qq/Couldn't find a CA bundle with which to verify the SSL certificate.\n/
        . qq/Try installing Mozilla::CA from CPAN\n/;
  }
  
  # for thread safety, we need to know thread id if threads are loaded
  sub _get_tid {
      no warnings 'reserved'; # for 'threads'
      return threads->can("tid") ? threads->tid : 0;
  }
  
  sub _ssl_args {
      my ($self, $host) = @_;
  
      my %ssl_args;
  
      # This test reimplements IO::Socket::SSL::can_client_sni(), which wasn't
      # added until IO::Socket::SSL 1.84
      if ( Net::SSLeay::OPENSSL_VERSION_NUMBER() >= 0x01000000 ) {
          $ssl_args{SSL_hostname} = $host,          # Sane SNI support
      }
  
      if ($self->{verify_SSL}) {
          $ssl_args{SSL_verifycn_scheme}  = 'http'; # enable CN validation
          $ssl_args{SSL_verifycn_name}    = $host;  # set validation hostname
          $ssl_args{SSL_verify_mode}      = 0x01;   # enable cert validation
          $ssl_args{SSL_ca_file}          = $self->_find_CA_file;
      }
      else {
          $ssl_args{SSL_verifycn_scheme}  = 'none'; # disable CN validation
          $ssl_args{SSL_verify_mode}      = 0x00;   # disable cert validation
      }
  
      # user options override settings from verify_SSL
      for my $k ( keys %{$self->{SSL_options}} ) {
          $ssl_args{$k} = $self->{SSL_options}{$k} if $k =~ m/^SSL_/;
      }
  
      return \%ssl_args;
  }
  
  1;
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  HTTP::Tiny - A small, simple, correct HTTP/1.1 client
  
  =head1 VERSION
  
  version 0.076
  
  =head1 SYNOPSIS
  
      use HTTP::Tiny;
  
      my $response = HTTP::Tiny->new->get('http://example.com/');
  
      die "Failed!\n" unless $response->{success};
  
      print "$response->{status} $response->{reason}\n";
  
      while (my ($k, $v) = each %{$response->{headers}}) {
          for (ref $v eq 'ARRAY' ? @$v : $v) {
              print "$k: $_\n";
          }
      }
  
      print $response->{content} if length $response->{content};
  
  =head1 DESCRIPTION
  
  This is a very simple HTTP/1.1 client, designed for doing simple
  requests without the overhead of a large framework like L<LWP::UserAgent>.
  
  It is more correct and more complete than L<HTTP::Lite>.  It supports
  proxies and redirection.  It also correctly resumes after EINTR.
  
  If L<IO::Socket::IP> 0.25 or later is installed, HTTP::Tiny will use it instead
  of L<IO::Socket::INET> for transparent support for both IPv4 and IPv6.
  
  Cookie support requires L<HTTP::CookieJar> or an equivalent class.
  
  =head1 METHODS
  
  =head2 new
  
      $http = HTTP::Tiny->new( %attributes );
  
  This constructor returns a new HTTP::Tiny object.  Valid attributes include:
  
  =over 4
  
  =item *
  
  C<agent> — A user-agent string (defaults to 'HTTP-Tiny/$VERSION'). If C<agent> — ends in a space character, the default user-agent string is appended.
  
  =item *
  
  C<cookie_jar> — An instance of L<HTTP::CookieJar> — or equivalent class that supports the C<add> and C<cookie_header> methods
  
  =item *
  
  C<default_headers> — A hashref of default headers to apply to requests
  
  =item *
  
  C<local_address> — The local IP address to bind to
  
  =item *
  
  C<keep_alive> — Whether to reuse the last connection (if for the same scheme, host and port) (defaults to 1)
  
  =item *
  
  C<max_redirect> — Maximum number of redirects allowed (defaults to 5)
  
  =item *
  
  C<max_size> — Maximum response size in bytes (only when not using a data callback).  If defined, responses larger than this will return an exception.
  
  =item *
  
  C<http_proxy> — URL of a proxy server to use for HTTP connections (default is C<$ENV{http_proxy}> — if set)
  
  =item *
  
  C<https_proxy> — URL of a proxy server to use for HTTPS connections (default is C<$ENV{https_proxy}> — if set)
  
  =item *
  
  C<proxy> — URL of a generic proxy server for both HTTP and HTTPS connections (default is C<$ENV{all_proxy}> — if set)
  
  =item *
  
  C<no_proxy> — List of domain suffixes that should not be proxied.  Must be a comma-separated string or an array reference. (default is C<$ENV{no_proxy}> —)
  
  =item *
  
  C<timeout> — Request timeout in seconds (default is 60) If a socket open, read or write takes longer than the timeout, an exception is thrown.
  
  =item *
  
  C<verify_SSL> — A boolean that indicates whether to validate the SSL certificate of an C<https> — connection (default is false)
  
  =item *
  
  C<SSL_options> — A hashref of C<SSL_*> — options to pass through to L<IO::Socket::SSL>
  
  =back
  
  Passing an explicit C<undef> for C<proxy>, C<http_proxy> or C<https_proxy> will
  prevent getting the corresponding proxies from the environment.
  
  Exceptions from C<max_size>, C<timeout> or other errors will result in a
  pseudo-HTTP status code of 599 and a reason of "Internal Exception". The
  content field in the response will contain the text of the exception.
  
  The C<keep_alive> parameter enables a persistent connection, but only to a
  single destination scheme, host and port.  Also, if any connection-relevant
  attributes are modified, or if the process ID or thread ID change, the
  persistent connection will be dropped.  If you want persistent connections
  across multiple destinations, use multiple HTTP::Tiny objects.
  
  See L</SSL SUPPORT> for more on the C<verify_SSL> and C<SSL_options> attributes.
  
  =head2 get|head|put|post|delete
  
      $response = $http->get($url);
      $response = $http->get($url, \%options);
      $response = $http->head($url);
  
  These methods are shorthand for calling C<request()> for the given method.  The
  URL must have unsafe characters escaped and international domain names encoded.
  See C<request()> for valid options and a description of the response.
  
  The C<success> field of the response will be true if the status code is 2XX.
  
  =head2 post_form
  
      $response = $http->post_form($url, $form_data);
      $response = $http->post_form($url, $form_data, \%options);
  
  This method executes a C<POST> request and sends the key/value pairs from a
  form data hash or array reference to the given URL with a C<content-type> of
  C<application/x-www-form-urlencoded>.  If data is provided as an array
  reference, the order is preserved; if provided as a hash reference, the terms
  are sorted on key and value for consistency.  See documentation for the
  C<www_form_urlencode> method for details on the encoding.
  
  The URL must have unsafe characters escaped and international domain names
  encoded.  See C<request()> for valid options and a description of the response.
  Any C<content-type> header or content in the options hashref will be ignored.
  
  The C<success> field of the response will be true if the status code is 2XX.
  
  =head2 mirror
  
      $response = $http->mirror($url, $file, \%options)
      if ( $response->{success} ) {
          print "$file is up to date\n";
      }
  
  Executes a C<GET> request for the URL and saves the response body to the file
  name provided.  The URL must have unsafe characters escaped and international
  domain names encoded.  If the file already exists, the request will include an
  C<If-Modified-Since> header with the modification timestamp of the file.  You
  may specify a different C<If-Modified-Since> header yourself in the C<<
  $options->{headers} >> hash.
  
  The C<success> field of the response will be true if the status code is 2XX
  or if the status code is 304 (unmodified).
  
  If the file was modified and the server response includes a properly
  formatted C<Last-Modified> header, the file modification time will
  be updated accordingly.
  
  =head2 request
  
      $response = $http->request($method, $url);
      $response = $http->request($method, $url, \%options);
  
  Executes an HTTP request of the given method type ('GET', 'HEAD', 'POST',
  'PUT', etc.) on the given URL.  The URL must have unsafe characters escaped and
  international domain names encoded.
  
  B<NOTE>: Method names are B<case-sensitive> per the HTTP/1.1 specification.
  Don't use C<get> when you really want C<GET>.  See L<LIMITATIONS> for
  how this applies to redirection.
  
  If the URL includes a "user:password" stanza, they will be used for Basic-style
  authorization headers.  (Authorization headers will not be included in a
  redirected request.) For example:
  
      $http->request('GET', 'http://Aladdin:open sesame@example.com/');
  
  If the "user:password" stanza contains reserved characters, they must
  be percent-escaped:
  
      $http->request('GET', 'http://john%40example.com:password@example.com/');
  
  A hashref of options may be appended to modify the request.
  
  Valid options are:
  
  =over 4
  
  =item *
  
  C<headers> — A hashref containing headers to include with the request.  If the value for a header is an array reference, the header will be output multiple times with each value in the array.  These headers over-write any default headers.
  
  =item *
  
  C<content> — A scalar to include as the body of the request OR a code reference that will be called iteratively to produce the body of the request
  
  =item *
  
  C<trailer_callback> — A code reference that will be called if it exists to provide a hashref of trailing headers (only used with chunked transfer-encoding)
  
  =item *
  
  C<data_callback> — A code reference that will be called for each chunks of the response body received.
  
  =item *
  
  C<peer> — Override host resolution and force all connections to go only to a specific peer address, regardless of the URL of the request.  This will include any redirections!  This options should be used with extreme caution (e.g. debugging or very special circumstances). It can be given as either a scalar or a code reference that will receive the hostname and whose response will be taken as the address.
  
  =back
  
  The C<Host> header is generated from the URL in accordance with RFC 2616.  It
  is a fatal error to specify C<Host> in the C<headers> option.  Other headers
  may be ignored or overwritten if necessary for transport compliance.
  
  If the C<content> option is a code reference, it will be called iteratively
  to provide the content body of the request.  It should return the empty
  string or undef when the iterator is exhausted.
  
  If the C<content> option is the empty string, no C<content-type> or
  C<content-length> headers will be generated.
  
  If the C<data_callback> option is provided, it will be called iteratively until
  the entire response body is received.  The first argument will be a string
  containing a chunk of the response body, the second argument will be the
  in-progress response hash reference, as described below.  (This allows
  customizing the action of the callback based on the C<status> or C<headers>
  received prior to the content body.)
  
  The C<request> method returns a hashref containing the response.  The hashref
  will have the following keys:
  
  =over 4
  
  =item *
  
  C<success> — Boolean indicating whether the operation returned a 2XX status code
  
  =item *
  
  C<url> — URL that provided the response. This is the URL of the request unless there were redirections, in which case it is the last URL queried in a redirection chain
  
  =item *
  
  C<status> — The HTTP status code of the response
  
  =item *
  
  C<reason> — The response phrase returned by the server
  
  =item *
  
  C<content> — The body of the response.  If the response does not have any content or if a data callback is provided to consume the response body, this will be the empty string
  
  =item *
  
  C<headers> — A hashref of header fields.  All header field names will be normalized to be lower case. If a header is repeated, the value will be an arrayref; it will otherwise be a scalar string containing the value
  
  =item *
  
  C<protocol> - If this field exists, it is the protocol of the response such as HTTP/1.0 or HTTP/1.1
  
  =item *
  
  C<redirects> If this field exists, it is an arrayref of response hash references from redirects in the same order that redirections occurred.  If it does not exist, then no redirections occurred.
  
  =back
  
  On an exception during the execution of the request, the C<status> field will
  contain 599, and the C<content> field will contain the text of the exception.
  
  =head2 www_form_urlencode
  
      $params = $http->www_form_urlencode( $data );
      $response = $http->get("http://example.com/query?$params");
  
  This method converts the key/value pairs from a data hash or array reference
  into a C<x-www-form-urlencoded> string.  The keys and values from the data
  reference will be UTF-8 encoded and escaped per RFC 3986.  If a value is an
  array reference, the key will be repeated with each of the values of the array
  reference.  If data is provided as a hash reference, the key/value pairs in the
  resulting string will be sorted by key and value for consistent ordering.
  
  =head2 can_ssl
  
      $ok         = HTTP::Tiny->can_ssl;
      ($ok, $why) = HTTP::Tiny->can_ssl;
      ($ok, $why) = $http->can_ssl;
  
  Indicates if SSL support is available.  When called as a class object, it
  checks for the correct version of L<Net::SSLeay> and L<IO::Socket::SSL>.
  When called as an object methods, if C<SSL_verify> is true or if C<SSL_verify_mode>
  is set in C<SSL_options>, it checks that a CA file is available.
  
  In scalar context, returns a boolean indicating if SSL is available.
  In list context, returns the boolean and a (possibly multi-line) string of
  errors indicating why SSL isn't available.
  
  =head2 connected
  
      $host = $http->connected;
      ($host, $port) = $http->connected;
  
  Indicates if a connection to a peer is being kept alive, per the C<keep_alive>
  option.
  
  In scalar context, returns the peer host and port, joined with a colon, or
  C<undef> (if no peer is connected).
  In list context, returns the peer host and port or an empty list (if no peer
  is connected).
  
  B<Note>: This method cannot reliably be used to discover whether the remote
  host has closed its end of the socket.
  
  =for Pod::Coverage SSL_options
  agent
  cookie_jar
  default_headers
  http_proxy
  https_proxy
  keep_alive
  local_address
  max_redirect
  max_size
  no_proxy
  proxy
  timeout
  verify_SSL
  
  =head1 SSL SUPPORT
  
  Direct C<https> connections are supported only if L<IO::Socket::SSL> 1.56 or
  greater and L<Net::SSLeay> 1.49 or greater are installed. An exception will be
  thrown if new enough versions of these modules are not installed or if the SSL
  encryption fails. You can also use C<HTTP::Tiny::can_ssl()> utility function
  that returns boolean to see if the required modules are installed.
  
  An C<https> connection may be made via an C<http> proxy that supports the CONNECT
  command (i.e. RFC 2817).  You may not proxy C<https> via a proxy that itself
  requires C<https> to communicate.
  
  SSL provides two distinct capabilities:
  
  =over 4
  
  =item *
  
  Encrypted communication channel
  
  =item *
  
  Verification of server identity
  
  =back
  
  B<By default, HTTP::Tiny does not verify server identity>.
  
  Server identity verification is controversial and potentially tricky because it
  depends on a (usually paid) third-party Certificate Authority (CA) trust model
  to validate a certificate as legitimate.  This discriminates against servers
  with self-signed certificates or certificates signed by free, community-driven
  CA's such as L<CAcert.org|http://cacert.org>.
  
  By default, HTTP::Tiny does not make any assumptions about your trust model,
  threat level or risk tolerance.  It just aims to give you an encrypted channel
  when you need one.
  
  Setting the C<verify_SSL> attribute to a true value will make HTTP::Tiny verify
  that an SSL connection has a valid SSL certificate corresponding to the host
  name of the connection and that the SSL certificate has been verified by a CA.
  Assuming you trust the CA, this will protect against a L<man-in-the-middle
  attack|http://en.wikipedia.org/wiki/Man-in-the-middle_attack>.  If you are
  concerned about security, you should enable this option.
  
  Certificate verification requires a file containing trusted CA certificates.
  
  If the environment variable C<SSL_CERT_FILE> is present, HTTP::Tiny
  will try to find a CA certificate file in that location.
  
  If the L<Mozilla::CA> module is installed, HTTP::Tiny will use the CA file
  included with it as a source of trusted CA's.  (This means you trust Mozilla,
  the author of Mozilla::CA, the CPAN mirror where you got Mozilla::CA, the
  toolchain used to install it, and your operating system security, right?)
  
  If that module is not available, then HTTP::Tiny will search several
  system-specific default locations for a CA certificate file:
  
  =over 4
  
  =item *
  
  /etc/ssl/certs/ca-certificates.crt
  
  =item *
  
  /etc/pki/tls/certs/ca-bundle.crt
  
  =item *
  
  /etc/ssl/ca-bundle.pem
  
  =back
  
  An exception will be raised if C<verify_SSL> is true and no CA certificate file
  is available.
  
  If you desire complete control over SSL connections, the C<SSL_options> attribute
  lets you provide a hash reference that will be passed through to
  C<IO::Socket::SSL::start_SSL()>, overriding any options set by HTTP::Tiny. For
  example, to provide your own trusted CA file:
  
      SSL_options => {
          SSL_ca_file => $file_path,
      }
  
  The C<SSL_options> attribute could also be used for such things as providing a
  client certificate for authentication to a server or controlling the choice of
  cipher used for the SSL connection. See L<IO::Socket::SSL> documentation for
  details.
  
  =head1 PROXY SUPPORT
  
  HTTP::Tiny can proxy both C<http> and C<https> requests.  Only Basic proxy
  authorization is supported and it must be provided as part of the proxy URL:
  C<http://user:pass@proxy.example.com/>.
  
  HTTP::Tiny supports the following proxy environment variables:
  
  =over 4
  
  =item *
  
  http_proxy or HTTP_PROXY
  
  =item *
  
  https_proxy or HTTPS_PROXY
  
  =item *
  
  all_proxy or ALL_PROXY
  
  =back
  
  If the C<REQUEST_METHOD> environment variable is set, then this might be a CGI
  process and C<HTTP_PROXY> would be set from the C<Proxy:> header, which is a
  security risk.  If C<REQUEST_METHOD> is set, C<HTTP_PROXY> (the upper case
  variant only) is ignored.
  
  Tunnelling C<https> over an C<http> proxy using the CONNECT method is
  supported.  If your proxy uses C<https> itself, you can not tunnel C<https>
  over it.
  
  Be warned that proxying an C<https> connection opens you to the risk of a
  man-in-the-middle attack by the proxy server.
  
  The C<no_proxy> environment variable is supported in the format of a
  comma-separated list of domain extensions proxy should not be used for.
  
  Proxy arguments passed to C<new> will override their corresponding
  environment variables.
  
  =head1 LIMITATIONS
  
  HTTP::Tiny is I<conditionally compliant> with the
  L<HTTP/1.1 specifications|http://www.w3.org/Protocols/>:
  
  =over 4
  
  =item *
  
  "Message Syntax and Routing" [RFC7230]
  
  =item *
  
  "Semantics and Content" [RFC7231]
  
  =item *
  
  "Conditional Requests" [RFC7232]
  
  =item *
  
  "Range Requests" [RFC7233]
  
  =item *
  
  "Caching" [RFC7234]
  
  =item *
  
  "Authentication" [RFC7235]
  
  =back
  
  It attempts to meet all "MUST" requirements of the specification, but does not
  implement all "SHOULD" requirements.  (Note: it was developed against the
  earlier RFC 2616 specification and may not yet meet the revised RFC 7230-7235
  spec.)
  
  Some particular limitations of note include:
  
  =over
  
  =item *
  
  HTTP::Tiny focuses on correct transport.  Users are responsible for ensuring
  that user-defined headers and content are compliant with the HTTP/1.1
  specification.
  
  =item *
  
  Users must ensure that URLs are properly escaped for unsafe characters and that
  international domain names are properly encoded to ASCII. See L<URI::Escape>,
  L<URI::_punycode> and L<Net::IDN::Encode>.
  
  =item *
  
  Redirection is very strict against the specification.  Redirection is only
  automatic for response codes 301, 302, 307 and 308 if the request method is
  'GET' or 'HEAD'.  Response code 303 is always converted into a 'GET'
  redirection, as mandated by the specification.  There is no automatic support
  for status 305 ("Use proxy") redirections.
  
  =item *
  
  There is no provision for delaying a request body using an C<Expect> header.
  Unexpected C<1XX> responses are silently ignored as per the specification.
  
  =item *
  
  Only 'chunked' C<Transfer-Encoding> is supported.
  
  =item *
  
  There is no support for a Request-URI of '*' for the 'OPTIONS' request.
  
  =item *
  
  Headers mentioned in the RFCs and some other, well-known headers are
  generated with their canonical case.  Other headers are sent in the
  case provided by the user.  Except for control headers (which are sent first),
  headers are sent in arbitrary order.
  
  =back
  
  Despite the limitations listed above, HTTP::Tiny is considered
  feature-complete.  New feature requests should be directed to
  L<HTTP::Tiny::UA>.
  
  =head1 SEE ALSO
  
  =over 4
  
  =item *
  
  L<HTTP::Tiny::UA> - Higher level UA features for HTTP::Tiny
  
  =item *
  
  L<HTTP::Thin> - HTTP::Tiny wrapper with L<HTTP::Request>/L<HTTP::Response> compatibility
  
  =item *
  
  L<HTTP::Tiny::Mech> - Wrap L<WWW::Mechanize> instance in HTTP::Tiny compatible interface
  
  =item *
  
  L<IO::Socket::IP> - Required for IPv6 support
  
  =item *
  
  L<IO::Socket::SSL> - Required for SSL support
  
  =item *
  
  L<LWP::UserAgent> - If HTTP::Tiny isn't enough for you, this is the "standard" way to do things
  
  =item *
  
  L<Mozilla::CA> - Required if you want to validate SSL certificates
  
  =item *
  
  L<Net::SSLeay> - Required for SSL support
  
  =back
  
  =for :stopwords cpan testmatrix url annocpan anno bugtracker rt cpants kwalitee diff irc mailto metadata placeholders metacpan
  
  =head1 SUPPORT
  
  =head2 Bugs / Feature Requests
  
  Please report any bugs or feature requests through the issue tracker
  at L<https://github.com/chansen/p5-http-tiny/issues>.
  You will be notified automatically of any progress on your issue.
  
  =head2 Source Code
  
  This is open source software.  The code repository is available for
  public review and contribution under the terms of the license.
  
  L<https://github.com/chansen/p5-http-tiny>
  
    git clone https://github.com/chansen/p5-http-tiny.git
  
  =head1 AUTHORS
  
  =over 4
  
  =item *
  
  Christian Hansen <chansen@cpan.org>
  
  =item *
  
  David Golden <dagolden@cpan.org>
  
  =back
  
  =head1 CONTRIBUTORS
  
  =for stopwords Alan Gardner Alessandro Ghedini A. Sinan Unur Brad Gilbert brian m. carlson Chris Nehren Weyl Claes Jakobsson Clinton Gormley Craig Berry David Golden Mitchell Dean Pearce Edward Zborowski Felipe Gasper James Raspass Jeremy Mates Jess Robinson Karen Etheridge Lukas Eklund Martin J. Evans Martin-Louis Bright Mike Doherty Nicolas Rochelemagne Olaf Alders Olivier Mengué Petr Písař Serguei Trouchelle Shoichi Kaji SkyMarshal Sören Kornetzki Steve Grazzini Syohei YOSHIDA Tatsuhiko Miyagawa Tom Hukins Tony Cook
  
  =over 4
  
  =item *
  
  Alan Gardner <gardner@pythian.com>
  
  =item *
  
  Alessandro Ghedini <al3xbio@gmail.com>
  
  =item *
  
  A. Sinan Unur <nanis@cpan.org>
  
  =item *
  
  Brad Gilbert <bgills@cpan.org>
  
  =item *
  
  brian m. carlson <sandals@crustytoothpaste.net>
  
  =item *
  
  Chris Nehren <apeiron@cpan.org>
  
  =item *
  
  Chris Weyl <cweyl@alumni.drew.edu>
  
  =item *
  
  Claes Jakobsson <claes@surfar.nu>
  
  =item *
  
  Clinton Gormley <clint@traveljury.com>
  
  =item *
  
  Craig A. Berry <craigberry@mac.com>
  
  =item *
  
  Craig Berry <cberry@cpan.org>
  
  =item *
  
  David Golden <xdg@xdg.me>
  
  =item *
  
  David Mitchell <davem@iabyn.com>
  
  =item *
  
  Dean Pearce <pearce@pythian.com>
  
  =item *
  
  Edward Zborowski <ed@rubensteintech.com>
  
  =item *
  
  Felipe Gasper <felipe@felipegasper.com>
  
  =item *
  
  James Raspass <jraspass@gmail.com>
  
  =item *
  
  Jeremy Mates <jmates@cpan.org>
  
  =item *
  
  Jess Robinson <castaway@desert-island.me.uk>
  
  =item *
  
  Karen Etheridge <ether@cpan.org>
  
  =item *
  
  Lukas Eklund <leklund@gmail.com>
  
  =item *
  
  Martin J. Evans <mjegh@ntlworld.com>
  
  =item *
  
  Martin-Louis Bright <mlbright@gmail.com>
  
  =item *
  
  Mike Doherty <doherty@cpan.org>
  
  =item *
  
  Nicolas Rochelemagne <rochelemagne@cpanel.net>
  
  =item *
  
  Olaf Alders <olaf@wundersolutions.com>
  
  =item *
  
  Olivier Mengué <dolmen@cpan.org>
  
  =item *
  
  Petr Písař <ppisar@redhat.com>
  
  =item *
  
  Serguei Trouchelle <stro@cpan.org>
  
  =item *
  
  Shoichi Kaji <skaji@cpan.org>
  
  =item *
  
  SkyMarshal <skymarshal1729@gmail.com>
  
  =item *
  
  Sören Kornetzki <soeren.kornetzki@delti.com>
  
  =item *
  
  Steve Grazzini <steve.grazzini@grantstreet.com>
  
  =item *
  
  Syohei YOSHIDA <syohex@gmail.com>
  
  =item *
  
  Tatsuhiko Miyagawa <miyagawa@bulknews.net>
  
  =item *
  
  Tom Hukins <tom@eborcom.com>
  
  =item *
  
  Tony Cook <tony@develop-help.com>
  
  =back
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2018 by Christian Hansen.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
HTTP_TINY

    $main::fatpacked{"HTTP/Tiny/UNIX.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'HTTP_TINY_UNIX';
  package HTTP::Tiny::UNIX;
  
  use 5.010001;
  use strict;
  use warnings;
  
  our $DATE = '2018-05-08'; # DATE
  our $VERSION = '0.051'; # VERSION
  
  # issue: port must be numeric to avoid warning
  # put everything in path_query
  
  use parent qw(HTTP::Tiny);
  
  use IO::Socket::UNIX;
  
  sub _split_url {
      my ($self, $url) = @_;
  
      if ($url =~ m<\A[^:/?#]+://>) {
          $self->{_unix} = 0;
          return $self->SUPER::_split_url($url);
      }
  
      my ($scheme, $sock_path, $path_query) =
          $url =~ m<\A(\w+):(.+?)/(/[^#]*)>
              or die "Cannot parse HTTP-over-Unix URL: '$url'\n";
  
      # a hack
      $self->{_unix} = 1;
      $self->{_path_query} = $path_query;
  
      $scheme = lc $scheme;
      die "Only http scheme is supported\n" unless $scheme eq 'http';
  
      #return ($scheme, $host,      $port, $path_query, $auth);
      return  ($scheme, $sock_path, -1,    $path_query, '');
  }
  
  sub _open_handle {
      my ($self, $request, $scheme, $host, $port) = @_;
  
      return $self->SUPER::_open_handle($request, $scheme, $host, $port)
          unless $self->{_unix};
  
      my $handle = HTTP::Tiny::Handle::UNIX->new(
          timeout => $self->{timeout},
      );
  
      $handle->connect($scheme, $host, $port, $self);
  }
  
  package
      HTTP::Tiny::Handle::UNIX;
  
  use parent -norequire, 'HTTP::Tiny::Handle';
  
  use IO::Socket;
  
  sub connect {
      my ($self, $scheme, $host, $port, $tiny) = @_;
  
      # on Unix, we use $host for path and leave port at -1 (unused)
      my $path = $host;
  
      local($^W) = 0;
      my $sock = IO::Socket::UNIX->new(
          Peer    => $path,
          Type    => SOCK_STREAM,
          Timeout => $self->{timeout},
          Host    => 'localhost',
      );
  
      unless ($sock) {
          $@ =~ s/^.*?: //;
          die "Can't open Unix socket $path\: $@";
      }
  
      eval { $sock->blocking(0); };
  
      $self->{fh} = $sock;
  
      $self->{scheme} = $scheme;
      $self->{host} = $host;
      $self->{port} = $port;
      $self->{_unix} = 1;
      # this is a hack, we inject this so we can get HTTP::Tiny::UNIX object from
      # HTTP::Tiny::Handle::UNIX, to get path
      $self->{_tiny} = $tiny;
      $self;
  }
  
  sub write_request_header {
      my ($self, $method, $request_uri, $headers, $header_case) = @_;
  
      return $self->SUPER::write_request_header(@_)
          unless $self->{_unix};
  
      return $self->write_header_lines($headers, $header_case, "$method $self->{_tiny}{_path_query} HTTP/1.1\x0D\x0A");
  }
  
  1;
  # ABSTRACT: A subclass of HTTP::Tiny to connect to HTTP server over Unix socket
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  HTTP::Tiny::UNIX - A subclass of HTTP::Tiny to connect to HTTP server over Unix socket
  
  =head1 VERSION
  
  This document describes version 0.051 of HTTP::Tiny::UNIX (from Perl distribution HTTP-Tiny-UNIX), released on 2018-05-08.
  
  =head1 SYNOPSIS
  
   use HTTP::Tiny::UNIX;
  
   my $response = HTTP::Tiny::UNIX->new->get('http:/path/to/unix.sock//uri/path');
  
   die "Failed!\n" unless $response->{success};
   print "$response->{status} $response->{reason}\n";
  
   while (my ($k, $v) = each %{$response->{headers}}) {
       for (ref $v eq 'ARRAY' ? @$v : $v) {
           print "$k: $_\n";
       }
   }
  
   print $response->{content} if length $response->{content};
  
  =head1 DESCRIPTION
  
  This is a subclass of L<HTTP::Tiny> to connect to HTTP server over Unix socket.
  URL syntax is C<"http:"> + I<path to unix socket> + C<"/"> + I<uri path>. For
  example: C<http:/var/run/apid.sock//api/v1/matches>. URL not matching this
  pattern will be passed to HTTP::Tiny.
  
  Proxy is currently not supported.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/HTTP-Tiny-UNIX>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-HTTP-Tiny-UNIX>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=HTTP-Tiny-UNIX>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<HTTP::Tiny>
  
  To use L<LWP> to connect over Unix sockets, see
  L<LWP::Protocol::http::SocketUnixAlt>.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2018, 2014 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
HTTP_TINY_UNIX

    $main::fatpacked{"HTTP/UserAgentStr/Util/ByNickname.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'HTTP_USERAGENTSTR_UTIL_BYNICKNAME';
  package HTTP::UserAgentStr::Util::ByNickname;
  
  our $DATE = '2019-05-10'; # DATE
  our $VERSION = '0.002'; # VERSION
  
  use strict;
  use warnings;
  
  our @nicknames = qw(
                         newest_firefox
                         newest_firefox_linux
                         newest_firefox_win
                         newest_chrome
                         newest_chrome_linux
                         newest_chrome_win
                 );
  
  use Exporter qw(import);
  our @EXPORT_OK = @nicknames;
  our %EXPORT_TAGS = (all => \@nicknames);
  
  sub _get {
      require HTTP::BrowserDetect;
      require Versioning::Scheme::Dotted;
      require WordList::HTTP::UserAgentString::PERLANCAR;
  
      my $nickname = shift;
  
      my @ua0;
      my $wl = WordList::HTTP::UserAgentString::PERLANCAR->new;
      $wl->each_word(
          sub {
              my $orig = shift;
              my $ua = HTTP::BrowserDetect->new($orig);
              push @ua0, {
                  orig => $orig,
                  os => $ua->os,
                  firefox => $ua->firefox,
                  chrome => $ua->chrome,
                  version => $ua->browser_version || '0.0',
              };
          });
      #use DD; dd \@ua0;
  
      my @ua;
      if ($nickname eq 'newest_firefox') {
          my $os = $^O eq 'MSWin32' ? 'windows' : 'linux';
          @ua = sort { Versioning::Scheme::Dotted->cmp_version($b->{version}, $a->{version}) }
              grep { $_->{firefox} && $_->{os} eq $os } @ua0;
      } elsif ($nickname eq 'newest_firefox_linux') {
          @ua = sort { Versioning::Scheme::Dotted->cmp_version($b->{version}, $a->{version}) }
              grep { $_->{firefox} && $_->{os} eq 'linux' } @ua0;
      } elsif ($nickname eq 'newest_firefox_win') {
          @ua = sort { Versioning::Scheme::Dotted->cmp_version($b->{version}, $a->{version}) }
              grep { $_->{firefox} && $_->{os} eq 'windows' } @ua0;
      } elsif ($nickname eq 'newest_chrome') {
          my $os = $^O eq 'MSWin32' ? 'windows' : 'linux';
          @ua = sort { Versioning::Scheme::Dotted->cmp_version($b->{version}, $a->{version}) }
              grep { $_->{chrome} && $_->{os} eq $os } @ua0;
      } elsif ($nickname eq 'newest_chrome_linux') {
          @ua = sort { Versioning::Scheme::Dotted->cmp_version($b->{version}, $a->{version}) }
              grep { $_->{chrome} && $_->{os} eq 'linux' } @ua0;
      } elsif ($nickname eq 'newest_chrome_win') {
          @ua = sort { Versioning::Scheme::Dotted->cmp_version($b->{version}, $a->{version}) }
              grep { $_->{chrome} && $_->{os} eq 'windows' } @ua0;
      } else {
          die "BUG: Unknown nickname";
      }
  
      $ua[0]{orig};
  }
  
  sub newest_firefox { _get("newest_firefox") }
  sub newest_firefox_linux { _get("newest_firefox_linux") }
  sub newest_firefox_win { _get("newest_firefox_win") }
  sub newest_chrome { _get("newest_chrome") }
  sub newest_chrome_linux { _get("newest_chrome_linux") }
  sub newest_chrome_win { _get("newest_chrome_win") }
  
  1;
  # ABSTRACT: Get popular HTTP User-Agent string by nickname
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  HTTP::UserAgentStr::Util::ByNickname - Get popular HTTP User-Agent string by nickname
  
  =head1 VERSION
  
  This document describes version 0.002 of HTTP::UserAgentStr::Util::ByNickname (from Perl distribution HTTP-UserAgentStr-Util-ByNickname), released on 2019-05-10.
  
  =head1 SYNOPSIS
  
   use HTTP::UserAgentStr::Util::ByNickname qw(
                         newest_firefox
                         newest_firefox_linux
                         newest_firefox_win
                         newest_chrome
                         newest_chrome_linux
                         newest_chrome_win
   );
  
   say newest_firefox_linux();
  
  Sample output (at the time of this writing):
  
   Mozilla/5.0 (X11; Linux x86_64; rv:66.0) Gecko/20100101 Firefox/66.0
  
  =head1 DESCRIPTION
  
  =head2 newest_firefox
  
  =head2 newest_firefox_linux
  
  =head2 newest_firefox_win
  
  =head2 newest_chrome
  
  =head2 newest_chrome_linux
  
  =head2 newest_chrome_win
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/HTTP-UserAgentStr-Util-ByNickname>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-HTTP-UserAgentStr-Util-ByNickname>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=HTTP-UserAgentStr-Util-ByNickname>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2019 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
HTTP_USERAGENTSTR_UTIL_BYNICKNAME

    $main::fatpacked{"IO/HTML.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'IO_HTML';
  #---------------------------------------------------------------------
  package IO::HTML;
  #
  # Copyright 2014 Christopher J. Madsen
  #
  # Author: Christopher J. Madsen <perl@cjmweb.net>
  # Created: 14 Jan 2012
  #
  # This program is free software; you can redistribute it and/or modify
  # it under the same terms as Perl itself.
  #
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See either the
  # GNU General Public License or the Artistic License for more details.
  #
  # ABSTRACT: Open an HTML file with automatic charset detection
  #---------------------------------------------------------------------
  
  use 5.008;
  use strict;
  use warnings;
  
  use Carp 'croak';
  use Encode 2.10 qw(decode find_encoding); # need utf-8-strict encoding
  use Exporter 5.57 'import';
  
  our $VERSION = '1.001';
  # This file is part of IO-HTML 1.001 (June 28, 2014)
  
  our $default_encoding ||= 'cp1252';
  
  our @EXPORT    = qw(html_file);
  our @EXPORT_OK = qw(find_charset_in html_file_and_encoding html_outfile
                      sniff_encoding);
  
  our %EXPORT_TAGS = (
    rw  => [qw( html_file html_file_and_encoding html_outfile )],
    all => [ @EXPORT, @EXPORT_OK ],
  );
  
  #=====================================================================
  
  
  sub html_file
  {
    (&html_file_and_encoding)[0]; # return just the filehandle
  } # end html_file
  
  
  # Note: I made html_file and html_file_and_encoding separate functions
  # (instead of making html_file context-sensitive) because I wanted to
  # use html_file in function calls (i.e. list context) without having
  # to write "scalar html_file" all the time.
  
  sub html_file_and_encoding
  {
    my ($filename, $options) = @_;
  
    $options ||= {};
  
    open(my $in, '<:raw', $filename) or croak "Failed to open $filename: $!";
  
  
    my ($encoding, $bom) = sniff_encoding($in, $filename, $options);
  
    if (not defined $encoding) {
      croak "No default encoding specified"
          unless defined($encoding = $default_encoding);
      $encoding = find_encoding($encoding) if $options->{encoding};
    } # end if we didn't find an encoding
  
    binmode $in, sprintf(":encoding(%s):crlf",
                         $options->{encoding} ? $encoding->name : $encoding);
  
    return ($in, $encoding, $bom);
  } # end html_file_and_encoding
  #---------------------------------------------------------------------
  
  
  sub html_outfile
  {
    my ($filename, $encoding, $bom) = @_;
  
    if (not defined $encoding) {
      croak "No default encoding specified"
          unless defined($encoding = $default_encoding);
    } # end if we didn't find an encoding
    elsif (ref $encoding) {
      $encoding = $encoding->name;
    }
  
    open(my $out, ">:encoding($encoding)", $filename)
        or croak "Failed to open $filename: $!";
  
    print $out "\x{FeFF}" if $bom;
  
    return $out;
  } # end html_outfile
  #---------------------------------------------------------------------
  
  
  sub sniff_encoding
  {
    my ($in, $filename, $options) = @_;
  
    $filename = 'file' unless defined $filename;
    $options ||= {};
  
    my $pos = tell $in;
    croak "Could not seek $filename: $!" if $pos < 0;
  
    croak "Could not read $filename: $!" unless defined read $in, my $buf, 1024;
  
    seek $in, $pos, 0 or croak "Could not seek $filename: $!";
  
  
    # Check for BOM:
    my $bom;
    my $encoding = do {
      if ($buf =~ /^\xFe\xFF/) {
        $bom = 2;
        'UTF-16BE';
      } elsif ($buf =~ /^\xFF\xFe/) {
        $bom = 2;
        'UTF-16LE';
      } elsif ($buf =~ /^\xEF\xBB\xBF/) {
        $bom = 3;
        'utf-8-strict';
      } else {
        find_charset_in($buf, $options); # check for <meta charset>
      }
    }; # end $encoding
  
    if ($bom) {
      seek $in, $bom, 1 or croak "Could not seek $filename: $!";
      $bom = 1;
    }
    elsif (not defined $encoding) { # try decoding as UTF-8
      my $test = decode('utf-8-strict', $buf, Encode::FB_QUIET);
      if ($buf =~ /^(?:                   # nothing left over
           | [\xC2-\xDF]                  # incomplete 2-byte char
           | [\xE0-\xEF] [\x80-\xBF]?     # incomplete 3-byte char
           | [\xF0-\xF4] [\x80-\xBF]{0,2} # incomplete 4-byte char
          )\z/x and $test =~ /[^\x00-\x7F]/) {
        $encoding = 'utf-8-strict';
      } # end if valid UTF-8 with at least one multi-byte character:
    } # end if testing for UTF-8
  
    if (defined $encoding and $options->{encoding} and not ref $encoding) {
      $encoding = find_encoding($encoding);
    } # end if $encoding is a string and we want an object
  
    return wantarray ? ($encoding, $bom) : $encoding;
  } # end sniff_encoding
  
  #=====================================================================
  # Based on HTML5 8.2.2.2 Determining the character encoding:
  
  # Get attribute from current position of $_
  sub _get_attribute
  {
    m!\G[\x09\x0A\x0C\x0D /]+!gc; # skip whitespace or /
  
    return if /\G>/gc or not /\G(=?[^\x09\x0A\x0C\x0D =]*)/gc;
  
    my ($name, $value) = (lc $1, '');
  
    if (/\G[\x09\x0A\x0C\x0D ]*=[\x09\x0A\x0C\x0D ]*/gc
        and (/\G"([^"]*)"?/gc or
             /\G'([^']*)'?/gc or
             /\G([^\x09\x0A\x0C\x0D >]*)/gc)) {
      $value = lc $1;
    } # end if attribute has value
  
    return wantarray ? ($name, $value) : 1;
  } # end _get_attribute
  
  # Examine a meta value for a charset:
  sub _get_charset_from_meta
  {
    for (shift) {
      while (/charset[\x09\x0A\x0C\x0D ]*=[\x09\x0A\x0C\x0D ]*/ig) {
        return $1 if (/\G"([^"]*)"/gc or
                      /\G'([^']*)'/gc or
                      /\G(?!['"])([^\x09\x0A\x0C\x0D ;]+)/gc);
      }
    } # end for value
  
    return undef;
  } # end _get_charset_from_meta
  #---------------------------------------------------------------------
  
  
  sub find_charset_in
  {
    for (shift) {
      my $options = shift || {};
      my $stop = length > 1024 ? 1024 : length; # search first 1024 bytes
  
      my $expect_pragma = (defined $options->{need_pragma}
                           ? $options->{need_pragma} : 1);
  
      pos() = 0;
      while (pos() < $stop) {
        if (/\G<!--.*?(?<=--)>/sgc) {
        } # Skip comment
        elsif (m!\G<meta(?=[\x09\x0A\x0C\x0D /])!gic) {
          my ($got_pragma, $need_pragma, $charset);
  
          while (my ($name, $value) = &_get_attribute) {
            if ($name eq 'http-equiv' and $value eq 'content-type') {
              $got_pragma = 1;
            } elsif ($name eq 'content' and not defined $charset) {
              $need_pragma = $expect_pragma
                  if defined($charset = _get_charset_from_meta($value));
            } elsif ($name eq 'charset') {
              $charset = $value;
              $need_pragma = 0;
            }
          } # end while more attributes in this <meta> tag
  
          if (defined $need_pragma and (not $need_pragma or $got_pragma)) {
            $charset = 'UTF-8'  if $charset =~ /^utf-?16/;
            $charset = 'cp1252' if $charset eq 'iso-8859-1'; # people lie
            if (my $encoding = find_encoding($charset)) {
              return $options->{encoding} ? $encoding : $encoding->name;
            } # end if charset is a recognized encoding
          } # end if found charset
        } # end elsif <meta
        elsif (m!\G</?[a-zA-Z][^\x09\x0A\x0C\x0D >]*!gc) {
          1 while &_get_attribute;
        } # end elsif some other tag
        elsif (m{\G<[!/?][^>]*}gc) {
        } # skip unwanted things
        elsif (m/\G</gc) {
        } # skip < that doesn't open anything we recognize
  
        # Advance to the next <:
        m/\G[^<]+/gc;
      } # end while not at search boundary
    } # end for string
  
    return undef;                 # Couldn't find a charset
  } # end find_charset_in
  #---------------------------------------------------------------------
  
  
  # Shortcuts for people who don't like exported functions:
  *file               = \&html_file;
  *file_and_encoding  = \&html_file_and_encoding;
  *outfile            = \&html_outfile;
  
  #=====================================================================
  # Package Return Value:
  
  1;
  
  __END__
  
  =head1 NAME
  
  IO::HTML - Open an HTML file with automatic charset detection
  
  =head1 VERSION
  
  This document describes version 1.001 of
  IO::HTML, released June 28, 2014.
  
  =head1 SYNOPSIS
  
    use IO::HTML;                 # exports html_file by default
    use HTML::TreeBuilder;
  
    my $tree = HTML::TreeBuilder->new_from_file(
                 html_file('foo.html')
               );
  
    # Alternative interface:
    open(my $in, '<:raw', 'bar.html');
    my $encoding = IO::HTML::sniff_encoding($in, 'bar.html');
  
  =head1 DESCRIPTION
  
  IO::HTML provides an easy way to open a file containing HTML while
  automatically determining its encoding.  It uses the HTML5 encoding
  sniffing algorithm specified in section 8.2.2.2 of the draft standard.
  
  The algorithm as implemented here is:
  
  =over
  
  =item 1.
  
  If the file begins with a byte order mark indicating UTF-16LE,
  UTF-16BE, or UTF-8, then that is the encoding.
  
  =item 2.
  
  If the first 1024 bytes of the file contain a C<< <meta> >> tag that
  indicates the charset, and Encode recognizes the specified charset
  name, then that is the encoding.  (This portion of the algorithm is
  implemented by C<find_charset_in>.)
  
  The C<< <meta> >> tag can be in one of two formats:
  
    <meta charset="...">
    <meta http-equiv="Content-Type" content="...charset=...">
  
  The search is case-insensitive, and the order of attributes within the
  tag is irrelevant.  Any additional attributes of the tag are ignored.
  The first matching tag with a recognized encoding ends the search.
  
  =item 3.
  
  If the first 1024 bytes of the file are valid UTF-8 (with at least 1
  non-ASCII character), then the encoding is UTF-8.
  
  =item 4.
  
  If all else fails, use the default character encoding.  The HTML5
  standard suggests the default encoding should be locale dependent, but
  currently it is always C<cp1252> unless you set
  C<$IO::HTML::default_encoding> to a different value.  Note:
  C<sniff_encoding> does not apply this step; only C<html_file> does
  that.
  
  =back
  
  =head1 SUBROUTINES
  
  =head2 html_file
  
    $filehandle = html_file($filename, \%options);
  
  This function (exported by default) is the primary entry point.  It
  opens the file specified by C<$filename> for reading, uses
  C<sniff_encoding> to find a suitable encoding layer, and applies it.
  It also applies the C<:crlf> layer.  If the file begins with a BOM,
  the filehandle is positioned just after the BOM.
  
  The optional second argument is a hashref containing options.  The
  possible keys are described under C<find_charset_in>.
  
  If C<sniff_encoding> is unable to determine the encoding, it defaults
  to C<$IO::HTML::default_encoding>, which is set to C<cp1252>
  (a.k.a. Windows-1252) by default.  According to the standard, the
  default should be locale dependent, but that is not currently
  implemented.
  
  It dies if the file cannot be opened.
  
  
  =head2 html_file_and_encoding
  
    ($filehandle, $encoding, $bom)
      = html_file_and_encoding($filename, \%options);
  
  This function (exported only by request) is just like C<html_file>,
  but returns more information.  In addition to the filehandle, it
  returns the name of the encoding used, and a flag indicating whether a
  byte order mark was found (if C<$bom> is true, the file began with a
  BOM).  This may be useful if you want to write the file out again
  (especially in conjunction with the C<html_outfile> function).
  
  The optional second argument is a hashref containing options.  The
  possible keys are described under C<find_charset_in>.
  
  It dies if the file cannot be opened.  The result of calling it in
  scalar context is undefined.
  
  
  =head2 html_outfile
  
    $filehandle = html_outfile($filename, $encoding, $bom);
  
  This function (exported only by request) opens C<$filename> for output
  using C<$encoding>, and writes a BOM to it if C<$bom> is true.
  If C<$encoding> is C<undef>, it defaults to C<$IO::HTML::default_encoding>.
  C<$encoding> may be either an encoding name or an Encode::Encoding object.
  
  It dies if the file cannot be opened.
  
  
  =head2 sniff_encoding
  
    ($encoding, $bom) = sniff_encoding($filehandle, $filename, \%options);
  
  This function (exported only by request) runs the HTML5 encoding
  sniffing algorithm on C<$filehandle> (which must be seekable, and
  should have been opened in C<:raw> mode).  C<$filename> is used only
  for error messages (if there's a problem using the filehandle), and
  defaults to "file" if omitted.  The optional third argument is a
  hashref containing options.  The possible keys are described under
  C<find_charset_in>.
  
  It returns Perl's canonical name for the encoding, which is not
  necessarily the same as the MIME or IANA charset name.  It returns
  C<undef> if the encoding cannot be determined.  C<$bom> is true if the
  file began with a byte order mark.  In scalar context, it returns only
  C<$encoding>.
  
  The filehandle's position is restored to its original position
  (normally the beginning of the file) unless C<$bom> is true.  In that
  case, the position is immediately after the BOM.
  
  Tip: If you want to run C<sniff_encoding> on a file you've already
  loaded into a string, open an in-memory file on the string, and pass
  that handle:
  
    ($encoding, $bom) = do {
      open(my $fh, '<', \$string);  sniff_encoding($fh)
    };
  
  (This only makes sense if C<$string> contains bytes, not characters.)
  
  
  =head2 find_charset_in
  
    $encoding = find_charset_in($string_containing_HTML, \%options);
  
  This function (exported only by request) looks for charset information
  in a C<< <meta> >> tag in a possibly incomplete HTML document using
  the "two step" algorithm specified by HTML5.  It does not look for a BOM.
  Only the first 1024 bytes of the string are checked.
  
  It returns Perl's canonical name for the encoding, which is not
  necessarily the same as the MIME or IANA charset name.  It returns
  C<undef> if no charset is specified or if the specified charset is not
  recognized by the Encode module.
  
  The optional second argument is a hashref containing options.  The
  following keys are recognized:
  
  =over
  
  =item C<encoding>
  
  If true, return the L<Encode::Encoding> object instead of its name.
  Defaults to false.
  
  =item C<need_pragma>
  
  If true (the default), follow the HTML5 spec and examine the
  C<content> attribute only of C<< <meta http-equiv="Content-Type" >>.
  If set to 0, relax the HTML5 spec, and look for "charset=" in the
  C<content> attribute of I<every> meta tag.
  
  =back
  
  =head1 EXPORTS
  
  By default, only C<html_file> is exported.  Other functions may be
  exported on request.
  
  For people who prefer not to export functions, all functions beginning
  with C<html_> have an alias without that prefix (e.g. you can call
  C<IO::HTML::file(...)> instead of C<IO::HTML::html_file(...)>.  These
  aliases are not exportable.
  
  =for Pod::Coverage
  file
  file_and_encoding
  outfile
  
  The following export tags are available:
  
  =over
  
  =item C<:all>
  
  All exportable functions.
  
  =item C<:rw>
  
  C<html_file>, C<html_file_and_encoding>, C<html_outfile>.
  
  =back
  
  =head1 SEE ALSO
  
  The HTML5 specification, section 8.2.2.2 Determining the character encoding:
  L<http://www.w3.org/TR/html5/syntax.html#determining-the-character-encoding>
  
  =head1 DIAGNOSTICS
  
  =over
  
  =item C<< Could not read %s: %s >>
  
  The specified file could not be read from for the reason specified by C<$!>.
  
  
  =item C<< Could not seek %s: %s >>
  
  The specified file could not be rewound for the reason specified by C<$!>.
  
  
  =item C<< Failed to open %s: %s >>
  
  The specified file could not be opened for reading for the reason
  specified by C<$!>.
  
  
  =item C<< No default encoding specified >>
  
  The C<sniff_encoding> algorithm didn't find an encoding to use, and
  you set C<$IO::HTML::default_encoding> to C<undef>.
  
  
  =back
  
  =head1 CONFIGURATION AND ENVIRONMENT
  
  IO::HTML requires no configuration files or environment variables.
  
  =head1 DEPENDENCIES
  
  IO::HTML has no non-core dependencies for Perl 5.8.7+.  With earlier
  versions of Perl 5.8, you need to upgrade L<Encode> to at least
  version 2.10, and
  you may need to upgrade L<Exporter> to at least version
  5.57.
  
  =head1 INCOMPATIBILITIES
  
  None reported.
  
  =head1 BUGS AND LIMITATIONS
  
  No bugs have been reported.
  
  =head1 AUTHOR
  
  Christopher J. Madsen  S<C<< <perl AT cjmweb.net> >>>
  
  Please report any bugs or feature requests
  to S<C<< <bug-IO-HTML AT rt.cpan.org> >>>
  or through the web interface at
  L<< http://rt.cpan.org/Public/Bug/Report.html?Queue=IO-HTML >>.
  
  You can follow or contribute to IO-HTML's development at
  L<< https://github.com/madsen/io-html >>.
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2014 by Christopher J. Madsen.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =head1 DISCLAIMER OF WARRANTY
  
  BECAUSE THIS SOFTWARE IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
  FOR THE SOFTWARE, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
  OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
  PROVIDE THE SOFTWARE "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
  EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
  ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE IS WITH
  YOU. SHOULD THE SOFTWARE PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
  NECESSARY SERVICING, REPAIR, OR CORRECTION.
  
  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
  WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
  REDISTRIBUTE THE SOFTWARE AS PERMITTED BY THE ABOVE LICENSE, BE
  LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL,
  OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE
  THE SOFTWARE (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
  RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
  FAILURE OF THE SOFTWARE TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
  SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
  SUCH DAMAGES.
  
  =cut
IO_HTML

    $main::fatpacked{"IO/Pty.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'IO_PTY';
  # Documentation at the __END__
  
  package IO::Pty;
  
  use strict;
  use Carp;
  use IO::Tty qw(TIOCSCTTY TCSETCTTY TIOCNOTTY);
  use IO::File;
  require POSIX;
  
  use vars qw(@ISA $VERSION);
  
  $VERSION = '1.12'; # keep same as in Tty.pm
  
  @ISA = qw(IO::Handle);
  eval { local $^W = 0; undef local $SIG{__DIE__}; require IO::Stty };
  push @ISA, "IO::Stty" if (not $@);  # if IO::Stty is installed
  
  sub new {
    my ($class) = $_[0] || "IO::Pty";
    $class = ref($class) if ref($class);
    @_ <= 1 or croak 'usage: new $class';
  
    my ($ptyfd, $ttyfd, $ttyname) = pty_allocate();
  
    croak "Cannot open a pty" if not defined $ptyfd;
  
    my $pty = $class->SUPER::new_from_fd($ptyfd, "r+");
    croak "Cannot create a new $class from fd $ptyfd: $!" if not $pty;
    $pty->autoflush(1);
    bless $pty => $class;
  
    my $slave = IO::Tty->new_from_fd($ttyfd, "r+");
    croak "Cannot create a new IO::Tty from fd $ttyfd: $!" if not $slave;
    $slave->autoflush(1);
  
    ${*$pty}{'io_pty_slave'} = $slave;
    ${*$pty}{'io_pty_ttyname'} = $ttyname;
    ${*$slave}{'io_tty_ttyname'} = $ttyname;
  
    return $pty;
  }
  
  sub ttyname {
    @_ == 1 or croak 'usage: $pty->ttyname();';
    my $pty = shift;
    ${*$pty}{'io_pty_ttyname'};
  }
  
  
  sub close_slave {
    @_ == 1 or croak 'usage: $pty->close_slave();';
  
    my $master = shift;
  
    if (exists ${*$master}{'io_pty_slave'}) {
      close ${*$master}{'io_pty_slave'};
      delete ${*$master}{'io_pty_slave'};
    }
  }
  
  sub slave {
    @_ == 1 or croak 'usage: $pty->slave();';
  
    my $master = shift;
  
    if (exists ${*$master}{'io_pty_slave'}) {
      return ${*$master}{'io_pty_slave'};
    }
  
    my $tty = ${*$master}{'io_pty_ttyname'};
  
    my $slave = new IO::Tty;
  
    $slave->open($tty, O_RDWR | O_NOCTTY) ||
      croak "Cannot open slave $tty: $!";
  
    return $slave;
  }
  
  sub make_slave_controlling_terminal {
    @_ == 1 or croak 'usage: $pty->make_slave_controlling_terminal();';
  
    my $self = shift;
    local(*DEVTTY);
  
    # loose controlling terminal explicitly
    if (defined TIOCNOTTY) {
      if (open (\*DEVTTY, "/dev/tty")) {
        ioctl( \*DEVTTY, TIOCNOTTY, 0 );
        close \*DEVTTY;
      }
    }
  
    # Create a new 'session', lose controlling terminal.
    if (not POSIX::setsid()) {
      warn "setsid() failed, strange behavior may result: $!\r\n" if $^W;
    }
  
    if (open(\*DEVTTY, "/dev/tty")) {
      warn "Could not disconnect from controlling terminal?!\n" if $^W;
      close \*DEVTTY;
    }
  
    # now open slave, this should set it as controlling tty on some systems
    my $ttyname = ${*$self}{'io_pty_ttyname'};
    my $slv = new IO::Tty;
    $slv->open($ttyname, O_RDWR)
      or croak "Cannot open slave $ttyname: $!";
  
    if (not exists ${*$self}{'io_pty_slave'}) {
      ${*$self}{'io_pty_slave'} = $slv;
    } else {
      $slv->close;
    }
  
    # Acquire a controlling terminal if this doesn't happen automatically
    if (not open(\*DEVTTY, "/dev/tty")) {
      if (defined TIOCSCTTY) {
        if (not defined ioctl( ${*$self}{'io_pty_slave'}, TIOCSCTTY, 0 )) {
          warn "warning: TIOCSCTTY failed, slave might not be set as controlling terminal: $!" if $^W;
        }
      } elsif (defined TCSETCTTY) {
        if (not defined ioctl( ${*$self}{'io_pty_slave'}, TCSETCTTY, 0 )) {
          warn "warning: TCSETCTTY failed, slave might not be set as controlling terminal: $!" if $^W;
        }
      } else {
        warn "warning: You have neither TIOCSCTTY nor TCSETCTTY on your system\n" if $^W;
        return 0;
      }
    }
  
    if (not open(\*DEVTTY, "/dev/tty")) {
      warn "Error: could not connect pty as controlling terminal!\n";
      return undef;
    } else {
      close \*DEVTTY;
    }
    
    return 1;
  }
  
  *clone_winsize_from = \&IO::Tty::clone_winsize_from;
  *get_winsize = \&IO::Tty::get_winsize;
  *set_winsize = \&IO::Tty::set_winsize;
  *set_raw = \&IO::Tty::set_raw;
  
  1;
  
  __END__
  
  =head1 NAME
  
  IO::Pty - Pseudo TTY object class
  
  =head1 VERSION
  
  1.12
  
  =head1 SYNOPSIS
  
      use IO::Pty;
  
      $pty = new IO::Pty;
  
      $slave  = $pty->slave;
  
      foreach $val (1..10) {
  	print $pty "$val\n";
  	$_ = <$slave>;
  	print "$_";
      }
  
      close($slave);
  
  
  =head1 DESCRIPTION
  
  C<IO::Pty> provides an interface to allow the creation of a pseudo tty.
  
  C<IO::Pty> inherits from C<IO::Handle> and so provide all the methods
  defined by the C<IO::Handle> package.
  
  Please note that pty creation is very system-dependend.  If you have
  problems, see L<IO::Tty> for help.
  
  
  =head1 CONSTRUCTOR
  
  =over 3
  
  =item new
  
  The C<new> constructor takes no arguments and returns a new file
  object which is the master side of the pseudo tty.
  
  =back
  
  =head1 METHODS
  
  =over 4
  
  =item ttyname()
  
  Returns the name of the slave pseudo tty. On UNIX machines this will
  be the pathname of the device.  Use this name for informational
  purpose only, to get a slave filehandle, use slave().
  
  =item slave()
  
  The C<slave> method will return the slave filehandle of the given
  master pty, opening it anew if necessary.  If IO::Stty is installed,
  you can then call C<$slave-E<gt>stty()> to modify the terminal settings.
  
  =item close_slave()
  
  The slave filehandle will be closed and destroyed.  This is necessary
  in the parent after forking to get rid of the open filehandle,
  otherwise the parent will not notice if the child exits.  Subsequent
  calls of C<slave()> will return a newly opened slave filehandle.
  
  =item make_slave_controlling_terminal()
  
  This will set the slave filehandle as the controlling terminal of the
  current process, which will become a session leader, so this should
  only be called by a child process after a fork(), e.g. in the callback
  to C<sync_exec()> (see L<Proc::SyncExec>).  See the C<try> script
  (also C<test.pl>) for an example how to correctly spawn a subprocess.
  
  =item set_raw()
  
  Will set the pty to raw.  Note that this is a one-way operation, you
  need IO::Stty to set the terminal settings to anything else.
  
  On some systems, the master pty is not a tty.  This method checks for
  that and returns success anyway on such systems.  Note that this
  method must be called on the slave, and probably should be called on
  the master, just to be sure, i.e.
  
    $pty->slave->set_raw();
    $pty->set_raw();
  
  
  =item clone_winsize_from(\*FH)
  
  Gets the terminal size from filehandle FH (which must be a terminal)
  and transfers it to the pty.  Returns true on success and undef on
  failure.  Note that this must be called upon the I<slave>, i.e.
  
   $pty->slave->clone_winsize_from(\*STDIN);
  
  On some systems, the master pty also isatty.  I actually have no
  idea if setting terminal sizes there is passed through to the slave,
  so if this method is called for a master that is not a tty, it
  silently returns OK.
  
  See the C<try> script for example code how to propagate SIGWINCH.
  
  =item get_winsize()
  
  Returns the terminal size, in a 4-element list.
  
   ($row, $col, $xpixel, $ypixel) = $tty->get_winsize()
  
  =item set_winsize($row, $col, $xpixel, $ypixel)
  
  Sets the terminal size. If not specified, C<$xpixel> and C<$ypixel> are set to
  0.  As with C<clone_winsize_from>, this must be called upon the I<slave>.
  
  =back
  
  
  =head1 SEE ALSO
  
  L<IO::Tty>, L<IO::Tty::Constant>, L<IO::Handle>, L<Expect>, L<Proc::SyncExec>
  
  
  =head1 MAILING LISTS
  
  As this module is mainly used by Expect, support for it is available
  via the two Expect mailing lists, expectperl-announce and
  expectperl-discuss, at
  
    http://lists.sourceforge.net/lists/listinfo/expectperl-announce
  
  and
  
    http://lists.sourceforge.net/lists/listinfo/expectperl-discuss
  
  
  =head1 AUTHORS
  
  Originally by Graham Barr E<lt>F<gbarr@pobox.com>E<gt>, based on the
  Ptty module by Nick Ing-Simmons E<lt>F<nik@tiuk.ti.com>E<gt>.
  
  Now maintained and heavily rewritten by Roland Giersig
  E<lt>F<RGiersig@cpan.org>E<gt>.
  
  Contains copyrighted stuff from openssh v3.0p1, authored by 
  Tatu Ylonen <ylo@cs.hut.fi>, Markus Friedl and Todd C. Miller
  <Todd.Miller@courtesan.com>.
  
  
  =head1 COPYRIGHT
  
  Now all code is free software; you can redistribute it and/or modify
  it under the same terms as Perl itself.
  
  Nevertheless the above AUTHORS retain their copyrights to the various
  parts and want to receive credit if their source code is used.
  See the source for details.
  
  
  =head1 DISCLAIMER
  
  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
  TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
  USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
  DAMAGE.
  
  In other words: Use at your own risk.  Provided as is.  Your mileage
  may vary.  Read the source, Luke!
  
  And finally, just to be sure:
  
  Any Use of This Product, in Any Manner Whatsoever, Will Increase the
  Amount of Disorder in the Universe. Although No Liability Is Implied
  Herein, the Consumer Is Warned That This Process Will Ultimately Lead
  to the Heat Death of the Universe.
  
  =cut
  
IO_PTY

    $main::fatpacked{"IO/Tty.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'IO_TTY';
  # Documentation at the __END__
  # -*-cperl-*-
  
  package IO::Tty;
  
  use IO::Handle;
  use IO::File;
  use IO::Tty::Constant;
  use Carp;
  
  require POSIX;
  require DynaLoader;
  
  use vars qw(@ISA $VERSION $XS_VERSION $CONFIG $DEBUG);
  
  $VERSION = '1.12';
  $XS_VERSION = "1.12";
  @ISA = qw(IO::Handle);
  
  eval { local $^W = 0; undef local $SIG{__DIE__}; require IO::Stty };
  push @ISA, "IO::Stty" if (not $@);  # if IO::Stty is installed
  
  BOOT_XS: {
      # If I inherit DynaLoader then I inherit AutoLoader and I DON'T WANT TO
      require DynaLoader;
  
      # DynaLoader calls dl_load_flags as a static method.
      *dl_load_flags = DynaLoader->can('dl_load_flags');
  
      do {
  	defined(&bootstrap)
  		? \&bootstrap
  		: \&DynaLoader::bootstrap
      }->(__PACKAGE__);
  }
  
  sub import {
      IO::Tty::Constant->export_to_level(1, @_);
  }
  
  sub open {
      my($tty,$dev,$mode) = @_;
  
      IO::File::open($tty,$dev,$mode) or
  	return undef;
  
      $tty->autoflush;
  
      1;
  }
  
  sub clone_winsize_from {
    my ($self, $fh) = @_;
    croak "Given filehandle is not a tty in clone_winsize_from, called"
      if not POSIX::isatty($fh);  
    return 1 if not POSIX::isatty($self);  # ignored for master ptys
    my $winsize = " "x1024; # preallocate memory
    ioctl($fh, &IO::Tty::Constant::TIOCGWINSZ, $winsize)
      and ioctl($self, &IO::Tty::Constant::TIOCSWINSZ, $winsize)
        and return 1;
    warn "clone_winsize_from: error: $!" if $^W;
    return undef;
  }
  
  # ioctl() doesn't tell us how long the structure is, so we'll have to trim it
  # after TIOCGWINSZ
  my $SIZEOF_WINSIZE = length IO::Tty::pack_winsize(0,0,0,0);
  
  sub get_winsize {
    my $self = shift;
    ioctl($self, IO::Tty::Constant::TIOCGWINSZ(), my $winsize)
      or croak "Cannot TIOCGWINSZ - $!";
    substr($winsize, $SIZEOF_WINSIZE) = "";
    return IO::Tty::unpack_winsize($winsize);
  }
  
  sub set_winsize {
    my $self = shift;
    my $winsize = IO::Tty::pack_winsize(@_);
    ioctl($self, IO::Tty::Constant::TIOCSWINSZ(), $winsize)
      or croak "Cannot TIOCSWINSZ - $!";
  }
  
  sub set_raw($) {
    require POSIX;
    my $self = shift;
    return 1 if not POSIX::isatty($self);
    my $ttyno = fileno($self);
    my $termios = new POSIX::Termios;
    unless ($termios) {
      warn "set_raw: new POSIX::Termios failed: $!";
      return undef;
    }
    unless ($termios->getattr($ttyno)) {
      warn "set_raw: getattr($ttyno) failed: $!";
      return undef;
    }
    $termios->setiflag(0);
    $termios->setoflag(0);
    $termios->setlflag(0);
    $termios->setcc(&POSIX::VMIN, 1);
    $termios->setcc(&POSIX::VTIME, 0);
    unless ($termios->setattr($ttyno, &POSIX::TCSANOW)) {
      warn "set_raw: setattr($ttyno) failed: $!";
      return undef;
    }
    return 1;
  }
  
  
  1;
  
  __END__
  
  =head1 NAME
  
  IO::Tty - Low-level allocate a pseudo-Tty, import constants.
  
  =head1 VERSION
  
  1.12
  
  =head1 SYNOPSIS
  
      use IO::Tty qw(TIOCNOTTY);
      ...
      # use only to import constants, see IO::Pty to create ptys.
  
  =head1 DESCRIPTION
  
  C<IO::Tty> is used internally by C<IO::Pty> to create a pseudo-tty.
  You wouldn't want to use it directly except to import constants, use
  C<IO::Pty>.  For a list of importable constants, see
  L<IO::Tty::Constant>.
  
  Windows is now supported, but ONLY under the Cygwin
  environment, see L<http://sources.redhat.com/cygwin/>.
  
  Please note that pty creation is very system-dependend.  From my
  experience, any modern POSIX system should be fine.  Find below a list
  of systems that C<IO::Tty> should work on.  A more detailed table
  (which is slowly getting out-of-date) is available from the project
  pages document manager at SourceForge
  L<http://sourceforge.net/projects/expectperl/>.
  
  If you have problems on your system and your system is listed in the
  "verified" list, you probably have some non-standard setup, e.g. you
  compiled your Linux-kernel yourself and disabled ptys (bummer!).
  Please ask your friendly sysadmin for help.
  
  If your system is not listed, unpack the latest version of C<IO::Tty>,
  do a C<'perl Makefile.PL; make; make test; uname -a'> and send me
  (F<RGiersig@cpan.org>) the results and I'll see what I can deduce from
  that.  There are chances that it will work right out-of-the-box...
  
  If it's working on your system, please send me a short note with
  details (version number, distribution, etc. 'uname -a' and 'perl -V'
  is a good start; also, the output from "perl Makefile.PL" contains a
  lot of interesting info, so please include that as well) so I can get
  an overview.  Thanks!
  
  
  =head1 VERIFIED SYSTEMS, KNOWN ISSUES
  
  This is a list of systems that C<IO::Tty> seems to work on ('make
  test' passes) with comments about "features":
  
  =over 4
  
  =item * AIX 4.3
  
  Returns EIO instead of EOF when the slave is closed.  Benign.
  
  =item * AIX 5.x
  
  =item * FreeBSD 4.4
  
  EOF on the slave tty is not reported back to the master.
  
  =item * OpenBSD 2.8
  
  The ioctl TIOCSCTTY sometimes fails.  This is also known in
  Tcl/Expect, see http://expect.nist.gov/FAQ.html
  
  EOF on the slave tty is not reported back to the master.
  
  =item * Darwin 7.9.0
  
  =item * HPUX 10.20 & 11.00
  
  EOF on the slave tty is not reported back to the master.
  
  =item * IRIX 6.5
  
  =item * Linux 2.2.x & 2.4.x
  
  Returns EIO instead of EOF when the slave is closed.  Benign.
  
  =item * OSF 4.0
  
  EOF on the slave tty is not reported back to the master.
  
  =item * Solaris 8, 2.7, 2.6
  
  Has the "feature" of returning EOF just once?!
  
  EOF on the slave tty is not reported back to the master.
  
  =item * Windows NT/2k/XP (under Cygwin)
  
  When you send (print) a too long line (>160 chars) to a non-raw pty,
  the call just hangs forever and even alarm() cannot get you out.
  Don't complain to me...
  
  EOF on the slave tty is not reported back to the master.
  
  =item * z/OS
  
  =back
  
  The following systems have not been verified yet for this version, but
  a previous version worked on them:
  
  =over 4
  
  =item * SCO Unix
  
  =item * NetBSD
  
  probably the same as the other *BSDs...
  
  =back
  
  If you have additions to these lists, please mail them to
  E<lt>F<RGiersig@cpan.org>E<gt>.
  
  
  =head1 SEE ALSO
  
  L<IO::Pty>, L<IO::Tty::Constant>
  
  
  =head1 MAILING LISTS
  
  As this module is mainly used by Expect, support for it is available
  via the two Expect mailing lists, expectperl-announce and
  expectperl-discuss, at
  
    http://lists.sourceforge.net/lists/listinfo/expectperl-announce
  
  and
  
    http://lists.sourceforge.net/lists/listinfo/expectperl-discuss
  
  
  =head1 AUTHORS
  
  Originally by Graham Barr E<lt>F<gbarr@pobox.com>E<gt>, based on the
  Ptty module by Nick Ing-Simmons E<lt>F<nik@tiuk.ti.com>E<gt>.
  
  Now maintained and heavily rewritten by Roland Giersig
  E<lt>F<RGiersig@cpan.org>E<gt>.
  
  Contains copyrighted stuff from openssh v3.0p1, authored by Tatu
  Ylonen <ylo@cs.hut.fi>, Markus Friedl and Todd C. Miller
  <Todd.Miller@courtesan.com>.  I also got a lot of inspiration from
  the pty code in Xemacs.
  
  
  =head1 COPYRIGHT
  
  Now all code is free software; you can redistribute it and/or modify
  it under the same terms as Perl itself.
  
  Nevertheless the above AUTHORS retain their copyrights to the various
  parts and want to receive credit if their source code is used.
  See the source for details.
  
  
  =head1 DISCLAIMER
  
  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
  TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
  USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
  DAMAGE.
  
  In other words: Use at your own risk.  Provided as is.  Your mileage
  may vary.  Read the source, Luke!
  
  And finally, just to be sure:
  
  Any Use of This Product, in Any Manner Whatsoever, Will Increase the
  Amount of Disorder in the Universe. Although No Liability Is Implied
  Herein, the Consumer Is Warned That This Process Will Ultimately Lead
  to the Heat Death of the Universe.
  
  =cut
IO_TTY

    $main::fatpacked{"IPC/Run.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'IPC_RUN';
  package IPC::Run;
  use bytes;
  
  =pod
  
  =head1 NAME
  
  IPC::Run - system() and background procs w/ piping, redirs, ptys (Unix, Win32)
  
  =head1 SYNOPSIS
  
     ## First,a command to run:
        my @cat = qw( cat );
  
     ## Using run() instead of system():
        use IPC::Run qw( run timeout );
  
        run \@cat, \$in, \$out, \$err, timeout( 10 ) or die "cat: $?"
  
        # Can do I/O to sub refs and filenames, too:
        run \@cat, '<', "in.txt", \&out, \&err or die "cat: $?"
        run \@cat, '<', "in.txt", '>>', "out.txt", '2>>', "err.txt";
  
  
        # Redirecting using pseudo-terminals instead of pipes.
        run \@cat, '<pty<', \$in,  '>pty>', \$out_and_err;
  
     ## Scripting subprocesses (like Expect):
  
        use IPC::Run qw( start pump finish timeout );
  
        # Incrementally read from / write to scalars. 
        # $in is drained as it is fed to cat's stdin,
        # $out accumulates cat's stdout
        # $err accumulates cat's stderr
        # $h is for "harness".
        my $h = start \@cat, \$in, \$out, \$err, timeout( 10 );
  
        $in .= "some input\n";
        pump $h until $out =~ /input\n/g;
  
        $in .= "some more input\n";
        pump $h until $out =~ /\G.*more input\n/;
  
        $in .= "some final input\n";
        finish $h or die "cat returned $?";
  
        warn $err if $err; 
        print $out;         ## All of cat's output
  
     # Piping between children
        run \@cat, '|', \@gzip;
  
     # Multiple children simultaneously (run() blocks until all
     # children exit, use start() for background execution):
        run \@foo1, '&', \@foo2;
  
     # Calling \&set_up_child in the child before it executes the
     # command (only works on systems with true fork() & exec())
     # exceptions thrown in set_up_child() will be propagated back
     # to the parent and thrown from run().
        run \@cat, \$in, \$out,
           init => \&set_up_child;
  
     # Read from / write to file handles you open and close
        open IN,  '<in.txt'  or die $!;
        open OUT, '>out.txt' or die $!;
        print OUT "preamble\n";
        run \@cat, \*IN, \*OUT or die "cat returned $?";
        print OUT "postamble\n";
        close IN;
        close OUT;
  
     # Create pipes for you to read / write (like IPC::Open2 & 3).
        $h = start
           \@cat,
              '<pipe', \*IN, # may also be a lexical filehandle e.g. \my $infh
              '>pipe', \*OUT,
              '2>pipe', \*ERR 
           or die "cat returned $?";
        print IN "some input\n";
        close IN;
        print <OUT>, <ERR>;
        finish $h;
  
     # Mixing input and output modes
        run \@cat, 'in.txt', \&catch_some_out, \*ERR_LOG );
  
     # Other redirection constructs
        run \@cat, '>&', \$out_and_err;
        run \@cat, '2>&1';
        run \@cat, '0<&3';
        run \@cat, '<&-';
        run \@cat, '3<', \$in3;
        run \@cat, '4>', \$out4;
        # etc.
  
     # Passing options:
        run \@cat, 'in.txt', debug => 1;
  
     # Call this system's shell, returns TRUE on 0 exit code
     # THIS IS THE OPPOSITE SENSE OF system()'s RETURN VALUE
        run "cat a b c" or die "cat returned $?";
  
     # Launch a sub process directly, no shell.  Can't do redirection
     # with this form, it's here to behave like system() with an
     # inverted result.
        $r = run "cat a b c";
  
     # Read from a file in to a scalar
        run io( "filename", 'r', \$recv );
        run io( \*HANDLE,   'r', \$recv );
  
  =head1 DESCRIPTION
  
  IPC::Run allows you to run and interact with child processes using files, pipes,
  and pseudo-ttys.  Both system()-style and scripted usages are supported and
  may be mixed.  Likewise, functional and OO API styles are both supported and
  may be mixed.
  
  Various redirection operators reminiscent of those seen on common Unix and DOS
  command lines are provided.
  
  Before digging in to the details a few LIMITATIONS are important enough
  to be mentioned right up front:
  
  =over
  
  =item Win32 Support
  
  Win32 support is working but B<EXPERIMENTAL>, but does pass all relevant tests
  on NT 4.0.  See L</Win32 LIMITATIONS>.
  
  =item pty Support
  
  If you need pty support, IPC::Run should work well enough most of the
  time, but IO::Pty is being improved, and IPC::Run will be improved to
  use IO::Pty's new features when it is release.
  
  The basic problem is that the pty needs to initialize itself before the
  parent writes to the master pty, or the data written gets lost.  So
  IPC::Run does a sleep(1) in the parent after forking to (hopefully) give
  the child a chance to run.  This is a kludge that works well on non
  heavily loaded systems :(.
  
  ptys are not supported yet under Win32, but will be emulated...
  
  =item Debugging Tip
  
  You may use the environment variable C<IPCRUNDEBUG> to see what's going on
  under the hood:
  
     $ IPCRUNDEBUG=basic   myscript     # prints minimal debugging
     $ IPCRUNDEBUG=data    myscript     # prints all data reads/writes
     $ IPCRUNDEBUG=details myscript     # prints lots of low-level details
     $ IPCRUNDEBUG=gory    myscript     # (Win32 only) prints data moving through
                                        # the helper processes.
  
  =back
  
  We now return you to your regularly scheduled documentation.
  
  =head2 Harnesses
  
  Child processes and I/O handles are gathered in to a harness, then
  started and run until the processing is finished or aborted.
  
  =head2 run() vs. start(); pump(); finish();
  
  There are two modes you can run harnesses in: run() functions as an
  enhanced system(), and start()/pump()/finish() allow for background
  processes and scripted interactions with them.
  
  When using run(), all data to be sent to the harness is set up in
  advance (though one can feed subprocesses input from subroutine refs to
  get around this limitation). The harness is run and all output is
  collected from it, then any child processes are waited for:
  
     run \@cmd, \<<IN, \$out;
     blah
     IN
  
     ## To precompile harnesses and run them later:
     my $h = harness \@cmd, \<<IN, \$out;
     blah
     IN
  
     run $h;
  
  The background and scripting API is provided by start(), pump(), and
  finish(): start() creates a harness if need be (by calling harness())
  and launches any subprocesses, pump() allows you to poll them for
  activity, and finish() then monitors the harnessed activities until they
  complete.
  
     ## Build the harness, open all pipes, and launch the subprocesses
     my $h = start \@cat, \$in, \$out;
     $in = "first input\n";
  
     ## Now do I/O.  start() does no I/O.
     pump $h while length $in;  ## Wait for all input to go
  
     ## Now do some more I/O.
     $in = "second input\n";
     pump $h until $out =~ /second input/;
  
     ## Clean up
     finish $h or die "cat returned $?";
  
  You can optionally compile the harness with harness() prior to
  start()ing or run()ing, and you may omit start() between harness() and
  pump().  You might want to do these things if you compile your harnesses
  ahead of time.
  
  =head2 Using regexps to match output
  
  As shown in most of the scripting examples, the read-to-scalar facility
  for gathering subcommand's output is often used with regular expressions
  to detect stopping points.  This is because subcommand output often
  arrives in dribbles and drabs, often only a character or line at a time.
  This output is input for the main program and piles up in variables like
  the C<$out> and C<$err> in our examples.
  
  Regular expressions can be used to wait for appropriate output in
  several ways.  The C<cat> example in the previous section demonstrates
  how to pump() until some string appears in the output.  Here's an
  example that uses C<smb> to fetch files from a remote server:
  
     $h = harness \@smbclient, \$in, \$out;
  
     $in = "cd /src\n";
     $h->pump until $out =~ /^smb.*> \Z/m;
     die "error cding to /src:\n$out" if $out =~ "ERR";
     $out = '';
  
     $in = "mget *\n";
     $h->pump until $out =~ /^smb.*> \Z/m;
     die "error retrieving files:\n$out" if $out =~ "ERR";
  
     $in = "quit\n";
     $h->finish;
  
  Notice that we carefully clear $out after the first command/response
  cycle? That's because IPC::Run does not delete $out when we continue,
  and we don't want to trip over the old output in the second
  command/response cycle.
  
  Say you want to accumulate all the output in $out and analyze it
  afterwards.  Perl offers incremental regular expression matching using
  the C<m//gc> and pattern matching idiom and the C<\G> assertion.
  IPC::Run is careful not to disturb the current C<pos()> value for
  scalars it appends data to, so we could modify the above so as not to
  destroy $out by adding a couple of C</gc> modifiers.  The C</g> keeps us
  from tripping over the previous prompt and the C</c> keeps us from
  resetting the prior match position if the expected prompt doesn't
  materialize immediately:
  
     $h = harness \@smbclient, \$in, \$out;
  
     $in = "cd /src\n";
     $h->pump until $out =~ /^smb.*> \Z/mgc;
     die "error cding to /src:\n$out" if $out =~ "ERR";
  
     $in = "mget *\n";
     $h->pump until $out =~ /^smb.*> \Z/mgc;
     die "error retrieving files:\n$out" if $out =~ "ERR";
  
     $in = "quit\n";
     $h->finish;
  
     analyze( $out );
  
  When using this technique, you may want to preallocate $out to have
  plenty of memory or you may find that the act of growing $out each time
  new input arrives causes an C<O(length($out)^2)> slowdown as $out grows.
  Say we expect no more than 10,000 characters of input at the most.  To
  preallocate memory to $out, do something like:
  
     my $out = "x" x 10_000;
     $out = "";
  
  C<perl> will allocate at least 10,000 characters' worth of space, then
  mark the $out as having 0 length without freeing all that yummy RAM.
  
  =head2 Timeouts and Timers
  
  More than likely, you don't want your subprocesses to run forever, and
  sometimes it's nice to know that they're going a little slowly.
  Timeouts throw exceptions after a some time has elapsed, timers merely
  cause pump() to return after some time has elapsed.  Neither is
  reset/restarted automatically.
  
  Timeout objects are created by calling timeout( $interval ) and passing
  the result to run(), start() or harness().  The timeout period starts
  ticking just after all the child processes have been fork()ed or
  spawn()ed, and are polled for expiration in run(), pump() and finish().
  If/when they expire, an exception is thrown.  This is typically useful
  to keep a subprocess from taking too long.
  
  If a timeout occurs in run(), all child processes will be terminated and
  all file/pipe/ptty descriptors opened by run() will be closed.  File
  descriptors opened by the parent process and passed in to run() are not
  closed in this event.
  
  If a timeout occurs in pump(), pump_nb(), or finish(), it's up to you to
  decide whether to kill_kill() all the children or to implement some more
  graceful fallback.  No I/O will be closed in pump(), pump_nb() or
  finish() by such an exception (though I/O is often closed down in those
  routines during the natural course of events).
  
  Often an exception is too harsh.  timer( $interval ) creates timer
  objects that merely prevent pump() from blocking forever.  This can be
  useful for detecting stalled I/O or printing a soothing message or "."
  to pacify an anxious user.
  
  Timeouts and timers can both be restarted at any time using the timer's
  start() method (this is not the start() that launches subprocesses).  To
  restart a timer, you need to keep a reference to the timer:
  
     ## Start with a nice long timeout to let smbclient connect.  If
     ## pump or finish take too long, an exception will be thrown.
  
   my $h;
   eval {
     $h = harness \@smbclient, \$in, \$out, \$err, ( my $t = timeout 30 );
     sleep 11;  # No effect: timer not running yet
  
     start $h;
     $in = "cd /src\n";
     pump $h until ! length $in;
  
     $in = "ls\n";
     ## Now use a short timeout, since this should be faster
     $t->start( 5 );
     pump $h until ! length $in;
  
     $t->start( 10 );  ## Give smbclient a little while to shut down.
     $h->finish;
   };
   if ( $@ ) {
     my $x = $@;    ## Preserve $@ in case another exception occurs
     $h->kill_kill; ## kill it gently, then brutally if need be, or just
                     ## brutally on Win32.
     die $x;
   }
  
  Timeouts and timers are I<not> checked once the subprocesses are shut
  down; they will not expire in the interval between the last valid
  process and when IPC::Run scoops up the processes' result codes, for
  instance.
  
  =head2 Spawning synchronization, child exception propagation
  
  start() pauses the parent until the child executes the command or CODE
  reference and propagates any exceptions thrown (including exec()
  failure) back to the parent.  This has several pleasant effects: any
  exceptions thrown in the child, including exec() failure, come flying
  out of start() or run() as though they had occurred in the parent.
  
  This includes exceptions your code thrown from init subs.  In this
  example:
  
     eval {
        run \@cmd, init => sub { die "blast it! foiled again!" };
     };
     print $@;
  
  the exception "blast it! foiled again" will be thrown from the child
  process (preventing the exec()) and printed by the parent.
  
  In situations like
  
     run \@cmd1, "|", \@cmd2, "|", \@cmd3;
  
  @cmd1 will be initted and exec()ed before @cmd2, and @cmd2 before @cmd3.
  This can save time and prevent oddball errors emitted by later commands
  when earlier commands fail to execute.  Note that IPC::Run doesn't start
  any commands unless it can find the executables referenced by all
  commands.  These executables must pass both the C<-f> and C<-x> tests
  described in L<perlfunc>.
  
  Another nice effect is that init() subs can take their time doing things
  and there will be no problems caused by a parent continuing to execute
  before a child's init() routine is complete.  Say the init() routine
  needs to open a socket or a temp file that the parent wants to connect
  to; without this synchronization, the parent will need to implement a
  retry loop to wait for the child to run, since often, the parent gets a
  lot of things done before the child's first timeslice is allocated.
  
  This is also quite necessary for pseudo-tty initialization, which needs
  to take place before the parent writes to the child via pty.  Writes
  that occur before the pty is set up can get lost.
  
  A final, minor, nicety is that debugging output from the child will be
  emitted before the parent continues on, making for much clearer debugging
  output in complex situations.
  
  The only drawback I can conceive of is that the parent can't continue to
  operate while the child is being initted.  If this ever becomes a
  problem in the field, we can implement an option to avoid this behavior,
  but I don't expect it to.
  
  B<Win32>: executing CODE references isn't supported on Win32, see
  L</Win32 LIMITATIONS> for details.
  
  =head2 Syntax
  
  run(), start(), and harness() can all take a harness specification
  as input.  A harness specification is either a single string to be passed
  to the systems' shell:
  
     run "echo 'hi there'";
  
  or a list of commands, io operations, and/or timers/timeouts to execute.
  Consecutive commands must be separated by a pipe operator '|' or an '&'.
  External commands are passed in as array references, and, on systems
  supporting fork(), Perl code may be passed in as subs:
  
     run \@cmd;
     run \@cmd1, '|', \@cmd2;
     run \@cmd1, '&', \@cmd2;
     run \&sub1;
     run \&sub1, '|', \&sub2;
     run \&sub1, '&', \&sub2;
  
  '|' pipes the stdout of \@cmd1 the stdin of \@cmd2, just like a
  shell pipe.  '&' does not.  Child processes to the right of a '&'
  will have their stdin closed unless it's redirected-to.
  
  L<IPC::Run::IO> objects may be passed in as well, whether or not
  child processes are also specified:
  
     run io( "infile", ">", \$in ), io( "outfile", "<", \$in );
        
  as can L<IPC::Run::Timer> objects:
  
     run \@cmd, io( "outfile", "<", \$in ), timeout( 10 );
  
  Commands may be followed by scalar, sub, or i/o handle references for
  redirecting
  child process input & output:
  
     run \@cmd,  \undef,            \$out;
     run \@cmd,  \$in,              \$out;
     run \@cmd1, \&in, '|', \@cmd2, \*OUT;
     run \@cmd1, \*IN, '|', \@cmd2, \&out;
  
  This is known as succinct redirection syntax, since run(), start()
  and harness(), figure out which file descriptor to redirect and how.
  File descriptor 0 is presumed to be an input for
  the child process, all others are outputs.  The assumed file
  descriptor always starts at 0, unless the command is being piped to,
  in which case it starts at 1.
  
  To be explicit about your redirects, or if you need to do more complex
  things, there's also a redirection operator syntax:
  
     run \@cmd, '<', \undef, '>',  \$out;
     run \@cmd, '<', \undef, '>&', \$out_and_err;
     run(
        \@cmd1,
           '<', \$in,
        '|', \@cmd2,
           \$out
     );
  
  Operator syntax is required if you need to do something other than simple
  redirection to/from scalars or subs, like duping or closing file descriptors
  or redirecting to/from a named file.  The operators are covered in detail
  below.
  
  After each \@cmd (or \&foo), parsing begins in succinct mode and toggles to
  operator syntax mode when an operator (ie plain scalar, not a ref) is seen.
  Once in
  operator syntax mode, parsing only reverts to succinct mode when a '|' or
  '&' is seen.
  
  In succinct mode, each parameter after the \@cmd specifies what to
  do with the next highest file descriptor. These File descriptor start
  with 0 (stdin) unless stdin is being piped to (C<'|', \@cmd>), in which
  case they start with 1 (stdout).  Currently, being on the left of
  a pipe (C<\@cmd, \$out, \$err, '|'>) does I<not> cause stdout to be
  skipped, though this may change since it's not as DWIMerly as it
  could be.  Only stdin is assumed to be an
  input in succinct mode, all others are assumed to be outputs.
  
  If no piping or redirection is specified for a child, it will inherit
  the parent's open file handles as dictated by your system's
  close-on-exec behavior and the $^F flag, except that processes after a
  '&' will not inherit the parent's stdin. Also note that $^F does not
  affect file descriptors obtained via POSIX, since it only applies to
  full-fledged Perl file handles.  Such processes will have their stdin
  closed unless it has been redirected-to.
  
  If you want to close a child processes stdin, you may do any of:
  
     run \@cmd, \undef;
     run \@cmd, \"";
     run \@cmd, '<&-';
     run \@cmd, '0<&-';
  
  Redirection is done by placing redirection specifications immediately 
  after a command or child subroutine:
  
     run \@cmd1,      \$in, '|', \@cmd2,      \$out;
     run \@cmd1, '<', \$in, '|', \@cmd2, '>', \$out;
  
  If you omit the redirection operators, descriptors are counted
  starting at 0.  Descriptor 0 is assumed to be input, all others
  are outputs.  A leading '|' consumes descriptor 0, so this
  works as expected.
  
     run \@cmd1, \$in, '|', \@cmd2, \$out;
     
  The parameter following a redirection operator can be a scalar ref,
  a subroutine ref, a file name, an open filehandle, or a closed
  filehandle.
  
  If it's a scalar ref, the child reads input from or sends output to
  that variable:
  
     $in = "Hello World.\n";
     run \@cat, \$in, \$out;
     print $out;
  
  Scalars used in incremental (start()/pump()/finish()) applications are treated
  as queues: input is removed from input scalers, resulting in them dwindling
  to '', and output is appended to output scalars.  This is not true of 
  harnesses run() in batch mode.
  
  It's usually wise to append new input to be sent to the child to the input
  queue, and you'll often want to zap output queues to '' before pumping.
  
     $h = start \@cat, \$in;
     $in = "line 1\n";
     pump $h;
     $in .= "line 2\n";
     pump $h;
     $in .= "line 3\n";
     finish $h;
  
  The final call to finish() must be there: it allows the child process(es)
  to run to completion and waits for their exit values.
  
  =head1 OBSTINATE CHILDREN
  
  Interactive applications are usually optimized for human use.  This
  can help or hinder trying to interact with them through modules like
  IPC::Run.  Frequently, programs alter their behavior when they detect
  that stdin, stdout, or stderr are not connected to a tty, assuming that
  they are being run in batch mode.  Whether this helps or hurts depends
  on which optimizations change.  And there's often no way of telling
  what a program does in these areas other than trial and error and
  occasionally, reading the source.  This includes different versions
  and implementations of the same program.
  
  All hope is not lost, however.  Most programs behave in reasonably
  tractable manners, once you figure out what it's trying to do.
  
  Here are some of the issues you might need to be aware of.
  
  =over
  
  =item *
  
  fflush()ing stdout and stderr
  
  This lets the user see stdout and stderr immediately.  Many programs
  undo this optimization if stdout is not a tty, making them harder to
  manage by things like IPC::Run.
  
  Many programs decline to fflush stdout or stderr if they do not
  detect a tty there.  Some ftp commands do this, for instance.
  
  If this happens to you, look for a way to force interactive behavior,
  like a command line switch or command.  If you can't, you will
  need to use a pseudo terminal ('<pty<' and '>pty>').
  
  =item *
  
  false prompts
  
  Interactive programs generally do not guarantee that output from user
  commands won't contain a prompt string.  For example, your shell prompt
  might be a '$', and a file named '$' might be the only file in a directory
  listing.
  
  This can make it hard to guarantee that your output parser won't be fooled
  into early termination of results.
  
  To help work around this, you can see if the program can alter it's 
  prompt, and use something you feel is never going to occur in actual
  practice.
  
  You should also look for your prompt to be the only thing on a line:
  
     pump $h until $out =~ /^<SILLYPROMPT>\s?\z/m;
  
  (use C<(?!\n)\Z> in place of C<\z> on older perls).
  
  You can also take the approach that IPC::ChildSafe takes and emit a
  command with known output after each 'real' command you issue, then
  look for this known output.  See new_appender() and new_chunker() for
  filters that can help with this task.
  
  If it's not convenient or possibly to alter a prompt or use a known
  command/response pair, you might need to autodetect the prompt in case
  the local version of the child program is different then the one
  you tested with, or if the user has control over the look & feel of
  the prompt.
  
  =item *
  
  Refusing to accept input unless stdin is a tty.
  
  Some programs, for security reasons, will only accept certain types
  of input from a tty.  su, notable, will not prompt for a password unless
  it's connected to a tty.
  
  If this is your situation, use a pseudo terminal ('<pty<' and '>pty>').
  
  =item *
  
  Not prompting unless connected to a tty.
  
  Some programs don't prompt unless stdin or stdout is a tty.  See if you can
  turn prompting back on.  If not, see if you can come up with a command that
  you can issue after every real command and look for it's output, as
  IPC::ChildSafe does.   There are two filters included with IPC::Run that
  can help with doing this: appender and chunker (see new_appender() and
  new_chunker()).
  
  =item *
  
  Different output format when not connected to a tty.
  
  Some commands alter their formats to ease machine parsability when they
  aren't connected to a pipe.  This is actually good, but can be surprising.
  
  =back
  
  =head1 PSEUDO TERMINALS
  
  On systems providing pseudo terminals under /dev, IPC::Run can use IO::Pty
  (available on CPAN) to provide a terminal environment to subprocesses.
  This is necessary when the subprocess really wants to think it's connected
  to a real terminal.
  
  =head2 CAVEATS
  
  Pseudo-terminals are not pipes, though they are similar.  Here are some
  differences to watch out for.
  
  =over
  
  =item Echoing
  
  Sending to stdin will cause an echo on stdout, which occurs before each
  line is passed to the child program.  There is currently no way to
  disable this, although the child process can and should disable it for
  things like passwords.
  
  =item Shutdown
  
  IPC::Run cannot close a pty until all output has been collected.  This
  means that it is not possible to send an EOF to stdin by half-closing
  the pty, as we can when using a pipe to stdin.
  
  This means that you need to send the child process an exit command or
  signal, or run() / finish() will time out.  Be careful not to expect a
  prompt after sending the exit command.
  
  =item Command line editing
  
  Some subprocesses, notable shells that depend on the user's prompt
  settings, will reissue the prompt plus the command line input so far
  once for each character.
  
  =item '>pty>' means '&>pty>', not '1>pty>'
  
  The pseudo terminal redirects both stdout and stderr unless you specify
  a file descriptor.  If you want to grab stderr separately, do this:
  
     start \@cmd, '<pty<', \$in, '>pty>', \$out, '2>', \$err;
  
  =item stdin, stdout, and stderr not inherited
  
  Child processes harnessed to a pseudo terminal have their stdin, stdout,
  and stderr completely closed before any redirection operators take
  effect.  This casts of the bonds of the controlling terminal.  This is
  not done when using pipes.
  
  Right now, this affects all children in a harness that has a pty in use,
  even if that pty would not affect a particular child.  That's a bug and
  will be fixed.  Until it is, it's best not to mix-and-match children.
  
  =back
  
  =head2 Redirection Operators
  
     Operator       SHNP   Description
     ========       ====   ===========
     <, N<          SHN    Redirects input to a child's fd N (0 assumed)
  
     >, N>          SHN    Redirects output from a child's fd N (1 assumed)
     >>, N>>        SHN    Like '>', but appends to scalars or named files
     >&, &>         SHN    Redirects stdout & stderr from a child process
  
     <pty, N<pty    S      Like '<', but uses a pseudo-tty instead of a pipe
     >pty, N>pty    S      Like '>', but uses a pseudo-tty instead of a pipe
  
     N<&M                  Dups input fd N to input fd M
     M>&N                  Dups output fd N to input fd M
     N<&-                  Closes fd N
  
     <pipe, N<pipe     P   Pipe opens H for caller to read, write, close.
     >pipe, N>pipe     P   Pipe opens H for caller to read, write, close.
                        
  'N' and 'M' are placeholders for integer file descriptor numbers.  The
  terms 'input' and 'output' are from the child process's perspective.
  
  The SHNP field indicates what parameters an operator can take:
  
     S: \$scalar or \&function references.  Filters may be used with
        these operators (and only these).
     H: \*HANDLE or IO::Handle for caller to open, and close
     N: "file name".
     P: \*HANDLE or lexical filehandle opened by IPC::Run as the parent end of a pipe, but read
        and written to and closed by the caller (like IPC::Open3).
  
  =over
  
  =item Redirecting input: [n]<, [n]<pipe
  
  You can input the child reads on file descriptor number n to come from a
  scalar variable, subroutine, file handle, or a named file.  If stdin
  is not redirected, the parent's stdin is inherited.
  
     run \@cat, \undef          ## Closes child's stdin immediately
        or die "cat returned $?"; 
  
     run \@cat, \$in;
  
     run \@cat, \<<TOHERE;
     blah
     TOHERE
  
     run \@cat, \&input;       ## Calls &input, feeding data returned
                                ## to child's.  Closes child's stdin
                                ## when undef is returned.
  
  Redirecting from named files requires you to use the input
  redirection operator:
  
     run \@cat, '<.profile';
     run \@cat, '<', '.profile';
  
     open IN, "<foo";
     run \@cat, \*IN;
     run \@cat, *IN{IO};
  
  The form used second example here is the safest,
  since filenames like "0" and "&more\n" won't confuse &run:
  
  You can't do either of
  
     run \@a, *IN;      ## INVALID
     run \@a, '<', *IN; ## BUGGY: Reads file named like "*main::A"
     
  because perl passes a scalar containing a string that
  looks like "*main::A" to &run, and &run can't tell the difference
  between that and a redirection operator or a file name.  &run guarantees
  that any scalar you pass after a redirection operator is a file name.
  
  If your child process will take input from file descriptors other
  than 0 (stdin), you can use a redirection operator with any of the
  valid input forms (scalar ref, sub ref, etc.):
  
     run \@cat, '3<', \$in3;
  
  When redirecting input from a scalar ref, the scalar ref is
  used as a queue.  This allows you to use &harness and pump() to
  feed incremental bits of input to a coprocess.  See L</Coprocesses>
  below for more information.
  
  The <pipe operator opens the write half of a pipe on the filehandle
  glob reference it takes as an argument:
  
     $h = start \@cat, '<pipe', \*IN;
     print IN "hello world\n";
     pump $h;
     close IN;
     finish $h;
  
  Unlike the other '<' operators, IPC::Run does nothing further with
  it: you are responsible for it.  The previous example is functionally
  equivalent to:
  
     pipe( \*R, \*IN ) or die $!;
     $h = start \@cat, '<', \*IN;
     print IN "hello world\n";
     pump $h;
     close IN;
     finish $h;
  
  This is like the behavior of IPC::Open2 and IPC::Open3.
  
  B<Win32>: The handle returned is actually a socket handle, so you can
  use select() on it.
  
  =item Redirecting output: [n]>, [n]>>, [n]>&[m], [n]>pipe
  
  You can redirect any output the child emits
  to a scalar variable, subroutine, file handle, or file name.  You
  can have &run truncate or append to named files or scalars.  If
  you are redirecting stdin as well, or if the command is on the
  receiving end of a pipeline ('|'), you can omit the redirection
  operator:
  
     @ls = ( 'ls' );
     run \@ls, \undef, \$out
        or die "ls returned $?"; 
  
     run \@ls, \undef, \&out;  ## Calls &out each time some output
                                ## is received from the child's 
                                ## when undef is returned.
  
     run \@ls, \undef, '2>ls.err';
     run \@ls, '2>', 'ls.err';
  
  The two parameter form guarantees that the filename
  will not be interpreted as a redirection operator:
  
     run \@ls, '>', "&more";
     run \@ls, '2>', ">foo\n";
  
  You can pass file handles you've opened for writing:
  
     open( *OUT, ">out.txt" );
     open( *ERR, ">err.txt" );
     run \@cat, \*OUT, \*ERR;
  
  Passing a scalar reference and a code reference requires a little
  more work, but allows you to capture all of the output in a scalar
  or each piece of output by a callback:
  
  These two do the same things:
  
     run( [ 'ls' ], '2>', sub { $err_out .= $_[0] } );
  
  does the same basic thing as:
  
     run( [ 'ls' ], '2>', \$err_out );
  
  The subroutine will be called each time some data is read from the child.
  
  The >pipe operator is different in concept than the other '>' operators,
  although it's syntax is similar:
  
     $h = start \@cat, $in, '>pipe', \*OUT, '2>pipe', \*ERR;
     $in = "hello world\n";
     finish $h;
     print <OUT>;
     print <ERR>;
     close OUT;
     close ERR;
  
  causes two pipe to be created, with one end attached to cat's stdout
  and stderr, respectively, and the other left open on OUT and ERR, so
  that the script can manually
  read(), select(), etc. on them.  This is like
  the behavior of IPC::Open2 and IPC::Open3.
  
  B<Win32>: The handle returned is actually a socket handle, so you can
  use select() on it.
  
  =item Duplicating output descriptors: >&m, n>&m
  
  This duplicates output descriptor number n (default is 1 if n is omitted)
  from descriptor number m.
  
  =item Duplicating input descriptors: <&m, n<&m
  
  This duplicates input descriptor number n (default is 0 if n is omitted)
  from descriptor number m
  
  =item Closing descriptors: <&-, 3<&-
  
  This closes descriptor number n (default is 0 if n is omitted).  The
  following commands are equivalent:
  
     run \@cmd, \undef;
     run \@cmd, '<&-';
     run \@cmd, '<in.txt', '<&-';
  
  Doing
  
     run \@cmd, \$in, '<&-';    ## SIGPIPE recipe.
  
  is dangerous: the parent will get a SIGPIPE if $in is not empty.
  
  =item Redirecting both stdout and stderr: &>, >&, &>pipe, >pipe&
  
  The following pairs of commands are equivalent:
  
     run \@cmd, '>&', \$out;       run \@cmd, '>', \$out,     '2>&1';
     run \@cmd, '>&', 'out.txt';   run \@cmd, '>', 'out.txt', '2>&1';
  
  etc.
  
  File descriptor numbers are not permitted to the left or the right of
  these operators, and the '&' may occur on either end of the operator.
  
  The '&>pipe' and '>pipe&' variants behave like the '>pipe' operator, except
  that both stdout and stderr write to the created pipe.
  
  =item Redirection Filters
  
  Both input redirections and output redirections that use scalars or
  subs as endpoints may have an arbitrary number of filter subs placed
  between them and the child process.  This is useful if you want to
  receive output in chunks, or if you want to massage each chunk of
  data sent to the child.  To use this feature, you must use operator
  syntax:
  
     run(
        \@cmd
           '<', \&in_filter_2, \&in_filter_1, $in,
           '>', \&out_filter_1, \&in_filter_2, $out,
     );
  
  This capability is not provided for IO handles or named files.
  
  Two filters are provided by IPC::Run: appender and chunker.  Because
  these may take an argument, you need to use the constructor functions
  new_appender() and new_chunker() rather than using \& syntax:
  
     run(
        \@cmd
           '<', new_appender( "\n" ), $in,
           '>', new_chunker, $out,
     );
  
  =back
  
  =head2 Just doing I/O
  
  If you just want to do I/O to a handle or file you open yourself, you
  may specify a filehandle or filename instead of a command in the harness
  specification:
  
     run io( "filename", '>', \$recv );
  
     $h = start io( $io, '>', \$recv );
  
     $h = harness \@cmd, '&', io( "file", '<', \$send );
  
  =head2 Options
  
  Options are passed in as name/value pairs:
  
     run \@cat, \$in, debug => 1;
  
  If you pass the debug option, you may want to pass it in first, so you
  can see what parsing is going on:
  
     run debug => 1, \@cat, \$in;
  
  =over
  
  =item debug
  
  Enables debugging output in parent and child.  Debugging info is emitted
  to the STDERR that was present when IPC::Run was first C<use()>ed (it's
  C<dup()>ed out of the way so that it can be redirected in children without
  having debugging output emitted on it).
  
  =back
  
  =head1 RETURN VALUES
  
  harness() and start() return a reference to an IPC::Run harness.  This is
  blessed in to the IPC::Run package, so you may make later calls to
  functions as members if you like:
  
     $h = harness( ... );
     $h->start;
     $h->pump;
     $h->finish;
  
     $h = start( .... );
     $h->pump;
     ...
  
  Of course, using method call syntax lets you deal with any IPC::Run
  subclasses that might crop up, but don't hold your breath waiting for
  any.
  
  run() and finish() return TRUE when all subcommands exit with a 0 result
  code.  B<This is the opposite of perl's system() command>.
  
  All routines raise exceptions (via die()) when error conditions are
  recognized.  A non-zero command result is not treated as an error
  condition, since some commands are tests whose results are reported 
  in their exit codes.
  
  =head1 ROUTINES
  
  =over
  
  =cut
  
  use strict;
  use Exporter ();
  use vars qw{$VERSION @ISA @FILTER_IMP @FILTERS @API @EXPORT_OK %EXPORT_TAGS};
  
  BEGIN {
      $VERSION = '20180523.0';
      @ISA     = qw{ Exporter };
  
      ## We use @EXPORT for the end user's convenience: there's only one function
      ## exported, it's homonymous with the module, it's an unusual name, and
      ## it can be suppressed by "use IPC::Run ();".
      @FILTER_IMP = qw( input_avail get_more_input );
      @FILTERS    = qw(
        new_appender
        new_chunker
        new_string_source
        new_string_sink
      );
      @API = qw(
        run
        harness start pump pumpable finish
        signal kill_kill reap_nb
        io timer timeout
        close_terminal
        binary
      );
      @EXPORT_OK = ( @API, @FILTER_IMP, @FILTERS, qw( Win32_MODE ) );
      %EXPORT_TAGS = (
          'filter_imp' => \@FILTER_IMP,
          'all'        => \@EXPORT_OK,
          'filters'    => \@FILTERS,
          'api'        => \@API,
      );
  
  }
  
  use strict;
  use IPC::Run::Debug;
  use Exporter;
  use Fcntl;
  use POSIX ();
  
  BEGIN {
      if ( $] < 5.008 ) { require Symbol; }
  }
  use Carp;
  use File::Spec ();
  use IO::Handle;
  require IPC::Run::IO;
  require IPC::Run::Timer;
  
  use constant Win32_MODE => $^O =~ /os2|Win32/i;
  
  BEGIN {
      if (Win32_MODE) {
          eval "use IPC::Run::Win32Helper; 1;"
            or ( $@ && die )
            or die "$!";
      }
      else {
          eval "use File::Basename; 1;" or die $!;
      }
  }
  
  sub input_avail();
  sub get_more_input();
  
  ###############################################################################
  
  ##
  ## Error constants, not too locale-dependent
  use vars qw( $_EIO $_EAGAIN );
  use Errno qw(   EIO   EAGAIN );
  
  BEGIN {
      local $!;
      $!       = EIO;
      $_EIO    = qr/^$!/;
      $!       = EAGAIN;
      $_EAGAIN = qr/^$!/;
  }
  
  ##
  ## State machine states, set in $self->{STATE}
  ##
  ## These must be in ascending order numerically
  ##
  sub _newed()     { 0 }
  sub _harnessed() { 1 }
  sub _finished()  { 2 }    ## _finished behave almost exactly like _harnessed
  sub _started()   { 3 }
  
  ##
  ## Which fds have been opened in the parent.  This may have extra fds, since
  ## we aren't all that rigorous about closing these off, but that's ok.  This
  ## is used on Unixish OSs to close all fds in the child that aren't needed
  ## by that particular child.
  my %fds;
  
  ## There's a bit of hackery going on here.
  ##
  ## We want to have any code anywhere be able to emit
  ## debugging statements without knowing what harness the code is
  ## being called in/from, since we'd need to pass a harness around to
  ## everything.
  ##
  ## Thus, $cur_self was born.
  
  use vars qw( $cur_self );
  
  sub _debug_fd {
      return fileno STDERR unless defined $cur_self;
  
      if ( _debugging && !defined $cur_self->{DEBUG_FD} ) {
          my $fd = select STDERR;
          $| = 1;
          select $fd;
          $cur_self->{DEBUG_FD} = POSIX::dup fileno STDERR;
          _debug("debugging fd is $cur_self->{DEBUG_FD}\n")
            if _debugging_details;
      }
  
      return fileno STDERR unless defined $cur_self->{DEBUG_FD};
  
      return $cur_self->{DEBUG_FD};
  }
  
  sub DESTROY {
      ## We absolutely do not want to do anything else here.  We are likely
      ## to be in a child process and we don't want to do things like kill_kill
      ## ourself or cause other destruction.
      my IPC::Run $self = shift;
      POSIX::close $self->{DEBUG_FD} if defined $self->{DEBUG_FD};
      $self->{DEBUG_FD} = undef;
  
      for my $kid ( @{$self->{KIDS}} ) {
          for my $op ( @{$kid->{OPS}} ) {
              delete $op->{FILTERS};
          }
      }
  }
  
  ##
  ## Support routines (NOT METHODS)
  ##
  my %cmd_cache;
  
  sub _search_path {
      my ($cmd_name) = @_;
      if ( File::Spec->file_name_is_absolute($cmd_name) && -x $cmd_name ) {
          _debug "'", $cmd_name, "' is absolute"
            if _debugging_details;
          return $cmd_name;
      }
  
      my $dirsep = (
            Win32_MODE     ? '[/\\\\]'
          : $^O =~ /MacOS/ ? ':'
          : $^O =~ /VMS/   ? '[\[\]]'
          :                  '/'
      );
  
      if (   Win32_MODE
          && ( $cmd_name =~ /$dirsep/ )
          && ( $cmd_name !~ m!\.[^\\/\.]+$! ) ) {
  
          _debug "no extension(.exe), checking ENV{PATHEXT}" if _debugging;
          for ( split /;/, $ENV{PATHEXT} || ".COM;.BAT;.EXE" ) {
              my $name = "$cmd_name$_";
              $cmd_name = $name, last if -f $name && -x _;
          }
          _debug "cmd_name is now '$cmd_name'" if _debugging;
      }
  
      if ( $cmd_name =~ /($dirsep)/ ) {
          _debug "'$cmd_name' contains '$1'" if _debugging;
          croak "file not found: $cmd_name"    unless -e $cmd_name;
          croak "not a file: $cmd_name"        unless -f $cmd_name;
          croak "permission denied: $cmd_name" unless -x $cmd_name;
          return $cmd_name;
      }
  
      if ( exists $cmd_cache{$cmd_name} ) {
          _debug "'$cmd_name' found in cache: '$cmd_cache{$cmd_name}'"
            if _debugging;
          return $cmd_cache{$cmd_name} if -x $cmd_cache{$cmd_name};
          _debug "'$cmd_cache{$cmd_name}' no longer executable, searching..."
            if _debugging;
          delete $cmd_cache{$cmd_name};
      }
  
      my @searched_in;
  
      ## This next bit is Unix/Win32 specific, unfortunately.
      ## There's been some conversation about extending File::Spec to provide
      ## a universal interface to PATH, but I haven't seen it yet.
      my $re = Win32_MODE ? qr/;/ : qr/:/;
  
    LOOP:
      for ( split( $re, $ENV{PATH} || '', -1 ) ) {
          $_ = "." unless length $_;
          push @searched_in, $_;
  
          my $prospect = File::Spec->catfile( $_, $cmd_name );
          my @prospects;
  
          @prospects =
            ( Win32_MODE && !( -f $prospect && -x _ ) )
            ? map "$prospect$_", split /;/, $ENV{PATHEXT} || ".COM;.BAT;.EXE"
            : ($prospect);
  
          for my $found (@prospects) {
              if ( -f $found && -x _ ) {
                  $cmd_cache{$cmd_name} = $found;
                  last LOOP;
              }
          }
      }
  
      if ( exists $cmd_cache{$cmd_name} ) {
          _debug "'", $cmd_name, "' added to cache: '", $cmd_cache{$cmd_name}, "'"
            if _debugging_details;
          return $cmd_cache{$cmd_name};
      }
  
      croak "Command '$cmd_name' not found in " . join( ", ", @searched_in );
  }
  
  sub _empty($) { !( defined $_[0] && length $_[0] ) }
  
  ## 'safe' versions of otherwise fun things to do. See also IPC::Run::Win32Helper.
  sub _close {
      confess 'undef' unless defined $_[0];
      my $fd = $_[0] =~ /^\d+$/ ? $_[0] : fileno $_[0];
      my $r = POSIX::close $fd;
      $r = $r ? '' : " ERROR $!";
      delete $fds{$fd};
      _debug "close( $fd ) = " . ( $r || 0 ) if _debugging_details;
  }
  
  sub _dup {
      confess 'undef' unless defined $_[0];
      my $r = POSIX::dup( $_[0] );
      croak "$!: dup( $_[0] )" unless defined $r;
      $r = 0 if $r eq '0 but true';
      _debug "dup( $_[0] ) = $r" if _debugging_details;
      $fds{$r} = {};
      return $r;
  }
  
  sub _dup2_rudely {
      confess 'undef' unless defined $_[0] && defined $_[1];
      my $r = POSIX::dup2( $_[0], $_[1] );
      croak "$!: dup2( $_[0], $_[1] )" unless defined $r;
      $r = 0 if $r eq '0 but true';
      _debug "dup2( $_[0], $_[1] ) = $r" if _debugging_details;
      $fds{$r} = {};
      return $r;
  }
  
  sub _exec {
      confess 'undef passed' if grep !defined, @_;
  
      #   exec @_ or croak "$!: exec( " . join( ', ', @_ ) . " )";
      _debug 'exec()ing ', join " ", map "'$_'", @_ if _debugging_details;
  
      #   {
  ## Commented out since we don't call this on Win32.
      #      # This works around the bug where 5.6.1 complains
      #      # "Can't exec ...: No error" after an exec on NT, where
      #      # exec() is simulated and actually returns in Perl's C
      #      # code, though Perl's &exec does not...
      #      no warnings "exec";
      #
      #      # Just in case the no warnings workaround
      #      # stops being a workaround, we don't want
      #      # old values of $! causing spurious strerr()
      #      # messages to appear in the "Can't exec" message
      #      undef $!;
      exec { $_[0] } @_;
  
      #   }
      #   croak "$!: exec( " . join( ', ', map "'$_'", @_ ) . " )";
      ## Fall through so $! can be reported to parent.
  }
  
  sub _sysopen {
      confess 'undef' unless defined $_[0] && defined $_[1];
      _debug sprintf( "O_RDONLY=0x%02x ", O_RDONLY ),
        sprintf( "O_WRONLY=0x%02x ", O_WRONLY ),
        sprintf( "O_RDWR=0x%02x ",   O_RDWR ),
        sprintf( "O_TRUNC=0x%02x ",  O_TRUNC ),
        sprintf( "O_CREAT=0x%02x ",  O_CREAT ),
        sprintf( "O_APPEND=0x%02x ", O_APPEND ),
        if _debugging_details;
      my $r = POSIX::open( $_[0], $_[1], 0666 );
      croak "$!: open( $_[0], ", sprintf( "0x%03x", $_[1] ), " )" unless defined $r;
      _debug "open( $_[0], ", sprintf( "0x%03x", $_[1] ), " ) = $r"
        if _debugging_data;
      $fds{$r} = {};
      return $r;
  }
  
  sub _pipe {
      ## Normal, blocking write for pipes that we read and the child writes,
      ## since most children expect writes to stdout to block rather than
      ## do a partial write.
      my ( $r, $w ) = POSIX::pipe;
      croak "$!: pipe()" unless defined $r;
      _debug "pipe() = ( $r, $w ) " if _debugging_details;
      @fds{$r, $w} = ( {}, {} );
      return ( $r, $w );
  }
  
  sub _pipe_nb {
      ## For pipes that we write, unblock the write side, so we can fill a buffer
      ## and continue to select().
      ## Contributed by Borislav Deianov <borislav@ensim.com>, with minor
      ## bugfix on fcntl result by me.
      local ( *R, *W );
      my $f = pipe( R, W );
      croak "$!: pipe()" unless defined $f;
      my ( $r, $w ) = ( fileno R, fileno W );
      _debug "pipe_nb pipe() = ( $r, $w )" if _debugging_details;
      unless (Win32_MODE) {
          ## POSIX::fcntl doesn't take fd numbers, so gotta use Perl's and
          ## then _dup the originals (which get closed on leaving this block)
          my $fres = fcntl( W, &F_SETFL, O_WRONLY | O_NONBLOCK );
          croak "$!: fcntl( $w, F_SETFL, O_NONBLOCK )" unless $fres;
          _debug "fcntl( $w, F_SETFL, O_NONBLOCK )" if _debugging_details;
      }
      ( $r, $w ) = ( _dup($r), _dup($w) );
      _debug "pipe_nb() = ( $r, $w )" if _debugging_details;
      return ( $r, $w );
  }
  
  sub _pty {
      require IO::Pty;
      my $pty = IO::Pty->new();
      croak "$!: pty ()" unless $pty;
      $pty->autoflush();
      $pty->blocking(0) or croak "$!: pty->blocking ( 0 )";
      _debug "pty() = ( ", $pty->fileno, ", ", $pty->slave->fileno, " )"
        if _debugging_details;
      @fds{ $pty->fileno, $pty->slave->fileno } = ( {}, {} );
      return $pty;
  }
  
  sub _read {
      confess 'undef' unless defined $_[0];
      my $s = '';
      my $r = POSIX::read( $_[0], $s, 10_000 );
      croak "$!: read( $_[0] )" if not($r) and !$!{EINTR};
      $r ||= 0;
      _debug "read( $_[0] ) = $r chars '$s'" if _debugging_data;
      return $s;
  }
  
  ## A METHOD, not a function.
  sub _spawn {
      my IPC::Run $self = shift;
      my ($kid) = @_;
  
      _debug "opening sync pipe ", $kid->{PID} if _debugging_details;
      my $sync_reader_fd;
      ( $sync_reader_fd, $self->{SYNC_WRITER_FD} ) = _pipe;
      $kid->{PID} = fork();
      croak "$! during fork" unless defined $kid->{PID};
  
      unless ( $kid->{PID} ) {
          ## _do_kid_and_exit closes sync_reader_fd since it closes all unwanted and
          ## unloved fds.
          $self->_do_kid_and_exit($kid);
      }
      _debug "fork() = ", $kid->{PID} if _debugging_details;
  
      ## Wait for kid to get to it's exec() and see if it fails.
      _close $self->{SYNC_WRITER_FD};
      my $sync_pulse = _read $sync_reader_fd;
      _close $sync_reader_fd;
  
      if ( !defined $sync_pulse || length $sync_pulse ) {
          if ( waitpid( $kid->{PID}, 0 ) >= 0 ) {
              $kid->{RESULT} = $?;
          }
          else {
              $kid->{RESULT} = -1;
          }
          $sync_pulse = "error reading synchronization pipe for $kid->{NUM}, pid $kid->{PID}"
            unless length $sync_pulse;
          croak $sync_pulse;
      }
      return $kid->{PID};
  
  ## Wait for pty to get set up.  This is a hack until we get synchronous
  ## selects.
      if ( keys %{ $self->{PTYS} } && $IO::Pty::VERSION < 0.9 ) {
          _debug "sleeping to give pty a chance to init, will fix when newer IO::Pty arrives.";
          sleep 1;
      }
  }
  
  sub _write {
      confess 'undef' unless defined $_[0] && defined $_[1];
      my $r = POSIX::write( $_[0], $_[1], length $_[1] );
      croak "$!: write( $_[0], '$_[1]' )" unless $r;
      _debug "write( $_[0], '$_[1]' ) = $r" if _debugging_data;
      return $r;
  }
  
  =pod
  
  =over
  
  =item run
  
  Run takes a harness or harness specification and runs it, pumping
  all input to the child(ren), closing the input pipes when no more
  input is available, collecting all output that arrives, until the
  pipes delivering output are closed, then waiting for the children to
  exit and reaping their result codes.
  
  You may think of C<run( ... )> as being like 
  
     start( ... )->finish();
  
  , though there is one subtle difference: run() does not
  set \$input_scalars to '' like finish() does.  If an exception is thrown
  from run(), all children will be killed off "gently", and then "annihilated"
  if they do not go gently (in to that dark night. sorry).
  
  If any exceptions are thrown, this does a L</kill_kill> before propagating
  them.
  
  =cut
  
  use vars qw( $in_run );    ## No, not Enron;)
  
  sub run {
      local $in_run = 1;     ## Allow run()-only optimizations.
      my IPC::Run $self = start(@_);
      my $r = eval {
          $self->{clear_ins} = 0;
          $self->finish;
      };
      if ($@) {
          my $x = $@;
          $self->kill_kill;
          die $x;
      }
      return $r;
  }
  
  =pod
  
  =item signal
  
     ## To send it a specific signal by name ("USR1"):
     signal $h, "USR1";
     $h->signal ( "USR1" );
  
  If $signal is provided and defined, sends a signal to all child processes.  Try
  not to send numeric signals, use C<"KILL"> instead of C<9>, for instance.
  Numeric signals aren't portable.
  
  Throws an exception if $signal is undef.
  
  This will I<not> clean up the harness, C<finish> it if you kill it.
  
  Normally TERM kills a process gracefully (this is what the command line utility
  C<kill> does by default), INT is sent by one of the keys C<^C>, C<Backspace> or
  C<E<lt>DelE<gt>>, and C<QUIT> is used to kill a process and make it coredump.
  
  The C<HUP> signal is often used to get a process to "restart", rereading 
  config files, and C<USR1> and C<USR2> for really application-specific things.
  
  Often, running C<kill -l> (that's a lower case "L") on the command line will
  list the signals present on your operating system.
  
  B<WARNING>: The signal subsystem is not at all portable.  We *may* offer
  to simulate C<TERM> and C<KILL> on some operating systems, submit code
  to me if you want this.
  
  B<WARNING 2>: Up to and including perl v5.6.1, doing almost anything in a
  signal handler could be dangerous.  The most safe code avoids all
  mallocs and system calls, usually by preallocating a flag before
  entering the signal handler, altering the flag's value in the
  handler, and responding to the changed value in the main system:
  
     my $got_usr1 = 0;
     sub usr1_handler { ++$got_signal }
  
     $SIG{USR1} = \&usr1_handler;
     while () { sleep 1; print "GOT IT" while $got_usr1--; }
  
  Even this approach is perilous if ++ and -- aren't atomic on your system
  (I've never heard of this on any modern CPU large enough to run perl).
  
  =cut
  
  sub signal {
      my IPC::Run $self = shift;
  
      local $cur_self = $self;
  
      $self->_kill_kill_kill_pussycat_kill unless @_;
  
      Carp::cluck "Ignoring extra parameters passed to kill()" if @_ > 1;
  
      my ($signal) = @_;
      croak "Undefined signal passed to signal" unless defined $signal;
      for ( grep $_->{PID} && !defined $_->{RESULT}, @{ $self->{KIDS} } ) {
          _debug "sending $signal to $_->{PID}"
            if _debugging;
          kill $signal, $_->{PID}
            or _debugging && _debug "$! sending $signal to $_->{PID}";
      }
  
      return;
  }
  
  =pod
  
  =item kill_kill
  
     ## To kill off a process:
     $h->kill_kill;
     kill_kill $h;
  
     ## To specify the grace period other than 30 seconds:
     kill_kill $h, grace => 5;
  
     ## To send QUIT instead of KILL if a process refuses to die:
     kill_kill $h, coup_d_grace => "QUIT";
  
  Sends a C<TERM>, waits for all children to exit for up to 30 seconds, then
  sends a C<KILL> to any that survived the C<TERM>.
  
  Will wait for up to 30 more seconds for the OS to successfully C<KILL> the
  processes.
  
  The 30 seconds may be overridden by setting the C<grace> option, this
  overrides both timers.
  
  The harness is then cleaned up.
  
  The doubled name indicates that this function may kill again and avoids
  colliding with the core Perl C<kill> function.
  
  Returns a 1 if the C<TERM> was sufficient, or a 0 if C<KILL> was 
  required.  Throws an exception if C<KILL> did not permit the children
  to be reaped.
  
  B<NOTE>: The grace period is actually up to 1 second longer than that
  given.  This is because the granularity of C<time> is 1 second.  Let me
  know if you need finer granularity, we can leverage Time::HiRes here.
  
  B<Win32>: Win32 does not know how to send real signals, so C<TERM> is
  a full-force kill on Win32.  Thus all talk of grace periods, etc. do
  not apply to Win32.
  
  =cut
  
  sub kill_kill {
      my IPC::Run $self = shift;
  
      my %options = @_;
      my $grace   = $options{grace};
      $grace = 30 unless defined $grace;
      ++$grace;    ## Make grace time a _minimum_
  
      my $coup_d_grace = $options{coup_d_grace};
      $coup_d_grace = "KILL" unless defined $coup_d_grace;
  
      delete $options{$_} for qw( grace coup_d_grace );
      Carp::cluck "Ignoring unknown options for kill_kill: ",
        join " ", keys %options
        if keys %options;
  
      $self->signal("TERM");
  
      my $quitting_time = time + $grace;
      my $delay         = 0.01;
      my $accum_delay;
  
      my $have_killed_before;
  
      while () {
          ## delay first to yield to other processes
          select undef, undef, undef, $delay;
          $accum_delay += $delay;
  
          $self->reap_nb;
          last unless $self->_running_kids;
  
          if ( $accum_delay >= $grace * 0.8 ) {
              ## No point in checking until delay has grown some.
              if ( time >= $quitting_time ) {
                  if ( !$have_killed_before ) {
                      $self->signal($coup_d_grace);
                      $have_killed_before = 1;
                      $quitting_time += $grace;
                      $delay       = 0.01;
                      $accum_delay = 0;
                      next;
                  }
                  croak "Unable to reap all children, even after KILLing them";
              }
          }
  
          $delay *= 2;
          $delay = 0.5 if $delay >= 0.5;
      }
  
      $self->_cleanup;
      return $have_killed_before;
  }
  
  =pod
  
  =item harness
  
  Takes a harness specification and returns a harness.  This harness is
  blessed in to IPC::Run, allowing you to use method call syntax for
  run(), start(), et al if you like.
  
  harness() is provided so that you can pre-build harnesses if you
  would like to, but it's not required..
  
  You may proceed to run(), start() or pump() after calling harness() (pump()
  calls start() if need be).  Alternatively, you may pass your
  harness specification to run() or start() and let them harness() for
  you.  You can't pass harness specifications to pump(), though.
  
  =cut
  
  ##
  ## Notes: I've avoided handling a scalar that doesn't look like an
  ## opcode as a here document or as a filename, though I could DWIM
  ## those.  I'm not sure that the advantages outweigh the danger when
  ## the DWIMer guesses wrong.
  ##
  ## TODO: allow user to spec default shell. Hmm, globally, in the
  ## lexical scope hash, or per instance?  'Course they can do that
  ## now by using a [...] to hold the command.
  ##
  my $harness_id = 0;
  
  sub harness {
      my $options;
      if ( @_ && ref $_[-1] eq 'HASH' ) {
          $options = pop;
          require Data::Dumper;
          carp "Passing in options as a hash is deprecated:\n", Data::Dumper::Dumper($options);
      }
  
      #   local $IPC::Run::debug = $options->{debug}
      #      if $options && defined $options->{debug};
  
      my @args;
      if ( @_ == 1 && !ref $_[0] ) {
          if (Win32_MODE) {
              my $command = $ENV{ComSpec} || 'cmd';
              @args = ( [ $command, '/c', win32_parse_cmd_line $_[0] ] );
          }
          else {
              @args = ( [ qw( sh -c ), @_ ] );
          }
      }
      elsif ( @_ > 1 && !grep ref $_, @_ ) {
          @args = ( [@_] );
      }
      else {
          @args = map { !defined $_ ? bless(\$_, 'IPC::Run::Undef') : $_ } @_;
      }
  
      my @errs;    # Accum errors, emit them when done.
  
      my $succinct;    # set if no redir ops are required yet.  Cleared
                       # if an op is seen.
  
      my $cur_kid;     # references kid or handle being parsed
      my $next_kid_close_stdin = 0;
  
      my $assumed_fd = 0;    # fd to assume in succinct mode (no redir ops)
      my $handle_num = 0;    # 1... is which handle we're parsing
  
      my IPC::Run $self = bless {}, __PACKAGE__;
  
      local $cur_self = $self;
  
      $self->{ID}    = ++$harness_id;
      $self->{IOS}   = [];
      $self->{KIDS}  = [];
      $self->{PIPES} = [];
      $self->{PTYS}  = {};
      $self->{STATE} = _newed;
  
      if ($options) {
          $self->{$_} = $options->{$_} for keys %$options;
      }
  
      _debug "****** harnessing *****" if _debugging;
  
      my $first_parse;
      local $_;
      my $arg_count = @args;
      while (@args) {
          for ( shift @args ) {
              eval {
                  $first_parse = 1;
                  _debug(
                      "parsing ",
                      defined $_
                      ? ref $_ eq 'ARRAY'
                            ? ( '[ ', join( ', ', map "'$_'", @$_ ), ' ]' )
                            : (
                                ref $_
                                  || (
                                    length $_ < 50
                                    ? "'$_'"
                                    : join( '', "'", substr( $_, 0, 10 ), "...'" )
                                  )
                            )
                      : '<undef>'
                  ) if _debugging;
  
                REPARSE:
                  if ( ref eq 'ARRAY' || ( !$cur_kid && ref eq 'CODE' ) ) {
                      croak "Process control symbol ('|', '&') missing" if $cur_kid;
                      croak "Can't spawn a subroutine on Win32"
                        if Win32_MODE && ref eq "CODE";
                      $cur_kid = {
                          TYPE   => 'cmd',
                          VAL    => $_,
                          NUM    => @{ $self->{KIDS} } + 1,
                          OPS    => [],
                          PID    => '',
                          RESULT => undef,
                      };
  
                      unshift @{ $cur_kid->{OPS} }, {
                          TYPE => 'close',
                          KFD  => 0,
                      } if $next_kid_close_stdin;
                      $next_kid_close_stdin = 0;
  
                      push @{ $self->{KIDS} }, $cur_kid;
                      $succinct = 1;
                  }
  
                  elsif ( UNIVERSAL::isa( $_, 'IPC::Run::IO' ) ) {
                      push @{ $self->{IOS} }, $_;
                      $cur_kid  = undef;
                      $succinct = 1;
                  }
  
                  elsif ( UNIVERSAL::isa( $_, 'IPC::Run::Timer' ) ) {
                      push @{ $self->{TIMERS} }, $_;
                      $cur_kid  = undef;
                      $succinct = 1;
                  }
  
                  elsif (/^(\d*)>&(\d+)$/) {
                      croak "No command before '$_'" unless $cur_kid;
                      push @{ $cur_kid->{OPS} }, {
                          TYPE => 'dup',
                          KFD1 => $2,
                          KFD2 => length $1 ? $1 : 1,
                      };
                      _debug "redirect operators now required" if _debugging_details;
                      $succinct = !$first_parse;
                  }
  
                  elsif (/^(\d*)<&(\d+)$/) {
                      croak "No command before '$_'" unless $cur_kid;
                      push @{ $cur_kid->{OPS} }, {
                          TYPE => 'dup',
                          KFD1 => $2,
                          KFD2 => length $1 ? $1 : 0,
                      };
                      $succinct = !$first_parse;
                  }
  
                  elsif (/^(\d*)<&-$/) {
                      croak "No command before '$_'" unless $cur_kid;
                      push @{ $cur_kid->{OPS} }, {
                          TYPE => 'close',
                          KFD  => length $1 ? $1 : 0,
                      };
                      $succinct = !$first_parse;
                  }
  
                  elsif (/^(\d*) (<pipe)()            ()  ()  $/x
                      || /^(\d*) (<pty) ((?:\s+\S+)?) (<) ()  $/x
                      || /^(\d*) (<)    ()            ()  (.*)$/x ) {
                      croak "No command before '$_'" unless $cur_kid;
  
                      $succinct = !$first_parse;
  
                      my $type = $2 . $4;
  
                      my $kfd = length $1 ? $1 : 0;
  
                      my $pty_id;
                      if ( $type eq '<pty<' ) {
                          $pty_id = length $3 ? $3 : '0';
                          ## do the require here to cause early error reporting
                          require IO::Pty;
                          ## Just flag the pyt's existence for now.  It'll be
                          ## converted to a real IO::Pty by _open_pipes.
                          $self->{PTYS}->{$pty_id} = undef;
                      }
  
                      my $source = $5;
  
                      my @filters;
                      my $binmode;
  
                      unless ( length $source ) {
                          if ( !$succinct ) {
                              while ( @args > 1
                                  && ( ( ref $args[1] && !UNIVERSAL::isa $args[1], "IPC::Run::Timer" ) || UNIVERSAL::isa $args[0], "IPC::Run::binmode_pseudo_filter" ) ) {
                                  if ( UNIVERSAL::isa $args[0], "IPC::Run::binmode_pseudo_filter" ) {
                                      $binmode = shift(@args)->();
                                  }
                                  else {
                                      push @filters, shift @args;
                                  }
                              }
                          }
                          $source = shift @args;
                          croak "'$_' missing a source" if _empty $source;
  
                          _debug(
                              'Kid ',  $cur_kid->{NUM},  "'s input fd ", $kfd,
                              ' has ', scalar(@filters), ' filters.'
                          ) if _debugging_details && @filters;
                      }
  
                      my IPC::Run::IO $pipe = IPC::Run::IO->_new_internal( $type, $kfd, $pty_id, $source, $binmode, @filters );
  
                      if ( ( ref $source eq 'GLOB' || UNIVERSAL::isa $source, 'IO::Handle' )
                          && $type !~ /^<p(ty<|ipe)$/ ) {
                          _debug "setting DONT_CLOSE" if _debugging_details;
                          $pipe->{DONT_CLOSE} = 1;    ## this FD is not closed by us.
                          _dont_inherit($source) if Win32_MODE;
                      }
  
                      push @{ $cur_kid->{OPS} }, $pipe;
                  }
  
                  elsif (
                         /^()   (>>?)  (&)     ()      (.*)$/x
                      || /^()   (&)    (>pipe) ()      ()  $/x
                      || /^()   (>pipe)(&)     ()      ()  $/x
                      || /^(\d*)()     (>pipe) ()      ()  $/x
                      || /^()   (&)    (>pty)  ( \w*)> ()  $/x
  ## TODO:    ||   /^()   (>pty) (\d*)> (&) ()  $/x
                      || /^(\d*)()     (>pty)  ( \w*)> ()  $/x
                      || /^()   (&)    (>>?)   ()      (.*)$/x || /^(\d*)()     (>>?)   ()      (.*)$/x
                    ) {
                      croak "No command before '$_'" unless $cur_kid;
  
                      $succinct = !$first_parse;
  
                      my $type = (
                            $2 eq '>pipe' || $3 eq '>pipe' ? '>pipe'
                          : $2 eq '>pty'  || $3 eq '>pty'  ? '>pty>'
                          :                                  '>'
                      );
                      my $kfd = length $1 ? $1 : 1;
                      my $trunc = !( $2 eq '>>' || $3 eq '>>' );
                      my $pty_id = (
                            $2 eq '>pty' || $3 eq '>pty'
                          ? length $4
                                ? $4
                                : 0
                          : undef
                      );
  
                      my $stderr_too =
                           $2 eq '&'
                        || $3 eq '&'
                        || ( !length $1 && substr( $type, 0, 4 ) eq '>pty' );
  
                      my $dest = $5;
                      my @filters;
                      my $binmode = 0;
                      unless ( length $dest ) {
                          if ( !$succinct ) {
                              ## unshift...shift: '>' filters source...sink left...right
                              while ( @args > 1
                                  && ( ( ref $args[1] && !UNIVERSAL::isa $args[1], "IPC::Run::Timer" ) || UNIVERSAL::isa $args[0], "IPC::Run::binmode_pseudo_filter" ) ) {
                                  if ( UNIVERSAL::isa $args[0], "IPC::Run::binmode_pseudo_filter" ) {
                                      $binmode = shift(@args)->();
                                  }
                                  else {
                                      unshift @filters, shift @args;
                                  }
                              }
                          }
  
  			if ( @args && ref $args[0] eq 'IPC::Run::Undef' ) {
  			    require Symbol;
  			    ${ $args[0] } = $dest = Symbol::gensym();
  			    shift @args;
  			}
  			else {
  			    $dest = shift @args;
  			}
  
                          _debug(
                              'Kid ',  $cur_kid->{NUM},  "'s output fd ", $kfd,
                              ' has ', scalar(@filters), ' filters.'
                          ) if _debugging_details && @filters;
  
                          if ( $type eq '>pty>' ) {
                              ## do the require here to cause early error reporting
                              require IO::Pty;
                              ## Just flag the pyt's existence for now.  _open_pipes()
                              ## will new an IO::Pty for each key.
                              $self->{PTYS}->{$pty_id} = undef;
                          }
                      }
  
                      croak "'$_' missing a destination" if _empty $dest;
                      my $pipe = IPC::Run::IO->_new_internal( $type, $kfd, $pty_id, $dest, $binmode, @filters );
                      $pipe->{TRUNC} = $trunc;
  
                      if ( ( UNIVERSAL::isa( $dest, 'GLOB' ) || UNIVERSAL::isa( $dest, 'IO::Handle' ) )
                          && $type !~ /^>(pty>|pipe)$/ ) {
                          _debug "setting DONT_CLOSE" if _debugging_details;
                          $pipe->{DONT_CLOSE} = 1;    ## this FD is not closed by us.
                      }
                      push @{ $cur_kid->{OPS} }, $pipe;
                      push @{ $cur_kid->{OPS} }, {
                          TYPE => 'dup',
                          KFD1 => 1,
                          KFD2 => 2,
                      } if $stderr_too;
                  }
  
                  elsif ( $_ eq "|" ) {
                      croak "No command before '$_'" unless $cur_kid;
                      unshift @{ $cur_kid->{OPS} }, {
                          TYPE => '|',
                          KFD  => 1,
                      };
                      $succinct   = 1;
                      $assumed_fd = 1;
                      $cur_kid    = undef;
                  }
  
                  elsif ( $_ eq "&" ) {
                      croak "No command before '$_'" unless $cur_kid;
                      $next_kid_close_stdin = 1;
                      $succinct             = 1;
                      $assumed_fd           = 0;
                      $cur_kid              = undef;
                  }
  
                  elsif ( $_ eq 'init' ) {
                      croak "No command before '$_'" unless $cur_kid;
                      push @{ $cur_kid->{OPS} }, {
                          TYPE => 'init',
                          SUB  => shift @args,
                      };
                  }
  
                  elsif ( !ref $_ ) {
                      $self->{$_} = shift @args;
                  }
  
                  elsif ( $_ eq 'init' ) {
                      croak "No command before '$_'" unless $cur_kid;
                      push @{ $cur_kid->{OPS} }, {
                          TYPE => 'init',
                          SUB  => shift @args,
                      };
                  }
  
                  elsif ( $succinct && $first_parse ) {
                      ## It's not an opcode, and no explicit opcodes have been
                      ## seen yet, so assume it's a file name.
                      unshift @args, $_;
                      if ( !$assumed_fd ) {
                          $_ = "$assumed_fd<",
                      }
                      else {
                          $_ = "$assumed_fd>",
                      }
                      _debug "assuming '", $_, "'" if _debugging_details;
                      ++$assumed_fd;
                      $first_parse = 0;
                      goto REPARSE;
                  }
  
                  else {
                      croak join(
                          '',
                          'Unexpected ',
                          ( ref() ? $_ : 'scalar' ),
                          ' in harness() parameter ',
                          $arg_count - @args
                      );
                  }
              };
              if ($@) {
                  push @errs, $@;
                  _debug 'caught ', $@ if _debugging;
              }
          }
      }
  
      die join( '', @errs ) if @errs;
  
      $self->{STATE} = _harnessed;
  
      #   $self->timeout( $options->{timeout} ) if exists $options->{timeout};
      return $self;
  }
  
  sub _open_pipes {
      my IPC::Run $self = shift;
  
      my @errs;
  
      my @close_on_fail;
  
      ## When a pipe character is seen, a pipe is created.  $pipe_read_fd holds
      ## the dangling read end of the pipe until we get to the next process.
      my $pipe_read_fd;
  
      ## Output descriptors for the last command are shared by all children.
      ## @output_fds_accum accumulates the current set of output fds.
      my @output_fds_accum;
  
      for ( sort keys %{ $self->{PTYS} } ) {
          _debug "opening pty '", $_, "'" if _debugging_details;
          my $pty = _pty;
          $self->{PTYS}->{$_} = $pty;
      }
  
      for ( @{ $self->{IOS} } ) {
          eval { $_->init; };
          if ($@) {
              push @errs, $@;
              _debug 'caught ', $@ if _debugging;
          }
          else {
              push @close_on_fail, $_;
          }
      }
  
      ## Loop through the kids and their OPS, interpreting any that require
      ## parent-side actions.
      for my $kid ( @{ $self->{KIDS} } ) {
          unless ( ref $kid->{VAL} eq 'CODE' ) {
              $kid->{PATH} = _search_path $kid->{VAL}->[0];
          }
          if ( defined $pipe_read_fd ) {
              _debug "placing write end of pipe on kid $kid->{NUM}'s stdin"
                if _debugging_details;
              unshift @{ $kid->{OPS} }, {
                  TYPE => 'PIPE',          ## Prevent next loop from triggering on this
                  KFD  => 0,
                  TFD  => $pipe_read_fd,
              };
              $pipe_read_fd = undef;
          }
          @output_fds_accum = ();
          for my $op ( @{ $kid->{OPS} } ) {
  
              #         next if $op->{IS_DEBUG};
              my $ok = eval {
                  if ( $op->{TYPE} eq '<' ) {
                      my $source = $op->{SOURCE};
                      if ( !ref $source ) {
                          _debug(
                              "kid ",              $kid->{NUM}, " to read ", $op->{KFD},
                              " from '" . $source, "' (read only)"
                          ) if _debugging_details;
                          croak "simulated open failure"
                            if $self->{_simulate_open_failure};
                          $op->{TFD} = _sysopen( $source, O_RDONLY );
                          push @close_on_fail, $op->{TFD};
                      }
                      elsif (UNIVERSAL::isa( $source, 'GLOB' )
                          || UNIVERSAL::isa( $source, 'IO::Handle' ) ) {
                          croak "Unopened filehandle in input redirect for $op->{KFD}"
                            unless defined fileno $source;
                          $op->{TFD} = fileno $source;
                          _debug(
                              "kid ",      $kid->{NUM}, " to read ", $op->{KFD},
                              " from fd ", $op->{TFD}
                          ) if _debugging_details;
                      }
                      elsif ( UNIVERSAL::isa( $source, 'SCALAR' ) ) {
                          _debug(
                              "kid ", $kid->{NUM}, " to read ", $op->{KFD},
                              " from SCALAR"
                          ) if _debugging_details;
  
                          $op->open_pipe( $self->_debug_fd );
                          push @close_on_fail, $op->{KFD}, $op->{FD};
  
                          my $s = '';
                          $op->{KIN_REF} = \$s;
                      }
                      elsif ( UNIVERSAL::isa( $source, 'CODE' ) ) {
                          _debug( 'kid ', $kid->{NUM}, ' to read ', $op->{KFD}, ' from CODE' ) if _debugging_details;
  
                          $op->open_pipe( $self->_debug_fd );
                          push @close_on_fail, $op->{KFD}, $op->{FD};
  
                          my $s = '';
                          $op->{KIN_REF} = \$s;
                      }
                      else {
                          croak( "'" . ref($source) . "' not allowed as a source for input redirection" );
                      }
                      $op->_init_filters;
                  }
                  elsif ( $op->{TYPE} eq '<pipe' ) {
                      _debug(
                          'kid to read ', $op->{KFD},
                          ' from a pipe IPC::Run opens and returns',
                      ) if _debugging_details;
  
                      my ( $r, $w ) = $op->open_pipe( $self->_debug_fd, $op->{SOURCE} );
                      _debug "caller will write to ", fileno $op->{SOURCE}
                        if _debugging_details;
  
                      $op->{TFD} = $r;
                      $op->{FD}  = undef;    # we don't manage this fd
                      $op->_init_filters;
                  }
                  elsif ( $op->{TYPE} eq '<pty<' ) {
                      _debug(
                          'kid to read ', $op->{KFD}, " from pty '", $op->{PTY_ID}, "'",
                      ) if _debugging_details;
  
                      for my $source ( $op->{SOURCE} ) {
                          if ( UNIVERSAL::isa( $source, 'SCALAR' ) ) {
                              _debug(
                                  "kid ",                   $kid->{NUM},   " to read ", $op->{KFD},
                                  " from SCALAR via pty '", $op->{PTY_ID}, "'"
                              ) if _debugging_details;
  
                              my $s = '';
                              $op->{KIN_REF} = \$s;
                          }
                          elsif ( UNIVERSAL::isa( $source, 'CODE' ) ) {
                              _debug(
                                  "kid ",                 $kid->{NUM},   " to read ", $op->{KFD},
                                  " from CODE via pty '", $op->{PTY_ID}, "'"
                              ) if _debugging_details;
                              my $s = '';
                              $op->{KIN_REF} = \$s;
                          }
                          else {
                              croak( "'" . ref($source) . "' not allowed as a source for '<pty<' redirection" );
                          }
                      }
                      $op->{FD}  = $self->{PTYS}->{ $op->{PTY_ID} }->fileno;
                      $op->{TFD} = undef;                                      # The fd isn't known until after fork().
                      $op->_init_filters;
                  }
                  elsif ( $op->{TYPE} eq '>' ) {
                      ## N> output redirection.
                      my $dest = $op->{DEST};
                      if ( !ref $dest ) {
                          _debug(
                              "kid ",  $kid->{NUM}, " to write ", $op->{KFD},
                              " to '", $dest,       "' (write only, create, ",
                              ( $op->{TRUNC} ? 'truncate' : 'append' ),
                              ")"
                          ) if _debugging_details;
                          croak "simulated open failure"
                            if $self->{_simulate_open_failure};
                          $op->{TFD} = _sysopen(
                              $dest,
                              ( O_WRONLY | O_CREAT | ( $op->{TRUNC} ? O_TRUNC : O_APPEND ) )
                          );
                          if (Win32_MODE) {
                              ## I have no idea why this is needed to make the current
                              ## file position survive the gyrations TFD must go
                              ## through...
                              POSIX::lseek( $op->{TFD}, 0, POSIX::SEEK_END() );
                          }
                          push @close_on_fail, $op->{TFD};
                      }
                      elsif ( UNIVERSAL::isa( $dest, 'GLOB' ) ) {
                          croak("Unopened filehandle in output redirect, command $kid->{NUM}") unless defined fileno $dest;
                          ## Turn on autoflush, mostly just to flush out
                          ## existing output.
                          my $old_fh = select($dest);
                          $| = 1;
                          select($old_fh);
                          $op->{TFD} = fileno $dest;
                          _debug( 'kid to write ', $op->{KFD}, ' to handle ', $op->{TFD} ) if _debugging_details;
                      }
                      elsif ( UNIVERSAL::isa( $dest, 'SCALAR' ) ) {
                          _debug( "kid ", $kid->{NUM}, " to write $op->{KFD} to SCALAR" ) if _debugging_details;
  
                          $op->open_pipe( $self->_debug_fd );
                          push @close_on_fail, $op->{FD}, $op->{TFD};
                          $$dest = '' if $op->{TRUNC};
                      }
                      elsif ( UNIVERSAL::isa( $dest, 'CODE' ) ) {
                          _debug("kid $kid->{NUM} to write $op->{KFD} to CODE") if _debugging_details;
  
                          $op->open_pipe( $self->_debug_fd );
                          push @close_on_fail, $op->{FD}, $op->{TFD};
                      }
                      else {
                          croak( "'" . ref($dest) . "' not allowed as a sink for output redirection" );
                      }
                      $output_fds_accum[ $op->{KFD} ] = $op;
                      $op->_init_filters;
                  }
  
                  elsif ( $op->{TYPE} eq '>pipe' ) {
                      ## N> output redirection to a pipe we open, but don't select()
                      ## on.
                      _debug(
                          "kid ", $kid->{NUM}, " to write ", $op->{KFD},
                          ' to a pipe IPC::Run opens and returns'
                      ) if _debugging_details;
  
                      my ( $r, $w ) = $op->open_pipe( $self->_debug_fd, $op->{DEST} );
                      _debug "caller will read from ", fileno $op->{DEST}
                        if _debugging_details;
  
                      $op->{TFD} = $w;
                      $op->{FD}  = undef;    # we don't manage this fd
                      $op->_init_filters;
  
                      $output_fds_accum[ $op->{KFD} ] = $op;
                  }
                  elsif ( $op->{TYPE} eq '>pty>' ) {
                      my $dest = $op->{DEST};
                      if ( UNIVERSAL::isa( $dest, 'SCALAR' ) ) {
                          _debug(
                              "kid ",                 $kid->{NUM},   " to write ", $op->{KFD},
                              " to SCALAR via pty '", $op->{PTY_ID}, "'"
                          ) if _debugging_details;
  
                          $$dest = '' if $op->{TRUNC};
                      }
                      elsif ( UNIVERSAL::isa( $dest, 'CODE' ) ) {
                          _debug(
                              "kid ",               $kid->{NUM},   " to write ", $op->{KFD},
                              " to CODE via pty '", $op->{PTY_ID}, "'"
                          ) if _debugging_details;
                      }
                      else {
                          croak( "'" . ref($dest) . "' not allowed as a sink for output redirection" );
                      }
  
                      $op->{FD}                       = $self->{PTYS}->{ $op->{PTY_ID} }->fileno;
                      $op->{TFD}                      = undef;                                      # The fd isn't known until after fork().
                      $output_fds_accum[ $op->{KFD} ] = $op;
                      $op->_init_filters;
                  }
                  elsif ( $op->{TYPE} eq '|' ) {
                      _debug( "pipelining $kid->{NUM} and " . ( $kid->{NUM} + 1 ) ) if _debugging_details;
                      ( $pipe_read_fd, $op->{TFD} ) = _pipe;
                      if (Win32_MODE) {
                          _dont_inherit($pipe_read_fd);
                          _dont_inherit( $op->{TFD} );
                      }
                      @output_fds_accum = ();
                  }
                  elsif ( $op->{TYPE} eq '&' ) {
                      @output_fds_accum = ();
                  }    # end if $op->{TYPE} tree
                  1;
              };    # end eval
              unless ($ok) {
                  push @errs, $@;
                  _debug 'caught ', $@ if _debugging;
              }
          }    # end for ( OPS }
      }
  
      if (@errs) {
          for (@close_on_fail) {
              _close($_);
              $_ = undef;
          }
          for ( keys %{ $self->{PTYS} } ) {
              next unless $self->{PTYS}->{$_};
              close $self->{PTYS}->{$_};
              $self->{PTYS}->{$_} = undef;
          }
          die join( '', @errs );
      }
  
      ## give all but the last child all of the output file descriptors
      ## These will be reopened (and thus rendered useless) if the child
      ## dup2s on to these descriptors, since we unshift these.  This way
      ## each process emits output to the same file descriptors that the
      ## last child will write to.  This is probably not quite correct,
      ## since each child should write to the file descriptors inherited
      ## from the parent.
      ## TODO: fix the inheritance of output file descriptors.
      ## NOTE: This sharing of OPS among kids means that we can't easily put
      ## a kid number in each OPS structure to ping the kid when all ops
      ## have closed (when $self->{PIPES} has emptied).  This means that we
      ## need to scan the KIDS whenever @{$self->{PIPES}} is empty to see
      ## if there any of them are still alive.
      for ( my $num = 0; $num < $#{ $self->{KIDS} }; ++$num ) {
          for ( reverse @output_fds_accum ) {
              next unless defined $_;
              _debug(
                  'kid ', $self->{KIDS}->[$num]->{NUM}, ' also to write ', $_->{KFD},
                  ' to ', ref $_->{DEST}
              ) if _debugging_details;
              unshift @{ $self->{KIDS}->[$num]->{OPS} }, $_;
          }
      }
  
      ## Open the debug pipe if we need it
      ## Create the list of PIPES we need to scan and the bit vectors needed by
      ## select().  Do this first so that _cleanup can _clobber() them if an
      ## exception occurs.
      @{ $self->{PIPES} } = ();
      $self->{RIN} = '';
      $self->{WIN} = '';
      $self->{EIN} = '';
      ## PIN is a vec()tor that indicates who's paused.
      $self->{PIN} = '';
      for my $kid ( @{ $self->{KIDS} } ) {
          for ( @{ $kid->{OPS} } ) {
              if ( defined $_->{FD} ) {
                  _debug(
                      'kid ',    $kid->{NUM}, '[', $kid->{PID}, "]'s ", $_->{KFD},
                      ' is my ', $_->{FD}
                  ) if _debugging_details;
                  vec( $self->{ $_->{TYPE} =~ /^</ ? 'WIN' : 'RIN' }, $_->{FD}, 1 ) = 1;
  
                  #	    vec( $self->{EIN}, $_->{FD}, 1 ) = 1;
                  push @{ $self->{PIPES} }, $_;
              }
          }
      }
  
      for my $io ( @{ $self->{IOS} } ) {
          my $fd = $io->fileno;
          vec( $self->{RIN}, $fd, 1 ) = 1 if $io->mode =~ /r/;
          vec( $self->{WIN}, $fd, 1 ) = 1 if $io->mode =~ /w/;
  
          #      vec( $self->{EIN}, $fd, 1 ) = 1;
          push @{ $self->{PIPES} }, $io;
      }
  
      ## Put filters on the end of the filter chains to read & write the pipes.
      ## Clear pipe states
      for my $pipe ( @{ $self->{PIPES} } ) {
          $pipe->{SOURCE_EMPTY} = 0;
          $pipe->{PAUSED}       = 0;
          if ( $pipe->{TYPE} =~ /^>/ ) {
              my $pipe_reader = sub {
                  my ( undef, $out_ref ) = @_;
  
                  return undef unless defined $pipe->{FD};
                  return 0 unless vec( $self->{ROUT}, $pipe->{FD}, 1 );
  
                  vec( $self->{ROUT}, $pipe->{FD}, 1 ) = 0;
  
                  _debug_desc_fd( 'reading from', $pipe ) if _debugging_details;
                  my $in = eval { _read( $pipe->{FD} ) };
                  if ($@) {
                      $in = '';
                      ## IO::Pty throws the Input/output error if the kid dies.
                      ## read() throws the bad file descriptor message if the
                      ## kid dies on Win32.
                      die $@
                        unless $@ =~ $_EIO
                        || ( $@ =~ /input or output/ && $^O =~ /aix/ )
                        || ( Win32_MODE && $@ =~ /Bad file descriptor/ );
                  }
  
                  unless ( length $in ) {
                      $self->_clobber($pipe);
                      return undef;
                  }
  
                  ## Protect the position so /.../g matches may be used.
                  my $pos = pos $$out_ref;
                  $$out_ref .= $in;
                  pos($$out_ref) = $pos;
                  return 1;
              };
              ## Input filters are the last filters
              push @{ $pipe->{FILTERS} },      $pipe_reader;
              push @{ $self->{TEMP_FILTERS} }, $pipe_reader;
          }
          else {
              my $pipe_writer = sub {
                  my ( $in_ref, $out_ref ) = @_;
                  return undef unless defined $pipe->{FD};
                  return 0
                    unless vec( $self->{WOUT}, $pipe->{FD}, 1 )
                    || $pipe->{PAUSED};
  
                  vec( $self->{WOUT}, $pipe->{FD}, 1 ) = 0;
  
                  if ( !length $$in_ref ) {
                      if ( !defined get_more_input ) {
                          $self->_clobber($pipe);
                          return undef;
                      }
                  }
  
                  unless ( length $$in_ref ) {
                      unless ( $pipe->{PAUSED} ) {
                          _debug_desc_fd( 'pausing', $pipe ) if _debugging_details;
                          vec( $self->{WIN}, $pipe->{FD}, 1 ) = 0;
  
                          #		  vec( $self->{EIN}, $pipe->{FD}, 1 ) = 0;
                          vec( $self->{PIN}, $pipe->{FD}, 1 ) = 1;
                          $pipe->{PAUSED} = 1;
                      }
                      return 0;
                  }
                  _debug_desc_fd( 'writing to', $pipe ) if _debugging_details;
  
                  if ( length $$in_ref && $$in_ref ) {
                      my $c = _write( $pipe->{FD}, $$in_ref );
                      substr( $$in_ref, 0, $c, '' );
                  }
                  else {
                      $self->_clobber($pipe);
                      return undef;
                  }
  
                  return 1;
              };
              ## Output filters are the first filters
              unshift @{ $pipe->{FILTERS} }, $pipe_writer;
              push @{ $self->{TEMP_FILTERS} }, $pipe_writer;
          }
      }
  }
  
  sub _dup2_gently {
      ## A METHOD, NOT A FUNCTION, NEEDS $self!
      my IPC::Run $self = shift;
      my ( $files, $fd1, $fd2 ) = @_;
      ## Moves TFDs that are using the destination fd out of the
      ## way before calling _dup2
      for (@$files) {
          next unless defined $_->{TFD};
          $_->{TFD} = _dup( $_->{TFD} ) if $_->{TFD} == $fd2;
      }
      if ( defined $self->{DEBUG_FD} && $self->{DEBUG_FD} == $fd2 ) {
          $self->{DEBUG_FD} = _dup $self->{DEBUG_FD};
          $fds{$self->{DEBUG_FD}}{needed} = 1;
      }
      _dup2_rudely( $fd1, $fd2 );
  }
  
  =pod
  
  =item close_terminal
  
  This is used as (or in) an init sub to cast off the bonds of a controlling
  terminal.  It must precede all other redirection ops that affect
  STDIN, STDOUT, or STDERR to be guaranteed effective.
  
  =cut
  
  sub close_terminal {
      ## Cast of the bonds of a controlling terminal
  
      # Just in case the parent (I'm talking to you FCGI) had these tied.
      untie *STDIN;
      untie *STDOUT;
      untie *STDERR;
  
      POSIX::setsid() || croak "POSIX::setsid() failed";
      _debug "closing stdin, out, err"
        if _debugging_details;
      close STDIN;
      close STDERR;
      close STDOUT;
  }
  
  sub _do_kid_and_exit {
      my IPC::Run $self = shift;
      my ($kid) = @_;
  
      my ( $s1, $s2 );
      if ( $] < 5.008 ) {
          ## For unknown reasons, placing these two statements in the eval{}
          ## causes the eval {} to not catch errors after they are executed in
          ## perl 5.6.0, godforsaken version that it is...not sure about 5.6.1.
          ## Part of this could be that these symbols get destructed when
          ## exiting the eval, and that destruction might be what's (wrongly)
          ## confusing the eval{}, allowing the exception to propagate.
          $s1 = Symbol::gensym();
          $s2 = Symbol::gensym();
      }
  
      eval {
          local $cur_self = $self;
  
          if (_debugging) {
              _set_child_debug_name(
                  ref $kid->{VAL} eq "CODE"
                  ? "CODE"
                  : basename( $kid->{VAL}->[0] )
              );
          }
  
          ## close parent FD's first so they're out of the way.
          ## Don't close STDIN, STDOUT, STDERR: they should be inherited or
          ## overwritten below.
          do { $_->{needed} = 1 for @fds{0..2} }
             unless $self->{noinherit};
  
          $fds{$self->{SYNC_WRITER_FD}}{needed} = 1;
          $fds{$self->{DEBUG_FD}}{needed} = 1 if defined $self->{DEBUG_FD};
  
          $fds{$_->{TFD}}{needed} = 1
             foreach grep { defined $_->{TFD} } @{$kid->{OPS} };
  
  
          ## TODO: use the forthcoming IO::Pty to close the terminal and
          ## make the first pty for this child the controlling terminal.
          ## This will also make it so that pty-laden kids don't cause
          ## other kids to lose stdin/stdout/stderr.
  
          if ( %{ $self->{PTYS} } ) {
              ## Clean up the parent's fds.
              for ( keys %{ $self->{PTYS} } ) {
                  _debug "Cleaning up parent's ptty '$_'" if _debugging_details;
                  $self->{PTYS}->{$_}->make_slave_controlling_terminal;
                  my $slave = $self->{PTYS}->{$_}->slave;
   	        delete $fds{$self->{PTYS}->{$_}->fileno};
                  close $self->{PTYS}->{$_};
                  $self->{PTYS}->{$_} = $slave;
              }
  
              close_terminal;
              delete @fds{0..2};
          }
  
          for my $sibling ( @{ $self->{KIDS} } ) {
              for ( @{ $sibling->{OPS} } ) {
                  if ( $_->{TYPE} =~ /^.pty.$/ ) {
                      $_->{TFD} = $self->{PTYS}->{ $_->{PTY_ID} }->fileno;
                      $fds{$_->{TFD}}{needed} = 1;
                  }
  
                  #	    for ( $_->{FD}, ( $sibling != $kid ? $_->{TFD} : () ) ) {
                  #	       if ( defined $_ && ! $closed[$_] && ! $needed[$_] ) {
                  #		  _close( $_ );
                  #		  $closed[$_] = 1;
                  #		  $_ = undef;
                  #	       }
                  #	    }
              }
          }
  
          ## This is crude: we have no way of keeping track of browsing all open
          ## fds, so we scan to a fairly high fd.
          _debug "open fds: ", join " ", keys %fds if _debugging_details;
  
          _close( $_ ) foreach grep { ! $fds{$_}{needed} } keys %fds;
  
          for ( @{ $kid->{OPS} } ) {
              if ( defined $_->{TFD} ) {
  
                  # we're always creating KFD
                  $fds{$_->{KFD}}{needed} = 1;
  
                  unless ( $_->{TFD} == $_->{KFD} ) {
                      $self->_dup2_gently( $kid->{OPS}, $_->{TFD}, $_->{KFD} );
                      $fds{$_->{TFD}}{lazy_close} = 1;
                  } else {
                      my $fd = _dup($_->{TFD});
                      $self->_dup2_gently( $kid->{OPS}, $fd, $_->{KFD} );
                      _close($fd);
                  }
              }
              elsif ( $_->{TYPE} eq 'dup' ) {
                  $self->_dup2_gently( $kid->{OPS}, $_->{KFD1}, $_->{KFD2} )
                    unless $_->{KFD1} == $_->{KFD2};
                  $fds{$_->{KFD2}}{needed} = 1;
              }
              elsif ( $_->{TYPE} eq 'close' ) {
                  for ( $_->{KFD} ) {
                      if ( $fds{$_} ) {
                          _close($_);
                          $_ = undef;
                      }
                  }
              }
              elsif ( $_->{TYPE} eq 'init' ) {
                  $_->{SUB}->();
              }
          }
  
          _close( $_ ) foreach grep { $fds{$_}{lazy_close} } keys %fds;
  
          if ( ref $kid->{VAL} ne 'CODE' ) {
              open $s1, ">&=$self->{SYNC_WRITER_FD}"
                or croak "$! setting filehandle to fd SYNC_WRITER_FD";
              fcntl $s1, F_SETFD, 1;
  
              if ( defined $self->{DEBUG_FD} ) {
                  open $s2, ">&=$self->{DEBUG_FD}"
                    or croak "$! setting filehandle to fd DEBUG_FD";
                  fcntl $s2, F_SETFD, 1;
              }
  
              if (_debugging) {
                  my @cmd = ( $kid->{PATH}, @{ $kid->{VAL} }[ 1 .. $#{ $kid->{VAL} } ] );
                  _debug 'execing ', join " ", map { /[\s\"]/ ? "'$_'" : $_ } @cmd;
              }
  
              die "exec failed: simulating exec() failure"
                if $self->{_simulate_exec_failure};
  
              _exec $kid->{PATH}, @{ $kid->{VAL} }[ 1 .. $#{ $kid->{VAL} } ];
  
              croak "exec failed: $!";
          }
      };
      if ($@) {
          _write $self->{SYNC_WRITER_FD}, $@;
          ## Avoid DESTROY.
          POSIX::_exit(1);
      }
  
      ## We must be executing code in the child, otherwise exec() would have
      ## prevented us from being here.
      _close $self->{SYNC_WRITER_FD};
      _debug 'calling fork()ed CODE ref' if _debugging;
      POSIX::close $self->{DEBUG_FD} if defined $self->{DEBUG_FD};
      ## TODO: Overload CORE::GLOBAL::exit...
      $kid->{VAL}->();
  
      ## There are bugs in perl closures up to and including 5.6.1
      ## that may keep this next line from having any effect, and it
      ## won't have any effect if our caller has kept a copy of it, but
      ## this may cause the closure to be cleaned up.  Maybe.
      $kid->{VAL} = undef;
  
      ## Use POSIX::_exit to avoid global destruction, since this might
      ## cause DESTROY() to be called on objects created in the parent
      ## and thus cause double cleanup.  For instance, if DESTROY() unlinks
      ## a file in the child, we don't want the parent to suddenly miss
      ## it.
      POSIX::_exit(0);
  }
  
  =pod
  
  =item start
  
     $h = start(
        \@cmd, \$in, \$out, ...,
        timeout( 30, name => "process timeout" ),
        $stall_timeout = timeout( 10, name => "stall timeout"   ),
     );
  
     $h = start \@cmd, '<', \$in, '|', \@cmd2, ...;
  
  start() accepts a harness or harness specification and returns a harness
  after building all of the pipes and launching (via fork()/exec(), or, maybe
  someday, spawn()) all the child processes.  It does not send or receive any
  data on the pipes, see pump() and finish() for that.
  
  You may call harness() and then pass it's result to start() if you like,
  but you only need to if it helps you structure or tune your application.
  If you do call harness(), you may skip start() and proceed directly to
  pump.
  
  start() also starts all timers in the harness.  See L<IPC::Run::Timer>
  for more information.
  
  start() flushes STDOUT and STDERR to help you avoid duplicate output.
  It has no way of asking Perl to flush all your open filehandles, so
  you are going to need to flush any others you have open.  Sorry.
  
  Here's how if you don't want to alter the state of $| for your
  filehandle:
  
     $ofh = select HANDLE; $of = $|; $| = 1; $| = $of; select $ofh;
  
  If you don't mind leaving output unbuffered on HANDLE, you can do
  the slightly shorter
  
     $ofh = select HANDLE; $| = 1; select $ofh;
  
  Or, you can use IO::Handle's flush() method:
  
     use IO::Handle;
     flush HANDLE;
  
  Perl needs the equivalent of C's fflush( (FILE *)NULL ).
  
  =cut
  
  sub start {
  
      # $SIG{__DIE__} = sub { my $s = shift; Carp::cluck $s; die $s };
      my $options;
      if ( @_ && ref $_[-1] eq 'HASH' ) {
          $options = pop;
          require Data::Dumper;
          carp "Passing in options as a hash is deprecated:\n", Data::Dumper::Dumper($options);
      }
  
      my IPC::Run $self;
      if ( @_ == 1 && UNIVERSAL::isa( $_[0], __PACKAGE__ ) ) {
          $self = shift;
          $self->{$_} = $options->{$_} for keys %$options;
      }
      else {
          $self = harness( @_, $options ? $options : () );
      }
  
      local $cur_self = $self;
  
      $self->kill_kill if $self->{STATE} == _started;
  
      _debug "** starting" if _debugging;
  
      $_->{RESULT} = undef for @{ $self->{KIDS} };
  
      ## Assume we're not being called from &run.  It will correct our
      ## assumption if need be.  This affects whether &_select_loop clears
      ## input queues to '' when they're empty.
      $self->{clear_ins} = 1;
  
      IPC::Run::Win32Helper::optimize $self
        if Win32_MODE && $in_run;
  
      my @errs;
  
      for ( @{ $self->{TIMERS} } ) {
          eval { $_->start };
          if ($@) {
              push @errs, $@;
              _debug 'caught ', $@ if _debugging;
          }
      }
  
      eval { $self->_open_pipes };
      if ($@) {
          push @errs, $@;
          _debug 'caught ', $@ if _debugging;
      }
  
      if ( !@errs ) {
          ## This is a bit of a hack, we should do it for all open filehandles.
          ## Since there's no way I know of to enumerate open filehandles, we
          ## autoflush STDOUT and STDERR.  This is done so that the children don't
          ## inherit output buffers chock full o' redundant data.  It's really
          ## confusing to track that down.
          { my $ofh = select STDOUT; my $of = $|; $| = 1; $| = $of; select $ofh; }
          { my $ofh = select STDERR; my $of = $|; $| = 1; $| = $of; select $ofh; }
          for my $kid ( @{ $self->{KIDS} } ) {
              $kid->{RESULT} = undef;
              _debug "child: ",
                ref( $kid->{VAL} ) eq "CODE"
                ? "CODE ref"
                : (
                  "`",
                  join( " ", map /[^\w.-]/ ? "'$_'" : $_, @{ $kid->{VAL} } ),
                  "`"
                ) if _debugging_details;
              eval {
                  croak "simulated failure of fork"
                    if $self->{_simulate_fork_failure};
                  unless (Win32_MODE) {
                      $self->_spawn($kid);
                  }
                  else {
  ## TODO: Test and debug spawning code.  Someday.
                      _debug(
                          'spawning ',
                          join(
                              ' ',
                              map( "'$_'",
                                  ( $kid->{PATH}, @{ $kid->{VAL} }[ 1 .. $#{ $kid->{VAL} } ] ) )
                          )
                      ) if _debugging;
                      ## The external kid wouldn't know what to do with it anyway.
                      ## This is only used by the "helper" pump processes on Win32.
                      _dont_inherit( $self->{DEBUG_FD} );
                      ( $kid->{PID}, $kid->{PROCESS} ) = IPC::Run::Win32Helper::win32_spawn(
                          [ $kid->{PATH}, @{ $kid->{VAL} }[ 1 .. $#{ $kid->{VAL} } ] ],
                          $kid->{OPS},
                      );
                      _debug "spawn() = ", $kid->{PID} if _debugging;
                  }
              };
              if ($@) {
                  push @errs, $@;
                  _debug 'caught ', $@ if _debugging;
              }
          }
      }
  
      ## Close all those temporary filehandles that the kids needed.
      for my $pty ( values %{ $self->{PTYS} } ) {
          close $pty->slave;
      }
  
      my @closed;
      for my $kid ( @{ $self->{KIDS} } ) {
          for ( @{ $kid->{OPS} } ) {
              my $close_it = eval {
                       defined $_->{TFD}
                    && !$_->{DONT_CLOSE}
                    && !$closed[ $_->{TFD} ]
                    && ( !Win32_MODE || !$_->{RECV_THROUGH_TEMP_FILE} )    ## Win32 hack
              };
              if ($@) {
                  push @errs, $@;
                  _debug 'caught ', $@ if _debugging;
              }
              if ( $close_it || $@ ) {
                  eval {
                      _close( $_->{TFD} );
                      $closed[ $_->{TFD} ] = 1;
                      $_->{TFD} = undef;
                  };
                  if ($@) {
                      push @errs, $@;
                      _debug 'caught ', $@ if _debugging;
                  }
              }
          }
      }
      confess "gak!" unless defined $self->{PIPES};
  
      if (@errs) {
          eval { $self->_cleanup };
          warn $@ if $@;
          die join( '', @errs );
      }
  
      $self->{STATE} = _started;
      return $self;
  }
  
  =item adopt
  
  Experimental feature. NOT FUNCTIONAL YET, NEED TO CLOSE FDS BETTER IN CHILDREN.  SEE t/adopt.t for a test suite.
  
  =cut
  
  sub adopt {
      my IPC::Run $self = shift;
  
      for my $adoptee (@_) {
          push @{ $self->{IOS} }, @{ $adoptee->{IOS} };
          ## NEED TO RENUMBER THE KIDS!!
          push @{ $self->{KIDS} },  @{ $adoptee->{KIDS} };
          push @{ $self->{PIPES} }, @{ $adoptee->{PIPES} };
          $self->{PTYS}->{$_} = $adoptee->{PTYS}->{$_} for keys %{ $adoptee->{PYTS} };
          push @{ $self->{TIMERS} }, @{ $adoptee->{TIMERS} };
          $adoptee->{STATE} = _finished;
      }
  }
  
  sub _clobber {
      my IPC::Run $self = shift;
      my ($file) = @_;
      _debug_desc_fd( "closing", $file ) if _debugging_details;
      my $doomed = $file->{FD};
      my $dir = $file->{TYPE} =~ /^</ ? 'WIN' : 'RIN';
      vec( $self->{$dir}, $doomed, 1 ) = 0;
  
      #   vec( $self->{EIN},  $doomed, 1 ) = 0;
      vec( $self->{PIN}, $doomed, 1 ) = 0;
      if ( $file->{TYPE} =~ /^(.)pty.$/ ) {
          if ( $1 eq '>' ) {
              ## Only close output ptys.  This is so that ptys as inputs are
              ## never autoclosed, which would risk losing data that was
              ## in the slave->parent queue.
              _debug_desc_fd "closing pty", $file if _debugging_details;
              close $self->{PTYS}->{ $file->{PTY_ID} }
                if defined $self->{PTYS}->{ $file->{PTY_ID} };
              $self->{PTYS}->{ $file->{PTY_ID} } = undef;
          }
      }
      elsif ( UNIVERSAL::isa( $file, 'IPC::Run::IO' ) ) {
          $file->close unless $file->{DONT_CLOSE};
      }
      else {
          _close($doomed);
      }
  
      @{ $self->{PIPES} } = grep
        defined $_->{FD} && ( $_->{TYPE} ne $file->{TYPE} || $_->{FD} ne $doomed ),
        @{ $self->{PIPES} };
  
      $file->{FD} = undef;
  }
  
  sub _select_loop {
      my IPC::Run $self = shift;
  
      my $io_occurred;
  
      my $not_forever = 0.01;
  
    SELECT:
      while ( $self->pumpable ) {
          if ( $io_occurred && $self->{break_on_io} ) {
              _debug "exiting _select(): io occurred and break_on_io set"
                if _debugging_details;
              last;
          }
  
          my $timeout = $self->{non_blocking} ? 0 : undef;
  
          if ( @{ $self->{TIMERS} } ) {
              my $now = time;
              my $time_left;
              for ( @{ $self->{TIMERS} } ) {
                  next unless $_->is_running;
                  $time_left = $_->check($now);
                  ## Return when a timer expires
                  return if defined $time_left && !$time_left;
                  $timeout = $time_left
                    if !defined $timeout || $time_left < $timeout;
              }
          }
  
          ##
          ## See if we can unpause any input channels
          ##
          my $paused = 0;
  
          for my $file ( @{ $self->{PIPES} } ) {
              next unless $file->{PAUSED} && $file->{TYPE} =~ /^</;
  
              _debug_desc_fd( "checking for more input", $file ) if _debugging_details;
              my $did;
              1 while $did = $file->_do_filters($self);
              if ( defined $file->{FD} && !defined($did) || $did ) {
                  _debug_desc_fd( "unpausing", $file ) if _debugging_details;
                  $file->{PAUSED} = 0;
                  vec( $self->{WIN}, $file->{FD}, 1 ) = 1;
  
                  #	    vec( $self->{EIN}, $file->{FD}, 1 ) = 1;
                  vec( $self->{PIN}, $file->{FD}, 1 ) = 0;
              }
              else {
                  ## This gets incremented occasionally when the IO channel
                  ## was actually closed.  That's a bug, but it seems mostly
                  ## harmless: it causes us to exit if break_on_io, or to set
                  ## the timeout to not be forever.  I need to fix it, though.
                  ++$paused;
              }
          }
  
          if (_debugging_details) {
              my $map = join(
                  '',
                  map {
                      my $out;
                      $out = 'r' if vec( $self->{RIN}, $_, 1 );
                      $out = $out ? 'b' : 'w' if vec( $self->{WIN}, $_, 1 );
                      $out = 'p' if !$out && vec( $self->{PIN}, $_, 1 );
                      $out = $out ? uc($out) : 'x' if vec( $self->{EIN}, $_, 1 );
                      $out = '-' unless $out;
                      $out;
                  } ( 0 .. 1024 )
              );
              $map =~ s/((?:[a-zA-Z-]|\([^\)]*\)){12,}?)-*$/$1/;
              _debug 'fds for select: ', $map if _debugging_details;
          }
  
          ## _do_filters may have closed our last fd, and we need to see if
          ## we have I/O, or are just waiting for children to exit.
          my $p = $self->pumpable;
          last unless $p;
          if ( $p != 0 && ( !defined $timeout || $timeout > 0.1 ) ) {
              ## No I/O will wake the select loop up, but we have children
              ## lingering, so we need to poll them with a short timeout.
              ## Otherwise, assume more input will be coming.
              $timeout = $not_forever;
              $not_forever *= 2;
              $not_forever = 0.5 if $not_forever >= 0.5;
          }
  
          ## Make sure we don't block forever in select() because inputs are
          ## paused.
          if ( !defined $timeout && !( @{ $self->{PIPES} } - $paused ) ) {
              ## Need to return if we're in pump and all input is paused, or
              ## we'll loop until all inputs are unpaused, which is darn near
              ## forever.  And a day.
              if ( $self->{break_on_io} ) {
                  _debug "exiting _select(): no I/O to do and timeout=forever"
                    if _debugging;
                  last;
              }
  
              ## Otherwise, assume more input will be coming.
              $timeout = $not_forever;
              $not_forever *= 2;
              $not_forever = 0.5 if $not_forever >= 0.5;
          }
  
          _debug 'timeout=', defined $timeout ? $timeout : 'forever'
            if _debugging_details;
  
          my $nfound;
          unless (Win32_MODE) {
              $nfound = select(
                  $self->{ROUT} = $self->{RIN},
                  $self->{WOUT} = $self->{WIN},
                  $self->{EOUT} = $self->{EIN},
                  $timeout
              );
          }
          else {
              my @in = map $self->{$_}, qw( RIN WIN EIN );
              ## Win32's select() on Win32 seems to die if passed vectors of
              ## all 0's.  Need to report this when I get back online.
              for (@in) {
                  $_ = undef unless index( ( unpack "b*", $_ ), 1 ) >= 0;
              }
  
              $nfound = select(
                  $self->{ROUT} = $in[0],
                  $self->{WOUT} = $in[1],
                  $self->{EOUT} = $in[2],
                  $timeout
              );
  
              for ( $self->{ROUT}, $self->{WOUT}, $self->{EOUT} ) {
                  $_ = "" unless defined $_;
              }
          }
          last if !$nfound && $self->{non_blocking};
  
          if ( $nfound < 0 ) {
              if ( $!{EINTR} ) {
  
                  # Caught a signal before any FD went ready.  Ensure that
                  # the bit fields reflect "no FDs ready".
                  $self->{ROUT} = $self->{WOUT} = $self->{EOUT} = '';
                  $nfound = 0;
              }
              else {
                  croak "$! in select";
              }
          }
          ## TODO: Analyze the EINTR failure mode and see if this patch
          ## is adequate and optimal.
          ## TODO: Add an EINTR test to the test suite.
  
          if (_debugging_details) {
              my $map = join(
                  '',
                  map {
                      my $out;
                      $out = 'r' if vec( $self->{ROUT}, $_, 1 );
                      $out = $out ? 'b'      : 'w' if vec( $self->{WOUT}, $_, 1 );
                      $out = $out ? uc($out) : 'x' if vec( $self->{EOUT}, $_, 1 );
                      $out = '-' unless $out;
                      $out;
                  } ( 0 .. 128 )
              );
              $map =~ s/((?:[a-zA-Z-]|\([^\)]*\)){12,}?)-*$/$1/;
              _debug "selected  ", $map;
          }
  
          ## Need to copy since _clobber alters @{$self->{PIPES}}.
          ## TODO: Rethink _clobber().  Rethink $file->{PAUSED}, too.
          my @pipes = @{ $self->{PIPES} };
          $io_occurred = $_->poll($self) ? 1 : $io_occurred for @pipes;
  
          #   FILE:
          #      for my $pipe ( @pipes ) {
          #         ## Pipes can be shared among kids.  If another kid closes the
          #         ## pipe, then it's {FD} will be undef.  Also, on Win32, pipes can
          #	 ## be optimized to be files, in which case the FD is left undef
          #	 ## so we don't try to select() on it.
          #         if ( $pipe->{TYPE} =~ /^>/
          #            && defined $pipe->{FD}
          #            && vec( $self->{ROUT}, $pipe->{FD}, 1 )
          #         ) {
          #            _debug_desc_fd( "filtering data from", $pipe ) if _debugging_details;
          #confess "phooey" unless UNIVERSAL::isa( $pipe, "IPC::Run::IO" );
          #            $io_occurred = 1 if $pipe->_do_filters( $self );
          #
          #            next FILE unless defined $pipe->{FD};
          #         }
          #
          #	 ## On Win32, pipes to the child can be optimized to be files
          #	 ## and FD left undefined so we won't select on it.
          #         if ( $pipe->{TYPE} =~ /^</
          #            && defined $pipe->{FD}
          #            && vec( $self->{WOUT}, $pipe->{FD}, 1 )
          #         ) {
          #            _debug_desc_fd( "filtering data to", $pipe ) if _debugging_details;
          #            $io_occurred = 1 if $pipe->_do_filters( $self );
          #
          #            next FILE unless defined $pipe->{FD};
          #         }
          #
          #         if ( defined $pipe->{FD} && vec( $self->{EOUT}, $pipe->{FD}, 1 ) ) {
          #            ## BSD seems to sometimes raise the exceptional condition flag
          #            ## when a pipe is closed before we read it's last data.  This
          #            ## causes spurious warnings and generally renders the exception
          #            ## mechanism useless for our purposes.  The exception
          #            ## flag semantics are too variable (they're device driver
          #            ## specific) for me to easily map to any automatic action like
          #            ## warning or croaking (try running v0.42 if you don't believe me
          #            ## :-).
          #            warn "Exception on descriptor $pipe->{FD}";
          #         }
          #      }
      }
  
      return;
  }
  
  sub _cleanup {
      my IPC::Run $self = shift;
      _debug "cleaning up" if _debugging_details;
  
      for ( values %{ $self->{PTYS} } ) {
          next unless ref $_;
          eval {
              _debug "closing slave fd ", fileno $_->slave if _debugging_data;
              close $_->slave;
          };
          carp $@ . " while closing ptys" if $@;
          eval {
              _debug "closing master fd ", fileno $_ if _debugging_data;
              close $_;
          };
          carp $@ . " closing ptys" if $@;
      }
  
      _debug "cleaning up pipes" if _debugging_details;
      ## _clobber modifies PIPES
      $self->_clobber( $self->{PIPES}->[0] ) while @{ $self->{PIPES} };
  
      for my $kid ( @{ $self->{KIDS} } ) {
          _debug "cleaning up kid ", $kid->{NUM} if _debugging_details;
          if ( !length $kid->{PID} ) {
              _debug 'never ran child ', $kid->{NUM}, ", can't reap"
                if _debugging;
              for my $op ( @{ $kid->{OPS} } ) {
                  _close( $op->{TFD} )
                    if defined $op->{TFD} && !defined $op->{TEMP_FILE_HANDLE};
              }
          }
          elsif ( !defined $kid->{RESULT} ) {
              _debug 'reaping child ', $kid->{NUM}, ' (pid ', $kid->{PID}, ')'
                if _debugging;
              my $pid = waitpid $kid->{PID}, 0;
              $kid->{RESULT} = $?;
              _debug 'reaped ', $pid, ', $?=', $kid->{RESULT}
                if _debugging;
          }
  
          #      if ( defined $kid->{DEBUG_FD} ) {
          #	 die;
          #         @{$kid->{OPS}} = grep
          #            ! defined $_->{KFD} || $_->{KFD} != $kid->{DEBUG_FD},
          #            @{$kid->{OPS}};
          #         $kid->{DEBUG_FD} = undef;
          #      }
  
          _debug "cleaning up filters" if _debugging_details;
          for my $op ( @{ $kid->{OPS} } ) {
              @{ $op->{FILTERS} } = grep {
                  my $filter = $_;
                  !grep $filter == $_, @{ $self->{TEMP_FILTERS} };
              } @{ $op->{FILTERS} };
          }
  
          for my $op ( @{ $kid->{OPS} } ) {
              $op->_cleanup($self) if UNIVERSAL::isa( $op, "IPC::Run::IO" );
          }
      }
      $self->{STATE} = _finished;
      @{ $self->{TEMP_FILTERS} } = ();
      _debug "done cleaning up" if _debugging_details;
  
      POSIX::close $self->{DEBUG_FD} if defined $self->{DEBUG_FD};
      $self->{DEBUG_FD} = undef;
  }
  
  =pod
  
  =item pump
  
     pump $h;
     $h->pump;
  
  Pump accepts a single parameter harness.  It blocks until it delivers some
  input or receives some output.  It returns TRUE if there is still input or
  output to be done, FALSE otherwise.
  
  pump() will automatically call start() if need be, so you may call harness()
  then proceed to pump() if that helps you structure your application.
  
  If pump() is called after all harnessed activities have completed, a "process
  ended prematurely" exception to be thrown.  This allows for simple scripting
  of external applications without having to add lots of error handling code at
  each step of the script:
  
     $h = harness \@smbclient, \$in, \$out, $err;
  
     $in = "cd /foo\n";
     $h->pump until $out =~ /^smb.*> \Z/m;
     die "error cding to /foo:\n$out" if $out =~ "ERR";
     $out = '';
  
     $in = "mget *\n";
     $h->pump until $out =~ /^smb.*> \Z/m;
     die "error retrieving files:\n$out" if $out =~ "ERR";
  
     $h->finish;
  
     warn $err if $err;
  
  =cut
  
  sub pump {
      die "pump() takes only a single harness as a parameter"
        unless @_ == 1 && UNIVERSAL::isa( $_[0], __PACKAGE__ );
  
      my IPC::Run $self = shift;
  
      local $cur_self = $self;
  
      _debug "** pumping"
        if _debugging;
  
      #   my $r = eval {
      $self->start if $self->{STATE} < _started;
      croak "process ended prematurely" unless $self->pumpable;
  
      $self->{auto_close_ins} = 0;
      $self->{break_on_io}    = 1;
      $self->_select_loop;
      return $self->pumpable;
  
      #   };
      #   if ( $@ ) {
      #      my $x = $@;
      #      _debug $x if _debugging && $x;
      #      eval { $self->_cleanup };
      #      warn $@ if $@;
      #      die $x;
      #   }
      #   return $r;
  }
  
  =pod
  
  =item pump_nb
  
     pump_nb $h;
     $h->pump_nb;
  
  "pump() non-blocking", pumps if anything's ready to be pumped, returns
  immediately otherwise.  This is useful if you're doing some long-running
  task in the foreground, but don't want to starve any child processes.
  
  =cut
  
  sub pump_nb {
      my IPC::Run $self = shift;
  
      $self->{non_blocking} = 1;
      my $r = eval { $self->pump };
      $self->{non_blocking} = 0;
      die $@ if $@;
      return $r;
  }
  
  =pod
  
  =item pumpable
  
  Returns TRUE if calling pump() won't throw an immediate "process ended
  prematurely" exception.  This means that there are open I/O channels or
  active processes. May yield the parent processes' time slice for 0.01
  second if all pipes are to the child and all are paused.  In this case
  we can't tell if the child is dead, so we yield the processor and
  then attempt to reap the child in a nonblocking way.
  
  =cut
  
  ## Undocumented feature (don't depend on it outside this module):
  ## returns -1 if we have I/O channels open, or >0 if no I/O channels
  ## open, but we have kids running.  This allows the select loop
  ## to poll for child exit.
  sub pumpable {
      my IPC::Run $self = shift;
  
      ## There's a catch-22 we can get in to if there is only one pipe left
      ## open to the child and it's paused (ie the SCALAR it's tied to
      ## is '').  It's paused, so we're not select()ing on it, so we don't
      ## check it to see if the child attached to it is alive and it stays
      ## in @{$self->{PIPES}} forever.  So, if all pipes are paused, see if
      ## we can reap the child.
      return -1 if grep !$_->{PAUSED}, @{ $self->{PIPES} };
  
      ## See if the child is dead.
      $self->reap_nb;
      return 0 unless $self->_running_kids;
  
      ## If we reap_nb and it's not dead yet, yield to it to see if it
      ## exits.
      ##
      ## A better solution would be to unpause all the pipes, but I tried that
      ## and it never errored on linux.  Sigh.
      select undef, undef, undef, 0.0001;
  
      ## try again
      $self->reap_nb;
      return 0 unless $self->_running_kids;
  
      return -1;    ## There are pipes waiting
  }
  
  sub _running_kids {
      my IPC::Run $self = shift;
      return grep
        defined $_->{PID} && !defined $_->{RESULT},
        @{ $self->{KIDS} };
  }
  
  =pod
  
  =item reap_nb
  
  Attempts to reap child processes, but does not block.
  
  Does not currently take any parameters, one day it will allow specific
  children to be reaped.
  
  Only call this from a signal handler if your C<perl> is recent enough
  to have safe signal handling (5.6.1 did not, IIRC, but it was being discussed
  on perl5-porters).  Calling this (or doing any significant work) in a signal
  handler on older C<perl>s is asking for seg faults.
  
  =cut
  
  my $still_runnings;
  
  sub reap_nb {
      my IPC::Run $self = shift;
  
      local $cur_self = $self;
  
      ## No more pipes, look to see if all the kids yet live, reaping those
      ## that haven't.  I'd use $SIG{CHLD}/$SIG{CLD}, but that's broken
      ## on older (SYSV) platforms and perhaps less portable than waitpid().
      ## This could be slow with a lot of kids, but that's rare and, well,
      ## a lot of kids is slow in the first place.
      ## Oh, and this keeps us from reaping other children the process
      ## may have spawned.
      for my $kid ( @{ $self->{KIDS} } ) {
          if (Win32_MODE) {
              next if !defined $kid->{PROCESS} || defined $kid->{RESULT};
              unless ( $kid->{PROCESS}->Wait(0) ) {
                  _debug "kid $kid->{NUM} ($kid->{PID}) still running"
                    if _debugging_details;
                  next;
              }
  
              _debug "kid $kid->{NUM} ($kid->{PID}) exited"
                if _debugging;
  
              $kid->{PROCESS}->GetExitCode( $kid->{RESULT} )
                or croak "$! while GetExitCode()ing for Win32 process";
  
              unless ( defined $kid->{RESULT} ) {
                  $kid->{RESULT} = "0 but true";
                  $? = $kid->{RESULT} = 0x0F;
              }
              else {
                  $? = $kid->{RESULT} << 8;
              }
          }
          else {
              next if !defined $kid->{PID} || defined $kid->{RESULT};
              my $pid = waitpid $kid->{PID}, POSIX::WNOHANG();
              unless ($pid) {
                  _debug "$kid->{NUM} ($kid->{PID}) still running"
                    if _debugging_details;
                  next;
              }
  
              if ( $pid < 0 ) {
                  _debug "No such process: $kid->{PID}\n" if _debugging;
                  $kid->{RESULT} = "unknown result, unknown PID";
              }
              else {
                  _debug "kid $kid->{NUM} ($kid->{PID}) exited"
                    if _debugging;
  
                  confess "waitpid returned the wrong PID: $pid instead of $kid->{PID}"
                    unless $pid == $kid->{PID};
                  _debug "$kid->{PID} returned $?\n" if _debugging;
                  $kid->{RESULT} = $?;
              }
          }
      }
  }
  
  =pod
  
  =item finish
  
  This must be called after the last start() or pump() call for a harness,
  or your system will accumulate defunct processes and you may "leak"
  file descriptors.
  
  finish() returns TRUE if all children returned 0 (and were not signaled and did
  not coredump, ie ! $?), and FALSE otherwise (this is like run(), and the
  opposite of system()).
  
  Once a harness has been finished, it may be run() or start()ed again,
  including by pump()s auto-start.
  
  If this throws an exception rather than a normal exit, the harness may
  be left in an unstable state, it's best to kill the harness to get rid
  of all the child processes, etc.
  
  Specifically, if a timeout expires in finish(), finish() will not
  kill all the children.  Call C<<$h->kill_kill>> in this case if you care.
  This differs from the behavior of L</run>.
  
  =cut
  
  sub finish {
      my IPC::Run $self = shift;
      my $options = @_ && ref $_[-1] eq 'HASH' ? pop : {};
  
      local $cur_self = $self;
  
      _debug "** finishing" if _debugging;
  
      $self->{non_blocking}   = 0;
      $self->{auto_close_ins} = 1;
      $self->{break_on_io}    = 0;
  
      # We don't alter $self->{clear_ins}, start() and run() control it.
  
      while ( $self->pumpable ) {
          $self->_select_loop($options);
      }
      $self->_cleanup;
  
      return !$self->full_result;
  }
  
  =pod
  
  =item result
  
     $h->result;
  
  Returns the first non-zero result code (ie $? >> 8).  See L</full_result> to 
  get the $? value for a child process.
  
  To get the result of a particular child, do:
  
     $h->result( 0 );  # first child's $? >> 8
     $h->result( 1 );  # second child
  
  or
  
     ($h->results)[0]
     ($h->results)[1]
  
  Returns undef if no child processes were spawned and no child number was
  specified.  Throws an exception if an out-of-range child number is passed.
  
  =cut
  
  sub _assert_finished {
      my IPC::Run $self = $_[0];
  
      croak "Harness not run" unless $self->{STATE} >= _finished;
      croak "Harness not finished running" unless $self->{STATE} == _finished;
  }
  
  sub result {
      &_assert_finished;
      my IPC::Run $self = shift;
  
      if (@_) {
          my ($which) = @_;
          croak(
              "Only ",
              scalar( @{ $self->{KIDS} } ),
              " child processes, no process $which"
          ) unless $which >= 0 && $which <= $#{ $self->{KIDS} };
          return $self->{KIDS}->[$which]->{RESULT} >> 8;
      }
      else {
          return undef unless @{ $self->{KIDS} };
          for ( @{ $self->{KIDS} } ) {
              return $_->{RESULT} >> 8 if $_->{RESULT} >> 8;
          }
      }
  }
  
  =pod
  
  =item results
  
  Returns a list of child exit values.  See L</full_results> if you want to
  know if a signal killed the child.
  
  Throws an exception if the harness is not in a finished state.
   
  =cut
  
  sub results {
      &_assert_finished;
      my IPC::Run $self = shift;
  
      # we add 0 here to stop warnings associated with "unknown result, unknown PID"
      return map { ( 0 + $_->{RESULT} ) >> 8 } @{ $self->{KIDS} };
  }
  
  =pod
  
  =item full_result
  
     $h->full_result;
  
  Returns the first non-zero $?.  See L</result> to get the first $? >> 8 
  value for a child process.
  
  To get the result of a particular child, do:
  
     $h->full_result( 0 );  # first child's $?
     $h->full_result( 1 );  # second child
  
  or
  
     ($h->full_results)[0]
     ($h->full_results)[1]
  
  Returns undef if no child processes were spawned and no child number was
  specified.  Throws an exception if an out-of-range child number is passed.
  
  =cut
  
  sub full_result {
      goto &result if @_ > 1;
      &_assert_finished;
  
      my IPC::Run $self = shift;
  
      return undef unless @{ $self->{KIDS} };
      for ( @{ $self->{KIDS} } ) {
          return $_->{RESULT} if $_->{RESULT};
      }
  }
  
  =pod
  
  =item full_results
  
  Returns a list of child exit values as returned by C<wait>.  See L</results>
  if you don't care about coredumps or signals.
  
  Throws an exception if the harness is not in a finished state.
   
  =cut
  
  sub full_results {
      &_assert_finished;
      my IPC::Run $self = shift;
  
      croak "Harness not run" unless $self->{STATE} >= _finished;
      croak "Harness not finished running" unless $self->{STATE} == _finished;
  
      return map $_->{RESULT}, @{ $self->{KIDS} };
  }
  
  ##
  ## Filter Scaffolding
  ##
  use vars (
      '$filter_op',     ## The op running a filter chain right now
      '$filter_num',    ## Which filter is being run right now.
  );
  
  ##
  ## A few filters and filter constructors
  ##
  
  =pod
  
  =back
  
  =back
  
  =head1 FILTERS
  
  These filters are used to modify input our output between a child
  process and a scalar or subroutine endpoint.
  
  =over
  
  =item binary
  
     run \@cmd, ">", binary, \$out;
     run \@cmd, ">", binary, \$out;  ## Any TRUE value to enable
     run \@cmd, ">", binary 0, \$out;  ## Any FALSE value to disable
  
  This is a constructor for a "binmode" "filter" that tells IPC::Run to keep
  the carriage returns that would ordinarily be edited out for you (binmode
  is usually off).  This is not a real filter, but an option masquerading as
  a filter.
  
  It's not named "binmode" because you're likely to want to call Perl's binmode
  in programs that are piping binary data around.
  
  =cut
  
  sub binary(;$) {
      my $enable = @_ ? shift : 1;
      return bless sub { $enable }, "IPC::Run::binmode_pseudo_filter";
  }
  
  =pod
  
  =item new_chunker
  
  This breaks a stream of data in to chunks, based on an optional
  scalar or regular expression parameter.  The default is the Perl
  input record separator in $/, which is a newline be default.
  
     run \@cmd, '>', new_chunker, \&lines_handler;
     run \@cmd, '>', new_chunker( "\r\n" ), \&lines_handler;
  
  Because this uses $/ by default, you should always pass in a parameter
  if you are worried about other code (modules, etc) modifying $/.
  
  If this filter is last in a filter chain that dumps in to a scalar,
  the scalar must be set to '' before a new chunk will be written to it.
  
  As an example of how a filter like this can be written, here's a
  chunker that splits on newlines:
  
     sub line_splitter {
        my ( $in_ref, $out_ref ) = @_;
  
        return 0 if length $$out_ref;
  
        return input_avail && do {
           while (1) {
              if ( $$in_ref =~ s/\A(.*?\n)// ) {
                 $$out_ref .= $1;
                 return 1;
              }
              my $hmm = get_more_input;
              unless ( defined $hmm ) {
                 $$out_ref = $$in_ref;
                 $$in_ref = '';
                 return length $$out_ref ? 1 : 0;
              }
              return 0 if $hmm eq 0;
           }
        }
     };
  
  =cut
  
  sub new_chunker(;$) {
      my ($re) = @_;
      $re = $/ if _empty $re;
      $re = quotemeta($re) unless ref $re eq 'Regexp';
      $re = qr/\A(.*?$re)/s;
  
      return sub {
          my ( $in_ref, $out_ref ) = @_;
  
          return 0 if length $$out_ref;
  
          return input_avail && do {
              while (1) {
                  if ( $$in_ref =~ s/$re// ) {
                      $$out_ref .= $1;
                      return 1;
                  }
                  my $hmm = get_more_input;
                  unless ( defined $hmm ) {
                      $$out_ref = $$in_ref;
                      $$in_ref  = '';
                      return length $$out_ref ? 1 : 0;
                  }
                  return 0 if $hmm eq 0;
              }
            }
      };
  }
  
  =pod
  
  =item new_appender
  
  This appends a fixed string to each chunk of data read from the source
  scalar or sub.  This might be useful if you're writing commands to a
  child process that always must end in a fixed string, like "\n":
  
     run( \@cmd,
        '<', new_appender( "\n" ), \&commands,
     );
  
  Here's a typical filter sub that might be created by new_appender():
  
     sub newline_appender {
        my ( $in_ref, $out_ref ) = @_;
  
        return input_avail && do {
           $$out_ref = join( '', $$out_ref, $$in_ref, "\n" );
           $$in_ref = '';
           1;
        }
     };
  
  =cut
  
  sub new_appender($) {
      my ($suffix) = @_;
      croak "\$suffix undefined" unless defined $suffix;
  
      return sub {
          my ( $in_ref, $out_ref ) = @_;
  
          return input_avail && do {
              $$out_ref = join( '', $$out_ref, $$in_ref, $suffix );
              $$in_ref = '';
              1;
            }
      };
  }
  
  =item new_string_source
  
  TODO: Needs confirmation. Was previously undocumented. in this module.
  
  This is a filter which is exportable. Returns a sub which appends the data passed in to the output buffer and returns 1 if data was appended. 0 if it was an empty string and undef if no data was passed. 
  
  NOTE: Any additional variables passed to new_string_source will be passed to the sub every time it's called and appended to the output. 
  
  =cut
  
  sub new_string_source {
      my $ref;
      if ( @_ > 1 ) {
          $ref = [@_],
      }
      else {
          $ref = shift;
      }
  
      return ref $ref eq 'SCALAR'
        ? sub {
          my ( $in_ref, $out_ref ) = @_;
  
          return defined $$ref
            ? do {
              $$out_ref .= $$ref;
              my $r = length $$ref ? 1 : 0;
              $$ref = undef;
              $r;
            }
            : undef;
        }
        : sub {
          my ( $in_ref, $out_ref ) = @_;
  
          return @$ref
            ? do {
              my $s = shift @$ref;
              $$out_ref .= $s;
              length $s ? 1 : 0;
            }
            : undef;
        }
  }
  
  =item new_string_sink
  
  TODO: Needs confirmation. Was previously undocumented.
  
  This is a filter which is exportable. Returns a sub which pops the data out of the input stream and pushes it onto the string.
  
  =cut
  
  sub new_string_sink {
      my ($string_ref) = @_;
  
      return sub {
          my ( $in_ref, $out_ref ) = @_;
  
          return input_avail && do {
              $$string_ref .= $$in_ref;
              $$in_ref = '';
              1;
            }
      };
  }
  
  #=item timeout
  #
  #This function defines a time interval, starting from when start() is
  #called, or when timeout() is called.  If all processes have not finished
  #by the end of the timeout period, then a "process timed out" exception
  #is thrown.
  #
  #The time interval may be passed in seconds, or as an end time in
  #"HH:MM:SS" format (any non-digit other than '.' may be used as
  #spacing and punctuation).  This is probably best shown by example:
  #
  #   $h->timeout( $val );
  #
  #   $val                     Effect
  #   ======================== =====================================
  #   undef                    Timeout timer disabled
  #   ''                       Almost immediate timeout
  #   0                        Almost immediate timeout
  #   0.000001                 timeout > 0.0000001 seconds
  #   30                       timeout > 30 seconds
  #   30.0000001               timeout > 30 seconds
  #   10:30                    timeout > 10 minutes, 30 seconds
  #
  #Timeouts are currently evaluated with a 1 second resolution, though
  #this may change in the future.  This means that setting
  #timeout($h,1) will cause a pokey child to be aborted sometime after
  #one second has elapsed and typically before two seconds have elapsed.
  #
  #This sub does not check whether or not the timeout has expired already.
  #
  #Returns the number of seconds set as the timeout (this does not change
  #as time passes, unless you call timeout( val ) again).
  #
  #The timeout does not include the time needed to fork() or spawn()
  #the child processes, though some setup time for the child processes can
  #included.  It also does not include the length of time it takes for
  #the children to exit after they've closed all their pipes to the
  #parent process.
  #
  #=cut
  #
  #sub timeout {
  #   my IPC::Run $self = shift;
  #
  #   if ( @_ ) {
  #      ( $self->{TIMEOUT} ) = @_;
  #      $self->{TIMEOUT_END} = undef;
  #      if ( defined $self->{TIMEOUT} ) {
  #	 if ( $self->{TIMEOUT} =~ /[^\d.]/ ) {
  #	    my @f = split( /[^\d\.]+/i, $self->{TIMEOUT} );
  #	    unshift @f, 0 while @f < 3;
  #	    $self->{TIMEOUT} = (($f[0]*60)+$f[1])*60+$f[2];
  #	 }
  #	 elsif ( $self->{TIMEOUT} =~ /^(\d*)(?:\.(\d*))/ ) {
  #	    $self->{TIMEOUT} = $1 + 1;
  #	 }
  #	 $self->_calc_timeout_end if $self->{STATE} >= _started;
  #      }
  #   }
  #   return $self->{TIMEOUT};
  #}
  #
  #
  #sub _calc_timeout_end {
  #   my IPC::Run $self = shift;
  #
  #   $self->{TIMEOUT_END} = defined $self->{TIMEOUT}
  #      ? time + $self->{TIMEOUT}
  #      : undef;
  #
  #   ## We add a second because we might be at the very end of the current
  #   ## second, and we want to guarantee that we don't have a timeout even
  #   ## one second less then the timeout period.
  #   ++$self->{TIMEOUT_END} if $self->{TIMEOUT};
  #}
  
  =pod
  
  =item io
  
  Takes a filename or filehandle, a redirection operator, optional filters,
  and a source or destination (depends on the redirection operator).  Returns
  an IPC::Run::IO object suitable for harness()ing (including via start()
  or run()).
  
  This is shorthand for 
  
  
     require IPC::Run::IO;
  
        ... IPC::Run::IO->new(...) ...
  
  =cut
  
  sub io {
      require IPC::Run::IO;
      IPC::Run::IO->new(@_);
  }
  
  =pod
  
  =item timer
  
     $h = start( \@cmd, \$in, \$out, $t = timer( 5 ) );
  
     pump $h until $out =~ /expected stuff/ || $t->is_expired;
  
  Instantiates a non-fatal timer.  pump() returns once each time a timer
  expires.  Has no direct effect on run(), but you can pass a subroutine
  to fire when the timer expires. 
  
  See L</timeout> for building timers that throw exceptions on
  expiration.
  
  See L<IPC::Run::Timer/timer> for details.
  
  =cut
  
  # Doing the prototype suppresses 'only used once' on older perls.
  sub timer;
  *timer = \&IPC::Run::Timer::timer;
  
  =pod
  
  =item timeout
  
     $h = start( \@cmd, \$in, \$out, $t = timeout( 5 ) );
  
     pump $h until $out =~ /expected stuff/;
  
  Instantiates a timer that throws an exception when it expires.
  If you don't provide an exception, a default exception that matches
  /^IPC::Run: .*timed out/ is thrown by default.  You can pass in your own
  exception scalar or reference:
  
     $h = start(
        \@cmd, \$in, \$out,
        $t = timeout( 5, exception => 'slowpoke' ),
     );
  
  or set the name used in debugging message and in the default exception
  string:
  
     $h = start(
        \@cmd, \$in, \$out,
        timeout( 50, name => 'process timer' ),
        $stall_timer = timeout( 5, name => 'stall timer' ),
     );
  
     pump $h until $out =~ /started/;
  
     $in = 'command 1';
     $stall_timer->start;
     pump $h until $out =~ /command 1 finished/;
  
     $in = 'command 2';
     $stall_timer->start;
     pump $h until $out =~ /command 2 finished/;
  
     $in = 'very slow command 3';
     $stall_timer->start( 10 );
     pump $h until $out =~ /command 3 finished/;
  
     $stall_timer->start( 5 );
     $in = 'command 4';
     pump $h until $out =~ /command 4 finished/;
  
     $stall_timer->reset; # Prevent restarting or expirng
     finish $h;
  
  See L</timer> for building non-fatal timers.
  
  See L<IPC::Run::Timer/timer> for details.
  
  =cut
  
  # Doing the prototype suppresses 'only used once' on older perls.
  sub timeout;
  *timeout = \&IPC::Run::Timer::timeout;
  
  =pod
  
  =back
  
  =head1 FILTER IMPLEMENTATION FUNCTIONS
  
  These functions are for use from within filters.
  
  =over
  
  =item input_avail
  
  Returns TRUE if input is available.  If none is available, then 
  &get_more_input is called and its result is returned.
  
  This is usually used in preference to &get_more_input so that the
  calling filter removes all data from the $in_ref before more data
  gets read in to $in_ref.
  
  C<input_avail> is usually used as part of a return expression:
  
     return input_avail && do {
        ## process the input just gotten
        1;
     };
  
  This technique allows input_avail to return the undef or 0 that a
  filter normally returns when there's no input to process.  If a filter
  stores intermediate values, however, it will need to react to an
  undef:
  
     my $got = input_avail;
     if ( ! defined $got ) {
        ## No more input ever, flush internal buffers to $out_ref
     }
     return $got unless $got;
     ## Got some input, move as much as need be
     return 1 if $added_to_out_ref;
  
  =cut
  
  sub input_avail() {
      confess "Undefined FBUF ref for $filter_num+1"
        unless defined $filter_op->{FBUFS}->[ $filter_num + 1 ];
      length ${ $filter_op->{FBUFS}->[ $filter_num + 1 ] } || get_more_input;
  }
  
  =pod
  
  =item get_more_input
  
  This is used to fetch more input in to the input variable.  It returns
  undef if there will never be any more input, 0 if there is none now,
  but there might be in the future, and TRUE if more input was gotten.
  
  C<get_more_input> is usually used as part of a return expression,
  see L</input_avail> for more information.
  
  =cut
  
  ##
  ## Filter implementation interface
  ##
  sub get_more_input() {
      ++$filter_num;
      my $r = eval {
          confess "get_more_input() called and no more filters in chain"
            unless defined $filter_op->{FILTERS}->[$filter_num];
          $filter_op->{FILTERS}->[$filter_num]->(
              $filter_op->{FBUFS}->[ $filter_num + 1 ],
              $filter_op->{FBUFS}->[$filter_num],
          );    # if defined ${$filter_op->{FBUFS}->[$filter_num+1]};
      };
      --$filter_num;
      die $@ if $@;
      return $r;
  }
  
  1;
  
  =pod
  
  =back
  
  =head1 TODO
  
  These will be addressed as needed and as time allows.
  
  Stall timeout.
  
  Expose a list of child process objects.  When I do this,
  each child process is likely to be blessed into IPC::Run::Proc.
  
  $kid->abort(), $kid->kill(), $kid->signal( $num_or_name ).
  
  Write tests for /(full_)?results?/ subs.
  
  Currently, pump() and run() only work on systems where select() works on the
  filehandles returned by pipe().  This does *not* include ActiveState on Win32,
  although it does work on cygwin under Win32 (thought the tests whine a bit).
  I'd like to rectify that, suggestions and patches welcome.
  
  Likewise start() only fully works on fork()/exec() machines (well, just
  fork() if you only ever pass perl subs as subprocesses).  There's
  some scaffolding for calling Open3::spawn_with_handles(), but that's
  untested, and not that useful with limited select().
  
  Support for C<\@sub_cmd> as an argument to a command which
  gets replaced with /dev/fd or the name of a temporary file containing foo's
  output.  This is like <(sub_cmd ...) found in bash and csh (IIRC).
  
  Allow multiple harnesses to be combined as independent sets of processes
  in to one 'meta-harness'.
  
  Allow a harness to be passed in place of an \@cmd.  This would allow
  multiple harnesses to be aggregated.
  
  Ability to add external file descriptors w/ filter chains and endpoints.
  
  Ability to add timeouts and timing generators (i.e. repeating timeouts).
  
  High resolution timeouts.
  
  =head1 Win32 LIMITATIONS
  
  =over
  
  =item Fails on Win9X
  
  If you want Win9X support, you'll have to debug it or fund me because I
  don't use that system any more.  The Win32 subsysem has been extended to
  use temporary files in simple run() invocations and these may actually
  work on Win9X too, but I don't have time to work on it.
  
  =item May deadlock on Win2K (but not WinNT4 or WinXPPro)
  
  Spawning more than one subprocess on Win2K causes a deadlock I haven't
  figured out yet, but simple uses of run() often work.  Passes all tests
  on WinXPPro and WinNT.
  
  =item no support yet for <pty< and >pty>
  
  These are likely to be implemented as "<" and ">" with binmode on, not
  sure.
  
  =item no support for file descriptors higher than 2 (stderr)
  
  Win32 only allows passing explicit fds 0, 1, and 2.  If you really, really need to pass file handles, us Win32API:: GetOsFHandle() or ::FdGetOsFHandle() to
  get the integer handle and pass it to the child process using the command
  line, environment, stdin, intermediary file, or other IPC mechanism.  Then
  use that handle in the child (Win32API.pm provides ways to reconstitute
  Perl file handles from Win32 file handles).
  
  =item no support for subroutine subprocesses (CODE refs)
  
  Can't fork(), so the subroutines would have no context, and closures certainly
  have no meaning
  
  Perhaps with Win32 fork() emulation, this can be supported in a limited
  fashion, but there are other very serious problems with that: all parent
  fds get dup()ed in to the thread emulating the forked process, and that
  keeps the parent from being able to close all of the appropriate fds.
  
  =item no support for init => sub {} routines.
  
  Win32 processes are created from scratch, there is no way to do an init
  routine that will affect the running child.  Some limited support might
  be implemented one day, do chdir() and %ENV changes can be made.
  
  =item signals
  
  Win32 does not fully support signals.  signal() is likely to cause errors
  unless sending a signal that Perl emulates, and C<kill_kill()> is immediately
  fatal (there is no grace period).
  
  =item helper processes
  
  IPC::Run uses helper processes, one per redirected file, to adapt between the
  anonymous pipe connected to the child and the TCP socket connected to the
  parent.  This is a waste of resources and will change in the future to either
  use threads (instead of helper processes) or a WaitForMultipleObjects call
  (instead of select).  Please contact me if you can help with the
  WaitForMultipleObjects() approach; I haven't figured out how to get at it
  without C code.
  
  =item shutdown pause
  
  There seems to be a pause of up to 1 second between when a child program exits
  and the corresponding sockets indicate that they are closed in the parent.
  Not sure why.
  
  =item binmode
  
  binmode is not supported yet.  The underpinnings are implemented, just ask
  if you need it.
  
  =item IPC::Run::IO
  
  IPC::Run::IO objects can be used on Unix to read or write arbitrary files.  On
  Win32, they will need to use the same helper processes to adapt from
  non-select()able filehandles to select()able ones (or perhaps
  WaitForMultipleObjects() will work with them, not sure).
  
  =item startup race conditions
  
  There seems to be an occasional race condition between child process startup
  and pipe closings.  It seems like if the child is not fully created by the time
  CreateProcess returns and we close the TCP socket being handed to it, the
  parent socket can also get closed.  This is seen with the Win32 pumper
  applications, not the "real" child process being spawned.
  
  I assume this is because the kernel hasn't gotten around to incrementing the
  reference count on the child's end (since the child was slow in starting), so
  the parent's closing of the child end causes the socket to be closed, thus
  closing the parent socket.
  
  Being a race condition, it's hard to reproduce, but I encountered it while
  testing this code on a drive share to a samba box.  In this case, it takes
  t/run.t a long time to spawn it's child processes (the parent hangs in the
  first select for several seconds until the child emits any debugging output).
  
  I have not seen it on local drives, and can't reproduce it at will,
  unfortunately.  The symptom is a "bad file descriptor in select()" error, and,
  by turning on debugging, it's possible to see that select() is being called on
  a no longer open file descriptor that was returned from the _socket() routine
  in Win32Helper.  There's a new confess() that checks for this ("PARENT_HANDLE
  no longer open"), but I haven't been able to reproduce it (typically).
  
  =back
  
  =head1 LIMITATIONS
  
  On Unix, requires a system that supports C<waitpid( $pid, WNOHANG )> so
  it can tell if a child process is still running.
  
  PTYs don't seem to be non-blocking on some versions of Solaris. Here's a
  test script contributed by Borislav Deianov <borislav@ensim.com> to see
  if you have the problem.  If it dies, you have the problem.
  
     #!/usr/bin/perl
  
     use IPC::Run qw(run);
     use Fcntl;
     use IO::Pty;
  
     sub makecmd {
         return ['perl', '-e', 
                 '<STDIN>, print "\n" x '.$_[0].'; while(<STDIN>){last if /end/}'];
     }
  
     #pipe R, W;
     #fcntl(W, F_SETFL, O_NONBLOCK);
     #while (syswrite(W, "\n", 1)) { $pipebuf++ };
     #print "pipe buffer size is $pipebuf\n";
     my $pipebuf=4096;
     my $in = "\n" x ($pipebuf * 2) . "end\n";
     my $out;
  
     $SIG{ALRM} = sub { die "Never completed!\n" };
  
     print "reading from scalar via pipe...";
     alarm( 2 );
     run(makecmd($pipebuf * 2), '<', \$in, '>', \$out);
     alarm( 0 );
     print "done\n";
  
     print "reading from code via pipe... ";
     alarm( 2 );
     run(makecmd($pipebuf * 3), '<', sub { $t = $in; undef $in; $t}, '>', \$out);
     alarm( 0 );
     print "done\n";
  
     $pty = IO::Pty->new();
     $pty->blocking(0);
     $slave = $pty->slave();
     while ($pty->syswrite("\n", 1)) { $ptybuf++ };
     print "pty buffer size is $ptybuf\n";
     $in = "\n" x ($ptybuf * 3) . "end\n";
  
     print "reading via pty... ";
     alarm( 2 );
     run(makecmd($ptybuf * 3), '<pty<', \$in, '>', \$out);
     alarm(0);
     print "done\n";
  
  No support for ';', '&&', '||', '{ ... }', etc: use perl's, since run()
  returns TRUE when the command exits with a 0 result code.
  
  Does not provide shell-like string interpolation.
  
  No support for C<cd>, C<setenv>, or C<export>: do these in an init() sub
  
     run(
        \cmd,
           ...
           init => sub {
              chdir $dir or die $!;
              $ENV{FOO}='BAR'
           }
     );
  
  Timeout calculation does not allow absolute times, or specification of
  days, months, etc.
  
  B<WARNING:> Function coprocesses (C<run \&foo, ...>) suffer from two
  limitations.  The first is that it is difficult to close all filehandles the
  child inherits from the parent, since there is no way to scan all open
  FILEHANDLEs in Perl and it both painful and a bit dangerous to close all open
  file descriptors with C<POSIX::close()>. Painful because we can't tell which
  fds are open at the POSIX level, either, so we'd have to scan all possible fds
  and close any that we don't want open (normally C<exec()> closes any
  non-inheritable but we don't C<exec()> for &sub processes.
  
  The second problem is that Perl's DESTROY subs and other on-exit cleanup gets
  run in the child process.  If objects are instantiated in the parent before the
  child is forked, the DESTROY will get run once in the parent and once in
  the child.  When coprocess subs exit, POSIX::_exit is called to work around this,
  but it means that objects that are still referred to at that time are not
  cleaned up.  So setting package vars or closure vars to point to objects that
  rely on DESTROY to affect things outside the process (files, etc), will
  lead to bugs.
  
  I goofed on the syntax: "<pipe" vs. "<pty<" and ">filename" are both
  oddities.
  
  =head1 TODO
  
  =over
  
  =item Allow one harness to "adopt" another:
  
     $new_h = harness \@cmd2;
     $h->adopt( $new_h );
  
  =item Close all filehandles not explicitly marked to stay open.
  
  The problem with this one is that there's no good way to scan all open
  FILEHANDLEs in Perl, yet you don't want child processes inheriting handles
  willy-nilly.
  
  =back
  
  =head1 INSPIRATION
  
  Well, select() and waitpid() badly needed wrapping, and open3() isn't
  open-minded enough for me.
  
  The shell-like API inspired by a message Russ Allbery sent to perl5-porters,
  which included:
  
     I've thought for some time that it would be
     nice to have a module that could handle full Bourne shell pipe syntax
     internally, with fork and exec, without ever invoking a shell.  Something
     that you could give things like:
  
     pipeopen (PIPE, [ qw/cat file/ ], '|', [ 'analyze', @args ], '>&3');
  
  Message ylln51p2b6.fsf@windlord.stanford.edu, on 2000/02/04.
  
  =head1 SUPPORT
  
  Bugs should always be submitted via the GitHub bug tracker
  
  L<https://github.com/toddr/IPC-Run/issues>
  
  =head1 AUTHORS
  
  Adam Kennedy <adamk@cpan.org>
  
  Barrie Slaymaker <barries@slaysys.com>
  
  =head1 COPYRIGHT
  
  Some parts copyright 2008 - 2009 Adam Kennedy.
  
  Copyright 1999 Barrie Slaymaker.
  
  You may distribute under the terms of either the GNU General Public
  License or the Artistic License, as specified in the README file.
  
  =cut
IPC_RUN

    $main::fatpacked{"IPC/Run/Debug.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'IPC_RUN_DEBUG';
  package IPC::Run::Debug;
  
  =pod
  
  =head1 NAME
  
  IPC::Run::Debug - debugging routines for IPC::Run
  
  =head1 SYNOPSIS
  
     ##
     ## Environment variable usage
     ##
     ## To force debugging off and shave a bit of CPU and memory
     ## by compile-time optimizing away all debugging code in IPC::Run
     ## (debug => ...) options to IPC::Run will be ignored.
     export IPCRUNDEBUG=none
  
     ## To force debugging on (levels are from 0..10)
     export IPCRUNDEBUG=basic
  
     ## Leave unset or set to "" to compile in debugging support and
     ## allow runtime control of it using the debug option.
  
  =head1 DESCRIPTION
  
  Controls IPC::Run debugging.  Debugging levels are now set by using words,
  but the numbers shown are still supported for backwards compatibility:
  
     0  none         disabled (special, see below)
     1  basic        what's running
     2  data         what's being sent/received
     3  details      what's going on in more detail
     4  gory         way too much detail for most uses
     10 all          use this when submitting bug reports
        noopts       optimizations forbidden due to inherited STDIN
  
  The C<none> level is special when the environment variable IPCRUNDEBUG
  is set to this the first time IPC::Run::Debug is loaded: it prevents
  the debugging code from being compiled in to the remaining IPC::Run modules,
  saving a bit of cpu.
  
  To do this in a script, here's a way that allows it to be overridden:
  
     BEGIN {
        unless ( defined $ENV{IPCRUNDEBUG} ) {
  	 eval 'local $ENV{IPCRUNDEBUG} = "none"; require IPC::Run::Debug"'
  	    or die $@;
        }
     }
  
  This should force IPC::Run to not be debuggable unless somebody sets
  the IPCRUNDEBUG flag; modify this formula to grep @ARGV if need be:
  
     BEGIN {
        unless ( grep /^--debug/, @ARGV ) {
  	 eval 'local $ENV{IPCRUNDEBUG} = "none"; require IPC::Run::Debug"'
  	 or die $@;
     }
  
  Both of those are untested.
  
  =cut
  
  ## We use @EXPORT for the end user's convenience: there's only one function
  ## exported, it's homonymous with the module, it's an unusual name, and
  ## it can be suppressed by "use IPC::Run ();".
  
  use strict;
  use Exporter;
  use vars qw{$VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS};
  
  BEGIN {
      $VERSION = '20180523.0';
      @ISA     = qw( Exporter );
      @EXPORT  = qw(
        _debug
        _debug_desc_fd
        _debugging
        _debugging_data
        _debugging_details
        _debugging_gory_details
        _debugging_not_optimized
        _set_child_debug_name
      );
  
      @EXPORT_OK = qw(
        _debug_init
        _debugging_level
        _map_fds
      );
      %EXPORT_TAGS = (
          default => \@EXPORT,
          all => [ @EXPORT, @EXPORT_OK ],
      );
  }
  
  my $disable_debugging = defined $ENV{IPCRUNDEBUG}
    && ( !$ENV{IPCRUNDEBUG}
      || lc $ENV{IPCRUNDEBUG} eq "none" );
  
  eval( $disable_debugging ? <<'STUBS' : <<'SUBS' ) or die $@;
  sub _map_fds()                 { "" }
  sub _debug                     {}
  sub _debug_desc_fd             {}
  sub _debug_init                {}
  sub _set_child_debug_name      {}
  sub _debugging()               { 0 }
  sub _debugging_level()         { 0 }
  sub _debugging_data()          { 0 }
  sub _debugging_details()       { 0 }
  sub _debugging_gory_details()  { 0 }
  sub _debugging_not_optimized() { 0 }
  
  1;
  STUBS
  
  use POSIX ();
  
  sub _map_fds {
     my $map = '';
     my $digit = 0;
     my $in_use;
     my $dummy;
     for my $fd (0..63) {
        ## I'd like a quicker way (less user, cpu & especially sys and kernel
        ## calls) to detect open file descriptors.  Let me know...
        ## Hmmm, could do a 0 length read and check for bad file descriptor...
        ## but that segfaults on Win32
        my $test_fd = POSIX::dup( $fd );
        $in_use = defined $test_fd;
        POSIX::close $test_fd if $in_use;
        $map .= $in_use ? $digit : '-';
        $digit = 0 if ++$digit > 9;
     }
     warn "No fds open???" unless $map =~ /\d/;
     $map =~ s/(.{1,12})-*$/$1/;
     return $map;
  }
  
  use vars qw( $parent_pid );
  
  $parent_pid = $$;
  
  ## TODO: move debugging to its own module and make it compile-time
  ## optimizable.
  
  ## Give kid process debugging nice names
  my $debug_name;
  
  sub _set_child_debug_name {
     $debug_name = shift;
  }
  
  ## There's a bit of hackery going on here.
  ##
  ## We want to have any code anywhere be able to emit
  ## debugging statements without knowing what harness the code is
  ## being called in/from, since we'd need to pass a harness around to
  ## everything.
  ##
  ## Thus, $cur_self was born.
  #
  my %debug_levels = (
     none    => 0,
     basic   => 1,
     data    => 2,
     details => 3,
     gore           => 4,
     gory_details   => 4,
     "gory details" => 4,
     gory           => 4,
     gorydetails    => 4,
     all     => 10,
     notopt  => 0,
  );
  
  my $warned;
  
  sub _debugging_level() {
     my $level = 0;
  
     $level = $IPC::Run::cur_self->{debug} || 0
        if $IPC::Run::cur_self
           && ( $IPC::Run::cur_self->{debug} || 0 ) >= $level;
  
     if ( defined $ENV{IPCRUNDEBUG} ) {
        my $v = $ENV{IPCRUNDEBUG};
        $v = $debug_levels{lc $v} if $v =~ /[a-zA-Z]/;
        unless ( defined $v ) {
  	 $warned ||= warn "Unknown debug level $ENV{IPCRUNDEBUG}, assuming 'basic' (1)\n";
  	 $v = 1;
        }
        $level = $v if $v > $level;
     }
     return $level;
  }
  
  sub _debugging_atleast($) {
     my $min_level = shift || 1;
  
     my $level = _debugging_level;
     
     return $level >= $min_level ? $level : 0;
  }
  
  sub _debugging()               { _debugging_atleast 1 }
  sub _debugging_data()          { _debugging_atleast 2 }
  sub _debugging_details()       { _debugging_atleast 3 }
  sub _debugging_gory_details()  { _debugging_atleast 4 }
  sub _debugging_not_optimized() { ( $ENV{IPCRUNDEBUG} || "" ) eq "notopt" }
  
  sub _debug_init {
     ## This routine is called only in spawned children to fake out the
     ## debug routines so they'll emit debugging info.
     $IPC::Run::cur_self = {};
     (  $parent_pid,
        $^T, 
        $IPC::Run::cur_self->{debug}, 
        $IPC::Run::cur_self->{DEBUG_FD}, 
        $debug_name 
     ) = @_;
  }
  
  
  sub _debug {
  #   return unless _debugging || _debugging_not_optimized;
  
     my $fd = defined &IPC::Run::_debug_fd
        ? IPC::Run::_debug_fd()
        : fileno STDERR;
  
     my $s;
     my $debug_id;
     $debug_id = join( 
        " ",
        join(
           "",
           defined $IPC::Run::cur_self ? "#$IPC::Run::cur_self->{ID}" : (),
           "($$)",
        ),
        defined $debug_name && length $debug_name ? $debug_name        : (),
     );
     my $prefix = join(
        "",
        "IPC::Run",
        sprintf( " %04d", time - $^T ),
        ( _debugging_details ? ( " ", _map_fds ) : () ),
        length $debug_id ? ( " [", $debug_id, "]" ) : (),
        ": ",
     );
  
     my $msg = join( '', map defined $_ ? $_ : "<undef>", @_ );
     chomp $msg;
     $msg =~ s{^}{$prefix}gm;
     $msg .= "\n";
     POSIX::write( $fd, $msg, length $msg );
  }
  
  
  my @fd_descs = ( 'stdin', 'stdout', 'stderr' );
  
  sub _debug_desc_fd {
     return unless _debugging;
     my $text = shift;
     my $op = pop;
     my $kid = $_[0];
  
  Carp::carp join " ", caller(0), $text, $op  if defined $op  && UNIVERSAL::isa( $op, "IO::Pty" );
  
     _debug(
        $text,
        ' ',
        ( defined $op->{FD}
           ? $op->{FD} < 3
              ? ( $fd_descs[$op->{FD}] )
              : ( 'fd ', $op->{FD} )
           : $op->{FD}
        ),
        ( defined $op->{KFD}
           ? (
              ' (kid',
              ( defined $kid ? ( ' ', $kid->{NUM}, ) : () ),
              "'s ",
              ( $op->{KFD} < 3
                 ? $fd_descs[$op->{KFD}]
                 : defined $kid
                    && defined $kid->{DEBUG_FD}
                    && $op->{KFD} == $kid->{DEBUG_FD}
                    ? ( 'debug (', $op->{KFD}, ')' )
                    : ( 'fd ', $op->{KFD} )
              ),
              ')',
           )
           : ()
        ),
     );
  }
  
  1;
  
  SUBS
  
  =pod
  
  =head1 AUTHOR
  
  Barrie Slaymaker <barries@slaysys.com>, with numerous suggestions by p5p.
  
  =cut
IPC_RUN_DEBUG

    $main::fatpacked{"IPC/Run/IO.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'IPC_RUN_IO';
  package IPC::Run::IO;
  
  =head1 NAME
  
  IPC::Run::IO -- I/O channels for IPC::Run.
  
  =head1 SYNOPSIS
  
  B<NOT IMPLEMENTED YET ON Win32! Win32 does not allow select() on
  normal file descriptors; IPC::RUN::IO needs to use IPC::Run::Win32Helper
  to do this.>
  
     use IPC::Run qw( io );
  
     ## The sense of '>' and '<' is opposite of perl's open(),
     ## but agrees with IPC::Run.
     $io = io( "filename", '>',  \$recv );
     $io = io( "filename", 'r',  \$recv );
  
     ## Append to $recv:
     $io = io( "filename", '>>', \$recv );
     $io = io( "filename", 'ra', \$recv );
  
     $io = io( "filename", '<',  \$send );
     $io = io( "filename", 'w',  \$send );
  
     $io = io( "filename", '<<', \$send );
     $io = io( "filename", 'wa', \$send );
  
     ## Handles / IO objects that the caller opens:
     $io = io( \*HANDLE,   '<',  \$send );
  
     $f = IO::Handle->new( ... ); # Any subclass of IO::Handle
     $io = io( $f, '<', \$send );
  
     require IPC::Run::IO;
     $io = IPC::Run::IO->new( ... );
  
     ## Then run(), harness(), or start():
     run $io, ...;
  
     ## You can, of course, use io() or IPC::Run::IO->new() as an
     ## argument to run(), harness, or start():
     run io( ... );
  
  =head1 DESCRIPTION
  
  This class and module allows filehandles and filenames to be harnessed for
  I/O when used IPC::Run, independent of anything else IPC::Run is doing
  (except that errors & exceptions can affect all things that IPC::Run is
  doing).
  
  =head1 SUBCLASSING
  
  INCOMPATIBLE CHANGE: due to the awkwardness introduced in ripping pseudohashes
  out of Perl, this class I<no longer> uses the fields pragma.
  
  =cut
  
  ## This class is also used internally by IPC::Run in a very intimate way,
  ## since this is a partial factoring of code from IPC::Run plus some code
  ## needed to do standalone channels.  This factoring process will continue
  ## at some point.  Don't know how far how fast.
  
  use strict;
  use Carp;
  use Fcntl;
  use Symbol;
  
  use IPC::Run::Debug;
  use IPC::Run qw( Win32_MODE );
  
  use vars qw{$VERSION};
  
  BEGIN {
      $VERSION = '20180523.0';
      if (Win32_MODE) {
          eval "use IPC::Run::Win32Helper; require IPC::Run::Win32IO; 1"
            or ( $@ && die )
            or die "$!";
      }
  }
  
  sub _empty($);
  *_empty = \&IPC::Run::_empty;
  
  =head1 SUBROUTINES
  
  =over 4
  
  =item new
  
  I think it takes >> or << along with some other data.
  
  TODO: Needs more thorough documentation. Patches welcome.
  
  =cut
  
  sub new {
      my $class = shift;
      $class = ref $class || $class;
  
      my ( $external, $type, $internal ) = ( shift, shift, pop );
  
      croak "$class: '$_' is not a valid I/O operator"
        unless $type =~ /^(?:<<?|>>?)$/;
  
      my IPC::Run::IO $self = $class->_new_internal( $type, undef, undef, $internal, undef, @_ );
  
      if ( !ref $external ) {
          $self->{FILENAME} = $external;
      }
      elsif ( ref $external eq 'GLOB' || UNIVERSAL::isa( $external, 'IO::Handle' ) ) {
          $self->{HANDLE}     = $external;
          $self->{DONT_CLOSE} = 1;
      }
      else {
          croak "$class: cannot accept " . ref($external) . " to do I/O with";
      }
  
      return $self;
  }
  
  ## IPC::Run uses this ctor, since it preparses things and needs more
  ## smarts.
  sub _new_internal {
      my $class = shift;
      $class = ref $class || $class;
  
      $class = "IPC::Run::Win32IO"
        if Win32_MODE && $class eq "IPC::Run::IO";
  
      my IPC::Run::IO $self;
      $self = bless {}, $class;
  
      my ( $type, $kfd, $pty_id, $internal, $binmode, @filters ) = @_;
  
      # Older perls (<=5.00503, at least) don't do list assign to
      # psuedo-hashes well.
      $self->{TYPE}   = $type;
      $self->{KFD}    = $kfd;
      $self->{PTY_ID} = $pty_id;
      $self->binmode($binmode);
      $self->{FILTERS} = [@filters];
  
      ## Add an adapter to the end of the filter chain (which is usually just the
      ## read/writer sub pushed by IPC::Run) to the DEST or SOURCE, if need be.
      if ( $self->op =~ />/ ) {
          croak "'$_' missing a destination" if _empty $internal;
          $self->{DEST} = $internal;
          if ( UNIVERSAL::isa( $self->{DEST}, 'CODE' ) ) {
              ## Put a filter on the end of the filter chain to pass the
              ## output on to the CODE ref.  For SCALAR refs, the last
              ## filter in the chain writes directly to the scalar itself.  See
              ## _init_filters().  For CODE refs, however, we need to adapt from
              ## the SCALAR to calling the CODE.
              unshift(
                  @{ $self->{FILTERS} },
                  sub {
                      my ($in_ref) = @_;
  
                      return IPC::Run::input_avail() && do {
                          $self->{DEST}->($$in_ref);
                          $$in_ref = '';
                          1;
                        }
                  }
              );
          }
      }
      else {
          croak "'$_' missing a source" if _empty $internal;
          $self->{SOURCE} = $internal;
          if ( UNIVERSAL::isa( $internal, 'CODE' ) ) {
              push(
                  @{ $self->{FILTERS} },
                  sub {
                      my ( $in_ref, $out_ref ) = @_;
                      return 0 if length $$out_ref;
  
                      return undef
                        if $self->{SOURCE_EMPTY};
  
                      my $in = $internal->();
                      unless ( defined $in ) {
                          $self->{SOURCE_EMPTY} = 1;
                          return undef;
                      }
                      return 0 unless length $in;
                      $$out_ref = $in;
  
                      return 1;
                  }
              );
          }
          elsif ( UNIVERSAL::isa( $internal, 'SCALAR' ) ) {
              push(
                  @{ $self->{FILTERS} },
                  sub {
                      my ( $in_ref, $out_ref ) = @_;
                      return 0 if length $$out_ref;
  
                      ## pump() clears auto_close_ins, finish() sets it.
                      return $self->{HARNESS}->{auto_close_ins} ? undef : 0
                        if IPC::Run::_empty ${ $self->{SOURCE} }
                        || $self->{SOURCE_EMPTY};
  
                      $$out_ref = $$internal;
                      eval { $$internal = '' }
                        if $self->{HARNESS}->{clear_ins};
  
                      $self->{SOURCE_EMPTY} = $self->{HARNESS}->{auto_close_ins};
  
                      return 1;
                  }
              );
          }
      }
  
      return $self;
  }
  
  =item filename
  
  Gets/sets the filename.  Returns the value after the name change, if
  any.
  
  =cut
  
  sub filename {
      my IPC::Run::IO $self = shift;
      $self->{FILENAME} = shift if @_;
      return $self->{FILENAME};
  }
  
  =item init
  
  Does initialization required before this can be run.  This includes open()ing
  the file, if necessary, and clearing the destination scalar if necessary.
  
  =cut
  
  sub init {
      my IPC::Run::IO $self = shift;
  
      $self->{SOURCE_EMPTY} = 0;
      ${ $self->{DEST} } = ''
        if $self->mode =~ /r/ && ref $self->{DEST} eq 'SCALAR';
  
      $self->open if defined $self->filename;
      $self->{FD} = $self->fileno;
  
      if ( !$self->{FILTERS} ) {
          $self->{FBUFS} = undef;
      }
      else {
          @{ $self->{FBUFS} } = map {
              my $s = "";
              \$s;
          } ( @{ $self->{FILTERS} }, '' );
  
          $self->{FBUFS}->[0] = $self->{DEST}
            if $self->{DEST} && ref $self->{DEST} eq 'SCALAR';
          push @{ $self->{FBUFS} }, $self->{SOURCE};
      }
  
      return undef;
  }
  
  =item open
  
  If a filename was passed in, opens it.  Determines if the handle is open
  via fileno().  Throws an exception on error.
  
  =cut
  
  my %open_flags = (
      '>'  => O_RDONLY,
      '>>' => O_RDONLY,
      '<'  => O_WRONLY | O_CREAT | O_TRUNC,
      '<<' => O_WRONLY | O_CREAT | O_APPEND,
  );
  
  sub open {
      my IPC::Run::IO $self = shift;
  
      croak "IPC::Run::IO: Can't open() a file with no name"
        unless defined $self->{FILENAME};
      $self->{HANDLE} = gensym unless $self->{HANDLE};
  
      _debug "opening '", $self->filename, "' mode '", $self->mode, "'"
        if _debugging_data;
      sysopen(
          $self->{HANDLE},
          $self->filename,
          $open_flags{ $self->op },
      ) or croak "IPC::Run::IO: $! opening '$self->{FILENAME}', mode '" . $self->mode . "'";
  
      return undef;
  }
  
  =item open_pipe
  
  If this is a redirection IO object, this opens the pipe in a platform
  independent manner.
  
  =cut
  
  sub _do_open {
      my $self = shift;
      my ( $child_debug_fd, $parent_handle ) = @_;
  
      if ( $self->dir eq "<" ) {
          ( $self->{TFD}, $self->{FD} ) = IPC::Run::_pipe_nb;
          if ($parent_handle) {
              CORE::open $parent_handle, ">&=$self->{FD}"
                or croak "$! duping write end of pipe for caller";
          }
      }
      else {
          ( $self->{FD}, $self->{TFD} ) = IPC::Run::_pipe;
          if ($parent_handle) {
              CORE::open $parent_handle, "<&=$self->{FD}"
                or croak "$! duping read end of pipe for caller";
          }
      }
  }
  
  sub open_pipe {
      my IPC::Run::IO $self = shift;
  
      ## Hmmm, Maybe allow named pipes one day.  But until then...
      croak "IPC::Run::IO: Can't pipe() when a file name has been set"
        if defined $self->{FILENAME};
  
      $self->_do_open(@_);
  
      ## return ( child_fd, parent_fd )
      return $self->dir eq "<"
        ? ( $self->{TFD}, $self->{FD} )
        : ( $self->{FD}, $self->{TFD} );
  }
  
  sub _cleanup {    ## Called from Run.pm's _cleanup
      my $self = shift;
      undef $self->{FAKE_PIPE};
  }
  
  =item close
  
  Closes the handle.  Throws an exception on failure.
  
  
  =cut
  
  sub close {
      my IPC::Run::IO $self = shift;
  
      if ( defined $self->{HANDLE} ) {
          close $self->{HANDLE}
            or croak(
              "IPC::Run::IO: $! closing "
                . (
                  defined $self->{FILENAME}
                  ? "'$self->{FILENAME}'"
                  : "handle"
                )
            );
      }
      else {
          IPC::Run::_close( $self->{FD} );
      }
  
      $self->{FD} = undef;
  
      return undef;
  }
  
  =item fileno
  
  Returns the fileno of the handle.  Throws an exception on failure.
  
  
  =cut
  
  sub fileno {
      my IPC::Run::IO $self = shift;
  
      my $fd = fileno $self->{HANDLE};
      croak(
          "IPC::Run::IO: $! "
            . (
              defined $self->{FILENAME}
              ? "'$self->{FILENAME}'"
              : "handle"
            )
      ) unless defined $fd;
  
      return $fd;
  }
  
  =item mode
  
  Returns the operator in terms of 'r', 'w', and 'a'.  There is a state
  'ra', unlike Perl's open(), which indicates that data read from the
  handle or file will be appended to the output if the output is a scalar.
  This is only meaningful if the output is a scalar, it has no effect if
  the output is a subroutine.
  
  The redirection operators can be a little confusing, so here's a reference
  table:
  
     >      r      Read from handle in to process
     <      w      Write from process out to handle
     >>     ra     Read from handle in to process, appending it to existing
                   data if the destination is a scalar.
     <<     wa     Write from process out to handle, appending to existing
                   data if IPC::Run::IO opened a named file.
  
  =cut
  
  sub mode {
      my IPC::Run::IO $self = shift;
  
      croak "IPC::Run::IO: unexpected arguments for mode(): @_" if @_;
  
      ## TODO: Optimize this
      return ( $self->{TYPE} =~ /</ ? 'w' : 'r' ) . ( $self->{TYPE} =~ /<<|>>/ ? 'a' : '' );
  }
  
  =item op
  
  Returns the operation: '<', '>', '<<', '>>'.  See L</mode> if you want
  to spell these 'r', 'w', etc.
  
  =cut
  
  sub op {
      my IPC::Run::IO $self = shift;
  
      croak "IPC::Run::IO: unexpected arguments for op(): @_" if @_;
  
      return $self->{TYPE};
  }
  
  =item binmode
  
  Sets/gets whether this pipe is in binmode or not.  No effect off of Win32
  OSs, of course, and on Win32, no effect after the harness is start()ed.
  
  =cut
  
  sub binmode {
      my IPC::Run::IO $self = shift;
  
      $self->{BINMODE} = shift if @_;
  
      return $self->{BINMODE};
  }
  
  =item dir
  
  Returns the first character of $self->op.  This is either "<" or ">".
  
  =cut
  
  sub dir {
      my IPC::Run::IO $self = shift;
  
      croak "IPC::Run::IO: unexpected arguments for dir(): @_" if @_;
  
      return substr $self->{TYPE}, 0, 1;
  }
  
  ##
  ## Filter Scaffolding
  ##
  #my $filter_op ;        ## The op running a filter chain right now
  #my $filter_num;        ## Which filter is being run right now.
  
  use vars (
      '$filter_op',    ## The op running a filter chain right now
      '$filter_num'    ## Which filter is being run right now.
  );
  
  sub _init_filters {
      my IPC::Run::IO $self = shift;
  
      confess "\$self not an IPC::Run::IO" unless UNIVERSAL::isa( $self, "IPC::Run::IO" );
      $self->{FBUFS} = [];
  
      $self->{FBUFS}->[0] = $self->{DEST}
        if $self->{DEST} && ref $self->{DEST} eq 'SCALAR';
  
      return unless $self->{FILTERS} && @{ $self->{FILTERS} };
  
      push @{ $self->{FBUFS} }, map {
          my $s = "";
          \$s;
      } ( @{ $self->{FILTERS} }, '' );
  
      push @{ $self->{FBUFS} }, $self->{SOURCE};
  }
  
  =item poll
  
  TODO: Needs confirmation that this is correct. Was previously undocumented.
  
  I believe this is polling the IO for new input and then returns undef if there will never be any more input, 0 if there is none now, but there might be in the future, and TRUE if more input was gotten.
  
  =cut
  
  sub poll {
      my IPC::Run::IO $self = shift;
      my ($harness) = @_;
  
      if ( defined $self->{FD} ) {
          my $d = $self->dir;
          if ( $d eq "<" ) {
              if ( vec $harness->{WOUT}, $self->{FD}, 1 ) {
                  _debug_desc_fd( "filtering data to", $self )
                    if _debugging_details;
                  return $self->_do_filters($harness);
              }
          }
          elsif ( $d eq ">" ) {
              if ( vec $harness->{ROUT}, $self->{FD}, 1 ) {
                  _debug_desc_fd( "filtering data from", $self )
                    if _debugging_details;
                  return $self->_do_filters($harness);
              }
          }
      }
      return 0;
  }
  
  sub _do_filters {
      my IPC::Run::IO $self = shift;
  
      ( $self->{HARNESS} ) = @_;
  
      my ( $saved_op, $saved_num ) = ( $IPC::Run::filter_op, $IPC::Run::filter_num );
      $IPC::Run::filter_op  = $self;
      $IPC::Run::filter_num = -1;
      my $redos = 0;
      my $r;
      {
          $@ = '';
          $r = eval { IPC::Run::get_more_input(); };
  
          # Detect Resource temporarily unavailable and re-try 200 times (2 seconds),  assuming select behaves (which it doesn't always? need ref)
          if ( ( $@ || '' ) =~ $IPC::Run::_EAGAIN && $redos++ < 200 ) {
              select( undef, undef, undef, 0.01 );
              redo;
          }
      }
      ( $IPC::Run::filter_op, $IPC::Run::filter_num ) = ( $saved_op, $saved_num );
      $self->{HARNESS} = undef;
      die "ack ", $@ if $@;
      return $r;
  }
  
  =back
  
  =head1 AUTHOR
  
  Barrie Slaymaker <barries@slaysys.com>
  
  =head1 TODO
  
  Implement bidirectionality.
  
  =cut
  
  1;
IPC_RUN_IO

    $main::fatpacked{"IPC/Run/Timer.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'IPC_RUN_TIMER';
  package IPC::Run::Timer;
  
  =pod
  
  =head1 NAME
  
  IPC::Run::Timer -- Timer channels for IPC::Run.
  
  =head1 SYNOPSIS
  
     use IPC::Run qw( run  timer timeout );
     ## or IPC::Run::Timer ( timer timeout );
     ## or IPC::Run::Timer ( :all );
  
     ## A non-fatal timer:
     $t = timer( 5 ); # or...
     $t = IO::Run::Timer->new( 5 );
     run $t, ...;
  
     ## A timeout (which is a timer that dies on expiry):
     $t = timeout( 5 ); # or...
     $t = IO::Run::Timer->new( 5, exception => "harness timed out" );
  
  =head1 DESCRIPTION
  
  This class and module allows timers and timeouts to be created for use
  by IPC::Run.  A timer simply expires when it's time is up.  A timeout
  is a timer that throws an exception when it expires.
  
  Timeouts are usually a bit simpler to use  than timers: they throw an
  exception on expiration so you don't need to check them:
  
     ## Give @cmd 10 seconds to get started, then 5 seconds to respond
     my $t = timeout( 10 );
     $h = start(
        \@cmd, \$in, \$out,
        $t,
     );
     pump $h until $out =~ /prompt/;
  
     $in = "some stimulus";
     $out = '';
     $t->time( 5 )
     pump $h until $out =~ /expected response/;
  
  You do need to check timers:
  
     ## Give @cmd 10 seconds to get started, then 5 seconds to respond
     my $t = timer( 10 );
     $h = start(
        \@cmd, \$in, \$out,
        $t,
     );
     pump $h until $t->is_expired || $out =~ /prompt/;
  
     $in = "some stimulus";
     $out = '';
     $t->time( 5 )
     pump $h until $out =~ /expected response/ || $t->is_expired;
  
  Timers and timeouts that are reset get started by start() and
  pump().  Timers change state only in pump().  Since run() and
  finish() both call pump(), they act like pump() with respect to
  timers.
  
  Timers and timeouts have three states: reset, running, and expired.
  Setting the timeout value resets the timer, as does calling
  the reset() method.  The start() method starts (or restarts) a
  timer with the most recently set time value, no matter what state
  it's in.
  
  =head2 Time values
  
  All time values are in seconds.  Times may be any kind of perl number,
  e.g. as integer or floating point seconds, optionally preceded by
  punctuation-separated days, hours, and minutes.
  
  Examples:
  
     1           1 second
     1.1         1.1 seconds
     60          60 seconds
     1:0         1 minute
     1:1         1 minute, 1 second
     1:90        2 minutes, 30 seconds
     1:2:3:4.5   1 day, 2 hours, 3 minutes, 4.5 seconds
     'inf'       the infinity perl special number (the timer never finishes)
  
  Absolute date/time strings are *not* accepted: year, month and
  day-of-month parsing is not available (patches welcome :-).
  
  =head2 Interval fudging
  
  When calculating an end time from a start time and an interval, IPC::Run::Timer
  instances add a little fudge factor.  This is to ensure that no time will
  expire before the interval is up.
  
  First a little background.  Time is sampled in discrete increments.  We'll
  call the
  exact moment that the reported time increments from one interval to the
  next a tick, and the interval between ticks as the time period.  Here's
  a diagram of three ticks and the periods between them:
  
  
      -0-0-0-0-0-0-0-0-0-0-1-1-1-1-1-1-1-1-1-1-2-...
      ^                   ^                   ^
      |<--- period 0 ---->|<--- period 1 ---->|
      |                   |                   |
    tick 0              tick 1              tick 2
  
  To see why the fudge factor is necessary, consider what would happen
  when a timer with an interval of 1 second is started right at the end of
  period 0:
  
  
      -0-0-0-0-0-0-0-0-0-0-1-1-1-1-1-1-1-1-1-1-2-...
      ^                ^  ^                   ^
      |                |  |                   |
      |                |  |                   |
    tick 0             |tick 1              tick 2
                       |
                   start $t
  
  Assuming that check() is called many times per period, then the timer
  is likely to expire just after tick 1, since the time reported will have
  lept from the value '0' to the value '1':
  
      -0-0-0-0-0-0-0-0-0-0-1-1-1-1-1-1-1-1-1-1-2-...
      ^                ^  ^   ^               ^
      |                |  |   |               |
      |                |  |   |               |
    tick 0             |tick 1|             tick 2
                       |      |
                   start $t   |
  		            |
  			check $t
  
  Adding a fudge of '1' in this example means that the timer is guaranteed
  not to expire before tick 2.
  
  The fudge is not added to an interval of '0'.
  
  This means that intervals guarantee a minimum interval.  Given that
  the process running perl may be suspended for some period of time, or that
  it gets busy doing something time-consuming, there are no other guarantees on
  how long it will take a timer to expire.
  
  =head1 SUBCLASSING
  
  INCOMPATIBLE CHANGE: Due to the awkwardness introduced by ripping
  pseudohashes out of Perl, this class I<no longer> uses the fields
  pragma.
  
  =head1 FUNCTIONS & METHODS
  
  =over
  
  =cut
  
  use strict;
  use Carp;
  use Fcntl;
  use Symbol;
  use Exporter;
  use Scalar::Util ();
  use vars qw( $VERSION @ISA @EXPORT_OK %EXPORT_TAGS );
  
  BEGIN {
      $VERSION   = '20180523.0';
      @ISA       = qw( Exporter );
      @EXPORT_OK = qw(
        check
        end_time
        exception
        expire
        interval
        is_expired
        is_reset
        is_running
        name
        reset
        start
        timeout
        timer
      );
  
      %EXPORT_TAGS = ( 'all' => \@EXPORT_OK );
  }
  
  require IPC::Run;
  use IPC::Run::Debug;
  
  ##
  ## Some helpers
  ##
  my $resolution = 1;
  
  sub _parse_time {
      for ( $_[0] ) {
          my $val;
          if ( not defined $_ ) {
              $val = $_;
          }
          else {
              my @f = split( /:/, $_, -1 );
              if ( scalar @f > 4 ) {
                  croak "IPC::Run: expected <= 4 elements in time string '$_'";
              }
              for (@f) {
                  if ( not Scalar::Util::looks_like_number($_) ) {
                      croak "IPC::Run: non-numeric element '$_' in time string '$_'";
                  }
              }
              my ( $s, $m, $h, $d ) = reverse @f;
              $val = ( ( ( $d || 0 ) * 24 + ( $h || 0 ) ) * 60 + ( $m || 0 ) ) * 60 + ( $s || 0 );
          }
          return $val;
      }
  }
  
  sub _calc_end_time {
      my IPC::Run::Timer $self = shift;
      my $interval = $self->interval;
      $interval += $resolution if $interval;
      $self->end_time( $self->start_time + $interval );
  }
  
  =item timer
  
  A constructor function (not method) of IPC::Run::Timer instances:
  
     $t = timer( 5 );
     $t = timer( 5, name => 'stall timer', debug => 1 );
  
     $t = timer;
     $t->interval( 5 );
  
     run ..., $t;
     run ..., $t = timer( 5 );
  
  This convenience function is a shortened spelling of
  
     IPC::Run::Timer->new( ... );
     
  .  It returns a timer in the reset state with a given interval.
  
  If an exception is provided, it will be thrown when the timer notices that
  it has expired (in check()).  The name is for debugging usage, if you plan on
  having multiple timers around.  If no name is provided, a name like "timer #1"
  will be provided.
  
  =cut
  
  sub timer {
      return IPC::Run::Timer->new(@_);
  }
  
  =item timeout
  
  A constructor function (not method) of IPC::Run::Timer instances:
  
     $t = timeout( 5 );
     $t = timeout( 5, exception => "kablooey" );
     $t = timeout( 5, name => "stall", exception => "kablooey" );
  
     $t = timeout;
     $t->interval( 5 );
  
     run ..., $t;
     run ..., $t = timeout( 5 );
  
  A This convenience function is a shortened spelling of 
  
     IPC::Run::Timer->new( exception => "IPC::Run: timeout ...", ... );
     
  .  It returns a timer in the reset state that will throw an
  exception when it expires.
  
  Takes the same parameters as L</timer>, any exception passed in overrides
  the default exception.
  
  =cut
  
  sub timeout {
      my $t = IPC::Run::Timer->new(@_);
      $t->exception( "IPC::Run: timeout on " . $t->name )
        unless defined $t->exception;
      return $t;
  }
  
  =item new
  
     IPC::Run::Timer->new()  ;
     IPC::Run::Timer->new( 5 )  ;
     IPC::Run::Timer->new( 5, exception => 'kablooey' )  ;
  
  Constructor.  See L</timer> for details.
  
  =cut
  
  my $timer_counter;
  
  sub new {
      my $class = shift;
      $class = ref $class || $class;
  
      my IPC::Run::Timer $self = bless {}, $class;
  
      $self->{STATE} = 0;
      $self->{DEBUG} = 0;
      $self->{NAME}  = "timer #" . ++$timer_counter;
  
      while (@_) {
          my $arg = shift;
          if ( $arg eq 'exception' ) {
              $self->exception(shift);
          }
          elsif ( $arg eq 'name' ) {
              $self->name(shift);
          }
          elsif ( $arg eq 'debug' ) {
              $self->debug(shift);
          }
          else {
              $self->interval($arg);
          }
      }
  
      _debug $self->name . ' constructed'
        if $self->{DEBUG} || _debugging_details;
  
      return $self;
  }
  
  =item check
  
     check $t;
     check $t, $now;
     $t->check;
  
  Checks to see if a timer has expired since the last check.  Has no effect
  on non-running timers.  This will throw an exception if one is defined.
  
  IPC::Run::pump() calls this routine for any timers in the harness.
  
  You may pass in a version of now, which is useful in case you have
  it lying around or you want to check several timers with a consistent
  concept of the current time.
  
  Returns the time left before end_time or 0 if end_time is no longer
  in the future or the timer is not running
  (unless, of course, check() expire()s the timer and this
  results in an exception being thrown).
  
  Returns undef if the timer is not running on entry, 0 if check() expires it,
  and the time left if it's left running.
  
  =cut
  
  sub check {
      my IPC::Run::Timer $self = shift;
      return undef if !$self->is_running;
      return 0     if $self->is_expired;
  
      my ($now) = @_;
      $now = _parse_time($now);
      $now = time unless defined $now;
  
      _debug( "checking ", $self->name, " (end time ", $self->end_time, ") at ", $now ) if $self->{DEBUG} || _debugging_details;
  
      my $left = $self->end_time - $now;
      return $left if $left > 0;
  
      $self->expire;
      return 0;
  }
  
  =item debug
  
  Sets/gets the current setting of the debugging flag for this timer.  This
  has no effect if debugging is not enabled for the current harness.
  
  =cut
  
  sub debug {
      my IPC::Run::Timer $self = shift;
      $self->{DEBUG} = shift if @_;
      return $self->{DEBUG};
  }
  
  =item end_time
  
     $et = $t->end_time;
     $et = end_time $t;
  
     $t->end_time( time + 10 );
  
  Returns the time when this timer will or did expire.  Even if this time is
  in the past, the timer may not be expired, since check() may not have been
  called yet.
  
  Note that this end_time is not start_time($t) + interval($t), since some
  small extra amount of time is added to make sure that the timer does not
  expire before interval() elapses.  If this were not so, then 
  
  Changing end_time() while a timer is running will set the expiration time.
  Changing it while it is expired has no affect, since reset()ing a timer always
  clears the end_time().
  
  =cut
  
  sub end_time {
      my IPC::Run::Timer $self = shift;
      if (@_) {
          $self->{END_TIME} = shift;
          _debug $self->name, ' end_time set to ', $self->{END_TIME}
            if $self->{DEBUG} > 2 || _debugging_details;
      }
      return $self->{END_TIME};
  }
  
  =item exception
  
     $x = $t->exception;
     $t->exception( $x );
     $t->exception( undef );
  
  Sets/gets the exception to throw, if any.  'undef' means that no
  exception will be thrown.  Exception does not need to be a scalar: you 
  may ask that references be thrown.
  
  =cut
  
  sub exception {
      my IPC::Run::Timer $self = shift;
      if (@_) {
          $self->{EXCEPTION} = shift;
          _debug $self->name, ' exception set to ', $self->{EXCEPTION}
            if $self->{DEBUG} || _debugging_details;
      }
      return $self->{EXCEPTION};
  }
  
  =item interval
  
     $i = interval $t;
     $i = $t->interval;
     $t->interval( $i );
  
  Sets the interval.  Sets the end time based on the start_time() and the
  interval (and a little fudge) if the timer is running.
  
  =cut
  
  sub interval {
      my IPC::Run::Timer $self = shift;
      if (@_) {
          $self->{INTERVAL} = _parse_time(shift);
          _debug $self->name, ' interval set to ', $self->{INTERVAL}
            if $self->{DEBUG} > 2 || _debugging_details;
  
          $self->_calc_end_time if $self->state;
      }
      return $self->{INTERVAL};
  }
  
  =item expire
  
     expire $t;
     $t->expire;
  
  Sets the state to expired (undef).
  Will throw an exception if one
  is defined and the timer was not already expired.  You can expire a
  reset timer without starting it.
  
  =cut
  
  sub expire {
      my IPC::Run::Timer $self = shift;
      if ( defined $self->state ) {
          _debug $self->name . ' expired'
            if $self->{DEBUG} || _debugging;
  
          $self->state(undef);
          croak $self->exception if $self->exception;
      }
      return undef;
  }
  
  =item is_running
  
  =cut
  
  sub is_running {
      my IPC::Run::Timer $self = shift;
      return $self->state ? 1 : 0;
  }
  
  =item is_reset
  
  =cut
  
  sub is_reset {
      my IPC::Run::Timer $self = shift;
      return defined $self->state && $self->state == 0;
  }
  
  =item is_expired
  
  =cut
  
  sub is_expired {
      my IPC::Run::Timer $self = shift;
      return !defined $self->state;
  }
  
  =item name
  
  Sets/gets this timer's name.  The name is only used for debugging
  purposes so you can tell which freakin' timer is doing what.
  
  =cut
  
  sub name {
      my IPC::Run::Timer $self = shift;
  
      $self->{NAME} = shift if @_;
      return
          defined $self->{NAME}      ? $self->{NAME}
        : defined $self->{EXCEPTION} ? 'timeout'
        :                              'timer';
  }
  
  =item reset
  
     reset $t;
     $t->reset;
  
  Resets the timer to the non-running, non-expired state and clears
  the end_time().
  
  =cut
  
  sub reset {
      my IPC::Run::Timer $self = shift;
      $self->state(0);
      $self->end_time(undef);
      _debug $self->name . ' reset'
        if $self->{DEBUG} || _debugging;
  
      return undef;
  }
  
  =item start
  
     start $t;
     $t->start;
     start $t, $interval;
     start $t, $interval, $now;
  
  Starts or restarts a timer.  This always sets the start_time.  It sets the
  end_time based on the interval if the timer is running or if no end time
  has been set.
  
  You may pass an optional interval or current time value.
  
  Not passing a defined interval causes the previous interval setting to be
  re-used unless the timer is reset and an end_time has been set
  (an exception is thrown if no interval has been set).  
  
  Not passing a defined current time value causes the current time to be used.
  
  Passing a current time value is useful if you happen to have a time value
  lying around or if you want to make sure that several timers are started
  with the same concept of start time.  You might even need to lie to an
  IPC::Run::Timer, occasionally.
  
  =cut
  
  sub start {
      my IPC::Run::Timer $self = shift;
  
      my ( $interval, $now ) = map { _parse_time($_) } @_;
      $now = _parse_time($now);
      $now = time unless defined $now;
  
      $self->interval($interval) if defined $interval;
  
      ## start()ing a running or expired timer clears the end_time, so that the
      ## interval is used.  So does specifying an interval.
      $self->end_time(undef) if !$self->is_reset || $interval;
  
      croak "IPC::Run: no timer interval or end_time defined for " . $self->name
        unless defined $self->interval || defined $self->end_time;
  
      $self->state(1);
      $self->start_time($now);
      ## The "+ 1" is in case the START_TIME was sampled at the end of a
      ## tick (which are one second long in this module).
      $self->_calc_end_time
        unless defined $self->end_time;
  
      _debug(
          $self->name, " started at ", $self->start_time,
          ", with interval ", $self->interval, ", end_time ", $self->end_time
      ) if $self->{DEBUG} || _debugging;
      return undef;
  }
  
  =item start_time
  
  Sets/gets the start time, in seconds since the epoch.  Setting this manually
  is a bad idea, it's better to call L</start>() at the correct time.
  
  =cut
  
  sub start_time {
      my IPC::Run::Timer $self = shift;
      if (@_) {
          $self->{START_TIME} = _parse_time(shift);
          _debug $self->name, ' start_time set to ', $self->{START_TIME}
            if $self->{DEBUG} > 2 || _debugging;
      }
  
      return $self->{START_TIME};
  }
  
  =item state
  
     $s = state $t;
     $t->state( $s );
  
  Get/Set the current state.  Only use this if you really need to transfer the
  state to/from some variable.
  Use L</expire>, L</start>, L</reset>, L</is_expired>, L</is_running>,
  L</is_reset>.
  
  Note:  Setting the state to 'undef' to expire a timer will not throw an
  exception.
  
  =back
  
  =cut
  
  sub state {
      my IPC::Run::Timer $self = shift;
      if (@_) {
          $self->{STATE} = shift;
          _debug $self->name, ' state set to ', $self->{STATE}
            if $self->{DEBUG} > 2 || _debugging;
      }
      return $self->{STATE};
  }
  
  1;
  
  =pod
  
  =head1 TODO
  
  use Time::HiRes; if it's present.
  
  Add detection and parsing of [[[HH:]MM:]SS formatted times and intervals.
  
  =head1 AUTHOR
  
  Barrie Slaymaker <barries@slaysys.com>
  
  =cut
IPC_RUN_TIMER

    $main::fatpacked{"IPC/Run/Win32Helper.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'IPC_RUN_WIN32HELPER';
  package IPC::Run::Win32Helper;
  
  =pod
  
  =head1 NAME
  
  IPC::Run::Win32Helper - helper routines for IPC::Run on Win32 platforms.
  
  =head1 SYNOPSIS
  
      use IPC::Run::Win32Helper;   # Exports all by default
  
  =head1 DESCRIPTION
  
  IPC::Run needs to use sockets to redirect subprocess I/O so that the select() loop
  will work on Win32. This seems to only work on WinNT and Win2K at this time, not
  sure if it will ever work on Win95 or Win98. If you have experience in this area, please
  contact me at barries@slaysys.com, thanks!.
  
  =cut
  
  use strict;
  use Carp;
  use IO::Handle;
  use vars qw{ $VERSION @ISA @EXPORT };
  
  BEGIN {
      $VERSION = '20180523.0';
      @ISA     = qw( Exporter );
      @EXPORT  = qw(
        win32_spawn
        win32_parse_cmd_line
        _dont_inherit
        _inherit
      );
  }
  
  require POSIX;
  
  use Text::ParseWords;
  use Win32::Process;
  use IPC::Run::Debug;
  use Win32API::File qw(
    FdGetOsFHandle
    SetHandleInformation
    HANDLE_FLAG_INHERIT
    INVALID_HANDLE_VALUE
  );
  
  ## Takes an fd or a GLOB ref, never never never a Win32 handle.
  sub _dont_inherit {
      for (@_) {
          next unless defined $_;
          my $fd = $_;
          $fd = fileno $fd if ref $fd;
          _debug "disabling inheritance of ", $fd if _debugging_details;
          my $osfh = FdGetOsFHandle $fd;
          croak $^E if !defined $osfh || $osfh == INVALID_HANDLE_VALUE;
  
          SetHandleInformation( $osfh, HANDLE_FLAG_INHERIT, 0 );
      }
  }
  
  sub _inherit {    #### REMOVE
      for (@_) {    #### REMOVE
          next unless defined $_;    #### REMOVE
          my $fd = $_;               #### REMOVE
          $fd = fileno $fd if ref $fd;    #### REMOVE
          _debug "enabling inheritance of ", $fd if _debugging_details;    #### REMOVE
          my $osfh = FdGetOsFHandle $fd;                                   #### REMOVE
          croak $^E if !defined $osfh || $osfh == INVALID_HANDLE_VALUE;    #### REMOVE
          #### REMOVE
          SetHandleInformation( $osfh, HANDLE_FLAG_INHERIT, 1 );           #### REMOVE
      }    #### REMOVE
  }    #### REMOVE
  #### REMOVE
  #sub _inherit {
  #   for ( @_ ) {
  #      next unless defined $_;
  #      my $osfh = GetOsFHandle $_;
  #      croak $^E if ! defined $osfh || $osfh == INVALID_HANDLE_VALUE;
  #      SetHandleInformation( $osfh, HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT );
  #   }
  #}
  
  =pod
  
  =head1 FUNCTIONS
  
  =over
  
  =item optimize()
  
  Most common incantations of C<run()> (I<not> C<harness()>, C<start()>,
  or C<finish()>) now use temporary files to redirect input and output
  instead of pumper processes.
  
  Temporary files are used when sending to child processes if input is
  taken from a scalar with no filter subroutines.  This is the only time
  we can assume that the parent is not interacting with the child's
  redirected input as it runs.
  
  Temporary files are used when receiving from children when output is
  to a scalar or subroutine with or without filters, but only if
  the child in question closes its inputs or takes input from 
  unfiltered SCALARs or named files.  Normally, a child inherits its STDIN
  from its parent; to close it, use "0<&-" or the C<< noinherit => 1 >> option.
  If data is sent to the child from CODE refs, filehandles or from
  scalars through filters than the child's outputs will not be optimized
  because C<optimize()> assumes the parent is interacting with the child.
  It is ok if the output is filtered or handled by a subroutine, however.
  
  This assumes that all named files are real files (as opposed to named
  pipes) and won't change; and that a process is not communicating with
  the child indirectly (through means not visible to IPC::Run).
  These can be an invalid assumptions, but are the 99% case.
  Write me if you need an option to enable or disable optimizations; I
  suspect it will work like the C<binary()> modifier.
  
  To detect cases that you might want to optimize by closing inputs, try
  setting the C<IPCRUNDEBUG> environment variable to the special C<notopt>
  value:
  
     C:> set IPCRUNDEBUG=notopt
     C:> my_app_that_uses_IPC_Run.pl
  
  =item optimizer() rationalizations
  
  Only for that limited case can we be sure that it's ok to batch all the
  input in to a temporary file.  If STDIN is from a SCALAR or from a named
  file or filehandle (again, only in C<run()>), then outputs to CODE refs
  are also assumed to be safe enough to batch through a temp file,
  otherwise only outputs to SCALAR refs are batched.  This can cause a bit
  of grief if the parent process benefits from or relies on a bit of
  "early returns" coming in before the child program exits.  As long as
  the output is redirected to a SCALAR ref, this will not be visible.
  When output is redirected to a subroutine or (deprecated) filters, the
  subroutine will not get any data until after the child process exits,
  and it is likely to get bigger chunks of data at once.
  
  The reason for the optimization is that, without it, "pumper" processes
  are used to overcome the inconsistencies of the Win32 API.  We need to
  use anonymous pipes to connect to the child processes' stdin, stdout,
  and stderr, yet select() does not work on these.  select() only works on
  sockets on Win32.  So for each redirected child handle, there is
  normally a "pumper" process that connects to the parent using a
  socket--so the parent can select() on that fd--and to the child on an
  anonymous pipe--so the child can read/write a pipe.
  
  Using a socket to connect directly to the child (as at least one MSDN
  article suggests) seems to cause the trailing output from most children
  to be lost.  I think this is because child processes rarely close their
  stdout and stderr explicitly, and the winsock dll does not seem to flush
  output when a process that uses it exits without explicitly closing
  them.
  
  Because of these pumpers and the inherent slowness of Win32
  CreateProcess(), child processes with redirects are quite slow to
  launch; so this routine looks for the very common case of
  reading/writing to/from scalar references in a run() routine and
  converts such reads and writes in to temporary file reads and writes.
  
  Such files are marked as FILE_ATTRIBUTE_TEMPORARY to increase speed and
  as FILE_FLAG_DELETE_ON_CLOSE so it will be cleaned up when the child
  process exits (for input files).  The user's default permissions are
  used for both the temporary files and the directory that contains them,
  hope your Win32 permissions are secure enough for you.  Files are
  created with the Win32API::File defaults of
  FILE_SHARE_READ|FILE_SHARE_WRITE.
  
  Setting the debug level to "details" or "gory" will give detailed
  information about the optimization process; setting it to "basic" or
  higher will tell whether or not a given call is optimized.  Setting
  it to "notopt" will highlight those calls that aren't optimized.
  
  =cut
  
  sub optimize {
      my ($h) = @_;
  
      my @kids = @{ $h->{KIDS} };
  
      my $saw_pipe;
  
      my ( $ok_to_optimize_outputs, $veto_output_optimization );
  
      for my $kid (@kids) {
          ( $ok_to_optimize_outputs, $veto_output_optimization ) = ()
            unless $saw_pipe;
  
          _debug "Win32 optimizer: (kid $kid->{NUM}) STDIN piped, carrying over ok of non-SCALAR output optimization"
            if _debugging_details && $ok_to_optimize_outputs;
          _debug "Win32 optimizer: (kid $kid->{NUM}) STDIN piped, carrying over veto of non-SCALAR output optimization"
            if _debugging_details && $veto_output_optimization;
  
          if ( $h->{noinherit} && !$ok_to_optimize_outputs ) {
              _debug "Win32 optimizer: (kid $kid->{NUM}) STDIN not inherited from parent oking non-SCALAR output optimization"
                if _debugging_details && $ok_to_optimize_outputs;
              $ok_to_optimize_outputs = 1;
          }
  
          for ( @{ $kid->{OPS} } ) {
              if ( substr( $_->{TYPE}, 0, 1 ) eq "<" ) {
                  if ( $_->{TYPE} eq "<" ) {
                      if ( @{ $_->{FILTERS} } > 1 ) {
                          ## Can't assume that the filters are idempotent.
                      }
                      elsif (ref $_->{SOURCE} eq "SCALAR"
                          || ref $_->{SOURCE} eq "GLOB"
                          || UNIVERSAL::isa( $_, "IO::Handle" ) ) {
                          if ( $_->{KFD} == 0 ) {
                              _debug
                                "Win32 optimizer: (kid $kid->{NUM}) 0$_->{TYPE}",
                                ref $_->{SOURCE},
                                ", ok to optimize outputs"
                                if _debugging_details;
                              $ok_to_optimize_outputs = 1;
                          }
                          $_->{SEND_THROUGH_TEMP_FILE} = 1;
                          next;
                      }
                      elsif ( !ref $_->{SOURCE} && defined $_->{SOURCE} ) {
                          if ( $_->{KFD} == 0 ) {
                              _debug
                                "Win32 optimizer: (kid $kid->{NUM}) 0<$_->{SOURCE}, ok to optimize outputs",
                                if _debugging_details;
                              $ok_to_optimize_outputs = 1;
                          }
                          next;
                      }
                  }
                  _debug
                    "Win32 optimizer: (kid $kid->{NUM}) ",
                    $_->{KFD},
                    $_->{TYPE},
                    defined $_->{SOURCE}
                    ? ref $_->{SOURCE}
                        ? ref $_->{SOURCE}
                        : $_->{SOURCE}
                    : defined $_->{FILENAME} ? $_->{FILENAME}
                    : "",
                    @{ $_->{FILTERS} } > 1 ? " with filters" : (),
                    ", VETOING output opt."
                    if _debugging_details || _debugging_not_optimized;
                  $veto_output_optimization = 1;
              }
              elsif ( $_->{TYPE} eq "close" && $_->{KFD} == 0 ) {
                  $ok_to_optimize_outputs = 1;
                  _debug "Win32 optimizer: (kid $kid->{NUM}) saw 0<&-, ok to optimize outputs"
                    if _debugging_details;
              }
              elsif ( $_->{TYPE} eq "dup" && $_->{KFD2} == 0 ) {
                  $veto_output_optimization = 1;
                  _debug "Win32 optimizer: (kid $kid->{NUM}) saw 0<&$_->{KFD2}, VETOING output opt."
                    if _debugging_details || _debugging_not_optimized;
              }
              elsif ( $_->{TYPE} eq "|" ) {
                  $saw_pipe = 1;
              }
          }
  
          if ( !$ok_to_optimize_outputs && !$veto_output_optimization ) {
              _debug "Win32 optimizer: (kid $kid->{NUM}) child STDIN not redirected, VETOING non-SCALAR output opt."
                if _debugging_details || _debugging_not_optimized;
              $veto_output_optimization = 1;
          }
  
          if ( $ok_to_optimize_outputs && $veto_output_optimization ) {
              $ok_to_optimize_outputs = 0;
              _debug "Win32 optimizer: (kid $kid->{NUM}) non-SCALAR output optimizations VETOed"
                if _debugging_details || _debugging_not_optimized;
          }
  
          ## SOURCE/DEST ARRAY means it's a filter.
          ## TODO: think about checking to see if the final input/output of
          ## a filter chain (an ARRAY SOURCE or DEST) is a scalar...but
          ## we may be deprecating filters.
  
          for ( @{ $kid->{OPS} } ) {
              if ( $_->{TYPE} eq ">" ) {
                  if (
                      ref $_->{DEST} eq "SCALAR"
                      || (
                          (
                                 @{ $_->{FILTERS} } > 1
                              || ref $_->{DEST} eq "CODE"
                              || ref $_->{DEST} eq "ARRAY"    ## Filters?
                          )
                          && ( $ok_to_optimize_outputs && !$veto_output_optimization )
                      )
                    ) {
                      $_->{RECV_THROUGH_TEMP_FILE} = 1;
                      next;
                  }
                  _debug
                    "Win32 optimizer: NOT optimizing (kid $kid->{NUM}) ",
                    $_->{KFD},
                    $_->{TYPE},
                    defined $_->{DEST}
                    ? ref $_->{DEST}
                        ? ref $_->{DEST}
                        : $_->{SOURCE}
                    : defined $_->{FILENAME} ? $_->{FILENAME}
                    : "",
                    @{ $_->{FILTERS} } ? " with filters" : (),
                    if _debugging_details;
              }
          }
      }
  
  }
  
  =pod
  
  =item win32_parse_cmd_line
  
     @words = win32_parse_cmd_line( q{foo bar 'baz baz' "bat bat"} );
  
  returns 4 words. This parses like the bourne shell (see
  the bit about shellwords() in L<Text::ParseWords>), assuming we're
  trying to be a little cross-platform here.  The only difference is
  that "\" is *not* treated as an escape except when it precedes 
  punctuation, since it's used all over the place in DOS path specs.
  
  TODO: globbing? probably not (it's unDOSish).
  
  TODO: shebang emulation? Probably, but perhaps that should be part
  of Run.pm so all spawned processes get the benefit.
  
  LIMITATIONS: shellwords dies silently on malformed input like 
  
     a\"
  
  =cut
  
  sub win32_parse_cmd_line {
      my $line = shift;
      $line =~ s{(\\[\w\s])}{\\$1}g;
      return shellwords $line;
  }
  
  =pod
  
  =item win32_spawn
  
  Spawns a child process, possibly with STDIN, STDOUT, and STDERR (file descriptors 0, 1, and 2, respectively) redirected.
  
  B<LIMITATIONS>.
  
  Cannot redirect higher file descriptors due to lack of support for this in the
  Win32 environment.
  
  This can be worked around by marking a handle as inheritable in the
  parent (or leaving it marked; this is the default in perl), obtaining it's
  Win32 handle with C<Win32API::GetOSFHandle(FH)> or
  C<Win32API::FdGetOsFHandle($fd)> and passing it to the child using the command
  line, the environment, or any other IPC mechanism (it's a plain old integer).
  The child can then use C<OsFHandleOpen()> or C<OsFHandleOpenFd()> and possibly
  C<<open FOO ">&BAR">> or C<<open FOO ">&$fd>> as need be.  Ach, the pain!
  
  Remember to check the Win32 handle against INVALID_HANDLE_VALUE.
  
  =cut
  
  sub _save {
      my ( $saved, $saved_as, $fd ) = @_;
  
      ## We can only save aside the original fds once.
      return if exists $saved->{$fd};
  
      my $saved_fd = IPC::Run::_dup($fd);
      _dont_inherit $saved_fd;
  
      $saved->{$fd}          = $saved_fd;
      $saved_as->{$saved_fd} = $fd;
  
      _dont_inherit $saved->{$fd};
  }
  
  sub _dup2_gently {
      my ( $saved, $saved_as, $fd1, $fd2 ) = @_;
      _save $saved, $saved_as, $fd2;
  
      if ( exists $saved_as->{$fd2} ) {
          ## The target fd is colliding with a saved-as fd, gotta bump
          ## the saved-as fd to another fd.
          my $orig_fd  = delete $saved_as->{$fd2};
          my $saved_fd = IPC::Run::_dup($fd2);
          _dont_inherit $saved_fd;
  
          $saved->{$orig_fd}     = $saved_fd;
          $saved_as->{$saved_fd} = $orig_fd;
      }
      _debug "moving $fd1 to kid's $fd2" if _debugging_details;
      IPC::Run::_dup2_rudely( $fd1, $fd2 );
  }
  
  sub win32_spawn {
      my ( $cmd, $ops ) = @_;
  
      ## NOTE: The debug pipe write handle is passed to pump processes as STDOUT.
      ## and is not to the "real" child process, since they would not know
      ## what to do with it...unlike Unix, we have no code executing in the
      ## child before the "real" child is exec()ed.
  
      my %saved;       ## Map of parent's orig fd -> saved fd
      my %saved_as;    ## Map of parent's saved fd -> orig fd, used to
      ## detect collisions between a KFD and the fd a
      ## parent's fd happened to be saved to.
  
      for my $op (@$ops) {
          _dont_inherit $op->{FD} if defined $op->{FD};
  
          if ( defined $op->{KFD} && $op->{KFD} > 2 ) {
              ## TODO: Detect this in harness()
              ## TODO: enable temporary redirections if ever necessary, not
              ## sure why they would be...
              ## 4>&1 1>/dev/null 1>&4 4>&-
              croak "Can't redirect fd #", $op->{KFD}, " on Win32";
          }
  
          ## This is very similar logic to IPC::Run::_do_kid_and_exit().
          if ( defined $op->{TFD} ) {
              unless ( $op->{TFD} == $op->{KFD} ) {
                  _dup2_gently \%saved, \%saved_as, $op->{TFD}, $op->{KFD};
                  _dont_inherit $op->{TFD};
              }
          }
          elsif ( $op->{TYPE} eq "dup" ) {
              _dup2_gently \%saved, \%saved_as, $op->{KFD1}, $op->{KFD2}
                unless $op->{KFD1} == $op->{KFD2};
          }
          elsif ( $op->{TYPE} eq "close" ) {
              _save \%saved, \%saved_as, $op->{KFD};
              IPC::Run::_close( $op->{KFD} );
          }
          elsif ( $op->{TYPE} eq "init" ) {
              ## TODO: detect this in harness()
              croak "init subs not allowed on Win32";
          }
      }
  
      my $process;
      my $cmd_line = join " ", map {
          ( my $s = $_ ) =~ s/"/"""/g;
          $s = qq{"$s"} if /[\"\s]|^$/;
          $s;
      } @$cmd;
  
      _debug "cmd line: ", $cmd_line
        if _debugging;
  
      Win32::Process::Create(
          $process,
          $cmd->[0],
          $cmd_line,
          1,    ## Inherit handles
          0,    ## Inherit parent priortiy class. Was NORMAL_PRIORITY_CLASS
          ".",
      ) or croak "$!: Win32::Process::Create()";
  
      for my $orig_fd ( keys %saved ) {
          IPC::Run::_dup2_rudely( $saved{$orig_fd}, $orig_fd );
          IPC::Run::_close( $saved{$orig_fd} );
      }
  
      return ( $process->GetProcessID(), $process );
  }
  
  1;
  
  =pod
  
  =back
  
  =head1 AUTHOR
  
  Barries Slaymaker <barries@slaysys.com>.  Funded by Perforce Software, Inc.
  
  =head1 COPYRIGHT
  
  Copyright 2001, Barrie Slaymaker, All Rights Reserved.
  
  You may use this under the terms of either the GPL 2.0 or the Artistic License.
  
  =cut
IPC_RUN_WIN32HELPER

    $main::fatpacked{"IPC/Run/Win32IO.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'IPC_RUN_WIN32IO';
  package IPC::Run::Win32IO;
  
  =pod
  
  =head1 NAME
  
  IPC::Run::Win32IO - helper routines for IPC::Run on Win32 platforms.
  
  =head1 SYNOPSIS
  
      use IPC::Run::Win32IO;   # Exports all by default
  
  =head1 DESCRIPTION
  
  IPC::Run needs to use sockets to redirect subprocess I/O so that the select()
  loop will work on Win32. This seems to only work on WinNT and Win2K at this
  time, not sure if it will ever work on Win95 or Win98. If you have experience
  in this area, please contact me at barries@slaysys.com, thanks!.
  
  =head1 DESCRIPTION
  
  A specialized IO class used on Win32.
  
  =cut
  
  use strict;
  use Carp;
  use IO::Handle;
  use Socket;
  require POSIX;
  
  use vars qw{$VERSION};
  
  BEGIN {
      $VERSION = '20180523.0';
  }
  
  use Socket qw( IPPROTO_TCP TCP_NODELAY );
  use Symbol;
  use Text::ParseWords;
  use Win32::Process;
  use IPC::Run::Debug qw( :default _debugging_level );
  use IPC::Run::Win32Helper qw( _inherit _dont_inherit );
  use Fcntl qw( O_TEXT O_RDONLY );
  
  use base qw( IPC::Run::IO );
  my @cleanup_fields;
  
  BEGIN {
      ## These fields will be set to undef in _cleanup to close
      ## the handles.
      @cleanup_fields = (
          'SEND_THROUGH_TEMP_FILE',    ## Set by WinHelper::optimize()
          'RECV_THROUGH_TEMP_FILE',    ## Set by WinHelper::optimize()
          'TEMP_FILE_NAME',            ## The name of the temp file, needed for
          ## error reporting / debugging only.
  
          'PARENT_HANDLE',             ## The handle of the socket for the parent
          'PUMP_SOCKET_HANDLE',        ## The socket handle for the pump
          'PUMP_PIPE_HANDLE',          ## The anon pipe handle for the pump
          'CHILD_HANDLE',              ## The anon pipe handle for the child
  
          'TEMP_FILE_HANDLE',          ## The Win32 filehandle for the temp file
      );
  }
  
  ## REMOVE OSFHandleOpen
  use Win32API::File qw(
    GetOsFHandle
    OsFHandleOpenFd
    OsFHandleOpen
    FdGetOsFHandle
    SetHandleInformation
    SetFilePointer
    HANDLE_FLAG_INHERIT
    INVALID_HANDLE_VALUE
  
    createFile
    WriteFile
    ReadFile
    CloseHandle
  
    FILE_ATTRIBUTE_TEMPORARY
    FILE_FLAG_DELETE_ON_CLOSE
    FILE_FLAG_WRITE_THROUGH
  
    FILE_BEGIN
  );
  
  #   FILE_ATTRIBUTE_HIDDEN
  #   FILE_ATTRIBUTE_SYSTEM
  
  BEGIN {
      ## Force AUTOLOADED constants to be, well, constant by getting them
      ## to AUTOLOAD before compilation continues.  Sigh.
      () = (
          SOL_SOCKET,
          SO_REUSEADDR,
          IPPROTO_TCP,
          TCP_NODELAY,
          HANDLE_FLAG_INHERIT,
          INVALID_HANDLE_VALUE,
      );
  }
  
  use constant temp_file_flags => ( FILE_ATTRIBUTE_TEMPORARY() | FILE_FLAG_DELETE_ON_CLOSE() | FILE_FLAG_WRITE_THROUGH() );
  
  #   FILE_ATTRIBUTE_HIDDEN()    |
  #   FILE_ATTRIBUTE_SYSTEM()    |
  my $tmp_file_counter;
  my $tmp_dir;
  
  sub _cleanup {
      my IPC::Run::Win32IO $self = shift;
      my ($harness) = @_;
  
      $self->_recv_through_temp_file($harness)
        if $self->{RECV_THROUGH_TEMP_FILE};
  
      CloseHandle( $self->{TEMP_FILE_HANDLE} )
        if defined $self->{TEMP_FILE_HANDLE};
  
      close( $self->{CHILD_HANDLE} )
        if defined $self->{CHILD_HANDLE};
  
      $self->{$_} = undef for @cleanup_fields;
  }
  
  sub _create_temp_file {
      my IPC::Run::Win32IO $self = shift;
  
      ## Create a hidden temp file that Win32 will delete when we close
      ## it.
      unless ( defined $tmp_dir ) {
          $tmp_dir = File::Spec->catdir( File::Spec->tmpdir, "IPC-Run.tmp" );
  
          ## Trust in the user's umask.
          ## This could possibly be a security hole, perhaps
          ## we should offer an option.  Hmmmm, really, people coding
          ## security conscious apps should audit this code and
          ## tell me how to make it better.  Nice cop-out :).
          unless ( -d $tmp_dir ) {
              mkdir $tmp_dir or croak "$!: $tmp_dir";
          }
      }
  
      $self->{TEMP_FILE_NAME} = File::Spec->catfile(
          ## File name is designed for easy sorting and not conflicting
          ## with other processes.  This should allow us to use "t"runcate
          ## access in CreateFile in case something left some droppings
          ## around (which should never happen because we specify
          ## FLAG_DELETE_ON_CLOSE.
          ## heh, belt and suspenders are better than bug reports; God forbid
          ## that NT should ever crash before a temp file gets deleted!
          $tmp_dir, sprintf "Win32io-%06d-%08d", $$, $tmp_file_counter++
      );
  
      $self->{TEMP_FILE_HANDLE} = createFile(
          $self->{TEMP_FILE_NAME},
          "trw",    ## new, truncate, read, write
          {
              Flags => temp_file_flags,
          },
      ) or croak "Can't create temporary file, $self->{TEMP_FILE_NAME}: $^E";
  
      $self->{TFD} = OsFHandleOpenFd $self->{TEMP_FILE_HANDLE}, 0;
      $self->{FD} = undef;
  
      _debug
        "Win32 Optimizer: temp file (",
        $self->{KFD},
        $self->{TYPE},
        $self->{TFD},
        ", fh ",
        $self->{TEMP_FILE_HANDLE},
        "): ",
        $self->{TEMP_FILE_NAME}
        if _debugging_details;
  }
  
  sub _reset_temp_file_pointer {
      my $self = shift;
      SetFilePointer( $self->{TEMP_FILE_HANDLE}, 0, 0, FILE_BEGIN )
        or confess "$^E seeking on (fd $self->{TFD}) $self->{TEMP_FILE_NAME} for kid's fd $self->{KFD}";
  }
  
  sub _send_through_temp_file {
      my IPC::Run::Win32IO $self = shift;
  
      _debug "Win32 optimizer: optimizing " . " $self->{KFD} $self->{TYPE} temp file instead of ",
        ref $self->{SOURCE} || $self->{SOURCE}
        if _debugging_details;
  
      $self->_create_temp_file;
  
      if ( defined ${ $self->{SOURCE} } ) {
          my $bytes_written = 0;
          my $data_ref;
          if ( $self->binmode ) {
              $data_ref = $self->{SOURCE};
          }
          else {
              my $data = ${ $self->{SOURCE} };    # Ugh, a copy.
              $data =~ s/(?<!\r)\n/\r\n/g;
              $data_ref = \$data;
          }
  
          WriteFile(
              $self->{TEMP_FILE_HANDLE},
              $$data_ref,
              0,                                  ## Write entire buffer
              $bytes_written,
              [],                                 ## Not overlapped.
          ) or croak "$^E writing $self->{TEMP_FILE_NAME} for kid to read on fd $self->{KFD}";
          _debug "Win32 optimizer: wrote $bytes_written to temp file $self->{TEMP_FILE_NAME}"
            if _debugging_data;
  
          $self->_reset_temp_file_pointer;
  
      }
  
      _debug "Win32 optimizer: kid to read $self->{KFD} from temp file on $self->{TFD}"
        if _debugging_details;
  }
  
  sub _init_recv_through_temp_file {
      my IPC::Run::Win32IO $self = shift;
  
      $self->_create_temp_file;
  }
  
  ## TODO: Use the Win32 API in the select loop to see if the file has grown
  ## and read it incrementally if it has.
  sub _recv_through_temp_file {
      my IPC::Run::Win32IO $self = shift;
  
      ## This next line kicks in if the run() never got to initting things
      ## and needs to clean up.
      return undef unless defined $self->{TEMP_FILE_HANDLE};
  
      push @{ $self->{FILTERS} }, sub {
          my ( undef, $out_ref ) = @_;
  
          return undef unless defined $self->{TEMP_FILE_HANDLE};
  
          my $r;
          my $s;
          ReadFile(
              $self->{TEMP_FILE_HANDLE},
              $s,
              999_999,    ## Hmmm, should read the size.
              $r,
              []
          ) or croak "$^E reading from $self->{TEMP_FILE_NAME}";
  
          _debug "ReadFile( $self->{TFD} ) = $r chars '$s'" if _debugging_data;
  
          return undef unless $r;
  
          $s =~ s/\r\n/\n/g unless $self->binmode;
  
          my $pos = pos $$out_ref;
          $$out_ref .= $s;
          pos($out_ref) = $pos;
          return 1;
      };
  
      my ($harness) = @_;
  
      $self->_reset_temp_file_pointer;
  
      1 while $self->_do_filters($harness);
  
      pop @{ $self->{FILTERS} };
  
      IPC::Run::_close( $self->{TFD} );
  }
  
  =head1 SUBROUTINES
  
  =over
  
  =item poll
  
  Windows version of IPC::Run::IP::poll.
  
  =back
  
  =cut
  
  sub poll {
      my IPC::Run::Win32IO $self = shift;
  
      return if $self->{SEND_THROUGH_TEMP_FILE} || $self->{RECV_THROUGH_TEMP_FILE};
  
      return $self->SUPER::poll(@_);
  }
  
  ## When threaded Perls get good enough, we should use threads here.
  ## The problem with threaded perls is that they dup() all sorts of
  ## filehandles and fds and don't allow sufficient control over
  ## closing off the ones we don't want.
  
  sub _spawn_pumper {
      my ( $stdin, $stdout, $debug_fd, $binmode, $child_label, @opts ) = @_;
      my ( $stdin_fd, $stdout_fd ) = ( fileno $stdin, fileno $stdout );
  
      _debug "pumper stdin = ",  $stdin_fd  if _debugging_details;
      _debug "pumper stdout = ", $stdout_fd if _debugging_details;
      _inherit $stdin_fd, $stdout_fd, $debug_fd;
      my @I_options = map qq{"-I$_"}, @INC;
  
      my $cmd_line = join(
          " ",
          qq{"$^X"},
          @I_options,
          qw(-MIPC::Run::Win32Pump -e 1 ),
  ## I'm using this clunky way of passing filehandles to the child process
  ## in order to avoid some kind of premature closure of filehandles
  ## problem I was having with VCP's test suite when passing them
  ## via CreateProcess.  All of the ## REMOVE code is stuff I'd like
  ## to be rid of and the ## ADD code is what I'd like to use.
          FdGetOsFHandle($stdin_fd),     ## REMOVE
          FdGetOsFHandle($stdout_fd),    ## REMOVE
          FdGetOsFHandle($debug_fd),     ## REMOVE
          $binmode ? 1 : 0,
          $$, $^T, _debugging_level, qq{"$child_label"},
          @opts
      );
  
      #   open SAVEIN,  "<&STDIN"  or croak "$! saving STDIN";       #### ADD
      #   open SAVEOUT, ">&STDOUT" or croak "$! saving STDOUT";       #### ADD
      #   open SAVEERR, ">&STDERR" or croak "$! saving STDERR";       #### ADD
      #   _dont_inherit \*SAVEIN;       #### ADD
      #   _dont_inherit \*SAVEOUT;       #### ADD
      #   _dont_inherit \*SAVEERR;       #### ADD
      #   open STDIN,  "<&$stdin_fd"  or croak "$! dup2()ing $stdin_fd (pumper's STDIN)";       #### ADD
      #   open STDOUT, ">&$stdout_fd" or croak "$! dup2()ing $stdout_fd (pumper's STDOUT)";       #### ADD
      #   open STDERR, ">&$debug_fd" or croak "$! dup2()ing $debug_fd (pumper's STDERR/debug_fd)";       #### ADD
  
      _debug "pump cmd line: ", $cmd_line if _debugging_details;
  
      my $process;
      Win32::Process::Create(
          $process,
          $^X,
          $cmd_line,
          1,    ## Inherit handles
          NORMAL_PRIORITY_CLASS,
          ".",
      ) or croak "$!: Win32::Process::Create()";
  
      #   open STDIN,  "<&SAVEIN"  or croak "$! restoring STDIN";       #### ADD
      #   open STDOUT, ">&SAVEOUT" or croak "$! restoring STDOUT";       #### ADD
      #   open STDERR, ">&SAVEERR" or croak "$! restoring STDERR";       #### ADD
      #   close SAVEIN             or croak "$! closing SAVEIN";       #### ADD
      #   close SAVEOUT            or croak "$! closing SAVEOUT";       #### ADD
      #   close SAVEERR            or croak "$! closing SAVEERR";       #### ADD
  
      close $stdin  or croak "$! closing pumper's stdin in parent";
      close $stdout or croak "$! closing pumper's stdout in parent";
  
      # Don't close $debug_fd, we need it, as do other pumpers.
  
      # Pause a moment to allow the child to get up and running and emit
      # debug messages.  This does not always work.
      #   select undef, undef, undef, 1 if _debugging_details;
  
      _debug "_spawn_pumper pid = ", $process->GetProcessID
        if _debugging_data;
  }
  
  my $loopback  = inet_aton "127.0.0.1";
  my $tcp_proto = getprotobyname('tcp');
  croak "$!: getprotobyname('tcp')" unless defined $tcp_proto;
  
  sub _socket {
      my ($server) = @_;
      $server ||= gensym;
      my $client = gensym;
  
      my $listener = gensym;
      socket $listener, PF_INET, SOCK_STREAM, $tcp_proto
        or croak "$!: socket()";
      setsockopt $listener, SOL_SOCKET, SO_REUSEADDR, pack( "l", 0 )
        or croak "$!: setsockopt()";
  
      unless ( bind $listener, sockaddr_in( 0, $loopback ) ) {
          croak "Error binding: $!";
      }
  
      my ($port) = sockaddr_in( getsockname($listener) );
  
      _debug "win32 port = $port" if _debugging_details;
  
      listen $listener, my $queue_size = 1
        or croak "$!: listen()";
  
      {
          socket $client, PF_INET, SOCK_STREAM, $tcp_proto
            or croak "$!: socket()";
  
          my $paddr = sockaddr_in( $port, $loopback );
  
          connect $client, $paddr
            or croak "$!: connect()";
  
          croak "$!: accept" unless defined $paddr;
  
          ## The windows "default" is SO_DONTLINGER, which should make
          ## sure all socket data goes through.  I have my doubts based
          ## on experimentation, but nothing prompts me to set SO_LINGER
          ## at this time...
          setsockopt $client, IPPROTO_TCP, TCP_NODELAY, pack( "l", 0 )
            or croak "$!: setsockopt()";
      }
  
      {
          _debug "accept()ing on port $port" if _debugging_details;
          my $paddr = accept( $server, $listener );
          croak "$!: accept()" unless defined $paddr;
      }
  
      _debug "win32 _socket = ( ", fileno $server, ", ", fileno $client, " ) on port $port"
        if _debugging_details;
      return ( $server, $client );
  }
  
  sub _open_socket_pipe {
      my IPC::Run::Win32IO $self = shift;
      my ( $debug_fd, $parent_handle ) = @_;
  
      my $is_send_to_child = $self->dir eq "<";
  
      $self->{CHILD_HANDLE}     = gensym;
      $self->{PUMP_PIPE_HANDLE} = gensym;
  
      (
          $self->{PARENT_HANDLE},
          $self->{PUMP_SOCKET_HANDLE}
      ) = _socket $parent_handle;
  
      ## These binmodes seem to have no effect on Win2K, but just to be safe
      ## I do them.
      binmode $self->{PARENT_HANDLE}      or die $!;
      binmode $self->{PUMP_SOCKET_HANDLE} or die $!;
  
      _debug "PUMP_SOCKET_HANDLE = ", fileno $self->{PUMP_SOCKET_HANDLE}
        if _debugging_details;
  ##my $buf;
  ##$buf = "write on child end of " . fileno( $self->{WRITE_HANDLE} ) . "\n\n\n\n\n";
  ##POSIX::write(fileno $self->{WRITE_HANDLE}, $buf, length $buf) or warn "$! in syswrite";
  ##$buf = "write on parent end of " . fileno( $self->{CHILD_HANDLE} ) . "\r\n";
  ##POSIX::write(fileno $self->{CHILD_HANDLE},$buf, length $buf) or warn "$! in syswrite";
  ##   $self->{CHILD_HANDLE}->autoflush( 1 );
  ##   $self->{WRITE_HANDLE}->autoflush( 1 );
  
      ## Now fork off a data pump and arrange to return the correct fds.
      if ($is_send_to_child) {
          pipe $self->{CHILD_HANDLE}, $self->{PUMP_PIPE_HANDLE}
            or croak "$! opening child pipe";
          _debug "CHILD_HANDLE = ", fileno $self->{CHILD_HANDLE}
            if _debugging_details;
          _debug "PUMP_PIPE_HANDLE = ", fileno $self->{PUMP_PIPE_HANDLE}
            if _debugging_details;
      }
      else {
          pipe $self->{PUMP_PIPE_HANDLE}, $self->{CHILD_HANDLE}
            or croak "$! opening child pipe";
          _debug "CHILD_HANDLE = ", fileno $self->{CHILD_HANDLE}
            if _debugging_details;
          _debug "PUMP_PIPE_HANDLE = ", fileno $self->{PUMP_PIPE_HANDLE}
            if _debugging_details;
      }
  
      ## These binmodes seem to have no effect on Win2K, but just to be safe
      ## I do them.
      binmode $self->{CHILD_HANDLE};
      binmode $self->{PUMP_PIPE_HANDLE};
  
      ## No child should ever see this.
      _dont_inherit $self->{PARENT_HANDLE};
  
      ## We clear the inherit flag so these file descriptors are not inherited.
      ## It'll be dup()ed on to STDIN/STDOUT/STDERR before CreateProcess is
      ## called and *that* fd will be inheritable.
      _dont_inherit $self->{PUMP_SOCKET_HANDLE};
      _dont_inherit $self->{PUMP_PIPE_HANDLE};
      _dont_inherit $self->{CHILD_HANDLE};
  
      ## Need to return $self so the HANDLEs don't get freed.
      ## Return $self, $parent_fd, $child_fd
      my ( $parent_fd, $child_fd ) = (
          fileno $self->{PARENT_HANDLE},
          fileno $self->{CHILD_HANDLE}
      );
  
      ## Both PUMP_..._HANDLEs will be closed, no need to worry about
      ## inheritance.
      _debug "binmode on" if _debugging_data && $self->binmode;
      _spawn_pumper(
          $is_send_to_child
          ? ( $self->{PUMP_SOCKET_HANDLE}, $self->{PUMP_PIPE_HANDLE} )
          : ( $self->{PUMP_PIPE_HANDLE}, $self->{PUMP_SOCKET_HANDLE} ),
          $debug_fd,
          $self->binmode,
          $child_fd . $self->dir . "pump" . $self->dir . $parent_fd,
      );
  
      {
          my $foo;
          confess "PARENT_HANDLE no longer open"
            unless POSIX::read( $parent_fd, $foo, 0 );
      }
  
      _debug "win32_fake_pipe = ( $parent_fd, $child_fd )"
        if _debugging_details;
  
      $self->{FD}  = $parent_fd;
      $self->{TFD} = $child_fd;
  }
  
  sub _do_open {
      my IPC::Run::Win32IO $self = shift;
  
      if ( $self->{SEND_THROUGH_TEMP_FILE} ) {
          return $self->_send_through_temp_file(@_);
      }
      elsif ( $self->{RECV_THROUGH_TEMP_FILE} ) {
          return $self->_init_recv_through_temp_file(@_);
      }
      else {
          return $self->_open_socket_pipe(@_);
      }
  }
  
  1;
  
  =pod
  
  =head1 AUTHOR
  
  Barries Slaymaker <barries@slaysys.com>.  Funded by Perforce Software, Inc.
  
  =head1 COPYRIGHT
  
  Copyright 2001, Barrie Slaymaker, All Rights Reserved.
  
  You may use this under the terms of either the GPL 2.0 or the Artistic License.
  
  =cut
IPC_RUN_WIN32IO

    $main::fatpacked{"IPC/Run/Win32Pump.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'IPC_RUN_WIN32PUMP';
  package IPC::Run::Win32Pump;
  
  =pod
  
  =head1 NAME
  
  IPC::Run::Win32Pump - helper processes to shovel data to/from parent, child
  
  =head1 SYNOPSIS
  
  Internal use only; see IPC::Run::Win32IO and best of luck to you.
  
  =head1 DESCRIPTION
  
  See L<IPC::Run::Win32Helper|IPC::Run::Win32Helper> for details.  This
  module is used in subprocesses that are spawned to shovel data to/from
  parent processes from/to their child processes.  Where possible, pumps
  are optimized away.
  
  NOTE: This is not a real module: it's a script in module form, designed
  to be run like
  
     $^X -MIPC::Run::Win32Pumper -e 1 ...
  
  It parses a bunch of command line parameters from IPC::Run::Win32IO.
  
  =cut
  
  use strict;
  use vars qw{$VERSION};
  
  BEGIN {
      $VERSION = '20180523.0';
  }
  
  use Win32API::File qw(
    OsFHandleOpen
  );
  
  my ( $stdin_fh, $stdout_fh, $debug_fh, $binmode, $parent_pid, $parent_start_time, $debug, $child_label );
  
  BEGIN {
      ( $stdin_fh, $stdout_fh, $debug_fh, $binmode, $parent_pid, $parent_start_time, $debug, $child_label ) = @ARGV;
      ## Rather than letting IPC::Run::Debug export all-0 constants
      ## when not debugging, we do it manually in order to not even
      ## load IPC::Run::Debug.
      if ($debug) {
          eval "use IPC::Run::Debug qw( :default _debug_init ); 1;"
            or die $@;
      }
      else {
          eval <<STUBS_END or die $@;
  	 sub _debug {}
  	 sub _debug_init {}
  	 sub _debugging() { 0 }
  	 sub _debugging_data() { 0 }
  	 sub _debugging_details() { 0 }
  	 sub _debugging_gory_details() { 0 }
  	 1;
  STUBS_END
      }
  }
  
  ## For some reason these get created with binmode on.  AAargh, gotta       #### REMOVE
  ## do it by hand below.       #### REMOVE
  if ($debug) {    #### REMOVE
      close STDERR;    #### REMOVE
      OsFHandleOpen( \*STDERR, $debug_fh, "w" )    #### REMOVE
        or print "$! opening STDERR as Win32 handle $debug_fh in pumper $$";    #### REMOVE
  }               #### REMOVE
  close STDIN;    #### REMOVE
  OsFHandleOpen( \*STDIN, $stdin_fh, "r" )    #### REMOVE
    or die "$! opening STDIN as Win32 handle $stdin_fh in pumper $$";    #### REMOVE
  close STDOUT;                                                          #### REMOVE
  OsFHandleOpen( \*STDOUT, $stdout_fh, "w" )                             #### REMOVE
    or die "$! opening STDOUT as Win32 handle $stdout_fh in pumper $$";  #### REMOVE
  
  binmode STDIN;
  binmode STDOUT;
  $| = 1;
  select STDERR;
  $| = 1;
  select STDOUT;
  
  $child_label ||= "pump";
  _debug_init(
      $parent_pid,
      $parent_start_time,
      $debug,
      fileno STDERR,
      $child_label,
  );
  
  _debug "Entered" if _debugging_details;
  
  # No need to close all fds; win32 doesn't seem to pass any on to us.
  $| = 1;
  my $buf;
  my $total_count = 0;
  while (1) {
      my $count = sysread STDIN, $buf, 10_000;
      last unless $count;
      if (_debugging_gory_details) {
          my $msg = "'$buf'";
          substr( $msg, 100, -1 ) = '...' if length $msg > 100;
          $msg =~ s/\n/\\n/g;
          $msg =~ s/\r/\\r/g;
          $msg =~ s/\t/\\t/g;
          $msg =~ s/([\000-\037\177-\277])/sprintf "\0x%02x", ord $1/eg;
          _debug sprintf( "%5d chars revc: ", $count ), $msg;
      }
      $total_count += $count;
      $buf =~ s/\r//g unless $binmode;
      if (_debugging_gory_details) {
          my $msg = "'$buf'";
          substr( $msg, 100, -1 ) = '...' if length $msg > 100;
          $msg =~ s/\n/\\n/g;
          $msg =~ s/\r/\\r/g;
          $msg =~ s/\t/\\t/g;
          $msg =~ s/([\000-\037\177-\277])/sprintf "\0x%02x", ord $1/eg;
          _debug sprintf( "%5d chars sent: ", $count ), $msg;
      }
      print $buf;
  }
  
  _debug "Exiting, transferred $total_count chars" if _debugging_details;
  
  ## Perform a graceful socket shutdown.  Windows defaults to SO_DONTLINGER,
  ## which should cause a "graceful shutdown in the background" on sockets.
  ## but that's only true if the process closes the socket manually, it
  ## seems; if the process exits and lets the OS clean up, the OS is not
  ## so kind.  STDOUT is not always a socket, of course, but it won't hurt
  ## to close a pipe and may even help.  With a closed source OS, who
  ## can tell?
  ##
  ## In any case, this close() is one of the main reasons we have helper
  ## processes; if the OS closed socket fds gracefully when an app exits,
  ## we'd just redirect the client directly to what is now the pump end
  ## of the socket.  As it is, however, we need to let the client play with
  ## pipes, which don't have the abort-on-app-exit behavior, and then
  ## adapt to the sockets in the helper processes to allow the parent to
  ## select.
  ##
  ## Possible alternatives / improvements:
  ##
  ## 1) use helper threads instead of processes.  I don't trust perl's threads
  ## as of 5.005 or 5.6 enough (which may be myopic of me).
  ##
  ## 2) figure out if/how to get at WaitForMultipleObjects() with pipe
  ## handles.  May be able to take the Win32 handle and pass it to
  ## Win32::Event::wait_any, dunno.
  ##
  ## 3) Use Inline::C or a hand-tooled XS module to do helper threads.
  ## This would be faster than #1, but would require a ppm distro.
  ##
  close STDOUT;
  close STDERR;
  
  1;
  
  =pod
  
  =head1 AUTHOR
  
  Barries Slaymaker <barries@slaysys.com>.  Funded by Perforce Software, Inc.
  
  =head1 COPYRIGHT
  
  Copyright 2001, Barrie Slaymaker, All Rights Reserved.
  
  You may use this under the terms of either the GPL 2.0 ir the Artistic License.
  
  =cut
IPC_RUN_WIN32PUMP

    $main::fatpacked{"IPC/System/Options.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'IPC_SYSTEM_OPTIONS';
  package IPC::System::Options;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-03-10'; # DATE
  our $DIST = 'IPC-System-Options'; # DIST
  our $VERSION = '0.334'; # VERSION
  
  use strict 'subs', 'vars';
  use warnings;
  
  use Proc::ChildError qw(explain_child_error);
  
  my $log;
  our %Global_Opts;
  
  sub import {
      my $self = shift;
  
      my $caller = caller();
      my $i = 0;
      while ($i < @_) {
          # backtick is the older, deprecated name for readpipe
          if ($_[$i] =~ /\A(system|readpipe|backtick|run|start|import)\z/) {
              no strict 'refs';
              *{"$caller\::$_[$i]"} = \&{"$self\::" . $_[$i]};
          } elsif ($_[$i] =~ /\A-(.+)/) {
              die "$_[$i] requires an argument" unless $i < @_-1;
              $Global_Opts{$1} = $_[$i+1];
              $i++;
          } else {
              die "$_[$i] is not exported by ".__PACKAGE__;
          }
          $i++;
      }
  }
  
  sub _args2cmd {
      if (@_ == 1) {
          return $_[0];
      }
      if ($^O eq 'MSWin32') {
          require Win32::ShellQuote;
          return Win32::ShellQuote::quote_system_string(
              map { ref($_) eq 'SCALAR' ? $$_ : $_ } @_);
      } else {
          require String::ShellQuote;
          return join(
              " ",
              map { ref($_) eq 'SCALAR' ? $$_ : String::ShellQuote::shell_quote($_) } @_
          );
      }
  }
  
  sub _system_or_readpipe_or_run_or_start {
      my $which = shift;
      my $opts = ref($_[0]) eq 'HASH' ? shift : {};
      for (keys %Global_Opts) {
          $opts->{$_} = $Global_Opts{$_} if !defined($opts->{$_});
      }
      my @args = @_;
  
      # check known options
      for (keys %$opts) {
          die "Unknown option '$_'"
              unless /\A(
                          capture_stdout|capture_stderr|capture_merged|
                          tee_stdout|tee_stderr|tee_merged|
                          chdir|dies?|dry_run|env|lang|log|max_log_output|shell|
                          stdin # XXX: only for run()
                      )\z/x;
      }
  
      my $opt_die = $opts->{die} || $opts->{dies};
  
      my $exit_code;
      my $os_error = "";
      my $extra_error;
  
      if ($opts->{log}) {
          require Log::ger;
          Log::ger->import;
      }
  
      my $cwd;
      if ($opts->{chdir}) {
          require Cwd;
          $cwd = Cwd::getcwd();
          if (!defined $cwd) { # checking $! is always true here, why?
              $log->error("Can't getcwd: $!") if $log;
              $exit_code = -1;
              $os_error = $!;
              $extra_error = "Can't getcwd";
              goto CHECK_RESULT;
          }
          unless (chdir $opts->{chdir}) {
              $log->error("Can't chdir to '$opts->{chdir}': $!") if $log;
              $exit_code = -1;
              $os_error = $!;
              $extra_error = "Can't chdir";
              goto CHECK_RESULT;
          }
      }
  
      # set ENV
      my %save_env;
      my %set_env;
      if ($opts->{lang}) {
          $set_env{LC_ALL}   = $opts->{lang};
          $set_env{LANGUAGE} = $opts->{lang};
          $set_env{LANG}     = $opts->{lang};
      }
      if ($opts->{env}) {
          $set_env{$_} = $opts->{env}{$_} for keys %{ $opts->{env} };
      }
      if (%set_env) {
          for (keys %set_env) {
              $save_env{$_} = $ENV{$_};
              $ENV{$_} = $set_env{$_};
          }
      }
  
      my $wa;
      my $res;
  
      my $capture_stdout_was_false;
      my $emulate_backtick;
      my $tmp_capture_stdout;
  
      my $code_capture = sub {
          my $doit = shift;
  
          if ($opts->{capture_stdout} && $opts->{capture_stderr}) {
              require Capture::Tiny;
              (${ $opts->{capture_stdout} }, ${ $opts->{capture_stderr} }) =
                  &Capture::Tiny::capture($doit);
          } elsif ($opts->{capture_merged}) {
              require Capture::Tiny;
              ${ $opts->{capture_merged} } =
                  &Capture::Tiny::capture_merged($doit);
          } elsif ($opts->{capture_stdout}) {
              require Capture::Tiny;
              ${ $opts->{capture_stdout} } =
                  &Capture::Tiny::capture_stdout($doit);
          } elsif ($opts->{capture_stderr}) {
              require Capture::Tiny;
              ${ $opts->{capture_stderr} } =
                  &Capture::Tiny::capture_stderr($doit);
  
          } elsif ($opts->{tee_stdout} && $opts->{tee_stderr}) {
              require Capture::Tiny;
              (${ $opts->{tee_stdout} }, ${ $opts->{tee_stderr} }) =
                  &Capture::Tiny::tee($doit);
          } elsif ($opts->{tee_merged}) {
              require Capture::Tiny;
              ${ $opts->{tee_merged} } =
                  &Capture::Tiny::tee_merged($doit);
          } elsif ($opts->{tee_stdout}) {
              require Capture::Tiny;
              ${ $opts->{tee_stdout} } =
                  &Capture::Tiny::tee_stdout($doit);
          } elsif ($opts->{tee_stderr}) {
              require Capture::Tiny;
              ${ $opts->{tee_stderr} } =
                  &Capture::Tiny::tee_stderr($doit);
          } else {
              $doit->();
          }
      };
  
      if ($which eq 'system') {
  
          if ($opts->{log} || $opts->{dry_run}) {
              if ($opts->{log}) {
                  no strict 'refs';
                  my $routine;
                  my $label = "";
                  if ($opts->{dry_run}) {
                      $label = "[DRY RUN] ";
                      $routine = "log_info";
                  } else {
                      $routine = "log_trace";
                  }
                  $routine->("%ssystem(%s), env=%s", $label, \@args, \%set_env);
              } else {
                  warn "[DRY RUN] system("._args2cmd(@args).")\n";
              }
              if ($opts->{dry_run}) {
                  $exit_code = 0;
                  $res = "";
                  goto CHECK_RESULT;
              }
          }
  
          my $doit = sub {
              if ($opts->{shell}) {
                  # force the use of shell
                  $res = system _args2cmd(@args);
              } elsif (defined $opts->{shell}) {
                  # forbid shell
                  $res = system {$args[0]} @args;
              } else {
                  # might or might not use shell (if @args == 1)
                  $res = system @args;
              }
              $exit_code = $?;
              $os_error = $!;
          };
          $code_capture->($doit);
  
      } elsif ($which eq 'readpipe') {
  
          $wa = wantarray;
  
          if ($opts->{log} || $opts->{dry_run}) {
              if ($opts->{log}) {
                  no strict 'refs';
                  my $routine;
                  my $label = "";
                  if ($opts->{dry_run}) {
                      $label = "[DRY RUN] ";
                      $routine = "log_info";
                  } else {
                      $routine = "log_trace";
                  }
                  $routine->("%sreadpipe(%s), env=%s", $label, _args2cmd(@args), \%set_env);
              } else {
                  warn "[DRY RUN] readpipe("._args2cmd(@args).")\n";
              }
              if ($opts->{dry_run}) {
                  $exit_code = 0;
                  $res = "";
                  goto CHECK_RESULT;
              }
          }
  
          # we want to avoid the shell, so we don't use the builtin backtick.
          # instead, we emulate backtick by system + capturing the output
          if (defined $opts->{shell} && !$opts->{shell}) {
              $emulate_backtick++;
              die "Currently cannot backtick() with options shell=0 and capture_merged|tee_*"
                  if $opts->{capture_merged} || $opts->{tee_stdout} || $opts->{tee_stderr} || $opts->{tee_merged};
              if (!$opts->{capture_stdout}) {
                  $capture_stdout_was_false++;
                  $opts->{capture_stdout} = \$tmp_capture_stdout;
              }
          }
  
          my $doit = sub {
              if ($emulate_backtick) {
                  # we don't want shell so we have to emulate backtick with system
                  # + capture the output ourselves
                  system {$args[0]} @args;
              } else {
                  my $cmd = _args2cmd(@args);
                  #warn "cmd for backtick: " . $cmd;
                  # use backtick, which uses the shell
                  if ($wa) {
                      $res = [`$cmd`];
                  } else {
                      $res = `$cmd`;
                  }
              }
              $exit_code = $?;
              $os_error = $!;
          };
          $code_capture->($doit);
  
          if ($emulate_backtick) {
              $res = $capture_stdout_was_false ? $tmp_capture_stdout :
                  ${ $opts->{capture_stdout} };
              $res = [split /^/m, $res] if $wa;
              $opts->{capture_stdout} = undef if $capture_stdout_was_false;
          }
  
          # log output
          if ($opts->{log}) {
              my $res_show;
              if (defined $opts->{max_log_output}) {
                  $res_show = '';
                  if ($wa) {
                      for (@$res) {
                          if (length($res_show) + length($_) >=
                                  $opts->{max_log_output}) {
                              $res_show .= substr(
                                  $_,0,$opts->{max_log_output}-length($res_show));
                              last;
                          } else {
                              $res_show .= $_;
                          }
                      }
                  } else {
                      if (length($res) > $opts->{max_log_output}) {
                          $res_show = substr($res, 0, $opts->{max_log_output});
                      }
                  }
              }
              log_trace("result of readpipe(): %s (%d bytes)",
                        defined($res_show) ? $res_show : $res,
                        defined($res_show) ?
                            $opts->{max_log_output} : length($res))
                  unless $exit_code;
          }
  
      } elsif ($which eq 'run' || $which eq 'start') {
  
          if ($opts->{log} || $opts->{dry_run}) {
              if ($opts->{log}) {
                  no strict 'refs';
                  my $routine;
                  my $label = "";
                  if ($opts->{dry_run}) {
                      $label = "[DRY RUN] ";
                      $routine = "log_info";
                  } else {
                      $routine = "log_trace";
                  }
                  $routine->("%srun(%s), env=%s", $label,
                             join(", ", @args), \%set_env);
              } else {
                  warn "[DRY RUN] $which(".join(", ", @args).")\n";
              }
              if ($opts->{dry_run}) {
                  $exit_code = 0;
                  $res = "";
                  goto CHECK_RESULT;
              }
          }
  
          require IPC::Run;
          my $func = $which eq 'run' ? "IPC::Run::run" : "IPC::Run::start";
          $res = &{$func}(
              \@args,
              defined($opts->{stdin}) ? \$opts->{stdin} : \*STDIN,
              sub {
                  if ($opts->{capture_stdout}) {
                      ${$opts->{capture_stdout}} .= $_[0];
                  } else {
                      print $_[0];
                  }
              }, # out
              sub {
                  if ($opts->{capture_stderr}) {
                      ${$opts->{capture_stderr}} .= $_[0];
                  } else {
                      print STDERR $_[0];
                  }
              }, # err
          );
          if ($which eq 'run') {
              $exit_code = $?;
              $os_error = $!;
          } else {
              $exit_code = 0;
              $os_error = "";
          }
  
      } # which
  
      # restore ENV
      if (%save_env) {
          for (keys %save_env) {
              if (defined $save_env{$_}) {
                  $ENV{$_} = $save_env{$_};
              } else {
                  undef $ENV{$_};
              }
          }
      }
  
      # restore previous working directory
      if ($cwd) {
          unless (chdir $cwd) {
              $log->error("Can't chdir back to '$cwd': $!") if $log;
              $exit_code ||= -1;
              $os_error = $!;
              $extra_error = "Can't chdir back";
              goto CHECK_RESULT;
          }
      }
  
    CHECK_RESULT:
      if ($exit_code) {
          if ($opts->{log} || $opt_die) {
              my $msg = sprintf(
                  "%s(%s) failed: %s (%s)%s%s%s",
                  $which,
                  join(" ", @args),
                  defined $extra_error ? "" : $exit_code,
                  defined $extra_error ? "$extra_error: $os_error" : explain_child_error($exit_code, $os_error),
                  (ref($opts->{capture_stdout}) ?
                       ", captured stdout: <<" .
                       (defined ${$opts->{capture_stdout}} ? ${$opts->{capture_stdout}} : ''). ">>" : ""),
                  (ref($opts->{capture_stderr}) ?
                       ", captured stderr: <<" .
                       (defined ${$opts->{capture_stderr}} ? ${$opts->{capture_stderr}} : ''). ">>" : ""),
                  (ref($opts->{capture_merged}) ?
                       ", captured merged: <<" .
                       (defined ${$opts->{capture_merged}} ? ${$opts->{capture_merged}} : ''). ">>" : ""),
              );
              log_error($msg) if $opts->{log};
              die $msg if $opt_die;
          }
      }
  
      if ($which ne 'start') {
          $? = $exit_code;
      }
  
      return $wa && $which ne 'run' && $which ne 'start' ? @$res : $res;
  }
  
  sub system {
      _system_or_readpipe_or_run_or_start('system', @_);
  }
  
  # backtick is the older, deprecated name for readpipe
  sub backtick {
      _system_or_readpipe_or_run_or_start('readpipe', @_);
  }
  
  sub readpipe {
      _system_or_readpipe_or_run_or_start('readpipe', @_);
  }
  
  sub run {
      _system_or_readpipe_or_run_or_start('run', @_);
  }
  
  sub start {
      _system_or_readpipe_or_run_or_start('start', @_);
  }
  
  1;
  # ABSTRACT: Perl's system() and readpipe/qx replacement, with options
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  IPC::System::Options - Perl's system() and readpipe/qx replacement, with options
  
  =head1 VERSION
  
  This document describes version 0.334 of IPC::System::Options (from Perl distribution IPC-System-Options), released on 2020-03-10.
  
  =head1 SYNOPSIS
  
   use IPC::System::Options qw(system readpipe run start);
  
   # use exactly like system()
   system(...);
  
   # use exactly like readpipe() (a.k.a. qx a.k.a. `` a.k.a. the backtick
   # operator). if you import readpipe, you'll override the backtick operator with
   # this module's version (along with your chosen settings).
   my $res = readpipe(...);
   $res = `...`;
  
   # but these functions accept an optional hash first argument to specify options
   system({...}, ...);
   $res = readpipe({...}, ...);
  
   # run without shell, even though there is only one argument
   system({shell=>0}, "ls");
   system({shell=>0}, "ls -lR");          # will fail, as there is no 'ls -lR' binary
   $res = readpipe({shell=>0}, "ls -lR"); # ditto
  
   # force shell, even though there are multiple arguments (arguments will be
   # quoted and joined together for you, including proper quoting on Win32).
   system({shell=>1}, "perl", "-e", "print 123"); # will print 123
   $res = readpipe({shell=>1}, "perl", "-e", "print 123");
  
   # note that to prevent the quoting mechanism from quoting some special
   # characters (like ">") you can use scalar references, e.g.:
   system({shell=>1}, "ls", "-laR",  ">", "/root/ls-laR"); # fails, because the arguments are quoted so the command becomes: ls '-laR' '>' '/root/ls-laR'
   system({shell=>1}, "ls", "-laR", \">", "/root/ls-laR"); # works
  
   # set LC_ALL/LANGUAGE/LANG environment variable
   $res = readpipe({lang=>"de_DE.UTF-8"}, "df");
  
   # log using Log::ger, die on failure
   system({log=>1, die=>1}, "blah", ...);
  
   # chdir first before running program (and chdir back afterwards)
   system({chdir => "/tmp", die => 1}, "some-program");
  
  Set default options for all calls (prefix each option with dash):
  
   use IPC::System::Options 'system', 'readpipe', -log=>1, -die=>1;
  
  C<run()> is like C<system()> but uses L<IPC::Run>'s C<run()> instead of
  C<system()>:
  
   run('ls');
  
   # also accepts an optional hash first argument. some additional options that
   # run() accepts: stdin.
   run({capture_stdout => \$stdout, capture_stderr => \$stderr}, 'ls', '-l');
  
  C<start()> is like C<run()> but uses L<IPC::Run>'s C<start()> instead of
  C<run()> to run program in the background. The result is a handle (see
  L<IPC::Run> for more details) which you can then call C<finish()>, etc on.
  
   my $h = start('ls', '-l');
   ...
   $h->finish;
  
  =head1 DESCRIPTION
  
  =for Pod::Coverage ^(backtick)$
  
  =head1 FUNCTIONS
  
  =head2 system([ \%opts ], @args)
  
  Just like perl's C<system()> except that it accepts an optional hash first
  argument to specify options. Currently known options:
  
  =over
  
  =item * shell => bool
  
  Can be set to 0 to always avoid invoking the shell. The default is to use the
  shell under certain conditions, like perl's C<system()>. But unlike perl's
  C<system()>, you can force shell usage even though you pass multiple arguments
  (in which case, the arguments will be quoted for you, including proper quoting
  on Win32).
  
  =item * lang => str
  
  Temporarily set locale-related environment variables: C<LC_ALL> (this is the
  highest precedence, even higher than the other C<LC_*> variables including
  C<LC_MESSAGES>), C<LANGUAGE> (this is used in Linux, with precedence higher than
  C<LANG> but lower than C<LC_*>), and C<LANG>.
  
  Of course you can set the environment variables manually (or use the C<env>
  option), this option is just for convenience.
  
  =item * env => hashref
  
  Temporarily set environment variables.
  
  =item * log => bool
  
  If set to true, then will log invocation as well as return/result value. Will
  log using L<Log::ger> at the C<trace> level.
  
  =item * die => bool
  
  If set to true, will die on failure.
  
  =item * capture_stdout => scalarref
  
  Capture stdout using L<Capture::Tiny>.
  
  Cannot be used together with C<tee_*> or C<capture_merged>.
  
  =item * capture_stderr => scalarref
  
  Capture stderr using L<Capture::Tiny>.
  
  Cannot be used together with C<tee_*> or C<capture_merged>.
  
  =item * capture_merged => scalarref
  
  Capture stdout and stderr in a single variable using L<Capture::Tiny>'s
  C<capture_merged>.
  
  Cannot be used together with C<tee_*>, C<capture_stdout>, or C<capture_stderr>.
  
  =item * tee_stdout => scalarref
  
  Tee stdout using L<Capture::Tiny>.
  
  Cannot be used together with C<capture_*> or C<tee_merged>.
  
  =item * tee_stderr => scalarref
  
  Capture stderr using L<Capture::Tiny>.
  
  Cannot be used together with C<capture_*> or C<tee_merged>.
  
  =item * tee_merged => scalarref
  
  Capture stdout and stderr in a single variable using L<Capture::Tiny>'s
  C<capture_merged>.
  
  Cannot be used together with C<capture_*>, C<tee_stdout>, or C<tee_stderr>.
  
  =item * chdir => str
  
  Attempt to change to specified directory first and change back to the original
  directory after the command has been run. This is a convenient option so you can
  do this kind of task in a single call:
  
   {
       my $cwd = getcwd();
       chdir $dir or die;
       system(...);
       chdir $cwd or die;
   }
  
  If the attempt to chdir before command execution fails, will die if C<die>
  option is set to true. Otherwise, C<$!> (OS error) will be set to the C<chdir()>
  error and to minimize surprise C<$?> (child exit code) will also be set to
  non-zero value (-1) even though at this point no child process has been run.
  
  If the attempt to chdir back (after command execution) fails, will die if C<die>
  option is set to true. Otherwise, C<$!> will be set to the C<chdir()> error and
  C<$?> will be set to -1 only if C<$?> is zero. So if the command fails, C<$?>
  will contain the exit code of the command.
  
  =item * dry_run => bool
  
  If set to true, then will only display what would be executed to STDERR (or log
  at C<warn> level, if C<log> option is true) instead of actually executing the
  command.
  
  Will set C<$?> (child exit code) to 0.
  
  An example of how this option can be used:
  
   system({ dry_run => $ENV{DRY_RUN} }, ...);
  
  This will allow you to run script in dry-run mode by setting environment
  variable.
  
  =back
  
  =head2 readpipe([ \%opts ], @args)
  
  Just like perl's C<readpipe()> (a.k.a. C<qx()> a.k.a. C<``> a.k.a. the backtick
  operator) except that it accepts an optional hash first argument to specify
  options. And it can accept multiple arguments (in which case, the arguments will
  be quoted for you, including proper quoting on Win32).
  
  Known options:
  
  =over
  
  =item * lang => str
  
  See option documentation in C<system()>.
  
  =item * env => hash
  
  See option documentation in C<system()>.
  
  =item * log => bool
  
  See option documentation in C<system()>.
  
  =item * die => bool
  
  See option documentation in C<system()>.
  
  =item * capture_stdout => scalarref
  
  See option documentation in C<system()>.
  
  =item * capture_stderr => scalarref
  
  See option documentation in C<system()>.
  
  =item * capture_merged => scalarref
  
  See option documentation in C<system()>.
  
  =item * tee_stdout => scalarref
  
  See option documentation in C<system()>.
  
  =item * tee_stderr => scalarref
  
  See option documentation in C<system()>.
  
  =item * tee_merged => scalarref
  
  See option documentation in C<system()>.
  
  =item * max_log_output => int
  
  If set, will limit result length being logged. It's a good idea to set this
  (e.g. to 1024) if you expect some command to return large output.
  
  =item * chdir => str
  
  See option documentation in C<system()>.
  
  =item * dry_run => bool
  
  See option documentation in C<system()>.
  
  =back
  
  =head2 run([ \%opts ], @args)
  
  Like C<system()>, but uses L<IPC::Run>'s C<run()>. Known options:
  
  =over
  
  =item * lang => str
  
  See option documentation in C<system()>.
  
  =item * env => hash
  
  See option documentation in C<system()>.
  
  =item * log => bool
  
  See option documentation in C<system()>.
  
  =item * die => bool
  
  See option documentation in C<system()>.
  
  =item * capture_stdout => scalarref
  
  See option documentation in C<system()>.
  
  =item * capture_stderr => scalarref
  
  See option documentation in C<system()>.
  
  =item * capture_merged => scalarref
  
  See option documentation in C<system()>.
  
  =item * tee_stdout => scalarref
  
  See option documentation in C<system()>.
  
  =item * tee_stderr => scalarref
  
  See option documentation in C<system()>.
  
  =item * tee_merged => scalarref
  
  See option documentation in C<system()>.
  
  =item * stdin => scalar
  
  Supply standard input.
  
  =item * chdir => str
  
  See option documentation in C<system()>.
  
  =item * dry_run => bool
  
  See option documentation in C<system()>.
  
  =back
  
  =head2 start([ \%opts ], @args)
  
  Like C<run()>, but uses L<IPC::Run>'s C<start()>. For known options, see
  C<run()>.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/IPC-System-Options>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-IPC-System-Options>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=IPC-System-Options>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2017, 2016, 2015 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
IPC_SYSTEM_OPTIONS

    $main::fatpacked{"JSON.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'JSON';
  package JSON;
  
  
  use strict;
  use Carp ();
  use Exporter;
  BEGIN { @JSON::ISA = 'Exporter' }
  
  @JSON::EXPORT = qw(from_json to_json jsonToObj objToJson encode_json decode_json);
  
  BEGIN {
      $JSON::VERSION = '4.02';
      $JSON::DEBUG   = 0 unless (defined $JSON::DEBUG);
      $JSON::DEBUG   = $ENV{ PERL_JSON_DEBUG } if exists $ENV{ PERL_JSON_DEBUG };
  }
  
  my %RequiredVersion = (
      'JSON::PP' => '2.27203',
      'JSON::XS' => '2.34',
  );
  
  # XS and PP common methods
  
  my @PublicMethods = qw/
      ascii latin1 utf8 pretty indent space_before space_after relaxed canonical allow_nonref 
      allow_blessed convert_blessed filter_json_object filter_json_single_key_object 
      shrink max_depth max_size encode decode decode_prefix allow_unknown
  /;
  
  my @Properties = qw/
      ascii latin1 utf8 indent space_before space_after relaxed canonical allow_nonref
      allow_blessed convert_blessed shrink max_depth max_size allow_unknown
  /;
  
  my @XSOnlyMethods = qw//; # Currently nothing
  
  my @PublicMethodsSince4_0 = qw/allow_tags/;
  my @PropertiesSince4_0 = qw/allow_tags/;
  
  my @PPOnlyMethods = qw/
      indent_length sort_by
      allow_singlequote allow_bignum loose allow_barekey escape_slash as_nonblessed
  /; # JSON::PP specific
  
  
  # used in _load_xs and _load_pp ($INSTALL_ONLY is not used currently)
  my $_INSTALL_DONT_DIE  = 1; # When _load_xs fails to load XS, don't die.
  my $_ALLOW_UNSUPPORTED = 0;
  my $_UNIV_CONV_BLESSED = 0;
  
  
  # Check the environment variable to decide worker module. 
  
  unless ($JSON::Backend) {
      $JSON::DEBUG and  Carp::carp("Check used worker module...");
  
      my $backend = exists $ENV{PERL_JSON_BACKEND} ? $ENV{PERL_JSON_BACKEND} : 1;
  
      if ($backend eq '1') {
          $backend = 'JSON::XS,JSON::PP';
      }
      elsif ($backend eq '0') {
          $backend = 'JSON::PP';
      }
      elsif ($backend eq '2') {
          $backend = 'JSON::XS';
      }
      $backend =~ s/\s+//g;
  
      my @backend_modules = split /,/, $backend;
      while(my $module = shift @backend_modules) {
          if ($module =~ /JSON::XS/) {
              _load_xs($module, @backend_modules ? $_INSTALL_DONT_DIE : 0);
          }
          elsif ($module =~ /JSON::PP/) {
              _load_pp($module);
          }
          elsif ($module =~ /JSON::backportPP/) {
              _load_pp($module);
          }
          else {
              Carp::croak "The value of environmental variable 'PERL_JSON_BACKEND' is invalid.";
          }
          last if $JSON::Backend;
      }
  }
  
  
  sub import {
      my $pkg = shift;
      my @what_to_export;
      my $no_export;
  
      for my $tag (@_) {
          if ($tag eq '-support_by_pp') {
              if (!$_ALLOW_UNSUPPORTED++) {
                  JSON::Backend::XS
                      ->support_by_pp(@PPOnlyMethods) if ($JSON::Backend->is_xs);
              }
              next;
          }
          elsif ($tag eq '-no_export') {
              $no_export++, next;
          }
          elsif ( $tag eq '-convert_blessed_universally' ) {
              my $org_encode = $JSON::Backend->can('encode');
              eval q|
                  require B;
                  local $^W;
                  no strict 'refs';
                  *{"${JSON::Backend}\::encode"} = sub {
                      # only works with Perl 5.18+
                      local *UNIVERSAL::TO_JSON = sub {
                          my $b_obj = B::svref_2object( $_[0] );
                          return    $b_obj->isa('B::HV') ? { %{ $_[0] } }
                                  : $b_obj->isa('B::AV') ? [ @{ $_[0] } ]
                                  : undef
                                  ;
                      };
                      $org_encode->(@_);
                  };
              | if ( !$_UNIV_CONV_BLESSED++ );
              next;
          }
          push @what_to_export, $tag;
      }
  
      return if ($no_export);
  
      __PACKAGE__->export_to_level(1, $pkg, @what_to_export);
  }
  
  
  # OBSOLETED
  
  sub jsonToObj {
      my $alternative = 'from_json';
      if (defined $_[0] and UNIVERSAL::isa($_[0], 'JSON')) {
          shift @_; $alternative = 'decode';
      }
      Carp::carp "'jsonToObj' will be obsoleted. Please use '$alternative' instead.";
      return JSON::from_json(@_);
  };
  
  sub objToJson {
      my $alternative = 'to_json';
      if (defined $_[0] and UNIVERSAL::isa($_[0], 'JSON')) {
          shift @_; $alternative = 'encode';
      }
      Carp::carp "'objToJson' will be obsoleted. Please use '$alternative' instead.";
      JSON::to_json(@_);
  };
  
  
  # INTERFACES
  
  sub to_json ($@) {
      if (
          ref($_[0]) eq 'JSON'
          or (@_ > 2 and $_[0] eq 'JSON')
      ) {
          Carp::croak "to_json should not be called as a method.";
      }
      my $json = JSON->new;
  
      if (@_ == 2 and ref $_[1] eq 'HASH') {
          my $opt  = $_[1];
          for my $method (keys %$opt) {
              $json->$method( $opt->{$method} );
          }
      }
  
      $json->encode($_[0]);
  }
  
  
  sub from_json ($@) {
      if ( ref($_[0]) eq 'JSON' or $_[0] eq 'JSON' ) {
          Carp::croak "from_json should not be called as a method.";
      }
      my $json = JSON->new;
  
      if (@_ == 2 and ref $_[1] eq 'HASH') {
          my $opt  = $_[1];
          for my $method (keys %$opt) {
              $json->$method( $opt->{$method} );
          }
      }
  
      return $json->decode( $_[0] );
  }
  
  
  
  sub true  { $JSON::true  }
  
  sub false { $JSON::false }
  
  sub boolean {
      # might be called as method or as function, so pop() to get the last arg instead of shift() to get the first
      pop() ? $JSON::true : $JSON::false
  }
  
  sub null  { undef; }
  
  
  sub require_xs_version { $RequiredVersion{'JSON::XS'}; }
  
  sub backend {
      my $proto = shift;
      $JSON::Backend;
  }
  
  #*module = *backend;
  
  
  sub is_xs {
      return $_[0]->backend->is_xs;
  }
  
  
  sub is_pp {
      return $_[0]->backend->is_pp;
  }
  
  
  sub pureperl_only_methods { @PPOnlyMethods; }
  
  
  sub property {
      my ($self, $name, $value) = @_;
  
      if (@_ == 1) {
          my %props;
          for $name (@Properties) {
              my $method = 'get_' . $name;
              if ($name eq 'max_size') {
                  my $value = $self->$method();
                  $props{$name} = $value == 1 ? 0 : $value;
                  next;
              }
              $props{$name} = $self->$method();
          }
          return \%props;
      }
      elsif (@_ > 3) {
          Carp::croak('property() can take only the option within 2 arguments.');
      }
      elsif (@_ == 2) {
          if ( my $method = $self->can('get_' . $name) ) {
              if ($name eq 'max_size') {
                  my $value = $self->$method();
                  return $value == 1 ? 0 : $value;
              }
              $self->$method();
          }
      }
      else {
          $self->$name($value);
      }
  
  }
  
  
  
  # INTERNAL
  
  sub __load_xs {
      my ($module, $opt) = @_;
  
      $JSON::DEBUG and Carp::carp "Load $module.";
      my $required_version = $RequiredVersion{$module} || '';
  
      eval qq|
          use $module $required_version ();
      |;
  
      if ($@) {
          if (defined $opt and $opt & $_INSTALL_DONT_DIE) {
              $JSON::DEBUG and Carp::carp "Can't load $module...($@)";
              return 0;
          }
          Carp::croak $@;
      }
      $JSON::BackendModuleXS = $module;
      return 1;
  }
  
  sub _load_xs {
      my ($module, $opt) = @_;
      __load_xs($module, $opt) or return;
  
      my $data = join("", <DATA>); # this code is from Jcode 2.xx.
      close(DATA);
      eval $data;
      JSON::Backend::XS->init($module);
  
      return 1;
  };
  
  
  sub __load_pp {
      my ($module, $opt) = @_;
  
      $JSON::DEBUG and Carp::carp "Load $module.";
      my $required_version = $RequiredVersion{$module} || '';
  
      eval qq| use $module $required_version () |;
  
      if ($@) {
          if ( $module eq 'JSON::PP' ) {
              $JSON::DEBUG and Carp::carp "Can't load $module ($@), so try to load JSON::backportPP";
              $module = 'JSON::backportPP';
              local $^W; # if PP installed but invalid version, backportPP redefines methods.
              eval qq| require $module |;
          }
          Carp::croak $@ if $@;
      }
      $JSON::BackendModulePP = $module;
      return 1;
  }
  
  sub _load_pp {
      my ($module, $opt) = @_;
      __load_pp($module, $opt);
  
      JSON::Backend::PP->init($module);
  };
  
  #
  # Helper classes for Backend Module (PP)
  #
  
  package JSON::Backend::PP;
  
  sub init {
      my ($class, $module) = @_;
  
      # name may vary, but the module should (always) be a JSON::PP
  
      local $^W;
      no strict qw(refs); # this routine may be called after JSON::Backend::XS init was called.
      *{"JSON::decode_json"} = \&{"JSON::PP::decode_json"};
      *{"JSON::encode_json"} = \&{"JSON::PP::encode_json"};
      *{"JSON::is_bool"} = \&{"JSON::PP::is_bool"};
  
      $JSON::true  = ${"JSON::PP::true"};
      $JSON::false = ${"JSON::PP::false"};
  
      push @JSON::Backend::PP::ISA, 'JSON::PP';
      push @JSON::ISA, $class;
      $JSON::Backend = $class;
      $JSON::BackendModule = $module;
      my $version = ${"$class\::VERSION"} = $module->VERSION;
      $version =~ s/_//;
      if ($version < 3.99) {
          push @XSOnlyMethods, qw/allow_tags get_allow_tags/;
      } else {
          push @Properties, 'allow_tags';
      }
  
      for my $method (@XSOnlyMethods) {
          *{"JSON::$method"} = sub {
              Carp::carp("$method is not supported by $module $version.");
              $_[0];
          };
      }
  
      return 1;
  }
  
  sub is_xs { 0 };
  sub is_pp { 1 };
  
  #
  # To save memory, the below lines are read only when XS backend is used.
  #
  
  package JSON;
  
  1;
  __DATA__
  
  
  #
  # Helper classes for Backend Module (XS)
  #
  
  package JSON::Backend::XS;
  
  sub init {
      my ($class, $module) = @_;
  
      local $^W;
      no strict qw(refs);
      *{"JSON::decode_json"} = \&{"$module\::decode_json"};
      *{"JSON::encode_json"} = \&{"$module\::encode_json"};
      *{"JSON::is_bool"} = \&{"$module\::is_bool"};
  
      $JSON::true  = ${"$module\::true"};
      $JSON::false = ${"$module\::false"};
  
      push @JSON::Backend::XS::ISA, $module;
      push @JSON::ISA, $class;
      $JSON::Backend = $class;
      $JSON::BackendModule = $module;
      ${"$class\::VERSION"} = $module->VERSION;
  
      if ( $module->VERSION < 3 ) {
          eval 'package JSON::PP::Boolean';
          push @{"$module\::Boolean::ISA"}, qw(JSON::PP::Boolean);
      }
  
      for my $method (@PPOnlyMethods) {
          *{"JSON::$method"} = sub {
              Carp::carp("$method is not supported by $module.");
              $_[0];
          };
      }
  
      return 1;
  }
  
  sub is_xs { 1 };
  sub is_pp { 0 };
  
  sub support_by_pp {
      my ($class, @methods) = @_;
  
      JSON::__load_pp('JSON::PP');
  
      local $^W;
      no strict qw(refs);
  
      for my $method (@methods) {
          my $pp_method = JSON::PP->can($method) or next;
          *{"JSON::$method"} = sub {
              if (!$_[0]->isa('JSON::PP')) {
                  my $xs_self = $_[0];
                  my $pp_self = JSON::PP->new;
                  for (@Properties) {
                       my $getter = "get_$_";
                      $pp_self->$_($xs_self->$getter);
                  }
                  $_[0] = $pp_self;
              }
              $pp_method->(@_);
          };
      }
  
      $JSON::DEBUG and Carp::carp("set -support_by_pp mode.");
  }
  
  1;
  __END__
  
  =head1 NAME
  
  JSON - JSON (JavaScript Object Notation) encoder/decoder
  
  =head1 SYNOPSIS
  
   use JSON; # imports encode_json, decode_json, to_json and from_json.
   
   # simple and fast interfaces (expect/generate UTF-8)
   
   $utf8_encoded_json_text = encode_json $perl_hash_or_arrayref;
   $perl_hash_or_arrayref  = decode_json $utf8_encoded_json_text;
   
   # OO-interface
   
   $json = JSON->new->allow_nonref;
   
   $json_text   = $json->encode( $perl_scalar );
   $perl_scalar = $json->decode( $json_text );
   
   $pretty_printed = $json->pretty->encode( $perl_scalar ); # pretty-printing
  
  =head1 VERSION
  
      4.02
  
  =head1 DESCRIPTION
  
  This module is a thin wrapper for L<JSON::XS>-compatible modules with a few
  additional features. All the backend modules convert a Perl data structure
  to a JSON text and vice versa. This module uses L<JSON::XS> by default,
  and when JSON::XS is not available, falls back on L<JSON::PP>, which is
  in the Perl core since 5.14. If JSON::PP is not available either, this
  module then falls back on JSON::backportPP (which is actually JSON::PP
  in a different .pm file) bundled in the same distribution as this module.
  You can also explicitly specify to use L<Cpanel::JSON::XS>, a fork of
  JSON::XS by Reini Urban.
  
  All these backend modules have slight incompatibilities between them,
  including extra features that other modules don't support, but as long as you
  use only common features (most important ones are described below), migration
  from backend to backend should be reasonably easy. For details, see each
  backend module you use.
  
  =head1 CHOOSING BACKEND
  
  This module respects an environmental variable called C<PERL_JSON_BACKEND>
  when it decides a backend module to use. If this environmental variable is
  not set, it tries to load JSON::XS, and if JSON::XS is not available, it
  falls back on JSON::PP, and then JSON::backportPP if JSON::PP is not available
  either.
  
  If you always don't want it to fall back on pure perl modules, set the
  variable like this (C<export> may be C<setenv>, C<set> and the likes,
  depending on your environment):
  
    > export PERL_JSON_BACKEND=JSON::XS
  
  If you prefer Cpanel::JSON::XS to JSON::XS, then:
  
    > export PERL_JSON_BACKEND=Cpanel::JSON::XS,JSON::XS,JSON::PP
  
  You may also want to set this variable at the top of your test files, in order
  not to be bothered with incompatibilities between backends (you need to wrap
  this in C<BEGIN>, and set before actually C<use>-ing JSON module, as it decides
  its backend as soon as it's loaded):
  
    BEGIN { $ENV{PERL_JSON_BACKEND}='JSON::backportPP'; }
    use JSON;
  
  =head1 USING OPTIONAL FEATURES
  
  There are a few options you can set when you C<use> this module.
  These historical options are only kept for backward compatibility,
  and should not be used in a new application.
  
  =over
  
  =item -support_by_pp
  
     BEGIN { $ENV{PERL_JSON_BACKEND} = 'JSON::XS' }
     
     use JSON -support_by_pp;
     
     my $json = JSON->new;
     # escape_slash is for JSON::PP only.
     $json->allow_nonref->escape_slash->encode("/");
  
  With this option, this module loads its pure perl backend along with
  its XS backend (if available), and lets the XS backend to watch if you set
  a flag only JSON::PP supports. When you do, the internal JSON::XS object
  is replaced with a newly created JSON::PP object with the setting copied
  from the XS object, so that you can use JSON::PP flags (and its slower
  C<decode>/C<encode> methods) from then on. In other words, this is not
  something that allows you to hook JSON::XS to change its behavior while
  keeping its speed. JSON::XS and JSON::PP objects are quite different
  (JSON::XS object is a blessed scalar reference, while JSON::PP object is
  a blessed hash reference), and can't share their internals.
  
  To avoid needless overhead (by copying settings), you are advised not
  to use this option and just to use JSON::PP explicitly when you need
  JSON::PP features.
  
  =item -convert_blessed_universally
  
     use JSON -convert_blessed_universally;
  
     my $json = JSON->new->allow_nonref->convert_blessed;
     my $object = bless {foo => 'bar'}, 'Foo';
     $json->encode($object); # => {"foo":"bar"}
  
  JSON::XS-compatible backend modules don't encode blessed objects by
  default (except for their boolean values, which are typically blessed
  JSON::PP::Boolean objects). If you need to encode a data structure
  that may contain objects, you usually need to look into the structure
  and replace objects with alternative non-blessed values, or enable
  C<convert_blessed> and provide a C<TO_JSON> method for each object's
  (base) class that may be found in the structure, in order to let the
  methods replace the objects with whatever scalar values the methods
  return.
  
  If you need to serialise data structures that may contain arbitrary
  objects, it's probably better to use other serialisers (such as
  L<Sereal> or L<Storable> for example), but if you do want to use
  this module for that purpose, C<-convert_blessed_universally> option
  may help, which tweaks C<encode> method of the backend to install
  C<UNIVERSAL::TO_JSON> method (locally) before encoding, so that
  all the objects that don't have their own C<TO_JSON> method can
  fall back on the method in the C<UNIVERSAL> namespace. Note that you
  still need to enable C<convert_blessed> flag to actually encode
  objects in a data structure, and C<UNIVERSAL::TO_JSON> method
  installed by this option only converts blessed hash/array references
  into their unblessed clone (including private keys/values that are
  not supposed to be exposed). Other blessed references will be
  converted into null.
  
  This feature is experimental and may be removed in the future.
  
  =item -no_export
  
  When you don't want to import functional interfaces from a module, you
  usually supply C<()> to its C<use> statement.
  
      use JSON (); # no functional interfaces
  
  If you don't want to import functional interfaces, but you also want to
  use any of the above options, add C<-no_export> to the option list.
  
     # no functional interfaces, while JSON::PP support is enabled.
     use JSON -support_by_pp, -no_export;
  
  =back
  
  =head1 FUNCTIONAL INTERFACE
  
  This section is taken from JSON::XS. C<encode_json> and C<decode_json>
  are exported by default.
  
  This module also exports C<to_json> and C<from_json> for backward
  compatibility. These are slower, and may expect/generate different stuff
  from what C<encode_json> and C<decode_json> do, depending on their
  options. It's better just to use Object-Oriented interfaces than using
  these two functions.
  
  =head2 encode_json
  
      $json_text = encode_json $perl_scalar
  
  Converts the given Perl data structure to a UTF-8 encoded, binary string
  (that is, the string contains octets only). Croaks on error.
  
  This function call is functionally identical to:
  
      $json_text = JSON->new->utf8->encode($perl_scalar)
  
  Except being faster.
  
  =head2 decode_json
  
      $perl_scalar = decode_json $json_text
  
  The opposite of C<encode_json>: expects an UTF-8 (binary) string and tries
  to parse that as an UTF-8 encoded JSON text, returning the resulting
  reference. Croaks on error.
  
  This function call is functionally identical to:
  
      $perl_scalar = JSON->new->utf8->decode($json_text)
  
  Except being faster.
  
  =head2 to_json
  
     $json_text = to_json($perl_scalar[, $optional_hashref])
  
  Converts the given Perl data structure to a Unicode string by default.
  Croaks on error.
  
  Basically, this function call is functionally identical to:
  
     $json_text = JSON->new->encode($perl_scalar)
  
  Except being slower.
  
  You can pass an optional hash reference to modify its behavior, but
  that may change what C<to_json> expects/generates (see
  C<ENCODING/CODESET FLAG NOTES> for details).
  
     $json_text = to_json($perl_scalar, {utf8 => 1, pretty => 1})
     # => JSON->new->utf8(1)->pretty(1)->encode($perl_scalar)
  
  =head2 from_json
  
     $perl_scalar = from_json($json_text[, $optional_hashref])
  
  The opposite of C<to_json>: expects a Unicode string and tries
  to parse it, returning the resulting reference. Croaks on error.
  
  Basically, this function call is functionally identical to:
  
      $perl_scalar = JSON->new->decode($json_text)
  
  You can pass an optional hash reference to modify its behavior, but
  that may change what C<from_json> expects/generates (see
  C<ENCODING/CODESET FLAG NOTES> for details).
  
      $perl_scalar = from_json($json_text, {utf8 => 1})
      # => JSON->new->utf8(1)->decode($json_text)
  
  =head2 JSON::is_bool
  
      $is_boolean = JSON::is_bool($scalar)
  
  Returns true if the passed scalar represents either JSON::true or
  JSON::false, two constants that act like C<1> and C<0> respectively
  and are also used to represent JSON C<true> and C<false> in Perl strings.
  
  See L<MAPPING>, below, for more information on how JSON values are mapped to
  Perl.
  
  =head1 COMMON OBJECT-ORIENTED INTERFACE
  
  This section is also taken from JSON::XS.
  
  The object oriented interface lets you configure your own encoding or
  decoding style, within the limits of supported formats.
  
  =head2 new
  
      $json = JSON->new
  
  Creates a new JSON::XS-compatible backend object that can be used to de/encode JSON
  strings. All boolean flags described below are by default I<disabled>
  (with the exception of C<allow_nonref>, which defaults to I<enabled> since
  version C<4.0>).
  
  The mutators for flags all return the backend object again and thus calls can
  be chained:
  
     my $json = JSON->new->utf8->space_after->encode({a => [1,2]})
     => {"a": [1, 2]}
  
  =head2 ascii
  
      $json = $json->ascii([$enable])
      
      $enabled = $json->get_ascii
  
  If C<$enable> is true (or missing), then the C<encode> method will not
  generate characters outside the code range C<0..127> (which is ASCII). Any
  Unicode characters outside that range will be escaped using either a
  single \uXXXX (BMP characters) or a double \uHHHH\uLLLLL escape sequence,
  as per RFC4627. The resulting encoded JSON text can be treated as a native
  Unicode string, an ascii-encoded, latin1-encoded or UTF-8 encoded string,
  or any other superset of ASCII.
  
  If C<$enable> is false, then the C<encode> method will not escape Unicode
  characters unless required by the JSON syntax or other flags. This results
  in a faster and more compact format.
  
  See also the section I<ENCODING/CODESET FLAG NOTES> later in this document.
  
  The main use for this flag is to produce JSON texts that can be
  transmitted over a 7-bit channel, as the encoded JSON texts will not
  contain any 8 bit characters.
  
    JSON->new->ascii(1)->encode([chr 0x10401])
    => ["\ud801\udc01"]
  
  =head2 latin1
  
      $json = $json->latin1([$enable])
      
      $enabled = $json->get_latin1
  
  If C<$enable> is true (or missing), then the C<encode> method will encode
  the resulting JSON text as latin1 (or iso-8859-1), escaping any characters
  outside the code range C<0..255>. The resulting string can be treated as a
  latin1-encoded JSON text or a native Unicode string. The C<decode> method
  will not be affected in any way by this flag, as C<decode> by default
  expects Unicode, which is a strict superset of latin1.
  
  If C<$enable> is false, then the C<encode> method will not escape Unicode
  characters unless required by the JSON syntax or other flags.
  
  See also the section I<ENCODING/CODESET FLAG NOTES> later in this document.
  
  The main use for this flag is efficiently encoding binary data as JSON
  text, as most octets will not be escaped, resulting in a smaller encoded
  size. The disadvantage is that the resulting JSON text is encoded
  in latin1 (and must correctly be treated as such when storing and
  transferring), a rare encoding for JSON. It is therefore most useful when
  you want to store data structures known to contain binary data efficiently
  in files or databases, not when talking to other JSON encoders/decoders.
  
    JSON->new->latin1->encode (["\x{89}\x{abc}"]
    => ["\x{89}\\u0abc"]    # (perl syntax, U+abc escaped, U+89 not)
  
  =head2 utf8
  
      $json = $json->utf8([$enable])
      
      $enabled = $json->get_utf8
  
  If C<$enable> is true (or missing), then the C<encode> method will encode
  the JSON result into UTF-8, as required by many protocols, while the
  C<decode> method expects to be handled an UTF-8-encoded string.  Please
  note that UTF-8-encoded strings do not contain any characters outside the
  range C<0..255>, they are thus useful for bytewise/binary I/O. In future
  versions, enabling this option might enable autodetection of the UTF-16
  and UTF-32 encoding families, as described in RFC4627.
  
  If C<$enable> is false, then the C<encode> method will return the JSON
  string as a (non-encoded) Unicode string, while C<decode> expects thus a
  Unicode string.  Any decoding or encoding (e.g. to UTF-8 or UTF-16) needs
  to be done yourself, e.g. using the Encode module.
  
  See also the section I<ENCODING/CODESET FLAG NOTES> later in this document.
  
  Example, output UTF-16BE-encoded JSON:
  
    use Encode;
    $jsontext = encode "UTF-16BE", JSON->new->encode ($object);
  
  Example, decode UTF-32LE-encoded JSON:
  
    use Encode;
    $object = JSON->new->decode (decode "UTF-32LE", $jsontext);
  
  =head2 pretty
  
      $json = $json->pretty([$enable])
  
  This enables (or disables) all of the C<indent>, C<space_before> and
  C<space_after> (and in the future possibly more) flags in one call to
  generate the most readable (or most compact) form possible.
  
  =head2 indent
  
      $json = $json->indent([$enable])
      
      $enabled = $json->get_indent
  
  If C<$enable> is true (or missing), then the C<encode> method will use a multiline
  format as output, putting every array member or object/hash key-value pair
  into its own line, indenting them properly.
  
  If C<$enable> is false, no newlines or indenting will be produced, and the
  resulting JSON text is guaranteed not to contain any C<newlines>.
  
  This setting has no effect when decoding JSON texts.
  
  =head2 space_before
  
      $json = $json->space_before([$enable])
      
      $enabled = $json->get_space_before
  
  If C<$enable> is true (or missing), then the C<encode> method will add an extra
  optional space before the C<:> separating keys from values in JSON objects.
  
  If C<$enable> is false, then the C<encode> method will not add any extra
  space at those places.
  
  This setting has no effect when decoding JSON texts. You will also
  most likely combine this setting with C<space_after>.
  
  Example, space_before enabled, space_after and indent disabled:
  
     {"key" :"value"}
  
  =head2 space_after
  
      $json = $json->space_after([$enable])
      
      $enabled = $json->get_space_after
  
  If C<$enable> is true (or missing), then the C<encode> method will add an extra
  optional space after the C<:> separating keys from values in JSON objects
  and extra whitespace after the C<,> separating key-value pairs and array
  members.
  
  If C<$enable> is false, then the C<encode> method will not add any extra
  space at those places.
  
  This setting has no effect when decoding JSON texts.
  
  Example, space_before and indent disabled, space_after enabled:
  
     {"key": "value"}
  
  =head2 relaxed
  
      $json = $json->relaxed([$enable])
      
      $enabled = $json->get_relaxed
  
  If C<$enable> is true (or missing), then C<decode> will accept some
  extensions to normal JSON syntax (see below). C<encode> will not be
  affected in any way. I<Be aware that this option makes you accept invalid
  JSON texts as if they were valid!>. I suggest only to use this option to
  parse application-specific files written by humans (configuration files,
  resource files etc.)
  
  If C<$enable> is false (the default), then C<decode> will only accept
  valid JSON texts.
  
  Currently accepted extensions are:
  
  =over 4
  
  =item * list items can have an end-comma
  
  JSON I<separates> array elements and key-value pairs with commas. This
  can be annoying if you write JSON texts manually and want to be able to
  quickly append elements, so this extension accepts comma at the end of
  such items not just between them:
  
     [
        1,
        2, <- this comma not normally allowed
     ]
     {
        "k1": "v1",
        "k2": "v2", <- this comma not normally allowed
     }
  
  =item * shell-style '#'-comments
  
  Whenever JSON allows whitespace, shell-style comments are additionally
  allowed. They are terminated by the first carriage-return or line-feed
  character, after which more white-space and comments are allowed.
  
    [
       1, # this comment not allowed in JSON
          # neither this one...
    ]
  
  =back
  
  =head2 canonical
  
      $json = $json->canonical([$enable])
      
      $enabled = $json->get_canonical
  
  If C<$enable> is true (or missing), then the C<encode> method will output JSON objects
  by sorting their keys. This is adding a comparatively high overhead.
  
  If C<$enable> is false, then the C<encode> method will output key-value
  pairs in the order Perl stores them (which will likely change between runs
  of the same script, and can change even within the same run from 5.18
  onwards).
  
  This option is useful if you want the same data structure to be encoded as
  the same JSON text (given the same overall settings). If it is disabled,
  the same hash might be encoded differently even if contains the same data,
  as key-value pairs have no inherent ordering in Perl.
  
  This setting has no effect when decoding JSON texts.
  
  This setting has currently no effect on tied hashes.
  
  =head2 allow_nonref
  
      $json = $json->allow_nonref([$enable])
      
      $enabled = $json->get_allow_nonref
  
  Unlike other boolean options, this opotion is enabled by default beginning
  with version C<4.0>.
  
  If C<$enable> is true (or missing), then the C<encode> method can convert a
  non-reference into its corresponding string, number or null JSON value,
  which is an extension to RFC4627. Likewise, C<decode> will accept those JSON
  values instead of croaking.
  
  If C<$enable> is false, then the C<encode> method will croak if it isn't
  passed an arrayref or hashref, as JSON texts must either be an object
  or array. Likewise, C<decode> will croak if given something that is not a
  JSON object or array.
  
  Example, encode a Perl scalar as JSON value with enabled C<allow_nonref>,
  resulting in an invalid JSON text:
  
     JSON->new->allow_nonref->encode ("Hello, World!")
     => "Hello, World!"
  
  =head2 allow_unknown
  
      $json = $json->allow_unknown ([$enable])
      
      $enabled = $json->get_allow_unknown
  
  If C<$enable> is true (or missing), then C<encode> will I<not> throw an
  exception when it encounters values it cannot represent in JSON (for
  example, filehandles) but instead will encode a JSON C<null> value. Note
  that blessed objects are not included here and are handled separately by
  c<allow_blessed>.
  
  If C<$enable> is false (the default), then C<encode> will throw an
  exception when it encounters anything it cannot encode as JSON.
  
  This option does not affect C<decode> in any way, and it is recommended to
  leave it off unless you know your communications partner.
  
  =head2 allow_blessed
  
      $json = $json->allow_blessed([$enable])
      
      $enabled = $json->get_allow_blessed
  
  See L<OBJECT SERIALISATION> for details.
  
  If C<$enable> is true (or missing), then the C<encode> method will not
  barf when it encounters a blessed reference that it cannot convert
  otherwise. Instead, a JSON C<null> value is encoded instead of the object.
  
  If C<$enable> is false (the default), then C<encode> will throw an
  exception when it encounters a blessed object that it cannot convert
  otherwise.
  
  This setting has no effect on C<decode>.
  
  =head2 convert_blessed
  
      $json = $json->convert_blessed([$enable])
      
      $enabled = $json->get_convert_blessed
  
  See L<OBJECT SERIALISATION> for details.
  
  If C<$enable> is true (or missing), then C<encode>, upon encountering a
  blessed object, will check for the availability of the C<TO_JSON> method
  on the object's class. If found, it will be called in scalar context and
  the resulting scalar will be encoded instead of the object.
  
  The C<TO_JSON> method may safely call die if it wants. If C<TO_JSON>
  returns other blessed objects, those will be handled in the same
  way. C<TO_JSON> must take care of not causing an endless recursion cycle
  (== crash) in this case. The name of C<TO_JSON> was chosen because other
  methods called by the Perl core (== not by the user of the object) are
  usually in upper case letters and to avoid collisions with any C<to_json>
  function or method.
  
  If C<$enable> is false (the default), then C<encode> will not consider
  this type of conversion.
  
  This setting has no effect on C<decode>.
  
  =head2 allow_tags (since version 3.0)
  
      $json = $json->allow_tags([$enable])
  
      $enabled = $json->get_allow_tags
  
  See L<OBJECT SERIALISATION> for details.
  
  If C<$enable> is true (or missing), then C<encode>, upon encountering a
  blessed object, will check for the availability of the C<FREEZE> method on
  the object's class. If found, it will be used to serialise the object into
  a nonstandard tagged JSON value (that JSON decoders cannot decode).
  
  It also causes C<decode> to parse such tagged JSON values and deserialise
  them via a call to the C<THAW> method.
  
  If C<$enable> is false (the default), then C<encode> will not consider
  this type of conversion, and tagged JSON values will cause a parse error
  in C<decode>, as if tags were not part of the grammar.
  
  =head2 boolean_values (since version 4.0)
  
      $json->boolean_values([$false, $true])
  
      ($false,  $true) = $json->get_boolean_values
  
  By default, JSON booleans will be decoded as overloaded
  C<$JSON::false> and C<$JSON::true> objects.
  
  With this method you can specify your own boolean values for decoding -
  on decode, JSON C<false> will be decoded as a copy of C<$false>, and JSON
  C<true> will be decoded as C<$true> ("copy" here is the same thing as
  assigning a value to another variable, i.e. C<$copy = $false>).
  
  This is useful when you want to pass a decoded data structure directly
  to other serialisers like YAML, Data::MessagePack and so on.
  
  Note that this works only when you C<decode>. You can set incompatible
  boolean objects (like L<boolean>), but when you C<encode> a data structure
  with such boolean objects, you still need to enable C<convert_blessed>
  (and add a C<TO_JSON> method if necessary).
  
  Calling this method without any arguments will reset the booleans
  to their default values.
  
  C<get_boolean_values> will return both C<$false> and C<$true> values, or
  the empty list when they are set to the default.
  
  =head2 filter_json_object
  
      $json = $json->filter_json_object([$coderef])
  
  When C<$coderef> is specified, it will be called from C<decode> each
  time it decodes a JSON object. The only argument is a reference to
  the newly-created hash. If the code references returns a single scalar
  (which need not be a reference), this value (or rather a copy of it) is
  inserted into the deserialised data structure. If it returns an empty
  list (NOTE: I<not> C<undef>, which is a valid scalar), the original
  deserialised hash will be inserted. This setting can slow down decoding
  considerably.
  
  When C<$coderef> is omitted or undefined, any existing callback will
  be removed and C<decode> will not change the deserialised hash in any
  way.
  
  Example, convert all JSON objects into the integer 5:
  
     my $js = JSON->new->filter_json_object(sub { 5 });
     # returns [5]
     $js->decode('[{}]');
     # returns 5
     $js->decode('{"a":1, "b":2}');
  
  =head2 filter_json_single_key_object
  
      $json = $json->filter_json_single_key_object($key [=> $coderef])
  
  Works remotely similar to C<filter_json_object>, but is only called for
  JSON objects having a single key named C<$key>.
  
  This C<$coderef> is called before the one specified via
  C<filter_json_object>, if any. It gets passed the single value in the JSON
  object. If it returns a single value, it will be inserted into the data
  structure. If it returns nothing (not even C<undef> but the empty list),
  the callback from C<filter_json_object> will be called next, as if no
  single-key callback were specified.
  
  If C<$coderef> is omitted or undefined, the corresponding callback will be
  disabled. There can only ever be one callback for a given key.
  
  As this callback gets called less often then the C<filter_json_object>
  one, decoding speed will not usually suffer as much. Therefore, single-key
  objects make excellent targets to serialise Perl objects into, especially
  as single-key JSON objects are as close to the type-tagged value concept
  as JSON gets (it's basically an ID/VALUE tuple). Of course, JSON does not
  support this in any way, so you need to make sure your data never looks
  like a serialised Perl hash.
  
  Typical names for the single object key are C<__class_whatever__>, or
  C<$__dollars_are_rarely_used__$> or C<}ugly_brace_placement>, or even
  things like C<__class_md5sum(classname)__>, to reduce the risk of clashing
  with real hashes.
  
  Example, decode JSON objects of the form C<< { "__widget__" => <id> } >>
  into the corresponding C<< $WIDGET{<id>} >> object:
  
     # return whatever is in $WIDGET{5}:
     JSON
        ->new
        ->filter_json_single_key_object (__widget__ => sub {
              $WIDGET{ $_[0] }
           })
        ->decode ('{"__widget__": 5')
  
     # this can be used with a TO_JSON method in some "widget" class
     # for serialisation to json:
     sub WidgetBase::TO_JSON {
        my ($self) = @_;
  
        unless ($self->{id}) {
           $self->{id} = ..get..some..id..;
           $WIDGET{$self->{id}} = $self;
        }
  
        { __widget__ => $self->{id} }
     }
  
  =head2 max_depth
  
      $json = $json->max_depth([$maximum_nesting_depth])
      
      $max_depth = $json->get_max_depth
  
  Sets the maximum nesting level (default C<512>) accepted while encoding
  or decoding. If a higher nesting level is detected in JSON text or a Perl
  data structure, then the encoder and decoder will stop and croak at that
  point.
  
  Nesting level is defined by number of hash- or arrayrefs that the encoder
  needs to traverse to reach a given point or the number of C<{> or C<[>
  characters without their matching closing parenthesis crossed to reach a
  given character in a string.
  
  Setting the maximum depth to one disallows any nesting, so that ensures
  that the object is only a single hash/object or array.
  
  If no argument is given, the highest possible setting will be used, which
  is rarely useful.
  
  See L<JSON::XS/SECURITY CONSIDERATIONS> for more info on why this is useful.
  
  =head2 max_size
  
      $json = $json->max_size([$maximum_string_size])
      
      $max_size = $json->get_max_size
  
  Set the maximum length a JSON text may have (in bytes) where decoding is
  being attempted. The default is C<0>, meaning no limit. When C<decode>
  is called on a string that is longer then this many bytes, it will not
  attempt to decode the string but throw an exception. This setting has no
  effect on C<encode> (yet).
  
  If no argument is given, the limit check will be deactivated (same as when
  C<0> is specified).
  
  See L<JSON::XS/SECURITY CONSIDERATIONS> for more info on why this is useful.
  
  =head2 encode
  
      $json_text = $json->encode($perl_scalar)
  
  Converts the given Perl value or data structure to its JSON
  representation. Croaks on error.
  
  =head2 decode
  
      $perl_scalar = $json->decode($json_text)
  
  The opposite of C<encode>: expects a JSON text and tries to parse it,
  returning the resulting simple scalar or reference. Croaks on error.
  
  =head2 decode_prefix
  
      ($perl_scalar, $characters) = $json->decode_prefix($json_text)
  
  This works like the C<decode> method, but instead of raising an exception
  when there is trailing garbage after the first JSON object, it will
  silently stop parsing there and return the number of characters consumed
  so far.
  
  This is useful if your JSON texts are not delimited by an outer protocol
  and you need to know where the JSON text ends.
  
     JSON->new->decode_prefix ("[1] the tail")
     => ([1], 3)
  
  =head1 ADDITIONAL METHODS
  
  The following methods are for this module only.
  
  =head2 backend
  
      $backend = $json->backend
  
  Since 2.92, C<backend> method returns an abstract backend module used currently,
  which should be JSON::Backend::XS (which inherits JSON::XS or Cpanel::JSON::XS),
  or JSON::Backend::PP (which inherits JSON::PP), not to monkey-patch the actual
  backend module globally.
  
  If you need to know what is used actually, use C<isa>, instead of string comparison.
  
  =head2 is_xs
  
      $boolean = $json->is_xs
  
  Returns true if the backend inherits JSON::XS or Cpanel::JSON::XS.
  
  =head2 is_pp
  
      $boolean = $json->is_pp
  
  Returns true if the backend inherits JSON::PP.
  
  =head2 property
  
      $settings = $json->property()
  
  Returns a reference to a hash that holds all the common flag settings.
  
      $json = $json->property('utf8' => 1)
      $value = $json->property('utf8') # 1
  
  You can use this to get/set a value of a particular flag.
  
  =head2 boolean
  
      $boolean_object = JSON->boolean($scalar)
  
  Returns $JSON::true if $scalar contains a true value, $JSON::false otherwise.
  You can use this as a full-qualified function (C<JSON::boolean($scalar)>).
  
  =head1 INCREMENTAL PARSING
  
  This section is also taken from JSON::XS.
  
  In some cases, there is the need for incremental parsing of JSON
  texts. While this module always has to keep both JSON text and resulting
  Perl data structure in memory at one time, it does allow you to parse a
  JSON stream incrementally. It does so by accumulating text until it has
  a full JSON object, which it then can decode. This process is similar to
  using C<decode_prefix> to see if a full JSON object is available, but
  is much more efficient (and can be implemented with a minimum of method
  calls).
  
  This module will only attempt to parse the JSON text once it is sure it
  has enough text to get a decisive result, using a very simple but
  truly incremental parser. This means that it sometimes won't stop as
  early as the full parser, for example, it doesn't detect mismatched
  parentheses. The only thing it guarantees is that it starts decoding as
  soon as a syntactically valid JSON text has been seen. This means you need
  to set resource limits (e.g. C<max_size>) to ensure the parser will stop
  parsing in the presence if syntax errors.
  
  The following methods implement this incremental parser.
  
  =head2 incr_parse
  
      $json->incr_parse( [$string] ) # void context
      
      $obj_or_undef = $json->incr_parse( [$string] ) # scalar context
      
      @obj_or_empty = $json->incr_parse( [$string] ) # list context
  
  This is the central parsing function. It can both append new text and
  extract objects from the stream accumulated so far (both of these
  functions are optional).
  
  If C<$string> is given, then this string is appended to the already
  existing JSON fragment stored in the C<$json> object.
  
  After that, if the function is called in void context, it will simply
  return without doing anything further. This can be used to add more text
  in as many chunks as you want.
  
  If the method is called in scalar context, then it will try to extract
  exactly I<one> JSON object. If that is successful, it will return this
  object, otherwise it will return C<undef>. If there is a parse error,
  this method will croak just as C<decode> would do (one can then use
  C<incr_skip> to skip the erroneous part). This is the most common way of
  using the method.
  
  And finally, in list context, it will try to extract as many objects
  from the stream as it can find and return them, or the empty list
  otherwise. For this to work, there must be no separators (other than
  whitespace) between the JSON objects or arrays, instead they must be
  concatenated back-to-back. If an error occurs, an exception will be
  raised as in the scalar context case. Note that in this case, any
  previously-parsed JSON texts will be lost.
  
  Example: Parse some JSON arrays/objects in a given string and return
  them.
  
      my @objs = JSON->new->incr_parse ("[5][7][1,2]");
  
  =head2 incr_text
  
      $lvalue_string = $json->incr_text
  
  This method returns the currently stored JSON fragment as an lvalue, that
  is, you can manipulate it. This I<only> works when a preceding call to
  C<incr_parse> in I<scalar context> successfully returned an object. Under
  all other circumstances you must not call this function (I mean it.
  although in simple tests it might actually work, it I<will> fail under
  real world conditions). As a special exception, you can also call this
  method before having parsed anything.
  
  That means you can only use this function to look at or manipulate text
  before or after complete JSON objects, not while the parser is in the
  middle of parsing a JSON object.
  
  This function is useful in two cases: a) finding the trailing text after a
  JSON object or b) parsing multiple JSON objects separated by non-JSON text
  (such as commas).
  
  =head2 incr_skip
  
      $json->incr_skip
  
  This will reset the state of the incremental parser and will remove
  the parsed text from the input buffer so far. This is useful after
  C<incr_parse> died, in which case the input buffer and incremental parser
  state is left unchanged, to skip the text parsed so far and to reset the
  parse state.
  
  The difference to C<incr_reset> is that only text until the parse error
  occurred is removed.
  
  =head2 incr_reset
  
      $json->incr_reset
  
  This completely resets the incremental parser, that is, after this call,
  it will be as if the parser had never parsed anything.
  
  This is useful if you want to repeatedly parse JSON objects and want to
  ignore any trailing data, which means you have to reset the parser after
  each successful decode.
  
  =head1 MAPPING
  
  Most of this section is also taken from JSON::XS.
  
  This section describes how the backend modules map Perl values to JSON values and
  vice versa. These mappings are designed to "do the right thing" in most
  circumstances automatically, preserving round-tripping characteristics
  (what you put in comes out as something equivalent).
  
  For the more enlightened: note that in the following descriptions,
  lowercase I<perl> refers to the Perl interpreter, while uppercase I<Perl>
  refers to the abstract Perl language itself.
  
  =head2 JSON -> PERL
  
  =over 4
  
  =item object
  
  A JSON object becomes a reference to a hash in Perl. No ordering of object
  keys is preserved (JSON does not preserver object key ordering itself).
  
  =item array
  
  A JSON array becomes a reference to an array in Perl.
  
  =item string
  
  A JSON string becomes a string scalar in Perl - Unicode codepoints in JSON
  are represented by the same codepoints in the Perl string, so no manual
  decoding is necessary.
  
  =item number
  
  A JSON number becomes either an integer, numeric (floating point) or
  string scalar in perl, depending on its range and any fractional parts. On
  the Perl level, there is no difference between those as Perl handles all
  the conversion details, but an integer may take slightly less memory and
  might represent more values exactly than floating point numbers.
  
  If the number consists of digits only, this module will try to represent
  it as an integer value. If that fails, it will try to represent it as
  a numeric (floating point) value if that is possible without loss of
  precision. Otherwise it will preserve the number as a string value (in
  which case you lose roundtripping ability, as the JSON number will be
  re-encoded to a JSON string).
  
  Numbers containing a fractional or exponential part will always be
  represented as numeric (floating point) values, possibly at a loss of
  precision (in which case you might lose perfect roundtripping ability, but
  the JSON number will still be re-encoded as a JSON number).
  
  Note that precision is not accuracy - binary floating point values cannot
  represent most decimal fractions exactly, and when converting from and to
  floating point, this module only guarantees precision up to but not including
  the least significant bit.
  
  =item true, false
  
  These JSON atoms become C<JSON::true> and C<JSON::false>,
  respectively. They are overloaded to act almost exactly like the numbers
  C<1> and C<0>. You can check whether a scalar is a JSON boolean by using
  the C<JSON::is_bool> function.
  
  =item null
  
  A JSON null atom becomes C<undef> in Perl.
  
  =item shell-style comments (C<< # I<text> >>)
  
  As a nonstandard extension to the JSON syntax that is enabled by the
  C<relaxed> setting, shell-style comments are allowed. They can start
  anywhere outside strings and go till the end of the line.
  
  =item tagged values (C<< (I<tag>)I<value> >>).
  
  Another nonstandard extension to the JSON syntax, enabled with the
  C<allow_tags> setting, are tagged values. In this implementation, the
  I<tag> must be a perl package/class name encoded as a JSON string, and the
  I<value> must be a JSON array encoding optional constructor arguments.
  
  See L<OBJECT SERIALISATION>, below, for details.
  
  =back
  
  
  =head2 PERL -> JSON
  
  The mapping from Perl to JSON is slightly more difficult, as Perl is a
  truly typeless language, so we can only guess which JSON type is meant by
  a Perl value.
  
  =over 4
  
  =item hash references
  
  Perl hash references become JSON objects. As there is no inherent
  ordering in hash keys (or JSON objects), they will usually be encoded
  in a pseudo-random order. This module can optionally sort the hash keys
  (determined by the I<canonical> flag), so the same data structure will
  serialise to the same JSON text (given same settings and version of
  the same backend), but this incurs a runtime overhead and is only rarely useful,
  e.g. when you want to compare some JSON text against another for equality.
  
  =item array references
  
  Perl array references become JSON arrays.
  
  =item other references
  
  Other unblessed references are generally not allowed and will cause an
  exception to be thrown, except for references to the integers C<0> and
  C<1>, which get turned into C<false> and C<true> atoms in JSON. You can
  also use C<JSON::false> and C<JSON::true> to improve readability.
  
     encode_json [\0,JSON::true]      # yields [false,true]
  
  =item JSON::true, JSON::false, JSON::null
  
  These special values become JSON true and JSON false values,
  respectively. You can also use C<\1> and C<\0> directly if you want.
  
  =item blessed objects
  
  Blessed objects are not directly representable in JSON, but C<JSON::XS>
  allows various ways of handling objects. See L<OBJECT SERIALISATION>,
  below, for details.
  
  =item simple scalars
  
  Simple Perl scalars (any scalar that is not a reference) are the most
  difficult objects to encode: this module will encode undefined scalars as
  JSON C<null> values, scalars that have last been used in a string context
  before encoding as JSON strings, and anything else as number value:
  
     # dump as number
     encode_json [2]                      # yields [2]
     encode_json [-3.0e17]                # yields [-3e+17]
     my $value = 5; encode_json [$value]  # yields [5]
  
     # used as string, so dump as string
     print $value;
     encode_json [$value]                 # yields ["5"]
  
     # undef becomes null
     encode_json [undef]                  # yields [null]
  
  You can force the type to be a string by stringifying it:
  
     my $x = 3.1; # some variable containing a number
     "$x";        # stringified
     $x .= "";    # another, more awkward way to stringify
     print $x;    # perl does it for you, too, quite often
  
  You can force the type to be a number by numifying it:
  
     my $x = "3"; # some variable containing a string
     $x += 0;     # numify it, ensuring it will be dumped as a number
     $x *= 1;     # same thing, the choice is yours.
  
  You can not currently force the type in other, less obscure, ways. Tell me
  if you need this capability (but don't forget to explain why it's needed
  :).
  
  Since version 2.91_01, JSON::PP uses a different number detection logic
  that converts a scalar that is possible to turn into a number safely.
  The new logic is slightly faster, and tends to help people who use older
  perl or who want to encode complicated data structure. However, this may
  results in a different JSON text from the one JSON::XS encodes (and
  thus may break tests that compare entire JSON texts). If you do
  need the previous behavior for better compatibility or for finer control,
  set PERL_JSON_PP_USE_B environmental variable to true before you
  C<use> JSON.
  
  Note that numerical precision has the same meaning as under Perl (so
  binary to decimal conversion follows the same rules as in Perl, which
  can differ to other languages). Also, your perl interpreter might expose
  extensions to the floating point numbers of your platform, such as
  infinities or NaN's - these cannot be represented in JSON, and it is an
  error to pass those in.
  
  JSON.pm backend modules trust what you pass to C<encode> method
  (or C<encode_json> function) is a clean, validated data structure with
  values that can be represented as valid JSON values only, because it's
  not from an external data source (as opposed to JSON texts you pass to
  C<decode> or C<decode_json>, which JSON backends consider tainted and
  don't trust). As JSON backends don't know exactly what you and consumers
  of your JSON texts want the unexpected values to be (you may want to
  convert them into null, or to stringify them with or without
  normalisation (string representation of infinities/NaN may vary
  depending on platforms), or to croak without conversion), you're advised
  to do what you and your consumers need before you encode, and also not
  to numify values that may start with values that look like a number
  (including infinities/NaN), without validating.
  
  =back
  
  =head2 OBJECT SERIALISATION
  
  As JSON cannot directly represent Perl objects, you have to choose between
  a pure JSON representation (without the ability to deserialise the object
  automatically again), and a nonstandard extension to the JSON syntax,
  tagged values.
  
  =head3 SERIALISATION
  
  What happens when this module encounters a Perl object depends on the
  C<allow_blessed>, C<convert_blessed> and C<allow_tags> settings, which
  are used in this order:
  
  =over 4
  
  =item 1. C<allow_tags> is enabled and the object has a C<FREEZE> method.
  
  In this case, C<JSON> creates a tagged JSON value, using a nonstandard
  extension to the JSON syntax.
  
  This works by invoking the C<FREEZE> method on the object, with the first
  argument being the object to serialise, and the second argument being the
  constant string C<JSON> to distinguish it from other serialisers.
  
  The C<FREEZE> method can return any number of values (i.e. zero or
  more). These values and the paclkage/classname of the object will then be
  encoded as a tagged JSON value in the following format:
  
     ("classname")[FREEZE return values...]
  
  e.g.:
  
     ("URI")["http://www.google.com/"]
     ("MyDate")[2013,10,29]
     ("ImageData::JPEG")["Z3...VlCg=="]
  
  For example, the hypothetical C<My::Object> C<FREEZE> method might use the
  objects C<type> and C<id> members to encode the object:
  
     sub My::Object::FREEZE {
        my ($self, $serialiser) = @_;
  
        ($self->{type}, $self->{id})
     }
  
  =item 2. C<convert_blessed> is enabled and the object has a C<TO_JSON> method.
  
  In this case, the C<TO_JSON> method of the object is invoked in scalar
  context. It must return a single scalar that can be directly encoded into
  JSON. This scalar replaces the object in the JSON text.
  
  For example, the following C<TO_JSON> method will convert all L<URI>
  objects to JSON strings when serialised. The fact that these values
  originally were L<URI> objects is lost.
  
     sub URI::TO_JSON {
        my ($uri) = @_;
        $uri->as_string
     }
  
  =item 3. C<allow_blessed> is enabled.
  
  The object will be serialised as a JSON null value.
  
  =item 4. none of the above
  
  If none of the settings are enabled or the respective methods are missing,
  this module throws an exception.
  
  =back
  
  =head3 DESERIALISATION
  
  For deserialisation there are only two cases to consider: either
  nonstandard tagging was used, in which case C<allow_tags> decides,
  or objects cannot be automatically be deserialised, in which
  case you can use postprocessing or the C<filter_json_object> or
  C<filter_json_single_key_object> callbacks to get some real objects our of
  your JSON.
  
  This section only considers the tagged value case: a tagged JSON object
  is encountered during decoding and C<allow_tags> is disabled, a parse
  error will result (as if tagged values were not part of the grammar).
  
  If C<allow_tags> is enabled, this module will look up the C<THAW> method
  of the package/classname used during serialisation (it will not attempt
  to load the package as a Perl module). If there is no such method, the
  decoding will fail with an error.
  
  Otherwise, the C<THAW> method is invoked with the classname as first
  argument, the constant string C<JSON> as second argument, and all the
  values from the JSON array (the values originally returned by the
  C<FREEZE> method) as remaining arguments.
  
  The method must then return the object. While technically you can return
  any Perl scalar, you might have to enable the C<allow_nonref> setting to
  make that work in all cases, so better return an actual blessed reference.
  
  As an example, let's implement a C<THAW> function that regenerates the
  C<My::Object> from the C<FREEZE> example earlier:
  
     sub My::Object::THAW {
        my ($class, $serialiser, $type, $id) = @_;
  
        $class->new (type => $type, id => $id)
     }
  
  
  =head1 ENCODING/CODESET FLAG NOTES
  
  This section is taken from JSON::XS.
  
  The interested reader might have seen a number of flags that signify
  encodings or codesets - C<utf8>, C<latin1> and C<ascii>. There seems to be
  some confusion on what these do, so here is a short comparison:
  
  C<utf8> controls whether the JSON text created by C<encode> (and expected
  by C<decode>) is UTF-8 encoded or not, while C<latin1> and C<ascii> only
  control whether C<encode> escapes character values outside their respective
  codeset range. Neither of these flags conflict with each other, although
  some combinations make less sense than others.
  
  Care has been taken to make all flags symmetrical with respect to
  C<encode> and C<decode>, that is, texts encoded with any combination of
  these flag values will be correctly decoded when the same flags are used
  - in general, if you use different flag settings while encoding vs. when
  decoding you likely have a bug somewhere.
  
  Below comes a verbose discussion of these flags. Note that a "codeset" is
  simply an abstract set of character-codepoint pairs, while an encoding
  takes those codepoint numbers and I<encodes> them, in our case into
  octets. Unicode is (among other things) a codeset, UTF-8 is an encoding,
  and ISO-8859-1 (= latin 1) and ASCII are both codesets I<and> encodings at
  the same time, which can be confusing.
  
  =over 4
  
  =item C<utf8> flag disabled
  
  When C<utf8> is disabled (the default), then C<encode>/C<decode> generate
  and expect Unicode strings, that is, characters with high ordinal Unicode
  values (> 255) will be encoded as such characters, and likewise such
  characters are decoded as-is, no changes to them will be done, except
  "(re-)interpreting" them as Unicode codepoints or Unicode characters,
  respectively (to Perl, these are the same thing in strings unless you do
  funny/weird/dumb stuff).
  
  This is useful when you want to do the encoding yourself (e.g. when you
  want to have UTF-16 encoded JSON texts) or when some other layer does
  the encoding for you (for example, when printing to a terminal using a
  filehandle that transparently encodes to UTF-8 you certainly do NOT want
  to UTF-8 encode your data first and have Perl encode it another time).
  
  =item C<utf8> flag enabled
  
  If the C<utf8>-flag is enabled, C<encode>/C<decode> will encode all
  characters using the corresponding UTF-8 multi-byte sequence, and will
  expect your input strings to be encoded as UTF-8, that is, no "character"
  of the input string must have any value > 255, as UTF-8 does not allow
  that.
  
  The C<utf8> flag therefore switches between two modes: disabled means you
  will get a Unicode string in Perl, enabled means you get an UTF-8 encoded
  octet/binary string in Perl.
  
  =item C<latin1> or C<ascii> flags enabled
  
  With C<latin1> (or C<ascii>) enabled, C<encode> will escape characters
  with ordinal values > 255 (> 127 with C<ascii>) and encode the remaining
  characters as specified by the C<utf8> flag.
  
  If C<utf8> is disabled, then the result is also correctly encoded in those
  character sets (as both are proper subsets of Unicode, meaning that a
  Unicode string with all character values < 256 is the same thing as a
  ISO-8859-1 string, and a Unicode string with all character values < 128 is
  the same thing as an ASCII string in Perl).
  
  If C<utf8> is enabled, you still get a correct UTF-8-encoded string,
  regardless of these flags, just some more characters will be escaped using
  C<\uXXXX> then before.
  
  Note that ISO-8859-1-I<encoded> strings are not compatible with UTF-8
  encoding, while ASCII-encoded strings are. That is because the ISO-8859-1
  encoding is NOT a subset of UTF-8 (despite the ISO-8859-1 I<codeset> being
  a subset of Unicode), while ASCII is.
  
  Surprisingly, C<decode> will ignore these flags and so treat all input
  values as governed by the C<utf8> flag. If it is disabled, this allows you
  to decode ISO-8859-1- and ASCII-encoded strings, as both strict subsets of
  Unicode. If it is enabled, you can correctly decode UTF-8 encoded strings.
  
  So neither C<latin1> nor C<ascii> are incompatible with the C<utf8> flag -
  they only govern when the JSON output engine escapes a character or not.
  
  The main use for C<latin1> is to relatively efficiently store binary data
  as JSON, at the expense of breaking compatibility with most JSON decoders.
  
  The main use for C<ascii> is to force the output to not contain characters
  with values > 127, which means you can interpret the resulting string
  as UTF-8, ISO-8859-1, ASCII, KOI8-R or most about any character set and
  8-bit-encoding, and still get the same data structure back. This is useful
  when your channel for JSON transfer is not 8-bit clean or the encoding
  might be mangled in between (e.g. in mail), and works because ASCII is a
  proper subset of most 8-bit and multibyte encodings in use in the world.
  
  =back
  
  =head1 BACKWARD INCOMPATIBILITY
  
  Since version 2.90, stringification (and string comparison) for
  C<JSON::true> and C<JSON::false> has not been overloaded. It shouldn't
  matter as long as you treat them as boolean values, but a code that
  expects they are stringified as "true" or "false" doesn't work as
  you have expected any more.
  
      if (JSON::true eq 'true') {  # now fails
  
      print "The result is $JSON::true now."; # => The result is 1 now.
  
  And now these boolean values don't inherit JSON::Boolean, either.
  When you need to test a value is a JSON boolean value or not, use
  C<JSON::is_bool> function, instead of testing the value inherits
  a particular boolean class or not.
  
  =head1 BUGS
  
  Please report bugs on backend selection and additional features
  this module provides to RT or GitHub issues for this module:
  
  L<https://rt.cpan.org/Public/Dist/Display.html?Queue=JSON>
  
  L<https://github.com/makamaka/JSON/issues>
  
  As for bugs on a specific behavior, please report to the author
  of the backend module you are using.
  
  As for new features and requests to change common behaviors, please
  ask the author of JSON::XS (Marc Lehmann, E<lt>schmorp[at]schmorp.deE<gt>)
  first, by email (important!), to keep compatibility among JSON.pm
  backends.
  
  =head1 SEE ALSO
  
  L<JSON::XS>, L<Cpanel::JSON::XS>, L<JSON::PP> for backends.
  
  L<JSON::MaybeXS>, an alternative that prefers Cpanel::JSON::XS.
  
  C<RFC4627>(L<http://www.ietf.org/rfc/rfc4627.txt>)
  
  RFC7159 (L<http://www.ietf.org/rfc/rfc7159.txt>)
  
  RFC8259 (L<http://www.ietf.org/rfc/rfc8259.txt>)
  
  =head1 AUTHOR
  
  Makamaka Hannyaharamitu, E<lt>makamaka[at]cpan.orgE<gt>
  
  JSON::XS was written by  Marc Lehmann E<lt>schmorp[at]schmorp.deE<gt>
  
  The release of this new version owes to the courtesy of Marc Lehmann.
  
  =head1 CURRENT MAINTAINER
  
  Kenichi Ishigaki, E<lt>ishigaki[at]cpan.orgE<gt>
  
  =head1 COPYRIGHT AND LICENSE
  
  Copyright 2005-2013 by Makamaka Hannyaharamitu
  
  Most of the documentation is taken from JSON::XS by Marc Lehmann
  
  This library is free software; you can redistribute it and/or modify
  it under the same terms as Perl itself. 
  
  =cut
  
JSON

    $main::fatpacked{"JSON/Color.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'JSON_COLOR';
  package JSON::Color;
  
  use 5.010001;
  use strict;
  use warnings;
  
  our $sul_available = eval { require Scalar::Util::LooksLikeNumber; 1 } ? 1:0;
  use Term::ANSIColor qw(:constants);
  
  # PUSHCOLOR and LOCALCOLOR cannot be used, they are functions, not escape codes
  
  require Exporter;
  our @ISA       = qw(Exporter);
  our @EXPORT_OK = qw(encode_json);
  
  our $VERSION = '0.12'; # VERSION
  
  our %theme = (
      start_quote         => BOLD . BRIGHT_GREEN,
      end_quote           => RESET,
      start_string        => GREEN,
      end_string          => RESET,
      start_string_escape => BOLD,
      end_string_escape   => RESET . GREEN, # back to string
      start_number        => BOLD . BRIGHT_MAGENTA,
      end_number          => RESET,
      start_bool          => CYAN,
      end_bool            => RESET,
      start_null          => CYAN,
      end_null            => RESET,
      start_object_key    => MAGENTA,
      end_object_key      => RESET,
      start_object_key_escape => BOLD,
      end_object_key_escape   => RESET . MAGENTA, # back to object key
      start_linum         => REVERSE . WHITE,
      end_linum           => RESET,
  );
  
  my %esc = (
      "\n" => '\n',
      "\r" => '\r',
      "\t" => '\t',
      "\f" => '\f',
      "\b" => '\b',
      "\"" => '\"',
      "\\" => '\\\\',
      "\'" => '\\\'',
  );
  sub _string {
      my ($value, $opts) = @_;
  
      my ($sq, $eq, $ss, $es, $sse, $ese);
      if ($opts->{obj_key}) {
          $sq  = $theme{start_object_key};
          $eq  = $theme{end_object_key};
          $ss  = $theme{start_object_key};
          $es  = $theme{end_object_key};
          $sse = $theme{start_object_key_escape};
          $ese = $theme{end_object_key_escape};
      } else {
          $sq  = $theme{start_quote};
          $eq  = $theme{end_quote};
          $ss  = $theme{start_string};
          $es  = $theme{end_string};
          $sse = $theme{start_string_escape};
          $ese = $theme{end_string_escape};
      }
  
      $value =~ s/([\x22\x5c\n\r\t\f\b])|([\x00-\x08\x0b\x0e-\x1f])/
          join("",
               $sse,
               $1 ? $esc{$1} : '\\u00' . unpack('H2', $2),
               $ese,
           )
              /eg;
  
      return join(
          "",
          $sq, '"', $eq,
          $ss, $value, $es,
          $sq, '"', $eq,
      );
  }
  
  sub _number {
      my ($value, $opts) = @_;
  
      return join(
          "",
          $theme{start_number}, $value, $theme{end_number},
      );
  }
  
  sub _null {
      my ($value, $opts) = @_;
  
      return join(
          "",
          $theme{start_null}, "null", $theme{end_null},
      );
  }
  
  sub _bool {
      my ($value, $opts) = @_;
  
      return join(
          "",
          $theme{start_bool}, "$value", $theme{end_bool},
      );
  }
  
  sub _array {
      my ($value, $opts) = @_;
  
      return "[]" unless @$value;
      my $indent  = $opts->{pretty} ? "   " x  $opts->{_indent}    : "";
      my $indent2 = $opts->{pretty} ? "   " x ($opts->{_indent}+1) : "";
      my $nl      = $opts->{pretty} ? "\n" : "";
      local $opts->{_indent} = $opts->{_indent}+1;
      return join(
          "",
          "[$nl",
          (map {
              $indent2,
              _encode($value->[$_], $opts),
              $_ == @$value-1 ? $nl : ",$nl",
          } 0..@$value-1),
          $indent, "]",
      );
  }
  
  sub _hash {
      my ($value, $opts) = @_;
  
      return "{}" unless keys %$value;
      my $indent  = $opts->{pretty} ? "   " x  $opts->{_indent}    : "";
      my $indent2 = $opts->{pretty} ? "   " x ($opts->{_indent}+1) : "";
      my $nl      = $opts->{pretty} ? "\n" : "";
      my $colon   = $opts->{pretty} ? ": " : ":";
      my @res;
  
      push @res, "{$nl";
      my @k;
      if ($opts->{sort_by}) {
          @k = sort { $opts->{sort_by}->() } keys %$value;
      } else {
          @k = sort keys(%$value);
      }
      local $opts->{_indent} = $opts->{_indent}+1;
      for (0..@k-1) {
          my $k = $k[$_];
          push @res, (
              $indent2,
              _string($k, {obj_key=>1}),
              $colon,
              _encode($value->{$k}, $opts),
              $_ == @k-1 ? $nl : ",$nl",
          );
      }
      push @res, $indent, "}";
      join "", @res;
  }
  
  sub _encode {
      my ($data, $opts) = @_;
  
      my $ref = ref($data);
  
      if (!defined($data)) {
          return _null($data, $opts);
      } elsif ($ref eq 'ARRAY') {
          return _array($data, $opts);
      } elsif ($ref eq 'HASH') {
          return _hash($data, $opts);
      } elsif ($ref eq 'JSON::XS::Boolean' || $ref eq 'JSON::PP::Boolean') {
          return _bool($data, $opts);
      } elsif (!$ref) {
          if ($sul_available &&
                  Scalar::Util::LooksLikeNumber::looks_like_number($data) =~
                    /^(4|12|4352|8704)$/o) {
              return _number($data, $opts);
          } else {
              return _string($data, $opts);
          }
      } else {
          die "Can't encode $data";
      }
  }
  
  sub encode_json {
      my ($value, $opts) = @_;
      $opts //= {};
      $opts->{_indent} //= 0;
      my $res = _encode($value , $opts);
  
      if ($opts->{linum}) {
          my $lines = 0;
          $lines++ while $res =~ /^/mog;
          my $fmt = "%".length($lines)."d";
          my $i = 0;
          $res =~ s/^/
              $theme{start_linum} . sprintf($fmt, ++$i) . $theme{end_linum}
                  /meg;
      }
      $res;
  }
  
  1;
  # ABSTRACT: Encode to colored JSON
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  JSON::Color - Encode to colored JSON
  
  =head1 VERSION
  
  This document describes version 0.12 of JSON::Color (from Perl distribution JSON-Color), released on 2016-08-23.
  
  =head1 SYNOPSIS
  
   use JSON::Color qw(encode_json);
   say encode_json([1, "two", {three => 4}]);
  
  =head1 DESCRIPTION
  
  This module generates JSON, colorized with ANSI escape sequences.
  
  To change the color, see the C<%theme> in the source code. In theory you can
  also modify it to colorize using HTML.
  
  =head1 FUNCTIONS
  
  =head2 encode_json($data, \%opts) => STR
  
  Encode to JSON. Will die on error (e.g. when encountering non-encodeable data
  like Regexp or file handle).
  
  Known options:
  
  =over
  
  =item * pretty => BOOL (default: 0)
  
  Pretty-print.
  
  =item * linum => BOOL (default: 0)
  
  Show line number.
  
  =item * sort_by => CODE
  
  If specified, then sorting of hash keys will be done using this sort subroutine.
  This is similar to the C<sort_by> option in the L<JSON> module. Note that code
  is executed in C<JSON::Color> namespace, example:
  
   # reverse sort
   encode_json(..., {sort_by => sub { $JSON::Color::b cmp $JSON::Color::a }});
  
  Another example, using L<Sort::ByExample>:
  
   use Sort::ByExample cmp => {-as => 'by_eg', example => [qw/foo bar baz/]};
   encode_json(..., {sort_by => sub { by_eg($JSON::Color::a, $JSON::Color::b) }});
  
  =back
  
  =head1 FAQ
  
  =head2 What about loading?
  
  Use L<JSON>.
  
  =head2 How to handle non-encodeable data?
  
  Use L<Data::Clean::JSON>.
  
  =head2 Why do numbers become strings?
  
  Example:
  
   % perl -MJSON::Color=encode_json -E'say encode_json([1, "1"])'
   ["1","1"]
  
  To detect whether a scalar is a number (e.g. differentiate between "1" and 1),
  the XS module L<Scalar::Util::LooksLikeNumber> is used. This is set as an
  optional prerequisite, so you'll need to install it separately. After the
  prerequisite is installed:
  
   % perl -MJSON::Color=encode_json -E'say encode_json([1, "1"])'
   [1,"1"]
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/JSON-Color>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-JSON-Color>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=JSON-Color>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  To colorize with HTML, you can try L<Syntax::Highlight::JSON>.
  
  L<Syntax::SourceHighlight> can also colorize JSON/JavaScript to HTML or ANSI
  escape. It requires the GNU Source-highlight library.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
JSON_COLOR

    $main::fatpacked{"JSON/MaybeXS.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'JSON_MAYBEXS';
  package JSON::MaybeXS;
  
  use strict;
  use warnings FATAL => 'all';
  use base qw(Exporter);
  
  our $VERSION = '1.004000';
  $VERSION = eval $VERSION;
  
  sub _choose_json_module {
      return 'Cpanel::JSON::XS' if $INC{'Cpanel/JSON/XS.pm'};
      return 'JSON::XS'         if $INC{'JSON/XS.pm'};
  
      my @err;
  
      return 'Cpanel::JSON::XS' if eval { require Cpanel::JSON::XS; 1; };
      push @err, "Error loading Cpanel::JSON::XS: $@";
  
      return 'JSON::XS' if eval { require JSON::XS; 1; };
      push @err, "Error loading JSON::XS: $@";
  
      return 'JSON::PP' if eval { require JSON::PP; 1 };
      push @err, "Error loading JSON::PP: $@";
  
      die join( "\n", "Couldn't load a JSON module:", @err );
  
  }
  
  BEGIN {
      our $JSON_Class = _choose_json_module();
      $JSON_Class->import(qw(encode_json decode_json));
      no strict 'refs';
      *$_ = $JSON_Class->can($_)
        for qw(true false);
  }
  
  our @EXPORT = qw(encode_json decode_json JSON);
  my @EXPORT_ALL = qw(is_bool);
  our @EXPORT_OK = qw(is_bool to_json from_json);
  our %EXPORT_TAGS = ( all => [ @EXPORT, @EXPORT_ALL ],
                       legacy => [ @EXPORT, @EXPORT_OK ],
                     );
  
  sub JSON () { our $JSON_Class }
  
  sub new {
    shift;
    my %args = @_ == 1 ? %{$_[0]} : @_;
    my $new = (our $JSON_Class)->new;
    $new->$_($args{$_}) for keys %args;
    return $new;
  }
  
  use Scalar::Util ();
  
  sub is_bool {
    die 'is_bool is not a method' if $_[1];
  
    Scalar::Util::blessed($_[0])
      and ($_[0]->isa('JSON::XS::Boolean')
        or $_[0]->isa('Cpanel::JSON::XS::Boolean')
        or $_[0]->isa('JSON::PP::Boolean'));
  }
  
  # (mostly) CopyPasta from JSON.pm version 2.90
  use Carp ();
  
  sub from_json ($@) {
      if ( ref($_[0]) =~ /^JSON/ or $_[0] =~ /^JSON/ ) {
          Carp::croak "from_json should not be called as a method.";
      }
      my $json = JSON()->new;
  
      if (@_ == 2 and ref $_[1] eq 'HASH') {
          my $opt  = $_[1];
          for my $method (keys %$opt) {
              $json->$method( $opt->{$method} );
          }
      }
  
      return $json->decode( $_[0] );
  }
  
  sub to_json ($@) {
      if (
          ref($_[0]) =~ /^JSON/
          or (@_ > 2 and $_[0] =~ /^JSON/)
            ) {
                 Carp::croak "to_json should not be called as a method.";
      }
      my $json = JSON()->new;
  
      if (@_ == 2 and ref $_[1] eq 'HASH') {
          my $opt  = $_[1];
          for my $method (keys %$opt) {
              $json->$method( $opt->{$method} );
          }
      }
  
      $json->encode($_[0]);
  }
  
  1;
  
  =head1 NAME
  
  JSON::MaybeXS - Use L<Cpanel::JSON::XS> with a fallback to L<JSON::XS> and L<JSON::PP>
  
  =head1 SYNOPSIS
  
    use JSON::MaybeXS;
  
    my $data_structure = decode_json($json_input);
  
    my $json_output = encode_json($data_structure);
  
    my $json = JSON()->new;
  
    my $json_with_args = JSON::MaybeXS->new(utf8 => 1); # or { utf8 => 1 }
  
  =head1 DESCRIPTION
  
  This module first checks to see if either L<Cpanel::JSON::XS> or
  L<JSON::XS> is already loaded, in which case it uses that module. Otherwise
  it tries to load L<Cpanel::JSON::XS>, then L<JSON::XS>, then L<JSON::PP>
  in order, and either uses the first module it finds or throws an error.
  
  It then exports the C<encode_json> and C<decode_json> functions from the
  loaded module, along with a C<JSON> constant that returns the class name
  for calling C<new> on.
  
  If you're writing fresh code rather than replacing L<JSON.pm|JSON> usage, you might
  want to pass options as constructor args rather than calling mutators, so
  we provide our own C<new> method that supports that.
  
  =head1 EXPORTS
  
  C<encode_json>, C<decode_json> and C<JSON> are exported by default; C<is_bool>
  is exported on request.
  
  To import only some symbols, specify them on the C<use> line:
  
    use JSON::MaybeXS qw(encode_json decode_json is_bool); # functions only
  
    use JSON::MaybeXS qw(JSON); # JSON constant only
  
  To import all available sensible symbols (C<encode_json>, C<decode_json>, and
  C<is_bool>), use C<:all>:
  
    use JSON::MaybeXS ':all';
  
  To import all symbols including those needed by legacy apps that use L<JSON::PP>:
  
    use JSON::MaybeXS ':legacy';
  
  This imports the C<to_json> and C<from_json> symbols as well as everything in
  C<:all>.  NOTE: This is to support legacy code that makes extensive
  use of C<to_json> and C<from_json> which you are not yet in a position to
  refactor.  DO NOT use this import tag in new code, in order to avoid
  the crawling horrors of getting UTF-8 support subtly wrong.  See the
  documentation for L<JSON> for further details.
  
  =head2 encode_json
  
  This is the C<encode_json> function provided by the selected implementation
  module, and takes a perl data structure which is serialised to JSON text.
  
    my $json_text = encode_json($data_structure);
  
  =head2 decode_json
  
  This is the C<decode_json> function provided by the selected implementation
  module, and takes a string of JSON text to deserialise to a perl data structure.
  
    my $data_structure = decode_json($json_text);
  
  =head2 to_json, from_json
  
  See L<JSON> for details.  These are included to support legacy code
  B<only>.
  
  =head2 JSON
  
  The C<JSON> constant returns the selected implementation module's name for
  use as a class name - so:
  
    my $json_obj = JSON()->new; # returns a Cpanel::JSON::XS or JSON::PP object
  
  and that object can then be used normally:
  
    my $data_structure = $json_obj->decode($json_text); # etc.
  
  The use of parentheses here is optional, and only used as a hint to the reader
  that this use of C<JSON> is a I<subroutine> call, I<not> a class name.
  
  =head2 is_bool
  
    $is_boolean = is_bool($scalar)
  
  Returns true if the passed scalar represents either C<true> or
  C<false>, two constants that act like C<1> and C<0>, respectively
  and are used to represent JSON C<true> and C<false> values in Perl.
  
  Since this is a bare sub in the various backend classes, it cannot be called as
  a class method like the other interfaces; it must be called as a function, with
  no invocant.  It supports the representation used in all JSON backends.
  
  =head1 CONSTRUCTOR
  
  =head2 new
  
  With L<JSON::PP>, L<JSON::XS> and L<Cpanel::JSON::XS> you are required to call
  mutators to set options, such as:
  
    my $json = $class->new->utf8(1)->pretty(1);
  
  Since this is a trifle irritating and noticeably un-perlish, we also offer:
  
    my $json = JSON::MaybeXS->new(utf8 => 1, pretty => 1);
  
  which works equivalently to the above (and in the usual tradition will accept
  a hashref instead of a hash, should you so desire).
  
  The resulting object is blessed into the underlying backend, which offers (at
  least) the methods C<encode> and C<decode>.
  
  =head1 BOOLEANS
  
  To include JSON-aware booleans (C<true>, C<false>) in your data, just do:
  
      use JSON::MaybeXS;
      my $true = JSON()->true;
      my $false = JSON()->false;
  
  The booleans are also available as subs or methods on JSON::MaybeXS.
  
      use JSON::MaybeXS ();
      my $true = JSON::MaybeXS::true;
      my $true = JSON::MaybeXS->true;
      my $false = JSON::MaybeXS::false;
      my $false = JSON::MaybeXS->false;
  
  =head1 CONVERTING FROM JSON::Any
  
  L<JSON::Any> used to be the favoured compatibility layer above the various
  JSON backends, but over time has grown a lot of extra code to deal with legacy
  backends (e.g. L<JSON::Syck>) that are no longer needed.  This is a rough guide of translating such code:
  
  Change code from:
  
      use JSON::Any;
      my $json = JSON::Any->new->objToJson($data);    # or to_json($data), or Dump($data)
  
  to:
  
      use JSON::MaybeXS;
      my $json = encode_json($data);
  
  
  Change code from:
  
      use JSON::Any;
      my $data = JSON::Any->new->jsonToObj($json);    # or from_json($json), or Load($json)
  
  to:
  
      use JSON::MaybeXS;
      my $json = decode_json($data);
  
  =head1 CAVEATS
  
  The C<new()> method in this module is technically a factory, not a
  constructor, because the objects it returns will I<NOT> be blessed into the
  C<JSON::MaybeXS> class.
  
  If you are using an object returned by this module as a Moo(se) attribute,
  this type constraint code:
  
      is 'json' => ( isa => 'JSON::MaybeXS' );
  
  will I<NOT> do what you expect. Instead, either rely on the C<JSON> class
  constant described above, as so:
  
      is 'json' => ( isa => JSON::MaybeXS::JSON() );
  
  Alternatively, you can use duck typing:
  
      use Moose::Util::TypeConstraints 'duck_type';
      is 'json' => ( isa => Object , duck_type([qw/ encode decode /]));
  
  =head1 INSTALLATION
  
  At installation time, F<Makefile.PL> will attempt to determine if you have a
  working compiler available, and therefore whether you are able to run XS code.
  If so, L<Cpanel::JSON::XS> will be added to the prerequisite list, unless
  L<JSON::XS> is already installed at a high enough version. L<JSON::XS> may
  also be upgraded to fix any incompatibility issues.
  
  Because running XS code is not mandatory and L<JSON::PP> (which is in perl
  core) is used as a fallback backend, this module is safe to be used in a suite
  of code that is fatpacked or installed into a restricted-resource environment.
  
  You can also prevent any XS dependencies from being installed by setting
  C<PUREPERL_ONLY=1> in F<Makefile.PL> options (or in the C<PERL_MM_OPT>
  environment variable), or using the C<--pp> or C<--pureperl> flags with the
  L<cpanminus client|cpanm>.
  
  =head1 AUTHOR
  
  mst - Matt S. Trout (cpan:MSTROUT) <mst@shadowcat.co.uk>
  
  =head1 CONTRIBUTORS
  
  =over 4
  
  =item * Clinton Gormley <drtech@cpan.org>
  
  =item * Karen Etheridge <ether@cpan.org>
  
  =item * Kieren Diment <diment@gmail.com>
  
  =back
  
  =head1 COPYRIGHT
  
  Copyright (c) 2013 the C<JSON::MaybeXS> L</AUTHOR> and L</CONTRIBUTORS>
  as listed above.
  
  =head1 LICENSE
  
  This library is free software and may be distributed under the same terms
  as perl itself.
  
  =cut
JSON_MAYBEXS

    $main::fatpacked{"JSON/PP.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'JSON_PP';
  package JSON::PP;
  
  # JSON-2.0
  
  use 5.005;
  use strict;
  
  use Exporter ();
  BEGIN { @JSON::PP::ISA = ('Exporter') }
  
  use overload ();
  use JSON::PP::Boolean;
  
  use Carp ();
  #use Devel::Peek;
  
  $JSON::PP::VERSION = '4.02';
  
  @JSON::PP::EXPORT = qw(encode_json decode_json from_json to_json);
  
  # instead of hash-access, i tried index-access for speed.
  # but this method is not faster than what i expected. so it will be changed.
  
  use constant P_ASCII                => 0;
  use constant P_LATIN1               => 1;
  use constant P_UTF8                 => 2;
  use constant P_INDENT               => 3;
  use constant P_CANONICAL            => 4;
  use constant P_SPACE_BEFORE         => 5;
  use constant P_SPACE_AFTER          => 6;
  use constant P_ALLOW_NONREF         => 7;
  use constant P_SHRINK               => 8;
  use constant P_ALLOW_BLESSED        => 9;
  use constant P_CONVERT_BLESSED      => 10;
  use constant P_RELAXED              => 11;
  
  use constant P_LOOSE                => 12;
  use constant P_ALLOW_BIGNUM         => 13;
  use constant P_ALLOW_BAREKEY        => 14;
  use constant P_ALLOW_SINGLEQUOTE    => 15;
  use constant P_ESCAPE_SLASH         => 16;
  use constant P_AS_NONBLESSED        => 17;
  
  use constant P_ALLOW_UNKNOWN        => 18;
  use constant P_ALLOW_TAGS           => 19;
  
  use constant OLD_PERL => $] < 5.008 ? 1 : 0;
  use constant USE_B => $ENV{PERL_JSON_PP_USE_B} || 0;
  
  BEGIN {
      if (USE_B) {
          require B;
      }
  }
  
  BEGIN {
      my @xs_compati_bit_properties = qw(
              latin1 ascii utf8 indent canonical space_before space_after allow_nonref shrink
              allow_blessed convert_blessed relaxed allow_unknown
              allow_tags
      );
      my @pp_bit_properties = qw(
              allow_singlequote allow_bignum loose
              allow_barekey escape_slash as_nonblessed
      );
  
      # Perl version check, Unicode handling is enabled?
      # Helper module sets @JSON::PP::_properties.
      if ( OLD_PERL ) {
          my $helper = $] >= 5.006 ? 'JSON::PP::Compat5006' : 'JSON::PP::Compat5005';
          eval qq| require $helper |;
          if ($@) { Carp::croak $@; }
      }
  
      for my $name (@xs_compati_bit_properties, @pp_bit_properties) {
          my $property_id = 'P_' . uc($name);
  
          eval qq/
              sub $name {
                  my \$enable = defined \$_[1] ? \$_[1] : 1;
  
                  if (\$enable) {
                      \$_[0]->{PROPS}->[$property_id] = 1;
                  }
                  else {
                      \$_[0]->{PROPS}->[$property_id] = 0;
                  }
  
                  \$_[0];
              }
  
              sub get_$name {
                  \$_[0]->{PROPS}->[$property_id] ? 1 : '';
              }
          /;
      }
  
  }
  
  
  
  # Functions
  
  my $JSON; # cache
  
  sub encode_json ($) { # encode
      ($JSON ||= __PACKAGE__->new->utf8)->encode(@_);
  }
  
  
  sub decode_json { # decode
      ($JSON ||= __PACKAGE__->new->utf8)->decode(@_);
  }
  
  # Obsoleted
  
  sub to_json($) {
     Carp::croak ("JSON::PP::to_json has been renamed to encode_json.");
  }
  
  
  sub from_json($) {
     Carp::croak ("JSON::PP::from_json has been renamed to decode_json.");
  }
  
  
  # Methods
  
  sub new {
      my $class = shift;
      my $self  = {
          max_depth   => 512,
          max_size    => 0,
          indent_length => 3,
      };
  
      $self->{PROPS}[P_ALLOW_NONREF] = 1;
  
      bless $self, $class;
  }
  
  
  sub encode {
      return $_[0]->PP_encode_json($_[1]);
  }
  
  
  sub decode {
      return $_[0]->PP_decode_json($_[1], 0x00000000);
  }
  
  
  sub decode_prefix {
      return $_[0]->PP_decode_json($_[1], 0x00000001);
  }
  
  
  # accessor
  
  
  # pretty printing
  
  sub pretty {
      my ($self, $v) = @_;
      my $enable = defined $v ? $v : 1;
  
      if ($enable) { # indent_length(3) for JSON::XS compatibility
          $self->indent(1)->space_before(1)->space_after(1);
      }
      else {
          $self->indent(0)->space_before(0)->space_after(0);
      }
  
      $self;
  }
  
  # etc
  
  sub max_depth {
      my $max  = defined $_[1] ? $_[1] : 0x80000000;
      $_[0]->{max_depth} = $max;
      $_[0];
  }
  
  
  sub get_max_depth { $_[0]->{max_depth}; }
  
  
  sub max_size {
      my $max  = defined $_[1] ? $_[1] : 0;
      $_[0]->{max_size} = $max;
      $_[0];
  }
  
  
  sub get_max_size { $_[0]->{max_size}; }
  
  sub boolean_values {
      my $self = shift;
      if (@_) {
          my ($false, $true) = @_;
          $self->{false} = $false;
          $self->{true} = $true;
          return ($false, $true);
      } else {
          delete $self->{false};
          delete $self->{true};
          return;
      }
  }
  
  sub get_boolean_values {
      my $self = shift;
      if (exists $self->{true} and exists $self->{false}) {
          return @$self{qw/false true/};
      }
      return;
  }
  
  sub filter_json_object {
      if (defined $_[1] and ref $_[1] eq 'CODE') {
          $_[0]->{cb_object} = $_[1];
      } else {
          delete $_[0]->{cb_object};
      }
      $_[0]->{F_HOOK} = ($_[0]->{cb_object} or $_[0]->{cb_sk_object}) ? 1 : 0;
      $_[0];
  }
  
  sub filter_json_single_key_object {
      if (@_ == 1 or @_ > 3) {
          Carp::croak("Usage: JSON::PP::filter_json_single_key_object(self, key, callback = undef)");
      }
      if (defined $_[2] and ref $_[2] eq 'CODE') {
          $_[0]->{cb_sk_object}->{$_[1]} = $_[2];
      } else {
          delete $_[0]->{cb_sk_object}->{$_[1]};
          delete $_[0]->{cb_sk_object} unless %{$_[0]->{cb_sk_object} || {}};
      }
      $_[0]->{F_HOOK} = ($_[0]->{cb_object} or $_[0]->{cb_sk_object}) ? 1 : 0;
      $_[0];
  }
  
  sub indent_length {
      if (!defined $_[1] or $_[1] > 15 or $_[1] < 0) {
          Carp::carp "The acceptable range of indent_length() is 0 to 15.";
      }
      else {
          $_[0]->{indent_length} = $_[1];
      }
      $_[0];
  }
  
  sub get_indent_length {
      $_[0]->{indent_length};
  }
  
  sub sort_by {
      $_[0]->{sort_by} = defined $_[1] ? $_[1] : 1;
      $_[0];
  }
  
  sub allow_bigint {
      Carp::carp("allow_bigint() is obsoleted. use allow_bignum() instead.");
      $_[0]->allow_bignum;
  }
  
  ###############################
  
  ###
  ### Perl => JSON
  ###
  
  
  { # Convert
  
      my $max_depth;
      my $indent;
      my $ascii;
      my $latin1;
      my $utf8;
      my $space_before;
      my $space_after;
      my $canonical;
      my $allow_blessed;
      my $convert_blessed;
  
      my $indent_length;
      my $escape_slash;
      my $bignum;
      my $as_nonblessed;
      my $allow_tags;
  
      my $depth;
      my $indent_count;
      my $keysort;
  
  
      sub PP_encode_json {
          my $self = shift;
          my $obj  = shift;
  
          $indent_count = 0;
          $depth        = 0;
  
          my $props = $self->{PROPS};
  
          ($ascii, $latin1, $utf8, $indent, $canonical, $space_before, $space_after, $allow_blessed,
              $convert_blessed, $escape_slash, $bignum, $as_nonblessed, $allow_tags)
           = @{$props}[P_ASCII .. P_SPACE_AFTER, P_ALLOW_BLESSED, P_CONVERT_BLESSED,
                      P_ESCAPE_SLASH, P_ALLOW_BIGNUM, P_AS_NONBLESSED, P_ALLOW_TAGS];
  
          ($max_depth, $indent_length) = @{$self}{qw/max_depth indent_length/};
  
          $keysort = $canonical ? sub { $a cmp $b } : undef;
  
          if ($self->{sort_by}) {
              $keysort = ref($self->{sort_by}) eq 'CODE' ? $self->{sort_by}
                       : $self->{sort_by} =~ /\D+/       ? $self->{sort_by}
                       : sub { $a cmp $b };
          }
  
          encode_error("hash- or arrayref expected (not a simple scalar, use allow_nonref to allow this)")
               if(!ref $obj and !$props->[ P_ALLOW_NONREF ]);
  
          my $str  = $self->object_to_json($obj);
  
          $str .= "\n" if ( $indent ); # JSON::XS 2.26 compatible
  
          unless ($ascii or $latin1 or $utf8) {
              utf8::upgrade($str);
          }
  
          if ($props->[ P_SHRINK ]) {
              utf8::downgrade($str, 1);
          }
  
          return $str;
      }
  
  
      sub object_to_json {
          my ($self, $obj) = @_;
          my $type = ref($obj);
  
          if($type eq 'HASH'){
              return $self->hash_to_json($obj);
          }
          elsif($type eq 'ARRAY'){
              return $self->array_to_json($obj);
          }
          elsif ($type) { # blessed object?
              if (blessed($obj)) {
  
                  return $self->value_to_json($obj) if ( $obj->isa('JSON::PP::Boolean') );
  
                  if ( $allow_tags and $obj->can('FREEZE') ) {
                      my $obj_class = ref $obj || $obj;
                      $obj = bless $obj, $obj_class;
                      my @results = $obj->FREEZE('JSON');
                      if ( @results and ref $results[0] ) {
                          if ( refaddr( $obj ) eq refaddr( $results[0] ) ) {
                              encode_error( sprintf(
                                  "%s::FREEZE method returned same object as was passed instead of a new one",
                                  ref $obj
                              ) );
                          }
                      }
                      return '("'.$obj_class.'")['.join(',', @results).']';
                  }
  
                  if ( $convert_blessed and $obj->can('TO_JSON') ) {
                      my $result = $obj->TO_JSON();
                      if ( defined $result and ref( $result ) ) {
                          if ( refaddr( $obj ) eq refaddr( $result ) ) {
                              encode_error( sprintf(
                                  "%s::TO_JSON method returned same object as was passed instead of a new one",
                                  ref $obj
                              ) );
                          }
                      }
  
                      return $self->object_to_json( $result );
                  }
  
                  return "$obj" if ( $bignum and _is_bignum($obj) );
  
                  if ($allow_blessed) {
                      return $self->blessed_to_json($obj) if ($as_nonblessed); # will be removed.
                      return 'null';
                  }
                  encode_error( sprintf("encountered object '%s', but neither allow_blessed, convert_blessed nor allow_tags settings are enabled (or TO_JSON/FREEZE method missing)", $obj)
                  );
              }
              else {
                  return $self->value_to_json($obj);
              }
          }
          else{
              return $self->value_to_json($obj);
          }
      }
  
  
      sub hash_to_json {
          my ($self, $obj) = @_;
          my @res;
  
          encode_error("json text or perl structure exceeds maximum nesting level (max_depth set too low?)")
                                           if (++$depth > $max_depth);
  
          my ($pre, $post) = $indent ? $self->_up_indent() : ('', '');
          my $del = ($space_before ? ' ' : '') . ':' . ($space_after ? ' ' : '');
  
          for my $k ( _sort( $obj ) ) {
              if ( OLD_PERL ) { utf8::decode($k) } # key for Perl 5.6 / be optimized
              push @res, $self->string_to_json( $k )
                            .  $del
                            . ( ref $obj->{$k} ? $self->object_to_json( $obj->{$k} ) : $self->value_to_json( $obj->{$k} ) );
          }
  
          --$depth;
          $self->_down_indent() if ($indent);
  
          return '{}' unless @res;
          return '{' . $pre . join( ",$pre", @res ) . $post . '}';
      }
  
  
      sub array_to_json {
          my ($self, $obj) = @_;
          my @res;
  
          encode_error("json text or perl structure exceeds maximum nesting level (max_depth set too low?)")
                                           if (++$depth > $max_depth);
  
          my ($pre, $post) = $indent ? $self->_up_indent() : ('', '');
  
          for my $v (@$obj){
              push @res, ref($v) ? $self->object_to_json($v) : $self->value_to_json($v);
          }
  
          --$depth;
          $self->_down_indent() if ($indent);
  
          return '[]' unless @res;
          return '[' . $pre . join( ",$pre", @res ) . $post . ']';
      }
  
      sub _looks_like_number {
          my $value = shift;
          if (USE_B) {
              my $b_obj = B::svref_2object(\$value);
              my $flags = $b_obj->FLAGS;
              return 1 if $flags & ( B::SVp_IOK() | B::SVp_NOK() ) and !( $flags & B::SVp_POK() );
              return;
          } else {
              no warnings 'numeric';
              # if the utf8 flag is on, it almost certainly started as a string
              return if utf8::is_utf8($value);
              # detect numbers
              # string & "" -> ""
              # number & "" -> 0 (with warning)
              # nan and inf can detect as numbers, so check with * 0
              return unless length((my $dummy = "") & $value);
              return unless 0 + $value eq $value;
              return 1 if $value * 0 == 0;
              return -1; # inf/nan
          }
      }
  
      sub value_to_json {
          my ($self, $value) = @_;
  
          return 'null' if(!defined $value);
  
          my $type = ref($value);
  
          if (!$type) {
              if (_looks_like_number($value)) {
                  return $value;
              }
              return $self->string_to_json($value);
          }
          elsif( blessed($value) and  $value->isa('JSON::PP::Boolean') ){
              return $$value == 1 ? 'true' : 'false';
          }
          else {
              if ((overload::StrVal($value) =~ /=(\w+)/)[0]) {
                  return $self->value_to_json("$value");
              }
  
              if ($type eq 'SCALAR' and defined $$value) {
                  return   $$value eq '1' ? 'true'
                         : $$value eq '0' ? 'false'
                         : $self->{PROPS}->[ P_ALLOW_UNKNOWN ] ? 'null'
                         : encode_error("cannot encode reference to scalar");
              }
  
              if ( $self->{PROPS}->[ P_ALLOW_UNKNOWN ] ) {
                  return 'null';
              }
              else {
                  if ( $type eq 'SCALAR' or $type eq 'REF' ) {
                      encode_error("cannot encode reference to scalar");
                  }
                  else {
                      encode_error("encountered $value, but JSON can only represent references to arrays or hashes");
                  }
              }
  
          }
      }
  
  
      my %esc = (
          "\n" => '\n',
          "\r" => '\r',
          "\t" => '\t',
          "\f" => '\f',
          "\b" => '\b',
          "\"" => '\"',
          "\\" => '\\\\',
          "\'" => '\\\'',
      );
  
  
      sub string_to_json {
          my ($self, $arg) = @_;
  
          $arg =~ s/([\x22\x5c\n\r\t\f\b])/$esc{$1}/g;
          $arg =~ s/\//\\\//g if ($escape_slash);
          $arg =~ s/([\x00-\x08\x0b\x0e-\x1f])/'\\u00' . unpack('H2', $1)/eg;
  
          if ($ascii) {
              $arg = JSON_PP_encode_ascii($arg);
          }
  
          if ($latin1) {
              $arg = JSON_PP_encode_latin1($arg);
          }
  
          if ($utf8) {
              utf8::encode($arg);
          }
  
          return '"' . $arg . '"';
      }
  
  
      sub blessed_to_json {
          my $reftype = reftype($_[1]) || '';
          if ($reftype eq 'HASH') {
              return $_[0]->hash_to_json($_[1]);
          }
          elsif ($reftype eq 'ARRAY') {
              return $_[0]->array_to_json($_[1]);
          }
          else {
              return 'null';
          }
      }
  
  
      sub encode_error {
          my $error  = shift;
          Carp::croak "$error";
      }
  
  
      sub _sort {
          defined $keysort ? (sort $keysort (keys %{$_[0]})) : keys %{$_[0]};
      }
  
  
      sub _up_indent {
          my $self  = shift;
          my $space = ' ' x $indent_length;
  
          my ($pre,$post) = ('','');
  
          $post = "\n" . $space x $indent_count;
  
          $indent_count++;
  
          $pre = "\n" . $space x $indent_count;
  
          return ($pre,$post);
      }
  
  
      sub _down_indent { $indent_count--; }
  
  
      sub PP_encode_box {
          {
              depth        => $depth,
              indent_count => $indent_count,
          };
      }
  
  } # Convert
  
  
  sub _encode_ascii {
      join('',
          map {
              $_ <= 127 ?
                  chr($_) :
              $_ <= 65535 ?
                  sprintf('\u%04x', $_) : sprintf('\u%x\u%x', _encode_surrogates($_));
          } unpack('U*', $_[0])
      );
  }
  
  
  sub _encode_latin1 {
      join('',
          map {
              $_ <= 255 ?
                  chr($_) :
              $_ <= 65535 ?
                  sprintf('\u%04x', $_) : sprintf('\u%x\u%x', _encode_surrogates($_));
          } unpack('U*', $_[0])
      );
  }
  
  
  sub _encode_surrogates { # from perlunicode
      my $uni = $_[0] - 0x10000;
      return ($uni / 0x400 + 0xD800, $uni % 0x400 + 0xDC00);
  }
  
  
  sub _is_bignum {
      $_[0]->isa('Math::BigInt') or $_[0]->isa('Math::BigFloat');
  }
  
  
  
  #
  # JSON => Perl
  #
  
  my $max_intsize;
  
  BEGIN {
      my $checkint = 1111;
      for my $d (5..64) {
          $checkint .= 1;
          my $int   = eval qq| $checkint |;
          if ($int =~ /[eE]/) {
              $max_intsize = $d - 1;
              last;
          }
      }
  }
  
  { # PARSE 
  
      my %escapes = ( #  by Jeremy Muhlich <jmuhlich [at] bitflood.org>
          b    => "\x8",
          t    => "\x9",
          n    => "\xA",
          f    => "\xC",
          r    => "\xD",
          '\\' => '\\',
          '"'  => '"',
          '/'  => '/',
      );
  
      my $text; # json data
      my $at;   # offset
      my $ch;   # first character
      my $len;  # text length (changed according to UTF8 or NON UTF8)
      # INTERNAL
      my $depth;          # nest counter
      my $encoding;       # json text encoding
      my $is_valid_utf8;  # temp variable
      my $utf8_len;       # utf8 byte length
      # FLAGS
      my $utf8;           # must be utf8
      my $max_depth;      # max nest number of objects and arrays
      my $max_size;
      my $relaxed;
      my $cb_object;
      my $cb_sk_object;
  
      my $F_HOOK;
  
      my $allow_bignum;   # using Math::BigInt/BigFloat
      my $singlequote;    # loosely quoting
      my $loose;          # 
      my $allow_barekey;  # bareKey
      my $allow_tags;
  
      my $alt_true;
      my $alt_false;
  
      sub _detect_utf_encoding {
          my $text = shift;
          my @octets = unpack('C4', $text);
          return 'unknown' unless defined $octets[3];
          return ( $octets[0] and  $octets[1]) ? 'UTF-8'
               : (!$octets[0] and  $octets[1]) ? 'UTF-16BE'
               : (!$octets[0] and !$octets[1]) ? 'UTF-32BE'
               : ( $octets[2]                ) ? 'UTF-16LE'
               : (!$octets[2]                ) ? 'UTF-32LE'
               : 'unknown';
      }
  
      sub PP_decode_json {
          my ($self, $want_offset);
  
          ($self, $text, $want_offset) = @_;
  
          ($at, $ch, $depth) = (0, '', 0);
  
          if ( !defined $text or ref $text ) {
              decode_error("malformed JSON string, neither array, object, number, string or atom");
          }
  
          my $props = $self->{PROPS};
  
          ($utf8, $relaxed, $loose, $allow_bignum, $allow_barekey, $singlequote, $allow_tags)
              = @{$props}[P_UTF8, P_RELAXED, P_LOOSE .. P_ALLOW_SINGLEQUOTE, P_ALLOW_TAGS];
  
          ($alt_true, $alt_false) = @$self{qw/true false/};
  
          if ( $utf8 ) {
              $encoding = _detect_utf_encoding($text);
              if ($encoding ne 'UTF-8' and $encoding ne 'unknown') {
                  require Encode;
                  Encode::from_to($text, $encoding, 'utf-8');
              } else {
                  utf8::downgrade( $text, 1 ) or Carp::croak("Wide character in subroutine entry");
              }
          }
          else {
              utf8::upgrade( $text );
              utf8::encode( $text );
          }
  
          $len = length $text;
  
          ($max_depth, $max_size, $cb_object, $cb_sk_object, $F_HOOK)
               = @{$self}{qw/max_depth  max_size cb_object cb_sk_object F_HOOK/};
  
          if ($max_size > 1) {
              use bytes;
              my $bytes = length $text;
              decode_error(
                  sprintf("attempted decode of JSON text of %s bytes size, but max_size is set to %s"
                      , $bytes, $max_size), 1
              ) if ($bytes > $max_size);
          }
  
          white(); # remove head white space
  
          decode_error("malformed JSON string, neither array, object, number, string or atom") unless defined $ch; # Is there a first character for JSON structure?
  
          my $result = value();
  
          if ( !$props->[ P_ALLOW_NONREF ] and !ref $result ) {
                  decode_error(
                  'JSON text must be an object or array (but found number, string, true, false or null,'
                         . ' use allow_nonref to allow this)', 1);
          }
  
          Carp::croak('something wrong.') if $len < $at; # we won't arrive here.
  
          my $consumed = defined $ch ? $at - 1 : $at; # consumed JSON text length
  
          white(); # remove tail white space
  
          return ( $result, $consumed ) if $want_offset; # all right if decode_prefix
  
          decode_error("garbage after JSON object") if defined $ch;
  
          $result;
      }
  
  
      sub next_chr {
          return $ch = undef if($at >= $len);
          $ch = substr($text, $at++, 1);
      }
  
  
      sub value {
          white();
          return          if(!defined $ch);
          return object() if($ch eq '{');
          return array()  if($ch eq '[');
          return tag()    if($ch eq '(');
          return string() if($ch eq '"' or ($singlequote and $ch eq "'"));
          return number() if($ch =~ /[0-9]/ or $ch eq '-');
          return word();
      }
  
      sub string {
          my $utf16;
          my $is_utf8;
  
          ($is_valid_utf8, $utf8_len) = ('', 0);
  
          my $s = ''; # basically UTF8 flag on
  
          if($ch eq '"' or ($singlequote and $ch eq "'")){
              my $boundChar = $ch;
  
              OUTER: while( defined(next_chr()) ){
  
                  if($ch eq $boundChar){
                      next_chr();
  
                      if ($utf16) {
                          decode_error("missing low surrogate character in surrogate pair");
                      }
  
                      utf8::decode($s) if($is_utf8);
  
                      return $s;
                  }
                  elsif($ch eq '\\'){
                      next_chr();
                      if(exists $escapes{$ch}){
                          $s .= $escapes{$ch};
                      }
                      elsif($ch eq 'u'){ # UNICODE handling
                          my $u = '';
  
                          for(1..4){
                              $ch = next_chr();
                              last OUTER if($ch !~ /[0-9a-fA-F]/);
                              $u .= $ch;
                          }
  
                          # U+D800 - U+DBFF
                          if ($u =~ /^[dD][89abAB][0-9a-fA-F]{2}/) { # UTF-16 high surrogate?
                              $utf16 = $u;
                          }
                          # U+DC00 - U+DFFF
                          elsif ($u =~ /^[dD][c-fC-F][0-9a-fA-F]{2}/) { # UTF-16 low surrogate?
                              unless (defined $utf16) {
                                  decode_error("missing high surrogate character in surrogate pair");
                              }
                              $is_utf8 = 1;
                              $s .= JSON_PP_decode_surrogates($utf16, $u) || next;
                              $utf16 = undef;
                          }
                          else {
                              if (defined $utf16) {
                                  decode_error("surrogate pair expected");
                              }
  
                              if ( ( my $hex = hex( $u ) ) > 127 ) {
                                  $is_utf8 = 1;
                                  $s .= JSON_PP_decode_unicode($u) || next;
                              }
                              else {
                                  $s .= chr $hex;
                              }
                          }
  
                      }
                      else{
                          unless ($loose) {
                              $at -= 2;
                              decode_error('illegal backslash escape sequence in string');
                          }
                          $s .= $ch;
                      }
                  }
                  else{
  
                      if ( ord $ch  > 127 ) {
                          unless( $ch = is_valid_utf8($ch) ) {
                              $at -= 1;
                              decode_error("malformed UTF-8 character in JSON string");
                          }
                          else {
                              $at += $utf8_len - 1;
                          }
  
                          $is_utf8 = 1;
                      }
  
                      if (!$loose) {
                          if ($ch =~ /[\x00-\x1f\x22\x5c]/)  { # '/' ok
                              if (!$relaxed or $ch ne "\t") {
                                  $at--;
                                  decode_error('invalid character encountered while parsing JSON string');
                              }
                          }
                      }
  
                      $s .= $ch;
                  }
              }
          }
  
          decode_error("unexpected end of string while parsing JSON string");
      }
  
  
      sub white {
          while( defined $ch  ){
              if($ch eq '' or $ch =~ /\A[ \t\r\n]\z/){
                  next_chr();
              }
              elsif($relaxed and $ch eq '/'){
                  next_chr();
                  if(defined $ch and $ch eq '/'){
                      1 while(defined(next_chr()) and $ch ne "\n" and $ch ne "\r");
                  }
                  elsif(defined $ch and $ch eq '*'){
                      next_chr();
                      while(1){
                          if(defined $ch){
                              if($ch eq '*'){
                                  if(defined(next_chr()) and $ch eq '/'){
                                      next_chr();
                                      last;
                                  }
                              }
                              else{
                                  next_chr();
                              }
                          }
                          else{
                              decode_error("Unterminated comment");
                          }
                      }
                      next;
                  }
                  else{
                      $at--;
                      decode_error("malformed JSON string, neither array, object, number, string or atom");
                  }
              }
              else{
                  if ($relaxed and $ch eq '#') { # correctly?
                      pos($text) = $at;
                      $text =~ /\G([^\n]*(?:\r\n|\r|\n|$))/g;
                      $at = pos($text);
                      next_chr;
                      next;
                  }
  
                  last;
              }
          }
      }
  
  
      sub array {
          my $a  = $_[0] || []; # you can use this code to use another array ref object.
  
          decode_error('json text or perl structure exceeds maximum nesting level (max_depth set too low?)')
                                                      if (++$depth > $max_depth);
  
          next_chr();
          white();
  
          if(defined $ch and $ch eq ']'){
              --$depth;
              next_chr();
              return $a;
          }
          else {
              while(defined($ch)){
                  push @$a, value();
  
                  white();
  
                  if (!defined $ch) {
                      last;
                  }
  
                  if($ch eq ']'){
                      --$depth;
                      next_chr();
                      return $a;
                  }
  
                  if($ch ne ','){
                      last;
                  }
  
                  next_chr();
                  white();
  
                  if ($relaxed and $ch eq ']') {
                      --$depth;
                      next_chr();
                      return $a;
                  }
  
              }
          }
  
          $at-- if defined $ch and $ch ne '';
          decode_error(", or ] expected while parsing array");
      }
  
      sub tag {
          decode_error('malformed JSON string, neither array, object, number, string or atom') unless $allow_tags;
  
          next_chr();
          white();
  
          my $tag = value();
          return unless defined $tag;
          decode_error('malformed JSON string, (tag) must be a string') if ref $tag;
  
          white();
  
          if (!defined $ch or $ch ne ')') {
              decode_error(') expected after tag');
          }
  
          next_chr();
          white();
  
          my $val = value();
          return unless defined $val;
          decode_error('malformed JSON string, tag value must be an array') unless ref $val eq 'ARRAY';
  
          if (!eval { $tag->can('THAW') }) {
               decode_error('cannot decode perl-object (package does not exist)') if $@;
               decode_error('cannot decode perl-object (package does not have a THAW method)');
          }
          $tag->THAW('JSON', @$val);
      }
  
      sub object {
          my $o = $_[0] || {}; # you can use this code to use another hash ref object.
          my $k;
  
          decode_error('json text or perl structure exceeds maximum nesting level (max_depth set too low?)')
                                                  if (++$depth > $max_depth);
          next_chr();
          white();
  
          if(defined $ch and $ch eq '}'){
              --$depth;
              next_chr();
              if ($F_HOOK) {
                  return _json_object_hook($o);
              }
              return $o;
          }
          else {
              while (defined $ch) {
                  $k = ($allow_barekey and $ch ne '"' and $ch ne "'") ? bareKey() : string();
                  white();
  
                  if(!defined $ch or $ch ne ':'){
                      $at--;
                      decode_error("':' expected");
                  }
  
                  next_chr();
                  $o->{$k} = value();
                  white();
  
                  last if (!defined $ch);
  
                  if($ch eq '}'){
                      --$depth;
                      next_chr();
                      if ($F_HOOK) {
                          return _json_object_hook($o);
                      }
                      return $o;
                  }
  
                  if($ch ne ','){
                      last;
                  }
  
                  next_chr();
                  white();
  
                  if ($relaxed and $ch eq '}') {
                      --$depth;
                      next_chr();
                      if ($F_HOOK) {
                          return _json_object_hook($o);
                      }
                      return $o;
                  }
  
              }
  
          }
  
          $at-- if defined $ch and $ch ne '';
          decode_error(", or } expected while parsing object/hash");
      }
  
  
      sub bareKey { # doesn't strictly follow Standard ECMA-262 3rd Edition
          my $key;
          while($ch =~ /[^\x00-\x23\x25-\x2F\x3A-\x40\x5B-\x5E\x60\x7B-\x7F]/){
              $key .= $ch;
              next_chr();
          }
          return $key;
      }
  
  
      sub word {
          my $word =  substr($text,$at-1,4);
  
          if($word eq 'true'){
              $at += 3;
              next_chr;
              return defined $alt_true ? $alt_true : $JSON::PP::true;
          }
          elsif($word eq 'null'){
              $at += 3;
              next_chr;
              return undef;
          }
          elsif($word eq 'fals'){
              $at += 3;
              if(substr($text,$at,1) eq 'e'){
                  $at++;
                  next_chr;
                  return defined $alt_false ? $alt_false : $JSON::PP::false;
              }
          }
  
          $at--; # for decode_error report
  
          decode_error("'null' expected")  if ($word =~ /^n/);
          decode_error("'true' expected")  if ($word =~ /^t/);
          decode_error("'false' expected") if ($word =~ /^f/);
          decode_error("malformed JSON string, neither array, object, number, string or atom");
      }
  
  
      sub number {
          my $n    = '';
          my $v;
          my $is_dec;
          my $is_exp;
  
          if($ch eq '-'){
              $n = '-';
              next_chr;
              if (!defined $ch or $ch !~ /\d/) {
                  decode_error("malformed number (no digits after initial minus)");
              }
          }
  
          # According to RFC4627, hex or oct digits are invalid.
          if($ch eq '0'){
              my $peek = substr($text,$at,1);
              if($peek =~ /^[0-9a-dfA-DF]/){ # e may be valid (exponential)
                  decode_error("malformed number (leading zero must not be followed by another digit)");
              }
              $n .= $ch;
              next_chr;
          }
  
          while(defined $ch and $ch =~ /\d/){
              $n .= $ch;
              next_chr;
          }
  
          if(defined $ch and $ch eq '.'){
              $n .= '.';
              $is_dec = 1;
  
              next_chr;
              if (!defined $ch or $ch !~ /\d/) {
                  decode_error("malformed number (no digits after decimal point)");
              }
              else {
                  $n .= $ch;
              }
  
              while(defined(next_chr) and $ch =~ /\d/){
                  $n .= $ch;
              }
          }
  
          if(defined $ch and ($ch eq 'e' or $ch eq 'E')){
              $n .= $ch;
              $is_exp = 1;
              next_chr;
  
              if(defined($ch) and ($ch eq '+' or $ch eq '-')){
                  $n .= $ch;
                  next_chr;
                  if (!defined $ch or $ch =~ /\D/) {
                      decode_error("malformed number (no digits after exp sign)");
                  }
                  $n .= $ch;
              }
              elsif(defined($ch) and $ch =~ /\d/){
                  $n .= $ch;
              }
              else {
                  decode_error("malformed number (no digits after exp sign)");
              }
  
              while(defined(next_chr) and $ch =~ /\d/){
                  $n .= $ch;
              }
  
          }
  
          $v .= $n;
  
          if ($is_dec or $is_exp) {
              if ($allow_bignum) {
                  require Math::BigFloat;
                  return Math::BigFloat->new($v);
              }
          } else {
              if (length $v > $max_intsize) {
                  if ($allow_bignum) { # from Adam Sussman
                      require Math::BigInt;
                      return Math::BigInt->new($v);
                  }
                  else {
                      return "$v";
                  }
              }
          }
  
          return $is_dec ? $v/1.0 : 0+$v;
      }
  
  
      sub is_valid_utf8 {
  
          $utf8_len = $_[0] =~ /[\x00-\x7F]/  ? 1
                    : $_[0] =~ /[\xC2-\xDF]/  ? 2
                    : $_[0] =~ /[\xE0-\xEF]/  ? 3
                    : $_[0] =~ /[\xF0-\xF4]/  ? 4
                    : 0
                    ;
  
          return unless $utf8_len;
  
          my $is_valid_utf8 = substr($text, $at - 1, $utf8_len);
  
          return ( $is_valid_utf8 =~ /^(?:
               [\x00-\x7F]
              |[\xC2-\xDF][\x80-\xBF]
              |[\xE0][\xA0-\xBF][\x80-\xBF]
              |[\xE1-\xEC][\x80-\xBF][\x80-\xBF]
              |[\xED][\x80-\x9F][\x80-\xBF]
              |[\xEE-\xEF][\x80-\xBF][\x80-\xBF]
              |[\xF0][\x90-\xBF][\x80-\xBF][\x80-\xBF]
              |[\xF1-\xF3][\x80-\xBF][\x80-\xBF][\x80-\xBF]
              |[\xF4][\x80-\x8F][\x80-\xBF][\x80-\xBF]
          )$/x )  ? $is_valid_utf8 : '';
      }
  
  
      sub decode_error {
          my $error  = shift;
          my $no_rep = shift;
          my $str    = defined $text ? substr($text, $at) : '';
          my $mess   = '';
          my $type   = 'U*';
  
          if ( OLD_PERL ) {
              my $type   =  $] <  5.006           ? 'C*'
                          : utf8::is_utf8( $str ) ? 'U*' # 5.6
                          : 'C*'
                          ;
          }
  
          for my $c ( unpack( $type, $str ) ) { # emulate pv_uni_display() ?
              $mess .=  $c == 0x07 ? '\a'
                      : $c == 0x09 ? '\t'
                      : $c == 0x0a ? '\n'
                      : $c == 0x0d ? '\r'
                      : $c == 0x0c ? '\f'
                      : $c <  0x20 ? sprintf('\x{%x}', $c)
                      : $c == 0x5c ? '\\\\'
                      : $c <  0x80 ? chr($c)
                      : sprintf('\x{%x}', $c)
                      ;
              if ( length $mess >= 20 ) {
                  $mess .= '...';
                  last;
              }
          }
  
          unless ( length $mess ) {
              $mess = '(end of string)';
          }
  
          Carp::croak (
              $no_rep ? "$error" : "$error, at character offset $at (before \"$mess\")"
          );
  
      }
  
  
      sub _json_object_hook {
          my $o    = $_[0];
          my @ks = keys %{$o};
  
          if ( $cb_sk_object and @ks == 1 and exists $cb_sk_object->{ $ks[0] } and ref $cb_sk_object->{ $ks[0] } ) {
              my @val = $cb_sk_object->{ $ks[0] }->( $o->{$ks[0]} );
              if (@val == 0) {
                  return $o;
              }
              elsif (@val == 1) {
                  return $val[0];
              }
              else {
                  Carp::croak("filter_json_single_key_object callbacks must not return more than one scalar");
              }
          }
  
          my @val = $cb_object->($o) if ($cb_object);
          if (@val == 0) {
              return $o;
          }
          elsif (@val == 1) {
              return $val[0];
          }
          else {
              Carp::croak("filter_json_object callbacks must not return more than one scalar");
          }
      }
  
  
      sub PP_decode_box {
          {
              text    => $text,
              at      => $at,
              ch      => $ch,
              len     => $len,
              depth   => $depth,
              encoding      => $encoding,
              is_valid_utf8 => $is_valid_utf8,
          };
      }
  
  } # PARSE
  
  
  sub _decode_surrogates { # from perlunicode
      my $uni = 0x10000 + (hex($_[0]) - 0xD800) * 0x400 + (hex($_[1]) - 0xDC00);
      my $un  = pack('U*', $uni);
      utf8::encode( $un );
      return $un;
  }
  
  
  sub _decode_unicode {
      my $un = pack('U', hex shift);
      utf8::encode( $un );
      return $un;
  }
  
  #
  # Setup for various Perl versions (the code from JSON::PP58)
  #
  
  BEGIN {
  
      unless ( defined &utf8::is_utf8 ) {
         require Encode;
         *utf8::is_utf8 = *Encode::is_utf8;
      }
  
      if ( !OLD_PERL ) {
          *JSON::PP::JSON_PP_encode_ascii      = \&_encode_ascii;
          *JSON::PP::JSON_PP_encode_latin1     = \&_encode_latin1;
          *JSON::PP::JSON_PP_decode_surrogates = \&_decode_surrogates;
          *JSON::PP::JSON_PP_decode_unicode    = \&_decode_unicode;
  
          if ($] < 5.008003) { # join() in 5.8.0 - 5.8.2 is broken.
              package JSON::PP;
              require subs;
              subs->import('join');
              eval q|
                  sub join {
                      return '' if (@_ < 2);
                      my $j   = shift;
                      my $str = shift;
                      for (@_) { $str .= $j . $_; }
                      return $str;
                  }
              |;
          }
      }
  
  
      sub JSON::PP::incr_parse {
          local $Carp::CarpLevel = 1;
          ( $_[0]->{_incr_parser} ||= JSON::PP::IncrParser->new )->incr_parse( @_ );
      }
  
  
      sub JSON::PP::incr_skip {
          ( $_[0]->{_incr_parser} ||= JSON::PP::IncrParser->new )->incr_skip;
      }
  
  
      sub JSON::PP::incr_reset {
          ( $_[0]->{_incr_parser} ||= JSON::PP::IncrParser->new )->incr_reset;
      }
  
      eval q{
          sub JSON::PP::incr_text : lvalue {
              $_[0]->{_incr_parser} ||= JSON::PP::IncrParser->new;
  
              if ( $_[0]->{_incr_parser}->{incr_pos} ) {
                  Carp::croak("incr_text cannot be called when the incremental parser already started parsing");
              }
              $_[0]->{_incr_parser}->{incr_text};
          }
      } if ( $] >= 5.006 );
  
  } # Setup for various Perl versions (the code from JSON::PP58)
  
  
  ###############################
  # Utilities
  #
  
  BEGIN {
      eval 'require Scalar::Util';
      unless($@){
          *JSON::PP::blessed = \&Scalar::Util::blessed;
          *JSON::PP::reftype = \&Scalar::Util::reftype;
          *JSON::PP::refaddr = \&Scalar::Util::refaddr;
      }
      else{ # This code is from Scalar::Util.
          # warn $@;
          eval 'sub UNIVERSAL::a_sub_not_likely_to_be_here { ref($_[0]) }';
          *JSON::PP::blessed = sub {
              local($@, $SIG{__DIE__}, $SIG{__WARN__});
              ref($_[0]) ? eval { $_[0]->a_sub_not_likely_to_be_here } : undef;
          };
          require B;
          my %tmap = qw(
              B::NULL   SCALAR
              B::HV     HASH
              B::AV     ARRAY
              B::CV     CODE
              B::IO     IO
              B::GV     GLOB
              B::REGEXP REGEXP
          );
          *JSON::PP::reftype = sub {
              my $r = shift;
  
              return undef unless length(ref($r));
  
              my $t = ref(B::svref_2object($r));
  
              return
                  exists $tmap{$t} ? $tmap{$t}
                : length(ref($$r)) ? 'REF'
                :                    'SCALAR';
          };
          *JSON::PP::refaddr = sub {
            return undef unless length(ref($_[0]));
  
            my $addr;
            if(defined(my $pkg = blessed($_[0]))) {
              $addr .= bless $_[0], 'Scalar::Util::Fake';
              bless $_[0], $pkg;
            }
            else {
              $addr .= $_[0]
            }
  
            $addr =~ /0x(\w+)/;
            local $^W;
            #no warnings 'portable';
            hex($1);
          }
      }
  }
  
  
  # shamelessly copied and modified from JSON::XS code.
  
  $JSON::PP::true  = do { bless \(my $dummy = 1), "JSON::PP::Boolean" };
  $JSON::PP::false = do { bless \(my $dummy = 0), "JSON::PP::Boolean" };
  
  sub is_bool { blessed $_[0] and ( $_[0]->isa("JSON::PP::Boolean") or $_[0]->isa("Types::Serialiser::BooleanBase") or $_[0]->isa("JSON::XS::Boolean") ); }
  
  sub true  { $JSON::PP::true  }
  sub false { $JSON::PP::false }
  sub null  { undef; }
  
  ###############################
  
  package JSON::PP::IncrParser;
  
  use strict;
  
  use constant INCR_M_WS   => 0; # initial whitespace skipping
  use constant INCR_M_STR  => 1; # inside string
  use constant INCR_M_BS   => 2; # inside backslash
  use constant INCR_M_JSON => 3; # outside anything, count nesting
  use constant INCR_M_C0   => 4;
  use constant INCR_M_C1   => 5;
  use constant INCR_M_TFN  => 6;
  use constant INCR_M_NUM  => 7;
  
  $JSON::PP::IncrParser::VERSION = '1.01';
  
  sub new {
      my ( $class ) = @_;
  
      bless {
          incr_nest    => 0,
          incr_text    => undef,
          incr_pos     => 0,
          incr_mode    => 0,
      }, $class;
  }
  
  
  sub incr_parse {
      my ( $self, $coder, $text ) = @_;
  
      $self->{incr_text} = '' unless ( defined $self->{incr_text} );
  
      if ( defined $text ) {
          if ( utf8::is_utf8( $text ) and !utf8::is_utf8( $self->{incr_text} ) ) {
              utf8::upgrade( $self->{incr_text} ) ;
              utf8::decode( $self->{incr_text} ) ;
          }
          $self->{incr_text} .= $text;
      }
  
      if ( defined wantarray ) {
          my $max_size = $coder->get_max_size;
          my $p = $self->{incr_pos};
          my @ret;
          {
              do {
                  unless ( $self->{incr_nest} <= 0 and $self->{incr_mode} == INCR_M_JSON ) {
                      $self->_incr_parse( $coder );
  
                      if ( $max_size and $self->{incr_pos} > $max_size ) {
                          Carp::croak("attempted decode of JSON text of $self->{incr_pos} bytes size, but max_size is set to $max_size");
                      }
                      unless ( $self->{incr_nest} <= 0 and $self->{incr_mode} == INCR_M_JSON ) {
                          # as an optimisation, do not accumulate white space in the incr buffer
                          if ( $self->{incr_mode} == INCR_M_WS and $self->{incr_pos} ) {
                              $self->{incr_pos} = 0;
                              $self->{incr_text} = '';
                          }
                          last;
                      }
                  }
  
                  my ($obj, $offset) = $coder->PP_decode_json( $self->{incr_text}, 0x00000001 );
                  push @ret, $obj;
                  use bytes;
                  $self->{incr_text} = substr( $self->{incr_text}, $offset || 0 );
                  $self->{incr_pos} = 0;
                  $self->{incr_nest} = 0;
                  $self->{incr_mode} = 0;
                  last unless wantarray;
              } while ( wantarray );
          }
  
          if ( wantarray ) {
              return @ret;
          }
          else { # in scalar context
              return defined $ret[0] ? $ret[0] : undef;
          }
      }
  }
  
  
  sub _incr_parse {
      my ($self, $coder) = @_;
      my $text = $self->{incr_text};
      my $len = length $text;
      my $p = $self->{incr_pos};
  
  INCR_PARSE:
      while ( $len > $p ) {
          my $s = substr( $text, $p, 1 );
          last INCR_PARSE unless defined $s;
          my $mode = $self->{incr_mode};
  
          if ( $mode == INCR_M_WS ) {
              while ( $len > $p ) {
                  $s = substr( $text, $p, 1 );
                  last INCR_PARSE unless defined $s;
                  if ( ord($s) > 0x20 ) {
                      if ( $s eq '#' ) {
                          $self->{incr_mode} = INCR_M_C0;
                          redo INCR_PARSE;
                      } else {
                          $self->{incr_mode} = INCR_M_JSON;
                          redo INCR_PARSE;
                      }
                  }
                  $p++;
              }
          } elsif ( $mode == INCR_M_BS ) {
              $p++;
              $self->{incr_mode} = INCR_M_STR;
              redo INCR_PARSE;
          } elsif ( $mode == INCR_M_C0 or $mode == INCR_M_C1 ) {
              while ( $len > $p ) {
                  $s = substr( $text, $p, 1 );
                  last INCR_PARSE unless defined $s;
                  if ( $s eq "\n" ) {
                      $self->{incr_mode} = $self->{incr_mode} == INCR_M_C0 ? INCR_M_WS : INCR_M_JSON;
                      last;
                  }
                  $p++;
              }
              next;
          } elsif ( $mode == INCR_M_TFN ) {
              while ( $len > $p ) {
                  $s = substr( $text, $p++, 1 );
                  next if defined $s and $s =~ /[rueals]/;
                  last;
              }
              $p--;
              $self->{incr_mode} = INCR_M_JSON;
  
              last INCR_PARSE unless $self->{incr_nest};
              redo INCR_PARSE;
          } elsif ( $mode == INCR_M_NUM ) {
              while ( $len > $p ) {
                  $s = substr( $text, $p++, 1 );
                  next if defined $s and $s =~ /[0-9eE.+\-]/;
                  last;
              }
              $p--;
              $self->{incr_mode} = INCR_M_JSON;
  
              last INCR_PARSE unless $self->{incr_nest};
              redo INCR_PARSE;
          } elsif ( $mode == INCR_M_STR ) {
              while ( $len > $p ) {
                  $s = substr( $text, $p, 1 );
                  last INCR_PARSE unless defined $s;
                  if ( $s eq '"' ) {
                      $p++;
                      $self->{incr_mode} = INCR_M_JSON;
  
                      last INCR_PARSE unless $self->{incr_nest};
                      redo INCR_PARSE;
                  }
                  elsif ( $s eq '\\' ) {
                      $p++;
                      if ( !defined substr($text, $p, 1) ) {
                          $self->{incr_mode} = INCR_M_BS;
                          last INCR_PARSE;
                      }
                  }
                  $p++;
              }
          } elsif ( $mode == INCR_M_JSON ) {
              while ( $len > $p ) {
                  $s = substr( $text, $p++, 1 );
                  if ( $s eq "\x00" ) {
                      $p--;
                      last INCR_PARSE;
                  } elsif ( $s eq "\x09" or $s eq "\x0a" or $s eq "\x0d" or $s eq "\x20" ) {
                      if ( !$self->{incr_nest} ) {
                          $p--; # do not eat the whitespace, let the next round do it
                          last INCR_PARSE;
                      }
                      next;
                  } elsif ( $s eq 't' or $s eq 'f' or $s eq 'n' ) {
                      $self->{incr_mode} = INCR_M_TFN;
                      redo INCR_PARSE;
                  } elsif ( $s =~ /^[0-9\-]$/ ) {
                      $self->{incr_mode} = INCR_M_NUM;
                      redo INCR_PARSE;
                  } elsif ( $s eq '"' ) {
                      $self->{incr_mode} = INCR_M_STR;
                      redo INCR_PARSE;
                  } elsif ( $s eq '[' or $s eq '{' ) {
                      if ( ++$self->{incr_nest} > $coder->get_max_depth ) {
                          Carp::croak('json text or perl structure exceeds maximum nesting level (max_depth set too low?)');
                      }
                      next;
                  } elsif ( $s eq ']' or $s eq '}' ) {
                      if ( --$self->{incr_nest} <= 0 ) {
                          last INCR_PARSE;
                      }
                  } elsif ( $s eq '#' ) {
                      $self->{incr_mode} = INCR_M_C1;
                      redo INCR_PARSE;
                  }
              }
          }
      }
  
      $self->{incr_pos} = $p;
      $self->{incr_parsing} = $p ? 1 : 0; # for backward compatibility
  }
  
  
  sub incr_text {
      if ( $_[0]->{incr_pos} ) {
          Carp::croak("incr_text cannot be called when the incremental parser already started parsing");
      }
      $_[0]->{incr_text};
  }
  
  
  sub incr_skip {
      my $self  = shift;
      $self->{incr_text} = substr( $self->{incr_text}, $self->{incr_pos} );
      $self->{incr_pos}     = 0;
      $self->{incr_mode}    = 0;
      $self->{incr_nest}    = 0;
  }
  
  
  sub incr_reset {
      my $self = shift;
      $self->{incr_text}    = undef;
      $self->{incr_pos}     = 0;
      $self->{incr_mode}    = 0;
      $self->{incr_nest}    = 0;
  }
  
  ###############################
  
  
  1;
  __END__
  =pod
  
  =head1 NAME
  
  JSON::PP - JSON::XS compatible pure-Perl module.
  
  =head1 SYNOPSIS
  
   use JSON::PP;
  
   # exported functions, they croak on error
   # and expect/generate UTF-8
  
   $utf8_encoded_json_text = encode_json $perl_hash_or_arrayref;
   $perl_hash_or_arrayref  = decode_json $utf8_encoded_json_text;
  
   # OO-interface
  
   $json = JSON::PP->new->ascii->pretty->allow_nonref;
   
   $pretty_printed_json_text = $json->encode( $perl_scalar );
   $perl_scalar = $json->decode( $json_text );
   
   # Note that JSON version 2.0 and above will automatically use
   # JSON::XS or JSON::PP, so you should be able to just:
   
   use JSON;
  
  
  =head1 VERSION
  
      4.02
  
  =head1 DESCRIPTION
  
  JSON::PP is a pure perl JSON decoder/encoder, and (almost) compatible to much
  faster L<JSON::XS> written by Marc Lehmann in C. JSON::PP works as
  a fallback module when you use L<JSON> module without having
  installed JSON::XS.
  
  Because of this fallback feature of JSON.pm, JSON::PP tries not to
  be more JavaScript-friendly than JSON::XS (i.e. not to escape extra
  characters such as U+2028 and U+2029, etc),
  in order for you not to lose such JavaScript-friendliness silently
  when you use JSON.pm and install JSON::XS for speed or by accident.
  If you need JavaScript-friendly RFC7159-compliant pure perl module,
  try L<JSON::Tiny>, which is derived from L<Mojolicious> web
  framework and is also smaller and faster than JSON::PP.
  
  JSON::PP has been in the Perl core since Perl 5.14, mainly for
  CPAN toolchain modules to parse META.json.
  
  =head1 FUNCTIONAL INTERFACE
  
  This section is taken from JSON::XS almost verbatim. C<encode_json>
  and C<decode_json> are exported by default.
  
  =head2 encode_json
  
      $json_text = encode_json $perl_scalar
  
  Converts the given Perl data structure to a UTF-8 encoded, binary string
  (that is, the string contains octets only). Croaks on error.
  
  This function call is functionally identical to:
  
      $json_text = JSON::PP->new->utf8->encode($perl_scalar)
  
  Except being faster.
  
  =head2 decode_json
  
      $perl_scalar = decode_json $json_text
  
  The opposite of C<encode_json>: expects an UTF-8 (binary) string and tries
  to parse that as an UTF-8 encoded JSON text, returning the resulting
  reference. Croaks on error.
  
  This function call is functionally identical to:
  
      $perl_scalar = JSON::PP->new->utf8->decode($json_text)
  
  Except being faster.
  
  =head2 JSON::PP::is_bool
  
      $is_boolean = JSON::PP::is_bool($scalar)
  
  Returns true if the passed scalar represents either JSON::PP::true or
  JSON::PP::false, two constants that act like C<1> and C<0> respectively
  and are also used to represent JSON C<true> and C<false> in Perl strings.
  
  See L<MAPPING>, below, for more information on how JSON values are mapped to
  Perl.
  
  =head1 OBJECT-ORIENTED INTERFACE
  
  This section is also taken from JSON::XS.
  
  The object oriented interface lets you configure your own encoding or
  decoding style, within the limits of supported formats.
  
  =head2 new
  
      $json = JSON::PP->new
  
  Creates a new JSON::PP object that can be used to de/encode JSON
  strings. All boolean flags described below are by default I<disabled>
  (with the exception of C<allow_nonref>, which defaults to I<enabled> since
  version C<4.0>).
  
  The mutators for flags all return the JSON::PP object again and thus calls can
  be chained:
  
     my $json = JSON::PP->new->utf8->space_after->encode({a => [1,2]})
     => {"a": [1, 2]}
  
  =head2 ascii
  
      $json = $json->ascii([$enable])
      
      $enabled = $json->get_ascii
  
  If C<$enable> is true (or missing), then the C<encode> method will not
  generate characters outside the code range C<0..127> (which is ASCII). Any
  Unicode characters outside that range will be escaped using either a
  single \uXXXX (BMP characters) or a double \uHHHH\uLLLLL escape sequence,
  as per RFC4627. The resulting encoded JSON text can be treated as a native
  Unicode string, an ascii-encoded, latin1-encoded or UTF-8 encoded string,
  or any other superset of ASCII.
  
  If C<$enable> is false, then the C<encode> method will not escape Unicode
  characters unless required by the JSON syntax or other flags. This results
  in a faster and more compact format.
  
  See also the section I<ENCODING/CODESET FLAG NOTES> later in this document.
  
  The main use for this flag is to produce JSON texts that can be
  transmitted over a 7-bit channel, as the encoded JSON texts will not
  contain any 8 bit characters.
  
    JSON::PP->new->ascii(1)->encode([chr 0x10401])
    => ["\ud801\udc01"]
  
  =head2 latin1
  
      $json = $json->latin1([$enable])
      
      $enabled = $json->get_latin1
  
  If C<$enable> is true (or missing), then the C<encode> method will encode
  the resulting JSON text as latin1 (or iso-8859-1), escaping any characters
  outside the code range C<0..255>. The resulting string can be treated as a
  latin1-encoded JSON text or a native Unicode string. The C<decode> method
  will not be affected in any way by this flag, as C<decode> by default
  expects Unicode, which is a strict superset of latin1.
  
  If C<$enable> is false, then the C<encode> method will not escape Unicode
  characters unless required by the JSON syntax or other flags.
  
  See also the section I<ENCODING/CODESET FLAG NOTES> later in this document.
  
  The main use for this flag is efficiently encoding binary data as JSON
  text, as most octets will not be escaped, resulting in a smaller encoded
  size. The disadvantage is that the resulting JSON text is encoded
  in latin1 (and must correctly be treated as such when storing and
  transferring), a rare encoding for JSON. It is therefore most useful when
  you want to store data structures known to contain binary data efficiently
  in files or databases, not when talking to other JSON encoders/decoders.
  
    JSON::PP->new->latin1->encode (["\x{89}\x{abc}"]
    => ["\x{89}\\u0abc"]    # (perl syntax, U+abc escaped, U+89 not)
  
  =head2 utf8
  
      $json = $json->utf8([$enable])
      
      $enabled = $json->get_utf8
  
  If C<$enable> is true (or missing), then the C<encode> method will encode
  the JSON result into UTF-8, as required by many protocols, while the
  C<decode> method expects to be handled an UTF-8-encoded string.  Please
  note that UTF-8-encoded strings do not contain any characters outside the
  range C<0..255>, they are thus useful for bytewise/binary I/O. In future
  versions, enabling this option might enable autodetection of the UTF-16
  and UTF-32 encoding families, as described in RFC4627.
  
  If C<$enable> is false, then the C<encode> method will return the JSON
  string as a (non-encoded) Unicode string, while C<decode> expects thus a
  Unicode string.  Any decoding or encoding (e.g. to UTF-8 or UTF-16) needs
  to be done yourself, e.g. using the Encode module.
  
  See also the section I<ENCODING/CODESET FLAG NOTES> later in this document.
  
  Example, output UTF-16BE-encoded JSON:
  
    use Encode;
    $jsontext = encode "UTF-16BE", JSON::PP->new->encode ($object);
  
  Example, decode UTF-32LE-encoded JSON:
  
    use Encode;
    $object = JSON::PP->new->decode (decode "UTF-32LE", $jsontext);
  
  =head2 pretty
  
      $json = $json->pretty([$enable])
  
  This enables (or disables) all of the C<indent>, C<space_before> and
  C<space_after> (and in the future possibly more) flags in one call to
  generate the most readable (or most compact) form possible.
  
  =head2 indent
  
      $json = $json->indent([$enable])
      
      $enabled = $json->get_indent
  
  If C<$enable> is true (or missing), then the C<encode> method will use a multiline
  format as output, putting every array member or object/hash key-value pair
  into its own line, indenting them properly.
  
  If C<$enable> is false, no newlines or indenting will be produced, and the
  resulting JSON text is guaranteed not to contain any C<newlines>.
  
  This setting has no effect when decoding JSON texts.
  
  The default indent space length is three.
  You can use C<indent_length> to change the length.
  
  =head2 space_before
  
      $json = $json->space_before([$enable])
      
      $enabled = $json->get_space_before
  
  If C<$enable> is true (or missing), then the C<encode> method will add an extra
  optional space before the C<:> separating keys from values in JSON objects.
  
  If C<$enable> is false, then the C<encode> method will not add any extra
  space at those places.
  
  This setting has no effect when decoding JSON texts. You will also
  most likely combine this setting with C<space_after>.
  
  Example, space_before enabled, space_after and indent disabled:
  
     {"key" :"value"}
  
  =head2 space_after
  
      $json = $json->space_after([$enable])
      
      $enabled = $json->get_space_after
  
  If C<$enable> is true (or missing), then the C<encode> method will add an extra
  optional space after the C<:> separating keys from values in JSON objects
  and extra whitespace after the C<,> separating key-value pairs and array
  members.
  
  If C<$enable> is false, then the C<encode> method will not add any extra
  space at those places.
  
  This setting has no effect when decoding JSON texts.
  
  Example, space_before and indent disabled, space_after enabled:
  
     {"key": "value"}
  
  =head2 relaxed
  
      $json = $json->relaxed([$enable])
      
      $enabled = $json->get_relaxed
  
  If C<$enable> is true (or missing), then C<decode> will accept some
  extensions to normal JSON syntax (see below). C<encode> will not be
  affected in anyway. I<Be aware that this option makes you accept invalid
  JSON texts as if they were valid!>. I suggest only to use this option to
  parse application-specific files written by humans (configuration files,
  resource files etc.)
  
  If C<$enable> is false (the default), then C<decode> will only accept
  valid JSON texts.
  
  Currently accepted extensions are:
  
  =over 4
  
  =item * list items can have an end-comma
  
  JSON I<separates> array elements and key-value pairs with commas. This
  can be annoying if you write JSON texts manually and want to be able to
  quickly append elements, so this extension accepts comma at the end of
  such items not just between them:
  
     [
        1,
        2, <- this comma not normally allowed
     ]
     {
        "k1": "v1",
        "k2": "v2", <- this comma not normally allowed
     }
  
  =item * shell-style '#'-comments
  
  Whenever JSON allows whitespace, shell-style comments are additionally
  allowed. They are terminated by the first carriage-return or line-feed
  character, after which more white-space and comments are allowed.
  
    [
       1, # this comment not allowed in JSON
          # neither this one...
    ]
  
  =item * C-style multiple-line '/* */'-comments (JSON::PP only)
  
  Whenever JSON allows whitespace, C-style multiple-line comments are additionally
  allowed. Everything between C</*> and C<*/> is a comment, after which
  more white-space and comments are allowed.
  
    [
       1, /* this comment not allowed in JSON */
          /* neither this one... */
    ]
  
  =item * C++-style one-line '//'-comments (JSON::PP only)
  
  Whenever JSON allows whitespace, C++-style one-line comments are additionally
  allowed. They are terminated by the first carriage-return or line-feed
  character, after which more white-space and comments are allowed.
  
    [
       1, // this comment not allowed in JSON
          // neither this one...
    ]
  
  =item * literal ASCII TAB characters in strings
  
  Literal ASCII TAB characters are now allowed in strings (and treated as
  C<\t>).
  
    [
       "Hello\tWorld",
       "Hello<TAB>World", # literal <TAB> would not normally be allowed
    ]
  
  =back
  
  =head2 canonical
  
      $json = $json->canonical([$enable])
      
      $enabled = $json->get_canonical
  
  If C<$enable> is true (or missing), then the C<encode> method will output JSON objects
  by sorting their keys. This is adding a comparatively high overhead.
  
  If C<$enable> is false, then the C<encode> method will output key-value
  pairs in the order Perl stores them (which will likely change between runs
  of the same script, and can change even within the same run from 5.18
  onwards).
  
  This option is useful if you want the same data structure to be encoded as
  the same JSON text (given the same overall settings). If it is disabled,
  the same hash might be encoded differently even if contains the same data,
  as key-value pairs have no inherent ordering in Perl.
  
  This setting has no effect when decoding JSON texts.
  
  This setting has currently no effect on tied hashes.
  
  =head2 allow_nonref
  
      $json = $json->allow_nonref([$enable])
      
      $enabled = $json->get_allow_nonref
  
  Unlike other boolean options, this opotion is enabled by default beginning
  with version C<4.0>.
  
  If C<$enable> is true (or missing), then the C<encode> method can convert a
  non-reference into its corresponding string, number or null JSON value,
  which is an extension to RFC4627. Likewise, C<decode> will accept those JSON
  values instead of croaking.
  
  If C<$enable> is false, then the C<encode> method will croak if it isn't
  passed an arrayref or hashref, as JSON texts must either be an object
  or array. Likewise, C<decode> will croak if given something that is not a
  JSON object or array.
  
  Example, encode a Perl scalar as JSON value without enabled C<allow_nonref>,
  resulting in an error:
  
     JSON::PP->new->allow_nonref(0)->encode ("Hello, World!")
     => hash- or arrayref expected...
  
  =head2 allow_unknown
  
      $json = $json->allow_unknown([$enable])
      
      $enabled = $json->get_allow_unknown
  
  If C<$enable> is true (or missing), then C<encode> will I<not> throw an
  exception when it encounters values it cannot represent in JSON (for
  example, filehandles) but instead will encode a JSON C<null> value. Note
  that blessed objects are not included here and are handled separately by
  c<allow_blessed>.
  
  If C<$enable> is false (the default), then C<encode> will throw an
  exception when it encounters anything it cannot encode as JSON.
  
  This option does not affect C<decode> in any way, and it is recommended to
  leave it off unless you know your communications partner.
  
  =head2 allow_blessed
  
      $json = $json->allow_blessed([$enable])
      
      $enabled = $json->get_allow_blessed
  
  See L<OBJECT SERIALISATION> for details.
  
  If C<$enable> is true (or missing), then the C<encode> method will not
  barf when it encounters a blessed reference that it cannot convert
  otherwise. Instead, a JSON C<null> value is encoded instead of the object.
  
  If C<$enable> is false (the default), then C<encode> will throw an
  exception when it encounters a blessed object that it cannot convert
  otherwise.
  
  This setting has no effect on C<decode>.
  
  =head2 convert_blessed
  
      $json = $json->convert_blessed([$enable])
      
      $enabled = $json->get_convert_blessed
  
  See L<OBJECT SERIALISATION> for details.
  
  If C<$enable> is true (or missing), then C<encode>, upon encountering a
  blessed object, will check for the availability of the C<TO_JSON> method
  on the object's class. If found, it will be called in scalar context and
  the resulting scalar will be encoded instead of the object.
  
  The C<TO_JSON> method may safely call die if it wants. If C<TO_JSON>
  returns other blessed objects, those will be handled in the same
  way. C<TO_JSON> must take care of not causing an endless recursion cycle
  (== crash) in this case. The name of C<TO_JSON> was chosen because other
  methods called by the Perl core (== not by the user of the object) are
  usually in upper case letters and to avoid collisions with any C<to_json>
  function or method.
  
  If C<$enable> is false (the default), then C<encode> will not consider
  this type of conversion.
  
  This setting has no effect on C<decode>.
  
  =head2 allow_tags
  
      $json = $json->allow_tags([$enable])
  
      $enabled = $json->get_allow_tags
  
  See L<OBJECT SERIALISATION> for details.
  
  If C<$enable> is true (or missing), then C<encode>, upon encountering a
  blessed object, will check for the availability of the C<FREEZE> method on
  the object's class. If found, it will be used to serialise the object into
  a nonstandard tagged JSON value (that JSON decoders cannot decode).
  
  It also causes C<decode> to parse such tagged JSON values and deserialise
  them via a call to the C<THAW> method.
  
  If C<$enable> is false (the default), then C<encode> will not consider
  this type of conversion, and tagged JSON values will cause a parse error
  in C<decode>, as if tags were not part of the grammar.
  
  =head2 boolean_values
  
      $json->boolean_values([$false, $true])
  
      ($false,  $true) = $json->get_boolean_values
  
  By default, JSON booleans will be decoded as overloaded
  C<$JSON::PP::false> and C<$JSON::PP::true> objects.
  
  With this method you can specify your own boolean values for decoding -
  on decode, JSON C<false> will be decoded as a copy of C<$false>, and JSON
  C<true> will be decoded as C<$true> ("copy" here is the same thing as
  assigning a value to another variable, i.e. C<$copy = $false>).
  
  This is useful when you want to pass a decoded data structure directly
  to other serialisers like YAML, Data::MessagePack and so on.
  
  Note that this works only when you C<decode>. You can set incompatible
  boolean objects (like L<boolean>), but when you C<encode> a data structure
  with such boolean objects, you still need to enable C<convert_blessed>
  (and add a C<TO_JSON> method if necessary).
  
  Calling this method without any arguments will reset the booleans
  to their default values.
  
  C<get_boolean_values> will return both C<$false> and C<$true> values, or
  the empty list when they are set to the default.
  
  =head2 filter_json_object
  
      $json = $json->filter_json_object([$coderef])
  
  When C<$coderef> is specified, it will be called from C<decode> each
  time it decodes a JSON object. The only argument is a reference to
  the newly-created hash. If the code references returns a single scalar
  (which need not be a reference), this value (or rather a copy of it) is
  inserted into the deserialised data structure. If it returns an empty
  list (NOTE: I<not> C<undef>, which is a valid scalar), the original
  deserialised hash will be inserted. This setting can slow down decoding
  considerably.
  
  When C<$coderef> is omitted or undefined, any existing callback will
  be removed and C<decode> will not change the deserialised hash in any
  way.
  
  Example, convert all JSON objects into the integer 5:
  
     my $js = JSON::PP->new->filter_json_object(sub { 5 });
     # returns [5]
     $js->decode('[{}]');
     # returns 5
     $js->decode('{"a":1, "b":2}');
  
  =head2 filter_json_single_key_object
  
      $json = $json->filter_json_single_key_object($key [=> $coderef])
  
  Works remotely similar to C<filter_json_object>, but is only called for
  JSON objects having a single key named C<$key>.
  
  This C<$coderef> is called before the one specified via
  C<filter_json_object>, if any. It gets passed the single value in the JSON
  object. If it returns a single value, it will be inserted into the data
  structure. If it returns nothing (not even C<undef> but the empty list),
  the callback from C<filter_json_object> will be called next, as if no
  single-key callback were specified.
  
  If C<$coderef> is omitted or undefined, the corresponding callback will be
  disabled. There can only ever be one callback for a given key.
  
  As this callback gets called less often then the C<filter_json_object>
  one, decoding speed will not usually suffer as much. Therefore, single-key
  objects make excellent targets to serialise Perl objects into, especially
  as single-key JSON objects are as close to the type-tagged value concept
  as JSON gets (it's basically an ID/VALUE tuple). Of course, JSON does not
  support this in any way, so you need to make sure your data never looks
  like a serialised Perl hash.
  
  Typical names for the single object key are C<__class_whatever__>, or
  C<$__dollars_are_rarely_used__$> or C<}ugly_brace_placement>, or even
  things like C<__class_md5sum(classname)__>, to reduce the risk of clashing
  with real hashes.
  
  Example, decode JSON objects of the form C<< { "__widget__" => <id> } >>
  into the corresponding C<< $WIDGET{<id>} >> object:
  
     # return whatever is in $WIDGET{5}:
     JSON::PP
        ->new
        ->filter_json_single_key_object (__widget__ => sub {
              $WIDGET{ $_[0] }
           })
        ->decode ('{"__widget__": 5')
  
     # this can be used with a TO_JSON method in some "widget" class
     # for serialisation to json:
     sub WidgetBase::TO_JSON {
        my ($self) = @_;
  
        unless ($self->{id}) {
           $self->{id} = ..get..some..id..;
           $WIDGET{$self->{id}} = $self;
        }
  
        { __widget__ => $self->{id} }
     }
  
  =head2 shrink
  
      $json = $json->shrink([$enable])
      
      $enabled = $json->get_shrink
  
  If C<$enable> is true (or missing), the string returned by C<encode> will
  be shrunk (i.e. downgraded if possible).
  
  The actual definition of what shrink does might change in future versions,
  but it will always try to save space at the expense of time.
  
  If C<$enable> is false, then JSON::PP does nothing.
  
  =head2 max_depth
  
      $json = $json->max_depth([$maximum_nesting_depth])
      
      $max_depth = $json->get_max_depth
  
  Sets the maximum nesting level (default C<512>) accepted while encoding
  or decoding. If a higher nesting level is detected in JSON text or a Perl
  data structure, then the encoder and decoder will stop and croak at that
  point.
  
  Nesting level is defined by number of hash- or arrayrefs that the encoder
  needs to traverse to reach a given point or the number of C<{> or C<[>
  characters without their matching closing parenthesis crossed to reach a
  given character in a string.
  
  Setting the maximum depth to one disallows any nesting, so that ensures
  that the object is only a single hash/object or array.
  
  If no argument is given, the highest possible setting will be used, which
  is rarely useful.
  
  See L<JSON::XS/SECURITY CONSIDERATIONS> for more info on why this is useful.
  
  =head2 max_size
  
      $json = $json->max_size([$maximum_string_size])
      
      $max_size = $json->get_max_size
  
  Set the maximum length a JSON text may have (in bytes) where decoding is
  being attempted. The default is C<0>, meaning no limit. When C<decode>
  is called on a string that is longer then this many bytes, it will not
  attempt to decode the string but throw an exception. This setting has no
  effect on C<encode> (yet).
  
  If no argument is given, the limit check will be deactivated (same as when
  C<0> is specified).
  
  See L<JSON::XS/SECURITY CONSIDERATIONS> for more info on why this is useful.
  
  =head2 encode
  
      $json_text = $json->encode($perl_scalar)
  
  Converts the given Perl value or data structure to its JSON
  representation. Croaks on error.
  
  =head2 decode
  
      $perl_scalar = $json->decode($json_text)
  
  The opposite of C<encode>: expects a JSON text and tries to parse it,
  returning the resulting simple scalar or reference. Croaks on error.
  
  =head2 decode_prefix
  
      ($perl_scalar, $characters) = $json->decode_prefix($json_text)
  
  This works like the C<decode> method, but instead of raising an exception
  when there is trailing garbage after the first JSON object, it will
  silently stop parsing there and return the number of characters consumed
  so far.
  
  This is useful if your JSON texts are not delimited by an outer protocol
  and you need to know where the JSON text ends.
  
     JSON::PP->new->decode_prefix ("[1] the tail")
     => ([1], 3)
  
  =head1 FLAGS FOR JSON::PP ONLY
  
  The following flags and properties are for JSON::PP only. If you use
  any of these, you can't make your application run faster by replacing
  JSON::PP with JSON::XS. If you need these and also speed boost,
  you might want to try L<Cpanel::JSON::XS>, a fork of JSON::XS by
  Reini Urban, which supports some of these (with a different set of
  incompatibilities). Most of these historical flags are only kept
  for backward compatibility, and should not be used in a new application.
  
  =head2 allow_singlequote
  
      $json = $json->allow_singlequote([$enable])
      $enabled = $json->get_allow_singlequote
  
  If C<$enable> is true (or missing), then C<decode> will accept
  invalid JSON texts that contain strings that begin and end with
  single quotation marks. C<encode> will not be affected in any way.
  I<Be aware that this option makes you accept invalid JSON texts
  as if they were valid!>. I suggest only to use this option to
  parse application-specific files written by humans (configuration
  files, resource files etc.)
  
  If C<$enable> is false (the default), then C<decode> will only accept
  valid JSON texts.
  
      $json->allow_singlequote->decode(qq|{"foo":'bar'}|);
      $json->allow_singlequote->decode(qq|{'foo':"bar"}|);
      $json->allow_singlequote->decode(qq|{'foo':'bar'}|);
  
  =head2 allow_barekey
  
      $json = $json->allow_barekey([$enable])
      $enabled = $json->get_allow_barekey
  
  If C<$enable> is true (or missing), then C<decode> will accept
  invalid JSON texts that contain JSON objects whose names don't
  begin and end with quotation marks. C<encode> will not be affected
  in any way. I<Be aware that this option makes you accept invalid JSON
  texts as if they were valid!>. I suggest only to use this option to
  parse application-specific files written by humans (configuration
  files, resource files etc.)
  
  If C<$enable> is false (the default), then C<decode> will only accept
  valid JSON texts.
  
      $json->allow_barekey->decode(qq|{foo:"bar"}|);
  
  =head2 allow_bignum
  
      $json = $json->allow_bignum([$enable])
      $enabled = $json->get_allow_bignum
  
  If C<$enable> is true (or missing), then C<decode> will convert
  big integers Perl cannot handle as integer into L<Math::BigInt>
  objects and convert floating numbers into L<Math::BigFloat>
  objects. C<encode> will convert C<Math::BigInt> and C<Math::BigFloat>
  objects into JSON numbers.
  
     $json->allow_nonref->allow_bignum;
     $bigfloat = $json->decode('2.000000000000000000000000001');
     print $json->encode($bigfloat);
     # => 2.000000000000000000000000001
  
  See also L<MAPPING>.
  
  =head2 loose
  
      $json = $json->loose([$enable])
      $enabled = $json->get_loose
  
  If C<$enable> is true (or missing), then C<decode> will accept
  invalid JSON texts that contain unescaped [\x00-\x1f\x22\x5c]
  characters. C<encode> will not be affected in any way.
  I<Be aware that this option makes you accept invalid JSON texts
  as if they were valid!>. I suggest only to use this option to
  parse application-specific files written by humans (configuration
  files, resource files etc.)
  
  If C<$enable> is false (the default), then C<decode> will only accept
  valid JSON texts.
  
      $json->loose->decode(qq|["abc
                                     def"]|);
  
  =head2 escape_slash
  
      $json = $json->escape_slash([$enable])
      $enabled = $json->get_escape_slash
  
  If C<$enable> is true (or missing), then C<encode> will explicitly
  escape I<slash> (solidus; C<U+002F>) characters to reduce the risk of
  XSS (cross site scripting) that may be caused by C<< </script> >>
  in a JSON text, with the cost of bloating the size of JSON texts.
  
  This option may be useful when you embed JSON in HTML, but embedding
  arbitrary JSON in HTML (by some HTML template toolkit or by string
  interpolation) is risky in general. You must escape necessary
  characters in correct order, depending on the context.
  
  C<decode> will not be affected in any way.
  
  =head2 indent_length
  
      $json = $json->indent_length($number_of_spaces)
      $length = $json->get_indent_length
  
  This option is only useful when you also enable C<indent> or C<pretty>.
  
  JSON::XS indents with three spaces when you C<encode> (if requested
  by C<indent> or C<pretty>), and the number cannot be changed.
  JSON::PP allows you to change/get the number of indent spaces with these
  mutator/accessor. The default number of spaces is three (the same as
  JSON::XS), and the acceptable range is from C<0> (no indentation;
  it'd be better to disable indentation by C<indent(0)>) to C<15>.
  
  =head2 sort_by
  
      $json = $json->sort_by($code_ref)
      $json = $json->sort_by($subroutine_name)
  
  If you just want to sort keys (names) in JSON objects when you
  C<encode>, enable C<canonical> option (see above) that allows you to
  sort object keys alphabetically.
  
  If you do need to sort non-alphabetically for whatever reasons,
  you can give a code reference (or a subroutine name) to C<sort_by>,
  then the argument will be passed to Perl's C<sort> built-in function.
  
  As the sorting is done in the JSON::PP scope, you usually need to
  prepend C<JSON::PP::> to the subroutine name, and the special variables
  C<$a> and C<$b> used in the subrontine used by C<sort> function.
  
  Example:
  
     my %ORDER = (id => 1, class => 2, name => 3);
     $json->sort_by(sub {
         ($ORDER{$JSON::PP::a} // 999) <=> ($ORDER{$JSON::PP::b} // 999)
         or $JSON::PP::a cmp $JSON::PP::b
     });
     print $json->encode([
         {name => 'CPAN', id => 1, href => 'http://cpan.org'}
     ]);
     # [{"id":1,"name":"CPAN","href":"http://cpan.org"}]
  
  Note that C<sort_by> affects all the plain hashes in the data structure.
  If you need finer control, C<tie> necessary hashes with a module that
  implements ordered hash (such as L<Hash::Ordered> and L<Tie::IxHash>).
  C<canonical> and C<sort_by> don't affect the key order in C<tie>d
  hashes.
  
     use Hash::Ordered;
     tie my %hash, 'Hash::Ordered',
         (name => 'CPAN', id => 1, href => 'http://cpan.org');
     print $json->encode([\%hash]);
     # [{"name":"CPAN","id":1,"href":"http://cpan.org"}] # order is kept
  
  =head1 INCREMENTAL PARSING
  
  This section is also taken from JSON::XS.
  
  In some cases, there is the need for incremental parsing of JSON
  texts. While this module always has to keep both JSON text and resulting
  Perl data structure in memory at one time, it does allow you to parse a
  JSON stream incrementally. It does so by accumulating text until it has
  a full JSON object, which it then can decode. This process is similar to
  using C<decode_prefix> to see if a full JSON object is available, but
  is much more efficient (and can be implemented with a minimum of method
  calls).
  
  JSON::PP will only attempt to parse the JSON text once it is sure it
  has enough text to get a decisive result, using a very simple but
  truly incremental parser. This means that it sometimes won't stop as
  early as the full parser, for example, it doesn't detect mismatched
  parentheses. The only thing it guarantees is that it starts decoding as
  soon as a syntactically valid JSON text has been seen. This means you need
  to set resource limits (e.g. C<max_size>) to ensure the parser will stop
  parsing in the presence if syntax errors.
  
  The following methods implement this incremental parser.
  
  =head2 incr_parse
  
      $json->incr_parse( [$string] ) # void context
      
      $obj_or_undef = $json->incr_parse( [$string] ) # scalar context
      
      @obj_or_empty = $json->incr_parse( [$string] ) # list context
  
  This is the central parsing function. It can both append new text and
  extract objects from the stream accumulated so far (both of these
  functions are optional).
  
  If C<$string> is given, then this string is appended to the already
  existing JSON fragment stored in the C<$json> object.
  
  After that, if the function is called in void context, it will simply
  return without doing anything further. This can be used to add more text
  in as many chunks as you want.
  
  If the method is called in scalar context, then it will try to extract
  exactly I<one> JSON object. If that is successful, it will return this
  object, otherwise it will return C<undef>. If there is a parse error,
  this method will croak just as C<decode> would do (one can then use
  C<incr_skip> to skip the erroneous part). This is the most common way of
  using the method.
  
  And finally, in list context, it will try to extract as many objects
  from the stream as it can find and return them, or the empty list
  otherwise. For this to work, there must be no separators (other than
  whitespace) between the JSON objects or arrays, instead they must be
  concatenated back-to-back. If an error occurs, an exception will be
  raised as in the scalar context case. Note that in this case, any
  previously-parsed JSON texts will be lost.
  
  Example: Parse some JSON arrays/objects in a given string and return
  them.
  
      my @objs = JSON::PP->new->incr_parse ("[5][7][1,2]");
  
  =head2 incr_text
  
      $lvalue_string = $json->incr_text
  
  This method returns the currently stored JSON fragment as an lvalue, that
  is, you can manipulate it. This I<only> works when a preceding call to
  C<incr_parse> in I<scalar context> successfully returned an object. Under
  all other circumstances you must not call this function (I mean it.
  although in simple tests it might actually work, it I<will> fail under
  real world conditions). As a special exception, you can also call this
  method before having parsed anything.
  
  That means you can only use this function to look at or manipulate text
  before or after complete JSON objects, not while the parser is in the
  middle of parsing a JSON object.
  
  This function is useful in two cases: a) finding the trailing text after a
  JSON object or b) parsing multiple JSON objects separated by non-JSON text
  (such as commas).
  
  =head2 incr_skip
  
      $json->incr_skip
  
  This will reset the state of the incremental parser and will remove
  the parsed text from the input buffer so far. This is useful after
  C<incr_parse> died, in which case the input buffer and incremental parser
  state is left unchanged, to skip the text parsed so far and to reset the
  parse state.
  
  The difference to C<incr_reset> is that only text until the parse error
  occurred is removed.
  
  =head2 incr_reset
  
      $json->incr_reset
  
  This completely resets the incremental parser, that is, after this call,
  it will be as if the parser had never parsed anything.
  
  This is useful if you want to repeatedly parse JSON objects and want to
  ignore any trailing data, which means you have to reset the parser after
  each successful decode.
  
  =head1 MAPPING
  
  Most of this section is also taken from JSON::XS.
  
  This section describes how JSON::PP maps Perl values to JSON values and
  vice versa. These mappings are designed to "do the right thing" in most
  circumstances automatically, preserving round-tripping characteristics
  (what you put in comes out as something equivalent).
  
  For the more enlightened: note that in the following descriptions,
  lowercase I<perl> refers to the Perl interpreter, while uppercase I<Perl>
  refers to the abstract Perl language itself.
  
  =head2 JSON -> PERL
  
  =over 4
  
  =item object
  
  A JSON object becomes a reference to a hash in Perl. No ordering of object
  keys is preserved (JSON does not preserve object key ordering itself).
  
  =item array
  
  A JSON array becomes a reference to an array in Perl.
  
  =item string
  
  A JSON string becomes a string scalar in Perl - Unicode codepoints in JSON
  are represented by the same codepoints in the Perl string, so no manual
  decoding is necessary.
  
  =item number
  
  A JSON number becomes either an integer, numeric (floating point) or
  string scalar in perl, depending on its range and any fractional parts. On
  the Perl level, there is no difference between those as Perl handles all
  the conversion details, but an integer may take slightly less memory and
  might represent more values exactly than floating point numbers.
  
  If the number consists of digits only, JSON::PP will try to represent
  it as an integer value. If that fails, it will try to represent it as
  a numeric (floating point) value if that is possible without loss of
  precision. Otherwise it will preserve the number as a string value (in
  which case you lose roundtripping ability, as the JSON number will be
  re-encoded to a JSON string).
  
  Numbers containing a fractional or exponential part will always be
  represented as numeric (floating point) values, possibly at a loss of
  precision (in which case you might lose perfect roundtripping ability, but
  the JSON number will still be re-encoded as a JSON number).
  
  Note that precision is not accuracy - binary floating point values cannot
  represent most decimal fractions exactly, and when converting from and to
  floating point, JSON::PP only guarantees precision up to but not including
  the least significant bit.
  
  When C<allow_bignum> is enabled, big integer values and any numeric
  values will be converted into L<Math::BigInt> and L<Math::BigFloat>
  objects respectively, without becoming string scalars or losing
  precision.
  
  =item true, false
  
  These JSON atoms become C<JSON::PP::true> and C<JSON::PP::false>,
  respectively. They are overloaded to act almost exactly like the numbers
  C<1> and C<0>. You can check whether a scalar is a JSON boolean by using
  the C<JSON::PP::is_bool> function.
  
  =item null
  
  A JSON null atom becomes C<undef> in Perl.
  
  =item shell-style comments (C<< # I<text> >>)
  
  As a nonstandard extension to the JSON syntax that is enabled by the
  C<relaxed> setting, shell-style comments are allowed. They can start
  anywhere outside strings and go till the end of the line.
  
  =item tagged values (C<< (I<tag>)I<value> >>).
  
  Another nonstandard extension to the JSON syntax, enabled with the
  C<allow_tags> setting, are tagged values. In this implementation, the
  I<tag> must be a perl package/class name encoded as a JSON string, and the
  I<value> must be a JSON array encoding optional constructor arguments.
  
  See L<OBJECT SERIALISATION>, below, for details.
  
  =back
  
  
  =head2 PERL -> JSON
  
  The mapping from Perl to JSON is slightly more difficult, as Perl is a
  truly typeless language, so we can only guess which JSON type is meant by
  a Perl value.
  
  =over 4
  
  =item hash references
  
  Perl hash references become JSON objects. As there is no inherent
  ordering in hash keys (or JSON objects), they will usually be encoded
  in a pseudo-random order. JSON::PP can optionally sort the hash keys
  (determined by the I<canonical> flag and/or I<sort_by> property), so
  the same data structure will serialise to the same JSON text (given
  same settings and version of JSON::PP), but this incurs a runtime
  overhead and is only rarely useful, e.g. when you want to compare some
  JSON text against another for equality.
  
  =item array references
  
  Perl array references become JSON arrays.
  
  =item other references
  
  Other unblessed references are generally not allowed and will cause an
  exception to be thrown, except for references to the integers C<0> and
  C<1>, which get turned into C<false> and C<true> atoms in JSON. You can
  also use C<JSON::PP::false> and C<JSON::PP::true> to improve
  readability.
  
     to_json [\0, JSON::PP::true]      # yields [false,true]
  
  =item JSON::PP::true, JSON::PP::false
  
  These special values become JSON true and JSON false values,
  respectively. You can also use C<\1> and C<\0> directly if you want.
  
  =item JSON::PP::null
  
  This special value becomes JSON null.
  
  =item blessed objects
  
  Blessed objects are not directly representable in JSON, but C<JSON::PP>
  allows various ways of handling objects. See L<OBJECT SERIALISATION>,
  below, for details.
  
  =item simple scalars
  
  Simple Perl scalars (any scalar that is not a reference) are the most
  difficult objects to encode: JSON::PP will encode undefined scalars as
  JSON C<null> values, scalars that have last been used in a string context
  before encoding as JSON strings, and anything else as number value:
  
     # dump as number
     encode_json [2]                      # yields [2]
     encode_json [-3.0e17]                # yields [-3e+17]
     my $value = 5; encode_json [$value]  # yields [5]
  
     # used as string, so dump as string
     print $value;
     encode_json [$value]                 # yields ["5"]
  
     # undef becomes null
     encode_json [undef]                  # yields [null]
  
  You can force the type to be a JSON string by stringifying it:
  
     my $x = 3.1; # some variable containing a number
     "$x";        # stringified
     $x .= "";    # another, more awkward way to stringify
     print $x;    # perl does it for you, too, quite often
                  # (but for older perls)
  
  You can force the type to be a JSON number by numifying it:
  
     my $x = "3"; # some variable containing a string
     $x += 0;     # numify it, ensuring it will be dumped as a number
     $x *= 1;     # same thing, the choice is yours.
  
  You can not currently force the type in other, less obscure, ways.
  
  Since version 2.91_01, JSON::PP uses a different number detection logic
  that converts a scalar that is possible to turn into a number safely.
  The new logic is slightly faster, and tends to help people who use older
  perl or who want to encode complicated data structure. However, this may
  results in a different JSON text from the one JSON::XS encodes (and
  thus may break tests that compare entire JSON texts). If you do
  need the previous behavior for compatibility or for finer control,
  set PERL_JSON_PP_USE_B environmental variable to true before you
  C<use> JSON::PP (or JSON.pm).
  
  Note that numerical precision has the same meaning as under Perl (so
  binary to decimal conversion follows the same rules as in Perl, which
  can differ to other languages). Also, your perl interpreter might expose
  extensions to the floating point numbers of your platform, such as
  infinities or NaN's - these cannot be represented in JSON, and it is an
  error to pass those in.
  
  JSON::PP (and JSON::XS) trusts what you pass to C<encode> method
  (or C<encode_json> function) is a clean, validated data structure with
  values that can be represented as valid JSON values only, because it's
  not from an external data source (as opposed to JSON texts you pass to
  C<decode> or C<decode_json>, which JSON::PP considers tainted and
  doesn't trust). As JSON::PP doesn't know exactly what you and consumers
  of your JSON texts want the unexpected values to be (you may want to
  convert them into null, or to stringify them with or without
  normalisation (string representation of infinities/NaN may vary
  depending on platforms), or to croak without conversion), you're advised
  to do what you and your consumers need before you encode, and also not
  to numify values that may start with values that look like a number
  (including infinities/NaN), without validating.
  
  =back
  
  =head2 OBJECT SERIALISATION
  
  As JSON cannot directly represent Perl objects, you have to choose between
  a pure JSON representation (without the ability to deserialise the object
  automatically again), and a nonstandard extension to the JSON syntax,
  tagged values.
  
  =head3 SERIALISATION
  
  What happens when C<JSON::PP> encounters a Perl object depends on the
  C<allow_blessed>, C<convert_blessed>, C<allow_tags> and C<allow_bignum>
  settings, which are used in this order:
  
  =over 4
  
  =item 1. C<allow_tags> is enabled and the object has a C<FREEZE> method.
  
  In this case, C<JSON::PP> creates a tagged JSON value, using a nonstandard
  extension to the JSON syntax.
  
  This works by invoking the C<FREEZE> method on the object, with the first
  argument being the object to serialise, and the second argument being the
  constant string C<JSON> to distinguish it from other serialisers.
  
  The C<FREEZE> method can return any number of values (i.e. zero or
  more). These values and the paclkage/classname of the object will then be
  encoded as a tagged JSON value in the following format:
  
     ("classname")[FREEZE return values...]
  
  e.g.:
  
     ("URI")["http://www.google.com/"]
     ("MyDate")[2013,10,29]
     ("ImageData::JPEG")["Z3...VlCg=="]
  
  For example, the hypothetical C<My::Object> C<FREEZE> method might use the
  objects C<type> and C<id> members to encode the object:
  
     sub My::Object::FREEZE {
        my ($self, $serialiser) = @_;
  
        ($self->{type}, $self->{id})
     }
  
  =item 2. C<convert_blessed> is enabled and the object has a C<TO_JSON> method.
  
  In this case, the C<TO_JSON> method of the object is invoked in scalar
  context. It must return a single scalar that can be directly encoded into
  JSON. This scalar replaces the object in the JSON text.
  
  For example, the following C<TO_JSON> method will convert all L<URI>
  objects to JSON strings when serialised. The fact that these values
  originally were L<URI> objects is lost.
  
     sub URI::TO_JSON {
        my ($uri) = @_;
        $uri->as_string
     }
  
  =item 3. C<allow_bignum> is enabled and the object is a C<Math::BigInt> or C<Math::BigFloat>.
  
  The object will be serialised as a JSON number value.
  
  =item 4. C<allow_blessed> is enabled.
  
  The object will be serialised as a JSON null value.
  
  =item 5. none of the above
  
  If none of the settings are enabled or the respective methods are missing,
  C<JSON::PP> throws an exception.
  
  =back
  
  =head3 DESERIALISATION
  
  For deserialisation there are only two cases to consider: either
  nonstandard tagging was used, in which case C<allow_tags> decides,
  or objects cannot be automatically be deserialised, in which
  case you can use postprocessing or the C<filter_json_object> or
  C<filter_json_single_key_object> callbacks to get some real objects our of
  your JSON.
  
  This section only considers the tagged value case: a tagged JSON object
  is encountered during decoding and C<allow_tags> is disabled, a parse
  error will result (as if tagged values were not part of the grammar).
  
  If C<allow_tags> is enabled, C<JSON::PP> will look up the C<THAW> method
  of the package/classname used during serialisation (it will not attempt
  to load the package as a Perl module). If there is no such method, the
  decoding will fail with an error.
  
  Otherwise, the C<THAW> method is invoked with the classname as first
  argument, the constant string C<JSON> as second argument, and all the
  values from the JSON array (the values originally returned by the
  C<FREEZE> method) as remaining arguments.
  
  The method must then return the object. While technically you can return
  any Perl scalar, you might have to enable the C<allow_nonref> setting to
  make that work in all cases, so better return an actual blessed reference.
  
  As an example, let's implement a C<THAW> function that regenerates the
  C<My::Object> from the C<FREEZE> example earlier:
  
     sub My::Object::THAW {
        my ($class, $serialiser, $type, $id) = @_;
  
        $class->new (type => $type, id => $id)
     }
  
  
  =head1 ENCODING/CODESET FLAG NOTES
  
  This section is taken from JSON::XS.
  
  The interested reader might have seen a number of flags that signify
  encodings or codesets - C<utf8>, C<latin1> and C<ascii>. There seems to be
  some confusion on what these do, so here is a short comparison:
  
  C<utf8> controls whether the JSON text created by C<encode> (and expected
  by C<decode>) is UTF-8 encoded or not, while C<latin1> and C<ascii> only
  control whether C<encode> escapes character values outside their respective
  codeset range. Neither of these flags conflict with each other, although
  some combinations make less sense than others.
  
  Care has been taken to make all flags symmetrical with respect to
  C<encode> and C<decode>, that is, texts encoded with any combination of
  these flag values will be correctly decoded when the same flags are used
  - in general, if you use different flag settings while encoding vs. when
  decoding you likely have a bug somewhere.
  
  Below comes a verbose discussion of these flags. Note that a "codeset" is
  simply an abstract set of character-codepoint pairs, while an encoding
  takes those codepoint numbers and I<encodes> them, in our case into
  octets. Unicode is (among other things) a codeset, UTF-8 is an encoding,
  and ISO-8859-1 (= latin 1) and ASCII are both codesets I<and> encodings at
  the same time, which can be confusing.
  
  =over 4
  
  =item C<utf8> flag disabled
  
  When C<utf8> is disabled (the default), then C<encode>/C<decode> generate
  and expect Unicode strings, that is, characters with high ordinal Unicode
  values (> 255) will be encoded as such characters, and likewise such
  characters are decoded as-is, no changes to them will be done, except
  "(re-)interpreting" them as Unicode codepoints or Unicode characters,
  respectively (to Perl, these are the same thing in strings unless you do
  funny/weird/dumb stuff).
  
  This is useful when you want to do the encoding yourself (e.g. when you
  want to have UTF-16 encoded JSON texts) or when some other layer does
  the encoding for you (for example, when printing to a terminal using a
  filehandle that transparently encodes to UTF-8 you certainly do NOT want
  to UTF-8 encode your data first and have Perl encode it another time).
  
  =item C<utf8> flag enabled
  
  If the C<utf8>-flag is enabled, C<encode>/C<decode> will encode all
  characters using the corresponding UTF-8 multi-byte sequence, and will
  expect your input strings to be encoded as UTF-8, that is, no "character"
  of the input string must have any value > 255, as UTF-8 does not allow
  that.
  
  The C<utf8> flag therefore switches between two modes: disabled means you
  will get a Unicode string in Perl, enabled means you get an UTF-8 encoded
  octet/binary string in Perl.
  
  =item C<latin1> or C<ascii> flags enabled
  
  With C<latin1> (or C<ascii>) enabled, C<encode> will escape characters
  with ordinal values > 255 (> 127 with C<ascii>) and encode the remaining
  characters as specified by the C<utf8> flag.
  
  If C<utf8> is disabled, then the result is also correctly encoded in those
  character sets (as both are proper subsets of Unicode, meaning that a
  Unicode string with all character values < 256 is the same thing as a
  ISO-8859-1 string, and a Unicode string with all character values < 128 is
  the same thing as an ASCII string in Perl).
  
  If C<utf8> is enabled, you still get a correct UTF-8-encoded string,
  regardless of these flags, just some more characters will be escaped using
  C<\uXXXX> then before.
  
  Note that ISO-8859-1-I<encoded> strings are not compatible with UTF-8
  encoding, while ASCII-encoded strings are. That is because the ISO-8859-1
  encoding is NOT a subset of UTF-8 (despite the ISO-8859-1 I<codeset> being
  a subset of Unicode), while ASCII is.
  
  Surprisingly, C<decode> will ignore these flags and so treat all input
  values as governed by the C<utf8> flag. If it is disabled, this allows you
  to decode ISO-8859-1- and ASCII-encoded strings, as both strict subsets of
  Unicode. If it is enabled, you can correctly decode UTF-8 encoded strings.
  
  So neither C<latin1> nor C<ascii> are incompatible with the C<utf8> flag -
  they only govern when the JSON output engine escapes a character or not.
  
  The main use for C<latin1> is to relatively efficiently store binary data
  as JSON, at the expense of breaking compatibility with most JSON decoders.
  
  The main use for C<ascii> is to force the output to not contain characters
  with values > 127, which means you can interpret the resulting string
  as UTF-8, ISO-8859-1, ASCII, KOI8-R or most about any character set and
  8-bit-encoding, and still get the same data structure back. This is useful
  when your channel for JSON transfer is not 8-bit clean or the encoding
  might be mangled in between (e.g. in mail), and works because ASCII is a
  proper subset of most 8-bit and multibyte encodings in use in the world.
  
  =back
  
  =head1 BUGS
  
  Please report bugs on a specific behavior of this module to RT or GitHub
  issues (preferred):
  
  L<https://github.com/makamaka/JSON-PP/issues>
  
  L<https://rt.cpan.org/Public/Dist/Display.html?Queue=JSON-PP>
  
  As for new features and requests to change common behaviors, please
  ask the author of JSON::XS (Marc Lehmann, E<lt>schmorp[at]schmorp.deE<gt>)
  first, by email (important!), to keep compatibility among JSON.pm backends.
  
  Generally speaking, if you need something special for you, you are advised
  to create a new module, maybe based on L<JSON::Tiny>, which is smaller and
  written in a much cleaner way than this module.
  
  =head1 SEE ALSO
  
  The F<json_pp> command line utility for quick experiments.
  
  L<JSON::XS>, L<Cpanel::JSON::XS>, and L<JSON::Tiny> for faster alternatives.
  L<JSON> and L<JSON::MaybeXS> for easy migration.
  
  L<JSON::PP::Compat5005> and L<JSON::PP::Compat5006> for older perl users.
  
  RFC4627 (L<http://www.ietf.org/rfc/rfc4627.txt>)
  
  RFC7159 (L<http://www.ietf.org/rfc/rfc7159.txt>)
  
  RFC8259 (L<http://www.ietf.org/rfc/rfc8259.txt>)
  
  =head1 AUTHOR
  
  Makamaka Hannyaharamitu, E<lt>makamaka[at]cpan.orgE<gt>
  
  =head1 CURRENT MAINTAINER
  
  Kenichi Ishigaki, E<lt>ishigaki[at]cpan.orgE<gt>
  
  =head1 COPYRIGHT AND LICENSE
  
  Copyright 2007-2016 by Makamaka Hannyaharamitu
  
  Most of the documentation is taken from JSON::XS by Marc Lehmann
  
  This library is free software; you can redistribute it and/or modify
  it under the same terms as Perl itself. 
  
  =cut
JSON_PP

    $main::fatpacked{"JSON/PP/Boolean.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'JSON_PP_BOOLEAN';
  package JSON::PP::Boolean;
  
  use strict;
  require overload;
  local $^W;
  overload::import('overload',
      "0+"     => sub { ${$_[0]} },
      "++"     => sub { $_[0] = ${$_[0]} + 1 },
      "--"     => sub { $_[0] = ${$_[0]} - 1 },
      fallback => 1,
  );
  
  $JSON::PP::Boolean::VERSION = '4.02';
  
  1;
  
  __END__
  
  =head1 NAME
  
  JSON::PP::Boolean - dummy module providing JSON::PP::Boolean
  
  =head1 SYNOPSIS
  
   # do not "use" yourself
  
  =head1 DESCRIPTION
  
  This module exists only to provide overload resolution for Storable and similar modules. See
  L<JSON::PP> for more info about this class.
  
  =head1 AUTHOR
  
  This idea is from L<JSON::XS::Boolean> written by Marc Lehmann <schmorp[at]schmorp.de>
  
  =head1 LICENSE
  
  This library is free software; you can redistribute it and/or modify
  it under the same terms as Perl itself.
  
  =cut
  
JSON_PP_BOOLEAN

    $main::fatpacked{"LWP.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LWP';
  package LWP;
  
  our $VERSION = '6.39';
  
  require LWP::UserAgent;  # this should load everything you need
  
  sub Version { $VERSION; }
  
  1;
  
  __END__
  
  =pod
  
  =encoding utf-8
  
  =head1 NAME
  
  LWP - The World-Wide Web library for Perl
  
  =head1 SYNOPSIS
  
    use LWP;
    print "This is libwww-perl-$LWP::VERSION\n";
  
  
  =head1 DESCRIPTION
  
  The libwww-perl collection is a set of Perl modules which provides a
  simple and consistent application programming interface (API) to the
  World-Wide Web.  The main focus of the library is to provide classes
  and functions that allow you to write WWW clients. The library also
  contain modules that are of more general use and even classes that
  help you implement simple HTTP servers.
  
  Most modules in this library provide an object oriented API.  The user
  agent, requests sent and responses received from the WWW server are
  all represented by objects.  This makes a simple and powerful
  interface to these services.  The interface is easy to extend
  and customize for your own needs.
  
  The main features of the library are:
  
  =over 3
  
  =item *
  
  Contains various reusable components (modules) that can be
  used separately or together.
  
  =item *
  
  Provides an object oriented model of HTTP-style communication.  Within
  this framework we currently support access to C<http>, C<https>, C<gopher>,
  C<ftp>, C<news>, C<file>, and C<mailto> resources.
  
  =item *
  
  Provides a full object oriented interface or
  a very simple procedural interface.
  
  =item *
  
  Supports the basic and digest authorization schemes.
  
  =item *
  
  Supports transparent redirect handling.
  
  =item *
  
  Supports access through proxy servers.
  
  =item *
  
  Provides parser for F<robots.txt> files and a framework for constructing robots.
  
  =item *
  
  Supports parsing of HTML forms.
  
  =item *
  
  Implements HTTP content negotiation algorithm that can
  be used both in protocol modules and in server scripts (like CGI
  scripts).
  
  =item *
  
  Supports HTTP cookies.
  
  =item *
  
  Some simple command line clients, for instance C<lwp-request> and C<lwp-download>.
  
  =back
  
  
  =head1 HTTP STYLE COMMUNICATION
  
  
  The libwww-perl library is based on HTTP style communication. This
  section tries to describe what that means.
  
  Let us start with this quote from the HTTP specification document
  <URL:http://www.w3.org/Protocols/>:
  
  =over 3
  
  =item *
  
  The HTTP protocol is based on a request/response paradigm. A client
  establishes a connection with a server and sends a request to the
  server in the form of a request method, URI, and protocol version,
  followed by a MIME-like message containing request modifiers, client
  information, and possible body content. The server responds with a
  status line, including the message's protocol version and a success or
  error code, followed by a MIME-like message containing server
  information, entity meta-information, and possible body content.
  
  =back
  
  What this means to libwww-perl is that communication always take place
  through these steps: First a I<request> object is created and
  configured. This object is then passed to a server and we get a
  I<response> object in return that we can examine. A request is always
  independent of any previous requests, i.e. the service is stateless.
  The same simple model is used for any kind of service we want to
  access.
  
  For example, if we want to fetch a document from a remote file server,
  then we send it a request that contains a name for that document and
  the response will contain the document itself.  If we access a search
  engine, then the content of the request will contain the query
  parameters and the response will contain the query result.  If we want
  to send a mail message to somebody then we send a request object which
  contains our message to the mail server and the response object will
  contain an acknowledgment that tells us that the message has been
  accepted and will be forwarded to the recipient(s).
  
  It is as simple as that!
  
  
  =head2 The Request Object
  
  The libwww-perl request object has the class name L<HTTP::Request>.
  The fact that the class name uses C<HTTP::> as a
  prefix only implies that we use the HTTP model of communication.  It
  does not limit the kind of services we can try to pass this I<request>
  to.  For instance, we will send L<HTTP::Request>s both to ftp and
  gopher servers, as well as to the local file system.
  
  The main attributes of the request objects are:
  
  =over 3
  
  =item *
  
  B<method> is a short string that tells what kind of
  request this is.  The most common methods are B<GET>, B<PUT>,
  B<POST> and B<HEAD>.
  
  =item *
  
  B<uri> is a string denoting the protocol, server and
  the name of the "document" we want to access.  The B<uri> might
  also encode various other parameters.
  
  =item *
  
  B<headers> contains additional information about the
  request and can also used to describe the content.  The headers
  are a set of keyword/value pairs.
  
  =item *
  
  B<content> is an arbitrary amount of data.
  
  =back
  
  =head2 The Response Object
  
  The libwww-perl response object has the class name L<HTTP::Response>.
  The main attributes of objects of this class are:
  
  =over 3
  
  =item *
  
  B<code> is a numerical value that indicates the overall
  outcome of the request.
  
  =item *
  
  B<message> is a short, human readable string that
  corresponds to the I<code>.
  
  =item *
  
  B<headers> contains additional information about the
  response and describe the content.
  
  =item *
  
  B<content> is an arbitrary amount of data.
  
  =back
  
  Since we don't want to handle all possible I<code> values directly in
  our programs, a libwww-perl response object has methods that can be
  used to query what kind of response this is.  The most commonly used
  response classification methods are:
  
  =over 3
  
  =item is_success()
  
  The request was successfully received, understood or accepted.
  
  =item is_error()
  
  The request failed.  The server or the resource might not be
  available, access to the resource might be denied or other things might
  have failed for some reason.
  
  =back
  
  =head2 The User Agent
  
  Let us assume that we have created a I<request> object. What do we
  actually do with it in order to receive a I<response>?
  
  The answer is that you pass it to a I<user agent> object and this
  object takes care of all the things that need to be done
  (like low-level communication and error handling) and returns
  a I<response> object. The user agent represents your
  application on the network and provides you with an interface that
  can accept I<requests> and return I<responses>.
  
  The user agent is an interface layer between
  your application code and the network.  Through this interface you are
  able to access the various servers on the network.
  
  The class name for the user agent is L<LWP::UserAgent>.  Every
  libwww-perl application that wants to communicate should create at
  least one object of this class. The main method provided by this
  object is request(). This method takes an L<HTTP::Request> object as
  argument and (eventually) returns a L<HTTP::Response> object.
  
  The user agent has many other attributes that let you
  configure how it will interact with the network and with your
  application.
  
  =over 3
  
  =item *
  
  B<timeout> specifies how much time we give remote servers to
  respond before the library disconnects and creates an
  internal I<timeout> response.
  
  =item *
  
  B<agent> specifies the name that your application uses when it
  presents itself on the network.
  
  =item *
  
  B<from> can be set to the e-mail address of the person
  responsible for running the application.  If this is set, then the
  address will be sent to the servers with every request.
  
  =item *
  
  B<parse_head> specifies whether we should initialize response
  headers from the E<lt>head> section of HTML documents.
  
  =item *
  
  B<proxy> and B<no_proxy> specify if and when to go through
  a proxy server. <URL:http://www.w3.org/History/1994/WWW/Proxies/>
  
  =item *
  
  B<credentials> provides a way to set up user names and
  passwords needed to access certain services.
  
  =back
  
  Many applications want even more control over how they interact
  with the network and they get this by sub-classing
  L<LWP::UserAgent>.  The library includes a
  sub-class, L<LWP::RobotUA>, for robot applications.
  
  =head2 An Example
  
  This example shows how the user agent, a request and a response are
  represented in actual perl code:
  
    # Create a user agent object
    use LWP::UserAgent;
    my $ua = LWP::UserAgent->new;
    $ua->agent("MyApp/0.1 ");
  
    # Create a request
    my $req = HTTP::Request->new(POST => 'http://search.cpan.org/search');
    $req->content_type('application/x-www-form-urlencoded');
    $req->content('query=libwww-perl&mode=dist');
  
    # Pass request to the user agent and get a response back
    my $res = $ua->request($req);
  
    # Check the outcome of the response
    if ($res->is_success) {
        print $res->content;
    }
    else {
        print $res->status_line, "\n";
    }
  
  The $ua is created once when the application starts up.  New request
  objects should normally created for each request sent.
  
  
  =head1 NETWORK SUPPORT
  
  This section discusses the various protocol schemes and
  the HTTP style methods that headers may be used for each.
  
  For all requests, a "User-Agent" header is added and initialized from
  the $ua->agent attribute before the request is handed to the network
  layer.  In the same way, a "From" header is initialized from the
  $ua->from attribute.
  
  For all responses, the library adds a header called "Client-Date".
  This header holds the time when the response was received by
  your application.  The format and semantics of the header are the
  same as the server created "Date" header.  You may also encounter other
  "Client-XXX" headers.  They are all generated by the library
  internally and are not received from the servers.
  
  =head2 HTTP Requests
  
  HTTP requests are just handed off to an HTTP server and it
  decides what happens.  Few servers implement methods beside the usual
  "GET", "HEAD", "POST" and "PUT", but CGI-scripts may implement
  any method they like.
  
  If the server is not available then the library will generate an
  internal error response.
  
  The library automatically adds a "Host" and a "Content-Length" header
  to the HTTP request before it is sent over the network.
  
  For a GET request you might want to add a "If-Modified-Since" or
  "If-None-Match" header to make the request conditional.
  
  For a POST request you should add the "Content-Type" header.  When you
  try to emulate HTML E<lt>FORM> handling you should usually let the value
  of the "Content-Type" header be "application/x-www-form-urlencoded".
  See L<lwpcook> for examples of this.
  
  The libwww-perl HTTP implementation currently support the HTTP/1.1
  and HTTP/1.0 protocol.
  
  The library allows you to access proxy server through HTTP.  This
  means that you can set up the library to forward all types of request
  through the HTTP protocol module.  See L<LWP::UserAgent> for
  documentation of this.
  
  
  =head2 HTTPS Requests
  
  HTTPS requests are HTTP requests over an encrypted network connection
  using the SSL protocol developed by Netscape.  Everything about HTTP
  requests above also apply to HTTPS requests.  In addition the library
  will add the headers "Client-SSL-Cipher", "Client-SSL-Cert-Subject" and
  "Client-SSL-Cert-Issuer" to the response.  These headers denote the
  encryption method used and the name of the server owner.
  
  The request can contain the header "If-SSL-Cert-Subject" in order to
  make the request conditional on the content of the server certificate.
  If the certificate subject does not match, no request is sent to the
  server and an internally generated error response is returned.  The
  value of the "If-SSL-Cert-Subject" header is interpreted as a Perl
  regular expression.
  
  
  =head2 FTP Requests
  
  The library currently supports GET, HEAD and PUT requests.  GET
  retrieves a file or a directory listing from an FTP server.  PUT
  stores a file on a ftp server.
  
  You can specify a ftp account for servers that want this in addition
  to user name and password.  This is specified by including an "Account"
  header in the request.
  
  User name/password can be specified using basic authorization or be
  encoded in the URL.  Failed logins return an UNAUTHORIZED response with
  "WWW-Authenticate: Basic" and can be treated like basic authorization
  for HTTP.
  
  The library supports ftp ASCII transfer mode by specifying the "type=a"
  parameter in the URL. It also supports transfer of ranges for FTP transfers
  using the "Range" header.
  
  Directory listings are by default returned unprocessed (as returned
  from the ftp server) with the content media type reported to be
  "text/ftp-dir-listing". The L<File::Listing> module provides methods
  for parsing of these directory listing.
  
  The ftp module is also able to convert directory listings to HTML and
  this can be requested via the standard HTTP content negotiation
  mechanisms (add an "Accept: text/html" header in the request if you
  want this).
  
  For normal file retrievals, the "Content-Type" is guessed based on the
  file name suffix. See L<LWP::MediaTypes>.
  
  The "If-Modified-Since" request header works for servers that implement
  the C<MDTM> command.  It will probably not work for directory listings though.
  
  Example:
  
    $req = HTTP::Request->new(GET => 'ftp://me:passwd@ftp.some.where.com/');
    $req->header(Accept => "text/html, */*;q=0.1");
  
  =head2 News Requests
  
  Access to the USENET News system is implemented through the NNTP
  protocol.  The name of the news server is obtained from the
  NNTP_SERVER environment variable and defaults to "news".  It is not
  possible to specify the hostname of the NNTP server in news: URLs.
  
  The library supports GET and HEAD to retrieve news articles through the
  NNTP protocol.  You can also post articles to newsgroups by using
  (surprise!) the POST method.
  
  GET on newsgroups is not implemented yet.
  
  Examples:
  
    $req = HTTP::Request->new(GET => 'news:abc1234@a.sn.no');
  
    $req = HTTP::Request->new(POST => 'news:comp.lang.perl.test');
    $req->header(Subject => 'This is a test',
                 From    => 'me@some.where.org');
    $req->content(<<EOT);
    This is the content of the message that we are sending to
    the world.
    EOT
  
  
  =head2 Gopher Request
  
  The library supports the GET and HEAD methods for gopher requests.  All
  request header values are ignored.  HEAD cheats and returns a
  response without even talking to server.
  
  Gopher menus are always converted to HTML.
  
  The response "Content-Type" is generated from the document type
  encoded (as the first letter) in the request URL path itself.
  
  Example:
  
    $req = HTTP::Request->new(GET => 'gopher://gopher.sn.no/');
  
  
  
  =head2 File Request
  
  The library supports GET and HEAD methods for file requests.  The
  "If-Modified-Since" header is supported.  All other headers are
  ignored.  The I<host> component of the file URL must be empty or set
  to "localhost".  Any other I<host> value will be treated as an error.
  
  Directories are always converted to an HTML document.  For normal
  files, the "Content-Type" and "Content-Encoding" in the response are
  guessed based on the file suffix.
  
  Example:
  
    $req = HTTP::Request->new(GET => 'file:/etc/passwd');
  
  
  =head2 Mailto Request
  
  You can send (aka "POST") mail messages using the library.  All
  headers specified for the request are passed on to the mail system.
  The "To" header is initialized from the mail address in the URL.
  
  Example:
  
    $req = HTTP::Request->new(POST => 'mailto:libwww@perl.org');
    $req->header(Subject => "subscribe");
    $req->content("Please subscribe me to the libwww-perl mailing list!\n");
  
  =head2 CPAN Requests
  
  URLs with scheme C<cpan:> are redirected to a suitable CPAN
  mirror.  If you have your own local mirror of CPAN you might tell LWP
  to use it for C<cpan:> URLs by an assignment like this:
  
    $LWP::Protocol::cpan::CPAN = "file:/local/CPAN/";
  
  Suitable CPAN mirrors are also picked up from the configuration for
  the CPAN.pm, so if you have used that module a suitable mirror should
  be picked automatically.  If neither of these apply, then a redirect
  to the generic CPAN http location is issued.
  
  Example request to download the newest perl:
  
    $req = HTTP::Request->new(GET => "cpan:src/latest.tar.gz");
  
  
  =head1 OVERVIEW OF CLASSES AND PACKAGES
  
  This table should give you a quick overview of the classes provided by the
  library. Indentation shows class inheritance.
  
   LWP::MemberMixin   -- Access to member variables of Perl5 classes
     LWP::UserAgent   -- WWW user agent class
       LWP::RobotUA   -- When developing a robot applications
     LWP::Protocol          -- Interface to various protocol schemes
       LWP::Protocol::http  -- http:// access
       LWP::Protocol::file  -- file:// access
       LWP::Protocol::ftp   -- ftp:// access
       ...
  
   LWP::Authen::Basic -- Handle 401 and 407 responses
   LWP::Authen::Digest
  
   HTTP::Headers      -- MIME/RFC822 style header (used by HTTP::Message)
   HTTP::Message      -- HTTP style message
     HTTP::Request    -- HTTP request
     HTTP::Response   -- HTTP response
   HTTP::Daemon       -- A HTTP server class
  
   WWW::RobotRules    -- Parse robots.txt files
     WWW::RobotRules::AnyDBM_File -- Persistent RobotRules
  
   Net::HTTP          -- Low level HTTP client
  
  The following modules provide various functions and definitions.
  
   LWP                -- This file.  Library version number and documentation.
   LWP::MediaTypes    -- MIME types configuration (text/html etc.)
   LWP::Simple        -- Simplified procedural interface for common functions
   HTTP::Status       -- HTTP status code (200 OK etc)
   HTTP::Date         -- Date parsing module for HTTP date formats
   HTTP::Negotiate    -- HTTP content negotiation calculation
   File::Listing      -- Parse directory listings
   HTML::Form         -- Processing for <form>s in HTML documents
  
  
  =head1 MORE DOCUMENTATION
  
  All modules contain detailed information on the interfaces they
  provide.  The L<lwpcook> manpage is the libwww-perl cookbook that contain
  examples of typical usage of the library.  You might want to take a
  look at how the scripts L<lwp-request>, L<lwp-download>, L<lwp-dump>
  and L<lwp-mirror> are implemented.
  
  =head1 ENVIRONMENT
  
  The following environment variables are used by LWP:
  
  =over
  
  =item HOME
  
  The L<LWP::MediaTypes> functions will look for the F<.media.types> and
  F<.mime.types> files relative to you home directory.
  
  =item http_proxy
  
  =item ftp_proxy
  
  =item xxx_proxy
  
  =item no_proxy
  
  These environment variables can be set to enable communication through
  a proxy server.  See the description of the C<env_proxy> method in
  L<LWP::UserAgent>.
  
  =item PERL_LWP_ENV_PROXY
  
  If set to a TRUE value, then the L<LWP::UserAgent> will by default call
  C<env_proxy> during initialization.  This makes LWP honor the proxy variables
  described above.
  
  =item PERL_LWP_SSL_VERIFY_HOSTNAME
  
  The default C<verify_hostname> setting for L<LWP::UserAgent>.  If
  not set the default will be 1.  Set it as 0 to disable hostname
  verification (the default prior to libwww-perl 5.840.
  
  =item PERL_LWP_SSL_CA_FILE
  
  =item PERL_LWP_SSL_CA_PATH
  
  The file and/or directory
  where the trusted Certificate Authority certificates
  is located.  See L<LWP::UserAgent> for details.
  
  =item PERL_HTTP_URI_CLASS
  
  Used to decide what URI objects to instantiate.  The default is L<URI>.
  You might want to set it to L<URI::URL> for compatibility with old times.
  
  =back
  
  =head1 AUTHORS
  
  LWP was made possible by contributions from Adam Newby, Albert
  Dvornik, Alexandre Duret-Lutz, Andreas Gustafsson, Andreas König,
  Andrew Pimlott, Andy Lester, Ben Coleman, Benjamin Low, Ben Low, Ben
  Tilly, Blair Zajac, Bob Dalgleish, BooK, Brad Hughes, Brian
  J. Murrell, Brian McCauley, Charles C. Fu, Charles Lane, Chris Nandor,
  Christian Gilmore, Chris W. Unger, Craig Macdonald, Dale Couch, Dan
  Kubb, Dave Dunkin, Dave W. Smith, David Coppit, David Dick, David
  D. Kilzer, Doug MacEachern, Edward Avis, erik, Gary Shea, Gisle Aas,
  Graham Barr, Gurusamy Sarathy, Hans de Graaff, Harald Joerg, Harry
  Bochner, Hugo, Ilya Zakharevich, INOUE Yoshinari, Ivan Panchenko, Jack
  Shirazi, James Tillman, Jan Dubois, Jared Rhine, Jim Stern, Joao
  Lopes, John Klar, Johnny Lee, Josh Kronengold, Josh Rai, Joshua
  Chamas, Joshua Hoblitt, Kartik Subbarao, Keiichiro Nagano, Ken
  Williams, KONISHI Katsuhiro, Lee T Lindley, Liam Quinn, Marc Hedlund,
  Marc Langheinrich, Mark D. Anderson, Marko Asplund, Mark Stosberg,
  Markus B Krüger, Markus Laker, Martijn Koster, Martin Thurn, Matthew
  Eldridge, Matthew.van.Eerde, Matt Sergeant, Michael A. Chase, Michael
  Quaranta, Michael Thompson, Mike Schilli, Moshe Kaminsky, Nathan
  Torkington, Nicolai Langfeldt, Norton Allen, Olly Betts, Paul
  J. Schinder, peterm, Philip Guenther, Daniel Buenzli, Pon Hwa Lin,
  Radoslaw Zielinski, Radu Greab, Randal L. Schwartz, Richard Chen,
  Robin Barker, Roy Fielding, Sander van Zoest, Sean M. Burke,
  shildreth, Slaven Rezic, Steve A Fink, Steve Hay, Steven Butler,
  Steve_Kilbane, Takanori Ugai, Thomas Lotterer, Tim Bunce, Tom Hughes,
  Tony Finch, Ville Skyttä, Ward Vandewege, William York, Yale Huang,
  and Yitzchak Scott-Thoennes.
  
  LWP owes a lot in motivation, design, and code, to the libwww-perl
  library for Perl4 by Roy Fielding, which included work from Alberto
  Accomazzi, James Casey, Brooks Cutter, Martijn Koster, Oscar
  Nierstrasz, Mel Melchner, Gertjan van Oosten, Jared Rhine, Jack
  Shirazi, Gene Spafford, Marc VanHeyningen, Steven E. Brenner, Marion
  Hakanson, Waldemar Kebsch, Tony Sanders, and Larry Wall; see the
  libwww-perl-0.40 library for details.
  
  =head1 COPYRIGHT
  
    Copyright 1995-2009, Gisle Aas
    Copyright 1995, Martijn Koster
  
  This library is free software; you can redistribute it and/or
  modify it under the same terms as Perl itself.
  
  =head1 AVAILABILITY
  
  The latest version of this library is likely to be available from CPAN
  as well as:
  
    http://github.com/libwww-perl/libwww-perl
  
  The best place to discuss this code is on the <libwww@perl.org>
  mailing list.
  
  =cut
LWP

    $main::fatpacked{"LWP/Authen/Basic.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LWP_AUTHEN_BASIC';
  package LWP::Authen::Basic;
  
  use strict;
  
  our $VERSION = '6.39';
  
  require MIME::Base64;
  
  sub auth_header {
      my($class, $user, $pass) = @_;
      return "Basic " . MIME::Base64::encode("$user:$pass", "");
  }
  
  sub authenticate
  {
      my($class, $ua, $proxy, $auth_param, $response,
         $request, $arg, $size) = @_;
  
      my $realm = $auth_param->{realm} || "";
      my $url = $proxy ? $request->{proxy} : $request->uri_canonical;
      return $response unless $url;
      my $host_port = $url->host_port;
      my $auth_header = $proxy ? "Proxy-Authorization" : "Authorization";
  
      my @m = $proxy ? (m_proxy => $url) : (m_host_port => $host_port);
      push(@m, realm => $realm);
  
      my $h = $ua->get_my_handler("request_prepare", @m, sub {
          $_[0]{callback} = sub {
              my($req, $ua, $h) = @_;
              my($user, $pass) = $ua->credentials($host_port, $h->{realm});
  	    if (defined $user) {
  		my $auth_value = $class->auth_header($user, $pass, $req, $ua, $h);
  		$req->header($auth_header => $auth_value);
  	    }
          };
      });
      $h->{auth_param} = $auth_param;
  
      if (!$proxy && !$request->header($auth_header) && $ua->credentials($host_port, $realm)) {
  	# we can make sure this handler applies and retry
          add_path($h, $url->path);
          return $ua->request($request->clone, $arg, $size, $response);
      }
  
      my($user, $pass) = $ua->get_basic_credentials($realm, $url, $proxy);
      unless (defined $user and defined $pass) {
  	$ua->set_my_handler("request_prepare", undef, @m);  # delete handler
  	return $response;
      }
  
      # check that the password has changed
      my ($olduser, $oldpass) = $ua->credentials($host_port, $realm);
      return $response if (defined $olduser and defined $oldpass and
                           $user eq $olduser and $pass eq $oldpass);
  
      $ua->credentials($host_port, $realm, $user, $pass);
      add_path($h, $url->path) unless $proxy;
      return $ua->request($request->clone, $arg, $size, $response);
  }
  
  sub add_path {
      my($h, $path) = @_;
      $path =~ s,[^/]+\z,,;
      push(@{$h->{m_path_prefix}}, $path);
  }
  
  1;
LWP_AUTHEN_BASIC

    $main::fatpacked{"LWP/Authen/Digest.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LWP_AUTHEN_DIGEST';
  package LWP::Authen::Digest;
  
  use strict;
  use base 'LWP::Authen::Basic';
  
  our $VERSION = '6.39';
  
  require Digest::MD5;
  
  sub auth_header {
      my($class, $user, $pass, $request, $ua, $h) = @_;
  
      my $auth_param = $h->{auth_param};
  
      my $nc = sprintf "%08X", ++$ua->{authen_md5_nonce_count}{$auth_param->{nonce}};
      my $cnonce = sprintf "%8x", time;
  
      my $uri = $request->uri->path_query;
      $uri = "/" unless length $uri;
  
      my $md5 = Digest::MD5->new;
  
      my(@digest);
      $md5->add(join(":", $user, $auth_param->{realm}, $pass));
      push(@digest, $md5->hexdigest);
      $md5->reset;
  
      push(@digest, $auth_param->{nonce});
  
      if ($auth_param->{qop}) {
  	push(@digest, $nc, $cnonce, ($auth_param->{qop} =~ m|^auth[,;]auth-int$|) ? 'auth' : $auth_param->{qop});
      }
  
      $md5->add(join(":", $request->method, $uri));
      push(@digest, $md5->hexdigest);
      $md5->reset;
  
      $md5->add(join(":", @digest));
      my($digest) = $md5->hexdigest;
      $md5->reset;
  
      my %resp = map { $_ => $auth_param->{$_} } qw(realm nonce opaque);
      @resp{qw(username uri response algorithm)} = ($user, $uri, $digest, "MD5");
  
      if (($auth_param->{qop} || "") =~ m|^auth([,;]auth-int)?$|) {
  	@resp{qw(qop cnonce nc)} = ("auth", $cnonce, $nc);
      }
  
      my(@order) = qw(username realm qop algorithm uri nonce nc cnonce response);
      if($request->method =~ /^(?:POST|PUT)$/) {
  	$md5->add($request->content);
  	my $content = $md5->hexdigest;
  	$md5->reset;
  	$md5->add(join(":", @digest[0..1], $content));
  	$md5->reset;
  	$resp{"message-digest"} = $md5->hexdigest;
  	push(@order, "message-digest");
      }
      push(@order, "opaque");
      my @pairs;
      for (@order) {
  	next unless defined $resp{$_};
  
  	# RFC2617 says that qop-value and nc-value should be unquoted.
  	if ( $_ eq 'qop' || $_ eq 'nc' ) {
  		push(@pairs, "$_=" . $resp{$_});
  	}
  	else {
  		push(@pairs, "$_=" . qq("$resp{$_}"));
  	}
      }
  
      my $auth_value  = "Digest " . join(", ", @pairs);
      return $auth_value;
  }
  
  1;
LWP_AUTHEN_DIGEST

    $main::fatpacked{"LWP/Authen/Ntlm.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LWP_AUTHEN_NTLM';
  package LWP::Authen::Ntlm;
  
  use strict;
  
  our $VERSION = '6.39';
  
  use Authen::NTLM "1.02";
  use MIME::Base64 "2.12";
  
  sub authenticate {
      my($class, $ua, $proxy, $auth_param, $response,
         $request, $arg, $size) = @_;
  
      my($user, $pass) = $ua->get_basic_credentials($auth_param->{realm},
                                                    $request->uri, $proxy);
  
      unless(defined $user and defined $pass) {
  		return $response;
  	}
  
  	if (!$ua->conn_cache()) {
  		warn "The keep_alive option must be enabled for NTLM authentication to work.  NTLM authentication aborted.\n";
  		return $response;
  	}
  
  	my($domain, $username) = split(/\\/, $user);
  
  	ntlm_domain($domain);
  	ntlm_user($username);
  	ntlm_password($pass);
  
      my $auth_header = $proxy ? "Proxy-Authorization" : "Authorization";
  
  	# my ($challenge) = $response->header('WWW-Authenticate');
  	my $challenge;
  	foreach ($response->header('WWW-Authenticate')) {
  		last if /^NTLM/ && ($challenge=$_);
  	}
  
  	if ($challenge eq 'NTLM') {
  		# First phase, send handshake
  	    my $auth_value = "NTLM " . ntlm();
  		ntlm_reset();
  
  	    # Need to check this isn't a repeated fail!
  	    my $r = $response;
  		my $retry_count = 0;
  	    while ($r) {
  			my $auth = $r->request->header($auth_header);
  			++$retry_count if ($auth && $auth eq $auth_value);
  			if ($retry_count > 2) {
  				    # here we know this failed before
  				    $response->header("Client-Warning" =>
  						      "Credentials for '$user' failed before");
  				    return $response;
  			}
  			$r = $r->previous;
  	    }
  
  	    my $referral = $request->clone;
  	    $referral->header($auth_header => $auth_value);
  	    return $ua->request($referral, $arg, $size, $response);
  	}
  
  	else {
  		# Second phase, use the response challenge (unless non-401 code
  		#  was returned, in which case, we just send back the response
  		#  object, as is
  		my $auth_value;
  		if ($response->code ne '401') {
  			return $response;
  		}
  		else {
  			my $challenge;
  			foreach ($response->header('WWW-Authenticate')) {
  				last if /^NTLM/ && ($challenge=$_);
  			}
  			$challenge =~ s/^NTLM //;
  			ntlm();
  			$auth_value = "NTLM " . ntlm($challenge);
  			ntlm_reset();
  		}
  
  	    my $referral = $request->clone;
  	    $referral->header($auth_header => $auth_value);
  	    my $response2 = $ua->request($referral, $arg, $size, $response);
  		return $response2;
  	}
  }
  
  1;
  __END__
  
  =pod
  
  =head1 NAME
  
  LWP::Authen::Ntlm - Library for enabling NTLM authentication (Microsoft) in LWP
  
  =head1 SYNOPSIS
  
   use LWP::UserAgent;
   use HTTP::Request::Common;
   my $url = 'http://www.company.com/protected_page.html';
  
   # Set up the ntlm client and then the base64 encoded ntlm handshake message
   my $ua = LWP::UserAgent->new(keep_alive=>1);
   $ua->credentials('www.company.com:80', '', "MyDomain\\MyUserCode", 'MyPassword');
  
   $request = GET $url;
   print "--Performing request now...-----------\n";
   $response = $ua->request($request);
   print "--Done with request-------------------\n";
  
   if ($response->is_success) {print "It worked!->" . $response->code . "\n"}
   else {print "It didn't work!->" . $response->code . "\n"}
  
  =head1 DESCRIPTION
  
  L<LWP::Authen::Ntlm> allows LWP to authenticate against servers that are using the
  NTLM authentication scheme popularized by Microsoft.  This type of authentication is
  common on intranets of Microsoft-centric organizations.
  
  The module takes advantage of the Authen::NTLM module by Mark Bush.  Since there
  is also another Authen::NTLM module available from CPAN by Yee Man Chan with an
  entirely different interface, it is necessary to ensure that you have the correct
  NTLM module.
  
  In addition, there have been problems with incompatibilities between different
  versions of Mime::Base64, which Bush's Authen::NTLM makes use of.  Therefore, it is
  necessary to ensure that your Mime::Base64 module supports exporting of the
  encode_base64 and decode_base64 functions.
  
  =head1 USAGE
  
  The module is used indirectly through LWP, rather than including it directly in your
  code.  The LWP system will invoke the NTLM authentication when it encounters the
  authentication scheme while attempting to retrieve a URL from a server.  In order
  for the NTLM authentication to work, you must have a few things set up in your
  code prior to attempting to retrieve the URL:
  
  =over 4
  
  =item *
  
  Enable persistent HTTP connections
  
  To do this, pass the "keep_alive=>1" option to the LWP::UserAgent when creating it, like this:
  
      my $ua = LWP::UserAgent->new(keep_alive=>1);
  
  =item *
  
  Set the credentials on the UserAgent object
  
  The credentials must be set like this:
  
     $ua->credentials('www.company.com:80', '', "MyDomain\\MyUserCode", 'MyPassword');
  
  Note that you cannot use the HTTP::Request object's authorization_basic() method to set
  the credentials.  Note, too, that the 'www.company.com:80' portion only sets credentials
  on the specified port AND it is case-sensitive (this is due to the way LWP is coded, and
  has nothing to do with LWP::Authen::Ntlm)
  
  =back
  
  =head1 AVAILABILITY
  
  General queries regarding LWP should be made to the LWP Mailing List.
  
  Questions specific to LWP::Authen::Ntlm can be forwarded to jtillman@bigfoot.com
  
  =head1 COPYRIGHT
  
  Copyright (c) 2002 James Tillman. All rights reserved. This
  program is free software; you can redistribute it and/or modify it
  under the same terms as Perl itself.
  
  =head1 SEE ALSO
  
  L<LWP>, L<LWP::UserAgent>, L<lwpcook>.
  
  =cut
LWP_AUTHEN_NTLM

    $main::fatpacked{"LWP/ConnCache.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LWP_CONNCACHE';
  package LWP::ConnCache;
  
  use strict;
  
  our $VERSION = '6.39';
  our $DEBUG;
  
  sub new {
      my($class, %cnf) = @_;
  
      my $total_capacity = 1;
      if (exists $cnf{total_capacity}) {
          $total_capacity = delete $cnf{total_capacity};
      }
      if (%cnf && $^W) {
  	require Carp;
  	Carp::carp("Unrecognised options: @{[sort keys %cnf]}")
      }
      my $self = bless { cc_conns => [] }, $class;
      $self->total_capacity($total_capacity);
      $self;
  }
  
  
  sub deposit {
      my($self, $type, $key, $conn) = @_;
      push(@{$self->{cc_conns}}, [$conn, $type, $key, time]);
      $self->enforce_limits($type);
      return;
  }
  
  
  sub withdraw {
      my($self, $type, $key) = @_;
      my $conns = $self->{cc_conns};
      for my $i (0 .. @$conns - 1) {
  	my $c = $conns->[$i];
  	next unless $c->[1] eq $type && $c->[2] eq $key;
  	splice(@$conns, $i, 1);  # remove it
  	return $c->[0];
      }
      return undef;
  }
  
  
  sub total_capacity {
      my $self = shift;
      my $old = $self->{cc_limit_total};
      if (@_) {
  	$self->{cc_limit_total} = shift;
  	$self->enforce_limits;
      }
      $old;
  }
  
  
  sub capacity {
      my $self = shift;
      my $type = shift;
      my $old = $self->{cc_limit}{$type};
      if (@_) {
  	$self->{cc_limit}{$type} = shift;
  	$self->enforce_limits($type);
      }
      $old;
  }
  
  
  sub enforce_limits {
      my($self, $type) = @_;
      my $conns = $self->{cc_conns};
  
      my @types = $type ? ($type) : ($self->get_types);
      for $type (@types) {
  	next unless $self->{cc_limit};
  	my $limit = $self->{cc_limit}{$type};
  	next unless defined $limit;
  	for my $i (reverse 0 .. @$conns - 1) {
  	    next unless $conns->[$i][1] eq $type;
  	    if (--$limit < 0) {
  		$self->dropping(splice(@$conns, $i, 1), "$type capacity exceeded");
  	    }
  	}
      }
  
      if (defined(my $total = $self->{cc_limit_total})) {
  	while (@$conns > $total) {
  	    $self->dropping(shift(@$conns), "Total capacity exceeded");
  	}
      }
  }
  
  
  sub dropping {
      my($self, $c, $reason) = @_;
      print "DROPPING @$c [$reason]\n" if $DEBUG;
  }
  
  
  sub drop {
      my($self, $checker, $reason) = @_;
      if (ref($checker) ne "CODE") {
  	# make it so
  	if (!defined $checker) {
  	    $checker = sub { 1 };  # drop all of them
  	}
  	elsif (_looks_like_number($checker)) {
  	    my $age_limit = $checker;
  	    my $time_limit = time - $age_limit;
  	    $reason ||= "older than $age_limit";
  	    $checker = sub { $_[3] < $time_limit };
  	}
  	else {
  	    my $type = $checker;
  	    $reason ||= "drop $type";
  	    $checker = sub { $_[1] eq $type };  # match on type
  	}
      }
      $reason ||= "drop";
  
      local $SIG{__DIE__};  # don't interfere with eval below
      local $@;
      my @c;
      for (@{$self->{cc_conns}}) {
  	my $drop;
  	eval {
  	    if (&$checker(@$_)) {
  		$self->dropping($_, $reason);
  		$drop++;
  	    }
  	};
  	push(@c, $_) unless $drop;
      }
      @{$self->{cc_conns}} = @c;
  }
  
  
  sub prune {
      my $self = shift;
      $self->drop(sub { !shift->ping }, "ping");
  }
  
  
  sub get_types {
      my $self = shift;
      my %t;
      $t{$_->[1]}++ for @{$self->{cc_conns}};
      return keys %t;
  }
  
  
  sub get_connections {
      my($self, $type) = @_;
      my @c;
      for (@{$self->{cc_conns}}) {
  	push(@c, $_->[0]) if !$type || ($type && $type eq $_->[1]);
      }
      @c;
  }
  
  
  sub _looks_like_number {
      $_[0] =~ /^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/;
  }
  
  1;
  
  
  __END__
  
  =pod
  
  =head1 NAME
  
  LWP::ConnCache - Connection cache manager
  
  =head1 NOTE
  
  This module is experimental.  Details of its interface is likely to
  change in the future.
  
  =head1 SYNOPSIS
  
   use LWP::ConnCache;
   my $cache = LWP::ConnCache->new;
   $cache->deposit($type, $key, $sock);
   $sock = $cache->withdraw($type, $key);
  
  =head1 DESCRIPTION
  
  The C<LWP::ConnCache> class is the standard connection cache manager
  for L<LWP::UserAgent>.
  
  =head1 METHODS
  
  The following basic methods are provided:
  
  =head2 new
  
      my $cache = LWP::ConnCache->new( %options )
  
  This method constructs a new L<LWP::ConnCache> object.  The only
  option currently accepted is C<total_capacity>.  If specified it
  initialize the L<LWP::ConnCache/total_capacity> option. It defaults to C<1>.
  
  =head2 total_capacity
  
      my $cap = $cache->total_capacity;
      $cache->total_capacity(0); # drop all immediately
      $cache->total_capacity(undef); # no limit
      $cache->total_capacity($number);
  
  Get/sets the number of connection that will be cached.  Connections
  will start to be dropped when this limit is reached.  If set to C<0>,
  then all connections are immediately dropped.  If set to C<undef>,
  then there is no limit.
  
  =head2 capacity
  
      my $http_capacity = $cache->capacity('http');
      $cache->capacity('http', 2 );
  
  Get/set a limit for the number of connections of the specified type
  that can be cached.  The first parameter is a short string like
  "http" or "ftp".
  
  =head2 drop
  
      $cache->drop(); # Drop ALL connections
      # which is just a synonym for:
      $cache->drop(sub{1}); # Drop ALL connections
      # drop all connections older than 22 seconds and add a reason for it!
      $cache->drop(22, "Older than 22 secs dropped");
      # which is just a synonym for:
      $cache->drop(sub {
          my ($conn, $type, $key, $deposit_time) = @_;
          if ($deposit_time < 22) {
              # true values drop the connection
              return 1;
          }
          # false values don't drop the connection
          return 0;
      }, "Older than 22 secs dropped" );
  
  Drop connections by some criteria.  The $checker argument is a
  subroutine that is called for each connection.  If the routine returns
  a TRUE value then the connection is dropped.  The routine is called
  with ($conn, $type, $key, $deposit_time) as arguments.
  
  Shortcuts: If the $checker argument is absent (or C<undef>) all cached
  connections are dropped.  If the $checker is a number then all
  connections untouched that the given number of seconds or more are
  dropped.  If $checker is a string then all connections of the given
  type are dropped.
  
  The C<reason> is passed on to the L<LWP::ConnCache/dropped> method.
  
  =head2 prune
  
      $cache->prune();
  
  Calling this method will drop all connections that are dead.  This is
  tested by calling the L<LWP::ConnCache/ping> method on the connections. If
  the L<LWP::ConnCache/ping> method exists and returns a false value, then the
  connection is dropped.
  
  =head2 get_types
  
      my @types = $cache->get_types();
  
  This returns all the C<type> fields used for the currently cached
  connections.
  
  =head2 get_connections
  
      my @conns = $cache->get_connections(); # all connections
      my @conns = $cache->get_connections('http'); # connections for http
  
  This returns all connection objects of the specified type.  If no type
  is specified then all connections are returned.  In scalar context the
  number of cached connections of the specified type is returned.
  
  =head1 PROTOCOL METHODS
  
  The following methods are called by low-level protocol modules to
  try to save away connections and to get them back.
  
  =head2 deposit
  
      $cache->deposit($type, $key, $conn);
  
  This method adds a new connection to the cache.  As a result, other
  already cached connections might be dropped.  Multiple connections with
  the same type/key might be added.
  
  =head2 withdraw
  
      my $conn = $cache->withdraw($type, $key);
  
  This method tries to fetch back a connection that was previously
  deposited.  If no cached connection with the specified $type/$key is
  found, then C<undef> is returned.  There is not guarantee that a
  deposited connection can be withdrawn, as the cache manger is free to
  drop connections at any time.
  
  =head1 INTERNAL METHODS
  
  The following methods are called internally.  Subclasses might want to
  override them.
  
  =head2 enforce_limits
  
      $conn->enforce_limits([$type])
  
  This method is called with after a new connection is added (deposited)
  in the cache or capacity limits are adjusted.  The default
  implementation drops connections until the specified capacity limits
  are not exceeded.
  
  =head2 dropping
  
      $conn->dropping($conn_record, $reason)
  
  This method is called when a connection is dropped.  The record
  belonging to the dropped connection is passed as the first argument
  and a string describing the reason for the drop is passed as the
  second argument.  The default implementation makes some noise if the
  C<$LWP::ConnCache::DEBUG> variable is set and nothing more.
  
  =head1 SUBCLASSING
  
  For specialized cache policy it makes sense to subclass
  C<LWP::ConnCache> and perhaps override the L<LWP::ConnCache/deposit>,
  L<LWP::ConnCache/enforce_limits>, and L<LWP::ConnCache/dropping> methods.
  
  The object itself is a hash.  Keys prefixed with C<cc_> are reserved
  for the base class.
  
  =head1 SEE ALSO
  
  L<LWP::UserAgent>
  
  =head1 COPYRIGHT
  
  Copyright 2001 Gisle Aas.
  
  This library is free software; you can redistribute it and/or
  modify it under the same terms as Perl itself.
  
  =cut
LWP_CONNCACHE

    $main::fatpacked{"LWP/Debug.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LWP_DEBUG';
  package LWP::Debug;    # legacy
  
  our $VERSION = '6.39';
  
  require Exporter;
  our @ISA       = qw(Exporter);
  our @EXPORT_OK = qw(level trace debug conns);
  
  use Carp ();
  
  my @levels = qw(trace debug conns);
  our %current_level = ();
  
  sub import {
      my $pack    = shift;
      my $callpkg = caller(0);
      my @symbols = ();
      my @levels  = ();
      for (@_) {
          if (/^[-+]/) {
              push(@levels, $_);
          }
          else {
              push(@symbols, $_);
          }
      }
      Exporter::export($pack, $callpkg, @symbols);
      level(@levels);
  }
  
  sub level {
      for (@_) {
          if ($_ eq '+') {    # all on
                              # switch on all levels
              %current_level = map { $_ => 1 } @levels;
          }
          elsif ($_ eq '-') {    # all off
              %current_level = ();
          }
          elsif (/^([-+])(\w+)$/) {
              $current_level{$2} = $1 eq '+';
          }
          else {
              Carp::croak("Illegal level format $_");
          }
      }
  }
  
  sub trace { _log(@_) if $current_level{'trace'}; }
  sub debug { _log(@_) if $current_level{'debug'}; }
  sub conns { _log(@_) if $current_level{'conns'}; }
  
  sub _log {
      my $msg = shift;
      $msg .= "\n" unless $msg =~ /\n$/;    # ensure trailing "\n"
  
      my ($package, $filename, $line, $sub) = caller(2);
      print STDERR "$sub: $msg";
  }
  
  1;
  
  __END__
  
  =pod
  
  =head1 NAME
  
  LWP::Debug - deprecated
  
  =head1 DESCRIPTION
  
  This module has been deprecated.  Please see L<LWP::ConsoleLogger> for your
  debugging needs.
  
  LWP::Debug is used to provide tracing facilities, but these are not used
  by LWP any more.  The code in this module is kept around
  (undocumented) so that 3rd party code that happens to use the old
  interfaces continue to run.
  
  One useful feature that LWP::Debug provided (in an imprecise and
  troublesome way) was network traffic monitoring.  The following
  section provides some hints about recommended replacements.
  
  =head2 Network traffic monitoring
  
  The best way to monitor the network traffic that LWP generates is to
  use an external TCP monitoring program.  The
  L<WireShark|http://www.wireshark.org/> program is highly recommended for this.
  
  Another approach it to use a debugging HTTP proxy server and make
  LWP direct all its traffic via this one.  Call C<< $ua->proxy >> to
  set it up and then just use LWP as before.
  
  For less precise monitoring needs just setting up a few simple
  handlers might do.  The following example sets up handlers to dump the
  request and response objects that pass through LWP:
  
    use LWP::UserAgent;
    $ua = LWP::UserAgent->new;
    $ua->default_header('Accept-Encoding' => scalar HTTP::Message::decodable());
  
    $ua->add_handler("request_send",  sub { shift->dump; return });
    $ua->add_handler("response_done", sub { shift->dump; return });
  
    $ua->get("http://www.example.com");
  
  =head1 SEE ALSO
  
  L<LWP::ConsoleLogger>, L<LWP::ConsoleLogger::Everywhere>, L<LWP::UserAgent>
  
  =cut
LWP_DEBUG

    $main::fatpacked{"LWP/Debug/TraceHTTP.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LWP_DEBUG_TRACEHTTP';
  package LWP::Debug::TraceHTTP;
  
  # Just call:
  #
  #   require LWP::Debug::TraceHTTP;
  #   LWP::Protocol::implementor('http', 'LWP::Debug::TraceHTTP');
  #
  # to use this module to trace all calls to the HTTP socket object in
  # programs that use LWP.
  
  use strict;
  use base 'LWP::Protocol::http';
  
  our $VERSION = '6.39';
  
  package # hide from PAUSE
      LWP::Debug::TraceHTTP::Socket;
  
  use Data::Dump 1.13;
  use Data::Dump::Trace qw(autowrap mcall);
  
  autowrap("LWP::Protocol::http::Socket" => "sock");
  
  sub new {
      my $class = shift;
      return mcall("LWP::Protocol::http::Socket" => "new", undef, @_);
  }
  
  1;
LWP_DEBUG_TRACEHTTP

    $main::fatpacked{"LWP/DebugFile.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LWP_DEBUGFILE';
  package LWP::DebugFile;
  
  our $VERSION = '6.39';
  
  # legacy stub
  
  1;
LWP_DEBUGFILE

    $main::fatpacked{"LWP/MediaTypes.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LWP_MEDIATYPES';
  package LWP::MediaTypes;
  
  require Exporter;
  @ISA = qw(Exporter);
  @EXPORT = qw(guess_media_type media_suffix);
  @EXPORT_OK = qw(add_type add_encoding read_media_types);
  our $VERSION = '6.04';
  
  use strict;
  use Scalar::Util qw(blessed);
  use Carp qw(croak);
  
  # note: These hashes will also be filled with the entries found in
  # the 'media.types' file.
  
  my %suffixType = (
      'txt'   => 'text/plain',
      'html'  => 'text/html',
      'gif'   => 'image/gif',
      'jpg'   => 'image/jpeg',
      'xml'   => 'text/xml',
  );
  
  my %suffixExt = (
      'text/plain' => 'txt',
      'text/html'  => 'html',
      'image/gif'  => 'gif',
      'image/jpeg' => 'jpg',
      'text/xml'   => 'xml',
  );
  
  #XXX: there should be some way to define this in the media.types files.
  my %suffixEncoding = (
      'Z'   => 'compress',
      'gz'  => 'gzip',
      'hqx' => 'x-hqx',
      'uu'  => 'x-uuencode',
      'z'   => 'x-pack',
      'bz2' => 'x-bzip2',
  );
  
  read_media_types();
  
  
  
  sub guess_media_type
  {
      my($file, $header) = @_;
      return undef unless defined $file;
  
      my $fullname;
      if (ref $file) {
          croak("Unable to determine filetype on unblessed refs") unless blessed($file);
          if ($file->can('path')) {
              $file = $file->path;
          }
          elsif ($file->can('filename')) {
              $fullname = $file->filename;
          }
          else {
              $fullname = "" . $file;
          }
      }
      else {
  	$fullname = $file;  # enable peek at actual file
      }
  
      my @encoding = ();
      my $ct = undef;
      for (file_exts($file)) {
  	# first check this dot part as encoding spec
  	if (exists $suffixEncoding{$_}) {
  	    unshift(@encoding, $suffixEncoding{$_});
  	    next;
  	}
  	if (exists $suffixEncoding{lc $_}) {
  	    unshift(@encoding, $suffixEncoding{lc $_});
  	    next;
  	}
  
  	# check content-type
  	if (exists $suffixType{$_}) {
  	    $ct = $suffixType{$_};
  	    last;
  	}
  	if (exists $suffixType{lc $_}) {
  	    $ct = $suffixType{lc $_};
  	    last;
  	}
  
  	# don't know nothing about this dot part, bail out
  	last;
      }
      unless (defined $ct) {
  	# Take a look at the file
  	if (defined $fullname) {
  	    $ct = (-T $fullname) ? "text/plain" : "application/octet-stream";
  	}
  	else {
  	    $ct = "application/octet-stream";
  	}
      }
  
      if ($header) {
  	$header->header('Content-Type' => $ct);
  	$header->header('Content-Encoding' => \@encoding) if @encoding;
      }
  
      wantarray ? ($ct, @encoding) : $ct;
  }
  
  
  sub media_suffix {
      if (!wantarray && @_ == 1 && $_[0] !~ /\*/) {
  	return $suffixExt{lc $_[0]};
      }
      my(@type) = @_;
      my(@suffix, $ext, $type);
      foreach (@type) {
  	if (s/\*/.*/) {
  	    while(($ext,$type) = each(%suffixType)) {
  		push(@suffix, $ext) if $type =~ /^$_$/i;
  	    }
  	}
  	else {
  	    my $ltype = lc $_;
  	    while(($ext,$type) = each(%suffixType)) {
  		push(@suffix, $ext) if lc $type eq $ltype;
  	    }
  	}
      }
      wantarray ? @suffix : $suffix[0];
  }
  
  
  sub file_exts
  {
      require File::Basename;
      my @parts = reverse split(/\./, File::Basename::basename($_[0]));
      pop(@parts);        # never consider first part
      @parts;
  }
  
  
  sub add_type
  {
      my($type, @exts) = @_;
      for my $ext (@exts) {
  	$ext =~ s/^\.//;
  	$suffixType{$ext} = $type;
      }
      $suffixExt{lc $type} = $exts[0] if @exts;
  }
  
  
  sub add_encoding
  {
      my($type, @exts) = @_;
      for my $ext (@exts) {
  	$ext =~ s/^\.//;
  	$suffixEncoding{$ext} = $type;
      }
  }
  
  
  sub read_media_types
  {
      my(@files) = @_;
  
      local($/, $_) = ("\n", undef);  # ensure correct $INPUT_RECORD_SEPARATOR
  
      my @priv_files = ();
      push(@priv_files, "$ENV{HOME}/.media.types", "$ENV{HOME}/.mime.types")
  	if defined $ENV{HOME};  # Some doesn't have a home (for instance Win32)
  
      # Try to locate "media.types" file, and initialize %suffixType from it
      my $typefile;
      unless (@files) {
  	@files = map {"$_/LWP/media.types"} @INC;
  	push @files, @priv_files;
      }
      for $typefile (@files) {
  	local(*TYPE);
  	open(TYPE, $typefile) || next;
  	while (<TYPE>) {
  	    next if /^\s*#/; # comment line
  	    next if /^\s*$/; # blank line
  	    s/#.*//;         # remove end-of-line comments
  	    my($type, @exts) = split(' ', $_);
  	    add_type($type, @exts);
  	}
  	close(TYPE);
      }
  }
  
  1;
  
  
  __END__
  
  =head1 NAME
  
  LWP::MediaTypes - guess media type for a file or a URL
  
  =head1 SYNOPSIS
  
   use LWP::MediaTypes qw(guess_media_type);
   $type = guess_media_type("/tmp/foo.gif");
  
  =head1 DESCRIPTION
  
  This module provides functions for handling media (also known as
  MIME) types and encodings.  The mapping from file extensions to media
  types is defined by the F<media.types> file.  If the F<~/.media.types>
  file exists it is used instead.
  For backwards compatibility we will also look for F<~/.mime.types>.
  
  The following functions are exported by default:
  
  =over 4
  
  =item guess_media_type( $filename )
  
  =item guess_media_type( $uri )
  
  =item guess_media_type( $filename_or_object, $header_to_modify )
  
  This function tries to guess media type and encoding for a file or objects that
  support the a C<path> or C<filename> method, eg, L<URI> or L<File::Temp> objects.
  When an object does not support either method, it will be stringified to
  determine the filename.
  It returns the content type, which is a string like C<"text/html">.
  In array context it also returns any content encodings applied (in the
  order used to encode the file).  You can pass a URI object
  reference, instead of the file name.
  
  If the type can not be deduced from looking at the file name,
  then guess_media_type() will let the C<-T> Perl operator take a look.
  If this works (and C<-T> returns a TRUE value) then we return
  I<text/plain> as the type, otherwise we return
  I<application/octet-stream> as the type.
  
  The optional second argument should be a reference to a HTTP::Headers
  object or any object that implements the $obj->header method in a
  similar way.  When it is present the values of the
  'Content-Type' and 'Content-Encoding' will be set for this header.
  
  =item media_suffix( $type, ... )
  
  This function will return all suffixes that can be used to denote the
  specified media type(s).  Wildcard types can be used.  In a scalar
  context it will return the first suffix found. Examples:
  
    @suffixes = media_suffix('image/*', 'audio/basic');
    $suffix = media_suffix('text/html');
  
  =back
  
  The following functions are only exported by explicit request:
  
  =over 4
  
  =item add_type( $type, @exts )
  
  Associate a list of file extensions with the given media type.
  Example:
  
      add_type("x-world/x-vrml" => qw(wrl vrml));
  
  =item add_encoding( $type, @ext )
  
  Associate a list of file extensions with an encoding type.
  Example:
  
   add_encoding("x-gzip" => "gz");
  
  =item read_media_types( @files )
  
  Parse media types files and add the type mappings found there.
  Example:
  
      read_media_types("conf/mime.types");
  
  =back
  
  =head1 COPYRIGHT
  
  Copyright 1995-1999 Gisle Aas.
  
  This library is free software; you can redistribute it and/or
  modify it under the same terms as Perl itself.
  
LWP_MEDIATYPES

    $main::fatpacked{"LWP/MemberMixin.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LWP_MEMBERMIXIN';
  package LWP::MemberMixin;
  
  our $VERSION = '6.39';
  
  sub _elem {
      my $self = shift;
      my $elem = shift;
      my $old  = $self->{$elem};
      $self->{$elem} = shift if @_;
      return $old;
  }
  
  1;
  
  __END__
  
  =pod
  
  =head1 NAME
  
  LWP::MemberMixin - Member access mixin class
  
  =head1 SYNOPSIS
  
   package Foo;
   use base qw(LWP::MemberMixin);
  
  =head1 DESCRIPTION
  
  A mixin class to get methods that provide easy access to member
  variables in the C<%$self>.
  Ideally there should be better Perl language support for this.
  
  =head1 METHODS
  
  There is only one method provided:
  
  =head2 _elem
  
      _elem($elem [, $val])
  
  Internal method to get/set the value of member variable
  C<$elem>. If C<$val> is present it is used as the new value
  for the member variable.  If it is not present the current
  value is not touched. In both cases the previous value of
  the member variable is returned.
  
  =cut
LWP_MEMBERMIXIN

    $main::fatpacked{"LWP/Protocol.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LWP_PROTOCOL';
  package LWP::Protocol;
  
  use base 'LWP::MemberMixin';
  
  our $VERSION = '6.39';
  
  use strict;
  use Carp ();
  use HTTP::Status ();
  use HTTP::Response ();
  use Try::Tiny qw(try catch);
  
  my %ImplementedBy = (); # scheme => classname
  
  sub new
  {
      my($class, $scheme, $ua) = @_;
  
      my $self = bless {
  	scheme => $scheme,
  	ua => $ua,
  
  	# historical/redundant
          max_size => $ua->{max_size},
      }, $class;
  
      $self;
  }
  
  
  sub create
  {
      my($scheme, $ua) = @_;
      my $impclass = LWP::Protocol::implementor($scheme) or
  	Carp::croak("Protocol scheme '$scheme' is not supported");
  
      # hand-off to scheme specific implementation sub-class
      my $protocol = $impclass->new($scheme, $ua);
  
      return $protocol;
  }
  
  
  sub implementor
  {
      my($scheme, $impclass) = @_;
  
      if ($impclass) {
  	$ImplementedBy{$scheme} = $impclass;
      }
      my $ic = $ImplementedBy{$scheme};
      return $ic if $ic;
  
      return '' unless $scheme =~ /^([.+\-\w]+)$/;  # check valid URL schemes
      $scheme = $1; # untaint
      $scheme =~ tr/.+-/_/;  # make it a legal module name
  
      # scheme not yet known, look for a 'use'd implementation
      $ic = "LWP::Protocol::$scheme";  # default location
      $ic = "LWP::Protocol::nntp" if $scheme eq 'news'; #XXX ugly hack
      no strict 'refs';
      # check we actually have one for the scheme:
      unless (@{"${ic}::ISA"}) {
          # try to autoload it
          try {
              (my $class = $ic) =~ s{::}{/}g;
              $class .= '.pm' unless $class =~ /\.pm$/;
              require $class;
          }
          catch {
              my $error = $_;
              if ($error =~ /Can't locate/) {
                  $ic = '';
              }
              else {
                  die "$error\n";
              }
          };
      }
      $ImplementedBy{$scheme} = $ic if $ic;
      $ic;
  }
  
  
  sub request
  {
      my($self, $request, $proxy, $arg, $size, $timeout) = @_;
      Carp::croak('LWP::Protocol::request() needs to be overridden in subclasses');
  }
  
  
  # legacy
  sub timeout    { shift->_elem('timeout',    @_); }
  sub max_size   { shift->_elem('max_size',   @_); }
  
  
  sub collect
  {
      my ($self, $arg, $response, $collector) = @_;
      my $content;
      my($ua, $max_size) = @{$self}{qw(ua max_size)};
  
      # This can't be moved to Try::Tiny due to the closures within causing
      # leaks on any version of Perl prior to 5.18.
      # https://perl5.git.perl.org/perl.git/commitdiff/a0d2bbd5c
      my $error = do { #catch
          local $@;
          local $\; # protect the print below from surprises
          eval { # try
              if (!defined($arg) || !$response->is_success) {
                  $response->{default_add_content} = 1;
              }
              elsif (!ref($arg) && length($arg)) {
                  open(my $fh, ">", $arg) or die "Can't write to '$arg': $!";
                  binmode($fh);
                  push(@{$response->{handlers}{response_data}}, {
                      callback => sub {
                          print $fh $_[3] or die "Can't write to '$arg': $!";
                          1;
                      },
                  });
                  push(@{$response->{handlers}{response_done}}, {
                      callback => sub {
                          close($fh) or die "Can't write to '$arg': $!";
                          undef($fh);
                      },
                  });
              }
              elsif (ref($arg) eq 'CODE') {
                  push(@{$response->{handlers}{response_data}}, {
                      callback => sub {
                          &$arg($_[3], $_[0], $self);
                          1;
                      },
                  });
              }
              else {
                  die "Unexpected collect argument '$arg'";
              }
  
              $ua->run_handlers("response_header", $response);
  
              if (delete $response->{default_add_content}) {
                  push(@{$response->{handlers}{response_data}}, {
                      callback => sub {
                          $_[0]->add_content($_[3]);
                          1;
                      },
                  });
              }
  
  
              my $content_size = 0;
              my $length = $response->content_length;
              my %skip_h;
  
              while ($content = &$collector, length $$content) {
                  for my $h ($ua->handlers("response_data", $response)) {
                      next if $skip_h{$h};
                      unless ($h->{callback}->($response, $ua, $h, $$content)) {
                          # XXX remove from $response->{handlers}{response_data} if present
                          $skip_h{$h}++;
                      }
                  }
                  $content_size += length($$content);
                  $ua->progress(($length ? ($content_size / $length) : "tick"), $response);
                  if (defined($max_size) && $content_size > $max_size) {
                      $response->push_header("Client-Aborted", "max_size");
                      last;
                  }
              }
              1;
          };
          $@;
      };
  
      if ($error) {
          chomp($error);
          $response->push_header('X-Died' => $error);
          $response->push_header("Client-Aborted", "die");
      };
      delete $response->{handlers}{response_data};
      delete $response->{handlers} unless %{$response->{handlers}};
      return $response;
  }
  
  
  sub collect_once
  {
      my($self, $arg, $response) = @_;
      my $content = \ $_[3];
      my $first = 1;
      $self->collect($arg, $response, sub {
  	return $content if $first--;
  	return \ "";
      });
  }
  
  1;
  
  
  __END__
  
  =pod
  
  =head1 NAME
  
  LWP::Protocol - Base class for LWP protocols
  
  =head1 SYNOPSIS
  
   package LWP::Protocol::foo;
   use base qw(LWP::Protocol);
  
  =head1 DESCRIPTION
  
  This class is used as the base class for all protocol implementations
  supported by the LWP library.
  
  When creating an instance of this class using
  C<LWP::Protocol::create($url)>, and you get an initialized subclass
  appropriate for that access method. In other words, the
  L<LWP::Protocol/create> function calls the constructor for one of its
  subclasses.
  
  All derived C<LWP::Protocol> classes need to override the request()
  method which is used to service a request. The overridden method can
  make use of the collect() function to collect together chunks of data
  as it is received.
  
  =head1 METHODS
  
  The following methods and functions are provided:
  
  =head2 new
  
      my $prot = LWP::Protocol->new();
  
  The LWP::Protocol constructor is inherited by subclasses. As this is a
  virtual base class this method should B<not> be called directly.
  
  =head2 create
  
      my $prot = LWP::Protocol::create($scheme)
  
  Create an object of the class implementing the protocol to handle the
  given scheme. This is a function, not a method. It is more an object
  factory than a constructor. This is the function user agents should
  use to access protocols.
  
  =head2 implementor
  
      my $class = LWP::Protocol::implementor($scheme, [$class])
  
  Get and/or set implementor class for a scheme.  Returns C<''> if the
  specified scheme is not supported.
  
  =head2 request
  
      $response = $protocol->request($request, $proxy, undef);
      $response = $protocol->request($request, $proxy, '/tmp/sss');
      $response = $protocol->request($request, $proxy, \&callback, 1024);
  
  Dispatches a request over the protocol, and returns a response
  object. This method needs to be overridden in subclasses.  Refer to
  L<LWP::UserAgent> for description of the arguments.
  
  =head2 collect
  
      my $res = $prot->collect(undef, $response, $collector); # stored in $response
      my $res = $prot->collect($filename, $response, $collector);
      my $res = $prot->collect(sub { ... }, $response, $collector);
  
  Collect the content of a request, and process it appropriately into a scalar,
  file, or by calling a callback. If the first parameter is undefined, then the
  content is stored within the C<$response>. If it's a simple scalar, then it's
  interpreted as a file name and the content is written to this file.  If it's a
  code reference, then content is passed to this routine.
  
  The collector is a routine that will be called and which is
  responsible for returning pieces (as ref to scalar) of the content to
  process.  The C<$collector> signals C<EOF> by returning a reference to an
  empty string.
  
  The return value is the L<HTTP::Response> object reference.
  
  B<Note:> We will only use the callback or file argument if
  C<< $response->is_success() >>.  This avoids sending content data for
  redirects and authentication responses to the callback which would be
  confusing.
  
  =head2 collect_once
  
      $prot->collect_once($arg, $response, $content)
  
  Can be called when the whole response content is available as content. This
  will invoke L<LWP::Protocol/collect> with a collector callback that
  returns a reference to C<$content> the first time and an empty string the
  next.
  
  =head1 SEE ALSO
  
  Inspect the F<LWP/Protocol/file.pm> and F<LWP/Protocol/http.pm> files
  for examples of usage.
  
  =head1 COPYRIGHT
  
  Copyright 1995-2001 Gisle Aas.
  
  This library is free software; you can redistribute it and/or
  modify it under the same terms as Perl itself.
  
  =cut
LWP_PROTOCOL

    $main::fatpacked{"LWP/Protocol/cpan.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LWP_PROTOCOL_CPAN';
  package LWP::Protocol::cpan;
  
  use strict;
  
  use base qw(LWP::Protocol);
  
  our $VERSION = '6.39';
  
  require URI;
  require HTTP::Status;
  require HTTP::Response;
  
  our $CPAN;
  
  unless ($CPAN) {
      # Try to find local CPAN mirror via $CPAN::Config
      eval {
  	require CPAN::Config;
  	if($CPAN::Config) {
  	    my $urls = $CPAN::Config->{urllist};
  	    if (ref($urls) eq "ARRAY") {
  		my $file;
  		for (@$urls) {
  		    if (/^file:/) {
  			$file = $_;
  			last;
  		    }
  		}
  
  		if ($file) {
  		    $CPAN = $file;
  		}
  		else {
  		    $CPAN = $urls->[0];
  		}
  	    }
  	}
      };
  
      $CPAN ||= "http://cpan.org/";  # last resort
  }
  
  # ensure that we don't chop of last part
  $CPAN .= "/" unless $CPAN =~ m,/$,;
  
  
  sub request {
      my($self, $request, $proxy, $arg, $size) = @_;
      # check proxy
      if (defined $proxy)
      {
  	return HTTP::Response->new(HTTP::Status::RC_BAD_REQUEST,
  				   'You can not proxy with cpan');
      }
  
      # check method
      my $method = $request->method;
      unless ($method eq 'GET' || $method eq 'HEAD') {
  	return HTTP::Response->new(HTTP::Status::RC_BAD_REQUEST,
  				   'Library does not allow method ' .
  				   "$method for 'cpan:' URLs");
      }
  
      my $path = $request->uri->path;
      $path =~ s,^/,,;
  
      my $response = HTTP::Response->new(HTTP::Status::RC_FOUND);
      $response->header("Location" => URI->new_abs($path, $CPAN));
      $response;
  }
  
  1;
LWP_PROTOCOL_CPAN

    $main::fatpacked{"LWP/Protocol/data.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LWP_PROTOCOL_DATA';
  package LWP::Protocol::data;
  
  # Implements access to data:-URLs as specified in RFC 2397
  
  use strict;
  
  our $VERSION = '6.39';
  
  require HTTP::Response;
  require HTTP::Status;
  
  use base qw(LWP::Protocol);
  
  use HTTP::Date qw(time2str);
  require LWP;  # needs version number
  
  sub request
  {
      my($self, $request, $proxy, $arg, $size) = @_;
  
      # check proxy
      if (defined $proxy)
      {
  	return HTTP::Response->new( HTTP::Status::RC_BAD_REQUEST,
  				  'You can not proxy with data');
      }
  
      # check method
      my $method = $request->method;
      unless ($method eq 'GET' || $method eq 'HEAD') {
  	return HTTP::Response->new( HTTP::Status::RC_BAD_REQUEST,
  				  'Library does not allow method ' .
  				  "$method for 'data:' URLs");
      }
  
      my $url = $request->uri;
      my $response = HTTP::Response->new( HTTP::Status::RC_OK, "Document follows");
  
      my $media_type = $url->media_type;
  
      my $data = $url->data;
      $response->header('Content-Type'   => $media_type,
  		      'Content-Length' => length($data),
  		      'Date'           => time2str(time),
  		      'Server'         => "libwww-perl-internal/$LWP::VERSION"
  		     );
  
      $data = "" if $method eq "HEAD";
      return $self->collect_once($arg, $response, $data);
  }
  
  1;
LWP_PROTOCOL_DATA

    $main::fatpacked{"LWP/Protocol/file.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LWP_PROTOCOL_FILE';
  package LWP::Protocol::file;
  
  use base qw(LWP::Protocol);
  
  use strict;
  
  our $VERSION = '6.39';
  
  require LWP::MediaTypes;
  require HTTP::Request;
  require HTTP::Response;
  require HTTP::Status;
  require HTTP::Date;
  
  
  sub request
  {
      my($self, $request, $proxy, $arg, $size) = @_;
  
      $size = 4096 unless defined $size and $size > 0;
  
      # check proxy
      if (defined $proxy)
      {
  	return HTTP::Response->new( HTTP::Status::RC_BAD_REQUEST,
  				  'You can not proxy through the filesystem');
      }
  
      # check method
      my $method = $request->method;
      unless ($method eq 'GET' || $method eq 'HEAD') {
  	return HTTP::Response->new( HTTP::Status::RC_BAD_REQUEST,
  				  'Library does not allow method ' .
  				  "$method for 'file:' URLs");
      }
  
      # check url
      my $url = $request->uri;
  
      my $scheme = $url->scheme;
      if ($scheme ne 'file') {
  	return HTTP::Response->new( HTTP::Status::RC_INTERNAL_SERVER_ERROR,
  			   "LWP::Protocol::file::request called for '$scheme'");
      }
  
      # URL OK, look at file
      my $path  = $url->file;
  
      # test file exists and is readable
      unless (-e $path) {
  	return HTTP::Response->new( HTTP::Status::RC_NOT_FOUND,
  				  "File `$path' does not exist");
      }
      unless (-r _) {
  	return HTTP::Response->new( HTTP::Status::RC_FORBIDDEN,
  				  'User does not have read permission');
      }
  
      # looks like file exists
      my($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$filesize,
         $atime,$mtime,$ctime,$blksize,$blocks)
  	    = stat(_);
  
      # XXX should check Accept headers?
  
      # check if-modified-since
      my $ims = $request->header('If-Modified-Since');
      if (defined $ims) {
  	my $time = HTTP::Date::str2time($ims);
  	if (defined $time and $time >= $mtime) {
  	    return HTTP::Response->new( HTTP::Status::RC_NOT_MODIFIED,
  				      "$method $path");
  	}
      }
  
      # Ok, should be an OK response by now...
      my $response = HTTP::Response->new( HTTP::Status::RC_OK );
  
      # fill in response headers
      $response->header('Last-Modified', HTTP::Date::time2str($mtime));
  
      if (-d _) {         # If the path is a directory, process it
  	# generate the HTML for directory
  	opendir(D, $path) or
  	   return HTTP::Response->new( HTTP::Status::RC_INTERNAL_SERVER_ERROR,
  				     "Cannot read directory '$path': $!");
  	my(@files) = sort readdir(D);
  	closedir(D);
  
  	# Make directory listing
  	require URI::Escape;
  	require HTML::Entities;
          my $pathe = $path . ( $^O eq 'MacOS' ? ':' : '/');
  	for (@files) {
  	    my $furl = URI::Escape::uri_escape($_);
              if ( -d "$pathe$_" ) {
                  $furl .= '/';
                  $_ .= '/';
              }
  	    my $desc = HTML::Entities::encode($_);
  	    $_ = qq{<LI><A HREF="$furl">$desc</A>};
  	}
  	# Ensure that the base URL is "/" terminated
  	my $base = $url->clone;
  	unless ($base->path =~ m|/$|) {
  	    $base->path($base->path . "/");
  	}
  	my $html = join("\n",
  			"<HTML>\n<HEAD>",
  			"<TITLE>Directory $path</TITLE>",
  			"<BASE HREF=\"$base\">",
  			"</HEAD>\n<BODY>",
  			"<H1>Directory listing of $path</H1>",
  			"<UL>", @files, "</UL>",
  			"</BODY>\n</HTML>\n");
  
  	$response->header('Content-Type',   'text/html');
  	$response->header('Content-Length', length $html);
  	$html = "" if $method eq "HEAD";
  
  	return $self->collect_once($arg, $response, $html);
  
      }
  
      # path is a regular file
      $response->header('Content-Length', $filesize);
      LWP::MediaTypes::guess_media_type($path, $response);
  
      # read the file
      if ($method ne "HEAD") {
  	open(my $fh, '<', $path) or return new
  	    HTTP::Response(HTTP::Status::RC_INTERNAL_SERVER_ERROR,
  			   "Cannot read file '$path': $!");
  	binmode($fh);
  	$response =  $self->collect($arg, $response, sub {
  	    my $content = "";
  	    my $bytes = sysread($fh, $content, $size);
  	    return \$content if $bytes > 0;
  	    return \ "";
  	});
  	close($fh);
      }
  
      $response;
  }
  
  1;
LWP_PROTOCOL_FILE

    $main::fatpacked{"LWP/Protocol/ftp.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LWP_PROTOCOL_FTP';
  package LWP::Protocol::ftp;
  
  # Implementation of the ftp protocol (RFC 959). We let the Net::FTP
  # package do all the dirty work.
  use base qw(LWP::Protocol);
  use strict;
  
  our $VERSION = '6.39';
  
  use Carp            ();
  use HTTP::Status    ();
  use HTTP::Negotiate ();
  use HTTP::Response  ();
  use LWP::MediaTypes ();
  use File::Listing   ();
  
  
  {
  
      package # hide from PAUSE
          LWP::Protocol::MyFTP;
  
      use strict;
      use base qw(Net::FTP);
  
      sub new {
          my $class = shift;
  
          my $self = $class->SUPER::new(@_) || return undef;
  
          my $mess = $self->message;    # welcome message
          $mess =~ s|\n.*||s;           # only first line left
          $mess =~ s|\s*ready\.?$||;
  
          # Make the version number more HTTP like
          $mess =~ s|\s*\(Version\s*|/| and $mess =~ s|\)$||;
          ${*$self}{myftp_server} = $mess;
  
          #$response->header("Server", $mess);
  
          $self;
      }
  
      sub http_server {
          my $self = shift;
          ${*$self}{myftp_server};
      }
  
      sub home {
          my $self = shift;
          my $old  = ${*$self}{myftp_home};
          if (@_) {
              ${*$self}{myftp_home} = shift;
          }
          $old;
      }
  
      sub go_home {
          my $self = shift;
          $self->cwd(${*$self}{myftp_home});
      }
  
      sub request_count {
          my $self = shift;
          ++${*$self}{myftp_reqcount};
      }
  
      sub ping {
          my $self = shift;
          return $self->go_home;
      }
  }
  
  sub _connect {
      my ($self, $host, $port, $user, $account, $password, $timeout) = @_;
  
      my $key;
      my $conn_cache = $self->{ua}{conn_cache};
      if ($conn_cache) {
          $key = "$host:$port:$user";
          $key .= ":$account" if defined($account);
          if (my $ftp = $conn_cache->withdraw("ftp", $key)) {
              if ($ftp->ping) {
  
                  # save it again
                  $conn_cache->deposit("ftp", $key, $ftp);
                  return $ftp;
              }
          }
      }
  
      # try to make a connection
      my $ftp = LWP::Protocol::MyFTP->new(
          $host,
          Port      => $port,
          Timeout   => $timeout,
          LocalAddr => $self->{ua}{local_address},
      );
  
      # XXX Should be some what to pass on 'Passive' (header??)
      unless ($ftp) {
          $@ =~ s/^Net::FTP: //;
          return HTTP::Response->new(HTTP::Status::RC_INTERNAL_SERVER_ERROR, $@);
      }
  
      unless ($ftp->login($user, $password, $account)) {
  
          # Unauthorized.  Let's fake a RC_UNAUTHORIZED response
          my $mess = scalar($ftp->message);
          $mess =~ s/\n$//;
          my $res = HTTP::Response->new(HTTP::Status::RC_UNAUTHORIZED, $mess);
          $res->header("Server",           $ftp->http_server);
          $res->header("WWW-Authenticate", qq(Basic Realm="FTP login"));
          return $res;
      }
  
      my $home = $ftp->pwd;
      $ftp->home($home);
  
      $conn_cache->deposit("ftp", $key, $ftp) if $conn_cache;
  
      return $ftp;
  }
  
  
  sub request {
      my ($self, $request, $proxy, $arg, $size, $timeout) = @_;
  
      $size = 4096 unless $size;
  
      # check proxy
      if (defined $proxy) {
          return HTTP::Response->new(HTTP::Status::RC_BAD_REQUEST,
              'You can not proxy through the ftp');
      }
  
      my $url = $request->uri;
      if ($url->scheme ne 'ftp') {
          my $scheme = $url->scheme;
          return HTTP::Response->new(HTTP::Status::RC_INTERNAL_SERVER_ERROR,
              "LWP::Protocol::ftp::request called for '$scheme'");
      }
  
      # check method
      my $method = $request->method;
  
      unless ($method eq 'GET' || $method eq 'HEAD' || $method eq 'PUT') {
          return HTTP::Response->new(HTTP::Status::RC_BAD_REQUEST,
              'Library does not allow method ' . "$method for 'ftp:' URLs");
      }
  
      my $host     = $url->host;
      my $port     = $url->port;
      my $user     = $url->user;
      my $password = $url->password;
  
      # If a basic authorization header is present than we prefer these over
      # the username/password specified in the URL.
      {
          my ($u, $p) = $request->authorization_basic;
          if (defined $u) {
              $user     = $u;
              $password = $p;
          }
      }
  
      # We allow the account to be specified in the "Account" header
      my $account = $request->header('Account');
  
      my $ftp
          = $self->_connect($host, $port, $user, $account, $password, $timeout);
      return $ftp if ref($ftp) eq "HTTP::Response";    # ugh!
  
      # Create an initial response object
      my $response = HTTP::Response->new(HTTP::Status::RC_OK, "OK");
      $response->header(Server               => $ftp->http_server);
      $response->header('Client-Request-Num' => $ftp->request_count);
      $response->request($request);
  
      # Get & fix the path
      my @path = grep {length} $url->path_segments;
      my $remote_file = pop(@path);
      $remote_file = '' unless defined $remote_file;
  
      my $type;
      if (ref $remote_file) {
          my @params;
          ($remote_file, @params) = @$remote_file;
          for (@params) {
              $type = $_ if s/^type=//;
          }
      }
  
      if ($type && $type eq 'a') {
          $ftp->ascii;
      }
      else {
          $ftp->binary;
      }
  
      for (@path) {
          unless ($ftp->cwd($_)) {
              return HTTP::Response->new(HTTP::Status::RC_NOT_FOUND,
                  "Can't chdir to $_");
          }
      }
  
      if ($method eq 'GET' || $method eq 'HEAD') {
          if (my $mod_time = $ftp->mdtm($remote_file)) {
              $response->last_modified($mod_time);
              if (my $ims = $request->if_modified_since) {
                  if ($mod_time <= $ims) {
                      $response->code(HTTP::Status::RC_NOT_MODIFIED);
                      $response->message("Not modified");
                      return $response;
                  }
              }
          }
  
          # We'll use this later to abort the transfer if necessary.
          # if $max_size is defined, we need to abort early. Otherwise, it's
          # a normal transfer
          my $max_size = undef;
  
          # Set resume location, if the client requested it
          if ($request->header('Range') && $ftp->supported('REST')) {
              my $range_info = $request->header('Range');
  
              # Change bytes=2772992-6781209 to just 2772992
              my ($start_byte, $end_byte) = $range_info =~ /.*=\s*(\d+)-(\d+)?/;
              if (defined $start_byte && !defined $end_byte) {
  
                  # open range -- only the start is specified
  
                  $ftp->restart($start_byte);
  
                  # don't define $max_size, we don't want to abort early
              }
              elsif (defined $start_byte
                  && defined $end_byte
                  && $start_byte >= 0
                  && $end_byte >= $start_byte)
              {
  
                  $ftp->restart($start_byte);
                  $max_size = $end_byte - $start_byte;
              }
              else {
  
                  return HTTP::Response->new(HTTP::Status::RC_BAD_REQUEST,
                      'Incorrect syntax for Range request');
              }
          }
          elsif ($request->header('Range') && !$ftp->supported('REST')) {
              return HTTP::Response->new(HTTP::Status::RC_NOT_IMPLEMENTED,
                  "Server does not support resume."
              );
          }
  
          my $data;    # the data handle
          if (length($remote_file) and $data = $ftp->retr($remote_file)) {
              my ($type, @enc) = LWP::MediaTypes::guess_media_type($remote_file);
              $response->header('Content-Type', $type) if $type;
              for (@enc) {
                  $response->push_header('Content-Encoding', $_);
              }
              my $mess = $ftp->message;
              if ($mess =~ /\((\d+)\s+bytes\)/) {
                  $response->header('Content-Length', "$1");
              }
  
              if ($method ne 'HEAD') {
  
                  # Read data from server
                  $response = $self->collect(
                      $arg,
                      $response,
                      sub {
                          my $content = '';
                          my $result = $data->read($content, $size);
  
                          # Stop early if we need to.
                          if (defined $max_size) {
  
                          # We need an interface to Net::FTP::dataconn for getting
                          # the number of bytes already read
                              my $bytes_received = $data->bytes_read();
  
                             # We were already over the limit. (Should only happen
                             # once at the end.)
                              if ($bytes_received - length($content) > $max_size)
                              {
                                  $content = '';
                              }
  
                              # We just went over the limit
                              elsif ($bytes_received > $max_size) {
  
                                  # Trim content
                                  $content = substr($content, 0,
                                      $max_size
                                          - ($bytes_received - length($content)));
                              }
  
                              # We're under the limit
                              else {
                              }
                          }
  
                          return \$content;
                      }
                  );
              }
  
              # abort is needed for HEAD, it's == close if the transfer has
              # already completed.
              unless ($data->abort) {
  
                  # Something did not work too well.  Note that we treat
                  # responses to abort() with code 0 in case of HEAD as ok
                  # (at least wu-ftpd 2.6.1(1) does that).
                  if ($method ne 'HEAD' || $ftp->code != 0) {
                      $response->code(HTTP::Status::RC_INTERNAL_SERVER_ERROR);
                      $response->message("FTP close response: "
                              . $ftp->code . " "
                              . $ftp->message);
                  }
              }
          }
          elsif (!length($remote_file) || ($ftp->code >= 400 && $ftp->code < 600))
          {
              # not a plain file, try to list instead
              if (length($remote_file) && !$ftp->cwd($remote_file)) {
                  return HTTP::Response->new(HTTP::Status::RC_NOT_FOUND,
                      "File '$remote_file' not found"
                  );
              }
  
              # It should now be safe to try to list the directory
              my @lsl = $ftp->dir;
  
              # Try to figure out if the user want us to convert the
              # directory listing to HTML.
              my @variants = (
                  ['html', 0.60, 'text/html'],
                  ['dir',  1.00, 'text/ftp-dir-listing']
              );
  
              #$HTTP::Negotiate::DEBUG=1;
              my $prefer = HTTP::Negotiate::choose(\@variants, $request);
  
              my $content = '';
  
              if (!defined($prefer)) {
                  return HTTP::Response->new(HTTP::Status::RC_NOT_ACCEPTABLE,
                      "Neither HTML nor directory listing wanted");
              }
              elsif ($prefer eq 'html') {
                  $response->header('Content-Type' => 'text/html');
                  $content = "<HEAD><TITLE>File Listing</TITLE>\n";
                  my $base = $request->uri->clone;
                  my $path = $base->path;
                  $base->path("$path/") unless $path =~ m|/$|;
                  $content .= qq(<BASE HREF="$base">\n</HEAD>\n);
                  $content .= "<BODY>\n<UL>\n";
                  for (File::Listing::parse_dir(\@lsl, 'GMT')) {
                      my ($name, $type, $size, $mtime, $mode) = @$_;
                      $content .= qq(  <LI> <a href="$name">$name</a>);
                      $content .= " $size bytes" if $type eq 'f';
                      $content .= "\n";
                  }
                  $content .= "</UL></body>\n";
              }
              else {
                  $response->header('Content-Type', 'text/ftp-dir-listing');
                  $content = join("\n", @lsl, '');
              }
  
              $response->header('Content-Length', length($content));
  
              if ($method ne 'HEAD') {
                  $response = $self->collect_once($arg, $response, $content);
              }
          }
          else {
              my $res = HTTP::Response->new(HTTP::Status::RC_BAD_REQUEST,
                  "FTP return code " . $ftp->code);
              $res->content_type("text/plain");
              $res->content($ftp->message);
              return $res;
          }
      }
      elsif ($method eq 'PUT') {
  
          # method must be PUT
          unless (length($remote_file)) {
              return HTTP::Response->new(HTTP::Status::RC_BAD_REQUEST,
                  "Must have a file name to PUT to"
              );
          }
          my $data;
          if ($data = $ftp->stor($remote_file)) {
              my $content = $request->content;
              my $bytes   = 0;
              if (defined $content) {
                  if (ref($content) eq 'SCALAR') {
                      $bytes = $data->write($$content, length($$content));
                  }
                  elsif (ref($content) eq 'CODE') {
                      my ($buf, $n);
                      while (length($buf = &$content)) {
                          $n = $data->write($buf, length($buf));
                          last unless $n;
                          $bytes += $n;
                      }
                  }
                  elsif (!ref($content)) {
                      if (defined $content && length($content)) {
                          $bytes = $data->write($content, length($content));
                      }
                  }
                  else {
                      die "Bad content";
                  }
              }
              $data->close;
  
              $response->code(HTTP::Status::RC_CREATED);
              $response->header('Content-Type', 'text/plain');
              $response->content("$bytes bytes stored as $remote_file on $host\n")
  
          }
          else {
              my $res = HTTP::Response->new(HTTP::Status::RC_BAD_REQUEST,
                  "FTP return code " . $ftp->code);
              $res->content_type("text/plain");
              $res->content($ftp->message);
              return $res;
          }
      }
      else {
          return HTTP::Response->new(HTTP::Status::RC_BAD_REQUEST,
              "Illegal method $method");
      }
  
      $response;
  }
  
  1;
  
  __END__
  
  # This is what RFC 1738 has to say about FTP access:
  # --------------------------------------------------
  #
  # 3.2. FTP
  #
  #    The FTP URL scheme is used to designate files and directories on
  #    Internet hosts accessible using the FTP protocol (RFC959).
  #
  #    A FTP URL follow the syntax described in Section 3.1.  If :<port> is
  #    omitted, the port defaults to 21.
  #
  # 3.2.1. FTP Name and Password
  #
  #    A user name and password may be supplied; they are used in the ftp
  #    "USER" and "PASS" commands after first making the connection to the
  #    FTP server.  If no user name or password is supplied and one is
  #    requested by the FTP server, the conventions for "anonymous" FTP are
  #    to be used, as follows:
  #
  #         The user name "anonymous" is supplied.
  #
  #         The password is supplied as the Internet e-mail address
  #         of the end user accessing the resource.
  #
  #    If the URL supplies a user name but no password, and the remote
  #    server requests a password, the program interpreting the FTP URL
  #    should request one from the user.
  #
  # 3.2.2. FTP url-path
  #
  #    The url-path of a FTP URL has the following syntax:
  #
  #         <cwd1>/<cwd2>/.../<cwdN>/<name>;type=<typecode>
  #
  #    Where <cwd1> through <cwdN> and <name> are (possibly encoded) strings
  #    and <typecode> is one of the characters "a", "i", or "d".  The part
  #    ";type=<typecode>" may be omitted. The <cwdx> and <name> parts may be
  #    empty. The whole url-path may be omitted, including the "/"
  #    delimiting it from the prefix containing user, password, host, and
  #    port.
  #
  #    The url-path is interpreted as a series of FTP commands as follows:
  #
  #       Each of the <cwd> elements is to be supplied, sequentially, as the
  #       argument to a CWD (change working directory) command.
  #
  #       If the typecode is "d", perform a NLST (name list) command with
  #       <name> as the argument, and interpret the results as a file
  #       directory listing.
  #
  #       Otherwise, perform a TYPE command with <typecode> as the argument,
  #       and then access the file whose name is <name> (for example, using
  #       the RETR command.)
  #
  #    Within a name or CWD component, the characters "/" and ";" are
  #    reserved and must be encoded. The components are decoded prior to
  #    their use in the FTP protocol.  In particular, if the appropriate FTP
  #    sequence to access a particular file requires supplying a string
  #    containing a "/" as an argument to a CWD or RETR command, it is
  #    necessary to encode each "/".
  #
  #    For example, the URL <URL:ftp://myname@host.dom/%2Fetc/motd> is
  #    interpreted by FTP-ing to "host.dom", logging in as "myname"
  #    (prompting for a password if it is asked for), and then executing
  #    "CWD /etc" and then "RETR motd". This has a different meaning from
  #    <URL:ftp://myname@host.dom/etc/motd> which would "CWD etc" and then
  #    "RETR motd"; the initial "CWD" might be executed relative to the
  #    default directory for "myname". On the other hand,
  #    <URL:ftp://myname@host.dom//etc/motd>, would "CWD " with a null
  #    argument, then "CWD etc", and then "RETR motd".
  #
  #    FTP URLs may also be used for other operations; for example, it is
  #    possible to update a file on a remote file server, or infer
  #    information about it from the directory listings. The mechanism for
  #    doing so is not spelled out here.
  #
  # 3.2.3. FTP Typecode is Optional
  #
  #    The entire ;type=<typecode> part of a FTP URL is optional. If it is
  #    omitted, the client program interpreting the URL must guess the
  #    appropriate mode to use. In general, the data content type of a file
  #    can only be guessed from the name, e.g., from the suffix of the name;
  #    the appropriate type code to be used for transfer of the file can
  #    then be deduced from the data content of the file.
  #
  # 3.2.4 Hierarchy
  #
  #    For some file systems, the "/" used to denote the hierarchical
  #    structure of the URL corresponds to the delimiter used to construct a
  #    file name hierarchy, and thus, the filename will look similar to the
  #    URL path. This does NOT mean that the URL is a Unix filename.
  #
  # 3.2.5. Optimization
  #
  #    Clients accessing resources via FTP may employ additional heuristics
  #    to optimize the interaction. For some FTP servers, for example, it
  #    may be reasonable to keep the control connection open while accessing
  #    multiple URLs from the same server. However, there is no common
  #    hierarchical model to the FTP protocol, so if a directory change
  #    command has been given, it is impossible in general to deduce what
  #    sequence should be given to navigate to another directory for a
  #    second retrieval, if the paths are different.  The only reliable
  #    algorithm is to disconnect and reestablish the control connection.
LWP_PROTOCOL_FTP

    $main::fatpacked{"LWP/Protocol/gopher.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LWP_PROTOCOL_GOPHER';
  package LWP::Protocol::gopher;
  
  # Implementation of the gopher protocol (RFC 1436)
  #
  # This code is based on 'wwwgopher.pl,v 0.10 1994/10/17 18:12:34 shelden'
  # which in turn is a vastly modified version of Oscar's http'get()
  # dated 28/3/94 in <ftp://cui.unige.ch/PUBLIC/oscar/scripts/http.pl>
  # including contributions from Marc van Heyningen and Martijn Koster.
  
  use strict;
  
  our $VERSION = '6.39';
  
  require HTTP::Response;
  require HTTP::Status;
  require IO::Socket;
  require IO::Select;
  
  use base qw(LWP::Protocol);
  
  
  my %gopher2mimetype = (
      '0' => 'text/plain',                # 0 file
      '1' => 'text/html',                 # 1 menu
  					# 2 CSO phone-book server
  					# 3 Error
      '4' => 'application/mac-binhex40',  # 4 BinHexed Macintosh file
      '5' => 'application/zip',           # 5 DOS binary archive of some sort
      '6' => 'application/octet-stream',  # 6 UNIX uuencoded file.
      '7' => 'text/html',                 # 7 Index-Search server
  					# 8 telnet session
      '9' => 'application/octet-stream',  # 9 binary file
      'h' => 'text/html',                 # html
      'g' => 'image/gif',                 # gif
      'I' => 'image/*',                   # some kind of image
  );
  
  my %gopher2encoding = (
      '6' => 'x_uuencode',                # 6 UNIX uuencoded file.
  );
  
  sub request
  {
      my($self, $request, $proxy, $arg, $size, $timeout) = @_;
  
      $size = 4096 unless $size;
  
      # check proxy
      if (defined $proxy) {
  	return HTTP::Response->new(HTTP::Status::RC_BAD_REQUEST,
  				   'You can not proxy through the gopher');
      }
  
      my $url = $request->uri;
      die "bad scheme" if $url->scheme ne 'gopher';
  
  
      my $method = $request->method;
      unless ($method eq 'GET' || $method eq 'HEAD') {
  	return HTTP::Response->new(HTTP::Status::RC_BAD_REQUEST,
  				   'Library does not allow method ' .
  				   "$method for 'gopher:' URLs");
      }
  
      my $gophertype = $url->gopher_type;
      unless (exists $gopher2mimetype{$gophertype}) {
  	return HTTP::Response->new(HTTP::Status::RC_NOT_IMPLEMENTED,
  				   'Library does not support gophertype ' .
  				   $gophertype);
      }
  
      my $response = HTTP::Response->new(HTTP::Status::RC_OK, "OK");
      $response->header('Content-type' => $gopher2mimetype{$gophertype}
  					|| 'text/plain');
      $response->header('Content-Encoding' => $gopher2encoding{$gophertype})
  	if exists $gopher2encoding{$gophertype};
  
      if ($method eq 'HEAD') {
  	# XXX: don't even try it so we set this header
  	$response->header('Client-Warning' => 'Client answer only');
  	return $response;
      }
  
      if ($gophertype eq '7' && ! $url->search) {
        # the url is the prompt for a gopher search; supply boiler-plate
        return $self->collect_once($arg, $response, <<"EOT");
  <HEAD>
  <TITLE>Gopher Index</TITLE>
  <ISINDEX>
  </HEAD>
  <BODY>
  <H1>$url<BR>Gopher Search</H1>
  This is a searchable Gopher index.
  Use the search function of your browser to enter search terms.
  </BODY>
  EOT
      }
  
      my $host = $url->host;
      my $port = $url->port;
  
      my $requestLine = "";
  
      my $selector = $url->selector;
      if (defined $selector) {
  	$requestLine .= $selector;
  	my $search = $url->search;
  	if (defined $search) {
  	    $requestLine .= "\t$search";
  	    my $string = $url->string;
  	    if (defined $string) {
  		$requestLine .= "\t$string";
  	    }
  	}
      }
      $requestLine .= "\015\012";
  
      # potential request headers are just ignored
  
      # Ok, lets make the request
      my $socket = IO::Socket::INET->new(PeerAddr => $host,
  				       PeerPort => $port,
  				       LocalAddr => $self->{ua}{local_address},
  				       Proto    => 'tcp',
  				       Timeout  => $timeout);
      die "Can't connect to $host:$port" unless $socket;
      my $sel = IO::Select->new($socket);
  
      {
  	die "write timeout" if $timeout && !$sel->can_write($timeout);
  	my $n = syswrite($socket, $requestLine, length($requestLine));
  	die $! unless defined($n);
  	die "short write" if $n != length($requestLine);
      }
  
      my $user_arg = $arg;
  
      # must handle menus in a special way since they are to be
      # converted to HTML.  Undefing $arg ensures that the user does
      # not see the data before we get a change to convert it.
      $arg = undef if $gophertype eq '1' || $gophertype eq '7';
  
      # collect response
      my $buf = '';
      $response = $self->collect($arg, $response, sub {
  	die "read timeout" if $timeout && !$sel->can_read($timeout);
          my $n = sysread($socket, $buf, $size);
  	die $! unless defined($n);
  	return \$buf;
        } );
  
      # Convert menu to HTML and return data to user.
      if ($gophertype eq '1' || $gophertype eq '7') {
  	my $content = menu2html($response->content);
  	if (defined $user_arg) {
  	    $response = $self->collect_once($user_arg, $response, $content);
  	}
  	else {
  	    $response->content($content);
  	}
      }
  
      $response;
  }
  
  
  sub gopher2url
  {
      my($gophertype, $path, $host, $port) = @_;
  
      my $url;
  
      if ($gophertype eq '8' || $gophertype eq 'T') {
  	# telnet session
  	$url = $HTTP::URI_CLASS->new($gophertype eq '8' ? 'telnet:':'tn3270:');
  	$url->user($path) if defined $path;
      }
      else {
  	$path = URI::Escape::uri_escape($path);
  	$url = $HTTP::URI_CLASS->new("gopher:/$gophertype$path");
      }
      $url->host($host);
      $url->port($port);
      $url;
  }
  
  sub menu2html {
      my($menu) = @_;
  
      $menu =~ tr/\015//d;  # remove carriage return
      my $tmp = <<"EOT";
  <HTML>
  <HEAD>
     <TITLE>Gopher menu</TITLE>
  </HEAD>
  <BODY>
  <H1>Gopher menu</H1>
  EOT
      for (split("\n", $menu)) {
  	last if /^\./;
  	my($pretty, $path, $host, $port) = split("\t");
  
  	$pretty =~ s/^(.)//;
  	my $type = $1;
  
  	my $url = gopher2url($type, $path, $host, $port)->as_string;
  	$tmp .= qq{<A HREF="$url">$pretty</A><BR>\n};
      }
      $tmp .= "</BODY>\n</HTML>\n";
      $tmp;
  }
  
  1;
LWP_PROTOCOL_GOPHER

    $main::fatpacked{"LWP/Protocol/http.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LWP_PROTOCOL_HTTP';
  package LWP::Protocol::http;
  
  use strict;
  
  our $VERSION = '6.39';
  
  require HTTP::Response;
  require HTTP::Status;
  require Net::HTTP;
  
  use base qw(LWP::Protocol);
  
  our @EXTRA_SOCK_OPTS;
  my $CRLF = "\015\012";
  
  sub _new_socket
  {
      my($self, $host, $port, $timeout) = @_;
  
      # IPv6 literal IP address should be [bracketed] to remove
      # ambiguity between ip address and port number.
      if ( ($host =~ /:/) && ($host !~ /^\[/) ) {
        $host = "[$host]";
      }
  
      local($^W) = 0;  # IO::Socket::INET can be noisy
      my $sock = $self->socket_class->new(PeerAddr => $host,
  					PeerPort => $port,
  					LocalAddr => $self->{ua}{local_address},
  					Proto    => 'tcp',
  					Timeout  => $timeout,
  					KeepAlive => !!$self->{ua}{conn_cache},
  					SendTE    => $self->{ua}{send_te},
  					$self->_extra_sock_opts($host, $port),
  				       );
  
      unless ($sock) {
  	# IO::Socket::INET leaves additional error messages in $@
  	my $status = "Can't connect to $host:$port";
  	if ($@ =~ /\bconnect: (.*)/ ||
  	    $@ =~ /\b(Bad hostname)\b/ ||
  	    $@ =~ /\b(nodename nor servname provided, or not known)\b/ ||
  	    $@ =~ /\b(certificate verify failed)\b/ ||
  	    $@ =~ /\b(Crypt-SSLeay can't verify hostnames)\b/
  	) {
  	    $status .= " ($1)";
  	} elsif ($@) {
  	    $status .= " ($@)";
  	}
  	die "$status\n\n$@";
      }
  
      # perl 5.005's IO::Socket does not have the blocking method.
      eval { $sock->blocking(0); };
  
      $sock;
  }
  
  sub socket_type
  {
      return "http";
  }
  
  sub socket_class
  {
      my $self = shift;
      (ref($self) || $self) . "::Socket";
  }
  
  sub _extra_sock_opts  # to be overridden by subclass
  {
      return @EXTRA_SOCK_OPTS;
  }
  
  sub _check_sock
  {
      #my($self, $req, $sock) = @_;
  }
  
  sub _get_sock_info
  {
      my($self, $res, $sock) = @_;
      if (defined(my $peerhost = $sock->peerhost)) {
          $res->header("Client-Peer" => "$peerhost:" . $sock->peerport);
      }
  }
  
  sub _fixup_header
  {
      my($self, $h, $url, $proxy) = @_;
  
      # Extract 'Host' header
      my $hhost = $url->authority;
      if ($hhost =~ s/^([^\@]*)\@//) {  # get rid of potential "user:pass@"
  	# add authorization header if we need them.  HTTP URLs do
  	# not really support specification of user and password, but
  	# we allow it.
  	if (defined($1) && not $h->header('Authorization')) {
  	    require URI::Escape;
  	    $h->authorization_basic(map URI::Escape::uri_unescape($_),
  				    split(":", $1, 2));
  	}
      }
      $h->init_header('Host' => $hhost);
  
      if ($proxy && $url->scheme ne 'https') {
  	# Check the proxy URI's userinfo() for proxy credentials
  	# export http_proxy="http://proxyuser:proxypass@proxyhost:port".
  	# For https only the initial CONNECT requests needs authorization.
  	my $p_auth = $proxy->userinfo();
  	if(defined $p_auth) {
  	    require URI::Escape;
  	    $h->proxy_authorization_basic(map URI::Escape::uri_unescape($_),
  					  split(":", $p_auth, 2))
  	}
      }
  }
  
  sub hlist_remove {
      my($hlist, $k) = @_;
      $k = lc $k;
      for (my $i = @$hlist - 2; $i >= 0; $i -= 2) {
  	next unless lc($hlist->[$i]) eq $k;
  	splice(@$hlist, $i, 2);
      }
  }
  
  sub request
  {
      my($self, $request, $proxy, $arg, $size, $timeout) = @_;
  
      $size ||= 4096;
  
      # check method
      my $method = $request->method;
      unless ($method =~ /^[A-Za-z0-9_!\#\$%&\'*+\-.^\`|~]+$/) {  # HTTP token
  	return HTTP::Response->new( HTTP::Status::RC_BAD_REQUEST,
  				  'Library does not allow method ' .
  				  "$method for 'http:' URLs");
      }
  
      my $url = $request->uri;
  
      # Proxying SSL with a http proxy needs issues a CONNECT request to build a
      # tunnel and then upgrades the tunnel to SSL. But when doing keep-alive the
      # https request does not need to be the first request in the connection, so
      # we need to distinguish between
      # - not yet connected (create socket and ssl upgrade)
      # - connected but not inside ssl tunnel (ssl upgrade)
      # - inside ssl tunnel to the target - once we are in the tunnel to the
      #   target we cannot only reuse the tunnel for more https requests with the
      #   same target
  
      my $ssl_tunnel = $proxy && $url->scheme eq 'https'
  	&& $url->host.":".$url->port;
  
      my ($host,$port) = $proxy
  	? ($proxy->host,$proxy->port)
  	: ($url->host,$url->port);
      my $fullpath =
  	$method eq 'CONNECT' ? $url->host . ":" . $url->port :
  	$proxy && ! $ssl_tunnel ? $url->as_string :
  	do {
  	    my $path = $url->path_query;
  	    $path = "/$path" if $path !~m{^/};
  	    $path
  	};
  
      my $socket;
      my $conn_cache = $self->{ua}{conn_cache};
      my $cache_key;
      if ( $conn_cache ) {
  	$cache_key = "$host:$port";
  	# For https we reuse the socket immediately only if it has an established
  	# tunnel to the target. Otherwise a CONNECT request followed by an SSL
  	# upgrade need to be done first. The request itself might reuse an
  	# existing non-ssl connection to the proxy
  	$cache_key .= "!".$ssl_tunnel if $ssl_tunnel;
  	if ( $socket = $conn_cache->withdraw($self->socket_type,$cache_key)) {
  	    if ($socket->can_read(0)) {
  		# if the socket is readable, then either the peer has closed the
  		# connection or there are some garbage bytes on it.  In either
  		# case we abandon it.
  		$socket->close;
  		$socket = undef;
  	    } # else use $socket
  	    else {
  		$socket->timeout($timeout);
  	    }
  	}
      }
  
      if ( ! $socket && $ssl_tunnel ) {
  	my $proto_https = LWP::Protocol::create('https',$self->{ua})
  	    or die "no support for scheme https found";
  
  	# only if ssl socket class is IO::Socket::SSL we can upgrade
  	# a plain socket to SSL. In case of Net::SSL we fall back to
  	# the old version
  	if ( my $upgrade_sub = $proto_https->can('_upgrade_sock')) {
  	    my $response = $self->request(
  		HTTP::Request->new('CONNECT',"http://$ssl_tunnel"),
  		$proxy,
  		undef,$size,$timeout
  	    );
  	    $response->is_success or die
  		"establishing SSL tunnel failed: ".$response->status_line;
  	    $socket = $upgrade_sub->($proto_https,
  		$response->{client_socket},$url)
  		or die "SSL upgrade failed: $@";
  	} else {
  	    $socket = $proto_https->_new_socket($url->host,$url->port,$timeout);
  	}
      }
  
      if ( ! $socket ) {
  	# connect to remote site w/o reusing established socket
  	$socket = $self->_new_socket($host, $port, $timeout );
      }
  
      my $http_version = "";
      if (my $proto = $request->protocol) {
  	if ($proto =~ /^(?:HTTP\/)?(1.\d+)$/) {
  	    $http_version = $1;
  	    $socket->http_version($http_version);
  	    $socket->send_te(0) if $http_version eq "1.0";
  	}
      }
  
      $self->_check_sock($request, $socket);
  
      my @h;
      my $request_headers = $request->headers->clone;
      $self->_fixup_header($request_headers, $url, $proxy);
  
      $request_headers->scan(sub {
  			       my($k, $v) = @_;
  			       $k =~ s/^://;
  			       $v =~ tr/\n/ /;
  			       push(@h, $k, $v);
  			   });
  
      my $content_ref = $request->content_ref;
      $content_ref = $$content_ref if ref($$content_ref);
      my $chunked;
      my $has_content;
  
      if (ref($content_ref) eq 'CODE') {
  	my $clen = $request_headers->header('Content-Length');
  	$has_content++ if $clen;
  	unless (defined $clen) {
  	    push(@h, "Transfer-Encoding" => "chunked");
  	    $has_content++;
  	    $chunked++;
  	}
      }
      else {
  	# Set (or override) Content-Length header
  	my $clen = $request_headers->header('Content-Length');
  	if (defined($$content_ref) && length($$content_ref)) {
  	    $has_content = length($$content_ref);
  	    if (!defined($clen) || $clen ne $has_content) {
  		if (defined $clen) {
  		    warn "Content-Length header value was wrong, fixed";
  		    hlist_remove(\@h, 'Content-Length');
  		}
  		push(@h, 'Content-Length' => $has_content);
  	    }
  	}
  	elsif ($clen) {
  	    warn "Content-Length set when there is no content, fixed";
  	    hlist_remove(\@h, 'Content-Length');
  	}
      }
  
      my $write_wait = 0;
      $write_wait = 2
  	if ($request_headers->header("Expect") || "") =~ /100-continue/;
  
      my $req_buf = $socket->format_request($method, $fullpath, @h);
      #print "------\n$req_buf\n------\n";
  
      if (!$has_content || $write_wait || $has_content > 8*1024) {
        WRITE:
          {
              # Since this just writes out the header block it should almost
              # always succeed to send the whole buffer in a single write call.
              my $n = $socket->syswrite($req_buf, length($req_buf));
              unless (defined $n) {
                  redo WRITE if $!{EINTR};
                  if ($!{EWOULDBLOCK} || $!{EAGAIN}) {
                      select(undef, undef, undef, 0.1);
                      redo WRITE;
                  }
                  die "write failed: $!";
              }
              if ($n) {
                  substr($req_buf, 0, $n, "");
              }
              else {
                  select(undef, undef, undef, 0.5);
              }
              redo WRITE if length $req_buf;
          }
      }
  
      my($code, $mess, @junk);
      my $drop_connection;
  
      if ($has_content) {
  	my $eof;
  	my $wbuf;
  	my $woffset = 0;
        INITIAL_READ:
  	if ($write_wait) {
  	    # skip filling $wbuf when waiting for 100-continue
  	    # because if the response is a redirect or auth required
  	    # the request will be cloned and there is no way
  	    # to reset the input stream
  	    # return here via the label after the 100-continue is read
  	}
  	elsif (ref($content_ref) eq 'CODE') {
  	    my $buf = &$content_ref();
  	    $buf = "" unless defined($buf);
  	    $buf = sprintf "%x%s%s%s", length($buf), $CRLF, $buf, $CRLF
  		if $chunked;
  	    substr($buf, 0, 0) = $req_buf if $req_buf;
  	    $wbuf = \$buf;
  	}
  	else {
  	    if ($req_buf) {
  		my $buf = $req_buf . $$content_ref;
  		$wbuf = \$buf;
  	    }
  	    else {
  		$wbuf = $content_ref;
  	    }
  	    $eof = 1;
  	}
  
  	my $fbits = '';
  	vec($fbits, fileno($socket), 1) = 1;
  
        WRITE:
  	while ($write_wait || $woffset < length($$wbuf)) {
  
  	    my $sel_timeout = $timeout;
  	    if ($write_wait) {
  		$sel_timeout = $write_wait if $write_wait < $sel_timeout;
  	    }
  	    my $time_before;
              $time_before = time if $sel_timeout;
  
  	    my $rbits = $fbits;
  	    my $wbits = $write_wait ? undef : $fbits;
              my $sel_timeout_before = $sel_timeout;
            SELECT:
              {
                  my $nfound = select($rbits, $wbits, undef, $sel_timeout);
                  if ($nfound < 0) {
                      if ($!{EINTR} || $!{EWOULDBLOCK} || $!{EAGAIN}) {
                          if ($time_before) {
                              $sel_timeout = $sel_timeout_before - (time - $time_before);
                              $sel_timeout = 0 if $sel_timeout < 0;
                          }
                          redo SELECT;
                      }
                      die "select failed: $!";
                  }
  	    }
  
  	    if ($write_wait) {
  		$write_wait -= time - $time_before;
  		$write_wait = 0 if $write_wait < 0;
  	    }
  
  	    if (defined($rbits) && $rbits =~ /[^\0]/) {
  		# readable
  		my $buf = $socket->_rbuf;
  		my $n = $socket->sysread($buf, 1024, length($buf));
                  unless (defined $n) {
                      die "read failed: $!" unless  $!{EINTR} || $!{EWOULDBLOCK} || $!{EAGAIN};
                      # if we get here the rest of the block will do nothing
                      # and we will retry the read on the next round
                  }
  		elsif ($n == 0) {
                      # the server closed the connection before we finished
                      # writing all the request content.  No need to write any more.
                      $drop_connection++;
                      last WRITE;
  		}
  		$socket->_rbuf($buf);
  		if (!$code && $buf =~ /\015?\012\015?\012/) {
  		    # a whole response header is present, so we can read it without blocking
  		    ($code, $mess, @h) = $socket->read_response_headers(laxed => 1,
  									junk_out => \@junk,
  								       );
  		    if ($code eq "100") {
  			$write_wait = 0;
  			undef($code);
  			goto INITIAL_READ;
  		    }
  		    else {
  			$drop_connection++;
  			last WRITE;
  			# XXX should perhaps try to abort write in a nice way too
  		    }
  		}
  	    }
  	    if (defined($wbits) && $wbits =~ /[^\0]/) {
  		my $n = $socket->syswrite($$wbuf, length($$wbuf), $woffset);
                  unless (defined $n) {
                      die "write failed: $!" unless $!{EINTR} || $!{EWOULDBLOCK} || $!{EAGAIN};
                      $n = 0;  # will retry write on the next round
                  }
                  elsif ($n == 0) {
  		    die "write failed: no bytes written";
  		}
  		$woffset += $n;
  
  		if (!$eof && $woffset >= length($$wbuf)) {
  		    # need to refill buffer from $content_ref code
  		    my $buf = &$content_ref();
  		    $buf = "" unless defined($buf);
  		    $eof++ unless length($buf);
  		    $buf = sprintf "%x%s%s%s", length($buf), $CRLF, $buf, $CRLF
  			if $chunked;
  		    $wbuf = \$buf;
  		    $woffset = 0;
  		}
  	    }
  	} # WRITE
      }
  
      ($code, $mess, @h) = $socket->read_response_headers(laxed => 1, junk_out => \@junk)
  	unless $code;
      ($code, $mess, @h) = $socket->read_response_headers(laxed => 1, junk_out => \@junk)
  	if $code eq "100";
  
      my $response = HTTP::Response->new($code, $mess);
      my $peer_http_version = $socket->peer_http_version;
      $response->protocol("HTTP/$peer_http_version");
      {
  	local $HTTP::Headers::TRANSLATE_UNDERSCORE;
  	$response->push_header(@h);
      }
      $response->push_header("Client-Junk" => \@junk) if @junk;
  
      $response->request($request);
      $self->_get_sock_info($response, $socket);
  
      if ($method eq "CONNECT") {
  	$response->{client_socket} = $socket;  # so it can be picked up
  	return $response;
      }
  
      if (my @te = $response->remove_header('Transfer-Encoding')) {
  	$response->push_header('Client-Transfer-Encoding', \@te);
      }
      $response->push_header('Client-Response-Num', scalar $socket->increment_response_count);
  
      my $complete;
      $response = $self->collect($arg, $response, sub {
  	my $buf = ""; #prevent use of uninitialized value in SSLeay.xs
  	my $n;
        READ:
  	{
  	    $n = $socket->read_entity_body($buf, $size);
              unless (defined $n) {
                  redo READ if $!{EINTR} || $!{EWOULDBLOCK} || $!{EAGAIN} || $!{ENOTTY};
                  die "read failed: $!";
              }
  	    redo READ if $n == -1;
  	}
  	$complete++ if !$n;
          return \$buf;
      } );
      $drop_connection++ unless $complete;
  
      @h = $socket->get_trailers;
      if (@h) {
  	local $HTTP::Headers::TRANSLATE_UNDERSCORE;
  	$response->push_header(@h);
      }
  
      # keep-alive support
      unless ($drop_connection) {
  	if ($cache_key) {
  	    my %connection = map { (lc($_) => 1) }
  		             split(/\s*,\s*/, ($response->header("Connection") || ""));
  	    if (($peer_http_version eq "1.1" && !$connection{close}) ||
  		$connection{"keep-alive"})
  	    {
  		$conn_cache->deposit($self->socket_type, $cache_key, $socket);
  	    }
  	}
      }
  
      $response;
  }
  
  
  #-----------------------------------------------------------
  package # hide from PAUSE
      LWP::Protocol::http::SocketMethods;
  
  sub ping {
      my $self = shift;
      !$self->can_read(0);
  }
  
  sub increment_response_count {
      my $self = shift;
      return ++${*$self}{'myhttp_response_count'};
  }
  
  #-----------------------------------------------------------
  package # hide from PAUSE
      LWP::Protocol::http::Socket;
  
  use parent -norequire, qw(LWP::Protocol::http::SocketMethods Net::HTTP);
  
  1;
LWP_PROTOCOL_HTTP

    $main::fatpacked{"LWP/Protocol/http/SocketUnixAlt.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LWP_PROTOCOL_HTTP_SOCKETUNIXALT';
  package LWP::Protocol::http::SocketUnixAlt;
  
  use 5.010001;
  use strict;
  use warnings;
  use vars qw( @ISA $VERSION );
  use IO::Socket;
  use LWP::Protocol::http;
  
  @ISA = qw( LWP::Protocol::http );
  
  our $VERSION = '0.0204'; # VERSION
  
  sub _new_socket {
  	my ($self, $path, $timeout) = @_;
  
  	local($^W) = 0;
  	my $sock = $self->socket_class->new(
  			Peer	=> $path,
  			Type	=> SOCK_STREAM,
  			Timeout	=> $timeout,
  			Host    => 'localhost',
  	);
  
  	unless($sock) {
  		$@ =~ s/^.*?: //;
  		die "Can't open socket $path\: $@";
  	}
  
  	eval { $sock->blocking(0); };
  
  	$sock;
  }
  
  sub request {
      my($self, $request, undef, $arg, $size, $timeout) = @_;
      #LWP::Debug::trace('()');
  
      $size ||= 4096;
  
      # check method
      my $method = $request->method;
      unless ($method =~ /^[A-Za-z0-9_!\#\$%&\'*+\-.^\`|~]+$/) {  # HTTP token
  		return new HTTP::Response &HTTP::Status::RC_BAD_REQUEST,
  				  'Library does not allow method ' .
  				  "$method for 'http:' URLs";
      }
  
      my $url = $request->url;
  	my $path = $url->path_query;
  	my $fullpath;
  	if ($path =~ s!/(/.+)!!) {
  		$fullpath = $1;
  	} else {
  		$fullpath = "/";
  	}
  
      # connect to remote site
      my $socket = $self->_new_socket($path, $timeout);
      $self->_check_sock($request, $socket);
  
      my @h;
      my $request_headers = $request->headers->clone;
      $self->_fixup_header($request_headers, $url);
  
      $request_headers->scan(sub {
  			       my($k, $v) = @_;
  			       $v =~ s/\n/ /g;
  			       push(@h, $k, $v);
  			   });
  
      my $content_ref = $request->content_ref;
      $content_ref = $$content_ref if ref($$content_ref);
      my $chunked;
      my $has_content;
  
      if (ref($content_ref) eq 'CODE') {
  		my $clen = $request_headers->header('Content-Length');
  		$has_content++ if $clen;
  		unless (defined $clen) {
  			push(@h, "Transfer-Encoding" => "chunked");
  			$has_content++;
  			$chunked++;
  		}
      } else {
  		# Set (or override) Content-Length header
  		my $clen = $request_headers->header('Content-Length');
  		if (defined($$content_ref) && length($$content_ref)) {
  			$has_content++;
  			if (!defined($clen) || $clen ne length($$content_ref)) {
  				if (defined $clen) {
  					warn "Content-Length header value was wrong, fixed";
  					hlist_remove(\@h, 'Content-Length');
  				}
  				push(@h, 'Content-Length' => length($$content_ref));
  			}
  		} elsif ($clen) {
  			warn "Content-Length set when there is not content, fixed";
  			hlist_remove(\@h, 'Content-Length');
  		}
      }
  
      my $req_buf = $socket->format_request($method, $fullpath, @h);
      #print "------\n$req_buf\n------\n";
  
      # XXX need to watch out for write timeouts
      {
  		my $n = $socket->syswrite($req_buf, length($req_buf));
  		die $! unless defined($n);
  		die "short write" unless $n == length($req_buf);
  		#LWP::Debug::conns($req_buf);
      }
  
      my($code, $mess, @junk);
  
      if ($has_content) {
  		my $write_wait = 0;
  		$write_wait = 2
  			if ($request_headers->header("Expect") || "") =~ /100-continue/;
  
  		my $eof;
  		my $wbuf;
  		my $woffset = 0;
  		if (ref($content_ref) eq 'CODE') {
  			my $buf = &$content_ref();
  			$buf = "" unless defined($buf);
  			$buf = sprintf "%x%s%s%s", length($buf), $LWP::Protocol::http::CRLF,
  				$buf, $LWP::Protocol::http::CRLF if $chunked;
  			$wbuf = \$buf;
  		} else {
  			$wbuf = $content_ref;
  			$eof = 1;
  		}
  
  		my $fbits = '';
  		vec($fbits, fileno($socket), 1) = 1;
  
  		while ($woffset < length($$wbuf)) {
  
  			my $time_before;
  			my $sel_timeout = $timeout;
  			if ($write_wait) {
  				$time_before = time;
  				$sel_timeout = $write_wait if $write_wait < $sel_timeout;
  			}
  
  			my $rbits = $fbits;
  			my $wbits = $write_wait ? undef : $fbits;
  			my $nfound = select($rbits, $wbits, undef, $sel_timeout);
  			unless (defined $nfound) {
  				die "select failed: $!";
  			}
  
  			if ($write_wait) {
  				$write_wait -= time - $time_before;
  				$write_wait = 0 if $write_wait < 0;
  			}
  
  			if (defined($rbits) && $rbits =~ /[^\0]/) {
  				# readable
  				my $buf = $socket->_rbuf;
  				my $n = $socket->sysread($buf, 1024, length($buf));
  				unless ($n) {
  					die "EOF";
  				}
  				$socket->_rbuf($buf);
  				if ($buf =~ /\015?\012\015?\012/) {
  					# a whole response present
  					($code, $mess, @h) = $socket->read_response_headers(laxed => 1,
  											junk_out => \@junk,
  											   );
  					if ($code eq "100") {
  						$write_wait = 0;
  						undef($code);
  					} else {
  						last;
  						# XXX should perhaps try to abort write in a nice way too
  					}
  				}
  			}
  			if (defined($wbits) && $wbits =~ /[^\0]/) {
  				my $n = $socket->syswrite($$wbuf, length($$wbuf), $woffset);
  				unless ($n) {
  					die "syswrite: $!" unless defined $n;
  					die "syswrite: no bytes written";
  				}
  				$woffset += $n;
  
  				if (!$eof && $woffset >= length($$wbuf)) {
  					# need to refill buffer from $content_ref code
  					my $buf = &$content_ref();
  					$buf = "" unless defined($buf);
  					$eof++ unless length($buf);
  					$buf = sprintf "%x%s%s%s", length($buf), $LWP::Protocol::http::CRLF,
  						$buf, $LWP::Protocol::http::CRLF if $chunked;
  					$wbuf = \$buf;
  					$woffset = 0;
  				}
  			}
  		}
      }
  
      ($code, $mess, @h) = $socket->read_response_headers(laxed => 1, junk_out => \@junk)
  	unless $code;
      ($code, $mess, @h) = $socket->read_response_headers(laxed => 1, junk_out => \@junk)
  	if $code eq "100";
  
      my $response = HTTP::Response->new($code, $mess);
      my $peer_http_version = $socket->peer_http_version;
      $response->protocol("HTTP/$peer_http_version");
      while (@h) {
  		my($k, $v) = splice(@h, 0, 2);
  		$response->push_header($k, $v);
      }
      $response->push_header("Client-Junk" => \@junk) if @junk;
  
      $response->request($request);
      $self->_get_sock_info($response, $socket);
  
      if ($method eq "CONNECT") {
  		$response->{client_socket} = $socket;  # so it can be picked up
  		return $response;
      }
  
      if (my @te = $response->remove_header('Transfer-Encoding')) {
  		$response->push_header('Client-Transfer-Encoding', \@te);
      }
      $response->push_header('Client-Response-Num', $socket->increment_response_count);
  
      my $complete;
      $response = $self->collect($arg, $response, sub {
  		my $buf = ""; #prevent use of uninitialized value in SSLeay.xs
  		my $n;
  		READ:
  		{
  			$n = $socket->read_entity_body($buf, $size);
  			die "Can't read entity body: $!" unless defined $n;
  			redo READ if $n == -1;
  		}
  		$complete++ if !$n;
  			return \$buf;
      } );
  
      @h = $socket->get_trailers;
      while (@h) {
  		my($k, $v) = splice(@h, 0, 2);
  		$response->push_header($k, $v);
      }
  
      $response;
  }
  
  package LWP::Protocol::http::SocketUnixAlt::Socket;
  
  use strict;
  use warnings;
  use vars qw( @ISA );
  
  @ISA =qw(	LWP::Protocol::http::SocketMethods
  			Net::HTTP::Methods
  			IO::Socket::UNIX
  		);
  
  sub configure {
  	my ($self, $cnf) = @_;
  	$self->http_configure($cnf);
  }
  
  sub http_connect {
  	my ($self, $cnf) = @_;
  	$self->SUPER::configure($cnf);
  }
  
  # Just to avoid some errors. We don't really need this.
  sub peerport { }
  sub peerhost { }
  
  1;
  # ABSTRACT: Speak HTTP through Unix sockets
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  LWP::Protocol::http::SocketUnixAlt - Speak HTTP through Unix sockets
  
  =head1 VERSION
  
  version 0.0204
  
  =head1 SYNOPSIS
  
    use LWP::Protocol::http::SocketUnixAlt;
    LWP::Protocol::implementor( http => 'LWP::Protocol::http::SocketUnixAlt' );
    ...
  
  =head1 DESCRIPTION
  
  LWP::Protocol::http::UnixSocketAlt is a fork of Florian Ragwitz's
  L<LWP::Protocol::http::SocketUnix> 0.02. It fixes a few issues including:
  
  =over 4
  
  =item * remedy 'No Host options provided' error
  
  As suggested in https://rt.cpan.org/Public/Bug/Display.html?id=65670
  
  =item * allow specifying URI path
  
  Currently using "//" as separator, e.g.: "http:path/to/unix.socket//uri/path"
  
  =back
  
  =head1 SEE ALSO
  
  L<LWP>, L<LWP::Protocol>
  
  L<HTTP::Daemon::UNIX>
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/LWP-Protocol-http-SocketUnixAlt>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/sharyanto/perl-LWP-Protocol-http-SocketUnixAlt>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=LWP-Protocol-http-SocketUnixAlt>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  Steven Haryanto <stevenharyanto@gmail.com>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2014 by Steven Haryanto.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
LWP_PROTOCOL_HTTP_SOCKETUNIXALT

    $main::fatpacked{"LWP/Protocol/loopback.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LWP_PROTOCOL_LOOPBACK';
  package LWP::Protocol::loopback;
  
  use strict;
  
  our $VERSION = '6.39';
  
  require HTTP::Response;
  
  use base qw(LWP::Protocol);
  
  sub request {
      my($self, $request, $proxy, $arg, $size, $timeout) = @_;
  
      my $response = HTTP::Response->new(200, "OK");
      $response->content_type("message/http; msgtype=request");
  
      $response->header("Via", "loopback/1.0 $proxy")
  	if $proxy;
  
      $response->header("X-Arg", $arg);
      $response->header("X-Read-Size", $size);
      $response->header("X-Timeout", $timeout);
  
      return $self->collect_once($arg, $response, $request->as_string);
  }
  
  1;
LWP_PROTOCOL_LOOPBACK

    $main::fatpacked{"LWP/Protocol/mailto.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LWP_PROTOCOL_MAILTO';
  package LWP::Protocol::mailto;
  
  # This module implements the mailto protocol.  It is just a simple
  # frontend to the Unix sendmail program except on MacOS, where it uses
  # Mail::Internet.
  
  require HTTP::Request;
  require HTTP::Response;
  require HTTP::Status;
  
  use Carp;
  use strict;
  
  our $VERSION = '6.39';
  
  use base qw(LWP::Protocol);
  our $SENDMAIL;
  
  unless ($SENDMAIL = $ENV{SENDMAIL}) {
      for my $sm (qw(/usr/sbin/sendmail
  		   /usr/lib/sendmail
  		   /usr/ucblib/sendmail
  		  ))
      {
  	if (-x $sm) {
  	    $SENDMAIL = $sm;
  	    last;
  	}
      }
      die "Can't find the 'sendmail' program" unless $SENDMAIL;
  }
  
  sub request
  {
      my($self, $request, $proxy, $arg, $size) = @_;
  
      my ($mail, $addr) if $^O eq "MacOS";
      my @text = () if $^O eq "MacOS";
  
      # check proxy
      if (defined $proxy)
      {
  	return HTTP::Response->new(HTTP::Status::RC_BAD_REQUEST,
  				  'You can not proxy with mail');
      }
  
      # check method
      my $method = $request->method;
  
      if ($method ne 'POST') {
  	return HTTP::Response->new( HTTP::Status::RC_BAD_REQUEST,
  				  'Library does not allow method ' .
  				  "$method for 'mailto:' URLs");
      }
  
      # check url
      my $url = $request->uri;
  
      my $scheme = $url->scheme;
      if ($scheme ne 'mailto') {
  	return HTTP::Response->new( HTTP::Status::RC_INTERNAL_SERVER_ERROR,
  			 "LWP::Protocol::mailto::request called for '$scheme'");
      }
      if ($^O eq "MacOS") {
  	eval {
  	    require Mail::Internet;
  	};
  	if($@) {
  	    return HTTP::Response->new( HTTP::Status::RC_INTERNAL_SERVER_ERROR,
  	               "You don't have MailTools installed");
  	}
  	unless ($ENV{SMTPHOSTS}) {
  	    return HTTP::Response->new( HTTP::Status::RC_INTERNAL_SERVER_ERROR,
  	               "You don't have SMTPHOSTS defined");
  	}
      }
      else {
  	unless (-x $SENDMAIL) {
  	    return HTTP::Response->new( HTTP::Status::RC_INTERNAL_SERVER_ERROR,
  	               "You don't have $SENDMAIL");
      }
      }
      if ($^O eq "MacOS") {
  	    $mail = Mail::Internet->new or
  	    return HTTP::Response->new( HTTP::Status::RC_INTERNAL_SERVER_ERROR,
  	    "Can't get a Mail::Internet object");
      }
      else {
  	open(SENDMAIL, "| $SENDMAIL -oi -t") or
  	    return HTTP::Response->new( HTTP::Status::RC_INTERNAL_SERVER_ERROR,
  	               "Can't run $SENDMAIL: $!");
      }
      if ($^O eq "MacOS") {
  	$addr = $url->encoded822addr;
      }
      else {
  	$request = $request->clone;  # we modify a copy
  	my @h = $url->headers;  # URL headers override those in the request
  	while (@h) {
  	    my $k = shift @h;
  	    my $v = shift @h;
  	    next unless defined $v;
  	    if (lc($k) eq "body") {
  		$request->content($v);
  	    }
  	    else {
  		$request->push_header($k => $v);
  	    }
  	}
      }
      if ($^O eq "MacOS") {
  	$mail->add(To => $addr);
  	$mail->add(split(/[:\n]/,$request->headers_as_string));
      }
      else {
  	print SENDMAIL $request->headers_as_string;
  	print SENDMAIL "\n";
      }
      my $content = $request->content;
      if (defined $content) {
  	my $contRef = ref($content) ? $content : \$content;
  	if (ref($contRef) eq 'SCALAR') {
  	    if ($^O eq "MacOS") {
  		@text = split("\n",$$contRef);
  		foreach (@text) {
  		    $_ .= "\n";
  		}
  	    }
  	    else {
  	    print SENDMAIL $$contRef;
  	    }
  
  	}
  	elsif (ref($contRef) eq 'CODE') {
  	    # Callback provides data
  	    my $d;
  	    if ($^O eq "MacOS") {
  		my $stuff = "";
  		while (length($d = &$contRef)) {
  		    $stuff .= $d;
  		}
  		@text = split("\n",$stuff);
  		foreach (@text) {
  		    $_ .= "\n";
  		}
  	    }
  	    else {
  		print SENDMAIL $d;
  	    }
  	}
      }
      if ($^O eq "MacOS") {
  	$mail->body(\@text);
  	unless ($mail->smtpsend) {
  	    return HTTP::Response->new(HTTP::Status::RC_INTERNAL_SERVER_ERROR,
  				       "Mail::Internet->smtpsend unable to send message to <$addr>");
  	}
      }
      else {
  	unless (close(SENDMAIL)) {
  	    my $err = $! ? "$!" : "Exit status $?";
  	    return HTTP::Response->new(HTTP::Status::RC_INTERNAL_SERVER_ERROR,
  				       "$SENDMAIL: $err");
  	}
      }
  
  
      my $response = HTTP::Response->new(HTTP::Status::RC_ACCEPTED,
  				       "Mail accepted");
      $response->header('Content-Type', 'text/plain');
      if ($^O eq "MacOS") {
  	$response->header('Server' => "Mail::Internet $Mail::Internet::VERSION");
  	$response->content("Message sent to <$addr>\n");
      }
      else {
  	$response->header('Server' => $SENDMAIL);
  	my $to = $request->header("To");
  	$response->content("Message sent to <$to>\n");
      }
  
      return $response;
  }
  
  1;
LWP_PROTOCOL_MAILTO

    $main::fatpacked{"LWP/Protocol/nntp.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LWP_PROTOCOL_NNTP';
  package LWP::Protocol::nntp;
  
  # Implementation of the Network News Transfer Protocol (RFC 977)
  
  use base qw(LWP::Protocol);
  
  our $VERSION = '6.39';
  
  require HTTP::Response;
  require HTTP::Status;
  require Net::NNTP;
  
  use strict;
  
  
  sub request {
      my ($self, $request, $proxy, $arg, $size, $timeout) = @_;
  
      $size = 4096 unless $size;
  
      # Check for proxy
      if (defined $proxy) {
          return HTTP::Response->new(HTTP::Status::RC_BAD_REQUEST,
              'You can not proxy through NNTP');
      }
  
      # Check that the scheme is as expected
      my $url    = $request->uri;
      my $scheme = $url->scheme;
      unless ($scheme eq 'news' || $scheme eq 'nntp') {
          return HTTP::Response->new(HTTP::Status::RC_INTERNAL_SERVER_ERROR,
              "LWP::Protocol::nntp::request called for '$scheme'");
      }
  
      # check for a valid method
      my $method = $request->method;
      unless ($method eq 'GET' || $method eq 'HEAD' || $method eq 'POST') {
          return HTTP::Response->new(HTTP::Status::RC_BAD_REQUEST,
              'Library does not allow method ' . "$method for '$scheme:' URLs");
      }
  
      # extract the identifier and check against posting to an article
      my $groupart = $url->_group;
      my $is_art   = $groupart =~ /@/;
  
      if ($is_art && $method eq 'POST') {
          return HTTP::Response->new(HTTP::Status::RC_BAD_REQUEST,
              "Can't post to an article <$groupart>");
      }
  
      my $nntp = Net::NNTP->new(
          $url->host,
  
          #Port    => 18574,
          Timeout => $timeout,
  
          #Debug   => 1,
      );
      die "Can't connect to nntp server" unless $nntp;
  
      # Check the initial welcome message from the NNTP server
      if ($nntp->status != 2) {
          return HTTP::Response->new(HTTP::Status::RC_SERVICE_UNAVAILABLE,
              $nntp->message);
      }
      my $response = HTTP::Response->new(HTTP::Status::RC_OK, "OK");
  
      my $mess = $nntp->message;
  
      # Try to extract server name from greeting message.
      # Don't know if this works well for a large class of servers, but
      # this works for our server.
      $mess =~ s/\s+ready\b.*//;
      $mess =~ s/^\S+\s+//;
      $response->header(Server => $mess);
  
      # First we handle posting of articles
      if ($method eq 'POST') {
          $nntp->quit;
          $nntp = undef;
          $response->code(HTTP::Status::RC_NOT_IMPLEMENTED);
          $response->message("POST not implemented yet");
          return $response;
      }
  
      # The method must be "GET" or "HEAD" by now
      if (!$is_art) {
          if (!$nntp->group($groupart)) {
              $response->code(HTTP::Status::RC_NOT_FOUND);
              $response->message($nntp->message);
          }
          $nntp->quit;
          $nntp = undef;
  
          # HEAD: just check if the group exists
          if ($method eq 'GET' && $response->is_success) {
              $response->code(HTTP::Status::RC_NOT_IMPLEMENTED);
              $response->message("GET newsgroup not implemented yet");
          }
          return $response;
      }
  
      # Send command to server to retrieve an article (or just the headers)
      my $get = $method eq 'HEAD' ? "head" : "article";
      my $art = $nntp->$get("<$groupart>");
      unless ($art) {
          $nntp->quit;
          $response->code(HTTP::Status::RC_NOT_FOUND);
          $response->message($nntp->message);
          $nntp = undef;
          return $response;
      }
  
      # Parse headers
      my ($key, $val);
      local $_;
      while ($_ = shift @$art) {
          if (/^\s+$/) {
              last;    # end of headers
          }
          elsif (/^(\S+):\s*(.*)/) {
              $response->push_header($key, $val) if $key;
              ($key, $val) = ($1, $2);
          }
          elsif (/^\s+(.*)/) {
              next unless $key;
              $val .= $1;
          }
          else {
              unshift(@$art, $_);
              last;
          }
      }
      $response->push_header($key, $val) if $key;
  
      # Ensure that there is a Content-Type header
      $response->header("Content-Type", "text/plain")
          unless $response->header("Content-Type");
  
      # Collect the body
      $response = $self->collect_once($arg, $response, join("", @$art)) if @$art;
  
      # Say goodbye to the server
      $nntp->quit;
      $nntp = undef;
  
      $response;
  }
  
  1;
LWP_PROTOCOL_NNTP

    $main::fatpacked{"LWP/Protocol/nogo.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LWP_PROTOCOL_NOGO';
  package LWP::Protocol::nogo;
  # If you want to disable access to a particular scheme, use this
  # class and then call
  #   LWP::Protocol::implementor(that_scheme, 'LWP::Protocol::nogo');
  # For then on, attempts to access URLs with that scheme will generate
  # a 500 error.
  
  use strict;
  
  our $VERSION = '6.39';
  
  require HTTP::Response;
  require HTTP::Status;
  use base qw(LWP::Protocol);
  
  sub request {
      my($self, $request) = @_;
      my $scheme = $request->uri->scheme;
  
      return HTTP::Response->new(
        HTTP::Status::RC_INTERNAL_SERVER_ERROR,
        "Access to \'$scheme\' URIs has been disabled"
      );
  }
  1;
LWP_PROTOCOL_NOGO

    $main::fatpacked{"LWP/RobotUA.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LWP_ROBOTUA';
  package LWP::RobotUA;
  
  use base qw(LWP::UserAgent);
  
  our $VERSION = '6.39';
  
  require WWW::RobotRules;
  require HTTP::Request;
  require HTTP::Response;
  
  use Carp ();
  use HTTP::Status ();
  use HTTP::Date qw(time2str);
  use strict;
  
  
  #
  # Additional attributes in addition to those found in LWP::UserAgent:
  #
  # $self->{'delay'}    Required delay between request to the same
  #                     server in minutes.
  #
  # $self->{'rules'}     A WWW::RobotRules object
  #
  
  sub new
  {
      my $class = shift;
      my %cnf;
      if (@_ < 4) {
  	# legacy args
  	@cnf{qw(agent from rules)} = @_;
      }
      else {
  	%cnf = @_;
      }
  
      Carp::croak('LWP::RobotUA agent required') unless $cnf{agent};
      Carp::croak('LWP::RobotUA from address required')
  	unless $cnf{from} && $cnf{from} =~ m/\@/;
  
      my $delay = delete $cnf{delay} || 1;
      my $use_sleep = delete $cnf{use_sleep};
      $use_sleep = 1 unless defined($use_sleep);
      my $rules = delete $cnf{rules};
  
      my $self = LWP::UserAgent->new(%cnf);
      $self = bless $self, $class;
  
      $self->{'delay'} = $delay;   # minutes
      $self->{'use_sleep'} = $use_sleep;
  
      if ($rules) {
  	$rules->agent($cnf{agent});
  	$self->{'rules'} = $rules;
      }
      else {
  	$self->{'rules'} = WWW::RobotRules->new($cnf{agent});
      }
  
      $self;
  }
  
  
  sub delay     { shift->_elem('delay',     @_); }
  sub use_sleep { shift->_elem('use_sleep', @_); }
  
  
  sub agent
  {
      my $self = shift;
      my $old = $self->SUPER::agent(@_);
      if (@_) {
  	# Changing our name means to start fresh
  	$self->{'rules'}->agent($self->{'agent'});
      }
      $old;
  }
  
  
  sub rules {
      my $self = shift;
      my $old = $self->_elem('rules', @_);
      $self->{'rules'}->agent($self->{'agent'}) if @_;
      $old;
  }
  
  
  sub no_visits
  {
      my($self, $netloc) = @_;
      $self->{'rules'}->no_visits($netloc) || 0;
  }
  
  *host_count = \&no_visits;  # backwards compatibility with LWP-5.02
  
  
  sub host_wait
  {
      my($self, $netloc) = @_;
      return undef unless defined $netloc;
      my $last = $self->{'rules'}->last_visit($netloc);
      if ($last) {
  	my $wait = int($self->{'delay'} * 60 - (time - $last));
  	$wait = 0 if $wait < 0;
  	return $wait;
      }
      return 0;
  }
  
  
  sub simple_request
  {
      my($self, $request, $arg, $size) = @_;
  
      # Do we try to access a new server?
      my $allowed = $self->{'rules'}->allowed($request->uri);
  
      if ($allowed < 0) {
  	# Host is not visited before, or robots.txt expired; fetch "robots.txt"
  	my $robot_url = $request->uri->clone;
  	$robot_url->path("robots.txt");
  	$robot_url->query(undef);
  
  	# make access to robot.txt legal since this will be a recursive call
  	$self->{'rules'}->parse($robot_url, "");
  
  	my $robot_req = HTTP::Request->new('GET', $robot_url);
  	my $parse_head = $self->parse_head(0);
  	my $robot_res = $self->request($robot_req);
  	$self->parse_head($parse_head);
  	my $fresh_until = $robot_res->fresh_until;
  	my $content = "";
  	if ($robot_res->is_success && $robot_res->content_is_text) {
  	    $content = $robot_res->decoded_content;
  	    $content = "" unless $content && $content =~ /^\s*Disallow\s*:/mi;
  	}
  	$self->{'rules'}->parse($robot_url, $content, $fresh_until);
  
  	# recalculate allowed...
  	$allowed = $self->{'rules'}->allowed($request->uri);
      }
  
      # Check rules
      unless ($allowed) {
  	my $res = HTTP::Response->new(
  	  HTTP::Status::RC_FORBIDDEN, 'Forbidden by robots.txt');
  	$res->request( $request ); # bind it to that request
  	return $res;
      }
  
      my $netloc = eval { local $SIG{__DIE__}; $request->uri->host_port; };
      my $wait = $self->host_wait($netloc);
  
      if ($wait) {
  	if ($self->{'use_sleep'}) {
  	    sleep($wait)
  	}
  	else {
  	    my $res = HTTP::Response->new(
  	      HTTP::Status::RC_SERVICE_UNAVAILABLE, 'Please, slow down');
  	    $res->header('Retry-After', time2str(time + $wait));
  	    $res->request( $request ); # bind it to that request
  	    return $res;
  	}
      }
  
      # Perform the request
      my $res = $self->SUPER::simple_request($request, $arg, $size);
  
      $self->{'rules'}->visit($netloc);
  
      $res;
  }
  
  
  sub as_string
  {
      my $self = shift;
      my @s;
      push(@s, "Robot: $self->{'agent'} operated by $self->{'from'}  [$self]");
      push(@s, "    Minimum delay: " . int($self->{'delay'}*60) . "s");
      push(@s, "    Will sleep if too early") if $self->{'use_sleep'};
      push(@s, "    Rules = $self->{'rules'}");
      join("\n", @s, '');
  }
  
  1;
  
  
  __END__
  
  =pod
  
  =head1 NAME
  
  LWP::RobotUA - a class for well-behaved Web robots
  
  =head1 SYNOPSIS
  
    use LWP::RobotUA;
    my $ua = LWP::RobotUA->new('my-robot/0.1', 'me@foo.com');
    $ua->delay(10);  # be very nice -- max one hit every ten minutes!
    ...
  
    # Then just use it just like a normal LWP::UserAgent:
    my $response = $ua->get('http://whatever.int/...');
    ...
  
  =head1 DESCRIPTION
  
  This class implements a user agent that is suitable for robot
  applications.  Robots should be nice to the servers they visit.  They
  should consult the F</robots.txt> file to ensure that they are welcomed
  and they should not make requests too frequently.
  
  But before you consider writing a robot, take a look at
  L<URL:http://www.robotstxt.org/>.
  
  When you use an I<LWP::RobotUA> object as your user agent, then you do not
  really have to think about these things yourself; C<robots.txt> files
  are automatically consulted and obeyed, the server isn't queried
  too rapidly, and so on.  Just send requests
  as you do when you are using a normal I<LWP::UserAgent>
  object (using C<< $ua->get(...) >>, C<< $ua->head(...) >>,
  C<< $ua->request(...) >>, etc.), and this
  special agent will make sure you are nice.
  
  =head1 METHODS
  
  The LWP::RobotUA is a sub-class of L<LWP::UserAgent> and implements the
  same methods. In addition the following methods are provided:
  
  =head2 new
  
      my $ua = LWP::RobotUA->new( %options )
      my $ua = LWP::RobotUA->new( $agent, $from )
      my $ua = LWP::RobotUA->new( $agent, $from, $rules )
  
  The LWP::UserAgent options C<agent> and C<from> are mandatory.  The
  options C<delay>, C<use_sleep> and C<rules> initialize attributes
  private to the RobotUA.  If C<rules> are not provided, then
  C<WWW::RobotRules> is instantiated providing an internal database of
  F<robots.txt>.
  
  It is also possible to just pass the value of C<agent>, C<from> and
  optionally C<rules> as plain positional arguments.
  
  =head2 delay
  
      my $delay = $ua->delay;
      $ua->delay( $minutes );
  
  Get/set the minimum delay between requests to the same server, in
  I<minutes>.  The default is C<1> minute.  Note that this number doesn't
  have to be an integer; for example, this sets the delay to C<10> seconds:
  
      $ua->delay(10/60);
  
  =head2 use_sleep
  
      my $bool = $ua->use_sleep;
      $ua->use_sleep( $boolean );
  
  Get/set a value indicating whether the UA should L<LWP::RobotUA/sleep> if
  requests arrive too fast, defined as C<< $ua->delay >> minutes not passed since
  last request to the given server.  The default is true.  If this value is
  false then an internal C<SERVICE_UNAVAILABLE> response will be generated.
  It will have a C<Retry-After> header that indicates when it is OK to
  send another request to this server.
  
  =head2 rules
  
      my $rules = $ua->rules;
      $ua->rules( $rules );
  
  Set/get which I<WWW::RobotRules> object to use.
  
  =head2 no_visits
  
      my $num = $ua->no_visits( $netloc )
  
  Returns the number of documents fetched from this server host. Yeah I
  know, this method should probably have been named C<num_visits> or
  something like that. :-(
  
  =head2 host_wait
  
      my $num = $ua->host_wait( $netloc )
  
  Returns the number of I<seconds> (from now) you must wait before you can
  make a new request to this host.
  
  =head2 as_string
  
      my $string = $ua->as_string;
  
  Returns a string that describes the state of the UA.
  Mainly useful for debugging.
  
  =head1 SEE ALSO
  
  L<LWP::UserAgent>, L<WWW::RobotRules>
  
  =head1 COPYRIGHT
  
  Copyright 1996-2004 Gisle Aas.
  
  This library is free software; you can redistribute it and/or
  modify it under the same terms as Perl itself.
  
  =cut
LWP_ROBOTUA

    $main::fatpacked{"LWP/Simple.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LWP_SIMPLE';
  package LWP::Simple;
  
  use strict;
  
  our $VERSION = '6.39';
  
  require Exporter;
  
  our @EXPORT = qw(get head getprint getstore mirror);
  our @EXPORT_OK = qw($ua);
  
  # I really hate this.  It was a bad idea to do it in the first place.
  # Wonder how to get rid of it???  (It even makes LWP::Simple 7% slower
  # for trivial tests)
  use HTTP::Status;
  push(@EXPORT, @HTTP::Status::EXPORT);
  
  sub import
  {
      my $pkg = shift;
      my $callpkg = caller;
      Exporter::export($pkg, $callpkg, @_);
  }
  
  use LWP::UserAgent ();
  use HTTP::Date ();
  
  our $ua = LWP::UserAgent->new;  # we create a global UserAgent object
  $ua->agent("LWP::Simple/$VERSION ");
  $ua->env_proxy;
  
  sub get ($)
  {
      my $response = $ua->get(shift);
      return $response->decoded_content if $response->is_success;
      return undef;
  }
  
  
  sub head ($)
  {
      my($url) = @_;
      my $request = HTTP::Request->new(HEAD => $url);
      my $response = $ua->request($request);
  
      if ($response->is_success) {
  	return $response unless wantarray;
  	return (scalar $response->header('Content-Type'),
  		scalar $response->header('Content-Length'),
  		HTTP::Date::str2time($response->header('Last-Modified')),
  		HTTP::Date::str2time($response->header('Expires')),
  		scalar $response->header('Server'),
  	       );
      }
      return;
  }
  
  
  sub getprint ($)
  {
      my($url) = @_;
      my $request = HTTP::Request->new(GET => $url);
      local($\) = ""; # ensure standard $OUTPUT_RECORD_SEPARATOR
      my $callback = sub { print $_[0] };
      if ($^O eq "MacOS") {
  	$callback = sub { $_[0] =~ s/\015?\012/\n/g; print $_[0] }
      }
      my $response = $ua->request($request, $callback);
      unless ($response->is_success) {
  	print STDERR $response->status_line, " <URL:$url>\n";
      }
      $response->code;
  }
  
  
  sub getstore ($$)
  {
      my($url, $file) = @_;
      my $request = HTTP::Request->new(GET => $url);
      my $response = $ua->request($request, $file);
  
      $response->code;
  }
  
  
  sub mirror ($$)
  {
      my($url, $file) = @_;
      my $response = $ua->mirror($url, $file);
      $response->code;
  }
  
  
  1;
  
  __END__
  
  =pod
  
  =head1 NAME
  
  LWP::Simple - simple procedural interface to LWP
  
  =head1 SYNOPSIS
  
   perl -MLWP::Simple -e 'getprint "http://www.sn.no"'
  
   use LWP::Simple;
   $content = get("http://www.sn.no/");
   die "Couldn't get it!" unless defined $content;
  
   if (mirror("http://www.sn.no/", "foo") == RC_NOT_MODIFIED) {
       ...
   }
  
   if (is_success(getprint("http://www.sn.no/"))) {
       ...
   }
  
  =head1 DESCRIPTION
  
  This module is meant for people who want a simplified view of the
  libwww-perl library.  It should also be suitable for one-liners.  If
  you need more control or access to the header fields in the requests
  sent and responses received, then you should use the full object-oriented
  interface provided by the L<LWP::UserAgent> module.
  
  The module will also export the L<LWP::UserAgent> object as C<$ua> if you
  ask for it explicitly.
  
  The user agent created by this module will identify itself as
  C<LWP::Simple/#.##>
  and will initialize its proxy defaults from the environment (by
  calling C<< $ua->env_proxy >>).
  
  =head1 FUNCTIONS
  
  The following functions are provided (and exported) by this module:
  
  =head2 get
  
      my $res = get($url);
  
  The get() function will fetch the document identified by the given URL
  and return it.  It returns C<undef> if it fails.  The C<$url> argument can
  be either a string or a reference to a L<URI> object.
  
  You will not be able to examine the response code or response headers
  (like C<Content-Type>) when you are accessing the web using this
  function.  If you need that information you should use the full OO
  interface (see L<LWP::UserAgent>).
  
  =head2 head
  
      my $res = head($url);
  
  Get document headers. Returns the following 5 values if successful:
  ($content_type, $document_length, $modified_time, $expires, $server)
  
  Returns an empty list if it fails.  In scalar context returns TRUE if
  successful.
  
  =head2 getprint
  
      my $code = getprint($url);
  
  Get and print a document identified by a URL. The document is printed
  to the selected default filehandle for output (normally STDOUT) as
  data is received from the network.  If the request fails, then the
  status code and message are printed on STDERR.  The return value is
  the HTTP response code.
  
  =head2 getstore
  
      my $code = getstore($url, $file)
  
  Gets a document identified by a URL and stores it in the file. The
  return value is the HTTP response code.
  
  =head2 mirror
  
      my $code = mirror($url, $file);
  
  Get and store a document identified by a URL, using
  I<If-modified-since>, and checking the I<Content-Length>.  Returns
  the HTTP response code.
  
  =head1 STATUS CONSTANTS
  
  This module also exports the L<HTTP::Status> constants and procedures.
  You can use them when you check the response code from L<LWP::Simple/getprint>,
  L<LWP::Simple/getstore> or L<LWP::Simple/mirror>.  The constants are:
  
     RC_CONTINUE
     RC_SWITCHING_PROTOCOLS
     RC_OK
     RC_CREATED
     RC_ACCEPTED
     RC_NON_AUTHORITATIVE_INFORMATION
     RC_NO_CONTENT
     RC_RESET_CONTENT
     RC_PARTIAL_CONTENT
     RC_MULTIPLE_CHOICES
     RC_MOVED_PERMANENTLY
     RC_MOVED_TEMPORARILY
     RC_SEE_OTHER
     RC_NOT_MODIFIED
     RC_USE_PROXY
     RC_BAD_REQUEST
     RC_UNAUTHORIZED
     RC_PAYMENT_REQUIRED
     RC_FORBIDDEN
     RC_NOT_FOUND
     RC_METHOD_NOT_ALLOWED
     RC_NOT_ACCEPTABLE
     RC_PROXY_AUTHENTICATION_REQUIRED
     RC_REQUEST_TIMEOUT
     RC_CONFLICT
     RC_GONE
     RC_LENGTH_REQUIRED
     RC_PRECONDITION_FAILED
     RC_REQUEST_ENTITY_TOO_LARGE
     RC_REQUEST_URI_TOO_LARGE
     RC_UNSUPPORTED_MEDIA_TYPE
     RC_INTERNAL_SERVER_ERROR
     RC_NOT_IMPLEMENTED
     RC_BAD_GATEWAY
     RC_SERVICE_UNAVAILABLE
     RC_GATEWAY_TIMEOUT
     RC_HTTP_VERSION_NOT_SUPPORTED
  
  =head1 CLASSIFICATION FUNCTIONS
  
  The L<HTTP::Status> classification functions are:
  
  =head2 is_success
  
      my $bool = is_success($rc);
  
  True if response code indicated a successful request.
  
  =head2 is_error
  
      my $bool = is_error($rc)
  
  True if response code indicated that an error occurred.
  
  =head1 CAVEAT
  
  Note that if you are using both LWP::Simple and the very popular L<CGI>
  module, you may be importing a C<head> function from each module,
  producing a warning like C<Prototype mismatch: sub main::head ($) vs none>.
  Get around this problem by just not importing LWP::Simple's
  C<head> function, like so:
  
          use LWP::Simple qw(!head);
          use CGI qw(:standard);  # then only CGI.pm defines a head()
  
  Then if you do need LWP::Simple's C<head> function, you can just call
  it as C<LWP::Simple::head($url)>.
  
  =head1 SEE ALSO
  
  L<LWP>, L<lwpcook>, L<LWP::UserAgent>, L<HTTP::Status>, L<lwp-request>,
  L<lwp-mirror>
  
  =cut
LWP_SIMPLE

    $main::fatpacked{"LWP/UserAgent.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LWP_USERAGENT';
  package LWP::UserAgent;
  
  use strict;
  
  use base qw(LWP::MemberMixin);
  
  use Carp ();
  use HTTP::Request ();
  use HTTP::Response ();
  use HTTP::Date ();
  
  use LWP ();
  use LWP::Protocol ();
  
  use Scalar::Util qw(blessed);
  use Try::Tiny qw(try catch);
  
  our $VERSION = '6.39';
  
  sub new
  {
      # Check for common user mistake
      Carp::croak("Options to LWP::UserAgent should be key/value pairs, not hash reference")
          if ref($_[1]) eq 'HASH';
  
      my($class, %cnf) = @_;
  
      my $agent = delete $cnf{agent};
      my $from  = delete $cnf{from};
      my $def_headers = delete $cnf{default_headers};
      my $timeout = delete $cnf{timeout};
      $timeout = 3*60 unless defined $timeout;
      my $local_address = delete $cnf{local_address};
      my $ssl_opts = delete $cnf{ssl_opts} || {};
      unless (exists $ssl_opts->{verify_hostname}) {
  	# The processing of HTTPS_CA_* below is for compatibility with Crypt::SSLeay
  	if (exists $ENV{PERL_LWP_SSL_VERIFY_HOSTNAME}) {
  	    $ssl_opts->{verify_hostname} = $ENV{PERL_LWP_SSL_VERIFY_HOSTNAME};
  	}
  	elsif ($ENV{HTTPS_CA_FILE} || $ENV{HTTPS_CA_DIR}) {
  	    # Crypt-SSLeay compatibility (verify peer certificate; but not the hostname)
  	    $ssl_opts->{verify_hostname} = 0;
  	    $ssl_opts->{SSL_verify_mode} = 1;
  	}
  	else {
  	    $ssl_opts->{verify_hostname} = 1;
  	}
      }
      unless (exists $ssl_opts->{SSL_ca_file}) {
  	if (my $ca_file = $ENV{PERL_LWP_SSL_CA_FILE} || $ENV{HTTPS_CA_FILE}) {
  	    $ssl_opts->{SSL_ca_file} = $ca_file;
  	}
      }
      unless (exists $ssl_opts->{SSL_ca_path}) {
  	if (my $ca_path = $ENV{PERL_LWP_SSL_CA_PATH} || $ENV{HTTPS_CA_DIR}) {
  	    $ssl_opts->{SSL_ca_path} = $ca_path;
  	}
      }
      my $use_eval = delete $cnf{use_eval};
      $use_eval = 1 unless defined $use_eval;
      my $parse_head = delete $cnf{parse_head};
      $parse_head = 1 unless defined $parse_head;
      my $send_te = delete $cnf{send_te};
      $send_te = 1 unless defined $send_te;
      my $show_progress = delete $cnf{show_progress};
      my $max_size = delete $cnf{max_size};
      my $max_redirect = delete $cnf{max_redirect};
      $max_redirect = 7 unless defined $max_redirect;
      my $env_proxy = exists $cnf{env_proxy} ? delete $cnf{env_proxy} : $ENV{PERL_LWP_ENV_PROXY};
      my $no_proxy = exists $cnf{no_proxy} ? delete $cnf{no_proxy} : [];
      Carp::croak(qq{no_proxy must be an arrayref, not $no_proxy!}) if ref $no_proxy ne 'ARRAY';
  
      my $cookie_jar = delete $cnf{cookie_jar};
      my $conn_cache = delete $cnf{conn_cache};
      my $keep_alive = delete $cnf{keep_alive};
  
      Carp::croak("Can't mix conn_cache and keep_alive")
  	  if $conn_cache && $keep_alive;
  
      my $protocols_allowed   = delete $cnf{protocols_allowed};
      my $protocols_forbidden = delete $cnf{protocols_forbidden};
  
      my $requests_redirectable = delete $cnf{requests_redirectable};
      $requests_redirectable = ['GET', 'HEAD']
        unless defined $requests_redirectable;
  
      # Actually ""s are just as good as 0's, but for concision we'll just say:
      Carp::croak("protocols_allowed has to be an arrayref or 0, not \"$protocols_allowed\"!")
        if $protocols_allowed and ref($protocols_allowed) ne 'ARRAY';
      Carp::croak("protocols_forbidden has to be an arrayref or 0, not \"$protocols_forbidden\"!")
        if $protocols_forbidden and ref($protocols_forbidden) ne 'ARRAY';
      Carp::croak("requests_redirectable has to be an arrayref or 0, not \"$requests_redirectable\"!")
        if $requests_redirectable and ref($requests_redirectable) ne 'ARRAY';
  
      if (%cnf && $^W) {
  	Carp::carp("Unrecognized LWP::UserAgent options: @{[sort keys %cnf]}");
      }
  
      my $self = bless {
          def_headers           => $def_headers,
          timeout               => $timeout,
          local_address         => $local_address,
          ssl_opts              => $ssl_opts,
          use_eval              => $use_eval,
          show_progress         => $show_progress,
          max_size              => $max_size,
          max_redirect          => $max_redirect,
          # We set proxy later as we do validation on the values
          proxy                 => {},
          no_proxy              => [ @{ $no_proxy } ],
          protocols_allowed     => $protocols_allowed,
          protocols_forbidden   => $protocols_forbidden,
          requests_redirectable => $requests_redirectable,
          send_te               => $send_te,
      }, $class;
  
      $self->agent(defined($agent) ? $agent : $class->_agent)
          if defined($agent) || !$def_headers || !$def_headers->header("User-Agent");
      $self->from($from) if $from;
      $self->cookie_jar($cookie_jar) if $cookie_jar;
      $self->parse_head($parse_head);
      $self->env_proxy if $env_proxy;
  
      if (exists $cnf{proxy}) {
          Carp::croak(qq{proxy must be an arrayref, not $cnf{proxy}!})
              if ref $cnf{proxy} ne 'ARRAY';
          $self->proxy($cnf{proxy});
      }
  
      $self->protocols_allowed(  $protocols_allowed  ) if $protocols_allowed;
      $self->protocols_forbidden($protocols_forbidden) if $protocols_forbidden;
  
      if ($keep_alive) {
  	$conn_cache ||= { total_capacity => $keep_alive };
      }
      $self->conn_cache($conn_cache) if $conn_cache;
  
      return $self;
  }
  
  
  sub send_request
  {
      my($self, $request, $arg, $size) = @_;
      my($method, $url) = ($request->method, $request->uri);
      my $scheme = $url->scheme;
  
      local($SIG{__DIE__});  # protect against user defined die handlers
  
      $self->progress("begin", $request);
  
      my $response = $self->run_handlers("request_send", $request);
  
      unless ($response) {
          my $protocol;
  
          {
              # Honor object-specific restrictions by forcing protocol objects
              #  into class LWP::Protocol::nogo.
              my $x;
              if($x = $self->protocols_allowed) {
                  if (grep lc($_) eq $scheme, @$x) {
                  }
                  else {
                      require LWP::Protocol::nogo;
                      $protocol = LWP::Protocol::nogo->new;
                  }
              }
              elsif ($x = $self->protocols_forbidden) {
                  if(grep lc($_) eq $scheme, @$x) {
                      require LWP::Protocol::nogo;
                      $protocol = LWP::Protocol::nogo->new;
                  }
              }
              # else fall thru and create the protocol object normally
          }
  
          # Locate protocol to use
          my $proxy = $request->{proxy};
          if ($proxy) {
              $scheme = $proxy->scheme;
          }
  
          unless ($protocol) {
              try {
                  $protocol = LWP::Protocol::create($scheme, $self);
              }
              catch {
                  my $error = $_;
                  $error =~ s/ at .* line \d+.*//s;  # remove file/line number
                  $response =  _new_response($request, HTTP::Status::RC_NOT_IMPLEMENTED, $error);
                  if ($scheme eq "https") {
                      $response->message($response->message . " (LWP::Protocol::https not installed)");
                      $response->content_type("text/plain");
                      $response->content(<<EOT);
  LWP will support https URLs if the LWP::Protocol::https module
  is installed.
  EOT
                  }
              };
          }
  
          if (!$response && $self->{use_eval}) {
              # we eval, and turn dies into responses below
              try {
                  $response = $protocol->request($request, $proxy, $arg, $size, $self->{timeout}) || die "No response returned by $protocol";
              }
              catch {
                  my $error = $_;
                  if (blessed($error) && $error->isa("HTTP::Response")) {
                      $response = $error;
                      $response->request($request);
                  }
                  else {
                      my $full = $error;
                      (my $status = $error) =~ s/\n.*//s;
                      $status =~ s/ at .* line \d+.*//s;  # remove file/line number
                      my $code = ($status =~ s/^(\d\d\d)\s+//) ? $1 : HTTP::Status::RC_INTERNAL_SERVER_ERROR;
                      $response = _new_response($request, $code, $status, $full);
                  }
              };
          }
          elsif (!$response) {
              $response = $protocol->request($request, $proxy,
                                             $arg, $size, $self->{timeout});
              # XXX: Should we die unless $response->is_success ???
          }
      }
  
      $response->request($request);  # record request for reference
      $response->header("Client-Date" => HTTP::Date::time2str(time));
  
      $self->run_handlers("response_done", $response);
  
      $self->progress("end", $response);
      return $response;
  }
  
  
  sub prepare_request
  {
      my($self, $request) = @_;
      die "Method missing" unless $request->method;
      my $url = $request->uri;
      die "URL missing" unless $url;
      die "URL must be absolute" unless $url->scheme;
  
      $self->run_handlers("request_preprepare", $request);
  
      if (my $def_headers = $self->{def_headers}) {
  	for my $h ($def_headers->header_field_names) {
  	    $request->init_header($h => [$def_headers->header($h)]);
  	}
      }
  
      $self->run_handlers("request_prepare", $request);
  
      return $request;
  }
  
  
  sub simple_request
  {
      my($self, $request, $arg, $size) = @_;
  
      # sanity check the request passed in
      if (defined $request) {
  	if (ref $request) {
  	    Carp::croak("You need a request object, not a " . ref($request) . " object")
  	      if ref($request) eq 'ARRAY' or ref($request) eq 'HASH' or
  		 !$request->can('method') or !$request->can('uri');
  	}
  	else {
  	    Carp::croak("You need a request object, not '$request'");
  	}
      }
      else {
          Carp::croak("No request object passed in");
      }
  
      my $error;
      try {
          $request = $self->prepare_request($request);
      }
      catch {
          $error = $_;
          $error =~ s/ at .* line \d+.*//s;  # remove file/line number
      };
  
      if ($error) {
          return _new_response($request, HTTP::Status::RC_BAD_REQUEST, $error);
      }
      return $self->send_request($request, $arg, $size);
  }
  
  
  sub request {
      my ($self, $request, $arg, $size, $previous) = @_;
  
      my $response = $self->simple_request($request, $arg, $size);
      $response->previous($previous) if $previous;
  
      if ($response->redirects >= $self->{max_redirect}) {
          $response->header("Client-Warning" =>
                  "Redirect loop detected (max_redirect = $self->{max_redirect})"
          );
          return $response;
      }
  
      if (my $req = $self->run_handlers("response_redirect", $response)) {
          return $self->request($req, $arg, $size, $response);
      }
  
      my $code = $response->code;
  
      if (   $code == HTTP::Status::RC_MOVED_PERMANENTLY
          or $code == HTTP::Status::RC_FOUND
          or $code == HTTP::Status::RC_SEE_OTHER
          or $code == HTTP::Status::RC_TEMPORARY_REDIRECT)
      {
          my $referral = $request->clone;
  
          # These headers should never be forwarded
          $referral->remove_header('Host', 'Cookie');
  
          if (   $referral->header('Referer')
              && $request->uri->scheme eq 'https'
              && $referral->uri->scheme eq 'http')
          {
              # RFC 2616, section 15.1.3.
              # https -> http redirect, suppressing Referer
              $referral->remove_header('Referer');
          }
  
          if (   $code == HTTP::Status::RC_SEE_OTHER
              || $code == HTTP::Status::RC_FOUND)
          {
              my $method = uc($referral->method);
              unless ($method eq "GET" || $method eq "HEAD") {
                  $referral->method("GET");
                  $referral->content("");
                  $referral->remove_content_headers;
              }
          }
  
          # And then we update the URL based on the Location:-header.
          my $referral_uri = $response->header('Location');
          {
              # Some servers erroneously return a relative URL for redirects,
              # so make it absolute if it not already is.
              local $URI::ABS_ALLOW_RELATIVE_SCHEME = 1;
              my $base = $response->base;
              $referral_uri = "" unless defined $referral_uri;
              $referral_uri
                  = $HTTP::URI_CLASS->new($referral_uri, $base)->abs($base);
          }
          $referral->uri($referral_uri);
  
          return $response unless $self->redirect_ok($referral, $response);
          return $self->request($referral, $arg, $size, $response);
  
      }
      elsif ($code == HTTP::Status::RC_UNAUTHORIZED
          || $code == HTTP::Status::RC_PROXY_AUTHENTICATION_REQUIRED)
      {
          my $proxy = ($code == HTTP::Status::RC_PROXY_AUTHENTICATION_REQUIRED);
          my $ch_header
              = $proxy || $request->method eq 'CONNECT'
              ? "Proxy-Authenticate"
              : "WWW-Authenticate";
          my @challenges = $response->header($ch_header);
          unless (@challenges) {
              $response->header(
                  "Client-Warning" => "Missing Authenticate header");
              return $response;
          }
  
          require HTTP::Headers::Util;
          CHALLENGE: for my $challenge (@challenges) {
              $challenge =~ tr/,/;/;    # "," is used to separate auth-params!!
              ($challenge) = HTTP::Headers::Util::split_header_words($challenge);
              my $scheme = shift(@$challenge);
              shift(@$challenge);       # no value
              $challenge = {@$challenge};    # make rest into a hash
  
              unless ($scheme =~ /^([a-z]+(?:-[a-z]+)*)$/) {
                  $response->header(
                      "Client-Warning" => "Bad authentication scheme '$scheme'");
                  return $response;
              }
              $scheme = $1;                  # untainted now
              my $class = "LWP::Authen::\u$scheme";
              $class =~ tr/-/_/;
  
              no strict 'refs';
              unless (%{"$class\::"}) {
                  # try to load it
                  my $error;
                  try {
                      (my $req = $class) =~ s{::}{/}g;
                      $req .= '.pm' unless $req =~ /\.pm$/;
                      require $req;
                  }
                  catch {
                      $error = $_;
                  };
                  if ($error) {
                      if ($error =~ /^Can\'t locate/) {
                          $response->header("Client-Warning" =>
                                  "Unsupported authentication scheme '$scheme'");
                      }
                      else {
                          $response->header("Client-Warning" => $error);
                      }
                      next CHALLENGE;
                  }
              }
              unless ($class->can("authenticate")) {
                  $response->header("Client-Warning" =>
                          "Unsupported authentication scheme '$scheme'");
                  next CHALLENGE;
              }
              return $class->authenticate($self, $proxy, $challenge, $response,
                  $request, $arg, $size);
          }
          return $response;
      }
      return $response;
  }
  
  #
  # Now the shortcuts...
  #
  sub get {
      require HTTP::Request::Common;
      my($self, @parameters) = @_;
      my @suff = $self->_process_colonic_headers(\@parameters,1);
      return $self->request( HTTP::Request::Common::GET( @parameters ), @suff );
  }
  
  sub _has_raw_content {
      my $self = shift;
      shift; # drop url
  
      # taken from HTTP::Request::Common::request_type_with_data
      my $content;
      $content = shift if @_ and ref $_[0];
      my($k, $v);
      while (($k,$v) = splice(@_, 0, 2)) {
          if (lc($k) eq 'content') {
              $content = $v;
          }
      }
  
      # We were given Content => 'string' ...
      if (defined $content && ! ref ($content)) {
          return 1;
      }
  
      return;
  }
  
  sub _maybe_copy_default_content_type {
      my ($self, $req, @parameters) = @_;
  
      # If we have a default Content-Type and someone passes in a POST/PUT
      # with Content => 'some-string-value', use that Content-Type instead
      # of x-www-form-urlencoded
      my $ct = $self->default_header('Content-Type');
      return unless defined $ct && $self->_has_raw_content(@parameters);
  
      $req->header('Content-Type' => $ct);
  }
  
  sub post {
      require HTTP::Request::Common;
      my($self, @parameters) = @_;
      my @suff = $self->_process_colonic_headers(\@parameters, (ref($parameters[1]) ? 2 : 1));
      my $req = HTTP::Request::Common::POST(@parameters);
      $self->_maybe_copy_default_content_type($req, @parameters);
      return $self->request($req, @suff);
  }
  
  
  sub head {
      require HTTP::Request::Common;
      my($self, @parameters) = @_;
      my @suff = $self->_process_colonic_headers(\@parameters,1);
      return $self->request( HTTP::Request::Common::HEAD( @parameters ), @suff );
  }
  
  
  sub put {
      require HTTP::Request::Common;
      my($self, @parameters) = @_;
      my @suff = $self->_process_colonic_headers(\@parameters, (ref($parameters[1]) ? 2 : 1));
      my $req = HTTP::Request::Common::PUT(@parameters);
      $self->_maybe_copy_default_content_type($req, @parameters);
      return $self->request($req, @suff);
  }
  
  
  sub delete {
      require HTTP::Request::Common;
      my($self, @parameters) = @_;
      my @suff = $self->_process_colonic_headers(\@parameters,1);
      return $self->request( HTTP::Request::Common::DELETE( @parameters ), @suff );
  }
  
  
  sub _process_colonic_headers {
      # Process :content_cb / :content_file / :read_size_hint headers.
      my($self, $args, $start_index) = @_;
  
      my($arg, $size);
      for(my $i = $start_index; $i < @$args; $i += 2) {
  	next unless defined $args->[$i];
  
  	#printf "Considering %s => %s\n", $args->[$i], $args->[$i + 1];
  
  	if($args->[$i] eq ':content_cb') {
  	    # Some sanity-checking...
  	    $arg = $args->[$i + 1];
  	    Carp::croak("A :content_cb value can't be undef") unless defined $arg;
  	    Carp::croak("A :content_cb value must be a coderef")
  		unless ref $arg and UNIVERSAL::isa($arg, 'CODE');
  
  	}
  	elsif ($args->[$i] eq ':content_file') {
  	    $arg = $args->[$i + 1];
  
  	    # Some sanity-checking...
  	    Carp::croak("A :content_file value can't be undef")
  		unless defined $arg;
  	    Carp::croak("A :content_file value can't be a reference")
  		if ref $arg;
  	    Carp::croak("A :content_file value can't be \"\"")
  		unless length $arg;
  
  	}
  	elsif ($args->[$i] eq ':read_size_hint') {
  	    $size = $args->[$i + 1];
  	    # Bother checking it?
  
  	}
  	else {
  	    next;
  	}
  	splice @$args, $i, 2;
  	$i -= 2;
      }
  
      # And return a suitable suffix-list for request(REQ,...)
  
      return             unless defined $arg;
      return $arg, $size if     defined $size;
      return $arg;
  }
  
  
  sub is_online {
      my $self = shift;
      return 1 if $self->get("http://www.msftncsi.com/ncsi.txt")->content eq "Microsoft NCSI";
      return 1 if $self->get("http://www.apple.com")->content =~ m,<title>Apple</title>,;
      return 0;
  }
  
  
  my @ANI = qw(- \ | /);
  
  sub progress {
      my($self, $status, $m) = @_;
      return unless $self->{show_progress};
  
      local($,, $\);
      if ($status eq "begin") {
          print STDERR "** ", $m->method, " ", $m->uri, " ==> ";
          $self->{progress_start} = time;
          $self->{progress_lastp} = "";
          $self->{progress_ani} = 0;
      }
      elsif ($status eq "end") {
          delete $self->{progress_lastp};
          delete $self->{progress_ani};
          print STDERR $m->status_line;
          my $t = time - delete $self->{progress_start};
          print STDERR " (${t}s)" if $t;
          print STDERR "\n";
      }
      elsif ($status eq "tick") {
          print STDERR "$ANI[$self->{progress_ani}++]\b";
          $self->{progress_ani} %= @ANI;
      }
      else {
          my $p = sprintf "%3.0f%%", $status * 100;
          return if $p eq $self->{progress_lastp};
          print STDERR "$p\b\b\b\b";
          $self->{progress_lastp} = $p;
      }
      STDERR->flush;
  }
  
  
  #
  # This whole allow/forbid thing is based on man 1 at's way of doing things.
  #
  sub is_protocol_supported
  {
      my($self, $scheme) = @_;
      if (ref $scheme) {
  	# assume we got a reference to an URI object
  	$scheme = $scheme->scheme;
      }
      else {
  	Carp::croak("Illegal scheme '$scheme' passed to is_protocol_supported")
  	    if $scheme =~ /\W/;
  	$scheme = lc $scheme;
      }
  
      my $x;
      if(ref($self) and $x       = $self->protocols_allowed) {
        return 0 unless grep lc($_) eq $scheme, @$x;
      }
      elsif (ref($self) and $x = $self->protocols_forbidden) {
        return 0 if grep lc($_) eq $scheme, @$x;
      }
  
      local($SIG{__DIE__});  # protect against user defined die handlers
      $x = LWP::Protocol::implementor($scheme);
      return 1 if $x and $x ne 'LWP::Protocol::nogo';
      return 0;
  }
  
  
  sub protocols_allowed      { shift->_elem('protocols_allowed'    , @_) }
  sub protocols_forbidden    { shift->_elem('protocols_forbidden'  , @_) }
  sub requests_redirectable  { shift->_elem('requests_redirectable', @_) }
  
  
  sub redirect_ok
  {
      # RFC 2616, section 10.3.2 and 10.3.3 say:
      #  If the 30[12] status code is received in response to a request other
      #  than GET or HEAD, the user agent MUST NOT automatically redirect the
      #  request unless it can be confirmed by the user, since this might
      #  change the conditions under which the request was issued.
  
      # Note that this routine used to be just:
      #  return 0 if $_[1]->method eq "POST";  return 1;
  
      my($self, $new_request, $response) = @_;
      my $method = $response->request->method;
      return 0 unless grep $_ eq $method,
        @{ $self->requests_redirectable || [] };
  
      if ($new_request->uri->scheme eq 'file') {
        $response->header("Client-Warning" =>
  			"Can't redirect to a file:// URL!");
        return 0;
      }
  
      # Otherwise it's apparently okay...
      return 1;
  }
  
  sub credentials {
      my $self   = shift;
      my $netloc = lc(shift || '');
      my $realm  = shift || "";
      my $old    = $self->{basic_authentication}{$netloc}{$realm};
      if (@_) {
          $self->{basic_authentication}{$netloc}{$realm} = [@_];
      }
      return unless $old;
      return @$old if wantarray;
      return join(":", @$old);
  }
  
  sub get_basic_credentials
  {
      my($self, $realm, $uri, $proxy) = @_;
      return if $proxy;
      return $self->credentials($uri->host_port, $realm);
  }
  
  
  sub timeout      { shift->_elem('timeout',      @_); }
  sub local_address{ shift->_elem('local_address',@_); }
  sub max_size     { shift->_elem('max_size',     @_); }
  sub max_redirect { shift->_elem('max_redirect', @_); }
  sub show_progress{ shift->_elem('show_progress', @_); }
  sub send_te      { shift->_elem('send_te',      @_); }
  
  sub ssl_opts {
      my $self = shift;
      if (@_ == 1) {
  	my $k = shift;
  	return $self->{ssl_opts}{$k};
      }
      if (@_) {
  	my $old;
  	while (@_) {
  	    my($k, $v) = splice(@_, 0, 2);
  	    $old = $self->{ssl_opts}{$k} unless @_;
  	    if (defined $v) {
  		$self->{ssl_opts}{$k} = $v;
  	    }
  	    else {
  		delete $self->{ssl_opts}{$k};
  	    }
  	}
  	%{$self->{ssl_opts}} = (%{$self->{ssl_opts}}, @_);
  	return $old;
      }
  
      return keys %{$self->{ssl_opts}};
  }
  
  sub parse_head {
      my $self = shift;
      if (@_) {
          my $flag = shift;
          my $parser;
          my $old = $self->set_my_handler("response_header", $flag ? sub {
                 my($response, $ua) = @_;
                 require HTML::HeadParser;
                 $parser = HTML::HeadParser->new;
                 $parser->xml_mode(1) if $response->content_is_xhtml;
                 $parser->utf8_mode(1) if $] >= 5.008 && $HTML::Parser::VERSION >= 3.40;
  
                 push(@{$response->{handlers}{response_data}}, {
  		   callback => sub {
  		       return unless $parser;
  		       unless ($parser->parse($_[3])) {
  			   my $h = $parser->header;
  			   my $r = $_[0];
  			   for my $f ($h->header_field_names) {
  			       $r->init_header($f, [$h->header($f)]);
  			   }
  			   undef($parser);
  		       }
  		   },
  	       });
  
              } : undef,
              m_media_type => "html",
          );
          return !!$old;
      }
      else {
          return !!$self->get_my_handler("response_header");
      }
  }
  
  sub cookie_jar {
      my $self = shift;
      my $old = $self->{cookie_jar};
      if (@_) {
  	my $jar = shift;
  	if (ref($jar) eq "HASH") {
  	    require HTTP::Cookies;
  	    $jar = HTTP::Cookies->new(%$jar);
  	}
  	$self->{cookie_jar} = $jar;
          $self->set_my_handler("request_prepare",
              $jar ? sub { $jar->add_cookie_header($_[0]); } : undef,
          );
          $self->set_my_handler("response_done",
              $jar ? sub { $jar->extract_cookies($_[0]); } : undef,
          );
      }
      $old;
  }
  
  sub default_headers {
      my $self = shift;
      my $old = $self->{def_headers} ||= HTTP::Headers->new;
      if (@_) {
  	Carp::croak("default_headers not set to HTTP::Headers compatible object")
  	    unless @_ == 1 && $_[0]->can("header_field_names");
  	$self->{def_headers} = shift;
      }
      return $old;
  }
  
  sub default_header {
      my $self = shift;
      return $self->default_headers->header(@_);
  }
  
  sub _agent { "libwww-perl/$VERSION" }
  
  sub agent {
      my $self = shift;
      if (@_) {
  	my $agent = shift;
          if ($agent) {
              $agent .= $self->_agent if $agent =~ /\s+$/;
          }
          else {
              undef($agent)
          }
          return $self->default_header("User-Agent", $agent);
      }
      return $self->default_header("User-Agent");
  }
  
  sub from {  # legacy
      my $self = shift;
      return $self->default_header("From", @_);
  }
  
  
  sub conn_cache {
      my $self = shift;
      my $old = $self->{conn_cache};
      if (@_) {
  	my $cache = shift;
  	if (ref($cache) eq "HASH") {
  	    require LWP::ConnCache;
  	    $cache = LWP::ConnCache->new(%$cache);
  	}
  	$self->{conn_cache} = $cache;
      }
      $old;
  }
  
  
  sub add_handler {
      my($self, $phase, $cb, %spec) = @_;
      $spec{line} ||= join(":", (caller)[1,2]);
      my $conf = $self->{handlers}{$phase} ||= do {
          require HTTP::Config;
          HTTP::Config->new;
      };
      $conf->add(%spec, callback => $cb);
  }
  
  sub set_my_handler {
      my($self, $phase, $cb, %spec) = @_;
      $spec{owner} = (caller(1))[3] unless exists $spec{owner};
      $self->remove_handler($phase, %spec);
      $spec{line} ||= join(":", (caller)[1,2]);
      $self->add_handler($phase, $cb, %spec) if $cb;
  }
  
  sub get_my_handler {
      my $self = shift;
      my $phase = shift;
      my $init = pop if @_ % 2;
      my %spec = @_;
      my $conf = $self->{handlers}{$phase};
      unless ($conf) {
          return unless $init;
          require HTTP::Config;
          $conf = $self->{handlers}{$phase} = HTTP::Config->new;
      }
      $spec{owner} = (caller(1))[3] unless exists $spec{owner};
      my @h = $conf->find(%spec);
      if (!@h && $init) {
          if (ref($init) eq "CODE") {
              $init->(\%spec);
          }
          elsif (ref($init) eq "HASH") {
              while (my($k, $v) = each %$init) {
                  $spec{$k} = $v;
              }
          }
          $spec{callback} ||= sub {};
          $spec{line} ||= join(":", (caller)[1,2]);
          $conf->add(\%spec);
          return \%spec;
      }
      return wantarray ? @h : $h[0];
  }
  
  sub remove_handler {
      my($self, $phase, %spec) = @_;
      if ($phase) {
          my $conf = $self->{handlers}{$phase} || return;
          my @h = $conf->remove(%spec);
          delete $self->{handlers}{$phase} if $conf->empty;
          return @h;
      }
  
      return unless $self->{handlers};
      return map $self->remove_handler($_), sort keys %{$self->{handlers}};
  }
  
  sub handlers {
      my($self, $phase, $o) = @_;
      my @h;
      if ($o->{handlers} && $o->{handlers}{$phase}) {
          push(@h, @{$o->{handlers}{$phase}});
      }
      if (my $conf = $self->{handlers}{$phase}) {
          push(@h, $conf->matching($o));
      }
      return @h;
  }
  
  sub run_handlers {
      my($self, $phase, $o) = @_;
  
      # here we pass $_[2] to the callbacks, instead of $o, so that they
      # can assign to it; e.g. request_prepare is documented to allow
      # that
      if (defined(wantarray)) {
          for my $h ($self->handlers($phase, $o)) {
              my $ret = $h->{callback}->($_[2], $self, $h);
              return $ret if $ret;
          }
          return undef;
      }
  
      for my $h ($self->handlers($phase, $o)) {
          $h->{callback}->($_[2], $self, $h);
      }
  }
  
  
  # deprecated
  sub use_eval   { shift->_elem('use_eval',  @_); }
  sub use_alarm
  {
      Carp::carp("LWP::UserAgent->use_alarm(BOOL) is a no-op")
  	if @_ > 1 && $^W;
      "";
  }
  
  
  sub clone
  {
      my $self = shift;
      my $copy = bless { %$self }, ref $self;  # copy most fields
  
      delete $copy->{handlers};
      delete $copy->{conn_cache};
  
      # copy any plain arrays and hashes; known not to need recursive copy
      for my $k (qw(proxy no_proxy requests_redirectable ssl_opts)) {
          next unless $copy->{$k};
          if (ref($copy->{$k}) eq "ARRAY") {
              $copy->{$k} = [ @{$copy->{$k}} ];
          }
          elsif (ref($copy->{$k}) eq "HASH") {
              $copy->{$k} = { %{$copy->{$k}} };
          }
      }
  
      if ($self->{def_headers}) {
          $copy->{def_headers} = $self->{def_headers}->clone;
      }
  
      # re-enable standard handlers
      $copy->parse_head($self->parse_head);
  
      # no easy way to clone the cookie jar; so let's just remove it for now
      $copy->cookie_jar(undef);
  
      $copy;
  }
  
  
  sub mirror
  {
      my($self, $url, $file) = @_;
  
      my $request = HTTP::Request->new('GET', $url);
  
      # If the file exists, add a cache-related header
      if ( -e $file ) {
          my ($mtime) = ( stat($file) )[9];
          if ($mtime) {
              $request->header( 'If-Modified-Since' => HTTP::Date::time2str($mtime) );
          }
      }
      my $tmpfile = "$file-$$";
  
      my $response = $self->request($request, $tmpfile);
      if ( $response->header('X-Died') ) {
  	die $response->header('X-Died');
      }
  
      # Only fetching a fresh copy of the would be considered success.
      # If the file was not modified, "304" would returned, which
      # is considered by HTTP::Status to be a "redirect", /not/ "success"
      if ( $response->is_success ) {
          my @stat        = stat($tmpfile) or die "Could not stat tmpfile '$tmpfile': $!";
          my $file_length = $stat[7];
          my ($content_length) = $response->header('Content-length');
  
          if ( defined $content_length and $file_length < $content_length ) {
              unlink($tmpfile);
              die "Transfer truncated: " . "only $file_length out of $content_length bytes received\n";
          }
          elsif ( defined $content_length and $file_length > $content_length ) {
              unlink($tmpfile);
              die "Content-length mismatch: " . "expected $content_length bytes, got $file_length\n";
          }
          # The file was the expected length.
          else {
              # Replace the stale file with a fresh copy
              if ( -e $file ) {
                  # Some DOSish systems fail to rename if the target exists
                  chmod 0777, $file;
                  unlink $file;
              }
              rename( $tmpfile, $file )
                  or die "Cannot rename '$tmpfile' to '$file': $!\n";
  
              # make sure the file has the same last modification time
              if ( my $lm = $response->last_modified ) {
                  utime $lm, $lm, $file;
              }
          }
      }
      # The local copy is fresh enough, so just delete the temp file
      else {
  	unlink($tmpfile);
      }
      return $response;
  }
  
  
  sub _need_proxy {
      my($req, $ua) = @_;
      return if exists $req->{proxy};
      my $proxy = $ua->{proxy}{$req->uri->scheme} || return;
      if ($ua->{no_proxy}) {
          if (my $host = eval { $req->uri->host }) {
              for my $domain (@{$ua->{no_proxy}}) {
                  if ($host =~ /\Q$domain\E$/) {
                      return;
                  }
              }
          }
      }
      $req->{proxy} = $HTTP::URI_CLASS->new($proxy);
  }
  
  
  sub proxy {
      my $self = shift;
      my $key  = shift;
      if (!@_ && ref $key eq 'ARRAY') {
          die 'odd number of items in proxy arrayref!' unless @{$key} % 2 == 0;
  
          # This map reads the elements of $key 2 at a time
          return
              map { $self->proxy($key->[2 * $_], $key->[2 * $_ + 1]) }
              (0 .. @{$key} / 2 - 1);
      }
      return map { $self->proxy($_, @_) } @$key if ref $key;
  
      Carp::croak("'$key' is not a valid URI scheme") unless $key =~ /^$URI::scheme_re\z/;
      my $old = $self->{'proxy'}{$key};
      if (@_) {
          my $url = shift;
          if (defined($url) && length($url)) {
              Carp::croak("Proxy must be specified as absolute URI; '$url' is not") unless $url =~ /^$URI::scheme_re:/;
              Carp::croak("Bad http proxy specification '$url'") if $url =~ /^https?:/ && $url !~ m,^https?://[\w[],;
          }
          $self->{proxy}{$key} = $url;
          $self->set_my_handler("request_preprepare", \&_need_proxy)
      }
      return $old;
  }
  
  
  sub env_proxy {
      my ($self) = @_;
      require Encode;
      require Encode::Locale;
      my($k,$v);
      while(($k, $v) = each %ENV) {
  	if ($ENV{REQUEST_METHOD}) {
  	    # Need to be careful when called in the CGI environment, as
  	    # the HTTP_PROXY variable is under control of that other guy.
  	    next if $k =~ /^HTTP_/;
  	    $k = "HTTP_PROXY" if $k eq "CGI_HTTP_PROXY";
  	}
  	$k = lc($k);
  	next unless $k =~ /^(.*)_proxy$/;
  	$k = $1;
  	if ($k eq 'no') {
  	    $self->no_proxy(split(/\s*,\s*/, $v));
  	}
  	else {
              # Ignore random _proxy variables, allow only valid schemes
              next unless $k =~ /^$URI::scheme_re\z/;
              # Ignore xxx_proxy variables if xxx isn't a supported protocol
              next unless LWP::Protocol::implementor($k);
  	    $self->proxy($k, Encode::decode(locale => $v));
  	}
      }
  }
  
  
  sub no_proxy {
      my($self, @no) = @_;
      if (@no) {
  	push(@{ $self->{'no_proxy'} }, @no);
      }
      else {
  	$self->{'no_proxy'} = [];
      }
  }
  
  
  sub _new_response {
      my($request, $code, $message, $content) = @_;
      $message ||= HTTP::Status::status_message($code);
      my $response = HTTP::Response->new($code, $message);
      $response->request($request);
      $response->header("Client-Date" => HTTP::Date::time2str(time));
      $response->header("Client-Warning" => "Internal response");
      $response->header("Content-Type" => "text/plain");
      $response->content($content || "$code $message\n");
      return $response;
  }
  
  
  1;
  
  __END__
  
  =pod
  
  =head1 NAME
  
  LWP::UserAgent - Web user agent class
  
  =head1 SYNOPSIS
  
      use strict;
      use warnings;
  
      use LWP::UserAgent ();
  
      my $ua = LWP::UserAgent->new(timeout => 10);
      $ua->env_proxy;
  
      my $response = $ua->get('http://example.com');
  
      if ($response->is_success) {
          print $response->decoded_content;
      }
      else {
          die $response->status_line;
      }
  
  Extra layers of security (note the C<cookie_jar> and C<protocols_allowed>):
  
      use strict;
      use warnings;
  
      use HTTP::CookieJar::LWP ();
      use LWP::UserAgent       ();
  
      my $jar = HTTP::CookieJar::LWP->new;
      my $ua  = LWP::UserAgent->new(
          cookie_jar        => $jar,
          protocols_allowed => ['http', 'https'],
          timeout           => 10,
      );
  
      $ua->env_proxy;
  
      my $response = $ua->get('http://example.com');
  
      if ($response->is_success) {
          print $response->decoded_content;
      }
      else {
          die $response->status_line;
      }
  
  =head1 DESCRIPTION
  
  The L<LWP::UserAgent> is a class implementing a web user agent.
  L<LWP::UserAgent> objects can be used to dispatch web requests.
  
  In normal use the application creates an L<LWP::UserAgent> object, and
  then configures it with values for timeouts, proxies, name, etc. It
  then creates an instance of L<HTTP::Request> for the request that
  needs to be performed. This request is then passed to one of the
  request method the UserAgent, which dispatches it using the relevant
  protocol, and returns a L<HTTP::Response> object.  There are
  convenience methods for sending the most common request types:
  L<LWP::UserAgent/get>, L<LWP::UserAgent/head>, L<LWP::UserAgent/post>,
  L<LWP::UserAgent/put> and L<LWP::UserAgent/delete>.  When using these
  methods, the creation of the request object is hidden as shown in the
  synopsis above.
  
  The basic approach of the library is to use HTTP-style communication
  for all protocol schemes.  This means that you will construct
  L<HTTP::Request> objects and receive L<HTTP::Response> objects even
  for non-HTTP resources like I<gopher> and I<ftp>.  In order to achieve
  even more similarity to HTTP-style communications, I<gopher> menus and
  file directories are converted to HTML documents.
  
  =head1 CONSTRUCTOR METHODS
  
  The following constructor methods are available:
  
  =head2 clone
  
      my $ua2 = $ua->clone;
  
  Returns a copy of the L<LWP::UserAgent> object.
  
  B<CAVEAT>: Please be aware that the clone method does not copy or clone your
  C<cookie_jar> attribute. Due to the limited restrictions on what can be used
  for your cookie jar, there is no way to clone the attribute. The C<cookie_jar>
  attribute will be C<undef> in the new object instance.
  
  =head2 new
  
      my $ua = LWP::UserAgent->new( %options )
  
  This method constructs a new L<LWP::UserAgent> object and returns it.
  Key/value pair arguments may be provided to set up the initial state.
  The following options correspond to attribute methods described below:
  
     KEY                     DEFAULT
     -----------             --------------------
     agent                   "libwww-perl/#.###"
     from                    undef
     conn_cache              undef
     cookie_jar              undef
     default_headers         HTTP::Headers->new
     local_address           undef
     ssl_opts                { verify_hostname => 1 }
     max_size                undef
     max_redirect            7
     parse_head              1
     protocols_allowed       undef
     protocols_forbidden     undef
     requests_redirectable   ['GET', 'HEAD']
     timeout                 180
     proxy                   undef
     no_proxy                []
  
  The following additional options are also accepted: If the C<env_proxy> option
  is passed in with a true value, then proxy settings are read from environment
  variables (see L<LWP::UserAgent/env_proxy>). If C<env_proxy> isn't provided, the
  C<PERL_LWP_ENV_PROXY> environment variable controls if
  L<LWP::UserAgent/env_proxy> is called during initialization.  If the
  C<keep_alive> option is passed in, then a C<LWP::ConnCache> is set up (see
  L<LWP::UserAgent/conn_cache>).  The C<keep_alive> value is passed on as the
  C<total_capacity> for the connection cache.
  
  C<proxy> must be set as an arrayref of key/value pairs. C<no_proxy> takes an
  arrayref of domains.
  
  =head1 ATTRIBUTES
  
  The settings of the configuration attributes modify the behaviour of the
  L<LWP::UserAgent> when it dispatches requests.  Most of these can also
  be initialized by options passed to the constructor method.
  
  The following attribute methods are provided.  The attribute value is
  left unchanged if no argument is given.  The return value from each
  method is the old attribute value.
  
  =head2 agent
  
      my $agent = $ua->agent;
      $ua->agent('Checkbot/0.4 ');    # append the default to the end
      $ua->agent('Mozilla/5.0');
      $ua->agent("");                 # don't identify
  
  Get/set the product token that is used to identify the user agent on
  the network. The agent value is sent as the C<User-Agent> header in
  the requests.
  
  The default is a string of the form C<libwww-perl/#.###>, where C<#.###> is
  substituted with the version number of this library.
  
  If the provided string ends with space, the default C<libwww-perl/#.###>
  string is appended to it.
  
  The user agent string should be one or more simple product identifiers
  with an optional version number separated by the C</> character.
  
  =head2 conn_cache
  
      my $cache_obj = $ua->conn_cache;
      $ua->conn_cache( $cache_obj );
  
  Get/set the L<LWP::ConnCache> object to use.  See L<LWP::ConnCache>
  for details.
  
  =head2 cookie_jar
  
      my $jar = $ua->cookie_jar;
      $ua->cookie_jar( $cookie_jar_obj );
  
  Get/set the cookie jar object to use.  The only requirement is that
  the cookie jar object must implement the C<extract_cookies($response)> and
  C<add_cookie_header($request)> methods.  These methods will then be
  invoked by the user agent as requests are sent and responses are
  received.  Normally this will be a L<HTTP::Cookies> object or some
  subclass.  You are, however, encouraged to use L<HTTP::CookieJar::LWP>
  instead.  See L</"BEST PRACTICES"> for more information.
  
      use HTTP::CookieJar::LWP ();
  
      my $jar = HTTP::CookieJar::LWP->new;
      my $ua = LWP::UserAgent->new( cookie_jar => $jar );
  
      # or after object creation
      $ua->cookie_jar( $cookie_jar );
  
  The default is to have no cookie jar, i.e. never automatically add
  C<Cookie> headers to the requests.
  
  Shortcut: If a reference to a plain hash is passed in, it is replaced with an
  instance of L<HTTP::Cookies> that is initialized based on the hash. This form
  also automatically loads the L<HTTP::Cookies> module.  It means that:
  
    $ua->cookie_jar({ file => "$ENV{HOME}/.cookies.txt" });
  
  is really just a shortcut for:
  
    require HTTP::Cookies;
    $ua->cookie_jar(HTTP::Cookies->new(file => "$ENV{HOME}/.cookies.txt"));
  
  =head2 credentials
  
      my $creds = $ua->credentials();
      $ua->credentials( $netloc, $realm );
      $ua->credentials( $netloc, $realm, $uname, $pass );
      $ua->credentials("www.example.com:80", "Some Realm", "foo", "secret");
  
  Get/set the user name and password to be used for a realm.
  
  The C<$netloc> is a string of the form C<< <host>:<port> >>.  The username and
  password will only be passed to this server.
  
  =head2 default_header
  
      $ua->default_header( $field );
      $ua->default_header( $field => $value );
      $ua->default_header('Accept-Encoding' => scalar HTTP::Message::decodable());
      $ua->default_header('Accept-Language' => "no, en");
  
  This is just a shortcut for
  C<< $ua->default_headers->header( $field => $value ) >>.
  
  =head2 default_headers
  
      my $headers = $ua->default_headers;
      $ua->default_headers( $headers_obj );
  
  Get/set the headers object that will provide default header values for
  any requests sent.  By default this will be an empty L<HTTP::Headers>
  object.
  
  =head2 from
  
      my $from = $ua->from;
      $ua->from('foo@bar.com');
  
  Get/set the email address for the human user who controls
  the requesting user agent.  The address should be machine-usable, as
  defined in L<RFC2822|https://tools.ietf.org/html/rfc2822>. The C<from> value
  is sent as the C<From> header in the requests.
  
  The default is to not send a C<From> header.  See
  L<LWP::UserAgent/default_headers> for the more general interface that allow
  any header to be defaulted.
  
  
  =head2 local_address
  
      my $address = $ua->local_address;
      $ua->local_address( $address );
  
  Get/set the local interface to bind to for network connections.  The interface
  can be specified as a hostname or an IP address.  This value is passed as the
  C<LocalAddr> argument to L<IO::Socket::INET>.
  
  =head2 max_redirect
  
      my $max = $ua->max_redirect;
      $ua->max_redirect( $n );
  
  This reads or sets the object's limit of how many times it will obey
  redirection responses in a given request cycle.
  
  By default, the value is C<7>. This means that if you call L<LWP::UserAgent/request>
  and the response is a redirect elsewhere which is in turn a
  redirect, and so on seven times, then LWP gives up after that seventh
  request.
  
  =head2 max_size
  
      my $size = $ua->max_size;
      $ua->max_size( $bytes );
  
  Get/set the size limit for response content.  The default is C<undef>,
  which means that there is no limit.  If the returned response content
  is only partial, because the size limit was exceeded, then a
  C<Client-Aborted> header will be added to the response.  The content
  might end up longer than C<max_size> as we abort once appending a
  chunk of data makes the length exceed the limit.  The C<Content-Length>
  header, if present, will indicate the length of the full content and
  will normally not be the same as C<< length($res->content) >>.
  
  =head2 parse_head
  
      my $bool = $ua->parse_head;
      $ua->parse_head( $boolean );
  
  Get/set a value indicating whether we should initialize response
  headers from the E<lt>head> section of HTML documents. The default is
  true. I<Do not turn this off> unless you know what you are doing.
  
  =head2 protocols_allowed
  
      my $aref = $ua->protocols_allowed;      # get allowed protocols
      $ua->protocols_allowed( \@protocols );  # allow ONLY these
      $ua->protocols_allowed(undef);          # delete the list
      $ua->protocols_allowed(['http',]);      # ONLY allow http
  
  By default, an object has neither a C<protocols_allowed> list, nor a
  L<LWP::UserAgent/protocols_forbidden> list.
  
  This reads (or sets) this user agent's list of protocols that the
  request methods will exclusively allow.  The protocol names are case
  insensitive.
  
  For example: C<< $ua->protocols_allowed( [ 'http', 'https'] ); >>
  means that this user agent will I<allow only> those protocols,
  and attempts to use this user agent to access URLs with any other
  schemes (like C<ftp://...>) will result in a 500 error.
  
  Note that having a C<protocols_allowed> list causes any
  L<LWP::UserAgent/protocols_forbidden> list to be ignored.
  
  =head2 protocols_forbidden
  
      my $aref = $ua->protocols_forbidden;    # get the forbidden list
      $ua->protocols_forbidden(\@protocols);  # do not allow these
      $ua->protocols_forbidden(['http',]);    # All http reqs get a 500
      $ua->protocols_forbidden(undef);        # delete the list
  
  This reads (or sets) this user agent's list of protocols that the
  request method will I<not> allow. The protocol names are case
  insensitive.
  
  For example: C<< $ua->protocols_forbidden( [ 'file', 'mailto'] ); >>
  means that this user agent will I<not> allow those protocols, and
  attempts to use this user agent to access URLs with those schemes
  will result in a 500 error.
  
  =head2 requests_redirectable
  
      my $aref = $ua->requests_redirectable;
      $ua->requests_redirectable( \@requests );
      $ua->requests_redirectable(['GET', 'HEAD',]); # the default
  
  This reads or sets the object's list of request names that
  L<LWP::UserAgent/redirect_ok> will allow redirection for. By default, this
  is C<['GET', 'HEAD']>, as per L<RFC 2616|https://tools.ietf.org/html/rfc2616>.
  To change to include C<POST>, consider:
  
     push @{ $ua->requests_redirectable }, 'POST';
  
  =head2 send_te
  
      my $bool = $ua->send_te;
      $ua->send_te( $boolean );
  
  If true, will send a C<TE> header along with the request. The default is
  true. Set it to false to disable the C<TE> header for systems who can't
  handle it.
  
  =head2 show_progress
  
      my $bool = $ua->show_progress;
      $ua->show_progress( $boolean );
  
  Get/set a value indicating whether a progress bar should be displayed
  on the terminal as requests are processed. The default is false.
  
  =head2 ssl_opts
  
      my @keys = $ua->ssl_opts;
      my $val = $ua->ssl_opts( $key );
      $ua->ssl_opts( $key => $value );
  
  Get/set the options for SSL connections.  Without argument return the list
  of options keys currently set.  With a single argument return the current
  value for the given option.  With 2 arguments set the option value and return
  the old.  Setting an option to the value C<undef> removes this option.
  
  The options that LWP relates to are:
  
  =over
  
  =item C<verify_hostname> => $bool
  
  When TRUE LWP will for secure protocol schemes ensure it connects to servers
  that have a valid certificate matching the expected hostname.  If FALSE no
  checks are made and you can't be sure that you communicate with the expected peer.
  The no checks behaviour was the default for libwww-perl-5.837 and earlier releases.
  
  This option is initialized from the C<PERL_LWP_SSL_VERIFY_HOSTNAME> environment
  variable.  If this environment variable isn't set; then C<verify_hostname>
  defaults to 1.
  
  =item C<SSL_ca_file> => $path
  
  The path to a file containing Certificate Authority certificates.
  A default setting for this option is provided by checking the environment
  variables C<PERL_LWP_SSL_CA_FILE> and C<HTTPS_CA_FILE> in order.
  
  =item C<SSL_ca_path> => $path
  
  The path to a directory containing files containing Certificate Authority
  certificates.
  A default setting for this option is provided by checking the environment
  variables C<PERL_LWP_SSL_CA_PATH> and C<HTTPS_CA_DIR> in order.
  
  =back
  
  Other options can be set and are processed directly by the SSL Socket implementation
  in use.  See L<IO::Socket::SSL> or L<Net::SSL> for details.
  
  The libwww-perl core no longer bundles protocol plugins for SSL.  You will need
  to install L<LWP::Protocol::https> separately to enable support for processing
  https-URLs.
  
  =head2 timeout
  
      my $secs = $ua->timeout;
      $ua->timeout( $secs );
  
  Get/set the timeout value in seconds. The default value is
  180 seconds, i.e. 3 minutes.
  
  The request is aborted if no activity on the connection to the server
  is observed for C<timeout> seconds.  This means that the time it takes
  for the complete transaction and the L<LWP::UserAgent/request> method to
  actually return might be longer.
  
  When a request times out, a response object is still returned.  The response
  will have a standard HTTP Status Code (500).  This response will have the
  "Client-Warning" header set to the value of "Internal response".  See the
  L<LWP::UserAgent/get> method description below for further details.
  
  =head1 PROXY ATTRIBUTES
  
  The following methods set up when requests should be passed via a
  proxy server.
  
  =head2 env_proxy
  
      $ua->env_proxy;
  
  Load proxy settings from C<*_proxy> environment variables.  You might
  specify proxies like this (sh-syntax):
  
    gopher_proxy=http://proxy.my.place/
    wais_proxy=http://proxy.my.place/
    no_proxy="localhost,example.com"
    export gopher_proxy wais_proxy no_proxy
  
  csh or tcsh users should use the C<setenv> command to define these
  environment variables.
  
  On systems with case insensitive environment variables there exists a
  name clash between the CGI environment variables and the C<HTTP_PROXY>
  environment variable normally picked up by C<env_proxy>.  Because of
  this C<HTTP_PROXY> is not honored for CGI scripts.  The
  C<CGI_HTTP_PROXY> environment variable can be used instead.
  
  =head2 no_proxy
  
      $ua->no_proxy( @domains );
      $ua->no_proxy('localhost', 'example.com');
      $ua->no_proxy(); # clear the list
  
  Do not proxy requests to the given domains.  Calling C<no_proxy> without
  any domains clears the list of domains.
  
  =head2 proxy
  
      $ua->proxy(\@schemes, $proxy_url)
      $ua->proxy(['http', 'ftp'], 'http://proxy.sn.no:8001/');
  
      # For a single scheme:
      $ua->proxy($scheme, $proxy_url)
      $ua->proxy('gopher', 'http://proxy.sn.no:8001/');
  
      # To set multiple proxies at once:
      $ua->proxy([
          ftp => 'http://ftp.example.com:8001/',
          [ 'http', 'https' ] => 'http://http.example.com:8001/',
      ]);
  
  Set/retrieve proxy URL for a scheme.
  
  The first form specifies that the URL is to be used as a proxy for
  access methods listed in the list in the first method argument,
  i.e. C<http> and C<ftp>.
  
  The second form shows a shorthand form for specifying
  proxy URL for a single access scheme.
  
  The third form demonstrates setting multiple proxies at once. This is also
  the only form accepted by the constructor.
  
  =head1 HANDLERS
  
  Handlers are code that injected at various phases during the
  processing of requests.  The following methods are provided to manage
  the active handlers:
  
  =head2 add_handler
  
      $ua->add_handler( $phase => \&cb, %matchspec )
  
  Add handler to be invoked in the given processing phase.  For how to
  specify C<%matchspec> see L<HTTP::Config/"Matching">.
  
  The possible values C<$phase> and the corresponding callback signatures are as
  follows.  Note that the handlers are documented in the order in which they will
  be run, which is:
  
      request_preprepare
      request_prepare
      request_send
      response_header
      response_data
      response_done
      response_redirect
  
  =over
  
  =item request_preprepare => sub { my($request, $ua, $handler) = @_; ... }
  
  The handler is called before the C<request_prepare> and other standard
  initialization of the request.  This can be used to set up headers
  and attributes that the C<request_prepare> handler depends on.  Proxy
  initialization should take place here; but in general don't register
  handlers for this phase.
  
  =item request_prepare => sub { my($request, $ua, $handler) = @_; ... }
  
  The handler is called before the request is sent and can modify the
  request any way it see fit.  This can for instance be used to add
  certain headers to specific requests.
  
  The method can assign a new request object to C<$_[0]> to replace the
  request that is sent fully.
  
  The return value from the callback is ignored.  If an exception is
  raised it will abort the request and make the request method return a
  "400 Bad request" response.
  
  =item request_send => sub { my($request, $ua, $handler) = @_; ... }
  
  This handler gets a chance of handling requests before they're sent to the
  protocol handlers.  It should return an L<HTTP::Response> object if it
  wishes to terminate the processing; otherwise it should return nothing.
  
  The C<response_header> and C<response_data> handlers will not be
  invoked for this response, but the C<response_done> will be.
  
  =item response_header => sub { my($response, $ua, $handler) = @_; ... }
  
  This handler is called right after the response headers have been
  received, but before any content data.  The handler might set up
  handlers for data and might croak to abort the request.
  
  The handler might set the C<< $response->{default_add_content} >> value to
  control if any received data should be added to the response object
  directly.  This will initially be false if the C<< $ua->request() >> method
  was called with a C<$content_file> or C<$content_cb argument>; otherwise true.
  
  =item response_data => sub { my($response, $ua, $handler, $data) = @_; ... }
  
  This handler is called for each chunk of data received for the
  response.  The handler might croak to abort the request.
  
  This handler needs to return a TRUE value to be called again for
  subsequent chunks for the same request.
  
  =item response_done => sub { my($response, $ua, $handler) = @_; ... }
  
  The handler is called after the response has been fully received, but
  before any redirect handling is attempted.  The handler can be used to
  extract information or modify the response.
  
  =item response_redirect => sub { my($response, $ua, $handler) = @_; ... }
  
  The handler is called in C<< $ua->request >> after C<response_done>.  If the
  handler returns an L<HTTP::Request> object we'll start over with processing
  this request instead.
  
  =back
  
  For all of these, C<$handler> is a code reference to the handler that
  is currently being run.
  
  =head2 get_my_handler
  
      $ua->get_my_handler( $phase, %matchspec );
      $ua->get_my_handler( $phase, %matchspec, $init );
  
  Will retrieve the matching handler as hash ref.
  
  If C<$init> is passed as a true value, create and add the
  handler if it's not found.  If C<$init> is a subroutine reference, then
  it's called with the created handler hash as argument.  This sub might
  populate the hash with extra fields; especially the callback.  If
  C<$init> is a hash reference, merge the hashes.
  
  =head2 handlers
  
      $ua->handlers( $phase, $request )
      $ua->handlers( $phase, $response )
  
  Returns the handlers that apply to the given request or response at
  the given processing phase.
  
  =head2 remove_handler
  
      $ua->remove_handler( undef, %matchspec );
      $ua->remove_handler( $phase, %matchspec );
      $ua->remove_handlers(); # REMOVE ALL HANDLERS IN ALL PHASES
  
  Remove handlers that match the given C<%matchspec>.  If C<$phase> is not
  provided, remove handlers from all phases.
  
  Be careful as calling this function with C<%matchspec> that is not
  specific enough can remove handlers not owned by you.  It's probably
  better to use the L<LWP::UserAgent/set_my_handler> method instead.
  
  The removed handlers are returned.
  
  =head2 set_my_handler
  
      $ua->set_my_handler( $phase, $cb, %matchspec );
      $ua->set_my_handler($phase, undef); # remove handler for phase
  
  Set handlers private to the executing subroutine.  Works by defaulting
  an C<owner> field to the C<%matchspec> that holds the name of the called
  subroutine.  You might pass an explicit C<owner> to override this.
  
  If $cb is passed as C<undef>, remove the handler.
  
  =head1 REQUEST METHODS
  
  The methods described in this section are used to dispatch requests
  via the user agent.  The following request methods are provided:
  
  =head2 delete
  
      my $res = $ua->delete( $url );
      my $res = $ua->delete( $url, $field_name => $value, ... );
  
  This method will dispatch a C<DELETE> request on the given URL.  Additional
  headers and content options are the same as for the L<LWP::UserAgent/get>
  method.
  
  This method will use the DELETE() function from L<HTTP::Request::Common>
  to build the request.  See L<HTTP::Request::Common> for a details on
  how to pass form content and other advanced features.
  
  =head2 get
  
      my $res = $ua->get( $url );
      my $res = $ua->get( $url , $field_name => $value, ... );
  
  This method will dispatch a C<GET> request on the given URL.  Further
  arguments can be given to initialize the headers of the request. These
  are given as separate name/value pairs.  The return value is a
  response object.  See L<HTTP::Response> for a description of the
  interface it provides.
  
  There will still be a response object returned when LWP can't connect to the
  server specified in the URL or when other failures in protocol handlers occur.
  These internal responses use the standard HTTP status codes, so the responses
  can't be differentiated by testing the response status code alone.  Error
  responses that LWP generates internally will have the "Client-Warning" header
  set to the value "Internal response".  If you need to differentiate these
  internal responses from responses that a remote server actually generates, you
  need to test this header value.
  
  Fields names that start with ":" are special.  These will not
  initialize headers of the request but will determine how the response
  content is treated.  The following special field names are recognized:
  
      :content_file   => $filename
      :content_cb     => \&callback
      :read_size_hint => $bytes
  
  If a $filename is provided with the C<:content_file> option, then the
  response content will be saved here instead of in the response
  object.  If a callback is provided with the C<:content_cb> option then
  this function will be called for each chunk of the response content as
  it is received from the server.  If neither of these options are
  given, then the response content will accumulate in the response
  object itself.  This might not be suitable for very large response
  bodies.  Only one of C<:content_file> or C<:content_cb> can be
  specified.  The content of unsuccessful responses will always
  accumulate in the response object itself, regardless of the
  C<:content_file> or C<:content_cb> options passed in.  Note that errors
  writing to the content file (for example due to permission denied
  or the filesystem being full) will be reported via the C<Client-Aborted>
  or C<X-Died> response headers, and not the C<is_success> method.
  
  The C<:read_size_hint> option is passed to the protocol module which
  will try to read data from the server in chunks of this size.  A
  smaller value for the C<:read_size_hint> will result in a higher
  number of callback invocations.
  
  The callback function is called with 3 arguments: a chunk of data, a
  reference to the response object, and a reference to the protocol
  object.  The callback can abort the request by invoking die().  The
  exception message will show up as the "X-Died" header field in the
  response returned by the get() function.
  
  =head2 head
  
      my $res = $ua->head( $url );
      my $res = $ua->head( $url , $field_name => $value, ... );
  
  This method will dispatch a C<HEAD> request on the given URL.
  Otherwise it works like the L<LWP::UserAgent/get> method described above.
  
  =head2 is_protocol_supported
  
      my $bool = $ua->is_protocol_supported( $scheme );
  
  You can use this method to test whether this user agent object supports the
  specified C<scheme>.  (The C<scheme> might be a string (like C<http> or
  C<ftp>) or it might be an L<URI> object reference.)
  
  Whether a scheme is supported is determined by the user agent's
  C<protocols_allowed> or C<protocols_forbidden> lists (if any), and by
  the capabilities of LWP.  I.e., this will return true only if LWP
  supports this protocol I<and> it's permitted for this particular
  object.
  
  =head2 is_online
  
      my $bool = $ua->is_online;
  
  Tries to determine if you have access to the Internet. Returns C<1> (true)
  if the built-in heuristics determine that the user agent is
  able to access the Internet (over HTTP) or C<0> (false).
  
  See also L<LWP::Online>.
  
  =head2 mirror
  
      my $res = $ua->mirror( $url, $filename );
  
  This method will get the document identified by URL and store it in
  file called C<$filename>.  If the file already exists, then the request
  will contain an C<If-Modified-Since> header matching the modification
  time of the file.  If the document on the server has not changed since
  this time, then nothing happens.  If the document has been updated, it
  will be downloaded again.  The modification time of the file will be
  forced to match that of the server.
  
  The return value is an L<HTTP::Response> object.
  
  =head2 post
  
      my $res = $ua->post( $url, \%form );
      my $res = $ua->post( $url, \@form );
      my $res = $ua->post( $url, \%form, $field_name => $value, ... );
      my $res = $ua->post( $url, $field_name => $value, Content => \%form );
      my $res = $ua->post( $url, $field_name => $value, Content => \@form );
      my $res = $ua->post( $url, $field_name => $value, Content => $content );
  
  This method will dispatch a C<POST> request on the given URL, with
  C<%form> or C<@form> providing the key/value pairs for the fill-in form
  content. Additional headers and content options are the same as for
  the L<LWP::UserAgent/get> method.
  
  This method will use the C<POST> function from L<HTTP::Request::Common>
  to build the request.  See L<HTTP::Request::Common> for a details on
  how to pass form content and other advanced features.
  
  =head2 put
  
      # Any version of HTTP::Message works with this form:
      my $res = $ua->put( $url, $field_name => $value, Content => $content );
  
      # Using hash or array references requires HTTP::Message >= 6.07
      use HTTP::Request 6.07;
      my $res = $ua->put( $url, \%form );
      my $res = $ua->put( $url, \@form );
      my $res = $ua->put( $url, \%form, $field_name => $value, ... );
      my $res = $ua->put( $url, $field_name => $value, Content => \%form );
      my $res = $ua->put( $url, $field_name => $value, Content => \@form );
  
  This method will dispatch a C<PUT> request on the given URL, with
  C<%form> or C<@form> providing the key/value pairs for the fill-in form
  content. Additional headers and content options are the same as for
  the L<LWP::UserAgent/get> method.
  
  CAVEAT:
  
  This method can only accept content that is in key-value pairs when using
  L<HTTP::Request::Common> prior to version C<6.07>. Any use of hash or array
  references will result in an error prior to version C<6.07>.
  
  This method will use the C<PUT> function from L<HTTP::Request::Common>
  to build the request.  See L<HTTP::Request::Common> for a details on
  how to pass form content and other advanced features.
  
  =head2 request
  
      my $res = $ua->request( $request );
      my $res = $ua->request( $request, $content_file );
      my $res = $ua->request( $request, $content_cb );
      my $res = $ua->request( $request, $content_cb, $read_size_hint );
  
  This method will dispatch the given C<$request> object. Normally this
  will be an instance of the L<HTTP::Request> class, but any object with
  a similar interface will do. The return value is an L<HTTP::Response> object.
  
  The C<request> method will process redirects and authentication
  responses transparently. This means that it may actually send several
  simple requests via the L<LWP::UserAgent/simple_request> method described below.
  
  The request methods described above; L<LWP::UserAgent/get>, L<LWP::UserAgent/head>,
  L<LWP::UserAgent/post> and L<LWP::UserAgent/mirror> will all dispatch the request
  they build via this method. They are convenience methods that simply hide the
  creation of the request object for you.
  
  The C<$content_file>, C<$content_cb> and C<$read_size_hint> all correspond to
  options described with the L<LWP::UserAgent/get> method above. Note that errors
  writing to the content file (for example due to permission denied
  or the filesystem being full) will be reported via the C<Client-Aborted>
  or C<X-Died> response headers, and not the C<is_success> method.
  
  You are allowed to use a CODE reference as C<content> in the request
  object passed in.  The C<content> function should return the content
  when called.  The content can be returned in chunks.  The content
  function will be invoked repeatedly until it return an empty string to
  signal that there is no more content.
  
  =head2 simple_request
  
      my $request = HTTP::Request->new( ... );
      my $res = $ua->simple_request( $request );
      my $res = $ua->simple_request( $request, $content_file );
      my $res = $ua->simple_request( $request, $content_cb );
      my $res = $ua->simple_request( $request, $content_cb, $read_size_hint );
  
  This method dispatches a single request and returns the response
  received.  Arguments are the same as for the L<LWP::UserAgent/request> described above.
  
  The difference from L<LWP::UserAgent/request> is that C<simple_request> will not try to
  handle redirects or authentication responses.  The L<LWP::UserAgent/request> method
  will, in fact, invoke this method for each simple request it sends.
  
  =head1 CALLBACK METHODS
  
  The following methods will be invoked as requests are processed. These
  methods are documented here because subclasses of L<LWP::UserAgent>
  might want to override their behaviour.
  
  =head2 get_basic_credentials
  
      # This checks wantarray and can either return an array:
      my ($user, $pass) = $ua->get_basic_credentials( $realm, $uri, $isproxy );
      # or a string that looks like "user:pass"
      my $creds = $ua->get_basic_credentials($realm, $uri, $isproxy);
  
  This is called by L<LWP::UserAgent/request> to retrieve credentials for documents
  protected by Basic or Digest Authentication.  The arguments passed in
  is the C<$realm> provided by the server, the C<$uri> requested and a
  C<boolean flag> to indicate if this is authentication against a proxy server.
  
  The method should return a username and password.  It should return an
  empty list to abort the authentication resolution attempt.  Subclasses
  can override this method to prompt the user for the information. An
  example of this can be found in C<lwp-request> program distributed
  with this library.
  
  The base implementation simply checks a set of pre-stored member
  variables, set up with the L<LWP::UserAgent/credentials> method.
  
  =head2 prepare_request
  
      $request = $ua->prepare_request( $request );
  
  This method is invoked by L<LWP::UserAgent/simple_request>. Its task is
  to modify the given C<$request> object by setting up various headers based
  on the attributes of the user agent. The return value should normally be the
  C<$request> object passed in.  If a different request object is returned
  it will be the one actually processed.
  
  The headers affected by the base implementation are; C<User-Agent>,
  C<From>, C<Range> and C<Cookie>.
  
  =head2 progress
  
      my $prog = $ua->progress( $status, $request_or_response );
  
  This is called frequently as the response is received regardless of
  how the content is processed.  The method is called with C<$status>
  "begin" at the start of processing the request and with C<$state> "end"
  before the request method returns.  In between these C<$status> will be
  the fraction of the response currently received or the string "tick"
  if the fraction can't be calculated.
  
  When C<$status> is "begin" the second argument is the L<HTTP::Request> object,
  otherwise it is the L<HTTP::Response> object.
  
  =head2 redirect_ok
  
      my $bool = $ua->redirect_ok( $prospective_request, $response );
  
  This method is called by L<LWP::UserAgent/request> before it tries to follow a
  redirection to the request in C<$response>.  This should return a true
  value if this redirection is permissible.  The C<$prospective_request>
  will be the request to be sent if this method returns true.
  
  The base implementation will return false unless the method
  is in the object's C<requests_redirectable> list,
  false if the proposed redirection is to a C<file://...>
  URL, and true otherwise.
  
  =head1 BEST PRACTICES
  
  The default settings can get you up and running quickly, but there are settings
  you can change in order to make your life easier.
  
  =head2 Handling Cookies
  
  You are encouraged to install L<Mozilla::PublicSuffix> and use
  L<HTTP::CookieJar::LWP> as your cookie jar.  L<HTTP::CookieJar::LWP> provides a
  better security model matching that of current Web browsers when
  L<Mozilla::PublicSuffix> is installed.
  
      use HTTP::CookieJar::LWP ();
  
      my $jar = HTTP::CookieJar::LWP->new;
      my $ua = LWP::UserAgent->new( cookie_jar => $jar );
  
  See L</"cookie_jar"> for more information.
  
  =head2 Managing Protocols
  
  C<protocols_allowed> gives you the ability to whitelist the protocols you're
  willing to allow.
  
      my $ua = LWP::UserAgent->new(
          protocols_allowed => [ 'http', 'https' ]
      );
  
  This will prevent you from inadvertently following URLs like
  C<file:///etc/passwd>.  See L</"protocols_allowed">.
  
  C<protocols_forbidden> gives you the ability to blacklist the protocols you're
  unwilling to allow.
  
      my $ua = LWP::UserAgent->new(
          protocols_forbidden => [ 'file', 'mailto', 'ssh', ]
      );
  
  This can also prevent you from inadvertently following URLs like
  C<file:///etc/passwd>.  See L</protocols_forbidden>.
  
  =head1 SEE ALSO
  
  See L<LWP> for a complete overview of libwww-perl5.  See L<lwpcook>
  and the scripts F<lwp-request> and F<lwp-download> for examples of
  usage.
  
  See L<HTTP::Request> and L<HTTP::Response> for a description of the
  message objects dispatched and received.  See L<HTTP::Request::Common>
  and L<HTML::Form> for other ways to build request objects.
  
  See L<WWW::Mechanize> and L<WWW::Search> for examples of more
  specialized user agents based on L<LWP::UserAgent>.
  
  =head1 COPYRIGHT AND LICENSE
  
  Copyright 1995-2009 Gisle Aas.
  
  This library is free software; you can redistribute it and/or
  modify it under the same terms as Perl itself.
  
  =cut
LWP_USERAGENT

    $main::fatpacked{"Language/Expr.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LANGUAGE_EXPR';
  package Language::Expr;
  
  our $DATE = '2016-07-03'; # DATE
  our $VERSION = '0.29'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  sub new {
      my $class = shift;
      bless {}, $class;
  }
  
  sub get_compiler {
      my ($self, $name) = @_;
      my $mod = "Language::Expr::Compiler::$name";
      (my $mod_pm = "$mod.pm") =~ s!::!/!g;
      require $mod_pm;
      $mod->new();
  }
  
  sub get_interpreter {
      my ($self, $name) = @_;
      my $mod = "Language::Expr::Interpreter::$name";
      (my $mod_pm = "$mod.pm") =~ s!::!/!g;
      require $mod_pm;
      $mod->new();
  }
  
  1;
  # ABSTRACT: Simple minilanguage for use in expression
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Language::Expr - Simple minilanguage for use in expression
  
  =head1 VERSION
  
  This document describes version 0.29 of Language::Expr (from Perl distribution Language-Expr), released on 2016-07-03.
  
  =head1 SYNOPSIS
  
   use Language::Expr;
  
   my $le = Language::Expr->new;
  
   # convert Expr to string Perl code
   say $le->get_compiler('perl')->compile('1 ^^ 2'); => # "(1 xor 2)"
  
   # convert Expr to JavaScript
   say $le->get_compiler('js')->compile('1 . 2'); # => "'' + 1 + 2"
  
   # evaluate Expr using the default interpreter
   say $le->get_interpreter('default')->eval('1 + 2'); # => 3
  
   # enumerate variables
   my $vars = $le->enum_vars('$a*$a + sqr($b)'); # => ['a', 'b']
  
  =head1 DESCRIPTION
  
  Language::Expr defines a simple, Perl-like expression minilanguage. It supports
  mathematical and string operators, arrays, hashes, variables, and functions. See
  L<Language::Expr::Manual::Syntax> for description of the language syntax.
  
  This distribution consists of the language parser (L<Language::Expr::Parser>),
  some interpreters (Language::Expr::Interpreter::*), and some compilers
  (Language::Expr::Compiler::*).
  
  =head1 KNOWN BUGS
  
  Due to possible bugs in Perl's RE engine or Regexp::Grammars or my
  grammar, some syntax errors will cause further parsing to
  fail.
  
  =head1 ATTRIBUTES
  
  =head1 METHODS
  
  =head2 new()
  
  =head2 get_compiler($name) => obj
  
  Get compiler named C<$name>, e.g. C<perl>, C<js>.
  
  =head2 get_interpreter($name) => obj
  
  Get compiler named C<$name>, e.g. C<default>, C<var_enumer>, C<dummy>.
  
  =head1 FAQ
  
  =head2 Why yet another simplistic (restricted, etc) language? Why not just Perl?
  
  When first adding expression support to L<Data::Schema> (now L<Data::Sah>), I
  want a language that is simple enough so I can easily convert it to Perl, PHP,
  JavaScript, and others. I do not need a fully-fledged programming language. In
  fact, Expr is not even Turing-complete, it does not support assignment or loops.
  Nor does it allow function definition (though it allows anonymous function in
  grep/map/usort). Instead, I just need some basic stuffs like
  mathematical/string/logical operators, arrays, hashes, functions,
  map/grep/usort. This language will mostly be used inside templates and schemas.
  
  =head2 Why don't you use Language::Farnsworth, or Math::Expression, or Math::Expression::Evaluator, or $FOO?
  
  I need several compilers and interpreters (some even with different semantics),
  so it's easier to start with a simple parser of my own. And of course there is
  personal preference of language syntax.
  
  =head2 What is the difference between a compiler and interpreter?
  
  An interpreter evaluates expression as it is being parsed, while a compiler
  generates a complete Perl (or whatever) code first. Thus, if you $le->eval()
  repeatedly using the interpreter mode (setting $le->interpreted(1)), you will
  repeatedly parse the expression each time. This can be one or more orders of
  magnitude slower compared to compiling into Perl once and then directly
  executing the Perl code repeatedly.
  
  Note that if you use $le->eval() using the default compiler mode, you do not
  reap the benefits of compilation because the expression will be compiled each
  time you call $le->eval(). To save the compilation result, use $le->compile() or
  $le->perl() and compile the Perl code yourself using Perl's eval().
  
  =head2 I want different syntax for (variables, foo operator, etc)!
  
  Create your own language :-) Fork this distribution and start
  modifying the Language::Expr::Parser module.
  
  =head2 How to show details of errors in expression?
  
  This is a TODO item.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Language-Expr>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/sharyanto/perl-Language-Expr>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Language-Expr>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  Syntax reference: L<Language::Expr::Manual::Syntax>
  
  Modules that are using Language::Expr: L<Data::Sah>, L<Data::Template::Expr>
  (not yet released).
  
  Other related modules: L<Math::Expression>, L<Math::Expression::Evaluator>,
  L<Language::Farnsworth>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
LANGUAGE_EXPR

    $main::fatpacked{"Language/Expr/Compiler/Base.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LANGUAGE_EXPR_COMPILER_BASE';
  package Language::Expr::Compiler::Base;
  
  our $DATE = '2016-07-03'; # DATE
  our $VERSION = '0.29'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  
  use UUID::Tiny ':std';
  
  use Mo qw(build default);
  
  # [[type, uuid, data], ...]
  has markers => (is => 'rw', default => sub { [] });
  has func_mapping => (is => 'rw', default => sub { {} });
  has hook_var => (is => 'rw');
  has hook_func => (is => 'rw');
  
  sub new_marker {
      my ($self, $type, $data) = @_;
      my $uuid = UUID::Tiny::create_uuid_as_string(UUID_V4);
      #my $uuid = int(9000*rand()+1000);
      #print "DEBUG: Creating new marker: type=$type, uuid=$uuid, data=", ($data // "undef"), "\n\n";
      push @{ $self->markers }, [$type, $uuid, $data];
      $uuid;
  }
  
  sub marker_ids {
      my ($self) = @_;
      map {$_->[1]} @{ $self->markers };
  }
  
  sub marker_ids_re {
      my ($self) = @_;
      my $re = "(?:" . join("|", map {$_->[1]} @{ $self->markers }) . ")";
      qr/$re/;
  }
  
  1;
  # ABSTRACT: Base class for Expr compilers
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Language::Expr::Compiler::Base - Base class for Expr compilers
  
  =head1 VERSION
  
  This document describes version 0.29 of Language::Expr::Compiler::Base (from Perl distribution Language-Expr), released on 2016-07-03.
  
  =head1 ATTRIBUTES
  
  =head2 markers => ARRAYREF
  
  Used to mark compile output string with various unique strings, and later on
  revisit these markers and substitute for other, final values. This technique is
  kind of a hack, used for subexpression, inserting PHP use() statement (because
  they must be processed outward to inward), etc.
  
  =head2 func_mapping => HASHREF
  
  Map Expr function to target language's function/method/property.
  
  =head2 hook_var
  
  Can be set to a coderef that will be called during parsing whenever variable is
  encountered. The coderef is called with variable name as argument, and expected
  to return target language code to handle the variable. By default, if this
  attribute is not set, variable in expression is returned as is (e.g. '$foo'
  becomes '$foo' in Perl), which means some will result in error (e.g. '${name
  that contains some symbols that makes it invalid Perl}').
  
  If the coderef returns undef, the default behaviour is used.
  
  Note that due to current limitation of Perl regex and/or Regexp::Grammars, you
  cannot use any regex in your hook_var.
  
  =head2 hook_func
  
  Can be set to a coderef that will be called during parsing whenever a function
  call is encountered. The coderef is called as its arguments function name and
  list of arguments and expected to return target language code to handle the
  function call. By default, if this attribute is not set, variable in expression
  is returned as is (e.g. 'foo(1, 2, 3)' becomes 'foo(1, 2, 3)' in Perl).
  
  If the coderef returns undef, the default behaviour is used.
  
  Note that due to current limitation of Perl regex and/or Regexp::Grammars, you
  cannot use any regex in your hook_var.
  
  =head1 METHODS
  
  =head2 new_marker(TYPE[, DATA]) => UUID
  
  Create a new marker. Return a unique ID to be placed in compiled
  output.
  
  =head2 marker_ids() => ARRAY
  
  Return an array of all marker IDs.
  
  =head2 marker_ids_re() => STRING
  
  Return a regex that matches marker IDs.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Language-Expr>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/sharyanto/perl-Language-Expr>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Language-Expr>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
LANGUAGE_EXPR_COMPILER_BASE

    $main::fatpacked{"Language/Expr/Compiler/js.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LANGUAGE_EXPR_COMPILER_JS';
  package Language::Expr::Compiler::js;
  
  our $DATE = '2016-07-03'; # DATE
  our $VERSION = '0.29'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  
  use Role::Tiny::With;
  use parent 'Language::Expr::Compiler::Base';
  with 'Language::Expr::CompilerRole';
  
  sub rule_pair_simple {
      my ($self, %args) = @_;
      my $match = $args{match};
      "'$match->{key}':$match->{value}";
  }
  
  sub rule_pair_string {
      my ($self, %args) = @_;
      my $match = $args{match};
      "$match->{key}:$match->{value}";
  }
  
  sub rule_or_xor {
      my ($self, %args) = @_;
      my $match = $args{match};
      my @res;
      push @res, shift @{$match->{operand}};
      for my $term (@{$match->{operand}}) {
          my $op = shift @{$match->{op}//=[]};
          last unless $op;
          if    ($op eq '||') { push @res, " || $term" }
          elsif ($op eq '//') { @res = ("(function() { let _x = (",
                                        @res, "); return _x==null ? (",
                                        $term, ") : _x })()") }
          elsif ($op eq '^^') { @res = ("(function() { let _a = (",
                                        @res, "); let _b = ($term); ",
                                        "return _a&&!_b || !_a&&_b ? _a : _b })()") }
      }
      join "", grep {defined} @res;
  }
  
  sub rule_and {
      my ($self, %args) = @_;
      my $match = $args{match};
      my @res;
      push @res, shift @{$match->{operand}};
      for my $term (@{$match->{operand}}) {
          my $op = shift @{$match->{op}//=[]};
          last unless $op;
          if    ($op eq '&&') { push @res, " && $term" }
      }
      join "", grep {defined} @res;
  }
  
  sub rule_ternary {
      my ($self, %args) = @_;
      my $match = $args{match};
      my $opd = $match->{operand};
      "($opd->[0] ? $opd->[1] : $opd->[2])";
  }
  
  sub rule_bit_or_xor {
      my ($self, %args) = @_;
      my $match = $args{match};
      my @res;
      push @res, shift @{$match->{operand}};
      for my $term (@{$match->{operand}}) {
          my $op = shift @{$match->{op}//=[]};
          last unless $op;
          if    ($op eq '|') { push @res, " | $term" }
          elsif ($op eq '^') { push @res, " ^ $term" }
      }
      join "", grep {defined} @res;
  }
  
  sub rule_bit_and {
      my ($self, %args) = @_;
      my $match = $args{match};
      my @res;
      push @res, shift @{$match->{operand}};
      for my $term (@{$match->{operand}}) {
          my $op = shift @{$match->{op}//=[]};
          last unless $op;
          if    ($op eq '&') { push @res, " & $term" }
      }
      join "", grep {defined} @res;
  }
  
  sub rule_comparison3 {
      my ($self, %args) = @_;
      my $match = $args{match};
      my @res;
      push @res, shift @{$match->{operand}};
      for my $term (@{$match->{operand}}) {
          my $op = shift @{$match->{op}//=[]};
          last unless $op;
          if    ($op eq '<=>') { @res = ("(function() { let _a = (",
                                        @res, "); let _b = ($term); ",
                                        "return _a > _b ? 1 : (_a < _b ? -1 : 0) })()") }
          elsif ($op eq 'cmp') { @res = ("(function() { let _a = (",
                                        @res, ") + ''; let _b = ($term) + ''; ",
                                        "return _a > _b ? 1 : (_a < _b ? -1 : 0) })()") }
      }
      join "", grep {defined} @res;
  }
  
  sub _comparison1 {
      my ($opd1, $op, $opd2) = @_;
      if    ($op eq 'eq') { return "(function() { let _a = ($opd1) + ''; let _b = ($opd2) + ''; return $opd1 == $opd2 })()" }
      elsif ($op eq 'ne') { return "(function() { let _a = ($opd1) + ''; let _b = ($opd2) + ''; return $opd1 != $opd2 })()" }
      elsif ($op eq 'lt') { return "(function() { let _a = ($opd1) + ''; let _b = ($opd2) + ''; return $opd1 <  $opd2 })()" }
      elsif ($op eq 'le') { return "(function() { let _a = ($opd1) + ''; let _b = ($opd2) + ''; return $opd1 <= $opd2 })()" }
      elsif ($op eq 'gt') { return "(function() { let _a = ($opd1) + ''; let _b = ($opd2) + ''; return $opd1 >  $opd2 })()" }
      elsif ($op eq 'ge') { return "(function() { let _a = ($opd1) + ''; let _b = ($opd2) + ''; return $opd1 >= $opd2 })()" }
      else { return "($opd1 $op $opd2)" }
  }
  
  sub rule_comparison {
      my ($self, %args) = @_;
      my $match = $args{match};
      my @opds;
      push @opds, shift @{$match->{operand}};
      return '' unless defined $opds[0];
      my @ops;
      for my $term (@{$match->{operand}}) {
          push @opds, $term;
          my $op = shift @{$match->{op}//=[]};
          last unless $op;
          if    ($op eq '==' ) { push @ops, '=='  }
          elsif ($op eq '!=' ) { push @ops, '!='  }
          elsif ($op eq 'eq' ) { push @ops, 'eq'  }
          elsif ($op eq 'ne' ) { push @ops, 'ne'  }
          elsif ($op eq '<'  ) { push @ops, '<'   }
          elsif ($op eq '<=' ) { push @ops, '<='  }
          elsif ($op eq '>'  ) { push @ops, '>'   }
          elsif ($op eq '>=' ) { push @ops, '>='  }
          elsif ($op eq 'lt' ) { push @ops, 'lt'  }
          elsif ($op eq 'le' ) { push @ops, 'le'  }
          elsif ($op eq 'gt' ) { push @ops, 'gt'  }
          elsif ($op eq 'ge' ) { push @ops, 'ge'  }
      }
      return $opds[0] unless @ops;
      my @res;
      my $lastopd;
      my ($opd1, $opd2);
      while (@ops) {
          my $op = pop @ops;
          if (defined($lastopd)) {
              $opd2 = $lastopd;
              $opd1 = pop @opds;
          } else {
              $opd2 = pop @opds;
              $opd1 = pop @opds;
          }
          if (@res) {
              @res = ("("._comparison1($opd1, $op, $opd2)." ? ", @res, " : false)");
          } else {
              push @res, _comparison1($opd1, $op, $opd2);
          }
          $lastopd = $opd1;
      }
      join "", @res;
  }
  
  sub rule_bit_shift {
      my ($self, %args) = @_;
      my $match = $args{match};
      my @res;
      push @res, shift @{$match->{operand}};
      for my $term (@{$match->{operand}}) {
          my $op = shift @{$match->{op}//=[]};
          last unless $op;
          if    ($op eq '>>') { push @res, " >> $term" }
          elsif ($op eq '<<') { push @res, " << $term" }
      }
      join "", grep {defined} @res;
  }
  
  sub rule_add {
      my ($self, %args) = @_;
      my $match = $args{match};
      my @res;
      push @res, shift @{$match->{operand}};
      for my $term (@{$match->{operand}}) {
          my $op = shift @{$match->{op}//=[]};
          last unless $op;
          if    ($op eq '.') { @res = ("'' + ", @res, " + $term") }
          if    ($op eq '+') { push @res, " + $term" }
          if    ($op eq '-') { push @res, " - $term" }
      }
      join "", grep {defined} @res;
  }
  
  sub rule_mult {
      my ($self, %args) = @_;
      my $match = $args{match};
      my @res;
      push @res, shift @{$match->{operand}};
      for my $term (@{$match->{operand}}) {
          my $op = shift @{$match->{op}//=[]};
          last unless $op;
          if    ($op eq '*') { push @res, " * $term" }
          if    ($op eq '/') { push @res, " / $term" }
          if    ($op eq '%') { push @res, " % $term" }
          if    ($op eq 'x') { @res = ("(new Array(1 + $term).join(", @res, "))") }
      }
      join "", grep {defined} @res;
  }
  
  sub rule_unary {
      my ($self, %args) = @_;
      my $match = $args{match};
      my @res;
      push @res, $match->{operand};
      for my $op (reverse @{$match->{op}//=[]}) {
          last unless $op;
          # use paren because --x or ++x is interpreted as pre-decrement/increment
          if    ($op eq '!') { @res = ("!(", @res, ")") }
          if    ($op eq '-') { @res = ("-(", @res, ")") }
          if    ($op eq '~') { @res = ("~(", @res, ")") }
      }
      join "", grep {defined} @res;
  }
  
  sub rule_power {
      my ($self, %args) = @_;
      my $match = $args{match};
      my @res;
      push @res, pop @{$match->{operand}};
      for my $term (reverse @{$match->{operand}}) {
          @res = ("Math.pow($term, ", @res, ")");
      }
      join "", grep {defined} @res;
  }
  
  sub rule_subscripting_var {
      my ($self, %args) = @_;
      $self->rule_subscripting_expr(%args);
  }
  
  sub rule_subscripting_expr {
      my ($self, %args) = @_;
      my $match = $args{match};
      my $opd = $match->{operand};
      my @ss = @{$match->{subscript}//=[]};
      return $opd unless @ss;
      my $res;
      for my $s (@ss) {
          $opd = $res if defined($res);
          $res = $opd . "[$s]";
      }
      $res;
  }
  
  sub rule_array {
      my ($self, %args) = @_;
      my $match = $args{match};
      "[" . join(", ", @{ $match->{element} }) . "]";
  }
  
  sub rule_hash {
      my ($self, %args) = @_;
      my $match = $args{match};
      "{" . join(", ", @{ $match->{pair} }). "}";
  }
  
  sub rule_undef {
      "null";
  }
  
  sub rule_squotestr {
      my ($self, %args) = @_;
      join(" + ",
           map { $self->_quote($_->{value}) }
               @{ $self->parse_squotestr($args{match}{part}) });
  }
  
  sub rule_dquotestr {
      my ($self, %args) = @_;
      my @tmp =
          map { $_->{type} eq 'VAR' ?
                    $self->rule_var(match=>{var=>$_->{value}}) :
                        $self->_quote($_->{value})
                }
              @{ $self->parse_dquotestr($args{match}{part}) };
      if (@tmp > 1) {
          "(". join(" + ", @tmp) . ")[0]";
      } else {
          $tmp[0];
      }
  }
  
  sub rule_bool {
      my ($self, %args) = @_;
      my $match = $args{match};
      if ($match->{bool} eq 'true') { "true" } else { "false" }
  }
  
  sub rule_num {
      my ($self, %args) = @_;
      my $match = $args{match};
      if    ($match->{num} eq 'inf') { 'Infinity' }
      elsif ($match->{num} eq 'nan') { 'NaN' }
      else                           { $match->{num}+0 }
  }
  
  sub rule_var {
      my ($self, %args) = @_;
      my $match = $args{match};
      if ($self->hook_var) {
          my $res = $self->hook_var->($match->{var});
          return $res if defined($res);
      }
      return "$match->{var}";
  }
  
  sub rule_func {
      my ($self, %args) = @_;
      my $match = $args{match};
      my $f = $match->{func_name};
      my $args = $match->{args};
      if ($self->hook_func) {
          my $res = $self->hook_func->($f, @$args);
          return $res if defined($res);
      }
      my $fmap = $self->func_mapping->{$f};
      $f = $fmap if $fmap;
      my $fc = substr($f, 0, 1);
      if ($fc eq '.') {
          my $invoc = shift @$args;
          return "($invoc)$f(".join(", ", @$args).")";
      } elsif ($fc eq ':') {
          my $invoc = shift @$args;
          my $prop = substr($f, 1, length($f)-1);
          return "($invoc).$prop";
      } else {
          return "$f(".join(", ", @$args).")";
      }
  }
  
  sub _map_grep_usort {
      my ($self, $which, %args) = @_;
      my $match = $args{match};
      my $ary = $match->{array};
      my $expr = $match->{expr};
  
      my $uuid = $self->new_marker('subexpr', $expr);
      if ($which eq 'map') {
          return "($ary).map(function(_){ return (TODO-$uuid); })";
      } elsif ($which eq 'grep') {
          return "($ary).filter(function(_){ return (TODO-$uuid); })";
      } elsif ($which eq 'usort') {
          return "($ary).sort(function(a, b){ return (TODO-$uuid); })";
      }
  }
  
  sub rule_func_map {
      my ($self, %args) = @_;
      $self->_map_grep_usort('map', %args);
  }
  
  sub rule_func_grep {
      my ($self, %args) = @_;
      $self->_map_grep_usort('grep', %args);
  }
  
  sub rule_func_usort {
      my ($self, %args) = @_;
      $self->_map_grep_usort('usort', %args);
  }
  
  sub rule_parenthesis {
      my ($self, %args) = @_;
      my $match = $args{match};
      "(" . $match->{answer} . ")";
  }
  
  sub expr_preprocess {}
  
  sub expr_postprocess {
      my ($self, %args) = @_;
      my $result = $args{result};
      $result;
  }
  
  # can't use regex here (perl segfaults), at least in 5.10.1, because
  # we are in one big re::gr regex.
  sub _quote {
      my ($self, $str) = @_;
      my @c;
      for my $c (split '', $str) {
          my $o = ord($c);
          if    ($c eq '"') { push @c, '\\"' }
          elsif ($c eq "\\") { push @c, "\\\\" }
          elsif ($o >= 32 && $o <= 127) { push @c, $c }
          elsif ($o > 255) { push @c, sprintf("\\u%04x", $o) }
          else  { push @c, sprintf("\\x%02x", $o) }
      }
      '"' . join("", @c) . '"';
  }
  
  sub compile {
      require Language::Expr::Parser;
  
      my ($self, $expr) = @_;
      my $res = Language::Expr::Parser::parse_expr($expr, $self);
      for my $m (@{ $self->markers }) {
          my $type = $m->[0];
          next unless $type eq 'subexpr';
          my $uuid = $m->[1];
          my $subexpr = $m->[2];
          my $subres = Language::Expr::Parser::parse_expr($subexpr, $self);
          $res =~ s/TODO-$uuid/$subres/g;
      }
      $self->markers([]);
      $res;
  }
  
  1;
  # ABSTRACT: Compile Language::Expr expression to JavaScript
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Language::Expr::Compiler::js - Compile Language::Expr expression to JavaScript
  
  =head1 VERSION
  
  This document describes version 0.29 of Language::Expr::Compiler::js (from Perl distribution Language-Expr), released on 2016-07-03.
  
  =head1 SYNOPSIS
  
   use Language::Expr::Compiler::js;
   my $jsc = Language::Expr::Compiler::js->new;
   print $jsc->compile('map({$_**2}, [1, 2, 3])'); # prints: [1, 2, 3].map(function(_){ Math.pow(_, 2) })
  
   # map Expr function to JS function/method/property
   $jsc->func_mapping->{ceil} = 'Math.ceil';
   $jsc->func_mapping->{uc} = '.toUpperCase';
   $jsc->func_mapping->{length} = ':length';
   print $jsc->compile(q{uc("party like it's ") . ceil(1998.9)}); # prints: "party like it's ".toUpperCase() + Math.ceil(1998.9)
  
  =head1 DESCRIPTION
  
  Compiles Language::Expr expression to JavaScript code. Some notes:
  
  =over 4
  
  =item * JavaScript version
  
  This compiler emits JavaScript 1.8.1 code (it uses several Array methods like
  map() and filter() [supported since JavaScript 1.6], 'let' lexical variables
  [supported since JavaScript 1.7] and native JSON [supported since JavaScript
  1.8.1]).
  
  To test emitted JavaScript code, we use Node.js.
  
  =item * JavaScript-ness
  
  The emitted JS code will follow JavaScript's weak typing and coercion rules,
  e.g. Expr '1+"2"' will simply be translated to JavaScript '1+"2"' and will
  result in "12".
  
  =item * Variables by default simply use JavaScript variables.
  
  E.g. $a becomes a, and so on. Be careful not to make variables which are invalid
  in JavaScript, e.g. $.. or ${foo/bar}.
  
  You can customize this behaviour by subclassing rule_var() or by providing a
  hook_var() (see documentation in L<Language::Expr::Compiler::Base>).
  
  =item * Functions by default simply use Javascript functions.
  
  Except those mentioned in B<func_mapping> (e.g. rand() becomes Math.rand() if
  func_mapping->{rand} is 'Math.rand'). You can also map to JavaScript method
  (using '.meth' syntax) and property (using ':prop' syntax).
  
  You can customize this behaviour by subclassing rule_func() or by providing a
  hook_func() (see documentation in L<Language::Expr::Compiler::Base>).
  
  =back
  
  =for Pod::Coverage ^(rule|expr)_.+
  
  =head1 METHODS
  
  =head2 compile($expr) => $js_code
  
  Convert Language::Expr expression into JavaScript code. Dies if there is syntax
  error in expression.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Language-Expr>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/sharyanto/perl-Language-Expr>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Language-Expr>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
LANGUAGE_EXPR_COMPILER_JS

    $main::fatpacked{"Language/Expr/Compiler/perl.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LANGUAGE_EXPR_COMPILER_PERL';
  package Language::Expr::Compiler::perl;
  
  our $DATE = '2016-07-03'; # DATE
  our $VERSION = '0.29'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  
  use Role::Tiny::With;
  use parent 'Language::Expr::Compiler::Base';
  with 'Language::Expr::CompilerRole';
  
  use boolean;
  
  sub rule_pair_simple {
      my ($self, %args) = @_;
      my $match = $args{match};
      "$match->{key} => $match->{value}";
  }
  
  sub rule_pair_string {
      my ($self, %args) = @_;
      my $match = $args{match};
      "$match->{key} => $match->{value}";
  }
  
  sub rule_or_xor {
      my ($self, %args) = @_;
      my $match = $args{match};
      my @res;
      push @res, shift @{$match->{operand}};
      for my $term (@{$match->{operand}}) {
          my $op = shift @{$match->{op}//=[]};
          last unless $op;
          if    ($op eq '||') { push @res, " || $term" }
          elsif ($op eq '//') { push @res, " // $term" }
          # add parenthesis because perl's xor precendence is low
          elsif ($op eq '^^') { @res = ("(", @res, " xor $term)") }
      }
      join "", grep {defined} @res;
  }
  
  sub rule_and {
      my ($self, %args) = @_;
      my $match = $args{match};
      my @res;
      push @res, shift @{$match->{operand}};
      for my $term (@{$match->{operand}}) {
          my $op = shift @{$match->{op}//=[]};
          last unless $op;
          if    ($op eq '&&') { @res = ("((", @res, " && $term) || false)") }
      }
      join "", grep {defined} @res;
  }
  
  sub rule_ternary {
      my ($self, %args) = @_;
      my $match = $args{match};
      my $opd = $match->{operand};
      "$opd->[0] ? $opd->[1] : $opd->[2]";
  }
  
  sub rule_bit_or_xor {
      my ($self, %args) = @_;
      my $match = $args{match};
      my @res;
      push @res, shift @{$match->{operand}};
      for my $term (@{$match->{operand}}) {
          my $op = shift @{$match->{op}//=[]};
          last unless $op;
          if    ($op eq '|') { push @res, " | $term" }
          elsif ($op eq '^') { push @res, " ^ $term" }
      }
      join "", grep {defined} @res;
  }
  
  sub rule_bit_and {
      my ($self, %args) = @_;
      my $match = $args{match};
      my @res;
      push @res, shift @{$match->{operand}};
      for my $term (@{$match->{operand}}) {
          my $op = shift @{$match->{op}//=[]};
          last unless $op;
          if    ($op eq '&') { push @res, " & $term" }
      }
      join "", grep {defined} @res;
  }
  
  sub rule_comparison3 {
      my ($self, %args) = @_;
      my $match = $args{match};
      my @res;
      push @res, shift @{$match->{operand}};
      for my $term (@{$match->{operand}}) {
          my $op = shift @{$match->{op}//=[]};
          last unless $op;
          if    ($op eq '<=>') { push @res, " <=> $term" }
          elsif ($op eq 'cmp') { push @res, " cmp $term" }
      }
      join "", grep {defined} @res;
  }
  
  sub rule_comparison {
      my ($self, %args) = @_;
      my $match = $args{match};
      my @opds;
      push @opds, shift @{$match->{operand}};
      return '' unless defined $opds[0];
      my @ops;
      for my $term (@{$match->{operand}}) {
          push @opds, $term;
          my $op = shift @{$match->{op}//=[]};
          last unless $op;
          if    ($op eq '==' ) { push @ops, '=='  }
          elsif ($op eq '!=' ) { push @ops, '!='  }
          elsif ($op eq 'eq' ) { push @ops, 'eq'  }
          elsif ($op eq 'ne' ) { push @ops, 'ne'  }
          elsif ($op eq '<'  ) { push @ops, '<'   }
          elsif ($op eq '<=' ) { push @ops, '<='  }
          elsif ($op eq '>'  ) { push @ops, '>'   }
          elsif ($op eq '>=' ) { push @ops, '>='  }
          elsif ($op eq 'lt' ) { push @ops, 'lt'  }
          elsif ($op eq 'le' ) { push @ops, 'le'  }
          elsif ($op eq 'gt' ) { push @ops, 'gt'  }
          elsif ($op eq 'ge' ) { push @ops, 'ge'  }
      }
      return $opds[0] unless @ops;
      my @res;
      my $lastopd;
      my ($opd1, $opd2);
      while (@ops) {
          my $op = pop @ops;
          if (defined($lastopd)) {
              $opd2 = $lastopd;
              $opd1 = pop @opds;
          } else {
              $opd2 = pop @opds;
              $opd1 = pop @opds;
          }
          if (@res) {
              @res = ("(($opd1 $op $opd2) ? ", @res, " : false)");
          } else {
              push @res, "($opd1 $op $opd2 ? true:false)";
          }
          $lastopd = $opd1;
      }
      join "", @res;
  }
  
  sub rule_bit_shift {
      my ($self, %args) = @_;
      my $match = $args{match};
      my @res;
      push @res, shift @{$match->{operand}};
      for my $term (@{$match->{operand}}) {
          my $op = shift @{$match->{op}//=[]};
          last unless $op;
          if    ($op eq '>>') { push @res, " >> $term" }
          elsif ($op eq '<<') { push @res, " << $term" }
      }
      join "", grep {defined} @res;
  }
  
  sub rule_add {
      my ($self, %args) = @_;
      my $match = $args{match};
      my @res;
      push @res, shift @{$match->{operand}};
      for my $term (@{$match->{operand}}) {
          my $op = shift @{$match->{op}//=[]};
          last unless $op;
          if    ($op eq '.') { push @res, " . $term" }
          if    ($op eq '+') { push @res, " + $term" }
          if    ($op eq '-') { push @res, " - $term" }
      }
      join "", grep {defined} @res;
  }
  
  sub rule_mult {
      my ($self, %args) = @_;
      my $match = $args{match};
      my @res;
      push @res, shift @{$match->{operand}};
      for my $term (@{$match->{operand}}) {
          my $op = shift @{$match->{op}//=[]};
          last unless $op;
          if    ($op eq '*') { push @res, " * $term" }
          if    ($op eq '/') { push @res, " / $term" }
          if    ($op eq '%') { push @res, " % $term" }
          if    ($op eq 'x') { push @res, " x $term" }
      }
      join "", grep {defined} @res;
  }
  
  sub rule_unary {
      my ($self, %args) = @_;
      my $match = $args{match};
      my @res;
      push @res, $match->{operand};
      for my $op (reverse @{$match->{op}//=[]}) {
          last unless $op;
          # use paren because --x or ++x is interpreted as pre-decrement/increment
          if    ($op eq '!') { @res = ("(", @res, " ? false:true)") }
          if    ($op eq '-') { @res = ("-(", @res, ")") }
          if    ($op eq '~') { @res = ("~(", @res, ")") }
      }
      join "", grep {defined} @res;
  }
  
  sub rule_power {
      my ($self, %args) = @_;
      my $match = $args{match};
      my @res;
      push @res, shift @{$match->{operand}};
      for my $term (@{$match->{operand}}) {
          push @res, " ** $term";
      }
      join "", grep {defined} @res;
  }
  
  sub rule_subscripting_var {
      my ($self, %args) = @_;
      $self->rule_subscripting_expr(%args);
  }
  
  sub rule_subscripting_expr {
      my ($self, %args) = @_;
      my $match = $args{match};
      my $opd = $match->{operand};
      my @ss = @{$match->{subscript}//=[]};
      return $opd unless @ss;
      my $res;
      for my $s (@ss) {
          $opd = $res if defined($res);
          $res = qq!(do { my (\$v) = ($opd); my (\$s) = ($s); !.
              qq!if (ref(\$v) eq 'HASH') { \$v->{\$s} } !.
                  qq!elsif (ref(\$v) eq 'ARRAY') { \$v->[\$s] } else { !.
                      qq!die "Invalid subscript \$s for \$v" } })!;
      }
      $res;
  }
  
  sub rule_array {
      my ($self, %args) = @_;
      my $match = $args{match};
      "[" . join(", ", @{ $match->{element} }) . "]";
  }
  
  sub rule_hash {
      my ($self, %args) = @_;
      my $match = $args{match};
      "{" . join(", ", @{ $match->{pair} }). "}";
  }
  
  sub rule_undef {
      "undef";
  }
  
  sub rule_squotestr {
      my ($self, %args) = @_;
      join(" . ",
           map { $self->_quote($_->{value}) }
               @{ $self->parse_squotestr($args{match}{part}) });
  }
  
  sub rule_dquotestr {
      my ($self, %args) = @_;
      my @tmp =
          map { $_->{type} eq 'VAR' ?
                    $self->rule_var(match=>{var=>$_->{value}}) :
                        $self->_quote($_->{value})
                    }
              @{ $self->parse_dquotestr($args{match}{part}) };
      if (@tmp > 1) {
          "(". join(" . ", @tmp) . ")[0]";
      } else {
          $tmp[0];
      }
  }
  
  sub rule_bool {
      my ($self, %args) = @_;
      my $match = $args{match};
      if ($match->{bool} eq 'true') { "true" } else { "false" }
  }
  
  sub rule_num {
      my ($self, %args) = @_;
      my $match = $args{match};
      if    ($match->{num} eq 'inf') { '"Inf"' }
      elsif ($match->{num} eq 'nan') { '"NaN"' }
      else                           { $match->{num}+0 }
  }
  
  sub rule_var {
      my ($self, %args) = @_;
      my $match = $args{match};
      if ($self->hook_var) {
          my $res = $self->hook_var->($match->{var});
          return $res if defined($res);
      }
      return "\$$match->{var}";
  }
  
  sub rule_func {
      my ($self, %args) = @_;
      my $match = $args{match};
      my $f = $match->{func_name};
      my $args = $match->{args};
      if ($self->hook_func) {
          my $res = $self->hook_func->($f, @$args);
          return $res if defined($res);
      }
      my $fmap = $self->func_mapping->{$f};
      $f = $fmap if $fmap;
      "$f(".join(", ", @$args).")";
  }
  
  sub _map_grep_usort {
      my ($self, $which, %args) = @_;
      my $match = $args{match};
      my $ary = $match->{array};
      my $expr = $match->{expr};
  
      my $perlop = $which eq 'map' ? 'map' : $which eq 'grep' ? 'grep' : 'sort';
      my $uuid = $self->new_marker('subexpr', $expr);
      "[$perlop({ TODO-$uuid } \@{$ary})]";
  }
  
  sub rule_func_map {
      my ($self, %args) = @_;
      $self->_map_grep_usort('map', %args);
  }
  
  sub rule_func_grep {
      my ($self, %args) = @_;
      $self->_map_grep_usort('grep', %args);
  }
  
  sub rule_func_usort {
      my ($self, %args) = @_;
      $self->_map_grep_usort('usort', %args);
  }
  
  sub rule_parenthesis {
      my ($self, %args) = @_;
      my $match = $args{match};
      "(" . $match->{answer} . ")";
  }
  
  sub expr_preprocess {}
  
  sub expr_postprocess {
      my ($self, %args) = @_;
      my $result = $args{result};
      $result;
  }
  
  # can't use regex here (perl segfaults), at least in 5.10.1, because
  # we are in one big re::gr regex.
  sub _quote {
      my ($self, $str) = @_;
      my @c;
      for my $c (split '', $str) {
          my $o = ord($c);
          if    ($c eq '"') { push @c, '\\"' }
          elsif ($c eq "\\") { push @c, "\\\\" }
          elsif ($c eq '$') { push @c, "\\\$" }
          elsif ($c eq '@') { push @c, '\\@' }
          elsif ($o >= 32 && $o <= 127) { push @c, $c }
          elsif ($o > 255) { push @c, sprintf("\\x{%04x}", $o) }
          else  { push @c, sprintf("\\x%02x", $o) }
      }
      '"' . join("", @c) . '"';
  }
  
  sub compile {
      require Language::Expr::Parser;
  
      my ($self, $expr) = @_;
      my $res = Language::Expr::Parser::parse_expr($expr, $self);
      for my $m (@{ $self->markers }) {
          my $type = $m->[0];
          next unless $type eq 'subexpr';
          my $uuid = $m->[1];
          my $subexpr = $m->[2];
          my $subres = Language::Expr::Parser::parse_expr($subexpr, $self);
          $res =~ s/TODO-$uuid/$subres/g;
      }
      $self->markers([]);
      $res;
  }
  
  sub eval {
      my ($self, $expr) = @_;
      my $res = eval "package Language::Expr::Compiler::perl; no strict; " . $self->compile($expr);
      die if $@;
      $res;
  }
  
  1;
  # ABSTRACT: Compile Language::Expr expression to Perl
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Language::Expr::Compiler::perl - Compile Language::Expr expression to Perl
  
  =head1 VERSION
  
  This document describes version 0.29 of Language::Expr::Compiler::perl (from Perl distribution Language-Expr), released on 2016-07-03.
  
  =head1 SYNOPSIS
  
   use Language::Expr::Compiler::Perl;
   my $plc = Language::Expr::Compiler::Perl->new;
   print $plc->perl('1 ^^ 2'); # prints '1 xor 2'
  
  =head1 DESCRIPTION
  
  Compiles Language::Expr expression to Perl code. Some notes:
  
  =over 4
  
  =item * Emitted Perl code version
  
  Emitted Perl code requires Perl 5.10 (it uses 5.10's "//" defined-or
  operator) and also the L<boolean> module (it uses 'true' and 'false'
  objects).
  
  =item * Perliness
  
  The emitted Perl code will follow Perl's notion of true and false,
  e.g. the expression '"" || "0" || 2' will result to 2 since Perl
  thinks that "" and "0" are false. It is also weakly typed like Perl,
  i.e. allows '1 + "2"' to become 3.
  
  =item * Variables by default simply use Perl variables.
  
  E.g. $a becomes $a, and so on. Be careful not to make variables which
  are invalid in Perl, e.g. $.. or ${foo/bar} (but ${foo::bar} is okay
  because it translates to $foo::bar).
  
  You can customize this behaviour by subclassing rule_var() or by providing a
  hook_var() (see documentation in L<Language::Expr::Compiler::Base>).
  
  =item * Functions by default simply use Perl functions.
  
  Unless those specified in func_mapping. For example, if
  $compiler->func_mapping->{foo} = "Foo::do_it", then the expression
  'foo(1)' will be compiled into 'Foo::do_it(1)'.
  
  You can customize this behaviour by subclassing rule_func() or by providing a
  hook_func() (see documentation in L<Language::Expr::Compiler::Base>).
  
  =back
  
  =head1 METHODS
  
  =for Pod::Coverage ^(rule|expr)_.+
  
  =head2 compile($expr) => $perl_code
  
  Convert Language::Expr expression into Perl code. Dies if there is syntax error
  in expression.
  
  =head2 eval($expr) => any
  
  Convert Language::Expr expression into Perl code and then eval() it.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Language-Expr>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/sharyanto/perl-Language-Expr>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Language-Expr>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
LANGUAGE_EXPR_COMPILER_PERL

    $main::fatpacked{"Language/Expr/CompilerRole.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LANGUAGE_EXPR_COMPILERROLE';
  package Language::Expr::CompilerRole;
  
  our $DATE = '2016-07-03'; # DATE
  our $VERSION = '0.29'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  
  use Role::Tiny;
  use Role::Tiny::With;
  
  with 'Language::Expr::EvaluatorRole';
  requires 'compile';
  
  1;
  # ABSTRACT: Role for Language::Expr::Compiler::*
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Language::Expr::CompilerRole - Role for Language::Expr::Compiler::*
  
  =head1 VERSION
  
  This document describes version 0.29 of Language::Expr::CompilerRole (from Perl distribution Language-Expr), released on 2016-07-03.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Language-Expr>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/sharyanto/perl-Language-Expr>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Language-Expr>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
LANGUAGE_EXPR_COMPILERROLE

    $main::fatpacked{"Language/Expr/EvaluatorRole.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LANGUAGE_EXPR_EVALUATORROLE';
  package Language::Expr::EvaluatorRole;
  
  our $DATE = '2016-07-03'; # DATE
  our $VERSION = '0.29'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  
  use Role::Tiny;
  
  requires 'rule_pair_simple';
  requires 'rule_pair_string';
  requires 'rule_or_xor';
  requires 'rule_ternary';
  requires 'rule_and';
  requires 'rule_bit_or_xor';
  requires 'rule_bit_and';
  requires 'rule_comparison3';
  requires 'rule_comparison';
  requires 'rule_bit_shift';
  requires 'rule_add';
  requires 'rule_mult';
  requires 'rule_unary';
  requires 'rule_power';
  requires 'rule_subscripting_var';
  requires 'rule_subscripting_expr';
  requires 'rule_array';
  requires 'rule_hash';
  requires 'rule_undef';
  requires 'rule_squotestr';
  requires 'rule_dquotestr';
  requires 'rule_var';
  requires 'rule_func';
  requires 'rule_func_map';
  requires 'rule_func_grep';
  requires 'rule_func_usort';
  requires 'rule_bool';
  requires 'rule_num';
  requires 'rule_parenthesis';
  requires 'expr_preprocess';
  requires 'expr_postprocess';
  
  sub parse_dquotestr {
      my ($self, @parts) = @_;
      if (ref($parts[0]) eq 'ARRAY') { splice @parts, 0, 1, @{ $parts[0] } }
      my @res;
      my @sbuf;
  
      #say "D:parse_dquotestr:parts = ", join(", ", @parts);
      #for (grep {defined} @parts) {
      for (@parts) {
          no warnings;
          my $s01 = substr($_, 0, 1);
          my $s02 = substr($_, 0, 2);
          my $l = length();
          if    ($_ eq "\\'" ) { push @sbuf, "'"  }
          elsif ($_ eq "\\\"") { push @sbuf, '"'  }
          elsif ($_ eq "\\\\") { push @sbuf, "\\" }
          elsif ($_ eq "\\\$") { push @sbuf, '$'  }
          elsif ($_ eq "\\t" ) { push @sbuf, "\t" }
          elsif ($_ eq "\\n" ) { push @sbuf, "\n" }
          elsif ($_ eq "\\f" ) { push @sbuf, "\f" }
          elsif ($_ eq "\\b" ) { push @sbuf, "\b" }
          elsif ($_ eq "\\a" ) { push @sbuf, "\a" }
          elsif ($_ eq "\\e" ) { push @sbuf, "\e" }
          elsif ($l >= 2 && $l <= 4 && $s01 eq "\\" &&
                     substr($_, 1, 1) >= "0" && substr($_, 1, 1) <= "7") {
              # \000 octal escape
              push @sbuf, chr(oct(substr($_, 1))) }
          elsif ($l >= 3 && $l <= 4 && $s02 eq "\\x") {
              # \xFF hex escape
              push @sbuf, chr(hex(substr($_, 1))) }
          elsif ($l >= 5 && $l <= 8 && substr($_, 0, 3) eq "\\x{") {
              # \x{1234} wide hex escape
              push @sbuf, chr(hex(substr($_, 3, length()-4))) }
          elsif ($s02 eq '${') {
              # ${var}
              push @res, {type=>"STR", value=>join("", @sbuf)} if @sbuf; @sbuf=();
              push @res, {type=>"VAR", value=>substr($_, 2, length()-3)} }
          elsif ($s01 eq '$') {
              # $var
              push @res, {type=>"STR", value=>join("", @sbuf)} if @sbuf; @sbuf=();
              push @res, {type=>"VAR", value=>substr($_, 1, length()-1)} }
          else {
              push @sbuf, $_;
          }
      }
      push @res, {type=>"STR", value=>join("", grep {defined} @sbuf)} if @sbuf;
      \@res;
  }
  
  sub parse_squotestr {
      my ($self, @parts) = @_;
      if (ref($parts[0]) eq 'ARRAY') { splice @parts, 0, 1, @{ $parts[0] } }
      my @res;
      my @sbuf;
  
      #say "D:parse_dquotestr:parts = ", join(", ", @parts);
      #for (grep {defined} @parts) {
      for (@parts) {
          no warnings;
          if    ($_ eq "\\'" ) { push @sbuf, "'"  }
          elsif ($_ eq "\\\\") { push @sbuf, "\\" }
          else                 { push @sbuf, $_   }
      }
      push @res, {type=>"STR", value=>join("", grep {defined} @sbuf)} if @sbuf;
      \@res;
  }
  
  1;
  # ABSTRACT: Specification for Language::Expr interpreter/compiler
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Language::Expr::EvaluatorRole - Specification for Language::Expr interpreter/compiler
  
  =head1 VERSION
  
  This document describes version 0.29 of Language::Expr::EvaluatorRole (from Perl distribution Language-Expr), released on 2016-07-03.
  
  =head1 METHODS
  
  =head2 parse_dquotestr($raw_parts) -> [{type=>"STR"|"VAR"}, value=>...}, ...]
  
  Instead of parsing parts themselves, consumers can use this method (typically in
  their rule_dquotestr). This method converts each Expr escapes into Perl string
  and variables. For example:
  
   parse_dquotestr('abc', "\\t", '\\\\', '$foo', ' ', '${bar baz}') -> (
     {type=>"STR", value=>'abc\t\\'},
     {type=>"VAR", value=>'foo'},
     {type=>"STR", value=>' '},
     {type=>"VAR", value=>'bar baz'},
   )
  
  =head2 parse_squotestr($raw_parts) => [{type=>STR, value=>...}, ...]
  
  Instead of parsing parts themselves, consumers can use this method (typically in
  their rule_squotestr). This method converts Expr single quoted string into Perl
  string.
  
   parse_dquotestr('abc', "\\t", '\\\\', '$foo', ' ', '${bar baz}') -> (
     {type=>"STR", value=>'abc\t\\$foo ${bar baz}'},
   )
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Language-Expr>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/sharyanto/perl-Language-Expr>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Language-Expr>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
LANGUAGE_EXPR_EVALUATORROLE

    $main::fatpacked{"Language/Expr/Interpreter/Base.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LANGUAGE_EXPR_INTERPRETER_BASE';
  package Language::Expr::Interpreter::Base;
  
  our $DATE = '2016-07-03'; # DATE
  our $VERSION = '0.29'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  
  require Language::Expr::Parser;
  
  sub new {
      my $class = shift;
      bless {}, $class;
  }
  
  sub eval {
      my ($self, $expr) = @_;
      my $res = Language::Expr::Parser::parse_expr($expr, $self);
      $res;
  }
  
  1;
  # ABSTRACT: Base class for Language::Expr interpreters
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Language::Expr::Interpreter::Base - Base class for Language::Expr interpreters
  
  =head1 VERSION
  
  This document describes version 0.29 of Language::Expr::Interpreter::Base (from Perl distribution Language-Expr), released on 2016-07-03.
  
  =head1 METHODS
  
  =head2 new()
  
  =head2 eval($expr) => $result
  
  Evaluate expression and return the result.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Language-Expr>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/sharyanto/perl-Language-Expr>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Language-Expr>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
LANGUAGE_EXPR_INTERPRETER_BASE

    $main::fatpacked{"Language/Expr/Interpreter/default.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LANGUAGE_EXPR_INTERPRETER_DEFAULT';
  package Language::Expr::Interpreter::default;
  
  our $DATE = '2016-07-03'; # DATE
  our $VERSION = '0.29'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  
  use Role::Tiny::With;
  use Mo qw(build default);
  extends 'Language::Expr::Interpreter::Base';
  with 'Language::Expr::InterpreterRole';
  use List::Util 'reduce';
  use boolean;
  
  has vars  => (is => 'rw', default => sub { {} });
  has funcs => (is => 'rw', default => sub { {} });
  has level => (is => 'rw', default => sub { 0 });
  
  sub rule_pair_simple {
      my ($self, %args) = @_;
      my $match = $args{match};
      [$match->{key}, $match->{value}];
  }
  
  sub rule_pair_string {
      my ($self, %args) = @_;
      my $match = $args{match};
      [$match->{key}, $match->{value}];
  }
  
  sub rule_or_xor {
      my ($self, %args) = @_;
      my $match = $args{match};
      my $res = shift @{$match->{operand}};
      for my $term (@{$match->{operand}}) {
          my $op = shift @{$match->{op}//=[]};
          last unless $op;
          if    ($op eq '||') { $res ||= $term          }
          elsif ($op eq '//') { $res //= $term          }
          elsif ($op eq '^^') { $res = ($res xor $term) }
      }
      $res;
  }
  
  sub rule_ternary {
      my ($self, %args) = @_;
      my $match = $args{match};
      my $opd = $match->{operand};
      $opd->[0] ? $opd->[1] : $opd->[2];
  }
  
  sub rule_and {
      my ($self, %args) = @_;
      my $match = $args{match};
      my $res = shift @{$match->{operand}};
      for my $term (@{$match->{operand}}) {
          my $op = shift @{$match->{op}//=[]};
          last unless $op;
          if    ($op eq '&&') { $res = $res && $term || false }
      }
      $res;
  }
  
  sub rule_bit_or_xor {
      my ($self, %args) = @_;
      my $match = $args{match};
      my $res = shift @{$match->{operand}};
      for my $term (@{$match->{operand}}) {
          my $op = shift @{$match->{op}//=[]};
          last unless $op;
          if    ($op eq '|') { $res = $res+0 | $term }
          elsif ($op eq '^') { $res = $res+0 ^ $term }
      }
      $res;
  }
  
  sub rule_bit_and {
      my ($self, %args) = @_;
      my $match = $args{match};
      my $res = shift @{$match->{operand}};
      for my $term (@{$match->{operand}}) {
          my $op = shift @{$match->{op}//=[]};
          last unless $op;
          if    ($op eq '&') { $res = $res+0 & $term }
      }
      $res;
  }
  
  sub rule_comparison3 {
      my ($self, %args) = @_;
      my $match = $args{match};
      my $res = shift @{$match->{operand}};
      return $res unless @{$match->{operand}};
      my $last_term = $res;
      for my $term (@{$match->{operand}}) {
          my $op = shift @{$match->{op}//=[]};
          last unless $op;
          if    ($op eq '<=>') { $res = ($last_term <=> $term) }
          elsif ($op eq 'cmp') { $res = ($last_term cmp $term) }
          $last_term = $term;
      }
      $res;
  }
  
  sub rule_comparison {
      my ($self, %args) = @_;
      my $match = $args{match};
      my $res = shift @{$match->{operand}};
      return $res unless @{$match->{operand}};
      my $last_term = $res;
      for my $term (@{$match->{operand}}) {
          my $op = shift @{$match->{op}//=[]};
          last unless $op;
          if    ($op eq '==' ) { return false unless $res = ($last_term == $term ? true:false) }
          elsif ($op eq '!=' ) { return false unless $res = ($last_term != $term ? true:false) }
          elsif ($op eq 'eq' ) { return false unless $res = ($last_term eq $term ? true:false) }
          elsif ($op eq 'ne' ) { return false unless $res = ($last_term ne $term ? true:false) }
          elsif ($op eq '<'  ) { return false unless $res = ($last_term <  $term ? true:false) }
          elsif ($op eq '<=' ) { return false unless $res = ($last_term <= $term ? true:false) }
          elsif ($op eq '>'  ) { return false unless $res = ($last_term >  $term ? true:false) }
          elsif ($op eq '>=' ) { return false unless $res = ($last_term >= $term ? true:false) }
          elsif ($op eq 'lt' ) { return false unless $res = ($last_term lt $term ? true:false) }
          elsif ($op eq 'gt' ) { return false unless $res = ($last_term gt $term ? true:false) }
          elsif ($op eq 'le' ) { return false unless $res = ($last_term le $term ? true:false) }
          elsif ($op eq 'ge' ) { return false unless $res = ($last_term ge $term ? true:false) }
          $last_term = $term;
      }
      $res ? true : false;
  }
  
  sub rule_bit_shift {
      my ($self, %args) = @_;
      my $match = $args{match};
      my $res = shift @{$match->{operand}};
      for my $term (@{$match->{operand}}) {
          my $op = shift @{$match->{op}//=[]};
          last unless $op;
          if    ($op eq '>>') { $res >>= $term }
          elsif ($op eq '<<') { $res <<= $term }
      }
      $res;
  }
  
  sub rule_add {
      my ($self, %args) = @_;
      my $match = $args{match};
      my $res = shift @{$match->{operand}};
      for my $term (@{$match->{operand}}) {
          my $op = shift @{$match->{op}//=[]};
          last unless $op;
          if    ($op eq '+') { $res += $term }
          elsif ($op eq '-') { $res -= $term }
          elsif ($op eq '.') { $res .= $term }
      }
      $res;
  }
  
  sub rule_mult {
      my ($self, %args) = @_;
      my $match = $args{match};
      my $res = shift @{$match->{operand}};
      for my $term (@{$match->{operand}}) {
          my $op = shift @{$match->{op}//=[]};
          last unless $op;
          if    ($op eq '*') { $res *= $term }
          elsif ($op eq '/') { $res /= $term }
          elsif ($op eq '%') { $res %= $term }
          elsif ($op eq 'x') { $res x= $term }
      }
      $res;
  }
  
  sub rule_unary {
      my ($self, %args) = @_;
      my $match = $args{match};
      my $res = $match->{operand};
      if ($match->{op}) {
          for my $op (reverse @{$match->{op}}) {
              if    ($op eq '!') { $res = $res ? false : true }
              elsif ($op eq '-') { $res = -$res }
              elsif ($op eq '~') { $res = ~($res+0) }
          }
      }
      $res;
  }
  
  sub rule_power {
      my ($self, %args) = @_;
      my $match = $args{match};
      reduce { $b ** $a } reverse @{$match->{operand}};
  }
  
  sub rule_subscripting_var {
      my ($self, %args) = @_;
      $self->rule_subscripting_expr(%args);
  }
  
  sub rule_subscripting_expr {
      my ($self, %args) = @_;
      my $match = $args{match};
      my $res = $match->{operand};
      for my $i (@{$match->{subscript}}) {
          if (ref($res) eq 'ARRAY'  ) { $res = $res->[$i] }
          elsif (ref($res) eq 'HASH') { $res = $res->{$i} }
          else { die "Invalid subscript on nonhash/nonarray" }
      }
      $res;
  }
  
  sub rule_array {
      my ($self, %args) = @_;
      my $match = $args{match};
      $match->{element};
  }
  
  sub rule_hash {
      my ($self, %args) = @_;
      my $match = $args{match};
      return { map { $_->[0] => $_->[1] } @{ $match->{pair} } }
  }
  
  sub rule_undef {
      my ($self, %args) = @_;
      my $match = $args{match};
      undef;
  }
  
  sub rule_squotestr {
      my ($self, %args) = @_;
      join("",
           map { $_->{value} }
               @{ $self->parse_squotestr($args{match}{part}) });
  }
  
  sub rule_dquotestr {
      my ($self, %args) = @_;
      join("",
           map { $_->{type} eq 'VAR' ?
                     $self->rule_var(match=>{var=>$_->{value}}) :
                     $_->{value}
                 }
               @{ $self->parse_dquotestr($args{match}{part}) });
  }
  
  sub rule_bool {
      my ($self, %args) = @_;
      my $match = $args{match};
      if ($match->{bool} eq 'true') { true } else { false }
  }
  
  sub rule_num {
      my ($self, %args) = @_;
      my $match = $args{match};
      if    ($match->{num} eq 'inf') { "Inf"+0 }
      elsif ($match->{num} eq 'nan') { "NaN"+0 }
      else                           { $match->{num}+0 }
  }
  
  sub rule_var {
      my ($self, %args) = @_;
      my $match = $args{match};
      $self->vars->{ $match->{var} };
  }
  
  sub rule_func {
      my ($self, %args) = @_;
      my $match = $args{match};
      my $f = $match->{func_name};
      my $args = $match->{args};
      my $res;
      if ($self->funcs->{$f}) {
          return $self->funcs->{$f}->(@$args);
      } else {
          die "Unknown function $f";
      }
  }
  
  sub _map_grep_usort {
      my ($self, $which, %args) = @_;
      my $match = $args{match};
      my $ary = $match->{array};
      my $expr = $match->{expr};
      die "Second argument to map/grep/usort must be an array"
          unless ref($ary) eq 'ARRAY';
      local $self->{level} = $self->{level}+1;
      #print "DEBUG: _map_grep_usort: level=$self->{level}, expr=`$expr`, array=[".join(",", @$ary),"]\n";
      my $res;
      if ($which eq 'map') {
          $res = [];
          local $self->{vars}{_};
          for (@$ary) {
              $self->{vars}{_} = $_;
              push @$res, Language::Expr::Parser::parse_expr($expr, $self,
                                                             $self->level);
              push @$res, $_;
          }
      } elsif ($which eq 'grep') {
          local $self->{vars}{_};
          $res = [ grep {
              $self->{vars}{_} = $_;
              $self->Language::Expr::Parser::parse_expr($expr, $self,
                                                        $self->level)
          } @$ary];
      } elsif ($which eq 'usort') {
          local $self->{vars}{a};
          local $self->{vars}{b};
          $res = [ sort {
              $self->{vars}{a} = $a;
              $self->{vars}{b} = $b;
              Language::Expr::Parser::parse_expr($expr, $self,
                                                 $self->level)
          } @$ary];
      }
      $res;
  }
  
  sub rule_func_map {
      my ($self, %args) = @_;
      $self->_map_grep_usort('map', %args);
  }
  
  sub rule_func_grep {
      my ($self, %args) = @_;
      $self->_map_grep_usort('grep', %args);
  }
  
  sub rule_func_usort {
      my ($self, %args) = @_;
      $self->_map_grep_usort('usort', %args);
  }
  
  sub rule_parenthesis {}
  
  sub expr_preprocess {}
  
  sub expr_postprocess {
      my ($self, %args) = @_;
      my $result = $args{result};
      $result;
  }
  
  1;
  # ABSTRACT: A default interpreter for Language::Expr
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Language::Expr::Interpreter::default - A default interpreter for Language::Expr
  
  =head1 VERSION
  
  This document describes version 0.29 of Language::Expr::Interpreter::default (from Perl distribution Language-Expr), released on 2016-07-03.
  
  =head1 SYNOPSIS
  
   use Language::Expr::Interpreter::default;
   my $itp = Language::Expr::Interpreter::default->new;
   $itp->vars->{a} = 'A';
   say $itp->eval(q["$a b" . "c"]); # "A b c"
  
  =head1 DESCRIPTION
  
  Interprets Language::Expr expression. Some notes:
  
  =over 4
  
  =item * Uses L<boolean> module.
  
  =item * Follows Perl's notion of true and false.
  
  That is, this expression ' "" || "0" || 2 ' will result to 2 because
  Perl thinks "" and "0" are false.
  
  =back
  
  =for Pod::Coverage ^(rule|expr)_.+
  
  =head1 BUGS/TODOS
  
  Currently subexpression (map/grep/usort) doesn't work yet.
  
  =head1 ATTRIBUTES
  
  =head2 vars => {NAME => VAL, ...}
  
  Store variables.
  
  =head2 funcs => {NAME => CODEREF, ...}
  
  List known functions.
  
  =head2 level => INT
  
  Current recursion level.
  
  =head1 METHODS
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Language-Expr>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/sharyanto/perl-Language-Expr>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Language-Expr>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
LANGUAGE_EXPR_INTERPRETER_DEFAULT

    $main::fatpacked{"Language/Expr/Interpreter/dummy.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LANGUAGE_EXPR_INTERPRETER_DUMMY';
  package Language::Expr::Interpreter::dummy;
  
  our $DATE = '2016-07-03'; # DATE
  our $VERSION = '0.29'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  use Role::Tiny::With;
  use parent 'Language::Expr::Interpreter::Base';
  with 'Language::Expr::InterpreterRole';
  
  sub rule_pair_simple { }
  sub rule_pair_string { }
  sub rule_or_xor { }
  sub rule_ternary { }
  sub rule_and { }
  sub rule_bit_or_xor { }
  sub rule_bit_and { }
  sub rule_comparison3 { }
  sub rule_comparison { }
  sub rule_bit_shift { }
  sub rule_add { }
  sub rule_mult { }
  sub rule_unary { }
  sub rule_power { }
  sub rule_subscripting_var { }
  sub rule_subscripting_expr { }
  sub rule_array { }
  sub rule_hash { }
  sub rule_undef { }
  sub rule_squotestr { }
  sub rule_dquotestr { }
  sub rule_bool { }
  sub rule_num { }
  sub rule_var { }
  sub rule_func { }
  sub rule_func_map { }
  sub rule_func_grep { }
  sub rule_func_usort { }
  sub rule_parenthesis { }
  sub expr_preprocess { }
  sub expr_postprocess { }
  
  1;
  # ABSTRACT: Dummy interpreter for Language::Expr (used for testing)
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Language::Expr::Interpreter::dummy - Dummy interpreter for Language::Expr (used for testing)
  
  =head1 VERSION
  
  This document describes version 0.29 of Language::Expr::Interpreter::dummy (from Perl distribution Language-Expr), released on 2016-07-03.
  
  =head1 DESCRIPTION
  
  This interpreter does nothing. It is used only for testing the parser.
  
  =for Pod::Coverage ^(rule|expr)_.+
  
  =head1 ATTRIBUTES
  
  =head1 METHODS
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Language-Expr>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/sharyanto/perl-Language-Expr>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Language-Expr>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
LANGUAGE_EXPR_INTERPRETER_DUMMY

    $main::fatpacked{"Language/Expr/Interpreter/var_enumer.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LANGUAGE_EXPR_INTERPRETER_VAR_ENUMER';
  package Language::Expr::Interpreter::var_enumer;
  
  our $DATE = '2016-07-03'; # DATE
  our $VERSION = '0.29'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  use Role::Tiny::With;
  
  use parent 'Language::Expr::Interpreter::Base';
  with 'Language::Expr::InterpreterRole';
  
  sub _add_var {
      my ($self, $v) = @_;
      push @{$self->{_result}}, $v unless grep {$_ eq $v} @{$self->{_result}};
  }
  
  sub rule_pair_simple { }
  
  sub rule_pair_string { }
  
  sub rule_or_xor { }
  
  sub rule_ternary { }
  
  sub rule_and { }
  
  sub rule_bit_or_xor { }
  
  sub rule_bit_and { }
  
  sub rule_comparison3 { }
  
  sub rule_comparison { }
  
  sub rule_bit_shift { }
  
  sub rule_add { }
  
  sub rule_mult { }
  
  sub rule_unary { }
  
  sub rule_power { }
  
  sub rule_subscripting_var { }
  
  sub rule_subscripting_expr { }
  
  sub rule_array { }
  
  sub rule_hash { }
  
  sub rule_undef { }
  
  sub rule_squotestr { }
  
  sub rule_dquotestr {
      my ($self, %args) = @_;
      my $match = $args{match};
  
      for (@{ $match->{part} }) {
          # extract 'foo' from '${foo}'
          if (substr($_, 0, 2) eq '${') {
              $self->_add_var(substr($_, 2, length()-3));
          # extract 'foo' from '$foo'
          } elsif (substr($_, 0, 1) eq '$') {
              $self->_add_var(substr($_, 1, length()-1));
          }
      }
  }
  
  sub rule_bool { }
  
  sub rule_num { }
  
  sub rule_var {
      my ($self, %args) = @_;
      my $match = $args{match};
      $self->_add_var($match->{var});
  }
  
  sub rule_func { }
  
  sub rule_func_map {
  }
  
  sub rule_func_grep {
  }
  
  sub rule_func_usort {
  }
  
  sub rule_parenthesis {}
  
  sub expr_preprocess {
      my ($self, %args) = @_;
      $self->{_result} = [];
  }
  
  sub expr_postprocess {}
  
  sub eval {
      my ($self, $expr) = @_;
      my $res = Language::Expr::Parser::parse_expr($expr, $self);
      $self->{_result};
  }
  
  1;
  # ABSTRACT: Enumerate variables mentioned in Language::Expr expression
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Language::Expr::Interpreter::var_enumer - Enumerate variables mentioned in Language::Expr expression
  
  =head1 VERSION
  
  This document describes version 0.29 of Language::Expr::Interpreter::var_enumer (from Perl distribution Language-Expr), released on 2016-07-03.
  
  =for Pod::Coverage ^((rule|expr)_.+)$
  
  =head1 BUGS/TODOS
  
  Currently $_ in map/grep variables and $a & $b in usort are counted.
  
  =head1 ATTRIBUTES
  
  =head1 METHODS
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Language-Expr>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/sharyanto/perl-Language-Expr>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Language-Expr>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
LANGUAGE_EXPR_INTERPRETER_VAR_ENUMER

    $main::fatpacked{"Language/Expr/InterpreterRole.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LANGUAGE_EXPR_INTERPRETERROLE';
  package Language::Expr::InterpreterRole;
  
  our $DATE = '2016-07-03'; # DATE
  our $VERSION = '0.29'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  
  use Role::Tiny;
  use Role::Tiny::With;
  
  with 'Language::Expr::EvaluatorRole';
  requires 'eval';
  
  1;
  # ABSTRACT: Role for Language::Expr::Interpreter::*
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Language::Expr::InterpreterRole - Role for Language::Expr::Interpreter::*
  
  =head1 VERSION
  
  This document describes version 0.29 of Language::Expr::InterpreterRole (from Perl distribution Language-Expr), released on 2016-07-03.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Language-Expr>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/sharyanto/perl-Language-Expr>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Language-Expr>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
LANGUAGE_EXPR_INTERPRETERROLE

    $main::fatpacked{"Language/Expr/JS.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LANGUAGE_EXPR_JS';
  package Language::Expr::JS;
  
  our $DATE = '2016-07-03'; # DATE
  our $VERSION = '0.29'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  #use Log::Any qw($log);
  
  require Exporter;
  our @ISA       = qw(Exporter);
  our @EXPORT_OK = qw(eval_expr_js);
  
  sub _comment {
      my $str = shift;
      $str =~ s!^!// !g;
      $str;
  }
  
  sub eval_expr_js {
      require File::Temp;
      require JSON::MaybeXS;
      require Language::Expr::Compiler::js;
      require Nodejs::Util;
  
      my ($expr, $opts) = @_;
      $opts //= {};
  
      state $default_jsc = Language::Expr::Compiler::js->new;
  
      state $json = JSON::MaybeXS->new->allow_nonref;
  
      my $jsc = $opts->{js_compiler} // $default_jsc;
  
      # code to be sent to nodejs
      my $src = join(
          "",
          _comment("expr: $expr\n"),
          ($opts->{vars} ?
               _comment("declare vars\n") . join("", map { "let $_ = ".$json->encode($opts->{vars}{$_}).";\n" } sort keys %{$opts->{vars}})
               : ""),
          "console.log(JSON.stringify(",
          $jsc->compile($expr),
          "))",
      );
      my ($jsh, $jsfn) = File::Temp::tempfile();
      print $jsh $src;
      close($jsh) or die "Can't write JS code to file $jsfn: $!";
  
      my ($stdout, $stderr);
      Nodejs::Util::system_nodejs(
          {
              harmony_scoping => 1,
              capture_stdout => \$stdout,
              capture_stderr => \$stderr
          },
          $jsfn,
      );
      die "nodejs exists non-zero (".($? >> 8)."): $stderr" if $?;
      if ($stdout eq "undefined\n") {
          return undef;
      }
      $json->decode($stdout);
  }
  
  1;
  # ABSTRACT: Evaluate Expr JavaScript code
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Language::Expr::JS - Evaluate Expr JavaScript code
  
  =head1 VERSION
  
  This document describes version 0.29 of Language::Expr::JS (from Perl distribution Language-Expr), released on 2016-07-03.
  
  =head1 SYNOPSIS
  
   use Language::Expr::JS qw(eval_expr_js);
  
   say eval_expr_js('"a" . "b"'); # "ab"
  
  =head1 DESCRIPTION
  
  =head1 FUNCTIONS
  
  None exported by default.
  
  =head2 eval_expr_js($expr) => str
  
  Compile $expr to JavaScript code, then run the JavaScript code using Node.js,
  and return the result.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Language-Expr>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/sharyanto/perl-Language-Expr>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Language-Expr>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
LANGUAGE_EXPR_JS

    $main::fatpacked{"Language/Expr/Parser.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LANGUAGE_EXPR_PARSER';
  package Language::Expr::Parser;
  
  our $DATE = '2016-07-03'; # DATE
  our $VERSION = '0.29'; # VERSION
  
  use 5.010001;
  # now can't compile with this on?
  #use strict;
  #use warnings;
  
  use Regexp::Grammars;
  
  require Exporter;
  our @ISA = qw(Exporter);
  our @EXPORT_OK = qw(parse_expr);
  
  my $MAX_LEVELS = 3;
  
  # WARN: this is not thread-safe!?
  our $obj;
  
  sub parse_expr {
      my ($str, $obj_arg, $level) = @_;
  
      $level //= 0;
      die "Recursion level ($level) too deep (max $MAX_LEVELS)" if $level >= $MAX_LEVELS;
  
      # WARN: this is not thread-safe!?
      local $subexpr_stack = [];
  
      # create not just 1 but 0..$MAX_LEVELS-1 of grammar objects, each
      # for each recursion level (e.g. for map/grep/usort), fearing that
      # the grammar is not reentrant. but currently no luck yet, still
      # results in segfault/bus error.
  
      state $grammars = [ map { qr{
          ^\s*<answer>\s*$
  
          <rule: answer>
              <MATCH=or_xor>
  
  # precedence level: left     =>
          <rule: pair>
              <key=(\w++)> =\> <value=answer>
              (?{ $MATCH = $obj->rule_pair_simple(match=>\%MATCH) })
            | <key=squotestr> =\> <value=answer>
              (?{ $MATCH = $obj->rule_pair_string(match=>\%MATCH) })
            | <key=dquotestr> =\> <value=answer>
              (?{ $MATCH = $obj->rule_pair_string(match=>\%MATCH) })
  
  # precedence level: left     || // ^^
          <rule: or_xor>
              <[operand=ternary]> ** <[op=(\|\||//|\^\^)]>
              (?{
                  if ($MATCH{op} && @{ $MATCH{op} }) {
                      $MATCH = $obj->rule_or_xor(match=>\%MATCH);
                  } else {
                      $MATCH = $MATCH{operand}[0];
                  }
              })
  
  # precedence level: right    ?:
          <rule: ternary>
              <[operand=and]> ** <[op=(\?|:)]>
              (?{
                  if ($MATCH{op} && @{ $MATCH{op} }) {
                      unless (@{ $MATCH{op} } == 2 &&
                              $MATCH{op}[0] eq '?' &&
                              $MATCH{op}[1] eq ':') {
                          die "Invalid syntax for ternary, please use X ? Y : Z syntax";
                      }
                      $MATCH = $obj->rule_ternary(match=>\%MATCH);
                  } else {
                      $MATCH = $MATCH{operand}[0];
                  }
              })
  
  # precedence level: left     &&
          <rule: and>
              <[operand=bit_or_xor]> ** <[op=(&&)]>
              (?{
                  if ($MATCH{op} && @{ $MATCH{op} }) {
                      $MATCH = $obj->rule_and(match=>\%MATCH);
                  } else {
                      $MATCH = $MATCH{operand}[0];
                  }
              })
  
  # precedence level: left     | ^
          <rule: bit_or_xor>
              <[operand=bit_and]> ** <[op=(\||\^)]>
              (?{
                  if ($MATCH{op} && @{ $MATCH{op} }) {
                      $MATCH = $obj->rule_bit_or_xor(match=>\%MATCH);
                  } else {
                      $MATCH = $MATCH{operand}[0];
                  }
              })
  
  # precedence level: left     &
          <rule: bit_and>
              <[operand=comparison3]> ** <[op=(&)]>
              (?{
                  if ($MATCH{op} && @{ $MATCH{op} }) {
                      $MATCH = $obj->rule_bit_and(match=>\%MATCH);
                  } else {
                      $MATCH = $MATCH{operand}[0];
                  }
              })
  
              # NOTE: \x3c = "<", \x3e = ">"
  
  # precedence level: nonassoc (currently the grammar says assoc) <=> cmp
          <rule: comparison3>
              <[operand=comparison]> ** <[op=(\x3c=\x3e|cmp)]>
              (?{
                  if ($MATCH{op} && @{ $MATCH{op} }) {
                      $MATCH = $obj->rule_comparison3(match=>\%MATCH);
                  } else {
                      $MATCH = $MATCH{operand}[0];
                  }
              })
  
  # precedence level: left == != eq ne < > <= >= ge gt le lt
          <rule: comparison>
              <[operand=bit_shift]> ** <[op=(==|!=|eq|ne|\x3c=?|\x3e=?|lt|gt|le|ge)]>
              (?{
                  if ($MATCH{op} && @{ $MATCH{op} }) {
                      $MATCH = $obj->rule_comparison(match=>\%MATCH);
                  } else {
                      $MATCH = $MATCH{operand}[0];
                  }
              })
  
  # precedence level: left     << >>
          <rule: bit_shift>
              <[operand=add]> ** <[op=(\x3c\x3c|\x3e\x3e)]>
              (?{
                  if ($MATCH{op} && @{ $MATCH{op} }) {
                      $MATCH = $obj->rule_bit_shift(match=>\%MATCH);
                  } else {
                      $MATCH = $MATCH{operand}[0];
                  }
              })
  
  # precedence level: left     + - .
          <rule: add>
              <[operand=mult]> ** <[op=(\+|-|\.)]>
              (?{
                  if ($MATCH{op} && @{ $MATCH{op} }) {
                      $MATCH = $obj->rule_add(match=>\%MATCH);
                  } else {
                      $MATCH = $MATCH{operand}[0];
                  }
              })
  
  # precedence level: left     * / % x
          <rule: mult>
              <[operand=unary]> ** <[op=(\*|/|%|x)]>
              (?{
                  if ($MATCH{op} && @{ $MATCH{op} }) {
                      $MATCH = $obj->rule_mult(match=>\%MATCH);
                  } else {
                      $MATCH = $MATCH{operand}[0];
                  }
              })
  
  # precedence level: right    ! ~ unary+ unary-
          <rule: unary>
              <[op=(!|~|\+|-)]>* <operand=power>
              (?{
                  if ($MATCH{op} && @{ $MATCH{op} }) {
                      $MATCH = $obj->rule_unary(match=>\%MATCH);
                  } else {
                      $MATCH = $MATCH{operand};
                  }
              })
  
  # precedence level: right    **
          <rule: power>
              <[operand=subscripting]> ** <[op=(\*\*)]>
              (?{
                  if ($MATCH{op} && @{ $MATCH{op} }) {
                      $MATCH = $obj->rule_power(match=>\%MATCH);
                  } else {
                      $MATCH = $MATCH{operand}[0];
                  }
              })
  
  # precedence level: left    hash[s], array[i]
          <rule: subscripting>
              <operand=var0> <[subscript]>*
              (?{
                  if ($MATCH{subscript} && @{ $MATCH{subscript} }) {
                      $MATCH = $obj->rule_subscripting_var(match=>\%MATCH);
                  } else {
                      $MATCH = $MATCH{operand};
                  }
              })
            | <operand=term> <[subscript]>*
              (?{
                  if ($MATCH{subscript} && @{ $MATCH{subscript} }) {
                      $MATCH = $obj->rule_subscripting_expr(match=>\%MATCH);
                  } else {
                      $MATCH = $MATCH{operand};
                  }
              })
  
          <rule: subscript>
                \[ <MATCH=term> \]
  
  # precedence level: left     term (variable, str/num literals, func(), (paren))
          <rule: term>
              <MATCH=func>
            | <MATCH=var0>
            | <MATCH=str0>
            | <MATCH=undef>
            | <MATCH=num0>
            | <MATCH=bool0>
            | <MATCH=array>
            | <MATCH=hash>
            | \( <answer> \)
              (?{ $MATCH = $obj->rule_parenthesis(match=>\%MATCH) // $MATCH{answer} })
  
          <rule: array>
              \[ \]
              (?{ $MATCH = $obj->rule_array(match=>{element=>[]}) })
            | \[ <[element=answer]> ** (,) \]
              (?{ $MATCH = $obj->rule_array(match=>\%MATCH) })
  
          <rule: hash>
              \{ \}
              (?{ $MATCH = $obj->rule_hash(match=>{pair=>[]}) })
            | \{ <[pair]> ** (,) \}
              (?{ $MATCH = $obj->rule_hash(match=>\%MATCH) })
  
          <token: undef>
              undef
              (?{ $MATCH = $obj->rule_undef() })
  
          <token: bool0>
              <bool=(true|false)>
              (?{ $MATCH = $obj->rule_bool(match=>\%MATCH) })
  
          <token: num0>
              <sign0a=([+-]?+)> 0x <num0a=([0-9A-Fa-f]++)>
              (?{ $MATCH = $obj->rule_num(match=>{num=>
                  ($MATCH{sign0a} eq '-' ? -1:1) * hex($MATCH{num0a})}) })
            | <sign0b=([+-]?+)> 0o <num0b=([0-7]++)>
              (?{ $MATCH = $obj->rule_num(match=>{num=>
                  ($MATCH{sign0b} eq '-' ? -1:1) * oct($MATCH{num0b})}) })
            | <sign0c=([+-]?+)> 0b <num0c=([0-1]++)>
              (?{ $MATCH = $obj->rule_num(match=>{num=>
                  ($MATCH{sign0c} eq '-' ? -1:1) * oct("0b".$MATCH{num0c})}) })
            | <num0c=( [+-]?\d++(?:\.\d++)?+ | inf | nan)>
              (?{ $MATCH = $obj->rule_num(match=>{num=>$MATCH{num0c}}) })
  
          <rule: str0>
              <MATCH=squotestr>
            | <MATCH=dquotestr>
  
          <token: squotestr>
              '<[part=(\\\\|\\'|\\|[^\\']++)]>*'
              (?{ $MATCH = $obj->rule_squotestr(match=>\%MATCH) })
  
          <token: dquotestr>
              "<[part=([^"\044\\]++|\$\.\.?|\$\w+|\$\{[^\}]+\}|\\\\|\\'|\\"|\\[tnrfbae\$]|\\[0-7]{1,3}|\\x[0-9A-Fa-f]{1,2}|\\x\{[0-9A-Fa-f]{1,4}\}|\\)]>*"
              (?{ $MATCH = $obj->rule_dquotestr(match=>\%MATCH) })
  
          <rule: var0>
              \$ <var=(\w++(?:::\w+)*+)>
              (?{ $MATCH = $obj->rule_var(match=>\%MATCH) })
            | \$ \{ <var=([^\}]++)> \}
              (?{ $MATCH = $obj->rule_var(match=>\%MATCH) })
  
          <rule: func>
              <func_name=([A-Za-z_]\w*+)> \( \)
              (?{ $MATCH = $obj->rule_func(match=>{func_name=>$MATCH{func_name}, args=>[]}) })
            | <func_name=(map|grep|usort)> \( \{ <expr=answer> \} (?{ push @$subexpr_stack, $CONTEXT }), <input_array=answer> \)
              (?{ my $meth = "rule_func_$MATCH{func_name}";
                  $MATCH = $obj->$meth(match=>{expr=>pop(@$subexpr_stack), array=>$MATCH{input_array}}) })
            | <func_name=([A-Za-z_]\w*+)> \( <[args=answer]> ** (,) \)
              (?{ $MATCH = $obj->rule_func(match=>\%MATCH) })
  
      }xms } 0..($MAX_LEVELS-1)];
  
      $obj = $obj_arg;
      $obj_arg->expr_preprocess(string_ref => \$str, level => $level);
      #print "DEBUG: Parsing expression `$str` with grammars->[$level] ...\n";
      die "Invalid syntax in expression `$str`" unless $str =~ $grammars->[$level];
      $obj_arg->expr_postprocess(result => $/{answer});
  }
  
  1;
  # ABSTRACT: Parse Language::Expr expression
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Language::Expr::Parser - Parse Language::Expr expression
  
  =head1 VERSION
  
  This document describes version 0.29 of Language::Expr::Parser (from Perl distribution Language-Expr), released on 2016-07-03.
  
  =head1 KNOWN BUGS
  
  =over 4
  
  =item * Ternary operator is not chainable yet.
  
  =back
  
  =head1 METHODS
  
  =head2 parse_expr($str, $obj)
  
  Parse expression in $str. Will call various rule_*() methods in $obj.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Language-Expr>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/sharyanto/perl-Language-Expr>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Language-Expr>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
LANGUAGE_EXPR_PARSER

    $main::fatpacked{"Lingua/EN/Numbers/Ordinate.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LINGUA_EN_NUMBERS_ORDINATE';
  package Lingua::EN::Numbers::Ordinate;
  $Lingua::EN::Numbers::Ordinate::VERSION = '1.04';
  # ABSTRACT: go from cardinal number (3) to ordinal ("3rd")
  
  use 5.006;
  use strict;
  use warnings;
  require Exporter;
  
  our @ISA        = qw/ Exporter  /;
  our @EXPORT     = qw/ ordinate  /;
  our @EXPORT_OK  = qw/ ordsuf th /;
  
  ###########################################################################
  
  =head1 NAME
  
  Lingua::EN::Numbers::Ordinate -- go from cardinal number (3) to ordinal ("3rd")
  
  =head1 SYNOPSIS
  
    use Lingua::EN::Numbers::Ordinate;
    print ordinate(4), "\n";
     # prints 4th
    print ordinate(-342), "\n";
     # prints -342nd
  
    # Example of actual use:
    ...
    for(my $i = 0; $i < @records; $i++) {
      unless(is_valid($record[$i]) {
        warn "The ", ordinate($i), " record is invalid!\n"; 
        next;
      }
      ...
    }
  
  =head1 DESCRIPTION
  
  There are two kinds of numbers in English -- cardinals (1, 2, 3...), and
  ordinals (1st, 2nd, 3rd...).  This library provides functions for giving
  the ordinal form of a number, given its cardinal value.
  
  =head1 FUNCTIONS
  
  =over
  
  =item ordinate(SCALAR)
  
  Returns a string consisting of that scalar's string form, plus the
  appropriate ordinal suffix.  Example: C<ordinate(23)> returns "23rd".
  
  As a special case, C<ordinate(undef)> and C<ordinate("")> return "0th",
  not "th".
  
  This function is exported by default.
  
  =item th(SCALAR)
  
  Merely an alias for C<ordinate>, but not exported by default.
  
  =item ordsuf(SCALAR)
  
  Returns just the appropriate ordinal suffix for the given scalar
  numeric value.  This is what C<ordinate> uses to actually do its
  work.  For example, C<ordsuf(3)> is "rd". 
  
  Not exported by default.
  
  =back
  
  The above functions are all prototyped to take a scalar value,
  so C<ordinate(@stuff)> is the same as C<ordinate(scalar @stuff)>.
  
  =head1 CAVEATS
  
  * Note that this library knows only about numbers, not number-words.
  C<ordinate('seven')> might just as well be C<ordinate('superglue')>
  or C<ordinate("\x1E\x9A")> -- you'll get the fallthru case of the input
  string plus "th".
  
  * As is unavoidable, C<ordinate(0256)> returns "174th" (because ordinate
  sees the value 174). Similarly, C<ordinate(1E12)> returns
  "1000000000000th".  Returning "trillionth" would be nice, but that's an
  awfully atypical case.
  
  * Note that this library's algorithm (as well as the basic concept
  and implementation of ordinal numbers) is totally language specific.
  
  To pick a trivial example, consider that in French, 1 ordinates
  as "1ier", whereas 41 ordinates as "41ieme".
  
  =head1 STILL NOT SATISFIED?
  
  Bored of this...?
  
    use Lingua::EN::Numbers::Ordinate qw(ordinate th);
    ...
    print th($n), " entry processed...\n";
    ...
  
  Try this bit of lunacy:
  
    {
      my $th_object;
      sub _th () { $th_object }
  
      package Lingua::EN::Numbers::Ordinate::Overloader;
      my $x; # Gotta have something to bless.
      $th_object = bless \$x; # Define the object now, which _th returns
      use Carp ();
      use Lingua::EN::Numbers::Ordinate ();
      sub overordinate {
        Carp::croak "_th should be used only as postfix!" unless $_[2];
        Lingua::EN::Numbers::Ordinate::ordinate($_[1]);
      }
      use overload '&' => \&overordinate;
    }
  
  Then you get to do:
  
    print 3 & _th, "\n";
      # prints "3rd"
    
    print 1 + 2 & _th, "\n";
      # prints "3rd" too!
      # Because of the precedence of & !
    
    print _th & 3, "\n";
      # dies with: "th should be used only as postfix!"
  
  Kooky, isn't it?  For more delightful deleria like this, see
  Damian Conway's I<Object Oriented Perl> from Manning Press.
  
  Kinda makes you like C<th(3)>, doesn't it?
  
  =head1 SEE ALSO
  
  L<Lingua::EN::Inflect> provides an C<ORD> function,
  which returns the ordinal form of a cardinal number.
  
  L<Lingua::EN::Number::IsOrdinal> provides an C<is_ordinal>
  function, which returns true if passed an ordinal number.
  
  =head1 REPOSITORY
  
  L<https://github.com/neilbowers/Lingua-EN-Numbers-Ordinate>
  
  =head1 COPYRIGHT
  
  Copyright (c) 2000 Sean M. Burke.  All rights reserved.
  
  This library is free software; you can redistribute it and/or
  modify it under the same terms as Perl itself.
  
  =head1 AUTHOR
  
  Sean M. Burke C<sburke@cpan.org>
  
  =cut
  
  ###########################################################################
  
  sub ordsuf ($) {
    return 'th' if not(defined($_[0])) or not( 0 + $_[0] );
     # 'th' for undef, 0, or anything non-number.
    my $n = abs($_[0]);  # Throw away the sign.
    return 'th' unless $n == int($n); # Best possible, I guess.
    $n %= 100;
    return 'th' if $n == 11 or $n == 12 or $n == 13;
    $n %= 10;
    return 'st' if $n == 1; 
    return 'nd' if $n == 2;
    return 'rd' if $n == 3;
    return 'th';
  }
  
  sub ordinate ($) {
    my $i = $_[0] || 0;
    return $i . ordsuf($i);
  }
  
  no warnings 'all';
  *th = \&ordinate; # correctly copies the prototype, too.
  
  ###########################################################################
  1;
  
  __END__
LINGUA_EN_NUMBERS_ORDINATE

    $main::fatpacked{"Lingua/EN/PluralToSingular.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LINGUA_EN_PLURALTOSINGULAR';
  package Lingua::EN::PluralToSingular;
  use warnings;
  use strict;
  require Exporter;
  our @ISA = qw(Exporter);
  our @EXPORT_OK = qw/to_singular is_plural/;
  our $VERSION = '0.21';
  
  # Irregular plurals.
  
  # References:
  # http://www.macmillandictionary.com/thesaurus-category/british/Irregular-plurals
  # http://web2.uvcs.uvic.ca/elc/studyzone/330/grammar/irrplu.htm
  # http://www.scribd.com/doc/3271143/List-of-100-Irregular-Plural-Nouns-in-English
  
  # This mixes latin/greek plurals and anglo-saxon together. It may be
  # desirable to split things like corpora and genera from "feet" and
  # "geese" at some point.
  
  my %irregular = (qw/
      analyses analysis
      brethren brother
      children child
      corpora corpus
      craftsmen craftsman
      crises crisis
      criteria criterion
      curricula curriculum
      feet foot
      fungi fungus
      geese goose
      genera genus
      gentlemen gentleman
      indices index
      lice louse
      matrices matrix
      memoranda memorandum
      men man
      mice mouse
      monies money
      neuroses neurosis
      nuclei nucleus
      oases oasis
      oxen ox
      pence penny
      people person
      phenomena phenomenon
      quanta quantum
      strata stratum
      teeth tooth
      testes testis
      these this
      theses thesis
      those that
      women woman
  ad-men ad-man
  admen adman
  aircraftmen aircraftman
  airmen airman
  airwomen airwoman
  alaskamen alaskaman
  aldermen alderman
  anchormen anchorman
  ape-men ape-man
  assemblymen assemblyman
  backwoodsmen backwoodsman
  bandsmen bandsman
  barmen barman
  barrow-men barrow-man
  batmen batman
  batsmen batsman
  beggarmen beggarman
  beggarwomen beggarwoman
  behmen behman
  boatmen boatman
  bogeymen bogeyman
  bowmen bowman
  brakemen brakeman
  bushmen bushman
  businessmen businessman
  businesswomen businesswoman
  busmen busman
  byre-men byre-man
  cabmen cabman
  cameramen cameraman
  carmen carman
  cattlemen cattleman
  cavalrymen cavalryman
  cavemen caveman
  chairmen chairman
  chairwomen chairwoman
  chapmen chapman
  charwomen charwoman
  chessmen chessman
  chinamen chinaman
  churchmen churchman
  clansmen clansman
  classmen classman
  clemen cleman
  clergymen clergyman
  coachmen coachman
  coalmen coalman
  cognomen cognoman
  con-men con-man
  congressmen congressman
  congresswomen congresswoman
  councilmen councilman
  councilwomen councilwoman
  countrymen countryman
  countrywomen countrywoman
  cowmen cowman
  cracksmen cracksman
  craftsmen craftsman
  cragsmen cragsman
  crewmen crewman
  cyclamen cyclaman
  dairymen dairyman
  dalesmen dalesman
  doormen doorman
  draftsmen draftsman
  draughtsmen draughtsman
  dustmen dustman
  dutchmen dutchman
  englishmen englishman
  englishwomen englishwoman
  ex-servicemen ex-serviceman
  excisemen exciseman
  fellow-men fellow-man
  ferrymen ferryman
  fieldsmen fieldsman
  firemen fireman
  fishermen fisherman
  flagmen flagman
  footmen footman
  foremen foreman
  forewomen forewoman
  freedmen freedman
  freemen freeman
  frenchmen frenchman
  frenchwomen frenchwoman
  freshmen freshman
  frogmen frogman
  frontiersmen frontiersman
  g-men g-man
  gentlemen gentleman
  gentlewomen gentlewoman
  germen german
  god-men god-man
  gombeen-men gombeen-man
  groundsmen groundsman
  guardsmen guardsman
  gunmen gunman
  handymen handyman
  hangmen hangman
  harmen harman
  he-men he-man
  headmen headman
  helmsmen helmsman
  hemmen hemman
  henchmen henchman
  herdsmen herdsman
  highwaymen highwayman
  horsemen horseman
  horsewomen horsewoman
  housemen houseman
  huntsmen huntsman
  husbandmen husbandman
  hymen hyman
  icemen iceman
  indiamen indiaman
  infantrymen infantryman
  irishmen irishman
  irishwomen irishwoman
  jazzmen jazzman
  journeymen journeyman
  jurymen juryman
  kinmen kinman
  kinsmen kinsman
  kinswomen kinswoman
  klansmen klansman
  landsmen landsman
  laundrymen laundryman
  laundrywomen laundrywoman
  lawmen lawman
  laymen layman
  liegemen liegeman
  liftmen liftman
  linemen lineman
  linesmen linesman
  linkmen linkman
  liverymen liveryman
  lobstermen lobsterman
  longshoremen longshoreman
  lumbermen lumberman
  madmen madman
  madwomen madwoman
  mailmen mailman
  marksmen marksman
  medicine-men medicine-man
  men man
  merchantmen merchantman
  mermen merman
  middlemen middleman
  midshipmen midshipman
  militiamen militiaman
  milkmen milkman
  minutemen minuteman
  motormen motorman
  muffin-men muffin-man
  musclemen muscleman
  needlewomen needlewoman
  newsmen newsman
  newspapermen newspaperman
  newswomen newswoman
  night-watchmen night-watchman
  noblemen nobleman
  nomen noman
  norsemen norseman
  northmen northman
  nurserymen nurseryman
  oarsmen oarsman
  oarswomen oarswoman
  oehmen oehman
  oilmen oilman
  ombudsmen ombudsman
  orangemen orangeman
  pantrymen pantryman
  patrolmen patrolman
  pitchmen pitchman
  pitmen pitman
  placemen placeman
  plainsmen plainsman
  ploughmen ploughman
  pointsmen pointsman
  policemen policeman
  policewomen policewoman
  postmen postman
  potmen potman
  pressmen pressman
  property-men property-man
  quarrymen quarryman
  raftsmen raftsman
  ragmen ragman
  railwaymen railwayman
  repairmen repairman
  riflemen rifleman
  roadmen roadman
  roundsmen roundsman
  salarymen salaryman
  salesmen salesman
  saleswomen saleswoman
  salmen salman
  sandwichmen sandwichman
  schoolmen schoolman
  scotchmen scotchman
  scotchwomen scotchwoman
  scotsmen scotsman
  scotswomen scotswoman
  seamen seaman
  seedsmen seedsman
  servicemen serviceman
  showmen showman
  sidesmen sidesman
  signalmen signalman
  snowmen snowman
  specimen speciman
  spokesmen spokesman
  spokeswomen spokeswoman
  sportsmen sportsman
  stablemen stableman
  stamen staman
  stammen stamman
  statesmen statesman
  steersmen steersman
  supermen superman
  superwomen superwoman
  switchmen switchman
  swordsmen swordsman
  t-men t-man
  tallymen tallyman
  taxmen taxman
  townsmen townsman
  tradesmen tradesman
  trainmen trainman
  trenchermen trencherman
  tribesmen tribesman
  turkmen turkman
  tutankhamen tutankhaman
  underclassmen underclassman
  vestrymen vestryman
  vonallmen vonallman
  washerwomen washerwoman
  watchmen watchman
  watermen waterman
  weathermen weatherman
  welshmen welshman
  women woman
  woodmen woodman
  woodsmen woodsman
  workmen workman
  yachtsmen yachtsman
  yeomen yeoman
  /);
  
  # Words ending in ves need care, since the ves may become "f" or "fe".
  
  # References:
  # http://www.macmillandictionary.com/thesaurus-category/british/Irregular-plurals
  
  my %ves = (qw/
      calves calf
      dwarves dwarf
      elves elf
      halves half
      knives knife
      leaves leaf
      lives life
      loaves loaf
      scarves scarf
      sheaves sheaf
      shelves shelf
      wharves wharf 
      wives wife
      wolves wolf
  /);
  
  # A dictionary of plurals.
  
  my %plural = (
      # Words ending in "us" which are plural, in contrast to words like
      # "citrus" or "bogus".
      'menus' => 'menu',
      'buses' => 'bus',
      %ves,
      %irregular,
  );
  
  # A store of words which are the same in both singular and plural.
  
  my @no_change = qw/
                        deer
                        ides
                        fish
                        means
                        offspring
                        series
                        sheep
                        species
                    /;
  
  @plural{@no_change} = @no_change;
  
  # A store of words which look like plurals but are not.
  
  # References:
  
  # http://wiki.answers.com/Q/What_are_some_examples_of_singular_nouns_ending_in_S
  # http://virtuallinguist.typepad.com/the_virtual_linguist/2009/10/singular-nouns-ending-in-s.html
  
  my @not_plural = (qw/
  Aries
  Charles
  Gonzales 
  Hades 
  Hercules 
  Hermes 
  Holmes 
  Hughes 
  Ives 
  Jacques 
  James 
  Keyes 
  Mercedes 
  Naples 
  Oates 
  Raines 
  Texas
  athletics
  bogus
  bus
  cactus
  cannabis
  caries
  chaos
  citrus
  clothes
  corps
  corpus
  devious
  dias
  facies
  famous
  hippopotamus
  homunculus
  iris
  lens
  mathematics
  metaphysics
  metropolis
  mews
  minus
  miscellaneous
  molasses
  mrs
  narcissus
  news
  octopus
  ourselves
  papyrus
  perhaps
  physics
  platypus
  plus
  previous
  pus
  rabies
  scabies
  sometimes
  stylus
  themselves
  this
  thus
  various
  yes
  nucleus
  synchronous
  /);
  
  my %not_plural;
  
  @not_plural{@not_plural} = (1) x @not_plural;
  
  # A store of words which end in "oe" and whose plural ends in "oes".
  
  # References
  # http://www.scrabblefinder.com/ends-with/oe/
  
  # Also used
  
  # perl -n -e 'print if /oe$/' < /usr/share/dict/words
  
  my @oes = (qw/
  canoes
  does
  foes
  gumshoes
  hoes
  horseshoes
  oboes
  shoes
  snowshoes
  throes
  toes
  /);
  
  my %oes;
  
  @oes{@oes} = (1) x @oes;
  
  # A store of words which end in "ie" and whose plural ends in "ies".
  
  # References:
  # http://www.scrabblefinder.com/ends-with/ie/
  # (most of the words are invalid, the above list was manually searched
  # for useful words).
  
  # Also get a good list using
  
  # perl -n -e 'print if /ie$/' < /usr/share/dict/words 
  
  # There are too many obscure words there though.
  
  # Also, I'm deliberately not including "Bernie" and "Bessie" since the
  # plurals are rare I think. 
  
  my @ies = (qw/
  Aussies
  Valkryies
  aunties
  bogies
  brownies
  calories
  charlies
  coolies
  coteries
  curies
  cuties
  dies
  genies
  goalies
  kilocalories
  lies
  magpies
  menagerie
  movies
  neckties
  pies
  porkpies
  prairies
  quickies
  reveries
  rookies
  sorties
  stogies
  talkies
  ties
  zombies
  /);
  
  my %ies;
  
  @ies{@ies} = (1) x @ies;
  
  # Words which end in -se, so that we want the singular to change from
  # -ses to -se. This also contains verbs like "deceases", so that they
  # don't trigger spell checker errors.
  
  my @ses = (qw/
  automates
  bases
  cases
  causes
  ceases
  closes
  cornflakes
  creases
  databases
  deceases
  flakes
  horses
  increases
  mates
  parses
  purposes
  races
  releases
  tenses
  /);
  
  my %ses;
  @ses{@ses} = (1) x @ses;
  # A regular expression which matches the end of words like "dishes"
  # and "sandwiches". $1 is a capture which contains the part of the
  # word which should be kept in a substitution.
  
  my $es_re = qr/([^aeiou]s|ch|sh)es$/;
  
  # Plurals ending -i, singular is either -us, -o or something else
  # See https://en.wiktionary.org/wiki/Category:English_irregular_plurals_ending_in_%22-i%22
  
  # -i to -us
  my @i_to_us = (qw/
  abaci
  abaculi
  acanthi
  acini
  alumni
  anthocauli
  bacilli
  baetuli
  cacti
  calculi
  calli
  catheti
  emboli
  emeriti
  esophagi
  foci
  foeti
  fumuli
  fungi
  gonococci
  hippopotami
  homunculi
  incubi
  loci
  macrofungi
  macronuclei
  naevi
  nuclei
  obeli
  octopi
  oeconomi
  oesophagi
  panni
  periœci
  phocomeli
  phoeti
  platypi
  polypi
  precunei
  radii
  rhombi
  sarcophagi
  solidi
  stimuli
  succubi
  syllabi
  thesauri
  thrombi
  tori
  trophi
  uteri
  viri
  virii
  xiphopagi
  zygomatici
  /);
  
  my %i_to_us;
  @i_to_us{@i_to_us} = (1) x @i_to_us;
  
  # -i to -o
  my @i_to_o = (qw/
      alveoli
      ghetti
      manifesti
      ostinati
      pianissimi
      scenarii
      stiletti
      torsi
  /);
  
  my %i_to_o;
  @i_to_o{@i_to_o} = (1) x @i_to_o;
  
  # -i to something else
  
  my %i_to_other = (
      improvisatori => 'improvisatore',
      rhinoceri => 'rhinoceros',
      scaloppini => 'scaloppine'
  );
  
  # See documentation below.
  
  sub to_singular
  {
      my ($word) = @_;
      # The return value.
      my $singular = $word;
      if (! $not_plural{$word}) {
          # The word is not in the list of exceptions.
          if ($plural{$word}) {
              # The word has an irregular plural, like "children", or
              # "geese", so look up the singular in the table.
              $singular = $plural{$word};
          }
          elsif ($word =~ /s$/) {
              # The word ends in "s".
              if ($word =~ /'s$/) {
              # report's, etc.
              ;
              }
              elsif (length ($word) <= 2) {
              # is, as, letter s, etc.
              ;
              }
              elsif ($word =~ /ss$/) {
              # useless, etc.
              ;
              }
              elsif ($word =~ /sis$/) {
              # basis, dialysis etc.
              ;
              }
              elsif ($word =~ /ies$/) {
                  # The word ends in "ies".
                  if ($ies{$word}) {
                      # Lies -> lie
                      $singular =~ s/ies$/ie/;
                  }
                  else {
                      # Fries -> fry
                      $singular =~ s/ies$/y/;
                  }
              }
              elsif ($word =~ /oes$/) {
                  # The word ends in "oes".
                  if ($oes{$word}) {
                      # Toes -> toe
                      $singular =~ s/oes$/oe/;
                  }
                  else {
                      # Potatoes -> potato
                      $singular =~ s/oes$/o/;
                  }
              }
              elsif ($word =~ /xes$/) {
                  # The word ends in "xes".
  		        $singular =~ s/xes$/x/;
              }
              elsif ($word =~ /ses$/) {
                  if ($ses{$word}) {
                      $singular =~ s/ses$/se/;
                  }
                  else {
                      $singular =~ s/ses$/s/;
                  }
  	        }
              elsif ($word =~ $es_re) {
                  # Sandwiches -> sandwich
                  # Dishes -> dish
                  $singular =~ s/$es_re/$1/;
              }
              else {
                  # Now the program has checked for every exception it
                  # can think of, so it assumes that it is OK to remove
                  # the "s" from the end of the word.
                  $singular =~ s/s$//;
              }
          }
          elsif ($word =~ /i$/) {
              if ($i_to_us{$word}) {
                  $singular =~ s/i$/us/;
              }
              elsif ($i_to_o{$word}) {
                  $singular =~ s/i$/o/;
              }
              if ($i_to_other{$word}) {
                  $singular = $i_to_other{$word};
              }
          }
  
      }
      return $singular;
  }
  
  sub is_plural
  {
      my ($word) = @_;
      my $singular = to_singular ($word);
      my $is_plural;
      if ($singular ne $word) {
  	$is_plural = 1;
      }
      elsif ($plural{$singular} && $plural{$singular} eq $singular) {
  	$is_plural = 1;
      }
      else {
  	$is_plural = 0;
      }
      return $is_plural;
  }
  
  1;
LINGUA_EN_PLURALTOSINGULAR

    $main::fatpacked{"Locale/RecodeData/CP10007.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_CP10007';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for CP10007.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::CP10007;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0x0410,
      0x0411,
      0x0412,
      0x0413,
      0x0414,
      0x0415,
      0x0416,
      0x0417,
      0x0418,
      0x0419,
      0x041a,
      0x041b,
      0x041c,
      0x041d,
      0x041e,
      0x041f,
      0x0420,
      0x0421,
      0x0422,
      0x0423,
      0x0424,
      0x0425,
      0x0426,
      0x0427,
      0x0428,
      0x0429,
      0x042a,
      0x042b,
      0x042c,
      0x042d,
      0x042e,
      0x042f,
      0x2020,
      0x00b0,
      0x00a2,
      0x00a3,
      0x00a7,
      0x2022,
      0x00b6,
      0x0406,
      0x00ae,
      0x00a9,
      0x2122,
      0x0402,
      0x0452,
      0x2260,
      0x0403,
      0x0453,
      0x221e,
      0x00b1,
      0x2264,
      0x2265,
      0x0456,
      0x00b5,
      0x0491,
      0x0408,
      0x0404,
      0x0454,
      0x0407,
      0x0457,
      0x0409,
      0x0459,
      0x040a,
      0x045a,
      0x0458,
      0x0405,
      0x00ac,
      0x221a,
      0x0192,
      0x2248,
      0x2206,
      0x00ab,
      0x00bb,
      0x2026,
      0x00a0,
      0x040b,
      0x045b,
      0x040c,
      0x045c,
      0x0455,
      0x2013,
      0x2014,
      0x201c,
      0x201d,
      0x2018,
      0x2019,
      0x00f7,
      0x201e,
      0x040e,
      0x045e,
      0x040f,
      0x045f,
      0x2116,
      0x0401,
      0x0451,
      0x044f,
      0x0430,
      0x0431,
      0x0432,
      0x0433,
      0x0434,
      0x0435,
      0x0436,
      0x0437,
      0x0438,
      0x0439,
      0x043a,
      0x043b,
      0x043c,
      0x043d,
      0x043e,
      0x043f,
      0x0440,
      0x0441,
      0x0442,
      0x0443,
      0x0444,
      0x0445,
      0x0446,
      0x0447,
      0x0448,
      0x0449,
      0x044a,
      0x044b,
      0x044c,
      0x044d,
      0x044e,
      0x00a4,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xd0\x90",
      "\xd0\x91",
      "\xd0\x92",
      "\xd0\x93",
      "\xd0\x94",
      "\xd0\x95",
      "\xd0\x96",
      "\xd0\x97",
      "\xd0\x98",
      "\xd0\x99",
      "\xd0\x9a",
      "\xd0\x9b",
      "\xd0\x9c",
      "\xd0\x9d",
      "\xd0\x9e",
      "\xd0\x9f",
      "\xd0\xa0",
      "\xd0\xa1",
      "\xd0\xa2",
      "\xd0\xa3",
      "\xd0\xa4",
      "\xd0\xa5",
      "\xd0\xa6",
      "\xd0\xa7",
      "\xd0\xa8",
      "\xd0\xa9",
      "\xd0\xaa",
      "\xd0\xab",
      "\xd0\xac",
      "\xd0\xad",
      "\xd0\xae",
      "\xd0\xaf",
      "\xe2\x80\xa0",
      "\xc2\xb0",
      "\xc2\xa2",
      "\xc2\xa3",
      "\xc2\xa7",
      "\xe2\x80\xa2",
      "\xc2\xb6",
      "\xd0\x86",
      "\xc2\xae",
      "\xc2\xa9",
      "\xe2\x84\xa2",
      "\xd0\x82",
      "\xd1\x92",
      "\xe2\x89\xa0",
      "\xd0\x83",
      "\xd1\x93",
      "\xe2\x88\x9e",
      "\xc2\xb1",
      "\xe2\x89\xa4",
      "\xe2\x89\xa5",
      "\xd1\x96",
      "\xc2\xb5",
      "\xd2\x91",
      "\xd0\x88",
      "\xd0\x84",
      "\xd1\x94",
      "\xd0\x87",
      "\xd1\x97",
      "\xd0\x89",
      "\xd1\x99",
      "\xd0\x8a",
      "\xd1\x9a",
      "\xd1\x98",
      "\xd0\x85",
      "\xc2\xac",
      "\xe2\x88\x9a",
      "\xc6\x92",
      "\xe2\x89\x88",
      "\xe2\x88\x86",
      "\xc2\xab",
      "\xc2\xbb",
      "\xe2\x80\xa6",
      "\xc2\xa0",
      "\xd0\x8b",
      "\xd1\x9b",
      "\xd0\x8c",
      "\xd1\x9c",
      "\xd1\x95",
      "\xe2\x80\x93",
      "\xe2\x80\x94",
      "\xe2\x80\x9c",
      "\xe2\x80\x9d",
      "\xe2\x80\x98",
      "\xe2\x80\x99",
      "\xc3\xb7",
      "\xe2\x80\x9e",
      "\xd0\x8e",
      "\xd1\x9e",
      "\xd0\x8f",
      "\xd1\x9f",
      "\xe2\x84\x96",
      "\xd0\x81",
      "\xd1\x91",
      "\xd1\x8f",
      "\xd0\xb0",
      "\xd0\xb1",
      "\xd0\xb2",
      "\xd0\xb3",
      "\xd0\xb4",
      "\xd0\xb5",
      "\xd0\xb6",
      "\xd0\xb7",
      "\xd0\xb8",
      "\xd0\xb9",
      "\xd0\xba",
      "\xd0\xbb",
      "\xd0\xbc",
      "\xd0\xbd",
      "\xd0\xbe",
      "\xd0\xbf",
      "\xd1\x80",
      "\xd1\x81",
      "\xd1\x82",
      "\xd1\x83",
      "\xd1\x84",
      "\xd1\x85",
      "\xd1\x86",
      "\xd1\x87",
      "\xd1\x88",
      "\xd1\x89",
      "\xd1\x8a",
      "\xd1\x8b",
      "\xd1\x8c",
      "\xd1\x8d",
      "\xd1\x8e",
      "\xc2\xa4",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x000000a0 => "\xca",
      0x000000a2 => "\xa2",
      0x000000a3 => "\xa3",
      0x000000a4 => "\xff",
      0x000000a7 => "\xa4",
      0x000000a9 => "\xa9",
      0x000000ab => "\xc7",
      0x000000ac => "\xc2",
      0x000000ae => "\xa8",
      0x000000b0 => "\xa1",
      0x000000b1 => "\xb1",
      0x000000b5 => "\xb5",
      0x000000b6 => "\xa6",
      0x000000bb => "\xc8",
      0x000000f7 => "\xd6",
      0x00000192 => "\xc4",
      0x00000401 => "\xdd",
      0x00000402 => "\xab",
      0x00000403 => "\xae",
      0x00000404 => "\xb8",
      0x00000405 => "\xc1",
      0x00000406 => "\xa7",
      0x00000407 => "\xba",
      0x00000408 => "\xb7",
      0x00000409 => "\xbc",
      0x0000040a => "\xbe",
      0x0000040b => "\xcb",
      0x0000040c => "\xcd",
      0x0000040e => "\xd8",
      0x0000040f => "\xda",
      0x00000410 => "\x80",
      0x00000411 => "\x81",
      0x00000412 => "\x82",
      0x00000413 => "\x83",
      0x00000414 => "\x84",
      0x00000415 => "\x85",
      0x00000416 => "\x86",
      0x00000417 => "\x87",
      0x00000418 => "\x88",
      0x00000419 => "\x89",
      0x0000041a => "\x8a",
      0x0000041b => "\x8b",
      0x0000041c => "\x8c",
      0x0000041d => "\x8d",
      0x0000041e => "\x8e",
      0x0000041f => "\x8f",
      0x00000420 => "\x90",
      0x00000421 => "\x91",
      0x00000422 => "\x92",
      0x00000423 => "\x93",
      0x00000424 => "\x94",
      0x00000425 => "\x95",
      0x00000426 => "\x96",
      0x00000427 => "\x97",
      0x00000428 => "\x98",
      0x00000429 => "\x99",
      0x0000042a => "\x9a",
      0x0000042b => "\x9b",
      0x0000042c => "\x9c",
      0x0000042d => "\x9d",
      0x0000042e => "\x9e",
      0x0000042f => "\x9f",
      0x00000430 => "\xe0",
      0x00000431 => "\xe1",
      0x00000432 => "\xe2",
      0x00000433 => "\xe3",
      0x00000434 => "\xe4",
      0x00000435 => "\xe5",
      0x00000436 => "\xe6",
      0x00000437 => "\xe7",
      0x00000438 => "\xe8",
      0x00000439 => "\xe9",
      0x0000043a => "\xea",
      0x0000043b => "\xeb",
      0x0000043c => "\xec",
      0x0000043d => "\xed",
      0x0000043e => "\xee",
      0x0000043f => "\xef",
      0x00000440 => "\xf0",
      0x00000441 => "\xf1",
      0x00000442 => "\xf2",
      0x00000443 => "\xf3",
      0x00000444 => "\xf4",
      0x00000445 => "\xf5",
      0x00000446 => "\xf6",
      0x00000447 => "\xf7",
      0x00000448 => "\xf8",
      0x00000449 => "\xf9",
      0x0000044a => "\xfa",
      0x0000044b => "\xfb",
      0x0000044c => "\xfc",
      0x0000044d => "\xfd",
      0x0000044e => "\xfe",
      0x0000044f => "\xdf",
      0x00000451 => "\xde",
      0x00000452 => "\xac",
      0x00000453 => "\xaf",
      0x00000454 => "\xb9",
      0x00000455 => "\xcf",
      0x00000456 => "\xb4",
      0x00000457 => "\xbb",
      0x00000458 => "\xc0",
      0x00000459 => "\xbd",
      0x0000045a => "\xbf",
      0x0000045b => "\xcc",
      0x0000045c => "\xce",
      0x0000045e => "\xd9",
      0x0000045f => "\xdb",
      0x00000491 => "\xb6",
      0x00002013 => "\xd0",
      0x00002014 => "\xd1",
      0x00002018 => "\xd4",
      0x00002019 => "\xd5",
      0x0000201c => "\xd2",
      0x0000201d => "\xd3",
      0x0000201e => "\xd7",
      0x00002020 => "\xa0",
      0x00002022 => "\xa5",
      0x00002026 => "\xc9",
      0x00002116 => "\xdc",
      0x00002122 => "\xaa",
      0x00002206 => "\xc6",
      0x0000221a => "\xc3",
      0x0000221e => "\xb0",
      0x00002248 => "\xc5",
      0x00002260 => "\xad",
      0x00002264 => "\xb2",
      0x00002265 => "\xb3",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::CP10007 - Conversion routines for CP10007
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for CP10007.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   This is the old MacCyrillic which M$ keeps around as CP10007.
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL
      01 |  00000001 | START OF HEADING
      02 |  00000002 | START OF TEXT
      03 |  00000003 | END OF TEXT
      04 |  00000004 | END OF TRANSMISSION
      05 |  00000005 | ENQUIRY
      06 |  00000006 | ACKNOWLEDGE
      07 |  00000007 | BELL
      08 |  00000008 | BACKSPACE
      09 |  00000009 | HORIZONTAL TABULATION
      0A |  0000000A | LINE FEED
      0B |  0000000B | VERTICAL TABULATION
      0C |  0000000C | FORM FEED
      0D |  0000000D | CARRIAGE RETURN
      0E |  0000000E | SHIFT OUT
      0F |  0000000F | SHIFT IN
      10 |  00000010 | DATA LINK ESCAPE
      11 |  00000011 | DEVICE CONTROL ONE
      12 |  00000012 | DEVICE CONTROL TWO
      13 |  00000013 | DEVICE CONTROL THREE
      14 |  00000014 | DEVICE CONTROL FOUR
      15 |  00000015 | NEGATIVE ACKNOWLEDGE
      16 |  00000016 | SYNCHRONOUS IDLE
      17 |  00000017 | END OF TRANSMISSION BLOCK
      18 |  00000018 | CANCEL
      19 |  00000019 | END OF MEDIUM
      1A |  0000001A | SUBSTITUTE
      1B |  0000001B | ESCAPE
      1C |  0000001C | FILE SEPARATOR
      1D |  0000001D | GROUP SEPARATOR
      1E |  0000001E | RECORD SEPARATOR
      1F |  0000001F | UNIT SEPARATOR
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE
      80 |  00000410 | CYRILLIC CAPITAL LETTER A
      81 |  00000411 | CYRILLIC CAPITAL LETTER BE
      82 |  00000412 | CYRILLIC CAPITAL LETTER VE
      83 |  00000413 | CYRILLIC CAPITAL LETTER GHE
      84 |  00000414 | CYRILLIC CAPITAL LETTER DE
      85 |  00000415 | CYRILLIC CAPITAL LETTER IE
      86 |  00000416 | CYRILLIC CAPITAL LETTER ZHE
      87 |  00000417 | CYRILLIC CAPITAL LETTER ZE
      88 |  00000418 | CYRILLIC CAPITAL LETTER I
      89 |  00000419 | CYRILLIC CAPITAL LETTER SHORT I
      8A |  0000041A | CYRILLIC CAPITAL LETTER KA
      8B |  0000041B | CYRILLIC CAPITAL LETTER EL
      8C |  0000041C | CYRILLIC CAPITAL LETTER EM
      8D |  0000041D | CYRILLIC CAPITAL LETTER EN
      8E |  0000041E | CYRILLIC CAPITAL LETTER O
      8F |  0000041F | CYRILLIC CAPITAL LETTER PE
      90 |  00000420 | CYRILLIC CAPITAL LETTER ER
      91 |  00000421 | CYRILLIC CAPITAL LETTER ES
      92 |  00000422 | CYRILLIC CAPITAL LETTER TE
      93 |  00000423 | CYRILLIC CAPITAL LETTER U
      94 |  00000424 | CYRILLIC CAPITAL LETTER EF
      95 |  00000425 | CYRILLIC CAPITAL LETTER HA
      96 |  00000426 | CYRILLIC CAPITAL LETTER TSE
      97 |  00000427 | CYRILLIC CAPITAL LETTER CHE
      98 |  00000428 | CYRILLIC CAPITAL LETTER SHA
      99 |  00000429 | CYRILLIC CAPITAL LETTER SHCHA
      9A |  0000042A | CYRILLIC CAPITAL LETTER HARD SIGN
      9B |  0000042B | CYRILLIC CAPITAL LETTER YERU
      9C |  0000042C | CYRILLIC CAPITAL LETTER SOFT SIGN
      9D |  0000042D | CYRILLIC CAPITAL LETTER E
      9E |  0000042E | CYRILLIC CAPITAL LETTER YU
      9F |  0000042F | CYRILLIC CAPITAL LETTER YA
      A0 |  00002020 | DAGGER
      A1 |  000000B0 | DEGREE SIGN
      A2 |  000000A2 | CENT SIGN
      A3 |  000000A3 | POUND SIGN
      A4 |  000000A7 | SECTION SIGN
      A5 |  00002022 | BULLET
      A6 |  000000B6 | PILCROW SIGN
      A7 |  00000406 | CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
      A8 |  000000AE | REGISTERED SIGN
      A9 |  000000A9 | COPYRIGHT SIGN
      AA |  00002122 | TRADE MARK SIGN
      AB |  00000402 | CYRILLIC CAPITAL LETTER DJE
      AC |  00000452 | CYRILLIC SMALL LETTER DJE
      AD |  00002260 | NOT EQUAL TO
      AE |  00000403 | CYRILLIC CAPITAL LETTER GJE
      AF |  00000453 | CYRILLIC SMALL LETTER GJE
      B0 |  0000221E | INFINITY
      B1 |  000000B1 | PLUS-MINUS SIGN
      B2 |  00002264 | LESS-THAN OR EQUAL TO
      B3 |  00002265 | GREATER-THAN OR EQUAL TO
      B4 |  00000456 | CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
      B5 |  000000B5 | MICRO SIGN
      B6 |  00000491 | CYRILLIC SMALL LETTER GHE WITH UPTURN
      B7 |  00000408 | CYRILLIC CAPITAL LETTER JE
      B8 |  00000404 | CYRILLIC CAPITAL LETTER UKRAINIAN IE
      B9 |  00000454 | CYRILLIC SMALL LETTER UKRAINIAN IE
      BA |  00000407 | CYRILLIC CAPITAL LETTER YI
      BB |  00000457 | CYRILLIC SMALL LETTER YI
      BC |  00000409 | CYRILLIC CAPITAL LETTER LJE
      BD |  00000459 | CYRILLIC SMALL LETTER LJE
      BE |  0000040A | CYRILLIC CAPITAL LETTER NJE
      BF |  0000045A | CYRILLIC SMALL LETTER NJE
      C0 |  00000458 | CYRILLIC SMALL LETTER JE
      C1 |  00000405 | CYRILLIC CAPITAL LETTER DZE
      C2 |  000000AC | NOT SIGN
      C3 |  0000221A | SQUARE ROOT
      C4 |  00000192 | LATIN SMALL LETTER F WITH HOOK
      C5 |  00002248 | ALMOST EQUAL TO
      C6 |  00002206 | INCREMENT
      C7 |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
      C8 |  000000BB | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
      C9 |  00002026 | HORIZONTAL ELLIPSIS
      CA |  000000A0 | NO-BREAK SPACE
      CB |  0000040B | CYRILLIC CAPITAL LETTER TSHE
      CC |  0000045B | CYRILLIC SMALL LETTER TSHE
      CD |  0000040C | CYRILLIC CAPITAL LETTER KJE
      CE |  0000045C | CYRILLIC SMALL LETTER KJE
      CF |  00000455 | CYRILLIC SMALL LETTER DZE
      D0 |  00002013 | EN DASH
      D1 |  00002014 | EM DASH
      D2 |  0000201C | LEFT DOUBLE QUOTATION MARK
      D3 |  0000201D | RIGHT DOUBLE QUOTATION MARK
      D4 |  00002018 | LEFT SINGLE QUOTATION MARK
      D5 |  00002019 | RIGHT SINGLE QUOTATION MARK
      D6 |  000000F7 | DIVISION SIGN
      D7 |  0000201E | DOUBLE LOW-9 QUOTATION MARK
      D8 |  0000040E | CYRILLIC CAPITAL LETTER SHORT U
      D9 |  0000045E | CYRILLIC SMALL LETTER SHORT U
      DA |  0000040F | CYRILLIC CAPITAL LETTER DZHE
      DB |  0000045F | CYRILLIC SMALL LETTER DZHE
      DC |  00002116 | NUMERO SIGN
      DD |  00000401 | CYRILLIC CAPITAL LETTER IO
      DE |  00000451 | CYRILLIC SMALL LETTER IO
      DF |  0000044F | CYRILLIC SMALL LETTER YA
      E0 |  00000430 | CYRILLIC SMALL LETTER A
      E1 |  00000431 | CYRILLIC SMALL LETTER BE
      E2 |  00000432 | CYRILLIC SMALL LETTER VE
      E3 |  00000433 | CYRILLIC SMALL LETTER GHE
      E4 |  00000434 | CYRILLIC SMALL LETTER DE
      E5 |  00000435 | CYRILLIC SMALL LETTER IE
      E6 |  00000436 | CYRILLIC SMALL LETTER ZHE
      E7 |  00000437 | CYRILLIC SMALL LETTER ZE
      E8 |  00000438 | CYRILLIC SMALL LETTER I
      E9 |  00000439 | CYRILLIC SMALL LETTER SHORT I
      EA |  0000043A | CYRILLIC SMALL LETTER KA
      EB |  0000043B | CYRILLIC SMALL LETTER EL
      EC |  0000043C | CYRILLIC SMALL LETTER EM
      ED |  0000043D | CYRILLIC SMALL LETTER EN
      EE |  0000043E | CYRILLIC SMALL LETTER O
      EF |  0000043F | CYRILLIC SMALL LETTER PE
      F0 |  00000440 | CYRILLIC SMALL LETTER ER
      F1 |  00000441 | CYRILLIC SMALL LETTER ES
      F2 |  00000442 | CYRILLIC SMALL LETTER TE
      F3 |  00000443 | CYRILLIC SMALL LETTER U
      F4 |  00000444 | CYRILLIC SMALL LETTER EF
      F5 |  00000445 | CYRILLIC SMALL LETTER HA
      F6 |  00000446 | CYRILLIC SMALL LETTER TSE
      F7 |  00000447 | CYRILLIC SMALL LETTER CHE
      F8 |  00000448 | CYRILLIC SMALL LETTER SHA
      F9 |  00000449 | CYRILLIC SMALL LETTER SHCHA
      FA |  0000044A | CYRILLIC SMALL LETTER HARD SIGN
      FB |  0000044B | CYRILLIC SMALL LETTER YERU
      FC |  0000044C | CYRILLIC SMALL LETTER SOFT SIGN
      FD |  0000044D | CYRILLIC SMALL LETTER E
      FE |  0000044E | CYRILLIC SMALL LETTER YU
      FF |  000000A4 | CURRENCY SIGN
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_CP10007

    $main::fatpacked{"Locale/RecodeData/CP1250.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_CP1250';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for CP1250.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::CP1250;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0x20ac,
      0xfffd,
      0x201a,
      0xfffd,
      0x201e,
      0x2026,
      0x2020,
      0x2021,
      0xfffd,
      0x2030,
      0x0160,
      0x2039,
      0x015a,
      0x0164,
      0x017d,
      0x0179,
      0xfffd,
      0x2018,
      0x2019,
      0x201c,
      0x201d,
      0x2022,
      0x2013,
      0x2014,
      0xfffd,
      0x2122,
      0x0161,
      0x203a,
      0x015b,
      0x0165,
      0x017e,
      0x017a,
      0x00a0,
      0x02c7,
      0x02d8,
      0x0141,
      0x00a4,
      0x0104,
      0x00a6,
      0x00a7,
      0x00a8,
      0x00a9,
      0x015e,
      0x00ab,
      0x00ac,
      0x00ad,
      0x00ae,
      0x017b,
      0x00b0,
      0x00b1,
      0x02db,
      0x0142,
      0x00b4,
      0x00b5,
      0x00b6,
      0x00b7,
      0x00b8,
      0x0105,
      0x015f,
      0x00bb,
      0x013d,
      0x02dd,
      0x013e,
      0x017c,
      0x0154,
      0x00c1,
      0x00c2,
      0x0102,
      0x00c4,
      0x0139,
      0x0106,
      0x00c7,
      0x010c,
      0x00c9,
      0x0118,
      0x00cb,
      0x011a,
      0x00cd,
      0x00ce,
      0x010e,
      0x0110,
      0x0143,
      0x0147,
      0x00d3,
      0x00d4,
      0x0150,
      0x00d6,
      0x00d7,
      0x0158,
      0x016e,
      0x00da,
      0x0170,
      0x00dc,
      0x00dd,
      0x0162,
      0x00df,
      0x0155,
      0x00e1,
      0x00e2,
      0x0103,
      0x00e4,
      0x013a,
      0x0107,
      0x00e7,
      0x010d,
      0x00e9,
      0x0119,
      0x00eb,
      0x011b,
      0x00ed,
      0x00ee,
      0x010f,
      0x0111,
      0x0144,
      0x0148,
      0x00f3,
      0x00f4,
      0x0151,
      0x00f6,
      0x00f7,
      0x0159,
      0x016f,
      0x00fa,
      0x0171,
      0x00fc,
      0x00fd,
      0x0163,
      0x02d9,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xe2\x82\xac",
      "\xef\xbf\xbd",
      "\xe2\x80\x9a",
      "\xef\xbf\xbd",
      "\xe2\x80\x9e",
      "\xe2\x80\xa6",
      "\xe2\x80\xa0",
      "\xe2\x80\xa1",
      "\xef\xbf\xbd",
      "\xe2\x80\xb0",
      "\xc5\xa0",
      "\xe2\x80\xb9",
      "\xc5\x9a",
      "\xc5\xa4",
      "\xc5\xbd",
      "\xc5\xb9",
      "\xef\xbf\xbd",
      "\xe2\x80\x98",
      "\xe2\x80\x99",
      "\xe2\x80\x9c",
      "\xe2\x80\x9d",
      "\xe2\x80\xa2",
      "\xe2\x80\x93",
      "\xe2\x80\x94",
      "\xef\xbf\xbd",
      "\xe2\x84\xa2",
      "\xc5\xa1",
      "\xe2\x80\xba",
      "\xc5\x9b",
      "\xc5\xa5",
      "\xc5\xbe",
      "\xc5\xba",
      "\xc2\xa0",
      "\xcb\x87",
      "\xcb\x98",
      "\xc5\x81",
      "\xc2\xa4",
      "\xc4\x84",
      "\xc2\xa6",
      "\xc2\xa7",
      "\xc2\xa8",
      "\xc2\xa9",
      "\xc5\x9e",
      "\xc2\xab",
      "\xc2\xac",
      "\xc2\xad",
      "\xc2\xae",
      "\xc5\xbb",
      "\xc2\xb0",
      "\xc2\xb1",
      "\xcb\x9b",
      "\xc5\x82",
      "\xc2\xb4",
      "\xc2\xb5",
      "\xc2\xb6",
      "\xc2\xb7",
      "\xc2\xb8",
      "\xc4\x85",
      "\xc5\x9f",
      "\xc2\xbb",
      "\xc4\xbd",
      "\xcb\x9d",
      "\xc4\xbe",
      "\xc5\xbc",
      "\xc5\x94",
      "\xc3\x81",
      "\xc3\x82",
      "\xc4\x82",
      "\xc3\x84",
      "\xc4\xb9",
      "\xc4\x86",
      "\xc3\x87",
      "\xc4\x8c",
      "\xc3\x89",
      "\xc4\x98",
      "\xc3\x8b",
      "\xc4\x9a",
      "\xc3\x8d",
      "\xc3\x8e",
      "\xc4\x8e",
      "\xc4\x90",
      "\xc5\x83",
      "\xc5\x87",
      "\xc3\x93",
      "\xc3\x94",
      "\xc5\x90",
      "\xc3\x96",
      "\xc3\x97",
      "\xc5\x98",
      "\xc5\xae",
      "\xc3\x9a",
      "\xc5\xb0",
      "\xc3\x9c",
      "\xc3\x9d",
      "\xc5\xa2",
      "\xc3\x9f",
      "\xc5\x95",
      "\xc3\xa1",
      "\xc3\xa2",
      "\xc4\x83",
      "\xc3\xa4",
      "\xc4\xba",
      "\xc4\x87",
      "\xc3\xa7",
      "\xc4\x8d",
      "\xc3\xa9",
      "\xc4\x99",
      "\xc3\xab",
      "\xc4\x9b",
      "\xc3\xad",
      "\xc3\xae",
      "\xc4\x8f",
      "\xc4\x91",
      "\xc5\x84",
      "\xc5\x88",
      "\xc3\xb3",
      "\xc3\xb4",
      "\xc5\x91",
      "\xc3\xb6",
      "\xc3\xb7",
      "\xc5\x99",
      "\xc5\xaf",
      "\xc3\xba",
      "\xc5\xb1",
      "\xc3\xbc",
      "\xc3\xbd",
      "\xc5\xa3",
      "\xcb\x99",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x000000a0 => "\xa0",
      0x000000a4 => "\xa4",
      0x000000a6 => "\xa6",
      0x000000a7 => "\xa7",
      0x000000a8 => "\xa8",
      0x000000a9 => "\xa9",
      0x000000ab => "\xab",
      0x000000ac => "\xac",
      0x000000ad => "\xad",
      0x000000ae => "\xae",
      0x000000b0 => "\xb0",
      0x000000b1 => "\xb1",
      0x000000b4 => "\xb4",
      0x000000b5 => "\xb5",
      0x000000b6 => "\xb6",
      0x000000b7 => "\xb7",
      0x000000b8 => "\xb8",
      0x000000bb => "\xbb",
      0x000000c1 => "\xc1",
      0x000000c2 => "\xc2",
      0x000000c4 => "\xc4",
      0x000000c7 => "\xc7",
      0x000000c9 => "\xc9",
      0x000000cb => "\xcb",
      0x000000cd => "\xcd",
      0x000000ce => "\xce",
      0x000000d3 => "\xd3",
      0x000000d4 => "\xd4",
      0x000000d6 => "\xd6",
      0x000000d7 => "\xd7",
      0x000000da => "\xda",
      0x000000dc => "\xdc",
      0x000000dd => "\xdd",
      0x000000df => "\xdf",
      0x000000e1 => "\xe1",
      0x000000e2 => "\xe2",
      0x000000e4 => "\xe4",
      0x000000e7 => "\xe7",
      0x000000e9 => "\xe9",
      0x000000eb => "\xeb",
      0x000000ed => "\xed",
      0x000000ee => "\xee",
      0x000000f3 => "\xf3",
      0x000000f4 => "\xf4",
      0x000000f6 => "\xf6",
      0x000000f7 => "\xf7",
      0x000000fa => "\xfa",
      0x000000fc => "\xfc",
      0x000000fd => "\xfd",
      0x00000102 => "\xc3",
      0x00000103 => "\xe3",
      0x00000104 => "\xa5",
      0x00000105 => "\xb9",
      0x00000106 => "\xc6",
      0x00000107 => "\xe6",
      0x0000010c => "\xc8",
      0x0000010d => "\xe8",
      0x0000010e => "\xcf",
      0x0000010f => "\xef",
      0x00000110 => "\xd0",
      0x00000111 => "\xf0",
      0x00000118 => "\xca",
      0x00000119 => "\xea",
      0x0000011a => "\xcc",
      0x0000011b => "\xec",
      0x00000139 => "\xc5",
      0x0000013a => "\xe5",
      0x0000013d => "\xbc",
      0x0000013e => "\xbe",
      0x00000141 => "\xa3",
      0x00000142 => "\xb3",
      0x00000143 => "\xd1",
      0x00000144 => "\xf1",
      0x00000147 => "\xd2",
      0x00000148 => "\xf2",
      0x00000150 => "\xd5",
      0x00000151 => "\xf5",
      0x00000154 => "\xc0",
      0x00000155 => "\xe0",
      0x00000158 => "\xd8",
      0x00000159 => "\xf8",
      0x0000015a => "\x8c",
      0x0000015b => "\x9c",
      0x0000015e => "\xaa",
      0x0000015f => "\xba",
      0x00000160 => "\x8a",
      0x00000161 => "\x9a",
      0x00000162 => "\xde",
      0x00000163 => "\xfe",
      0x00000164 => "\x8d",
      0x00000165 => "\x9d",
      0x0000016e => "\xd9",
      0x0000016f => "\xf9",
      0x00000170 => "\xdb",
      0x00000171 => "\xfb",
      0x00000179 => "\x8f",
      0x0000017a => "\x9f",
      0x0000017b => "\xaf",
      0x0000017c => "\xbf",
      0x0000017d => "\x8e",
      0x0000017e => "\x9e",
      0x000002c7 => "\xa1",
      0x000002d8 => "\xa2",
      0x000002d9 => "\xff",
      0x000002db => "\xb2",
      0x000002dd => "\xbd",
      0x00002013 => "\x96",
      0x00002014 => "\x97",
      0x00002018 => "\x91",
      0x00002019 => "\x92",
      0x0000201a => "\x82",
      0x0000201c => "\x93",
      0x0000201d => "\x94",
      0x0000201e => "\x84",
      0x00002020 => "\x86",
      0x00002021 => "\x87",
      0x00002022 => "\x95",
      0x00002026 => "\x85",
      0x00002030 => "\x89",
      0x00002039 => "\x8b",
      0x0000203a => "\x9b",
      0x000020ac => "\x80",
      0x00002122 => "\x99",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::CP1250 - Conversion routines for CP1250
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for CP1250.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
   repertoiremap: mnemonic,ds
    source: UNICODE 1.0
   alias MS-EE
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE (DEL)
      80 |  000020AC | EURO SIGN
      82 |  0000201A | SINGLE LOW-9 QUOTATION MARK
      84 |  0000201E | DOUBLE LOW-9 QUOTATION MARK
      85 |  00002026 | HORIZONTAL ELLIPSIS
      86 |  00002020 | DAGGER
      87 |  00002021 | DOUBLE DAGGER
      89 |  00002030 | PER MILLE SIGN
      8A |  00000160 | LATIN CAPITAL LETTER S WITH CARON
      8B |  00002039 | SINGLE LEFT-POINTING ANGLE QUOTATION MARK
      8C |  0000015A | LATIN CAPITAL LETTER S WITH ACUTE
      8D |  00000164 | LATIN CAPITAL LETTER T WITH CARON
      8E |  0000017D | LATIN CAPITAL LETTER Z WITH CARON
      8F |  00000179 | LATIN CAPITAL LETTER Z WITH ACUTE
      91 |  00002018 | LEFT SINGLE QUOTATION MARK
      92 |  00002019 | RIGHT SINGLE QUOTATION MARK
      93 |  0000201C | LEFT DOUBLE QUOTATION MARK
      94 |  0000201D | RIGHT DOUBLE QUOTATION MARK
      95 |  00002022 | BULLET
      96 |  00002013 | EN DASH
      97 |  00002014 | EM DASH
      99 |  00002122 | TRADE MARK SIGN
      9A |  00000161 | LATIN SMALL LETTER S WITH CARON
      9B |  0000203A | SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
      9C |  0000015B | LATIN SMALL LETTER S WITH ACUTE
      9D |  00000165 | LATIN SMALL LETTER T WITH CARON
      9E |  0000017E | LATIN SMALL LETTER Z WITH CARON
      9F |  0000017A | LATIN SMALL LETTER Z WITH ACUTE
      A0 |  000000A0 | NO-BREAK SPACE
      A1 |  000002C7 | CARON (Mandarin Chinese third tone)
      A2 |  000002D8 | BREVE
      A3 |  00000141 | LATIN CAPITAL LETTER L WITH STROKE
      A4 |  000000A4 | CURRENCY SIGN
      A5 |  00000104 | LATIN CAPITAL LETTER A WITH OGONEK
      A6 |  000000A6 | BROKEN BAR
      A7 |  000000A7 | SECTION SIGN
      A8 |  000000A8 | DIAERESIS
      A9 |  000000A9 | COPYRIGHT SIGN
      AA |  0000015E | LATIN CAPITAL LETTER S WITH CEDILLA
      AB |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
      AC |  000000AC | NOT SIGN
      AD |  000000AD | SOFT HYPHEN
      AE |  000000AE | REGISTERED SIGN
      AF |  0000017B | LATIN CAPITAL LETTER Z WITH DOT ABOVE
      B0 |  000000B0 | DEGREE SIGN
      B1 |  000000B1 | PLUS-MINUS SIGN
      B2 |  000002DB | OGONEK
      B3 |  00000142 | LATIN SMALL LETTER L WITH STROKE
      B4 |  000000B4 | ACUTE ACCENT
      B5 |  000000B5 | MICRO SIGN
      B6 |  000000B6 | PILCROW SIGN
      B7 |  000000B7 | MIDDLE DOT
      B8 |  000000B8 | CEDILLA
      B9 |  00000105 | LATIN SMALL LETTER A WITH OGONEK
      BA |  0000015F | LATIN SMALL LETTER S WITH CEDILLA
      BB |  000000BB | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
      BC |  0000013D | LATIN CAPITAL LETTER L WITH CARON
      BD |  000002DD | DOUBLE ACUTE ACCENT
      BE |  0000013E | LATIN SMALL LETTER L WITH CARON
      BF |  0000017C | LATIN SMALL LETTER Z WITH DOT ABOVE
      C0 |  00000154 | LATIN CAPITAL LETTER R WITH ACUTE
      C1 |  000000C1 | LATIN CAPITAL LETTER A WITH ACUTE
      C2 |  000000C2 | LATIN CAPITAL LETTER A WITH CIRCUMFLEX
      C3 |  00000102 | LATIN CAPITAL LETTER A WITH BREVE
      C4 |  000000C4 | LATIN CAPITAL LETTER A WITH DIAERESIS
      C5 |  00000139 | LATIN CAPITAL LETTER L WITH ACUTE
      C6 |  00000106 | LATIN CAPITAL LETTER C WITH ACUTE
      C7 |  000000C7 | LATIN CAPITAL LETTER C WITH CEDILLA
      C8 |  0000010C | LATIN CAPITAL LETTER C WITH CARON
      C9 |  000000C9 | LATIN CAPITAL LETTER E WITH ACUTE
      CA |  00000118 | LATIN CAPITAL LETTER E WITH OGONEK
      CB |  000000CB | LATIN CAPITAL LETTER E WITH DIAERESIS
      CC |  0000011A | LATIN CAPITAL LETTER E WITH CARON
      CD |  000000CD | LATIN CAPITAL LETTER I WITH ACUTE
      CE |  000000CE | LATIN CAPITAL LETTER I WITH CIRCUMFLEX
      CF |  0000010E | LATIN CAPITAL LETTER D WITH CARON
      D0 |  00000110 | LATIN CAPITAL LETTER D WITH STROKE
      D1 |  00000143 | LATIN CAPITAL LETTER N WITH ACUTE
      D2 |  00000147 | LATIN CAPITAL LETTER N WITH CARON
      D3 |  000000D3 | LATIN CAPITAL LETTER O WITH ACUTE
      D4 |  000000D4 | LATIN CAPITAL LETTER O WITH CIRCUMFLEX
      D5 |  00000150 | LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
      D6 |  000000D6 | LATIN CAPITAL LETTER O WITH DIAERESIS
      D7 |  000000D7 | MULTIPLICATION SIGN
      D8 |  00000158 | LATIN CAPITAL LETTER R WITH CARON
      D9 |  0000016E | LATIN CAPITAL LETTER U WITH RING ABOVE
      DA |  000000DA | LATIN CAPITAL LETTER U WITH ACUTE
      DB |  00000170 | LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
      DC |  000000DC | LATIN CAPITAL LETTER U WITH DIAERESIS
      DD |  000000DD | LATIN CAPITAL LETTER Y WITH ACUTE
      DE |  00000162 | LATIN CAPITAL LETTER T WITH CEDILLA
      DF |  000000DF | LATIN SMALL LETTER SHARP S (German)
      E0 |  00000155 | LATIN SMALL LETTER R WITH ACUTE
      E1 |  000000E1 | LATIN SMALL LETTER A WITH ACUTE
      E2 |  000000E2 | LATIN SMALL LETTER A WITH CIRCUMFLEX
      E3 |  00000103 | LATIN SMALL LETTER A WITH BREVE
      E4 |  000000E4 | LATIN SMALL LETTER A WITH DIAERESIS
      E5 |  0000013A | LATIN SMALL LETTER L WITH ACUTE
      E6 |  00000107 | LATIN SMALL LETTER C WITH ACUTE
      E7 |  000000E7 | LATIN SMALL LETTER C WITH CEDILLA
      E8 |  0000010D | LATIN SMALL LETTER C WITH CARON
      E9 |  000000E9 | LATIN SMALL LETTER E WITH ACUTE
      EA |  00000119 | LATIN SMALL LETTER E WITH OGONEK
      EB |  000000EB | LATIN SMALL LETTER E WITH DIAERESIS
      EC |  0000011B | LATIN SMALL LETTER E WITH CARON
      ED |  000000ED | LATIN SMALL LETTER I WITH ACUTE
      EE |  000000EE | LATIN SMALL LETTER I WITH CIRCUMFLEX
      EF |  0000010F | LATIN SMALL LETTER D WITH CARON
      F0 |  00000111 | LATIN SMALL LETTER D WITH STROKE
      F1 |  00000144 | LATIN SMALL LETTER N WITH ACUTE
      F2 |  00000148 | LATIN SMALL LETTER N WITH CARON
      F3 |  000000F3 | LATIN SMALL LETTER O WITH ACUTE
      F4 |  000000F4 | LATIN SMALL LETTER O WITH CIRCUMFLEX
      F5 |  00000151 | LATIN SMALL LETTER O WITH DOUBLE ACUTE
      F6 |  000000F6 | LATIN SMALL LETTER O WITH DIAERESIS
      F7 |  000000F7 | DIVISION SIGN
      F8 |  00000159 | LATIN SMALL LETTER R WITH CARON
      F9 |  0000016F | LATIN SMALL LETTER U WITH RING ABOVE
      FA |  000000FA | LATIN SMALL LETTER U WITH ACUTE
      FB |  00000171 | LATIN SMALL LETTER U WITH DOUBLE ACUTE
      FC |  000000FC | LATIN SMALL LETTER U WITH DIAERESIS
      FD |  000000FD | LATIN SMALL LETTER Y WITH ACUTE
      FE |  00000163 | LATIN SMALL LETTER T WITH CEDILLA
      FF |  000002D9 | DOT ABOVE (Mandarin Chinese light tone)
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_CP1250

    $main::fatpacked{"Locale/RecodeData/CP1251.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_CP1251';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for CP1251.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::CP1251;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0x0402,
      0x0403,
      0x201a,
      0x0453,
      0x201e,
      0x2026,
      0x2020,
      0x2021,
      0x20ac,
      0x2030,
      0x0409,
      0x2039,
      0x040a,
      0x040c,
      0x040b,
      0x040f,
      0x0452,
      0x2018,
      0x2019,
      0x201c,
      0x201d,
      0x2022,
      0x2013,
      0x2014,
      0xfffd,
      0x2122,
      0x0459,
      0x203a,
      0x045a,
      0x045c,
      0x045b,
      0x045f,
      0x00a0,
      0x040e,
      0x045e,
      0x0408,
      0x00a4,
      0x0490,
      0x00a6,
      0x00a7,
      0x0401,
      0x00a9,
      0x0404,
      0x00ab,
      0x00ac,
      0x00ad,
      0x00ae,
      0x0407,
      0x00b0,
      0x00b1,
      0x0406,
      0x0456,
      0x0491,
      0x00b5,
      0x00b6,
      0x00b7,
      0x0451,
      0x2116,
      0x0454,
      0x00bb,
      0x0458,
      0x0405,
      0x0455,
      0x0457,
      0x0410,
      0x0411,
      0x0412,
      0x0413,
      0x0414,
      0x0415,
      0x0416,
      0x0417,
      0x0418,
      0x0419,
      0x041a,
      0x041b,
      0x041c,
      0x041d,
      0x041e,
      0x041f,
      0x0420,
      0x0421,
      0x0422,
      0x0423,
      0x0424,
      0x0425,
      0x0426,
      0x0427,
      0x0428,
      0x0429,
      0x042a,
      0x042b,
      0x042c,
      0x042d,
      0x042e,
      0x042f,
      0x0430,
      0x0431,
      0x0432,
      0x0433,
      0x0434,
      0x0435,
      0x0436,
      0x0437,
      0x0438,
      0x0439,
      0x043a,
      0x043b,
      0x043c,
      0x043d,
      0x043e,
      0x043f,
      0x0440,
      0x0441,
      0x0442,
      0x0443,
      0x0444,
      0x0445,
      0x0446,
      0x0447,
      0x0448,
      0x0449,
      0x044a,
      0x044b,
      0x044c,
      0x044d,
      0x044e,
      0x044f,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xd0\x82",
      "\xd0\x83",
      "\xe2\x80\x9a",
      "\xd1\x93",
      "\xe2\x80\x9e",
      "\xe2\x80\xa6",
      "\xe2\x80\xa0",
      "\xe2\x80\xa1",
      "\xe2\x82\xac",
      "\xe2\x80\xb0",
      "\xd0\x89",
      "\xe2\x80\xb9",
      "\xd0\x8a",
      "\xd0\x8c",
      "\xd0\x8b",
      "\xd0\x8f",
      "\xd1\x92",
      "\xe2\x80\x98",
      "\xe2\x80\x99",
      "\xe2\x80\x9c",
      "\xe2\x80\x9d",
      "\xe2\x80\xa2",
      "\xe2\x80\x93",
      "\xe2\x80\x94",
      "\xef\xbf\xbd",
      "\xe2\x84\xa2",
      "\xd1\x99",
      "\xe2\x80\xba",
      "\xd1\x9a",
      "\xd1\x9c",
      "\xd1\x9b",
      "\xd1\x9f",
      "\xc2\xa0",
      "\xd0\x8e",
      "\xd1\x9e",
      "\xd0\x88",
      "\xc2\xa4",
      "\xd2\x90",
      "\xc2\xa6",
      "\xc2\xa7",
      "\xd0\x81",
      "\xc2\xa9",
      "\xd0\x84",
      "\xc2\xab",
      "\xc2\xac",
      "\xc2\xad",
      "\xc2\xae",
      "\xd0\x87",
      "\xc2\xb0",
      "\xc2\xb1",
      "\xd0\x86",
      "\xd1\x96",
      "\xd2\x91",
      "\xc2\xb5",
      "\xc2\xb6",
      "\xc2\xb7",
      "\xd1\x91",
      "\xe2\x84\x96",
      "\xd1\x94",
      "\xc2\xbb",
      "\xd1\x98",
      "\xd0\x85",
      "\xd1\x95",
      "\xd1\x97",
      "\xd0\x90",
      "\xd0\x91",
      "\xd0\x92",
      "\xd0\x93",
      "\xd0\x94",
      "\xd0\x95",
      "\xd0\x96",
      "\xd0\x97",
      "\xd0\x98",
      "\xd0\x99",
      "\xd0\x9a",
      "\xd0\x9b",
      "\xd0\x9c",
      "\xd0\x9d",
      "\xd0\x9e",
      "\xd0\x9f",
      "\xd0\xa0",
      "\xd0\xa1",
      "\xd0\xa2",
      "\xd0\xa3",
      "\xd0\xa4",
      "\xd0\xa5",
      "\xd0\xa6",
      "\xd0\xa7",
      "\xd0\xa8",
      "\xd0\xa9",
      "\xd0\xaa",
      "\xd0\xab",
      "\xd0\xac",
      "\xd0\xad",
      "\xd0\xae",
      "\xd0\xaf",
      "\xd0\xb0",
      "\xd0\xb1",
      "\xd0\xb2",
      "\xd0\xb3",
      "\xd0\xb4",
      "\xd0\xb5",
      "\xd0\xb6",
      "\xd0\xb7",
      "\xd0\xb8",
      "\xd0\xb9",
      "\xd0\xba",
      "\xd0\xbb",
      "\xd0\xbc",
      "\xd0\xbd",
      "\xd0\xbe",
      "\xd0\xbf",
      "\xd1\x80",
      "\xd1\x81",
      "\xd1\x82",
      "\xd1\x83",
      "\xd1\x84",
      "\xd1\x85",
      "\xd1\x86",
      "\xd1\x87",
      "\xd1\x88",
      "\xd1\x89",
      "\xd1\x8a",
      "\xd1\x8b",
      "\xd1\x8c",
      "\xd1\x8d",
      "\xd1\x8e",
      "\xd1\x8f",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x000000a0 => "\xa0",
      0x000000a4 => "\xa4",
      0x000000a6 => "\xa6",
      0x000000a7 => "\xa7",
      0x000000a9 => "\xa9",
      0x000000ab => "\xab",
      0x000000ac => "\xac",
      0x000000ad => "\xad",
      0x000000ae => "\xae",
      0x000000b0 => "\xb0",
      0x000000b1 => "\xb1",
      0x000000b5 => "\xb5",
      0x000000b6 => "\xb6",
      0x000000b7 => "\xb7",
      0x000000bb => "\xbb",
      0x00000401 => "\xa8",
      0x00000402 => "\x80",
      0x00000403 => "\x81",
      0x00000404 => "\xaa",
      0x00000405 => "\xbd",
      0x00000406 => "\xb2",
      0x00000407 => "\xaf",
      0x00000408 => "\xa3",
      0x00000409 => "\x8a",
      0x0000040a => "\x8c",
      0x0000040b => "\x8e",
      0x0000040c => "\x8d",
      0x0000040e => "\xa1",
      0x0000040f => "\x8f",
      0x00000410 => "\xc0",
      0x00000411 => "\xc1",
      0x00000412 => "\xc2",
      0x00000413 => "\xc3",
      0x00000414 => "\xc4",
      0x00000415 => "\xc5",
      0x00000416 => "\xc6",
      0x00000417 => "\xc7",
      0x00000418 => "\xc8",
      0x00000419 => "\xc9",
      0x0000041a => "\xca",
      0x0000041b => "\xcb",
      0x0000041c => "\xcc",
      0x0000041d => "\xcd",
      0x0000041e => "\xce",
      0x0000041f => "\xcf",
      0x00000420 => "\xd0",
      0x00000421 => "\xd1",
      0x00000422 => "\xd2",
      0x00000423 => "\xd3",
      0x00000424 => "\xd4",
      0x00000425 => "\xd5",
      0x00000426 => "\xd6",
      0x00000427 => "\xd7",
      0x00000428 => "\xd8",
      0x00000429 => "\xd9",
      0x0000042a => "\xda",
      0x0000042b => "\xdb",
      0x0000042c => "\xdc",
      0x0000042d => "\xdd",
      0x0000042e => "\xde",
      0x0000042f => "\xdf",
      0x00000430 => "\xe0",
      0x00000431 => "\xe1",
      0x00000432 => "\xe2",
      0x00000433 => "\xe3",
      0x00000434 => "\xe4",
      0x00000435 => "\xe5",
      0x00000436 => "\xe6",
      0x00000437 => "\xe7",
      0x00000438 => "\xe8",
      0x00000439 => "\xe9",
      0x0000043a => "\xea",
      0x0000043b => "\xeb",
      0x0000043c => "\xec",
      0x0000043d => "\xed",
      0x0000043e => "\xee",
      0x0000043f => "\xef",
      0x00000440 => "\xf0",
      0x00000441 => "\xf1",
      0x00000442 => "\xf2",
      0x00000443 => "\xf3",
      0x00000444 => "\xf4",
      0x00000445 => "\xf5",
      0x00000446 => "\xf6",
      0x00000447 => "\xf7",
      0x00000448 => "\xf8",
      0x00000449 => "\xf9",
      0x0000044a => "\xfa",
      0x0000044b => "\xfb",
      0x0000044c => "\xfc",
      0x0000044d => "\xfd",
      0x0000044e => "\xfe",
      0x0000044f => "\xff",
      0x00000451 => "\xb8",
      0x00000452 => "\x90",
      0x00000453 => "\x83",
      0x00000454 => "\xba",
      0x00000455 => "\xbe",
      0x00000456 => "\xb3",
      0x00000457 => "\xbf",
      0x00000458 => "\xbc",
      0x00000459 => "\x9a",
      0x0000045a => "\x9c",
      0x0000045b => "\x9e",
      0x0000045c => "\x9d",
      0x0000045e => "\xa2",
      0x0000045f => "\x9f",
      0x00000490 => "\xa5",
      0x00000491 => "\xb4",
      0x00002013 => "\x96",
      0x00002014 => "\x97",
      0x00002018 => "\x91",
      0x00002019 => "\x92",
      0x0000201a => "\x82",
      0x0000201c => "\x93",
      0x0000201d => "\x94",
      0x0000201e => "\x84",
      0x00002020 => "\x86",
      0x00002021 => "\x87",
      0x00002022 => "\x95",
      0x00002026 => "\x85",
      0x00002030 => "\x89",
      0x00002039 => "\x8b",
      0x0000203a => "\x9b",
      0x000020ac => "\x88",
      0x00002116 => "\xb9",
      0x00002122 => "\x99",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::CP1251 - Conversion routines for CP1251
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for CP1251.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
   repertoiremap: mnemonic,ds
    source: UNICODE 1.0
   alias MS-CYRL
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE (DEL)
      80 |  00000402 | CYRILLIC CAPITAL LETTER DJE (Serbocroatian)
      81 |  00000403 | CYRILLIC CAPITAL LETTER GJE
      82 |  0000201A | SINGLE LOW-9 QUOTATION MARK
      83 |  00000453 | CYRILLIC SMALL LETTER GJE
      84 |  0000201E | DOUBLE LOW-9 QUOTATION MARK
      85 |  00002026 | HORIZONTAL ELLIPSIS
      86 |  00002020 | DAGGER
      87 |  00002021 | DOUBLE DAGGER
      88 |  000020AC | EURO SIGN
      89 |  00002030 | PER MILLE SIGN
      8A |  00000409 | CYRILLIC CAPITAL LETTER LJE
      8B |  00002039 | SINGLE LEFT-POINTING ANGLE QUOTATION MARK
      8C |  0000040A | CYRILLIC CAPITAL LETTER NJE
      8D |  0000040C | CYRILLIC CAPITAL LETTER KJE
      8E |  0000040B | CYRILLIC CAPITAL LETTER TSHE (Serbocroatian)
      8F |  0000040F | CYRILLIC CAPITAL LETTER DZHE
      90 |  00000452 | CYRILLIC SMALL LETTER DJE (Serbocroatian)
      91 |  00002018 | LEFT SINGLE QUOTATION MARK
      92 |  00002019 | RIGHT SINGLE QUOTATION MARK
      93 |  0000201C | LEFT DOUBLE QUOTATION MARK
      94 |  0000201D | RIGHT DOUBLE QUOTATION MARK
      95 |  00002022 | BULLET
      96 |  00002013 | EN DASH
      97 |  00002014 | EM DASH
      99 |  00002122 | TRADE MARK SIGN
      9A |  00000459 | CYRILLIC SMALL LETTER LJE
      9B |  0000203A | SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
      9C |  0000045A | CYRILLIC SMALL LETTER NJE
      9D |  0000045C | CYRILLIC SMALL LETTER KJE
      9E |  0000045B | CYRILLIC SMALL LETTER TSHE (Serbocroatian)
      9F |  0000045F | CYRILLIC SMALL LETTER DZHE
      A0 |  000000A0 | NO-BREAK SPACE
      A1 |  0000040E | CYRILLIC CAPITAL LETTER SHORT U (Byelorussian)
      A2 |  0000045E | CYRILLIC SMALL LETTER SHORT U (Byelorussian)
      A3 |  00000408 | CYRILLIC CAPITAL LETTER JE
      A4 |  000000A4 | CURRENCY SIGN
      A5 |  00000490 | CYRILLIC CAPITAL LETTER GHE WITH UPTURN
      A6 |  000000A6 | BROKEN BAR
      A7 |  000000A7 | SECTION SIGN
      A8 |  00000401 | CYRILLIC CAPITAL LETTER IO
      A9 |  000000A9 | COPYRIGHT SIGN
      AA |  00000404 | CYRILLIC CAPITAL LETTER UKRAINIAN IE
      AB |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
      AC |  000000AC | NOT SIGN
      AD |  000000AD | SOFT HYPHEN
      AE |  000000AE | REGISTERED SIGN
      AF |  00000407 | CYRILLIC CAPITAL LETTER YI (Ukrainian)
      B0 |  000000B0 | DEGREE SIGN
      B1 |  000000B1 | PLUS-MINUS SIGN
      B2 |  00000406 | CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
      B3 |  00000456 | CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
      B4 |  00000491 | CYRILLIC SMALL LETTER GHE WITH UPTURN
      B5 |  000000B5 | MICRO SIGN
      B6 |  000000B6 | PILCROW SIGN
      B7 |  000000B7 | MIDDLE DOT
      B8 |  00000451 | CYRILLIC SMALL LETTER IO
      B9 |  00002116 | NUMERO SIGN
      BA |  00000454 | CYRILLIC SMALL LETTER UKRAINIAN IE
      BB |  000000BB | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
      BC |  00000458 | CYRILLIC SMALL LETTER JE
      BD |  00000405 | CYRILLIC CAPITAL LETTER DZE
      BE |  00000455 | CYRILLIC SMALL LETTER DZE
      BF |  00000457 | CYRILLIC SMALL LETTER YI (Ukrainian)
      C0 |  00000410 | CYRILLIC CAPITAL LETTER A
      C1 |  00000411 | CYRILLIC CAPITAL LETTER BE
      C2 |  00000412 | CYRILLIC CAPITAL LETTER VE
      C3 |  00000413 | CYRILLIC CAPITAL LETTER GHE
      C4 |  00000414 | CYRILLIC CAPITAL LETTER DE
      C5 |  00000415 | CYRILLIC CAPITAL LETTER IE
      C6 |  00000416 | CYRILLIC CAPITAL LETTER ZHE
      C7 |  00000417 | CYRILLIC CAPITAL LETTER ZE
      C8 |  00000418 | CYRILLIC CAPITAL LETTER I
      C9 |  00000419 | CYRILLIC CAPITAL LETTER SHORT I
      CA |  0000041A | CYRILLIC CAPITAL LETTER KA
      CB |  0000041B | CYRILLIC CAPITAL LETTER EL
      CC |  0000041C | CYRILLIC CAPITAL LETTER EM
      CD |  0000041D | CYRILLIC CAPITAL LETTER EN
      CE |  0000041E | CYRILLIC CAPITAL LETTER O
      CF |  0000041F | CYRILLIC CAPITAL LETTER PE
      D0 |  00000420 | CYRILLIC CAPITAL LETTER ER
      D1 |  00000421 | CYRILLIC CAPITAL LETTER ES
      D2 |  00000422 | CYRILLIC CAPITAL LETTER TE
      D3 |  00000423 | CYRILLIC CAPITAL LETTER U
      D4 |  00000424 | CYRILLIC CAPITAL LETTER EF
      D5 |  00000425 | CYRILLIC CAPITAL LETTER HA
      D6 |  00000426 | CYRILLIC CAPITAL LETTER TSE
      D7 |  00000427 | CYRILLIC CAPITAL LETTER CHE
      D8 |  00000428 | CYRILLIC CAPITAL LETTER SHA
      D9 |  00000429 | CYRILLIC CAPITAL LETTER SHCHA
      DA |  0000042A | CYRILLIC CAPITAL LETTER HARD SIGN
      DB |  0000042B | CYRILLIC CAPITAL LETTER YERU
      DC |  0000042C | CYRILLIC CAPITAL LETTER SOFT SIGN
      DD |  0000042D | CYRILLIC CAPITAL LETTER E
      DE |  0000042E | CYRILLIC CAPITAL LETTER YU
      DF |  0000042F | CYRILLIC CAPITAL LETTER YA
      E0 |  00000430 | CYRILLIC SMALL LETTER A
      E1 |  00000431 | CYRILLIC SMALL LETTER BE
      E2 |  00000432 | CYRILLIC SMALL LETTER VE
      E3 |  00000433 | CYRILLIC SMALL LETTER GHE
      E4 |  00000434 | CYRILLIC SMALL LETTER DE
      E5 |  00000435 | CYRILLIC SMALL LETTER IE
      E6 |  00000436 | CYRILLIC SMALL LETTER ZHE
      E7 |  00000437 | CYRILLIC SMALL LETTER ZE
      E8 |  00000438 | CYRILLIC SMALL LETTER I
      E9 |  00000439 | CYRILLIC SMALL LETTER SHORT I
      EA |  0000043A | CYRILLIC SMALL LETTER KA
      EB |  0000043B | CYRILLIC SMALL LETTER EL
      EC |  0000043C | CYRILLIC SMALL LETTER EM
      ED |  0000043D | CYRILLIC SMALL LETTER EN
      EE |  0000043E | CYRILLIC SMALL LETTER O
      EF |  0000043F | CYRILLIC SMALL LETTER PE
      F0 |  00000440 | CYRILLIC SMALL LETTER ER
      F1 |  00000441 | CYRILLIC SMALL LETTER ES
      F2 |  00000442 | CYRILLIC SMALL LETTER TE
      F3 |  00000443 | CYRILLIC SMALL LETTER U
      F4 |  00000444 | CYRILLIC SMALL LETTER EF
      F5 |  00000445 | CYRILLIC SMALL LETTER HA
      F6 |  00000446 | CYRILLIC SMALL LETTER TSE
      F7 |  00000447 | CYRILLIC SMALL LETTER CHE
      F8 |  00000448 | CYRILLIC SMALL LETTER SHA
      F9 |  00000449 | CYRILLIC SMALL LETTER SHCHA
      FA |  0000044A | CYRILLIC SMALL LETTER HARD SIGN
      FB |  0000044B | CYRILLIC SMALL LETTER YERU
      FC |  0000044C | CYRILLIC SMALL LETTER SOFT SIGN
      FD |  0000044D | CYRILLIC SMALL LETTER E
      FE |  0000044E | CYRILLIC SMALL LETTER YU
      FF |  0000044F | CYRILLIC SMALL LETTER YA
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_CP1251

    $main::fatpacked{"Locale/RecodeData/CP1252.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_CP1252';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for CP1252.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::CP1252;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0x20ac,
      0xfffd,
      0x201a,
      0x0192,
      0x201e,
      0x2026,
      0x2020,
      0x2021,
      0x02c6,
      0x2030,
      0x0160,
      0x2039,
      0x0152,
      0xfffd,
      0x017d,
      0xfffd,
      0xfffd,
      0x2018,
      0x2019,
      0x201c,
      0x201d,
      0x2022,
      0x2013,
      0x2014,
      0x02dc,
      0x2122,
      0x0161,
      0x203a,
      0x0153,
      0xfffd,
      0x017e,
      0x0178,
      0x00a0,
      0x00a1,
      0x00a2,
      0x00a3,
      0x00a4,
      0x00a5,
      0x00a6,
      0x00a7,
      0x00a8,
      0x00a9,
      0x00aa,
      0x00ab,
      0x00ac,
      0x00ad,
      0x00ae,
      0x00af,
      0x00b0,
      0x00b1,
      0x00b2,
      0x00b3,
      0x00b4,
      0x00b5,
      0x00b6,
      0x00b7,
      0x00b8,
      0x00b9,
      0x00ba,
      0x00bb,
      0x00bc,
      0x00bd,
      0x00be,
      0x00bf,
      0x00c0,
      0x00c1,
      0x00c2,
      0x00c3,
      0x00c4,
      0x00c5,
      0x00c6,
      0x00c7,
      0x00c8,
      0x00c9,
      0x00ca,
      0x00cb,
      0x00cc,
      0x00cd,
      0x00ce,
      0x00cf,
      0x00d0,
      0x00d1,
      0x00d2,
      0x00d3,
      0x00d4,
      0x00d5,
      0x00d6,
      0x00d7,
      0x00d8,
      0x00d9,
      0x00da,
      0x00db,
      0x00dc,
      0x00dd,
      0x00de,
      0x00df,
      0x00e0,
      0x00e1,
      0x00e2,
      0x00e3,
      0x00e4,
      0x00e5,
      0x00e6,
      0x00e7,
      0x00e8,
      0x00e9,
      0x00ea,
      0x00eb,
      0x00ec,
      0x00ed,
      0x00ee,
      0x00ef,
      0x00f0,
      0x00f1,
      0x00f2,
      0x00f3,
      0x00f4,
      0x00f5,
      0x00f6,
      0x00f7,
      0x00f8,
      0x00f9,
      0x00fa,
      0x00fb,
      0x00fc,
      0x00fd,
      0x00fe,
      0x00ff,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xe2\x82\xac",
      "\xef\xbf\xbd",
      "\xe2\x80\x9a",
      "\xc6\x92",
      "\xe2\x80\x9e",
      "\xe2\x80\xa6",
      "\xe2\x80\xa0",
      "\xe2\x80\xa1",
      "\xcb\x86",
      "\xe2\x80\xb0",
      "\xc5\xa0",
      "\xe2\x80\xb9",
      "\xc5\x92",
      "\xef\xbf\xbd",
      "\xc5\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xe2\x80\x98",
      "\xe2\x80\x99",
      "\xe2\x80\x9c",
      "\xe2\x80\x9d",
      "\xe2\x80\xa2",
      "\xe2\x80\x93",
      "\xe2\x80\x94",
      "\xcb\x9c",
      "\xe2\x84\xa2",
      "\xc5\xa1",
      "\xe2\x80\xba",
      "\xc5\x93",
      "\xef\xbf\xbd",
      "\xc5\xbe",
      "\xc5\xb8",
      "\xc2\xa0",
      "\xc2\xa1",
      "\xc2\xa2",
      "\xc2\xa3",
      "\xc2\xa4",
      "\xc2\xa5",
      "\xc2\xa6",
      "\xc2\xa7",
      "\xc2\xa8",
      "\xc2\xa9",
      "\xc2\xaa",
      "\xc2\xab",
      "\xc2\xac",
      "\xc2\xad",
      "\xc2\xae",
      "\xc2\xaf",
      "\xc2\xb0",
      "\xc2\xb1",
      "\xc2\xb2",
      "\xc2\xb3",
      "\xc2\xb4",
      "\xc2\xb5",
      "\xc2\xb6",
      "\xc2\xb7",
      "\xc2\xb8",
      "\xc2\xb9",
      "\xc2\xba",
      "\xc2\xbb",
      "\xc2\xbc",
      "\xc2\xbd",
      "\xc2\xbe",
      "\xc2\xbf",
      "\xc3\x80",
      "\xc3\x81",
      "\xc3\x82",
      "\xc3\x83",
      "\xc3\x84",
      "\xc3\x85",
      "\xc3\x86",
      "\xc3\x87",
      "\xc3\x88",
      "\xc3\x89",
      "\xc3\x8a",
      "\xc3\x8b",
      "\xc3\x8c",
      "\xc3\x8d",
      "\xc3\x8e",
      "\xc3\x8f",
      "\xc3\x90",
      "\xc3\x91",
      "\xc3\x92",
      "\xc3\x93",
      "\xc3\x94",
      "\xc3\x95",
      "\xc3\x96",
      "\xc3\x97",
      "\xc3\x98",
      "\xc3\x99",
      "\xc3\x9a",
      "\xc3\x9b",
      "\xc3\x9c",
      "\xc3\x9d",
      "\xc3\x9e",
      "\xc3\x9f",
      "\xc3\xa0",
      "\xc3\xa1",
      "\xc3\xa2",
      "\xc3\xa3",
      "\xc3\xa4",
      "\xc3\xa5",
      "\xc3\xa6",
      "\xc3\xa7",
      "\xc3\xa8",
      "\xc3\xa9",
      "\xc3\xaa",
      "\xc3\xab",
      "\xc3\xac",
      "\xc3\xad",
      "\xc3\xae",
      "\xc3\xaf",
      "\xc3\xb0",
      "\xc3\xb1",
      "\xc3\xb2",
      "\xc3\xb3",
      "\xc3\xb4",
      "\xc3\xb5",
      "\xc3\xb6",
      "\xc3\xb7",
      "\xc3\xb8",
      "\xc3\xb9",
      "\xc3\xba",
      "\xc3\xbb",
      "\xc3\xbc",
      "\xc3\xbd",
      "\xc3\xbe",
      "\xc3\xbf",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x000000a0 => "\xa0",
      0x000000a1 => "\xa1",
      0x000000a2 => "\xa2",
      0x000000a3 => "\xa3",
      0x000000a4 => "\xa4",
      0x000000a5 => "\xa5",
      0x000000a6 => "\xa6",
      0x000000a7 => "\xa7",
      0x000000a8 => "\xa8",
      0x000000a9 => "\xa9",
      0x000000aa => "\xaa",
      0x000000ab => "\xab",
      0x000000ac => "\xac",
      0x000000ad => "\xad",
      0x000000ae => "\xae",
      0x000000af => "\xaf",
      0x000000b0 => "\xb0",
      0x000000b1 => "\xb1",
      0x000000b2 => "\xb2",
      0x000000b3 => "\xb3",
      0x000000b4 => "\xb4",
      0x000000b5 => "\xb5",
      0x000000b6 => "\xb6",
      0x000000b7 => "\xb7",
      0x000000b8 => "\xb8",
      0x000000b9 => "\xb9",
      0x000000ba => "\xba",
      0x000000bb => "\xbb",
      0x000000bc => "\xbc",
      0x000000bd => "\xbd",
      0x000000be => "\xbe",
      0x000000bf => "\xbf",
      0x000000c0 => "\xc0",
      0x000000c1 => "\xc1",
      0x000000c2 => "\xc2",
      0x000000c3 => "\xc3",
      0x000000c4 => "\xc4",
      0x000000c5 => "\xc5",
      0x000000c6 => "\xc6",
      0x000000c7 => "\xc7",
      0x000000c8 => "\xc8",
      0x000000c9 => "\xc9",
      0x000000ca => "\xca",
      0x000000cb => "\xcb",
      0x000000cc => "\xcc",
      0x000000cd => "\xcd",
      0x000000ce => "\xce",
      0x000000cf => "\xcf",
      0x000000d0 => "\xd0",
      0x000000d1 => "\xd1",
      0x000000d2 => "\xd2",
      0x000000d3 => "\xd3",
      0x000000d4 => "\xd4",
      0x000000d5 => "\xd5",
      0x000000d6 => "\xd6",
      0x000000d7 => "\xd7",
      0x000000d8 => "\xd8",
      0x000000d9 => "\xd9",
      0x000000da => "\xda",
      0x000000db => "\xdb",
      0x000000dc => "\xdc",
      0x000000dd => "\xdd",
      0x000000de => "\xde",
      0x000000df => "\xdf",
      0x000000e0 => "\xe0",
      0x000000e1 => "\xe1",
      0x000000e2 => "\xe2",
      0x000000e3 => "\xe3",
      0x000000e4 => "\xe4",
      0x000000e5 => "\xe5",
      0x000000e6 => "\xe6",
      0x000000e7 => "\xe7",
      0x000000e8 => "\xe8",
      0x000000e9 => "\xe9",
      0x000000ea => "\xea",
      0x000000eb => "\xeb",
      0x000000ec => "\xec",
      0x000000ed => "\xed",
      0x000000ee => "\xee",
      0x000000ef => "\xef",
      0x000000f0 => "\xf0",
      0x000000f1 => "\xf1",
      0x000000f2 => "\xf2",
      0x000000f3 => "\xf3",
      0x000000f4 => "\xf4",
      0x000000f5 => "\xf5",
      0x000000f6 => "\xf6",
      0x000000f7 => "\xf7",
      0x000000f8 => "\xf8",
      0x000000f9 => "\xf9",
      0x000000fa => "\xfa",
      0x000000fb => "\xfb",
      0x000000fc => "\xfc",
      0x000000fd => "\xfd",
      0x000000fe => "\xfe",
      0x000000ff => "\xff",
      0x00000152 => "\x8c",
      0x00000153 => "\x9c",
      0x00000160 => "\x8a",
      0x00000161 => "\x9a",
      0x00000178 => "\x9f",
      0x0000017d => "\x8e",
      0x0000017e => "\x9e",
      0x00000192 => "\x83",
      0x000002c6 => "\x88",
      0x000002dc => "\x98",
      0x00002013 => "\x96",
      0x00002014 => "\x97",
      0x00002018 => "\x91",
      0x00002019 => "\x92",
      0x0000201a => "\x82",
      0x0000201c => "\x93",
      0x0000201d => "\x94",
      0x0000201e => "\x84",
      0x00002020 => "\x86",
      0x00002021 => "\x87",
      0x00002022 => "\x95",
      0x00002026 => "\x85",
      0x00002030 => "\x89",
      0x00002039 => "\x8b",
      0x0000203a => "\x9b",
      0x000020ac => "\x80",
      0x00002122 => "\x99",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::CP1252 - Conversion routines for CP1252
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for CP1252.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
   repertoiremap: mnemonic,ds
    source: UNICODE 1.0
   alias MS-ANSI
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE (DEL)
      80 |  000020AC | EURO SIGN
      82 |  0000201A | SINGLE LOW-9 QUOTATION MARK
      83 |  00000192 | LATIN SMALL LETTER F WITH HOOK
      84 |  0000201E | DOUBLE LOW-9 QUOTATION MARK
      85 |  00002026 | HORIZONTAL ELLIPSIS
      86 |  00002020 | DAGGER
      87 |  00002021 | DOUBLE DAGGER
      88 |  000002C6 | MODIFIER LETTER CIRCUMFLEX ACCENT
      89 |  00002030 | PER MILLE SIGN
      8A |  00000160 | LATIN CAPITAL LETTER S WITH CARON
      8B |  00002039 | SINGLE LEFT-POINTING ANGLE QUOTATION MARK
      8C |  00000152 | LATIN CAPITAL LIGATURE OE
      8E |  0000017D | LATIN CAPITAL LETTER Z WITH CARON
      91 |  00002018 | LEFT SINGLE QUOTATION MARK
      92 |  00002019 | RIGHT SINGLE QUOTATION MARK
      93 |  0000201C | LEFT DOUBLE QUOTATION MARK
      94 |  0000201D | RIGHT DOUBLE QUOTATION MARK
      95 |  00002022 | BULLET
      96 |  00002013 | EN DASH
      97 |  00002014 | EM DASH
      98 |  000002DC | SMALL TILDE
      99 |  00002122 | TRADE MARK SIGN
      9A |  00000161 | LATIN SMALL LETTER S WITH CARON
      9B |  0000203A | SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
      9C |  00000153 | LATIN SMALL LIGATURE OE
      9E |  0000017E | LATIN SMALL LETTER Z WITH CARON
      9F |  00000178 | LATIN CAPITAL LETTER Y WITH DIAERESIS
      A0 |  000000A0 | NO-BREAK SPACE
      A1 |  000000A1 | INVERTED EXCLAMATION MARK
      A2 |  000000A2 | CENT SIGN
      A3 |  000000A3 | POUND SIGN
      A4 |  000000A4 | CURRENCY SIGN
      A5 |  000000A5 | YEN SIGN
      A6 |  000000A6 | BROKEN BAR
      A7 |  000000A7 | SECTION SIGN
      A8 |  000000A8 | DIAERESIS
      A9 |  000000A9 | COPYRIGHT SIGN
      AA |  000000AA | FEMININE ORDINAL INDICATOR
      AB |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
      AC |  000000AC | NOT SIGN
      AD |  000000AD | SOFT HYPHEN
      AE |  000000AE | REGISTERED SIGN
      AF |  000000AF | MACRON
      B0 |  000000B0 | DEGREE SIGN
      B1 |  000000B1 | PLUS-MINUS SIGN
      B2 |  000000B2 | SUPERSCRIPT TWO
      B3 |  000000B3 | SUPERSCRIPT THREE
      B4 |  000000B4 | ACUTE ACCENT
      B5 |  000000B5 | MICRO SIGN
      B6 |  000000B6 | PILCROW SIGN
      B7 |  000000B7 | MIDDLE DOT
      B8 |  000000B8 | CEDILLA
      B9 |  000000B9 | SUPERSCRIPT ONE
      BA |  000000BA | MASCULINE ORDINAL INDICATOR
      BB |  000000BB | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
      BC |  000000BC | VULGAR FRACTION ONE QUARTER
      BD |  000000BD | VULGAR FRACTION ONE HALF
      BE |  000000BE | VULGAR FRACTION THREE QUARTERS
      BF |  000000BF | INVERTED QUESTION MARK
      C0 |  000000C0 | LATIN CAPITAL LETTER A WITH GRAVE
      C1 |  000000C1 | LATIN CAPITAL LETTER A WITH ACUTE
      C2 |  000000C2 | LATIN CAPITAL LETTER A WITH CIRCUMFLEX
      C3 |  000000C3 | LATIN CAPITAL LETTER A WITH TILDE
      C4 |  000000C4 | LATIN CAPITAL LETTER A WITH DIAERESIS
      C5 |  000000C5 | LATIN CAPITAL LETTER A WITH RING ABOVE
      C6 |  000000C6 | LATIN CAPITAL LETTER AE
      C7 |  000000C7 | LATIN CAPITAL LETTER C WITH CEDILLA
      C8 |  000000C8 | LATIN CAPITAL LETTER E WITH GRAVE
      C9 |  000000C9 | LATIN CAPITAL LETTER E WITH ACUTE
      CA |  000000CA | LATIN CAPITAL LETTER E WITH CIRCUMFLEX
      CB |  000000CB | LATIN CAPITAL LETTER E WITH DIAERESIS
      CC |  000000CC | LATIN CAPITAL LETTER I WITH GRAVE
      CD |  000000CD | LATIN CAPITAL LETTER I WITH ACUTE
      CE |  000000CE | LATIN CAPITAL LETTER I WITH CIRCUMFLEX
      CF |  000000CF | LATIN CAPITAL LETTER I WITH DIAERESIS
      D0 |  000000D0 | LATIN CAPITAL LETTER ETH (Icelandic)
      D1 |  000000D1 | LATIN CAPITAL LETTER N WITH TILDE
      D2 |  000000D2 | LATIN CAPITAL LETTER O WITH GRAVE
      D3 |  000000D3 | LATIN CAPITAL LETTER O WITH ACUTE
      D4 |  000000D4 | LATIN CAPITAL LETTER O WITH CIRCUMFLEX
      D5 |  000000D5 | LATIN CAPITAL LETTER O WITH TILDE
      D6 |  000000D6 | LATIN CAPITAL LETTER O WITH DIAERESIS
      D7 |  000000D7 | MULTIPLICATION SIGN
      D8 |  000000D8 | LATIN CAPITAL LETTER O WITH STROKE
      D9 |  000000D9 | LATIN CAPITAL LETTER U WITH GRAVE
      DA |  000000DA | LATIN CAPITAL LETTER U WITH ACUTE
      DB |  000000DB | LATIN CAPITAL LETTER U WITH CIRCUMFLEX
      DC |  000000DC | LATIN CAPITAL LETTER U WITH DIAERESIS
      DD |  000000DD | LATIN CAPITAL LETTER Y WITH ACUTE
      DE |  000000DE | LATIN CAPITAL LETTER THORN (Icelandic)
      DF |  000000DF | LATIN SMALL LETTER SHARP S (German)
      E0 |  000000E0 | LATIN SMALL LETTER A WITH GRAVE
      E1 |  000000E1 | LATIN SMALL LETTER A WITH ACUTE
      E2 |  000000E2 | LATIN SMALL LETTER A WITH CIRCUMFLEX
      E3 |  000000E3 | LATIN SMALL LETTER A WITH TILDE
      E4 |  000000E4 | LATIN SMALL LETTER A WITH DIAERESIS
      E5 |  000000E5 | LATIN SMALL LETTER A WITH RING ABOVE
      E6 |  000000E6 | LATIN SMALL LETTER AE
      E7 |  000000E7 | LATIN SMALL LETTER C WITH CEDILLA
      E8 |  000000E8 | LATIN SMALL LETTER E WITH GRAVE
      E9 |  000000E9 | LATIN SMALL LETTER E WITH ACUTE
      EA |  000000EA | LATIN SMALL LETTER E WITH CIRCUMFLEX
      EB |  000000EB | LATIN SMALL LETTER E WITH DIAERESIS
      EC |  000000EC | LATIN SMALL LETTER I WITH GRAVE
      ED |  000000ED | LATIN SMALL LETTER I WITH ACUTE
      EE |  000000EE | LATIN SMALL LETTER I WITH CIRCUMFLEX
      EF |  000000EF | LATIN SMALL LETTER I WITH DIAERESIS
      F0 |  000000F0 | LATIN SMALL LETTER ETH (Icelandic)
      F1 |  000000F1 | LATIN SMALL LETTER N WITH TILDE
      F2 |  000000F2 | LATIN SMALL LETTER O WITH GRAVE
      F3 |  000000F3 | LATIN SMALL LETTER O WITH ACUTE
      F4 |  000000F4 | LATIN SMALL LETTER O WITH CIRCUMFLEX
      F5 |  000000F5 | LATIN SMALL LETTER O WITH TILDE
      F6 |  000000F6 | LATIN SMALL LETTER O WITH DIAERESIS
      F7 |  000000F7 | DIVISION SIGN
      F8 |  000000F8 | LATIN SMALL LETTER O WITH STROKE
      F9 |  000000F9 | LATIN SMALL LETTER U WITH GRAVE
      FA |  000000FA | LATIN SMALL LETTER U WITH ACUTE
      FB |  000000FB | LATIN SMALL LETTER U WITH CIRCUMFLEX
      FC |  000000FC | LATIN SMALL LETTER U WITH DIAERESIS
      FD |  000000FD | LATIN SMALL LETTER Y WITH ACUTE
      FE |  000000FE | LATIN SMALL LETTER THORN (Icelandic)
      FF |  000000FF | LATIN SMALL LETTER Y WITH DIAERESIS
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_CP1252

    $main::fatpacked{"Locale/RecodeData/CP1253.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_CP1253';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for CP1253.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::CP1253;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0x20ac,
      0xfffd,
      0x201a,
      0x0192,
      0x201e,
      0x2026,
      0x2020,
      0x2021,
      0xfffd,
      0x2030,
      0xfffd,
      0x2039,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x2018,
      0x2019,
      0x201c,
      0x201d,
      0x2022,
      0x2013,
      0x2014,
      0xfffd,
      0x2122,
      0xfffd,
      0x203a,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00a0,
      0x0385,
      0x0386,
      0x00a3,
      0x00a4,
      0x00a5,
      0x00a6,
      0x00a7,
      0x00a8,
      0x00a9,
      0xfffd,
      0x00ab,
      0x00ac,
      0x00ad,
      0x00ae,
      0x2015,
      0x00b0,
      0x00b1,
      0x00b2,
      0x00b3,
      0x0384,
      0x00b5,
      0x00b6,
      0x00b7,
      0x0388,
      0x0389,
      0x038a,
      0x00bb,
      0x038c,
      0x00bd,
      0x038e,
      0x038f,
      0x0390,
      0x0391,
      0x0392,
      0x0393,
      0x0394,
      0x0395,
      0x0396,
      0x0397,
      0x0398,
      0x0399,
      0x039a,
      0x039b,
      0x039c,
      0x039d,
      0x039e,
      0x039f,
      0x03a0,
      0x03a1,
      0xfffd,
      0x03a3,
      0x03a4,
      0x03a5,
      0x03a6,
      0x03a7,
      0x03a8,
      0x03a9,
      0x03aa,
      0x03ab,
      0x03ac,
      0x03ad,
      0x03ae,
      0x03af,
      0x03b0,
      0x03b1,
      0x03b2,
      0x03b3,
      0x03b4,
      0x03b5,
      0x03b6,
      0x03b7,
      0x03b8,
      0x03b9,
      0x03ba,
      0x03bb,
      0x03bc,
      0x03bd,
      0x03be,
      0x03bf,
      0x03c0,
      0x03c1,
      0x03c2,
      0x03c3,
      0x03c4,
      0x03c5,
      0x03c6,
      0x03c7,
      0x03c8,
      0x03c9,
      0x03ca,
      0x03cb,
      0x03cc,
      0x03cd,
      0x03ce,
      0xfffd,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xe2\x82\xac",
      "\xef\xbf\xbd",
      "\xe2\x80\x9a",
      "\xc6\x92",
      "\xe2\x80\x9e",
      "\xe2\x80\xa6",
      "\xe2\x80\xa0",
      "\xe2\x80\xa1",
      "\xef\xbf\xbd",
      "\xe2\x80\xb0",
      "\xef\xbf\xbd",
      "\xe2\x80\xb9",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xe2\x80\x98",
      "\xe2\x80\x99",
      "\xe2\x80\x9c",
      "\xe2\x80\x9d",
      "\xe2\x80\xa2",
      "\xe2\x80\x93",
      "\xe2\x80\x94",
      "\xef\xbf\xbd",
      "\xe2\x84\xa2",
      "\xef\xbf\xbd",
      "\xe2\x80\xba",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc2\xa0",
      "\xce\x85",
      "\xce\x86",
      "\xc2\xa3",
      "\xc2\xa4",
      "\xc2\xa5",
      "\xc2\xa6",
      "\xc2\xa7",
      "\xc2\xa8",
      "\xc2\xa9",
      "\xef\xbf\xbd",
      "\xc2\xab",
      "\xc2\xac",
      "\xc2\xad",
      "\xc2\xae",
      "\xe2\x80\x95",
      "\xc2\xb0",
      "\xc2\xb1",
      "\xc2\xb2",
      "\xc2\xb3",
      "\xce\x84",
      "\xc2\xb5",
      "\xc2\xb6",
      "\xc2\xb7",
      "\xce\x88",
      "\xce\x89",
      "\xce\x8a",
      "\xc2\xbb",
      "\xce\x8c",
      "\xc2\xbd",
      "\xce\x8e",
      "\xce\x8f",
      "\xce\x90",
      "\xce\x91",
      "\xce\x92",
      "\xce\x93",
      "\xce\x94",
      "\xce\x95",
      "\xce\x96",
      "\xce\x97",
      "\xce\x98",
      "\xce\x99",
      "\xce\x9a",
      "\xce\x9b",
      "\xce\x9c",
      "\xce\x9d",
      "\xce\x9e",
      "\xce\x9f",
      "\xce\xa0",
      "\xce\xa1",
      "\xef\xbf\xbd",
      "\xce\xa3",
      "\xce\xa4",
      "\xce\xa5",
      "\xce\xa6",
      "\xce\xa7",
      "\xce\xa8",
      "\xce\xa9",
      "\xce\xaa",
      "\xce\xab",
      "\xce\xac",
      "\xce\xad",
      "\xce\xae",
      "\xce\xaf",
      "\xce\xb0",
      "\xce\xb1",
      "\xce\xb2",
      "\xce\xb3",
      "\xce\xb4",
      "\xce\xb5",
      "\xce\xb6",
      "\xce\xb7",
      "\xce\xb8",
      "\xce\xb9",
      "\xce\xba",
      "\xce\xbb",
      "\xce\xbc",
      "\xce\xbd",
      "\xce\xbe",
      "\xce\xbf",
      "\xcf\x80",
      "\xcf\x81",
      "\xcf\x82",
      "\xcf\x83",
      "\xcf\x84",
      "\xcf\x85",
      "\xcf\x86",
      "\xcf\x87",
      "\xcf\x88",
      "\xcf\x89",
      "\xcf\x8a",
      "\xcf\x8b",
      "\xcf\x8c",
      "\xcf\x8d",
      "\xcf\x8e",
      "\xef\xbf\xbd",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x000000a0 => "\xa0",
      0x000000a3 => "\xa3",
      0x000000a4 => "\xa4",
      0x000000a5 => "\xa5",
      0x000000a6 => "\xa6",
      0x000000a7 => "\xa7",
      0x000000a8 => "\xa8",
      0x000000a9 => "\xa9",
      0x000000ab => "\xab",
      0x000000ac => "\xac",
      0x000000ad => "\xad",
      0x000000ae => "\xae",
      0x000000b0 => "\xb0",
      0x000000b1 => "\xb1",
      0x000000b2 => "\xb2",
      0x000000b3 => "\xb3",
      0x000000b5 => "\xb5",
      0x000000b6 => "\xb6",
      0x000000b7 => "\xb7",
      0x000000bb => "\xbb",
      0x000000bd => "\xbd",
      0x00000192 => "\x83",
      0x00000384 => "\xb4",
      0x00000385 => "\xa1",
      0x00000386 => "\xa2",
      0x00000388 => "\xb8",
      0x00000389 => "\xb9",
      0x0000038a => "\xba",
      0x0000038c => "\xbc",
      0x0000038e => "\xbe",
      0x0000038f => "\xbf",
      0x00000390 => "\xc0",
      0x00000391 => "\xc1",
      0x00000392 => "\xc2",
      0x00000393 => "\xc3",
      0x00000394 => "\xc4",
      0x00000395 => "\xc5",
      0x00000396 => "\xc6",
      0x00000397 => "\xc7",
      0x00000398 => "\xc8",
      0x00000399 => "\xc9",
      0x0000039a => "\xca",
      0x0000039b => "\xcb",
      0x0000039c => "\xcc",
      0x0000039d => "\xcd",
      0x0000039e => "\xce",
      0x0000039f => "\xcf",
      0x000003a0 => "\xd0",
      0x000003a1 => "\xd1",
      0x000003a3 => "\xd3",
      0x000003a4 => "\xd4",
      0x000003a5 => "\xd5",
      0x000003a6 => "\xd6",
      0x000003a7 => "\xd7",
      0x000003a8 => "\xd8",
      0x000003a9 => "\xd9",
      0x000003aa => "\xda",
      0x000003ab => "\xdb",
      0x000003ac => "\xdc",
      0x000003ad => "\xdd",
      0x000003ae => "\xde",
      0x000003af => "\xdf",
      0x000003b0 => "\xe0",
      0x000003b1 => "\xe1",
      0x000003b2 => "\xe2",
      0x000003b3 => "\xe3",
      0x000003b4 => "\xe4",
      0x000003b5 => "\xe5",
      0x000003b6 => "\xe6",
      0x000003b7 => "\xe7",
      0x000003b8 => "\xe8",
      0x000003b9 => "\xe9",
      0x000003ba => "\xea",
      0x000003bb => "\xeb",
      0x000003bc => "\xec",
      0x000003bd => "\xed",
      0x000003be => "\xee",
      0x000003bf => "\xef",
      0x000003c0 => "\xf0",
      0x000003c1 => "\xf1",
      0x000003c2 => "\xf2",
      0x000003c3 => "\xf3",
      0x000003c4 => "\xf4",
      0x000003c5 => "\xf5",
      0x000003c6 => "\xf6",
      0x000003c7 => "\xf7",
      0x000003c8 => "\xf8",
      0x000003c9 => "\xf9",
      0x000003ca => "\xfa",
      0x000003cb => "\xfb",
      0x000003cc => "\xfc",
      0x000003cd => "\xfd",
      0x000003ce => "\xfe",
      0x00002013 => "\x96",
      0x00002014 => "\x97",
      0x00002015 => "\xaf",
      0x00002018 => "\x91",
      0x00002019 => "\x92",
      0x0000201a => "\x82",
      0x0000201c => "\x93",
      0x0000201d => "\x94",
      0x0000201e => "\x84",
      0x00002020 => "\x86",
      0x00002021 => "\x87",
      0x00002022 => "\x95",
      0x00002026 => "\x85",
      0x00002030 => "\x89",
      0x00002039 => "\x8b",
      0x0000203a => "\x9b",
      0x000020ac => "\x80",
      0x00002122 => "\x99",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::CP1253 - Conversion routines for CP1253
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for CP1253.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
   repertoiremap: mnemonic,ds
    source: UNICODE 1.0
   alias MS-GREEK
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE (DEL)
      80 |  000020AC | EURO SIGN
      82 |  0000201A | SINGLE LOW-9 QUOTATION MARK
      83 |  00000192 | LATIN SMALL LETTER F WITH HOOK
      84 |  0000201E | DOUBLE LOW-9 QUOTATION MARK
      85 |  00002026 | HORIZONTAL ELLIPSIS
      86 |  00002020 | DAGGER
      87 |  00002021 | DOUBLE DAGGER
      89 |  00002030 | PER MILLE SIGN
      8B |  00002039 | SINGLE LEFT-POINTING ANGLE QUOTATION MARK
      91 |  00002018 | LEFT SINGLE QUOTATION MARK
      92 |  00002019 | RIGHT SINGLE QUOTATION MARK
      93 |  0000201C | LEFT DOUBLE QUOTATION MARK
      94 |  0000201D | RIGHT DOUBLE QUOTATION MARK
      95 |  00002022 | BULLET
      96 |  00002013 | EN DASH
      97 |  00002014 | EM DASH
      99 |  00002122 | TRADE MARK SIGN
      9B |  0000203A | SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
      A0 |  000000A0 | NO-BREAK SPACE
      A1 |  00000385 | GREEK DIALYTIKA TONOS
      A2 |  00000386 | GREEK CAPITAL LETTER ALPHA WITH TONOS
      A3 |  000000A3 | POUND SIGN
      A4 |  000000A4 | CURRENCY SIGN
      A5 |  000000A5 | YEN SIGN
      A6 |  000000A6 | BROKEN BAR
      A7 |  000000A7 | SECTION SIGN
      A8 |  000000A8 | DIAERESIS
      A9 |  000000A9 | COPYRIGHT SIGN
      AB |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
      AC |  000000AC | NOT SIGN
      AD |  000000AD | SOFT HYPHEN
      AE |  000000AE | REGISTERED SIGN
      AF |  00002015 | HORIZONTAL BAR
      B0 |  000000B0 | DEGREE SIGN
      B1 |  000000B1 | PLUS-MINUS SIGN
      B2 |  000000B2 | SUPERSCRIPT TWO
      B3 |  000000B3 | SUPERSCRIPT THREE
      B4 |  00000384 | GREEK TONOS
      B5 |  000000B5 | MICRO SIGN
      B6 |  000000B6 | PILCROW SIGN
      B7 |  000000B7 | MIDDLE DOT
      B8 |  00000388 | GREEK CAPITAL LETTER EPSILON WITH TONOS
      B9 |  00000389 | GREEK CAPITAL LETTER ETA WITH TONOS
      BA |  0000038A | GREEK CAPITAL LETTER IOTA WITH TONOS
      BB |  000000BB | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
      BC |  0000038C | GREEK CAPITAL LETTER OMICRON WITH TONOS
      BD |  000000BD | VULGAR FRACTION ONE HALF
      BE |  0000038E | GREEK CAPITAL LETTER UPSILON WITH TONOS
      BF |  0000038F | GREEK CAPITAL LETTER OMEGA WITH TONOS
      C0 |  00000390 | GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
      C1 |  00000391 | GREEK CAPITAL LETTER ALPHA
      C2 |  00000392 | GREEK CAPITAL LETTER BETA
      C3 |  00000393 | GREEK CAPITAL LETTER GAMMA
      C4 |  00000394 | GREEK CAPITAL LETTER DELTA
      C5 |  00000395 | GREEK CAPITAL LETTER EPSILON
      C6 |  00000396 | GREEK CAPITAL LETTER ZETA
      C7 |  00000397 | GREEK CAPITAL LETTER ETA
      C8 |  00000398 | GREEK CAPITAL LETTER THETA
      C9 |  00000399 | GREEK CAPITAL LETTER IOTA
      CA |  0000039A | GREEK CAPITAL LETTER KAPPA
      CB |  0000039B | GREEK CAPITAL LETTER LAMDA
      CC |  0000039C | GREEK CAPITAL LETTER MU
      CD |  0000039D | GREEK CAPITAL LETTER NU
      CE |  0000039E | GREEK CAPITAL LETTER XI
      CF |  0000039F | GREEK CAPITAL LETTER OMICRON
      D0 |  000003A0 | GREEK CAPITAL LETTER PI
      D1 |  000003A1 | GREEK CAPITAL LETTER RHO
      D3 |  000003A3 | GREEK CAPITAL LETTER SIGMA
      D4 |  000003A4 | GREEK CAPITAL LETTER TAU
      D5 |  000003A5 | GREEK CAPITAL LETTER UPSILON
      D6 |  000003A6 | GREEK CAPITAL LETTER PHI
      D7 |  000003A7 | GREEK CAPITAL LETTER CHI
      D8 |  000003A8 | GREEK CAPITAL LETTER PSI
      D9 |  000003A9 | GREEK CAPITAL LETTER OMEGA
      DA |  000003AA | GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
      DB |  000003AB | GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
      DC |  000003AC | GREEK SMALL LETTER ALPHA WITH TONOS
      DD |  000003AD | GREEK SMALL LETTER EPSILON WITH TONOS
      DE |  000003AE | GREEK SMALL LETTER ETA WITH TONOS
      DF |  000003AF | GREEK SMALL LETTER IOTA WITH TONOS
      E0 |  000003B0 | GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
      E1 |  000003B1 | GREEK SMALL LETTER ALPHA
      E2 |  000003B2 | GREEK SMALL LETTER BETA
      E3 |  000003B3 | GREEK SMALL LETTER GAMMA
      E4 |  000003B4 | GREEK SMALL LETTER DELTA
      E5 |  000003B5 | GREEK SMALL LETTER EPSILON
      E6 |  000003B6 | GREEK SMALL LETTER ZETA
      E7 |  000003B7 | GREEK SMALL LETTER ETA
      E8 |  000003B8 | GREEK SMALL LETTER THETA
      E9 |  000003B9 | GREEK SMALL LETTER IOTA
      EA |  000003BA | GREEK SMALL LETTER KAPPA
      EB |  000003BB | GREEK SMALL LETTER LAMDA
      EC |  000003BC | GREEK SMALL LETTER MU
      ED |  000003BD | GREEK SMALL LETTER NU
      EE |  000003BE | GREEK SMALL LETTER XI
      EF |  000003BF | GREEK SMALL LETTER OMICRON
      F0 |  000003C0 | GREEK SMALL LETTER PI
      F1 |  000003C1 | GREEK SMALL LETTER RHO
      F2 |  000003C2 | GREEK SMALL LETTER FINAL SIGMA
      F3 |  000003C3 | GREEK SMALL LETTER SIGMA
      F4 |  000003C4 | GREEK SMALL LETTER TAU
      F5 |  000003C5 | GREEK SMALL LETTER UPSILON
      F6 |  000003C6 | GREEK SMALL LETTER PHI
      F7 |  000003C7 | GREEK SMALL LETTER CHI
      F8 |  000003C8 | GREEK SMALL LETTER PSI
      F9 |  000003C9 | GREEK SMALL LETTER OMEGA
      FA |  000003CA | GREEK SMALL LETTER IOTA WITH DIALYTIKA
      FB |  000003CB | GREEK SMALL LETTER UPSILON WITH DIALYTIKA
      FC |  000003CC | GREEK SMALL LETTER OMICRON WITH TONOS
      FD |  000003CD | GREEK SMALL LETTER UPSILON WITH TONOS
      FE |  000003CE | GREEK SMALL LETTER OMEGA WITH TONOS
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_CP1253

    $main::fatpacked{"Locale/RecodeData/CP1254.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_CP1254';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for CP1254.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::CP1254;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0x20ac,
      0xfffd,
      0x201a,
      0x0192,
      0x201e,
      0x2026,
      0x2020,
      0x2021,
      0x02c6,
      0x2030,
      0x0160,
      0x2039,
      0x0152,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x2018,
      0x2019,
      0x201c,
      0x201d,
      0x2022,
      0x2013,
      0x2014,
      0x02dc,
      0x2122,
      0x0161,
      0x203a,
      0x0153,
      0xfffd,
      0xfffd,
      0x0178,
      0x00a0,
      0x00a1,
      0x00a2,
      0x00a3,
      0x00a4,
      0x00a5,
      0x00a6,
      0x00a7,
      0x00a8,
      0x00a9,
      0x00aa,
      0x00ab,
      0x00ac,
      0x00ad,
      0x00ae,
      0x00af,
      0x00b0,
      0x00b1,
      0x00b2,
      0x00b3,
      0x00b4,
      0x00b5,
      0x00b6,
      0x00b7,
      0x00b8,
      0x00b9,
      0x00ba,
      0x00bb,
      0x00bc,
      0x00bd,
      0x00be,
      0x00bf,
      0x00c0,
      0x00c1,
      0x00c2,
      0x00c3,
      0x00c4,
      0x00c5,
      0x00c6,
      0x00c7,
      0x00c8,
      0x00c9,
      0x00ca,
      0x00cb,
      0x00cc,
      0x00cd,
      0x00ce,
      0x00cf,
      0x011e,
      0x00d1,
      0x00d2,
      0x00d3,
      0x00d4,
      0x00d5,
      0x00d6,
      0x00d7,
      0x00d8,
      0x00d9,
      0x00da,
      0x00db,
      0x00dc,
      0x0130,
      0x015e,
      0x00df,
      0x00e0,
      0x00e1,
      0x00e2,
      0x00e3,
      0x00e4,
      0x00e5,
      0x00e6,
      0x00e7,
      0x00e8,
      0x00e9,
      0x00ea,
      0x00eb,
      0x00ec,
      0x00ed,
      0x00ee,
      0x00ef,
      0x011f,
      0x00f1,
      0x00f2,
      0x00f3,
      0x00f4,
      0x00f5,
      0x00f6,
      0x00f7,
      0x00f8,
      0x00f9,
      0x00fa,
      0x00fb,
      0x00fc,
      0x0131,
      0x015f,
      0x00ff,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xe2\x82\xac",
      "\xef\xbf\xbd",
      "\xe2\x80\x9a",
      "\xc6\x92",
      "\xe2\x80\x9e",
      "\xe2\x80\xa6",
      "\xe2\x80\xa0",
      "\xe2\x80\xa1",
      "\xcb\x86",
      "\xe2\x80\xb0",
      "\xc5\xa0",
      "\xe2\x80\xb9",
      "\xc5\x92",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xe2\x80\x98",
      "\xe2\x80\x99",
      "\xe2\x80\x9c",
      "\xe2\x80\x9d",
      "\xe2\x80\xa2",
      "\xe2\x80\x93",
      "\xe2\x80\x94",
      "\xcb\x9c",
      "\xe2\x84\xa2",
      "\xc5\xa1",
      "\xe2\x80\xba",
      "\xc5\x93",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc5\xb8",
      "\xc2\xa0",
      "\xc2\xa1",
      "\xc2\xa2",
      "\xc2\xa3",
      "\xc2\xa4",
      "\xc2\xa5",
      "\xc2\xa6",
      "\xc2\xa7",
      "\xc2\xa8",
      "\xc2\xa9",
      "\xc2\xaa",
      "\xc2\xab",
      "\xc2\xac",
      "\xc2\xad",
      "\xc2\xae",
      "\xc2\xaf",
      "\xc2\xb0",
      "\xc2\xb1",
      "\xc2\xb2",
      "\xc2\xb3",
      "\xc2\xb4",
      "\xc2\xb5",
      "\xc2\xb6",
      "\xc2\xb7",
      "\xc2\xb8",
      "\xc2\xb9",
      "\xc2\xba",
      "\xc2\xbb",
      "\xc2\xbc",
      "\xc2\xbd",
      "\xc2\xbe",
      "\xc2\xbf",
      "\xc3\x80",
      "\xc3\x81",
      "\xc3\x82",
      "\xc3\x83",
      "\xc3\x84",
      "\xc3\x85",
      "\xc3\x86",
      "\xc3\x87",
      "\xc3\x88",
      "\xc3\x89",
      "\xc3\x8a",
      "\xc3\x8b",
      "\xc3\x8c",
      "\xc3\x8d",
      "\xc3\x8e",
      "\xc3\x8f",
      "\xc4\x9e",
      "\xc3\x91",
      "\xc3\x92",
      "\xc3\x93",
      "\xc3\x94",
      "\xc3\x95",
      "\xc3\x96",
      "\xc3\x97",
      "\xc3\x98",
      "\xc3\x99",
      "\xc3\x9a",
      "\xc3\x9b",
      "\xc3\x9c",
      "\xc4\xb0",
      "\xc5\x9e",
      "\xc3\x9f",
      "\xc3\xa0",
      "\xc3\xa1",
      "\xc3\xa2",
      "\xc3\xa3",
      "\xc3\xa4",
      "\xc3\xa5",
      "\xc3\xa6",
      "\xc3\xa7",
      "\xc3\xa8",
      "\xc3\xa9",
      "\xc3\xaa",
      "\xc3\xab",
      "\xc3\xac",
      "\xc3\xad",
      "\xc3\xae",
      "\xc3\xaf",
      "\xc4\x9f",
      "\xc3\xb1",
      "\xc3\xb2",
      "\xc3\xb3",
      "\xc3\xb4",
      "\xc3\xb5",
      "\xc3\xb6",
      "\xc3\xb7",
      "\xc3\xb8",
      "\xc3\xb9",
      "\xc3\xba",
      "\xc3\xbb",
      "\xc3\xbc",
      "\xc4\xb1",
      "\xc5\x9f",
      "\xc3\xbf",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x000000a0 => "\xa0",
      0x000000a1 => "\xa1",
      0x000000a2 => "\xa2",
      0x000000a3 => "\xa3",
      0x000000a4 => "\xa4",
      0x000000a5 => "\xa5",
      0x000000a6 => "\xa6",
      0x000000a7 => "\xa7",
      0x000000a8 => "\xa8",
      0x000000a9 => "\xa9",
      0x000000aa => "\xaa",
      0x000000ab => "\xab",
      0x000000ac => "\xac",
      0x000000ad => "\xad",
      0x000000ae => "\xae",
      0x000000af => "\xaf",
      0x000000b0 => "\xb0",
      0x000000b1 => "\xb1",
      0x000000b2 => "\xb2",
      0x000000b3 => "\xb3",
      0x000000b4 => "\xb4",
      0x000000b5 => "\xb5",
      0x000000b6 => "\xb6",
      0x000000b7 => "\xb7",
      0x000000b8 => "\xb8",
      0x000000b9 => "\xb9",
      0x000000ba => "\xba",
      0x000000bb => "\xbb",
      0x000000bc => "\xbc",
      0x000000bd => "\xbd",
      0x000000be => "\xbe",
      0x000000bf => "\xbf",
      0x000000c0 => "\xc0",
      0x000000c1 => "\xc1",
      0x000000c2 => "\xc2",
      0x000000c3 => "\xc3",
      0x000000c4 => "\xc4",
      0x000000c5 => "\xc5",
      0x000000c6 => "\xc6",
      0x000000c7 => "\xc7",
      0x000000c8 => "\xc8",
      0x000000c9 => "\xc9",
      0x000000ca => "\xca",
      0x000000cb => "\xcb",
      0x000000cc => "\xcc",
      0x000000cd => "\xcd",
      0x000000ce => "\xce",
      0x000000cf => "\xcf",
      0x000000d1 => "\xd1",
      0x000000d2 => "\xd2",
      0x000000d3 => "\xd3",
      0x000000d4 => "\xd4",
      0x000000d5 => "\xd5",
      0x000000d6 => "\xd6",
      0x000000d7 => "\xd7",
      0x000000d8 => "\xd8",
      0x000000d9 => "\xd9",
      0x000000da => "\xda",
      0x000000db => "\xdb",
      0x000000dc => "\xdc",
      0x000000df => "\xdf",
      0x000000e0 => "\xe0",
      0x000000e1 => "\xe1",
      0x000000e2 => "\xe2",
      0x000000e3 => "\xe3",
      0x000000e4 => "\xe4",
      0x000000e5 => "\xe5",
      0x000000e6 => "\xe6",
      0x000000e7 => "\xe7",
      0x000000e8 => "\xe8",
      0x000000e9 => "\xe9",
      0x000000ea => "\xea",
      0x000000eb => "\xeb",
      0x000000ec => "\xec",
      0x000000ed => "\xed",
      0x000000ee => "\xee",
      0x000000ef => "\xef",
      0x000000f1 => "\xf1",
      0x000000f2 => "\xf2",
      0x000000f3 => "\xf3",
      0x000000f4 => "\xf4",
      0x000000f5 => "\xf5",
      0x000000f6 => "\xf6",
      0x000000f7 => "\xf7",
      0x000000f8 => "\xf8",
      0x000000f9 => "\xf9",
      0x000000fa => "\xfa",
      0x000000fb => "\xfb",
      0x000000fc => "\xfc",
      0x000000ff => "\xff",
      0x0000011e => "\xd0",
      0x0000011f => "\xf0",
      0x00000130 => "\xdd",
      0x00000131 => "\xfd",
      0x00000152 => "\x8c",
      0x00000153 => "\x9c",
      0x0000015e => "\xde",
      0x0000015f => "\xfe",
      0x00000160 => "\x8a",
      0x00000161 => "\x9a",
      0x00000178 => "\x9f",
      0x00000192 => "\x83",
      0x000002c6 => "\x88",
      0x000002dc => "\x98",
      0x00002013 => "\x96",
      0x00002014 => "\x97",
      0x00002018 => "\x91",
      0x00002019 => "\x92",
      0x0000201a => "\x82",
      0x0000201c => "\x93",
      0x0000201d => "\x94",
      0x0000201e => "\x84",
      0x00002020 => "\x86",
      0x00002021 => "\x87",
      0x00002022 => "\x95",
      0x00002026 => "\x85",
      0x00002030 => "\x89",
      0x00002039 => "\x8b",
      0x0000203a => "\x9b",
      0x000020ac => "\x80",
      0x00002122 => "\x99",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::CP1254 - Conversion routines for CP1254
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for CP1254.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
   repertoiremap: mnemonic,ds
    source: UNICODE 1.0
   alias MS-TURK
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE (DEL)
      80 |  000020AC | EURO SIGN
      82 |  0000201A | SINGLE LOW-9 QUOTATION MARK
      83 |  00000192 | LATIN SMALL LETTER F WITH HOOK
      84 |  0000201E | DOUBLE LOW-9 QUOTATION MARK
      85 |  00002026 | HORIZONTAL ELLIPSIS
      86 |  00002020 | DAGGER
      87 |  00002021 | DOUBLE DAGGER
      88 |  000002C6 | MODIFIER LETTER CIRCUMFLEX ACCENT
      89 |  00002030 | PER MILLE SIGN
      8A |  00000160 | LATIN CAPITAL LETTER S WITH CARON
      8B |  00002039 | SINGLE LEFT-POINTING ANGLE QUOTATION MARK
      8C |  00000152 | LATIN CAPITAL LIGATURE OE
      91 |  00002018 | LEFT SINGLE QUOTATION MARK
      92 |  00002019 | RIGHT SINGLE QUOTATION MARK
      93 |  0000201C | LEFT DOUBLE QUOTATION MARK
      94 |  0000201D | RIGHT DOUBLE QUOTATION MARK
      95 |  00002022 | BULLET
      96 |  00002013 | EN DASH
      97 |  00002014 | EM DASH
      98 |  000002DC | SMALL TILDE
      99 |  00002122 | TRADE MARK SIGN
      9A |  00000161 | LATIN SMALL LETTER S WITH CARON
      9B |  0000203A | SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
      9C |  00000153 | LATIN SMALL LIGATURE OE
      9F |  00000178 | LATIN CAPITAL LETTER Y WITH DIAERESIS
      A0 |  000000A0 | NO-BREAK SPACE
      A1 |  000000A1 | INVERTED EXCLAMATION MARK
      A2 |  000000A2 | CENT SIGN
      A3 |  000000A3 | POUND SIGN
      A4 |  000000A4 | CURRENCY SIGN
      A5 |  000000A5 | YEN SIGN
      A6 |  000000A6 | BROKEN BAR
      A7 |  000000A7 | SECTION SIGN
      A8 |  000000A8 | DIAERESIS
      A9 |  000000A9 | COPYRIGHT SIGN
      AA |  000000AA | FEMININE ORDINAL INDICATOR
      AB |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
      AC |  000000AC | NOT SIGN
      AD |  000000AD | SOFT HYPHEN
      AE |  000000AE | REGISTERED SIGN
      AF |  000000AF | MACRON
      B0 |  000000B0 | DEGREE SIGN
      B1 |  000000B1 | PLUS-MINUS SIGN
      B2 |  000000B2 | SUPERSCRIPT TWO
      B3 |  000000B3 | SUPERSCRIPT THREE
      B4 |  000000B4 | ACUTE ACCENT
      B5 |  000000B5 | MICRO SIGN
      B6 |  000000B6 | PILCROW SIGN
      B7 |  000000B7 | MIDDLE DOT
      B8 |  000000B8 | CEDILLA
      B9 |  000000B9 | SUPERSCRIPT ONE
      BA |  000000BA | MASCULINE ORDINAL INDICATOR
      BB |  000000BB | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
      BC |  000000BC | VULGAR FRACTION ONE QUARTER
      BD |  000000BD | VULGAR FRACTION ONE HALF
      BE |  000000BE | VULGAR FRACTION THREE QUARTERS
      BF |  000000BF | INVERTED QUESTION MARK
      C0 |  000000C0 | LATIN CAPITAL LETTER A WITH GRAVE
      C1 |  000000C1 | LATIN CAPITAL LETTER A WITH ACUTE
      C2 |  000000C2 | LATIN CAPITAL LETTER A WITH CIRCUMFLEX
      C3 |  000000C3 | LATIN CAPITAL LETTER A WITH TILDE
      C4 |  000000C4 | LATIN CAPITAL LETTER A WITH DIAERESIS
      C5 |  000000C5 | LATIN CAPITAL LETTER A WITH RING ABOVE
      C6 |  000000C6 | LATIN CAPITAL LETTER AE
      C7 |  000000C7 | LATIN CAPITAL LETTER C WITH CEDILLA
      C8 |  000000C8 | LATIN CAPITAL LETTER E WITH GRAVE
      C9 |  000000C9 | LATIN CAPITAL LETTER E WITH ACUTE
      CA |  000000CA | LATIN CAPITAL LETTER E WITH CIRCUMFLEX
      CB |  000000CB | LATIN CAPITAL LETTER E WITH DIAERESIS
      CC |  000000CC | LATIN CAPITAL LETTER I WITH GRAVE
      CD |  000000CD | LATIN CAPITAL LETTER I WITH ACUTE
      CE |  000000CE | LATIN CAPITAL LETTER I WITH CIRCUMFLEX
      CF |  000000CF | LATIN CAPITAL LETTER I WITH DIAERESIS
      D0 |  0000011E | LATIN CAPITAL LETTER G WITH BREVE
      D1 |  000000D1 | LATIN CAPITAL LETTER N WITH TILDE
      D2 |  000000D2 | LATIN CAPITAL LETTER O WITH GRAVE
      D3 |  000000D3 | LATIN CAPITAL LETTER O WITH ACUTE
      D4 |  000000D4 | LATIN CAPITAL LETTER O WITH CIRCUMFLEX
      D5 |  000000D5 | LATIN CAPITAL LETTER O WITH TILDE
      D6 |  000000D6 | LATIN CAPITAL LETTER O WITH DIAERESIS
      D7 |  000000D7 | MULTIPLICATION SIGN
      D8 |  000000D8 | LATIN CAPITAL LETTER O WITH STROKE
      D9 |  000000D9 | LATIN CAPITAL LETTER U WITH GRAVE
      DA |  000000DA | LATIN CAPITAL LETTER U WITH ACUTE
      DB |  000000DB | LATIN CAPITAL LETTER U WITH CIRCUMFLEX
      DC |  000000DC | LATIN CAPITAL LETTER U WITH DIAERESIS
      DD |  00000130 | LATIN CAPITAL LETTER I WITH DOT ABOVE
      DE |  0000015E | LATIN CAPITAL LETTER S WITH CEDILLA
      DF |  000000DF | LATIN SMALL LETTER SHARP S (German)
      E0 |  000000E0 | LATIN SMALL LETTER A WITH GRAVE
      E1 |  000000E1 | LATIN SMALL LETTER A WITH ACUTE
      E2 |  000000E2 | LATIN SMALL LETTER A WITH CIRCUMFLEX
      E3 |  000000E3 | LATIN SMALL LETTER A WITH TILDE
      E4 |  000000E4 | LATIN SMALL LETTER A WITH DIAERESIS
      E5 |  000000E5 | LATIN SMALL LETTER A WITH RING ABOVE
      E6 |  000000E6 | LATIN SMALL LETTER AE
      E7 |  000000E7 | LATIN SMALL LETTER C WITH CEDILLA
      E8 |  000000E8 | LATIN SMALL LETTER E WITH GRAVE
      E9 |  000000E9 | LATIN SMALL LETTER E WITH ACUTE
      EA |  000000EA | LATIN SMALL LETTER E WITH CIRCUMFLEX
      EB |  000000EB | LATIN SMALL LETTER E WITH DIAERESIS
      EC |  000000EC | LATIN SMALL LETTER E WITH GRAVE
      ED |  000000ED | LATIN SMALL LETTER I WITH ACUTE
      EE |  000000EE | LATIN SMALL LETTER I WITH CIRCUMFLEX
      EF |  000000EF | LATIN SMALL LETTER I WITH DIAERESIS
      F0 |  0000011F | LATIN SMALL LETTER G WITH BREVE
      F1 |  000000F1 | LATIN SMALL LETTER N WITH TILDE
      F2 |  000000F2 | LATIN SMALL LETTER O WITH GRAVE
      F3 |  000000F3 | LATIN SMALL LETTER O WITH ACUTE
      F4 |  000000F4 | LATIN SMALL LETTER O WITH CIRCUMFLEX
      F5 |  000000F5 | LATIN SMALL LETTER O WITH TILDE
      F6 |  000000F6 | LATIN SMALL LETTER O WITH DIAERESIS
      F7 |  000000F7 | DIVISION SIGN
      F8 |  000000F8 | LATIN SMALL LETTER O WITH STROKE
      F9 |  000000F9 | LATIN SMALL LETTER U WITH GRAVE
      FA |  000000FA | LATIN SMALL LETTER U WITH ACUTE
      FB |  000000FB | LATIN SMALL LETTER U WITH CIRCUMFLEX
      FC |  000000FC | LATIN SMALL LETTER U WITH DIAERESIS
      FD |  00000131 | LATIN SMALL LETTER DOTLESS I
      FE |  0000015F | LATIN SMALL LETTER S WITH CEDILLA
      FF |  000000FF | LATIN SMALL LETTER Y WITH DIAERESIS
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_CP1254

    $main::fatpacked{"Locale/RecodeData/CP1256.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_CP1256';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for CP1256.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::CP1256;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0x20ac,
      0x067e,
      0x201a,
      0x0192,
      0x201e,
      0x2026,
      0x2020,
      0x2021,
      0x02c6,
      0x2030,
      0x0679,
      0x2039,
      0x0152,
      0x0686,
      0x0698,
      0x0688,
      0x06af,
      0x2018,
      0x2019,
      0x201c,
      0x201d,
      0x2022,
      0x2013,
      0x2014,
      0x06a9,
      0x2122,
      0x0691,
      0x203a,
      0x0153,
      0x200c,
      0x200d,
      0x06ba,
      0x00a0,
      0x060c,
      0x00a2,
      0x00a3,
      0x00a4,
      0x00a5,
      0x00a6,
      0x00a7,
      0x00a8,
      0x00a9,
      0x06be,
      0x00ab,
      0x00ac,
      0x00ad,
      0x00ae,
      0x00af,
      0x00b0,
      0x00b1,
      0x00b2,
      0x00b3,
      0x00b4,
      0x00b5,
      0x00b6,
      0x00b7,
      0x00b8,
      0x00b9,
      0x061b,
      0x00bb,
      0x00bc,
      0x00bd,
      0x00be,
      0x061f,
      0x06c1,
      0x0621,
      0x0622,
      0x0623,
      0x0624,
      0x0625,
      0x0626,
      0x0627,
      0x0628,
      0x0629,
      0x062a,
      0x062b,
      0x062c,
      0x062d,
      0x062e,
      0x062f,
      0x0630,
      0x0631,
      0x0632,
      0x0633,
      0x0634,
      0x0635,
      0x0636,
      0x00d7,
      0x0637,
      0x0638,
      0x0639,
      0x063a,
      0x0640,
      0x0641,
      0x0642,
      0x0643,
      0x00e0,
      0x0644,
      0x00e2,
      0x0645,
      0x0646,
      0x0647,
      0x0648,
      0x00e7,
      0x00e8,
      0x00e9,
      0x00ea,
      0x00eb,
      0x0649,
      0x064a,
      0x00ee,
      0x00ef,
      0x064b,
      0x064c,
      0x064d,
      0x064e,
      0x00f4,
      0x064f,
      0x0650,
      0x00f7,
      0x0651,
      0x00f9,
      0x0652,
      0x00fb,
      0x00fc,
      0x200e,
      0x200f,
      0x06d2,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xe2\x82\xac",
      "\xd9\xbe",
      "\xe2\x80\x9a",
      "\xc6\x92",
      "\xe2\x80\x9e",
      "\xe2\x80\xa6",
      "\xe2\x80\xa0",
      "\xe2\x80\xa1",
      "\xcb\x86",
      "\xe2\x80\xb0",
      "\xd9\xb9",
      "\xe2\x80\xb9",
      "\xc5\x92",
      "\xda\x86",
      "\xda\x98",
      "\xda\x88",
      "\xda\xaf",
      "\xe2\x80\x98",
      "\xe2\x80\x99",
      "\xe2\x80\x9c",
      "\xe2\x80\x9d",
      "\xe2\x80\xa2",
      "\xe2\x80\x93",
      "\xe2\x80\x94",
      "\xda\xa9",
      "\xe2\x84\xa2",
      "\xda\x91",
      "\xe2\x80\xba",
      "\xc5\x93",
      "\xe2\x80\x8c",
      "\xe2\x80\x8d",
      "\xda\xba",
      "\xc2\xa0",
      "\xd8\x8c",
      "\xc2\xa2",
      "\xc2\xa3",
      "\xc2\xa4",
      "\xc2\xa5",
      "\xc2\xa6",
      "\xc2\xa7",
      "\xc2\xa8",
      "\xc2\xa9",
      "\xda\xbe",
      "\xc2\xab",
      "\xc2\xac",
      "\xc2\xad",
      "\xc2\xae",
      "\xc2\xaf",
      "\xc2\xb0",
      "\xc2\xb1",
      "\xc2\xb2",
      "\xc2\xb3",
      "\xc2\xb4",
      "\xc2\xb5",
      "\xc2\xb6",
      "\xc2\xb7",
      "\xc2\xb8",
      "\xc2\xb9",
      "\xd8\x9b",
      "\xc2\xbb",
      "\xc2\xbc",
      "\xc2\xbd",
      "\xc2\xbe",
      "\xd8\x9f",
      "\xdb\x81",
      "\xd8\xa1",
      "\xd8\xa2",
      "\xd8\xa3",
      "\xd8\xa4",
      "\xd8\xa5",
      "\xd8\xa6",
      "\xd8\xa7",
      "\xd8\xa8",
      "\xd8\xa9",
      "\xd8\xaa",
      "\xd8\xab",
      "\xd8\xac",
      "\xd8\xad",
      "\xd8\xae",
      "\xd8\xaf",
      "\xd8\xb0",
      "\xd8\xb1",
      "\xd8\xb2",
      "\xd8\xb3",
      "\xd8\xb4",
      "\xd8\xb5",
      "\xd8\xb6",
      "\xc3\x97",
      "\xd8\xb7",
      "\xd8\xb8",
      "\xd8\xb9",
      "\xd8\xba",
      "\xd9\x80",
      "\xd9\x81",
      "\xd9\x82",
      "\xd9\x83",
      "\xc3\xa0",
      "\xd9\x84",
      "\xc3\xa2",
      "\xd9\x85",
      "\xd9\x86",
      "\xd9\x87",
      "\xd9\x88",
      "\xc3\xa7",
      "\xc3\xa8",
      "\xc3\xa9",
      "\xc3\xaa",
      "\xc3\xab",
      "\xd9\x89",
      "\xd9\x8a",
      "\xc3\xae",
      "\xc3\xaf",
      "\xd9\x8b",
      "\xd9\x8c",
      "\xd9\x8d",
      "\xd9\x8e",
      "\xc3\xb4",
      "\xd9\x8f",
      "\xd9\x90",
      "\xc3\xb7",
      "\xd9\x91",
      "\xc3\xb9",
      "\xd9\x92",
      "\xc3\xbb",
      "\xc3\xbc",
      "\xe2\x80\x8e",
      "\xe2\x80\x8f",
      "\xdb\x92",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x000000a0 => "\xa0",
      0x000000a2 => "\xa2",
      0x000000a3 => "\xa3",
      0x000000a4 => "\xa4",
      0x000000a5 => "\xa5",
      0x000000a6 => "\xa6",
      0x000000a7 => "\xa7",
      0x000000a8 => "\xa8",
      0x000000a9 => "\xa9",
      0x000000ab => "\xab",
      0x000000ac => "\xac",
      0x000000ad => "\xad",
      0x000000ae => "\xae",
      0x000000af => "\xaf",
      0x000000b0 => "\xb0",
      0x000000b1 => "\xb1",
      0x000000b2 => "\xb2",
      0x000000b3 => "\xb3",
      0x000000b4 => "\xb4",
      0x000000b5 => "\xb5",
      0x000000b6 => "\xb6",
      0x000000b7 => "\xb7",
      0x000000b8 => "\xb8",
      0x000000b9 => "\xb9",
      0x000000bb => "\xbb",
      0x000000bc => "\xbc",
      0x000000bd => "\xbd",
      0x000000be => "\xbe",
      0x000000d7 => "\xd7",
      0x000000e0 => "\xe0",
      0x000000e2 => "\xe2",
      0x000000e7 => "\xe7",
      0x000000e8 => "\xe8",
      0x000000e9 => "\xe9",
      0x000000ea => "\xea",
      0x000000eb => "\xeb",
      0x000000ee => "\xee",
      0x000000ef => "\xef",
      0x000000f4 => "\xf4",
      0x000000f7 => "\xf7",
      0x000000f9 => "\xf9",
      0x000000fb => "\xfb",
      0x000000fc => "\xfc",
      0x00000152 => "\x8c",
      0x00000153 => "\x9c",
      0x00000192 => "\x83",
      0x000002c6 => "\x88",
      0x0000060c => "\xa1",
      0x0000061b => "\xba",
      0x0000061f => "\xbf",
      0x00000621 => "\xc1",
      0x00000622 => "\xc2",
      0x00000623 => "\xc3",
      0x00000624 => "\xc4",
      0x00000625 => "\xc5",
      0x00000626 => "\xc6",
      0x00000627 => "\xc7",
      0x00000628 => "\xc8",
      0x00000629 => "\xc9",
      0x0000062a => "\xca",
      0x0000062b => "\xcb",
      0x0000062c => "\xcc",
      0x0000062d => "\xcd",
      0x0000062e => "\xce",
      0x0000062f => "\xcf",
      0x00000630 => "\xd0",
      0x00000631 => "\xd1",
      0x00000632 => "\xd2",
      0x00000633 => "\xd3",
      0x00000634 => "\xd4",
      0x00000635 => "\xd5",
      0x00000636 => "\xd6",
      0x00000637 => "\xd8",
      0x00000638 => "\xd9",
      0x00000639 => "\xda",
      0x0000063a => "\xdb",
      0x00000640 => "\xdc",
      0x00000641 => "\xdd",
      0x00000642 => "\xde",
      0x00000643 => "\xdf",
      0x00000644 => "\xe1",
      0x00000645 => "\xe3",
      0x00000646 => "\xe4",
      0x00000647 => "\xe5",
      0x00000648 => "\xe6",
      0x00000649 => "\xec",
      0x0000064a => "\xed",
      0x0000064b => "\xf0",
      0x0000064c => "\xf1",
      0x0000064d => "\xf2",
      0x0000064e => "\xf3",
      0x0000064f => "\xf5",
      0x00000650 => "\xf6",
      0x00000651 => "\xf8",
      0x00000652 => "\xfa",
      0x00000679 => "\x8a",
      0x0000067e => "\x81",
      0x00000686 => "\x8d",
      0x00000688 => "\x8f",
      0x00000691 => "\x9a",
      0x00000698 => "\x8e",
      0x000006a9 => "\x98",
      0x000006af => "\x90",
      0x000006ba => "\x9f",
      0x000006be => "\xaa",
      0x000006c1 => "\xc0",
      0x000006d2 => "\xff",
      0x0000200c => "\x9d",
      0x0000200d => "\x9e",
      0x0000200e => "\xfd",
      0x0000200f => "\xfe",
      0x00002013 => "\x96",
      0x00002014 => "\x97",
      0x00002018 => "\x91",
      0x00002019 => "\x92",
      0x0000201a => "\x82",
      0x0000201c => "\x93",
      0x0000201d => "\x94",
      0x0000201e => "\x84",
      0x00002020 => "\x86",
      0x00002021 => "\x87",
      0x00002022 => "\x95",
      0x00002026 => "\x85",
      0x00002030 => "\x89",
      0x00002039 => "\x8b",
      0x0000203a => "\x9b",
      0x000020ac => "\x80",
      0x00002122 => "\x99",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::CP1256 - Conversion routines for CP1256
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for CP1256.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
   repertoiremap: mnemonic,ds
    source: UNICODE 1.0
   alias MS-ARAB
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE (DEL)
      80 |  000020AC | EURO SIGN
      81 |  0000067E | ARABIC LETTER PEH
      82 |  0000201A | SINGLE LOW-9 QUOTATION MARK
      83 |  00000192 | LATIN SMALL LETTER F WITH HOOK
      84 |  0000201E | DOUBLE LOW-9 QUOTATION MARK
      85 |  00002026 | HORIZONTAL ELLIPSIS
      86 |  00002020 | DAGGER
      87 |  00002021 | DOUBLE DAGGER
      88 |  000002C6 | MODIFIER LETTER CIRCUMFLEX ACCENT
      89 |  00002030 | PER MILLE SIGN
      8A |  00000679 | ARABIC LETTER TTEH
      8B |  00002039 | SINGLE LEFT-POINTING ANGLE QUOTATION MARK
      8C |  00000152 | LATIN CAPITAL LIGATURE OE
      8D |  00000686 | ARABIC LETTER TCHEH
      8E |  00000698 | ARABIC LETTER JEH
      8F |  00000688 | ARABIC LETTER DDAL
      90 |  000006AF | ARABIC LETTER GAF
      91 |  00002018 | LEFT SINGLE QUOTATION MARK
      92 |  00002019 | RIGHT SINGLE QUOTATION MARK
      93 |  0000201C | LEFT DOUBLE QUOTATION MARK
      94 |  0000201D | RIGHT DOUBLE QUOTATION MARK
      95 |  00002022 | BULLET
      96 |  00002013 | EN DASH
      97 |  00002014 | EM DASH
      98 |  000006A9 | ARABIC LETTER KEHEH
      99 |  00002122 | TRADE MARK SIGN
      9A |  00000691 | ARABIC LETTER RREH
      9B |  0000203A | SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
      9C |  00000153 | LATIN SMALL LIGATURE OE
      9D |  0000200C | ZERO WIDTH NON-JOINER
      9E |  0000200D | ZERO WIDTH JOINER
      9F |  000006BA | ARABIC LETTER NOON
      A0 |  000000A0 | NO-BREAK SPACE
      A1 |  0000060C | ARABIC COMMA
      A2 |  000000A2 | CENT SIGN
      A3 |  000000A3 | POUND SIGN
      A4 |  000000A4 | CURRENCY SIGN
      A5 |  000000A5 | YEN SIGN
      A6 |  000000A6 | BROKEN BAR
      A7 |  000000A7 | SECTION SIGN
      A8 |  000000A8 | DIAERESIS
      A9 |  000000A9 | COPYRIGHT SIGN
      AA |  000006BE | ARABIC LETTER HEH DOACHASHMEE
      AB |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
      AC |  000000AC | NOT SIGN
      AD |  000000AD | SOFT HYPHEN
      AE |  000000AE | REGISTERED SIGN
      AF |  000000AF | MACRON
      B0 |  000000B0 | DEGREE SIGN
      B1 |  000000B1 | PLUS-MINUS SIGN
      B2 |  000000B2 | SUPERSCRIPT TWO
      B3 |  000000B3 | SUPERSCRIPT THREE
      B4 |  000000B4 | ACUTE ACCENT
      B5 |  000000B5 | MICRO SIGN
      B6 |  000000B6 | PILCROW SIGN
      B7 |  000000B7 | MIDDLE DOT
      B8 |  000000B8 | CEDILLA
      B9 |  000000B9 | SUPERSCRIPT ONE
      BA |  0000061B | ARABIC SEMICOLON
      BB |  000000BB | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
      BC |  000000BC | VULGAR FRACTION ONE QUARTER
      BD |  000000BD | VULGAR FRACTION ONE HALF
      BE |  000000BE | VULGAR FRACTION THREE QUARTERS
      BF |  0000061F | ARABIC QUESTION MARK
      C0 |  000006C1 | ARABIC LETTER HEH GOAL
      C1 |  00000621 | ARABIC LETTER HAMZA
      C2 |  00000622 | ARABIC LETTER ALEF WITH MADDA ABOVE
      C3 |  00000623 | ARABIC LETTER ALEF WITH HAMZA ABOVE
      C4 |  00000624 | ARABIC LETTER WAW WITH HAMZA ABOVE
      C5 |  00000625 | ARABIC LETTER ALEF WITH HAMZA BELOW
      C6 |  00000626 | ARABIC LETTER YEH WITH HAMZA ABOVE
      C7 |  00000627 | ARABIC LETTER ALEF
      C8 |  00000628 | ARABIC LETTER BEH
      C9 |  00000629 | ARABIC LETTER TEH MARBUTA
      CA |  0000062A | ARABIC LETTER TEH
      CB |  0000062B | ARABIC LETTER THEH
      CC |  0000062C | ARABIC LETTER JEEM
      CD |  0000062D | ARABIC LETTER HAH
      CE |  0000062E | ARABIC LETTER KHAH
      CF |  0000062F | ARABIC LETTER DAL
      D0 |  00000630 | ARABIC LETTER THAL
      D1 |  00000631 | ARABIC LETTER REH
      D2 |  00000632 | ARABIC LETTER ZAIN
      D3 |  00000633 | ARABIC LETTER SEEN
      D4 |  00000634 | ARABIC LETTER SHEEN
      D5 |  00000635 | ARABIC LETTER SAD
      D6 |  00000636 | ARABIC LETTER DAD
      D7 |  000000D7 | MULTIPLICATION SIGN
      D8 |  00000637 | ARABIC LETTER TAH
      D9 |  00000638 | ARABIC LETTER ZAH
      DA |  00000639 | ARABIC LETTER AIN
      DB |  0000063A | ARABIC LETTER GHAIN
      DC |  00000640 | ARABIC TATWEEL
      DD |  00000641 | ARABIC LETTER FEH
      DE |  00000642 | ARABIC LETTER QAF
      DF |  00000643 | ARABIC LETTER KAF
      E0 |  000000E0 | LATIN SMALL LETTER A WITH GRAVE
      E1 |  00000644 | ARABIC LETTER LAM
      E2 |  000000E2 | LATIN SMALL LETTER A WITH CIRCUMFLEX
      E3 |  00000645 | ARABIC LETTER MEEM
      E4 |  00000646 | ARABIC LETTER NOON
      E5 |  00000647 | ARABIC LETTER HEH
      E6 |  00000648 | ARABIC LETTER WAW
      E7 |  000000E7 | LATIN SMALL LETTER C WITH CEDILLA
      E8 |  000000E8 | LATIN SMALL LETTER E WITH GRAVE
      E9 |  000000E9 | LATIN SMALL LETTER E WITH ACUTE
      EA |  000000EA | LATIN SMALL LETTER E WITH CIRCUMFLEX
      EB |  000000EB | LATIN SMALL LETTER E WITH DIAERESIS
      EC |  00000649 | ARABIC LETTER ALEF MAKSURA
      ED |  0000064A | ARABIC LETTER YEH
      EE |  000000EE | LATIN SMALL LETTER I WITH CIRCUMFLEX
      EF |  000000EF | LATIN SMALL LETTER I WITH DIAERESIS
      F0 |  0000064B | ARABIC FATHATAN
      F1 |  0000064C | ARABIC DAMMATAN
      F2 |  0000064D | ARABIC KASRATAN
      F3 |  0000064E | ARABIC FATHA
      F4 |  000000F4 | LATIN SMALL LETTER O WITH CIRCUMFLEX
      F5 |  0000064F | ARABIC DAMMA
      F6 |  00000650 | ARABIC KASRA
      F7 |  000000F7 | DIVISION SIGN
      F8 |  00000651 | ARABIC SHADDA
      F9 |  000000F9 | LATIN SMALL LETTER U WITH GRAVE
      FA |  00000652 | ARABIC SUKUN
      FB |  000000FB | LATIN SMALL LETTER U WITH CIRCUMFLEX
      FC |  000000FC | LATIN SMALL LETTER U WITH DIAERESIS
      FD |  0000200E | LEFT-TO-RIGHT MARK
      FE |  0000200F | RIGHT-TO-LEFT MARK
      FF |  000006D2 | ARABIC LETTER YEH BARREE
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_CP1256

    $main::fatpacked{"Locale/RecodeData/CP1257.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_CP1257';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for CP1257.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::CP1257;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0x20ac,
      0xfffd,
      0x201a,
      0xfffd,
      0x201e,
      0x2026,
      0x2020,
      0x2021,
      0xfffd,
      0x2030,
      0xfffd,
      0x2039,
      0xfffd,
      0x00a8,
      0x02c7,
      0x00b8,
      0xfffd,
      0x2018,
      0x2019,
      0x201c,
      0x201d,
      0x2022,
      0x2013,
      0x2014,
      0xfffd,
      0x2122,
      0xfffd,
      0x203a,
      0xfffd,
      0x00af,
      0x02db,
      0xfffd,
      0x00a0,
      0xfffd,
      0x00a2,
      0x00a3,
      0x00a4,
      0xfffd,
      0x00a6,
      0x00a7,
      0x00d8,
      0x00a9,
      0x0156,
      0x00ab,
      0x00ac,
      0x00ad,
      0x00ae,
      0x00c6,
      0x00b0,
      0x00b1,
      0x00b2,
      0x00b3,
      0x00b4,
      0x00b5,
      0x00b6,
      0x00b7,
      0x00f8,
      0x00b9,
      0x0157,
      0x00bb,
      0x00bc,
      0x00bd,
      0x00be,
      0x00e6,
      0x0104,
      0x012e,
      0x0100,
      0x0106,
      0x00c4,
      0x00c5,
      0x0118,
      0x0112,
      0x010c,
      0x00c9,
      0x0179,
      0x0116,
      0x0122,
      0x0136,
      0x012a,
      0x013b,
      0x0160,
      0x0143,
      0x0145,
      0x00d3,
      0x014c,
      0x00d5,
      0x00d6,
      0x00d7,
      0x0172,
      0x0141,
      0x015a,
      0x016a,
      0x00dc,
      0x017b,
      0x017d,
      0x00df,
      0x0105,
      0x012f,
      0x0101,
      0x0107,
      0x00e4,
      0x00e5,
      0x0119,
      0x0113,
      0x010d,
      0x00e9,
      0x017a,
      0x0117,
      0x0123,
      0x0137,
      0x012b,
      0x013c,
      0x0161,
      0x0144,
      0x0146,
      0x00f3,
      0x014d,
      0x00f5,
      0x00f6,
      0x00f7,
      0x0173,
      0x0142,
      0x015b,
      0x016b,
      0x00fc,
      0x017c,
      0x017e,
      0x02d9,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xe2\x82\xac",
      "\xef\xbf\xbd",
      "\xe2\x80\x9a",
      "\xef\xbf\xbd",
      "\xe2\x80\x9e",
      "\xe2\x80\xa6",
      "\xe2\x80\xa0",
      "\xe2\x80\xa1",
      "\xef\xbf\xbd",
      "\xe2\x80\xb0",
      "\xef\xbf\xbd",
      "\xe2\x80\xb9",
      "\xef\xbf\xbd",
      "\xc2\xa8",
      "\xcb\x87",
      "\xc2\xb8",
      "\xef\xbf\xbd",
      "\xe2\x80\x98",
      "\xe2\x80\x99",
      "\xe2\x80\x9c",
      "\xe2\x80\x9d",
      "\xe2\x80\xa2",
      "\xe2\x80\x93",
      "\xe2\x80\x94",
      "\xef\xbf\xbd",
      "\xe2\x84\xa2",
      "\xef\xbf\xbd",
      "\xe2\x80\xba",
      "\xef\xbf\xbd",
      "\xc2\xaf",
      "\xcb\x9b",
      "\xef\xbf\xbd",
      "\xc2\xa0",
      "\xef\xbf\xbd",
      "\xc2\xa2",
      "\xc2\xa3",
      "\xc2\xa4",
      "\xef\xbf\xbd",
      "\xc2\xa6",
      "\xc2\xa7",
      "\xc3\x98",
      "\xc2\xa9",
      "\xc5\x96",
      "\xc2\xab",
      "\xc2\xac",
      "\xc2\xad",
      "\xc2\xae",
      "\xc3\x86",
      "\xc2\xb0",
      "\xc2\xb1",
      "\xc2\xb2",
      "\xc2\xb3",
      "\xc2\xb4",
      "\xc2\xb5",
      "\xc2\xb6",
      "\xc2\xb7",
      "\xc3\xb8",
      "\xc2\xb9",
      "\xc5\x97",
      "\xc2\xbb",
      "\xc2\xbc",
      "\xc2\xbd",
      "\xc2\xbe",
      "\xc3\xa6",
      "\xc4\x84",
      "\xc4\xae",
      "\xc4\x80",
      "\xc4\x86",
      "\xc3\x84",
      "\xc3\x85",
      "\xc4\x98",
      "\xc4\x92",
      "\xc4\x8c",
      "\xc3\x89",
      "\xc5\xb9",
      "\xc4\x96",
      "\xc4\xa2",
      "\xc4\xb6",
      "\xc4\xaa",
      "\xc4\xbb",
      "\xc5\xa0",
      "\xc5\x83",
      "\xc5\x85",
      "\xc3\x93",
      "\xc5\x8c",
      "\xc3\x95",
      "\xc3\x96",
      "\xc3\x97",
      "\xc5\xb2",
      "\xc5\x81",
      "\xc5\x9a",
      "\xc5\xaa",
      "\xc3\x9c",
      "\xc5\xbb",
      "\xc5\xbd",
      "\xc3\x9f",
      "\xc4\x85",
      "\xc4\xaf",
      "\xc4\x81",
      "\xc4\x87",
      "\xc3\xa4",
      "\xc3\xa5",
      "\xc4\x99",
      "\xc4\x93",
      "\xc4\x8d",
      "\xc3\xa9",
      "\xc5\xba",
      "\xc4\x97",
      "\xc4\xa3",
      "\xc4\xb7",
      "\xc4\xab",
      "\xc4\xbc",
      "\xc5\xa1",
      "\xc5\x84",
      "\xc5\x86",
      "\xc3\xb3",
      "\xc5\x8d",
      "\xc3\xb5",
      "\xc3\xb6",
      "\xc3\xb7",
      "\xc5\xb3",
      "\xc5\x82",
      "\xc5\x9b",
      "\xc5\xab",
      "\xc3\xbc",
      "\xc5\xbc",
      "\xc5\xbe",
      "\xcb\x99",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x000000a0 => "\xa0",
      0x000000a2 => "\xa2",
      0x000000a3 => "\xa3",
      0x000000a4 => "\xa4",
      0x000000a6 => "\xa6",
      0x000000a7 => "\xa7",
      0x000000a8 => "\x8d",
      0x000000a9 => "\xa9",
      0x000000ab => "\xab",
      0x000000ac => "\xac",
      0x000000ad => "\xad",
      0x000000ae => "\xae",
      0x000000af => "\x9d",
      0x000000b0 => "\xb0",
      0x000000b1 => "\xb1",
      0x000000b2 => "\xb2",
      0x000000b3 => "\xb3",
      0x000000b4 => "\xb4",
      0x000000b5 => "\xb5",
      0x000000b6 => "\xb6",
      0x000000b7 => "\xb7",
      0x000000b8 => "\x8f",
      0x000000b9 => "\xb9",
      0x000000bb => "\xbb",
      0x000000bc => "\xbc",
      0x000000bd => "\xbd",
      0x000000be => "\xbe",
      0x000000c4 => "\xc4",
      0x000000c5 => "\xc5",
      0x000000c6 => "\xaf",
      0x000000c9 => "\xc9",
      0x000000d3 => "\xd3",
      0x000000d5 => "\xd5",
      0x000000d6 => "\xd6",
      0x000000d7 => "\xd7",
      0x000000d8 => "\xa8",
      0x000000dc => "\xdc",
      0x000000df => "\xdf",
      0x000000e4 => "\xe4",
      0x000000e5 => "\xe5",
      0x000000e6 => "\xbf",
      0x000000e9 => "\xe9",
      0x000000f3 => "\xf3",
      0x000000f5 => "\xf5",
      0x000000f6 => "\xf6",
      0x000000f7 => "\xf7",
      0x000000f8 => "\xb8",
      0x000000fc => "\xfc",
      0x00000100 => "\xc2",
      0x00000101 => "\xe2",
      0x00000104 => "\xc0",
      0x00000105 => "\xe0",
      0x00000106 => "\xc3",
      0x00000107 => "\xe3",
      0x0000010c => "\xc8",
      0x0000010d => "\xe8",
      0x00000112 => "\xc7",
      0x00000113 => "\xe7",
      0x00000116 => "\xcb",
      0x00000117 => "\xeb",
      0x00000118 => "\xc6",
      0x00000119 => "\xe6",
      0x00000122 => "\xcc",
      0x00000123 => "\xec",
      0x0000012a => "\xce",
      0x0000012b => "\xee",
      0x0000012e => "\xc1",
      0x0000012f => "\xe1",
      0x00000136 => "\xcd",
      0x00000137 => "\xed",
      0x0000013b => "\xcf",
      0x0000013c => "\xef",
      0x00000141 => "\xd9",
      0x00000142 => "\xf9",
      0x00000143 => "\xd1",
      0x00000144 => "\xf1",
      0x00000145 => "\xd2",
      0x00000146 => "\xf2",
      0x0000014c => "\xd4",
      0x0000014d => "\xf4",
      0x00000156 => "\xaa",
      0x00000157 => "\xba",
      0x0000015a => "\xda",
      0x0000015b => "\xfa",
      0x00000160 => "\xd0",
      0x00000161 => "\xf0",
      0x0000016a => "\xdb",
      0x0000016b => "\xfb",
      0x00000172 => "\xd8",
      0x00000173 => "\xf8",
      0x00000179 => "\xca",
      0x0000017a => "\xea",
      0x0000017b => "\xdd",
      0x0000017c => "\xfd",
      0x0000017d => "\xde",
      0x0000017e => "\xfe",
      0x000002c7 => "\x8e",
      0x000002d9 => "\xff",
      0x000002db => "\x9e",
      0x00002013 => "\x96",
      0x00002014 => "\x97",
      0x00002018 => "\x91",
      0x00002019 => "\x92",
      0x0000201a => "\x82",
      0x0000201c => "\x93",
      0x0000201d => "\x94",
      0x0000201e => "\x84",
      0x00002020 => "\x86",
      0x00002021 => "\x87",
      0x00002022 => "\x95",
      0x00002026 => "\x85",
      0x00002030 => "\x89",
      0x00002039 => "\x8b",
      0x0000203a => "\x9b",
      0x000020ac => "\x80",
      0x00002122 => "\x99",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::CP1257 - Conversion routines for CP1257
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for CP1257.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: CEN/TC304 N283
   alias WINBALTRIM
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE (DEL)
      80 |  000020AC | EURO SIGN
      82 |  0000201A | SINGLE LOW-9 QUOTATION MARK
      84 |  0000201E | DOUBLE LOW-9 QUOTATION MARK
      85 |  00002026 | HORIZONTAL ELLIPSIS
      86 |  00002020 | DAGGER
      87 |  00002021 | DOUBLE DAGGER
      89 |  00002030 | PER MILLE SIGN
      8B |  00002039 | SINGLE LEFT-POINTING ANGLE QUOTATION MARK
      8D |  000000A8 | DIAERESIS
      8E |  000002C7 | CARON (Mandarin Chinese third tone)
      8F |  000000B8 | CEDILLA
      91 |  00002018 | LEFT SINGLE QUOTATION MARK
      92 |  00002019 | RIGHT SINGLE QUOTATION MARK
      93 |  0000201C | LEFT DOUBLE QUOTATION MARK
      94 |  0000201D | RIGHT DOUBLE QUOTATION MARK
      95 |  00002022 | BULLET
      96 |  00002013 | EN DASH
      97 |  00002014 | EM DASH
      99 |  00002122 | TRADE MARK SIGN
      9B |  0000203A | SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
      9D |  000000AF | MACRON
      9E |  000002DB | OGONEK
      A0 |  000000A0 | NO-BREAK SPACE
      A2 |  000000A2 | CENT SIGN
      A3 |  000000A3 | POUND SIGN
      A4 |  000000A4 | CURRENCY SIGN
      A6 |  000000A6 | BROKEN BAR
      A7 |  000000A7 | SECTION SIGN
      A8 |  000000D8 | LATIN CAPITAL LETTER O WITH STROKE
      A9 |  000000A9 | COPYRIGHT SIGN
      AA |  00000156 | LATIN CAPITAL LETTER R WITH CEDILLA
      AB |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
      AC |  000000AC | NOT SIGN
      AD |  000000AD | SOFT HYPHEN
      AE |  000000AE | REGISTERED SIGN
      AF |  000000C6 | LATIN CAPITAL LETTER AE
      B0 |  000000B0 | DEGREE SIGN
      B1 |  000000B1 | PLUS-MINUS SIGN
      B2 |  000000B2 | SUPERSCRIPT TWO
      B3 |  000000B3 | SUPERSCRIPT THREE
      B4 |  000000B4 | ACUTE ACCENT
      B5 |  000000B5 | MICRO SIGN
      B6 |  000000B6 | PILCROW SIGN
      B7 |  000000B7 | MIDDLE DOT
      B8 |  000000F8 | LATIN SMALL LETTER O WITH STROKE
      B9 |  000000B9 | SUPERSCRIPT ONE
      BA |  00000157 | LATIN SMALL LETTER R WITH CEDILLA
      BB |  000000BB | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
      BC |  000000BC | VULGAR FRACTION ONE QUARTER
      BD |  000000BD | VULGAR FRACTION ONE HALF
      BE |  000000BE | VULGAR FRACTION THREE QUARTERS
      BF |  000000E6 | LATIN SMALL LETTER AE
      C0 |  00000104 | LATIN CAPITAL LETTER A WITH OGONEK
      C1 |  0000012E | LATIN CAPITAL LETTER I WITH OGONEK
      C2 |  00000100 | LATIN CAPITAL LETTER A WITH MACRON
      C3 |  00000106 | LATIN CAPITAL LETTER C WITH ACUTE
      C4 |  000000C4 | LATIN CAPITAL LETTER A WITH DIAERESIS
      C5 |  000000C5 | LATIN CAPITAL LETTER A WITH RING ABOVE
      C6 |  00000118 | LATIN CAPITAL LETTER E WITH OGONEK
      C7 |  00000112 | LATIN CAPITAL LETTER E WITH MACRON
      C8 |  0000010C | LATIN CAPITAL LETTER C WITH CARON
      C9 |  000000C9 | LATIN CAPITAL LETTER E WITH ACUTE
      CA |  00000179 | LATIN CAPITAL LETTER Z WITH ACUTE
      CB |  00000116 | LATIN CAPITAL LETTER E WITH DOT ABOVE
      CC |  00000122 | LATIN CAPITAL LETTER G WITH CEDILLA
      CD |  00000136 | LATIN CAPITAL LETTER K WITH CEDILLA
      CE |  0000012A | LATIN CAPITAL LETTER I WITH MACRON
      CF |  0000013B | LATIN CAPITAL LETTER L WITH CEDILLA
      D0 |  00000160 | LATIN CAPITAL LETTER S WITH CARON
      D1 |  00000143 | LATIN CAPITAL LETTER N WITH ACUTE
      D2 |  00000145 | LATIN CAPITAL LETTER N WITH CEDILLA
      D3 |  000000D3 | LATIN CAPITAL LETTER O WITH ACUTE
      D4 |  0000014C | LATIN CAPITAL LETTER O WITH MACRON
      D5 |  000000D5 | LATIN CAPITAL LETTER O WITH TILDE
      D6 |  000000D6 | LATIN CAPITAL LETTER O WITH DIAERESIS
      D7 |  000000D7 | MULTIPLICATION SIGN
      D8 |  00000172 | LATIN CAPITAL LETTER U WITH OGONEK
      D9 |  00000141 | LATIN CAPITAL LETTER L WITH STROKE
      DA |  0000015A | LATIN CAPITAL LETTER S WITH ACUTE
      DB |  0000016A | LATIN CAPITAL LETTER U WITH MACRON
      DC |  000000DC | LATIN CAPITAL LETTER U WITH DIAERESIS
      DD |  0000017B | LATIN CAPITAL LETTER Z WITH DOT ABOVE
      DE |  0000017D | LATIN CAPITAL LETTER Z WITH CARON
      DF |  000000DF | LATIN SMALL LETTER SHARP S (German)
      E0 |  00000105 | LATIN SMALL LETTER A WITH OGONEK
      E1 |  0000012F | LATIN SMALL LETTER I WITH OGONEK
      E2 |  00000101 | LATIN SMALL LETTER A WITH MACRON
      E3 |  00000107 | LATIN SMALL LETTER C WITH ACUTE
      E4 |  000000E4 | LATIN SMALL LETTER A WITH DIAERESIS
      E5 |  000000E5 | LATIN SMALL LETTER A WITH RING ABOVE
      E6 |  00000119 | LATIN SMALL LETTER E WITH OGONEK
      E7 |  00000113 | LATIN SMALL LETTER E WITH MACRON
      E8 |  0000010D | LATIN SMALL LETTER C WITH CARON
      E9 |  000000E9 | LATIN SMALL LETTER E WITH ACUTE
      EA |  0000017A | LATIN SMALL LETTER Z WITH ACUTE
      EB |  00000117 | LATIN SMALL LETTER E WITH DOT ABOVE
      EC |  00000123 | LATIN SMALL LETTER G WITH CEDILLA
      ED |  00000137 | LATIN SMALL LETTER K WITH CEDILLA
      EE |  0000012B | LATIN SMALL LETTER I WITH MACRON
      EF |  0000013C | LATIN SMALL LETTER L WITH CEDILLA
      F0 |  00000161 | LATIN SMALL LETTER S WITH CARON
      F1 |  00000144 | LATIN SMALL LETTER N WITH ACUTE
      F2 |  00000146 | LATIN SMALL LETTER N WITH CEDILLA
      F3 |  000000F3 | LATIN SMALL LETTER O WITH ACUTE
      F4 |  0000014D | LATIN SMALL LETTER O WITH MACRON
      F5 |  000000F5 | LATIN SMALL LETTER O WITH TILDE
      F6 |  000000F6 | LATIN SMALL LETTER O WITH DIAERESIS
      F7 |  000000F7 | DIVISION SIGN
      F8 |  00000173 | LATIN SMALL LETTER U WITH OGONEK
      F9 |  00000142 | LATIN SMALL LETTER L WITH STROKE
      FA |  0000015B | LATIN SMALL LETTER S WITH ACUTE
      FB |  0000016B | LATIN SMALL LETTER U WITH MACRON
      FC |  000000FC | LATIN SMALL LETTER U WITH DIAERESIS
      FD |  0000017C | LATIN SMALL LETTER Z WITH DOT ABOVE
      FE |  0000017E | LATIN SMALL LETTER Z WITH CARON
      FF |  000002D9 | DOT ABOVE (Mandarin Chinese light tone)
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_CP1257

    $main::fatpacked{"Locale/RecodeData/CSN_369103.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_CSN_369103';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for CSN_369103.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::CSN_369103;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x00a4,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0x0080,
      0x0081,
      0x0082,
      0x0083,
      0x0084,
      0x0085,
      0x0086,
      0x0087,
      0x0088,
      0x0089,
      0x008a,
      0x008b,
      0x008c,
      0x008d,
      0x008e,
      0x008f,
      0x0090,
      0x0091,
      0x0092,
      0x0093,
      0x0094,
      0x0095,
      0x0096,
      0x0097,
      0x0098,
      0x0099,
      0x009a,
      0x009b,
      0x009c,
      0x009d,
      0x009e,
      0x009f,
      0x00a0,
      0x0104,
      0x02d8,
      0x0141,
      0x0024,
      0x013d,
      0x015a,
      0x00a7,
      0x00a8,
      0x0160,
      0x015e,
      0x0164,
      0x0179,
      0x00ad,
      0x017d,
      0x017b,
      0x00b0,
      0x0105,
      0x02db,
      0x0142,
      0x00b4,
      0x013e,
      0x015b,
      0x02c7,
      0x00b8,
      0x0161,
      0x015f,
      0x0165,
      0x017a,
      0x02dd,
      0x017e,
      0x017c,
      0x0154,
      0x00c1,
      0x00c2,
      0x0102,
      0x00c4,
      0x0139,
      0x0106,
      0x00c7,
      0x010c,
      0x00c9,
      0x0118,
      0x00cb,
      0x011a,
      0x00cd,
      0x00ce,
      0x010e,
      0x0110,
      0x0143,
      0x0147,
      0x00d3,
      0x00d4,
      0x0150,
      0x00d6,
      0x00d7,
      0x0158,
      0x016e,
      0x00da,
      0x0170,
      0x00dc,
      0x00dd,
      0x0162,
      0x00df,
      0x0155,
      0x00e1,
      0x00e2,
      0x0103,
      0x00e4,
      0x013a,
      0x0107,
      0x00e7,
      0x010d,
      0x00e9,
      0x0119,
      0x00eb,
      0x011b,
      0x00ed,
      0x00ee,
      0x010f,
      0x0111,
      0x0144,
      0x0148,
      0x00f3,
      0x00f4,
      0x0151,
      0x00f6,
      0x00f7,
      0x0159,
      0x016f,
      0x00fa,
      0x0171,
      0x00fc,
      0x00fd,
      0x0163,
      0x02d9,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\xc2\xa4",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xc2\x80",
      "\xc2\x81",
      "\xc2\x82",
      "\xc2\x83",
      "\xc2\x84",
      "\xc2\x85",
      "\xc2\x86",
      "\xc2\x87",
      "\xc2\x88",
      "\xc2\x89",
      "\xc2\x8a",
      "\xc2\x8b",
      "\xc2\x8c",
      "\xc2\x8d",
      "\xc2\x8e",
      "\xc2\x8f",
      "\xc2\x90",
      "\xc2\x91",
      "\xc2\x92",
      "\xc2\x93",
      "\xc2\x94",
      "\xc2\x95",
      "\xc2\x96",
      "\xc2\x97",
      "\xc2\x98",
      "\xc2\x99",
      "\xc2\x9a",
      "\xc2\x9b",
      "\xc2\x9c",
      "\xc2\x9d",
      "\xc2\x9e",
      "\xc2\x9f",
      "\xc2\xa0",
      "\xc4\x84",
      "\xcb\x98",
      "\xc5\x81",
      "\x24",
      "\xc4\xbd",
      "\xc5\x9a",
      "\xc2\xa7",
      "\xc2\xa8",
      "\xc5\xa0",
      "\xc5\x9e",
      "\xc5\xa4",
      "\xc5\xb9",
      "\xc2\xad",
      "\xc5\xbd",
      "\xc5\xbb",
      "\xc2\xb0",
      "\xc4\x85",
      "\xcb\x9b",
      "\xc5\x82",
      "\xc2\xb4",
      "\xc4\xbe",
      "\xc5\x9b",
      "\xcb\x87",
      "\xc2\xb8",
      "\xc5\xa1",
      "\xc5\x9f",
      "\xc5\xa5",
      "\xc5\xba",
      "\xcb\x9d",
      "\xc5\xbe",
      "\xc5\xbc",
      "\xc5\x94",
      "\xc3\x81",
      "\xc3\x82",
      "\xc4\x82",
      "\xc3\x84",
      "\xc4\xb9",
      "\xc4\x86",
      "\xc3\x87",
      "\xc4\x8c",
      "\xc3\x89",
      "\xc4\x98",
      "\xc3\x8b",
      "\xc4\x9a",
      "\xc3\x8d",
      "\xc3\x8e",
      "\xc4\x8e",
      "\xc4\x90",
      "\xc5\x83",
      "\xc5\x87",
      "\xc3\x93",
      "\xc3\x94",
      "\xc5\x90",
      "\xc3\x96",
      "\xc3\x97",
      "\xc5\x98",
      "\xc5\xae",
      "\xc3\x9a",
      "\xc5\xb0",
      "\xc3\x9c",
      "\xc3\x9d",
      "\xc5\xa2",
      "\xc3\x9f",
      "\xc5\x95",
      "\xc3\xa1",
      "\xc3\xa2",
      "\xc4\x83",
      "\xc3\xa4",
      "\xc4\xba",
      "\xc4\x87",
      "\xc3\xa7",
      "\xc4\x8d",
      "\xc3\xa9",
      "\xc4\x99",
      "\xc3\xab",
      "\xc4\x9b",
      "\xc3\xad",
      "\xc3\xae",
      "\xc4\x8f",
      "\xc4\x91",
      "\xc5\x84",
      "\xc5\x88",
      "\xc3\xb3",
      "\xc3\xb4",
      "\xc5\x91",
      "\xc3\xb6",
      "\xc3\xb7",
      "\xc5\x99",
      "\xc5\xaf",
      "\xc3\xba",
      "\xc5\xb1",
      "\xc3\xbc",
      "\xc3\xbd",
      "\xc5\xa3",
      "\xcb\x99",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\xa4",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x00000080 => "\x80",
      0x00000081 => "\x81",
      0x00000082 => "\x82",
      0x00000083 => "\x83",
      0x00000084 => "\x84",
      0x00000085 => "\x85",
      0x00000086 => "\x86",
      0x00000087 => "\x87",
      0x00000088 => "\x88",
      0x00000089 => "\x89",
      0x0000008a => "\x8a",
      0x0000008b => "\x8b",
      0x0000008c => "\x8c",
      0x0000008d => "\x8d",
      0x0000008e => "\x8e",
      0x0000008f => "\x8f",
      0x00000090 => "\x90",
      0x00000091 => "\x91",
      0x00000092 => "\x92",
      0x00000093 => "\x93",
      0x00000094 => "\x94",
      0x00000095 => "\x95",
      0x00000096 => "\x96",
      0x00000097 => "\x97",
      0x00000098 => "\x98",
      0x00000099 => "\x99",
      0x0000009a => "\x9a",
      0x0000009b => "\x9b",
      0x0000009c => "\x9c",
      0x0000009d => "\x9d",
      0x0000009e => "\x9e",
      0x0000009f => "\x9f",
      0x000000a0 => "\xa0",
      0x000000a4 => "\x24",
      0x000000a7 => "\xa7",
      0x000000a8 => "\xa8",
      0x000000ad => "\xad",
      0x000000b0 => "\xb0",
      0x000000b4 => "\xb4",
      0x000000b8 => "\xb8",
      0x000000c1 => "\xc1",
      0x000000c2 => "\xc2",
      0x000000c4 => "\xc4",
      0x000000c7 => "\xc7",
      0x000000c9 => "\xc9",
      0x000000cb => "\xcb",
      0x000000cd => "\xcd",
      0x000000ce => "\xce",
      0x000000d3 => "\xd3",
      0x000000d4 => "\xd4",
      0x000000d6 => "\xd6",
      0x000000d7 => "\xd7",
      0x000000da => "\xda",
      0x000000dc => "\xdc",
      0x000000dd => "\xdd",
      0x000000df => "\xdf",
      0x000000e1 => "\xe1",
      0x000000e2 => "\xe2",
      0x000000e4 => "\xe4",
      0x000000e7 => "\xe7",
      0x000000e9 => "\xe9",
      0x000000eb => "\xeb",
      0x000000ed => "\xed",
      0x000000ee => "\xee",
      0x000000f3 => "\xf3",
      0x000000f4 => "\xf4",
      0x000000f6 => "\xf6",
      0x000000f7 => "\xf7",
      0x000000fa => "\xfa",
      0x000000fc => "\xfc",
      0x000000fd => "\xfd",
      0x00000102 => "\xc3",
      0x00000103 => "\xe3",
      0x00000104 => "\xa1",
      0x00000105 => "\xb1",
      0x00000106 => "\xc6",
      0x00000107 => "\xe6",
      0x0000010c => "\xc8",
      0x0000010d => "\xe8",
      0x0000010e => "\xcf",
      0x0000010f => "\xef",
      0x00000110 => "\xd0",
      0x00000111 => "\xf0",
      0x00000118 => "\xca",
      0x00000119 => "\xea",
      0x0000011a => "\xcc",
      0x0000011b => "\xec",
      0x00000139 => "\xc5",
      0x0000013a => "\xe5",
      0x0000013d => "\xa5",
      0x0000013e => "\xb5",
      0x00000141 => "\xa3",
      0x00000142 => "\xb3",
      0x00000143 => "\xd1",
      0x00000144 => "\xf1",
      0x00000147 => "\xd2",
      0x00000148 => "\xf2",
      0x00000150 => "\xd5",
      0x00000151 => "\xf5",
      0x00000154 => "\xc0",
      0x00000155 => "\xe0",
      0x00000158 => "\xd8",
      0x00000159 => "\xf8",
      0x0000015a => "\xa6",
      0x0000015b => "\xb6",
      0x0000015e => "\xaa",
      0x0000015f => "\xba",
      0x00000160 => "\xa9",
      0x00000161 => "\xb9",
      0x00000162 => "\xde",
      0x00000163 => "\xfe",
      0x00000164 => "\xab",
      0x00000165 => "\xbb",
      0x0000016e => "\xd9",
      0x0000016f => "\xf9",
      0x00000170 => "\xdb",
      0x00000171 => "\xfb",
      0x00000179 => "\xac",
      0x0000017a => "\xbc",
      0x0000017b => "\xaf",
      0x0000017c => "\xbf",
      0x0000017d => "\xae",
      0x0000017e => "\xbe",
      0x000002c7 => "\xb7",
      0x000002d8 => "\xa2",
      0x000002d9 => "\xff",
      0x000002db => "\xb2",
      0x000002dd => "\xbd",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::CSN_369103 - Conversion routines for CSN_369103
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for CSN_369103.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
   repertoiremap: mnemonic,ds
    source: ECMA registry
   alias ISO-IR-139
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  000000A4 | CURRENCY SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE (DEL)
      80 |  00000080 | PADDING CHARACTER (PAD)
      81 |  00000081 | HIGH OCTET PRESET (HOP)
      82 |  00000082 | BREAK PERMITTED HERE (BPH)
      83 |  00000083 | NO BREAK HERE (NBH)
      84 |  00000084 | INDEX (IND)
      85 |  00000085 | NEXT LINE (NEL)
      86 |  00000086 | START OF SELECTED AREA (SSA)
      87 |  00000087 | END OF SELECTED AREA (ESA)
      88 |  00000088 | CHARACTER TABULATION SET (HTS)
      89 |  00000089 | CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
      8A |  0000008A | LINE TABULATION SET (VTS)
      8B |  0000008B | PARTIAL LINE FORWARD (PLD)
      8C |  0000008C | PARTIAL LINE BACKWARD (PLU)
      8D |  0000008D | REVERSE LINE FEED (RI)
      8E |  0000008E | SINGLE-SHIFT TWO (SS2)
      8F |  0000008F | SINGLE-SHIFT THREE (SS3)
      90 |  00000090 | DEVICE CONTROL STRING (DCS)
      91 |  00000091 | PRIVATE USE ONE (PU1)
      92 |  00000092 | PRIVATE USE TWO (PU2)
      93 |  00000093 | SET TRANSMIT STATE (STS)
      94 |  00000094 | CANCEL CHARACTER (CCH)
      95 |  00000095 | MESSAGE WAITING (MW)
      96 |  00000096 | START OF GUARDED AREA (SPA)
      97 |  00000097 | END OF GUARDED AREA (EPA)
      98 |  00000098 | START OF STRING (SOS)
      99 |  00000099 | SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
      9A |  0000009A | SINGLE CHARACTER INTRODUCER (SCI)
      9B |  0000009B | CONTROL SEQUENCE INTRODUCER (CSI)
      9C |  0000009C | STRING TERMINATOR (ST)
      9D |  0000009D | OPERATING SYSTEM COMMAND (OSC)
      9E |  0000009E | PRIVACY MESSAGE (PM)
      9F |  0000009F | APPLICATION PROGRAM COMMAND (APC)
      A0 |  000000A0 | NO-BREAK SPACE
      A1 |  00000104 | LATIN CAPITAL LETTER A WITH OGONEK
      A2 |  000002D8 | BREVE
      A3 |  00000141 | LATIN CAPITAL LETTER L WITH STROKE
      A4 |  00000024 | DOLLAR SIGN
      A5 |  0000013D | LATIN CAPITAL LETTER L WITH CARON
      A6 |  0000015A | LATIN CAPITAL LETTER S WITH ACUTE
      A7 |  000000A7 | SECTION SIGN
      A8 |  000000A8 | DIAERESIS
      A9 |  00000160 | LATIN CAPITAL LETTER S WITH CARON
      AA |  0000015E | LATIN CAPITAL LETTER S WITH CEDILLA
      AB |  00000164 | LATIN CAPITAL LETTER T WITH CARON
      AC |  00000179 | LATIN CAPITAL LETTER Z WITH ACUTE
      AD |  000000AD | SOFT HYPHEN
      AE |  0000017D | LATIN CAPITAL LETTER Z WITH CARON
      AF |  0000017B | LATIN CAPITAL LETTER Z WITH DOT ABOVE
      B0 |  000000B0 | DEGREE SIGN
      B1 |  00000105 | LATIN SMALL LETTER A WITH OGONEK
      B2 |  000002DB | OGONEK
      B3 |  00000142 | LATIN SMALL LETTER L WITH STROKE
      B4 |  000000B4 | ACUTE ACCENT
      B5 |  0000013E | LATIN SMALL LETTER L WITH CARON
      B6 |  0000015B | LATIN SMALL LETTER S WITH ACUTE
      B7 |  000002C7 | CARON (Mandarin Chinese third tone)
      B8 |  000000B8 | CEDILLA
      B9 |  00000161 | LATIN SMALL LETTER S WITH CARON
      BA |  0000015F | LATIN SMALL LETTER S WITH CEDILLA
      BB |  00000165 | LATIN SMALL LETTER T WITH CARON
      BC |  0000017A | LATIN SMALL LETTER Z WITH ACUTE
      BD |  000002DD | DOUBLE ACUTE ACCENT
      BE |  0000017E | LATIN SMALL LETTER Z WITH CARON
      BF |  0000017C | LATIN SMALL LETTER Z WITH DOT ABOVE
      C0 |  00000154 | LATIN CAPITAL LETTER R WITH ACUTE
      C1 |  000000C1 | LATIN CAPITAL LETTER A WITH ACUTE
      C2 |  000000C2 | LATIN CAPITAL LETTER A WITH CIRCUMFLEX
      C3 |  00000102 | LATIN CAPITAL LETTER A WITH BREVE
      C4 |  000000C4 | LATIN CAPITAL LETTER A WITH DIAERESIS
      C5 |  00000139 | LATIN CAPITAL LETTER L WITH ACUTE
      C6 |  00000106 | LATIN CAPITAL LETTER C WITH ACUTE
      C7 |  000000C7 | LATIN CAPITAL LETTER C WITH CEDILLA
      C8 |  0000010C | LATIN CAPITAL LETTER C WITH CARON
      C9 |  000000C9 | LATIN CAPITAL LETTER E WITH ACUTE
      CA |  00000118 | LATIN CAPITAL LETTER E WITH OGONEK
      CB |  000000CB | LATIN CAPITAL LETTER E WITH DIAERESIS
      CC |  0000011A | LATIN CAPITAL LETTER E WITH CARON
      CD |  000000CD | LATIN CAPITAL LETTER I WITH ACUTE
      CE |  000000CE | LATIN CAPITAL LETTER I WITH CIRCUMFLEX
      CF |  0000010E | LATIN CAPITAL LETTER D WITH CARON
      D0 |  00000110 | LATIN CAPITAL LETTER D WITH STROKE
      D1 |  00000143 | LATIN CAPITAL LETTER N WITH ACUTE
      D2 |  00000147 | LATIN CAPITAL LETTER N WITH CARON
      D3 |  000000D3 | LATIN CAPITAL LETTER O WITH ACUTE
      D4 |  000000D4 | LATIN CAPITAL LETTER O WITH CIRCUMFLEX
      D5 |  00000150 | LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
      D6 |  000000D6 | LATIN CAPITAL LETTER O WITH DIAERESIS
      D7 |  000000D7 | MULTIPLICATION SIGN
      D8 |  00000158 | LATIN CAPITAL LETTER R WITH CARON
      D9 |  0000016E | LATIN CAPITAL LETTER U WITH RING ABOVE
      DA |  000000DA | LATIN CAPITAL LETTER U WITH ACUTE
      DB |  00000170 | LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
      DC |  000000DC | LATIN CAPITAL LETTER U WITH DIAERESIS
      DD |  000000DD | LATIN CAPITAL LETTER Y WITH ACUTE
      DE |  00000162 | LATIN CAPITAL LETTER T WITH CEDILLA
      DF |  000000DF | LATIN SMALL LETTER SHARP S (German)
      E0 |  00000155 | LATIN SMALL LETTER R WITH ACUTE
      E1 |  000000E1 | LATIN SMALL LETTER A WITH ACUTE
      E2 |  000000E2 | LATIN SMALL LETTER A WITH CIRCUMFLEX
      E3 |  00000103 | LATIN SMALL LETTER A WITH BREVE
      E4 |  000000E4 | LATIN SMALL LETTER A WITH DIAERESIS
      E5 |  0000013A | LATIN SMALL LETTER L WITH ACUTE
      E6 |  00000107 | LATIN SMALL LETTER C WITH ACUTE
      E7 |  000000E7 | LATIN SMALL LETTER C WITH CEDILLA
      E8 |  0000010D | LATIN SMALL LETTER C WITH CARON
      E9 |  000000E9 | LATIN SMALL LETTER E WITH ACUTE
      EA |  00000119 | LATIN SMALL LETTER E WITH OGONEK
      EB |  000000EB | LATIN SMALL LETTER E WITH DIAERESIS
      EC |  0000011B | LATIN SMALL LETTER E WITH CARON
      ED |  000000ED | LATIN SMALL LETTER I WITH ACUTE
      EE |  000000EE | LATIN SMALL LETTER I WITH CIRCUMFLEX
      EF |  0000010F | LATIN SMALL LETTER D WITH CARON
      F0 |  00000111 | LATIN SMALL LETTER D WITH STROKE
      F1 |  00000144 | LATIN SMALL LETTER N WITH ACUTE
      F2 |  00000148 | LATIN SMALL LETTER N WITH CARON
      F3 |  000000F3 | LATIN SMALL LETTER O WITH ACUTE
      F4 |  000000F4 | LATIN SMALL LETTER O WITH CIRCUMFLEX
      F5 |  00000151 | LATIN SMALL LETTER O WITH DOUBLE ACUTE
      F6 |  000000F6 | LATIN SMALL LETTER O WITH DIAERESIS
      F7 |  000000F7 | DIVISION SIGN
      F8 |  00000159 | LATIN SMALL LETTER R WITH CARON
      F9 |  0000016F | LATIN SMALL LETTER U WITH RING ABOVE
      FA |  000000FA | LATIN SMALL LETTER U WITH ACUTE
      FB |  00000171 | LATIN SMALL LETTER U WITH DOUBLE ACUTE
      FC |  000000FC | LATIN SMALL LETTER U WITH DIAERESIS
      FD |  000000FD | LATIN SMALL LETTER Y WITH ACUTE
      FE |  00000163 | LATIN SMALL LETTER T WITH CEDILLA
      FF |  000002D9 | DOT ABOVE (Mandarin Chinese light tone)
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_CSN_369103

    $main::fatpacked{"Locale/RecodeData/CWI.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_CWI';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for CWI.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::CWI;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0x00c7,
      0x00fc,
      0x00e9,
      0x00e2,
      0x00e4,
      0x00e0,
      0x00e5,
      0x00e7,
      0x00ea,
      0x00eb,
      0x00e8,
      0x00ef,
      0x00ee,
      0x00cd,
      0x00c4,
      0x00c1,
      0x00c9,
      0x00e6,
      0x00c6,
      0x0151,
      0x00f6,
      0x00d3,
      0x0171,
      0x00da,
      0x0170,
      0x00d6,
      0x00dc,
      0x00a2,
      0x00a3,
      0x00a5,
      0x20a7,
      0xe01f,
      0x00e1,
      0x00ed,
      0x00f3,
      0x00fa,
      0x00f1,
      0x00d1,
      0x00aa,
      0x0150,
      0x00bf,
      0x2310,
      0x00ac,
      0x00bd,
      0x00bc,
      0x00a1,
      0x00ab,
      0x00bb,
      0x2591,
      0x2592,
      0x2593,
      0x2502,
      0x2524,
      0x2561,
      0x2562,
      0x2556,
      0x2555,
      0x2563,
      0x2551,
      0x2557,
      0x255d,
      0x255c,
      0x255b,
      0x2510,
      0x2514,
      0x2534,
      0x252c,
      0x251c,
      0x2500,
      0x253c,
      0x255e,
      0x255f,
      0x255a,
      0x2554,
      0x2569,
      0x2566,
      0x2560,
      0x2550,
      0x256c,
      0x2567,
      0x2568,
      0x2564,
      0x2565,
      0x2559,
      0x2558,
      0x2552,
      0x2553,
      0x256b,
      0x256a,
      0x2518,
      0x250c,
      0x2588,
      0x2584,
      0x258c,
      0x2590,
      0x2580,
      0x03b1,
      0x03b2,
      0x0393,
      0x03c0,
      0x03a3,
      0x03c3,
      0x03bc,
      0x03c4,
      0x03a6,
      0x0398,
      0x03a9,
      0x03b4,
      0x221e,
      0x2205,
      0x03b5,
      0x2229,
      0x2261,
      0x00b1,
      0x2265,
      0x2264,
      0x2320,
      0x2321,
      0x00f7,
      0x2248,
      0x2218,
      0x00b7,
      0x2022,
      0x221a,
      0x207f,
      0x00b2,
      0x25a0,
      0x00a0,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xc3\x87",
      "\xc3\xbc",
      "\xc3\xa9",
      "\xc3\xa2",
      "\xc3\xa4",
      "\xc3\xa0",
      "\xc3\xa5",
      "\xc3\xa7",
      "\xc3\xaa",
      "\xc3\xab",
      "\xc3\xa8",
      "\xc3\xaf",
      "\xc3\xae",
      "\xc3\x8d",
      "\xc3\x84",
      "\xc3\x81",
      "\xc3\x89",
      "\xc3\xa6",
      "\xc3\x86",
      "\xc5\x91",
      "\xc3\xb6",
      "\xc3\x93",
      "\xc5\xb1",
      "\xc3\x9a",
      "\xc5\xb0",
      "\xc3\x96",
      "\xc3\x9c",
      "\xc2\xa2",
      "\xc2\xa3",
      "\xc2\xa5",
      "\xe2\x82\xa7",
      "\xee\x80\x9f",
      "\xc3\xa1",
      "\xc3\xad",
      "\xc3\xb3",
      "\xc3\xba",
      "\xc3\xb1",
      "\xc3\x91",
      "\xc2\xaa",
      "\xc5\x90",
      "\xc2\xbf",
      "\xe2\x8c\x90",
      "\xc2\xac",
      "\xc2\xbd",
      "\xc2\xbc",
      "\xc2\xa1",
      "\xc2\xab",
      "\xc2\xbb",
      "\xe2\x96\x91",
      "\xe2\x96\x92",
      "\xe2\x96\x93",
      "\xe2\x94\x82",
      "\xe2\x94\xa4",
      "\xe2\x95\xa1",
      "\xe2\x95\xa2",
      "\xe2\x95\x96",
      "\xe2\x95\x95",
      "\xe2\x95\xa3",
      "\xe2\x95\x91",
      "\xe2\x95\x97",
      "\xe2\x95\x9d",
      "\xe2\x95\x9c",
      "\xe2\x95\x9b",
      "\xe2\x94\x90",
      "\xe2\x94\x94",
      "\xe2\x94\xb4",
      "\xe2\x94\xac",
      "\xe2\x94\x9c",
      "\xe2\x94\x80",
      "\xe2\x94\xbc",
      "\xe2\x95\x9e",
      "\xe2\x95\x9f",
      "\xe2\x95\x9a",
      "\xe2\x95\x94",
      "\xe2\x95\xa9",
      "\xe2\x95\xa6",
      "\xe2\x95\xa0",
      "\xe2\x95\x90",
      "\xe2\x95\xac",
      "\xe2\x95\xa7",
      "\xe2\x95\xa8",
      "\xe2\x95\xa4",
      "\xe2\x95\xa5",
      "\xe2\x95\x99",
      "\xe2\x95\x98",
      "\xe2\x95\x92",
      "\xe2\x95\x93",
      "\xe2\x95\xab",
      "\xe2\x95\xaa",
      "\xe2\x94\x98",
      "\xe2\x94\x8c",
      "\xe2\x96\x88",
      "\xe2\x96\x84",
      "\xe2\x96\x8c",
      "\xe2\x96\x90",
      "\xe2\x96\x80",
      "\xce\xb1",
      "\xce\xb2",
      "\xce\x93",
      "\xcf\x80",
      "\xce\xa3",
      "\xcf\x83",
      "\xce\xbc",
      "\xcf\x84",
      "\xce\xa6",
      "\xce\x98",
      "\xce\xa9",
      "\xce\xb4",
      "\xe2\x88\x9e",
      "\xe2\x88\x85",
      "\xce\xb5",
      "\xe2\x88\xa9",
      "\xe2\x89\xa1",
      "\xc2\xb1",
      "\xe2\x89\xa5",
      "\xe2\x89\xa4",
      "\xe2\x8c\xa0",
      "\xe2\x8c\xa1",
      "\xc3\xb7",
      "\xe2\x89\x88",
      "\xe2\x88\x98",
      "\xc2\xb7",
      "\xe2\x80\xa2",
      "\xe2\x88\x9a",
      "\xe2\x81\xbf",
      "\xc2\xb2",
      "\xe2\x96\xa0",
      "\xc2\xa0",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x000000a0 => "\xff",
      0x000000a1 => "\xad",
      0x000000a2 => "\x9b",
      0x000000a3 => "\x9c",
      0x000000a5 => "\x9d",
      0x000000aa => "\xa6",
      0x000000ab => "\xae",
      0x000000ac => "\xaa",
      0x000000b1 => "\xf1",
      0x000000b2 => "\xfd",
      0x000000b7 => "\xf9",
      0x000000bb => "\xaf",
      0x000000bc => "\xac",
      0x000000bd => "\xab",
      0x000000bf => "\xa8",
      0x000000c1 => "\x8f",
      0x000000c4 => "\x8e",
      0x000000c6 => "\x92",
      0x000000c7 => "\x80",
      0x000000c9 => "\x90",
      0x000000cd => "\x8d",
      0x000000d1 => "\xa5",
      0x000000d3 => "\x95",
      0x000000d6 => "\x99",
      0x000000da => "\x97",
      0x000000dc => "\x9a",
      0x000000e0 => "\x85",
      0x000000e1 => "\xa0",
      0x000000e2 => "\x83",
      0x000000e4 => "\x84",
      0x000000e5 => "\x86",
      0x000000e6 => "\x91",
      0x000000e7 => "\x87",
      0x000000e8 => "\x8a",
      0x000000e9 => "\x82",
      0x000000ea => "\x88",
      0x000000eb => "\x89",
      0x000000ed => "\xa1",
      0x000000ee => "\x8c",
      0x000000ef => "\x8b",
      0x000000f1 => "\xa4",
      0x000000f3 => "\xa2",
      0x000000f6 => "\x94",
      0x000000f7 => "\xf6",
      0x000000fa => "\xa3",
      0x000000fc => "\x81",
      0x00000150 => "\xa7",
      0x00000151 => "\x93",
      0x00000170 => "\x98",
      0x00000171 => "\x96",
      0x00000393 => "\xe2",
      0x00000398 => "\xe9",
      0x000003a3 => "\xe4",
      0x000003a6 => "\xe8",
      0x000003a9 => "\xea",
      0x000003b1 => "\xe0",
      0x000003b2 => "\xe1",
      0x000003b4 => "\xeb",
      0x000003b5 => "\xee",
      0x000003bc => "\xe6",
      0x000003c0 => "\xe3",
      0x000003c3 => "\xe5",
      0x000003c4 => "\xe7",
      0x00002022 => "\xfa",
      0x0000207f => "\xfc",
      0x000020a7 => "\x9e",
      0x00002205 => "\xed",
      0x00002218 => "\xf8",
      0x0000221a => "\xfb",
      0x0000221e => "\xec",
      0x00002229 => "\xef",
      0x00002248 => "\xf7",
      0x00002261 => "\xf0",
      0x00002264 => "\xf3",
      0x00002265 => "\xf2",
      0x00002310 => "\xa9",
      0x00002320 => "\xf4",
      0x00002321 => "\xf5",
      0x00002500 => "\xc4",
      0x00002502 => "\xb3",
      0x0000250c => "\xda",
      0x00002510 => "\xbf",
      0x00002514 => "\xc0",
      0x00002518 => "\xd9",
      0x0000251c => "\xc3",
      0x00002524 => "\xb4",
      0x0000252c => "\xc2",
      0x00002534 => "\xc1",
      0x0000253c => "\xc5",
      0x00002550 => "\xcd",
      0x00002551 => "\xba",
      0x00002552 => "\xd5",
      0x00002553 => "\xd6",
      0x00002554 => "\xc9",
      0x00002555 => "\xb8",
      0x00002556 => "\xb7",
      0x00002557 => "\xbb",
      0x00002558 => "\xd4",
      0x00002559 => "\xd3",
      0x0000255a => "\xc8",
      0x0000255b => "\xbe",
      0x0000255c => "\xbd",
      0x0000255d => "\xbc",
      0x0000255e => "\xc6",
      0x0000255f => "\xc7",
      0x00002560 => "\xcc",
      0x00002561 => "\xb5",
      0x00002562 => "\xb6",
      0x00002563 => "\xb9",
      0x00002564 => "\xd1",
      0x00002565 => "\xd2",
      0x00002566 => "\xcb",
      0x00002567 => "\xcf",
      0x00002568 => "\xd0",
      0x00002569 => "\xca",
      0x0000256a => "\xd8",
      0x0000256b => "\xd7",
      0x0000256c => "\xce",
      0x00002580 => "\xdf",
      0x00002584 => "\xdc",
      0x00002588 => "\xdb",
      0x0000258c => "\xdd",
      0x00002590 => "\xde",
      0x00002591 => "\xb0",
      0x00002592 => "\xb1",
      0x00002593 => "\xb2",
      0x000025a0 => "\xfe",
      0x0000e01f => "\x9f",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::CWI - Conversion routines for CWI
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for CWI.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: Computerworld Sza'mita'stechnika vol 3 issue 13 1988-06-29
   alias CWI-2
   alias CP-HU
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE (DEL)
      80 |  000000C7 | LATIN CAPITAL LETTER C WITH CEDILLA
      81 |  000000FC | LATIN SMALL LETTER U WITH DIAERESIS
      82 |  000000E9 | LATIN SMALL LETTER E WITH ACUTE
      83 |  000000E2 | LATIN SMALL LETTER A WITH CIRCUMFLEX
      84 |  000000E4 | LATIN SMALL LETTER A WITH DIAERESIS
      85 |  000000E0 | LATIN SMALL LETTER A WITH GRAVE
      86 |  000000E5 | LATIN SMALL LETTER A WITH RING ABOVE
      87 |  000000E7 | LATIN SMALL LETTER C WITH CEDILLA
      88 |  000000EA | LATIN SMALL LETTER E WITH CIRCUMFLEX
      89 |  000000EB | LATIN SMALL LETTER E WITH DIAERESIS
      8A |  000000E8 | LATIN SMALL LETTER E WITH GRAVE
      8B |  000000EF | LATIN SMALL LETTER I WITH DIAERESIS
      8C |  000000EE | LATIN SMALL LETTER I WITH CIRCUMFLEX
      8D |  000000CD | LATIN CAPITAL LETTER I WITH ACUTE
      8E |  000000C4 | LATIN CAPITAL LETTER A WITH DIAERESIS
      8F |  000000C1 | LATIN CAPITAL LETTER A WITH ACUTE
      90 |  000000C9 | LATIN CAPITAL LETTER E WITH ACUTE
      91 |  000000E6 | LATIN SMALL LETTER AE
      92 |  000000C6 | LATIN CAPITAL LETTER AE
      93 |  00000151 | LATIN SMALL LETTER O WITH DOUBLE ACUTE
      94 |  000000F6 | LATIN SMALL LETTER O WITH DIAERESIS
      95 |  000000D3 | LATIN CAPITAL LETTER O WITH ACUTE
      96 |  00000171 | LATIN SMALL LETTER U WITH DOUBLE ACUTE
      97 |  000000DA | LATIN CAPITAL LETTER U WITH ACUTE
      98 |  00000170 | LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
      99 |  000000D6 | LATIN CAPITAL LETTER O WITH DIAERESIS
      9A |  000000DC | LATIN CAPITAL LETTER U WITH DIAERESIS
      9B |  000000A2 | CENT SIGN
      9C |  000000A3 | POUND SIGN
      9D |  000000A5 | YEN SIGN
      9E |  000020A7 | PESETA SIGN
      9F |  0000E01F | HUNGARIAN FLORINTH (CWI_9F)
      A0 |  000000E1 | LATIN SMALL LETTER A WITH ACUTE
      A1 |  000000ED | LATIN SMALL LETTER I WITH ACUTE
      A2 |  000000F3 | LATIN SMALL LETTER O WITH ACUTE
      A3 |  000000FA | LATIN SMALL LETTER U WITH ACUTE
      A4 |  000000F1 | LATIN SMALL LETTER N WITH TILDE
      A5 |  000000D1 | LATIN CAPITAL LETTER N WITH TILDE
      A6 |  000000AA | FEMININE ORDINAL INDICATOR
      A7 |  00000150 | LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
      A8 |  000000BF | INVERTED QUESTION MARK
      A9 |  00002310 | REVERSED NOT SIGN
      AA |  000000AC | NOT SIGN
      AB |  000000BD | VULGAR FRACTION ONE HALF
      AC |  000000BC | VULGAR FRACTION ONE QUARTER
      AD |  000000A1 | INVERTED EXCLAMATION MARK
      AE |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
      AF |  000000BB | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
      B0 |  00002591 | LIGHT SHADE
      B1 |  00002592 | MEDIUM SHADE
      B2 |  00002593 | DARK SHADE
      B3 |  00002502 | BOX DRAWINGS LIGHT VERTICAL
      B4 |  00002524 | BOX DRAWINGS LIGHT VERTICAL AND LEFT
      B5 |  00002561 | BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
      B6 |  00002562 | BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
      B7 |  00002556 | BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
      B8 |  00002555 | BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
      B9 |  00002563 | BOX DRAWINGS DOUBLE VERTICAL AND LEFT
      BA |  00002551 | BOX DRAWINGS DOUBLE VERTICAL
      BB |  00002557 | BOX DRAWINGS DOUBLE DOWN AND LEFT
      BC |  0000255D | BOX DRAWINGS DOUBLE UP AND LEFT
      BD |  0000255C | BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
      BE |  0000255B | BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
      BF |  00002510 | BOX DRAWINGS LIGHT DOWN AND LEFT
      C0 |  00002514 | BOX DRAWINGS LIGHT UP AND RIGHT
      C1 |  00002534 | BOX DRAWINGS LIGHT UP AND HORIZONTAL
      C2 |  0000252C | BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
      C3 |  0000251C | BOX DRAWINGS LIGHT VERTICAL AND RIGHT
      C4 |  00002500 | BOX DRAWINGS LIGHT HORIZONTAL
      C5 |  0000253C | BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
      C6 |  0000255E | BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
      C7 |  0000255F | BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
      C8 |  0000255A | BOX DRAWINGS DOUBLE UP AND RIGHT
      C9 |  00002554 | BOX DRAWINGS DOUBLE DOWN AND RIGHT
      CA |  00002569 | BOX DRAWINGS DOUBLE UP AND HORIZONTAL
      CB |  00002566 | BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
      CC |  00002560 | BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
      CD |  00002550 | BOX DRAWINGS DOUBLE HORIZONTAL
      CE |  0000256C | BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
      CF |  00002567 | BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
      D0 |  00002568 | BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
      D1 |  00002564 | BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
      D2 |  00002565 | BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
      D3 |  00002559 | BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
      D4 |  00002558 | BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
      D5 |  00002552 | BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
      D6 |  00002553 | BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
      D7 |  0000256B | BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
      D8 |  0000256A | BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
      D9 |  00002518 | BOX DRAWINGS LIGHT UP AND LEFT
      DA |  0000250C | BOX DRAWINGS LIGHT DOWN AND RIGHT
      DB |  00002588 | FULL BLOCK
      DC |  00002584 | LOWER HALF BLOCK
      DD |  0000258C | LEFT HALF BLOCK
      DE |  00002590 | RIGHT HALF BLOCK
      DF |  00002580 | UPPER HALF BLOCK
      E0 |  000003B1 | GREEK SMALL LETTER ALPHA
      E1 |  000003B2 | GREEK SMALL LETTER BETA
      E2 |  00000393 | GREEK CAPITAL LETTER GAMMA
      E3 |  000003C0 | GREEK SMALL LETTER PI
      E4 |  000003A3 | GREEK CAPITAL LETTER SIGMA
      E5 |  000003C3 | GREEK SMALL LETTER SIGMA
      E6 |  000003BC | GREEK SMALL LETTER MU
      E7 |  000003C4 | GREEK SMALL LETTER TAU
      E8 |  000003A6 | GREEK CAPITAL LETTER PHI
      E9 |  00000398 | GREEK CAPITAL LETTER THETA
      EA |  000003A9 | GREEK CAPITAL LETTER OMEGA
      EB |  000003B4 | GREEK SMALL LETTER DELTA
      EC |  0000221E | INFINITY
      ED |  00002205 | EMPTY SET
      EE |  000003B5 | GREEK SMALL LETTER EPSILON
      EF |  00002229 | INTERSECTION
      F0 |  00002261 | IDENTICAL TO
      F1 |  000000B1 | PLUS-MINUS SIGN
      F2 |  00002265 | GREATER-THAN OR EQUAL TO
      F3 |  00002264 | LESS-THAN OR EQUAL TO
      F4 |  00002320 | TOP HALF INTEGRAL
      F5 |  00002321 | BOTTOM HALF INTEGRAL
      F6 |  000000F7 | DIVISION SIGN
      F7 |  00002248 | ALMOST EQUAL TO
      F8 |  00002218 | RING OPERATOR
      F9 |  000000B7 | MIDDLE DOT
      FA |  00002022 | BULLET
      FB |  0000221A | SQUARE ROOT
      FC |  0000207F | SUPERSCRIPT LATIN SMALL LETTER N
      FD |  000000B2 | SUPERSCRIPT TWO
      FE |  000025A0 | BLACK SQUARE
      FF |  000000A0 | NO-BREAK SPACE
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_CWI

    $main::fatpacked{"Locale/RecodeData/DEC_MCS.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_DEC_MCS';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for DEC-MCS.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::DEC_MCS;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0x0080,
      0x0081,
      0x0082,
      0x0083,
      0x0084,
      0x0085,
      0x0086,
      0x0087,
      0x0088,
      0x0089,
      0x008a,
      0x008b,
      0x008c,
      0x008d,
      0x008e,
      0x008f,
      0x0090,
      0x0091,
      0x0092,
      0x0093,
      0x0094,
      0x0095,
      0x0096,
      0x0097,
      0x0098,
      0x0099,
      0x009a,
      0x009b,
      0x009c,
      0x009d,
      0x009e,
      0x009f,
      0xfffd,
      0x00a1,
      0x00a2,
      0x00a3,
      0xfffd,
      0x00a5,
      0xfffd,
      0x00a7,
      0x00a4,
      0x00a9,
      0x00aa,
      0x00ab,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00b0,
      0x00b1,
      0x00b2,
      0x00b3,
      0xfffd,
      0x00b5,
      0x00b6,
      0x00b7,
      0xfffd,
      0x00b9,
      0x00ba,
      0x00bb,
      0x00bc,
      0x00bd,
      0xfffd,
      0x00bf,
      0x00c0,
      0x00c1,
      0x00c2,
      0x00c3,
      0x00c4,
      0x00c5,
      0x00c6,
      0x00c7,
      0x00c8,
      0x00c9,
      0x00ca,
      0x00cb,
      0x00cc,
      0x00cd,
      0x00ce,
      0x00cf,
      0xfffd,
      0x00d1,
      0x00d2,
      0x00d3,
      0x00d4,
      0x00d5,
      0x00d6,
      0x0152,
      0x00d8,
      0x00d9,
      0x00da,
      0x00db,
      0x00dc,
      0x0178,
      0xfffd,
      0x00df,
      0x00e0,
      0x00e1,
      0x00e2,
      0x00e3,
      0x00e4,
      0x00e5,
      0x00e6,
      0x00e7,
      0x00e8,
      0x00e9,
      0x00ea,
      0x00eb,
      0x00ec,
      0x00ed,
      0x00ee,
      0x00ef,
      0xfffd,
      0x00f1,
      0x00f2,
      0x00f3,
      0x00f4,
      0x00f5,
      0x00f6,
      0x0153,
      0x00f8,
      0x00f9,
      0x00fa,
      0x00fb,
      0x00fc,
      0x00ff,
      0xfffd,
      0xfffd,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xc2\x80",
      "\xc2\x81",
      "\xc2\x82",
      "\xc2\x83",
      "\xc2\x84",
      "\xc2\x85",
      "\xc2\x86",
      "\xc2\x87",
      "\xc2\x88",
      "\xc2\x89",
      "\xc2\x8a",
      "\xc2\x8b",
      "\xc2\x8c",
      "\xc2\x8d",
      "\xc2\x8e",
      "\xc2\x8f",
      "\xc2\x90",
      "\xc2\x91",
      "\xc2\x92",
      "\xc2\x93",
      "\xc2\x94",
      "\xc2\x95",
      "\xc2\x96",
      "\xc2\x97",
      "\xc2\x98",
      "\xc2\x99",
      "\xc2\x9a",
      "\xc2\x9b",
      "\xc2\x9c",
      "\xc2\x9d",
      "\xc2\x9e",
      "\xc2\x9f",
      "\xef\xbf\xbd",
      "\xc2\xa1",
      "\xc2\xa2",
      "\xc2\xa3",
      "\xef\xbf\xbd",
      "\xc2\xa5",
      "\xef\xbf\xbd",
      "\xc2\xa7",
      "\xc2\xa4",
      "\xc2\xa9",
      "\xc2\xaa",
      "\xc2\xab",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc2\xb0",
      "\xc2\xb1",
      "\xc2\xb2",
      "\xc2\xb3",
      "\xef\xbf\xbd",
      "\xc2\xb5",
      "\xc2\xb6",
      "\xc2\xb7",
      "\xef\xbf\xbd",
      "\xc2\xb9",
      "\xc2\xba",
      "\xc2\xbb",
      "\xc2\xbc",
      "\xc2\xbd",
      "\xef\xbf\xbd",
      "\xc2\xbf",
      "\xc3\x80",
      "\xc3\x81",
      "\xc3\x82",
      "\xc3\x83",
      "\xc3\x84",
      "\xc3\x85",
      "\xc3\x86",
      "\xc3\x87",
      "\xc3\x88",
      "\xc3\x89",
      "\xc3\x8a",
      "\xc3\x8b",
      "\xc3\x8c",
      "\xc3\x8d",
      "\xc3\x8e",
      "\xc3\x8f",
      "\xef\xbf\xbd",
      "\xc3\x91",
      "\xc3\x92",
      "\xc3\x93",
      "\xc3\x94",
      "\xc3\x95",
      "\xc3\x96",
      "\xc5\x92",
      "\xc3\x98",
      "\xc3\x99",
      "\xc3\x9a",
      "\xc3\x9b",
      "\xc3\x9c",
      "\xc5\xb8",
      "\xef\xbf\xbd",
      "\xc3\x9f",
      "\xc3\xa0",
      "\xc3\xa1",
      "\xc3\xa2",
      "\xc3\xa3",
      "\xc3\xa4",
      "\xc3\xa5",
      "\xc3\xa6",
      "\xc3\xa7",
      "\xc3\xa8",
      "\xc3\xa9",
      "\xc3\xaa",
      "\xc3\xab",
      "\xc3\xac",
      "\xc3\xad",
      "\xc3\xae",
      "\xc3\xaf",
      "\xef\xbf\xbd",
      "\xc3\xb1",
      "\xc3\xb2",
      "\xc3\xb3",
      "\xc3\xb4",
      "\xc3\xb5",
      "\xc3\xb6",
      "\xc5\x93",
      "\xc3\xb8",
      "\xc3\xb9",
      "\xc3\xba",
      "\xc3\xbb",
      "\xc3\xbc",
      "\xc3\xbf",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x00000080 => "\x80",
      0x00000081 => "\x81",
      0x00000082 => "\x82",
      0x00000083 => "\x83",
      0x00000084 => "\x84",
      0x00000085 => "\x85",
      0x00000086 => "\x86",
      0x00000087 => "\x87",
      0x00000088 => "\x88",
      0x00000089 => "\x89",
      0x0000008a => "\x8a",
      0x0000008b => "\x8b",
      0x0000008c => "\x8c",
      0x0000008d => "\x8d",
      0x0000008e => "\x8e",
      0x0000008f => "\x8f",
      0x00000090 => "\x90",
      0x00000091 => "\x91",
      0x00000092 => "\x92",
      0x00000093 => "\x93",
      0x00000094 => "\x94",
      0x00000095 => "\x95",
      0x00000096 => "\x96",
      0x00000097 => "\x97",
      0x00000098 => "\x98",
      0x00000099 => "\x99",
      0x0000009a => "\x9a",
      0x0000009b => "\x9b",
      0x0000009c => "\x9c",
      0x0000009d => "\x9d",
      0x0000009e => "\x9e",
      0x0000009f => "\x9f",
      0x000000a1 => "\xa1",
      0x000000a2 => "\xa2",
      0x000000a3 => "\xa3",
      0x000000a4 => "\xa8",
      0x000000a5 => "\xa5",
      0x000000a7 => "\xa7",
      0x000000a9 => "\xa9",
      0x000000aa => "\xaa",
      0x000000ab => "\xab",
      0x000000b0 => "\xb0",
      0x000000b1 => "\xb1",
      0x000000b2 => "\xb2",
      0x000000b3 => "\xb3",
      0x000000b5 => "\xb5",
      0x000000b6 => "\xb6",
      0x000000b7 => "\xb7",
      0x000000b9 => "\xb9",
      0x000000ba => "\xba",
      0x000000bb => "\xbb",
      0x000000bc => "\xbc",
      0x000000bd => "\xbd",
      0x000000bf => "\xbf",
      0x000000c0 => "\xc0",
      0x000000c1 => "\xc1",
      0x000000c2 => "\xc2",
      0x000000c3 => "\xc3",
      0x000000c4 => "\xc4",
      0x000000c5 => "\xc5",
      0x000000c6 => "\xc6",
      0x000000c7 => "\xc7",
      0x000000c8 => "\xc8",
      0x000000c9 => "\xc9",
      0x000000ca => "\xca",
      0x000000cb => "\xcb",
      0x000000cc => "\xcc",
      0x000000cd => "\xcd",
      0x000000ce => "\xce",
      0x000000cf => "\xcf",
      0x000000d1 => "\xd1",
      0x000000d2 => "\xd2",
      0x000000d3 => "\xd3",
      0x000000d4 => "\xd4",
      0x000000d5 => "\xd5",
      0x000000d6 => "\xd6",
      0x000000d8 => "\xd8",
      0x000000d9 => "\xd9",
      0x000000da => "\xda",
      0x000000db => "\xdb",
      0x000000dc => "\xdc",
      0x000000df => "\xdf",
      0x000000e0 => "\xe0",
      0x000000e1 => "\xe1",
      0x000000e2 => "\xe2",
      0x000000e3 => "\xe3",
      0x000000e4 => "\xe4",
      0x000000e5 => "\xe5",
      0x000000e6 => "\xe6",
      0x000000e7 => "\xe7",
      0x000000e8 => "\xe8",
      0x000000e9 => "\xe9",
      0x000000ea => "\xea",
      0x000000eb => "\xeb",
      0x000000ec => "\xec",
      0x000000ed => "\xed",
      0x000000ee => "\xee",
      0x000000ef => "\xef",
      0x000000f1 => "\xf1",
      0x000000f2 => "\xf2",
      0x000000f3 => "\xf3",
      0x000000f4 => "\xf4",
      0x000000f5 => "\xf5",
      0x000000f6 => "\xf6",
      0x000000f8 => "\xf8",
      0x000000f9 => "\xf9",
      0x000000fa => "\xfa",
      0x000000fb => "\xfb",
      0x000000fc => "\xfc",
      0x000000ff => "\xfd",
      0x00000152 => "\xd7",
      0x00000153 => "\xf7",
      0x00000178 => "\xdd",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::DEC_MCS - Conversion routines for DEC_MCS
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for DEC-MCS.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    VAX/VMS User's Manual, Order Number: AI-Y517A-TE, April 1986.
   alias DEC
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE (DEL)
      80 |  00000080 | PADDING CHARACTER (PAD)
      81 |  00000081 | HIGH OCTET PRESET (HOP)
      82 |  00000082 | BREAK PERMITTED HERE (BPH)
      83 |  00000083 | NO BREAK HERE (NBH)
      84 |  00000084 | INDEX (IND)
      85 |  00000085 | NEXT LINE (NEL)
      86 |  00000086 | START OF SELECTED AREA (SSA)
      87 |  00000087 | END OF SELECTED AREA (ESA)
      88 |  00000088 | CHARACTER TABULATION SET (HTS)
      89 |  00000089 | CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
      8A |  0000008A | LINE TABULATION SET (VTS)
      8B |  0000008B | PARTIAL LINE FORWARD (PLD)
      8C |  0000008C | PARTIAL LINE BACKWARD (PLU)
      8D |  0000008D | REVERSE LINE FEED (RI)
      8E |  0000008E | SINGLE-SHIFT TWO (SS2)
      8F |  0000008F | SINGLE-SHIFT THREE (SS3)
      90 |  00000090 | DEVICE CONTROL STRING (DCS)
      91 |  00000091 | PRIVATE USE ONE (PU1)
      92 |  00000092 | PRIVATE USE TWO (PU2)
      93 |  00000093 | SET TRANSMIT STATE (STS)
      94 |  00000094 | CANCEL CHARACTER (CCH)
      95 |  00000095 | MESSAGE WAITING (MW)
      96 |  00000096 | START OF GUARDED AREA (SPA)
      97 |  00000097 | END OF GUARDED AREA (EPA)
      98 |  00000098 | START OF STRING (SOS)
      99 |  00000099 | SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
      9A |  0000009A | SINGLE CHARACTER INTRODUCER (SCI)
      9B |  0000009B | CONTROL SEQUENCE INTRODUCER (CSI)
      9C |  0000009C | STRING TERMINATOR (ST)
      9D |  0000009D | OPERATING SYSTEM COMMAND (OSC)
      9E |  0000009E | PRIVACY MESSAGE (PM)
      9F |  0000009F | APPLICATION PROGRAM COMMAND (APC)
      A1 |  000000A1 | INVERTED EXCLAMATION MARK
      A2 |  000000A2 | CENT SIGN
      A3 |  000000A3 | POUND SIGN
      A5 |  000000A5 | YEN SIGN
      A7 |  000000A7 | SECTION SIGN
      A8 |  000000A4 | CURRENCY SIGN
      A9 |  000000A9 | COPYRIGHT SIGN
      AA |  000000AA | FEMININE ORDINAL INDICATOR
      AB |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
      B0 |  000000B0 | DEGREE SIGN
      B1 |  000000B1 | PLUS-MINUS SIGN
      B2 |  000000B2 | SUPERSCRIPT TWO
      B3 |  000000B3 | SUPERSCRIPT THREE
      B5 |  000000B5 | MICRO SIGN
      B6 |  000000B6 | PILCROW SIGN
      B7 |  000000B7 | MIDDLE DOT
      B9 |  000000B9 | SUPERSCRIPT ONE
      BA |  000000BA | MASCULINE ORDINAL INDICATOR
      BB |  000000BB | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
      BC |  000000BC | VULGAR FRACTION ONE QUARTER
      BD |  000000BD | VULGAR FRACTION ONE HALF
      BF |  000000BF | INVERTED QUESTION MARK
      C0 |  000000C0 | LATIN CAPITAL LETTER A WITH GRAVE
      C1 |  000000C1 | LATIN CAPITAL LETTER A WITH ACUTE
      C2 |  000000C2 | LATIN CAPITAL LETTER A WITH CIRCUMFLEX
      C3 |  000000C3 | LATIN CAPITAL LETTER A WITH TILDE
      C4 |  000000C4 | LATIN CAPITAL LETTER A WITH DIAERESIS
      C5 |  000000C5 | LATIN CAPITAL LETTER A WITH RING ABOVE
      C6 |  000000C6 | LATIN CAPITAL LETTER AE
      C7 |  000000C7 | LATIN CAPITAL LETTER C WITH CEDILLA
      C8 |  000000C8 | LATIN CAPITAL LETTER E WITH GRAVE
      C9 |  000000C9 | LATIN CAPITAL LETTER E WITH ACUTE
      CA |  000000CA | LATIN CAPITAL LETTER E WITH CIRCUMFLEX
      CB |  000000CB | LATIN CAPITAL LETTER E WITH DIAERESIS
      CC |  000000CC | LATIN CAPITAL LETTER I WITH GRAVE
      CD |  000000CD | LATIN CAPITAL LETTER I WITH ACUTE
      CE |  000000CE | LATIN CAPITAL LETTER I WITH CIRCUMFLEX
      CF |  000000CF | LATIN CAPITAL LETTER I WITH DIAERESIS
      D1 |  000000D1 | LATIN CAPITAL LETTER N WITH TILDE
      D2 |  000000D2 | LATIN CAPITAL LETTER O WITH GRAVE
      D3 |  000000D3 | LATIN CAPITAL LETTER O WITH ACUTE
      D4 |  000000D4 | LATIN CAPITAL LETTER O WITH CIRCUMFLEX
      D5 |  000000D5 | LATIN CAPITAL LETTER O WITH TILDE
      D6 |  000000D6 | LATIN CAPITAL LETTER O WITH DIAERESIS
      D7 |  00000152 | LATIN CAPITAL LIGATURE OE
      D8 |  000000D8 | LATIN CAPITAL LETTER O WITH STROKE
      D9 |  000000D9 | LATIN CAPITAL LETTER U WITH GRAVE
      DA |  000000DA | LATIN CAPITAL LETTER U WITH ACUTE
      DB |  000000DB | LATIN CAPITAL LETTER U WITH CIRCUMFLEX
      DC |  000000DC | LATIN CAPITAL LETTER U WITH DIAERESIS
      DD |  00000178 | LATIN CAPITAL LETTER Y WITH DIAERESIS
      DF |  000000DF | LATIN SMALL LETTER SHARP S (German)
      E0 |  000000E0 | LATIN SMALL LETTER A WITH GRAVE
      E1 |  000000E1 | LATIN SMALL LETTER A WITH ACUTE
      E2 |  000000E2 | LATIN SMALL LETTER A WITH CIRCUMFLEX
      E3 |  000000E3 | LATIN SMALL LETTER A WITH TILDE
      E4 |  000000E4 | LATIN SMALL LETTER A WITH DIAERESIS
      E5 |  000000E5 | LATIN SMALL LETTER A WITH RING ABOVE
      E6 |  000000E6 | LATIN SMALL LETTER AE
      E7 |  000000E7 | LATIN SMALL LETTER C WITH CEDILLA
      E8 |  000000E8 | LATIN SMALL LETTER E WITH GRAVE
      E9 |  000000E9 | LATIN SMALL LETTER E WITH ACUTE
      EA |  000000EA | LATIN SMALL LETTER E WITH CIRCUMFLEX
      EB |  000000EB | LATIN SMALL LETTER E WITH DIAERESIS
      EC |  000000EC | LATIN SMALL LETTER I WITH GRAVE
      ED |  000000ED | LATIN SMALL LETTER I WITH ACUTE
      EE |  000000EE | LATIN SMALL LETTER I WITH CIRCUMFLEX
      EF |  000000EF | LATIN SMALL LETTER I WITH DIAERESIS
      F1 |  000000F1 | LATIN SMALL LETTER N WITH TILDE
      F2 |  000000F2 | LATIN SMALL LETTER O WITH GRAVE
      F3 |  000000F3 | LATIN SMALL LETTER O WITH ACUTE
      F4 |  000000F4 | LATIN SMALL LETTER O WITH CIRCUMFLEX
      F5 |  000000F5 | LATIN SMALL LETTER O WITH TILDE
      F6 |  000000F6 | LATIN SMALL LETTER O WITH DIAERESIS
      F7 |  00000153 | LATIN SMALL LIGATURE OE
      F8 |  000000F8 | LATIN SMALL LETTER O WITH STROKE
      F9 |  000000F9 | LATIN SMALL LETTER U WITH GRAVE
      FA |  000000FA | LATIN SMALL LETTER U WITH ACUTE
      FB |  000000FB | LATIN SMALL LETTER U WITH CIRCUMFLEX
      FC |  000000FC | LATIN SMALL LETTER U WITH DIAERESIS
      FD |  000000FF | LATIN SMALL LETTER Y WITH DIAERESIS
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_DEC_MCS

    $main::fatpacked{"Locale/RecodeData/EBCDIC_AT_DE.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_EBCDIC_AT_DE';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for EBCDIC-AT-DE.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::EBCDIC_AT_DE;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x009c,
      0x0009,
      0x0086,
      0x007f,
      0x0097,
      0x008d,
      0x008e,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x009d,
      0x0085,
      0x0008,
      0x0087,
      0x0018,
      0x0019,
      0x0092,
      0x008f,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0080,
      0x0081,
      0x0082,
      0x0083,
      0x0084,
      0x000a,
      0x0017,
      0x001b,
      0x0088,
      0x0089,
      0x008a,
      0x008b,
      0x008c,
      0x0005,
      0x0006,
      0x0007,
      0x0090,
      0x0091,
      0x0016,
      0x0093,
      0x0094,
      0x0095,
      0x0096,
      0x0004,
      0x0098,
      0x0099,
      0x009a,
      0x009b,
      0x0014,
      0x0015,
      0x009e,
      0x001a,
      0x0020,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00c4,
      0x002e,
      0x003c,
      0x0028,
      0x002b,
      0x0021,
      0x0026,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00dc,
      0x0024,
      0x002a,
      0x0029,
      0x003b,
      0x005e,
      0x002d,
      0x002f,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00f6,
      0x002c,
      0x0025,
      0x005f,
      0x003e,
      0x003f,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0060,
      0x003a,
      0x0023,
      0x00a7,
      0x0027,
      0x003d,
      0x0022,
      0xfffd,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00df,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00e4,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00fc,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00d6,
      0xfffd,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x009f,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\xc2\x9c",
      "\x09",
      "\xc2\x86",
      "\x7f",
      "\xc2\x97",
      "\xc2\x8d",
      "\xc2\x8e",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\xc2\x9d",
      "\xc2\x85",
      "\x08",
      "\xc2\x87",
      "\x18",
      "\x19",
      "\xc2\x92",
      "\xc2\x8f",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\xc2\x80",
      "\xc2\x81",
      "\xc2\x82",
      "\xc2\x83",
      "\xc2\x84",
      "\x0a",
      "\x17",
      "\x1b",
      "\xc2\x88",
      "\xc2\x89",
      "\xc2\x8a",
      "\xc2\x8b",
      "\xc2\x8c",
      "\x05",
      "\x06",
      "\x07",
      "\xc2\x90",
      "\xc2\x91",
      "\x16",
      "\xc2\x93",
      "\xc2\x94",
      "\xc2\x95",
      "\xc2\x96",
      "\x04",
      "\xc2\x98",
      "\xc2\x99",
      "\xc2\x9a",
      "\xc2\x9b",
      "\x14",
      "\x15",
      "\xc2\x9e",
      "\x1a",
      "\x20",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc3\x84",
      "\x2e",
      "\x3c",
      "\x28",
      "\x2b",
      "\x21",
      "\x26",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc3\x9c",
      "\x24",
      "\x2a",
      "\x29",
      "\x3b",
      "\x5e",
      "\x2d",
      "\x2f",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc3\xb6",
      "\x2c",
      "\x25",
      "\x5f",
      "\x3e",
      "\x3f",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x60",
      "\x3a",
      "\x23",
      "\xc2\xa7",
      "\x27",
      "\x3d",
      "\x22",
      "\xef\xbf\xbd",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc3\x9f",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc3\xa4",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc3\xbc",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc3\x96",
      "\xef\xbf\xbd",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc2\x9f",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x37",
      0x00000005 => "\x2d",
      0x00000006 => "\x2e",
      0x00000007 => "\x2f",
      0x00000008 => "\x16",
      0x00000009 => "\x05",
      0x0000000a => "\x25",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x3c",
      0x00000015 => "\x3d",
      0x00000016 => "\x32",
      0x00000017 => "\x26",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x3f",
      0x0000001b => "\x27",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x40",
      0x00000021 => "\x4f",
      0x00000022 => "\x7f",
      0x00000023 => "\x7b",
      0x00000024 => "\x5b",
      0x00000025 => "\x6c",
      0x00000026 => "\x50",
      0x00000027 => "\x7d",
      0x00000028 => "\x4d",
      0x00000029 => "\x5d",
      0x0000002a => "\x5c",
      0x0000002b => "\x4e",
      0x0000002c => "\x6b",
      0x0000002d => "\x60",
      0x0000002e => "\x4b",
      0x0000002f => "\x61",
      0x00000030 => "\xf0",
      0x00000031 => "\xf1",
      0x00000032 => "\xf2",
      0x00000033 => "\xf3",
      0x00000034 => "\xf4",
      0x00000035 => "\xf5",
      0x00000036 => "\xf6",
      0x00000037 => "\xf7",
      0x00000038 => "\xf8",
      0x00000039 => "\xf9",
      0x0000003a => "\x7a",
      0x0000003b => "\x5e",
      0x0000003c => "\x4c",
      0x0000003d => "\x7e",
      0x0000003e => "\x6e",
      0x0000003f => "\x6f",
      0x00000041 => "\xc1",
      0x00000042 => "\xc2",
      0x00000043 => "\xc3",
      0x00000044 => "\xc4",
      0x00000045 => "\xc5",
      0x00000046 => "\xc6",
      0x00000047 => "\xc7",
      0x00000048 => "\xc8",
      0x00000049 => "\xc9",
      0x0000004a => "\xd1",
      0x0000004b => "\xd2",
      0x0000004c => "\xd3",
      0x0000004d => "\xd4",
      0x0000004e => "\xd5",
      0x0000004f => "\xd6",
      0x00000050 => "\xd7",
      0x00000051 => "\xd8",
      0x00000052 => "\xd9",
      0x00000053 => "\xe2",
      0x00000054 => "\xe3",
      0x00000055 => "\xe4",
      0x00000056 => "\xe5",
      0x00000057 => "\xe6",
      0x00000058 => "\xe7",
      0x00000059 => "\xe8",
      0x0000005a => "\xe9",
      0x0000005e => "\x5f",
      0x0000005f => "\x6d",
      0x00000060 => "\x79",
      0x00000061 => "\x81",
      0x00000062 => "\x82",
      0x00000063 => "\x83",
      0x00000064 => "\x84",
      0x00000065 => "\x85",
      0x00000066 => "\x86",
      0x00000067 => "\x87",
      0x00000068 => "\x88",
      0x00000069 => "\x89",
      0x0000006a => "\x91",
      0x0000006b => "\x92",
      0x0000006c => "\x93",
      0x0000006d => "\x94",
      0x0000006e => "\x95",
      0x0000006f => "\x96",
      0x00000070 => "\x97",
      0x00000071 => "\x98",
      0x00000072 => "\x99",
      0x00000073 => "\xa2",
      0x00000074 => "\xa3",
      0x00000075 => "\xa4",
      0x00000076 => "\xa5",
      0x00000077 => "\xa6",
      0x00000078 => "\xa7",
      0x00000079 => "\xa8",
      0x0000007a => "\xa9",
      0x0000007f => "\x07",
      0x00000080 => "\x20",
      0x00000081 => "\x21",
      0x00000082 => "\x22",
      0x00000083 => "\x23",
      0x00000084 => "\x24",
      0x00000085 => "\x15",
      0x00000086 => "\x06",
      0x00000087 => "\x17",
      0x00000088 => "\x28",
      0x00000089 => "\x29",
      0x0000008a => "\x2a",
      0x0000008b => "\x2b",
      0x0000008c => "\x2c",
      0x0000008d => "\x09",
      0x0000008e => "\x0a",
      0x0000008f => "\x1b",
      0x00000090 => "\x30",
      0x00000091 => "\x31",
      0x00000092 => "\x1a",
      0x00000093 => "\x33",
      0x00000094 => "\x34",
      0x00000095 => "\x35",
      0x00000096 => "\x36",
      0x00000097 => "\x08",
      0x00000098 => "\x38",
      0x00000099 => "\x39",
      0x0000009a => "\x3a",
      0x0000009b => "\x3b",
      0x0000009c => "\x04",
      0x0000009d => "\x14",
      0x0000009e => "\x3e",
      0x0000009f => "\xff",
      0x000000a7 => "\x7c",
      0x000000c4 => "\x4a",
      0x000000d6 => "\xe0",
      0x000000dc => "\x5a",
      0x000000df => "\xa1",
      0x000000e4 => "\xc0",
      0x000000f6 => "\x6a",
      0x000000fc => "\xd0",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::EBCDIC_AT_DE - Conversion routines for EBCDIC_AT_DE
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for EBCDIC-AT-DE.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  0000009C | STRING TERMINATOR (ST)
      05 |  00000009 | CHARACTER TABULATION (HT)
      06 |  00000086 | START OF SELECTED AREA (SSA)
      07 |  0000007F | DELETE (DEL)
      08 |  00000097 | END OF GUARDED AREA (EPA)
      09 |  0000008D | REVERSE LINE FEED (RI)
      0A |  0000008E | SINGLE-SHIFT TWO (SS2)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  0000009D | OPERATING SYSTEM COMMAND (OSC)
      15 |  00000085 | NEXT LINE (NEL)
      16 |  00000008 | BACKSPACE (BS)
      17 |  00000087 | END OF SELECTED AREA (ESA)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  00000092 | PRIVATE USE TWO (PU2)
      1B |  0000008F | SINGLE-SHIFT THREE (SS3)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000080 | PADDING CHARACTER (PAD)
      21 |  00000081 | HIGH OCTET PRESET (HOP)
      22 |  00000082 | BREAK PERMITTED HERE (BPH)
      23 |  00000083 | NO BREAK HERE (NBH)
      24 |  00000084 | INDEX (IND)
      25 |  0000000A | LINE FEED (LF)
      26 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      27 |  0000001B | ESCAPE (ESC)
      28 |  00000088 | CHARACTER TABULATION SET (HTS)
      29 |  00000089 | CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
      2A |  0000008A | LINE TABULATION SET (VTS)
      2B |  0000008B | PARTIAL LINE FORWARD (PLD)
      2C |  0000008C | PARTIAL LINE BACKWARD (PLU)
      2D |  00000005 | ENQUIRY (ENQ)
      2E |  00000006 | ACKNOWLEDGE (ACK)
      2F |  00000007 | BELL (BEL)
      30 |  00000090 | DEVICE CONTROL STRING (DCS)
      31 |  00000091 | PRIVATE USE ONE (PU1)
      32 |  00000016 | SYNCHRONOUS IDLE (SYN)
      33 |  00000093 | SET TRANSMIT STATE (STS)
      34 |  00000094 | CANCEL CHARACTER (CCH)
      35 |  00000095 | MESSAGE WAITING (MW)
      36 |  00000096 | START OF GUARDED AREA (SPA)
      37 |  00000004 | END OF TRANSMISSION (EOT)
      38 |  00000098 | START OF STRING (SOS)
      39 |  00000099 | SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
      3A |  0000009A | SINGLE CHARACTER INTRODUCER (SCI)
      3B |  0000009B | CONTROL SEQUENCE INTRODUCER (CSI)
      3C |  00000014 | DEVICE CONTROL FOUR (DC4)
      3D |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      3E |  0000009E | PRIVACY MESSAGE (PM)
      3F |  0000001A | SUBSTITUTE (SUB)
      40 |  00000020 | SPACE
      4A |  000000C4 | LATIN CAPITAL LETTER A WITH DIAERESIS
      4B |  0000002E | FULL STOP
      4C |  0000003C | LESS-THAN SIGN
      4D |  00000028 | LEFT PARENTHESIS
      4E |  0000002B | PLUS SIGN
      4F |  00000021 | EXCLAMATION MARK
      50 |  00000026 | AMPERSAND
      5A |  000000DC | LATIN CAPITAL LETTER U WITH DIAERESIS
      5B |  00000024 | DOLLAR SIGN
      5C |  0000002A | ASTERISK
      5D |  00000029 | RIGHT PARENTHESIS
      5E |  0000003B | SEMICOLON
      5F |  0000005E | CIRCUMFLEX ACCENT
      60 |  0000002D | HYPHEN-MINUS
      61 |  0000002F | SOLIDUS
      6A |  000000F6 | LATIN SMALL LETTER O WITH DIAERESIS
      6B |  0000002C | COMMA
      6C |  00000025 | PERCENT SIGN
      6D |  0000005F | LOW LINE
      6E |  0000003E | GREATER-THAN SIGN
      6F |  0000003F | QUESTION MARK
      79 |  00000060 | GRAVE ACCENT
      7A |  0000003A | COLON
      7B |  00000023 | NUMBER SIGN
      7C |  000000A7 | SECTION SIGN
      7D |  00000027 | APOSTROPHE
      7E |  0000003D | EQUALS SIGN
      7F |  00000022 | QUOTATION MARK
      81 |  00000061 | LATIN SMALL LETTER A
      82 |  00000062 | LATIN SMALL LETTER B
      83 |  00000063 | LATIN SMALL LETTER C
      84 |  00000064 | LATIN SMALL LETTER D
      85 |  00000065 | LATIN SMALL LETTER E
      86 |  00000066 | LATIN SMALL LETTER F
      87 |  00000067 | LATIN SMALL LETTER G
      88 |  00000068 | LATIN SMALL LETTER H
      89 |  00000069 | LATIN SMALL LETTER I
      91 |  0000006A | LATIN SMALL LETTER J
      92 |  0000006B | LATIN SMALL LETTER K
      93 |  0000006C | LATIN SMALL LETTER L
      94 |  0000006D | LATIN SMALL LETTER M
      95 |  0000006E | LATIN SMALL LETTER N
      96 |  0000006F | LATIN SMALL LETTER O
      97 |  00000070 | LATIN SMALL LETTER P
      98 |  00000071 | LATIN SMALL LETTER Q
      99 |  00000072 | LATIN SMALL LETTER R
      A1 |  000000DF | LATIN SMALL LETTER SHARP S (German)
      A2 |  00000073 | LATIN SMALL LETTER S
      A3 |  00000074 | LATIN SMALL LETTER T
      A4 |  00000075 | LATIN SMALL LETTER U
      A5 |  00000076 | LATIN SMALL LETTER V
      A6 |  00000077 | LATIN SMALL LETTER W
      A7 |  00000078 | LATIN SMALL LETTER X
      A8 |  00000079 | LATIN SMALL LETTER Y
      A9 |  0000007A | LATIN SMALL LETTER Z
      C0 |  000000E4 | LATIN SMALL LETTER A WITH DIAERESIS
      C1 |  00000041 | LATIN CAPITAL LETTER A
      C2 |  00000042 | LATIN CAPITAL LETTER B
      C3 |  00000043 | LATIN CAPITAL LETTER C
      C4 |  00000044 | LATIN CAPITAL LETTER D
      C5 |  00000045 | LATIN CAPITAL LETTER E
      C6 |  00000046 | LATIN CAPITAL LETTER F
      C7 |  00000047 | LATIN CAPITAL LETTER G
      C8 |  00000048 | LATIN CAPITAL LETTER H
      C9 |  00000049 | LATIN CAPITAL LETTER I
      D0 |  000000FC | LATIN SMALL LETTER U WITH DIAERESIS
      D1 |  0000004A | LATIN CAPITAL LETTER J
      D2 |  0000004B | LATIN CAPITAL LETTER K
      D3 |  0000004C | LATIN CAPITAL LETTER L
      D4 |  0000004D | LATIN CAPITAL LETTER M
      D5 |  0000004E | LATIN CAPITAL LETTER N
      D6 |  0000004F | LATIN CAPITAL LETTER O
      D7 |  00000050 | LATIN CAPITAL LETTER P
      D8 |  00000051 | LATIN CAPITAL LETTER Q
      D9 |  00000052 | LATIN CAPITAL LETTER R
      E0 |  000000D6 | LATIN CAPITAL LETTER O WITH DIAERESIS
      E2 |  00000053 | LATIN CAPITAL LETTER S
      E3 |  00000054 | LATIN CAPITAL LETTER T
      E4 |  00000055 | LATIN CAPITAL LETTER U
      E5 |  00000056 | LATIN CAPITAL LETTER V
      E6 |  00000057 | LATIN CAPITAL LETTER W
      E7 |  00000058 | LATIN CAPITAL LETTER X
      E8 |  00000059 | LATIN CAPITAL LETTER Y
      E9 |  0000005A | LATIN CAPITAL LETTER Z
      F0 |  00000030 | DIGIT ZERO
      F1 |  00000031 | DIGIT ONE
      F2 |  00000032 | DIGIT TWO
      F3 |  00000033 | DIGIT THREE
      F4 |  00000034 | DIGIT FOUR
      F5 |  00000035 | DIGIT FIVE
      F6 |  00000036 | DIGIT SIX
      F7 |  00000037 | DIGIT SEVEN
      F8 |  00000038 | DIGIT EIGHT
      F9 |  00000039 | DIGIT NINE
      FF |  0000009F | APPLICATION PROGRAM COMMAND (APC)
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_EBCDIC_AT_DE

    $main::fatpacked{"Locale/RecodeData/EBCDIC_AT_DE_A.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_EBCDIC_AT_DE_A';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for EBCDIC-AT-DE-A.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::EBCDIC_AT_DE_A;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x009c,
      0x0009,
      0x0086,
      0x007f,
      0x0097,
      0x008d,
      0x008e,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x009d,
      0x0085,
      0x0008,
      0x0087,
      0x0018,
      0x0019,
      0x0092,
      0x008f,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0080,
      0x0081,
      0x0082,
      0x0083,
      0x0084,
      0x000a,
      0x0017,
      0x001b,
      0x0088,
      0x0089,
      0x008a,
      0x008b,
      0x008c,
      0x0005,
      0x0006,
      0x0007,
      0x0090,
      0x0091,
      0x0016,
      0x0093,
      0x0094,
      0x0095,
      0x0096,
      0x0004,
      0x0098,
      0x0099,
      0x009a,
      0x009b,
      0x0014,
      0x0015,
      0x009e,
      0x001a,
      0x0020,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00f6,
      0x002e,
      0x003c,
      0x0028,
      0x002b,
      0x007c,
      0x0026,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00fc,
      0x00dc,
      0x002a,
      0x0029,
      0x003b,
      0x00ac,
      0x002d,
      0x002f,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00df,
      0x002c,
      0x0025,
      0x005f,
      0x003e,
      0x003f,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x003a,
      0x00c4,
      0x00d6,
      0x0027,
      0x003d,
      0x00e4,
      0xfffd,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x009f,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\xc2\x9c",
      "\x09",
      "\xc2\x86",
      "\x7f",
      "\xc2\x97",
      "\xc2\x8d",
      "\xc2\x8e",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\xc2\x9d",
      "\xc2\x85",
      "\x08",
      "\xc2\x87",
      "\x18",
      "\x19",
      "\xc2\x92",
      "\xc2\x8f",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\xc2\x80",
      "\xc2\x81",
      "\xc2\x82",
      "\xc2\x83",
      "\xc2\x84",
      "\x0a",
      "\x17",
      "\x1b",
      "\xc2\x88",
      "\xc2\x89",
      "\xc2\x8a",
      "\xc2\x8b",
      "\xc2\x8c",
      "\x05",
      "\x06",
      "\x07",
      "\xc2\x90",
      "\xc2\x91",
      "\x16",
      "\xc2\x93",
      "\xc2\x94",
      "\xc2\x95",
      "\xc2\x96",
      "\x04",
      "\xc2\x98",
      "\xc2\x99",
      "\xc2\x9a",
      "\xc2\x9b",
      "\x14",
      "\x15",
      "\xc2\x9e",
      "\x1a",
      "\x20",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc3\xb6",
      "\x2e",
      "\x3c",
      "\x28",
      "\x2b",
      "\x7c",
      "\x26",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc3\xbc",
      "\xc3\x9c",
      "\x2a",
      "\x29",
      "\x3b",
      "\xc2\xac",
      "\x2d",
      "\x2f",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc3\x9f",
      "\x2c",
      "\x25",
      "\x5f",
      "\x3e",
      "\x3f",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x3a",
      "\xc3\x84",
      "\xc3\x96",
      "\x27",
      "\x3d",
      "\xc3\xa4",
      "\xef\xbf\xbd",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc2\x9f",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x37",
      0x00000005 => "\x2d",
      0x00000006 => "\x2e",
      0x00000007 => "\x2f",
      0x00000008 => "\x16",
      0x00000009 => "\x05",
      0x0000000a => "\x25",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x3c",
      0x00000015 => "\x3d",
      0x00000016 => "\x32",
      0x00000017 => "\x26",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x3f",
      0x0000001b => "\x27",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x40",
      0x00000025 => "\x6c",
      0x00000026 => "\x50",
      0x00000027 => "\x7d",
      0x00000028 => "\x4d",
      0x00000029 => "\x5d",
      0x0000002a => "\x5c",
      0x0000002b => "\x4e",
      0x0000002c => "\x6b",
      0x0000002d => "\x60",
      0x0000002e => "\x4b",
      0x0000002f => "\x61",
      0x00000030 => "\xf0",
      0x00000031 => "\xf1",
      0x00000032 => "\xf2",
      0x00000033 => "\xf3",
      0x00000034 => "\xf4",
      0x00000035 => "\xf5",
      0x00000036 => "\xf6",
      0x00000037 => "\xf7",
      0x00000038 => "\xf8",
      0x00000039 => "\xf9",
      0x0000003a => "\x7a",
      0x0000003b => "\x5e",
      0x0000003c => "\x4c",
      0x0000003d => "\x7e",
      0x0000003e => "\x6e",
      0x0000003f => "\x6f",
      0x00000041 => "\xc1",
      0x00000042 => "\xc2",
      0x00000043 => "\xc3",
      0x00000044 => "\xc4",
      0x00000045 => "\xc5",
      0x00000046 => "\xc6",
      0x00000047 => "\xc7",
      0x00000048 => "\xc8",
      0x00000049 => "\xc9",
      0x0000004a => "\xd1",
      0x0000004b => "\xd2",
      0x0000004c => "\xd3",
      0x0000004d => "\xd4",
      0x0000004e => "\xd5",
      0x0000004f => "\xd6",
      0x00000050 => "\xd7",
      0x00000051 => "\xd8",
      0x00000052 => "\xd9",
      0x00000053 => "\xe2",
      0x00000054 => "\xe3",
      0x00000055 => "\xe4",
      0x00000056 => "\xe5",
      0x00000057 => "\xe6",
      0x00000058 => "\xe7",
      0x00000059 => "\xe8",
      0x0000005a => "\xe9",
      0x0000005f => "\x6d",
      0x00000061 => "\x81",
      0x00000062 => "\x82",
      0x00000063 => "\x83",
      0x00000064 => "\x84",
      0x00000065 => "\x85",
      0x00000066 => "\x86",
      0x00000067 => "\x87",
      0x00000068 => "\x88",
      0x00000069 => "\x89",
      0x0000006a => "\x91",
      0x0000006b => "\x92",
      0x0000006c => "\x93",
      0x0000006d => "\x94",
      0x0000006e => "\x95",
      0x0000006f => "\x96",
      0x00000070 => "\x97",
      0x00000071 => "\x98",
      0x00000072 => "\x99",
      0x00000073 => "\xa2",
      0x00000074 => "\xa3",
      0x00000075 => "\xa4",
      0x00000076 => "\xa5",
      0x00000077 => "\xa6",
      0x00000078 => "\xa7",
      0x00000079 => "\xa8",
      0x0000007a => "\xa9",
      0x0000007c => "\x4f",
      0x0000007f => "\x07",
      0x00000080 => "\x20",
      0x00000081 => "\x21",
      0x00000082 => "\x22",
      0x00000083 => "\x23",
      0x00000084 => "\x24",
      0x00000085 => "\x15",
      0x00000086 => "\x06",
      0x00000087 => "\x17",
      0x00000088 => "\x28",
      0x00000089 => "\x29",
      0x0000008a => "\x2a",
      0x0000008b => "\x2b",
      0x0000008c => "\x2c",
      0x0000008d => "\x09",
      0x0000008e => "\x0a",
      0x0000008f => "\x1b",
      0x00000090 => "\x30",
      0x00000091 => "\x31",
      0x00000092 => "\x1a",
      0x00000093 => "\x33",
      0x00000094 => "\x34",
      0x00000095 => "\x35",
      0x00000096 => "\x36",
      0x00000097 => "\x08",
      0x00000098 => "\x38",
      0x00000099 => "\x39",
      0x0000009a => "\x3a",
      0x0000009b => "\x3b",
      0x0000009c => "\x04",
      0x0000009d => "\x14",
      0x0000009e => "\x3e",
      0x0000009f => "\xff",
      0x000000ac => "\x5f",
      0x000000c4 => "\x7b",
      0x000000d6 => "\x7c",
      0x000000dc => "\x5b",
      0x000000df => "\x6a",
      0x000000e4 => "\x7f",
      0x000000f6 => "\x4a",
      0x000000fc => "\x5a",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::EBCDIC_AT_DE_A - Conversion routines for EBCDIC_AT_DE_A
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for EBCDIC-AT-DE-A.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  0000009C | STRING TERMINATOR (ST)
      05 |  00000009 | CHARACTER TABULATION (HT)
      06 |  00000086 | START OF SELECTED AREA (SSA)
      07 |  0000007F | DELETE (DEL)
      08 |  00000097 | END OF GUARDED AREA (EPA)
      09 |  0000008D | REVERSE LINE FEED (RI)
      0A |  0000008E | SINGLE-SHIFT TWO (SS2)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  0000009D | OPERATING SYSTEM COMMAND (OSC)
      15 |  00000085 | NEXT LINE (NEL)
      16 |  00000008 | BACKSPACE (BS)
      17 |  00000087 | END OF SELECTED AREA (ESA)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  00000092 | PRIVATE USE TWO (PU2)
      1B |  0000008F | SINGLE-SHIFT THREE (SS3)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000080 | PADDING CHARACTER (PAD)
      21 |  00000081 | HIGH OCTET PRESET (HOP)
      22 |  00000082 | BREAK PERMITTED HERE (BPH)
      23 |  00000083 | NO BREAK HERE (NBH)
      24 |  00000084 | INDEX (IND)
      25 |  0000000A | LINE FEED (LF)
      26 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      27 |  0000001B | ESCAPE (ESC)
      28 |  00000088 | CHARACTER TABULATION SET (HTS)
      29 |  00000089 | CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
      2A |  0000008A | LINE TABULATION SET (VTS)
      2B |  0000008B | PARTIAL LINE FORWARD (PLD)
      2C |  0000008C | PARTIAL LINE BACKWARD (PLU)
      2D |  00000005 | ENQUIRY (ENQ)
      2E |  00000006 | ACKNOWLEDGE (ACK)
      2F |  00000007 | BELL (BEL)
      30 |  00000090 | DEVICE CONTROL STRING (DCS)
      31 |  00000091 | PRIVATE USE ONE (PU1)
      32 |  00000016 | SYNCHRONOUS IDLE (SYN)
      33 |  00000093 | SET TRANSMIT STATE (STS)
      34 |  00000094 | CANCEL CHARACTER (CCH)
      35 |  00000095 | MESSAGE WAITING (MW)
      36 |  00000096 | START OF GUARDED AREA (SPA)
      37 |  00000004 | END OF TRANSMISSION (EOT)
      38 |  00000098 | START OF STRING (SOS)
      39 |  00000099 | SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
      3A |  0000009A | SINGLE CHARACTER INTRODUCER (SCI)
      3B |  0000009B | CONTROL SEQUENCE INTRODUCER (CSI)
      3C |  00000014 | DEVICE CONTROL FOUR (DC4)
      3D |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      3E |  0000009E | PRIVACY MESSAGE (PM)
      3F |  0000001A | SUBSTITUTE (SUB)
      40 |  00000020 | SPACE
      4A |  000000F6 | LATIN SMALL LETTER O WITH DIAERESIS
      4B |  0000002E | FULL STOP
      4C |  0000003C | LESS-THAN SIGN
      4D |  00000028 | LEFT PARENTHESIS
      4E |  0000002B | PLUS SIGN
      4F |  0000007C | VERTICAL LINE
      50 |  00000026 | AMPERSAND
      5A |  000000FC | LATIN SMALL LETTER U WITH DIAERESIS
      5B |  000000DC | LATIN CAPITAL LETTER U WITH DIAERESIS
      5C |  0000002A | ASTERISK
      5D |  00000029 | RIGHT PARENTHESIS
      5E |  0000003B | SEMICOLON
      5F |  000000AC | NOT SIGN
      60 |  0000002D | HYPHEN-MINUS
      61 |  0000002F | SOLIDUS
      6A |  000000DF | LATIN SMALL LETTER SHARP S (German)
      6B |  0000002C | COMMA
      6C |  00000025 | PERCENT SIGN
      6D |  0000005F | LOW LINE
      6E |  0000003E | GREATER-THAN SIGN
      6F |  0000003F | QUESTION MARK
      7A |  0000003A | COLON
      7B |  000000C4 | LATIN CAPITAL LETTER A WITH DIAERESIS
      7C |  000000D6 | LATIN CAPITAL LETTER O WITH DIAERESIS
      7D |  00000027 | APOSTROPHE
      7E |  0000003D | EQUALS SIGN
      7F |  000000E4 | LATIN SMALL LETTER A WITH DIAERESIS
      81 |  00000061 | LATIN SMALL LETTER A
      82 |  00000062 | LATIN SMALL LETTER B
      83 |  00000063 | LATIN SMALL LETTER C
      84 |  00000064 | LATIN SMALL LETTER D
      85 |  00000065 | LATIN SMALL LETTER E
      86 |  00000066 | LATIN SMALL LETTER F
      87 |  00000067 | LATIN SMALL LETTER G
      88 |  00000068 | LATIN SMALL LETTER H
      89 |  00000069 | LATIN SMALL LETTER I
      91 |  0000006A | LATIN SMALL LETTER J
      92 |  0000006B | LATIN SMALL LETTER K
      93 |  0000006C | LATIN SMALL LETTER L
      94 |  0000006D | LATIN SMALL LETTER M
      95 |  0000006E | LATIN SMALL LETTER N
      96 |  0000006F | LATIN SMALL LETTER O
      97 |  00000070 | LATIN SMALL LETTER P
      98 |  00000071 | LATIN SMALL LETTER Q
      99 |  00000072 | LATIN SMALL LETTER R
      A2 |  00000073 | LATIN SMALL LETTER S
      A3 |  00000074 | LATIN SMALL LETTER T
      A4 |  00000075 | LATIN SMALL LETTER U
      A5 |  00000076 | LATIN SMALL LETTER V
      A6 |  00000077 | LATIN SMALL LETTER W
      A7 |  00000078 | LATIN SMALL LETTER X
      A8 |  00000079 | LATIN SMALL LETTER Y
      A9 |  0000007A | LATIN SMALL LETTER Z
      C1 |  00000041 | LATIN CAPITAL LETTER A
      C2 |  00000042 | LATIN CAPITAL LETTER B
      C3 |  00000043 | LATIN CAPITAL LETTER C
      C4 |  00000044 | LATIN CAPITAL LETTER D
      C5 |  00000045 | LATIN CAPITAL LETTER E
      C6 |  00000046 | LATIN CAPITAL LETTER F
      C7 |  00000047 | LATIN CAPITAL LETTER G
      C8 |  00000048 | LATIN CAPITAL LETTER H
      C9 |  00000049 | LATIN CAPITAL LETTER I
      D1 |  0000004A | LATIN CAPITAL LETTER J
      D2 |  0000004B | LATIN CAPITAL LETTER K
      D3 |  0000004C | LATIN CAPITAL LETTER L
      D4 |  0000004D | LATIN CAPITAL LETTER M
      D5 |  0000004E | LATIN CAPITAL LETTER N
      D6 |  0000004F | LATIN CAPITAL LETTER O
      D7 |  00000050 | LATIN CAPITAL LETTER P
      D8 |  00000051 | LATIN CAPITAL LETTER Q
      D9 |  00000052 | LATIN CAPITAL LETTER R
      E2 |  00000053 | LATIN CAPITAL LETTER S
      E3 |  00000054 | LATIN CAPITAL LETTER T
      E4 |  00000055 | LATIN CAPITAL LETTER U
      E5 |  00000056 | LATIN CAPITAL LETTER V
      E6 |  00000057 | LATIN CAPITAL LETTER W
      E7 |  00000058 | LATIN CAPITAL LETTER X
      E8 |  00000059 | LATIN CAPITAL LETTER Y
      E9 |  0000005A | LATIN CAPITAL LETTER Z
      F0 |  00000030 | DIGIT ZERO
      F1 |  00000031 | DIGIT ONE
      F2 |  00000032 | DIGIT TWO
      F3 |  00000033 | DIGIT THREE
      F4 |  00000034 | DIGIT FOUR
      F5 |  00000035 | DIGIT FIVE
      F6 |  00000036 | DIGIT SIX
      F7 |  00000037 | DIGIT SEVEN
      F8 |  00000038 | DIGIT EIGHT
      F9 |  00000039 | DIGIT NINE
      FF |  0000009F | APPLICATION PROGRAM COMMAND (APC)
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_EBCDIC_AT_DE_A

    $main::fatpacked{"Locale/RecodeData/EBCDIC_CA_FR.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_EBCDIC_CA_FR';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for EBCDIC-CA-FR.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::EBCDIC_CA_FR;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x009c,
      0x0009,
      0x0086,
      0x007f,
      0x0097,
      0x008d,
      0x008e,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x009d,
      0x0085,
      0x0008,
      0x0087,
      0x0018,
      0x0019,
      0x0092,
      0x008f,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0080,
      0x0081,
      0x0082,
      0x0083,
      0x0084,
      0x000a,
      0x0017,
      0x001b,
      0x0088,
      0x0089,
      0x008a,
      0x008b,
      0x008c,
      0x0005,
      0x0006,
      0x0007,
      0x0090,
      0x0091,
      0x0016,
      0x0093,
      0x0094,
      0x0095,
      0x0096,
      0x0004,
      0x0098,
      0x0099,
      0x009a,
      0x009b,
      0x0014,
      0x0015,
      0x009e,
      0x001a,
      0x0020,
      0xfffd,
      0x00e2,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00e7,
      0xfffd,
      0x00e0,
      0x002e,
      0x003c,
      0x0028,
      0x002b,
      0x0021,
      0x0026,
      0xfffd,
      0x00ea,
      0x00eb,
      0xfffd,
      0xfffd,
      0x00ee,
      0x00ef,
      0xfffd,
      0xfffd,
      0x00b4,
      0x0024,
      0x002a,
      0x0029,
      0x003b,
      0x005e,
      0x002d,
      0x002f,
      0x00c2,
      0xfffd,
      0x00c0,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00c7,
      0xfffd,
      0x00f9,
      0x002c,
      0x0025,
      0x005f,
      0x003e,
      0x003f,
      0xfffd,
      0x00c9,
      0x00ca,
      0x00cb,
      0xfffd,
      0x00ce,
      0x00cf,
      0xfffd,
      0xfffd,
      0x0060,
      0x003a,
      0x0023,
      0x0040,
      0x0027,
      0x003d,
      0x0022,
      0xfffd,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00a8,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00e9,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0xfffd,
      0x00f4,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00e8,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0xfffd,
      0x00fb,
      0x00fc,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00b8,
      0xfffd,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0xfffd,
      0x00d4,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0xfffd,
      0x00db,
      0x00dc,
      0x00d9,
      0xfffd,
      0x009f,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\xc2\x9c",
      "\x09",
      "\xc2\x86",
      "\x7f",
      "\xc2\x97",
      "\xc2\x8d",
      "\xc2\x8e",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\xc2\x9d",
      "\xc2\x85",
      "\x08",
      "\xc2\x87",
      "\x18",
      "\x19",
      "\xc2\x92",
      "\xc2\x8f",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\xc2\x80",
      "\xc2\x81",
      "\xc2\x82",
      "\xc2\x83",
      "\xc2\x84",
      "\x0a",
      "\x17",
      "\x1b",
      "\xc2\x88",
      "\xc2\x89",
      "\xc2\x8a",
      "\xc2\x8b",
      "\xc2\x8c",
      "\x05",
      "\x06",
      "\x07",
      "\xc2\x90",
      "\xc2\x91",
      "\x16",
      "\xc2\x93",
      "\xc2\x94",
      "\xc2\x95",
      "\xc2\x96",
      "\x04",
      "\xc2\x98",
      "\xc2\x99",
      "\xc2\x9a",
      "\xc2\x9b",
      "\x14",
      "\x15",
      "\xc2\x9e",
      "\x1a",
      "\x20",
      "\xef\xbf\xbd",
      "\xc3\xa2",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc3\xa7",
      "\xef\xbf\xbd",
      "\xc3\xa0",
      "\x2e",
      "\x3c",
      "\x28",
      "\x2b",
      "\x21",
      "\x26",
      "\xef\xbf\xbd",
      "\xc3\xaa",
      "\xc3\xab",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc3\xae",
      "\xc3\xaf",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc2\xb4",
      "\x24",
      "\x2a",
      "\x29",
      "\x3b",
      "\x5e",
      "\x2d",
      "\x2f",
      "\xc3\x82",
      "\xef\xbf\xbd",
      "\xc3\x80",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc3\x87",
      "\xef\xbf\xbd",
      "\xc3\xb9",
      "\x2c",
      "\x25",
      "\x5f",
      "\x3e",
      "\x3f",
      "\xef\xbf\xbd",
      "\xc3\x89",
      "\xc3\x8a",
      "\xc3\x8b",
      "\xef\xbf\xbd",
      "\xc3\x8e",
      "\xc3\x8f",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x60",
      "\x3a",
      "\x23",
      "\x40",
      "\x27",
      "\x3d",
      "\x22",
      "\xef\xbf\xbd",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc2\xa8",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc3\xa9",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\xef\xbf\xbd",
      "\xc3\xb4",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc3\xa8",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\xef\xbf\xbd",
      "\xc3\xbb",
      "\xc3\xbc",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc2\xb8",
      "\xef\xbf\xbd",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\xef\xbf\xbd",
      "\xc3\x94",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\xef\xbf\xbd",
      "\xc3\x9b",
      "\xc3\x9c",
      "\xc3\x99",
      "\xef\xbf\xbd",
      "\xc2\x9f",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x37",
      0x00000005 => "\x2d",
      0x00000006 => "\x2e",
      0x00000007 => "\x2f",
      0x00000008 => "\x16",
      0x00000009 => "\x05",
      0x0000000a => "\x25",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x3c",
      0x00000015 => "\x3d",
      0x00000016 => "\x32",
      0x00000017 => "\x26",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x3f",
      0x0000001b => "\x27",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x40",
      0x00000021 => "\x4f",
      0x00000022 => "\x7f",
      0x00000023 => "\x7b",
      0x00000024 => "\x5b",
      0x00000025 => "\x6c",
      0x00000026 => "\x50",
      0x00000027 => "\x7d",
      0x00000028 => "\x4d",
      0x00000029 => "\x5d",
      0x0000002a => "\x5c",
      0x0000002b => "\x4e",
      0x0000002c => "\x6b",
      0x0000002d => "\x60",
      0x0000002e => "\x4b",
      0x0000002f => "\x61",
      0x00000030 => "\xf0",
      0x00000031 => "\xf1",
      0x00000032 => "\xf2",
      0x00000033 => "\xf3",
      0x00000034 => "\xf4",
      0x00000035 => "\xf5",
      0x00000036 => "\xf6",
      0x00000037 => "\xf7",
      0x00000038 => "\xf8",
      0x00000039 => "\xf9",
      0x0000003a => "\x7a",
      0x0000003b => "\x5e",
      0x0000003c => "\x4c",
      0x0000003d => "\x7e",
      0x0000003e => "\x6e",
      0x0000003f => "\x6f",
      0x00000040 => "\x7c",
      0x00000041 => "\xc1",
      0x00000042 => "\xc2",
      0x00000043 => "\xc3",
      0x00000044 => "\xc4",
      0x00000045 => "\xc5",
      0x00000046 => "\xc6",
      0x00000047 => "\xc7",
      0x00000048 => "\xc8",
      0x00000049 => "\xc9",
      0x0000004a => "\xd1",
      0x0000004b => "\xd2",
      0x0000004c => "\xd3",
      0x0000004d => "\xd4",
      0x0000004e => "\xd5",
      0x0000004f => "\xd6",
      0x00000050 => "\xd7",
      0x00000051 => "\xd8",
      0x00000052 => "\xd9",
      0x00000053 => "\xe2",
      0x00000054 => "\xe3",
      0x00000055 => "\xe4",
      0x00000056 => "\xe5",
      0x00000057 => "\xe6",
      0x00000058 => "\xe7",
      0x00000059 => "\xe8",
      0x0000005a => "\xe9",
      0x0000005e => "\x5f",
      0x0000005f => "\x6d",
      0x00000060 => "\x79",
      0x00000061 => "\x81",
      0x00000062 => "\x82",
      0x00000063 => "\x83",
      0x00000064 => "\x84",
      0x00000065 => "\x85",
      0x00000066 => "\x86",
      0x00000067 => "\x87",
      0x00000068 => "\x88",
      0x00000069 => "\x89",
      0x0000006a => "\x91",
      0x0000006b => "\x92",
      0x0000006c => "\x93",
      0x0000006d => "\x94",
      0x0000006e => "\x95",
      0x0000006f => "\x96",
      0x00000070 => "\x97",
      0x00000071 => "\x98",
      0x00000072 => "\x99",
      0x00000073 => "\xa2",
      0x00000074 => "\xa3",
      0x00000075 => "\xa4",
      0x00000076 => "\xa5",
      0x00000077 => "\xa6",
      0x00000078 => "\xa7",
      0x00000079 => "\xa8",
      0x0000007a => "\xa9",
      0x0000007f => "\x07",
      0x00000080 => "\x20",
      0x00000081 => "\x21",
      0x00000082 => "\x22",
      0x00000083 => "\x23",
      0x00000084 => "\x24",
      0x00000085 => "\x15",
      0x00000086 => "\x06",
      0x00000087 => "\x17",
      0x00000088 => "\x28",
      0x00000089 => "\x29",
      0x0000008a => "\x2a",
      0x0000008b => "\x2b",
      0x0000008c => "\x2c",
      0x0000008d => "\x09",
      0x0000008e => "\x0a",
      0x0000008f => "\x1b",
      0x00000090 => "\x30",
      0x00000091 => "\x31",
      0x00000092 => "\x1a",
      0x00000093 => "\x33",
      0x00000094 => "\x34",
      0x00000095 => "\x35",
      0x00000096 => "\x36",
      0x00000097 => "\x08",
      0x00000098 => "\x38",
      0x00000099 => "\x39",
      0x0000009a => "\x3a",
      0x0000009b => "\x3b",
      0x0000009c => "\x04",
      0x0000009d => "\x14",
      0x0000009e => "\x3e",
      0x0000009f => "\xff",
      0x000000a8 => "\xa1",
      0x000000b4 => "\x5a",
      0x000000b8 => "\xe0",
      0x000000c0 => "\x64",
      0x000000c2 => "\x62",
      0x000000c7 => "\x68",
      0x000000c9 => "\x71",
      0x000000ca => "\x72",
      0x000000cb => "\x73",
      0x000000ce => "\x75",
      0x000000cf => "\x76",
      0x000000d4 => "\xeb",
      0x000000d9 => "\xfd",
      0x000000db => "\xfb",
      0x000000dc => "\xfc",
      0x000000e0 => "\x4a",
      0x000000e2 => "\x42",
      0x000000e7 => "\x48",
      0x000000e8 => "\xd0",
      0x000000e9 => "\xc0",
      0x000000ea => "\x52",
      0x000000eb => "\x53",
      0x000000ee => "\x56",
      0x000000ef => "\x57",
      0x000000f4 => "\xcb",
      0x000000f9 => "\x6a",
      0x000000fb => "\xdb",
      0x000000fc => "\xdc",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::EBCDIC_CA_FR - Conversion routines for EBCDIC_CA_FR
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for EBCDIC-CA-FR.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  0000009C | STRING TERMINATOR (ST)
      05 |  00000009 | CHARACTER TABULATION (HT)
      06 |  00000086 | START OF SELECTED AREA (SSA)
      07 |  0000007F | DELETE (DEL)
      08 |  00000097 | END OF GUARDED AREA (EPA)
      09 |  0000008D | REVERSE LINE FEED (RI)
      0A |  0000008E | SINGLE-SHIFT TWO (SS2)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  0000009D | OPERATING SYSTEM COMMAND (OSC)
      15 |  00000085 | NEXT LINE (NEL)
      16 |  00000008 | BACKSPACE (BS)
      17 |  00000087 | END OF SELECTED AREA (ESA)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  00000092 | PRIVATE USE TWO (PU2)
      1B |  0000008F | SINGLE-SHIFT THREE (SS3)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000080 | PADDING CHARACTER (PAD)
      21 |  00000081 | HIGH OCTET PRESET (HOP)
      22 |  00000082 | BREAK PERMITTED HERE (BPH)
      23 |  00000083 | NO BREAK HERE (NBH)
      24 |  00000084 | INDEX (IND)
      25 |  0000000A | LINE FEED (LF)
      26 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      27 |  0000001B | ESCAPE (ESC)
      28 |  00000088 | CHARACTER TABULATION SET (HTS)
      29 |  00000089 | CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
      2A |  0000008A | LINE TABULATION SET (VTS)
      2B |  0000008B | PARTIAL LINE FORWARD (PLD)
      2C |  0000008C | PARTIAL LINE BACKWARD (PLU)
      2D |  00000005 | ENQUIRY (ENQ)
      2E |  00000006 | ACKNOWLEDGE (ACK)
      2F |  00000007 | BELL (BEL)
      30 |  00000090 | DEVICE CONTROL STRING (DCS)
      31 |  00000091 | PRIVATE USE ONE (PU1)
      32 |  00000016 | SYNCHRONOUS IDLE (SYN)
      33 |  00000093 | SET TRANSMIT STATE (STS)
      34 |  00000094 | CANCEL CHARACTER (CCH)
      35 |  00000095 | MESSAGE WAITING (MW)
      36 |  00000096 | START OF GUARDED AREA (SPA)
      37 |  00000004 | END OF TRANSMISSION (EOT)
      38 |  00000098 | START OF STRING (SOS)
      39 |  00000099 | SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
      3A |  0000009A | SINGLE CHARACTER INTRODUCER (SCI)
      3B |  0000009B | CONTROL SEQUENCE INTRODUCER (CSI)
      3C |  00000014 | DEVICE CONTROL FOUR (DC4)
      3D |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      3E |  0000009E | PRIVACY MESSAGE (PM)
      3F |  0000001A | SUBSTITUTE (SUB)
      40 |  00000020 | SPACE
      42 |  000000E2 | LATIN SMALL LETTER A WITH CIRCUMFLEX
      48 |  000000E7 | LATIN SMALL LETTER C WITH CEDILLA
      4A |  000000E0 | LATIN SMALL LETTER A WITH GRAVE
      4B |  0000002E | FULL STOP
      4C |  0000003C | LESS-THAN SIGN
      4D |  00000028 | LEFT PARENTHESIS
      4E |  0000002B | PLUS SIGN
      4F |  00000021 | EXCLAMATION MARK
      50 |  00000026 | AMPERSAND
      52 |  000000EA | LATIN SMALL LETTER E WITH CIRCUMFLEX
      53 |  000000EB | LATIN SMALL LETTER E WITH DIAERESIS
      56 |  000000EE | LATIN SMALL LETTER I WITH CIRCUMFLEX
      57 |  000000EF | LATIN SMALL LETTER I WITH DIAERESIS
      5A |  000000B4 | ACUTE ACCENT
      5B |  00000024 | DOLLAR SIGN
      5C |  0000002A | ASTERISK
      5D |  00000029 | RIGHT PARENTHESIS
      5E |  0000003B | SEMICOLON
      5F |  0000005E | CIRCUMFLEX ACCENT
      60 |  0000002D | HYPHEN-MINUS
      61 |  0000002F | SOLIDUS
      62 |  000000C2 | LATIN CAPITAL LETTER A WITH CIRCUMFLEX
      64 |  000000C0 | LATIN CAPITAL LETTER A WITH GRAVE
      68 |  000000C7 | LATIN CAPITAL LETTER C WITH CEDILLA
      6A |  000000F9 | LATIN SMALL LETTER U WITH GRAVE
      6B |  0000002C | COMMA
      6C |  00000025 | PERCENT SIGN
      6D |  0000005F | LOW LINE
      6E |  0000003E | GREATER-THAN SIGN
      6F |  0000003F | QUESTION MARK
      71 |  000000C9 | LATIN CAPITAL LETTER E WITH ACUTE
      72 |  000000CA | LATIN CAPITAL LETTER E WITH CIRCUMFLEX
      73 |  000000CB | LATIN CAPITAL LETTER E WITH DIAERESIS
      75 |  000000CE | LATIN CAPITAL LETTER I WITH CIRCUMFLEX
      76 |  000000CF | LATIN CAPITAL LETTER I WITH DIAERESIS
      79 |  00000060 | GRAVE ACCENT
      7A |  0000003A | COLON
      7B |  00000023 | NUMBER SIGN
      7C |  00000040 | COMMERCIAL AT
      7D |  00000027 | APOSTROPHE
      7E |  0000003D | EQUALS SIGN
      7F |  00000022 | QUOTATION MARK
      81 |  00000061 | LATIN SMALL LETTER A
      82 |  00000062 | LATIN SMALL LETTER B
      83 |  00000063 | LATIN SMALL LETTER C
      84 |  00000064 | LATIN SMALL LETTER D
      85 |  00000065 | LATIN SMALL LETTER E
      86 |  00000066 | LATIN SMALL LETTER F
      87 |  00000067 | LATIN SMALL LETTER G
      88 |  00000068 | LATIN SMALL LETTER H
      89 |  00000069 | LATIN SMALL LETTER I
      91 |  0000006A | LATIN SMALL LETTER J
      92 |  0000006B | LATIN SMALL LETTER K
      93 |  0000006C | LATIN SMALL LETTER L
      94 |  0000006D | LATIN SMALL LETTER M
      95 |  0000006E | LATIN SMALL LETTER N
      96 |  0000006F | LATIN SMALL LETTER O
      97 |  00000070 | LATIN SMALL LETTER P
      98 |  00000071 | LATIN SMALL LETTER Q
      99 |  00000072 | LATIN SMALL LETTER R
      A1 |  000000A8 | DIAERESIS
      A2 |  00000073 | LATIN SMALL LETTER S
      A3 |  00000074 | LATIN SMALL LETTER T
      A4 |  00000075 | LATIN SMALL LETTER U
      A5 |  00000076 | LATIN SMALL LETTER V
      A6 |  00000077 | LATIN SMALL LETTER W
      A7 |  00000078 | LATIN SMALL LETTER X
      A8 |  00000079 | LATIN SMALL LETTER Y
      A9 |  0000007A | LATIN SMALL LETTER Z
      C0 |  000000E9 | LATIN SMALL LETTER E WITH ACUTE
      C1 |  00000041 | LATIN CAPITAL LETTER A
      C2 |  00000042 | LATIN CAPITAL LETTER B
      C3 |  00000043 | LATIN CAPITAL LETTER C
      C4 |  00000044 | LATIN CAPITAL LETTER D
      C5 |  00000045 | LATIN CAPITAL LETTER E
      C6 |  00000046 | LATIN CAPITAL LETTER F
      C7 |  00000047 | LATIN CAPITAL LETTER G
      C8 |  00000048 | LATIN CAPITAL LETTER H
      C9 |  00000049 | LATIN CAPITAL LETTER I
      CB |  000000F4 | LATIN SMALL LETTER O WITH CIRCUMFLEX
      D0 |  000000E8 | LATIN SMALL LETTER E WITH GRAVE
      D1 |  0000004A | LATIN CAPITAL LETTER J
      D2 |  0000004B | LATIN CAPITAL LETTER K
      D3 |  0000004C | LATIN CAPITAL LETTER L
      D4 |  0000004D | LATIN CAPITAL LETTER M
      D5 |  0000004E | LATIN CAPITAL LETTER N
      D6 |  0000004F | LATIN CAPITAL LETTER O
      D7 |  00000050 | LATIN CAPITAL LETTER P
      D8 |  00000051 | LATIN CAPITAL LETTER Q
      D9 |  00000052 | LATIN CAPITAL LETTER R
      DB |  000000FB | LATIN SMALL LETTER U WITH CIRCUMFLEX
      DC |  000000FC | LATIN SMALL LETTER U WITH DIAERESIS
      E0 |  000000B8 | CEDILLA
      E2 |  00000053 | LATIN CAPITAL LETTER S
      E3 |  00000054 | LATIN CAPITAL LETTER T
      E4 |  00000055 | LATIN CAPITAL LETTER U
      E5 |  00000056 | LATIN CAPITAL LETTER V
      E6 |  00000057 | LATIN CAPITAL LETTER W
      E7 |  00000058 | LATIN CAPITAL LETTER X
      E8 |  00000059 | LATIN CAPITAL LETTER Y
      E9 |  0000005A | LATIN CAPITAL LETTER Z
      EB |  000000D4 | LATIN CAPITAL LETTER O WITH CIRCUMFLEX
      F0 |  00000030 | DIGIT ZERO
      F1 |  00000031 | DIGIT ONE
      F2 |  00000032 | DIGIT TWO
      F3 |  00000033 | DIGIT THREE
      F4 |  00000034 | DIGIT FOUR
      F5 |  00000035 | DIGIT FIVE
      F6 |  00000036 | DIGIT SIX
      F7 |  00000037 | DIGIT SEVEN
      F8 |  00000038 | DIGIT EIGHT
      F9 |  00000039 | DIGIT NINE
      FB |  000000DB | LATIN CAPITAL LETTER U WITH CIRCUMFLEX
      FC |  000000DC | LATIN CAPITAL LETTER U WITH DIAERESIS
      FD |  000000D9 | LATIN CAPITAL LETTER U WITH GRAVE
      FF |  0000009F | APPLICATION PROGRAM COMMAND (APC)
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_EBCDIC_CA_FR

    $main::fatpacked{"Locale/RecodeData/EBCDIC_DK_NO.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_EBCDIC_DK_NO';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for EBCDIC-DK-NO.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::EBCDIC_DK_NO;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x009c,
      0x0009,
      0x0086,
      0x007f,
      0x0097,
      0x008d,
      0x008e,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x009d,
      0x0085,
      0x0008,
      0x0087,
      0x0018,
      0x0019,
      0x0092,
      0x008f,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0080,
      0x0081,
      0x0082,
      0x0083,
      0x0084,
      0x000a,
      0x0017,
      0x001b,
      0x0088,
      0x0089,
      0x008a,
      0x008b,
      0x008c,
      0x0005,
      0x0006,
      0x0007,
      0x0090,
      0x0091,
      0x0016,
      0x0093,
      0x0094,
      0x0095,
      0x0096,
      0x0004,
      0x0098,
      0x0099,
      0x009a,
      0x009b,
      0x0014,
      0x0015,
      0x009e,
      0x001a,
      0x0020,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0023,
      0x002e,
      0x003c,
      0x0028,
      0x002b,
      0x0021,
      0x0026,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00a4,
      0x00c5,
      0x002a,
      0x0029,
      0x003b,
      0x005e,
      0x002d,
      0x002f,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00f8,
      0x002c,
      0x0025,
      0x005f,
      0x003e,
      0x003f,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0060,
      0x003a,
      0x00c6,
      0x00d8,
      0x0027,
      0x003d,
      0x0022,
      0xfffd,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00fc,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00e6,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00e5,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x005c,
      0xfffd,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x009f,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\xc2\x9c",
      "\x09",
      "\xc2\x86",
      "\x7f",
      "\xc2\x97",
      "\xc2\x8d",
      "\xc2\x8e",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\xc2\x9d",
      "\xc2\x85",
      "\x08",
      "\xc2\x87",
      "\x18",
      "\x19",
      "\xc2\x92",
      "\xc2\x8f",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\xc2\x80",
      "\xc2\x81",
      "\xc2\x82",
      "\xc2\x83",
      "\xc2\x84",
      "\x0a",
      "\x17",
      "\x1b",
      "\xc2\x88",
      "\xc2\x89",
      "\xc2\x8a",
      "\xc2\x8b",
      "\xc2\x8c",
      "\x05",
      "\x06",
      "\x07",
      "\xc2\x90",
      "\xc2\x91",
      "\x16",
      "\xc2\x93",
      "\xc2\x94",
      "\xc2\x95",
      "\xc2\x96",
      "\x04",
      "\xc2\x98",
      "\xc2\x99",
      "\xc2\x9a",
      "\xc2\x9b",
      "\x14",
      "\x15",
      "\xc2\x9e",
      "\x1a",
      "\x20",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x23",
      "\x2e",
      "\x3c",
      "\x28",
      "\x2b",
      "\x21",
      "\x26",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc2\xa4",
      "\xc3\x85",
      "\x2a",
      "\x29",
      "\x3b",
      "\x5e",
      "\x2d",
      "\x2f",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc3\xb8",
      "\x2c",
      "\x25",
      "\x5f",
      "\x3e",
      "\x3f",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x60",
      "\x3a",
      "\xc3\x86",
      "\xc3\x98",
      "\x27",
      "\x3d",
      "\x22",
      "\xef\xbf\xbd",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc3\xbc",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc3\xa6",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc3\xa5",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x5c",
      "\xef\xbf\xbd",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc2\x9f",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x37",
      0x00000005 => "\x2d",
      0x00000006 => "\x2e",
      0x00000007 => "\x2f",
      0x00000008 => "\x16",
      0x00000009 => "\x05",
      0x0000000a => "\x25",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x3c",
      0x00000015 => "\x3d",
      0x00000016 => "\x32",
      0x00000017 => "\x26",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x3f",
      0x0000001b => "\x27",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x40",
      0x00000021 => "\x4f",
      0x00000022 => "\x7f",
      0x00000023 => "\x4a",
      0x00000025 => "\x6c",
      0x00000026 => "\x50",
      0x00000027 => "\x7d",
      0x00000028 => "\x4d",
      0x00000029 => "\x5d",
      0x0000002a => "\x5c",
      0x0000002b => "\x4e",
      0x0000002c => "\x6b",
      0x0000002d => "\x60",
      0x0000002e => "\x4b",
      0x0000002f => "\x61",
      0x00000030 => "\xf0",
      0x00000031 => "\xf1",
      0x00000032 => "\xf2",
      0x00000033 => "\xf3",
      0x00000034 => "\xf4",
      0x00000035 => "\xf5",
      0x00000036 => "\xf6",
      0x00000037 => "\xf7",
      0x00000038 => "\xf8",
      0x00000039 => "\xf9",
      0x0000003a => "\x7a",
      0x0000003b => "\x5e",
      0x0000003c => "\x4c",
      0x0000003d => "\x7e",
      0x0000003e => "\x6e",
      0x0000003f => "\x6f",
      0x00000041 => "\xc1",
      0x00000042 => "\xc2",
      0x00000043 => "\xc3",
      0x00000044 => "\xc4",
      0x00000045 => "\xc5",
      0x00000046 => "\xc6",
      0x00000047 => "\xc7",
      0x00000048 => "\xc8",
      0x00000049 => "\xc9",
      0x0000004a => "\xd1",
      0x0000004b => "\xd2",
      0x0000004c => "\xd3",
      0x0000004d => "\xd4",
      0x0000004e => "\xd5",
      0x0000004f => "\xd6",
      0x00000050 => "\xd7",
      0x00000051 => "\xd8",
      0x00000052 => "\xd9",
      0x00000053 => "\xe2",
      0x00000054 => "\xe3",
      0x00000055 => "\xe4",
      0x00000056 => "\xe5",
      0x00000057 => "\xe6",
      0x00000058 => "\xe7",
      0x00000059 => "\xe8",
      0x0000005a => "\xe9",
      0x0000005c => "\xe0",
      0x0000005e => "\x5f",
      0x0000005f => "\x6d",
      0x00000060 => "\x79",
      0x00000061 => "\x81",
      0x00000062 => "\x82",
      0x00000063 => "\x83",
      0x00000064 => "\x84",
      0x00000065 => "\x85",
      0x00000066 => "\x86",
      0x00000067 => "\x87",
      0x00000068 => "\x88",
      0x00000069 => "\x89",
      0x0000006a => "\x91",
      0x0000006b => "\x92",
      0x0000006c => "\x93",
      0x0000006d => "\x94",
      0x0000006e => "\x95",
      0x0000006f => "\x96",
      0x00000070 => "\x97",
      0x00000071 => "\x98",
      0x00000072 => "\x99",
      0x00000073 => "\xa2",
      0x00000074 => "\xa3",
      0x00000075 => "\xa4",
      0x00000076 => "\xa5",
      0x00000077 => "\xa6",
      0x00000078 => "\xa7",
      0x00000079 => "\xa8",
      0x0000007a => "\xa9",
      0x0000007f => "\x07",
      0x00000080 => "\x20",
      0x00000081 => "\x21",
      0x00000082 => "\x22",
      0x00000083 => "\x23",
      0x00000084 => "\x24",
      0x00000085 => "\x15",
      0x00000086 => "\x06",
      0x00000087 => "\x17",
      0x00000088 => "\x28",
      0x00000089 => "\x29",
      0x0000008a => "\x2a",
      0x0000008b => "\x2b",
      0x0000008c => "\x2c",
      0x0000008d => "\x09",
      0x0000008e => "\x0a",
      0x0000008f => "\x1b",
      0x00000090 => "\x30",
      0x00000091 => "\x31",
      0x00000092 => "\x1a",
      0x00000093 => "\x33",
      0x00000094 => "\x34",
      0x00000095 => "\x35",
      0x00000096 => "\x36",
      0x00000097 => "\x08",
      0x00000098 => "\x38",
      0x00000099 => "\x39",
      0x0000009a => "\x3a",
      0x0000009b => "\x3b",
      0x0000009c => "\x04",
      0x0000009d => "\x14",
      0x0000009e => "\x3e",
      0x0000009f => "\xff",
      0x000000a4 => "\x5a",
      0x000000c5 => "\x5b",
      0x000000c6 => "\x7b",
      0x000000d8 => "\x7c",
      0x000000e5 => "\xd0",
      0x000000e6 => "\xc0",
      0x000000f8 => "\x6a",
      0x000000fc => "\xa1",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::EBCDIC_DK_NO - Conversion routines for EBCDIC_DK_NO
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for EBCDIC-DK-NO.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
   repertoiremap: mnemonic,ds
    source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  0000009C | STRING TERMINATOR (ST)
      05 |  00000009 | CHARACTER TABULATION (HT)
      06 |  00000086 | START OF SELECTED AREA (SSA)
      07 |  0000007F | DELETE (DEL)
      08 |  00000097 | END OF GUARDED AREA (EPA)
      09 |  0000008D | REVERSE LINE FEED (RI)
      0A |  0000008E | SINGLE-SHIFT TWO (SS2)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  0000009D | OPERATING SYSTEM COMMAND (OSC)
      15 |  00000085 | NEXT LINE (NEL)
      16 |  00000008 | BACKSPACE (BS)
      17 |  00000087 | END OF SELECTED AREA (ESA)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  00000092 | PRIVATE USE TWO (PU2)
      1B |  0000008F | SINGLE-SHIFT THREE (SS3)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000080 | PADDING CHARACTER (PAD)
      21 |  00000081 | HIGH OCTET PRESET (HOP)
      22 |  00000082 | BREAK PERMITTED HERE (BPH)
      23 |  00000083 | NO BREAK HERE (NBH)
      24 |  00000084 | INDEX (IND)
      25 |  0000000A | LINE FEED (LF)
      26 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      27 |  0000001B | ESCAPE (ESC)
      28 |  00000088 | CHARACTER TABULATION SET (HTS)
      29 |  00000089 | CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
      2A |  0000008A | LINE TABULATION SET (VTS)
      2B |  0000008B | PARTIAL LINE FORWARD (PLD)
      2C |  0000008C | PARTIAL LINE BACKWARD (PLU)
      2D |  00000005 | ENQUIRY (ENQ)
      2E |  00000006 | ACKNOWLEDGE (ACK)
      2F |  00000007 | BELL (BEL)
      30 |  00000090 | DEVICE CONTROL STRING (DCS)
      31 |  00000091 | PRIVATE USE ONE (PU1)
      32 |  00000016 | SYNCHRONOUS IDLE (SYN)
      33 |  00000093 | SET TRANSMIT STATE (STS)
      34 |  00000094 | CANCEL CHARACTER (CCH)
      35 |  00000095 | MESSAGE WAITING (MW)
      36 |  00000096 | START OF GUARDED AREA (SPA)
      37 |  00000004 | END OF TRANSMISSION (EOT)
      38 |  00000098 | START OF STRING (SOS)
      39 |  00000099 | SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
      3A |  0000009A | SINGLE CHARACTER INTRODUCER (SCI)
      3B |  0000009B | CONTROL SEQUENCE INTRODUCER (CSI)
      3C |  00000014 | DEVICE CONTROL FOUR (DC4)
      3D |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      3E |  0000009E | PRIVACY MESSAGE (PM)
      3F |  0000001A | SUBSTITUTE (SUB)
      40 |  00000020 | SPACE
      4A |  00000023 | NUMBER SIGN
      4B |  0000002E | FULL STOP
      4C |  0000003C | LESS-THAN SIGN
      4D |  00000028 | LEFT PARENTHESIS
      4E |  0000002B | PLUS SIGN
      4F |  00000021 | EXCLAMATION MARK
      50 |  00000026 | AMPERSAND
      5A |  000000A4 | CURRENCY SIGN
      5B |  000000C5 | LATIN CAPITAL LETTER A WITH RING ABOVE
      5C |  0000002A | ASTERISK
      5D |  00000029 | RIGHT PARENTHESIS
      5E |  0000003B | SEMICOLON
      5F |  0000005E | CIRCUMFLEX ACCENT
      60 |  0000002D | HYPHEN-MINUS
      61 |  0000002F | SOLIDUS
      6A |  000000F8 | LATIN SMALL LETTER O WITH STROKE
      6B |  0000002C | COMMA
      6C |  00000025 | PERCENT SIGN
      6D |  0000005F | LOW LINE
      6E |  0000003E | GREATER-THAN SIGN
      6F |  0000003F | QUESTION MARK
      79 |  00000060 | GRAVE ACCENT
      7A |  0000003A | COLON
      7B |  000000C6 | LATIN CAPITAL LETTER AE
      7C |  000000D8 | LATIN CAPITAL LETTER O WITH STROKE
      7D |  00000027 | APOSTROPHE
      7E |  0000003D | EQUALS SIGN
      7F |  00000022 | QUOTATION MARK
      81 |  00000061 | LATIN SMALL LETTER A
      82 |  00000062 | LATIN SMALL LETTER B
      83 |  00000063 | LATIN SMALL LETTER C
      84 |  00000064 | LATIN SMALL LETTER D
      85 |  00000065 | LATIN SMALL LETTER E
      86 |  00000066 | LATIN SMALL LETTER F
      87 |  00000067 | LATIN SMALL LETTER G
      88 |  00000068 | LATIN SMALL LETTER H
      89 |  00000069 | LATIN SMALL LETTER I
      91 |  0000006A | LATIN SMALL LETTER J
      92 |  0000006B | LATIN SMALL LETTER K
      93 |  0000006C | LATIN SMALL LETTER L
      94 |  0000006D | LATIN SMALL LETTER M
      95 |  0000006E | LATIN SMALL LETTER N
      96 |  0000006F | LATIN SMALL LETTER O
      97 |  00000070 | LATIN SMALL LETTER P
      98 |  00000071 | LATIN SMALL LETTER Q
      99 |  00000072 | LATIN SMALL LETTER R
      A1 |  000000FC | LATIN SMALL LETTER U WITH DIAERESIS
      A2 |  00000073 | LATIN SMALL LETTER S
      A3 |  00000074 | LATIN SMALL LETTER T
      A4 |  00000075 | LATIN SMALL LETTER U
      A5 |  00000076 | LATIN SMALL LETTER V
      A6 |  00000077 | LATIN SMALL LETTER W
      A7 |  00000078 | LATIN SMALL LETTER X
      A8 |  00000079 | LATIN SMALL LETTER Y
      A9 |  0000007A | LATIN SMALL LETTER Z
      C0 |  000000E6 | LATIN SMALL LETTER AE
      C1 |  00000041 | LATIN CAPITAL LETTER A
      C2 |  00000042 | LATIN CAPITAL LETTER B
      C3 |  00000043 | LATIN CAPITAL LETTER C
      C4 |  00000044 | LATIN CAPITAL LETTER D
      C5 |  00000045 | LATIN CAPITAL LETTER E
      C6 |  00000046 | LATIN CAPITAL LETTER F
      C7 |  00000047 | LATIN CAPITAL LETTER G
      C8 |  00000048 | LATIN CAPITAL LETTER H
      C9 |  00000049 | LATIN CAPITAL LETTER I
      D0 |  000000E5 | LATIN SMALL LETTER A WITH RING ABOVE
      D1 |  0000004A | LATIN CAPITAL LETTER J
      D2 |  0000004B | LATIN CAPITAL LETTER K
      D3 |  0000004C | LATIN CAPITAL LETTER L
      D4 |  0000004D | LATIN CAPITAL LETTER M
      D5 |  0000004E | LATIN CAPITAL LETTER N
      D6 |  0000004F | LATIN CAPITAL LETTER O
      D7 |  00000050 | LATIN CAPITAL LETTER P
      D8 |  00000051 | LATIN CAPITAL LETTER Q
      D9 |  00000052 | LATIN CAPITAL LETTER R
      E0 |  0000005C | REVERSE SOLIDUS
      E2 |  00000053 | LATIN CAPITAL LETTER S
      E3 |  00000054 | LATIN CAPITAL LETTER T
      E4 |  00000055 | LATIN CAPITAL LETTER U
      E5 |  00000056 | LATIN CAPITAL LETTER V
      E6 |  00000057 | LATIN CAPITAL LETTER W
      E7 |  00000058 | LATIN CAPITAL LETTER X
      E8 |  00000059 | LATIN CAPITAL LETTER Y
      E9 |  0000005A | LATIN CAPITAL LETTER Z
      F0 |  00000030 | DIGIT ZERO
      F1 |  00000031 | DIGIT ONE
      F2 |  00000032 | DIGIT TWO
      F3 |  00000033 | DIGIT THREE
      F4 |  00000034 | DIGIT FOUR
      F5 |  00000035 | DIGIT FIVE
      F6 |  00000036 | DIGIT SIX
      F7 |  00000037 | DIGIT SEVEN
      F8 |  00000038 | DIGIT EIGHT
      F9 |  00000039 | DIGIT NINE
      FF |  0000009F | APPLICATION PROGRAM COMMAND (APC)
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_EBCDIC_DK_NO

    $main::fatpacked{"Locale/RecodeData/EBCDIC_DK_NO_A.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_EBCDIC_DK_NO_A';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for EBCDIC-DK-NO-A.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::EBCDIC_DK_NO_A;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x009c,
      0x0009,
      0x0086,
      0x007f,
      0x0097,
      0x008d,
      0x008e,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x009d,
      0x0085,
      0x0008,
      0x0087,
      0x0018,
      0x0019,
      0x0092,
      0x008f,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0080,
      0x0081,
      0x0082,
      0x0083,
      0x0084,
      0x000a,
      0x0017,
      0x001b,
      0x0088,
      0x0089,
      0x008a,
      0x008b,
      0x008c,
      0x0005,
      0x0006,
      0x0007,
      0x0090,
      0x0091,
      0x0016,
      0x0093,
      0x0094,
      0x0095,
      0x0096,
      0x0004,
      0x0098,
      0x0099,
      0x009a,
      0x009b,
      0x0014,
      0x0015,
      0x009e,
      0x001a,
      0x0020,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00f8,
      0x002e,
      0x003c,
      0x0028,
      0x002b,
      0x007c,
      0x0026,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00e5,
      0x00c5,
      0x002a,
      0x0029,
      0x003b,
      0x00ac,
      0x002d,
      0x002f,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00a6,
      0x002c,
      0x0025,
      0x005f,
      0x003e,
      0x003f,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x003a,
      0x00c6,
      0x00d8,
      0x0027,
      0x003d,
      0x00e6,
      0xfffd,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x009f,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\xc2\x9c",
      "\x09",
      "\xc2\x86",
      "\x7f",
      "\xc2\x97",
      "\xc2\x8d",
      "\xc2\x8e",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\xc2\x9d",
      "\xc2\x85",
      "\x08",
      "\xc2\x87",
      "\x18",
      "\x19",
      "\xc2\x92",
      "\xc2\x8f",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\xc2\x80",
      "\xc2\x81",
      "\xc2\x82",
      "\xc2\x83",
      "\xc2\x84",
      "\x0a",
      "\x17",
      "\x1b",
      "\xc2\x88",
      "\xc2\x89",
      "\xc2\x8a",
      "\xc2\x8b",
      "\xc2\x8c",
      "\x05",
      "\x06",
      "\x07",
      "\xc2\x90",
      "\xc2\x91",
      "\x16",
      "\xc2\x93",
      "\xc2\x94",
      "\xc2\x95",
      "\xc2\x96",
      "\x04",
      "\xc2\x98",
      "\xc2\x99",
      "\xc2\x9a",
      "\xc2\x9b",
      "\x14",
      "\x15",
      "\xc2\x9e",
      "\x1a",
      "\x20",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc3\xb8",
      "\x2e",
      "\x3c",
      "\x28",
      "\x2b",
      "\x7c",
      "\x26",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc3\xa5",
      "\xc3\x85",
      "\x2a",
      "\x29",
      "\x3b",
      "\xc2\xac",
      "\x2d",
      "\x2f",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc2\xa6",
      "\x2c",
      "\x25",
      "\x5f",
      "\x3e",
      "\x3f",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x3a",
      "\xc3\x86",
      "\xc3\x98",
      "\x27",
      "\x3d",
      "\xc3\xa6",
      "\xef\xbf\xbd",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc2\x9f",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x37",
      0x00000005 => "\x2d",
      0x00000006 => "\x2e",
      0x00000007 => "\x2f",
      0x00000008 => "\x16",
      0x00000009 => "\x05",
      0x0000000a => "\x25",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x3c",
      0x00000015 => "\x3d",
      0x00000016 => "\x32",
      0x00000017 => "\x26",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x3f",
      0x0000001b => "\x27",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x40",
      0x00000025 => "\x6c",
      0x00000026 => "\x50",
      0x00000027 => "\x7d",
      0x00000028 => "\x4d",
      0x00000029 => "\x5d",
      0x0000002a => "\x5c",
      0x0000002b => "\x4e",
      0x0000002c => "\x6b",
      0x0000002d => "\x60",
      0x0000002e => "\x4b",
      0x0000002f => "\x61",
      0x00000030 => "\xf0",
      0x00000031 => "\xf1",
      0x00000032 => "\xf2",
      0x00000033 => "\xf3",
      0x00000034 => "\xf4",
      0x00000035 => "\xf5",
      0x00000036 => "\xf6",
      0x00000037 => "\xf7",
      0x00000038 => "\xf8",
      0x00000039 => "\xf9",
      0x0000003a => "\x7a",
      0x0000003b => "\x5e",
      0x0000003c => "\x4c",
      0x0000003d => "\x7e",
      0x0000003e => "\x6e",
      0x0000003f => "\x6f",
      0x00000041 => "\xc1",
      0x00000042 => "\xc2",
      0x00000043 => "\xc3",
      0x00000044 => "\xc4",
      0x00000045 => "\xc5",
      0x00000046 => "\xc6",
      0x00000047 => "\xc7",
      0x00000048 => "\xc8",
      0x00000049 => "\xc9",
      0x0000004a => "\xd1",
      0x0000004b => "\xd2",
      0x0000004c => "\xd3",
      0x0000004d => "\xd4",
      0x0000004e => "\xd5",
      0x0000004f => "\xd6",
      0x00000050 => "\xd7",
      0x00000051 => "\xd8",
      0x00000052 => "\xd9",
      0x00000053 => "\xe2",
      0x00000054 => "\xe3",
      0x00000055 => "\xe4",
      0x00000056 => "\xe5",
      0x00000057 => "\xe6",
      0x00000058 => "\xe7",
      0x00000059 => "\xe8",
      0x0000005a => "\xe9",
      0x0000005f => "\x6d",
      0x00000061 => "\x81",
      0x00000062 => "\x82",
      0x00000063 => "\x83",
      0x00000064 => "\x84",
      0x00000065 => "\x85",
      0x00000066 => "\x86",
      0x00000067 => "\x87",
      0x00000068 => "\x88",
      0x00000069 => "\x89",
      0x0000006a => "\x91",
      0x0000006b => "\x92",
      0x0000006c => "\x93",
      0x0000006d => "\x94",
      0x0000006e => "\x95",
      0x0000006f => "\x96",
      0x00000070 => "\x97",
      0x00000071 => "\x98",
      0x00000072 => "\x99",
      0x00000073 => "\xa2",
      0x00000074 => "\xa3",
      0x00000075 => "\xa4",
      0x00000076 => "\xa5",
      0x00000077 => "\xa6",
      0x00000078 => "\xa7",
      0x00000079 => "\xa8",
      0x0000007a => "\xa9",
      0x0000007c => "\x4f",
      0x0000007f => "\x07",
      0x00000080 => "\x20",
      0x00000081 => "\x21",
      0x00000082 => "\x22",
      0x00000083 => "\x23",
      0x00000084 => "\x24",
      0x00000085 => "\x15",
      0x00000086 => "\x06",
      0x00000087 => "\x17",
      0x00000088 => "\x28",
      0x00000089 => "\x29",
      0x0000008a => "\x2a",
      0x0000008b => "\x2b",
      0x0000008c => "\x2c",
      0x0000008d => "\x09",
      0x0000008e => "\x0a",
      0x0000008f => "\x1b",
      0x00000090 => "\x30",
      0x00000091 => "\x31",
      0x00000092 => "\x1a",
      0x00000093 => "\x33",
      0x00000094 => "\x34",
      0x00000095 => "\x35",
      0x00000096 => "\x36",
      0x00000097 => "\x08",
      0x00000098 => "\x38",
      0x00000099 => "\x39",
      0x0000009a => "\x3a",
      0x0000009b => "\x3b",
      0x0000009c => "\x04",
      0x0000009d => "\x14",
      0x0000009e => "\x3e",
      0x0000009f => "\xff",
      0x000000a6 => "\x6a",
      0x000000ac => "\x5f",
      0x000000c5 => "\x5b",
      0x000000c6 => "\x7b",
      0x000000d8 => "\x7c",
      0x000000e5 => "\x5a",
      0x000000e6 => "\x7f",
      0x000000f8 => "\x4a",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::EBCDIC_DK_NO_A - Conversion routines for EBCDIC_DK_NO_A
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for EBCDIC-DK-NO-A.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  0000009C | STRING TERMINATOR (ST)
      05 |  00000009 | CHARACTER TABULATION (HT)
      06 |  00000086 | START OF SELECTED AREA (SSA)
      07 |  0000007F | DELETE (DEL)
      08 |  00000097 | END OF GUARDED AREA (EPA)
      09 |  0000008D | REVERSE LINE FEED (RI)
      0A |  0000008E | SINGLE-SHIFT TWO (SS2)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  0000009D | OPERATING SYSTEM COMMAND (OSC)
      15 |  00000085 | NEXT LINE (NEL)
      16 |  00000008 | BACKSPACE (BS)
      17 |  00000087 | END OF SELECTED AREA (ESA)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  00000092 | PRIVATE USE TWO (PU2)
      1B |  0000008F | SINGLE-SHIFT THREE (SS3)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000080 | PADDING CHARACTER (PAD)
      21 |  00000081 | HIGH OCTET PRESET (HOP)
      22 |  00000082 | BREAK PERMITTED HERE (BPH)
      23 |  00000083 | NO BREAK HERE (NBH)
      24 |  00000084 | INDEX (IND)
      25 |  0000000A | LINE FEED (LF)
      26 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      27 |  0000001B | ESCAPE (ESC)
      28 |  00000088 | CHARACTER TABULATION SET (HTS)
      29 |  00000089 | CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
      2A |  0000008A | LINE TABULATION SET (VTS)
      2B |  0000008B | PARTIAL LINE FORWARD (PLD)
      2C |  0000008C | PARTIAL LINE BACKWARD (PLU)
      2D |  00000005 | ENQUIRY (ENQ)
      2E |  00000006 | ACKNOWLEDGE (ACK)
      2F |  00000007 | BELL (BEL)
      30 |  00000090 | DEVICE CONTROL STRING (DCS)
      31 |  00000091 | PRIVATE USE ONE (PU1)
      32 |  00000016 | SYNCHRONOUS IDLE (SYN)
      33 |  00000093 | SET TRANSMIT STATE (STS)
      34 |  00000094 | CANCEL CHARACTER (CCH)
      35 |  00000095 | MESSAGE WAITING (MW)
      36 |  00000096 | START OF GUARDED AREA (SPA)
      37 |  00000004 | END OF TRANSMISSION (EOT)
      38 |  00000098 | START OF STRING (SOS)
      39 |  00000099 | SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
      3A |  0000009A | SINGLE CHARACTER INTRODUCER (SCI)
      3B |  0000009B | CONTROL SEQUENCE INTRODUCER (CSI)
      3C |  00000014 | DEVICE CONTROL FOUR (DC4)
      3D |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      3E |  0000009E | PRIVACY MESSAGE (PM)
      3F |  0000001A | SUBSTITUTE (SUB)
      40 |  00000020 | SPACE
      4A |  000000F8 | LATIN SMALL LETTER O WITH STROKE
      4B |  0000002E | FULL STOP
      4C |  0000003C | LESS-THAN SIGN
      4D |  00000028 | LEFT PARENTHESIS
      4E |  0000002B | PLUS SIGN
      4F |  0000007C | VERTICAL LINE
      50 |  00000026 | AMPERSAND
      5A |  000000E5 | LATIN SMALL LETTER A WITH RING ABOVE
      5B |  000000C5 | LATIN CAPITAL LETTER A WITH RING ABOVE
      5C |  0000002A | ASTERISK
      5D |  00000029 | RIGHT PARENTHESIS
      5E |  0000003B | SEMICOLON
      5F |  000000AC | NOT SIGN
      60 |  0000002D | HYPHEN-MINUS
      61 |  0000002F | SOLIDUS
      6A |  000000A6 | BROKEN BAR
      6B |  0000002C | COMMA
      6C |  00000025 | PERCENT SIGN
      6D |  0000005F | LOW LINE
      6E |  0000003E | GREATER-THAN SIGN
      6F |  0000003F | QUESTION MARK
      7A |  0000003A | COLON
      7B |  000000C6 | LATIN CAPITAL LETTER AE
      7C |  000000D8 | LATIN CAPITAL LETTER O WITH STROKE
      7D |  00000027 | APOSTROPHE
      7E |  0000003D | EQUALS SIGN
      7F |  000000E6 | LATIN SMALL LETTER AE
      81 |  00000061 | LATIN SMALL LETTER A
      82 |  00000062 | LATIN SMALL LETTER B
      83 |  00000063 | LATIN SMALL LETTER C
      84 |  00000064 | LATIN SMALL LETTER D
      85 |  00000065 | LATIN SMALL LETTER E
      86 |  00000066 | LATIN SMALL LETTER F
      87 |  00000067 | LATIN SMALL LETTER G
      88 |  00000068 | LATIN SMALL LETTER H
      89 |  00000069 | LATIN SMALL LETTER I
      91 |  0000006A | LATIN SMALL LETTER J
      92 |  0000006B | LATIN SMALL LETTER K
      93 |  0000006C | LATIN SMALL LETTER L
      94 |  0000006D | LATIN SMALL LETTER M
      95 |  0000006E | LATIN SMALL LETTER N
      96 |  0000006F | LATIN SMALL LETTER O
      97 |  00000070 | LATIN SMALL LETTER P
      98 |  00000071 | LATIN SMALL LETTER Q
      99 |  00000072 | LATIN SMALL LETTER R
      A2 |  00000073 | LATIN SMALL LETTER S
      A3 |  00000074 | LATIN SMALL LETTER T
      A4 |  00000075 | LATIN SMALL LETTER U
      A5 |  00000076 | LATIN SMALL LETTER V
      A6 |  00000077 | LATIN SMALL LETTER W
      A7 |  00000078 | LATIN SMALL LETTER X
      A8 |  00000079 | LATIN SMALL LETTER Y
      A9 |  0000007A | LATIN SMALL LETTER Z
      C1 |  00000041 | LATIN CAPITAL LETTER A
      C2 |  00000042 | LATIN CAPITAL LETTER B
      C3 |  00000043 | LATIN CAPITAL LETTER C
      C4 |  00000044 | LATIN CAPITAL LETTER D
      C5 |  00000045 | LATIN CAPITAL LETTER E
      C6 |  00000046 | LATIN CAPITAL LETTER F
      C7 |  00000047 | LATIN CAPITAL LETTER G
      C8 |  00000048 | LATIN CAPITAL LETTER H
      C9 |  00000049 | LATIN CAPITAL LETTER I
      D1 |  0000004A | LATIN CAPITAL LETTER J
      D2 |  0000004B | LATIN CAPITAL LETTER K
      D3 |  0000004C | LATIN CAPITAL LETTER L
      D4 |  0000004D | LATIN CAPITAL LETTER M
      D5 |  0000004E | LATIN CAPITAL LETTER N
      D6 |  0000004F | LATIN CAPITAL LETTER O
      D7 |  00000050 | LATIN CAPITAL LETTER P
      D8 |  00000051 | LATIN CAPITAL LETTER Q
      D9 |  00000052 | LATIN CAPITAL LETTER R
      E2 |  00000053 | LATIN CAPITAL LETTER S
      E3 |  00000054 | LATIN CAPITAL LETTER T
      E4 |  00000055 | LATIN CAPITAL LETTER U
      E5 |  00000056 | LATIN CAPITAL LETTER V
      E6 |  00000057 | LATIN CAPITAL LETTER W
      E7 |  00000058 | LATIN CAPITAL LETTER X
      E8 |  00000059 | LATIN CAPITAL LETTER Y
      E9 |  0000005A | LATIN CAPITAL LETTER Z
      F0 |  00000030 | DIGIT ZERO
      F1 |  00000031 | DIGIT ONE
      F2 |  00000032 | DIGIT TWO
      F3 |  00000033 | DIGIT THREE
      F4 |  00000034 | DIGIT FOUR
      F5 |  00000035 | DIGIT FIVE
      F6 |  00000036 | DIGIT SIX
      F7 |  00000037 | DIGIT SEVEN
      F8 |  00000038 | DIGIT EIGHT
      F9 |  00000039 | DIGIT NINE
      FF |  0000009F | APPLICATION PROGRAM COMMAND (APC)
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_EBCDIC_DK_NO_A

    $main::fatpacked{"Locale/RecodeData/EBCDIC_ES.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_EBCDIC_ES';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for EBCDIC-ES.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::EBCDIC_ES;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x009c,
      0x0009,
      0x0086,
      0x007f,
      0x0097,
      0x008d,
      0x008e,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x009d,
      0x0085,
      0x0008,
      0x0087,
      0x0018,
      0x0019,
      0x0092,
      0x008f,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0080,
      0x0081,
      0x0082,
      0x0083,
      0x0084,
      0x000a,
      0x0017,
      0x001b,
      0x0088,
      0x0089,
      0x008a,
      0x008b,
      0x008c,
      0x0005,
      0x0006,
      0x0007,
      0x0090,
      0x0091,
      0x0016,
      0x0093,
      0x0094,
      0x0095,
      0x0096,
      0x0004,
      0x0098,
      0x0099,
      0x009a,
      0x009b,
      0x0014,
      0x0015,
      0x009e,
      0x001a,
      0x0020,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00a2,
      0x002e,
      0x003c,
      0x0028,
      0x002b,
      0x007c,
      0x0026,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0021,
      0x20a7,
      0x002a,
      0x0029,
      0x003b,
      0x00ac,
      0x002d,
      0x002f,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00f1,
      0x002c,
      0x0025,
      0x005f,
      0x003e,
      0x003f,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0060,
      0x003a,
      0x00d1,
      0x0040,
      0x0027,
      0x003d,
      0x0022,
      0xfffd,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00a8,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x007b,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x007d,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x005c,
      0xfffd,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x009f,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\xc2\x9c",
      "\x09",
      "\xc2\x86",
      "\x7f",
      "\xc2\x97",
      "\xc2\x8d",
      "\xc2\x8e",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\xc2\x9d",
      "\xc2\x85",
      "\x08",
      "\xc2\x87",
      "\x18",
      "\x19",
      "\xc2\x92",
      "\xc2\x8f",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\xc2\x80",
      "\xc2\x81",
      "\xc2\x82",
      "\xc2\x83",
      "\xc2\x84",
      "\x0a",
      "\x17",
      "\x1b",
      "\xc2\x88",
      "\xc2\x89",
      "\xc2\x8a",
      "\xc2\x8b",
      "\xc2\x8c",
      "\x05",
      "\x06",
      "\x07",
      "\xc2\x90",
      "\xc2\x91",
      "\x16",
      "\xc2\x93",
      "\xc2\x94",
      "\xc2\x95",
      "\xc2\x96",
      "\x04",
      "\xc2\x98",
      "\xc2\x99",
      "\xc2\x9a",
      "\xc2\x9b",
      "\x14",
      "\x15",
      "\xc2\x9e",
      "\x1a",
      "\x20",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc2\xa2",
      "\x2e",
      "\x3c",
      "\x28",
      "\x2b",
      "\x7c",
      "\x26",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x21",
      "\xe2\x82\xa7",
      "\x2a",
      "\x29",
      "\x3b",
      "\xc2\xac",
      "\x2d",
      "\x2f",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc3\xb1",
      "\x2c",
      "\x25",
      "\x5f",
      "\x3e",
      "\x3f",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x60",
      "\x3a",
      "\xc3\x91",
      "\x40",
      "\x27",
      "\x3d",
      "\x22",
      "\xef\xbf\xbd",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc2\xa8",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x7b",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x7d",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x5c",
      "\xef\xbf\xbd",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc2\x9f",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x37",
      0x00000005 => "\x2d",
      0x00000006 => "\x2e",
      0x00000007 => "\x2f",
      0x00000008 => "\x16",
      0x00000009 => "\x05",
      0x0000000a => "\x25",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x3c",
      0x00000015 => "\x3d",
      0x00000016 => "\x32",
      0x00000017 => "\x26",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x3f",
      0x0000001b => "\x27",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x40",
      0x00000021 => "\x5a",
      0x00000022 => "\x7f",
      0x00000025 => "\x6c",
      0x00000026 => "\x50",
      0x00000027 => "\x7d",
      0x00000028 => "\x4d",
      0x00000029 => "\x5d",
      0x0000002a => "\x5c",
      0x0000002b => "\x4e",
      0x0000002c => "\x6b",
      0x0000002d => "\x60",
      0x0000002e => "\x4b",
      0x0000002f => "\x61",
      0x00000030 => "\xf0",
      0x00000031 => "\xf1",
      0x00000032 => "\xf2",
      0x00000033 => "\xf3",
      0x00000034 => "\xf4",
      0x00000035 => "\xf5",
      0x00000036 => "\xf6",
      0x00000037 => "\xf7",
      0x00000038 => "\xf8",
      0x00000039 => "\xf9",
      0x0000003a => "\x7a",
      0x0000003b => "\x5e",
      0x0000003c => "\x4c",
      0x0000003d => "\x7e",
      0x0000003e => "\x6e",
      0x0000003f => "\x6f",
      0x00000040 => "\x7c",
      0x00000041 => "\xc1",
      0x00000042 => "\xc2",
      0x00000043 => "\xc3",
      0x00000044 => "\xc4",
      0x00000045 => "\xc5",
      0x00000046 => "\xc6",
      0x00000047 => "\xc7",
      0x00000048 => "\xc8",
      0x00000049 => "\xc9",
      0x0000004a => "\xd1",
      0x0000004b => "\xd2",
      0x0000004c => "\xd3",
      0x0000004d => "\xd4",
      0x0000004e => "\xd5",
      0x0000004f => "\xd6",
      0x00000050 => "\xd7",
      0x00000051 => "\xd8",
      0x00000052 => "\xd9",
      0x00000053 => "\xe2",
      0x00000054 => "\xe3",
      0x00000055 => "\xe4",
      0x00000056 => "\xe5",
      0x00000057 => "\xe6",
      0x00000058 => "\xe7",
      0x00000059 => "\xe8",
      0x0000005a => "\xe9",
      0x0000005c => "\xe0",
      0x0000005f => "\x6d",
      0x00000060 => "\x79",
      0x00000061 => "\x81",
      0x00000062 => "\x82",
      0x00000063 => "\x83",
      0x00000064 => "\x84",
      0x00000065 => "\x85",
      0x00000066 => "\x86",
      0x00000067 => "\x87",
      0x00000068 => "\x88",
      0x00000069 => "\x89",
      0x0000006a => "\x91",
      0x0000006b => "\x92",
      0x0000006c => "\x93",
      0x0000006d => "\x94",
      0x0000006e => "\x95",
      0x0000006f => "\x96",
      0x00000070 => "\x97",
      0x00000071 => "\x98",
      0x00000072 => "\x99",
      0x00000073 => "\xa2",
      0x00000074 => "\xa3",
      0x00000075 => "\xa4",
      0x00000076 => "\xa5",
      0x00000077 => "\xa6",
      0x00000078 => "\xa7",
      0x00000079 => "\xa8",
      0x0000007a => "\xa9",
      0x0000007b => "\xc0",
      0x0000007c => "\x4f",
      0x0000007d => "\xd0",
      0x0000007f => "\x07",
      0x00000080 => "\x20",
      0x00000081 => "\x21",
      0x00000082 => "\x22",
      0x00000083 => "\x23",
      0x00000084 => "\x24",
      0x00000085 => "\x15",
      0x00000086 => "\x06",
      0x00000087 => "\x17",
      0x00000088 => "\x28",
      0x00000089 => "\x29",
      0x0000008a => "\x2a",
      0x0000008b => "\x2b",
      0x0000008c => "\x2c",
      0x0000008d => "\x09",
      0x0000008e => "\x0a",
      0x0000008f => "\x1b",
      0x00000090 => "\x30",
      0x00000091 => "\x31",
      0x00000092 => "\x1a",
      0x00000093 => "\x33",
      0x00000094 => "\x34",
      0x00000095 => "\x35",
      0x00000096 => "\x36",
      0x00000097 => "\x08",
      0x00000098 => "\x38",
      0x00000099 => "\x39",
      0x0000009a => "\x3a",
      0x0000009b => "\x3b",
      0x0000009c => "\x04",
      0x0000009d => "\x14",
      0x0000009e => "\x3e",
      0x0000009f => "\xff",
      0x000000a2 => "\x4a",
      0x000000a8 => "\xa1",
      0x000000ac => "\x5f",
      0x000000d1 => "\x7b",
      0x000000f1 => "\x6a",
      0x000020a7 => "\x5b",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::EBCDIC_ES - Conversion routines for EBCDIC_ES
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for EBCDIC-ES.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  0000009C | STRING TERMINATOR (ST)
      05 |  00000009 | CHARACTER TABULATION (HT)
      06 |  00000086 | START OF SELECTED AREA (SSA)
      07 |  0000007F | DELETE (DEL)
      08 |  00000097 | END OF GUARDED AREA (EPA)
      09 |  0000008D | REVERSE LINE FEED (RI)
      0A |  0000008E | SINGLE-SHIFT TWO (SS2)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  0000009D | OPERATING SYSTEM COMMAND (OSC)
      15 |  00000085 | NEXT LINE (NEL)
      16 |  00000008 | BACKSPACE (BS)
      17 |  00000087 | END OF SELECTED AREA (ESA)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  00000092 | PRIVATE USE TWO (PU2)
      1B |  0000008F | SINGLE-SHIFT THREE (SS3)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000080 | PADDING CHARACTER (PAD)
      21 |  00000081 | HIGH OCTET PRESET (HOP)
      22 |  00000082 | BREAK PERMITTED HERE (BPH)
      23 |  00000083 | NO BREAK HERE (NBH)
      24 |  00000084 | INDEX (IND)
      25 |  0000000A | LINE FEED (LF)
      26 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      27 |  0000001B | ESCAPE (ESC)
      28 |  00000088 | CHARACTER TABULATION SET (HTS)
      29 |  00000089 | CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
      2A |  0000008A | LINE TABULATION SET (VTS)
      2B |  0000008B | PARTIAL LINE FORWARD (PLD)
      2C |  0000008C | PARTIAL LINE BACKWARD (PLU)
      2D |  00000005 | ENQUIRY (ENQ)
      2E |  00000006 | ACKNOWLEDGE (ACK)
      2F |  00000007 | BELL (BEL)
      30 |  00000090 | DEVICE CONTROL STRING (DCS)
      31 |  00000091 | PRIVATE USE ONE (PU1)
      32 |  00000016 | SYNCHRONOUS IDLE (SYN)
      33 |  00000093 | SET TRANSMIT STATE (STS)
      34 |  00000094 | CANCEL CHARACTER (CCH)
      35 |  00000095 | MESSAGE WAITING (MW)
      36 |  00000096 | START OF GUARDED AREA (SPA)
      37 |  00000004 | END OF TRANSMISSION (EOT)
      38 |  00000098 | START OF STRING (SOS)
      39 |  00000099 | SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
      3A |  0000009A | SINGLE CHARACTER INTRODUCER (SCI)
      3B |  0000009B | CONTROL SEQUENCE INTRODUCER (CSI)
      3C |  00000014 | DEVICE CONTROL FOUR (DC4)
      3D |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      3E |  0000009E | PRIVACY MESSAGE (PM)
      3F |  0000001A | SUBSTITUTE (SUB)
      40 |  00000020 | SPACE
      4A |  000000A2 | CENT SIGN
      4B |  0000002E | FULL STOP
      4C |  0000003C | LESS-THAN SIGN
      4D |  00000028 | LEFT PARENTHESIS
      4E |  0000002B | PLUS SIGN
      4F |  0000007C | VERTICAL LINE
      50 |  00000026 | AMPERSAND
      5A |  00000021 | EXCLAMATION MARK
      5B |  000020A7 | PESETA SIGN
      5C |  0000002A | ASTERISK
      5D |  00000029 | RIGHT PARENTHESIS
      5E |  0000003B | SEMICOLON
      5F |  000000AC | NOT SIGN
      60 |  0000002D | HYPHEN-MINUS
      61 |  0000002F | SOLIDUS
      6A |  000000F1 | LATIN SMALL LETTER N WITH TILDE
      6B |  0000002C | COMMA
      6C |  00000025 | PERCENT SIGN
      6D |  0000005F | LOW LINE
      6E |  0000003E | GREATER-THAN SIGN
      6F |  0000003F | QUESTION MARK
      79 |  00000060 | GRAVE ACCENT
      7A |  0000003A | COLON
      7B |  000000D1 | LATIN CAPITAL LETTER N WITH TILDE
      7C |  00000040 | COMMERCIAL AT
      7D |  00000027 | APOSTROPHE
      7E |  0000003D | EQUALS SIGN
      7F |  00000022 | QUOTATION MARK
      81 |  00000061 | LATIN SMALL LETTER A
      82 |  00000062 | LATIN SMALL LETTER B
      83 |  00000063 | LATIN SMALL LETTER C
      84 |  00000064 | LATIN SMALL LETTER D
      85 |  00000065 | LATIN SMALL LETTER E
      86 |  00000066 | LATIN SMALL LETTER F
      87 |  00000067 | LATIN SMALL LETTER G
      88 |  00000068 | LATIN SMALL LETTER H
      89 |  00000069 | LATIN SMALL LETTER I
      91 |  0000006A | LATIN SMALL LETTER J
      92 |  0000006B | LATIN SMALL LETTER K
      93 |  0000006C | LATIN SMALL LETTER L
      94 |  0000006D | LATIN SMALL LETTER M
      95 |  0000006E | LATIN SMALL LETTER N
      96 |  0000006F | LATIN SMALL LETTER O
      97 |  00000070 | LATIN SMALL LETTER P
      98 |  00000071 | LATIN SMALL LETTER Q
      99 |  00000072 | LATIN SMALL LETTER R
      A1 |  000000A8 | DIAERESIS
      A2 |  00000073 | LATIN SMALL LETTER S
      A3 |  00000074 | LATIN SMALL LETTER T
      A4 |  00000075 | LATIN SMALL LETTER U
      A5 |  00000076 | LATIN SMALL LETTER V
      A6 |  00000077 | LATIN SMALL LETTER W
      A7 |  00000078 | LATIN SMALL LETTER X
      A8 |  00000079 | LATIN SMALL LETTER Y
      A9 |  0000007A | LATIN SMALL LETTER Z
      C0 |  0000007B | LEFT CURLY BRACKET
      C1 |  00000041 | LATIN CAPITAL LETTER A
      C2 |  00000042 | LATIN CAPITAL LETTER B
      C3 |  00000043 | LATIN CAPITAL LETTER C
      C4 |  00000044 | LATIN CAPITAL LETTER D
      C5 |  00000045 | LATIN CAPITAL LETTER E
      C6 |  00000046 | LATIN CAPITAL LETTER F
      C7 |  00000047 | LATIN CAPITAL LETTER G
      C8 |  00000048 | LATIN CAPITAL LETTER H
      C9 |  00000049 | LATIN CAPITAL LETTER I
      D0 |  0000007D | RIGHT CURLY BRACKET
      D1 |  0000004A | LATIN CAPITAL LETTER J
      D2 |  0000004B | LATIN CAPITAL LETTER K
      D3 |  0000004C | LATIN CAPITAL LETTER L
      D4 |  0000004D | LATIN CAPITAL LETTER M
      D5 |  0000004E | LATIN CAPITAL LETTER N
      D6 |  0000004F | LATIN CAPITAL LETTER O
      D7 |  00000050 | LATIN CAPITAL LETTER P
      D8 |  00000051 | LATIN CAPITAL LETTER Q
      D9 |  00000052 | LATIN CAPITAL LETTER R
      E0 |  0000005C | REVERSE SOLIDUS
      E2 |  00000053 | LATIN CAPITAL LETTER S
      E3 |  00000054 | LATIN CAPITAL LETTER T
      E4 |  00000055 | LATIN CAPITAL LETTER U
      E5 |  00000056 | LATIN CAPITAL LETTER V
      E6 |  00000057 | LATIN CAPITAL LETTER W
      E7 |  00000058 | LATIN CAPITAL LETTER X
      E8 |  00000059 | LATIN CAPITAL LETTER Y
      E9 |  0000005A | LATIN CAPITAL LETTER Z
      F0 |  00000030 | DIGIT ZERO
      F1 |  00000031 | DIGIT ONE
      F2 |  00000032 | DIGIT TWO
      F3 |  00000033 | DIGIT THREE
      F4 |  00000034 | DIGIT FOUR
      F5 |  00000035 | DIGIT FIVE
      F6 |  00000036 | DIGIT SIX
      F7 |  00000037 | DIGIT SEVEN
      F8 |  00000038 | DIGIT EIGHT
      F9 |  00000039 | DIGIT NINE
      FF |  0000009F | APPLICATION PROGRAM COMMAND (APC)
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_EBCDIC_ES

    $main::fatpacked{"Locale/RecodeData/EBCDIC_ES_A.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_EBCDIC_ES_A';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for EBCDIC-ES-A.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::EBCDIC_ES_A;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x009c,
      0x0009,
      0x0086,
      0x007f,
      0x0097,
      0x008d,
      0x008e,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x009d,
      0x0085,
      0x0008,
      0x0087,
      0x0018,
      0x0019,
      0x0092,
      0x008f,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0080,
      0x0081,
      0x0082,
      0x0083,
      0x0084,
      0x000a,
      0x0017,
      0x001b,
      0x0088,
      0x0089,
      0x008a,
      0x008b,
      0x008c,
      0x0005,
      0x0006,
      0x0007,
      0x0090,
      0x0091,
      0x0016,
      0x0093,
      0x0094,
      0x0095,
      0x0096,
      0x0004,
      0x0098,
      0x0099,
      0x009a,
      0x009b,
      0x0014,
      0x0015,
      0x009e,
      0x001a,
      0x0020,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00a2,
      0x002e,
      0x003c,
      0x0028,
      0x002b,
      0x007c,
      0x0026,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0021,
      0x20a7,
      0x002a,
      0x0029,
      0x003b,
      0x00ac,
      0x002d,
      0x002f,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00a6,
      0x002c,
      0x0025,
      0x005f,
      0x003e,
      0x003f,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x003a,
      0x00d1,
      0x0040,
      0x0027,
      0x003d,
      0x00f1,
      0xfffd,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x009f,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\xc2\x9c",
      "\x09",
      "\xc2\x86",
      "\x7f",
      "\xc2\x97",
      "\xc2\x8d",
      "\xc2\x8e",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\xc2\x9d",
      "\xc2\x85",
      "\x08",
      "\xc2\x87",
      "\x18",
      "\x19",
      "\xc2\x92",
      "\xc2\x8f",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\xc2\x80",
      "\xc2\x81",
      "\xc2\x82",
      "\xc2\x83",
      "\xc2\x84",
      "\x0a",
      "\x17",
      "\x1b",
      "\xc2\x88",
      "\xc2\x89",
      "\xc2\x8a",
      "\xc2\x8b",
      "\xc2\x8c",
      "\x05",
      "\x06",
      "\x07",
      "\xc2\x90",
      "\xc2\x91",
      "\x16",
      "\xc2\x93",
      "\xc2\x94",
      "\xc2\x95",
      "\xc2\x96",
      "\x04",
      "\xc2\x98",
      "\xc2\x99",
      "\xc2\x9a",
      "\xc2\x9b",
      "\x14",
      "\x15",
      "\xc2\x9e",
      "\x1a",
      "\x20",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc2\xa2",
      "\x2e",
      "\x3c",
      "\x28",
      "\x2b",
      "\x7c",
      "\x26",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x21",
      "\xe2\x82\xa7",
      "\x2a",
      "\x29",
      "\x3b",
      "\xc2\xac",
      "\x2d",
      "\x2f",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc2\xa6",
      "\x2c",
      "\x25",
      "\x5f",
      "\x3e",
      "\x3f",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x3a",
      "\xc3\x91",
      "\x40",
      "\x27",
      "\x3d",
      "\xc3\xb1",
      "\xef\xbf\xbd",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc2\x9f",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x37",
      0x00000005 => "\x2d",
      0x00000006 => "\x2e",
      0x00000007 => "\x2f",
      0x00000008 => "\x16",
      0x00000009 => "\x05",
      0x0000000a => "\x25",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x3c",
      0x00000015 => "\x3d",
      0x00000016 => "\x32",
      0x00000017 => "\x26",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x3f",
      0x0000001b => "\x27",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x40",
      0x00000021 => "\x5a",
      0x00000025 => "\x6c",
      0x00000026 => "\x50",
      0x00000027 => "\x7d",
      0x00000028 => "\x4d",
      0x00000029 => "\x5d",
      0x0000002a => "\x5c",
      0x0000002b => "\x4e",
      0x0000002c => "\x6b",
      0x0000002d => "\x60",
      0x0000002e => "\x4b",
      0x0000002f => "\x61",
      0x00000030 => "\xf0",
      0x00000031 => "\xf1",
      0x00000032 => "\xf2",
      0x00000033 => "\xf3",
      0x00000034 => "\xf4",
      0x00000035 => "\xf5",
      0x00000036 => "\xf6",
      0x00000037 => "\xf7",
      0x00000038 => "\xf8",
      0x00000039 => "\xf9",
      0x0000003a => "\x7a",
      0x0000003b => "\x5e",
      0x0000003c => "\x4c",
      0x0000003d => "\x7e",
      0x0000003e => "\x6e",
      0x0000003f => "\x6f",
      0x00000040 => "\x7c",
      0x00000041 => "\xc1",
      0x00000042 => "\xc2",
      0x00000043 => "\xc3",
      0x00000044 => "\xc4",
      0x00000045 => "\xc5",
      0x00000046 => "\xc6",
      0x00000047 => "\xc7",
      0x00000048 => "\xc8",
      0x00000049 => "\xc9",
      0x0000004a => "\xd1",
      0x0000004b => "\xd2",
      0x0000004c => "\xd3",
      0x0000004d => "\xd4",
      0x0000004e => "\xd5",
      0x0000004f => "\xd6",
      0x00000050 => "\xd7",
      0x00000051 => "\xd8",
      0x00000052 => "\xd9",
      0x00000053 => "\xe2",
      0x00000054 => "\xe3",
      0x00000055 => "\xe4",
      0x00000056 => "\xe5",
      0x00000057 => "\xe6",
      0x00000058 => "\xe7",
      0x00000059 => "\xe8",
      0x0000005a => "\xe9",
      0x0000005f => "\x6d",
      0x00000061 => "\x81",
      0x00000062 => "\x82",
      0x00000063 => "\x83",
      0x00000064 => "\x84",
      0x00000065 => "\x85",
      0x00000066 => "\x86",
      0x00000067 => "\x87",
      0x00000068 => "\x88",
      0x00000069 => "\x89",
      0x0000006a => "\x91",
      0x0000006b => "\x92",
      0x0000006c => "\x93",
      0x0000006d => "\x94",
      0x0000006e => "\x95",
      0x0000006f => "\x96",
      0x00000070 => "\x97",
      0x00000071 => "\x98",
      0x00000072 => "\x99",
      0x00000073 => "\xa2",
      0x00000074 => "\xa3",
      0x00000075 => "\xa4",
      0x00000076 => "\xa5",
      0x00000077 => "\xa6",
      0x00000078 => "\xa7",
      0x00000079 => "\xa8",
      0x0000007a => "\xa9",
      0x0000007c => "\x4f",
      0x0000007f => "\x07",
      0x00000080 => "\x20",
      0x00000081 => "\x21",
      0x00000082 => "\x22",
      0x00000083 => "\x23",
      0x00000084 => "\x24",
      0x00000085 => "\x15",
      0x00000086 => "\x06",
      0x00000087 => "\x17",
      0x00000088 => "\x28",
      0x00000089 => "\x29",
      0x0000008a => "\x2a",
      0x0000008b => "\x2b",
      0x0000008c => "\x2c",
      0x0000008d => "\x09",
      0x0000008e => "\x0a",
      0x0000008f => "\x1b",
      0x00000090 => "\x30",
      0x00000091 => "\x31",
      0x00000092 => "\x1a",
      0x00000093 => "\x33",
      0x00000094 => "\x34",
      0x00000095 => "\x35",
      0x00000096 => "\x36",
      0x00000097 => "\x08",
      0x00000098 => "\x38",
      0x00000099 => "\x39",
      0x0000009a => "\x3a",
      0x0000009b => "\x3b",
      0x0000009c => "\x04",
      0x0000009d => "\x14",
      0x0000009e => "\x3e",
      0x0000009f => "\xff",
      0x000000a2 => "\x4a",
      0x000000a6 => "\x6a",
      0x000000ac => "\x5f",
      0x000000d1 => "\x7b",
      0x000000f1 => "\x7f",
      0x000020a7 => "\x5b",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::EBCDIC_ES_A - Conversion routines for EBCDIC_ES_A
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for EBCDIC-ES-A.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  0000009C | STRING TERMINATOR (ST)
      05 |  00000009 | CHARACTER TABULATION (HT)
      06 |  00000086 | START OF SELECTED AREA (SSA)
      07 |  0000007F | DELETE (DEL)
      08 |  00000097 | END OF GUARDED AREA (EPA)
      09 |  0000008D | REVERSE LINE FEED (RI)
      0A |  0000008E | SINGLE-SHIFT TWO (SS2)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  0000009D | OPERATING SYSTEM COMMAND (OSC)
      15 |  00000085 | NEXT LINE (NEL)
      16 |  00000008 | BACKSPACE (BS)
      17 |  00000087 | END OF SELECTED AREA (ESA)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  00000092 | PRIVATE USE TWO (PU2)
      1B |  0000008F | SINGLE-SHIFT THREE (SS3)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000080 | PADDING CHARACTER (PAD)
      21 |  00000081 | HIGH OCTET PRESET (HOP)
      22 |  00000082 | BREAK PERMITTED HERE (BPH)
      23 |  00000083 | NO BREAK HERE (NBH)
      24 |  00000084 | INDEX (IND)
      25 |  0000000A | LINE FEED (LF)
      26 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      27 |  0000001B | ESCAPE (ESC)
      28 |  00000088 | CHARACTER TABULATION SET (HTS)
      29 |  00000089 | CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
      2A |  0000008A | LINE TABULATION SET (VTS)
      2B |  0000008B | PARTIAL LINE FORWARD (PLD)
      2C |  0000008C | PARTIAL LINE BACKWARD (PLU)
      2D |  00000005 | ENQUIRY (ENQ)
      2E |  00000006 | ACKNOWLEDGE (ACK)
      2F |  00000007 | BELL (BEL)
      30 |  00000090 | DEVICE CONTROL STRING (DCS)
      31 |  00000091 | PRIVATE USE ONE (PU1)
      32 |  00000016 | SYNCHRONOUS IDLE (SYN)
      33 |  00000093 | SET TRANSMIT STATE (STS)
      34 |  00000094 | CANCEL CHARACTER (CCH)
      35 |  00000095 | MESSAGE WAITING (MW)
      36 |  00000096 | START OF GUARDED AREA (SPA)
      37 |  00000004 | END OF TRANSMISSION (EOT)
      38 |  00000098 | START OF STRING (SOS)
      39 |  00000099 | SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
      3A |  0000009A | SINGLE CHARACTER INTRODUCER (SCI)
      3B |  0000009B | CONTROL SEQUENCE INTRODUCER (CSI)
      3C |  00000014 | DEVICE CONTROL FOUR (DC4)
      3D |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      3E |  0000009E | PRIVACY MESSAGE (PM)
      3F |  0000001A | SUBSTITUTE (SUB)
      40 |  00000020 | SPACE
      4A |  000000A2 | CENT SIGN
      4B |  0000002E | FULL STOP
      4C |  0000003C | LESS-THAN SIGN
      4D |  00000028 | LEFT PARENTHESIS
      4E |  0000002B | PLUS SIGN
      4F |  0000007C | VERTICAL LINE
      50 |  00000026 | AMPERSAND
      5A |  00000021 | EXCLAMATION MARK
      5B |  000020A7 | PESETA SIGN
      5C |  0000002A | ASTERISK
      5D |  00000029 | RIGHT PARENTHESIS
      5E |  0000003B | SEMICOLON
      5F |  000000AC | NOT SIGN
      60 |  0000002D | HYPHEN-MINUS
      61 |  0000002F | SOLIDUS
      6A |  000000A6 | BROKEN BAR
      6B |  0000002C | COMMA
      6C |  00000025 | PERCENT SIGN
      6D |  0000005F | LOW LINE
      6E |  0000003E | GREATER-THAN SIGN
      6F |  0000003F | QUESTION MARK
      7A |  0000003A | COLON
      7B |  000000D1 | LATIN CAPITAL LETTER N WITH TILDE
      7C |  00000040 | COMMERCIAL AT
      7D |  00000027 | APOSTROPHE
      7E |  0000003D | EQUALS SIGN
      7F |  000000F1 | LATIN SMALL LETTER N WITH TILDE
      81 |  00000061 | LATIN SMALL LETTER A
      82 |  00000062 | LATIN SMALL LETTER B
      83 |  00000063 | LATIN SMALL LETTER C
      84 |  00000064 | LATIN SMALL LETTER D
      85 |  00000065 | LATIN SMALL LETTER E
      86 |  00000066 | LATIN SMALL LETTER F
      87 |  00000067 | LATIN SMALL LETTER G
      88 |  00000068 | LATIN SMALL LETTER H
      89 |  00000069 | LATIN SMALL LETTER I
      91 |  0000006A | LATIN SMALL LETTER J
      92 |  0000006B | LATIN SMALL LETTER K
      93 |  0000006C | LATIN SMALL LETTER L
      94 |  0000006D | LATIN SMALL LETTER M
      95 |  0000006E | LATIN SMALL LETTER N
      96 |  0000006F | LATIN SMALL LETTER O
      97 |  00000070 | LATIN SMALL LETTER P
      98 |  00000071 | LATIN SMALL LETTER Q
      99 |  00000072 | LATIN SMALL LETTER R
      A2 |  00000073 | LATIN SMALL LETTER S
      A3 |  00000074 | LATIN SMALL LETTER T
      A4 |  00000075 | LATIN SMALL LETTER U
      A5 |  00000076 | LATIN SMALL LETTER V
      A6 |  00000077 | LATIN SMALL LETTER W
      A7 |  00000078 | LATIN SMALL LETTER X
      A8 |  00000079 | LATIN SMALL LETTER Y
      A9 |  0000007A | LATIN SMALL LETTER Z
      C1 |  00000041 | LATIN CAPITAL LETTER A
      C2 |  00000042 | LATIN CAPITAL LETTER B
      C3 |  00000043 | LATIN CAPITAL LETTER C
      C4 |  00000044 | LATIN CAPITAL LETTER D
      C5 |  00000045 | LATIN CAPITAL LETTER E
      C6 |  00000046 | LATIN CAPITAL LETTER F
      C7 |  00000047 | LATIN CAPITAL LETTER G
      C8 |  00000048 | LATIN CAPITAL LETTER H
      C9 |  00000049 | LATIN CAPITAL LETTER I
      D1 |  0000004A | LATIN CAPITAL LETTER J
      D2 |  0000004B | LATIN CAPITAL LETTER K
      D3 |  0000004C | LATIN CAPITAL LETTER L
      D4 |  0000004D | LATIN CAPITAL LETTER M
      D5 |  0000004E | LATIN CAPITAL LETTER N
      D6 |  0000004F | LATIN CAPITAL LETTER O
      D7 |  00000050 | LATIN CAPITAL LETTER P
      D8 |  00000051 | LATIN CAPITAL LETTER Q
      D9 |  00000052 | LATIN CAPITAL LETTER R
      E2 |  00000053 | LATIN CAPITAL LETTER S
      E3 |  00000054 | LATIN CAPITAL LETTER T
      E4 |  00000055 | LATIN CAPITAL LETTER U
      E5 |  00000056 | LATIN CAPITAL LETTER V
      E6 |  00000057 | LATIN CAPITAL LETTER W
      E7 |  00000058 | LATIN CAPITAL LETTER X
      E8 |  00000059 | LATIN CAPITAL LETTER Y
      E9 |  0000005A | LATIN CAPITAL LETTER Z
      F0 |  00000030 | DIGIT ZERO
      F1 |  00000031 | DIGIT ONE
      F2 |  00000032 | DIGIT TWO
      F3 |  00000033 | DIGIT THREE
      F4 |  00000034 | DIGIT FOUR
      F5 |  00000035 | DIGIT FIVE
      F6 |  00000036 | DIGIT SIX
      F7 |  00000037 | DIGIT SEVEN
      F8 |  00000038 | DIGIT EIGHT
      F9 |  00000039 | DIGIT NINE
      FF |  0000009F | APPLICATION PROGRAM COMMAND (APC)
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_EBCDIC_ES_A

    $main::fatpacked{"Locale/RecodeData/EBCDIC_ES_S.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_EBCDIC_ES_S';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for EBCDIC-ES-S.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::EBCDIC_ES_S;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x009c,
      0x0009,
      0x0086,
      0x007f,
      0x0097,
      0x008d,
      0x008e,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x009d,
      0x0085,
      0x0008,
      0x0087,
      0x0018,
      0x0019,
      0x0092,
      0x008f,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0080,
      0x0081,
      0x0082,
      0x0083,
      0x0084,
      0x000a,
      0x0017,
      0x001b,
      0x0088,
      0x0089,
      0x008a,
      0x008b,
      0x008c,
      0x0005,
      0x0006,
      0x0007,
      0x0090,
      0x0091,
      0x0016,
      0x0093,
      0x0094,
      0x0095,
      0x0096,
      0x0004,
      0x0098,
      0x0099,
      0x009a,
      0x009b,
      0x0014,
      0x0015,
      0x009e,
      0x001a,
      0x0020,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00a2,
      0x002e,
      0x003c,
      0x0028,
      0x002b,
      0x007c,
      0x0026,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0021,
      0x0024,
      0x002a,
      0x0029,
      0x003b,
      0x00ac,
      0x002d,
      0x002f,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00f1,
      0x002c,
      0x0025,
      0x005f,
      0x003e,
      0x003f,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0060,
      0x003a,
      0x00d1,
      0x0040,
      0x0027,
      0x003d,
      0x0022,
      0xfffd,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00a8,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x007b,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x007d,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x005c,
      0xfffd,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x009f,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\xc2\x9c",
      "\x09",
      "\xc2\x86",
      "\x7f",
      "\xc2\x97",
      "\xc2\x8d",
      "\xc2\x8e",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\xc2\x9d",
      "\xc2\x85",
      "\x08",
      "\xc2\x87",
      "\x18",
      "\x19",
      "\xc2\x92",
      "\xc2\x8f",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\xc2\x80",
      "\xc2\x81",
      "\xc2\x82",
      "\xc2\x83",
      "\xc2\x84",
      "\x0a",
      "\x17",
      "\x1b",
      "\xc2\x88",
      "\xc2\x89",
      "\xc2\x8a",
      "\xc2\x8b",
      "\xc2\x8c",
      "\x05",
      "\x06",
      "\x07",
      "\xc2\x90",
      "\xc2\x91",
      "\x16",
      "\xc2\x93",
      "\xc2\x94",
      "\xc2\x95",
      "\xc2\x96",
      "\x04",
      "\xc2\x98",
      "\xc2\x99",
      "\xc2\x9a",
      "\xc2\x9b",
      "\x14",
      "\x15",
      "\xc2\x9e",
      "\x1a",
      "\x20",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc2\xa2",
      "\x2e",
      "\x3c",
      "\x28",
      "\x2b",
      "\x7c",
      "\x26",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x21",
      "\x24",
      "\x2a",
      "\x29",
      "\x3b",
      "\xc2\xac",
      "\x2d",
      "\x2f",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc3\xb1",
      "\x2c",
      "\x25",
      "\x5f",
      "\x3e",
      "\x3f",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x60",
      "\x3a",
      "\xc3\x91",
      "\x40",
      "\x27",
      "\x3d",
      "\x22",
      "\xef\xbf\xbd",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc2\xa8",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x7b",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x7d",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x5c",
      "\xef\xbf\xbd",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc2\x9f",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x37",
      0x00000005 => "\x2d",
      0x00000006 => "\x2e",
      0x00000007 => "\x2f",
      0x00000008 => "\x16",
      0x00000009 => "\x05",
      0x0000000a => "\x25",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x3c",
      0x00000015 => "\x3d",
      0x00000016 => "\x32",
      0x00000017 => "\x26",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x3f",
      0x0000001b => "\x27",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x40",
      0x00000021 => "\x5a",
      0x00000022 => "\x7f",
      0x00000024 => "\x5b",
      0x00000025 => "\x6c",
      0x00000026 => "\x50",
      0x00000027 => "\x7d",
      0x00000028 => "\x4d",
      0x00000029 => "\x5d",
      0x0000002a => "\x5c",
      0x0000002b => "\x4e",
      0x0000002c => "\x6b",
      0x0000002d => "\x60",
      0x0000002e => "\x4b",
      0x0000002f => "\x61",
      0x00000030 => "\xf0",
      0x00000031 => "\xf1",
      0x00000032 => "\xf2",
      0x00000033 => "\xf3",
      0x00000034 => "\xf4",
      0x00000035 => "\xf5",
      0x00000036 => "\xf6",
      0x00000037 => "\xf7",
      0x00000038 => "\xf8",
      0x00000039 => "\xf9",
      0x0000003a => "\x7a",
      0x0000003b => "\x5e",
      0x0000003c => "\x4c",
      0x0000003d => "\x7e",
      0x0000003e => "\x6e",
      0x0000003f => "\x6f",
      0x00000040 => "\x7c",
      0x00000041 => "\xc1",
      0x00000042 => "\xc2",
      0x00000043 => "\xc3",
      0x00000044 => "\xc4",
      0x00000045 => "\xc5",
      0x00000046 => "\xc6",
      0x00000047 => "\xc7",
      0x00000048 => "\xc8",
      0x00000049 => "\xc9",
      0x0000004a => "\xd1",
      0x0000004b => "\xd2",
      0x0000004c => "\xd3",
      0x0000004d => "\xd4",
      0x0000004e => "\xd5",
      0x0000004f => "\xd6",
      0x00000050 => "\xd7",
      0x00000051 => "\xd8",
      0x00000052 => "\xd9",
      0x00000053 => "\xe2",
      0x00000054 => "\xe3",
      0x00000055 => "\xe4",
      0x00000056 => "\xe5",
      0x00000057 => "\xe6",
      0x00000058 => "\xe7",
      0x00000059 => "\xe8",
      0x0000005a => "\xe9",
      0x0000005c => "\xe0",
      0x0000005f => "\x6d",
      0x00000060 => "\x79",
      0x00000061 => "\x81",
      0x00000062 => "\x82",
      0x00000063 => "\x83",
      0x00000064 => "\x84",
      0x00000065 => "\x85",
      0x00000066 => "\x86",
      0x00000067 => "\x87",
      0x00000068 => "\x88",
      0x00000069 => "\x89",
      0x0000006a => "\x91",
      0x0000006b => "\x92",
      0x0000006c => "\x93",
      0x0000006d => "\x94",
      0x0000006e => "\x95",
      0x0000006f => "\x96",
      0x00000070 => "\x97",
      0x00000071 => "\x98",
      0x00000072 => "\x99",
      0x00000073 => "\xa2",
      0x00000074 => "\xa3",
      0x00000075 => "\xa4",
      0x00000076 => "\xa5",
      0x00000077 => "\xa6",
      0x00000078 => "\xa7",
      0x00000079 => "\xa8",
      0x0000007a => "\xa9",
      0x0000007b => "\xc0",
      0x0000007c => "\x4f",
      0x0000007d => "\xd0",
      0x0000007f => "\x07",
      0x00000080 => "\x20",
      0x00000081 => "\x21",
      0x00000082 => "\x22",
      0x00000083 => "\x23",
      0x00000084 => "\x24",
      0x00000085 => "\x15",
      0x00000086 => "\x06",
      0x00000087 => "\x17",
      0x00000088 => "\x28",
      0x00000089 => "\x29",
      0x0000008a => "\x2a",
      0x0000008b => "\x2b",
      0x0000008c => "\x2c",
      0x0000008d => "\x09",
      0x0000008e => "\x0a",
      0x0000008f => "\x1b",
      0x00000090 => "\x30",
      0x00000091 => "\x31",
      0x00000092 => "\x1a",
      0x00000093 => "\x33",
      0x00000094 => "\x34",
      0x00000095 => "\x35",
      0x00000096 => "\x36",
      0x00000097 => "\x08",
      0x00000098 => "\x38",
      0x00000099 => "\x39",
      0x0000009a => "\x3a",
      0x0000009b => "\x3b",
      0x0000009c => "\x04",
      0x0000009d => "\x14",
      0x0000009e => "\x3e",
      0x0000009f => "\xff",
      0x000000a2 => "\x4a",
      0x000000a8 => "\xa1",
      0x000000ac => "\x5f",
      0x000000d1 => "\x7b",
      0x000000f1 => "\x6a",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::EBCDIC_ES_S - Conversion routines for EBCDIC_ES_S
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for EBCDIC-ES-S.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  0000009C | STRING TERMINATOR (ST)
      05 |  00000009 | CHARACTER TABULATION (HT)
      06 |  00000086 | START OF SELECTED AREA (SSA)
      07 |  0000007F | DELETE (DEL)
      08 |  00000097 | END OF GUARDED AREA (EPA)
      09 |  0000008D | REVERSE LINE FEED (RI)
      0A |  0000008E | SINGLE-SHIFT TWO (SS2)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  0000009D | OPERATING SYSTEM COMMAND (OSC)
      15 |  00000085 | NEXT LINE (NEL)
      16 |  00000008 | BACKSPACE (BS)
      17 |  00000087 | END OF SELECTED AREA (ESA)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  00000092 | PRIVATE USE TWO (PU2)
      1B |  0000008F | SINGLE-SHIFT THREE (SS3)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000080 | PADDING CHARACTER (PAD)
      21 |  00000081 | HIGH OCTET PRESET (HOP)
      22 |  00000082 | BREAK PERMITTED HERE (BPH)
      23 |  00000083 | NO BREAK HERE (NBH)
      24 |  00000084 | INDEX (IND)
      25 |  0000000A | LINE FEED (LF)
      26 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      27 |  0000001B | ESCAPE (ESC)
      28 |  00000088 | CHARACTER TABULATION SET (HTS)
      29 |  00000089 | CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
      2A |  0000008A | LINE TABULATION SET (VTS)
      2B |  0000008B | PARTIAL LINE FORWARD (PLD)
      2C |  0000008C | PARTIAL LINE BACKWARD (PLU)
      2D |  00000005 | ENQUIRY (ENQ)
      2E |  00000006 | ACKNOWLEDGE (ACK)
      2F |  00000007 | BELL (BEL)
      30 |  00000090 | DEVICE CONTROL STRING (DCS)
      31 |  00000091 | PRIVATE USE ONE (PU1)
      32 |  00000016 | SYNCHRONOUS IDLE (SYN)
      33 |  00000093 | SET TRANSMIT STATE (STS)
      34 |  00000094 | CANCEL CHARACTER (CCH)
      35 |  00000095 | MESSAGE WAITING (MW)
      36 |  00000096 | START OF GUARDED AREA (SPA)
      37 |  00000004 | END OF TRANSMISSION (EOT)
      38 |  00000098 | START OF STRING (SOS)
      39 |  00000099 | SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
      3A |  0000009A | SINGLE CHARACTER INTRODUCER (SCI)
      3B |  0000009B | CONTROL SEQUENCE INTRODUCER (CSI)
      3C |  00000014 | DEVICE CONTROL FOUR (DC4)
      3D |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      3E |  0000009E | PRIVACY MESSAGE (PM)
      3F |  0000001A | SUBSTITUTE (SUB)
      40 |  00000020 | SPACE
      4A |  000000A2 | CENT SIGN
      4B |  0000002E | FULL STOP
      4C |  0000003C | LESS-THAN SIGN
      4D |  00000028 | LEFT PARENTHESIS
      4E |  0000002B | PLUS SIGN
      4F |  0000007C | VERTICAL LINE
      50 |  00000026 | AMPERSAND
      5A |  00000021 | EXCLAMATION MARK
      5B |  00000024 | DOLLAR SIGN
      5C |  0000002A | ASTERISK
      5D |  00000029 | RIGHT PARENTHESIS
      5E |  0000003B | SEMICOLON
      5F |  000000AC | NOT SIGN
      60 |  0000002D | HYPHEN-MINUS
      61 |  0000002F | SOLIDUS
      6A |  000000F1 | LATIN SMALL LETTER N WITH TILDE
      6B |  0000002C | COMMA
      6C |  00000025 | PERCENT SIGN
      6D |  0000005F | LOW LINE
      6E |  0000003E | GREATER-THAN SIGN
      6F |  0000003F | QUESTION MARK
      79 |  00000060 | GRAVE ACCENT
      7A |  0000003A | COLON
      7B |  000000D1 | LATIN CAPITAL LETTER N WITH TILDE
      7C |  00000040 | COMMERCIAL AT
      7D |  00000027 | APOSTROPHE
      7E |  0000003D | EQUALS SIGN
      7F |  00000022 | QUOTATION MARK
      81 |  00000061 | LATIN SMALL LETTER A
      82 |  00000062 | LATIN SMALL LETTER B
      83 |  00000063 | LATIN SMALL LETTER C
      84 |  00000064 | LATIN SMALL LETTER D
      85 |  00000065 | LATIN SMALL LETTER E
      86 |  00000066 | LATIN SMALL LETTER F
      87 |  00000067 | LATIN SMALL LETTER G
      88 |  00000068 | LATIN SMALL LETTER H
      89 |  00000069 | LATIN SMALL LETTER I
      91 |  0000006A | LATIN SMALL LETTER J
      92 |  0000006B | LATIN SMALL LETTER K
      93 |  0000006C | LATIN SMALL LETTER L
      94 |  0000006D | LATIN SMALL LETTER M
      95 |  0000006E | LATIN SMALL LETTER N
      96 |  0000006F | LATIN SMALL LETTER O
      97 |  00000070 | LATIN SMALL LETTER P
      98 |  00000071 | LATIN SMALL LETTER Q
      99 |  00000072 | LATIN SMALL LETTER R
      A1 |  000000A8 | DIAERESIS
      A2 |  00000073 | LATIN SMALL LETTER S
      A3 |  00000074 | LATIN SMALL LETTER T
      A4 |  00000075 | LATIN SMALL LETTER U
      A5 |  00000076 | LATIN SMALL LETTER V
      A6 |  00000077 | LATIN SMALL LETTER W
      A7 |  00000078 | LATIN SMALL LETTER X
      A8 |  00000079 | LATIN SMALL LETTER Y
      A9 |  0000007A | LATIN SMALL LETTER Z
      C0 |  0000007B | LEFT CURLY BRACKET
      C1 |  00000041 | LATIN CAPITAL LETTER A
      C2 |  00000042 | LATIN CAPITAL LETTER B
      C3 |  00000043 | LATIN CAPITAL LETTER C
      C4 |  00000044 | LATIN CAPITAL LETTER D
      C5 |  00000045 | LATIN CAPITAL LETTER E
      C6 |  00000046 | LATIN CAPITAL LETTER F
      C7 |  00000047 | LATIN CAPITAL LETTER G
      C8 |  00000048 | LATIN CAPITAL LETTER H
      C9 |  00000049 | LATIN CAPITAL LETTER I
      D0 |  0000007D | RIGHT CURLY BRACKET
      D1 |  0000004A | LATIN CAPITAL LETTER J
      D2 |  0000004B | LATIN CAPITAL LETTER K
      D3 |  0000004C | LATIN CAPITAL LETTER L
      D4 |  0000004D | LATIN CAPITAL LETTER M
      D5 |  0000004E | LATIN CAPITAL LETTER N
      D6 |  0000004F | LATIN CAPITAL LETTER O
      D7 |  00000050 | LATIN CAPITAL LETTER P
      D8 |  00000051 | LATIN CAPITAL LETTER Q
      D9 |  00000052 | LATIN CAPITAL LETTER R
      E0 |  0000005C | REVERSE SOLIDUS
      E2 |  00000053 | LATIN CAPITAL LETTER S
      E3 |  00000054 | LATIN CAPITAL LETTER T
      E4 |  00000055 | LATIN CAPITAL LETTER U
      E5 |  00000056 | LATIN CAPITAL LETTER V
      E6 |  00000057 | LATIN CAPITAL LETTER W
      E7 |  00000058 | LATIN CAPITAL LETTER X
      E8 |  00000059 | LATIN CAPITAL LETTER Y
      E9 |  0000005A | LATIN CAPITAL LETTER Z
      F0 |  00000030 | DIGIT ZERO
      F1 |  00000031 | DIGIT ONE
      F2 |  00000032 | DIGIT TWO
      F3 |  00000033 | DIGIT THREE
      F4 |  00000034 | DIGIT FOUR
      F5 |  00000035 | DIGIT FIVE
      F6 |  00000036 | DIGIT SIX
      F7 |  00000037 | DIGIT SEVEN
      F8 |  00000038 | DIGIT EIGHT
      F9 |  00000039 | DIGIT NINE
      FF |  0000009F | APPLICATION PROGRAM COMMAND (APC)
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_EBCDIC_ES_S

    $main::fatpacked{"Locale/RecodeData/EBCDIC_FI_SE.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_EBCDIC_FI_SE';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for EBCDIC-FI-SE.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::EBCDIC_FI_SE;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x009c,
      0x0009,
      0x0086,
      0x007f,
      0x0097,
      0x008d,
      0x008e,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x009d,
      0x0085,
      0x0008,
      0x0087,
      0x0018,
      0x0019,
      0x0092,
      0x008f,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0080,
      0x0081,
      0x0082,
      0x0083,
      0x0084,
      0x000a,
      0x0017,
      0x001b,
      0x0088,
      0x0089,
      0x008a,
      0x008b,
      0x008c,
      0x0005,
      0x0006,
      0x0007,
      0x0090,
      0x0091,
      0x0016,
      0x0093,
      0x0094,
      0x0095,
      0x0096,
      0x0004,
      0x0098,
      0x0099,
      0x009a,
      0x009b,
      0x0014,
      0x0015,
      0x009e,
      0x001a,
      0x0020,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00a7,
      0x002e,
      0x003c,
      0x0028,
      0x002b,
      0x0021,
      0x0026,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00a4,
      0x00c5,
      0x002a,
      0x0029,
      0x003b,
      0x005e,
      0x002d,
      0x002f,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00f6,
      0x002c,
      0x0025,
      0x005f,
      0x003e,
      0x003f,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00e9,
      0x003a,
      0x00c4,
      0x00d6,
      0x0027,
      0x003d,
      0x0022,
      0xfffd,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00fc,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00e4,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00e5,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00c9,
      0xfffd,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x009f,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\xc2\x9c",
      "\x09",
      "\xc2\x86",
      "\x7f",
      "\xc2\x97",
      "\xc2\x8d",
      "\xc2\x8e",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\xc2\x9d",
      "\xc2\x85",
      "\x08",
      "\xc2\x87",
      "\x18",
      "\x19",
      "\xc2\x92",
      "\xc2\x8f",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\xc2\x80",
      "\xc2\x81",
      "\xc2\x82",
      "\xc2\x83",
      "\xc2\x84",
      "\x0a",
      "\x17",
      "\x1b",
      "\xc2\x88",
      "\xc2\x89",
      "\xc2\x8a",
      "\xc2\x8b",
      "\xc2\x8c",
      "\x05",
      "\x06",
      "\x07",
      "\xc2\x90",
      "\xc2\x91",
      "\x16",
      "\xc2\x93",
      "\xc2\x94",
      "\xc2\x95",
      "\xc2\x96",
      "\x04",
      "\xc2\x98",
      "\xc2\x99",
      "\xc2\x9a",
      "\xc2\x9b",
      "\x14",
      "\x15",
      "\xc2\x9e",
      "\x1a",
      "\x20",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc2\xa7",
      "\x2e",
      "\x3c",
      "\x28",
      "\x2b",
      "\x21",
      "\x26",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc2\xa4",
      "\xc3\x85",
      "\x2a",
      "\x29",
      "\x3b",
      "\x5e",
      "\x2d",
      "\x2f",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc3\xb6",
      "\x2c",
      "\x25",
      "\x5f",
      "\x3e",
      "\x3f",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc3\xa9",
      "\x3a",
      "\xc3\x84",
      "\xc3\x96",
      "\x27",
      "\x3d",
      "\x22",
      "\xef\xbf\xbd",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc3\xbc",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc3\xa4",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc3\xa5",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc3\x89",
      "\xef\xbf\xbd",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc2\x9f",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x37",
      0x00000005 => "\x2d",
      0x00000006 => "\x2e",
      0x00000007 => "\x2f",
      0x00000008 => "\x16",
      0x00000009 => "\x05",
      0x0000000a => "\x25",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x3c",
      0x00000015 => "\x3d",
      0x00000016 => "\x32",
      0x00000017 => "\x26",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x3f",
      0x0000001b => "\x27",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x40",
      0x00000021 => "\x4f",
      0x00000022 => "\x7f",
      0x00000025 => "\x6c",
      0x00000026 => "\x50",
      0x00000027 => "\x7d",
      0x00000028 => "\x4d",
      0x00000029 => "\x5d",
      0x0000002a => "\x5c",
      0x0000002b => "\x4e",
      0x0000002c => "\x6b",
      0x0000002d => "\x60",
      0x0000002e => "\x4b",
      0x0000002f => "\x61",
      0x00000030 => "\xf0",
      0x00000031 => "\xf1",
      0x00000032 => "\xf2",
      0x00000033 => "\xf3",
      0x00000034 => "\xf4",
      0x00000035 => "\xf5",
      0x00000036 => "\xf6",
      0x00000037 => "\xf7",
      0x00000038 => "\xf8",
      0x00000039 => "\xf9",
      0x0000003a => "\x7a",
      0x0000003b => "\x5e",
      0x0000003c => "\x4c",
      0x0000003d => "\x7e",
      0x0000003e => "\x6e",
      0x0000003f => "\x6f",
      0x00000041 => "\xc1",
      0x00000042 => "\xc2",
      0x00000043 => "\xc3",
      0x00000044 => "\xc4",
      0x00000045 => "\xc5",
      0x00000046 => "\xc6",
      0x00000047 => "\xc7",
      0x00000048 => "\xc8",
      0x00000049 => "\xc9",
      0x0000004a => "\xd1",
      0x0000004b => "\xd2",
      0x0000004c => "\xd3",
      0x0000004d => "\xd4",
      0x0000004e => "\xd5",
      0x0000004f => "\xd6",
      0x00000050 => "\xd7",
      0x00000051 => "\xd8",
      0x00000052 => "\xd9",
      0x00000053 => "\xe2",
      0x00000054 => "\xe3",
      0x00000055 => "\xe4",
      0x00000056 => "\xe5",
      0x00000057 => "\xe6",
      0x00000058 => "\xe7",
      0x00000059 => "\xe8",
      0x0000005a => "\xe9",
      0x0000005e => "\x5f",
      0x0000005f => "\x6d",
      0x00000061 => "\x81",
      0x00000062 => "\x82",
      0x00000063 => "\x83",
      0x00000064 => "\x84",
      0x00000065 => "\x85",
      0x00000066 => "\x86",
      0x00000067 => "\x87",
      0x00000068 => "\x88",
      0x00000069 => "\x89",
      0x0000006a => "\x91",
      0x0000006b => "\x92",
      0x0000006c => "\x93",
      0x0000006d => "\x94",
      0x0000006e => "\x95",
      0x0000006f => "\x96",
      0x00000070 => "\x97",
      0x00000071 => "\x98",
      0x00000072 => "\x99",
      0x00000073 => "\xa2",
      0x00000074 => "\xa3",
      0x00000075 => "\xa4",
      0x00000076 => "\xa5",
      0x00000077 => "\xa6",
      0x00000078 => "\xa7",
      0x00000079 => "\xa8",
      0x0000007a => "\xa9",
      0x0000007f => "\x07",
      0x00000080 => "\x20",
      0x00000081 => "\x21",
      0x00000082 => "\x22",
      0x00000083 => "\x23",
      0x00000084 => "\x24",
      0x00000085 => "\x15",
      0x00000086 => "\x06",
      0x00000087 => "\x17",
      0x00000088 => "\x28",
      0x00000089 => "\x29",
      0x0000008a => "\x2a",
      0x0000008b => "\x2b",
      0x0000008c => "\x2c",
      0x0000008d => "\x09",
      0x0000008e => "\x0a",
      0x0000008f => "\x1b",
      0x00000090 => "\x30",
      0x00000091 => "\x31",
      0x00000092 => "\x1a",
      0x00000093 => "\x33",
      0x00000094 => "\x34",
      0x00000095 => "\x35",
      0x00000096 => "\x36",
      0x00000097 => "\x08",
      0x00000098 => "\x38",
      0x00000099 => "\x39",
      0x0000009a => "\x3a",
      0x0000009b => "\x3b",
      0x0000009c => "\x04",
      0x0000009d => "\x14",
      0x0000009e => "\x3e",
      0x0000009f => "\xff",
      0x000000a4 => "\x5a",
      0x000000a7 => "\x4a",
      0x000000c4 => "\x7b",
      0x000000c5 => "\x5b",
      0x000000c9 => "\xe0",
      0x000000d6 => "\x7c",
      0x000000e4 => "\xc0",
      0x000000e5 => "\xd0",
      0x000000e9 => "\x79",
      0x000000f6 => "\x6a",
      0x000000fc => "\xa1",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::EBCDIC_FI_SE - Conversion routines for EBCDIC_FI_SE
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for EBCDIC-FI-SE.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  0000009C | STRING TERMINATOR (ST)
      05 |  00000009 | CHARACTER TABULATION (HT)
      06 |  00000086 | START OF SELECTED AREA (SSA)
      07 |  0000007F | DELETE (DEL)
      08 |  00000097 | END OF GUARDED AREA (EPA)
      09 |  0000008D | REVERSE LINE FEED (RI)
      0A |  0000008E | SINGLE-SHIFT TWO (SS2)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  0000009D | OPERATING SYSTEM COMMAND (OSC)
      15 |  00000085 | NEXT LINE (NEL)
      16 |  00000008 | BACKSPACE (BS)
      17 |  00000087 | END OF SELECTED AREA (ESA)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  00000092 | PRIVATE USE TWO (PU2)
      1B |  0000008F | SINGLE-SHIFT THREE (SS3)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000080 | PADDING CHARACTER (PAD)
      21 |  00000081 | HIGH OCTET PRESET (HOP)
      22 |  00000082 | BREAK PERMITTED HERE (BPH)
      23 |  00000083 | NO BREAK HERE (NBH)
      24 |  00000084 | INDEX (IND)
      25 |  0000000A | LINE FEED (LF)
      26 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      27 |  0000001B | ESCAPE (ESC)
      28 |  00000088 | CHARACTER TABULATION SET (HTS)
      29 |  00000089 | CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
      2A |  0000008A | LINE TABULATION SET (VTS)
      2B |  0000008B | PARTIAL LINE FORWARD (PLD)
      2C |  0000008C | PARTIAL LINE BACKWARD (PLU)
      2D |  00000005 | ENQUIRY (ENQ)
      2E |  00000006 | ACKNOWLEDGE (ACK)
      2F |  00000007 | BELL (BEL)
      30 |  00000090 | DEVICE CONTROL STRING (DCS)
      31 |  00000091 | PRIVATE USE ONE (PU1)
      32 |  00000016 | SYNCHRONOUS IDLE (SYN)
      33 |  00000093 | SET TRANSMIT STATE (STS)
      34 |  00000094 | CANCEL CHARACTER (CCH)
      35 |  00000095 | MESSAGE WAITING (MW)
      36 |  00000096 | START OF GUARDED AREA (SPA)
      37 |  00000004 | END OF TRANSMISSION (EOT)
      38 |  00000098 | START OF STRING (SOS)
      39 |  00000099 | SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
      3A |  0000009A | SINGLE CHARACTER INTRODUCER (SCI)
      3B |  0000009B | CONTROL SEQUENCE INTRODUCER (CSI)
      3C |  00000014 | DEVICE CONTROL FOUR (DC4)
      3D |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      3E |  0000009E | PRIVACY MESSAGE (PM)
      3F |  0000001A | SUBSTITUTE (SUB)
      40 |  00000020 | SPACE
      4A |  000000A7 | SECTION SIGN
      4B |  0000002E | FULL STOP
      4C |  0000003C | LESS-THAN SIGN
      4D |  00000028 | LEFT PARENTHESIS
      4E |  0000002B | PLUS SIGN
      4F |  00000021 | EXCLAMATION MARK
      50 |  00000026 | AMPERSAND
      5A |  000000A4 | CURRENCY SIGN
      5B |  000000C5 | LATIN CAPITAL LETTER A WITH RING ABOVE
      5C |  0000002A | ASTERISK
      5D |  00000029 | RIGHT PARENTHESIS
      5E |  0000003B | SEMICOLON
      5F |  0000005E | CIRCUMFLEX ACCENT
      60 |  0000002D | HYPHEN-MINUS
      61 |  0000002F | SOLIDUS
      6A |  000000F6 | LATIN SMALL LETTER O WITH DIAERESIS
      6B |  0000002C | COMMA
      6C |  00000025 | PERCENT SIGN
      6D |  0000005F | LOW LINE
      6E |  0000003E | GREATER-THAN SIGN
      6F |  0000003F | QUESTION MARK
      79 |  000000E9 | LATIN SMALL LETTER E WITH ACUTE
      7A |  0000003A | COLON
      7B |  000000C4 | LATIN CAPITAL LETTER A WITH DIAERESIS
      7C |  000000D6 | LATIN CAPITAL LETTER O WITH DIAERESIS
      7D |  00000027 | APOSTROPHE
      7E |  0000003D | EQUALS SIGN
      7F |  00000022 | QUOTATION MARK
      81 |  00000061 | LATIN SMALL LETTER A
      82 |  00000062 | LATIN SMALL LETTER B
      83 |  00000063 | LATIN SMALL LETTER C
      84 |  00000064 | LATIN SMALL LETTER D
      85 |  00000065 | LATIN SMALL LETTER E
      86 |  00000066 | LATIN SMALL LETTER F
      87 |  00000067 | LATIN SMALL LETTER G
      88 |  00000068 | LATIN SMALL LETTER H
      89 |  00000069 | LATIN SMALL LETTER I
      91 |  0000006A | LATIN SMALL LETTER J
      92 |  0000006B | LATIN SMALL LETTER K
      93 |  0000006C | LATIN SMALL LETTER L
      94 |  0000006D | LATIN SMALL LETTER M
      95 |  0000006E | LATIN SMALL LETTER N
      96 |  0000006F | LATIN SMALL LETTER O
      97 |  00000070 | LATIN SMALL LETTER P
      98 |  00000071 | LATIN SMALL LETTER Q
      99 |  00000072 | LATIN SMALL LETTER R
      A1 |  000000FC | LATIN SMALL LETTER U WITH DIAERESIS
      A2 |  00000073 | LATIN SMALL LETTER S
      A3 |  00000074 | LATIN SMALL LETTER T
      A4 |  00000075 | LATIN SMALL LETTER U
      A5 |  00000076 | LATIN SMALL LETTER V
      A6 |  00000077 | LATIN SMALL LETTER W
      A7 |  00000078 | LATIN SMALL LETTER X
      A8 |  00000079 | LATIN SMALL LETTER Y
      A9 |  0000007A | LATIN SMALL LETTER Z
      C0 |  000000E4 | LATIN SMALL LETTER A WITH DIAERESIS
      C1 |  00000041 | LATIN CAPITAL LETTER A
      C2 |  00000042 | LATIN CAPITAL LETTER B
      C3 |  00000043 | LATIN CAPITAL LETTER C
      C4 |  00000044 | LATIN CAPITAL LETTER D
      C5 |  00000045 | LATIN CAPITAL LETTER E
      C6 |  00000046 | LATIN CAPITAL LETTER F
      C7 |  00000047 | LATIN CAPITAL LETTER G
      C8 |  00000048 | LATIN CAPITAL LETTER H
      C9 |  00000049 | LATIN CAPITAL LETTER I
      D0 |  000000E5 | LATIN SMALL LETTER A WITH RING ABOVE
      D1 |  0000004A | LATIN CAPITAL LETTER J
      D2 |  0000004B | LATIN CAPITAL LETTER K
      D3 |  0000004C | LATIN CAPITAL LETTER L
      D4 |  0000004D | LATIN CAPITAL LETTER M
      D5 |  0000004E | LATIN CAPITAL LETTER N
      D6 |  0000004F | LATIN CAPITAL LETTER O
      D7 |  00000050 | LATIN CAPITAL LETTER P
      D8 |  00000051 | LATIN CAPITAL LETTER Q
      D9 |  00000052 | LATIN CAPITAL LETTER R
      E0 |  000000C9 | LATIN CAPITAL LETTER E WITH ACUTE
      E2 |  00000053 | LATIN CAPITAL LETTER S
      E3 |  00000054 | LATIN CAPITAL LETTER T
      E4 |  00000055 | LATIN CAPITAL LETTER U
      E5 |  00000056 | LATIN CAPITAL LETTER V
      E6 |  00000057 | LATIN CAPITAL LETTER W
      E7 |  00000058 | LATIN CAPITAL LETTER X
      E8 |  00000059 | LATIN CAPITAL LETTER Y
      E9 |  0000005A | LATIN CAPITAL LETTER Z
      F0 |  00000030 | DIGIT ZERO
      F1 |  00000031 | DIGIT ONE
      F2 |  00000032 | DIGIT TWO
      F3 |  00000033 | DIGIT THREE
      F4 |  00000034 | DIGIT FOUR
      F5 |  00000035 | DIGIT FIVE
      F6 |  00000036 | DIGIT SIX
      F7 |  00000037 | DIGIT SEVEN
      F8 |  00000038 | DIGIT EIGHT
      F9 |  00000039 | DIGIT NINE
      FF |  0000009F | APPLICATION PROGRAM COMMAND (APC)
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_EBCDIC_FI_SE

    $main::fatpacked{"Locale/RecodeData/EBCDIC_FI_SE_A.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_EBCDIC_FI_SE_A';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for EBCDIC-FI-SE-A.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::EBCDIC_FI_SE_A;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x009c,
      0x0009,
      0x0086,
      0x007f,
      0x0097,
      0x008d,
      0x008e,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x009d,
      0x0085,
      0x0008,
      0x0087,
      0x0018,
      0x0019,
      0x0092,
      0x008f,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0080,
      0x0081,
      0x0082,
      0x0083,
      0x0084,
      0x000a,
      0x0017,
      0x001b,
      0x0088,
      0x0089,
      0x008a,
      0x008b,
      0x008c,
      0x0005,
      0x0006,
      0x0007,
      0x0090,
      0x0091,
      0x0016,
      0x0093,
      0x0094,
      0x0095,
      0x0096,
      0x0004,
      0x0098,
      0x0099,
      0x009a,
      0x009b,
      0x0014,
      0x0015,
      0x009e,
      0x001a,
      0x0020,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00f6,
      0x002e,
      0x003c,
      0x0028,
      0x002b,
      0x007c,
      0x0026,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00e5,
      0x00c5,
      0x002a,
      0x0029,
      0x003b,
      0x00ac,
      0x002d,
      0x002f,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00a6,
      0x002c,
      0x0025,
      0x005f,
      0x003e,
      0x003f,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x003a,
      0x00c4,
      0x00d6,
      0x0027,
      0x003d,
      0x00e4,
      0xfffd,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x009f,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\xc2\x9c",
      "\x09",
      "\xc2\x86",
      "\x7f",
      "\xc2\x97",
      "\xc2\x8d",
      "\xc2\x8e",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\xc2\x9d",
      "\xc2\x85",
      "\x08",
      "\xc2\x87",
      "\x18",
      "\x19",
      "\xc2\x92",
      "\xc2\x8f",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\xc2\x80",
      "\xc2\x81",
      "\xc2\x82",
      "\xc2\x83",
      "\xc2\x84",
      "\x0a",
      "\x17",
      "\x1b",
      "\xc2\x88",
      "\xc2\x89",
      "\xc2\x8a",
      "\xc2\x8b",
      "\xc2\x8c",
      "\x05",
      "\x06",
      "\x07",
      "\xc2\x90",
      "\xc2\x91",
      "\x16",
      "\xc2\x93",
      "\xc2\x94",
      "\xc2\x95",
      "\xc2\x96",
      "\x04",
      "\xc2\x98",
      "\xc2\x99",
      "\xc2\x9a",
      "\xc2\x9b",
      "\x14",
      "\x15",
      "\xc2\x9e",
      "\x1a",
      "\x20",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc3\xb6",
      "\x2e",
      "\x3c",
      "\x28",
      "\x2b",
      "\x7c",
      "\x26",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc3\xa5",
      "\xc3\x85",
      "\x2a",
      "\x29",
      "\x3b",
      "\xc2\xac",
      "\x2d",
      "\x2f",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc2\xa6",
      "\x2c",
      "\x25",
      "\x5f",
      "\x3e",
      "\x3f",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x3a",
      "\xc3\x84",
      "\xc3\x96",
      "\x27",
      "\x3d",
      "\xc3\xa4",
      "\xef\xbf\xbd",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc2\x9f",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x37",
      0x00000005 => "\x2d",
      0x00000006 => "\x2e",
      0x00000007 => "\x2f",
      0x00000008 => "\x16",
      0x00000009 => "\x05",
      0x0000000a => "\x25",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x3c",
      0x00000015 => "\x3d",
      0x00000016 => "\x32",
      0x00000017 => "\x26",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x3f",
      0x0000001b => "\x27",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x40",
      0x00000025 => "\x6c",
      0x00000026 => "\x50",
      0x00000027 => "\x7d",
      0x00000028 => "\x4d",
      0x00000029 => "\x5d",
      0x0000002a => "\x5c",
      0x0000002b => "\x4e",
      0x0000002c => "\x6b",
      0x0000002d => "\x60",
      0x0000002e => "\x4b",
      0x0000002f => "\x61",
      0x00000030 => "\xf0",
      0x00000031 => "\xf1",
      0x00000032 => "\xf2",
      0x00000033 => "\xf3",
      0x00000034 => "\xf4",
      0x00000035 => "\xf5",
      0x00000036 => "\xf6",
      0x00000037 => "\xf7",
      0x00000038 => "\xf8",
      0x00000039 => "\xf9",
      0x0000003a => "\x7a",
      0x0000003b => "\x5e",
      0x0000003c => "\x4c",
      0x0000003d => "\x7e",
      0x0000003e => "\x6e",
      0x0000003f => "\x6f",
      0x00000041 => "\xc1",
      0x00000042 => "\xc2",
      0x00000043 => "\xc3",
      0x00000044 => "\xc4",
      0x00000045 => "\xc5",
      0x00000046 => "\xc6",
      0x00000047 => "\xc7",
      0x00000048 => "\xc8",
      0x00000049 => "\xc9",
      0x0000004a => "\xd1",
      0x0000004b => "\xd2",
      0x0000004c => "\xd3",
      0x0000004d => "\xd4",
      0x0000004e => "\xd5",
      0x0000004f => "\xd6",
      0x00000050 => "\xd7",
      0x00000051 => "\xd8",
      0x00000052 => "\xd9",
      0x00000053 => "\xe2",
      0x00000054 => "\xe3",
      0x00000055 => "\xe4",
      0x00000056 => "\xe5",
      0x00000057 => "\xe6",
      0x00000058 => "\xe7",
      0x00000059 => "\xe8",
      0x0000005a => "\xe9",
      0x0000005f => "\x6d",
      0x00000061 => "\x81",
      0x00000062 => "\x82",
      0x00000063 => "\x83",
      0x00000064 => "\x84",
      0x00000065 => "\x85",
      0x00000066 => "\x86",
      0x00000067 => "\x87",
      0x00000068 => "\x88",
      0x00000069 => "\x89",
      0x0000006a => "\x91",
      0x0000006b => "\x92",
      0x0000006c => "\x93",
      0x0000006d => "\x94",
      0x0000006e => "\x95",
      0x0000006f => "\x96",
      0x00000070 => "\x97",
      0x00000071 => "\x98",
      0x00000072 => "\x99",
      0x00000073 => "\xa2",
      0x00000074 => "\xa3",
      0x00000075 => "\xa4",
      0x00000076 => "\xa5",
      0x00000077 => "\xa6",
      0x00000078 => "\xa7",
      0x00000079 => "\xa8",
      0x0000007a => "\xa9",
      0x0000007c => "\x4f",
      0x0000007f => "\x07",
      0x00000080 => "\x20",
      0x00000081 => "\x21",
      0x00000082 => "\x22",
      0x00000083 => "\x23",
      0x00000084 => "\x24",
      0x00000085 => "\x15",
      0x00000086 => "\x06",
      0x00000087 => "\x17",
      0x00000088 => "\x28",
      0x00000089 => "\x29",
      0x0000008a => "\x2a",
      0x0000008b => "\x2b",
      0x0000008c => "\x2c",
      0x0000008d => "\x09",
      0x0000008e => "\x0a",
      0x0000008f => "\x1b",
      0x00000090 => "\x30",
      0x00000091 => "\x31",
      0x00000092 => "\x1a",
      0x00000093 => "\x33",
      0x00000094 => "\x34",
      0x00000095 => "\x35",
      0x00000096 => "\x36",
      0x00000097 => "\x08",
      0x00000098 => "\x38",
      0x00000099 => "\x39",
      0x0000009a => "\x3a",
      0x0000009b => "\x3b",
      0x0000009c => "\x04",
      0x0000009d => "\x14",
      0x0000009e => "\x3e",
      0x0000009f => "\xff",
      0x000000a6 => "\x6a",
      0x000000ac => "\x5f",
      0x000000c4 => "\x7b",
      0x000000c5 => "\x5b",
      0x000000d6 => "\x7c",
      0x000000e4 => "\x7f",
      0x000000e5 => "\x5a",
      0x000000f6 => "\x4a",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::EBCDIC_FI_SE_A - Conversion routines for EBCDIC_FI_SE_A
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for EBCDIC-FI-SE-A.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  0000009C | STRING TERMINATOR (ST)
      05 |  00000009 | CHARACTER TABULATION (HT)
      06 |  00000086 | START OF SELECTED AREA (SSA)
      07 |  0000007F | DELETE (DEL)
      08 |  00000097 | END OF GUARDED AREA (EPA)
      09 |  0000008D | REVERSE LINE FEED (RI)
      0A |  0000008E | SINGLE-SHIFT TWO (SS2)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  0000009D | OPERATING SYSTEM COMMAND (OSC)
      15 |  00000085 | NEXT LINE (NEL)
      16 |  00000008 | BACKSPACE (BS)
      17 |  00000087 | END OF SELECTED AREA (ESA)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  00000092 | PRIVATE USE TWO (PU2)
      1B |  0000008F | SINGLE-SHIFT THREE (SS3)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000080 | PADDING CHARACTER (PAD)
      21 |  00000081 | HIGH OCTET PRESET (HOP)
      22 |  00000082 | BREAK PERMITTED HERE (BPH)
      23 |  00000083 | NO BREAK HERE (NBH)
      24 |  00000084 | INDEX (IND)
      25 |  0000000A | LINE FEED (LF)
      26 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      27 |  0000001B | ESCAPE (ESC)
      28 |  00000088 | CHARACTER TABULATION SET (HTS)
      29 |  00000089 | CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
      2A |  0000008A | LINE TABULATION SET (VTS)
      2B |  0000008B | PARTIAL LINE FORWARD (PLD)
      2C |  0000008C | PARTIAL LINE BACKWARD (PLU)
      2D |  00000005 | ENQUIRY (ENQ)
      2E |  00000006 | ACKNOWLEDGE (ACK)
      2F |  00000007 | BELL (BEL)
      30 |  00000090 | DEVICE CONTROL STRING (DCS)
      31 |  00000091 | PRIVATE USE ONE (PU1)
      32 |  00000016 | SYNCHRONOUS IDLE (SYN)
      33 |  00000093 | SET TRANSMIT STATE (STS)
      34 |  00000094 | CANCEL CHARACTER (CCH)
      35 |  00000095 | MESSAGE WAITING (MW)
      36 |  00000096 | START OF GUARDED AREA (SPA)
      37 |  00000004 | END OF TRANSMISSION (EOT)
      38 |  00000098 | START OF STRING (SOS)
      39 |  00000099 | SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
      3A |  0000009A | SINGLE CHARACTER INTRODUCER (SCI)
      3B |  0000009B | CONTROL SEQUENCE INTRODUCER (CSI)
      3C |  00000014 | DEVICE CONTROL FOUR (DC4)
      3D |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      3E |  0000009E | PRIVACY MESSAGE (PM)
      3F |  0000001A | SUBSTITUTE (SUB)
      40 |  00000020 | SPACE
      4A |  000000F6 | LATIN SMALL LETTER O WITH DIAERESIS
      4B |  0000002E | FULL STOP
      4C |  0000003C | LESS-THAN SIGN
      4D |  00000028 | LEFT PARENTHESIS
      4E |  0000002B | PLUS SIGN
      4F |  0000007C | VERTICAL LINE
      50 |  00000026 | AMPERSAND
      5A |  000000E5 | LATIN SMALL LETTER A WITH RING ABOVE
      5B |  000000C5 | LATIN CAPITAL LETTER A WITH RING ABOVE
      5C |  0000002A | ASTERISK
      5D |  00000029 | RIGHT PARENTHESIS
      5E |  0000003B | SEMICOLON
      5F |  000000AC | NOT SIGN
      60 |  0000002D | HYPHEN-MINUS
      61 |  0000002F | SOLIDUS
      6A |  000000A6 | BROKEN BAR
      6B |  0000002C | COMMA
      6C |  00000025 | PERCENT SIGN
      6D |  0000005F | LOW LINE
      6E |  0000003E | GREATER-THAN SIGN
      6F |  0000003F | QUESTION MARK
      7A |  0000003A | COLON
      7B |  000000C4 | LATIN CAPITAL LETTER A WITH DIAERESIS
      7C |  000000D6 | LATIN CAPITAL LETTER O WITH DIAERESIS
      7D |  00000027 | APOSTROPHE
      7E |  0000003D | EQUALS SIGN
      7F |  000000E4 | LATIN SMALL LETTER A WITH DIAERESIS
      81 |  00000061 | LATIN SMALL LETTER A
      82 |  00000062 | LATIN SMALL LETTER B
      83 |  00000063 | LATIN SMALL LETTER C
      84 |  00000064 | LATIN SMALL LETTER D
      85 |  00000065 | LATIN SMALL LETTER E
      86 |  00000066 | LATIN SMALL LETTER F
      87 |  00000067 | LATIN SMALL LETTER G
      88 |  00000068 | LATIN SMALL LETTER H
      89 |  00000069 | LATIN SMALL LETTER I
      91 |  0000006A | LATIN SMALL LETTER J
      92 |  0000006B | LATIN SMALL LETTER K
      93 |  0000006C | LATIN SMALL LETTER L
      94 |  0000006D | LATIN SMALL LETTER M
      95 |  0000006E | LATIN SMALL LETTER N
      96 |  0000006F | LATIN SMALL LETTER O
      97 |  00000070 | LATIN SMALL LETTER P
      98 |  00000071 | LATIN SMALL LETTER Q
      99 |  00000072 | LATIN SMALL LETTER R
      A2 |  00000073 | LATIN SMALL LETTER S
      A3 |  00000074 | LATIN SMALL LETTER T
      A4 |  00000075 | LATIN SMALL LETTER U
      A5 |  00000076 | LATIN SMALL LETTER V
      A6 |  00000077 | LATIN SMALL LETTER W
      A7 |  00000078 | LATIN SMALL LETTER X
      A8 |  00000079 | LATIN SMALL LETTER Y
      A9 |  0000007A | LATIN SMALL LETTER Z
      C1 |  00000041 | LATIN CAPITAL LETTER A
      C2 |  00000042 | LATIN CAPITAL LETTER B
      C3 |  00000043 | LATIN CAPITAL LETTER C
      C4 |  00000044 | LATIN CAPITAL LETTER D
      C5 |  00000045 | LATIN CAPITAL LETTER E
      C6 |  00000046 | LATIN CAPITAL LETTER F
      C7 |  00000047 | LATIN CAPITAL LETTER G
      C8 |  00000048 | LATIN CAPITAL LETTER H
      C9 |  00000049 | LATIN CAPITAL LETTER I
      D1 |  0000004A | LATIN CAPITAL LETTER J
      D2 |  0000004B | LATIN CAPITAL LETTER K
      D3 |  0000004C | LATIN CAPITAL LETTER L
      D4 |  0000004D | LATIN CAPITAL LETTER M
      D5 |  0000004E | LATIN CAPITAL LETTER N
      D6 |  0000004F | LATIN CAPITAL LETTER O
      D7 |  00000050 | LATIN CAPITAL LETTER P
      D8 |  00000051 | LATIN CAPITAL LETTER Q
      D9 |  00000052 | LATIN CAPITAL LETTER R
      E2 |  00000053 | LATIN CAPITAL LETTER S
      E3 |  00000054 | LATIN CAPITAL LETTER T
      E4 |  00000055 | LATIN CAPITAL LETTER U
      E5 |  00000056 | LATIN CAPITAL LETTER V
      E6 |  00000057 | LATIN CAPITAL LETTER W
      E7 |  00000058 | LATIN CAPITAL LETTER X
      E8 |  00000059 | LATIN CAPITAL LETTER Y
      E9 |  0000005A | LATIN CAPITAL LETTER Z
      F0 |  00000030 | DIGIT ZERO
      F1 |  00000031 | DIGIT ONE
      F2 |  00000032 | DIGIT TWO
      F3 |  00000033 | DIGIT THREE
      F4 |  00000034 | DIGIT FOUR
      F5 |  00000035 | DIGIT FIVE
      F6 |  00000036 | DIGIT SIX
      F7 |  00000037 | DIGIT SEVEN
      F8 |  00000038 | DIGIT EIGHT
      F9 |  00000039 | DIGIT NINE
      FF |  0000009F | APPLICATION PROGRAM COMMAND (APC)
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_EBCDIC_FI_SE_A

    $main::fatpacked{"Locale/RecodeData/EBCDIC_FR.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_EBCDIC_FR';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for EBCDIC-FR.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::EBCDIC_FR;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x009c,
      0x0009,
      0x0086,
      0x007f,
      0x0097,
      0x008d,
      0x008e,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x009d,
      0x0085,
      0x0008,
      0x0087,
      0x0018,
      0x0019,
      0x0092,
      0x008f,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0080,
      0x0081,
      0x0082,
      0x0083,
      0x0084,
      0x000a,
      0x0017,
      0x001b,
      0x0088,
      0x0089,
      0x008a,
      0x008b,
      0x008c,
      0x0005,
      0x0006,
      0x0007,
      0x0090,
      0x0091,
      0x0016,
      0x0093,
      0x0094,
      0x0095,
      0x0096,
      0x0004,
      0x0098,
      0x0099,
      0x009a,
      0x009b,
      0x0014,
      0x0015,
      0x009e,
      0x001a,
      0x0020,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00b0,
      0x002e,
      0x003c,
      0x0028,
      0x002b,
      0x0021,
      0x0026,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00a7,
      0x0024,
      0x002a,
      0x0029,
      0x003b,
      0x005e,
      0x002d,
      0x002f,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00f9,
      0x002c,
      0x0025,
      0x005f,
      0x003e,
      0x003f,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0060,
      0x003a,
      0x00a3,
      0x00e0,
      0x0027,
      0x003d,
      0x0022,
      0xfffd,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00a8,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00e9,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00e8,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00e7,
      0xfffd,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x009f,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\xc2\x9c",
      "\x09",
      "\xc2\x86",
      "\x7f",
      "\xc2\x97",
      "\xc2\x8d",
      "\xc2\x8e",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\xc2\x9d",
      "\xc2\x85",
      "\x08",
      "\xc2\x87",
      "\x18",
      "\x19",
      "\xc2\x92",
      "\xc2\x8f",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\xc2\x80",
      "\xc2\x81",
      "\xc2\x82",
      "\xc2\x83",
      "\xc2\x84",
      "\x0a",
      "\x17",
      "\x1b",
      "\xc2\x88",
      "\xc2\x89",
      "\xc2\x8a",
      "\xc2\x8b",
      "\xc2\x8c",
      "\x05",
      "\x06",
      "\x07",
      "\xc2\x90",
      "\xc2\x91",
      "\x16",
      "\xc2\x93",
      "\xc2\x94",
      "\xc2\x95",
      "\xc2\x96",
      "\x04",
      "\xc2\x98",
      "\xc2\x99",
      "\xc2\x9a",
      "\xc2\x9b",
      "\x14",
      "\x15",
      "\xc2\x9e",
      "\x1a",
      "\x20",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc2\xb0",
      "\x2e",
      "\x3c",
      "\x28",
      "\x2b",
      "\x21",
      "\x26",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc2\xa7",
      "\x24",
      "\x2a",
      "\x29",
      "\x3b",
      "\x5e",
      "\x2d",
      "\x2f",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc3\xb9",
      "\x2c",
      "\x25",
      "\x5f",
      "\x3e",
      "\x3f",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x60",
      "\x3a",
      "\xc2\xa3",
      "\xc3\xa0",
      "\x27",
      "\x3d",
      "\x22",
      "\xef\xbf\xbd",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc2\xa8",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc3\xa9",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc3\xa8",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc3\xa7",
      "\xef\xbf\xbd",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc2\x9f",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x37",
      0x00000005 => "\x2d",
      0x00000006 => "\x2e",
      0x00000007 => "\x2f",
      0x00000008 => "\x16",
      0x00000009 => "\x05",
      0x0000000a => "\x25",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x3c",
      0x00000015 => "\x3d",
      0x00000016 => "\x32",
      0x00000017 => "\x26",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x3f",
      0x0000001b => "\x27",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x40",
      0x00000021 => "\x4f",
      0x00000022 => "\x7f",
      0x00000024 => "\x5b",
      0x00000025 => "\x6c",
      0x00000026 => "\x50",
      0x00000027 => "\x7d",
      0x00000028 => "\x4d",
      0x00000029 => "\x5d",
      0x0000002a => "\x5c",
      0x0000002b => "\x4e",
      0x0000002c => "\x6b",
      0x0000002d => "\x60",
      0x0000002e => "\x4b",
      0x0000002f => "\x61",
      0x00000030 => "\xf0",
      0x00000031 => "\xf1",
      0x00000032 => "\xf2",
      0x00000033 => "\xf3",
      0x00000034 => "\xf4",
      0x00000035 => "\xf5",
      0x00000036 => "\xf6",
      0x00000037 => "\xf7",
      0x00000038 => "\xf8",
      0x00000039 => "\xf9",
      0x0000003a => "\x7a",
      0x0000003b => "\x5e",
      0x0000003c => "\x4c",
      0x0000003d => "\x7e",
      0x0000003e => "\x6e",
      0x0000003f => "\x6f",
      0x00000041 => "\xc1",
      0x00000042 => "\xc2",
      0x00000043 => "\xc3",
      0x00000044 => "\xc4",
      0x00000045 => "\xc5",
      0x00000046 => "\xc6",
      0x00000047 => "\xc7",
      0x00000048 => "\xc8",
      0x00000049 => "\xc9",
      0x0000004a => "\xd1",
      0x0000004b => "\xd2",
      0x0000004c => "\xd3",
      0x0000004d => "\xd4",
      0x0000004e => "\xd5",
      0x0000004f => "\xd6",
      0x00000050 => "\xd7",
      0x00000051 => "\xd8",
      0x00000052 => "\xd9",
      0x00000053 => "\xe2",
      0x00000054 => "\xe3",
      0x00000055 => "\xe4",
      0x00000056 => "\xe5",
      0x00000057 => "\xe6",
      0x00000058 => "\xe7",
      0x00000059 => "\xe8",
      0x0000005a => "\xe9",
      0x0000005e => "\x5f",
      0x0000005f => "\x6d",
      0x00000060 => "\x79",
      0x00000061 => "\x81",
      0x00000062 => "\x82",
      0x00000063 => "\x83",
      0x00000064 => "\x84",
      0x00000065 => "\x85",
      0x00000066 => "\x86",
      0x00000067 => "\x87",
      0x00000068 => "\x88",
      0x00000069 => "\x89",
      0x0000006a => "\x91",
      0x0000006b => "\x92",
      0x0000006c => "\x93",
      0x0000006d => "\x94",
      0x0000006e => "\x95",
      0x0000006f => "\x96",
      0x00000070 => "\x97",
      0x00000071 => "\x98",
      0x00000072 => "\x99",
      0x00000073 => "\xa2",
      0x00000074 => "\xa3",
      0x00000075 => "\xa4",
      0x00000076 => "\xa5",
      0x00000077 => "\xa6",
      0x00000078 => "\xa7",
      0x00000079 => "\xa8",
      0x0000007a => "\xa9",
      0x0000007f => "\x07",
      0x00000080 => "\x20",
      0x00000081 => "\x21",
      0x00000082 => "\x22",
      0x00000083 => "\x23",
      0x00000084 => "\x24",
      0x00000085 => "\x15",
      0x00000086 => "\x06",
      0x00000087 => "\x17",
      0x00000088 => "\x28",
      0x00000089 => "\x29",
      0x0000008a => "\x2a",
      0x0000008b => "\x2b",
      0x0000008c => "\x2c",
      0x0000008d => "\x09",
      0x0000008e => "\x0a",
      0x0000008f => "\x1b",
      0x00000090 => "\x30",
      0x00000091 => "\x31",
      0x00000092 => "\x1a",
      0x00000093 => "\x33",
      0x00000094 => "\x34",
      0x00000095 => "\x35",
      0x00000096 => "\x36",
      0x00000097 => "\x08",
      0x00000098 => "\x38",
      0x00000099 => "\x39",
      0x0000009a => "\x3a",
      0x0000009b => "\x3b",
      0x0000009c => "\x04",
      0x0000009d => "\x14",
      0x0000009e => "\x3e",
      0x0000009f => "\xff",
      0x000000a3 => "\x7b",
      0x000000a7 => "\x5a",
      0x000000a8 => "\xa1",
      0x000000b0 => "\x4a",
      0x000000e0 => "\x7c",
      0x000000e7 => "\xe0",
      0x000000e8 => "\xd0",
      0x000000e9 => "\xc0",
      0x000000f9 => "\x6a",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::EBCDIC_FR - Conversion routines for EBCDIC_FR
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for EBCDIC-FR.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  0000009C | STRING TERMINATOR (ST)
      05 |  00000009 | CHARACTER TABULATION (HT)
      06 |  00000086 | START OF SELECTED AREA (SSA)
      07 |  0000007F | DELETE (DEL)
      08 |  00000097 | END OF GUARDED AREA (EPA)
      09 |  0000008D | REVERSE LINE FEED (RI)
      0A |  0000008E | SINGLE-SHIFT TWO (SS2)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  0000009D | OPERATING SYSTEM COMMAND (OSC)
      15 |  00000085 | NEXT LINE (NEL)
      16 |  00000008 | BACKSPACE (BS)
      17 |  00000087 | END OF SELECTED AREA (ESA)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  00000092 | PRIVATE USE TWO (PU2)
      1B |  0000008F | SINGLE-SHIFT THREE (SS3)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000080 | PADDING CHARACTER (PAD)
      21 |  00000081 | HIGH OCTET PRESET (HOP)
      22 |  00000082 | BREAK PERMITTED HERE (BPH)
      23 |  00000083 | NO BREAK HERE (NBH)
      24 |  00000084 | INDEX (IND)
      25 |  0000000A | LINE FEED (LF)
      26 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      27 |  0000001B | ESCAPE (ESC)
      28 |  00000088 | CHARACTER TABULATION SET (HTS)
      29 |  00000089 | CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
      2A |  0000008A | LINE TABULATION SET (VTS)
      2B |  0000008B | PARTIAL LINE FORWARD (PLD)
      2C |  0000008C | PARTIAL LINE BACKWARD (PLU)
      2D |  00000005 | ENQUIRY (ENQ)
      2E |  00000006 | ACKNOWLEDGE (ACK)
      2F |  00000007 | BELL (BEL)
      30 |  00000090 | DEVICE CONTROL STRING (DCS)
      31 |  00000091 | PRIVATE USE ONE (PU1)
      32 |  00000016 | SYNCHRONOUS IDLE (SYN)
      33 |  00000093 | SET TRANSMIT STATE (STS)
      34 |  00000094 | CANCEL CHARACTER (CCH)
      35 |  00000095 | MESSAGE WAITING (MW)
      36 |  00000096 | START OF GUARDED AREA (SPA)
      37 |  00000004 | END OF TRANSMISSION (EOT)
      38 |  00000098 | START OF STRING (SOS)
      39 |  00000099 | SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
      3A |  0000009A | SINGLE CHARACTER INTRODUCER (SCI)
      3B |  0000009B | CONTROL SEQUENCE INTRODUCER (CSI)
      3C |  00000014 | DEVICE CONTROL FOUR (DC4)
      3D |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      3E |  0000009E | PRIVACY MESSAGE (PM)
      3F |  0000001A | SUBSTITUTE (SUB)
      40 |  00000020 | SPACE
      4A |  000000B0 | DEGREE SIGN
      4B |  0000002E | FULL STOP
      4C |  0000003C | LESS-THAN SIGN
      4D |  00000028 | LEFT PARENTHESIS
      4E |  0000002B | PLUS SIGN
      4F |  00000021 | EXCLAMATION MARK
      50 |  00000026 | AMPERSAND
      5A |  000000A7 | SECTION SIGN
      5B |  00000024 | DOLLAR SIGN
      5C |  0000002A | ASTERISK
      5D |  00000029 | RIGHT PARENTHESIS
      5E |  0000003B | SEMICOLON
      5F |  0000005E | CIRCUMFLEX ACCENT
      60 |  0000002D | HYPHEN-MINUS
      61 |  0000002F | SOLIDUS
      6A |  000000F9 | LATIN SMALL LETTER U WITH GRAVE
      6B |  0000002C | COMMA
      6C |  00000025 | PERCENT SIGN
      6D |  0000005F | LOW LINE
      6E |  0000003E | GREATER-THAN SIGN
      6F |  0000003F | QUESTION MARK
      79 |  00000060 | GRAVE ACCENT
      7A |  0000003A | COLON
      7B |  000000A3 | POUND SIGN
      7C |  000000E0 | LATIN SMALL LETTER A WITH GRAVE
      7D |  00000027 | APOSTROPHE
      7E |  0000003D | EQUALS SIGN
      7F |  00000022 | QUOTATION MARK
      81 |  00000061 | LATIN SMALL LETTER A
      82 |  00000062 | LATIN SMALL LETTER B
      83 |  00000063 | LATIN SMALL LETTER C
      84 |  00000064 | LATIN SMALL LETTER D
      85 |  00000065 | LATIN SMALL LETTER E
      86 |  00000066 | LATIN SMALL LETTER F
      87 |  00000067 | LATIN SMALL LETTER G
      88 |  00000068 | LATIN SMALL LETTER H
      89 |  00000069 | LATIN SMALL LETTER I
      91 |  0000006A | LATIN SMALL LETTER J
      92 |  0000006B | LATIN SMALL LETTER K
      93 |  0000006C | LATIN SMALL LETTER L
      94 |  0000006D | LATIN SMALL LETTER M
      95 |  0000006E | LATIN SMALL LETTER N
      96 |  0000006F | LATIN SMALL LETTER O
      97 |  00000070 | LATIN SMALL LETTER P
      98 |  00000071 | LATIN SMALL LETTER Q
      99 |  00000072 | LATIN SMALL LETTER R
      A1 |  000000A8 | DIAERESIS
      A2 |  00000073 | LATIN SMALL LETTER S
      A3 |  00000074 | LATIN SMALL LETTER T
      A4 |  00000075 | LATIN SMALL LETTER U
      A5 |  00000076 | LATIN SMALL LETTER V
      A6 |  00000077 | LATIN SMALL LETTER W
      A7 |  00000078 | LATIN SMALL LETTER X
      A8 |  00000079 | LATIN SMALL LETTER Y
      A9 |  0000007A | LATIN SMALL LETTER Z
      C0 |  000000E9 | LATIN SMALL LETTER E WITH ACUTE
      C1 |  00000041 | LATIN CAPITAL LETTER A
      C2 |  00000042 | LATIN CAPITAL LETTER B
      C3 |  00000043 | LATIN CAPITAL LETTER C
      C4 |  00000044 | LATIN CAPITAL LETTER D
      C5 |  00000045 | LATIN CAPITAL LETTER E
      C6 |  00000046 | LATIN CAPITAL LETTER F
      C7 |  00000047 | LATIN CAPITAL LETTER G
      C8 |  00000048 | LATIN CAPITAL LETTER H
      C9 |  00000049 | LATIN CAPITAL LETTER I
      D0 |  000000E8 | LATIN SMALL LETTER E WITH GRAVE
      D1 |  0000004A | LATIN CAPITAL LETTER J
      D2 |  0000004B | LATIN CAPITAL LETTER K
      D3 |  0000004C | LATIN CAPITAL LETTER L
      D4 |  0000004D | LATIN CAPITAL LETTER M
      D5 |  0000004E | LATIN CAPITAL LETTER N
      D6 |  0000004F | LATIN CAPITAL LETTER O
      D7 |  00000050 | LATIN CAPITAL LETTER P
      D8 |  00000051 | LATIN CAPITAL LETTER Q
      D9 |  00000052 | LATIN CAPITAL LETTER R
      E0 |  000000E7 | LATIN SMALL LETTER C WITH CEDILLA
      E2 |  00000053 | LATIN CAPITAL LETTER S
      E3 |  00000054 | LATIN CAPITAL LETTER T
      E4 |  00000055 | LATIN CAPITAL LETTER U
      E5 |  00000056 | LATIN CAPITAL LETTER V
      E6 |  00000057 | LATIN CAPITAL LETTER W
      E7 |  00000058 | LATIN CAPITAL LETTER X
      E8 |  00000059 | LATIN CAPITAL LETTER Y
      E9 |  0000005A | LATIN CAPITAL LETTER Z
      F0 |  00000030 | DIGIT ZERO
      F1 |  00000031 | DIGIT ONE
      F2 |  00000032 | DIGIT TWO
      F3 |  00000033 | DIGIT THREE
      F4 |  00000034 | DIGIT FOUR
      F5 |  00000035 | DIGIT FIVE
      F6 |  00000036 | DIGIT SIX
      F7 |  00000037 | DIGIT SEVEN
      F8 |  00000038 | DIGIT EIGHT
      F9 |  00000039 | DIGIT NINE
      FF |  0000009F | APPLICATION PROGRAM COMMAND (APC)
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_EBCDIC_FR

    $main::fatpacked{"Locale/RecodeData/EBCDIC_IS_FRISS.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_EBCDIC_IS_FRISS';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for EBCDIC-IS-FRISS.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::EBCDIC_IS_FRISS;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0020,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00e1,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x003c,
      0x002e,
      0x00c1,
      0x0028,
      0x002b,
      0x0021,
      0x00d0,
      0x00e9,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00ed,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0024,
      0x0025,
      0x00c9,
      0x002a,
      0x0029,
      0x003b,
      0x0026,
      0x002d,
      0x002f,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0023,
      0x2018,
      0x002c,
      0x00de,
      0x005f,
      0x003e,
      0x003f,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00cd,
      0xfffd,
      0xfffd,
      0x007c,
      0x00f0,
      0x003a,
      0x00c6,
      0x00d6,
      0x0027,
      0x003d,
      0x0022,
      0xfffd,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00dd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00b0,
      0x00f6,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0xfffd,
      0xfffd,
      0x005b,
      0x00fd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x005d,
      0x00a8,
      0xfffd,
      0xfffd,
      0x00fe,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00f3,
      0xfffd,
      0x00e6,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00fa,
      0xfffd,
      0x00b4,
      0xfffd,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00d3,
      0xfffd,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00da,
      0x007f,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x20",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc3\xa1",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x3c",
      "\x2e",
      "\xc3\x81",
      "\x28",
      "\x2b",
      "\x21",
      "\xc3\x90",
      "\xc3\xa9",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc3\xad",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x24",
      "\x25",
      "\xc3\x89",
      "\x2a",
      "\x29",
      "\x3b",
      "\x26",
      "\x2d",
      "\x2f",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x23",
      "\xe2\x80\x98",
      "\x2c",
      "\xc3\x9e",
      "\x5f",
      "\x3e",
      "\x3f",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc3\x8d",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x7c",
      "\xc3\xb0",
      "\x3a",
      "\xc3\x86",
      "\xc3\x96",
      "\x27",
      "\x3d",
      "\x22",
      "\xef\xbf\xbd",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc3\x9d",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc2\xb0",
      "\xc3\xb6",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x5b",
      "\xc3\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x5d",
      "\xc2\xa8",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc3\xbe",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc3\xb3",
      "\xef\xbf\xbd",
      "\xc3\xa6",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc3\xba",
      "\xef\xbf\xbd",
      "\xc2\xb4",
      "\xef\xbf\xbd",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc3\x93",
      "\xef\xbf\xbd",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc3\x9a",
      "\x7f",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x40",
      0x00000021 => "\x4f",
      0x00000022 => "\x7f",
      0x00000023 => "\x69",
      0x00000024 => "\x59",
      0x00000025 => "\x5a",
      0x00000026 => "\x5f",
      0x00000027 => "\x7d",
      0x00000028 => "\x4d",
      0x00000029 => "\x5d",
      0x0000002a => "\x5c",
      0x0000002b => "\x4e",
      0x0000002c => "\x6b",
      0x0000002d => "\x60",
      0x0000002e => "\x4b",
      0x0000002f => "\x61",
      0x00000030 => "\xf0",
      0x00000031 => "\xf1",
      0x00000032 => "\xf2",
      0x00000033 => "\xf3",
      0x00000034 => "\xf4",
      0x00000035 => "\xf5",
      0x00000036 => "\xf6",
      0x00000037 => "\xf7",
      0x00000038 => "\xf8",
      0x00000039 => "\xf9",
      0x0000003a => "\x7a",
      0x0000003b => "\x5e",
      0x0000003c => "\x4a",
      0x0000003d => "\x7e",
      0x0000003e => "\x6e",
      0x0000003f => "\x6f",
      0x00000041 => "\xc1",
      0x00000042 => "\xc2",
      0x00000043 => "\xc3",
      0x00000044 => "\xc4",
      0x00000045 => "\xc5",
      0x00000046 => "\xc6",
      0x00000047 => "\xc7",
      0x00000048 => "\xc8",
      0x00000049 => "\xc9",
      0x0000004a => "\xd1",
      0x0000004b => "\xd2",
      0x0000004c => "\xd3",
      0x0000004d => "\xd4",
      0x0000004e => "\xd5",
      0x0000004f => "\xd6",
      0x00000050 => "\xd7",
      0x00000051 => "\xd8",
      0x00000052 => "\xd9",
      0x00000053 => "\xe2",
      0x00000054 => "\xe3",
      0x00000055 => "\xe4",
      0x00000056 => "\xe5",
      0x00000057 => "\xe6",
      0x00000058 => "\xe7",
      0x00000059 => "\xe8",
      0x0000005a => "\xe9",
      0x0000005b => "\xac",
      0x0000005d => "\xbc",
      0x0000005f => "\x6d",
      0x00000061 => "\x81",
      0x00000062 => "\x82",
      0x00000063 => "\x83",
      0x00000064 => "\x84",
      0x00000065 => "\x85",
      0x00000066 => "\x86",
      0x00000067 => "\x87",
      0x00000068 => "\x88",
      0x00000069 => "\x89",
      0x0000006a => "\x91",
      0x0000006b => "\x92",
      0x0000006c => "\x93",
      0x0000006d => "\x94",
      0x0000006e => "\x95",
      0x0000006f => "\x96",
      0x00000070 => "\x97",
      0x00000071 => "\x98",
      0x00000072 => "\x99",
      0x00000073 => "\xa2",
      0x00000074 => "\xa3",
      0x00000075 => "\xa4",
      0x00000076 => "\xa5",
      0x00000077 => "\xa6",
      0x00000078 => "\xa7",
      0x00000079 => "\xa8",
      0x0000007a => "\xa9",
      0x0000007c => "\x78",
      0x0000007f => "\xff",
      0x000000a8 => "\xbd",
      0x000000b0 => "\xa0",
      0x000000b4 => "\xe0",
      0x000000c1 => "\x4c",
      0x000000c6 => "\x7b",
      0x000000c9 => "\x5b",
      0x000000cd => "\x75",
      0x000000d0 => "\x50",
      0x000000d3 => "\xee",
      0x000000d6 => "\x7c",
      0x000000da => "\xfe",
      0x000000dd => "\x8d",
      0x000000de => "\x6c",
      0x000000e1 => "\x45",
      0x000000e6 => "\xd0",
      0x000000e9 => "\x51",
      0x000000ed => "\x55",
      0x000000f0 => "\x79",
      0x000000f3 => "\xce",
      0x000000f6 => "\xa1",
      0x000000fa => "\xde",
      0x000000fd => "\xad",
      0x000000fe => "\xc0",
      0x00002018 => "\x6a",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::EBCDIC_IS_FRISS - Conversion routines for EBCDIC_IS_FRISS
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for EBCDIC-IS-FRISS.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: Skyrsuvelar Rikisins og Reykjavikurborgar, feb 1982
   alias FRISS
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      40 |  00000020 | SPACE
      45 |  000000E1 | LATIN SMALL LETTER A WITH ACUTE
      4A |  0000003C | LESS-THAN SIGN
      4B |  0000002E | FULL STOP
      4C |  000000C1 | LATIN CAPITAL LETTER A WITH ACUTE
      4D |  00000028 | LEFT PARENTHESIS
      4E |  0000002B | PLUS SIGN
      4F |  00000021 | EXCLAMATION MARK
      50 |  000000D0 | LATIN CAPITAL LETTER ETH (Icelandic)
      51 |  000000E9 | LATIN SMALL LETTER E WITH ACUTE
      55 |  000000ED | LATIN SMALL LETTER I WITH ACUTE
      59 |  00000024 | DOLLAR SIGN
      5A |  00000025 | PERCENT SIGN
      5B |  000000C9 | LATIN CAPITAL LETTER E WITH ACUTE
      5C |  0000002A | ASTERISK
      5D |  00000029 | RIGHT PARENTHESIS
      5E |  0000003B | SEMICOLON
      5F |  00000026 | AMPERSAND
      60 |  0000002D | HYPHEN-MINUS
      61 |  0000002F | SOLIDUS
      69 |  00000023 | NUMBER SIGN
      6A |  00002018 | LEFT SINGLE QUOTATION MARK
      6B |  0000002C | COMMA
      6C |  000000DE | LATIN CAPITAL LETTER THORN (Icelandic)
      6D |  0000005F | LOW LINE
      6E |  0000003E | GREATER-THAN SIGN
      6F |  0000003F | QUESTION MARK
      75 |  000000CD | LATIN CAPITAL LETTER I WITH ACUTE
      78 |  0000007C | VERTICAL LINE
      79 |  000000F0 | LATIN SMALL LETTER ETH (Icelandic)
      7A |  0000003A | COLON
      7B |  000000C6 | LATIN CAPITAL LETTER AE
      7C |  000000D6 | LATIN CAPITAL LETTER O WITH DIAERESIS
      7D |  00000027 | APOSTROPHE
      7E |  0000003D | EQUALS SIGN
      7F |  00000022 | QUOTATION MARK
      81 |  00000061 | LATIN SMALL LETTER A
      82 |  00000062 | LATIN SMALL LETTER B
      83 |  00000063 | LATIN SMALL LETTER C
      84 |  00000064 | LATIN SMALL LETTER D
      85 |  00000065 | LATIN SMALL LETTER E
      86 |  00000066 | LATIN SMALL LETTER F
      87 |  00000067 | LATIN SMALL LETTER G
      88 |  00000068 | LATIN SMALL LETTER H
      89 |  00000069 | LATIN SMALL LETTER I
      8D |  000000DD | LATIN CAPITAL LETTER Y WITH ACUTE
      91 |  0000006A | LATIN SMALL LETTER J
      92 |  0000006B | LATIN SMALL LETTER K
      93 |  0000006C | LATIN SMALL LETTER L
      94 |  0000006D | LATIN SMALL LETTER M
      95 |  0000006E | LATIN SMALL LETTER N
      96 |  0000006F | LATIN SMALL LETTER O
      97 |  00000070 | LATIN SMALL LETTER P
      98 |  00000071 | LATIN SMALL LETTER Q
      99 |  00000072 | LATIN SMALL LETTER R
      A0 |  000000B0 | DEGREE SIGN
      A1 |  000000F6 | LATIN SMALL LETTER O WITH DIAERESIS
      A2 |  00000073 | LATIN SMALL LETTER S
      A3 |  00000074 | LATIN SMALL LETTER T
      A4 |  00000075 | LATIN SMALL LETTER U
      A5 |  00000076 | LATIN SMALL LETTER V
      A6 |  00000077 | LATIN SMALL LETTER W
      A7 |  00000078 | LATIN SMALL LETTER X
      A8 |  00000079 | LATIN SMALL LETTER Y
      A9 |  0000007A | LATIN SMALL LETTER Z
      AC |  0000005B | LEFT SQUARE BRACKET
      AD |  000000FD | LATIN SMALL LETTER Y WITH ACUTE
      BC |  0000005D | RIGHT SQUARE BRACKET
      BD |  000000A8 | DIAERESIS
      C0 |  000000FE | LATIN SMALL LETTER THORN (Icelandic)
      C1 |  00000041 | LATIN CAPITAL LETTER A
      C2 |  00000042 | LATIN CAPITAL LETTER B
      C3 |  00000043 | LATIN CAPITAL LETTER C
      C4 |  00000044 | LATIN CAPITAL LETTER D
      C5 |  00000045 | LATIN CAPITAL LETTER E
      C6 |  00000046 | LATIN CAPITAL LETTER F
      C7 |  00000047 | LATIN CAPITAL LETTER G
      C8 |  00000048 | LATIN CAPITAL LETTER H
      C9 |  00000049 | LATIN CAPITAL LETTER I
      CE |  000000F3 | LATIN SMALL LETTER O WITH ACUTE
      D0 |  000000E6 | LATIN SMALL LETTER AE
      D1 |  0000004A | LATIN CAPITAL LETTER J
      D2 |  0000004B | LATIN CAPITAL LETTER K
      D3 |  0000004C | LATIN CAPITAL LETTER L
      D4 |  0000004D | LATIN CAPITAL LETTER M
      D5 |  0000004E | LATIN CAPITAL LETTER N
      D6 |  0000004F | LATIN CAPITAL LETTER O
      D7 |  00000050 | LATIN CAPITAL LETTER P
      D8 |  00000051 | LATIN CAPITAL LETTER Q
      D9 |  00000052 | LATIN CAPITAL LETTER R
      DE |  000000FA | LATIN SMALL LETTER U WITH ACUTE
      E0 |  000000B4 | ACUTE ACCENT
      E2 |  00000053 | LATIN CAPITAL LETTER S
      E3 |  00000054 | LATIN CAPITAL LETTER T
      E4 |  00000055 | LATIN CAPITAL LETTER U
      E5 |  00000056 | LATIN CAPITAL LETTER V
      E6 |  00000057 | LATIN CAPITAL LETTER W
      E7 |  00000058 | LATIN CAPITAL LETTER X
      E8 |  00000059 | LATIN CAPITAL LETTER Y
      E9 |  0000005A | LATIN CAPITAL LETTER Z
      EE |  000000D3 | LATIN CAPITAL LETTER O WITH ACUTE
      F0 |  00000030 | DIGIT ZERO
      F1 |  00000031 | DIGIT ONE
      F2 |  00000032 | DIGIT TWO
      F3 |  00000033 | DIGIT THREE
      F4 |  00000034 | DIGIT FOUR
      F5 |  00000035 | DIGIT FIVE
      F6 |  00000036 | DIGIT SIX
      F7 |  00000037 | DIGIT SEVEN
      F8 |  00000038 | DIGIT EIGHT
      F9 |  00000039 | DIGIT NINE
      FE |  000000DA | LATIN CAPITAL LETTER U WITH ACUTE
      FF |  0000007F | DELETE (DEL)
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_EBCDIC_IS_FRISS

    $main::fatpacked{"Locale/RecodeData/EBCDIC_IT.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_EBCDIC_IT';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for EBCDIC-IT.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::EBCDIC_IT;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x009c,
      0x0009,
      0x0086,
      0x007f,
      0x0097,
      0x008d,
      0x008e,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x009d,
      0x0085,
      0x0008,
      0x0087,
      0x0018,
      0x0019,
      0x0092,
      0x008f,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0080,
      0x0081,
      0x0082,
      0x0083,
      0x0084,
      0x000a,
      0x0017,
      0x001b,
      0x0088,
      0x0089,
      0x008a,
      0x008b,
      0x008c,
      0x0005,
      0x0006,
      0x0007,
      0x0090,
      0x0091,
      0x0016,
      0x0093,
      0x0094,
      0x0095,
      0x0096,
      0x0004,
      0x0098,
      0x0099,
      0x009a,
      0x009b,
      0x0014,
      0x0015,
      0x009e,
      0x001a,
      0x0020,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00b0,
      0x002e,
      0x003c,
      0x0028,
      0x002b,
      0x0021,
      0x0026,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00e9,
      0x0024,
      0x002a,
      0x0029,
      0x003b,
      0x005e,
      0x002d,
      0x002f,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00f2,
      0x002c,
      0x0025,
      0x005f,
      0x003e,
      0x003f,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00f9,
      0x003a,
      0x00a3,
      0x00a7,
      0x0027,
      0x003d,
      0x0022,
      0xfffd,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00ec,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00e0,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00e8,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00e7,
      0xfffd,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x009f,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\xc2\x9c",
      "\x09",
      "\xc2\x86",
      "\x7f",
      "\xc2\x97",
      "\xc2\x8d",
      "\xc2\x8e",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\xc2\x9d",
      "\xc2\x85",
      "\x08",
      "\xc2\x87",
      "\x18",
      "\x19",
      "\xc2\x92",
      "\xc2\x8f",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\xc2\x80",
      "\xc2\x81",
      "\xc2\x82",
      "\xc2\x83",
      "\xc2\x84",
      "\x0a",
      "\x17",
      "\x1b",
      "\xc2\x88",
      "\xc2\x89",
      "\xc2\x8a",
      "\xc2\x8b",
      "\xc2\x8c",
      "\x05",
      "\x06",
      "\x07",
      "\xc2\x90",
      "\xc2\x91",
      "\x16",
      "\xc2\x93",
      "\xc2\x94",
      "\xc2\x95",
      "\xc2\x96",
      "\x04",
      "\xc2\x98",
      "\xc2\x99",
      "\xc2\x9a",
      "\xc2\x9b",
      "\x14",
      "\x15",
      "\xc2\x9e",
      "\x1a",
      "\x20",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc2\xb0",
      "\x2e",
      "\x3c",
      "\x28",
      "\x2b",
      "\x21",
      "\x26",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc3\xa9",
      "\x24",
      "\x2a",
      "\x29",
      "\x3b",
      "\x5e",
      "\x2d",
      "\x2f",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc3\xb2",
      "\x2c",
      "\x25",
      "\x5f",
      "\x3e",
      "\x3f",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc3\xb9",
      "\x3a",
      "\xc2\xa3",
      "\xc2\xa7",
      "\x27",
      "\x3d",
      "\x22",
      "\xef\xbf\xbd",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc3\xac",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc3\xa0",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc3\xa8",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc3\xa7",
      "\xef\xbf\xbd",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc2\x9f",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x37",
      0x00000005 => "\x2d",
      0x00000006 => "\x2e",
      0x00000007 => "\x2f",
      0x00000008 => "\x16",
      0x00000009 => "\x05",
      0x0000000a => "\x25",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x3c",
      0x00000015 => "\x3d",
      0x00000016 => "\x32",
      0x00000017 => "\x26",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x3f",
      0x0000001b => "\x27",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x40",
      0x00000021 => "\x4f",
      0x00000022 => "\x7f",
      0x00000024 => "\x5b",
      0x00000025 => "\x6c",
      0x00000026 => "\x50",
      0x00000027 => "\x7d",
      0x00000028 => "\x4d",
      0x00000029 => "\x5d",
      0x0000002a => "\x5c",
      0x0000002b => "\x4e",
      0x0000002c => "\x6b",
      0x0000002d => "\x60",
      0x0000002e => "\x4b",
      0x0000002f => "\x61",
      0x00000030 => "\xf0",
      0x00000031 => "\xf1",
      0x00000032 => "\xf2",
      0x00000033 => "\xf3",
      0x00000034 => "\xf4",
      0x00000035 => "\xf5",
      0x00000036 => "\xf6",
      0x00000037 => "\xf7",
      0x00000038 => "\xf8",
      0x00000039 => "\xf9",
      0x0000003a => "\x7a",
      0x0000003b => "\x5e",
      0x0000003c => "\x4c",
      0x0000003d => "\x7e",
      0x0000003e => "\x6e",
      0x0000003f => "\x6f",
      0x00000041 => "\xc1",
      0x00000042 => "\xc2",
      0x00000043 => "\xc3",
      0x00000044 => "\xc4",
      0x00000045 => "\xc5",
      0x00000046 => "\xc6",
      0x00000047 => "\xc7",
      0x00000048 => "\xc8",
      0x00000049 => "\xc9",
      0x0000004a => "\xd1",
      0x0000004b => "\xd2",
      0x0000004c => "\xd3",
      0x0000004d => "\xd4",
      0x0000004e => "\xd5",
      0x0000004f => "\xd6",
      0x00000050 => "\xd7",
      0x00000051 => "\xd8",
      0x00000052 => "\xd9",
      0x00000053 => "\xe2",
      0x00000054 => "\xe3",
      0x00000055 => "\xe4",
      0x00000056 => "\xe5",
      0x00000057 => "\xe6",
      0x00000058 => "\xe7",
      0x00000059 => "\xe8",
      0x0000005a => "\xe9",
      0x0000005e => "\x5f",
      0x0000005f => "\x6d",
      0x00000061 => "\x81",
      0x00000062 => "\x82",
      0x00000063 => "\x83",
      0x00000064 => "\x84",
      0x00000065 => "\x85",
      0x00000066 => "\x86",
      0x00000067 => "\x87",
      0x00000068 => "\x88",
      0x00000069 => "\x89",
      0x0000006a => "\x91",
      0x0000006b => "\x92",
      0x0000006c => "\x93",
      0x0000006d => "\x94",
      0x0000006e => "\x95",
      0x0000006f => "\x96",
      0x00000070 => "\x97",
      0x00000071 => "\x98",
      0x00000072 => "\x99",
      0x00000073 => "\xa2",
      0x00000074 => "\xa3",
      0x00000075 => "\xa4",
      0x00000076 => "\xa5",
      0x00000077 => "\xa6",
      0x00000078 => "\xa7",
      0x00000079 => "\xa8",
      0x0000007a => "\xa9",
      0x0000007f => "\x07",
      0x00000080 => "\x20",
      0x00000081 => "\x21",
      0x00000082 => "\x22",
      0x00000083 => "\x23",
      0x00000084 => "\x24",
      0x00000085 => "\x15",
      0x00000086 => "\x06",
      0x00000087 => "\x17",
      0x00000088 => "\x28",
      0x00000089 => "\x29",
      0x0000008a => "\x2a",
      0x0000008b => "\x2b",
      0x0000008c => "\x2c",
      0x0000008d => "\x09",
      0x0000008e => "\x0a",
      0x0000008f => "\x1b",
      0x00000090 => "\x30",
      0x00000091 => "\x31",
      0x00000092 => "\x1a",
      0x00000093 => "\x33",
      0x00000094 => "\x34",
      0x00000095 => "\x35",
      0x00000096 => "\x36",
      0x00000097 => "\x08",
      0x00000098 => "\x38",
      0x00000099 => "\x39",
      0x0000009a => "\x3a",
      0x0000009b => "\x3b",
      0x0000009c => "\x04",
      0x0000009d => "\x14",
      0x0000009e => "\x3e",
      0x0000009f => "\xff",
      0x000000a3 => "\x7b",
      0x000000a7 => "\x7c",
      0x000000b0 => "\x4a",
      0x000000e0 => "\xc0",
      0x000000e7 => "\xe0",
      0x000000e8 => "\xd0",
      0x000000e9 => "\x5a",
      0x000000ec => "\xa1",
      0x000000f2 => "\x6a",
      0x000000f9 => "\x79",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::EBCDIC_IT - Conversion routines for EBCDIC_IT
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for EBCDIC-IT.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  0000009C | STRING TERMINATOR (ST)
      05 |  00000009 | CHARACTER TABULATION (HT)
      06 |  00000086 | START OF SELECTED AREA (SSA)
      07 |  0000007F | DELETE (DEL)
      08 |  00000097 | END OF GUARDED AREA (EPA)
      09 |  0000008D | REVERSE LINE FEED (RI)
      0A |  0000008E | SINGLE-SHIFT TWO (SS2)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  0000009D | OPERATING SYSTEM COMMAND (OSC)
      15 |  00000085 | NEXT LINE (NEL)
      16 |  00000008 | BACKSPACE (BS)
      17 |  00000087 | END OF SELECTED AREA (ESA)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  00000092 | PRIVATE USE TWO (PU2)
      1B |  0000008F | SINGLE-SHIFT THREE (SS3)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000080 | PADDING CHARACTER (PAD)
      21 |  00000081 | HIGH OCTET PRESET (HOP)
      22 |  00000082 | BREAK PERMITTED HERE (BPH)
      23 |  00000083 | NO BREAK HERE (NBH)
      24 |  00000084 | INDEX (IND)
      25 |  0000000A | LINE FEED (LF)
      26 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      27 |  0000001B | ESCAPE (ESC)
      28 |  00000088 | CHARACTER TABULATION SET (HTS)
      29 |  00000089 | CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
      2A |  0000008A | LINE TABULATION SET (VTS)
      2B |  0000008B | PARTIAL LINE FORWARD (PLD)
      2C |  0000008C | PARTIAL LINE BACKWARD (PLU)
      2D |  00000005 | ENQUIRY (ENQ)
      2E |  00000006 | ACKNOWLEDGE (ACK)
      2F |  00000007 | BELL (BEL)
      30 |  00000090 | DEVICE CONTROL STRING (DCS)
      31 |  00000091 | PRIVATE USE ONE (PU1)
      32 |  00000016 | SYNCHRONOUS IDLE (SYN)
      33 |  00000093 | SET TRANSMIT STATE (STS)
      34 |  00000094 | CANCEL CHARACTER (CCH)
      35 |  00000095 | MESSAGE WAITING (MW)
      36 |  00000096 | START OF GUARDED AREA (SPA)
      37 |  00000004 | END OF TRANSMISSION (EOT)
      38 |  00000098 | START OF STRING (SOS)
      39 |  00000099 | SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
      3A |  0000009A | SINGLE CHARACTER INTRODUCER (SCI)
      3B |  0000009B | CONTROL SEQUENCE INTRODUCER (CSI)
      3C |  00000014 | DEVICE CONTROL FOUR (DC4)
      3D |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      3E |  0000009E | PRIVACY MESSAGE (PM)
      3F |  0000001A | SUBSTITUTE (SUB)
      40 |  00000020 | SPACE
      4A |  000000B0 | DEGREE SIGN
      4B |  0000002E | FULL STOP
      4C |  0000003C | LESS-THAN SIGN
      4D |  00000028 | LEFT PARENTHESIS
      4E |  0000002B | PLUS SIGN
      4F |  00000021 | EXCLAMATION MARK
      50 |  00000026 | AMPERSAND
      5A |  000000E9 | LATIN SMALL LETTER E WITH ACUTE
      5B |  00000024 | DOLLAR SIGN
      5C |  0000002A | ASTERISK
      5D |  00000029 | RIGHT PARENTHESIS
      5E |  0000003B | SEMICOLON
      5F |  0000005E | CIRCUMFLEX ACCENT
      60 |  0000002D | HYPHEN-MINUS
      61 |  0000002F | SOLIDUS
      6A |  000000F2 | LATIN SMALL LETTER O WITH GRAVE
      6B |  0000002C | COMMA
      6C |  00000025 | PERCENT SIGN
      6D |  0000005F | LOW LINE
      6E |  0000003E | GREATER-THAN SIGN
      6F |  0000003F | QUESTION MARK
      79 |  000000F9 | LATIN SMALL LETTER U WITH GRAVE
      7A |  0000003A | COLON
      7B |  000000A3 | POUND SIGN
      7C |  000000A7 | SECTION SIGN
      7D |  00000027 | APOSTROPHE
      7E |  0000003D | EQUALS SIGN
      7F |  00000022 | QUOTATION MARK
      81 |  00000061 | LATIN SMALL LETTER A
      82 |  00000062 | LATIN SMALL LETTER B
      83 |  00000063 | LATIN SMALL LETTER C
      84 |  00000064 | LATIN SMALL LETTER D
      85 |  00000065 | LATIN SMALL LETTER E
      86 |  00000066 | LATIN SMALL LETTER F
      87 |  00000067 | LATIN SMALL LETTER G
      88 |  00000068 | LATIN SMALL LETTER H
      89 |  00000069 | LATIN SMALL LETTER I
      91 |  0000006A | LATIN SMALL LETTER J
      92 |  0000006B | LATIN SMALL LETTER K
      93 |  0000006C | LATIN SMALL LETTER L
      94 |  0000006D | LATIN SMALL LETTER M
      95 |  0000006E | LATIN SMALL LETTER N
      96 |  0000006F | LATIN SMALL LETTER O
      97 |  00000070 | LATIN SMALL LETTER P
      98 |  00000071 | LATIN SMALL LETTER Q
      99 |  00000072 | LATIN SMALL LETTER R
      A1 |  000000EC | LATIN SMALL LETTER I WITH GRAVE
      A2 |  00000073 | LATIN SMALL LETTER S
      A3 |  00000074 | LATIN SMALL LETTER T
      A4 |  00000075 | LATIN SMALL LETTER U
      A5 |  00000076 | LATIN SMALL LETTER V
      A6 |  00000077 | LATIN SMALL LETTER W
      A7 |  00000078 | LATIN SMALL LETTER X
      A8 |  00000079 | LATIN SMALL LETTER Y
      A9 |  0000007A | LATIN SMALL LETTER Z
      C0 |  000000E0 | LATIN SMALL LETTER A WITH GRAVE
      C1 |  00000041 | LATIN CAPITAL LETTER A
      C2 |  00000042 | LATIN CAPITAL LETTER B
      C3 |  00000043 | LATIN CAPITAL LETTER C
      C4 |  00000044 | LATIN CAPITAL LETTER D
      C5 |  00000045 | LATIN CAPITAL LETTER E
      C6 |  00000046 | LATIN CAPITAL LETTER F
      C7 |  00000047 | LATIN CAPITAL LETTER G
      C8 |  00000048 | LATIN CAPITAL LETTER H
      C9 |  00000049 | LATIN CAPITAL LETTER I
      D0 |  000000E8 | LATIN SMALL LETTER E WITH GRAVE
      D1 |  0000004A | LATIN CAPITAL LETTER J
      D2 |  0000004B | LATIN CAPITAL LETTER K
      D3 |  0000004C | LATIN CAPITAL LETTER L
      D4 |  0000004D | LATIN CAPITAL LETTER M
      D5 |  0000004E | LATIN CAPITAL LETTER N
      D6 |  0000004F | LATIN CAPITAL LETTER O
      D7 |  00000050 | LATIN CAPITAL LETTER P
      D8 |  00000051 | LATIN CAPITAL LETTER Q
      D9 |  00000052 | LATIN CAPITAL LETTER R
      E0 |  000000E7 | LATIN SMALL LETTER C WITH CEDILLA
      E2 |  00000053 | LATIN CAPITAL LETTER S
      E3 |  00000054 | LATIN CAPITAL LETTER T
      E4 |  00000055 | LATIN CAPITAL LETTER U
      E5 |  00000056 | LATIN CAPITAL LETTER V
      E6 |  00000057 | LATIN CAPITAL LETTER W
      E7 |  00000058 | LATIN CAPITAL LETTER X
      E8 |  00000059 | LATIN CAPITAL LETTER Y
      E9 |  0000005A | LATIN CAPITAL LETTER Z
      F0 |  00000030 | DIGIT ZERO
      F1 |  00000031 | DIGIT ONE
      F2 |  00000032 | DIGIT TWO
      F3 |  00000033 | DIGIT THREE
      F4 |  00000034 | DIGIT FOUR
      F5 |  00000035 | DIGIT FIVE
      F6 |  00000036 | DIGIT SIX
      F7 |  00000037 | DIGIT SEVEN
      F8 |  00000038 | DIGIT EIGHT
      F9 |  00000039 | DIGIT NINE
      FF |  0000009F | APPLICATION PROGRAM COMMAND (APC)
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_EBCDIC_IT

    $main::fatpacked{"Locale/RecodeData/EBCDIC_PT.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_EBCDIC_PT';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for EBCDIC-PT.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::EBCDIC_PT;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x009c,
      0x0009,
      0x0086,
      0x007f,
      0x0097,
      0x008d,
      0x008e,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x009d,
      0x0085,
      0x0008,
      0x0087,
      0x0018,
      0x0019,
      0x0092,
      0x008f,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0080,
      0x0081,
      0x0082,
      0x0083,
      0x0084,
      0x000a,
      0x0017,
      0x001b,
      0x0088,
      0x0089,
      0x008a,
      0x008b,
      0x008c,
      0x0005,
      0x0006,
      0x0007,
      0x0090,
      0x0091,
      0x0016,
      0x0093,
      0x0094,
      0x0095,
      0x0096,
      0x0004,
      0x0098,
      0x0099,
      0x009a,
      0x009b,
      0x0014,
      0x0015,
      0x009e,
      0x001a,
      0x0020,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x005b,
      0x002e,
      0x003c,
      0x0028,
      0x002b,
      0x0021,
      0x0026,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x005d,
      0x0024,
      0x002a,
      0x0029,
      0x003b,
      0x005e,
      0x002d,
      0x002f,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00f5,
      0x002c,
      0x0025,
      0x005f,
      0x003e,
      0x003f,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0060,
      0x003a,
      0x00c3,
      0x00d5,
      0x0027,
      0x003d,
      0x0022,
      0xfffd,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00e7,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00e3,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00b4,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00c7,
      0xfffd,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x009f,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\xc2\x9c",
      "\x09",
      "\xc2\x86",
      "\x7f",
      "\xc2\x97",
      "\xc2\x8d",
      "\xc2\x8e",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\xc2\x9d",
      "\xc2\x85",
      "\x08",
      "\xc2\x87",
      "\x18",
      "\x19",
      "\xc2\x92",
      "\xc2\x8f",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\xc2\x80",
      "\xc2\x81",
      "\xc2\x82",
      "\xc2\x83",
      "\xc2\x84",
      "\x0a",
      "\x17",
      "\x1b",
      "\xc2\x88",
      "\xc2\x89",
      "\xc2\x8a",
      "\xc2\x8b",
      "\xc2\x8c",
      "\x05",
      "\x06",
      "\x07",
      "\xc2\x90",
      "\xc2\x91",
      "\x16",
      "\xc2\x93",
      "\xc2\x94",
      "\xc2\x95",
      "\xc2\x96",
      "\x04",
      "\xc2\x98",
      "\xc2\x99",
      "\xc2\x9a",
      "\xc2\x9b",
      "\x14",
      "\x15",
      "\xc2\x9e",
      "\x1a",
      "\x20",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x5b",
      "\x2e",
      "\x3c",
      "\x28",
      "\x2b",
      "\x21",
      "\x26",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x5d",
      "\x24",
      "\x2a",
      "\x29",
      "\x3b",
      "\x5e",
      "\x2d",
      "\x2f",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc3\xb5",
      "\x2c",
      "\x25",
      "\x5f",
      "\x3e",
      "\x3f",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x60",
      "\x3a",
      "\xc3\x83",
      "\xc3\x95",
      "\x27",
      "\x3d",
      "\x22",
      "\xef\xbf\xbd",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc3\xa7",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc3\xa3",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc2\xb4",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc3\x87",
      "\xef\xbf\xbd",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc2\x9f",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x37",
      0x00000005 => "\x2d",
      0x00000006 => "\x2e",
      0x00000007 => "\x2f",
      0x00000008 => "\x16",
      0x00000009 => "\x05",
      0x0000000a => "\x25",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x3c",
      0x00000015 => "\x3d",
      0x00000016 => "\x32",
      0x00000017 => "\x26",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x3f",
      0x0000001b => "\x27",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x40",
      0x00000021 => "\x4f",
      0x00000022 => "\x7f",
      0x00000024 => "\x5b",
      0x00000025 => "\x6c",
      0x00000026 => "\x50",
      0x00000027 => "\x7d",
      0x00000028 => "\x4d",
      0x00000029 => "\x5d",
      0x0000002a => "\x5c",
      0x0000002b => "\x4e",
      0x0000002c => "\x6b",
      0x0000002d => "\x60",
      0x0000002e => "\x4b",
      0x0000002f => "\x61",
      0x00000030 => "\xf0",
      0x00000031 => "\xf1",
      0x00000032 => "\xf2",
      0x00000033 => "\xf3",
      0x00000034 => "\xf4",
      0x00000035 => "\xf5",
      0x00000036 => "\xf6",
      0x00000037 => "\xf7",
      0x00000038 => "\xf8",
      0x00000039 => "\xf9",
      0x0000003a => "\x7a",
      0x0000003b => "\x5e",
      0x0000003c => "\x4c",
      0x0000003d => "\x7e",
      0x0000003e => "\x6e",
      0x0000003f => "\x6f",
      0x00000041 => "\xc1",
      0x00000042 => "\xc2",
      0x00000043 => "\xc3",
      0x00000044 => "\xc4",
      0x00000045 => "\xc5",
      0x00000046 => "\xc6",
      0x00000047 => "\xc7",
      0x00000048 => "\xc8",
      0x00000049 => "\xc9",
      0x0000004a => "\xd1",
      0x0000004b => "\xd2",
      0x0000004c => "\xd3",
      0x0000004d => "\xd4",
      0x0000004e => "\xd5",
      0x0000004f => "\xd6",
      0x00000050 => "\xd7",
      0x00000051 => "\xd8",
      0x00000052 => "\xd9",
      0x00000053 => "\xe2",
      0x00000054 => "\xe3",
      0x00000055 => "\xe4",
      0x00000056 => "\xe5",
      0x00000057 => "\xe6",
      0x00000058 => "\xe7",
      0x00000059 => "\xe8",
      0x0000005a => "\xe9",
      0x0000005b => "\x4a",
      0x0000005d => "\x5a",
      0x0000005e => "\x5f",
      0x0000005f => "\x6d",
      0x00000060 => "\x79",
      0x00000061 => "\x81",
      0x00000062 => "\x82",
      0x00000063 => "\x83",
      0x00000064 => "\x84",
      0x00000065 => "\x85",
      0x00000066 => "\x86",
      0x00000067 => "\x87",
      0x00000068 => "\x88",
      0x00000069 => "\x89",
      0x0000006a => "\x91",
      0x0000006b => "\x92",
      0x0000006c => "\x93",
      0x0000006d => "\x94",
      0x0000006e => "\x95",
      0x0000006f => "\x96",
      0x00000070 => "\x97",
      0x00000071 => "\x98",
      0x00000072 => "\x99",
      0x00000073 => "\xa2",
      0x00000074 => "\xa3",
      0x00000075 => "\xa4",
      0x00000076 => "\xa5",
      0x00000077 => "\xa6",
      0x00000078 => "\xa7",
      0x00000079 => "\xa8",
      0x0000007a => "\xa9",
      0x0000007f => "\x07",
      0x00000080 => "\x20",
      0x00000081 => "\x21",
      0x00000082 => "\x22",
      0x00000083 => "\x23",
      0x00000084 => "\x24",
      0x00000085 => "\x15",
      0x00000086 => "\x06",
      0x00000087 => "\x17",
      0x00000088 => "\x28",
      0x00000089 => "\x29",
      0x0000008a => "\x2a",
      0x0000008b => "\x2b",
      0x0000008c => "\x2c",
      0x0000008d => "\x09",
      0x0000008e => "\x0a",
      0x0000008f => "\x1b",
      0x00000090 => "\x30",
      0x00000091 => "\x31",
      0x00000092 => "\x1a",
      0x00000093 => "\x33",
      0x00000094 => "\x34",
      0x00000095 => "\x35",
      0x00000096 => "\x36",
      0x00000097 => "\x08",
      0x00000098 => "\x38",
      0x00000099 => "\x39",
      0x0000009a => "\x3a",
      0x0000009b => "\x3b",
      0x0000009c => "\x04",
      0x0000009d => "\x14",
      0x0000009e => "\x3e",
      0x0000009f => "\xff",
      0x000000b4 => "\xd0",
      0x000000c3 => "\x7b",
      0x000000c7 => "\xe0",
      0x000000d5 => "\x7c",
      0x000000e3 => "\xc0",
      0x000000e7 => "\xa1",
      0x000000f5 => "\x6a",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::EBCDIC_PT - Conversion routines for EBCDIC_PT
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for EBCDIC-PT.
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  0000009C | STRING TERMINATOR (ST)
      05 |  00000009 | CHARACTER TABULATION (HT)
      06 |  00000086 | START OF SELECTED AREA (SSA)
      07 |  0000007F | DELETE (DEL)
      08 |  00000097 | END OF GUARDED AREA (EPA)
      09 |  0000008D | REVERSE LINE FEED (RI)
      0A |  0000008E | SINGLE-SHIFT TWO (SS2)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  0000009D | OPERATING SYSTEM COMMAND (OSC)
      15 |  00000085 | NEXT LINE (NEL)
      16 |  00000008 | BACKSPACE (BS)
      17 |  00000087 | END OF SELECTED AREA (ESA)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  00000092 | PRIVATE USE TWO (PU2)
      1B |  0000008F | SINGLE-SHIFT THREE (SS3)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000080 | PADDING CHARACTER (PAD)
      21 |  00000081 | HIGH OCTET PRESET (HOP)
      22 |  00000082 | BREAK PERMITTED HERE (BPH)
      23 |  00000083 | NO BREAK HERE (NBH)
      24 |  00000084 | INDEX (IND)
      25 |  0000000A | LINE FEED (LF)
      26 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      27 |  0000001B | ESCAPE (ESC)
      28 |  00000088 | CHARACTER TABULATION SET (HTS)
      29 |  00000089 | CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
      2A |  0000008A | LINE TABULATION SET (VTS)
      2B |  0000008B | PARTIAL LINE FORWARD (PLD)
      2C |  0000008C | PARTIAL LINE BACKWARD (PLU)
      2D |  00000005 | ENQUIRY (ENQ)
      2E |  00000006 | ACKNOWLEDGE (ACK)
      2F |  00000007 | BELL (BEL)
      30 |  00000090 | DEVICE CONTROL STRING (DCS)
      31 |  00000091 | PRIVATE USE ONE (PU1)
      32 |  00000016 | SYNCHRONOUS IDLE (SYN)
      33 |  00000093 | SET TRANSMIT STATE (STS)
      34 |  00000094 | CANCEL CHARACTER (CCH)
      35 |  00000095 | MESSAGE WAITING (MW)
      36 |  00000096 | START OF GUARDED AREA (SPA)
      37 |  00000004 | END OF TRANSMISSION (EOT)
      38 |  00000098 | START OF STRING (SOS)
      39 |  00000099 | SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
      3A |  0000009A | SINGLE CHARACTER INTRODUCER (SCI)
      3B |  0000009B | CONTROL SEQUENCE INTRODUCER (CSI)
      3C |  00000014 | DEVICE CONTROL FOUR (DC4)
      3D |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      3E |  0000009E | PRIVACY MESSAGE (PM)
      3F |  0000001A | SUBSTITUTE (SUB)
      40 |  00000020 | SPACE
      4A |  0000005B | LEFT SQUARE BRACKET
      4B |  0000002E | FULL STOP
      4C |  0000003C | LESS-THAN SIGN
      4D |  00000028 | LEFT PARENTHESIS
      4E |  0000002B | PLUS SIGN
      4F |  00000021 | EXCLAMATION MARK
      50 |  00000026 | AMPERSAND
      5A |  0000005D | RIGHT SQUARE BRACKET
      5B |  00000024 | DOLLAR SIGN
      5C |  0000002A | ASTERISK
      5D |  00000029 | RIGHT PARENTHESIS
      5E |  0000003B | SEMICOLON
      5F |  0000005E | CIRCUMFLEX ACCENT
      60 |  0000002D | HYPHEN-MINUS
      61 |  0000002F | SOLIDUS
      6A |  000000F5 | LATIN SMALL LETTER O WITH TILDE
      6B |  0000002C | COMMA
      6C |  00000025 | PERCENT SIGN
      6D |  0000005F | LOW LINE
      6E |  0000003E | GREATER-THAN SIGN
      6F |  0000003F | QUESTION MARK
      79 |  00000060 | GRAVE ACCENT
      7A |  0000003A | COLON
      7B |  000000C3 | LATIN CAPITAL LETTER A WITH TILDE
      7C |  000000D5 | LATIN CAPITAL LETTER O WITH TILDE
      7D |  00000027 | APOSTROPHE
      7E |  0000003D | EQUALS SIGN
      7F |  00000022 | QUOTATION MARK
      81 |  00000061 | LATIN SMALL LETTER A
      82 |  00000062 | LATIN SMALL LETTER B
      83 |  00000063 | LATIN SMALL LETTER C
      84 |  00000064 | LATIN SMALL LETTER D
      85 |  00000065 | LATIN SMALL LETTER E
      86 |  00000066 | LATIN SMALL LETTER F
      87 |  00000067 | LATIN SMALL LETTER G
      88 |  00000068 | LATIN SMALL LETTER H
      89 |  00000069 | LATIN SMALL LETTER I
      91 |  0000006A | LATIN SMALL LETTER J
      92 |  0000006B | LATIN SMALL LETTER K
      93 |  0000006C | LATIN SMALL LETTER L
      94 |  0000006D | LATIN SMALL LETTER M
      95 |  0000006E | LATIN SMALL LETTER N
      96 |  0000006F | LATIN SMALL LETTER O
      97 |  00000070 | LATIN SMALL LETTER P
      98 |  00000071 | LATIN SMALL LETTER Q
      99 |  00000072 | LATIN SMALL LETTER R
      A1 |  000000E7 | LATIN SMALL LETTER C WITH CEDILLA
      A2 |  00000073 | LATIN SMALL LETTER S
      A3 |  00000074 | LATIN SMALL LETTER T
      A4 |  00000075 | LATIN SMALL LETTER U
      A5 |  00000076 | LATIN SMALL LETTER V
      A6 |  00000077 | LATIN SMALL LETTER W
      A7 |  00000078 | LATIN SMALL LETTER X
      A8 |  00000079 | LATIN SMALL LETTER Y
      A9 |  0000007A | LATIN SMALL LETTER Z
      C0 |  000000E3 | LATIN SMALL LETTER A WITH TILDE
      C1 |  00000041 | LATIN CAPITAL LETTER A
      C2 |  00000042 | LATIN CAPITAL LETTER B
      C3 |  00000043 | LATIN CAPITAL LETTER C
      C4 |  00000044 | LATIN CAPITAL LETTER D
      C5 |  00000045 | LATIN CAPITAL LETTER E
      C6 |  00000046 | LATIN CAPITAL LETTER F
      C7 |  00000047 | LATIN CAPITAL LETTER G
      C8 |  00000048 | LATIN CAPITAL LETTER H
      C9 |  00000049 | LATIN CAPITAL LETTER I
      D0 |  000000B4 | ACUTE ACCENT
      D1 |  0000004A | LATIN CAPITAL LETTER J
      D2 |  0000004B | LATIN CAPITAL LETTER K
      D3 |  0000004C | LATIN CAPITAL LETTER L
      D4 |  0000004D | LATIN CAPITAL LETTER M
      D5 |  0000004E | LATIN CAPITAL LETTER N
      D6 |  0000004F | LATIN CAPITAL LETTER O
      D7 |  00000050 | LATIN CAPITAL LETTER P
      D8 |  00000051 | LATIN CAPITAL LETTER Q
      D9 |  00000052 | LATIN CAPITAL LETTER R
      E0 |  000000C7 | LATIN CAPITAL LETTER C WITH CEDILLA
      E2 |  00000053 | LATIN CAPITAL LETTER S
      E3 |  00000054 | LATIN CAPITAL LETTER T
      E4 |  00000055 | LATIN CAPITAL LETTER U
      E5 |  00000056 | LATIN CAPITAL LETTER V
      E6 |  00000057 | LATIN CAPITAL LETTER W
      E7 |  00000058 | LATIN CAPITAL LETTER X
      E8 |  00000059 | LATIN CAPITAL LETTER Y
      E9 |  0000005A | LATIN CAPITAL LETTER Z
      F0 |  00000030 | DIGIT ZERO
      F1 |  00000031 | DIGIT ONE
      F2 |  00000032 | DIGIT TWO
      F3 |  00000033 | DIGIT THREE
      F4 |  00000034 | DIGIT FOUR
      F5 |  00000035 | DIGIT FIVE
      F6 |  00000036 | DIGIT SIX
      F7 |  00000037 | DIGIT SEVEN
      F8 |  00000038 | DIGIT EIGHT
      F9 |  00000039 | DIGIT NINE
      FF |  0000009F | APPLICATION PROGRAM COMMAND (APC)
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_EBCDIC_PT

    $main::fatpacked{"Locale/RecodeData/EBCDIC_UK.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_EBCDIC_UK';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for EBCDIC-UK.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::EBCDIC_UK;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x009c,
      0x0009,
      0x0086,
      0x007f,
      0x0097,
      0x008d,
      0x008e,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x009d,
      0x0085,
      0x0008,
      0x0087,
      0x0018,
      0x0019,
      0x0092,
      0x008f,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0080,
      0x0081,
      0x0082,
      0x0083,
      0x0084,
      0x000a,
      0x0017,
      0x001b,
      0x0088,
      0x0089,
      0x008a,
      0x008b,
      0x008c,
      0x0005,
      0x0006,
      0x0007,
      0x0090,
      0x0091,
      0x0016,
      0x0093,
      0x0094,
      0x0095,
      0x0096,
      0x0004,
      0x0098,
      0x0099,
      0x009a,
      0x009b,
      0x0014,
      0x0015,
      0x009e,
      0x001a,
      0x0020,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0024,
      0x002e,
      0x003c,
      0x0028,
      0x002b,
      0x007c,
      0x0026,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0021,
      0x00a3,
      0x002a,
      0x0029,
      0x003b,
      0x00ac,
      0x002d,
      0x002f,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00a6,
      0x002c,
      0x0025,
      0x005f,
      0x003e,
      0x003f,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0060,
      0x003a,
      0x0023,
      0x0040,
      0x0027,
      0x003d,
      0x0022,
      0xfffd,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x203e,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x007b,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x007d,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x005c,
      0xfffd,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x009f,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\xc2\x9c",
      "\x09",
      "\xc2\x86",
      "\x7f",
      "\xc2\x97",
      "\xc2\x8d",
      "\xc2\x8e",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\xc2\x9d",
      "\xc2\x85",
      "\x08",
      "\xc2\x87",
      "\x18",
      "\x19",
      "\xc2\x92",
      "\xc2\x8f",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\xc2\x80",
      "\xc2\x81",
      "\xc2\x82",
      "\xc2\x83",
      "\xc2\x84",
      "\x0a",
      "\x17",
      "\x1b",
      "\xc2\x88",
      "\xc2\x89",
      "\xc2\x8a",
      "\xc2\x8b",
      "\xc2\x8c",
      "\x05",
      "\x06",
      "\x07",
      "\xc2\x90",
      "\xc2\x91",
      "\x16",
      "\xc2\x93",
      "\xc2\x94",
      "\xc2\x95",
      "\xc2\x96",
      "\x04",
      "\xc2\x98",
      "\xc2\x99",
      "\xc2\x9a",
      "\xc2\x9b",
      "\x14",
      "\x15",
      "\xc2\x9e",
      "\x1a",
      "\x20",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x24",
      "\x2e",
      "\x3c",
      "\x28",
      "\x2b",
      "\x7c",
      "\x26",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x21",
      "\xc2\xa3",
      "\x2a",
      "\x29",
      "\x3b",
      "\xc2\xac",
      "\x2d",
      "\x2f",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc2\xa6",
      "\x2c",
      "\x25",
      "\x5f",
      "\x3e",
      "\x3f",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x60",
      "\x3a",
      "\x23",
      "\x40",
      "\x27",
      "\x3d",
      "\x22",
      "\xef\xbf\xbd",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xe2\x80\xbe",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x7b",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x7d",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x5c",
      "\xef\xbf\xbd",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc2\x9f",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x37",
      0x00000005 => "\x2d",
      0x00000006 => "\x2e",
      0x00000007 => "\x2f",
      0x00000008 => "\x16",
      0x00000009 => "\x05",
      0x0000000a => "\x25",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x3c",
      0x00000015 => "\x3d",
      0x00000016 => "\x32",
      0x00000017 => "\x26",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x3f",
      0x0000001b => "\x27",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x40",
      0x00000021 => "\x5a",
      0x00000022 => "\x7f",
      0x00000023 => "\x7b",
      0x00000024 => "\x4a",
      0x00000025 => "\x6c",
      0x00000026 => "\x50",
      0x00000027 => "\x7d",
      0x00000028 => "\x4d",
      0x00000029 => "\x5d",
      0x0000002a => "\x5c",
      0x0000002b => "\x4e",
      0x0000002c => "\x6b",
      0x0000002d => "\x60",
      0x0000002e => "\x4b",
      0x0000002f => "\x61",
      0x00000030 => "\xf0",
      0x00000031 => "\xf1",
      0x00000032 => "\xf2",
      0x00000033 => "\xf3",
      0x00000034 => "\xf4",
      0x00000035 => "\xf5",
      0x00000036 => "\xf6",
      0x00000037 => "\xf7",
      0x00000038 => "\xf8",
      0x00000039 => "\xf9",
      0x0000003a => "\x7a",
      0x0000003b => "\x5e",
      0x0000003c => "\x4c",
      0x0000003d => "\x7e",
      0x0000003e => "\x6e",
      0x0000003f => "\x6f",
      0x00000040 => "\x7c",
      0x00000041 => "\xc1",
      0x00000042 => "\xc2",
      0x00000043 => "\xc3",
      0x00000044 => "\xc4",
      0x00000045 => "\xc5",
      0x00000046 => "\xc6",
      0x00000047 => "\xc7",
      0x00000048 => "\xc8",
      0x00000049 => "\xc9",
      0x0000004a => "\xd1",
      0x0000004b => "\xd2",
      0x0000004c => "\xd3",
      0x0000004d => "\xd4",
      0x0000004e => "\xd5",
      0x0000004f => "\xd6",
      0x00000050 => "\xd7",
      0x00000051 => "\xd8",
      0x00000052 => "\xd9",
      0x00000053 => "\xe2",
      0x00000054 => "\xe3",
      0x00000055 => "\xe4",
      0x00000056 => "\xe5",
      0x00000057 => "\xe6",
      0x00000058 => "\xe7",
      0x00000059 => "\xe8",
      0x0000005a => "\xe9",
      0x0000005c => "\xe0",
      0x0000005f => "\x6d",
      0x00000060 => "\x79",
      0x00000061 => "\x81",
      0x00000062 => "\x82",
      0x00000063 => "\x83",
      0x00000064 => "\x84",
      0x00000065 => "\x85",
      0x00000066 => "\x86",
      0x00000067 => "\x87",
      0x00000068 => "\x88",
      0x00000069 => "\x89",
      0x0000006a => "\x91",
      0x0000006b => "\x92",
      0x0000006c => "\x93",
      0x0000006d => "\x94",
      0x0000006e => "\x95",
      0x0000006f => "\x96",
      0x00000070 => "\x97",
      0x00000071 => "\x98",
      0x00000072 => "\x99",
      0x00000073 => "\xa2",
      0x00000074 => "\xa3",
      0x00000075 => "\xa4",
      0x00000076 => "\xa5",
      0x00000077 => "\xa6",
      0x00000078 => "\xa7",
      0x00000079 => "\xa8",
      0x0000007a => "\xa9",
      0x0000007b => "\xc0",
      0x0000007c => "\x4f",
      0x0000007d => "\xd0",
      0x0000007f => "\x07",
      0x00000080 => "\x20",
      0x00000081 => "\x21",
      0x00000082 => "\x22",
      0x00000083 => "\x23",
      0x00000084 => "\x24",
      0x00000085 => "\x15",
      0x00000086 => "\x06",
      0x00000087 => "\x17",
      0x00000088 => "\x28",
      0x00000089 => "\x29",
      0x0000008a => "\x2a",
      0x0000008b => "\x2b",
      0x0000008c => "\x2c",
      0x0000008d => "\x09",
      0x0000008e => "\x0a",
      0x0000008f => "\x1b",
      0x00000090 => "\x30",
      0x00000091 => "\x31",
      0x00000092 => "\x1a",
      0x00000093 => "\x33",
      0x00000094 => "\x34",
      0x00000095 => "\x35",
      0x00000096 => "\x36",
      0x00000097 => "\x08",
      0x00000098 => "\x38",
      0x00000099 => "\x39",
      0x0000009a => "\x3a",
      0x0000009b => "\x3b",
      0x0000009c => "\x04",
      0x0000009d => "\x14",
      0x0000009e => "\x3e",
      0x0000009f => "\xff",
      0x000000a3 => "\x5b",
      0x000000a6 => "\x6a",
      0x000000ac => "\x5f",
      0x0000203e => "\xa1",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::EBCDIC_UK - Conversion routines for EBCDIC_UK
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for EBCDIC-UK.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  0000009C | STRING TERMINATOR (ST)
      05 |  00000009 | CHARACTER TABULATION (HT)
      06 |  00000086 | START OF SELECTED AREA (SSA)
      07 |  0000007F | DELETE (DEL)
      08 |  00000097 | END OF GUARDED AREA (EPA)
      09 |  0000008D | REVERSE LINE FEED (RI)
      0A |  0000008E | SINGLE-SHIFT TWO (SS2)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  0000009D | OPERATING SYSTEM COMMAND (OSC)
      15 |  00000085 | NEXT LINE (NEL)
      16 |  00000008 | BACKSPACE (BS)
      17 |  00000087 | END OF SELECTED AREA (ESA)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  00000092 | PRIVATE USE TWO (PU2)
      1B |  0000008F | SINGLE-SHIFT THREE (SS3)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000080 | PADDING CHARACTER (PAD)
      21 |  00000081 | HIGH OCTET PRESET (HOP)
      22 |  00000082 | BREAK PERMITTED HERE (BPH)
      23 |  00000083 | NO BREAK HERE (NBH)
      24 |  00000084 | INDEX (IND)
      25 |  0000000A | LINE FEED (LF)
      26 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      27 |  0000001B | ESCAPE (ESC)
      28 |  00000088 | CHARACTER TABULATION SET (HTS)
      29 |  00000089 | CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
      2A |  0000008A | LINE TABULATION SET (VTS)
      2B |  0000008B | PARTIAL LINE FORWARD (PLD)
      2C |  0000008C | PARTIAL LINE BACKWARD (PLU)
      2D |  00000005 | ENQUIRY (ENQ)
      2E |  00000006 | ACKNOWLEDGE (ACK)
      2F |  00000007 | BELL (BEL)
      30 |  00000090 | DEVICE CONTROL STRING (DCS)
      31 |  00000091 | PRIVATE USE ONE (PU1)
      32 |  00000016 | SYNCHRONOUS IDLE (SYN)
      33 |  00000093 | SET TRANSMIT STATE (STS)
      34 |  00000094 | CANCEL CHARACTER (CCH)
      35 |  00000095 | MESSAGE WAITING (MW)
      36 |  00000096 | START OF GUARDED AREA (SPA)
      37 |  00000004 | END OF TRANSMISSION (EOT)
      38 |  00000098 | START OF STRING (SOS)
      39 |  00000099 | SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
      3A |  0000009A | SINGLE CHARACTER INTRODUCER (SCI)
      3B |  0000009B | CONTROL SEQUENCE INTRODUCER (CSI)
      3C |  00000014 | DEVICE CONTROL FOUR (DC4)
      3D |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      3E |  0000009E | PRIVACY MESSAGE (PM)
      3F |  0000001A | SUBSTITUTE (SUB)
      40 |  00000020 | SPACE
      4A |  00000024 | DOLLAR SIGN
      4B |  0000002E | FULL STOP
      4C |  0000003C | LESS-THAN SIGN
      4D |  00000028 | LEFT PARENTHESIS
      4E |  0000002B | PLUS SIGN
      4F |  0000007C | VERTICAL LINE
      50 |  00000026 | AMPERSAND
      5A |  00000021 | EXCLAMATION MARK
      5B |  000000A3 | POUND SIGN
      5C |  0000002A | ASTERISK
      5D |  00000029 | RIGHT PARENTHESIS
      5E |  0000003B | SEMICOLON
      5F |  000000AC | NOT SIGN
      60 |  0000002D | HYPHEN-MINUS
      61 |  0000002F | SOLIDUS
      6A |  000000A6 | BROKEN BAR
      6B |  0000002C | COMMA
      6C |  00000025 | PERCENT SIGN
      6D |  0000005F | LOW LINE
      6E |  0000003E | GREATER-THAN SIGN
      6F |  0000003F | QUESTION MARK
      79 |  00000060 | GRAVE ACCENT
      7A |  0000003A | COLON
      7B |  00000023 | NUMBER SIGN
      7C |  00000040 | COMMERCIAL AT
      7D |  00000027 | APOSTROPHE
      7E |  0000003D | EQUALS SIGN
      7F |  00000022 | QUOTATION MARK
      81 |  00000061 | LATIN SMALL LETTER A
      82 |  00000062 | LATIN SMALL LETTER B
      83 |  00000063 | LATIN SMALL LETTER C
      84 |  00000064 | LATIN SMALL LETTER D
      85 |  00000065 | LATIN SMALL LETTER E
      86 |  00000066 | LATIN SMALL LETTER F
      87 |  00000067 | LATIN SMALL LETTER G
      88 |  00000068 | LATIN SMALL LETTER H
      89 |  00000069 | LATIN SMALL LETTER I
      91 |  0000006A | LATIN SMALL LETTER J
      92 |  0000006B | LATIN SMALL LETTER K
      93 |  0000006C | LATIN SMALL LETTER L
      94 |  0000006D | LATIN SMALL LETTER M
      95 |  0000006E | LATIN SMALL LETTER N
      96 |  0000006F | LATIN SMALL LETTER O
      97 |  00000070 | LATIN SMALL LETTER P
      98 |  00000071 | LATIN SMALL LETTER Q
      99 |  00000072 | LATIN SMALL LETTER R
      A1 |  0000203E | OVERLINE
      A2 |  00000073 | LATIN SMALL LETTER S
      A3 |  00000074 | LATIN SMALL LETTER T
      A4 |  00000075 | LATIN SMALL LETTER U
      A5 |  00000076 | LATIN SMALL LETTER V
      A6 |  00000077 | LATIN SMALL LETTER W
      A7 |  00000078 | LATIN SMALL LETTER X
      A8 |  00000079 | LATIN SMALL LETTER Y
      A9 |  0000007A | LATIN SMALL LETTER Z
      C0 |  0000007B | LEFT CURLY BRACKET
      C1 |  00000041 | LATIN CAPITAL LETTER A
      C2 |  00000042 | LATIN CAPITAL LETTER B
      C3 |  00000043 | LATIN CAPITAL LETTER C
      C4 |  00000044 | LATIN CAPITAL LETTER D
      C5 |  00000045 | LATIN CAPITAL LETTER E
      C6 |  00000046 | LATIN CAPITAL LETTER F
      C7 |  00000047 | LATIN CAPITAL LETTER G
      C8 |  00000048 | LATIN CAPITAL LETTER H
      C9 |  00000049 | LATIN CAPITAL LETTER I
      D0 |  0000007D | RIGHT CURLY BRACKET
      D1 |  0000004A | LATIN CAPITAL LETTER J
      D2 |  0000004B | LATIN CAPITAL LETTER K
      D3 |  0000004C | LATIN CAPITAL LETTER L
      D4 |  0000004D | LATIN CAPITAL LETTER M
      D5 |  0000004E | LATIN CAPITAL LETTER N
      D6 |  0000004F | LATIN CAPITAL LETTER O
      D7 |  00000050 | LATIN CAPITAL LETTER P
      D8 |  00000051 | LATIN CAPITAL LETTER Q
      D9 |  00000052 | LATIN CAPITAL LETTER R
      E0 |  0000005C | REVERSE SOLIDUS
      E2 |  00000053 | LATIN CAPITAL LETTER S
      E3 |  00000054 | LATIN CAPITAL LETTER T
      E4 |  00000055 | LATIN CAPITAL LETTER U
      E5 |  00000056 | LATIN CAPITAL LETTER V
      E6 |  00000057 | LATIN CAPITAL LETTER W
      E7 |  00000058 | LATIN CAPITAL LETTER X
      E8 |  00000059 | LATIN CAPITAL LETTER Y
      E9 |  0000005A | LATIN CAPITAL LETTER Z
      F0 |  00000030 | DIGIT ZERO
      F1 |  00000031 | DIGIT ONE
      F2 |  00000032 | DIGIT TWO
      F3 |  00000033 | DIGIT THREE
      F4 |  00000034 | DIGIT FOUR
      F5 |  00000035 | DIGIT FIVE
      F6 |  00000036 | DIGIT SIX
      F7 |  00000037 | DIGIT SEVEN
      F8 |  00000038 | DIGIT EIGHT
      F9 |  00000039 | DIGIT NINE
      FF |  0000009F | APPLICATION PROGRAM COMMAND (APC)
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_EBCDIC_UK

    $main::fatpacked{"Locale/RecodeData/EBCDIC_US.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_EBCDIC_US';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for EBCDIC-US.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::EBCDIC_US;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x009c,
      0x0009,
      0x0086,
      0x007f,
      0x0097,
      0x008d,
      0x008e,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x009d,
      0x0085,
      0x0008,
      0x0087,
      0x0018,
      0x0019,
      0x0092,
      0x008f,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0080,
      0x0081,
      0x0082,
      0x0083,
      0x0084,
      0x000a,
      0x0017,
      0x001b,
      0x0088,
      0x0089,
      0x008a,
      0x008b,
      0x008c,
      0x0005,
      0x0006,
      0x0007,
      0x0090,
      0x0091,
      0x0016,
      0x0093,
      0x0094,
      0x0095,
      0x0096,
      0x0004,
      0x0098,
      0x0099,
      0x009a,
      0x009b,
      0x0014,
      0x0015,
      0x009e,
      0x001a,
      0x0020,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00a2,
      0x002e,
      0x003c,
      0x0028,
      0x002b,
      0x007c,
      0x0026,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0021,
      0x0024,
      0x002a,
      0x0029,
      0x003b,
      0x00ac,
      0x002d,
      0x002f,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00a6,
      0x002c,
      0x0025,
      0x005f,
      0x003e,
      0x003f,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0060,
      0x003a,
      0x0023,
      0x0040,
      0x0027,
      0x003d,
      0x0022,
      0xfffd,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x007e,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x007b,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x007d,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x005c,
      0xfffd,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x009f,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\xc2\x9c",
      "\x09",
      "\xc2\x86",
      "\x7f",
      "\xc2\x97",
      "\xc2\x8d",
      "\xc2\x8e",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\xc2\x9d",
      "\xc2\x85",
      "\x08",
      "\xc2\x87",
      "\x18",
      "\x19",
      "\xc2\x92",
      "\xc2\x8f",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\xc2\x80",
      "\xc2\x81",
      "\xc2\x82",
      "\xc2\x83",
      "\xc2\x84",
      "\x0a",
      "\x17",
      "\x1b",
      "\xc2\x88",
      "\xc2\x89",
      "\xc2\x8a",
      "\xc2\x8b",
      "\xc2\x8c",
      "\x05",
      "\x06",
      "\x07",
      "\xc2\x90",
      "\xc2\x91",
      "\x16",
      "\xc2\x93",
      "\xc2\x94",
      "\xc2\x95",
      "\xc2\x96",
      "\x04",
      "\xc2\x98",
      "\xc2\x99",
      "\xc2\x9a",
      "\xc2\x9b",
      "\x14",
      "\x15",
      "\xc2\x9e",
      "\x1a",
      "\x20",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc2\xa2",
      "\x2e",
      "\x3c",
      "\x28",
      "\x2b",
      "\x7c",
      "\x26",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x21",
      "\x24",
      "\x2a",
      "\x29",
      "\x3b",
      "\xc2\xac",
      "\x2d",
      "\x2f",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc2\xa6",
      "\x2c",
      "\x25",
      "\x5f",
      "\x3e",
      "\x3f",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x60",
      "\x3a",
      "\x23",
      "\x40",
      "\x27",
      "\x3d",
      "\x22",
      "\xef\xbf\xbd",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x7e",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x7b",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x7d",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x5c",
      "\xef\xbf\xbd",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc2\x9f",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x37",
      0x00000005 => "\x2d",
      0x00000006 => "\x2e",
      0x00000007 => "\x2f",
      0x00000008 => "\x16",
      0x00000009 => "\x05",
      0x0000000a => "\x25",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x3c",
      0x00000015 => "\x3d",
      0x00000016 => "\x32",
      0x00000017 => "\x26",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x3f",
      0x0000001b => "\x27",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x40",
      0x00000021 => "\x5a",
      0x00000022 => "\x7f",
      0x00000023 => "\x7b",
      0x00000024 => "\x5b",
      0x00000025 => "\x6c",
      0x00000026 => "\x50",
      0x00000027 => "\x7d",
      0x00000028 => "\x4d",
      0x00000029 => "\x5d",
      0x0000002a => "\x5c",
      0x0000002b => "\x4e",
      0x0000002c => "\x6b",
      0x0000002d => "\x60",
      0x0000002e => "\x4b",
      0x0000002f => "\x61",
      0x00000030 => "\xf0",
      0x00000031 => "\xf1",
      0x00000032 => "\xf2",
      0x00000033 => "\xf3",
      0x00000034 => "\xf4",
      0x00000035 => "\xf5",
      0x00000036 => "\xf6",
      0x00000037 => "\xf7",
      0x00000038 => "\xf8",
      0x00000039 => "\xf9",
      0x0000003a => "\x7a",
      0x0000003b => "\x5e",
      0x0000003c => "\x4c",
      0x0000003d => "\x7e",
      0x0000003e => "\x6e",
      0x0000003f => "\x6f",
      0x00000040 => "\x7c",
      0x00000041 => "\xc1",
      0x00000042 => "\xc2",
      0x00000043 => "\xc3",
      0x00000044 => "\xc4",
      0x00000045 => "\xc5",
      0x00000046 => "\xc6",
      0x00000047 => "\xc7",
      0x00000048 => "\xc8",
      0x00000049 => "\xc9",
      0x0000004a => "\xd1",
      0x0000004b => "\xd2",
      0x0000004c => "\xd3",
      0x0000004d => "\xd4",
      0x0000004e => "\xd5",
      0x0000004f => "\xd6",
      0x00000050 => "\xd7",
      0x00000051 => "\xd8",
      0x00000052 => "\xd9",
      0x00000053 => "\xe2",
      0x00000054 => "\xe3",
      0x00000055 => "\xe4",
      0x00000056 => "\xe5",
      0x00000057 => "\xe6",
      0x00000058 => "\xe7",
      0x00000059 => "\xe8",
      0x0000005a => "\xe9",
      0x0000005c => "\xe0",
      0x0000005f => "\x6d",
      0x00000060 => "\x79",
      0x00000061 => "\x81",
      0x00000062 => "\x82",
      0x00000063 => "\x83",
      0x00000064 => "\x84",
      0x00000065 => "\x85",
      0x00000066 => "\x86",
      0x00000067 => "\x87",
      0x00000068 => "\x88",
      0x00000069 => "\x89",
      0x0000006a => "\x91",
      0x0000006b => "\x92",
      0x0000006c => "\x93",
      0x0000006d => "\x94",
      0x0000006e => "\x95",
      0x0000006f => "\x96",
      0x00000070 => "\x97",
      0x00000071 => "\x98",
      0x00000072 => "\x99",
      0x00000073 => "\xa2",
      0x00000074 => "\xa3",
      0x00000075 => "\xa4",
      0x00000076 => "\xa5",
      0x00000077 => "\xa6",
      0x00000078 => "\xa7",
      0x00000079 => "\xa8",
      0x0000007a => "\xa9",
      0x0000007b => "\xc0",
      0x0000007c => "\x4f",
      0x0000007d => "\xd0",
      0x0000007e => "\xa1",
      0x0000007f => "\x07",
      0x00000080 => "\x20",
      0x00000081 => "\x21",
      0x00000082 => "\x22",
      0x00000083 => "\x23",
      0x00000084 => "\x24",
      0x00000085 => "\x15",
      0x00000086 => "\x06",
      0x00000087 => "\x17",
      0x00000088 => "\x28",
      0x00000089 => "\x29",
      0x0000008a => "\x2a",
      0x0000008b => "\x2b",
      0x0000008c => "\x2c",
      0x0000008d => "\x09",
      0x0000008e => "\x0a",
      0x0000008f => "\x1b",
      0x00000090 => "\x30",
      0x00000091 => "\x31",
      0x00000092 => "\x1a",
      0x00000093 => "\x33",
      0x00000094 => "\x34",
      0x00000095 => "\x35",
      0x00000096 => "\x36",
      0x00000097 => "\x08",
      0x00000098 => "\x38",
      0x00000099 => "\x39",
      0x0000009a => "\x3a",
      0x0000009b => "\x3b",
      0x0000009c => "\x04",
      0x0000009d => "\x14",
      0x0000009e => "\x3e",
      0x0000009f => "\xff",
      0x000000a2 => "\x4a",
      0x000000a6 => "\x6a",
      0x000000ac => "\x5f",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::EBCDIC_US - Conversion routines for EBCDIC_US
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for EBCDIC-US.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  0000009C | STRING TERMINATOR (ST)
      05 |  00000009 | CHARACTER TABULATION (HT)
      06 |  00000086 | START OF SELECTED AREA (SSA)
      07 |  0000007F | DELETE (DEL)
      08 |  00000097 | END OF GUARDED AREA (EPA)
      09 |  0000008D | REVERSE LINE FEED (RI)
      0A |  0000008E | SINGLE-SHIFT TWO (SS2)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  0000009D | OPERATING SYSTEM COMMAND (OSC)
      15 |  00000085 | NEXT LINE (NEL)
      16 |  00000008 | BACKSPACE (BS)
      17 |  00000087 | END OF SELECTED AREA (ESA)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  00000092 | PRIVATE USE TWO (PU2)
      1B |  0000008F | SINGLE-SHIFT THREE (SS3)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000080 | PADDING CHARACTER (PAD)
      21 |  00000081 | HIGH OCTET PRESET (HOP)
      22 |  00000082 | BREAK PERMITTED HERE (BPH)
      23 |  00000083 | NO BREAK HERE (NBH)
      24 |  00000084 | INDEX (IND)
      25 |  0000000A | LINE FEED (LF)
      26 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      27 |  0000001B | ESCAPE (ESC)
      28 |  00000088 | CHARACTER TABULATION SET (HTS)
      29 |  00000089 | CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
      2A |  0000008A | LINE TABULATION SET (VTS)
      2B |  0000008B | PARTIAL LINE FORWARD (PLD)
      2C |  0000008C | PARTIAL LINE BACKWARD (PLU)
      2D |  00000005 | ENQUIRY (ENQ)
      2E |  00000006 | ACKNOWLEDGE (ACK)
      2F |  00000007 | BELL (BEL)
      30 |  00000090 | DEVICE CONTROL STRING (DCS)
      31 |  00000091 | PRIVATE USE ONE (PU1)
      32 |  00000016 | SYNCHRONOUS IDLE (SYN)
      33 |  00000093 | SET TRANSMIT STATE (STS)
      34 |  00000094 | CANCEL CHARACTER (CCH)
      35 |  00000095 | MESSAGE WAITING (MW)
      36 |  00000096 | START OF GUARDED AREA (SPA)
      37 |  00000004 | END OF TRANSMISSION (EOT)
      38 |  00000098 | START OF STRING (SOS)
      39 |  00000099 | SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
      3A |  0000009A | SINGLE CHARACTER INTRODUCER (SCI)
      3B |  0000009B | CONTROL SEQUENCE INTRODUCER (CSI)
      3C |  00000014 | DEVICE CONTROL FOUR (DC4)
      3D |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      3E |  0000009E | PRIVACY MESSAGE (PM)
      3F |  0000001A | SUBSTITUTE (SUB)
      40 |  00000020 | SPACE
      4A |  000000A2 | CENT SIGN
      4B |  0000002E | FULL STOP
      4C |  0000003C | LESS-THAN SIGN
      4D |  00000028 | LEFT PARENTHESIS
      4E |  0000002B | PLUS SIGN
      4F |  0000007C | VERTICAL LINE
      50 |  00000026 | AMPERSAND
      5A |  00000021 | EXCLAMATION MARK
      5B |  00000024 | DOLLAR SIGN
      5C |  0000002A | ASTERISK
      5D |  00000029 | RIGHT PARENTHESIS
      5E |  0000003B | SEMICOLON
      5F |  000000AC | NOT SIGN
      60 |  0000002D | HYPHEN-MINUS
      61 |  0000002F | SOLIDUS
      6A |  000000A6 | BROKEN BAR
      6B |  0000002C | COMMA
      6C |  00000025 | PERCENT SIGN
      6D |  0000005F | LOW LINE
      6E |  0000003E | GREATER-THAN SIGN
      6F |  0000003F | QUESTION MARK
      79 |  00000060 | GRAVE ACCENT
      7A |  0000003A | COLON
      7B |  00000023 | NUMBER SIGN
      7C |  00000040 | COMMERCIAL AT
      7D |  00000027 | APOSTROPHE
      7E |  0000003D | EQUALS SIGN
      7F |  00000022 | QUOTATION MARK
      81 |  00000061 | LATIN SMALL LETTER A
      82 |  00000062 | LATIN SMALL LETTER B
      83 |  00000063 | LATIN SMALL LETTER C
      84 |  00000064 | LATIN SMALL LETTER D
      85 |  00000065 | LATIN SMALL LETTER E
      86 |  00000066 | LATIN SMALL LETTER F
      87 |  00000067 | LATIN SMALL LETTER G
      88 |  00000068 | LATIN SMALL LETTER H
      89 |  00000069 | LATIN SMALL LETTER I
      91 |  0000006A | LATIN SMALL LETTER J
      92 |  0000006B | LATIN SMALL LETTER K
      93 |  0000006C | LATIN SMALL LETTER L
      94 |  0000006D | LATIN SMALL LETTER M
      95 |  0000006E | LATIN SMALL LETTER N
      96 |  0000006F | LATIN SMALL LETTER O
      97 |  00000070 | LATIN SMALL LETTER P
      98 |  00000071 | LATIN SMALL LETTER Q
      99 |  00000072 | LATIN SMALL LETTER R
      A1 |  0000007E | TILDE
      A2 |  00000073 | LATIN SMALL LETTER S
      A3 |  00000074 | LATIN SMALL LETTER T
      A4 |  00000075 | LATIN SMALL LETTER U
      A5 |  00000076 | LATIN SMALL LETTER V
      A6 |  00000077 | LATIN SMALL LETTER W
      A7 |  00000078 | LATIN SMALL LETTER X
      A8 |  00000079 | LATIN SMALL LETTER Y
      A9 |  0000007A | LATIN SMALL LETTER Z
      C0 |  0000007B | LEFT CURLY BRACKET
      C1 |  00000041 | LATIN CAPITAL LETTER A
      C2 |  00000042 | LATIN CAPITAL LETTER B
      C3 |  00000043 | LATIN CAPITAL LETTER C
      C4 |  00000044 | LATIN CAPITAL LETTER D
      C5 |  00000045 | LATIN CAPITAL LETTER E
      C6 |  00000046 | LATIN CAPITAL LETTER F
      C7 |  00000047 | LATIN CAPITAL LETTER G
      C8 |  00000048 | LATIN CAPITAL LETTER H
      C9 |  00000049 | LATIN CAPITAL LETTER I
      D0 |  0000007D | RIGHT CURLY BRACKET
      D1 |  0000004A | LATIN CAPITAL LETTER J
      D2 |  0000004B | LATIN CAPITAL LETTER K
      D3 |  0000004C | LATIN CAPITAL LETTER L
      D4 |  0000004D | LATIN CAPITAL LETTER M
      D5 |  0000004E | LATIN CAPITAL LETTER N
      D6 |  0000004F | LATIN CAPITAL LETTER O
      D7 |  00000050 | LATIN CAPITAL LETTER P
      D8 |  00000051 | LATIN CAPITAL LETTER Q
      D9 |  00000052 | LATIN CAPITAL LETTER R
      E0 |  0000005C | REVERSE SOLIDUS
      E2 |  00000053 | LATIN CAPITAL LETTER S
      E3 |  00000054 | LATIN CAPITAL LETTER T
      E4 |  00000055 | LATIN CAPITAL LETTER U
      E5 |  00000056 | LATIN CAPITAL LETTER V
      E6 |  00000057 | LATIN CAPITAL LETTER W
      E7 |  00000058 | LATIN CAPITAL LETTER X
      E8 |  00000059 | LATIN CAPITAL LETTER Y
      E9 |  0000005A | LATIN CAPITAL LETTER Z
      F0 |  00000030 | DIGIT ZERO
      F1 |  00000031 | DIGIT ONE
      F2 |  00000032 | DIGIT TWO
      F3 |  00000033 | DIGIT THREE
      F4 |  00000034 | DIGIT FOUR
      F5 |  00000035 | DIGIT FIVE
      F6 |  00000036 | DIGIT SIX
      F7 |  00000037 | DIGIT SEVEN
      F8 |  00000038 | DIGIT EIGHT
      F9 |  00000039 | DIGIT NINE
      FF |  0000009F | APPLICATION PROGRAM COMMAND (APC)
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_EBCDIC_US

    $main::fatpacked{"Locale/RecodeData/ECMA_CYRILLIC.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_ECMA_CYRILLIC';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for ECMA-CYRILLIC.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::ECMA_CYRILLIC;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0x0080,
      0x0081,
      0x0082,
      0x0083,
      0x0084,
      0x0085,
      0x0086,
      0x0087,
      0x0088,
      0x0089,
      0x008a,
      0x008b,
      0x008c,
      0x008d,
      0x008e,
      0x008f,
      0x0090,
      0x0091,
      0x0092,
      0x0093,
      0x0094,
      0x0095,
      0x0096,
      0x0097,
      0x0098,
      0x0099,
      0x009a,
      0x009b,
      0x009c,
      0x009d,
      0x009e,
      0x009f,
      0x00a0,
      0x0452,
      0x0453,
      0x0451,
      0x0454,
      0x0455,
      0x0456,
      0x0457,
      0x0458,
      0x0459,
      0x045a,
      0x045b,
      0x045c,
      0x00ad,
      0x045e,
      0x045f,
      0x2116,
      0x0402,
      0x0403,
      0x0401,
      0x0404,
      0x0405,
      0x0406,
      0x0407,
      0x0408,
      0x0409,
      0x040a,
      0x040b,
      0x040c,
      0x00a4,
      0x040e,
      0x040f,
      0x044e,
      0x0430,
      0x0431,
      0x0446,
      0x0434,
      0x0435,
      0x0444,
      0x0433,
      0x0445,
      0x0438,
      0x0439,
      0x043a,
      0x043b,
      0x043c,
      0x043d,
      0x043e,
      0x043f,
      0x044f,
      0x0440,
      0x0441,
      0x0442,
      0x0443,
      0x0436,
      0x0432,
      0x044c,
      0x044b,
      0x0437,
      0x0448,
      0x044d,
      0x0449,
      0x0447,
      0x044a,
      0x042e,
      0x0410,
      0x0411,
      0x0426,
      0x0414,
      0x0415,
      0x0424,
      0x0413,
      0x0425,
      0x0418,
      0x0419,
      0x041a,
      0x041b,
      0x041c,
      0x041d,
      0x041e,
      0x041f,
      0x042f,
      0x0420,
      0x0421,
      0x0422,
      0x0423,
      0x0416,
      0x0412,
      0x042c,
      0x042b,
      0x0417,
      0x0428,
      0x042d,
      0x0429,
      0x0427,
      0x042a,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xc2\x80",
      "\xc2\x81",
      "\xc2\x82",
      "\xc2\x83",
      "\xc2\x84",
      "\xc2\x85",
      "\xc2\x86",
      "\xc2\x87",
      "\xc2\x88",
      "\xc2\x89",
      "\xc2\x8a",
      "\xc2\x8b",
      "\xc2\x8c",
      "\xc2\x8d",
      "\xc2\x8e",
      "\xc2\x8f",
      "\xc2\x90",
      "\xc2\x91",
      "\xc2\x92",
      "\xc2\x93",
      "\xc2\x94",
      "\xc2\x95",
      "\xc2\x96",
      "\xc2\x97",
      "\xc2\x98",
      "\xc2\x99",
      "\xc2\x9a",
      "\xc2\x9b",
      "\xc2\x9c",
      "\xc2\x9d",
      "\xc2\x9e",
      "\xc2\x9f",
      "\xc2\xa0",
      "\xd1\x92",
      "\xd1\x93",
      "\xd1\x91",
      "\xd1\x94",
      "\xd1\x95",
      "\xd1\x96",
      "\xd1\x97",
      "\xd1\x98",
      "\xd1\x99",
      "\xd1\x9a",
      "\xd1\x9b",
      "\xd1\x9c",
      "\xc2\xad",
      "\xd1\x9e",
      "\xd1\x9f",
      "\xe2\x84\x96",
      "\xd0\x82",
      "\xd0\x83",
      "\xd0\x81",
      "\xd0\x84",
      "\xd0\x85",
      "\xd0\x86",
      "\xd0\x87",
      "\xd0\x88",
      "\xd0\x89",
      "\xd0\x8a",
      "\xd0\x8b",
      "\xd0\x8c",
      "\xc2\xa4",
      "\xd0\x8e",
      "\xd0\x8f",
      "\xd1\x8e",
      "\xd0\xb0",
      "\xd0\xb1",
      "\xd1\x86",
      "\xd0\xb4",
      "\xd0\xb5",
      "\xd1\x84",
      "\xd0\xb3",
      "\xd1\x85",
      "\xd0\xb8",
      "\xd0\xb9",
      "\xd0\xba",
      "\xd0\xbb",
      "\xd0\xbc",
      "\xd0\xbd",
      "\xd0\xbe",
      "\xd0\xbf",
      "\xd1\x8f",
      "\xd1\x80",
      "\xd1\x81",
      "\xd1\x82",
      "\xd1\x83",
      "\xd0\xb6",
      "\xd0\xb2",
      "\xd1\x8c",
      "\xd1\x8b",
      "\xd0\xb7",
      "\xd1\x88",
      "\xd1\x8d",
      "\xd1\x89",
      "\xd1\x87",
      "\xd1\x8a",
      "\xd0\xae",
      "\xd0\x90",
      "\xd0\x91",
      "\xd0\xa6",
      "\xd0\x94",
      "\xd0\x95",
      "\xd0\xa4",
      "\xd0\x93",
      "\xd0\xa5",
      "\xd0\x98",
      "\xd0\x99",
      "\xd0\x9a",
      "\xd0\x9b",
      "\xd0\x9c",
      "\xd0\x9d",
      "\xd0\x9e",
      "\xd0\x9f",
      "\xd0\xaf",
      "\xd0\xa0",
      "\xd0\xa1",
      "\xd0\xa2",
      "\xd0\xa3",
      "\xd0\x96",
      "\xd0\x92",
      "\xd0\xac",
      "\xd0\xab",
      "\xd0\x97",
      "\xd0\xa8",
      "\xd0\xad",
      "\xd0\xa9",
      "\xd0\xa7",
      "\xd0\xaa",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x00000080 => "\x80",
      0x00000081 => "\x81",
      0x00000082 => "\x82",
      0x00000083 => "\x83",
      0x00000084 => "\x84",
      0x00000085 => "\x85",
      0x00000086 => "\x86",
      0x00000087 => "\x87",
      0x00000088 => "\x88",
      0x00000089 => "\x89",
      0x0000008a => "\x8a",
      0x0000008b => "\x8b",
      0x0000008c => "\x8c",
      0x0000008d => "\x8d",
      0x0000008e => "\x8e",
      0x0000008f => "\x8f",
      0x00000090 => "\x90",
      0x00000091 => "\x91",
      0x00000092 => "\x92",
      0x00000093 => "\x93",
      0x00000094 => "\x94",
      0x00000095 => "\x95",
      0x00000096 => "\x96",
      0x00000097 => "\x97",
      0x00000098 => "\x98",
      0x00000099 => "\x99",
      0x0000009a => "\x9a",
      0x0000009b => "\x9b",
      0x0000009c => "\x9c",
      0x0000009d => "\x9d",
      0x0000009e => "\x9e",
      0x0000009f => "\x9f",
      0x000000a0 => "\xa0",
      0x000000a4 => "\xbd",
      0x000000ad => "\xad",
      0x00000401 => "\xb3",
      0x00000402 => "\xb1",
      0x00000403 => "\xb2",
      0x00000404 => "\xb4",
      0x00000405 => "\xb5",
      0x00000406 => "\xb6",
      0x00000407 => "\xb7",
      0x00000408 => "\xb8",
      0x00000409 => "\xb9",
      0x0000040a => "\xba",
      0x0000040b => "\xbb",
      0x0000040c => "\xbc",
      0x0000040e => "\xbe",
      0x0000040f => "\xbf",
      0x00000410 => "\xe1",
      0x00000411 => "\xe2",
      0x00000412 => "\xf7",
      0x00000413 => "\xe7",
      0x00000414 => "\xe4",
      0x00000415 => "\xe5",
      0x00000416 => "\xf6",
      0x00000417 => "\xfa",
      0x00000418 => "\xe9",
      0x00000419 => "\xea",
      0x0000041a => "\xeb",
      0x0000041b => "\xec",
      0x0000041c => "\xed",
      0x0000041d => "\xee",
      0x0000041e => "\xef",
      0x0000041f => "\xf0",
      0x00000420 => "\xf2",
      0x00000421 => "\xf3",
      0x00000422 => "\xf4",
      0x00000423 => "\xf5",
      0x00000424 => "\xe6",
      0x00000425 => "\xe8",
      0x00000426 => "\xe3",
      0x00000427 => "\xfe",
      0x00000428 => "\xfb",
      0x00000429 => "\xfd",
      0x0000042a => "\xff",
      0x0000042b => "\xf9",
      0x0000042c => "\xf8",
      0x0000042d => "\xfc",
      0x0000042e => "\xe0",
      0x0000042f => "\xf1",
      0x00000430 => "\xc1",
      0x00000431 => "\xc2",
      0x00000432 => "\xd7",
      0x00000433 => "\xc7",
      0x00000434 => "\xc4",
      0x00000435 => "\xc5",
      0x00000436 => "\xd6",
      0x00000437 => "\xda",
      0x00000438 => "\xc9",
      0x00000439 => "\xca",
      0x0000043a => "\xcb",
      0x0000043b => "\xcc",
      0x0000043c => "\xcd",
      0x0000043d => "\xce",
      0x0000043e => "\xcf",
      0x0000043f => "\xd0",
      0x00000440 => "\xd2",
      0x00000441 => "\xd3",
      0x00000442 => "\xd4",
      0x00000443 => "\xd5",
      0x00000444 => "\xc6",
      0x00000445 => "\xc8",
      0x00000446 => "\xc3",
      0x00000447 => "\xde",
      0x00000448 => "\xdb",
      0x00000449 => "\xdd",
      0x0000044a => "\xdf",
      0x0000044b => "\xd9",
      0x0000044c => "\xd8",
      0x0000044d => "\xdc",
      0x0000044e => "\xc0",
      0x0000044f => "\xd1",
      0x00000451 => "\xa3",
      0x00000452 => "\xa1",
      0x00000453 => "\xa2",
      0x00000454 => "\xa4",
      0x00000455 => "\xa5",
      0x00000456 => "\xa6",
      0x00000457 => "\xa7",
      0x00000458 => "\xa8",
      0x00000459 => "\xa9",
      0x0000045a => "\xaa",
      0x0000045b => "\xab",
      0x0000045c => "\xac",
      0x0000045e => "\xae",
      0x0000045f => "\xaf",
      0x00002116 => "\xb0",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::ECMA_CYRILLIC - Conversion routines for ECMA_CYRILLIC
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for ECMA-CYRILLIC.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: ECMA registry
   alias ISO-IR-111
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE (DEL)
      80 |  00000080 | PADDING CHARACTER (PAD)
      81 |  00000081 | HIGH OCTET PRESET (HOP)
      82 |  00000082 | BREAK PERMITTED HERE (BPH)
      83 |  00000083 | NO BREAK HERE (NBH)
      84 |  00000084 | INDEX (IND)
      85 |  00000085 | NEXT LINE (NEL)
      86 |  00000086 | START OF SELECTED AREA (SSA)
      87 |  00000087 | END OF SELECTED AREA (ESA)
      88 |  00000088 | CHARACTER TABULATION SET (HTS)
      89 |  00000089 | CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
      8A |  0000008A | LINE TABULATION SET (VTS)
      8B |  0000008B | PARTIAL LINE FORWARD (PLD)
      8C |  0000008C | PARTIAL LINE BACKWARD (PLU)
      8D |  0000008D | REVERSE LINE FEED (RI)
      8E |  0000008E | SINGLE-SHIFT TWO (SS2)
      8F |  0000008F | SINGLE-SHIFT THREE (SS3)
      90 |  00000090 | DEVICE CONTROL STRING (DCS)
      91 |  00000091 | PRIVATE USE ONE (PU1)
      92 |  00000092 | PRIVATE USE TWO (PU2)
      93 |  00000093 | SET TRANSMIT STATE (STS)
      94 |  00000094 | CANCEL CHARACTER (CCH)
      95 |  00000095 | MESSAGE WAITING (MW)
      96 |  00000096 | START OF GUARDED AREA (SPA)
      97 |  00000097 | END OF GUARDED AREA (EPA)
      98 |  00000098 | START OF STRING (SOS)
      99 |  00000099 | SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
      9A |  0000009A | SINGLE CHARACTER INTRODUCER (SCI)
      9B |  0000009B | CONTROL SEQUENCE INTRODUCER (CSI)
      9C |  0000009C | STRING TERMINATOR (ST)
      9D |  0000009D | OPERATING SYSTEM COMMAND (OSC)
      9E |  0000009E | PRIVACY MESSAGE (PM)
      9F |  0000009F | APPLICATION PROGRAM COMMAND (APC)
      A0 |  000000A0 | NO-BREAK SPACE
      A1 |  00000452 | CYRILLIC SMALL LETTER DJE (Serbocroatian)
      A2 |  00000453 | CYRILLIC SMALL LETTER GJE
      A3 |  00000451 | CYRILLIC SMALL LETTER IO
      A4 |  00000454 | CYRILLIC SMALL LETTER UKRAINIAN IE
      A5 |  00000455 | CYRILLIC SMALL LETTER DZE
      A6 |  00000456 | CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
      A7 |  00000457 | CYRILLIC SMALL LETTER YI (Ukrainian)
      A8 |  00000458 | CYRILLIC SMALL LETTER JE
      A9 |  00000459 | CYRILLIC SMALL LETTER LJE
      AA |  0000045A | CYRILLIC SMALL LETTER NJE
      AB |  0000045B | CYRILLIC SMALL LETTER TSHE (Serbocroatian)
      AC |  0000045C | CYRILLIC SMALL LETTER KJE
      AD |  000000AD | SOFT HYPHEN
      AE |  0000045E | CYRILLIC SMALL LETTER SHORT U (Byelorussian)
      AF |  0000045F | CYRILLIC SMALL LETTER DZHE
      B0 |  00002116 | NUMERO SIGN
      B1 |  00000402 | CYRILLIC CAPITAL LETTER DJE (Serbocroatian)
      B2 |  00000403 | CYRILLIC CAPITAL LETTER GJE
      B3 |  00000401 | CYRILLIC CAPITAL LETTER IO
      B4 |  00000404 | CYRILLIC CAPITAL LETTER UKRAINIAN IE
      B5 |  00000405 | CYRILLIC CAPITAL LETTER DZE
      B6 |  00000406 | CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
      B7 |  00000407 | CYRILLIC CAPITAL LETTER YI (Ukrainian)
      B8 |  00000408 | CYRILLIC CAPITAL LETTER JE
      B9 |  00000409 | CYRILLIC CAPITAL LETTER LJE
      BA |  0000040A | CYRILLIC CAPITAL LETTER NJE
      BB |  0000040B | CYRILLIC CAPITAL LETTER TSHE (Serbocroatian)
      BC |  0000040C | CYRILLIC CAPITAL LETTER KJE
      BD |  000000A4 | CURRENCY SIGN
      BE |  0000040E | CYRILLIC CAPITAL LETTER SHORT U (Byelorussian)
      BF |  0000040F | CYRILLIC CAPITAL LETTER DZHE
      C0 |  0000044E | CYRILLIC SMALL LETTER YU
      C1 |  00000430 | CYRILLIC SMALL LETTER A
      C2 |  00000431 | CYRILLIC SMALL LETTER BE
      C3 |  00000446 | CYRILLIC SMALL LETTER TSE
      C4 |  00000434 | CYRILLIC SMALL LETTER DE
      C5 |  00000435 | CYRILLIC SMALL LETTER IE
      C6 |  00000444 | CYRILLIC SMALL LETTER EF
      C7 |  00000433 | CYRILLIC SMALL LETTER GHE
      C8 |  00000445 | CYRILLIC SMALL LETTER HA
      C9 |  00000438 | CYRILLIC SMALL LETTER I
      CA |  00000439 | CYRILLIC SMALL LETTER SHORT I
      CB |  0000043A | CYRILLIC SMALL LETTER KA
      CC |  0000043B | CYRILLIC SMALL LETTER EL
      CD |  0000043C | CYRILLIC SMALL LETTER EM
      CE |  0000043D | CYRILLIC SMALL LETTER EN
      CF |  0000043E | CYRILLIC SMALL LETTER O
      D0 |  0000043F | CYRILLIC SMALL LETTER PE
      D1 |  0000044F | CYRILLIC SMALL LETTER YA
      D2 |  00000440 | CYRILLIC SMALL LETTER ER
      D3 |  00000441 | CYRILLIC SMALL LETTER ES
      D4 |  00000442 | CYRILLIC SMALL LETTER TE
      D5 |  00000443 | CYRILLIC SMALL LETTER U
      D6 |  00000436 | CYRILLIC SMALL LETTER ZHE
      D7 |  00000432 | CYRILLIC SMALL LETTER VE
      D8 |  0000044C | CYRILLIC SMALL LETTER SOFT SIGN
      D9 |  0000044B | CYRILLIC SMALL LETTER YERU
      DA |  00000437 | CYRILLIC SMALL LETTER ZE
      DB |  00000448 | CYRILLIC SMALL LETTER SHA
      DC |  0000044D | CYRILLIC SMALL LETTER E
      DD |  00000449 | CYRILLIC SMALL LETTER SHCHA
      DE |  00000447 | CYRILLIC SMALL LETTER CHE
      DF |  0000044A | CYRILLIC SMALL LETTER HARD SIGN
      E0 |  0000042E | CYRILLIC CAPITAL LETTER YU
      E1 |  00000410 | CYRILLIC CAPITAL LETTER A
      E2 |  00000411 | CYRILLIC CAPITAL LETTER BE
      E3 |  00000426 | CYRILLIC CAPITAL LETTER TSE
      E4 |  00000414 | CYRILLIC CAPITAL LETTER DE
      E5 |  00000415 | CYRILLIC CAPITAL LETTER IE
      E6 |  00000424 | CYRILLIC CAPITAL LETTER EF
      E7 |  00000413 | CYRILLIC CAPITAL LETTER GHE
      E8 |  00000425 | CYRILLIC CAPITAL LETTER HA
      E9 |  00000418 | CYRILLIC CAPITAL LETTER I
      EA |  00000419 | CYRILLIC CAPITAL LETTER SHORT I
      EB |  0000041A | CYRILLIC CAPITAL LETTER KA
      EC |  0000041B | CYRILLIC CAPITAL LETTER EL
      ED |  0000041C | CYRILLIC CAPITAL LETTER EM
      EE |  0000041D | CYRILLIC CAPITAL LETTER EN
      EF |  0000041E | CYRILLIC CAPITAL LETTER O
      F0 |  0000041F | CYRILLIC CAPITAL LETTER PE
      F1 |  0000042F | CYRILLIC CAPITAL LETTER YA
      F2 |  00000420 | CYRILLIC CAPITAL LETTER ER
      F3 |  00000421 | CYRILLIC CAPITAL LETTER ES
      F4 |  00000422 | CYRILLIC CAPITAL LETTER TE
      F5 |  00000423 | CYRILLIC CAPITAL LETTER U
      F6 |  00000416 | CYRILLIC CAPITAL LETTER ZHE
      F7 |  00000412 | CYRILLIC CAPITAL LETTER VE
      F8 |  0000042C | CYRILLIC CAPITAL LETTER SOFT SIGN
      F9 |  0000042B | CYRILLIC CAPITAL LETTER YERU
      FA |  00000417 | CYRILLIC CAPITAL LETTER ZE
      FB |  00000428 | CYRILLIC CAPITAL LETTER SHA
      FC |  0000042D | CYRILLIC CAPITAL LETTER E
      FD |  00000429 | CYRILLIC CAPITAL LETTER SHCHA
      FE |  00000427 | CYRILLIC CAPITAL LETTER CHE
      FF |  0000042A | CYRILLIC CAPITAL LETTER HARD SIGN
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_ECMA_CYRILLIC

    $main::fatpacked{"Locale/RecodeData/GEORGIAN_ACADEMY.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_GEORGIAN_ACADEMY';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for GEORGIAN-ACADEMY.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::GEORGIAN_ACADEMY;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0x0080,
      0x0081,
      0x201a,
      0x0192,
      0x201e,
      0x2026,
      0x2020,
      0x2021,
      0x02c6,
      0x2030,
      0x0160,
      0x2039,
      0x0152,
      0x008d,
      0x008e,
      0x008f,
      0x0090,
      0x2018,
      0x2019,
      0x201c,
      0x201d,
      0x2022,
      0x2013,
      0x2014,
      0x02dc,
      0x2122,
      0x0161,
      0x203a,
      0x0153,
      0x009d,
      0x009e,
      0x0178,
      0x00a0,
      0x00a1,
      0x00a2,
      0x00a3,
      0x00a4,
      0x00a5,
      0x00a6,
      0x00a7,
      0x00a8,
      0x00a9,
      0x00aa,
      0x00ab,
      0x00ac,
      0x00ad,
      0x00ae,
      0x00af,
      0x00b0,
      0x00b1,
      0x00b2,
      0x00b3,
      0x00b4,
      0x00b5,
      0x00b6,
      0x00b7,
      0x00b8,
      0x00b9,
      0x00ba,
      0x00bb,
      0x00bc,
      0x00bd,
      0x00be,
      0x00bf,
      0x10d0,
      0x10d1,
      0x10d2,
      0x10d3,
      0x10d4,
      0x10d5,
      0x10d6,
      0x10d7,
      0x10d8,
      0x10d9,
      0x10da,
      0x10db,
      0x10dc,
      0x10dd,
      0x10de,
      0x10df,
      0x10e0,
      0x10e1,
      0x10e2,
      0x10e3,
      0x10e4,
      0x10e5,
      0x10e6,
      0x10e7,
      0x10e8,
      0x10e9,
      0x10ea,
      0x10eb,
      0x10ec,
      0x10ed,
      0x10ee,
      0x10ef,
      0x10f0,
      0x10f1,
      0x10f2,
      0x10f3,
      0x10f4,
      0x10f5,
      0x10f6,
      0x00e7,
      0x00e8,
      0x00e9,
      0x00ea,
      0x00eb,
      0x00ec,
      0x00ed,
      0x00ee,
      0x00ef,
      0x00f0,
      0x00f1,
      0x00f2,
      0x00f3,
      0x00f4,
      0x00f5,
      0x00f6,
      0x00f7,
      0x00f8,
      0x00f9,
      0x00fa,
      0x00fb,
      0x00fc,
      0x00fd,
      0x00fe,
      0x00ff,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xc2\x80",
      "\xc2\x81",
      "\xe2\x80\x9a",
      "\xc6\x92",
      "\xe2\x80\x9e",
      "\xe2\x80\xa6",
      "\xe2\x80\xa0",
      "\xe2\x80\xa1",
      "\xcb\x86",
      "\xe2\x80\xb0",
      "\xc5\xa0",
      "\xe2\x80\xb9",
      "\xc5\x92",
      "\xc2\x8d",
      "\xc2\x8e",
      "\xc2\x8f",
      "\xc2\x90",
      "\xe2\x80\x98",
      "\xe2\x80\x99",
      "\xe2\x80\x9c",
      "\xe2\x80\x9d",
      "\xe2\x80\xa2",
      "\xe2\x80\x93",
      "\xe2\x80\x94",
      "\xcb\x9c",
      "\xe2\x84\xa2",
      "\xc5\xa1",
      "\xe2\x80\xba",
      "\xc5\x93",
      "\xc2\x9d",
      "\xc2\x9e",
      "\xc5\xb8",
      "\xc2\xa0",
      "\xc2\xa1",
      "\xc2\xa2",
      "\xc2\xa3",
      "\xc2\xa4",
      "\xc2\xa5",
      "\xc2\xa6",
      "\xc2\xa7",
      "\xc2\xa8",
      "\xc2\xa9",
      "\xc2\xaa",
      "\xc2\xab",
      "\xc2\xac",
      "\xc2\xad",
      "\xc2\xae",
      "\xc2\xaf",
      "\xc2\xb0",
      "\xc2\xb1",
      "\xc2\xb2",
      "\xc2\xb3",
      "\xc2\xb4",
      "\xc2\xb5",
      "\xc2\xb6",
      "\xc2\xb7",
      "\xc2\xb8",
      "\xc2\xb9",
      "\xc2\xba",
      "\xc2\xbb",
      "\xc2\xbc",
      "\xc2\xbd",
      "\xc2\xbe",
      "\xc2\xbf",
      "\xe1\x83\x90",
      "\xe1\x83\x91",
      "\xe1\x83\x92",
      "\xe1\x83\x93",
      "\xe1\x83\x94",
      "\xe1\x83\x95",
      "\xe1\x83\x96",
      "\xe1\x83\x97",
      "\xe1\x83\x98",
      "\xe1\x83\x99",
      "\xe1\x83\x9a",
      "\xe1\x83\x9b",
      "\xe1\x83\x9c",
      "\xe1\x83\x9d",
      "\xe1\x83\x9e",
      "\xe1\x83\x9f",
      "\xe1\x83\xa0",
      "\xe1\x83\xa1",
      "\xe1\x83\xa2",
      "\xe1\x83\xa3",
      "\xe1\x83\xa4",
      "\xe1\x83\xa5",
      "\xe1\x83\xa6",
      "\xe1\x83\xa7",
      "\xe1\x83\xa8",
      "\xe1\x83\xa9",
      "\xe1\x83\xaa",
      "\xe1\x83\xab",
      "\xe1\x83\xac",
      "\xe1\x83\xad",
      "\xe1\x83\xae",
      "\xe1\x83\xaf",
      "\xe1\x83\xb0",
      "\xe1\x83\xb1",
      "\xe1\x83\xb2",
      "\xe1\x83\xb3",
      "\xe1\x83\xb4",
      "\xe1\x83\xb5",
      "\xe1\x83\xb6",
      "\xc3\xa7",
      "\xc3\xa8",
      "\xc3\xa9",
      "\xc3\xaa",
      "\xc3\xab",
      "\xc3\xac",
      "\xc3\xad",
      "\xc3\xae",
      "\xc3\xaf",
      "\xc3\xb0",
      "\xc3\xb1",
      "\xc3\xb2",
      "\xc3\xb3",
      "\xc3\xb4",
      "\xc3\xb5",
      "\xc3\xb6",
      "\xc3\xb7",
      "\xc3\xb8",
      "\xc3\xb9",
      "\xc3\xba",
      "\xc3\xbb",
      "\xc3\xbc",
      "\xc3\xbd",
      "\xc3\xbe",
      "\xc3\xbf",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x00000080 => "\x80",
      0x00000081 => "\x81",
      0x0000008d => "\x8d",
      0x0000008e => "\x8e",
      0x0000008f => "\x8f",
      0x00000090 => "\x90",
      0x0000009d => "\x9d",
      0x0000009e => "\x9e",
      0x000000a0 => "\xa0",
      0x000000a1 => "\xa1",
      0x000000a2 => "\xa2",
      0x000000a3 => "\xa3",
      0x000000a4 => "\xa4",
      0x000000a5 => "\xa5",
      0x000000a6 => "\xa6",
      0x000000a7 => "\xa7",
      0x000000a8 => "\xa8",
      0x000000a9 => "\xa9",
      0x000000aa => "\xaa",
      0x000000ab => "\xab",
      0x000000ac => "\xac",
      0x000000ad => "\xad",
      0x000000ae => "\xae",
      0x000000af => "\xaf",
      0x000000b0 => "\xb0",
      0x000000b1 => "\xb1",
      0x000000b2 => "\xb2",
      0x000000b3 => "\xb3",
      0x000000b4 => "\xb4",
      0x000000b5 => "\xb5",
      0x000000b6 => "\xb6",
      0x000000b7 => "\xb7",
      0x000000b8 => "\xb8",
      0x000000b9 => "\xb9",
      0x000000ba => "\xba",
      0x000000bb => "\xbb",
      0x000000bc => "\xbc",
      0x000000bd => "\xbd",
      0x000000be => "\xbe",
      0x000000bf => "\xbf",
      0x000000e7 => "\xe7",
      0x000000e8 => "\xe8",
      0x000000e9 => "\xe9",
      0x000000ea => "\xea",
      0x000000eb => "\xeb",
      0x000000ec => "\xec",
      0x000000ed => "\xed",
      0x000000ee => "\xee",
      0x000000ef => "\xef",
      0x000000f0 => "\xf0",
      0x000000f1 => "\xf1",
      0x000000f2 => "\xf2",
      0x000000f3 => "\xf3",
      0x000000f4 => "\xf4",
      0x000000f5 => "\xf5",
      0x000000f6 => "\xf6",
      0x000000f7 => "\xf7",
      0x000000f8 => "\xf8",
      0x000000f9 => "\xf9",
      0x000000fa => "\xfa",
      0x000000fb => "\xfb",
      0x000000fc => "\xfc",
      0x000000fd => "\xfd",
      0x000000fe => "\xfe",
      0x000000ff => "\xff",
      0x00000152 => "\x8c",
      0x00000153 => "\x9c",
      0x00000160 => "\x8a",
      0x00000161 => "\x9a",
      0x00000178 => "\x9f",
      0x00000192 => "\x83",
      0x000002c6 => "\x88",
      0x000002dc => "\x98",
      0x000010d0 => "\xc0",
      0x000010d1 => "\xc1",
      0x000010d2 => "\xc2",
      0x000010d3 => "\xc3",
      0x000010d4 => "\xc4",
      0x000010d5 => "\xc5",
      0x000010d6 => "\xc6",
      0x000010d7 => "\xc7",
      0x000010d8 => "\xc8",
      0x000010d9 => "\xc9",
      0x000010da => "\xca",
      0x000010db => "\xcb",
      0x000010dc => "\xcc",
      0x000010dd => "\xcd",
      0x000010de => "\xce",
      0x000010df => "\xcf",
      0x000010e0 => "\xd0",
      0x000010e1 => "\xd1",
      0x000010e2 => "\xd2",
      0x000010e3 => "\xd3",
      0x000010e4 => "\xd4",
      0x000010e5 => "\xd5",
      0x000010e6 => "\xd6",
      0x000010e7 => "\xd7",
      0x000010e8 => "\xd8",
      0x000010e9 => "\xd9",
      0x000010ea => "\xda",
      0x000010eb => "\xdb",
      0x000010ec => "\xdc",
      0x000010ed => "\xdd",
      0x000010ee => "\xde",
      0x000010ef => "\xdf",
      0x000010f0 => "\xe0",
      0x000010f1 => "\xe1",
      0x000010f2 => "\xe2",
      0x000010f3 => "\xe3",
      0x000010f4 => "\xe4",
      0x000010f5 => "\xe5",
      0x000010f6 => "\xe6",
      0x00002013 => "\x96",
      0x00002014 => "\x97",
      0x00002018 => "\x91",
      0x00002019 => "\x92",
      0x0000201a => "\x82",
      0x0000201c => "\x93",
      0x0000201d => "\x94",
      0x0000201e => "\x84",
      0x00002020 => "\x86",
      0x00002021 => "\x87",
      0x00002022 => "\x95",
      0x00002026 => "\x85",
      0x00002030 => "\x89",
      0x00002039 => "\x8b",
      0x0000203a => "\x9b",
      0x00002122 => "\x99",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::GEORGIAN_ACADEMY - Conversion routines for GEORGIAN-ACADEMY
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for GEORGIAN-ACADEMY.
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE (DEL)
      80 |  00000080 | PADDING CHARACTER (PAD)
      81 |  00000081 | HIGH OCTET PRESET (HOP)
      82 |  0000201A | SINGLE LOW-9 QUOTATION MARK
      83 |  00000192 | LATIN SMALL LETTER F WITH HOOK
      84 |  0000201E | DOUBLE LOW-9 QUOTATION MARK
      85 |  00002026 | HORIZONTAL ELLIPSIS
      86 |  00002020 | DAGGER
      87 |  00002021 | DOUBLE DAGGER
      88 |  000002C6 | MODIFIER LETTER CIRCUMFLEX ACCENT
      89 |  00002030 | PER MILLE SIGN
      8A |  00000160 | LATIN CAPITAL LETTER S WITH CARON
      8B |  00002039 | SINGLE LEFT-POINTING ANGLE QUOTATION MARK
      8C |  00000152 | LATIN CAPITAL LIGATURE OE
      8D |  0000008D | REVERSE LINE FEED (RI)
      8E |  0000008E | SINGLE-SHIFT TWO (SS2)
      8F |  0000008F | SINGLE-SHIFT THREE (SS3)
      90 |  00000090 | DEVICE CONTROL STRING (DCS)
      91 |  00002018 | LEFT SINGLE QUOTATION MARK
      92 |  00002019 | RIGHT SINGLE QUOTATION MARK
      93 |  0000201C | LEFT DOUBLE QUOTATION MARK
      94 |  0000201D | RIGHT DOUBLE QUOTATION MARK
      95 |  00002022 | BULLET
      96 |  00002013 | EN DASH
      97 |  00002014 | EM DASH
      98 |  000002DC | SMALL TILDE
      99 |  00002122 | TRADE MARK SIGN
      9A |  00000161 | LATIN SMALL LETTER S WITH CARON
      9B |  0000203A | SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
      9C |  00000153 | LATIN SMALL LIGATURE OE
      9D |  0000009D | OPERATING SYSTEM COMMAND (OSC)
      9E |  0000009E | PRIVACY MESSAGE (PM)
      9F |  00000178 | LATIN CAPITAL LETTER Y WITH DIAERESIS
      A0 |  000000A0 | NO-BREAK SPACE
      A1 |  000000A1 | INVERTED EXCLAMATION MARK
      A2 |  000000A2 | CENT SIGN
      A3 |  000000A3 | POUND SIGN
      A4 |  000000A4 | CURRENCY SIGN
      A5 |  000000A5 | YEN SIGN
      A6 |  000000A6 | BROKEN BAR
      A7 |  000000A7 | SECTION SIGN
      A8 |  000000A8 | DIAERESIS
      A9 |  000000A9 | COPYRIGHT SIGN
      AA |  000000AA | FEMININE ORDINAL INDICATOR
      AB |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
      AC |  000000AC | NOT SIGN
      AD |  000000AD | SOFT HYPHEN
      AE |  000000AE | REGISTERED SIGN
      AF |  000000AF | MACRON
      B0 |  000000B0 | DEGREE SIGN
      B1 |  000000B1 | PLUS-MINUS SIGN
      B2 |  000000B2 | SUPERSCRIPT TWO
      B3 |  000000B3 | SUPERSCRIPT THREE
      B4 |  000000B4 | ACUTE ACCENT
      B5 |  000000B5 | MICRO SIGN
      B6 |  000000B6 | PILCROW SIGN
      B7 |  000000B7 | MIDDLE DOT
      B8 |  000000B8 | CEDILLA
      B9 |  000000B9 | SUPERSCRIPT ONE
      BA |  000000BA | MASCULINE ORDINAL INDICATOR
      BB |  000000BB | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
      BC |  000000BC | VULGAR FRACTION ONE QUARTER
      BD |  000000BD | VULGAR FRACTION ONE HALF
      BE |  000000BE | VULGAR FRACTION THREE QUARTERS
      BF |  000000BF | INVERTED QUESTION MARK
      C0 |  000010D0 | GEORGIAN LETTER AN
      C1 |  000010D1 | GEORGIAN LETTER BAN
      C2 |  000010D2 | GEORGIAN LETTER GAN
      C3 |  000010D3 | GEORGIAN LETTER DON
      C4 |  000010D4 | GEORGIAN LETTER EN
      C5 |  000010D5 | GEORGIAN LETTER VIN
      C6 |  000010D6 | GEORGIAN LETTER ZEN
      C7 |  000010D7 | GEORGIAN LETTER TAN
      C8 |  000010D8 | GEORGIAN LETTER IN
      C9 |  000010D9 | GEORGIAN LETTER KAN
      CA |  000010DA | GEORGIAN LETTER LAS
      CB |  000010DB | GEORGIAN LETTER MAN
      CC |  000010DC | GEORGIAN LETTER NAR
      CD |  000010DD | GEORGIAN LETTER ON
      CE |  000010DE | GEORGIAN LETTER PAR
      CF |  000010DF | GEORGIAN LETTER ZHAR
      D0 |  000010E0 | GEORGIAN LETTER RAE
      D1 |  000010E1 | GEORGIAN LETTER SAN
      D2 |  000010E2 | GEORGIAN LETTER TAR
      D3 |  000010E3 | GEORGIAN LETTER UN
      D4 |  000010E4 | GEORGIAN LETTER PHAR
      D5 |  000010E5 | GEORGIAN LETTER KHAR
      D6 |  000010E6 | GEORGIAN LETTER GHAN
      D7 |  000010E7 | GEORGIAN LETTER QAR
      D8 |  000010E8 | GEORGIAN LETTER SHIN
      D9 |  000010E9 | GEORGIAN LETTER CHIN
      DA |  000010EA | GEORGIAN LETTER CAN
      DB |  000010EB | GEORGIAN LETTER JIL
      DC |  000010EC | GEORGIAN LETTER CIL
      DD |  000010ED | GEORGIAN LETTER CHAR
      DE |  000010EE | GEORGIAN LETTER XAN
      DF |  000010EF | GEORGIAN LETTER JHAN
      E0 |  000010F0 | GEORGIAN LETTER HAE
      E1 |  000010F1 | GEORGIAN LETTER HE
      E2 |  000010F2 | GEORGIAN LETTER HIE
      E3 |  000010F3 | GEORGIAN LETTER WE
      E4 |  000010F4 | GEORGIAN LETTER HAR
      E5 |  000010F5 | GEORGIAN LETTER HOE
      E6 |  000010F6 | GEORGIAN LETTER FI
      E7 |  000000E7 | LATIN SMALL LETTER C WITH CEDILLA
      E8 |  000000E8 | LATIN SMALL LETTER E WITH GRAVE
      E9 |  000000E9 | LATIN SMALL LETTER E WITH ACUTE
      EA |  000000EA | LATIN SMALL LETTER E WITH CIRCUMFLEX
      EB |  000000EB | LATIN SMALL LETTER E WITH DIAERESIS
      EC |  000000EC | LATIN SMALL LETTER I WITH GRAVE
      ED |  000000ED | LATIN SMALL LETTER I WITH ACUTE
      EE |  000000EE | LATIN SMALL LETTER I WITH CIRCUMFLEX
      EF |  000000EF | LATIN SMALL LETTER I WITH DIAERESIS
      F0 |  000000F0 | LATIN SMALL LETTER ETH (Icelandic)
      F1 |  000000F1 | LATIN SMALL LETTER N WITH TILDE
      F2 |  000000F2 | LATIN SMALL LETTER O WITH GRAVE
      F3 |  000000F3 | LATIN SMALL LETTER O WITH ACUTE
      F4 |  000000F4 | LATIN SMALL LETTER O WITH CIRCUMFLEX
      F5 |  000000F5 | LATIN SMALL LETTER O WITH TILDE
      F6 |  000000F6 | LATIN SMALL LETTER O WITH DIAERESIS
      F7 |  000000F7 | DIVISION SIGN
      F8 |  000000F8 | LATIN SMALL LETTER O WITH STROKE
      F9 |  000000F9 | LATIN SMALL LETTER U WITH GRAVE
      FA |  000000FA | LATIN SMALL LETTER U WITH ACUTE
      FB |  000000FB | LATIN SMALL LETTER U WITH CIRCUMFLEX
      FC |  000000FC | LATIN SMALL LETTER U WITH DIAERESIS
      FD |  000000FD | LATIN SMALL LETTER Y WITH ACUTE
      FE |  000000FE | LATIN SMALL LETTER THORN (Icelandic)
      FF |  000000FF | LATIN SMALL LETTER Y WITH DIAERESIS
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_GEORGIAN_ACADEMY

    $main::fatpacked{"Locale/RecodeData/GEORGIAN_PS.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_GEORGIAN_PS';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for GEORGIAN-PS.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::GEORGIAN_PS;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0x0080,
      0x0081,
      0x201a,
      0x0192,
      0x201e,
      0x2026,
      0x2020,
      0x2021,
      0x02c6,
      0x2030,
      0x0160,
      0x2039,
      0x0152,
      0x008d,
      0x008e,
      0x008f,
      0x0090,
      0x2018,
      0x2019,
      0x201c,
      0x201d,
      0x2022,
      0x2013,
      0x2014,
      0x02dc,
      0x2122,
      0x0161,
      0x203a,
      0x0153,
      0x009d,
      0x009e,
      0x0178,
      0x00a0,
      0x00a1,
      0x00a2,
      0x00a3,
      0x00a4,
      0x00a5,
      0x00a6,
      0x00a7,
      0x00a8,
      0x00a9,
      0x00aa,
      0x00ab,
      0x00ac,
      0x00ad,
      0x00ae,
      0x00af,
      0x00b0,
      0x00b1,
      0x00b2,
      0x00b3,
      0x00b4,
      0x00b5,
      0x00b6,
      0x00b7,
      0x00b8,
      0x00b9,
      0x00ba,
      0x00bb,
      0x00bc,
      0x00bd,
      0x00be,
      0x00bf,
      0x10d0,
      0x10d1,
      0x10d2,
      0x10d3,
      0x10d4,
      0x10d5,
      0x10d6,
      0x10f1,
      0x10d7,
      0x10d8,
      0x10d9,
      0x10da,
      0x10db,
      0x10dc,
      0x10f2,
      0x10dd,
      0x10de,
      0x10df,
      0x10e0,
      0x10e1,
      0x10e2,
      0x10f3,
      0x10e3,
      0x10e4,
      0x10e5,
      0x10e6,
      0x10e7,
      0x10e8,
      0x10e9,
      0x10ea,
      0x10eb,
      0x10ec,
      0x10ed,
      0x10ee,
      0x10f4,
      0x10ef,
      0x10f0,
      0x10f5,
      0x00e6,
      0x00e7,
      0x00e8,
      0x00e9,
      0x00ea,
      0x00eb,
      0x00ec,
      0x00ed,
      0x00ee,
      0x00ef,
      0x00f0,
      0x00f1,
      0x00f2,
      0x00f3,
      0x00f4,
      0x00f5,
      0x00f6,
      0x00f7,
      0x00f8,
      0x00f9,
      0x00fa,
      0x00fb,
      0x00fc,
      0x00fd,
      0x00fe,
      0x00ff,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xc2\x80",
      "\xc2\x81",
      "\xe2\x80\x9a",
      "\xc6\x92",
      "\xe2\x80\x9e",
      "\xe2\x80\xa6",
      "\xe2\x80\xa0",
      "\xe2\x80\xa1",
      "\xcb\x86",
      "\xe2\x80\xb0",
      "\xc5\xa0",
      "\xe2\x80\xb9",
      "\xc5\x92",
      "\xc2\x8d",
      "\xc2\x8e",
      "\xc2\x8f",
      "\xc2\x90",
      "\xe2\x80\x98",
      "\xe2\x80\x99",
      "\xe2\x80\x9c",
      "\xe2\x80\x9d",
      "\xe2\x80\xa2",
      "\xe2\x80\x93",
      "\xe2\x80\x94",
      "\xcb\x9c",
      "\xe2\x84\xa2",
      "\xc5\xa1",
      "\xe2\x80\xba",
      "\xc5\x93",
      "\xc2\x9d",
      "\xc2\x9e",
      "\xc5\xb8",
      "\xc2\xa0",
      "\xc2\xa1",
      "\xc2\xa2",
      "\xc2\xa3",
      "\xc2\xa4",
      "\xc2\xa5",
      "\xc2\xa6",
      "\xc2\xa7",
      "\xc2\xa8",
      "\xc2\xa9",
      "\xc2\xaa",
      "\xc2\xab",
      "\xc2\xac",
      "\xc2\xad",
      "\xc2\xae",
      "\xc2\xaf",
      "\xc2\xb0",
      "\xc2\xb1",
      "\xc2\xb2",
      "\xc2\xb3",
      "\xc2\xb4",
      "\xc2\xb5",
      "\xc2\xb6",
      "\xc2\xb7",
      "\xc2\xb8",
      "\xc2\xb9",
      "\xc2\xba",
      "\xc2\xbb",
      "\xc2\xbc",
      "\xc2\xbd",
      "\xc2\xbe",
      "\xc2\xbf",
      "\xe1\x83\x90",
      "\xe1\x83\x91",
      "\xe1\x83\x92",
      "\xe1\x83\x93",
      "\xe1\x83\x94",
      "\xe1\x83\x95",
      "\xe1\x83\x96",
      "\xe1\x83\xb1",
      "\xe1\x83\x97",
      "\xe1\x83\x98",
      "\xe1\x83\x99",
      "\xe1\x83\x9a",
      "\xe1\x83\x9b",
      "\xe1\x83\x9c",
      "\xe1\x83\xb2",
      "\xe1\x83\x9d",
      "\xe1\x83\x9e",
      "\xe1\x83\x9f",
      "\xe1\x83\xa0",
      "\xe1\x83\xa1",
      "\xe1\x83\xa2",
      "\xe1\x83\xb3",
      "\xe1\x83\xa3",
      "\xe1\x83\xa4",
      "\xe1\x83\xa5",
      "\xe1\x83\xa6",
      "\xe1\x83\xa7",
      "\xe1\x83\xa8",
      "\xe1\x83\xa9",
      "\xe1\x83\xaa",
      "\xe1\x83\xab",
      "\xe1\x83\xac",
      "\xe1\x83\xad",
      "\xe1\x83\xae",
      "\xe1\x83\xb4",
      "\xe1\x83\xaf",
      "\xe1\x83\xb0",
      "\xe1\x83\xb5",
      "\xc3\xa6",
      "\xc3\xa7",
      "\xc3\xa8",
      "\xc3\xa9",
      "\xc3\xaa",
      "\xc3\xab",
      "\xc3\xac",
      "\xc3\xad",
      "\xc3\xae",
      "\xc3\xaf",
      "\xc3\xb0",
      "\xc3\xb1",
      "\xc3\xb2",
      "\xc3\xb3",
      "\xc3\xb4",
      "\xc3\xb5",
      "\xc3\xb6",
      "\xc3\xb7",
      "\xc3\xb8",
      "\xc3\xb9",
      "\xc3\xba",
      "\xc3\xbb",
      "\xc3\xbc",
      "\xc3\xbd",
      "\xc3\xbe",
      "\xc3\xbf",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x00000080 => "\x80",
      0x00000081 => "\x81",
      0x0000008d => "\x8d",
      0x0000008e => "\x8e",
      0x0000008f => "\x8f",
      0x00000090 => "\x90",
      0x0000009d => "\x9d",
      0x0000009e => "\x9e",
      0x000000a0 => "\xa0",
      0x000000a1 => "\xa1",
      0x000000a2 => "\xa2",
      0x000000a3 => "\xa3",
      0x000000a4 => "\xa4",
      0x000000a5 => "\xa5",
      0x000000a6 => "\xa6",
      0x000000a7 => "\xa7",
      0x000000a8 => "\xa8",
      0x000000a9 => "\xa9",
      0x000000aa => "\xaa",
      0x000000ab => "\xab",
      0x000000ac => "\xac",
      0x000000ad => "\xad",
      0x000000ae => "\xae",
      0x000000af => "\xaf",
      0x000000b0 => "\xb0",
      0x000000b1 => "\xb1",
      0x000000b2 => "\xb2",
      0x000000b3 => "\xb3",
      0x000000b4 => "\xb4",
      0x000000b5 => "\xb5",
      0x000000b6 => "\xb6",
      0x000000b7 => "\xb7",
      0x000000b8 => "\xb8",
      0x000000b9 => "\xb9",
      0x000000ba => "\xba",
      0x000000bb => "\xbb",
      0x000000bc => "\xbc",
      0x000000bd => "\xbd",
      0x000000be => "\xbe",
      0x000000bf => "\xbf",
      0x000000e6 => "\xe6",
      0x000000e7 => "\xe7",
      0x000000e8 => "\xe8",
      0x000000e9 => "\xe9",
      0x000000ea => "\xea",
      0x000000eb => "\xeb",
      0x000000ec => "\xec",
      0x000000ed => "\xed",
      0x000000ee => "\xee",
      0x000000ef => "\xef",
      0x000000f0 => "\xf0",
      0x000000f1 => "\xf1",
      0x000000f2 => "\xf2",
      0x000000f3 => "\xf3",
      0x000000f4 => "\xf4",
      0x000000f5 => "\xf5",
      0x000000f6 => "\xf6",
      0x000000f7 => "\xf7",
      0x000000f8 => "\xf8",
      0x000000f9 => "\xf9",
      0x000000fa => "\xfa",
      0x000000fb => "\xfb",
      0x000000fc => "\xfc",
      0x000000fd => "\xfd",
      0x000000fe => "\xfe",
      0x000000ff => "\xff",
      0x00000152 => "\x8c",
      0x00000153 => "\x9c",
      0x00000160 => "\x8a",
      0x00000161 => "\x9a",
      0x00000178 => "\x9f",
      0x00000192 => "\x83",
      0x000002c6 => "\x88",
      0x000002dc => "\x98",
      0x000010d0 => "\xc0",
      0x000010d1 => "\xc1",
      0x000010d2 => "\xc2",
      0x000010d3 => "\xc3",
      0x000010d4 => "\xc4",
      0x000010d5 => "\xc5",
      0x000010d6 => "\xc6",
      0x000010d7 => "\xc8",
      0x000010d8 => "\xc9",
      0x000010d9 => "\xca",
      0x000010da => "\xcb",
      0x000010db => "\xcc",
      0x000010dc => "\xcd",
      0x000010dd => "\xcf",
      0x000010de => "\xd0",
      0x000010df => "\xd1",
      0x000010e0 => "\xd2",
      0x000010e1 => "\xd3",
      0x000010e2 => "\xd4",
      0x000010e3 => "\xd6",
      0x000010e4 => "\xd7",
      0x000010e5 => "\xd8",
      0x000010e6 => "\xd9",
      0x000010e7 => "\xda",
      0x000010e8 => "\xdb",
      0x000010e9 => "\xdc",
      0x000010ea => "\xdd",
      0x000010eb => "\xde",
      0x000010ec => "\xdf",
      0x000010ed => "\xe0",
      0x000010ee => "\xe1",
      0x000010ef => "\xe3",
      0x000010f0 => "\xe4",
      0x000010f1 => "\xc7",
      0x000010f2 => "\xce",
      0x000010f3 => "\xd5",
      0x000010f4 => "\xe2",
      0x000010f5 => "\xe5",
      0x00002013 => "\x96",
      0x00002014 => "\x97",
      0x00002018 => "\x91",
      0x00002019 => "\x92",
      0x0000201a => "\x82",
      0x0000201c => "\x93",
      0x0000201d => "\x94",
      0x0000201e => "\x84",
      0x00002020 => "\x86",
      0x00002021 => "\x87",
      0x00002022 => "\x95",
      0x00002026 => "\x85",
      0x00002030 => "\x89",
      0x00002039 => "\x8b",
      0x0000203a => "\x9b",
      0x00002122 => "\x99",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::GEORGIAN_PS - Conversion routines for GEORGIAN-PS
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for GEORGIAN-PS.
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE (DEL)
      80 |  00000080 | PADDING CHARACTER (PAD)
      81 |  00000081 | HIGH OCTET PRESET (HOP)
      82 |  0000201A | SINGLE LOW-9 QUOTATION MARK
      83 |  00000192 | LATIN SMALL LETTER F WITH HOOK
      84 |  0000201E | DOUBLE LOW-9 QUOTATION MARK
      85 |  00002026 | HORIZONTAL ELLIPSIS
      86 |  00002020 | DAGGER
      87 |  00002021 | DOUBLE DAGGER
      88 |  000002C6 | MODIFIER LETTER CIRCUMFLEX ACCENT
      89 |  00002030 | PER MILLE SIGN
      8A |  00000160 | LATIN CAPITAL LETTER S WITH CARON
      8B |  00002039 | SINGLE LEFT-POINTING ANGLE QUOTATION MARK
      8C |  00000152 | LATIN CAPITAL LIGATURE OE
      8D |  0000008D | REVERSE LINE FEED (RI)
      8E |  0000008E | SINGLE-SHIFT TWO (SS2)
      8F |  0000008F | SINGLE-SHIFT THREE (SS3)
      90 |  00000090 | DEVICE CONTROL STRING (DCS)
      91 |  00002018 | LEFT SINGLE QUOTATION MARK
      92 |  00002019 | RIGHT SINGLE QUOTATION MARK
      93 |  0000201C | LEFT DOUBLE QUOTATION MARK
      94 |  0000201D | RIGHT DOUBLE QUOTATION MARK
      95 |  00002022 | BULLET
      96 |  00002013 | EN DASH
      97 |  00002014 | EM DASH
      98 |  000002DC | SMALL TILDE
      99 |  00002122 | TRADE MARK SIGN
      9A |  00000161 | LATIN SMALL LETTER S WITH CARON
      9B |  0000203A | SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
      9C |  00000153 | LATIN SMALL LIGATURE OE
      9D |  0000009D | OPERATING SYSTEM COMMAND (OSC)
      9E |  0000009E | PRIVACY MESSAGE (PM)
      9F |  00000178 | LATIN CAPITAL LETTER Y WITH DIAERESIS
      A0 |  000000A0 | NO-BREAK SPACE
      A1 |  000000A1 | INVERTED EXCLAMATION MARK
      A2 |  000000A2 | CENT SIGN
      A3 |  000000A3 | POUND SIGN
      A4 |  000000A4 | CURRENCY SIGN
      A5 |  000000A5 | YEN SIGN
      A6 |  000000A6 | BROKEN BAR
      A7 |  000000A7 | SECTION SIGN
      A8 |  000000A8 | DIAERESIS
      A9 |  000000A9 | COPYRIGHT SIGN
      AA |  000000AA | FEMININE ORDINAL INDICATOR
      AB |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
      AC |  000000AC | NOT SIGN
      AD |  000000AD | SOFT HYPHEN
      AE |  000000AE | REGISTERED SIGN
      AF |  000000AF | MACRON
      B0 |  000000B0 | DEGREE SIGN
      B1 |  000000B1 | PLUS-MINUS SIGN
      B2 |  000000B2 | SUPERSCRIPT TWO
      B3 |  000000B3 | SUPERSCRIPT THREE
      B4 |  000000B4 | ACUTE ACCENT
      B5 |  000000B5 | MICRO SIGN
      B6 |  000000B6 | PILCROW SIGN
      B7 |  000000B7 | MIDDLE DOT
      B8 |  000000B8 | CEDILLA
      B9 |  000000B9 | SUPERSCRIPT ONE
      BA |  000000BA | MASCULINE ORDINAL INDICATOR
      BB |  000000BB | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
      BC |  000000BC | VULGAR FRACTION ONE QUARTER
      BD |  000000BD | VULGAR FRACTION ONE HALF
      BE |  000000BE | VULGAR FRACTION THREE QUARTERS
      BF |  000000BF | INVERTED QUESTION MARK
      C0 |  000010D0 | GEORGIAN LETTER AN
      C1 |  000010D1 | GEORGIAN LETTER BAN
      C2 |  000010D2 | GEORGIAN LETTER GAN
      C3 |  000010D3 | GEORGIAN LETTER DON
      C4 |  000010D4 | GEORGIAN LETTER EN
      C5 |  000010D5 | GEORGIAN LETTER VIN
      C6 |  000010D6 | GEORGIAN LETTER ZEN
      C7 |  000010F1 | GEORGIAN LETTER HE
      C8 |  000010D7 | GEORGIAN LETTER TAN
      C9 |  000010D8 | GEORGIAN LETTER IN
      CA |  000010D9 | GEORGIAN LETTER KAN
      CB |  000010DA | GEORGIAN LETTER LAS
      CC |  000010DB | GEORGIAN LETTER MAN
      CD |  000010DC | GEORGIAN LETTER NAR
      CE |  000010F2 | GEORGIAN LETTER HIE
      CF |  000010DD | GEORGIAN LETTER ON
      D0 |  000010DE | GEORGIAN LETTER PAR
      D1 |  000010DF | GEORGIAN LETTER ZHAR
      D2 |  000010E0 | GEORGIAN LETTER RAE
      D3 |  000010E1 | GEORGIAN LETTER SAN
      D4 |  000010E2 | GEORGIAN LETTER TAR
      D5 |  000010F3 | GEORGIAN LETTER WE
      D6 |  000010E3 | GEORGIAN LETTER UN
      D7 |  000010E4 | GEORGIAN LETTER PHAR
      D8 |  000010E5 | GEORGIAN LETTER KHAR
      D9 |  000010E6 | GEORGIAN LETTER GHAN
      DA |  000010E7 | GEORGIAN LETTER QAR
      DB |  000010E8 | GEORGIAN LETTER SHIN
      DC |  000010E9 | GEORGIAN LETTER CHIN
      DD |  000010EA | GEORGIAN LETTER CAN
      DE |  000010EB | GEORGIAN LETTER JIL
      DF |  000010EC | GEORGIAN LETTER CIL
      E0 |  000010ED | GEORGIAN LETTER CHAR
      E1 |  000010EE | GEORGIAN LETTER XAN
      E2 |  000010F4 | GEORGIAN LETTER HAR
      E3 |  000010EF | GEORGIAN LETTER JHAN
      E4 |  000010F0 | GEORGIAN LETTER HAE
      E5 |  000010F5 | GEORGIAN LETTER HOE
      E6 |  000000E6 | LATIN SMALL LETTER AE
      E7 |  000000E7 | LATIN SMALL LETTER C WITH CEDILLA
      E8 |  000000E8 | LATIN SMALL LETTER E WITH GRAVE
      E9 |  000000E9 | LATIN SMALL LETTER E WITH ACUTE
      EA |  000000EA | LATIN SMALL LETTER E WITH CIRCUMFLEX
      EB |  000000EB | LATIN SMALL LETTER E WITH DIAERESIS
      EC |  000000EC | LATIN SMALL LETTER I WITH GRAVE
      ED |  000000ED | LATIN SMALL LETTER I WITH ACUTE
      EE |  000000EE | LATIN SMALL LETTER I WITH CIRCUMFLEX
      EF |  000000EF | LATIN SMALL LETTER I WITH DIAERESIS
      F0 |  000000F0 | LATIN SMALL LETTER ETH (Icelandic)
      F1 |  000000F1 | LATIN SMALL LETTER N WITH TILDE
      F2 |  000000F2 | LATIN SMALL LETTER O WITH GRAVE
      F3 |  000000F3 | LATIN SMALL LETTER O WITH ACUTE
      F4 |  000000F4 | LATIN SMALL LETTER O WITH CIRCUMFLEX
      F5 |  000000F5 | LATIN SMALL LETTER O WITH TILDE
      F6 |  000000F6 | LATIN SMALL LETTER O WITH DIAERESIS
      F7 |  000000F7 | DIVISION SIGN
      F8 |  000000F8 | LATIN SMALL LETTER O WITH STROKE
      F9 |  000000F9 | LATIN SMALL LETTER U WITH GRAVE
      FA |  000000FA | LATIN SMALL LETTER U WITH ACUTE
      FB |  000000FB | LATIN SMALL LETTER U WITH CIRCUMFLEX
      FC |  000000FC | LATIN SMALL LETTER U WITH DIAERESIS
      FD |  000000FD | LATIN SMALL LETTER Y WITH ACUTE
      FE |  000000FE | LATIN SMALL LETTER THORN (Icelandic)
      FF |  000000FF | LATIN SMALL LETTER Y WITH DIAERESIS
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_GEORGIAN_PS

    $main::fatpacked{"Locale/RecodeData/GOST_19768_74.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_GOST_19768_74';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for GOST_19768-74.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::GOST_19768_74;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0x0080,
      0x0081,
      0x0082,
      0x0083,
      0x0084,
      0x0085,
      0x0086,
      0x0087,
      0x0088,
      0x0089,
      0x008a,
      0x008b,
      0x008c,
      0x008d,
      0x008e,
      0x008f,
      0x0090,
      0x0091,
      0x0092,
      0x0093,
      0x0094,
      0x0095,
      0x0096,
      0x0097,
      0x0098,
      0x0099,
      0x009a,
      0x009b,
      0x009c,
      0x009d,
      0x009e,
      0x009f,
      0x00a0,
      0x0401,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00ad,
      0xfffd,
      0xfffd,
      0x0410,
      0x0411,
      0x0412,
      0x0413,
      0x0414,
      0x0415,
      0x0416,
      0x0417,
      0x0418,
      0x0419,
      0x041a,
      0x041b,
      0x041c,
      0x041d,
      0x041e,
      0x041f,
      0x0420,
      0x0421,
      0x0422,
      0x0423,
      0x0424,
      0x0425,
      0x0426,
      0x0427,
      0x0428,
      0x0429,
      0x042a,
      0x042b,
      0x042c,
      0x042d,
      0x042e,
      0x042f,
      0x0430,
      0x0431,
      0x0432,
      0x0433,
      0x0434,
      0x0435,
      0x0436,
      0x0437,
      0x0438,
      0x0439,
      0x043a,
      0x043b,
      0x043c,
      0x043d,
      0x043e,
      0x043f,
      0x0440,
      0x0441,
      0x0442,
      0x0443,
      0x0444,
      0x0445,
      0x0446,
      0x0447,
      0x0448,
      0x0449,
      0x044a,
      0x044b,
      0x044c,
      0x044d,
      0x044e,
      0x044f,
      0xfffd,
      0x0451,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xc2\x80",
      "\xc2\x81",
      "\xc2\x82",
      "\xc2\x83",
      "\xc2\x84",
      "\xc2\x85",
      "\xc2\x86",
      "\xc2\x87",
      "\xc2\x88",
      "\xc2\x89",
      "\xc2\x8a",
      "\xc2\x8b",
      "\xc2\x8c",
      "\xc2\x8d",
      "\xc2\x8e",
      "\xc2\x8f",
      "\xc2\x90",
      "\xc2\x91",
      "\xc2\x92",
      "\xc2\x93",
      "\xc2\x94",
      "\xc2\x95",
      "\xc2\x96",
      "\xc2\x97",
      "\xc2\x98",
      "\xc2\x99",
      "\xc2\x9a",
      "\xc2\x9b",
      "\xc2\x9c",
      "\xc2\x9d",
      "\xc2\x9e",
      "\xc2\x9f",
      "\xc2\xa0",
      "\xd0\x81",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc2\xad",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xd0\x90",
      "\xd0\x91",
      "\xd0\x92",
      "\xd0\x93",
      "\xd0\x94",
      "\xd0\x95",
      "\xd0\x96",
      "\xd0\x97",
      "\xd0\x98",
      "\xd0\x99",
      "\xd0\x9a",
      "\xd0\x9b",
      "\xd0\x9c",
      "\xd0\x9d",
      "\xd0\x9e",
      "\xd0\x9f",
      "\xd0\xa0",
      "\xd0\xa1",
      "\xd0\xa2",
      "\xd0\xa3",
      "\xd0\xa4",
      "\xd0\xa5",
      "\xd0\xa6",
      "\xd0\xa7",
      "\xd0\xa8",
      "\xd0\xa9",
      "\xd0\xaa",
      "\xd0\xab",
      "\xd0\xac",
      "\xd0\xad",
      "\xd0\xae",
      "\xd0\xaf",
      "\xd0\xb0",
      "\xd0\xb1",
      "\xd0\xb2",
      "\xd0\xb3",
      "\xd0\xb4",
      "\xd0\xb5",
      "\xd0\xb6",
      "\xd0\xb7",
      "\xd0\xb8",
      "\xd0\xb9",
      "\xd0\xba",
      "\xd0\xbb",
      "\xd0\xbc",
      "\xd0\xbd",
      "\xd0\xbe",
      "\xd0\xbf",
      "\xd1\x80",
      "\xd1\x81",
      "\xd1\x82",
      "\xd1\x83",
      "\xd1\x84",
      "\xd1\x85",
      "\xd1\x86",
      "\xd1\x87",
      "\xd1\x88",
      "\xd1\x89",
      "\xd1\x8a",
      "\xd1\x8b",
      "\xd1\x8c",
      "\xd1\x8d",
      "\xd1\x8e",
      "\xd1\x8f",
      "\xef\xbf\xbd",
      "\xd1\x91",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x00000080 => "\x80",
      0x00000081 => "\x81",
      0x00000082 => "\x82",
      0x00000083 => "\x83",
      0x00000084 => "\x84",
      0x00000085 => "\x85",
      0x00000086 => "\x86",
      0x00000087 => "\x87",
      0x00000088 => "\x88",
      0x00000089 => "\x89",
      0x0000008a => "\x8a",
      0x0000008b => "\x8b",
      0x0000008c => "\x8c",
      0x0000008d => "\x8d",
      0x0000008e => "\x8e",
      0x0000008f => "\x8f",
      0x00000090 => "\x90",
      0x00000091 => "\x91",
      0x00000092 => "\x92",
      0x00000093 => "\x93",
      0x00000094 => "\x94",
      0x00000095 => "\x95",
      0x00000096 => "\x96",
      0x00000097 => "\x97",
      0x00000098 => "\x98",
      0x00000099 => "\x99",
      0x0000009a => "\x9a",
      0x0000009b => "\x9b",
      0x0000009c => "\x9c",
      0x0000009d => "\x9d",
      0x0000009e => "\x9e",
      0x0000009f => "\x9f",
      0x000000a0 => "\xa0",
      0x000000ad => "\xad",
      0x00000401 => "\xa1",
      0x00000410 => "\xb0",
      0x00000411 => "\xb1",
      0x00000412 => "\xb2",
      0x00000413 => "\xb3",
      0x00000414 => "\xb4",
      0x00000415 => "\xb5",
      0x00000416 => "\xb6",
      0x00000417 => "\xb7",
      0x00000418 => "\xb8",
      0x00000419 => "\xb9",
      0x0000041a => "\xba",
      0x0000041b => "\xbb",
      0x0000041c => "\xbc",
      0x0000041d => "\xbd",
      0x0000041e => "\xbe",
      0x0000041f => "\xbf",
      0x00000420 => "\xc0",
      0x00000421 => "\xc1",
      0x00000422 => "\xc2",
      0x00000423 => "\xc3",
      0x00000424 => "\xc4",
      0x00000425 => "\xc5",
      0x00000426 => "\xc6",
      0x00000427 => "\xc7",
      0x00000428 => "\xc8",
      0x00000429 => "\xc9",
      0x0000042a => "\xca",
      0x0000042b => "\xcb",
      0x0000042c => "\xcc",
      0x0000042d => "\xcd",
      0x0000042e => "\xce",
      0x0000042f => "\xcf",
      0x00000430 => "\xd0",
      0x00000431 => "\xd1",
      0x00000432 => "\xd2",
      0x00000433 => "\xd3",
      0x00000434 => "\xd4",
      0x00000435 => "\xd5",
      0x00000436 => "\xd6",
      0x00000437 => "\xd7",
      0x00000438 => "\xd8",
      0x00000439 => "\xd9",
      0x0000043a => "\xda",
      0x0000043b => "\xdb",
      0x0000043c => "\xdc",
      0x0000043d => "\xdd",
      0x0000043e => "\xde",
      0x0000043f => "\xdf",
      0x00000440 => "\xe0",
      0x00000441 => "\xe1",
      0x00000442 => "\xe2",
      0x00000443 => "\xe3",
      0x00000444 => "\xe4",
      0x00000445 => "\xe5",
      0x00000446 => "\xe6",
      0x00000447 => "\xe7",
      0x00000448 => "\xe8",
      0x00000449 => "\xe9",
      0x0000044a => "\xea",
      0x0000044b => "\xeb",
      0x0000044c => "\xec",
      0x0000044d => "\xed",
      0x0000044e => "\xee",
      0x0000044f => "\xef",
      0x00000451 => "\xf1",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::GOST_19768_74 - Conversion routines for GOST_19768_74
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for GOST_19768-74.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: ECMA registry
   alias ST_SEV_358-88
   alias ISO-IR-153
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE (DEL)
      80 |  00000080 | PADDING CHARACTER (PAD)
      81 |  00000081 | HIGH OCTET PRESET (HOP)
      82 |  00000082 | BREAK PERMITTED HERE (BPH)
      83 |  00000083 | NO BREAK HERE (NBH)
      84 |  00000084 | INDEX (IND)
      85 |  00000085 | NEXT LINE (NEL)
      86 |  00000086 | START OF SELECTED AREA (SSA)
      87 |  00000087 | END OF SELECTED AREA (ESA)
      88 |  00000088 | CHARACTER TABULATION SET (HTS)
      89 |  00000089 | CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
      8A |  0000008A | LINE TABULATION SET (VTS)
      8B |  0000008B | PARTIAL LINE FORWARD (PLD)
      8C |  0000008C | PARTIAL LINE BACKWARD (PLU)
      8D |  0000008D | REVERSE LINE FEED (RI)
      8E |  0000008E | SINGLE-SHIFT TWO (SS2)
      8F |  0000008F | SINGLE-SHIFT THREE (SS3)
      90 |  00000090 | DEVICE CONTROL STRING (DCS)
      91 |  00000091 | PRIVATE USE ONE (PU1)
      92 |  00000092 | PRIVATE USE TWO (PU2)
      93 |  00000093 | SET TRANSMIT STATE (STS)
      94 |  00000094 | CANCEL CHARACTER (CCH)
      95 |  00000095 | MESSAGE WAITING (MW)
      96 |  00000096 | START OF GUARDED AREA (SPA)
      97 |  00000097 | END OF GUARDED AREA (EPA)
      98 |  00000098 | START OF STRING (SOS)
      99 |  00000099 | SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
      9A |  0000009A | SINGLE CHARACTER INTRODUCER (SCI)
      9B |  0000009B | CONTROL SEQUENCE INTRODUCER (CSI)
      9C |  0000009C | STRING TERMINATOR (ST)
      9D |  0000009D | OPERATING SYSTEM COMMAND (OSC)
      9E |  0000009E | PRIVACY MESSAGE (PM)
      9F |  0000009F | APPLICATION PROGRAM COMMAND (APC)
      A0 |  000000A0 | NO-BREAK SPACE
      A1 |  00000401 | CYRILLIC CAPITAL LETTER IO
      AD |  000000AD | SOFT HYPHEN
      B0 |  00000410 | CYRILLIC CAPITAL LETTER A
      B1 |  00000411 | CYRILLIC CAPITAL LETTER BE
      B2 |  00000412 | CYRILLIC CAPITAL LETTER VE
      B3 |  00000413 | CYRILLIC CAPITAL LETTER GHE
      B4 |  00000414 | CYRILLIC CAPITAL LETTER DE
      B5 |  00000415 | CYRILLIC CAPITAL LETTER IE
      B6 |  00000416 | CYRILLIC CAPITAL LETTER ZHE
      B7 |  00000417 | CYRILLIC CAPITAL LETTER ZE
      B8 |  00000418 | CYRILLIC CAPITAL LETTER I
      B9 |  00000419 | CYRILLIC CAPITAL LETTER SHORT I
      BA |  0000041A | CYRILLIC CAPITAL LETTER KA
      BB |  0000041B | CYRILLIC CAPITAL LETTER EL
      BC |  0000041C | CYRILLIC CAPITAL LETTER EM
      BD |  0000041D | CYRILLIC CAPITAL LETTER EN
      BE |  0000041E | CYRILLIC CAPITAL LETTER O
      BF |  0000041F | CYRILLIC CAPITAL LETTER PE
      C0 |  00000420 | CYRILLIC CAPITAL LETTER ER
      C1 |  00000421 | CYRILLIC CAPITAL LETTER ES
      C2 |  00000422 | CYRILLIC CAPITAL LETTER TE
      C3 |  00000423 | CYRILLIC CAPITAL LETTER U
      C4 |  00000424 | CYRILLIC CAPITAL LETTER EF
      C5 |  00000425 | CYRILLIC CAPITAL LETTER HA
      C6 |  00000426 | CYRILLIC CAPITAL LETTER TSE
      C7 |  00000427 | CYRILLIC CAPITAL LETTER CHE
      C8 |  00000428 | CYRILLIC CAPITAL LETTER SHA
      C9 |  00000429 | CYRILLIC CAPITAL LETTER SHCHA
      CA |  0000042A | CYRILLIC CAPITAL LETTER HARD SIGN
      CB |  0000042B | CYRILLIC CAPITAL LETTER YERU
      CC |  0000042C | CYRILLIC CAPITAL LETTER SOFT SIGN
      CD |  0000042D | CYRILLIC CAPITAL LETTER E
      CE |  0000042E | CYRILLIC CAPITAL LETTER YU
      CF |  0000042F | CYRILLIC CAPITAL LETTER YA
      D0 |  00000430 | CYRILLIC SMALL LETTER A
      D1 |  00000431 | CYRILLIC SMALL LETTER BE
      D2 |  00000432 | CYRILLIC SMALL LETTER VE
      D3 |  00000433 | CYRILLIC SMALL LETTER GHE
      D4 |  00000434 | CYRILLIC SMALL LETTER DE
      D5 |  00000435 | CYRILLIC SMALL LETTER IE
      D6 |  00000436 | CYRILLIC SMALL LETTER ZHE
      D7 |  00000437 | CYRILLIC SMALL LETTER ZE
      D8 |  00000438 | CYRILLIC SMALL LETTER I
      D9 |  00000439 | CYRILLIC SMALL LETTER SHORT I
      DA |  0000043A | CYRILLIC SMALL LETTER KA
      DB |  0000043B | CYRILLIC SMALL LETTER EL
      DC |  0000043C | CYRILLIC SMALL LETTER EM
      DD |  0000043D | CYRILLIC SMALL LETTER EN
      DE |  0000043E | CYRILLIC SMALL LETTER O
      DF |  0000043F | CYRILLIC SMALL LETTER PE
      E0 |  00000440 | CYRILLIC SMALL LETTER ER
      E1 |  00000441 | CYRILLIC SMALL LETTER ES
      E2 |  00000442 | CYRILLIC SMALL LETTER TE
      E3 |  00000443 | CYRILLIC SMALL LETTER U
      E4 |  00000444 | CYRILLIC SMALL LETTER EF
      E5 |  00000445 | CYRILLIC SMALL LETTER HA
      E6 |  00000446 | CYRILLIC SMALL LETTER TSE
      E7 |  00000447 | CYRILLIC SMALL LETTER CHE
      E8 |  00000448 | CYRILLIC SMALL LETTER SHA
      E9 |  00000449 | CYRILLIC SMALL LETTER SHCHA
      EA |  0000044A | CYRILLIC SMALL LETTER HARD SIGN
      EB |  0000044B | CYRILLIC SMALL LETTER YERU
      EC |  0000044C | CYRILLIC SMALL LETTER SOFT SIGN
      ED |  0000044D | CYRILLIC SMALL LETTER E
      EE |  0000044E | CYRILLIC SMALL LETTER YU
      EF |  0000044F | CYRILLIC SMALL LETTER YA
      F1 |  00000451 | CYRILLIC SMALL LETTER IO
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_GOST_19768_74

    $main::fatpacked{"Locale/RecodeData/GREEK7.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_GREEK7';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for GREEK7.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::GREEK7;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x00a4,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0391,
      0x0392,
      0x0393,
      0x0394,
      0x0395,
      0x0396,
      0x0397,
      0x0398,
      0x0399,
      0xfffd,
      0x039a,
      0x039b,
      0x039c,
      0x039d,
      0x039e,
      0x039f,
      0x03a0,
      0x03a1,
      0x03a3,
      0x03a4,
      0x03a5,
      0x03a6,
      0xfffd,
      0x03a7,
      0x03a8,
      0x03a9,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x03b1,
      0x03b2,
      0x03b3,
      0x03b4,
      0x03b5,
      0x03b6,
      0x03b7,
      0x03b8,
      0x03b9,
      0xfffd,
      0x03ba,
      0x03bb,
      0x03bc,
      0x03bd,
      0x03be,
      0x03bf,
      0x03c0,
      0x03c1,
      0x03c3,
      0x03c4,
      0x03c5,
      0x03c6,
      0x03c2,
      0x03c7,
      0x03c8,
      0x03c9,
      0x007b,
      0x007c,
      0x007d,
      0x203e,
      0x007f,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\xc2\xa4",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\xce\x91",
      "\xce\x92",
      "\xce\x93",
      "\xce\x94",
      "\xce\x95",
      "\xce\x96",
      "\xce\x97",
      "\xce\x98",
      "\xce\x99",
      "\xef\xbf\xbd",
      "\xce\x9a",
      "\xce\x9b",
      "\xce\x9c",
      "\xce\x9d",
      "\xce\x9e",
      "\xce\x9f",
      "\xce\xa0",
      "\xce\xa1",
      "\xce\xa3",
      "\xce\xa4",
      "\xce\xa5",
      "\xce\xa6",
      "\xef\xbf\xbd",
      "\xce\xa7",
      "\xce\xa8",
      "\xce\xa9",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\xce\xb1",
      "\xce\xb2",
      "\xce\xb3",
      "\xce\xb4",
      "\xce\xb5",
      "\xce\xb6",
      "\xce\xb7",
      "\xce\xb8",
      "\xce\xb9",
      "\xef\xbf\xbd",
      "\xce\xba",
      "\xce\xbb",
      "\xce\xbc",
      "\xce\xbd",
      "\xce\xbe",
      "\xce\xbf",
      "\xcf\x80",
      "\xcf\x81",
      "\xcf\x83",
      "\xcf\x84",
      "\xcf\x85",
      "\xcf\x86",
      "\xcf\x82",
      "\xcf\x87",
      "\xcf\x88",
      "\xcf\x89",
      "\x7b",
      "\x7c",
      "\x7d",
      "\xe2\x80\xbe",
      "\x7f",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007f => "\x7f",
      0x000000a4 => "\x24",
      0x00000391 => "\x41",
      0x00000392 => "\x42",
      0x00000393 => "\x43",
      0x00000394 => "\x44",
      0x00000395 => "\x45",
      0x00000396 => "\x46",
      0x00000397 => "\x47",
      0x00000398 => "\x48",
      0x00000399 => "\x49",
      0x0000039a => "\x4b",
      0x0000039b => "\x4c",
      0x0000039c => "\x4d",
      0x0000039d => "\x4e",
      0x0000039e => "\x4f",
      0x0000039f => "\x50",
      0x000003a0 => "\x51",
      0x000003a1 => "\x52",
      0x000003a3 => "\x53",
      0x000003a4 => "\x54",
      0x000003a5 => "\x55",
      0x000003a6 => "\x56",
      0x000003a7 => "\x58",
      0x000003a8 => "\x59",
      0x000003a9 => "\x5a",
      0x000003b1 => "\x61",
      0x000003b2 => "\x62",
      0x000003b3 => "\x63",
      0x000003b4 => "\x64",
      0x000003b5 => "\x65",
      0x000003b6 => "\x66",
      0x000003b7 => "\x67",
      0x000003b8 => "\x68",
      0x000003b9 => "\x69",
      0x000003ba => "\x6b",
      0x000003bb => "\x6c",
      0x000003bc => "\x6d",
      0x000003bd => "\x6e",
      0x000003be => "\x6f",
      0x000003bf => "\x70",
      0x000003c0 => "\x71",
      0x000003c1 => "\x72",
      0x000003c2 => "\x77",
      0x000003c3 => "\x73",
      0x000003c4 => "\x74",
      0x000003c5 => "\x75",
      0x000003c6 => "\x76",
      0x000003c7 => "\x78",
      0x000003c8 => "\x79",
      0x000003c9 => "\x7a",
      0x0000203e => "\x7e",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::GREEK7 - Conversion routines for GREEK7
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for GREEK7.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
   repertoiremap: mnemonic,ds
    source: ECMA registry
   alias ISO-IR-88
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  000000A4 | CURRENCY SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000391 | GREEK CAPITAL LETTER ALPHA
      42 |  00000392 | GREEK CAPITAL LETTER BETA
      43 |  00000393 | GREEK CAPITAL LETTER GAMMA
      44 |  00000394 | GREEK CAPITAL LETTER DELTA
      45 |  00000395 | GREEK CAPITAL LETTER EPSILON
      46 |  00000396 | GREEK CAPITAL LETTER ZETA
      47 |  00000397 | GREEK CAPITAL LETTER ETA
      48 |  00000398 | GREEK CAPITAL LETTER THETA
      49 |  00000399 | GREEK CAPITAL LETTER IOTA
      4B |  0000039A | GREEK CAPITAL LETTER KAPPA
      4C |  0000039B | GREEK CAPITAL LETTER LAMDA
      4D |  0000039C | GREEK CAPITAL LETTER MU
      4E |  0000039D | GREEK CAPITAL LETTER NU
      4F |  0000039E | GREEK CAPITAL LETTER XI
      50 |  0000039F | GREEK CAPITAL LETTER OMICRON
      51 |  000003A0 | GREEK CAPITAL LETTER PI
      52 |  000003A1 | GREEK CAPITAL LETTER RHO
      53 |  000003A3 | GREEK CAPITAL LETTER SIGMA
      54 |  000003A4 | GREEK CAPITAL LETTER TAU
      55 |  000003A5 | GREEK CAPITAL LETTER UPSILON
      56 |  000003A6 | GREEK CAPITAL LETTER PHI
      58 |  000003A7 | GREEK CAPITAL LETTER CHI
      59 |  000003A8 | GREEK CAPITAL LETTER PSI
      5A |  000003A9 | GREEK CAPITAL LETTER OMEGA
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  000003B1 | GREEK SMALL LETTER ALPHA
      62 |  000003B2 | GREEK SMALL LETTER BETA
      63 |  000003B3 | GREEK SMALL LETTER GAMMA
      64 |  000003B4 | GREEK SMALL LETTER DELTA
      65 |  000003B5 | GREEK SMALL LETTER EPSILON
      66 |  000003B6 | GREEK SMALL LETTER ZETA
      67 |  000003B7 | GREEK SMALL LETTER ETA
      68 |  000003B8 | GREEK SMALL LETTER THETA
      69 |  000003B9 | GREEK SMALL LETTER IOTA
      6B |  000003BA | GREEK SMALL LETTER KAPPA
      6C |  000003BB | GREEK SMALL LETTER LAMDA
      6D |  000003BC | GREEK SMALL LETTER MU
      6E |  000003BD | GREEK SMALL LETTER NU
      6F |  000003BE | GREEK SMALL LETTER XI
      70 |  000003BF | GREEK SMALL LETTER OMICRON
      71 |  000003C0 | GREEK SMALL LETTER PI
      72 |  000003C1 | GREEK SMALL LETTER RHO
      73 |  000003C3 | GREEK SMALL LETTER SIGMA
      74 |  000003C4 | GREEK SMALL LETTER TAU
      75 |  000003C5 | GREEK SMALL LETTER UPSILON
      76 |  000003C6 | GREEK SMALL LETTER PHI
      77 |  000003C2 | GREEK SMALL LETTER FINAL SIGMA
      78 |  000003C7 | GREEK SMALL LETTER CHI
      79 |  000003C8 | GREEK SMALL LETTER PSI
      7A |  000003C9 | GREEK SMALL LETTER OMEGA
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000203E | OVERLINE
      7F |  0000007F | DELETE (DEL)
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_GREEK7

    $main::fatpacked{"Locale/RecodeData/GREEK7_OLD.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_GREEK7_OLD';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for GREEK7-OLD.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::GREEK7_OLD;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x00a3,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x00b4,
      0x03b1,
      0x03b2,
      0x03c8,
      0x03b4,
      0x03b5,
      0x03c6,
      0x03b3,
      0x03b7,
      0x03b9,
      0x03be,
      0x03ba,
      0x03bb,
      0x03bc,
      0x03bd,
      0x03bf,
      0x03c0,
      0x037a,
      0x03c1,
      0x03c3,
      0x03c4,
      0x03b8,
      0x03c9,
      0x03c2,
      0x03c7,
      0x03c5,
      0x03b6,
      0x1fcf,
      0x1fbf,
      0x1fce,
      0x007e,
      0x005f,
      0x0060,
      0x0391,
      0x0392,
      0x03a8,
      0x0394,
      0x0395,
      0x03a6,
      0x0393,
      0x0397,
      0x0399,
      0x039e,
      0x039a,
      0x039b,
      0x039c,
      0x039d,
      0x039f,
      0x03a0,
      0xfffd,
      0x03a1,
      0x03a3,
      0x03a4,
      0x0398,
      0x03a9,
      0x00b7,
      0x03a7,
      0x03a5,
      0x0396,
      0x1fdf,
      0x1ffe,
      0x1fde,
      0x00a8,
      0x007f,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\xc2\xa3",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\xc2\xb4",
      "\xce\xb1",
      "\xce\xb2",
      "\xcf\x88",
      "\xce\xb4",
      "\xce\xb5",
      "\xcf\x86",
      "\xce\xb3",
      "\xce\xb7",
      "\xce\xb9",
      "\xce\xbe",
      "\xce\xba",
      "\xce\xbb",
      "\xce\xbc",
      "\xce\xbd",
      "\xce\xbf",
      "\xcf\x80",
      "\xcd\xba",
      "\xcf\x81",
      "\xcf\x83",
      "\xcf\x84",
      "\xce\xb8",
      "\xcf\x89",
      "\xcf\x82",
      "\xcf\x87",
      "\xcf\x85",
      "\xce\xb6",
      "\xe1\xbf\x8f",
      "\xe1\xbe\xbf",
      "\xe1\xbf\x8e",
      "\x7e",
      "\x5f",
      "\x60",
      "\xce\x91",
      "\xce\x92",
      "\xce\xa8",
      "\xce\x94",
      "\xce\x95",
      "\xce\xa6",
      "\xce\x93",
      "\xce\x97",
      "\xce\x99",
      "\xce\x9e",
      "\xce\x9a",
      "\xce\x9b",
      "\xce\x9c",
      "\xce\x9d",
      "\xce\x9f",
      "\xce\xa0",
      "\xef\xbf\xbd",
      "\xce\xa1",
      "\xce\xa3",
      "\xce\xa4",
      "\xce\x98",
      "\xce\xa9",
      "\xc2\xb7",
      "\xce\xa7",
      "\xce\xa5",
      "\xce\x96",
      "\xe1\xbf\x9f",
      "\xe1\xbf\xbe",
      "\xe1\xbf\x9e",
      "\xc2\xa8",
      "\x7f",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x0000007e => "\x5e",
      0x0000007f => "\x7f",
      0x000000a3 => "\x23",
      0x000000a8 => "\x7e",
      0x000000b4 => "\x40",
      0x000000b7 => "\x77",
      0x0000037a => "\x51",
      0x00000391 => "\x61",
      0x00000392 => "\x62",
      0x00000393 => "\x67",
      0x00000394 => "\x64",
      0x00000395 => "\x65",
      0x00000396 => "\x7a",
      0x00000397 => "\x68",
      0x00000398 => "\x75",
      0x00000399 => "\x69",
      0x0000039a => "\x6b",
      0x0000039b => "\x6c",
      0x0000039c => "\x6d",
      0x0000039d => "\x6e",
      0x0000039e => "\x6a",
      0x0000039f => "\x6f",
      0x000003a0 => "\x70",
      0x000003a1 => "\x72",
      0x000003a3 => "\x73",
      0x000003a4 => "\x74",
      0x000003a5 => "\x79",
      0x000003a6 => "\x66",
      0x000003a7 => "\x78",
      0x000003a8 => "\x63",
      0x000003a9 => "\x76",
      0x000003b1 => "\x41",
      0x000003b2 => "\x42",
      0x000003b3 => "\x47",
      0x000003b4 => "\x44",
      0x000003b5 => "\x45",
      0x000003b6 => "\x5a",
      0x000003b7 => "\x48",
      0x000003b8 => "\x55",
      0x000003b9 => "\x49",
      0x000003ba => "\x4b",
      0x000003bb => "\x4c",
      0x000003bc => "\x4d",
      0x000003bd => "\x4e",
      0x000003be => "\x4a",
      0x000003bf => "\x4f",
      0x000003c0 => "\x50",
      0x000003c1 => "\x52",
      0x000003c2 => "\x57",
      0x000003c3 => "\x53",
      0x000003c4 => "\x54",
      0x000003c5 => "\x59",
      0x000003c6 => "\x46",
      0x000003c7 => "\x58",
      0x000003c8 => "\x43",
      0x000003c9 => "\x56",
      0x00001fbf => "\x5c",
      0x00001fce => "\x5d",
      0x00001fcf => "\x5b",
      0x00001fde => "\x7d",
      0x00001fdf => "\x7b",
      0x00001ffe => "\x7c",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::GREEK7_OLD - Conversion routines for GREEK7_OLD
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for GREEK7-OLD.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: ECMA registry
   alias ISO-IR-18
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  000000A3 | POUND SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  000000B4 | ACUTE ACCENT
      41 |  000003B1 | GREEK SMALL LETTER ALPHA
      42 |  000003B2 | GREEK SMALL LETTER BETA
      43 |  000003C8 | GREEK SMALL LETTER PSI
      44 |  000003B4 | GREEK SMALL LETTER DELTA
      45 |  000003B5 | GREEK SMALL LETTER EPSILON
      46 |  000003C6 | GREEK SMALL LETTER PHI
      47 |  000003B3 | GREEK SMALL LETTER GAMMA
      48 |  000003B7 | GREEK SMALL LETTER ETA
      49 |  000003B9 | GREEK SMALL LETTER IOTA
      4A |  000003BE | GREEK SMALL LETTER XI
      4B |  000003BA | GREEK SMALL LETTER KAPPA
      4C |  000003BB | GREEK SMALL LETTER LAMDA
      4D |  000003BC | GREEK SMALL LETTER MU
      4E |  000003BD | GREEK SMALL LETTER NU
      4F |  000003BF | GREEK SMALL LETTER OMICRON
      50 |  000003C0 | GREEK SMALL LETTER PI
      51 |  0000037A | GREEK YPOGEGRAMMENI
      52 |  000003C1 | GREEK SMALL LETTER RHO
      53 |  000003C3 | GREEK SMALL LETTER SIGMA
      54 |  000003C4 | GREEK SMALL LETTER TAU
      55 |  000003B8 | GREEK SMALL LETTER THETA
      56 |  000003C9 | GREEK SMALL LETTER OMEGA
      57 |  000003C2 | GREEK SMALL LETTER FINAL SIGMA
      58 |  000003C7 | GREEK SMALL LETTER CHI
      59 |  000003C5 | GREEK SMALL LETTER UPSILON
      5A |  000003B6 | GREEK SMALL LETTER ZETA
      5B |  00001FCF | GREEK PSILI AND PERISPOMENI
      5C |  00001FBF | GREEK PSILI
      5D |  00001FCE | GREEK PSILI AND OXIA
      5E |  0000007E | TILDE
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000391 | GREEK CAPITAL LETTER ALPHA
      62 |  00000392 | GREEK CAPITAL LETTER BETA
      63 |  000003A8 | GREEK CAPITAL LETTER PSI
      64 |  00000394 | GREEK CAPITAL LETTER DELTA
      65 |  00000395 | GREEK CAPITAL LETTER EPSILON
      66 |  000003A6 | GREEK CAPITAL LETTER PHI
      67 |  00000393 | GREEK CAPITAL LETTER GAMMA
      68 |  00000397 | GREEK CAPITAL LETTER ETA
      69 |  00000399 | GREEK CAPITAL LETTER IOTA
      6A |  0000039E | GREEK CAPITAL LETTER XI
      6B |  0000039A | GREEK CAPITAL LETTER KAPPA
      6C |  0000039B | GREEK CAPITAL LETTER LAMDA
      6D |  0000039C | GREEK CAPITAL LETTER MU
      6E |  0000039D | GREEK CAPITAL LETTER NU
      6F |  0000039F | GREEK CAPITAL LETTER OMICRON
      70 |  000003A0 | GREEK CAPITAL LETTER PI
      72 |  000003A1 | GREEK CAPITAL LETTER RHO
      73 |  000003A3 | GREEK CAPITAL LETTER SIGMA
      74 |  000003A4 | GREEK CAPITAL LETTER TAU
      75 |  00000398 | GREEK CAPITAL LETTER THETA
      76 |  000003A9 | GREEK CAPITAL LETTER OMEGA
      77 |  000000B7 | MIDDLE DOT
      78 |  000003A7 | GREEK CAPITAL LETTER CHI
      79 |  000003A5 | GREEK CAPITAL LETTER UPSILON
      7A |  00000396 | GREEK CAPITAL LETTER ZETA
      7B |  00001FDF | GREEK DASIA AND PERISPOMENI
      7C |  00001FFE | GREEK DASIA
      7D |  00001FDE | GREEK DASIA AND OXIA
      7E |  000000A8 | DIAERESIS
      7F |  0000007F | DELETE (DEL)
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_GREEK7_OLD

    $main::fatpacked{"Locale/RecodeData/GREEK_CCITT.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_GREEK_CCITT';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for GREEK-CCITT.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::GREEK_CCITT;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x00a4,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0391,
      0x0392,
      0x0393,
      0x0394,
      0x0395,
      0x0396,
      0x0397,
      0x0398,
      0x0399,
      0x039a,
      0x039b,
      0x039c,
      0x039d,
      0x039e,
      0x039f,
      0x03a0,
      0x03a1,
      0xfffd,
      0x03a3,
      0x03a4,
      0x03a5,
      0x03a6,
      0x03a7,
      0x03a8,
      0x03a9,
      0xfffd,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0xfffd,
      0x03b1,
      0x03b2,
      0x03b3,
      0x03b4,
      0x03b5,
      0x03b6,
      0x03b7,
      0x03b8,
      0x03b9,
      0x03ba,
      0x03bb,
      0x03bc,
      0x03bd,
      0x03be,
      0x03bf,
      0x03c0,
      0x03c1,
      0x03c2,
      0x03c3,
      0x03c4,
      0x03c5,
      0x03c6,
      0x03c7,
      0x03c8,
      0x03c9,
      0xfffd,
      0x007b,
      0x007c,
      0x007d,
      0x00af,
      0x007f,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\xc2\xa4",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\xce\x91",
      "\xce\x92",
      "\xce\x93",
      "\xce\x94",
      "\xce\x95",
      "\xce\x96",
      "\xce\x97",
      "\xce\x98",
      "\xce\x99",
      "\xce\x9a",
      "\xce\x9b",
      "\xce\x9c",
      "\xce\x9d",
      "\xce\x9e",
      "\xce\x9f",
      "\xce\xa0",
      "\xce\xa1",
      "\xef\xbf\xbd",
      "\xce\xa3",
      "\xce\xa4",
      "\xce\xa5",
      "\xce\xa6",
      "\xce\xa7",
      "\xce\xa8",
      "\xce\xa9",
      "\xef\xbf\xbd",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\xef\xbf\xbd",
      "\xce\xb1",
      "\xce\xb2",
      "\xce\xb3",
      "\xce\xb4",
      "\xce\xb5",
      "\xce\xb6",
      "\xce\xb7",
      "\xce\xb8",
      "\xce\xb9",
      "\xce\xba",
      "\xce\xbb",
      "\xce\xbc",
      "\xce\xbd",
      "\xce\xbe",
      "\xce\xbf",
      "\xcf\x80",
      "\xcf\x81",
      "\xcf\x82",
      "\xcf\x83",
      "\xcf\x84",
      "\xcf\x85",
      "\xcf\x86",
      "\xcf\x87",
      "\xcf\x88",
      "\xcf\x89",
      "\xef\xbf\xbd",
      "\x7b",
      "\x7c",
      "\x7d",
      "\xc2\xaf",
      "\x7f",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007f => "\x7f",
      0x000000a4 => "\x24",
      0x000000af => "\x7e",
      0x00000391 => "\x41",
      0x00000392 => "\x42",
      0x00000393 => "\x43",
      0x00000394 => "\x44",
      0x00000395 => "\x45",
      0x00000396 => "\x46",
      0x00000397 => "\x47",
      0x00000398 => "\x48",
      0x00000399 => "\x49",
      0x0000039a => "\x4a",
      0x0000039b => "\x4b",
      0x0000039c => "\x4c",
      0x0000039d => "\x4d",
      0x0000039e => "\x4e",
      0x0000039f => "\x4f",
      0x000003a0 => "\x50",
      0x000003a1 => "\x51",
      0x000003a3 => "\x53",
      0x000003a4 => "\x54",
      0x000003a5 => "\x55",
      0x000003a6 => "\x56",
      0x000003a7 => "\x57",
      0x000003a8 => "\x58",
      0x000003a9 => "\x59",
      0x000003b1 => "\x61",
      0x000003b2 => "\x62",
      0x000003b3 => "\x63",
      0x000003b4 => "\x64",
      0x000003b5 => "\x65",
      0x000003b6 => "\x66",
      0x000003b7 => "\x67",
      0x000003b8 => "\x68",
      0x000003b9 => "\x69",
      0x000003ba => "\x6a",
      0x000003bb => "\x6b",
      0x000003bc => "\x6c",
      0x000003bd => "\x6d",
      0x000003be => "\x6e",
      0x000003bf => "\x6f",
      0x000003c0 => "\x70",
      0x000003c1 => "\x71",
      0x000003c2 => "\x72",
      0x000003c3 => "\x73",
      0x000003c4 => "\x74",
      0x000003c5 => "\x75",
      0x000003c6 => "\x76",
      0x000003c7 => "\x77",
      0x000003c8 => "\x78",
      0x000003c9 => "\x79",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::GREEK_CCITT - Conversion routines for GREEK_CCITT
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for GREEK-CCITT.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
   repertoiremap: mnemonic,ds
    source: ECMA registry
   alias ISO-IR-150
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  000000A4 | CURRENCY SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000391 | GREEK CAPITAL LETTER ALPHA
      42 |  00000392 | GREEK CAPITAL LETTER BETA
      43 |  00000393 | GREEK CAPITAL LETTER GAMMA
      44 |  00000394 | GREEK CAPITAL LETTER DELTA
      45 |  00000395 | GREEK CAPITAL LETTER EPSILON
      46 |  00000396 | GREEK CAPITAL LETTER ZETA
      47 |  00000397 | GREEK CAPITAL LETTER ETA
      48 |  00000398 | GREEK CAPITAL LETTER THETA
      49 |  00000399 | GREEK CAPITAL LETTER IOTA
      4A |  0000039A | GREEK CAPITAL LETTER KAPPA
      4B |  0000039B | GREEK CAPITAL LETTER LAMDA
      4C |  0000039C | GREEK CAPITAL LETTER MU
      4D |  0000039D | GREEK CAPITAL LETTER NU
      4E |  0000039E | GREEK CAPITAL LETTER XI
      4F |  0000039F | GREEK CAPITAL LETTER OMICRON
      50 |  000003A0 | GREEK CAPITAL LETTER PI
      51 |  000003A1 | GREEK CAPITAL LETTER RHO
      53 |  000003A3 | GREEK CAPITAL LETTER SIGMA
      54 |  000003A4 | GREEK CAPITAL LETTER TAU
      55 |  000003A5 | GREEK CAPITAL LETTER UPSILON
      56 |  000003A6 | GREEK CAPITAL LETTER PHI
      57 |  000003A7 | GREEK CAPITAL LETTER CHI
      58 |  000003A8 | GREEK CAPITAL LETTER PSI
      59 |  000003A9 | GREEK CAPITAL LETTER OMEGA
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      61 |  000003B1 | GREEK SMALL LETTER ALPHA
      62 |  000003B2 | GREEK SMALL LETTER BETA
      63 |  000003B3 | GREEK SMALL LETTER GAMMA
      64 |  000003B4 | GREEK SMALL LETTER DELTA
      65 |  000003B5 | GREEK SMALL LETTER EPSILON
      66 |  000003B6 | GREEK SMALL LETTER ZETA
      67 |  000003B7 | GREEK SMALL LETTER ETA
      68 |  000003B8 | GREEK SMALL LETTER THETA
      69 |  000003B9 | GREEK SMALL LETTER IOTA
      6A |  000003BA | GREEK SMALL LETTER KAPPA
      6B |  000003BB | GREEK SMALL LETTER LAMDA
      6C |  000003BC | GREEK SMALL LETTER MU
      6D |  000003BD | GREEK SMALL LETTER NU
      6E |  000003BE | GREEK SMALL LETTER XI
      6F |  000003BF | GREEK SMALL LETTER OMICRON
      70 |  000003C0 | GREEK SMALL LETTER PI
      71 |  000003C1 | GREEK SMALL LETTER RHO
      72 |  000003C2 | GREEK SMALL LETTER FINAL SIGMA
      73 |  000003C3 | GREEK SMALL LETTER SIGMA
      74 |  000003C4 | GREEK SMALL LETTER TAU
      75 |  000003C5 | GREEK SMALL LETTER UPSILON
      76 |  000003C6 | GREEK SMALL LETTER PHI
      77 |  000003C7 | GREEK SMALL LETTER CHI
      78 |  000003C8 | GREEK SMALL LETTER PSI
      79 |  000003C9 | GREEK SMALL LETTER OMEGA
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  000000AF | MACRON
      7F |  0000007F | DELETE (DEL)
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_GREEK_CCITT

    $main::fatpacked{"Locale/RecodeData/HP_ROMAN8.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_HP_ROMAN8';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for HP-ROMAN8.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::HP_ROMAN8;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0x0080,
      0x0081,
      0x0082,
      0x0083,
      0x0084,
      0x0085,
      0x0086,
      0x0087,
      0x0088,
      0x0089,
      0x008a,
      0x008b,
      0x008c,
      0x008d,
      0x008e,
      0x008f,
      0x0090,
      0x0091,
      0x0092,
      0x0093,
      0x0094,
      0x0095,
      0x0096,
      0x0097,
      0x0098,
      0x0099,
      0x009a,
      0x009b,
      0x009c,
      0x009d,
      0x009e,
      0x009f,
      0x00a0,
      0x00c0,
      0x00c2,
      0x00c8,
      0x00ca,
      0x00cb,
      0x00ce,
      0x00cf,
      0x00b4,
      0x02cb,
      0x02c6,
      0x00a8,
      0x02dc,
      0x00d9,
      0x00db,
      0x20a4,
      0x00af,
      0x00dd,
      0x00fd,
      0x00b0,
      0x00c7,
      0x00e7,
      0x00d1,
      0x00f1,
      0x00a1,
      0x00bf,
      0x00a4,
      0x00a3,
      0x00a5,
      0x00a7,
      0x0192,
      0x00a2,
      0x00e2,
      0x00ea,
      0x00f4,
      0x00fb,
      0x00e1,
      0x00e9,
      0x00f3,
      0x00fa,
      0x00e0,
      0x00e8,
      0x00f2,
      0x00f9,
      0x00e4,
      0x00eb,
      0x00f6,
      0x00fc,
      0x00c5,
      0x00ee,
      0x00d8,
      0x00c6,
      0x00e5,
      0x00ed,
      0x00f8,
      0x00e6,
      0x00c4,
      0x00ec,
      0x00d6,
      0x00dc,
      0x00c9,
      0x00ef,
      0x00df,
      0x00d4,
      0x00c1,
      0x00c3,
      0x00e3,
      0x00d0,
      0x00f0,
      0x00cd,
      0x00cc,
      0x00d3,
      0x00d2,
      0x00d5,
      0x00f5,
      0x0160,
      0x0161,
      0x00da,
      0x0178,
      0x00ff,
      0x00de,
      0x00fe,
      0x00b7,
      0x00b5,
      0x00b6,
      0x00be,
      0x2014,
      0x00bc,
      0x00bd,
      0x00aa,
      0x00ba,
      0x00ab,
      0x25a0,
      0x00bb,
      0x00b1,
      0xfffd,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xc2\x80",
      "\xc2\x81",
      "\xc2\x82",
      "\xc2\x83",
      "\xc2\x84",
      "\xc2\x85",
      "\xc2\x86",
      "\xc2\x87",
      "\xc2\x88",
      "\xc2\x89",
      "\xc2\x8a",
      "\xc2\x8b",
      "\xc2\x8c",
      "\xc2\x8d",
      "\xc2\x8e",
      "\xc2\x8f",
      "\xc2\x90",
      "\xc2\x91",
      "\xc2\x92",
      "\xc2\x93",
      "\xc2\x94",
      "\xc2\x95",
      "\xc2\x96",
      "\xc2\x97",
      "\xc2\x98",
      "\xc2\x99",
      "\xc2\x9a",
      "\xc2\x9b",
      "\xc2\x9c",
      "\xc2\x9d",
      "\xc2\x9e",
      "\xc2\x9f",
      "\xc2\xa0",
      "\xc3\x80",
      "\xc3\x82",
      "\xc3\x88",
      "\xc3\x8a",
      "\xc3\x8b",
      "\xc3\x8e",
      "\xc3\x8f",
      "\xc2\xb4",
      "\xcb\x8b",
      "\xcb\x86",
      "\xc2\xa8",
      "\xcb\x9c",
      "\xc3\x99",
      "\xc3\x9b",
      "\xe2\x82\xa4",
      "\xc2\xaf",
      "\xc3\x9d",
      "\xc3\xbd",
      "\xc2\xb0",
      "\xc3\x87",
      "\xc3\xa7",
      "\xc3\x91",
      "\xc3\xb1",
      "\xc2\xa1",
      "\xc2\xbf",
      "\xc2\xa4",
      "\xc2\xa3",
      "\xc2\xa5",
      "\xc2\xa7",
      "\xc6\x92",
      "\xc2\xa2",
      "\xc3\xa2",
      "\xc3\xaa",
      "\xc3\xb4",
      "\xc3\xbb",
      "\xc3\xa1",
      "\xc3\xa9",
      "\xc3\xb3",
      "\xc3\xba",
      "\xc3\xa0",
      "\xc3\xa8",
      "\xc3\xb2",
      "\xc3\xb9",
      "\xc3\xa4",
      "\xc3\xab",
      "\xc3\xb6",
      "\xc3\xbc",
      "\xc3\x85",
      "\xc3\xae",
      "\xc3\x98",
      "\xc3\x86",
      "\xc3\xa5",
      "\xc3\xad",
      "\xc3\xb8",
      "\xc3\xa6",
      "\xc3\x84",
      "\xc3\xac",
      "\xc3\x96",
      "\xc3\x9c",
      "\xc3\x89",
      "\xc3\xaf",
      "\xc3\x9f",
      "\xc3\x94",
      "\xc3\x81",
      "\xc3\x83",
      "\xc3\xa3",
      "\xc3\x90",
      "\xc3\xb0",
      "\xc3\x8d",
      "\xc3\x8c",
      "\xc3\x93",
      "\xc3\x92",
      "\xc3\x95",
      "\xc3\xb5",
      "\xc5\xa0",
      "\xc5\xa1",
      "\xc3\x9a",
      "\xc5\xb8",
      "\xc3\xbf",
      "\xc3\x9e",
      "\xc3\xbe",
      "\xc2\xb7",
      "\xc2\xb5",
      "\xc2\xb6",
      "\xc2\xbe",
      "\xe2\x80\x94",
      "\xc2\xbc",
      "\xc2\xbd",
      "\xc2\xaa",
      "\xc2\xba",
      "\xc2\xab",
      "\xe2\x96\xa0",
      "\xc2\xbb",
      "\xc2\xb1",
      "\xef\xbf\xbd",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x00000080 => "\x80",
      0x00000081 => "\x81",
      0x00000082 => "\x82",
      0x00000083 => "\x83",
      0x00000084 => "\x84",
      0x00000085 => "\x85",
      0x00000086 => "\x86",
      0x00000087 => "\x87",
      0x00000088 => "\x88",
      0x00000089 => "\x89",
      0x0000008a => "\x8a",
      0x0000008b => "\x8b",
      0x0000008c => "\x8c",
      0x0000008d => "\x8d",
      0x0000008e => "\x8e",
      0x0000008f => "\x8f",
      0x00000090 => "\x90",
      0x00000091 => "\x91",
      0x00000092 => "\x92",
      0x00000093 => "\x93",
      0x00000094 => "\x94",
      0x00000095 => "\x95",
      0x00000096 => "\x96",
      0x00000097 => "\x97",
      0x00000098 => "\x98",
      0x00000099 => "\x99",
      0x0000009a => "\x9a",
      0x0000009b => "\x9b",
      0x0000009c => "\x9c",
      0x0000009d => "\x9d",
      0x0000009e => "\x9e",
      0x0000009f => "\x9f",
      0x000000a0 => "\xa0",
      0x000000a1 => "\xb8",
      0x000000a2 => "\xbf",
      0x000000a3 => "\xbb",
      0x000000a4 => "\xba",
      0x000000a5 => "\xbc",
      0x000000a7 => "\xbd",
      0x000000a8 => "\xab",
      0x000000aa => "\xf9",
      0x000000ab => "\xfb",
      0x000000af => "\xb0",
      0x000000b0 => "\xb3",
      0x000000b1 => "\xfe",
      0x000000b4 => "\xa8",
      0x000000b5 => "\xf3",
      0x000000b6 => "\xf4",
      0x000000b7 => "\xf2",
      0x000000ba => "\xfa",
      0x000000bb => "\xfd",
      0x000000bc => "\xf7",
      0x000000bd => "\xf8",
      0x000000be => "\xf5",
      0x000000bf => "\xb9",
      0x000000c0 => "\xa1",
      0x000000c1 => "\xe0",
      0x000000c2 => "\xa2",
      0x000000c3 => "\xe1",
      0x000000c4 => "\xd8",
      0x000000c5 => "\xd0",
      0x000000c6 => "\xd3",
      0x000000c7 => "\xb4",
      0x000000c8 => "\xa3",
      0x000000c9 => "\xdc",
      0x000000ca => "\xa4",
      0x000000cb => "\xa5",
      0x000000cc => "\xe6",
      0x000000cd => "\xe5",
      0x000000ce => "\xa6",
      0x000000cf => "\xa7",
      0x000000d0 => "\xe3",
      0x000000d1 => "\xb6",
      0x000000d2 => "\xe8",
      0x000000d3 => "\xe7",
      0x000000d4 => "\xdf",
      0x000000d5 => "\xe9",
      0x000000d6 => "\xda",
      0x000000d8 => "\xd2",
      0x000000d9 => "\xad",
      0x000000da => "\xed",
      0x000000db => "\xae",
      0x000000dc => "\xdb",
      0x000000dd => "\xb1",
      0x000000de => "\xf0",
      0x000000df => "\xde",
      0x000000e0 => "\xc8",
      0x000000e1 => "\xc4",
      0x000000e2 => "\xc0",
      0x000000e3 => "\xe2",
      0x000000e4 => "\xcc",
      0x000000e5 => "\xd4",
      0x000000e6 => "\xd7",
      0x000000e7 => "\xb5",
      0x000000e8 => "\xc9",
      0x000000e9 => "\xc5",
      0x000000ea => "\xc1",
      0x000000eb => "\xcd",
      0x000000ec => "\xd9",
      0x000000ed => "\xd5",
      0x000000ee => "\xd1",
      0x000000ef => "\xdd",
      0x000000f0 => "\xe4",
      0x000000f1 => "\xb7",
      0x000000f2 => "\xca",
      0x000000f3 => "\xc6",
      0x000000f4 => "\xc2",
      0x000000f5 => "\xea",
      0x000000f6 => "\xce",
      0x000000f8 => "\xd6",
      0x000000f9 => "\xcb",
      0x000000fa => "\xc7",
      0x000000fb => "\xc3",
      0x000000fc => "\xcf",
      0x000000fd => "\xb2",
      0x000000fe => "\xf1",
      0x000000ff => "\xef",
      0x00000160 => "\xeb",
      0x00000161 => "\xec",
      0x00000178 => "\xee",
      0x00000192 => "\xbe",
      0x000002c6 => "\xaa",
      0x000002cb => "\xa9",
      0x000002dc => "\xac",
      0x00002014 => "\xf6",
      0x000020a4 => "\xaf",
      0x000025a0 => "\xfc",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::HP_ROMAN8 - Conversion routines for HP_ROMAN8
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for HP-ROMAN8.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: LaserJet IIP Printer User's Manual,
    HP part no 33471-90901, Hewlet-Packard, June 1989.
   alias ROMAN8
   alias R8
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE (DEL)
      80 |  00000080 | PADDING CHARACTER (PAD)
      81 |  00000081 | HIGH OCTET PRESET (HOP)
      82 |  00000082 | BREAK PERMITTED HERE (BPH)
      83 |  00000083 | NO BREAK HERE (NBH)
      84 |  00000084 | INDEX (IND)
      85 |  00000085 | NEXT LINE (NEL)
      86 |  00000086 | START OF SELECTED AREA (SSA)
      87 |  00000087 | END OF SELECTED AREA (ESA)
      88 |  00000088 | CHARACTER TABULATION SET (HTS)
      89 |  00000089 | CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
      8A |  0000008A | LINE TABULATION SET (VTS)
      8B |  0000008B | PARTIAL LINE FORWARD (PLD)
      8C |  0000008C | PARTIAL LINE BACKWARD (PLU)
      8D |  0000008D | REVERSE LINE FEED (RI)
      8E |  0000008E | SINGLE-SHIFT TWO (SS2)
      8F |  0000008F | SINGLE-SHIFT THREE (SS3)
      90 |  00000090 | DEVICE CONTROL STRING (DCS)
      91 |  00000091 | PRIVATE USE ONE (PU1)
      92 |  00000092 | PRIVATE USE TWO (PU2)
      93 |  00000093 | SET TRANSMIT STATE (STS)
      94 |  00000094 | CANCEL CHARACTER (CCH)
      95 |  00000095 | MESSAGE WAITING (MW)
      96 |  00000096 | START OF GUARDED AREA (SPA)
      97 |  00000097 | END OF GUARDED AREA (EPA)
      98 |  00000098 | START OF STRING (SOS)
      99 |  00000099 | SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
      9A |  0000009A | SINGLE CHARACTER INTRODUCER (SCI)
      9B |  0000009B | CONTROL SEQUENCE INTRODUCER (CSI)
      9C |  0000009C | STRING TERMINATOR (ST)
      9D |  0000009D | OPERATING SYSTEM COMMAND (OSC)
      9E |  0000009E | PRIVACY MESSAGE (PM)
      9F |  0000009F | APPLICATION PROGRAM COMMAND (APC)
      A0 |  000000A0 | NO-BREAK SPACE
      A1 |  000000C0 | LATIN CAPITAL LETTER A WITH GRAVE
      A2 |  000000C2 | LATIN CAPITAL LETTER A WITH CIRCUMFLEX
      A3 |  000000C8 | LATIN CAPITAL LETTER E WITH GRAVE
      A4 |  000000CA | LATIN CAPITAL LETTER E WITH CIRCUMFLEX
      A5 |  000000CB | LATIN CAPITAL LETTER E WITH DIAERESIS
      A6 |  000000CE | LATIN CAPITAL LETTER I WITH CIRCUMFLEX
      A7 |  000000CF | LATIN CAPITAL LETTER I WITH DIAERESIS
      A8 |  000000B4 | ACUTE ACCENT
      A9 |  000002CB | MODIFIER LETTER GRAVE ACCENT (Mandarin Chinese fourth tone)
      AA |  000002C6 | MODIFIER LETTER CIRCUMFLEX ACCENT
      AB |  000000A8 | DIAERESIS
      AC |  000002DC | SMALL TILDE
      AD |  000000D9 | LATIN CAPITAL LETTER U WITH GRAVE
      AE |  000000DB | LATIN CAPITAL LETTER U WITH CIRCUMFLEX
      AF |  000020A4 | LIRA SIGN
      B0 |  000000AF | MACRON
      B1 |  000000DD | LATIN CAPITAL LETTER Y WITH ACUTE
      B2 |  000000FD | LATIN SMALL LETTER Y WITH ACUTE
      B3 |  000000B0 | DEGREE SIGN
      B4 |  000000C7 | LATIN CAPITAL LETTER C WITH CEDILLA
      B5 |  000000E7 | LATIN SMALL LETTER C WITH CEDILLA
      B6 |  000000D1 | LATIN CAPITAL LETTER N WITH TILDE
      B7 |  000000F1 | LATIN SMALL LETTER N WITH TILDE
      B8 |  000000A1 | INVERTED EXCLAMATION MARK
      B9 |  000000BF | INVERTED QUESTION MARK
      BA |  000000A4 | CURRENCY SIGN
      BB |  000000A3 | POUND SIGN
      BC |  000000A5 | YEN SIGN
      BD |  000000A7 | SECTION SIGN
      BE |  00000192 | LATIN SMALL LETTER F WITH HOOK
      BF |  000000A2 | CENT SIGN
      C0 |  000000E2 | LATIN SMALL LETTER A WITH CIRCUMFLEX
      C1 |  000000EA | LATIN SMALL LETTER E WITH CIRCUMFLEX
      C2 |  000000F4 | LATIN SMALL LETTER O WITH CIRCUMFLEX
      C3 |  000000FB | LATIN SMALL LETTER U WITH CIRCUMFLEX
      C4 |  000000E1 | LATIN SMALL LETTER A WITH ACUTE
      C5 |  000000E9 | LATIN SMALL LETTER E WITH ACUTE
      C6 |  000000F3 | LATIN SMALL LETTER O WITH ACUTE
      C7 |  000000FA | LATIN SMALL LETTER U WITH ACUTE
      C8 |  000000E0 | LATIN SMALL LETTER A WITH GRAVE
      C9 |  000000E8 | LATIN SMALL LETTER E WITH GRAVE
      CA |  000000F2 | LATIN SMALL LETTER O WITH GRAVE
      CB |  000000F9 | LATIN SMALL LETTER U WITH GRAVE
      CC |  000000E4 | LATIN SMALL LETTER A WITH DIAERESIS
      CD |  000000EB | LATIN SMALL LETTER E WITH DIAERESIS
      CE |  000000F6 | LATIN SMALL LETTER O WITH DIAERESIS
      CF |  000000FC | LATIN SMALL LETTER U WITH DIAERESIS
      D0 |  000000C5 | LATIN CAPITAL LETTER A WITH RING ABOVE
      D1 |  000000EE | LATIN SMALL LETTER I WITH CIRCUMFLEX
      D2 |  000000D8 | LATIN CAPITAL LETTER O WITH STROKE
      D3 |  000000C6 | LATIN CAPITAL LETTER AE
      D4 |  000000E5 | LATIN SMALL LETTER A WITH RING ABOVE
      D5 |  000000ED | LATIN SMALL LETTER I WITH ACUTE
      D6 |  000000F8 | LATIN SMALL LETTER O WITH STROKE
      D7 |  000000E6 | LATIN SMALL LETTER AE
      D8 |  000000C4 | LATIN CAPITAL LETTER A WITH DIAERESIS
      D9 |  000000EC | LATIN SMALL LETTER I WITH GRAVE
      DA |  000000D6 | LATIN CAPITAL LETTER O WITH DIAERESIS
      DB |  000000DC | LATIN CAPITAL LETTER U WITH DIAERESIS
      DC |  000000C9 | LATIN CAPITAL LETTER E WITH ACUTE
      DD |  000000EF | LATIN SMALL LETTER I WITH DIAERESIS
      DE |  000000DF | LATIN SMALL LETTER SHARP S (German)
      DF |  000000D4 | LATIN CAPITAL LETTER O WITH CIRCUMFLEX
      E0 |  000000C1 | LATIN CAPITAL LETTER A WITH ACUTE
      E1 |  000000C3 | LATIN CAPITAL LETTER A WITH TILDE
      E2 |  000000E3 | LATIN SMALL LETTER A WITH TILDE
      E3 |  000000D0 | LATIN CAPITAL LETTER ETH (Icelandic)
      E4 |  000000F0 | LATIN SMALL LETTER ETH (Icelandic)
      E5 |  000000CD | LATIN CAPITAL LETTER I WITH ACUTE
      E6 |  000000CC | LATIN CAPITAL LETTER I WITH GRAVE
      E7 |  000000D3 | LATIN CAPITAL LETTER O WITH ACUTE
      E8 |  000000D2 | LATIN CAPITAL LETTER O WITH GRAVE
      E9 |  000000D5 | LATIN CAPITAL LETTER O WITH TILDE
      EA |  000000F5 | LATIN SMALL LETTER O WITH TILDE
      EB |  00000160 | LATIN CAPITAL LETTER S WITH CARON
      EC |  00000161 | LATIN SMALL LETTER S WITH CARON
      ED |  000000DA | LATIN CAPITAL LETTER U WITH ACUTE
      EE |  00000178 | LATIN CAPITAL LETTER Y WITH DIAERESIS
      EF |  000000FF | LATIN SMALL LETTER Y WITH DIAERESIS
      F0 |  000000DE | LATIN CAPITAL LETTER THORN (Icelandic)
      F1 |  000000FE | LATIN SMALL LETTER THORN (Icelandic)
      F2 |  000000B7 | MIDDLE DOT
      F3 |  000000B5 | MICRO SIGN
      F4 |  000000B6 | PILCROW SIGN
      F5 |  000000BE | VULGAR FRACTION THREE QUARTERS
      F6 |  00002014 | EM DASH
      F7 |  000000BC | VULGAR FRACTION ONE QUARTER
      F8 |  000000BD | VULGAR FRACTION ONE HALF
      F9 |  000000AA | FEMININE ORDINAL INDICATOR
      FA |  000000BA | MASCULINE ORDINAL INDICATOR
      FB |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
      FC |  000025A0 | BLACK SQUARE
      FD |  000000BB | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
      FE |  000000B1 | PLUS-MINUS SIGN
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_HP_ROMAN8

    $main::fatpacked{"Locale/RecodeData/IBM037.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_IBM037';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for IBM037.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::IBM037;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x009c,
      0x0009,
      0x0086,
      0x007f,
      0x0097,
      0x008d,
      0x008e,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x009d,
      0x0085,
      0x0008,
      0x0087,
      0x0018,
      0x0019,
      0x0092,
      0x008f,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0080,
      0x0081,
      0x0082,
      0x0083,
      0x0084,
      0x000a,
      0x0017,
      0x001b,
      0x0088,
      0x0089,
      0x008a,
      0x008b,
      0x008c,
      0x0005,
      0x0006,
      0x0007,
      0x0090,
      0x0091,
      0x0016,
      0x0093,
      0x0094,
      0x0095,
      0x0096,
      0x0004,
      0x0098,
      0x0099,
      0x009a,
      0x009b,
      0x0014,
      0x0015,
      0x009e,
      0x001a,
      0x0020,
      0x00a0,
      0x00e2,
      0x00e4,
      0x00e0,
      0x00e1,
      0x00e3,
      0x00e5,
      0x00e7,
      0x00f1,
      0x00a2,
      0x002e,
      0x003c,
      0x0028,
      0x002b,
      0x007c,
      0x0026,
      0x00e9,
      0x00ea,
      0x00eb,
      0x00e8,
      0x00ed,
      0x00ee,
      0x00ef,
      0x00ec,
      0x00df,
      0x0021,
      0x0024,
      0x002a,
      0x0029,
      0x003b,
      0x00ac,
      0x002d,
      0x002f,
      0x00c2,
      0x00c4,
      0x00c0,
      0x00c1,
      0x00c3,
      0x00c5,
      0x00c7,
      0x00d1,
      0x00a6,
      0x002c,
      0x0025,
      0x005f,
      0x003e,
      0x003f,
      0x00f8,
      0x00c9,
      0x00ca,
      0x00cb,
      0x00c8,
      0x00cd,
      0x00ce,
      0x00cf,
      0x00cc,
      0x0060,
      0x003a,
      0x0023,
      0x0040,
      0x0027,
      0x003d,
      0x0022,
      0x00d8,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x00ab,
      0x00bb,
      0x00f0,
      0x00fd,
      0x00fe,
      0x00b1,
      0x00b0,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x00aa,
      0x00ba,
      0x00e6,
      0x00b8,
      0x00c6,
      0x00a4,
      0x00b5,
      0x007e,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x00a1,
      0x00bf,
      0x00d0,
      0x00dd,
      0x00de,
      0x00ae,
      0x005e,
      0x00a3,
      0x00a5,
      0x00b7,
      0x00a9,
      0x00a7,
      0x00b6,
      0x00bc,
      0x00bd,
      0x00be,
      0x005b,
      0x005d,
      0x00af,
      0x00a8,
      0x00b4,
      0x00d7,
      0x007b,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x00ad,
      0x00f4,
      0x00f6,
      0x00f2,
      0x00f3,
      0x00f5,
      0x007d,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x00b9,
      0x00fb,
      0x00fc,
      0x00f9,
      0x00fa,
      0x00ff,
      0x005c,
      0x00f7,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x00b2,
      0x00d4,
      0x00d6,
      0x00d2,
      0x00d3,
      0x00d5,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x00b3,
      0x00db,
      0x00dc,
      0x00d9,
      0x00da,
      0x009f,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\xc2\x9c",
      "\x09",
      "\xc2\x86",
      "\x7f",
      "\xc2\x97",
      "\xc2\x8d",
      "\xc2\x8e",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\xc2\x9d",
      "\xc2\x85",
      "\x08",
      "\xc2\x87",
      "\x18",
      "\x19",
      "\xc2\x92",
      "\xc2\x8f",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\xc2\x80",
      "\xc2\x81",
      "\xc2\x82",
      "\xc2\x83",
      "\xc2\x84",
      "\x0a",
      "\x17",
      "\x1b",
      "\xc2\x88",
      "\xc2\x89",
      "\xc2\x8a",
      "\xc2\x8b",
      "\xc2\x8c",
      "\x05",
      "\x06",
      "\x07",
      "\xc2\x90",
      "\xc2\x91",
      "\x16",
      "\xc2\x93",
      "\xc2\x94",
      "\xc2\x95",
      "\xc2\x96",
      "\x04",
      "\xc2\x98",
      "\xc2\x99",
      "\xc2\x9a",
      "\xc2\x9b",
      "\x14",
      "\x15",
      "\xc2\x9e",
      "\x1a",
      "\x20",
      "\xc2\xa0",
      "\xc3\xa2",
      "\xc3\xa4",
      "\xc3\xa0",
      "\xc3\xa1",
      "\xc3\xa3",
      "\xc3\xa5",
      "\xc3\xa7",
      "\xc3\xb1",
      "\xc2\xa2",
      "\x2e",
      "\x3c",
      "\x28",
      "\x2b",
      "\x7c",
      "\x26",
      "\xc3\xa9",
      "\xc3\xaa",
      "\xc3\xab",
      "\xc3\xa8",
      "\xc3\xad",
      "\xc3\xae",
      "\xc3\xaf",
      "\xc3\xac",
      "\xc3\x9f",
      "\x21",
      "\x24",
      "\x2a",
      "\x29",
      "\x3b",
      "\xc2\xac",
      "\x2d",
      "\x2f",
      "\xc3\x82",
      "\xc3\x84",
      "\xc3\x80",
      "\xc3\x81",
      "\xc3\x83",
      "\xc3\x85",
      "\xc3\x87",
      "\xc3\x91",
      "\xc2\xa6",
      "\x2c",
      "\x25",
      "\x5f",
      "\x3e",
      "\x3f",
      "\xc3\xb8",
      "\xc3\x89",
      "\xc3\x8a",
      "\xc3\x8b",
      "\xc3\x88",
      "\xc3\x8d",
      "\xc3\x8e",
      "\xc3\x8f",
      "\xc3\x8c",
      "\x60",
      "\x3a",
      "\x23",
      "\x40",
      "\x27",
      "\x3d",
      "\x22",
      "\xc3\x98",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\xc2\xab",
      "\xc2\xbb",
      "\xc3\xb0",
      "\xc3\xbd",
      "\xc3\xbe",
      "\xc2\xb1",
      "\xc2\xb0",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\xc2\xaa",
      "\xc2\xba",
      "\xc3\xa6",
      "\xc2\xb8",
      "\xc3\x86",
      "\xc2\xa4",
      "\xc2\xb5",
      "\x7e",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\xc2\xa1",
      "\xc2\xbf",
      "\xc3\x90",
      "\xc3\x9d",
      "\xc3\x9e",
      "\xc2\xae",
      "\x5e",
      "\xc2\xa3",
      "\xc2\xa5",
      "\xc2\xb7",
      "\xc2\xa9",
      "\xc2\xa7",
      "\xc2\xb6",
      "\xc2\xbc",
      "\xc2\xbd",
      "\xc2\xbe",
      "\x5b",
      "\x5d",
      "\xc2\xaf",
      "\xc2\xa8",
      "\xc2\xb4",
      "\xc3\x97",
      "\x7b",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\xc2\xad",
      "\xc3\xb4",
      "\xc3\xb6",
      "\xc3\xb2",
      "\xc3\xb3",
      "\xc3\xb5",
      "\x7d",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\xc2\xb9",
      "\xc3\xbb",
      "\xc3\xbc",
      "\xc3\xb9",
      "\xc3\xba",
      "\xc3\xbf",
      "\x5c",
      "\xc3\xb7",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\xc2\xb2",
      "\xc3\x94",
      "\xc3\x96",
      "\xc3\x92",
      "\xc3\x93",
      "\xc3\x95",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\xc2\xb3",
      "\xc3\x9b",
      "\xc3\x9c",
      "\xc3\x99",
      "\xc3\x9a",
      "\xc2\x9f",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x37",
      0x00000005 => "\x2d",
      0x00000006 => "\x2e",
      0x00000007 => "\x2f",
      0x00000008 => "\x16",
      0x00000009 => "\x05",
      0x0000000a => "\x25",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x3c",
      0x00000015 => "\x3d",
      0x00000016 => "\x32",
      0x00000017 => "\x26",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x3f",
      0x0000001b => "\x27",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x40",
      0x00000021 => "\x5a",
      0x00000022 => "\x7f",
      0x00000023 => "\x7b",
      0x00000024 => "\x5b",
      0x00000025 => "\x6c",
      0x00000026 => "\x50",
      0x00000027 => "\x7d",
      0x00000028 => "\x4d",
      0x00000029 => "\x5d",
      0x0000002a => "\x5c",
      0x0000002b => "\x4e",
      0x0000002c => "\x6b",
      0x0000002d => "\x60",
      0x0000002e => "\x4b",
      0x0000002f => "\x61",
      0x00000030 => "\xf0",
      0x00000031 => "\xf1",
      0x00000032 => "\xf2",
      0x00000033 => "\xf3",
      0x00000034 => "\xf4",
      0x00000035 => "\xf5",
      0x00000036 => "\xf6",
      0x00000037 => "\xf7",
      0x00000038 => "\xf8",
      0x00000039 => "\xf9",
      0x0000003a => "\x7a",
      0x0000003b => "\x5e",
      0x0000003c => "\x4c",
      0x0000003d => "\x7e",
      0x0000003e => "\x6e",
      0x0000003f => "\x6f",
      0x00000040 => "\x7c",
      0x00000041 => "\xc1",
      0x00000042 => "\xc2",
      0x00000043 => "\xc3",
      0x00000044 => "\xc4",
      0x00000045 => "\xc5",
      0x00000046 => "\xc6",
      0x00000047 => "\xc7",
      0x00000048 => "\xc8",
      0x00000049 => "\xc9",
      0x0000004a => "\xd1",
      0x0000004b => "\xd2",
      0x0000004c => "\xd3",
      0x0000004d => "\xd4",
      0x0000004e => "\xd5",
      0x0000004f => "\xd6",
      0x00000050 => "\xd7",
      0x00000051 => "\xd8",
      0x00000052 => "\xd9",
      0x00000053 => "\xe2",
      0x00000054 => "\xe3",
      0x00000055 => "\xe4",
      0x00000056 => "\xe5",
      0x00000057 => "\xe6",
      0x00000058 => "\xe7",
      0x00000059 => "\xe8",
      0x0000005a => "\xe9",
      0x0000005b => "\xba",
      0x0000005c => "\xe0",
      0x0000005d => "\xbb",
      0x0000005e => "\xb0",
      0x0000005f => "\x6d",
      0x00000060 => "\x79",
      0x00000061 => "\x81",
      0x00000062 => "\x82",
      0x00000063 => "\x83",
      0x00000064 => "\x84",
      0x00000065 => "\x85",
      0x00000066 => "\x86",
      0x00000067 => "\x87",
      0x00000068 => "\x88",
      0x00000069 => "\x89",
      0x0000006a => "\x91",
      0x0000006b => "\x92",
      0x0000006c => "\x93",
      0x0000006d => "\x94",
      0x0000006e => "\x95",
      0x0000006f => "\x96",
      0x00000070 => "\x97",
      0x00000071 => "\x98",
      0x00000072 => "\x99",
      0x00000073 => "\xa2",
      0x00000074 => "\xa3",
      0x00000075 => "\xa4",
      0x00000076 => "\xa5",
      0x00000077 => "\xa6",
      0x00000078 => "\xa7",
      0x00000079 => "\xa8",
      0x0000007a => "\xa9",
      0x0000007b => "\xc0",
      0x0000007c => "\x4f",
      0x0000007d => "\xd0",
      0x0000007e => "\xa1",
      0x0000007f => "\x07",
      0x00000080 => "\x20",
      0x00000081 => "\x21",
      0x00000082 => "\x22",
      0x00000083 => "\x23",
      0x00000084 => "\x24",
      0x00000085 => "\x15",
      0x00000086 => "\x06",
      0x00000087 => "\x17",
      0x00000088 => "\x28",
      0x00000089 => "\x29",
      0x0000008a => "\x2a",
      0x0000008b => "\x2b",
      0x0000008c => "\x2c",
      0x0000008d => "\x09",
      0x0000008e => "\x0a",
      0x0000008f => "\x1b",
      0x00000090 => "\x30",
      0x00000091 => "\x31",
      0x00000092 => "\x1a",
      0x00000093 => "\x33",
      0x00000094 => "\x34",
      0x00000095 => "\x35",
      0x00000096 => "\x36",
      0x00000097 => "\x08",
      0x00000098 => "\x38",
      0x00000099 => "\x39",
      0x0000009a => "\x3a",
      0x0000009b => "\x3b",
      0x0000009c => "\x04",
      0x0000009d => "\x14",
      0x0000009e => "\x3e",
      0x0000009f => "\xff",
      0x000000a0 => "\x41",
      0x000000a1 => "\xaa",
      0x000000a2 => "\x4a",
      0x000000a3 => "\xb1",
      0x000000a4 => "\x9f",
      0x000000a5 => "\xb2",
      0x000000a6 => "\x6a",
      0x000000a7 => "\xb5",
      0x000000a8 => "\xbd",
      0x000000a9 => "\xb4",
      0x000000aa => "\x9a",
      0x000000ab => "\x8a",
      0x000000ac => "\x5f",
      0x000000ad => "\xca",
      0x000000ae => "\xaf",
      0x000000af => "\xbc",
      0x000000b0 => "\x90",
      0x000000b1 => "\x8f",
      0x000000b2 => "\xea",
      0x000000b3 => "\xfa",
      0x000000b4 => "\xbe",
      0x000000b5 => "\xa0",
      0x000000b6 => "\xb6",
      0x000000b7 => "\xb3",
      0x000000b8 => "\x9d",
      0x000000b9 => "\xda",
      0x000000ba => "\x9b",
      0x000000bb => "\x8b",
      0x000000bc => "\xb7",
      0x000000bd => "\xb8",
      0x000000be => "\xb9",
      0x000000bf => "\xab",
      0x000000c0 => "\x64",
      0x000000c1 => "\x65",
      0x000000c2 => "\x62",
      0x000000c3 => "\x66",
      0x000000c4 => "\x63",
      0x000000c5 => "\x67",
      0x000000c6 => "\x9e",
      0x000000c7 => "\x68",
      0x000000c8 => "\x74",
      0x000000c9 => "\x71",
      0x000000ca => "\x72",
      0x000000cb => "\x73",
      0x000000cc => "\x78",
      0x000000cd => "\x75",
      0x000000ce => "\x76",
      0x000000cf => "\x77",
      0x000000d0 => "\xac",
      0x000000d1 => "\x69",
      0x000000d2 => "\xed",
      0x000000d3 => "\xee",
      0x000000d4 => "\xeb",
      0x000000d5 => "\xef",
      0x000000d6 => "\xec",
      0x000000d7 => "\xbf",
      0x000000d8 => "\x80",
      0x000000d9 => "\xfd",
      0x000000da => "\xfe",
      0x000000db => "\xfb",
      0x000000dc => "\xfc",
      0x000000dd => "\xad",
      0x000000de => "\xae",
      0x000000df => "\x59",
      0x000000e0 => "\x44",
      0x000000e1 => "\x45",
      0x000000e2 => "\x42",
      0x000000e3 => "\x46",
      0x000000e4 => "\x43",
      0x000000e5 => "\x47",
      0x000000e6 => "\x9c",
      0x000000e7 => "\x48",
      0x000000e8 => "\x54",
      0x000000e9 => "\x51",
      0x000000ea => "\x52",
      0x000000eb => "\x53",
      0x000000ec => "\x58",
      0x000000ed => "\x55",
      0x000000ee => "\x56",
      0x000000ef => "\x57",
      0x000000f0 => "\x8c",
      0x000000f1 => "\x49",
      0x000000f2 => "\xcd",
      0x000000f3 => "\xce",
      0x000000f4 => "\xcb",
      0x000000f5 => "\xcf",
      0x000000f6 => "\xcc",
      0x000000f7 => "\xe1",
      0x000000f8 => "\x70",
      0x000000f9 => "\xdd",
      0x000000fa => "\xde",
      0x000000fb => "\xdb",
      0x000000fc => "\xdc",
      0x000000fd => "\x8d",
      0x000000fe => "\x8e",
      0x000000ff => "\xdf",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x6f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::IBM037 - Conversion routines for IBM037
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for IBM037.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: IBM NLS RM Vol2 SE09-8002-01, March 1990
   alias CP037
   alias EBCDIC-CP-US
   alias EBCDIC-CP-CA
   alias EBCDIC-CP-WT
   alias EBCDIC-CP-NL
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  0000009C | STRING TERMINATOR (ST)
      05 |  00000009 | CHARACTER TABULATION (HT)
      06 |  00000086 | START OF SELECTED AREA (SSA)
      07 |  0000007F | DELETE (DEL)
      08 |  00000097 | END OF GUARDED AREA (EPA)
      09 |  0000008D | REVERSE LINE FEED (RI)
      0A |  0000008E | SINGLE-SHIFT TWO (SS2)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  0000009D | OPERATING SYSTEM COMMAND (OSC)
      15 |  00000085 | NEXT LINE (NEL)
      16 |  00000008 | BACKSPACE (BS)
      17 |  00000087 | END OF SELECTED AREA (ESA)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  00000092 | PRIVATE USE TWO (PU2)
      1B |  0000008F | SINGLE-SHIFT THREE (SS3)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000080 | PADDING CHARACTER (PAD)
      21 |  00000081 | HIGH OCTET PRESET (HOP)
      22 |  00000082 | BREAK PERMITTED HERE (BPH)
      23 |  00000083 | NO BREAK HERE (NBH)
      24 |  00000084 | INDEX (IND)
      25 |  0000000A | LINE FEED (LF)
      26 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      27 |  0000001B | ESCAPE (ESC)
      28 |  00000088 | CHARACTER TABULATION SET (HTS)
      29 |  00000089 | CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
      2A |  0000008A | LINE TABULATION SET (VTS)
      2B |  0000008B | PARTIAL LINE FORWARD (PLD)
      2C |  0000008C | PARTIAL LINE BACKWARD (PLU)
      2D |  00000005 | ENQUIRY (ENQ)
      2E |  00000006 | ACKNOWLEDGE (ACK)
      2F |  00000007 | BELL (BEL)
      30 |  00000090 | DEVICE CONTROL STRING (DCS)
      31 |  00000091 | PRIVATE USE ONE (PU1)
      32 |  00000016 | SYNCHRONOUS IDLE (SYN)
      33 |  00000093 | SET TRANSMIT STATE (STS)
      34 |  00000094 | CANCEL CHARACTER (CCH)
      35 |  00000095 | MESSAGE WAITING (MW)
      36 |  00000096 | START OF GUARDED AREA (SPA)
      37 |  00000004 | END OF TRANSMISSION (EOT)
      38 |  00000098 | START OF STRING (SOS)
      39 |  00000099 | SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
      3A |  0000009A | SINGLE CHARACTER INTRODUCER (SCI)
      3B |  0000009B | CONTROL SEQUENCE INTRODUCER (CSI)
      3C |  00000014 | DEVICE CONTROL FOUR (DC4)
      3D |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      3E |  0000009E | PRIVACY MESSAGE (PM)
      3F |  0000001A | SUBSTITUTE (SUB)
      40 |  00000020 | SPACE
      41 |  000000A0 | NO-BREAK SPACE
      42 |  000000E2 | LATIN SMALL LETTER A WITH CIRCUMFLEX
      43 |  000000E4 | LATIN SMALL LETTER A WITH DIAERESIS
      44 |  000000E0 | LATIN SMALL LETTER A WITH GRAVE
      45 |  000000E1 | LATIN SMALL LETTER A WITH ACUTE
      46 |  000000E3 | LATIN SMALL LETTER A WITH TILDE
      47 |  000000E5 | LATIN SMALL LETTER A WITH RING ABOVE
      48 |  000000E7 | LATIN SMALL LETTER C WITH CEDILLA
      49 |  000000F1 | LATIN SMALL LETTER N WITH TILDE
      4A |  000000A2 | CENT SIGN
      4B |  0000002E | FULL STOP
      4C |  0000003C | LESS-THAN SIGN
      4D |  00000028 | LEFT PARENTHESIS
      4E |  0000002B | PLUS SIGN
      4F |  0000007C | VERTICAL LINE
      50 |  00000026 | AMPERSAND
      51 |  000000E9 | LATIN SMALL LETTER E WITH ACUTE
      52 |  000000EA | LATIN SMALL LETTER E WITH CIRCUMFLEX
      53 |  000000EB | LATIN SMALL LETTER E WITH DIAERESIS
      54 |  000000E8 | LATIN SMALL LETTER E WITH GRAVE
      55 |  000000ED | LATIN SMALL LETTER I WITH ACUTE
      56 |  000000EE | LATIN SMALL LETTER I WITH CIRCUMFLEX
      57 |  000000EF | LATIN SMALL LETTER I WITH DIAERESIS
      58 |  000000EC | LATIN SMALL LETTER I WITH GRAVE
      59 |  000000DF | LATIN SMALL LETTER SHARP S (German)
      5A |  00000021 | EXCLAMATION MARK
      5B |  00000024 | DOLLAR SIGN
      5C |  0000002A | ASTERISK
      5D |  00000029 | RIGHT PARENTHESIS
      5E |  0000003B | SEMICOLON
      5F |  000000AC | NOT SIGN
      60 |  0000002D | HYPHEN-MINUS
      61 |  0000002F | SOLIDUS
      62 |  000000C2 | LATIN CAPITAL LETTER A WITH CIRCUMFLEX
      63 |  000000C4 | LATIN CAPITAL LETTER A WITH DIAERESIS
      64 |  000000C0 | LATIN CAPITAL LETTER A WITH GRAVE
      65 |  000000C1 | LATIN CAPITAL LETTER A WITH ACUTE
      66 |  000000C3 | LATIN CAPITAL LETTER A WITH TILDE
      67 |  000000C5 | LATIN CAPITAL LETTER A WITH RING ABOVE
      68 |  000000C7 | LATIN CAPITAL LETTER C WITH CEDILLA
      69 |  000000D1 | LATIN CAPITAL LETTER N WITH TILDE
      6A |  000000A6 | BROKEN BAR
      6B |  0000002C | COMMA
      6C |  00000025 | PERCENT SIGN
      6D |  0000005F | LOW LINE
      6E |  0000003E | GREATER-THAN SIGN
      6F |  0000003F | QUESTION MARK
      70 |  000000F8 | LATIN SMALL LETTER O WITH STROKE
      71 |  000000C9 | LATIN CAPITAL LETTER E WITH ACUTE
      72 |  000000CA | LATIN CAPITAL LETTER E WITH CIRCUMFLEX
      73 |  000000CB | LATIN CAPITAL LETTER E WITH DIAERESIS
      74 |  000000C8 | LATIN CAPITAL LETTER E WITH GRAVE
      75 |  000000CD | LATIN CAPITAL LETTER I WITH ACUTE
      76 |  000000CE | LATIN CAPITAL LETTER I WITH CIRCUMFLEX
      77 |  000000CF | LATIN CAPITAL LETTER I WITH DIAERESIS
      78 |  000000CC | LATIN CAPITAL LETTER I WITH GRAVE
      79 |  00000060 | GRAVE ACCENT
      7A |  0000003A | COLON
      7B |  00000023 | NUMBER SIGN
      7C |  00000040 | COMMERCIAL AT
      7D |  00000027 | APOSTROPHE
      7E |  0000003D | EQUALS SIGN
      7F |  00000022 | QUOTATION MARK
      80 |  000000D8 | LATIN CAPITAL LETTER O WITH STROKE
      81 |  00000061 | LATIN SMALL LETTER A
      82 |  00000062 | LATIN SMALL LETTER B
      83 |  00000063 | LATIN SMALL LETTER C
      84 |  00000064 | LATIN SMALL LETTER D
      85 |  00000065 | LATIN SMALL LETTER E
      86 |  00000066 | LATIN SMALL LETTER F
      87 |  00000067 | LATIN SMALL LETTER G
      88 |  00000068 | LATIN SMALL LETTER H
      89 |  00000069 | LATIN SMALL LETTER I
      8A |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
      8B |  000000BB | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
      8C |  000000F0 | LATIN SMALL LETTER ETH (Icelandic)
      8D |  000000FD | LATIN SMALL LETTER Y WITH ACUTE
      8E |  000000FE | LATIN SMALL LETTER THORN (Icelandic)
      8F |  000000B1 | PLUS-MINUS SIGN
      90 |  000000B0 | DEGREE SIGN
      91 |  0000006A | LATIN SMALL LETTER J
      92 |  0000006B | LATIN SMALL LETTER K
      93 |  0000006C | LATIN SMALL LETTER L
      94 |  0000006D | LATIN SMALL LETTER M
      95 |  0000006E | LATIN SMALL LETTER N
      96 |  0000006F | LATIN SMALL LETTER O
      97 |  00000070 | LATIN SMALL LETTER P
      98 |  00000071 | LATIN SMALL LETTER Q
      99 |  00000072 | LATIN SMALL LETTER R
      9A |  000000AA | FEMININE ORDINAL INDICATOR
      9B |  000000BA | MASCULINE ORDINAL INDICATOR
      9C |  000000E6 | LATIN SMALL LETTER AE
      9D |  000000B8 | CEDILLA
      9E |  000000C6 | LATIN CAPITAL LETTER AE
      9F |  000000A4 | CURRENCY SIGN
      A0 |  000000B5 | MICRO SIGN
      A1 |  0000007E | TILDE
      A2 |  00000073 | LATIN SMALL LETTER S
      A3 |  00000074 | LATIN SMALL LETTER T
      A4 |  00000075 | LATIN SMALL LETTER U
      A5 |  00000076 | LATIN SMALL LETTER V
      A6 |  00000077 | LATIN SMALL LETTER W
      A7 |  00000078 | LATIN SMALL LETTER X
      A8 |  00000079 | LATIN SMALL LETTER Y
      A9 |  0000007A | LATIN SMALL LETTER Z
      AA |  000000A1 | INVERTED EXCLAMATION MARK
      AB |  000000BF | INVERTED QUESTION MARK
      AC |  000000D0 | LATIN CAPITAL LETTER ETH (Icelandic)
      AD |  000000DD | LATIN CAPITAL LETTER Y WITH ACUTE
      AE |  000000DE | LATIN CAPITAL LETTER THORN (Icelandic)
      AF |  000000AE | REGISTERED SIGN
      B0 |  0000005E | CIRCUMFLEX ACCENT
      B1 |  000000A3 | POUND SIGN
      B2 |  000000A5 | YEN SIGN
      B3 |  000000B7 | MIDDLE DOT
      B4 |  000000A9 | COPYRIGHT SIGN
      B5 |  000000A7 | SECTION SIGN
      B6 |  000000B6 | PILCROW SIGN
      B7 |  000000BC | VULGAR FRACTION ONE QUARTER
      B8 |  000000BD | VULGAR FRACTION ONE HALF
      B9 |  000000BE | VULGAR FRACTION THREE QUARTERS
      BA |  0000005B | LEFT SQUARE BRACKET
      BB |  0000005D | RIGHT SQUARE BRACKET
      BC |  000000AF | MACRON
      BD |  000000A8 | DIAERESIS
      BE |  000000B4 | ACUTE ACCENT
      BF |  000000D7 | MULTIPLICATION SIGN
      C0 |  0000007B | LEFT CURLY BRACKET
      C1 |  00000041 | LATIN CAPITAL LETTER A
      C2 |  00000042 | LATIN CAPITAL LETTER B
      C3 |  00000043 | LATIN CAPITAL LETTER C
      C4 |  00000044 | LATIN CAPITAL LETTER D
      C5 |  00000045 | LATIN CAPITAL LETTER E
      C6 |  00000046 | LATIN CAPITAL LETTER F
      C7 |  00000047 | LATIN CAPITAL LETTER G
      C8 |  00000048 | LATIN CAPITAL LETTER H
      C9 |  00000049 | LATIN CAPITAL LETTER I
      CA |  000000AD | SOFT HYPHEN
      CB |  000000F4 | LATIN SMALL LETTER O WITH CIRCUMFLEX
      CC |  000000F6 | LATIN SMALL LETTER O WITH DIAERESIS
      CD |  000000F2 | LATIN SMALL LETTER O WITH GRAVE
      CE |  000000F3 | LATIN SMALL LETTER O WITH ACUTE
      CF |  000000F5 | LATIN SMALL LETTER O WITH TILDE
      D0 |  0000007D | RIGHT CURLY BRACKET
      D1 |  0000004A | LATIN CAPITAL LETTER J
      D2 |  0000004B | LATIN CAPITAL LETTER K
      D3 |  0000004C | LATIN CAPITAL LETTER L
      D4 |  0000004D | LATIN CAPITAL LETTER M
      D5 |  0000004E | LATIN CAPITAL LETTER N
      D6 |  0000004F | LATIN CAPITAL LETTER O
      D7 |  00000050 | LATIN CAPITAL LETTER P
      D8 |  00000051 | LATIN CAPITAL LETTER Q
      D9 |  00000052 | LATIN CAPITAL LETTER R
      DA |  000000B9 | SUPERSCRIPT ONE
      DB |  000000FB | LATIN SMALL LETTER U WITH CIRCUMFLEX
      DC |  000000FC | LATIN SMALL LETTER U WITH DIAERESIS
      DD |  000000F9 | LATIN SMALL LETTER U WITH GRAVE
      DE |  000000FA | LATIN SMALL LETTER U WITH ACUTE
      DF |  000000FF | LATIN SMALL LETTER Y WITH DIAERESIS
      E0 |  0000005C | REVERSE SOLIDUS
      E1 |  000000F7 | DIVISION SIGN
      E2 |  00000053 | LATIN CAPITAL LETTER S
      E3 |  00000054 | LATIN CAPITAL LETTER T
      E4 |  00000055 | LATIN CAPITAL LETTER U
      E5 |  00000056 | LATIN CAPITAL LETTER V
      E6 |  00000057 | LATIN CAPITAL LETTER W
      E7 |  00000058 | LATIN CAPITAL LETTER X
      E8 |  00000059 | LATIN CAPITAL LETTER Y
      E9 |  0000005A | LATIN CAPITAL LETTER Z
      EA |  000000B2 | SUPERSCRIPT TWO
      EB |  000000D4 | LATIN CAPITAL LETTER O WITH CIRCUMFLEX
      EC |  000000D6 | LATIN CAPITAL LETTER O WITH DIAERESIS
      ED |  000000D2 | LATIN CAPITAL LETTER O WITH GRAVE
      EE |  000000D3 | LATIN CAPITAL LETTER O WITH ACUTE
      EF |  000000D5 | LATIN CAPITAL LETTER O WITH TILDE
      F0 |  00000030 | DIGIT ZERO
      F1 |  00000031 | DIGIT ONE
      F2 |  00000032 | DIGIT TWO
      F3 |  00000033 | DIGIT THREE
      F4 |  00000034 | DIGIT FOUR
      F5 |  00000035 | DIGIT FIVE
      F6 |  00000036 | DIGIT SIX
      F7 |  00000037 | DIGIT SEVEN
      F8 |  00000038 | DIGIT EIGHT
      F9 |  00000039 | DIGIT NINE
      FA |  000000B3 | SUPERSCRIPT THREE
      FB |  000000DB | LATIN CAPITAL LETTER U WITH CIRCUMFLEX
      FC |  000000DC | LATIN CAPITAL LETTER U WITH DIAERESIS
      FD |  000000D9 | LATIN CAPITAL LETTER U WITH GRAVE
      FE |  000000DA | LATIN CAPITAL LETTER U WITH ACUTE
      FF |  0000009F | APPLICATION PROGRAM COMMAND (APC)
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_IBM037

    $main::fatpacked{"Locale/RecodeData/IBM038.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_IBM038';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for IBM038.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::IBM038;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x009c,
      0x0009,
      0x0086,
      0x007f,
      0x0097,
      0x008d,
      0x008e,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x009d,
      0x0085,
      0x0008,
      0x0087,
      0x0018,
      0x0019,
      0x0092,
      0x008f,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0080,
      0x0081,
      0x0082,
      0x0083,
      0x0084,
      0x000a,
      0x0017,
      0x001b,
      0x0088,
      0x0089,
      0x008a,
      0x008b,
      0x008c,
      0x0005,
      0x0006,
      0x0007,
      0x0090,
      0x0091,
      0x0016,
      0x0093,
      0x0094,
      0x0095,
      0x0096,
      0x0004,
      0x0098,
      0x0099,
      0x009a,
      0x009b,
      0x0014,
      0x0015,
      0x009e,
      0x001a,
      0x0020,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x005b,
      0x002e,
      0x003c,
      0x0028,
      0x002b,
      0x0021,
      0x0026,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x005d,
      0x0024,
      0x002a,
      0x0029,
      0x003b,
      0x005e,
      0x002d,
      0x002f,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00a6,
      0x002c,
      0x0025,
      0x005f,
      0x003e,
      0x003f,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0060,
      0x003a,
      0x0023,
      0x0040,
      0x0027,
      0x003d,
      0x0022,
      0xfffd,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x007e,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x007b,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x007d,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x005c,
      0xfffd,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x009f,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\xc2\x9c",
      "\x09",
      "\xc2\x86",
      "\x7f",
      "\xc2\x97",
      "\xc2\x8d",
      "\xc2\x8e",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\xc2\x9d",
      "\xc2\x85",
      "\x08",
      "\xc2\x87",
      "\x18",
      "\x19",
      "\xc2\x92",
      "\xc2\x8f",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\xc2\x80",
      "\xc2\x81",
      "\xc2\x82",
      "\xc2\x83",
      "\xc2\x84",
      "\x0a",
      "\x17",
      "\x1b",
      "\xc2\x88",
      "\xc2\x89",
      "\xc2\x8a",
      "\xc2\x8b",
      "\xc2\x8c",
      "\x05",
      "\x06",
      "\x07",
      "\xc2\x90",
      "\xc2\x91",
      "\x16",
      "\xc2\x93",
      "\xc2\x94",
      "\xc2\x95",
      "\xc2\x96",
      "\x04",
      "\xc2\x98",
      "\xc2\x99",
      "\xc2\x9a",
      "\xc2\x9b",
      "\x14",
      "\x15",
      "\xc2\x9e",
      "\x1a",
      "\x20",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x5b",
      "\x2e",
      "\x3c",
      "\x28",
      "\x2b",
      "\x21",
      "\x26",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x5d",
      "\x24",
      "\x2a",
      "\x29",
      "\x3b",
      "\x5e",
      "\x2d",
      "\x2f",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc2\xa6",
      "\x2c",
      "\x25",
      "\x5f",
      "\x3e",
      "\x3f",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x60",
      "\x3a",
      "\x23",
      "\x40",
      "\x27",
      "\x3d",
      "\x22",
      "\xef\xbf\xbd",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x7e",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x7b",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x7d",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x5c",
      "\xef\xbf\xbd",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc2\x9f",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x37",
      0x00000005 => "\x2d",
      0x00000006 => "\x2e",
      0x00000007 => "\x2f",
      0x00000008 => "\x16",
      0x00000009 => "\x05",
      0x0000000a => "\x25",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x3c",
      0x00000015 => "\x3d",
      0x00000016 => "\x32",
      0x00000017 => "\x26",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x3f",
      0x0000001b => "\x27",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x40",
      0x00000021 => "\x4f",
      0x00000022 => "\x7f",
      0x00000023 => "\x7b",
      0x00000024 => "\x5b",
      0x00000025 => "\x6c",
      0x00000026 => "\x50",
      0x00000027 => "\x7d",
      0x00000028 => "\x4d",
      0x00000029 => "\x5d",
      0x0000002a => "\x5c",
      0x0000002b => "\x4e",
      0x0000002c => "\x6b",
      0x0000002d => "\x60",
      0x0000002e => "\x4b",
      0x0000002f => "\x61",
      0x00000030 => "\xf0",
      0x00000031 => "\xf1",
      0x00000032 => "\xf2",
      0x00000033 => "\xf3",
      0x00000034 => "\xf4",
      0x00000035 => "\xf5",
      0x00000036 => "\xf6",
      0x00000037 => "\xf7",
      0x00000038 => "\xf8",
      0x00000039 => "\xf9",
      0x0000003a => "\x7a",
      0x0000003b => "\x5e",
      0x0000003c => "\x4c",
      0x0000003d => "\x7e",
      0x0000003e => "\x6e",
      0x0000003f => "\x6f",
      0x00000040 => "\x7c",
      0x00000041 => "\xc1",
      0x00000042 => "\xc2",
      0x00000043 => "\xc3",
      0x00000044 => "\xc4",
      0x00000045 => "\xc5",
      0x00000046 => "\xc6",
      0x00000047 => "\xc7",
      0x00000048 => "\xc8",
      0x00000049 => "\xc9",
      0x0000004a => "\xd1",
      0x0000004b => "\xd2",
      0x0000004c => "\xd3",
      0x0000004d => "\xd4",
      0x0000004e => "\xd5",
      0x0000004f => "\xd6",
      0x00000050 => "\xd7",
      0x00000051 => "\xd8",
      0x00000052 => "\xd9",
      0x00000053 => "\xe2",
      0x00000054 => "\xe3",
      0x00000055 => "\xe4",
      0x00000056 => "\xe5",
      0x00000057 => "\xe6",
      0x00000058 => "\xe7",
      0x00000059 => "\xe8",
      0x0000005a => "\xe9",
      0x0000005b => "\x4a",
      0x0000005c => "\xe0",
      0x0000005d => "\x5a",
      0x0000005e => "\x5f",
      0x0000005f => "\x6d",
      0x00000060 => "\x79",
      0x00000061 => "\x81",
      0x00000062 => "\x82",
      0x00000063 => "\x83",
      0x00000064 => "\x84",
      0x00000065 => "\x85",
      0x00000066 => "\x86",
      0x00000067 => "\x87",
      0x00000068 => "\x88",
      0x00000069 => "\x89",
      0x0000006a => "\x91",
      0x0000006b => "\x92",
      0x0000006c => "\x93",
      0x0000006d => "\x94",
      0x0000006e => "\x95",
      0x0000006f => "\x96",
      0x00000070 => "\x97",
      0x00000071 => "\x98",
      0x00000072 => "\x99",
      0x00000073 => "\xa2",
      0x00000074 => "\xa3",
      0x00000075 => "\xa4",
      0x00000076 => "\xa5",
      0x00000077 => "\xa6",
      0x00000078 => "\xa7",
      0x00000079 => "\xa8",
      0x0000007a => "\xa9",
      0x0000007b => "\xc0",
      0x0000007d => "\xd0",
      0x0000007e => "\xa1",
      0x0000007f => "\x07",
      0x00000080 => "\x20",
      0x00000081 => "\x21",
      0x00000082 => "\x22",
      0x00000083 => "\x23",
      0x00000084 => "\x24",
      0x00000085 => "\x15",
      0x00000086 => "\x06",
      0x00000087 => "\x17",
      0x00000088 => "\x28",
      0x00000089 => "\x29",
      0x0000008a => "\x2a",
      0x0000008b => "\x2b",
      0x0000008c => "\x2c",
      0x0000008d => "\x09",
      0x0000008e => "\x0a",
      0x0000008f => "\x1b",
      0x00000090 => "\x30",
      0x00000091 => "\x31",
      0x00000092 => "\x1a",
      0x00000093 => "\x33",
      0x00000094 => "\x34",
      0x00000095 => "\x35",
      0x00000096 => "\x36",
      0x00000097 => "\x08",
      0x00000098 => "\x38",
      0x00000099 => "\x39",
      0x0000009a => "\x3a",
      0x0000009b => "\x3b",
      0x0000009c => "\x04",
      0x0000009d => "\x14",
      0x0000009e => "\x3e",
      0x0000009f => "\xff",
      0x000000a6 => "\x6a",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x6f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::IBM038 - Conversion routines for IBM038
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for IBM038.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: IBM 3174 Character Set Ref, GA27-3831-02, March 1990
   alias EBCDIC-INT
   alias CP038
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  0000009C | STRING TERMINATOR (ST)
      05 |  00000009 | CHARACTER TABULATION (HT)
      06 |  00000086 | START OF SELECTED AREA (SSA)
      07 |  0000007F | DELETE (DEL)
      08 |  00000097 | END OF GUARDED AREA (EPA)
      09 |  0000008D | REVERSE LINE FEED (RI)
      0A |  0000008E | SINGLE-SHIFT TWO (SS2)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  0000009D | OPERATING SYSTEM COMMAND (OSC)
      15 |  00000085 | NEXT LINE (NEL)
      16 |  00000008 | BACKSPACE (BS)
      17 |  00000087 | END OF SELECTED AREA (ESA)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  00000092 | PRIVATE USE TWO (PU2)
      1B |  0000008F | SINGLE-SHIFT THREE (SS3)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000080 | PADDING CHARACTER (PAD)
      21 |  00000081 | HIGH OCTET PRESET (HOP)
      22 |  00000082 | BREAK PERMITTED HERE (BPH)
      23 |  00000083 | NO BREAK HERE (NBH)
      24 |  00000084 | INDEX (IND)
      25 |  0000000A | LINE FEED (LF)
      26 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      27 |  0000001B | ESCAPE (ESC)
      28 |  00000088 | CHARACTER TABULATION SET (HTS)
      29 |  00000089 | CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
      2A |  0000008A | LINE TABULATION SET (VTS)
      2B |  0000008B | PARTIAL LINE FORWARD (PLD)
      2C |  0000008C | PARTIAL LINE BACKWARD (PLU)
      2D |  00000005 | ENQUIRY (ENQ)
      2E |  00000006 | ACKNOWLEDGE (ACK)
      2F |  00000007 | BELL (BEL)
      30 |  00000090 | DEVICE CONTROL STRING (DCS)
      31 |  00000091 | PRIVATE USE ONE (PU1)
      32 |  00000016 | SYNCHRONOUS IDLE (SYN)
      33 |  00000093 | SET TRANSMIT STATE (STS)
      34 |  00000094 | CANCEL CHARACTER (CCH)
      35 |  00000095 | MESSAGE WAITING (MW)
      36 |  00000096 | START OF GUARDED AREA (SPA)
      37 |  00000004 | END OF TRANSMISSION (EOT)
      38 |  00000098 | START OF STRING (SOS)
      39 |  00000099 | SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
      3A |  0000009A | SINGLE CHARACTER INTRODUCER (SCI)
      3B |  0000009B | CONTROL SEQUENCE INTRODUCER (CSI)
      3C |  00000014 | DEVICE CONTROL FOUR (DC4)
      3D |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      3E |  0000009E | PRIVACY MESSAGE (PM)
      3F |  0000001A | SUBSTITUTE (SUB)
      40 |  00000020 | SPACE
      4A |  0000005B | LEFT SQUARE BRACKET
      4B |  0000002E | FULL STOP
      4C |  0000003C | LESS-THAN SIGN
      4D |  00000028 | LEFT PARENTHESIS
      4E |  0000002B | PLUS SIGN
      4F |  00000021 | EXCLAMATION MARK
      50 |  00000026 | AMPERSAND
      5A |  0000005D | RIGHT SQUARE BRACKET
      5B |  00000024 | DOLLAR SIGN
      5C |  0000002A | ASTERISK
      5D |  00000029 | RIGHT PARENTHESIS
      5E |  0000003B | SEMICOLON
      5F |  0000005E | CIRCUMFLEX ACCENT
      60 |  0000002D | HYPHEN-MINUS
      61 |  0000002F | SOLIDUS
      6A |  000000A6 | BROKEN BAR
      6B |  0000002C | COMMA
      6C |  00000025 | PERCENT SIGN
      6D |  0000005F | LOW LINE
      6E |  0000003E | GREATER-THAN SIGN
      6F |  0000003F | QUESTION MARK
      79 |  00000060 | GRAVE ACCENT
      7A |  0000003A | COLON
      7B |  00000023 | NUMBER SIGN
      7C |  00000040 | COMMERCIAL AT
      7D |  00000027 | APOSTROPHE
      7E |  0000003D | EQUALS SIGN
      7F |  00000022 | QUOTATION MARK
      81 |  00000061 | LATIN SMALL LETTER A
      82 |  00000062 | LATIN SMALL LETTER B
      83 |  00000063 | LATIN SMALL LETTER C
      84 |  00000064 | LATIN SMALL LETTER D
      85 |  00000065 | LATIN SMALL LETTER E
      86 |  00000066 | LATIN SMALL LETTER F
      87 |  00000067 | LATIN SMALL LETTER G
      88 |  00000068 | LATIN SMALL LETTER H
      89 |  00000069 | LATIN SMALL LETTER I
      91 |  0000006A | LATIN SMALL LETTER J
      92 |  0000006B | LATIN SMALL LETTER K
      93 |  0000006C | LATIN SMALL LETTER L
      94 |  0000006D | LATIN SMALL LETTER M
      95 |  0000006E | LATIN SMALL LETTER N
      96 |  0000006F | LATIN SMALL LETTER O
      97 |  00000070 | LATIN SMALL LETTER P
      98 |  00000071 | LATIN SMALL LETTER Q
      99 |  00000072 | LATIN SMALL LETTER R
      A1 |  0000007E | TILDE
      A2 |  00000073 | LATIN SMALL LETTER S
      A3 |  00000074 | LATIN SMALL LETTER T
      A4 |  00000075 | LATIN SMALL LETTER U
      A5 |  00000076 | LATIN SMALL LETTER V
      A6 |  00000077 | LATIN SMALL LETTER W
      A7 |  00000078 | LATIN SMALL LETTER X
      A8 |  00000079 | LATIN SMALL LETTER Y
      A9 |  0000007A | LATIN SMALL LETTER Z
      C0 |  0000007B | LEFT CURLY BRACKET
      C1 |  00000041 | LATIN CAPITAL LETTER A
      C2 |  00000042 | LATIN CAPITAL LETTER B
      C3 |  00000043 | LATIN CAPITAL LETTER C
      C4 |  00000044 | LATIN CAPITAL LETTER D
      C5 |  00000045 | LATIN CAPITAL LETTER E
      C6 |  00000046 | LATIN CAPITAL LETTER F
      C7 |  00000047 | LATIN CAPITAL LETTER G
      C8 |  00000048 | LATIN CAPITAL LETTER H
      C9 |  00000049 | LATIN CAPITAL LETTER I
      D0 |  0000007D | RIGHT CURLY BRACKET
      D1 |  0000004A | LATIN CAPITAL LETTER J
      D2 |  0000004B | LATIN CAPITAL LETTER K
      D3 |  0000004C | LATIN CAPITAL LETTER L
      D4 |  0000004D | LATIN CAPITAL LETTER M
      D5 |  0000004E | LATIN CAPITAL LETTER N
      D6 |  0000004F | LATIN CAPITAL LETTER O
      D7 |  00000050 | LATIN CAPITAL LETTER P
      D8 |  00000051 | LATIN CAPITAL LETTER Q
      D9 |  00000052 | LATIN CAPITAL LETTER R
      E0 |  0000005C | REVERSE SOLIDUS
      E2 |  00000053 | LATIN CAPITAL LETTER S
      E3 |  00000054 | LATIN CAPITAL LETTER T
      E4 |  00000055 | LATIN CAPITAL LETTER U
      E5 |  00000056 | LATIN CAPITAL LETTER V
      E6 |  00000057 | LATIN CAPITAL LETTER W
      E7 |  00000058 | LATIN CAPITAL LETTER X
      E8 |  00000059 | LATIN CAPITAL LETTER Y
      E9 |  0000005A | LATIN CAPITAL LETTER Z
      F0 |  00000030 | DIGIT ZERO
      F1 |  00000031 | DIGIT ONE
      F2 |  00000032 | DIGIT TWO
      F3 |  00000033 | DIGIT THREE
      F4 |  00000034 | DIGIT FOUR
      F5 |  00000035 | DIGIT FIVE
      F6 |  00000036 | DIGIT SIX
      F7 |  00000037 | DIGIT SEVEN
      F8 |  00000038 | DIGIT EIGHT
      F9 |  00000039 | DIGIT NINE
      FF |  0000009F | APPLICATION PROGRAM COMMAND (APC)
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_IBM038

    $main::fatpacked{"Locale/RecodeData/IBM1004.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_IBM1004';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for IBM1004.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::IBM1004;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0xfffd,
      0xfffd,
      0x201a,
      0xfffd,
      0x201e,
      0x2026,
      0x2020,
      0x2021,
      0x02c6,
      0x2030,
      0x0160,
      0x2039,
      0x0152,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x2018,
      0x2019,
      0x201c,
      0x201d,
      0x2022,
      0x2013,
      0x2014,
      0x02dc,
      0x2122,
      0x0161,
      0x203a,
      0x0153,
      0xfffd,
      0xfffd,
      0x0178,
      0x00a0,
      0x00a1,
      0x00a2,
      0x00a3,
      0x00a4,
      0x00a5,
      0x00a6,
      0x00a7,
      0x00a8,
      0x00a9,
      0x00aa,
      0x00ab,
      0x00ac,
      0x00ad,
      0x00ae,
      0x00af,
      0x00b0,
      0x00b1,
      0x00b2,
      0x00b3,
      0x00b4,
      0x00b5,
      0x00b6,
      0x00b7,
      0x00b8,
      0x00b9,
      0x00ba,
      0x00bb,
      0x00bc,
      0x00bd,
      0x00be,
      0x00bf,
      0x00c0,
      0x00c1,
      0x00c2,
      0x00c3,
      0x00c4,
      0x00c5,
      0x00c6,
      0x00c7,
      0x00c8,
      0x00c9,
      0x00ca,
      0x00cb,
      0x00cc,
      0x00cd,
      0x00ce,
      0x00cf,
      0x00d0,
      0x00d1,
      0x00d2,
      0x00d3,
      0x00d4,
      0x00d5,
      0x00d6,
      0x00d7,
      0x00d8,
      0x00d9,
      0x00da,
      0x00db,
      0x00dc,
      0x00dd,
      0x00de,
      0x00df,
      0x00e0,
      0x00e1,
      0x00e2,
      0x00e3,
      0x00e4,
      0x00e5,
      0x00e6,
      0x00e7,
      0x00e8,
      0x00e9,
      0x00ea,
      0x00eb,
      0x00ec,
      0x00ed,
      0x00ee,
      0x00ef,
      0x00f0,
      0x00f1,
      0x00f2,
      0x00f3,
      0x00f4,
      0x00f5,
      0x00f6,
      0x00f7,
      0x00f8,
      0x00f9,
      0x00fa,
      0x00fb,
      0x00fc,
      0x00fd,
      0x00fe,
      0x00ff,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xe2\x80\x9a",
      "\xef\xbf\xbd",
      "\xe2\x80\x9e",
      "\xe2\x80\xa6",
      "\xe2\x80\xa0",
      "\xe2\x80\xa1",
      "\xcb\x86",
      "\xe2\x80\xb0",
      "\xc5\xa0",
      "\xe2\x80\xb9",
      "\xc5\x92",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xe2\x80\x98",
      "\xe2\x80\x99",
      "\xe2\x80\x9c",
      "\xe2\x80\x9d",
      "\xe2\x80\xa2",
      "\xe2\x80\x93",
      "\xe2\x80\x94",
      "\xcb\x9c",
      "\xe2\x84\xa2",
      "\xc5\xa1",
      "\xe2\x80\xba",
      "\xc5\x93",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc5\xb8",
      "\xc2\xa0",
      "\xc2\xa1",
      "\xc2\xa2",
      "\xc2\xa3",
      "\xc2\xa4",
      "\xc2\xa5",
      "\xc2\xa6",
      "\xc2\xa7",
      "\xc2\xa8",
      "\xc2\xa9",
      "\xc2\xaa",
      "\xc2\xab",
      "\xc2\xac",
      "\xc2\xad",
      "\xc2\xae",
      "\xc2\xaf",
      "\xc2\xb0",
      "\xc2\xb1",
      "\xc2\xb2",
      "\xc2\xb3",
      "\xc2\xb4",
      "\xc2\xb5",
      "\xc2\xb6",
      "\xc2\xb7",
      "\xc2\xb8",
      "\xc2\xb9",
      "\xc2\xba",
      "\xc2\xbb",
      "\xc2\xbc",
      "\xc2\xbd",
      "\xc2\xbe",
      "\xc2\xbf",
      "\xc3\x80",
      "\xc3\x81",
      "\xc3\x82",
      "\xc3\x83",
      "\xc3\x84",
      "\xc3\x85",
      "\xc3\x86",
      "\xc3\x87",
      "\xc3\x88",
      "\xc3\x89",
      "\xc3\x8a",
      "\xc3\x8b",
      "\xc3\x8c",
      "\xc3\x8d",
      "\xc3\x8e",
      "\xc3\x8f",
      "\xc3\x90",
      "\xc3\x91",
      "\xc3\x92",
      "\xc3\x93",
      "\xc3\x94",
      "\xc3\x95",
      "\xc3\x96",
      "\xc3\x97",
      "\xc3\x98",
      "\xc3\x99",
      "\xc3\x9a",
      "\xc3\x9b",
      "\xc3\x9c",
      "\xc3\x9d",
      "\xc3\x9e",
      "\xc3\x9f",
      "\xc3\xa0",
      "\xc3\xa1",
      "\xc3\xa2",
      "\xc3\xa3",
      "\xc3\xa4",
      "\xc3\xa5",
      "\xc3\xa6",
      "\xc3\xa7",
      "\xc3\xa8",
      "\xc3\xa9",
      "\xc3\xaa",
      "\xc3\xab",
      "\xc3\xac",
      "\xc3\xad",
      "\xc3\xae",
      "\xc3\xaf",
      "\xc3\xb0",
      "\xc3\xb1",
      "\xc3\xb2",
      "\xc3\xb3",
      "\xc3\xb4",
      "\xc3\xb5",
      "\xc3\xb6",
      "\xc3\xb7",
      "\xc3\xb8",
      "\xc3\xb9",
      "\xc3\xba",
      "\xc3\xbb",
      "\xc3\xbc",
      "\xc3\xbd",
      "\xc3\xbe",
      "\xc3\xbf",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x000000a0 => "\xa0",
      0x000000a1 => "\xa1",
      0x000000a2 => "\xa2",
      0x000000a3 => "\xa3",
      0x000000a4 => "\xa4",
      0x000000a5 => "\xa5",
      0x000000a6 => "\xa6",
      0x000000a7 => "\xa7",
      0x000000a8 => "\xa8",
      0x000000a9 => "\xa9",
      0x000000aa => "\xaa",
      0x000000ab => "\xab",
      0x000000ac => "\xac",
      0x000000ad => "\xad",
      0x000000ae => "\xae",
      0x000000af => "\xaf",
      0x000000b0 => "\xb0",
      0x000000b1 => "\xb1",
      0x000000b2 => "\xb2",
      0x000000b3 => "\xb3",
      0x000000b4 => "\xb4",
      0x000000b5 => "\xb5",
      0x000000b6 => "\xb6",
      0x000000b7 => "\xb7",
      0x000000b8 => "\xb8",
      0x000000b9 => "\xb9",
      0x000000ba => "\xba",
      0x000000bb => "\xbb",
      0x000000bc => "\xbc",
      0x000000bd => "\xbd",
      0x000000be => "\xbe",
      0x000000bf => "\xbf",
      0x000000c0 => "\xc0",
      0x000000c1 => "\xc1",
      0x000000c2 => "\xc2",
      0x000000c3 => "\xc3",
      0x000000c4 => "\xc4",
      0x000000c5 => "\xc5",
      0x000000c6 => "\xc6",
      0x000000c7 => "\xc7",
      0x000000c8 => "\xc8",
      0x000000c9 => "\xc9",
      0x000000ca => "\xca",
      0x000000cb => "\xcb",
      0x000000cc => "\xcc",
      0x000000cd => "\xcd",
      0x000000ce => "\xce",
      0x000000cf => "\xcf",
      0x000000d0 => "\xd0",
      0x000000d1 => "\xd1",
      0x000000d2 => "\xd2",
      0x000000d3 => "\xd3",
      0x000000d4 => "\xd4",
      0x000000d5 => "\xd5",
      0x000000d6 => "\xd6",
      0x000000d7 => "\xd7",
      0x000000d8 => "\xd8",
      0x000000d9 => "\xd9",
      0x000000da => "\xda",
      0x000000db => "\xdb",
      0x000000dc => "\xdc",
      0x000000dd => "\xdd",
      0x000000de => "\xde",
      0x000000df => "\xdf",
      0x000000e0 => "\xe0",
      0x000000e1 => "\xe1",
      0x000000e2 => "\xe2",
      0x000000e3 => "\xe3",
      0x000000e4 => "\xe4",
      0x000000e5 => "\xe5",
      0x000000e6 => "\xe6",
      0x000000e7 => "\xe7",
      0x000000e8 => "\xe8",
      0x000000e9 => "\xe9",
      0x000000ea => "\xea",
      0x000000eb => "\xeb",
      0x000000ec => "\xec",
      0x000000ed => "\xed",
      0x000000ee => "\xee",
      0x000000ef => "\xef",
      0x000000f0 => "\xf0",
      0x000000f1 => "\xf1",
      0x000000f2 => "\xf2",
      0x000000f3 => "\xf3",
      0x000000f4 => "\xf4",
      0x000000f5 => "\xf5",
      0x000000f6 => "\xf6",
      0x000000f7 => "\xf7",
      0x000000f8 => "\xf8",
      0x000000f9 => "\xf9",
      0x000000fa => "\xfa",
      0x000000fb => "\xfb",
      0x000000fc => "\xfc",
      0x000000fd => "\xfd",
      0x000000fe => "\xfe",
      0x000000ff => "\xff",
      0x00000152 => "\x8c",
      0x00000153 => "\x9c",
      0x00000160 => "\x8a",
      0x00000161 => "\x9a",
      0x00000178 => "\x9f",
      0x000002c6 => "\x88",
      0x000002dc => "\x98",
      0x00002013 => "\x96",
      0x00002014 => "\x97",
      0x00002018 => "\x91",
      0x00002019 => "\x92",
      0x0000201a => "\x82",
      0x0000201c => "\x93",
      0x0000201d => "\x94",
      0x0000201e => "\x84",
      0x00002020 => "\x86",
      0x00002021 => "\x87",
      0x00002022 => "\x95",
      0x00002026 => "\x85",
      0x00002030 => "\x89",
      0x00002039 => "\x8b",
      0x0000203a => "\x9b",
      0x00002122 => "\x99",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::IBM1004 - Conversion routines for IBM1004
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for IBM1004.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: CEN/TC304 N283, 1994-02-04
   alias CP1004
   alias OS2LATIN1
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE (DEL)
      82 |  0000201A | SINGLE LOW-9 QUOTATION MARK
      84 |  0000201E | DOUBLE LOW-9 QUOTATION MARK
      85 |  00002026 | HORIZONTAL ELLIPSIS
      86 |  00002020 | DAGGER
      87 |  00002021 | DOUBLE DAGGER
      88 |  000002C6 | MODIFIER LETTER CIRCUMFLEX ACCENT
      89 |  00002030 | PER MILLE SIGN
      8A |  00000160 | LATIN CAPITAL LETTER S WITH CARON
      8B |  00002039 | SINGLE LEFT-POINTING ANGLE QUOTATION MARK
      8C |  00000152 | LATIN CAPITAL LIGATURE OE
      91 |  00002018 | LEFT SINGLE QUOTATION MARK
      92 |  00002019 | RIGHT SINGLE QUOTATION MARK
      93 |  0000201C | LEFT DOUBLE QUOTATION MARK
      94 |  0000201D | RIGHT DOUBLE QUOTATION MARK
      95 |  00002022 | BULLET
      96 |  00002013 | EN DASH
      97 |  00002014 | EM DASH
      98 |  000002DC | SMALL TILDE
      99 |  00002122 | TRADE MARK SIGN
      9A |  00000161 | LATIN SMALL LETTER S WITH CARON
      9B |  0000203A | SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
      9C |  00000153 | LATIN SMALL LIGATURE OE
      9F |  00000178 | LATIN CAPITAL LETTER Y WITH DIAERESIS
      A0 |  000000A0 | NO-BREAK SPACE
      A1 |  000000A1 | INVERTED EXCLAMATION MARK
      A2 |  000000A2 | CENT SIGN
      A3 |  000000A3 | POUND SIGN
      A4 |  000000A4 | CURRENCY SIGN
      A5 |  000000A5 | YEN SIGN
      A6 |  000000A6 | BROKEN BAR
      A7 |  000000A7 | SECTION SIGN
      A8 |  000000A8 | DIAERESIS
      A9 |  000000A9 | COPYRIGHT SIGN
      AA |  000000AA | FEMININE ORDINAL INDICATOR
      AB |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
      AC |  000000AC | NOT SIGN
      AD |  000000AD | SOFT HYPHEN
      AE |  000000AE | REGISTERED SIGN
      AF |  000000AF | MACRON
      B0 |  000000B0 | DEGREE SIGN
      B1 |  000000B1 | PLUS-MINUS SIGN
      B2 |  000000B2 | SUPERSCRIPT TWO
      B3 |  000000B3 | SUPERSCRIPT THREE
      B4 |  000000B4 | ACUTE ACCENT
      B5 |  000000B5 | MICRO SIGN
      B6 |  000000B6 | PILCROW SIGN
      B7 |  000000B7 | MIDDLE DOT
      B8 |  000000B8 | CEDILLA
      B9 |  000000B9 | SUPERSCRIPT ONE
      BA |  000000BA | MASCULINE ORDINAL INDICATOR
      BB |  000000BB | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
      BC |  000000BC | VULGAR FRACTION ONE QUARTER
      BD |  000000BD | VULGAR FRACTION ONE HALF
      BE |  000000BE | VULGAR FRACTION THREE QUARTERS
      BF |  000000BF | INVERTED QUESTION MARK
      C0 |  000000C0 | LATIN CAPITAL LETTER A WITH GRAVE
      C1 |  000000C1 | LATIN CAPITAL LETTER A WITH ACUTE
      C2 |  000000C2 | LATIN CAPITAL LETTER A WITH CIRCUMFLEX
      C3 |  000000C3 | LATIN CAPITAL LETTER A WITH TILDE
      C4 |  000000C4 | LATIN CAPITAL LETTER A WITH DIAERESIS
      C5 |  000000C5 | LATIN CAPITAL LETTER A WITH RING ABOVE
      C6 |  000000C6 | LATIN CAPITAL LETTER AE
      C7 |  000000C7 | LATIN CAPITAL LETTER C WITH CEDILLA
      C8 |  000000C8 | LATIN CAPITAL LETTER E WITH GRAVE
      C9 |  000000C9 | LATIN CAPITAL LETTER E WITH ACUTE
      CA |  000000CA | LATIN CAPITAL LETTER E WITH CIRCUMFLEX
      CB |  000000CB | LATIN CAPITAL LETTER E WITH DIAERESIS
      CC |  000000CC | LATIN CAPITAL LETTER I WITH GRAVE
      CD |  000000CD | LATIN CAPITAL LETTER I WITH ACUTE
      CE |  000000CE | LATIN CAPITAL LETTER I WITH CIRCUMFLEX
      CF |  000000CF | LATIN CAPITAL LETTER I WITH DIAERESIS
      D0 |  000000D0 | LATIN CAPITAL LETTER ETH (Icelandic)
      D1 |  000000D1 | LATIN CAPITAL LETTER N WITH TILDE
      D2 |  000000D2 | LATIN CAPITAL LETTER O WITH GRAVE
      D3 |  000000D3 | LATIN CAPITAL LETTER O WITH ACUTE
      D4 |  000000D4 | LATIN CAPITAL LETTER O WITH CIRCUMFLEX
      D5 |  000000D5 | LATIN CAPITAL LETTER O WITH TILDE
      D6 |  000000D6 | LATIN CAPITAL LETTER O WITH DIAERESIS
      D7 |  000000D7 | MULTIPLICATION SIGN
      D8 |  000000D8 | LATIN CAPITAL LETTER O WITH STROKE
      D9 |  000000D9 | LATIN CAPITAL LETTER U WITH GRAVE
      DA |  000000DA | LATIN CAPITAL LETTER U WITH ACUTE
      DB |  000000DB | LATIN CAPITAL LETTER U WITH CIRCUMFLEX
      DC |  000000DC | LATIN CAPITAL LETTER U WITH DIAERESIS
      DD |  000000DD | LATIN CAPITAL LETTER Y WITH ACUTE
      DE |  000000DE | LATIN CAPITAL LETTER THORN (Icelandic)
      DF |  000000DF | LATIN SMALL LETTER SHARP S (German)
      E0 |  000000E0 | LATIN SMALL LETTER A WITH GRAVE
      E1 |  000000E1 | LATIN SMALL LETTER A WITH ACUTE
      E2 |  000000E2 | LATIN SMALL LETTER A WITH CIRCUMFLEX
      E3 |  000000E3 | LATIN SMALL LETTER A WITH TILDE
      E4 |  000000E4 | LATIN SMALL LETTER A WITH DIAERESIS
      E5 |  000000E5 | LATIN SMALL LETTER A WITH RING ABOVE
      E6 |  000000E6 | LATIN SMALL LETTER AE
      E7 |  000000E7 | LATIN SMALL LETTER C WITH CEDILLA
      E8 |  000000E8 | LATIN SMALL LETTER E WITH GRAVE
      E9 |  000000E9 | LATIN SMALL LETTER E WITH ACUTE
      EA |  000000EA | LATIN SMALL LETTER E WITH CIRCUMFLEX
      EB |  000000EB | LATIN SMALL LETTER E WITH DIAERESIS
      EC |  000000EC | LATIN SMALL LETTER I WITH GRAVE
      ED |  000000ED | LATIN SMALL LETTER I WITH ACUTE
      EE |  000000EE | LATIN SMALL LETTER I WITH CIRCUMFLEX
      EF |  000000EF | LATIN SMALL LETTER I WITH DIAERESIS
      F0 |  000000F0 | LATIN SMALL LETTER ETH (Icelandic)
      F1 |  000000F1 | LATIN SMALL LETTER N WITH TILDE
      F2 |  000000F2 | LATIN SMALL LETTER O WITH GRAVE
      F3 |  000000F3 | LATIN SMALL LETTER O WITH ACUTE
      F4 |  000000F4 | LATIN SMALL LETTER O WITH CIRCUMFLEX
      F5 |  000000F5 | LATIN SMALL LETTER O WITH TILDE
      F6 |  000000F6 | LATIN SMALL LETTER O WITH DIAERESIS
      F7 |  000000F7 | DIVISION SIGN
      F8 |  000000F8 | LATIN SMALL LETTER O WITH STROKE
      F9 |  000000F9 | LATIN SMALL LETTER U WITH GRAVE
      FA |  000000FA | LATIN SMALL LETTER U WITH ACUTE
      FB |  000000FB | LATIN SMALL LETTER U WITH CIRCUMFLEX
      FC |  000000FC | LATIN SMALL LETTER U WITH DIAERESIS
      FD |  000000FD | LATIN SMALL LETTER Y WITH ACUTE
      FE |  000000FE | LATIN SMALL LETTER THORN (Icelandic)
      FF |  000000FF | LATIN SMALL LETTER Y WITH DIAERESIS
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_IBM1004

    $main::fatpacked{"Locale/RecodeData/IBM1026.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_IBM1026';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for IBM1026.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::IBM1026;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x009c,
      0x0009,
      0x0086,
      0x007f,
      0x0097,
      0x008d,
      0x008e,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x009d,
      0x0085,
      0x0008,
      0x0087,
      0x0018,
      0x0019,
      0x0092,
      0x008f,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0080,
      0x0081,
      0x0082,
      0x0083,
      0x0084,
      0x000a,
      0x0017,
      0x001b,
      0x0088,
      0x0089,
      0x008a,
      0x008b,
      0x008c,
      0x0005,
      0x0006,
      0x0007,
      0x0090,
      0x0091,
      0x0016,
      0x0093,
      0x0094,
      0x0095,
      0x0096,
      0x0004,
      0x0098,
      0x0099,
      0x009a,
      0x009b,
      0x0014,
      0x0015,
      0x009e,
      0x001a,
      0x0020,
      0x00a0,
      0x00e2,
      0x00e4,
      0x00e0,
      0x00e1,
      0x00e3,
      0x00e5,
      0x007b,
      0x00f1,
      0x00c7,
      0x002e,
      0x003c,
      0x0028,
      0x002b,
      0x0021,
      0x0026,
      0x00e9,
      0x00ea,
      0x00eb,
      0x00e8,
      0x00ed,
      0x00ee,
      0x00ef,
      0x00ec,
      0x00df,
      0x011e,
      0x0130,
      0x002a,
      0x0029,
      0x003b,
      0x005e,
      0x002d,
      0x002f,
      0x00c2,
      0x00c4,
      0x00c0,
      0x00c1,
      0x00c3,
      0x00c5,
      0x005b,
      0x00d1,
      0x015f,
      0x002c,
      0x0025,
      0x005f,
      0x003e,
      0x003f,
      0x00f8,
      0x00c9,
      0x00ca,
      0x00cb,
      0x00c8,
      0x00cd,
      0x00ce,
      0x00cf,
      0x00cc,
      0x0131,
      0x003a,
      0x00d6,
      0x015e,
      0x0027,
      0x003d,
      0x00dc,
      0x00d8,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x00ab,
      0x00bb,
      0x007d,
      0x0060,
      0x00a6,
      0x00b1,
      0x00b0,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x00aa,
      0x00ba,
      0x00e6,
      0x02db,
      0x00c6,
      0x00a4,
      0x00b5,
      0x00f6,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x00a1,
      0x00bf,
      0x005d,
      0x0024,
      0x0040,
      0x00ae,
      0x00a2,
      0x00a3,
      0x00a5,
      0x00b7,
      0x00a9,
      0x00a7,
      0x00b6,
      0x00bc,
      0x00bd,
      0x00be,
      0x00ac,
      0x007c,
      0x2014,
      0x00a8,
      0x00b4,
      0x00d7,
      0x00e7,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x00ad,
      0x00f4,
      0x007e,
      0x00f2,
      0x00f3,
      0x00f5,
      0x011f,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x00b9,
      0x00fb,
      0x005c,
      0x00f9,
      0x00fa,
      0x00ff,
      0x00fc,
      0x00f7,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x00b2,
      0x00d4,
      0x0023,
      0x00d2,
      0x00d3,
      0x00d5,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x00b3,
      0x00db,
      0x0022,
      0x00d9,
      0x00da,
      0x009f,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\xc2\x9c",
      "\x09",
      "\xc2\x86",
      "\x7f",
      "\xc2\x97",
      "\xc2\x8d",
      "\xc2\x8e",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\xc2\x9d",
      "\xc2\x85",
      "\x08",
      "\xc2\x87",
      "\x18",
      "\x19",
      "\xc2\x92",
      "\xc2\x8f",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\xc2\x80",
      "\xc2\x81",
      "\xc2\x82",
      "\xc2\x83",
      "\xc2\x84",
      "\x0a",
      "\x17",
      "\x1b",
      "\xc2\x88",
      "\xc2\x89",
      "\xc2\x8a",
      "\xc2\x8b",
      "\xc2\x8c",
      "\x05",
      "\x06",
      "\x07",
      "\xc2\x90",
      "\xc2\x91",
      "\x16",
      "\xc2\x93",
      "\xc2\x94",
      "\xc2\x95",
      "\xc2\x96",
      "\x04",
      "\xc2\x98",
      "\xc2\x99",
      "\xc2\x9a",
      "\xc2\x9b",
      "\x14",
      "\x15",
      "\xc2\x9e",
      "\x1a",
      "\x20",
      "\xc2\xa0",
      "\xc3\xa2",
      "\xc3\xa4",
      "\xc3\xa0",
      "\xc3\xa1",
      "\xc3\xa3",
      "\xc3\xa5",
      "\x7b",
      "\xc3\xb1",
      "\xc3\x87",
      "\x2e",
      "\x3c",
      "\x28",
      "\x2b",
      "\x21",
      "\x26",
      "\xc3\xa9",
      "\xc3\xaa",
      "\xc3\xab",
      "\xc3\xa8",
      "\xc3\xad",
      "\xc3\xae",
      "\xc3\xaf",
      "\xc3\xac",
      "\xc3\x9f",
      "\xc4\x9e",
      "\xc4\xb0",
      "\x2a",
      "\x29",
      "\x3b",
      "\x5e",
      "\x2d",
      "\x2f",
      "\xc3\x82",
      "\xc3\x84",
      "\xc3\x80",
      "\xc3\x81",
      "\xc3\x83",
      "\xc3\x85",
      "\x5b",
      "\xc3\x91",
      "\xc5\x9f",
      "\x2c",
      "\x25",
      "\x5f",
      "\x3e",
      "\x3f",
      "\xc3\xb8",
      "\xc3\x89",
      "\xc3\x8a",
      "\xc3\x8b",
      "\xc3\x88",
      "\xc3\x8d",
      "\xc3\x8e",
      "\xc3\x8f",
      "\xc3\x8c",
      "\xc4\xb1",
      "\x3a",
      "\xc3\x96",
      "\xc5\x9e",
      "\x27",
      "\x3d",
      "\xc3\x9c",
      "\xc3\x98",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\xc2\xab",
      "\xc2\xbb",
      "\x7d",
      "\x60",
      "\xc2\xa6",
      "\xc2\xb1",
      "\xc2\xb0",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\xc2\xaa",
      "\xc2\xba",
      "\xc3\xa6",
      "\xcb\x9b",
      "\xc3\x86",
      "\xc2\xa4",
      "\xc2\xb5",
      "\xc3\xb6",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\xc2\xa1",
      "\xc2\xbf",
      "\x5d",
      "\x24",
      "\x40",
      "\xc2\xae",
      "\xc2\xa2",
      "\xc2\xa3",
      "\xc2\xa5",
      "\xc2\xb7",
      "\xc2\xa9",
      "\xc2\xa7",
      "\xc2\xb6",
      "\xc2\xbc",
      "\xc2\xbd",
      "\xc2\xbe",
      "\xc2\xac",
      "\x7c",
      "\xe2\x80\x94",
      "\xc2\xa8",
      "\xc2\xb4",
      "\xc3\x97",
      "\xc3\xa7",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\xc2\xad",
      "\xc3\xb4",
      "\x7e",
      "\xc3\xb2",
      "\xc3\xb3",
      "\xc3\xb5",
      "\xc4\x9f",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\xc2\xb9",
      "\xc3\xbb",
      "\x5c",
      "\xc3\xb9",
      "\xc3\xba",
      "\xc3\xbf",
      "\xc3\xbc",
      "\xc3\xb7",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\xc2\xb2",
      "\xc3\x94",
      "\x23",
      "\xc3\x92",
      "\xc3\x93",
      "\xc3\x95",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\xc2\xb3",
      "\xc3\x9b",
      "\x22",
      "\xc3\x99",
      "\xc3\x9a",
      "\xc2\x9f",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x37",
      0x00000005 => "\x2d",
      0x00000006 => "\x2e",
      0x00000007 => "\x2f",
      0x00000008 => "\x16",
      0x00000009 => "\x05",
      0x0000000a => "\x25",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x3c",
      0x00000015 => "\x3d",
      0x00000016 => "\x32",
      0x00000017 => "\x26",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x3f",
      0x0000001b => "\x27",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x40",
      0x00000021 => "\x4f",
      0x00000022 => "\xfc",
      0x00000023 => "\xec",
      0x00000024 => "\xad",
      0x00000025 => "\x6c",
      0x00000026 => "\x50",
      0x00000027 => "\x7d",
      0x00000028 => "\x4d",
      0x00000029 => "\x5d",
      0x0000002a => "\x5c",
      0x0000002b => "\x4e",
      0x0000002c => "\x6b",
      0x0000002d => "\x60",
      0x0000002e => "\x4b",
      0x0000002f => "\x61",
      0x00000030 => "\xf0",
      0x00000031 => "\xf1",
      0x00000032 => "\xf2",
      0x00000033 => "\xf3",
      0x00000034 => "\xf4",
      0x00000035 => "\xf5",
      0x00000036 => "\xf6",
      0x00000037 => "\xf7",
      0x00000038 => "\xf8",
      0x00000039 => "\xf9",
      0x0000003a => "\x7a",
      0x0000003b => "\x5e",
      0x0000003c => "\x4c",
      0x0000003d => "\x7e",
      0x0000003e => "\x6e",
      0x0000003f => "\x6f",
      0x00000040 => "\xae",
      0x00000041 => "\xc1",
      0x00000042 => "\xc2",
      0x00000043 => "\xc3",
      0x00000044 => "\xc4",
      0x00000045 => "\xc5",
      0x00000046 => "\xc6",
      0x00000047 => "\xc7",
      0x00000048 => "\xc8",
      0x00000049 => "\xc9",
      0x0000004a => "\xd1",
      0x0000004b => "\xd2",
      0x0000004c => "\xd3",
      0x0000004d => "\xd4",
      0x0000004e => "\xd5",
      0x0000004f => "\xd6",
      0x00000050 => "\xd7",
      0x00000051 => "\xd8",
      0x00000052 => "\xd9",
      0x00000053 => "\xe2",
      0x00000054 => "\xe3",
      0x00000055 => "\xe4",
      0x00000056 => "\xe5",
      0x00000057 => "\xe6",
      0x00000058 => "\xe7",
      0x00000059 => "\xe8",
      0x0000005a => "\xe9",
      0x0000005b => "\x68",
      0x0000005c => "\xdc",
      0x0000005d => "\xac",
      0x0000005e => "\x5f",
      0x0000005f => "\x6d",
      0x00000060 => "\x8d",
      0x00000061 => "\x81",
      0x00000062 => "\x82",
      0x00000063 => "\x83",
      0x00000064 => "\x84",
      0x00000065 => "\x85",
      0x00000066 => "\x86",
      0x00000067 => "\x87",
      0x00000068 => "\x88",
      0x00000069 => "\x89",
      0x0000006a => "\x91",
      0x0000006b => "\x92",
      0x0000006c => "\x93",
      0x0000006d => "\x94",
      0x0000006e => "\x95",
      0x0000006f => "\x96",
      0x00000070 => "\x97",
      0x00000071 => "\x98",
      0x00000072 => "\x99",
      0x00000073 => "\xa2",
      0x00000074 => "\xa3",
      0x00000075 => "\xa4",
      0x00000076 => "\xa5",
      0x00000077 => "\xa6",
      0x00000078 => "\xa7",
      0x00000079 => "\xa8",
      0x0000007a => "\xa9",
      0x0000007b => "\x48",
      0x0000007c => "\xbb",
      0x0000007d => "\x8c",
      0x0000007e => "\xcc",
      0x0000007f => "\x07",
      0x00000080 => "\x20",
      0x00000081 => "\x21",
      0x00000082 => "\x22",
      0x00000083 => "\x23",
      0x00000084 => "\x24",
      0x00000085 => "\x15",
      0x00000086 => "\x06",
      0x00000087 => "\x17",
      0x00000088 => "\x28",
      0x00000089 => "\x29",
      0x0000008a => "\x2a",
      0x0000008b => "\x2b",
      0x0000008c => "\x2c",
      0x0000008d => "\x09",
      0x0000008e => "\x0a",
      0x0000008f => "\x1b",
      0x00000090 => "\x30",
      0x00000091 => "\x31",
      0x00000092 => "\x1a",
      0x00000093 => "\x33",
      0x00000094 => "\x34",
      0x00000095 => "\x35",
      0x00000096 => "\x36",
      0x00000097 => "\x08",
      0x00000098 => "\x38",
      0x00000099 => "\x39",
      0x0000009a => "\x3a",
      0x0000009b => "\x3b",
      0x0000009c => "\x04",
      0x0000009d => "\x14",
      0x0000009e => "\x3e",
      0x0000009f => "\xff",
      0x000000a0 => "\x41",
      0x000000a1 => "\xaa",
      0x000000a2 => "\xb0",
      0x000000a3 => "\xb1",
      0x000000a4 => "\x9f",
      0x000000a5 => "\xb2",
      0x000000a6 => "\x8e",
      0x000000a7 => "\xb5",
      0x000000a8 => "\xbd",
      0x000000a9 => "\xb4",
      0x000000aa => "\x9a",
      0x000000ab => "\x8a",
      0x000000ac => "\xba",
      0x000000ad => "\xca",
      0x000000ae => "\xaf",
      0x000000b0 => "\x90",
      0x000000b1 => "\x8f",
      0x000000b2 => "\xea",
      0x000000b3 => "\xfa",
      0x000000b4 => "\xbe",
      0x000000b5 => "\xa0",
      0x000000b6 => "\xb6",
      0x000000b7 => "\xb3",
      0x000000b9 => "\xda",
      0x000000ba => "\x9b",
      0x000000bb => "\x8b",
      0x000000bc => "\xb7",
      0x000000bd => "\xb8",
      0x000000be => "\xb9",
      0x000000bf => "\xab",
      0x000000c0 => "\x64",
      0x000000c1 => "\x65",
      0x000000c2 => "\x62",
      0x000000c3 => "\x66",
      0x000000c4 => "\x63",
      0x000000c5 => "\x67",
      0x000000c6 => "\x9e",
      0x000000c7 => "\x4a",
      0x000000c8 => "\x74",
      0x000000c9 => "\x71",
      0x000000ca => "\x72",
      0x000000cb => "\x73",
      0x000000cc => "\x78",
      0x000000cd => "\x75",
      0x000000ce => "\x76",
      0x000000cf => "\x77",
      0x000000d1 => "\x69",
      0x000000d2 => "\xed",
      0x000000d3 => "\xee",
      0x000000d4 => "\xeb",
      0x000000d5 => "\xef",
      0x000000d6 => "\x7b",
      0x000000d7 => "\xbf",
      0x000000d8 => "\x80",
      0x000000d9 => "\xfd",
      0x000000da => "\xfe",
      0x000000db => "\xfb",
      0x000000dc => "\x7f",
      0x000000df => "\x59",
      0x000000e0 => "\x44",
      0x000000e1 => "\x45",
      0x000000e2 => "\x42",
      0x000000e3 => "\x46",
      0x000000e4 => "\x43",
      0x000000e5 => "\x47",
      0x000000e6 => "\x9c",
      0x000000e7 => "\xc0",
      0x000000e8 => "\x54",
      0x000000e9 => "\x51",
      0x000000ea => "\x52",
      0x000000eb => "\x53",
      0x000000ec => "\x58",
      0x000000ed => "\x55",
      0x000000ee => "\x56",
      0x000000ef => "\x57",
      0x000000f1 => "\x49",
      0x000000f2 => "\xcd",
      0x000000f3 => "\xce",
      0x000000f4 => "\xcb",
      0x000000f5 => "\xcf",
      0x000000f6 => "\xa1",
      0x000000f7 => "\xe1",
      0x000000f8 => "\x70",
      0x000000f9 => "\xdd",
      0x000000fa => "\xde",
      0x000000fb => "\xdb",
      0x000000fc => "\xe0",
      0x000000ff => "\xdf",
      0x0000011e => "\x5a",
      0x0000011f => "\xd0",
      0x00000130 => "\x5b",
      0x00000131 => "\x79",
      0x0000015e => "\x7c",
      0x0000015f => "\x6a",
      0x000002db => "\x9d",
      0x00002014 => "\xbc",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x6f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::IBM1026 - Conversion routines for IBM1026
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for IBM1026.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: IBM NLS RM Vol2 SE09-8002-01, March 1990
   alias CP1026
   alias 1026
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  0000009C | STRING TERMINATOR (ST)
      05 |  00000009 | CHARACTER TABULATION (HT)
      06 |  00000086 | START OF SELECTED AREA (SSA)
      07 |  0000007F | DELETE (DEL)
      08 |  00000097 | END OF GUARDED AREA (EPA)
      09 |  0000008D | REVERSE LINE FEED (RI)
      0A |  0000008E | SINGLE-SHIFT TWO (SS2)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  0000009D | OPERATING SYSTEM COMMAND (OSC)
      15 |  00000085 | NEXT LINE (NEL)
      16 |  00000008 | BACKSPACE (BS)
      17 |  00000087 | END OF SELECTED AREA (ESA)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  00000092 | PRIVATE USE TWO (PU2)
      1B |  0000008F | SINGLE-SHIFT THREE (SS3)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000080 | PADDING CHARACTER (PAD)
      21 |  00000081 | HIGH OCTET PRESET (HOP)
      22 |  00000082 | BREAK PERMITTED HERE (BPH)
      23 |  00000083 | NO BREAK HERE (NBH)
      24 |  00000084 | INDEX (IND)
      25 |  0000000A | LINE FEED (LF)
      26 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      27 |  0000001B | ESCAPE (ESC)
      28 |  00000088 | CHARACTER TABULATION SET (HTS)
      29 |  00000089 | CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
      2A |  0000008A | LINE TABULATION SET (VTS)
      2B |  0000008B | PARTIAL LINE FORWARD (PLD)
      2C |  0000008C | PARTIAL LINE BACKWARD (PLU)
      2D |  00000005 | ENQUIRY (ENQ)
      2E |  00000006 | ACKNOWLEDGE (ACK)
      2F |  00000007 | BELL (BEL)
      30 |  00000090 | DEVICE CONTROL STRING (DCS)
      31 |  00000091 | PRIVATE USE ONE (PU1)
      32 |  00000016 | SYNCHRONOUS IDLE (SYN)
      33 |  00000093 | SET TRANSMIT STATE (STS)
      34 |  00000094 | CANCEL CHARACTER (CCH)
      35 |  00000095 | MESSAGE WAITING (MW)
      36 |  00000096 | START OF GUARDED AREA (SPA)
      37 |  00000004 | END OF TRANSMISSION (EOT)
      38 |  00000098 | START OF STRING (SOS)
      39 |  00000099 | SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
      3A |  0000009A | SINGLE CHARACTER INTRODUCER (SCI)
      3B |  0000009B | CONTROL SEQUENCE INTRODUCER (CSI)
      3C |  00000014 | DEVICE CONTROL FOUR (DC4)
      3D |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      3E |  0000009E | PRIVACY MESSAGE (PM)
      3F |  0000001A | SUBSTITUTE (SUB)
      40 |  00000020 | SPACE
      41 |  000000A0 | NO-BREAK SPACE
      42 |  000000E2 | LATIN SMALL LETTER A WITH CIRCUMFLEX
      43 |  000000E4 | LATIN SMALL LETTER A WITH DIAERESIS
      44 |  000000E0 | LATIN SMALL LETTER A WITH GRAVE
      45 |  000000E1 | LATIN SMALL LETTER A WITH ACUTE
      46 |  000000E3 | LATIN SMALL LETTER A WITH TILDE
      47 |  000000E5 | LATIN SMALL LETTER A WITH RING ABOVE
      48 |  0000007B | LEFT CURLY BRACKET
      49 |  000000F1 | LATIN SMALL LETTER N WITH TILDE
      4A |  000000C7 | LATIN CAPITAL LETTER C WITH CEDILLA
      4B |  0000002E | FULL STOP
      4C |  0000003C | LESS-THAN SIGN
      4D |  00000028 | LEFT PARENTHESIS
      4E |  0000002B | PLUS SIGN
      4F |  00000021 | EXCLAMATION MARK
      50 |  00000026 | AMPERSAND
      51 |  000000E9 | LATIN SMALL LETTER E WITH ACUTE
      52 |  000000EA | LATIN SMALL LETTER E WITH CIRCUMFLEX
      53 |  000000EB | LATIN SMALL LETTER E WITH DIAERESIS
      54 |  000000E8 | LATIN SMALL LETTER E WITH GRAVE
      55 |  000000ED | LATIN SMALL LETTER I WITH ACUTE
      56 |  000000EE | LATIN SMALL LETTER I WITH CIRCUMFLEX
      57 |  000000EF | LATIN SMALL LETTER I WITH DIAERESIS
      58 |  000000EC | LATIN SMALL LETTER I WITH GRAVE
      59 |  000000DF | LATIN SMALL LETTER SHARP S (German)
      5A |  0000011E | LATIN CAPITAL LETTER G WITH BREVE
      5B |  00000130 | LATIN CAPITAL LETTER I WITH DOT ABOVE
      5C |  0000002A | ASTERISK
      5D |  00000029 | RIGHT PARENTHESIS
      5E |  0000003B | SEMICOLON
      5F |  0000005E | CIRCUMFLEX ACCENT
      60 |  0000002D | HYPHEN-MINUS
      61 |  0000002F | SOLIDUS
      62 |  000000C2 | LATIN CAPITAL LETTER A WITH CIRCUMFLEX
      63 |  000000C4 | LATIN CAPITAL LETTER A WITH DIAERESIS
      64 |  000000C0 | LATIN CAPITAL LETTER A WITH GRAVE
      65 |  000000C1 | LATIN CAPITAL LETTER A WITH ACUTE
      66 |  000000C3 | LATIN CAPITAL LETTER A WITH TILDE
      67 |  000000C5 | LATIN CAPITAL LETTER A WITH RING ABOVE
      68 |  0000005B | LEFT SQUARE BRACKET
      69 |  000000D1 | LATIN CAPITAL LETTER N WITH TILDE
      6A |  0000015F | LATIN SMALL LETTER S WITH CEDILLA
      6B |  0000002C | COMMA
      6C |  00000025 | PERCENT SIGN
      6D |  0000005F | LOW LINE
      6E |  0000003E | GREATER-THAN SIGN
      6F |  0000003F | QUESTION MARK
      70 |  000000F8 | LATIN SMALL LETTER O WITH STROKE
      71 |  000000C9 | LATIN CAPITAL LETTER E WITH ACUTE
      72 |  000000CA | LATIN CAPITAL LETTER E WITH CIRCUMFLEX
      73 |  000000CB | LATIN CAPITAL LETTER E WITH DIAERESIS
      74 |  000000C8 | LATIN CAPITAL LETTER E WITH GRAVE
      75 |  000000CD | LATIN CAPITAL LETTER I WITH ACUTE
      76 |  000000CE | LATIN CAPITAL LETTER I WITH CIRCUMFLEX
      77 |  000000CF | LATIN CAPITAL LETTER I WITH DIAERESIS
      78 |  000000CC | LATIN CAPITAL LETTER I WITH GRAVE
      79 |  00000131 | LATIN SMALL LETTER DOTLESS I
      7A |  0000003A | COLON
      7B |  000000D6 | LATIN CAPITAL LETTER O WITH DIAERESIS
      7C |  0000015E | LATIN CAPITAL LETTER S WITH CEDILLA
      7D |  00000027 | APOSTROPHE
      7E |  0000003D | EQUALS SIGN
      7F |  000000DC | LATIN CAPITAL LETTER U WITH DIAERESIS
      80 |  000000D8 | LATIN CAPITAL LETTER O WITH STROKE
      81 |  00000061 | LATIN SMALL LETTER A
      82 |  00000062 | LATIN SMALL LETTER B
      83 |  00000063 | LATIN SMALL LETTER C
      84 |  00000064 | LATIN SMALL LETTER D
      85 |  00000065 | LATIN SMALL LETTER E
      86 |  00000066 | LATIN SMALL LETTER F
      87 |  00000067 | LATIN SMALL LETTER G
      88 |  00000068 | LATIN SMALL LETTER H
      89 |  00000069 | LATIN SMALL LETTER I
      8A |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
      8B |  000000BB | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
      8C |  0000007D | RIGHT CURLY BRACKET
      8D |  00000060 | GRAVE ACCENT
      8E |  000000A6 | BROKEN BAR
      8F |  000000B1 | PLUS-MINUS SIGN
      90 |  000000B0 | DEGREE SIGN
      91 |  0000006A | LATIN SMALL LETTER J
      92 |  0000006B | LATIN SMALL LETTER K
      93 |  0000006C | LATIN SMALL LETTER L
      94 |  0000006D | LATIN SMALL LETTER M
      95 |  0000006E | LATIN SMALL LETTER N
      96 |  0000006F | LATIN SMALL LETTER O
      97 |  00000070 | LATIN SMALL LETTER P
      98 |  00000071 | LATIN SMALL LETTER Q
      99 |  00000072 | LATIN SMALL LETTER R
      9A |  000000AA | FEMININE ORDINAL INDICATOR
      9B |  000000BA | MASCULINE ORDINAL INDICATOR
      9C |  000000E6 | LATIN SMALL LETTER AE
      9D |  000002DB | OGONEK
      9E |  000000C6 | LATIN CAPITAL LETTER AE
      9F |  000000A4 | CURRENCY SIGN
      A0 |  000000B5 | MICRO SIGN
      A1 |  000000F6 | LATIN SMALL LETTER O WITH DIAERESIS
      A2 |  00000073 | LATIN SMALL LETTER S
      A3 |  00000074 | LATIN SMALL LETTER T
      A4 |  00000075 | LATIN SMALL LETTER U
      A5 |  00000076 | LATIN SMALL LETTER V
      A6 |  00000077 | LATIN SMALL LETTER W
      A7 |  00000078 | LATIN SMALL LETTER X
      A8 |  00000079 | LATIN SMALL LETTER Y
      A9 |  0000007A | LATIN SMALL LETTER Z
      AA |  000000A1 | INVERTED EXCLAMATION MARK
      AB |  000000BF | INVERTED QUESTION MARK
      AC |  0000005D | RIGHT SQUARE BRACKET
      AD |  00000024 | DOLLAR SIGN
      AE |  00000040 | COMMERCIAL AT
      AF |  000000AE | REGISTERED SIGN
      B0 |  000000A2 | CENT SIGN
      B1 |  000000A3 | POUND SIGN
      B2 |  000000A5 | YEN SIGN
      B3 |  000000B7 | MIDDLE DOT
      B4 |  000000A9 | COPYRIGHT SIGN
      B5 |  000000A7 | SECTION SIGN
      B6 |  000000B6 | PILCROW SIGN
      B7 |  000000BC | VULGAR FRACTION ONE QUARTER
      B8 |  000000BD | VULGAR FRACTION ONE HALF
      B9 |  000000BE | VULGAR FRACTION THREE QUARTERS
      BA |  000000AC | NOT SIGN
      BB |  0000007C | VERTICAL LINE
      BC |  00002014 | EM DASH
      BD |  000000A8 | DIAERESIS
      BE |  000000B4 | ACUTE ACCENT
      BF |  000000D7 | MULTIPLICATION SIGN
      C0 |  000000E7 | LATIN SMALL LETTER C WITH CEDILLA
      C1 |  00000041 | LATIN CAPITAL LETTER A
      C2 |  00000042 | LATIN CAPITAL LETTER B
      C3 |  00000043 | LATIN CAPITAL LETTER C
      C4 |  00000044 | LATIN CAPITAL LETTER D
      C5 |  00000045 | LATIN CAPITAL LETTER E
      C6 |  00000046 | LATIN CAPITAL LETTER F
      C7 |  00000047 | LATIN CAPITAL LETTER G
      C8 |  00000048 | LATIN CAPITAL LETTER H
      C9 |  00000049 | LATIN CAPITAL LETTER I
      CA |  000000AD | SOFT HYPHEN
      CB |  000000F4 | LATIN SMALL LETTER O WITH CIRCUMFLEX
      CC |  0000007E | TILDE
      CD |  000000F2 | LATIN SMALL LETTER O WITH GRAVE
      CE |  000000F3 | LATIN SMALL LETTER O WITH ACUTE
      CF |  000000F5 | LATIN SMALL LETTER O WITH TILDE
      D0 |  0000011F | LATIN SMALL LETTER G WITH BREVE
      D1 |  0000004A | LATIN CAPITAL LETTER J
      D2 |  0000004B | LATIN CAPITAL LETTER K
      D3 |  0000004C | LATIN CAPITAL LETTER L
      D4 |  0000004D | LATIN CAPITAL LETTER M
      D5 |  0000004E | LATIN CAPITAL LETTER N
      D6 |  0000004F | LATIN CAPITAL LETTER O
      D7 |  00000050 | LATIN CAPITAL LETTER P
      D8 |  00000051 | LATIN CAPITAL LETTER Q
      D9 |  00000052 | LATIN CAPITAL LETTER R
      DA |  000000B9 | SUPERSCRIPT ONE
      DB |  000000FB | LATIN SMALL LETTER U WITH CIRCUMFLEX
      DC |  0000005C | REVERSE SOLIDUS
      DD |  000000F9 | LATIN SMALL LETTER U WITH GRAVE
      DE |  000000FA | LATIN SMALL LETTER U WITH ACUTE
      DF |  000000FF | LATIN SMALL LETTER Y WITH DIAERESIS
      E0 |  000000FC | LATIN SMALL LETTER U WITH DIAERESIS
      E1 |  000000F7 | DIVISION SIGN
      E2 |  00000053 | LATIN CAPITAL LETTER S
      E3 |  00000054 | LATIN CAPITAL LETTER T
      E4 |  00000055 | LATIN CAPITAL LETTER U
      E5 |  00000056 | LATIN CAPITAL LETTER V
      E6 |  00000057 | LATIN CAPITAL LETTER W
      E7 |  00000058 | LATIN CAPITAL LETTER X
      E8 |  00000059 | LATIN CAPITAL LETTER Y
      E9 |  0000005A | LATIN CAPITAL LETTER Z
      EA |  000000B2 | SUPERSCRIPT TWO
      EB |  000000D4 | LATIN CAPITAL LETTER O WITH CIRCUMFLEX
      EC |  00000023 | NUMBER SIGN
      ED |  000000D2 | LATIN CAPITAL LETTER O WITH GRAVE
      EE |  000000D3 | LATIN CAPITAL LETTER O WITH ACUTE
      EF |  000000D5 | LATIN CAPITAL LETTER O WITH TILDE
      F0 |  00000030 | DIGIT ZERO
      F1 |  00000031 | DIGIT ONE
      F2 |  00000032 | DIGIT TWO
      F3 |  00000033 | DIGIT THREE
      F4 |  00000034 | DIGIT FOUR
      F5 |  00000035 | DIGIT FIVE
      F6 |  00000036 | DIGIT SIX
      F7 |  00000037 | DIGIT SEVEN
      F8 |  00000038 | DIGIT EIGHT
      F9 |  00000039 | DIGIT NINE
      FA |  000000B3 | SUPERSCRIPT THREE
      FB |  000000DB | LATIN CAPITAL LETTER U WITH CIRCUMFLEX
      FC |  00000022 | QUOTATION MARK
      FD |  000000D9 | LATIN CAPITAL LETTER U WITH GRAVE
      FE |  000000DA | LATIN CAPITAL LETTER U WITH ACUTE
      FF |  0000009F | APPLICATION PROGRAM COMMAND (APC)
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_IBM1026

    $main::fatpacked{"Locale/RecodeData/IBM1047.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_IBM1047';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for IBM1047.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::IBM1047;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x009c,
      0x0009,
      0x0086,
      0x007f,
      0x0097,
      0x008d,
      0x008e,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x009d,
      0x0085,
      0x0008,
      0x0087,
      0x0018,
      0x0019,
      0x0092,
      0x008f,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0080,
      0x0081,
      0x0082,
      0x0083,
      0x0084,
      0x000a,
      0x0017,
      0x001b,
      0x0088,
      0x0089,
      0x008a,
      0x008b,
      0x008c,
      0x0005,
      0x0006,
      0x0007,
      0x0090,
      0x0091,
      0x0016,
      0x0093,
      0x0094,
      0x0095,
      0x0096,
      0x0004,
      0x0098,
      0x0099,
      0x009a,
      0x009b,
      0x0014,
      0x0015,
      0x009e,
      0x001a,
      0x0020,
      0x00a0,
      0x00e2,
      0x00e4,
      0x00e0,
      0x00e1,
      0x00e3,
      0x00e5,
      0x00e7,
      0x00f1,
      0x00a2,
      0x002e,
      0x003c,
      0x0028,
      0x002b,
      0x007c,
      0x0026,
      0x00e9,
      0x00ea,
      0x00eb,
      0x00e8,
      0x00ed,
      0x00ee,
      0x00ef,
      0x00ec,
      0x00df,
      0x0021,
      0x0024,
      0x002a,
      0x0029,
      0x003b,
      0x005e,
      0x002d,
      0x002f,
      0x00c2,
      0x00c4,
      0x00c0,
      0x00c1,
      0x00c3,
      0x00c5,
      0x00c7,
      0x00d1,
      0x00a6,
      0x002c,
      0x0025,
      0x005f,
      0x003e,
      0x003f,
      0x00f8,
      0x00c9,
      0x00ca,
      0x00cb,
      0x00c8,
      0x00cd,
      0x00ce,
      0x00cf,
      0x00cc,
      0x0060,
      0x003a,
      0x0023,
      0x0040,
      0x0027,
      0x003d,
      0x0022,
      0x00d8,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x00ab,
      0x00bb,
      0x00f0,
      0x00fd,
      0x00fe,
      0x00b1,
      0x00b0,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x00aa,
      0x00ba,
      0x00e6,
      0x00b8,
      0x00c6,
      0x00a4,
      0x00b5,
      0x007e,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x00a1,
      0x00bf,
      0x00d0,
      0x005b,
      0x00de,
      0x00ae,
      0x00ac,
      0x00a3,
      0x00a5,
      0x00b7,
      0x00a9,
      0x00a7,
      0x00b6,
      0x00bc,
      0x00bd,
      0x00be,
      0x00dd,
      0x00a8,
      0x00af,
      0x005d,
      0x00b4,
      0x00d7,
      0x007b,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x00ad,
      0x00f4,
      0x00f6,
      0x00f2,
      0x00f3,
      0x00f5,
      0x007d,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x00b9,
      0x00fb,
      0x00fc,
      0x00f9,
      0x00fa,
      0x00ff,
      0x005c,
      0x00f7,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x00b2,
      0x00d4,
      0x00d6,
      0x00d2,
      0x00d3,
      0x00d5,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x00b3,
      0x00db,
      0x00dc,
      0x00d9,
      0x00da,
      0x009f,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\xc2\x9c",
      "\x09",
      "\xc2\x86",
      "\x7f",
      "\xc2\x97",
      "\xc2\x8d",
      "\xc2\x8e",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\xc2\x9d",
      "\xc2\x85",
      "\x08",
      "\xc2\x87",
      "\x18",
      "\x19",
      "\xc2\x92",
      "\xc2\x8f",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\xc2\x80",
      "\xc2\x81",
      "\xc2\x82",
      "\xc2\x83",
      "\xc2\x84",
      "\x0a",
      "\x17",
      "\x1b",
      "\xc2\x88",
      "\xc2\x89",
      "\xc2\x8a",
      "\xc2\x8b",
      "\xc2\x8c",
      "\x05",
      "\x06",
      "\x07",
      "\xc2\x90",
      "\xc2\x91",
      "\x16",
      "\xc2\x93",
      "\xc2\x94",
      "\xc2\x95",
      "\xc2\x96",
      "\x04",
      "\xc2\x98",
      "\xc2\x99",
      "\xc2\x9a",
      "\xc2\x9b",
      "\x14",
      "\x15",
      "\xc2\x9e",
      "\x1a",
      "\x20",
      "\xc2\xa0",
      "\xc3\xa2",
      "\xc3\xa4",
      "\xc3\xa0",
      "\xc3\xa1",
      "\xc3\xa3",
      "\xc3\xa5",
      "\xc3\xa7",
      "\xc3\xb1",
      "\xc2\xa2",
      "\x2e",
      "\x3c",
      "\x28",
      "\x2b",
      "\x7c",
      "\x26",
      "\xc3\xa9",
      "\xc3\xaa",
      "\xc3\xab",
      "\xc3\xa8",
      "\xc3\xad",
      "\xc3\xae",
      "\xc3\xaf",
      "\xc3\xac",
      "\xc3\x9f",
      "\x21",
      "\x24",
      "\x2a",
      "\x29",
      "\x3b",
      "\x5e",
      "\x2d",
      "\x2f",
      "\xc3\x82",
      "\xc3\x84",
      "\xc3\x80",
      "\xc3\x81",
      "\xc3\x83",
      "\xc3\x85",
      "\xc3\x87",
      "\xc3\x91",
      "\xc2\xa6",
      "\x2c",
      "\x25",
      "\x5f",
      "\x3e",
      "\x3f",
      "\xc3\xb8",
      "\xc3\x89",
      "\xc3\x8a",
      "\xc3\x8b",
      "\xc3\x88",
      "\xc3\x8d",
      "\xc3\x8e",
      "\xc3\x8f",
      "\xc3\x8c",
      "\x60",
      "\x3a",
      "\x23",
      "\x40",
      "\x27",
      "\x3d",
      "\x22",
      "\xc3\x98",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\xc2\xab",
      "\xc2\xbb",
      "\xc3\xb0",
      "\xc3\xbd",
      "\xc3\xbe",
      "\xc2\xb1",
      "\xc2\xb0",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\xc2\xaa",
      "\xc2\xba",
      "\xc3\xa6",
      "\xc2\xb8",
      "\xc3\x86",
      "\xc2\xa4",
      "\xc2\xb5",
      "\x7e",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\xc2\xa1",
      "\xc2\xbf",
      "\xc3\x90",
      "\x5b",
      "\xc3\x9e",
      "\xc2\xae",
      "\xc2\xac",
      "\xc2\xa3",
      "\xc2\xa5",
      "\xc2\xb7",
      "\xc2\xa9",
      "\xc2\xa7",
      "\xc2\xb6",
      "\xc2\xbc",
      "\xc2\xbd",
      "\xc2\xbe",
      "\xc3\x9d",
      "\xc2\xa8",
      "\xc2\xaf",
      "\x5d",
      "\xc2\xb4",
      "\xc3\x97",
      "\x7b",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\xc2\xad",
      "\xc3\xb4",
      "\xc3\xb6",
      "\xc3\xb2",
      "\xc3\xb3",
      "\xc3\xb5",
      "\x7d",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\xc2\xb9",
      "\xc3\xbb",
      "\xc3\xbc",
      "\xc3\xb9",
      "\xc3\xba",
      "\xc3\xbf",
      "\x5c",
      "\xc3\xb7",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\xc2\xb2",
      "\xc3\x94",
      "\xc3\x96",
      "\xc3\x92",
      "\xc3\x93",
      "\xc3\x95",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\xc2\xb3",
      "\xc3\x9b",
      "\xc3\x9c",
      "\xc3\x99",
      "\xc3\x9a",
      "\xc2\x9f",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x37",
      0x00000005 => "\x2d",
      0x00000006 => "\x2e",
      0x00000007 => "\x2f",
      0x00000008 => "\x16",
      0x00000009 => "\x05",
      0x0000000a => "\x25",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x3c",
      0x00000015 => "\x3d",
      0x00000016 => "\x32",
      0x00000017 => "\x26",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x3f",
      0x0000001b => "\x27",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x40",
      0x00000021 => "\x5a",
      0x00000022 => "\x7f",
      0x00000023 => "\x7b",
      0x00000024 => "\x5b",
      0x00000025 => "\x6c",
      0x00000026 => "\x50",
      0x00000027 => "\x7d",
      0x00000028 => "\x4d",
      0x00000029 => "\x5d",
      0x0000002a => "\x5c",
      0x0000002b => "\x4e",
      0x0000002c => "\x6b",
      0x0000002d => "\x60",
      0x0000002e => "\x4b",
      0x0000002f => "\x61",
      0x00000030 => "\xf0",
      0x00000031 => "\xf1",
      0x00000032 => "\xf2",
      0x00000033 => "\xf3",
      0x00000034 => "\xf4",
      0x00000035 => "\xf5",
      0x00000036 => "\xf6",
      0x00000037 => "\xf7",
      0x00000038 => "\xf8",
      0x00000039 => "\xf9",
      0x0000003a => "\x7a",
      0x0000003b => "\x5e",
      0x0000003c => "\x4c",
      0x0000003d => "\x7e",
      0x0000003e => "\x6e",
      0x0000003f => "\x6f",
      0x00000040 => "\x7c",
      0x00000041 => "\xc1",
      0x00000042 => "\xc2",
      0x00000043 => "\xc3",
      0x00000044 => "\xc4",
      0x00000045 => "\xc5",
      0x00000046 => "\xc6",
      0x00000047 => "\xc7",
      0x00000048 => "\xc8",
      0x00000049 => "\xc9",
      0x0000004a => "\xd1",
      0x0000004b => "\xd2",
      0x0000004c => "\xd3",
      0x0000004d => "\xd4",
      0x0000004e => "\xd5",
      0x0000004f => "\xd6",
      0x00000050 => "\xd7",
      0x00000051 => "\xd8",
      0x00000052 => "\xd9",
      0x00000053 => "\xe2",
      0x00000054 => "\xe3",
      0x00000055 => "\xe4",
      0x00000056 => "\xe5",
      0x00000057 => "\xe6",
      0x00000058 => "\xe7",
      0x00000059 => "\xe8",
      0x0000005a => "\xe9",
      0x0000005b => "\xad",
      0x0000005c => "\xe0",
      0x0000005d => "\xbd",
      0x0000005e => "\x5f",
      0x0000005f => "\x6d",
      0x00000060 => "\x79",
      0x00000061 => "\x81",
      0x00000062 => "\x82",
      0x00000063 => "\x83",
      0x00000064 => "\x84",
      0x00000065 => "\x85",
      0x00000066 => "\x86",
      0x00000067 => "\x87",
      0x00000068 => "\x88",
      0x00000069 => "\x89",
      0x0000006a => "\x91",
      0x0000006b => "\x92",
      0x0000006c => "\x93",
      0x0000006d => "\x94",
      0x0000006e => "\x95",
      0x0000006f => "\x96",
      0x00000070 => "\x97",
      0x00000071 => "\x98",
      0x00000072 => "\x99",
      0x00000073 => "\xa2",
      0x00000074 => "\xa3",
      0x00000075 => "\xa4",
      0x00000076 => "\xa5",
      0x00000077 => "\xa6",
      0x00000078 => "\xa7",
      0x00000079 => "\xa8",
      0x0000007a => "\xa9",
      0x0000007b => "\xc0",
      0x0000007c => "\x4f",
      0x0000007d => "\xd0",
      0x0000007e => "\xa1",
      0x0000007f => "\x07",
      0x00000080 => "\x20",
      0x00000081 => "\x21",
      0x00000082 => "\x22",
      0x00000083 => "\x23",
      0x00000084 => "\x24",
      0x00000085 => "\x15",
      0x00000086 => "\x06",
      0x00000087 => "\x17",
      0x00000088 => "\x28",
      0x00000089 => "\x29",
      0x0000008a => "\x2a",
      0x0000008b => "\x2b",
      0x0000008c => "\x2c",
      0x0000008d => "\x09",
      0x0000008e => "\x0a",
      0x0000008f => "\x1b",
      0x00000090 => "\x30",
      0x00000091 => "\x31",
      0x00000092 => "\x1a",
      0x00000093 => "\x33",
      0x00000094 => "\x34",
      0x00000095 => "\x35",
      0x00000096 => "\x36",
      0x00000097 => "\x08",
      0x00000098 => "\x38",
      0x00000099 => "\x39",
      0x0000009a => "\x3a",
      0x0000009b => "\x3b",
      0x0000009c => "\x04",
      0x0000009d => "\x14",
      0x0000009e => "\x3e",
      0x0000009f => "\xff",
      0x000000a0 => "\x41",
      0x000000a1 => "\xaa",
      0x000000a2 => "\x4a",
      0x000000a3 => "\xb1",
      0x000000a4 => "\x9f",
      0x000000a5 => "\xb2",
      0x000000a6 => "\x6a",
      0x000000a7 => "\xb5",
      0x000000a8 => "\xbb",
      0x000000a9 => "\xb4",
      0x000000aa => "\x9a",
      0x000000ab => "\x8a",
      0x000000ac => "\xb0",
      0x000000ad => "\xca",
      0x000000ae => "\xaf",
      0x000000af => "\xbc",
      0x000000b0 => "\x90",
      0x000000b1 => "\x8f",
      0x000000b2 => "\xea",
      0x000000b3 => "\xfa",
      0x000000b4 => "\xbe",
      0x000000b5 => "\xa0",
      0x000000b6 => "\xb6",
      0x000000b7 => "\xb3",
      0x000000b8 => "\x9d",
      0x000000b9 => "\xda",
      0x000000ba => "\x9b",
      0x000000bb => "\x8b",
      0x000000bc => "\xb7",
      0x000000bd => "\xb8",
      0x000000be => "\xb9",
      0x000000bf => "\xab",
      0x000000c0 => "\x64",
      0x000000c1 => "\x65",
      0x000000c2 => "\x62",
      0x000000c3 => "\x66",
      0x000000c4 => "\x63",
      0x000000c5 => "\x67",
      0x000000c6 => "\x9e",
      0x000000c7 => "\x68",
      0x000000c8 => "\x74",
      0x000000c9 => "\x71",
      0x000000ca => "\x72",
      0x000000cb => "\x73",
      0x000000cc => "\x78",
      0x000000cd => "\x75",
      0x000000ce => "\x76",
      0x000000cf => "\x77",
      0x000000d0 => "\xac",
      0x000000d1 => "\x69",
      0x000000d2 => "\xed",
      0x000000d3 => "\xee",
      0x000000d4 => "\xeb",
      0x000000d5 => "\xef",
      0x000000d6 => "\xec",
      0x000000d7 => "\xbf",
      0x000000d8 => "\x80",
      0x000000d9 => "\xfd",
      0x000000da => "\xfe",
      0x000000db => "\xfb",
      0x000000dc => "\xfc",
      0x000000dd => "\xba",
      0x000000de => "\xae",
      0x000000df => "\x59",
      0x000000e0 => "\x44",
      0x000000e1 => "\x45",
      0x000000e2 => "\x42",
      0x000000e3 => "\x46",
      0x000000e4 => "\x43",
      0x000000e5 => "\x47",
      0x000000e6 => "\x9c",
      0x000000e7 => "\x48",
      0x000000e8 => "\x54",
      0x000000e9 => "\x51",
      0x000000ea => "\x52",
      0x000000eb => "\x53",
      0x000000ec => "\x58",
      0x000000ed => "\x55",
      0x000000ee => "\x56",
      0x000000ef => "\x57",
      0x000000f0 => "\x8c",
      0x000000f1 => "\x49",
      0x000000f2 => "\xcd",
      0x000000f3 => "\xce",
      0x000000f4 => "\xcb",
      0x000000f5 => "\xcf",
      0x000000f6 => "\xcc",
      0x000000f7 => "\xe1",
      0x000000f8 => "\x70",
      0x000000f9 => "\xdd",
      0x000000fa => "\xde",
      0x000000fb => "\xdb",
      0x000000fc => "\xdc",
      0x000000fd => "\x8d",
      0x000000fe => "\x8e",
      0x000000ff => "\xdf",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x6f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::IBM1047 - Conversion routines for IBM1047
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for IBM1047.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: IBM Character Data Representation Architecture
    Registry SC09-1391-00 p 150.
   alias CP1047
   alias 1047
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  0000009C | STRING TERMINATOR (ST)
      05 |  00000009 | CHARACTER TABULATION (HT)
      06 |  00000086 | START OF SELECTED AREA (SSA)
      07 |  0000007F | DELETE (DEL)
      08 |  00000097 | END OF GUARDED AREA (EPA)
      09 |  0000008D | REVERSE LINE FEED (RI)
      0A |  0000008E | SINGLE-SHIFT TWO (SS2)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  0000009D | OPERATING SYSTEM COMMAND (OSC)
      15 |  00000085 | NEXT LINE (NEL)
      16 |  00000008 | BACKSPACE (BS)
      17 |  00000087 | END OF SELECTED AREA (ESA)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  00000092 | PRIVATE USE TWO (PU2)
      1B |  0000008F | SINGLE-SHIFT THREE (SS3)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000080 | PADDING CHARACTER (PAD)
      21 |  00000081 | HIGH OCTET PRESET (HOP)
      22 |  00000082 | BREAK PERMITTED HERE (BPH)
      23 |  00000083 | NO BREAK HERE (NBH)
      24 |  00000084 | INDEX (IND)
      25 |  0000000A | LINE FEED (LF)
      26 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      27 |  0000001B | ESCAPE (ESC)
      28 |  00000088 | CHARACTER TABULATION SET (HTS)
      29 |  00000089 | CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
      2A |  0000008A | LINE TABULATION SET (VTS)
      2B |  0000008B | PARTIAL LINE FORWARD (PLD)
      2C |  0000008C | PARTIAL LINE BACKWARD (PLU)
      2D |  00000005 | ENQUIRY (ENQ)
      2E |  00000006 | ACKNOWLEDGE (ACK)
      2F |  00000007 | BELL (BEL)
      30 |  00000090 | DEVICE CONTROL STRING (DCS)
      31 |  00000091 | PRIVATE USE ONE (PU1)
      32 |  00000016 | SYNCHRONOUS IDLE (SYN)
      33 |  00000093 | SET TRANSMIT STATE (STS)
      34 |  00000094 | CANCEL CHARACTER (CCH)
      35 |  00000095 | MESSAGE WAITING (MW)
      36 |  00000096 | START OF GUARDED AREA (SPA)
      37 |  00000004 | END OF TRANSMISSION (EOT)
      38 |  00000098 | START OF STRING (SOS)
      39 |  00000099 | SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
      3A |  0000009A | SINGLE CHARACTER INTRODUCER (SCI)
      3B |  0000009B | CONTROL SEQUENCE INTRODUCER (CSI)
      3C |  00000014 | DEVICE CONTROL FOUR (DC4)
      3D |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      3E |  0000009E | PRIVACY MESSAGE (PM)
      3F |  0000001A | SUBSTITUTE (SUB)
      40 |  00000020 | SPACE
      41 |  000000A0 | NO-BREAK SPACE
      42 |  000000E2 | LATIN SMALL LETTER A WITH CIRCUMFLEX
      43 |  000000E4 | LATIN SMALL LETTER A WITH DIAERESIS
      44 |  000000E0 | LATIN SMALL LETTER A WITH GRAVE
      45 |  000000E1 | LATIN SMALL LETTER A WITH ACUTE
      46 |  000000E3 | LATIN SMALL LETTER A WITH TILDE
      47 |  000000E5 | LATIN SMALL LETTER A WITH RING ABOVE
      48 |  000000E7 | LATIN SMALL LETTER C WITH CEDILLA
      49 |  000000F1 | LATIN SMALL LETTER N WITH TILDE
      4A |  000000A2 | CENT SIGN
      4B |  0000002E | FULL STOP
      4C |  0000003C | LESS-THAN SIGN
      4D |  00000028 | LEFT PARENTHESIS
      4E |  0000002B | PLUS SIGN
      4F |  0000007C | VERTICAL LINE
      50 |  00000026 | AMPERSAND
      51 |  000000E9 | LATIN SMALL LETTER E WITH ACUTE
      52 |  000000EA | LATIN SMALL LETTER E WITH CIRCUMFLEX
      53 |  000000EB | LATIN SMALL LETTER E WITH DIAERESIS
      54 |  000000E8 | LATIN SMALL LETTER E WITH GRAVE
      55 |  000000ED | LATIN SMALL LETTER I WITH ACUTE
      56 |  000000EE | LATIN SMALL LETTER I WITH CIRCUMFLEX
      57 |  000000EF | LATIN SMALL LETTER I WITH DIAERESIS
      58 |  000000EC | LATIN SMALL LETTER I WITH GRAVE
      59 |  000000DF | LATIN SMALL LETTER SHARP S (German)
      5A |  00000021 | EXCLAMATION MARK
      5B |  00000024 | DOLLAR SIGN
      5C |  0000002A | ASTERISK
      5D |  00000029 | RIGHT PARENTHESIS
      5E |  0000003B | SEMICOLON
      5F |  0000005E | CIRCUMFLEX ACCENT
      60 |  0000002D | HYPHEN-MINUS
      61 |  0000002F | SOLIDUS
      62 |  000000C2 | LATIN CAPITAL LETTER A WITH CIRCUMFLEX
      63 |  000000C4 | LATIN CAPITAL LETTER A WITH DIAERESIS
      64 |  000000C0 | LATIN CAPITAL LETTER A WITH GRAVE
      65 |  000000C1 | LATIN CAPITAL LETTER A WITH ACUTE
      66 |  000000C3 | LATIN CAPITAL LETTER A WITH TILDE
      67 |  000000C5 | LATIN CAPITAL LETTER A WITH RING ABOVE
      68 |  000000C7 | LATIN CAPITAL LETTER C WITH CEDILLA
      69 |  000000D1 | LATIN CAPITAL LETTER N WITH TILDE
      6A |  000000A6 | BROKEN BAR
      6B |  0000002C | COMMA
      6C |  00000025 | PERCENT SIGN
      6D |  0000005F | LOW LINE
      6E |  0000003E | GREATER-THAN SIGN
      6F |  0000003F | QUESTION MARK
      70 |  000000F8 | LATIN SMALL LETTER O WITH STROKE
      71 |  000000C9 | LATIN CAPITAL LETTER E WITH ACUTE
      72 |  000000CA | LATIN CAPITAL LETTER E WITH CIRCUMFLEX
      73 |  000000CB | LATIN CAPITAL LETTER E WITH DIAERESIS
      74 |  000000C8 | LATIN CAPITAL LETTER E WITH GRAVE
      75 |  000000CD | LATIN CAPITAL LETTER I WITH ACUTE
      76 |  000000CE | LATIN CAPITAL LETTER I WITH CIRCUMFLEX
      77 |  000000CF | LATIN CAPITAL LETTER I WITH DIAERESIS
      78 |  000000CC | LATIN CAPITAL LETTER I WITH GRAVE
      79 |  00000060 | GRAVE ACCENT
      7A |  0000003A | COLON
      7B |  00000023 | NUMBER SIGN
      7C |  00000040 | COMMERCIAL AT
      7D |  00000027 | APOSTROPHE
      7E |  0000003D | EQUALS SIGN
      7F |  00000022 | QUOTATION MARK
      80 |  000000D8 | LATIN CAPITAL LETTER O WITH STROKE
      81 |  00000061 | LATIN SMALL LETTER A
      82 |  00000062 | LATIN SMALL LETTER B
      83 |  00000063 | LATIN SMALL LETTER C
      84 |  00000064 | LATIN SMALL LETTER D
      85 |  00000065 | LATIN SMALL LETTER E
      86 |  00000066 | LATIN SMALL LETTER F
      87 |  00000067 | LATIN SMALL LETTER G
      88 |  00000068 | LATIN SMALL LETTER H
      89 |  00000069 | LATIN SMALL LETTER I
      8A |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
      8B |  000000BB | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
      8C |  000000F0 | LATIN SMALL LETTER ETH (Icelandic)
      8D |  000000FD | LATIN SMALL LETTER Y WITH ACUTE
      8E |  000000FE | LATIN SMALL LETTER THORN (Icelandic)
      8F |  000000B1 | PLUS-MINUS SIGN
      90 |  000000B0 | DEGREE SIGN
      91 |  0000006A | LATIN SMALL LETTER J
      92 |  0000006B | LATIN SMALL LETTER K
      93 |  0000006C | LATIN SMALL LETTER L
      94 |  0000006D | LATIN SMALL LETTER M
      95 |  0000006E | LATIN SMALL LETTER N
      96 |  0000006F | LATIN SMALL LETTER O
      97 |  00000070 | LATIN SMALL LETTER P
      98 |  00000071 | LATIN SMALL LETTER Q
      99 |  00000072 | LATIN SMALL LETTER R
      9A |  000000AA | FEMININE ORDINAL INDICATOR
      9B |  000000BA | MASCULINE ORDINAL INDICATOR
      9C |  000000E6 | LATIN SMALL LETTER AE
      9D |  000000B8 | CEDILLA
      9E |  000000C6 | LATIN CAPITAL LETTER AE
      9F |  000000A4 | CURRENCY SIGN
      A0 |  000000B5 | MICRO SIGN
      A1 |  0000007E | TILDE
      A2 |  00000073 | LATIN SMALL LETTER S
      A3 |  00000074 | LATIN SMALL LETTER T
      A4 |  00000075 | LATIN SMALL LETTER U
      A5 |  00000076 | LATIN SMALL LETTER V
      A6 |  00000077 | LATIN SMALL LETTER W
      A7 |  00000078 | LATIN SMALL LETTER X
      A8 |  00000079 | LATIN SMALL LETTER Y
      A9 |  0000007A | LATIN SMALL LETTER Z
      AA |  000000A1 | INVERTED EXCLAMATION MARK
      AB |  000000BF | INVERTED QUESTION MARK
      AC |  000000D0 | LATIN CAPITAL LETTER ETH (Icelandic)
      AD |  0000005B | LEFT SQUARE BRACKET
      AE |  000000DE | LATIN CAPITAL LETTER THORN (Icelandic)
      AF |  000000AE | REGISTERED SIGN
      B0 |  000000AC | NOT SIGN
      B1 |  000000A3 | POUND SIGN
      B2 |  000000A5 | YEN SIGN
      B3 |  000000B7 | MIDDLE DOT
      B4 |  000000A9 | COPYRIGHT SIGN
      B5 |  000000A7 | SECTION SIGN
      B6 |  000000B6 | PILCROW SIGN
      B7 |  000000BC | VULGAR FRACTION ONE QUARTER
      B8 |  000000BD | VULGAR FRACTION ONE HALF
      B9 |  000000BE | VULGAR FRACTION THREE QUARTERS
      BA |  000000DD | LATIN CAPITAL LETTER Y WITH ACUTE
      BB |  000000A8 | DIAERESIS
      BC |  000000AF | MACRON
      BD |  0000005D | RIGHT SQUARE BRACKET
      BE |  000000B4 | ACUTE ACCENT
      BF |  000000D7 | MULTIPLICATION SIGN
      C0 |  0000007B | LEFT CURLY BRACKET
      C1 |  00000041 | LATIN CAPITAL LETTER A
      C2 |  00000042 | LATIN CAPITAL LETTER B
      C3 |  00000043 | LATIN CAPITAL LETTER C
      C4 |  00000044 | LATIN CAPITAL LETTER D
      C5 |  00000045 | LATIN CAPITAL LETTER E
      C6 |  00000046 | LATIN CAPITAL LETTER F
      C7 |  00000047 | LATIN CAPITAL LETTER G
      C8 |  00000048 | LATIN CAPITAL LETTER H
      C9 |  00000049 | LATIN CAPITAL LETTER I
      CA |  000000AD | SOFT HYPHEN
      CB |  000000F4 | LATIN SMALL LETTER O WITH CIRCUMFLEX
      CC |  000000F6 | LATIN SMALL LETTER O WITH DIAERESIS
      CD |  000000F2 | LATIN SMALL LETTER O WITH GRAVE
      CE |  000000F3 | LATIN SMALL LETTER O WITH ACUTE
      CF |  000000F5 | LATIN SMALL LETTER O WITH TILDE
      D0 |  0000007D | RIGHT CURLY BRACKET
      D1 |  0000004A | LATIN CAPITAL LETTER J
      D2 |  0000004B | LATIN CAPITAL LETTER K
      D3 |  0000004C | LATIN CAPITAL LETTER L
      D4 |  0000004D | LATIN CAPITAL LETTER M
      D5 |  0000004E | LATIN CAPITAL LETTER N
      D6 |  0000004F | LATIN CAPITAL LETTER O
      D7 |  00000050 | LATIN CAPITAL LETTER P
      D8 |  00000051 | LATIN CAPITAL LETTER Q
      D9 |  00000052 | LATIN CAPITAL LETTER R
      DA |  000000B9 | SUPERSCRIPT ONE
      DB |  000000FB | LATIN SMALL LETTER U WITH CIRCUMFLEX
      DC |  000000FC | LATIN SMALL LETTER U WITH DIAERESIS
      DD |  000000F9 | LATIN SMALL LETTER U WITH GRAVE
      DE |  000000FA | LATIN SMALL LETTER U WITH ACUTE
      DF |  000000FF | LATIN SMALL LETTER Y WITH DIAERESIS
      E0 |  0000005C | REVERSE SOLIDUS
      E1 |  000000F7 | DIVISION SIGN
      E2 |  00000053 | LATIN CAPITAL LETTER S
      E3 |  00000054 | LATIN CAPITAL LETTER T
      E4 |  00000055 | LATIN CAPITAL LETTER U
      E5 |  00000056 | LATIN CAPITAL LETTER V
      E6 |  00000057 | LATIN CAPITAL LETTER W
      E7 |  00000058 | LATIN CAPITAL LETTER X
      E8 |  00000059 | LATIN CAPITAL LETTER Y
      E9 |  0000005A | LATIN CAPITAL LETTER Z
      EA |  000000B2 | SUPERSCRIPT TWO
      EB |  000000D4 | LATIN CAPITAL LETTER O WITH CIRCUMFLEX
      EC |  000000D6 | LATIN CAPITAL LETTER O WITH DIAERESIS
      ED |  000000D2 | LATIN CAPITAL LETTER O WITH GRAVE
      EE |  000000D3 | LATIN CAPITAL LETTER O WITH ACUTE
      EF |  000000D5 | LATIN CAPITAL LETTER O WITH TILDE
      F0 |  00000030 | DIGIT ZERO
      F1 |  00000031 | DIGIT ONE
      F2 |  00000032 | DIGIT TWO
      F3 |  00000033 | DIGIT THREE
      F4 |  00000034 | DIGIT FOUR
      F5 |  00000035 | DIGIT FIVE
      F6 |  00000036 | DIGIT SIX
      F7 |  00000037 | DIGIT SEVEN
      F8 |  00000038 | DIGIT EIGHT
      F9 |  00000039 | DIGIT NINE
      FA |  000000B3 | SUPERSCRIPT THREE
      FB |  000000DB | LATIN CAPITAL LETTER U WITH CIRCUMFLEX
      FC |  000000DC | LATIN CAPITAL LETTER U WITH DIAERESIS
      FD |  000000D9 | LATIN CAPITAL LETTER U WITH GRAVE
      FE |  000000DA | LATIN CAPITAL LETTER U WITH ACUTE
      FF |  0000009F | APPLICATION PROGRAM COMMAND (APC)
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_IBM1047

    $main::fatpacked{"Locale/RecodeData/IBM256.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_IBM256';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for IBM256.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::IBM256;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x009c,
      0x0009,
      0x0086,
      0x007f,
      0x0097,
      0x008d,
      0x008e,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x009d,
      0x0085,
      0x0008,
      0x0087,
      0x0018,
      0x0019,
      0x0092,
      0x008f,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0080,
      0x0081,
      0x0082,
      0x0083,
      0x0084,
      0x000a,
      0x0017,
      0x001b,
      0x0088,
      0x0089,
      0x008a,
      0x008b,
      0x008c,
      0x0005,
      0x0006,
      0x0007,
      0x0090,
      0x0091,
      0x0016,
      0x0093,
      0x0094,
      0x0095,
      0x0096,
      0x0004,
      0x0098,
      0x0099,
      0x009a,
      0x009b,
      0x0014,
      0x0015,
      0x009e,
      0x001a,
      0x0020,
      0x00a0,
      0x00e2,
      0x00e4,
      0x00e0,
      0x00e1,
      0x00e3,
      0x00e5,
      0x00e7,
      0x00f1,
      0x005b,
      0x002e,
      0x003c,
      0x0028,
      0x002b,
      0x0021,
      0x0026,
      0x00e9,
      0x00ea,
      0x00eb,
      0x00e8,
      0x00ed,
      0x00ee,
      0x00ef,
      0x00ec,
      0x00df,
      0x005d,
      0x0024,
      0x002a,
      0x0029,
      0x003b,
      0x005e,
      0x002d,
      0x002f,
      0x00c2,
      0x00c4,
      0x00c0,
      0x00c1,
      0x00c3,
      0x00c5,
      0x00c7,
      0x00d1,
      0x00a6,
      0x002c,
      0x0025,
      0x005f,
      0x003e,
      0x003f,
      0x00f8,
      0x00c9,
      0x00ca,
      0x00cb,
      0x00c8,
      0x00cd,
      0x00ce,
      0x00cf,
      0x00cc,
      0x0060,
      0x003a,
      0x0023,
      0x0040,
      0x0027,
      0x003d,
      0x0022,
      0x00d8,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x00ab,
      0x00bb,
      0x00f0,
      0x00fd,
      0x00fe,
      0x00b1,
      0x00b0,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x00aa,
      0x00ba,
      0x00e6,
      0x00b8,
      0x00c6,
      0x00a4,
      0x00b5,
      0x007e,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x00a1,
      0x00bf,
      0x00d0,
      0x00dd,
      0x00de,
      0x00ae,
      0x00a2,
      0x00a3,
      0x00a5,
      0x20a7,
      0x0192,
      0x00a7,
      0x00b6,
      0x00bc,
      0x00bd,
      0x00be,
      0x00ac,
      0x007c,
      0x203e,
      0x00a8,
      0x00b4,
      0x2017,
      0x007b,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x00ad,
      0x00f4,
      0x00f6,
      0x00f2,
      0x00f3,
      0x00f5,
      0x007d,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x00b9,
      0x00fb,
      0x00fc,
      0x00f9,
      0x00fa,
      0x00ff,
      0x005c,
      0x2003,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x00b2,
      0x00d4,
      0x00d6,
      0x00d2,
      0x00d3,
      0x00d5,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x00b3,
      0x00db,
      0x00dc,
      0x00d9,
      0x00da,
      0x009f,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\xc2\x9c",
      "\x09",
      "\xc2\x86",
      "\x7f",
      "\xc2\x97",
      "\xc2\x8d",
      "\xc2\x8e",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\xc2\x9d",
      "\xc2\x85",
      "\x08",
      "\xc2\x87",
      "\x18",
      "\x19",
      "\xc2\x92",
      "\xc2\x8f",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\xc2\x80",
      "\xc2\x81",
      "\xc2\x82",
      "\xc2\x83",
      "\xc2\x84",
      "\x0a",
      "\x17",
      "\x1b",
      "\xc2\x88",
      "\xc2\x89",
      "\xc2\x8a",
      "\xc2\x8b",
      "\xc2\x8c",
      "\x05",
      "\x06",
      "\x07",
      "\xc2\x90",
      "\xc2\x91",
      "\x16",
      "\xc2\x93",
      "\xc2\x94",
      "\xc2\x95",
      "\xc2\x96",
      "\x04",
      "\xc2\x98",
      "\xc2\x99",
      "\xc2\x9a",
      "\xc2\x9b",
      "\x14",
      "\x15",
      "\xc2\x9e",
      "\x1a",
      "\x20",
      "\xc2\xa0",
      "\xc3\xa2",
      "\xc3\xa4",
      "\xc3\xa0",
      "\xc3\xa1",
      "\xc3\xa3",
      "\xc3\xa5",
      "\xc3\xa7",
      "\xc3\xb1",
      "\x5b",
      "\x2e",
      "\x3c",
      "\x28",
      "\x2b",
      "\x21",
      "\x26",
      "\xc3\xa9",
      "\xc3\xaa",
      "\xc3\xab",
      "\xc3\xa8",
      "\xc3\xad",
      "\xc3\xae",
      "\xc3\xaf",
      "\xc3\xac",
      "\xc3\x9f",
      "\x5d",
      "\x24",
      "\x2a",
      "\x29",
      "\x3b",
      "\x5e",
      "\x2d",
      "\x2f",
      "\xc3\x82",
      "\xc3\x84",
      "\xc3\x80",
      "\xc3\x81",
      "\xc3\x83",
      "\xc3\x85",
      "\xc3\x87",
      "\xc3\x91",
      "\xc2\xa6",
      "\x2c",
      "\x25",
      "\x5f",
      "\x3e",
      "\x3f",
      "\xc3\xb8",
      "\xc3\x89",
      "\xc3\x8a",
      "\xc3\x8b",
      "\xc3\x88",
      "\xc3\x8d",
      "\xc3\x8e",
      "\xc3\x8f",
      "\xc3\x8c",
      "\x60",
      "\x3a",
      "\x23",
      "\x40",
      "\x27",
      "\x3d",
      "\x22",
      "\xc3\x98",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\xc2\xab",
      "\xc2\xbb",
      "\xc3\xb0",
      "\xc3\xbd",
      "\xc3\xbe",
      "\xc2\xb1",
      "\xc2\xb0",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\xc2\xaa",
      "\xc2\xba",
      "\xc3\xa6",
      "\xc2\xb8",
      "\xc3\x86",
      "\xc2\xa4",
      "\xc2\xb5",
      "\x7e",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\xc2\xa1",
      "\xc2\xbf",
      "\xc3\x90",
      "\xc3\x9d",
      "\xc3\x9e",
      "\xc2\xae",
      "\xc2\xa2",
      "\xc2\xa3",
      "\xc2\xa5",
      "\xe2\x82\xa7",
      "\xc6\x92",
      "\xc2\xa7",
      "\xc2\xb6",
      "\xc2\xbc",
      "\xc2\xbd",
      "\xc2\xbe",
      "\xc2\xac",
      "\x7c",
      "\xe2\x80\xbe",
      "\xc2\xa8",
      "\xc2\xb4",
      "\xe2\x80\x97",
      "\x7b",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\xc2\xad",
      "\xc3\xb4",
      "\xc3\xb6",
      "\xc3\xb2",
      "\xc3\xb3",
      "\xc3\xb5",
      "\x7d",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\xc2\xb9",
      "\xc3\xbb",
      "\xc3\xbc",
      "\xc3\xb9",
      "\xc3\xba",
      "\xc3\xbf",
      "\x5c",
      "\xe2\x80\x83",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\xc2\xb2",
      "\xc3\x94",
      "\xc3\x96",
      "\xc3\x92",
      "\xc3\x93",
      "\xc3\x95",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\xc2\xb3",
      "\xc3\x9b",
      "\xc3\x9c",
      "\xc3\x99",
      "\xc3\x9a",
      "\xc2\x9f",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x37",
      0x00000005 => "\x2d",
      0x00000006 => "\x2e",
      0x00000007 => "\x2f",
      0x00000008 => "\x16",
      0x00000009 => "\x05",
      0x0000000a => "\x25",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x3c",
      0x00000015 => "\x3d",
      0x00000016 => "\x32",
      0x00000017 => "\x26",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x3f",
      0x0000001b => "\x27",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x40",
      0x00000021 => "\x4f",
      0x00000022 => "\x7f",
      0x00000023 => "\x7b",
      0x00000024 => "\x5b",
      0x00000025 => "\x6c",
      0x00000026 => "\x50",
      0x00000027 => "\x7d",
      0x00000028 => "\x4d",
      0x00000029 => "\x5d",
      0x0000002a => "\x5c",
      0x0000002b => "\x4e",
      0x0000002c => "\x6b",
      0x0000002d => "\x60",
      0x0000002e => "\x4b",
      0x0000002f => "\x61",
      0x00000030 => "\xf0",
      0x00000031 => "\xf1",
      0x00000032 => "\xf2",
      0x00000033 => "\xf3",
      0x00000034 => "\xf4",
      0x00000035 => "\xf5",
      0x00000036 => "\xf6",
      0x00000037 => "\xf7",
      0x00000038 => "\xf8",
      0x00000039 => "\xf9",
      0x0000003a => "\x7a",
      0x0000003b => "\x5e",
      0x0000003c => "\x4c",
      0x0000003d => "\x7e",
      0x0000003e => "\x6e",
      0x0000003f => "\x6f",
      0x00000040 => "\x7c",
      0x00000041 => "\xc1",
      0x00000042 => "\xc2",
      0x00000043 => "\xc3",
      0x00000044 => "\xc4",
      0x00000045 => "\xc5",
      0x00000046 => "\xc6",
      0x00000047 => "\xc7",
      0x00000048 => "\xc8",
      0x00000049 => "\xc9",
      0x0000004a => "\xd1",
      0x0000004b => "\xd2",
      0x0000004c => "\xd3",
      0x0000004d => "\xd4",
      0x0000004e => "\xd5",
      0x0000004f => "\xd6",
      0x00000050 => "\xd7",
      0x00000051 => "\xd8",
      0x00000052 => "\xd9",
      0x00000053 => "\xe2",
      0x00000054 => "\xe3",
      0x00000055 => "\xe4",
      0x00000056 => "\xe5",
      0x00000057 => "\xe6",
      0x00000058 => "\xe7",
      0x00000059 => "\xe8",
      0x0000005a => "\xe9",
      0x0000005b => "\x4a",
      0x0000005c => "\xe0",
      0x0000005d => "\x5a",
      0x0000005e => "\x5f",
      0x0000005f => "\x6d",
      0x00000060 => "\x79",
      0x00000061 => "\x81",
      0x00000062 => "\x82",
      0x00000063 => "\x83",
      0x00000064 => "\x84",
      0x00000065 => "\x85",
      0x00000066 => "\x86",
      0x00000067 => "\x87",
      0x00000068 => "\x88",
      0x00000069 => "\x89",
      0x0000006a => "\x91",
      0x0000006b => "\x92",
      0x0000006c => "\x93",
      0x0000006d => "\x94",
      0x0000006e => "\x95",
      0x0000006f => "\x96",
      0x00000070 => "\x97",
      0x00000071 => "\x98",
      0x00000072 => "\x99",
      0x00000073 => "\xa2",
      0x00000074 => "\xa3",
      0x00000075 => "\xa4",
      0x00000076 => "\xa5",
      0x00000077 => "\xa6",
      0x00000078 => "\xa7",
      0x00000079 => "\xa8",
      0x0000007a => "\xa9",
      0x0000007b => "\xc0",
      0x0000007c => "\xbb",
      0x0000007d => "\xd0",
      0x0000007e => "\xa1",
      0x0000007f => "\x07",
      0x00000080 => "\x20",
      0x00000081 => "\x21",
      0x00000082 => "\x22",
      0x00000083 => "\x23",
      0x00000084 => "\x24",
      0x00000085 => "\x15",
      0x00000086 => "\x06",
      0x00000087 => "\x17",
      0x00000088 => "\x28",
      0x00000089 => "\x29",
      0x0000008a => "\x2a",
      0x0000008b => "\x2b",
      0x0000008c => "\x2c",
      0x0000008d => "\x09",
      0x0000008e => "\x0a",
      0x0000008f => "\x1b",
      0x00000090 => "\x30",
      0x00000091 => "\x31",
      0x00000092 => "\x1a",
      0x00000093 => "\x33",
      0x00000094 => "\x34",
      0x00000095 => "\x35",
      0x00000096 => "\x36",
      0x00000097 => "\x08",
      0x00000098 => "\x38",
      0x00000099 => "\x39",
      0x0000009a => "\x3a",
      0x0000009b => "\x3b",
      0x0000009c => "\x04",
      0x0000009d => "\x14",
      0x0000009e => "\x3e",
      0x0000009f => "\xff",
      0x000000a0 => "\x41",
      0x000000a1 => "\xaa",
      0x000000a2 => "\xb0",
      0x000000a3 => "\xb1",
      0x000000a4 => "\x9f",
      0x000000a5 => "\xb2",
      0x000000a6 => "\x6a",
      0x000000a7 => "\xb5",
      0x000000a8 => "\xbd",
      0x000000aa => "\x9a",
      0x000000ab => "\x8a",
      0x000000ac => "\xba",
      0x000000ad => "\xca",
      0x000000ae => "\xaf",
      0x000000b0 => "\x90",
      0x000000b1 => "\x8f",
      0x000000b2 => "\xea",
      0x000000b3 => "\xfa",
      0x000000b4 => "\xbe",
      0x000000b5 => "\xa0",
      0x000000b6 => "\xb6",
      0x000000b8 => "\x9d",
      0x000000b9 => "\xda",
      0x000000ba => "\x9b",
      0x000000bb => "\x8b",
      0x000000bc => "\xb7",
      0x000000bd => "\xb8",
      0x000000be => "\xb9",
      0x000000bf => "\xab",
      0x000000c0 => "\x64",
      0x000000c1 => "\x65",
      0x000000c2 => "\x62",
      0x000000c3 => "\x66",
      0x000000c4 => "\x63",
      0x000000c5 => "\x67",
      0x000000c6 => "\x9e",
      0x000000c7 => "\x68",
      0x000000c8 => "\x74",
      0x000000c9 => "\x71",
      0x000000ca => "\x72",
      0x000000cb => "\x73",
      0x000000cc => "\x78",
      0x000000cd => "\x75",
      0x000000ce => "\x76",
      0x000000cf => "\x77",
      0x000000d0 => "\xac",
      0x000000d1 => "\x69",
      0x000000d2 => "\xed",
      0x000000d3 => "\xee",
      0x000000d4 => "\xeb",
      0x000000d5 => "\xef",
      0x000000d6 => "\xec",
      0x000000d8 => "\x80",
      0x000000d9 => "\xfd",
      0x000000da => "\xfe",
      0x000000db => "\xfb",
      0x000000dc => "\xfc",
      0x000000dd => "\xad",
      0x000000de => "\xae",
      0x000000df => "\x59",
      0x000000e0 => "\x44",
      0x000000e1 => "\x45",
      0x000000e2 => "\x42",
      0x000000e3 => "\x46",
      0x000000e4 => "\x43",
      0x000000e5 => "\x47",
      0x000000e6 => "\x9c",
      0x000000e7 => "\x48",
      0x000000e8 => "\x54",
      0x000000e9 => "\x51",
      0x000000ea => "\x52",
      0x000000eb => "\x53",
      0x000000ec => "\x58",
      0x000000ed => "\x55",
      0x000000ee => "\x56",
      0x000000ef => "\x57",
      0x000000f0 => "\x8c",
      0x000000f1 => "\x49",
      0x000000f2 => "\xcd",
      0x000000f3 => "\xce",
      0x000000f4 => "\xcb",
      0x000000f5 => "\xcf",
      0x000000f6 => "\xcc",
      0x000000f8 => "\x70",
      0x000000f9 => "\xdd",
      0x000000fa => "\xde",
      0x000000fb => "\xdb",
      0x000000fc => "\xdc",
      0x000000fd => "\x8d",
      0x000000fe => "\x8e",
      0x000000ff => "\xdf",
      0x00000192 => "\xb4",
      0x00002003 => "\xe1",
      0x00002017 => "\xbf",
      0x0000203e => "\xbc",
      0x000020a7 => "\xb3",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x6f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::IBM256 - Conversion routines for IBM256
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for IBM256.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: IBM Registry C-H 3-3220-050
   alias EBCDIC-INT1
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  0000009C | STRING TERMINATOR (ST)
      05 |  00000009 | CHARACTER TABULATION (HT)
      06 |  00000086 | START OF SELECTED AREA (SSA)
      07 |  0000007F | DELETE (DEL)
      08 |  00000097 | END OF GUARDED AREA (EPA)
      09 |  0000008D | REVERSE LINE FEED (RI)
      0A |  0000008E | SINGLE-SHIFT TWO (SS2)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  0000009D | OPERATING SYSTEM COMMAND (OSC)
      15 |  00000085 | NEXT LINE (NEL)
      16 |  00000008 | BACKSPACE (BS)
      17 |  00000087 | END OF SELECTED AREA (ESA)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  00000092 | PRIVATE USE TWO (PU2)
      1B |  0000008F | SINGLE-SHIFT THREE (SS3)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000080 | PADDING CHARACTER (PAD)
      21 |  00000081 | HIGH OCTET PRESET (HOP)
      22 |  00000082 | BREAK PERMITTED HERE (BPH)
      23 |  00000083 | NO BREAK HERE (NBH)
      24 |  00000084 | INDEX (IND)
      25 |  0000000A | LINE FEED (LF)
      26 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      27 |  0000001B | ESCAPE (ESC)
      28 |  00000088 | CHARACTER TABULATION SET (HTS)
      29 |  00000089 | CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
      2A |  0000008A | LINE TABULATION SET (VTS)
      2B |  0000008B | PARTIAL LINE FORWARD (PLD)
      2C |  0000008C | PARTIAL LINE BACKWARD (PLU)
      2D |  00000005 | ENQUIRY (ENQ)
      2E |  00000006 | ACKNOWLEDGE (ACK)
      2F |  00000007 | BELL (BEL)
      30 |  00000090 | DEVICE CONTROL STRING (DCS)
      31 |  00000091 | PRIVATE USE ONE (PU1)
      32 |  00000016 | SYNCHRONOUS IDLE (SYN)
      33 |  00000093 | SET TRANSMIT STATE (STS)
      34 |  00000094 | CANCEL CHARACTER (CCH)
      35 |  00000095 | MESSAGE WAITING (MW)
      36 |  00000096 | START OF GUARDED AREA (SPA)
      37 |  00000004 | END OF TRANSMISSION (EOT)
      38 |  00000098 | START OF STRING (SOS)
      39 |  00000099 | SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
      3A |  0000009A | SINGLE CHARACTER INTRODUCER (SCI)
      3B |  0000009B | CONTROL SEQUENCE INTRODUCER (CSI)
      3C |  00000014 | DEVICE CONTROL FOUR (DC4)
      3D |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      3E |  0000009E | PRIVACY MESSAGE (PM)
      3F |  0000001A | SUBSTITUTE (SUB)
      40 |  00000020 | SPACE
      41 |  000000A0 | NO-BREAK SPACE
      42 |  000000E2 | LATIN SMALL LETTER A WITH CIRCUMFLEX
      43 |  000000E4 | LATIN SMALL LETTER A WITH DIAERESIS
      44 |  000000E0 | LATIN SMALL LETTER A WITH GRAVE
      45 |  000000E1 | LATIN SMALL LETTER A WITH ACUTE
      46 |  000000E3 | LATIN SMALL LETTER A WITH TILDE
      47 |  000000E5 | LATIN SMALL LETTER A WITH RING ABOVE
      48 |  000000E7 | LATIN SMALL LETTER C WITH CEDILLA
      49 |  000000F1 | LATIN SMALL LETTER N WITH TILDE
      4A |  0000005B | LEFT SQUARE BRACKET
      4B |  0000002E | FULL STOP
      4C |  0000003C | LESS-THAN SIGN
      4D |  00000028 | LEFT PARENTHESIS
      4E |  0000002B | PLUS SIGN
      4F |  00000021 | EXCLAMATION MARK
      50 |  00000026 | AMPERSAND
      51 |  000000E9 | LATIN SMALL LETTER E WITH ACUTE
      52 |  000000EA | LATIN SMALL LETTER E WITH CIRCUMFLEX
      53 |  000000EB | LATIN SMALL LETTER E WITH DIAERESIS
      54 |  000000E8 | LATIN SMALL LETTER E WITH GRAVE
      55 |  000000ED | LATIN SMALL LETTER I WITH ACUTE
      56 |  000000EE | LATIN SMALL LETTER I WITH CIRCUMFLEX
      57 |  000000EF | LATIN SMALL LETTER I WITH DIAERESIS
      58 |  000000EC | LATIN SMALL LETTER I WITH GRAVE
      59 |  000000DF | LATIN SMALL LETTER SHARP S (German)
      5A |  0000005D | RIGHT SQUARE BRACKET
      5B |  00000024 | DOLLAR SIGN
      5C |  0000002A | ASTERISK
      5D |  00000029 | RIGHT PARENTHESIS
      5E |  0000003B | SEMICOLON
      5F |  0000005E | CIRCUMFLEX ACCENT
      60 |  0000002D | HYPHEN-MINUS
      61 |  0000002F | SOLIDUS
      62 |  000000C2 | LATIN CAPITAL LETTER A WITH CIRCUMFLEX
      63 |  000000C4 | LATIN CAPITAL LETTER A WITH DIAERESIS
      64 |  000000C0 | LATIN CAPITAL LETTER A WITH GRAVE
      65 |  000000C1 | LATIN CAPITAL LETTER A WITH ACUTE
      66 |  000000C3 | LATIN CAPITAL LETTER A WITH TILDE
      67 |  000000C5 | LATIN CAPITAL LETTER A WITH RING ABOVE
      68 |  000000C7 | LATIN CAPITAL LETTER C WITH CEDILLA
      69 |  000000D1 | LATIN CAPITAL LETTER N WITH TILDE
      6A |  000000A6 | BROKEN BAR
      6B |  0000002C | COMMA
      6C |  00000025 | PERCENT SIGN
      6D |  0000005F | LOW LINE
      6E |  0000003E | GREATER-THAN SIGN
      6F |  0000003F | QUESTION MARK
      70 |  000000F8 | LATIN SMALL LETTER O WITH STROKE
      71 |  000000C9 | LATIN CAPITAL LETTER E WITH ACUTE
      72 |  000000CA | LATIN CAPITAL LETTER E WITH CIRCUMFLEX
      73 |  000000CB | LATIN CAPITAL LETTER E WITH DIAERESIS
      74 |  000000C8 | LATIN CAPITAL LETTER E WITH GRAVE
      75 |  000000CD | LATIN CAPITAL LETTER I WITH ACUTE
      76 |  000000CE | LATIN CAPITAL LETTER I WITH CIRCUMFLEX
      77 |  000000CF | LATIN CAPITAL LETTER I WITH DIAERESIS
      78 |  000000CC | LATIN CAPITAL LETTER I WITH GRAVE
      79 |  00000060 | GRAVE ACCENT
      7A |  0000003A | COLON
      7B |  00000023 | NUMBER SIGN
      7C |  00000040 | COMMERCIAL AT
      7D |  00000027 | APOSTROPHE
      7E |  0000003D | EQUALS SIGN
      7F |  00000022 | QUOTATION MARK
      80 |  000000D8 | LATIN CAPITAL LETTER O WITH STROKE
      81 |  00000061 | LATIN SMALL LETTER A
      82 |  00000062 | LATIN SMALL LETTER B
      83 |  00000063 | LATIN SMALL LETTER C
      84 |  00000064 | LATIN SMALL LETTER D
      85 |  00000065 | LATIN SMALL LETTER E
      86 |  00000066 | LATIN SMALL LETTER F
      87 |  00000067 | LATIN SMALL LETTER G
      88 |  00000068 | LATIN SMALL LETTER H
      89 |  00000069 | LATIN SMALL LETTER I
      8A |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
      8B |  000000BB | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
      8C |  000000F0 | LATIN SMALL LETTER ETH (Icelandic)
      8D |  000000FD | LATIN SMALL LETTER Y WITH ACUTE
      8E |  000000FE | LATIN SMALL LETTER THORN (Icelandic)
      8F |  000000B1 | PLUS-MINUS SIGN
      90 |  000000B0 | DEGREE SIGN
      91 |  0000006A | LATIN SMALL LETTER J
      92 |  0000006B | LATIN SMALL LETTER K
      93 |  0000006C | LATIN SMALL LETTER L
      94 |  0000006D | LATIN SMALL LETTER M
      95 |  0000006E | LATIN SMALL LETTER N
      96 |  0000006F | LATIN SMALL LETTER O
      97 |  00000070 | LATIN SMALL LETTER P
      98 |  00000071 | LATIN SMALL LETTER Q
      99 |  00000072 | LATIN SMALL LETTER R
      9A |  000000AA | FEMININE ORDINAL INDICATOR
      9B |  000000BA | MASCULINE ORDINAL INDICATOR
      9C |  000000E6 | LATIN SMALL LETTER AE
      9D |  000000B8 | CEDILLA
      9E |  000000C6 | LATIN CAPITAL LETTER AE
      9F |  000000A4 | CURRENCY SIGN
      A0 |  000000B5 | MICRO SIGN
      A1 |  0000007E | TILDE
      A2 |  00000073 | LATIN SMALL LETTER S
      A3 |  00000074 | LATIN SMALL LETTER T
      A4 |  00000075 | LATIN SMALL LETTER U
      A5 |  00000076 | LATIN SMALL LETTER V
      A6 |  00000077 | LATIN SMALL LETTER W
      A7 |  00000078 | LATIN SMALL LETTER X
      A8 |  00000079 | LATIN SMALL LETTER Y
      A9 |  0000007A | LATIN SMALL LETTER Z
      AA |  000000A1 | INVERTED EXCLAMATION MARK
      AB |  000000BF | INVERTED QUESTION MARK
      AC |  000000D0 | LATIN CAPITAL LETTER ETH (Icelandic)
      AD |  000000DD | LATIN CAPITAL LETTER Y WITH ACUTE
      AE |  000000DE | LATIN CAPITAL LETTER THORN (Icelandic)
      AF |  000000AE | REGISTERED SIGN
      B0 |  000000A2 | CENT SIGN
      B1 |  000000A3 | POUND SIGN
      B2 |  000000A5 | YEN SIGN
      B3 |  000020A7 | PESETA SIGN
      B4 |  00000192 | LATIN SMALL LETTER F WITH HOOK
      B5 |  000000A7 | SECTION SIGN
      B6 |  000000B6 | PILCROW SIGN
      B7 |  000000BC | VULGAR FRACTION ONE QUARTER
      B8 |  000000BD | VULGAR FRACTION ONE HALF
      B9 |  000000BE | VULGAR FRACTION THREE QUARTERS
      BA |  000000AC | NOT SIGN
      BB |  0000007C | VERTICAL LINE
      BC |  0000203E | OVERLINE
      BD |  000000A8 | DIAERESIS
      BE |  000000B4 | ACUTE ACCENT
      BF |  00002017 | DOUBLE LOW LINE
      C0 |  0000007B | LEFT CURLY BRACKET
      C1 |  00000041 | LATIN CAPITAL LETTER A
      C2 |  00000042 | LATIN CAPITAL LETTER B
      C3 |  00000043 | LATIN CAPITAL LETTER C
      C4 |  00000044 | LATIN CAPITAL LETTER D
      C5 |  00000045 | LATIN CAPITAL LETTER E
      C6 |  00000046 | LATIN CAPITAL LETTER F
      C7 |  00000047 | LATIN CAPITAL LETTER G
      C8 |  00000048 | LATIN CAPITAL LETTER H
      C9 |  00000049 | LATIN CAPITAL LETTER I
      CA |  000000AD | SOFT HYPHEN
      CB |  000000F4 | LATIN SMALL LETTER O WITH CIRCUMFLEX
      CC |  000000F6 | LATIN SMALL LETTER O WITH DIAERESIS
      CD |  000000F2 | LATIN SMALL LETTER O WITH GRAVE
      CE |  000000F3 | LATIN SMALL LETTER O WITH ACUTE
      CF |  000000F5 | LATIN SMALL LETTER O WITH TILDE
      D0 |  0000007D | RIGHT CURLY BRACKET
      D1 |  0000004A | LATIN CAPITAL LETTER J
      D2 |  0000004B | LATIN CAPITAL LETTER K
      D3 |  0000004C | LATIN CAPITAL LETTER L
      D4 |  0000004D | LATIN CAPITAL LETTER M
      D5 |  0000004E | LATIN CAPITAL LETTER N
      D6 |  0000004F | LATIN CAPITAL LETTER O
      D7 |  00000050 | LATIN CAPITAL LETTER P
      D8 |  00000051 | LATIN CAPITAL LETTER Q
      D9 |  00000052 | LATIN CAPITAL LETTER R
      DA |  000000B9 | SUPERSCRIPT ONE
      DB |  000000FB | LATIN SMALL LETTER U WITH CIRCUMFLEX
      DC |  000000FC | LATIN SMALL LETTER U WITH DIAERESIS
      DD |  000000F9 | LATIN SMALL LETTER U WITH GRAVE
      DE |  000000FA | LATIN SMALL LETTER U WITH ACUTE
      DF |  000000FF | LATIN SMALL LETTER Y WITH DIAERESIS
      E0 |  0000005C | REVERSE SOLIDUS
      E1 |  00002003 | EM SPACE
      E2 |  00000053 | LATIN CAPITAL LETTER S
      E3 |  00000054 | LATIN CAPITAL LETTER T
      E4 |  00000055 | LATIN CAPITAL LETTER U
      E5 |  00000056 | LATIN CAPITAL LETTER V
      E6 |  00000057 | LATIN CAPITAL LETTER W
      E7 |  00000058 | LATIN CAPITAL LETTER X
      E8 |  00000059 | LATIN CAPITAL LETTER Y
      E9 |  0000005A | LATIN CAPITAL LETTER Z
      EA |  000000B2 | SUPERSCRIPT TWO
      EB |  000000D4 | LATIN CAPITAL LETTER O WITH CIRCUMFLEX
      EC |  000000D6 | LATIN CAPITAL LETTER O WITH DIAERESIS
      ED |  000000D2 | LATIN CAPITAL LETTER O WITH GRAVE
      EE |  000000D3 | LATIN CAPITAL LETTER O WITH ACUTE
      EF |  000000D5 | LATIN CAPITAL LETTER O WITH TILDE
      F0 |  00000030 | DIGIT ZERO
      F1 |  00000031 | DIGIT ONE
      F2 |  00000032 | DIGIT TWO
      F3 |  00000033 | DIGIT THREE
      F4 |  00000034 | DIGIT FOUR
      F5 |  00000035 | DIGIT FIVE
      F6 |  00000036 | DIGIT SIX
      F7 |  00000037 | DIGIT SEVEN
      F8 |  00000038 | DIGIT EIGHT
      F9 |  00000039 | DIGIT NINE
      FA |  000000B3 | SUPERSCRIPT THREE
      FB |  000000DB | LATIN CAPITAL LETTER U WITH CIRCUMFLEX
      FC |  000000DC | LATIN CAPITAL LETTER U WITH DIAERESIS
      FD |  000000D9 | LATIN CAPITAL LETTER U WITH GRAVE
      FE |  000000DA | LATIN CAPITAL LETTER U WITH ACUTE
      FF |  0000009F | APPLICATION PROGRAM COMMAND (APC)
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_IBM256

    $main::fatpacked{"Locale/RecodeData/IBM273.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_IBM273';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for IBM273.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::IBM273;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x009c,
      0x0009,
      0x0086,
      0x007f,
      0x0097,
      0x008d,
      0x008e,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x009d,
      0x0085,
      0x0008,
      0x0087,
      0x0018,
      0x0019,
      0x0092,
      0x008f,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0080,
      0x0081,
      0x0082,
      0x0083,
      0x0084,
      0x000a,
      0x0017,
      0x001b,
      0x0088,
      0x0089,
      0x008a,
      0x008b,
      0x008c,
      0x0005,
      0x0006,
      0x0007,
      0x0090,
      0x0091,
      0x0016,
      0x0093,
      0x0094,
      0x0095,
      0x0096,
      0x0004,
      0x0098,
      0x0099,
      0x009a,
      0x009b,
      0x0014,
      0x0015,
      0x009e,
      0x001a,
      0x0020,
      0x00a0,
      0x00e2,
      0x007b,
      0x00e0,
      0x00e1,
      0x00e3,
      0x00e5,
      0x00e7,
      0x00f1,
      0x00c4,
      0x002e,
      0x003c,
      0x0028,
      0x002b,
      0x0021,
      0x0026,
      0x00e9,
      0x00ea,
      0x00eb,
      0x00e8,
      0x00ed,
      0x00ee,
      0x00ef,
      0x00ec,
      0x007e,
      0x00dc,
      0x0024,
      0x002a,
      0x0029,
      0x003b,
      0x005e,
      0x002d,
      0x002f,
      0x00c2,
      0x005b,
      0x00c0,
      0x00c1,
      0x00c3,
      0x00c5,
      0x00c7,
      0x00d1,
      0x00f6,
      0x002c,
      0x0025,
      0x005f,
      0x003e,
      0x003f,
      0x00f8,
      0x00c9,
      0x00ca,
      0x00cb,
      0x00c8,
      0x00cd,
      0x00ce,
      0x00cf,
      0x00cc,
      0x0060,
      0x003a,
      0x0023,
      0x00a7,
      0x0027,
      0x003d,
      0x0022,
      0x00d8,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x00ab,
      0x00bb,
      0x00f0,
      0x00fd,
      0x00fe,
      0x00b1,
      0x00b0,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x00aa,
      0x00ba,
      0x00e6,
      0x00b8,
      0x00c6,
      0x00a4,
      0x00b5,
      0x00df,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x00a1,
      0x00bf,
      0x00d0,
      0x00dd,
      0x00de,
      0x00ae,
      0x00a2,
      0x00a3,
      0x00a5,
      0x00b7,
      0x00a9,
      0x0040,
      0x00b6,
      0x00bc,
      0x00bd,
      0x00be,
      0x00ac,
      0x007c,
      0x203e,
      0x00a8,
      0x00b4,
      0x00d7,
      0x00e4,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x00ad,
      0x00f4,
      0x00a6,
      0x00f2,
      0x00f3,
      0x00f5,
      0x00fc,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x00b9,
      0x00fb,
      0x007d,
      0x00f9,
      0x00fa,
      0x00ff,
      0x00d6,
      0x00f7,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x00b2,
      0x00d4,
      0x005c,
      0x00d2,
      0x00d3,
      0x00d5,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x00b3,
      0x00db,
      0x005d,
      0x00d9,
      0x00da,
      0x009f,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\xc2\x9c",
      "\x09",
      "\xc2\x86",
      "\x7f",
      "\xc2\x97",
      "\xc2\x8d",
      "\xc2\x8e",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\xc2\x9d",
      "\xc2\x85",
      "\x08",
      "\xc2\x87",
      "\x18",
      "\x19",
      "\xc2\x92",
      "\xc2\x8f",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\xc2\x80",
      "\xc2\x81",
      "\xc2\x82",
      "\xc2\x83",
      "\xc2\x84",
      "\x0a",
      "\x17",
      "\x1b",
      "\xc2\x88",
      "\xc2\x89",
      "\xc2\x8a",
      "\xc2\x8b",
      "\xc2\x8c",
      "\x05",
      "\x06",
      "\x07",
      "\xc2\x90",
      "\xc2\x91",
      "\x16",
      "\xc2\x93",
      "\xc2\x94",
      "\xc2\x95",
      "\xc2\x96",
      "\x04",
      "\xc2\x98",
      "\xc2\x99",
      "\xc2\x9a",
      "\xc2\x9b",
      "\x14",
      "\x15",
      "\xc2\x9e",
      "\x1a",
      "\x20",
      "\xc2\xa0",
      "\xc3\xa2",
      "\x7b",
      "\xc3\xa0",
      "\xc3\xa1",
      "\xc3\xa3",
      "\xc3\xa5",
      "\xc3\xa7",
      "\xc3\xb1",
      "\xc3\x84",
      "\x2e",
      "\x3c",
      "\x28",
      "\x2b",
      "\x21",
      "\x26",
      "\xc3\xa9",
      "\xc3\xaa",
      "\xc3\xab",
      "\xc3\xa8",
      "\xc3\xad",
      "\xc3\xae",
      "\xc3\xaf",
      "\xc3\xac",
      "\x7e",
      "\xc3\x9c",
      "\x24",
      "\x2a",
      "\x29",
      "\x3b",
      "\x5e",
      "\x2d",
      "\x2f",
      "\xc3\x82",
      "\x5b",
      "\xc3\x80",
      "\xc3\x81",
      "\xc3\x83",
      "\xc3\x85",
      "\xc3\x87",
      "\xc3\x91",
      "\xc3\xb6",
      "\x2c",
      "\x25",
      "\x5f",
      "\x3e",
      "\x3f",
      "\xc3\xb8",
      "\xc3\x89",
      "\xc3\x8a",
      "\xc3\x8b",
      "\xc3\x88",
      "\xc3\x8d",
      "\xc3\x8e",
      "\xc3\x8f",
      "\xc3\x8c",
      "\x60",
      "\x3a",
      "\x23",
      "\xc2\xa7",
      "\x27",
      "\x3d",
      "\x22",
      "\xc3\x98",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\xc2\xab",
      "\xc2\xbb",
      "\xc3\xb0",
      "\xc3\xbd",
      "\xc3\xbe",
      "\xc2\xb1",
      "\xc2\xb0",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\xc2\xaa",
      "\xc2\xba",
      "\xc3\xa6",
      "\xc2\xb8",
      "\xc3\x86",
      "\xc2\xa4",
      "\xc2\xb5",
      "\xc3\x9f",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\xc2\xa1",
      "\xc2\xbf",
      "\xc3\x90",
      "\xc3\x9d",
      "\xc3\x9e",
      "\xc2\xae",
      "\xc2\xa2",
      "\xc2\xa3",
      "\xc2\xa5",
      "\xc2\xb7",
      "\xc2\xa9",
      "\x40",
      "\xc2\xb6",
      "\xc2\xbc",
      "\xc2\xbd",
      "\xc2\xbe",
      "\xc2\xac",
      "\x7c",
      "\xe2\x80\xbe",
      "\xc2\xa8",
      "\xc2\xb4",
      "\xc3\x97",
      "\xc3\xa4",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\xc2\xad",
      "\xc3\xb4",
      "\xc2\xa6",
      "\xc3\xb2",
      "\xc3\xb3",
      "\xc3\xb5",
      "\xc3\xbc",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\xc2\xb9",
      "\xc3\xbb",
      "\x7d",
      "\xc3\xb9",
      "\xc3\xba",
      "\xc3\xbf",
      "\xc3\x96",
      "\xc3\xb7",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\xc2\xb2",
      "\xc3\x94",
      "\x5c",
      "\xc3\x92",
      "\xc3\x93",
      "\xc3\x95",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\xc2\xb3",
      "\xc3\x9b",
      "\x5d",
      "\xc3\x99",
      "\xc3\x9a",
      "\xc2\x9f",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x37",
      0x00000005 => "\x2d",
      0x00000006 => "\x2e",
      0x00000007 => "\x2f",
      0x00000008 => "\x16",
      0x00000009 => "\x05",
      0x0000000a => "\x25",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x3c",
      0x00000015 => "\x3d",
      0x00000016 => "\x32",
      0x00000017 => "\x26",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x3f",
      0x0000001b => "\x27",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x40",
      0x00000021 => "\x4f",
      0x00000022 => "\x7f",
      0x00000023 => "\x7b",
      0x00000024 => "\x5b",
      0x00000025 => "\x6c",
      0x00000026 => "\x50",
      0x00000027 => "\x7d",
      0x00000028 => "\x4d",
      0x00000029 => "\x5d",
      0x0000002a => "\x5c",
      0x0000002b => "\x4e",
      0x0000002c => "\x6b",
      0x0000002d => "\x60",
      0x0000002e => "\x4b",
      0x0000002f => "\x61",
      0x00000030 => "\xf0",
      0x00000031 => "\xf1",
      0x00000032 => "\xf2",
      0x00000033 => "\xf3",
      0x00000034 => "\xf4",
      0x00000035 => "\xf5",
      0x00000036 => "\xf6",
      0x00000037 => "\xf7",
      0x00000038 => "\xf8",
      0x00000039 => "\xf9",
      0x0000003a => "\x7a",
      0x0000003b => "\x5e",
      0x0000003c => "\x4c",
      0x0000003d => "\x7e",
      0x0000003e => "\x6e",
      0x0000003f => "\x6f",
      0x00000040 => "\xb5",
      0x00000041 => "\xc1",
      0x00000042 => "\xc2",
      0x00000043 => "\xc3",
      0x00000044 => "\xc4",
      0x00000045 => "\xc5",
      0x00000046 => "\xc6",
      0x00000047 => "\xc7",
      0x00000048 => "\xc8",
      0x00000049 => "\xc9",
      0x0000004a => "\xd1",
      0x0000004b => "\xd2",
      0x0000004c => "\xd3",
      0x0000004d => "\xd4",
      0x0000004e => "\xd5",
      0x0000004f => "\xd6",
      0x00000050 => "\xd7",
      0x00000051 => "\xd8",
      0x00000052 => "\xd9",
      0x00000053 => "\xe2",
      0x00000054 => "\xe3",
      0x00000055 => "\xe4",
      0x00000056 => "\xe5",
      0x00000057 => "\xe6",
      0x00000058 => "\xe7",
      0x00000059 => "\xe8",
      0x0000005a => "\xe9",
      0x0000005b => "\x63",
      0x0000005c => "\xec",
      0x0000005d => "\xfc",
      0x0000005e => "\x5f",
      0x0000005f => "\x6d",
      0x00000060 => "\x79",
      0x00000061 => "\x81",
      0x00000062 => "\x82",
      0x00000063 => "\x83",
      0x00000064 => "\x84",
      0x00000065 => "\x85",
      0x00000066 => "\x86",
      0x00000067 => "\x87",
      0x00000068 => "\x88",
      0x00000069 => "\x89",
      0x0000006a => "\x91",
      0x0000006b => "\x92",
      0x0000006c => "\x93",
      0x0000006d => "\x94",
      0x0000006e => "\x95",
      0x0000006f => "\x96",
      0x00000070 => "\x97",
      0x00000071 => "\x98",
      0x00000072 => "\x99",
      0x00000073 => "\xa2",
      0x00000074 => "\xa3",
      0x00000075 => "\xa4",
      0x00000076 => "\xa5",
      0x00000077 => "\xa6",
      0x00000078 => "\xa7",
      0x00000079 => "\xa8",
      0x0000007a => "\xa9",
      0x0000007b => "\x43",
      0x0000007c => "\xbb",
      0x0000007d => "\xdc",
      0x0000007e => "\x59",
      0x0000007f => "\x07",
      0x00000080 => "\x20",
      0x00000081 => "\x21",
      0x00000082 => "\x22",
      0x00000083 => "\x23",
      0x00000084 => "\x24",
      0x00000085 => "\x15",
      0x00000086 => "\x06",
      0x00000087 => "\x17",
      0x00000088 => "\x28",
      0x00000089 => "\x29",
      0x0000008a => "\x2a",
      0x0000008b => "\x2b",
      0x0000008c => "\x2c",
      0x0000008d => "\x09",
      0x0000008e => "\x0a",
      0x0000008f => "\x1b",
      0x00000090 => "\x30",
      0x00000091 => "\x31",
      0x00000092 => "\x1a",
      0x00000093 => "\x33",
      0x00000094 => "\x34",
      0x00000095 => "\x35",
      0x00000096 => "\x36",
      0x00000097 => "\x08",
      0x00000098 => "\x38",
      0x00000099 => "\x39",
      0x0000009a => "\x3a",
      0x0000009b => "\x3b",
      0x0000009c => "\x04",
      0x0000009d => "\x14",
      0x0000009e => "\x3e",
      0x0000009f => "\xff",
      0x000000a0 => "\x41",
      0x000000a1 => "\xaa",
      0x000000a2 => "\xb0",
      0x000000a3 => "\xb1",
      0x000000a4 => "\x9f",
      0x000000a5 => "\xb2",
      0x000000a6 => "\xcc",
      0x000000a7 => "\x7c",
      0x000000a8 => "\xbd",
      0x000000a9 => "\xb4",
      0x000000aa => "\x9a",
      0x000000ab => "\x8a",
      0x000000ac => "\xba",
      0x000000ad => "\xca",
      0x000000ae => "\xaf",
      0x000000b0 => "\x90",
      0x000000b1 => "\x8f",
      0x000000b2 => "\xea",
      0x000000b3 => "\xfa",
      0x000000b4 => "\xbe",
      0x000000b5 => "\xa0",
      0x000000b6 => "\xb6",
      0x000000b7 => "\xb3",
      0x000000b8 => "\x9d",
      0x000000b9 => "\xda",
      0x000000ba => "\x9b",
      0x000000bb => "\x8b",
      0x000000bc => "\xb7",
      0x000000bd => "\xb8",
      0x000000be => "\xb9",
      0x000000bf => "\xab",
      0x000000c0 => "\x64",
      0x000000c1 => "\x65",
      0x000000c2 => "\x62",
      0x000000c3 => "\x66",
      0x000000c4 => "\x4a",
      0x000000c5 => "\x67",
      0x000000c6 => "\x9e",
      0x000000c7 => "\x68",
      0x000000c8 => "\x74",
      0x000000c9 => "\x71",
      0x000000ca => "\x72",
      0x000000cb => "\x73",
      0x000000cc => "\x78",
      0x000000cd => "\x75",
      0x000000ce => "\x76",
      0x000000cf => "\x77",
      0x000000d0 => "\xac",
      0x000000d1 => "\x69",
      0x000000d2 => "\xed",
      0x000000d3 => "\xee",
      0x000000d4 => "\xeb",
      0x000000d5 => "\xef",
      0x000000d6 => "\xe0",
      0x000000d7 => "\xbf",
      0x000000d8 => "\x80",
      0x000000d9 => "\xfd",
      0x000000da => "\xfe",
      0x000000db => "\xfb",
      0x000000dc => "\x5a",
      0x000000dd => "\xad",
      0x000000de => "\xae",
      0x000000df => "\xa1",
      0x000000e0 => "\x44",
      0x000000e1 => "\x45",
      0x000000e2 => "\x42",
      0x000000e3 => "\x46",
      0x000000e4 => "\xc0",
      0x000000e5 => "\x47",
      0x000000e6 => "\x9c",
      0x000000e7 => "\x48",
      0x000000e8 => "\x54",
      0x000000e9 => "\x51",
      0x000000ea => "\x52",
      0x000000eb => "\x53",
      0x000000ec => "\x58",
      0x000000ed => "\x55",
      0x000000ee => "\x56",
      0x000000ef => "\x57",
      0x000000f0 => "\x8c",
      0x000000f1 => "\x49",
      0x000000f2 => "\xcd",
      0x000000f3 => "\xce",
      0x000000f4 => "\xcb",
      0x000000f5 => "\xcf",
      0x000000f6 => "\x6a",
      0x000000f7 => "\xe1",
      0x000000f8 => "\x70",
      0x000000f9 => "\xdd",
      0x000000fa => "\xde",
      0x000000fb => "\xdb",
      0x000000fc => "\xd0",
      0x000000fd => "\x8d",
      0x000000fe => "\x8e",
      0x000000ff => "\xdf",
      0x0000203e => "\xbc",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x6f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::IBM273 - Conversion routines for IBM273
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for IBM273.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: IBM NLS RM Vol2 SE09-8002-01, March 1990
   alias CP273
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  0000009C | STRING TERMINATOR (ST)
      05 |  00000009 | CHARACTER TABULATION (HT)
      06 |  00000086 | START OF SELECTED AREA (SSA)
      07 |  0000007F | DELETE (DEL)
      08 |  00000097 | END OF GUARDED AREA (EPA)
      09 |  0000008D | REVERSE LINE FEED (RI)
      0A |  0000008E | SINGLE-SHIFT TWO (SS2)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  0000009D | OPERATING SYSTEM COMMAND (OSC)
      15 |  00000085 | NEXT LINE (NEL)
      16 |  00000008 | BACKSPACE (BS)
      17 |  00000087 | END OF SELECTED AREA (ESA)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  00000092 | PRIVATE USE TWO (PU2)
      1B |  0000008F | SINGLE-SHIFT THREE (SS3)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000080 | PADDING CHARACTER (PAD)
      21 |  00000081 | HIGH OCTET PRESET (HOP)
      22 |  00000082 | BREAK PERMITTED HERE (BPH)
      23 |  00000083 | NO BREAK HERE (NBH)
      24 |  00000084 | INDEX (IND)
      25 |  0000000A | LINE FEED (LF)
      26 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      27 |  0000001B | ESCAPE (ESC)
      28 |  00000088 | CHARACTER TABULATION SET (HTS)
      29 |  00000089 | CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
      2A |  0000008A | LINE TABULATION SET (VTS)
      2B |  0000008B | PARTIAL LINE FORWARD (PLD)
      2C |  0000008C | PARTIAL LINE BACKWARD (PLU)
      2D |  00000005 | ENQUIRY (ENQ)
      2E |  00000006 | ACKNOWLEDGE (ACK)
      2F |  00000007 | BELL (BEL)
      30 |  00000090 | DEVICE CONTROL STRING (DCS)
      31 |  00000091 | PRIVATE USE ONE (PU1)
      32 |  00000016 | SYNCHRONOUS IDLE (SYN)
      33 |  00000093 | SET TRANSMIT STATE (STS)
      34 |  00000094 | CANCEL CHARACTER (CCH)
      35 |  00000095 | MESSAGE WAITING (MW)
      36 |  00000096 | START OF GUARDED AREA (SPA)
      37 |  00000004 | END OF TRANSMISSION (EOT)
      38 |  00000098 | START OF STRING (SOS)
      39 |  00000099 | SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
      3A |  0000009A | SINGLE CHARACTER INTRODUCER (SCI)
      3B |  0000009B | CONTROL SEQUENCE INTRODUCER (CSI)
      3C |  00000014 | DEVICE CONTROL FOUR (DC4)
      3D |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      3E |  0000009E | PRIVACY MESSAGE (PM)
      3F |  0000001A | SUBSTITUTE (SUB)
      40 |  00000020 | SPACE
      41 |  000000A0 | NO-BREAK SPACE
      42 |  000000E2 | LATIN SMALL LETTER A WITH CIRCUMFLEX
      43 |  0000007B | LEFT CURLY BRACKET
      44 |  000000E0 | LATIN SMALL LETTER A WITH GRAVE
      45 |  000000E1 | LATIN SMALL LETTER A WITH ACUTE
      46 |  000000E3 | LATIN SMALL LETTER A WITH TILDE
      47 |  000000E5 | LATIN SMALL LETTER A WITH RING ABOVE
      48 |  000000E7 | LATIN SMALL LETTER C WITH CEDILLA
      49 |  000000F1 | LATIN SMALL LETTER N WITH TILDE
      4A |  000000C4 | LATIN CAPITAL LETTER A WITH DIAERESIS
      4B |  0000002E | FULL STOP
      4C |  0000003C | LESS-THAN SIGN
      4D |  00000028 | LEFT PARENTHESIS
      4E |  0000002B | PLUS SIGN
      4F |  00000021 | EXCLAMATION MARK
      50 |  00000026 | AMPERSAND
      51 |  000000E9 | LATIN SMALL LETTER E WITH ACUTE
      52 |  000000EA | LATIN SMALL LETTER E WITH CIRCUMFLEX
      53 |  000000EB | LATIN SMALL LETTER E WITH DIAERESIS
      54 |  000000E8 | LATIN SMALL LETTER E WITH GRAVE
      55 |  000000ED | LATIN SMALL LETTER I WITH ACUTE
      56 |  000000EE | LATIN SMALL LETTER I WITH CIRCUMFLEX
      57 |  000000EF | LATIN SMALL LETTER I WITH DIAERESIS
      58 |  000000EC | LATIN SMALL LETTER I WITH GRAVE
      59 |  0000007E | TILDE
      5A |  000000DC | LATIN CAPITAL LETTER U WITH DIAERESIS
      5B |  00000024 | DOLLAR SIGN
      5C |  0000002A | ASTERISK
      5D |  00000029 | RIGHT PARENTHESIS
      5E |  0000003B | SEMICOLON
      5F |  0000005E | CIRCUMFLEX ACCENT
      60 |  0000002D | HYPHEN-MINUS
      61 |  0000002F | SOLIDUS
      62 |  000000C2 | LATIN CAPITAL LETTER A WITH CIRCUMFLEX
      63 |  0000005B | LEFT SQUARE BRACKET
      64 |  000000C0 | LATIN CAPITAL LETTER A WITH GRAVE
      65 |  000000C1 | LATIN CAPITAL LETTER A WITH ACUTE
      66 |  000000C3 | LATIN CAPITAL LETTER A WITH TILDE
      67 |  000000C5 | LATIN CAPITAL LETTER A WITH RING ABOVE
      68 |  000000C7 | LATIN CAPITAL LETTER C WITH CEDILLA
      69 |  000000D1 | LATIN CAPITAL LETTER N WITH TILDE
      6A |  000000F6 | LATIN SMALL LETTER O WITH DIAERESIS
      6B |  0000002C | COMMA
      6C |  00000025 | PERCENT SIGN
      6D |  0000005F | LOW LINE
      6E |  0000003E | GREATER-THAN SIGN
      6F |  0000003F | QUESTION MARK
      70 |  000000F8 | LATIN SMALL LETTER O WITH STROKE
      71 |  000000C9 | LATIN CAPITAL LETTER E WITH ACUTE
      72 |  000000CA | LATIN CAPITAL LETTER E WITH CIRCUMFLEX
      73 |  000000CB | LATIN CAPITAL LETTER E WITH DIAERESIS
      74 |  000000C8 | LATIN CAPITAL LETTER E WITH GRAVE
      75 |  000000CD | LATIN CAPITAL LETTER I WITH ACUTE
      76 |  000000CE | LATIN CAPITAL LETTER I WITH CIRCUMFLEX
      77 |  000000CF | LATIN CAPITAL LETTER I WITH DIAERESIS
      78 |  000000CC | LATIN CAPITAL LETTER I WITH GRAVE
      79 |  00000060 | GRAVE ACCENT
      7A |  0000003A | COLON
      7B |  00000023 | NUMBER SIGN
      7C |  000000A7 | SECTION SIGN
      7D |  00000027 | APOSTROPHE
      7E |  0000003D | EQUALS SIGN
      7F |  00000022 | QUOTATION MARK
      80 |  000000D8 | LATIN CAPITAL LETTER O WITH STROKE
      81 |  00000061 | LATIN SMALL LETTER A
      82 |  00000062 | LATIN SMALL LETTER B
      83 |  00000063 | LATIN SMALL LETTER C
      84 |  00000064 | LATIN SMALL LETTER D
      85 |  00000065 | LATIN SMALL LETTER E
      86 |  00000066 | LATIN SMALL LETTER F
      87 |  00000067 | LATIN SMALL LETTER G
      88 |  00000068 | LATIN SMALL LETTER H
      89 |  00000069 | LATIN SMALL LETTER I
      8A |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
      8B |  000000BB | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
      8C |  000000F0 | LATIN SMALL LETTER ETH (Icelandic)
      8D |  000000FD | LATIN SMALL LETTER Y WITH ACUTE
      8E |  000000FE | LATIN SMALL LETTER THORN (Icelandic)
      8F |  000000B1 | PLUS-MINUS SIGN
      90 |  000000B0 | DEGREE SIGN
      91 |  0000006A | LATIN SMALL LETTER J
      92 |  0000006B | LATIN SMALL LETTER K
      93 |  0000006C | LATIN SMALL LETTER L
      94 |  0000006D | LATIN SMALL LETTER M
      95 |  0000006E | LATIN SMALL LETTER N
      96 |  0000006F | LATIN SMALL LETTER O
      97 |  00000070 | LATIN SMALL LETTER P
      98 |  00000071 | LATIN SMALL LETTER Q
      99 |  00000072 | LATIN SMALL LETTER R
      9A |  000000AA | FEMININE ORDINAL INDICATOR
      9B |  000000BA | MASCULINE ORDINAL INDICATOR
      9C |  000000E6 | LATIN SMALL LETTER AE
      9D |  000000B8 | CEDILLA
      9E |  000000C6 | LATIN CAPITAL LETTER AE
      9F |  000000A4 | CURRENCY SIGN
      A0 |  000000B5 | MICRO SIGN
      A1 |  000000DF | LATIN SMALL LETTER SHARP S (German)
      A2 |  00000073 | LATIN SMALL LETTER S
      A3 |  00000074 | LATIN SMALL LETTER T
      A4 |  00000075 | LATIN SMALL LETTER U
      A5 |  00000076 | LATIN SMALL LETTER V
      A6 |  00000077 | LATIN SMALL LETTER W
      A7 |  00000078 | LATIN SMALL LETTER X
      A8 |  00000079 | LATIN SMALL LETTER Y
      A9 |  0000007A | LATIN SMALL LETTER Z
      AA |  000000A1 | INVERTED EXCLAMATION MARK
      AB |  000000BF | INVERTED QUESTION MARK
      AC |  000000D0 | LATIN CAPITAL LETTER ETH (Icelandic)
      AD |  000000DD | LATIN CAPITAL LETTER Y WITH ACUTE
      AE |  000000DE | LATIN CAPITAL LETTER THORN (Icelandic)
      AF |  000000AE | REGISTERED SIGN
      B0 |  000000A2 | CENT SIGN
      B1 |  000000A3 | POUND SIGN
      B2 |  000000A5 | YEN SIGN
      B3 |  000000B7 | MIDDLE DOT
      B4 |  000000A9 | COPYRIGHT SIGN
      B5 |  00000040 | COMMERCIAL AT
      B6 |  000000B6 | PILCROW SIGN
      B7 |  000000BC | VULGAR FRACTION ONE QUARTER
      B8 |  000000BD | VULGAR FRACTION ONE HALF
      B9 |  000000BE | VULGAR FRACTION THREE QUARTERS
      BA |  000000AC | NOT SIGN
      BB |  0000007C | VERTICAL LINE
      BC |  0000203E | OVERLINE
      BD |  000000A8 | DIAERESIS
      BE |  000000B4 | ACUTE ACCENT
      BF |  000000D7 | MULTIPLICATION SIGN
      C0 |  000000E4 | LATIN SMALL LETTER A WITH DIAERESIS
      C1 |  00000041 | LATIN CAPITAL LETTER A
      C2 |  00000042 | LATIN CAPITAL LETTER B
      C3 |  00000043 | LATIN CAPITAL LETTER C
      C4 |  00000044 | LATIN CAPITAL LETTER D
      C5 |  00000045 | LATIN CAPITAL LETTER E
      C6 |  00000046 | LATIN CAPITAL LETTER F
      C7 |  00000047 | LATIN CAPITAL LETTER G
      C8 |  00000048 | LATIN CAPITAL LETTER H
      C9 |  00000049 | LATIN CAPITAL LETTER I
      CA |  000000AD | SOFT HYPHEN
      CB |  000000F4 | LATIN SMALL LETTER O WITH CIRCUMFLEX
      CC |  000000A6 | BROKEN BAR
      CD |  000000F2 | LATIN SMALL LETTER O WITH GRAVE
      CE |  000000F3 | LATIN SMALL LETTER O WITH ACUTE
      CF |  000000F5 | LATIN SMALL LETTER O WITH TILDE
      D0 |  000000FC | LATIN SMALL LETTER U WITH DIAERESIS
      D1 |  0000004A | LATIN CAPITAL LETTER J
      D2 |  0000004B | LATIN CAPITAL LETTER K
      D3 |  0000004C | LATIN CAPITAL LETTER L
      D4 |  0000004D | LATIN CAPITAL LETTER M
      D5 |  0000004E | LATIN CAPITAL LETTER N
      D6 |  0000004F | LATIN CAPITAL LETTER O
      D7 |  00000050 | LATIN CAPITAL LETTER P
      D8 |  00000051 | LATIN CAPITAL LETTER Q
      D9 |  00000052 | LATIN CAPITAL LETTER R
      DA |  000000B9 | SUPERSCRIPT ONE
      DB |  000000FB | LATIN SMALL LETTER U WITH CIRCUMFLEX
      DC |  0000007D | RIGHT CURLY BRACKET
      DD |  000000F9 | LATIN SMALL LETTER U WITH GRAVE
      DE |  000000FA | LATIN SMALL LETTER U WITH ACUTE
      DF |  000000FF | LATIN SMALL LETTER Y WITH DIAERESIS
      E0 |  000000D6 | LATIN CAPITAL LETTER O WITH DIAERESIS
      E1 |  000000F7 | DIVISION SIGN
      E2 |  00000053 | LATIN CAPITAL LETTER S
      E3 |  00000054 | LATIN CAPITAL LETTER T
      E4 |  00000055 | LATIN CAPITAL LETTER U
      E5 |  00000056 | LATIN CAPITAL LETTER V
      E6 |  00000057 | LATIN CAPITAL LETTER W
      E7 |  00000058 | LATIN CAPITAL LETTER X
      E8 |  00000059 | LATIN CAPITAL LETTER Y
      E9 |  0000005A | LATIN CAPITAL LETTER Z
      EA |  000000B2 | SUPERSCRIPT TWO
      EB |  000000D4 | LATIN CAPITAL LETTER O WITH CIRCUMFLEX
      EC |  0000005C | REVERSE SOLIDUS
      ED |  000000D2 | LATIN CAPITAL LETTER O WITH GRAVE
      EE |  000000D3 | LATIN CAPITAL LETTER O WITH ACUTE
      EF |  000000D5 | LATIN CAPITAL LETTER O WITH TILDE
      F0 |  00000030 | DIGIT ZERO
      F1 |  00000031 | DIGIT ONE
      F2 |  00000032 | DIGIT TWO
      F3 |  00000033 | DIGIT THREE
      F4 |  00000034 | DIGIT FOUR
      F5 |  00000035 | DIGIT FIVE
      F6 |  00000036 | DIGIT SIX
      F7 |  00000037 | DIGIT SEVEN
      F8 |  00000038 | DIGIT EIGHT
      F9 |  00000039 | DIGIT NINE
      FA |  000000B3 | SUPERSCRIPT THREE
      FB |  000000DB | LATIN CAPITAL LETTER U WITH CIRCUMFLEX
      FC |  0000005D | RIGHT SQUARE BRACKET
      FD |  000000D9 | LATIN CAPITAL LETTER U WITH GRAVE
      FE |  000000DA | LATIN CAPITAL LETTER U WITH ACUTE
      FF |  0000009F | APPLICATION PROGRAM COMMAND (APC)
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_IBM273

    $main::fatpacked{"Locale/RecodeData/IBM274.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_IBM274';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for IBM274.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::IBM274;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x009c,
      0x0009,
      0x0086,
      0x007f,
      0x0097,
      0x008d,
      0x008e,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x009d,
      0x0085,
      0x0008,
      0x0087,
      0x0018,
      0x0019,
      0x0092,
      0x008f,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0080,
      0x0081,
      0x0082,
      0x0083,
      0x0084,
      0x000a,
      0x0017,
      0x001b,
      0x0088,
      0x0089,
      0x008a,
      0x008b,
      0x008c,
      0x0005,
      0x0006,
      0x0007,
      0x0090,
      0x0091,
      0x0016,
      0x0093,
      0x0094,
      0x0095,
      0x0096,
      0x0004,
      0x0098,
      0x0099,
      0x009a,
      0x009b,
      0x0014,
      0x0015,
      0x009e,
      0x001a,
      0x0020,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x005b,
      0x002e,
      0x003c,
      0x0028,
      0x002b,
      0x0021,
      0x0026,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x005d,
      0x0024,
      0x002a,
      0x0029,
      0x003b,
      0x005e,
      0x002d,
      0x002f,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00f9,
      0x002c,
      0x0025,
      0x005f,
      0x003e,
      0x003f,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0060,
      0x003a,
      0x0023,
      0x00e0,
      0x0027,
      0x003d,
      0x0022,
      0xfffd,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00a8,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00e9,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00e8,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00e7,
      0xfffd,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x009f,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\xc2\x9c",
      "\x09",
      "\xc2\x86",
      "\x7f",
      "\xc2\x97",
      "\xc2\x8d",
      "\xc2\x8e",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\xc2\x9d",
      "\xc2\x85",
      "\x08",
      "\xc2\x87",
      "\x18",
      "\x19",
      "\xc2\x92",
      "\xc2\x8f",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\xc2\x80",
      "\xc2\x81",
      "\xc2\x82",
      "\xc2\x83",
      "\xc2\x84",
      "\x0a",
      "\x17",
      "\x1b",
      "\xc2\x88",
      "\xc2\x89",
      "\xc2\x8a",
      "\xc2\x8b",
      "\xc2\x8c",
      "\x05",
      "\x06",
      "\x07",
      "\xc2\x90",
      "\xc2\x91",
      "\x16",
      "\xc2\x93",
      "\xc2\x94",
      "\xc2\x95",
      "\xc2\x96",
      "\x04",
      "\xc2\x98",
      "\xc2\x99",
      "\xc2\x9a",
      "\xc2\x9b",
      "\x14",
      "\x15",
      "\xc2\x9e",
      "\x1a",
      "\x20",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x5b",
      "\x2e",
      "\x3c",
      "\x28",
      "\x2b",
      "\x21",
      "\x26",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x5d",
      "\x24",
      "\x2a",
      "\x29",
      "\x3b",
      "\x5e",
      "\x2d",
      "\x2f",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc3\xb9",
      "\x2c",
      "\x25",
      "\x5f",
      "\x3e",
      "\x3f",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x60",
      "\x3a",
      "\x23",
      "\xc3\xa0",
      "\x27",
      "\x3d",
      "\x22",
      "\xef\xbf\xbd",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc2\xa8",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc3\xa9",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc3\xa8",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc3\xa7",
      "\xef\xbf\xbd",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc2\x9f",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x37",
      0x00000005 => "\x2d",
      0x00000006 => "\x2e",
      0x00000007 => "\x2f",
      0x00000008 => "\x16",
      0x00000009 => "\x05",
      0x0000000a => "\x25",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x3c",
      0x00000015 => "\x3d",
      0x00000016 => "\x32",
      0x00000017 => "\x26",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x3f",
      0x0000001b => "\x27",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x40",
      0x00000021 => "\x4f",
      0x00000022 => "\x7f",
      0x00000023 => "\x7b",
      0x00000024 => "\x5b",
      0x00000025 => "\x6c",
      0x00000026 => "\x50",
      0x00000027 => "\x7d",
      0x00000028 => "\x4d",
      0x00000029 => "\x5d",
      0x0000002a => "\x5c",
      0x0000002b => "\x4e",
      0x0000002c => "\x6b",
      0x0000002d => "\x60",
      0x0000002e => "\x4b",
      0x0000002f => "\x61",
      0x00000030 => "\xf0",
      0x00000031 => "\xf1",
      0x00000032 => "\xf2",
      0x00000033 => "\xf3",
      0x00000034 => "\xf4",
      0x00000035 => "\xf5",
      0x00000036 => "\xf6",
      0x00000037 => "\xf7",
      0x00000038 => "\xf8",
      0x00000039 => "\xf9",
      0x0000003a => "\x7a",
      0x0000003b => "\x5e",
      0x0000003c => "\x4c",
      0x0000003d => "\x7e",
      0x0000003e => "\x6e",
      0x0000003f => "\x6f",
      0x00000041 => "\xc1",
      0x00000042 => "\xc2",
      0x00000043 => "\xc3",
      0x00000044 => "\xc4",
      0x00000045 => "\xc5",
      0x00000046 => "\xc6",
      0x00000047 => "\xc7",
      0x00000048 => "\xc8",
      0x00000049 => "\xc9",
      0x0000004a => "\xd1",
      0x0000004b => "\xd2",
      0x0000004c => "\xd3",
      0x0000004d => "\xd4",
      0x0000004e => "\xd5",
      0x0000004f => "\xd6",
      0x00000050 => "\xd7",
      0x00000051 => "\xd8",
      0x00000052 => "\xd9",
      0x00000053 => "\xe2",
      0x00000054 => "\xe3",
      0x00000055 => "\xe4",
      0x00000056 => "\xe5",
      0x00000057 => "\xe6",
      0x00000058 => "\xe7",
      0x00000059 => "\xe8",
      0x0000005a => "\xe9",
      0x0000005b => "\x4a",
      0x0000005d => "\x5a",
      0x0000005e => "\x5f",
      0x0000005f => "\x6d",
      0x00000060 => "\x79",
      0x00000061 => "\x81",
      0x00000062 => "\x82",
      0x00000063 => "\x83",
      0x00000064 => "\x84",
      0x00000065 => "\x85",
      0x00000066 => "\x86",
      0x00000067 => "\x87",
      0x00000068 => "\x88",
      0x00000069 => "\x89",
      0x0000006a => "\x91",
      0x0000006b => "\x92",
      0x0000006c => "\x93",
      0x0000006d => "\x94",
      0x0000006e => "\x95",
      0x0000006f => "\x96",
      0x00000070 => "\x97",
      0x00000071 => "\x98",
      0x00000072 => "\x99",
      0x00000073 => "\xa2",
      0x00000074 => "\xa3",
      0x00000075 => "\xa4",
      0x00000076 => "\xa5",
      0x00000077 => "\xa6",
      0x00000078 => "\xa7",
      0x00000079 => "\xa8",
      0x0000007a => "\xa9",
      0x0000007f => "\x07",
      0x00000080 => "\x20",
      0x00000081 => "\x21",
      0x00000082 => "\x22",
      0x00000083 => "\x23",
      0x00000084 => "\x24",
      0x00000085 => "\x15",
      0x00000086 => "\x06",
      0x00000087 => "\x17",
      0x00000088 => "\x28",
      0x00000089 => "\x29",
      0x0000008a => "\x2a",
      0x0000008b => "\x2b",
      0x0000008c => "\x2c",
      0x0000008d => "\x09",
      0x0000008e => "\x0a",
      0x0000008f => "\x1b",
      0x00000090 => "\x30",
      0x00000091 => "\x31",
      0x00000092 => "\x1a",
      0x00000093 => "\x33",
      0x00000094 => "\x34",
      0x00000095 => "\x35",
      0x00000096 => "\x36",
      0x00000097 => "\x08",
      0x00000098 => "\x38",
      0x00000099 => "\x39",
      0x0000009a => "\x3a",
      0x0000009b => "\x3b",
      0x0000009c => "\x04",
      0x0000009d => "\x14",
      0x0000009e => "\x3e",
      0x0000009f => "\xff",
      0x000000a8 => "\xa1",
      0x000000e0 => "\x7c",
      0x000000e7 => "\xe0",
      0x000000e8 => "\xd0",
      0x000000e9 => "\xc0",
      0x000000f9 => "\x6a",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x6f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::IBM274 - Conversion routines for IBM274
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for IBM274.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: IBM 3174 Character Set Ref, GA27-3831-02, March 1990
   alias EBCDIC-BE
   alias CP274
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  0000009C | STRING TERMINATOR (ST)
      05 |  00000009 | CHARACTER TABULATION (HT)
      06 |  00000086 | START OF SELECTED AREA (SSA)
      07 |  0000007F | DELETE (DEL)
      08 |  00000097 | END OF GUARDED AREA (EPA)
      09 |  0000008D | REVERSE LINE FEED (RI)
      0A |  0000008E | SINGLE-SHIFT TWO (SS2)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  0000009D | OPERATING SYSTEM COMMAND (OSC)
      15 |  00000085 | NEXT LINE (NEL)
      16 |  00000008 | BACKSPACE (BS)
      17 |  00000087 | END OF SELECTED AREA (ESA)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  00000092 | PRIVATE USE TWO (PU2)
      1B |  0000008F | SINGLE-SHIFT THREE (SS3)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000080 | PADDING CHARACTER (PAD)
      21 |  00000081 | HIGH OCTET PRESET (HOP)
      22 |  00000082 | BREAK PERMITTED HERE (BPH)
      23 |  00000083 | NO BREAK HERE (NBH)
      24 |  00000084 | INDEX (IND)
      25 |  0000000A | LINE FEED (LF)
      26 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      27 |  0000001B | ESCAPE (ESC)
      28 |  00000088 | CHARACTER TABULATION SET (HTS)
      29 |  00000089 | CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
      2A |  0000008A | LINE TABULATION SET (VTS)
      2B |  0000008B | PARTIAL LINE FORWARD (PLD)
      2C |  0000008C | PARTIAL LINE BACKWARD (PLU)
      2D |  00000005 | ENQUIRY (ENQ)
      2E |  00000006 | ACKNOWLEDGE (ACK)
      2F |  00000007 | BELL (BEL)
      30 |  00000090 | DEVICE CONTROL STRING (DCS)
      31 |  00000091 | PRIVATE USE ONE (PU1)
      32 |  00000016 | SYNCHRONOUS IDLE (SYN)
      33 |  00000093 | SET TRANSMIT STATE (STS)
      34 |  00000094 | CANCEL CHARACTER (CCH)
      35 |  00000095 | MESSAGE WAITING (MW)
      36 |  00000096 | START OF GUARDED AREA (SPA)
      37 |  00000004 | END OF TRANSMISSION (EOT)
      38 |  00000098 | START OF STRING (SOS)
      39 |  00000099 | SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
      3A |  0000009A | SINGLE CHARACTER INTRODUCER (SCI)
      3B |  0000009B | CONTROL SEQUENCE INTRODUCER (CSI)
      3C |  00000014 | DEVICE CONTROL FOUR (DC4)
      3D |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      3E |  0000009E | PRIVACY MESSAGE (PM)
      3F |  0000001A | SUBSTITUTE (SUB)
      40 |  00000020 | SPACE
      4A |  0000005B | LEFT SQUARE BRACKET
      4B |  0000002E | FULL STOP
      4C |  0000003C | LESS-THAN SIGN
      4D |  00000028 | LEFT PARENTHESIS
      4E |  0000002B | PLUS SIGN
      4F |  00000021 | EXCLAMATION MARK
      50 |  00000026 | AMPERSAND
      5A |  0000005D | RIGHT SQUARE BRACKET
      5B |  00000024 | DOLLAR SIGN
      5C |  0000002A | ASTERISK
      5D |  00000029 | RIGHT PARENTHESIS
      5E |  0000003B | SEMICOLON
      5F |  0000005E | CIRCUMFLEX ACCENT
      60 |  0000002D | HYPHEN-MINUS
      61 |  0000002F | SOLIDUS
      6A |  000000F9 | LATIN SMALL LETTER U WITH GRAVE
      6B |  0000002C | COMMA
      6C |  00000025 | PERCENT SIGN
      6D |  0000005F | LOW LINE
      6E |  0000003E | GREATER-THAN SIGN
      6F |  0000003F | QUESTION MARK
      79 |  00000060 | GRAVE ACCENT
      7A |  0000003A | COLON
      7B |  00000023 | NUMBER SIGN
      7C |  000000E0 | LATIN SMALL LETTER A WITH GRAVE
      7D |  00000027 | APOSTROPHE
      7E |  0000003D | EQUALS SIGN
      7F |  00000022 | QUOTATION MARK
      81 |  00000061 | LATIN SMALL LETTER A
      82 |  00000062 | LATIN SMALL LETTER B
      83 |  00000063 | LATIN SMALL LETTER C
      84 |  00000064 | LATIN SMALL LETTER D
      85 |  00000065 | LATIN SMALL LETTER E
      86 |  00000066 | LATIN SMALL LETTER F
      87 |  00000067 | LATIN SMALL LETTER G
      88 |  00000068 | LATIN SMALL LETTER H
      89 |  00000069 | LATIN SMALL LETTER I
      91 |  0000006A | LATIN SMALL LETTER J
      92 |  0000006B | LATIN SMALL LETTER K
      93 |  0000006C | LATIN SMALL LETTER L
      94 |  0000006D | LATIN SMALL LETTER M
      95 |  0000006E | LATIN SMALL LETTER N
      96 |  0000006F | LATIN SMALL LETTER O
      97 |  00000070 | LATIN SMALL LETTER P
      98 |  00000071 | LATIN SMALL LETTER Q
      99 |  00000072 | LATIN SMALL LETTER R
      A1 |  000000A8 | DIAERESIS
      A2 |  00000073 | LATIN SMALL LETTER S
      A3 |  00000074 | LATIN SMALL LETTER T
      A4 |  00000075 | LATIN SMALL LETTER U
      A5 |  00000076 | LATIN SMALL LETTER V
      A6 |  00000077 | LATIN SMALL LETTER W
      A7 |  00000078 | LATIN SMALL LETTER X
      A8 |  00000079 | LATIN SMALL LETTER Y
      A9 |  0000007A | LATIN SMALL LETTER Z
      C0 |  000000E9 | LATIN SMALL LETTER E WITH ACUTE
      C1 |  00000041 | LATIN CAPITAL LETTER A
      C2 |  00000042 | LATIN CAPITAL LETTER B
      C3 |  00000043 | LATIN CAPITAL LETTER C
      C4 |  00000044 | LATIN CAPITAL LETTER D
      C5 |  00000045 | LATIN CAPITAL LETTER E
      C6 |  00000046 | LATIN CAPITAL LETTER F
      C7 |  00000047 | LATIN CAPITAL LETTER G
      C8 |  00000048 | LATIN CAPITAL LETTER H
      C9 |  00000049 | LATIN CAPITAL LETTER I
      D0 |  000000E8 | LATIN SMALL LETTER E WITH GRAVE
      D1 |  0000004A | LATIN CAPITAL LETTER J
      D2 |  0000004B | LATIN CAPITAL LETTER K
      D3 |  0000004C | LATIN CAPITAL LETTER L
      D4 |  0000004D | LATIN CAPITAL LETTER M
      D5 |  0000004E | LATIN CAPITAL LETTER N
      D6 |  0000004F | LATIN CAPITAL LETTER O
      D7 |  00000050 | LATIN CAPITAL LETTER P
      D8 |  00000051 | LATIN CAPITAL LETTER Q
      D9 |  00000052 | LATIN CAPITAL LETTER R
      E0 |  000000E7 | LATIN SMALL LETTER C WITH CEDILLA
      E2 |  00000053 | LATIN CAPITAL LETTER S
      E3 |  00000054 | LATIN CAPITAL LETTER T
      E4 |  00000055 | LATIN CAPITAL LETTER U
      E5 |  00000056 | LATIN CAPITAL LETTER V
      E6 |  00000057 | LATIN CAPITAL LETTER W
      E7 |  00000058 | LATIN CAPITAL LETTER X
      E8 |  00000059 | LATIN CAPITAL LETTER Y
      E9 |  0000005A | LATIN CAPITAL LETTER Z
      F0 |  00000030 | DIGIT ZERO
      F1 |  00000031 | DIGIT ONE
      F2 |  00000032 | DIGIT TWO
      F3 |  00000033 | DIGIT THREE
      F4 |  00000034 | DIGIT FOUR
      F5 |  00000035 | DIGIT FIVE
      F6 |  00000036 | DIGIT SIX
      F7 |  00000037 | DIGIT SEVEN
      F8 |  00000038 | DIGIT EIGHT
      F9 |  00000039 | DIGIT NINE
      FF |  0000009F | APPLICATION PROGRAM COMMAND (APC)
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_IBM274

    $main::fatpacked{"Locale/RecodeData/IBM275.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_IBM275';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for IBM275.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::IBM275;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x009c,
      0x0009,
      0x0086,
      0x007f,
      0x0097,
      0x008d,
      0x008e,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x009d,
      0x0085,
      0x0008,
      0x0087,
      0x0018,
      0x0019,
      0x0092,
      0x008f,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0080,
      0x0081,
      0x0082,
      0x0083,
      0x0084,
      0x000a,
      0x0017,
      0x001b,
      0x0088,
      0x0089,
      0x008a,
      0x008b,
      0x008c,
      0x0005,
      0x0006,
      0x0007,
      0x0090,
      0x0091,
      0x0016,
      0x0093,
      0x0094,
      0x0095,
      0x0096,
      0x0004,
      0x0098,
      0x0099,
      0x009a,
      0x009b,
      0x0014,
      0x0015,
      0x009e,
      0x001a,
      0x0020,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00c9,
      0x002e,
      0x003c,
      0x0028,
      0x002b,
      0x0021,
      0x0026,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0024,
      0x00c7,
      0x002a,
      0x0029,
      0x003b,
      0x005e,
      0x002d,
      0x002f,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00e7,
      0x002c,
      0x0025,
      0x005f,
      0x003e,
      0x003f,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00e3,
      0x003a,
      0x00d5,
      0x00c3,
      0x0027,
      0x003d,
      0x0022,
      0xfffd,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x007e,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00f5,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00e9,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x005c,
      0xfffd,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x009f,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\xc2\x9c",
      "\x09",
      "\xc2\x86",
      "\x7f",
      "\xc2\x97",
      "\xc2\x8d",
      "\xc2\x8e",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\xc2\x9d",
      "\xc2\x85",
      "\x08",
      "\xc2\x87",
      "\x18",
      "\x19",
      "\xc2\x92",
      "\xc2\x8f",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\xc2\x80",
      "\xc2\x81",
      "\xc2\x82",
      "\xc2\x83",
      "\xc2\x84",
      "\x0a",
      "\x17",
      "\x1b",
      "\xc2\x88",
      "\xc2\x89",
      "\xc2\x8a",
      "\xc2\x8b",
      "\xc2\x8c",
      "\x05",
      "\x06",
      "\x07",
      "\xc2\x90",
      "\xc2\x91",
      "\x16",
      "\xc2\x93",
      "\xc2\x94",
      "\xc2\x95",
      "\xc2\x96",
      "\x04",
      "\xc2\x98",
      "\xc2\x99",
      "\xc2\x9a",
      "\xc2\x9b",
      "\x14",
      "\x15",
      "\xc2\x9e",
      "\x1a",
      "\x20",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc3\x89",
      "\x2e",
      "\x3c",
      "\x28",
      "\x2b",
      "\x21",
      "\x26",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x24",
      "\xc3\x87",
      "\x2a",
      "\x29",
      "\x3b",
      "\x5e",
      "\x2d",
      "\x2f",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc3\xa7",
      "\x2c",
      "\x25",
      "\x5f",
      "\x3e",
      "\x3f",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc3\xa3",
      "\x3a",
      "\xc3\x95",
      "\xc3\x83",
      "\x27",
      "\x3d",
      "\x22",
      "\xef\xbf\xbd",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x7e",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc3\xb5",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc3\xa9",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x5c",
      "\xef\xbf\xbd",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc2\x9f",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x37",
      0x00000005 => "\x2d",
      0x00000006 => "\x2e",
      0x00000007 => "\x2f",
      0x00000008 => "\x16",
      0x00000009 => "\x05",
      0x0000000a => "\x25",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x3c",
      0x00000015 => "\x3d",
      0x00000016 => "\x32",
      0x00000017 => "\x26",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x3f",
      0x0000001b => "\x27",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x40",
      0x00000021 => "\x4f",
      0x00000022 => "\x7f",
      0x00000024 => "\x5a",
      0x00000025 => "\x6c",
      0x00000026 => "\x50",
      0x00000027 => "\x7d",
      0x00000028 => "\x4d",
      0x00000029 => "\x5d",
      0x0000002a => "\x5c",
      0x0000002b => "\x4e",
      0x0000002c => "\x6b",
      0x0000002d => "\x60",
      0x0000002e => "\x4b",
      0x0000002f => "\x61",
      0x00000030 => "\xf0",
      0x00000031 => "\xf1",
      0x00000032 => "\xf2",
      0x00000033 => "\xf3",
      0x00000034 => "\xf4",
      0x00000035 => "\xf5",
      0x00000036 => "\xf6",
      0x00000037 => "\xf7",
      0x00000038 => "\xf8",
      0x00000039 => "\xf9",
      0x0000003a => "\x7a",
      0x0000003b => "\x5e",
      0x0000003c => "\x4c",
      0x0000003d => "\x7e",
      0x0000003e => "\x6e",
      0x0000003f => "\x6f",
      0x00000041 => "\xc1",
      0x00000042 => "\xc2",
      0x00000043 => "\xc3",
      0x00000044 => "\xc4",
      0x00000045 => "\xc5",
      0x00000046 => "\xc6",
      0x00000047 => "\xc7",
      0x00000048 => "\xc8",
      0x00000049 => "\xc9",
      0x0000004a => "\xd1",
      0x0000004b => "\xd2",
      0x0000004c => "\xd3",
      0x0000004d => "\xd4",
      0x0000004e => "\xd5",
      0x0000004f => "\xd6",
      0x00000050 => "\xd7",
      0x00000051 => "\xd8",
      0x00000052 => "\xd9",
      0x00000053 => "\xe2",
      0x00000054 => "\xe3",
      0x00000055 => "\xe4",
      0x00000056 => "\xe5",
      0x00000057 => "\xe6",
      0x00000058 => "\xe7",
      0x00000059 => "\xe8",
      0x0000005a => "\xe9",
      0x0000005c => "\xe0",
      0x0000005e => "\x5f",
      0x0000005f => "\x6d",
      0x00000061 => "\x81",
      0x00000062 => "\x82",
      0x00000063 => "\x83",
      0x00000064 => "\x84",
      0x00000065 => "\x85",
      0x00000066 => "\x86",
      0x00000067 => "\x87",
      0x00000068 => "\x88",
      0x00000069 => "\x89",
      0x0000006a => "\x91",
      0x0000006b => "\x92",
      0x0000006c => "\x93",
      0x0000006d => "\x94",
      0x0000006e => "\x95",
      0x0000006f => "\x96",
      0x00000070 => "\x97",
      0x00000071 => "\x98",
      0x00000072 => "\x99",
      0x00000073 => "\xa2",
      0x00000074 => "\xa3",
      0x00000075 => "\xa4",
      0x00000076 => "\xa5",
      0x00000077 => "\xa6",
      0x00000078 => "\xa7",
      0x00000079 => "\xa8",
      0x0000007a => "\xa9",
      0x0000007e => "\xa1",
      0x0000007f => "\x07",
      0x00000080 => "\x20",
      0x00000081 => "\x21",
      0x00000082 => "\x22",
      0x00000083 => "\x23",
      0x00000084 => "\x24",
      0x00000085 => "\x15",
      0x00000086 => "\x06",
      0x00000087 => "\x17",
      0x00000088 => "\x28",
      0x00000089 => "\x29",
      0x0000008a => "\x2a",
      0x0000008b => "\x2b",
      0x0000008c => "\x2c",
      0x0000008d => "\x09",
      0x0000008e => "\x0a",
      0x0000008f => "\x1b",
      0x00000090 => "\x30",
      0x00000091 => "\x31",
      0x00000092 => "\x1a",
      0x00000093 => "\x33",
      0x00000094 => "\x34",
      0x00000095 => "\x35",
      0x00000096 => "\x36",
      0x00000097 => "\x08",
      0x00000098 => "\x38",
      0x00000099 => "\x39",
      0x0000009a => "\x3a",
      0x0000009b => "\x3b",
      0x0000009c => "\x04",
      0x0000009d => "\x14",
      0x0000009e => "\x3e",
      0x0000009f => "\xff",
      0x000000c3 => "\x7c",
      0x000000c7 => "\x5b",
      0x000000c9 => "\x4a",
      0x000000d5 => "\x7b",
      0x000000e3 => "\x79",
      0x000000e7 => "\x6a",
      0x000000e9 => "\xd0",
      0x000000f5 => "\xc0",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x6f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::IBM275 - Conversion routines for IBM275
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for IBM275.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: IBM NLS RM Vol2 SE09-8002-01, March 1990
   alias EBCDIC-BR
   alias CP275
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  0000009C | STRING TERMINATOR (ST)
      05 |  00000009 | CHARACTER TABULATION (HT)
      06 |  00000086 | START OF SELECTED AREA (SSA)
      07 |  0000007F | DELETE (DEL)
      08 |  00000097 | END OF GUARDED AREA (EPA)
      09 |  0000008D | REVERSE LINE FEED (RI)
      0A |  0000008E | SINGLE-SHIFT TWO (SS2)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  0000009D | OPERATING SYSTEM COMMAND (OSC)
      15 |  00000085 | NEXT LINE (NEL)
      16 |  00000008 | BACKSPACE (BS)
      17 |  00000087 | END OF SELECTED AREA (ESA)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  00000092 | PRIVATE USE TWO (PU2)
      1B |  0000008F | SINGLE-SHIFT THREE (SS3)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000080 | PADDING CHARACTER (PAD)
      21 |  00000081 | HIGH OCTET PRESET (HOP)
      22 |  00000082 | BREAK PERMITTED HERE (BPH)
      23 |  00000083 | NO BREAK HERE (NBH)
      24 |  00000084 | INDEX (IND)
      25 |  0000000A | LINE FEED (LF)
      26 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      27 |  0000001B | ESCAPE (ESC)
      28 |  00000088 | CHARACTER TABULATION SET (HTS)
      29 |  00000089 | CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
      2A |  0000008A | LINE TABULATION SET (VTS)
      2B |  0000008B | PARTIAL LINE FORWARD (PLD)
      2C |  0000008C | PARTIAL LINE BACKWARD (PLU)
      2D |  00000005 | ENQUIRY (ENQ)
      2E |  00000006 | ACKNOWLEDGE (ACK)
      2F |  00000007 | BELL (BEL)
      30 |  00000090 | DEVICE CONTROL STRING (DCS)
      31 |  00000091 | PRIVATE USE ONE (PU1)
      32 |  00000016 | SYNCHRONOUS IDLE (SYN)
      33 |  00000093 | SET TRANSMIT STATE (STS)
      34 |  00000094 | CANCEL CHARACTER (CCH)
      35 |  00000095 | MESSAGE WAITING (MW)
      36 |  00000096 | START OF GUARDED AREA (SPA)
      37 |  00000004 | END OF TRANSMISSION (EOT)
      38 |  00000098 | START OF STRING (SOS)
      39 |  00000099 | SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
      3A |  0000009A | SINGLE CHARACTER INTRODUCER (SCI)
      3B |  0000009B | CONTROL SEQUENCE INTRODUCER (CSI)
      3C |  00000014 | DEVICE CONTROL FOUR (DC4)
      3D |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      3E |  0000009E | PRIVACY MESSAGE (PM)
      3F |  0000001A | SUBSTITUTE (SUB)
      40 |  00000020 | SPACE
      4A |  000000C9 | LATIN CAPITAL LETTER E WITH ACUTE
      4B |  0000002E | FULL STOP
      4C |  0000003C | LESS-THAN SIGN
      4D |  00000028 | LEFT PARENTHESIS
      4E |  0000002B | PLUS SIGN
      4F |  00000021 | EXCLAMATION MARK
      50 |  00000026 | AMPERSAND
      5A |  00000024 | DOLLAR SIGN
      5B |  000000C7 | LATIN CAPITAL LETTER C WITH CEDILLA
      5C |  0000002A | ASTERISK
      5D |  00000029 | RIGHT PARENTHESIS
      5E |  0000003B | SEMICOLON
      5F |  0000005E | CIRCUMFLEX ACCENT
      60 |  0000002D | HYPHEN-MINUS
      61 |  0000002F | SOLIDUS
      6A |  000000E7 | LATIN SMALL LETTER C WITH CEDILLA
      6B |  0000002C | COMMA
      6C |  00000025 | PERCENT SIGN
      6D |  0000005F | LOW LINE
      6E |  0000003E | GREATER-THAN SIGN
      6F |  0000003F | QUESTION MARK
      79 |  000000E3 | LATIN SMALL LETTER A WITH TILDE
      7A |  0000003A | COLON
      7B |  000000D5 | LATIN CAPITAL LETTER O WITH TILDE
      7C |  000000C3 | LATIN CAPITAL LETTER A WITH TILDE
      7D |  00000027 | APOSTROPHE
      7E |  0000003D | EQUALS SIGN
      7F |  00000022 | QUOTATION MARK
      81 |  00000061 | LATIN SMALL LETTER A
      82 |  00000062 | LATIN SMALL LETTER B
      83 |  00000063 | LATIN SMALL LETTER C
      84 |  00000064 | LATIN SMALL LETTER D
      85 |  00000065 | LATIN SMALL LETTER E
      86 |  00000066 | LATIN SMALL LETTER F
      87 |  00000067 | LATIN SMALL LETTER G
      88 |  00000068 | LATIN SMALL LETTER H
      89 |  00000069 | LATIN SMALL LETTER I
      91 |  0000006A | LATIN SMALL LETTER J
      92 |  0000006B | LATIN SMALL LETTER K
      93 |  0000006C | LATIN SMALL LETTER L
      94 |  0000006D | LATIN SMALL LETTER M
      95 |  0000006E | LATIN SMALL LETTER N
      96 |  0000006F | LATIN SMALL LETTER O
      97 |  00000070 | LATIN SMALL LETTER P
      98 |  00000071 | LATIN SMALL LETTER Q
      99 |  00000072 | LATIN SMALL LETTER R
      A1 |  0000007E | TILDE
      A2 |  00000073 | LATIN SMALL LETTER S
      A3 |  00000074 | LATIN SMALL LETTER T
      A4 |  00000075 | LATIN SMALL LETTER U
      A5 |  00000076 | LATIN SMALL LETTER V
      A6 |  00000077 | LATIN SMALL LETTER W
      A7 |  00000078 | LATIN SMALL LETTER X
      A8 |  00000079 | LATIN SMALL LETTER Y
      A9 |  0000007A | LATIN SMALL LETTER Z
      C0 |  000000F5 | LATIN SMALL LETTER O WITH TILDE
      C1 |  00000041 | LATIN CAPITAL LETTER A
      C2 |  00000042 | LATIN CAPITAL LETTER B
      C3 |  00000043 | LATIN CAPITAL LETTER C
      C4 |  00000044 | LATIN CAPITAL LETTER D
      C5 |  00000045 | LATIN CAPITAL LETTER E
      C6 |  00000046 | LATIN CAPITAL LETTER F
      C7 |  00000047 | LATIN CAPITAL LETTER G
      C8 |  00000048 | LATIN CAPITAL LETTER H
      C9 |  00000049 | LATIN CAPITAL LETTER I
      D0 |  000000E9 | LATIN SMALL LETTER E WITH ACUTE
      D1 |  0000004A | LATIN CAPITAL LETTER J
      D2 |  0000004B | LATIN CAPITAL LETTER K
      D3 |  0000004C | LATIN CAPITAL LETTER L
      D4 |  0000004D | LATIN CAPITAL LETTER M
      D5 |  0000004E | LATIN CAPITAL LETTER N
      D6 |  0000004F | LATIN CAPITAL LETTER O
      D7 |  00000050 | LATIN CAPITAL LETTER P
      D8 |  00000051 | LATIN CAPITAL LETTER Q
      D9 |  00000052 | LATIN CAPITAL LETTER R
      E0 |  0000005C | REVERSE SOLIDUS
      E2 |  00000053 | LATIN CAPITAL LETTER S
      E3 |  00000054 | LATIN CAPITAL LETTER T
      E4 |  00000055 | LATIN CAPITAL LETTER U
      E5 |  00000056 | LATIN CAPITAL LETTER V
      E6 |  00000057 | LATIN CAPITAL LETTER W
      E7 |  00000058 | LATIN CAPITAL LETTER X
      E8 |  00000059 | LATIN CAPITAL LETTER Y
      E9 |  0000005A | LATIN CAPITAL LETTER Z
      F0 |  00000030 | DIGIT ZERO
      F1 |  00000031 | DIGIT ONE
      F2 |  00000032 | DIGIT TWO
      F3 |  00000033 | DIGIT THREE
      F4 |  00000034 | DIGIT FOUR
      F5 |  00000035 | DIGIT FIVE
      F6 |  00000036 | DIGIT SIX
      F7 |  00000037 | DIGIT SEVEN
      F8 |  00000038 | DIGIT EIGHT
      F9 |  00000039 | DIGIT NINE
      FF |  0000009F | APPLICATION PROGRAM COMMAND (APC)
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_IBM275

    $main::fatpacked{"Locale/RecodeData/IBM277.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_IBM277';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for IBM277.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::IBM277;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x009c,
      0x0009,
      0x0086,
      0x007f,
      0x0097,
      0x008d,
      0x008e,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x009d,
      0x0085,
      0x0008,
      0x0087,
      0x0018,
      0x0019,
      0x0092,
      0x008f,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0080,
      0x0081,
      0x0082,
      0x0083,
      0x0084,
      0x000a,
      0x0017,
      0x001b,
      0x0088,
      0x0089,
      0x008a,
      0x008b,
      0x008c,
      0x0005,
      0x0006,
      0x0007,
      0x0090,
      0x0091,
      0x0016,
      0x0093,
      0x0094,
      0x0095,
      0x0096,
      0x0004,
      0x0098,
      0x0099,
      0x009a,
      0x009b,
      0x0014,
      0x0015,
      0x009e,
      0x001a,
      0x0020,
      0x00a0,
      0x00e2,
      0x00e4,
      0x00e0,
      0x00e1,
      0x00e3,
      0x007d,
      0x00e7,
      0x00f1,
      0x0023,
      0x002e,
      0x003c,
      0x0028,
      0x002b,
      0x0021,
      0x0026,
      0x00e9,
      0x00ea,
      0x00eb,
      0x00e8,
      0x00ed,
      0x00ee,
      0x00ef,
      0x00ec,
      0x00df,
      0x00a4,
      0x00c5,
      0x002a,
      0x0029,
      0x003b,
      0x005e,
      0x002d,
      0x002f,
      0x00c2,
      0x00c4,
      0x00c0,
      0x00c1,
      0x00c3,
      0x0024,
      0x00c7,
      0x00d1,
      0x00f8,
      0x002c,
      0x0025,
      0x005f,
      0x003e,
      0x003f,
      0x00a6,
      0x00c9,
      0x00ca,
      0x00cb,
      0x00c8,
      0x00cd,
      0x00ce,
      0x00cf,
      0x00cc,
      0x0060,
      0x003a,
      0x00c6,
      0x00d8,
      0x0027,
      0x003d,
      0x0022,
      0x0040,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x00ab,
      0x00bb,
      0x00f0,
      0x00fd,
      0x00fe,
      0x00b1,
      0x00b0,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x00aa,
      0x00ba,
      0x007b,
      0x00b8,
      0x005b,
      0x005d,
      0x00b5,
      0x00fc,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x00a1,
      0x00bf,
      0x00d0,
      0x00dd,
      0x00de,
      0x00ae,
      0x00a2,
      0x00a3,
      0x00a5,
      0x00b7,
      0x00a9,
      0x00a7,
      0x00b6,
      0x00bc,
      0x00bd,
      0x00be,
      0x00ac,
      0x007c,
      0x203e,
      0x00a8,
      0x00b4,
      0x00d7,
      0x00e6,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x00ad,
      0x00f4,
      0x00f6,
      0x00f2,
      0x00f3,
      0x00f5,
      0x00e5,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x00b9,
      0x00fb,
      0x007e,
      0x00f9,
      0x00fa,
      0x00ff,
      0x005c,
      0x00f7,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x00b2,
      0x00d4,
      0x00d6,
      0x00d2,
      0x00d3,
      0x00d5,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x00b3,
      0x00db,
      0x00dc,
      0x00d9,
      0x00da,
      0x009f,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\xc2\x9c",
      "\x09",
      "\xc2\x86",
      "\x7f",
      "\xc2\x97",
      "\xc2\x8d",
      "\xc2\x8e",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\xc2\x9d",
      "\xc2\x85",
      "\x08",
      "\xc2\x87",
      "\x18",
      "\x19",
      "\xc2\x92",
      "\xc2\x8f",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\xc2\x80",
      "\xc2\x81",
      "\xc2\x82",
      "\xc2\x83",
      "\xc2\x84",
      "\x0a",
      "\x17",
      "\x1b",
      "\xc2\x88",
      "\xc2\x89",
      "\xc2\x8a",
      "\xc2\x8b",
      "\xc2\x8c",
      "\x05",
      "\x06",
      "\x07",
      "\xc2\x90",
      "\xc2\x91",
      "\x16",
      "\xc2\x93",
      "\xc2\x94",
      "\xc2\x95",
      "\xc2\x96",
      "\x04",
      "\xc2\x98",
      "\xc2\x99",
      "\xc2\x9a",
      "\xc2\x9b",
      "\x14",
      "\x15",
      "\xc2\x9e",
      "\x1a",
      "\x20",
      "\xc2\xa0",
      "\xc3\xa2",
      "\xc3\xa4",
      "\xc3\xa0",
      "\xc3\xa1",
      "\xc3\xa3",
      "\x7d",
      "\xc3\xa7",
      "\xc3\xb1",
      "\x23",
      "\x2e",
      "\x3c",
      "\x28",
      "\x2b",
      "\x21",
      "\x26",
      "\xc3\xa9",
      "\xc3\xaa",
      "\xc3\xab",
      "\xc3\xa8",
      "\xc3\xad",
      "\xc3\xae",
      "\xc3\xaf",
      "\xc3\xac",
      "\xc3\x9f",
      "\xc2\xa4",
      "\xc3\x85",
      "\x2a",
      "\x29",
      "\x3b",
      "\x5e",
      "\x2d",
      "\x2f",
      "\xc3\x82",
      "\xc3\x84",
      "\xc3\x80",
      "\xc3\x81",
      "\xc3\x83",
      "\x24",
      "\xc3\x87",
      "\xc3\x91",
      "\xc3\xb8",
      "\x2c",
      "\x25",
      "\x5f",
      "\x3e",
      "\x3f",
      "\xc2\xa6",
      "\xc3\x89",
      "\xc3\x8a",
      "\xc3\x8b",
      "\xc3\x88",
      "\xc3\x8d",
      "\xc3\x8e",
      "\xc3\x8f",
      "\xc3\x8c",
      "\x60",
      "\x3a",
      "\xc3\x86",
      "\xc3\x98",
      "\x27",
      "\x3d",
      "\x22",
      "\x40",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\xc2\xab",
      "\xc2\xbb",
      "\xc3\xb0",
      "\xc3\xbd",
      "\xc3\xbe",
      "\xc2\xb1",
      "\xc2\xb0",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\xc2\xaa",
      "\xc2\xba",
      "\x7b",
      "\xc2\xb8",
      "\x5b",
      "\x5d",
      "\xc2\xb5",
      "\xc3\xbc",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\xc2\xa1",
      "\xc2\xbf",
      "\xc3\x90",
      "\xc3\x9d",
      "\xc3\x9e",
      "\xc2\xae",
      "\xc2\xa2",
      "\xc2\xa3",
      "\xc2\xa5",
      "\xc2\xb7",
      "\xc2\xa9",
      "\xc2\xa7",
      "\xc2\xb6",
      "\xc2\xbc",
      "\xc2\xbd",
      "\xc2\xbe",
      "\xc2\xac",
      "\x7c",
      "\xe2\x80\xbe",
      "\xc2\xa8",
      "\xc2\xb4",
      "\xc3\x97",
      "\xc3\xa6",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\xc2\xad",
      "\xc3\xb4",
      "\xc3\xb6",
      "\xc3\xb2",
      "\xc3\xb3",
      "\xc3\xb5",
      "\xc3\xa5",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\xc2\xb9",
      "\xc3\xbb",
      "\x7e",
      "\xc3\xb9",
      "\xc3\xba",
      "\xc3\xbf",
      "\x5c",
      "\xc3\xb7",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\xc2\xb2",
      "\xc3\x94",
      "\xc3\x96",
      "\xc3\x92",
      "\xc3\x93",
      "\xc3\x95",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\xc2\xb3",
      "\xc3\x9b",
      "\xc3\x9c",
      "\xc3\x99",
      "\xc3\x9a",
      "\xc2\x9f",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x37",
      0x00000005 => "\x2d",
      0x00000006 => "\x2e",
      0x00000007 => "\x2f",
      0x00000008 => "\x16",
      0x00000009 => "\x05",
      0x0000000a => "\x25",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x3c",
      0x00000015 => "\x3d",
      0x00000016 => "\x32",
      0x00000017 => "\x26",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x3f",
      0x0000001b => "\x27",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x40",
      0x00000021 => "\x4f",
      0x00000022 => "\x7f",
      0x00000023 => "\x4a",
      0x00000024 => "\x67",
      0x00000025 => "\x6c",
      0x00000026 => "\x50",
      0x00000027 => "\x7d",
      0x00000028 => "\x4d",
      0x00000029 => "\x5d",
      0x0000002a => "\x5c",
      0x0000002b => "\x4e",
      0x0000002c => "\x6b",
      0x0000002d => "\x60",
      0x0000002e => "\x4b",
      0x0000002f => "\x61",
      0x00000030 => "\xf0",
      0x00000031 => "\xf1",
      0x00000032 => "\xf2",
      0x00000033 => "\xf3",
      0x00000034 => "\xf4",
      0x00000035 => "\xf5",
      0x00000036 => "\xf6",
      0x00000037 => "\xf7",
      0x00000038 => "\xf8",
      0x00000039 => "\xf9",
      0x0000003a => "\x7a",
      0x0000003b => "\x5e",
      0x0000003c => "\x4c",
      0x0000003d => "\x7e",
      0x0000003e => "\x6e",
      0x0000003f => "\x6f",
      0x00000040 => "\x80",
      0x00000041 => "\xc1",
      0x00000042 => "\xc2",
      0x00000043 => "\xc3",
      0x00000044 => "\xc4",
      0x00000045 => "\xc5",
      0x00000046 => "\xc6",
      0x00000047 => "\xc7",
      0x00000048 => "\xc8",
      0x00000049 => "\xc9",
      0x0000004a => "\xd1",
      0x0000004b => "\xd2",
      0x0000004c => "\xd3",
      0x0000004d => "\xd4",
      0x0000004e => "\xd5",
      0x0000004f => "\xd6",
      0x00000050 => "\xd7",
      0x00000051 => "\xd8",
      0x00000052 => "\xd9",
      0x00000053 => "\xe2",
      0x00000054 => "\xe3",
      0x00000055 => "\xe4",
      0x00000056 => "\xe5",
      0x00000057 => "\xe6",
      0x00000058 => "\xe7",
      0x00000059 => "\xe8",
      0x0000005a => "\xe9",
      0x0000005b => "\x9e",
      0x0000005c => "\xe0",
      0x0000005d => "\x9f",
      0x0000005e => "\x5f",
      0x0000005f => "\x6d",
      0x00000060 => "\x79",
      0x00000061 => "\x81",
      0x00000062 => "\x82",
      0x00000063 => "\x83",
      0x00000064 => "\x84",
      0x00000065 => "\x85",
      0x00000066 => "\x86",
      0x00000067 => "\x87",
      0x00000068 => "\x88",
      0x00000069 => "\x89",
      0x0000006a => "\x91",
      0x0000006b => "\x92",
      0x0000006c => "\x93",
      0x0000006d => "\x94",
      0x0000006e => "\x95",
      0x0000006f => "\x96",
      0x00000070 => "\x97",
      0x00000071 => "\x98",
      0x00000072 => "\x99",
      0x00000073 => "\xa2",
      0x00000074 => "\xa3",
      0x00000075 => "\xa4",
      0x00000076 => "\xa5",
      0x00000077 => "\xa6",
      0x00000078 => "\xa7",
      0x00000079 => "\xa8",
      0x0000007a => "\xa9",
      0x0000007b => "\x9c",
      0x0000007c => "\xbb",
      0x0000007d => "\x47",
      0x0000007e => "\xdc",
      0x0000007f => "\x07",
      0x00000080 => "\x20",
      0x00000081 => "\x21",
      0x00000082 => "\x22",
      0x00000083 => "\x23",
      0x00000084 => "\x24",
      0x00000085 => "\x15",
      0x00000086 => "\x06",
      0x00000087 => "\x17",
      0x00000088 => "\x28",
      0x00000089 => "\x29",
      0x0000008a => "\x2a",
      0x0000008b => "\x2b",
      0x0000008c => "\x2c",
      0x0000008d => "\x09",
      0x0000008e => "\x0a",
      0x0000008f => "\x1b",
      0x00000090 => "\x30",
      0x00000091 => "\x31",
      0x00000092 => "\x1a",
      0x00000093 => "\x33",
      0x00000094 => "\x34",
      0x00000095 => "\x35",
      0x00000096 => "\x36",
      0x00000097 => "\x08",
      0x00000098 => "\x38",
      0x00000099 => "\x39",
      0x0000009a => "\x3a",
      0x0000009b => "\x3b",
      0x0000009c => "\x04",
      0x0000009d => "\x14",
      0x0000009e => "\x3e",
      0x0000009f => "\xff",
      0x000000a0 => "\x41",
      0x000000a1 => "\xaa",
      0x000000a2 => "\xb0",
      0x000000a3 => "\xb1",
      0x000000a4 => "\x5a",
      0x000000a5 => "\xb2",
      0x000000a6 => "\x70",
      0x000000a7 => "\xb5",
      0x000000a8 => "\xbd",
      0x000000a9 => "\xb4",
      0x000000aa => "\x9a",
      0x000000ab => "\x8a",
      0x000000ac => "\xba",
      0x000000ad => "\xca",
      0x000000ae => "\xaf",
      0x000000b0 => "\x90",
      0x000000b1 => "\x8f",
      0x000000b2 => "\xea",
      0x000000b3 => "\xfa",
      0x000000b4 => "\xbe",
      0x000000b5 => "\xa0",
      0x000000b6 => "\xb6",
      0x000000b7 => "\xb3",
      0x000000b8 => "\x9d",
      0x000000b9 => "\xda",
      0x000000ba => "\x9b",
      0x000000bb => "\x8b",
      0x000000bc => "\xb7",
      0x000000bd => "\xb8",
      0x000000be => "\xb9",
      0x000000bf => "\xab",
      0x000000c0 => "\x64",
      0x000000c1 => "\x65",
      0x000000c2 => "\x62",
      0x000000c3 => "\x66",
      0x000000c4 => "\x63",
      0x000000c5 => "\x5b",
      0x000000c6 => "\x7b",
      0x000000c7 => "\x68",
      0x000000c8 => "\x74",
      0x000000c9 => "\x71",
      0x000000ca => "\x72",
      0x000000cb => "\x73",
      0x000000cc => "\x78",
      0x000000cd => "\x75",
      0x000000ce => "\x76",
      0x000000cf => "\x77",
      0x000000d0 => "\xac",
      0x000000d1 => "\x69",
      0x000000d2 => "\xed",
      0x000000d3 => "\xee",
      0x000000d4 => "\xeb",
      0x000000d5 => "\xef",
      0x000000d6 => "\xec",
      0x000000d7 => "\xbf",
      0x000000d8 => "\x7c",
      0x000000d9 => "\xfd",
      0x000000da => "\xfe",
      0x000000db => "\xfb",
      0x000000dc => "\xfc",
      0x000000dd => "\xad",
      0x000000de => "\xae",
      0x000000df => "\x59",
      0x000000e0 => "\x44",
      0x000000e1 => "\x45",
      0x000000e2 => "\x42",
      0x000000e3 => "\x46",
      0x000000e4 => "\x43",
      0x000000e5 => "\xd0",
      0x000000e6 => "\xc0",
      0x000000e7 => "\x48",
      0x000000e8 => "\x54",
      0x000000e9 => "\x51",
      0x000000ea => "\x52",
      0x000000eb => "\x53",
      0x000000ec => "\x58",
      0x000000ed => "\x55",
      0x000000ee => "\x56",
      0x000000ef => "\x57",
      0x000000f0 => "\x8c",
      0x000000f1 => "\x49",
      0x000000f2 => "\xcd",
      0x000000f3 => "\xce",
      0x000000f4 => "\xcb",
      0x000000f5 => "\xcf",
      0x000000f6 => "\xcc",
      0x000000f7 => "\xe1",
      0x000000f8 => "\x6a",
      0x000000f9 => "\xdd",
      0x000000fa => "\xde",
      0x000000fb => "\xdb",
      0x000000fc => "\xa1",
      0x000000fd => "\x8d",
      0x000000fe => "\x8e",
      0x000000ff => "\xdf",
      0x0000203e => "\xbc",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x6f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::IBM277 - Conversion routines for IBM277
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for IBM277.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: IBM NLS RM Vol2 SE09-8002-01, March 1990
   alias EBCDIC-CP-DK
   alias EBCDIC-CP-NO
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  0000009C | STRING TERMINATOR (ST)
      05 |  00000009 | CHARACTER TABULATION (HT)
      06 |  00000086 | START OF SELECTED AREA (SSA)
      07 |  0000007F | DELETE (DEL)
      08 |  00000097 | END OF GUARDED AREA (EPA)
      09 |  0000008D | REVERSE LINE FEED (RI)
      0A |  0000008E | SINGLE-SHIFT TWO (SS2)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  0000009D | OPERATING SYSTEM COMMAND (OSC)
      15 |  00000085 | NEXT LINE (NEL)
      16 |  00000008 | BACKSPACE (BS)
      17 |  00000087 | END OF SELECTED AREA (ESA)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  00000092 | PRIVATE USE TWO (PU2)
      1B |  0000008F | SINGLE-SHIFT THREE (SS3)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000080 | PADDING CHARACTER (PAD)
      21 |  00000081 | HIGH OCTET PRESET (HOP)
      22 |  00000082 | BREAK PERMITTED HERE (BPH)
      23 |  00000083 | NO BREAK HERE (NBH)
      24 |  00000084 | INDEX (IND)
      25 |  0000000A | LINE FEED (LF)
      26 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      27 |  0000001B | ESCAPE (ESC)
      28 |  00000088 | CHARACTER TABULATION SET (HTS)
      29 |  00000089 | CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
      2A |  0000008A | LINE TABULATION SET (VTS)
      2B |  0000008B | PARTIAL LINE FORWARD (PLD)
      2C |  0000008C | PARTIAL LINE BACKWARD (PLU)
      2D |  00000005 | ENQUIRY (ENQ)
      2E |  00000006 | ACKNOWLEDGE (ACK)
      2F |  00000007 | BELL (BEL)
      30 |  00000090 | DEVICE CONTROL STRING (DCS)
      31 |  00000091 | PRIVATE USE ONE (PU1)
      32 |  00000016 | SYNCHRONOUS IDLE (SYN)
      33 |  00000093 | SET TRANSMIT STATE (STS)
      34 |  00000094 | CANCEL CHARACTER (CCH)
      35 |  00000095 | MESSAGE WAITING (MW)
      36 |  00000096 | START OF GUARDED AREA (SPA)
      37 |  00000004 | END OF TRANSMISSION (EOT)
      38 |  00000098 | START OF STRING (SOS)
      39 |  00000099 | SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
      3A |  0000009A | SINGLE CHARACTER INTRODUCER (SCI)
      3B |  0000009B | CONTROL SEQUENCE INTRODUCER (CSI)
      3C |  00000014 | DEVICE CONTROL FOUR (DC4)
      3D |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      3E |  0000009E | PRIVACY MESSAGE (PM)
      3F |  0000001A | SUBSTITUTE (SUB)
      40 |  00000020 | SPACE
      41 |  000000A0 | NO-BREAK SPACE
      42 |  000000E2 | LATIN SMALL LETTER A WITH CIRCUMFLEX
      43 |  000000E4 | LATIN SMALL LETTER A WITH DIAERESIS
      44 |  000000E0 | LATIN SMALL LETTER A WITH GRAVE
      45 |  000000E1 | LATIN SMALL LETTER A WITH ACUTE
      46 |  000000E3 | LATIN SMALL LETTER A WITH TILDE
      47 |  0000007D | RIGHT CURLY BRACKET
      48 |  000000E7 | LATIN SMALL LETTER C WITH CEDILLA
      49 |  000000F1 | LATIN SMALL LETTER N WITH TILDE
      4A |  00000023 | NUMBER SIGN
      4B |  0000002E | FULL STOP
      4C |  0000003C | LESS-THAN SIGN
      4D |  00000028 | LEFT PARENTHESIS
      4E |  0000002B | PLUS SIGN
      4F |  00000021 | EXCLAMATION MARK
      50 |  00000026 | AMPERSAND
      51 |  000000E9 | LATIN SMALL LETTER E WITH ACUTE
      52 |  000000EA | LATIN SMALL LETTER E WITH CIRCUMFLEX
      53 |  000000EB | LATIN SMALL LETTER E WITH DIAERESIS
      54 |  000000E8 | LATIN SMALL LETTER E WITH GRAVE
      55 |  000000ED | LATIN SMALL LETTER I WITH ACUTE
      56 |  000000EE | LATIN SMALL LETTER I WITH CIRCUMFLEX
      57 |  000000EF | LATIN SMALL LETTER I WITH DIAERESIS
      58 |  000000EC | LATIN SMALL LETTER I WITH GRAVE
      59 |  000000DF | LATIN SMALL LETTER SHARP S (German)
      5A |  000000A4 | CURRENCY SIGN
      5B |  000000C5 | LATIN CAPITAL LETTER A WITH RING ABOVE
      5C |  0000002A | ASTERISK
      5D |  00000029 | RIGHT PARENTHESIS
      5E |  0000003B | SEMICOLON
      5F |  0000005E | CIRCUMFLEX ACCENT
      60 |  0000002D | HYPHEN-MINUS
      61 |  0000002F | SOLIDUS
      62 |  000000C2 | LATIN CAPITAL LETTER A WITH CIRCUMFLEX
      63 |  000000C4 | LATIN CAPITAL LETTER A WITH DIAERESIS
      64 |  000000C0 | LATIN CAPITAL LETTER A WITH GRAVE
      65 |  000000C1 | LATIN CAPITAL LETTER A WITH ACUTE
      66 |  000000C3 | LATIN CAPITAL LETTER A WITH TILDE
      67 |  00000024 | DOLLAR SIGN
      68 |  000000C7 | LATIN CAPITAL LETTER C WITH CEDILLA
      69 |  000000D1 | LATIN CAPITAL LETTER N WITH TILDE
      6A |  000000F8 | LATIN SMALL LETTER O WITH STROKE
      6B |  0000002C | COMMA
      6C |  00000025 | PERCENT SIGN
      6D |  0000005F | LOW LINE
      6E |  0000003E | GREATER-THAN SIGN
      6F |  0000003F | QUESTION MARK
      70 |  000000A6 | BROKEN BAR
      71 |  000000C9 | LATIN CAPITAL LETTER E WITH ACUTE
      72 |  000000CA | LATIN CAPITAL LETTER E WITH CIRCUMFLEX
      73 |  000000CB | LATIN CAPITAL LETTER E WITH DIAERESIS
      74 |  000000C8 | LATIN CAPITAL LETTER E WITH GRAVE
      75 |  000000CD | LATIN CAPITAL LETTER I WITH ACUTE
      76 |  000000CE | LATIN CAPITAL LETTER I WITH CIRCUMFLEX
      77 |  000000CF | LATIN CAPITAL LETTER I WITH DIAERESIS
      78 |  000000CC | LATIN CAPITAL LETTER I WITH GRAVE
      79 |  00000060 | GRAVE ACCENT
      7A |  0000003A | COLON
      7B |  000000C6 | LATIN CAPITAL LETTER AE
      7C |  000000D8 | LATIN CAPITAL LETTER O WITH STROKE
      7D |  00000027 | APOSTROPHE
      7E |  0000003D | EQUALS SIGN
      7F |  00000022 | QUOTATION MARK
      80 |  00000040 | COMMERCIAL AT
      81 |  00000061 | LATIN SMALL LETTER A
      82 |  00000062 | LATIN SMALL LETTER B
      83 |  00000063 | LATIN SMALL LETTER C
      84 |  00000064 | LATIN SMALL LETTER D
      85 |  00000065 | LATIN SMALL LETTER E
      86 |  00000066 | LATIN SMALL LETTER F
      87 |  00000067 | LATIN SMALL LETTER G
      88 |  00000068 | LATIN SMALL LETTER H
      89 |  00000069 | LATIN SMALL LETTER I
      8A |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
      8B |  000000BB | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
      8C |  000000F0 | LATIN SMALL LETTER ETH (Icelandic)
      8D |  000000FD | LATIN SMALL LETTER Y WITH ACUTE
      8E |  000000FE | LATIN SMALL LETTER THORN (Icelandic)
      8F |  000000B1 | PLUS-MINUS SIGN
      90 |  000000B0 | DEGREE SIGN
      91 |  0000006A | LATIN SMALL LETTER J
      92 |  0000006B | LATIN SMALL LETTER K
      93 |  0000006C | LATIN SMALL LETTER L
      94 |  0000006D | LATIN SMALL LETTER M
      95 |  0000006E | LATIN SMALL LETTER N
      96 |  0000006F | LATIN SMALL LETTER O
      97 |  00000070 | LATIN SMALL LETTER P
      98 |  00000071 | LATIN SMALL LETTER Q
      99 |  00000072 | LATIN SMALL LETTER R
      9A |  000000AA | FEMININE ORDINAL INDICATOR
      9B |  000000BA | MASCULINE ORDINAL INDICATOR
      9C |  0000007B | LEFT CURLY BRACKET
      9D |  000000B8 | CEDILLA
      9E |  0000005B | LEFT SQUARE BRACKET
      9F |  0000005D | RIGHT SQUARE BRACKET
      A0 |  000000B5 | MICRO SIGN
      A1 |  000000FC | LATIN SMALL LETTER U WITH DIAERESIS
      A2 |  00000073 | LATIN SMALL LETTER S
      A3 |  00000074 | LATIN SMALL LETTER T
      A4 |  00000075 | LATIN SMALL LETTER U
      A5 |  00000076 | LATIN SMALL LETTER V
      A6 |  00000077 | LATIN SMALL LETTER W
      A7 |  00000078 | LATIN SMALL LETTER X
      A8 |  00000079 | LATIN SMALL LETTER Y
      A9 |  0000007A | LATIN SMALL LETTER Z
      AA |  000000A1 | INVERTED EXCLAMATION MARK
      AB |  000000BF | INVERTED QUESTION MARK
      AC |  000000D0 | LATIN CAPITAL LETTER ETH (Icelandic)
      AD |  000000DD | LATIN CAPITAL LETTER Y WITH ACUTE
      AE |  000000DE | LATIN CAPITAL LETTER THORN (Icelandic)
      AF |  000000AE | REGISTERED SIGN
      B0 |  000000A2 | CENT SIGN
      B1 |  000000A3 | POUND SIGN
      B2 |  000000A5 | YEN SIGN
      B3 |  000000B7 | MIDDLE DOT
      B4 |  000000A9 | COPYRIGHT SIGN
      B5 |  000000A7 | SECTION SIGN
      B6 |  000000B6 | PILCROW SIGN
      B7 |  000000BC | VULGAR FRACTION ONE QUARTER
      B8 |  000000BD | VULGAR FRACTION ONE HALF
      B9 |  000000BE | VULGAR FRACTION THREE QUARTERS
      BA |  000000AC | NOT SIGN
      BB |  0000007C | VERTICAL LINE
      BC |  0000203E | OVERLINE
      BD |  000000A8 | DIAERESIS
      BE |  000000B4 | ACUTE ACCENT
      BF |  000000D7 | MULTIPLICATION SIGN
      C0 |  000000E6 | LATIN SMALL LETTER AE
      C1 |  00000041 | LATIN CAPITAL LETTER A
      C2 |  00000042 | LATIN CAPITAL LETTER B
      C3 |  00000043 | LATIN CAPITAL LETTER C
      C4 |  00000044 | LATIN CAPITAL LETTER D
      C5 |  00000045 | LATIN CAPITAL LETTER E
      C6 |  00000046 | LATIN CAPITAL LETTER F
      C7 |  00000047 | LATIN CAPITAL LETTER G
      C8 |  00000048 | LATIN CAPITAL LETTER H
      C9 |  00000049 | LATIN CAPITAL LETTER I
      CA |  000000AD | SOFT HYPHEN
      CB |  000000F4 | LATIN SMALL LETTER O WITH CIRCUMFLEX
      CC |  000000F6 | LATIN SMALL LETTER O WITH DIAERESIS
      CD |  000000F2 | LATIN SMALL LETTER O WITH GRAVE
      CE |  000000F3 | LATIN SMALL LETTER O WITH ACUTE
      CF |  000000F5 | LATIN SMALL LETTER O WITH TILDE
      D0 |  000000E5 | LATIN SMALL LETTER A WITH RING ABOVE
      D1 |  0000004A | LATIN CAPITAL LETTER J
      D2 |  0000004B | LATIN CAPITAL LETTER K
      D3 |  0000004C | LATIN CAPITAL LETTER L
      D4 |  0000004D | LATIN CAPITAL LETTER M
      D5 |  0000004E | LATIN CAPITAL LETTER N
      D6 |  0000004F | LATIN CAPITAL LETTER O
      D7 |  00000050 | LATIN CAPITAL LETTER P
      D8 |  00000051 | LATIN CAPITAL LETTER Q
      D9 |  00000052 | LATIN CAPITAL LETTER R
      DA |  000000B9 | SUPERSCRIPT ONE
      DB |  000000FB | LATIN SMALL LETTER U WITH CIRCUMFLEX
      DC |  0000007E | TILDE
      DD |  000000F9 | LATIN SMALL LETTER U WITH GRAVE
      DE |  000000FA | LATIN SMALL LETTER U WITH ACUTE
      DF |  000000FF | LATIN SMALL LETTER Y WITH DIAERESIS
      E0 |  0000005C | REVERSE SOLIDUS
      E1 |  000000F7 | DIVISION SIGN
      E2 |  00000053 | LATIN CAPITAL LETTER S
      E3 |  00000054 | LATIN CAPITAL LETTER T
      E4 |  00000055 | LATIN CAPITAL LETTER U
      E5 |  00000056 | LATIN CAPITAL LETTER V
      E6 |  00000057 | LATIN CAPITAL LETTER W
      E7 |  00000058 | LATIN CAPITAL LETTER X
      E8 |  00000059 | LATIN CAPITAL LETTER Y
      E9 |  0000005A | LATIN CAPITAL LETTER Z
      EA |  000000B2 | SUPERSCRIPT TWO
      EB |  000000D4 | LATIN CAPITAL LETTER O WITH CIRCUMFLEX
      EC |  000000D6 | LATIN CAPITAL LETTER O WITH DIAERESIS
      ED |  000000D2 | LATIN CAPITAL LETTER O WITH GRAVE
      EE |  000000D3 | LATIN CAPITAL LETTER O WITH ACUTE
      EF |  000000D5 | LATIN CAPITAL LETTER O WITH TILDE
      F0 |  00000030 | DIGIT ZERO
      F1 |  00000031 | DIGIT ONE
      F2 |  00000032 | DIGIT TWO
      F3 |  00000033 | DIGIT THREE
      F4 |  00000034 | DIGIT FOUR
      F5 |  00000035 | DIGIT FIVE
      F6 |  00000036 | DIGIT SIX
      F7 |  00000037 | DIGIT SEVEN
      F8 |  00000038 | DIGIT EIGHT
      F9 |  00000039 | DIGIT NINE
      FA |  000000B3 | SUPERSCRIPT THREE
      FB |  000000DB | LATIN CAPITAL LETTER U WITH CIRCUMFLEX
      FC |  000000DC | LATIN CAPITAL LETTER U WITH DIAERESIS
      FD |  000000D9 | LATIN CAPITAL LETTER U WITH GRAVE
      FE |  000000DA | LATIN CAPITAL LETTER U WITH ACUTE
      FF |  0000009F | APPLICATION PROGRAM COMMAND (APC)
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_IBM277

    $main::fatpacked{"Locale/RecodeData/IBM278.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_IBM278';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for IBM278.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::IBM278;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x009c,
      0x0009,
      0x0086,
      0x007f,
      0x0097,
      0x008d,
      0x008e,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x009d,
      0x0085,
      0x0008,
      0x0087,
      0x0018,
      0x0019,
      0x0092,
      0x008f,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0080,
      0x0081,
      0x0082,
      0x0083,
      0x0084,
      0x000a,
      0x0017,
      0x001b,
      0x0088,
      0x0089,
      0x008a,
      0x008b,
      0x008c,
      0x0005,
      0x0006,
      0x0007,
      0x0090,
      0x0091,
      0x0016,
      0x0093,
      0x0094,
      0x0095,
      0x0096,
      0x0004,
      0x0098,
      0x0099,
      0x009a,
      0x009b,
      0x0014,
      0x0015,
      0x009e,
      0x001a,
      0x0020,
      0x00a0,
      0x00e2,
      0x007b,
      0x00e0,
      0x00e1,
      0x00e3,
      0x007d,
      0x00e7,
      0x00f1,
      0x00a7,
      0x002e,
      0x003c,
      0x0028,
      0x002b,
      0x0021,
      0x0026,
      0x0060,
      0x00ea,
      0x00eb,
      0x00e8,
      0x00ed,
      0x00ee,
      0x00ef,
      0x00ec,
      0x00df,
      0x00a4,
      0x00c5,
      0x002a,
      0x0029,
      0x003b,
      0x005e,
      0x002d,
      0x002f,
      0x00c2,
      0x0023,
      0x00c0,
      0x00c1,
      0x00c3,
      0x0024,
      0x00c7,
      0x00d1,
      0x00f6,
      0x002c,
      0x0025,
      0x005f,
      0x003e,
      0x003f,
      0x00f8,
      0x00c9,
      0x00ca,
      0x00cb,
      0x00c8,
      0x00cd,
      0x00ce,
      0x00cf,
      0x00cc,
      0x00e9,
      0x003a,
      0x00c4,
      0x00d6,
      0x0027,
      0x003d,
      0x0022,
      0x00d8,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x00ab,
      0x00bb,
      0x00f0,
      0x00fd,
      0x00fe,
      0x00b1,
      0x00b0,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x00aa,
      0x00ba,
      0x00e6,
      0x00b8,
      0x00c6,
      0x005d,
      0x00b5,
      0x00fc,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x00a1,
      0x00bf,
      0x00d0,
      0x00dd,
      0x00de,
      0x00ae,
      0x00a2,
      0x00a3,
      0x00a5,
      0x00b7,
      0x00a9,
      0x005b,
      0x00b6,
      0x00bc,
      0x00bd,
      0x00be,
      0x00ac,
      0x007c,
      0x203e,
      0x00a8,
      0x00b4,
      0x00d7,
      0x00e4,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x00ad,
      0x00f4,
      0x00a6,
      0x00f2,
      0x00f3,
      0x00f5,
      0x00e5,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x00b9,
      0x00fb,
      0x007e,
      0x00f9,
      0x00fa,
      0x00ff,
      0x005c,
      0x00f7,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x00b2,
      0x00d4,
      0x0040,
      0x00d2,
      0x00d3,
      0x00d5,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x00b3,
      0x00db,
      0x00dc,
      0x00d9,
      0x00da,
      0x009f,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\xc2\x9c",
      "\x09",
      "\xc2\x86",
      "\x7f",
      "\xc2\x97",
      "\xc2\x8d",
      "\xc2\x8e",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\xc2\x9d",
      "\xc2\x85",
      "\x08",
      "\xc2\x87",
      "\x18",
      "\x19",
      "\xc2\x92",
      "\xc2\x8f",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\xc2\x80",
      "\xc2\x81",
      "\xc2\x82",
      "\xc2\x83",
      "\xc2\x84",
      "\x0a",
      "\x17",
      "\x1b",
      "\xc2\x88",
      "\xc2\x89",
      "\xc2\x8a",
      "\xc2\x8b",
      "\xc2\x8c",
      "\x05",
      "\x06",
      "\x07",
      "\xc2\x90",
      "\xc2\x91",
      "\x16",
      "\xc2\x93",
      "\xc2\x94",
      "\xc2\x95",
      "\xc2\x96",
      "\x04",
      "\xc2\x98",
      "\xc2\x99",
      "\xc2\x9a",
      "\xc2\x9b",
      "\x14",
      "\x15",
      "\xc2\x9e",
      "\x1a",
      "\x20",
      "\xc2\xa0",
      "\xc3\xa2",
      "\x7b",
      "\xc3\xa0",
      "\xc3\xa1",
      "\xc3\xa3",
      "\x7d",
      "\xc3\xa7",
      "\xc3\xb1",
      "\xc2\xa7",
      "\x2e",
      "\x3c",
      "\x28",
      "\x2b",
      "\x21",
      "\x26",
      "\x60",
      "\xc3\xaa",
      "\xc3\xab",
      "\xc3\xa8",
      "\xc3\xad",
      "\xc3\xae",
      "\xc3\xaf",
      "\xc3\xac",
      "\xc3\x9f",
      "\xc2\xa4",
      "\xc3\x85",
      "\x2a",
      "\x29",
      "\x3b",
      "\x5e",
      "\x2d",
      "\x2f",
      "\xc3\x82",
      "\x23",
      "\xc3\x80",
      "\xc3\x81",
      "\xc3\x83",
      "\x24",
      "\xc3\x87",
      "\xc3\x91",
      "\xc3\xb6",
      "\x2c",
      "\x25",
      "\x5f",
      "\x3e",
      "\x3f",
      "\xc3\xb8",
      "\xc3\x89",
      "\xc3\x8a",
      "\xc3\x8b",
      "\xc3\x88",
      "\xc3\x8d",
      "\xc3\x8e",
      "\xc3\x8f",
      "\xc3\x8c",
      "\xc3\xa9",
      "\x3a",
      "\xc3\x84",
      "\xc3\x96",
      "\x27",
      "\x3d",
      "\x22",
      "\xc3\x98",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\xc2\xab",
      "\xc2\xbb",
      "\xc3\xb0",
      "\xc3\xbd",
      "\xc3\xbe",
      "\xc2\xb1",
      "\xc2\xb0",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\xc2\xaa",
      "\xc2\xba",
      "\xc3\xa6",
      "\xc2\xb8",
      "\xc3\x86",
      "\x5d",
      "\xc2\xb5",
      "\xc3\xbc",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\xc2\xa1",
      "\xc2\xbf",
      "\xc3\x90",
      "\xc3\x9d",
      "\xc3\x9e",
      "\xc2\xae",
      "\xc2\xa2",
      "\xc2\xa3",
      "\xc2\xa5",
      "\xc2\xb7",
      "\xc2\xa9",
      "\x5b",
      "\xc2\xb6",
      "\xc2\xbc",
      "\xc2\xbd",
      "\xc2\xbe",
      "\xc2\xac",
      "\x7c",
      "\xe2\x80\xbe",
      "\xc2\xa8",
      "\xc2\xb4",
      "\xc3\x97",
      "\xc3\xa4",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\xc2\xad",
      "\xc3\xb4",
      "\xc2\xa6",
      "\xc3\xb2",
      "\xc3\xb3",
      "\xc3\xb5",
      "\xc3\xa5",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\xc2\xb9",
      "\xc3\xbb",
      "\x7e",
      "\xc3\xb9",
      "\xc3\xba",
      "\xc3\xbf",
      "\x5c",
      "\xc3\xb7",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\xc2\xb2",
      "\xc3\x94",
      "\x40",
      "\xc3\x92",
      "\xc3\x93",
      "\xc3\x95",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\xc2\xb3",
      "\xc3\x9b",
      "\xc3\x9c",
      "\xc3\x99",
      "\xc3\x9a",
      "\xc2\x9f",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x37",
      0x00000005 => "\x2d",
      0x00000006 => "\x2e",
      0x00000007 => "\x2f",
      0x00000008 => "\x16",
      0x00000009 => "\x05",
      0x0000000a => "\x25",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x3c",
      0x00000015 => "\x3d",
      0x00000016 => "\x32",
      0x00000017 => "\x26",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x3f",
      0x0000001b => "\x27",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x40",
      0x00000021 => "\x4f",
      0x00000022 => "\x7f",
      0x00000023 => "\x63",
      0x00000024 => "\x67",
      0x00000025 => "\x6c",
      0x00000026 => "\x50",
      0x00000027 => "\x7d",
      0x00000028 => "\x4d",
      0x00000029 => "\x5d",
      0x0000002a => "\x5c",
      0x0000002b => "\x4e",
      0x0000002c => "\x6b",
      0x0000002d => "\x60",
      0x0000002e => "\x4b",
      0x0000002f => "\x61",
      0x00000030 => "\xf0",
      0x00000031 => "\xf1",
      0x00000032 => "\xf2",
      0x00000033 => "\xf3",
      0x00000034 => "\xf4",
      0x00000035 => "\xf5",
      0x00000036 => "\xf6",
      0x00000037 => "\xf7",
      0x00000038 => "\xf8",
      0x00000039 => "\xf9",
      0x0000003a => "\x7a",
      0x0000003b => "\x5e",
      0x0000003c => "\x4c",
      0x0000003d => "\x7e",
      0x0000003e => "\x6e",
      0x0000003f => "\x6f",
      0x00000040 => "\xec",
      0x00000041 => "\xc1",
      0x00000042 => "\xc2",
      0x00000043 => "\xc3",
      0x00000044 => "\xc4",
      0x00000045 => "\xc5",
      0x00000046 => "\xc6",
      0x00000047 => "\xc7",
      0x00000048 => "\xc8",
      0x00000049 => "\xc9",
      0x0000004a => "\xd1",
      0x0000004b => "\xd2",
      0x0000004c => "\xd3",
      0x0000004d => "\xd4",
      0x0000004e => "\xd5",
      0x0000004f => "\xd6",
      0x00000050 => "\xd7",
      0x00000051 => "\xd8",
      0x00000052 => "\xd9",
      0x00000053 => "\xe2",
      0x00000054 => "\xe3",
      0x00000055 => "\xe4",
      0x00000056 => "\xe5",
      0x00000057 => "\xe6",
      0x00000058 => "\xe7",
      0x00000059 => "\xe8",
      0x0000005a => "\xe9",
      0x0000005b => "\xb5",
      0x0000005c => "\xe0",
      0x0000005d => "\x9f",
      0x0000005e => "\x5f",
      0x0000005f => "\x6d",
      0x00000060 => "\x51",
      0x00000061 => "\x81",
      0x00000062 => "\x82",
      0x00000063 => "\x83",
      0x00000064 => "\x84",
      0x00000065 => "\x85",
      0x00000066 => "\x86",
      0x00000067 => "\x87",
      0x00000068 => "\x88",
      0x00000069 => "\x89",
      0x0000006a => "\x91",
      0x0000006b => "\x92",
      0x0000006c => "\x93",
      0x0000006d => "\x94",
      0x0000006e => "\x95",
      0x0000006f => "\x96",
      0x00000070 => "\x97",
      0x00000071 => "\x98",
      0x00000072 => "\x99",
      0x00000073 => "\xa2",
      0x00000074 => "\xa3",
      0x00000075 => "\xa4",
      0x00000076 => "\xa5",
      0x00000077 => "\xa6",
      0x00000078 => "\xa7",
      0x00000079 => "\xa8",
      0x0000007a => "\xa9",
      0x0000007b => "\x43",
      0x0000007c => "\xbb",
      0x0000007d => "\x47",
      0x0000007e => "\xdc",
      0x0000007f => "\x07",
      0x00000080 => "\x20",
      0x00000081 => "\x21",
      0x00000082 => "\x22",
      0x00000083 => "\x23",
      0x00000084 => "\x24",
      0x00000085 => "\x15",
      0x00000086 => "\x06",
      0x00000087 => "\x17",
      0x00000088 => "\x28",
      0x00000089 => "\x29",
      0x0000008a => "\x2a",
      0x0000008b => "\x2b",
      0x0000008c => "\x2c",
      0x0000008d => "\x09",
      0x0000008e => "\x0a",
      0x0000008f => "\x1b",
      0x00000090 => "\x30",
      0x00000091 => "\x31",
      0x00000092 => "\x1a",
      0x00000093 => "\x33",
      0x00000094 => "\x34",
      0x00000095 => "\x35",
      0x00000096 => "\x36",
      0x00000097 => "\x08",
      0x00000098 => "\x38",
      0x00000099 => "\x39",
      0x0000009a => "\x3a",
      0x0000009b => "\x3b",
      0x0000009c => "\x04",
      0x0000009d => "\x14",
      0x0000009e => "\x3e",
      0x0000009f => "\xff",
      0x000000a0 => "\x41",
      0x000000a1 => "\xaa",
      0x000000a2 => "\xb0",
      0x000000a3 => "\xb1",
      0x000000a4 => "\x5a",
      0x000000a5 => "\xb2",
      0x000000a6 => "\xcc",
      0x000000a7 => "\x4a",
      0x000000a8 => "\xbd",
      0x000000a9 => "\xb4",
      0x000000aa => "\x9a",
      0x000000ab => "\x8a",
      0x000000ac => "\xba",
      0x000000ad => "\xca",
      0x000000ae => "\xaf",
      0x000000b0 => "\x90",
      0x000000b1 => "\x8f",
      0x000000b2 => "\xea",
      0x000000b3 => "\xfa",
      0x000000b4 => "\xbe",
      0x000000b5 => "\xa0",
      0x000000b6 => "\xb6",
      0x000000b7 => "\xb3",
      0x000000b8 => "\x9d",
      0x000000b9 => "\xda",
      0x000000ba => "\x9b",
      0x000000bb => "\x8b",
      0x000000bc => "\xb7",
      0x000000bd => "\xb8",
      0x000000be => "\xb9",
      0x000000bf => "\xab",
      0x000000c0 => "\x64",
      0x000000c1 => "\x65",
      0x000000c2 => "\x62",
      0x000000c3 => "\x66",
      0x000000c4 => "\x7b",
      0x000000c5 => "\x5b",
      0x000000c6 => "\x9e",
      0x000000c7 => "\x68",
      0x000000c8 => "\x74",
      0x000000c9 => "\x71",
      0x000000ca => "\x72",
      0x000000cb => "\x73",
      0x000000cc => "\x78",
      0x000000cd => "\x75",
      0x000000ce => "\x76",
      0x000000cf => "\x77",
      0x000000d0 => "\xac",
      0x000000d1 => "\x69",
      0x000000d2 => "\xed",
      0x000000d3 => "\xee",
      0x000000d4 => "\xeb",
      0x000000d5 => "\xef",
      0x000000d6 => "\x7c",
      0x000000d7 => "\xbf",
      0x000000d8 => "\x80",
      0x000000d9 => "\xfd",
      0x000000da => "\xfe",
      0x000000db => "\xfb",
      0x000000dc => "\xfc",
      0x000000dd => "\xad",
      0x000000de => "\xae",
      0x000000df => "\x59",
      0x000000e0 => "\x44",
      0x000000e1 => "\x45",
      0x000000e2 => "\x42",
      0x000000e3 => "\x46",
      0x000000e4 => "\xc0",
      0x000000e5 => "\xd0",
      0x000000e6 => "\x9c",
      0x000000e7 => "\x48",
      0x000000e8 => "\x54",
      0x000000e9 => "\x79",
      0x000000ea => "\x52",
      0x000000eb => "\x53",
      0x000000ec => "\x58",
      0x000000ed => "\x55",
      0x000000ee => "\x56",
      0x000000ef => "\x57",
      0x000000f0 => "\x8c",
      0x000000f1 => "\x49",
      0x000000f2 => "\xcd",
      0x000000f3 => "\xce",
      0x000000f4 => "\xcb",
      0x000000f5 => "\xcf",
      0x000000f6 => "\x6a",
      0x000000f7 => "\xe1",
      0x000000f8 => "\x70",
      0x000000f9 => "\xdd",
      0x000000fa => "\xde",
      0x000000fb => "\xdb",
      0x000000fc => "\xa1",
      0x000000fd => "\x8d",
      0x000000fe => "\x8e",
      0x000000ff => "\xdf",
      0x0000203e => "\xbc",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x6f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::IBM278 - Conversion routines for IBM278
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for IBM278.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: IBM NLS RM Vol2 SE09-8002-01, March 1990
   alias CP278
   alias EBCDIC-CP-FI
   alias EBCDIC-CP-SE
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  0000009C | STRING TERMINATOR (ST)
      05 |  00000009 | CHARACTER TABULATION (HT)
      06 |  00000086 | START OF SELECTED AREA (SSA)
      07 |  0000007F | DELETE (DEL)
      08 |  00000097 | END OF GUARDED AREA (EPA)
      09 |  0000008D | REVERSE LINE FEED (RI)
      0A |  0000008E | SINGLE-SHIFT TWO (SS2)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  0000009D | OPERATING SYSTEM COMMAND (OSC)
      15 |  00000085 | NEXT LINE (NEL)
      16 |  00000008 | BACKSPACE (BS)
      17 |  00000087 | END OF SELECTED AREA (ESA)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  00000092 | PRIVATE USE TWO (PU2)
      1B |  0000008F | SINGLE-SHIFT THREE (SS3)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000080 | PADDING CHARACTER (PAD)
      21 |  00000081 | HIGH OCTET PRESET (HOP)
      22 |  00000082 | BREAK PERMITTED HERE (BPH)
      23 |  00000083 | NO BREAK HERE (NBH)
      24 |  00000084 | INDEX (IND)
      25 |  0000000A | LINE FEED (LF)
      26 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      27 |  0000001B | ESCAPE (ESC)
      28 |  00000088 | CHARACTER TABULATION SET (HTS)
      29 |  00000089 | CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
      2A |  0000008A | LINE TABULATION SET (VTS)
      2B |  0000008B | PARTIAL LINE FORWARD (PLD)
      2C |  0000008C | PARTIAL LINE BACKWARD (PLU)
      2D |  00000005 | ENQUIRY (ENQ)
      2E |  00000006 | ACKNOWLEDGE (ACK)
      2F |  00000007 | BELL (BEL)
      30 |  00000090 | DEVICE CONTROL STRING (DCS)
      31 |  00000091 | PRIVATE USE ONE (PU1)
      32 |  00000016 | SYNCHRONOUS IDLE (SYN)
      33 |  00000093 | SET TRANSMIT STATE (STS)
      34 |  00000094 | CANCEL CHARACTER (CCH)
      35 |  00000095 | MESSAGE WAITING (MW)
      36 |  00000096 | START OF GUARDED AREA (SPA)
      37 |  00000004 | END OF TRANSMISSION (EOT)
      38 |  00000098 | START OF STRING (SOS)
      39 |  00000099 | SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
      3A |  0000009A | SINGLE CHARACTER INTRODUCER (SCI)
      3B |  0000009B | CONTROL SEQUENCE INTRODUCER (CSI)
      3C |  00000014 | DEVICE CONTROL FOUR (DC4)
      3D |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      3E |  0000009E | PRIVACY MESSAGE (PM)
      3F |  0000001A | SUBSTITUTE (SUB)
      40 |  00000020 | SPACE
      41 |  000000A0 | NO-BREAK SPACE
      42 |  000000E2 | LATIN SMALL LETTER A WITH CIRCUMFLEX
      43 |  0000007B | LEFT CURLY BRACKET
      44 |  000000E0 | LATIN SMALL LETTER A WITH GRAVE
      45 |  000000E1 | LATIN SMALL LETTER A WITH ACUTE
      46 |  000000E3 | LATIN SMALL LETTER A WITH TILDE
      47 |  0000007D | RIGHT CURLY BRACKET
      48 |  000000E7 | LATIN SMALL LETTER C WITH CEDILLA
      49 |  000000F1 | LATIN SMALL LETTER N WITH TILDE
      4A |  000000A7 | SECTION SIGN
      4B |  0000002E | FULL STOP
      4C |  0000003C | LESS-THAN SIGN
      4D |  00000028 | LEFT PARENTHESIS
      4E |  0000002B | PLUS SIGN
      4F |  00000021 | EXCLAMATION MARK
      50 |  00000026 | AMPERSAND
      51 |  00000060 | GRAVE ACCENT
      52 |  000000EA | LATIN SMALL LETTER E WITH CIRCUMFLEX
      53 |  000000EB | LATIN SMALL LETTER E WITH DIAERESIS
      54 |  000000E8 | LATIN SMALL LETTER E WITH GRAVE
      55 |  000000ED | LATIN SMALL LETTER I WITH ACUTE
      56 |  000000EE | LATIN SMALL LETTER I WITH CIRCUMFLEX
      57 |  000000EF | LATIN SMALL LETTER I WITH DIAERESIS
      58 |  000000EC | LATIN SMALL LETTER I WITH GRAVE
      59 |  000000DF | LATIN SMALL LETTER SHARP S (German)
      5A |  000000A4 | CURRENCY SIGN
      5B |  000000C5 | LATIN CAPITAL LETTER A WITH RING ABOVE
      5C |  0000002A | ASTERISK
      5D |  00000029 | RIGHT PARENTHESIS
      5E |  0000003B | SEMICOLON
      5F |  0000005E | CIRCUMFLEX ACCENT
      60 |  0000002D | HYPHEN-MINUS
      61 |  0000002F | SOLIDUS
      62 |  000000C2 | LATIN CAPITAL LETTER A WITH CIRCUMFLEX
      63 |  00000023 | NUMBER SIGN
      64 |  000000C0 | LATIN CAPITAL LETTER A WITH GRAVE
      65 |  000000C1 | LATIN CAPITAL LETTER A WITH ACUTE
      66 |  000000C3 | LATIN CAPITAL LETTER A WITH TILDE
      67 |  00000024 | DOLLAR SIGN
      68 |  000000C7 | LATIN CAPITAL LETTER C WITH CEDILLA
      69 |  000000D1 | LATIN CAPITAL LETTER N WITH TILDE
      6A |  000000F6 | LATIN SMALL LETTER O WITH DIAERESIS
      6B |  0000002C | COMMA
      6C |  00000025 | PERCENT SIGN
      6D |  0000005F | LOW LINE
      6E |  0000003E | GREATER-THAN SIGN
      6F |  0000003F | QUESTION MARK
      70 |  000000F8 | LATIN SMALL LETTER O WITH STROKE
      71 |  000000C9 | LATIN CAPITAL LETTER E WITH ACUTE
      72 |  000000CA | LATIN CAPITAL LETTER E WITH CIRCUMFLEX
      73 |  000000CB | LATIN CAPITAL LETTER E WITH DIAERESIS
      74 |  000000C8 | LATIN CAPITAL LETTER E WITH GRAVE
      75 |  000000CD | LATIN CAPITAL LETTER I WITH ACUTE
      76 |  000000CE | LATIN CAPITAL LETTER I WITH CIRCUMFLEX
      77 |  000000CF | LATIN CAPITAL LETTER I WITH DIAERESIS
      78 |  000000CC | LATIN CAPITAL LETTER I WITH GRAVE
      79 |  000000E9 | LATIN SMALL LETTER E WITH ACUTE
      7A |  0000003A | COLON
      7B |  000000C4 | LATIN CAPITAL LETTER A WITH DIAERESIS
      7C |  000000D6 | LATIN CAPITAL LETTER O WITH DIAERESIS
      7D |  00000027 | APOSTROPHE
      7E |  0000003D | EQUALS SIGN
      7F |  00000022 | QUOTATION MARK
      80 |  000000D8 | LATIN CAPITAL LETTER O WITH STROKE
      81 |  00000061 | LATIN SMALL LETTER A
      82 |  00000062 | LATIN SMALL LETTER B
      83 |  00000063 | LATIN SMALL LETTER C
      84 |  00000064 | LATIN SMALL LETTER D
      85 |  00000065 | LATIN SMALL LETTER E
      86 |  00000066 | LATIN SMALL LETTER F
      87 |  00000067 | LATIN SMALL LETTER G
      88 |  00000068 | LATIN SMALL LETTER H
      89 |  00000069 | LATIN SMALL LETTER I
      8A |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
      8B |  000000BB | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
      8C |  000000F0 | LATIN SMALL LETTER ETH (Icelandic)
      8D |  000000FD | LATIN SMALL LETTER Y WITH ACUTE
      8E |  000000FE | LATIN SMALL LETTER THORN (Icelandic)
      8F |  000000B1 | PLUS-MINUS SIGN
      90 |  000000B0 | DEGREE SIGN
      91 |  0000006A | LATIN SMALL LETTER J
      92 |  0000006B | LATIN SMALL LETTER K
      93 |  0000006C | LATIN SMALL LETTER L
      94 |  0000006D | LATIN SMALL LETTER M
      95 |  0000006E | LATIN SMALL LETTER N
      96 |  0000006F | LATIN SMALL LETTER O
      97 |  00000070 | LATIN SMALL LETTER P
      98 |  00000071 | LATIN SMALL LETTER Q
      99 |  00000072 | LATIN SMALL LETTER R
      9A |  000000AA | FEMININE ORDINAL INDICATOR
      9B |  000000BA | MASCULINE ORDINAL INDICATOR
      9C |  000000E6 | LATIN SMALL LETTER AE
      9D |  000000B8 | CEDILLA
      9E |  000000C6 | LATIN CAPITAL LETTER AE
      9F |  0000005D | RIGHT SQUARE BRACKET
      A0 |  000000B5 | MICRO SIGN
      A1 |  000000FC | LATIN SMALL LETTER U WITH DIAERESIS
      A2 |  00000073 | LATIN SMALL LETTER S
      A3 |  00000074 | LATIN SMALL LETTER T
      A4 |  00000075 | LATIN SMALL LETTER U
      A5 |  00000076 | LATIN SMALL LETTER V
      A6 |  00000077 | LATIN SMALL LETTER W
      A7 |  00000078 | LATIN SMALL LETTER X
      A8 |  00000079 | LATIN SMALL LETTER Y
      A9 |  0000007A | LATIN SMALL LETTER Z
      AA |  000000A1 | INVERTED EXCLAMATION MARK
      AB |  000000BF | INVERTED QUESTION MARK
      AC |  000000D0 | LATIN CAPITAL LETTER ETH (Icelandic)
      AD |  000000DD | LATIN CAPITAL LETTER Y WITH ACUTE
      AE |  000000DE | LATIN CAPITAL LETTER THORN (Icelandic)
      AF |  000000AE | REGISTERED SIGN
      B0 |  000000A2 | CENT SIGN
      B1 |  000000A3 | POUND SIGN
      B2 |  000000A5 | YEN SIGN
      B3 |  000000B7 | MIDDLE DOT
      B4 |  000000A9 | COPYRIGHT SIGN
      B5 |  0000005B | LEFT SQUARE BRACKET
      B6 |  000000B6 | PILCROW SIGN
      B7 |  000000BC | VULGAR FRACTION ONE QUARTER
      B8 |  000000BD | VULGAR FRACTION ONE HALF
      B9 |  000000BE | VULGAR FRACTION THREE QUARTERS
      BA |  000000AC | NOT SIGN
      BB |  0000007C | VERTICAL LINE
      BC |  0000203E | OVERLINE
      BD |  000000A8 | DIAERESIS
      BE |  000000B4 | ACUTE ACCENT
      BF |  000000D7 | MULTIPLICATION SIGN
      C0 |  000000E4 | LATIN SMALL LETTER A WITH DIAERESIS
      C1 |  00000041 | LATIN CAPITAL LETTER A
      C2 |  00000042 | LATIN CAPITAL LETTER B
      C3 |  00000043 | LATIN CAPITAL LETTER C
      C4 |  00000044 | LATIN CAPITAL LETTER D
      C5 |  00000045 | LATIN CAPITAL LETTER E
      C6 |  00000046 | LATIN CAPITAL LETTER F
      C7 |  00000047 | LATIN CAPITAL LETTER G
      C8 |  00000048 | LATIN CAPITAL LETTER H
      C9 |  00000049 | LATIN CAPITAL LETTER I
      CA |  000000AD | SOFT HYPHEN
      CB |  000000F4 | LATIN SMALL LETTER O WITH CIRCUMFLEX
      CC |  000000A6 | BROKEN BAR
      CD |  000000F2 | LATIN SMALL LETTER O WITH GRAVE
      CE |  000000F3 | LATIN SMALL LETTER O WITH ACUTE
      CF |  000000F5 | LATIN SMALL LETTER O WITH TILDE
      D0 |  000000E5 | LATIN SMALL LETTER A WITH RING ABOVE
      D1 |  0000004A | LATIN CAPITAL LETTER J
      D2 |  0000004B | LATIN CAPITAL LETTER K
      D3 |  0000004C | LATIN CAPITAL LETTER L
      D4 |  0000004D | LATIN CAPITAL LETTER M
      D5 |  0000004E | LATIN CAPITAL LETTER N
      D6 |  0000004F | LATIN CAPITAL LETTER O
      D7 |  00000050 | LATIN CAPITAL LETTER P
      D8 |  00000051 | LATIN CAPITAL LETTER Q
      D9 |  00000052 | LATIN CAPITAL LETTER R
      DA |  000000B9 | SUPERSCRIPT ONE
      DB |  000000FB | LATIN SMALL LETTER U WITH CIRCUMFLEX
      DC |  0000007E | TILDE
      DD |  000000F9 | LATIN SMALL LETTER U WITH GRAVE
      DE |  000000FA | LATIN SMALL LETTER U WITH ACUTE
      DF |  000000FF | LATIN SMALL LETTER Y WITH DIAERESIS
      E0 |  0000005C | REVERSE SOLIDUS
      E1 |  000000F7 | DIVISION SIGN
      E2 |  00000053 | LATIN CAPITAL LETTER S
      E3 |  00000054 | LATIN CAPITAL LETTER T
      E4 |  00000055 | LATIN CAPITAL LETTER U
      E5 |  00000056 | LATIN CAPITAL LETTER V
      E6 |  00000057 | LATIN CAPITAL LETTER W
      E7 |  00000058 | LATIN CAPITAL LETTER X
      E8 |  00000059 | LATIN CAPITAL LETTER Y
      E9 |  0000005A | LATIN CAPITAL LETTER Z
      EA |  000000B2 | SUPERSCRIPT TWO
      EB |  000000D4 | LATIN CAPITAL LETTER O WITH CIRCUMFLEX
      EC |  00000040 | COMMERCIAL AT
      ED |  000000D2 | LATIN CAPITAL LETTER O WITH GRAVE
      EE |  000000D3 | LATIN CAPITAL LETTER O WITH ACUTE
      EF |  000000D5 | LATIN CAPITAL LETTER O WITH TILDE
      F0 |  00000030 | DIGIT ZERO
      F1 |  00000031 | DIGIT ONE
      F2 |  00000032 | DIGIT TWO
      F3 |  00000033 | DIGIT THREE
      F4 |  00000034 | DIGIT FOUR
      F5 |  00000035 | DIGIT FIVE
      F6 |  00000036 | DIGIT SIX
      F7 |  00000037 | DIGIT SEVEN
      F8 |  00000038 | DIGIT EIGHT
      F9 |  00000039 | DIGIT NINE
      FA |  000000B3 | SUPERSCRIPT THREE
      FB |  000000DB | LATIN CAPITAL LETTER U WITH CIRCUMFLEX
      FC |  000000DC | LATIN CAPITAL LETTER U WITH DIAERESIS
      FD |  000000D9 | LATIN CAPITAL LETTER U WITH GRAVE
      FE |  000000DA | LATIN CAPITAL LETTER U WITH ACUTE
      FF |  0000009F | APPLICATION PROGRAM COMMAND (APC)
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_IBM278

    $main::fatpacked{"Locale/RecodeData/IBM280.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_IBM280';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for IBM280.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::IBM280;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x009c,
      0x0009,
      0x0086,
      0x007f,
      0x0097,
      0x008d,
      0x008e,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x009d,
      0x0085,
      0x0008,
      0x0087,
      0x0018,
      0x0019,
      0x0092,
      0x008f,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0080,
      0x0081,
      0x0082,
      0x0083,
      0x0084,
      0x000a,
      0x0017,
      0x001b,
      0x0088,
      0x0089,
      0x008a,
      0x008b,
      0x008c,
      0x0005,
      0x0006,
      0x0007,
      0x0090,
      0x0091,
      0x0016,
      0x0093,
      0x0094,
      0x0095,
      0x0096,
      0x0004,
      0x0098,
      0x0099,
      0x009a,
      0x009b,
      0x0014,
      0x0015,
      0x009e,
      0x001a,
      0x0020,
      0x00a0,
      0x00e2,
      0x00e4,
      0x007b,
      0x00e1,
      0x00e3,
      0x00e5,
      0x005c,
      0x00f1,
      0x00b0,
      0x002e,
      0x003c,
      0x0028,
      0x002b,
      0x0021,
      0x0026,
      0x005d,
      0x00ea,
      0x00eb,
      0x007d,
      0x00ed,
      0x00ee,
      0x00ef,
      0x007e,
      0x00df,
      0x00e9,
      0x0024,
      0x002a,
      0x0029,
      0x003b,
      0x005e,
      0x002d,
      0x002f,
      0x00c2,
      0x00c4,
      0x00c0,
      0x00c1,
      0x00c3,
      0x00c5,
      0x00c7,
      0x00d1,
      0x00f2,
      0x002c,
      0x0025,
      0x005f,
      0x003e,
      0x003f,
      0x00f8,
      0x00c9,
      0x00ca,
      0x00cb,
      0x00c8,
      0x00cd,
      0x00ce,
      0x00cf,
      0x00cc,
      0x00f9,
      0x003a,
      0x00a3,
      0x00a7,
      0x0027,
      0x003d,
      0x0022,
      0x00d8,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x00ab,
      0x00bb,
      0x00f0,
      0x00fd,
      0x00fe,
      0x00b1,
      0x005b,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x00aa,
      0x00ba,
      0x00e6,
      0x00b8,
      0x00c6,
      0x00a4,
      0x00b5,
      0x00ec,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x00a1,
      0x00bf,
      0x00d0,
      0x00dd,
      0x00de,
      0x00ae,
      0x00a2,
      0x0023,
      0x00a5,
      0x00b7,
      0x00a9,
      0x0040,
      0x00b6,
      0x00bc,
      0x00bd,
      0x00be,
      0x00ac,
      0x007c,
      0x203e,
      0x00a8,
      0x00b4,
      0x00d7,
      0x00e0,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x00ad,
      0x00f4,
      0x00f6,
      0x00a6,
      0x00f3,
      0x00f5,
      0x00e8,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x00b9,
      0x00fb,
      0x00fc,
      0x0060,
      0x00fa,
      0x00ff,
      0x00e7,
      0x00f7,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x00b2,
      0x00d4,
      0x00d6,
      0x00d2,
      0x00d3,
      0x00d5,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x00b3,
      0x00db,
      0x00dc,
      0x00d9,
      0x00da,
      0x009f,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\xc2\x9c",
      "\x09",
      "\xc2\x86",
      "\x7f",
      "\xc2\x97",
      "\xc2\x8d",
      "\xc2\x8e",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\xc2\x9d",
      "\xc2\x85",
      "\x08",
      "\xc2\x87",
      "\x18",
      "\x19",
      "\xc2\x92",
      "\xc2\x8f",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\xc2\x80",
      "\xc2\x81",
      "\xc2\x82",
      "\xc2\x83",
      "\xc2\x84",
      "\x0a",
      "\x17",
      "\x1b",
      "\xc2\x88",
      "\xc2\x89",
      "\xc2\x8a",
      "\xc2\x8b",
      "\xc2\x8c",
      "\x05",
      "\x06",
      "\x07",
      "\xc2\x90",
      "\xc2\x91",
      "\x16",
      "\xc2\x93",
      "\xc2\x94",
      "\xc2\x95",
      "\xc2\x96",
      "\x04",
      "\xc2\x98",
      "\xc2\x99",
      "\xc2\x9a",
      "\xc2\x9b",
      "\x14",
      "\x15",
      "\xc2\x9e",
      "\x1a",
      "\x20",
      "\xc2\xa0",
      "\xc3\xa2",
      "\xc3\xa4",
      "\x7b",
      "\xc3\xa1",
      "\xc3\xa3",
      "\xc3\xa5",
      "\x5c",
      "\xc3\xb1",
      "\xc2\xb0",
      "\x2e",
      "\x3c",
      "\x28",
      "\x2b",
      "\x21",
      "\x26",
      "\x5d",
      "\xc3\xaa",
      "\xc3\xab",
      "\x7d",
      "\xc3\xad",
      "\xc3\xae",
      "\xc3\xaf",
      "\x7e",
      "\xc3\x9f",
      "\xc3\xa9",
      "\x24",
      "\x2a",
      "\x29",
      "\x3b",
      "\x5e",
      "\x2d",
      "\x2f",
      "\xc3\x82",
      "\xc3\x84",
      "\xc3\x80",
      "\xc3\x81",
      "\xc3\x83",
      "\xc3\x85",
      "\xc3\x87",
      "\xc3\x91",
      "\xc3\xb2",
      "\x2c",
      "\x25",
      "\x5f",
      "\x3e",
      "\x3f",
      "\xc3\xb8",
      "\xc3\x89",
      "\xc3\x8a",
      "\xc3\x8b",
      "\xc3\x88",
      "\xc3\x8d",
      "\xc3\x8e",
      "\xc3\x8f",
      "\xc3\x8c",
      "\xc3\xb9",
      "\x3a",
      "\xc2\xa3",
      "\xc2\xa7",
      "\x27",
      "\x3d",
      "\x22",
      "\xc3\x98",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\xc2\xab",
      "\xc2\xbb",
      "\xc3\xb0",
      "\xc3\xbd",
      "\xc3\xbe",
      "\xc2\xb1",
      "\x5b",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\xc2\xaa",
      "\xc2\xba",
      "\xc3\xa6",
      "\xc2\xb8",
      "\xc3\x86",
      "\xc2\xa4",
      "\xc2\xb5",
      "\xc3\xac",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\xc2\xa1",
      "\xc2\xbf",
      "\xc3\x90",
      "\xc3\x9d",
      "\xc3\x9e",
      "\xc2\xae",
      "\xc2\xa2",
      "\x23",
      "\xc2\xa5",
      "\xc2\xb7",
      "\xc2\xa9",
      "\x40",
      "\xc2\xb6",
      "\xc2\xbc",
      "\xc2\xbd",
      "\xc2\xbe",
      "\xc2\xac",
      "\x7c",
      "\xe2\x80\xbe",
      "\xc2\xa8",
      "\xc2\xb4",
      "\xc3\x97",
      "\xc3\xa0",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\xc2\xad",
      "\xc3\xb4",
      "\xc3\xb6",
      "\xc2\xa6",
      "\xc3\xb3",
      "\xc3\xb5",
      "\xc3\xa8",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\xc2\xb9",
      "\xc3\xbb",
      "\xc3\xbc",
      "\x60",
      "\xc3\xba",
      "\xc3\xbf",
      "\xc3\xa7",
      "\xc3\xb7",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\xc2\xb2",
      "\xc3\x94",
      "\xc3\x96",
      "\xc3\x92",
      "\xc3\x93",
      "\xc3\x95",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\xc2\xb3",
      "\xc3\x9b",
      "\xc3\x9c",
      "\xc3\x99",
      "\xc3\x9a",
      "\xc2\x9f",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x37",
      0x00000005 => "\x2d",
      0x00000006 => "\x2e",
      0x00000007 => "\x2f",
      0x00000008 => "\x16",
      0x00000009 => "\x05",
      0x0000000a => "\x25",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x3c",
      0x00000015 => "\x3d",
      0x00000016 => "\x32",
      0x00000017 => "\x26",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x3f",
      0x0000001b => "\x27",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x40",
      0x00000021 => "\x4f",
      0x00000022 => "\x7f",
      0x00000023 => "\xb1",
      0x00000024 => "\x5b",
      0x00000025 => "\x6c",
      0x00000026 => "\x50",
      0x00000027 => "\x7d",
      0x00000028 => "\x4d",
      0x00000029 => "\x5d",
      0x0000002a => "\x5c",
      0x0000002b => "\x4e",
      0x0000002c => "\x6b",
      0x0000002d => "\x60",
      0x0000002e => "\x4b",
      0x0000002f => "\x61",
      0x00000030 => "\xf0",
      0x00000031 => "\xf1",
      0x00000032 => "\xf2",
      0x00000033 => "\xf3",
      0x00000034 => "\xf4",
      0x00000035 => "\xf5",
      0x00000036 => "\xf6",
      0x00000037 => "\xf7",
      0x00000038 => "\xf8",
      0x00000039 => "\xf9",
      0x0000003a => "\x7a",
      0x0000003b => "\x5e",
      0x0000003c => "\x4c",
      0x0000003d => "\x7e",
      0x0000003e => "\x6e",
      0x0000003f => "\x6f",
      0x00000040 => "\xb5",
      0x00000041 => "\xc1",
      0x00000042 => "\xc2",
      0x00000043 => "\xc3",
      0x00000044 => "\xc4",
      0x00000045 => "\xc5",
      0x00000046 => "\xc6",
      0x00000047 => "\xc7",
      0x00000048 => "\xc8",
      0x00000049 => "\xc9",
      0x0000004a => "\xd1",
      0x0000004b => "\xd2",
      0x0000004c => "\xd3",
      0x0000004d => "\xd4",
      0x0000004e => "\xd5",
      0x0000004f => "\xd6",
      0x00000050 => "\xd7",
      0x00000051 => "\xd8",
      0x00000052 => "\xd9",
      0x00000053 => "\xe2",
      0x00000054 => "\xe3",
      0x00000055 => "\xe4",
      0x00000056 => "\xe5",
      0x00000057 => "\xe6",
      0x00000058 => "\xe7",
      0x00000059 => "\xe8",
      0x0000005a => "\xe9",
      0x0000005b => "\x90",
      0x0000005c => "\x48",
      0x0000005d => "\x51",
      0x0000005e => "\x5f",
      0x0000005f => "\x6d",
      0x00000060 => "\xdd",
      0x00000061 => "\x81",
      0x00000062 => "\x82",
      0x00000063 => "\x83",
      0x00000064 => "\x84",
      0x00000065 => "\x85",
      0x00000066 => "\x86",
      0x00000067 => "\x87",
      0x00000068 => "\x88",
      0x00000069 => "\x89",
      0x0000006a => "\x91",
      0x0000006b => "\x92",
      0x0000006c => "\x93",
      0x0000006d => "\x94",
      0x0000006e => "\x95",
      0x0000006f => "\x96",
      0x00000070 => "\x97",
      0x00000071 => "\x98",
      0x00000072 => "\x99",
      0x00000073 => "\xa2",
      0x00000074 => "\xa3",
      0x00000075 => "\xa4",
      0x00000076 => "\xa5",
      0x00000077 => "\xa6",
      0x00000078 => "\xa7",
      0x00000079 => "\xa8",
      0x0000007a => "\xa9",
      0x0000007b => "\x44",
      0x0000007c => "\xbb",
      0x0000007d => "\x54",
      0x0000007e => "\x58",
      0x0000007f => "\x07",
      0x00000080 => "\x20",
      0x00000081 => "\x21",
      0x00000082 => "\x22",
      0x00000083 => "\x23",
      0x00000084 => "\x24",
      0x00000085 => "\x15",
      0x00000086 => "\x06",
      0x00000087 => "\x17",
      0x00000088 => "\x28",
      0x00000089 => "\x29",
      0x0000008a => "\x2a",
      0x0000008b => "\x2b",
      0x0000008c => "\x2c",
      0x0000008d => "\x09",
      0x0000008e => "\x0a",
      0x0000008f => "\x1b",
      0x00000090 => "\x30",
      0x00000091 => "\x31",
      0x00000092 => "\x1a",
      0x00000093 => "\x33",
      0x00000094 => "\x34",
      0x00000095 => "\x35",
      0x00000096 => "\x36",
      0x00000097 => "\x08",
      0x00000098 => "\x38",
      0x00000099 => "\x39",
      0x0000009a => "\x3a",
      0x0000009b => "\x3b",
      0x0000009c => "\x04",
      0x0000009d => "\x14",
      0x0000009e => "\x3e",
      0x0000009f => "\xff",
      0x000000a0 => "\x41",
      0x000000a1 => "\xaa",
      0x000000a2 => "\xb0",
      0x000000a3 => "\x7b",
      0x000000a4 => "\x9f",
      0x000000a5 => "\xb2",
      0x000000a6 => "\xcd",
      0x000000a7 => "\x7c",
      0x000000a8 => "\xbd",
      0x000000a9 => "\xb4",
      0x000000aa => "\x9a",
      0x000000ab => "\x8a",
      0x000000ac => "\xba",
      0x000000ad => "\xca",
      0x000000ae => "\xaf",
      0x000000b0 => "\x4a",
      0x000000b1 => "\x8f",
      0x000000b2 => "\xea",
      0x000000b3 => "\xfa",
      0x000000b4 => "\xbe",
      0x000000b5 => "\xa0",
      0x000000b6 => "\xb6",
      0x000000b7 => "\xb3",
      0x000000b8 => "\x9d",
      0x000000b9 => "\xda",
      0x000000ba => "\x9b",
      0x000000bb => "\x8b",
      0x000000bc => "\xb7",
      0x000000bd => "\xb8",
      0x000000be => "\xb9",
      0x000000bf => "\xab",
      0x000000c0 => "\x64",
      0x000000c1 => "\x65",
      0x000000c2 => "\x62",
      0x000000c3 => "\x66",
      0x000000c4 => "\x63",
      0x000000c5 => "\x67",
      0x000000c6 => "\x9e",
      0x000000c7 => "\x68",
      0x000000c8 => "\x74",
      0x000000c9 => "\x71",
      0x000000ca => "\x72",
      0x000000cb => "\x73",
      0x000000cc => "\x78",
      0x000000cd => "\x75",
      0x000000ce => "\x76",
      0x000000cf => "\x77",
      0x000000d0 => "\xac",
      0x000000d1 => "\x69",
      0x000000d2 => "\xed",
      0x000000d3 => "\xee",
      0x000000d4 => "\xeb",
      0x000000d5 => "\xef",
      0x000000d6 => "\xec",
      0x000000d7 => "\xbf",
      0x000000d8 => "\x80",
      0x000000d9 => "\xfd",
      0x000000da => "\xfe",
      0x000000db => "\xfb",
      0x000000dc => "\xfc",
      0x000000dd => "\xad",
      0x000000de => "\xae",
      0x000000df => "\x59",
      0x000000e0 => "\xc0",
      0x000000e1 => "\x45",
      0x000000e2 => "\x42",
      0x000000e3 => "\x46",
      0x000000e4 => "\x43",
      0x000000e5 => "\x47",
      0x000000e6 => "\x9c",
      0x000000e7 => "\xe0",
      0x000000e8 => "\xd0",
      0x000000e9 => "\x5a",
      0x000000ea => "\x52",
      0x000000eb => "\x53",
      0x000000ec => "\xa1",
      0x000000ed => "\x55",
      0x000000ee => "\x56",
      0x000000ef => "\x57",
      0x000000f0 => "\x8c",
      0x000000f1 => "\x49",
      0x000000f2 => "\x6a",
      0x000000f3 => "\xce",
      0x000000f4 => "\xcb",
      0x000000f5 => "\xcf",
      0x000000f6 => "\xcc",
      0x000000f7 => "\xe1",
      0x000000f8 => "\x70",
      0x000000f9 => "\x79",
      0x000000fa => "\xde",
      0x000000fb => "\xdb",
      0x000000fc => "\xdc",
      0x000000fd => "\x8d",
      0x000000fe => "\x8e",
      0x000000ff => "\xdf",
      0x0000203e => "\xbc",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x6f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::IBM280 - Conversion routines for IBM280
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for IBM280.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: IBM NLS RM Vol2 SE09-8002-01, March 1990
   alias CP280
   alias EBCDIC-CP-IT
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  0000009C | STRING TERMINATOR (ST)
      05 |  00000009 | CHARACTER TABULATION (HT)
      06 |  00000086 | START OF SELECTED AREA (SSA)
      07 |  0000007F | DELETE (DEL)
      08 |  00000097 | END OF GUARDED AREA (EPA)
      09 |  0000008D | REVERSE LINE FEED (RI)
      0A |  0000008E | SINGLE-SHIFT TWO (SS2)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  0000009D | OPERATING SYSTEM COMMAND (OSC)
      15 |  00000085 | NEXT LINE (NEL)
      16 |  00000008 | BACKSPACE (BS)
      17 |  00000087 | END OF SELECTED AREA (ESA)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  00000092 | PRIVATE USE TWO (PU2)
      1B |  0000008F | SINGLE-SHIFT THREE (SS3)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000080 | PADDING CHARACTER (PAD)
      21 |  00000081 | HIGH OCTET PRESET (HOP)
      22 |  00000082 | BREAK PERMITTED HERE (BPH)
      23 |  00000083 | NO BREAK HERE (NBH)
      24 |  00000084 | INDEX (IND)
      25 |  0000000A | LINE FEED (LF)
      26 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      27 |  0000001B | ESCAPE (ESC)
      28 |  00000088 | CHARACTER TABULATION SET (HTS)
      29 |  00000089 | CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
      2A |  0000008A | LINE TABULATION SET (VTS)
      2B |  0000008B | PARTIAL LINE FORWARD (PLD)
      2C |  0000008C | PARTIAL LINE BACKWARD (PLU)
      2D |  00000005 | ENQUIRY (ENQ)
      2E |  00000006 | ACKNOWLEDGE (ACK)
      2F |  00000007 | BELL (BEL)
      30 |  00000090 | DEVICE CONTROL STRING (DCS)
      31 |  00000091 | PRIVATE USE ONE (PU1)
      32 |  00000016 | SYNCHRONOUS IDLE (SYN)
      33 |  00000093 | SET TRANSMIT STATE (STS)
      34 |  00000094 | CANCEL CHARACTER (CCH)
      35 |  00000095 | MESSAGE WAITING (MW)
      36 |  00000096 | START OF GUARDED AREA (SPA)
      37 |  00000004 | END OF TRANSMISSION (EOT)
      38 |  00000098 | START OF STRING (SOS)
      39 |  00000099 | SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
      3A |  0000009A | SINGLE CHARACTER INTRODUCER (SCI)
      3B |  0000009B | CONTROL SEQUENCE INTRODUCER (CSI)
      3C |  00000014 | DEVICE CONTROL FOUR (DC4)
      3D |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      3E |  0000009E | PRIVACY MESSAGE (PM)
      3F |  0000001A | SUBSTITUTE (SUB)
      40 |  00000020 | SPACE
      41 |  000000A0 | NO-BREAK SPACE
      42 |  000000E2 | LATIN SMALL LETTER A WITH CIRCUMFLEX
      43 |  000000E4 | LATIN SMALL LETTER A WITH DIAERESIS
      44 |  0000007B | LEFT CURLY BRACKET
      45 |  000000E1 | LATIN SMALL LETTER A WITH ACUTE
      46 |  000000E3 | LATIN SMALL LETTER A WITH TILDE
      47 |  000000E5 | LATIN SMALL LETTER A WITH RING ABOVE
      48 |  0000005C | REVERSE SOLIDUS
      49 |  000000F1 | LATIN SMALL LETTER N WITH TILDE
      4A |  000000B0 | DEGREE SIGN
      4B |  0000002E | FULL STOP
      4C |  0000003C | LESS-THAN SIGN
      4D |  00000028 | LEFT PARENTHESIS
      4E |  0000002B | PLUS SIGN
      4F |  00000021 | EXCLAMATION MARK
      50 |  00000026 | AMPERSAND
      51 |  0000005D | RIGHT SQUARE BRACKET
      52 |  000000EA | LATIN SMALL LETTER E WITH CIRCUMFLEX
      53 |  000000EB | LATIN SMALL LETTER E WITH DIAERESIS
      54 |  0000007D | RIGHT CURLY BRACKET
      55 |  000000ED | LATIN SMALL LETTER I WITH ACUTE
      56 |  000000EE | LATIN SMALL LETTER I WITH CIRCUMFLEX
      57 |  000000EF | LATIN SMALL LETTER I WITH DIAERESIS
      58 |  0000007E | TILDE
      59 |  000000DF | LATIN SMALL LETTER SHARP S (German)
      5A |  000000E9 | LATIN SMALL LETTER E WITH ACUTE
      5B |  00000024 | DOLLAR SIGN
      5C |  0000002A | ASTERISK
      5D |  00000029 | RIGHT PARENTHESIS
      5E |  0000003B | SEMICOLON
      5F |  0000005E | CIRCUMFLEX ACCENT
      60 |  0000002D | HYPHEN-MINUS
      61 |  0000002F | SOLIDUS
      62 |  000000C2 | LATIN CAPITAL LETTER A WITH CIRCUMFLEX
      63 |  000000C4 | LATIN CAPITAL LETTER A WITH DIAERESIS
      64 |  000000C0 | LATIN CAPITAL LETTER A WITH GRAVE
      65 |  000000C1 | LATIN CAPITAL LETTER A WITH ACUTE
      66 |  000000C3 | LATIN CAPITAL LETTER A WITH TILDE
      67 |  000000C5 | LATIN CAPITAL LETTER A WITH RING ABOVE
      68 |  000000C7 | LATIN CAPITAL LETTER C WITH CEDILLA
      69 |  000000D1 | LATIN CAPITAL LETTER N WITH TILDE
      6A |  000000F2 | LATIN SMALL LETTER O WITH GRAVE
      6B |  0000002C | COMMA
      6C |  00000025 | PERCENT SIGN
      6D |  0000005F | LOW LINE
      6E |  0000003E | GREATER-THAN SIGN
      6F |  0000003F | QUESTION MARK
      70 |  000000F8 | LATIN SMALL LETTER O WITH STROKE
      71 |  000000C9 | LATIN CAPITAL LETTER E WITH ACUTE
      72 |  000000CA | LATIN CAPITAL LETTER E WITH CIRCUMFLEX
      73 |  000000CB | LATIN CAPITAL LETTER E WITH DIAERESIS
      74 |  000000C8 | LATIN CAPITAL LETTER E WITH GRAVE
      75 |  000000CD | LATIN CAPITAL LETTER I WITH ACUTE
      76 |  000000CE | LATIN CAPITAL LETTER I WITH CIRCUMFLEX
      77 |  000000CF | LATIN CAPITAL LETTER I WITH DIAERESIS
      78 |  000000CC | LATIN CAPITAL LETTER I WITH GRAVE
      79 |  000000F9 | LATIN SMALL LETTER U WITH GRAVE
      7A |  0000003A | COLON
      7B |  000000A3 | POUND SIGN
      7C |  000000A7 | SECTION SIGN
      7D |  00000027 | APOSTROPHE
      7E |  0000003D | EQUALS SIGN
      7F |  00000022 | QUOTATION MARK
      80 |  000000D8 | LATIN CAPITAL LETTER O WITH STROKE
      81 |  00000061 | LATIN SMALL LETTER A
      82 |  00000062 | LATIN SMALL LETTER B
      83 |  00000063 | LATIN SMALL LETTER C
      84 |  00000064 | LATIN SMALL LETTER D
      85 |  00000065 | LATIN SMALL LETTER E
      86 |  00000066 | LATIN SMALL LETTER F
      87 |  00000067 | LATIN SMALL LETTER G
      88 |  00000068 | LATIN SMALL LETTER H
      89 |  00000069 | LATIN SMALL LETTER I
      8A |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
      8B |  000000BB | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
      8C |  000000F0 | LATIN SMALL LETTER ETH (Icelandic)
      8D |  000000FD | LATIN SMALL LETTER Y WITH ACUTE
      8E |  000000FE | LATIN SMALL LETTER THORN (Icelandic)
      8F |  000000B1 | PLUS-MINUS SIGN
      90 |  0000005B | LEFT SQUARE BRACKET
      91 |  0000006A | LATIN SMALL LETTER J
      92 |  0000006B | LATIN SMALL LETTER K
      93 |  0000006C | LATIN SMALL LETTER L
      94 |  0000006D | LATIN SMALL LETTER M
      95 |  0000006E | LATIN SMALL LETTER N
      96 |  0000006F | LATIN SMALL LETTER O
      97 |  00000070 | LATIN SMALL LETTER P
      98 |  00000071 | LATIN SMALL LETTER Q
      99 |  00000072 | LATIN SMALL LETTER R
      9A |  000000AA | FEMININE ORDINAL INDICATOR
      9B |  000000BA | MASCULINE ORDINAL INDICATOR
      9C |  000000E6 | LATIN SMALL LETTER AE
      9D |  000000B8 | CEDILLA
      9E |  000000C6 | LATIN CAPITAL LETTER AE
      9F |  000000A4 | CURRENCY SIGN
      A0 |  000000B5 | MICRO SIGN
      A1 |  000000EC | LATIN SMALL LETTER I WITH GRAVE
      A2 |  00000073 | LATIN SMALL LETTER S
      A3 |  00000074 | LATIN SMALL LETTER T
      A4 |  00000075 | LATIN SMALL LETTER U
      A5 |  00000076 | LATIN SMALL LETTER V
      A6 |  00000077 | LATIN SMALL LETTER W
      A7 |  00000078 | LATIN SMALL LETTER X
      A8 |  00000079 | LATIN SMALL LETTER Y
      A9 |  0000007A | LATIN SMALL LETTER Z
      AA |  000000A1 | INVERTED EXCLAMATION MARK
      AB |  000000BF | INVERTED QUESTION MARK
      AC |  000000D0 | LATIN CAPITAL LETTER ETH (Icelandic)
      AD |  000000DD | LATIN CAPITAL LETTER Y WITH ACUTE
      AE |  000000DE | LATIN CAPITAL LETTER THORN (Icelandic)
      AF |  000000AE | REGISTERED SIGN
      B0 |  000000A2 | CENT SIGN
      B1 |  00000023 | NUMBER SIGN
      B2 |  000000A5 | YEN SIGN
      B3 |  000000B7 | MIDDLE DOT
      B4 |  000000A9 | COPYRIGHT SIGN
      B5 |  00000040 | COMMERCIAL AT
      B6 |  000000B6 | PILCROW SIGN
      B7 |  000000BC | VULGAR FRACTION ONE QUARTER
      B8 |  000000BD | VULGAR FRACTION ONE HALF
      B9 |  000000BE | VULGAR FRACTION THREE QUARTERS
      BA |  000000AC | NOT SIGN
      BB |  0000007C | VERTICAL LINE
      BC |  0000203E | OVERLINE
      BD |  000000A8 | DIAERESIS
      BE |  000000B4 | ACUTE ACCENT
      BF |  000000D7 | MULTIPLICATION SIGN
      C0 |  000000E0 | LATIN SMALL LETTER A WITH GRAVE
      C1 |  00000041 | LATIN CAPITAL LETTER A
      C2 |  00000042 | LATIN CAPITAL LETTER B
      C3 |  00000043 | LATIN CAPITAL LETTER C
      C4 |  00000044 | LATIN CAPITAL LETTER D
      C5 |  00000045 | LATIN CAPITAL LETTER E
      C6 |  00000046 | LATIN CAPITAL LETTER F
      C7 |  00000047 | LATIN CAPITAL LETTER G
      C8 |  00000048 | LATIN CAPITAL LETTER H
      C9 |  00000049 | LATIN CAPITAL LETTER I
      CA |  000000AD | SOFT HYPHEN
      CB |  000000F4 | LATIN SMALL LETTER O WITH CIRCUMFLEX
      CC |  000000F6 | LATIN SMALL LETTER O WITH DIAERESIS
      CD |  000000A6 | BROKEN BAR
      CE |  000000F3 | LATIN SMALL LETTER O WITH ACUTE
      CF |  000000F5 | LATIN SMALL LETTER O WITH TILDE
      D0 |  000000E8 | LATIN SMALL LETTER E WITH GRAVE
      D1 |  0000004A | LATIN CAPITAL LETTER J
      D2 |  0000004B | LATIN CAPITAL LETTER K
      D3 |  0000004C | LATIN CAPITAL LETTER L
      D4 |  0000004D | LATIN CAPITAL LETTER M
      D5 |  0000004E | LATIN CAPITAL LETTER N
      D6 |  0000004F | LATIN CAPITAL LETTER O
      D7 |  00000050 | LATIN CAPITAL LETTER P
      D8 |  00000051 | LATIN CAPITAL LETTER Q
      D9 |  00000052 | LATIN CAPITAL LETTER R
      DA |  000000B9 | SUPERSCRIPT ONE
      DB |  000000FB | LATIN SMALL LETTER U WITH CIRCUMFLEX
      DC |  000000FC | LATIN SMALL LETTER U WITH DIAERESIS
      DD |  00000060 | GRAVE ACCENT
      DE |  000000FA | LATIN SMALL LETTER U WITH ACUTE
      DF |  000000FF | LATIN SMALL LETTER Y WITH DIAERESIS
      E0 |  000000E7 | LATIN SMALL LETTER C WITH CEDILLA
      E1 |  000000F7 | DIVISION SIGN
      E2 |  00000053 | LATIN CAPITAL LETTER S
      E3 |  00000054 | LATIN CAPITAL LETTER T
      E4 |  00000055 | LATIN CAPITAL LETTER U
      E5 |  00000056 | LATIN CAPITAL LETTER V
      E6 |  00000057 | LATIN CAPITAL LETTER W
      E7 |  00000058 | LATIN CAPITAL LETTER X
      E8 |  00000059 | LATIN CAPITAL LETTER Y
      E9 |  0000005A | LATIN CAPITAL LETTER Z
      EA |  000000B2 | SUPERSCRIPT TWO
      EB |  000000D4 | LATIN CAPITAL LETTER O WITH CIRCUMFLEX
      EC |  000000D6 | LATIN CAPITAL LETTER O WITH DIAERESIS
      ED |  000000D2 | LATIN CAPITAL LETTER O WITH GRAVE
      EE |  000000D3 | LATIN CAPITAL LETTER O WITH ACUTE
      EF |  000000D5 | LATIN CAPITAL LETTER O WITH TILDE
      F0 |  00000030 | DIGIT ZERO
      F1 |  00000031 | DIGIT ONE
      F2 |  00000032 | DIGIT TWO
      F3 |  00000033 | DIGIT THREE
      F4 |  00000034 | DIGIT FOUR
      F5 |  00000035 | DIGIT FIVE
      F6 |  00000036 | DIGIT SIX
      F7 |  00000037 | DIGIT SEVEN
      F8 |  00000038 | DIGIT EIGHT
      F9 |  00000039 | DIGIT NINE
      FA |  000000B3 | SUPERSCRIPT THREE
      FB |  000000DB | LATIN CAPITAL LETTER U WITH CIRCUMFLEX
      FC |  000000DC | LATIN CAPITAL LETTER U WITH DIAERESIS
      FD |  000000D9 | LATIN CAPITAL LETTER U WITH GRAVE
      FE |  000000DA | LATIN CAPITAL LETTER U WITH ACUTE
      FF |  0000009F | APPLICATION PROGRAM COMMAND (APC)
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_IBM280

    $main::fatpacked{"Locale/RecodeData/IBM281.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_IBM281';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for IBM281.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::IBM281;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x009c,
      0x0009,
      0x0086,
      0x007f,
      0x0097,
      0x008d,
      0x008e,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x009d,
      0x0085,
      0x0008,
      0x0087,
      0x0018,
      0x0019,
      0x0092,
      0x008f,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0080,
      0x0081,
      0x0082,
      0x0083,
      0x0084,
      0x000a,
      0x0017,
      0x001b,
      0x0088,
      0x0089,
      0x008a,
      0x008b,
      0x008c,
      0x0005,
      0x0006,
      0x0007,
      0x0090,
      0x0091,
      0x0016,
      0x0093,
      0x0094,
      0x0095,
      0x0096,
      0x0004,
      0x0098,
      0x0099,
      0x009a,
      0x009b,
      0x0014,
      0x0015,
      0x009e,
      0x001a,
      0x0020,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00a3,
      0x002e,
      0x003c,
      0x0028,
      0x002b,
      0x007c,
      0x0026,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0021,
      0x00a5,
      0x002a,
      0x0029,
      0x003b,
      0x00ac,
      0x002d,
      0x002f,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00a6,
      0x002c,
      0x0025,
      0x005f,
      0x003e,
      0x003f,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0060,
      0x003a,
      0x0023,
      0x0040,
      0x0027,
      0x003d,
      0x0022,
      0xfffd,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x203e,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x007b,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x007d,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0024,
      0xfffd,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x009f,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\xc2\x9c",
      "\x09",
      "\xc2\x86",
      "\x7f",
      "\xc2\x97",
      "\xc2\x8d",
      "\xc2\x8e",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\xc2\x9d",
      "\xc2\x85",
      "\x08",
      "\xc2\x87",
      "\x18",
      "\x19",
      "\xc2\x92",
      "\xc2\x8f",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\xc2\x80",
      "\xc2\x81",
      "\xc2\x82",
      "\xc2\x83",
      "\xc2\x84",
      "\x0a",
      "\x17",
      "\x1b",
      "\xc2\x88",
      "\xc2\x89",
      "\xc2\x8a",
      "\xc2\x8b",
      "\xc2\x8c",
      "\x05",
      "\x06",
      "\x07",
      "\xc2\x90",
      "\xc2\x91",
      "\x16",
      "\xc2\x93",
      "\xc2\x94",
      "\xc2\x95",
      "\xc2\x96",
      "\x04",
      "\xc2\x98",
      "\xc2\x99",
      "\xc2\x9a",
      "\xc2\x9b",
      "\x14",
      "\x15",
      "\xc2\x9e",
      "\x1a",
      "\x20",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc2\xa3",
      "\x2e",
      "\x3c",
      "\x28",
      "\x2b",
      "\x7c",
      "\x26",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x21",
      "\xc2\xa5",
      "\x2a",
      "\x29",
      "\x3b",
      "\xc2\xac",
      "\x2d",
      "\x2f",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc2\xa6",
      "\x2c",
      "\x25",
      "\x5f",
      "\x3e",
      "\x3f",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x60",
      "\x3a",
      "\x23",
      "\x40",
      "\x27",
      "\x3d",
      "\x22",
      "\xef\xbf\xbd",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xe2\x80\xbe",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x7b",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x7d",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x24",
      "\xef\xbf\xbd",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc2\x9f",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x37",
      0x00000005 => "\x2d",
      0x00000006 => "\x2e",
      0x00000007 => "\x2f",
      0x00000008 => "\x16",
      0x00000009 => "\x05",
      0x0000000a => "\x25",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x3c",
      0x00000015 => "\x3d",
      0x00000016 => "\x32",
      0x00000017 => "\x26",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x3f",
      0x0000001b => "\x27",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x40",
      0x00000021 => "\x5a",
      0x00000022 => "\x7f",
      0x00000023 => "\x7b",
      0x00000024 => "\xe0",
      0x00000025 => "\x6c",
      0x00000026 => "\x50",
      0x00000027 => "\x7d",
      0x00000028 => "\x4d",
      0x00000029 => "\x5d",
      0x0000002a => "\x5c",
      0x0000002b => "\x4e",
      0x0000002c => "\x6b",
      0x0000002d => "\x60",
      0x0000002e => "\x4b",
      0x0000002f => "\x61",
      0x00000030 => "\xf0",
      0x00000031 => "\xf1",
      0x00000032 => "\xf2",
      0x00000033 => "\xf3",
      0x00000034 => "\xf4",
      0x00000035 => "\xf5",
      0x00000036 => "\xf6",
      0x00000037 => "\xf7",
      0x00000038 => "\xf8",
      0x00000039 => "\xf9",
      0x0000003a => "\x7a",
      0x0000003b => "\x5e",
      0x0000003c => "\x4c",
      0x0000003d => "\x7e",
      0x0000003e => "\x6e",
      0x0000003f => "\x6f",
      0x00000040 => "\x7c",
      0x00000041 => "\xc1",
      0x00000042 => "\xc2",
      0x00000043 => "\xc3",
      0x00000044 => "\xc4",
      0x00000045 => "\xc5",
      0x00000046 => "\xc6",
      0x00000047 => "\xc7",
      0x00000048 => "\xc8",
      0x00000049 => "\xc9",
      0x0000004a => "\xd1",
      0x0000004b => "\xd2",
      0x0000004c => "\xd3",
      0x0000004d => "\xd4",
      0x0000004e => "\xd5",
      0x0000004f => "\xd6",
      0x00000050 => "\xd7",
      0x00000051 => "\xd8",
      0x00000052 => "\xd9",
      0x00000053 => "\xe2",
      0x00000054 => "\xe3",
      0x00000055 => "\xe4",
      0x00000056 => "\xe5",
      0x00000057 => "\xe6",
      0x00000058 => "\xe7",
      0x00000059 => "\xe8",
      0x0000005a => "\xe9",
      0x0000005f => "\x6d",
      0x00000060 => "\x79",
      0x00000061 => "\x81",
      0x00000062 => "\x82",
      0x00000063 => "\x83",
      0x00000064 => "\x84",
      0x00000065 => "\x85",
      0x00000066 => "\x86",
      0x00000067 => "\x87",
      0x00000068 => "\x88",
      0x00000069 => "\x89",
      0x0000006a => "\x91",
      0x0000006b => "\x92",
      0x0000006c => "\x93",
      0x0000006d => "\x94",
      0x0000006e => "\x95",
      0x0000006f => "\x96",
      0x00000070 => "\x97",
      0x00000071 => "\x98",
      0x00000072 => "\x99",
      0x00000073 => "\xa2",
      0x00000074 => "\xa3",
      0x00000075 => "\xa4",
      0x00000076 => "\xa5",
      0x00000077 => "\xa6",
      0x00000078 => "\xa7",
      0x00000079 => "\xa8",
      0x0000007a => "\xa9",
      0x0000007b => "\xc0",
      0x0000007c => "\x4f",
      0x0000007d => "\xd0",
      0x0000007f => "\x07",
      0x00000080 => "\x20",
      0x00000081 => "\x21",
      0x00000082 => "\x22",
      0x00000083 => "\x23",
      0x00000084 => "\x24",
      0x00000085 => "\x15",
      0x00000086 => "\x06",
      0x00000087 => "\x17",
      0x00000088 => "\x28",
      0x00000089 => "\x29",
      0x0000008a => "\x2a",
      0x0000008b => "\x2b",
      0x0000008c => "\x2c",
      0x0000008d => "\x09",
      0x0000008e => "\x0a",
      0x0000008f => "\x1b",
      0x00000090 => "\x30",
      0x00000091 => "\x31",
      0x00000092 => "\x1a",
      0x00000093 => "\x33",
      0x00000094 => "\x34",
      0x00000095 => "\x35",
      0x00000096 => "\x36",
      0x00000097 => "\x08",
      0x00000098 => "\x38",
      0x00000099 => "\x39",
      0x0000009a => "\x3a",
      0x0000009b => "\x3b",
      0x0000009c => "\x04",
      0x0000009d => "\x14",
      0x0000009e => "\x3e",
      0x0000009f => "\xff",
      0x000000a3 => "\x4a",
      0x000000a5 => "\x5b",
      0x000000a6 => "\x6a",
      0x000000ac => "\x5f",
      0x0000203e => "\xa1",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x6f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::IBM281 - Conversion routines for IBM281
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for IBM281.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: IBM 3174 Character Set Ref, GA27-3831-02, March 1990
   alias EBCDIC-JP-E
   alias CP281
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  0000009C | STRING TERMINATOR (ST)
      05 |  00000009 | CHARACTER TABULATION (HT)
      06 |  00000086 | START OF SELECTED AREA (SSA)
      07 |  0000007F | DELETE (DEL)
      08 |  00000097 | END OF GUARDED AREA (EPA)
      09 |  0000008D | REVERSE LINE FEED (RI)
      0A |  0000008E | SINGLE-SHIFT TWO (SS2)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  0000009D | OPERATING SYSTEM COMMAND (OSC)
      15 |  00000085 | NEXT LINE (NEL)
      16 |  00000008 | BACKSPACE (BS)
      17 |  00000087 | END OF SELECTED AREA (ESA)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  00000092 | PRIVATE USE TWO (PU2)
      1B |  0000008F | SINGLE-SHIFT THREE (SS3)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000080 | PADDING CHARACTER (PAD)
      21 |  00000081 | HIGH OCTET PRESET (HOP)
      22 |  00000082 | BREAK PERMITTED HERE (BPH)
      23 |  00000083 | NO BREAK HERE (NBH)
      24 |  00000084 | INDEX (IND)
      25 |  0000000A | LINE FEED (LF)
      26 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      27 |  0000001B | ESCAPE (ESC)
      28 |  00000088 | CHARACTER TABULATION SET (HTS)
      29 |  00000089 | CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
      2A |  0000008A | LINE TABULATION SET (VTS)
      2B |  0000008B | PARTIAL LINE FORWARD (PLD)
      2C |  0000008C | PARTIAL LINE BACKWARD (PLU)
      2D |  00000005 | ENQUIRY (ENQ)
      2E |  00000006 | ACKNOWLEDGE (ACK)
      2F |  00000007 | BELL (BEL)
      30 |  00000090 | DEVICE CONTROL STRING (DCS)
      31 |  00000091 | PRIVATE USE ONE (PU1)
      32 |  00000016 | SYNCHRONOUS IDLE (SYN)
      33 |  00000093 | SET TRANSMIT STATE (STS)
      34 |  00000094 | CANCEL CHARACTER (CCH)
      35 |  00000095 | MESSAGE WAITING (MW)
      36 |  00000096 | START OF GUARDED AREA (SPA)
      37 |  00000004 | END OF TRANSMISSION (EOT)
      38 |  00000098 | START OF STRING (SOS)
      39 |  00000099 | SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
      3A |  0000009A | SINGLE CHARACTER INTRODUCER (SCI)
      3B |  0000009B | CONTROL SEQUENCE INTRODUCER (CSI)
      3C |  00000014 | DEVICE CONTROL FOUR (DC4)
      3D |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      3E |  0000009E | PRIVACY MESSAGE (PM)
      3F |  0000001A | SUBSTITUTE (SUB)
      40 |  00000020 | SPACE
      4A |  000000A3 | POUND SIGN
      4B |  0000002E | FULL STOP
      4C |  0000003C | LESS-THAN SIGN
      4D |  00000028 | LEFT PARENTHESIS
      4E |  0000002B | PLUS SIGN
      4F |  0000007C | VERTICAL LINE
      50 |  00000026 | AMPERSAND
      5A |  00000021 | EXCLAMATION MARK
      5B |  000000A5 | YEN SIGN
      5C |  0000002A | ASTERISK
      5D |  00000029 | RIGHT PARENTHESIS
      5E |  0000003B | SEMICOLON
      5F |  000000AC | NOT SIGN
      60 |  0000002D | HYPHEN-MINUS
      61 |  0000002F | SOLIDUS
      6A |  000000A6 | BROKEN BAR
      6B |  0000002C | COMMA
      6C |  00000025 | PERCENT SIGN
      6D |  0000005F | LOW LINE
      6E |  0000003E | GREATER-THAN SIGN
      6F |  0000003F | QUESTION MARK
      79 |  00000060 | GRAVE ACCENT
      7A |  0000003A | COLON
      7B |  00000023 | NUMBER SIGN
      7C |  00000040 | COMMERCIAL AT
      7D |  00000027 | APOSTROPHE
      7E |  0000003D | EQUALS SIGN
      7F |  00000022 | QUOTATION MARK
      81 |  00000061 | LATIN SMALL LETTER A
      82 |  00000062 | LATIN SMALL LETTER B
      83 |  00000063 | LATIN SMALL LETTER C
      84 |  00000064 | LATIN SMALL LETTER D
      85 |  00000065 | LATIN SMALL LETTER E
      86 |  00000066 | LATIN SMALL LETTER F
      87 |  00000067 | LATIN SMALL LETTER G
      88 |  00000068 | LATIN SMALL LETTER H
      89 |  00000069 | LATIN SMALL LETTER I
      91 |  0000006A | LATIN SMALL LETTER J
      92 |  0000006B | LATIN SMALL LETTER K
      93 |  0000006C | LATIN SMALL LETTER L
      94 |  0000006D | LATIN SMALL LETTER M
      95 |  0000006E | LATIN SMALL LETTER N
      96 |  0000006F | LATIN SMALL LETTER O
      97 |  00000070 | LATIN SMALL LETTER P
      98 |  00000071 | LATIN SMALL LETTER Q
      99 |  00000072 | LATIN SMALL LETTER R
      A1 |  0000203E | OVERLINE
      A2 |  00000073 | LATIN SMALL LETTER S
      A3 |  00000074 | LATIN SMALL LETTER T
      A4 |  00000075 | LATIN SMALL LETTER U
      A5 |  00000076 | LATIN SMALL LETTER V
      A6 |  00000077 | LATIN SMALL LETTER W
      A7 |  00000078 | LATIN SMALL LETTER X
      A8 |  00000079 | LATIN SMALL LETTER Y
      A9 |  0000007A | LATIN SMALL LETTER Z
      C0 |  0000007B | LEFT CURLY BRACKET
      C1 |  00000041 | LATIN CAPITAL LETTER A
      C2 |  00000042 | LATIN CAPITAL LETTER B
      C3 |  00000043 | LATIN CAPITAL LETTER C
      C4 |  00000044 | LATIN CAPITAL LETTER D
      C5 |  00000045 | LATIN CAPITAL LETTER E
      C6 |  00000046 | LATIN CAPITAL LETTER F
      C7 |  00000047 | LATIN CAPITAL LETTER G
      C8 |  00000048 | LATIN CAPITAL LETTER H
      C9 |  00000049 | LATIN CAPITAL LETTER I
      D0 |  0000007D | RIGHT CURLY BRACKET
      D1 |  0000004A | LATIN CAPITAL LETTER J
      D2 |  0000004B | LATIN CAPITAL LETTER K
      D3 |  0000004C | LATIN CAPITAL LETTER L
      D4 |  0000004D | LATIN CAPITAL LETTER M
      D5 |  0000004E | LATIN CAPITAL LETTER N
      D6 |  0000004F | LATIN CAPITAL LETTER O
      D7 |  00000050 | LATIN CAPITAL LETTER P
      D8 |  00000051 | LATIN CAPITAL LETTER Q
      D9 |  00000052 | LATIN CAPITAL LETTER R
      E0 |  00000024 | DOLLAR SIGN
      E2 |  00000053 | LATIN CAPITAL LETTER S
      E3 |  00000054 | LATIN CAPITAL LETTER T
      E4 |  00000055 | LATIN CAPITAL LETTER U
      E5 |  00000056 | LATIN CAPITAL LETTER V
      E6 |  00000057 | LATIN CAPITAL LETTER W
      E7 |  00000058 | LATIN CAPITAL LETTER X
      E8 |  00000059 | LATIN CAPITAL LETTER Y
      E9 |  0000005A | LATIN CAPITAL LETTER Z
      F0 |  00000030 | DIGIT ZERO
      F1 |  00000031 | DIGIT ONE
      F2 |  00000032 | DIGIT TWO
      F3 |  00000033 | DIGIT THREE
      F4 |  00000034 | DIGIT FOUR
      F5 |  00000035 | DIGIT FIVE
      F6 |  00000036 | DIGIT SIX
      F7 |  00000037 | DIGIT SEVEN
      F8 |  00000038 | DIGIT EIGHT
      F9 |  00000039 | DIGIT NINE
      FF |  0000009F | APPLICATION PROGRAM COMMAND (APC)
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_IBM281

    $main::fatpacked{"Locale/RecodeData/IBM284.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_IBM284';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for IBM284.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::IBM284;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x009c,
      0x0009,
      0x0086,
      0x007f,
      0x0097,
      0x008d,
      0x008e,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x009d,
      0x0085,
      0x0008,
      0x0087,
      0x0018,
      0x0019,
      0x0092,
      0x008f,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0080,
      0x0081,
      0x0082,
      0x0083,
      0x0084,
      0x000a,
      0x0017,
      0x001b,
      0x0088,
      0x0089,
      0x008a,
      0x008b,
      0x008c,
      0x0005,
      0x0006,
      0x0007,
      0x0090,
      0x0091,
      0x0016,
      0x0093,
      0x0094,
      0x0095,
      0x0096,
      0x0004,
      0x0098,
      0x0099,
      0x009a,
      0x009b,
      0x0014,
      0x0015,
      0x009e,
      0x001a,
      0x0020,
      0x00a0,
      0x00e2,
      0x00e4,
      0x00e0,
      0x00e1,
      0x00e3,
      0x00e5,
      0x00e7,
      0x00a6,
      0x005b,
      0x002e,
      0x003c,
      0x0028,
      0x002b,
      0x007c,
      0x0026,
      0x00e9,
      0x00ea,
      0x00eb,
      0x00e8,
      0x00ed,
      0x00ee,
      0x00ef,
      0x00ec,
      0x00df,
      0x005d,
      0x0024,
      0x002a,
      0x0029,
      0x003b,
      0x00ac,
      0x002d,
      0x002f,
      0x00c2,
      0x00c4,
      0x00c0,
      0x00c1,
      0x00c3,
      0x00c5,
      0x00c7,
      0x0023,
      0x00f1,
      0x002c,
      0x0025,
      0x005f,
      0x003e,
      0x003f,
      0x00f8,
      0x00c9,
      0x00ca,
      0x00cb,
      0x00c8,
      0x00cd,
      0x00ce,
      0x00cf,
      0x00cc,
      0x0060,
      0x003a,
      0x00d1,
      0x0040,
      0x0027,
      0x003d,
      0x0022,
      0x00d8,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x00ab,
      0x00bb,
      0x00f0,
      0x00fd,
      0x00fe,
      0x00b1,
      0x00b0,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x00aa,
      0x00ba,
      0x00e6,
      0x00b8,
      0x00c6,
      0x00a4,
      0x00b5,
      0x00a8,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x00a1,
      0x00bf,
      0x00d0,
      0x00dd,
      0x00de,
      0x00ae,
      0x00a2,
      0x00a3,
      0x00a5,
      0x00b7,
      0x00a9,
      0x00a7,
      0x00b6,
      0x00bc,
      0x00bd,
      0x00be,
      0x005e,
      0x0021,
      0x203e,
      0x007e,
      0x00b4,
      0x00d7,
      0x007b,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x00ad,
      0x00f4,
      0x00f6,
      0x00f2,
      0x00f3,
      0x00f5,
      0x007d,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x00b9,
      0x00fb,
      0x00fc,
      0x00f9,
      0x00fa,
      0x00ff,
      0x005c,
      0x00f7,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x00b2,
      0x00d4,
      0x00d6,
      0x00d2,
      0x00d3,
      0x00d5,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x00b3,
      0x00db,
      0x00dc,
      0x00d9,
      0x00da,
      0x009f,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\xc2\x9c",
      "\x09",
      "\xc2\x86",
      "\x7f",
      "\xc2\x97",
      "\xc2\x8d",
      "\xc2\x8e",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\xc2\x9d",
      "\xc2\x85",
      "\x08",
      "\xc2\x87",
      "\x18",
      "\x19",
      "\xc2\x92",
      "\xc2\x8f",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\xc2\x80",
      "\xc2\x81",
      "\xc2\x82",
      "\xc2\x83",
      "\xc2\x84",
      "\x0a",
      "\x17",
      "\x1b",
      "\xc2\x88",
      "\xc2\x89",
      "\xc2\x8a",
      "\xc2\x8b",
      "\xc2\x8c",
      "\x05",
      "\x06",
      "\x07",
      "\xc2\x90",
      "\xc2\x91",
      "\x16",
      "\xc2\x93",
      "\xc2\x94",
      "\xc2\x95",
      "\xc2\x96",
      "\x04",
      "\xc2\x98",
      "\xc2\x99",
      "\xc2\x9a",
      "\xc2\x9b",
      "\x14",
      "\x15",
      "\xc2\x9e",
      "\x1a",
      "\x20",
      "\xc2\xa0",
      "\xc3\xa2",
      "\xc3\xa4",
      "\xc3\xa0",
      "\xc3\xa1",
      "\xc3\xa3",
      "\xc3\xa5",
      "\xc3\xa7",
      "\xc2\xa6",
      "\x5b",
      "\x2e",
      "\x3c",
      "\x28",
      "\x2b",
      "\x7c",
      "\x26",
      "\xc3\xa9",
      "\xc3\xaa",
      "\xc3\xab",
      "\xc3\xa8",
      "\xc3\xad",
      "\xc3\xae",
      "\xc3\xaf",
      "\xc3\xac",
      "\xc3\x9f",
      "\x5d",
      "\x24",
      "\x2a",
      "\x29",
      "\x3b",
      "\xc2\xac",
      "\x2d",
      "\x2f",
      "\xc3\x82",
      "\xc3\x84",
      "\xc3\x80",
      "\xc3\x81",
      "\xc3\x83",
      "\xc3\x85",
      "\xc3\x87",
      "\x23",
      "\xc3\xb1",
      "\x2c",
      "\x25",
      "\x5f",
      "\x3e",
      "\x3f",
      "\xc3\xb8",
      "\xc3\x89",
      "\xc3\x8a",
      "\xc3\x8b",
      "\xc3\x88",
      "\xc3\x8d",
      "\xc3\x8e",
      "\xc3\x8f",
      "\xc3\x8c",
      "\x60",
      "\x3a",
      "\xc3\x91",
      "\x40",
      "\x27",
      "\x3d",
      "\x22",
      "\xc3\x98",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\xc2\xab",
      "\xc2\xbb",
      "\xc3\xb0",
      "\xc3\xbd",
      "\xc3\xbe",
      "\xc2\xb1",
      "\xc2\xb0",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\xc2\xaa",
      "\xc2\xba",
      "\xc3\xa6",
      "\xc2\xb8",
      "\xc3\x86",
      "\xc2\xa4",
      "\xc2\xb5",
      "\xc2\xa8",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\xc2\xa1",
      "\xc2\xbf",
      "\xc3\x90",
      "\xc3\x9d",
      "\xc3\x9e",
      "\xc2\xae",
      "\xc2\xa2",
      "\xc2\xa3",
      "\xc2\xa5",
      "\xc2\xb7",
      "\xc2\xa9",
      "\xc2\xa7",
      "\xc2\xb6",
      "\xc2\xbc",
      "\xc2\xbd",
      "\xc2\xbe",
      "\x5e",
      "\x21",
      "\xe2\x80\xbe",
      "\x7e",
      "\xc2\xb4",
      "\xc3\x97",
      "\x7b",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\xc2\xad",
      "\xc3\xb4",
      "\xc3\xb6",
      "\xc3\xb2",
      "\xc3\xb3",
      "\xc3\xb5",
      "\x7d",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\xc2\xb9",
      "\xc3\xbb",
      "\xc3\xbc",
      "\xc3\xb9",
      "\xc3\xba",
      "\xc3\xbf",
      "\x5c",
      "\xc3\xb7",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\xc2\xb2",
      "\xc3\x94",
      "\xc3\x96",
      "\xc3\x92",
      "\xc3\x93",
      "\xc3\x95",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\xc2\xb3",
      "\xc3\x9b",
      "\xc3\x9c",
      "\xc3\x99",
      "\xc3\x9a",
      "\xc2\x9f",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x37",
      0x00000005 => "\x2d",
      0x00000006 => "\x2e",
      0x00000007 => "\x2f",
      0x00000008 => "\x16",
      0x00000009 => "\x05",
      0x0000000a => "\x25",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x3c",
      0x00000015 => "\x3d",
      0x00000016 => "\x32",
      0x00000017 => "\x26",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x3f",
      0x0000001b => "\x27",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x40",
      0x00000021 => "\xbb",
      0x00000022 => "\x7f",
      0x00000023 => "\x69",
      0x00000024 => "\x5b",
      0x00000025 => "\x6c",
      0x00000026 => "\x50",
      0x00000027 => "\x7d",
      0x00000028 => "\x4d",
      0x00000029 => "\x5d",
      0x0000002a => "\x5c",
      0x0000002b => "\x4e",
      0x0000002c => "\x6b",
      0x0000002d => "\x60",
      0x0000002e => "\x4b",
      0x0000002f => "\x61",
      0x00000030 => "\xf0",
      0x00000031 => "\xf1",
      0x00000032 => "\xf2",
      0x00000033 => "\xf3",
      0x00000034 => "\xf4",
      0x00000035 => "\xf5",
      0x00000036 => "\xf6",
      0x00000037 => "\xf7",
      0x00000038 => "\xf8",
      0x00000039 => "\xf9",
      0x0000003a => "\x7a",
      0x0000003b => "\x5e",
      0x0000003c => "\x4c",
      0x0000003d => "\x7e",
      0x0000003e => "\x6e",
      0x0000003f => "\x6f",
      0x00000040 => "\x7c",
      0x00000041 => "\xc1",
      0x00000042 => "\xc2",
      0x00000043 => "\xc3",
      0x00000044 => "\xc4",
      0x00000045 => "\xc5",
      0x00000046 => "\xc6",
      0x00000047 => "\xc7",
      0x00000048 => "\xc8",
      0x00000049 => "\xc9",
      0x0000004a => "\xd1",
      0x0000004b => "\xd2",
      0x0000004c => "\xd3",
      0x0000004d => "\xd4",
      0x0000004e => "\xd5",
      0x0000004f => "\xd6",
      0x00000050 => "\xd7",
      0x00000051 => "\xd8",
      0x00000052 => "\xd9",
      0x00000053 => "\xe2",
      0x00000054 => "\xe3",
      0x00000055 => "\xe4",
      0x00000056 => "\xe5",
      0x00000057 => "\xe6",
      0x00000058 => "\xe7",
      0x00000059 => "\xe8",
      0x0000005a => "\xe9",
      0x0000005b => "\x4a",
      0x0000005c => "\xe0",
      0x0000005d => "\x5a",
      0x0000005e => "\xba",
      0x0000005f => "\x6d",
      0x00000060 => "\x79",
      0x00000061 => "\x81",
      0x00000062 => "\x82",
      0x00000063 => "\x83",
      0x00000064 => "\x84",
      0x00000065 => "\x85",
      0x00000066 => "\x86",
      0x00000067 => "\x87",
      0x00000068 => "\x88",
      0x00000069 => "\x89",
      0x0000006a => "\x91",
      0x0000006b => "\x92",
      0x0000006c => "\x93",
      0x0000006d => "\x94",
      0x0000006e => "\x95",
      0x0000006f => "\x96",
      0x00000070 => "\x97",
      0x00000071 => "\x98",
      0x00000072 => "\x99",
      0x00000073 => "\xa2",
      0x00000074 => "\xa3",
      0x00000075 => "\xa4",
      0x00000076 => "\xa5",
      0x00000077 => "\xa6",
      0x00000078 => "\xa7",
      0x00000079 => "\xa8",
      0x0000007a => "\xa9",
      0x0000007b => "\xc0",
      0x0000007c => "\x4f",
      0x0000007d => "\xd0",
      0x0000007e => "\xbd",
      0x0000007f => "\x07",
      0x00000080 => "\x20",
      0x00000081 => "\x21",
      0x00000082 => "\x22",
      0x00000083 => "\x23",
      0x00000084 => "\x24",
      0x00000085 => "\x15",
      0x00000086 => "\x06",
      0x00000087 => "\x17",
      0x00000088 => "\x28",
      0x00000089 => "\x29",
      0x0000008a => "\x2a",
      0x0000008b => "\x2b",
      0x0000008c => "\x2c",
      0x0000008d => "\x09",
      0x0000008e => "\x0a",
      0x0000008f => "\x1b",
      0x00000090 => "\x30",
      0x00000091 => "\x31",
      0x00000092 => "\x1a",
      0x00000093 => "\x33",
      0x00000094 => "\x34",
      0x00000095 => "\x35",
      0x00000096 => "\x36",
      0x00000097 => "\x08",
      0x00000098 => "\x38",
      0x00000099 => "\x39",
      0x0000009a => "\x3a",
      0x0000009b => "\x3b",
      0x0000009c => "\x04",
      0x0000009d => "\x14",
      0x0000009e => "\x3e",
      0x0000009f => "\xff",
      0x000000a0 => "\x41",
      0x000000a1 => "\xaa",
      0x000000a2 => "\xb0",
      0x000000a3 => "\xb1",
      0x000000a4 => "\x9f",
      0x000000a5 => "\xb2",
      0x000000a6 => "\x49",
      0x000000a7 => "\xb5",
      0x000000a8 => "\xa1",
      0x000000a9 => "\xb4",
      0x000000aa => "\x9a",
      0x000000ab => "\x8a",
      0x000000ac => "\x5f",
      0x000000ad => "\xca",
      0x000000ae => "\xaf",
      0x000000b0 => "\x90",
      0x000000b1 => "\x8f",
      0x000000b2 => "\xea",
      0x000000b3 => "\xfa",
      0x000000b4 => "\xbe",
      0x000000b5 => "\xa0",
      0x000000b6 => "\xb6",
      0x000000b7 => "\xb3",
      0x000000b8 => "\x9d",
      0x000000b9 => "\xda",
      0x000000ba => "\x9b",
      0x000000bb => "\x8b",
      0x000000bc => "\xb7",
      0x000000bd => "\xb8",
      0x000000be => "\xb9",
      0x000000bf => "\xab",
      0x000000c0 => "\x64",
      0x000000c1 => "\x65",
      0x000000c2 => "\x62",
      0x000000c3 => "\x66",
      0x000000c4 => "\x63",
      0x000000c5 => "\x67",
      0x000000c6 => "\x9e",
      0x000000c7 => "\x68",
      0x000000c8 => "\x74",
      0x000000c9 => "\x71",
      0x000000ca => "\x72",
      0x000000cb => "\x73",
      0x000000cc => "\x78",
      0x000000cd => "\x75",
      0x000000ce => "\x76",
      0x000000cf => "\x77",
      0x000000d0 => "\xac",
      0x000000d1 => "\x7b",
      0x000000d2 => "\xed",
      0x000000d3 => "\xee",
      0x000000d4 => "\xeb",
      0x000000d5 => "\xef",
      0x000000d6 => "\xec",
      0x000000d7 => "\xbf",
      0x000000d8 => "\x80",
      0x000000d9 => "\xfd",
      0x000000da => "\xfe",
      0x000000db => "\xfb",
      0x000000dc => "\xfc",
      0x000000dd => "\xad",
      0x000000de => "\xae",
      0x000000df => "\x59",
      0x000000e0 => "\x44",
      0x000000e1 => "\x45",
      0x000000e2 => "\x42",
      0x000000e3 => "\x46",
      0x000000e4 => "\x43",
      0x000000e5 => "\x47",
      0x000000e6 => "\x9c",
      0x000000e7 => "\x48",
      0x000000e8 => "\x54",
      0x000000e9 => "\x51",
      0x000000ea => "\x52",
      0x000000eb => "\x53",
      0x000000ec => "\x58",
      0x000000ed => "\x55",
      0x000000ee => "\x56",
      0x000000ef => "\x57",
      0x000000f0 => "\x8c",
      0x000000f1 => "\x6a",
      0x000000f2 => "\xcd",
      0x000000f3 => "\xce",
      0x000000f4 => "\xcb",
      0x000000f5 => "\xcf",
      0x000000f6 => "\xcc",
      0x000000f7 => "\xe1",
      0x000000f8 => "\x70",
      0x000000f9 => "\xdd",
      0x000000fa => "\xde",
      0x000000fb => "\xdb",
      0x000000fc => "\xdc",
      0x000000fd => "\x8d",
      0x000000fe => "\x8e",
      0x000000ff => "\xdf",
      0x0000203e => "\xbc",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x6f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::IBM284 - Conversion routines for IBM284
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for IBM284.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: IBM NLS RM Vol2 SE09-8002-01, March 1990
   alias CP284
   alias EBCDIC-CP-ES
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  0000009C | STRING TERMINATOR (ST)
      05 |  00000009 | CHARACTER TABULATION (HT)
      06 |  00000086 | START OF SELECTED AREA (SSA)
      07 |  0000007F | DELETE (DEL)
      08 |  00000097 | END OF GUARDED AREA (EPA)
      09 |  0000008D | REVERSE LINE FEED (RI)
      0A |  0000008E | SINGLE-SHIFT TWO (SS2)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  0000009D | OPERATING SYSTEM COMMAND (OSC)
      15 |  00000085 | NEXT LINE (NEL)
      16 |  00000008 | BACKSPACE (BS)
      17 |  00000087 | END OF SELECTED AREA (ESA)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  00000092 | PRIVATE USE TWO (PU2)
      1B |  0000008F | SINGLE-SHIFT THREE (SS3)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000080 | PADDING CHARACTER (PAD)
      21 |  00000081 | HIGH OCTET PRESET (HOP)
      22 |  00000082 | BREAK PERMITTED HERE (BPH)
      23 |  00000083 | NO BREAK HERE (NBH)
      24 |  00000084 | INDEX (IND)
      25 |  0000000A | LINE FEED (LF)
      26 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      27 |  0000001B | ESCAPE (ESC)
      28 |  00000088 | CHARACTER TABULATION SET (HTS)
      29 |  00000089 | CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
      2A |  0000008A | LINE TABULATION SET (VTS)
      2B |  0000008B | PARTIAL LINE FORWARD (PLD)
      2C |  0000008C | PARTIAL LINE BACKWARD (PLU)
      2D |  00000005 | ENQUIRY (ENQ)
      2E |  00000006 | ACKNOWLEDGE (ACK)
      2F |  00000007 | BELL (BEL)
      30 |  00000090 | DEVICE CONTROL STRING (DCS)
      31 |  00000091 | PRIVATE USE ONE (PU1)
      32 |  00000016 | SYNCHRONOUS IDLE (SYN)
      33 |  00000093 | SET TRANSMIT STATE (STS)
      34 |  00000094 | CANCEL CHARACTER (CCH)
      35 |  00000095 | MESSAGE WAITING (MW)
      36 |  00000096 | START OF GUARDED AREA (SPA)
      37 |  00000004 | END OF TRANSMISSION (EOT)
      38 |  00000098 | START OF STRING (SOS)
      39 |  00000099 | SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
      3A |  0000009A | SINGLE CHARACTER INTRODUCER (SCI)
      3B |  0000009B | CONTROL SEQUENCE INTRODUCER (CSI)
      3C |  00000014 | DEVICE CONTROL FOUR (DC4)
      3D |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      3E |  0000009E | PRIVACY MESSAGE (PM)
      3F |  0000001A | SUBSTITUTE (SUB)
      40 |  00000020 | SPACE
      41 |  000000A0 | NO-BREAK SPACE
      42 |  000000E2 | LATIN SMALL LETTER A WITH CIRCUMFLEX
      43 |  000000E4 | LATIN SMALL LETTER A WITH DIAERESIS
      44 |  000000E0 | LATIN SMALL LETTER A WITH GRAVE
      45 |  000000E1 | LATIN SMALL LETTER A WITH ACUTE
      46 |  000000E3 | LATIN SMALL LETTER A WITH TILDE
      47 |  000000E5 | LATIN SMALL LETTER A WITH RING ABOVE
      48 |  000000E7 | LATIN SMALL LETTER C WITH CEDILLA
      49 |  000000A6 | BROKEN BAR
      4A |  0000005B | LEFT SQUARE BRACKET
      4B |  0000002E | FULL STOP
      4C |  0000003C | LESS-THAN SIGN
      4D |  00000028 | LEFT PARENTHESIS
      4E |  0000002B | PLUS SIGN
      4F |  0000007C | VERTICAL LINE
      50 |  00000026 | AMPERSAND
      51 |  000000E9 | LATIN SMALL LETTER E WITH ACUTE
      52 |  000000EA | LATIN SMALL LETTER E WITH CIRCUMFLEX
      53 |  000000EB | LATIN SMALL LETTER E WITH DIAERESIS
      54 |  000000E8 | LATIN SMALL LETTER E WITH GRAVE
      55 |  000000ED | LATIN SMALL LETTER I WITH ACUTE
      56 |  000000EE | LATIN SMALL LETTER I WITH CIRCUMFLEX
      57 |  000000EF | LATIN SMALL LETTER I WITH DIAERESIS
      58 |  000000EC | LATIN SMALL LETTER I WITH GRAVE
      59 |  000000DF | LATIN SMALL LETTER SHARP S (German)
      5A |  0000005D | RIGHT SQUARE BRACKET
      5B |  00000024 | DOLLAR SIGN
      5C |  0000002A | ASTERISK
      5D |  00000029 | RIGHT PARENTHESIS
      5E |  0000003B | SEMICOLON
      5F |  000000AC | NOT SIGN
      60 |  0000002D | HYPHEN-MINUS
      61 |  0000002F | SOLIDUS
      62 |  000000C2 | LATIN CAPITAL LETTER A WITH CIRCUMFLEX
      63 |  000000C4 | LATIN CAPITAL LETTER A WITH DIAERESIS
      64 |  000000C0 | LATIN CAPITAL LETTER A WITH GRAVE
      65 |  000000C1 | LATIN CAPITAL LETTER A WITH ACUTE
      66 |  000000C3 | LATIN CAPITAL LETTER A WITH TILDE
      67 |  000000C5 | LATIN CAPITAL LETTER A WITH RING ABOVE
      68 |  000000C7 | LATIN CAPITAL LETTER C WITH CEDILLA
      69 |  00000023 | NUMBER SIGN
      6A |  000000F1 | LATIN SMALL LETTER N WITH TILDE
      6B |  0000002C | COMMA
      6C |  00000025 | PERCENT SIGN
      6D |  0000005F | LOW LINE
      6E |  0000003E | GREATER-THAN SIGN
      6F |  0000003F | QUESTION MARK
      70 |  000000F8 | LATIN SMALL LETTER O WITH STROKE
      71 |  000000C9 | LATIN CAPITAL LETTER E WITH ACUTE
      72 |  000000CA | LATIN CAPITAL LETTER E WITH CIRCUMFLEX
      73 |  000000CB | LATIN CAPITAL LETTER E WITH DIAERESIS
      74 |  000000C8 | LATIN CAPITAL LETTER E WITH GRAVE
      75 |  000000CD | LATIN CAPITAL LETTER I WITH ACUTE
      76 |  000000CE | LATIN CAPITAL LETTER I WITH CIRCUMFLEX
      77 |  000000CF | LATIN CAPITAL LETTER I WITH DIAERESIS
      78 |  000000CC | LATIN CAPITAL LETTER I WITH GRAVE
      79 |  00000060 | GRAVE ACCENT
      7A |  0000003A | COLON
      7B |  000000D1 | LATIN CAPITAL LETTER N WITH TILDE
      7C |  00000040 | COMMERCIAL AT
      7D |  00000027 | APOSTROPHE
      7E |  0000003D | EQUALS SIGN
      7F |  00000022 | QUOTATION MARK
      80 |  000000D8 | LATIN CAPITAL LETTER O WITH STROKE
      81 |  00000061 | LATIN SMALL LETTER A
      82 |  00000062 | LATIN SMALL LETTER B
      83 |  00000063 | LATIN SMALL LETTER C
      84 |  00000064 | LATIN SMALL LETTER D
      85 |  00000065 | LATIN SMALL LETTER E
      86 |  00000066 | LATIN SMALL LETTER F
      87 |  00000067 | LATIN SMALL LETTER G
      88 |  00000068 | LATIN SMALL LETTER H
      89 |  00000069 | LATIN SMALL LETTER I
      8A |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
      8B |  000000BB | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
      8C |  000000F0 | LATIN SMALL LETTER ETH (Icelandic)
      8D |  000000FD | LATIN SMALL LETTER Y WITH ACUTE
      8E |  000000FE | LATIN SMALL LETTER THORN (Icelandic)
      8F |  000000B1 | PLUS-MINUS SIGN
      90 |  000000B0 | DEGREE SIGN
      91 |  0000006A | LATIN SMALL LETTER J
      92 |  0000006B | LATIN SMALL LETTER K
      93 |  0000006C | LATIN SMALL LETTER L
      94 |  0000006D | LATIN SMALL LETTER M
      95 |  0000006E | LATIN SMALL LETTER N
      96 |  0000006F | LATIN SMALL LETTER O
      97 |  00000070 | LATIN SMALL LETTER P
      98 |  00000071 | LATIN SMALL LETTER Q
      99 |  00000072 | LATIN SMALL LETTER R
      9A |  000000AA | FEMININE ORDINAL INDICATOR
      9B |  000000BA | MASCULINE ORDINAL INDICATOR
      9C |  000000E6 | LATIN SMALL LETTER AE
      9D |  000000B8 | CEDILLA
      9E |  000000C6 | LATIN CAPITAL LETTER AE
      9F |  000000A4 | CURRENCY SIGN
      A0 |  000000B5 | MICRO SIGN
      A1 |  000000A8 | DIAERESIS
      A2 |  00000073 | LATIN SMALL LETTER S
      A3 |  00000074 | LATIN SMALL LETTER T
      A4 |  00000075 | LATIN SMALL LETTER U
      A5 |  00000076 | LATIN SMALL LETTER V
      A6 |  00000077 | LATIN SMALL LETTER W
      A7 |  00000078 | LATIN SMALL LETTER X
      A8 |  00000079 | LATIN SMALL LETTER Y
      A9 |  0000007A | LATIN SMALL LETTER Z
      AA |  000000A1 | INVERTED EXCLAMATION MARK
      AB |  000000BF | INVERTED QUESTION MARK
      AC |  000000D0 | LATIN CAPITAL LETTER ETH (Icelandic)
      AD |  000000DD | LATIN CAPITAL LETTER Y WITH ACUTE
      AE |  000000DE | LATIN CAPITAL LETTER THORN (Icelandic)
      AF |  000000AE | REGISTERED SIGN
      B0 |  000000A2 | CENT SIGN
      B1 |  000000A3 | POUND SIGN
      B2 |  000000A5 | YEN SIGN
      B3 |  000000B7 | MIDDLE DOT
      B4 |  000000A9 | COPYRIGHT SIGN
      B5 |  000000A7 | SECTION SIGN
      B6 |  000000B6 | PILCROW SIGN
      B7 |  000000BC | VULGAR FRACTION ONE QUARTER
      B8 |  000000BD | VULGAR FRACTION ONE HALF
      B9 |  000000BE | VULGAR FRACTION THREE QUARTERS
      BA |  0000005E | CIRCUMFLEX ACCENT
      BB |  00000021 | EXCLAMATION MARK
      BC |  0000203E | OVERLINE
      BD |  0000007E | TILDE
      BE |  000000B4 | ACUTE ACCENT
      BF |  000000D7 | MULTIPLICATION SIGN
      C0 |  0000007B | LEFT CURLY BRACKET
      C1 |  00000041 | LATIN CAPITAL LETTER A
      C2 |  00000042 | LATIN CAPITAL LETTER B
      C3 |  00000043 | LATIN CAPITAL LETTER C
      C4 |  00000044 | LATIN CAPITAL LETTER D
      C5 |  00000045 | LATIN CAPITAL LETTER E
      C6 |  00000046 | LATIN CAPITAL LETTER F
      C7 |  00000047 | LATIN CAPITAL LETTER G
      C8 |  00000048 | LATIN CAPITAL LETTER H
      C9 |  00000049 | LATIN CAPITAL LETTER I
      CA |  000000AD | SOFT HYPHEN
      CB |  000000F4 | LATIN SMALL LETTER O WITH CIRCUMFLEX
      CC |  000000F6 | LATIN SMALL LETTER O WITH DIAERESIS
      CD |  000000F2 | LATIN SMALL LETTER O WITH GRAVE
      CE |  000000F3 | LATIN SMALL LETTER O WITH ACUTE
      CF |  000000F5 | LATIN SMALL LETTER O WITH TILDE
      D0 |  0000007D | RIGHT CURLY BRACKET
      D1 |  0000004A | LATIN CAPITAL LETTER J
      D2 |  0000004B | LATIN CAPITAL LETTER K
      D3 |  0000004C | LATIN CAPITAL LETTER L
      D4 |  0000004D | LATIN CAPITAL LETTER M
      D5 |  0000004E | LATIN CAPITAL LETTER N
      D6 |  0000004F | LATIN CAPITAL LETTER O
      D7 |  00000050 | LATIN CAPITAL LETTER P
      D8 |  00000051 | LATIN CAPITAL LETTER Q
      D9 |  00000052 | LATIN CAPITAL LETTER R
      DA |  000000B9 | SUPERSCRIPT ONE
      DB |  000000FB | LATIN SMALL LETTER U WITH CIRCUMFLEX
      DC |  000000FC | LATIN SMALL LETTER U WITH DIAERESIS
      DD |  000000F9 | LATIN SMALL LETTER U WITH GRAVE
      DE |  000000FA | LATIN SMALL LETTER U WITH ACUTE
      DF |  000000FF | LATIN SMALL LETTER Y WITH DIAERESIS
      E0 |  0000005C | REVERSE SOLIDUS
      E1 |  000000F7 | DIVISION SIGN
      E2 |  00000053 | LATIN CAPITAL LETTER S
      E3 |  00000054 | LATIN CAPITAL LETTER T
      E4 |  00000055 | LATIN CAPITAL LETTER U
      E5 |  00000056 | LATIN CAPITAL LETTER V
      E6 |  00000057 | LATIN CAPITAL LETTER W
      E7 |  00000058 | LATIN CAPITAL LETTER X
      E8 |  00000059 | LATIN CAPITAL LETTER Y
      E9 |  0000005A | LATIN CAPITAL LETTER Z
      EA |  000000B2 | SUPERSCRIPT TWO
      EB |  000000D4 | LATIN CAPITAL LETTER O WITH CIRCUMFLEX
      EC |  000000D6 | LATIN CAPITAL LETTER O WITH DIAERESIS
      ED |  000000D2 | LATIN CAPITAL LETTER O WITH GRAVE
      EE |  000000D3 | LATIN CAPITAL LETTER O WITH ACUTE
      EF |  000000D5 | LATIN CAPITAL LETTER O WITH TILDE
      F0 |  00000030 | DIGIT ZERO
      F1 |  00000031 | DIGIT ONE
      F2 |  00000032 | DIGIT TWO
      F3 |  00000033 | DIGIT THREE
      F4 |  00000034 | DIGIT FOUR
      F5 |  00000035 | DIGIT FIVE
      F6 |  00000036 | DIGIT SIX
      F7 |  00000037 | DIGIT SEVEN
      F8 |  00000038 | DIGIT EIGHT
      F9 |  00000039 | DIGIT NINE
      FA |  000000B3 | SUPERSCRIPT THREE
      FB |  000000DB | LATIN CAPITAL LETTER U WITH CIRCUMFLEX
      FC |  000000DC | LATIN CAPITAL LETTER U WITH DIAERESIS
      FD |  000000D9 | LATIN CAPITAL LETTER U WITH GRAVE
      FE |  000000DA | LATIN CAPITAL LETTER U WITH ACUTE
      FF |  0000009F | APPLICATION PROGRAM COMMAND (APC)
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_IBM284

    $main::fatpacked{"Locale/RecodeData/IBM285.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_IBM285';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for IBM285.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::IBM285;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x009c,
      0x0009,
      0x0086,
      0x007f,
      0x0097,
      0x008d,
      0x008e,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x009d,
      0x0085,
      0x0008,
      0x0087,
      0x0018,
      0x0019,
      0x0092,
      0x008f,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0080,
      0x0081,
      0x0082,
      0x0083,
      0x0084,
      0x000a,
      0x0017,
      0x001b,
      0x0088,
      0x0089,
      0x008a,
      0x008b,
      0x008c,
      0x0005,
      0x0006,
      0x0007,
      0x0090,
      0x0091,
      0x0016,
      0x0093,
      0x0094,
      0x0095,
      0x0096,
      0x0004,
      0x0098,
      0x0099,
      0x009a,
      0x009b,
      0x0014,
      0x0015,
      0x009e,
      0x001a,
      0x0020,
      0x00a0,
      0x00e2,
      0x00e4,
      0x00e0,
      0x00e1,
      0x00e3,
      0x00e5,
      0x00e7,
      0x00f1,
      0x0024,
      0x002e,
      0x003c,
      0x0028,
      0x002b,
      0x007c,
      0x0026,
      0x00e9,
      0x00ea,
      0x00eb,
      0x00e8,
      0x00ed,
      0x00ee,
      0x00ef,
      0x00ec,
      0x00df,
      0x0021,
      0x00a3,
      0x002a,
      0x0029,
      0x003b,
      0x00ac,
      0x002d,
      0x002f,
      0x00c2,
      0x00c4,
      0x00c0,
      0x00c1,
      0x00c3,
      0x00c5,
      0x00c7,
      0x00d1,
      0x00a6,
      0x002c,
      0x0025,
      0x005f,
      0x003e,
      0x003f,
      0x00f8,
      0x00c9,
      0x00ca,
      0x00cb,
      0x00c8,
      0x00cd,
      0x00ce,
      0x00cf,
      0x00cc,
      0x0060,
      0x003a,
      0x0023,
      0x0040,
      0x0027,
      0x003d,
      0x0022,
      0x00d8,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x00ab,
      0x00bb,
      0x00f0,
      0x00fd,
      0x00fe,
      0x00b1,
      0x00b0,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x00aa,
      0x00ba,
      0x00e6,
      0x00b8,
      0x00c6,
      0x00a4,
      0x00b5,
      0x203e,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x00a1,
      0x00bf,
      0x00d0,
      0x00dd,
      0x00de,
      0x00ae,
      0x00a2,
      0x005b,
      0x00a5,
      0x00b7,
      0x00a9,
      0x00a7,
      0x00b6,
      0x00bc,
      0x00bd,
      0x00be,
      0x005e,
      0x005d,
      0x007e,
      0x00a8,
      0x00b4,
      0x00d7,
      0x007b,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x00ad,
      0x00f4,
      0x00f6,
      0x00f2,
      0x00f3,
      0x00f5,
      0x007d,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x00b9,
      0x00fb,
      0x00fc,
      0x00f9,
      0x00fa,
      0x00ff,
      0x005c,
      0x00f7,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x00b2,
      0x00d4,
      0x00d6,
      0x00d2,
      0x00d3,
      0x00d5,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x00b3,
      0x00db,
      0x00dc,
      0x00d9,
      0x00da,
      0x009f,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\xc2\x9c",
      "\x09",
      "\xc2\x86",
      "\x7f",
      "\xc2\x97",
      "\xc2\x8d",
      "\xc2\x8e",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\xc2\x9d",
      "\xc2\x85",
      "\x08",
      "\xc2\x87",
      "\x18",
      "\x19",
      "\xc2\x92",
      "\xc2\x8f",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\xc2\x80",
      "\xc2\x81",
      "\xc2\x82",
      "\xc2\x83",
      "\xc2\x84",
      "\x0a",
      "\x17",
      "\x1b",
      "\xc2\x88",
      "\xc2\x89",
      "\xc2\x8a",
      "\xc2\x8b",
      "\xc2\x8c",
      "\x05",
      "\x06",
      "\x07",
      "\xc2\x90",
      "\xc2\x91",
      "\x16",
      "\xc2\x93",
      "\xc2\x94",
      "\xc2\x95",
      "\xc2\x96",
      "\x04",
      "\xc2\x98",
      "\xc2\x99",
      "\xc2\x9a",
      "\xc2\x9b",
      "\x14",
      "\x15",
      "\xc2\x9e",
      "\x1a",
      "\x20",
      "\xc2\xa0",
      "\xc3\xa2",
      "\xc3\xa4",
      "\xc3\xa0",
      "\xc3\xa1",
      "\xc3\xa3",
      "\xc3\xa5",
      "\xc3\xa7",
      "\xc3\xb1",
      "\x24",
      "\x2e",
      "\x3c",
      "\x28",
      "\x2b",
      "\x7c",
      "\x26",
      "\xc3\xa9",
      "\xc3\xaa",
      "\xc3\xab",
      "\xc3\xa8",
      "\xc3\xad",
      "\xc3\xae",
      "\xc3\xaf",
      "\xc3\xac",
      "\xc3\x9f",
      "\x21",
      "\xc2\xa3",
      "\x2a",
      "\x29",
      "\x3b",
      "\xc2\xac",
      "\x2d",
      "\x2f",
      "\xc3\x82",
      "\xc3\x84",
      "\xc3\x80",
      "\xc3\x81",
      "\xc3\x83",
      "\xc3\x85",
      "\xc3\x87",
      "\xc3\x91",
      "\xc2\xa6",
      "\x2c",
      "\x25",
      "\x5f",
      "\x3e",
      "\x3f",
      "\xc3\xb8",
      "\xc3\x89",
      "\xc3\x8a",
      "\xc3\x8b",
      "\xc3\x88",
      "\xc3\x8d",
      "\xc3\x8e",
      "\xc3\x8f",
      "\xc3\x8c",
      "\x60",
      "\x3a",
      "\x23",
      "\x40",
      "\x27",
      "\x3d",
      "\x22",
      "\xc3\x98",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\xc2\xab",
      "\xc2\xbb",
      "\xc3\xb0",
      "\xc3\xbd",
      "\xc3\xbe",
      "\xc2\xb1",
      "\xc2\xb0",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\xc2\xaa",
      "\xc2\xba",
      "\xc3\xa6",
      "\xc2\xb8",
      "\xc3\x86",
      "\xc2\xa4",
      "\xc2\xb5",
      "\xe2\x80\xbe",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\xc2\xa1",
      "\xc2\xbf",
      "\xc3\x90",
      "\xc3\x9d",
      "\xc3\x9e",
      "\xc2\xae",
      "\xc2\xa2",
      "\x5b",
      "\xc2\xa5",
      "\xc2\xb7",
      "\xc2\xa9",
      "\xc2\xa7",
      "\xc2\xb6",
      "\xc2\xbc",
      "\xc2\xbd",
      "\xc2\xbe",
      "\x5e",
      "\x5d",
      "\x7e",
      "\xc2\xa8",
      "\xc2\xb4",
      "\xc3\x97",
      "\x7b",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\xc2\xad",
      "\xc3\xb4",
      "\xc3\xb6",
      "\xc3\xb2",
      "\xc3\xb3",
      "\xc3\xb5",
      "\x7d",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\xc2\xb9",
      "\xc3\xbb",
      "\xc3\xbc",
      "\xc3\xb9",
      "\xc3\xba",
      "\xc3\xbf",
      "\x5c",
      "\xc3\xb7",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\xc2\xb2",
      "\xc3\x94",
      "\xc3\x96",
      "\xc3\x92",
      "\xc3\x93",
      "\xc3\x95",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\xc2\xb3",
      "\xc3\x9b",
      "\xc3\x9c",
      "\xc3\x99",
      "\xc3\x9a",
      "\xc2\x9f",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x37",
      0x00000005 => "\x2d",
      0x00000006 => "\x2e",
      0x00000007 => "\x2f",
      0x00000008 => "\x16",
      0x00000009 => "\x05",
      0x0000000a => "\x25",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x3c",
      0x00000015 => "\x3d",
      0x00000016 => "\x32",
      0x00000017 => "\x26",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x3f",
      0x0000001b => "\x27",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x40",
      0x00000021 => "\x5a",
      0x00000022 => "\x7f",
      0x00000023 => "\x7b",
      0x00000024 => "\x4a",
      0x00000025 => "\x6c",
      0x00000026 => "\x50",
      0x00000027 => "\x7d",
      0x00000028 => "\x4d",
      0x00000029 => "\x5d",
      0x0000002a => "\x5c",
      0x0000002b => "\x4e",
      0x0000002c => "\x6b",
      0x0000002d => "\x60",
      0x0000002e => "\x4b",
      0x0000002f => "\x61",
      0x00000030 => "\xf0",
      0x00000031 => "\xf1",
      0x00000032 => "\xf2",
      0x00000033 => "\xf3",
      0x00000034 => "\xf4",
      0x00000035 => "\xf5",
      0x00000036 => "\xf6",
      0x00000037 => "\xf7",
      0x00000038 => "\xf8",
      0x00000039 => "\xf9",
      0x0000003a => "\x7a",
      0x0000003b => "\x5e",
      0x0000003c => "\x4c",
      0x0000003d => "\x7e",
      0x0000003e => "\x6e",
      0x0000003f => "\x6f",
      0x00000040 => "\x7c",
      0x00000041 => "\xc1",
      0x00000042 => "\xc2",
      0x00000043 => "\xc3",
      0x00000044 => "\xc4",
      0x00000045 => "\xc5",
      0x00000046 => "\xc6",
      0x00000047 => "\xc7",
      0x00000048 => "\xc8",
      0x00000049 => "\xc9",
      0x0000004a => "\xd1",
      0x0000004b => "\xd2",
      0x0000004c => "\xd3",
      0x0000004d => "\xd4",
      0x0000004e => "\xd5",
      0x0000004f => "\xd6",
      0x00000050 => "\xd7",
      0x00000051 => "\xd8",
      0x00000052 => "\xd9",
      0x00000053 => "\xe2",
      0x00000054 => "\xe3",
      0x00000055 => "\xe4",
      0x00000056 => "\xe5",
      0x00000057 => "\xe6",
      0x00000058 => "\xe7",
      0x00000059 => "\xe8",
      0x0000005a => "\xe9",
      0x0000005b => "\xb1",
      0x0000005c => "\xe0",
      0x0000005d => "\xbb",
      0x0000005e => "\xba",
      0x0000005f => "\x6d",
      0x00000060 => "\x79",
      0x00000061 => "\x81",
      0x00000062 => "\x82",
      0x00000063 => "\x83",
      0x00000064 => "\x84",
      0x00000065 => "\x85",
      0x00000066 => "\x86",
      0x00000067 => "\x87",
      0x00000068 => "\x88",
      0x00000069 => "\x89",
      0x0000006a => "\x91",
      0x0000006b => "\x92",
      0x0000006c => "\x93",
      0x0000006d => "\x94",
      0x0000006e => "\x95",
      0x0000006f => "\x96",
      0x00000070 => "\x97",
      0x00000071 => "\x98",
      0x00000072 => "\x99",
      0x00000073 => "\xa2",
      0x00000074 => "\xa3",
      0x00000075 => "\xa4",
      0x00000076 => "\xa5",
      0x00000077 => "\xa6",
      0x00000078 => "\xa7",
      0x00000079 => "\xa8",
      0x0000007a => "\xa9",
      0x0000007b => "\xc0",
      0x0000007c => "\x4f",
      0x0000007d => "\xd0",
      0x0000007e => "\xbc",
      0x0000007f => "\x07",
      0x00000080 => "\x20",
      0x00000081 => "\x21",
      0x00000082 => "\x22",
      0x00000083 => "\x23",
      0x00000084 => "\x24",
      0x00000085 => "\x15",
      0x00000086 => "\x06",
      0x00000087 => "\x17",
      0x00000088 => "\x28",
      0x00000089 => "\x29",
      0x0000008a => "\x2a",
      0x0000008b => "\x2b",
      0x0000008c => "\x2c",
      0x0000008d => "\x09",
      0x0000008e => "\x0a",
      0x0000008f => "\x1b",
      0x00000090 => "\x30",
      0x00000091 => "\x31",
      0x00000092 => "\x1a",
      0x00000093 => "\x33",
      0x00000094 => "\x34",
      0x00000095 => "\x35",
      0x00000096 => "\x36",
      0x00000097 => "\x08",
      0x00000098 => "\x38",
      0x00000099 => "\x39",
      0x0000009a => "\x3a",
      0x0000009b => "\x3b",
      0x0000009c => "\x04",
      0x0000009d => "\x14",
      0x0000009e => "\x3e",
      0x0000009f => "\xff",
      0x000000a0 => "\x41",
      0x000000a1 => "\xaa",
      0x000000a2 => "\xb0",
      0x000000a3 => "\x5b",
      0x000000a4 => "\x9f",
      0x000000a5 => "\xb2",
      0x000000a6 => "\x6a",
      0x000000a7 => "\xb5",
      0x000000a8 => "\xbd",
      0x000000a9 => "\xb4",
      0x000000aa => "\x9a",
      0x000000ab => "\x8a",
      0x000000ac => "\x5f",
      0x000000ad => "\xca",
      0x000000ae => "\xaf",
      0x000000b0 => "\x90",
      0x000000b1 => "\x8f",
      0x000000b2 => "\xea",
      0x000000b3 => "\xfa",
      0x000000b4 => "\xbe",
      0x000000b5 => "\xa0",
      0x000000b6 => "\xb6",
      0x000000b7 => "\xb3",
      0x000000b8 => "\x9d",
      0x000000b9 => "\xda",
      0x000000ba => "\x9b",
      0x000000bb => "\x8b",
      0x000000bc => "\xb7",
      0x000000bd => "\xb8",
      0x000000be => "\xb9",
      0x000000bf => "\xab",
      0x000000c0 => "\x64",
      0x000000c1 => "\x65",
      0x000000c2 => "\x62",
      0x000000c3 => "\x66",
      0x000000c4 => "\x63",
      0x000000c5 => "\x67",
      0x000000c6 => "\x9e",
      0x000000c7 => "\x68",
      0x000000c8 => "\x74",
      0x000000c9 => "\x71",
      0x000000ca => "\x72",
      0x000000cb => "\x73",
      0x000000cc => "\x78",
      0x000000cd => "\x75",
      0x000000ce => "\x76",
      0x000000cf => "\x77",
      0x000000d0 => "\xac",
      0x000000d1 => "\x69",
      0x000000d2 => "\xed",
      0x000000d3 => "\xee",
      0x000000d4 => "\xeb",
      0x000000d5 => "\xef",
      0x000000d6 => "\xec",
      0x000000d7 => "\xbf",
      0x000000d8 => "\x80",
      0x000000d9 => "\xfd",
      0x000000da => "\xfe",
      0x000000db => "\xfb",
      0x000000dc => "\xfc",
      0x000000dd => "\xad",
      0x000000de => "\xae",
      0x000000df => "\x59",
      0x000000e0 => "\x44",
      0x000000e1 => "\x45",
      0x000000e2 => "\x42",
      0x000000e3 => "\x46",
      0x000000e4 => "\x43",
      0x000000e5 => "\x47",
      0x000000e6 => "\x9c",
      0x000000e7 => "\x48",
      0x000000e8 => "\x54",
      0x000000e9 => "\x51",
      0x000000ea => "\x52",
      0x000000eb => "\x53",
      0x000000ec => "\x58",
      0x000000ed => "\x55",
      0x000000ee => "\x56",
      0x000000ef => "\x57",
      0x000000f0 => "\x8c",
      0x000000f1 => "\x49",
      0x000000f2 => "\xcd",
      0x000000f3 => "\xce",
      0x000000f4 => "\xcb",
      0x000000f5 => "\xcf",
      0x000000f6 => "\xcc",
      0x000000f7 => "\xe1",
      0x000000f8 => "\x70",
      0x000000f9 => "\xdd",
      0x000000fa => "\xde",
      0x000000fb => "\xdb",
      0x000000fc => "\xdc",
      0x000000fd => "\x8d",
      0x000000fe => "\x8e",
      0x000000ff => "\xdf",
      0x0000203e => "\xa1",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x6f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::IBM285 - Conversion routines for IBM285
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for IBM285.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: IBM NLS RM Vol2 SE09-8002-01, March 1990
   alias CP285
   alias EBCDIC-CP-GB
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  0000009C | STRING TERMINATOR (ST)
      05 |  00000009 | CHARACTER TABULATION (HT)
      06 |  00000086 | START OF SELECTED AREA (SSA)
      07 |  0000007F | DELETE (DEL)
      08 |  00000097 | END OF GUARDED AREA (EPA)
      09 |  0000008D | REVERSE LINE FEED (RI)
      0A |  0000008E | SINGLE-SHIFT TWO (SS2)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  0000009D | OPERATING SYSTEM COMMAND (OSC)
      15 |  00000085 | NEXT LINE (NEL)
      16 |  00000008 | BACKSPACE (BS)
      17 |  00000087 | END OF SELECTED AREA (ESA)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  00000092 | PRIVATE USE TWO (PU2)
      1B |  0000008F | SINGLE-SHIFT THREE (SS3)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000080 | PADDING CHARACTER (PAD)
      21 |  00000081 | HIGH OCTET PRESET (HOP)
      22 |  00000082 | BREAK PERMITTED HERE (BPH)
      23 |  00000083 | NO BREAK HERE (NBH)
      24 |  00000084 | INDEX (IND)
      25 |  0000000A | LINE FEED (LF)
      26 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      27 |  0000001B | ESCAPE (ESC)
      28 |  00000088 | CHARACTER TABULATION SET (HTS)
      29 |  00000089 | CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
      2A |  0000008A | LINE TABULATION SET (VTS)
      2B |  0000008B | PARTIAL LINE FORWARD (PLD)
      2C |  0000008C | PARTIAL LINE BACKWARD (PLU)
      2D |  00000005 | ENQUIRY (ENQ)
      2E |  00000006 | ACKNOWLEDGE (ACK)
      2F |  00000007 | BELL (BEL)
      30 |  00000090 | DEVICE CONTROL STRING (DCS)
      31 |  00000091 | PRIVATE USE ONE (PU1)
      32 |  00000016 | SYNCHRONOUS IDLE (SYN)
      33 |  00000093 | SET TRANSMIT STATE (STS)
      34 |  00000094 | CANCEL CHARACTER (CCH)
      35 |  00000095 | MESSAGE WAITING (MW)
      36 |  00000096 | START OF GUARDED AREA (SPA)
      37 |  00000004 | END OF TRANSMISSION (EOT)
      38 |  00000098 | START OF STRING (SOS)
      39 |  00000099 | SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
      3A |  0000009A | SINGLE CHARACTER INTRODUCER (SCI)
      3B |  0000009B | CONTROL SEQUENCE INTRODUCER (CSI)
      3C |  00000014 | DEVICE CONTROL FOUR (DC4)
      3D |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      3E |  0000009E | PRIVACY MESSAGE (PM)
      3F |  0000001A | SUBSTITUTE (SUB)
      40 |  00000020 | SPACE
      41 |  000000A0 | NO-BREAK SPACE
      42 |  000000E2 | LATIN SMALL LETTER A WITH CIRCUMFLEX
      43 |  000000E4 | LATIN SMALL LETTER A WITH DIAERESIS
      44 |  000000E0 | LATIN SMALL LETTER A WITH GRAVE
      45 |  000000E1 | LATIN SMALL LETTER A WITH ACUTE
      46 |  000000E3 | LATIN SMALL LETTER A WITH TILDE
      47 |  000000E5 | LATIN SMALL LETTER A WITH RING ABOVE
      48 |  000000E7 | LATIN SMALL LETTER C WITH CEDILLA
      49 |  000000F1 | LATIN SMALL LETTER N WITH TILDE
      4A |  00000024 | DOLLAR SIGN
      4B |  0000002E | FULL STOP
      4C |  0000003C | LESS-THAN SIGN
      4D |  00000028 | LEFT PARENTHESIS
      4E |  0000002B | PLUS SIGN
      4F |  0000007C | VERTICAL LINE
      50 |  00000026 | AMPERSAND
      51 |  000000E9 | LATIN SMALL LETTER E WITH ACUTE
      52 |  000000EA | LATIN SMALL LETTER E WITH CIRCUMFLEX
      53 |  000000EB | LATIN SMALL LETTER E WITH DIAERESIS
      54 |  000000E8 | LATIN SMALL LETTER E WITH GRAVE
      55 |  000000ED | LATIN SMALL LETTER I WITH ACUTE
      56 |  000000EE | LATIN SMALL LETTER I WITH CIRCUMFLEX
      57 |  000000EF | LATIN SMALL LETTER I WITH DIAERESIS
      58 |  000000EC | LATIN SMALL LETTER I WITH GRAVE
      59 |  000000DF | LATIN SMALL LETTER SHARP S (German)
      5A |  00000021 | EXCLAMATION MARK
      5B |  000000A3 | POUND SIGN
      5C |  0000002A | ASTERISK
      5D |  00000029 | RIGHT PARENTHESIS
      5E |  0000003B | SEMICOLON
      5F |  000000AC | NOT SIGN
      60 |  0000002D | HYPHEN-MINUS
      61 |  0000002F | SOLIDUS
      62 |  000000C2 | LATIN CAPITAL LETTER A WITH CIRCUMFLEX
      63 |  000000C4 | LATIN CAPITAL LETTER A WITH DIAERESIS
      64 |  000000C0 | LATIN CAPITAL LETTER A WITH GRAVE
      65 |  000000C1 | LATIN CAPITAL LETTER A WITH ACUTE
      66 |  000000C3 | LATIN CAPITAL LETTER A WITH TILDE
      67 |  000000C5 | LATIN CAPITAL LETTER A WITH RING ABOVE
      68 |  000000C7 | LATIN CAPITAL LETTER C WITH CEDILLA
      69 |  000000D1 | LATIN CAPITAL LETTER N WITH TILDE
      6A |  000000A6 | BROKEN BAR
      6B |  0000002C | COMMA
      6C |  00000025 | PERCENT SIGN
      6D |  0000005F | LOW LINE
      6E |  0000003E | GREATER-THAN SIGN
      6F |  0000003F | QUESTION MARK
      70 |  000000F8 | LATIN SMALL LETTER O WITH STROKE
      71 |  000000C9 | LATIN CAPITAL LETTER E WITH ACUTE
      72 |  000000CA | LATIN CAPITAL LETTER E WITH CIRCUMFLEX
      73 |  000000CB | LATIN CAPITAL LETTER E WITH DIAERESIS
      74 |  000000C8 | LATIN CAPITAL LETTER E WITH GRAVE
      75 |  000000CD | LATIN CAPITAL LETTER I WITH ACUTE
      76 |  000000CE | LATIN CAPITAL LETTER I WITH CIRCUMFLEX
      77 |  000000CF | LATIN CAPITAL LETTER I WITH DIAERESIS
      78 |  000000CC | LATIN CAPITAL LETTER I WITH GRAVE
      79 |  00000060 | GRAVE ACCENT
      7A |  0000003A | COLON
      7B |  00000023 | NUMBER SIGN
      7C |  00000040 | COMMERCIAL AT
      7D |  00000027 | APOSTROPHE
      7E |  0000003D | EQUALS SIGN
      7F |  00000022 | QUOTATION MARK
      80 |  000000D8 | LATIN CAPITAL LETTER O WITH STROKE
      81 |  00000061 | LATIN SMALL LETTER A
      82 |  00000062 | LATIN SMALL LETTER B
      83 |  00000063 | LATIN SMALL LETTER C
      84 |  00000064 | LATIN SMALL LETTER D
      85 |  00000065 | LATIN SMALL LETTER E
      86 |  00000066 | LATIN SMALL LETTER F
      87 |  00000067 | LATIN SMALL LETTER G
      88 |  00000068 | LATIN SMALL LETTER H
      89 |  00000069 | LATIN SMALL LETTER I
      8A |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
      8B |  000000BB | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
      8C |  000000F0 | LATIN SMALL LETTER ETH (Icelandic)
      8D |  000000FD | LATIN SMALL LETTER Y WITH ACUTE
      8E |  000000FE | LATIN SMALL LETTER THORN (Icelandic)
      8F |  000000B1 | PLUS-MINUS SIGN
      90 |  000000B0 | DEGREE SIGN
      91 |  0000006A | LATIN SMALL LETTER J
      92 |  0000006B | LATIN SMALL LETTER K
      93 |  0000006C | LATIN SMALL LETTER L
      94 |  0000006D | LATIN SMALL LETTER M
      95 |  0000006E | LATIN SMALL LETTER N
      96 |  0000006F | LATIN SMALL LETTER O
      97 |  00000070 | LATIN SMALL LETTER P
      98 |  00000071 | LATIN SMALL LETTER Q
      99 |  00000072 | LATIN SMALL LETTER R
      9A |  000000AA | FEMININE ORDINAL INDICATOR
      9B |  000000BA | MASCULINE ORDINAL INDICATOR
      9C |  000000E6 | LATIN SMALL LETTER AE
      9D |  000000B8 | CEDILLA
      9E |  000000C6 | LATIN CAPITAL LETTER AE
      9F |  000000A4 | CURRENCY SIGN
      A0 |  000000B5 | MICRO SIGN
      A1 |  0000203E | OVERLINE
      A2 |  00000073 | LATIN SMALL LETTER S
      A3 |  00000074 | LATIN SMALL LETTER T
      A4 |  00000075 | LATIN SMALL LETTER U
      A5 |  00000076 | LATIN SMALL LETTER V
      A6 |  00000077 | LATIN SMALL LETTER W
      A7 |  00000078 | LATIN SMALL LETTER X
      A8 |  00000079 | LATIN SMALL LETTER Y
      A9 |  0000007A | LATIN SMALL LETTER Z
      AA |  000000A1 | INVERTED EXCLAMATION MARK
      AB |  000000BF | INVERTED QUESTION MARK
      AC |  000000D0 | LATIN CAPITAL LETTER ETH (Icelandic)
      AD |  000000DD | LATIN CAPITAL LETTER Y WITH ACUTE
      AE |  000000DE | LATIN CAPITAL LETTER THORN (Icelandic)
      AF |  000000AE | REGISTERED SIGN
      B0 |  000000A2 | CENT SIGN
      B1 |  0000005B | LEFT SQUARE BRACKET
      B2 |  000000A5 | YEN SIGN
      B3 |  000000B7 | MIDDLE DOT
      B4 |  000000A9 | COPYRIGHT SIGN
      B5 |  000000A7 | SECTION SIGN
      B6 |  000000B6 | PILCROW SIGN
      B7 |  000000BC | VULGAR FRACTION ONE QUARTER
      B8 |  000000BD | VULGAR FRACTION ONE HALF
      B9 |  000000BE | VULGAR FRACTION THREE QUARTERS
      BA |  0000005E | CIRCUMFLEX ACCENT
      BB |  0000005D | RIGHT SQUARE BRACKET
      BC |  0000007E | TILDE
      BD |  000000A8 | DIAERESIS
      BE |  000000B4 | ACUTE ACCENT
      BF |  000000D7 | MULTIPLICATION SIGN
      C0 |  0000007B | LEFT CURLY BRACKET
      C1 |  00000041 | LATIN CAPITAL LETTER A
      C2 |  00000042 | LATIN CAPITAL LETTER B
      C3 |  00000043 | LATIN CAPITAL LETTER C
      C4 |  00000044 | LATIN CAPITAL LETTER D
      C5 |  00000045 | LATIN CAPITAL LETTER E
      C6 |  00000046 | LATIN CAPITAL LETTER F
      C7 |  00000047 | LATIN CAPITAL LETTER G
      C8 |  00000048 | LATIN CAPITAL LETTER H
      C9 |  00000049 | LATIN CAPITAL LETTER I
      CA |  000000AD | SOFT HYPHEN
      CB |  000000F4 | LATIN SMALL LETTER O WITH CIRCUMFLEX
      CC |  000000F6 | LATIN SMALL LETTER O WITH DIAERESIS
      CD |  000000F2 | LATIN SMALL LETTER O WITH GRAVE
      CE |  000000F3 | LATIN SMALL LETTER O WITH ACUTE
      CF |  000000F5 | LATIN SMALL LETTER O WITH TILDE
      D0 |  0000007D | RIGHT CURLY BRACKET
      D1 |  0000004A | LATIN CAPITAL LETTER J
      D2 |  0000004B | LATIN CAPITAL LETTER K
      D3 |  0000004C | LATIN CAPITAL LETTER L
      D4 |  0000004D | LATIN CAPITAL LETTER M
      D5 |  0000004E | LATIN CAPITAL LETTER N
      D6 |  0000004F | LATIN CAPITAL LETTER O
      D7 |  00000050 | LATIN CAPITAL LETTER P
      D8 |  00000051 | LATIN CAPITAL LETTER Q
      D9 |  00000052 | LATIN CAPITAL LETTER R
      DA |  000000B9 | SUPERSCRIPT ONE
      DB |  000000FB | LATIN SMALL LETTER U WITH CIRCUMFLEX
      DC |  000000FC | LATIN SMALL LETTER U WITH DIAERESIS
      DD |  000000F9 | LATIN SMALL LETTER U WITH GRAVE
      DE |  000000FA | LATIN SMALL LETTER U WITH ACUTE
      DF |  000000FF | LATIN SMALL LETTER Y WITH DIAERESIS
      E0 |  0000005C | REVERSE SOLIDUS
      E1 |  000000F7 | DIVISION SIGN
      E2 |  00000053 | LATIN CAPITAL LETTER S
      E3 |  00000054 | LATIN CAPITAL LETTER T
      E4 |  00000055 | LATIN CAPITAL LETTER U
      E5 |  00000056 | LATIN CAPITAL LETTER V
      E6 |  00000057 | LATIN CAPITAL LETTER W
      E7 |  00000058 | LATIN CAPITAL LETTER X
      E8 |  00000059 | LATIN CAPITAL LETTER Y
      E9 |  0000005A | LATIN CAPITAL LETTER Z
      EA |  000000B2 | SUPERSCRIPT TWO
      EB |  000000D4 | LATIN CAPITAL LETTER O WITH CIRCUMFLEX
      EC |  000000D6 | LATIN CAPITAL LETTER O WITH DIAERESIS
      ED |  000000D2 | LATIN CAPITAL LETTER O WITH GRAVE
      EE |  000000D3 | LATIN CAPITAL LETTER O WITH ACUTE
      EF |  000000D5 | LATIN CAPITAL LETTER O WITH TILDE
      F0 |  00000030 | DIGIT ZERO
      F1 |  00000031 | DIGIT ONE
      F2 |  00000032 | DIGIT TWO
      F3 |  00000033 | DIGIT THREE
      F4 |  00000034 | DIGIT FOUR
      F5 |  00000035 | DIGIT FIVE
      F6 |  00000036 | DIGIT SIX
      F7 |  00000037 | DIGIT SEVEN
      F8 |  00000038 | DIGIT EIGHT
      F9 |  00000039 | DIGIT NINE
      FA |  000000B3 | SUPERSCRIPT THREE
      FB |  000000DB | LATIN CAPITAL LETTER U WITH CIRCUMFLEX
      FC |  000000DC | LATIN CAPITAL LETTER U WITH DIAERESIS
      FD |  000000D9 | LATIN CAPITAL LETTER U WITH GRAVE
      FE |  000000DA | LATIN CAPITAL LETTER U WITH ACUTE
      FF |  0000009F | APPLICATION PROGRAM COMMAND (APC)
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_IBM285

    $main::fatpacked{"Locale/RecodeData/IBM290.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_IBM290';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for IBM290.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::IBM290;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x009c,
      0x0009,
      0x0086,
      0x007f,
      0x0097,
      0x008d,
      0x008e,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x009d,
      0x0085,
      0x0008,
      0x0087,
      0x0018,
      0x0019,
      0x0092,
      0x008f,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0080,
      0x0081,
      0x0082,
      0x0083,
      0x0084,
      0x000a,
      0x0017,
      0x001b,
      0x0088,
      0x0089,
      0x008a,
      0x008b,
      0x008c,
      0x0005,
      0x0006,
      0x0007,
      0x0090,
      0x0091,
      0x0016,
      0x0093,
      0x0094,
      0x0095,
      0x0096,
      0x0004,
      0x0098,
      0x0099,
      0x009a,
      0x009b,
      0x0014,
      0x0015,
      0x009e,
      0x001a,
      0x0020,
      0x3002,
      0x300c,
      0x300d,
      0x3001,
      0x30fb,
      0x30f2,
      0x30a1,
      0x30a3,
      0x30a5,
      0x00a3,
      0x002e,
      0x003c,
      0x0028,
      0x002b,
      0x007c,
      0x0026,
      0x30a7,
      0x30a9,
      0x30e3,
      0x30e5,
      0x30e7,
      0x30c3,
      0xfffd,
      0x30fc,
      0xfffd,
      0x0021,
      0x00a5,
      0x002a,
      0x0029,
      0x003b,
      0x00ac,
      0x002d,
      0x002f,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00a6,
      0x002c,
      0x0025,
      0x005f,
      0x003e,
      0x003f,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0060,
      0x003a,
      0x0023,
      0x0040,
      0x0027,
      0x003d,
      0x0022,
      0xfffd,
      0x30a2,
      0x30a4,
      0x30a6,
      0x30a8,
      0x30aa,
      0x30ab,
      0x30ad,
      0x30af,
      0x30b1,
      0x30b3,
      0xfffd,
      0x30b5,
      0x30b7,
      0x30b9,
      0x30bb,
      0x30bd,
      0x30bf,
      0x30c1,
      0x30c4,
      0x30c6,
      0x30c8,
      0x30ca,
      0x30cb,
      0x30cc,
      0x30cd,
      0x30ce,
      0xfffd,
      0xfffd,
      0x30cf,
      0x30d2,
      0x30d5,
      0xfffd,
      0x203e,
      0x30d8,
      0x30db,
      0x30de,
      0x30df,
      0x30e0,
      0x30e1,
      0x30e2,
      0x30e4,
      0x30e6,
      0xfffd,
      0x30e8,
      0x30e9,
      0x30ea,
      0x30eb,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x30ec,
      0x30ed,
      0x30ef,
      0x30f3,
      0x309b,
      0x309c,
      0xfffd,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0024,
      0xfffd,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x009f,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\xc2\x9c",
      "\x09",
      "\xc2\x86",
      "\x7f",
      "\xc2\x97",
      "\xc2\x8d",
      "\xc2\x8e",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\xc2\x9d",
      "\xc2\x85",
      "\x08",
      "\xc2\x87",
      "\x18",
      "\x19",
      "\xc2\x92",
      "\xc2\x8f",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\xc2\x80",
      "\xc2\x81",
      "\xc2\x82",
      "\xc2\x83",
      "\xc2\x84",
      "\x0a",
      "\x17",
      "\x1b",
      "\xc2\x88",
      "\xc2\x89",
      "\xc2\x8a",
      "\xc2\x8b",
      "\xc2\x8c",
      "\x05",
      "\x06",
      "\x07",
      "\xc2\x90",
      "\xc2\x91",
      "\x16",
      "\xc2\x93",
      "\xc2\x94",
      "\xc2\x95",
      "\xc2\x96",
      "\x04",
      "\xc2\x98",
      "\xc2\x99",
      "\xc2\x9a",
      "\xc2\x9b",
      "\x14",
      "\x15",
      "\xc2\x9e",
      "\x1a",
      "\x20",
      "\xe3\x80\x82",
      "\xe3\x80\x8c",
      "\xe3\x80\x8d",
      "\xe3\x80\x81",
      "\xe3\x83\xbb",
      "\xe3\x83\xb2",
      "\xe3\x82\xa1",
      "\xe3\x82\xa3",
      "\xe3\x82\xa5",
      "\xc2\xa3",
      "\x2e",
      "\x3c",
      "\x28",
      "\x2b",
      "\x7c",
      "\x26",
      "\xe3\x82\xa7",
      "\xe3\x82\xa9",
      "\xe3\x83\xa3",
      "\xe3\x83\xa5",
      "\xe3\x83\xa7",
      "\xe3\x83\x83",
      "\xef\xbf\xbd",
      "\xe3\x83\xbc",
      "\xef\xbf\xbd",
      "\x21",
      "\xc2\xa5",
      "\x2a",
      "\x29",
      "\x3b",
      "\xc2\xac",
      "\x2d",
      "\x2f",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc2\xa6",
      "\x2c",
      "\x25",
      "\x5f",
      "\x3e",
      "\x3f",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x60",
      "\x3a",
      "\x23",
      "\x40",
      "\x27",
      "\x3d",
      "\x22",
      "\xef\xbf\xbd",
      "\xe3\x82\xa2",
      "\xe3\x82\xa4",
      "\xe3\x82\xa6",
      "\xe3\x82\xa8",
      "\xe3\x82\xaa",
      "\xe3\x82\xab",
      "\xe3\x82\xad",
      "\xe3\x82\xaf",
      "\xe3\x82\xb1",
      "\xe3\x82\xb3",
      "\xef\xbf\xbd",
      "\xe3\x82\xb5",
      "\xe3\x82\xb7",
      "\xe3\x82\xb9",
      "\xe3\x82\xbb",
      "\xe3\x82\xbd",
      "\xe3\x82\xbf",
      "\xe3\x83\x81",
      "\xe3\x83\x84",
      "\xe3\x83\x86",
      "\xe3\x83\x88",
      "\xe3\x83\x8a",
      "\xe3\x83\x8b",
      "\xe3\x83\x8c",
      "\xe3\x83\x8d",
      "\xe3\x83\x8e",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xe3\x83\x8f",
      "\xe3\x83\x92",
      "\xe3\x83\x95",
      "\xef\xbf\xbd",
      "\xe2\x80\xbe",
      "\xe3\x83\x98",
      "\xe3\x83\x9b",
      "\xe3\x83\x9e",
      "\xe3\x83\x9f",
      "\xe3\x83\xa0",
      "\xe3\x83\xa1",
      "\xe3\x83\xa2",
      "\xe3\x83\xa4",
      "\xe3\x83\xa6",
      "\xef\xbf\xbd",
      "\xe3\x83\xa8",
      "\xe3\x83\xa9",
      "\xe3\x83\xaa",
      "\xe3\x83\xab",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xe3\x83\xac",
      "\xe3\x83\xad",
      "\xe3\x83\xaf",
      "\xe3\x83\xb3",
      "\xe3\x82\x9b",
      "\xe3\x82\x9c",
      "\xef\xbf\xbd",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x24",
      "\xef\xbf\xbd",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc2\x9f",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x37",
      0x00000005 => "\x2d",
      0x00000006 => "\x2e",
      0x00000007 => "\x2f",
      0x00000008 => "\x16",
      0x00000009 => "\x05",
      0x0000000a => "\x25",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x3c",
      0x00000015 => "\x3d",
      0x00000016 => "\x32",
      0x00000017 => "\x26",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x3f",
      0x0000001b => "\x27",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x40",
      0x00000021 => "\x5a",
      0x00000022 => "\x7f",
      0x00000023 => "\x7b",
      0x00000024 => "\xe0",
      0x00000025 => "\x6c",
      0x00000026 => "\x50",
      0x00000027 => "\x7d",
      0x00000028 => "\x4d",
      0x00000029 => "\x5d",
      0x0000002a => "\x5c",
      0x0000002b => "\x4e",
      0x0000002c => "\x6b",
      0x0000002d => "\x60",
      0x0000002e => "\x4b",
      0x0000002f => "\x61",
      0x00000030 => "\xf0",
      0x00000031 => "\xf1",
      0x00000032 => "\xf2",
      0x00000033 => "\xf3",
      0x00000034 => "\xf4",
      0x00000035 => "\xf5",
      0x00000036 => "\xf6",
      0x00000037 => "\xf7",
      0x00000038 => "\xf8",
      0x00000039 => "\xf9",
      0x0000003a => "\x7a",
      0x0000003b => "\x5e",
      0x0000003c => "\x4c",
      0x0000003d => "\x7e",
      0x0000003e => "\x6e",
      0x0000003f => "\x6f",
      0x00000040 => "\x7c",
      0x00000041 => "\xc1",
      0x00000042 => "\xc2",
      0x00000043 => "\xc3",
      0x00000044 => "\xc4",
      0x00000045 => "\xc5",
      0x00000046 => "\xc6",
      0x00000047 => "\xc7",
      0x00000048 => "\xc8",
      0x00000049 => "\xc9",
      0x0000004a => "\xd1",
      0x0000004b => "\xd2",
      0x0000004c => "\xd3",
      0x0000004d => "\xd4",
      0x0000004e => "\xd5",
      0x0000004f => "\xd6",
      0x00000050 => "\xd7",
      0x00000051 => "\xd8",
      0x00000052 => "\xd9",
      0x00000053 => "\xe2",
      0x00000054 => "\xe3",
      0x00000055 => "\xe4",
      0x00000056 => "\xe5",
      0x00000057 => "\xe6",
      0x00000058 => "\xe7",
      0x00000059 => "\xe8",
      0x0000005a => "\xe9",
      0x0000005f => "\x6d",
      0x00000060 => "\x79",
      0x0000007c => "\x4f",
      0x0000007f => "\x07",
      0x00000080 => "\x20",
      0x00000081 => "\x21",
      0x00000082 => "\x22",
      0x00000083 => "\x23",
      0x00000084 => "\x24",
      0x00000085 => "\x15",
      0x00000086 => "\x06",
      0x00000087 => "\x17",
      0x00000088 => "\x28",
      0x00000089 => "\x29",
      0x0000008a => "\x2a",
      0x0000008b => "\x2b",
      0x0000008c => "\x2c",
      0x0000008d => "\x09",
      0x0000008e => "\x0a",
      0x0000008f => "\x1b",
      0x00000090 => "\x30",
      0x00000091 => "\x31",
      0x00000092 => "\x1a",
      0x00000093 => "\x33",
      0x00000094 => "\x34",
      0x00000095 => "\x35",
      0x00000096 => "\x36",
      0x00000097 => "\x08",
      0x00000098 => "\x38",
      0x00000099 => "\x39",
      0x0000009a => "\x3a",
      0x0000009b => "\x3b",
      0x0000009c => "\x04",
      0x0000009d => "\x14",
      0x0000009e => "\x3e",
      0x0000009f => "\xff",
      0x000000a3 => "\x4a",
      0x000000a5 => "\x5b",
      0x000000a6 => "\x6a",
      0x000000ac => "\x5f",
      0x0000203e => "\xa1",
      0x00003001 => "\x44",
      0x00003002 => "\x41",
      0x0000300c => "\x42",
      0x0000300d => "\x43",
      0x0000309b => "\xbe",
      0x0000309c => "\xbf",
      0x000030a1 => "\x47",
      0x000030a2 => "\x81",
      0x000030a3 => "\x48",
      0x000030a4 => "\x82",
      0x000030a5 => "\x49",
      0x000030a6 => "\x83",
      0x000030a7 => "\x51",
      0x000030a8 => "\x84",
      0x000030a9 => "\x52",
      0x000030aa => "\x85",
      0x000030ab => "\x86",
      0x000030ad => "\x87",
      0x000030af => "\x88",
      0x000030b1 => "\x89",
      0x000030b3 => "\x8a",
      0x000030b5 => "\x8c",
      0x000030b7 => "\x8d",
      0x000030b9 => "\x8e",
      0x000030bb => "\x8f",
      0x000030bd => "\x90",
      0x000030bf => "\x91",
      0x000030c1 => "\x92",
      0x000030c3 => "\x56",
      0x000030c4 => "\x93",
      0x000030c6 => "\x94",
      0x000030c8 => "\x95",
      0x000030ca => "\x96",
      0x000030cb => "\x97",
      0x000030cc => "\x98",
      0x000030cd => "\x99",
      0x000030ce => "\x9a",
      0x000030cf => "\x9d",
      0x000030d2 => "\x9e",
      0x000030d5 => "\x9f",
      0x000030d8 => "\xa2",
      0x000030db => "\xa3",
      0x000030de => "\xa4",
      0x000030df => "\xa5",
      0x000030e0 => "\xa6",
      0x000030e1 => "\xa7",
      0x000030e2 => "\xa8",
      0x000030e3 => "\x53",
      0x000030e4 => "\xa9",
      0x000030e5 => "\x54",
      0x000030e6 => "\xaa",
      0x000030e7 => "\x55",
      0x000030e8 => "\xac",
      0x000030e9 => "\xad",
      0x000030ea => "\xae",
      0x000030eb => "\xaf",
      0x000030ec => "\xba",
      0x000030ed => "\xbb",
      0x000030ef => "\xbc",
      0x000030f2 => "\x46",
      0x000030f3 => "\xbd",
      0x000030fb => "\x45",
      0x000030fc => "\x58",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x6f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::IBM290 - Conversion routines for IBM290
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for IBM290.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: IBM 3174 Character Set Ref, GA27-3831-02, March 1990
   alias CP290
   alias EBCDIC-JP-KANA
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  0000009C | STRING TERMINATOR (ST)
      05 |  00000009 | CHARACTER TABULATION (HT)
      06 |  00000086 | START OF SELECTED AREA (SSA)
      07 |  0000007F | DELETE (DEL)
      08 |  00000097 | END OF GUARDED AREA (EPA)
      09 |  0000008D | REVERSE LINE FEED (RI)
      0A |  0000008E | SINGLE-SHIFT TWO (SS2)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  0000009D | OPERATING SYSTEM COMMAND (OSC)
      15 |  00000085 | NEXT LINE (NEL)
      16 |  00000008 | BACKSPACE (BS)
      17 |  00000087 | END OF SELECTED AREA (ESA)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  00000092 | PRIVATE USE TWO (PU2)
      1B |  0000008F | SINGLE-SHIFT THREE (SS3)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000080 | PADDING CHARACTER (PAD)
      21 |  00000081 | HIGH OCTET PRESET (HOP)
      22 |  00000082 | BREAK PERMITTED HERE (BPH)
      23 |  00000083 | NO BREAK HERE (NBH)
      24 |  00000084 | INDEX (IND)
      25 |  0000000A | LINE FEED (LF)
      26 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      27 |  0000001B | ESCAPE (ESC)
      28 |  00000088 | CHARACTER TABULATION SET (HTS)
      29 |  00000089 | CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
      2A |  0000008A | LINE TABULATION SET (VTS)
      2B |  0000008B | PARTIAL LINE FORWARD (PLD)
      2C |  0000008C | PARTIAL LINE BACKWARD (PLU)
      2D |  00000005 | ENQUIRY (ENQ)
      2E |  00000006 | ACKNOWLEDGE (ACK)
      2F |  00000007 | BELL (BEL)
      30 |  00000090 | DEVICE CONTROL STRING (DCS)
      31 |  00000091 | PRIVATE USE ONE (PU1)
      32 |  00000016 | SYNCHRONOUS IDLE (SYN)
      33 |  00000093 | SET TRANSMIT STATE (STS)
      34 |  00000094 | CANCEL CHARACTER (CCH)
      35 |  00000095 | MESSAGE WAITING (MW)
      36 |  00000096 | START OF GUARDED AREA (SPA)
      37 |  00000004 | END OF TRANSMISSION (EOT)
      38 |  00000098 | START OF STRING (SOS)
      39 |  00000099 | SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
      3A |  0000009A | SINGLE CHARACTER INTRODUCER (SCI)
      3B |  0000009B | CONTROL SEQUENCE INTRODUCER (CSI)
      3C |  00000014 | DEVICE CONTROL FOUR (DC4)
      3D |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      3E |  0000009E | PRIVACY MESSAGE (PM)
      3F |  0000001A | SUBSTITUTE (SUB)
      40 |  00000020 | SPACE
      41 |  00003002 | IDEOGRAPHIC FULL STOP
      42 |  0000300C | LEFT CORNER BRACKET
      43 |  0000300D | RIGHT CORNER BRACKET
      44 |  00003001 | IDEOGRAPHIC COMMA
      45 |  000030FB | KATAKANA MIDDLE DOT
      46 |  000030F2 | KATAKANA LETTER WO
      47 |  000030A1 | KATAKANA LETTER SMALL A
      48 |  000030A3 | KATAKANA LETTER SMALL I
      49 |  000030A5 | KATAKANA LETTER SMALL U
      4A |  000000A3 | POUND SIGN
      4B |  0000002E | FULL STOP
      4C |  0000003C | LESS-THAN SIGN
      4D |  00000028 | LEFT PARENTHESIS
      4E |  0000002B | PLUS SIGN
      4F |  0000007C | VERTICAL LINE
      50 |  00000026 | AMPERSAND
      51 |  000030A7 | KATAKANA LETTER SMALL E
      52 |  000030A9 | KATAKANA LETTER SMALL O
      53 |  000030E3 | KATAKANA LETTER SMALL YA
      54 |  000030E5 | KATAKANA LETTER SMALL YU
      55 |  000030E7 | KATAKANA LETTER SMALL YO
      56 |  000030C3 | KATAKANA LETTER SMALL TU
      58 |  000030FC | KATAKANA-HIRAGANA PROLONGED SOUND MARK
      5A |  00000021 | EXCLAMATION MARK
      5B |  000000A5 | YEN SIGN
      5C |  0000002A | ASTERISK
      5D |  00000029 | RIGHT PARENTHESIS
      5E |  0000003B | SEMICOLON
      5F |  000000AC | NOT SIGN
      60 |  0000002D | HYPHEN-MINUS
      61 |  0000002F | SOLIDUS
      6A |  000000A6 | BROKEN BAR
      6B |  0000002C | COMMA
      6C |  00000025 | PERCENT SIGN
      6D |  0000005F | LOW LINE
      6E |  0000003E | GREATER-THAN SIGN
      6F |  0000003F | QUESTION MARK
      79 |  00000060 | GRAVE ACCENT
      7A |  0000003A | COLON
      7B |  00000023 | NUMBER SIGN
      7C |  00000040 | COMMERCIAL AT
      7D |  00000027 | APOSTROPHE
      7E |  0000003D | EQUALS SIGN
      7F |  00000022 | QUOTATION MARK
      81 |  000030A2 | KATAKANA LETTER A
      82 |  000030A4 | KATAKANA LETTER I
      83 |  000030A6 | KATAKANA LETTER U
      84 |  000030A8 | KATAKANA LETTER E
      85 |  000030AA | KATAKANA LETTER O
      86 |  000030AB | KATAKANA LETTER KA
      87 |  000030AD | KATAKANA LETTER KI
      88 |  000030AF | KATAKANA LETTER KU
      89 |  000030B1 | KATAKANA LETTER KE
      8A |  000030B3 | KATAKANA LETTER KO
      8C |  000030B5 | KATAKANA LETTER SA
      8D |  000030B7 | KATAKANA LETTER SI
      8E |  000030B9 | KATAKANA LETTER SU
      8F |  000030BB | KATAKANA LETTER SE
      90 |  000030BD | KATAKANA LETTER SO
      91 |  000030BF | KATAKANA LETTER TA
      92 |  000030C1 | KATAKANA LETTER TI
      93 |  000030C4 | KATAKANA LETTER TU
      94 |  000030C6 | KATAKANA LETTER TE
      95 |  000030C8 | KATAKANA LETTER TO
      96 |  000030CA | KATAKANA LETTER NA
      97 |  000030CB | KATAKANA LETTER NI
      98 |  000030CC | KATAKANA LETTER NU
      99 |  000030CD | KATAKANA LETTER NE
      9A |  000030CE | KATAKANA LETTER NO
      9D |  000030CF | KATAKANA LETTER HA
      9E |  000030D2 | KATAKANA LETTER HI
      9F |  000030D5 | KATAKANA LETTER HU
      A1 |  0000203E | OVERLINE
      A2 |  000030D8 | KATAKANA LETTER HE
      A3 |  000030DB | KATAKANA LETTER HO
      A4 |  000030DE | KATAKANA LETTER MA
      A5 |  000030DF | KATAKANA LETTER MI
      A6 |  000030E0 | KATAKANA LETTER MU
      A7 |  000030E1 | KATAKANA LETTER ME
      A8 |  000030E2 | KATAKANA LETTER MO
      A9 |  000030E4 | KATAKANA LETTER YA
      AA |  000030E6 | KATAKANA LETTER YU
      AC |  000030E8 | KATAKANA LETTER YO
      AD |  000030E9 | KATAKANA LETTER RA
      AE |  000030EA | KATAKANA LETTER RI
      AF |  000030EB | KATAKANA LETTER RU
      BA |  000030EC | KATAKANA LETTER RE
      BB |  000030ED | KATAKANA LETTER RO
      BC |  000030EF | KATAKANA LETTER WA
      BD |  000030F3 | KATAKANA LETTER N
      BE |  0000309B | KATAKANA-HIRAGANA VOICED SOUND MARK
      BF |  0000309C | KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
      C1 |  00000041 | LATIN CAPITAL LETTER A
      C2 |  00000042 | LATIN CAPITAL LETTER B
      C3 |  00000043 | LATIN CAPITAL LETTER C
      C4 |  00000044 | LATIN CAPITAL LETTER D
      C5 |  00000045 | LATIN CAPITAL LETTER E
      C6 |  00000046 | LATIN CAPITAL LETTER F
      C7 |  00000047 | LATIN CAPITAL LETTER G
      C8 |  00000048 | LATIN CAPITAL LETTER H
      C9 |  00000049 | LATIN CAPITAL LETTER I
      D1 |  0000004A | LATIN CAPITAL LETTER J
      D2 |  0000004B | LATIN CAPITAL LETTER K
      D3 |  0000004C | LATIN CAPITAL LETTER L
      D4 |  0000004D | LATIN CAPITAL LETTER M
      D5 |  0000004E | LATIN CAPITAL LETTER N
      D6 |  0000004F | LATIN CAPITAL LETTER O
      D7 |  00000050 | LATIN CAPITAL LETTER P
      D8 |  00000051 | LATIN CAPITAL LETTER Q
      D9 |  00000052 | LATIN CAPITAL LETTER R
      E0 |  00000024 | DOLLAR SIGN
      E2 |  00000053 | LATIN CAPITAL LETTER S
      E3 |  00000054 | LATIN CAPITAL LETTER T
      E4 |  00000055 | LATIN CAPITAL LETTER U
      E5 |  00000056 | LATIN CAPITAL LETTER V
      E6 |  00000057 | LATIN CAPITAL LETTER W
      E7 |  00000058 | LATIN CAPITAL LETTER X
      E8 |  00000059 | LATIN CAPITAL LETTER Y
      E9 |  0000005A | LATIN CAPITAL LETTER Z
      F0 |  00000030 | DIGIT ZERO
      F1 |  00000031 | DIGIT ONE
      F2 |  00000032 | DIGIT TWO
      F3 |  00000033 | DIGIT THREE
      F4 |  00000034 | DIGIT FOUR
      F5 |  00000035 | DIGIT FIVE
      F6 |  00000036 | DIGIT SIX
      F7 |  00000037 | DIGIT SEVEN
      F8 |  00000038 | DIGIT EIGHT
      F9 |  00000039 | DIGIT NINE
      FF |  0000009F | APPLICATION PROGRAM COMMAND (APC)
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_IBM290

    $main::fatpacked{"Locale/RecodeData/IBM297.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_IBM297';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for IBM297.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::IBM297;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x009c,
      0x0009,
      0x0086,
      0x007f,
      0x0097,
      0x008d,
      0x008e,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x009d,
      0x0085,
      0x0008,
      0x0087,
      0x0018,
      0x0019,
      0x0092,
      0x008f,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0080,
      0x0081,
      0x0082,
      0x0083,
      0x0084,
      0x000a,
      0x0017,
      0x001b,
      0x0088,
      0x0089,
      0x008a,
      0x008b,
      0x008c,
      0x0005,
      0x0006,
      0x0007,
      0x0090,
      0x0091,
      0x0016,
      0x0093,
      0x0094,
      0x0095,
      0x0096,
      0x0004,
      0x0098,
      0x0099,
      0x009a,
      0x009b,
      0x0014,
      0x0015,
      0x009e,
      0x001a,
      0x0020,
      0x00a0,
      0x00e2,
      0x00e4,
      0x0040,
      0x00e1,
      0x00e3,
      0x00e5,
      0x005c,
      0x00f1,
      0x00b0,
      0x002e,
      0x003c,
      0x0028,
      0x002b,
      0x0021,
      0x0026,
      0x007b,
      0x00ea,
      0x00eb,
      0x007d,
      0x00ed,
      0x00ee,
      0x00ef,
      0x00ec,
      0x00df,
      0x00a7,
      0x0024,
      0x002a,
      0x0029,
      0x003b,
      0x005e,
      0x002d,
      0x002f,
      0x00c2,
      0x00c4,
      0x00c0,
      0x00c1,
      0x00c3,
      0x00c5,
      0x00c7,
      0x00d1,
      0x00f9,
      0x002c,
      0x0025,
      0x005f,
      0x003e,
      0x003f,
      0x00f8,
      0x00c9,
      0x00ca,
      0x00cb,
      0x00c8,
      0x00cd,
      0x00ce,
      0x00cf,
      0x00cc,
      0x00b5,
      0x003a,
      0x00a3,
      0x00e0,
      0x0027,
      0x003d,
      0x0022,
      0x00d8,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x00ab,
      0x00bb,
      0x00f0,
      0x00fd,
      0x00fe,
      0x00b1,
      0x005b,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x00aa,
      0x00ba,
      0x00e6,
      0x00b8,
      0x00c6,
      0x00a4,
      0x0060,
      0x00a8,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x00a1,
      0x00bf,
      0x00d0,
      0x00dd,
      0x00de,
      0x00ae,
      0x00a2,
      0x0023,
      0x00a5,
      0x00b7,
      0x00a9,
      0x005d,
      0x00b6,
      0x00bc,
      0x00bd,
      0x00be,
      0x00ac,
      0x007c,
      0x203e,
      0x007e,
      0x00b4,
      0x00d7,
      0x00e9,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x00ad,
      0x00f4,
      0x00f6,
      0x00f2,
      0x00f3,
      0x00f5,
      0x00e8,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x00b9,
      0x00fb,
      0x00fc,
      0x00a6,
      0x00fa,
      0x00ff,
      0x00e7,
      0x00f7,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x00b2,
      0x00d4,
      0x00d6,
      0x00d2,
      0x00d3,
      0x00d5,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x00b3,
      0x00db,
      0x00dc,
      0x00d9,
      0x00da,
      0x009f,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\xc2\x9c",
      "\x09",
      "\xc2\x86",
      "\x7f",
      "\xc2\x97",
      "\xc2\x8d",
      "\xc2\x8e",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\xc2\x9d",
      "\xc2\x85",
      "\x08",
      "\xc2\x87",
      "\x18",
      "\x19",
      "\xc2\x92",
      "\xc2\x8f",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\xc2\x80",
      "\xc2\x81",
      "\xc2\x82",
      "\xc2\x83",
      "\xc2\x84",
      "\x0a",
      "\x17",
      "\x1b",
      "\xc2\x88",
      "\xc2\x89",
      "\xc2\x8a",
      "\xc2\x8b",
      "\xc2\x8c",
      "\x05",
      "\x06",
      "\x07",
      "\xc2\x90",
      "\xc2\x91",
      "\x16",
      "\xc2\x93",
      "\xc2\x94",
      "\xc2\x95",
      "\xc2\x96",
      "\x04",
      "\xc2\x98",
      "\xc2\x99",
      "\xc2\x9a",
      "\xc2\x9b",
      "\x14",
      "\x15",
      "\xc2\x9e",
      "\x1a",
      "\x20",
      "\xc2\xa0",
      "\xc3\xa2",
      "\xc3\xa4",
      "\x40",
      "\xc3\xa1",
      "\xc3\xa3",
      "\xc3\xa5",
      "\x5c",
      "\xc3\xb1",
      "\xc2\xb0",
      "\x2e",
      "\x3c",
      "\x28",
      "\x2b",
      "\x21",
      "\x26",
      "\x7b",
      "\xc3\xaa",
      "\xc3\xab",
      "\x7d",
      "\xc3\xad",
      "\xc3\xae",
      "\xc3\xaf",
      "\xc3\xac",
      "\xc3\x9f",
      "\xc2\xa7",
      "\x24",
      "\x2a",
      "\x29",
      "\x3b",
      "\x5e",
      "\x2d",
      "\x2f",
      "\xc3\x82",
      "\xc3\x84",
      "\xc3\x80",
      "\xc3\x81",
      "\xc3\x83",
      "\xc3\x85",
      "\xc3\x87",
      "\xc3\x91",
      "\xc3\xb9",
      "\x2c",
      "\x25",
      "\x5f",
      "\x3e",
      "\x3f",
      "\xc3\xb8",
      "\xc3\x89",
      "\xc3\x8a",
      "\xc3\x8b",
      "\xc3\x88",
      "\xc3\x8d",
      "\xc3\x8e",
      "\xc3\x8f",
      "\xc3\x8c",
      "\xc2\xb5",
      "\x3a",
      "\xc2\xa3",
      "\xc3\xa0",
      "\x27",
      "\x3d",
      "\x22",
      "\xc3\x98",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\xc2\xab",
      "\xc2\xbb",
      "\xc3\xb0",
      "\xc3\xbd",
      "\xc3\xbe",
      "\xc2\xb1",
      "\x5b",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\xc2\xaa",
      "\xc2\xba",
      "\xc3\xa6",
      "\xc2\xb8",
      "\xc3\x86",
      "\xc2\xa4",
      "\x60",
      "\xc2\xa8",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\xc2\xa1",
      "\xc2\xbf",
      "\xc3\x90",
      "\xc3\x9d",
      "\xc3\x9e",
      "\xc2\xae",
      "\xc2\xa2",
      "\x23",
      "\xc2\xa5",
      "\xc2\xb7",
      "\xc2\xa9",
      "\x5d",
      "\xc2\xb6",
      "\xc2\xbc",
      "\xc2\xbd",
      "\xc2\xbe",
      "\xc2\xac",
      "\x7c",
      "\xe2\x80\xbe",
      "\x7e",
      "\xc2\xb4",
      "\xc3\x97",
      "\xc3\xa9",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\xc2\xad",
      "\xc3\xb4",
      "\xc3\xb6",
      "\xc3\xb2",
      "\xc3\xb3",
      "\xc3\xb5",
      "\xc3\xa8",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\xc2\xb9",
      "\xc3\xbb",
      "\xc3\xbc",
      "\xc2\xa6",
      "\xc3\xba",
      "\xc3\xbf",
      "\xc3\xa7",
      "\xc3\xb7",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\xc2\xb2",
      "\xc3\x94",
      "\xc3\x96",
      "\xc3\x92",
      "\xc3\x93",
      "\xc3\x95",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\xc2\xb3",
      "\xc3\x9b",
      "\xc3\x9c",
      "\xc3\x99",
      "\xc3\x9a",
      "\xc2\x9f",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x37",
      0x00000005 => "\x2d",
      0x00000006 => "\x2e",
      0x00000007 => "\x2f",
      0x00000008 => "\x16",
      0x00000009 => "\x05",
      0x0000000a => "\x25",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x3c",
      0x00000015 => "\x3d",
      0x00000016 => "\x32",
      0x00000017 => "\x26",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x3f",
      0x0000001b => "\x27",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x40",
      0x00000021 => "\x4f",
      0x00000022 => "\x7f",
      0x00000023 => "\xb1",
      0x00000024 => "\x5b",
      0x00000025 => "\x6c",
      0x00000026 => "\x50",
      0x00000027 => "\x7d",
      0x00000028 => "\x4d",
      0x00000029 => "\x5d",
      0x0000002a => "\x5c",
      0x0000002b => "\x4e",
      0x0000002c => "\x6b",
      0x0000002d => "\x60",
      0x0000002e => "\x4b",
      0x0000002f => "\x61",
      0x00000030 => "\xf0",
      0x00000031 => "\xf1",
      0x00000032 => "\xf2",
      0x00000033 => "\xf3",
      0x00000034 => "\xf4",
      0x00000035 => "\xf5",
      0x00000036 => "\xf6",
      0x00000037 => "\xf7",
      0x00000038 => "\xf8",
      0x00000039 => "\xf9",
      0x0000003a => "\x7a",
      0x0000003b => "\x5e",
      0x0000003c => "\x4c",
      0x0000003d => "\x7e",
      0x0000003e => "\x6e",
      0x0000003f => "\x6f",
      0x00000040 => "\x44",
      0x00000041 => "\xc1",
      0x00000042 => "\xc2",
      0x00000043 => "\xc3",
      0x00000044 => "\xc4",
      0x00000045 => "\xc5",
      0x00000046 => "\xc6",
      0x00000047 => "\xc7",
      0x00000048 => "\xc8",
      0x00000049 => "\xc9",
      0x0000004a => "\xd1",
      0x0000004b => "\xd2",
      0x0000004c => "\xd3",
      0x0000004d => "\xd4",
      0x0000004e => "\xd5",
      0x0000004f => "\xd6",
      0x00000050 => "\xd7",
      0x00000051 => "\xd8",
      0x00000052 => "\xd9",
      0x00000053 => "\xe2",
      0x00000054 => "\xe3",
      0x00000055 => "\xe4",
      0x00000056 => "\xe5",
      0x00000057 => "\xe6",
      0x00000058 => "\xe7",
      0x00000059 => "\xe8",
      0x0000005a => "\xe9",
      0x0000005b => "\x90",
      0x0000005c => "\x48",
      0x0000005d => "\xb5",
      0x0000005e => "\x5f",
      0x0000005f => "\x6d",
      0x00000060 => "\xa0",
      0x00000061 => "\x81",
      0x00000062 => "\x82",
      0x00000063 => "\x83",
      0x00000064 => "\x84",
      0x00000065 => "\x85",
      0x00000066 => "\x86",
      0x00000067 => "\x87",
      0x00000068 => "\x88",
      0x00000069 => "\x89",
      0x0000006a => "\x91",
      0x0000006b => "\x92",
      0x0000006c => "\x93",
      0x0000006d => "\x94",
      0x0000006e => "\x95",
      0x0000006f => "\x96",
      0x00000070 => "\x97",
      0x00000071 => "\x98",
      0x00000072 => "\x99",
      0x00000073 => "\xa2",
      0x00000074 => "\xa3",
      0x00000075 => "\xa4",
      0x00000076 => "\xa5",
      0x00000077 => "\xa6",
      0x00000078 => "\xa7",
      0x00000079 => "\xa8",
      0x0000007a => "\xa9",
      0x0000007b => "\x51",
      0x0000007c => "\xbb",
      0x0000007d => "\x54",
      0x0000007e => "\xbd",
      0x0000007f => "\x07",
      0x00000080 => "\x20",
      0x00000081 => "\x21",
      0x00000082 => "\x22",
      0x00000083 => "\x23",
      0x00000084 => "\x24",
      0x00000085 => "\x15",
      0x00000086 => "\x06",
      0x00000087 => "\x17",
      0x00000088 => "\x28",
      0x00000089 => "\x29",
      0x0000008a => "\x2a",
      0x0000008b => "\x2b",
      0x0000008c => "\x2c",
      0x0000008d => "\x09",
      0x0000008e => "\x0a",
      0x0000008f => "\x1b",
      0x00000090 => "\x30",
      0x00000091 => "\x31",
      0x00000092 => "\x1a",
      0x00000093 => "\x33",
      0x00000094 => "\x34",
      0x00000095 => "\x35",
      0x00000096 => "\x36",
      0x00000097 => "\x08",
      0x00000098 => "\x38",
      0x00000099 => "\x39",
      0x0000009a => "\x3a",
      0x0000009b => "\x3b",
      0x0000009c => "\x04",
      0x0000009d => "\x14",
      0x0000009e => "\x3e",
      0x0000009f => "\xff",
      0x000000a0 => "\x41",
      0x000000a1 => "\xaa",
      0x000000a2 => "\xb0",
      0x000000a3 => "\x7b",
      0x000000a4 => "\x9f",
      0x000000a5 => "\xb2",
      0x000000a6 => "\xdd",
      0x000000a7 => "\x5a",
      0x000000a8 => "\xa1",
      0x000000a9 => "\xb4",
      0x000000aa => "\x9a",
      0x000000ab => "\x8a",
      0x000000ac => "\xba",
      0x000000ad => "\xca",
      0x000000ae => "\xaf",
      0x000000b0 => "\x4a",
      0x000000b1 => "\x8f",
      0x000000b2 => "\xea",
      0x000000b3 => "\xfa",
      0x000000b4 => "\xbe",
      0x000000b5 => "\x79",
      0x000000b6 => "\xb6",
      0x000000b7 => "\xb3",
      0x000000b8 => "\x9d",
      0x000000b9 => "\xda",
      0x000000ba => "\x9b",
      0x000000bb => "\x8b",
      0x000000bc => "\xb7",
      0x000000bd => "\xb8",
      0x000000be => "\xb9",
      0x000000bf => "\xab",
      0x000000c0 => "\x64",
      0x000000c1 => "\x65",
      0x000000c2 => "\x62",
      0x000000c3 => "\x66",
      0x000000c4 => "\x63",
      0x000000c5 => "\x67",
      0x000000c6 => "\x9e",
      0x000000c7 => "\x68",
      0x000000c8 => "\x74",
      0x000000c9 => "\x71",
      0x000000ca => "\x72",
      0x000000cb => "\x73",
      0x000000cc => "\x78",
      0x000000cd => "\x75",
      0x000000ce => "\x76",
      0x000000cf => "\x77",
      0x000000d0 => "\xac",
      0x000000d1 => "\x69",
      0x000000d2 => "\xed",
      0x000000d3 => "\xee",
      0x000000d4 => "\xeb",
      0x000000d5 => "\xef",
      0x000000d6 => "\xec",
      0x000000d7 => "\xbf",
      0x000000d8 => "\x80",
      0x000000d9 => "\xfd",
      0x000000da => "\xfe",
      0x000000db => "\xfb",
      0x000000dc => "\xfc",
      0x000000dd => "\xad",
      0x000000de => "\xae",
      0x000000df => "\x59",
      0x000000e0 => "\x7c",
      0x000000e1 => "\x45",
      0x000000e2 => "\x42",
      0x000000e3 => "\x46",
      0x000000e4 => "\x43",
      0x000000e5 => "\x47",
      0x000000e6 => "\x9c",
      0x000000e7 => "\xe0",
      0x000000e8 => "\xd0",
      0x000000e9 => "\xc0",
      0x000000ea => "\x52",
      0x000000eb => "\x53",
      0x000000ec => "\x58",
      0x000000ed => "\x55",
      0x000000ee => "\x56",
      0x000000ef => "\x57",
      0x000000f0 => "\x8c",
      0x000000f1 => "\x49",
      0x000000f2 => "\xcd",
      0x000000f3 => "\xce",
      0x000000f4 => "\xcb",
      0x000000f5 => "\xcf",
      0x000000f6 => "\xcc",
      0x000000f7 => "\xe1",
      0x000000f8 => "\x70",
      0x000000f9 => "\x6a",
      0x000000fa => "\xde",
      0x000000fb => "\xdb",
      0x000000fc => "\xdc",
      0x000000fd => "\x8d",
      0x000000fe => "\x8e",
      0x000000ff => "\xdf",
      0x0000203e => "\xbc",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x6f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::IBM297 - Conversion routines for IBM297
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for IBM297.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: IBM NLS RM Vol2 SE09-8002-01, March 1990
   alias CP297
   alias EBCDIC-CP-FR
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  0000009C | STRING TERMINATOR (ST)
      05 |  00000009 | CHARACTER TABULATION (HT)
      06 |  00000086 | START OF SELECTED AREA (SSA)
      07 |  0000007F | DELETE (DEL)
      08 |  00000097 | END OF GUARDED AREA (EPA)
      09 |  0000008D | REVERSE LINE FEED (RI)
      0A |  0000008E | SINGLE-SHIFT TWO (SS2)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  0000009D | OPERATING SYSTEM COMMAND (OSC)
      15 |  00000085 | NEXT LINE (NEL)
      16 |  00000008 | BACKSPACE (BS)
      17 |  00000087 | END OF SELECTED AREA (ESA)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  00000092 | PRIVATE USE TWO (PU2)
      1B |  0000008F | SINGLE-SHIFT THREE (SS3)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000080 | PADDING CHARACTER (PAD)
      21 |  00000081 | HIGH OCTET PRESET (HOP)
      22 |  00000082 | BREAK PERMITTED HERE (BPH)
      23 |  00000083 | NO BREAK HERE (NBH)
      24 |  00000084 | INDEX (IND)
      25 |  0000000A | LINE FEED (LF)
      26 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      27 |  0000001B | ESCAPE (ESC)
      28 |  00000088 | CHARACTER TABULATION SET (HTS)
      29 |  00000089 | CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
      2A |  0000008A | LINE TABULATION SET (VTS)
      2B |  0000008B | PARTIAL LINE FORWARD (PLD)
      2C |  0000008C | PARTIAL LINE BACKWARD (PLU)
      2D |  00000005 | ENQUIRY (ENQ)
      2E |  00000006 | ACKNOWLEDGE (ACK)
      2F |  00000007 | BELL (BEL)
      30 |  00000090 | DEVICE CONTROL STRING (DCS)
      31 |  00000091 | PRIVATE USE ONE (PU1)
      32 |  00000016 | SYNCHRONOUS IDLE (SYN)
      33 |  00000093 | SET TRANSMIT STATE (STS)
      34 |  00000094 | CANCEL CHARACTER (CCH)
      35 |  00000095 | MESSAGE WAITING (MW)
      36 |  00000096 | START OF GUARDED AREA (SPA)
      37 |  00000004 | END OF TRANSMISSION (EOT)
      38 |  00000098 | START OF STRING (SOS)
      39 |  00000099 | SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
      3A |  0000009A | SINGLE CHARACTER INTRODUCER (SCI)
      3B |  0000009B | CONTROL SEQUENCE INTRODUCER (CSI)
      3C |  00000014 | DEVICE CONTROL FOUR (DC4)
      3D |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      3E |  0000009E | PRIVACY MESSAGE (PM)
      3F |  0000001A | SUBSTITUTE (SUB)
      40 |  00000020 | SPACE
      41 |  000000A0 | NO-BREAK SPACE
      42 |  000000E2 | LATIN SMALL LETTER A WITH CIRCUMFLEX
      43 |  000000E4 | LATIN SMALL LETTER A WITH DIAERESIS
      44 |  00000040 | COMMERCIAL AT
      45 |  000000E1 | LATIN SMALL LETTER A WITH ACUTE
      46 |  000000E3 | LATIN SMALL LETTER A WITH TILDE
      47 |  000000E5 | LATIN SMALL LETTER A WITH RING ABOVE
      48 |  0000005C | REVERSE SOLIDUS
      49 |  000000F1 | LATIN SMALL LETTER N WITH TILDE
      4A |  000000B0 | DEGREE SIGN
      4B |  0000002E | FULL STOP
      4C |  0000003C | LESS-THAN SIGN
      4D |  00000028 | LEFT PARENTHESIS
      4E |  0000002B | PLUS SIGN
      4F |  00000021 | EXCLAMATION MARK
      50 |  00000026 | AMPERSAND
      51 |  0000007B | LEFT CURLY BRACKET
      52 |  000000EA | LATIN SMALL LETTER E WITH CIRCUMFLEX
      53 |  000000EB | LATIN SMALL LETTER E WITH DIAERESIS
      54 |  0000007D | RIGHT CURLY BRACKET
      55 |  000000ED | LATIN SMALL LETTER I WITH ACUTE
      56 |  000000EE | LATIN SMALL LETTER I WITH CIRCUMFLEX
      57 |  000000EF | LATIN SMALL LETTER I WITH DIAERESIS
      58 |  000000EC | LATIN SMALL LETTER I WITH GRAVE
      59 |  000000DF | LATIN SMALL LETTER SHARP S (German)
      5A |  000000A7 | SECTION SIGN
      5B |  00000024 | DOLLAR SIGN
      5C |  0000002A | ASTERISK
      5D |  00000029 | RIGHT PARENTHESIS
      5E |  0000003B | SEMICOLON
      5F |  0000005E | CIRCUMFLEX ACCENT
      60 |  0000002D | HYPHEN-MINUS
      61 |  0000002F | SOLIDUS
      62 |  000000C2 | LATIN CAPITAL LETTER A WITH CIRCUMFLEX
      63 |  000000C4 | LATIN CAPITAL LETTER A WITH DIAERESIS
      64 |  000000C0 | LATIN CAPITAL LETTER A WITH GRAVE
      65 |  000000C1 | LATIN CAPITAL LETTER A WITH ACUTE
      66 |  000000C3 | LATIN CAPITAL LETTER A WITH TILDE
      67 |  000000C5 | LATIN CAPITAL LETTER A WITH RING ABOVE
      68 |  000000C7 | LATIN CAPITAL LETTER C WITH CEDILLA
      69 |  000000D1 | LATIN CAPITAL LETTER N WITH TILDE
      6A |  000000F9 | LATIN SMALL LETTER U WITH GRAVE
      6B |  0000002C | COMMA
      6C |  00000025 | PERCENT SIGN
      6D |  0000005F | LOW LINE
      6E |  0000003E | GREATER-THAN SIGN
      6F |  0000003F | QUESTION MARK
      70 |  000000F8 | LATIN SMALL LETTER O WITH STROKE
      71 |  000000C9 | LATIN CAPITAL LETTER E WITH ACUTE
      72 |  000000CA | LATIN CAPITAL LETTER E WITH CIRCUMFLEX
      73 |  000000CB | LATIN CAPITAL LETTER E WITH DIAERESIS
      74 |  000000C8 | LATIN CAPITAL LETTER E WITH GRAVE
      75 |  000000CD | LATIN CAPITAL LETTER I WITH ACUTE
      76 |  000000CE | LATIN CAPITAL LETTER I WITH CIRCUMFLEX
      77 |  000000CF | LATIN CAPITAL LETTER I WITH DIAERESIS
      78 |  000000CC | LATIN CAPITAL LETTER I WITH GRAVE
      79 |  000000B5 | MICRO SIGN
      7A |  0000003A | COLON
      7B |  000000A3 | POUND SIGN
      7C |  000000E0 | LATIN SMALL LETTER A WITH GRAVE
      7D |  00000027 | APOSTROPHE
      7E |  0000003D | EQUALS SIGN
      7F |  00000022 | QUOTATION MARK
      80 |  000000D8 | LATIN CAPITAL LETTER O WITH STROKE
      81 |  00000061 | LATIN SMALL LETTER A
      82 |  00000062 | LATIN SMALL LETTER B
      83 |  00000063 | LATIN SMALL LETTER C
      84 |  00000064 | LATIN SMALL LETTER D
      85 |  00000065 | LATIN SMALL LETTER E
      86 |  00000066 | LATIN SMALL LETTER F
      87 |  00000067 | LATIN SMALL LETTER G
      88 |  00000068 | LATIN SMALL LETTER H
      89 |  00000069 | LATIN SMALL LETTER I
      8A |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
      8B |  000000BB | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
      8C |  000000F0 | LATIN SMALL LETTER ETH (Icelandic)
      8D |  000000FD | LATIN SMALL LETTER Y WITH ACUTE
      8E |  000000FE | LATIN SMALL LETTER THORN (Icelandic)
      8F |  000000B1 | PLUS-MINUS SIGN
      90 |  0000005B | LEFT SQUARE BRACKET
      91 |  0000006A | LATIN SMALL LETTER J
      92 |  0000006B | LATIN SMALL LETTER K
      93 |  0000006C | LATIN SMALL LETTER L
      94 |  0000006D | LATIN SMALL LETTER M
      95 |  0000006E | LATIN SMALL LETTER N
      96 |  0000006F | LATIN SMALL LETTER O
      97 |  00000070 | LATIN SMALL LETTER P
      98 |  00000071 | LATIN SMALL LETTER Q
      99 |  00000072 | LATIN SMALL LETTER R
      9A |  000000AA | FEMININE ORDINAL INDICATOR
      9B |  000000BA | MASCULINE ORDINAL INDICATOR
      9C |  000000E6 | LATIN SMALL LETTER AE
      9D |  000000B8 | CEDILLA
      9E |  000000C6 | LATIN CAPITAL LETTER AE
      9F |  000000A4 | CURRENCY SIGN
      A0 |  00000060 | GRAVE ACCENT
      A1 |  000000A8 | DIAERESIS
      A2 |  00000073 | LATIN SMALL LETTER S
      A3 |  00000074 | LATIN SMALL LETTER T
      A4 |  00000075 | LATIN SMALL LETTER U
      A5 |  00000076 | LATIN SMALL LETTER V
      A6 |  00000077 | LATIN SMALL LETTER W
      A7 |  00000078 | LATIN SMALL LETTER X
      A8 |  00000079 | LATIN SMALL LETTER Y
      A9 |  0000007A | LATIN SMALL LETTER Z
      AA |  000000A1 | INVERTED EXCLAMATION MARK
      AB |  000000BF | INVERTED QUESTION MARK
      AC |  000000D0 | LATIN CAPITAL LETTER ETH (Icelandic)
      AD |  000000DD | LATIN CAPITAL LETTER Y WITH ACUTE
      AE |  000000DE | LATIN CAPITAL LETTER THORN (Icelandic)
      AF |  000000AE | REGISTERED SIGN
      B0 |  000000A2 | CENT SIGN
      B1 |  00000023 | NUMBER SIGN
      B2 |  000000A5 | YEN SIGN
      B3 |  000000B7 | MIDDLE DOT
      B4 |  000000A9 | COPYRIGHT SIGN
      B5 |  0000005D | RIGHT SQUARE BRACKET
      B6 |  000000B6 | PILCROW SIGN
      B7 |  000000BC | VULGAR FRACTION ONE QUARTER
      B8 |  000000BD | VULGAR FRACTION ONE HALF
      B9 |  000000BE | VULGAR FRACTION THREE QUARTERS
      BA |  000000AC | NOT SIGN
      BB |  0000007C | VERTICAL LINE
      BC |  0000203E | OVERLINE
      BD |  0000007E | TILDE
      BE |  000000B4 | ACUTE ACCENT
      BF |  000000D7 | MULTIPLICATION SIGN
      C0 |  000000E9 | LATIN SMALL LETTER E WITH ACUTE
      C1 |  00000041 | LATIN CAPITAL LETTER A
      C2 |  00000042 | LATIN CAPITAL LETTER B
      C3 |  00000043 | LATIN CAPITAL LETTER C
      C4 |  00000044 | LATIN CAPITAL LETTER D
      C5 |  00000045 | LATIN CAPITAL LETTER E
      C6 |  00000046 | LATIN CAPITAL LETTER F
      C7 |  00000047 | LATIN CAPITAL LETTER G
      C8 |  00000048 | LATIN CAPITAL LETTER H
      C9 |  00000049 | LATIN CAPITAL LETTER I
      CA |  000000AD | SOFT HYPHEN
      CB |  000000F4 | LATIN SMALL LETTER O WITH CIRCUMFLEX
      CC |  000000F6 | LATIN SMALL LETTER O WITH DIAERESIS
      CD |  000000F2 | LATIN SMALL LETTER O WITH GRAVE
      CE |  000000F3 | LATIN SMALL LETTER O WITH ACUTE
      CF |  000000F5 | LATIN SMALL LETTER O WITH TILDE
      D0 |  000000E8 | LATIN SMALL LETTER E WITH GRAVE
      D1 |  0000004A | LATIN CAPITAL LETTER J
      D2 |  0000004B | LATIN CAPITAL LETTER K
      D3 |  0000004C | LATIN CAPITAL LETTER L
      D4 |  0000004D | LATIN CAPITAL LETTER M
      D5 |  0000004E | LATIN CAPITAL LETTER N
      D6 |  0000004F | LATIN CAPITAL LETTER O
      D7 |  00000050 | LATIN CAPITAL LETTER P
      D8 |  00000051 | LATIN CAPITAL LETTER Q
      D9 |  00000052 | LATIN CAPITAL LETTER R
      DA |  000000B9 | SUPERSCRIPT ONE
      DB |  000000FB | LATIN SMALL LETTER U WITH CIRCUMFLEX
      DC |  000000FC | LATIN SMALL LETTER U WITH DIAERESIS
      DD |  000000A6 | BROKEN BAR
      DE |  000000FA | LATIN SMALL LETTER U WITH ACUTE
      DF |  000000FF | LATIN SMALL LETTER Y WITH DIAERESIS
      E0 |  000000E7 | LATIN SMALL LETTER C WITH CEDILLA
      E1 |  000000F7 | DIVISION SIGN
      E2 |  00000053 | LATIN CAPITAL LETTER S
      E3 |  00000054 | LATIN CAPITAL LETTER T
      E4 |  00000055 | LATIN CAPITAL LETTER U
      E5 |  00000056 | LATIN CAPITAL LETTER V
      E6 |  00000057 | LATIN CAPITAL LETTER W
      E7 |  00000058 | LATIN CAPITAL LETTER X
      E8 |  00000059 | LATIN CAPITAL LETTER Y
      E9 |  0000005A | LATIN CAPITAL LETTER Z
      EA |  000000B2 | SUPERSCRIPT TWO
      EB |  000000D4 | LATIN CAPITAL LETTER O WITH CIRCUMFLEX
      EC |  000000D6 | LATIN CAPITAL LETTER O WITH DIAERESIS
      ED |  000000D2 | LATIN CAPITAL LETTER O WITH GRAVE
      EE |  000000D3 | LATIN CAPITAL LETTER O WITH ACUTE
      EF |  000000D5 | LATIN CAPITAL LETTER O WITH TILDE
      F0 |  00000030 | DIGIT ZERO
      F1 |  00000031 | DIGIT ONE
      F2 |  00000032 | DIGIT TWO
      F3 |  00000033 | DIGIT THREE
      F4 |  00000034 | DIGIT FOUR
      F5 |  00000035 | DIGIT FIVE
      F6 |  00000036 | DIGIT SIX
      F7 |  00000037 | DIGIT SEVEN
      F8 |  00000038 | DIGIT EIGHT
      F9 |  00000039 | DIGIT NINE
      FA |  000000B3 | SUPERSCRIPT THREE
      FB |  000000DB | LATIN CAPITAL LETTER U WITH CIRCUMFLEX
      FC |  000000DC | LATIN CAPITAL LETTER U WITH DIAERESIS
      FD |  000000D9 | LATIN CAPITAL LETTER U WITH GRAVE
      FE |  000000DA | LATIN CAPITAL LETTER U WITH ACUTE
      FF |  0000009F | APPLICATION PROGRAM COMMAND (APC)
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_IBM297

    $main::fatpacked{"Locale/RecodeData/IBM420.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_IBM420';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for IBM420.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::IBM420;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x009c,
      0x0009,
      0x0086,
      0x007f,
      0x0097,
      0x008d,
      0x008e,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x009d,
      0x0085,
      0x0008,
      0x0087,
      0x0018,
      0x0019,
      0x0092,
      0x008f,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0080,
      0x0081,
      0x0082,
      0x0083,
      0x0084,
      0x000a,
      0x0017,
      0x001b,
      0x0088,
      0x0089,
      0x008a,
      0x008b,
      0x008c,
      0x0005,
      0x0006,
      0x0007,
      0x0090,
      0x0091,
      0x0016,
      0x0093,
      0x0094,
      0x0095,
      0x0096,
      0x0004,
      0x0098,
      0x0099,
      0x009a,
      0x009b,
      0x0014,
      0x0015,
      0x009e,
      0x001a,
      0x0020,
      0x00a0,
      0x0651,
      0xfe7d,
      0x0640,
      0xfffd,
      0x0621,
      0x0622,
      0xfe82,
      0x0623,
      0x00a2,
      0x002e,
      0x003c,
      0x0028,
      0x002b,
      0x007c,
      0x0026,
      0xfe84,
      0x0624,
      0xfffd,
      0xfffd,
      0x0626,
      0x0627,
      0xfe8e,
      0x0628,
      0xfe91,
      0x0021,
      0x0024,
      0x002a,
      0x0029,
      0x003b,
      0x00ac,
      0x002d,
      0x002f,
      0x0629,
      0x062a,
      0xfe97,
      0x062b,
      0xfe9b,
      0x062c,
      0xfe9f,
      0x062d,
      0x00a6,
      0x002c,
      0x0025,
      0x005f,
      0x003e,
      0x003f,
      0xfea3,
      0x062e,
      0xfea7,
      0x062f,
      0x0630,
      0x0631,
      0x0632,
      0x0633,
      0xfeb3,
      0x060c,
      0x003a,
      0x0023,
      0x0040,
      0x0027,
      0x003d,
      0x0022,
      0x0634,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0xfeb7,
      0x0635,
      0xfebb,
      0x0636,
      0xfebf,
      0x0637,
      0x0638,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0639,
      0xfeca,
      0xfecb,
      0xfecc,
      0x063a,
      0xfece,
      0xfecf,
      0x00f7,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0xfed0,
      0x0641,
      0xfed3,
      0x0642,
      0xfed7,
      0x0643,
      0xfedb,
      0x0644,
      0xfef5,
      0xfef6,
      0xfef7,
      0xfef8,
      0xfffd,
      0xfffd,
      0xfefb,
      0xfefc,
      0xfedf,
      0x0645,
      0xfee3,
      0x0646,
      0xfee7,
      0x0647,
      0x061b,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x00ad,
      0xfeeb,
      0xfffd,
      0xfeec,
      0xfffd,
      0x0648,
      0x061f,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0649,
      0xfef0,
      0x064a,
      0xfef2,
      0xfef3,
      0x0660,
      0x00d7,
      0xfffd,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x0661,
      0x0662,
      0xfffd,
      0x0663,
      0x0664,
      0x0665,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0xfffd,
      0x0666,
      0x0667,
      0x0668,
      0x0669,
      0x009f,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\xc2\x9c",
      "\x09",
      "\xc2\x86",
      "\x7f",
      "\xc2\x97",
      "\xc2\x8d",
      "\xc2\x8e",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\xc2\x9d",
      "\xc2\x85",
      "\x08",
      "\xc2\x87",
      "\x18",
      "\x19",
      "\xc2\x92",
      "\xc2\x8f",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\xc2\x80",
      "\xc2\x81",
      "\xc2\x82",
      "\xc2\x83",
      "\xc2\x84",
      "\x0a",
      "\x17",
      "\x1b",
      "\xc2\x88",
      "\xc2\x89",
      "\xc2\x8a",
      "\xc2\x8b",
      "\xc2\x8c",
      "\x05",
      "\x06",
      "\x07",
      "\xc2\x90",
      "\xc2\x91",
      "\x16",
      "\xc2\x93",
      "\xc2\x94",
      "\xc2\x95",
      "\xc2\x96",
      "\x04",
      "\xc2\x98",
      "\xc2\x99",
      "\xc2\x9a",
      "\xc2\x9b",
      "\x14",
      "\x15",
      "\xc2\x9e",
      "\x1a",
      "\x20",
      "\xc2\xa0",
      "\xd9\x91",
      "\xef\xb9\xbd",
      "\xd9\x80",
      "\xef\xbf\xbd",
      "\xd8\xa1",
      "\xd8\xa2",
      "\xef\xba\x82",
      "\xd8\xa3",
      "\xc2\xa2",
      "\x2e",
      "\x3c",
      "\x28",
      "\x2b",
      "\x7c",
      "\x26",
      "\xef\xba\x84",
      "\xd8\xa4",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xd8\xa6",
      "\xd8\xa7",
      "\xef\xba\x8e",
      "\xd8\xa8",
      "\xef\xba\x91",
      "\x21",
      "\x24",
      "\x2a",
      "\x29",
      "\x3b",
      "\xc2\xac",
      "\x2d",
      "\x2f",
      "\xd8\xa9",
      "\xd8\xaa",
      "\xef\xba\x97",
      "\xd8\xab",
      "\xef\xba\x9b",
      "\xd8\xac",
      "\xef\xba\x9f",
      "\xd8\xad",
      "\xc2\xa6",
      "\x2c",
      "\x25",
      "\x5f",
      "\x3e",
      "\x3f",
      "\xef\xba\xa3",
      "\xd8\xae",
      "\xef\xba\xa7",
      "\xd8\xaf",
      "\xd8\xb0",
      "\xd8\xb1",
      "\xd8\xb2",
      "\xd8\xb3",
      "\xef\xba\xb3",
      "\xd8\x8c",
      "\x3a",
      "\x23",
      "\x40",
      "\x27",
      "\x3d",
      "\x22",
      "\xd8\xb4",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\xef\xba\xb7",
      "\xd8\xb5",
      "\xef\xba\xbb",
      "\xd8\xb6",
      "\xef\xba\xbf",
      "\xd8\xb7",
      "\xd8\xb8",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\xd8\xb9",
      "\xef\xbb\x8a",
      "\xef\xbb\x8b",
      "\xef\xbb\x8c",
      "\xd8\xba",
      "\xef\xbb\x8e",
      "\xef\xbb\x8f",
      "\xc3\xb7",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\xef\xbb\x90",
      "\xd9\x81",
      "\xef\xbb\x93",
      "\xd9\x82",
      "\xef\xbb\x97",
      "\xd9\x83",
      "\xef\xbb\x9b",
      "\xd9\x84",
      "\xef\xbb\xb5",
      "\xef\xbb\xb6",
      "\xef\xbb\xb7",
      "\xef\xbb\xb8",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbb\xbb",
      "\xef\xbb\xbc",
      "\xef\xbb\x9f",
      "\xd9\x85",
      "\xef\xbb\xa3",
      "\xd9\x86",
      "\xef\xbb\xa7",
      "\xd9\x87",
      "\xd8\x9b",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\xc2\xad",
      "\xef\xbb\xab",
      "\xef\xbf\xbd",
      "\xef\xbb\xac",
      "\xef\xbf\xbd",
      "\xd9\x88",
      "\xd8\x9f",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\xd9\x89",
      "\xef\xbb\xb0",
      "\xd9\x8a",
      "\xef\xbb\xb2",
      "\xef\xbb\xb3",
      "\xd9\xa0",
      "\xc3\x97",
      "\xef\xbf\xbd",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\xd9\xa1",
      "\xd9\xa2",
      "\xef\xbf\xbd",
      "\xd9\xa3",
      "\xd9\xa4",
      "\xd9\xa5",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\xef\xbf\xbd",
      "\xd9\xa6",
      "\xd9\xa7",
      "\xd9\xa8",
      "\xd9\xa9",
      "\xc2\x9f",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x37",
      0x00000005 => "\x2d",
      0x00000006 => "\x2e",
      0x00000007 => "\x2f",
      0x00000008 => "\x16",
      0x00000009 => "\x05",
      0x0000000a => "\x25",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x3c",
      0x00000015 => "\x3d",
      0x00000016 => "\x32",
      0x00000017 => "\x26",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x3f",
      0x0000001b => "\x27",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x40",
      0x00000021 => "\x5a",
      0x00000022 => "\x7f",
      0x00000023 => "\x7b",
      0x00000024 => "\x5b",
      0x00000025 => "\x6c",
      0x00000026 => "\x50",
      0x00000027 => "\x7d",
      0x00000028 => "\x4d",
      0x00000029 => "\x5d",
      0x0000002a => "\x5c",
      0x0000002b => "\x4e",
      0x0000002c => "\x6b",
      0x0000002d => "\x60",
      0x0000002e => "\x4b",
      0x0000002f => "\x61",
      0x00000030 => "\xf0",
      0x00000031 => "\xf1",
      0x00000032 => "\xf2",
      0x00000033 => "\xf3",
      0x00000034 => "\xf4",
      0x00000035 => "\xf5",
      0x00000036 => "\xf6",
      0x00000037 => "\xf7",
      0x00000038 => "\xf8",
      0x00000039 => "\xf9",
      0x0000003a => "\x7a",
      0x0000003b => "\x5e",
      0x0000003c => "\x4c",
      0x0000003d => "\x7e",
      0x0000003e => "\x6e",
      0x0000003f => "\x6f",
      0x00000040 => "\x7c",
      0x00000041 => "\xc1",
      0x00000042 => "\xc2",
      0x00000043 => "\xc3",
      0x00000044 => "\xc4",
      0x00000045 => "\xc5",
      0x00000046 => "\xc6",
      0x00000047 => "\xc7",
      0x00000048 => "\xc8",
      0x00000049 => "\xc9",
      0x0000004a => "\xd1",
      0x0000004b => "\xd2",
      0x0000004c => "\xd3",
      0x0000004d => "\xd4",
      0x0000004e => "\xd5",
      0x0000004f => "\xd6",
      0x00000050 => "\xd7",
      0x00000051 => "\xd8",
      0x00000052 => "\xd9",
      0x00000053 => "\xe2",
      0x00000054 => "\xe3",
      0x00000055 => "\xe4",
      0x00000056 => "\xe5",
      0x00000057 => "\xe6",
      0x00000058 => "\xe7",
      0x00000059 => "\xe8",
      0x0000005a => "\xe9",
      0x0000005f => "\x6d",
      0x00000061 => "\x81",
      0x00000062 => "\x82",
      0x00000063 => "\x83",
      0x00000064 => "\x84",
      0x00000065 => "\x85",
      0x00000066 => "\x86",
      0x00000067 => "\x87",
      0x00000068 => "\x88",
      0x00000069 => "\x89",
      0x0000006a => "\x91",
      0x0000006b => "\x92",
      0x0000006c => "\x93",
      0x0000006d => "\x94",
      0x0000006e => "\x95",
      0x0000006f => "\x96",
      0x00000070 => "\x97",
      0x00000071 => "\x98",
      0x00000072 => "\x99",
      0x00000073 => "\xa2",
      0x00000074 => "\xa3",
      0x00000075 => "\xa4",
      0x00000076 => "\xa5",
      0x00000077 => "\xa6",
      0x00000078 => "\xa7",
      0x00000079 => "\xa8",
      0x0000007a => "\xa9",
      0x0000007c => "\x4f",
      0x0000007f => "\x07",
      0x00000080 => "\x20",
      0x00000081 => "\x21",
      0x00000082 => "\x22",
      0x00000083 => "\x23",
      0x00000084 => "\x24",
      0x00000085 => "\x15",
      0x00000086 => "\x06",
      0x00000087 => "\x17",
      0x00000088 => "\x28",
      0x00000089 => "\x29",
      0x0000008a => "\x2a",
      0x0000008b => "\x2b",
      0x0000008c => "\x2c",
      0x0000008d => "\x09",
      0x0000008e => "\x0a",
      0x0000008f => "\x1b",
      0x00000090 => "\x30",
      0x00000091 => "\x31",
      0x00000092 => "\x1a",
      0x00000093 => "\x33",
      0x00000094 => "\x34",
      0x00000095 => "\x35",
      0x00000096 => "\x36",
      0x00000097 => "\x08",
      0x00000098 => "\x38",
      0x00000099 => "\x39",
      0x0000009a => "\x3a",
      0x0000009b => "\x3b",
      0x0000009c => "\x04",
      0x0000009d => "\x14",
      0x0000009e => "\x3e",
      0x0000009f => "\xff",
      0x000000a0 => "\x41",
      0x000000a2 => "\x4a",
      0x000000a6 => "\x6a",
      0x000000ac => "\x5f",
      0x000000ad => "\xca",
      0x000000d7 => "\xe0",
      0x000000f7 => "\xa1",
      0x0000060c => "\x79",
      0x0000061b => "\xc0",
      0x0000061f => "\xd0",
      0x00000621 => "\x46",
      0x00000622 => "\x47",
      0x00000623 => "\x49",
      0x00000624 => "\x52",
      0x00000626 => "\x55",
      0x00000627 => "\x56",
      0x00000628 => "\x58",
      0x00000629 => "\x62",
      0x0000062a => "\x63",
      0x0000062b => "\x65",
      0x0000062c => "\x67",
      0x0000062d => "\x69",
      0x0000062e => "\x71",
      0x0000062f => "\x73",
      0x00000630 => "\x74",
      0x00000631 => "\x75",
      0x00000632 => "\x76",
      0x00000633 => "\x77",
      0x00000634 => "\x80",
      0x00000635 => "\x8b",
      0x00000636 => "\x8d",
      0x00000637 => "\x8f",
      0x00000638 => "\x90",
      0x00000639 => "\x9a",
      0x0000063a => "\x9e",
      0x00000640 => "\x44",
      0x00000641 => "\xab",
      0x00000642 => "\xad",
      0x00000643 => "\xaf",
      0x00000644 => "\xb1",
      0x00000645 => "\xbb",
      0x00000646 => "\xbd",
      0x00000647 => "\xbf",
      0x00000648 => "\xcf",
      0x00000649 => "\xda",
      0x0000064a => "\xdc",
      0x00000651 => "\x42",
      0x00000660 => "\xdf",
      0x00000661 => "\xea",
      0x00000662 => "\xeb",
      0x00000663 => "\xed",
      0x00000664 => "\xee",
      0x00000665 => "\xef",
      0x00000666 => "\xfb",
      0x00000667 => "\xfc",
      0x00000668 => "\xfd",
      0x00000669 => "\xfe",
      0x0000fe7d => "\x43",
      0x0000fe82 => "\x48",
      0x0000fe84 => "\x51",
      0x0000fe8e => "\x57",
      0x0000fe91 => "\x59",
      0x0000fe97 => "\x64",
      0x0000fe9b => "\x66",
      0x0000fe9f => "\x68",
      0x0000fea3 => "\x70",
      0x0000fea7 => "\x72",
      0x0000feb3 => "\x78",
      0x0000feb7 => "\x8a",
      0x0000febb => "\x8c",
      0x0000febf => "\x8e",
      0x0000feca => "\x9b",
      0x0000fecb => "\x9c",
      0x0000fecc => "\x9d",
      0x0000fece => "\x9f",
      0x0000fecf => "\xa0",
      0x0000fed0 => "\xaa",
      0x0000fed3 => "\xac",
      0x0000fed7 => "\xae",
      0x0000fedb => "\xb0",
      0x0000fedf => "\xba",
      0x0000fee3 => "\xbc",
      0x0000fee7 => "\xbe",
      0x0000feeb => "\xcb",
      0x0000feec => "\xcd",
      0x0000fef0 => "\xdb",
      0x0000fef2 => "\xdd",
      0x0000fef3 => "\xde",
      0x0000fef5 => "\xb2",
      0x0000fef6 => "\xb3",
      0x0000fef7 => "\xb4",
      0x0000fef8 => "\xb5",
      0x0000fefb => "\xb8",
      0x0000fefc => "\xb9",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\xd0"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::IBM420 - Conversion routines for IBM420
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for IBM420.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: IBM NLS RM Vol2 SE09-8002-01, March 1990
    IBM NLS RM p 11-11
   alias CP420
   alias EBCDIC-CP-AR1
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  0000009C | STRING TERMINATOR (ST)
      05 |  00000009 | CHARACTER TABULATION (HT)
      06 |  00000086 | START OF SELECTED AREA (SSA)
      07 |  0000007F | DELETE (DEL)
      08 |  00000097 | END OF GUARDED AREA (EPA)
      09 |  0000008D | REVERSE LINE FEED (RI)
      0A |  0000008E | SINGLE-SHIFT TWO (SS2)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  0000009D | OPERATING SYSTEM COMMAND (OSC)
      15 |  00000085 | NEXT LINE (NEL)
      16 |  00000008 | BACKSPACE (BS)
      17 |  00000087 | END OF SELECTED AREA (ESA)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  00000092 | PRIVATE USE TWO (PU2)
      1B |  0000008F | SINGLE-SHIFT THREE (SS3)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000080 | PADDING CHARACTER (PAD)
      21 |  00000081 | HIGH OCTET PRESET (HOP)
      22 |  00000082 | BREAK PERMITTED HERE (BPH)
      23 |  00000083 | NO BREAK HERE (NBH)
      24 |  00000084 | INDEX (IND)
      25 |  0000000A | LINE FEED (LF)
      26 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      27 |  0000001B | ESCAPE (ESC)
      28 |  00000088 | CHARACTER TABULATION SET (HTS)
      29 |  00000089 | CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
      2A |  0000008A | LINE TABULATION SET (VTS)
      2B |  0000008B | PARTIAL LINE FORWARD (PLD)
      2C |  0000008C | PARTIAL LINE BACKWARD (PLU)
      2D |  00000005 | ENQUIRY (ENQ)
      2E |  00000006 | ACKNOWLEDGE (ACK)
      2F |  00000007 | BELL (BEL)
      30 |  00000090 | DEVICE CONTROL STRING (DCS)
      31 |  00000091 | PRIVATE USE ONE (PU1)
      32 |  00000016 | SYNCHRONOUS IDLE (SYN)
      33 |  00000093 | SET TRANSMIT STATE (STS)
      34 |  00000094 | CANCEL CHARACTER (CCH)
      35 |  00000095 | MESSAGE WAITING (MW)
      36 |  00000096 | START OF GUARDED AREA (SPA)
      37 |  00000004 | END OF TRANSMISSION (EOT)
      38 |  00000098 | START OF STRING (SOS)
      39 |  00000099 | SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
      3A |  0000009A | SINGLE CHARACTER INTRODUCER (SCI)
      3B |  0000009B | CONTROL SEQUENCE INTRODUCER (CSI)
      3C |  00000014 | DEVICE CONTROL FOUR (DC4)
      3D |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      3E |  0000009E | PRIVACY MESSAGE (PM)
      3F |  0000001A | SUBSTITUTE (SUB)
      40 |  00000020 | SPACE
      41 |  000000A0 | NO-BREAK SPACE
      42 |  00000651 | ARABIC SHADDA
      43 |  0000FE7D | ARABIC SHADDA MEDIAL FORM
      44 |  00000640 | ARABIC TATWEEL
      46 |  00000621 | ARABIC LETTER HAMZA
      47 |  00000622 | ARABIC LETTER ALEF WITH MADDA ABOVE
      48 |  0000FE82 | ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM
      49 |  00000623 | ARABIC LETTER ALEF WITH HAMZA ABOVE
      4A |  000000A2 | CENT SIGN
      4B |  0000002E | FULL STOP
      4C |  0000003C | LESS-THAN SIGN
      4D |  00000028 | LEFT PARENTHESIS
      4E |  0000002B | PLUS SIGN
      4F |  0000007C | VERTICAL LINE
      50 |  00000026 | AMPERSAND
      51 |  0000FE84 | ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM
      52 |  00000624 | ARABIC LETTER WAW WITH HAMZA ABOVE
      55 |  00000626 | ARABIC LETTER YEH WITH HAMZA ABOVE
      56 |  00000627 | ARABIC LETTER ALEF
      57 |  0000FE8E | ARABIC LETTER ALEF FINAL FORM
      58 |  00000628 | ARABIC LETTER BEH
      59 |  0000FE91 | ARABIC LETTER BEH INITIAL FORM
      5A |  00000021 | EXCLAMATION MARK
      5B |  00000024 | DOLLAR SIGN
      5C |  0000002A | ASTERISK
      5D |  00000029 | RIGHT PARENTHESIS
      5E |  0000003B | SEMICOLON
      5F |  000000AC | NOT SIGN
      60 |  0000002D | HYPHEN-MINUS
      61 |  0000002F | SOLIDUS
      62 |  00000629 | ARABIC LETTER TEH MARBUTA
      63 |  0000062A | ARABIC LETTER TEH
      64 |  0000FE97 | ARABIC LETTER TEH INITIAL FORM
      65 |  0000062B | ARABIC LETTER THEH
      66 |  0000FE9B | ARABIC LETTER THEH INITIAL FORM
      67 |  0000062C | ARABIC LETTER JEEM
      68 |  0000FE9F | ARABIC LETTER JEEM INITIAL FORM
      69 |  0000062D | ARABIC LETTER HAH
      6A |  000000A6 | BROKEN BAR
      6B |  0000002C | COMMA
      6C |  00000025 | PERCENT SIGN
      6D |  0000005F | LOW LINE
      6E |  0000003E | GREATER-THAN SIGN
      6F |  0000003F | QUESTION MARK
      70 |  0000FEA3 | ARABIC LETTER HAH INITIAL FORM
      71 |  0000062E | ARABIC LETTER KHAH
      72 |  0000FEA7 | ARABIC LETTER KHAH INITIAL FORM
      73 |  0000062F | ARABIC LETTER DAL
      74 |  00000630 | ARABIC LETTER THAL
      75 |  00000631 | ARABIC LETTER REH
      76 |  00000632 | ARABIC LETTER ZAIN
      77 |  00000633 | ARABIC LETTER SEEN
      78 |  0000FEB3 | ARABIC LETTER SEEN INITIAL FORM
      79 |  0000060C | ARABIC COMMA
      7A |  0000003A | COLON
      7B |  00000023 | NUMBER SIGN
      7C |  00000040 | COMMERCIAL AT
      7D |  00000027 | APOSTROPHE
      7E |  0000003D | EQUALS SIGN
      7F |  00000022 | QUOTATION MARK
      80 |  00000634 | ARABIC LETTER SHEEN
      81 |  00000061 | LATIN SMALL LETTER A
      82 |  00000062 | LATIN SMALL LETTER B
      83 |  00000063 | LATIN SMALL LETTER C
      84 |  00000064 | LATIN SMALL LETTER D
      85 |  00000065 | LATIN SMALL LETTER E
      86 |  00000066 | LATIN SMALL LETTER F
      87 |  00000067 | LATIN SMALL LETTER G
      88 |  00000068 | LATIN SMALL LETTER H
      89 |  00000069 | LATIN SMALL LETTER I
      8A |  0000FEB7 | ARABIC LETTER SHEEN INITIAL FORM
      8B |  00000635 | ARABIC LETTER SAD
      8C |  0000FEBB | ARABIC LETTER SAD INITIAL FORM
      8D |  00000636 | ARABIC LETTER DAD
      8E |  0000FEBF | ARABIC LETTER DAD INITIAL FORM
      8F |  00000637 | ARABIC LETTER TAH
      90 |  00000638 | ARABIC LETTER ZAH
      91 |  0000006A | LATIN SMALL LETTER J
      92 |  0000006B | LATIN SMALL LETTER K
      93 |  0000006C | LATIN SMALL LETTER L
      94 |  0000006D | LATIN SMALL LETTER M
      95 |  0000006E | LATIN SMALL LETTER N
      96 |  0000006F | LATIN SMALL LETTER O
      97 |  00000070 | LATIN SMALL LETTER P
      98 |  00000071 | LATIN SMALL LETTER Q
      99 |  00000072 | LATIN SMALL LETTER R
      9A |  00000639 | ARABIC LETTER AIN
      9B |  0000FECA | ARABIC LETTER AIN FINAL FORM
      9C |  0000FECB | ARABIC LETTER AIN INITIAL FORM
      9D |  0000FECC | ARABIC LETTER AIN MEDIAL FORM
      9E |  0000063A | ARABIC LETTER GHAIN
      9F |  0000FECE | ARABIC LETTER GHAIN FINAL FORM
      A0 |  0000FECF | ARABIC LETTER GHAIN INITIAL FORM
      A1 |  000000F7 | DIVISION SIGN
      A2 |  00000073 | LATIN SMALL LETTER S
      A3 |  00000074 | LATIN SMALL LETTER T
      A4 |  00000075 | LATIN SMALL LETTER U
      A5 |  00000076 | LATIN SMALL LETTER V
      A6 |  00000077 | LATIN SMALL LETTER W
      A7 |  00000078 | LATIN SMALL LETTER X
      A8 |  00000079 | LATIN SMALL LETTER Y
      A9 |  0000007A | LATIN SMALL LETTER Z
      AA |  0000FED0 | ARABIC LETTER GHAIN MEDIAL FORM
      AB |  00000641 | ARABIC LETTER FEH
      AC |  0000FED3 | ARABIC LETTER FEH INITIAL FORM
      AD |  00000642 | ARABIC LETTER QAF
      AE |  0000FED7 | ARABIC LETTER QAF INITIAL FORM
      AF |  00000643 | ARABIC LETTER KAF
      B0 |  0000FEDB | ARABIC LETTER KAF INITIAL FORM
      B1 |  00000644 | ARABIC LETTER LAM
      B2 |  0000FEF5 | ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM
      B3 |  0000FEF6 | ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM
      B4 |  0000FEF7 | ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM
      B5 |  0000FEF8 | ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM
      B8 |  0000FEFB | ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM
      B9 |  0000FEFC | ARABIC LIGATURE LAM WITH ALEF FINAL FORM
      BA |  0000FEDF | ARABIC LETTER LAM INITIAL FORM
      BB |  00000645 | ARABIC LETTER MEEM
      BC |  0000FEE3 | ARABIC LETTER MEEM INITIAL FORM
      BD |  00000646 | ARABIC LETTER NOON
      BE |  0000FEE7 | ARABIC LETTER NOON INITIAL FORM
      BF |  00000647 | ARABIC LETTER HEH
      C0 |  0000061B | ARABIC SEMICOLON
      C1 |  00000041 | LATIN CAPITAL LETTER A
      C2 |  00000042 | LATIN CAPITAL LETTER B
      C3 |  00000043 | LATIN CAPITAL LETTER C
      C4 |  00000044 | LATIN CAPITAL LETTER D
      C5 |  00000045 | LATIN CAPITAL LETTER E
      C6 |  00000046 | LATIN CAPITAL LETTER F
      C7 |  00000047 | LATIN CAPITAL LETTER G
      C8 |  00000048 | LATIN CAPITAL LETTER H
      C9 |  00000049 | LATIN CAPITAL LETTER I
      CA |  000000AD | SOFT HYPHEN
      CB |  0000FEEB | ARABIC LETTER HEH INITIAL FORM
      CD |  0000FEEC | ARABIC LETTER HEH MEDIAL FORM
      CF |  00000648 | ARABIC LETTER WAW
      D0 |  0000061F | ARABIC QUESTION MARK
      D1 |  0000004A | LATIN CAPITAL LETTER J
      D2 |  0000004B | LATIN CAPITAL LETTER K
      D3 |  0000004C | LATIN CAPITAL LETTER L
      D4 |  0000004D | LATIN CAPITAL LETTER M
      D5 |  0000004E | LATIN CAPITAL LETTER N
      D6 |  0000004F | LATIN CAPITAL LETTER O
      D7 |  00000050 | LATIN CAPITAL LETTER P
      D8 |  00000051 | LATIN CAPITAL LETTER Q
      D9 |  00000052 | LATIN CAPITAL LETTER R
      DA |  00000649 | ARABIC LETTER ALEF MAKSURA
      DB |  0000FEF0 | ARABIC LETTER ALEF MAKSURA FINAL FORM
      DC |  0000064A | ARABIC LETTER YEH
      DD |  0000FEF2 | ARABIC LETTER YEH FINAL FORM
      DE |  0000FEF3 | ARABIC LETTER YEH INITIAL FORM
      DF |  00000660 | ARABIC-INDIC DIGIT ZERO
      E0 |  000000D7 | MULTIPLICATION SIGN
      E2 |  00000053 | LATIN CAPITAL LETTER S
      E3 |  00000054 | LATIN CAPITAL LETTER T
      E4 |  00000055 | LATIN CAPITAL LETTER U
      E5 |  00000056 | LATIN CAPITAL LETTER V
      E6 |  00000057 | LATIN CAPITAL LETTER W
      E7 |  00000058 | LATIN CAPITAL LETTER X
      E8 |  00000059 | LATIN CAPITAL LETTER Y
      E9 |  0000005A | LATIN CAPITAL LETTER Z
      EA |  00000661 | ARABIC-INDIC DIGIT ONE
      EB |  00000662 | ARABIC-INDIC DIGIT TWO
      ED |  00000663 | ARABIC-INDIC DIGIT THREE
      EE |  00000664 | ARABIC-INDIC DIGIT FOUR
      EF |  00000665 | ARABIC-INDIC DIGIT FIVE
      F0 |  00000030 | DIGIT ZERO
      F1 |  00000031 | DIGIT ONE
      F2 |  00000032 | DIGIT TWO
      F3 |  00000033 | DIGIT THREE
      F4 |  00000034 | DIGIT FOUR
      F5 |  00000035 | DIGIT FIVE
      F6 |  00000036 | DIGIT SIX
      F7 |  00000037 | DIGIT SEVEN
      F8 |  00000038 | DIGIT EIGHT
      F9 |  00000039 | DIGIT NINE
      FB |  00000666 | ARABIC-INDIC DIGIT SIX
      FC |  00000667 | ARABIC-INDIC DIGIT SEVEN
      FD |  00000668 | ARABIC-INDIC DIGIT EIGHT
      FE |  00000669 | ARABIC-INDIC DIGIT NINE
      FF |  0000009F | APPLICATION PROGRAM COMMAND (APC)
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_IBM420

    $main::fatpacked{"Locale/RecodeData/IBM423.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_IBM423';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for IBM423.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::IBM423;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x009c,
      0x0009,
      0x0086,
      0x007f,
      0x0097,
      0x008d,
      0x008e,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x009d,
      0x0085,
      0x0008,
      0x0087,
      0x0018,
      0x0019,
      0x0092,
      0x008f,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0080,
      0x0081,
      0x0082,
      0x0083,
      0x0084,
      0x000a,
      0x0017,
      0x001b,
      0x0088,
      0x0089,
      0x008a,
      0x008b,
      0x008c,
      0x0005,
      0x0006,
      0x0007,
      0x0090,
      0x0091,
      0x0016,
      0x0093,
      0x0094,
      0x0095,
      0x0096,
      0x0004,
      0x0098,
      0x0099,
      0x009a,
      0x009b,
      0x0014,
      0x0015,
      0x009e,
      0x001a,
      0x0020,
      0x0391,
      0x0392,
      0x0393,
      0x0394,
      0x0395,
      0x0396,
      0x0397,
      0x0398,
      0x0399,
      0x005b,
      0x002e,
      0x003c,
      0x0028,
      0x002b,
      0x0021,
      0x0026,
      0x039a,
      0x039b,
      0x039c,
      0x039d,
      0x039e,
      0x039f,
      0x03a0,
      0x03a1,
      0x03a3,
      0x005d,
      0x0024,
      0x002a,
      0x0029,
      0x003b,
      0x005e,
      0x002d,
      0x002f,
      0x03a4,
      0x03a5,
      0x03a6,
      0x03a7,
      0x03a8,
      0x03a9,
      0xfffd,
      0xfffd,
      0xfffd,
      0x002c,
      0x0025,
      0x005f,
      0x003e,
      0x003f,
      0xfffd,
      0x0386,
      0x0388,
      0x0389,
      0xfffd,
      0x038a,
      0x038c,
      0x038e,
      0x038f,
      0x0060,
      0x003a,
      0x00a3,
      0x00a7,
      0x0027,
      0x003d,
      0x0022,
      0x00c4,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x03b1,
      0x03b2,
      0x03b3,
      0x03b4,
      0x03b5,
      0x03b6,
      0x00d6,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x03b7,
      0x03b8,
      0x03b9,
      0x03ba,
      0x03bb,
      0x03bc,
      0x00dc,
      0x00a8,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x03bd,
      0x03be,
      0x03bf,
      0x03c0,
      0x03c1,
      0x03c2,
      0xfffd,
      0x03ac,
      0x03ad,
      0x03ae,
      0x03ca,
      0x03af,
      0x03cc,
      0x03cd,
      0x03cb,
      0x03ce,
      0x03c3,
      0x03c4,
      0x03c5,
      0x03c6,
      0x03c7,
      0x03c8,
      0x00b8,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0xfffd,
      0x03c9,
      0x00c2,
      0x00e0,
      0x00e4,
      0x00ea,
      0x00b4,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x00b1,
      0x00e9,
      0x00e8,
      0x00eb,
      0x00ee,
      0x00ef,
      0x00b0,
      0xfffd,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x00bd,
      0x00f6,
      0x00f4,
      0x00fb,
      0x00f9,
      0x00fc,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x00ff,
      0x00e7,
      0x00c7,
      0xfffd,
      0xfffd,
      0x009f,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\xc2\x9c",
      "\x09",
      "\xc2\x86",
      "\x7f",
      "\xc2\x97",
      "\xc2\x8d",
      "\xc2\x8e",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\xc2\x9d",
      "\xc2\x85",
      "\x08",
      "\xc2\x87",
      "\x18",
      "\x19",
      "\xc2\x92",
      "\xc2\x8f",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\xc2\x80",
      "\xc2\x81",
      "\xc2\x82",
      "\xc2\x83",
      "\xc2\x84",
      "\x0a",
      "\x17",
      "\x1b",
      "\xc2\x88",
      "\xc2\x89",
      "\xc2\x8a",
      "\xc2\x8b",
      "\xc2\x8c",
      "\x05",
      "\x06",
      "\x07",
      "\xc2\x90",
      "\xc2\x91",
      "\x16",
      "\xc2\x93",
      "\xc2\x94",
      "\xc2\x95",
      "\xc2\x96",
      "\x04",
      "\xc2\x98",
      "\xc2\x99",
      "\xc2\x9a",
      "\xc2\x9b",
      "\x14",
      "\x15",
      "\xc2\x9e",
      "\x1a",
      "\x20",
      "\xce\x91",
      "\xce\x92",
      "\xce\x93",
      "\xce\x94",
      "\xce\x95",
      "\xce\x96",
      "\xce\x97",
      "\xce\x98",
      "\xce\x99",
      "\x5b",
      "\x2e",
      "\x3c",
      "\x28",
      "\x2b",
      "\x21",
      "\x26",
      "\xce\x9a",
      "\xce\x9b",
      "\xce\x9c",
      "\xce\x9d",
      "\xce\x9e",
      "\xce\x9f",
      "\xce\xa0",
      "\xce\xa1",
      "\xce\xa3",
      "\x5d",
      "\x24",
      "\x2a",
      "\x29",
      "\x3b",
      "\x5e",
      "\x2d",
      "\x2f",
      "\xce\xa4",
      "\xce\xa5",
      "\xce\xa6",
      "\xce\xa7",
      "\xce\xa8",
      "\xce\xa9",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x2c",
      "\x25",
      "\x5f",
      "\x3e",
      "\x3f",
      "\xef\xbf\xbd",
      "\xce\x86",
      "\xce\x88",
      "\xce\x89",
      "\xef\xbf\xbd",
      "\xce\x8a",
      "\xce\x8c",
      "\xce\x8e",
      "\xce\x8f",
      "\x60",
      "\x3a",
      "\xc2\xa3",
      "\xc2\xa7",
      "\x27",
      "\x3d",
      "\x22",
      "\xc3\x84",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\xce\xb1",
      "\xce\xb2",
      "\xce\xb3",
      "\xce\xb4",
      "\xce\xb5",
      "\xce\xb6",
      "\xc3\x96",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\xce\xb7",
      "\xce\xb8",
      "\xce\xb9",
      "\xce\xba",
      "\xce\xbb",
      "\xce\xbc",
      "\xc3\x9c",
      "\xc2\xa8",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\xce\xbd",
      "\xce\xbe",
      "\xce\xbf",
      "\xcf\x80",
      "\xcf\x81",
      "\xcf\x82",
      "\xef\xbf\xbd",
      "\xce\xac",
      "\xce\xad",
      "\xce\xae",
      "\xcf\x8a",
      "\xce\xaf",
      "\xcf\x8c",
      "\xcf\x8d",
      "\xcf\x8b",
      "\xcf\x8e",
      "\xcf\x83",
      "\xcf\x84",
      "\xcf\x85",
      "\xcf\x86",
      "\xcf\x87",
      "\xcf\x88",
      "\xc2\xb8",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\xef\xbf\xbd",
      "\xcf\x89",
      "\xc3\x82",
      "\xc3\xa0",
      "\xc3\xa4",
      "\xc3\xaa",
      "\xc2\xb4",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\xc2\xb1",
      "\xc3\xa9",
      "\xc3\xa8",
      "\xc3\xab",
      "\xc3\xae",
      "\xc3\xaf",
      "\xc2\xb0",
      "\xef\xbf\xbd",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\xc2\xbd",
      "\xc3\xb6",
      "\xc3\xb4",
      "\xc3\xbb",
      "\xc3\xb9",
      "\xc3\xbc",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\xc3\xbf",
      "\xc3\xa7",
      "\xc3\x87",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc2\x9f",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x37",
      0x00000005 => "\x2d",
      0x00000006 => "\x2e",
      0x00000007 => "\x2f",
      0x00000008 => "\x16",
      0x00000009 => "\x05",
      0x0000000a => "\x25",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x3c",
      0x00000015 => "\x3d",
      0x00000016 => "\x32",
      0x00000017 => "\x26",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x3f",
      0x0000001b => "\x27",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x40",
      0x00000021 => "\x4f",
      0x00000022 => "\x7f",
      0x00000024 => "\x5b",
      0x00000025 => "\x6c",
      0x00000026 => "\x50",
      0x00000027 => "\x7d",
      0x00000028 => "\x4d",
      0x00000029 => "\x5d",
      0x0000002a => "\x5c",
      0x0000002b => "\x4e",
      0x0000002c => "\x6b",
      0x0000002d => "\x60",
      0x0000002e => "\x4b",
      0x0000002f => "\x61",
      0x00000030 => "\xf0",
      0x00000031 => "\xf1",
      0x00000032 => "\xf2",
      0x00000033 => "\xf3",
      0x00000034 => "\xf4",
      0x00000035 => "\xf5",
      0x00000036 => "\xf6",
      0x00000037 => "\xf7",
      0x00000038 => "\xf8",
      0x00000039 => "\xf9",
      0x0000003a => "\x7a",
      0x0000003b => "\x5e",
      0x0000003c => "\x4c",
      0x0000003d => "\x7e",
      0x0000003e => "\x6e",
      0x0000003f => "\x6f",
      0x00000041 => "\xc1",
      0x00000042 => "\xc2",
      0x00000043 => "\xc3",
      0x00000044 => "\xc4",
      0x00000045 => "\xc5",
      0x00000046 => "\xc6",
      0x00000047 => "\xc7",
      0x00000048 => "\xc8",
      0x00000049 => "\xc9",
      0x0000004a => "\xd1",
      0x0000004b => "\xd2",
      0x0000004c => "\xd3",
      0x0000004d => "\xd4",
      0x0000004e => "\xd5",
      0x0000004f => "\xd6",
      0x00000050 => "\xd7",
      0x00000051 => "\xd8",
      0x00000052 => "\xd9",
      0x00000053 => "\xe2",
      0x00000054 => "\xe3",
      0x00000055 => "\xe4",
      0x00000056 => "\xe5",
      0x00000057 => "\xe6",
      0x00000058 => "\xe7",
      0x00000059 => "\xe8",
      0x0000005a => "\xe9",
      0x0000005b => "\x4a",
      0x0000005d => "\x5a",
      0x0000005e => "\x5f",
      0x0000005f => "\x6d",
      0x00000060 => "\x79",
      0x00000061 => "\x81",
      0x00000062 => "\x82",
      0x00000063 => "\x83",
      0x00000064 => "\x84",
      0x00000065 => "\x85",
      0x00000066 => "\x86",
      0x00000067 => "\x87",
      0x00000068 => "\x88",
      0x00000069 => "\x89",
      0x0000006a => "\x91",
      0x0000006b => "\x92",
      0x0000006c => "\x93",
      0x0000006d => "\x94",
      0x0000006e => "\x95",
      0x0000006f => "\x96",
      0x00000070 => "\x97",
      0x00000071 => "\x98",
      0x00000072 => "\x99",
      0x00000073 => "\xa2",
      0x00000074 => "\xa3",
      0x00000075 => "\xa4",
      0x00000076 => "\xa5",
      0x00000077 => "\xa6",
      0x00000078 => "\xa7",
      0x00000079 => "\xa8",
      0x0000007a => "\xa9",
      0x0000007f => "\x07",
      0x00000080 => "\x20",
      0x00000081 => "\x21",
      0x00000082 => "\x22",
      0x00000083 => "\x23",
      0x00000084 => "\x24",
      0x00000085 => "\x15",
      0x00000086 => "\x06",
      0x00000087 => "\x17",
      0x00000088 => "\x28",
      0x00000089 => "\x29",
      0x0000008a => "\x2a",
      0x0000008b => "\x2b",
      0x0000008c => "\x2c",
      0x0000008d => "\x09",
      0x0000008e => "\x0a",
      0x0000008f => "\x1b",
      0x00000090 => "\x30",
      0x00000091 => "\x31",
      0x00000092 => "\x1a",
      0x00000093 => "\x33",
      0x00000094 => "\x34",
      0x00000095 => "\x35",
      0x00000096 => "\x36",
      0x00000097 => "\x08",
      0x00000098 => "\x38",
      0x00000099 => "\x39",
      0x0000009a => "\x3a",
      0x0000009b => "\x3b",
      0x0000009c => "\x04",
      0x0000009d => "\x14",
      0x0000009e => "\x3e",
      0x0000009f => "\xff",
      0x000000a3 => "\x7b",
      0x000000a7 => "\x7c",
      0x000000a8 => "\xa1",
      0x000000b0 => "\xe0",
      0x000000b1 => "\xda",
      0x000000b4 => "\xd0",
      0x000000b8 => "\xc0",
      0x000000bd => "\xea",
      0x000000c2 => "\xcc",
      0x000000c4 => "\x80",
      0x000000c7 => "\xfc",
      0x000000d6 => "\x90",
      0x000000dc => "\xa0",
      0x000000e0 => "\xcd",
      0x000000e4 => "\xce",
      0x000000e7 => "\xfb",
      0x000000e8 => "\xdc",
      0x000000e9 => "\xdb",
      0x000000ea => "\xcf",
      0x000000eb => "\xdd",
      0x000000ee => "\xde",
      0x000000ef => "\xdf",
      0x000000f4 => "\xec",
      0x000000f6 => "\xeb",
      0x000000f9 => "\xee",
      0x000000fb => "\xed",
      0x000000fc => "\xef",
      0x000000ff => "\xfa",
      0x00000386 => "\x71",
      0x00000388 => "\x72",
      0x00000389 => "\x73",
      0x0000038a => "\x75",
      0x0000038c => "\x76",
      0x0000038e => "\x77",
      0x0000038f => "\x78",
      0x00000391 => "\x41",
      0x00000392 => "\x42",
      0x00000393 => "\x43",
      0x00000394 => "\x44",
      0x00000395 => "\x45",
      0x00000396 => "\x46",
      0x00000397 => "\x47",
      0x00000398 => "\x48",
      0x00000399 => "\x49",
      0x0000039a => "\x51",
      0x0000039b => "\x52",
      0x0000039c => "\x53",
      0x0000039d => "\x54",
      0x0000039e => "\x55",
      0x0000039f => "\x56",
      0x000003a0 => "\x57",
      0x000003a1 => "\x58",
      0x000003a3 => "\x59",
      0x000003a4 => "\x62",
      0x000003a5 => "\x63",
      0x000003a6 => "\x64",
      0x000003a7 => "\x65",
      0x000003a8 => "\x66",
      0x000003a9 => "\x67",
      0x000003ac => "\xb1",
      0x000003ad => "\xb2",
      0x000003ae => "\xb3",
      0x000003af => "\xb5",
      0x000003b1 => "\x8a",
      0x000003b2 => "\x8b",
      0x000003b3 => "\x8c",
      0x000003b4 => "\x8d",
      0x000003b5 => "\x8e",
      0x000003b6 => "\x8f",
      0x000003b7 => "\x9a",
      0x000003b8 => "\x9b",
      0x000003b9 => "\x9c",
      0x000003ba => "\x9d",
      0x000003bb => "\x9e",
      0x000003bc => "\x9f",
      0x000003bd => "\xaa",
      0x000003be => "\xab",
      0x000003bf => "\xac",
      0x000003c0 => "\xad",
      0x000003c1 => "\xae",
      0x000003c2 => "\xaf",
      0x000003c3 => "\xba",
      0x000003c4 => "\xbb",
      0x000003c5 => "\xbc",
      0x000003c6 => "\xbd",
      0x000003c7 => "\xbe",
      0x000003c8 => "\xbf",
      0x000003c9 => "\xcb",
      0x000003ca => "\xb4",
      0x000003cb => "\xb8",
      0x000003cc => "\xb6",
      0x000003cd => "\xb7",
      0x000003ce => "\xb9",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x6f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::IBM423 - Conversion routines for IBM423
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for IBM423.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: IBM NLS RM Vol2 SE09-8002-01, March 1990
   alias CP423
   alias EBCDIC-CP-GR
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  0000009C | STRING TERMINATOR (ST)
      05 |  00000009 | CHARACTER TABULATION (HT)
      06 |  00000086 | START OF SELECTED AREA (SSA)
      07 |  0000007F | DELETE (DEL)
      08 |  00000097 | END OF GUARDED AREA (EPA)
      09 |  0000008D | REVERSE LINE FEED (RI)
      0A |  0000008E | SINGLE-SHIFT TWO (SS2)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  0000009D | OPERATING SYSTEM COMMAND (OSC)
      15 |  00000085 | NEXT LINE (NEL)
      16 |  00000008 | BACKSPACE (BS)
      17 |  00000087 | END OF SELECTED AREA (ESA)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  00000092 | PRIVATE USE TWO (PU2)
      1B |  0000008F | SINGLE-SHIFT THREE (SS3)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000080 | PADDING CHARACTER (PAD)
      21 |  00000081 | HIGH OCTET PRESET (HOP)
      22 |  00000082 | BREAK PERMITTED HERE (BPH)
      23 |  00000083 | NO BREAK HERE (NBH)
      24 |  00000084 | INDEX (IND)
      25 |  0000000A | LINE FEED (LF)
      26 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      27 |  0000001B | ESCAPE (ESC)
      28 |  00000088 | CHARACTER TABULATION SET (HTS)
      29 |  00000089 | CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
      2A |  0000008A | LINE TABULATION SET (VTS)
      2B |  0000008B | PARTIAL LINE FORWARD (PLD)
      2C |  0000008C | PARTIAL LINE BACKWARD (PLU)
      2D |  00000005 | ENQUIRY (ENQ)
      2E |  00000006 | ACKNOWLEDGE (ACK)
      2F |  00000007 | BELL (BEL)
      30 |  00000090 | DEVICE CONTROL STRING (DCS)
      31 |  00000091 | PRIVATE USE ONE (PU1)
      32 |  00000016 | SYNCHRONOUS IDLE (SYN)
      33 |  00000093 | SET TRANSMIT STATE (STS)
      34 |  00000094 | CANCEL CHARACTER (CCH)
      35 |  00000095 | MESSAGE WAITING (MW)
      36 |  00000096 | START OF GUARDED AREA (SPA)
      37 |  00000004 | END OF TRANSMISSION (EOT)
      38 |  00000098 | START OF STRING (SOS)
      39 |  00000099 | SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
      3A |  0000009A | SINGLE CHARACTER INTRODUCER (SCI)
      3B |  0000009B | CONTROL SEQUENCE INTRODUCER (CSI)
      3C |  00000014 | DEVICE CONTROL FOUR (DC4)
      3D |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      3E |  0000009E | PRIVACY MESSAGE (PM)
      3F |  0000001A | SUBSTITUTE (SUB)
      40 |  00000020 | SPACE
      41 |  00000391 | GREEK CAPITAL LETTER ALPHA
      42 |  00000392 | GREEK CAPITAL LETTER BETA
      43 |  00000393 | GREEK CAPITAL LETTER GAMMA
      44 |  00000394 | GREEK CAPITAL LETTER DELTA
      45 |  00000395 | GREEK CAPITAL LETTER EPSILON
      46 |  00000396 | GREEK CAPITAL LETTER ZETA
      47 |  00000397 | GREEK CAPITAL LETTER ETA
      48 |  00000398 | GREEK CAPITAL LETTER THETA
      49 |  00000399 | GREEK CAPITAL LETTER IOTA
      4A |  0000005B | LEFT SQUARE BRACKET
      4B |  0000002E | FULL STOP
      4C |  0000003C | LESS-THAN SIGN
      4D |  00000028 | LEFT PARENTHESIS
      4E |  0000002B | PLUS SIGN
      4F |  00000021 | EXCLAMATION MARK
      50 |  00000026 | AMPERSAND
      51 |  0000039A | GREEK CAPITAL LETTER KAPPA
      52 |  0000039B | GREEK CAPITAL LETTER LAMDA
      53 |  0000039C | GREEK CAPITAL LETTER MU
      54 |  0000039D | GREEK CAPITAL LETTER NU
      55 |  0000039E | GREEK CAPITAL LETTER XI
      56 |  0000039F | GREEK CAPITAL LETTER OMICRON
      57 |  000003A0 | GREEK CAPITAL LETTER PI
      58 |  000003A1 | GREEK CAPITAL LETTER RHO
      59 |  000003A3 | GREEK CAPITAL LETTER SIGMA
      5A |  0000005D | RIGHT SQUARE BRACKET
      5B |  00000024 | DOLLAR SIGN
      5C |  0000002A | ASTERISK
      5D |  00000029 | RIGHT PARENTHESIS
      5E |  0000003B | SEMICOLON
      5F |  0000005E | CIRCUMFLEX ACCENT
      60 |  0000002D | HYPHEN-MINUS
      61 |  0000002F | SOLIDUS
      62 |  000003A4 | GREEK CAPITAL LETTER TAU
      63 |  000003A5 | GREEK CAPITAL LETTER UPSILON
      64 |  000003A6 | GREEK CAPITAL LETTER PHI
      65 |  000003A7 | GREEK CAPITAL LETTER CHI
      66 |  000003A8 | GREEK CAPITAL LETTER PSI
      67 |  000003A9 | GREEK CAPITAL LETTER OMEGA
      6B |  0000002C | COMMA
      6C |  00000025 | PERCENT SIGN
      6D |  0000005F | LOW LINE
      6E |  0000003E | GREATER-THAN SIGN
      6F |  0000003F | QUESTION MARK
      71 |  00000386 | GREEK CAPITAL LETTER ALPHA WITH TONOS
      72 |  00000388 | GREEK CAPITAL LETTER EPSILON WITH TONOS
      73 |  00000389 | GREEK CAPITAL LETTER ETA WITH TONOS
      75 |  0000038A | GREEK CAPITAL LETTER IOTA WITH TONOS
      76 |  0000038C | GREEK CAPITAL LETTER OMICRON WITH TONOS
      77 |  0000038E | GREEK CAPITAL LETTER UPSILON WITH TONOS
      78 |  0000038F | GREEK CAPITAL LETTER OMEGA WITH TONOS
      79 |  00000060 | GRAVE ACCENT
      7A |  0000003A | COLON
      7B |  000000A3 | POUND SIGN
      7C |  000000A7 | SECTION SIGN
      7D |  00000027 | APOSTROPHE
      7E |  0000003D | EQUALS SIGN
      7F |  00000022 | QUOTATION MARK
      80 |  000000C4 | LATIN CAPITAL LETTER A WITH DIAERESIS
      81 |  00000061 | LATIN SMALL LETTER A
      82 |  00000062 | LATIN SMALL LETTER B
      83 |  00000063 | LATIN SMALL LETTER C
      84 |  00000064 | LATIN SMALL LETTER D
      85 |  00000065 | LATIN SMALL LETTER E
      86 |  00000066 | LATIN SMALL LETTER F
      87 |  00000067 | LATIN SMALL LETTER G
      88 |  00000068 | LATIN SMALL LETTER H
      89 |  00000069 | LATIN SMALL LETTER I
      8A |  000003B1 | GREEK SMALL LETTER ALPHA
      8B |  000003B2 | GREEK SMALL LETTER BETA
      8C |  000003B3 | GREEK SMALL LETTER GAMMA
      8D |  000003B4 | GREEK SMALL LETTER DELTA
      8E |  000003B5 | GREEK SMALL LETTER EPSILON
      8F |  000003B6 | GREEK SMALL LETTER ZETA
      90 |  000000D6 | LATIN CAPITAL LETTER O WITH DIAERESIS
      91 |  0000006A | LATIN SMALL LETTER J
      92 |  0000006B | LATIN SMALL LETTER K
      93 |  0000006C | LATIN SMALL LETTER L
      94 |  0000006D | LATIN SMALL LETTER M
      95 |  0000006E | LATIN SMALL LETTER N
      96 |  0000006F | LATIN SMALL LETTER O
      97 |  00000070 | LATIN SMALL LETTER P
      98 |  00000071 | LATIN SMALL LETTER Q
      99 |  00000072 | LATIN SMALL LETTER R
      9A |  000003B7 | GREEK SMALL LETTER ETA
      9B |  000003B8 | GREEK SMALL LETTER THETA
      9C |  000003B9 | GREEK SMALL LETTER IOTA
      9D |  000003BA | GREEK SMALL LETTER KAPPA
      9E |  000003BB | GREEK SMALL LETTER LAMDA
      9F |  000003BC | GREEK SMALL LETTER MU
      A0 |  000000DC | LATIN CAPITAL LETTER U WITH DIAERESIS
      A1 |  000000A8 | DIAERESIS
      A2 |  00000073 | LATIN SMALL LETTER S
      A3 |  00000074 | LATIN SMALL LETTER T
      A4 |  00000075 | LATIN SMALL LETTER U
      A5 |  00000076 | LATIN SMALL LETTER V
      A6 |  00000077 | LATIN SMALL LETTER W
      A7 |  00000078 | LATIN SMALL LETTER X
      A8 |  00000079 | LATIN SMALL LETTER Y
      A9 |  0000007A | LATIN SMALL LETTER Z
      AA |  000003BD | GREEK SMALL LETTER NU
      AB |  000003BE | GREEK SMALL LETTER XI
      AC |  000003BF | GREEK SMALL LETTER OMICRON
      AD |  000003C0 | GREEK SMALL LETTER PI
      AE |  000003C1 | GREEK SMALL LETTER RHO
      AF |  000003C2 | GREEK SMALL LETTER FINAL SIGMA
      B1 |  000003AC | GREEK SMALL LETTER ALPHA WITH TONOS
      B2 |  000003AD | GREEK SMALL LETTER EPSILON WITH TONOS
      B3 |  000003AE | GREEK SMALL LETTER ETA WITH TONOS
      B4 |  000003CA | GREEK SMALL LETTER IOTA WITH DIALYTIKA
      B5 |  000003AF | GREEK SMALL LETTER IOTA WITH TONOS
      B6 |  000003CC | GREEK SMALL LETTER OMICRON WITH TONOS
      B7 |  000003CD | GREEK SMALL LETTER UPSILON WITH TONOS
      B8 |  000003CB | GREEK SMALL LETTER UPSILON WITH DIALYTIKA
      B9 |  000003CE | GREEK SMALL LETTER OMEGA WITH TONOS
      BA |  000003C3 | GREEK SMALL LETTER SIGMA
      BB |  000003C4 | GREEK SMALL LETTER TAU
      BC |  000003C5 | GREEK SMALL LETTER UPSILON
      BD |  000003C6 | GREEK SMALL LETTER PHI
      BE |  000003C7 | GREEK SMALL LETTER CHI
      BF |  000003C8 | GREEK SMALL LETTER PSI
      C0 |  000000B8 | CEDILLA
      C1 |  00000041 | LATIN CAPITAL LETTER A
      C2 |  00000042 | LATIN CAPITAL LETTER B
      C3 |  00000043 | LATIN CAPITAL LETTER C
      C4 |  00000044 | LATIN CAPITAL LETTER D
      C5 |  00000045 | LATIN CAPITAL LETTER E
      C6 |  00000046 | LATIN CAPITAL LETTER F
      C7 |  00000047 | LATIN CAPITAL LETTER G
      C8 |  00000048 | LATIN CAPITAL LETTER H
      C9 |  00000049 | LATIN CAPITAL LETTER I
      CB |  000003C9 | GREEK SMALL LETTER OMEGA
      CC |  000000C2 | LATIN CAPITAL LETTER A WITH CIRCUMFLEX
      CD |  000000E0 | LATIN SMALL LETTER A WITH GRAVE
      CE |  000000E4 | LATIN SMALL LETTER A WITH DIAERESIS
      CF |  000000EA | LATIN SMALL LETTER E WITH CIRCUMFLEX
      D0 |  000000B4 | ACUTE ACCENT
      D1 |  0000004A | LATIN CAPITAL LETTER J
      D2 |  0000004B | LATIN CAPITAL LETTER K
      D3 |  0000004C | LATIN CAPITAL LETTER L
      D4 |  0000004D | LATIN CAPITAL LETTER M
      D5 |  0000004E | LATIN CAPITAL LETTER N
      D6 |  0000004F | LATIN CAPITAL LETTER O
      D7 |  00000050 | LATIN CAPITAL LETTER P
      D8 |  00000051 | LATIN CAPITAL LETTER Q
      D9 |  00000052 | LATIN CAPITAL LETTER R
      DA |  000000B1 | PLUS-MINUS SIGN
      DB |  000000E9 | LATIN SMALL LETTER E WITH ACUTE
      DC |  000000E8 | LATIN SMALL LETTER E WITH GRAVE
      DD |  000000EB | LATIN SMALL LETTER E WITH DIAERESIS
      DE |  000000EE | LATIN SMALL LETTER I WITH CIRCUMFLEX
      DF |  000000EF | LATIN SMALL LETTER I WITH DIAERESIS
      E0 |  000000B0 | DEGREE SIGN
      E2 |  00000053 | LATIN CAPITAL LETTER S
      E3 |  00000054 | LATIN CAPITAL LETTER T
      E4 |  00000055 | LATIN CAPITAL LETTER U
      E5 |  00000056 | LATIN CAPITAL LETTER V
      E6 |  00000057 | LATIN CAPITAL LETTER W
      E7 |  00000058 | LATIN CAPITAL LETTER X
      E8 |  00000059 | LATIN CAPITAL LETTER Y
      E9 |  0000005A | LATIN CAPITAL LETTER Z
      EA |  000000BD | VULGAR FRACTION ONE HALF
      EB |  000000F6 | LATIN SMALL LETTER O WITH DIAERESIS
      EC |  000000F4 | LATIN SMALL LETTER O WITH CIRCUMFLEX
      ED |  000000FB | LATIN SMALL LETTER U WITH CIRCUMFLEX
      EE |  000000F9 | LATIN SMALL LETTER U WITH GRAVE
      EF |  000000FC | LATIN SMALL LETTER U WITH DIAERESIS
      F0 |  00000030 | DIGIT ZERO
      F1 |  00000031 | DIGIT ONE
      F2 |  00000032 | DIGIT TWO
      F3 |  00000033 | DIGIT THREE
      F4 |  00000034 | DIGIT FOUR
      F5 |  00000035 | DIGIT FIVE
      F6 |  00000036 | DIGIT SIX
      F7 |  00000037 | DIGIT SEVEN
      F8 |  00000038 | DIGIT EIGHT
      F9 |  00000039 | DIGIT NINE
      FA |  000000FF | LATIN SMALL LETTER Y WITH DIAERESIS
      FB |  000000E7 | LATIN SMALL LETTER C WITH CEDILLA
      FC |  000000C7 | LATIN CAPITAL LETTER C WITH CEDILLA
      FF |  0000009F | APPLICATION PROGRAM COMMAND (APC)
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_IBM423

    $main::fatpacked{"Locale/RecodeData/IBM424.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_IBM424';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for IBM424.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::IBM424;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x009c,
      0x0009,
      0x0086,
      0x007f,
      0x0097,
      0x008d,
      0x008e,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x009d,
      0x0085,
      0x0008,
      0x0087,
      0x0018,
      0x0019,
      0x0092,
      0x008f,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0080,
      0x0081,
      0x0082,
      0x0083,
      0x0084,
      0x000a,
      0x0017,
      0x001b,
      0x0088,
      0x0089,
      0x008a,
      0x008b,
      0x008c,
      0x0005,
      0x0006,
      0x0007,
      0x0090,
      0x0091,
      0x0016,
      0x0093,
      0x0094,
      0x0095,
      0x0096,
      0x0004,
      0x0098,
      0x0099,
      0x009a,
      0x009b,
      0x0014,
      0x0015,
      0x009e,
      0x001a,
      0x0020,
      0x05d0,
      0x05d1,
      0x05d2,
      0x05d3,
      0x05d4,
      0x05d5,
      0x05d6,
      0x05d7,
      0x05d8,
      0x00a2,
      0x002e,
      0x003c,
      0x0028,
      0x002b,
      0x007c,
      0x0026,
      0x05d9,
      0x05da,
      0x05db,
      0x05dc,
      0x05dd,
      0x05de,
      0x05df,
      0x05e0,
      0x05e1,
      0x0021,
      0x0024,
      0x002a,
      0x0029,
      0x003b,
      0x00ac,
      0x002d,
      0x002f,
      0x05e2,
      0x05e3,
      0x05e4,
      0x05e5,
      0x05e6,
      0x05e7,
      0x05e8,
      0x05e9,
      0x00a6,
      0x002c,
      0x0025,
      0x005f,
      0x003e,
      0x003f,
      0xfffd,
      0x05ea,
      0xfffd,
      0xfffd,
      0x00a0,
      0xfffd,
      0xfffd,
      0xfffd,
      0x21d4,
      0x0060,
      0x003a,
      0x0023,
      0x0040,
      0x0027,
      0x003d,
      0x0022,
      0xfffd,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x00ab,
      0x00bb,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00b0,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00b8,
      0xfffd,
      0x00a4,
      0x00b5,
      0x007e,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00ae,
      0x005e,
      0x00a3,
      0x00a5,
      0x00b7,
      0x00a9,
      0x00a7,
      0x00b6,
      0x00bc,
      0x00bd,
      0x00be,
      0x005b,
      0x005d,
      0x203e,
      0x00a8,
      0x00b4,
      0x00d7,
      0x007b,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x00ad,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x007d,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x00b9,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x005c,
      0x00f7,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x00b2,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x00b3,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x009f,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\xc2\x9c",
      "\x09",
      "\xc2\x86",
      "\x7f",
      "\xc2\x97",
      "\xc2\x8d",
      "\xc2\x8e",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\xc2\x9d",
      "\xc2\x85",
      "\x08",
      "\xc2\x87",
      "\x18",
      "\x19",
      "\xc2\x92",
      "\xc2\x8f",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\xc2\x80",
      "\xc2\x81",
      "\xc2\x82",
      "\xc2\x83",
      "\xc2\x84",
      "\x0a",
      "\x17",
      "\x1b",
      "\xc2\x88",
      "\xc2\x89",
      "\xc2\x8a",
      "\xc2\x8b",
      "\xc2\x8c",
      "\x05",
      "\x06",
      "\x07",
      "\xc2\x90",
      "\xc2\x91",
      "\x16",
      "\xc2\x93",
      "\xc2\x94",
      "\xc2\x95",
      "\xc2\x96",
      "\x04",
      "\xc2\x98",
      "\xc2\x99",
      "\xc2\x9a",
      "\xc2\x9b",
      "\x14",
      "\x15",
      "\xc2\x9e",
      "\x1a",
      "\x20",
      "\xd7\x90",
      "\xd7\x91",
      "\xd7\x92",
      "\xd7\x93",
      "\xd7\x94",
      "\xd7\x95",
      "\xd7\x96",
      "\xd7\x97",
      "\xd7\x98",
      "\xc2\xa2",
      "\x2e",
      "\x3c",
      "\x28",
      "\x2b",
      "\x7c",
      "\x26",
      "\xd7\x99",
      "\xd7\x9a",
      "\xd7\x9b",
      "\xd7\x9c",
      "\xd7\x9d",
      "\xd7\x9e",
      "\xd7\x9f",
      "\xd7\xa0",
      "\xd7\xa1",
      "\x21",
      "\x24",
      "\x2a",
      "\x29",
      "\x3b",
      "\xc2\xac",
      "\x2d",
      "\x2f",
      "\xd7\xa2",
      "\xd7\xa3",
      "\xd7\xa4",
      "\xd7\xa5",
      "\xd7\xa6",
      "\xd7\xa7",
      "\xd7\xa8",
      "\xd7\xa9",
      "\xc2\xa6",
      "\x2c",
      "\x25",
      "\x5f",
      "\x3e",
      "\x3f",
      "\xef\xbf\xbd",
      "\xd7\xaa",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc2\xa0",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xe2\x87\x94",
      "\x60",
      "\x3a",
      "\x23",
      "\x40",
      "\x27",
      "\x3d",
      "\x22",
      "\xef\xbf\xbd",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\xc2\xab",
      "\xc2\xbb",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc2\xb0",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc2\xb8",
      "\xef\xbf\xbd",
      "\xc2\xa4",
      "\xc2\xb5",
      "\x7e",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc2\xae",
      "\x5e",
      "\xc2\xa3",
      "\xc2\xa5",
      "\xc2\xb7",
      "\xc2\xa9",
      "\xc2\xa7",
      "\xc2\xb6",
      "\xc2\xbc",
      "\xc2\xbd",
      "\xc2\xbe",
      "\x5b",
      "\x5d",
      "\xe2\x80\xbe",
      "\xc2\xa8",
      "\xc2\xb4",
      "\xc3\x97",
      "\x7b",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\xc2\xad",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x7d",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\xc2\xb9",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x5c",
      "\xc3\xb7",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\xc2\xb2",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\xc2\xb3",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc2\x9f",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x37",
      0x00000005 => "\x2d",
      0x00000006 => "\x2e",
      0x00000007 => "\x2f",
      0x00000008 => "\x16",
      0x00000009 => "\x05",
      0x0000000a => "\x25",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x3c",
      0x00000015 => "\x3d",
      0x00000016 => "\x32",
      0x00000017 => "\x26",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x3f",
      0x0000001b => "\x27",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x40",
      0x00000021 => "\x5a",
      0x00000022 => "\x7f",
      0x00000023 => "\x7b",
      0x00000024 => "\x5b",
      0x00000025 => "\x6c",
      0x00000026 => "\x50",
      0x00000027 => "\x7d",
      0x00000028 => "\x4d",
      0x00000029 => "\x5d",
      0x0000002a => "\x5c",
      0x0000002b => "\x4e",
      0x0000002c => "\x6b",
      0x0000002d => "\x60",
      0x0000002e => "\x4b",
      0x0000002f => "\x61",
      0x00000030 => "\xf0",
      0x00000031 => "\xf1",
      0x00000032 => "\xf2",
      0x00000033 => "\xf3",
      0x00000034 => "\xf4",
      0x00000035 => "\xf5",
      0x00000036 => "\xf6",
      0x00000037 => "\xf7",
      0x00000038 => "\xf8",
      0x00000039 => "\xf9",
      0x0000003a => "\x7a",
      0x0000003b => "\x5e",
      0x0000003c => "\x4c",
      0x0000003d => "\x7e",
      0x0000003e => "\x6e",
      0x0000003f => "\x6f",
      0x00000040 => "\x7c",
      0x00000041 => "\xc1",
      0x00000042 => "\xc2",
      0x00000043 => "\xc3",
      0x00000044 => "\xc4",
      0x00000045 => "\xc5",
      0x00000046 => "\xc6",
      0x00000047 => "\xc7",
      0x00000048 => "\xc8",
      0x00000049 => "\xc9",
      0x0000004a => "\xd1",
      0x0000004b => "\xd2",
      0x0000004c => "\xd3",
      0x0000004d => "\xd4",
      0x0000004e => "\xd5",
      0x0000004f => "\xd6",
      0x00000050 => "\xd7",
      0x00000051 => "\xd8",
      0x00000052 => "\xd9",
      0x00000053 => "\xe2",
      0x00000054 => "\xe3",
      0x00000055 => "\xe4",
      0x00000056 => "\xe5",
      0x00000057 => "\xe6",
      0x00000058 => "\xe7",
      0x00000059 => "\xe8",
      0x0000005a => "\xe9",
      0x0000005b => "\xba",
      0x0000005c => "\xe0",
      0x0000005d => "\xbb",
      0x0000005e => "\xb0",
      0x0000005f => "\x6d",
      0x00000060 => "\x79",
      0x00000061 => "\x81",
      0x00000062 => "\x82",
      0x00000063 => "\x83",
      0x00000064 => "\x84",
      0x00000065 => "\x85",
      0x00000066 => "\x86",
      0x00000067 => "\x87",
      0x00000068 => "\x88",
      0x00000069 => "\x89",
      0x0000006a => "\x91",
      0x0000006b => "\x92",
      0x0000006c => "\x93",
      0x0000006d => "\x94",
      0x0000006e => "\x95",
      0x0000006f => "\x96",
      0x00000070 => "\x97",
      0x00000071 => "\x98",
      0x00000072 => "\x99",
      0x00000073 => "\xa2",
      0x00000074 => "\xa3",
      0x00000075 => "\xa4",
      0x00000076 => "\xa5",
      0x00000077 => "\xa6",
      0x00000078 => "\xa7",
      0x00000079 => "\xa8",
      0x0000007a => "\xa9",
      0x0000007b => "\xc0",
      0x0000007c => "\x4f",
      0x0000007d => "\xd0",
      0x0000007e => "\xa1",
      0x0000007f => "\x07",
      0x00000080 => "\x20",
      0x00000081 => "\x21",
      0x00000082 => "\x22",
      0x00000083 => "\x23",
      0x00000084 => "\x24",
      0x00000085 => "\x15",
      0x00000086 => "\x06",
      0x00000087 => "\x17",
      0x00000088 => "\x28",
      0x00000089 => "\x29",
      0x0000008a => "\x2a",
      0x0000008b => "\x2b",
      0x0000008c => "\x2c",
      0x0000008d => "\x09",
      0x0000008e => "\x0a",
      0x0000008f => "\x1b",
      0x00000090 => "\x30",
      0x00000091 => "\x31",
      0x00000092 => "\x1a",
      0x00000093 => "\x33",
      0x00000094 => "\x34",
      0x00000095 => "\x35",
      0x00000096 => "\x36",
      0x00000097 => "\x08",
      0x00000098 => "\x38",
      0x00000099 => "\x39",
      0x0000009a => "\x3a",
      0x0000009b => "\x3b",
      0x0000009c => "\x04",
      0x0000009d => "\x14",
      0x0000009e => "\x3e",
      0x0000009f => "\xff",
      0x000000a0 => "\x74",
      0x000000a2 => "\x4a",
      0x000000a3 => "\xb1",
      0x000000a4 => "\x9f",
      0x000000a5 => "\xb2",
      0x000000a6 => "\x6a",
      0x000000a7 => "\xb5",
      0x000000a8 => "\xbd",
      0x000000a9 => "\xb4",
      0x000000ab => "\x8a",
      0x000000ac => "\x5f",
      0x000000ad => "\xca",
      0x000000ae => "\xaf",
      0x000000b0 => "\x90",
      0x000000b2 => "\xea",
      0x000000b3 => "\xfa",
      0x000000b4 => "\xbe",
      0x000000b5 => "\xa0",
      0x000000b6 => "\xb6",
      0x000000b7 => "\xb3",
      0x000000b8 => "\x9d",
      0x000000b9 => "\xda",
      0x000000bb => "\x8b",
      0x000000bc => "\xb7",
      0x000000bd => "\xb8",
      0x000000be => "\xb9",
      0x000000d7 => "\xbf",
      0x000000f7 => "\xe1",
      0x000005d0 => "\x41",
      0x000005d1 => "\x42",
      0x000005d2 => "\x43",
      0x000005d3 => "\x44",
      0x000005d4 => "\x45",
      0x000005d5 => "\x46",
      0x000005d6 => "\x47",
      0x000005d7 => "\x48",
      0x000005d8 => "\x49",
      0x000005d9 => "\x51",
      0x000005da => "\x52",
      0x000005db => "\x53",
      0x000005dc => "\x54",
      0x000005dd => "\x55",
      0x000005de => "\x56",
      0x000005df => "\x57",
      0x000005e0 => "\x58",
      0x000005e1 => "\x59",
      0x000005e2 => "\x62",
      0x000005e3 => "\x63",
      0x000005e4 => "\x64",
      0x000005e5 => "\x65",
      0x000005e6 => "\x66",
      0x000005e7 => "\x67",
      0x000005e8 => "\x68",
      0x000005e9 => "\x69",
      0x000005ea => "\x71",
      0x0000203e => "\xbc",
      0x000021d4 => "\x78",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x6f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::IBM424 - Conversion routines for IBM424
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for IBM424.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: IBM NLS RM Vol2 SE09-8002-01, March 1990
   alias CP424
   alias EBCDIC-CP-HE
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  0000009C | STRING TERMINATOR (ST)
      05 |  00000009 | CHARACTER TABULATION (HT)
      06 |  00000086 | START OF SELECTED AREA (SSA)
      07 |  0000007F | DELETE (DEL)
      08 |  00000097 | END OF GUARDED AREA (EPA)
      09 |  0000008D | REVERSE LINE FEED (RI)
      0A |  0000008E | SINGLE-SHIFT TWO (SS2)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  0000009D | OPERATING SYSTEM COMMAND (OSC)
      15 |  00000085 | NEXT LINE (NEL)
      16 |  00000008 | BACKSPACE (BS)
      17 |  00000087 | END OF SELECTED AREA (ESA)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  00000092 | PRIVATE USE TWO (PU2)
      1B |  0000008F | SINGLE-SHIFT THREE (SS3)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000080 | PADDING CHARACTER (PAD)
      21 |  00000081 | HIGH OCTET PRESET (HOP)
      22 |  00000082 | BREAK PERMITTED HERE (BPH)
      23 |  00000083 | NO BREAK HERE (NBH)
      24 |  00000084 | INDEX (IND)
      25 |  0000000A | LINE FEED (LF)
      26 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      27 |  0000001B | ESCAPE (ESC)
      28 |  00000088 | CHARACTER TABULATION SET (HTS)
      29 |  00000089 | CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
      2A |  0000008A | LINE TABULATION SET (VTS)
      2B |  0000008B | PARTIAL LINE FORWARD (PLD)
      2C |  0000008C | PARTIAL LINE BACKWARD (PLU)
      2D |  00000005 | ENQUIRY (ENQ)
      2E |  00000006 | ACKNOWLEDGE (ACK)
      2F |  00000007 | BELL (BEL)
      30 |  00000090 | DEVICE CONTROL STRING (DCS)
      31 |  00000091 | PRIVATE USE ONE (PU1)
      32 |  00000016 | SYNCHRONOUS IDLE (SYN)
      33 |  00000093 | SET TRANSMIT STATE (STS)
      34 |  00000094 | CANCEL CHARACTER (CCH)
      35 |  00000095 | MESSAGE WAITING (MW)
      36 |  00000096 | START OF GUARDED AREA (SPA)
      37 |  00000004 | END OF TRANSMISSION (EOT)
      38 |  00000098 | START OF STRING (SOS)
      39 |  00000099 | SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
      3A |  0000009A | SINGLE CHARACTER INTRODUCER (SCI)
      3B |  0000009B | CONTROL SEQUENCE INTRODUCER (CSI)
      3C |  00000014 | DEVICE CONTROL FOUR (DC4)
      3D |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      3E |  0000009E | PRIVACY MESSAGE (PM)
      3F |  0000001A | SUBSTITUTE (SUB)
      40 |  00000020 | SPACE
      41 |  000005D0 | HEBREW LETTER ALEF
      42 |  000005D1 | HEBREW LETTER BET
      43 |  000005D2 | HEBREW LETTER GIMEL
      44 |  000005D3 | HEBREW LETTER DALET
      45 |  000005D4 | HEBREW LETTER HE
      46 |  000005D5 | HEBREW LETTER VAV
      47 |  000005D6 | HEBREW LETTER ZAYIN
      48 |  000005D7 | HEBREW LETTER HET
      49 |  000005D8 | HEBREW LETTER TET
      4A |  000000A2 | CENT SIGN
      4B |  0000002E | FULL STOP
      4C |  0000003C | LESS-THAN SIGN
      4D |  00000028 | LEFT PARENTHESIS
      4E |  0000002B | PLUS SIGN
      4F |  0000007C | VERTICAL LINE
      50 |  00000026 | AMPERSAND
      51 |  000005D9 | HEBREW LETTER YOD
      52 |  000005DA | HEBREW LETTER FINAL KAF
      53 |  000005DB | HEBREW LETTER KAF
      54 |  000005DC | HEBREW LETTER LAMED
      55 |  000005DD | HEBREW LETTER FINAL MEM
      56 |  000005DE | HEBREW LETTER MEM
      57 |  000005DF | HEBREW LETTER FINAL NUN
      58 |  000005E0 | HEBREW LETTER NUN
      59 |  000005E1 | HEBREW LETTER SAMEKH
      5A |  00000021 | EXCLAMATION MARK
      5B |  00000024 | DOLLAR SIGN
      5C |  0000002A | ASTERISK
      5D |  00000029 | RIGHT PARENTHESIS
      5E |  0000003B | SEMICOLON
      5F |  000000AC | NOT SIGN
      60 |  0000002D | HYPHEN-MINUS
      61 |  0000002F | SOLIDUS
      62 |  000005E2 | HEBREW LETTER AYIN
      63 |  000005E3 | HEBREW LETTER FINAL PE
      64 |  000005E4 | HEBREW LETTER PE
      65 |  000005E5 | HEBREW LETTER FINAL TSADI
      66 |  000005E6 | HEBREW LETTER TSADI
      67 |  000005E7 | HEBREW LETTER QOF
      68 |  000005E8 | HEBREW LETTER RESH
      69 |  000005E9 | HEBREW LETTER SHIN
      6A |  000000A6 | BROKEN BAR
      6B |  0000002C | COMMA
      6C |  00000025 | PERCENT SIGN
      6D |  0000005F | LOW LINE
      6E |  0000003E | GREATER-THAN SIGN
      6F |  0000003F | QUESTION MARK
      71 |  000005EA | HEBREW LETTER TAV
      74 |  000000A0 | NO-BREAK SPACE
      78 |  000021D4 | LEFT RIGHT DOUBLE ARROW
      79 |  00000060 | GRAVE ACCENT
      7A |  0000003A | COLON
      7B |  00000023 | NUMBER SIGN
      7C |  00000040 | COMMERCIAL AT
      7D |  00000027 | APOSTROPHE
      7E |  0000003D | EQUALS SIGN
      7F |  00000022 | QUOTATION MARK
      81 |  00000061 | LATIN SMALL LETTER A
      82 |  00000062 | LATIN SMALL LETTER B
      83 |  00000063 | LATIN SMALL LETTER C
      84 |  00000064 | LATIN SMALL LETTER D
      85 |  00000065 | LATIN SMALL LETTER E
      86 |  00000066 | LATIN SMALL LETTER F
      87 |  00000067 | LATIN SMALL LETTER G
      88 |  00000068 | LATIN SMALL LETTER H
      89 |  00000069 | LATIN SMALL LETTER I
      8A |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
      8B |  000000BB | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
      90 |  000000B0 | DEGREE SIGN
      91 |  0000006A | LATIN SMALL LETTER J
      92 |  0000006B | LATIN SMALL LETTER K
      93 |  0000006C | LATIN SMALL LETTER L
      94 |  0000006D | LATIN SMALL LETTER M
      95 |  0000006E | LATIN SMALL LETTER N
      96 |  0000006F | LATIN SMALL LETTER O
      97 |  00000070 | LATIN SMALL LETTER P
      98 |  00000071 | LATIN SMALL LETTER Q
      99 |  00000072 | LATIN SMALL LETTER R
      9D |  000000B8 | CEDILLA
      9F |  000000A4 | CURRENCY SIGN
      A0 |  000000B5 | MICRO SIGN
      A1 |  0000007E | TILDE
      A2 |  00000073 | LATIN SMALL LETTER S
      A3 |  00000074 | LATIN SMALL LETTER T
      A4 |  00000075 | LATIN SMALL LETTER U
      A5 |  00000076 | LATIN SMALL LETTER V
      A6 |  00000077 | LATIN SMALL LETTER W
      A7 |  00000078 | LATIN SMALL LETTER X
      A8 |  00000079 | LATIN SMALL LETTER Y
      A9 |  0000007A | LATIN SMALL LETTER Z
      AF |  000000AE | REGISTERED SIGN
      B0 |  0000005E | CIRCUMFLEX ACCENT
      B1 |  000000A3 | POUND SIGN
      B2 |  000000A5 | YEN SIGN
      B3 |  000000B7 | MIDDLE DOT
      B4 |  000000A9 | COPYRIGHT SIGN
      B5 |  000000A7 | SECTION SIGN
      B6 |  000000B6 | PILCROW SIGN
      B7 |  000000BC | VULGAR FRACTION ONE QUARTER
      B8 |  000000BD | VULGAR FRACTION ONE HALF
      B9 |  000000BE | VULGAR FRACTION THREE QUARTERS
      BA |  0000005B | LEFT SQUARE BRACKET
      BB |  0000005D | RIGHT SQUARE BRACKET
      BC |  0000203E | OVERLINE
      BD |  000000A8 | DIAERESIS
      BE |  000000B4 | ACUTE ACCENT
      BF |  000000D7 | MULTIPLICATION SIGN
      C0 |  0000007B | LEFT CURLY BRACKET
      C1 |  00000041 | LATIN CAPITAL LETTER A
      C2 |  00000042 | LATIN CAPITAL LETTER B
      C3 |  00000043 | LATIN CAPITAL LETTER C
      C4 |  00000044 | LATIN CAPITAL LETTER D
      C5 |  00000045 | LATIN CAPITAL LETTER E
      C6 |  00000046 | LATIN CAPITAL LETTER F
      C7 |  00000047 | LATIN CAPITAL LETTER G
      C8 |  00000048 | LATIN CAPITAL LETTER H
      C9 |  00000049 | LATIN CAPITAL LETTER I
      CA |  000000AD | SOFT HYPHEN
      D0 |  0000007D | RIGHT CURLY BRACKET
      D1 |  0000004A | LATIN CAPITAL LETTER J
      D2 |  0000004B | LATIN CAPITAL LETTER K
      D3 |  0000004C | LATIN CAPITAL LETTER L
      D4 |  0000004D | LATIN CAPITAL LETTER M
      D5 |  0000004E | LATIN CAPITAL LETTER N
      D6 |  0000004F | LATIN CAPITAL LETTER O
      D7 |  00000050 | LATIN CAPITAL LETTER P
      D8 |  00000051 | LATIN CAPITAL LETTER Q
      D9 |  00000052 | LATIN CAPITAL LETTER R
      DA |  000000B9 | SUPERSCRIPT ONE
      E0 |  0000005C | REVERSE SOLIDUS
      E1 |  000000F7 | DIVISION SIGN
      E2 |  00000053 | LATIN CAPITAL LETTER S
      E3 |  00000054 | LATIN CAPITAL LETTER T
      E4 |  00000055 | LATIN CAPITAL LETTER U
      E5 |  00000056 | LATIN CAPITAL LETTER V
      E6 |  00000057 | LATIN CAPITAL LETTER W
      E7 |  00000058 | LATIN CAPITAL LETTER X
      E8 |  00000059 | LATIN CAPITAL LETTER Y
      E9 |  0000005A | LATIN CAPITAL LETTER Z
      EA |  000000B2 | SUPERSCRIPT TWO
      F0 |  00000030 | DIGIT ZERO
      F1 |  00000031 | DIGIT ONE
      F2 |  00000032 | DIGIT TWO
      F3 |  00000033 | DIGIT THREE
      F4 |  00000034 | DIGIT FOUR
      F5 |  00000035 | DIGIT FIVE
      F6 |  00000036 | DIGIT SIX
      F7 |  00000037 | DIGIT SEVEN
      F8 |  00000038 | DIGIT EIGHT
      F9 |  00000039 | DIGIT NINE
      FA |  000000B3 | SUPERSCRIPT THREE
      FF |  0000009F | APPLICATION PROGRAM COMMAND (APC)
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_IBM424

    $main::fatpacked{"Locale/RecodeData/IBM437.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_IBM437';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for IBM437.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::IBM437;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0x00c7,
      0x00fc,
      0x00e9,
      0x00e2,
      0x00e4,
      0x00e0,
      0x00e5,
      0x00e7,
      0x00ea,
      0x00eb,
      0x00e8,
      0x00ef,
      0x00ee,
      0x00ec,
      0x00c4,
      0x00c5,
      0x00c9,
      0x00e6,
      0x00c6,
      0x00f4,
      0x00f6,
      0x00f2,
      0x00fb,
      0x00f9,
      0x00ff,
      0x00d6,
      0x00dc,
      0x00a2,
      0x00a3,
      0x00a5,
      0x20a7,
      0x0192,
      0x00e1,
      0x00ed,
      0x00f3,
      0x00fa,
      0x00f1,
      0x00d1,
      0x00aa,
      0x00ba,
      0x00bf,
      0x2310,
      0x00ac,
      0x00bd,
      0x00bc,
      0x00a1,
      0x00ab,
      0x00bb,
      0x2591,
      0x2592,
      0x2593,
      0x2502,
      0x2524,
      0x2561,
      0x2562,
      0x2556,
      0x2555,
      0x2563,
      0x2551,
      0x2557,
      0x255d,
      0x255c,
      0x255b,
      0x2510,
      0x2514,
      0x2534,
      0x252c,
      0x251c,
      0x2500,
      0x253c,
      0x255e,
      0x255f,
      0x255a,
      0x2554,
      0x2569,
      0x2566,
      0x2560,
      0x2550,
      0x256c,
      0x2567,
      0x2568,
      0x2564,
      0x2565,
      0x2559,
      0x2558,
      0x2552,
      0x2553,
      0x256b,
      0x256a,
      0x2518,
      0x250c,
      0x2588,
      0x2584,
      0x258c,
      0x2590,
      0x2580,
      0x03b1,
      0x00df,
      0x0393,
      0x03c0,
      0x03a3,
      0x03c3,
      0x00b5,
      0x03c4,
      0x03a6,
      0x0398,
      0x03a9,
      0x03b4,
      0x221e,
      0x03c6,
      0x03b5,
      0x2229,
      0x2261,
      0x00b1,
      0x2265,
      0x2264,
      0x2320,
      0x2321,
      0x00f7,
      0x2248,
      0x00b0,
      0x2219,
      0x00b7,
      0x221a,
      0x207f,
      0x00b2,
      0x25a0,
      0x00a0,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xc3\x87",
      "\xc3\xbc",
      "\xc3\xa9",
      "\xc3\xa2",
      "\xc3\xa4",
      "\xc3\xa0",
      "\xc3\xa5",
      "\xc3\xa7",
      "\xc3\xaa",
      "\xc3\xab",
      "\xc3\xa8",
      "\xc3\xaf",
      "\xc3\xae",
      "\xc3\xac",
      "\xc3\x84",
      "\xc3\x85",
      "\xc3\x89",
      "\xc3\xa6",
      "\xc3\x86",
      "\xc3\xb4",
      "\xc3\xb6",
      "\xc3\xb2",
      "\xc3\xbb",
      "\xc3\xb9",
      "\xc3\xbf",
      "\xc3\x96",
      "\xc3\x9c",
      "\xc2\xa2",
      "\xc2\xa3",
      "\xc2\xa5",
      "\xe2\x82\xa7",
      "\xc6\x92",
      "\xc3\xa1",
      "\xc3\xad",
      "\xc3\xb3",
      "\xc3\xba",
      "\xc3\xb1",
      "\xc3\x91",
      "\xc2\xaa",
      "\xc2\xba",
      "\xc2\xbf",
      "\xe2\x8c\x90",
      "\xc2\xac",
      "\xc2\xbd",
      "\xc2\xbc",
      "\xc2\xa1",
      "\xc2\xab",
      "\xc2\xbb",
      "\xe2\x96\x91",
      "\xe2\x96\x92",
      "\xe2\x96\x93",
      "\xe2\x94\x82",
      "\xe2\x94\xa4",
      "\xe2\x95\xa1",
      "\xe2\x95\xa2",
      "\xe2\x95\x96",
      "\xe2\x95\x95",
      "\xe2\x95\xa3",
      "\xe2\x95\x91",
      "\xe2\x95\x97",
      "\xe2\x95\x9d",
      "\xe2\x95\x9c",
      "\xe2\x95\x9b",
      "\xe2\x94\x90",
      "\xe2\x94\x94",
      "\xe2\x94\xb4",
      "\xe2\x94\xac",
      "\xe2\x94\x9c",
      "\xe2\x94\x80",
      "\xe2\x94\xbc",
      "\xe2\x95\x9e",
      "\xe2\x95\x9f",
      "\xe2\x95\x9a",
      "\xe2\x95\x94",
      "\xe2\x95\xa9",
      "\xe2\x95\xa6",
      "\xe2\x95\xa0",
      "\xe2\x95\x90",
      "\xe2\x95\xac",
      "\xe2\x95\xa7",
      "\xe2\x95\xa8",
      "\xe2\x95\xa4",
      "\xe2\x95\xa5",
      "\xe2\x95\x99",
      "\xe2\x95\x98",
      "\xe2\x95\x92",
      "\xe2\x95\x93",
      "\xe2\x95\xab",
      "\xe2\x95\xaa",
      "\xe2\x94\x98",
      "\xe2\x94\x8c",
      "\xe2\x96\x88",
      "\xe2\x96\x84",
      "\xe2\x96\x8c",
      "\xe2\x96\x90",
      "\xe2\x96\x80",
      "\xce\xb1",
      "\xc3\x9f",
      "\xce\x93",
      "\xcf\x80",
      "\xce\xa3",
      "\xcf\x83",
      "\xc2\xb5",
      "\xcf\x84",
      "\xce\xa6",
      "\xce\x98",
      "\xce\xa9",
      "\xce\xb4",
      "\xe2\x88\x9e",
      "\xcf\x86",
      "\xce\xb5",
      "\xe2\x88\xa9",
      "\xe2\x89\xa1",
      "\xc2\xb1",
      "\xe2\x89\xa5",
      "\xe2\x89\xa4",
      "\xe2\x8c\xa0",
      "\xe2\x8c\xa1",
      "\xc3\xb7",
      "\xe2\x89\x88",
      "\xc2\xb0",
      "\xe2\x88\x99",
      "\xc2\xb7",
      "\xe2\x88\x9a",
      "\xe2\x81\xbf",
      "\xc2\xb2",
      "\xe2\x96\xa0",
      "\xc2\xa0",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x000000a0 => "\xff",
      0x000000a1 => "\xad",
      0x000000a2 => "\x9b",
      0x000000a3 => "\x9c",
      0x000000a5 => "\x9d",
      0x000000aa => "\xa6",
      0x000000ab => "\xae",
      0x000000ac => "\xaa",
      0x000000b0 => "\xf8",
      0x000000b1 => "\xf1",
      0x000000b2 => "\xfd",
      0x000000b5 => "\xe6",
      0x000000b7 => "\xfa",
      0x000000ba => "\xa7",
      0x000000bb => "\xaf",
      0x000000bc => "\xac",
      0x000000bd => "\xab",
      0x000000bf => "\xa8",
      0x000000c4 => "\x8e",
      0x000000c5 => "\x8f",
      0x000000c6 => "\x92",
      0x000000c7 => "\x80",
      0x000000c9 => "\x90",
      0x000000d1 => "\xa5",
      0x000000d6 => "\x99",
      0x000000dc => "\x9a",
      0x000000df => "\xe1",
      0x000000e0 => "\x85",
      0x000000e1 => "\xa0",
      0x000000e2 => "\x83",
      0x000000e4 => "\x84",
      0x000000e5 => "\x86",
      0x000000e6 => "\x91",
      0x000000e7 => "\x87",
      0x000000e8 => "\x8a",
      0x000000e9 => "\x82",
      0x000000ea => "\x88",
      0x000000eb => "\x89",
      0x000000ec => "\x8d",
      0x000000ed => "\xa1",
      0x000000ee => "\x8c",
      0x000000ef => "\x8b",
      0x000000f1 => "\xa4",
      0x000000f2 => "\x95",
      0x000000f3 => "\xa2",
      0x000000f4 => "\x93",
      0x000000f6 => "\x94",
      0x000000f7 => "\xf6",
      0x000000f9 => "\x97",
      0x000000fa => "\xa3",
      0x000000fb => "\x96",
      0x000000fc => "\x81",
      0x000000ff => "\x98",
      0x00000192 => "\x9f",
      0x00000393 => "\xe2",
      0x00000398 => "\xe9",
      0x000003a3 => "\xe4",
      0x000003a6 => "\xe8",
      0x000003a9 => "\xea",
      0x000003b1 => "\xe0",
      0x000003b4 => "\xeb",
      0x000003b5 => "\xee",
      0x000003c0 => "\xe3",
      0x000003c3 => "\xe5",
      0x000003c4 => "\xe7",
      0x000003c6 => "\xed",
      0x0000207f => "\xfc",
      0x000020a7 => "\x9e",
      0x00002219 => "\xf9",
      0x0000221a => "\xfb",
      0x0000221e => "\xec",
      0x00002229 => "\xef",
      0x00002248 => "\xf7",
      0x00002261 => "\xf0",
      0x00002264 => "\xf3",
      0x00002265 => "\xf2",
      0x00002310 => "\xa9",
      0x00002320 => "\xf4",
      0x00002321 => "\xf5",
      0x00002500 => "\xc4",
      0x00002502 => "\xb3",
      0x0000250c => "\xda",
      0x00002510 => "\xbf",
      0x00002514 => "\xc0",
      0x00002518 => "\xd9",
      0x0000251c => "\xc3",
      0x00002524 => "\xb4",
      0x0000252c => "\xc2",
      0x00002534 => "\xc1",
      0x0000253c => "\xc5",
      0x00002550 => "\xcd",
      0x00002551 => "\xba",
      0x00002552 => "\xd5",
      0x00002553 => "\xd6",
      0x00002554 => "\xc9",
      0x00002555 => "\xb8",
      0x00002556 => "\xb7",
      0x00002557 => "\xbb",
      0x00002558 => "\xd4",
      0x00002559 => "\xd3",
      0x0000255a => "\xc8",
      0x0000255b => "\xbe",
      0x0000255c => "\xbd",
      0x0000255d => "\xbc",
      0x0000255e => "\xc6",
      0x0000255f => "\xc7",
      0x00002560 => "\xcc",
      0x00002561 => "\xb5",
      0x00002562 => "\xb6",
      0x00002563 => "\xb9",
      0x00002564 => "\xd1",
      0x00002565 => "\xd2",
      0x00002566 => "\xcb",
      0x00002567 => "\xcf",
      0x00002568 => "\xd0",
      0x00002569 => "\xca",
      0x0000256a => "\xd8",
      0x0000256b => "\xd7",
      0x0000256c => "\xce",
      0x00002580 => "\xdf",
      0x00002584 => "\xdc",
      0x00002588 => "\xdb",
      0x0000258c => "\xdd",
      0x00002590 => "\xde",
      0x00002591 => "\xb0",
      0x00002592 => "\xb1",
      0x00002593 => "\xb2",
      0x000025a0 => "\xfe",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::IBM437 - Conversion routines for IBM437
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for IBM437.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: IBM NLS RM Vol2 SE09-8002-01, March 1990
   alias CP437
   alias 437
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE (DEL)
      80 |  000000C7 | LATIN CAPITAL LETTER C WITH CEDILLA
      81 |  000000FC | LATIN SMALL LETTER U WITH DIAERESIS
      82 |  000000E9 | LATIN SMALL LETTER E WITH ACUTE
      83 |  000000E2 | LATIN SMALL LETTER A WITH CIRCUMFLEX
      84 |  000000E4 | LATIN SMALL LETTER A WITH DIAERESIS
      85 |  000000E0 | LATIN SMALL LETTER A WITH GRAVE
      86 |  000000E5 | LATIN SMALL LETTER A WITH RING ABOVE
      87 |  000000E7 | LATIN SMALL LETTER C WITH CEDILLA
      88 |  000000EA | LATIN SMALL LETTER E WITH CIRCUMFLEX
      89 |  000000EB | LATIN SMALL LETTER E WITH DIAERESIS
      8A |  000000E8 | LATIN SMALL LETTER E WITH GRAVE
      8B |  000000EF | LATIN SMALL LETTER I WITH DIAERESIS
      8C |  000000EE | LATIN SMALL LETTER I WITH CIRCUMFLEX
      8D |  000000EC | LATIN SMALL LETTER I WITH GRAVE
      8E |  000000C4 | LATIN CAPITAL LETTER A WITH DIAERESIS
      8F |  000000C5 | LATIN CAPITAL LETTER A WITH RING ABOVE
      90 |  000000C9 | LATIN CAPITAL LETTER E WITH ACUTE
      91 |  000000E6 | LATIN SMALL LETTER AE
      92 |  000000C6 | LATIN CAPITAL LETTER AE
      93 |  000000F4 | LATIN SMALL LETTER O WITH CIRCUMFLEX
      94 |  000000F6 | LATIN SMALL LETTER O WITH DIAERESIS
      95 |  000000F2 | LATIN SMALL LETTER O WITH GRAVE
      96 |  000000FB | LATIN SMALL LETTER U WITH CIRCUMFLEX
      97 |  000000F9 | LATIN SMALL LETTER U WITH GRAVE
      98 |  000000FF | LATIN SMALL LETTER Y WITH DIAERESIS
      99 |  000000D6 | LATIN CAPITAL LETTER O WITH DIAERESIS
      9A |  000000DC | LATIN CAPITAL LETTER U WITH DIAERESIS
      9B |  000000A2 | CENT SIGN
      9C |  000000A3 | POUND SIGN
      9D |  000000A5 | YEN SIGN
      9E |  000020A7 | PESETA SIGN
      9F |  00000192 | LATIN SMALL LETTER F WITH HOOK
      A0 |  000000E1 | LATIN SMALL LETTER A WITH ACUTE
      A1 |  000000ED | LATIN SMALL LETTER I WITH ACUTE
      A2 |  000000F3 | LATIN SMALL LETTER O WITH ACUTE
      A3 |  000000FA | LATIN SMALL LETTER U WITH ACUTE
      A4 |  000000F1 | LATIN SMALL LETTER N WITH TILDE
      A5 |  000000D1 | LATIN CAPITAL LETTER N WITH TILDE
      A6 |  000000AA | FEMININE ORDINAL INDICATOR
      A7 |  000000BA | MASCULINE ORDINAL INDICATOR
      A8 |  000000BF | INVERTED QUESTION MARK
      A9 |  00002310 | REVERSED NOT SIGN
      AA |  000000AC | NOT SIGN
      AB |  000000BD | VULGAR FRACTION ONE HALF
      AC |  000000BC | VULGAR FRACTION ONE QUARTER
      AD |  000000A1 | INVERTED EXCLAMATION MARK
      AE |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
      AF |  000000BB | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
      B0 |  00002591 | LIGHT SHADE
      B1 |  00002592 | MEDIUM SHADE
      B2 |  00002593 | DARK SHADE
      B3 |  00002502 | BOX DRAWINGS LIGHT VERTICAL
      B4 |  00002524 | BOX DRAWINGS LIGHT VERTICAL AND LEFT
      B5 |  00002561 | BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
      B6 |  00002562 | BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
      B7 |  00002556 | BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
      B8 |  00002555 | BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
      B9 |  00002563 | BOX DRAWINGS DOUBLE VERTICAL AND LEFT
      BA |  00002551 | BOX DRAWINGS DOUBLE VERTICAL
      BB |  00002557 | BOX DRAWINGS DOUBLE DOWN AND LEFT
      BC |  0000255D | BOX DRAWINGS DOUBLE UP AND LEFT
      BD |  0000255C | BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
      BE |  0000255B | BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
      BF |  00002510 | BOX DRAWINGS LIGHT DOWN AND LEFT
      C0 |  00002514 | BOX DRAWINGS LIGHT UP AND RIGHT
      C1 |  00002534 | BOX DRAWINGS LIGHT UP AND HORIZONTAL
      C2 |  0000252C | BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
      C3 |  0000251C | BOX DRAWINGS LIGHT VERTICAL AND RIGHT
      C4 |  00002500 | BOX DRAWINGS LIGHT HORIZONTAL
      C5 |  0000253C | BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
      C6 |  0000255E | BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
      C7 |  0000255F | BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
      C8 |  0000255A | BOX DRAWINGS DOUBLE UP AND RIGHT
      C9 |  00002554 | BOX DRAWINGS DOUBLE DOWN AND RIGHT
      CA |  00002569 | BOX DRAWINGS DOUBLE UP AND HORIZONTAL
      CB |  00002566 | BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
      CC |  00002560 | BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
      CD |  00002550 | BOX DRAWINGS DOUBLE HORIZONTAL
      CE |  0000256C | BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
      CF |  00002567 | BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
      D0 |  00002568 | BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
      D1 |  00002564 | BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
      D2 |  00002565 | BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
      D3 |  00002559 | BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
      D4 |  00002558 | BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
      D5 |  00002552 | BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
      D6 |  00002553 | BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
      D7 |  0000256B | BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
      D8 |  0000256A | BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
      D9 |  00002518 | BOX DRAWINGS LIGHT UP AND LEFT
      DA |  0000250C | BOX DRAWINGS LIGHT DOWN AND RIGHT
      DB |  00002588 | FULL BLOCK
      DC |  00002584 | LOWER HALF BLOCK
      DD |  0000258C | LEFT HALF BLOCK
      DE |  00002590 | RIGHT HALF BLOCK
      DF |  00002580 | UPPER HALF BLOCK
      E0 |  000003B1 | GREEK SMALL LETTER ALPHA
      E1 |  000000DF | LATIN SMALL LETTER SHARP S (German)
      E2 |  00000393 | GREEK CAPITAL LETTER GAMMA
      E3 |  000003C0 | GREEK SMALL LETTER PI
      E4 |  000003A3 | GREEK CAPITAL LETTER SIGMA
      E5 |  000003C3 | GREEK SMALL LETTER SIGMA
      E6 |  000000B5 | MICRO SIGN
      E7 |  000003C4 | GREEK SMALL LETTER TAU
      E8 |  000003A6 | GREEK CAPITAL LETTER PHI
      E9 |  00000398 | GREEK CAPITAL LETTER THETA
      EA |  000003A9 | GREEK CAPITAL LETTER OMEGA
      EB |  000003B4 | GREEK SMALL LETTER DELTA
      EC |  0000221E | INFINITY
      ED |  000003C6 | GREEK SMALL LETTER PHI
      EE |  000003B5 | GREEK SMALL LETTER EPSILON
      EF |  00002229 | INTERSECTION
      F0 |  00002261 | IDENTICAL TO
      F1 |  000000B1 | PLUS-MINUS SIGN
      F2 |  00002265 | GREATER-THAN OR EQUAL TO
      F3 |  00002264 | LESS-THAN OR EQUAL TO
      F4 |  00002320 | TOP HALF INTEGRAL
      F5 |  00002321 | BOTTOM HALF INTEGRAL
      F6 |  000000F7 | DIVISION SIGN
      F7 |  00002248 | ALMOST EQUAL TO
      F8 |  000000B0 | DEGREE SIGN
      F9 |  00002219 | BULLET OPERATOR
      FA |  000000B7 | MIDDLE DOT
      FB |  0000221A | SQUARE ROOT
      FC |  0000207F | SUPERSCRIPT LATIN SMALL LETTER N
      FD |  000000B2 | SUPERSCRIPT TWO
      FE |  000025A0 | BLACK SQUARE
      FF |  000000A0 | NO-BREAK SPACE
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_IBM437

    $main::fatpacked{"Locale/RecodeData/IBM500.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_IBM500';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for IBM500.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::IBM500;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x009c,
      0x0009,
      0x0086,
      0x007f,
      0x0097,
      0x008d,
      0x008e,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x009d,
      0x0085,
      0x0008,
      0x0087,
      0x0018,
      0x0019,
      0x0092,
      0x008f,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0080,
      0x0081,
      0x0082,
      0x0083,
      0x0084,
      0x000a,
      0x0017,
      0x001b,
      0x0088,
      0x0089,
      0x008a,
      0x008b,
      0x008c,
      0x0005,
      0x0006,
      0x0007,
      0x0090,
      0x0091,
      0x0016,
      0x0093,
      0x0094,
      0x0095,
      0x0096,
      0x0004,
      0x0098,
      0x0099,
      0x009a,
      0x009b,
      0x0014,
      0x0015,
      0x009e,
      0x001a,
      0x0020,
      0x00a0,
      0x00e2,
      0x00e4,
      0x00e0,
      0x00e1,
      0x00e3,
      0x00e5,
      0x00e7,
      0x00f1,
      0x005b,
      0x002e,
      0x003c,
      0x0028,
      0x002b,
      0x0021,
      0x0026,
      0x00e9,
      0x00ea,
      0x00eb,
      0x00e8,
      0x00ed,
      0x00ee,
      0x00ef,
      0x00ec,
      0x00df,
      0x005d,
      0x0024,
      0x002a,
      0x0029,
      0x003b,
      0x005e,
      0x002d,
      0x002f,
      0x00c2,
      0x00c4,
      0x00c0,
      0x00c1,
      0x00c3,
      0x00c5,
      0x00c7,
      0x00d1,
      0x00a6,
      0x002c,
      0x0025,
      0x005f,
      0x003e,
      0x003f,
      0x00f8,
      0x00c9,
      0x00ca,
      0x00cb,
      0x00c8,
      0x00cd,
      0x00ce,
      0x00cf,
      0x00cc,
      0x0060,
      0x003a,
      0x0023,
      0x0040,
      0x0027,
      0x003d,
      0x0022,
      0x00d8,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x00ab,
      0x00bb,
      0x00f0,
      0x00fd,
      0x00fe,
      0x00b1,
      0x00b0,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x00aa,
      0x00ba,
      0x00e6,
      0x00b8,
      0x00c6,
      0x00a4,
      0x00b5,
      0x007e,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x00a1,
      0x00bf,
      0x00d0,
      0x00dd,
      0x00de,
      0x00ae,
      0x00a2,
      0x00a3,
      0x00a5,
      0x00b7,
      0x00a9,
      0x00a7,
      0x00b6,
      0x00bc,
      0x00bd,
      0x00be,
      0x00ac,
      0x007c,
      0x00af,
      0x00a8,
      0x00b4,
      0x00d7,
      0x007b,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x00ad,
      0x00f4,
      0x00f6,
      0x00f2,
      0x00f3,
      0x00f5,
      0x007d,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x00b9,
      0x00fb,
      0x00fc,
      0x00f9,
      0x00fa,
      0x00ff,
      0x005c,
      0x00f7,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x00b2,
      0x00d4,
      0x00d6,
      0x00d2,
      0x00d3,
      0x00d5,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x00b3,
      0x00db,
      0x00dc,
      0x00d9,
      0x00da,
      0x009f,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\xc2\x9c",
      "\x09",
      "\xc2\x86",
      "\x7f",
      "\xc2\x97",
      "\xc2\x8d",
      "\xc2\x8e",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\xc2\x9d",
      "\xc2\x85",
      "\x08",
      "\xc2\x87",
      "\x18",
      "\x19",
      "\xc2\x92",
      "\xc2\x8f",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\xc2\x80",
      "\xc2\x81",
      "\xc2\x82",
      "\xc2\x83",
      "\xc2\x84",
      "\x0a",
      "\x17",
      "\x1b",
      "\xc2\x88",
      "\xc2\x89",
      "\xc2\x8a",
      "\xc2\x8b",
      "\xc2\x8c",
      "\x05",
      "\x06",
      "\x07",
      "\xc2\x90",
      "\xc2\x91",
      "\x16",
      "\xc2\x93",
      "\xc2\x94",
      "\xc2\x95",
      "\xc2\x96",
      "\x04",
      "\xc2\x98",
      "\xc2\x99",
      "\xc2\x9a",
      "\xc2\x9b",
      "\x14",
      "\x15",
      "\xc2\x9e",
      "\x1a",
      "\x20",
      "\xc2\xa0",
      "\xc3\xa2",
      "\xc3\xa4",
      "\xc3\xa0",
      "\xc3\xa1",
      "\xc3\xa3",
      "\xc3\xa5",
      "\xc3\xa7",
      "\xc3\xb1",
      "\x5b",
      "\x2e",
      "\x3c",
      "\x28",
      "\x2b",
      "\x21",
      "\x26",
      "\xc3\xa9",
      "\xc3\xaa",
      "\xc3\xab",
      "\xc3\xa8",
      "\xc3\xad",
      "\xc3\xae",
      "\xc3\xaf",
      "\xc3\xac",
      "\xc3\x9f",
      "\x5d",
      "\x24",
      "\x2a",
      "\x29",
      "\x3b",
      "\x5e",
      "\x2d",
      "\x2f",
      "\xc3\x82",
      "\xc3\x84",
      "\xc3\x80",
      "\xc3\x81",
      "\xc3\x83",
      "\xc3\x85",
      "\xc3\x87",
      "\xc3\x91",
      "\xc2\xa6",
      "\x2c",
      "\x25",
      "\x5f",
      "\x3e",
      "\x3f",
      "\xc3\xb8",
      "\xc3\x89",
      "\xc3\x8a",
      "\xc3\x8b",
      "\xc3\x88",
      "\xc3\x8d",
      "\xc3\x8e",
      "\xc3\x8f",
      "\xc3\x8c",
      "\x60",
      "\x3a",
      "\x23",
      "\x40",
      "\x27",
      "\x3d",
      "\x22",
      "\xc3\x98",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\xc2\xab",
      "\xc2\xbb",
      "\xc3\xb0",
      "\xc3\xbd",
      "\xc3\xbe",
      "\xc2\xb1",
      "\xc2\xb0",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\xc2\xaa",
      "\xc2\xba",
      "\xc3\xa6",
      "\xc2\xb8",
      "\xc3\x86",
      "\xc2\xa4",
      "\xc2\xb5",
      "\x7e",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\xc2\xa1",
      "\xc2\xbf",
      "\xc3\x90",
      "\xc3\x9d",
      "\xc3\x9e",
      "\xc2\xae",
      "\xc2\xa2",
      "\xc2\xa3",
      "\xc2\xa5",
      "\xc2\xb7",
      "\xc2\xa9",
      "\xc2\xa7",
      "\xc2\xb6",
      "\xc2\xbc",
      "\xc2\xbd",
      "\xc2\xbe",
      "\xc2\xac",
      "\x7c",
      "\xc2\xaf",
      "\xc2\xa8",
      "\xc2\xb4",
      "\xc3\x97",
      "\x7b",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\xc2\xad",
      "\xc3\xb4",
      "\xc3\xb6",
      "\xc3\xb2",
      "\xc3\xb3",
      "\xc3\xb5",
      "\x7d",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\xc2\xb9",
      "\xc3\xbb",
      "\xc3\xbc",
      "\xc3\xb9",
      "\xc3\xba",
      "\xc3\xbf",
      "\x5c",
      "\xc3\xb7",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\xc2\xb2",
      "\xc3\x94",
      "\xc3\x96",
      "\xc3\x92",
      "\xc3\x93",
      "\xc3\x95",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\xc2\xb3",
      "\xc3\x9b",
      "\xc3\x9c",
      "\xc3\x99",
      "\xc3\x9a",
      "\xc2\x9f",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x37",
      0x00000005 => "\x2d",
      0x00000006 => "\x2e",
      0x00000007 => "\x2f",
      0x00000008 => "\x16",
      0x00000009 => "\x05",
      0x0000000a => "\x25",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x3c",
      0x00000015 => "\x3d",
      0x00000016 => "\x32",
      0x00000017 => "\x26",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x3f",
      0x0000001b => "\x27",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x40",
      0x00000021 => "\x4f",
      0x00000022 => "\x7f",
      0x00000023 => "\x7b",
      0x00000024 => "\x5b",
      0x00000025 => "\x6c",
      0x00000026 => "\x50",
      0x00000027 => "\x7d",
      0x00000028 => "\x4d",
      0x00000029 => "\x5d",
      0x0000002a => "\x5c",
      0x0000002b => "\x4e",
      0x0000002c => "\x6b",
      0x0000002d => "\x60",
      0x0000002e => "\x4b",
      0x0000002f => "\x61",
      0x00000030 => "\xf0",
      0x00000031 => "\xf1",
      0x00000032 => "\xf2",
      0x00000033 => "\xf3",
      0x00000034 => "\xf4",
      0x00000035 => "\xf5",
      0x00000036 => "\xf6",
      0x00000037 => "\xf7",
      0x00000038 => "\xf8",
      0x00000039 => "\xf9",
      0x0000003a => "\x7a",
      0x0000003b => "\x5e",
      0x0000003c => "\x4c",
      0x0000003d => "\x7e",
      0x0000003e => "\x6e",
      0x0000003f => "\x6f",
      0x00000040 => "\x7c",
      0x00000041 => "\xc1",
      0x00000042 => "\xc2",
      0x00000043 => "\xc3",
      0x00000044 => "\xc4",
      0x00000045 => "\xc5",
      0x00000046 => "\xc6",
      0x00000047 => "\xc7",
      0x00000048 => "\xc8",
      0x00000049 => "\xc9",
      0x0000004a => "\xd1",
      0x0000004b => "\xd2",
      0x0000004c => "\xd3",
      0x0000004d => "\xd4",
      0x0000004e => "\xd5",
      0x0000004f => "\xd6",
      0x00000050 => "\xd7",
      0x00000051 => "\xd8",
      0x00000052 => "\xd9",
      0x00000053 => "\xe2",
      0x00000054 => "\xe3",
      0x00000055 => "\xe4",
      0x00000056 => "\xe5",
      0x00000057 => "\xe6",
      0x00000058 => "\xe7",
      0x00000059 => "\xe8",
      0x0000005a => "\xe9",
      0x0000005b => "\x4a",
      0x0000005c => "\xe0",
      0x0000005d => "\x5a",
      0x0000005e => "\x5f",
      0x0000005f => "\x6d",
      0x00000060 => "\x79",
      0x00000061 => "\x81",
      0x00000062 => "\x82",
      0x00000063 => "\x83",
      0x00000064 => "\x84",
      0x00000065 => "\x85",
      0x00000066 => "\x86",
      0x00000067 => "\x87",
      0x00000068 => "\x88",
      0x00000069 => "\x89",
      0x0000006a => "\x91",
      0x0000006b => "\x92",
      0x0000006c => "\x93",
      0x0000006d => "\x94",
      0x0000006e => "\x95",
      0x0000006f => "\x96",
      0x00000070 => "\x97",
      0x00000071 => "\x98",
      0x00000072 => "\x99",
      0x00000073 => "\xa2",
      0x00000074 => "\xa3",
      0x00000075 => "\xa4",
      0x00000076 => "\xa5",
      0x00000077 => "\xa6",
      0x00000078 => "\xa7",
      0x00000079 => "\xa8",
      0x0000007a => "\xa9",
      0x0000007b => "\xc0",
      0x0000007c => "\xbb",
      0x0000007d => "\xd0",
      0x0000007e => "\xa1",
      0x0000007f => "\x07",
      0x00000080 => "\x20",
      0x00000081 => "\x21",
      0x00000082 => "\x22",
      0x00000083 => "\x23",
      0x00000084 => "\x24",
      0x00000085 => "\x15",
      0x00000086 => "\x06",
      0x00000087 => "\x17",
      0x00000088 => "\x28",
      0x00000089 => "\x29",
      0x0000008a => "\x2a",
      0x0000008b => "\x2b",
      0x0000008c => "\x2c",
      0x0000008d => "\x09",
      0x0000008e => "\x0a",
      0x0000008f => "\x1b",
      0x00000090 => "\x30",
      0x00000091 => "\x31",
      0x00000092 => "\x1a",
      0x00000093 => "\x33",
      0x00000094 => "\x34",
      0x00000095 => "\x35",
      0x00000096 => "\x36",
      0x00000097 => "\x08",
      0x00000098 => "\x38",
      0x00000099 => "\x39",
      0x0000009a => "\x3a",
      0x0000009b => "\x3b",
      0x0000009c => "\x04",
      0x0000009d => "\x14",
      0x0000009e => "\x3e",
      0x0000009f => "\xff",
      0x000000a0 => "\x41",
      0x000000a1 => "\xaa",
      0x000000a2 => "\xb0",
      0x000000a3 => "\xb1",
      0x000000a4 => "\x9f",
      0x000000a5 => "\xb2",
      0x000000a6 => "\x6a",
      0x000000a7 => "\xb5",
      0x000000a8 => "\xbd",
      0x000000a9 => "\xb4",
      0x000000aa => "\x9a",
      0x000000ab => "\x8a",
      0x000000ac => "\xba",
      0x000000ad => "\xca",
      0x000000ae => "\xaf",
      0x000000af => "\xbc",
      0x000000b0 => "\x90",
      0x000000b1 => "\x8f",
      0x000000b2 => "\xea",
      0x000000b3 => "\xfa",
      0x000000b4 => "\xbe",
      0x000000b5 => "\xa0",
      0x000000b6 => "\xb6",
      0x000000b7 => "\xb3",
      0x000000b8 => "\x9d",
      0x000000b9 => "\xda",
      0x000000ba => "\x9b",
      0x000000bb => "\x8b",
      0x000000bc => "\xb7",
      0x000000bd => "\xb8",
      0x000000be => "\xb9",
      0x000000bf => "\xab",
      0x000000c0 => "\x64",
      0x000000c1 => "\x65",
      0x000000c2 => "\x62",
      0x000000c3 => "\x66",
      0x000000c4 => "\x63",
      0x000000c5 => "\x67",
      0x000000c6 => "\x9e",
      0x000000c7 => "\x68",
      0x000000c8 => "\x74",
      0x000000c9 => "\x71",
      0x000000ca => "\x72",
      0x000000cb => "\x73",
      0x000000cc => "\x78",
      0x000000cd => "\x75",
      0x000000ce => "\x76",
      0x000000cf => "\x77",
      0x000000d0 => "\xac",
      0x000000d1 => "\x69",
      0x000000d2 => "\xed",
      0x000000d3 => "\xee",
      0x000000d4 => "\xeb",
      0x000000d5 => "\xef",
      0x000000d6 => "\xec",
      0x000000d7 => "\xbf",
      0x000000d8 => "\x80",
      0x000000d9 => "\xfd",
      0x000000da => "\xfe",
      0x000000db => "\xfb",
      0x000000dc => "\xfc",
      0x000000dd => "\xad",
      0x000000de => "\xae",
      0x000000df => "\x59",
      0x000000e0 => "\x44",
      0x000000e1 => "\x45",
      0x000000e2 => "\x42",
      0x000000e3 => "\x46",
      0x000000e4 => "\x43",
      0x000000e5 => "\x47",
      0x000000e6 => "\x9c",
      0x000000e7 => "\x48",
      0x000000e8 => "\x54",
      0x000000e9 => "\x51",
      0x000000ea => "\x52",
      0x000000eb => "\x53",
      0x000000ec => "\x58",
      0x000000ed => "\x55",
      0x000000ee => "\x56",
      0x000000ef => "\x57",
      0x000000f0 => "\x8c",
      0x000000f1 => "\x49",
      0x000000f2 => "\xcd",
      0x000000f3 => "\xce",
      0x000000f4 => "\xcb",
      0x000000f5 => "\xcf",
      0x000000f6 => "\xcc",
      0x000000f7 => "\xe1",
      0x000000f8 => "\x70",
      0x000000f9 => "\xdd",
      0x000000fa => "\xde",
      0x000000fb => "\xdb",
      0x000000fc => "\xdc",
      0x000000fd => "\x8d",
      0x000000fe => "\x8e",
      0x000000ff => "\xdf",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x6f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::IBM500 - Conversion routines for IBM500
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for IBM500.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: IBM NLS RM Vol2 SE09-8002-01, March 1990
   alias CP500
   alias 500
   alias 500V1
   alias EBCDIC-CP-BE
   alias EBCDIC-CP-CH
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  0000009C | STRING TERMINATOR (ST)
      05 |  00000009 | CHARACTER TABULATION (HT)
      06 |  00000086 | START OF SELECTED AREA (SSA)
      07 |  0000007F | DELETE (DEL)
      08 |  00000097 | END OF GUARDED AREA (EPA)
      09 |  0000008D | REVERSE LINE FEED (RI)
      0A |  0000008E | SINGLE-SHIFT TWO (SS2)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  0000009D | OPERATING SYSTEM COMMAND (OSC)
      15 |  00000085 | NEXT LINE (NEL)
      16 |  00000008 | BACKSPACE (BS)
      17 |  00000087 | END OF SELECTED AREA (ESA)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  00000092 | PRIVATE USE TWO (PU2)
      1B |  0000008F | SINGLE-SHIFT THREE (SS3)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000080 | PADDING CHARACTER (PAD)
      21 |  00000081 | HIGH OCTET PRESET (HOP)
      22 |  00000082 | BREAK PERMITTED HERE (BPH)
      23 |  00000083 | NO BREAK HERE (NBH)
      24 |  00000084 | INDEX (IND)
      25 |  0000000A | LINE FEED (LF)
      26 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      27 |  0000001B | ESCAPE (ESC)
      28 |  00000088 | CHARACTER TABULATION SET (HTS)
      29 |  00000089 | CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
      2A |  0000008A | LINE TABULATION SET (VTS)
      2B |  0000008B | PARTIAL LINE FORWARD (PLD)
      2C |  0000008C | PARTIAL LINE BACKWARD (PLU)
      2D |  00000005 | ENQUIRY (ENQ)
      2E |  00000006 | ACKNOWLEDGE (ACK)
      2F |  00000007 | BELL (BEL)
      30 |  00000090 | DEVICE CONTROL STRING (DCS)
      31 |  00000091 | PRIVATE USE ONE (PU1)
      32 |  00000016 | SYNCHRONOUS IDLE (SYN)
      33 |  00000093 | SET TRANSMIT STATE (STS)
      34 |  00000094 | CANCEL CHARACTER (CCH)
      35 |  00000095 | MESSAGE WAITING (MW)
      36 |  00000096 | START OF GUARDED AREA (SPA)
      37 |  00000004 | END OF TRANSMISSION (EOT)
      38 |  00000098 | START OF STRING (SOS)
      39 |  00000099 | SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
      3A |  0000009A | SINGLE CHARACTER INTRODUCER (SCI)
      3B |  0000009B | CONTROL SEQUENCE INTRODUCER (CSI)
      3C |  00000014 | DEVICE CONTROL FOUR (DC4)
      3D |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      3E |  0000009E | PRIVACY MESSAGE (PM)
      3F |  0000001A | SUBSTITUTE (SUB)
      40 |  00000020 | SPACE
      41 |  000000A0 | NO-BREAK SPACE
      42 |  000000E2 | LATIN SMALL LETTER A WITH CIRCUMFLEX
      43 |  000000E4 | LATIN SMALL LETTER A WITH DIAERESIS
      44 |  000000E0 | LATIN SMALL LETTER A WITH GRAVE
      45 |  000000E1 | LATIN SMALL LETTER A WITH ACUTE
      46 |  000000E3 | LATIN SMALL LETTER A WITH TILDE
      47 |  000000E5 | LATIN SMALL LETTER A WITH RING ABOVE
      48 |  000000E7 | LATIN SMALL LETTER C WITH CEDILLA
      49 |  000000F1 | LATIN SMALL LETTER N WITH TILDE
      4A |  0000005B | LEFT SQUARE BRACKET
      4B |  0000002E | FULL STOP
      4C |  0000003C | LESS-THAN SIGN
      4D |  00000028 | LEFT PARENTHESIS
      4E |  0000002B | PLUS SIGN
      4F |  00000021 | EXCLAMATION MARK
      50 |  00000026 | AMPERSAND
      51 |  000000E9 | LATIN SMALL LETTER E WITH ACUTE
      52 |  000000EA | LATIN SMALL LETTER E WITH CIRCUMFLEX
      53 |  000000EB | LATIN SMALL LETTER E WITH DIAERESIS
      54 |  000000E8 | LATIN SMALL LETTER E WITH GRAVE
      55 |  000000ED | LATIN SMALL LETTER I WITH ACUTE
      56 |  000000EE | LATIN SMALL LETTER I WITH CIRCUMFLEX
      57 |  000000EF | LATIN SMALL LETTER I WITH DIAERESIS
      58 |  000000EC | LATIN SMALL LETTER I WITH GRAVE
      59 |  000000DF | LATIN SMALL LETTER SHARP S (German)
      5A |  0000005D | RIGHT SQUARE BRACKET
      5B |  00000024 | DOLLAR SIGN
      5C |  0000002A | ASTERISK
      5D |  00000029 | RIGHT PARENTHESIS
      5E |  0000003B | SEMICOLON
      5F |  0000005E | CIRCUMFLEX ACCENT
      60 |  0000002D | HYPHEN-MINUS
      61 |  0000002F | SOLIDUS
      62 |  000000C2 | LATIN CAPITAL LETTER A WITH CIRCUMFLEX
      63 |  000000C4 | LATIN CAPITAL LETTER A WITH DIAERESIS
      64 |  000000C0 | LATIN CAPITAL LETTER A WITH GRAVE
      65 |  000000C1 | LATIN CAPITAL LETTER A WITH ACUTE
      66 |  000000C3 | LATIN CAPITAL LETTER A WITH TILDE
      67 |  000000C5 | LATIN CAPITAL LETTER A WITH RING ABOVE
      68 |  000000C7 | LATIN CAPITAL LETTER C WITH CEDILLA
      69 |  000000D1 | LATIN CAPITAL LETTER N WITH TILDE
      6A |  000000A6 | BROKEN BAR
      6B |  0000002C | COMMA
      6C |  00000025 | PERCENT SIGN
      6D |  0000005F | LOW LINE
      6E |  0000003E | GREATER-THAN SIGN
      6F |  0000003F | QUESTION MARK
      70 |  000000F8 | LATIN SMALL LETTER O WITH STROKE
      71 |  000000C9 | LATIN CAPITAL LETTER E WITH ACUTE
      72 |  000000CA | LATIN CAPITAL LETTER E WITH CIRCUMFLEX
      73 |  000000CB | LATIN CAPITAL LETTER E WITH DIAERESIS
      74 |  000000C8 | LATIN CAPITAL LETTER E WITH GRAVE
      75 |  000000CD | LATIN CAPITAL LETTER I WITH ACUTE
      76 |  000000CE | LATIN CAPITAL LETTER I WITH CIRCUMFLEX
      77 |  000000CF | LATIN CAPITAL LETTER I WITH DIAERESIS
      78 |  000000CC | LATIN CAPITAL LETTER I WITH GRAVE
      79 |  00000060 | GRAVE ACCENT
      7A |  0000003A | COLON
      7B |  00000023 | NUMBER SIGN
      7C |  00000040 | COMMERCIAL AT
      7D |  00000027 | APOSTROPHE
      7E |  0000003D | EQUALS SIGN
      7F |  00000022 | QUOTATION MARK
      80 |  000000D8 | LATIN CAPITAL LETTER O WITH STROKE
      81 |  00000061 | LATIN SMALL LETTER A
      82 |  00000062 | LATIN SMALL LETTER B
      83 |  00000063 | LATIN SMALL LETTER C
      84 |  00000064 | LATIN SMALL LETTER D
      85 |  00000065 | LATIN SMALL LETTER E
      86 |  00000066 | LATIN SMALL LETTER F
      87 |  00000067 | LATIN SMALL LETTER G
      88 |  00000068 | LATIN SMALL LETTER H
      89 |  00000069 | LATIN SMALL LETTER I
      8A |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
      8B |  000000BB | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
      8C |  000000F0 | LATIN SMALL LETTER ETH (Icelandic)
      8D |  000000FD | LATIN SMALL LETTER Y WITH ACUTE
      8E |  000000FE | LATIN SMALL LETTER THORN (Icelandic)
      8F |  000000B1 | PLUS-MINUS SIGN
      90 |  000000B0 | DEGREE SIGN
      91 |  0000006A | LATIN SMALL LETTER J
      92 |  0000006B | LATIN SMALL LETTER K
      93 |  0000006C | LATIN SMALL LETTER L
      94 |  0000006D | LATIN SMALL LETTER M
      95 |  0000006E | LATIN SMALL LETTER N
      96 |  0000006F | LATIN SMALL LETTER O
      97 |  00000070 | LATIN SMALL LETTER P
      98 |  00000071 | LATIN SMALL LETTER Q
      99 |  00000072 | LATIN SMALL LETTER R
      9A |  000000AA | FEMININE ORDINAL INDICATOR
      9B |  000000BA | MASCULINE ORDINAL INDICATOR
      9C |  000000E6 | LATIN SMALL LETTER AE
      9D |  000000B8 | CEDILLA
      9E |  000000C6 | LATIN CAPITAL LETTER AE
      9F |  000000A4 | CURRENCY SIGN
      A0 |  000000B5 | MICRO SIGN
      A1 |  0000007E | TILDE
      A2 |  00000073 | LATIN SMALL LETTER S
      A3 |  00000074 | LATIN SMALL LETTER T
      A4 |  00000075 | LATIN SMALL LETTER U
      A5 |  00000076 | LATIN SMALL LETTER V
      A6 |  00000077 | LATIN SMALL LETTER W
      A7 |  00000078 | LATIN SMALL LETTER X
      A8 |  00000079 | LATIN SMALL LETTER Y
      A9 |  0000007A | LATIN SMALL LETTER Z
      AA |  000000A1 | INVERTED EXCLAMATION MARK
      AB |  000000BF | INVERTED QUESTION MARK
      AC |  000000D0 | LATIN CAPITAL LETTER ETH (Icelandic)
      AD |  000000DD | LATIN CAPITAL LETTER Y WITH ACUTE
      AE |  000000DE | LATIN CAPITAL LETTER THORN (Icelandic)
      AF |  000000AE | REGISTERED SIGN
      B0 |  000000A2 | CENT SIGN
      B1 |  000000A3 | POUND SIGN
      B2 |  000000A5 | YEN SIGN
      B3 |  000000B7 | MIDDLE DOT
      B4 |  000000A9 | COPYRIGHT SIGN
      B5 |  000000A7 | SECTION SIGN
      B6 |  000000B6 | PILCROW SIGN
      B7 |  000000BC | VULGAR FRACTION ONE QUARTER
      B8 |  000000BD | VULGAR FRACTION ONE HALF
      B9 |  000000BE | VULGAR FRACTION THREE QUARTERS
      BA |  000000AC | NOT SIGN
      BB |  0000007C | VERTICAL LINE
      BC |  000000AF | MACRON
      BD |  000000A8 | DIAERESIS
      BE |  000000B4 | ACUTE ACCENT
      BF |  000000D7 | MULTIPLICATION SIGN
      C0 |  0000007B | LEFT CURLY BRACKET
      C1 |  00000041 | LATIN CAPITAL LETTER A
      C2 |  00000042 | LATIN CAPITAL LETTER B
      C3 |  00000043 | LATIN CAPITAL LETTER C
      C4 |  00000044 | LATIN CAPITAL LETTER D
      C5 |  00000045 | LATIN CAPITAL LETTER E
      C6 |  00000046 | LATIN CAPITAL LETTER F
      C7 |  00000047 | LATIN CAPITAL LETTER G
      C8 |  00000048 | LATIN CAPITAL LETTER H
      C9 |  00000049 | LATIN CAPITAL LETTER I
      CA |  000000AD | SOFT HYPHEN
      CB |  000000F4 | LATIN SMALL LETTER O WITH CIRCUMFLEX
      CC |  000000F6 | LATIN SMALL LETTER O WITH DIAERESIS
      CD |  000000F2 | LATIN SMALL LETTER O WITH GRAVE
      CE |  000000F3 | LATIN SMALL LETTER O WITH ACUTE
      CF |  000000F5 | LATIN SMALL LETTER O WITH TILDE
      D0 |  0000007D | RIGHT CURLY BRACKET
      D1 |  0000004A | LATIN CAPITAL LETTER J
      D2 |  0000004B | LATIN CAPITAL LETTER K
      D3 |  0000004C | LATIN CAPITAL LETTER L
      D4 |  0000004D | LATIN CAPITAL LETTER M
      D5 |  0000004E | LATIN CAPITAL LETTER N
      D6 |  0000004F | LATIN CAPITAL LETTER O
      D7 |  00000050 | LATIN CAPITAL LETTER P
      D8 |  00000051 | LATIN CAPITAL LETTER Q
      D9 |  00000052 | LATIN CAPITAL LETTER R
      DA |  000000B9 | SUPERSCRIPT ONE
      DB |  000000FB | LATIN SMALL LETTER U WITH CIRCUMFLEX
      DC |  000000FC | LATIN SMALL LETTER U WITH DIAERESIS
      DD |  000000F9 | LATIN SMALL LETTER U WITH GRAVE
      DE |  000000FA | LATIN SMALL LETTER U WITH ACUTE
      DF |  000000FF | LATIN SMALL LETTER Y WITH DIAERESIS
      E0 |  0000005C | REVERSE SOLIDUS
      E1 |  000000F7 | DIVISION SIGN
      E2 |  00000053 | LATIN CAPITAL LETTER S
      E3 |  00000054 | LATIN CAPITAL LETTER T
      E4 |  00000055 | LATIN CAPITAL LETTER U
      E5 |  00000056 | LATIN CAPITAL LETTER V
      E6 |  00000057 | LATIN CAPITAL LETTER W
      E7 |  00000058 | LATIN CAPITAL LETTER X
      E8 |  00000059 | LATIN CAPITAL LETTER Y
      E9 |  0000005A | LATIN CAPITAL LETTER Z
      EA |  000000B2 | SUPERSCRIPT TWO
      EB |  000000D4 | LATIN CAPITAL LETTER O WITH CIRCUMFLEX
      EC |  000000D6 | LATIN CAPITAL LETTER O WITH DIAERESIS
      ED |  000000D2 | LATIN CAPITAL LETTER O WITH GRAVE
      EE |  000000D3 | LATIN CAPITAL LETTER O WITH ACUTE
      EF |  000000D5 | LATIN CAPITAL LETTER O WITH TILDE
      F0 |  00000030 | DIGIT ZERO
      F1 |  00000031 | DIGIT ONE
      F2 |  00000032 | DIGIT TWO
      F3 |  00000033 | DIGIT THREE
      F4 |  00000034 | DIGIT FOUR
      F5 |  00000035 | DIGIT FIVE
      F6 |  00000036 | DIGIT SIX
      F7 |  00000037 | DIGIT SEVEN
      F8 |  00000038 | DIGIT EIGHT
      F9 |  00000039 | DIGIT NINE
      FA |  000000B3 | SUPERSCRIPT THREE
      FB |  000000DB | LATIN CAPITAL LETTER U WITH CIRCUMFLEX
      FC |  000000DC | LATIN CAPITAL LETTER U WITH DIAERESIS
      FD |  000000D9 | LATIN CAPITAL LETTER U WITH GRAVE
      FE |  000000DA | LATIN CAPITAL LETTER U WITH ACUTE
      FF |  0000009F | APPLICATION PROGRAM COMMAND (APC)
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_IBM500

    $main::fatpacked{"Locale/RecodeData/IBM850.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_IBM850';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for IBM850.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::IBM850;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0x00c7,
      0x00fc,
      0x00e9,
      0x00e2,
      0x00e4,
      0x00e0,
      0x00e5,
      0x00e7,
      0x00ea,
      0x00eb,
      0x00e8,
      0x00ef,
      0x00ee,
      0x00ec,
      0x00c4,
      0x00c5,
      0x00c9,
      0x00e6,
      0x00c6,
      0x00f4,
      0x00f6,
      0x00f2,
      0x00fb,
      0x00f9,
      0x00ff,
      0x00d6,
      0x00dc,
      0x00f8,
      0x00a3,
      0x00d8,
      0x00d7,
      0x0192,
      0x00e1,
      0x00ed,
      0x00f3,
      0x00fa,
      0x00f1,
      0x00d1,
      0x00aa,
      0x00ba,
      0x00bf,
      0x00ae,
      0x00ac,
      0x00bd,
      0x00bc,
      0x00a1,
      0x00ab,
      0x00bb,
      0x2591,
      0x2592,
      0x2593,
      0x2502,
      0x2524,
      0x00c1,
      0x00c2,
      0x00c0,
      0x00a9,
      0x2563,
      0x2551,
      0x2557,
      0x255d,
      0x00a2,
      0x00a5,
      0x2510,
      0x2514,
      0x2534,
      0x252c,
      0x251c,
      0x2500,
      0x253c,
      0x00e3,
      0x00c3,
      0x255a,
      0x2554,
      0x2569,
      0x2566,
      0x2560,
      0x2550,
      0x256c,
      0x00a4,
      0x00f0,
      0x00d0,
      0x00ca,
      0x00cb,
      0x00c8,
      0x0131,
      0x00cd,
      0x00ce,
      0x00cf,
      0x2518,
      0x250c,
      0x2588,
      0x2584,
      0x00a6,
      0x00cc,
      0x2580,
      0x00d3,
      0x00df,
      0x00d4,
      0x00d2,
      0x00f5,
      0x00d5,
      0x00b5,
      0x00fe,
      0x00de,
      0x00da,
      0x00db,
      0x00d9,
      0x00fd,
      0x00dd,
      0x00af,
      0x00b4,
      0x00ad,
      0x00b1,
      0x2017,
      0x00be,
      0x00b6,
      0x00a7,
      0x00f7,
      0x00b8,
      0x00b0,
      0x00a8,
      0x00b7,
      0x00b9,
      0x00b3,
      0x00b2,
      0x25a0,
      0x00a0,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xc3\x87",
      "\xc3\xbc",
      "\xc3\xa9",
      "\xc3\xa2",
      "\xc3\xa4",
      "\xc3\xa0",
      "\xc3\xa5",
      "\xc3\xa7",
      "\xc3\xaa",
      "\xc3\xab",
      "\xc3\xa8",
      "\xc3\xaf",
      "\xc3\xae",
      "\xc3\xac",
      "\xc3\x84",
      "\xc3\x85",
      "\xc3\x89",
      "\xc3\xa6",
      "\xc3\x86",
      "\xc3\xb4",
      "\xc3\xb6",
      "\xc3\xb2",
      "\xc3\xbb",
      "\xc3\xb9",
      "\xc3\xbf",
      "\xc3\x96",
      "\xc3\x9c",
      "\xc3\xb8",
      "\xc2\xa3",
      "\xc3\x98",
      "\xc3\x97",
      "\xc6\x92",
      "\xc3\xa1",
      "\xc3\xad",
      "\xc3\xb3",
      "\xc3\xba",
      "\xc3\xb1",
      "\xc3\x91",
      "\xc2\xaa",
      "\xc2\xba",
      "\xc2\xbf",
      "\xc2\xae",
      "\xc2\xac",
      "\xc2\xbd",
      "\xc2\xbc",
      "\xc2\xa1",
      "\xc2\xab",
      "\xc2\xbb",
      "\xe2\x96\x91",
      "\xe2\x96\x92",
      "\xe2\x96\x93",
      "\xe2\x94\x82",
      "\xe2\x94\xa4",
      "\xc3\x81",
      "\xc3\x82",
      "\xc3\x80",
      "\xc2\xa9",
      "\xe2\x95\xa3",
      "\xe2\x95\x91",
      "\xe2\x95\x97",
      "\xe2\x95\x9d",
      "\xc2\xa2",
      "\xc2\xa5",
      "\xe2\x94\x90",
      "\xe2\x94\x94",
      "\xe2\x94\xb4",
      "\xe2\x94\xac",
      "\xe2\x94\x9c",
      "\xe2\x94\x80",
      "\xe2\x94\xbc",
      "\xc3\xa3",
      "\xc3\x83",
      "\xe2\x95\x9a",
      "\xe2\x95\x94",
      "\xe2\x95\xa9",
      "\xe2\x95\xa6",
      "\xe2\x95\xa0",
      "\xe2\x95\x90",
      "\xe2\x95\xac",
      "\xc2\xa4",
      "\xc3\xb0",
      "\xc3\x90",
      "\xc3\x8a",
      "\xc3\x8b",
      "\xc3\x88",
      "\xc4\xb1",
      "\xc3\x8d",
      "\xc3\x8e",
      "\xc3\x8f",
      "\xe2\x94\x98",
      "\xe2\x94\x8c",
      "\xe2\x96\x88",
      "\xe2\x96\x84",
      "\xc2\xa6",
      "\xc3\x8c",
      "\xe2\x96\x80",
      "\xc3\x93",
      "\xc3\x9f",
      "\xc3\x94",
      "\xc3\x92",
      "\xc3\xb5",
      "\xc3\x95",
      "\xc2\xb5",
      "\xc3\xbe",
      "\xc3\x9e",
      "\xc3\x9a",
      "\xc3\x9b",
      "\xc3\x99",
      "\xc3\xbd",
      "\xc3\x9d",
      "\xc2\xaf",
      "\xc2\xb4",
      "\xc2\xad",
      "\xc2\xb1",
      "\xe2\x80\x97",
      "\xc2\xbe",
      "\xc2\xb6",
      "\xc2\xa7",
      "\xc3\xb7",
      "\xc2\xb8",
      "\xc2\xb0",
      "\xc2\xa8",
      "\xc2\xb7",
      "\xc2\xb9",
      "\xc2\xb3",
      "\xc2\xb2",
      "\xe2\x96\xa0",
      "\xc2\xa0",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x000000a0 => "\xff",
      0x000000a1 => "\xad",
      0x000000a2 => "\xbd",
      0x000000a3 => "\x9c",
      0x000000a4 => "\xcf",
      0x000000a5 => "\xbe",
      0x000000a6 => "\xdd",
      0x000000a7 => "\xf5",
      0x000000a8 => "\xf9",
      0x000000a9 => "\xb8",
      0x000000aa => "\xa6",
      0x000000ab => "\xae",
      0x000000ac => "\xaa",
      0x000000ad => "\xf0",
      0x000000ae => "\xa9",
      0x000000af => "\xee",
      0x000000b0 => "\xf8",
      0x000000b1 => "\xf1",
      0x000000b2 => "\xfd",
      0x000000b3 => "\xfc",
      0x000000b4 => "\xef",
      0x000000b5 => "\xe6",
      0x000000b6 => "\xf4",
      0x000000b7 => "\xfa",
      0x000000b8 => "\xf7",
      0x000000b9 => "\xfb",
      0x000000ba => "\xa7",
      0x000000bb => "\xaf",
      0x000000bc => "\xac",
      0x000000bd => "\xab",
      0x000000be => "\xf3",
      0x000000bf => "\xa8",
      0x000000c0 => "\xb7",
      0x000000c1 => "\xb5",
      0x000000c2 => "\xb6",
      0x000000c3 => "\xc7",
      0x000000c4 => "\x8e",
      0x000000c5 => "\x8f",
      0x000000c6 => "\x92",
      0x000000c7 => "\x80",
      0x000000c8 => "\xd4",
      0x000000c9 => "\x90",
      0x000000ca => "\xd2",
      0x000000cb => "\xd3",
      0x000000cc => "\xde",
      0x000000cd => "\xd6",
      0x000000ce => "\xd7",
      0x000000cf => "\xd8",
      0x000000d0 => "\xd1",
      0x000000d1 => "\xa5",
      0x000000d2 => "\xe3",
      0x000000d3 => "\xe0",
      0x000000d4 => "\xe2",
      0x000000d5 => "\xe5",
      0x000000d6 => "\x99",
      0x000000d7 => "\x9e",
      0x000000d8 => "\x9d",
      0x000000d9 => "\xeb",
      0x000000da => "\xe9",
      0x000000db => "\xea",
      0x000000dc => "\x9a",
      0x000000dd => "\xed",
      0x000000de => "\xe8",
      0x000000df => "\xe1",
      0x000000e0 => "\x85",
      0x000000e1 => "\xa0",
      0x000000e2 => "\x83",
      0x000000e3 => "\xc6",
      0x000000e4 => "\x84",
      0x000000e5 => "\x86",
      0x000000e6 => "\x91",
      0x000000e7 => "\x87",
      0x000000e8 => "\x8a",
      0x000000e9 => "\x82",
      0x000000ea => "\x88",
      0x000000eb => "\x89",
      0x000000ec => "\x8d",
      0x000000ed => "\xa1",
      0x000000ee => "\x8c",
      0x000000ef => "\x8b",
      0x000000f0 => "\xd0",
      0x000000f1 => "\xa4",
      0x000000f2 => "\x95",
      0x000000f3 => "\xa2",
      0x000000f4 => "\x93",
      0x000000f5 => "\xe4",
      0x000000f6 => "\x94",
      0x000000f7 => "\xf6",
      0x000000f8 => "\x9b",
      0x000000f9 => "\x97",
      0x000000fa => "\xa3",
      0x000000fb => "\x96",
      0x000000fc => "\x81",
      0x000000fd => "\xec",
      0x000000fe => "\xe7",
      0x000000ff => "\x98",
      0x00000131 => "\xd5",
      0x00000192 => "\x9f",
      0x00002017 => "\xf2",
      0x00002500 => "\xc4",
      0x00002502 => "\xb3",
      0x0000250c => "\xda",
      0x00002510 => "\xbf",
      0x00002514 => "\xc0",
      0x00002518 => "\xd9",
      0x0000251c => "\xc3",
      0x00002524 => "\xb4",
      0x0000252c => "\xc2",
      0x00002534 => "\xc1",
      0x0000253c => "\xc5",
      0x00002550 => "\xcd",
      0x00002551 => "\xba",
      0x00002554 => "\xc9",
      0x00002557 => "\xbb",
      0x0000255a => "\xc8",
      0x0000255d => "\xbc",
      0x00002560 => "\xcc",
      0x00002563 => "\xb9",
      0x00002566 => "\xcb",
      0x00002569 => "\xca",
      0x0000256c => "\xce",
      0x00002580 => "\xdf",
      0x00002584 => "\xdc",
      0x00002588 => "\xdb",
      0x00002591 => "\xb0",
      0x00002592 => "\xb1",
      0x00002593 => "\xb2",
      0x000025a0 => "\xfe",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::IBM850 - Conversion routines for IBM850
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for IBM850.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: IBM NLS RM Vol2 SE09-8002-01, March 1990
    source: UNICODE 1.0
   alias CP850
   alias 850
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE (DEL)
      80 |  000000C7 | LATIN CAPITAL LETTER C WITH CEDILLA
      81 |  000000FC | LATIN SMALL LETTER U WITH DIAERESIS
      82 |  000000E9 | LATIN SMALL LETTER E WITH ACUTE
      83 |  000000E2 | LATIN SMALL LETTER A WITH CIRCUMFLEX
      84 |  000000E4 | LATIN SMALL LETTER A WITH DIAERESIS
      85 |  000000E0 | LATIN SMALL LETTER A WITH GRAVE
      86 |  000000E5 | LATIN SMALL LETTER A WITH RING ABOVE
      87 |  000000E7 | LATIN SMALL LETTER C WITH CEDILLA
      88 |  000000EA | LATIN SMALL LETTER E WITH CIRCUMFLEX
      89 |  000000EB | LATIN SMALL LETTER E WITH DIAERESIS
      8A |  000000E8 | LATIN SMALL LETTER E WITH GRAVE
      8B |  000000EF | LATIN SMALL LETTER I WITH DIAERESIS
      8C |  000000EE | LATIN SMALL LETTER I WITH CIRCUMFLEX
      8D |  000000EC | LATIN SMALL LETTER I WITH GRAVE
      8E |  000000C4 | LATIN CAPITAL LETTER A WITH DIAERESIS
      8F |  000000C5 | LATIN CAPITAL LETTER A WITH RING ABOVE
      90 |  000000C9 | LATIN CAPITAL LETTER E WITH ACUTE
      91 |  000000E6 | LATIN SMALL LETTER AE
      92 |  000000C6 | LATIN CAPITAL LETTER AE
      93 |  000000F4 | LATIN SMALL LETTER O WITH CIRCUMFLEX
      94 |  000000F6 | LATIN SMALL LETTER O WITH DIAERESIS
      95 |  000000F2 | LATIN SMALL LETTER O WITH GRAVE
      96 |  000000FB | LATIN SMALL LETTER U WITH CIRCUMFLEX
      97 |  000000F9 | LATIN SMALL LETTER U WITH GRAVE
      98 |  000000FF | LATIN SMALL LETTER Y WITH DIAERESIS
      99 |  000000D6 | LATIN CAPITAL LETTER O WITH DIAERESIS
      9A |  000000DC | LATIN CAPITAL LETTER U WITH DIAERESIS
      9B |  000000F8 | LATIN SMALL LETTER O WITH STROKE
      9C |  000000A3 | POUND SIGN
      9D |  000000D8 | LATIN CAPITAL LETTER O WITH STROKE
      9E |  000000D7 | MULTIPLICATION SIGN
      9F |  00000192 | LATIN SMALL LETTER F WITH HOOK
      A0 |  000000E1 | LATIN SMALL LETTER A WITH ACUTE
      A1 |  000000ED | LATIN SMALL LETTER I WITH ACUTE
      A2 |  000000F3 | LATIN SMALL LETTER O WITH ACUTE
      A3 |  000000FA | LATIN SMALL LETTER U WITH ACUTE
      A4 |  000000F1 | LATIN SMALL LETTER N WITH TILDE
      A5 |  000000D1 | LATIN CAPITAL LETTER N WITH TILDE
      A6 |  000000AA | FEMININE ORDINAL INDICATOR
      A7 |  000000BA | MASCULINE ORDINAL INDICATOR
      A8 |  000000BF | INVERTED QUESTION MARK
      A9 |  000000AE | REGISTERED SIGN
      AA |  000000AC | NOT SIGN
      AB |  000000BD | VULGAR FRACTION ONE HALF
      AC |  000000BC | VULGAR FRACTION ONE QUARTER
      AD |  000000A1 | INVERTED EXCLAMATION MARK
      AE |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
      AF |  000000BB | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
      B0 |  00002591 | LIGHT SHADE
      B1 |  00002592 | MEDIUM SHADE
      B2 |  00002593 | DARK SHADE
      B3 |  00002502 | BOX DRAWINGS LIGHT VERTICAL
      B4 |  00002524 | BOX DRAWINGS LIGHT VERTICAL AND LEFT
      B5 |  000000C1 | LATIN CAPITAL LETTER A WITH ACUTE
      B6 |  000000C2 | LATIN CAPITAL LETTER A WITH CIRCUMFLEX
      B7 |  000000C0 | LATIN CAPITAL LETTER A WITH GRAVE
      B8 |  000000A9 | COPYRIGHT SIGN
      B9 |  00002563 | BOX DRAWINGS DOUBLE VERTICAL AND LEFT
      BA |  00002551 | BOX DRAWINGS DOUBLE VERTICAL
      BB |  00002557 | BOX DRAWINGS DOUBLE DOWN AND LEFT
      BC |  0000255D | BOX DRAWINGS DOUBLE UP AND LEFT
      BD |  000000A2 | CENT SIGN
      BE |  000000A5 | YEN SIGN
      BF |  00002510 | BOX DRAWINGS LIGHT DOWN AND LEFT
      C0 |  00002514 | BOX DRAWINGS LIGHT UP AND RIGHT
      C1 |  00002534 | BOX DRAWINGS LIGHT UP AND HORIZONTAL
      C2 |  0000252C | BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
      C3 |  0000251C | BOX DRAWINGS LIGHT VERTICAL AND RIGHT
      C4 |  00002500 | BOX DRAWINGS LIGHT HORIZONTAL
      C5 |  0000253C | BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
      C6 |  000000E3 | LATIN SMALL LETTER A WITH TILDE
      C7 |  000000C3 | LATIN CAPITAL LETTER A WITH TILDE
      C8 |  0000255A | BOX DRAWINGS DOUBLE UP AND RIGHT
      C9 |  00002554 | BOX DRAWINGS DOUBLE DOWN AND RIGHT
      CA |  00002569 | BOX DRAWINGS DOUBLE UP AND HORIZONTAL
      CB |  00002566 | BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
      CC |  00002560 | BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
      CD |  00002550 | BOX DRAWINGS DOUBLE HORIZONTAL
      CE |  0000256C | BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
      CF |  000000A4 | CURRENCY SIGN
      D0 |  000000F0 | LATIN SMALL LETTER ETH (Icelandic)
      D1 |  000000D0 | LATIN CAPITAL LETTER ETH (Icelandic)
      D2 |  000000CA | LATIN CAPITAL LETTER E WITH CIRCUMFLEX
      D3 |  000000CB | LATIN CAPITAL LETTER E WITH DIAERESIS
      D4 |  000000C8 | LATIN CAPITAL LETTER E WITH GRAVE
      D5 |  00000131 | LATIN SMALL LETTER DOTLESS I
      D6 |  000000CD | LATIN CAPITAL LETTER I WITH ACUTE
      D7 |  000000CE | LATIN CAPITAL LETTER I WITH CIRCUMFLEX
      D8 |  000000CF | LATIN CAPITAL LETTER I WITH DIAERESIS
      D9 |  00002518 | BOX DRAWINGS LIGHT UP AND LEFT
      DA |  0000250C | BOX DRAWINGS LIGHT DOWN AND RIGHT
      DB |  00002588 | FULL BLOCK
      DC |  00002584 | LOWER HALF BLOCK
      DD |  000000A6 | BROKEN BAR
      DE |  000000CC | LATIN CAPITAL LETTER I WITH GRAVE
      DF |  00002580 | UPPER HALF BLOCK
      E0 |  000000D3 | LATIN CAPITAL LETTER O WITH ACUTE
      E1 |  000000DF | LATIN SMALL LETTER SHARP S (German)
      E2 |  000000D4 | LATIN CAPITAL LETTER O WITH CIRCUMFLEX
      E3 |  000000D2 | LATIN CAPITAL LETTER O WITH GRAVE
      E4 |  000000F5 | LATIN SMALL LETTER O WITH TILDE
      E5 |  000000D5 | LATIN CAPITAL LETTER O WITH TILDE
      E6 |  000000B5 | MICRO SIGN
      E7 |  000000FE | LATIN SMALL LETTER THORN (Icelandic)
      E8 |  000000DE | LATIN CAPITAL LETTER THORN (Icelandic)
      E9 |  000000DA | LATIN CAPITAL LETTER U WITH ACUTE
      EA |  000000DB | LATIN CAPITAL LETTER U WITH CIRCUMFLEX
      EB |  000000D9 | LATIN CAPITAL LETTER U WITH GRAVE
      EC |  000000FD | LATIN SMALL LETTER Y WITH ACUTE
      ED |  000000DD | LATIN CAPITAL LETTER Y WITH ACUTE
      EE |  000000AF | MACRON
      EF |  000000B4 | ACUTE ACCENT
      F0 |  000000AD | SOFT HYPHEN
      F1 |  000000B1 | PLUS-MINUS SIGN
      F2 |  00002017 | DOUBLE LOW LINE
      F3 |  000000BE | VULGAR FRACTION THREE QUARTERS
      F4 |  000000B6 | PILCROW SIGN
      F5 |  000000A7 | SECTION SIGN
      F6 |  000000F7 | DIVISION SIGN
      F7 |  000000B8 | CEDILLA
      F8 |  000000B0 | DEGREE SIGN
      F9 |  000000A8 | DIAERESIS
      FA |  000000B7 | MIDDLE DOT
      FB |  000000B9 | SUPERSCRIPT ONE
      FC |  000000B3 | SUPERSCRIPT THREE
      FD |  000000B2 | SUPERSCRIPT TWO
      FE |  000025A0 | BLACK SQUARE
      FF |  000000A0 | NO-BREAK SPACE
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_IBM850

    $main::fatpacked{"Locale/RecodeData/IBM851.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_IBM851';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for IBM851.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::IBM851;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0x00c7,
      0x00fc,
      0x00e9,
      0x00e2,
      0x00e4,
      0x00e0,
      0x0386,
      0x00e7,
      0x00ea,
      0x00eb,
      0x00e8,
      0x00ef,
      0x00ee,
      0x0388,
      0x00c4,
      0x0389,
      0x038a,
      0xfffd,
      0x038c,
      0x00f4,
      0x00f6,
      0x038e,
      0x00fb,
      0x00f9,
      0x038f,
      0x00d6,
      0x00dc,
      0x03ac,
      0x00a3,
      0x03ad,
      0x03ae,
      0x03af,
      0x03ca,
      0x0390,
      0x03cc,
      0x03cd,
      0x0391,
      0x0392,
      0x0393,
      0x0394,
      0x0395,
      0x0396,
      0x0397,
      0x00bd,
      0x0398,
      0x0399,
      0x00ab,
      0x00bb,
      0x2591,
      0x2592,
      0x2593,
      0x2502,
      0x2524,
      0x039a,
      0x039b,
      0x039d,
      0x039c,
      0x2563,
      0x2551,
      0x2557,
      0x255d,
      0x039e,
      0x039f,
      0x2510,
      0x2514,
      0x2534,
      0x252c,
      0x251c,
      0x2500,
      0x253c,
      0x03a0,
      0x03a1,
      0x255a,
      0x2554,
      0x2569,
      0x2566,
      0x2560,
      0x2550,
      0x256c,
      0x03a3,
      0x03a4,
      0x03a5,
      0x03a6,
      0x03a7,
      0x03a8,
      0x03a9,
      0x03b1,
      0x03b2,
      0x03b3,
      0x2518,
      0x250c,
      0x2588,
      0x2584,
      0x03b4,
      0x03b5,
      0x2580,
      0x03b6,
      0x03b7,
      0x03b8,
      0x03b9,
      0x03ba,
      0x03bb,
      0x03bc,
      0x03bd,
      0x03be,
      0x03bf,
      0x03c0,
      0x03c1,
      0x03c3,
      0x03c2,
      0x03c4,
      0x00b4,
      0x00ad,
      0x00b1,
      0x03c5,
      0x03c6,
      0x03c7,
      0x00a7,
      0x03c8,
      0x02db,
      0x00b0,
      0x00a8,
      0x03c9,
      0x03cb,
      0x03b0,
      0x03ce,
      0x25a0,
      0x00a0,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xc3\x87",
      "\xc3\xbc",
      "\xc3\xa9",
      "\xc3\xa2",
      "\xc3\xa4",
      "\xc3\xa0",
      "\xce\x86",
      "\xc3\xa7",
      "\xc3\xaa",
      "\xc3\xab",
      "\xc3\xa8",
      "\xc3\xaf",
      "\xc3\xae",
      "\xce\x88",
      "\xc3\x84",
      "\xce\x89",
      "\xce\x8a",
      "\xef\xbf\xbd",
      "\xce\x8c",
      "\xc3\xb4",
      "\xc3\xb6",
      "\xce\x8e",
      "\xc3\xbb",
      "\xc3\xb9",
      "\xce\x8f",
      "\xc3\x96",
      "\xc3\x9c",
      "\xce\xac",
      "\xc2\xa3",
      "\xce\xad",
      "\xce\xae",
      "\xce\xaf",
      "\xcf\x8a",
      "\xce\x90",
      "\xcf\x8c",
      "\xcf\x8d",
      "\xce\x91",
      "\xce\x92",
      "\xce\x93",
      "\xce\x94",
      "\xce\x95",
      "\xce\x96",
      "\xce\x97",
      "\xc2\xbd",
      "\xce\x98",
      "\xce\x99",
      "\xc2\xab",
      "\xc2\xbb",
      "\xe2\x96\x91",
      "\xe2\x96\x92",
      "\xe2\x96\x93",
      "\xe2\x94\x82",
      "\xe2\x94\xa4",
      "\xce\x9a",
      "\xce\x9b",
      "\xce\x9d",
      "\xce\x9c",
      "\xe2\x95\xa3",
      "\xe2\x95\x91",
      "\xe2\x95\x97",
      "\xe2\x95\x9d",
      "\xce\x9e",
      "\xce\x9f",
      "\xe2\x94\x90",
      "\xe2\x94\x94",
      "\xe2\x94\xb4",
      "\xe2\x94\xac",
      "\xe2\x94\x9c",
      "\xe2\x94\x80",
      "\xe2\x94\xbc",
      "\xce\xa0",
      "\xce\xa1",
      "\xe2\x95\x9a",
      "\xe2\x95\x94",
      "\xe2\x95\xa9",
      "\xe2\x95\xa6",
      "\xe2\x95\xa0",
      "\xe2\x95\x90",
      "\xe2\x95\xac",
      "\xce\xa3",
      "\xce\xa4",
      "\xce\xa5",
      "\xce\xa6",
      "\xce\xa7",
      "\xce\xa8",
      "\xce\xa9",
      "\xce\xb1",
      "\xce\xb2",
      "\xce\xb3",
      "\xe2\x94\x98",
      "\xe2\x94\x8c",
      "\xe2\x96\x88",
      "\xe2\x96\x84",
      "\xce\xb4",
      "\xce\xb5",
      "\xe2\x96\x80",
      "\xce\xb6",
      "\xce\xb7",
      "\xce\xb8",
      "\xce\xb9",
      "\xce\xba",
      "\xce\xbb",
      "\xce\xbc",
      "\xce\xbd",
      "\xce\xbe",
      "\xce\xbf",
      "\xcf\x80",
      "\xcf\x81",
      "\xcf\x83",
      "\xcf\x82",
      "\xcf\x84",
      "\xc2\xb4",
      "\xc2\xad",
      "\xc2\xb1",
      "\xcf\x85",
      "\xcf\x86",
      "\xcf\x87",
      "\xc2\xa7",
      "\xcf\x88",
      "\xcb\x9b",
      "\xc2\xb0",
      "\xc2\xa8",
      "\xcf\x89",
      "\xcf\x8b",
      "\xce\xb0",
      "\xcf\x8e",
      "\xe2\x96\xa0",
      "\xc2\xa0",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x000000a0 => "\xff",
      0x000000a3 => "\x9c",
      0x000000a7 => "\xf5",
      0x000000a8 => "\xf9",
      0x000000ab => "\xae",
      0x000000ad => "\xf0",
      0x000000b0 => "\xf8",
      0x000000b1 => "\xf1",
      0x000000b4 => "\xef",
      0x000000bb => "\xaf",
      0x000000bd => "\xab",
      0x000000c4 => "\x8e",
      0x000000c7 => "\x80",
      0x000000d6 => "\x99",
      0x000000dc => "\x9a",
      0x000000e0 => "\x85",
      0x000000e2 => "\x83",
      0x000000e4 => "\x84",
      0x000000e7 => "\x87",
      0x000000e8 => "\x8a",
      0x000000e9 => "\x82",
      0x000000ea => "\x88",
      0x000000eb => "\x89",
      0x000000ee => "\x8c",
      0x000000ef => "\x8b",
      0x000000f4 => "\x93",
      0x000000f6 => "\x94",
      0x000000f9 => "\x97",
      0x000000fb => "\x96",
      0x000000fc => "\x81",
      0x000002db => "\xf7",
      0x00000386 => "\x86",
      0x00000388 => "\x8d",
      0x00000389 => "\x8f",
      0x0000038a => "\x90",
      0x0000038c => "\x92",
      0x0000038e => "\x95",
      0x0000038f => "\x98",
      0x00000390 => "\xa1",
      0x00000391 => "\xa4",
      0x00000392 => "\xa5",
      0x00000393 => "\xa6",
      0x00000394 => "\xa7",
      0x00000395 => "\xa8",
      0x00000396 => "\xa9",
      0x00000397 => "\xaa",
      0x00000398 => "\xac",
      0x00000399 => "\xad",
      0x0000039a => "\xb5",
      0x0000039b => "\xb6",
      0x0000039c => "\xb8",
      0x0000039d => "\xb7",
      0x0000039e => "\xbd",
      0x0000039f => "\xbe",
      0x000003a0 => "\xc6",
      0x000003a1 => "\xc7",
      0x000003a3 => "\xcf",
      0x000003a4 => "\xd0",
      0x000003a5 => "\xd1",
      0x000003a6 => "\xd2",
      0x000003a7 => "\xd3",
      0x000003a8 => "\xd4",
      0x000003a9 => "\xd5",
      0x000003ac => "\x9b",
      0x000003ad => "\x9d",
      0x000003ae => "\x9e",
      0x000003af => "\x9f",
      0x000003b0 => "\xfc",
      0x000003b1 => "\xd6",
      0x000003b2 => "\xd7",
      0x000003b3 => "\xd8",
      0x000003b4 => "\xdd",
      0x000003b5 => "\xde",
      0x000003b6 => "\xe0",
      0x000003b7 => "\xe1",
      0x000003b8 => "\xe2",
      0x000003b9 => "\xe3",
      0x000003ba => "\xe4",
      0x000003bb => "\xe5",
      0x000003bc => "\xe6",
      0x000003bd => "\xe7",
      0x000003be => "\xe8",
      0x000003bf => "\xe9",
      0x000003c0 => "\xea",
      0x000003c1 => "\xeb",
      0x000003c2 => "\xed",
      0x000003c3 => "\xec",
      0x000003c4 => "\xee",
      0x000003c5 => "\xf2",
      0x000003c6 => "\xf3",
      0x000003c7 => "\xf4",
      0x000003c8 => "\xf6",
      0x000003c9 => "\xfa",
      0x000003ca => "\xa0",
      0x000003cb => "\xfb",
      0x000003cc => "\xa2",
      0x000003cd => "\xa3",
      0x000003ce => "\xfd",
      0x00002500 => "\xc4",
      0x00002502 => "\xb3",
      0x0000250c => "\xda",
      0x00002510 => "\xbf",
      0x00002514 => "\xc0",
      0x00002518 => "\xd9",
      0x0000251c => "\xc3",
      0x00002524 => "\xb4",
      0x0000252c => "\xc2",
      0x00002534 => "\xc1",
      0x0000253c => "\xc5",
      0x00002550 => "\xcd",
      0x00002551 => "\xba",
      0x00002554 => "\xc9",
      0x00002557 => "\xbb",
      0x0000255a => "\xc8",
      0x0000255d => "\xbc",
      0x00002560 => "\xcc",
      0x00002563 => "\xb9",
      0x00002566 => "\xcb",
      0x00002569 => "\xca",
      0x0000256c => "\xce",
      0x00002580 => "\xdf",
      0x00002584 => "\xdc",
      0x00002588 => "\xdb",
      0x00002591 => "\xb0",
      0x00002592 => "\xb1",
      0x00002593 => "\xb2",
      0x000025a0 => "\xfe",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::IBM851 - Conversion routines for IBM851
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for IBM851.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: IBM NLS RM Vol2 SE09-8002-01, March 1990
   alias CP851
   alias 851
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE (DEL)
      80 |  000000C7 | LATIN CAPITAL LETTER C WITH CEDILLA
      81 |  000000FC | LATIN SMALL LETTER U WITH DIAERESIS
      82 |  000000E9 | LATIN SMALL LETTER E WITH ACUTE
      83 |  000000E2 | LATIN SMALL LETTER A WITH CIRCUMFLEX
      84 |  000000E4 | LATIN SMALL LETTER A WITH DIAERESIS
      85 |  000000E0 | LATIN SMALL LETTER A WITH GRAVE
      86 |  00000386 | GREEK CAPITAL LETTER ALPHA WITH TONOS
      87 |  000000E7 | LATIN SMALL LETTER C WITH CEDILLA
      88 |  000000EA | LATIN SMALL LETTER E WITH CIRCUMFLEX
      89 |  000000EB | LATIN SMALL LETTER E WITH DIAERESIS
      8A |  000000E8 | LATIN SMALL LETTER E WITH GRAVE
      8B |  000000EF | LATIN SMALL LETTER I WITH DIAERESIS
      8C |  000000EE | LATIN SMALL LETTER I WITH CIRCUMFLEX
      8D |  00000388 | GREEK CAPITAL LETTER EPSILON WITH TONOS
      8E |  000000C4 | LATIN CAPITAL LETTER A WITH DIAERESIS
      8F |  00000389 | GREEK CAPITAL LETTER ETA WITH TONOS
      90 |  0000038A | GREEK CAPITAL LETTER IOTA WITH TONOS
      92 |  0000038C | GREEK CAPITAL LETTER OMICRON WITH TONOS
      93 |  000000F4 | LATIN SMALL LETTER O WITH CIRCUMFLEX
      94 |  000000F6 | LATIN SMALL LETTER O WITH DIAERESIS
      95 |  0000038E | GREEK CAPITAL LETTER UPSILON WITH TONOS
      96 |  000000FB | LATIN SMALL LETTER U WITH CIRCUMFLEX
      97 |  000000F9 | LATIN SMALL LETTER U WITH GRAVE
      98 |  0000038F | GREEK CAPITAL LETTER OMEGA WITH TONOS
      99 |  000000D6 | LATIN CAPITAL LETTER O WITH DIAERESIS
      9A |  000000DC | LATIN CAPITAL LETTER U WITH DIAERESIS
      9B |  000003AC | GREEK SMALL LETTER ALPHA WITH TONOS
      9C |  000000A3 | POUND SIGN
      9D |  000003AD | GREEK SMALL LETTER EPSILON WITH TONOS
      9E |  000003AE | GREEK SMALL LETTER ETA WITH TONOS
      9F |  000003AF | GREEK SMALL LETTER IOTA WITH TONOS
      A0 |  000003CA | GREEK SMALL LETTER IOTA WITH DIALYTIKA
      A1 |  00000390 | GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
      A2 |  000003CC | GREEK SMALL LETTER OMICRON WITH TONOS
      A3 |  000003CD | GREEK SMALL LETTER UPSILON WITH TONOS
      A4 |  00000391 | GREEK CAPITAL LETTER ALPHA
      A5 |  00000392 | GREEK CAPITAL LETTER BETA
      A6 |  00000393 | GREEK CAPITAL LETTER GAMMA
      A7 |  00000394 | GREEK CAPITAL LETTER DELTA
      A8 |  00000395 | GREEK CAPITAL LETTER EPSILON
      A9 |  00000396 | GREEK CAPITAL LETTER ZETA
      AA |  00000397 | GREEK CAPITAL LETTER ETA
      AB |  000000BD | VULGAR FRACTION ONE HALF
      AC |  00000398 | GREEK CAPITAL LETTER THETA
      AD |  00000399 | GREEK CAPITAL LETTER IOTA
      AE |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
      AF |  000000BB | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
      B0 |  00002591 | LIGHT SHADE
      B1 |  00002592 | MEDIUM SHADE
      B2 |  00002593 | DARK SHADE
      B3 |  00002502 | BOX DRAWINGS LIGHT VERTICAL
      B4 |  00002524 | BOX DRAWINGS LIGHT VERTICAL AND LEFT
      B5 |  0000039A | GREEK CAPITAL LETTER KAPPA
      B6 |  0000039B | GREEK CAPITAL LETTER LAMDA
      B7 |  0000039D | GREEK CAPITAL LETTER NU
      B8 |  0000039C | GREEK CAPITAL LETTER MU
      B9 |  00002563 | BOX DRAWINGS DOUBLE VERTICAL AND LEFT
      BA |  00002551 | BOX DRAWINGS DOUBLE VERTICAL
      BB |  00002557 | BOX DRAWINGS DOUBLE DOWN AND LEFT
      BC |  0000255D | BOX DRAWINGS DOUBLE UP AND LEFT
      BD |  0000039E | GREEK CAPITAL LETTER XI
      BE |  0000039F | GREEK CAPITAL LETTER OMICRON
      BF |  00002510 | BOX DRAWINGS LIGHT DOWN AND LEFT
      C0 |  00002514 | BOX DRAWINGS LIGHT UP AND RIGHT
      C1 |  00002534 | BOX DRAWINGS LIGHT UP AND HORIZONTAL
      C2 |  0000252C | BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
      C3 |  0000251C | BOX DRAWINGS LIGHT VERTICAL AND RIGHT
      C4 |  00002500 | BOX DRAWINGS LIGHT HORIZONTAL
      C5 |  0000253C | BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
      C6 |  000003A0 | GREEK CAPITAL LETTER PI
      C7 |  000003A1 | GREEK CAPITAL LETTER RHO
      C8 |  0000255A | BOX DRAWINGS DOUBLE UP AND RIGHT
      C9 |  00002554 | BOX DRAWINGS DOUBLE DOWN AND RIGHT
      CA |  00002569 | BOX DRAWINGS DOUBLE UP AND HORIZONTAL
      CB |  00002566 | BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
      CC |  00002560 | BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
      CD |  00002550 | BOX DRAWINGS DOUBLE HORIZONTAL
      CE |  0000256C | BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
      CF |  000003A3 | GREEK CAPITAL LETTER SIGMA
      D0 |  000003A4 | GREEK CAPITAL LETTER TAU
      D1 |  000003A5 | GREEK CAPITAL LETTER UPSILON
      D2 |  000003A6 | GREEK CAPITAL LETTER PHI
      D3 |  000003A7 | GREEK CAPITAL LETTER CHI
      D4 |  000003A8 | GREEK CAPITAL LETTER PSI
      D5 |  000003A9 | GREEK CAPITAL LETTER OMEGA
      D6 |  000003B1 | GREEK SMALL LETTER ALPHA
      D7 |  000003B2 | GREEK SMALL LETTER BETA
      D8 |  000003B3 | GREEK SMALL LETTER GAMMA
      D9 |  00002518 | BOX DRAWINGS LIGHT UP AND LEFT
      DA |  0000250C | BOX DRAWINGS LIGHT DOWN AND RIGHT
      DB |  00002588 | FULL BLOCK
      DC |  00002584 | LOWER HALF BLOCK
      DD |  000003B4 | GREEK SMALL LETTER DELTA
      DE |  000003B5 | GREEK SMALL LETTER EPSILON
      DF |  00002580 | UPPER HALF BLOCK
      E0 |  000003B6 | GREEK SMALL LETTER ZETA
      E1 |  000003B7 | GREEK SMALL LETTER ETA
      E2 |  000003B8 | GREEK SMALL LETTER THETA
      E3 |  000003B9 | GREEK SMALL LETTER IOTA
      E4 |  000003BA | GREEK SMALL LETTER KAPPA
      E5 |  000003BB | GREEK SMALL LETTER LAMDA
      E6 |  000003BC | GREEK SMALL LETTER MU
      E7 |  000003BD | GREEK SMALL LETTER NU
      E8 |  000003BE | GREEK SMALL LETTER XI
      E9 |  000003BF | GREEK SMALL LETTER OMICRON
      EA |  000003C0 | GREEK SMALL LETTER PI
      EB |  000003C1 | GREEK SMALL LETTER RHO
      EC |  000003C3 | GREEK SMALL LETTER SIGMA
      ED |  000003C2 | GREEK SMALL LETTER FINAL SIGMA
      EE |  000003C4 | GREEK SMALL LETTER TAU
      EF |  000000B4 | ACUTE ACCENT
      F0 |  000000AD | SOFT HYPHEN
      F1 |  000000B1 | PLUS-MINUS SIGN
      F2 |  000003C5 | GREEK SMALL LETTER UPSILON
      F3 |  000003C6 | GREEK SMALL LETTER PHI
      F4 |  000003C7 | GREEK SMALL LETTER CHI
      F5 |  000000A7 | SECTION SIGN
      F6 |  000003C8 | GREEK SMALL LETTER PSI
      F7 |  000002DB | OGONEK
      F8 |  000000B0 | DEGREE SIGN
      F9 |  000000A8 | DIAERESIS
      FA |  000003C9 | GREEK SMALL LETTER OMEGA
      FB |  000003CB | GREEK SMALL LETTER UPSILON WITH DIALYTIKA
      FC |  000003B0 | GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
      FD |  000003CE | GREEK SMALL LETTER OMEGA WITH TONOS
      FE |  000025A0 | BLACK SQUARE
      FF |  000000A0 | NO-BREAK SPACE
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_IBM851

    $main::fatpacked{"Locale/RecodeData/IBM852.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_IBM852';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for IBM852.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::IBM852;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0x00c7,
      0x00fc,
      0x00e9,
      0x00e2,
      0x00e4,
      0x016f,
      0x0107,
      0x00e7,
      0x0142,
      0x00eb,
      0x0150,
      0x0151,
      0x00ee,
      0x0179,
      0x00c4,
      0x0106,
      0x00c9,
      0x0139,
      0x013a,
      0x00f4,
      0x00f6,
      0x013d,
      0x013e,
      0x015a,
      0x015b,
      0x00d6,
      0x00dc,
      0x0164,
      0x0165,
      0x0141,
      0x00d7,
      0x010d,
      0x00e1,
      0x00ed,
      0x00f3,
      0x00fa,
      0x0104,
      0x0105,
      0x017d,
      0x017e,
      0x0118,
      0x0119,
      0x00ac,
      0x017a,
      0x010c,
      0x015f,
      0x00ab,
      0x00bb,
      0x2591,
      0x2592,
      0x2593,
      0x2502,
      0x2524,
      0x00c1,
      0x00c2,
      0x011a,
      0x015e,
      0x2563,
      0x2551,
      0x2557,
      0x255d,
      0x017b,
      0x017c,
      0x2510,
      0x2514,
      0x2534,
      0x252c,
      0x251c,
      0x2500,
      0x253c,
      0x0102,
      0x0103,
      0x255a,
      0x2554,
      0x2569,
      0x2566,
      0x2560,
      0x2550,
      0x256c,
      0x00a4,
      0x0111,
      0x0110,
      0x010e,
      0x00cb,
      0x010f,
      0x0147,
      0x00cd,
      0x00ce,
      0x011b,
      0x2518,
      0x250c,
      0x2588,
      0x2584,
      0x0162,
      0x016e,
      0x2580,
      0x00d3,
      0x00df,
      0x00d4,
      0x0143,
      0x0144,
      0x0148,
      0x0160,
      0x0161,
      0x0154,
      0x00da,
      0x0155,
      0x0170,
      0x00fd,
      0x00dd,
      0x0163,
      0x00b4,
      0x00ad,
      0x02dd,
      0x02db,
      0x02c7,
      0x02d8,
      0x00a7,
      0x00f7,
      0x00b8,
      0x00b0,
      0x00a8,
      0x02d9,
      0x0171,
      0x0158,
      0x0159,
      0x25a0,
      0x00a0,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xc3\x87",
      "\xc3\xbc",
      "\xc3\xa9",
      "\xc3\xa2",
      "\xc3\xa4",
      "\xc5\xaf",
      "\xc4\x87",
      "\xc3\xa7",
      "\xc5\x82",
      "\xc3\xab",
      "\xc5\x90",
      "\xc5\x91",
      "\xc3\xae",
      "\xc5\xb9",
      "\xc3\x84",
      "\xc4\x86",
      "\xc3\x89",
      "\xc4\xb9",
      "\xc4\xba",
      "\xc3\xb4",
      "\xc3\xb6",
      "\xc4\xbd",
      "\xc4\xbe",
      "\xc5\x9a",
      "\xc5\x9b",
      "\xc3\x96",
      "\xc3\x9c",
      "\xc5\xa4",
      "\xc5\xa5",
      "\xc5\x81",
      "\xc3\x97",
      "\xc4\x8d",
      "\xc3\xa1",
      "\xc3\xad",
      "\xc3\xb3",
      "\xc3\xba",
      "\xc4\x84",
      "\xc4\x85",
      "\xc5\xbd",
      "\xc5\xbe",
      "\xc4\x98",
      "\xc4\x99",
      "\xc2\xac",
      "\xc5\xba",
      "\xc4\x8c",
      "\xc5\x9f",
      "\xc2\xab",
      "\xc2\xbb",
      "\xe2\x96\x91",
      "\xe2\x96\x92",
      "\xe2\x96\x93",
      "\xe2\x94\x82",
      "\xe2\x94\xa4",
      "\xc3\x81",
      "\xc3\x82",
      "\xc4\x9a",
      "\xc5\x9e",
      "\xe2\x95\xa3",
      "\xe2\x95\x91",
      "\xe2\x95\x97",
      "\xe2\x95\x9d",
      "\xc5\xbb",
      "\xc5\xbc",
      "\xe2\x94\x90",
      "\xe2\x94\x94",
      "\xe2\x94\xb4",
      "\xe2\x94\xac",
      "\xe2\x94\x9c",
      "\xe2\x94\x80",
      "\xe2\x94\xbc",
      "\xc4\x82",
      "\xc4\x83",
      "\xe2\x95\x9a",
      "\xe2\x95\x94",
      "\xe2\x95\xa9",
      "\xe2\x95\xa6",
      "\xe2\x95\xa0",
      "\xe2\x95\x90",
      "\xe2\x95\xac",
      "\xc2\xa4",
      "\xc4\x91",
      "\xc4\x90",
      "\xc4\x8e",
      "\xc3\x8b",
      "\xc4\x8f",
      "\xc5\x87",
      "\xc3\x8d",
      "\xc3\x8e",
      "\xc4\x9b",
      "\xe2\x94\x98",
      "\xe2\x94\x8c",
      "\xe2\x96\x88",
      "\xe2\x96\x84",
      "\xc5\xa2",
      "\xc5\xae",
      "\xe2\x96\x80",
      "\xc3\x93",
      "\xc3\x9f",
      "\xc3\x94",
      "\xc5\x83",
      "\xc5\x84",
      "\xc5\x88",
      "\xc5\xa0",
      "\xc5\xa1",
      "\xc5\x94",
      "\xc3\x9a",
      "\xc5\x95",
      "\xc5\xb0",
      "\xc3\xbd",
      "\xc3\x9d",
      "\xc5\xa3",
      "\xc2\xb4",
      "\xc2\xad",
      "\xcb\x9d",
      "\xcb\x9b",
      "\xcb\x87",
      "\xcb\x98",
      "\xc2\xa7",
      "\xc3\xb7",
      "\xc2\xb8",
      "\xc2\xb0",
      "\xc2\xa8",
      "\xcb\x99",
      "\xc5\xb1",
      "\xc5\x98",
      "\xc5\x99",
      "\xe2\x96\xa0",
      "\xc2\xa0",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x000000a0 => "\xff",
      0x000000a4 => "\xcf",
      0x000000a7 => "\xf5",
      0x000000a8 => "\xf9",
      0x000000ab => "\xae",
      0x000000ac => "\xaa",
      0x000000ad => "\xf0",
      0x000000b0 => "\xf8",
      0x000000b4 => "\xef",
      0x000000b8 => "\xf7",
      0x000000bb => "\xaf",
      0x000000c1 => "\xb5",
      0x000000c2 => "\xb6",
      0x000000c4 => "\x8e",
      0x000000c7 => "\x80",
      0x000000c9 => "\x90",
      0x000000cb => "\xd3",
      0x000000cd => "\xd6",
      0x000000ce => "\xd7",
      0x000000d3 => "\xe0",
      0x000000d4 => "\xe2",
      0x000000d6 => "\x99",
      0x000000d7 => "\x9e",
      0x000000da => "\xe9",
      0x000000dc => "\x9a",
      0x000000dd => "\xed",
      0x000000df => "\xe1",
      0x000000e1 => "\xa0",
      0x000000e2 => "\x83",
      0x000000e4 => "\x84",
      0x000000e7 => "\x87",
      0x000000e9 => "\x82",
      0x000000eb => "\x89",
      0x000000ed => "\xa1",
      0x000000ee => "\x8c",
      0x000000f3 => "\xa2",
      0x000000f4 => "\x93",
      0x000000f6 => "\x94",
      0x000000f7 => "\xf6",
      0x000000fa => "\xa3",
      0x000000fc => "\x81",
      0x000000fd => "\xec",
      0x00000102 => "\xc6",
      0x00000103 => "\xc7",
      0x00000104 => "\xa4",
      0x00000105 => "\xa5",
      0x00000106 => "\x8f",
      0x00000107 => "\x86",
      0x0000010c => "\xac",
      0x0000010d => "\x9f",
      0x0000010e => "\xd2",
      0x0000010f => "\xd4",
      0x00000110 => "\xd1",
      0x00000111 => "\xd0",
      0x00000118 => "\xa8",
      0x00000119 => "\xa9",
      0x0000011a => "\xb7",
      0x0000011b => "\xd8",
      0x00000139 => "\x91",
      0x0000013a => "\x92",
      0x0000013d => "\x95",
      0x0000013e => "\x96",
      0x00000141 => "\x9d",
      0x00000142 => "\x88",
      0x00000143 => "\xe3",
      0x00000144 => "\xe4",
      0x00000147 => "\xd5",
      0x00000148 => "\xe5",
      0x00000150 => "\x8a",
      0x00000151 => "\x8b",
      0x00000154 => "\xe8",
      0x00000155 => "\xea",
      0x00000158 => "\xfc",
      0x00000159 => "\xfd",
      0x0000015a => "\x97",
      0x0000015b => "\x98",
      0x0000015e => "\xb8",
      0x0000015f => "\xad",
      0x00000160 => "\xe6",
      0x00000161 => "\xe7",
      0x00000162 => "\xdd",
      0x00000163 => "\xee",
      0x00000164 => "\x9b",
      0x00000165 => "\x9c",
      0x0000016e => "\xde",
      0x0000016f => "\x85",
      0x00000170 => "\xeb",
      0x00000171 => "\xfb",
      0x00000179 => "\x8d",
      0x0000017a => "\xab",
      0x0000017b => "\xbd",
      0x0000017c => "\xbe",
      0x0000017d => "\xa6",
      0x0000017e => "\xa7",
      0x000002c7 => "\xf3",
      0x000002d8 => "\xf4",
      0x000002d9 => "\xfa",
      0x000002db => "\xf2",
      0x000002dd => "\xf1",
      0x00002500 => "\xc4",
      0x00002502 => "\xb3",
      0x0000250c => "\xda",
      0x00002510 => "\xbf",
      0x00002514 => "\xc0",
      0x00002518 => "\xd9",
      0x0000251c => "\xc3",
      0x00002524 => "\xb4",
      0x0000252c => "\xc2",
      0x00002534 => "\xc1",
      0x0000253c => "\xc5",
      0x00002550 => "\xcd",
      0x00002551 => "\xba",
      0x00002554 => "\xc9",
      0x00002557 => "\xbb",
      0x0000255a => "\xc8",
      0x0000255d => "\xbc",
      0x00002560 => "\xcc",
      0x00002563 => "\xb9",
      0x00002566 => "\xcb",
      0x00002569 => "\xca",
      0x0000256c => "\xce",
      0x00002580 => "\xdf",
      0x00002584 => "\xdc",
      0x00002588 => "\xdb",
      0x00002591 => "\xb0",
      0x00002592 => "\xb1",
      0x00002593 => "\xb2",
      0x000025a0 => "\xfe",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::IBM852 - Conversion routines for IBM852
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for IBM852.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: IBM NLS RM Vol2 SE09-8002-01, March 1990
   alias CP852
   alias 852
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE (DEL)
      80 |  000000C7 | LATIN CAPITAL LETTER C WITH CEDILLA
      81 |  000000FC | LATIN SMALL LETTER U WITH DIAERESIS
      82 |  000000E9 | LATIN SMALL LETTER E WITH ACUTE
      83 |  000000E2 | LATIN SMALL LETTER A WITH CIRCUMFLEX
      84 |  000000E4 | LATIN SMALL LETTER A WITH DIAERESIS
      85 |  0000016F | LATIN SMALL LETTER U WITH RING ABOVE
      86 |  00000107 | LATIN SMALL LETTER C WITH ACUTE
      87 |  000000E7 | LATIN SMALL LETTER C WITH CEDILLA
      88 |  00000142 | LATIN SMALL LETTER L WITH STROKE
      89 |  000000EB | LATIN SMALL LETTER E WITH DIAERESIS
      8A |  00000150 | LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
      8B |  00000151 | LATIN SMALL LETTER O WITH DOUBLE ACUTE
      8C |  000000EE | LATIN SMALL LETTER I WITH CIRCUMFLEX
      8D |  00000179 | LATIN CAPITAL LETTER Z WITH ACUTE
      8E |  000000C4 | LATIN CAPITAL LETTER A WITH DIAERESIS
      8F |  00000106 | LATIN CAPITAL LETTER C WITH ACUTE
      90 |  000000C9 | LATIN CAPITAL LETTER E WITH ACUTE
      91 |  00000139 | LATIN CAPITAL LETTER L WITH ACUTE
      92 |  0000013A | LATIN SMALL LETTER L WITH ACUTE
      93 |  000000F4 | LATIN SMALL LETTER O WITH CIRCUMFLEX
      94 |  000000F6 | LATIN SMALL LETTER O WITH DIAERESIS
      95 |  0000013D | LATIN CAPITAL LETTER L WITH CARON
      96 |  0000013E | LATIN SMALL LETTER L WITH CARON
      97 |  0000015A | LATIN CAPITAL LETTER S WITH ACUTE
      98 |  0000015B | LATIN SMALL LETTER S WITH ACUTE
      99 |  000000D6 | LATIN CAPITAL LETTER O WITH DIAERESIS
      9A |  000000DC | LATIN CAPITAL LETTER U WITH DIAERESIS
      9B |  00000164 | LATIN CAPITAL LETTER T WITH CARON
      9C |  00000165 | LATIN SMALL LETTER T WITH CARON
      9D |  00000141 | LATIN CAPITAL LETTER L WITH STROKE
      9E |  000000D7 | MULTIPLICATION SIGN
      9F |  0000010D | LATIN SMALL LETTER C WITH CARON
      A0 |  000000E1 | LATIN SMALL LETTER A WITH ACUTE
      A1 |  000000ED | LATIN SMALL LETTER I WITH ACUTE
      A2 |  000000F3 | LATIN SMALL LETTER O WITH ACUTE
      A3 |  000000FA | LATIN SMALL LETTER U WITH ACUTE
      A4 |  00000104 | LATIN CAPITAL LETTER A WITH OGONEK
      A5 |  00000105 | LATIN SMALL LETTER A WITH OGONEK
      A6 |  0000017D | LATIN CAPITAL LETTER Z WITH CARON
      A7 |  0000017E | LATIN SMALL LETTER Z WITH CARON
      A8 |  00000118 | LATIN CAPITAL LETTER E WITH OGONEK
      A9 |  00000119 | LATIN SMALL LETTER E WITH OGONEK
      AA |  000000AC | NOT SIGN
      AB |  0000017A | LATIN SMALL LETTER Z WITH ACUTE
      AC |  0000010C | LATIN CAPITAL LETTER C WITH CARON
      AD |  0000015F | LATIN SMALL LETTER S WITH CEDILLA
      AE |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
      AF |  000000BB | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
      B0 |  00002591 | LIGHT SHADE
      B1 |  00002592 | MEDIUM SHADE
      B2 |  00002593 | DARK SHADE
      B3 |  00002502 | BOX DRAWINGS LIGHT VERTICAL
      B4 |  00002524 | BOX DRAWINGS LIGHT VERTICAL AND LEFT
      B5 |  000000C1 | LATIN CAPITAL LETTER A WITH ACUTE
      B6 |  000000C2 | LATIN CAPITAL LETTER A WITH CIRCUMFLEX
      B7 |  0000011A | LATIN CAPITAL LETTER E WITH CARON
      B8 |  0000015E | LATIN CAPITAL LETTER S WITH CEDILLA
      B9 |  00002563 | BOX DRAWINGS DOUBLE VERTICAL AND LEFT
      BA |  00002551 | BOX DRAWINGS DOUBLE VERTICAL
      BB |  00002557 | BOX DRAWINGS DOUBLE DOWN AND LEFT
      BC |  0000255D | BOX DRAWINGS DOUBLE UP AND LEFT
      BD |  0000017B | LATIN CAPITAL LETTER Z WITH DOT ABOVE
      BE |  0000017C | LATIN SMALL LETTER Z WITH DOT ABOVE
      BF |  00002510 | BOX DRAWINGS LIGHT DOWN AND LEFT
      C0 |  00002514 | BOX DRAWINGS LIGHT UP AND RIGHT
      C1 |  00002534 | BOX DRAWINGS LIGHT UP AND HORIZONTAL
      C2 |  0000252C | BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
      C3 |  0000251C | BOX DRAWINGS LIGHT VERTICAL AND RIGHT
      C4 |  00002500 | BOX DRAWINGS LIGHT HORIZONTAL
      C5 |  0000253C | BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
      C6 |  00000102 | LATIN CAPITAL LETTER A WITH BREVE
      C7 |  00000103 | LATIN SMALL LETTER A WITH BREVE
      C8 |  0000255A | BOX DRAWINGS DOUBLE UP AND RIGHT
      C9 |  00002554 | BOX DRAWINGS DOUBLE DOWN AND RIGHT
      CA |  00002569 | BOX DRAWINGS DOUBLE UP AND HORIZONTAL
      CB |  00002566 | BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
      CC |  00002560 | BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
      CD |  00002550 | BOX DRAWINGS DOUBLE HORIZONTAL
      CE |  0000256C | BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
      CF |  000000A4 | CURRENCY SIGN
      D0 |  00000111 | LATIN SMALL LETTER D WITH STROKE
      D1 |  00000110 | LATIN CAPITAL LETTER D WITH STROKE
      D2 |  0000010E | LATIN CAPITAL LETTER D WITH CARON
      D3 |  000000CB | LATIN CAPITAL LETTER E WITH DIAERESIS
      D4 |  0000010F | LATIN SMALL LETTER D WITH CARON
      D5 |  00000147 | LATIN CAPITAL LETTER N WITH CARON
      D6 |  000000CD | LATIN CAPITAL LETTER I WITH ACUTE
      D7 |  000000CE | LATIN CAPITAL LETTER I WITH CIRCUMFLEX
      D8 |  0000011B | LATIN SMALL LETTER E WITH CARON
      D9 |  00002518 | BOX DRAWINGS LIGHT UP AND LEFT
      DA |  0000250C | BOX DRAWINGS LIGHT DOWN AND RIGHT
      DB |  00002588 | FULL BLOCK
      DC |  00002584 | LOWER HALF BLOCK
      DD |  00000162 | LATIN CAPITAL LETTER T WITH CEDILLA
      DE |  0000016E | LATIN CAPITAL LETTER U WITH RING ABOVE
      DF |  00002580 | UPPER HALF BLOCK
      E0 |  000000D3 | LATIN CAPITAL LETTER O WITH ACUTE
      E1 |  000000DF | LATIN SMALL LETTER SHARP S (German)
      E2 |  000000D4 | LATIN CAPITAL LETTER O WITH CIRCUMFLEX
      E3 |  00000143 | LATIN CAPITAL LETTER N WITH ACUTE
      E4 |  00000144 | LATIN SMALL LETTER N WITH ACUTE
      E5 |  00000148 | LATIN SMALL LETTER N WITH CARON
      E6 |  00000160 | LATIN CAPITAL LETTER S WITH CARON
      E7 |  00000161 | LATIN SMALL LETTER S WITH CARON
      E8 |  00000154 | LATIN CAPITAL LETTER R WITH ACUTE
      E9 |  000000DA | LATIN CAPITAL LETTER U WITH ACUTE
      EA |  00000155 | LATIN SMALL LETTER R WITH ACUTE
      EB |  00000170 | LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
      EC |  000000FD | LATIN SMALL LETTER Y WITH ACUTE
      ED |  000000DD | LATIN CAPITAL LETTER Y WITH ACUTE
      EE |  00000163 | LATIN SMALL LETTER T WITH CEDILLA
      EF |  000000B4 | ACUTE ACCENT
      F0 |  000000AD | SOFT HYPHEN
      F1 |  000002DD | DOUBLE ACUTE ACCENT
      F2 |  000002DB | OGONEK
      F3 |  000002C7 | CARON (Mandarin Chinese third tone)
      F4 |  000002D8 | BREVE
      F5 |  000000A7 | SECTION SIGN
      F6 |  000000F7 | DIVISION SIGN
      F7 |  000000B8 | CEDILLA
      F8 |  000000B0 | DEGREE SIGN
      F9 |  000000A8 | DIAERESIS
      FA |  000002D9 | DOT ABOVE (Mandarin Chinese light tone)
      FB |  00000171 | LATIN SMALL LETTER U WITH DOUBLE ACUTE
      FC |  00000158 | LATIN CAPITAL LETTER R WITH CARON
      FD |  00000159 | LATIN SMALL LETTER R WITH CARON
      FE |  000025A0 | BLACK SQUARE
      FF |  000000A0 | NO-BREAK SPACE
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_IBM852

    $main::fatpacked{"Locale/RecodeData/IBM855.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_IBM855';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for IBM855.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::IBM855;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0x0452,
      0x0402,
      0x0453,
      0x0403,
      0x0451,
      0x0401,
      0x0454,
      0x0404,
      0x0455,
      0x0405,
      0x0456,
      0x0406,
      0x0457,
      0x0407,
      0x0458,
      0x0408,
      0x0459,
      0x0409,
      0x045a,
      0x040a,
      0x045b,
      0x040b,
      0x045c,
      0x040c,
      0x045e,
      0x040e,
      0x045f,
      0x040f,
      0x044e,
      0x042e,
      0x044a,
      0x042a,
      0x0430,
      0x0410,
      0x0431,
      0x0411,
      0x0446,
      0x0426,
      0x0434,
      0x0414,
      0x0435,
      0x0415,
      0x0444,
      0x0424,
      0x0433,
      0x0413,
      0x00ab,
      0x00bb,
      0x2591,
      0x2592,
      0x2593,
      0x2502,
      0x2524,
      0x0445,
      0x0425,
      0x0438,
      0x0418,
      0x2563,
      0x2551,
      0x2557,
      0x255d,
      0x0439,
      0x0419,
      0x2510,
      0x2514,
      0x2534,
      0x252c,
      0x251c,
      0x2500,
      0x253c,
      0x043a,
      0x041a,
      0x255a,
      0x2554,
      0x2569,
      0x2566,
      0x2560,
      0x2550,
      0x256c,
      0x00a4,
      0x043b,
      0x041b,
      0x043c,
      0x041c,
      0x043d,
      0x041d,
      0x043e,
      0x041e,
      0x043f,
      0x2518,
      0x250c,
      0x2588,
      0x2584,
      0x041f,
      0x044f,
      0x2580,
      0x042f,
      0x0440,
      0x0420,
      0x0441,
      0x0421,
      0x0442,
      0x0422,
      0x0443,
      0x0423,
      0x0436,
      0x0416,
      0x0432,
      0x0412,
      0x044c,
      0x042c,
      0x2116,
      0x00ad,
      0x044b,
      0x042b,
      0x0437,
      0x0417,
      0x0448,
      0x0428,
      0x044d,
      0x042d,
      0x0449,
      0x0429,
      0x0447,
      0x0427,
      0x00a7,
      0x25a0,
      0x00a0,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xd1\x92",
      "\xd0\x82",
      "\xd1\x93",
      "\xd0\x83",
      "\xd1\x91",
      "\xd0\x81",
      "\xd1\x94",
      "\xd0\x84",
      "\xd1\x95",
      "\xd0\x85",
      "\xd1\x96",
      "\xd0\x86",
      "\xd1\x97",
      "\xd0\x87",
      "\xd1\x98",
      "\xd0\x88",
      "\xd1\x99",
      "\xd0\x89",
      "\xd1\x9a",
      "\xd0\x8a",
      "\xd1\x9b",
      "\xd0\x8b",
      "\xd1\x9c",
      "\xd0\x8c",
      "\xd1\x9e",
      "\xd0\x8e",
      "\xd1\x9f",
      "\xd0\x8f",
      "\xd1\x8e",
      "\xd0\xae",
      "\xd1\x8a",
      "\xd0\xaa",
      "\xd0\xb0",
      "\xd0\x90",
      "\xd0\xb1",
      "\xd0\x91",
      "\xd1\x86",
      "\xd0\xa6",
      "\xd0\xb4",
      "\xd0\x94",
      "\xd0\xb5",
      "\xd0\x95",
      "\xd1\x84",
      "\xd0\xa4",
      "\xd0\xb3",
      "\xd0\x93",
      "\xc2\xab",
      "\xc2\xbb",
      "\xe2\x96\x91",
      "\xe2\x96\x92",
      "\xe2\x96\x93",
      "\xe2\x94\x82",
      "\xe2\x94\xa4",
      "\xd1\x85",
      "\xd0\xa5",
      "\xd0\xb8",
      "\xd0\x98",
      "\xe2\x95\xa3",
      "\xe2\x95\x91",
      "\xe2\x95\x97",
      "\xe2\x95\x9d",
      "\xd0\xb9",
      "\xd0\x99",
      "\xe2\x94\x90",
      "\xe2\x94\x94",
      "\xe2\x94\xb4",
      "\xe2\x94\xac",
      "\xe2\x94\x9c",
      "\xe2\x94\x80",
      "\xe2\x94\xbc",
      "\xd0\xba",
      "\xd0\x9a",
      "\xe2\x95\x9a",
      "\xe2\x95\x94",
      "\xe2\x95\xa9",
      "\xe2\x95\xa6",
      "\xe2\x95\xa0",
      "\xe2\x95\x90",
      "\xe2\x95\xac",
      "\xc2\xa4",
      "\xd0\xbb",
      "\xd0\x9b",
      "\xd0\xbc",
      "\xd0\x9c",
      "\xd0\xbd",
      "\xd0\x9d",
      "\xd0\xbe",
      "\xd0\x9e",
      "\xd0\xbf",
      "\xe2\x94\x98",
      "\xe2\x94\x8c",
      "\xe2\x96\x88",
      "\xe2\x96\x84",
      "\xd0\x9f",
      "\xd1\x8f",
      "\xe2\x96\x80",
      "\xd0\xaf",
      "\xd1\x80",
      "\xd0\xa0",
      "\xd1\x81",
      "\xd0\xa1",
      "\xd1\x82",
      "\xd0\xa2",
      "\xd1\x83",
      "\xd0\xa3",
      "\xd0\xb6",
      "\xd0\x96",
      "\xd0\xb2",
      "\xd0\x92",
      "\xd1\x8c",
      "\xd0\xac",
      "\xe2\x84\x96",
      "\xc2\xad",
      "\xd1\x8b",
      "\xd0\xab",
      "\xd0\xb7",
      "\xd0\x97",
      "\xd1\x88",
      "\xd0\xa8",
      "\xd1\x8d",
      "\xd0\xad",
      "\xd1\x89",
      "\xd0\xa9",
      "\xd1\x87",
      "\xd0\xa7",
      "\xc2\xa7",
      "\xe2\x96\xa0",
      "\xc2\xa0",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x000000a0 => "\xff",
      0x000000a4 => "\xcf",
      0x000000a7 => "\xfd",
      0x000000ab => "\xae",
      0x000000ad => "\xf0",
      0x000000bb => "\xaf",
      0x00000401 => "\x85",
      0x00000402 => "\x81",
      0x00000403 => "\x83",
      0x00000404 => "\x87",
      0x00000405 => "\x89",
      0x00000406 => "\x8b",
      0x00000407 => "\x8d",
      0x00000408 => "\x8f",
      0x00000409 => "\x91",
      0x0000040a => "\x93",
      0x0000040b => "\x95",
      0x0000040c => "\x97",
      0x0000040e => "\x99",
      0x0000040f => "\x9b",
      0x00000410 => "\xa1",
      0x00000411 => "\xa3",
      0x00000412 => "\xec",
      0x00000413 => "\xad",
      0x00000414 => "\xa7",
      0x00000415 => "\xa9",
      0x00000416 => "\xea",
      0x00000417 => "\xf4",
      0x00000418 => "\xb8",
      0x00000419 => "\xbe",
      0x0000041a => "\xc7",
      0x0000041b => "\xd1",
      0x0000041c => "\xd3",
      0x0000041d => "\xd5",
      0x0000041e => "\xd7",
      0x0000041f => "\xdd",
      0x00000420 => "\xe2",
      0x00000421 => "\xe4",
      0x00000422 => "\xe6",
      0x00000423 => "\xe8",
      0x00000424 => "\xab",
      0x00000425 => "\xb6",
      0x00000426 => "\xa5",
      0x00000427 => "\xfc",
      0x00000428 => "\xf6",
      0x00000429 => "\xfa",
      0x0000042a => "\x9f",
      0x0000042b => "\xf2",
      0x0000042c => "\xee",
      0x0000042d => "\xf8",
      0x0000042e => "\x9d",
      0x0000042f => "\xe0",
      0x00000430 => "\xa0",
      0x00000431 => "\xa2",
      0x00000432 => "\xeb",
      0x00000433 => "\xac",
      0x00000434 => "\xa6",
      0x00000435 => "\xa8",
      0x00000436 => "\xe9",
      0x00000437 => "\xf3",
      0x00000438 => "\xb7",
      0x00000439 => "\xbd",
      0x0000043a => "\xc6",
      0x0000043b => "\xd0",
      0x0000043c => "\xd2",
      0x0000043d => "\xd4",
      0x0000043e => "\xd6",
      0x0000043f => "\xd8",
      0x00000440 => "\xe1",
      0x00000441 => "\xe3",
      0x00000442 => "\xe5",
      0x00000443 => "\xe7",
      0x00000444 => "\xaa",
      0x00000445 => "\xb5",
      0x00000446 => "\xa4",
      0x00000447 => "\xfb",
      0x00000448 => "\xf5",
      0x00000449 => "\xf9",
      0x0000044a => "\x9e",
      0x0000044b => "\xf1",
      0x0000044c => "\xed",
      0x0000044d => "\xf7",
      0x0000044e => "\x9c",
      0x0000044f => "\xde",
      0x00000451 => "\x84",
      0x00000452 => "\x80",
      0x00000453 => "\x82",
      0x00000454 => "\x86",
      0x00000455 => "\x88",
      0x00000456 => "\x8a",
      0x00000457 => "\x8c",
      0x00000458 => "\x8e",
      0x00000459 => "\x90",
      0x0000045a => "\x92",
      0x0000045b => "\x94",
      0x0000045c => "\x96",
      0x0000045e => "\x98",
      0x0000045f => "\x9a",
      0x00002116 => "\xef",
      0x00002500 => "\xc4",
      0x00002502 => "\xb3",
      0x0000250c => "\xda",
      0x00002510 => "\xbf",
      0x00002514 => "\xc0",
      0x00002518 => "\xd9",
      0x0000251c => "\xc3",
      0x00002524 => "\xb4",
      0x0000252c => "\xc2",
      0x00002534 => "\xc1",
      0x0000253c => "\xc5",
      0x00002550 => "\xcd",
      0x00002551 => "\xba",
      0x00002554 => "\xc9",
      0x00002557 => "\xbb",
      0x0000255a => "\xc8",
      0x0000255d => "\xbc",
      0x00002560 => "\xcc",
      0x00002563 => "\xb9",
      0x00002566 => "\xcb",
      0x00002569 => "\xca",
      0x0000256c => "\xce",
      0x00002580 => "\xdf",
      0x00002584 => "\xdc",
      0x00002588 => "\xdb",
      0x00002591 => "\xb0",
      0x00002592 => "\xb1",
      0x00002593 => "\xb2",
      0x000025a0 => "\xfe",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::IBM855 - Conversion routines for IBM855
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for IBM855.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: IBM NLS RM Vol2 SE09-8002-01, March 1990
   alias CP855
   alias 855
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE (DEL)
      80 |  00000452 | CYRILLIC SMALL LETTER DJE (Serbocroatian)
      81 |  00000402 | CYRILLIC CAPITAL LETTER DJE (Serbocroatian)
      82 |  00000453 | CYRILLIC SMALL LETTER GJE
      83 |  00000403 | CYRILLIC CAPITAL LETTER GJE
      84 |  00000451 | CYRILLIC SMALL LETTER IO
      85 |  00000401 | CYRILLIC CAPITAL LETTER IO
      86 |  00000454 | CYRILLIC SMALL LETTER UKRAINIAN IE
      87 |  00000404 | CYRILLIC CAPITAL LETTER UKRAINIAN IE
      88 |  00000455 | CYRILLIC SMALL LETTER DZE
      89 |  00000405 | CYRILLIC CAPITAL LETTER DZE
      8A |  00000456 | CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
      8B |  00000406 | CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
      8C |  00000457 | CYRILLIC SMALL LETTER YI (Ukrainian)
      8D |  00000407 | CYRILLIC CAPITAL LETTER YI (Ukrainian)
      8E |  00000458 | CYRILLIC SMALL LETTER JE
      8F |  00000408 | CYRILLIC CAPITAL LETTER JE
      90 |  00000459 | CYRILLIC SMALL LETTER LJE
      91 |  00000409 | CYRILLIC CAPITAL LETTER LJE
      92 |  0000045A | CYRILLIC SMALL LETTER NJE
      93 |  0000040A | CYRILLIC CAPITAL LETTER NJE
      94 |  0000045B | CYRILLIC SMALL LETTER TSHE (Serbocroatian)
      95 |  0000040B | CYRILLIC CAPITAL LETTER TSHE
      96 |  0000045C | CYRILLIC SMALL LETTER KJE
      97 |  0000040C | CYRILLIC CAPITAL LETTER KJE
      98 |  0000045E | CYRILLIC SMALL LETTER SHORT U (Byelorussian)
      99 |  0000040E | CYRILLIC CAPITAL LETTER SHORT U (Byelorussian)
      9A |  0000045F | CYRILLIC SMALL LETTER DZHE
      9B |  0000040F | CYRILLIC CAPITAL LETTER DZHE
      9C |  0000044E | CYRILLIC SMALL LETTER YU
      9D |  0000042E | CYRILLIC CAPITAL LETTER YU
      9E |  0000044A | CYRILLIC SMALL LETTER HARD SIGN
      9F |  0000042A | CYRILLIC CAPITAL LETTER HARD SIGN
      A0 |  00000430 | CYRILLIC SMALL LETTER A
      A1 |  00000410 | CYRILLIC CAPITAL LETTER A
      A2 |  00000431 | CYRILLIC SMALL LETTER BE
      A3 |  00000411 | CYRILLIC CAPITAL LETTER BE
      A4 |  00000446 | CYRILLIC SMALL LETTER TSE
      A5 |  00000426 | CYRILLIC CAPITAL LETTER TSE
      A6 |  00000434 | CYRILLIC SMALL LETTER DE
      A7 |  00000414 | CYRILLIC CAPITAL LETTER DE
      A8 |  00000435 | CYRILLIC SMALL LETTER IE
      A9 |  00000415 | CYRILLIC CAPITAL LETTER IE
      AA |  00000444 | CYRILLIC SMALL LETTER EF
      AB |  00000424 | CYRILLIC CAPITAL LETTER EF
      AC |  00000433 | CYRILLIC SMALL LETTER GHE
      AD |  00000413 | CYRILLIC CAPITAL LETTER GHE
      AE |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
      AF |  000000BB | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
      B0 |  00002591 | LIGHT SHADE
      B1 |  00002592 | MEDIUM SHADE
      B2 |  00002593 | DARK SHADE
      B3 |  00002502 | BOX DRAWINGS LIGHT VERTICAL
      B4 |  00002524 | BOX DRAWINGS LIGHT VERTICAL AND LEFT
      B5 |  00000445 | CYRILLIC SMALL LETTER HA
      B6 |  00000425 | CYRILLIC CAPITAL LETTER HA
      B7 |  00000438 | CYRILLIC SMALL LETTER I
      B8 |  00000418 | CYRILLIC CAPITAL LETTER I
      B9 |  00002563 | BOX DRAWINGS DOUBLE VERTICAL AND LEFT
      BA |  00002551 | BOX DRAWINGS DOUBLE VERTICAL
      BB |  00002557 | BOX DRAWINGS DOUBLE DOWN AND LEFT
      BC |  0000255D | BOX DRAWINGS DOUBLE UP AND LEFT
      BD |  00000439 | CYRILLIC SMALL LETTER SHORT I
      BE |  00000419 | CYRILLIC CAPITAL LETTER SHORT I
      BF |  00002510 | BOX DRAWINGS LIGHT DOWN AND LEFT
      C0 |  00002514 | BOX DRAWINGS LIGHT UP AND RIGHT
      C1 |  00002534 | BOX DRAWINGS LIGHT UP AND HORIZONTAL
      C2 |  0000252C | BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
      C3 |  0000251C | BOX DRAWINGS LIGHT VERTICAL AND RIGHT
      C4 |  00002500 | BOX DRAWINGS LIGHT HORIZONTAL
      C5 |  0000253C | BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
      C6 |  0000043A | CYRILLIC SMALL LETTER KA
      C7 |  0000041A | CYRILLIC CAPITAL LETTER KA
      C8 |  0000255A | BOX DRAWINGS DOUBLE UP AND RIGHT
      C9 |  00002554 | BOX DRAWINGS DOUBLE DOWN AND RIGHT
      CA |  00002569 | BOX DRAWINGS DOUBLE UP AND HORIZONTAL
      CB |  00002566 | BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
      CC |  00002560 | BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
      CD |  00002550 | BOX DRAWINGS DOUBLE HORIZONTAL
      CE |  0000256C | BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
      CF |  000000A4 | CURRENCY SIGN
      D0 |  0000043B | CYRILLIC SMALL LETTER EL
      D1 |  0000041B | CYRILLIC CAPITAL LETTER EL
      D2 |  0000043C | CYRILLIC SMALL LETTER EM
      D3 |  0000041C | CYRILLIC CAPITAL LETTER EM
      D4 |  0000043D | CYRILLIC SMALL LETTER EN
      D5 |  0000041D | CYRILLIC CAPITAL LETTER EN
      D6 |  0000043E | CYRILLIC SMALL LETTER O
      D7 |  0000041E | CYRILLIC CAPITAL LETTER O
      D8 |  0000043F | CYRILLIC SMALL LETTER PE
      D9 |  00002518 | BOX DRAWINGS LIGHT UP AND LEFT
      DA |  0000250C | BOX DRAWINGS LIGHT DOWN AND RIGHT
      DB |  00002588 | FULL BLOCK
      DC |  00002584 | LOWER HALF BLOCK
      DD |  0000041F | CYRILLIC CAPITAL LETTER PE
      DE |  0000044F | CYRILLIC SMALL LETTER YA
      DF |  00002580 | UPPER HALF BLOCK
      E0 |  0000042F | CYRILLIC CAPITAL LETTER YA
      E1 |  00000440 | CYRILLIC SMALL LETTER ER
      E2 |  00000420 | CYRILLIC CAPITAL LETTER ER
      E3 |  00000441 | CYRILLIC SMALL LETTER ES
      E4 |  00000421 | CYRILLIC CAPITAL LETTER ES
      E5 |  00000442 | CYRILLIC SMALL LETTER TE
      E6 |  00000422 | CYRILLIC CAPITAL LETTER TE
      E7 |  00000443 | CYRILLIC SMALL LETTER U
      E8 |  00000423 | CYRILLIC CAPITAL LETTER U
      E9 |  00000436 | CYRILLIC SMALL LETTER ZHE
      EA |  00000416 | CYRILLIC CAPITAL LETTER ZHE
      EB |  00000432 | CYRILLIC SMALL LETTER VE
      EC |  00000412 | CYRILLIC CAPITAL LETTER VE
      ED |  0000044C | CYRILLIC SMALL LETTER SOFT SIGN
      EE |  0000042C | CYRILLIC CAPITAL LETTER SOFT SIGN
      EF |  00002116 | NUMERO SIGN
      F0 |  000000AD | SOFT HYPHEN
      F1 |  0000044B | CYRILLIC SMALL LETTER YERU
      F2 |  0000042B | CYRILLIC CAPITAL LETTER YERU
      F3 |  00000437 | CYRILLIC SMALL LETTER ZE
      F4 |  00000417 | CYRILLIC CAPITAL LETTER ZE
      F5 |  00000448 | CYRILLIC SMALL LETTER SHA
      F6 |  00000428 | CYRILLIC CAPITAL LETTER SHA
      F7 |  0000044D | CYRILLIC SMALL LETTER E
      F8 |  0000042D | CYRILLIC CAPITAL LETTER E
      F9 |  00000449 | CYRILLIC SMALL LETTER SHCHA
      FA |  00000429 | CYRILLIC CAPITAL LETTER SHCHA
      FB |  00000447 | CYRILLIC SMALL LETTER CHE
      FC |  00000427 | CYRILLIC CAPITAL LETTER CHE
      FD |  000000A7 | SECTION SIGN
      FE |  000025A0 | BLACK SQUARE
      FF |  000000A0 | NO-BREAK SPACE
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_IBM855

    $main::fatpacked{"Locale/RecodeData/IBM857.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_IBM857';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for IBM857.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::IBM857;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0x00c7,
      0x00fc,
      0x00e9,
      0x00e2,
      0x00e4,
      0x00e0,
      0x00e5,
      0x00e7,
      0x00ea,
      0x00eb,
      0x00e8,
      0x00ef,
      0x00ee,
      0x0131,
      0x00c4,
      0x00c5,
      0x00c9,
      0x00e6,
      0x00c6,
      0x00f4,
      0x00f6,
      0x00f2,
      0x00fb,
      0x00f9,
      0x0130,
      0x00d6,
      0x00dc,
      0x00f8,
      0x00a3,
      0x00d8,
      0x015e,
      0x015f,
      0x00e1,
      0x00ed,
      0x00f3,
      0x00fa,
      0x00f1,
      0x00d1,
      0x011e,
      0x011f,
      0x00bf,
      0x00ae,
      0x00ac,
      0x00bd,
      0x00bc,
      0x00a1,
      0x00ab,
      0x00bb,
      0x2591,
      0x2592,
      0x2593,
      0x2502,
      0x2524,
      0x00c1,
      0x00c2,
      0x00c0,
      0x00a9,
      0x2563,
      0x2551,
      0x2557,
      0x255d,
      0x00a2,
      0x00a5,
      0x2510,
      0x2514,
      0x2534,
      0x252c,
      0x251c,
      0x2500,
      0x253c,
      0x00e3,
      0x00c3,
      0x255a,
      0x2554,
      0x2569,
      0x2566,
      0x2560,
      0x2550,
      0x256c,
      0x00a4,
      0x00ba,
      0x00aa,
      0x00ca,
      0x00cb,
      0x00c8,
      0xfffd,
      0x00cd,
      0x00ce,
      0x00cf,
      0x2518,
      0x250c,
      0x2588,
      0x2584,
      0x00a6,
      0x00cc,
      0x2580,
      0x00d3,
      0x00df,
      0x00d4,
      0x00d2,
      0x00f5,
      0x00d5,
      0x00b5,
      0xfffd,
      0x00d7,
      0x00da,
      0x00db,
      0x00d9,
      0x00ec,
      0x00ff,
      0x00af,
      0x00b4,
      0x00ad,
      0x00b1,
      0xfffd,
      0x00be,
      0x00b6,
      0x00a7,
      0x00f7,
      0x00b8,
      0x00b0,
      0x00a8,
      0x00b7,
      0x00b9,
      0x00b3,
      0x00b2,
      0x25a0,
      0x00a0,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xc3\x87",
      "\xc3\xbc",
      "\xc3\xa9",
      "\xc3\xa2",
      "\xc3\xa4",
      "\xc3\xa0",
      "\xc3\xa5",
      "\xc3\xa7",
      "\xc3\xaa",
      "\xc3\xab",
      "\xc3\xa8",
      "\xc3\xaf",
      "\xc3\xae",
      "\xc4\xb1",
      "\xc3\x84",
      "\xc3\x85",
      "\xc3\x89",
      "\xc3\xa6",
      "\xc3\x86",
      "\xc3\xb4",
      "\xc3\xb6",
      "\xc3\xb2",
      "\xc3\xbb",
      "\xc3\xb9",
      "\xc4\xb0",
      "\xc3\x96",
      "\xc3\x9c",
      "\xc3\xb8",
      "\xc2\xa3",
      "\xc3\x98",
      "\xc5\x9e",
      "\xc5\x9f",
      "\xc3\xa1",
      "\xc3\xad",
      "\xc3\xb3",
      "\xc3\xba",
      "\xc3\xb1",
      "\xc3\x91",
      "\xc4\x9e",
      "\xc4\x9f",
      "\xc2\xbf",
      "\xc2\xae",
      "\xc2\xac",
      "\xc2\xbd",
      "\xc2\xbc",
      "\xc2\xa1",
      "\xc2\xab",
      "\xc2\xbb",
      "\xe2\x96\x91",
      "\xe2\x96\x92",
      "\xe2\x96\x93",
      "\xe2\x94\x82",
      "\xe2\x94\xa4",
      "\xc3\x81",
      "\xc3\x82",
      "\xc3\x80",
      "\xc2\xa9",
      "\xe2\x95\xa3",
      "\xe2\x95\x91",
      "\xe2\x95\x97",
      "\xe2\x95\x9d",
      "\xc2\xa2",
      "\xc2\xa5",
      "\xe2\x94\x90",
      "\xe2\x94\x94",
      "\xe2\x94\xb4",
      "\xe2\x94\xac",
      "\xe2\x94\x9c",
      "\xe2\x94\x80",
      "\xe2\x94\xbc",
      "\xc3\xa3",
      "\xc3\x83",
      "\xe2\x95\x9a",
      "\xe2\x95\x94",
      "\xe2\x95\xa9",
      "\xe2\x95\xa6",
      "\xe2\x95\xa0",
      "\xe2\x95\x90",
      "\xe2\x95\xac",
      "\xc2\xa4",
      "\xc2\xba",
      "\xc2\xaa",
      "\xc3\x8a",
      "\xc3\x8b",
      "\xc3\x88",
      "\xef\xbf\xbd",
      "\xc3\x8d",
      "\xc3\x8e",
      "\xc3\x8f",
      "\xe2\x94\x98",
      "\xe2\x94\x8c",
      "\xe2\x96\x88",
      "\xe2\x96\x84",
      "\xc2\xa6",
      "\xc3\x8c",
      "\xe2\x96\x80",
      "\xc3\x93",
      "\xc3\x9f",
      "\xc3\x94",
      "\xc3\x92",
      "\xc3\xb5",
      "\xc3\x95",
      "\xc2\xb5",
      "\xef\xbf\xbd",
      "\xc3\x97",
      "\xc3\x9a",
      "\xc3\x9b",
      "\xc3\x99",
      "\xc3\xac",
      "\xc3\xbf",
      "\xc2\xaf",
      "\xc2\xb4",
      "\xc2\xad",
      "\xc2\xb1",
      "\xef\xbf\xbd",
      "\xc2\xbe",
      "\xc2\xb6",
      "\xc2\xa7",
      "\xc3\xb7",
      "\xc2\xb8",
      "\xc2\xb0",
      "\xc2\xa8",
      "\xc2\xb7",
      "\xc2\xb9",
      "\xc2\xb3",
      "\xc2\xb2",
      "\xe2\x96\xa0",
      "\xc2\xa0",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x000000a0 => "\xff",
      0x000000a1 => "\xad",
      0x000000a2 => "\xbd",
      0x000000a3 => "\x9c",
      0x000000a4 => "\xcf",
      0x000000a5 => "\xbe",
      0x000000a6 => "\xdd",
      0x000000a7 => "\xf5",
      0x000000a8 => "\xf9",
      0x000000a9 => "\xb8",
      0x000000aa => "\xd1",
      0x000000ab => "\xae",
      0x000000ac => "\xaa",
      0x000000ad => "\xf0",
      0x000000ae => "\xa9",
      0x000000af => "\xee",
      0x000000b0 => "\xf8",
      0x000000b1 => "\xf1",
      0x000000b2 => "\xfd",
      0x000000b3 => "\xfc",
      0x000000b4 => "\xef",
      0x000000b5 => "\xe6",
      0x000000b6 => "\xf4",
      0x000000b7 => "\xfa",
      0x000000b8 => "\xf7",
      0x000000b9 => "\xfb",
      0x000000ba => "\xd0",
      0x000000bb => "\xaf",
      0x000000bc => "\xac",
      0x000000bd => "\xab",
      0x000000be => "\xf3",
      0x000000bf => "\xa8",
      0x000000c0 => "\xb7",
      0x000000c1 => "\xb5",
      0x000000c2 => "\xb6",
      0x000000c3 => "\xc7",
      0x000000c4 => "\x8e",
      0x000000c5 => "\x8f",
      0x000000c6 => "\x92",
      0x000000c7 => "\x80",
      0x000000c8 => "\xd4",
      0x000000c9 => "\x90",
      0x000000ca => "\xd2",
      0x000000cb => "\xd3",
      0x000000cc => "\xde",
      0x000000cd => "\xd6",
      0x000000ce => "\xd7",
      0x000000cf => "\xd8",
      0x000000d1 => "\xa5",
      0x000000d2 => "\xe3",
      0x000000d3 => "\xe0",
      0x000000d4 => "\xe2",
      0x000000d5 => "\xe5",
      0x000000d6 => "\x99",
      0x000000d7 => "\xe8",
      0x000000d8 => "\x9d",
      0x000000d9 => "\xeb",
      0x000000da => "\xe9",
      0x000000db => "\xea",
      0x000000dc => "\x9a",
      0x000000df => "\xe1",
      0x000000e0 => "\x85",
      0x000000e1 => "\xa0",
      0x000000e2 => "\x83",
      0x000000e3 => "\xc6",
      0x000000e4 => "\x84",
      0x000000e5 => "\x86",
      0x000000e6 => "\x91",
      0x000000e7 => "\x87",
      0x000000e8 => "\x8a",
      0x000000e9 => "\x82",
      0x000000ea => "\x88",
      0x000000eb => "\x89",
      0x000000ec => "\xec",
      0x000000ed => "\xa1",
      0x000000ee => "\x8c",
      0x000000ef => "\x8b",
      0x000000f1 => "\xa4",
      0x000000f2 => "\x95",
      0x000000f3 => "\xa2",
      0x000000f4 => "\x93",
      0x000000f5 => "\xe4",
      0x000000f6 => "\x94",
      0x000000f7 => "\xf6",
      0x000000f8 => "\x9b",
      0x000000f9 => "\x97",
      0x000000fa => "\xa3",
      0x000000fb => "\x96",
      0x000000fc => "\x81",
      0x000000ff => "\xed",
      0x0000011e => "\xa6",
      0x0000011f => "\xa7",
      0x00000130 => "\x98",
      0x00000131 => "\x8d",
      0x0000015e => "\x9e",
      0x0000015f => "\x9f",
      0x00002500 => "\xc4",
      0x00002502 => "\xb3",
      0x0000250c => "\xda",
      0x00002510 => "\xbf",
      0x00002514 => "\xc0",
      0x00002518 => "\xd9",
      0x0000251c => "\xc3",
      0x00002524 => "\xb4",
      0x0000252c => "\xc2",
      0x00002534 => "\xc1",
      0x0000253c => "\xc5",
      0x00002550 => "\xcd",
      0x00002551 => "\xba",
      0x00002554 => "\xc9",
      0x00002557 => "\xbb",
      0x0000255a => "\xc8",
      0x0000255d => "\xbc",
      0x00002560 => "\xcc",
      0x00002563 => "\xb9",
      0x00002566 => "\xcb",
      0x00002569 => "\xca",
      0x0000256c => "\xce",
      0x00002580 => "\xdf",
      0x00002584 => "\xdc",
      0x00002588 => "\xdb",
      0x00002591 => "\xb0",
      0x00002592 => "\xb1",
      0x00002593 => "\xb2",
      0x000025a0 => "\xfe",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::IBM857 - Conversion routines for IBM857
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for IBM857.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: IBM NLS RM Vol2 SE09-8002-01, March 1990
   alias CP857
   alias 857
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE (DEL)
      80 |  000000C7 | LATIN CAPITAL LETTER C WITH CEDILLA
      81 |  000000FC | LATIN SMALL LETTER U WITH DIAERESIS
      82 |  000000E9 | LATIN SMALL LETTER E WITH ACUTE
      83 |  000000E2 | LATIN SMALL LETTER A WITH CIRCUMFLEX
      84 |  000000E4 | LATIN SMALL LETTER A WITH DIAERESIS
      85 |  000000E0 | LATIN SMALL LETTER A WITH GRAVE
      86 |  000000E5 | LATIN SMALL LETTER A WITH RING ABOVE
      87 |  000000E7 | LATIN SMALL LETTER C WITH CEDILLA
      88 |  000000EA | LATIN SMALL LETTER E WITH CIRCUMFLEX
      89 |  000000EB | LATIN SMALL LETTER E WITH DIAERESIS
      8A |  000000E8 | LATIN SMALL LETTER E WITH GRAVE
      8B |  000000EF | LATIN SMALL LETTER I WITH DIAERESIS
      8C |  000000EE | LATIN SMALL LETTER I WITH CIRCUMFLEX
      8D |  00000131 | LATIN SMALL LETTER DOTLESS I
      8E |  000000C4 | LATIN CAPITAL LETTER A WITH DIAERESIS
      8F |  000000C5 | LATIN CAPITAL LETTER A WITH RING ABOVE
      90 |  000000C9 | LATIN CAPITAL LETTER E WITH ACUTE
      91 |  000000E6 | LATIN SMALL LETTER AE
      92 |  000000C6 | LATIN CAPITAL LETTER AE
      93 |  000000F4 | LATIN SMALL LETTER O WITH CIRCUMFLEX
      94 |  000000F6 | LATIN SMALL LETTER O WITH DIAERESIS
      95 |  000000F2 | LATIN SMALL LETTER O WITH GRAVE
      96 |  000000FB | LATIN SMALL LETTER U WITH CIRCUMFLEX
      97 |  000000F9 | LATIN SMALL LETTER U WITH GRAVE
      98 |  00000130 | LATIN CAPITAL LETTER I WITH DOT ABOVE
      99 |  000000D6 | LATIN CAPITAL LETTER O WITH DIAERESIS
      9A |  000000DC | LATIN CAPITAL LETTER U WITH DIAERESIS
      9B |  000000F8 | LATIN SMALL LETTER O WITH STROKE
      9C |  000000A3 | POUND SIGN
      9D |  000000D8 | LATIN CAPITAL LETTER O WITH STROKE
      9E |  0000015E | LATIN CAPITAL LETTER S WITH CEDILLA
      9F |  0000015F | LATIN SMALL LETTER S WITH CEDILLA
      A0 |  000000E1 | LATIN SMALL LETTER A WITH ACUTE
      A1 |  000000ED | LATIN SMALL LETTER I WITH ACUTE
      A2 |  000000F3 | LATIN SMALL LETTER O WITH ACUTE
      A3 |  000000FA | LATIN SMALL LETTER U WITH ACUTE
      A4 |  000000F1 | LATIN SMALL LETTER N WITH TILDE
      A5 |  000000D1 | LATIN CAPITAL LETTER N WITH TILDE
      A6 |  0000011E | LATIN CAPITAL LETTER G WITH BREVE
      A7 |  0000011F | LATIN SMALL LETTER G WITH BREVE
      A8 |  000000BF | INVERTED QUESTION MARK
      A9 |  000000AE | REGISTERED SIGN
      AA |  000000AC | NOT SIGN
      AB |  000000BD | VULGAR FRACTION ONE HALF
      AC |  000000BC | VULGAR FRACTION ONE QUARTER
      AD |  000000A1 | INVERTED EXCLAMATION MARK
      AE |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
      AF |  000000BB | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
      B0 |  00002591 | LIGHT SHADE
      B1 |  00002592 | MEDIUM SHADE
      B2 |  00002593 | DARK SHADE
      B3 |  00002502 | BOX DRAWINGS LIGHT VERTICAL
      B4 |  00002524 | BOX DRAWINGS LIGHT VERTICAL AND LEFT
      B5 |  000000C1 | LATIN CAPITAL LETTER A WITH ACUTE
      B6 |  000000C2 | LATIN CAPITAL LETTER A WITH CIRCUMFLEX
      B7 |  000000C0 | LATIN CAPITAL LETTER A WITH GRAVE
      B8 |  000000A9 | COPYRIGHT SIGN
      B9 |  00002563 | BOX DRAWINGS DOUBLE VERTICAL AND LEFT
      BA |  00002551 | BOX DRAWINGS DOUBLE VERTICAL
      BB |  00002557 | BOX DRAWINGS DOUBLE DOWN AND LEFT
      BC |  0000255D | BOX DRAWINGS DOUBLE UP AND LEFT
      BD |  000000A2 | CENT SIGN
      BE |  000000A5 | YEN SIGN
      BF |  00002510 | BOX DRAWINGS LIGHT DOWN AND LEFT
      C0 |  00002514 | BOX DRAWINGS LIGHT UP AND RIGHT
      C1 |  00002534 | BOX DRAWINGS LIGHT UP AND HORIZONTAL
      C2 |  0000252C | BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
      C3 |  0000251C | BOX DRAWINGS LIGHT VERTICAL AND RIGHT
      C4 |  00002500 | BOX DRAWINGS LIGHT HORIZONTAL
      C5 |  0000253C | BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
      C6 |  000000E3 | LATIN SMALL LETTER A WITH TILDE
      C7 |  000000C3 | LATIN CAPITAL LETTER A WITH TILDE
      C8 |  0000255A | BOX DRAWINGS DOUBLE UP AND RIGHT
      C9 |  00002554 | BOX DRAWINGS DOUBLE DOWN AND RIGHT
      CA |  00002569 | BOX DRAWINGS DOUBLE UP AND HORIZONTAL
      CB |  00002566 | BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
      CC |  00002560 | BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
      CD |  00002550 | BOX DRAWINGS DOUBLE HORIZONTAL
      CE |  0000256C | BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
      CF |  000000A4 | CURRENCY SIGN
      D0 |  000000BA | MASCULINE ORDINAL INDICATOR
      D1 |  000000AA | FEMININE ORDINAL INDICATOR
      D2 |  000000CA | LATIN CAPITAL LETTER E WITH CIRCUMFLEX
      D3 |  000000CB | LATIN CAPITAL LETTER E WITH DIAERESIS
      D4 |  000000C8 | LATIN CAPITAL LETTER E WITH GRAVE
      D6 |  000000CD | LATIN CAPITAL LETTER I WITH ACUTE
      D7 |  000000CE | LATIN CAPITAL LETTER I WITH CIRCUMFLEX
      D8 |  000000CF | LATIN CAPITAL LETTER I WITH DIAERESIS
      D9 |  00002518 | BOX DRAWINGS LIGHT UP AND LEFT
      DA |  0000250C | BOX DRAWINGS LIGHT DOWN AND RIGHT
      DB |  00002588 | FULL BLOCK
      DC |  00002584 | LOWER HALF BLOCK
      DD |  000000A6 | BROKEN BAR
      DE |  000000CC | LATIN CAPITAL LETTER I WITH GRAVE
      DF |  00002580 | UPPER HALF BLOCK
      E0 |  000000D3 | LATIN CAPITAL LETTER O WITH ACUTE
      E1 |  000000DF | LATIN SMALL LETTER SHARP S (German)
      E2 |  000000D4 | LATIN CAPITAL LETTER O WITH CIRCUMFLEX
      E3 |  000000D2 | LATIN CAPITAL LETTER O WITH GRAVE
      E4 |  000000F5 | LATIN SMALL LETTER O WITH TILDE
      E5 |  000000D5 | LATIN CAPITAL LETTER O WITH TILDE
      E6 |  000000B5 | MICRO SIGN
      E8 |  000000D7 | MULTIPLICATION SIGN
      E9 |  000000DA | LATIN CAPITAL LETTER U WITH ACUTE
      EA |  000000DB | LATIN CAPITAL LETTER U WITH CIRCUMFLEX
      EB |  000000D9 | LATIN CAPITAL LETTER U WITH GRAVE
      EC |  000000EC | LATIN SMALL LETTER I WITH GRAVE
      ED |  000000FF | LATIN SMALL LETTER Y WITH DIAERESIS
      EE |  000000AF | MACRON
      EF |  000000B4 | ACUTE ACCENT
      F0 |  000000AD | SOFT HYPHEN
      F1 |  000000B1 | PLUS-MINUS SIGN
      F3 |  000000BE | VULGAR FRACTION THREE QUARTERS
      F4 |  000000B6 | PILCROW SIGN
      F5 |  000000A7 | SECTION SIGN
      F6 |  000000F7 | DIVISION SIGN
      F7 |  000000B8 | CEDILLA
      F8 |  000000B0 | DEGREE SIGN
      F9 |  000000A8 | DIAERESIS
      FA |  000000B7 | MIDDLE DOT
      FB |  000000B9 | SUPERSCRIPT ONE
      FC |  000000B3 | SUPERSCRIPT THREE
      FD |  000000B2 | SUPERSCRIPT TWO
      FE |  000025A0 | BLACK SQUARE
      FF |  000000A0 | NO-BREAK SPACE
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_IBM857

    $main::fatpacked{"Locale/RecodeData/IBM860.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_IBM860';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for IBM860.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::IBM860;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0x00c7,
      0x00fc,
      0x00e9,
      0x00e2,
      0x00e3,
      0x00e0,
      0x00c1,
      0x00e7,
      0x00ea,
      0x00ca,
      0x00e8,
      0x00cd,
      0x00d4,
      0x00ec,
      0x00c3,
      0x00c2,
      0x00c9,
      0x00c0,
      0x00c8,
      0x00f4,
      0x00f5,
      0x00f2,
      0x00da,
      0x00f9,
      0x00cc,
      0x00d5,
      0x00dc,
      0x00a2,
      0x00a3,
      0x00d9,
      0x20a7,
      0x00d3,
      0x00e1,
      0x00ed,
      0x00f3,
      0x00fa,
      0x00f1,
      0x00d1,
      0x00aa,
      0x00ba,
      0x00bf,
      0x00d2,
      0x00ac,
      0x00bd,
      0x00bc,
      0x00a1,
      0x00ab,
      0x00bb,
      0x2591,
      0x2592,
      0x2593,
      0x2502,
      0x2524,
      0x2561,
      0x2562,
      0x2556,
      0x2555,
      0x2563,
      0x2551,
      0x2557,
      0x255d,
      0x255c,
      0x255b,
      0x2510,
      0x2514,
      0x2534,
      0x252c,
      0x251c,
      0x2500,
      0x253c,
      0x255e,
      0x255f,
      0x255a,
      0x2554,
      0x2569,
      0x2566,
      0x2560,
      0x2550,
      0x256c,
      0x2567,
      0x2568,
      0x2564,
      0x2565,
      0x2559,
      0x2558,
      0x2552,
      0x2553,
      0x256b,
      0x256a,
      0x2518,
      0x250c,
      0x2588,
      0x2584,
      0x258c,
      0x2590,
      0x2580,
      0x03b1,
      0x00df,
      0x0393,
      0x03c0,
      0x03a3,
      0x03c3,
      0x00b5,
      0x03c4,
      0x03a6,
      0x0398,
      0x03a9,
      0x03b4,
      0x221e,
      0x03c6,
      0x03b5,
      0x2229,
      0x2261,
      0x00b1,
      0x2265,
      0x2264,
      0x2320,
      0x2321,
      0x00f7,
      0x2248,
      0x00b0,
      0x2219,
      0x00b7,
      0x221a,
      0x207f,
      0x00b2,
      0x25a0,
      0x00a0,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xc3\x87",
      "\xc3\xbc",
      "\xc3\xa9",
      "\xc3\xa2",
      "\xc3\xa3",
      "\xc3\xa0",
      "\xc3\x81",
      "\xc3\xa7",
      "\xc3\xaa",
      "\xc3\x8a",
      "\xc3\xa8",
      "\xc3\x8d",
      "\xc3\x94",
      "\xc3\xac",
      "\xc3\x83",
      "\xc3\x82",
      "\xc3\x89",
      "\xc3\x80",
      "\xc3\x88",
      "\xc3\xb4",
      "\xc3\xb5",
      "\xc3\xb2",
      "\xc3\x9a",
      "\xc3\xb9",
      "\xc3\x8c",
      "\xc3\x95",
      "\xc3\x9c",
      "\xc2\xa2",
      "\xc2\xa3",
      "\xc3\x99",
      "\xe2\x82\xa7",
      "\xc3\x93",
      "\xc3\xa1",
      "\xc3\xad",
      "\xc3\xb3",
      "\xc3\xba",
      "\xc3\xb1",
      "\xc3\x91",
      "\xc2\xaa",
      "\xc2\xba",
      "\xc2\xbf",
      "\xc3\x92",
      "\xc2\xac",
      "\xc2\xbd",
      "\xc2\xbc",
      "\xc2\xa1",
      "\xc2\xab",
      "\xc2\xbb",
      "\xe2\x96\x91",
      "\xe2\x96\x92",
      "\xe2\x96\x93",
      "\xe2\x94\x82",
      "\xe2\x94\xa4",
      "\xe2\x95\xa1",
      "\xe2\x95\xa2",
      "\xe2\x95\x96",
      "\xe2\x95\x95",
      "\xe2\x95\xa3",
      "\xe2\x95\x91",
      "\xe2\x95\x97",
      "\xe2\x95\x9d",
      "\xe2\x95\x9c",
      "\xe2\x95\x9b",
      "\xe2\x94\x90",
      "\xe2\x94\x94",
      "\xe2\x94\xb4",
      "\xe2\x94\xac",
      "\xe2\x94\x9c",
      "\xe2\x94\x80",
      "\xe2\x94\xbc",
      "\xe2\x95\x9e",
      "\xe2\x95\x9f",
      "\xe2\x95\x9a",
      "\xe2\x95\x94",
      "\xe2\x95\xa9",
      "\xe2\x95\xa6",
      "\xe2\x95\xa0",
      "\xe2\x95\x90",
      "\xe2\x95\xac",
      "\xe2\x95\xa7",
      "\xe2\x95\xa8",
      "\xe2\x95\xa4",
      "\xe2\x95\xa5",
      "\xe2\x95\x99",
      "\xe2\x95\x98",
      "\xe2\x95\x92",
      "\xe2\x95\x93",
      "\xe2\x95\xab",
      "\xe2\x95\xaa",
      "\xe2\x94\x98",
      "\xe2\x94\x8c",
      "\xe2\x96\x88",
      "\xe2\x96\x84",
      "\xe2\x96\x8c",
      "\xe2\x96\x90",
      "\xe2\x96\x80",
      "\xce\xb1",
      "\xc3\x9f",
      "\xce\x93",
      "\xcf\x80",
      "\xce\xa3",
      "\xcf\x83",
      "\xc2\xb5",
      "\xcf\x84",
      "\xce\xa6",
      "\xce\x98",
      "\xce\xa9",
      "\xce\xb4",
      "\xe2\x88\x9e",
      "\xcf\x86",
      "\xce\xb5",
      "\xe2\x88\xa9",
      "\xe2\x89\xa1",
      "\xc2\xb1",
      "\xe2\x89\xa5",
      "\xe2\x89\xa4",
      "\xe2\x8c\xa0",
      "\xe2\x8c\xa1",
      "\xc3\xb7",
      "\xe2\x89\x88",
      "\xc2\xb0",
      "\xe2\x88\x99",
      "\xc2\xb7",
      "\xe2\x88\x9a",
      "\xe2\x81\xbf",
      "\xc2\xb2",
      "\xe2\x96\xa0",
      "\xc2\xa0",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x000000a0 => "\xff",
      0x000000a1 => "\xad",
      0x000000a2 => "\x9b",
      0x000000a3 => "\x9c",
      0x000000aa => "\xa6",
      0x000000ab => "\xae",
      0x000000ac => "\xaa",
      0x000000b0 => "\xf8",
      0x000000b1 => "\xf1",
      0x000000b2 => "\xfd",
      0x000000b5 => "\xe6",
      0x000000b7 => "\xfa",
      0x000000ba => "\xa7",
      0x000000bb => "\xaf",
      0x000000bc => "\xac",
      0x000000bd => "\xab",
      0x000000bf => "\xa8",
      0x000000c0 => "\x91",
      0x000000c1 => "\x86",
      0x000000c2 => "\x8f",
      0x000000c3 => "\x8e",
      0x000000c7 => "\x80",
      0x000000c8 => "\x92",
      0x000000c9 => "\x90",
      0x000000ca => "\x89",
      0x000000cc => "\x98",
      0x000000cd => "\x8b",
      0x000000d1 => "\xa5",
      0x000000d2 => "\xa9",
      0x000000d3 => "\x9f",
      0x000000d4 => "\x8c",
      0x000000d5 => "\x99",
      0x000000d9 => "\x9d",
      0x000000da => "\x96",
      0x000000dc => "\x9a",
      0x000000df => "\xe1",
      0x000000e0 => "\x85",
      0x000000e1 => "\xa0",
      0x000000e2 => "\x83",
      0x000000e3 => "\x84",
      0x000000e7 => "\x87",
      0x000000e8 => "\x8a",
      0x000000e9 => "\x82",
      0x000000ea => "\x88",
      0x000000ec => "\x8d",
      0x000000ed => "\xa1",
      0x000000f1 => "\xa4",
      0x000000f2 => "\x95",
      0x000000f3 => "\xa2",
      0x000000f4 => "\x93",
      0x000000f5 => "\x94",
      0x000000f7 => "\xf6",
      0x000000f9 => "\x97",
      0x000000fa => "\xa3",
      0x000000fc => "\x81",
      0x00000393 => "\xe2",
      0x00000398 => "\xe9",
      0x000003a3 => "\xe4",
      0x000003a6 => "\xe8",
      0x000003a9 => "\xea",
      0x000003b1 => "\xe0",
      0x000003b4 => "\xeb",
      0x000003b5 => "\xee",
      0x000003c0 => "\xe3",
      0x000003c3 => "\xe5",
      0x000003c4 => "\xe7",
      0x000003c6 => "\xed",
      0x0000207f => "\xfc",
      0x000020a7 => "\x9e",
      0x00002219 => "\xf9",
      0x0000221a => "\xfb",
      0x0000221e => "\xec",
      0x00002229 => "\xef",
      0x00002248 => "\xf7",
      0x00002261 => "\xf0",
      0x00002264 => "\xf3",
      0x00002265 => "\xf2",
      0x00002320 => "\xf4",
      0x00002321 => "\xf5",
      0x00002500 => "\xc4",
      0x00002502 => "\xb3",
      0x0000250c => "\xda",
      0x00002510 => "\xbf",
      0x00002514 => "\xc0",
      0x00002518 => "\xd9",
      0x0000251c => "\xc3",
      0x00002524 => "\xb4",
      0x0000252c => "\xc2",
      0x00002534 => "\xc1",
      0x0000253c => "\xc5",
      0x00002550 => "\xcd",
      0x00002551 => "\xba",
      0x00002552 => "\xd5",
      0x00002553 => "\xd6",
      0x00002554 => "\xc9",
      0x00002555 => "\xb8",
      0x00002556 => "\xb7",
      0x00002557 => "\xbb",
      0x00002558 => "\xd4",
      0x00002559 => "\xd3",
      0x0000255a => "\xc8",
      0x0000255b => "\xbe",
      0x0000255c => "\xbd",
      0x0000255d => "\xbc",
      0x0000255e => "\xc6",
      0x0000255f => "\xc7",
      0x00002560 => "\xcc",
      0x00002561 => "\xb5",
      0x00002562 => "\xb6",
      0x00002563 => "\xb9",
      0x00002564 => "\xd1",
      0x00002565 => "\xd2",
      0x00002566 => "\xcb",
      0x00002567 => "\xcf",
      0x00002568 => "\xd0",
      0x00002569 => "\xca",
      0x0000256a => "\xd8",
      0x0000256b => "\xd7",
      0x0000256c => "\xce",
      0x00002580 => "\xdf",
      0x00002584 => "\xdc",
      0x00002588 => "\xdb",
      0x0000258c => "\xdd",
      0x00002590 => "\xde",
      0x00002591 => "\xb0",
      0x00002592 => "\xb1",
      0x00002593 => "\xb2",
      0x000025a0 => "\xfe",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::IBM860 - Conversion routines for IBM860
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for IBM860.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: IBM NLS RM Vol2 SE09-8002-01, March 1990
   alias CP860
   alias 860
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE (DEL)
      80 |  000000C7 | LATIN CAPITAL LETTER C WITH CEDILLA
      81 |  000000FC | LATIN SMALL LETTER U WITH DIAERESIS
      82 |  000000E9 | LATIN SMALL LETTER E WITH ACUTE
      83 |  000000E2 | LATIN SMALL LETTER A WITH CIRCUMFLEX
      84 |  000000E3 | LATIN SMALL LETTER A WITH TILDE
      85 |  000000E0 | LATIN SMALL LETTER A WITH GRAVE
      86 |  000000C1 | LATIN CAPITAL LETTER A WITH ACUTE
      87 |  000000E7 | LATIN SMALL LETTER C WITH CEDILLA
      88 |  000000EA | LATIN SMALL LETTER E WITH CIRCUMFLEX
      89 |  000000CA | LATIN CAPITAL LETTER E WITH CIRCUMFLEX
      8A |  000000E8 | LATIN SMALL LETTER E WITH GRAVE
      8B |  000000CD | LATIN CAPITAL LETTER I WITH ACUTE
      8C |  000000D4 | LATIN CAPITAL LETTER O WITH CIRCUMFLEX
      8D |  000000EC | LATIN SMALL LETTER I WITH GRAVE
      8E |  000000C3 | LATIN CAPITAL LETTER A WITH TILDE
      8F |  000000C2 | LATIN CAPITAL LETTER A WITH CIRCUMFLEX
      90 |  000000C9 | LATIN CAPITAL LETTER E WITH ACUTE
      91 |  000000C0 | LATIN CAPITAL LETTER A WITH GRAVE
      92 |  000000C8 | LATIN CAPITAL LETTER E WITH GRAVE
      93 |  000000F4 | LATIN SMALL LETTER O WITH CIRCUMFLEX
      94 |  000000F5 | LATIN SMALL LETTER O WITH TILDE
      95 |  000000F2 | LATIN SMALL LETTER O WITH GRAVE
      96 |  000000DA | LATIN CAPITAL LETTER U WITH ACUTE
      97 |  000000F9 | LATIN SMALL LETTER U WITH GRAVE
      98 |  000000CC | LATIN CAPITAL LETTER I WITH GRAVE
      99 |  000000D5 | LATIN CAPITAL LETTER O WITH TILDE
      9A |  000000DC | LATIN CAPITAL LETTER U WITH DIAERESIS
      9B |  000000A2 | CENT SIGN
      9C |  000000A3 | POUND SIGN
      9D |  000000D9 | LATIN CAPITAL LETTER U WITH GRAVE
      9E |  000020A7 | PESETA SIGN
      9F |  000000D3 | LATIN CAPITAL LETTER O WITH ACUTE
      A0 |  000000E1 | LATIN SMALL LETTER A WITH ACUTE
      A1 |  000000ED | LATIN SMALL LETTER I WITH ACUTE
      A2 |  000000F3 | LATIN SMALL LETTER O WITH ACUTE
      A3 |  000000FA | LATIN SMALL LETTER U WITH ACUTE
      A4 |  000000F1 | LATIN SMALL LETTER N WITH TILDE
      A5 |  000000D1 | LATIN CAPITAL LETTER N WITH TILDE
      A6 |  000000AA | FEMININE ORDINAL INDICATOR
      A7 |  000000BA | MASCULINE ORDINAL INDICATOR
      A8 |  000000BF | INVERTED QUESTION MARK
      A9 |  000000D2 | LATIN CAPITAL LETTER O WITH GRAVE
      AA |  000000AC | NOT SIGN
      AB |  000000BD | VULGAR FRACTION ONE HALF
      AC |  000000BC | VULGAR FRACTION ONE QUARTER
      AD |  000000A1 | INVERTED EXCLAMATION MARK
      AE |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
      AF |  000000BB | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
      B0 |  00002591 | LIGHT SHADE
      B1 |  00002592 | MEDIUM SHADE
      B2 |  00002593 | DARK SHADE
      B3 |  00002502 | BOX DRAWINGS LIGHT VERTICAL
      B4 |  00002524 | BOX DRAWINGS LIGHT VERTICAL AND LEFT
      B5 |  00002561 | BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
      B6 |  00002562 | BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
      B7 |  00002556 | BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
      B8 |  00002555 | BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
      B9 |  00002563 | BOX DRAWINGS DOUBLE VERTICAL AND LEFT
      BA |  00002551 | BOX DRAWINGS DOUBLE VERTICAL
      BB |  00002557 | BOX DRAWINGS DOUBLE DOWN AND LEFT
      BC |  0000255D | BOX DRAWINGS DOUBLE UP AND LEFT
      BD |  0000255C | BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
      BE |  0000255B | BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
      BF |  00002510 | BOX DRAWINGS LIGHT DOWN AND LEFT
      C0 |  00002514 | BOX DRAWINGS LIGHT UP AND RIGHT
      C1 |  00002534 | BOX DRAWINGS LIGHT UP AND HORIZONTAL
      C2 |  0000252C | BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
      C3 |  0000251C | BOX DRAWINGS LIGHT VERTICAL AND RIGHT
      C4 |  00002500 | BOX DRAWINGS LIGHT HORIZONTAL
      C5 |  0000253C | BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
      C6 |  0000255E | BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
      C7 |  0000255F | BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
      C8 |  0000255A | BOX DRAWINGS DOUBLE UP AND RIGHT
      C9 |  00002554 | BOX DRAWINGS DOUBLE DOWN AND RIGHT
      CA |  00002569 | BOX DRAWINGS DOUBLE UP AND HORIZONTAL
      CB |  00002566 | BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
      CC |  00002560 | BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
      CD |  00002550 | BOX DRAWINGS DOUBLE HORIZONTAL
      CE |  0000256C | BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
      CF |  00002567 | BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
      D0 |  00002568 | BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
      D1 |  00002564 | BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
      D2 |  00002565 | BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
      D3 |  00002559 | BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
      D4 |  00002558 | BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
      D5 |  00002552 | BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
      D6 |  00002553 | BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
      D7 |  0000256B | BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
      D8 |  0000256A | BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
      D9 |  00002518 | BOX DRAWINGS LIGHT UP AND LEFT
      DA |  0000250C | BOX DRAWINGS LIGHT DOWN AND RIGHT
      DB |  00002588 | FULL BLOCK
      DC |  00002584 | LOWER HALF BLOCK
      DD |  0000258C | LEFT HALF BLOCK
      DE |  00002590 | RIGHT HALF BLOCK
      DF |  00002580 | UPPER HALF BLOCK
      E0 |  000003B1 | GREEK SMALL LETTER ALPHA
      E1 |  000000DF | LATIN SMALL LETTER SHARP S (German)
      E2 |  00000393 | GREEK CAPITAL LETTER GAMMA
      E3 |  000003C0 | GREEK SMALL LETTER PI
      E4 |  000003A3 | GREEK CAPITAL LETTER SIGMA
      E5 |  000003C3 | GREEK SMALL LETTER SIGMA
      E6 |  000000B5 | MICRO SIGN
      E7 |  000003C4 | GREEK SMALL LETTER TAU
      E8 |  000003A6 | GREEK CAPITAL LETTER PHI
      E9 |  00000398 | GREEK CAPITAL LETTER THETA
      EA |  000003A9 | GREEK CAPITAL LETTER OMEGA
      EB |  000003B4 | GREEK SMALL LETTER DELTA
      EC |  0000221E | INFINITY
      ED |  000003C6 | GREEK SMALL LETTER PHI
      EE |  000003B5 | GREEK SMALL LETTER EPSILON
      EF |  00002229 | INTERSECTION
      F0 |  00002261 | IDENTICAL TO
      F1 |  000000B1 | PLUS-MINUS SIGN
      F2 |  00002265 | GREATER-THAN OR EQUAL TO
      F3 |  00002264 | LESS-THAN OR EQUAL TO
      F4 |  00002320 | TOP HALF INTEGRAL
      F5 |  00002321 | BOTTOM HALF INTEGRAL
      F6 |  000000F7 | DIVISION SIGN
      F7 |  00002248 | ALMOST EQUAL TO
      F8 |  000000B0 | DEGREE SIGN
      F9 |  00002219 | BULLET OPERATOR
      FA |  000000B7 | MIDDLE DOT
      FB |  0000221A | SQUARE ROOT
      FC |  0000207F | SUPERSCRIPT LATIN SMALL LETTER N
      FD |  000000B2 | SUPERSCRIPT TWO
      FE |  000025A0 | BLACK SQUARE
      FF |  000000A0 | NO-BREAK SPACE
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_IBM860

    $main::fatpacked{"Locale/RecodeData/IBM861.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_IBM861';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for IBM861.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::IBM861;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0x00c7,
      0x00fc,
      0x00e9,
      0x00e2,
      0x00e4,
      0x00e0,
      0x00e5,
      0x00e7,
      0x00ea,
      0x00eb,
      0x00e8,
      0x00d0,
      0x00f0,
      0x00de,
      0x00c4,
      0x00c5,
      0x00c9,
      0x00e6,
      0x00c6,
      0x00f4,
      0x00f6,
      0x00fe,
      0x00fb,
      0x00dd,
      0x00fd,
      0x00d6,
      0x00dc,
      0x00f8,
      0x00a3,
      0x00d8,
      0x20a7,
      0x0192,
      0x00e1,
      0x00ed,
      0x00f3,
      0x00fa,
      0x00c1,
      0x00cd,
      0x00d3,
      0x00da,
      0x00bf,
      0x2310,
      0x00ac,
      0x00bd,
      0x00bc,
      0x00a1,
      0x00ab,
      0x00bb,
      0x2591,
      0x2592,
      0x2593,
      0x2502,
      0x2524,
      0x2561,
      0x2562,
      0x2556,
      0x2555,
      0x2563,
      0x2551,
      0x2557,
      0x255d,
      0x255c,
      0x255b,
      0x2510,
      0x2514,
      0x2534,
      0x252c,
      0x251c,
      0x2500,
      0x253c,
      0x255e,
      0x255f,
      0x255a,
      0x2554,
      0x2569,
      0x2566,
      0x2560,
      0x2550,
      0x256c,
      0x2567,
      0x2568,
      0x2564,
      0x2565,
      0x2559,
      0x2558,
      0x2552,
      0x2553,
      0x256b,
      0x256a,
      0x2518,
      0x250c,
      0x2588,
      0x2584,
      0x258c,
      0x2590,
      0x2580,
      0x03b1,
      0x00df,
      0x0393,
      0x03c0,
      0x03a3,
      0x03c3,
      0x00b5,
      0x03c4,
      0x03a6,
      0x0398,
      0x03a9,
      0x03b4,
      0x221e,
      0x03c6,
      0x03b5,
      0x2229,
      0x2261,
      0x00b1,
      0x2265,
      0x2264,
      0x2320,
      0x2321,
      0x00f7,
      0x2248,
      0x00b0,
      0x2219,
      0x00b7,
      0x221a,
      0x207f,
      0x00b2,
      0x25a0,
      0x00a0,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xc3\x87",
      "\xc3\xbc",
      "\xc3\xa9",
      "\xc3\xa2",
      "\xc3\xa4",
      "\xc3\xa0",
      "\xc3\xa5",
      "\xc3\xa7",
      "\xc3\xaa",
      "\xc3\xab",
      "\xc3\xa8",
      "\xc3\x90",
      "\xc3\xb0",
      "\xc3\x9e",
      "\xc3\x84",
      "\xc3\x85",
      "\xc3\x89",
      "\xc3\xa6",
      "\xc3\x86",
      "\xc3\xb4",
      "\xc3\xb6",
      "\xc3\xbe",
      "\xc3\xbb",
      "\xc3\x9d",
      "\xc3\xbd",
      "\xc3\x96",
      "\xc3\x9c",
      "\xc3\xb8",
      "\xc2\xa3",
      "\xc3\x98",
      "\xe2\x82\xa7",
      "\xc6\x92",
      "\xc3\xa1",
      "\xc3\xad",
      "\xc3\xb3",
      "\xc3\xba",
      "\xc3\x81",
      "\xc3\x8d",
      "\xc3\x93",
      "\xc3\x9a",
      "\xc2\xbf",
      "\xe2\x8c\x90",
      "\xc2\xac",
      "\xc2\xbd",
      "\xc2\xbc",
      "\xc2\xa1",
      "\xc2\xab",
      "\xc2\xbb",
      "\xe2\x96\x91",
      "\xe2\x96\x92",
      "\xe2\x96\x93",
      "\xe2\x94\x82",
      "\xe2\x94\xa4",
      "\xe2\x95\xa1",
      "\xe2\x95\xa2",
      "\xe2\x95\x96",
      "\xe2\x95\x95",
      "\xe2\x95\xa3",
      "\xe2\x95\x91",
      "\xe2\x95\x97",
      "\xe2\x95\x9d",
      "\xe2\x95\x9c",
      "\xe2\x95\x9b",
      "\xe2\x94\x90",
      "\xe2\x94\x94",
      "\xe2\x94\xb4",
      "\xe2\x94\xac",
      "\xe2\x94\x9c",
      "\xe2\x94\x80",
      "\xe2\x94\xbc",
      "\xe2\x95\x9e",
      "\xe2\x95\x9f",
      "\xe2\x95\x9a",
      "\xe2\x95\x94",
      "\xe2\x95\xa9",
      "\xe2\x95\xa6",
      "\xe2\x95\xa0",
      "\xe2\x95\x90",
      "\xe2\x95\xac",
      "\xe2\x95\xa7",
      "\xe2\x95\xa8",
      "\xe2\x95\xa4",
      "\xe2\x95\xa5",
      "\xe2\x95\x99",
      "\xe2\x95\x98",
      "\xe2\x95\x92",
      "\xe2\x95\x93",
      "\xe2\x95\xab",
      "\xe2\x95\xaa",
      "\xe2\x94\x98",
      "\xe2\x94\x8c",
      "\xe2\x96\x88",
      "\xe2\x96\x84",
      "\xe2\x96\x8c",
      "\xe2\x96\x90",
      "\xe2\x96\x80",
      "\xce\xb1",
      "\xc3\x9f",
      "\xce\x93",
      "\xcf\x80",
      "\xce\xa3",
      "\xcf\x83",
      "\xc2\xb5",
      "\xcf\x84",
      "\xce\xa6",
      "\xce\x98",
      "\xce\xa9",
      "\xce\xb4",
      "\xe2\x88\x9e",
      "\xcf\x86",
      "\xce\xb5",
      "\xe2\x88\xa9",
      "\xe2\x89\xa1",
      "\xc2\xb1",
      "\xe2\x89\xa5",
      "\xe2\x89\xa4",
      "\xe2\x8c\xa0",
      "\xe2\x8c\xa1",
      "\xc3\xb7",
      "\xe2\x89\x88",
      "\xc2\xb0",
      "\xe2\x88\x99",
      "\xc2\xb7",
      "\xe2\x88\x9a",
      "\xe2\x81\xbf",
      "\xc2\xb2",
      "\xe2\x96\xa0",
      "\xc2\xa0",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x000000a0 => "\xff",
      0x000000a1 => "\xad",
      0x000000a3 => "\x9c",
      0x000000ab => "\xae",
      0x000000ac => "\xaa",
      0x000000b0 => "\xf8",
      0x000000b1 => "\xf1",
      0x000000b2 => "\xfd",
      0x000000b5 => "\xe6",
      0x000000b7 => "\xfa",
      0x000000bb => "\xaf",
      0x000000bc => "\xac",
      0x000000bd => "\xab",
      0x000000bf => "\xa8",
      0x000000c1 => "\xa4",
      0x000000c4 => "\x8e",
      0x000000c5 => "\x8f",
      0x000000c6 => "\x92",
      0x000000c7 => "\x80",
      0x000000c9 => "\x90",
      0x000000cd => "\xa5",
      0x000000d0 => "\x8b",
      0x000000d3 => "\xa6",
      0x000000d6 => "\x99",
      0x000000d8 => "\x9d",
      0x000000da => "\xa7",
      0x000000dc => "\x9a",
      0x000000dd => "\x97",
      0x000000de => "\x8d",
      0x000000df => "\xe1",
      0x000000e0 => "\x85",
      0x000000e1 => "\xa0",
      0x000000e2 => "\x83",
      0x000000e4 => "\x84",
      0x000000e5 => "\x86",
      0x000000e6 => "\x91",
      0x000000e7 => "\x87",
      0x000000e8 => "\x8a",
      0x000000e9 => "\x82",
      0x000000ea => "\x88",
      0x000000eb => "\x89",
      0x000000ed => "\xa1",
      0x000000f0 => "\x8c",
      0x000000f3 => "\xa2",
      0x000000f4 => "\x93",
      0x000000f6 => "\x94",
      0x000000f7 => "\xf6",
      0x000000f8 => "\x9b",
      0x000000fa => "\xa3",
      0x000000fb => "\x96",
      0x000000fc => "\x81",
      0x000000fd => "\x98",
      0x000000fe => "\x95",
      0x00000192 => "\x9f",
      0x00000393 => "\xe2",
      0x00000398 => "\xe9",
      0x000003a3 => "\xe4",
      0x000003a6 => "\xe8",
      0x000003a9 => "\xea",
      0x000003b1 => "\xe0",
      0x000003b4 => "\xeb",
      0x000003b5 => "\xee",
      0x000003c0 => "\xe3",
      0x000003c3 => "\xe5",
      0x000003c4 => "\xe7",
      0x000003c6 => "\xed",
      0x0000207f => "\xfc",
      0x000020a7 => "\x9e",
      0x00002219 => "\xf9",
      0x0000221a => "\xfb",
      0x0000221e => "\xec",
      0x00002229 => "\xef",
      0x00002248 => "\xf7",
      0x00002261 => "\xf0",
      0x00002264 => "\xf3",
      0x00002265 => "\xf2",
      0x00002310 => "\xa9",
      0x00002320 => "\xf4",
      0x00002321 => "\xf5",
      0x00002500 => "\xc4",
      0x00002502 => "\xb3",
      0x0000250c => "\xda",
      0x00002510 => "\xbf",
      0x00002514 => "\xc0",
      0x00002518 => "\xd9",
      0x0000251c => "\xc3",
      0x00002524 => "\xb4",
      0x0000252c => "\xc2",
      0x00002534 => "\xc1",
      0x0000253c => "\xc5",
      0x00002550 => "\xcd",
      0x00002551 => "\xba",
      0x00002552 => "\xd5",
      0x00002553 => "\xd6",
      0x00002554 => "\xc9",
      0x00002555 => "\xb8",
      0x00002556 => "\xb7",
      0x00002557 => "\xbb",
      0x00002558 => "\xd4",
      0x00002559 => "\xd3",
      0x0000255a => "\xc8",
      0x0000255b => "\xbe",
      0x0000255c => "\xbd",
      0x0000255d => "\xbc",
      0x0000255e => "\xc6",
      0x0000255f => "\xc7",
      0x00002560 => "\xcc",
      0x00002561 => "\xb5",
      0x00002562 => "\xb6",
      0x00002563 => "\xb9",
      0x00002564 => "\xd1",
      0x00002565 => "\xd2",
      0x00002566 => "\xcb",
      0x00002567 => "\xcf",
      0x00002568 => "\xd0",
      0x00002569 => "\xca",
      0x0000256a => "\xd8",
      0x0000256b => "\xd7",
      0x0000256c => "\xce",
      0x00002580 => "\xdf",
      0x00002584 => "\xdc",
      0x00002588 => "\xdb",
      0x0000258c => "\xdd",
      0x00002590 => "\xde",
      0x00002591 => "\xb0",
      0x00002592 => "\xb1",
      0x00002593 => "\xb2",
      0x000025a0 => "\xfe",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::IBM861 - Conversion routines for IBM861
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for IBM861.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: IBM NLS RM Vol2 SE09-8002-01, March 1990
   alias CP861
   alias 861
   alias CP-IS
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE (DEL)
      80 |  000000C7 | LATIN CAPITAL LETTER C WITH CEDILLA
      81 |  000000FC | LATIN SMALL LETTER U WITH DIAERESIS
      82 |  000000E9 | LATIN SMALL LETTER E WITH ACUTE
      83 |  000000E2 | LATIN SMALL LETTER A WITH CIRCUMFLEX
      84 |  000000E4 | LATIN SMALL LETTER A WITH DIAERESIS
      85 |  000000E0 | LATIN SMALL LETTER A WITH GRAVE
      86 |  000000E5 | LATIN SMALL LETTER A WITH RING ABOVE
      87 |  000000E7 | LATIN SMALL LETTER C WITH CEDILLA
      88 |  000000EA | LATIN SMALL LETTER E WITH CIRCUMFLEX
      89 |  000000EB | LATIN SMALL LETTER E WITH DIAERESIS
      8A |  000000E8 | LATIN SMALL LETTER E WITH GRAVE
      8B |  000000D0 | LATIN CAPITAL LETTER ETH (Icelandic)
      8C |  000000F0 | LATIN SMALL LETTER ETH (Icelandic)
      8D |  000000DE | LATIN CAPITAL LETTER THORN (Icelandic)
      8E |  000000C4 | LATIN CAPITAL LETTER A WITH DIAERESIS
      8F |  000000C5 | LATIN CAPITAL LETTER A WITH RING ABOVE
      90 |  000000C9 | LATIN CAPITAL LETTER E WITH ACUTE
      91 |  000000E6 | LATIN SMALL LETTER AE
      92 |  000000C6 | LATIN CAPITAL LETTER AE
      93 |  000000F4 | LATIN SMALL LETTER O WITH CIRCUMFLEX
      94 |  000000F6 | LATIN SMALL LETTER O WITH DIAERESIS
      95 |  000000FE | LATIN SMALL LETTER THORN (Icelandic)
      96 |  000000FB | LATIN SMALL LETTER U WITH CIRCUMFLEX
      97 |  000000DD | LATIN CAPITAL LETTER Y WITH ACUTE
      98 |  000000FD | LATIN SMALL LETTER Y WITH ACUTE
      99 |  000000D6 | LATIN CAPITAL LETTER O WITH DIAERESIS
      9A |  000000DC | LATIN CAPITAL LETTER U WITH DIAERESIS
      9B |  000000F8 | LATIN SMALL LETTER O WITH STROKE
      9C |  000000A3 | POUND SIGN
      9D |  000000D8 | LATIN CAPITAL LETTER O WITH STROKE
      9E |  000020A7 | PESETA SIGN
      9F |  00000192 | LATIN SMALL LETTER F WITH HOOK
      A0 |  000000E1 | LATIN SMALL LETTER A WITH ACUTE
      A1 |  000000ED | LATIN SMALL LETTER I WITH ACUTE
      A2 |  000000F3 | LATIN SMALL LETTER O WITH ACUTE
      A3 |  000000FA | LATIN SMALL LETTER U WITH ACUTE
      A4 |  000000C1 | LATIN CAPITAL LETTER A WITH ACUTE
      A5 |  000000CD | LATIN CAPITAL LETTER I WITH ACUTE
      A6 |  000000D3 | LATIN CAPITAL LETTER O WITH ACUTE
      A7 |  000000DA | LATIN CAPITAL LETTER U WITH ACUTE
      A8 |  000000BF | INVERTED QUESTION MARK
      A9 |  00002310 | REVERSED NOT SIGN
      AA |  000000AC | NOT SIGN
      AB |  000000BD | VULGAR FRACTION ONE HALF
      AC |  000000BC | VULGAR FRACTION ONE QUARTER
      AD |  000000A1 | INVERTED EXCLAMATION MARK
      AE |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
      AF |  000000BB | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
      B0 |  00002591 | LIGHT SHADE
      B1 |  00002592 | MEDIUM SHADE
      B2 |  00002593 | DARK SHADE
      B3 |  00002502 | BOX DRAWINGS LIGHT VERTICAL
      B4 |  00002524 | BOX DRAWINGS LIGHT VERTICAL AND LEFT
      B5 |  00002561 | BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
      B6 |  00002562 | BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
      B7 |  00002556 | BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
      B8 |  00002555 | BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
      B9 |  00002563 | BOX DRAWINGS DOUBLE VERTICAL AND LEFT
      BA |  00002551 | BOX DRAWINGS DOUBLE VERTICAL
      BB |  00002557 | BOX DRAWINGS DOUBLE DOWN AND LEFT
      BC |  0000255D | BOX DRAWINGS DOUBLE UP AND LEFT
      BD |  0000255C | BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
      BE |  0000255B | BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
      BF |  00002510 | BOX DRAWINGS LIGHT DOWN AND LEFT
      C0 |  00002514 | BOX DRAWINGS LIGHT UP AND RIGHT
      C1 |  00002534 | BOX DRAWINGS LIGHT UP AND HORIZONTAL
      C2 |  0000252C | BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
      C3 |  0000251C | BOX DRAWINGS LIGHT VERTICAL AND RIGHT
      C4 |  00002500 | BOX DRAWINGS LIGHT HORIZONTAL
      C5 |  0000253C | BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
      C6 |  0000255E | BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
      C7 |  0000255F | BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
      C8 |  0000255A | BOX DRAWINGS DOUBLE UP AND RIGHT
      C9 |  00002554 | BOX DRAWINGS DOUBLE DOWN AND RIGHT
      CA |  00002569 | BOX DRAWINGS DOUBLE UP AND HORIZONTAL
      CB |  00002566 | BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
      CC |  00002560 | BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
      CD |  00002550 | BOX DRAWINGS DOUBLE HORIZONTAL
      CE |  0000256C | BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
      CF |  00002567 | BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
      D0 |  00002568 | BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
      D1 |  00002564 | BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
      D2 |  00002565 | BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
      D3 |  00002559 | BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
      D4 |  00002558 | BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
      D5 |  00002552 | BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
      D6 |  00002553 | BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
      D7 |  0000256B | BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
      D8 |  0000256A | BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
      D9 |  00002518 | BOX DRAWINGS LIGHT UP AND LEFT
      DA |  0000250C | BOX DRAWINGS LIGHT DOWN AND RIGHT
      DB |  00002588 | FULL BLOCK
      DC |  00002584 | LOWER HALF BLOCK
      DD |  0000258C | LEFT HALF BLOCK
      DE |  00002590 | RIGHT HALF BLOCK
      DF |  00002580 | UPPER HALF BLOCK
      E0 |  000003B1 | GREEK SMALL LETTER ALPHA
      E1 |  000000DF | LATIN SMALL LETTER SHARP S (German)
      E2 |  00000393 | GREEK CAPITAL LETTER GAMMA
      E3 |  000003C0 | GREEK SMALL LETTER PI
      E4 |  000003A3 | GREEK CAPITAL LETTER SIGMA
      E5 |  000003C3 | GREEK SMALL LETTER SIGMA
      E6 |  000000B5 | MICRO SIGN
      E7 |  000003C4 | GREEK SMALL LETTER TAU
      E8 |  000003A6 | GREEK CAPITAL LETTER PHI
      E9 |  00000398 | GREEK CAPITAL LETTER THETA
      EA |  000003A9 | GREEK CAPITAL LETTER OMEGA
      EB |  000003B4 | GREEK SMALL LETTER DELTA
      EC |  0000221E | INFINITY
      ED |  000003C6 | GREEK SMALL LETTER PHI
      EE |  000003B5 | GREEK SMALL LETTER EPSILON
      EF |  00002229 | INTERSECTION
      F0 |  00002261 | IDENTICAL TO
      F1 |  000000B1 | PLUS-MINUS SIGN
      F2 |  00002265 | GREATER-THAN OR EQUAL TO
      F3 |  00002264 | LESS-THAN OR EQUAL TO
      F4 |  00002320 | TOP HALF INTEGRAL
      F5 |  00002321 | BOTTOM HALF INTEGRAL
      F6 |  000000F7 | DIVISION SIGN
      F7 |  00002248 | ALMOST EQUAL TO
      F8 |  000000B0 | DEGREE SIGN
      F9 |  00002219 | BULLET OPERATOR
      FA |  000000B7 | MIDDLE DOT
      FB |  0000221A | SQUARE ROOT
      FC |  0000207F | SUPERSCRIPT LATIN SMALL LETTER N
      FD |  000000B2 | SUPERSCRIPT TWO
      FE |  000025A0 | BLACK SQUARE
      FF |  000000A0 | NO-BREAK SPACE
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_IBM861

    $main::fatpacked{"Locale/RecodeData/IBM862.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_IBM862';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for IBM862.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::IBM862;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0x05d0,
      0x05d1,
      0x05d2,
      0x05d3,
      0x05d4,
      0x05d5,
      0x05d6,
      0x05d7,
      0x05d8,
      0x05d9,
      0x05da,
      0x05db,
      0x05dc,
      0x05dd,
      0x05de,
      0x05df,
      0x05e0,
      0x05e1,
      0x05e2,
      0x05e3,
      0x05e4,
      0x05e5,
      0x05e6,
      0x05e7,
      0x05e8,
      0x05e9,
      0x05ea,
      0x00a2,
      0x00a3,
      0x00a5,
      0x20a7,
      0x0192,
      0x00e1,
      0x00ed,
      0x00f3,
      0x00fa,
      0x00f1,
      0x00d1,
      0x00aa,
      0x00ba,
      0x00bf,
      0x2310,
      0x00ac,
      0x00bd,
      0x00bc,
      0x00a1,
      0x00ab,
      0x00bb,
      0x2591,
      0x2592,
      0x2593,
      0x2502,
      0x2524,
      0x2561,
      0x2562,
      0x2556,
      0x2555,
      0x2563,
      0x2551,
      0x2557,
      0x255d,
      0x255c,
      0x255b,
      0x2510,
      0x2514,
      0x2534,
      0x252c,
      0x251c,
      0x2500,
      0x253c,
      0x255e,
      0x255f,
      0x255a,
      0x2554,
      0x2569,
      0x2566,
      0x2560,
      0x2550,
      0x256c,
      0x2567,
      0x2568,
      0x2564,
      0x2565,
      0x2559,
      0x2558,
      0x2552,
      0x2553,
      0x256b,
      0x256a,
      0x2518,
      0x250c,
      0x2588,
      0x2584,
      0x258c,
      0x2590,
      0x2580,
      0x03b1,
      0x00df,
      0x0393,
      0x03c0,
      0x03a3,
      0x03c3,
      0x00b5,
      0x03c4,
      0x03a6,
      0x0398,
      0x03a9,
      0x03b4,
      0x221e,
      0x03c6,
      0x03b5,
      0x2229,
      0x2261,
      0x00b1,
      0x2265,
      0x2264,
      0x2320,
      0x2321,
      0x00f7,
      0x2248,
      0x00b0,
      0x2219,
      0x00b7,
      0x221a,
      0x207f,
      0x00b2,
      0x25a0,
      0x00a0,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xd7\x90",
      "\xd7\x91",
      "\xd7\x92",
      "\xd7\x93",
      "\xd7\x94",
      "\xd7\x95",
      "\xd7\x96",
      "\xd7\x97",
      "\xd7\x98",
      "\xd7\x99",
      "\xd7\x9a",
      "\xd7\x9b",
      "\xd7\x9c",
      "\xd7\x9d",
      "\xd7\x9e",
      "\xd7\x9f",
      "\xd7\xa0",
      "\xd7\xa1",
      "\xd7\xa2",
      "\xd7\xa3",
      "\xd7\xa4",
      "\xd7\xa5",
      "\xd7\xa6",
      "\xd7\xa7",
      "\xd7\xa8",
      "\xd7\xa9",
      "\xd7\xaa",
      "\xc2\xa2",
      "\xc2\xa3",
      "\xc2\xa5",
      "\xe2\x82\xa7",
      "\xc6\x92",
      "\xc3\xa1",
      "\xc3\xad",
      "\xc3\xb3",
      "\xc3\xba",
      "\xc3\xb1",
      "\xc3\x91",
      "\xc2\xaa",
      "\xc2\xba",
      "\xc2\xbf",
      "\xe2\x8c\x90",
      "\xc2\xac",
      "\xc2\xbd",
      "\xc2\xbc",
      "\xc2\xa1",
      "\xc2\xab",
      "\xc2\xbb",
      "\xe2\x96\x91",
      "\xe2\x96\x92",
      "\xe2\x96\x93",
      "\xe2\x94\x82",
      "\xe2\x94\xa4",
      "\xe2\x95\xa1",
      "\xe2\x95\xa2",
      "\xe2\x95\x96",
      "\xe2\x95\x95",
      "\xe2\x95\xa3",
      "\xe2\x95\x91",
      "\xe2\x95\x97",
      "\xe2\x95\x9d",
      "\xe2\x95\x9c",
      "\xe2\x95\x9b",
      "\xe2\x94\x90",
      "\xe2\x94\x94",
      "\xe2\x94\xb4",
      "\xe2\x94\xac",
      "\xe2\x94\x9c",
      "\xe2\x94\x80",
      "\xe2\x94\xbc",
      "\xe2\x95\x9e",
      "\xe2\x95\x9f",
      "\xe2\x95\x9a",
      "\xe2\x95\x94",
      "\xe2\x95\xa9",
      "\xe2\x95\xa6",
      "\xe2\x95\xa0",
      "\xe2\x95\x90",
      "\xe2\x95\xac",
      "\xe2\x95\xa7",
      "\xe2\x95\xa8",
      "\xe2\x95\xa4",
      "\xe2\x95\xa5",
      "\xe2\x95\x99",
      "\xe2\x95\x98",
      "\xe2\x95\x92",
      "\xe2\x95\x93",
      "\xe2\x95\xab",
      "\xe2\x95\xaa",
      "\xe2\x94\x98",
      "\xe2\x94\x8c",
      "\xe2\x96\x88",
      "\xe2\x96\x84",
      "\xe2\x96\x8c",
      "\xe2\x96\x90",
      "\xe2\x96\x80",
      "\xce\xb1",
      "\xc3\x9f",
      "\xce\x93",
      "\xcf\x80",
      "\xce\xa3",
      "\xcf\x83",
      "\xc2\xb5",
      "\xcf\x84",
      "\xce\xa6",
      "\xce\x98",
      "\xce\xa9",
      "\xce\xb4",
      "\xe2\x88\x9e",
      "\xcf\x86",
      "\xce\xb5",
      "\xe2\x88\xa9",
      "\xe2\x89\xa1",
      "\xc2\xb1",
      "\xe2\x89\xa5",
      "\xe2\x89\xa4",
      "\xe2\x8c\xa0",
      "\xe2\x8c\xa1",
      "\xc3\xb7",
      "\xe2\x89\x88",
      "\xc2\xb0",
      "\xe2\x88\x99",
      "\xc2\xb7",
      "\xe2\x88\x9a",
      "\xe2\x81\xbf",
      "\xc2\xb2",
      "\xe2\x96\xa0",
      "\xc2\xa0",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x000000a0 => "\xff",
      0x000000a1 => "\xad",
      0x000000a2 => "\x9b",
      0x000000a3 => "\x9c",
      0x000000a5 => "\x9d",
      0x000000aa => "\xa6",
      0x000000ab => "\xae",
      0x000000ac => "\xaa",
      0x000000b0 => "\xf8",
      0x000000b1 => "\xf1",
      0x000000b2 => "\xfd",
      0x000000b5 => "\xe6",
      0x000000b7 => "\xfa",
      0x000000ba => "\xa7",
      0x000000bb => "\xaf",
      0x000000bc => "\xac",
      0x000000bd => "\xab",
      0x000000bf => "\xa8",
      0x000000d1 => "\xa5",
      0x000000df => "\xe1",
      0x000000e1 => "\xa0",
      0x000000ed => "\xa1",
      0x000000f1 => "\xa4",
      0x000000f3 => "\xa2",
      0x000000f7 => "\xf6",
      0x000000fa => "\xa3",
      0x00000192 => "\x9f",
      0x00000393 => "\xe2",
      0x00000398 => "\xe9",
      0x000003a3 => "\xe4",
      0x000003a6 => "\xe8",
      0x000003a9 => "\xea",
      0x000003b1 => "\xe0",
      0x000003b4 => "\xeb",
      0x000003b5 => "\xee",
      0x000003c0 => "\xe3",
      0x000003c3 => "\xe5",
      0x000003c4 => "\xe7",
      0x000003c6 => "\xed",
      0x000005d0 => "\x80",
      0x000005d1 => "\x81",
      0x000005d2 => "\x82",
      0x000005d3 => "\x83",
      0x000005d4 => "\x84",
      0x000005d5 => "\x85",
      0x000005d6 => "\x86",
      0x000005d7 => "\x87",
      0x000005d8 => "\x88",
      0x000005d9 => "\x89",
      0x000005da => "\x8a",
      0x000005db => "\x8b",
      0x000005dc => "\x8c",
      0x000005dd => "\x8d",
      0x000005de => "\x8e",
      0x000005df => "\x8f",
      0x000005e0 => "\x90",
      0x000005e1 => "\x91",
      0x000005e2 => "\x92",
      0x000005e3 => "\x93",
      0x000005e4 => "\x94",
      0x000005e5 => "\x95",
      0x000005e6 => "\x96",
      0x000005e7 => "\x97",
      0x000005e8 => "\x98",
      0x000005e9 => "\x99",
      0x000005ea => "\x9a",
      0x0000207f => "\xfc",
      0x000020a7 => "\x9e",
      0x00002219 => "\xf9",
      0x0000221a => "\xfb",
      0x0000221e => "\xec",
      0x00002229 => "\xef",
      0x00002248 => "\xf7",
      0x00002261 => "\xf0",
      0x00002264 => "\xf3",
      0x00002265 => "\xf2",
      0x00002310 => "\xa9",
      0x00002320 => "\xf4",
      0x00002321 => "\xf5",
      0x00002500 => "\xc4",
      0x00002502 => "\xb3",
      0x0000250c => "\xda",
      0x00002510 => "\xbf",
      0x00002514 => "\xc0",
      0x00002518 => "\xd9",
      0x0000251c => "\xc3",
      0x00002524 => "\xb4",
      0x0000252c => "\xc2",
      0x00002534 => "\xc1",
      0x0000253c => "\xc5",
      0x00002550 => "\xcd",
      0x00002551 => "\xba",
      0x00002552 => "\xd5",
      0x00002553 => "\xd6",
      0x00002554 => "\xc9",
      0x00002555 => "\xb8",
      0x00002556 => "\xb7",
      0x00002557 => "\xbb",
      0x00002558 => "\xd4",
      0x00002559 => "\xd3",
      0x0000255a => "\xc8",
      0x0000255b => "\xbe",
      0x0000255c => "\xbd",
      0x0000255d => "\xbc",
      0x0000255e => "\xc6",
      0x0000255f => "\xc7",
      0x00002560 => "\xcc",
      0x00002561 => "\xb5",
      0x00002562 => "\xb6",
      0x00002563 => "\xb9",
      0x00002564 => "\xd1",
      0x00002565 => "\xd2",
      0x00002566 => "\xcb",
      0x00002567 => "\xcf",
      0x00002568 => "\xd0",
      0x00002569 => "\xca",
      0x0000256a => "\xd8",
      0x0000256b => "\xd7",
      0x0000256c => "\xce",
      0x00002580 => "\xdf",
      0x00002584 => "\xdc",
      0x00002588 => "\xdb",
      0x0000258c => "\xdd",
      0x00002590 => "\xde",
      0x00002591 => "\xb0",
      0x00002592 => "\xb1",
      0x00002593 => "\xb2",
      0x000025a0 => "\xfe",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::IBM862 - Conversion routines for IBM862
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for IBM862.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: IBM NLS RM Vol2 SE09-8002-01, March 1990
   alias CP862
   alias 862
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE (DEL)
      80 |  000005D0 | HEBREW LETTER ALEF
      81 |  000005D1 | HEBREW LETTER BET
      82 |  000005D2 | HEBREW LETTER GIMEL
      83 |  000005D3 | HEBREW LETTER DALET
      84 |  000005D4 | HEBREW LETTER HE
      85 |  000005D5 | HEBREW LETTER VAV
      86 |  000005D6 | HEBREW LETTER ZAYIN
      87 |  000005D7 | HEBREW LETTER HET
      88 |  000005D8 | HEBREW LETTER TET
      89 |  000005D9 | HEBREW LETTER YOD
      8A |  000005DA | HEBREW LETTER FINAL KAF
      8B |  000005DB | HEBREW LETTER KAF
      8C |  000005DC | HEBREW LETTER LAMED
      8D |  000005DD | HEBREW LETTER FINAL MEM
      8E |  000005DE | HEBREW LETTER MEM
      8F |  000005DF | HEBREW LETTER FINAL NUN
      90 |  000005E0 | HEBREW LETTER NUN
      91 |  000005E1 | HEBREW LETTER SAMEKH
      92 |  000005E2 | HEBREW LETTER AYIN
      93 |  000005E3 | HEBREW LETTER FINAL PE
      94 |  000005E4 | HEBREW LETTER PE
      95 |  000005E5 | HEBREW LETTER FINAL TSADI
      96 |  000005E6 | HEBREW LETTER TSADI
      97 |  000005E7 | HEBREW LETTER QOF
      98 |  000005E8 | HEBREW LETTER RESH
      99 |  000005E9 | HEBREW LETTER SHIN
      9A |  000005EA | HEBREW LETTER TAV
      9B |  000000A2 | CENT SIGN
      9C |  000000A3 | POUND SIGN
      9D |  000000A5 | YEN SIGN
      9E |  000020A7 | PESETA SIGN
      9F |  00000192 | LATIN SMALL LETTER F WITH HOOK
      A0 |  000000E1 | LATIN SMALL LETTER A WITH ACUTE
      A1 |  000000ED | LATIN SMALL LETTER I WITH ACUTE
      A2 |  000000F3 | LATIN SMALL LETTER O WITH ACUTE
      A3 |  000000FA | LATIN SMALL LETTER U WITH ACUTE
      A4 |  000000F1 | LATIN SMALL LETTER N WITH TILDE
      A5 |  000000D1 | LATIN CAPITAL LETTER N WITH TILDE
      A6 |  000000AA | FEMININE ORDINAL INDICATOR
      A7 |  000000BA | MASCULINE ORDINAL INDICATOR
      A8 |  000000BF | INVERTED QUESTION MARK
      A9 |  00002310 | REVERSED NOT SIGN
      AA |  000000AC | NOT SIGN
      AB |  000000BD | VULGAR FRACTION ONE HALF
      AC |  000000BC | VULGAR FRACTION ONE QUARTER
      AD |  000000A1 | INVERTED EXCLAMATION MARK
      AE |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
      AF |  000000BB | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
      B0 |  00002591 | LIGHT SHADE
      B1 |  00002592 | MEDIUM SHADE
      B2 |  00002593 | DARK SHADE
      B3 |  00002502 | BOX DRAWINGS LIGHT VERTICAL
      B4 |  00002524 | BOX DRAWINGS LIGHT VERTICAL AND LEFT
      B5 |  00002561 | BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
      B6 |  00002562 | BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
      B7 |  00002556 | BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
      B8 |  00002555 | BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
      B9 |  00002563 | BOX DRAWINGS DOUBLE VERTICAL AND LEFT
      BA |  00002551 | BOX DRAWINGS DOUBLE VERTICAL
      BB |  00002557 | BOX DRAWINGS DOUBLE DOWN AND LEFT
      BC |  0000255D | BOX DRAWINGS DOUBLE UP AND LEFT
      BD |  0000255C | BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
      BE |  0000255B | BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
      BF |  00002510 | BOX DRAWINGS LIGHT DOWN AND LEFT
      C0 |  00002514 | BOX DRAWINGS LIGHT UP AND RIGHT
      C1 |  00002534 | BOX DRAWINGS LIGHT UP AND HORIZONTAL
      C2 |  0000252C | BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
      C3 |  0000251C | BOX DRAWINGS LIGHT VERTICAL AND RIGHT
      C4 |  00002500 | BOX DRAWINGS LIGHT HORIZONTAL
      C5 |  0000253C | BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
      C6 |  0000255E | BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
      C7 |  0000255F | BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
      C8 |  0000255A | BOX DRAWINGS DOUBLE UP AND RIGHT
      C9 |  00002554 | BOX DRAWINGS DOUBLE DOWN AND RIGHT
      CA |  00002569 | BOX DRAWINGS DOUBLE UP AND HORIZONTAL
      CB |  00002566 | BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
      CC |  00002560 | BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
      CD |  00002550 | BOX DRAWINGS DOUBLE HORIZONTAL
      CE |  0000256C | BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
      CF |  00002567 | BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
      D0 |  00002568 | BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
      D1 |  00002564 | BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
      D2 |  00002565 | BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
      D3 |  00002559 | BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
      D4 |  00002558 | BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
      D5 |  00002552 | BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
      D6 |  00002553 | BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
      D7 |  0000256B | BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
      D8 |  0000256A | BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
      D9 |  00002518 | BOX DRAWINGS LIGHT UP AND LEFT
      DA |  0000250C | BOX DRAWINGS LIGHT DOWN AND RIGHT
      DB |  00002588 | FULL BLOCK
      DC |  00002584 | LOWER HALF BLOCK
      DD |  0000258C | LEFT HALF BLOCK
      DE |  00002590 | RIGHT HALF BLOCK
      DF |  00002580 | UPPER HALF BLOCK
      E0 |  000003B1 | GREEK SMALL LETTER ALPHA
      E1 |  000000DF | LATIN SMALL LETTER SHARP S (German)
      E2 |  00000393 | GREEK CAPITAL LETTER GAMMA
      E3 |  000003C0 | GREEK SMALL LETTER PI
      E4 |  000003A3 | GREEK CAPITAL LETTER SIGMA
      E5 |  000003C3 | GREEK SMALL LETTER SIGMA
      E6 |  000000B5 | MICRO SIGN
      E7 |  000003C4 | GREEK SMALL LETTER TAU
      E8 |  000003A6 | GREEK CAPITAL LETTER PHI
      E9 |  00000398 | GREEK CAPITAL LETTER THETA
      EA |  000003A9 | GREEK CAPITAL LETTER OMEGA
      EB |  000003B4 | GREEK SMALL LETTER DELTA
      EC |  0000221E | INFINITY
      ED |  000003C6 | GREEK SMALL LETTER PHI
      EE |  000003B5 | GREEK SMALL LETTER EPSILON
      EF |  00002229 | INTERSECTION
      F0 |  00002261 | IDENTICAL TO
      F1 |  000000B1 | PLUS-MINUS SIGN
      F2 |  00002265 | GREATER-THAN OR EQUAL TO
      F3 |  00002264 | LESS-THAN OR EQUAL TO
      F4 |  00002320 | TOP HALF INTEGRAL
      F5 |  00002321 | BOTTOM HALF INTEGRAL
      F6 |  000000F7 | DIVISION SIGN
      F7 |  00002248 | ALMOST EQUAL TO
      F8 |  000000B0 | DEGREE SIGN
      F9 |  00002219 | BULLET OPERATOR
      FA |  000000B7 | MIDDLE DOT
      FB |  0000221A | SQUARE ROOT
      FC |  0000207F | SUPERSCRIPT LATIN SMALL LETTER N
      FD |  000000B2 | SUPERSCRIPT TWO
      FE |  000025A0 | BLACK SQUARE
      FF |  000000A0 | NO-BREAK SPACE
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_IBM862

    $main::fatpacked{"Locale/RecodeData/IBM863.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_IBM863';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for IBM863.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::IBM863;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0x00c7,
      0x00fc,
      0x00e9,
      0x00e2,
      0x00c2,
      0x00e0,
      0x00b6,
      0x00e7,
      0x00ea,
      0x00eb,
      0x00e8,
      0x00ef,
      0x00ee,
      0x2017,
      0x00c0,
      0x00a7,
      0x00c9,
      0x00c8,
      0x00ca,
      0x00f4,
      0x00cb,
      0x00cf,
      0x00fb,
      0x00f9,
      0x00a4,
      0x00d4,
      0x00dc,
      0x00a2,
      0x00a3,
      0x00d9,
      0x00db,
      0x0192,
      0x00a6,
      0x00b4,
      0x00f3,
      0x00fa,
      0x00a8,
      0x00b8,
      0x00b3,
      0x00af,
      0x00ce,
      0x2310,
      0x00ac,
      0x00bd,
      0x00bc,
      0x00be,
      0x00ab,
      0x00bb,
      0x2591,
      0x2592,
      0x2593,
      0x2502,
      0x2524,
      0x2561,
      0x2562,
      0x2556,
      0x2555,
      0x2563,
      0x2551,
      0x2557,
      0x255d,
      0x255c,
      0x255b,
      0x2510,
      0x2514,
      0x2534,
      0x252c,
      0x251c,
      0x2500,
      0x253c,
      0x255e,
      0x255f,
      0x255a,
      0x2554,
      0x2569,
      0x2566,
      0x2560,
      0x2550,
      0x256c,
      0x2567,
      0x2568,
      0x2564,
      0x2565,
      0x2559,
      0x2558,
      0x2552,
      0x2553,
      0x256b,
      0x256a,
      0x2518,
      0x250c,
      0x2588,
      0x2584,
      0x258c,
      0x2590,
      0x2580,
      0x03b1,
      0x00df,
      0x0393,
      0x03c0,
      0x03a3,
      0x03c3,
      0x00b5,
      0x03c4,
      0x03a6,
      0x0398,
      0x03a9,
      0x03b4,
      0x221e,
      0x03c6,
      0x03b5,
      0x2229,
      0x2261,
      0x00b1,
      0x2265,
      0x2264,
      0x2320,
      0x2321,
      0x00f7,
      0x2248,
      0x00b0,
      0x2219,
      0x00b7,
      0x221a,
      0x207f,
      0x00b2,
      0x25a0,
      0x00a0,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xc3\x87",
      "\xc3\xbc",
      "\xc3\xa9",
      "\xc3\xa2",
      "\xc3\x82",
      "\xc3\xa0",
      "\xc2\xb6",
      "\xc3\xa7",
      "\xc3\xaa",
      "\xc3\xab",
      "\xc3\xa8",
      "\xc3\xaf",
      "\xc3\xae",
      "\xe2\x80\x97",
      "\xc3\x80",
      "\xc2\xa7",
      "\xc3\x89",
      "\xc3\x88",
      "\xc3\x8a",
      "\xc3\xb4",
      "\xc3\x8b",
      "\xc3\x8f",
      "\xc3\xbb",
      "\xc3\xb9",
      "\xc2\xa4",
      "\xc3\x94",
      "\xc3\x9c",
      "\xc2\xa2",
      "\xc2\xa3",
      "\xc3\x99",
      "\xc3\x9b",
      "\xc6\x92",
      "\xc2\xa6",
      "\xc2\xb4",
      "\xc3\xb3",
      "\xc3\xba",
      "\xc2\xa8",
      "\xc2\xb8",
      "\xc2\xb3",
      "\xc2\xaf",
      "\xc3\x8e",
      "\xe2\x8c\x90",
      "\xc2\xac",
      "\xc2\xbd",
      "\xc2\xbc",
      "\xc2\xbe",
      "\xc2\xab",
      "\xc2\xbb",
      "\xe2\x96\x91",
      "\xe2\x96\x92",
      "\xe2\x96\x93",
      "\xe2\x94\x82",
      "\xe2\x94\xa4",
      "\xe2\x95\xa1",
      "\xe2\x95\xa2",
      "\xe2\x95\x96",
      "\xe2\x95\x95",
      "\xe2\x95\xa3",
      "\xe2\x95\x91",
      "\xe2\x95\x97",
      "\xe2\x95\x9d",
      "\xe2\x95\x9c",
      "\xe2\x95\x9b",
      "\xe2\x94\x90",
      "\xe2\x94\x94",
      "\xe2\x94\xb4",
      "\xe2\x94\xac",
      "\xe2\x94\x9c",
      "\xe2\x94\x80",
      "\xe2\x94\xbc",
      "\xe2\x95\x9e",
      "\xe2\x95\x9f",
      "\xe2\x95\x9a",
      "\xe2\x95\x94",
      "\xe2\x95\xa9",
      "\xe2\x95\xa6",
      "\xe2\x95\xa0",
      "\xe2\x95\x90",
      "\xe2\x95\xac",
      "\xe2\x95\xa7",
      "\xe2\x95\xa8",
      "\xe2\x95\xa4",
      "\xe2\x95\xa5",
      "\xe2\x95\x99",
      "\xe2\x95\x98",
      "\xe2\x95\x92",
      "\xe2\x95\x93",
      "\xe2\x95\xab",
      "\xe2\x95\xaa",
      "\xe2\x94\x98",
      "\xe2\x94\x8c",
      "\xe2\x96\x88",
      "\xe2\x96\x84",
      "\xe2\x96\x8c",
      "\xe2\x96\x90",
      "\xe2\x96\x80",
      "\xce\xb1",
      "\xc3\x9f",
      "\xce\x93",
      "\xcf\x80",
      "\xce\xa3",
      "\xcf\x83",
      "\xc2\xb5",
      "\xcf\x84",
      "\xce\xa6",
      "\xce\x98",
      "\xce\xa9",
      "\xce\xb4",
      "\xe2\x88\x9e",
      "\xcf\x86",
      "\xce\xb5",
      "\xe2\x88\xa9",
      "\xe2\x89\xa1",
      "\xc2\xb1",
      "\xe2\x89\xa5",
      "\xe2\x89\xa4",
      "\xe2\x8c\xa0",
      "\xe2\x8c\xa1",
      "\xc3\xb7",
      "\xe2\x89\x88",
      "\xc2\xb0",
      "\xe2\x88\x99",
      "\xc2\xb7",
      "\xe2\x88\x9a",
      "\xe2\x81\xbf",
      "\xc2\xb2",
      "\xe2\x96\xa0",
      "\xc2\xa0",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x000000a0 => "\xff",
      0x000000a2 => "\x9b",
      0x000000a3 => "\x9c",
      0x000000a4 => "\x98",
      0x000000a6 => "\xa0",
      0x000000a7 => "\x8f",
      0x000000a8 => "\xa4",
      0x000000ab => "\xae",
      0x000000ac => "\xaa",
      0x000000af => "\xa7",
      0x000000b0 => "\xf8",
      0x000000b1 => "\xf1",
      0x000000b2 => "\xfd",
      0x000000b3 => "\xa6",
      0x000000b4 => "\xa1",
      0x000000b5 => "\xe6",
      0x000000b6 => "\x86",
      0x000000b7 => "\xfa",
      0x000000b8 => "\xa5",
      0x000000bb => "\xaf",
      0x000000bc => "\xac",
      0x000000bd => "\xab",
      0x000000be => "\xad",
      0x000000c0 => "\x8e",
      0x000000c2 => "\x84",
      0x000000c7 => "\x80",
      0x000000c8 => "\x91",
      0x000000c9 => "\x90",
      0x000000ca => "\x92",
      0x000000cb => "\x94",
      0x000000ce => "\xa8",
      0x000000cf => "\x95",
      0x000000d4 => "\x99",
      0x000000d9 => "\x9d",
      0x000000db => "\x9e",
      0x000000dc => "\x9a",
      0x000000df => "\xe1",
      0x000000e0 => "\x85",
      0x000000e2 => "\x83",
      0x000000e7 => "\x87",
      0x000000e8 => "\x8a",
      0x000000e9 => "\x82",
      0x000000ea => "\x88",
      0x000000eb => "\x89",
      0x000000ee => "\x8c",
      0x000000ef => "\x8b",
      0x000000f3 => "\xa2",
      0x000000f4 => "\x93",
      0x000000f7 => "\xf6",
      0x000000f9 => "\x97",
      0x000000fa => "\xa3",
      0x000000fb => "\x96",
      0x000000fc => "\x81",
      0x00000192 => "\x9f",
      0x00000393 => "\xe2",
      0x00000398 => "\xe9",
      0x000003a3 => "\xe4",
      0x000003a6 => "\xe8",
      0x000003a9 => "\xea",
      0x000003b1 => "\xe0",
      0x000003b4 => "\xeb",
      0x000003b5 => "\xee",
      0x000003c0 => "\xe3",
      0x000003c3 => "\xe5",
      0x000003c4 => "\xe7",
      0x000003c6 => "\xed",
      0x00002017 => "\x8d",
      0x0000207f => "\xfc",
      0x00002219 => "\xf9",
      0x0000221a => "\xfb",
      0x0000221e => "\xec",
      0x00002229 => "\xef",
      0x00002248 => "\xf7",
      0x00002261 => "\xf0",
      0x00002264 => "\xf3",
      0x00002265 => "\xf2",
      0x00002310 => "\xa9",
      0x00002320 => "\xf4",
      0x00002321 => "\xf5",
      0x00002500 => "\xc4",
      0x00002502 => "\xb3",
      0x0000250c => "\xda",
      0x00002510 => "\xbf",
      0x00002514 => "\xc0",
      0x00002518 => "\xd9",
      0x0000251c => "\xc3",
      0x00002524 => "\xb4",
      0x0000252c => "\xc2",
      0x00002534 => "\xc1",
      0x0000253c => "\xc5",
      0x00002550 => "\xcd",
      0x00002551 => "\xba",
      0x00002552 => "\xd5",
      0x00002553 => "\xd6",
      0x00002554 => "\xc9",
      0x00002555 => "\xb8",
      0x00002556 => "\xb7",
      0x00002557 => "\xbb",
      0x00002558 => "\xd4",
      0x00002559 => "\xd3",
      0x0000255a => "\xc8",
      0x0000255b => "\xbe",
      0x0000255c => "\xbd",
      0x0000255d => "\xbc",
      0x0000255e => "\xc6",
      0x0000255f => "\xc7",
      0x00002560 => "\xcc",
      0x00002561 => "\xb5",
      0x00002562 => "\xb6",
      0x00002563 => "\xb9",
      0x00002564 => "\xd1",
      0x00002565 => "\xd2",
      0x00002566 => "\xcb",
      0x00002567 => "\xcf",
      0x00002568 => "\xd0",
      0x00002569 => "\xca",
      0x0000256a => "\xd8",
      0x0000256b => "\xd7",
      0x0000256c => "\xce",
      0x00002580 => "\xdf",
      0x00002584 => "\xdc",
      0x00002588 => "\xdb",
      0x0000258c => "\xdd",
      0x00002590 => "\xde",
      0x00002591 => "\xb0",
      0x00002592 => "\xb1",
      0x00002593 => "\xb2",
      0x000025a0 => "\xfe",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::IBM863 - Conversion routines for IBM863
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for IBM863.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: IBM Keyboard layouts and code pages, PN 07G4586 June 1991
   alias CP863
   alias 863
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE (DEL)
      80 |  000000C7 | LATIN CAPITAL LETTER C WITH CEDILLA
      81 |  000000FC | LATIN SMALL LETTER U WITH DIAERESIS
      82 |  000000E9 | LATIN SMALL LETTER E WITH ACUTE
      83 |  000000E2 | LATIN SMALL LETTER A WITH CIRCUMFLEX
      84 |  000000C2 | LATIN CAPITAL LETTER A WITH CIRCUMFLEX
      85 |  000000E0 | LATIN SMALL LETTER A WITH GRAVE
      86 |  000000B6 | PILCROW SIGN
      87 |  000000E7 | LATIN SMALL LETTER C WITH CEDILLA
      88 |  000000EA | LATIN SMALL LETTER E WITH CIRCUMFLEX
      89 |  000000EB | LATIN SMALL LETTER E WITH DIAERESIS
      8A |  000000E8 | LATIN SMALL LETTER E WITH GRAVE
      8B |  000000EF | LATIN SMALL LETTER I WITH DIAERESIS
      8C |  000000EE | LATIN SMALL LETTER I WITH CIRCUMFLEX
      8D |  00002017 | DOUBLE LOW LINE
      8E |  000000C0 | LATIN CAPITAL LETTER A WITH GRAVE
      8F |  000000A7 | SECTION SIGN
      90 |  000000C9 | LATIN CAPITAL LETTER E WITH ACUTE
      91 |  000000C8 | LATIN CAPITAL LETTER E WITH GRAVE
      92 |  000000CA | LATIN CAPITAL LETTER E WITH CIRCUMFLEX
      93 |  000000F4 | LATIN SMALL LETTER O WITH CIRCUMFLEX
      94 |  000000CB | LATIN CAPITAL LETTER E WITH DIAERESIS
      95 |  000000CF | LATIN CAPITAL LETTER I WITH DIAERESIS
      96 |  000000FB | LATIN SMALL LETTER U WITH CIRCUMFLEX
      97 |  000000F9 | LATIN SMALL LETTER U WITH GRAVE
      98 |  000000A4 | CURRENCY SIGN
      99 |  000000D4 | LATIN CAPITAL LETTER O WITH CIRCUMFLEX
      9A |  000000DC | LATIN CAPITAL LETTER U WITH DIAERESIS
      9B |  000000A2 | CENT SIGN
      9C |  000000A3 | POUND SIGN
      9D |  000000D9 | LATIN CAPITAL LETTER U WITH GRAVE
      9E |  000000DB | LATIN CAPITAL LETTER U WITH CIRCUMFLEX
      9F |  00000192 | LATIN SMALL LETTER F WITH HOOK
      A0 |  000000A6 | BROKEN BAR
      A1 |  000000B4 | ACUTE ACCENT
      A2 |  000000F3 | LATIN SMALL LETTER O WITH ACUTE
      A3 |  000000FA | LATIN SMALL LETTER U WITH ACUTE
      A4 |  000000A8 | DIAERESIS
      A5 |  000000B8 | CEDILLA
      A6 |  000000B3 | SUPERSCRIPT THREE
      A7 |  000000AF | MACRON
      A8 |  000000CE | LATIN CAPITAL LETTER I WITH CIRCUMFLEX
      A9 |  00002310 | REVERSED NOT SIGN
      AA |  000000AC | NOT SIGN
      AB |  000000BD | VULGAR FRACTION ONE HALF
      AC |  000000BC | VULGAR FRACTION ONE QUARTER
      AD |  000000BE | VULGAR FRACTION THREE QUARTERS
      AE |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
      AF |  000000BB | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
      B0 |  00002591 | LIGHT SHADE
      B1 |  00002592 | MEDIUM SHADE
      B2 |  00002593 | DARK SHADE
      B3 |  00002502 | BOX DRAWINGS LIGHT VERTICAL
      B4 |  00002524 | BOX DRAWINGS LIGHT VERTICAL AND LEFT
      B5 |  00002561 | BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
      B6 |  00002562 | BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
      B7 |  00002556 | BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
      B8 |  00002555 | BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
      B9 |  00002563 | BOX DRAWINGS DOUBLE VERTICAL AND LEFT
      BA |  00002551 | BOX DRAWINGS DOUBLE VERTICAL
      BB |  00002557 | BOX DRAWINGS DOUBLE DOWN AND LEFT
      BC |  0000255D | BOX DRAWINGS DOUBLE UP AND LEFT
      BD |  0000255C | BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
      BE |  0000255B | BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
      BF |  00002510 | BOX DRAWINGS LIGHT DOWN AND LEFT
      C0 |  00002514 | BOX DRAWINGS LIGHT UP AND RIGHT
      C1 |  00002534 | BOX DRAWINGS LIGHT UP AND HORIZONTAL
      C2 |  0000252C | BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
      C3 |  0000251C | BOX DRAWINGS LIGHT VERTICAL AND RIGHT
      C4 |  00002500 | BOX DRAWINGS LIGHT HORIZONTAL
      C5 |  0000253C | BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
      C6 |  0000255E | BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
      C7 |  0000255F | BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
      C8 |  0000255A | BOX DRAWINGS DOUBLE UP AND RIGHT
      C9 |  00002554 | BOX DRAWINGS DOUBLE DOWN AND RIGHT
      CA |  00002569 | BOX DRAWINGS DOUBLE UP AND HORIZONTAL
      CB |  00002566 | BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
      CC |  00002560 | BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
      CD |  00002550 | BOX DRAWINGS DOUBLE HORIZONTAL
      CE |  0000256C | BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
      CF |  00002567 | BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
      D0 |  00002568 | BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
      D1 |  00002564 | BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
      D2 |  00002565 | BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
      D3 |  00002559 | BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
      D4 |  00002558 | BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
      D5 |  00002552 | BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
      D6 |  00002553 | BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
      D7 |  0000256B | BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
      D8 |  0000256A | BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
      D9 |  00002518 | BOX DRAWINGS LIGHT UP AND LEFT
      DA |  0000250C | BOX DRAWINGS LIGHT DOWN AND RIGHT
      DB |  00002588 | FULL BLOCK
      DC |  00002584 | LOWER HALF BLOCK
      DD |  0000258C | LEFT HALF BLOCK
      DE |  00002590 | RIGHT HALF BLOCK
      DF |  00002580 | UPPER HALF BLOCK
      E0 |  000003B1 | GREEK SMALL LETTER ALPHA
      E1 |  000000DF | LATIN SMALL LETTER SHARP S (German)
      E2 |  00000393 | GREEK CAPITAL LETTER GAMMA
      E3 |  000003C0 | GREEK SMALL LETTER PI
      E4 |  000003A3 | GREEK CAPITAL LETTER SIGMA
      E5 |  000003C3 | GREEK SMALL LETTER SIGMA
      E6 |  000000B5 | MICRO SIGN
      E7 |  000003C4 | GREEK SMALL LETTER TAU
      E8 |  000003A6 | GREEK CAPITAL LETTER PHI
      E9 |  00000398 | GREEK CAPITAL LETTER THETA
      EA |  000003A9 | GREEK CAPITAL LETTER OMEGA
      EB |  000003B4 | GREEK SMALL LETTER DELTA
      EC |  0000221E | INFINITY
      ED |  000003C6 | GREEK SMALL LETTER PHI
      EE |  000003B5 | GREEK SMALL LETTER EPSILON
      EF |  00002229 | INTERSECTION
      F0 |  00002261 | IDENTICAL TO
      F1 |  000000B1 | PLUS-MINUS SIGN
      F2 |  00002265 | GREATER-THAN OR EQUAL TO
      F3 |  00002264 | LESS-THAN OR EQUAL TO
      F4 |  00002320 | TOP HALF INTEGRAL
      F5 |  00002321 | BOTTOM HALF INTEGRAL
      F6 |  000000F7 | DIVISION SIGN
      F7 |  00002248 | ALMOST EQUAL TO
      F8 |  000000B0 | DEGREE SIGN
      F9 |  00002219 | BULLET OPERATOR
      FA |  000000B7 | MIDDLE DOT
      FB |  0000221A | SQUARE ROOT
      FC |  0000207F | SUPERSCRIPT LATIN SMALL LETTER N
      FD |  000000B2 | SUPERSCRIPT TWO
      FE |  000025A0 | BLACK SQUARE
      FF |  000000A0 | NO-BREAK SPACE
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_IBM863

    $main::fatpacked{"Locale/RecodeData/IBM864.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_IBM864';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for IBM864.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::IBM864;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x066a,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0x00b0,
      0x00b7,
      0x2219,
      0x221a,
      0x2592,
      0x2500,
      0x2502,
      0x253c,
      0x2524,
      0x252c,
      0x251c,
      0x2534,
      0x2510,
      0x250c,
      0x2514,
      0x2518,
      0x03b2,
      0x221e,
      0x03c6,
      0x00b1,
      0x00bd,
      0x00bc,
      0x2248,
      0x00ab,
      0x00bb,
      0xfef7,
      0xfef8,
      0xfffd,
      0xfffd,
      0xfefb,
      0xfefc,
      0xfffd,
      0x00a0,
      0x00ad,
      0xfe82,
      0x00a3,
      0x00a4,
      0xfe84,
      0xfffd,
      0xfffd,
      0xfe8e,
      0xfe8f,
      0xfe95,
      0xfe99,
      0x060c,
      0xfe9d,
      0xfea1,
      0xfea5,
      0x0660,
      0x0661,
      0x0662,
      0x0663,
      0x0664,
      0x0665,
      0x0666,
      0x0667,
      0x0668,
      0x0669,
      0xfed1,
      0x061b,
      0xfeb1,
      0xfeb5,
      0xfeb9,
      0x061f,
      0x00a2,
      0xfe80,
      0xfe81,
      0xfe83,
      0xfe85,
      0xfeca,
      0xfe8b,
      0xfe8d,
      0xfe91,
      0xfe93,
      0xfe97,
      0xfe9b,
      0xfe9f,
      0xfea3,
      0xfea7,
      0xfea9,
      0xfeab,
      0xfead,
      0xfeaf,
      0xfeb3,
      0xfeb7,
      0xfebb,
      0xfebf,
      0xfec1,
      0xfec5,
      0xfecb,
      0xfecf,
      0x00a6,
      0x00ac,
      0x00f7,
      0x00d7,
      0xfec9,
      0x0640,
      0xfed3,
      0xfed7,
      0xfedb,
      0xfedf,
      0xfee3,
      0xfee7,
      0xfeeb,
      0xfeed,
      0xfeef,
      0xfef3,
      0xfebd,
      0xfecc,
      0xfece,
      0xfecd,
      0xfee1,
      0xfe7d,
      0x0651,
      0xfee5,
      0xfee9,
      0xfeec,
      0xfef0,
      0xfef2,
      0xfed0,
      0xfed5,
      0xfef5,
      0xfef6,
      0xfedd,
      0xfed9,
      0xfef1,
      0x25a0,
      0xfffd,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\xd9\xaa",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xc2\xb0",
      "\xc2\xb7",
      "\xe2\x88\x99",
      "\xe2\x88\x9a",
      "\xe2\x96\x92",
      "\xe2\x94\x80",
      "\xe2\x94\x82",
      "\xe2\x94\xbc",
      "\xe2\x94\xa4",
      "\xe2\x94\xac",
      "\xe2\x94\x9c",
      "\xe2\x94\xb4",
      "\xe2\x94\x90",
      "\xe2\x94\x8c",
      "\xe2\x94\x94",
      "\xe2\x94\x98",
      "\xce\xb2",
      "\xe2\x88\x9e",
      "\xcf\x86",
      "\xc2\xb1",
      "\xc2\xbd",
      "\xc2\xbc",
      "\xe2\x89\x88",
      "\xc2\xab",
      "\xc2\xbb",
      "\xef\xbb\xb7",
      "\xef\xbb\xb8",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbb\xbb",
      "\xef\xbb\xbc",
      "\xef\xbf\xbd",
      "\xc2\xa0",
      "\xc2\xad",
      "\xef\xba\x82",
      "\xc2\xa3",
      "\xc2\xa4",
      "\xef\xba\x84",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xba\x8e",
      "\xef\xba\x8f",
      "\xef\xba\x95",
      "\xef\xba\x99",
      "\xd8\x8c",
      "\xef\xba\x9d",
      "\xef\xba\xa1",
      "\xef\xba\xa5",
      "\xd9\xa0",
      "\xd9\xa1",
      "\xd9\xa2",
      "\xd9\xa3",
      "\xd9\xa4",
      "\xd9\xa5",
      "\xd9\xa6",
      "\xd9\xa7",
      "\xd9\xa8",
      "\xd9\xa9",
      "\xef\xbb\x91",
      "\xd8\x9b",
      "\xef\xba\xb1",
      "\xef\xba\xb5",
      "\xef\xba\xb9",
      "\xd8\x9f",
      "\xc2\xa2",
      "\xef\xba\x80",
      "\xef\xba\x81",
      "\xef\xba\x83",
      "\xef\xba\x85",
      "\xef\xbb\x8a",
      "\xef\xba\x8b",
      "\xef\xba\x8d",
      "\xef\xba\x91",
      "\xef\xba\x93",
      "\xef\xba\x97",
      "\xef\xba\x9b",
      "\xef\xba\x9f",
      "\xef\xba\xa3",
      "\xef\xba\xa7",
      "\xef\xba\xa9",
      "\xef\xba\xab",
      "\xef\xba\xad",
      "\xef\xba\xaf",
      "\xef\xba\xb3",
      "\xef\xba\xb7",
      "\xef\xba\xbb",
      "\xef\xba\xbf",
      "\xef\xbb\x81",
      "\xef\xbb\x85",
      "\xef\xbb\x8b",
      "\xef\xbb\x8f",
      "\xc2\xa6",
      "\xc2\xac",
      "\xc3\xb7",
      "\xc3\x97",
      "\xef\xbb\x89",
      "\xd9\x80",
      "\xef\xbb\x93",
      "\xef\xbb\x97",
      "\xef\xbb\x9b",
      "\xef\xbb\x9f",
      "\xef\xbb\xa3",
      "\xef\xbb\xa7",
      "\xef\xbb\xab",
      "\xef\xbb\xad",
      "\xef\xbb\xaf",
      "\xef\xbb\xb3",
      "\xef\xba\xbd",
      "\xef\xbb\x8c",
      "\xef\xbb\x8e",
      "\xef\xbb\x8d",
      "\xef\xbb\xa1",
      "\xef\xb9\xbd",
      "\xd9\x91",
      "\xef\xbb\xa5",
      "\xef\xbb\xa9",
      "\xef\xbb\xac",
      "\xef\xbb\xb0",
      "\xef\xbb\xb2",
      "\xef\xbb\x90",
      "\xef\xbb\x95",
      "\xef\xbb\xb5",
      "\xef\xbb\xb6",
      "\xef\xbb\x9d",
      "\xef\xbb\x99",
      "\xef\xbb\xb1",
      "\xe2\x96\xa0",
      "\xef\xbf\xbd",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x000000a0 => "\xa0",
      0x000000a2 => "\xc0",
      0x000000a3 => "\xa3",
      0x000000a4 => "\xa4",
      0x000000a6 => "\xdb",
      0x000000ab => "\x97",
      0x000000ac => "\xdc",
      0x000000ad => "\xa1",
      0x000000b0 => "\x80",
      0x000000b1 => "\x93",
      0x000000b7 => "\x81",
      0x000000bb => "\x98",
      0x000000bc => "\x95",
      0x000000bd => "\x94",
      0x000000d7 => "\xde",
      0x000000f7 => "\xdd",
      0x000003b2 => "\x90",
      0x000003c6 => "\x92",
      0x0000060c => "\xac",
      0x0000061b => "\xbb",
      0x0000061f => "\xbf",
      0x00000640 => "\xe0",
      0x00000651 => "\xf1",
      0x00000660 => "\xb0",
      0x00000661 => "\xb1",
      0x00000662 => "\xb2",
      0x00000663 => "\xb3",
      0x00000664 => "\xb4",
      0x00000665 => "\xb5",
      0x00000666 => "\xb6",
      0x00000667 => "\xb7",
      0x00000668 => "\xb8",
      0x00000669 => "\xb9",
      0x0000066a => "\x25",
      0x00002219 => "\x82",
      0x0000221a => "\x83",
      0x0000221e => "\x91",
      0x00002248 => "\x96",
      0x00002500 => "\x85",
      0x00002502 => "\x86",
      0x0000250c => "\x8d",
      0x00002510 => "\x8c",
      0x00002514 => "\x8e",
      0x00002518 => "\x8f",
      0x0000251c => "\x8a",
      0x00002524 => "\x88",
      0x0000252c => "\x89",
      0x00002534 => "\x8b",
      0x0000253c => "\x87",
      0x00002592 => "\x84",
      0x000025a0 => "\xfe",
      0x0000fe7d => "\xf0",
      0x0000fe80 => "\xc1",
      0x0000fe81 => "\xc2",
      0x0000fe82 => "\xa2",
      0x0000fe83 => "\xc3",
      0x0000fe84 => "\xa5",
      0x0000fe85 => "\xc4",
      0x0000fe8b => "\xc6",
      0x0000fe8d => "\xc7",
      0x0000fe8e => "\xa8",
      0x0000fe8f => "\xa9",
      0x0000fe91 => "\xc8",
      0x0000fe93 => "\xc9",
      0x0000fe95 => "\xaa",
      0x0000fe97 => "\xca",
      0x0000fe99 => "\xab",
      0x0000fe9b => "\xcb",
      0x0000fe9d => "\xad",
      0x0000fe9f => "\xcc",
      0x0000fea1 => "\xae",
      0x0000fea3 => "\xcd",
      0x0000fea5 => "\xaf",
      0x0000fea7 => "\xce",
      0x0000fea9 => "\xcf",
      0x0000feab => "\xd0",
      0x0000fead => "\xd1",
      0x0000feaf => "\xd2",
      0x0000feb1 => "\xbc",
      0x0000feb3 => "\xd3",
      0x0000feb5 => "\xbd",
      0x0000feb7 => "\xd4",
      0x0000feb9 => "\xbe",
      0x0000febb => "\xd5",
      0x0000febd => "\xeb",
      0x0000febf => "\xd6",
      0x0000fec1 => "\xd7",
      0x0000fec5 => "\xd8",
      0x0000fec9 => "\xdf",
      0x0000feca => "\xc5",
      0x0000fecb => "\xd9",
      0x0000fecc => "\xec",
      0x0000fecd => "\xee",
      0x0000fece => "\xed",
      0x0000fecf => "\xda",
      0x0000fed0 => "\xf7",
      0x0000fed1 => "\xba",
      0x0000fed3 => "\xe1",
      0x0000fed5 => "\xf8",
      0x0000fed7 => "\xe2",
      0x0000fed9 => "\xfc",
      0x0000fedb => "\xe3",
      0x0000fedd => "\xfb",
      0x0000fedf => "\xe4",
      0x0000fee1 => "\xef",
      0x0000fee3 => "\xe5",
      0x0000fee5 => "\xf2",
      0x0000fee7 => "\xe6",
      0x0000fee9 => "\xf3",
      0x0000feeb => "\xe7",
      0x0000feec => "\xf4",
      0x0000feed => "\xe8",
      0x0000feef => "\xe9",
      0x0000fef0 => "\xf5",
      0x0000fef1 => "\xfd",
      0x0000fef2 => "\xf6",
      0x0000fef3 => "\xea",
      0x0000fef5 => "\xf9",
      0x0000fef6 => "\xfa",
      0x0000fef7 => "\x99",
      0x0000fef8 => "\x9a",
      0x0000fefb => "\x9d",
      0x0000fefc => "\x9e",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::IBM864 - Conversion routines for IBM864
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for IBM864.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   automatically generated from the charDB
   alias CP864
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL
      01 |  00000001 | START OF HEADING
      02 |  00000002 | START OF TEXT
      03 |  00000003 | END OF TEXT
      04 |  00000004 | END OF TRANSMISSION
      05 |  00000005 | ENQUIRY
      06 |  00000006 | ACKNOWLEDGE
      07 |  00000007 | BELL
      08 |  00000008 | BACKSPACE
      09 |  00000009 | HORIZONTAL TABULATION
      0A |  0000000A | LINE FEED
      0B |  0000000B | VERTICAL TABULATION
      0C |  0000000C | FORM FEED
      0D |  0000000D | CARRIAGE RETURN
      0E |  0000000E | SHIFT OUT
      0F |  0000000F | SHIFT IN
      10 |  00000010 | DATA LINK ESCAPE
      11 |  00000011 | DEVICE CONTROL ONE
      12 |  00000012 | DEVICE CONTROL TWO
      13 |  00000013 | DEVICE CONTROL THREE
      14 |  00000014 | DEVICE CONTROL FOUR
      15 |  00000015 | NEGATIVE ACKNOWLEDGE
      16 |  00000016 | SYNCHRONOUS IDLE
      17 |  00000017 | END OF TRANSMISSION BLOCK
      18 |  00000018 | CANCEL
      19 |  00000019 | END OF MEDIUM
      1A |  0000001A | SUBSTITUTE
      1B |  0000001B | ESCAPE
      1C |  0000001C | FILE SEPARATOR
      1D |  0000001D | GROUP SEPARATOR
      1E |  0000001E | RECORD SEPARATOR
      1F |  0000001F | UNIT SEPARATOR
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  0000066A | ARABIC PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE
      80 |  000000B0 | DEGREE SIGN
      81 |  000000B7 | MIDDLE DOT
      82 |  00002219 | BULLET OPERATOR
      83 |  0000221A | SQUARE ROOT
      84 |  00002592 | MEDIUM SHADE
      85 |  00002500 | BOX DRAWINGS LIGHT HORIZONTAL
      86 |  00002502 | BOX DRAWINGS LIGHT VERTICAL
      87 |  0000253C | BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
      88 |  00002524 | BOX DRAWINGS LIGHT VERTICAL AND LEFT
      89 |  0000252C | BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
      8A |  0000251C | BOX DRAWINGS LIGHT VERTICAL AND RIGHT
      8B |  00002534 | BOX DRAWINGS LIGHT UP AND HORIZONTAL
      8C |  00002510 | BOX DRAWINGS LIGHT DOWN AND LEFT
      8D |  0000250C | BOX DRAWINGS LIGHT DOWN AND RIGHT
      8E |  00002514 | BOX DRAWINGS LIGHT UP AND RIGHT
      8F |  00002518 | BOX DRAWINGS LIGHT UP AND LEFT
      90 |  000003B2 | GREEK SMALL LETTER BETA
      91 |  0000221E | INFINITY
      92 |  000003C6 | GREEK SMALL LETTER PHI
      93 |  000000B1 | PLUS-MINUS SIGN
      94 |  000000BD | VULGAR FRACTION ONE HALF
      95 |  000000BC | VULGAR FRACTION ONE QUARTER
      96 |  00002248 | ALMOST EQUAL TO
      97 |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
      98 |  000000BB | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
      99 |  0000FEF7 | ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM
      9A |  0000FEF8 | ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM
      9D |  0000FEFB | ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM
      9E |  0000FEFC | ARABIC LIGATURE LAM WITH ALEF FINAL FORM
      A0 |  000000A0 | NO-BREAK SPACE
      A1 |  000000AD | SOFT HYPHEN
      A2 |  0000FE82 | ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM
      A3 |  000000A3 | POUND SIGN
      A4 |  000000A4 | CURRENCY SIGN
      A5 |  0000FE84 | ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM
      A8 |  0000FE8E | ARABIC LETTER ALEF FINAL FORM
      A9 |  0000FE8F | ARABIC LETTER BEH ISOLATED FORM
      AA |  0000FE95 | ARABIC LETTER TEH ISOLATED FORM
      AB |  0000FE99 | ARABIC LETTER THEH ISOLATED FORM
      AC |  0000060C | ARABIC COMMA
      AD |  0000FE9D | ARABIC LETTER JEEM ISOLATED FORM
      AE |  0000FEA1 | ARABIC LETTER HAH ISOLATED FORM
      AF |  0000FEA5 | ARABIC LETTER KHAH ISOLATED FORM
      B0 |  00000660 | ARABIC-INDIC DIGIT ZERO
      B1 |  00000661 | ARABIC-INDIC DIGIT ONE
      B2 |  00000662 | ARABIC-INDIC DIGIT TWO
      B3 |  00000663 | ARABIC-INDIC DIGIT THREE
      B4 |  00000664 | ARABIC-INDIC DIGIT FOUR
      B5 |  00000665 | ARABIC-INDIC DIGIT FIVE
      B6 |  00000666 | ARABIC-INDIC DIGIT SIX
      B7 |  00000667 | ARABIC-INDIC DIGIT SEVEN
      B8 |  00000668 | ARABIC-INDIC DIGIT EIGHT
      B9 |  00000669 | ARABIC-INDIC DIGIT NINE
      BA |  0000FED1 | ARABIC LETTER FEH ISOLATED FORM
      BB |  0000061B | ARABIC SEMICOLON
      BC |  0000FEB1 | ARABIC LETTER SEEN ISOLATED FORM
      BD |  0000FEB5 | ARABIC LETTER SHEEN ISOLATED FORM
      BE |  0000FEB9 | ARABIC LETTER SAD ISOLATED FORM
      BF |  0000061F | ARABIC QUESTION MARK
      C0 |  000000A2 | CENT SIGN
      C1 |  0000FE80 | ARABIC LETTER HAMZA ISOLATED FORM
      C2 |  0000FE81 | ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM
      C3 |  0000FE83 | ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM
      C4 |  0000FE85 | ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM
      C5 |  0000FECA | ARABIC LETTER AIN FINAL FORM
      C6 |  0000FE8B | ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM
      C7 |  0000FE8D | ARABIC LETTER ALEF ISOLATED FORM
      C8 |  0000FE91 | ARABIC LETTER BEH INITIAL FORM
      C9 |  0000FE93 | ARABIC LETTER TEH MARBUTA ISOLATED FORM
      CA |  0000FE97 | ARABIC LETTER TEH INITIAL FORM
      CB |  0000FE9B | ARABIC LETTER THEH INITIAL FORM
      CC |  0000FE9F | ARABIC LETTER JEEM INITIAL FORM
      CD |  0000FEA3 | ARABIC LETTER HAH INITIAL FORM
      CE |  0000FEA7 | ARABIC LETTER KHAH INITIAL FORM
      CF |  0000FEA9 | ARABIC LETTER DAL ISOLATED FORM
      D0 |  0000FEAB | ARABIC LETTER THAL ISOLATED FORM
      D1 |  0000FEAD | ARABIC LETTER REH ISOLATED FORM
      D2 |  0000FEAF | ARABIC LETTER ZAIN ISOLATED FORM
      D3 |  0000FEB3 | ARABIC LETTER SEEN INITIAL FORM
      D4 |  0000FEB7 | ARABIC LETTER SHEEN INITIAL FORM
      D5 |  0000FEBB | ARABIC LETTER SAD INITIAL FORM
      D6 |  0000FEBF | ARABIC LETTER DAD INITIAL FORM
      D7 |  0000FEC1 | ARABIC LETTER TAH ISOLATED FORM
      D8 |  0000FEC5 | ARABIC LETTER ZAH ISOLATED FORM
      D9 |  0000FECB | ARABIC LETTER AIN INITIAL FORM
      DA |  0000FECF | ARABIC LETTER GHAIN INITIAL FORM
      DB |  000000A6 | BROKEN BAR
      DC |  000000AC | NOT SIGN
      DD |  000000F7 | DIVISION SIGN
      DE |  000000D7 | MULTIPLICATION SIGN
      DF |  0000FEC9 | ARABIC LETTER AIN ISOLATED FORM
      E0 |  00000640 | ARABIC TATWEEL
      E1 |  0000FED3 | ARABIC LETTER FEH INITIAL FORM
      E2 |  0000FED7 | ARABIC LETTER QAF INITIAL FORM
      E3 |  0000FEDB | ARABIC LETTER KAF INITIAL FORM
      E4 |  0000FEDF | ARABIC LETTER LAM INITIAL FORM
      E5 |  0000FEE3 | ARABIC LETTER MEEM INITIAL FORM
      E6 |  0000FEE7 | ARABIC LETTER NOON INITIAL FORM
      E7 |  0000FEEB | ARABIC LETTER HEH INITIAL FORM
      E8 |  0000FEED | ARABIC LETTER WAW ISOLATED FORM
      E9 |  0000FEEF | ARABIC LETTER ALEF MAKSURA ISOLATED FORM
      EA |  0000FEF3 | ARABIC LETTER YEH INITIAL FORM
      EB |  0000FEBD | ARABIC LETTER DAD ISOLATED FORM
      EC |  0000FECC | ARABIC LETTER AIN MEDIAL FORM
      ED |  0000FECE | ARABIC LETTER GHAIN FINAL FORM
      EE |  0000FECD | ARABIC LETTER GHAIN ISOLATED FORM
      EF |  0000FEE1 | ARABIC LETTER MEEM ISOLATED FORM
      F0 |  0000FE7D | ARABIC SHADDA MEDIAL FORM
      F1 |  00000651 | ARABIC SHADDA
      F2 |  0000FEE5 | ARABIC LETTER NOON ISOLATED FORM
      F3 |  0000FEE9 | ARABIC LETTER HEH ISOLATED FORM
      F4 |  0000FEEC | ARABIC LETTER HEH MEDIAL FORM
      F5 |  0000FEF0 | ARABIC LETTER ALEF MAKSURA FINAL FORM
      F6 |  0000FEF2 | ARABIC LETTER YEH FINAL FORM
      F7 |  0000FED0 | ARABIC LETTER GHAIN MEDIAL FORM
      F8 |  0000FED5 | ARABIC LETTER QAF ISOLATED FORM
      F9 |  0000FEF5 | ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM
      FA |  0000FEF6 | ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM
      FB |  0000FEDD | ARABIC LETTER LAM ISOLATED FORM
      FC |  0000FED9 | ARABIC LETTER KAF ISOLATED FORM
      FD |  0000FEF1 | ARABIC LETTER YEH ISOLATED FORM
      FE |  000025A0 | BLACK SQUARE
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_IBM864

    $main::fatpacked{"Locale/RecodeData/IBM865.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_IBM865';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for IBM865.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::IBM865;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0x00c7,
      0x00fc,
      0x00e9,
      0x00e2,
      0x00e4,
      0x00e0,
      0x00e5,
      0x00e7,
      0x00ea,
      0x00eb,
      0x00e8,
      0x00ef,
      0x00ee,
      0x00ec,
      0x00c4,
      0x00c5,
      0x00c9,
      0x00e6,
      0x00c6,
      0x00f4,
      0x00f6,
      0x00f2,
      0x00fb,
      0x00f9,
      0x00ff,
      0x00d6,
      0x00dc,
      0x00f8,
      0x00a3,
      0x00d8,
      0x20a7,
      0x0192,
      0x00e1,
      0x00ed,
      0x00f3,
      0x00fa,
      0x00f1,
      0x00d1,
      0x00aa,
      0x00ba,
      0x00bf,
      0x2310,
      0x00ac,
      0x00bd,
      0x00bc,
      0x00a1,
      0x00ab,
      0x00a4,
      0x2591,
      0x2592,
      0x2593,
      0x2502,
      0x2524,
      0x2561,
      0x2562,
      0x2556,
      0x2555,
      0x2563,
      0x2551,
      0x2557,
      0x255d,
      0x255c,
      0x255b,
      0x2510,
      0x2514,
      0x2534,
      0x252c,
      0x251c,
      0x2500,
      0x253c,
      0x255e,
      0x255f,
      0x255a,
      0x2554,
      0x2569,
      0x2566,
      0x2560,
      0x2550,
      0x256c,
      0x2567,
      0x2568,
      0x2564,
      0x2565,
      0x2559,
      0x2558,
      0x2552,
      0x2553,
      0x256b,
      0x256a,
      0x2518,
      0x250c,
      0x2588,
      0x2584,
      0x258c,
      0x2590,
      0x2580,
      0x03b1,
      0x00df,
      0x0393,
      0x03c0,
      0x03a3,
      0x03c3,
      0x00b5,
      0x03c4,
      0x03a6,
      0x0398,
      0x03a9,
      0x03b4,
      0x221e,
      0x03c6,
      0x03b5,
      0x2229,
      0x2261,
      0x00b1,
      0x2265,
      0x2264,
      0x2320,
      0x2321,
      0x00f7,
      0x2248,
      0x00b0,
      0x2219,
      0x00b7,
      0x221a,
      0x207f,
      0x00b2,
      0x25a0,
      0x00a0,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xc3\x87",
      "\xc3\xbc",
      "\xc3\xa9",
      "\xc3\xa2",
      "\xc3\xa4",
      "\xc3\xa0",
      "\xc3\xa5",
      "\xc3\xa7",
      "\xc3\xaa",
      "\xc3\xab",
      "\xc3\xa8",
      "\xc3\xaf",
      "\xc3\xae",
      "\xc3\xac",
      "\xc3\x84",
      "\xc3\x85",
      "\xc3\x89",
      "\xc3\xa6",
      "\xc3\x86",
      "\xc3\xb4",
      "\xc3\xb6",
      "\xc3\xb2",
      "\xc3\xbb",
      "\xc3\xb9",
      "\xc3\xbf",
      "\xc3\x96",
      "\xc3\x9c",
      "\xc3\xb8",
      "\xc2\xa3",
      "\xc3\x98",
      "\xe2\x82\xa7",
      "\xc6\x92",
      "\xc3\xa1",
      "\xc3\xad",
      "\xc3\xb3",
      "\xc3\xba",
      "\xc3\xb1",
      "\xc3\x91",
      "\xc2\xaa",
      "\xc2\xba",
      "\xc2\xbf",
      "\xe2\x8c\x90",
      "\xc2\xac",
      "\xc2\xbd",
      "\xc2\xbc",
      "\xc2\xa1",
      "\xc2\xab",
      "\xc2\xa4",
      "\xe2\x96\x91",
      "\xe2\x96\x92",
      "\xe2\x96\x93",
      "\xe2\x94\x82",
      "\xe2\x94\xa4",
      "\xe2\x95\xa1",
      "\xe2\x95\xa2",
      "\xe2\x95\x96",
      "\xe2\x95\x95",
      "\xe2\x95\xa3",
      "\xe2\x95\x91",
      "\xe2\x95\x97",
      "\xe2\x95\x9d",
      "\xe2\x95\x9c",
      "\xe2\x95\x9b",
      "\xe2\x94\x90",
      "\xe2\x94\x94",
      "\xe2\x94\xb4",
      "\xe2\x94\xac",
      "\xe2\x94\x9c",
      "\xe2\x94\x80",
      "\xe2\x94\xbc",
      "\xe2\x95\x9e",
      "\xe2\x95\x9f",
      "\xe2\x95\x9a",
      "\xe2\x95\x94",
      "\xe2\x95\xa9",
      "\xe2\x95\xa6",
      "\xe2\x95\xa0",
      "\xe2\x95\x90",
      "\xe2\x95\xac",
      "\xe2\x95\xa7",
      "\xe2\x95\xa8",
      "\xe2\x95\xa4",
      "\xe2\x95\xa5",
      "\xe2\x95\x99",
      "\xe2\x95\x98",
      "\xe2\x95\x92",
      "\xe2\x95\x93",
      "\xe2\x95\xab",
      "\xe2\x95\xaa",
      "\xe2\x94\x98",
      "\xe2\x94\x8c",
      "\xe2\x96\x88",
      "\xe2\x96\x84",
      "\xe2\x96\x8c",
      "\xe2\x96\x90",
      "\xe2\x96\x80",
      "\xce\xb1",
      "\xc3\x9f",
      "\xce\x93",
      "\xcf\x80",
      "\xce\xa3",
      "\xcf\x83",
      "\xc2\xb5",
      "\xcf\x84",
      "\xce\xa6",
      "\xce\x98",
      "\xce\xa9",
      "\xce\xb4",
      "\xe2\x88\x9e",
      "\xcf\x86",
      "\xce\xb5",
      "\xe2\x88\xa9",
      "\xe2\x89\xa1",
      "\xc2\xb1",
      "\xe2\x89\xa5",
      "\xe2\x89\xa4",
      "\xe2\x8c\xa0",
      "\xe2\x8c\xa1",
      "\xc3\xb7",
      "\xe2\x89\x88",
      "\xc2\xb0",
      "\xe2\x88\x99",
      "\xc2\xb7",
      "\xe2\x88\x9a",
      "\xe2\x81\xbf",
      "\xc2\xb2",
      "\xe2\x96\xa0",
      "\xc2\xa0",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x000000a0 => "\xff",
      0x000000a1 => "\xad",
      0x000000a3 => "\x9c",
      0x000000a4 => "\xaf",
      0x000000aa => "\xa6",
      0x000000ab => "\xae",
      0x000000ac => "\xaa",
      0x000000b0 => "\xf8",
      0x000000b1 => "\xf1",
      0x000000b2 => "\xfd",
      0x000000b5 => "\xe6",
      0x000000b7 => "\xfa",
      0x000000ba => "\xa7",
      0x000000bc => "\xac",
      0x000000bd => "\xab",
      0x000000bf => "\xa8",
      0x000000c4 => "\x8e",
      0x000000c5 => "\x8f",
      0x000000c6 => "\x92",
      0x000000c7 => "\x80",
      0x000000c9 => "\x90",
      0x000000d1 => "\xa5",
      0x000000d6 => "\x99",
      0x000000d8 => "\x9d",
      0x000000dc => "\x9a",
      0x000000df => "\xe1",
      0x000000e0 => "\x85",
      0x000000e1 => "\xa0",
      0x000000e2 => "\x83",
      0x000000e4 => "\x84",
      0x000000e5 => "\x86",
      0x000000e6 => "\x91",
      0x000000e7 => "\x87",
      0x000000e8 => "\x8a",
      0x000000e9 => "\x82",
      0x000000ea => "\x88",
      0x000000eb => "\x89",
      0x000000ec => "\x8d",
      0x000000ed => "\xa1",
      0x000000ee => "\x8c",
      0x000000ef => "\x8b",
      0x000000f1 => "\xa4",
      0x000000f2 => "\x95",
      0x000000f3 => "\xa2",
      0x000000f4 => "\x93",
      0x000000f6 => "\x94",
      0x000000f7 => "\xf6",
      0x000000f8 => "\x9b",
      0x000000f9 => "\x97",
      0x000000fa => "\xa3",
      0x000000fb => "\x96",
      0x000000fc => "\x81",
      0x000000ff => "\x98",
      0x00000192 => "\x9f",
      0x00000393 => "\xe2",
      0x00000398 => "\xe9",
      0x000003a3 => "\xe4",
      0x000003a6 => "\xe8",
      0x000003a9 => "\xea",
      0x000003b1 => "\xe0",
      0x000003b4 => "\xeb",
      0x000003b5 => "\xee",
      0x000003c0 => "\xe3",
      0x000003c3 => "\xe5",
      0x000003c4 => "\xe7",
      0x000003c6 => "\xed",
      0x0000207f => "\xfc",
      0x000020a7 => "\x9e",
      0x00002219 => "\xf9",
      0x0000221a => "\xfb",
      0x0000221e => "\xec",
      0x00002229 => "\xef",
      0x00002248 => "\xf7",
      0x00002261 => "\xf0",
      0x00002264 => "\xf3",
      0x00002265 => "\xf2",
      0x00002310 => "\xa9",
      0x00002320 => "\xf4",
      0x00002321 => "\xf5",
      0x00002500 => "\xc4",
      0x00002502 => "\xb3",
      0x0000250c => "\xda",
      0x00002510 => "\xbf",
      0x00002514 => "\xc0",
      0x00002518 => "\xd9",
      0x0000251c => "\xc3",
      0x00002524 => "\xb4",
      0x0000252c => "\xc2",
      0x00002534 => "\xc1",
      0x0000253c => "\xc5",
      0x00002550 => "\xcd",
      0x00002551 => "\xba",
      0x00002552 => "\xd5",
      0x00002553 => "\xd6",
      0x00002554 => "\xc9",
      0x00002555 => "\xb8",
      0x00002556 => "\xb7",
      0x00002557 => "\xbb",
      0x00002558 => "\xd4",
      0x00002559 => "\xd3",
      0x0000255a => "\xc8",
      0x0000255b => "\xbe",
      0x0000255c => "\xbd",
      0x0000255d => "\xbc",
      0x0000255e => "\xc6",
      0x0000255f => "\xc7",
      0x00002560 => "\xcc",
      0x00002561 => "\xb5",
      0x00002562 => "\xb6",
      0x00002563 => "\xb9",
      0x00002564 => "\xd1",
      0x00002565 => "\xd2",
      0x00002566 => "\xcb",
      0x00002567 => "\xcf",
      0x00002568 => "\xd0",
      0x00002569 => "\xca",
      0x0000256a => "\xd8",
      0x0000256b => "\xd7",
      0x0000256c => "\xce",
      0x00002580 => "\xdf",
      0x00002584 => "\xdc",
      0x00002588 => "\xdb",
      0x0000258c => "\xdd",
      0x00002590 => "\xde",
      0x00002591 => "\xb0",
      0x00002592 => "\xb1",
      0x00002593 => "\xb2",
      0x000025a0 => "\xfe",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::IBM865 - Conversion routines for IBM865
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for IBM865.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: IBM DOS 3.3 Ref (Abridged), 94X9575 (Feb 1987)
   alias CP865
   alias 865
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE (DEL)
      80 |  000000C7 | LATIN CAPITAL LETTER C WITH CEDILLA
      81 |  000000FC | LATIN SMALL LETTER U WITH DIAERESIS
      82 |  000000E9 | LATIN SMALL LETTER E WITH ACUTE
      83 |  000000E2 | LATIN SMALL LETTER A WITH CIRCUMFLEX
      84 |  000000E4 | LATIN SMALL LETTER A WITH DIAERESIS
      85 |  000000E0 | LATIN SMALL LETTER A WITH GRAVE
      86 |  000000E5 | LATIN SMALL LETTER A WITH RING ABOVE
      87 |  000000E7 | LATIN SMALL LETTER C WITH CEDILLA
      88 |  000000EA | LATIN SMALL LETTER E WITH CIRCUMFLEX
      89 |  000000EB | LATIN SMALL LETTER E WITH DIAERESIS
      8A |  000000E8 | LATIN SMALL LETTER E WITH GRAVE
      8B |  000000EF | LATIN SMALL LETTER I WITH DIAERESIS
      8C |  000000EE | LATIN SMALL LETTER I WITH CIRCUMFLEX
      8D |  000000EC | LATIN SMALL LETTER I WITH GRAVE
      8E |  000000C4 | LATIN CAPITAL LETTER A WITH DIAERESIS
      8F |  000000C5 | LATIN CAPITAL LETTER A WITH RING ABOVE
      90 |  000000C9 | LATIN CAPITAL LETTER E WITH ACUTE
      91 |  000000E6 | LATIN SMALL LETTER AE
      92 |  000000C6 | LATIN CAPITAL LETTER AE
      93 |  000000F4 | LATIN SMALL LETTER O WITH CIRCUMFLEX
      94 |  000000F6 | LATIN SMALL LETTER O WITH DIAERESIS
      95 |  000000F2 | LATIN SMALL LETTER O WITH GRAVE
      96 |  000000FB | LATIN SMALL LETTER U WITH CIRCUMFLEX
      97 |  000000F9 | LATIN SMALL LETTER U WITH GRAVE
      98 |  000000FF | LATIN SMALL LETTER Y WITH DIAERESIS
      99 |  000000D6 | LATIN CAPITAL LETTER O WITH DIAERESIS
      9A |  000000DC | LATIN CAPITAL LETTER U WITH DIAERESIS
      9B |  000000F8 | LATIN SMALL LETTER O WITH STROKE
      9C |  000000A3 | POUND SIGN
      9D |  000000D8 | LATIN CAPITAL LETTER O WITH STROKE
      9E |  000020A7 | PESETA SIGN
      9F |  00000192 | LATIN SMALL LETTER F WITH HOOK
      A0 |  000000E1 | LATIN SMALL LETTER A WITH ACUTE
      A1 |  000000ED | LATIN SMALL LETTER I WITH ACUTE
      A2 |  000000F3 | LATIN SMALL LETTER O WITH ACUTE
      A3 |  000000FA | LATIN SMALL LETTER U WITH ACUTE
      A4 |  000000F1 | LATIN SMALL LETTER N WITH TILDE
      A5 |  000000D1 | LATIN CAPITAL LETTER N WITH TILDE
      A6 |  000000AA | FEMININE ORDINAL INDICATOR
      A7 |  000000BA | MASCULINE ORDINAL INDICATOR
      A8 |  000000BF | INVERTED QUESTION MARK
      A9 |  00002310 | REVERSED NOT SIGN
      AA |  000000AC | NOT SIGN
      AB |  000000BD | VULGAR FRACTION ONE HALF
      AC |  000000BC | VULGAR FRACTION ONE QUARTER
      AD |  000000A1 | INVERTED EXCLAMATION MARK
      AE |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
      AF |  000000A4 | CURRENCY SIGN
      B0 |  00002591 | LIGHT SHADE
      B1 |  00002592 | MEDIUM SHADE
      B2 |  00002593 | DARK SHADE
      B3 |  00002502 | BOX DRAWINGS LIGHT VERTICAL
      B4 |  00002524 | BOX DRAWINGS LIGHT VERTICAL AND LEFT
      B5 |  00002561 | BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
      B6 |  00002562 | BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
      B7 |  00002556 | BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
      B8 |  00002555 | BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
      B9 |  00002563 | BOX DRAWINGS DOUBLE VERTICAL AND LEFT
      BA |  00002551 | BOX DRAWINGS DOUBLE VERTICAL
      BB |  00002557 | BOX DRAWINGS DOUBLE DOWN AND LEFT
      BC |  0000255D | BOX DRAWINGS DOUBLE UP AND LEFT
      BD |  0000255C | BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
      BE |  0000255B | BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
      BF |  00002510 | BOX DRAWINGS LIGHT DOWN AND LEFT
      C0 |  00002514 | BOX DRAWINGS LIGHT UP AND RIGHT
      C1 |  00002534 | BOX DRAWINGS LIGHT UP AND HORIZONTAL
      C2 |  0000252C | BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
      C3 |  0000251C | BOX DRAWINGS LIGHT VERTICAL AND RIGHT
      C4 |  00002500 | BOX DRAWINGS LIGHT HORIZONTAL
      C5 |  0000253C | BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
      C6 |  0000255E | BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
      C7 |  0000255F | BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
      C8 |  0000255A | BOX DRAWINGS DOUBLE UP AND RIGHT
      C9 |  00002554 | BOX DRAWINGS DOUBLE DOWN AND RIGHT
      CA |  00002569 | BOX DRAWINGS DOUBLE UP AND HORIZONTAL
      CB |  00002566 | BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
      CC |  00002560 | BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
      CD |  00002550 | BOX DRAWINGS DOUBLE HORIZONTAL
      CE |  0000256C | BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
      CF |  00002567 | BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
      D0 |  00002568 | BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
      D1 |  00002564 | BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
      D2 |  00002565 | BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
      D3 |  00002559 | BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
      D4 |  00002558 | BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
      D5 |  00002552 | BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
      D6 |  00002553 | BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
      D7 |  0000256B | BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
      D8 |  0000256A | BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
      D9 |  00002518 | BOX DRAWINGS LIGHT UP AND LEFT
      DA |  0000250C | BOX DRAWINGS LIGHT DOWN AND RIGHT
      DB |  00002588 | FULL BLOCK
      DC |  00002584 | LOWER HALF BLOCK
      DD |  0000258C | LEFT HALF BLOCK
      DE |  00002590 | RIGHT HALF BLOCK
      DF |  00002580 | UPPER HALF BLOCK
      E0 |  000003B1 | GREEK SMALL LETTER ALPHA
      E1 |  000000DF | LATIN SMALL LETTER SHARP S (German)
      E2 |  00000393 | GREEK CAPITAL LETTER GAMMA
      E3 |  000003C0 | GREEK SMALL LETTER PI
      E4 |  000003A3 | GREEK CAPITAL LETTER SIGMA
      E5 |  000003C3 | GREEK SMALL LETTER SIGMA
      E6 |  000000B5 | MICRO SIGN
      E7 |  000003C4 | GREEK SMALL LETTER TAU
      E8 |  000003A6 | GREEK CAPITAL LETTER PHI
      E9 |  00000398 | GREEK CAPITAL LETTER THETA
      EA |  000003A9 | GREEK CAPITAL LETTER OMEGA
      EB |  000003B4 | GREEK SMALL LETTER DELTA
      EC |  0000221E | INFINITY
      ED |  000003C6 | GREEK SMALL LETTER PHI
      EE |  000003B5 | GREEK SMALL LETTER EPSILON
      EF |  00002229 | INTERSECTION
      F0 |  00002261 | IDENTICAL TO
      F1 |  000000B1 | PLUS-MINUS SIGN
      F2 |  00002265 | GREATER-THAN OR EQUAL TO
      F3 |  00002264 | LESS-THAN OR EQUAL TO
      F4 |  00002320 | TOP HALF INTEGRAL
      F5 |  00002321 | BOTTOM HALF INTEGRAL
      F6 |  000000F7 | DIVISION SIGN
      F7 |  00002248 | ALMOST EQUAL TO
      F8 |  000000B0 | DEGREE SIGN
      F9 |  00002219 | BULLET OPERATOR
      FA |  000000B7 | MIDDLE DOT
      FB |  0000221A | SQUARE ROOT
      FC |  0000207F | SUPERSCRIPT LATIN SMALL LETTER N
      FD |  000000B2 | SUPERSCRIPT TWO
      FE |  000025A0 | BLACK SQUARE
      FF |  000000A0 | NO-BREAK SPACE
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_IBM865

    $main::fatpacked{"Locale/RecodeData/IBM866.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_IBM866';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for IBM866.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::IBM866;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0x0410,
      0x0411,
      0x0412,
      0x0413,
      0x0414,
      0x0415,
      0x0416,
      0x0417,
      0x0418,
      0x0419,
      0x041a,
      0x041b,
      0x041c,
      0x041d,
      0x041e,
      0x041f,
      0x0420,
      0x0421,
      0x0422,
      0x0423,
      0x0424,
      0x0425,
      0x0426,
      0x0427,
      0x0428,
      0x0429,
      0x042a,
      0x042b,
      0x042c,
      0x042d,
      0x042e,
      0x042f,
      0x0430,
      0x0431,
      0x0432,
      0x0433,
      0x0434,
      0x0435,
      0x0436,
      0x0437,
      0x0438,
      0x0439,
      0x043a,
      0x043b,
      0x043c,
      0x043d,
      0x043e,
      0x043f,
      0x2591,
      0x2592,
      0x2593,
      0x2502,
      0x2524,
      0x2561,
      0x2562,
      0x2556,
      0x2555,
      0x2563,
      0x2551,
      0x2557,
      0x255d,
      0x255c,
      0x255b,
      0x2510,
      0x2514,
      0x2534,
      0x252c,
      0x251c,
      0x2500,
      0x253c,
      0x255e,
      0x255f,
      0x255a,
      0x2554,
      0x2569,
      0x2566,
      0x2560,
      0x2550,
      0x256c,
      0x2567,
      0x2568,
      0x2564,
      0x2565,
      0x2559,
      0x2558,
      0x2552,
      0x2553,
      0x256b,
      0x256a,
      0x2518,
      0x250c,
      0x2588,
      0x2584,
      0x258c,
      0x2590,
      0x2580,
      0x0440,
      0x0441,
      0x0442,
      0x0443,
      0x0444,
      0x0445,
      0x0446,
      0x0447,
      0x0448,
      0x0449,
      0x044a,
      0x044b,
      0x044c,
      0x044d,
      0x044e,
      0x044f,
      0x0401,
      0x0451,
      0x0404,
      0x0454,
      0x0407,
      0x0457,
      0x040e,
      0x045e,
      0x00b0,
      0x2219,
      0x00b7,
      0x221a,
      0x2116,
      0x00a4,
      0x25a0,
      0x00a0,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xd0\x90",
      "\xd0\x91",
      "\xd0\x92",
      "\xd0\x93",
      "\xd0\x94",
      "\xd0\x95",
      "\xd0\x96",
      "\xd0\x97",
      "\xd0\x98",
      "\xd0\x99",
      "\xd0\x9a",
      "\xd0\x9b",
      "\xd0\x9c",
      "\xd0\x9d",
      "\xd0\x9e",
      "\xd0\x9f",
      "\xd0\xa0",
      "\xd0\xa1",
      "\xd0\xa2",
      "\xd0\xa3",
      "\xd0\xa4",
      "\xd0\xa5",
      "\xd0\xa6",
      "\xd0\xa7",
      "\xd0\xa8",
      "\xd0\xa9",
      "\xd0\xaa",
      "\xd0\xab",
      "\xd0\xac",
      "\xd0\xad",
      "\xd0\xae",
      "\xd0\xaf",
      "\xd0\xb0",
      "\xd0\xb1",
      "\xd0\xb2",
      "\xd0\xb3",
      "\xd0\xb4",
      "\xd0\xb5",
      "\xd0\xb6",
      "\xd0\xb7",
      "\xd0\xb8",
      "\xd0\xb9",
      "\xd0\xba",
      "\xd0\xbb",
      "\xd0\xbc",
      "\xd0\xbd",
      "\xd0\xbe",
      "\xd0\xbf",
      "\xe2\x96\x91",
      "\xe2\x96\x92",
      "\xe2\x96\x93",
      "\xe2\x94\x82",
      "\xe2\x94\xa4",
      "\xe2\x95\xa1",
      "\xe2\x95\xa2",
      "\xe2\x95\x96",
      "\xe2\x95\x95",
      "\xe2\x95\xa3",
      "\xe2\x95\x91",
      "\xe2\x95\x97",
      "\xe2\x95\x9d",
      "\xe2\x95\x9c",
      "\xe2\x95\x9b",
      "\xe2\x94\x90",
      "\xe2\x94\x94",
      "\xe2\x94\xb4",
      "\xe2\x94\xac",
      "\xe2\x94\x9c",
      "\xe2\x94\x80",
      "\xe2\x94\xbc",
      "\xe2\x95\x9e",
      "\xe2\x95\x9f",
      "\xe2\x95\x9a",
      "\xe2\x95\x94",
      "\xe2\x95\xa9",
      "\xe2\x95\xa6",
      "\xe2\x95\xa0",
      "\xe2\x95\x90",
      "\xe2\x95\xac",
      "\xe2\x95\xa7",
      "\xe2\x95\xa8",
      "\xe2\x95\xa4",
      "\xe2\x95\xa5",
      "\xe2\x95\x99",
      "\xe2\x95\x98",
      "\xe2\x95\x92",
      "\xe2\x95\x93",
      "\xe2\x95\xab",
      "\xe2\x95\xaa",
      "\xe2\x94\x98",
      "\xe2\x94\x8c",
      "\xe2\x96\x88",
      "\xe2\x96\x84",
      "\xe2\x96\x8c",
      "\xe2\x96\x90",
      "\xe2\x96\x80",
      "\xd1\x80",
      "\xd1\x81",
      "\xd1\x82",
      "\xd1\x83",
      "\xd1\x84",
      "\xd1\x85",
      "\xd1\x86",
      "\xd1\x87",
      "\xd1\x88",
      "\xd1\x89",
      "\xd1\x8a",
      "\xd1\x8b",
      "\xd1\x8c",
      "\xd1\x8d",
      "\xd1\x8e",
      "\xd1\x8f",
      "\xd0\x81",
      "\xd1\x91",
      "\xd0\x84",
      "\xd1\x94",
      "\xd0\x87",
      "\xd1\x97",
      "\xd0\x8e",
      "\xd1\x9e",
      "\xc2\xb0",
      "\xe2\x88\x99",
      "\xc2\xb7",
      "\xe2\x88\x9a",
      "\xe2\x84\x96",
      "\xc2\xa4",
      "\xe2\x96\xa0",
      "\xc2\xa0",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x000000a0 => "\xff",
      0x000000a4 => "\xfd",
      0x000000b0 => "\xf8",
      0x000000b7 => "\xfa",
      0x00000401 => "\xf0",
      0x00000404 => "\xf2",
      0x00000407 => "\xf4",
      0x0000040e => "\xf6",
      0x00000410 => "\x80",
      0x00000411 => "\x81",
      0x00000412 => "\x82",
      0x00000413 => "\x83",
      0x00000414 => "\x84",
      0x00000415 => "\x85",
      0x00000416 => "\x86",
      0x00000417 => "\x87",
      0x00000418 => "\x88",
      0x00000419 => "\x89",
      0x0000041a => "\x8a",
      0x0000041b => "\x8b",
      0x0000041c => "\x8c",
      0x0000041d => "\x8d",
      0x0000041e => "\x8e",
      0x0000041f => "\x8f",
      0x00000420 => "\x90",
      0x00000421 => "\x91",
      0x00000422 => "\x92",
      0x00000423 => "\x93",
      0x00000424 => "\x94",
      0x00000425 => "\x95",
      0x00000426 => "\x96",
      0x00000427 => "\x97",
      0x00000428 => "\x98",
      0x00000429 => "\x99",
      0x0000042a => "\x9a",
      0x0000042b => "\x9b",
      0x0000042c => "\x9c",
      0x0000042d => "\x9d",
      0x0000042e => "\x9e",
      0x0000042f => "\x9f",
      0x00000430 => "\xa0",
      0x00000431 => "\xa1",
      0x00000432 => "\xa2",
      0x00000433 => "\xa3",
      0x00000434 => "\xa4",
      0x00000435 => "\xa5",
      0x00000436 => "\xa6",
      0x00000437 => "\xa7",
      0x00000438 => "\xa8",
      0x00000439 => "\xa9",
      0x0000043a => "\xaa",
      0x0000043b => "\xab",
      0x0000043c => "\xac",
      0x0000043d => "\xad",
      0x0000043e => "\xae",
      0x0000043f => "\xaf",
      0x00000440 => "\xe0",
      0x00000441 => "\xe1",
      0x00000442 => "\xe2",
      0x00000443 => "\xe3",
      0x00000444 => "\xe4",
      0x00000445 => "\xe5",
      0x00000446 => "\xe6",
      0x00000447 => "\xe7",
      0x00000448 => "\xe8",
      0x00000449 => "\xe9",
      0x0000044a => "\xea",
      0x0000044b => "\xeb",
      0x0000044c => "\xec",
      0x0000044d => "\xed",
      0x0000044e => "\xee",
      0x0000044f => "\xef",
      0x00000451 => "\xf1",
      0x00000454 => "\xf3",
      0x00000457 => "\xf5",
      0x0000045e => "\xf7",
      0x00002116 => "\xfc",
      0x00002219 => "\xf9",
      0x0000221a => "\xfb",
      0x00002500 => "\xc4",
      0x00002502 => "\xb3",
      0x0000250c => "\xda",
      0x00002510 => "\xbf",
      0x00002514 => "\xc0",
      0x00002518 => "\xd9",
      0x0000251c => "\xc3",
      0x00002524 => "\xb4",
      0x0000252c => "\xc2",
      0x00002534 => "\xc1",
      0x0000253c => "\xc5",
      0x00002550 => "\xcd",
      0x00002551 => "\xba",
      0x00002552 => "\xd5",
      0x00002553 => "\xd6",
      0x00002554 => "\xc9",
      0x00002555 => "\xb8",
      0x00002556 => "\xb7",
      0x00002557 => "\xbb",
      0x00002558 => "\xd4",
      0x00002559 => "\xd3",
      0x0000255a => "\xc8",
      0x0000255b => "\xbe",
      0x0000255c => "\xbd",
      0x0000255d => "\xbc",
      0x0000255e => "\xc6",
      0x0000255f => "\xc7",
      0x00002560 => "\xcc",
      0x00002561 => "\xb5",
      0x00002562 => "\xb6",
      0x00002563 => "\xb9",
      0x00002564 => "\xd1",
      0x00002565 => "\xd2",
      0x00002566 => "\xcb",
      0x00002567 => "\xcf",
      0x00002568 => "\xd0",
      0x00002569 => "\xca",
      0x0000256a => "\xd8",
      0x0000256b => "\xd7",
      0x0000256c => "\xce",
      0x00002580 => "\xdf",
      0x00002584 => "\xdc",
      0x00002588 => "\xdb",
      0x0000258c => "\xdd",
      0x00002590 => "\xde",
      0x00002591 => "\xb0",
      0x00002592 => "\xb1",
      0x00002593 => "\xb2",
      0x000025a0 => "\xfe",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::IBM866 - Conversion routines for IBM866
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for IBM866.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   automatically generated from the charDB
   alias CP866
   alias 866
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL
      01 |  00000001 | START OF HEADING
      02 |  00000002 | START OF TEXT
      03 |  00000003 | END OF TEXT
      04 |  00000004 | END OF TRANSMISSION
      05 |  00000005 | ENQUIRY
      06 |  00000006 | ACKNOWLEDGE
      07 |  00000007 | BELL
      08 |  00000008 | BACKSPACE
      09 |  00000009 | HORIZONTAL TABULATION
      0A |  0000000A | LINE FEED
      0B |  0000000B | VERTICAL TABULATION
      0C |  0000000C | FORM FEED
      0D |  0000000D | CARRIAGE RETURN
      0E |  0000000E | SHIFT OUT
      0F |  0000000F | SHIFT IN
      10 |  00000010 | DATA LINK ESCAPE
      11 |  00000011 | DEVICE CONTROL ONE
      12 |  00000012 | DEVICE CONTROL TWO
      13 |  00000013 | DEVICE CONTROL THREE
      14 |  00000014 | DEVICE CONTROL FOUR
      15 |  00000015 | NEGATIVE ACKNOWLEDGE
      16 |  00000016 | SYNCHRONOUS IDLE
      17 |  00000017 | END OF TRANSMISSION BLOCK
      18 |  00000018 | CANCEL
      19 |  00000019 | END OF MEDIUM
      1A |  0000001A | SUBSTITUTE
      1B |  0000001B | ESCAPE
      1C |  0000001C | FILE SEPARATOR
      1D |  0000001D | GROUP SEPARATOR
      1E |  0000001E | RECORD SEPARATOR
      1F |  0000001F | UNIT SEPARATOR
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE
      80 |  00000410 | CYRILLIC CAPITAL LETTER A
      81 |  00000411 | CYRILLIC CAPITAL LETTER BE
      82 |  00000412 | CYRILLIC CAPITAL LETTER VE
      83 |  00000413 | CYRILLIC CAPITAL LETTER GHE
      84 |  00000414 | CYRILLIC CAPITAL LETTER DE
      85 |  00000415 | CYRILLIC CAPITAL LETTER IE
      86 |  00000416 | CYRILLIC CAPITAL LETTER ZHE
      87 |  00000417 | CYRILLIC CAPITAL LETTER ZE
      88 |  00000418 | CYRILLIC CAPITAL LETTER I
      89 |  00000419 | CYRILLIC CAPITAL LETTER SHORT I
      8A |  0000041A | CYRILLIC CAPITAL LETTER KA
      8B |  0000041B | CYRILLIC CAPITAL LETTER EL
      8C |  0000041C | CYRILLIC CAPITAL LETTER EM
      8D |  0000041D | CYRILLIC CAPITAL LETTER EN
      8E |  0000041E | CYRILLIC CAPITAL LETTER O
      8F |  0000041F | CYRILLIC CAPITAL LETTER PE
      90 |  00000420 | CYRILLIC CAPITAL LETTER ER
      91 |  00000421 | CYRILLIC CAPITAL LETTER ES
      92 |  00000422 | CYRILLIC CAPITAL LETTER TE
      93 |  00000423 | CYRILLIC CAPITAL LETTER U
      94 |  00000424 | CYRILLIC CAPITAL LETTER EF
      95 |  00000425 | CYRILLIC CAPITAL LETTER HA
      96 |  00000426 | CYRILLIC CAPITAL LETTER TSE
      97 |  00000427 | CYRILLIC CAPITAL LETTER CHE
      98 |  00000428 | CYRILLIC CAPITAL LETTER SHA
      99 |  00000429 | CYRILLIC CAPITAL LETTER SHCHA
      9A |  0000042A | CYRILLIC CAPITAL LETTER HARD SIGN
      9B |  0000042B | CYRILLIC CAPITAL LETTER YERU
      9C |  0000042C | CYRILLIC CAPITAL LETTER SOFT SIGN
      9D |  0000042D | CYRILLIC CAPITAL LETTER E
      9E |  0000042E | CYRILLIC CAPITAL LETTER YU
      9F |  0000042F | CYRILLIC CAPITAL LETTER YA
      A0 |  00000430 | CYRILLIC SMALL LETTER A
      A1 |  00000431 | CYRILLIC SMALL LETTER BE
      A2 |  00000432 | CYRILLIC SMALL LETTER VE
      A3 |  00000433 | CYRILLIC SMALL LETTER GHE
      A4 |  00000434 | CYRILLIC SMALL LETTER DE
      A5 |  00000435 | CYRILLIC SMALL LETTER IE
      A6 |  00000436 | CYRILLIC SMALL LETTER ZHE
      A7 |  00000437 | CYRILLIC SMALL LETTER ZE
      A8 |  00000438 | CYRILLIC SMALL LETTER I
      A9 |  00000439 | CYRILLIC SMALL LETTER SHORT I
      AA |  0000043A | CYRILLIC SMALL LETTER KA
      AB |  0000043B | CYRILLIC SMALL LETTER EL
      AC |  0000043C | CYRILLIC SMALL LETTER EM
      AD |  0000043D | CYRILLIC SMALL LETTER EN
      AE |  0000043E | CYRILLIC SMALL LETTER O
      AF |  0000043F | CYRILLIC SMALL LETTER PE
      B0 |  00002591 | LIGHT SHADE
      B1 |  00002592 | MEDIUM SHADE
      B2 |  00002593 | DARK SHADE
      B3 |  00002502 | BOX DRAWINGS LIGHT VERTICAL
      B4 |  00002524 | BOX DRAWINGS LIGHT VERTICAL AND LEFT
      B5 |  00002561 | BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
      B6 |  00002562 | BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
      B7 |  00002556 | BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
      B8 |  00002555 | BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
      B9 |  00002563 | BOX DRAWINGS DOUBLE VERTICAL AND LEFT
      BA |  00002551 | BOX DRAWINGS DOUBLE VERTICAL
      BB |  00002557 | BOX DRAWINGS DOUBLE DOWN AND LEFT
      BC |  0000255D | BOX DRAWINGS DOUBLE UP AND LEFT
      BD |  0000255C | BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
      BE |  0000255B | BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
      BF |  00002510 | BOX DRAWINGS LIGHT DOWN AND LEFT
      C0 |  00002514 | BOX DRAWINGS LIGHT UP AND RIGHT
      C1 |  00002534 | BOX DRAWINGS LIGHT UP AND HORIZONTAL
      C2 |  0000252C | BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
      C3 |  0000251C | BOX DRAWINGS LIGHT VERTICAL AND RIGHT
      C4 |  00002500 | BOX DRAWINGS LIGHT HORIZONTAL
      C5 |  0000253C | BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
      C6 |  0000255E | BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
      C7 |  0000255F | BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
      C8 |  0000255A | BOX DRAWINGS DOUBLE UP AND RIGHT
      C9 |  00002554 | BOX DRAWINGS DOUBLE DOWN AND RIGHT
      CA |  00002569 | BOX DRAWINGS DOUBLE UP AND HORIZONTAL
      CB |  00002566 | BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
      CC |  00002560 | BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
      CD |  00002550 | BOX DRAWINGS DOUBLE HORIZONTAL
      CE |  0000256C | BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
      CF |  00002567 | BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
      D0 |  00002568 | BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
      D1 |  00002564 | BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
      D2 |  00002565 | BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
      D3 |  00002559 | BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
      D4 |  00002558 | BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
      D5 |  00002552 | BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
      D6 |  00002553 | BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
      D7 |  0000256B | BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
      D8 |  0000256A | BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
      D9 |  00002518 | BOX DRAWINGS LIGHT UP AND LEFT
      DA |  0000250C | BOX DRAWINGS LIGHT DOWN AND RIGHT
      DB |  00002588 | FULL BLOCK
      DC |  00002584 | LOWER HALF BLOCK
      DD |  0000258C | LEFT HALF BLOCK
      DE |  00002590 | RIGHT HALF BLOCK
      DF |  00002580 | UPPER HALF BLOCK
      E0 |  00000440 | CYRILLIC SMALL LETTER ER
      E1 |  00000441 | CYRILLIC SMALL LETTER ES
      E2 |  00000442 | CYRILLIC SMALL LETTER TE
      E3 |  00000443 | CYRILLIC SMALL LETTER U
      E4 |  00000444 | CYRILLIC SMALL LETTER EF
      E5 |  00000445 | CYRILLIC SMALL LETTER HA
      E6 |  00000446 | CYRILLIC SMALL LETTER TSE
      E7 |  00000447 | CYRILLIC SMALL LETTER CHE
      E8 |  00000448 | CYRILLIC SMALL LETTER SHA
      E9 |  00000449 | CYRILLIC SMALL LETTER SHCHA
      EA |  0000044A | CYRILLIC SMALL LETTER HARD SIGN
      EB |  0000044B | CYRILLIC SMALL LETTER YERU
      EC |  0000044C | CYRILLIC SMALL LETTER SOFT SIGN
      ED |  0000044D | CYRILLIC SMALL LETTER E
      EE |  0000044E | CYRILLIC SMALL LETTER YU
      EF |  0000044F | CYRILLIC SMALL LETTER YA
      F0 |  00000401 | CYRILLIC CAPITAL LETTER IO
      F1 |  00000451 | CYRILLIC SMALL LETTER IO
      F2 |  00000404 | CYRILLIC CAPITAL LETTER UKRAINIAN IE
      F3 |  00000454 | CYRILLIC SMALL LETTER UKRAINIAN IE
      F4 |  00000407 | CYRILLIC CAPITAL LETTER YI
      F5 |  00000457 | CYRILLIC SMALL LETTER YI
      F6 |  0000040E | CYRILLIC CAPITAL LETTER SHORT U
      F7 |  0000045E | CYRILLIC SMALL LETTER SHORT U
      F8 |  000000B0 | DEGREE SIGN
      F9 |  00002219 | BULLET OPERATOR
      FA |  000000B7 | MIDDLE DOT
      FB |  0000221A | SQUARE ROOT
      FC |  00002116 | NUMERO SIGN
      FD |  000000A4 | CURRENCY SIGN
      FE |  000025A0 | BLACK SQUARE
      FF |  000000A0 | NO-BREAK SPACE
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_IBM866

    $main::fatpacked{"Locale/RecodeData/IBM868.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_IBM868';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for IBM868.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::IBM868;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0x0660,
      0x0661,
      0x0662,
      0x0663,
      0x0664,
      0x0665,
      0x0666,
      0x0667,
      0x0668,
      0x0669,
      0x060c,
      0x061b,
      0x061f,
      0x0622,
      0x0627,
      0xfe8e,
      0xe016,
      0x0628,
      0xfe91,
      0x067e,
      0xfffd,
      0x0629,
      0x062a,
      0xfe97,
      0xfffd,
      0xfffd,
      0x062b,
      0xfe9b,
      0x062c,
      0xfe9f,
      0xfffd,
      0xfffd,
      0x062d,
      0xfea3,
      0x062e,
      0xfea7,
      0x062f,
      0xfffd,
      0x0630,
      0x0631,
      0xfffd,
      0x0632,
      0xfffd,
      0x0633,
      0xfeb3,
      0x0634,
      0x00ab,
      0x00bb,
      0xfeb7,
      0x0635,
      0x2591,
      0x2592,
      0x2593,
      0x2502,
      0x2524,
      0xfebb,
      0x0636,
      0xfebf,
      0x0637,
      0x2563,
      0x2551,
      0x2557,
      0x255d,
      0x0638,
      0x0639,
      0x2510,
      0x2514,
      0x2534,
      0x252c,
      0x251c,
      0x2500,
      0x253c,
      0xfeca,
      0xfecb,
      0x255a,
      0x2554,
      0x2569,
      0x2566,
      0x2560,
      0x2550,
      0x256c,
      0xfecc,
      0x063a,
      0xfece,
      0xfecf,
      0xfed0,
      0x0641,
      0xfed3,
      0x0642,
      0xfed7,
      0xfeda,
      0x2518,
      0x250c,
      0x2588,
      0x2580,
      0xfedb,
      0xfffd,
      0x2584,
      0xfffd,
      0x0644,
      0xfede,
      0xfee0,
      0x0645,
      0xfee3,
      0xfffd,
      0x0646,
      0xfee7,
      0xfffd,
      0x0648,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0621,
      0x00ad,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0651,
      0xfe7d,
      0xfffd,
      0x25a0,
      0x00a0,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xd9\xa0",
      "\xd9\xa1",
      "\xd9\xa2",
      "\xd9\xa3",
      "\xd9\xa4",
      "\xd9\xa5",
      "\xd9\xa6",
      "\xd9\xa7",
      "\xd9\xa8",
      "\xd9\xa9",
      "\xd8\x8c",
      "\xd8\x9b",
      "\xd8\x9f",
      "\xd8\xa2",
      "\xd8\xa7",
      "\xef\xba\x8e",
      "\xee\x80\x96",
      "\xd8\xa8",
      "\xef\xba\x91",
      "\xd9\xbe",
      "\xef\xbf\xbd",
      "\xd8\xa9",
      "\xd8\xaa",
      "\xef\xba\x97",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xd8\xab",
      "\xef\xba\x9b",
      "\xd8\xac",
      "\xef\xba\x9f",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xd8\xad",
      "\xef\xba\xa3",
      "\xd8\xae",
      "\xef\xba\xa7",
      "\xd8\xaf",
      "\xef\xbf\xbd",
      "\xd8\xb0",
      "\xd8\xb1",
      "\xef\xbf\xbd",
      "\xd8\xb2",
      "\xef\xbf\xbd",
      "\xd8\xb3",
      "\xef\xba\xb3",
      "\xd8\xb4",
      "\xc2\xab",
      "\xc2\xbb",
      "\xef\xba\xb7",
      "\xd8\xb5",
      "\xe2\x96\x91",
      "\xe2\x96\x92",
      "\xe2\x96\x93",
      "\xe2\x94\x82",
      "\xe2\x94\xa4",
      "\xef\xba\xbb",
      "\xd8\xb6",
      "\xef\xba\xbf",
      "\xd8\xb7",
      "\xe2\x95\xa3",
      "\xe2\x95\x91",
      "\xe2\x95\x97",
      "\xe2\x95\x9d",
      "\xd8\xb8",
      "\xd8\xb9",
      "\xe2\x94\x90",
      "\xe2\x94\x94",
      "\xe2\x94\xb4",
      "\xe2\x94\xac",
      "\xe2\x94\x9c",
      "\xe2\x94\x80",
      "\xe2\x94\xbc",
      "\xef\xbb\x8a",
      "\xef\xbb\x8b",
      "\xe2\x95\x9a",
      "\xe2\x95\x94",
      "\xe2\x95\xa9",
      "\xe2\x95\xa6",
      "\xe2\x95\xa0",
      "\xe2\x95\x90",
      "\xe2\x95\xac",
      "\xef\xbb\x8c",
      "\xd8\xba",
      "\xef\xbb\x8e",
      "\xef\xbb\x8f",
      "\xef\xbb\x90",
      "\xd9\x81",
      "\xef\xbb\x93",
      "\xd9\x82",
      "\xef\xbb\x97",
      "\xef\xbb\x9a",
      "\xe2\x94\x98",
      "\xe2\x94\x8c",
      "\xe2\x96\x88",
      "\xe2\x96\x80",
      "\xef\xbb\x9b",
      "\xef\xbf\xbd",
      "\xe2\x96\x84",
      "\xef\xbf\xbd",
      "\xd9\x84",
      "\xef\xbb\x9e",
      "\xef\xbb\xa0",
      "\xd9\x85",
      "\xef\xbb\xa3",
      "\xef\xbf\xbd",
      "\xd9\x86",
      "\xef\xbb\xa7",
      "\xef\xbf\xbd",
      "\xd9\x88",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xd8\xa1",
      "\xc2\xad",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xd9\x91",
      "\xef\xb9\xbd",
      "\xef\xbf\xbd",
      "\xe2\x96\xa0",
      "\xc2\xa0",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x000000a0 => "\xff",
      0x000000ab => "\xae",
      0x000000ad => "\xf2",
      0x000000bb => "\xaf",
      0x0000060c => "\x8a",
      0x0000061b => "\x8b",
      0x0000061f => "\x8c",
      0x00000621 => "\xf1",
      0x00000622 => "\x8d",
      0x00000627 => "\x8e",
      0x00000628 => "\x91",
      0x00000629 => "\x95",
      0x0000062a => "\x96",
      0x0000062b => "\x9a",
      0x0000062c => "\x9c",
      0x0000062d => "\xa0",
      0x0000062e => "\xa2",
      0x0000062f => "\xa4",
      0x00000630 => "\xa6",
      0x00000631 => "\xa7",
      0x00000632 => "\xa9",
      0x00000633 => "\xab",
      0x00000634 => "\xad",
      0x00000635 => "\xb1",
      0x00000636 => "\xb8",
      0x00000637 => "\xba",
      0x00000638 => "\xbf",
      0x00000639 => "\xc0",
      0x0000063a => "\xd2",
      0x00000641 => "\xd6",
      0x00000642 => "\xd8",
      0x00000644 => "\xe3",
      0x00000645 => "\xe6",
      0x00000646 => "\xe9",
      0x00000648 => "\xec",
      0x00000651 => "\xfb",
      0x00000660 => "\x80",
      0x00000661 => "\x81",
      0x00000662 => "\x82",
      0x00000663 => "\x83",
      0x00000664 => "\x84",
      0x00000665 => "\x85",
      0x00000666 => "\x86",
      0x00000667 => "\x87",
      0x00000668 => "\x88",
      0x00000669 => "\x89",
      0x0000067e => "\x93",
      0x00002500 => "\xc6",
      0x00002502 => "\xb5",
      0x0000250c => "\xdc",
      0x00002510 => "\xc1",
      0x00002514 => "\xc2",
      0x00002518 => "\xdb",
      0x0000251c => "\xc5",
      0x00002524 => "\xb6",
      0x0000252c => "\xc4",
      0x00002534 => "\xc3",
      0x0000253c => "\xc7",
      0x00002550 => "\xcf",
      0x00002551 => "\xbc",
      0x00002554 => "\xcb",
      0x00002557 => "\xbd",
      0x0000255a => "\xca",
      0x0000255d => "\xbe",
      0x00002560 => "\xce",
      0x00002563 => "\xbb",
      0x00002566 => "\xcd",
      0x00002569 => "\xcc",
      0x0000256c => "\xd0",
      0x00002580 => "\xde",
      0x00002584 => "\xe1",
      0x00002588 => "\xdd",
      0x00002591 => "\xb2",
      0x00002592 => "\xb3",
      0x00002593 => "\xb4",
      0x000025a0 => "\xfe",
      0x0000e016 => "\x90",
      0x0000fe7d => "\xfc",
      0x0000fe8e => "\x8f",
      0x0000fe91 => "\x92",
      0x0000fe97 => "\x97",
      0x0000fe9b => "\x9b",
      0x0000fe9f => "\x9d",
      0x0000fea3 => "\xa1",
      0x0000fea7 => "\xa3",
      0x0000feb3 => "\xac",
      0x0000feb7 => "\xb0",
      0x0000febb => "\xb7",
      0x0000febf => "\xb9",
      0x0000feca => "\xc8",
      0x0000fecb => "\xc9",
      0x0000fecc => "\xd1",
      0x0000fece => "\xd3",
      0x0000fecf => "\xd4",
      0x0000fed0 => "\xd5",
      0x0000fed3 => "\xd7",
      0x0000fed7 => "\xd9",
      0x0000feda => "\xda",
      0x0000fedb => "\xdf",
      0x0000fede => "\xe4",
      0x0000fee0 => "\xe5",
      0x0000fee3 => "\xe7",
      0x0000fee7 => "\xea",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x8c"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::IBM868 - Conversion routines for IBM868
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for IBM868.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: IBM NLS RM Vol2 SE09-8002-01, March 1990
   alias CP868
   alias CP-AR
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE (DEL)
      80 |  00000660 | ARABIC-INDIC DIGIT ZERO
      81 |  00000661 | ARABIC-INDIC DIGIT ONE
      82 |  00000662 | ARABIC-INDIC DIGIT TWO
      83 |  00000663 | ARABIC-INDIC DIGIT THREE
      84 |  00000664 | ARABIC-INDIC DIGIT FOUR
      85 |  00000665 | ARABIC-INDIC DIGIT FIVE
      86 |  00000666 | ARABIC-INDIC DIGIT SIX
      87 |  00000667 | ARABIC-INDIC DIGIT SEVEN
      88 |  00000668 | ARABIC-INDIC DIGIT EIGHT
      89 |  00000669 | ARABIC-INDIC DIGIT NINE
      8A |  0000060C | ARABIC COMMA
      8B |  0000061B | ARABIC SEMICOLON
      8C |  0000061F | ARABIC QUESTION MARK
      8D |  00000622 | ARABIC LETTER ALEF WITH MADDA ABOVE
      8E |  00000627 | ARABIC LETTER ALEF
      8F |  0000FE8E | ARABIC LETTER ALEF FINAL FORM
      90 |  0000E016 | ARABIC LETTER ALEF FINAL FORM COMPATIBILITY E<lt>IBM868_90E<gt>
      91 |  00000628 | ARABIC LETTER BEH
      92 |  0000FE91 | ARABIC LETTER BEH INITIAL FORM
      93 |  0000067E | ARABIC LETTER PEH
      95 |  00000629 | ARABIC LETTER TEH MARBUTA
      96 |  0000062A | ARABIC LETTER TEH
      97 |  0000FE97 | ARABIC LETTER TEH INITIAL FORM
      9A |  0000062B | ARABIC LETTER THEH
      9B |  0000FE9B | ARABIC LETTER THEH INITIAL FORM
      9C |  0000062C | ARABIC LETTER JEEM
      9D |  0000FE9F | ARABIC LETTER JEEM INITIAL FORM
      A0 |  0000062D | ARABIC LETTER HAH
      A1 |  0000FEA3 | ARABIC LETTER HAH INITIAL FORM
      A2 |  0000062E | ARABIC LETTER KHAH
      A3 |  0000FEA7 | ARABIC LETTER KHAH INITIAL FORM
      A4 |  0000062F | ARABIC LETTER DAL
      A6 |  00000630 | ARABIC LETTER THAL
      A7 |  00000631 | ARABIC LETTER REH
      A9 |  00000632 | ARABIC LETTER ZAIN
      AB |  00000633 | ARABIC LETTER SEEN
      AC |  0000FEB3 | ARABIC LETTER SEEN INITIAL FORM
      AD |  00000634 | ARABIC LETTER SHEEN
      AE |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
      AF |  000000BB | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
      B0 |  0000FEB7 | ARABIC LETTER SHEEN INITIAL FORM
      B1 |  00000635 | ARABIC LETTER SAD
      B2 |  00002591 | LIGHT SHADE
      B3 |  00002592 | MEDIUM SHADE
      B4 |  00002593 | DARK SHADE
      B5 |  00002502 | BOX DRAWINGS LIGHT VERTICAL
      B6 |  00002524 | BOX DRAWINGS LIGHT VERTICAL AND LEFT
      B7 |  0000FEBB | ARABIC LETTER SAD INITIAL FORM
      B8 |  00000636 | ARABIC LETTER DAD
      B9 |  0000FEBF | ARABIC LETTER DAD INITIAL FORM
      BA |  00000637 | ARABIC LETTER TAH
      BB |  00002563 | BOX DRAWINGS DOUBLE VERTICAL AND LEFT
      BC |  00002551 | BOX DRAWINGS DOUBLE VERTICAL
      BD |  00002557 | BOX DRAWINGS DOUBLE DOWN AND LEFT
      BE |  0000255D | BOX DRAWINGS DOUBLE UP AND LEFT
      BF |  00000638 | ARABIC LETTER ZAH
      C0 |  00000639 | ARABIC LETTER AIN
      C1 |  00002510 | BOX DRAWINGS LIGHT DOWN AND LEFT
      C2 |  00002514 | BOX DRAWINGS LIGHT UP AND RIGHT
      C3 |  00002534 | BOX DRAWINGS LIGHT UP AND HORIZONTAL
      C4 |  0000252C | BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
      C5 |  0000251C | BOX DRAWINGS LIGHT VERTICAL AND RIGHT
      C6 |  00002500 | BOX DRAWINGS LIGHT HORIZONTAL
      C7 |  0000253C | BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
      C8 |  0000FECA | ARABIC LETTER AIN FINAL FORM
      C9 |  0000FECB | ARABIC LETTER AIN INITIAL FORM
      CA |  0000255A | BOX DRAWINGS DOUBLE UP AND RIGHT
      CB |  00002554 | BOX DRAWINGS DOUBLE DOWN AND RIGHT
      CC |  00002569 | BOX DRAWINGS DOUBLE UP AND HORIZONTAL
      CD |  00002566 | BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
      CE |  00002560 | BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
      CF |  00002550 | BOX DRAWINGS DOUBLE HORIZONTAL
      D0 |  0000256C | BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
      D1 |  0000FECC | ARABIC LETTER AIN MEDIAL FORM
      D2 |  0000063A | ARABIC LETTER GHAIN
      D3 |  0000FECE | ARABIC LETTER GHAIN FINAL FORM
      D4 |  0000FECF | ARABIC LETTER GHAIN INITIAL FORM
      D5 |  0000FED0 | ARABIC LETTER GHAIN MEDIAL FORM
      D6 |  00000641 | ARABIC LETTER FEH
      D7 |  0000FED3 | ARABIC LETTER FEH INITIAL FORM
      D8 |  00000642 | ARABIC LETTER QAF
      D9 |  0000FED7 | ARABIC LETTER QAF INITIAL FORM
      DA |  0000FEDA | ARABIC LETTER KAF FINAL FORM
      DB |  00002518 | BOX DRAWINGS LIGHT UP AND LEFT
      DC |  0000250C | BOX DRAWINGS LIGHT DOWN AND RIGHT
      DD |  00002588 | FULL BLOCK
      DE |  00002580 | UPPER HALF BLOCK
      DF |  0000FEDB | ARABIC LETTER KAF INITIAL FORM
      E1 |  00002584 | LOWER HALF BLOCK
      E3 |  00000644 | ARABIC LETTER LAM
      E4 |  0000FEDE | ARABIC LETTER LAM FINAL FORM
      E5 |  0000FEE0 | ARABIC LETTER LAM MEDIAL FORM
      E6 |  00000645 | ARABIC LETTER MEEM
      E7 |  0000FEE3 | ARABIC LETTER MEEM INITIAL FORM
      E9 |  00000646 | ARABIC LETTER NOON
      EA |  0000FEE7 | ARABIC LETTER NOON INITIAL FORM
      EC |  00000648 | ARABIC LETTER WAW
      F1 |  00000621 | ARABIC LETTER HAMZA
      F2 |  000000AD | SOFT HYPHEN
      FB |  00000651 | ARABIC SHADDA
      FC |  0000FE7D | ARABIC SHADDA MEDIAL FORM
      FE |  000025A0 | BLACK SQUARE
      FF |  000000A0 | NO-BREAK SPACE
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_IBM868

    $main::fatpacked{"Locale/RecodeData/IBM869.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_IBM869';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for IBM869.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::IBM869;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0386,
      0xfffd,
      0x00b7,
      0x00ac,
      0x00a6,
      0x2018,
      0x2019,
      0x0388,
      0x2015,
      0x0389,
      0x038a,
      0x03aa,
      0x038c,
      0xfffd,
      0xfffd,
      0x038e,
      0x03ab,
      0x00a9,
      0x038f,
      0x00b2,
      0x00b3,
      0x03ac,
      0x00a3,
      0x03ad,
      0x03ae,
      0x03af,
      0x03ca,
      0x0390,
      0x03cc,
      0x03cd,
      0x0391,
      0x0392,
      0x0393,
      0x0394,
      0x0395,
      0x0396,
      0x0397,
      0x00bd,
      0x0398,
      0x0399,
      0x00ab,
      0x00bb,
      0x2591,
      0x2592,
      0x2593,
      0x2502,
      0x2524,
      0x039a,
      0x039b,
      0x039c,
      0x039d,
      0x2563,
      0x2551,
      0x2557,
      0x255d,
      0x039e,
      0x039f,
      0x2510,
      0x2514,
      0x2534,
      0x252c,
      0x251c,
      0x2500,
      0x253c,
      0x03a0,
      0x03a1,
      0x255a,
      0x2554,
      0x2569,
      0x2566,
      0x2560,
      0x2550,
      0x256c,
      0x03a3,
      0x03a4,
      0x03a5,
      0x03a6,
      0x03a7,
      0x03a8,
      0x03a9,
      0x03b1,
      0x03b2,
      0x03b3,
      0x2518,
      0x250c,
      0x2588,
      0x2584,
      0x03b4,
      0x03b5,
      0x2580,
      0x03b6,
      0x03b7,
      0x03b8,
      0x03b9,
      0x03ba,
      0x03bb,
      0x03bc,
      0x03bd,
      0x03be,
      0x03bf,
      0x03c0,
      0x03c1,
      0x03c3,
      0x03c2,
      0x03c4,
      0x0384,
      0x00ad,
      0x00b1,
      0x03c5,
      0x03c6,
      0x03c7,
      0x00a7,
      0x03c8,
      0x0385,
      0x00b0,
      0x00a8,
      0x03c9,
      0x03cb,
      0x03b0,
      0x03ce,
      0x25a0,
      0x00a0,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xce\x86",
      "\xef\xbf\xbd",
      "\xc2\xb7",
      "\xc2\xac",
      "\xc2\xa6",
      "\xe2\x80\x98",
      "\xe2\x80\x99",
      "\xce\x88",
      "\xe2\x80\x95",
      "\xce\x89",
      "\xce\x8a",
      "\xce\xaa",
      "\xce\x8c",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xce\x8e",
      "\xce\xab",
      "\xc2\xa9",
      "\xce\x8f",
      "\xc2\xb2",
      "\xc2\xb3",
      "\xce\xac",
      "\xc2\xa3",
      "\xce\xad",
      "\xce\xae",
      "\xce\xaf",
      "\xcf\x8a",
      "\xce\x90",
      "\xcf\x8c",
      "\xcf\x8d",
      "\xce\x91",
      "\xce\x92",
      "\xce\x93",
      "\xce\x94",
      "\xce\x95",
      "\xce\x96",
      "\xce\x97",
      "\xc2\xbd",
      "\xce\x98",
      "\xce\x99",
      "\xc2\xab",
      "\xc2\xbb",
      "\xe2\x96\x91",
      "\xe2\x96\x92",
      "\xe2\x96\x93",
      "\xe2\x94\x82",
      "\xe2\x94\xa4",
      "\xce\x9a",
      "\xce\x9b",
      "\xce\x9c",
      "\xce\x9d",
      "\xe2\x95\xa3",
      "\xe2\x95\x91",
      "\xe2\x95\x97",
      "\xe2\x95\x9d",
      "\xce\x9e",
      "\xce\x9f",
      "\xe2\x94\x90",
      "\xe2\x94\x94",
      "\xe2\x94\xb4",
      "\xe2\x94\xac",
      "\xe2\x94\x9c",
      "\xe2\x94\x80",
      "\xe2\x94\xbc",
      "\xce\xa0",
      "\xce\xa1",
      "\xe2\x95\x9a",
      "\xe2\x95\x94",
      "\xe2\x95\xa9",
      "\xe2\x95\xa6",
      "\xe2\x95\xa0",
      "\xe2\x95\x90",
      "\xe2\x95\xac",
      "\xce\xa3",
      "\xce\xa4",
      "\xce\xa5",
      "\xce\xa6",
      "\xce\xa7",
      "\xce\xa8",
      "\xce\xa9",
      "\xce\xb1",
      "\xce\xb2",
      "\xce\xb3",
      "\xe2\x94\x98",
      "\xe2\x94\x8c",
      "\xe2\x96\x88",
      "\xe2\x96\x84",
      "\xce\xb4",
      "\xce\xb5",
      "\xe2\x96\x80",
      "\xce\xb6",
      "\xce\xb7",
      "\xce\xb8",
      "\xce\xb9",
      "\xce\xba",
      "\xce\xbb",
      "\xce\xbc",
      "\xce\xbd",
      "\xce\xbe",
      "\xce\xbf",
      "\xcf\x80",
      "\xcf\x81",
      "\xcf\x83",
      "\xcf\x82",
      "\xcf\x84",
      "\xce\x84",
      "\xc2\xad",
      "\xc2\xb1",
      "\xcf\x85",
      "\xcf\x86",
      "\xcf\x87",
      "\xc2\xa7",
      "\xcf\x88",
      "\xce\x85",
      "\xc2\xb0",
      "\xc2\xa8",
      "\xcf\x89",
      "\xcf\x8b",
      "\xce\xb0",
      "\xcf\x8e",
      "\xe2\x96\xa0",
      "\xc2\xa0",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x000000a0 => "\xff",
      0x000000a3 => "\x9c",
      0x000000a6 => "\x8a",
      0x000000a7 => "\xf5",
      0x000000a8 => "\xf9",
      0x000000a9 => "\x97",
      0x000000ab => "\xae",
      0x000000ac => "\x89",
      0x000000ad => "\xf0",
      0x000000b0 => "\xf8",
      0x000000b1 => "\xf1",
      0x000000b2 => "\x99",
      0x000000b3 => "\x9a",
      0x000000b7 => "\x88",
      0x000000bb => "\xaf",
      0x000000bd => "\xab",
      0x00000384 => "\xef",
      0x00000385 => "\xf7",
      0x00000386 => "\x86",
      0x00000388 => "\x8d",
      0x00000389 => "\x8f",
      0x0000038a => "\x90",
      0x0000038c => "\x92",
      0x0000038e => "\x95",
      0x0000038f => "\x98",
      0x00000390 => "\xa1",
      0x00000391 => "\xa4",
      0x00000392 => "\xa5",
      0x00000393 => "\xa6",
      0x00000394 => "\xa7",
      0x00000395 => "\xa8",
      0x00000396 => "\xa9",
      0x00000397 => "\xaa",
      0x00000398 => "\xac",
      0x00000399 => "\xad",
      0x0000039a => "\xb5",
      0x0000039b => "\xb6",
      0x0000039c => "\xb7",
      0x0000039d => "\xb8",
      0x0000039e => "\xbd",
      0x0000039f => "\xbe",
      0x000003a0 => "\xc6",
      0x000003a1 => "\xc7",
      0x000003a3 => "\xcf",
      0x000003a4 => "\xd0",
      0x000003a5 => "\xd1",
      0x000003a6 => "\xd2",
      0x000003a7 => "\xd3",
      0x000003a8 => "\xd4",
      0x000003a9 => "\xd5",
      0x000003aa => "\x91",
      0x000003ab => "\x96",
      0x000003ac => "\x9b",
      0x000003ad => "\x9d",
      0x000003ae => "\x9e",
      0x000003af => "\x9f",
      0x000003b0 => "\xfc",
      0x000003b1 => "\xd6",
      0x000003b2 => "\xd7",
      0x000003b3 => "\xd8",
      0x000003b4 => "\xdd",
      0x000003b5 => "\xde",
      0x000003b6 => "\xe0",
      0x000003b7 => "\xe1",
      0x000003b8 => "\xe2",
      0x000003b9 => "\xe3",
      0x000003ba => "\xe4",
      0x000003bb => "\xe5",
      0x000003bc => "\xe6",
      0x000003bd => "\xe7",
      0x000003be => "\xe8",
      0x000003bf => "\xe9",
      0x000003c0 => "\xea",
      0x000003c1 => "\xeb",
      0x000003c2 => "\xed",
      0x000003c3 => "\xec",
      0x000003c4 => "\xee",
      0x000003c5 => "\xf2",
      0x000003c6 => "\xf3",
      0x000003c7 => "\xf4",
      0x000003c8 => "\xf6",
      0x000003c9 => "\xfa",
      0x000003ca => "\xa0",
      0x000003cb => "\xfb",
      0x000003cc => "\xa2",
      0x000003cd => "\xa3",
      0x000003ce => "\xfd",
      0x00002015 => "\x8e",
      0x00002018 => "\x8b",
      0x00002019 => "\x8c",
      0x00002500 => "\xc4",
      0x00002502 => "\xb3",
      0x0000250c => "\xda",
      0x00002510 => "\xbf",
      0x00002514 => "\xc0",
      0x00002518 => "\xd9",
      0x0000251c => "\xc3",
      0x00002524 => "\xb4",
      0x0000252c => "\xc2",
      0x00002534 => "\xc1",
      0x0000253c => "\xc5",
      0x00002550 => "\xcd",
      0x00002551 => "\xba",
      0x00002554 => "\xc9",
      0x00002557 => "\xbb",
      0x0000255a => "\xc8",
      0x0000255d => "\xbc",
      0x00002560 => "\xcc",
      0x00002563 => "\xb9",
      0x00002566 => "\xcb",
      0x00002569 => "\xca",
      0x0000256c => "\xce",
      0x00002580 => "\xdf",
      0x00002584 => "\xdc",
      0x00002588 => "\xdb",
      0x00002591 => "\xb0",
      0x00002592 => "\xb1",
      0x00002593 => "\xb2",
      0x000025a0 => "\xfe",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::IBM869 - Conversion routines for IBM869
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for IBM869.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: IBM Keyboard layouts and code pages, PN 07G4586 June 1991
   alias CP869
   alias 869
   alias CP-GR
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE (DEL)
      86 |  00000386 | GREEK CAPITAL LETTER ALPHA WITH TONOS
      88 |  000000B7 | MIDDLE DOT
      89 |  000000AC | NOT SIGN
      8A |  000000A6 | BROKEN BAR
      8B |  00002018 | LEFT SINGLE QUOTATION MARK
      8C |  00002019 | RIGHT SINGLE QUOTATION MARK
      8D |  00000388 | GREEK CAPITAL LETTER EPSILON WITH TONOS
      8E |  00002015 | HORIZONTAL BAR
      8F |  00000389 | GREEK CAPITAL LETTER ETA WITH TONOS
      90 |  0000038A | GREEK CAPITAL LETTER IOTA WITH TONOS
      91 |  000003AA | GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
      92 |  0000038C | GREEK CAPITAL LETTER OMICRON WITH TONOS
      95 |  0000038E | GREEK CAPITAL LETTER UPSILON WITH TONOS
      96 |  000003AB | GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
      97 |  000000A9 | COPYRIGHT SIGN
      98 |  0000038F | GREEK CAPITAL LETTER OMEGA WITH TONOS
      99 |  000000B2 | SUPERSCRIPT TWO
      9A |  000000B3 | SUPERSCRIPT THREE
      9B |  000003AC | GREEK SMALL LETTER ALPHA WITH TONOS
      9C |  000000A3 | POUND SIGN
      9D |  000003AD | GREEK SMALL LETTER EPSILON WITH TONOS
      9E |  000003AE | GREEK SMALL LETTER ETA WITH TONOS
      9F |  000003AF | GREEK SMALL LETTER IOTA WITH TONOS
      A0 |  000003CA | GREEK SMALL LETTER IOTA WITH DIALYTIKA
      A1 |  00000390 | GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
      A2 |  000003CC | GREEK SMALL LETTER OMICRON WITH TONOS
      A3 |  000003CD | GREEK SMALL LETTER UPSILON WITH TONOS
      A4 |  00000391 | GREEK CAPITAL LETTER ALPHA
      A5 |  00000392 | GREEK CAPITAL LETTER BETA
      A6 |  00000393 | GREEK CAPITAL LETTER GAMMA
      A7 |  00000394 | GREEK CAPITAL LETTER DELTA
      A8 |  00000395 | GREEK CAPITAL LETTER EPSILON
      A9 |  00000396 | GREEK CAPITAL LETTER ZETA
      AA |  00000397 | GREEK CAPITAL LETTER ETA
      AB |  000000BD | VULGAR FRACTION ONE HALF
      AC |  00000398 | GREEK CAPITAL LETTER THETA
      AD |  00000399 | GREEK CAPITAL LETTER IOTA
      AE |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
      AF |  000000BB | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
      B0 |  00002591 | LIGHT SHADE
      B1 |  00002592 | MEDIUM SHADE
      B2 |  00002593 | DARK SHADE
      B3 |  00002502 | BOX DRAWINGS LIGHT VERTICAL
      B4 |  00002524 | BOX DRAWINGS LIGHT VERTICAL AND LEFT
      B5 |  0000039A | GREEK CAPITAL LETTER KAPPA
      B6 |  0000039B | GREEK CAPITAL LETTER LAMDA
      B7 |  0000039C | GREEK CAPITAL LETTER MU
      B8 |  0000039D | GREEK CAPITAL LETTER NU
      B9 |  00002563 | BOX DRAWINGS DOUBLE VERTICAL AND LEFT
      BA |  00002551 | BOX DRAWINGS DOUBLE VERTICAL
      BB |  00002557 | BOX DRAWINGS DOUBLE DOWN AND LEFT
      BC |  0000255D | BOX DRAWINGS DOUBLE UP AND LEFT
      BD |  0000039E | GREEK CAPITAL LETTER XI
      BE |  0000039F | GREEK CAPITAL LETTER OMICRON
      BF |  00002510 | BOX DRAWINGS LIGHT DOWN AND LEFT
      C0 |  00002514 | BOX DRAWINGS LIGHT UP AND RIGHT
      C1 |  00002534 | BOX DRAWINGS LIGHT UP AND HORIZONTAL
      C2 |  0000252C | BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
      C3 |  0000251C | BOX DRAWINGS LIGHT VERTICAL AND RIGHT
      C4 |  00002500 | BOX DRAWINGS LIGHT HORIZONTAL
      C5 |  0000253C | BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
      C6 |  000003A0 | GREEK CAPITAL LETTER PI
      C7 |  000003A1 | GREEK CAPITAL LETTER RHO
      C8 |  0000255A | BOX DRAWINGS DOUBLE UP AND RIGHT
      C9 |  00002554 | BOX DRAWINGS DOUBLE DOWN AND RIGHT
      CA |  00002569 | BOX DRAWINGS DOUBLE UP AND HORIZONTAL
      CB |  00002566 | BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
      CC |  00002560 | BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
      CD |  00002550 | BOX DRAWINGS DOUBLE HORIZONTAL
      CE |  0000256C | BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
      CF |  000003A3 | GREEK CAPITAL LETTER SIGMA
      D0 |  000003A4 | GREEK CAPITAL LETTER TAU
      D1 |  000003A5 | GREEK CAPITAL LETTER UPSILON
      D2 |  000003A6 | GREEK CAPITAL LETTER PHI
      D3 |  000003A7 | GREEK CAPITAL LETTER CHI
      D4 |  000003A8 | GREEK CAPITAL LETTER PSI
      D5 |  000003A9 | GREEK CAPITAL LETTER OMEGA
      D6 |  000003B1 | GREEK SMALL LETTER ALPHA
      D7 |  000003B2 | GREEK SMALL LETTER BETA
      D8 |  000003B3 | GREEK SMALL LETTER GAMMA
      D9 |  00002518 | BOX DRAWINGS LIGHT UP AND LEFT
      DA |  0000250C | BOX DRAWINGS LIGHT DOWN AND RIGHT
      DB |  00002588 | FULL BLOCK
      DC |  00002584 | LOWER HALF BLOCK
      DD |  000003B4 | GREEK SMALL LETTER DELTA
      DE |  000003B5 | GREEK SMALL LETTER EPSILON
      DF |  00002580 | UPPER HALF BLOCK
      E0 |  000003B6 | GREEK SMALL LETTER ZETA
      E1 |  000003B7 | GREEK SMALL LETTER ETA
      E2 |  000003B8 | GREEK SMALL LETTER THETA
      E3 |  000003B9 | GREEK SMALL LETTER IOTA
      E4 |  000003BA | GREEK SMALL LETTER KAPPA
      E5 |  000003BB | GREEK SMALL LETTER LAMDA
      E6 |  000003BC | GREEK SMALL LETTER MU
      E7 |  000003BD | GREEK SMALL LETTER NU
      E8 |  000003BE | GREEK SMALL LETTER XI
      E9 |  000003BF | GREEK SMALL LETTER OMICRON
      EA |  000003C0 | GREEK SMALL LETTER PI
      EB |  000003C1 | GREEK SMALL LETTER RHO
      EC |  000003C3 | GREEK SMALL LETTER SIGMA
      ED |  000003C2 | GREEK SMALL LETTER FINAL SIGMA
      EE |  000003C4 | GREEK SMALL LETTER TAU
      EF |  00000384 | GREEK TONOS
      F0 |  000000AD | SOFT HYPHEN
      F1 |  000000B1 | PLUS-MINUS SIGN
      F2 |  000003C5 | GREEK SMALL LETTER UPSILON
      F3 |  000003C6 | GREEK SMALL LETTER PHI
      F4 |  000003C7 | GREEK SMALL LETTER CHI
      F5 |  000000A7 | SECTION SIGN
      F6 |  000003C8 | GREEK SMALL LETTER PSI
      F7 |  00000385 | GREEK DIALYTIKA TONOS
      F8 |  000000B0 | DEGREE SIGN
      F9 |  000000A8 | DIAERESIS
      FA |  000003C9 | GREEK SMALL LETTER OMEGA
      FB |  000003CB | GREEK SMALL LETTER UPSILON WITH DIALYTIKA
      FC |  000003B0 | GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
      FD |  000003CE | GREEK SMALL LETTER OMEGA WITH TONOS
      FE |  000025A0 | BLACK SQUARE
      FF |  000000A0 | NO-BREAK SPACE
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_IBM869

    $main::fatpacked{"Locale/RecodeData/IBM870.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_IBM870';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for IBM870.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::IBM870;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x009c,
      0x0009,
      0x0086,
      0x007f,
      0x0097,
      0x008d,
      0x008e,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x009d,
      0x0085,
      0x0008,
      0x0087,
      0x0018,
      0x0019,
      0x0092,
      0x008f,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0080,
      0x0081,
      0x0082,
      0x0083,
      0x0084,
      0x000a,
      0x0017,
      0x001b,
      0x0088,
      0x0089,
      0x008a,
      0x008b,
      0x008c,
      0x0005,
      0x0006,
      0x0007,
      0x0090,
      0x0091,
      0x0016,
      0x0093,
      0x0094,
      0x0095,
      0x0096,
      0x0004,
      0x0098,
      0x0099,
      0x009a,
      0x009b,
      0x0014,
      0x0015,
      0x009e,
      0x001a,
      0x0020,
      0x00a0,
      0xfffd,
      0x00e4,
      0xfffd,
      0x00e1,
      0x0103,
      0x010d,
      0x00e7,
      0x0107,
      0x005b,
      0x002e,
      0x003c,
      0x0028,
      0x002b,
      0x0021,
      0x0026,
      0x00e9,
      0xfffd,
      0x00eb,
      0x016f,
      0x00ed,
      0xfffd,
      0x013e,
      0x013a,
      0x00df,
      0x005d,
      0x0024,
      0x002a,
      0x0029,
      0x003b,
      0x005e,
      0x002d,
      0x002f,
      0xfffd,
      0x00c4,
      0x02dd,
      0x00c1,
      0xfffd,
      0x010c,
      0x00c7,
      0x0106,
      0x007c,
      0x002c,
      0x0025,
      0x005f,
      0x003e,
      0x003f,
      0x02c7,
      0x00c9,
      0xfffd,
      0x00cb,
      0x016e,
      0x00cd,
      0xfffd,
      0x013d,
      0x0139,
      0x0060,
      0x003a,
      0x0023,
      0x0040,
      0x0027,
      0x003d,
      0x0022,
      0x02d8,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x015b,
      0x0148,
      0x0111,
      0x00fd,
      0x0159,
      0xfffd,
      0x00b0,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0142,
      0x0144,
      0x0161,
      0x00b8,
      0x02db,
      0x00a4,
      0x0105,
      0x007e,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x015a,
      0x0147,
      0x0110,
      0x00dd,
      0x0158,
      0xfffd,
      0x00b7,
      0x0104,
      0x017c,
      0xfffd,
      0x017b,
      0x00a7,
      0x00b6,
      0x017e,
      0x017a,
      0x017d,
      0x0179,
      0x0143,
      0x0160,
      0x00a8,
      0x00b4,
      0x00d7,
      0x007b,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x00ad,
      0x00f4,
      0x00f6,
      0x0155,
      0x00f3,
      0x0151,
      0x007d,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x011a,
      0x0171,
      0x00fc,
      0x0165,
      0x00fa,
      0x011b,
      0x005c,
      0x00f7,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x010f,
      0x00d4,
      0x00d6,
      0x0154,
      0x00d3,
      0x0150,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x010e,
      0x0170,
      0x00dc,
      0x0164,
      0x00da,
      0x009f,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\xc2\x9c",
      "\x09",
      "\xc2\x86",
      "\x7f",
      "\xc2\x97",
      "\xc2\x8d",
      "\xc2\x8e",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\xc2\x9d",
      "\xc2\x85",
      "\x08",
      "\xc2\x87",
      "\x18",
      "\x19",
      "\xc2\x92",
      "\xc2\x8f",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\xc2\x80",
      "\xc2\x81",
      "\xc2\x82",
      "\xc2\x83",
      "\xc2\x84",
      "\x0a",
      "\x17",
      "\x1b",
      "\xc2\x88",
      "\xc2\x89",
      "\xc2\x8a",
      "\xc2\x8b",
      "\xc2\x8c",
      "\x05",
      "\x06",
      "\x07",
      "\xc2\x90",
      "\xc2\x91",
      "\x16",
      "\xc2\x93",
      "\xc2\x94",
      "\xc2\x95",
      "\xc2\x96",
      "\x04",
      "\xc2\x98",
      "\xc2\x99",
      "\xc2\x9a",
      "\xc2\x9b",
      "\x14",
      "\x15",
      "\xc2\x9e",
      "\x1a",
      "\x20",
      "\xc2\xa0",
      "\xef\xbf\xbd",
      "\xc3\xa4",
      "\xef\xbf\xbd",
      "\xc3\xa1",
      "\xc4\x83",
      "\xc4\x8d",
      "\xc3\xa7",
      "\xc4\x87",
      "\x5b",
      "\x2e",
      "\x3c",
      "\x28",
      "\x2b",
      "\x21",
      "\x26",
      "\xc3\xa9",
      "\xef\xbf\xbd",
      "\xc3\xab",
      "\xc5\xaf",
      "\xc3\xad",
      "\xef\xbf\xbd",
      "\xc4\xbe",
      "\xc4\xba",
      "\xc3\x9f",
      "\x5d",
      "\x24",
      "\x2a",
      "\x29",
      "\x3b",
      "\x5e",
      "\x2d",
      "\x2f",
      "\xef\xbf\xbd",
      "\xc3\x84",
      "\xcb\x9d",
      "\xc3\x81",
      "\xef\xbf\xbd",
      "\xc4\x8c",
      "\xc3\x87",
      "\xc4\x86",
      "\x7c",
      "\x2c",
      "\x25",
      "\x5f",
      "\x3e",
      "\x3f",
      "\xcb\x87",
      "\xc3\x89",
      "\xef\xbf\xbd",
      "\xc3\x8b",
      "\xc5\xae",
      "\xc3\x8d",
      "\xef\xbf\xbd",
      "\xc4\xbd",
      "\xc4\xb9",
      "\x60",
      "\x3a",
      "\x23",
      "\x40",
      "\x27",
      "\x3d",
      "\x22",
      "\xcb\x98",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\xc5\x9b",
      "\xc5\x88",
      "\xc4\x91",
      "\xc3\xbd",
      "\xc5\x99",
      "\xef\xbf\xbd",
      "\xc2\xb0",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\xc5\x82",
      "\xc5\x84",
      "\xc5\xa1",
      "\xc2\xb8",
      "\xcb\x9b",
      "\xc2\xa4",
      "\xc4\x85",
      "\x7e",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\xc5\x9a",
      "\xc5\x87",
      "\xc4\x90",
      "\xc3\x9d",
      "\xc5\x98",
      "\xef\xbf\xbd",
      "\xc2\xb7",
      "\xc4\x84",
      "\xc5\xbc",
      "\xef\xbf\xbd",
      "\xc5\xbb",
      "\xc2\xa7",
      "\xc2\xb6",
      "\xc5\xbe",
      "\xc5\xba",
      "\xc5\xbd",
      "\xc5\xb9",
      "\xc5\x83",
      "\xc5\xa0",
      "\xc2\xa8",
      "\xc2\xb4",
      "\xc3\x97",
      "\x7b",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\xc2\xad",
      "\xc3\xb4",
      "\xc3\xb6",
      "\xc5\x95",
      "\xc3\xb3",
      "\xc5\x91",
      "\x7d",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\xc4\x9a",
      "\xc5\xb1",
      "\xc3\xbc",
      "\xc5\xa5",
      "\xc3\xba",
      "\xc4\x9b",
      "\x5c",
      "\xc3\xb7",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\xc4\x8f",
      "\xc3\x94",
      "\xc3\x96",
      "\xc5\x94",
      "\xc3\x93",
      "\xc5\x90",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\xc4\x8e",
      "\xc5\xb0",
      "\xc3\x9c",
      "\xc5\xa4",
      "\xc3\x9a",
      "\xc2\x9f",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x37",
      0x00000005 => "\x2d",
      0x00000006 => "\x2e",
      0x00000007 => "\x2f",
      0x00000008 => "\x16",
      0x00000009 => "\x05",
      0x0000000a => "\x25",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x3c",
      0x00000015 => "\x3d",
      0x00000016 => "\x32",
      0x00000017 => "\x26",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x3f",
      0x0000001b => "\x27",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x40",
      0x00000021 => "\x4f",
      0x00000022 => "\x7f",
      0x00000023 => "\x7b",
      0x00000024 => "\x5b",
      0x00000025 => "\x6c",
      0x00000026 => "\x50",
      0x00000027 => "\x7d",
      0x00000028 => "\x4d",
      0x00000029 => "\x5d",
      0x0000002a => "\x5c",
      0x0000002b => "\x4e",
      0x0000002c => "\x6b",
      0x0000002d => "\x60",
      0x0000002e => "\x4b",
      0x0000002f => "\x61",
      0x00000030 => "\xf0",
      0x00000031 => "\xf1",
      0x00000032 => "\xf2",
      0x00000033 => "\xf3",
      0x00000034 => "\xf4",
      0x00000035 => "\xf5",
      0x00000036 => "\xf6",
      0x00000037 => "\xf7",
      0x00000038 => "\xf8",
      0x00000039 => "\xf9",
      0x0000003a => "\x7a",
      0x0000003b => "\x5e",
      0x0000003c => "\x4c",
      0x0000003d => "\x7e",
      0x0000003e => "\x6e",
      0x0000003f => "\x6f",
      0x00000040 => "\x7c",
      0x00000041 => "\xc1",
      0x00000042 => "\xc2",
      0x00000043 => "\xc3",
      0x00000044 => "\xc4",
      0x00000045 => "\xc5",
      0x00000046 => "\xc6",
      0x00000047 => "\xc7",
      0x00000048 => "\xc8",
      0x00000049 => "\xc9",
      0x0000004a => "\xd1",
      0x0000004b => "\xd2",
      0x0000004c => "\xd3",
      0x0000004d => "\xd4",
      0x0000004e => "\xd5",
      0x0000004f => "\xd6",
      0x00000050 => "\xd7",
      0x00000051 => "\xd8",
      0x00000052 => "\xd9",
      0x00000053 => "\xe2",
      0x00000054 => "\xe3",
      0x00000055 => "\xe4",
      0x00000056 => "\xe5",
      0x00000057 => "\xe6",
      0x00000058 => "\xe7",
      0x00000059 => "\xe8",
      0x0000005a => "\xe9",
      0x0000005b => "\x4a",
      0x0000005c => "\xe0",
      0x0000005d => "\x5a",
      0x0000005e => "\x5f",
      0x0000005f => "\x6d",
      0x00000060 => "\x79",
      0x00000061 => "\x81",
      0x00000062 => "\x82",
      0x00000063 => "\x83",
      0x00000064 => "\x84",
      0x00000065 => "\x85",
      0x00000066 => "\x86",
      0x00000067 => "\x87",
      0x00000068 => "\x88",
      0x00000069 => "\x89",
      0x0000006a => "\x91",
      0x0000006b => "\x92",
      0x0000006c => "\x93",
      0x0000006d => "\x94",
      0x0000006e => "\x95",
      0x0000006f => "\x96",
      0x00000070 => "\x97",
      0x00000071 => "\x98",
      0x00000072 => "\x99",
      0x00000073 => "\xa2",
      0x00000074 => "\xa3",
      0x00000075 => "\xa4",
      0x00000076 => "\xa5",
      0x00000077 => "\xa6",
      0x00000078 => "\xa7",
      0x00000079 => "\xa8",
      0x0000007a => "\xa9",
      0x0000007b => "\xc0",
      0x0000007c => "\x6a",
      0x0000007d => "\xd0",
      0x0000007e => "\xa1",
      0x0000007f => "\x07",
      0x00000080 => "\x20",
      0x00000081 => "\x21",
      0x00000082 => "\x22",
      0x00000083 => "\x23",
      0x00000084 => "\x24",
      0x00000085 => "\x15",
      0x00000086 => "\x06",
      0x00000087 => "\x17",
      0x00000088 => "\x28",
      0x00000089 => "\x29",
      0x0000008a => "\x2a",
      0x0000008b => "\x2b",
      0x0000008c => "\x2c",
      0x0000008d => "\x09",
      0x0000008e => "\x0a",
      0x0000008f => "\x1b",
      0x00000090 => "\x30",
      0x00000091 => "\x31",
      0x00000092 => "\x1a",
      0x00000093 => "\x33",
      0x00000094 => "\x34",
      0x00000095 => "\x35",
      0x00000096 => "\x36",
      0x00000097 => "\x08",
      0x00000098 => "\x38",
      0x00000099 => "\x39",
      0x0000009a => "\x3a",
      0x0000009b => "\x3b",
      0x0000009c => "\x04",
      0x0000009d => "\x14",
      0x0000009e => "\x3e",
      0x0000009f => "\xff",
      0x000000a0 => "\x41",
      0x000000a4 => "\x9f",
      0x000000a7 => "\xb5",
      0x000000a8 => "\xbd",
      0x000000ad => "\xca",
      0x000000b0 => "\x90",
      0x000000b4 => "\xbe",
      0x000000b6 => "\xb6",
      0x000000b7 => "\xb0",
      0x000000b8 => "\x9d",
      0x000000c1 => "\x65",
      0x000000c4 => "\x63",
      0x000000c7 => "\x68",
      0x000000c9 => "\x71",
      0x000000cb => "\x73",
      0x000000cd => "\x75",
      0x000000d3 => "\xee",
      0x000000d4 => "\xeb",
      0x000000d6 => "\xec",
      0x000000d7 => "\xbf",
      0x000000da => "\xfe",
      0x000000dc => "\xfc",
      0x000000dd => "\xad",
      0x000000df => "\x59",
      0x000000e1 => "\x45",
      0x000000e4 => "\x43",
      0x000000e7 => "\x48",
      0x000000e9 => "\x51",
      0x000000eb => "\x53",
      0x000000ed => "\x55",
      0x000000f3 => "\xce",
      0x000000f4 => "\xcb",
      0x000000f6 => "\xcc",
      0x000000f7 => "\xe1",
      0x000000fa => "\xde",
      0x000000fc => "\xdc",
      0x000000fd => "\x8d",
      0x00000103 => "\x46",
      0x00000104 => "\xb1",
      0x00000105 => "\xa0",
      0x00000106 => "\x69",
      0x00000107 => "\x49",
      0x0000010c => "\x67",
      0x0000010d => "\x47",
      0x0000010e => "\xfa",
      0x0000010f => "\xea",
      0x00000110 => "\xac",
      0x00000111 => "\x8c",
      0x0000011a => "\xda",
      0x0000011b => "\xdf",
      0x00000139 => "\x78",
      0x0000013a => "\x58",
      0x0000013d => "\x77",
      0x0000013e => "\x57",
      0x00000142 => "\x9a",
      0x00000143 => "\xbb",
      0x00000144 => "\x9b",
      0x00000147 => "\xab",
      0x00000148 => "\x8b",
      0x00000150 => "\xef",
      0x00000151 => "\xcf",
      0x00000154 => "\xed",
      0x00000155 => "\xcd",
      0x00000158 => "\xae",
      0x00000159 => "\x8e",
      0x0000015a => "\xaa",
      0x0000015b => "\x8a",
      0x00000160 => "\xbc",
      0x00000161 => "\x9c",
      0x00000164 => "\xfd",
      0x00000165 => "\xdd",
      0x0000016e => "\x74",
      0x0000016f => "\x54",
      0x00000170 => "\xfb",
      0x00000171 => "\xdb",
      0x00000179 => "\xba",
      0x0000017a => "\xb8",
      0x0000017b => "\xb4",
      0x0000017c => "\xb2",
      0x0000017d => "\xb9",
      0x0000017e => "\xb7",
      0x000002c7 => "\x70",
      0x000002d8 => "\x80",
      0x000002db => "\x9e",
      0x000002dd => "\x64",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x6f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::IBM870 - Conversion routines for IBM870
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for IBM870.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: IBM NLS RM Vol2 SE09-8002-01, March 1990
   alias CP870
   alias EBCDIC-CP-ROECE
   alias EBCDIC-CP-YU
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  0000009C | STRING TERMINATOR (ST)
      05 |  00000009 | CHARACTER TABULATION (HT)
      06 |  00000086 | START OF SELECTED AREA (SSA)
      07 |  0000007F | DELETE (DEL)
      08 |  00000097 | END OF GUARDED AREA (EPA)
      09 |  0000008D | REVERSE LINE FEED (RI)
      0A |  0000008E | SINGLE-SHIFT TWO (SS2)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  0000009D | OPERATING SYSTEM COMMAND (OSC)
      15 |  00000085 | NEXT LINE (NEL)
      16 |  00000008 | BACKSPACE (BS)
      17 |  00000087 | END OF SELECTED AREA (ESA)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  00000092 | PRIVATE USE TWO (PU2)
      1B |  0000008F | SINGLE-SHIFT THREE (SS3)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000080 | PADDING CHARACTER (PAD)
      21 |  00000081 | HIGH OCTET PRESET (HOP)
      22 |  00000082 | BREAK PERMITTED HERE (BPH)
      23 |  00000083 | NO BREAK HERE (NBH)
      24 |  00000084 | INDEX (IND)
      25 |  0000000A | LINE FEED (LF)
      26 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      27 |  0000001B | ESCAPE (ESC)
      28 |  00000088 | CHARACTER TABULATION SET (HTS)
      29 |  00000089 | CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
      2A |  0000008A | LINE TABULATION SET (VTS)
      2B |  0000008B | PARTIAL LINE FORWARD (PLD)
      2C |  0000008C | PARTIAL LINE BACKWARD (PLU)
      2D |  00000005 | ENQUIRY (ENQ)
      2E |  00000006 | ACKNOWLEDGE (ACK)
      2F |  00000007 | BELL (BEL)
      30 |  00000090 | DEVICE CONTROL STRING (DCS)
      31 |  00000091 | PRIVATE USE ONE (PU1)
      32 |  00000016 | SYNCHRONOUS IDLE (SYN)
      33 |  00000093 | SET TRANSMIT STATE (STS)
      34 |  00000094 | CANCEL CHARACTER (CCH)
      35 |  00000095 | MESSAGE WAITING (MW)
      36 |  00000096 | START OF GUARDED AREA (SPA)
      37 |  00000004 | END OF TRANSMISSION (EOT)
      38 |  00000098 | START OF STRING (SOS)
      39 |  00000099 | SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
      3A |  0000009A | SINGLE CHARACTER INTRODUCER (SCI)
      3B |  0000009B | CONTROL SEQUENCE INTRODUCER (CSI)
      3C |  00000014 | DEVICE CONTROL FOUR (DC4)
      3D |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      3E |  0000009E | PRIVACY MESSAGE (PM)
      3F |  0000001A | SUBSTITUTE (SUB)
      40 |  00000020 | SPACE
      41 |  000000A0 | NO-BREAK SPACE
      43 |  000000E4 | LATIN SMALL LETTER A WITH DIAERESIS
      45 |  000000E1 | LATIN SMALL LETTER A WITH ACUTE
      46 |  00000103 | LATIN SMALL LETTER A WITH BREVE
      47 |  0000010D | LATIN SMALL LETTER C WITH CARON
      48 |  000000E7 | LATIN SMALL LETTER C WITH CEDILLA
      49 |  00000107 | LATIN SMALL LETTER C WITH ACUTE
      4A |  0000005B | LEFT SQUARE BRACKET
      4B |  0000002E | FULL STOP
      4C |  0000003C | LESS-THAN SIGN
      4D |  00000028 | LEFT PARENTHESIS
      4E |  0000002B | PLUS SIGN
      4F |  00000021 | EXCLAMATION MARK
      50 |  00000026 | AMPERSAND
      51 |  000000E9 | LATIN SMALL LETTER E WITH ACUTE
      53 |  000000EB | LATIN SMALL LETTER E WITH DIAERESIS
      54 |  0000016F | LATIN SMALL LETTER U WITH RING ABOVE
      55 |  000000ED | LATIN SMALL LETTER I WITH ACUTE
      57 |  0000013E | LATIN SMALL LETTER L WITH CARON
      58 |  0000013A | LATIN SMALL LETTER L WITH ACUTE
      59 |  000000DF | LATIN SMALL LETTER SHARP S (German)
      5A |  0000005D | RIGHT SQUARE BRACKET
      5B |  00000024 | DOLLAR SIGN
      5C |  0000002A | ASTERISK
      5D |  00000029 | RIGHT PARENTHESIS
      5E |  0000003B | SEMICOLON
      5F |  0000005E | CIRCUMFLEX ACCENT
      60 |  0000002D | HYPHEN-MINUS
      61 |  0000002F | SOLIDUS
      63 |  000000C4 | LATIN CAPITAL LETTER A WITH DIAERESIS
      64 |  000002DD | DOUBLE ACUTE ACCENT
      65 |  000000C1 | LATIN CAPITAL LETTER A WITH ACUTE
      67 |  0000010C | LATIN CAPITAL LETTER C WITH CARON
      68 |  000000C7 | LATIN CAPITAL LETTER C WITH CEDILLA
      69 |  00000106 | LATIN CAPITAL LETTER C WITH ACUTE
      6A |  0000007C | VERTICAL LINE
      6B |  0000002C | COMMA
      6C |  00000025 | PERCENT SIGN
      6D |  0000005F | LOW LINE
      6E |  0000003E | GREATER-THAN SIGN
      6F |  0000003F | QUESTION MARK
      70 |  000002C7 | CARON (Mandarin Chinese third tone)
      71 |  000000C9 | LATIN CAPITAL LETTER E WITH ACUTE
      73 |  000000CB | LATIN CAPITAL LETTER E WITH DIAERESIS
      74 |  0000016E | LATIN CAPITAL LETTER U WITH RING ABOVE
      75 |  000000CD | LATIN CAPITAL LETTER I WITH ACUTE
      77 |  0000013D | LATIN CAPITAL LETTER L WITH CARON
      78 |  00000139 | LATIN CAPITAL LETTER L WITH ACUTE
      79 |  00000060 | GRAVE ACCENT
      7A |  0000003A | COLON
      7B |  00000023 | NUMBER SIGN
      7C |  00000040 | COMMERCIAL AT
      7D |  00000027 | APOSTROPHE
      7E |  0000003D | EQUALS SIGN
      7F |  00000022 | QUOTATION MARK
      80 |  000002D8 | BREVE
      81 |  00000061 | LATIN SMALL LETTER A
      82 |  00000062 | LATIN SMALL LETTER B
      83 |  00000063 | LATIN SMALL LETTER C
      84 |  00000064 | LATIN SMALL LETTER D
      85 |  00000065 | LATIN SMALL LETTER E
      86 |  00000066 | LATIN SMALL LETTER F
      87 |  00000067 | LATIN SMALL LETTER G
      88 |  00000068 | LATIN SMALL LETTER H
      89 |  00000069 | LATIN SMALL LETTER I
      8A |  0000015B | LATIN SMALL LETTER S WITH ACUTE
      8B |  00000148 | LATIN SMALL LETTER N WITH CARON
      8C |  00000111 | LATIN SMALL LETTER D WITH STROKE
      8D |  000000FD | LATIN SMALL LETTER Y WITH ACUTE
      8E |  00000159 | LATIN SMALL LETTER R WITH CARON
      90 |  000000B0 | DEGREE SIGN
      91 |  0000006A | LATIN SMALL LETTER J
      92 |  0000006B | LATIN SMALL LETTER K
      93 |  0000006C | LATIN SMALL LETTER L
      94 |  0000006D | LATIN SMALL LETTER M
      95 |  0000006E | LATIN SMALL LETTER N
      96 |  0000006F | LATIN SMALL LETTER O
      97 |  00000070 | LATIN SMALL LETTER P
      98 |  00000071 | LATIN SMALL LETTER Q
      99 |  00000072 | LATIN SMALL LETTER R
      9A |  00000142 | LATIN SMALL LETTER L WITH STROKE
      9B |  00000144 | LATIN SMALL LETTER N WITH ACUTE
      9C |  00000161 | LATIN SMALL LETTER S WITH CARON
      9D |  000000B8 | CEDILLA
      9E |  000002DB | OGONEK
      9F |  000000A4 | CURRENCY SIGN
      A0 |  00000105 | LATIN SMALL LETTER A WITH OGONEK
      A1 |  0000007E | TILDE
      A2 |  00000073 | LATIN SMALL LETTER S
      A3 |  00000074 | LATIN SMALL LETTER T
      A4 |  00000075 | LATIN SMALL LETTER U
      A5 |  00000076 | LATIN SMALL LETTER V
      A6 |  00000077 | LATIN SMALL LETTER W
      A7 |  00000078 | LATIN SMALL LETTER X
      A8 |  00000079 | LATIN SMALL LETTER Y
      A9 |  0000007A | LATIN SMALL LETTER Z
      AA |  0000015A | LATIN CAPITAL LETTER S WITH ACUTE
      AB |  00000147 | LATIN CAPITAL LETTER N WITH CARON
      AC |  00000110 | LATIN CAPITAL LETTER D WITH STROKE
      AD |  000000DD | LATIN CAPITAL LETTER Y WITH ACUTE
      AE |  00000158 | LATIN CAPITAL LETTER R WITH CARON
      B0 |  000000B7 | MIDDLE DOT
      B1 |  00000104 | LATIN CAPITAL LETTER A WITH OGONEK
      B2 |  0000017C | LATIN SMALL LETTER Z WITH DOT ABOVE
      B4 |  0000017B | LATIN CAPITAL LETTER Z WITH DOT ABOVE
      B5 |  000000A7 | SECTION SIGN
      B6 |  000000B6 | PILCROW SIGN
      B7 |  0000017E | LATIN SMALL LETTER Z WITH CARON
      B8 |  0000017A | LATIN SMALL LETTER Z WITH ACUTE
      B9 |  0000017D | LATIN CAPITAL LETTER Z WITH CARON
      BA |  00000179 | LATIN CAPITAL LETTER Z WITH ACUTE
      BB |  00000143 | LATIN CAPITAL LETTER N WITH ACUTE
      BC |  00000160 | LATIN CAPITAL LETTER S WITH CARON
      BD |  000000A8 | DIAERESIS
      BE |  000000B4 | ACUTE ACCENT
      BF |  000000D7 | MULTIPLICATION SIGN
      C0 |  0000007B | LEFT CURLY BRACKET
      C1 |  00000041 | LATIN CAPITAL LETTER A
      C2 |  00000042 | LATIN CAPITAL LETTER B
      C3 |  00000043 | LATIN CAPITAL LETTER C
      C4 |  00000044 | LATIN CAPITAL LETTER D
      C5 |  00000045 | LATIN CAPITAL LETTER E
      C6 |  00000046 | LATIN CAPITAL LETTER F
      C7 |  00000047 | LATIN CAPITAL LETTER G
      C8 |  00000048 | LATIN CAPITAL LETTER H
      C9 |  00000049 | LATIN CAPITAL LETTER I
      CA |  000000AD | SOFT HYPHEN
      CB |  000000F4 | LATIN SMALL LETTER O WITH CIRCUMFLEX
      CC |  000000F6 | LATIN SMALL LETTER O WITH DIAERESIS
      CD |  00000155 | LATIN SMALL LETTER R WITH ACUTE
      CE |  000000F3 | LATIN SMALL LETTER O WITH ACUTE
      CF |  00000151 | LATIN SMALL LETTER O WITH DOUBLE ACUTE
      D0 |  0000007D | RIGHT CURLY BRACKET
      D1 |  0000004A | LATIN CAPITAL LETTER J
      D2 |  0000004B | LATIN CAPITAL LETTER K
      D3 |  0000004C | LATIN CAPITAL LETTER L
      D4 |  0000004D | LATIN CAPITAL LETTER M
      D5 |  0000004E | LATIN CAPITAL LETTER N
      D6 |  0000004F | LATIN CAPITAL LETTER O
      D7 |  00000050 | LATIN CAPITAL LETTER P
      D8 |  00000051 | LATIN CAPITAL LETTER Q
      D9 |  00000052 | LATIN CAPITAL LETTER R
      DA |  0000011A | LATIN CAPITAL LETTER E WITH CARON
      DB |  00000171 | LATIN SMALL LETTER U WITH DOUBLE ACUTE
      DC |  000000FC | LATIN SMALL LETTER U WITH DIAERESIS
      DD |  00000165 | LATIN SMALL LETTER T WITH CARON
      DE |  000000FA | LATIN SMALL LETTER U WITH ACUTE
      DF |  0000011B | LATIN SMALL LETTER E WITH CARON
      E0 |  0000005C | REVERSE SOLIDUS
      E1 |  000000F7 | DIVISION SIGN
      E2 |  00000053 | LATIN CAPITAL LETTER S
      E3 |  00000054 | LATIN CAPITAL LETTER T
      E4 |  00000055 | LATIN CAPITAL LETTER U
      E5 |  00000056 | LATIN CAPITAL LETTER V
      E6 |  00000057 | LATIN CAPITAL LETTER W
      E7 |  00000058 | LATIN CAPITAL LETTER X
      E8 |  00000059 | LATIN CAPITAL LETTER Y
      E9 |  0000005A | LATIN CAPITAL LETTER Z
      EA |  0000010F | LATIN SMALL LETTER D WITH CARON
      EB |  000000D4 | LATIN CAPITAL LETTER O WITH CIRCUMFLEX
      EC |  000000D6 | LATIN CAPITAL LETTER O WITH DIAERESIS
      ED |  00000154 | LATIN CAPITAL LETTER R WITH ACUTE
      EE |  000000D3 | LATIN CAPITAL LETTER O WITH ACUTE
      EF |  00000150 | LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
      F0 |  00000030 | DIGIT ZERO
      F1 |  00000031 | DIGIT ONE
      F2 |  00000032 | DIGIT TWO
      F3 |  00000033 | DIGIT THREE
      F4 |  00000034 | DIGIT FOUR
      F5 |  00000035 | DIGIT FIVE
      F6 |  00000036 | DIGIT SIX
      F7 |  00000037 | DIGIT SEVEN
      F8 |  00000038 | DIGIT EIGHT
      F9 |  00000039 | DIGIT NINE
      FA |  0000010E | LATIN CAPITAL LETTER D WITH CARON
      FB |  00000170 | LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
      FC |  000000DC | LATIN CAPITAL LETTER U WITH DIAERESIS
      FD |  00000164 | LATIN CAPITAL LETTER T WITH CARON
      FE |  000000DA | LATIN CAPITAL LETTER U WITH ACUTE
      FF |  0000009F | APPLICATION PROGRAM COMMAND (APC)
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_IBM870

    $main::fatpacked{"Locale/RecodeData/IBM871.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_IBM871';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for IBM871.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::IBM871;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x009c,
      0x0009,
      0x0086,
      0x007f,
      0x0097,
      0x008d,
      0x008e,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x009d,
      0x0085,
      0x0008,
      0x0087,
      0x0018,
      0x0019,
      0x0092,
      0x008f,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0080,
      0x0081,
      0x0082,
      0x0083,
      0x0084,
      0x000a,
      0x0017,
      0x001b,
      0x0088,
      0x0089,
      0x008a,
      0x008b,
      0x008c,
      0x0005,
      0x0006,
      0x0007,
      0x0090,
      0x0091,
      0x0016,
      0x0093,
      0x0094,
      0x0095,
      0x0096,
      0x0004,
      0x0098,
      0x0099,
      0x009a,
      0x009b,
      0x0014,
      0x0015,
      0x009e,
      0x001a,
      0x0020,
      0x00a0,
      0x00e2,
      0x00e4,
      0x00e0,
      0x00e1,
      0x00e3,
      0x00e5,
      0x00e7,
      0x00f1,
      0x00fe,
      0x002e,
      0x003c,
      0x0028,
      0x002b,
      0x0021,
      0x0026,
      0x00e9,
      0x00ea,
      0x00eb,
      0x00e8,
      0x00ed,
      0x00ee,
      0x00ef,
      0x00ec,
      0x00df,
      0x00c6,
      0x0024,
      0x002a,
      0x0029,
      0x003b,
      0x00d6,
      0x002d,
      0x002f,
      0x00c2,
      0x00c4,
      0x00c0,
      0x00c1,
      0x00c3,
      0x00c5,
      0x00c7,
      0x00d1,
      0x00a6,
      0x002c,
      0x0025,
      0x005f,
      0x003e,
      0x003f,
      0x00f8,
      0x00c9,
      0x00ca,
      0x00cb,
      0x00c8,
      0x00cd,
      0x00ce,
      0x00cf,
      0x00cc,
      0x00f0,
      0x003a,
      0x0023,
      0x00d0,
      0x0027,
      0x003d,
      0x0022,
      0x00d8,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x00ab,
      0x00bb,
      0x0060,
      0x00fd,
      0x007b,
      0x00b1,
      0x00b0,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x00aa,
      0x00ba,
      0x007d,
      0x00b8,
      0x005d,
      0x00a4,
      0x00b5,
      0x00f6,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x00a1,
      0x00bf,
      0x0040,
      0x00dd,
      0x005b,
      0x00ae,
      0x00a2,
      0x00a3,
      0x00a5,
      0x00b7,
      0x00a9,
      0x00a7,
      0x00b6,
      0x00bc,
      0x00bd,
      0x00be,
      0x00ac,
      0x007c,
      0x00af,
      0x00a8,
      0x005c,
      0x00d7,
      0x00de,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x00ad,
      0x00f4,
      0x007e,
      0x00f2,
      0x00f3,
      0x00f5,
      0x00e6,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x00b9,
      0x00fb,
      0x00fc,
      0x00f9,
      0x00fa,
      0x00ff,
      0x00b4,
      0x00f7,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x00b2,
      0x00d4,
      0x005e,
      0x00d2,
      0x00d3,
      0x00d5,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x00b3,
      0x00db,
      0x00dc,
      0x00d9,
      0x00da,
      0x009f,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\xc2\x9c",
      "\x09",
      "\xc2\x86",
      "\x7f",
      "\xc2\x97",
      "\xc2\x8d",
      "\xc2\x8e",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\xc2\x9d",
      "\xc2\x85",
      "\x08",
      "\xc2\x87",
      "\x18",
      "\x19",
      "\xc2\x92",
      "\xc2\x8f",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\xc2\x80",
      "\xc2\x81",
      "\xc2\x82",
      "\xc2\x83",
      "\xc2\x84",
      "\x0a",
      "\x17",
      "\x1b",
      "\xc2\x88",
      "\xc2\x89",
      "\xc2\x8a",
      "\xc2\x8b",
      "\xc2\x8c",
      "\x05",
      "\x06",
      "\x07",
      "\xc2\x90",
      "\xc2\x91",
      "\x16",
      "\xc2\x93",
      "\xc2\x94",
      "\xc2\x95",
      "\xc2\x96",
      "\x04",
      "\xc2\x98",
      "\xc2\x99",
      "\xc2\x9a",
      "\xc2\x9b",
      "\x14",
      "\x15",
      "\xc2\x9e",
      "\x1a",
      "\x20",
      "\xc2\xa0",
      "\xc3\xa2",
      "\xc3\xa4",
      "\xc3\xa0",
      "\xc3\xa1",
      "\xc3\xa3",
      "\xc3\xa5",
      "\xc3\xa7",
      "\xc3\xb1",
      "\xc3\xbe",
      "\x2e",
      "\x3c",
      "\x28",
      "\x2b",
      "\x21",
      "\x26",
      "\xc3\xa9",
      "\xc3\xaa",
      "\xc3\xab",
      "\xc3\xa8",
      "\xc3\xad",
      "\xc3\xae",
      "\xc3\xaf",
      "\xc3\xac",
      "\xc3\x9f",
      "\xc3\x86",
      "\x24",
      "\x2a",
      "\x29",
      "\x3b",
      "\xc3\x96",
      "\x2d",
      "\x2f",
      "\xc3\x82",
      "\xc3\x84",
      "\xc3\x80",
      "\xc3\x81",
      "\xc3\x83",
      "\xc3\x85",
      "\xc3\x87",
      "\xc3\x91",
      "\xc2\xa6",
      "\x2c",
      "\x25",
      "\x5f",
      "\x3e",
      "\x3f",
      "\xc3\xb8",
      "\xc3\x89",
      "\xc3\x8a",
      "\xc3\x8b",
      "\xc3\x88",
      "\xc3\x8d",
      "\xc3\x8e",
      "\xc3\x8f",
      "\xc3\x8c",
      "\xc3\xb0",
      "\x3a",
      "\x23",
      "\xc3\x90",
      "\x27",
      "\x3d",
      "\x22",
      "\xc3\x98",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\xc2\xab",
      "\xc2\xbb",
      "\x60",
      "\xc3\xbd",
      "\x7b",
      "\xc2\xb1",
      "\xc2\xb0",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\xc2\xaa",
      "\xc2\xba",
      "\x7d",
      "\xc2\xb8",
      "\x5d",
      "\xc2\xa4",
      "\xc2\xb5",
      "\xc3\xb6",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\xc2\xa1",
      "\xc2\xbf",
      "\x40",
      "\xc3\x9d",
      "\x5b",
      "\xc2\xae",
      "\xc2\xa2",
      "\xc2\xa3",
      "\xc2\xa5",
      "\xc2\xb7",
      "\xc2\xa9",
      "\xc2\xa7",
      "\xc2\xb6",
      "\xc2\xbc",
      "\xc2\xbd",
      "\xc2\xbe",
      "\xc2\xac",
      "\x7c",
      "\xc2\xaf",
      "\xc2\xa8",
      "\x5c",
      "\xc3\x97",
      "\xc3\x9e",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\xc2\xad",
      "\xc3\xb4",
      "\x7e",
      "\xc3\xb2",
      "\xc3\xb3",
      "\xc3\xb5",
      "\xc3\xa6",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\xc2\xb9",
      "\xc3\xbb",
      "\xc3\xbc",
      "\xc3\xb9",
      "\xc3\xba",
      "\xc3\xbf",
      "\xc2\xb4",
      "\xc3\xb7",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\xc2\xb2",
      "\xc3\x94",
      "\x5e",
      "\xc3\x92",
      "\xc3\x93",
      "\xc3\x95",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\xc2\xb3",
      "\xc3\x9b",
      "\xc3\x9c",
      "\xc3\x99",
      "\xc3\x9a",
      "\xc2\x9f",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x37",
      0x00000005 => "\x2d",
      0x00000006 => "\x2e",
      0x00000007 => "\x2f",
      0x00000008 => "\x16",
      0x00000009 => "\x05",
      0x0000000a => "\x25",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x3c",
      0x00000015 => "\x3d",
      0x00000016 => "\x32",
      0x00000017 => "\x26",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x3f",
      0x0000001b => "\x27",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x40",
      0x00000021 => "\x4f",
      0x00000022 => "\x7f",
      0x00000023 => "\x7b",
      0x00000024 => "\x5b",
      0x00000025 => "\x6c",
      0x00000026 => "\x50",
      0x00000027 => "\x7d",
      0x00000028 => "\x4d",
      0x00000029 => "\x5d",
      0x0000002a => "\x5c",
      0x0000002b => "\x4e",
      0x0000002c => "\x6b",
      0x0000002d => "\x60",
      0x0000002e => "\x4b",
      0x0000002f => "\x61",
      0x00000030 => "\xf0",
      0x00000031 => "\xf1",
      0x00000032 => "\xf2",
      0x00000033 => "\xf3",
      0x00000034 => "\xf4",
      0x00000035 => "\xf5",
      0x00000036 => "\xf6",
      0x00000037 => "\xf7",
      0x00000038 => "\xf8",
      0x00000039 => "\xf9",
      0x0000003a => "\x7a",
      0x0000003b => "\x5e",
      0x0000003c => "\x4c",
      0x0000003d => "\x7e",
      0x0000003e => "\x6e",
      0x0000003f => "\x6f",
      0x00000040 => "\xac",
      0x00000041 => "\xc1",
      0x00000042 => "\xc2",
      0x00000043 => "\xc3",
      0x00000044 => "\xc4",
      0x00000045 => "\xc5",
      0x00000046 => "\xc6",
      0x00000047 => "\xc7",
      0x00000048 => "\xc8",
      0x00000049 => "\xc9",
      0x0000004a => "\xd1",
      0x0000004b => "\xd2",
      0x0000004c => "\xd3",
      0x0000004d => "\xd4",
      0x0000004e => "\xd5",
      0x0000004f => "\xd6",
      0x00000050 => "\xd7",
      0x00000051 => "\xd8",
      0x00000052 => "\xd9",
      0x00000053 => "\xe2",
      0x00000054 => "\xe3",
      0x00000055 => "\xe4",
      0x00000056 => "\xe5",
      0x00000057 => "\xe6",
      0x00000058 => "\xe7",
      0x00000059 => "\xe8",
      0x0000005a => "\xe9",
      0x0000005b => "\xae",
      0x0000005c => "\xbe",
      0x0000005d => "\x9e",
      0x0000005e => "\xec",
      0x0000005f => "\x6d",
      0x00000060 => "\x8c",
      0x00000061 => "\x81",
      0x00000062 => "\x82",
      0x00000063 => "\x83",
      0x00000064 => "\x84",
      0x00000065 => "\x85",
      0x00000066 => "\x86",
      0x00000067 => "\x87",
      0x00000068 => "\x88",
      0x00000069 => "\x89",
      0x0000006a => "\x91",
      0x0000006b => "\x92",
      0x0000006c => "\x93",
      0x0000006d => "\x94",
      0x0000006e => "\x95",
      0x0000006f => "\x96",
      0x00000070 => "\x97",
      0x00000071 => "\x98",
      0x00000072 => "\x99",
      0x00000073 => "\xa2",
      0x00000074 => "\xa3",
      0x00000075 => "\xa4",
      0x00000076 => "\xa5",
      0x00000077 => "\xa6",
      0x00000078 => "\xa7",
      0x00000079 => "\xa8",
      0x0000007a => "\xa9",
      0x0000007b => "\x8e",
      0x0000007c => "\xbb",
      0x0000007d => "\x9c",
      0x0000007e => "\xcc",
      0x0000007f => "\x07",
      0x00000080 => "\x20",
      0x00000081 => "\x21",
      0x00000082 => "\x22",
      0x00000083 => "\x23",
      0x00000084 => "\x24",
      0x00000085 => "\x15",
      0x00000086 => "\x06",
      0x00000087 => "\x17",
      0x00000088 => "\x28",
      0x00000089 => "\x29",
      0x0000008a => "\x2a",
      0x0000008b => "\x2b",
      0x0000008c => "\x2c",
      0x0000008d => "\x09",
      0x0000008e => "\x0a",
      0x0000008f => "\x1b",
      0x00000090 => "\x30",
      0x00000091 => "\x31",
      0x00000092 => "\x1a",
      0x00000093 => "\x33",
      0x00000094 => "\x34",
      0x00000095 => "\x35",
      0x00000096 => "\x36",
      0x00000097 => "\x08",
      0x00000098 => "\x38",
      0x00000099 => "\x39",
      0x0000009a => "\x3a",
      0x0000009b => "\x3b",
      0x0000009c => "\x04",
      0x0000009d => "\x14",
      0x0000009e => "\x3e",
      0x0000009f => "\xff",
      0x000000a0 => "\x41",
      0x000000a1 => "\xaa",
      0x000000a2 => "\xb0",
      0x000000a3 => "\xb1",
      0x000000a4 => "\x9f",
      0x000000a5 => "\xb2",
      0x000000a6 => "\x6a",
      0x000000a7 => "\xb5",
      0x000000a8 => "\xbd",
      0x000000a9 => "\xb4",
      0x000000aa => "\x9a",
      0x000000ab => "\x8a",
      0x000000ac => "\xba",
      0x000000ad => "\xca",
      0x000000ae => "\xaf",
      0x000000af => "\xbc",
      0x000000b0 => "\x90",
      0x000000b1 => "\x8f",
      0x000000b2 => "\xea",
      0x000000b3 => "\xfa",
      0x000000b4 => "\xe0",
      0x000000b5 => "\xa0",
      0x000000b6 => "\xb6",
      0x000000b7 => "\xb3",
      0x000000b8 => "\x9d",
      0x000000b9 => "\xda",
      0x000000ba => "\x9b",
      0x000000bb => "\x8b",
      0x000000bc => "\xb7",
      0x000000bd => "\xb8",
      0x000000be => "\xb9",
      0x000000bf => "\xab",
      0x000000c0 => "\x64",
      0x000000c1 => "\x65",
      0x000000c2 => "\x62",
      0x000000c3 => "\x66",
      0x000000c4 => "\x63",
      0x000000c5 => "\x67",
      0x000000c6 => "\x5a",
      0x000000c7 => "\x68",
      0x000000c8 => "\x74",
      0x000000c9 => "\x71",
      0x000000ca => "\x72",
      0x000000cb => "\x73",
      0x000000cc => "\x78",
      0x000000cd => "\x75",
      0x000000ce => "\x76",
      0x000000cf => "\x77",
      0x000000d0 => "\x7c",
      0x000000d1 => "\x69",
      0x000000d2 => "\xed",
      0x000000d3 => "\xee",
      0x000000d4 => "\xeb",
      0x000000d5 => "\xef",
      0x000000d6 => "\x5f",
      0x000000d7 => "\xbf",
      0x000000d8 => "\x80",
      0x000000d9 => "\xfd",
      0x000000da => "\xfe",
      0x000000db => "\xfb",
      0x000000dc => "\xfc",
      0x000000dd => "\xad",
      0x000000de => "\xc0",
      0x000000df => "\x59",
      0x000000e0 => "\x44",
      0x000000e1 => "\x45",
      0x000000e2 => "\x42",
      0x000000e3 => "\x46",
      0x000000e4 => "\x43",
      0x000000e5 => "\x47",
      0x000000e6 => "\xd0",
      0x000000e7 => "\x48",
      0x000000e8 => "\x54",
      0x000000e9 => "\x51",
      0x000000ea => "\x52",
      0x000000eb => "\x53",
      0x000000ec => "\x58",
      0x000000ed => "\x55",
      0x000000ee => "\x56",
      0x000000ef => "\x57",
      0x000000f0 => "\x79",
      0x000000f1 => "\x49",
      0x000000f2 => "\xcd",
      0x000000f3 => "\xce",
      0x000000f4 => "\xcb",
      0x000000f5 => "\xcf",
      0x000000f6 => "\xa1",
      0x000000f7 => "\xe1",
      0x000000f8 => "\x70",
      0x000000f9 => "\xdd",
      0x000000fa => "\xde",
      0x000000fb => "\xdb",
      0x000000fc => "\xdc",
      0x000000fd => "\x8d",
      0x000000fe => "\x4a",
      0x000000ff => "\xdf",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x6f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::IBM871 - Conversion routines for IBM871
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for IBM871.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: IBM NLS RM Vol2 SE09-8002-01, March 1990
   alias CP871
   alias EBCDIC-CP-IS
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  0000009C | STRING TERMINATOR (ST)
      05 |  00000009 | CHARACTER TABULATION (HT)
      06 |  00000086 | START OF SELECTED AREA (SSA)
      07 |  0000007F | DELETE (DEL)
      08 |  00000097 | END OF GUARDED AREA (EPA)
      09 |  0000008D | REVERSE LINE FEED (RI)
      0A |  0000008E | SINGLE-SHIFT TWO (SS2)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  0000009D | OPERATING SYSTEM COMMAND (OSC)
      15 |  00000085 | NEXT LINE (NEL)
      16 |  00000008 | BACKSPACE (BS)
      17 |  00000087 | END OF SELECTED AREA (ESA)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  00000092 | PRIVATE USE TWO (PU2)
      1B |  0000008F | SINGLE-SHIFT THREE (SS3)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000080 | PADDING CHARACTER (PAD)
      21 |  00000081 | HIGH OCTET PRESET (HOP)
      22 |  00000082 | BREAK PERMITTED HERE (BPH)
      23 |  00000083 | NO BREAK HERE (NBH)
      24 |  00000084 | INDEX (IND)
      25 |  0000000A | LINE FEED (LF)
      26 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      27 |  0000001B | ESCAPE (ESC)
      28 |  00000088 | CHARACTER TABULATION SET (HTS)
      29 |  00000089 | CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
      2A |  0000008A | LINE TABULATION SET (VTS)
      2B |  0000008B | PARTIAL LINE FORWARD (PLD)
      2C |  0000008C | PARTIAL LINE BACKWARD (PLU)
      2D |  00000005 | ENQUIRY (ENQ)
      2E |  00000006 | ACKNOWLEDGE (ACK)
      2F |  00000007 | BELL (BEL)
      30 |  00000090 | DEVICE CONTROL STRING (DCS)
      31 |  00000091 | PRIVATE USE ONE (PU1)
      32 |  00000016 | SYNCHRONOUS IDLE (SYN)
      33 |  00000093 | SET TRANSMIT STATE (STS)
      34 |  00000094 | CANCEL CHARACTER (CCH)
      35 |  00000095 | MESSAGE WAITING (MW)
      36 |  00000096 | START OF GUARDED AREA (SPA)
      37 |  00000004 | END OF TRANSMISSION (EOT)
      38 |  00000098 | START OF STRING (SOS)
      39 |  00000099 | SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
      3A |  0000009A | SINGLE CHARACTER INTRODUCER (SCI)
      3B |  0000009B | CONTROL SEQUENCE INTRODUCER (CSI)
      3C |  00000014 | DEVICE CONTROL FOUR (DC4)
      3D |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      3E |  0000009E | PRIVACY MESSAGE (PM)
      3F |  0000001A | SUBSTITUTE (SUB)
      40 |  00000020 | SPACE
      41 |  000000A0 | NO-BREAK SPACE
      42 |  000000E2 | LATIN SMALL LETTER A WITH CIRCUMFLEX
      43 |  000000E4 | LATIN SMALL LETTER A WITH DIAERESIS
      44 |  000000E0 | LATIN SMALL LETTER A WITH GRAVE
      45 |  000000E1 | LATIN SMALL LETTER A WITH ACUTE
      46 |  000000E3 | LATIN SMALL LETTER A WITH TILDE
      47 |  000000E5 | LATIN SMALL LETTER A WITH RING ABOVE
      48 |  000000E7 | LATIN SMALL LETTER C WITH CEDILLA
      49 |  000000F1 | LATIN SMALL LETTER N WITH TILDE
      4A |  000000FE | LATIN SMALL LETTER THORN (Icelandic)
      4B |  0000002E | FULL STOP
      4C |  0000003C | LESS-THAN SIGN
      4D |  00000028 | LEFT PARENTHESIS
      4E |  0000002B | PLUS SIGN
      4F |  00000021 | EXCLAMATION MARK
      50 |  00000026 | AMPERSAND
      51 |  000000E9 | LATIN SMALL LETTER E WITH ACUTE
      52 |  000000EA | LATIN SMALL LETTER E WITH CIRCUMFLEX
      53 |  000000EB | LATIN SMALL LETTER E WITH DIAERESIS
      54 |  000000E8 | LATIN SMALL LETTER E WITH GRAVE
      55 |  000000ED | LATIN SMALL LETTER I WITH ACUTE
      56 |  000000EE | LATIN SMALL LETTER I WITH CIRCUMFLEX
      57 |  000000EF | LATIN SMALL LETTER I WITH DIAERESIS
      58 |  000000EC | LATIN SMALL LETTER I WITH GRAVE
      59 |  000000DF | LATIN SMALL LETTER SHARP S (German)
      5A |  000000C6 | LATIN CAPITAL LETTER AE
      5B |  00000024 | DOLLAR SIGN
      5C |  0000002A | ASTERISK
      5D |  00000029 | RIGHT PARENTHESIS
      5E |  0000003B | SEMICOLON
      5F |  000000D6 | LATIN CAPITAL LETTER O WITH DIAERESIS
      60 |  0000002D | HYPHEN-MINUS
      61 |  0000002F | SOLIDUS
      62 |  000000C2 | LATIN CAPITAL LETTER A WITH CIRCUMFLEX
      63 |  000000C4 | LATIN CAPITAL LETTER A WITH DIAERESIS
      64 |  000000C0 | LATIN CAPITAL LETTER A WITH GRAVE
      65 |  000000C1 | LATIN CAPITAL LETTER A WITH ACUTE
      66 |  000000C3 | LATIN CAPITAL LETTER A WITH TILDE
      67 |  000000C5 | LATIN CAPITAL LETTER A WITH RING ABOVE
      68 |  000000C7 | LATIN CAPITAL LETTER C WITH CEDILLA
      69 |  000000D1 | LATIN CAPITAL LETTER N WITH TILDE
      6A |  000000A6 | BROKEN BAR
      6B |  0000002C | COMMA
      6C |  00000025 | PERCENT SIGN
      6D |  0000005F | LOW LINE
      6E |  0000003E | GREATER-THAN SIGN
      6F |  0000003F | QUESTION MARK
      70 |  000000F8 | LATIN SMALL LETTER O WITH STROKE
      71 |  000000C9 | LATIN CAPITAL LETTER E WITH ACUTE
      72 |  000000CA | LATIN CAPITAL LETTER E WITH CIRCUMFLEX
      73 |  000000CB | LATIN CAPITAL LETTER E WITH DIAERESIS
      74 |  000000C8 | LATIN CAPITAL LETTER E WITH GRAVE
      75 |  000000CD | LATIN CAPITAL LETTER I WITH ACUTE
      76 |  000000CE | LATIN CAPITAL LETTER I WITH CIRCUMFLEX
      77 |  000000CF | LATIN CAPITAL LETTER I WITH DIAERESIS
      78 |  000000CC | LATIN CAPITAL LETTER I WITH GRAVE
      79 |  000000F0 | LATIN SMALL LETTER ETH (Icelandic)
      7A |  0000003A | COLON
      7B |  00000023 | NUMBER SIGN
      7C |  000000D0 | LATIN CAPITAL LETTER ETH (Icelandic)
      7D |  00000027 | APOSTROPHE
      7E |  0000003D | EQUALS SIGN
      7F |  00000022 | QUOTATION MARK
      80 |  000000D8 | LATIN CAPITAL LETTER O WITH STROKE
      81 |  00000061 | LATIN SMALL LETTER A
      82 |  00000062 | LATIN SMALL LETTER B
      83 |  00000063 | LATIN SMALL LETTER C
      84 |  00000064 | LATIN SMALL LETTER D
      85 |  00000065 | LATIN SMALL LETTER E
      86 |  00000066 | LATIN SMALL LETTER F
      87 |  00000067 | LATIN SMALL LETTER G
      88 |  00000068 | LATIN SMALL LETTER H
      89 |  00000069 | LATIN SMALL LETTER I
      8A |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
      8B |  000000BB | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
      8C |  00000060 | GRAVE ACCENT
      8D |  000000FD | LATIN SMALL LETTER Y WITH ACUTE
      8E |  0000007B | LEFT CURLY BRACKET
      8F |  000000B1 | PLUS-MINUS SIGN
      90 |  000000B0 | DEGREE SIGN
      91 |  0000006A | LATIN SMALL LETTER J
      92 |  0000006B | LATIN SMALL LETTER K
      93 |  0000006C | LATIN SMALL LETTER L
      94 |  0000006D | LATIN SMALL LETTER M
      95 |  0000006E | LATIN SMALL LETTER N
      96 |  0000006F | LATIN SMALL LETTER O
      97 |  00000070 | LATIN SMALL LETTER P
      98 |  00000071 | LATIN SMALL LETTER Q
      99 |  00000072 | LATIN SMALL LETTER R
      9A |  000000AA | FEMININE ORDINAL INDICATOR
      9B |  000000BA | MASCULINE ORDINAL INDICATOR
      9C |  0000007D | RIGHT CURLY BRACKET
      9D |  000000B8 | CEDILLA
      9E |  0000005D | RIGHT SQUARE BRACKET
      9F |  000000A4 | CURRENCY SIGN
      A0 |  000000B5 | MICRO SIGN
      A1 |  000000F6 | LATIN SMALL LETTER O WITH DIAERESIS
      A2 |  00000073 | LATIN SMALL LETTER S
      A3 |  00000074 | LATIN SMALL LETTER T
      A4 |  00000075 | LATIN SMALL LETTER U
      A5 |  00000076 | LATIN SMALL LETTER V
      A6 |  00000077 | LATIN SMALL LETTER W
      A7 |  00000078 | LATIN SMALL LETTER X
      A8 |  00000079 | LATIN SMALL LETTER Y
      A9 |  0000007A | LATIN SMALL LETTER Z
      AA |  000000A1 | INVERTED EXCLAMATION MARK
      AB |  000000BF | INVERTED QUESTION MARK
      AC |  00000040 | COMMERCIAL AT
      AD |  000000DD | LATIN CAPITAL LETTER Y WITH ACUTE
      AE |  0000005B | LEFT SQUARE BRACKET
      AF |  000000AE | REGISTERED SIGN
      B0 |  000000A2 | CENT SIGN
      B1 |  000000A3 | POUND SIGN
      B2 |  000000A5 | YEN SIGN
      B3 |  000000B7 | MIDDLE DOT
      B4 |  000000A9 | COPYRIGHT SIGN
      B5 |  000000A7 | SECTION SIGN
      B6 |  000000B6 | PILCROW SIGN
      B7 |  000000BC | VULGAR FRACTION ONE QUARTER
      B8 |  000000BD | VULGAR FRACTION ONE HALF
      B9 |  000000BE | VULGAR FRACTION THREE QUARTERS
      BA |  000000AC | NOT SIGN
      BB |  0000007C | VERTICAL LINE
      BC |  000000AF | MACRON
      BD |  000000A8 | DIAERESIS
      BE |  0000005C | REVERSE SOLIDUS
      BF |  000000D7 | MULTIPLICATION SIGN
      C0 |  000000DE | LATIN CAPITAL LETTER THORN (Icelandic)
      C1 |  00000041 | LATIN CAPITAL LETTER A
      C2 |  00000042 | LATIN CAPITAL LETTER B
      C3 |  00000043 | LATIN CAPITAL LETTER C
      C4 |  00000044 | LATIN CAPITAL LETTER D
      C5 |  00000045 | LATIN CAPITAL LETTER E
      C6 |  00000046 | LATIN CAPITAL LETTER F
      C7 |  00000047 | LATIN CAPITAL LETTER G
      C8 |  00000048 | LATIN CAPITAL LETTER H
      C9 |  00000049 | LATIN CAPITAL LETTER I
      CA |  000000AD | SOFT HYPHEN
      CB |  000000F4 | LATIN SMALL LETTER O WITH CIRCUMFLEX
      CC |  0000007E | TILDE
      CD |  000000F2 | LATIN SMALL LETTER O WITH GRAVE
      CE |  000000F3 | LATIN SMALL LETTER O WITH ACUTE
      CF |  000000F5 | LATIN SMALL LETTER O WITH TILDE
      D0 |  000000E6 | LATIN SMALL LETTER AE
      D1 |  0000004A | LATIN CAPITAL LETTER J
      D2 |  0000004B | LATIN CAPITAL LETTER K
      D3 |  0000004C | LATIN CAPITAL LETTER L
      D4 |  0000004D | LATIN CAPITAL LETTER M
      D5 |  0000004E | LATIN CAPITAL LETTER N
      D6 |  0000004F | LATIN CAPITAL LETTER O
      D7 |  00000050 | LATIN CAPITAL LETTER P
      D8 |  00000051 | LATIN CAPITAL LETTER Q
      D9 |  00000052 | LATIN CAPITAL LETTER R
      DA |  000000B9 | SUPERSCRIPT ONE
      DB |  000000FB | LATIN SMALL LETTER U WITH CIRCUMFLEX
      DC |  000000FC | LATIN SMALL LETTER U WITH DIAERESIS
      DD |  000000F9 | LATIN SMALL LETTER U WITH GRAVE
      DE |  000000FA | LATIN SMALL LETTER U WITH ACUTE
      DF |  000000FF | LATIN SMALL LETTER Y WITH DIAERESIS
      E0 |  000000B4 | ACUTE ACCENT
      E1 |  000000F7 | DIVISION SIGN
      E2 |  00000053 | LATIN CAPITAL LETTER S
      E3 |  00000054 | LATIN CAPITAL LETTER T
      E4 |  00000055 | LATIN CAPITAL LETTER U
      E5 |  00000056 | LATIN CAPITAL LETTER V
      E6 |  00000057 | LATIN CAPITAL LETTER W
      E7 |  00000058 | LATIN CAPITAL LETTER X
      E8 |  00000059 | LATIN CAPITAL LETTER Y
      E9 |  0000005A | LATIN CAPITAL LETTER Z
      EA |  000000B2 | SUPERSCRIPT TWO
      EB |  000000D4 | LATIN CAPITAL LETTER O WITH CIRCUMFLEX
      EC |  0000005E | CIRCUMFLEX ACCENT
      ED |  000000D2 | LATIN CAPITAL LETTER O WITH GRAVE
      EE |  000000D3 | LATIN CAPITAL LETTER O WITH ACUTE
      EF |  000000D5 | LATIN CAPITAL LETTER O WITH TILDE
      F0 |  00000030 | DIGIT ZERO
      F1 |  00000031 | DIGIT ONE
      F2 |  00000032 | DIGIT TWO
      F3 |  00000033 | DIGIT THREE
      F4 |  00000034 | DIGIT FOUR
      F5 |  00000035 | DIGIT FIVE
      F6 |  00000036 | DIGIT SIX
      F7 |  00000037 | DIGIT SEVEN
      F8 |  00000038 | DIGIT EIGHT
      F9 |  00000039 | DIGIT NINE
      FA |  000000B3 | SUPERSCRIPT THREE
      FB |  000000DB | LATIN CAPITAL LETTER U WITH CIRCUMFLEX
      FC |  000000DC | LATIN CAPITAL LETTER U WITH DIAERESIS
      FD |  000000D9 | LATIN CAPITAL LETTER U WITH GRAVE
      FE |  000000DA | LATIN CAPITAL LETTER U WITH ACUTE
      FF |  0000009F | APPLICATION PROGRAM COMMAND (APC)
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_IBM871

    $main::fatpacked{"Locale/RecodeData/IBM874.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_IBM874';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for IBM874.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::IBM874;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0x20ac,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x2026,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x2018,
      0x2019,
      0x201c,
      0x201d,
      0x2022,
      0x2013,
      0x2014,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00a0,
      0x0e01,
      0x0e02,
      0x0e03,
      0x0e04,
      0x0e05,
      0x0e06,
      0x0e07,
      0x0e08,
      0x0e09,
      0x0e0a,
      0x0e0b,
      0x0e0c,
      0x0e0d,
      0x0e0e,
      0x0e0f,
      0x0e10,
      0x0e11,
      0x0e12,
      0x0e13,
      0x0e14,
      0x0e15,
      0x0e16,
      0x0e17,
      0x0e18,
      0x0e19,
      0x0e1a,
      0x0e1b,
      0x0e1c,
      0x0e1d,
      0x0e1e,
      0x0e1f,
      0x0e20,
      0x0e21,
      0x0e22,
      0x0e23,
      0x0e24,
      0x0e25,
      0x0e26,
      0x0e27,
      0x0e28,
      0x0e29,
      0x0e2a,
      0x0e2b,
      0x0e2c,
      0x0e2d,
      0x0e2e,
      0x0e2f,
      0x0e30,
      0x0e31,
      0x0e32,
      0x0e33,
      0x0e34,
      0x0e35,
      0x0e36,
      0x0e37,
      0x0e38,
      0x0e39,
      0x0e3a,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0e3f,
      0x0e40,
      0x0e41,
      0x0e42,
      0x0e43,
      0x0e44,
      0x0e45,
      0x0e46,
      0x0e47,
      0x0e48,
      0x0e49,
      0x0e4a,
      0x0e4b,
      0x0e4c,
      0x0e4d,
      0x0e4e,
      0x0e4f,
      0x0e50,
      0x0e51,
      0x0e52,
      0x0e53,
      0x0e54,
      0x0e55,
      0x0e56,
      0x0e57,
      0x0e58,
      0x0e59,
      0x0e5a,
      0x0e5b,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xe2\x82\xac",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xe2\x80\xa6",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xe2\x80\x98",
      "\xe2\x80\x99",
      "\xe2\x80\x9c",
      "\xe2\x80\x9d",
      "\xe2\x80\xa2",
      "\xe2\x80\x93",
      "\xe2\x80\x94",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc2\xa0",
      "\xe0\xb8\x81",
      "\xe0\xb8\x82",
      "\xe0\xb8\x83",
      "\xe0\xb8\x84",
      "\xe0\xb8\x85",
      "\xe0\xb8\x86",
      "\xe0\xb8\x87",
      "\xe0\xb8\x88",
      "\xe0\xb8\x89",
      "\xe0\xb8\x8a",
      "\xe0\xb8\x8b",
      "\xe0\xb8\x8c",
      "\xe0\xb8\x8d",
      "\xe0\xb8\x8e",
      "\xe0\xb8\x8f",
      "\xe0\xb8\x90",
      "\xe0\xb8\x91",
      "\xe0\xb8\x92",
      "\xe0\xb8\x93",
      "\xe0\xb8\x94",
      "\xe0\xb8\x95",
      "\xe0\xb8\x96",
      "\xe0\xb8\x97",
      "\xe0\xb8\x98",
      "\xe0\xb8\x99",
      "\xe0\xb8\x9a",
      "\xe0\xb8\x9b",
      "\xe0\xb8\x9c",
      "\xe0\xb8\x9d",
      "\xe0\xb8\x9e",
      "\xe0\xb8\x9f",
      "\xe0\xb8\xa0",
      "\xe0\xb8\xa1",
      "\xe0\xb8\xa2",
      "\xe0\xb8\xa3",
      "\xe0\xb8\xa4",
      "\xe0\xb8\xa5",
      "\xe0\xb8\xa6",
      "\xe0\xb8\xa7",
      "\xe0\xb8\xa8",
      "\xe0\xb8\xa9",
      "\xe0\xb8\xaa",
      "\xe0\xb8\xab",
      "\xe0\xb8\xac",
      "\xe0\xb8\xad",
      "\xe0\xb8\xae",
      "\xe0\xb8\xaf",
      "\xe0\xb8\xb0",
      "\xe0\xb8\xb1",
      "\xe0\xb8\xb2",
      "\xe0\xb8\xb3",
      "\xe0\xb8\xb4",
      "\xe0\xb8\xb5",
      "\xe0\xb8\xb6",
      "\xe0\xb8\xb7",
      "\xe0\xb8\xb8",
      "\xe0\xb8\xb9",
      "\xe0\xb8\xba",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xe0\xb8\xbf",
      "\xe0\xb9\x80",
      "\xe0\xb9\x81",
      "\xe0\xb9\x82",
      "\xe0\xb9\x83",
      "\xe0\xb9\x84",
      "\xe0\xb9\x85",
      "\xe0\xb9\x86",
      "\xe0\xb9\x87",
      "\xe0\xb9\x88",
      "\xe0\xb9\x89",
      "\xe0\xb9\x8a",
      "\xe0\xb9\x8b",
      "\xe0\xb9\x8c",
      "\xe0\xb9\x8d",
      "\xe0\xb9\x8e",
      "\xe0\xb9\x8f",
      "\xe0\xb9\x90",
      "\xe0\xb9\x91",
      "\xe0\xb9\x92",
      "\xe0\xb9\x93",
      "\xe0\xb9\x94",
      "\xe0\xb9\x95",
      "\xe0\xb9\x96",
      "\xe0\xb9\x97",
      "\xe0\xb9\x98",
      "\xe0\xb9\x99",
      "\xe0\xb9\x9a",
      "\xe0\xb9\x9b",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x000000a0 => "\xa0",
      0x00000e01 => "\xa1",
      0x00000e02 => "\xa2",
      0x00000e03 => "\xa3",
      0x00000e04 => "\xa4",
      0x00000e05 => "\xa5",
      0x00000e06 => "\xa6",
      0x00000e07 => "\xa7",
      0x00000e08 => "\xa8",
      0x00000e09 => "\xa9",
      0x00000e0a => "\xaa",
      0x00000e0b => "\xab",
      0x00000e0c => "\xac",
      0x00000e0d => "\xad",
      0x00000e0e => "\xae",
      0x00000e0f => "\xaf",
      0x00000e10 => "\xb0",
      0x00000e11 => "\xb1",
      0x00000e12 => "\xb2",
      0x00000e13 => "\xb3",
      0x00000e14 => "\xb4",
      0x00000e15 => "\xb5",
      0x00000e16 => "\xb6",
      0x00000e17 => "\xb7",
      0x00000e18 => "\xb8",
      0x00000e19 => "\xb9",
      0x00000e1a => "\xba",
      0x00000e1b => "\xbb",
      0x00000e1c => "\xbc",
      0x00000e1d => "\xbd",
      0x00000e1e => "\xbe",
      0x00000e1f => "\xbf",
      0x00000e20 => "\xc0",
      0x00000e21 => "\xc1",
      0x00000e22 => "\xc2",
      0x00000e23 => "\xc3",
      0x00000e24 => "\xc4",
      0x00000e25 => "\xc5",
      0x00000e26 => "\xc6",
      0x00000e27 => "\xc7",
      0x00000e28 => "\xc8",
      0x00000e29 => "\xc9",
      0x00000e2a => "\xca",
      0x00000e2b => "\xcb",
      0x00000e2c => "\xcc",
      0x00000e2d => "\xcd",
      0x00000e2e => "\xce",
      0x00000e2f => "\xcf",
      0x00000e30 => "\xd0",
      0x00000e31 => "\xd1",
      0x00000e32 => "\xd2",
      0x00000e33 => "\xd3",
      0x00000e34 => "\xd4",
      0x00000e35 => "\xd5",
      0x00000e36 => "\xd6",
      0x00000e37 => "\xd7",
      0x00000e38 => "\xd8",
      0x00000e39 => "\xd9",
      0x00000e3a => "\xda",
      0x00000e3f => "\xdf",
      0x00000e40 => "\xe0",
      0x00000e41 => "\xe1",
      0x00000e42 => "\xe2",
      0x00000e43 => "\xe3",
      0x00000e44 => "\xe4",
      0x00000e45 => "\xe5",
      0x00000e46 => "\xe6",
      0x00000e47 => "\xe7",
      0x00000e48 => "\xe8",
      0x00000e49 => "\xe9",
      0x00000e4a => "\xea",
      0x00000e4b => "\xeb",
      0x00000e4c => "\xec",
      0x00000e4d => "\xed",
      0x00000e4e => "\xee",
      0x00000e4f => "\xef",
      0x00000e50 => "\xf0",
      0x00000e51 => "\xf1",
      0x00000e52 => "\xf2",
      0x00000e53 => "\xf3",
      0x00000e54 => "\xf4",
      0x00000e55 => "\xf5",
      0x00000e56 => "\xf6",
      0x00000e57 => "\xf7",
      0x00000e58 => "\xf8",
      0x00000e59 => "\xf9",
      0x00000e5a => "\xfa",
      0x00000e5b => "\xfb",
      0x00002013 => "\x96",
      0x00002014 => "\x97",
      0x00002018 => "\x91",
      0x00002019 => "\x92",
      0x0000201c => "\x93",
      0x0000201d => "\x94",
      0x00002022 => "\x95",
      0x00002026 => "\x85",
      0x000020ac => "\x80",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::IBM874 - Conversion routines for IBM874
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for IBM874.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   automatically generated from the charDB
   alias CP874
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL
      01 |  00000001 | START OF HEADING
      02 |  00000002 | START OF TEXT
      03 |  00000003 | END OF TEXT
      04 |  00000004 | END OF TRANSMISSION
      05 |  00000005 | ENQUIRY
      06 |  00000006 | ACKNOWLEDGE
      07 |  00000007 | BELL
      08 |  00000008 | BACKSPACE
      09 |  00000009 | HORIZONTAL TABULATION
      0A |  0000000A | LINE FEED
      0B |  0000000B | VERTICAL TABULATION
      0C |  0000000C | FORM FEED
      0D |  0000000D | CARRIAGE RETURN
      0E |  0000000E | SHIFT OUT
      0F |  0000000F | SHIFT IN
      10 |  00000010 | DATA LINK ESCAPE
      11 |  00000011 | DEVICE CONTROL ONE
      12 |  00000012 | DEVICE CONTROL TWO
      13 |  00000013 | DEVICE CONTROL THREE
      14 |  00000014 | DEVICE CONTROL FOUR
      15 |  00000015 | NEGATIVE ACKNOWLEDGE
      16 |  00000016 | SYNCHRONOUS IDLE
      17 |  00000017 | END OF TRANSMISSION BLOCK
      18 |  00000018 | CANCEL
      19 |  00000019 | END OF MEDIUM
      1A |  0000001A | SUBSTITUTE
      1B |  0000001B | ESCAPE
      1C |  0000001C | FILE SEPARATOR
      1D |  0000001D | GROUP SEPARATOR
      1E |  0000001E | RECORD SEPARATOR
      1F |  0000001F | UNIT SEPARATOR
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE
      80 |  000020AC | EURO SIGN
      85 |  00002026 | HORIZONTAL ELLIPSIS
      91 |  00002018 | LEFT SINGLE QUOTATION MARK
      92 |  00002019 | RIGHT SINGLE QUOTATION MARK
      93 |  0000201C | LEFT DOUBLE QUOTATION MARK
      94 |  0000201D | RIGHT DOUBLE QUOTATION MARK
      95 |  00002022 | BULLET
      96 |  00002013 | EN DASH
      97 |  00002014 | EM DASH
      A0 |  000000A0 | NO-BREAK SPACE
      A1 |  00000E01 | THAI CHARACTER KO KAI
      A2 |  00000E02 | THAI CHARACTER KHO KHAI
      A3 |  00000E03 | THAI CHARACTER KHO KHUAT
      A4 |  00000E04 | THAI CHARACTER KHO KHWAI
      A5 |  00000E05 | THAI CHARACTER KHO KHON
      A6 |  00000E06 | THAI CHARACTER KHO RAKHANG
      A7 |  00000E07 | THAI CHARACTER NGO NGU
      A8 |  00000E08 | THAI CHARACTER CHO CHAN
      A9 |  00000E09 | THAI CHARACTER CHO CHING
      AA |  00000E0A | THAI CHARACTER CHO CHANG
      AB |  00000E0B | THAI CHARACTER SO SO
      AC |  00000E0C | THAI CHARACTER CHO CHOE
      AD |  00000E0D | THAI CHARACTER YO YING
      AE |  00000E0E | THAI CHARACTER DO CHADA
      AF |  00000E0F | THAI CHARACTER TO PATAK
      B0 |  00000E10 | THAI CHARACTER THO THAN
      B1 |  00000E11 | THAI CHARACTER THO NANGMONTHO
      B2 |  00000E12 | THAI CHARACTER THO PHUTHAO
      B3 |  00000E13 | THAI CHARACTER NO NEN
      B4 |  00000E14 | THAI CHARACTER DO DEK
      B5 |  00000E15 | THAI CHARACTER TO TAO
      B6 |  00000E16 | THAI CHARACTER THO THUNG
      B7 |  00000E17 | THAI CHARACTER THO THAHAN
      B8 |  00000E18 | THAI CHARACTER THO THONG
      B9 |  00000E19 | THAI CHARACTER NO NU
      BA |  00000E1A | THAI CHARACTER BO BAIMAI
      BB |  00000E1B | THAI CHARACTER PO PLA
      BC |  00000E1C | THAI CHARACTER PHO PHUNG
      BD |  00000E1D | THAI CHARACTER FO FA
      BE |  00000E1E | THAI CHARACTER PHO PHAN
      BF |  00000E1F | THAI CHARACTER FO FAN
      C0 |  00000E20 | THAI CHARACTER PHO SAMPHAO
      C1 |  00000E21 | THAI CHARACTER MO MA
      C2 |  00000E22 | THAI CHARACTER YO YAK
      C3 |  00000E23 | THAI CHARACTER RO RUA
      C4 |  00000E24 | THAI CHARACTER RU
      C5 |  00000E25 | THAI CHARACTER LO LING
      C6 |  00000E26 | THAI CHARACTER LU
      C7 |  00000E27 | THAI CHARACTER WO WAEN
      C8 |  00000E28 | THAI CHARACTER SO SALA
      C9 |  00000E29 | THAI CHARACTER SO RUSI
      CA |  00000E2A | THAI CHARACTER SO SUA
      CB |  00000E2B | THAI CHARACTER HO HIP
      CC |  00000E2C | THAI CHARACTER LO CHULA
      CD |  00000E2D | THAI CHARACTER O ANG
      CE |  00000E2E | THAI CHARACTER HO NOKHUK
      CF |  00000E2F | THAI CHARACTER PAIYANNOI
      D0 |  00000E30 | THAI CHARACTER SARA A
      D1 |  00000E31 | THAI CHARACTER MAI HAN-AKAT
      D2 |  00000E32 | THAI CHARACTER SARA AA
      D3 |  00000E33 | THAI CHARACTER SARA AM
      D4 |  00000E34 | THAI CHARACTER SARA I
      D5 |  00000E35 | THAI CHARACTER SARA II
      D6 |  00000E36 | THAI CHARACTER SARA UE
      D7 |  00000E37 | THAI CHARACTER SARA UEE
      D8 |  00000E38 | THAI CHARACTER SARA U
      D9 |  00000E39 | THAI CHARACTER SARA UU
      DA |  00000E3A | THAI CHARACTER PHINTHU
      DF |  00000E3F | THAI CURRENCY SYMBOL BAHT
      E0 |  00000E40 | THAI CHARACTER SARA E
      E1 |  00000E41 | THAI CHARACTER SARA AE
      E2 |  00000E42 | THAI CHARACTER SARA O
      E3 |  00000E43 | THAI CHARACTER SARA AI MAIMUAN
      E4 |  00000E44 | THAI CHARACTER SARA AI MAIMALAI
      E5 |  00000E45 | THAI CHARACTER LAKKHANGYAO
      E6 |  00000E46 | THAI CHARACTER MAIYAMOK
      E7 |  00000E47 | THAI CHARACTER MAITAIKHU
      E8 |  00000E48 | THAI CHARACTER MAI EK
      E9 |  00000E49 | THAI CHARACTER MAI THO
      EA |  00000E4A | THAI CHARACTER MAI TRI
      EB |  00000E4B | THAI CHARACTER MAI CHATTAWA
      EC |  00000E4C | THAI CHARACTER THANTHAKHAT
      ED |  00000E4D | THAI CHARACTER NIKHAHIT
      EE |  00000E4E | THAI CHARACTER YAMAKKAN
      EF |  00000E4F | THAI CHARACTER FONGMAN
      F0 |  00000E50 | THAI DIGIT ZERO
      F1 |  00000E51 | THAI DIGIT ONE
      F2 |  00000E52 | THAI DIGIT TWO
      F3 |  00000E53 | THAI DIGIT THREE
      F4 |  00000E54 | THAI DIGIT FOUR
      F5 |  00000E55 | THAI DIGIT FIVE
      F6 |  00000E56 | THAI DIGIT SIX
      F7 |  00000E57 | THAI DIGIT SEVEN
      F8 |  00000E58 | THAI DIGIT EIGHT
      F9 |  00000E59 | THAI DIGIT NINE
      FA |  00000E5A | THAI CHARACTER ANGKHANKHU
      FB |  00000E5B | THAI CHARACTER KHOMUT
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_IBM874

    $main::fatpacked{"Locale/RecodeData/IBM875.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_IBM875';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for IBM875.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::IBM875;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x009c,
      0x0009,
      0x0086,
      0x007f,
      0x0097,
      0x008d,
      0x008e,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x009d,
      0x0085,
      0x0008,
      0x0087,
      0x0018,
      0x0019,
      0x0092,
      0x008f,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0080,
      0x0081,
      0x0082,
      0x0083,
      0x0084,
      0x000a,
      0x0017,
      0x001b,
      0x0088,
      0x0089,
      0x008a,
      0x008b,
      0x008c,
      0x0005,
      0x0006,
      0x0007,
      0x0090,
      0x0091,
      0x0016,
      0x0093,
      0x0094,
      0x0095,
      0x0096,
      0x0004,
      0x0098,
      0x0099,
      0x009a,
      0x009b,
      0x0014,
      0x0015,
      0x009e,
      0x001a,
      0x0020,
      0x0391,
      0x0392,
      0x0393,
      0x0394,
      0x0395,
      0x0396,
      0x0397,
      0x0398,
      0x0399,
      0x005b,
      0x002e,
      0x003c,
      0x0028,
      0x002b,
      0x0021,
      0x0026,
      0x039a,
      0x039b,
      0x039c,
      0x039d,
      0x039e,
      0x039f,
      0x03a0,
      0x03a1,
      0x03a3,
      0x005d,
      0x0024,
      0x002a,
      0x0029,
      0x003b,
      0x005e,
      0x002d,
      0x002f,
      0x03a4,
      0x03a5,
      0x03a6,
      0x03a7,
      0x03a8,
      0x03a9,
      0x03aa,
      0x03ab,
      0xfffd,
      0x002c,
      0x0025,
      0x005f,
      0x003e,
      0x003f,
      0x00a8,
      0x0386,
      0x0388,
      0x0389,
      0x2207,
      0x038a,
      0x038c,
      0x038e,
      0x038f,
      0x0060,
      0x003a,
      0x0023,
      0x0040,
      0x0027,
      0x003d,
      0x0022,
      0x0385,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x03b1,
      0x03b2,
      0x03b3,
      0x03b4,
      0x03b5,
      0x03b6,
      0x00b0,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x03b7,
      0x03b8,
      0x03b9,
      0x03ba,
      0x03bb,
      0x03bc,
      0x00b4,
      0x007e,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x03bd,
      0x03be,
      0x03bf,
      0x03c0,
      0x03c1,
      0x03c3,
      0x00a3,
      0x03ac,
      0x03ad,
      0x03ae,
      0x0390,
      0x03af,
      0x03cc,
      0x03cd,
      0x03b0,
      0x03ce,
      0x03c2,
      0x03c4,
      0x03c5,
      0x03c6,
      0x03c7,
      0x03c8,
      0x007b,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x00ad,
      0x03c9,
      0x03ca,
      0x03cb,
      0x2018,
      0x2015,
      0x007d,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x00b1,
      0x00bd,
      0xfffd,
      0x00b7,
      0x2019,
      0x00a6,
      0x005c,
      0xfffd,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x00b2,
      0x00a7,
      0xfffd,
      0xfffd,
      0x00ab,
      0x00ac,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x00b3,
      0x00a9,
      0xfffd,
      0xfffd,
      0x00bb,
      0x009f,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\xc2\x9c",
      "\x09",
      "\xc2\x86",
      "\x7f",
      "\xc2\x97",
      "\xc2\x8d",
      "\xc2\x8e",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\xc2\x9d",
      "\xc2\x85",
      "\x08",
      "\xc2\x87",
      "\x18",
      "\x19",
      "\xc2\x92",
      "\xc2\x8f",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\xc2\x80",
      "\xc2\x81",
      "\xc2\x82",
      "\xc2\x83",
      "\xc2\x84",
      "\x0a",
      "\x17",
      "\x1b",
      "\xc2\x88",
      "\xc2\x89",
      "\xc2\x8a",
      "\xc2\x8b",
      "\xc2\x8c",
      "\x05",
      "\x06",
      "\x07",
      "\xc2\x90",
      "\xc2\x91",
      "\x16",
      "\xc2\x93",
      "\xc2\x94",
      "\xc2\x95",
      "\xc2\x96",
      "\x04",
      "\xc2\x98",
      "\xc2\x99",
      "\xc2\x9a",
      "\xc2\x9b",
      "\x14",
      "\x15",
      "\xc2\x9e",
      "\x1a",
      "\x20",
      "\xce\x91",
      "\xce\x92",
      "\xce\x93",
      "\xce\x94",
      "\xce\x95",
      "\xce\x96",
      "\xce\x97",
      "\xce\x98",
      "\xce\x99",
      "\x5b",
      "\x2e",
      "\x3c",
      "\x28",
      "\x2b",
      "\x21",
      "\x26",
      "\xce\x9a",
      "\xce\x9b",
      "\xce\x9c",
      "\xce\x9d",
      "\xce\x9e",
      "\xce\x9f",
      "\xce\xa0",
      "\xce\xa1",
      "\xce\xa3",
      "\x5d",
      "\x24",
      "\x2a",
      "\x29",
      "\x3b",
      "\x5e",
      "\x2d",
      "\x2f",
      "\xce\xa4",
      "\xce\xa5",
      "\xce\xa6",
      "\xce\xa7",
      "\xce\xa8",
      "\xce\xa9",
      "\xce\xaa",
      "\xce\xab",
      "\xef\xbf\xbd",
      "\x2c",
      "\x25",
      "\x5f",
      "\x3e",
      "\x3f",
      "\xc2\xa8",
      "\xce\x86",
      "\xce\x88",
      "\xce\x89",
      "\xe2\x88\x87",
      "\xce\x8a",
      "\xce\x8c",
      "\xce\x8e",
      "\xce\x8f",
      "\x60",
      "\x3a",
      "\x23",
      "\x40",
      "\x27",
      "\x3d",
      "\x22",
      "\xce\x85",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\xce\xb1",
      "\xce\xb2",
      "\xce\xb3",
      "\xce\xb4",
      "\xce\xb5",
      "\xce\xb6",
      "\xc2\xb0",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\xce\xb7",
      "\xce\xb8",
      "\xce\xb9",
      "\xce\xba",
      "\xce\xbb",
      "\xce\xbc",
      "\xc2\xb4",
      "\x7e",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\xce\xbd",
      "\xce\xbe",
      "\xce\xbf",
      "\xcf\x80",
      "\xcf\x81",
      "\xcf\x83",
      "\xc2\xa3",
      "\xce\xac",
      "\xce\xad",
      "\xce\xae",
      "\xce\x90",
      "\xce\xaf",
      "\xcf\x8c",
      "\xcf\x8d",
      "\xce\xb0",
      "\xcf\x8e",
      "\xcf\x82",
      "\xcf\x84",
      "\xcf\x85",
      "\xcf\x86",
      "\xcf\x87",
      "\xcf\x88",
      "\x7b",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\xc2\xad",
      "\xcf\x89",
      "\xcf\x8a",
      "\xcf\x8b",
      "\xe2\x80\x98",
      "\xe2\x80\x95",
      "\x7d",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\xc2\xb1",
      "\xc2\xbd",
      "\xef\xbf\xbd",
      "\xc2\xb7",
      "\xe2\x80\x99",
      "\xc2\xa6",
      "\x5c",
      "\xef\xbf\xbd",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\xc2\xb2",
      "\xc2\xa7",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc2\xab",
      "\xc2\xac",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\xc2\xb3",
      "\xc2\xa9",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc2\xbb",
      "\xc2\x9f",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x37",
      0x00000005 => "\x2d",
      0x00000006 => "\x2e",
      0x00000007 => "\x2f",
      0x00000008 => "\x16",
      0x00000009 => "\x05",
      0x0000000a => "\x25",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x3c",
      0x00000015 => "\x3d",
      0x00000016 => "\x32",
      0x00000017 => "\x26",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x3f",
      0x0000001b => "\x27",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x40",
      0x00000021 => "\x4f",
      0x00000022 => "\x7f",
      0x00000023 => "\x7b",
      0x00000024 => "\x5b",
      0x00000025 => "\x6c",
      0x00000026 => "\x50",
      0x00000027 => "\x7d",
      0x00000028 => "\x4d",
      0x00000029 => "\x5d",
      0x0000002a => "\x5c",
      0x0000002b => "\x4e",
      0x0000002c => "\x6b",
      0x0000002d => "\x60",
      0x0000002e => "\x4b",
      0x0000002f => "\x61",
      0x00000030 => "\xf0",
      0x00000031 => "\xf1",
      0x00000032 => "\xf2",
      0x00000033 => "\xf3",
      0x00000034 => "\xf4",
      0x00000035 => "\xf5",
      0x00000036 => "\xf6",
      0x00000037 => "\xf7",
      0x00000038 => "\xf8",
      0x00000039 => "\xf9",
      0x0000003a => "\x7a",
      0x0000003b => "\x5e",
      0x0000003c => "\x4c",
      0x0000003d => "\x7e",
      0x0000003e => "\x6e",
      0x0000003f => "\x6f",
      0x00000040 => "\x7c",
      0x00000041 => "\xc1",
      0x00000042 => "\xc2",
      0x00000043 => "\xc3",
      0x00000044 => "\xc4",
      0x00000045 => "\xc5",
      0x00000046 => "\xc6",
      0x00000047 => "\xc7",
      0x00000048 => "\xc8",
      0x00000049 => "\xc9",
      0x0000004a => "\xd1",
      0x0000004b => "\xd2",
      0x0000004c => "\xd3",
      0x0000004d => "\xd4",
      0x0000004e => "\xd5",
      0x0000004f => "\xd6",
      0x00000050 => "\xd7",
      0x00000051 => "\xd8",
      0x00000052 => "\xd9",
      0x00000053 => "\xe2",
      0x00000054 => "\xe3",
      0x00000055 => "\xe4",
      0x00000056 => "\xe5",
      0x00000057 => "\xe6",
      0x00000058 => "\xe7",
      0x00000059 => "\xe8",
      0x0000005a => "\xe9",
      0x0000005b => "\x4a",
      0x0000005c => "\xe0",
      0x0000005d => "\x5a",
      0x0000005e => "\x5f",
      0x0000005f => "\x6d",
      0x00000060 => "\x79",
      0x00000061 => "\x81",
      0x00000062 => "\x82",
      0x00000063 => "\x83",
      0x00000064 => "\x84",
      0x00000065 => "\x85",
      0x00000066 => "\x86",
      0x00000067 => "\x87",
      0x00000068 => "\x88",
      0x00000069 => "\x89",
      0x0000006a => "\x91",
      0x0000006b => "\x92",
      0x0000006c => "\x93",
      0x0000006d => "\x94",
      0x0000006e => "\x95",
      0x0000006f => "\x96",
      0x00000070 => "\x97",
      0x00000071 => "\x98",
      0x00000072 => "\x99",
      0x00000073 => "\xa2",
      0x00000074 => "\xa3",
      0x00000075 => "\xa4",
      0x00000076 => "\xa5",
      0x00000077 => "\xa6",
      0x00000078 => "\xa7",
      0x00000079 => "\xa8",
      0x0000007a => "\xa9",
      0x0000007b => "\xc0",
      0x0000007d => "\xd0",
      0x0000007e => "\xa1",
      0x0000007f => "\x07",
      0x00000080 => "\x20",
      0x00000081 => "\x21",
      0x00000082 => "\x22",
      0x00000083 => "\x23",
      0x00000084 => "\x24",
      0x00000085 => "\x15",
      0x00000086 => "\x06",
      0x00000087 => "\x17",
      0x00000088 => "\x28",
      0x00000089 => "\x29",
      0x0000008a => "\x2a",
      0x0000008b => "\x2b",
      0x0000008c => "\x2c",
      0x0000008d => "\x09",
      0x0000008e => "\x0a",
      0x0000008f => "\x1b",
      0x00000090 => "\x30",
      0x00000091 => "\x31",
      0x00000092 => "\x1a",
      0x00000093 => "\x33",
      0x00000094 => "\x34",
      0x00000095 => "\x35",
      0x00000096 => "\x36",
      0x00000097 => "\x08",
      0x00000098 => "\x38",
      0x00000099 => "\x39",
      0x0000009a => "\x3a",
      0x0000009b => "\x3b",
      0x0000009c => "\x04",
      0x0000009d => "\x14",
      0x0000009e => "\x3e",
      0x0000009f => "\xff",
      0x000000a3 => "\xb0",
      0x000000a6 => "\xdf",
      0x000000a7 => "\xeb",
      0x000000a8 => "\x70",
      0x000000a9 => "\xfb",
      0x000000ab => "\xee",
      0x000000ac => "\xef",
      0x000000ad => "\xca",
      0x000000b0 => "\x90",
      0x000000b1 => "\xda",
      0x000000b2 => "\xea",
      0x000000b3 => "\xfa",
      0x000000b4 => "\xa0",
      0x000000b7 => "\xdd",
      0x000000bb => "\xfe",
      0x000000bd => "\xdb",
      0x00000385 => "\x80",
      0x00000386 => "\x71",
      0x00000388 => "\x72",
      0x00000389 => "\x73",
      0x0000038a => "\x75",
      0x0000038c => "\x76",
      0x0000038e => "\x77",
      0x0000038f => "\x78",
      0x00000390 => "\xb4",
      0x00000391 => "\x41",
      0x00000392 => "\x42",
      0x00000393 => "\x43",
      0x00000394 => "\x44",
      0x00000395 => "\x45",
      0x00000396 => "\x46",
      0x00000397 => "\x47",
      0x00000398 => "\x48",
      0x00000399 => "\x49",
      0x0000039a => "\x51",
      0x0000039b => "\x52",
      0x0000039c => "\x53",
      0x0000039d => "\x54",
      0x0000039e => "\x55",
      0x0000039f => "\x56",
      0x000003a0 => "\x57",
      0x000003a1 => "\x58",
      0x000003a3 => "\x59",
      0x000003a4 => "\x62",
      0x000003a5 => "\x63",
      0x000003a6 => "\x64",
      0x000003a7 => "\x65",
      0x000003a8 => "\x66",
      0x000003a9 => "\x67",
      0x000003aa => "\x68",
      0x000003ab => "\x69",
      0x000003ac => "\xb1",
      0x000003ad => "\xb2",
      0x000003ae => "\xb3",
      0x000003af => "\xb5",
      0x000003b0 => "\xb8",
      0x000003b1 => "\x8a",
      0x000003b2 => "\x8b",
      0x000003b3 => "\x8c",
      0x000003b4 => "\x8d",
      0x000003b5 => "\x8e",
      0x000003b6 => "\x8f",
      0x000003b7 => "\x9a",
      0x000003b8 => "\x9b",
      0x000003b9 => "\x9c",
      0x000003ba => "\x9d",
      0x000003bb => "\x9e",
      0x000003bc => "\x9f",
      0x000003bd => "\xaa",
      0x000003be => "\xab",
      0x000003bf => "\xac",
      0x000003c0 => "\xad",
      0x000003c1 => "\xae",
      0x000003c2 => "\xba",
      0x000003c3 => "\xaf",
      0x000003c4 => "\xbb",
      0x000003c5 => "\xbc",
      0x000003c6 => "\xbd",
      0x000003c7 => "\xbe",
      0x000003c8 => "\xbf",
      0x000003c9 => "\xcb",
      0x000003ca => "\xcc",
      0x000003cb => "\xcd",
      0x000003cc => "\xb6",
      0x000003cd => "\xb7",
      0x000003ce => "\xb9",
      0x00002015 => "\xcf",
      0x00002018 => "\xce",
      0x00002019 => "\xde",
      0x00002207 => "\x74",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x6f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::IBM875 - Conversion routines for IBM875
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for IBM875.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: UNICODE 1.0
   alias CP875
   alias EBCDIC-GREEK
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  0000009C | STRING TERMINATOR (ST)
      05 |  00000009 | CHARACTER TABULATION (HT)
      06 |  00000086 | START OF SELECTED AREA (SSA)
      07 |  0000007F | DELETE (DEL)
      08 |  00000097 | END OF GUARDED AREA (EPA)
      09 |  0000008D | REVERSE LINE FEED (RI)
      0A |  0000008E | SINGLE-SHIFT TWO (SS2)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  0000009D | OPERATING SYSTEM COMMAND (OSC)
      15 |  00000085 | NEXT LINE (NEL)
      16 |  00000008 | BACKSPACE (BS)
      17 |  00000087 | END OF SELECTED AREA (ESA)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  00000092 | PRIVATE USE TWO (PU2)
      1B |  0000008F | SINGLE-SHIFT THREE (SS3)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000080 | PADDING CHARACTER (PAD)
      21 |  00000081 | HIGH OCTET PRESET (HOP)
      22 |  00000082 | BREAK PERMITTED HERE (BPH)
      23 |  00000083 | NO BREAK HERE (NBH)
      24 |  00000084 | INDEX (IND)
      25 |  0000000A | LINE FEED (LF)
      26 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      27 |  0000001B | ESCAPE (ESC)
      28 |  00000088 | CHARACTER TABULATION SET (HTS)
      29 |  00000089 | CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
      2A |  0000008A | LINE TABULATION SET (VTS)
      2B |  0000008B | PARTIAL LINE FORWARD (PLD)
      2C |  0000008C | PARTIAL LINE BACKWARD (PLU)
      2D |  00000005 | ENQUIRY (ENQ)
      2E |  00000006 | ACKNOWLEDGE (ACK)
      2F |  00000007 | BELL (BEL)
      30 |  00000090 | DEVICE CONTROL STRING (DCS)
      31 |  00000091 | PRIVATE USE ONE (PU1)
      32 |  00000016 | SYNCHRONOUS IDLE (SYN)
      33 |  00000093 | SET TRANSMIT STATE (STS)
      34 |  00000094 | CANCEL CHARACTER (CCH)
      35 |  00000095 | MESSAGE WAITING (MW)
      36 |  00000096 | START OF GUARDED AREA (SPA)
      37 |  00000004 | END OF TRANSMISSION (EOT)
      38 |  00000098 | START OF STRING (SOS)
      39 |  00000099 | SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
      3A |  0000009A | SINGLE CHARACTER INTRODUCER (SCI)
      3B |  0000009B | CONTROL SEQUENCE INTRODUCER (CSI)
      3C |  00000014 | DEVICE CONTROL FOUR (DC4)
      3D |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      3E |  0000009E | PRIVACY MESSAGE (PM)
      3F |  0000001A | SUBSTITUTE (SUB)
      40 |  00000020 | SPACE
      41 |  00000391 | GREEK CAPITAL LETTER ALPHA
      42 |  00000392 | GREEK CAPITAL LETTER BETA
      43 |  00000393 | GREEK CAPITAL LETTER GAMMA
      44 |  00000394 | GREEK CAPITAL LETTER DELTA
      45 |  00000395 | GREEK CAPITAL LETTER EPSILON
      46 |  00000396 | GREEK CAPITAL LETTER ZETA
      47 |  00000397 | GREEK CAPITAL LETTER ETA
      48 |  00000398 | GREEK CAPITAL LETTER THETA
      49 |  00000399 | GREEK CAPITAL LETTER IOTA
      4A |  0000005B | LEFT SQUARE BRACKET
      4B |  0000002E | FULL STOP
      4C |  0000003C | LESS-THAN SIGN
      4D |  00000028 | LEFT PARENTHESIS
      4E |  0000002B | PLUS SIGN
      4F |  00000021 | EXCLAMATION MARK
      50 |  00000026 | AMPERSAND
      51 |  0000039A | GREEK CAPITAL LETTER KAPPA
      52 |  0000039B | GREEK CAPITAL LETTER LAMDA
      53 |  0000039C | GREEK CAPITAL LETTER MU
      54 |  0000039D | GREEK CAPITAL LETTER NU
      55 |  0000039E | GREEK CAPITAL LETTER XI
      56 |  0000039F | GREEK CAPITAL LETTER OMICRON
      57 |  000003A0 | GREEK CAPITAL LETTER PI
      58 |  000003A1 | GREEK CAPITAL LETTER RHO
      59 |  000003A3 | GREEK CAPITAL LETTER SIGMA
      5A |  0000005D | RIGHT SQUARE BRACKET
      5B |  00000024 | DOLLAR SIGN
      5C |  0000002A | ASTERISK
      5D |  00000029 | RIGHT PARENTHESIS
      5E |  0000003B | SEMICOLON
      5F |  0000005E | CIRCUMFLEX ACCENT
      60 |  0000002D | HYPHEN-MINUS
      61 |  0000002F | SOLIDUS
      62 |  000003A4 | GREEK CAPITAL LETTER TAU
      63 |  000003A5 | GREEK CAPITAL LETTER UPSILON
      64 |  000003A6 | GREEK CAPITAL LETTER PHI
      65 |  000003A7 | GREEK CAPITAL LETTER CHI
      66 |  000003A8 | GREEK CAPITAL LETTER PSI
      67 |  000003A9 | GREEK CAPITAL LETTER OMEGA
      68 |  000003AA | GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
      69 |  000003AB | GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
      6B |  0000002C | COMMA
      6C |  00000025 | PERCENT SIGN
      6D |  0000005F | LOW LINE
      6E |  0000003E | GREATER-THAN SIGN
      6F |  0000003F | QUESTION MARK
      70 |  000000A8 | DIAERESIS
      71 |  00000386 | GREEK CAPITAL LETTER ALPHA WITH TONOS
      72 |  00000388 | GREEK CAPITAL LETTER EPSILON WITH TONOS
      73 |  00000389 | GREEK CAPITAL LETTER ETA WITH TONOS
      74 |  00002207 | NABLA
      75 |  0000038A | GREEK CAPITAL LETTER IOTA WITH TONOS
      76 |  0000038C | GREEK CAPITAL LETTER OMICRON WITH TONOS
      77 |  0000038E | GREEK CAPITAL LETTER UPSILON WITH TONOS
      78 |  0000038F | GREEK CAPITAL LETTER OMEGA WITH TONOS
      79 |  00000060 | GRAVE ACCENT
      7A |  0000003A | COLON
      7B |  00000023 | NUMBER SIGN
      7C |  00000040 | COMMERCIAL AT
      7D |  00000027 | APOSTROPHE
      7E |  0000003D | EQUALS SIGN
      7F |  00000022 | QUOTATION MARK
      80 |  00000385 | GREEK DIALYTIKA TONOS
      81 |  00000061 | LATIN SMALL LETTER A
      82 |  00000062 | LATIN SMALL LETTER B
      83 |  00000063 | LATIN SMALL LETTER C
      84 |  00000064 | LATIN SMALL LETTER D
      85 |  00000065 | LATIN SMALL LETTER E
      86 |  00000066 | LATIN SMALL LETTER F
      87 |  00000067 | LATIN SMALL LETTER G
      88 |  00000068 | LATIN SMALL LETTER H
      89 |  00000069 | LATIN SMALL LETTER I
      8A |  000003B1 | GREEK SMALL LETTER ALPHA
      8B |  000003B2 | GREEK SMALL LETTER BETA
      8C |  000003B3 | GREEK SMALL LETTER GAMMA
      8D |  000003B4 | GREEK SMALL LETTER DELTA
      8E |  000003B5 | GREEK SMALL LETTER EPSILON
      8F |  000003B6 | GREEK SMALL LETTER ZETA
      90 |  000000B0 | DEGREE SIGN
      91 |  0000006A | LATIN SMALL LETTER J
      92 |  0000006B | LATIN SMALL LETTER K
      93 |  0000006C | LATIN SMALL LETTER L
      94 |  0000006D | LATIN SMALL LETTER M
      95 |  0000006E | LATIN SMALL LETTER N
      96 |  0000006F | LATIN SMALL LETTER O
      97 |  00000070 | LATIN SMALL LETTER P
      98 |  00000071 | LATIN SMALL LETTER Q
      99 |  00000072 | LATIN SMALL LETTER R
      9A |  000003B7 | GREEK SMALL LETTER ETA
      9B |  000003B8 | GREEK SMALL LETTER THETA
      9C |  000003B9 | GREEK SMALL LETTER IOTA
      9D |  000003BA | GREEK SMALL LETTER KAPPA
      9E |  000003BB | GREEK SMALL LETTER LAMDA
      9F |  000003BC | GREEK SMALL LETTER MU
      A0 |  000000B4 | ACUTE ACCENT
      A1 |  0000007E | TILDE
      A2 |  00000073 | LATIN SMALL LETTER S
      A3 |  00000074 | LATIN SMALL LETTER T
      A4 |  00000075 | LATIN SMALL LETTER U
      A5 |  00000076 | LATIN SMALL LETTER V
      A6 |  00000077 | LATIN SMALL LETTER W
      A7 |  00000078 | LATIN SMALL LETTER X
      A8 |  00000079 | LATIN SMALL LETTER Y
      A9 |  0000007A | LATIN SMALL LETTER Z
      AA |  000003BD | GREEK SMALL LETTER NU
      AB |  000003BE | GREEK SMALL LETTER XI
      AC |  000003BF | GREEK SMALL LETTER OMICRON
      AD |  000003C0 | GREEK SMALL LETTER PI
      AE |  000003C1 | GREEK SMALL LETTER RHO
      AF |  000003C3 | GREEK SMALL LETTER SIGMA
      B0 |  000000A3 | POUND SIGN
      B1 |  000003AC | GREEK SMALL LETTER ALPHA WITH TONOS
      B2 |  000003AD | GREEK SMALL LETTER EPSILON WITH TONOS
      B3 |  000003AE | GREEK SMALL LETTER ETA WITH TONOS
      B4 |  00000390 | GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
      B5 |  000003AF | GREEK SMALL LETTER IOTA WITH TONOS
      B6 |  000003CC | GREEK SMALL LETTER OMICRON WITH TONOS
      B7 |  000003CD | GREEK SMALL LETTER UPSILON WITH TONOS
      B8 |  000003B0 | GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
      B9 |  000003CE | GREEK SMALL LETTER OMEGA WITH TONOS
      BA |  000003C2 | GREEK SMALL LETTER FINAL SIGMA
      BB |  000003C4 | GREEK SMALL LETTER TAU
      BC |  000003C5 | GREEK SMALL LETTER UPSILON
      BD |  000003C6 | GREEK SMALL LETTER PHI
      BE |  000003C7 | GREEK SMALL LETTER CHI
      BF |  000003C8 | GREEK SMALL LETTER PSI
      C0 |  0000007B | LEFT CURLY BRACKET
      C1 |  00000041 | LATIN CAPITAL LETTER A
      C2 |  00000042 | LATIN CAPITAL LETTER B
      C3 |  00000043 | LATIN CAPITAL LETTER C
      C4 |  00000044 | LATIN CAPITAL LETTER D
      C5 |  00000045 | LATIN CAPITAL LETTER E
      C6 |  00000046 | LATIN CAPITAL LETTER F
      C7 |  00000047 | LATIN CAPITAL LETTER G
      C8 |  00000048 | LATIN CAPITAL LETTER H
      C9 |  00000049 | LATIN CAPITAL LETTER I
      CA |  000000AD | SOFT HYPHEN
      CB |  000003C9 | GREEK SMALL LETTER OMEGA
      CC |  000003CA | GREEK SMALL LETTER IOTA WITH DIALYTIKA
      CD |  000003CB | GREEK SMALL LETTER UPSILON WITH DIALYTIKA
      CE |  00002018 | LEFT SINGLE QUOTATION MARK
      CF |  00002015 | HORIZONTAL BAR
      D0 |  0000007D | RIGHT CURLY BRACKET
      D1 |  0000004A | LATIN CAPITAL LETTER J
      D2 |  0000004B | LATIN CAPITAL LETTER K
      D3 |  0000004C | LATIN CAPITAL LETTER L
      D4 |  0000004D | LATIN CAPITAL LETTER M
      D5 |  0000004E | LATIN CAPITAL LETTER N
      D6 |  0000004F | LATIN CAPITAL LETTER O
      D7 |  00000050 | LATIN CAPITAL LETTER P
      D8 |  00000051 | LATIN CAPITAL LETTER Q
      D9 |  00000052 | LATIN CAPITAL LETTER R
      DA |  000000B1 | PLUS-MINUS SIGN
      DB |  000000BD | VULGAR FRACTION ONE HALF
      DD |  000000B7 | MIDDLE DOT
      DE |  00002019 | RIGHT SINGLE QUOTATION MARK
      DF |  000000A6 | BROKEN BAR
      E0 |  0000005C | REVERSE SOLIDUS
      E2 |  00000053 | LATIN CAPITAL LETTER S
      E3 |  00000054 | LATIN CAPITAL LETTER T
      E4 |  00000055 | LATIN CAPITAL LETTER U
      E5 |  00000056 | LATIN CAPITAL LETTER V
      E6 |  00000057 | LATIN CAPITAL LETTER W
      E7 |  00000058 | LATIN CAPITAL LETTER X
      E8 |  00000059 | LATIN CAPITAL LETTER Y
      E9 |  0000005A | LATIN CAPITAL LETTER Z
      EA |  000000B2 | SUPERSCRIPT TWO
      EB |  000000A7 | SECTION SIGN
      EE |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
      EF |  000000AC | NOT SIGN
      F0 |  00000030 | DIGIT ZERO
      F1 |  00000031 | DIGIT ONE
      F2 |  00000032 | DIGIT TWO
      F3 |  00000033 | DIGIT THREE
      F4 |  00000034 | DIGIT FOUR
      F5 |  00000035 | DIGIT FIVE
      F6 |  00000036 | DIGIT SIX
      F7 |  00000037 | DIGIT SEVEN
      F8 |  00000038 | DIGIT EIGHT
      F9 |  00000039 | DIGIT NINE
      FA |  000000B3 | SUPERSCRIPT THREE
      FB |  000000A9 | COPYRIGHT SIGN
      FE |  000000BB | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
      FF |  0000009F | APPLICATION PROGRAM COMMAND (APC)
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_IBM875

    $main::fatpacked{"Locale/RecodeData/IBM880.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_IBM880';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for IBM880.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::IBM880;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x009c,
      0x0009,
      0x0086,
      0x007f,
      0x0097,
      0x008d,
      0x008e,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x009d,
      0x0085,
      0x0008,
      0x0087,
      0x0018,
      0x0019,
      0x0092,
      0x008f,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0080,
      0x0081,
      0x0082,
      0x0083,
      0x0084,
      0x000a,
      0x0017,
      0x001b,
      0x0088,
      0x0089,
      0x008a,
      0x008b,
      0x008c,
      0x0005,
      0x0006,
      0x0007,
      0x0090,
      0x0091,
      0x0016,
      0x0093,
      0x0094,
      0x0095,
      0x0096,
      0x0004,
      0x0098,
      0x0099,
      0x009a,
      0x009b,
      0x0014,
      0x0015,
      0x009e,
      0x001a,
      0x0020,
      0xfffd,
      0x0452,
      0x0453,
      0x0451,
      0xfffd,
      0x0455,
      0x0456,
      0x0457,
      0x0458,
      0x005b,
      0x002e,
      0x003c,
      0x0028,
      0x002b,
      0x0021,
      0x0026,
      0x0459,
      0x045a,
      0x045b,
      0x045c,
      0xfffd,
      0x045f,
      0x042a,
      0x2116,
      0x0402,
      0x005d,
      0x0024,
      0x002a,
      0x0029,
      0x003b,
      0x005e,
      0x002d,
      0x002f,
      0x0403,
      0x0401,
      0xfffd,
      0x0405,
      0x0406,
      0x0407,
      0x0408,
      0x0409,
      0x00a6,
      0x002c,
      0x0025,
      0x005f,
      0x003e,
      0x003f,
      0x040a,
      0x040b,
      0x040c,
      0xfffd,
      0xfffd,
      0x040f,
      0x044e,
      0x0430,
      0x0431,
      0xfffd,
      0x003a,
      0x0023,
      0x0040,
      0x0027,
      0x003d,
      0x0022,
      0x0446,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x0434,
      0x0435,
      0x0444,
      0x0433,
      0x0445,
      0x0438,
      0x0439,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x043a,
      0x043b,
      0x043c,
      0x043d,
      0x043e,
      0x043f,
      0x044f,
      0xfffd,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x0440,
      0x0441,
      0x0442,
      0x0443,
      0x0436,
      0x0432,
      0x044c,
      0x044b,
      0x0437,
      0x0448,
      0x044d,
      0x0449,
      0x0447,
      0x044a,
      0x042e,
      0x0410,
      0x0411,
      0x0426,
      0x0414,
      0x0415,
      0x0424,
      0x0413,
      0xfffd,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x0425,
      0x0418,
      0x0419,
      0x041a,
      0x041b,
      0x041c,
      0xfffd,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x041d,
      0x041e,
      0x041f,
      0x042f,
      0x0420,
      0x0421,
      0x005c,
      0x00a4,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x0422,
      0x0423,
      0x0416,
      0x0412,
      0x042c,
      0x042b,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x0417,
      0x0428,
      0x042d,
      0x0429,
      0x0427,
      0x009f,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\xc2\x9c",
      "\x09",
      "\xc2\x86",
      "\x7f",
      "\xc2\x97",
      "\xc2\x8d",
      "\xc2\x8e",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\xc2\x9d",
      "\xc2\x85",
      "\x08",
      "\xc2\x87",
      "\x18",
      "\x19",
      "\xc2\x92",
      "\xc2\x8f",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\xc2\x80",
      "\xc2\x81",
      "\xc2\x82",
      "\xc2\x83",
      "\xc2\x84",
      "\x0a",
      "\x17",
      "\x1b",
      "\xc2\x88",
      "\xc2\x89",
      "\xc2\x8a",
      "\xc2\x8b",
      "\xc2\x8c",
      "\x05",
      "\x06",
      "\x07",
      "\xc2\x90",
      "\xc2\x91",
      "\x16",
      "\xc2\x93",
      "\xc2\x94",
      "\xc2\x95",
      "\xc2\x96",
      "\x04",
      "\xc2\x98",
      "\xc2\x99",
      "\xc2\x9a",
      "\xc2\x9b",
      "\x14",
      "\x15",
      "\xc2\x9e",
      "\x1a",
      "\x20",
      "\xef\xbf\xbd",
      "\xd1\x92",
      "\xd1\x93",
      "\xd1\x91",
      "\xef\xbf\xbd",
      "\xd1\x95",
      "\xd1\x96",
      "\xd1\x97",
      "\xd1\x98",
      "\x5b",
      "\x2e",
      "\x3c",
      "\x28",
      "\x2b",
      "\x21",
      "\x26",
      "\xd1\x99",
      "\xd1\x9a",
      "\xd1\x9b",
      "\xd1\x9c",
      "\xef\xbf\xbd",
      "\xd1\x9f",
      "\xd0\xaa",
      "\xe2\x84\x96",
      "\xd0\x82",
      "\x5d",
      "\x24",
      "\x2a",
      "\x29",
      "\x3b",
      "\x5e",
      "\x2d",
      "\x2f",
      "\xd0\x83",
      "\xd0\x81",
      "\xef\xbf\xbd",
      "\xd0\x85",
      "\xd0\x86",
      "\xd0\x87",
      "\xd0\x88",
      "\xd0\x89",
      "\xc2\xa6",
      "\x2c",
      "\x25",
      "\x5f",
      "\x3e",
      "\x3f",
      "\xd0\x8a",
      "\xd0\x8b",
      "\xd0\x8c",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xd0\x8f",
      "\xd1\x8e",
      "\xd0\xb0",
      "\xd0\xb1",
      "\xef\xbf\xbd",
      "\x3a",
      "\x23",
      "\x40",
      "\x27",
      "\x3d",
      "\x22",
      "\xd1\x86",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\xd0\xb4",
      "\xd0\xb5",
      "\xd1\x84",
      "\xd0\xb3",
      "\xd1\x85",
      "\xd0\xb8",
      "\xd0\xb9",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\xd0\xba",
      "\xd0\xbb",
      "\xd0\xbc",
      "\xd0\xbd",
      "\xd0\xbe",
      "\xd0\xbf",
      "\xd1\x8f",
      "\xef\xbf\xbd",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\xd1\x80",
      "\xd1\x81",
      "\xd1\x82",
      "\xd1\x83",
      "\xd0\xb6",
      "\xd0\xb2",
      "\xd1\x8c",
      "\xd1\x8b",
      "\xd0\xb7",
      "\xd1\x88",
      "\xd1\x8d",
      "\xd1\x89",
      "\xd1\x87",
      "\xd1\x8a",
      "\xd0\xae",
      "\xd0\x90",
      "\xd0\x91",
      "\xd0\xa6",
      "\xd0\x94",
      "\xd0\x95",
      "\xd0\xa4",
      "\xd0\x93",
      "\xef\xbf\xbd",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\xd0\xa5",
      "\xd0\x98",
      "\xd0\x99",
      "\xd0\x9a",
      "\xd0\x9b",
      "\xd0\x9c",
      "\xef\xbf\xbd",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\xd0\x9d",
      "\xd0\x9e",
      "\xd0\x9f",
      "\xd0\xaf",
      "\xd0\xa0",
      "\xd0\xa1",
      "\x5c",
      "\xc2\xa4",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\xd0\xa2",
      "\xd0\xa3",
      "\xd0\x96",
      "\xd0\x92",
      "\xd0\xac",
      "\xd0\xab",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\xd0\x97",
      "\xd0\xa8",
      "\xd0\xad",
      "\xd0\xa9",
      "\xd0\xa7",
      "\xc2\x9f",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x37",
      0x00000005 => "\x2d",
      0x00000006 => "\x2e",
      0x00000007 => "\x2f",
      0x00000008 => "\x16",
      0x00000009 => "\x05",
      0x0000000a => "\x25",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x3c",
      0x00000015 => "\x3d",
      0x00000016 => "\x32",
      0x00000017 => "\x26",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x3f",
      0x0000001b => "\x27",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x40",
      0x00000021 => "\x4f",
      0x00000022 => "\x7f",
      0x00000023 => "\x7b",
      0x00000024 => "\x5b",
      0x00000025 => "\x6c",
      0x00000026 => "\x50",
      0x00000027 => "\x7d",
      0x00000028 => "\x4d",
      0x00000029 => "\x5d",
      0x0000002a => "\x5c",
      0x0000002b => "\x4e",
      0x0000002c => "\x6b",
      0x0000002d => "\x60",
      0x0000002e => "\x4b",
      0x0000002f => "\x61",
      0x00000030 => "\xf0",
      0x00000031 => "\xf1",
      0x00000032 => "\xf2",
      0x00000033 => "\xf3",
      0x00000034 => "\xf4",
      0x00000035 => "\xf5",
      0x00000036 => "\xf6",
      0x00000037 => "\xf7",
      0x00000038 => "\xf8",
      0x00000039 => "\xf9",
      0x0000003a => "\x7a",
      0x0000003b => "\x5e",
      0x0000003c => "\x4c",
      0x0000003d => "\x7e",
      0x0000003e => "\x6e",
      0x0000003f => "\x6f",
      0x00000040 => "\x7c",
      0x00000041 => "\xc1",
      0x00000042 => "\xc2",
      0x00000043 => "\xc3",
      0x00000044 => "\xc4",
      0x00000045 => "\xc5",
      0x00000046 => "\xc6",
      0x00000047 => "\xc7",
      0x00000048 => "\xc8",
      0x00000049 => "\xc9",
      0x0000004a => "\xd1",
      0x0000004b => "\xd2",
      0x0000004c => "\xd3",
      0x0000004d => "\xd4",
      0x0000004e => "\xd5",
      0x0000004f => "\xd6",
      0x00000050 => "\xd7",
      0x00000051 => "\xd8",
      0x00000052 => "\xd9",
      0x00000053 => "\xe2",
      0x00000054 => "\xe3",
      0x00000055 => "\xe4",
      0x00000056 => "\xe5",
      0x00000057 => "\xe6",
      0x00000058 => "\xe7",
      0x00000059 => "\xe8",
      0x0000005a => "\xe9",
      0x0000005b => "\x4a",
      0x0000005c => "\xe0",
      0x0000005d => "\x5a",
      0x0000005e => "\x5f",
      0x0000005f => "\x6d",
      0x00000061 => "\x81",
      0x00000062 => "\x82",
      0x00000063 => "\x83",
      0x00000064 => "\x84",
      0x00000065 => "\x85",
      0x00000066 => "\x86",
      0x00000067 => "\x87",
      0x00000068 => "\x88",
      0x00000069 => "\x89",
      0x0000006a => "\x91",
      0x0000006b => "\x92",
      0x0000006c => "\x93",
      0x0000006d => "\x94",
      0x0000006e => "\x95",
      0x0000006f => "\x96",
      0x00000070 => "\x97",
      0x00000071 => "\x98",
      0x00000072 => "\x99",
      0x00000073 => "\xa2",
      0x00000074 => "\xa3",
      0x00000075 => "\xa4",
      0x00000076 => "\xa5",
      0x00000077 => "\xa6",
      0x00000078 => "\xa7",
      0x00000079 => "\xa8",
      0x0000007a => "\xa9",
      0x0000007f => "\x07",
      0x00000080 => "\x20",
      0x00000081 => "\x21",
      0x00000082 => "\x22",
      0x00000083 => "\x23",
      0x00000084 => "\x24",
      0x00000085 => "\x15",
      0x00000086 => "\x06",
      0x00000087 => "\x17",
      0x00000088 => "\x28",
      0x00000089 => "\x29",
      0x0000008a => "\x2a",
      0x0000008b => "\x2b",
      0x0000008c => "\x2c",
      0x0000008d => "\x09",
      0x0000008e => "\x0a",
      0x0000008f => "\x1b",
      0x00000090 => "\x30",
      0x00000091 => "\x31",
      0x00000092 => "\x1a",
      0x00000093 => "\x33",
      0x00000094 => "\x34",
      0x00000095 => "\x35",
      0x00000096 => "\x36",
      0x00000097 => "\x08",
      0x00000098 => "\x38",
      0x00000099 => "\x39",
      0x0000009a => "\x3a",
      0x0000009b => "\x3b",
      0x0000009c => "\x04",
      0x0000009d => "\x14",
      0x0000009e => "\x3e",
      0x0000009f => "\xff",
      0x000000a4 => "\xe1",
      0x000000a6 => "\x6a",
      0x00000401 => "\x63",
      0x00000402 => "\x59",
      0x00000403 => "\x62",
      0x00000405 => "\x65",
      0x00000406 => "\x66",
      0x00000407 => "\x67",
      0x00000408 => "\x68",
      0x00000409 => "\x69",
      0x0000040a => "\x70",
      0x0000040b => "\x71",
      0x0000040c => "\x72",
      0x0000040f => "\x75",
      0x00000410 => "\xb9",
      0x00000411 => "\xba",
      0x00000412 => "\xed",
      0x00000413 => "\xbf",
      0x00000414 => "\xbc",
      0x00000415 => "\xbd",
      0x00000416 => "\xec",
      0x00000417 => "\xfa",
      0x00000418 => "\xcb",
      0x00000419 => "\xcc",
      0x0000041a => "\xcd",
      0x0000041b => "\xce",
      0x0000041c => "\xcf",
      0x0000041d => "\xda",
      0x0000041e => "\xdb",
      0x0000041f => "\xdc",
      0x00000420 => "\xde",
      0x00000421 => "\xdf",
      0x00000422 => "\xea",
      0x00000423 => "\xeb",
      0x00000424 => "\xbe",
      0x00000425 => "\xca",
      0x00000426 => "\xbb",
      0x00000427 => "\xfe",
      0x00000428 => "\xfb",
      0x00000429 => "\xfd",
      0x0000042a => "\x57",
      0x0000042b => "\xef",
      0x0000042c => "\xee",
      0x0000042d => "\xfc",
      0x0000042e => "\xb8",
      0x0000042f => "\xdd",
      0x00000430 => "\x77",
      0x00000431 => "\x78",
      0x00000432 => "\xaf",
      0x00000433 => "\x8d",
      0x00000434 => "\x8a",
      0x00000435 => "\x8b",
      0x00000436 => "\xae",
      0x00000437 => "\xb2",
      0x00000438 => "\x8f",
      0x00000439 => "\x90",
      0x0000043a => "\x9a",
      0x0000043b => "\x9b",
      0x0000043c => "\x9c",
      0x0000043d => "\x9d",
      0x0000043e => "\x9e",
      0x0000043f => "\x9f",
      0x00000440 => "\xaa",
      0x00000441 => "\xab",
      0x00000442 => "\xac",
      0x00000443 => "\xad",
      0x00000444 => "\x8c",
      0x00000445 => "\x8e",
      0x00000446 => "\x80",
      0x00000447 => "\xb6",
      0x00000448 => "\xb3",
      0x00000449 => "\xb5",
      0x0000044a => "\xb7",
      0x0000044b => "\xb1",
      0x0000044c => "\xb0",
      0x0000044d => "\xb4",
      0x0000044e => "\x76",
      0x0000044f => "\xa0",
      0x00000451 => "\x44",
      0x00000452 => "\x42",
      0x00000453 => "\x43",
      0x00000455 => "\x46",
      0x00000456 => "\x47",
      0x00000457 => "\x48",
      0x00000458 => "\x49",
      0x00000459 => "\x51",
      0x0000045a => "\x52",
      0x0000045b => "\x53",
      0x0000045c => "\x54",
      0x0000045f => "\x56",
      0x00002116 => "\x58",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x6f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::IBM880 - Conversion routines for IBM880
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for IBM880.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: IBM NLS RM Vol2 SE09-8002-01, March 1990
   alias CP880
   alias EBCDIC-CYRILLIC
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  0000009C | STRING TERMINATOR (ST)
      05 |  00000009 | CHARACTER TABULATION (HT)
      06 |  00000086 | START OF SELECTED AREA (SSA)
      07 |  0000007F | DELETE (DEL)
      08 |  00000097 | END OF GUARDED AREA (EPA)
      09 |  0000008D | REVERSE LINE FEED (RI)
      0A |  0000008E | SINGLE-SHIFT TWO (SS2)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  0000009D | OPERATING SYSTEM COMMAND (OSC)
      15 |  00000085 | NEXT LINE (NEL)
      16 |  00000008 | BACKSPACE (BS)
      17 |  00000087 | END OF SELECTED AREA (ESA)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  00000092 | PRIVATE USE TWO (PU2)
      1B |  0000008F | SINGLE-SHIFT THREE (SS3)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000080 | PADDING CHARACTER (PAD)
      21 |  00000081 | HIGH OCTET PRESET (HOP)
      22 |  00000082 | BREAK PERMITTED HERE (BPH)
      23 |  00000083 | NO BREAK HERE (NBH)
      24 |  00000084 | INDEX (IND)
      25 |  0000000A | LINE FEED (LF)
      26 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      27 |  0000001B | ESCAPE (ESC)
      28 |  00000088 | CHARACTER TABULATION SET (HTS)
      29 |  00000089 | CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
      2A |  0000008A | LINE TABULATION SET (VTS)
      2B |  0000008B | PARTIAL LINE FORWARD (PLD)
      2C |  0000008C | PARTIAL LINE BACKWARD (PLU)
      2D |  00000005 | ENQUIRY (ENQ)
      2E |  00000006 | ACKNOWLEDGE (ACK)
      2F |  00000007 | BELL (BEL)
      30 |  00000090 | DEVICE CONTROL STRING (DCS)
      31 |  00000091 | PRIVATE USE ONE (PU1)
      32 |  00000016 | SYNCHRONOUS IDLE (SYN)
      33 |  00000093 | SET TRANSMIT STATE (STS)
      34 |  00000094 | CANCEL CHARACTER (CCH)
      35 |  00000095 | MESSAGE WAITING (MW)
      36 |  00000096 | START OF GUARDED AREA (SPA)
      37 |  00000004 | END OF TRANSMISSION (EOT)
      38 |  00000098 | START OF STRING (SOS)
      39 |  00000099 | SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
      3A |  0000009A | SINGLE CHARACTER INTRODUCER (SCI)
      3B |  0000009B | CONTROL SEQUENCE INTRODUCER (CSI)
      3C |  00000014 | DEVICE CONTROL FOUR (DC4)
      3D |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      3E |  0000009E | PRIVACY MESSAGE (PM)
      3F |  0000001A | SUBSTITUTE (SUB)
      40 |  00000020 | SPACE
      42 |  00000452 | CYRILLIC SMALL LETTER DJE (Serbocroatian)
      43 |  00000453 | CYRILLIC SMALL LETTER GJE
      44 |  00000451 | CYRILLIC SMALL LETTER IO
      46 |  00000455 | CYRILLIC SMALL LETTER DZE
      47 |  00000456 | CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
      48 |  00000457 | CYRILLIC SMALL LETTER YI (Ukrainian)
      49 |  00000458 | CYRILLIC SMALL LETTER JE
      4A |  0000005B | LEFT SQUARE BRACKET
      4B |  0000002E | FULL STOP
      4C |  0000003C | LESS-THAN SIGN
      4D |  00000028 | LEFT PARENTHESIS
      4E |  0000002B | PLUS SIGN
      4F |  00000021 | EXCLAMATION MARK
      50 |  00000026 | AMPERSAND
      51 |  00000459 | CYRILLIC SMALL LETTER LJE
      52 |  0000045A | CYRILLIC SMALL LETTER NJE
      53 |  0000045B | CYRILLIC SMALL LETTER TSHE (Serbocroatian)
      54 |  0000045C | CYRILLIC SMALL LETTER KJE
      56 |  0000045F | CYRILLIC SMALL LETTER DZHE
      57 |  0000042A | CYRILLIC CAPITAL LETTER HARD SIGN
      58 |  00002116 | NUMERO SIGN
      59 |  00000402 | CYRILLIC CAPITAL LETTER DJE (Serbocroatian)
      5A |  0000005D | RIGHT SQUARE BRACKET
      5B |  00000024 | DOLLAR SIGN
      5C |  0000002A | ASTERISK
      5D |  00000029 | RIGHT PARENTHESIS
      5E |  0000003B | SEMICOLON
      5F |  0000005E | CIRCUMFLEX ACCENT
      60 |  0000002D | HYPHEN-MINUS
      61 |  0000002F | SOLIDUS
      62 |  00000403 | CYRILLIC CAPITAL LETTER GJE
      63 |  00000401 | CYRILLIC CAPITAL LETTER IO
      65 |  00000405 | CYRILLIC CAPITAL LETTER DZE
      66 |  00000406 | CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
      67 |  00000407 | CYRILLIC CAPITAL LETTER YI (Ukrainian)
      68 |  00000408 | CYRILLIC CAPITAL LETTER JE
      69 |  00000409 | CYRILLIC CAPITAL LETTER LJE
      6A |  000000A6 | BROKEN BAR
      6B |  0000002C | COMMA
      6C |  00000025 | PERCENT SIGN
      6D |  0000005F | LOW LINE
      6E |  0000003E | GREATER-THAN SIGN
      6F |  0000003F | QUESTION MARK
      70 |  0000040A | CYRILLIC CAPITAL LETTER NJE
      71 |  0000040B | CYRILLIC CAPITAL LETTER TSHE (Serbocroatian)
      72 |  0000040C | CYRILLIC CAPITAL LETTER KJE
      75 |  0000040F | CYRILLIC CAPITAL LETTER DZHE
      76 |  0000044E | CYRILLIC SMALL LETTER YU
      77 |  00000430 | CYRILLIC SMALL LETTER A
      78 |  00000431 | CYRILLIC SMALL LETTER BE
      7A |  0000003A | COLON
      7B |  00000023 | NUMBER SIGN
      7C |  00000040 | COMMERCIAL AT
      7D |  00000027 | APOSTROPHE
      7E |  0000003D | EQUALS SIGN
      7F |  00000022 | QUOTATION MARK
      80 |  00000446 | CYRILLIC SMALL LETTER TSE
      81 |  00000061 | LATIN SMALL LETTER A
      82 |  00000062 | LATIN SMALL LETTER B
      83 |  00000063 | LATIN SMALL LETTER C
      84 |  00000064 | LATIN SMALL LETTER D
      85 |  00000065 | LATIN SMALL LETTER E
      86 |  00000066 | LATIN SMALL LETTER F
      87 |  00000067 | LATIN SMALL LETTER G
      88 |  00000068 | LATIN SMALL LETTER H
      89 |  00000069 | LATIN SMALL LETTER I
      8A |  00000434 | CYRILLIC SMALL LETTER DE
      8B |  00000435 | CYRILLIC SMALL LETTER IE
      8C |  00000444 | CYRILLIC SMALL LETTER EF
      8D |  00000433 | CYRILLIC SMALL LETTER GHE
      8E |  00000445 | CYRILLIC SMALL LETTER HA
      8F |  00000438 | CYRILLIC SMALL LETTER I
      90 |  00000439 | CYRILLIC SMALL LETTER SHORT I
      91 |  0000006A | LATIN SMALL LETTER J
      92 |  0000006B | LATIN SMALL LETTER K
      93 |  0000006C | LATIN SMALL LETTER L
      94 |  0000006D | LATIN SMALL LETTER M
      95 |  0000006E | LATIN SMALL LETTER N
      96 |  0000006F | LATIN SMALL LETTER O
      97 |  00000070 | LATIN SMALL LETTER P
      98 |  00000071 | LATIN SMALL LETTER Q
      99 |  00000072 | LATIN SMALL LETTER R
      9A |  0000043A | CYRILLIC SMALL LETTER KA
      9B |  0000043B | CYRILLIC SMALL LETTER EL
      9C |  0000043C | CYRILLIC SMALL LETTER EM
      9D |  0000043D | CYRILLIC SMALL LETTER EN
      9E |  0000043E | CYRILLIC SMALL LETTER O
      9F |  0000043F | CYRILLIC SMALL LETTER PE
      A0 |  0000044F | CYRILLIC SMALL LETTER YA
      A2 |  00000073 | LATIN SMALL LETTER S
      A3 |  00000074 | LATIN SMALL LETTER T
      A4 |  00000075 | LATIN SMALL LETTER U
      A5 |  00000076 | LATIN SMALL LETTER V
      A6 |  00000077 | LATIN SMALL LETTER W
      A7 |  00000078 | LATIN SMALL LETTER X
      A8 |  00000079 | LATIN SMALL LETTER Y
      A9 |  0000007A | LATIN SMALL LETTER Z
      AA |  00000440 | CYRILLIC SMALL LETTER ER
      AB |  00000441 | CYRILLIC SMALL LETTER ES
      AC |  00000442 | CYRILLIC SMALL LETTER TE
      AD |  00000443 | CYRILLIC SMALL LETTER U
      AE |  00000436 | CYRILLIC SMALL LETTER ZHE
      AF |  00000432 | CYRILLIC SMALL LETTER VE
      B0 |  0000044C | CYRILLIC SMALL LETTER SOFT SIGN
      B1 |  0000044B | CYRILLIC SMALL LETTER YERU
      B2 |  00000437 | CYRILLIC SMALL LETTER ZE
      B3 |  00000448 | CYRILLIC SMALL LETTER SHA
      B4 |  0000044D | CYRILLIC SMALL LETTER E
      B5 |  00000449 | CYRILLIC SMALL LETTER SHCHA
      B6 |  00000447 | CYRILLIC SMALL LETTER CHE
      B7 |  0000044A | CYRILLIC SMALL LETTER HARD SIGN
      B8 |  0000042E | CYRILLIC CAPITAL LETTER YU
      B9 |  00000410 | CYRILLIC CAPITAL LETTER A
      BA |  00000411 | CYRILLIC CAPITAL LETTER BE
      BB |  00000426 | CYRILLIC CAPITAL LETTER TSE
      BC |  00000414 | CYRILLIC CAPITAL LETTER DE
      BD |  00000415 | CYRILLIC CAPITAL LETTER IE
      BE |  00000424 | CYRILLIC CAPITAL LETTER EF
      BF |  00000413 | CYRILLIC CAPITAL LETTER GHE
      C1 |  00000041 | LATIN CAPITAL LETTER A
      C2 |  00000042 | LATIN CAPITAL LETTER B
      C3 |  00000043 | LATIN CAPITAL LETTER C
      C4 |  00000044 | LATIN CAPITAL LETTER D
      C5 |  00000045 | LATIN CAPITAL LETTER E
      C6 |  00000046 | LATIN CAPITAL LETTER F
      C7 |  00000047 | LATIN CAPITAL LETTER G
      C8 |  00000048 | LATIN CAPITAL LETTER H
      C9 |  00000049 | LATIN CAPITAL LETTER I
      CA |  00000425 | CYRILLIC CAPITAL LETTER HA
      CB |  00000418 | CYRILLIC CAPITAL LETTER I
      CC |  00000419 | CYRILLIC CAPITAL LETTER SHORT I
      CD |  0000041A | CYRILLIC CAPITAL LETTER KA
      CE |  0000041B | CYRILLIC CAPITAL LETTER EL
      CF |  0000041C | CYRILLIC CAPITAL LETTER EM
      D1 |  0000004A | LATIN CAPITAL LETTER J
      D2 |  0000004B | LATIN CAPITAL LETTER K
      D3 |  0000004C | LATIN CAPITAL LETTER L
      D4 |  0000004D | LATIN CAPITAL LETTER M
      D5 |  0000004E | LATIN CAPITAL LETTER N
      D6 |  0000004F | LATIN CAPITAL LETTER O
      D7 |  00000050 | LATIN CAPITAL LETTER P
      D8 |  00000051 | LATIN CAPITAL LETTER Q
      D9 |  00000052 | LATIN CAPITAL LETTER R
      DA |  0000041D | CYRILLIC CAPITAL LETTER EN
      DB |  0000041E | CYRILLIC CAPITAL LETTER O
      DC |  0000041F | CYRILLIC CAPITAL LETTER PE
      DD |  0000042F | CYRILLIC CAPITAL LETTER YA
      DE |  00000420 | CYRILLIC CAPITAL LETTER ER
      DF |  00000421 | CYRILLIC CAPITAL LETTER ES
      E0 |  0000005C | REVERSE SOLIDUS
      E1 |  000000A4 | CURRENCY SIGN
      E2 |  00000053 | LATIN CAPITAL LETTER S
      E3 |  00000054 | LATIN CAPITAL LETTER T
      E4 |  00000055 | LATIN CAPITAL LETTER U
      E5 |  00000056 | LATIN CAPITAL LETTER V
      E6 |  00000057 | LATIN CAPITAL LETTER W
      E7 |  00000058 | LATIN CAPITAL LETTER X
      E8 |  00000059 | LATIN CAPITAL LETTER Y
      E9 |  0000005A | LATIN CAPITAL LETTER Z
      EA |  00000422 | CYRILLIC CAPITAL LETTER TE
      EB |  00000423 | CYRILLIC CAPITAL LETTER U
      EC |  00000416 | CYRILLIC CAPITAL LETTER ZHE
      ED |  00000412 | CYRILLIC CAPITAL LETTER VE
      EE |  0000042C | CYRILLIC CAPITAL LETTER SOFT SIGN
      EF |  0000042B | CYRILLIC CAPITAL LETTER YERU
      F0 |  00000030 | DIGIT ZERO
      F1 |  00000031 | DIGIT ONE
      F2 |  00000032 | DIGIT TWO
      F3 |  00000033 | DIGIT THREE
      F4 |  00000034 | DIGIT FOUR
      F5 |  00000035 | DIGIT FIVE
      F6 |  00000036 | DIGIT SIX
      F7 |  00000037 | DIGIT SEVEN
      F8 |  00000038 | DIGIT EIGHT
      F9 |  00000039 | DIGIT NINE
      FA |  00000417 | CYRILLIC CAPITAL LETTER ZE
      FB |  00000428 | CYRILLIC CAPITAL LETTER SHA
      FC |  0000042D | CYRILLIC CAPITAL LETTER E
      FD |  00000429 | CYRILLIC CAPITAL LETTER SHCHA
      FE |  00000427 | CYRILLIC CAPITAL LETTER CHE
      FF |  0000009F | APPLICATION PROGRAM COMMAND (APC)
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_IBM880

    $main::fatpacked{"Locale/RecodeData/IBM891.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_IBM891';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for IBM891.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::IBM891;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::IBM891 - Conversion routines for IBM891
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for IBM891.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: IBM NLS RM Vol2 SE09-8002-01, March 1990
   alias CP891
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE (DEL)
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_IBM891

    $main::fatpacked{"Locale/RecodeData/IBM903.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_IBM903';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for IBM903.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::IBM903;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::IBM903 - Conversion routines for IBM903
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for IBM903.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: IBM NLS RM Vol2 SE09-8002-01, March 1990
   alias CP903
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE (DEL)
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_IBM903

    $main::fatpacked{"Locale/RecodeData/IBM904.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_IBM904';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for IBM904.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::IBM904;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0x00a2,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00ac,
      0x00a6,
      0xfffd,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xc2\xa2",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc2\xac",
      "\xc2\xa6",
      "\xef\xbf\xbd",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x000000a2 => "\x80",
      0x000000a6 => "\xfe",
      0x000000ac => "\xfd",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::IBM904 - Conversion routines for IBM904
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for IBM904.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: IBM NLS RM Vol2 SE09-8002-01, March 1990
   alias CP904
   alias 904
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE (DEL)
      80 |  000000A2 | CENT SIGN
      FD |  000000AC | NOT SIGN
      FE |  000000A6 | BROKEN BAR
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_IBM904

    $main::fatpacked{"Locale/RecodeData/IBM905.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_IBM905';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for IBM905.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::IBM905;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x009c,
      0x0009,
      0x0086,
      0x007f,
      0x0097,
      0x008d,
      0x008e,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x009d,
      0x0085,
      0x0008,
      0x0087,
      0x0018,
      0x0019,
      0x0092,
      0x008f,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0080,
      0x0081,
      0x0082,
      0x0083,
      0x0084,
      0x000a,
      0x0017,
      0x001b,
      0x0088,
      0x0089,
      0x008a,
      0x008b,
      0x008c,
      0x0005,
      0x0006,
      0x0007,
      0x0090,
      0x0091,
      0x0016,
      0x0093,
      0x0094,
      0x0095,
      0x0096,
      0x0004,
      0x0098,
      0x0099,
      0x009a,
      0x009b,
      0x0014,
      0x0015,
      0x009e,
      0x001a,
      0x0020,
      0xfffd,
      0x00e2,
      0x00e4,
      0x00e0,
      0x00e1,
      0xfffd,
      0x010b,
      0x007b,
      0x00f1,
      0x00c7,
      0x002e,
      0x003c,
      0x0028,
      0x002b,
      0x0021,
      0x0026,
      0x00e9,
      0x00ea,
      0x00eb,
      0x00e8,
      0x00ed,
      0x00ee,
      0x00ef,
      0x00ec,
      0x00df,
      0x011e,
      0x0130,
      0x002a,
      0x0029,
      0x003b,
      0x005e,
      0x002d,
      0x002f,
      0x00c2,
      0x00c4,
      0x00c0,
      0x00c1,
      0xfffd,
      0x010a,
      0x005b,
      0x00d1,
      0x015f,
      0x002c,
      0x0025,
      0x005f,
      0x003e,
      0x003f,
      0xfffd,
      0x00c9,
      0x00ca,
      0x00cb,
      0x00c8,
      0x00cd,
      0x00ce,
      0x00cf,
      0x00cc,
      0x0131,
      0x003a,
      0x00d6,
      0x015e,
      0x0027,
      0x003d,
      0x00dc,
      0x02d8,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x0127,
      0x0109,
      0x015d,
      0x016d,
      0xfffd,
      0x007c,
      0x00b0,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0125,
      0x011d,
      0x0135,
      0x02db,
      0xfffd,
      0x00a4,
      0x00b5,
      0x00f6,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x0126,
      0x0108,
      0x015c,
      0x016c,
      0xfffd,
      0x0040,
      0x00b7,
      0x00a3,
      0x017c,
      0x007d,
      0x017b,
      0x00a7,
      0x005d,
      0xfffd,
      0x00bd,
      0x0024,
      0x0124,
      0x011c,
      0x0134,
      0x00a8,
      0x00b4,
      0x00d7,
      0x00e7,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x00ad,
      0x00f4,
      0x007e,
      0x00f2,
      0x00f3,
      0x0121,
      0x011f,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0060,
      0x00fb,
      0x005c,
      0x00f9,
      0x00fa,
      0xfffd,
      0x00fc,
      0x00f7,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x00b2,
      0x00d4,
      0x0023,
      0x00d2,
      0x00d3,
      0x0120,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x00b3,
      0x00db,
      0x0022,
      0x00d9,
      0x00da,
      0x009f,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\xc2\x9c",
      "\x09",
      "\xc2\x86",
      "\x7f",
      "\xc2\x97",
      "\xc2\x8d",
      "\xc2\x8e",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\xc2\x9d",
      "\xc2\x85",
      "\x08",
      "\xc2\x87",
      "\x18",
      "\x19",
      "\xc2\x92",
      "\xc2\x8f",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\xc2\x80",
      "\xc2\x81",
      "\xc2\x82",
      "\xc2\x83",
      "\xc2\x84",
      "\x0a",
      "\x17",
      "\x1b",
      "\xc2\x88",
      "\xc2\x89",
      "\xc2\x8a",
      "\xc2\x8b",
      "\xc2\x8c",
      "\x05",
      "\x06",
      "\x07",
      "\xc2\x90",
      "\xc2\x91",
      "\x16",
      "\xc2\x93",
      "\xc2\x94",
      "\xc2\x95",
      "\xc2\x96",
      "\x04",
      "\xc2\x98",
      "\xc2\x99",
      "\xc2\x9a",
      "\xc2\x9b",
      "\x14",
      "\x15",
      "\xc2\x9e",
      "\x1a",
      "\x20",
      "\xef\xbf\xbd",
      "\xc3\xa2",
      "\xc3\xa4",
      "\xc3\xa0",
      "\xc3\xa1",
      "\xef\xbf\xbd",
      "\xc4\x8b",
      "\x7b",
      "\xc3\xb1",
      "\xc3\x87",
      "\x2e",
      "\x3c",
      "\x28",
      "\x2b",
      "\x21",
      "\x26",
      "\xc3\xa9",
      "\xc3\xaa",
      "\xc3\xab",
      "\xc3\xa8",
      "\xc3\xad",
      "\xc3\xae",
      "\xc3\xaf",
      "\xc3\xac",
      "\xc3\x9f",
      "\xc4\x9e",
      "\xc4\xb0",
      "\x2a",
      "\x29",
      "\x3b",
      "\x5e",
      "\x2d",
      "\x2f",
      "\xc3\x82",
      "\xc3\x84",
      "\xc3\x80",
      "\xc3\x81",
      "\xef\xbf\xbd",
      "\xc4\x8a",
      "\x5b",
      "\xc3\x91",
      "\xc5\x9f",
      "\x2c",
      "\x25",
      "\x5f",
      "\x3e",
      "\x3f",
      "\xef\xbf\xbd",
      "\xc3\x89",
      "\xc3\x8a",
      "\xc3\x8b",
      "\xc3\x88",
      "\xc3\x8d",
      "\xc3\x8e",
      "\xc3\x8f",
      "\xc3\x8c",
      "\xc4\xb1",
      "\x3a",
      "\xc3\x96",
      "\xc5\x9e",
      "\x27",
      "\x3d",
      "\xc3\x9c",
      "\xcb\x98",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\xc4\xa7",
      "\xc4\x89",
      "\xc5\x9d",
      "\xc5\xad",
      "\xef\xbf\xbd",
      "\x7c",
      "\xc2\xb0",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\xc4\xa5",
      "\xc4\x9d",
      "\xc4\xb5",
      "\xcb\x9b",
      "\xef\xbf\xbd",
      "\xc2\xa4",
      "\xc2\xb5",
      "\xc3\xb6",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\xc4\xa6",
      "\xc4\x88",
      "\xc5\x9c",
      "\xc5\xac",
      "\xef\xbf\xbd",
      "\x40",
      "\xc2\xb7",
      "\xc2\xa3",
      "\xc5\xbc",
      "\x7d",
      "\xc5\xbb",
      "\xc2\xa7",
      "\x5d",
      "\xef\xbf\xbd",
      "\xc2\xbd",
      "\x24",
      "\xc4\xa4",
      "\xc4\x9c",
      "\xc4\xb4",
      "\xc2\xa8",
      "\xc2\xb4",
      "\xc3\x97",
      "\xc3\xa7",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\xc2\xad",
      "\xc3\xb4",
      "\x7e",
      "\xc3\xb2",
      "\xc3\xb3",
      "\xc4\xa1",
      "\xc4\x9f",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x60",
      "\xc3\xbb",
      "\x5c",
      "\xc3\xb9",
      "\xc3\xba",
      "\xef\xbf\xbd",
      "\xc3\xbc",
      "\xc3\xb7",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\xc2\xb2",
      "\xc3\x94",
      "\x23",
      "\xc3\x92",
      "\xc3\x93",
      "\xc4\xa0",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\xc2\xb3",
      "\xc3\x9b",
      "\x22",
      "\xc3\x99",
      "\xc3\x9a",
      "\xc2\x9f",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x37",
      0x00000005 => "\x2d",
      0x00000006 => "\x2e",
      0x00000007 => "\x2f",
      0x00000008 => "\x16",
      0x00000009 => "\x05",
      0x0000000a => "\x25",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x3c",
      0x00000015 => "\x3d",
      0x00000016 => "\x32",
      0x00000017 => "\x26",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x3f",
      0x0000001b => "\x27",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x40",
      0x00000021 => "\x4f",
      0x00000022 => "\xfc",
      0x00000023 => "\xec",
      0x00000024 => "\xb9",
      0x00000025 => "\x6c",
      0x00000026 => "\x50",
      0x00000027 => "\x7d",
      0x00000028 => "\x4d",
      0x00000029 => "\x5d",
      0x0000002a => "\x5c",
      0x0000002b => "\x4e",
      0x0000002c => "\x6b",
      0x0000002d => "\x60",
      0x0000002e => "\x4b",
      0x0000002f => "\x61",
      0x00000030 => "\xf0",
      0x00000031 => "\xf1",
      0x00000032 => "\xf2",
      0x00000033 => "\xf3",
      0x00000034 => "\xf4",
      0x00000035 => "\xf5",
      0x00000036 => "\xf6",
      0x00000037 => "\xf7",
      0x00000038 => "\xf8",
      0x00000039 => "\xf9",
      0x0000003a => "\x7a",
      0x0000003b => "\x5e",
      0x0000003c => "\x4c",
      0x0000003d => "\x7e",
      0x0000003e => "\x6e",
      0x0000003f => "\x6f",
      0x00000040 => "\xaf",
      0x00000041 => "\xc1",
      0x00000042 => "\xc2",
      0x00000043 => "\xc3",
      0x00000044 => "\xc4",
      0x00000045 => "\xc5",
      0x00000046 => "\xc6",
      0x00000047 => "\xc7",
      0x00000048 => "\xc8",
      0x00000049 => "\xc9",
      0x0000004a => "\xd1",
      0x0000004b => "\xd2",
      0x0000004c => "\xd3",
      0x0000004d => "\xd4",
      0x0000004e => "\xd5",
      0x0000004f => "\xd6",
      0x00000050 => "\xd7",
      0x00000051 => "\xd8",
      0x00000052 => "\xd9",
      0x00000053 => "\xe2",
      0x00000054 => "\xe3",
      0x00000055 => "\xe4",
      0x00000056 => "\xe5",
      0x00000057 => "\xe6",
      0x00000058 => "\xe7",
      0x00000059 => "\xe8",
      0x0000005a => "\xe9",
      0x0000005b => "\x68",
      0x0000005c => "\xdc",
      0x0000005d => "\xb6",
      0x0000005e => "\x5f",
      0x0000005f => "\x6d",
      0x00000060 => "\xda",
      0x00000061 => "\x81",
      0x00000062 => "\x82",
      0x00000063 => "\x83",
      0x00000064 => "\x84",
      0x00000065 => "\x85",
      0x00000066 => "\x86",
      0x00000067 => "\x87",
      0x00000068 => "\x88",
      0x00000069 => "\x89",
      0x0000006a => "\x91",
      0x0000006b => "\x92",
      0x0000006c => "\x93",
      0x0000006d => "\x94",
      0x0000006e => "\x95",
      0x0000006f => "\x96",
      0x00000070 => "\x97",
      0x00000071 => "\x98",
      0x00000072 => "\x99",
      0x00000073 => "\xa2",
      0x00000074 => "\xa3",
      0x00000075 => "\xa4",
      0x00000076 => "\xa5",
      0x00000077 => "\xa6",
      0x00000078 => "\xa7",
      0x00000079 => "\xa8",
      0x0000007a => "\xa9",
      0x0000007b => "\x48",
      0x0000007c => "\x8f",
      0x0000007d => "\xb3",
      0x0000007e => "\xcc",
      0x0000007f => "\x07",
      0x00000080 => "\x20",
      0x00000081 => "\x21",
      0x00000082 => "\x22",
      0x00000083 => "\x23",
      0x00000084 => "\x24",
      0x00000085 => "\x15",
      0x00000086 => "\x06",
      0x00000087 => "\x17",
      0x00000088 => "\x28",
      0x00000089 => "\x29",
      0x0000008a => "\x2a",
      0x0000008b => "\x2b",
      0x0000008c => "\x2c",
      0x0000008d => "\x09",
      0x0000008e => "\x0a",
      0x0000008f => "\x1b",
      0x00000090 => "\x30",
      0x00000091 => "\x31",
      0x00000092 => "\x1a",
      0x00000093 => "\x33",
      0x00000094 => "\x34",
      0x00000095 => "\x35",
      0x00000096 => "\x36",
      0x00000097 => "\x08",
      0x00000098 => "\x38",
      0x00000099 => "\x39",
      0x0000009a => "\x3a",
      0x0000009b => "\x3b",
      0x0000009c => "\x04",
      0x0000009d => "\x14",
      0x0000009e => "\x3e",
      0x0000009f => "\xff",
      0x000000a3 => "\xb1",
      0x000000a4 => "\x9f",
      0x000000a7 => "\xb5",
      0x000000a8 => "\xbd",
      0x000000ad => "\xca",
      0x000000b0 => "\x90",
      0x000000b2 => "\xea",
      0x000000b3 => "\xfa",
      0x000000b4 => "\xbe",
      0x000000b5 => "\xa0",
      0x000000b7 => "\xb0",
      0x000000bd => "\xb8",
      0x000000c0 => "\x64",
      0x000000c1 => "\x65",
      0x000000c2 => "\x62",
      0x000000c4 => "\x63",
      0x000000c7 => "\x4a",
      0x000000c8 => "\x74",
      0x000000c9 => "\x71",
      0x000000ca => "\x72",
      0x000000cb => "\x73",
      0x000000cc => "\x78",
      0x000000cd => "\x75",
      0x000000ce => "\x76",
      0x000000cf => "\x77",
      0x000000d1 => "\x69",
      0x000000d2 => "\xed",
      0x000000d3 => "\xee",
      0x000000d4 => "\xeb",
      0x000000d6 => "\x7b",
      0x000000d7 => "\xbf",
      0x000000d9 => "\xfd",
      0x000000da => "\xfe",
      0x000000db => "\xfb",
      0x000000dc => "\x7f",
      0x000000df => "\x59",
      0x000000e0 => "\x44",
      0x000000e1 => "\x45",
      0x000000e2 => "\x42",
      0x000000e4 => "\x43",
      0x000000e7 => "\xc0",
      0x000000e8 => "\x54",
      0x000000e9 => "\x51",
      0x000000ea => "\x52",
      0x000000eb => "\x53",
      0x000000ec => "\x58",
      0x000000ed => "\x55",
      0x000000ee => "\x56",
      0x000000ef => "\x57",
      0x000000f1 => "\x49",
      0x000000f2 => "\xcd",
      0x000000f3 => "\xce",
      0x000000f4 => "\xcb",
      0x000000f6 => "\xa1",
      0x000000f7 => "\xe1",
      0x000000f9 => "\xdd",
      0x000000fa => "\xde",
      0x000000fb => "\xdb",
      0x000000fc => "\xe0",
      0x00000108 => "\xab",
      0x00000109 => "\x8b",
      0x0000010a => "\x67",
      0x0000010b => "\x47",
      0x0000011c => "\xbb",
      0x0000011d => "\x9b",
      0x0000011e => "\x5a",
      0x0000011f => "\xd0",
      0x00000120 => "\xef",
      0x00000121 => "\xcf",
      0x00000124 => "\xba",
      0x00000125 => "\x9a",
      0x00000126 => "\xaa",
      0x00000127 => "\x8a",
      0x00000130 => "\x5b",
      0x00000131 => "\x79",
      0x00000134 => "\xbc",
      0x00000135 => "\x9c",
      0x0000015c => "\xac",
      0x0000015d => "\x8c",
      0x0000015e => "\x7c",
      0x0000015f => "\x6a",
      0x0000016c => "\xad",
      0x0000016d => "\x8d",
      0x0000017b => "\xb4",
      0x0000017c => "\xb2",
      0x000002d8 => "\x80",
      0x000002db => "\x9d",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x6f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::IBM905 - Conversion routines for IBM905
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for IBM905.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: IBM 3174 Character Set Ref, GA27-3831-02, March 1990
   alias CP905
   alias EBCDIC-CP-TR
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  0000009C | STRING TERMINATOR (ST)
      05 |  00000009 | CHARACTER TABULATION (HT)
      06 |  00000086 | START OF SELECTED AREA (SSA)
      07 |  0000007F | DELETE (DEL)
      08 |  00000097 | END OF GUARDED AREA (EPA)
      09 |  0000008D | REVERSE LINE FEED (RI)
      0A |  0000008E | SINGLE-SHIFT TWO (SS2)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  0000009D | OPERATING SYSTEM COMMAND (OSC)
      15 |  00000085 | NEXT LINE (NEL)
      16 |  00000008 | BACKSPACE (BS)
      17 |  00000087 | END OF SELECTED AREA (ESA)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  00000092 | PRIVATE USE TWO (PU2)
      1B |  0000008F | SINGLE-SHIFT THREE (SS3)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000080 | PADDING CHARACTER (PAD)
      21 |  00000081 | HIGH OCTET PRESET (HOP)
      22 |  00000082 | BREAK PERMITTED HERE (BPH)
      23 |  00000083 | NO BREAK HERE (NBH)
      24 |  00000084 | INDEX (IND)
      25 |  0000000A | LINE FEED (LF)
      26 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      27 |  0000001B | ESCAPE (ESC)
      28 |  00000088 | CHARACTER TABULATION SET (HTS)
      29 |  00000089 | CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
      2A |  0000008A | LINE TABULATION SET (VTS)
      2B |  0000008B | PARTIAL LINE FORWARD (PLD)
      2C |  0000008C | PARTIAL LINE BACKWARD (PLU)
      2D |  00000005 | ENQUIRY (ENQ)
      2E |  00000006 | ACKNOWLEDGE (ACK)
      2F |  00000007 | BELL (BEL)
      30 |  00000090 | DEVICE CONTROL STRING (DCS)
      31 |  00000091 | PRIVATE USE ONE (PU1)
      32 |  00000016 | SYNCHRONOUS IDLE (SYN)
      33 |  00000093 | SET TRANSMIT STATE (STS)
      34 |  00000094 | CANCEL CHARACTER (CCH)
      35 |  00000095 | MESSAGE WAITING (MW)
      36 |  00000096 | START OF GUARDED AREA (SPA)
      37 |  00000004 | END OF TRANSMISSION (EOT)
      38 |  00000098 | START OF STRING (SOS)
      39 |  00000099 | SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
      3A |  0000009A | SINGLE CHARACTER INTRODUCER (SCI)
      3B |  0000009B | CONTROL SEQUENCE INTRODUCER (CSI)
      3C |  00000014 | DEVICE CONTROL FOUR (DC4)
      3D |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      3E |  0000009E | PRIVACY MESSAGE (PM)
      3F |  0000001A | SUBSTITUTE (SUB)
      40 |  00000020 | SPACE
      42 |  000000E2 | LATIN SMALL LETTER A WITH CIRCUMFLEX
      43 |  000000E4 | LATIN SMALL LETTER A WITH DIAERESIS
      44 |  000000E0 | LATIN SMALL LETTER A WITH GRAVE
      45 |  000000E1 | LATIN SMALL LETTER A WITH ACUTE
      47 |  0000010B | LATIN SMALL LETTER C WITH DOT ABOVE
      48 |  0000007B | LEFT CURLY BRACKET
      49 |  000000F1 | LATIN SMALL LETTER N WITH TILDE
      4A |  000000C7 | LATIN CAPITAL LETTER C WITH CEDILLA
      4B |  0000002E | FULL STOP
      4C |  0000003C | LESS-THAN SIGN
      4D |  00000028 | LEFT PARENTHESIS
      4E |  0000002B | PLUS SIGN
      4F |  00000021 | EXCLAMATION MARK
      50 |  00000026 | AMPERSAND
      51 |  000000E9 | LATIN SMALL LETTER E WITH ACUTE
      52 |  000000EA | LATIN SMALL LETTER E WITH CIRCUMFLEX
      53 |  000000EB | LATIN SMALL LETTER E WITH DIAERESIS
      54 |  000000E8 | LATIN SMALL LETTER E WITH GRAVE
      55 |  000000ED | LATIN SMALL LETTER I WITH ACUTE
      56 |  000000EE | LATIN SMALL LETTER I WITH CIRCUMFLEX
      57 |  000000EF | LATIN SMALL LETTER I WITH DIAERESIS
      58 |  000000EC | LATIN SMALL LETTER I WITH GRAVE
      59 |  000000DF | LATIN SMALL LETTER SHARP S (German)
      5A |  0000011E | LATIN CAPITAL LETTER G WITH BREVE
      5B |  00000130 | LATIN CAPITAL LETTER I WITH DOT ABOVE
      5C |  0000002A | ASTERISK
      5D |  00000029 | RIGHT PARENTHESIS
      5E |  0000003B | SEMICOLON
      5F |  0000005E | CIRCUMFLEX ACCENT
      60 |  0000002D | HYPHEN-MINUS
      61 |  0000002F | SOLIDUS
      62 |  000000C2 | LATIN CAPITAL LETTER A WITH CIRCUMFLEX
      63 |  000000C4 | LATIN CAPITAL LETTER A WITH DIAERESIS
      64 |  000000C0 | LATIN CAPITAL LETTER A WITH GRAVE
      65 |  000000C1 | LATIN CAPITAL LETTER A WITH ACUTE
      67 |  0000010A | LATIN CAPITAL LETTER C WITH DOT ABOVE
      68 |  0000005B | LEFT SQUARE BRACKET
      69 |  000000D1 | LATIN CAPITAL LETTER N WITH TILDE
      6A |  0000015F | LATIN SMALL LETTER S WITH CEDILLA
      6B |  0000002C | COMMA
      6C |  00000025 | PERCENT SIGN
      6D |  0000005F | LOW LINE
      6E |  0000003E | GREATER-THAN SIGN
      6F |  0000003F | QUESTION MARK
      71 |  000000C9 | LATIN CAPITAL LETTER E WITH ACUTE
      72 |  000000CA | LATIN CAPITAL LETTER E WITH CIRCUMFLEX
      73 |  000000CB | LATIN CAPITAL LETTER E WITH DIAERESIS
      74 |  000000C8 | LATIN CAPITAL LETTER E WITH GRAVE
      75 |  000000CD | LATIN CAPITAL LETTER I WITH ACUTE
      76 |  000000CE | LATIN CAPITAL LETTER I WITH CIRCUMFLEX
      77 |  000000CF | LATIN CAPITAL LETTER I WITH DIAERESIS
      78 |  000000CC | LATIN CAPITAL LETTER I WITH GRAVE
      79 |  00000131 | LATIN SMALL LETTER DOTLESS I
      7A |  0000003A | COLON
      7B |  000000D6 | LATIN CAPITAL LETTER O WITH DIAERESIS
      7C |  0000015E | LATIN CAPITAL LETTER S WITH CEDILLA
      7D |  00000027 | APOSTROPHE
      7E |  0000003D | EQUALS SIGN
      7F |  000000DC | LATIN CAPITAL LETTER U WITH DIAERESIS
      80 |  000002D8 | BREVE
      81 |  00000061 | LATIN SMALL LETTER A
      82 |  00000062 | LATIN SMALL LETTER B
      83 |  00000063 | LATIN SMALL LETTER C
      84 |  00000064 | LATIN SMALL LETTER D
      85 |  00000065 | LATIN SMALL LETTER E
      86 |  00000066 | LATIN SMALL LETTER F
      87 |  00000067 | LATIN SMALL LETTER G
      88 |  00000068 | LATIN SMALL LETTER H
      89 |  00000069 | LATIN SMALL LETTER I
      8A |  00000127 | LATIN SMALL LETTER H WITH STROKE
      8B |  00000109 | LATIN SMALL LETTER C WITH CIRCUMFLEX
      8C |  0000015D | LATIN SMALL LETTER S WITH CIRCUMFLEX
      8D |  0000016D | LATIN SMALL LETTER U WITH BREVE
      8F |  0000007C | VERTICAL LINE
      90 |  000000B0 | DEGREE SIGN
      91 |  0000006A | LATIN SMALL LETTER J
      92 |  0000006B | LATIN SMALL LETTER K
      93 |  0000006C | LATIN SMALL LETTER L
      94 |  0000006D | LATIN SMALL LETTER M
      95 |  0000006E | LATIN SMALL LETTER N
      96 |  0000006F | LATIN SMALL LETTER O
      97 |  00000070 | LATIN SMALL LETTER P
      98 |  00000071 | LATIN SMALL LETTER Q
      99 |  00000072 | LATIN SMALL LETTER R
      9A |  00000125 | LATIN SMALL LETTER H WITH CIRCUMFLEX
      9B |  0000011D | LATIN SMALL LETTER G WITH CIRCUMFLEX
      9C |  00000135 | LATIN SMALL LETTER J WITH CIRCUMFLEX
      9D |  000002DB | OGONEK
      9F |  000000A4 | CURRENCY SIGN
      A0 |  000000B5 | MICRO SIGN
      A1 |  000000F6 | LATIN SMALL LETTER O WITH DIAERESIS
      A2 |  00000073 | LATIN SMALL LETTER S
      A3 |  00000074 | LATIN SMALL LETTER T
      A4 |  00000075 | LATIN SMALL LETTER U
      A5 |  00000076 | LATIN SMALL LETTER V
      A6 |  00000077 | LATIN SMALL LETTER W
      A7 |  00000078 | LATIN SMALL LETTER X
      A8 |  00000079 | LATIN SMALL LETTER Y
      A9 |  0000007A | LATIN SMALL LETTER Z
      AA |  00000126 | LATIN CAPITAL LETTER H WITH STROKE
      AB |  00000108 | LATIN CAPITAL LETTER C WITH CIRCUMFLEX
      AC |  0000015C | LATIN CAPITAL LETTER S WITH CIRCUMFLEX
      AD |  0000016C | LATIN CAPITAL LETTER U WITH BREVE
      AF |  00000040 | COMMERCIAL AT
      B0 |  000000B7 | MIDDLE DOT
      B1 |  000000A3 | POUND SIGN
      B2 |  0000017C | LATIN SMALL LETTER Z WITH DOT ABOVE
      B3 |  0000007D | RIGHT CURLY BRACKET
      B4 |  0000017B | LATIN CAPITAL LETTER Z WITH DOT ABOVE
      B5 |  000000A7 | SECTION SIGN
      B6 |  0000005D | RIGHT SQUARE BRACKET
      B8 |  000000BD | VULGAR FRACTION ONE HALF
      B9 |  00000024 | DOLLAR SIGN
      BA |  00000124 | LATIN CAPITAL LETTER H WITH CIRCUMFLEX
      BB |  0000011C | LATIN CAPITAL LETTER G WITH CIRCUMFLEX
      BC |  00000134 | LATIN CAPITAL LETTER J WITH CIRCUMFLEX
      BD |  000000A8 | DIAERESIS
      BE |  000000B4 | ACUTE ACCENT
      BF |  000000D7 | MULTIPLICATION SIGN
      C0 |  000000E7 | LATIN SMALL LETTER C WITH CEDILLA
      C1 |  00000041 | LATIN CAPITAL LETTER A
      C2 |  00000042 | LATIN CAPITAL LETTER B
      C3 |  00000043 | LATIN CAPITAL LETTER C
      C4 |  00000044 | LATIN CAPITAL LETTER D
      C5 |  00000045 | LATIN CAPITAL LETTER E
      C6 |  00000046 | LATIN CAPITAL LETTER F
      C7 |  00000047 | LATIN CAPITAL LETTER G
      C8 |  00000048 | LATIN CAPITAL LETTER H
      C9 |  00000049 | LATIN CAPITAL LETTER I
      CA |  000000AD | SOFT HYPHEN
      CB |  000000F4 | LATIN SMALL LETTER O WITH CIRCUMFLEX
      CC |  0000007E | TILDE
      CD |  000000F2 | LATIN SMALL LETTER O WITH GRAVE
      CE |  000000F3 | LATIN SMALL LETTER O WITH ACUTE
      CF |  00000121 | LATIN SMALL LETTER G WITH DOT ABOVE
      D0 |  0000011F | LATIN SMALL LETTER G WITH BREVE
      D1 |  0000004A | LATIN CAPITAL LETTER J
      D2 |  0000004B | LATIN CAPITAL LETTER K
      D3 |  0000004C | LATIN CAPITAL LETTER L
      D4 |  0000004D | LATIN CAPITAL LETTER M
      D5 |  0000004E | LATIN CAPITAL LETTER N
      D6 |  0000004F | LATIN CAPITAL LETTER O
      D7 |  00000050 | LATIN CAPITAL LETTER P
      D8 |  00000051 | LATIN CAPITAL LETTER Q
      D9 |  00000052 | LATIN CAPITAL LETTER R
      DA |  00000060 | GRAVE ACCENT
      DB |  000000FB | LATIN SMALL LETTER U WITH CIRCUMFLEX
      DC |  0000005C | REVERSE SOLIDUS
      DD |  000000F9 | LATIN SMALL LETTER U WITH GRAVE
      DE |  000000FA | LATIN SMALL LETTER U WITH ACUTE
      E0 |  000000FC | LATIN SMALL LETTER U WITH DIAERESIS
      E1 |  000000F7 | DIVISION SIGN
      E2 |  00000053 | LATIN CAPITAL LETTER S
      E3 |  00000054 | LATIN CAPITAL LETTER T
      E4 |  00000055 | LATIN CAPITAL LETTER U
      E5 |  00000056 | LATIN CAPITAL LETTER V
      E6 |  00000057 | LATIN CAPITAL LETTER W
      E7 |  00000058 | LATIN CAPITAL LETTER X
      E8 |  00000059 | LATIN CAPITAL LETTER Y
      E9 |  0000005A | LATIN CAPITAL LETTER Z
      EA |  000000B2 | SUPERSCRIPT TWO
      EB |  000000D4 | LATIN CAPITAL LETTER O WITH CIRCUMFLEX
      EC |  00000023 | NUMBER SIGN
      ED |  000000D2 | LATIN CAPITAL LETTER O WITH GRAVE
      EE |  000000D3 | LATIN CAPITAL LETTER O WITH ACUTE
      EF |  00000120 | LATIN CAPITAL LETTER G WITH DOT ABOVE
      F0 |  00000030 | DIGIT ZERO
      F1 |  00000031 | DIGIT ONE
      F2 |  00000032 | DIGIT TWO
      F3 |  00000033 | DIGIT THREE
      F4 |  00000034 | DIGIT FOUR
      F5 |  00000035 | DIGIT FIVE
      F6 |  00000036 | DIGIT SIX
      F7 |  00000037 | DIGIT SEVEN
      F8 |  00000038 | DIGIT EIGHT
      F9 |  00000039 | DIGIT NINE
      FA |  000000B3 | SUPERSCRIPT THREE
      FB |  000000DB | LATIN CAPITAL LETTER U WITH CIRCUMFLEX
      FC |  00000022 | QUOTATION MARK
      FD |  000000D9 | LATIN CAPITAL LETTER U WITH GRAVE
      FE |  000000DA | LATIN CAPITAL LETTER U WITH ACUTE
      FF |  0000009F | APPLICATION PROGRAM COMMAND (APC)
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_IBM905

    $main::fatpacked{"Locale/RecodeData/IBM918.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_IBM918';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for IBM918.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::IBM918;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x009c,
      0x0009,
      0x0086,
      0x007f,
      0x0097,
      0x008d,
      0x008e,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x009d,
      0x0085,
      0x0008,
      0x0087,
      0x0018,
      0x0019,
      0x0092,
      0x008f,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0080,
      0x0081,
      0x0082,
      0x0083,
      0x0084,
      0x000a,
      0x0017,
      0x001b,
      0x0088,
      0x0089,
      0x008a,
      0x008b,
      0x008c,
      0x0005,
      0x0006,
      0x0007,
      0x0090,
      0x0091,
      0x0016,
      0x0093,
      0x0094,
      0x0095,
      0x0096,
      0x0004,
      0x0098,
      0x0099,
      0x009a,
      0x009b,
      0x0014,
      0x0015,
      0x009e,
      0x001a,
      0x0020,
      0x00a0,
      0x060c,
      0x061b,
      0x061f,
      0x0623,
      0x0627,
      0xfe8e,
      0xfffd,
      0x0628,
      0x005b,
      0x002e,
      0x003c,
      0x0028,
      0x002b,
      0x0021,
      0x0026,
      0xfe91,
      0x067e,
      0xfffd,
      0x0629,
      0x062a,
      0xfe97,
      0xfffd,
      0xfffd,
      0x062b,
      0x005d,
      0x0024,
      0x002a,
      0x0029,
      0x003b,
      0x005e,
      0x002d,
      0x002f,
      0xfe9b,
      0x062c,
      0xfe9f,
      0xfffd,
      0xfffd,
      0x062d,
      0xfea3,
      0x062e,
      0x0060,
      0x002c,
      0x0025,
      0x005f,
      0x003e,
      0x003f,
      0x0660,
      0x0661,
      0x0662,
      0x0663,
      0x0664,
      0x0665,
      0x0666,
      0x0667,
      0x0668,
      0x0669,
      0x003a,
      0x0023,
      0x0040,
      0x0027,
      0x003d,
      0x0022,
      0xfea7,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x062f,
      0xfffd,
      0x0630,
      0x0631,
      0xfffd,
      0x0632,
      0xfffd,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0633,
      0xfeb3,
      0x0634,
      0xfeb7,
      0x0635,
      0xfebb,
      0x0636,
      0x007e,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0xfebf,
      0x0637,
      0x0638,
      0x0639,
      0xfeca,
      0xfecb,
      0xfecc,
      0x063a,
      0xfece,
      0xfecf,
      0xfed0,
      0x0641,
      0xfed3,
      0x0642,
      0xfed7,
      0x0643,
      0xfedb,
      0x007c,
      0xfffd,
      0xfffd,
      0x0644,
      0xfede,
      0x007b,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x00ad,
      0xfffd,
      0x0645,
      0xfee3,
      0xfffd,
      0x0646,
      0x007d,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0xfee7,
      0xfffd,
      0x0648,
      0xfffd,
      0xfffd,
      0xfffd,
      0x005c,
      0xfffd,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x0621,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0651,
      0xfe7d,
      0x009f,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\xc2\x9c",
      "\x09",
      "\xc2\x86",
      "\x7f",
      "\xc2\x97",
      "\xc2\x8d",
      "\xc2\x8e",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\xc2\x9d",
      "\xc2\x85",
      "\x08",
      "\xc2\x87",
      "\x18",
      "\x19",
      "\xc2\x92",
      "\xc2\x8f",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\xc2\x80",
      "\xc2\x81",
      "\xc2\x82",
      "\xc2\x83",
      "\xc2\x84",
      "\x0a",
      "\x17",
      "\x1b",
      "\xc2\x88",
      "\xc2\x89",
      "\xc2\x8a",
      "\xc2\x8b",
      "\xc2\x8c",
      "\x05",
      "\x06",
      "\x07",
      "\xc2\x90",
      "\xc2\x91",
      "\x16",
      "\xc2\x93",
      "\xc2\x94",
      "\xc2\x95",
      "\xc2\x96",
      "\x04",
      "\xc2\x98",
      "\xc2\x99",
      "\xc2\x9a",
      "\xc2\x9b",
      "\x14",
      "\x15",
      "\xc2\x9e",
      "\x1a",
      "\x20",
      "\xc2\xa0",
      "\xd8\x8c",
      "\xd8\x9b",
      "\xd8\x9f",
      "\xd8\xa3",
      "\xd8\xa7",
      "\xef\xba\x8e",
      "\xef\xbf\xbd",
      "\xd8\xa8",
      "\x5b",
      "\x2e",
      "\x3c",
      "\x28",
      "\x2b",
      "\x21",
      "\x26",
      "\xef\xba\x91",
      "\xd9\xbe",
      "\xef\xbf\xbd",
      "\xd8\xa9",
      "\xd8\xaa",
      "\xef\xba\x97",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xd8\xab",
      "\x5d",
      "\x24",
      "\x2a",
      "\x29",
      "\x3b",
      "\x5e",
      "\x2d",
      "\x2f",
      "\xef\xba\x9b",
      "\xd8\xac",
      "\xef\xba\x9f",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xd8\xad",
      "\xef\xba\xa3",
      "\xd8\xae",
      "\x60",
      "\x2c",
      "\x25",
      "\x5f",
      "\x3e",
      "\x3f",
      "\xd9\xa0",
      "\xd9\xa1",
      "\xd9\xa2",
      "\xd9\xa3",
      "\xd9\xa4",
      "\xd9\xa5",
      "\xd9\xa6",
      "\xd9\xa7",
      "\xd9\xa8",
      "\xd9\xa9",
      "\x3a",
      "\x23",
      "\x40",
      "\x27",
      "\x3d",
      "\x22",
      "\xef\xba\xa7",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\xd8\xaf",
      "\xef\xbf\xbd",
      "\xd8\xb0",
      "\xd8\xb1",
      "\xef\xbf\xbd",
      "\xd8\xb2",
      "\xef\xbf\xbd",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\xd8\xb3",
      "\xef\xba\xb3",
      "\xd8\xb4",
      "\xef\xba\xb7",
      "\xd8\xb5",
      "\xef\xba\xbb",
      "\xd8\xb6",
      "\x7e",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\xef\xba\xbf",
      "\xd8\xb7",
      "\xd8\xb8",
      "\xd8\xb9",
      "\xef\xbb\x8a",
      "\xef\xbb\x8b",
      "\xef\xbb\x8c",
      "\xd8\xba",
      "\xef\xbb\x8e",
      "\xef\xbb\x8f",
      "\xef\xbb\x90",
      "\xd9\x81",
      "\xef\xbb\x93",
      "\xd9\x82",
      "\xef\xbb\x97",
      "\xd9\x83",
      "\xef\xbb\x9b",
      "\x7c",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xd9\x84",
      "\xef\xbb\x9e",
      "\x7b",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\xc2\xad",
      "\xef\xbf\xbd",
      "\xd9\x85",
      "\xef\xbb\xa3",
      "\xef\xbf\xbd",
      "\xd9\x86",
      "\x7d",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\xef\xbb\xa7",
      "\xef\xbf\xbd",
      "\xd9\x88",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x5c",
      "\xef\xbf\xbd",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\xd8\xa1",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xd9\x91",
      "\xef\xb9\xbd",
      "\xc2\x9f",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x37",
      0x00000005 => "\x2d",
      0x00000006 => "\x2e",
      0x00000007 => "\x2f",
      0x00000008 => "\x16",
      0x00000009 => "\x05",
      0x0000000a => "\x25",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x3c",
      0x00000015 => "\x3d",
      0x00000016 => "\x32",
      0x00000017 => "\x26",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x3f",
      0x0000001b => "\x27",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x40",
      0x00000021 => "\x4f",
      0x00000022 => "\x7f",
      0x00000023 => "\x7b",
      0x00000024 => "\x5b",
      0x00000025 => "\x6c",
      0x00000026 => "\x50",
      0x00000027 => "\x7d",
      0x00000028 => "\x4d",
      0x00000029 => "\x5d",
      0x0000002a => "\x5c",
      0x0000002b => "\x4e",
      0x0000002c => "\x6b",
      0x0000002d => "\x60",
      0x0000002e => "\x4b",
      0x0000002f => "\x61",
      0x00000030 => "\xf0",
      0x00000031 => "\xf1",
      0x00000032 => "\xf2",
      0x00000033 => "\xf3",
      0x00000034 => "\xf4",
      0x00000035 => "\xf5",
      0x00000036 => "\xf6",
      0x00000037 => "\xf7",
      0x00000038 => "\xf8",
      0x00000039 => "\xf9",
      0x0000003a => "\x7a",
      0x0000003b => "\x5e",
      0x0000003c => "\x4c",
      0x0000003d => "\x7e",
      0x0000003e => "\x6e",
      0x0000003f => "\x6f",
      0x00000040 => "\x7c",
      0x00000041 => "\xc1",
      0x00000042 => "\xc2",
      0x00000043 => "\xc3",
      0x00000044 => "\xc4",
      0x00000045 => "\xc5",
      0x00000046 => "\xc6",
      0x00000047 => "\xc7",
      0x00000048 => "\xc8",
      0x00000049 => "\xc9",
      0x0000004a => "\xd1",
      0x0000004b => "\xd2",
      0x0000004c => "\xd3",
      0x0000004d => "\xd4",
      0x0000004e => "\xd5",
      0x0000004f => "\xd6",
      0x00000050 => "\xd7",
      0x00000051 => "\xd8",
      0x00000052 => "\xd9",
      0x00000053 => "\xe2",
      0x00000054 => "\xe3",
      0x00000055 => "\xe4",
      0x00000056 => "\xe5",
      0x00000057 => "\xe6",
      0x00000058 => "\xe7",
      0x00000059 => "\xe8",
      0x0000005a => "\xe9",
      0x0000005b => "\x4a",
      0x0000005c => "\xe0",
      0x0000005d => "\x5a",
      0x0000005e => "\x5f",
      0x0000005f => "\x6d",
      0x00000060 => "\x6a",
      0x00000061 => "\x81",
      0x00000062 => "\x82",
      0x00000063 => "\x83",
      0x00000064 => "\x84",
      0x00000065 => "\x85",
      0x00000066 => "\x86",
      0x00000067 => "\x87",
      0x00000068 => "\x88",
      0x00000069 => "\x89",
      0x0000006a => "\x91",
      0x0000006b => "\x92",
      0x0000006c => "\x93",
      0x0000006d => "\x94",
      0x0000006e => "\x95",
      0x0000006f => "\x96",
      0x00000070 => "\x97",
      0x00000071 => "\x98",
      0x00000072 => "\x99",
      0x00000073 => "\xa2",
      0x00000074 => "\xa3",
      0x00000075 => "\xa4",
      0x00000076 => "\xa5",
      0x00000077 => "\xa6",
      0x00000078 => "\xa7",
      0x00000079 => "\xa8",
      0x0000007a => "\xa9",
      0x0000007b => "\xc0",
      0x0000007c => "\xbb",
      0x0000007d => "\xd0",
      0x0000007e => "\xa1",
      0x0000007f => "\x07",
      0x00000080 => "\x20",
      0x00000081 => "\x21",
      0x00000082 => "\x22",
      0x00000083 => "\x23",
      0x00000084 => "\x24",
      0x00000085 => "\x15",
      0x00000086 => "\x06",
      0x00000087 => "\x17",
      0x00000088 => "\x28",
      0x00000089 => "\x29",
      0x0000008a => "\x2a",
      0x0000008b => "\x2b",
      0x0000008c => "\x2c",
      0x0000008d => "\x09",
      0x0000008e => "\x0a",
      0x0000008f => "\x1b",
      0x00000090 => "\x30",
      0x00000091 => "\x31",
      0x00000092 => "\x1a",
      0x00000093 => "\x33",
      0x00000094 => "\x34",
      0x00000095 => "\x35",
      0x00000096 => "\x36",
      0x00000097 => "\x08",
      0x00000098 => "\x38",
      0x00000099 => "\x39",
      0x0000009a => "\x3a",
      0x0000009b => "\x3b",
      0x0000009c => "\x04",
      0x0000009d => "\x14",
      0x0000009e => "\x3e",
      0x0000009f => "\xff",
      0x000000a0 => "\x41",
      0x000000ad => "\xca",
      0x0000060c => "\x42",
      0x0000061b => "\x43",
      0x0000061f => "\x44",
      0x00000621 => "\xea",
      0x00000623 => "\x45",
      0x00000627 => "\x46",
      0x00000628 => "\x49",
      0x00000629 => "\x54",
      0x0000062a => "\x55",
      0x0000062b => "\x59",
      0x0000062c => "\x63",
      0x0000062d => "\x67",
      0x0000062e => "\x69",
      0x0000062f => "\x8a",
      0x00000630 => "\x8c",
      0x00000631 => "\x8d",
      0x00000632 => "\x8f",
      0x00000633 => "\x9a",
      0x00000634 => "\x9c",
      0x00000635 => "\x9e",
      0x00000636 => "\xa0",
      0x00000637 => "\xab",
      0x00000638 => "\xac",
      0x00000639 => "\xad",
      0x0000063a => "\xb1",
      0x00000641 => "\xb5",
      0x00000642 => "\xb7",
      0x00000643 => "\xb9",
      0x00000644 => "\xbe",
      0x00000645 => "\xcc",
      0x00000646 => "\xcf",
      0x00000648 => "\xdc",
      0x00000651 => "\xfd",
      0x00000660 => "\x70",
      0x00000661 => "\x71",
      0x00000662 => "\x72",
      0x00000663 => "\x73",
      0x00000664 => "\x74",
      0x00000665 => "\x75",
      0x00000666 => "\x76",
      0x00000667 => "\x77",
      0x00000668 => "\x78",
      0x00000669 => "\x79",
      0x0000067e => "\x52",
      0x0000fe7d => "\xfe",
      0x0000fe8e => "\x47",
      0x0000fe91 => "\x51",
      0x0000fe97 => "\x56",
      0x0000fe9b => "\x62",
      0x0000fe9f => "\x64",
      0x0000fea3 => "\x68",
      0x0000fea7 => "\x80",
      0x0000feb3 => "\x9b",
      0x0000feb7 => "\x9d",
      0x0000febb => "\x9f",
      0x0000febf => "\xaa",
      0x0000feca => "\xae",
      0x0000fecb => "\xaf",
      0x0000fecc => "\xb0",
      0x0000fece => "\xb2",
      0x0000fecf => "\xb3",
      0x0000fed0 => "\xb4",
      0x0000fed3 => "\xb6",
      0x0000fed7 => "\xb8",
      0x0000fedb => "\xba",
      0x0000fede => "\xbf",
      0x0000fee3 => "\xcd",
      0x0000fee7 => "\xda",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x6f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::IBM918 - Conversion routines for IBM918
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for IBM918.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: IBM NLS RM Vol2 SE09-8002-01, March 1990
   alias CP918
   alias EBCDIC-CP-AR2
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  0000009C | STRING TERMINATOR (ST)
      05 |  00000009 | CHARACTER TABULATION (HT)
      06 |  00000086 | START OF SELECTED AREA (SSA)
      07 |  0000007F | DELETE (DEL)
      08 |  00000097 | END OF GUARDED AREA (EPA)
      09 |  0000008D | REVERSE LINE FEED (RI)
      0A |  0000008E | SINGLE-SHIFT TWO (SS2)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  0000009D | OPERATING SYSTEM COMMAND (OSC)
      15 |  00000085 | NEXT LINE (NEL)
      16 |  00000008 | BACKSPACE (BS)
      17 |  00000087 | END OF SELECTED AREA (ESA)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  00000092 | PRIVATE USE TWO (PU2)
      1B |  0000008F | SINGLE-SHIFT THREE (SS3)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000080 | PADDING CHARACTER (PAD)
      21 |  00000081 | HIGH OCTET PRESET (HOP)
      22 |  00000082 | BREAK PERMITTED HERE (BPH)
      23 |  00000083 | NO BREAK HERE (NBH)
      24 |  00000084 | INDEX (IND)
      25 |  0000000A | LINE FEED (LF)
      26 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      27 |  0000001B | ESCAPE (ESC)
      28 |  00000088 | CHARACTER TABULATION SET (HTS)
      29 |  00000089 | CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
      2A |  0000008A | LINE TABULATION SET (VTS)
      2B |  0000008B | PARTIAL LINE FORWARD (PLD)
      2C |  0000008C | PARTIAL LINE BACKWARD (PLU)
      2D |  00000005 | ENQUIRY (ENQ)
      2E |  00000006 | ACKNOWLEDGE (ACK)
      2F |  00000007 | BELL (BEL)
      30 |  00000090 | DEVICE CONTROL STRING (DCS)
      31 |  00000091 | PRIVATE USE ONE (PU1)
      32 |  00000016 | SYNCHRONOUS IDLE (SYN)
      33 |  00000093 | SET TRANSMIT STATE (STS)
      34 |  00000094 | CANCEL CHARACTER (CCH)
      35 |  00000095 | MESSAGE WAITING (MW)
      36 |  00000096 | START OF GUARDED AREA (SPA)
      37 |  00000004 | END OF TRANSMISSION (EOT)
      38 |  00000098 | START OF STRING (SOS)
      39 |  00000099 | SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
      3A |  0000009A | SINGLE CHARACTER INTRODUCER (SCI)
      3B |  0000009B | CONTROL SEQUENCE INTRODUCER (CSI)
      3C |  00000014 | DEVICE CONTROL FOUR (DC4)
      3D |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      3E |  0000009E | PRIVACY MESSAGE (PM)
      3F |  0000001A | SUBSTITUTE (SUB)
      40 |  00000020 | SPACE
      41 |  000000A0 | NO-BREAK SPACE
      42 |  0000060C | ARABIC COMMA
      43 |  0000061B | ARABIC SEMICOLON
      44 |  0000061F | ARABIC QUESTION MARK
      45 |  00000623 | ARABIC LETTER ALEF WITH HAMZA ABOVE
      46 |  00000627 | ARABIC LETTER ALEF
      47 |  0000FE8E | ARABIC LETTER ALEF FINAL FORM
      49 |  00000628 | ARABIC LETTER BEH
      4A |  0000005B | LEFT SQUARE BRACKET
      4B |  0000002E | FULL STOP
      4C |  0000003C | LESS-THAN SIGN
      4D |  00000028 | LEFT PARENTHESIS
      4E |  0000002B | PLUS SIGN
      4F |  00000021 | EXCLAMATION MARK
      50 |  00000026 | AMPERSAND
      51 |  0000FE91 | ARABIC LETTER BEH INITIAL FORM
      52 |  0000067E | ARABIC LETTER PEH
      54 |  00000629 | ARABIC LETTER TEH MARBUTA
      55 |  0000062A | ARABIC LETTER TEH
      56 |  0000FE97 | ARABIC LETTER TEH INITIAL FORM
      59 |  0000062B | ARABIC LETTER THEH
      5A |  0000005D | RIGHT SQUARE BRACKET
      5B |  00000024 | DOLLAR SIGN
      5C |  0000002A | ASTERISK
      5D |  00000029 | RIGHT PARENTHESIS
      5E |  0000003B | SEMICOLON
      5F |  0000005E | CIRCUMFLEX ACCENT
      60 |  0000002D | HYPHEN-MINUS
      61 |  0000002F | SOLIDUS
      62 |  0000FE9B | ARABIC LETTER THEH INITIAL FORM
      63 |  0000062C | ARABIC LETTER JEEM
      64 |  0000FE9F | ARABIC LETTER JEEM INITIAL FORM
      67 |  0000062D | ARABIC LETTER HAH
      68 |  0000FEA3 | ARABIC LETTER HAH INITIAL FORM
      69 |  0000062E | ARABIC LETTER KHAH
      6A |  00000060 | GRAVE ACCENT
      6B |  0000002C | COMMA
      6C |  00000025 | PERCENT SIGN
      6D |  0000005F | LOW LINE
      6E |  0000003E | GREATER-THAN SIGN
      6F |  0000003F | QUESTION MARK
      70 |  00000660 | ARABIC-INDIC DIGIT ZERO
      71 |  00000661 | ARABIC-INDIC DIGIT ONE
      72 |  00000662 | ARABIC-INDIC DIGIT TWO
      73 |  00000663 | ARABIC-INDIC DIGIT THREE
      74 |  00000664 | ARABIC-INDIC DIGIT FOUR
      75 |  00000665 | ARABIC-INDIC DIGIT FIVE
      76 |  00000666 | ARABIC-INDIC DIGIT SIX
      77 |  00000667 | ARABIC-INDIC DIGIT SEVEN
      78 |  00000668 | ARABIC-INDIC DIGIT EIGHT
      79 |  00000669 | ARABIC-INDIC DIGIT NINE
      7A |  0000003A | COLON
      7B |  00000023 | NUMBER SIGN
      7C |  00000040 | COMMERCIAL AT
      7D |  00000027 | APOSTROPHE
      7E |  0000003D | EQUALS SIGN
      7F |  00000022 | QUOTATION MARK
      80 |  0000FEA7 | ARABIC LETTER KHAH INITIAL FORM
      81 |  00000061 | LATIN SMALL LETTER A
      82 |  00000062 | LATIN SMALL LETTER B
      83 |  00000063 | LATIN SMALL LETTER C
      84 |  00000064 | LATIN SMALL LETTER D
      85 |  00000065 | LATIN SMALL LETTER E
      86 |  00000066 | LATIN SMALL LETTER F
      87 |  00000067 | LATIN SMALL LETTER G
      88 |  00000068 | LATIN SMALL LETTER H
      89 |  00000069 | LATIN SMALL LETTER I
      8A |  0000062F | ARABIC LETTER DAL
      8C |  00000630 | ARABIC LETTER THAL
      8D |  00000631 | ARABIC LETTER REH
      8F |  00000632 | ARABIC LETTER ZAIN
      91 |  0000006A | LATIN SMALL LETTER J
      92 |  0000006B | LATIN SMALL LETTER K
      93 |  0000006C | LATIN SMALL LETTER L
      94 |  0000006D | LATIN SMALL LETTER M
      95 |  0000006E | LATIN SMALL LETTER N
      96 |  0000006F | LATIN SMALL LETTER O
      97 |  00000070 | LATIN SMALL LETTER P
      98 |  00000071 | LATIN SMALL LETTER Q
      99 |  00000072 | LATIN SMALL LETTER R
      9A |  00000633 | ARABIC LETTER SEEN
      9B |  0000FEB3 | ARABIC LETTER SEEN INITIAL FORM
      9C |  00000634 | ARABIC LETTER SHEEN
      9D |  0000FEB7 | ARABIC LETTER SHEEN INITIAL FORM
      9E |  00000635 | ARABIC LETTER SAD
      9F |  0000FEBB | ARABIC LETTER SAD INITIAL FORM
      A0 |  00000636 | ARABIC LETTER DAD
      A1 |  0000007E | TILDE
      A2 |  00000073 | LATIN SMALL LETTER S
      A3 |  00000074 | LATIN SMALL LETTER T
      A4 |  00000075 | LATIN SMALL LETTER U
      A5 |  00000076 | LATIN SMALL LETTER V
      A6 |  00000077 | LATIN SMALL LETTER W
      A7 |  00000078 | LATIN SMALL LETTER X
      A8 |  00000079 | LATIN SMALL LETTER Y
      A9 |  0000007A | LATIN SMALL LETTER Z
      AA |  0000FEBF | ARABIC LETTER DAD INITIAL FORM
      AB |  00000637 | ARABIC LETTER TAH
      AC |  00000638 | ARABIC LETTER ZAH
      AD |  00000639 | ARABIC LETTER AIN
      AE |  0000FECA | ARABIC LETTER AIN FINAL FORM
      AF |  0000FECB | ARABIC LETTER AIN INITIAL FORM
      B0 |  0000FECC | ARABIC LETTER AIN MEDIAL FORM
      B1 |  0000063A | ARABIC LETTER GHAIN
      B2 |  0000FECE | ARABIC LETTER GHAIN FINAL FORM
      B3 |  0000FECF | ARABIC LETTER GHAIN INITIAL FORM
      B4 |  0000FED0 | ARABIC LETTER GHAIN MEDIAL FORM
      B5 |  00000641 | ARABIC LETTER FEH
      B6 |  0000FED3 | ARABIC LETTER FEH INITIAL FORM
      B7 |  00000642 | ARABIC LETTER QAF
      B8 |  0000FED7 | ARABIC LETTER QAF INITIAL FORM
      B9 |  00000643 | ARABIC LETTER KAF
      BA |  0000FEDB | ARABIC LETTER KAF INITIAL FORM
      BB |  0000007C | VERTICAL LINE
      BE |  00000644 | ARABIC LETTER LAM
      BF |  0000FEDE | ARABIC LETTER LAM FINAL FORM
      C0 |  0000007B | LEFT CURLY BRACKET
      C1 |  00000041 | LATIN CAPITAL LETTER A
      C2 |  00000042 | LATIN CAPITAL LETTER B
      C3 |  00000043 | LATIN CAPITAL LETTER C
      C4 |  00000044 | LATIN CAPITAL LETTER D
      C5 |  00000045 | LATIN CAPITAL LETTER E
      C6 |  00000046 | LATIN CAPITAL LETTER F
      C7 |  00000047 | LATIN CAPITAL LETTER G
      C8 |  00000048 | LATIN CAPITAL LETTER H
      C9 |  00000049 | LATIN CAPITAL LETTER I
      CA |  000000AD | SOFT HYPHEN
      CC |  00000645 | ARABIC LETTER MEEM
      CD |  0000FEE3 | ARABIC LETTER MEEM INITIAL FORM
      CF |  00000646 | ARABIC LETTER NOON
      D0 |  0000007D | RIGHT CURLY BRACKET
      D1 |  0000004A | LATIN CAPITAL LETTER J
      D2 |  0000004B | LATIN CAPITAL LETTER K
      D3 |  0000004C | LATIN CAPITAL LETTER L
      D4 |  0000004D | LATIN CAPITAL LETTER M
      D5 |  0000004E | LATIN CAPITAL LETTER N
      D6 |  0000004F | LATIN CAPITAL LETTER O
      D7 |  00000050 | LATIN CAPITAL LETTER P
      D8 |  00000051 | LATIN CAPITAL LETTER Q
      D9 |  00000052 | LATIN CAPITAL LETTER R
      DA |  0000FEE7 | ARABIC LETTER NOON INITIAL FORM
      DC |  00000648 | ARABIC LETTER WAW
      E0 |  0000005C | REVERSE SOLIDUS
      E2 |  00000053 | LATIN CAPITAL LETTER S
      E3 |  00000054 | LATIN CAPITAL LETTER T
      E4 |  00000055 | LATIN CAPITAL LETTER U
      E5 |  00000056 | LATIN CAPITAL LETTER V
      E6 |  00000057 | LATIN CAPITAL LETTER W
      E7 |  00000058 | LATIN CAPITAL LETTER X
      E8 |  00000059 | LATIN CAPITAL LETTER Y
      E9 |  0000005A | LATIN CAPITAL LETTER Z
      EA |  00000621 | ARABIC LETTER HAMZA
      F0 |  00000030 | DIGIT ZERO
      F1 |  00000031 | DIGIT ONE
      F2 |  00000032 | DIGIT TWO
      F3 |  00000033 | DIGIT THREE
      F4 |  00000034 | DIGIT FOUR
      F5 |  00000035 | DIGIT FIVE
      F6 |  00000036 | DIGIT SIX
      F7 |  00000037 | DIGIT SEVEN
      F8 |  00000038 | DIGIT EIGHT
      F9 |  00000039 | DIGIT NINE
      FD |  00000651 | ARABIC SHADDA
      FE |  0000FE7D | ARABIC SHADDA MEDIAL FORM
      FF |  0000009F | APPLICATION PROGRAM COMMAND (APC)
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_IBM918

    $main::fatpacked{"Locale/RecodeData/IEC_P27_1.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_IEC_P27_1';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for IEC_P27-1.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::IEC_P27_1;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0x0080,
      0x0081,
      0x0082,
      0x0083,
      0x0084,
      0x0085,
      0x0086,
      0x0087,
      0x0088,
      0x0089,
      0x008a,
      0x008b,
      0x008c,
      0x008d,
      0x008e,
      0x008f,
      0x0090,
      0x0091,
      0x0092,
      0x0093,
      0x0094,
      0x0095,
      0x0096,
      0x0097,
      0x0098,
      0x0099,
      0x009a,
      0x009b,
      0x009c,
      0x009d,
      0x009e,
      0x009f,
      0x02c7,
      0x2261,
      0x2227,
      0x2228,
      0x2229,
      0x222a,
      0x2282,
      0x2283,
      0x21d0,
      0x21d2,
      0x2234,
      0x2235,
      0x2208,
      0x220b,
      0x2286,
      0x2287,
      0x222b,
      0x222e,
      0x221e,
      0x2207,
      0x2202,
      0x223c,
      0x2248,
      0x2243,
      0x2245,
      0x2264,
      0x2260,
      0x2265,
      0x2194,
      0x00ac,
      0x2200,
      0x2203,
      0x05d0,
      0x25a1,
      0x2225,
      0x0393,
      0x0394,
      0x22a5,
      0x2220,
      0x221f,
      0x0398,
      0x2329,
      0x232a,
      0x039b,
      0x2032,
      0x2033,
      0x039e,
      0x2213,
      0x03a0,
      0x00b2,
      0x03a3,
      0x00d7,
      0x00b3,
      0x03a5,
      0x03a6,
      0x00b7,
      0x03a8,
      0x03a9,
      0x2205,
      0x21c0,
      0x221a,
      0x0192,
      0x221d,
      0x00b1,
      0x00b0,
      0x03b1,
      0x03b2,
      0x03b3,
      0x03b4,
      0x03b5,
      0x03b6,
      0x03b7,
      0x03b8,
      0x03b9,
      0x03ba,
      0x03bb,
      0x03bc,
      0x03bd,
      0x03be,
      0x2030,
      0x03c0,
      0x03c1,
      0x03c3,
      0x00f7,
      0x03c4,
      0x03c5,
      0x03c6,
      0x03c7,
      0x03c8,
      0x03c9,
      0x2020,
      0x2190,
      0x2191,
      0x2192,
      0x2193,
      0x203e,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xc2\x80",
      "\xc2\x81",
      "\xc2\x82",
      "\xc2\x83",
      "\xc2\x84",
      "\xc2\x85",
      "\xc2\x86",
      "\xc2\x87",
      "\xc2\x88",
      "\xc2\x89",
      "\xc2\x8a",
      "\xc2\x8b",
      "\xc2\x8c",
      "\xc2\x8d",
      "\xc2\x8e",
      "\xc2\x8f",
      "\xc2\x90",
      "\xc2\x91",
      "\xc2\x92",
      "\xc2\x93",
      "\xc2\x94",
      "\xc2\x95",
      "\xc2\x96",
      "\xc2\x97",
      "\xc2\x98",
      "\xc2\x99",
      "\xc2\x9a",
      "\xc2\x9b",
      "\xc2\x9c",
      "\xc2\x9d",
      "\xc2\x9e",
      "\xc2\x9f",
      "\xcb\x87",
      "\xe2\x89\xa1",
      "\xe2\x88\xa7",
      "\xe2\x88\xa8",
      "\xe2\x88\xa9",
      "\xe2\x88\xaa",
      "\xe2\x8a\x82",
      "\xe2\x8a\x83",
      "\xe2\x87\x90",
      "\xe2\x87\x92",
      "\xe2\x88\xb4",
      "\xe2\x88\xb5",
      "\xe2\x88\x88",
      "\xe2\x88\x8b",
      "\xe2\x8a\x86",
      "\xe2\x8a\x87",
      "\xe2\x88\xab",
      "\xe2\x88\xae",
      "\xe2\x88\x9e",
      "\xe2\x88\x87",
      "\xe2\x88\x82",
      "\xe2\x88\xbc",
      "\xe2\x89\x88",
      "\xe2\x89\x83",
      "\xe2\x89\x85",
      "\xe2\x89\xa4",
      "\xe2\x89\xa0",
      "\xe2\x89\xa5",
      "\xe2\x86\x94",
      "\xc2\xac",
      "\xe2\x88\x80",
      "\xe2\x88\x83",
      "\xd7\x90",
      "\xe2\x96\xa1",
      "\xe2\x88\xa5",
      "\xce\x93",
      "\xce\x94",
      "\xe2\x8a\xa5",
      "\xe2\x88\xa0",
      "\xe2\x88\x9f",
      "\xce\x98",
      "\xe2\x8c\xa9",
      "\xe2\x8c\xaa",
      "\xce\x9b",
      "\xe2\x80\xb2",
      "\xe2\x80\xb3",
      "\xce\x9e",
      "\xe2\x88\x93",
      "\xce\xa0",
      "\xc2\xb2",
      "\xce\xa3",
      "\xc3\x97",
      "\xc2\xb3",
      "\xce\xa5",
      "\xce\xa6",
      "\xc2\xb7",
      "\xce\xa8",
      "\xce\xa9",
      "\xe2\x88\x85",
      "\xe2\x87\x80",
      "\xe2\x88\x9a",
      "\xc6\x92",
      "\xe2\x88\x9d",
      "\xc2\xb1",
      "\xc2\xb0",
      "\xce\xb1",
      "\xce\xb2",
      "\xce\xb3",
      "\xce\xb4",
      "\xce\xb5",
      "\xce\xb6",
      "\xce\xb7",
      "\xce\xb8",
      "\xce\xb9",
      "\xce\xba",
      "\xce\xbb",
      "\xce\xbc",
      "\xce\xbd",
      "\xce\xbe",
      "\xe2\x80\xb0",
      "\xcf\x80",
      "\xcf\x81",
      "\xcf\x83",
      "\xc3\xb7",
      "\xcf\x84",
      "\xcf\x85",
      "\xcf\x86",
      "\xcf\x87",
      "\xcf\x88",
      "\xcf\x89",
      "\xe2\x80\xa0",
      "\xe2\x86\x90",
      "\xe2\x86\x91",
      "\xe2\x86\x92",
      "\xe2\x86\x93",
      "\xe2\x80\xbe",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x00000080 => "\x80",
      0x00000081 => "\x81",
      0x00000082 => "\x82",
      0x00000083 => "\x83",
      0x00000084 => "\x84",
      0x00000085 => "\x85",
      0x00000086 => "\x86",
      0x00000087 => "\x87",
      0x00000088 => "\x88",
      0x00000089 => "\x89",
      0x0000008a => "\x8a",
      0x0000008b => "\x8b",
      0x0000008c => "\x8c",
      0x0000008d => "\x8d",
      0x0000008e => "\x8e",
      0x0000008f => "\x8f",
      0x00000090 => "\x90",
      0x00000091 => "\x91",
      0x00000092 => "\x92",
      0x00000093 => "\x93",
      0x00000094 => "\x94",
      0x00000095 => "\x95",
      0x00000096 => "\x96",
      0x00000097 => "\x97",
      0x00000098 => "\x98",
      0x00000099 => "\x99",
      0x0000009a => "\x9a",
      0x0000009b => "\x9b",
      0x0000009c => "\x9c",
      0x0000009d => "\x9d",
      0x0000009e => "\x9e",
      0x0000009f => "\x9f",
      0x000000ac => "\xbd",
      0x000000b0 => "\xe0",
      0x000000b1 => "\xdf",
      0x000000b2 => "\xd1",
      0x000000b3 => "\xd4",
      0x000000b7 => "\xd7",
      0x000000d7 => "\xd3",
      0x000000f7 => "\xf3",
      0x00000192 => "\xdd",
      0x000002c7 => "\xa0",
      0x00000393 => "\xc3",
      0x00000394 => "\xc4",
      0x00000398 => "\xc8",
      0x0000039b => "\xcb",
      0x0000039e => "\xce",
      0x000003a0 => "\xd0",
      0x000003a3 => "\xd2",
      0x000003a5 => "\xd5",
      0x000003a6 => "\xd6",
      0x000003a8 => "\xd8",
      0x000003a9 => "\xd9",
      0x000003b1 => "\xe1",
      0x000003b2 => "\xe2",
      0x000003b3 => "\xe3",
      0x000003b4 => "\xe4",
      0x000003b5 => "\xe5",
      0x000003b6 => "\xe6",
      0x000003b7 => "\xe7",
      0x000003b8 => "\xe8",
      0x000003b9 => "\xe9",
      0x000003ba => "\xea",
      0x000003bb => "\xeb",
      0x000003bc => "\xec",
      0x000003bd => "\xed",
      0x000003be => "\xee",
      0x000003c0 => "\xf0",
      0x000003c1 => "\xf1",
      0x000003c3 => "\xf2",
      0x000003c4 => "\xf4",
      0x000003c5 => "\xf5",
      0x000003c6 => "\xf6",
      0x000003c7 => "\xf7",
      0x000003c8 => "\xf8",
      0x000003c9 => "\xf9",
      0x000005d0 => "\xc0",
      0x00002020 => "\xfa",
      0x00002030 => "\xef",
      0x00002032 => "\xcc",
      0x00002033 => "\xcd",
      0x0000203e => "\xff",
      0x00002190 => "\xfb",
      0x00002191 => "\xfc",
      0x00002192 => "\xfd",
      0x00002193 => "\xfe",
      0x00002194 => "\xbc",
      0x000021c0 => "\xdb",
      0x000021d0 => "\xa8",
      0x000021d2 => "\xa9",
      0x00002200 => "\xbe",
      0x00002202 => "\xb4",
      0x00002203 => "\xbf",
      0x00002205 => "\xda",
      0x00002207 => "\xb3",
      0x00002208 => "\xac",
      0x0000220b => "\xad",
      0x00002213 => "\xcf",
      0x0000221a => "\xdc",
      0x0000221d => "\xde",
      0x0000221e => "\xb2",
      0x0000221f => "\xc7",
      0x00002220 => "\xc6",
      0x00002225 => "\xc2",
      0x00002227 => "\xa2",
      0x00002228 => "\xa3",
      0x00002229 => "\xa4",
      0x0000222a => "\xa5",
      0x0000222b => "\xb0",
      0x0000222e => "\xb1",
      0x00002234 => "\xaa",
      0x00002235 => "\xab",
      0x0000223c => "\xb5",
      0x00002243 => "\xb7",
      0x00002245 => "\xb8",
      0x00002248 => "\xb6",
      0x00002260 => "\xba",
      0x00002261 => "\xa1",
      0x00002264 => "\xb9",
      0x00002265 => "\xbb",
      0x00002282 => "\xa6",
      0x00002283 => "\xa7",
      0x00002286 => "\xae",
      0x00002287 => "\xaf",
      0x000022a5 => "\xc5",
      0x00002329 => "\xc9",
      0x0000232a => "\xca",
      0x000025a1 => "\xc1",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::IEC_P27_1 - Conversion routines for IEC_P27_1
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for IEC_P27-1.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: ECMA registry
   alias ISO-IR-143
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE (DEL)
      80 |  00000080 | PADDING CHARACTER (PAD)
      81 |  00000081 | HIGH OCTET PRESET (HOP)
      82 |  00000082 | BREAK PERMITTED HERE (BPH)
      83 |  00000083 | NO BREAK HERE (NBH)
      84 |  00000084 | INDEX (IND)
      85 |  00000085 | NEXT LINE (NEL)
      86 |  00000086 | START OF SELECTED AREA (SSA)
      87 |  00000087 | END OF SELECTED AREA (ESA)
      88 |  00000088 | CHARACTER TABULATION SET (HTS)
      89 |  00000089 | CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
      8A |  0000008A | LINE TABULATION SET (VTS)
      8B |  0000008B | PARTIAL LINE FORWARD (PLD)
      8C |  0000008C | PARTIAL LINE BACKWARD (PLU)
      8D |  0000008D | REVERSE LINE FEED (RI)
      8E |  0000008E | SINGLE-SHIFT TWO (SS2)
      8F |  0000008F | SINGLE-SHIFT THREE (SS3)
      90 |  00000090 | DEVICE CONTROL STRING (DCS)
      91 |  00000091 | PRIVATE USE ONE (PU1)
      92 |  00000092 | PRIVATE USE TWO (PU2)
      93 |  00000093 | SET TRANSMIT STATE (STS)
      94 |  00000094 | CANCEL CHARACTER (CCH)
      95 |  00000095 | MESSAGE WAITING (MW)
      96 |  00000096 | START OF GUARDED AREA (SPA)
      97 |  00000097 | END OF GUARDED AREA (EPA)
      98 |  00000098 | START OF STRING (SOS)
      99 |  00000099 | SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
      9A |  0000009A | SINGLE CHARACTER INTRODUCER (SCI)
      9B |  0000009B | CONTROL SEQUENCE INTRODUCER (CSI)
      9C |  0000009C | STRING TERMINATOR (ST)
      9D |  0000009D | OPERATING SYSTEM COMMAND (OSC)
      9E |  0000009E | PRIVACY MESSAGE (PM)
      9F |  0000009F | APPLICATION PROGRAM COMMAND (APC)
      A0 |  000002C7 | CARON (Mandarin Chinese third tone)
      A1 |  00002261 | IDENTICAL TO
      A2 |  00002227 | LOGICAL AND
      A3 |  00002228 | LOGICAL OR
      A4 |  00002229 | INTERSECTION
      A5 |  0000222A | UNION
      A6 |  00002282 | SUBSET OF
      A7 |  00002283 | SUPERSET OF
      A8 |  000021D0 | LEFTWARDS DOUBLE ARROW
      A9 |  000021D2 | RIGHTWARDS DOUBLE ARROW
      AA |  00002234 | THEREFORE
      AB |  00002235 | BECAUSE
      AC |  00002208 | ELEMENT OF
      AD |  0000220B | CONTAINS AS MEMBER
      AE |  00002286 | SUBSET OF OR EQUAL TO
      AF |  00002287 | SUPERSET OF OR EQUAL TO
      B0 |  0000222B | INTEGRAL
      B1 |  0000222E | CONTOUR INTEGRAL
      B2 |  0000221E | INFINITY
      B3 |  00002207 | NABLA
      B4 |  00002202 | PARTIAL DIFFERENTIAL
      B5 |  0000223C | TILDE OPERATOR
      B6 |  00002248 | ALMOST EQUAL TO
      B7 |  00002243 | ASYMPTOTICALLY EQUAL TO
      B8 |  00002245 | APPROXIMATELY EQUAL TO
      B9 |  00002264 | LESS-THAN OR EQUAL TO
      BA |  00002260 | NOT EQUAL TO
      BB |  00002265 | GREATER-THAN OR EQUAL TO
      BC |  00002194 | LEFT RIGHT ARROW
      BD |  000000AC | NOT SIGN
      BE |  00002200 | FOR ALL
      BF |  00002203 | THERE EXISTS
      C0 |  000005D0 | HEBREW LETTER ALEF
      C1 |  000025A1 | WHITE SQUARE
      C2 |  00002225 | PARALLEL TO
      C3 |  00000393 | GREEK CAPITAL LETTER GAMMA
      C4 |  00000394 | GREEK CAPITAL LETTER DELTA
      C5 |  000022A5 | UP TACK
      C6 |  00002220 | ANGLE
      C7 |  0000221F | RIGHT ANGLE
      C8 |  00000398 | GREEK CAPITAL LETTER THETA
      C9 |  00002329 | LEFT-POINTING ANGLE BRACKET
      CA |  0000232A | RIGHT-POINTING ANGLE BRACKET
      CB |  0000039B | GREEK CAPITAL LETTER LAMDA
      CC |  00002032 | PRIME
      CD |  00002033 | DOUBLE PRIME
      CE |  0000039E | GREEK CAPITAL LETTER XI
      CF |  00002213 | MINUS-OR-PLUS SIGN
      D0 |  000003A0 | GREEK CAPITAL LETTER PI
      D1 |  000000B2 | SUPERSCRIPT TWO
      D2 |  000003A3 | GREEK CAPITAL LETTER SIGMA
      D3 |  000000D7 | MULTIPLICATION SIGN
      D4 |  000000B3 | SUPERSCRIPT THREE
      D5 |  000003A5 | GREEK CAPITAL LETTER UPSILON
      D6 |  000003A6 | GREEK CAPITAL LETTER PHI
      D7 |  000000B7 | MIDDLE DOT
      D8 |  000003A8 | GREEK CAPITAL LETTER PSI
      D9 |  000003A9 | GREEK CAPITAL LETTER OMEGA
      DA |  00002205 | EMPTY SET
      DB |  000021C0 | RIGHTWARDS HARPOON WITH BARB UPWARDS
      DC |  0000221A | SQUARE ROOT
      DD |  00000192 | LATIN SMALL LETTER F WITH HOOK
      DE |  0000221D | PROPORTIONAL TO
      DF |  000000B1 | PLUS-MINUS SIGN
      E0 |  000000B0 | DEGREE SIGN
      E1 |  000003B1 | GREEK SMALL LETTER ALPHA
      E2 |  000003B2 | GREEK SMALL LETTER BETA
      E3 |  000003B3 | GREEK SMALL LETTER GAMMA
      E4 |  000003B4 | GREEK SMALL LETTER DELTA
      E5 |  000003B5 | GREEK SMALL LETTER EPSILON
      E6 |  000003B6 | GREEK SMALL LETTER ZETA
      E7 |  000003B7 | GREEK SMALL LETTER ETA
      E8 |  000003B8 | GREEK SMALL LETTER THETA
      E9 |  000003B9 | GREEK SMALL LETTER IOTA
      EA |  000003BA | GREEK SMALL LETTER KAPPA
      EB |  000003BB | GREEK SMALL LETTER LAMDA
      EC |  000003BC | GREEK SMALL LETTER MU
      ED |  000003BD | GREEK SMALL LETTER NU
      EE |  000003BE | GREEK SMALL LETTER XI
      EF |  00002030 | PER MILLE SIGN
      F0 |  000003C0 | GREEK SMALL LETTER PI
      F1 |  000003C1 | GREEK SMALL LETTER RHO
      F2 |  000003C3 | GREEK SMALL LETTER SIGMA
      F3 |  000000F7 | DIVISION SIGN
      F4 |  000003C4 | GREEK SMALL LETTER TAU
      F5 |  000003C5 | GREEK SMALL LETTER UPSILON
      F6 |  000003C6 | GREEK SMALL LETTER PHI
      F7 |  000003C7 | GREEK SMALL LETTER CHI
      F8 |  000003C8 | GREEK SMALL LETTER PSI
      F9 |  000003C9 | GREEK SMALL LETTER OMEGA
      FA |  00002020 | DAGGER
      FB |  00002190 | LEFTWARDS ARROW
      FC |  00002191 | UPWARDS ARROW
      FD |  00002192 | RIGHTWARDS ARROW
      FE |  00002193 | DOWNWARDS ARROW
      FF |  0000203E | OVERLINE
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_IEC_P27_1

    $main::fatpacked{"Locale/RecodeData/INIS.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_INIS';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for INIS.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::INIS;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0024,
      0x0025,
      0xfffd,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0xfffd,
      0xfffd,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0xfffd,
      0x005d,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0xfffd,
      0x007c,
      0xfffd,
      0xfffd,
      0x007f,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x24",
      "\x25",
      "\xef\xbf\xbd",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\xef\xbf\xbd",
      "\x5d",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\xef\xbf\xbd",
      "\x7c",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x7f",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005d => "\x5d",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007c => "\x7c",
      0x0000007f => "\x7f",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::INIS - Conversion routines for INIS
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for INIS.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: ECMA registry
   alias ISO-IR-49
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5D |  0000005D | RIGHT SQUARE BRACKET
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7C |  0000007C | VERTICAL LINE
      7F |  0000007F | DELETE (DEL)
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_INIS

    $main::fatpacked{"Locale/RecodeData/INIS_8.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_INIS_8';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for INIS-8.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::INIS_8;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x03b1,
      0x03b2,
      0x03b3,
      0x03b4,
      0x039e,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x2192,
      0x222b,
      0x2070,
      0x00b9,
      0x00b2,
      0x00b3,
      0x2074,
      0x2075,
      0x2076,
      0x2077,
      0x2078,
      0x2079,
      0x207a,
      0x207b,
      0x30eb,
      0x0394,
      0x039b,
      0x03a9,
      0x2080,
      0x2081,
      0x2082,
      0x2083,
      0x2084,
      0x2085,
      0x2086,
      0x2087,
      0x2088,
      0x2089,
      0x03a3,
      0x03bc,
      0x03bd,
      0x03c9,
      0x03c0,
      0x007f,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xce\xb1",
      "\xce\xb2",
      "\xce\xb3",
      "\xce\xb4",
      "\xce\x9e",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xe2\x86\x92",
      "\xe2\x88\xab",
      "\xe2\x81\xb0",
      "\xc2\xb9",
      "\xc2\xb2",
      "\xc2\xb3",
      "\xe2\x81\xb4",
      "\xe2\x81\xb5",
      "\xe2\x81\xb6",
      "\xe2\x81\xb7",
      "\xe2\x81\xb8",
      "\xe2\x81\xb9",
      "\xe2\x81\xba",
      "\xe2\x81\xbb",
      "\xe3\x83\xab",
      "\xce\x94",
      "\xce\x9b",
      "\xce\xa9",
      "\xe2\x82\x80",
      "\xe2\x82\x81",
      "\xe2\x82\x82",
      "\xe2\x82\x83",
      "\xe2\x82\x84",
      "\xe2\x82\x85",
      "\xe2\x82\x86",
      "\xe2\x82\x87",
      "\xe2\x82\x88",
      "\xe2\x82\x89",
      "\xce\xa3",
      "\xce\xbc",
      "\xce\xbd",
      "\xcf\x89",
      "\xcf\x80",
      "\x7f",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x0000007f => "\x7f",
      0x000000b2 => "\x62",
      0x000000b3 => "\x63",
      0x000000b9 => "\x61",
      0x00000394 => "\x6d",
      0x0000039b => "\x6e",
      0x0000039e => "\x3e",
      0x000003a3 => "\x7a",
      0x000003a9 => "\x6f",
      0x000003b1 => "\x3a",
      0x000003b2 => "\x3b",
      0x000003b3 => "\x3c",
      0x000003b4 => "\x3d",
      0x000003bc => "\x7b",
      0x000003bd => "\x7c",
      0x000003c0 => "\x7e",
      0x000003c9 => "\x7d",
      0x00002070 => "\x60",
      0x00002074 => "\x64",
      0x00002075 => "\x65",
      0x00002076 => "\x66",
      0x00002077 => "\x67",
      0x00002078 => "\x68",
      0x00002079 => "\x69",
      0x0000207a => "\x6a",
      0x0000207b => "\x6b",
      0x00002080 => "\x70",
      0x00002081 => "\x71",
      0x00002082 => "\x72",
      0x00002083 => "\x73",
      0x00002084 => "\x74",
      0x00002085 => "\x75",
      0x00002086 => "\x76",
      0x00002087 => "\x77",
      0x00002088 => "\x78",
      0x00002089 => "\x79",
      0x00002192 => "\x5e",
      0x0000222b => "\x5f",
      0x000030eb => "\x6c",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::INIS_8 - Conversion routines for INIS_8
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for INIS-8.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
   repertoiremap: mnemonic,ds
    source: ECMA registry
   alias ISO-IR-50
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      3A |  000003B1 | GREEK SMALL LETTER ALPHA
      3B |  000003B2 | GREEK SMALL LETTER BETA
      3C |  000003B3 | GREEK SMALL LETTER GAMMA
      3D |  000003B4 | GREEK SMALL LETTER DELTA
      3E |  0000039E | GREEK CAPITAL LETTER XI
      5E |  00002192 | RIGHTWARDS ARROW
      5F |  0000222B | INTEGRAL
      60 |  00002070 | SUPERSCRIPT ZERO
      61 |  000000B9 | SUPERSCRIPT ONE
      62 |  000000B2 | SUPERSCRIPT TWO
      63 |  000000B3 | SUPERSCRIPT THREE
      64 |  00002074 | SUPERSCRIPT FOUR
      65 |  00002075 | SUPERSCRIPT FIVE
      66 |  00002076 | SUPERSCRIPT SIX
      67 |  00002077 | SUPERSCRIPT SEVEN
      68 |  00002078 | SUPERSCRIPT EIGHT
      69 |  00002079 | SUPERSCRIPT NINE
      6A |  0000207A | SUPERSCRIPT PLUS SIGN
      6B |  0000207B | SUPERSCRIPT MINUS
      6C |  000030EB | KATAKANA LETTER RU
      6D |  00000394 | GREEK CAPITAL LETTER DELTA
      6E |  0000039B | GREEK CAPITAL LETTER LAMDA
      6F |  000003A9 | GREEK CAPITAL LETTER OMEGA
      70 |  00002080 | SUBSCRIPT ZERO
      71 |  00002081 | SUBSCRIPT ONE
      72 |  00002082 | SUBSCRIPT TWO
      73 |  00002083 | SUBSCRIPT THREE
      74 |  00002084 | SUBSCRIPT FOUR
      75 |  00002085 | SUBSCRIPT FIVE
      76 |  00002086 | SUBSCRIPT SIX
      77 |  00002087 | SUBSCRIPT SEVEN
      78 |  00002088 | SUBSCRIPT EIGHT
      79 |  00002089 | SUBSCRIPT NINE
      7A |  000003A3 | GREEK CAPITAL LETTER SIGMA
      7B |  000003BC | GREEK SMALL LETTER MU
      7C |  000003BD | GREEK SMALL LETTER NU
      7D |  000003C9 | GREEK SMALL LETTER OMEGA
      7E |  000003C0 | GREEK SMALL LETTER PI
      7F |  0000007F | DELETE (DEL)
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_INIS_8

    $main::fatpacked{"Locale/RecodeData/INIS_CYRILLIC.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_INIS_CYRILLIC';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for INIS-CYRILLIC.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::INIS_CYRILLIC;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x221a,
      0xfffd,
      0x2192,
      0x222b,
      0x03b1,
      0x03b2,
      0x03b3,
      0x03b4,
      0x03a3,
      0x03bc,
      0x03bd,
      0x03c9,
      0x03c0,
      0x039e,
      0x0394,
      0x039b,
      0x03a9,
      0x042a,
      0x207b,
      0x207a,
      0x044e,
      0x0430,
      0x0431,
      0x0446,
      0x0434,
      0x0435,
      0x0444,
      0x0433,
      0x0445,
      0x0438,
      0x0439,
      0x043a,
      0x043b,
      0x043c,
      0x043d,
      0x043e,
      0x043f,
      0x044f,
      0x0440,
      0x0441,
      0x0442,
      0x0443,
      0x0436,
      0x0432,
      0x044c,
      0x044b,
      0x0437,
      0x0448,
      0x044d,
      0x0449,
      0x0447,
      0x044a,
      0x042e,
      0x0410,
      0x0411,
      0x0426,
      0x0414,
      0x0415,
      0x0424,
      0x0413,
      0x0425,
      0x0418,
      0x0419,
      0x041a,
      0x041b,
      0x041c,
      0x041d,
      0x041e,
      0x041f,
      0x042f,
      0x0420,
      0x0421,
      0x0422,
      0x0423,
      0x0416,
      0x0412,
      0x042c,
      0x042b,
      0x0417,
      0x0428,
      0x042d,
      0x0429,
      0x0427,
      0x007f,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xe2\x88\x9a",
      "\xef\xbf\xbd",
      "\xe2\x86\x92",
      "\xe2\x88\xab",
      "\xce\xb1",
      "\xce\xb2",
      "\xce\xb3",
      "\xce\xb4",
      "\xce\xa3",
      "\xce\xbc",
      "\xce\xbd",
      "\xcf\x89",
      "\xcf\x80",
      "\xce\x9e",
      "\xce\x94",
      "\xce\x9b",
      "\xce\xa9",
      "\xd0\xaa",
      "\xe2\x81\xbb",
      "\xe2\x81\xba",
      "\xd1\x8e",
      "\xd0\xb0",
      "\xd0\xb1",
      "\xd1\x86",
      "\xd0\xb4",
      "\xd0\xb5",
      "\xd1\x84",
      "\xd0\xb3",
      "\xd1\x85",
      "\xd0\xb8",
      "\xd0\xb9",
      "\xd0\xba",
      "\xd0\xbb",
      "\xd0\xbc",
      "\xd0\xbd",
      "\xd0\xbe",
      "\xd0\xbf",
      "\xd1\x8f",
      "\xd1\x80",
      "\xd1\x81",
      "\xd1\x82",
      "\xd1\x83",
      "\xd0\xb6",
      "\xd0\xb2",
      "\xd1\x8c",
      "\xd1\x8b",
      "\xd0\xb7",
      "\xd1\x88",
      "\xd1\x8d",
      "\xd1\x89",
      "\xd1\x87",
      "\xd1\x8a",
      "\xd0\xae",
      "\xd0\x90",
      "\xd0\x91",
      "\xd0\xa6",
      "\xd0\x94",
      "\xd0\x95",
      "\xd0\xa4",
      "\xd0\x93",
      "\xd0\xa5",
      "\xd0\x98",
      "\xd0\x99",
      "\xd0\x9a",
      "\xd0\x9b",
      "\xd0\x9c",
      "\xd0\x9d",
      "\xd0\x9e",
      "\xd0\x9f",
      "\xd0\xaf",
      "\xd0\xa0",
      "\xd0\xa1",
      "\xd0\xa2",
      "\xd0\xa3",
      "\xd0\x96",
      "\xd0\x92",
      "\xd0\xac",
      "\xd0\xab",
      "\xd0\x97",
      "\xd0\xa8",
      "\xd0\xad",
      "\xd0\xa9",
      "\xd0\xa7",
      "\x7f",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x0000007f => "\x7f",
      0x00000394 => "\x3a",
      0x0000039b => "\x3b",
      0x0000039e => "\x39",
      0x000003a3 => "\x34",
      0x000003a9 => "\x3c",
      0x000003b1 => "\x30",
      0x000003b2 => "\x31",
      0x000003b3 => "\x32",
      0x000003b4 => "\x33",
      0x000003bc => "\x35",
      0x000003bd => "\x36",
      0x000003c0 => "\x38",
      0x000003c9 => "\x37",
      0x00000410 => "\x61",
      0x00000411 => "\x62",
      0x00000412 => "\x77",
      0x00000413 => "\x67",
      0x00000414 => "\x64",
      0x00000415 => "\x65",
      0x00000416 => "\x76",
      0x00000417 => "\x7a",
      0x00000418 => "\x69",
      0x00000419 => "\x6a",
      0x0000041a => "\x6b",
      0x0000041b => "\x6c",
      0x0000041c => "\x6d",
      0x0000041d => "\x6e",
      0x0000041e => "\x6f",
      0x0000041f => "\x70",
      0x00000420 => "\x72",
      0x00000421 => "\x73",
      0x00000422 => "\x74",
      0x00000423 => "\x75",
      0x00000424 => "\x66",
      0x00000425 => "\x68",
      0x00000426 => "\x63",
      0x00000427 => "\x7e",
      0x00000428 => "\x7b",
      0x00000429 => "\x7d",
      0x0000042a => "\x3d",
      0x0000042b => "\x79",
      0x0000042c => "\x78",
      0x0000042d => "\x7c",
      0x0000042e => "\x60",
      0x0000042f => "\x71",
      0x00000430 => "\x41",
      0x00000431 => "\x42",
      0x00000432 => "\x57",
      0x00000433 => "\x47",
      0x00000434 => "\x44",
      0x00000435 => "\x45",
      0x00000436 => "\x56",
      0x00000437 => "\x5a",
      0x00000438 => "\x49",
      0x00000439 => "\x4a",
      0x0000043a => "\x4b",
      0x0000043b => "\x4c",
      0x0000043c => "\x4d",
      0x0000043d => "\x4e",
      0x0000043e => "\x4f",
      0x0000043f => "\x50",
      0x00000440 => "\x52",
      0x00000441 => "\x53",
      0x00000442 => "\x54",
      0x00000443 => "\x55",
      0x00000444 => "\x46",
      0x00000445 => "\x48",
      0x00000446 => "\x43",
      0x00000447 => "\x5e",
      0x00000448 => "\x5b",
      0x00000449 => "\x5d",
      0x0000044a => "\x5f",
      0x0000044b => "\x59",
      0x0000044c => "\x58",
      0x0000044d => "\x5c",
      0x0000044e => "\x40",
      0x0000044f => "\x51",
      0x0000207a => "\x3f",
      0x0000207b => "\x3e",
      0x00002192 => "\x2e",
      0x0000221a => "\x2c",
      0x0000222b => "\x2f",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::INIS_CYRILLIC - Conversion routines for INIS_CYRILLIC
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for INIS-CYRILLIC.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: ECMA registry
   alias ISO-IR-51
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      2C |  0000221A | SQUARE ROOT
      2E |  00002192 | RIGHTWARDS ARROW
      2F |  0000222B | INTEGRAL
      30 |  000003B1 | GREEK SMALL LETTER ALPHA
      31 |  000003B2 | GREEK SMALL LETTER BETA
      32 |  000003B3 | GREEK SMALL LETTER GAMMA
      33 |  000003B4 | GREEK SMALL LETTER DELTA
      34 |  000003A3 | GREEK CAPITAL LETTER SIGMA
      35 |  000003BC | GREEK SMALL LETTER MU
      36 |  000003BD | GREEK SMALL LETTER NU
      37 |  000003C9 | GREEK SMALL LETTER OMEGA
      38 |  000003C0 | GREEK SMALL LETTER PI
      39 |  0000039E | GREEK CAPITAL LETTER XI
      3A |  00000394 | GREEK CAPITAL LETTER DELTA
      3B |  0000039B | GREEK CAPITAL LETTER LAMDA
      3C |  000003A9 | GREEK CAPITAL LETTER OMEGA
      3D |  0000042A | CYRILLIC CAPITAL LETTER HARD SIGN
      3E |  0000207B | SUPERSCRIPT MINUS
      3F |  0000207A | SUPERSCRIPT PLUS SIGN
      40 |  0000044E | CYRILLIC SMALL LETTER YU
      41 |  00000430 | CYRILLIC SMALL LETTER A
      42 |  00000431 | CYRILLIC SMALL LETTER BE
      43 |  00000446 | CYRILLIC SMALL LETTER TSE
      44 |  00000434 | CYRILLIC SMALL LETTER DE
      45 |  00000435 | CYRILLIC SMALL LETTER IE
      46 |  00000444 | CYRILLIC SMALL LETTER EF
      47 |  00000433 | CYRILLIC SMALL LETTER GHE
      48 |  00000445 | CYRILLIC SMALL LETTER HA
      49 |  00000438 | CYRILLIC SMALL LETTER I
      4A |  00000439 | CYRILLIC SMALL LETTER SHORT I
      4B |  0000043A | CYRILLIC SMALL LETTER KA
      4C |  0000043B | CYRILLIC SMALL LETTER EL
      4D |  0000043C | CYRILLIC SMALL LETTER EM
      4E |  0000043D | CYRILLIC SMALL LETTER EN
      4F |  0000043E | CYRILLIC SMALL LETTER O
      50 |  0000043F | CYRILLIC SMALL LETTER PE
      51 |  0000044F | CYRILLIC SMALL LETTER YA
      52 |  00000440 | CYRILLIC SMALL LETTER ER
      53 |  00000441 | CYRILLIC SMALL LETTER ES
      54 |  00000442 | CYRILLIC SMALL LETTER TE
      55 |  00000443 | CYRILLIC SMALL LETTER U
      56 |  00000436 | CYRILLIC SMALL LETTER ZHE
      57 |  00000432 | CYRILLIC SMALL LETTER VE
      58 |  0000044C | CYRILLIC SMALL LETTER SOFT SIGN
      59 |  0000044B | CYRILLIC SMALL LETTER YERU
      5A |  00000437 | CYRILLIC SMALL LETTER ZE
      5B |  00000448 | CYRILLIC SMALL LETTER SHA
      5C |  0000044D | CYRILLIC SMALL LETTER E
      5D |  00000449 | CYRILLIC SMALL LETTER SHCHA
      5E |  00000447 | CYRILLIC SMALL LETTER CHE
      5F |  0000044A | CYRILLIC SMALL LETTER HARD SIGN
      60 |  0000042E | CYRILLIC CAPITAL LETTER YU
      61 |  00000410 | CYRILLIC CAPITAL LETTER A
      62 |  00000411 | CYRILLIC CAPITAL LETTER BE
      63 |  00000426 | CYRILLIC CAPITAL LETTER TSE
      64 |  00000414 | CYRILLIC CAPITAL LETTER DE
      65 |  00000415 | CYRILLIC CAPITAL LETTER IE
      66 |  00000424 | CYRILLIC CAPITAL LETTER EF
      67 |  00000413 | CYRILLIC CAPITAL LETTER GHE
      68 |  00000425 | CYRILLIC CAPITAL LETTER HA
      69 |  00000418 | CYRILLIC CAPITAL LETTER I
      6A |  00000419 | CYRILLIC CAPITAL LETTER SHORT I
      6B |  0000041A | CYRILLIC CAPITAL LETTER KA
      6C |  0000041B | CYRILLIC CAPITAL LETTER EL
      6D |  0000041C | CYRILLIC CAPITAL LETTER EM
      6E |  0000041D | CYRILLIC CAPITAL LETTER EN
      6F |  0000041E | CYRILLIC CAPITAL LETTER O
      70 |  0000041F | CYRILLIC CAPITAL LETTER PE
      71 |  0000042F | CYRILLIC CAPITAL LETTER YA
      72 |  00000420 | CYRILLIC CAPITAL LETTER ER
      73 |  00000421 | CYRILLIC CAPITAL LETTER ES
      74 |  00000422 | CYRILLIC CAPITAL LETTER TE
      75 |  00000423 | CYRILLIC CAPITAL LETTER U
      76 |  00000416 | CYRILLIC CAPITAL LETTER ZHE
      77 |  00000412 | CYRILLIC CAPITAL LETTER VE
      78 |  0000042C | CYRILLIC CAPITAL LETTER SOFT SIGN
      79 |  0000042B | CYRILLIC CAPITAL LETTER YERU
      7A |  00000417 | CYRILLIC CAPITAL LETTER ZE
      7B |  00000428 | CYRILLIC CAPITAL LETTER SHA
      7C |  0000042D | CYRILLIC CAPITAL LETTER E
      7D |  00000429 | CYRILLIC CAPITAL LETTER SHCHA
      7E |  00000427 | CYRILLIC CAPITAL LETTER CHE
      7F |  0000007F | DELETE (DEL)
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_INIS_CYRILLIC

    $main::fatpacked{"Locale/RecodeData/ISO_10367_BOX.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_ISO_10367_BOX';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for ISO_10367-BOX.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::ISO_10367_BOX;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0x0080,
      0x0081,
      0x0082,
      0x0083,
      0x0084,
      0x0085,
      0x0086,
      0x0087,
      0x0088,
      0x0089,
      0x008a,
      0x008b,
      0x008c,
      0x008d,
      0x008e,
      0x008f,
      0x0090,
      0x0091,
      0x0092,
      0x0093,
      0x0094,
      0x0095,
      0x0096,
      0x0097,
      0x0098,
      0x0099,
      0x009a,
      0x009b,
      0x009c,
      0x009d,
      0x009e,
      0x009f,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x2551,
      0x2550,
      0x2554,
      0x2557,
      0x255a,
      0x255d,
      0x2560,
      0x2563,
      0x2566,
      0x2569,
      0x256c,
      0xe019,
      0x2584,
      0x2588,
      0x25aa,
      0xfffd,
      0x2502,
      0x2500,
      0x250c,
      0x2510,
      0x2514,
      0x2518,
      0x251c,
      0x2524,
      0x252c,
      0x2534,
      0x253c,
      0x2591,
      0x2592,
      0x2593,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xc2\x80",
      "\xc2\x81",
      "\xc2\x82",
      "\xc2\x83",
      "\xc2\x84",
      "\xc2\x85",
      "\xc2\x86",
      "\xc2\x87",
      "\xc2\x88",
      "\xc2\x89",
      "\xc2\x8a",
      "\xc2\x8b",
      "\xc2\x8c",
      "\xc2\x8d",
      "\xc2\x8e",
      "\xc2\x8f",
      "\xc2\x90",
      "\xc2\x91",
      "\xc2\x92",
      "\xc2\x93",
      "\xc2\x94",
      "\xc2\x95",
      "\xc2\x96",
      "\xc2\x97",
      "\xc2\x98",
      "\xc2\x99",
      "\xc2\x9a",
      "\xc2\x9b",
      "\xc2\x9c",
      "\xc2\x9d",
      "\xc2\x9e",
      "\xc2\x9f",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xe2\x95\x91",
      "\xe2\x95\x90",
      "\xe2\x95\x94",
      "\xe2\x95\x97",
      "\xe2\x95\x9a",
      "\xe2\x95\x9d",
      "\xe2\x95\xa0",
      "\xe2\x95\xa3",
      "\xe2\x95\xa6",
      "\xe2\x95\xa9",
      "\xe2\x95\xac",
      "\xee\x80\x99",
      "\xe2\x96\x84",
      "\xe2\x96\x88",
      "\xe2\x96\xaa",
      "\xef\xbf\xbd",
      "\xe2\x94\x82",
      "\xe2\x94\x80",
      "\xe2\x94\x8c",
      "\xe2\x94\x90",
      "\xe2\x94\x94",
      "\xe2\x94\x98",
      "\xe2\x94\x9c",
      "\xe2\x94\xa4",
      "\xe2\x94\xac",
      "\xe2\x94\xb4",
      "\xe2\x94\xbc",
      "\xe2\x96\x91",
      "\xe2\x96\x92",
      "\xe2\x96\x93",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x00000080 => "\x80",
      0x00000081 => "\x81",
      0x00000082 => "\x82",
      0x00000083 => "\x83",
      0x00000084 => "\x84",
      0x00000085 => "\x85",
      0x00000086 => "\x86",
      0x00000087 => "\x87",
      0x00000088 => "\x88",
      0x00000089 => "\x89",
      0x0000008a => "\x8a",
      0x0000008b => "\x8b",
      0x0000008c => "\x8c",
      0x0000008d => "\x8d",
      0x0000008e => "\x8e",
      0x0000008f => "\x8f",
      0x00000090 => "\x90",
      0x00000091 => "\x91",
      0x00000092 => "\x92",
      0x00000093 => "\x93",
      0x00000094 => "\x94",
      0x00000095 => "\x95",
      0x00000096 => "\x96",
      0x00000097 => "\x97",
      0x00000098 => "\x98",
      0x00000099 => "\x99",
      0x0000009a => "\x9a",
      0x0000009b => "\x9b",
      0x0000009c => "\x9c",
      0x0000009d => "\x9d",
      0x0000009e => "\x9e",
      0x0000009f => "\x9f",
      0x00002500 => "\xd1",
      0x00002502 => "\xd0",
      0x0000250c => "\xd2",
      0x00002510 => "\xd3",
      0x00002514 => "\xd4",
      0x00002518 => "\xd5",
      0x0000251c => "\xd6",
      0x00002524 => "\xd7",
      0x0000252c => "\xd8",
      0x00002534 => "\xd9",
      0x0000253c => "\xda",
      0x00002550 => "\xc1",
      0x00002551 => "\xc0",
      0x00002554 => "\xc2",
      0x00002557 => "\xc3",
      0x0000255a => "\xc4",
      0x0000255d => "\xc5",
      0x00002560 => "\xc6",
      0x00002563 => "\xc7",
      0x00002566 => "\xc8",
      0x00002569 => "\xc9",
      0x0000256c => "\xca",
      0x00002584 => "\xcc",
      0x00002588 => "\xcd",
      0x00002591 => "\xdb",
      0x00002592 => "\xdc",
      0x00002593 => "\xdd",
      0x000025aa => "\xce",
      0x0000e019 => "\xcb",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::ISO_10367_BOX - Conversion routines for ISO_10367_BOX
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for ISO_10367-BOX.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: ECMA registry
   alias ISO-IR-155
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE (DEL)
      80 |  00000080 | PADDING CHARACTER (PAD)
      81 |  00000081 | HIGH OCTET PRESET (HOP)
      82 |  00000082 | BREAK PERMITTED HERE (BPH)
      83 |  00000083 | NO BREAK HERE (NBH)
      84 |  00000084 | INDEX (IND)
      85 |  00000085 | NEXT LINE (NEL)
      86 |  00000086 | START OF SELECTED AREA (SSA)
      87 |  00000087 | END OF SELECTED AREA (ESA)
      88 |  00000088 | CHARACTER TABULATION SET (HTS)
      89 |  00000089 | CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
      8A |  0000008A | LINE TABULATION SET (VTS)
      8B |  0000008B | PARTIAL LINE FORWARD (PLD)
      8C |  0000008C | PARTIAL LINE BACKWARD (PLU)
      8D |  0000008D | REVERSE LINE FEED (RI)
      8E |  0000008E | SINGLE-SHIFT TWO (SS2)
      8F |  0000008F | SINGLE-SHIFT THREE (SS3)
      90 |  00000090 | DEVICE CONTROL STRING (DCS)
      91 |  00000091 | PRIVATE USE ONE (PU1)
      92 |  00000092 | PRIVATE USE TWO (PU2)
      93 |  00000093 | SET TRANSMIT STATE (STS)
      94 |  00000094 | CANCEL CHARACTER (CCH)
      95 |  00000095 | MESSAGE WAITING (MW)
      96 |  00000096 | START OF GUARDED AREA (SPA)
      97 |  00000097 | END OF GUARDED AREA (EPA)
      98 |  00000098 | START OF STRING (SOS)
      99 |  00000099 | SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
      9A |  0000009A | SINGLE CHARACTER INTRODUCER (SCI)
      9B |  0000009B | CONTROL SEQUENCE INTRODUCER (CSI)
      9C |  0000009C | STRING TERMINATOR (ST)
      9D |  0000009D | OPERATING SYSTEM COMMAND (OSC)
      9E |  0000009E | PRIVACY MESSAGE (PM)
      9F |  0000009F | APPLICATION PROGRAM COMMAND (APC)
      C0 |  00002551 | BOX DRAWINGS DOUBLE VERTICAL
      C1 |  00002550 | BOX DRAWINGS DOUBLE HORIZONTAL
      C2 |  00002554 | BOX DRAWINGS DOUBLE DOWN AND RIGHT
      C3 |  00002557 | BOX DRAWINGS DOUBLE DOWN AND LEFT
      C4 |  0000255A | BOX DRAWINGS DOUBLE UP AND RIGHT
      C5 |  0000255D | BOX DRAWINGS DOUBLE UP AND LEFT
      C6 |  00002560 | BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
      C7 |  00002563 | BOX DRAWINGS DOUBLE VERTICAL AND LEFT
      C8 |  00002566 | BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
      C9 |  00002569 | BOX DRAWINGS DOUBLE UP AND HORIZONTAL
      CA |  0000256C | BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
      CB |  0000E019 | Unit space B E<lt>ISO-IR-8-1_60E<gt>
      CC |  00002584 | LOWER HALF BLOCK
      CD |  00002588 | FULL BLOCK
      CE |  000025AA | BLACK SMALL SQUARE
      D0 |  00002502 | BOX DRAWINGS LIGHT VERTICAL
      D1 |  00002500 | BOX DRAWINGS LIGHT HORIZONTAL
      D2 |  0000250C | BOX DRAWINGS LIGHT DOWN AND RIGHT
      D3 |  00002510 | BOX DRAWINGS LIGHT DOWN AND LEFT
      D4 |  00002514 | BOX DRAWINGS LIGHT UP AND RIGHT
      D5 |  00002518 | BOX DRAWINGS LIGHT UP AND LEFT
      D6 |  0000251C | BOX DRAWINGS LIGHT VERTICAL AND RIGHT
      D7 |  00002524 | BOX DRAWINGS LIGHT VERTICAL AND LEFT
      D8 |  0000252C | BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
      D9 |  00002534 | BOX DRAWINGS LIGHT UP AND HORIZONTAL
      DA |  0000253C | BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
      DB |  00002591 | LIGHT SHADE
      DC |  00002592 | MEDIUM SHADE
      DD |  00002593 | DARK SHADE
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_ISO_10367_BOX

    $main::fatpacked{"Locale/RecodeData/ISO_2033_1983.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_ISO_2033_1983';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for ISO_2033-1983.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::ISO_2033_1983;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x2446,
      0x2447,
      0x2448,
      0x2449,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x007f,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\xe2\x91\x86",
      "\xe2\x91\x87",
      "\xe2\x91\x88",
      "\xe2\x91\x89",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x7f",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000007f => "\x7f",
      0x00002446 => "\x3a",
      0x00002447 => "\x3b",
      0x00002448 => "\x3c",
      0x00002449 => "\x3d",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::ISO_2033_1983 - Conversion routines for ISO_2033_1983
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for ISO_2033-1983.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
   repertoiremap: mnemonic,ds
    source: ECMA registry
   alias ISO-IR-98
   alias E13B
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  00002446 | OCR BRANCH BANK IDENTIFICATION
      3B |  00002447 | OCR AMOUNT OF CHECK
      3C |  00002448 | OCR DASH
      3D |  00002449 | OCR CUSTOMER ACCOUNT NUMBER
      7F |  0000007F | DELETE (DEL)
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_ISO_2033_1983

    $main::fatpacked{"Locale/RecodeData/ISO_5427.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_ISO_5427';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for ISO_5427.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::ISO_5427;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x00a4,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x044e,
      0x0430,
      0x0431,
      0x0446,
      0x0434,
      0x0435,
      0x0444,
      0x0433,
      0x0445,
      0x0438,
      0x0439,
      0x043a,
      0x043b,
      0x043c,
      0x043d,
      0x043e,
      0x043f,
      0x044f,
      0x0440,
      0x0441,
      0x0442,
      0x0443,
      0x0436,
      0x0432,
      0x044c,
      0x044b,
      0x0437,
      0x0448,
      0x044d,
      0x0449,
      0x0447,
      0x044a,
      0x042e,
      0x0410,
      0x0411,
      0x0426,
      0x0414,
      0x0415,
      0x0424,
      0x0413,
      0x0425,
      0x0418,
      0x0419,
      0x041a,
      0x041b,
      0x041c,
      0x041d,
      0x041e,
      0x041f,
      0x042f,
      0x0420,
      0x0421,
      0x0422,
      0x0423,
      0x0416,
      0x0412,
      0x042c,
      0x042b,
      0x0417,
      0x0428,
      0x042d,
      0x0429,
      0x0427,
      0x007f,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\xc2\xa4",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\xd1\x8e",
      "\xd0\xb0",
      "\xd0\xb1",
      "\xd1\x86",
      "\xd0\xb4",
      "\xd0\xb5",
      "\xd1\x84",
      "\xd0\xb3",
      "\xd1\x85",
      "\xd0\xb8",
      "\xd0\xb9",
      "\xd0\xba",
      "\xd0\xbb",
      "\xd0\xbc",
      "\xd0\xbd",
      "\xd0\xbe",
      "\xd0\xbf",
      "\xd1\x8f",
      "\xd1\x80",
      "\xd1\x81",
      "\xd1\x82",
      "\xd1\x83",
      "\xd0\xb6",
      "\xd0\xb2",
      "\xd1\x8c",
      "\xd1\x8b",
      "\xd0\xb7",
      "\xd1\x88",
      "\xd1\x8d",
      "\xd1\x89",
      "\xd1\x87",
      "\xd1\x8a",
      "\xd0\xae",
      "\xd0\x90",
      "\xd0\x91",
      "\xd0\xa6",
      "\xd0\x94",
      "\xd0\x95",
      "\xd0\xa4",
      "\xd0\x93",
      "\xd0\xa5",
      "\xd0\x98",
      "\xd0\x99",
      "\xd0\x9a",
      "\xd0\x9b",
      "\xd0\x9c",
      "\xd0\x9d",
      "\xd0\x9e",
      "\xd0\x9f",
      "\xd0\xaf",
      "\xd0\xa0",
      "\xd0\xa1",
      "\xd0\xa2",
      "\xd0\xa3",
      "\xd0\x96",
      "\xd0\x92",
      "\xd0\xac",
      "\xd0\xab",
      "\xd0\x97",
      "\xd0\xa8",
      "\xd0\xad",
      "\xd0\xa9",
      "\xd0\xa7",
      "\x7f",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x0000007f => "\x7f",
      0x000000a4 => "\x24",
      0x00000410 => "\x61",
      0x00000411 => "\x62",
      0x00000412 => "\x77",
      0x00000413 => "\x67",
      0x00000414 => "\x64",
      0x00000415 => "\x65",
      0x00000416 => "\x76",
      0x00000417 => "\x7a",
      0x00000418 => "\x69",
      0x00000419 => "\x6a",
      0x0000041a => "\x6b",
      0x0000041b => "\x6c",
      0x0000041c => "\x6d",
      0x0000041d => "\x6e",
      0x0000041e => "\x6f",
      0x0000041f => "\x70",
      0x00000420 => "\x72",
      0x00000421 => "\x73",
      0x00000422 => "\x74",
      0x00000423 => "\x75",
      0x00000424 => "\x66",
      0x00000425 => "\x68",
      0x00000426 => "\x63",
      0x00000427 => "\x7e",
      0x00000428 => "\x7b",
      0x00000429 => "\x7d",
      0x0000042b => "\x79",
      0x0000042c => "\x78",
      0x0000042d => "\x7c",
      0x0000042e => "\x60",
      0x0000042f => "\x71",
      0x00000430 => "\x41",
      0x00000431 => "\x42",
      0x00000432 => "\x57",
      0x00000433 => "\x47",
      0x00000434 => "\x44",
      0x00000435 => "\x45",
      0x00000436 => "\x56",
      0x00000437 => "\x5a",
      0x00000438 => "\x49",
      0x00000439 => "\x4a",
      0x0000043a => "\x4b",
      0x0000043b => "\x4c",
      0x0000043c => "\x4d",
      0x0000043d => "\x4e",
      0x0000043e => "\x4f",
      0x0000043f => "\x50",
      0x00000440 => "\x52",
      0x00000441 => "\x53",
      0x00000442 => "\x54",
      0x00000443 => "\x55",
      0x00000444 => "\x46",
      0x00000445 => "\x48",
      0x00000446 => "\x43",
      0x00000447 => "\x5e",
      0x00000448 => "\x5b",
      0x00000449 => "\x5d",
      0x0000044a => "\x5f",
      0x0000044b => "\x59",
      0x0000044c => "\x58",
      0x0000044d => "\x5c",
      0x0000044e => "\x40",
      0x0000044f => "\x51",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::ISO_5427 - Conversion routines for ISO_5427
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for ISO_5427.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: ECMA registry
   alias ISO-IR-37
   alias KOI-7
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  000000A4 | CURRENCY SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  0000044E | CYRILLIC SMALL LETTER YU
      41 |  00000430 | CYRILLIC SMALL LETTER A
      42 |  00000431 | CYRILLIC SMALL LETTER BE
      43 |  00000446 | CYRILLIC SMALL LETTER TSE
      44 |  00000434 | CYRILLIC SMALL LETTER DE
      45 |  00000435 | CYRILLIC SMALL LETTER IE
      46 |  00000444 | CYRILLIC SMALL LETTER EF
      47 |  00000433 | CYRILLIC SMALL LETTER GHE
      48 |  00000445 | CYRILLIC SMALL LETTER HA
      49 |  00000438 | CYRILLIC SMALL LETTER I
      4A |  00000439 | CYRILLIC SMALL LETTER SHORT I
      4B |  0000043A | CYRILLIC SMALL LETTER KA
      4C |  0000043B | CYRILLIC SMALL LETTER EL
      4D |  0000043C | CYRILLIC SMALL LETTER EM
      4E |  0000043D | CYRILLIC SMALL LETTER EN
      4F |  0000043E | CYRILLIC SMALL LETTER O
      50 |  0000043F | CYRILLIC SMALL LETTER PE
      51 |  0000044F | CYRILLIC SMALL LETTER YA
      52 |  00000440 | CYRILLIC SMALL LETTER ER
      53 |  00000441 | CYRILLIC SMALL LETTER ES
      54 |  00000442 | CYRILLIC SMALL LETTER TE
      55 |  00000443 | CYRILLIC SMALL LETTER U
      56 |  00000436 | CYRILLIC SMALL LETTER ZHE
      57 |  00000432 | CYRILLIC SMALL LETTER VE
      58 |  0000044C | CYRILLIC SMALL LETTER SOFT SIGN
      59 |  0000044B | CYRILLIC SMALL LETTER YERU
      5A |  00000437 | CYRILLIC SMALL LETTER ZE
      5B |  00000448 | CYRILLIC SMALL LETTER SHA
      5C |  0000044D | CYRILLIC SMALL LETTER E
      5D |  00000449 | CYRILLIC SMALL LETTER SHCHA
      5E |  00000447 | CYRILLIC SMALL LETTER CHE
      5F |  0000044A | CYRILLIC SMALL LETTER HARD SIGN
      60 |  0000042E | CYRILLIC CAPITAL LETTER YU
      61 |  00000410 | CYRILLIC CAPITAL LETTER A
      62 |  00000411 | CYRILLIC CAPITAL LETTER BE
      63 |  00000426 | CYRILLIC CAPITAL LETTER TSE
      64 |  00000414 | CYRILLIC CAPITAL LETTER DE
      65 |  00000415 | CYRILLIC CAPITAL LETTER IE
      66 |  00000424 | CYRILLIC CAPITAL LETTER EF
      67 |  00000413 | CYRILLIC CAPITAL LETTER GHE
      68 |  00000425 | CYRILLIC CAPITAL LETTER HA
      69 |  00000418 | CYRILLIC CAPITAL LETTER I
      6A |  00000419 | CYRILLIC CAPITAL LETTER SHORT I
      6B |  0000041A | CYRILLIC CAPITAL LETTER KA
      6C |  0000041B | CYRILLIC CAPITAL LETTER EL
      6D |  0000041C | CYRILLIC CAPITAL LETTER EM
      6E |  0000041D | CYRILLIC CAPITAL LETTER EN
      6F |  0000041E | CYRILLIC CAPITAL LETTER O
      70 |  0000041F | CYRILLIC CAPITAL LETTER PE
      71 |  0000042F | CYRILLIC CAPITAL LETTER YA
      72 |  00000420 | CYRILLIC CAPITAL LETTER ER
      73 |  00000421 | CYRILLIC CAPITAL LETTER ES
      74 |  00000422 | CYRILLIC CAPITAL LETTER TE
      75 |  00000423 | CYRILLIC CAPITAL LETTER U
      76 |  00000416 | CYRILLIC CAPITAL LETTER ZHE
      77 |  00000412 | CYRILLIC CAPITAL LETTER VE
      78 |  0000042C | CYRILLIC CAPITAL LETTER SOFT SIGN
      79 |  0000042B | CYRILLIC CAPITAL LETTER YERU
      7A |  00000417 | CYRILLIC CAPITAL LETTER ZE
      7B |  00000428 | CYRILLIC CAPITAL LETTER SHA
      7C |  0000042D | CYRILLIC CAPITAL LETTER E
      7D |  00000429 | CYRILLIC CAPITAL LETTER SHCHA
      7E |  00000427 | CYRILLIC CAPITAL LETTER CHE
      7F |  0000007F | DELETE (DEL)
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_ISO_5427

    $main::fatpacked{"Locale/RecodeData/ISO_5427_EXT.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_ISO_5427_EXT';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for ISO_5427-EXT.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::ISO_5427_EXT;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0491,
      0x0452,
      0x0453,
      0x0454,
      0x0451,
      0x0455,
      0x0456,
      0x0457,
      0x0458,
      0x0459,
      0x045a,
      0x045b,
      0x045c,
      0x045e,
      0x045f,
      0xfffd,
      0x0463,
      0x0473,
      0x0475,
      0x046b,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x005b,
      0xfffd,
      0x005d,
      0xfffd,
      0x005f,
      0x0490,
      0x0402,
      0x0403,
      0x0404,
      0x0401,
      0x0405,
      0x0406,
      0x0407,
      0x0408,
      0x0409,
      0x040a,
      0x040b,
      0x040c,
      0x040e,
      0x040f,
      0x042a,
      0x0462,
      0x0472,
      0x0474,
      0x046a,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x007f,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xd2\x91",
      "\xd1\x92",
      "\xd1\x93",
      "\xd1\x94",
      "\xd1\x91",
      "\xd1\x95",
      "\xd1\x96",
      "\xd1\x97",
      "\xd1\x98",
      "\xd1\x99",
      "\xd1\x9a",
      "\xd1\x9b",
      "\xd1\x9c",
      "\xd1\x9e",
      "\xd1\x9f",
      "\xef\xbf\xbd",
      "\xd1\xa3",
      "\xd1\xb3",
      "\xd1\xb5",
      "\xd1\xab",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x5b",
      "\xef\xbf\xbd",
      "\x5d",
      "\xef\xbf\xbd",
      "\x5f",
      "\xd2\x90",
      "\xd0\x82",
      "\xd0\x83",
      "\xd0\x84",
      "\xd0\x81",
      "\xd0\x85",
      "\xd0\x86",
      "\xd0\x87",
      "\xd0\x88",
      "\xd0\x89",
      "\xd0\x8a",
      "\xd0\x8b",
      "\xd0\x8c",
      "\xd0\x8e",
      "\xd0\x8f",
      "\xd0\xaa",
      "\xd1\xa2",
      "\xd1\xb2",
      "\xd1\xb4",
      "\xd1\xaa",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x7f",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x0000005b => "\x5b",
      0x0000005d => "\x5d",
      0x0000005f => "\x5f",
      0x0000007f => "\x7f",
      0x00000401 => "\x64",
      0x00000402 => "\x61",
      0x00000403 => "\x62",
      0x00000404 => "\x63",
      0x00000405 => "\x65",
      0x00000406 => "\x66",
      0x00000407 => "\x67",
      0x00000408 => "\x68",
      0x00000409 => "\x69",
      0x0000040a => "\x6a",
      0x0000040b => "\x6b",
      0x0000040c => "\x6c",
      0x0000040e => "\x6d",
      0x0000040f => "\x6e",
      0x0000042a => "\x6f",
      0x00000451 => "\x44",
      0x00000452 => "\x41",
      0x00000453 => "\x42",
      0x00000454 => "\x43",
      0x00000455 => "\x45",
      0x00000456 => "\x46",
      0x00000457 => "\x47",
      0x00000458 => "\x48",
      0x00000459 => "\x49",
      0x0000045a => "\x4a",
      0x0000045b => "\x4b",
      0x0000045c => "\x4c",
      0x0000045e => "\x4d",
      0x0000045f => "\x4e",
      0x00000462 => "\x70",
      0x00000463 => "\x50",
      0x0000046a => "\x73",
      0x0000046b => "\x53",
      0x00000472 => "\x71",
      0x00000473 => "\x51",
      0x00000474 => "\x72",
      0x00000475 => "\x52",
      0x00000490 => "\x60",
      0x00000491 => "\x40",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::ISO_5427_EXT - Conversion routines for ISO_5427_EXT
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for ISO_5427-EXT.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
   repertoiremap: mnemonic,ds
    source: ECMA registry
   alias ISO-IR-54
   alias ISO_5427:1981
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      40 |  00000491 | CYRILLIC SMALL LETTER GHE WITH UPTURN
      41 |  00000452 | CYRILLIC SMALL LETTER DJE
      42 |  00000453 | CYRILLIC SMALL LETTER GJE
      43 |  00000454 | CYRILLIC SMALL LETTER UKRAINIAN IE
      44 |  00000451 | CYRILLIC SMALL LETTER IO
      45 |  00000455 | CYRILLIC SMALL LETTER DZE
      46 |  00000456 | CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
      47 |  00000457 | CYRILLIC SMALL LETTER YI
      48 |  00000458 | CYRILLIC SMALL LETTER JE
      49 |  00000459 | CYRILLIC SMALL LETTER LJE
      4A |  0000045A | CYRILLIC SMALL LETTER NJE
      4B |  0000045B | CYRILLIC SMALL LETTER TSHE
      4C |  0000045C | CYRILLIC SMALL LETTER KJE
      4D |  0000045E | CYRILLIC SMALL LETTER SHORT U
      4E |  0000045F | CYRILLIC SMALL LETTER DZHE
      50 |  00000463 | CYRILLIC SMALL LETTER YAT
      51 |  00000473 | CYRILLIC SMALL LETTER FITA
      52 |  00000475 | CYRILLIC SMALL LETTER IZHITSA
      53 |  0000046B | CYRILLIC SMALL LETTER BIG YUS
      5B |  0000005B | LEFT SQUARE BRACKET
      5D |  0000005D | RIGHT SQUARE BRACKET
      5F |  0000005F | LOW LINE
      60 |  00000490 | CYRILLIC CAPITAL LETTER GHE WITH UPTURN
      61 |  00000402 | CYRILLIC CAPITAL LETTER DJE
      62 |  00000403 | CYRILLIC CAPITAL LETTER GJE
      63 |  00000404 | CYRILLIC CAPITAL LETTER UKRAINIAN IE
      64 |  00000401 | CYRILLIC CAPITAL LETTER IO
      65 |  00000405 | CYRILLIC CAPITAL LETTER DZE
      66 |  00000406 | CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
      67 |  00000407 | CYRILLIC CAPITAL LETTER YI
      68 |  00000408 | CYRILLIC CAPITAL LETTER JE
      69 |  00000409 | CYRILLIC CAPITAL LETTER LJE
      6A |  0000040A | CYRILLIC CAPITAL LETTER NJE
      6B |  0000040B | CYRILLIC CAPITAL LETTER TSHE
      6C |  0000040C | CYRILLIC CAPITAL LETTER KJE
      6D |  0000040E | CYRILLIC CAPITAL LETTER SHORT U
      6E |  0000040F | CYRILLIC CAPITAL LETTER DZHE
      6F |  0000042A | CYRILLIC CAPITAL LETTER HARD SIGN
      70 |  00000462 | CYRILLIC CAPITAL LETTER YAT
      71 |  00000472 | CYRILLIC CAPITAL LETTER FITA
      72 |  00000474 | CYRILLIC CAPITAL LETTER IZHITSA
      73 |  0000046A | CYRILLIC CAPITAL LETTER BIG YUS
      7F |  0000007F | DELETE (DEL)
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_ISO_5427_EXT

    $main::fatpacked{"Locale/RecodeData/ISO_5428.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_ISO_5428';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for ISO_5428.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::ISO_5428;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0xe002,
      0xe003,
      0xe009,
      0xe005,
      0xe012,
      0xe013,
      0xe014,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00ab,
      0x00bb,
      0x201d,
      0x201c,
      0x0374,
      0x0375,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00b7,
      0xfffd,
      0xfffd,
      0xfffd,
      0x003b,
      0xfffd,
      0x0391,
      0x0392,
      0xfffd,
      0x0393,
      0x0394,
      0x0395,
      0x03da,
      0x03dc,
      0x0396,
      0x0397,
      0x0398,
      0x0399,
      0x039a,
      0x039b,
      0x039c,
      0x039d,
      0x039e,
      0x039f,
      0x03a0,
      0x03de,
      0x03a1,
      0x03a3,
      0xfffd,
      0x03a4,
      0x03a5,
      0x03a6,
      0x03a7,
      0x03a8,
      0x03a9,
      0x03e0,
      0xfffd,
      0xfffd,
      0x03b1,
      0x03b2,
      0x03d0,
      0x03b3,
      0x03b4,
      0x03b5,
      0xe01a,
      0xe01b,
      0x03b6,
      0x03b7,
      0x03b8,
      0x03b9,
      0x03ba,
      0x03bb,
      0x03bc,
      0x03bd,
      0x03be,
      0x03bf,
      0x03c0,
      0xe01c,
      0x03c1,
      0x03c3,
      0x03c2,
      0x03c4,
      0x03c5,
      0x03c6,
      0x03c7,
      0x03c8,
      0x03c9,
      0xe01d,
      0x007f,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\xee\x80\x82",
      "\xee\x80\x83",
      "\xee\x80\x89",
      "\xee\x80\x85",
      "\xee\x80\x92",
      "\xee\x80\x93",
      "\xee\x80\x94",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc2\xab",
      "\xc2\xbb",
      "\xe2\x80\x9d",
      "\xe2\x80\x9c",
      "\xcd\xb4",
      "\xcd\xb5",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc2\xb7",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\x3b",
      "\xef\xbf\xbd",
      "\xce\x91",
      "\xce\x92",
      "\xef\xbf\xbd",
      "\xce\x93",
      "\xce\x94",
      "\xce\x95",
      "\xcf\x9a",
      "\xcf\x9c",
      "\xce\x96",
      "\xce\x97",
      "\xce\x98",
      "\xce\x99",
      "\xce\x9a",
      "\xce\x9b",
      "\xce\x9c",
      "\xce\x9d",
      "\xce\x9e",
      "\xce\x9f",
      "\xce\xa0",
      "\xcf\x9e",
      "\xce\xa1",
      "\xce\xa3",
      "\xef\xbf\xbd",
      "\xce\xa4",
      "\xce\xa5",
      "\xce\xa6",
      "\xce\xa7",
      "\xce\xa8",
      "\xce\xa9",
      "\xcf\xa0",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xce\xb1",
      "\xce\xb2",
      "\xcf\x90",
      "\xce\xb3",
      "\xce\xb4",
      "\xce\xb5",
      "\xee\x80\x9a",
      "\xee\x80\x9b",
      "\xce\xb6",
      "\xce\xb7",
      "\xce\xb8",
      "\xce\xb9",
      "\xce\xba",
      "\xce\xbb",
      "\xce\xbc",
      "\xce\xbd",
      "\xce\xbe",
      "\xce\xbf",
      "\xcf\x80",
      "\xee\x80\x9c",
      "\xcf\x81",
      "\xcf\x83",
      "\xcf\x82",
      "\xcf\x84",
      "\xcf\x85",
      "\xcf\x86",
      "\xcf\x87",
      "\xcf\x88",
      "\xcf\x89",
      "\xee\x80\x9d",
      "\x7f",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x0000003b => "\x3f",
      0x0000007f => "\x7f",
      0x000000ab => "\x30",
      0x000000b7 => "\x3b",
      0x000000bb => "\x31",
      0x00000374 => "\x34",
      0x00000375 => "\x35",
      0x00000391 => "\x41",
      0x00000392 => "\x42",
      0x00000393 => "\x44",
      0x00000394 => "\x45",
      0x00000395 => "\x46",
      0x00000396 => "\x49",
      0x00000397 => "\x4a",
      0x00000398 => "\x4b",
      0x00000399 => "\x4c",
      0x0000039a => "\x4d",
      0x0000039b => "\x4e",
      0x0000039c => "\x4f",
      0x0000039d => "\x50",
      0x0000039e => "\x51",
      0x0000039f => "\x52",
      0x000003a0 => "\x53",
      0x000003a1 => "\x55",
      0x000003a3 => "\x56",
      0x000003a4 => "\x58",
      0x000003a5 => "\x59",
      0x000003a6 => "\x5a",
      0x000003a7 => "\x5b",
      0x000003a8 => "\x5c",
      0x000003a9 => "\x5d",
      0x000003b1 => "\x61",
      0x000003b2 => "\x62",
      0x000003b3 => "\x64",
      0x000003b4 => "\x65",
      0x000003b5 => "\x66",
      0x000003b6 => "\x69",
      0x000003b7 => "\x6a",
      0x000003b8 => "\x6b",
      0x000003b9 => "\x6c",
      0x000003ba => "\x6d",
      0x000003bb => "\x6e",
      0x000003bc => "\x6f",
      0x000003bd => "\x70",
      0x000003be => "\x71",
      0x000003bf => "\x72",
      0x000003c0 => "\x73",
      0x000003c1 => "\x75",
      0x000003c2 => "\x77",
      0x000003c3 => "\x76",
      0x000003c4 => "\x78",
      0x000003c5 => "\x79",
      0x000003c6 => "\x7a",
      0x000003c7 => "\x7b",
      0x000003c8 => "\x7c",
      0x000003c9 => "\x7d",
      0x000003d0 => "\x63",
      0x000003da => "\x47",
      0x000003dc => "\x48",
      0x000003de => "\x54",
      0x000003e0 => "\x5e",
      0x0000201c => "\x33",
      0x0000201d => "\x32",
      0x0000e002 => "\x21",
      0x0000e003 => "\x22",
      0x0000e005 => "\x24",
      0x0000e009 => "\x23",
      0x0000e012 => "\x25",
      0x0000e013 => "\x26",
      0x0000e014 => "\x27",
      0x0000e01a => "\x67",
      0x0000e01b => "\x68",
      0x0000e01c => "\x74",
      0x0000e01d => "\x7e",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::ISO_5428 - Conversion routines for ISO_5428
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for ISO_5428.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: ECMA registry
   alias ISO-IR-55
   alias ISO_5428:1980
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  0000E002 | NON-SPACING GRAVE ACCENT E<lt>ISO-IR-103_C1E<gt> (not a real character)
      22 |  0000E003 | NON-SPACING ACUTE ACCENT E<lt>ISO-IR-103_C2E<gt> (not a real character)
      23 |  0000E009 | NON-SPACING DIAERESIS E<lt>ISO-IR-103_C8E<gt> (not a real character)
      24 |  0000E005 | NON-SPACING TILDE E<lt>ISO-IR-103_C4E<gt> (not a real character)
      25 |  0000E012 | GREEK NON-SPACING PSILI PNEUMATA E<lt>ISO-IR-55_25E<gt> (not a real character)
      26 |  0000E013 | GREEK NON-SPACING DASIA PNEUMATA E<lt>ISO-IR-55_26E<gt> (not a real character)
      27 |  0000E014 | GREEK NON-SPACING IOTA BELOW E<lt>ISO-IR-55_27E<gt> (not a real character)
      30 |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
      31 |  000000BB | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
      32 |  0000201D | RIGHT DOUBLE QUOTATION MARK
      33 |  0000201C | LEFT DOUBLE QUOTATION MARK
      34 |  00000374 | GREEK NUMERAL SIGN (Dexia keraia)
      35 |  00000375 | GREEK LOWER NUMERAL SIGN (Aristeri keraia)
      3B |  000000B7 | MIDDLE DOT
      3F |  0000003B | SEMICOLON
      41 |  00000391 | GREEK CAPITAL LETTER ALPHA
      42 |  00000392 | GREEK CAPITAL LETTER BETA
      44 |  00000393 | GREEK CAPITAL LETTER GAMMA
      45 |  00000394 | GREEK CAPITAL LETTER DELTA
      46 |  00000395 | GREEK CAPITAL LETTER EPSILON
      47 |  000003DA | GREEK LETTER STIGMA
      48 |  000003DC | GREEK LETTER DIGAMMA
      49 |  00000396 | GREEK CAPITAL LETTER ZETA
      4A |  00000397 | GREEK CAPITAL LETTER ETA
      4B |  00000398 | GREEK CAPITAL LETTER THETA
      4C |  00000399 | GREEK CAPITAL LETTER IOTA
      4D |  0000039A | GREEK CAPITAL LETTER KAPPA
      4E |  0000039B | GREEK CAPITAL LETTER LAMDA
      4F |  0000039C | GREEK CAPITAL LETTER MU
      50 |  0000039D | GREEK CAPITAL LETTER NU
      51 |  0000039E | GREEK CAPITAL LETTER XI
      52 |  0000039F | GREEK CAPITAL LETTER OMICRON
      53 |  000003A0 | GREEK CAPITAL LETTER PI
      54 |  000003DE | GREEK LETTER KOPPA
      55 |  000003A1 | GREEK CAPITAL LETTER RHO
      56 |  000003A3 | GREEK CAPITAL LETTER SIGMA
      58 |  000003A4 | GREEK CAPITAL LETTER TAU
      59 |  000003A5 | GREEK CAPITAL LETTER UPSILON
      5A |  000003A6 | GREEK CAPITAL LETTER PHI
      5B |  000003A7 | GREEK CAPITAL LETTER CHI
      5C |  000003A8 | GREEK CAPITAL LETTER PSI
      5D |  000003A9 | GREEK CAPITAL LETTER OMEGA
      5E |  000003E0 | GREEK LETTER SAMPI
      61 |  000003B1 | GREEK SMALL LETTER ALPHA
      62 |  000003B2 | GREEK SMALL LETTER BETA
      63 |  000003D0 | GREEK BETA SYMBOL
      64 |  000003B3 | GREEK SMALL LETTER GAMMA
      65 |  000003B4 | GREEK SMALL LETTER DELTA
      66 |  000003B5 | GREEK SMALL LETTER EPSILON
      67 |  0000E01A | GREEK SMALL LETTER STIGMA E<lt>ISO-IR-55_47E<gt>
      68 |  0000E01B | GREEK SMALL LETTER DIGAMMA E<lt>ISO-IR-55_48E<gt>
      69 |  000003B6 | GREEK SMALL LETTER ZETA
      6A |  000003B7 | GREEK SMALL LETTER ETA
      6B |  000003B8 | GREEK SMALL LETTER THETA
      6C |  000003B9 | GREEK SMALL LETTER IOTA
      6D |  000003BA | GREEK SMALL LETTER KAPPA
      6E |  000003BB | GREEK SMALL LETTER LAMDA
      6F |  000003BC | GREEK SMALL LETTER MU
      70 |  000003BD | GREEK SMALL LETTER NU
      71 |  000003BE | GREEK SMALL LETTER XI
      72 |  000003BF | GREEK SMALL LETTER OMICRON
      73 |  000003C0 | GREEK SMALL LETTER PI
      74 |  0000E01C | GREEK SMALL LETTER KOPPA E<lt>ISO-IR-55_54E<gt>
      75 |  000003C1 | GREEK SMALL LETTER RHO
      76 |  000003C3 | GREEK SMALL LETTER SIGMA
      77 |  000003C2 | GREEK SMALL LETTER FINAL SIGMA
      78 |  000003C4 | GREEK SMALL LETTER TAU
      79 |  000003C5 | GREEK SMALL LETTER UPSILON
      7A |  000003C6 | GREEK SMALL LETTER PHI
      7B |  000003C7 | GREEK SMALL LETTER CHI
      7C |  000003C8 | GREEK SMALL LETTER PSI
      7D |  000003C9 | GREEK SMALL LETTER OMEGA
      7E |  0000E01D | GREEK SMALL LETTER SAMPI E<lt>ISO-IR-55_5EE<gt>
      7F |  0000007F | DELETE (DEL)
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_ISO_5428

    $main::fatpacked{"Locale/RecodeData/ISO_8859_1.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_ISO_8859_1';
  #! /bin/false
  
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for ISO-8859-1.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::ISO_8859_1;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  use constant TO_UTF8 => [
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xc2\x80",
      "\xc2\x81",
      "\xc2\x82",
      "\xc2\x83",
      "\xc2\x84",
      "\xc2\x85",
      "\xc2\x86",
      "\xc2\x87",
      "\xc2\x88",
      "\xc2\x89",
      "\xc2\x8a",
      "\xc2\x8b",
      "\xc2\x8c",
      "\xc2\x8d",
      "\xc2\x8e",
      "\xc2\x8f",
      "\xc2\x90",
      "\xc2\x91",
      "\xc2\x92",
      "\xc2\x93",
      "\xc2\x94",
      "\xc2\x95",
      "\xc2\x96",
      "\xc2\x97",
      "\xc2\x98",
      "\xc2\x99",
      "\xc2\x9a",
      "\xc2\x9b",
      "\xc2\x9c",
      "\xc2\x9d",
      "\xc2\x9e",
      "\xc2\x9f",
      "\xc2\xa0",
      "\xc2\xa1",
      "\xc2\xa2",
      "\xc2\xa3",
      "\xc2\xa4",
      "\xc2\xa5",
      "\xc2\xa6",
      "\xc2\xa7",
      "\xc2\xa8",
      "\xc2\xa9",
      "\xc2\xaa",
      "\xc2\xab",
      "\xc2\xac",
      "\xc2\xad",
      "\xc2\xae",
      "\xc2\xaf",
      "\xc2\xb0",
      "\xc2\xb1",
      "\xc2\xb2",
      "\xc2\xb3",
      "\xc2\xb4",
      "\xc2\xb5",
      "\xc2\xb6",
      "\xc2\xb7",
      "\xc2\xb8",
      "\xc2\xb9",
      "\xc2\xba",
      "\xc2\xbb",
      "\xc2\xbc",
      "\xc2\xbd",
      "\xc2\xbe",
      "\xc2\xbf",
      "\xc3\x80",
      "\xc3\x81",
      "\xc3\x82",
      "\xc3\x83",
      "\xc3\x84",
      "\xc3\x85",
      "\xc3\x86",
      "\xc3\x87",
      "\xc3\x88",
      "\xc3\x89",
      "\xc3\x8a",
      "\xc3\x8b",
      "\xc3\x8c",
      "\xc3\x8d",
      "\xc3\x8e",
      "\xc3\x8f",
      "\xc3\x90",
      "\xc3\x91",
      "\xc3\x92",
      "\xc3\x93",
      "\xc3\x94",
      "\xc3\x95",
      "\xc3\x96",
      "\xc3\x97",
      "\xc3\x98",
      "\xc3\x99",
      "\xc3\x9a",
      "\xc3\x9b",
      "\xc3\x9c",
      "\xc3\x9d",
      "\xc3\x9e",
      "\xc3\x9f",
      "\xc3\xa0",
      "\xc3\xa1",
      "\xc3\xa2",
      "\xc3\xa3",
      "\xc3\xa4",
      "\xc3\xa5",
      "\xc3\xa6",
      "\xc3\xa7",
      "\xc3\xa8",
      "\xc3\xa9",
      "\xc3\xaa",
      "\xc3\xab",
      "\xc3\xac",
      "\xc3\xad",
      "\xc3\xae",
      "\xc3\xaf",
      "\xc3\xb0",
      "\xc3\xb1",
      "\xc3\xb2",
      "\xc3\xb3",
      "\xc3\xb4",
      "\xc3\xb5",
      "\xc3\xb6",
      "\xc3\xb7",
      "\xc3\xb8",
      "\xc3\xb9",
      "\xc3\xba",
      "\xc3\xbb",
      "\xc3\xbc",
      "\xc3\xbd",
      "\xc3\xbe",
      "\xc3\xbf",
  ];
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		# FIXME: Maybe the lookup is cheaper than the call to chr().
  		$_[1] = join '', 
  		    map $_ > 255 ? "\x3f" : chr $_,
  			    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8') {
  		$_[1] = join '', map TO_UTF8->[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ unpack 'C*', $_[1] ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::ISO_8859_1 - Conversion routines for ISO-8859-1
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module contains the conversion tables and routines for ISO-8859-1.
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE (DEL)
      80 |  00000080 | PADDING CHARACTER (PAD)
      81 |  00000081 | HIGH OCTET PRESET (HOP)
      82 |  00000082 | BREAK PERMITTED HERE (BPH)
      83 |  00000083 | NO BREAK HERE (NBH)
      84 |  00000084 | INDEX (IND)
      85 |  00000085 | NEXT LINE (NEL)
      86 |  00000086 | START OF SELECTED AREA (SSA)
      87 |  00000087 | END OF SELECTED AREA (ESA)
      88 |  00000088 | CHARACTER TABULATION SET (HTS)
      89 |  00000089 | CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
      8A |  0000008A | LINE TABULATION SET (VTS)
      8B |  0000008B | PARTIAL LINE FORWARD (PLD)
      8C |  0000008C | PARTIAL LINE BACKWARD (PLU)
      8D |  0000008D | REVERSE LINE FEED (RI)
      8E |  0000008E | SINGLE-SHIFT TWO (SS2)
      8F |  0000008F | SINGLE-SHIFT THREE (SS3)
      90 |  00000090 | DEVICE CONTROL STRING (DCS)
      91 |  00000091 | PRIVATE USE ONE (PU1)
      92 |  00000092 | PRIVATE USE TWO (PU2)
      93 |  00000093 | SET TRANSMIT STATE (STS)
      94 |  00000094 | CANCEL CHARACTER (CCH)
      95 |  00000095 | MESSAGE WAITING (MW)
      96 |  00000096 | START OF GUARDED AREA (SPA)
      97 |  00000097 | END OF GUARDED AREA (EPA)
      98 |  00000098 | START OF STRING (SOS)
      99 |  00000099 | SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
      9A |  0000009A | SINGLE CHARACTER INTRODUCER (SCI)
      9B |  0000009B | CONTROL SEQUENCE INTRODUCER (CSI)
      9C |  0000009C | STRING TERMINATOR (ST)
      9D |  0000009D | OPERATING SYSTEM COMMAND (OSC)
      9E |  0000009E | PRIVACY MESSAGE (PM)
      9F |  0000009F | APPLICATION PROGRAM COMMAND (APC)
      A0 |  000000A0 | NO-BREAK SPACE
      A1 |  000000A1 | INVERTED EXCLAMATION MARK
      A2 |  000000A2 | CENT SIGN
      A3 |  000000A3 | POUND SIGN
      A4 |  000000A4 | CURRENCY SIGN
      A5 |  000000A5 | YEN SIGN
      A6 |  000000A6 | BROKEN BAR
      A7 |  000000A7 | SECTION SIGN
      A8 |  000000A8 | DIAERESIS
      A9 |  000000A9 | COPYRIGHT SIGN
      AA |  000000AA | FEMININE ORDINAL INDICATOR
      AB |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
      AC |  000000AC | NOT SIGN
      AD |  000000AD | SOFT HYPHEN
      AE |  000000AE | REGISTERED SIGN
      AF |  000000AF | MACRON
      B0 |  000000B0 | DEGREE SIGN
      B1 |  000000B1 | PLUS-MINUS SIGN
      B2 |  000000B2 | SUPERSCRIPT TWO
      B3 |  000000B3 | SUPERSCRIPT THREE
      B4 |  000000B4 | ACUTE ACCENT
      B5 |  000000B5 | MICRO SIGN
      B6 |  000000B6 | PILCROW SIGN
      B7 |  000000B7 | MIDDLE DOT
      B8 |  000000B8 | CEDILLA
      B9 |  000000B9 | SUPERSCRIPT ONE
      BA |  000000BA | MASCULINE ORDINAL INDICATOR
      BB |  000000BB | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
      BC |  000000BC | VULGAR FRACTION ONE QUARTER
      BD |  000000BD | VULGAR FRACTION ONE HALF
      BE |  000000BE | VULGAR FRACTION THREE QUARTERS
      BF |  000000BF | INVERTED QUESTION MARK
      C0 |  000000C0 | LATIN CAPITAL LETTER A WITH GRAVE
      C1 |  000000C1 | LATIN CAPITAL LETTER A WITH ACUTE
      C2 |  000000C2 | LATIN CAPITAL LETTER A WITH CIRCUMFLEX
      C3 |  000000C3 | LATIN CAPITAL LETTER A WITH TILDE
      C4 |  000000C4 | LATIN CAPITAL LETTER A WITH DIAERESIS
      C5 |  000000C5 | LATIN CAPITAL LETTER A WITH RING ABOVE
      C6 |  000000C6 | LATIN CAPITAL LETTER AE
      C7 |  000000C7 | LATIN CAPITAL LETTER C WITH CEDILLA
      C8 |  000000C8 | LATIN CAPITAL LETTER E WITH GRAVE
      C9 |  000000C9 | LATIN CAPITAL LETTER E WITH ACUTE
      CA |  000000CA | LATIN CAPITAL LETTER E WITH CIRCUMFLEX
      CB |  000000CB | LATIN CAPITAL LETTER E WITH DIAERESIS
      CC |  000000CC | LATIN CAPITAL LETTER I WITH GRAVE
      CD |  000000CD | LATIN CAPITAL LETTER I WITH ACUTE
      CE |  000000CE | LATIN CAPITAL LETTER I WITH CIRCUMFLEX
      CF |  000000CF | LATIN CAPITAL LETTER I WITH DIAERESIS
      D0 |  000000D0 | LATIN CAPITAL LETTER ETH
      D1 |  000000D1 | LATIN CAPITAL LETTER N WITH TILDE
      D2 |  000000D2 | LATIN CAPITAL LETTER O WITH GRAVE
      D3 |  000000D3 | LATIN CAPITAL LETTER O WITH ACUTE
      D4 |  000000D4 | LATIN CAPITAL LETTER O WITH CIRCUMFLEX
      D5 |  000000D5 | LATIN CAPITAL LETTER O WITH TILDE
      D6 |  000000D6 | LATIN CAPITAL LETTER O WITH DIAERESIS
      D7 |  000000D7 | MULTIPLICATION SIGN
      D8 |  000000D8 | LATIN CAPITAL LETTER O WITH STROKE
      D9 |  000000D9 | LATIN CAPITAL LETTER U WITH GRAVE
      DA |  000000DA | LATIN CAPITAL LETTER U WITH ACUTE
      DB |  000000DB | LATIN CAPITAL LETTER U WITH CIRCUMFLEX
      DC |  000000DC | LATIN CAPITAL LETTER U WITH DIAERESIS
      DD |  000000DD | LATIN CAPITAL LETTER Y WITH ACUTE
      DE |  000000DE | LATIN CAPITAL LETTER THORN
      DF |  000000DF | LATIN SMALL LETTER SHARP S
      E0 |  000000E0 | LATIN SMALL LETTER A WITH GRAVE
      E1 |  000000E1 | LATIN SMALL LETTER A WITH ACUTE
      E2 |  000000E2 | LATIN SMALL LETTER A WITH CIRCUMFLEX
      E3 |  000000E3 | LATIN SMALL LETTER A WITH TILDE
      E4 |  000000E4 | LATIN SMALL LETTER A WITH DIAERESIS
      E5 |  000000E5 | LATIN SMALL LETTER A WITH RING ABOVE
      E6 |  000000E6 | LATIN SMALL LETTER AE
      E7 |  000000E7 | LATIN SMALL LETTER C WITH CEDILLA
      E8 |  000000E8 | LATIN SMALL LETTER E WITH GRAVE
      E9 |  000000E9 | LATIN SMALL LETTER E WITH ACUTE
      EA |  000000EA | LATIN SMALL LETTER E WITH CIRCUMFLEX
      EB |  000000EB | LATIN SMALL LETTER E WITH DIAERESIS
      EC |  000000EC | LATIN SMALL LETTER I WITH GRAVE
      ED |  000000ED | LATIN SMALL LETTER I WITH ACUTE
      EE |  000000EE | LATIN SMALL LETTER I WITH CIRCUMFLEX
      EF |  000000EF | LATIN SMALL LETTER I WITH DIAERESIS
      F0 |  000000F0 | LATIN SMALL LETTER ETH
      F1 |  000000F1 | LATIN SMALL LETTER N WITH TILDE
      F2 |  000000F2 | LATIN SMALL LETTER O WITH GRAVE
      F3 |  000000F3 | LATIN SMALL LETTER O WITH ACUTE
      F4 |  000000F4 | LATIN SMALL LETTER O WITH CIRCUMFLEX
      F5 |  000000F5 | LATIN SMALL LETTER O WITH TILDE
      F6 |  000000F6 | LATIN SMALL LETTER O WITH DIAERESIS
      F7 |  000000F7 | DIVISION SIGN
      F8 |  000000F8 | LATIN SMALL LETTER O WITH STROKE
      F9 |  000000F9 | LATIN SMALL LETTER U WITH GRAVE
      FA |  000000FA | LATIN SMALL LETTER U WITH ACUTE
      FB |  000000FB | LATIN SMALL LETTER U WITH CIRCUMFLEX
      FC |  000000FC | LATIN SMALL LETTER U WITH DIAERESIS
      FD |  000000FD | LATIN SMALL LETTER Y WITH ACUTE
      FE |  000000FE | LATIN SMALL LETTER THORN
      FF |  000000FF | LATIN SMALL LETTER Y WITH DIAERESIS
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_ISO_8859_1

    $main::fatpacked{"Locale/RecodeData/ISO_8859_10.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_ISO_8859_10';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for ISO-8859-10.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::ISO_8859_10;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0x0080,
      0x0081,
      0x0082,
      0x0083,
      0x0084,
      0x0085,
      0x0086,
      0x0087,
      0x0088,
      0x0089,
      0x008a,
      0x008b,
      0x008c,
      0x008d,
      0x008e,
      0x008f,
      0x0090,
      0x0091,
      0x0092,
      0x0093,
      0x0094,
      0x0095,
      0x0096,
      0x0097,
      0x0098,
      0x0099,
      0x009a,
      0x009b,
      0x009c,
      0x009d,
      0x009e,
      0x009f,
      0x00a0,
      0x0104,
      0x0112,
      0x0122,
      0x012a,
      0x0128,
      0x0136,
      0x00a7,
      0x013b,
      0x0110,
      0x0160,
      0x0166,
      0x017d,
      0x00ad,
      0x016a,
      0x014a,
      0x00b0,
      0x0105,
      0x0113,
      0x0123,
      0x012b,
      0x0129,
      0x0137,
      0x00b7,
      0x013c,
      0x0111,
      0x0161,
      0x0167,
      0x017e,
      0x2015,
      0x016b,
      0x014b,
      0x0100,
      0x00c1,
      0x00c2,
      0x00c3,
      0x00c4,
      0x00c5,
      0x00c6,
      0x012e,
      0x010c,
      0x00c9,
      0x0118,
      0x00cb,
      0x0116,
      0x00cd,
      0x00ce,
      0x00cf,
      0x00d0,
      0x0145,
      0x014c,
      0x00d3,
      0x00d4,
      0x00d5,
      0x00d6,
      0x0168,
      0x00d8,
      0x0172,
      0x00da,
      0x00db,
      0x00dc,
      0x00dd,
      0x00de,
      0x00df,
      0x0101,
      0x00e1,
      0x00e2,
      0x00e3,
      0x00e4,
      0x00e5,
      0x00e6,
      0x012f,
      0x010d,
      0x00e9,
      0x0119,
      0x00eb,
      0x0117,
      0x00ed,
      0x00ee,
      0x00ef,
      0x00f0,
      0x0146,
      0x014d,
      0x00f3,
      0x00f4,
      0x00f5,
      0x00f6,
      0x0169,
      0x00f8,
      0x0173,
      0x00fa,
      0x00fb,
      0x00fc,
      0x00fd,
      0x00fe,
      0x0138,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xc2\x80",
      "\xc2\x81",
      "\xc2\x82",
      "\xc2\x83",
      "\xc2\x84",
      "\xc2\x85",
      "\xc2\x86",
      "\xc2\x87",
      "\xc2\x88",
      "\xc2\x89",
      "\xc2\x8a",
      "\xc2\x8b",
      "\xc2\x8c",
      "\xc2\x8d",
      "\xc2\x8e",
      "\xc2\x8f",
      "\xc2\x90",
      "\xc2\x91",
      "\xc2\x92",
      "\xc2\x93",
      "\xc2\x94",
      "\xc2\x95",
      "\xc2\x96",
      "\xc2\x97",
      "\xc2\x98",
      "\xc2\x99",
      "\xc2\x9a",
      "\xc2\x9b",
      "\xc2\x9c",
      "\xc2\x9d",
      "\xc2\x9e",
      "\xc2\x9f",
      "\xc2\xa0",
      "\xc4\x84",
      "\xc4\x92",
      "\xc4\xa2",
      "\xc4\xaa",
      "\xc4\xa8",
      "\xc4\xb6",
      "\xc2\xa7",
      "\xc4\xbb",
      "\xc4\x90",
      "\xc5\xa0",
      "\xc5\xa6",
      "\xc5\xbd",
      "\xc2\xad",
      "\xc5\xaa",
      "\xc5\x8a",
      "\xc2\xb0",
      "\xc4\x85",
      "\xc4\x93",
      "\xc4\xa3",
      "\xc4\xab",
      "\xc4\xa9",
      "\xc4\xb7",
      "\xc2\xb7",
      "\xc4\xbc",
      "\xc4\x91",
      "\xc5\xa1",
      "\xc5\xa7",
      "\xc5\xbe",
      "\xe2\x80\x95",
      "\xc5\xab",
      "\xc5\x8b",
      "\xc4\x80",
      "\xc3\x81",
      "\xc3\x82",
      "\xc3\x83",
      "\xc3\x84",
      "\xc3\x85",
      "\xc3\x86",
      "\xc4\xae",
      "\xc4\x8c",
      "\xc3\x89",
      "\xc4\x98",
      "\xc3\x8b",
      "\xc4\x96",
      "\xc3\x8d",
      "\xc3\x8e",
      "\xc3\x8f",
      "\xc3\x90",
      "\xc5\x85",
      "\xc5\x8c",
      "\xc3\x93",
      "\xc3\x94",
      "\xc3\x95",
      "\xc3\x96",
      "\xc5\xa8",
      "\xc3\x98",
      "\xc5\xb2",
      "\xc3\x9a",
      "\xc3\x9b",
      "\xc3\x9c",
      "\xc3\x9d",
      "\xc3\x9e",
      "\xc3\x9f",
      "\xc4\x81",
      "\xc3\xa1",
      "\xc3\xa2",
      "\xc3\xa3",
      "\xc3\xa4",
      "\xc3\xa5",
      "\xc3\xa6",
      "\xc4\xaf",
      "\xc4\x8d",
      "\xc3\xa9",
      "\xc4\x99",
      "\xc3\xab",
      "\xc4\x97",
      "\xc3\xad",
      "\xc3\xae",
      "\xc3\xaf",
      "\xc3\xb0",
      "\xc5\x86",
      "\xc5\x8d",
      "\xc3\xb3",
      "\xc3\xb4",
      "\xc3\xb5",
      "\xc3\xb6",
      "\xc5\xa9",
      "\xc3\xb8",
      "\xc5\xb3",
      "\xc3\xba",
      "\xc3\xbb",
      "\xc3\xbc",
      "\xc3\xbd",
      "\xc3\xbe",
      "\xc4\xb8",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x00000080 => "\x80",
      0x00000081 => "\x81",
      0x00000082 => "\x82",
      0x00000083 => "\x83",
      0x00000084 => "\x84",
      0x00000085 => "\x85",
      0x00000086 => "\x86",
      0x00000087 => "\x87",
      0x00000088 => "\x88",
      0x00000089 => "\x89",
      0x0000008a => "\x8a",
      0x0000008b => "\x8b",
      0x0000008c => "\x8c",
      0x0000008d => "\x8d",
      0x0000008e => "\x8e",
      0x0000008f => "\x8f",
      0x00000090 => "\x90",
      0x00000091 => "\x91",
      0x00000092 => "\x92",
      0x00000093 => "\x93",
      0x00000094 => "\x94",
      0x00000095 => "\x95",
      0x00000096 => "\x96",
      0x00000097 => "\x97",
      0x00000098 => "\x98",
      0x00000099 => "\x99",
      0x0000009a => "\x9a",
      0x0000009b => "\x9b",
      0x0000009c => "\x9c",
      0x0000009d => "\x9d",
      0x0000009e => "\x9e",
      0x0000009f => "\x9f",
      0x000000a0 => "\xa0",
      0x000000a7 => "\xa7",
      0x000000ad => "\xad",
      0x000000b0 => "\xb0",
      0x000000b7 => "\xb7",
      0x000000c1 => "\xc1",
      0x000000c2 => "\xc2",
      0x000000c3 => "\xc3",
      0x000000c4 => "\xc4",
      0x000000c5 => "\xc5",
      0x000000c6 => "\xc6",
      0x000000c9 => "\xc9",
      0x000000cb => "\xcb",
      0x000000cd => "\xcd",
      0x000000ce => "\xce",
      0x000000cf => "\xcf",
      0x000000d0 => "\xd0",
      0x000000d3 => "\xd3",
      0x000000d4 => "\xd4",
      0x000000d5 => "\xd5",
      0x000000d6 => "\xd6",
      0x000000d8 => "\xd8",
      0x000000da => "\xda",
      0x000000db => "\xdb",
      0x000000dc => "\xdc",
      0x000000dd => "\xdd",
      0x000000de => "\xde",
      0x000000df => "\xdf",
      0x000000e1 => "\xe1",
      0x000000e2 => "\xe2",
      0x000000e3 => "\xe3",
      0x000000e4 => "\xe4",
      0x000000e5 => "\xe5",
      0x000000e6 => "\xe6",
      0x000000e9 => "\xe9",
      0x000000eb => "\xeb",
      0x000000ed => "\xed",
      0x000000ee => "\xee",
      0x000000ef => "\xef",
      0x000000f0 => "\xf0",
      0x000000f3 => "\xf3",
      0x000000f4 => "\xf4",
      0x000000f5 => "\xf5",
      0x000000f6 => "\xf6",
      0x000000f8 => "\xf8",
      0x000000fa => "\xfa",
      0x000000fb => "\xfb",
      0x000000fc => "\xfc",
      0x000000fd => "\xfd",
      0x000000fe => "\xfe",
      0x00000100 => "\xc0",
      0x00000101 => "\xe0",
      0x00000104 => "\xa1",
      0x00000105 => "\xb1",
      0x0000010c => "\xc8",
      0x0000010d => "\xe8",
      0x00000110 => "\xa9",
      0x00000111 => "\xb9",
      0x00000112 => "\xa2",
      0x00000113 => "\xb2",
      0x00000116 => "\xcc",
      0x00000117 => "\xec",
      0x00000118 => "\xca",
      0x00000119 => "\xea",
      0x00000122 => "\xa3",
      0x00000123 => "\xb3",
      0x00000128 => "\xa5",
      0x00000129 => "\xb5",
      0x0000012a => "\xa4",
      0x0000012b => "\xb4",
      0x0000012e => "\xc7",
      0x0000012f => "\xe7",
      0x00000136 => "\xa6",
      0x00000137 => "\xb6",
      0x00000138 => "\xff",
      0x0000013b => "\xa8",
      0x0000013c => "\xb8",
      0x00000145 => "\xd1",
      0x00000146 => "\xf1",
      0x0000014a => "\xaf",
      0x0000014b => "\xbf",
      0x0000014c => "\xd2",
      0x0000014d => "\xf2",
      0x00000160 => "\xaa",
      0x00000161 => "\xba",
      0x00000166 => "\xab",
      0x00000167 => "\xbb",
      0x00000168 => "\xd7",
      0x00000169 => "\xf7",
      0x0000016a => "\xae",
      0x0000016b => "\xbe",
      0x00000172 => "\xd9",
      0x00000173 => "\xf9",
      0x0000017d => "\xac",
      0x0000017e => "\xbc",
      0x00002015 => "\xbd",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::ISO_8859_10 - Conversion routines for ISO-8859-10
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for ISO-8859-10.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: ECMA registry
   alias ISO-IR-157
   alias ISO_8859-10:1992
   alias ISO_8859-10
   alias L6
   alias LATIN6
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE (DEL)
      80 |  00000080 | PADDING CHARACTER (PAD)
      81 |  00000081 | HIGH OCTET PRESET (HOP)
      82 |  00000082 | BREAK PERMITTED HERE (BPH)
      83 |  00000083 | NO BREAK HERE (NBH)
      84 |  00000084 | INDEX (IND)
      85 |  00000085 | NEXT LINE (NEL)
      86 |  00000086 | START OF SELECTED AREA (SSA)
      87 |  00000087 | END OF SELECTED AREA (ESA)
      88 |  00000088 | CHARACTER TABULATION SET (HTS)
      89 |  00000089 | CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
      8A |  0000008A | LINE TABULATION SET (VTS)
      8B |  0000008B | PARTIAL LINE FORWARD (PLD)
      8C |  0000008C | PARTIAL LINE BACKWARD (PLU)
      8D |  0000008D | REVERSE LINE FEED (RI)
      8E |  0000008E | SINGLE-SHIFT TWO (SS2)
      8F |  0000008F | SINGLE-SHIFT THREE (SS3)
      90 |  00000090 | DEVICE CONTROL STRING (DCS)
      91 |  00000091 | PRIVATE USE ONE (PU1)
      92 |  00000092 | PRIVATE USE TWO (PU2)
      93 |  00000093 | SET TRANSMIT STATE (STS)
      94 |  00000094 | CANCEL CHARACTER (CCH)
      95 |  00000095 | MESSAGE WAITING (MW)
      96 |  00000096 | START OF GUARDED AREA (SPA)
      97 |  00000097 | END OF GUARDED AREA (EPA)
      98 |  00000098 | START OF STRING (SOS)
      99 |  00000099 | SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
      9A |  0000009A | SINGLE CHARACTER INTRODUCER (SCI)
      9B |  0000009B | CONTROL SEQUENCE INTRODUCER (CSI)
      9C |  0000009C | STRING TERMINATOR (ST)
      9D |  0000009D | OPERATING SYSTEM COMMAND (OSC)
      9E |  0000009E | PRIVACY MESSAGE (PM)
      9F |  0000009F | APPLICATION PROGRAM COMMAND (APC)
      A0 |  000000A0 | NO-BREAK SPACE
      A1 |  00000104 | LATIN CAPITAL LETTER A WITH OGONEK
      A2 |  00000112 | LATIN CAPITAL LETTER E WITH MACRON
      A3 |  00000122 | LATIN CAPITAL LETTER G WITH CEDILLA
      A4 |  0000012A | LATIN CAPITAL LETTER I WITH MACRON
      A5 |  00000128 | LATIN CAPITAL LETTER I WITH TILDE
      A6 |  00000136 | LATIN CAPITAL LETTER K WITH CEDILLA
      A7 |  000000A7 | SECTION SIGN
      A8 |  0000013B | LATIN CAPITAL LETTER L WITH CEDILLA
      A9 |  00000110 | LATIN CAPITAL LETTER D WITH STROKE
      AA |  00000160 | LATIN CAPITAL LETTER S WITH CARON
      AB |  00000166 | LATIN CAPITAL LETTER T WITH STROKE
      AC |  0000017D | LATIN CAPITAL LETTER Z WITH CARON
      AD |  000000AD | SOFT HYPHEN
      AE |  0000016A | LATIN CAPITAL LETTER U WITH MACRON
      AF |  0000014A | LATIN CAPITAL LETTER ENG (Sami)
      B0 |  000000B0 | DEGREE SIGN
      B1 |  00000105 | LATIN SMALL LETTER A WITH OGONEK
      B2 |  00000113 | LATIN SMALL LETTER E WITH MACRON
      B3 |  00000123 | LATIN SMALL LETTER G WITH CEDILLA
      B4 |  0000012B | LATIN SMALL LETTER I WITH MACRON
      B5 |  00000129 | LATIN SMALL LETTER I WITH TILDE
      B6 |  00000137 | LATIN SMALL LETTER K WITH CEDILLA
      B7 |  000000B7 | MIDDLE DOT
      B8 |  0000013C | LATIN SMALL LETTER L WITH CEDILLA
      B9 |  00000111 | LATIN SMALL LETTER D WITH STROKE
      BA |  00000161 | LATIN SMALL LETTER S WITH CARON
      BB |  00000167 | LATIN SMALL LETTER T WITH STROKE
      BC |  0000017E | LATIN SMALL LETTER Z WITH CARON
      BD |  00002015 | HORIZONTAL BAR
      BE |  0000016B | LATIN SMALL LETTER U WITH MACRON
      BF |  0000014B | LATIN SMALL LETTER ENG (Sami)
      C0 |  00000100 | LATIN CAPITAL LETTER A WITH MACRON
      C1 |  000000C1 | LATIN CAPITAL LETTER A WITH ACUTE
      C2 |  000000C2 | LATIN CAPITAL LETTER A WITH CIRCUMFLEX
      C3 |  000000C3 | LATIN CAPITAL LETTER A WITH TILDE
      C4 |  000000C4 | LATIN CAPITAL LETTER A WITH DIAERESIS
      C5 |  000000C5 | LATIN CAPITAL LETTER A WITH RING ABOVE
      C6 |  000000C6 | LATIN CAPITAL LETTER AE
      C7 |  0000012E | LATIN CAPITAL LETTER I WITH OGONEK
      C8 |  0000010C | LATIN CAPITAL LETTER C WITH CARON
      C9 |  000000C9 | LATIN CAPITAL LETTER E WITH ACUTE
      CA |  00000118 | LATIN CAPITAL LETTER E WITH OGONEK
      CB |  000000CB | LATIN CAPITAL LETTER E WITH DIAERESIS
      CC |  00000116 | LATIN CAPITAL LETTER E WITH DOT ABOVE
      CD |  000000CD | LATIN CAPITAL LETTER I WITH ACUTE
      CE |  000000CE | LATIN CAPITAL LETTER I WITH CIRCUMFLEX
      CF |  000000CF | LATIN CAPITAL LETTER I WITH DIAERESIS
      D0 |  000000D0 | LATIN CAPITAL LETTER ETH (Icelandic)
      D1 |  00000145 | LATIN CAPITAL LETTER N WITH CEDILLA
      D2 |  0000014C | LATIN CAPITAL LETTER O WITH MACRON
      D3 |  000000D3 | LATIN CAPITAL LETTER O WITH ACUTE
      D4 |  000000D4 | LATIN CAPITAL LETTER O WITH CIRCUMFLEX
      D5 |  000000D5 | LATIN CAPITAL LETTER O WITH TILDE
      D6 |  000000D6 | LATIN CAPITAL LETTER O WITH DIAERESIS
      D7 |  00000168 | LATIN CAPITAL LETTER U WITH TILDE
      D8 |  000000D8 | LATIN CAPITAL LETTER O WITH STROKE
      D9 |  00000172 | LATIN CAPITAL LETTER U WITH OGONEK
      DA |  000000DA | LATIN CAPITAL LETTER U WITH ACUTE
      DB |  000000DB | LATIN CAPITAL LETTER U WITH CIRCUMFLEX
      DC |  000000DC | LATIN CAPITAL LETTER U WITH DIAERESIS
      DD |  000000DD | LATIN CAPITAL LETTER Y WITH ACUTE
      DE |  000000DE | LATIN CAPITAL LETTER THORN (Icelandic)
      DF |  000000DF | LATIN SMALL LETTER SHARP S (German)
      E0 |  00000101 | LATIN SMALL LETTER A WITH MACRON
      E1 |  000000E1 | LATIN SMALL LETTER A WITH ACUTE
      E2 |  000000E2 | LATIN SMALL LETTER A WITH CIRCUMFLEX
      E3 |  000000E3 | LATIN SMALL LETTER A WITH TILDE
      E4 |  000000E4 | LATIN SMALL LETTER A WITH DIAERESIS
      E5 |  000000E5 | LATIN SMALL LETTER A WITH RING ABOVE
      E6 |  000000E6 | LATIN SMALL LETTER AE
      E7 |  0000012F | LATIN SMALL LETTER I WITH OGONEK
      E8 |  0000010D | LATIN SMALL LETTER C WITH CARON
      E9 |  000000E9 | LATIN SMALL LETTER E WITH ACUTE
      EA |  00000119 | LATIN SMALL LETTER E WITH OGONEK
      EB |  000000EB | LATIN SMALL LETTER E WITH DIAERESIS
      EC |  00000117 | LATIN SMALL LETTER E WITH DOT ABOVE
      ED |  000000ED | LATIN SMALL LETTER I WITH ACUTE
      EE |  000000EE | LATIN SMALL LETTER I WITH CIRCUMFLEX
      EF |  000000EF | LATIN SMALL LETTER I WITH DIAERESIS
      F0 |  000000F0 | LATIN SMALL LETTER ETH (Icelandic)
      F1 |  00000146 | LATIN SMALL LETTER N WITH CEDILLA
      F2 |  0000014D | LATIN SMALL LETTER O WITH MACRON
      F3 |  000000F3 | LATIN SMALL LETTER O WITH ACUTE
      F4 |  000000F4 | LATIN SMALL LETTER O WITH CIRCUMFLEX
      F5 |  000000F5 | LATIN SMALL LETTER O WITH TILDE
      F6 |  000000F6 | LATIN SMALL LETTER O WITH DIAERESIS
      F7 |  00000169 | LATIN SMALL LETTER U WITH TILDE
      F8 |  000000F8 | LATIN SMALL LETTER O WITH STROKE
      F9 |  00000173 | LATIN SMALL LETTER U WITH OGONEK
      FA |  000000FA | LATIN SMALL LETTER U WITH ACUTE
      FB |  000000FB | LATIN SMALL LETTER U WITH CIRCUMFLEX
      FC |  000000FC | LATIN SMALL LETTER U WITH DIAERESIS
      FD |  000000FD | LATIN SMALL LETTER Y WITH ACUTE
      FE |  000000FE | LATIN SMALL LETTER THORN (Icelandic)
      FF |  00000138 | LATIN SMALL LETTER KRA (Greenlandic)
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_ISO_8859_10

    $main::fatpacked{"Locale/RecodeData/ISO_8859_11.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_ISO_8859_11';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for ISO-8859-11.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::ISO_8859_11;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
  	0xfffd,
  	0xfffd,
  	0xfffd,
  	0xfffd,
  	0xfffd,
  	0xfffd,
  	0xfffd,
  	0xfffd,
  	0xfffd,
  	0xfffd,
  	0xfffd,
  	0xfffd,
  	0xfffd,
  	0xfffd,
  	0xfffd,
  	0xfffd,
  	0xfffd,
  	0xfffd,
  	0xfffd,
  	0xfffd,
  	0xfffd,
  	0xfffd,
  	0xfffd,
  	0xfffd,
  	0xfffd,
  	0xfffd,
  	0xfffd,
  	0xfffd,
  	0xfffd,
  	0xfffd,
  	0xfffd,
  	0xfffd,
      0x00a0,
      0x0e01,
      0x0e02,
      0x0e03,
      0x0e04,
      0x0e05,
      0x0e06,
      0x0e07,
      0x0e08,
      0x0e09,
      0x0e0a,
      0x0e0b,
      0x0e0c,
      0x0e0d,
      0x0e0e,
      0x0e0f,
      0x0e10,
      0x0e11,
      0x0e12,
      0x0e13,
      0x0e14,
      0x0e15,
      0x0e16,
      0x0e17,
      0x0e18,
      0x0e19,
      0x0e1a,
      0x0e1b,
      0x0e1c,
      0x0e1d,
      0x0e1e,
      0x0e1f,
      0x0e20,
      0x0e21,
      0x0e22,
      0x0e23,
      0x0e24,
      0x0e25,
      0x0e26,
      0x0e27,
      0x0e28,
      0x0e29,
      0x0e2a,
      0x0e2b,
      0x0e2c,
      0x0e2d,
      0x0e2e,
      0x0e2f,
      0x0e30,
      0x0e31,
      0x0e32,
      0x0e33,
      0x0e34,
      0x0e35,
      0x0e36,
      0x0e37,
      0x0e38,
      0x0e39,
      0x0e3a,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0e3f,
      0x0e40,
      0x0e41,
      0x0e42,
      0x0e43,
      0x0e44,
      0x0e45,
      0x0e46,
      0x0e47,
      0x0e48,
      0x0e49,
      0x0e4a,
      0x0e4b,
      0x0e4c,
      0x0e4d,
      0x0e4e,
      0x0e4f,
      0x0e50,
      0x0e51,
      0x0e52,
      0x0e53,
      0x0e54,
      0x0e55,
      0x0e56,
      0x0e57,
      0x0e58,
      0x0e59,
      0x0e5a,
      0x0e5b,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc2\xa0",
      "\xe0\xb8\x81",
      "\xe0\xb8\x82",
      "\xe0\xb8\x83",
      "\xe0\xb8\x84",
      "\xe0\xb8\x85",
      "\xe0\xb8\x86",
      "\xe0\xb8\x87",
      "\xe0\xb8\x88",
      "\xe0\xb8\x89",
      "\xe0\xb8\x8a",
      "\xe0\xb8\x8b",
      "\xe0\xb8\x8c",
      "\xe0\xb8\x8d",
      "\xe0\xb8\x8e",
      "\xe0\xb8\x8f",
      "\xe0\xb8\x90",
      "\xe0\xb8\x91",
      "\xe0\xb8\x92",
      "\xe0\xb8\x93",
      "\xe0\xb8\x94",
      "\xe0\xb8\x95",
      "\xe0\xb8\x96",
      "\xe0\xb8\x97",
      "\xe0\xb8\x98",
      "\xe0\xb8\x99",
      "\xe0\xb8\x9a",
      "\xe0\xb8\x9b",
      "\xe0\xb8\x9c",
      "\xe0\xb8\x9d",
      "\xe0\xb8\x9e",
      "\xe0\xb8\x9f",
      "\xe0\xb8\xa0",
      "\xe0\xb8\xa1",
      "\xe0\xb8\xa2",
      "\xe0\xb8\xa3",
      "\xe0\xb8\xa4",
      "\xe0\xb8\xa5",
      "\xe0\xb8\xa6",
      "\xe0\xb8\xa7",
      "\xe0\xb8\xa8",
      "\xe0\xb8\xa9",
      "\xe0\xb8\xaa",
      "\xe0\xb8\xab",
      "\xe0\xb8\xac",
      "\xe0\xb8\xad",
      "\xe0\xb8\xae",
      "\xe0\xb8\xaf",
      "\xe0\xb8\xb0",
      "\xe0\xb8\xb1",
      "\xe0\xb8\xb2",
      "\xe0\xb8\xb3",
      "\xe0\xb8\xb4",
      "\xe0\xb8\xb5",
      "\xe0\xb8\xb6",
      "\xe0\xb8\xb7",
      "\xe0\xb8\xb8",
      "\xe0\xb8\xb9",
      "\xe0\xb8\xba",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xe0\xb8\xbf",
      "\xe0\xb9\x80",
      "\xe0\xb9\x81",
      "\xe0\xb9\x82",
      "\xe0\xb9\x83",
      "\xe0\xb9\x84",
      "\xe0\xb9\x85",
      "\xe0\xb9\x86",
      "\xe0\xb9\x87",
      "\xe0\xb9\x88",
      "\xe0\xb9\x89",
      "\xe0\xb9\x8a",
      "\xe0\xb9\x8b",
      "\xe0\xb9\x8c",
      "\xe0\xb9\x8d",
      "\xe0\xb9\x8e",
      "\xe0\xb9\x8f",
      "\xe0\xb9\x90",
      "\xe0\xb9\x91",
      "\xe0\xb9\x92",
      "\xe0\xb9\x93",
      "\xe0\xb9\x94",
      "\xe0\xb9\x95",
      "\xe0\xb9\x96",
      "\xe0\xb9\x97",
      "\xe0\xb9\x98",
      "\xe0\xb9\x99",
      "\xe0\xb9\x9a",
      "\xe0\xb9\x9b",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x000000a0 => "\xa0",
      0x00000e01 => "\xa1",
      0x00000e02 => "\xa2",
      0x00000e03 => "\xa3",
      0x00000e04 => "\xa4",
      0x00000e05 => "\xa5",
      0x00000e06 => "\xa6",
      0x00000e07 => "\xa7",
      0x00000e08 => "\xa8",
      0x00000e09 => "\xa9",
      0x00000e0a => "\xaa",
      0x00000e0b => "\xab",
      0x00000e0c => "\xac",
      0x00000e0d => "\xad",
      0x00000e0e => "\xae",
      0x00000e0f => "\xaf",
      0x00000e10 => "\xb0",
      0x00000e11 => "\xb1",
      0x00000e12 => "\xb2",
      0x00000e13 => "\xb3",
      0x00000e14 => "\xb4",
      0x00000e15 => "\xb5",
      0x00000e16 => "\xb6",
      0x00000e17 => "\xb7",
      0x00000e18 => "\xb8",
      0x00000e19 => "\xb9",
      0x00000e1a => "\xba",
      0x00000e1b => "\xbb",
      0x00000e1c => "\xbc",
      0x00000e1d => "\xbd",
      0x00000e1e => "\xbe",
      0x00000e1f => "\xbf",
      0x00000e20 => "\xc0",
      0x00000e21 => "\xc1",
      0x00000e22 => "\xc2",
      0x00000e23 => "\xc3",
      0x00000e24 => "\xc4",
      0x00000e25 => "\xc5",
      0x00000e26 => "\xc6",
      0x00000e27 => "\xc7",
      0x00000e28 => "\xc8",
      0x00000e29 => "\xc9",
      0x00000e2a => "\xca",
      0x00000e2b => "\xcb",
      0x00000e2c => "\xcc",
      0x00000e2d => "\xcd",
      0x00000e2e => "\xce",
      0x00000e2f => "\xcf",
      0x00000e30 => "\xd0",
      0x00000e31 => "\xd1",
      0x00000e32 => "\xd2",
      0x00000e33 => "\xd3",
      0x00000e34 => "\xd4",
      0x00000e35 => "\xd5",
      0x00000e36 => "\xd6",
      0x00000e37 => "\xd7",
      0x00000e38 => "\xd8",
      0x00000e39 => "\xd9",
      0x00000e3a => "\xda",
      0x00000e3f => "\xdf",
      0x00000e40 => "\xe0",
      0x00000e41 => "\xe1",
      0x00000e42 => "\xe2",
      0x00000e43 => "\xe3",
      0x00000e44 => "\xe4",
      0x00000e45 => "\xe5",
      0x00000e46 => "\xe6",
      0x00000e47 => "\xe7",
      0x00000e48 => "\xe8",
      0x00000e49 => "\xe9",
      0x00000e4a => "\xea",
      0x00000e4b => "\xeb",
      0x00000e4c => "\xec",
      0x00000e4d => "\xed",
      0x00000e4e => "\xee",
      0x00000e4f => "\xef",
      0x00000e50 => "\xf0",
      0x00000e51 => "\xf1",
      0x00000e52 => "\xf2",
      0x00000e53 => "\xf3",
      0x00000e54 => "\xf4",
      0x00000e55 => "\xf5",
      0x00000e56 => "\xf6",
      0x00000e57 => "\xf7",
      0x00000e58 => "\xf8",
      0x00000e59 => "\xf9",
      0x00000e5a => "\xfa",
      0x00000e5b => "\xfb",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::ISO_8859_11 - Conversion routines for ISO-8859-11
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for ISO-8859-11.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   source: Guido Flohr E<lt>guido.flohr@cantanea.comE<gt>
  
   The encoding ISO-8859-11 is not yet official at the time of this writing.
   It is based on TIS-620, but with the addition of the non-breaking space.
  
   The mapping of 0xfc-0xff is identical to Latin-1 but this should be
   checked.
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE (DEL)
      A0 |  000000A0 | NO-BREAK SPACE
      A1 |  00000E01 | THAI CHARACTER KO KAI
      A2 |  00000E02 | THAI CHARACTER KHO KHAI
      A3 |  00000E03 | THAI CHARACTER KHO KHUAT
      A4 |  00000E04 | THAI CHARACTER KHO KHWAI
      A5 |  00000E05 | THAI CHARACTER KHO KHON
      A6 |  00000E06 | THAI CHARACTER KHO RAKHANG
      A7 |  00000E07 | THAI CHARACTER NGO NGU
      A8 |  00000E08 | THAI CHARACTER CHO CHAN
      A9 |  00000E09 | THAI CHARACTER CHO CHING
      AA |  00000E0A | THAI CHARACTER CHO CHANG
      AB |  00000E0B | THAI CHARACTER SO SO
      AC |  00000E0C | THAI CHARACTER CHO CHOE
      AD |  00000E0D | THAI CHARACTER YO YING
      AE |  00000E0E | THAI CHARACTER DO CHADA
      AF |  00000E0F | THAI CHARACTER TO PATAK
      B0 |  00000E10 | THAI CHARACTER THO THAN
      B1 |  00000E11 | THAI CHARACTER THO NANGMONTHO
      B2 |  00000E12 | THAI CHARACTER THO PHUTHAO
      B3 |  00000E13 | THAI CHARACTER NO NEN
      B4 |  00000E14 | THAI CHARACTER DO DEK
      B5 |  00000E15 | THAI CHARACTER TO TAO
      B6 |  00000E16 | THAI CHARACTER THO THUNG
      B7 |  00000E17 | THAI CHARACTER THO THAHAN
      B8 |  00000E18 | THAI CHARACTER THO THONG
      B9 |  00000E19 | THAI CHARACTER NO NU
      BA |  00000E1A | THAI CHARACTER BO BAIMAI
      BB |  00000E1B | THAI CHARACTER PO PLA
      BC |  00000E1C | THAI CHARACTER PHO PHUNG
      BD |  00000E1D | THAI CHARACTER FO FA
      BE |  00000E1E | THAI CHARACTER PHO PHAN
      BF |  00000E1F | THAI CHARACTER FO FAN
      C0 |  00000E20 | THAI CHARACTER PHO SAMPHAO
      C1 |  00000E21 | THAI CHARACTER MO MA
      C2 |  00000E22 | THAI CHARACTER YO YAK
      C3 |  00000E23 | THAI CHARACTER RO RUA
      C4 |  00000E24 | THAI CHARACTER RU
      C5 |  00000E25 | THAI CHARACTER LO LING
      C6 |  00000E26 | THAI CHARACTER LU
      C7 |  00000E27 | THAI CHARACTER WO WAEN
      C8 |  00000E28 | THAI CHARACTER SO SALA
      C9 |  00000E29 | THAI CHARACTER SO RUSI
      CA |  00000E2A | THAI CHARACTER SO SUA
      CB |  00000E2B | THAI CHARACTER HO HIP
      CC |  00000E2C | THAI CHARACTER LO CHULA
      CD |  00000E2D | THAI CHARACTER O ANG
      CE |  00000E2E | THAI CHARACTER HO NOKHUK
      CF |  00000E2F | THAI CHARACTER PAIYANNOI
      D0 |  00000E30 | THAI CHARACTER SARA A
      D1 |  00000E31 | THAI CHARACTER MAI HAN-AKAT
      D2 |  00000E32 | THAI CHARACTER SARA AA
      D3 |  00000E33 | THAI CHARACTER SARA AM
      D4 |  00000E34 | THAI CHARACTER SARA I
      D5 |  00000E35 | THAI CHARACTER SARA II
      D6 |  00000E36 | THAI CHARACTER SARA UE
      D7 |  00000E37 | THAI CHARACTER SARA UEE
      D8 |  00000E38 | THAI CHARACTER SARA U
      D9 |  00000E39 | THAI CHARACTER SARA UU
      DA |  00000E3A | THAI CHARACTER PHINTHU
      DF |  00000E3F | THAI CHARACTER SYMBOL BAHT
      E0 |  00000E40 | THAI CHARACTER SARA E
      E1 |  00000E41 | THAI CHARACTER SARA AE
      E2 |  00000E42 | THAI CHARACTER SARA O
      E3 |  00000E43 | THAI CHARACTER SARA AI MAIMUAN
      E4 |  00000E44 | THAI CHARACTER SARA AI MAIMALAI
      E5 |  00000E45 | THAI CHARACTER LAKKHANGYAO
      E6 |  00000E46 | THAI CHARACTER MAIYAMOK
      E7 |  00000E47 | THAI CHARACTER MAITAIKHU
      E8 |  00000E48 | THAI CHARACTER MAI EK
      E9 |  00000E49 | THAI CHARACTER MAI THO
      EA |  00000E4A | THAI CHARACTER MAI TRI
      EB |  00000E4B | THAI CHARACTER MAI CHATTAWA
      EC |  00000E4C | THAI CHARACTER THANTHAKHAT
      ED |  00000E4D | THAI CHARACTER NIKHAHIT
      EE |  00000E4E | THAI CHARACTER YAMAKKAN
      EF |  00000E4F | THAI CHARACTER FONGMAN
      F0 |  00000E50 | THAI DIGIT ZERO
      F1 |  00000E51 | THAI DIGIT ONE
      F2 |  00000E52 | THAI DIGIT TWO
      F3 |  00000E53 | THAI DIGIT THREE
      F4 |  00000E54 | THAI DIGIT FOUR
      F5 |  00000E55 | THAI DIGIT FIVE
      F6 |  00000E56 | THAI DIGIT SIX
      F7 |  00000E57 | THAI DIGIT SEVEN
      F8 |  00000E58 | THAI DIGIT EIGHT
      F9 |  00000E59 | THAI DIGIT NINE
      FA |  00000E5A | THAI CHARACTER ANGKHANKHU
      FB |  00000E5B | THAI CHARACTER KHOMUT
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_ISO_8859_11

    $main::fatpacked{"Locale/RecodeData/ISO_8859_13.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_ISO_8859_13';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for ISO-8859-13.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::ISO_8859_13;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0x0080,
      0x0081,
      0x0082,
      0x0083,
      0x0084,
      0x0085,
      0x0086,
      0x0087,
      0x0088,
      0x0089,
      0x008a,
      0x008b,
      0x008c,
      0x008d,
      0x008e,
      0x008f,
      0x0090,
      0x0091,
      0x0092,
      0x0093,
      0x0094,
      0x0095,
      0x0096,
      0x0097,
      0x0098,
      0x0099,
      0x009a,
      0x009b,
      0x009c,
      0x009d,
      0x009e,
      0x009f,
      0x00a0,
      0x201d,
      0x00a2,
      0x00a3,
      0x00a4,
      0x201e,
      0x00a6,
      0x00a7,
      0x00d8,
      0x00a9,
      0x0156,
      0x00ab,
      0x00ac,
      0x00ad,
      0x00ae,
      0x00c6,
      0x00b0,
      0x00b1,
      0x00b2,
      0x00b3,
      0x201c,
      0x00b5,
      0x00b6,
      0x00b7,
      0x00f8,
      0x00b9,
      0x0157,
      0x00bb,
      0x00bc,
      0x00bd,
      0x00be,
      0x00e6,
      0x0104,
      0x012e,
      0x0100,
      0x0106,
      0x00c4,
      0x00c5,
      0x0118,
      0x0112,
      0x010c,
      0x00c9,
      0x0179,
      0x0116,
      0x0122,
      0x0136,
      0x012a,
      0x013b,
      0x0160,
      0x0143,
      0x0145,
      0x00d3,
      0x014c,
      0x00d5,
      0x00d6,
      0x00d7,
      0x0172,
      0x0141,
      0x015a,
      0x016a,
      0x00dc,
      0x017b,
      0x017d,
      0x00df,
      0x0105,
      0x012f,
      0x0101,
      0x0107,
      0x00e4,
      0x00e5,
      0x0119,
      0x0113,
      0x010d,
      0x00e9,
      0x017a,
      0x0117,
      0x0123,
      0x0137,
      0x012b,
      0x013c,
      0x0161,
      0x0144,
      0x0146,
      0x00f3,
      0x014d,
      0x00f5,
      0x00f6,
      0x00f7,
      0x0173,
      0x0142,
      0x015b,
      0x016b,
      0x00fc,
      0x017c,
      0x017e,
      0x2019,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xc2\x80",
      "\xc2\x81",
      "\xc2\x82",
      "\xc2\x83",
      "\xc2\x84",
      "\xc2\x85",
      "\xc2\x86",
      "\xc2\x87",
      "\xc2\x88",
      "\xc2\x89",
      "\xc2\x8a",
      "\xc2\x8b",
      "\xc2\x8c",
      "\xc2\x8d",
      "\xc2\x8e",
      "\xc2\x8f",
      "\xc2\x90",
      "\xc2\x91",
      "\xc2\x92",
      "\xc2\x93",
      "\xc2\x94",
      "\xc2\x95",
      "\xc2\x96",
      "\xc2\x97",
      "\xc2\x98",
      "\xc2\x99",
      "\xc2\x9a",
      "\xc2\x9b",
      "\xc2\x9c",
      "\xc2\x9d",
      "\xc2\x9e",
      "\xc2\x9f",
      "\xc2\xa0",
      "\xe2\x80\x9d",
      "\xc2\xa2",
      "\xc2\xa3",
      "\xc2\xa4",
      "\xe2\x80\x9e",
      "\xc2\xa6",
      "\xc2\xa7",
      "\xc3\x98",
      "\xc2\xa9",
      "\xc5\x96",
      "\xc2\xab",
      "\xc2\xac",
      "\xc2\xad",
      "\xc2\xae",
      "\xc3\x86",
      "\xc2\xb0",
      "\xc2\xb1",
      "\xc2\xb2",
      "\xc2\xb3",
      "\xe2\x80\x9c",
      "\xc2\xb5",
      "\xc2\xb6",
      "\xc2\xb7",
      "\xc3\xb8",
      "\xc2\xb9",
      "\xc5\x97",
      "\xc2\xbb",
      "\xc2\xbc",
      "\xc2\xbd",
      "\xc2\xbe",
      "\xc3\xa6",
      "\xc4\x84",
      "\xc4\xae",
      "\xc4\x80",
      "\xc4\x86",
      "\xc3\x84",
      "\xc3\x85",
      "\xc4\x98",
      "\xc4\x92",
      "\xc4\x8c",
      "\xc3\x89",
      "\xc5\xb9",
      "\xc4\x96",
      "\xc4\xa2",
      "\xc4\xb6",
      "\xc4\xaa",
      "\xc4\xbb",
      "\xc5\xa0",
      "\xc5\x83",
      "\xc5\x85",
      "\xc3\x93",
      "\xc5\x8c",
      "\xc3\x95",
      "\xc3\x96",
      "\xc3\x97",
      "\xc5\xb2",
      "\xc5\x81",
      "\xc5\x9a",
      "\xc5\xaa",
      "\xc3\x9c",
      "\xc5\xbb",
      "\xc5\xbd",
      "\xc3\x9f",
      "\xc4\x85",
      "\xc4\xaf",
      "\xc4\x81",
      "\xc4\x87",
      "\xc3\xa4",
      "\xc3\xa5",
      "\xc4\x99",
      "\xc4\x93",
      "\xc4\x8d",
      "\xc3\xa9",
      "\xc5\xba",
      "\xc4\x97",
      "\xc4\xa3",
      "\xc4\xb7",
      "\xc4\xab",
      "\xc4\xbc",
      "\xc5\xa1",
      "\xc5\x84",
      "\xc5\x86",
      "\xc3\xb3",
      "\xc5\x8d",
      "\xc3\xb5",
      "\xc3\xb6",
      "\xc3\xb7",
      "\xc5\xb3",
      "\xc5\x82",
      "\xc5\x9b",
      "\xc5\xab",
      "\xc3\xbc",
      "\xc5\xbc",
      "\xc5\xbe",
      "\xe2\x80\x99",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x00000080 => "\x80",
      0x00000081 => "\x81",
      0x00000082 => "\x82",
      0x00000083 => "\x83",
      0x00000084 => "\x84",
      0x00000085 => "\x85",
      0x00000086 => "\x86",
      0x00000087 => "\x87",
      0x00000088 => "\x88",
      0x00000089 => "\x89",
      0x0000008a => "\x8a",
      0x0000008b => "\x8b",
      0x0000008c => "\x8c",
      0x0000008d => "\x8d",
      0x0000008e => "\x8e",
      0x0000008f => "\x8f",
      0x00000090 => "\x90",
      0x00000091 => "\x91",
      0x00000092 => "\x92",
      0x00000093 => "\x93",
      0x00000094 => "\x94",
      0x00000095 => "\x95",
      0x00000096 => "\x96",
      0x00000097 => "\x97",
      0x00000098 => "\x98",
      0x00000099 => "\x99",
      0x0000009a => "\x9a",
      0x0000009b => "\x9b",
      0x0000009c => "\x9c",
      0x0000009d => "\x9d",
      0x0000009e => "\x9e",
      0x0000009f => "\x9f",
      0x000000a0 => "\xa0",
      0x000000a2 => "\xa2",
      0x000000a3 => "\xa3",
      0x000000a4 => "\xa4",
      0x000000a6 => "\xa6",
      0x000000a7 => "\xa7",
      0x000000a9 => "\xa9",
      0x000000ab => "\xab",
      0x000000ac => "\xac",
      0x000000ad => "\xad",
      0x000000ae => "\xae",
      0x000000b0 => "\xb0",
      0x000000b1 => "\xb1",
      0x000000b2 => "\xb2",
      0x000000b3 => "\xb3",
      0x000000b5 => "\xb5",
      0x000000b6 => "\xb6",
      0x000000b7 => "\xb7",
      0x000000b9 => "\xb9",
      0x000000bb => "\xbb",
      0x000000bc => "\xbc",
      0x000000bd => "\xbd",
      0x000000be => "\xbe",
      0x000000c4 => "\xc4",
      0x000000c5 => "\xc5",
      0x000000c6 => "\xaf",
      0x000000c9 => "\xc9",
      0x000000d3 => "\xd3",
      0x000000d5 => "\xd5",
      0x000000d6 => "\xd6",
      0x000000d7 => "\xd7",
      0x000000d8 => "\xa8",
      0x000000dc => "\xdc",
      0x000000df => "\xdf",
      0x000000e4 => "\xe4",
      0x000000e5 => "\xe5",
      0x000000e6 => "\xbf",
      0x000000e9 => "\xe9",
      0x000000f3 => "\xf3",
      0x000000f5 => "\xf5",
      0x000000f6 => "\xf6",
      0x000000f7 => "\xf7",
      0x000000f8 => "\xb8",
      0x000000fc => "\xfc",
      0x00000100 => "\xc2",
      0x00000101 => "\xe2",
      0x00000104 => "\xc0",
      0x00000105 => "\xe0",
      0x00000106 => "\xc3",
      0x00000107 => "\xe3",
      0x0000010c => "\xc8",
      0x0000010d => "\xe8",
      0x00000112 => "\xc7",
      0x00000113 => "\xe7",
      0x00000116 => "\xcb",
      0x00000117 => "\xeb",
      0x00000118 => "\xc6",
      0x00000119 => "\xe6",
      0x00000122 => "\xcc",
      0x00000123 => "\xec",
      0x0000012a => "\xce",
      0x0000012b => "\xee",
      0x0000012e => "\xc1",
      0x0000012f => "\xe1",
      0x00000136 => "\xcd",
      0x00000137 => "\xed",
      0x0000013b => "\xcf",
      0x0000013c => "\xef",
      0x00000141 => "\xd9",
      0x00000142 => "\xf9",
      0x00000143 => "\xd1",
      0x00000144 => "\xf1",
      0x00000145 => "\xd2",
      0x00000146 => "\xf2",
      0x0000014c => "\xd4",
      0x0000014d => "\xf4",
      0x00000156 => "\xaa",
      0x00000157 => "\xba",
      0x0000015a => "\xda",
      0x0000015b => "\xfa",
      0x00000160 => "\xd0",
      0x00000161 => "\xf0",
      0x0000016a => "\xdb",
      0x0000016b => "\xfb",
      0x00000172 => "\xd8",
      0x00000173 => "\xf8",
      0x00000179 => "\xca",
      0x0000017a => "\xea",
      0x0000017b => "\xdd",
      0x0000017c => "\xfd",
      0x0000017d => "\xde",
      0x0000017e => "\xfe",
      0x00002019 => "\xff",
      0x0000201c => "\xb4",
      0x0000201d => "\xa1",
      0x0000201e => "\xa5",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::ISO_8859_13 - Conversion routines for ISO-8859-13
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for ISO-8859-13.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   automatically generated from the charDB
   alias ISO-IR-179
   alias LATIN7
   alias L7
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL
      01 |  00000001 | START OF HEADING
      02 |  00000002 | START OF TEXT
      03 |  00000003 | END OF TEXT
      04 |  00000004 | END OF TRANSMISSION
      05 |  00000005 | ENQUIRY
      06 |  00000006 | ACKNOWLEDGE
      07 |  00000007 | BELL
      08 |  00000008 | BACKSPACE
      09 |  00000009 | HORIZONTAL TABULATION
      0A |  0000000A | LINE FEED
      0B |  0000000B | VERTICAL TABULATION
      0C |  0000000C | FORM FEED
      0D |  0000000D | CARRIAGE RETURN
      0E |  0000000E | SHIFT OUT
      0F |  0000000F | SHIFT IN
      10 |  00000010 | DATA LINK ESCAPE
      11 |  00000011 | DEVICE CONTROL ONE
      12 |  00000012 | DEVICE CONTROL TWO
      13 |  00000013 | DEVICE CONTROL THREE
      14 |  00000014 | DEVICE CONTROL FOUR
      15 |  00000015 | NEGATIVE ACKNOWLEDGE
      16 |  00000016 | SYNCHRONOUS IDLE
      17 |  00000017 | END OF TRANSMISSION BLOCK
      18 |  00000018 | CANCEL
      19 |  00000019 | END OF MEDIUM
      1A |  0000001A | SUBSTITUTE
      1B |  0000001B | ESCAPE
      1C |  0000001C | FILE SEPARATOR
      1D |  0000001D | GROUP SEPARATOR
      1E |  0000001E | RECORD SEPARATOR
      1F |  0000001F | UNIT SEPARATOR
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE
      80 |  00000080 | PADDING CHARACTER (PAD)
      81 |  00000081 | HIGH OCTET PRESET (HOP)
      82 |  00000082 | BREAK PERMITTED HERE (BPH)
      83 |  00000083 | NO BREAK HERE (NBH)
      84 |  00000084 | INDEX (IND)
      85 |  00000085 | NEXT LINE (NEL)
      86 |  00000086 | START OF SELECTED AREA (SSA)
      87 |  00000087 | END OF SELECTED AREA (ESA)
      88 |  00000088 | CHARACTER TABULATION SET (HTS)
      89 |  00000089 | CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
      8A |  0000008A | LINE TABULATION SET (VTS)
      8B |  0000008B | PARTIAL LINE FORWARD (PLD)
      8C |  0000008C | PARTIAL LINE BACKWARD (PLU)
      8D |  0000008D | REVERSE LINE FEED (RI)
      8E |  0000008E | SINGLE-SHIFT TWO (SS2)
      8F |  0000008F | SINGLE-SHIFT THREE (SS3)
      90 |  00000090 | DEVICE CONTROL STRING (DCS)
      91 |  00000091 | PRIVATE USE ONE (PU1)
      92 |  00000092 | PRIVATE USE TWO (PU2)
      93 |  00000093 | SET TRANSMIT STATE (STS)
      94 |  00000094 | CANCEL CHARACTER (CCH)
      95 |  00000095 | MESSAGE WAITING (MW)
      96 |  00000096 | START OF GUARDED AREA (SPA)
      97 |  00000097 | END OF GUARDED AREA (EPA)
      98 |  00000098 | START OF STRING (SOS)
      99 |  00000099 | SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
      9A |  0000009A | SINGLE CHARACTER INTRODUCER (SCI)
      9B |  0000009B | CONTROL SEQUENCE INTRODUCER (CSI)
      9C |  0000009C | STRING TERMINATOR (ST)
      9D |  0000009D | OPERATING SYSTEM COMMAND (OSC)
      9E |  0000009E | PRIVACY MESSAGE (PM)
      9F |  0000009F | APPLICATION PROGRAM COMMAND (APC)
      A0 |  000000A0 | NO-BREAK SPACE
      A1 |  0000201D | RIGHT DOUBLE QUOTATION MARK
      A2 |  000000A2 | CENT SIGN
      A3 |  000000A3 | POUND SIGN
      A4 |  000000A4 | CURRENCY SIGN
      A5 |  0000201E | DOUBLE LOW-9 QUOTATION MARK
      A6 |  000000A6 | BROKEN BAR
      A7 |  000000A7 | SECTION SIGN
      A8 |  000000D8 | LATIN CAPITAL LETTER O WITH STROKE
      A9 |  000000A9 | COPYRIGHT SIGN
      AA |  00000156 | LATIN CAPITAL LETTER R WITH CEDILLA
      AB |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
      AC |  000000AC | NOT SIGN
      AD |  000000AD | SOFT HYPHEN
      AE |  000000AE | REGISTERED SIGN
      AF |  000000C6 | LATIN CAPITAL LETTER AE
      B0 |  000000B0 | DEGREE SIGN
      B1 |  000000B1 | PLUS-MINUS SIGN
      B2 |  000000B2 | SUPERSCRIPT TWO
      B3 |  000000B3 | SUPERSCRIPT THREE
      B4 |  0000201C | LEFT DOUBLE QUOTATION MARK
      B5 |  000000B5 | MICRO SIGN
      B6 |  000000B6 | PILCROW SIGN
      B7 |  000000B7 | MIDDLE DOT
      B8 |  000000F8 | LATIN SMALL LETTER O WITH STROKE
      B9 |  000000B9 | SUPERSCRIPT ONE
      BA |  00000157 | LATIN SMALL LETTER R WITH CEDILLA
      BB |  000000BB | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
      BC |  000000BC | VULGAR FRACTION ONE QUARTER
      BD |  000000BD | VULGAR FRACTION ONE HALF
      BE |  000000BE | VULGAR FRACTION THREE QUARTERS
      BF |  000000E6 | LATIN SMALL LETTER AE
      C0 |  00000104 | LATIN CAPITAL LETTER A WITH OGONEK
      C1 |  0000012E | LATIN CAPITAL LETTER I WITH OGONEK
      C2 |  00000100 | LATIN CAPITAL LETTER A WITH MACRON
      C3 |  00000106 | LATIN CAPITAL LETTER C WITH ACUTE
      C4 |  000000C4 | LATIN CAPITAL LETTER A WITH DIAERESIS
      C5 |  000000C5 | LATIN CAPITAL LETTER A WITH RING ABOVE
      C6 |  00000118 | LATIN CAPITAL LETTER E WITH OGONEK
      C7 |  00000112 | LATIN CAPITAL LETTER E WITH MACRON
      C8 |  0000010C | LATIN CAPITAL LETTER C WITH CARON
      C9 |  000000C9 | LATIN CAPITAL LETTER E WITH ACUTE
      CA |  00000179 | LATIN CAPITAL LETTER Z WITH ACUTE
      CB |  00000116 | LATIN CAPITAL LETTER E WITH DOT ABOVE
      CC |  00000122 | LATIN CAPITAL LETTER G WITH CEDILLA
      CD |  00000136 | LATIN CAPITAL LETTER K WITH CEDILLA
      CE |  0000012A | LATIN CAPITAL LETTER I WITH MACRON
      CF |  0000013B | LATIN CAPITAL LETTER L WITH CEDILLA
      D0 |  00000160 | LATIN CAPITAL LETTER S WITH CARON
      D1 |  00000143 | LATIN CAPITAL LETTER N WITH ACUTE
      D2 |  00000145 | LATIN CAPITAL LETTER N WITH CEDILLA
      D3 |  000000D3 | LATIN CAPITAL LETTER O WITH ACUTE
      D4 |  0000014C | LATIN CAPITAL LETTER O WITH MACRON
      D5 |  000000D5 | LATIN CAPITAL LETTER O WITH TILDE
      D6 |  000000D6 | LATIN CAPITAL LETTER O WITH DIAERESIS
      D7 |  000000D7 | MULTIPLICATION SIGN
      D8 |  00000172 | LATIN CAPITAL LETTER U WITH OGONEK
      D9 |  00000141 | LATIN CAPITAL LETTER L WITH STROKE
      DA |  0000015A | LATIN CAPITAL LETTER S WITH ACUTE
      DB |  0000016A | LATIN CAPITAL LETTER U WITH MACRON
      DC |  000000DC | LATIN CAPITAL LETTER U WITH DIAERESIS
      DD |  0000017B | LATIN CAPITAL LETTER Z WITH DOT ABOVE
      DE |  0000017D | LATIN CAPITAL LETTER Z WITH CARON
      DF |  000000DF | LATIN SMALL LETTER SHARP S
      E0 |  00000105 | LATIN SMALL LETTER A WITH OGONEK
      E1 |  0000012F | LATIN SMALL LETTER I WITH OGONEK
      E2 |  00000101 | LATIN SMALL LETTER A WITH MACRON
      E3 |  00000107 | LATIN SMALL LETTER C WITH ACUTE
      E4 |  000000E4 | LATIN SMALL LETTER A WITH DIAERESIS
      E5 |  000000E5 | LATIN SMALL LETTER A WITH RING ABOVE
      E6 |  00000119 | LATIN SMALL LETTER E WITH OGONEK
      E7 |  00000113 | LATIN SMALL LETTER E WITH MACRON
      E8 |  0000010D | LATIN SMALL LETTER C WITH CARON
      E9 |  000000E9 | LATIN SMALL LETTER E WITH ACUTE
      EA |  0000017A | LATIN SMALL LETTER Z WITH ACUTE
      EB |  00000117 | LATIN SMALL LETTER E WITH DOT ABOVE
      EC |  00000123 | LATIN SMALL LETTER G WITH CEDILLA
      ED |  00000137 | LATIN SMALL LETTER K WITH CEDILLA
      EE |  0000012B | LATIN SMALL LETTER I WITH MACRON
      EF |  0000013C | LATIN SMALL LETTER L WITH CEDILLA
      F0 |  00000161 | LATIN SMALL LETTER S WITH CARON
      F1 |  00000144 | LATIN SMALL LETTER N WITH ACUTE
      F2 |  00000146 | LATIN SMALL LETTER N WITH CEDILLA
      F3 |  000000F3 | LATIN SMALL LETTER O WITH ACUTE
      F4 |  0000014D | LATIN SMALL LETTER O WITH MACRON
      F5 |  000000F5 | LATIN SMALL LETTER O WITH TILDE
      F6 |  000000F6 | LATIN SMALL LETTER O WITH DIAERESIS
      F7 |  000000F7 | DIVISION SIGN
      F8 |  00000173 | LATIN SMALL LETTER U WITH OGONEK
      F9 |  00000142 | LATIN SMALL LETTER L WITH STROKE
      FA |  0000015B | LATIN SMALL LETTER S WITH ACUTE
      FB |  0000016B | LATIN SMALL LETTER U WITH MACRON
      FC |  000000FC | LATIN SMALL LETTER U WITH DIAERESIS
      FD |  0000017C | LATIN SMALL LETTER Z WITH DOT ABOVE
      FE |  0000017E | LATIN SMALL LETTER Z WITH CARON
      FF |  00002019 | RIGHT SINGLE QUOTATION MARK
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_ISO_8859_13

    $main::fatpacked{"Locale/RecodeData/ISO_8859_14.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_ISO_8859_14';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for ISO-8859-14.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::ISO_8859_14;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0x0080,
      0x0081,
      0x0082,
      0x0083,
      0x0084,
      0x0085,
      0x0086,
      0x0087,
      0x0088,
      0x0089,
      0x008a,
      0x008b,
      0x008c,
      0x008d,
      0x008e,
      0x008f,
      0x0090,
      0x0091,
      0x0092,
      0x0093,
      0x0094,
      0x0095,
      0x0096,
      0x0097,
      0x0098,
      0x0099,
      0x009a,
      0x009b,
      0x009c,
      0x009d,
      0x009e,
      0x009f,
      0x00a0,
      0x1e02,
      0x1e03,
      0x00a3,
      0x010a,
      0x010b,
      0x1e0a,
      0x00a7,
      0x1e80,
      0x00a9,
      0x1e82,
      0x1e0b,
      0x1ef2,
      0x00ad,
      0x00ae,
      0x0178,
      0x1e1e,
      0x1e1f,
      0x0120,
      0x0121,
      0x1e40,
      0x1e41,
      0x00b6,
      0x1e56,
      0x1e81,
      0x1e57,
      0x1e83,
      0x1e60,
      0x1ef3,
      0x1e84,
      0x1e85,
      0x1e61,
      0x00c0,
      0x00c1,
      0x00c2,
      0x00c3,
      0x00c4,
      0x00c5,
      0x00c6,
      0x00c7,
      0x00c8,
      0x00c9,
      0x00ca,
      0x00cb,
      0x00cc,
      0x00cd,
      0x00ce,
      0x00cf,
      0x0174,
      0x00d1,
      0x00d2,
      0x00d3,
      0x00d4,
      0x00d5,
      0x00d6,
      0x1e6a,
      0x00d8,
      0x00d9,
      0x00da,
      0x00db,
      0x00dc,
      0x00dd,
      0x0176,
      0x00df,
      0x00e0,
      0x00e1,
      0x00e2,
      0x00e3,
      0x00e4,
      0x00e5,
      0x00e6,
      0x00e7,
      0x00e8,
      0x00e9,
      0x00ea,
      0x00eb,
      0x00ec,
      0x00ed,
      0x00ee,
      0x00ef,
      0x0175,
      0x00f1,
      0x00f2,
      0x00f3,
      0x00f4,
      0x00f5,
      0x00f6,
      0x1e6b,
      0x00f8,
      0x00f9,
      0x00fa,
      0x00fb,
      0x00fc,
      0x00fd,
      0x0177,
      0x00ff,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xc2\x80",
      "\xc2\x81",
      "\xc2\x82",
      "\xc2\x83",
      "\xc2\x84",
      "\xc2\x85",
      "\xc2\x86",
      "\xc2\x87",
      "\xc2\x88",
      "\xc2\x89",
      "\xc2\x8a",
      "\xc2\x8b",
      "\xc2\x8c",
      "\xc2\x8d",
      "\xc2\x8e",
      "\xc2\x8f",
      "\xc2\x90",
      "\xc2\x91",
      "\xc2\x92",
      "\xc2\x93",
      "\xc2\x94",
      "\xc2\x95",
      "\xc2\x96",
      "\xc2\x97",
      "\xc2\x98",
      "\xc2\x99",
      "\xc2\x9a",
      "\xc2\x9b",
      "\xc2\x9c",
      "\xc2\x9d",
      "\xc2\x9e",
      "\xc2\x9f",
      "\xc2\xa0",
      "\xe1\xb8\x82",
      "\xe1\xb8\x83",
      "\xc2\xa3",
      "\xc4\x8a",
      "\xc4\x8b",
      "\xe1\xb8\x8a",
      "\xc2\xa7",
      "\xe1\xba\x80",
      "\xc2\xa9",
      "\xe1\xba\x82",
      "\xe1\xb8\x8b",
      "\xe1\xbb\xb2",
      "\xc2\xad",
      "\xc2\xae",
      "\xc5\xb8",
      "\xe1\xb8\x9e",
      "\xe1\xb8\x9f",
      "\xc4\xa0",
      "\xc4\xa1",
      "\xe1\xb9\x80",
      "\xe1\xb9\x81",
      "\xc2\xb6",
      "\xe1\xb9\x96",
      "\xe1\xba\x81",
      "\xe1\xb9\x97",
      "\xe1\xba\x83",
      "\xe1\xb9\xa0",
      "\xe1\xbb\xb3",
      "\xe1\xba\x84",
      "\xe1\xba\x85",
      "\xe1\xb9\xa1",
      "\xc3\x80",
      "\xc3\x81",
      "\xc3\x82",
      "\xc3\x83",
      "\xc3\x84",
      "\xc3\x85",
      "\xc3\x86",
      "\xc3\x87",
      "\xc3\x88",
      "\xc3\x89",
      "\xc3\x8a",
      "\xc3\x8b",
      "\xc3\x8c",
      "\xc3\x8d",
      "\xc3\x8e",
      "\xc3\x8f",
      "\xc5\xb4",
      "\xc3\x91",
      "\xc3\x92",
      "\xc3\x93",
      "\xc3\x94",
      "\xc3\x95",
      "\xc3\x96",
      "\xe1\xb9\xaa",
      "\xc3\x98",
      "\xc3\x99",
      "\xc3\x9a",
      "\xc3\x9b",
      "\xc3\x9c",
      "\xc3\x9d",
      "\xc5\xb6",
      "\xc3\x9f",
      "\xc3\xa0",
      "\xc3\xa1",
      "\xc3\xa2",
      "\xc3\xa3",
      "\xc3\xa4",
      "\xc3\xa5",
      "\xc3\xa6",
      "\xc3\xa7",
      "\xc3\xa8",
      "\xc3\xa9",
      "\xc3\xaa",
      "\xc3\xab",
      "\xc3\xac",
      "\xc3\xad",
      "\xc3\xae",
      "\xc3\xaf",
      "\xc5\xb5",
      "\xc3\xb1",
      "\xc3\xb2",
      "\xc3\xb3",
      "\xc3\xb4",
      "\xc3\xb5",
      "\xc3\xb6",
      "\xe1\xb9\xab",
      "\xc3\xb8",
      "\xc3\xb9",
      "\xc3\xba",
      "\xc3\xbb",
      "\xc3\xbc",
      "\xc3\xbd",
      "\xc5\xb7",
      "\xc3\xbf",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x00000080 => "\x80",
      0x00000081 => "\x81",
      0x00000082 => "\x82",
      0x00000083 => "\x83",
      0x00000084 => "\x84",
      0x00000085 => "\x85",
      0x00000086 => "\x86",
      0x00000087 => "\x87",
      0x00000088 => "\x88",
      0x00000089 => "\x89",
      0x0000008a => "\x8a",
      0x0000008b => "\x8b",
      0x0000008c => "\x8c",
      0x0000008d => "\x8d",
      0x0000008e => "\x8e",
      0x0000008f => "\x8f",
      0x00000090 => "\x90",
      0x00000091 => "\x91",
      0x00000092 => "\x92",
      0x00000093 => "\x93",
      0x00000094 => "\x94",
      0x00000095 => "\x95",
      0x00000096 => "\x96",
      0x00000097 => "\x97",
      0x00000098 => "\x98",
      0x00000099 => "\x99",
      0x0000009a => "\x9a",
      0x0000009b => "\x9b",
      0x0000009c => "\x9c",
      0x0000009d => "\x9d",
      0x0000009e => "\x9e",
      0x0000009f => "\x9f",
      0x000000a0 => "\xa0",
      0x000000a3 => "\xa3",
      0x000000a7 => "\xa7",
      0x000000a9 => "\xa9",
      0x000000ad => "\xad",
      0x000000ae => "\xae",
      0x000000b6 => "\xb6",
      0x000000c0 => "\xc0",
      0x000000c1 => "\xc1",
      0x000000c2 => "\xc2",
      0x000000c3 => "\xc3",
      0x000000c4 => "\xc4",
      0x000000c5 => "\xc5",
      0x000000c6 => "\xc6",
      0x000000c7 => "\xc7",
      0x000000c8 => "\xc8",
      0x000000c9 => "\xc9",
      0x000000ca => "\xca",
      0x000000cb => "\xcb",
      0x000000cc => "\xcc",
      0x000000cd => "\xcd",
      0x000000ce => "\xce",
      0x000000cf => "\xcf",
      0x000000d1 => "\xd1",
      0x000000d2 => "\xd2",
      0x000000d3 => "\xd3",
      0x000000d4 => "\xd4",
      0x000000d5 => "\xd5",
      0x000000d6 => "\xd6",
      0x000000d8 => "\xd8",
      0x000000d9 => "\xd9",
      0x000000da => "\xda",
      0x000000db => "\xdb",
      0x000000dc => "\xdc",
      0x000000dd => "\xdd",
      0x000000df => "\xdf",
      0x000000e0 => "\xe0",
      0x000000e1 => "\xe1",
      0x000000e2 => "\xe2",
      0x000000e3 => "\xe3",
      0x000000e4 => "\xe4",
      0x000000e5 => "\xe5",
      0x000000e6 => "\xe6",
      0x000000e7 => "\xe7",
      0x000000e8 => "\xe8",
      0x000000e9 => "\xe9",
      0x000000ea => "\xea",
      0x000000eb => "\xeb",
      0x000000ec => "\xec",
      0x000000ed => "\xed",
      0x000000ee => "\xee",
      0x000000ef => "\xef",
      0x000000f1 => "\xf1",
      0x000000f2 => "\xf2",
      0x000000f3 => "\xf3",
      0x000000f4 => "\xf4",
      0x000000f5 => "\xf5",
      0x000000f6 => "\xf6",
      0x000000f8 => "\xf8",
      0x000000f9 => "\xf9",
      0x000000fa => "\xfa",
      0x000000fb => "\xfb",
      0x000000fc => "\xfc",
      0x000000fd => "\xfd",
      0x000000ff => "\xff",
      0x0000010a => "\xa4",
      0x0000010b => "\xa5",
      0x00000120 => "\xb2",
      0x00000121 => "\xb3",
      0x00000174 => "\xd0",
      0x00000175 => "\xf0",
      0x00000176 => "\xde",
      0x00000177 => "\xfe",
      0x00000178 => "\xaf",
      0x00001e02 => "\xa1",
      0x00001e03 => "\xa2",
      0x00001e0a => "\xa6",
      0x00001e0b => "\xab",
      0x00001e1e => "\xb0",
      0x00001e1f => "\xb1",
      0x00001e40 => "\xb4",
      0x00001e41 => "\xb5",
      0x00001e56 => "\xb7",
      0x00001e57 => "\xb9",
      0x00001e60 => "\xbb",
      0x00001e61 => "\xbf",
      0x00001e6a => "\xd7",
      0x00001e6b => "\xf7",
      0x00001e80 => "\xa8",
      0x00001e81 => "\xb8",
      0x00001e82 => "\xaa",
      0x00001e83 => "\xba",
      0x00001e84 => "\xbd",
      0x00001e85 => "\xbe",
      0x00001ef2 => "\xac",
      0x00001ef3 => "\xbc",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::ISO_8859_14 - Conversion routines for ISO-8859-14
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for ISO-8859-14.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   automatically generated from the charDB
   alias LATIN8
   alias L8
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL
      01 |  00000001 | START OF HEADING
      02 |  00000002 | START OF TEXT
      03 |  00000003 | END OF TEXT
      04 |  00000004 | END OF TRANSMISSION
      05 |  00000005 | ENQUIRY
      06 |  00000006 | ACKNOWLEDGE
      07 |  00000007 | BELL
      08 |  00000008 | BACKSPACE
      09 |  00000009 | HORIZONTAL TABULATION
      0A |  0000000A | LINE FEED
      0B |  0000000B | VERTICAL TABULATION
      0C |  0000000C | FORM FEED
      0D |  0000000D | CARRIAGE RETURN
      0E |  0000000E | SHIFT OUT
      0F |  0000000F | SHIFT IN
      10 |  00000010 | DATA LINK ESCAPE
      11 |  00000011 | DEVICE CONTROL ONE
      12 |  00000012 | DEVICE CONTROL TWO
      13 |  00000013 | DEVICE CONTROL THREE
      14 |  00000014 | DEVICE CONTROL FOUR
      15 |  00000015 | NEGATIVE ACKNOWLEDGE
      16 |  00000016 | SYNCHRONOUS IDLE
      17 |  00000017 | END OF TRANSMISSION BLOCK
      18 |  00000018 | CANCEL
      19 |  00000019 | END OF MEDIUM
      1A |  0000001A | SUBSTITUTE
      1B |  0000001B | ESCAPE
      1C |  0000001C | FILE SEPARATOR
      1D |  0000001D | GROUP SEPARATOR
      1E |  0000001E | RECORD SEPARATOR
      1F |  0000001F | UNIT SEPARATOR
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE
      80 |  00000080 | PADDING CHARACTER (PAD)
      81 |  00000081 | HIGH OCTET PRESET (HOP)
      82 |  00000082 | BREAK PERMITTED HERE (BPH)
      83 |  00000083 | NO BREAK HERE (NBH)
      84 |  00000084 | INDEX (IND)
      85 |  00000085 | NEXT LINE (NEL)
      86 |  00000086 | START OF SELECTED AREA (SSA)
      87 |  00000087 | END OF SELECTED AREA (ESA)
      88 |  00000088 | CHARACTER TABULATION SET (HTS)
      89 |  00000089 | CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
      8A |  0000008A | LINE TABULATION SET (VTS)
      8B |  0000008B | PARTIAL LINE FORWARD (PLD)
      8C |  0000008C | PARTIAL LINE BACKWARD (PLU)
      8D |  0000008D | REVERSE LINE FEED (RI)
      8E |  0000008E | SINGLE-SHIFT TWO (SS2)
      8F |  0000008F | SINGLE-SHIFT THREE (SS3)
      90 |  00000090 | DEVICE CONTROL STRING (DCS)
      91 |  00000091 | PRIVATE USE ONE (PU1)
      92 |  00000092 | PRIVATE USE TWO (PU2)
      93 |  00000093 | SET TRANSMIT STATE (STS)
      94 |  00000094 | CANCEL CHARACTER (CCH)
      95 |  00000095 | MESSAGE WAITING (MW)
      96 |  00000096 | START OF GUARDED AREA (SPA)
      97 |  00000097 | END OF GUARDED AREA (EPA)
      98 |  00000098 | START OF STRING (SOS)
      99 |  00000099 | SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
      9A |  0000009A | SINGLE CHARACTER INTRODUCER (SCI)
      9B |  0000009B | CONTROL SEQUENCE INTRODUCER (CSI)
      9C |  0000009C | STRING TERMINATOR (ST)
      9D |  0000009D | OPERATING SYSTEM COMMAND (OSC)
      9E |  0000009E | PRIVACY MESSAGE (PM)
      9F |  0000009F | APPLICATION PROGRAM COMMAND (APC)
      A0 |  000000A0 | NO-BREAK SPACE
      A1 |  00001E02 | LATIN CAPITAL LETTER B WITH DOT ABOVE
      A2 |  00001E03 | LATIN SMALL LETTER B WITH DOT ABOVE
      A3 |  000000A3 | POUND SIGN
      A4 |  0000010A | LATIN CAPITAL LETTER C WITH DOT ABOVE
      A5 |  0000010B | LATIN SMALL LETTER C WITH DOT ABOVE
      A6 |  00001E0A | LATIN CAPITAL LETTER D WITH DOT ABOVE
      A7 |  000000A7 | SECTION SIGN
      A8 |  00001E80 | LATIN CAPITAL LETTER W WITH GRAVE
      A9 |  000000A9 | COPYRIGHT SIGN
      AA |  00001E82 | LATIN CAPITAL LETTER W WITH ACUTE
      AB |  00001E0B | LATIN SMALL LETTER D WITH DOT ABOVE
      AC |  00001EF2 | LATIN CAPITAL LETTER Y WITH GRAVE
      AD |  000000AD | SOFT HYPHEN
      AE |  000000AE | REGISTERED SIGN
      AF |  00000178 | LATIN CAPITAL LETTER Y WITH DIAERESIS
      B0 |  00001E1E | LATIN CAPITAL LETTER F WITH DOT ABOVE
      B1 |  00001E1F | LATIN SMALL LETTER F WITH DOT ABOVE
      B2 |  00000120 | LATIN CAPITAL LETTER G WITH DOT ABOVE
      B3 |  00000121 | LATIN SMALL LETTER G WITH DOT ABOVE
      B4 |  00001E40 | LATIN CAPITAL LETTER M WITH DOT ABOVE
      B5 |  00001E41 | LATIN SMALL LETTER M WITH DOT ABOVE
      B6 |  000000B6 | PILCROW SIGN
      B7 |  00001E56 | LATIN CAPITAL LETTER P WITH DOT ABOVE
      B8 |  00001E81 | LATIN SMALL LETTER W WITH GRAVE
      B9 |  00001E57 | LATIN SMALL LETTER P WITH DOT ABOVE
      BA |  00001E83 | LATIN SMALL LETTER W WITH ACUTE
      BB |  00001E60 | LATIN CAPITAL LETTER S WITH DOT ABOVE
      BC |  00001EF3 | LATIN SMALL LETTER Y WITH GRAVE
      BD |  00001E84 | LATIN CAPITAL LETTER W WITH DIAERESIS
      BE |  00001E85 | LATIN SMALL LETTER W WITH DIAERESIS
      BF |  00001E61 | LATIN SMALL LETTER S WITH DOT ABOVE
      C0 |  000000C0 | LATIN CAPITAL LETTER A WITH GRAVE
      C1 |  000000C1 | LATIN CAPITAL LETTER A WITH ACUTE
      C2 |  000000C2 | LATIN CAPITAL LETTER A WITH CIRCUMFLEX
      C3 |  000000C3 | LATIN CAPITAL LETTER A WITH TILDE
      C4 |  000000C4 | LATIN CAPITAL LETTER A WITH DIAERESIS
      C5 |  000000C5 | LATIN CAPITAL LETTER A WITH RING ABOVE
      C6 |  000000C6 | LATIN CAPITAL LETTER AE
      C7 |  000000C7 | LATIN CAPITAL LETTER C WITH CEDILLA
      C8 |  000000C8 | LATIN CAPITAL LETTER E WITH GRAVE
      C9 |  000000C9 | LATIN CAPITAL LETTER E WITH ACUTE
      CA |  000000CA | LATIN CAPITAL LETTER E WITH CIRCUMFLEX
      CB |  000000CB | LATIN CAPITAL LETTER E WITH DIAERESIS
      CC |  000000CC | LATIN CAPITAL LETTER I WITH GRAVE
      CD |  000000CD | LATIN CAPITAL LETTER I WITH ACUTE
      CE |  000000CE | LATIN CAPITAL LETTER I WITH CIRCUMFLEX
      CF |  000000CF | LATIN CAPITAL LETTER I WITH DIAERESIS
      D0 |  00000174 | LATIN CAPITAL LETTER W WITH CIRCUMFLEX
      D1 |  000000D1 | LATIN CAPITAL LETTER N WITH TILDE
      D2 |  000000D2 | LATIN CAPITAL LETTER O WITH GRAVE
      D3 |  000000D3 | LATIN CAPITAL LETTER O WITH ACUTE
      D4 |  000000D4 | LATIN CAPITAL LETTER O WITH CIRCUMFLEX
      D5 |  000000D5 | LATIN CAPITAL LETTER O WITH TILDE
      D6 |  000000D6 | LATIN CAPITAL LETTER O WITH DIAERESIS
      D7 |  00001E6A | LATIN CAPITAL LETTER T WITH DOT ABOVE
      D8 |  000000D8 | LATIN CAPITAL LETTER O WITH STROKE
      D9 |  000000D9 | LATIN CAPITAL LETTER U WITH GRAVE
      DA |  000000DA | LATIN CAPITAL LETTER U WITH ACUTE
      DB |  000000DB | LATIN CAPITAL LETTER U WITH CIRCUMFLEX
      DC |  000000DC | LATIN CAPITAL LETTER U WITH DIAERESIS
      DD |  000000DD | LATIN CAPITAL LETTER Y WITH ACUTE
      DE |  00000176 | LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
      DF |  000000DF | LATIN SMALL LETTER SHARP S
      E0 |  000000E0 | LATIN SMALL LETTER A WITH GRAVE
      E1 |  000000E1 | LATIN SMALL LETTER A WITH ACUTE
      E2 |  000000E2 | LATIN SMALL LETTER A WITH CIRCUMFLEX
      E3 |  000000E3 | LATIN SMALL LETTER A WITH TILDE
      E4 |  000000E4 | LATIN SMALL LETTER A WITH DIAERESIS
      E5 |  000000E5 | LATIN SMALL LETTER A WITH RING ABOVE
      E6 |  000000E6 | LATIN SMALL LETTER AE
      E7 |  000000E7 | LATIN SMALL LETTER C WITH CEDILLA
      E8 |  000000E8 | LATIN SMALL LETTER E WITH GRAVE
      E9 |  000000E9 | LATIN SMALL LETTER E WITH ACUTE
      EA |  000000EA | LATIN SMALL LETTER E WITH CIRCUMFLEX
      EB |  000000EB | LATIN SMALL LETTER E WITH DIAERESIS
      EC |  000000EC | LATIN SMALL LETTER I WITH GRAVE
      ED |  000000ED | LATIN SMALL LETTER I WITH ACUTE
      EE |  000000EE | LATIN SMALL LETTER I WITH CIRCUMFLEX
      EF |  000000EF | LATIN SMALL LETTER I WITH DIAERESIS
      F0 |  00000175 | LATIN SMALL LETTER W WITH CIRCUMFLEX
      F1 |  000000F1 | LATIN SMALL LETTER N WITH TILDE
      F2 |  000000F2 | LATIN SMALL LETTER O WITH GRAVE
      F3 |  000000F3 | LATIN SMALL LETTER O WITH ACUTE
      F4 |  000000F4 | LATIN SMALL LETTER O WITH CIRCUMFLEX
      F5 |  000000F5 | LATIN SMALL LETTER O WITH TILDE
      F6 |  000000F6 | LATIN SMALL LETTER O WITH DIAERESIS
      F7 |  00001E6B | LATIN SMALL LETTER T WITH DOT ABOVE
      F8 |  000000F8 | LATIN SMALL LETTER O WITH STROKE
      F9 |  000000F9 | LATIN SMALL LETTER U WITH GRAVE
      FA |  000000FA | LATIN SMALL LETTER U WITH ACUTE
      FB |  000000FB | LATIN SMALL LETTER U WITH CIRCUMFLEX
      FC |  000000FC | LATIN SMALL LETTER U WITH DIAERESIS
      FD |  000000FD | LATIN SMALL LETTER Y WITH ACUTE
      FE |  00000177 | LATIN SMALL LETTER Y WITH CIRCUMFLEX
      FF |  000000FF | LATIN SMALL LETTER Y WITH DIAERESIS
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_ISO_8859_14

    $main::fatpacked{"Locale/RecodeData/ISO_8859_15.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_ISO_8859_15';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for ISO-8859-15.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::ISO_8859_15;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0x0080,
      0x0081,
      0x0082,
      0x0083,
      0x0084,
      0x0085,
      0x0086,
      0x0087,
      0x0088,
      0x0089,
      0x008a,
      0x008b,
      0x008c,
      0x008d,
      0x008e,
      0x008f,
      0x0090,
      0x0091,
      0x0092,
      0x0093,
      0x0094,
      0x0095,
      0x0096,
      0x0097,
      0x0098,
      0x0099,
      0x009a,
      0x009b,
      0x009c,
      0x009d,
      0x009e,
      0x009f,
      0x00a0,
      0x00a1,
      0x00a2,
      0x00a3,
      0x20ac,
      0x00a5,
      0x0160,
      0x00a7,
      0x0161,
      0x00a9,
      0x00aa,
      0x00ab,
      0x00ac,
      0x00ad,
      0x00ae,
      0x00af,
      0x00b0,
      0x00b1,
      0x00b2,
      0x00b3,
      0x017d,
      0x00b5,
      0x00b6,
      0x00b7,
      0x017e,
      0x00b9,
      0x00ba,
      0x00bb,
      0x0152,
      0x0153,
      0x0178,
      0x00bf,
      0x00c0,
      0x00c1,
      0x00c2,
      0x00c3,
      0x00c4,
      0x00c5,
      0x00c6,
      0x00c7,
      0x00c8,
      0x00c9,
      0x00ca,
      0x00cb,
      0x00cc,
      0x00cd,
      0x00ce,
      0x00cf,
      0x00d0,
      0x00d1,
      0x00d2,
      0x00d3,
      0x00d4,
      0x00d5,
      0x00d6,
      0x00d7,
      0x00d8,
      0x00d9,
      0x00da,
      0x00db,
      0x00dc,
      0x00dd,
      0x00de,
      0x00df,
      0x00e0,
      0x00e1,
      0x00e2,
      0x00e3,
      0x00e4,
      0x00e5,
      0x00e6,
      0x00e7,
      0x00e8,
      0x00e9,
      0x00ea,
      0x00eb,
      0x00ec,
      0x00ed,
      0x00ee,
      0x00ef,
      0x00f0,
      0x00f1,
      0x00f2,
      0x00f3,
      0x00f4,
      0x00f5,
      0x00f6,
      0x00f7,
      0x00f8,
      0x00f9,
      0x00fa,
      0x00fb,
      0x00fc,
      0x00fd,
      0x00fe,
      0x00ff,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xc2\x80",
      "\xc2\x81",
      "\xc2\x82",
      "\xc2\x83",
      "\xc2\x84",
      "\xc2\x85",
      "\xc2\x86",
      "\xc2\x87",
      "\xc2\x88",
      "\xc2\x89",
      "\xc2\x8a",
      "\xc2\x8b",
      "\xc2\x8c",
      "\xc2\x8d",
      "\xc2\x8e",
      "\xc2\x8f",
      "\xc2\x90",
      "\xc2\x91",
      "\xc2\x92",
      "\xc2\x93",
      "\xc2\x94",
      "\xc2\x95",
      "\xc2\x96",
      "\xc2\x97",
      "\xc2\x98",
      "\xc2\x99",
      "\xc2\x9a",
      "\xc2\x9b",
      "\xc2\x9c",
      "\xc2\x9d",
      "\xc2\x9e",
      "\xc2\x9f",
      "\xc2\xa0",
      "\xc2\xa1",
      "\xc2\xa2",
      "\xc2\xa3",
      "\xe2\x82\xac",
      "\xc2\xa5",
      "\xc5\xa0",
      "\xc2\xa7",
      "\xc5\xa1",
      "\xc2\xa9",
      "\xc2\xaa",
      "\xc2\xab",
      "\xc2\xac",
      "\xc2\xad",
      "\xc2\xae",
      "\xc2\xaf",
      "\xc2\xb0",
      "\xc2\xb1",
      "\xc2\xb2",
      "\xc2\xb3",
      "\xc5\xbd",
      "\xc2\xb5",
      "\xc2\xb6",
      "\xc2\xb7",
      "\xc5\xbe",
      "\xc2\xb9",
      "\xc2\xba",
      "\xc2\xbb",
      "\xc5\x92",
      "\xc5\x93",
      "\xc5\xb8",
      "\xc2\xbf",
      "\xc3\x80",
      "\xc3\x81",
      "\xc3\x82",
      "\xc3\x83",
      "\xc3\x84",
      "\xc3\x85",
      "\xc3\x86",
      "\xc3\x87",
      "\xc3\x88",
      "\xc3\x89",
      "\xc3\x8a",
      "\xc3\x8b",
      "\xc3\x8c",
      "\xc3\x8d",
      "\xc3\x8e",
      "\xc3\x8f",
      "\xc3\x90",
      "\xc3\x91",
      "\xc3\x92",
      "\xc3\x93",
      "\xc3\x94",
      "\xc3\x95",
      "\xc3\x96",
      "\xc3\x97",
      "\xc3\x98",
      "\xc3\x99",
      "\xc3\x9a",
      "\xc3\x9b",
      "\xc3\x9c",
      "\xc3\x9d",
      "\xc3\x9e",
      "\xc3\x9f",
      "\xc3\xa0",
      "\xc3\xa1",
      "\xc3\xa2",
      "\xc3\xa3",
      "\xc3\xa4",
      "\xc3\xa5",
      "\xc3\xa6",
      "\xc3\xa7",
      "\xc3\xa8",
      "\xc3\xa9",
      "\xc3\xaa",
      "\xc3\xab",
      "\xc3\xac",
      "\xc3\xad",
      "\xc3\xae",
      "\xc3\xaf",
      "\xc3\xb0",
      "\xc3\xb1",
      "\xc3\xb2",
      "\xc3\xb3",
      "\xc3\xb4",
      "\xc3\xb5",
      "\xc3\xb6",
      "\xc3\xb7",
      "\xc3\xb8",
      "\xc3\xb9",
      "\xc3\xba",
      "\xc3\xbb",
      "\xc3\xbc",
      "\xc3\xbd",
      "\xc3\xbe",
      "\xc3\xbf",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x00000080 => "\x80",
      0x00000081 => "\x81",
      0x00000082 => "\x82",
      0x00000083 => "\x83",
      0x00000084 => "\x84",
      0x00000085 => "\x85",
      0x00000086 => "\x86",
      0x00000087 => "\x87",
      0x00000088 => "\x88",
      0x00000089 => "\x89",
      0x0000008a => "\x8a",
      0x0000008b => "\x8b",
      0x0000008c => "\x8c",
      0x0000008d => "\x8d",
      0x0000008e => "\x8e",
      0x0000008f => "\x8f",
      0x00000090 => "\x90",
      0x00000091 => "\x91",
      0x00000092 => "\x92",
      0x00000093 => "\x93",
      0x00000094 => "\x94",
      0x00000095 => "\x95",
      0x00000096 => "\x96",
      0x00000097 => "\x97",
      0x00000098 => "\x98",
      0x00000099 => "\x99",
      0x0000009a => "\x9a",
      0x0000009b => "\x9b",
      0x0000009c => "\x9c",
      0x0000009d => "\x9d",
      0x0000009e => "\x9e",
      0x0000009f => "\x9f",
      0x000000a0 => "\xa0",
      0x000000a1 => "\xa1",
      0x000000a2 => "\xa2",
      0x000000a3 => "\xa3",
      0x000000a5 => "\xa5",
      0x000000a7 => "\xa7",
      0x000000a9 => "\xa9",
      0x000000aa => "\xaa",
      0x000000ab => "\xab",
      0x000000ac => "\xac",
      0x000000ad => "\xad",
      0x000000ae => "\xae",
      0x000000af => "\xaf",
      0x000000b0 => "\xb0",
      0x000000b1 => "\xb1",
      0x000000b2 => "\xb2",
      0x000000b3 => "\xb3",
      0x000000b5 => "\xb5",
      0x000000b6 => "\xb6",
      0x000000b7 => "\xb7",
      0x000000b9 => "\xb9",
      0x000000ba => "\xba",
      0x000000bb => "\xbb",
      0x000000bf => "\xbf",
      0x000000c0 => "\xc0",
      0x000000c1 => "\xc1",
      0x000000c2 => "\xc2",
      0x000000c3 => "\xc3",
      0x000000c4 => "\xc4",
      0x000000c5 => "\xc5",
      0x000000c6 => "\xc6",
      0x000000c7 => "\xc7",
      0x000000c8 => "\xc8",
      0x000000c9 => "\xc9",
      0x000000ca => "\xca",
      0x000000cb => "\xcb",
      0x000000cc => "\xcc",
      0x000000cd => "\xcd",
      0x000000ce => "\xce",
      0x000000cf => "\xcf",
      0x000000d0 => "\xd0",
      0x000000d1 => "\xd1",
      0x000000d2 => "\xd2",
      0x000000d3 => "\xd3",
      0x000000d4 => "\xd4",
      0x000000d5 => "\xd5",
      0x000000d6 => "\xd6",
      0x000000d7 => "\xd7",
      0x000000d8 => "\xd8",
      0x000000d9 => "\xd9",
      0x000000da => "\xda",
      0x000000db => "\xdb",
      0x000000dc => "\xdc",
      0x000000dd => "\xdd",
      0x000000de => "\xde",
      0x000000df => "\xdf",
      0x000000e0 => "\xe0",
      0x000000e1 => "\xe1",
      0x000000e2 => "\xe2",
      0x000000e3 => "\xe3",
      0x000000e4 => "\xe4",
      0x000000e5 => "\xe5",
      0x000000e6 => "\xe6",
      0x000000e7 => "\xe7",
      0x000000e8 => "\xe8",
      0x000000e9 => "\xe9",
      0x000000ea => "\xea",
      0x000000eb => "\xeb",
      0x000000ec => "\xec",
      0x000000ed => "\xed",
      0x000000ee => "\xee",
      0x000000ef => "\xef",
      0x000000f0 => "\xf0",
      0x000000f1 => "\xf1",
      0x000000f2 => "\xf2",
      0x000000f3 => "\xf3",
      0x000000f4 => "\xf4",
      0x000000f5 => "\xf5",
      0x000000f6 => "\xf6",
      0x000000f7 => "\xf7",
      0x000000f8 => "\xf8",
      0x000000f9 => "\xf9",
      0x000000fa => "\xfa",
      0x000000fb => "\xfb",
      0x000000fc => "\xfc",
      0x000000fd => "\xfd",
      0x000000fe => "\xfe",
      0x000000ff => "\xff",
      0x00000152 => "\xbc",
      0x00000153 => "\xbd",
      0x00000160 => "\xa6",
      0x00000161 => "\xa8",
      0x00000178 => "\xbe",
      0x0000017d => "\xb4",
      0x0000017e => "\xb8",
      0x000020ac => "\xa4",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::ISO_8859_15 - Conversion routines for ISO-8859-15
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for ISO-8859-15.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   automatically generated from the charDB
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL
      01 |  00000001 | START OF HEADING
      02 |  00000002 | START OF TEXT
      03 |  00000003 | END OF TEXT
      04 |  00000004 | END OF TRANSMISSION
      05 |  00000005 | ENQUIRY
      06 |  00000006 | ACKNOWLEDGE
      07 |  00000007 | BELL
      08 |  00000008 | BACKSPACE
      09 |  00000009 | HORIZONTAL TABULATION
      0A |  0000000A | LINE FEED
      0B |  0000000B | VERTICAL TABULATION
      0C |  0000000C | FORM FEED
      0D |  0000000D | CARRIAGE RETURN
      0E |  0000000E | SHIFT OUT
      0F |  0000000F | SHIFT IN
      10 |  00000010 | DATA LINK ESCAPE
      11 |  00000011 | DEVICE CONTROL ONE
      12 |  00000012 | DEVICE CONTROL TWO
      13 |  00000013 | DEVICE CONTROL THREE
      14 |  00000014 | DEVICE CONTROL FOUR
      15 |  00000015 | NEGATIVE ACKNOWLEDGE
      16 |  00000016 | SYNCHRONOUS IDLE
      17 |  00000017 | END OF TRANSMISSION BLOCK
      18 |  00000018 | CANCEL
      19 |  00000019 | END OF MEDIUM
      1A |  0000001A | SUBSTITUTE
      1B |  0000001B | ESCAPE
      1C |  0000001C | FILE SEPARATOR
      1D |  0000001D | GROUP SEPARATOR
      1E |  0000001E | RECORD SEPARATOR
      1F |  0000001F | UNIT SEPARATOR
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE
      80 |  00000080 | PADDING CHARACTER (PAD)
      81 |  00000081 | HIGH OCTET PRESET (HOP)
      82 |  00000082 | BREAK PERMITTED HERE (BPH)
      83 |  00000083 | NO BREAK HERE (NBH)
      84 |  00000084 | INDEX (IND)
      85 |  00000085 | NEXT LINE (NEL)
      86 |  00000086 | START OF SELECTED AREA (SSA)
      87 |  00000087 | END OF SELECTED AREA (ESA)
      88 |  00000088 | CHARACTER TABULATION SET (HTS)
      89 |  00000089 | CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
      8A |  0000008A | LINE TABULATION SET (VTS)
      8B |  0000008B | PARTIAL LINE FORWARD (PLD)
      8C |  0000008C | PARTIAL LINE BACKWARD (PLU)
      8D |  0000008D | REVERSE LINE FEED (RI)
      8E |  0000008E | SINGLE-SHIFT TWO (SS2)
      8F |  0000008F | SINGLE-SHIFT THREE (SS3)
      90 |  00000090 | DEVICE CONTROL STRING (DCS)
      91 |  00000091 | PRIVATE USE ONE (PU1)
      92 |  00000092 | PRIVATE USE TWO (PU2)
      93 |  00000093 | SET TRANSMIT STATE (STS)
      94 |  00000094 | CANCEL CHARACTER (CCH)
      95 |  00000095 | MESSAGE WAITING (MW)
      96 |  00000096 | START OF GUARDED AREA (SPA)
      97 |  00000097 | END OF GUARDED AREA (EPA)
      98 |  00000098 | START OF STRING (SOS)
      99 |  00000099 | SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
      9A |  0000009A | SINGLE CHARACTER INTRODUCER (SCI)
      9B |  0000009B | CONTROL SEQUENCE INTRODUCER (CSI)
      9C |  0000009C | STRING TERMINATOR (ST)
      9D |  0000009D | OPERATING SYSTEM COMMAND (OSC)
      9E |  0000009E | PRIVACY MESSAGE (PM)
      9F |  0000009F | APPLICATION PROGRAM COMMAND (APC)
      A0 |  000000A0 | NO-BREAK SPACE
      A1 |  000000A1 | INVERTED EXCLAMATION MARK
      A2 |  000000A2 | CENT SIGN
      A3 |  000000A3 | POUND SIGN
      A4 |  000020AC | EURO SIGN
      A5 |  000000A5 | YEN SIGN
      A6 |  00000160 | LATIN CAPITAL LETTER S WITH CARON
      A7 |  000000A7 | SECTION SIGN
      A8 |  00000161 | LATIN SMALL LETTER S WITH CARON
      A9 |  000000A9 | COPYRIGHT SIGN
      AA |  000000AA | FEMININE ORDINAL INDICATOR
      AB |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
      AC |  000000AC | NOT SIGN
      AD |  000000AD | SOFT HYPHEN
      AE |  000000AE | REGISTERED SIGN
      AF |  000000AF | MACRON
      B0 |  000000B0 | DEGREE SIGN
      B1 |  000000B1 | PLUS-MINUS SIGN
      B2 |  000000B2 | SUPERSCRIPT TWO
      B3 |  000000B3 | SUPERSCRIPT THREE
      B4 |  0000017D | LATIN CAPITAL LETTER Z WITH CARON
      B5 |  000000B5 | MICRO SIGN
      B6 |  000000B6 | PILCROW SIGN
      B7 |  000000B7 | MIDDLE DOT
      B8 |  0000017E | LATIN SMALL LETTER Z WITH CARON
      B9 |  000000B9 | SUPERSCRIPT ONE
      BA |  000000BA | MASCULINE ORDINAL INDICATOR
      BB |  000000BB | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
      BC |  00000152 | LATIN CAPITAL LIGATURE OE
      BD |  00000153 | LATIN SMALL LIGATURE OE
      BE |  00000178 | LATIN CAPITAL LETTER Y WITH DIAERESIS
      BF |  000000BF | INVERTED QUESTION MARK
      C0 |  000000C0 | LATIN CAPITAL LETTER A WITH GRAVE
      C1 |  000000C1 | LATIN CAPITAL LETTER A WITH ACUTE
      C2 |  000000C2 | LATIN CAPITAL LETTER A WITH CIRCUMFLEX
      C3 |  000000C3 | LATIN CAPITAL LETTER A WITH TILDE
      C4 |  000000C4 | LATIN CAPITAL LETTER A WITH DIAERESIS
      C5 |  000000C5 | LATIN CAPITAL LETTER A WITH RING ABOVE
      C6 |  000000C6 | LATIN CAPITAL LETTER AE
      C7 |  000000C7 | LATIN CAPITAL LETTER C WITH CEDILLA
      C8 |  000000C8 | LATIN CAPITAL LETTER E WITH GRAVE
      C9 |  000000C9 | LATIN CAPITAL LETTER E WITH ACUTE
      CA |  000000CA | LATIN CAPITAL LETTER E WITH CIRCUMFLEX
      CB |  000000CB | LATIN CAPITAL LETTER E WITH DIAERESIS
      CC |  000000CC | LATIN CAPITAL LETTER I WITH GRAVE
      CD |  000000CD | LATIN CAPITAL LETTER I WITH ACUTE
      CE |  000000CE | LATIN CAPITAL LETTER I WITH CIRCUMFLEX
      CF |  000000CF | LATIN CAPITAL LETTER I WITH DIAERESIS
      D0 |  000000D0 | LATIN CAPITAL LETTER ETH
      D1 |  000000D1 | LATIN CAPITAL LETTER N WITH TILDE
      D2 |  000000D2 | LATIN CAPITAL LETTER O WITH GRAVE
      D3 |  000000D3 | LATIN CAPITAL LETTER O WITH ACUTE
      D4 |  000000D4 | LATIN CAPITAL LETTER O WITH CIRCUMFLEX
      D5 |  000000D5 | LATIN CAPITAL LETTER O WITH TILDE
      D6 |  000000D6 | LATIN CAPITAL LETTER O WITH DIAERESIS
      D7 |  000000D7 | MULTIPLICATION SIGN
      D8 |  000000D8 | LATIN CAPITAL LETTER O WITH STROKE
      D9 |  000000D9 | LATIN CAPITAL LETTER U WITH GRAVE
      DA |  000000DA | LATIN CAPITAL LETTER U WITH ACUTE
      DB |  000000DB | LATIN CAPITAL LETTER U WITH CIRCUMFLEX
      DC |  000000DC | LATIN CAPITAL LETTER U WITH DIAERESIS
      DD |  000000DD | LATIN CAPITAL LETTER Y WITH ACUTE
      DE |  000000DE | LATIN CAPITAL LETTER THORN
      DF |  000000DF | LATIN SMALL LETTER SHARP S
      E0 |  000000E0 | LATIN SMALL LETTER A WITH GRAVE
      E1 |  000000E1 | LATIN SMALL LETTER A WITH ACUTE
      E2 |  000000E2 | LATIN SMALL LETTER A WITH CIRCUMFLEX
      E3 |  000000E3 | LATIN SMALL LETTER A WITH TILDE
      E4 |  000000E4 | LATIN SMALL LETTER A WITH DIAERESIS
      E5 |  000000E5 | LATIN SMALL LETTER A WITH RING ABOVE
      E6 |  000000E6 | LATIN SMALL LETTER AE
      E7 |  000000E7 | LATIN SMALL LETTER C WITH CEDILLA
      E8 |  000000E8 | LATIN SMALL LETTER E WITH GRAVE
      E9 |  000000E9 | LATIN SMALL LETTER E WITH ACUTE
      EA |  000000EA | LATIN SMALL LETTER E WITH CIRCUMFLEX
      EB |  000000EB | LATIN SMALL LETTER E WITH DIAERESIS
      EC |  000000EC | LATIN SMALL LETTER I WITH GRAVE
      ED |  000000ED | LATIN SMALL LETTER I WITH ACUTE
      EE |  000000EE | LATIN SMALL LETTER I WITH CIRCUMFLEX
      EF |  000000EF | LATIN SMALL LETTER I WITH DIAERESIS
      F0 |  000000F0 | LATIN SMALL LETTER ETH
      F1 |  000000F1 | LATIN SMALL LETTER N WITH TILDE
      F2 |  000000F2 | LATIN SMALL LETTER O WITH GRAVE
      F3 |  000000F3 | LATIN SMALL LETTER O WITH ACUTE
      F4 |  000000F4 | LATIN SMALL LETTER O WITH CIRCUMFLEX
      F5 |  000000F5 | LATIN SMALL LETTER O WITH TILDE
      F6 |  000000F6 | LATIN SMALL LETTER O WITH DIAERESIS
      F7 |  000000F7 | DIVISION SIGN
      F8 |  000000F8 | LATIN SMALL LETTER O WITH STROKE
      F9 |  000000F9 | LATIN SMALL LETTER U WITH GRAVE
      FA |  000000FA | LATIN SMALL LETTER U WITH ACUTE
      FB |  000000FB | LATIN SMALL LETTER U WITH CIRCUMFLEX
      FC |  000000FC | LATIN SMALL LETTER U WITH DIAERESIS
      FD |  000000FD | LATIN SMALL LETTER Y WITH ACUTE
      FE |  000000FE | LATIN SMALL LETTER THORN
      FF |  000000FF | LATIN SMALL LETTER Y WITH DIAERESIS
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_ISO_8859_15

    $main::fatpacked{"Locale/RecodeData/ISO_8859_16.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_ISO_8859_16';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for ISO-8859-16.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::ISO_8859_16;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0x0080,
      0x0081,
      0x0082,
      0x0083,
      0x0084,
      0x0085,
      0x0086,
      0x0087,
      0x0088,
      0x0089,
      0x008a,
      0x008b,
      0x008c,
      0x008d,
      0x008e,
      0x008f,
      0x0090,
      0x0091,
      0x0092,
      0x0093,
      0x0094,
      0x0095,
      0x0096,
      0x0097,
      0x0098,
      0x0099,
      0x009a,
      0x009b,
      0x009c,
      0x009d,
      0x009e,
      0x009f,
      0x00a0,
      0x0104,
      0x0105,
      0x0141,
      0x20ac,
      0x201e,
      0x0160,
      0x00a7,
      0x0161,
      0x00a9,
      0x0218,
      0x00ab,
      0x0179,
      0x00ad,
      0x017a,
      0x017b,
      0x00b0,
      0x00b1,
      0x010c,
      0x0142,
      0x017d,
      0x201d,
      0x00b6,
      0x00b7,
      0x017e,
      0x010d,
      0x0219,
      0x00bb,
      0x0152,
      0x0153,
      0x0178,
      0x017c,
      0x00c0,
      0x00c1,
      0x00c2,
      0x0102,
      0x00c4,
      0x0106,
      0x00c6,
      0x00c7,
      0x00c8,
      0x00c9,
      0x00ca,
      0x00cb,
      0x00cc,
      0x00cd,
      0x00ce,
      0x00cf,
      0x0110,
      0x0143,
      0x00d2,
      0x00d3,
      0x00d4,
      0x0150,
      0x00d6,
      0x015a,
      0x0170,
      0x00d9,
      0x00da,
      0x00db,
      0x00dc,
      0x0118,
      0x021a,
      0x00df,
      0x00e0,
      0x00e1,
      0x00e2,
      0x0103,
      0x00e4,
      0x0107,
      0x00e6,
      0x00e7,
      0x00e8,
      0x00e9,
      0x00ea,
      0x00eb,
      0x00ec,
      0x00ed,
      0x00ee,
      0x00ef,
      0x0111,
      0x0144,
      0x00f2,
      0x00f3,
      0x00f4,
      0x0151,
      0x00f6,
      0x015b,
      0x0171,
      0x00f9,
      0x00fa,
      0x00fb,
      0x00fc,
      0x0119,
      0x021b,
      0x00ff,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xc2\x80",
      "\xc2\x81",
      "\xc2\x82",
      "\xc2\x83",
      "\xc2\x84",
      "\xc2\x85",
      "\xc2\x86",
      "\xc2\x87",
      "\xc2\x88",
      "\xc2\x89",
      "\xc2\x8a",
      "\xc2\x8b",
      "\xc2\x8c",
      "\xc2\x8d",
      "\xc2\x8e",
      "\xc2\x8f",
      "\xc2\x90",
      "\xc2\x91",
      "\xc2\x92",
      "\xc2\x93",
      "\xc2\x94",
      "\xc2\x95",
      "\xc2\x96",
      "\xc2\x97",
      "\xc2\x98",
      "\xc2\x99",
      "\xc2\x9a",
      "\xc2\x9b",
      "\xc2\x9c",
      "\xc2\x9d",
      "\xc2\x9e",
      "\xc2\x9f",
      "\xc2\xa0",
      "\xc4\x84",
      "\xc4\x85",
      "\xc5\x81",
      "\xe2\x82\xac",
      "\xe2\x80\x9e",
      "\xc5\xa0",
      "\xc2\xa7",
      "\xc5\xa1",
      "\xc2\xa9",
      "\xc8\x98",
      "\xc2\xab",
      "\xc5\xb9",
      "\xc2\xad",
      "\xc5\xba",
      "\xc5\xbb",
      "\xc2\xb0",
      "\xc2\xb1",
      "\xc4\x8c",
      "\xc5\x82",
      "\xc5\xbd",
      "\xe2\x80\x9d",
      "\xc2\xb6",
      "\xc2\xb7",
      "\xc5\xbe",
      "\xc4\x8d",
      "\xc8\x99",
      "\xc2\xbb",
      "\xc5\x92",
      "\xc5\x93",
      "\xc5\xb8",
      "\xc5\xbc",
      "\xc3\x80",
      "\xc3\x81",
      "\xc3\x82",
      "\xc4\x82",
      "\xc3\x84",
      "\xc4\x86",
      "\xc3\x86",
      "\xc3\x87",
      "\xc3\x88",
      "\xc3\x89",
      "\xc3\x8a",
      "\xc3\x8b",
      "\xc3\x8c",
      "\xc3\x8d",
      "\xc3\x8e",
      "\xc3\x8f",
      "\xc4\x90",
      "\xc5\x83",
      "\xc3\x92",
      "\xc3\x93",
      "\xc3\x94",
      "\xc5\x90",
      "\xc3\x96",
      "\xc5\x9a",
      "\xc5\xb0",
      "\xc3\x99",
      "\xc3\x9a",
      "\xc3\x9b",
      "\xc3\x9c",
      "\xc4\x98",
      "\xc8\x9a",
      "\xc3\x9f",
      "\xc3\xa0",
      "\xc3\xa1",
      "\xc3\xa2",
      "\xc4\x83",
      "\xc3\xa4",
      "\xc4\x87",
      "\xc3\xa6",
      "\xc3\xa7",
      "\xc3\xa8",
      "\xc3\xa9",
      "\xc3\xaa",
      "\xc3\xab",
      "\xc3\xac",
      "\xc3\xad",
      "\xc3\xae",
      "\xc3\xaf",
      "\xc4\x91",
      "\xc5\x84",
      "\xc3\xb2",
      "\xc3\xb3",
      "\xc3\xb4",
      "\xc5\x91",
      "\xc3\xb6",
      "\xc5\x9b",
      "\xc5\xb1",
      "\xc3\xb9",
      "\xc3\xba",
      "\xc3\xbb",
      "\xc3\xbc",
      "\xc4\x99",
      "\xc8\x9b",
      "\xc3\xbf",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x00000080 => "\x80",
      0x00000081 => "\x81",
      0x00000082 => "\x82",
      0x00000083 => "\x83",
      0x00000084 => "\x84",
      0x00000085 => "\x85",
      0x00000086 => "\x86",
      0x00000087 => "\x87",
      0x00000088 => "\x88",
      0x00000089 => "\x89",
      0x0000008a => "\x8a",
      0x0000008b => "\x8b",
      0x0000008c => "\x8c",
      0x0000008d => "\x8d",
      0x0000008e => "\x8e",
      0x0000008f => "\x8f",
      0x00000090 => "\x90",
      0x00000091 => "\x91",
      0x00000092 => "\x92",
      0x00000093 => "\x93",
      0x00000094 => "\x94",
      0x00000095 => "\x95",
      0x00000096 => "\x96",
      0x00000097 => "\x97",
      0x00000098 => "\x98",
      0x00000099 => "\x99",
      0x0000009a => "\x9a",
      0x0000009b => "\x9b",
      0x0000009c => "\x9c",
      0x0000009d => "\x9d",
      0x0000009e => "\x9e",
      0x0000009f => "\x9f",
      0x000000a0 => "\xa0",
      0x000000a7 => "\xa7",
      0x000000a9 => "\xa9",
      0x000000ab => "\xab",
      0x000000ad => "\xad",
      0x000000b0 => "\xb0",
      0x000000b1 => "\xb1",
      0x000000b6 => "\xb6",
      0x000000b7 => "\xb7",
      0x000000bb => "\xbb",
      0x000000c0 => "\xc0",
      0x000000c1 => "\xc1",
      0x000000c2 => "\xc2",
      0x000000c4 => "\xc4",
      0x000000c6 => "\xc6",
      0x000000c7 => "\xc7",
      0x000000c8 => "\xc8",
      0x000000c9 => "\xc9",
      0x000000ca => "\xca",
      0x000000cb => "\xcb",
      0x000000cc => "\xcc",
      0x000000cd => "\xcd",
      0x000000ce => "\xce",
      0x000000cf => "\xcf",
      0x000000d2 => "\xd2",
      0x000000d3 => "\xd3",
      0x000000d4 => "\xd4",
      0x000000d6 => "\xd6",
      0x000000d9 => "\xd9",
      0x000000da => "\xda",
      0x000000db => "\xdb",
      0x000000dc => "\xdc",
      0x000000df => "\xdf",
      0x000000e0 => "\xe0",
      0x000000e1 => "\xe1",
      0x000000e2 => "\xe2",
      0x000000e4 => "\xe4",
      0x000000e6 => "\xe6",
      0x000000e7 => "\xe7",
      0x000000e8 => "\xe8",
      0x000000e9 => "\xe9",
      0x000000ea => "\xea",
      0x000000eb => "\xeb",
      0x000000ec => "\xec",
      0x000000ed => "\xed",
      0x000000ee => "\xee",
      0x000000ef => "\xef",
      0x000000f2 => "\xf2",
      0x000000f3 => "\xf3",
      0x000000f4 => "\xf4",
      0x000000f6 => "\xf6",
      0x000000f9 => "\xf9",
      0x000000fa => "\xfa",
      0x000000fb => "\xfb",
      0x000000fc => "\xfc",
      0x000000ff => "\xff",
      0x00000102 => "\xc3",
      0x00000103 => "\xe3",
      0x00000104 => "\xa1",
      0x00000105 => "\xa2",
      0x00000106 => "\xc5",
      0x00000107 => "\xe5",
      0x0000010c => "\xb2",
      0x0000010d => "\xb9",
      0x00000110 => "\xd0",
      0x00000111 => "\xf0",
      0x00000118 => "\xdd",
      0x00000119 => "\xfd",
      0x00000141 => "\xa3",
      0x00000142 => "\xb3",
      0x00000143 => "\xd1",
      0x00000144 => "\xf1",
      0x00000150 => "\xd5",
      0x00000151 => "\xf5",
      0x00000152 => "\xbc",
      0x00000153 => "\xbd",
      0x0000015a => "\xd7",
      0x0000015b => "\xf7",
      0x00000160 => "\xa6",
      0x00000161 => "\xa8",
      0x00000170 => "\xd8",
      0x00000171 => "\xf8",
      0x00000178 => "\xbe",
      0x00000179 => "\xac",
      0x0000017a => "\xae",
      0x0000017b => "\xaf",
      0x0000017c => "\xbf",
      0x0000017d => "\xb4",
      0x0000017e => "\xb8",
      0x00000218 => "\xaa",
      0x00000219 => "\xba",
      0x0000021a => "\xde",
      0x0000021b => "\xfe",
      0x0000201d => "\xb5",
      0x0000201e => "\xa5",
      0x000020ac => "\xa4",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::ISO_8859_16 - Conversion routines for ISO-8859-16
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for ISO-8859-16.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   automatically generated from the charDB
   alias ISO-IR-226
   alias LATIN10
   alias L10
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL
      01 |  00000001 | START OF HEADING
      02 |  00000002 | START OF TEXT
      03 |  00000003 | END OF TEXT
      04 |  00000004 | END OF TRANSMISSION
      05 |  00000005 | ENQUIRY
      06 |  00000006 | ACKNOWLEDGE
      07 |  00000007 | BELL
      08 |  00000008 | BACKSPACE
      09 |  00000009 | HORIZONTAL TABULATION
      0A |  0000000A | LINE FEED
      0B |  0000000B | VERTICAL TABULATION
      0C |  0000000C | FORM FEED
      0D |  0000000D | CARRIAGE RETURN
      0E |  0000000E | SHIFT OUT
      0F |  0000000F | SHIFT IN
      10 |  00000010 | DATA LINK ESCAPE
      11 |  00000011 | DEVICE CONTROL ONE
      12 |  00000012 | DEVICE CONTROL TWO
      13 |  00000013 | DEVICE CONTROL THREE
      14 |  00000014 | DEVICE CONTROL FOUR
      15 |  00000015 | NEGATIVE ACKNOWLEDGE
      16 |  00000016 | SYNCHRONOUS IDLE
      17 |  00000017 | END OF TRANSMISSION BLOCK
      18 |  00000018 | CANCEL
      19 |  00000019 | END OF MEDIUM
      1A |  0000001A | SUBSTITUTE
      1B |  0000001B | ESCAPE
      1C |  0000001C | FILE SEPARATOR
      1D |  0000001D | GROUP SEPARATOR
      1E |  0000001E | RECORD SEPARATOR
      1F |  0000001F | UNIT SEPARATOR
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE
      80 |  00000080 | PADDING CHARACTER (PAD)
      81 |  00000081 | HIGH OCTET PRESET (HOP)
      82 |  00000082 | BREAK PERMITTED HERE (BPH)
      83 |  00000083 | NO BREAK HERE (NBH)
      84 |  00000084 | INDEX (IND)
      85 |  00000085 | NEXT LINE (NEL)
      86 |  00000086 | START OF SELECTED AREA (SSA)
      87 |  00000087 | END OF SELECTED AREA (ESA)
      88 |  00000088 | CHARACTER TABULATION SET (HTS)
      89 |  00000089 | CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
      8A |  0000008A | LINE TABULATION SET (VTS)
      8B |  0000008B | PARTIAL LINE FORWARD (PLD)
      8C |  0000008C | PARTIAL LINE BACKWARD (PLU)
      8D |  0000008D | REVERSE LINE FEED (RI)
      8E |  0000008E | SINGLE-SHIFT TWO (SS2)
      8F |  0000008F | SINGLE-SHIFT THREE (SS3)
      90 |  00000090 | DEVICE CONTROL STRING (DCS)
      91 |  00000091 | PRIVATE USE ONE (PU1)
      92 |  00000092 | PRIVATE USE TWO (PU2)
      93 |  00000093 | SET TRANSMIT STATE (STS)
      94 |  00000094 | CANCEL CHARACTER (CCH)
      95 |  00000095 | MESSAGE WAITING (MW)
      96 |  00000096 | START OF GUARDED AREA (SPA)
      97 |  00000097 | END OF GUARDED AREA (EPA)
      98 |  00000098 | START OF STRING (SOS)
      99 |  00000099 | SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
      9A |  0000009A | SINGLE CHARACTER INTRODUCER (SCI)
      9B |  0000009B | CONTROL SEQUENCE INTRODUCER (CSI)
      9C |  0000009C | STRING TERMINATOR (ST)
      9D |  0000009D | OPERATING SYSTEM COMMAND (OSC)
      9E |  0000009E | PRIVACY MESSAGE (PM)
      9F |  0000009F | APPLICATION PROGRAM COMMAND (APC)
      A0 |  000000A0 | NO-BREAK SPACE
      A1 |  00000104 | LATIN CAPITAL LETTER A WITH OGONEK
      A2 |  00000105 | LATIN SMALL LETTER A WITH OGONEK
      A3 |  00000141 | LATIN CAPITAL LETTER L WITH STROKE
      A4 |  000020AC | EURO SIGN
      A5 |  0000201E | DOUBLE LOW-9 QUOTATION MARK
      A6 |  00000160 | LATIN CAPITAL LETTER S WITH CARON
      A7 |  000000A7 | SECTION SIGN
      A8 |  00000161 | LATIN SMALL LETTER S WITH CARON
      A9 |  000000A9 | COPYRIGHT SIGN
      AA |  00000218 | LATIN CAPITAL LETTER S WITH COMMA BELOW
      AB |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
      AC |  00000179 | LATIN CAPITAL LETTER Z WITH ACUTE
      AD |  000000AD | SOFT HYPHEN
      AE |  0000017A | LATIN SMALL LETTER Z WITH ACUTE
      AF |  0000017B | LATIN CAPITAL LETTER Z WITH DOT ABOVE
      B0 |  000000B0 | DEGREE SIGN
      B1 |  000000B1 | PLUS-MINUS SIGN
      B2 |  0000010C | LATIN CAPITAL LETTER C WITH CARON
      B3 |  00000142 | LATIN SMALL LETTER L WITH STROKE
      B4 |  0000017D | LATIN CAPITAL LETTER Z WITH CARON
      B5 |  0000201D | RIGHT DOUBLE QUOTATION MARK
      B6 |  000000B6 | PILCROW SIGN
      B7 |  000000B7 | MIDDLE DOT
      B8 |  0000017E | LATIN SMALL LETTER Z WITH CARON
      B9 |  0000010D | LATIN SMALL LETTER C WITH CARON
      BA |  00000219 | LATIN SMALL LETTER S WITH COMMA BELOW
      BB |  000000BB | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
      BC |  00000152 | LATIN CAPITAL LIGATURE OE
      BD |  00000153 | LATIN SMALL LIGATURE OE
      BE |  00000178 | LATIN CAPITAL LETTER Y WITH DIAERESIS
      BF |  0000017C | LATIN SMALL LETTER Z WITH DOT ABOVE
      C0 |  000000C0 | LATIN CAPITAL LETTER A WITH GRAVE
      C1 |  000000C1 | LATIN CAPITAL LETTER A WITH ACUTE
      C2 |  000000C2 | LATIN CAPITAL LETTER A WITH CIRCUMFLEX
      C3 |  00000102 | LATIN CAPITAL LETTER A WITH BREVE
      C4 |  000000C4 | LATIN CAPITAL LETTER A WITH DIAERESIS
      C5 |  00000106 | LATIN CAPITAL LETTER C WITH ACUTE
      C6 |  000000C6 | LATIN CAPITAL LETTER AE
      C7 |  000000C7 | LATIN CAPITAL LETTER C WITH CEDILLA
      C8 |  000000C8 | LATIN CAPITAL LETTER E WITH GRAVE
      C9 |  000000C9 | LATIN CAPITAL LETTER E WITH ACUTE
      CA |  000000CA | LATIN CAPITAL LETTER E WITH CIRCUMFLEX
      CB |  000000CB | LATIN CAPITAL LETTER E WITH DIAERESIS
      CC |  000000CC | LATIN CAPITAL LETTER I WITH GRAVE
      CD |  000000CD | LATIN CAPITAL LETTER I WITH ACUTE
      CE |  000000CE | LATIN CAPITAL LETTER I WITH CIRCUMFLEX
      CF |  000000CF | LATIN CAPITAL LETTER I WITH DIAERESIS
      D0 |  00000110 | LATIN CAPITAL LETTER D WITH STROKE
      D1 |  00000143 | LATIN CAPITAL LETTER N WITH ACUTE
      D2 |  000000D2 | LATIN CAPITAL LETTER O WITH GRAVE
      D3 |  000000D3 | LATIN CAPITAL LETTER O WITH ACUTE
      D4 |  000000D4 | LATIN CAPITAL LETTER O WITH CIRCUMFLEX
      D5 |  00000150 | LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
      D6 |  000000D6 | LATIN CAPITAL LETTER O WITH DIAERESIS
      D7 |  0000015A | LATIN CAPITAL LETTER S WITH ACUTE
      D8 |  00000170 | LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
      D9 |  000000D9 | LATIN CAPITAL LETTER U WITH GRAVE
      DA |  000000DA | LATIN CAPITAL LETTER U WITH ACUTE
      DB |  000000DB | LATIN CAPITAL LETTER U WITH CIRCUMFLEX
      DC |  000000DC | LATIN CAPITAL LETTER U WITH DIAERESIS
      DD |  00000118 | LATIN CAPITAL LETTER E WITH OGONEK
      DE |  0000021A | LATIN CAPITAL LETTER T WITH COMMA BELOW
      DF |  000000DF | LATIN SMALL LETTER SHARP S
      E0 |  000000E0 | LATIN SMALL LETTER A WITH GRAVE
      E1 |  000000E1 | LATIN SMALL LETTER A WITH ACUTE
      E2 |  000000E2 | LATIN SMALL LETTER A WITH CIRCUMFLEX
      E3 |  00000103 | LATIN SMALL LETTER A WITH BREVE
      E4 |  000000E4 | LATIN SMALL LETTER A WITH DIAERESIS
      E5 |  00000107 | LATIN SMALL LETTER C WITH ACUTE
      E6 |  000000E6 | LATIN SMALL LETTER AE
      E7 |  000000E7 | LATIN SMALL LETTER C WITH CEDILLA
      E8 |  000000E8 | LATIN SMALL LETTER E WITH GRAVE
      E9 |  000000E9 | LATIN SMALL LETTER E WITH ACUTE
      EA |  000000EA | LATIN SMALL LETTER E WITH CIRCUMFLEX
      EB |  000000EB | LATIN SMALL LETTER E WITH DIAERESIS
      EC |  000000EC | LATIN SMALL LETTER I WITH GRAVE
      ED |  000000ED | LATIN SMALL LETTER I WITH ACUTE
      EE |  000000EE | LATIN SMALL LETTER I WITH CIRCUMFLEX
      EF |  000000EF | LATIN SMALL LETTER I WITH DIAERESIS
      F0 |  00000111 | LATIN SMALL LETTER D WITH STROKE
      F1 |  00000144 | LATIN SMALL LETTER N WITH ACUTE
      F2 |  000000F2 | LATIN SMALL LETTER O WITH GRAVE
      F3 |  000000F3 | LATIN SMALL LETTER O WITH ACUTE
      F4 |  000000F4 | LATIN SMALL LETTER O WITH CIRCUMFLEX
      F5 |  00000151 | LATIN SMALL LETTER O WITH DOUBLE ACUTE
      F6 |  000000F6 | LATIN SMALL LETTER O WITH DIAERESIS
      F7 |  0000015B | LATIN SMALL LETTER S WITH ACUTE
      F8 |  00000171 | LATIN SMALL LETTER U WITH DOUBLE ACUTE
      F9 |  000000F9 | LATIN SMALL LETTER U WITH GRAVE
      FA |  000000FA | LATIN SMALL LETTER U WITH ACUTE
      FB |  000000FB | LATIN SMALL LETTER U WITH CIRCUMFLEX
      FC |  000000FC | LATIN SMALL LETTER U WITH DIAERESIS
      FD |  00000119 | LATIN SMALL LETTER E WITH OGONEK
      FE |  0000021B | LATIN SMALL LETTER T WITH COMMA BELOW
      FF |  000000FF | LATIN SMALL LETTER Y WITH DIAERESIS
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_ISO_8859_16

    $main::fatpacked{"Locale/RecodeData/ISO_8859_2.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_ISO_8859_2';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for ISO-8859-2.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::ISO_8859_2;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0x0080,
      0x0081,
      0x0082,
      0x0083,
      0x0084,
      0x0085,
      0x0086,
      0x0087,
      0x0088,
      0x0089,
      0x008a,
      0x008b,
      0x008c,
      0x008d,
      0x008e,
      0x008f,
      0x0090,
      0x0091,
      0x0092,
      0x0093,
      0x0094,
      0x0095,
      0x0096,
      0x0097,
      0x0098,
      0x0099,
      0x009a,
      0x009b,
      0x009c,
      0x009d,
      0x009e,
      0x009f,
      0x00a0,
      0x0104,
      0x02d8,
      0x0141,
      0x00a4,
      0x013d,
      0x015a,
      0x00a7,
      0x00a8,
      0x0160,
      0x015e,
      0x0164,
      0x0179,
      0x00ad,
      0x017d,
      0x017b,
      0x00b0,
      0x0105,
      0x02db,
      0x0142,
      0x00b4,
      0x013e,
      0x015b,
      0x02c7,
      0x00b8,
      0x0161,
      0x015f,
      0x0165,
      0x017a,
      0x02dd,
      0x017e,
      0x017c,
      0x0154,
      0x00c1,
      0x00c2,
      0x0102,
      0x00c4,
      0x0139,
      0x0106,
      0x00c7,
      0x010c,
      0x00c9,
      0x0118,
      0x00cb,
      0x011a,
      0x00cd,
      0x00ce,
      0x010e,
      0x0110,
      0x0143,
      0x0147,
      0x00d3,
      0x00d4,
      0x0150,
      0x00d6,
      0x00d7,
      0x0158,
      0x016e,
      0x00da,
      0x0170,
      0x00dc,
      0x00dd,
      0x0162,
      0x00df,
      0x0155,
      0x00e1,
      0x00e2,
      0x0103,
      0x00e4,
      0x013a,
      0x0107,
      0x00e7,
      0x010d,
      0x00e9,
      0x0119,
      0x00eb,
      0x011b,
      0x00ed,
      0x00ee,
      0x010f,
      0x0111,
      0x0144,
      0x0148,
      0x00f3,
      0x00f4,
      0x0151,
      0x00f6,
      0x00f7,
      0x0159,
      0x016f,
      0x00fa,
      0x0171,
      0x00fc,
      0x00fd,
      0x0163,
      0x02d9,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xc2\x80",
      "\xc2\x81",
      "\xc2\x82",
      "\xc2\x83",
      "\xc2\x84",
      "\xc2\x85",
      "\xc2\x86",
      "\xc2\x87",
      "\xc2\x88",
      "\xc2\x89",
      "\xc2\x8a",
      "\xc2\x8b",
      "\xc2\x8c",
      "\xc2\x8d",
      "\xc2\x8e",
      "\xc2\x8f",
      "\xc2\x90",
      "\xc2\x91",
      "\xc2\x92",
      "\xc2\x93",
      "\xc2\x94",
      "\xc2\x95",
      "\xc2\x96",
      "\xc2\x97",
      "\xc2\x98",
      "\xc2\x99",
      "\xc2\x9a",
      "\xc2\x9b",
      "\xc2\x9c",
      "\xc2\x9d",
      "\xc2\x9e",
      "\xc2\x9f",
      "\xc2\xa0",
      "\xc4\x84",
      "\xcb\x98",
      "\xc5\x81",
      "\xc2\xa4",
      "\xc4\xbd",
      "\xc5\x9a",
      "\xc2\xa7",
      "\xc2\xa8",
      "\xc5\xa0",
      "\xc5\x9e",
      "\xc5\xa4",
      "\xc5\xb9",
      "\xc2\xad",
      "\xc5\xbd",
      "\xc5\xbb",
      "\xc2\xb0",
      "\xc4\x85",
      "\xcb\x9b",
      "\xc5\x82",
      "\xc2\xb4",
      "\xc4\xbe",
      "\xc5\x9b",
      "\xcb\x87",
      "\xc2\xb8",
      "\xc5\xa1",
      "\xc5\x9f",
      "\xc5\xa5",
      "\xc5\xba",
      "\xcb\x9d",
      "\xc5\xbe",
      "\xc5\xbc",
      "\xc5\x94",
      "\xc3\x81",
      "\xc3\x82",
      "\xc4\x82",
      "\xc3\x84",
      "\xc4\xb9",
      "\xc4\x86",
      "\xc3\x87",
      "\xc4\x8c",
      "\xc3\x89",
      "\xc4\x98",
      "\xc3\x8b",
      "\xc4\x9a",
      "\xc3\x8d",
      "\xc3\x8e",
      "\xc4\x8e",
      "\xc4\x90",
      "\xc5\x83",
      "\xc5\x87",
      "\xc3\x93",
      "\xc3\x94",
      "\xc5\x90",
      "\xc3\x96",
      "\xc3\x97",
      "\xc5\x98",
      "\xc5\xae",
      "\xc3\x9a",
      "\xc5\xb0",
      "\xc3\x9c",
      "\xc3\x9d",
      "\xc5\xa2",
      "\xc3\x9f",
      "\xc5\x95",
      "\xc3\xa1",
      "\xc3\xa2",
      "\xc4\x83",
      "\xc3\xa4",
      "\xc4\xba",
      "\xc4\x87",
      "\xc3\xa7",
      "\xc4\x8d",
      "\xc3\xa9",
      "\xc4\x99",
      "\xc3\xab",
      "\xc4\x9b",
      "\xc3\xad",
      "\xc3\xae",
      "\xc4\x8f",
      "\xc4\x91",
      "\xc5\x84",
      "\xc5\x88",
      "\xc3\xb3",
      "\xc3\xb4",
      "\xc5\x91",
      "\xc3\xb6",
      "\xc3\xb7",
      "\xc5\x99",
      "\xc5\xaf",
      "\xc3\xba",
      "\xc5\xb1",
      "\xc3\xbc",
      "\xc3\xbd",
      "\xc5\xa3",
      "\xcb\x99",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x00000080 => "\x80",
      0x00000081 => "\x81",
      0x00000082 => "\x82",
      0x00000083 => "\x83",
      0x00000084 => "\x84",
      0x00000085 => "\x85",
      0x00000086 => "\x86",
      0x00000087 => "\x87",
      0x00000088 => "\x88",
      0x00000089 => "\x89",
      0x0000008a => "\x8a",
      0x0000008b => "\x8b",
      0x0000008c => "\x8c",
      0x0000008d => "\x8d",
      0x0000008e => "\x8e",
      0x0000008f => "\x8f",
      0x00000090 => "\x90",
      0x00000091 => "\x91",
      0x00000092 => "\x92",
      0x00000093 => "\x93",
      0x00000094 => "\x94",
      0x00000095 => "\x95",
      0x00000096 => "\x96",
      0x00000097 => "\x97",
      0x00000098 => "\x98",
      0x00000099 => "\x99",
      0x0000009a => "\x9a",
      0x0000009b => "\x9b",
      0x0000009c => "\x9c",
      0x0000009d => "\x9d",
      0x0000009e => "\x9e",
      0x0000009f => "\x9f",
      0x000000a0 => "\xa0",
      0x000000a4 => "\xa4",
      0x000000a7 => "\xa7",
      0x000000a8 => "\xa8",
      0x000000ad => "\xad",
      0x000000b0 => "\xb0",
      0x000000b4 => "\xb4",
      0x000000b8 => "\xb8",
      0x000000c1 => "\xc1",
      0x000000c2 => "\xc2",
      0x000000c4 => "\xc4",
      0x000000c7 => "\xc7",
      0x000000c9 => "\xc9",
      0x000000cb => "\xcb",
      0x000000cd => "\xcd",
      0x000000ce => "\xce",
      0x000000d3 => "\xd3",
      0x000000d4 => "\xd4",
      0x000000d6 => "\xd6",
      0x000000d7 => "\xd7",
      0x000000da => "\xda",
      0x000000dc => "\xdc",
      0x000000dd => "\xdd",
      0x000000df => "\xdf",
      0x000000e1 => "\xe1",
      0x000000e2 => "\xe2",
      0x000000e4 => "\xe4",
      0x000000e7 => "\xe7",
      0x000000e9 => "\xe9",
      0x000000eb => "\xeb",
      0x000000ed => "\xed",
      0x000000ee => "\xee",
      0x000000f3 => "\xf3",
      0x000000f4 => "\xf4",
      0x000000f6 => "\xf6",
      0x000000f7 => "\xf7",
      0x000000fa => "\xfa",
      0x000000fc => "\xfc",
      0x000000fd => "\xfd",
      0x00000102 => "\xc3",
      0x00000103 => "\xe3",
      0x00000104 => "\xa1",
      0x00000105 => "\xb1",
      0x00000106 => "\xc6",
      0x00000107 => "\xe6",
      0x0000010c => "\xc8",
      0x0000010d => "\xe8",
      0x0000010e => "\xcf",
      0x0000010f => "\xef",
      0x00000110 => "\xd0",
      0x00000111 => "\xf0",
      0x00000118 => "\xca",
      0x00000119 => "\xea",
      0x0000011a => "\xcc",
      0x0000011b => "\xec",
      0x00000139 => "\xc5",
      0x0000013a => "\xe5",
      0x0000013d => "\xa5",
      0x0000013e => "\xb5",
      0x00000141 => "\xa3",
      0x00000142 => "\xb3",
      0x00000143 => "\xd1",
      0x00000144 => "\xf1",
      0x00000147 => "\xd2",
      0x00000148 => "\xf2",
      0x00000150 => "\xd5",
      0x00000151 => "\xf5",
      0x00000154 => "\xc0",
      0x00000155 => "\xe0",
      0x00000158 => "\xd8",
      0x00000159 => "\xf8",
      0x0000015a => "\xa6",
      0x0000015b => "\xb6",
      0x0000015e => "\xaa",
      0x0000015f => "\xba",
      0x00000160 => "\xa9",
      0x00000161 => "\xb9",
      0x00000162 => "\xde",
      0x00000163 => "\xfe",
      0x00000164 => "\xab",
      0x00000165 => "\xbb",
      0x0000016e => "\xd9",
      0x0000016f => "\xf9",
      0x00000170 => "\xdb",
      0x00000171 => "\xfb",
      0x00000179 => "\xac",
      0x0000017a => "\xbc",
      0x0000017b => "\xaf",
      0x0000017c => "\xbf",
      0x0000017d => "\xae",
      0x0000017e => "\xbe",
      0x000002c7 => "\xb7",
      0x000002d8 => "\xa2",
      0x000002d9 => "\xff",
      0x000002db => "\xb2",
      0x000002dd => "\xbd",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::ISO_8859_2 - Conversion routines for ISO-8859-2
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for ISO-8859-2.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: ECMA registry
   alias ISO-IR-101
   alias ISO_8859-2:1987
   alias ISO_8859-2
   alias LATIN2
   alias L2
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE (DEL)
      80 |  00000080 | PADDING CHARACTER (PAD)
      81 |  00000081 | HIGH OCTET PRESET (HOP)
      82 |  00000082 | BREAK PERMITTED HERE (BPH)
      83 |  00000083 | NO BREAK HERE (NBH)
      84 |  00000084 | INDEX (IND)
      85 |  00000085 | NEXT LINE (NEL)
      86 |  00000086 | START OF SELECTED AREA (SSA)
      87 |  00000087 | END OF SELECTED AREA (ESA)
      88 |  00000088 | CHARACTER TABULATION SET (HTS)
      89 |  00000089 | CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
      8A |  0000008A | LINE TABULATION SET (VTS)
      8B |  0000008B | PARTIAL LINE FORWARD (PLD)
      8C |  0000008C | PARTIAL LINE BACKWARD (PLU)
      8D |  0000008D | REVERSE LINE FEED (RI)
      8E |  0000008E | SINGLE-SHIFT TWO (SS2)
      8F |  0000008F | SINGLE-SHIFT THREE (SS3)
      90 |  00000090 | DEVICE CONTROL STRING (DCS)
      91 |  00000091 | PRIVATE USE ONE (PU1)
      92 |  00000092 | PRIVATE USE TWO (PU2)
      93 |  00000093 | SET TRANSMIT STATE (STS)
      94 |  00000094 | CANCEL CHARACTER (CCH)
      95 |  00000095 | MESSAGE WAITING (MW)
      96 |  00000096 | START OF GUARDED AREA (SPA)
      97 |  00000097 | END OF GUARDED AREA (EPA)
      98 |  00000098 | START OF STRING (SOS)
      99 |  00000099 | SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
      9A |  0000009A | SINGLE CHARACTER INTRODUCER (SCI)
      9B |  0000009B | CONTROL SEQUENCE INTRODUCER (CSI)
      9C |  0000009C | STRING TERMINATOR (ST)
      9D |  0000009D | OPERATING SYSTEM COMMAND (OSC)
      9E |  0000009E | PRIVACY MESSAGE (PM)
      9F |  0000009F | APPLICATION PROGRAM COMMAND (APC)
      A0 |  000000A0 | NO-BREAK SPACE
      A1 |  00000104 | LATIN CAPITAL LETTER A WITH OGONEK
      A2 |  000002D8 | BREVE
      A3 |  00000141 | LATIN CAPITAL LETTER L WITH STROKE
      A4 |  000000A4 | CURRENCY SIGN
      A5 |  0000013D | LATIN CAPITAL LETTER L WITH CARON
      A6 |  0000015A | LATIN CAPITAL LETTER S WITH ACUTE
      A7 |  000000A7 | SECTION SIGN
      A8 |  000000A8 | DIAERESIS
      A9 |  00000160 | LATIN CAPITAL LETTER S WITH CARON
      AA |  0000015E | LATIN CAPITAL LETTER S WITH CEDILLA
      AB |  00000164 | LATIN CAPITAL LETTER T WITH CARON
      AC |  00000179 | LATIN CAPITAL LETTER Z WITH ACUTE
      AD |  000000AD | SOFT HYPHEN
      AE |  0000017D | LATIN CAPITAL LETTER Z WITH CARON
      AF |  0000017B | LATIN CAPITAL LETTER Z WITH DOT ABOVE
      B0 |  000000B0 | DEGREE SIGN
      B1 |  00000105 | LATIN SMALL LETTER A WITH OGONEK
      B2 |  000002DB | OGONEK
      B3 |  00000142 | LATIN SMALL LETTER L WITH STROKE
      B4 |  000000B4 | ACUTE ACCENT
      B5 |  0000013E | LATIN SMALL LETTER L WITH CARON
      B6 |  0000015B | LATIN SMALL LETTER S WITH ACUTE
      B7 |  000002C7 | CARON (Mandarin Chinese third tone)
      B8 |  000000B8 | CEDILLA
      B9 |  00000161 | LATIN SMALL LETTER S WITH CARON
      BA |  0000015F | LATIN SMALL LETTER S WITH CEDILLA
      BB |  00000165 | LATIN SMALL LETTER T WITH CARON
      BC |  0000017A | LATIN SMALL LETTER Z WITH ACUTE
      BD |  000002DD | DOUBLE ACUTE ACCENT
      BE |  0000017E | LATIN SMALL LETTER Z WITH CARON
      BF |  0000017C | LATIN SMALL LETTER Z WITH DOT ABOVE
      C0 |  00000154 | LATIN CAPITAL LETTER R WITH ACUTE
      C1 |  000000C1 | LATIN CAPITAL LETTER A WITH ACUTE
      C2 |  000000C2 | LATIN CAPITAL LETTER A WITH CIRCUMFLEX
      C3 |  00000102 | LATIN CAPITAL LETTER A WITH BREVE
      C4 |  000000C4 | LATIN CAPITAL LETTER A WITH DIAERESIS
      C5 |  00000139 | LATIN CAPITAL LETTER L WITH ACUTE
      C6 |  00000106 | LATIN CAPITAL LETTER C WITH ACUTE
      C7 |  000000C7 | LATIN CAPITAL LETTER C WITH CEDILLA
      C8 |  0000010C | LATIN CAPITAL LETTER C WITH CARON
      C9 |  000000C9 | LATIN CAPITAL LETTER E WITH ACUTE
      CA |  00000118 | LATIN CAPITAL LETTER E WITH OGONEK
      CB |  000000CB | LATIN CAPITAL LETTER E WITH DIAERESIS
      CC |  0000011A | LATIN CAPITAL LETTER E WITH CARON
      CD |  000000CD | LATIN CAPITAL LETTER I WITH ACUTE
      CE |  000000CE | LATIN CAPITAL LETTER I WITH CIRCUMFLEX
      CF |  0000010E | LATIN CAPITAL LETTER D WITH CARON
      D0 |  00000110 | LATIN CAPITAL LETTER D WITH STROKE
      D1 |  00000143 | LATIN CAPITAL LETTER N WITH ACUTE
      D2 |  00000147 | LATIN CAPITAL LETTER N WITH CARON
      D3 |  000000D3 | LATIN CAPITAL LETTER O WITH ACUTE
      D4 |  000000D4 | LATIN CAPITAL LETTER O WITH CIRCUMFLEX
      D5 |  00000150 | LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
      D6 |  000000D6 | LATIN CAPITAL LETTER O WITH DIAERESIS
      D7 |  000000D7 | MULTIPLICATION SIGN
      D8 |  00000158 | LATIN CAPITAL LETTER R WITH CARON
      D9 |  0000016E | LATIN CAPITAL LETTER U WITH RING ABOVE
      DA |  000000DA | LATIN CAPITAL LETTER U WITH ACUTE
      DB |  00000170 | LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
      DC |  000000DC | LATIN CAPITAL LETTER U WITH DIAERESIS
      DD |  000000DD | LATIN CAPITAL LETTER Y WITH ACUTE
      DE |  00000162 | LATIN CAPITAL LETTER T WITH CEDILLA
      DF |  000000DF | LATIN SMALL LETTER SHARP S (German)
      E0 |  00000155 | LATIN SMALL LETTER R WITH ACUTE
      E1 |  000000E1 | LATIN SMALL LETTER A WITH ACUTE
      E2 |  000000E2 | LATIN SMALL LETTER A WITH CIRCUMFLEX
      E3 |  00000103 | LATIN SMALL LETTER A WITH BREVE
      E4 |  000000E4 | LATIN SMALL LETTER A WITH DIAERESIS
      E5 |  0000013A | LATIN SMALL LETTER L WITH ACUTE
      E6 |  00000107 | LATIN SMALL LETTER C WITH ACUTE
      E7 |  000000E7 | LATIN SMALL LETTER C WITH CEDILLA
      E8 |  0000010D | LATIN SMALL LETTER C WITH CARON
      E9 |  000000E9 | LATIN SMALL LETTER E WITH ACUTE
      EA |  00000119 | LATIN SMALL LETTER E WITH OGONEK
      EB |  000000EB | LATIN SMALL LETTER E WITH DIAERESIS
      EC |  0000011B | LATIN SMALL LETTER E WITH CARON
      ED |  000000ED | LATIN SMALL LETTER I WITH ACUTE
      EE |  000000EE | LATIN SMALL LETTER I WITH CIRCUMFLEX
      EF |  0000010F | LATIN SMALL LETTER D WITH CARON
      F0 |  00000111 | LATIN SMALL LETTER D WITH STROKE
      F1 |  00000144 | LATIN SMALL LETTER N WITH ACUTE
      F2 |  00000148 | LATIN SMALL LETTER N WITH CARON
      F3 |  000000F3 | LATIN SMALL LETTER O WITH ACUTE
      F4 |  000000F4 | LATIN SMALL LETTER O WITH CIRCUMFLEX
      F5 |  00000151 | LATIN SMALL LETTER O WITH DOUBLE ACUTE
      F6 |  000000F6 | LATIN SMALL LETTER O WITH DIAERESIS
      F7 |  000000F7 | DIVISION SIGN
      F8 |  00000159 | LATIN SMALL LETTER R WITH CARON
      F9 |  0000016F | LATIN SMALL LETTER U WITH RING ABOVE
      FA |  000000FA | LATIN SMALL LETTER U WITH ACUTE
      FB |  00000171 | LATIN SMALL LETTER U WITH DOUBLE ACUTE
      FC |  000000FC | LATIN SMALL LETTER U WITH DIAERESIS
      FD |  000000FD | LATIN SMALL LETTER Y WITH ACUTE
      FE |  00000163 | LATIN SMALL LETTER T WITH CEDILLA
      FF |  000002D9 | DOT ABOVE (Mandarin Chinese light tone)
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_ISO_8859_2

    $main::fatpacked{"Locale/RecodeData/ISO_8859_3.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_ISO_8859_3';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for ISO-8859-3.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::ISO_8859_3;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0x0080,
      0x0081,
      0x0082,
      0x0083,
      0x0084,
      0x0085,
      0x0086,
      0x0087,
      0x0088,
      0x0089,
      0x008a,
      0x008b,
      0x008c,
      0x008d,
      0x008e,
      0x008f,
      0x0090,
      0x0091,
      0x0092,
      0x0093,
      0x0094,
      0x0095,
      0x0096,
      0x0097,
      0x0098,
      0x0099,
      0x009a,
      0x009b,
      0x009c,
      0x009d,
      0x009e,
      0x009f,
      0x00a0,
      0x0126,
      0x02d8,
      0x00a3,
      0x00a4,
      0xfffd,
      0x0124,
      0x00a7,
      0x00a8,
      0x0130,
      0x015e,
      0x011e,
      0x0134,
      0x00ad,
      0xfffd,
      0x017b,
      0x00b0,
      0x0127,
      0x00b2,
      0x00b3,
      0x00b4,
      0x00b5,
      0x0125,
      0x00b7,
      0x00b8,
      0x0131,
      0x015f,
      0x011f,
      0x0135,
      0x00bd,
      0xfffd,
      0x017c,
      0x00c0,
      0x00c1,
      0x00c2,
      0xfffd,
      0x00c4,
      0x010a,
      0x0108,
      0x00c7,
      0x00c8,
      0x00c9,
      0x00ca,
      0x00cb,
      0x00cc,
      0x00cd,
      0x00ce,
      0x00cf,
      0xfffd,
      0x00d1,
      0x00d2,
      0x00d3,
      0x00d4,
      0x0120,
      0x00d6,
      0x00d7,
      0x011c,
      0x00d9,
      0x00da,
      0x00db,
      0x00dc,
      0x016c,
      0x015c,
      0x00df,
      0x00e0,
      0x00e1,
      0x00e2,
      0xfffd,
      0x00e4,
      0x010b,
      0x0109,
      0x00e7,
      0x00e8,
      0x00e9,
      0x00ea,
      0x00eb,
      0x00ec,
      0x00ed,
      0x00ee,
      0x00ef,
      0xfffd,
      0x00f1,
      0x00f2,
      0x00f3,
      0x00f4,
      0x0121,
      0x00f6,
      0x00f7,
      0x011d,
      0x00f9,
      0x00fa,
      0x00fb,
      0x00fc,
      0x016d,
      0x015d,
      0x02d9,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xc2\x80",
      "\xc2\x81",
      "\xc2\x82",
      "\xc2\x83",
      "\xc2\x84",
      "\xc2\x85",
      "\xc2\x86",
      "\xc2\x87",
      "\xc2\x88",
      "\xc2\x89",
      "\xc2\x8a",
      "\xc2\x8b",
      "\xc2\x8c",
      "\xc2\x8d",
      "\xc2\x8e",
      "\xc2\x8f",
      "\xc2\x90",
      "\xc2\x91",
      "\xc2\x92",
      "\xc2\x93",
      "\xc2\x94",
      "\xc2\x95",
      "\xc2\x96",
      "\xc2\x97",
      "\xc2\x98",
      "\xc2\x99",
      "\xc2\x9a",
      "\xc2\x9b",
      "\xc2\x9c",
      "\xc2\x9d",
      "\xc2\x9e",
      "\xc2\x9f",
      "\xc2\xa0",
      "\xc4\xa6",
      "\xcb\x98",
      "\xc2\xa3",
      "\xc2\xa4",
      "\xef\xbf\xbd",
      "\xc4\xa4",
      "\xc2\xa7",
      "\xc2\xa8",
      "\xc4\xb0",
      "\xc5\x9e",
      "\xc4\x9e",
      "\xc4\xb4",
      "\xc2\xad",
      "\xef\xbf\xbd",
      "\xc5\xbb",
      "\xc2\xb0",
      "\xc4\xa7",
      "\xc2\xb2",
      "\xc2\xb3",
      "\xc2\xb4",
      "\xc2\xb5",
      "\xc4\xa5",
      "\xc2\xb7",
      "\xc2\xb8",
      "\xc4\xb1",
      "\xc5\x9f",
      "\xc4\x9f",
      "\xc4\xb5",
      "\xc2\xbd",
      "\xef\xbf\xbd",
      "\xc5\xbc",
      "\xc3\x80",
      "\xc3\x81",
      "\xc3\x82",
      "\xef\xbf\xbd",
      "\xc3\x84",
      "\xc4\x8a",
      "\xc4\x88",
      "\xc3\x87",
      "\xc3\x88",
      "\xc3\x89",
      "\xc3\x8a",
      "\xc3\x8b",
      "\xc3\x8c",
      "\xc3\x8d",
      "\xc3\x8e",
      "\xc3\x8f",
      "\xef\xbf\xbd",
      "\xc3\x91",
      "\xc3\x92",
      "\xc3\x93",
      "\xc3\x94",
      "\xc4\xa0",
      "\xc3\x96",
      "\xc3\x97",
      "\xc4\x9c",
      "\xc3\x99",
      "\xc3\x9a",
      "\xc3\x9b",
      "\xc3\x9c",
      "\xc5\xac",
      "\xc5\x9c",
      "\xc3\x9f",
      "\xc3\xa0",
      "\xc3\xa1",
      "\xc3\xa2",
      "\xef\xbf\xbd",
      "\xc3\xa4",
      "\xc4\x8b",
      "\xc4\x89",
      "\xc3\xa7",
      "\xc3\xa8",
      "\xc3\xa9",
      "\xc3\xaa",
      "\xc3\xab",
      "\xc3\xac",
      "\xc3\xad",
      "\xc3\xae",
      "\xc3\xaf",
      "\xef\xbf\xbd",
      "\xc3\xb1",
      "\xc3\xb2",
      "\xc3\xb3",
      "\xc3\xb4",
      "\xc4\xa1",
      "\xc3\xb6",
      "\xc3\xb7",
      "\xc4\x9d",
      "\xc3\xb9",
      "\xc3\xba",
      "\xc3\xbb",
      "\xc3\xbc",
      "\xc5\xad",
      "\xc5\x9d",
      "\xcb\x99",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x00000080 => "\x80",
      0x00000081 => "\x81",
      0x00000082 => "\x82",
      0x00000083 => "\x83",
      0x00000084 => "\x84",
      0x00000085 => "\x85",
      0x00000086 => "\x86",
      0x00000087 => "\x87",
      0x00000088 => "\x88",
      0x00000089 => "\x89",
      0x0000008a => "\x8a",
      0x0000008b => "\x8b",
      0x0000008c => "\x8c",
      0x0000008d => "\x8d",
      0x0000008e => "\x8e",
      0x0000008f => "\x8f",
      0x00000090 => "\x90",
      0x00000091 => "\x91",
      0x00000092 => "\x92",
      0x00000093 => "\x93",
      0x00000094 => "\x94",
      0x00000095 => "\x95",
      0x00000096 => "\x96",
      0x00000097 => "\x97",
      0x00000098 => "\x98",
      0x00000099 => "\x99",
      0x0000009a => "\x9a",
      0x0000009b => "\x9b",
      0x0000009c => "\x9c",
      0x0000009d => "\x9d",
      0x0000009e => "\x9e",
      0x0000009f => "\x9f",
      0x000000a0 => "\xa0",
      0x000000a3 => "\xa3",
      0x000000a4 => "\xa4",
      0x000000a7 => "\xa7",
      0x000000a8 => "\xa8",
      0x000000ad => "\xad",
      0x000000b0 => "\xb0",
      0x000000b2 => "\xb2",
      0x000000b3 => "\xb3",
      0x000000b4 => "\xb4",
      0x000000b5 => "\xb5",
      0x000000b7 => "\xb7",
      0x000000b8 => "\xb8",
      0x000000bd => "\xbd",
      0x000000c0 => "\xc0",
      0x000000c1 => "\xc1",
      0x000000c2 => "\xc2",
      0x000000c4 => "\xc4",
      0x000000c7 => "\xc7",
      0x000000c8 => "\xc8",
      0x000000c9 => "\xc9",
      0x000000ca => "\xca",
      0x000000cb => "\xcb",
      0x000000cc => "\xcc",
      0x000000cd => "\xcd",
      0x000000ce => "\xce",
      0x000000cf => "\xcf",
      0x000000d1 => "\xd1",
      0x000000d2 => "\xd2",
      0x000000d3 => "\xd3",
      0x000000d4 => "\xd4",
      0x000000d6 => "\xd6",
      0x000000d7 => "\xd7",
      0x000000d9 => "\xd9",
      0x000000da => "\xda",
      0x000000db => "\xdb",
      0x000000dc => "\xdc",
      0x000000df => "\xdf",
      0x000000e0 => "\xe0",
      0x000000e1 => "\xe1",
      0x000000e2 => "\xe2",
      0x000000e4 => "\xe4",
      0x000000e7 => "\xe7",
      0x000000e8 => "\xe8",
      0x000000e9 => "\xe9",
      0x000000ea => "\xea",
      0x000000eb => "\xeb",
      0x000000ec => "\xec",
      0x000000ed => "\xed",
      0x000000ee => "\xee",
      0x000000ef => "\xef",
      0x000000f1 => "\xf1",
      0x000000f2 => "\xf2",
      0x000000f3 => "\xf3",
      0x000000f4 => "\xf4",
      0x000000f6 => "\xf6",
      0x000000f7 => "\xf7",
      0x000000f9 => "\xf9",
      0x000000fa => "\xfa",
      0x000000fb => "\xfb",
      0x000000fc => "\xfc",
      0x00000108 => "\xc6",
      0x00000109 => "\xe6",
      0x0000010a => "\xc5",
      0x0000010b => "\xe5",
      0x0000011c => "\xd8",
      0x0000011d => "\xf8",
      0x0000011e => "\xab",
      0x0000011f => "\xbb",
      0x00000120 => "\xd5",
      0x00000121 => "\xf5",
      0x00000124 => "\xa6",
      0x00000125 => "\xb6",
      0x00000126 => "\xa1",
      0x00000127 => "\xb1",
      0x00000130 => "\xa9",
      0x00000131 => "\xb9",
      0x00000134 => "\xac",
      0x00000135 => "\xbc",
      0x0000015c => "\xde",
      0x0000015d => "\xfe",
      0x0000015e => "\xaa",
      0x0000015f => "\xba",
      0x0000016c => "\xdd",
      0x0000016d => "\xfd",
      0x0000017b => "\xaf",
      0x0000017c => "\xbf",
      0x000002d8 => "\xa2",
      0x000002d9 => "\xff",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::ISO_8859_3 - Conversion routines for ISO-8859-3
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for ISO-8859-3.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: ECMA registry
   alias ISO-IR-109
   alias ISO_8859-3:1988
   alias ISO_8859-3
   alias LATIN3
   alias L3
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE (DEL)
      80 |  00000080 | PADDING CHARACTER (PAD)
      81 |  00000081 | HIGH OCTET PRESET (HOP)
      82 |  00000082 | BREAK PERMITTED HERE (BPH)
      83 |  00000083 | NO BREAK HERE (NBH)
      84 |  00000084 | INDEX (IND)
      85 |  00000085 | NEXT LINE (NEL)
      86 |  00000086 | START OF SELECTED AREA (SSA)
      87 |  00000087 | END OF SELECTED AREA (ESA)
      88 |  00000088 | CHARACTER TABULATION SET (HTS)
      89 |  00000089 | CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
      8A |  0000008A | LINE TABULATION SET (VTS)
      8B |  0000008B | PARTIAL LINE FORWARD (PLD)
      8C |  0000008C | PARTIAL LINE BACKWARD (PLU)
      8D |  0000008D | REVERSE LINE FEED (RI)
      8E |  0000008E | SINGLE-SHIFT TWO (SS2)
      8F |  0000008F | SINGLE-SHIFT THREE (SS3)
      90 |  00000090 | DEVICE CONTROL STRING (DCS)
      91 |  00000091 | PRIVATE USE ONE (PU1)
      92 |  00000092 | PRIVATE USE TWO (PU2)
      93 |  00000093 | SET TRANSMIT STATE (STS)
      94 |  00000094 | CANCEL CHARACTER (CCH)
      95 |  00000095 | MESSAGE WAITING (MW)
      96 |  00000096 | START OF GUARDED AREA (SPA)
      97 |  00000097 | END OF GUARDED AREA (EPA)
      98 |  00000098 | START OF STRING (SOS)
      99 |  00000099 | SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
      9A |  0000009A | SINGLE CHARACTER INTRODUCER (SCI)
      9B |  0000009B | CONTROL SEQUENCE INTRODUCER (CSI)
      9C |  0000009C | STRING TERMINATOR (ST)
      9D |  0000009D | OPERATING SYSTEM COMMAND (OSC)
      9E |  0000009E | PRIVACY MESSAGE (PM)
      9F |  0000009F | APPLICATION PROGRAM COMMAND (APC)
      A0 |  000000A0 | NO-BREAK SPACE
      A1 |  00000126 | LATIN CAPITAL LETTER H WITH STROKE
      A2 |  000002D8 | BREVE
      A3 |  000000A3 | POUND SIGN
      A4 |  000000A4 | CURRENCY SIGN
      A6 |  00000124 | LATIN CAPITAL LETTER H WITH CIRCUMFLEX
      A7 |  000000A7 | SECTION SIGN
      A8 |  000000A8 | DIAERESIS
      A9 |  00000130 | LATIN CAPITAL LETTER I WITH DOT ABOVE
      AA |  0000015E | LATIN CAPITAL LETTER S WITH CEDILLA
      AB |  0000011E | LATIN CAPITAL LETTER G WITH BREVE
      AC |  00000134 | LATIN CAPITAL LETTER J WITH CIRCUMFLEX
      AD |  000000AD | SOFT HYPHEN
      AF |  0000017B | LATIN CAPITAL LETTER Z WITH DOT ABOVE
      B0 |  000000B0 | DEGREE SIGN
      B1 |  00000127 | LATIN SMALL LETTER H WITH STROKE
      B2 |  000000B2 | SUPERSCRIPT TWO
      B3 |  000000B3 | SUPERSCRIPT THREE
      B4 |  000000B4 | ACUTE ACCENT
      B5 |  000000B5 | MICRO SIGN
      B6 |  00000125 | LATIN SMALL LETTER H WITH CIRCUMFLEX
      B7 |  000000B7 | MIDDLE DOT
      B8 |  000000B8 | CEDILLA
      B9 |  00000131 | LATIN SMALL LETTER DOTLESS I
      BA |  0000015F | LATIN SMALL LETTER S WITH CEDILLA
      BB |  0000011F | LATIN SMALL LETTER G WITH BREVE
      BC |  00000135 | LATIN SMALL LETTER J WITH CIRCUMFLEX
      BD |  000000BD | VULGAR FRACTION ONE HALF
      BF |  0000017C | LATIN SMALL LETTER Z WITH DOT ABOVE
      C0 |  000000C0 | LATIN CAPITAL LETTER A WITH GRAVE
      C1 |  000000C1 | LATIN CAPITAL LETTER A WITH ACUTE
      C2 |  000000C2 | LATIN CAPITAL LETTER A WITH CIRCUMFLEX
      C4 |  000000C4 | LATIN CAPITAL LETTER A WITH DIAERESIS
      C5 |  0000010A | LATIN CAPITAL LETTER C WITH DOT ABOVE
      C6 |  00000108 | LATIN CAPITAL LETTER C WITH CIRCUMFLEX
      C7 |  000000C7 | LATIN CAPITAL LETTER C WITH CEDILLA
      C8 |  000000C8 | LATIN CAPITAL LETTER E WITH GRAVE
      C9 |  000000C9 | LATIN CAPITAL LETTER E WITH ACUTE
      CA |  000000CA | LATIN CAPITAL LETTER E WITH CIRCUMFLEX
      CB |  000000CB | LATIN CAPITAL LETTER E WITH DIAERESIS
      CC |  000000CC | LATIN CAPITAL LETTER I WITH GRAVE
      CD |  000000CD | LATIN CAPITAL LETTER I WITH ACUTE
      CE |  000000CE | LATIN CAPITAL LETTER I WITH CIRCUMFLEX
      CF |  000000CF | LATIN CAPITAL LETTER I WITH DIAERESIS
      D1 |  000000D1 | LATIN CAPITAL LETTER N WITH TILDE
      D2 |  000000D2 | LATIN CAPITAL LETTER O WITH GRAVE
      D3 |  000000D3 | LATIN CAPITAL LETTER O WITH ACUTE
      D4 |  000000D4 | LATIN CAPITAL LETTER O WITH CIRCUMFLEX
      D5 |  00000120 | LATIN CAPITAL LETTER G WITH DOT ABOVE
      D6 |  000000D6 | LATIN CAPITAL LETTER O WITH DIAERESIS
      D7 |  000000D7 | MULTIPLICATION SIGN
      D8 |  0000011C | LATIN CAPITAL LETTER G WITH CIRCUMFLEX
      D9 |  000000D9 | LATIN CAPITAL LETTER U WITH GRAVE
      DA |  000000DA | LATIN CAPITAL LETTER U WITH ACUTE
      DB |  000000DB | LATIN CAPITAL LETTER U WITH CIRCUMFLEX
      DC |  000000DC | LATIN CAPITAL LETTER U WITH DIAERESIS
      DD |  0000016C | LATIN CAPITAL LETTER U WITH BREVE
      DE |  0000015C | LATIN CAPITAL LETTER S WITH CIRCUMFLEX
      DF |  000000DF | LATIN SMALL LETTER SHARP S (German)
      E0 |  000000E0 | LATIN SMALL LETTER A WITH GRAVE
      E1 |  000000E1 | LATIN SMALL LETTER A WITH ACUTE
      E2 |  000000E2 | LATIN SMALL LETTER A WITH CIRCUMFLEX
      E4 |  000000E4 | LATIN SMALL LETTER A WITH DIAERESIS
      E5 |  0000010B | LATIN SMALL LETTER C WITH DOT ABOVE
      E6 |  00000109 | LATIN SMALL LETTER C WITH CIRCUMFLEX
      E7 |  000000E7 | LATIN SMALL LETTER C WITH CEDILLA
      E8 |  000000E8 | LATIN SMALL LETTER E WITH GRAVE
      E9 |  000000E9 | LATIN SMALL LETTER E WITH ACUTE
      EA |  000000EA | LATIN SMALL LETTER E WITH CIRCUMFLEX
      EB |  000000EB | LATIN SMALL LETTER E WITH DIAERESIS
      EC |  000000EC | LATIN SMALL LETTER I WITH GRAVE
      ED |  000000ED | LATIN SMALL LETTER I WITH ACUTE
      EE |  000000EE | LATIN SMALL LETTER I WITH CIRCUMFLEX
      EF |  000000EF | LATIN SMALL LETTER I WITH DIAERESIS
      F1 |  000000F1 | LATIN SMALL LETTER N WITH TILDE
      F2 |  000000F2 | LATIN SMALL LETTER O WITH GRAVE
      F3 |  000000F3 | LATIN SMALL LETTER O WITH ACUTE
      F4 |  000000F4 | LATIN SMALL LETTER O WITH CIRCUMFLEX
      F5 |  00000121 | LATIN SMALL LETTER G WITH DOT ABOVE
      F6 |  000000F6 | LATIN SMALL LETTER O WITH DIAERESIS
      F7 |  000000F7 | DIVISION SIGN
      F8 |  0000011D | LATIN SMALL LETTER G WITH CIRCUMFLEX
      F9 |  000000F9 | LATIN SMALL LETTER U WITH GRAVE
      FA |  000000FA | LATIN SMALL LETTER U WITH ACUTE
      FB |  000000FB | LATIN SMALL LETTER U WITH CIRCUMFLEX
      FC |  000000FC | LATIN SMALL LETTER U WITH DIAERESIS
      FD |  0000016D | LATIN SMALL LETTER U WITH BREVE
      FE |  0000015D | LATIN SMALL LETTER S WITH CIRCUMFLEX
      FF |  000002D9 | DOT ABOVE (Mandarin Chinese light tone)
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_ISO_8859_3

    $main::fatpacked{"Locale/RecodeData/ISO_8859_4.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_ISO_8859_4';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for ISO-8859-4.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::ISO_8859_4;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0x0080,
      0x0081,
      0x0082,
      0x0083,
      0x0084,
      0x0085,
      0x0086,
      0x0087,
      0x0088,
      0x0089,
      0x008a,
      0x008b,
      0x008c,
      0x008d,
      0x008e,
      0x008f,
      0x0090,
      0x0091,
      0x0092,
      0x0093,
      0x0094,
      0x0095,
      0x0096,
      0x0097,
      0x0098,
      0x0099,
      0x009a,
      0x009b,
      0x009c,
      0x009d,
      0x009e,
      0x009f,
      0x00a0,
      0x0104,
      0x0138,
      0x0156,
      0x00a4,
      0x0128,
      0x013b,
      0x00a7,
      0x00a8,
      0x0160,
      0x0112,
      0x0122,
      0x0166,
      0x00ad,
      0x017d,
      0x00af,
      0x00b0,
      0x0105,
      0x02db,
      0x0157,
      0x00b4,
      0x0129,
      0x013c,
      0x02c7,
      0x00b8,
      0x0161,
      0x0113,
      0x0123,
      0x0167,
      0x014a,
      0x017e,
      0x014b,
      0x0100,
      0x00c1,
      0x00c2,
      0x00c3,
      0x00c4,
      0x00c5,
      0x00c6,
      0x012e,
      0x010c,
      0x00c9,
      0x0118,
      0x00cb,
      0x0116,
      0x00cd,
      0x00ce,
      0x012a,
      0x0110,
      0x0145,
      0x014c,
      0x0136,
      0x00d4,
      0x00d5,
      0x00d6,
      0x00d7,
      0x00d8,
      0x0172,
      0x00da,
      0x00db,
      0x00dc,
      0x0168,
      0x016a,
      0x00df,
      0x0101,
      0x00e1,
      0x00e2,
      0x00e3,
      0x00e4,
      0x00e5,
      0x00e6,
      0x012f,
      0x010d,
      0x00e9,
      0x0119,
      0x00eb,
      0x0117,
      0x00ed,
      0x00ee,
      0x012b,
      0x0111,
      0x0146,
      0x014d,
      0x0137,
      0x00f4,
      0x00f5,
      0x00f6,
      0x00f7,
      0x00f8,
      0x0173,
      0x00fa,
      0x00fb,
      0x00fc,
      0x0169,
      0x016b,
      0x02d9,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xc2\x80",
      "\xc2\x81",
      "\xc2\x82",
      "\xc2\x83",
      "\xc2\x84",
      "\xc2\x85",
      "\xc2\x86",
      "\xc2\x87",
      "\xc2\x88",
      "\xc2\x89",
      "\xc2\x8a",
      "\xc2\x8b",
      "\xc2\x8c",
      "\xc2\x8d",
      "\xc2\x8e",
      "\xc2\x8f",
      "\xc2\x90",
      "\xc2\x91",
      "\xc2\x92",
      "\xc2\x93",
      "\xc2\x94",
      "\xc2\x95",
      "\xc2\x96",
      "\xc2\x97",
      "\xc2\x98",
      "\xc2\x99",
      "\xc2\x9a",
      "\xc2\x9b",
      "\xc2\x9c",
      "\xc2\x9d",
      "\xc2\x9e",
      "\xc2\x9f",
      "\xc2\xa0",
      "\xc4\x84",
      "\xc4\xb8",
      "\xc5\x96",
      "\xc2\xa4",
      "\xc4\xa8",
      "\xc4\xbb",
      "\xc2\xa7",
      "\xc2\xa8",
      "\xc5\xa0",
      "\xc4\x92",
      "\xc4\xa2",
      "\xc5\xa6",
      "\xc2\xad",
      "\xc5\xbd",
      "\xc2\xaf",
      "\xc2\xb0",
      "\xc4\x85",
      "\xcb\x9b",
      "\xc5\x97",
      "\xc2\xb4",
      "\xc4\xa9",
      "\xc4\xbc",
      "\xcb\x87",
      "\xc2\xb8",
      "\xc5\xa1",
      "\xc4\x93",
      "\xc4\xa3",
      "\xc5\xa7",
      "\xc5\x8a",
      "\xc5\xbe",
      "\xc5\x8b",
      "\xc4\x80",
      "\xc3\x81",
      "\xc3\x82",
      "\xc3\x83",
      "\xc3\x84",
      "\xc3\x85",
      "\xc3\x86",
      "\xc4\xae",
      "\xc4\x8c",
      "\xc3\x89",
      "\xc4\x98",
      "\xc3\x8b",
      "\xc4\x96",
      "\xc3\x8d",
      "\xc3\x8e",
      "\xc4\xaa",
      "\xc4\x90",
      "\xc5\x85",
      "\xc5\x8c",
      "\xc4\xb6",
      "\xc3\x94",
      "\xc3\x95",
      "\xc3\x96",
      "\xc3\x97",
      "\xc3\x98",
      "\xc5\xb2",
      "\xc3\x9a",
      "\xc3\x9b",
      "\xc3\x9c",
      "\xc5\xa8",
      "\xc5\xaa",
      "\xc3\x9f",
      "\xc4\x81",
      "\xc3\xa1",
      "\xc3\xa2",
      "\xc3\xa3",
      "\xc3\xa4",
      "\xc3\xa5",
      "\xc3\xa6",
      "\xc4\xaf",
      "\xc4\x8d",
      "\xc3\xa9",
      "\xc4\x99",
      "\xc3\xab",
      "\xc4\x97",
      "\xc3\xad",
      "\xc3\xae",
      "\xc4\xab",
      "\xc4\x91",
      "\xc5\x86",
      "\xc5\x8d",
      "\xc4\xb7",
      "\xc3\xb4",
      "\xc3\xb5",
      "\xc3\xb6",
      "\xc3\xb7",
      "\xc3\xb8",
      "\xc5\xb3",
      "\xc3\xba",
      "\xc3\xbb",
      "\xc3\xbc",
      "\xc5\xa9",
      "\xc5\xab",
      "\xcb\x99",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x00000080 => "\x80",
      0x00000081 => "\x81",
      0x00000082 => "\x82",
      0x00000083 => "\x83",
      0x00000084 => "\x84",
      0x00000085 => "\x85",
      0x00000086 => "\x86",
      0x00000087 => "\x87",
      0x00000088 => "\x88",
      0x00000089 => "\x89",
      0x0000008a => "\x8a",
      0x0000008b => "\x8b",
      0x0000008c => "\x8c",
      0x0000008d => "\x8d",
      0x0000008e => "\x8e",
      0x0000008f => "\x8f",
      0x00000090 => "\x90",
      0x00000091 => "\x91",
      0x00000092 => "\x92",
      0x00000093 => "\x93",
      0x00000094 => "\x94",
      0x00000095 => "\x95",
      0x00000096 => "\x96",
      0x00000097 => "\x97",
      0x00000098 => "\x98",
      0x00000099 => "\x99",
      0x0000009a => "\x9a",
      0x0000009b => "\x9b",
      0x0000009c => "\x9c",
      0x0000009d => "\x9d",
      0x0000009e => "\x9e",
      0x0000009f => "\x9f",
      0x000000a0 => "\xa0",
      0x000000a4 => "\xa4",
      0x000000a7 => "\xa7",
      0x000000a8 => "\xa8",
      0x000000ad => "\xad",
      0x000000af => "\xaf",
      0x000000b0 => "\xb0",
      0x000000b4 => "\xb4",
      0x000000b8 => "\xb8",
      0x000000c1 => "\xc1",
      0x000000c2 => "\xc2",
      0x000000c3 => "\xc3",
      0x000000c4 => "\xc4",
      0x000000c5 => "\xc5",
      0x000000c6 => "\xc6",
      0x000000c9 => "\xc9",
      0x000000cb => "\xcb",
      0x000000cd => "\xcd",
      0x000000ce => "\xce",
      0x000000d4 => "\xd4",
      0x000000d5 => "\xd5",
      0x000000d6 => "\xd6",
      0x000000d7 => "\xd7",
      0x000000d8 => "\xd8",
      0x000000da => "\xda",
      0x000000db => "\xdb",
      0x000000dc => "\xdc",
      0x000000df => "\xdf",
      0x000000e1 => "\xe1",
      0x000000e2 => "\xe2",
      0x000000e3 => "\xe3",
      0x000000e4 => "\xe4",
      0x000000e5 => "\xe5",
      0x000000e6 => "\xe6",
      0x000000e9 => "\xe9",
      0x000000eb => "\xeb",
      0x000000ed => "\xed",
      0x000000ee => "\xee",
      0x000000f4 => "\xf4",
      0x000000f5 => "\xf5",
      0x000000f6 => "\xf6",
      0x000000f7 => "\xf7",
      0x000000f8 => "\xf8",
      0x000000fa => "\xfa",
      0x000000fb => "\xfb",
      0x000000fc => "\xfc",
      0x00000100 => "\xc0",
      0x00000101 => "\xe0",
      0x00000104 => "\xa1",
      0x00000105 => "\xb1",
      0x0000010c => "\xc8",
      0x0000010d => "\xe8",
      0x00000110 => "\xd0",
      0x00000111 => "\xf0",
      0x00000112 => "\xaa",
      0x00000113 => "\xba",
      0x00000116 => "\xcc",
      0x00000117 => "\xec",
      0x00000118 => "\xca",
      0x00000119 => "\xea",
      0x00000122 => "\xab",
      0x00000123 => "\xbb",
      0x00000128 => "\xa5",
      0x00000129 => "\xb5",
      0x0000012a => "\xcf",
      0x0000012b => "\xef",
      0x0000012e => "\xc7",
      0x0000012f => "\xe7",
      0x00000136 => "\xd3",
      0x00000137 => "\xf3",
      0x00000138 => "\xa2",
      0x0000013b => "\xa6",
      0x0000013c => "\xb6",
      0x00000145 => "\xd1",
      0x00000146 => "\xf1",
      0x0000014a => "\xbd",
      0x0000014b => "\xbf",
      0x0000014c => "\xd2",
      0x0000014d => "\xf2",
      0x00000156 => "\xa3",
      0x00000157 => "\xb3",
      0x00000160 => "\xa9",
      0x00000161 => "\xb9",
      0x00000166 => "\xac",
      0x00000167 => "\xbc",
      0x00000168 => "\xdd",
      0x00000169 => "\xfd",
      0x0000016a => "\xde",
      0x0000016b => "\xfe",
      0x00000172 => "\xd9",
      0x00000173 => "\xf9",
      0x0000017d => "\xae",
      0x0000017e => "\xbe",
      0x000002c7 => "\xb7",
      0x000002d9 => "\xff",
      0x000002db => "\xb2",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::ISO_8859_4 - Conversion routines for ISO-8859-4
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for ISO-8859-4.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: ECMA registry
   alias ISO-IR-110
   alias ISO_8859-4:1988
   alias ISO_8859-4
   alias LATIN4
   alias L4
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE (DEL)
      80 |  00000080 | PADDING CHARACTER (PAD)
      81 |  00000081 | HIGH OCTET PRESET (HOP)
      82 |  00000082 | BREAK PERMITTED HERE (BPH)
      83 |  00000083 | NO BREAK HERE (NBH)
      84 |  00000084 | INDEX (IND)
      85 |  00000085 | NEXT LINE (NEL)
      86 |  00000086 | START OF SELECTED AREA (SSA)
      87 |  00000087 | END OF SELECTED AREA (ESA)
      88 |  00000088 | CHARACTER TABULATION SET (HTS)
      89 |  00000089 | CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
      8A |  0000008A | LINE TABULATION SET (VTS)
      8B |  0000008B | PARTIAL LINE FORWARD (PLD)
      8C |  0000008C | PARTIAL LINE BACKWARD (PLU)
      8D |  0000008D | REVERSE LINE FEED (RI)
      8E |  0000008E | SINGLE-SHIFT TWO (SS2)
      8F |  0000008F | SINGLE-SHIFT THREE (SS3)
      90 |  00000090 | DEVICE CONTROL STRING (DCS)
      91 |  00000091 | PRIVATE USE ONE (PU1)
      92 |  00000092 | PRIVATE USE TWO (PU2)
      93 |  00000093 | SET TRANSMIT STATE (STS)
      94 |  00000094 | CANCEL CHARACTER (CCH)
      95 |  00000095 | MESSAGE WAITING (MW)
      96 |  00000096 | START OF GUARDED AREA (SPA)
      97 |  00000097 | END OF GUARDED AREA (EPA)
      98 |  00000098 | START OF STRING (SOS)
      99 |  00000099 | SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
      9A |  0000009A | SINGLE CHARACTER INTRODUCER (SCI)
      9B |  0000009B | CONTROL SEQUENCE INTRODUCER (CSI)
      9C |  0000009C | STRING TERMINATOR (ST)
      9D |  0000009D | OPERATING SYSTEM COMMAND (OSC)
      9E |  0000009E | PRIVACY MESSAGE (PM)
      9F |  0000009F | APPLICATION PROGRAM COMMAND (APC)
      A0 |  000000A0 | NO-BREAK SPACE
      A1 |  00000104 | LATIN CAPITAL LETTER A WITH OGONEK
      A2 |  00000138 | LATIN SMALL LETTER KRA (Greenlandic)
      A3 |  00000156 | LATIN CAPITAL LETTER R WITH CEDILLA
      A4 |  000000A4 | CURRENCY SIGN
      A5 |  00000128 | LATIN CAPITAL LETTER I WITH TILDE
      A6 |  0000013B | LATIN CAPITAL LETTER L WITH CEDILLA
      A7 |  000000A7 | SECTION SIGN
      A8 |  000000A8 | DIAERESIS
      A9 |  00000160 | LATIN CAPITAL LETTER S WITH CARON
      AA |  00000112 | LATIN CAPITAL LETTER E WITH MACRON
      AB |  00000122 | LATIN CAPITAL LETTER G WITH CEDILLA
      AC |  00000166 | LATIN CAPITAL LETTER T WITH STROKE
      AD |  000000AD | SOFT HYPHEN
      AE |  0000017D | LATIN CAPITAL LETTER Z WITH CARON
      AF |  000000AF | MACRON
      B0 |  000000B0 | DEGREE SIGN
      B1 |  00000105 | LATIN SMALL LETTER A WITH OGONEK
      B2 |  000002DB | OGONEK
      B3 |  00000157 | LATIN SMALL LETTER R WITH CEDILLA
      B4 |  000000B4 | ACUTE ACCENT
      B5 |  00000129 | LATIN SMALL LETTER I WITH TILDE
      B6 |  0000013C | LATIN SMALL LETTER L WITH CEDILLA
      B7 |  000002C7 | CARON (Mandarin Chinese third tone)
      B8 |  000000B8 | CEDILLA
      B9 |  00000161 | LATIN SMALL LETTER S WITH CARON
      BA |  00000113 | LATIN SMALL LETTER E WITH MACRON
      BB |  00000123 | LATIN SMALL LETTER G WITH CEDILLA
      BC |  00000167 | LATIN SMALL LETTER T WITH STROKE
      BD |  0000014A | LATIN CAPITAL LETTER ENG (Sami)
      BE |  0000017E | LATIN SMALL LETTER Z WITH CARON
      BF |  0000014B | LATIN SMALL LETTER ENG (Sami)
      C0 |  00000100 | LATIN CAPITAL LETTER A WITH MACRON
      C1 |  000000C1 | LATIN CAPITAL LETTER A WITH ACUTE
      C2 |  000000C2 | LATIN CAPITAL LETTER A WITH CIRCUMFLEX
      C3 |  000000C3 | LATIN CAPITAL LETTER A WITH TILDE
      C4 |  000000C4 | LATIN CAPITAL LETTER A WITH DIAERESIS
      C5 |  000000C5 | LATIN CAPITAL LETTER A WITH RING ABOVE
      C6 |  000000C6 | LATIN CAPITAL LETTER AE
      C7 |  0000012E | LATIN CAPITAL LETTER I WITH OGONEK
      C8 |  0000010C | LATIN CAPITAL LETTER C WITH CARON
      C9 |  000000C9 | LATIN CAPITAL LETTER E WITH ACUTE
      CA |  00000118 | LATIN CAPITAL LETTER E WITH OGONEK
      CB |  000000CB | LATIN CAPITAL LETTER E WITH DIAERESIS
      CC |  00000116 | LATIN CAPITAL LETTER E WITH DOT ABOVE
      CD |  000000CD | LATIN CAPITAL LETTER I WITH ACUTE
      CE |  000000CE | LATIN CAPITAL LETTER I WITH CIRCUMFLEX
      CF |  0000012A | LATIN CAPITAL LETTER I WITH MACRON
      D0 |  00000110 | LATIN CAPITAL LETTER D WITH STROKE
      D1 |  00000145 | LATIN CAPITAL LETTER N WITH CEDILLA
      D2 |  0000014C | LATIN CAPITAL LETTER O WITH MACRON
      D3 |  00000136 | LATIN CAPITAL LETTER K WITH CEDILLA
      D4 |  000000D4 | LATIN CAPITAL LETTER O WITH CIRCUMFLEX
      D5 |  000000D5 | LATIN CAPITAL LETTER O WITH TILDE
      D6 |  000000D6 | LATIN CAPITAL LETTER O WITH DIAERESIS
      D7 |  000000D7 | MULTIPLICATION SIGN
      D8 |  000000D8 | LATIN CAPITAL LETTER O WITH STROKE
      D9 |  00000172 | LATIN CAPITAL LETTER U WITH OGONEK
      DA |  000000DA | LATIN CAPITAL LETTER U WITH ACUTE
      DB |  000000DB | LATIN CAPITAL LETTER U WITH CIRCUMFLEX
      DC |  000000DC | LATIN CAPITAL LETTER U WITH DIAERESIS
      DD |  00000168 | LATIN CAPITAL LETTER U WITH TILDE
      DE |  0000016A | LATIN CAPITAL LETTER U WITH MACRON
      DF |  000000DF | LATIN SMALL LETTER SHARP S (German)
      E0 |  00000101 | LATIN SMALL LETTER A WITH MACRON
      E1 |  000000E1 | LATIN SMALL LETTER A WITH ACUTE
      E2 |  000000E2 | LATIN SMALL LETTER A WITH CIRCUMFLEX
      E3 |  000000E3 | LATIN SMALL LETTER A WITH TILDE
      E4 |  000000E4 | LATIN SMALL LETTER A WITH DIAERESIS
      E5 |  000000E5 | LATIN SMALL LETTER A WITH RING ABOVE
      E6 |  000000E6 | LATIN SMALL LETTER AE
      E7 |  0000012F | LATIN SMALL LETTER I WITH OGONEK
      E8 |  0000010D | LATIN SMALL LETTER C WITH CARON
      E9 |  000000E9 | LATIN SMALL LETTER E WITH ACUTE
      EA |  00000119 | LATIN SMALL LETTER E WITH OGONEK
      EB |  000000EB | LATIN SMALL LETTER E WITH DIAERESIS
      EC |  00000117 | LATIN SMALL LETTER E WITH DOT ABOVE
      ED |  000000ED | LATIN SMALL LETTER I WITH ACUTE
      EE |  000000EE | LATIN SMALL LETTER I WITH CIRCUMFLEX
      EF |  0000012B | LATIN SMALL LETTER I WITH MACRON
      F0 |  00000111 | LATIN SMALL LETTER D WITH STROKE
      F1 |  00000146 | LATIN SMALL LETTER N WITH CEDILLA
      F2 |  0000014D | LATIN SMALL LETTER O WITH MACRON
      F3 |  00000137 | LATIN SMALL LETTER K WITH CEDILLA
      F4 |  000000F4 | LATIN SMALL LETTER O WITH CIRCUMFLEX
      F5 |  000000F5 | LATIN SMALL LETTER O WITH TILDE
      F6 |  000000F6 | LATIN SMALL LETTER O WITH DIAERESIS
      F7 |  000000F7 | DIVISION SIGN
      F8 |  000000F8 | LATIN SMALL LETTER O WITH STROKE
      F9 |  00000173 | LATIN SMALL LETTER U WITH OGONEK
      FA |  000000FA | LATIN SMALL LETTER U WITH ACUTE
      FB |  000000FB | LATIN SMALL LETTER U WITH CIRCUMFLEX
      FC |  000000FC | LATIN SMALL LETTER U WITH DIAERESIS
      FD |  00000169 | LATIN SMALL LETTER U WITH TILDE
      FE |  0000016B | LATIN SMALL LETTER U WITH MACRON
      FF |  000002D9 | DOT ABOVE (Mandarin Chinese light tone)
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_ISO_8859_4

    $main::fatpacked{"Locale/RecodeData/ISO_8859_5.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_ISO_8859_5';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for ISO-8859-5.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::ISO_8859_5;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0x0080,
      0x0081,
      0x0082,
      0x0083,
      0x0084,
      0x0085,
      0x0086,
      0x0087,
      0x0088,
      0x0089,
      0x008a,
      0x008b,
      0x008c,
      0x008d,
      0x008e,
      0x008f,
      0x0090,
      0x0091,
      0x0092,
      0x0093,
      0x0094,
      0x0095,
      0x0096,
      0x0097,
      0x0098,
      0x0099,
      0x009a,
      0x009b,
      0x009c,
      0x009d,
      0x009e,
      0x009f,
      0x00a0,
      0x0401,
      0x0402,
      0x0403,
      0x0404,
      0x0405,
      0x0406,
      0x0407,
      0x0408,
      0x0409,
      0x040a,
      0x040b,
      0x040c,
      0x00ad,
      0x040e,
      0x040f,
      0x0410,
      0x0411,
      0x0412,
      0x0413,
      0x0414,
      0x0415,
      0x0416,
      0x0417,
      0x0418,
      0x0419,
      0x041a,
      0x041b,
      0x041c,
      0x041d,
      0x041e,
      0x041f,
      0x0420,
      0x0421,
      0x0422,
      0x0423,
      0x0424,
      0x0425,
      0x0426,
      0x0427,
      0x0428,
      0x0429,
      0x042a,
      0x042b,
      0x042c,
      0x042d,
      0x042e,
      0x042f,
      0x0430,
      0x0431,
      0x0432,
      0x0433,
      0x0434,
      0x0435,
      0x0436,
      0x0437,
      0x0438,
      0x0439,
      0x043a,
      0x043b,
      0x043c,
      0x043d,
      0x043e,
      0x043f,
      0x0440,
      0x0441,
      0x0442,
      0x0443,
      0x0444,
      0x0445,
      0x0446,
      0x0447,
      0x0448,
      0x0449,
      0x044a,
      0x044b,
      0x044c,
      0x044d,
      0x044e,
      0x044f,
      0x2116,
      0x0451,
      0x0452,
      0x0453,
      0x0454,
      0x0455,
      0x0456,
      0x0457,
      0x0458,
      0x0459,
      0x045a,
      0x045b,
      0x045c,
      0x00a7,
      0x045e,
      0x045f,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xc2\x80",
      "\xc2\x81",
      "\xc2\x82",
      "\xc2\x83",
      "\xc2\x84",
      "\xc2\x85",
      "\xc2\x86",
      "\xc2\x87",
      "\xc2\x88",
      "\xc2\x89",
      "\xc2\x8a",
      "\xc2\x8b",
      "\xc2\x8c",
      "\xc2\x8d",
      "\xc2\x8e",
      "\xc2\x8f",
      "\xc2\x90",
      "\xc2\x91",
      "\xc2\x92",
      "\xc2\x93",
      "\xc2\x94",
      "\xc2\x95",
      "\xc2\x96",
      "\xc2\x97",
      "\xc2\x98",
      "\xc2\x99",
      "\xc2\x9a",
      "\xc2\x9b",
      "\xc2\x9c",
      "\xc2\x9d",
      "\xc2\x9e",
      "\xc2\x9f",
      "\xc2\xa0",
      "\xd0\x81",
      "\xd0\x82",
      "\xd0\x83",
      "\xd0\x84",
      "\xd0\x85",
      "\xd0\x86",
      "\xd0\x87",
      "\xd0\x88",
      "\xd0\x89",
      "\xd0\x8a",
      "\xd0\x8b",
      "\xd0\x8c",
      "\xc2\xad",
      "\xd0\x8e",
      "\xd0\x8f",
      "\xd0\x90",
      "\xd0\x91",
      "\xd0\x92",
      "\xd0\x93",
      "\xd0\x94",
      "\xd0\x95",
      "\xd0\x96",
      "\xd0\x97",
      "\xd0\x98",
      "\xd0\x99",
      "\xd0\x9a",
      "\xd0\x9b",
      "\xd0\x9c",
      "\xd0\x9d",
      "\xd0\x9e",
      "\xd0\x9f",
      "\xd0\xa0",
      "\xd0\xa1",
      "\xd0\xa2",
      "\xd0\xa3",
      "\xd0\xa4",
      "\xd0\xa5",
      "\xd0\xa6",
      "\xd0\xa7",
      "\xd0\xa8",
      "\xd0\xa9",
      "\xd0\xaa",
      "\xd0\xab",
      "\xd0\xac",
      "\xd0\xad",
      "\xd0\xae",
      "\xd0\xaf",
      "\xd0\xb0",
      "\xd0\xb1",
      "\xd0\xb2",
      "\xd0\xb3",
      "\xd0\xb4",
      "\xd0\xb5",
      "\xd0\xb6",
      "\xd0\xb7",
      "\xd0\xb8",
      "\xd0\xb9",
      "\xd0\xba",
      "\xd0\xbb",
      "\xd0\xbc",
      "\xd0\xbd",
      "\xd0\xbe",
      "\xd0\xbf",
      "\xd1\x80",
      "\xd1\x81",
      "\xd1\x82",
      "\xd1\x83",
      "\xd1\x84",
      "\xd1\x85",
      "\xd1\x86",
      "\xd1\x87",
      "\xd1\x88",
      "\xd1\x89",
      "\xd1\x8a",
      "\xd1\x8b",
      "\xd1\x8c",
      "\xd1\x8d",
      "\xd1\x8e",
      "\xd1\x8f",
      "\xe2\x84\x96",
      "\xd1\x91",
      "\xd1\x92",
      "\xd1\x93",
      "\xd1\x94",
      "\xd1\x95",
      "\xd1\x96",
      "\xd1\x97",
      "\xd1\x98",
      "\xd1\x99",
      "\xd1\x9a",
      "\xd1\x9b",
      "\xd1\x9c",
      "\xc2\xa7",
      "\xd1\x9e",
      "\xd1\x9f",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x00000080 => "\x80",
      0x00000081 => "\x81",
      0x00000082 => "\x82",
      0x00000083 => "\x83",
      0x00000084 => "\x84",
      0x00000085 => "\x85",
      0x00000086 => "\x86",
      0x00000087 => "\x87",
      0x00000088 => "\x88",
      0x00000089 => "\x89",
      0x0000008a => "\x8a",
      0x0000008b => "\x8b",
      0x0000008c => "\x8c",
      0x0000008d => "\x8d",
      0x0000008e => "\x8e",
      0x0000008f => "\x8f",
      0x00000090 => "\x90",
      0x00000091 => "\x91",
      0x00000092 => "\x92",
      0x00000093 => "\x93",
      0x00000094 => "\x94",
      0x00000095 => "\x95",
      0x00000096 => "\x96",
      0x00000097 => "\x97",
      0x00000098 => "\x98",
      0x00000099 => "\x99",
      0x0000009a => "\x9a",
      0x0000009b => "\x9b",
      0x0000009c => "\x9c",
      0x0000009d => "\x9d",
      0x0000009e => "\x9e",
      0x0000009f => "\x9f",
      0x000000a0 => "\xa0",
      0x000000a7 => "\xfd",
      0x000000ad => "\xad",
      0x00000401 => "\xa1",
      0x00000402 => "\xa2",
      0x00000403 => "\xa3",
      0x00000404 => "\xa4",
      0x00000405 => "\xa5",
      0x00000406 => "\xa6",
      0x00000407 => "\xa7",
      0x00000408 => "\xa8",
      0x00000409 => "\xa9",
      0x0000040a => "\xaa",
      0x0000040b => "\xab",
      0x0000040c => "\xac",
      0x0000040e => "\xae",
      0x0000040f => "\xaf",
      0x00000410 => "\xb0",
      0x00000411 => "\xb1",
      0x00000412 => "\xb2",
      0x00000413 => "\xb3",
      0x00000414 => "\xb4",
      0x00000415 => "\xb5",
      0x00000416 => "\xb6",
      0x00000417 => "\xb7",
      0x00000418 => "\xb8",
      0x00000419 => "\xb9",
      0x0000041a => "\xba",
      0x0000041b => "\xbb",
      0x0000041c => "\xbc",
      0x0000041d => "\xbd",
      0x0000041e => "\xbe",
      0x0000041f => "\xbf",
      0x00000420 => "\xc0",
      0x00000421 => "\xc1",
      0x00000422 => "\xc2",
      0x00000423 => "\xc3",
      0x00000424 => "\xc4",
      0x00000425 => "\xc5",
      0x00000426 => "\xc6",
      0x00000427 => "\xc7",
      0x00000428 => "\xc8",
      0x00000429 => "\xc9",
      0x0000042a => "\xca",
      0x0000042b => "\xcb",
      0x0000042c => "\xcc",
      0x0000042d => "\xcd",
      0x0000042e => "\xce",
      0x0000042f => "\xcf",
      0x00000430 => "\xd0",
      0x00000431 => "\xd1",
      0x00000432 => "\xd2",
      0x00000433 => "\xd3",
      0x00000434 => "\xd4",
      0x00000435 => "\xd5",
      0x00000436 => "\xd6",
      0x00000437 => "\xd7",
      0x00000438 => "\xd8",
      0x00000439 => "\xd9",
      0x0000043a => "\xda",
      0x0000043b => "\xdb",
      0x0000043c => "\xdc",
      0x0000043d => "\xdd",
      0x0000043e => "\xde",
      0x0000043f => "\xdf",
      0x00000440 => "\xe0",
      0x00000441 => "\xe1",
      0x00000442 => "\xe2",
      0x00000443 => "\xe3",
      0x00000444 => "\xe4",
      0x00000445 => "\xe5",
      0x00000446 => "\xe6",
      0x00000447 => "\xe7",
      0x00000448 => "\xe8",
      0x00000449 => "\xe9",
      0x0000044a => "\xea",
      0x0000044b => "\xeb",
      0x0000044c => "\xec",
      0x0000044d => "\xed",
      0x0000044e => "\xee",
      0x0000044f => "\xef",
      0x00000451 => "\xf1",
      0x00000452 => "\xf2",
      0x00000453 => "\xf3",
      0x00000454 => "\xf4",
      0x00000455 => "\xf5",
      0x00000456 => "\xf6",
      0x00000457 => "\xf7",
      0x00000458 => "\xf8",
      0x00000459 => "\xf9",
      0x0000045a => "\xfa",
      0x0000045b => "\xfb",
      0x0000045c => "\xfc",
      0x0000045e => "\xfe",
      0x0000045f => "\xff",
      0x00002116 => "\xf0",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::ISO_8859_5 - Conversion routines for ISO-8859-5
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for ISO-8859-5.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: ECMA registry
   alias ISO-IR-144
   alias ISO_8859-5:1988
   alias ISO_8859-5
   alias CYRILLIC
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE (DEL)
      80 |  00000080 | PADDING CHARACTER (PAD)
      81 |  00000081 | HIGH OCTET PRESET (HOP)
      82 |  00000082 | BREAK PERMITTED HERE (BPH)
      83 |  00000083 | NO BREAK HERE (NBH)
      84 |  00000084 | INDEX (IND)
      85 |  00000085 | NEXT LINE (NEL)
      86 |  00000086 | START OF SELECTED AREA (SSA)
      87 |  00000087 | END OF SELECTED AREA (ESA)
      88 |  00000088 | CHARACTER TABULATION SET (HTS)
      89 |  00000089 | CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
      8A |  0000008A | LINE TABULATION SET (VTS)
      8B |  0000008B | PARTIAL LINE FORWARD (PLD)
      8C |  0000008C | PARTIAL LINE BACKWARD (PLU)
      8D |  0000008D | REVERSE LINE FEED (RI)
      8E |  0000008E | SINGLE-SHIFT TWO (SS2)
      8F |  0000008F | SINGLE-SHIFT THREE (SS3)
      90 |  00000090 | DEVICE CONTROL STRING (DCS)
      91 |  00000091 | PRIVATE USE ONE (PU1)
      92 |  00000092 | PRIVATE USE TWO (PU2)
      93 |  00000093 | SET TRANSMIT STATE (STS)
      94 |  00000094 | CANCEL CHARACTER (CCH)
      95 |  00000095 | MESSAGE WAITING (MW)
      96 |  00000096 | START OF GUARDED AREA (SPA)
      97 |  00000097 | END OF GUARDED AREA (EPA)
      98 |  00000098 | START OF STRING (SOS)
      99 |  00000099 | SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
      9A |  0000009A | SINGLE CHARACTER INTRODUCER (SCI)
      9B |  0000009B | CONTROL SEQUENCE INTRODUCER (CSI)
      9C |  0000009C | STRING TERMINATOR (ST)
      9D |  0000009D | OPERATING SYSTEM COMMAND (OSC)
      9E |  0000009E | PRIVACY MESSAGE (PM)
      9F |  0000009F | APPLICATION PROGRAM COMMAND (APC)
      A0 |  000000A0 | NO-BREAK SPACE
      A1 |  00000401 | CYRILLIC CAPITAL LETTER IO
      A2 |  00000402 | CYRILLIC CAPITAL LETTER DJE (Serbocroatian)
      A3 |  00000403 | CYRILLIC CAPITAL LETTER GJE
      A4 |  00000404 | CYRILLIC CAPITAL LETTER UKRAINIAN IE
      A5 |  00000405 | CYRILLIC CAPITAL LETTER DZE
      A6 |  00000406 | CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
      A7 |  00000407 | CYRILLIC CAPITAL LETTER YI (Ukrainian)
      A8 |  00000408 | CYRILLIC CAPITAL LETTER JE
      A9 |  00000409 | CYRILLIC CAPITAL LETTER LJE
      AA |  0000040A | CYRILLIC CAPITAL LETTER NJE
      AB |  0000040B | CYRILLIC CAPITAL LETTER TSHE (Serbocroatian)
      AC |  0000040C | CYRILLIC CAPITAL LETTER KJE
      AD |  000000AD | SOFT HYPHEN
      AE |  0000040E | CYRILLIC CAPITAL LETTER SHORT U (Byelorussian)
      AF |  0000040F | CYRILLIC CAPITAL LETTER DZHE
      B0 |  00000410 | CYRILLIC CAPITAL LETTER A
      B1 |  00000411 | CYRILLIC CAPITAL LETTER BE
      B2 |  00000412 | CYRILLIC CAPITAL LETTER VE
      B3 |  00000413 | CYRILLIC CAPITAL LETTER GHE
      B4 |  00000414 | CYRILLIC CAPITAL LETTER DE
      B5 |  00000415 | CYRILLIC CAPITAL LETTER IE
      B6 |  00000416 | CYRILLIC CAPITAL LETTER ZHE
      B7 |  00000417 | CYRILLIC CAPITAL LETTER ZE
      B8 |  00000418 | CYRILLIC CAPITAL LETTER I
      B9 |  00000419 | CYRILLIC CAPITAL LETTER SHORT I
      BA |  0000041A | CYRILLIC CAPITAL LETTER KA
      BB |  0000041B | CYRILLIC CAPITAL LETTER EL
      BC |  0000041C | CYRILLIC CAPITAL LETTER EM
      BD |  0000041D | CYRILLIC CAPITAL LETTER EN
      BE |  0000041E | CYRILLIC CAPITAL LETTER O
      BF |  0000041F | CYRILLIC CAPITAL LETTER PE
      C0 |  00000420 | CYRILLIC CAPITAL LETTER ER
      C1 |  00000421 | CYRILLIC CAPITAL LETTER ES
      C2 |  00000422 | CYRILLIC CAPITAL LETTER TE
      C3 |  00000423 | CYRILLIC CAPITAL LETTER U
      C4 |  00000424 | CYRILLIC CAPITAL LETTER EF
      C5 |  00000425 | CYRILLIC CAPITAL LETTER HA
      C6 |  00000426 | CYRILLIC CAPITAL LETTER TSE
      C7 |  00000427 | CYRILLIC CAPITAL LETTER CHE
      C8 |  00000428 | CYRILLIC CAPITAL LETTER SHA
      C9 |  00000429 | CYRILLIC CAPITAL LETTER SHCHA
      CA |  0000042A | CYRILLIC CAPITAL LETTER HARD SIGN
      CB |  0000042B | CYRILLIC CAPITAL LETTER YERU
      CC |  0000042C | CYRILLIC CAPITAL LETTER SOFT SIGN
      CD |  0000042D | CYRILLIC CAPITAL LETTER E
      CE |  0000042E | CYRILLIC CAPITAL LETTER YU
      CF |  0000042F | CYRILLIC CAPITAL LETTER YA
      D0 |  00000430 | CYRILLIC SMALL LETTER A
      D1 |  00000431 | CYRILLIC SMALL LETTER BE
      D2 |  00000432 | CYRILLIC SMALL LETTER VE
      D3 |  00000433 | CYRILLIC SMALL LETTER GHE
      D4 |  00000434 | CYRILLIC SMALL LETTER DE
      D5 |  00000435 | CYRILLIC SMALL LETTER IE
      D6 |  00000436 | CYRILLIC SMALL LETTER ZHE
      D7 |  00000437 | CYRILLIC SMALL LETTER ZE
      D8 |  00000438 | CYRILLIC SMALL LETTER I
      D9 |  00000439 | CYRILLIC SMALL LETTER SHORT I
      DA |  0000043A | CYRILLIC SMALL LETTER KA
      DB |  0000043B | CYRILLIC SMALL LETTER EL
      DC |  0000043C | CYRILLIC SMALL LETTER EM
      DD |  0000043D | CYRILLIC SMALL LETTER EN
      DE |  0000043E | CYRILLIC SMALL LETTER O
      DF |  0000043F | CYRILLIC SMALL LETTER PE
      E0 |  00000440 | CYRILLIC SMALL LETTER ER
      E1 |  00000441 | CYRILLIC SMALL LETTER ES
      E2 |  00000442 | CYRILLIC SMALL LETTER TE
      E3 |  00000443 | CYRILLIC SMALL LETTER U
      E4 |  00000444 | CYRILLIC SMALL LETTER EF
      E5 |  00000445 | CYRILLIC SMALL LETTER HA
      E6 |  00000446 | CYRILLIC SMALL LETTER TSE
      E7 |  00000447 | CYRILLIC SMALL LETTER CHE
      E8 |  00000448 | CYRILLIC SMALL LETTER SHA
      E9 |  00000449 | CYRILLIC SMALL LETTER SHCHA
      EA |  0000044A | CYRILLIC SMALL LETTER HARD SIGN
      EB |  0000044B | CYRILLIC SMALL LETTER YERU
      EC |  0000044C | CYRILLIC SMALL LETTER SOFT SIGN
      ED |  0000044D | CYRILLIC SMALL LETTER E
      EE |  0000044E | CYRILLIC SMALL LETTER YU
      EF |  0000044F | CYRILLIC SMALL LETTER YA
      F0 |  00002116 | NUMERO SIGN
      F1 |  00000451 | CYRILLIC SMALL LETTER IO
      F2 |  00000452 | CYRILLIC SMALL LETTER DJE (Serbocroatian)
      F3 |  00000453 | CYRILLIC SMALL LETTER GJE
      F4 |  00000454 | CYRILLIC SMALL LETTER UKRAINIAN IE
      F5 |  00000455 | CYRILLIC SMALL LETTER DZE
      F6 |  00000456 | CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
      F7 |  00000457 | CYRILLIC SMALL LETTER YI (Ukrainian)
      F8 |  00000458 | CYRILLIC SMALL LETTER JE
      F9 |  00000459 | CYRILLIC SMALL LETTER LJE
      FA |  0000045A | CYRILLIC SMALL LETTER NJE
      FB |  0000045B | CYRILLIC SMALL LETTER TSHE (Serbocroatian)
      FC |  0000045C | CYRILLIC SMALL LETTER KJE
      FD |  000000A7 | SECTION SIGN
      FE |  0000045E | CYRILLIC SMALL LETTER SHORT U (Byelorussian)
      FF |  0000045F | CYRILLIC SMALL LETTER DZHE
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_ISO_8859_5

    $main::fatpacked{"Locale/RecodeData/ISO_8859_6.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_ISO_8859_6';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for ISO-8859-6.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::ISO_8859_6;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0x0080,
      0x0081,
      0x0082,
      0x0083,
      0x0084,
      0x0085,
      0x0086,
      0x0087,
      0x0088,
      0x0089,
      0x008a,
      0x008b,
      0x008c,
      0x008d,
      0x008e,
      0x008f,
      0x0090,
      0x0091,
      0x0092,
      0x0093,
      0x0094,
      0x0095,
      0x0096,
      0x0097,
      0x0098,
      0x0099,
      0x009a,
      0x009b,
      0x009c,
      0x009d,
      0x009e,
      0x009f,
      0x00a0,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00a4,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x060c,
      0x00ad,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x061b,
      0xfffd,
      0xfffd,
      0xfffd,
      0x061f,
      0xfffd,
      0x0621,
      0x0622,
      0x0623,
      0x0624,
      0x0625,
      0x0626,
      0x0627,
      0x0628,
      0x0629,
      0x062a,
      0x062b,
      0x062c,
      0x062d,
      0x062e,
      0x062f,
      0x0630,
      0x0631,
      0x0632,
      0x0633,
      0x0634,
      0x0635,
      0x0636,
      0x0637,
      0x0638,
      0x0639,
      0x063a,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0640,
      0x0641,
      0x0642,
      0x0643,
      0x0644,
      0x0645,
      0x0646,
      0x0647,
      0x0648,
      0x0649,
      0x064a,
      0x064b,
      0x064c,
      0x064d,
      0x064e,
      0x064f,
      0x0650,
      0x0651,
      0x0652,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xc2\x80",
      "\xc2\x81",
      "\xc2\x82",
      "\xc2\x83",
      "\xc2\x84",
      "\xc2\x85",
      "\xc2\x86",
      "\xc2\x87",
      "\xc2\x88",
      "\xc2\x89",
      "\xc2\x8a",
      "\xc2\x8b",
      "\xc2\x8c",
      "\xc2\x8d",
      "\xc2\x8e",
      "\xc2\x8f",
      "\xc2\x90",
      "\xc2\x91",
      "\xc2\x92",
      "\xc2\x93",
      "\xc2\x94",
      "\xc2\x95",
      "\xc2\x96",
      "\xc2\x97",
      "\xc2\x98",
      "\xc2\x99",
      "\xc2\x9a",
      "\xc2\x9b",
      "\xc2\x9c",
      "\xc2\x9d",
      "\xc2\x9e",
      "\xc2\x9f",
      "\xc2\xa0",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc2\xa4",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xd8\x8c",
      "\xc2\xad",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xd8\x9b",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xd8\x9f",
      "\xef\xbf\xbd",
      "\xd8\xa1",
      "\xd8\xa2",
      "\xd8\xa3",
      "\xd8\xa4",
      "\xd8\xa5",
      "\xd8\xa6",
      "\xd8\xa7",
      "\xd8\xa8",
      "\xd8\xa9",
      "\xd8\xaa",
      "\xd8\xab",
      "\xd8\xac",
      "\xd8\xad",
      "\xd8\xae",
      "\xd8\xaf",
      "\xd8\xb0",
      "\xd8\xb1",
      "\xd8\xb2",
      "\xd8\xb3",
      "\xd8\xb4",
      "\xd8\xb5",
      "\xd8\xb6",
      "\xd8\xb7",
      "\xd8\xb8",
      "\xd8\xb9",
      "\xd8\xba",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xd9\x80",
      "\xd9\x81",
      "\xd9\x82",
      "\xd9\x83",
      "\xd9\x84",
      "\xd9\x85",
      "\xd9\x86",
      "\xd9\x87",
      "\xd9\x88",
      "\xd9\x89",
      "\xd9\x8a",
      "\xd9\x8b",
      "\xd9\x8c",
      "\xd9\x8d",
      "\xd9\x8e",
      "\xd9\x8f",
      "\xd9\x90",
      "\xd9\x91",
      "\xd9\x92",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x00000080 => "\x80",
      0x00000081 => "\x81",
      0x00000082 => "\x82",
      0x00000083 => "\x83",
      0x00000084 => "\x84",
      0x00000085 => "\x85",
      0x00000086 => "\x86",
      0x00000087 => "\x87",
      0x00000088 => "\x88",
      0x00000089 => "\x89",
      0x0000008a => "\x8a",
      0x0000008b => "\x8b",
      0x0000008c => "\x8c",
      0x0000008d => "\x8d",
      0x0000008e => "\x8e",
      0x0000008f => "\x8f",
      0x00000090 => "\x90",
      0x00000091 => "\x91",
      0x00000092 => "\x92",
      0x00000093 => "\x93",
      0x00000094 => "\x94",
      0x00000095 => "\x95",
      0x00000096 => "\x96",
      0x00000097 => "\x97",
      0x00000098 => "\x98",
      0x00000099 => "\x99",
      0x0000009a => "\x9a",
      0x0000009b => "\x9b",
      0x0000009c => "\x9c",
      0x0000009d => "\x9d",
      0x0000009e => "\x9e",
      0x0000009f => "\x9f",
      0x000000a0 => "\xa0",
      0x000000a4 => "\xa4",
      0x000000ad => "\xad",
      0x0000060c => "\xac",
      0x0000061b => "\xbb",
      0x0000061f => "\xbf",
      0x00000621 => "\xc1",
      0x00000622 => "\xc2",
      0x00000623 => "\xc3",
      0x00000624 => "\xc4",
      0x00000625 => "\xc5",
      0x00000626 => "\xc6",
      0x00000627 => "\xc7",
      0x00000628 => "\xc8",
      0x00000629 => "\xc9",
      0x0000062a => "\xca",
      0x0000062b => "\xcb",
      0x0000062c => "\xcc",
      0x0000062d => "\xcd",
      0x0000062e => "\xce",
      0x0000062f => "\xcf",
      0x00000630 => "\xd0",
      0x00000631 => "\xd1",
      0x00000632 => "\xd2",
      0x00000633 => "\xd3",
      0x00000634 => "\xd4",
      0x00000635 => "\xd5",
      0x00000636 => "\xd6",
      0x00000637 => "\xd7",
      0x00000638 => "\xd8",
      0x00000639 => "\xd9",
      0x0000063a => "\xda",
      0x00000640 => "\xe0",
      0x00000641 => "\xe1",
      0x00000642 => "\xe2",
      0x00000643 => "\xe3",
      0x00000644 => "\xe4",
      0x00000645 => "\xe5",
      0x00000646 => "\xe6",
      0x00000647 => "\xe7",
      0x00000648 => "\xe8",
      0x00000649 => "\xe9",
      0x0000064a => "\xea",
      0x0000064b => "\xeb",
      0x0000064c => "\xec",
      0x0000064d => "\xed",
      0x0000064e => "\xee",
      0x0000064f => "\xef",
      0x00000650 => "\xf0",
      0x00000651 => "\xf1",
      0x00000652 => "\xf2",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::ISO_8859_6 - Conversion routines for ISO-8859-6
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for ISO-8859-6.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: ECMA registry
   alias ISO-IR-127
   alias ISO_8859-6:1987
   alias ISO_8859-6
   alias ECMA-114
   alias ASMO-708
   alias ARABIC
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE (DEL)
      80 |  00000080 | PADDING CHARACTER (PAD)
      81 |  00000081 | HIGH OCTET PRESET (HOP)
      82 |  00000082 | BREAK PERMITTED HERE (BPH)
      83 |  00000083 | NO BREAK HERE (NBH)
      84 |  00000084 | INDEX (IND)
      85 |  00000085 | NEXT LINE (NEL)
      86 |  00000086 | START OF SELECTED AREA (SSA)
      87 |  00000087 | END OF SELECTED AREA (ESA)
      88 |  00000088 | CHARACTER TABULATION SET (HTS)
      89 |  00000089 | CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
      8A |  0000008A | LINE TABULATION SET (VTS)
      8B |  0000008B | PARTIAL LINE FORWARD (PLD)
      8C |  0000008C | PARTIAL LINE BACKWARD (PLU)
      8D |  0000008D | REVERSE LINE FEED (RI)
      8E |  0000008E | SINGLE-SHIFT TWO (SS2)
      8F |  0000008F | SINGLE-SHIFT THREE (SS3)
      90 |  00000090 | DEVICE CONTROL STRING (DCS)
      91 |  00000091 | PRIVATE USE ONE (PU1)
      92 |  00000092 | PRIVATE USE TWO (PU2)
      93 |  00000093 | SET TRANSMIT STATE (STS)
      94 |  00000094 | CANCEL CHARACTER (CCH)
      95 |  00000095 | MESSAGE WAITING (MW)
      96 |  00000096 | START OF GUARDED AREA (SPA)
      97 |  00000097 | END OF GUARDED AREA (EPA)
      98 |  00000098 | START OF STRING (SOS)
      99 |  00000099 | SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
      9A |  0000009A | SINGLE CHARACTER INTRODUCER (SCI)
      9B |  0000009B | CONTROL SEQUENCE INTRODUCER (CSI)
      9C |  0000009C | STRING TERMINATOR (ST)
      9D |  0000009D | OPERATING SYSTEM COMMAND (OSC)
      9E |  0000009E | PRIVACY MESSAGE (PM)
      9F |  0000009F | APPLICATION PROGRAM COMMAND (APC)
      A0 |  000000A0 | NO-BREAK SPACE
      A4 |  000000A4 | CURRENCY SIGN
      AC |  0000060C | ARABIC COMMA
      AD |  000000AD | SOFT HYPHEN
      BB |  0000061B | ARABIC SEMICOLON
      BF |  0000061F | ARABIC QUESTION MARK
      C1 |  00000621 | ARABIC LETTER HAMZA
      C2 |  00000622 | ARABIC LETTER ALEF WITH MADDA ABOVE
      C3 |  00000623 | ARABIC LETTER ALEF WITH HAMZA ABOVE
      C4 |  00000624 | ARABIC LETTER WAW WITH HAMZA ABOVE
      C5 |  00000625 | ARABIC LETTER ALEF WITH HAMZA BELOW
      C6 |  00000626 | ARABIC LETTER YEH WITH HAMZA ABOVE
      C7 |  00000627 | ARABIC LETTER ALEF
      C8 |  00000628 | ARABIC LETTER BEH
      C9 |  00000629 | ARABIC LETTER TEH MARBUTA
      CA |  0000062A | ARABIC LETTER TEH
      CB |  0000062B | ARABIC LETTER THEH
      CC |  0000062C | ARABIC LETTER JEEM
      CD |  0000062D | ARABIC LETTER HAH
      CE |  0000062E | ARABIC LETTER KHAH
      CF |  0000062F | ARABIC LETTER DAL
      D0 |  00000630 | ARABIC LETTER THAL
      D1 |  00000631 | ARABIC LETTER REH
      D2 |  00000632 | ARABIC LETTER ZAIN
      D3 |  00000633 | ARABIC LETTER SEEN
      D4 |  00000634 | ARABIC LETTER SHEEN
      D5 |  00000635 | ARABIC LETTER SAD
      D6 |  00000636 | ARABIC LETTER DAD
      D7 |  00000637 | ARABIC LETTER TAH
      D8 |  00000638 | ARABIC LETTER ZAH
      D9 |  00000639 | ARABIC LETTER AIN
      DA |  0000063A | ARABIC LETTER GHAIN
      E0 |  00000640 | ARABIC TATWEEL
      E1 |  00000641 | ARABIC LETTER FEH
      E2 |  00000642 | ARABIC LETTER QAF
      E3 |  00000643 | ARABIC LETTER KAF
      E4 |  00000644 | ARABIC LETTER LAM
      E5 |  00000645 | ARABIC LETTER MEEM
      E6 |  00000646 | ARABIC LETTER NOON
      E7 |  00000647 | ARABIC LETTER HEH
      E8 |  00000648 | ARABIC LETTER WAW
      E9 |  00000649 | ARABIC LETTER ALEF MAKSURA
      EA |  0000064A | ARABIC LETTER YEH
      EB |  0000064B | ARABIC FATHATAN
      EC |  0000064C | ARABIC DAMMATAN
      ED |  0000064D | ARABIC KASRATAN
      EE |  0000064E | ARABIC FATHA
      EF |  0000064F | ARABIC DAMMA
      F0 |  00000650 | ARABIC KASRA
      F1 |  00000651 | ARABIC SHADDA
      F2 |  00000652 | ARABIC SUKUN
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_ISO_8859_6

    $main::fatpacked{"Locale/RecodeData/ISO_8859_7.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_ISO_8859_7';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for ISO-8859-7.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::ISO_8859_7;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0x0080,
      0x0081,
      0x0082,
      0x0083,
      0x0084,
      0x0085,
      0x0086,
      0x0087,
      0x0088,
      0x0089,
      0x008a,
      0x008b,
      0x008c,
      0x008d,
      0x008e,
      0x008f,
      0x0090,
      0x0091,
      0x0092,
      0x0093,
      0x0094,
      0x0095,
      0x0096,
      0x0097,
      0x0098,
      0x0099,
      0x009a,
      0x009b,
      0x009c,
      0x009d,
      0x009e,
      0x009f,
      0x00a0,
      0x2018,
      0x2019,
      0x00a3,
      0xfffd,
      0xfffd,
      0x00a6,
      0x00a7,
      0x00a8,
      0x00a9,
      0xfffd,
      0x00ab,
      0x00ac,
      0x00ad,
      0xfffd,
      0x2015,
      0x00b0,
      0x00b1,
      0x00b2,
      0x00b3,
      0x0384,
      0x0385,
      0x0386,
      0x00b7,
      0x0388,
      0x0389,
      0x038a,
      0x00bb,
      0x038c,
      0x00bd,
      0x038e,
      0x038f,
      0x0390,
      0x0391,
      0x0392,
      0x0393,
      0x0394,
      0x0395,
      0x0396,
      0x0397,
      0x0398,
      0x0399,
      0x039a,
      0x039b,
      0x039c,
      0x039d,
      0x039e,
      0x039f,
      0x03a0,
      0x03a1,
      0xfffd,
      0x03a3,
      0x03a4,
      0x03a5,
      0x03a6,
      0x03a7,
      0x03a8,
      0x03a9,
      0x03aa,
      0x03ab,
      0x03ac,
      0x03ad,
      0x03ae,
      0x03af,
      0x03b0,
      0x03b1,
      0x03b2,
      0x03b3,
      0x03b4,
      0x03b5,
      0x03b6,
      0x03b7,
      0x03b8,
      0x03b9,
      0x03ba,
      0x03bb,
      0x03bc,
      0x03bd,
      0x03be,
      0x03bf,
      0x03c0,
      0x03c1,
      0x03c2,
      0x03c3,
      0x03c4,
      0x03c5,
      0x03c6,
      0x03c7,
      0x03c8,
      0x03c9,
      0x03ca,
      0x03cb,
      0x03cc,
      0x03cd,
      0x03ce,
      0xfffd,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xc2\x80",
      "\xc2\x81",
      "\xc2\x82",
      "\xc2\x83",
      "\xc2\x84",
      "\xc2\x85",
      "\xc2\x86",
      "\xc2\x87",
      "\xc2\x88",
      "\xc2\x89",
      "\xc2\x8a",
      "\xc2\x8b",
      "\xc2\x8c",
      "\xc2\x8d",
      "\xc2\x8e",
      "\xc2\x8f",
      "\xc2\x90",
      "\xc2\x91",
      "\xc2\x92",
      "\xc2\x93",
      "\xc2\x94",
      "\xc2\x95",
      "\xc2\x96",
      "\xc2\x97",
      "\xc2\x98",
      "\xc2\x99",
      "\xc2\x9a",
      "\xc2\x9b",
      "\xc2\x9c",
      "\xc2\x9d",
      "\xc2\x9e",
      "\xc2\x9f",
      "\xc2\xa0",
      "\xe2\x80\x98",
      "\xe2\x80\x99",
      "\xc2\xa3",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc2\xa6",
      "\xc2\xa7",
      "\xc2\xa8",
      "\xc2\xa9",
      "\xef\xbf\xbd",
      "\xc2\xab",
      "\xc2\xac",
      "\xc2\xad",
      "\xef\xbf\xbd",
      "\xe2\x80\x95",
      "\xc2\xb0",
      "\xc2\xb1",
      "\xc2\xb2",
      "\xc2\xb3",
      "\xce\x84",
      "\xce\x85",
      "\xce\x86",
      "\xc2\xb7",
      "\xce\x88",
      "\xce\x89",
      "\xce\x8a",
      "\xc2\xbb",
      "\xce\x8c",
      "\xc2\xbd",
      "\xce\x8e",
      "\xce\x8f",
      "\xce\x90",
      "\xce\x91",
      "\xce\x92",
      "\xce\x93",
      "\xce\x94",
      "\xce\x95",
      "\xce\x96",
      "\xce\x97",
      "\xce\x98",
      "\xce\x99",
      "\xce\x9a",
      "\xce\x9b",
      "\xce\x9c",
      "\xce\x9d",
      "\xce\x9e",
      "\xce\x9f",
      "\xce\xa0",
      "\xce\xa1",
      "\xef\xbf\xbd",
      "\xce\xa3",
      "\xce\xa4",
      "\xce\xa5",
      "\xce\xa6",
      "\xce\xa7",
      "\xce\xa8",
      "\xce\xa9",
      "\xce\xaa",
      "\xce\xab",
      "\xce\xac",
      "\xce\xad",
      "\xce\xae",
      "\xce\xaf",
      "\xce\xb0",
      "\xce\xb1",
      "\xce\xb2",
      "\xce\xb3",
      "\xce\xb4",
      "\xce\xb5",
      "\xce\xb6",
      "\xce\xb7",
      "\xce\xb8",
      "\xce\xb9",
      "\xce\xba",
      "\xce\xbb",
      "\xce\xbc",
      "\xce\xbd",
      "\xce\xbe",
      "\xce\xbf",
      "\xcf\x80",
      "\xcf\x81",
      "\xcf\x82",
      "\xcf\x83",
      "\xcf\x84",
      "\xcf\x85",
      "\xcf\x86",
      "\xcf\x87",
      "\xcf\x88",
      "\xcf\x89",
      "\xcf\x8a",
      "\xcf\x8b",
      "\xcf\x8c",
      "\xcf\x8d",
      "\xcf\x8e",
      "\xef\xbf\xbd",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x00000080 => "\x80",
      0x00000081 => "\x81",
      0x00000082 => "\x82",
      0x00000083 => "\x83",
      0x00000084 => "\x84",
      0x00000085 => "\x85",
      0x00000086 => "\x86",
      0x00000087 => "\x87",
      0x00000088 => "\x88",
      0x00000089 => "\x89",
      0x0000008a => "\x8a",
      0x0000008b => "\x8b",
      0x0000008c => "\x8c",
      0x0000008d => "\x8d",
      0x0000008e => "\x8e",
      0x0000008f => "\x8f",
      0x00000090 => "\x90",
      0x00000091 => "\x91",
      0x00000092 => "\x92",
      0x00000093 => "\x93",
      0x00000094 => "\x94",
      0x00000095 => "\x95",
      0x00000096 => "\x96",
      0x00000097 => "\x97",
      0x00000098 => "\x98",
      0x00000099 => "\x99",
      0x0000009a => "\x9a",
      0x0000009b => "\x9b",
      0x0000009c => "\x9c",
      0x0000009d => "\x9d",
      0x0000009e => "\x9e",
      0x0000009f => "\x9f",
      0x000000a0 => "\xa0",
      0x000000a3 => "\xa3",
      0x000000a6 => "\xa6",
      0x000000a7 => "\xa7",
      0x000000a8 => "\xa8",
      0x000000a9 => "\xa9",
      0x000000ab => "\xab",
      0x000000ac => "\xac",
      0x000000ad => "\xad",
      0x000000b0 => "\xb0",
      0x000000b1 => "\xb1",
      0x000000b2 => "\xb2",
      0x000000b3 => "\xb3",
      0x000000b7 => "\xb7",
      0x000000bb => "\xbb",
      0x000000bd => "\xbd",
      0x00000384 => "\xb4",
      0x00000385 => "\xb5",
      0x00000386 => "\xb6",
      0x00000388 => "\xb8",
      0x00000389 => "\xb9",
      0x0000038a => "\xba",
      0x0000038c => "\xbc",
      0x0000038e => "\xbe",
      0x0000038f => "\xbf",
      0x00000390 => "\xc0",
      0x00000391 => "\xc1",
      0x00000392 => "\xc2",
      0x00000393 => "\xc3",
      0x00000394 => "\xc4",
      0x00000395 => "\xc5",
      0x00000396 => "\xc6",
      0x00000397 => "\xc7",
      0x00000398 => "\xc8",
      0x00000399 => "\xc9",
      0x0000039a => "\xca",
      0x0000039b => "\xcb",
      0x0000039c => "\xcc",
      0x0000039d => "\xcd",
      0x0000039e => "\xce",
      0x0000039f => "\xcf",
      0x000003a0 => "\xd0",
      0x000003a1 => "\xd1",
      0x000003a3 => "\xd3",
      0x000003a4 => "\xd4",
      0x000003a5 => "\xd5",
      0x000003a6 => "\xd6",
      0x000003a7 => "\xd7",
      0x000003a8 => "\xd8",
      0x000003a9 => "\xd9",
      0x000003aa => "\xda",
      0x000003ab => "\xdb",
      0x000003ac => "\xdc",
      0x000003ad => "\xdd",
      0x000003ae => "\xde",
      0x000003af => "\xdf",
      0x000003b0 => "\xe0",
      0x000003b1 => "\xe1",
      0x000003b2 => "\xe2",
      0x000003b3 => "\xe3",
      0x000003b4 => "\xe4",
      0x000003b5 => "\xe5",
      0x000003b6 => "\xe6",
      0x000003b7 => "\xe7",
      0x000003b8 => "\xe8",
      0x000003b9 => "\xe9",
      0x000003ba => "\xea",
      0x000003bb => "\xeb",
      0x000003bc => "\xec",
      0x000003bd => "\xed",
      0x000003be => "\xee",
      0x000003bf => "\xef",
      0x000003c0 => "\xf0",
      0x000003c1 => "\xf1",
      0x000003c2 => "\xf2",
      0x000003c3 => "\xf3",
      0x000003c4 => "\xf4",
      0x000003c5 => "\xf5",
      0x000003c6 => "\xf6",
      0x000003c7 => "\xf7",
      0x000003c8 => "\xf8",
      0x000003c9 => "\xf9",
      0x000003ca => "\xfa",
      0x000003cb => "\xfb",
      0x000003cc => "\xfc",
      0x000003cd => "\xfd",
      0x000003ce => "\xfe",
      0x00002015 => "\xaf",
      0x00002018 => "\xa1",
      0x00002019 => "\xa2",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::ISO_8859_7 - Conversion routines for ISO-8859-7
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for ISO-8859-7.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: ECMA registry
   alias ISO-IR-126
   alias ISO_8859-7:1987
   alias ISO_8859-7
   alias ELOT_928
   alias ECMA-118
   alias GREEK
   alias GREEK8
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE (DEL)
      80 |  00000080 | PADDING CHARACTER (PAD)
      81 |  00000081 | HIGH OCTET PRESET (HOP)
      82 |  00000082 | BREAK PERMITTED HERE (BPH)
      83 |  00000083 | NO BREAK HERE (NBH)
      84 |  00000084 | INDEX (IND)
      85 |  00000085 | NEXT LINE (NEL)
      86 |  00000086 | START OF SELECTED AREA (SSA)
      87 |  00000087 | END OF SELECTED AREA (ESA)
      88 |  00000088 | CHARACTER TABULATION SET (HTS)
      89 |  00000089 | CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
      8A |  0000008A | LINE TABULATION SET (VTS)
      8B |  0000008B | PARTIAL LINE FORWARD (PLD)
      8C |  0000008C | PARTIAL LINE BACKWARD (PLU)
      8D |  0000008D | REVERSE LINE FEED (RI)
      8E |  0000008E | SINGLE-SHIFT TWO (SS2)
      8F |  0000008F | SINGLE-SHIFT THREE (SS3)
      90 |  00000090 | DEVICE CONTROL STRING (DCS)
      91 |  00000091 | PRIVATE USE ONE (PU1)
      92 |  00000092 | PRIVATE USE TWO (PU2)
      93 |  00000093 | SET TRANSMIT STATE (STS)
      94 |  00000094 | CANCEL CHARACTER (CCH)
      95 |  00000095 | MESSAGE WAITING (MW)
      96 |  00000096 | START OF GUARDED AREA (SPA)
      97 |  00000097 | END OF GUARDED AREA (EPA)
      98 |  00000098 | START OF STRING (SOS)
      99 |  00000099 | SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
      9A |  0000009A | SINGLE CHARACTER INTRODUCER (SCI)
      9B |  0000009B | CONTROL SEQUENCE INTRODUCER (CSI)
      9C |  0000009C | STRING TERMINATOR (ST)
      9D |  0000009D | OPERATING SYSTEM COMMAND (OSC)
      9E |  0000009E | PRIVACY MESSAGE (PM)
      9F |  0000009F | APPLICATION PROGRAM COMMAND (APC)
      A0 |  000000A0 | NO-BREAK SPACE
      A1 |  00002018 | LEFT SINGLE QUOTATION MARK
      A2 |  00002019 | RIGHT SINGLE QUOTATION MARK
      A3 |  000000A3 | POUND SIGN
      A6 |  000000A6 | BROKEN BAR
      A7 |  000000A7 | SECTION SIGN
      A8 |  000000A8 | DIAERESIS
      A9 |  000000A9 | COPYRIGHT SIGN
      AB |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
      AC |  000000AC | NOT SIGN
      AD |  000000AD | SOFT HYPHEN
      AF |  00002015 | HORIZONTAL BAR
      B0 |  000000B0 | DEGREE SIGN
      B1 |  000000B1 | PLUS-MINUS SIGN
      B2 |  000000B2 | SUPERSCRIPT TWO
      B3 |  000000B3 | SUPERSCRIPT THREE
      B4 |  00000384 | GREEK TONOS
      B5 |  00000385 | GREEK DIALYTIKA TONOS
      B6 |  00000386 | GREEK CAPITAL LETTER ALPHA WITH TONOS
      B7 |  000000B7 | MIDDLE DOT
      B8 |  00000388 | GREEK CAPITAL LETTER EPSILON WITH TONOS
      B9 |  00000389 | GREEK CAPITAL LETTER ETA WITH TONOS
      BA |  0000038A | GREEK CAPITAL LETTER IOTA WITH TONOS
      BB |  000000BB | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
      BC |  0000038C | GREEK CAPITAL LETTER OMICRON WITH TONOS
      BD |  000000BD | VULGAR FRACTION ONE HALF
      BE |  0000038E | GREEK CAPITAL LETTER UPSILON WITH TONOS
      BF |  0000038F | GREEK CAPITAL LETTER OMEGA WITH TONOS
      C0 |  00000390 | GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
      C1 |  00000391 | GREEK CAPITAL LETTER ALPHA
      C2 |  00000392 | GREEK CAPITAL LETTER BETA
      C3 |  00000393 | GREEK CAPITAL LETTER GAMMA
      C4 |  00000394 | GREEK CAPITAL LETTER DELTA
      C5 |  00000395 | GREEK CAPITAL LETTER EPSILON
      C6 |  00000396 | GREEK CAPITAL LETTER ZETA
      C7 |  00000397 | GREEK CAPITAL LETTER ETA
      C8 |  00000398 | GREEK CAPITAL LETTER THETA
      C9 |  00000399 | GREEK CAPITAL LETTER IOTA
      CA |  0000039A | GREEK CAPITAL LETTER KAPPA
      CB |  0000039B | GREEK CAPITAL LETTER LAMDA
      CC |  0000039C | GREEK CAPITAL LETTER MU
      CD |  0000039D | GREEK CAPITAL LETTER NU
      CE |  0000039E | GREEK CAPITAL LETTER XI
      CF |  0000039F | GREEK CAPITAL LETTER OMICRON
      D0 |  000003A0 | GREEK CAPITAL LETTER PI
      D1 |  000003A1 | GREEK CAPITAL LETTER RHO
      D3 |  000003A3 | GREEK CAPITAL LETTER SIGMA
      D4 |  000003A4 | GREEK CAPITAL LETTER TAU
      D5 |  000003A5 | GREEK CAPITAL LETTER UPSILON
      D6 |  000003A6 | GREEK CAPITAL LETTER PHI
      D7 |  000003A7 | GREEK CAPITAL LETTER CHI
      D8 |  000003A8 | GREEK CAPITAL LETTER PSI
      D9 |  000003A9 | GREEK CAPITAL LETTER OMEGA
      DA |  000003AA | GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
      DB |  000003AB | GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
      DC |  000003AC | GREEK SMALL LETTER ALPHA WITH TONOS
      DD |  000003AD | GREEK SMALL LETTER EPSILON WITH TONOS
      DE |  000003AE | GREEK SMALL LETTER ETA WITH TONOS
      DF |  000003AF | GREEK SMALL LETTER IOTA WITH TONOS
      E0 |  000003B0 | GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
      E1 |  000003B1 | GREEK SMALL LETTER ALPHA
      E2 |  000003B2 | GREEK SMALL LETTER BETA
      E3 |  000003B3 | GREEK SMALL LETTER GAMMA
      E4 |  000003B4 | GREEK SMALL LETTER DELTA
      E5 |  000003B5 | GREEK SMALL LETTER EPSILON
      E6 |  000003B6 | GREEK SMALL LETTER ZETA
      E7 |  000003B7 | GREEK SMALL LETTER ETA
      E8 |  000003B8 | GREEK SMALL LETTER THETA
      E9 |  000003B9 | GREEK SMALL LETTER IOTA
      EA |  000003BA | GREEK SMALL LETTER KAPPA
      EB |  000003BB | GREEK SMALL LETTER LAMDA
      EC |  000003BC | GREEK SMALL LETTER MU
      ED |  000003BD | GREEK SMALL LETTER NU
      EE |  000003BE | GREEK SMALL LETTER XI
      EF |  000003BF | GREEK SMALL LETTER OMICRON
      F0 |  000003C0 | GREEK SMALL LETTER PI
      F1 |  000003C1 | GREEK SMALL LETTER RHO
      F2 |  000003C2 | GREEK SMALL LETTER FINAL SIGMA
      F3 |  000003C3 | GREEK SMALL LETTER SIGMA
      F4 |  000003C4 | GREEK SMALL LETTER TAU
      F5 |  000003C5 | GREEK SMALL LETTER UPSILON
      F6 |  000003C6 | GREEK SMALL LETTER PHI
      F7 |  000003C7 | GREEK SMALL LETTER CHI
      F8 |  000003C8 | GREEK SMALL LETTER PSI
      F9 |  000003C9 | GREEK SMALL LETTER OMEGA
      FA |  000003CA | GREEK SMALL LETTER IOTA WITH DIALYTIKA
      FB |  000003CB | GREEK SMALL LETTER UPSILON WITH DIALYTIKA
      FC |  000003CC | GREEK SMALL LETTER OMICRON WITH TONOS
      FD |  000003CD | GREEK SMALL LETTER UPSILON WITH TONOS
      FE |  000003CE | GREEK SMALL LETTER OMEGA WITH TONOS
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_ISO_8859_7

    $main::fatpacked{"Locale/RecodeData/ISO_8859_8.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_ISO_8859_8';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for ISO-8859-8.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::ISO_8859_8;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0x0080,
      0x0081,
      0x0082,
      0x0083,
      0x0084,
      0x0085,
      0x0086,
      0x0087,
      0x0088,
      0x0089,
      0x008a,
      0x008b,
      0x008c,
      0x008d,
      0x008e,
      0x008f,
      0x0090,
      0x0091,
      0x0092,
      0x0093,
      0x0094,
      0x0095,
      0x0096,
      0x0097,
      0x0098,
      0x0099,
      0x009a,
      0x009b,
      0x009c,
      0x009d,
      0x009e,
      0x009f,
      0x00a0,
      0xfffd,
      0x00a2,
      0x00a3,
      0x00a4,
      0x00a5,
      0x00a6,
      0x00a7,
      0x00a8,
      0x00a9,
      0x00d7,
      0x00ab,
      0x00ac,
      0x00ad,
      0x00ae,
      0x00af,
      0x00b0,
      0x00b1,
      0x00b2,
      0x00b3,
      0x00b4,
      0x00b5,
      0x00b6,
      0x00b7,
      0x00b8,
      0x00b9,
      0x00f7,
      0x00bb,
      0x00bc,
      0x00bd,
      0x00be,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x2017,
      0x05d0,
      0x05d1,
      0x05d2,
      0x05d3,
      0x05d4,
      0x05d5,
      0x05d6,
      0x05d7,
      0x05d8,
      0x05d9,
      0x05da,
      0x05db,
      0x05dc,
      0x05dd,
      0x05de,
      0x05df,
      0x05e0,
      0x05e1,
      0x05e2,
      0x05e3,
      0x05e4,
      0x05e5,
      0x05e6,
      0x05e7,
      0x05e8,
      0x05e9,
      0x05ea,
      0xfffd,
      0xfffd,
      0x200e,
      0x200f,
      0xfffd,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xc2\x80",
      "\xc2\x81",
      "\xc2\x82",
      "\xc2\x83",
      "\xc2\x84",
      "\xc2\x85",
      "\xc2\x86",
      "\xc2\x87",
      "\xc2\x88",
      "\xc2\x89",
      "\xc2\x8a",
      "\xc2\x8b",
      "\xc2\x8c",
      "\xc2\x8d",
      "\xc2\x8e",
      "\xc2\x8f",
      "\xc2\x90",
      "\xc2\x91",
      "\xc2\x92",
      "\xc2\x93",
      "\xc2\x94",
      "\xc2\x95",
      "\xc2\x96",
      "\xc2\x97",
      "\xc2\x98",
      "\xc2\x99",
      "\xc2\x9a",
      "\xc2\x9b",
      "\xc2\x9c",
      "\xc2\x9d",
      "\xc2\x9e",
      "\xc2\x9f",
      "\xc2\xa0",
      "\xef\xbf\xbd",
      "\xc2\xa2",
      "\xc2\xa3",
      "\xc2\xa4",
      "\xc2\xa5",
      "\xc2\xa6",
      "\xc2\xa7",
      "\xc2\xa8",
      "\xc2\xa9",
      "\xc3\x97",
      "\xc2\xab",
      "\xc2\xac",
      "\xc2\xad",
      "\xc2\xae",
      "\xc2\xaf",
      "\xc2\xb0",
      "\xc2\xb1",
      "\xc2\xb2",
      "\xc2\xb3",
      "\xc2\xb4",
      "\xc2\xb5",
      "\xc2\xb6",
      "\xc2\xb7",
      "\xc2\xb8",
      "\xc2\xb9",
      "\xc3\xb7",
      "\xc2\xbb",
      "\xc2\xbc",
      "\xc2\xbd",
      "\xc2\xbe",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xe2\x80\x97",
      "\xd7\x90",
      "\xd7\x91",
      "\xd7\x92",
      "\xd7\x93",
      "\xd7\x94",
      "\xd7\x95",
      "\xd7\x96",
      "\xd7\x97",
      "\xd7\x98",
      "\xd7\x99",
      "\xd7\x9a",
      "\xd7\x9b",
      "\xd7\x9c",
      "\xd7\x9d",
      "\xd7\x9e",
      "\xd7\x9f",
      "\xd7\xa0",
      "\xd7\xa1",
      "\xd7\xa2",
      "\xd7\xa3",
      "\xd7\xa4",
      "\xd7\xa5",
      "\xd7\xa6",
      "\xd7\xa7",
      "\xd7\xa8",
      "\xd7\xa9",
      "\xd7\xaa",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xe2\x80\x8e",
      "\xe2\x80\x8f",
      "\xef\xbf\xbd",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x00000080 => "\x80",
      0x00000081 => "\x81",
      0x00000082 => "\x82",
      0x00000083 => "\x83",
      0x00000084 => "\x84",
      0x00000085 => "\x85",
      0x00000086 => "\x86",
      0x00000087 => "\x87",
      0x00000088 => "\x88",
      0x00000089 => "\x89",
      0x0000008a => "\x8a",
      0x0000008b => "\x8b",
      0x0000008c => "\x8c",
      0x0000008d => "\x8d",
      0x0000008e => "\x8e",
      0x0000008f => "\x8f",
      0x00000090 => "\x90",
      0x00000091 => "\x91",
      0x00000092 => "\x92",
      0x00000093 => "\x93",
      0x00000094 => "\x94",
      0x00000095 => "\x95",
      0x00000096 => "\x96",
      0x00000097 => "\x97",
      0x00000098 => "\x98",
      0x00000099 => "\x99",
      0x0000009a => "\x9a",
      0x0000009b => "\x9b",
      0x0000009c => "\x9c",
      0x0000009d => "\x9d",
      0x0000009e => "\x9e",
      0x0000009f => "\x9f",
      0x000000a0 => "\xa0",
      0x000000a2 => "\xa2",
      0x000000a3 => "\xa3",
      0x000000a4 => "\xa4",
      0x000000a5 => "\xa5",
      0x000000a6 => "\xa6",
      0x000000a7 => "\xa7",
      0x000000a8 => "\xa8",
      0x000000a9 => "\xa9",
      0x000000ab => "\xab",
      0x000000ac => "\xac",
      0x000000ad => "\xad",
      0x000000ae => "\xae",
      0x000000af => "\xaf",
      0x000000b0 => "\xb0",
      0x000000b1 => "\xb1",
      0x000000b2 => "\xb2",
      0x000000b3 => "\xb3",
      0x000000b4 => "\xb4",
      0x000000b5 => "\xb5",
      0x000000b6 => "\xb6",
      0x000000b7 => "\xb7",
      0x000000b8 => "\xb8",
      0x000000b9 => "\xb9",
      0x000000bb => "\xbb",
      0x000000bc => "\xbc",
      0x000000bd => "\xbd",
      0x000000be => "\xbe",
      0x000000d7 => "\xaa",
      0x000000f7 => "\xba",
      0x000005d0 => "\xe0",
      0x000005d1 => "\xe1",
      0x000005d2 => "\xe2",
      0x000005d3 => "\xe3",
      0x000005d4 => "\xe4",
      0x000005d5 => "\xe5",
      0x000005d6 => "\xe6",
      0x000005d7 => "\xe7",
      0x000005d8 => "\xe8",
      0x000005d9 => "\xe9",
      0x000005da => "\xea",
      0x000005db => "\xeb",
      0x000005dc => "\xec",
      0x000005dd => "\xed",
      0x000005de => "\xee",
      0x000005df => "\xef",
      0x000005e0 => "\xf0",
      0x000005e1 => "\xf1",
      0x000005e2 => "\xf2",
      0x000005e3 => "\xf3",
      0x000005e4 => "\xf4",
      0x000005e5 => "\xf5",
      0x000005e6 => "\xf6",
      0x000005e7 => "\xf7",
      0x000005e8 => "\xf8",
      0x000005e9 => "\xf9",
      0x000005ea => "\xfa",
      0x0000200e => "\xfd",
      0x0000200f => "\xfe",
      0x00002017 => "\xdf",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::ISO_8859_8 - Conversion routines for ISO-8859-8
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for ISO-8859-8.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: ECMA registry
   alias ISO-IR-138
   alias ISO_8859-8:1988
   alias ISO_8859-8
   alias HEBREW
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE (DEL)
      80 |  00000080 | PADDING CHARACTER (PAD)
      81 |  00000081 | HIGH OCTET PRESET (HOP)
      82 |  00000082 | BREAK PERMITTED HERE (BPH)
      83 |  00000083 | NO BREAK HERE (NBH)
      84 |  00000084 | INDEX (IND)
      85 |  00000085 | NEXT LINE (NEL)
      86 |  00000086 | START OF SELECTED AREA (SSA)
      87 |  00000087 | END OF SELECTED AREA (ESA)
      88 |  00000088 | CHARACTER TABULATION SET (HTS)
      89 |  00000089 | CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
      8A |  0000008A | LINE TABULATION SET (VTS)
      8B |  0000008B | PARTIAL LINE FORWARD (PLD)
      8C |  0000008C | PARTIAL LINE BACKWARD (PLU)
      8D |  0000008D | REVERSE LINE FEED (RI)
      8E |  0000008E | SINGLE-SHIFT TWO (SS2)
      8F |  0000008F | SINGLE-SHIFT THREE (SS3)
      90 |  00000090 | DEVICE CONTROL STRING (DCS)
      91 |  00000091 | PRIVATE USE ONE (PU1)
      92 |  00000092 | PRIVATE USE TWO (PU2)
      93 |  00000093 | SET TRANSMIT STATE (STS)
      94 |  00000094 | CANCEL CHARACTER (CCH)
      95 |  00000095 | MESSAGE WAITING (MW)
      96 |  00000096 | START OF GUARDED AREA (SPA)
      97 |  00000097 | END OF GUARDED AREA (EPA)
      98 |  00000098 | START OF STRING (SOS)
      99 |  00000099 | SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
      9A |  0000009A | SINGLE CHARACTER INTRODUCER (SCI)
      9B |  0000009B | CONTROL SEQUENCE INTRODUCER (CSI)
      9C |  0000009C | STRING TERMINATOR (ST)
      9D |  0000009D | OPERATING SYSTEM COMMAND (OSC)
      9E |  0000009E | PRIVACY MESSAGE (PM)
      9F |  0000009F | APPLICATION PROGRAM COMMAND (APC)
      A0 |  000000A0 | NO-BREAK SPACE
      A2 |  000000A2 | CENT SIGN
      A3 |  000000A3 | POUND SIGN
      A4 |  000000A4 | CURRENCY SIGN
      A5 |  000000A5 | YEN SIGN
      A6 |  000000A6 | BROKEN BAR
      A7 |  000000A7 | SECTION SIGN
      A8 |  000000A8 | DIAERESIS
      A9 |  000000A9 | COPYRIGHT SIGN
      AA |  000000D7 | MULTIPLICATION SIGN
      AB |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
      AC |  000000AC | NOT SIGN
      AD |  000000AD | SOFT HYPHEN
      AE |  000000AE | REGISTERED SIGN
      AF |  000000AF | MACRON
      B0 |  000000B0 | DEGREE SIGN
      B1 |  000000B1 | PLUS-MINUS SIGN
      B2 |  000000B2 | SUPERSCRIPT TWO
      B3 |  000000B3 | SUPERSCRIPT THREE
      B4 |  000000B4 | ACUTE ACCENT
      B5 |  000000B5 | MICRO SIGN
      B6 |  000000B6 | PILCROW SIGN
      B7 |  000000B7 | MIDDLE DOT
      B8 |  000000B8 | CEDILLA
      B9 |  000000B9 | SUPERSCRIPT ONE
      BA |  000000F7 | DIVISION SIGN
      BB |  000000BB | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
      BC |  000000BC | VULGAR FRACTION ONE QUARTER
      BD |  000000BD | VULGAR FRACTION ONE HALF
      BE |  000000BE | VULGAR FRACTION THREE QUARTERS
      DF |  00002017 | DOUBLE LOW LINE
      E0 |  000005D0 | HEBREW LETTER ALEF
      E1 |  000005D1 | HEBREW LETTER BET
      E2 |  000005D2 | HEBREW LETTER GIMEL
      E3 |  000005D3 | HEBREW LETTER DALET
      E4 |  000005D4 | HEBREW LETTER HE
      E5 |  000005D5 | HEBREW LETTER VAV
      E6 |  000005D6 | HEBREW LETTER ZAYIN
      E7 |  000005D7 | HEBREW LETTER HET
      E8 |  000005D8 | HEBREW LETTER TET
      E9 |  000005D9 | HEBREW LETTER YOD
      EA |  000005DA | HEBREW LETTER FINAL KAF
      EB |  000005DB | HEBREW LETTER KAF
      EC |  000005DC | HEBREW LETTER LAMED
      ED |  000005DD | HEBREW LETTER FINAL MEM
      EE |  000005DE | HEBREW LETTER MEM
      EF |  000005DF | HEBREW LETTER FINAL NUN
      F0 |  000005E0 | HEBREW LETTER NUN
      F1 |  000005E1 | HEBREW LETTER SAMEKH
      F2 |  000005E2 | HEBREW LETTER AYIN
      F3 |  000005E3 | HEBREW LETTER FINAL PE
      F4 |  000005E4 | HEBREW LETTER PE
      F5 |  000005E5 | HEBREW LETTER FINAL TSADI
      F6 |  000005E6 | HEBREW LETTER TSADI
      F7 |  000005E7 | HEBREW LETTER QOF
      F8 |  000005E8 | HEBREW LETTER RESH
      F9 |  000005E9 | HEBREW LETTER SHIN
      FA |  000005EA | HEBREW LETTER TAV
      FD |  0000200E | LEFT-TO-RIGHT MARK
      FE |  0000200F | RIGHT-TO-LEFT MARK
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_ISO_8859_8

    $main::fatpacked{"Locale/RecodeData/ISO_8859_9.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_ISO_8859_9';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for ISO-8859-9.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::ISO_8859_9;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0x0080,
      0x0081,
      0x0082,
      0x0083,
      0x0084,
      0x0085,
      0x0086,
      0x0087,
      0x0088,
      0x0089,
      0x008a,
      0x008b,
      0x008c,
      0x008d,
      0x008e,
      0x008f,
      0x0090,
      0x0091,
      0x0092,
      0x0093,
      0x0094,
      0x0095,
      0x0096,
      0x0097,
      0x0098,
      0x0099,
      0x009a,
      0x009b,
      0x009c,
      0x009d,
      0x009e,
      0x009f,
      0x00a0,
      0x00a1,
      0x00a2,
      0x00a3,
      0x00a4,
      0x00a5,
      0x00a6,
      0x00a7,
      0x00a8,
      0x00a9,
      0x00aa,
      0x00ab,
      0x00ac,
      0x00ad,
      0x00ae,
      0x00af,
      0x00b0,
      0x00b1,
      0x00b2,
      0x00b3,
      0x00b4,
      0x00b5,
      0x00b6,
      0x00b7,
      0x00b8,
      0x00b9,
      0x00ba,
      0x00bb,
      0x00bc,
      0x00bd,
      0x00be,
      0x00bf,
      0x00c0,
      0x00c1,
      0x00c2,
      0x00c3,
      0x00c4,
      0x00c5,
      0x00c6,
      0x00c7,
      0x00c8,
      0x00c9,
      0x00ca,
      0x00cb,
      0x00cc,
      0x00cd,
      0x00ce,
      0x00cf,
      0x011e,
      0x00d1,
      0x00d2,
      0x00d3,
      0x00d4,
      0x00d5,
      0x00d6,
      0x00d7,
      0x00d8,
      0x00d9,
      0x00da,
      0x00db,
      0x00dc,
      0x0130,
      0x015e,
      0x00df,
      0x00e0,
      0x00e1,
      0x00e2,
      0x00e3,
      0x00e4,
      0x00e5,
      0x00e6,
      0x00e7,
      0x00e8,
      0x00e9,
      0x00ea,
      0x00eb,
      0x00ec,
      0x00ed,
      0x00ee,
      0x00ef,
      0x011f,
      0x00f1,
      0x00f2,
      0x00f3,
      0x00f4,
      0x00f5,
      0x00f6,
      0x00f7,
      0x00f8,
      0x00f9,
      0x00fa,
      0x00fb,
      0x00fc,
      0x0131,
      0x015f,
      0x00ff,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xc2\x80",
      "\xc2\x81",
      "\xc2\x82",
      "\xc2\x83",
      "\xc2\x84",
      "\xc2\x85",
      "\xc2\x86",
      "\xc2\x87",
      "\xc2\x88",
      "\xc2\x89",
      "\xc2\x8a",
      "\xc2\x8b",
      "\xc2\x8c",
      "\xc2\x8d",
      "\xc2\x8e",
      "\xc2\x8f",
      "\xc2\x90",
      "\xc2\x91",
      "\xc2\x92",
      "\xc2\x93",
      "\xc2\x94",
      "\xc2\x95",
      "\xc2\x96",
      "\xc2\x97",
      "\xc2\x98",
      "\xc2\x99",
      "\xc2\x9a",
      "\xc2\x9b",
      "\xc2\x9c",
      "\xc2\x9d",
      "\xc2\x9e",
      "\xc2\x9f",
      "\xc2\xa0",
      "\xc2\xa1",
      "\xc2\xa2",
      "\xc2\xa3",
      "\xc2\xa4",
      "\xc2\xa5",
      "\xc2\xa6",
      "\xc2\xa7",
      "\xc2\xa8",
      "\xc2\xa9",
      "\xc2\xaa",
      "\xc2\xab",
      "\xc2\xac",
      "\xc2\xad",
      "\xc2\xae",
      "\xc2\xaf",
      "\xc2\xb0",
      "\xc2\xb1",
      "\xc2\xb2",
      "\xc2\xb3",
      "\xc2\xb4",
      "\xc2\xb5",
      "\xc2\xb6",
      "\xc2\xb7",
      "\xc2\xb8",
      "\xc2\xb9",
      "\xc2\xba",
      "\xc2\xbb",
      "\xc2\xbc",
      "\xc2\xbd",
      "\xc2\xbe",
      "\xc2\xbf",
      "\xc3\x80",
      "\xc3\x81",
      "\xc3\x82",
      "\xc3\x83",
      "\xc3\x84",
      "\xc3\x85",
      "\xc3\x86",
      "\xc3\x87",
      "\xc3\x88",
      "\xc3\x89",
      "\xc3\x8a",
      "\xc3\x8b",
      "\xc3\x8c",
      "\xc3\x8d",
      "\xc3\x8e",
      "\xc3\x8f",
      "\xc4\x9e",
      "\xc3\x91",
      "\xc3\x92",
      "\xc3\x93",
      "\xc3\x94",
      "\xc3\x95",
      "\xc3\x96",
      "\xc3\x97",
      "\xc3\x98",
      "\xc3\x99",
      "\xc3\x9a",
      "\xc3\x9b",
      "\xc3\x9c",
      "\xc4\xb0",
      "\xc5\x9e",
      "\xc3\x9f",
      "\xc3\xa0",
      "\xc3\xa1",
      "\xc3\xa2",
      "\xc3\xa3",
      "\xc3\xa4",
      "\xc3\xa5",
      "\xc3\xa6",
      "\xc3\xa7",
      "\xc3\xa8",
      "\xc3\xa9",
      "\xc3\xaa",
      "\xc3\xab",
      "\xc3\xac",
      "\xc3\xad",
      "\xc3\xae",
      "\xc3\xaf",
      "\xc4\x9f",
      "\xc3\xb1",
      "\xc3\xb2",
      "\xc3\xb3",
      "\xc3\xb4",
      "\xc3\xb5",
      "\xc3\xb6",
      "\xc3\xb7",
      "\xc3\xb8",
      "\xc3\xb9",
      "\xc3\xba",
      "\xc3\xbb",
      "\xc3\xbc",
      "\xc4\xb1",
      "\xc5\x9f",
      "\xc3\xbf",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x00000080 => "\x80",
      0x00000081 => "\x81",
      0x00000082 => "\x82",
      0x00000083 => "\x83",
      0x00000084 => "\x84",
      0x00000085 => "\x85",
      0x00000086 => "\x86",
      0x00000087 => "\x87",
      0x00000088 => "\x88",
      0x00000089 => "\x89",
      0x0000008a => "\x8a",
      0x0000008b => "\x8b",
      0x0000008c => "\x8c",
      0x0000008d => "\x8d",
      0x0000008e => "\x8e",
      0x0000008f => "\x8f",
      0x00000090 => "\x90",
      0x00000091 => "\x91",
      0x00000092 => "\x92",
      0x00000093 => "\x93",
      0x00000094 => "\x94",
      0x00000095 => "\x95",
      0x00000096 => "\x96",
      0x00000097 => "\x97",
      0x00000098 => "\x98",
      0x00000099 => "\x99",
      0x0000009a => "\x9a",
      0x0000009b => "\x9b",
      0x0000009c => "\x9c",
      0x0000009d => "\x9d",
      0x0000009e => "\x9e",
      0x0000009f => "\x9f",
      0x000000a0 => "\xa0",
      0x000000a1 => "\xa1",
      0x000000a2 => "\xa2",
      0x000000a3 => "\xa3",
      0x000000a4 => "\xa4",
      0x000000a5 => "\xa5",
      0x000000a6 => "\xa6",
      0x000000a7 => "\xa7",
      0x000000a8 => "\xa8",
      0x000000a9 => "\xa9",
      0x000000aa => "\xaa",
      0x000000ab => "\xab",
      0x000000ac => "\xac",
      0x000000ad => "\xad",
      0x000000ae => "\xae",
      0x000000af => "\xaf",
      0x000000b0 => "\xb0",
      0x000000b1 => "\xb1",
      0x000000b2 => "\xb2",
      0x000000b3 => "\xb3",
      0x000000b4 => "\xb4",
      0x000000b5 => "\xb5",
      0x000000b6 => "\xb6",
      0x000000b7 => "\xb7",
      0x000000b8 => "\xb8",
      0x000000b9 => "\xb9",
      0x000000ba => "\xba",
      0x000000bb => "\xbb",
      0x000000bc => "\xbc",
      0x000000bd => "\xbd",
      0x000000be => "\xbe",
      0x000000bf => "\xbf",
      0x000000c0 => "\xc0",
      0x000000c1 => "\xc1",
      0x000000c2 => "\xc2",
      0x000000c3 => "\xc3",
      0x000000c4 => "\xc4",
      0x000000c5 => "\xc5",
      0x000000c6 => "\xc6",
      0x000000c7 => "\xc7",
      0x000000c8 => "\xc8",
      0x000000c9 => "\xc9",
      0x000000ca => "\xca",
      0x000000cb => "\xcb",
      0x000000cc => "\xcc",
      0x000000cd => "\xcd",
      0x000000ce => "\xce",
      0x000000cf => "\xcf",
      0x000000d1 => "\xd1",
      0x000000d2 => "\xd2",
      0x000000d3 => "\xd3",
      0x000000d4 => "\xd4",
      0x000000d5 => "\xd5",
      0x000000d6 => "\xd6",
      0x000000d7 => "\xd7",
      0x000000d8 => "\xd8",
      0x000000d9 => "\xd9",
      0x000000da => "\xda",
      0x000000db => "\xdb",
      0x000000dc => "\xdc",
      0x000000df => "\xdf",
      0x000000e0 => "\xe0",
      0x000000e1 => "\xe1",
      0x000000e2 => "\xe2",
      0x000000e3 => "\xe3",
      0x000000e4 => "\xe4",
      0x000000e5 => "\xe5",
      0x000000e6 => "\xe6",
      0x000000e7 => "\xe7",
      0x000000e8 => "\xe8",
      0x000000e9 => "\xe9",
      0x000000ea => "\xea",
      0x000000eb => "\xeb",
      0x000000ec => "\xec",
      0x000000ed => "\xed",
      0x000000ee => "\xee",
      0x000000ef => "\xef",
      0x000000f1 => "\xf1",
      0x000000f2 => "\xf2",
      0x000000f3 => "\xf3",
      0x000000f4 => "\xf4",
      0x000000f5 => "\xf5",
      0x000000f6 => "\xf6",
      0x000000f7 => "\xf7",
      0x000000f8 => "\xf8",
      0x000000f9 => "\xf9",
      0x000000fa => "\xfa",
      0x000000fb => "\xfb",
      0x000000fc => "\xfc",
      0x000000ff => "\xff",
      0x0000011e => "\xd0",
      0x0000011f => "\xf0",
      0x00000130 => "\xdd",
      0x00000131 => "\xfd",
      0x0000015e => "\xde",
      0x0000015f => "\xfe",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::ISO_8859_9 - Conversion routines for ISO-8859-9
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for ISO-8859-9.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: ECMA registry
   alias ISO-IR-148
   alias ISO_8859-9:1989
   alias ISO_8859-9
   alias LATIN5
   alias L5
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE (DEL)
      80 |  00000080 | PADDING CHARACTER (PAD)
      81 |  00000081 | HIGH OCTET PRESET (HOP)
      82 |  00000082 | BREAK PERMITTED HERE (BPH)
      83 |  00000083 | NO BREAK HERE (NBH)
      84 |  00000084 | INDEX (IND)
      85 |  00000085 | NEXT LINE (NEL)
      86 |  00000086 | START OF SELECTED AREA (SSA)
      87 |  00000087 | END OF SELECTED AREA (ESA)
      88 |  00000088 | CHARACTER TABULATION SET (HTS)
      89 |  00000089 | CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
      8A |  0000008A | LINE TABULATION SET (VTS)
      8B |  0000008B | PARTIAL LINE FORWARD (PLD)
      8C |  0000008C | PARTIAL LINE BACKWARD (PLU)
      8D |  0000008D | REVERSE LINE FEED (RI)
      8E |  0000008E | SINGLE-SHIFT TWO (SS2)
      8F |  0000008F | SINGLE-SHIFT THREE (SS3)
      90 |  00000090 | DEVICE CONTROL STRING (DCS)
      91 |  00000091 | PRIVATE USE ONE (PU1)
      92 |  00000092 | PRIVATE USE TWO (PU2)
      93 |  00000093 | SET TRANSMIT STATE (STS)
      94 |  00000094 | CANCEL CHARACTER (CCH)
      95 |  00000095 | MESSAGE WAITING (MW)
      96 |  00000096 | START OF GUARDED AREA (SPA)
      97 |  00000097 | END OF GUARDED AREA (EPA)
      98 |  00000098 | START OF STRING (SOS)
      99 |  00000099 | SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
      9A |  0000009A | SINGLE CHARACTER INTRODUCER (SCI)
      9B |  0000009B | CONTROL SEQUENCE INTRODUCER (CSI)
      9C |  0000009C | STRING TERMINATOR (ST)
      9D |  0000009D | OPERATING SYSTEM COMMAND (OSC)
      9E |  0000009E | PRIVACY MESSAGE (PM)
      9F |  0000009F | APPLICATION PROGRAM COMMAND (APC)
      A0 |  000000A0 | NO-BREAK SPACE
      A1 |  000000A1 | INVERTED EXCLAMATION MARK
      A2 |  000000A2 | CENT SIGN
      A3 |  000000A3 | POUND SIGN
      A4 |  000000A4 | CURRENCY SIGN
      A5 |  000000A5 | YEN SIGN
      A6 |  000000A6 | BROKEN BAR
      A7 |  000000A7 | SECTION SIGN
      A8 |  000000A8 | DIAERESIS
      A9 |  000000A9 | COPYRIGHT SIGN
      AA |  000000AA | FEMININE ORDINAL INDICATOR
      AB |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
      AC |  000000AC | NOT SIGN
      AD |  000000AD | SOFT HYPHEN
      AE |  000000AE | REGISTERED SIGN
      AF |  000000AF | MACRON
      B0 |  000000B0 | DEGREE SIGN
      B1 |  000000B1 | PLUS-MINUS SIGN
      B2 |  000000B2 | SUPERSCRIPT TWO
      B3 |  000000B3 | SUPERSCRIPT THREE
      B4 |  000000B4 | ACUTE ACCENT
      B5 |  000000B5 | MICRO SIGN
      B6 |  000000B6 | PILCROW SIGN
      B7 |  000000B7 | MIDDLE DOT
      B8 |  000000B8 | CEDILLA
      B9 |  000000B9 | SUPERSCRIPT ONE
      BA |  000000BA | MASCULINE ORDINAL INDICATOR
      BB |  000000BB | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
      BC |  000000BC | VULGAR FRACTION ONE QUARTER
      BD |  000000BD | VULGAR FRACTION ONE HALF
      BE |  000000BE | VULGAR FRACTION THREE QUARTERS
      BF |  000000BF | INVERTED QUESTION MARK
      C0 |  000000C0 | LATIN CAPITAL LETTER A WITH GRAVE
      C1 |  000000C1 | LATIN CAPITAL LETTER A WITH ACUTE
      C2 |  000000C2 | LATIN CAPITAL LETTER A WITH CIRCUMFLEX
      C3 |  000000C3 | LATIN CAPITAL LETTER A WITH TILDE
      C4 |  000000C4 | LATIN CAPITAL LETTER A WITH DIAERESIS
      C5 |  000000C5 | LATIN CAPITAL LETTER A WITH RING ABOVE
      C6 |  000000C6 | LATIN CAPITAL LETTER AE
      C7 |  000000C7 | LATIN CAPITAL LETTER C WITH CEDILLA
      C8 |  000000C8 | LATIN CAPITAL LETTER E WITH GRAVE
      C9 |  000000C9 | LATIN CAPITAL LETTER E WITH ACUTE
      CA |  000000CA | LATIN CAPITAL LETTER E WITH CIRCUMFLEX
      CB |  000000CB | LATIN CAPITAL LETTER E WITH DIAERESIS
      CC |  000000CC | LATIN CAPITAL LETTER I WITH GRAVE
      CD |  000000CD | LATIN CAPITAL LETTER I WITH ACUTE
      CE |  000000CE | LATIN CAPITAL LETTER I WITH CIRCUMFLEX
      CF |  000000CF | LATIN CAPITAL LETTER I WITH DIAERESIS
      D0 |  0000011E | LATIN CAPITAL LETTER G WITH BREVE
      D1 |  000000D1 | LATIN CAPITAL LETTER N WITH TILDE
      D2 |  000000D2 | LATIN CAPITAL LETTER O WITH GRAVE
      D3 |  000000D3 | LATIN CAPITAL LETTER O WITH ACUTE
      D4 |  000000D4 | LATIN CAPITAL LETTER O WITH CIRCUMFLEX
      D5 |  000000D5 | LATIN CAPITAL LETTER O WITH TILDE
      D6 |  000000D6 | LATIN CAPITAL LETTER O WITH DIAERESIS
      D7 |  000000D7 | MULTIPLICATION SIGN
      D8 |  000000D8 | LATIN CAPITAL LETTER O WITH STROKE
      D9 |  000000D9 | LATIN CAPITAL LETTER U WITH GRAVE
      DA |  000000DA | LATIN CAPITAL LETTER U WITH ACUTE
      DB |  000000DB | LATIN CAPITAL LETTER U WITH CIRCUMFLEX
      DC |  000000DC | LATIN CAPITAL LETTER U WITH DIAERESIS
      DD |  00000130 | LATIN CAPITAL LETTER I WITH DOT ABOVE
      DE |  0000015E | LATIN CAPITAL LETTER S WITH CEDILLA
      DF |  000000DF | LATIN SMALL LETTER SHARP S (German)
      E0 |  000000E0 | LATIN SMALL LETTER A WITH GRAVE
      E1 |  000000E1 | LATIN SMALL LETTER A WITH ACUTE
      E2 |  000000E2 | LATIN SMALL LETTER A WITH CIRCUMFLEX
      E3 |  000000E3 | LATIN SMALL LETTER A WITH TILDE
      E4 |  000000E4 | LATIN SMALL LETTER A WITH DIAERESIS
      E5 |  000000E5 | LATIN SMALL LETTER A WITH RING ABOVE
      E6 |  000000E6 | LATIN SMALL LETTER AE
      E7 |  000000E7 | LATIN SMALL LETTER C WITH CEDILLA
      E8 |  000000E8 | LATIN SMALL LETTER E WITH GRAVE
      E9 |  000000E9 | LATIN SMALL LETTER E WITH ACUTE
      EA |  000000EA | LATIN SMALL LETTER E WITH CIRCUMFLEX
      EB |  000000EB | LATIN SMALL LETTER E WITH DIAERESIS
      EC |  000000EC | LATIN SMALL LETTER I WITH GRAVE
      ED |  000000ED | LATIN SMALL LETTER I WITH ACUTE
      EE |  000000EE | LATIN SMALL LETTER I WITH CIRCUMFLEX
      EF |  000000EF | LATIN SMALL LETTER I WITH DIAERESIS
      F0 |  0000011F | LATIN SMALL LETTER G WITH BREVE
      F1 |  000000F1 | LATIN SMALL LETTER N WITH TILDE
      F2 |  000000F2 | LATIN SMALL LETTER O WITH GRAVE
      F3 |  000000F3 | LATIN SMALL LETTER O WITH ACUTE
      F4 |  000000F4 | LATIN SMALL LETTER O WITH CIRCUMFLEX
      F5 |  000000F5 | LATIN SMALL LETTER O WITH TILDE
      F6 |  000000F6 | LATIN SMALL LETTER O WITH DIAERESIS
      F7 |  000000F7 | DIVISION SIGN
      F8 |  000000F8 | LATIN SMALL LETTER O WITH STROKE
      F9 |  000000F9 | LATIN SMALL LETTER U WITH GRAVE
      FA |  000000FA | LATIN SMALL LETTER U WITH ACUTE
      FB |  000000FB | LATIN SMALL LETTER U WITH CIRCUMFLEX
      FC |  000000FC | LATIN SMALL LETTER U WITH DIAERESIS
      FD |  00000131 | LATIN SMALL LETTER DOTLESS I
      FE |  0000015F | LATIN SMALL LETTER S WITH CEDILLA
      FF |  000000FF | LATIN SMALL LETTER Y WITH DIAERESIS
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_ISO_8859_9

    $main::fatpacked{"Locale/RecodeData/KOI8_R.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_KOI8_R';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for KOI8-R.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::KOI8_R;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0x2500,
      0x2502,
      0x250c,
      0x2510,
      0x2514,
      0x2518,
      0x251c,
      0x2524,
      0x252c,
      0x2534,
      0x253c,
      0x2580,
      0x2584,
      0x2588,
      0x258c,
      0x2590,
      0x2591,
      0x2592,
      0x2593,
      0x2320,
      0x25a0,
      0x2219,
      0x221a,
      0x2248,
      0x2264,
      0x2265,
      0x00a0,
      0x2321,
      0x00b0,
      0x00b2,
      0x00b7,
      0x00f7,
      0x2550,
      0x2551,
      0x2552,
      0x0451,
      0x2553,
      0x2554,
      0x2555,
      0x2556,
      0x2557,
      0x2558,
      0x2559,
      0x255a,
      0x255b,
      0x255c,
      0x255d,
      0x255e,
      0x255f,
      0x2560,
      0x2561,
      0x0401,
      0x2562,
      0x2563,
      0x2564,
      0x2565,
      0x2566,
      0x2567,
      0x2568,
      0x2569,
      0x256a,
      0x256b,
      0x256c,
      0x00a9,
      0x044e,
      0x0430,
      0x0431,
      0x0446,
      0x0434,
      0x0435,
      0x0444,
      0x0433,
      0x0445,
      0x0438,
      0x0439,
      0x043a,
      0x043b,
      0x043c,
      0x043d,
      0x043e,
      0x043f,
      0x044f,
      0x0440,
      0x0441,
      0x0442,
      0x0443,
      0x0436,
      0x0432,
      0x044c,
      0x044b,
      0x0437,
      0x0448,
      0x044d,
      0x0449,
      0x0447,
      0x044a,
      0x042e,
      0x0410,
      0x0411,
      0x0426,
      0x0414,
      0x0415,
      0x0424,
      0x0413,
      0x0425,
      0x0418,
      0x0419,
      0x041a,
      0x041b,
      0x041c,
      0x041d,
      0x041e,
      0x041f,
      0x042f,
      0x0420,
      0x0421,
      0x0422,
      0x0423,
      0x0416,
      0x0412,
      0x042c,
      0x042b,
      0x0417,
      0x0428,
      0x042d,
      0x0429,
      0x0427,
      0x042a,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xe2\x94\x80",
      "\xe2\x94\x82",
      "\xe2\x94\x8c",
      "\xe2\x94\x90",
      "\xe2\x94\x94",
      "\xe2\x94\x98",
      "\xe2\x94\x9c",
      "\xe2\x94\xa4",
      "\xe2\x94\xac",
      "\xe2\x94\xb4",
      "\xe2\x94\xbc",
      "\xe2\x96\x80",
      "\xe2\x96\x84",
      "\xe2\x96\x88",
      "\xe2\x96\x8c",
      "\xe2\x96\x90",
      "\xe2\x96\x91",
      "\xe2\x96\x92",
      "\xe2\x96\x93",
      "\xe2\x8c\xa0",
      "\xe2\x96\xa0",
      "\xe2\x88\x99",
      "\xe2\x88\x9a",
      "\xe2\x89\x88",
      "\xe2\x89\xa4",
      "\xe2\x89\xa5",
      "\xc2\xa0",
      "\xe2\x8c\xa1",
      "\xc2\xb0",
      "\xc2\xb2",
      "\xc2\xb7",
      "\xc3\xb7",
      "\xe2\x95\x90",
      "\xe2\x95\x91",
      "\xe2\x95\x92",
      "\xd1\x91",
      "\xe2\x95\x93",
      "\xe2\x95\x94",
      "\xe2\x95\x95",
      "\xe2\x95\x96",
      "\xe2\x95\x97",
      "\xe2\x95\x98",
      "\xe2\x95\x99",
      "\xe2\x95\x9a",
      "\xe2\x95\x9b",
      "\xe2\x95\x9c",
      "\xe2\x95\x9d",
      "\xe2\x95\x9e",
      "\xe2\x95\x9f",
      "\xe2\x95\xa0",
      "\xe2\x95\xa1",
      "\xd0\x81",
      "\xe2\x95\xa2",
      "\xe2\x95\xa3",
      "\xe2\x95\xa4",
      "\xe2\x95\xa5",
      "\xe2\x95\xa6",
      "\xe2\x95\xa7",
      "\xe2\x95\xa8",
      "\xe2\x95\xa9",
      "\xe2\x95\xaa",
      "\xe2\x95\xab",
      "\xe2\x95\xac",
      "\xc2\xa9",
      "\xd1\x8e",
      "\xd0\xb0",
      "\xd0\xb1",
      "\xd1\x86",
      "\xd0\xb4",
      "\xd0\xb5",
      "\xd1\x84",
      "\xd0\xb3",
      "\xd1\x85",
      "\xd0\xb8",
      "\xd0\xb9",
      "\xd0\xba",
      "\xd0\xbb",
      "\xd0\xbc",
      "\xd0\xbd",
      "\xd0\xbe",
      "\xd0\xbf",
      "\xd1\x8f",
      "\xd1\x80",
      "\xd1\x81",
      "\xd1\x82",
      "\xd1\x83",
      "\xd0\xb6",
      "\xd0\xb2",
      "\xd1\x8c",
      "\xd1\x8b",
      "\xd0\xb7",
      "\xd1\x88",
      "\xd1\x8d",
      "\xd1\x89",
      "\xd1\x87",
      "\xd1\x8a",
      "\xd0\xae",
      "\xd0\x90",
      "\xd0\x91",
      "\xd0\xa6",
      "\xd0\x94",
      "\xd0\x95",
      "\xd0\xa4",
      "\xd0\x93",
      "\xd0\xa5",
      "\xd0\x98",
      "\xd0\x99",
      "\xd0\x9a",
      "\xd0\x9b",
      "\xd0\x9c",
      "\xd0\x9d",
      "\xd0\x9e",
      "\xd0\x9f",
      "\xd0\xaf",
      "\xd0\xa0",
      "\xd0\xa1",
      "\xd0\xa2",
      "\xd0\xa3",
      "\xd0\x96",
      "\xd0\x92",
      "\xd0\xac",
      "\xd0\xab",
      "\xd0\x97",
      "\xd0\xa8",
      "\xd0\xad",
      "\xd0\xa9",
      "\xd0\xa7",
      "\xd0\xaa",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x000000a0 => "\x9a",
      0x000000a9 => "\xbf",
      0x000000b0 => "\x9c",
      0x000000b2 => "\x9d",
      0x000000b7 => "\x9e",
      0x000000f7 => "\x9f",
      0x00000401 => "\xb3",
      0x00000410 => "\xe1",
      0x00000411 => "\xe2",
      0x00000412 => "\xf7",
      0x00000413 => "\xe7",
      0x00000414 => "\xe4",
      0x00000415 => "\xe5",
      0x00000416 => "\xf6",
      0x00000417 => "\xfa",
      0x00000418 => "\xe9",
      0x00000419 => "\xea",
      0x0000041a => "\xeb",
      0x0000041b => "\xec",
      0x0000041c => "\xed",
      0x0000041d => "\xee",
      0x0000041e => "\xef",
      0x0000041f => "\xf0",
      0x00000420 => "\xf2",
      0x00000421 => "\xf3",
      0x00000422 => "\xf4",
      0x00000423 => "\xf5",
      0x00000424 => "\xe6",
      0x00000425 => "\xe8",
      0x00000426 => "\xe3",
      0x00000427 => "\xfe",
      0x00000428 => "\xfb",
      0x00000429 => "\xfd",
      0x0000042a => "\xff",
      0x0000042b => "\xf9",
      0x0000042c => "\xf8",
      0x0000042d => "\xfc",
      0x0000042e => "\xe0",
      0x0000042f => "\xf1",
      0x00000430 => "\xc1",
      0x00000431 => "\xc2",
      0x00000432 => "\xd7",
      0x00000433 => "\xc7",
      0x00000434 => "\xc4",
      0x00000435 => "\xc5",
      0x00000436 => "\xd6",
      0x00000437 => "\xda",
      0x00000438 => "\xc9",
      0x00000439 => "\xca",
      0x0000043a => "\xcb",
      0x0000043b => "\xcc",
      0x0000043c => "\xcd",
      0x0000043d => "\xce",
      0x0000043e => "\xcf",
      0x0000043f => "\xd0",
      0x00000440 => "\xd2",
      0x00000441 => "\xd3",
      0x00000442 => "\xd4",
      0x00000443 => "\xd5",
      0x00000444 => "\xc6",
      0x00000445 => "\xc8",
      0x00000446 => "\xc3",
      0x00000447 => "\xde",
      0x00000448 => "\xdb",
      0x00000449 => "\xdd",
      0x0000044a => "\xdf",
      0x0000044b => "\xd9",
      0x0000044c => "\xd8",
      0x0000044d => "\xdc",
      0x0000044e => "\xc0",
      0x0000044f => "\xd1",
      0x00000451 => "\xa3",
      0x00002219 => "\x95",
      0x0000221a => "\x96",
      0x00002248 => "\x97",
      0x00002264 => "\x98",
      0x00002265 => "\x99",
      0x00002320 => "\x93",
      0x00002321 => "\x9b",
      0x00002500 => "\x80",
      0x00002502 => "\x81",
      0x0000250c => "\x82",
      0x00002510 => "\x83",
      0x00002514 => "\x84",
      0x00002518 => "\x85",
      0x0000251c => "\x86",
      0x00002524 => "\x87",
      0x0000252c => "\x88",
      0x00002534 => "\x89",
      0x0000253c => "\x8a",
      0x00002550 => "\xa0",
      0x00002551 => "\xa1",
      0x00002552 => "\xa2",
      0x00002553 => "\xa4",
      0x00002554 => "\xa5",
      0x00002555 => "\xa6",
      0x00002556 => "\xa7",
      0x00002557 => "\xa8",
      0x00002558 => "\xa9",
      0x00002559 => "\xaa",
      0x0000255a => "\xab",
      0x0000255b => "\xac",
      0x0000255c => "\xad",
      0x0000255d => "\xae",
      0x0000255e => "\xaf",
      0x0000255f => "\xb0",
      0x00002560 => "\xb1",
      0x00002561 => "\xb2",
      0x00002562 => "\xb4",
      0x00002563 => "\xb5",
      0x00002564 => "\xb6",
      0x00002565 => "\xb7",
      0x00002566 => "\xb8",
      0x00002567 => "\xb9",
      0x00002568 => "\xba",
      0x00002569 => "\xbb",
      0x0000256a => "\xbc",
      0x0000256b => "\xbd",
      0x0000256c => "\xbe",
      0x00002580 => "\x8b",
      0x00002584 => "\x8c",
      0x00002588 => "\x8d",
      0x0000258c => "\x8e",
      0x00002590 => "\x8f",
      0x00002591 => "\x90",
      0x00002592 => "\x91",
      0x00002593 => "\x92",
      0x000025a0 => "\x94",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::KOI8_R - Conversion routines for KOI8-R
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for KOI8-R.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: RFC1489 via Gabor Kiss E<lt>kissg@sztaki.huE<gt>
    and Andrey A. Chernov E<lt>ache@astral.msk.suE<gt>
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE (DEL)
      80 |  00002500 | BOX DRAWINGS LIGHT HORIZONTAL
      81 |  00002502 | BOX DRAWINGS LIGHT VERTICAL
      82 |  0000250C | BOX DRAWINGS LIGHT DOWN AND RIGHT
      83 |  00002510 | BOX DRAWINGS LIGHT DOWN AND LEFT
      84 |  00002514 | BOX DRAWINGS LIGHT UP AND RIGHT
      85 |  00002518 | BOX DRAWINGS LIGHT UP AND LEFT
      86 |  0000251C | BOX DRAWINGS LIGHT VERTICAL AND RIGHT
      87 |  00002524 | BOX DRAWINGS LIGHT VERTICAL AND LEFT
      88 |  0000252C | BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
      89 |  00002534 | BOX DRAWINGS LIGHT UP AND HORIZONTAL
      8A |  0000253C | BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
      8B |  00002580 | UPPER HALF BLOCK
      8C |  00002584 | LOWER HALF BLOCK
      8D |  00002588 | FULL BLOCK
      8E |  0000258C | LEFT HALF BLOCK
      8F |  00002590 | RIGHT HALF BLOCK
      90 |  00002591 | LIGHT SHADE
      91 |  00002592 | MEDIUM SHADE
      92 |  00002593 | DARK SHADE
      93 |  00002320 | TOP HALF INTEGRAL
      94 |  000025A0 | BLACK SQUARE
      95 |  00002219 | BULLET OPERATOR
      96 |  0000221A | SQUARE ROOT
      97 |  00002248 | ALMOST EQUAL TO
      98 |  00002264 | LESS-THAN OR EQUAL TO
      99 |  00002265 | GREATER-THAN OR EQUAL TO
      9A |  000000A0 | NO-BREAK SPACE
      9B |  00002321 | BOTTOM HALF INTEGRAL
      9C |  000000B0 | DEGREE SIGN
      9D |  000000B2 | SUPERSCRIPT TWO
      9E |  000000B7 | MIDDLE DOT
      9F |  000000F7 | DIVISION SIGN
      A0 |  00002550 | BOX DRAWINGS DOUBLE HORIZONTAL
      A1 |  00002551 | BOX DRAWINGS DOUBLE VERTICAL
      A2 |  00002552 | BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
      A3 |  00000451 | CYRILLIC SMALL LETTER IO
      A4 |  00002553 | BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
      A5 |  00002554 | BOX DRAWINGS DOUBLE DOWN AND RIGHT
      A6 |  00002555 | BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
      A7 |  00002556 | BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
      A8 |  00002557 | BOX DRAWINGS DOUBLE DOWN AND LEFT
      A9 |  00002558 | BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
      AA |  00002559 | BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
      AB |  0000255A | BOX DRAWINGS DOUBLE UP AND RIGHT
      AC |  0000255B | BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
      AD |  0000255C | BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
      AE |  0000255D | BOX DRAWINGS DOUBLE UP AND LEFT
      AF |  0000255E | BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
      B0 |  0000255F | BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
      B1 |  00002560 | BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
      B2 |  00002561 | BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
      B3 |  00000401 | CYRILLIC CAPITAL LETTER IO
      B4 |  00002562 | BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
      B5 |  00002563 | BOX DRAWINGS DOUBLE VERTICAL AND LEFT
      B6 |  00002564 | BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
      B7 |  00002565 | BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
      B8 |  00002566 | BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
      B9 |  00002567 | BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
      BA |  00002568 | BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
      BB |  00002569 | BOX DRAWINGS DOUBLE UP AND HORIZONTAL
      BC |  0000256A | BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
      BD |  0000256B | BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
      BE |  0000256C | BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
      BF |  000000A9 | COPYRIGHT SIGN
      C0 |  0000044E | CYRILLIC SMALL LETTER YU
      C1 |  00000430 | CYRILLIC SMALL LETTER A
      C2 |  00000431 | CYRILLIC SMALL LETTER BE
      C3 |  00000446 | CYRILLIC SMALL LETTER TSE
      C4 |  00000434 | CYRILLIC SMALL LETTER DE
      C5 |  00000435 | CYRILLIC SMALL LETTER IE
      C6 |  00000444 | CYRILLIC SMALL LETTER EF
      C7 |  00000433 | CYRILLIC SMALL LETTER GHE
      C8 |  00000445 | CYRILLIC SMALL LETTER HA
      C9 |  00000438 | CYRILLIC SMALL LETTER I
      CA |  00000439 | CYRILLIC SMALL LETTER SHORT I
      CB |  0000043A | CYRILLIC SMALL LETTER KA
      CC |  0000043B | CYRILLIC SMALL LETTER EL
      CD |  0000043C | CYRILLIC SMALL LETTER EM
      CE |  0000043D | CYRILLIC SMALL LETTER EN
      CF |  0000043E | CYRILLIC SMALL LETTER O
      D0 |  0000043F | CYRILLIC SMALL LETTER PE
      D1 |  0000044F | CYRILLIC SMALL LETTER YA
      D2 |  00000440 | CYRILLIC SMALL LETTER ER
      D3 |  00000441 | CYRILLIC SMALL LETTER ES
      D4 |  00000442 | CYRILLIC SMALL LETTER TE
      D5 |  00000443 | CYRILLIC SMALL LETTER U
      D6 |  00000436 | CYRILLIC SMALL LETTER ZHE
      D7 |  00000432 | CYRILLIC SMALL LETTER VE
      D8 |  0000044C | CYRILLIC SMALL LETTER SOFT SIGN
      D9 |  0000044B | CYRILLIC SMALL LETTER YERU
      DA |  00000437 | CYRILLIC SMALL LETTER ZE
      DB |  00000448 | CYRILLIC SMALL LETTER SHA
      DC |  0000044D | CYRILLIC SMALL LETTER E
      DD |  00000449 | CYRILLIC SMALL LETTER SHCHA
      DE |  00000447 | CYRILLIC SMALL LETTER CHE
      DF |  0000044A | CYRILLIC SMALL LETTER HARD SIGN
      E0 |  0000042E | CYRILLIC CAPITAL LETTER YU
      E1 |  00000410 | CYRILLIC CAPITAL LETTER A
      E2 |  00000411 | CYRILLIC CAPITAL LETTER BE
      E3 |  00000426 | CYRILLIC CAPITAL LETTER TSE
      E4 |  00000414 | CYRILLIC CAPITAL LETTER DE
      E5 |  00000415 | CYRILLIC CAPITAL LETTER IE
      E6 |  00000424 | CYRILLIC CAPITAL LETTER EF
      E7 |  00000413 | CYRILLIC CAPITAL LETTER GHE
      E8 |  00000425 | CYRILLIC CAPITAL LETTER HA
      E9 |  00000418 | CYRILLIC CAPITAL LETTER I
      EA |  00000419 | CYRILLIC CAPITAL LETTER SHORT I
      EB |  0000041A | CYRILLIC CAPITAL LETTER KA
      EC |  0000041B | CYRILLIC CAPITAL LETTER EL
      ED |  0000041C | CYRILLIC CAPITAL LETTER EM
      EE |  0000041D | CYRILLIC CAPITAL LETTER EN
      EF |  0000041E | CYRILLIC CAPITAL LETTER O
      F0 |  0000041F | CYRILLIC CAPITAL LETTER PE
      F1 |  0000042F | CYRILLIC CAPITAL LETTER YA
      F2 |  00000420 | CYRILLIC CAPITAL LETTER ER
      F3 |  00000421 | CYRILLIC CAPITAL LETTER ES
      F4 |  00000422 | CYRILLIC CAPITAL LETTER TE
      F5 |  00000423 | CYRILLIC CAPITAL LETTER U
      F6 |  00000416 | CYRILLIC CAPITAL LETTER ZHE
      F7 |  00000412 | CYRILLIC CAPITAL LETTER VE
      F8 |  0000042C | CYRILLIC CAPITAL LETTER SOFT SIGN
      F9 |  0000042B | CYRILLIC CAPITAL LETTER YERU
      FA |  00000417 | CYRILLIC CAPITAL LETTER ZE
      FB |  00000428 | CYRILLIC CAPITAL LETTER SHA
      FC |  0000042D | CYRILLIC CAPITAL LETTER E
      FD |  00000429 | CYRILLIC CAPITAL LETTER SHCHA
      FE |  00000427 | CYRILLIC CAPITAL LETTER CHE
      FF |  0000042A | CYRILLIC CAPITAL LETTER HARD SIGN
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_KOI8_R

    $main::fatpacked{"Locale/RecodeData/KOI8_RU.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_KOI8_RU';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for KOI8-RU.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::KOI8_RU;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0x2500,
      0x2502,
      0x250c,
      0x2510,
      0x2514,
      0x2518,
      0x251c,
      0x2524,
      0x252c,
      0x2534,
      0x253c,
      0x2580,
      0x2584,
      0x2588,
      0x258c,
      0x2590,
      0x2591,
      0x2592,
      0x2593,
      0x2320,
      0x25a0,
      0x2219,
      0x221a,
      0x2248,
      0x2264,
      0x2265,
      0x00a0,
      0x2321,
      0x00b0,
      0x00b2,
      0x00b7,
      0x00f7,
      0x2550,
      0x2551,
      0x2552,
      0x0451,
      0x0454,
      0x2554,
      0x0456,
      0x0457,
      0x2557,
      0x2558,
      0x2559,
      0x255a,
      0x255b,
      0x0491,
      0x045e,
      0x255e,
      0x255f,
      0x2560,
      0x2561,
      0x0401,
      0x0404,
      0x2563,
      0x0406,
      0x0407,
      0x2566,
      0x2567,
      0x2568,
      0x2569,
      0x256a,
      0x0490,
      0x040e,
      0x00a9,
      0x044e,
      0x0430,
      0x0431,
      0x0446,
      0x0434,
      0x0435,
      0x0444,
      0x0433,
      0x0445,
      0x0438,
      0x0439,
      0x043a,
      0x043b,
      0x043c,
      0x043d,
      0x043e,
      0x043f,
      0x044f,
      0x0440,
      0x0441,
      0x0442,
      0x0443,
      0x0436,
      0x0432,
      0x044c,
      0x044b,
      0x0437,
      0x0448,
      0x044d,
      0x0449,
      0x0447,
      0x044a,
      0x042e,
      0x0410,
      0x0411,
      0x0426,
      0x0414,
      0x0415,
      0x0424,
      0x0413,
      0x0425,
      0x0418,
      0x0419,
      0x041a,
      0x041b,
      0x041c,
      0x041d,
      0x041e,
      0x041f,
      0x042f,
      0x0420,
      0x0421,
      0x0422,
      0x0423,
      0x0416,
      0x0412,
      0x042c,
      0x042b,
      0x0417,
      0x0428,
      0x042d,
      0x0429,
      0x0427,
      0x042a,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xe2\x94\x80",
      "\xe2\x94\x82",
      "\xe2\x94\x8c",
      "\xe2\x94\x90",
      "\xe2\x94\x94",
      "\xe2\x94\x98",
      "\xe2\x94\x9c",
      "\xe2\x94\xa4",
      "\xe2\x94\xac",
      "\xe2\x94\xb4",
      "\xe2\x94\xbc",
      "\xe2\x96\x80",
      "\xe2\x96\x84",
      "\xe2\x96\x88",
      "\xe2\x96\x8c",
      "\xe2\x96\x90",
      "\xe2\x96\x91",
      "\xe2\x96\x92",
      "\xe2\x96\x93",
      "\xe2\x8c\xa0",
      "\xe2\x96\xa0",
      "\xe2\x88\x99",
      "\xe2\x88\x9a",
      "\xe2\x89\x88",
      "\xe2\x89\xa4",
      "\xe2\x89\xa5",
      "\xc2\xa0",
      "\xe2\x8c\xa1",
      "\xc2\xb0",
      "\xc2\xb2",
      "\xc2\xb7",
      "\xc3\xb7",
      "\xe2\x95\x90",
      "\xe2\x95\x91",
      "\xe2\x95\x92",
      "\xd1\x91",
      "\xd1\x94",
      "\xe2\x95\x94",
      "\xd1\x96",
      "\xd1\x97",
      "\xe2\x95\x97",
      "\xe2\x95\x98",
      "\xe2\x95\x99",
      "\xe2\x95\x9a",
      "\xe2\x95\x9b",
      "\xd2\x91",
      "\xd1\x9e",
      "\xe2\x95\x9e",
      "\xe2\x95\x9f",
      "\xe2\x95\xa0",
      "\xe2\x95\xa1",
      "\xd0\x81",
      "\xd0\x84",
      "\xe2\x95\xa3",
      "\xd0\x86",
      "\xd0\x87",
      "\xe2\x95\xa6",
      "\xe2\x95\xa7",
      "\xe2\x95\xa8",
      "\xe2\x95\xa9",
      "\xe2\x95\xaa",
      "\xd2\x90",
      "\xd0\x8e",
      "\xc2\xa9",
      "\xd1\x8e",
      "\xd0\xb0",
      "\xd0\xb1",
      "\xd1\x86",
      "\xd0\xb4",
      "\xd0\xb5",
      "\xd1\x84",
      "\xd0\xb3",
      "\xd1\x85",
      "\xd0\xb8",
      "\xd0\xb9",
      "\xd0\xba",
      "\xd0\xbb",
      "\xd0\xbc",
      "\xd0\xbd",
      "\xd0\xbe",
      "\xd0\xbf",
      "\xd1\x8f",
      "\xd1\x80",
      "\xd1\x81",
      "\xd1\x82",
      "\xd1\x83",
      "\xd0\xb6",
      "\xd0\xb2",
      "\xd1\x8c",
      "\xd1\x8b",
      "\xd0\xb7",
      "\xd1\x88",
      "\xd1\x8d",
      "\xd1\x89",
      "\xd1\x87",
      "\xd1\x8a",
      "\xd0\xae",
      "\xd0\x90",
      "\xd0\x91",
      "\xd0\xa6",
      "\xd0\x94",
      "\xd0\x95",
      "\xd0\xa4",
      "\xd0\x93",
      "\xd0\xa5",
      "\xd0\x98",
      "\xd0\x99",
      "\xd0\x9a",
      "\xd0\x9b",
      "\xd0\x9c",
      "\xd0\x9d",
      "\xd0\x9e",
      "\xd0\x9f",
      "\xd0\xaf",
      "\xd0\xa0",
      "\xd0\xa1",
      "\xd0\xa2",
      "\xd0\xa3",
      "\xd0\x96",
      "\xd0\x92",
      "\xd0\xac",
      "\xd0\xab",
      "\xd0\x97",
      "\xd0\xa8",
      "\xd0\xad",
      "\xd0\xa9",
      "\xd0\xa7",
      "\xd0\xaa",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x000000a0 => "\x9a",
      0x000000a9 => "\xbf",
      0x000000b0 => "\x9c",
      0x000000b2 => "\x9d",
      0x000000b7 => "\x9e",
      0x000000f7 => "\x9f",
      0x00000401 => "\xb3",
      0x00000404 => "\xb4",
      0x00000406 => "\xb6",
      0x00000407 => "\xb7",
      0x0000040e => "\xbe",
      0x00000410 => "\xe1",
      0x00000411 => "\xe2",
      0x00000412 => "\xf7",
      0x00000413 => "\xe7",
      0x00000414 => "\xe4",
      0x00000415 => "\xe5",
      0x00000416 => "\xf6",
      0x00000417 => "\xfa",
      0x00000418 => "\xe9",
      0x00000419 => "\xea",
      0x0000041a => "\xeb",
      0x0000041b => "\xec",
      0x0000041c => "\xed",
      0x0000041d => "\xee",
      0x0000041e => "\xef",
      0x0000041f => "\xf0",
      0x00000420 => "\xf2",
      0x00000421 => "\xf3",
      0x00000422 => "\xf4",
      0x00000423 => "\xf5",
      0x00000424 => "\xe6",
      0x00000425 => "\xe8",
      0x00000426 => "\xe3",
      0x00000427 => "\xfe",
      0x00000428 => "\xfb",
      0x00000429 => "\xfd",
      0x0000042a => "\xff",
      0x0000042b => "\xf9",
      0x0000042c => "\xf8",
      0x0000042d => "\xfc",
      0x0000042e => "\xe0",
      0x0000042f => "\xf1",
      0x00000430 => "\xc1",
      0x00000431 => "\xc2",
      0x00000432 => "\xd7",
      0x00000433 => "\xc7",
      0x00000434 => "\xc4",
      0x00000435 => "\xc5",
      0x00000436 => "\xd6",
      0x00000437 => "\xda",
      0x00000438 => "\xc9",
      0x00000439 => "\xca",
      0x0000043a => "\xcb",
      0x0000043b => "\xcc",
      0x0000043c => "\xcd",
      0x0000043d => "\xce",
      0x0000043e => "\xcf",
      0x0000043f => "\xd0",
      0x00000440 => "\xd2",
      0x00000441 => "\xd3",
      0x00000442 => "\xd4",
      0x00000443 => "\xd5",
      0x00000444 => "\xc6",
      0x00000445 => "\xc8",
      0x00000446 => "\xc3",
      0x00000447 => "\xde",
      0x00000448 => "\xdb",
      0x00000449 => "\xdd",
      0x0000044a => "\xdf",
      0x0000044b => "\xd9",
      0x0000044c => "\xd8",
      0x0000044d => "\xdc",
      0x0000044e => "\xc0",
      0x0000044f => "\xd1",
      0x00000451 => "\xa3",
      0x00000454 => "\xa4",
      0x00000456 => "\xa6",
      0x00000457 => "\xa7",
      0x0000045e => "\xae",
      0x00000490 => "\xbd",
      0x00000491 => "\xad",
      0x00002219 => "\x95",
      0x0000221a => "\x96",
      0x00002248 => "\x97",
      0x00002264 => "\x98",
      0x00002265 => "\x99",
      0x00002320 => "\x93",
      0x00002321 => "\x9b",
      0x00002500 => "\x80",
      0x00002502 => "\x81",
      0x0000250c => "\x82",
      0x00002510 => "\x83",
      0x00002514 => "\x84",
      0x00002518 => "\x85",
      0x0000251c => "\x86",
      0x00002524 => "\x87",
      0x0000252c => "\x88",
      0x00002534 => "\x89",
      0x0000253c => "\x8a",
      0x00002550 => "\xa0",
      0x00002551 => "\xa1",
      0x00002552 => "\xa2",
      0x00002554 => "\xa5",
      0x00002557 => "\xa8",
      0x00002558 => "\xa9",
      0x00002559 => "\xaa",
      0x0000255a => "\xab",
      0x0000255b => "\xac",
      0x0000255e => "\xaf",
      0x0000255f => "\xb0",
      0x00002560 => "\xb1",
      0x00002561 => "\xb2",
      0x00002563 => "\xb5",
      0x00002566 => "\xb8",
      0x00002567 => "\xb9",
      0x00002568 => "\xba",
      0x00002569 => "\xbb",
      0x0000256a => "\xbc",
      0x00002580 => "\x8b",
      0x00002584 => "\x8c",
      0x00002588 => "\x8d",
      0x0000258c => "\x8e",
      0x00002590 => "\x8f",
      0x00002591 => "\x90",
      0x00002592 => "\x91",
      0x00002593 => "\x92",
      0x000025a0 => "\x94",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::KOI8_RU - Conversion routines for KOI8-RU
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for KOI8-RU.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
  
   This charmap has been generated automatically from GNU libiconv
   conversions.
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE (DEL)
      80 |  00002500 | BOX DRAWINGS LIGHT HORIZONTAL
      81 |  00002502 | BOX DRAWINGS LIGHT VERTICAL
      82 |  0000250C | BOX DRAWINGS LIGHT DOWN AND RIGHT
      83 |  00002510 | BOX DRAWINGS LIGHT DOWN AND LEFT
      84 |  00002514 | BOX DRAWINGS LIGHT UP AND RIGHT
      85 |  00002518 | BOX DRAWINGS LIGHT UP AND LEFT
      86 |  0000251C | BOX DRAWINGS LIGHT VERTICAL AND RIGHT
      87 |  00002524 | BOX DRAWINGS LIGHT VERTICAL AND LEFT
      88 |  0000252C | BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
      89 |  00002534 | BOX DRAWINGS LIGHT UP AND HORIZONTAL
      8A |  0000253C | BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
      8B |  00002580 | UPPER HALF BLOCK
      8C |  00002584 | LOWER HALF BLOCK
      8D |  00002588 | FULL BLOCK
      8E |  0000258C | LEFT HALF BLOCK
      8F |  00002590 | RIGHT HALF BLOCK
      90 |  00002591 | LIGHT SHADE
      91 |  00002592 | MEDIUM SHADE
      92 |  00002593 | DARK SHADE
      93 |  00002320 | TOP HALF INTEGRAL
      94 |  000025A0 | BLACK SQUARE
      95 |  00002219 | BULLET OPERATOR
      96 |  0000221A | SQUARE ROOT
      97 |  00002248 | ALMOST EQUAL TO
      98 |  00002264 | LESS-THAN OR EQUAL TO
      99 |  00002265 | GREATER-THAN OR EQUAL TO
      9A |  000000A0 | NO-BREAK SPACE
      9B |  00002321 | BOTTOM HALF INTEGRAL
      9C |  000000B0 | DEGREE SIGN
      9D |  000000B2 | SUPERSCRIPT TWO
      9E |  000000B7 | MIDDLE DOT
      9F |  000000F7 | DIVISION SIGN
      A0 |  00002550 | BOX DRAWINGS DOUBLE HORIZONTAL
      A1 |  00002551 | BOX DRAWINGS DOUBLE VERTICAL
      A2 |  00002552 | BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
      A3 |  00000451 | CYRILLIC SMALL LETTER IO
      A4 |  00000454 | CYRILLIC SMALL LETTER UKRAINIAN IE
      A5 |  00002554 | BOX DRAWINGS DOUBLE DOWN AND RIGHT
      A6 |  00000456 | CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
      A7 |  00000457 | CYRILLIC SMALL LETTER YI
      A8 |  00002557 | BOX DRAWINGS DOUBLE DOWN AND LEFT
      A9 |  00002558 | BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
      AA |  00002559 | BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
      AB |  0000255A | BOX DRAWINGS DOUBLE UP AND RIGHT
      AC |  0000255B | BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
      AD |  00000491 | CYRILLIC SMALL LETTER GHE WITH UPTURN
      AE |  0000045E | CYRILLIC SMALL LETTER SHORT U
      AF |  0000255E | BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
      B0 |  0000255F | BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
      B1 |  00002560 | BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
      B2 |  00002561 | BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
      B3 |  00000401 | CYRILLIC CAPITAL LETTER IO
      B4 |  00000404 | CYRILLIC CAPITAL LETTER UKRAINIAN IE
      B5 |  00002563 | BOX DRAWINGS DOUBLE VERTICAL AND LEFT
      B6 |  00000406 | CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
      B7 |  00000407 | CYRILLIC CAPITAL LETTER YI
      B8 |  00002566 | BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
      B9 |  00002567 | BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
      BA |  00002568 | BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
      BB |  00002569 | BOX DRAWINGS DOUBLE UP AND HORIZONTAL
      BC |  0000256A | BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
      BD |  00000490 | CYRILLIC CAPITAL LETTER GHE WITH UPTURN
      BE |  0000040E | CYRILLIC CAPITAL LETTER SHORT U
      BF |  000000A9 | COPYRIGHT SIGN
      C0 |  0000044E | CYRILLIC SMALL LETTER YU
      C1 |  00000430 | CYRILLIC SMALL LETTER A
      C2 |  00000431 | CYRILLIC SMALL LETTER BE
      C3 |  00000446 | CYRILLIC SMALL LETTER TSE
      C4 |  00000434 | CYRILLIC SMALL LETTER DE
      C5 |  00000435 | CYRILLIC SMALL LETTER IE
      C6 |  00000444 | CYRILLIC SMALL LETTER EF
      C7 |  00000433 | CYRILLIC SMALL LETTER GHE
      C8 |  00000445 | CYRILLIC SMALL LETTER HA
      C9 |  00000438 | CYRILLIC SMALL LETTER I
      CA |  00000439 | CYRILLIC SMALL LETTER SHORT I
      CB |  0000043A | CYRILLIC SMALL LETTER KA
      CC |  0000043B | CYRILLIC SMALL LETTER EL
      CD |  0000043C | CYRILLIC SMALL LETTER EM
      CE |  0000043D | CYRILLIC SMALL LETTER EN
      CF |  0000043E | CYRILLIC SMALL LETTER O
      D0 |  0000043F | CYRILLIC SMALL LETTER PE
      D1 |  0000044F | CYRILLIC SMALL LETTER YA
      D2 |  00000440 | CYRILLIC SMALL LETTER ER
      D3 |  00000441 | CYRILLIC SMALL LETTER ES
      D4 |  00000442 | CYRILLIC SMALL LETTER TE
      D5 |  00000443 | CYRILLIC SMALL LETTER U
      D6 |  00000436 | CYRILLIC SMALL LETTER ZHE
      D7 |  00000432 | CYRILLIC SMALL LETTER VE
      D8 |  0000044C | CYRILLIC SMALL LETTER SOFT SIGN
      D9 |  0000044B | CYRILLIC SMALL LETTER YERU
      DA |  00000437 | CYRILLIC SMALL LETTER ZE
      DB |  00000448 | CYRILLIC SMALL LETTER SHA
      DC |  0000044D | CYRILLIC SMALL LETTER E
      DD |  00000449 | CYRILLIC SMALL LETTER SHCHA
      DE |  00000447 | CYRILLIC SMALL LETTER CHE
      DF |  0000044A | CYRILLIC SMALL LETTER HARD SIGN
      E0 |  0000042E | CYRILLIC CAPITAL LETTER YU
      E1 |  00000410 | CYRILLIC CAPITAL LETTER A
      E2 |  00000411 | CYRILLIC CAPITAL LETTER BE
      E3 |  00000426 | CYRILLIC CAPITAL LETTER TSE
      E4 |  00000414 | CYRILLIC CAPITAL LETTER DE
      E5 |  00000415 | CYRILLIC CAPITAL LETTER IE
      E6 |  00000424 | CYRILLIC CAPITAL LETTER EF
      E7 |  00000413 | CYRILLIC CAPITAL LETTER GHE
      E8 |  00000425 | CYRILLIC CAPITAL LETTER HA
      E9 |  00000418 | CYRILLIC CAPITAL LETTER I
      EA |  00000419 | CYRILLIC CAPITAL LETTER SHORT I
      EB |  0000041A | CYRILLIC CAPITAL LETTER KA
      EC |  0000041B | CYRILLIC CAPITAL LETTER EL
      ED |  0000041C | CYRILLIC CAPITAL LETTER EM
      EE |  0000041D | CYRILLIC CAPITAL LETTER EN
      EF |  0000041E | CYRILLIC CAPITAL LETTER O
      F0 |  0000041F | CYRILLIC CAPITAL LETTER PE
      F1 |  0000042F | CYRILLIC CAPITAL LETTER YA
      F2 |  00000420 | CYRILLIC CAPITAL LETTER ER
      F3 |  00000421 | CYRILLIC CAPITAL LETTER ES
      F4 |  00000422 | CYRILLIC CAPITAL LETTER TE
      F5 |  00000423 | CYRILLIC CAPITAL LETTER U
      F6 |  00000416 | CYRILLIC CAPITAL LETTER ZHE
      F7 |  00000412 | CYRILLIC CAPITAL LETTER VE
      F8 |  0000042C | CYRILLIC CAPITAL LETTER SOFT SIGN
      F9 |  0000042B | CYRILLIC CAPITAL LETTER YERU
      FA |  00000417 | CYRILLIC CAPITAL LETTER ZE
      FB |  00000428 | CYRILLIC CAPITAL LETTER SHA
      FC |  0000042D | CYRILLIC CAPITAL LETTER E
      FD |  00000429 | CYRILLIC CAPITAL LETTER SHCHA
      FE |  00000427 | CYRILLIC CAPITAL LETTER CHE
      FF |  0000042A | CYRILLIC CAPITAL LETTER HARD SIGN
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_KOI8_RU

    $main::fatpacked{"Locale/RecodeData/KOI8_T.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_KOI8_T';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for KOI8-T.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::KOI8_T;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0x049b,
      0x0493,
      0x201a,
      0x0492,
      0x201e,
      0x2026,
      0x2020,
      0x2021,
      0xfffd,
      0x2030,
      0x04b3,
      0x2039,
      0x04b2,
      0x04b7,
      0x04b6,
      0xfffd,
      0x049a,
      0x2018,
      0x2019,
      0x201c,
      0x201d,
      0x2022,
      0x2013,
      0x2014,
      0xfffd,
      0x2122,
      0xfffd,
      0x203a,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x04ef,
      0x04ee,
      0x0451,
      0x00a4,
      0x04e3,
      0x00a6,
      0x00a7,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00ab,
      0x00ac,
      0x00ad,
      0x00ae,
      0xfffd,
      0x00b0,
      0x00b1,
      0x00b2,
      0x0401,
      0xfffd,
      0x04e2,
      0x00b6,
      0x00b7,
      0xfffd,
      0x2116,
      0xfffd,
      0x00bb,
      0xfffd,
      0xfffd,
      0xfffd,
      0x00a9,
      0x044e,
      0x0430,
      0x0431,
      0x0446,
      0x0434,
      0x0435,
      0x0444,
      0x0433,
      0x0445,
      0x0438,
      0x0439,
      0x043a,
      0x043b,
      0x043c,
      0x043d,
      0x043e,
      0x043f,
      0x044f,
      0x0440,
      0x0441,
      0x0442,
      0x0443,
      0x0436,
      0x0432,
      0x044c,
      0x044b,
      0x0437,
      0x0448,
      0x044d,
      0x0449,
      0x0447,
      0x044a,
      0x042e,
      0x0410,
      0x0411,
      0x0426,
      0x0414,
      0x0415,
      0x0424,
      0x0413,
      0x0425,
      0x0418,
      0x0419,
      0x041a,
      0x041b,
      0x041c,
      0x041d,
      0x041e,
      0x041f,
      0x042f,
      0x0420,
      0x0421,
      0x0422,
      0x0423,
      0x0416,
      0x0412,
      0x042c,
      0x042b,
      0x0417,
      0x0428,
      0x042d,
      0x0429,
      0x0427,
      0x042a,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xd2\x9b",
      "\xd2\x93",
      "\xe2\x80\x9a",
      "\xd2\x92",
      "\xe2\x80\x9e",
      "\xe2\x80\xa6",
      "\xe2\x80\xa0",
      "\xe2\x80\xa1",
      "\xef\xbf\xbd",
      "\xe2\x80\xb0",
      "\xd2\xb3",
      "\xe2\x80\xb9",
      "\xd2\xb2",
      "\xd2\xb7",
      "\xd2\xb6",
      "\xef\xbf\xbd",
      "\xd2\x9a",
      "\xe2\x80\x98",
      "\xe2\x80\x99",
      "\xe2\x80\x9c",
      "\xe2\x80\x9d",
      "\xe2\x80\xa2",
      "\xe2\x80\x93",
      "\xe2\x80\x94",
      "\xef\xbf\xbd",
      "\xe2\x84\xa2",
      "\xef\xbf\xbd",
      "\xe2\x80\xba",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xd3\xaf",
      "\xd3\xae",
      "\xd1\x91",
      "\xc2\xa4",
      "\xd3\xa3",
      "\xc2\xa6",
      "\xc2\xa7",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc2\xab",
      "\xc2\xac",
      "\xc2\xad",
      "\xc2\xae",
      "\xef\xbf\xbd",
      "\xc2\xb0",
      "\xc2\xb1",
      "\xc2\xb2",
      "\xd0\x81",
      "\xef\xbf\xbd",
      "\xd3\xa2",
      "\xc2\xb6",
      "\xc2\xb7",
      "\xef\xbf\xbd",
      "\xe2\x84\x96",
      "\xef\xbf\xbd",
      "\xc2\xbb",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc2\xa9",
      "\xd1\x8e",
      "\xd0\xb0",
      "\xd0\xb1",
      "\xd1\x86",
      "\xd0\xb4",
      "\xd0\xb5",
      "\xd1\x84",
      "\xd0\xb3",
      "\xd1\x85",
      "\xd0\xb8",
      "\xd0\xb9",
      "\xd0\xba",
      "\xd0\xbb",
      "\xd0\xbc",
      "\xd0\xbd",
      "\xd0\xbe",
      "\xd0\xbf",
      "\xd1\x8f",
      "\xd1\x80",
      "\xd1\x81",
      "\xd1\x82",
      "\xd1\x83",
      "\xd0\xb6",
      "\xd0\xb2",
      "\xd1\x8c",
      "\xd1\x8b",
      "\xd0\xb7",
      "\xd1\x88",
      "\xd1\x8d",
      "\xd1\x89",
      "\xd1\x87",
      "\xd1\x8a",
      "\xd0\xae",
      "\xd0\x90",
      "\xd0\x91",
      "\xd0\xa6",
      "\xd0\x94",
      "\xd0\x95",
      "\xd0\xa4",
      "\xd0\x93",
      "\xd0\xa5",
      "\xd0\x98",
      "\xd0\x99",
      "\xd0\x9a",
      "\xd0\x9b",
      "\xd0\x9c",
      "\xd0\x9d",
      "\xd0\x9e",
      "\xd0\x9f",
      "\xd0\xaf",
      "\xd0\xa0",
      "\xd0\xa1",
      "\xd0\xa2",
      "\xd0\xa3",
      "\xd0\x96",
      "\xd0\x92",
      "\xd0\xac",
      "\xd0\xab",
      "\xd0\x97",
      "\xd0\xa8",
      "\xd0\xad",
      "\xd0\xa9",
      "\xd0\xa7",
      "\xd0\xaa",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x000000a4 => "\xa4",
      0x000000a6 => "\xa6",
      0x000000a7 => "\xa7",
      0x000000a9 => "\xbf",
      0x000000ab => "\xab",
      0x000000ac => "\xac",
      0x000000ad => "\xad",
      0x000000ae => "\xae",
      0x000000b0 => "\xb0",
      0x000000b1 => "\xb1",
      0x000000b2 => "\xb2",
      0x000000b6 => "\xb6",
      0x000000b7 => "\xb7",
      0x000000bb => "\xbb",
      0x00000401 => "\xb3",
      0x00000410 => "\xe1",
      0x00000411 => "\xe2",
      0x00000412 => "\xf7",
      0x00000413 => "\xe7",
      0x00000414 => "\xe4",
      0x00000415 => "\xe5",
      0x00000416 => "\xf6",
      0x00000417 => "\xfa",
      0x00000418 => "\xe9",
      0x00000419 => "\xea",
      0x0000041a => "\xeb",
      0x0000041b => "\xec",
      0x0000041c => "\xed",
      0x0000041d => "\xee",
      0x0000041e => "\xef",
      0x0000041f => "\xf0",
      0x00000420 => "\xf2",
      0x00000421 => "\xf3",
      0x00000422 => "\xf4",
      0x00000423 => "\xf5",
      0x00000424 => "\xe6",
      0x00000425 => "\xe8",
      0x00000426 => "\xe3",
      0x00000427 => "\xfe",
      0x00000428 => "\xfb",
      0x00000429 => "\xfd",
      0x0000042a => "\xff",
      0x0000042b => "\xf9",
      0x0000042c => "\xf8",
      0x0000042d => "\xfc",
      0x0000042e => "\xe0",
      0x0000042f => "\xf1",
      0x00000430 => "\xc1",
      0x00000431 => "\xc2",
      0x00000432 => "\xd7",
      0x00000433 => "\xc7",
      0x00000434 => "\xc4",
      0x00000435 => "\xc5",
      0x00000436 => "\xd6",
      0x00000437 => "\xda",
      0x00000438 => "\xc9",
      0x00000439 => "\xca",
      0x0000043a => "\xcb",
      0x0000043b => "\xcc",
      0x0000043c => "\xcd",
      0x0000043d => "\xce",
      0x0000043e => "\xcf",
      0x0000043f => "\xd0",
      0x00000440 => "\xd2",
      0x00000441 => "\xd3",
      0x00000442 => "\xd4",
      0x00000443 => "\xd5",
      0x00000444 => "\xc6",
      0x00000445 => "\xc8",
      0x00000446 => "\xc3",
      0x00000447 => "\xde",
      0x00000448 => "\xdb",
      0x00000449 => "\xdd",
      0x0000044a => "\xdf",
      0x0000044b => "\xd9",
      0x0000044c => "\xd8",
      0x0000044d => "\xdc",
      0x0000044e => "\xc0",
      0x0000044f => "\xd1",
      0x00000451 => "\xa3",
      0x00000492 => "\x83",
      0x00000493 => "\x81",
      0x0000049a => "\x90",
      0x0000049b => "\x80",
      0x000004b2 => "\x8c",
      0x000004b3 => "\x8a",
      0x000004b6 => "\x8e",
      0x000004b7 => "\x8d",
      0x000004e2 => "\xb5",
      0x000004e3 => "\xa5",
      0x000004ee => "\xa2",
      0x000004ef => "\xa1",
      0x00002013 => "\x96",
      0x00002014 => "\x97",
      0x00002018 => "\x91",
      0x00002019 => "\x92",
      0x0000201a => "\x82",
      0x0000201c => "\x93",
      0x0000201d => "\x94",
      0x0000201e => "\x84",
      0x00002020 => "\x86",
      0x00002021 => "\x87",
      0x00002022 => "\x95",
      0x00002026 => "\x85",
      0x00002030 => "\x89",
      0x00002039 => "\x8b",
      0x0000203a => "\x9b",
      0x00002116 => "\xb9",
      0x00002122 => "\x99",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::KOI8_T - Conversion routines for KOI8-T
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for KOI8-T.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   Author: Michael Davis E<lt>tajik_fonts@iname.comE<gt>
   URL:    http://www.traveltajikistan.com/fonts
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL
      01 |  00000001 | START OF HEADING
      02 |  00000002 | START OF TEXT
      03 |  00000003 | END OF TEXT
      04 |  00000004 | END OF TRANSMISSION
      05 |  00000005 | ENQUIRY
      06 |  00000006 | ACKNOWLEDGE
      07 |  00000007 | BELL
      08 |  00000008 | BACKSPACE
      09 |  00000009 | HORIZONTAL TABULATION
      0A |  0000000A | LINE FEED
      0B |  0000000B | VERTICAL TABULATION
      0C |  0000000C | FORM FEED
      0D |  0000000D | CARRIAGE RETURN
      0E |  0000000E | SHIFT OUT
      0F |  0000000F | SHIFT IN
      10 |  00000010 | DATA LINK ESCAPE
      11 |  00000011 | DEVICE CONTROL ONE
      12 |  00000012 | DEVICE CONTROL TWO
      13 |  00000013 | DEVICE CONTROL THREE
      14 |  00000014 | DEVICE CONTROL FOUR
      15 |  00000015 | NEGATIVE ACKNOWLEDGE
      16 |  00000016 | SYNCHRONOUS IDLE
      17 |  00000017 | END OF TRANSMISSION BLOCK
      18 |  00000018 | CANCEL
      19 |  00000019 | END OF MEDIUM
      1A |  0000001A | SUBSTITUTE
      1B |  0000001B | ESCAPE
      1C |  0000001C | FILE SEPARATOR
      1D |  0000001D | GROUP SEPARATOR
      1E |  0000001E | RECORD SEPARATOR
      1F |  0000001F | UNIT SEPARATOR
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE
      80 |  0000049B | CYRILLIC SMALL LETTER KA WITH DESCENDER
      81 |  00000493 | CYRILLIC SMALL LETTER GHE WITH STROKE
      82 |  0000201A | SINGLE LOW-9 QUOTATION MARK
      83 |  00000492 | CYRILLIC CAPITAL LETTER GHE WITH STROKE
      84 |  0000201E | DOUBLE LOW-9 QUOTATION MARK
      85 |  00002026 | HORIZONTAL ELLIPSIS
      86 |  00002020 | DAGGER
      87 |  00002021 | DOUBLE DAGGER
      89 |  00002030 | PER MILLE SIGN
      8A |  000004B3 | CYRILLIC SMALL LETTER HA WITH DESCENDER
      8B |  00002039 | SINGLE LEFT-POINTING ANGLE QUOTATION MARK
      8C |  000004B2 | CYRILLIC CAPITAL LETTER HA WITH DESCENDER
      8D |  000004B7 | CYRILLIC SMALL LETTER CHE WITH DESCENDER
      8E |  000004B6 | CYRILLIC CAPITAL LETTER CHE WITH DESCENDER
      90 |  0000049A | CYRILLIC CAPITAL LETTER KA WITH DESCENDER
      91 |  00002018 | LEFT SINGLE QUOTATION MARK
      92 |  00002019 | RIGHT SINGLE QUOTATION MARK
      93 |  0000201C | LEFT DOUBLE QUOTATION MARK
      94 |  0000201D | RIGHT DOUBLE QUOTATION MARK
      95 |  00002022 | BULLET
      96 |  00002013 | EN DASH
      97 |  00002014 | EM DASH
      99 |  00002122 | TRADE MARK SIGN
      9B |  0000203A | SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
      A1 |  000004EF | CYRILLIC SMALL LETTER U WITH MACRON
      A2 |  000004EE | CYRILLIC CAPITAL LETTER U WITH MACRON
      A3 |  00000451 | CYRILLIC SMALL LETTER IO
      A4 |  000000A4 | CURRENCY SIGN
      A5 |  000004E3 | CYRILLIC SMALL LETTER I WITH MACRON
      A6 |  000000A6 | BROKEN BAR
      A7 |  000000A7 | SECTION SIGN
      AB |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
      AC |  000000AC | NOT SIGN
      AD |  000000AD | SOFT HYPHEN
      AE |  000000AE | REGISTERED SIGN
      B0 |  000000B0 | DEGREE SIGN
      B1 |  000000B1 | PLUS-MINUS SIGN
      B2 |  000000B2 | SUPERSCRIPT TWO
      B3 |  00000401 | CYRILLIC CAPITAL LETTER IE
      B5 |  000004E2 | CYRILLIC CAPITAL LETTER I WITH MACRON
      B6 |  000000B6 | PILCROW SIGN
      B7 |  000000B7 | MIDDLE DOT
      B9 |  00002116 | NUMERO SIGN
      BB |  000000BB | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
      BF |  000000A9 | COPYRIGHT SIGN
      C0 |  0000044E | CYRILLIC SMALL LETTER YU
      C1 |  00000430 | CYRILLIC SMALL LETTER A
      C2 |  00000431 | CYRILLIC SMALL LETTER BE
      C3 |  00000446 | CYRILLIC SMALL LETTER TSE
      C4 |  00000434 | CYRILLIC SMALL LETTER DE
      C5 |  00000435 | CYRILLIC SMALL LETTER IE
      C6 |  00000444 | CYRILLIC SMALL LETTER EF
      C7 |  00000433 | CYRILLIC SMALL LETTER GHE
      C8 |  00000445 | CYRILLIC SMALL LETTER HA
      C9 |  00000438 | CYRILLIC SMALL LETTER I
      CA |  00000439 | CYRILLIC SMALL LETTER SHORT I
      CB |  0000043A | CYRILLIC SMALL LETTER KA
      CC |  0000043B | CYRILLIC SMALL LETTER EL
      CD |  0000043C | CYRILLIC SMALL LETTER EM
      CE |  0000043D | CYRILLIC SMALL LETTER EN
      CF |  0000043E | CYRILLIC SMALL LETTER O
      D0 |  0000043F | CYRILLIC SMALL LETTER PE
      D1 |  0000044F | CYRILLIC SMALL LETTER YA
      D2 |  00000440 | CYRILLIC SMALL LETTER ER
      D3 |  00000441 | CYRILLIC SMALL LETTER ES
      D4 |  00000442 | CYRILLIC SMALL LETTER TE
      D5 |  00000443 | CYRILLIC SMALL LETTER U
      D6 |  00000436 | CYRILLIC SMALL LETTER ZHE
      D7 |  00000432 | CYRILLIC SMALL LETTER VE
      D8 |  0000044C | CYRILLIC SMALL LETTER SOFT SIGN
      D9 |  0000044B | CYRILLIC SMALL LETTER YERU
      DA |  00000437 | CYRILLIC SMALL LETTER ZE
      DB |  00000448 | CYRILLIC SMALL LETTER SHA
      DC |  0000044D | CYRILLIC SMALL LETTER E
      DD |  00000449 | CYRILLIC SMALL LETTER SHCHA
      DE |  00000447 | CYRILLIC SMALL LETTER CHE
      DF |  0000044A | CYRILLIC SMALL LETTER HARD SIGN
      E0 |  0000042E | CYRILLIC CAPITAL LETTER YU
      E1 |  00000410 | CYRILLIC CAPITAL LETTER A
      E2 |  00000411 | CYRILLIC CAPITAL LETTER BE
      E3 |  00000426 | CYRILLIC CAPITAL LETTER TSE
      E4 |  00000414 | CYRILLIC CAPITAL LETTER DE
      E5 |  00000415 | CYRILLIC CAPITAL LETTER IE
      E6 |  00000424 | CYRILLIC CAPITAL LETTER EF
      E7 |  00000413 | CYRILLIC CAPITAL LETTER GHE
      E8 |  00000425 | CYRILLIC CAPITAL LETTER HA
      E9 |  00000418 | CYRILLIC CAPITAL LETTER I
      EA |  00000419 | CYRILLIC CAPITAL LETTER SHORT I
      EB |  0000041A | CYRILLIC CAPITAL LETTER KA
      EC |  0000041B | CYRILLIC CAPITAL LETTER EL
      ED |  0000041C | CYRILLIC CAPITAL LETTER EM
      EE |  0000041D | CYRILLIC CAPITAL LETTER EN
      EF |  0000041E | CYRILLIC CAPITAL LETTER O
      F0 |  0000041F | CYRILLIC CAPITAL LETTER PE
      F1 |  0000042F | CYRILLIC CAPITAL LETTER YA
      F2 |  00000420 | CYRILLIC CAPITAL LETTER ER
      F3 |  00000421 | CYRILLIC CAPITAL LETTER ES
      F4 |  00000422 | CYRILLIC CAPITAL LETTER TE
      F5 |  00000423 | CYRILLIC CAPITAL LETTER U
      F6 |  00000416 | CYRILLIC CAPITAL LETTER ZHE
      F7 |  00000412 | CYRILLIC CAPITAL LETTER VE
      F8 |  0000042C | CYRILLIC CAPITAL LETTER SOFT SIGN
      F9 |  0000042B | CYRILLIC CAPITAL LETTER YERU
      FA |  00000417 | CYRILLIC CAPITAL LETTER ZE
      FB |  00000428 | CYRILLIC CAPITAL LETTER SHA
      FC |  0000042D | CYRILLIC CAPITAL LETTER E
      FD |  00000429 | CYRILLIC CAPITAL LETTER SHCHA
      FE |  00000427 | CYRILLIC CAPITAL LETTER CHE
      FF |  0000042A | CYRILLIC CAPITAL LETTER HARD SIGN
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_KOI8_T

    $main::fatpacked{"Locale/RecodeData/KOI8_U.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_KOI8_U';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for KOI8-U.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::KOI8_U;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0x2500,
      0x2502,
      0x250c,
      0x2510,
      0x2514,
      0x2518,
      0x251c,
      0x2524,
      0x252c,
      0x2534,
      0x253c,
      0x2580,
      0x2584,
      0x2588,
      0x258c,
      0x2590,
      0x2591,
      0x2592,
      0x2593,
      0x2320,
      0x25a0,
      0x2219,
      0x221a,
      0x2248,
      0x2264,
      0x2265,
      0x00a0,
      0x2321,
      0x00b0,
      0x00b2,
      0x00b7,
      0x00f7,
      0x2550,
      0x2551,
      0x2552,
      0x0451,
      0x0454,
      0x2554,
      0x0456,
      0x0457,
      0x2557,
      0x2558,
      0x2559,
      0x255a,
      0x255b,
      0x0491,
      0x255d,
      0x255e,
      0x255f,
      0x2560,
      0x2561,
      0x0401,
      0x0404,
      0x2563,
      0x0406,
      0x0407,
      0x2566,
      0x2567,
      0x2568,
      0x2569,
      0x256a,
      0x0490,
      0x256c,
      0x00a9,
      0x044e,
      0x0430,
      0x0431,
      0x0446,
      0x0434,
      0x0435,
      0x0444,
      0x0433,
      0x0445,
      0x0438,
      0x0439,
      0x043a,
      0x043b,
      0x043c,
      0x043d,
      0x043e,
      0x043f,
      0x044f,
      0x0440,
      0x0441,
      0x0442,
      0x0443,
      0x0436,
      0x0432,
      0x044c,
      0x044b,
      0x0437,
      0x0448,
      0x044d,
      0x0449,
      0x0447,
      0x044a,
      0x042e,
      0x0410,
      0x0411,
      0x0426,
      0x0414,
      0x0415,
      0x0424,
      0x0413,
      0x0425,
      0x0418,
      0x0419,
      0x041a,
      0x041b,
      0x041c,
      0x041d,
      0x041e,
      0x041f,
      0x042f,
      0x0420,
      0x0421,
      0x0422,
      0x0423,
      0x0416,
      0x0412,
      0x042c,
      0x042b,
      0x0417,
      0x0428,
      0x042d,
      0x0429,
      0x0427,
      0x042a,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xe2\x94\x80",
      "\xe2\x94\x82",
      "\xe2\x94\x8c",
      "\xe2\x94\x90",
      "\xe2\x94\x94",
      "\xe2\x94\x98",
      "\xe2\x94\x9c",
      "\xe2\x94\xa4",
      "\xe2\x94\xac",
      "\xe2\x94\xb4",
      "\xe2\x94\xbc",
      "\xe2\x96\x80",
      "\xe2\x96\x84",
      "\xe2\x96\x88",
      "\xe2\x96\x8c",
      "\xe2\x96\x90",
      "\xe2\x96\x91",
      "\xe2\x96\x92",
      "\xe2\x96\x93",
      "\xe2\x8c\xa0",
      "\xe2\x96\xa0",
      "\xe2\x88\x99",
      "\xe2\x88\x9a",
      "\xe2\x89\x88",
      "\xe2\x89\xa4",
      "\xe2\x89\xa5",
      "\xc2\xa0",
      "\xe2\x8c\xa1",
      "\xc2\xb0",
      "\xc2\xb2",
      "\xc2\xb7",
      "\xc3\xb7",
      "\xe2\x95\x90",
      "\xe2\x95\x91",
      "\xe2\x95\x92",
      "\xd1\x91",
      "\xd1\x94",
      "\xe2\x95\x94",
      "\xd1\x96",
      "\xd1\x97",
      "\xe2\x95\x97",
      "\xe2\x95\x98",
      "\xe2\x95\x99",
      "\xe2\x95\x9a",
      "\xe2\x95\x9b",
      "\xd2\x91",
      "\xe2\x95\x9d",
      "\xe2\x95\x9e",
      "\xe2\x95\x9f",
      "\xe2\x95\xa0",
      "\xe2\x95\xa1",
      "\xd0\x81",
      "\xd0\x84",
      "\xe2\x95\xa3",
      "\xd0\x86",
      "\xd0\x87",
      "\xe2\x95\xa6",
      "\xe2\x95\xa7",
      "\xe2\x95\xa8",
      "\xe2\x95\xa9",
      "\xe2\x95\xaa",
      "\xd2\x90",
      "\xe2\x95\xac",
      "\xc2\xa9",
      "\xd1\x8e",
      "\xd0\xb0",
      "\xd0\xb1",
      "\xd1\x86",
      "\xd0\xb4",
      "\xd0\xb5",
      "\xd1\x84",
      "\xd0\xb3",
      "\xd1\x85",
      "\xd0\xb8",
      "\xd0\xb9",
      "\xd0\xba",
      "\xd0\xbb",
      "\xd0\xbc",
      "\xd0\xbd",
      "\xd0\xbe",
      "\xd0\xbf",
      "\xd1\x8f",
      "\xd1\x80",
      "\xd1\x81",
      "\xd1\x82",
      "\xd1\x83",
      "\xd0\xb6",
      "\xd0\xb2",
      "\xd1\x8c",
      "\xd1\x8b",
      "\xd0\xb7",
      "\xd1\x88",
      "\xd1\x8d",
      "\xd1\x89",
      "\xd1\x87",
      "\xd1\x8a",
      "\xd0\xae",
      "\xd0\x90",
      "\xd0\x91",
      "\xd0\xa6",
      "\xd0\x94",
      "\xd0\x95",
      "\xd0\xa4",
      "\xd0\x93",
      "\xd0\xa5",
      "\xd0\x98",
      "\xd0\x99",
      "\xd0\x9a",
      "\xd0\x9b",
      "\xd0\x9c",
      "\xd0\x9d",
      "\xd0\x9e",
      "\xd0\x9f",
      "\xd0\xaf",
      "\xd0\xa0",
      "\xd0\xa1",
      "\xd0\xa2",
      "\xd0\xa3",
      "\xd0\x96",
      "\xd0\x92",
      "\xd0\xac",
      "\xd0\xab",
      "\xd0\x97",
      "\xd0\xa8",
      "\xd0\xad",
      "\xd0\xa9",
      "\xd0\xa7",
      "\xd0\xaa",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x000000a0 => "\x9a",
      0x000000a9 => "\xbf",
      0x000000b0 => "\x9c",
      0x000000b2 => "\x9d",
      0x000000b7 => "\x9e",
      0x000000f7 => "\x9f",
      0x00000401 => "\xb3",
      0x00000404 => "\xb4",
      0x00000406 => "\xb6",
      0x00000407 => "\xb7",
      0x00000410 => "\xe1",
      0x00000411 => "\xe2",
      0x00000412 => "\xf7",
      0x00000413 => "\xe7",
      0x00000414 => "\xe4",
      0x00000415 => "\xe5",
      0x00000416 => "\xf6",
      0x00000417 => "\xfa",
      0x00000418 => "\xe9",
      0x00000419 => "\xea",
      0x0000041a => "\xeb",
      0x0000041b => "\xec",
      0x0000041c => "\xed",
      0x0000041d => "\xee",
      0x0000041e => "\xef",
      0x0000041f => "\xf0",
      0x00000420 => "\xf2",
      0x00000421 => "\xf3",
      0x00000422 => "\xf4",
      0x00000423 => "\xf5",
      0x00000424 => "\xe6",
      0x00000425 => "\xe8",
      0x00000426 => "\xe3",
      0x00000427 => "\xfe",
      0x00000428 => "\xfb",
      0x00000429 => "\xfd",
      0x0000042a => "\xff",
      0x0000042b => "\xf9",
      0x0000042c => "\xf8",
      0x0000042d => "\xfc",
      0x0000042e => "\xe0",
      0x0000042f => "\xf1",
      0x00000430 => "\xc1",
      0x00000431 => "\xc2",
      0x00000432 => "\xd7",
      0x00000433 => "\xc7",
      0x00000434 => "\xc4",
      0x00000435 => "\xc5",
      0x00000436 => "\xd6",
      0x00000437 => "\xda",
      0x00000438 => "\xc9",
      0x00000439 => "\xca",
      0x0000043a => "\xcb",
      0x0000043b => "\xcc",
      0x0000043c => "\xcd",
      0x0000043d => "\xce",
      0x0000043e => "\xcf",
      0x0000043f => "\xd0",
      0x00000440 => "\xd2",
      0x00000441 => "\xd3",
      0x00000442 => "\xd4",
      0x00000443 => "\xd5",
      0x00000444 => "\xc6",
      0x00000445 => "\xc8",
      0x00000446 => "\xc3",
      0x00000447 => "\xde",
      0x00000448 => "\xdb",
      0x00000449 => "\xdd",
      0x0000044a => "\xdf",
      0x0000044b => "\xd9",
      0x0000044c => "\xd8",
      0x0000044d => "\xdc",
      0x0000044e => "\xc0",
      0x0000044f => "\xd1",
      0x00000451 => "\xa3",
      0x00000454 => "\xa4",
      0x00000456 => "\xa6",
      0x00000457 => "\xa7",
      0x00000490 => "\xbd",
      0x00000491 => "\xad",
      0x00002219 => "\x95",
      0x0000221a => "\x96",
      0x00002248 => "\x97",
      0x00002264 => "\x98",
      0x00002265 => "\x99",
      0x00002320 => "\x93",
      0x00002321 => "\x9b",
      0x00002500 => "\x80",
      0x00002502 => "\x81",
      0x0000250c => "\x82",
      0x00002510 => "\x83",
      0x00002514 => "\x84",
      0x00002518 => "\x85",
      0x0000251c => "\x86",
      0x00002524 => "\x87",
      0x0000252c => "\x88",
      0x00002534 => "\x89",
      0x0000253c => "\x8a",
      0x00002550 => "\xa0",
      0x00002551 => "\xa1",
      0x00002552 => "\xa2",
      0x00002554 => "\xa5",
      0x00002557 => "\xa8",
      0x00002558 => "\xa9",
      0x00002559 => "\xaa",
      0x0000255a => "\xab",
      0x0000255b => "\xac",
      0x0000255d => "\xae",
      0x0000255e => "\xaf",
      0x0000255f => "\xb0",
      0x00002560 => "\xb1",
      0x00002561 => "\xb2",
      0x00002563 => "\xb5",
      0x00002566 => "\xb8",
      0x00002567 => "\xb9",
      0x00002568 => "\xba",
      0x00002569 => "\xbb",
      0x0000256a => "\xbc",
      0x0000256c => "\xbe",
      0x00002580 => "\x8b",
      0x00002584 => "\x8c",
      0x00002588 => "\x8d",
      0x0000258c => "\x8e",
      0x00002590 => "\x8f",
      0x00002591 => "\x90",
      0x00002592 => "\x91",
      0x00002593 => "\x92",
      0x000025a0 => "\x94",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::KOI8_U - Conversion routines for KOI8-U
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for KOI8-U.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.1
    source: RFC 2319
    source: http://www.net.ua/KOI8-U/
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE (DEL)
      80 |  00002500 | BOX DRAWINGS LIGHT HORIZONTAL
      81 |  00002502 | BOX DRAWINGS LIGHT VERTICAL
      82 |  0000250C | BOX DRAWINGS LIGHT DOWN AND RIGHT
      83 |  00002510 | BOX DRAWINGS LIGHT DOWN AND LEFT
      84 |  00002514 | BOX DRAWINGS LIGHT UP AND RIGHT
      85 |  00002518 | BOX DRAWINGS LIGHT UP AND LEFT
      86 |  0000251C | BOX DRAWINGS LIGHT VERTICAL AND RIGHT
      87 |  00002524 | BOX DRAWINGS LIGHT VERTICAL AND LEFT
      88 |  0000252C | BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
      89 |  00002534 | BOX DRAWINGS LIGHT UP AND HORIZONTAL
      8A |  0000253C | BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
      8B |  00002580 | UPPER HALF BLOCK
      8C |  00002584 | LOWER HALF BLOCK
      8D |  00002588 | FULL BLOCK
      8E |  0000258C | LEFT HALF BLOCK
      8F |  00002590 | RIGHT HALF BLOCK
      90 |  00002591 | LIGHT SHADE
      91 |  00002592 | MEDIUM SHADE
      92 |  00002593 | DARK SHADE
      93 |  00002320 | TOP HALF INTEGRAL
      94 |  000025A0 | BLACK SQUARE
      95 |  00002219 | BULLET OPERATOR
      96 |  0000221A | SQUARE ROOT
      97 |  00002248 | ALMOST EQUAL TO
      98 |  00002264 | LESS THAN OR EQUAL TO
      99 |  00002265 | GREATER THAN OR EQUAL TO
      9A |  000000A0 | NO-BREAK SPACE
      9B |  00002321 | BOTTOM HALF INTEGRAL
      9C |  000000B0 | DEGREE SIGN
      9D |  000000B2 | SUPERSCRIPT DIGIT TWO
      9E |  000000B7 | MIDDLE DOT
      9F |  000000F7 | DIVISION SIGN
      A0 |  00002550 | BOX DRAWINGS DOUBLE HORIZONTAL
      A1 |  00002551 | BOX DRAWINGS DOUBLE VERTICAL
      A2 |  00002552 | BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
      A3 |  00000451 | CYRILLIC SMALL LETTER IO
      A4 |  00000454 | CYRILLIC SMALL LETTER UKRAINIAN IE
      A5 |  00002554 | BOX DRAWINGS DOUBLE DOWN AND RIGHT
      A6 |  00000456 | CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
      A7 |  00000457 | CYRILLIC SMALL LETTER YI (Ukrainian)
      A8 |  00002557 | BOX DRAWINGS DOUBLE DOWN AND LEFT
      A9 |  00002558 | BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
      AA |  00002559 | BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
      AB |  0000255A | BOX DRAWINGS DOUBLE UP AND RIGHT
      AC |  0000255B | BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
      AD |  00000491 | CYRILLIC SMALL LETTER GHE WITH UPTURN
      AE |  0000255D | BOX DRAWINGS  DOUBLE UP AND LEFT
      AF |  0000255E | BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
      B0 |  0000255F | BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
      B1 |  00002560 | BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
      B2 |  00002561 | BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
      B3 |  00000401 | CYRILLIC CAPITAL LETTER IO
      B4 |  00000404 | CYRILLIC CAPITAL LETTER UKRAINIAN IE
      B5 |  00002563 | DOUBLE VERTICAL AND LEFT
      B6 |  00000406 | CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
      B7 |  00000407 | CYRILLIC CAPITAL LETTER YI (Ukrainian)
      B8 |  00002566 | BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
      B9 |  00002567 | BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
      BA |  00002568 | BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
      BB |  00002569 | BOX DRAWINGS DOUBLE UP AND HORIZONTAL
      BC |  0000256A | BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
      BD |  00000490 | CYRILLIC CAPITAL LETTER GHE WITH UPTURN
      BE |  0000256C | BOX DRAWINGS  DOUBLE VERTICAL AND HORIZONTAL
      BF |  000000A9 | COPYRIGHT SIGN
      C0 |  0000044E | CYRILLIC SMALL LETTER YU
      C1 |  00000430 | CYRILLIC SMALL LETTER A
      C2 |  00000431 | CYRILLIC SMALL LETTER BE
      C3 |  00000446 | CYRILLIC SMALL LETTER TSE
      C4 |  00000434 | CYRILLIC SMALL LETTER DE
      C5 |  00000435 | CYRILLIC SMALL LETTER IE
      C6 |  00000444 | CYRILLIC SMALL LETTER EF
      C7 |  00000433 | CYRILLIC SMALL LETTER GHE
      C8 |  00000445 | CYRILLIC SMALL LETTER HA
      C9 |  00000438 | CYRILLIC SMALL LETTER I
      CA |  00000439 | CYRILLIC SMALL LETTER SHORT I
      CB |  0000043A | CYRILLIC SMALL LETTER KA
      CC |  0000043B | CYRILLIC SMALL LETTER EL
      CD |  0000043C | CYRILLIC SMALL LETTER EM
      CE |  0000043D | CYRILLIC SMALL LETTER EN
      CF |  0000043E | CYRILLIC SMALL LETTER O
      D0 |  0000043F | CYRILLIC SMALL LETTER PE
      D1 |  0000044F | CYRILLIC SMALL LETTER YA
      D2 |  00000440 | CYRILLIC SMALL LETTER ER
      D3 |  00000441 | CYRILLIC SMALL LETTER ES
      D4 |  00000442 | CYRILLIC SMALL LETTER TE
      D5 |  00000443 | CYRILLIC SMALL LETTER U
      D6 |  00000436 | CYRILLIC SMALL LETTER ZHE
      D7 |  00000432 | CYRILLIC SMALL LETTER VE
      D8 |  0000044C | CYRILLIC SMALL LETTER SOFT SIGN
      D9 |  0000044B | CYRILLIC SMALL LETTER YERU
      DA |  00000437 | CYRILLIC SMALL LETTER ZE
      DB |  00000448 | CYRILLIC SMALL LETTER SHA
      DC |  0000044D | CYRILLIC SMALL LETTER E
      DD |  00000449 | CYRILLIC SMALL LETTER SHCHA
      DE |  00000447 | CYRILLIC SMALL LETTER CHE
      DF |  0000044A | CYRILLIC SMALL LETTER HARD SIGN
      E0 |  0000042E | CYRILLIC CAPITAL LETTER YU
      E1 |  00000410 | CYRILLIC CAPITAL LETTER A
      E2 |  00000411 | CYRILLIC CAPITAL LETTER BE
      E3 |  00000426 | CYRILLIC CAPITAL LETTER TSE
      E4 |  00000414 | CYRILLIC CAPITAL LETTER DE
      E5 |  00000415 | CYRILLIC CAPITAL LETTER IE
      E6 |  00000424 | CYRILLIC CAPITAL LETTER EF
      E7 |  00000413 | CYRILLIC CAPITAL LETTER GHE
      E8 |  00000425 | CYRILLIC CAPITAL LETTER HA
      E9 |  00000418 | CYRILLIC CAPITAL LETTER I
      EA |  00000419 | CYRILLIC CAPITAL LETTER SHORT I
      EB |  0000041A | CYRILLIC CAPITAL LETTER KA
      EC |  0000041B | CYRILLIC CAPITAL LETTER EL
      ED |  0000041C | CYRILLIC CAPITAL LETTER EM
      EE |  0000041D | CYRILLIC CAPITAL LETTER EN
      EF |  0000041E | CYRILLIC CAPITAL LETTER O
      F0 |  0000041F | CYRILLIC CAPITAL LETTER PE
      F1 |  0000042F | CYRILLIC CAPITAL LETTER YA
      F2 |  00000420 | CYRILLIC CAPITAL LETTER ER
      F3 |  00000421 | CYRILLIC CAPITAL LETTER ES
      F4 |  00000422 | CYRILLIC CAPITAL LETTER TE
      F5 |  00000423 | CYRILLIC CAPITAL LETTER U
      F6 |  00000416 | CYRILLIC CAPITAL LETTER ZHE
      F7 |  00000412 | CYRILLIC CAPITAL LETTER VE
      F8 |  0000042C | CYRILLIC CAPITAL LETTER SOFT SIGN
      F9 |  0000042B | CYRILLIC CAPITAL LETTER YERU
      FA |  00000417 | CYRILLIC CAPITAL LETTER ZE
      FB |  00000428 | CYRILLIC CAPITAL LETTER SHA
      FC |  0000042D | CYRILLIC CAPITAL LETTER E
      FD |  00000429 | CYRILLIC CAPITAL LETTER SHCHA
      FE |  00000427 | CYRILLIC CAPITAL LETTER CHE
      FF |  0000042A | CYRILLIC CAPITAL LETTER HARD SIGN
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_KOI8_U

    $main::fatpacked{"Locale/RecodeData/KOI_8.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_KOI_8';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for KOI-8.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::KOI_8;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x044e,
      0x0430,
      0x0431,
      0x0446,
      0x0434,
      0x0435,
      0x0444,
      0x0433,
      0x0445,
      0x0438,
      0x0439,
      0x043a,
      0x043b,
      0x043c,
      0x043d,
      0x043e,
      0x043f,
      0x044f,
      0x0440,
      0x0441,
      0x0442,
      0x0443,
      0x0436,
      0x0432,
      0x044c,
      0x044b,
      0x0437,
      0x0448,
      0x044d,
      0x0449,
      0x0447,
      0x044a,
      0x042e,
      0x0410,
      0x0411,
      0x0426,
      0x0414,
      0x0415,
      0x0424,
      0x0413,
      0x0425,
      0x0418,
      0x0419,
      0x041a,
      0x041b,
      0x041c,
      0x041d,
      0x041e,
      0x041f,
      0x042f,
      0x0420,
      0x0421,
      0x0422,
      0x0423,
      0x0416,
      0x0412,
      0x042c,
      0x042b,
      0x0417,
      0x0428,
      0x042d,
      0x0429,
      0x0427,
      0xfffd,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xd1\x8e",
      "\xd0\xb0",
      "\xd0\xb1",
      "\xd1\x86",
      "\xd0\xb4",
      "\xd0\xb5",
      "\xd1\x84",
      "\xd0\xb3",
      "\xd1\x85",
      "\xd0\xb8",
      "\xd0\xb9",
      "\xd0\xba",
      "\xd0\xbb",
      "\xd0\xbc",
      "\xd0\xbd",
      "\xd0\xbe",
      "\xd0\xbf",
      "\xd1\x8f",
      "\xd1\x80",
      "\xd1\x81",
      "\xd1\x82",
      "\xd1\x83",
      "\xd0\xb6",
      "\xd0\xb2",
      "\xd1\x8c",
      "\xd1\x8b",
      "\xd0\xb7",
      "\xd1\x88",
      "\xd1\x8d",
      "\xd1\x89",
      "\xd1\x87",
      "\xd1\x8a",
      "\xd0\xae",
      "\xd0\x90",
      "\xd0\x91",
      "\xd0\xa6",
      "\xd0\x94",
      "\xd0\x95",
      "\xd0\xa4",
      "\xd0\x93",
      "\xd0\xa5",
      "\xd0\x98",
      "\xd0\x99",
      "\xd0\x9a",
      "\xd0\x9b",
      "\xd0\x9c",
      "\xd0\x9d",
      "\xd0\x9e",
      "\xd0\x9f",
      "\xd0\xaf",
      "\xd0\xa0",
      "\xd0\xa1",
      "\xd0\xa2",
      "\xd0\xa3",
      "\xd0\x96",
      "\xd0\x92",
      "\xd0\xac",
      "\xd0\xab",
      "\xd0\x97",
      "\xd0\xa8",
      "\xd0\xad",
      "\xd0\xa9",
      "\xd0\xa7",
      "\xef\xbf\xbd",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x00000410 => "\xe1",
      0x00000411 => "\xe2",
      0x00000412 => "\xf7",
      0x00000413 => "\xe7",
      0x00000414 => "\xe4",
      0x00000415 => "\xe5",
      0x00000416 => "\xf6",
      0x00000417 => "\xfa",
      0x00000418 => "\xe9",
      0x00000419 => "\xea",
      0x0000041a => "\xeb",
      0x0000041b => "\xec",
      0x0000041c => "\xed",
      0x0000041d => "\xee",
      0x0000041e => "\xef",
      0x0000041f => "\xf0",
      0x00000420 => "\xf2",
      0x00000421 => "\xf3",
      0x00000422 => "\xf4",
      0x00000423 => "\xf5",
      0x00000424 => "\xe6",
      0x00000425 => "\xe8",
      0x00000426 => "\xe3",
      0x00000427 => "\xfe",
      0x00000428 => "\xfb",
      0x00000429 => "\xfd",
      0x0000042b => "\xf9",
      0x0000042c => "\xf8",
      0x0000042d => "\xfc",
      0x0000042e => "\xe0",
      0x0000042f => "\xf1",
      0x00000430 => "\xc1",
      0x00000431 => "\xc2",
      0x00000432 => "\xd7",
      0x00000433 => "\xc7",
      0x00000434 => "\xc4",
      0x00000435 => "\xc5",
      0x00000436 => "\xd6",
      0x00000437 => "\xda",
      0x00000438 => "\xc9",
      0x00000439 => "\xca",
      0x0000043a => "\xcb",
      0x0000043b => "\xcc",
      0x0000043c => "\xcd",
      0x0000043d => "\xce",
      0x0000043e => "\xcf",
      0x0000043f => "\xd0",
      0x00000440 => "\xd2",
      0x00000441 => "\xd3",
      0x00000442 => "\xd4",
      0x00000443 => "\xd5",
      0x00000444 => "\xc6",
      0x00000445 => "\xc8",
      0x00000446 => "\xc3",
      0x00000447 => "\xde",
      0x00000448 => "\xdb",
      0x00000449 => "\xdd",
      0x0000044a => "\xdf",
      0x0000044b => "\xd9",
      0x0000044c => "\xd8",
      0x0000044d => "\xdc",
      0x0000044e => "\xc0",
      0x0000044f => "\xd1",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::KOI_8 - Conversion routines for KOI-8
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for KOI-8.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: Andrey A. Chernov E<lt>ache@astral.msk.suE<gt>
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE (DEL)
      C0 |  0000044E | CYRILLIC SMALL LETTER YU
      C1 |  00000430 | CYRILLIC SMALL LETTER A
      C2 |  00000431 | CYRILLIC SMALL LETTER BE
      C3 |  00000446 | CYRILLIC SMALL LETTER TSE
      C4 |  00000434 | CYRILLIC SMALL LETTER DE
      C5 |  00000435 | CYRILLIC SMALL LETTER IE
      C6 |  00000444 | CYRILLIC SMALL LETTER EF
      C7 |  00000433 | CYRILLIC SMALL LETTER GHE
      C8 |  00000445 | CYRILLIC SMALL LETTER HA
      C9 |  00000438 | CYRILLIC SMALL LETTER I
      CA |  00000439 | CYRILLIC SMALL LETTER SHORT I
      CB |  0000043A | CYRILLIC SMALL LETTER KA
      CC |  0000043B | CYRILLIC SMALL LETTER EL
      CD |  0000043C | CYRILLIC SMALL LETTER EM
      CE |  0000043D | CYRILLIC SMALL LETTER EN
      CF |  0000043E | CYRILLIC SMALL LETTER O
      D0 |  0000043F | CYRILLIC SMALL LETTER PE
      D1 |  0000044F | CYRILLIC SMALL LETTER YA
      D2 |  00000440 | CYRILLIC SMALL LETTER ER
      D3 |  00000441 | CYRILLIC SMALL LETTER ES
      D4 |  00000442 | CYRILLIC SMALL LETTER TE
      D5 |  00000443 | CYRILLIC SMALL LETTER U
      D6 |  00000436 | CYRILLIC SMALL LETTER ZHE
      D7 |  00000432 | CYRILLIC SMALL LETTER VE
      D8 |  0000044C | CYRILLIC SMALL LETTER SOFT SIGN
      D9 |  0000044B | CYRILLIC SMALL LETTER YERU
      DA |  00000437 | CYRILLIC SMALL LETTER ZE
      DB |  00000448 | CYRILLIC SMALL LETTER SHA
      DC |  0000044D | CYRILLIC SMALL LETTER E
      DD |  00000449 | CYRILLIC SMALL LETTER SHCHA
      DE |  00000447 | CYRILLIC SMALL LETTER CHE
      DF |  0000044A | CYRILLIC SMALL LETTER HARD SIGN
      E0 |  0000042E | CYRILLIC CAPITAL LETTER YU
      E1 |  00000410 | CYRILLIC CAPITAL LETTER A
      E2 |  00000411 | CYRILLIC CAPITAL LETTER BE
      E3 |  00000426 | CYRILLIC CAPITAL LETTER TSE
      E4 |  00000414 | CYRILLIC CAPITAL LETTER DE
      E5 |  00000415 | CYRILLIC CAPITAL LETTER IE
      E6 |  00000424 | CYRILLIC CAPITAL LETTER EF
      E7 |  00000413 | CYRILLIC CAPITAL LETTER GHE
      E8 |  00000425 | CYRILLIC CAPITAL LETTER HA
      E9 |  00000418 | CYRILLIC CAPITAL LETTER I
      EA |  00000419 | CYRILLIC CAPITAL LETTER SHORT I
      EB |  0000041A | CYRILLIC CAPITAL LETTER KA
      EC |  0000041B | CYRILLIC CAPITAL LETTER EL
      ED |  0000041C | CYRILLIC CAPITAL LETTER EM
      EE |  0000041D | CYRILLIC CAPITAL LETTER EN
      EF |  0000041E | CYRILLIC CAPITAL LETTER O
      F0 |  0000041F | CYRILLIC CAPITAL LETTER PE
      F1 |  0000042F | CYRILLIC CAPITAL LETTER YA
      F2 |  00000420 | CYRILLIC CAPITAL LETTER ER
      F3 |  00000421 | CYRILLIC CAPITAL LETTER ES
      F4 |  00000422 | CYRILLIC CAPITAL LETTER TE
      F5 |  00000423 | CYRILLIC CAPITAL LETTER U
      F6 |  00000416 | CYRILLIC CAPITAL LETTER ZHE
      F7 |  00000412 | CYRILLIC CAPITAL LETTER VE
      F8 |  0000042C | CYRILLIC CAPITAL LETTER SOFT SIGN
      F9 |  0000042B | CYRILLIC CAPITAL LETTER YERU
      FA |  00000417 | CYRILLIC CAPITAL LETTER ZE
      FB |  00000428 | CYRILLIC CAPITAL LETTER SHA
      FC |  0000042D | CYRILLIC CAPITAL LETTER E
      FD |  00000429 | CYRILLIC CAPITAL LETTER SHCHA
      FE |  00000427 | CYRILLIC CAPITAL LETTER CHE
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_KOI_8

    $main::fatpacked{"Locale/RecodeData/LATIN_GREEK.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_LATIN_GREEK';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for LATIN-GREEK.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::LATIN_GREEK;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x00a3,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0391,
      0x0392,
      0x03a8,
      0x0394,
      0x0395,
      0x03a6,
      0x0393,
      0x0397,
      0x0399,
      0x039e,
      0x039a,
      0x039b,
      0x039c,
      0x039d,
      0x039f,
      0x03a0,
      0xfffd,
      0x03a1,
      0x03a3,
      0x03a4,
      0x0398,
      0x03a9,
      0x00b7,
      0x03a7,
      0x03a5,
      0x0396,
      0x007b,
      0x007c,
      0x007d,
      0x00a8,
      0x007f,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\xc2\xa3",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\xce\x91",
      "\xce\x92",
      "\xce\xa8",
      "\xce\x94",
      "\xce\x95",
      "\xce\xa6",
      "\xce\x93",
      "\xce\x97",
      "\xce\x99",
      "\xce\x9e",
      "\xce\x9a",
      "\xce\x9b",
      "\xce\x9c",
      "\xce\x9d",
      "\xce\x9f",
      "\xce\xa0",
      "\xef\xbf\xbd",
      "\xce\xa1",
      "\xce\xa3",
      "\xce\xa4",
      "\xce\x98",
      "\xce\xa9",
      "\xc2\xb7",
      "\xce\xa7",
      "\xce\xa5",
      "\xce\x96",
      "\x7b",
      "\x7c",
      "\x7d",
      "\xc2\xa8",
      "\x7f",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007f => "\x7f",
      0x000000a3 => "\x23",
      0x000000a8 => "\x7e",
      0x000000b7 => "\x77",
      0x00000391 => "\x61",
      0x00000392 => "\x62",
      0x00000393 => "\x67",
      0x00000394 => "\x64",
      0x00000395 => "\x65",
      0x00000396 => "\x7a",
      0x00000397 => "\x68",
      0x00000398 => "\x75",
      0x00000399 => "\x69",
      0x0000039a => "\x6b",
      0x0000039b => "\x6c",
      0x0000039c => "\x6d",
      0x0000039d => "\x6e",
      0x0000039e => "\x6a",
      0x0000039f => "\x6f",
      0x000003a0 => "\x70",
      0x000003a1 => "\x72",
      0x000003a3 => "\x73",
      0x000003a4 => "\x74",
      0x000003a5 => "\x79",
      0x000003a6 => "\x66",
      0x000003a7 => "\x78",
      0x000003a8 => "\x63",
      0x000003a9 => "\x76",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::LATIN_GREEK - Conversion routines for LATIN_GREEK
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for LATIN-GREEK.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: ECMA registry
   alias ISO-IR-19
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  000000A3 | POUND SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000391 | GREEK CAPITAL LETTER ALPHA
      62 |  00000392 | GREEK CAPITAL LETTER BETA
      63 |  000003A8 | GREEK CAPITAL LETTER PSI
      64 |  00000394 | GREEK CAPITAL LETTER DELTA
      65 |  00000395 | GREEK CAPITAL LETTER EPSILON
      66 |  000003A6 | GREEK CAPITAL LETTER PHI
      67 |  00000393 | GREEK CAPITAL LETTER GAMMA
      68 |  00000397 | GREEK CAPITAL LETTER ETA
      69 |  00000399 | GREEK CAPITAL LETTER IOTA
      6A |  0000039E | GREEK CAPITAL LETTER XI
      6B |  0000039A | GREEK CAPITAL LETTER KAPPA
      6C |  0000039B | GREEK CAPITAL LETTER LAMDA
      6D |  0000039C | GREEK CAPITAL LETTER MU
      6E |  0000039D | GREEK CAPITAL LETTER NU
      6F |  0000039F | GREEK CAPITAL LETTER OMICRON
      70 |  000003A0 | GREEK CAPITAL LETTER PI
      72 |  000003A1 | GREEK CAPITAL LETTER RHO
      73 |  000003A3 | GREEK CAPITAL LETTER SIGMA
      74 |  000003A4 | GREEK CAPITAL LETTER TAU
      75 |  00000398 | GREEK CAPITAL LETTER THETA
      76 |  000003A9 | GREEK CAPITAL LETTER OMEGA
      77 |  000000B7 | MIDDLE DOT
      78 |  000003A7 | GREEK CAPITAL LETTER CHI
      79 |  000003A5 | GREEK CAPITAL LETTER UPSILON
      7A |  00000396 | GREEK CAPITAL LETTER ZETA
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  000000A8 | DIAERESIS
      7F |  0000007F | DELETE (DEL)
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_LATIN_GREEK

    $main::fatpacked{"Locale/RecodeData/LATIN_GREEK_1.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_LATIN_GREEK_1';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for LATIN-GREEK-1.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::LATIN_GREEK_1;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x039e,
      0x0022,
      0x0393,
      0x00a4,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x03a8,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x03a0,
      0x0394,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x03a9,
      0x0398,
      0x03a6,
      0x039b,
      0x03a3,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x203e,
      0x007f,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\xce\x9e",
      "\x22",
      "\xce\x93",
      "\xc2\xa4",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\xce\xa8",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\xce\xa0",
      "\xce\x94",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\xce\xa9",
      "\xce\x98",
      "\xce\xa6",
      "\xce\x9b",
      "\xce\xa3",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\xe2\x80\xbe",
      "\x7f",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000022 => "\x22",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007f => "\x7f",
      0x000000a4 => "\x24",
      0x00000393 => "\x23",
      0x00000394 => "\x40",
      0x00000398 => "\x5c",
      0x0000039b => "\x5e",
      0x0000039e => "\x21",
      0x000003a0 => "\x3f",
      0x000003a3 => "\x5f",
      0x000003a6 => "\x5d",
      0x000003a8 => "\x3a",
      0x000003a9 => "\x5b",
      0x0000203e => "\x7e",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::LATIN_GREEK_1 - Conversion routines for LATIN_GREEK_1
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for LATIN-GREEK-1.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: ECMA registry
   alias ISO-IR-27
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  0000039E | GREEK CAPITAL LETTER XI
      22 |  00000022 | QUOTATION MARK
      23 |  00000393 | GREEK CAPITAL LETTER GAMMA
      24 |  000000A4 | CURRENCY SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  000003A8 | GREEK CAPITAL LETTER PSI
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  000003A0 | GREEK CAPITAL LETTER PI
      40 |  00000394 | GREEK CAPITAL LETTER DELTA
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  000003A9 | GREEK CAPITAL LETTER OMEGA
      5C |  00000398 | GREEK CAPITAL LETTER THETA
      5D |  000003A6 | GREEK CAPITAL LETTER PHI
      5E |  0000039B | GREEK CAPITAL LETTER LAMDA
      5F |  000003A3 | GREEK CAPITAL LETTER SIGMA
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000203E | OVERLINE
      7F |  0000007F | DELETE (DEL)
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_LATIN_GREEK_1

    $main::fatpacked{"Locale/RecodeData/MACARABIC.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_MACARABIC';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for MACARABIC.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::MACARABIC;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0x00c4,
      0x00a0,
      0x00c7,
      0x00c9,
      0x00d1,
      0x00d6,
      0x00dc,
      0x00e1,
      0x00e0,
      0x00e2,
      0x00e4,
      0x06ba,
      0x00ab,
      0x00e7,
      0x00e9,
      0x00e8,
      0x00ea,
      0x00eb,
      0x00ed,
      0x2026,
      0x00ee,
      0x00ef,
      0x00f1,
      0x00f3,
      0x00bb,
      0x00f4,
      0x00f6,
      0x00f7,
      0x00fa,
      0x00f9,
      0x00fb,
      0x00fc,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x066a,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x060c,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0660,
      0x0661,
      0x0662,
      0x0663,
      0x0664,
      0x0665,
      0x0666,
      0x0667,
      0x0668,
      0x0669,
      0xfffd,
      0x061b,
      0xfffd,
      0xfffd,
      0xfffd,
      0x061f,
      0x066d,
      0x0621,
      0x0622,
      0x0623,
      0x0624,
      0x0625,
      0x0626,
      0x0627,
      0x0628,
      0x0629,
      0x062a,
      0x062b,
      0x062c,
      0x062d,
      0x062e,
      0x062f,
      0x0630,
      0x0631,
      0x0632,
      0x0633,
      0x0634,
      0x0635,
      0x0636,
      0x0637,
      0x0638,
      0x0639,
      0x063a,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0640,
      0x0641,
      0x0642,
      0x0643,
      0x0644,
      0x0645,
      0x0646,
      0x0647,
      0x0648,
      0x0649,
      0x064a,
      0x064b,
      0x064c,
      0x064d,
      0x064e,
      0x064f,
      0x0650,
      0x0651,
      0x0652,
      0x067e,
      0x0679,
      0x0686,
      0x06d5,
      0x06a4,
      0x06af,
      0x0688,
      0x0691,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0698,
      0x06d2,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xc3\x84",
      "\xc2\xa0",
      "\xc3\x87",
      "\xc3\x89",
      "\xc3\x91",
      "\xc3\x96",
      "\xc3\x9c",
      "\xc3\xa1",
      "\xc3\xa0",
      "\xc3\xa2",
      "\xc3\xa4",
      "\xda\xba",
      "\xc2\xab",
      "\xc3\xa7",
      "\xc3\xa9",
      "\xc3\xa8",
      "\xc3\xaa",
      "\xc3\xab",
      "\xc3\xad",
      "\xe2\x80\xa6",
      "\xc3\xae",
      "\xc3\xaf",
      "\xc3\xb1",
      "\xc3\xb3",
      "\xc2\xbb",
      "\xc3\xb4",
      "\xc3\xb6",
      "\xc3\xb7",
      "\xc3\xba",
      "\xc3\xb9",
      "\xc3\xbb",
      "\xc3\xbc",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xd9\xaa",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xd8\x8c",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xd9\xa0",
      "\xd9\xa1",
      "\xd9\xa2",
      "\xd9\xa3",
      "\xd9\xa4",
      "\xd9\xa5",
      "\xd9\xa6",
      "\xd9\xa7",
      "\xd9\xa8",
      "\xd9\xa9",
      "\xef\xbf\xbd",
      "\xd8\x9b",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xd8\x9f",
      "\xd9\xad",
      "\xd8\xa1",
      "\xd8\xa2",
      "\xd8\xa3",
      "\xd8\xa4",
      "\xd8\xa5",
      "\xd8\xa6",
      "\xd8\xa7",
      "\xd8\xa8",
      "\xd8\xa9",
      "\xd8\xaa",
      "\xd8\xab",
      "\xd8\xac",
      "\xd8\xad",
      "\xd8\xae",
      "\xd8\xaf",
      "\xd8\xb0",
      "\xd8\xb1",
      "\xd8\xb2",
      "\xd8\xb3",
      "\xd8\xb4",
      "\xd8\xb5",
      "\xd8\xb6",
      "\xd8\xb7",
      "\xd8\xb8",
      "\xd8\xb9",
      "\xd8\xba",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xd9\x80",
      "\xd9\x81",
      "\xd9\x82",
      "\xd9\x83",
      "\xd9\x84",
      "\xd9\x85",
      "\xd9\x86",
      "\xd9\x87",
      "\xd9\x88",
      "\xd9\x89",
      "\xd9\x8a",
      "\xd9\x8b",
      "\xd9\x8c",
      "\xd9\x8d",
      "\xd9\x8e",
      "\xd9\x8f",
      "\xd9\x90",
      "\xd9\x91",
      "\xd9\x92",
      "\xd9\xbe",
      "\xd9\xb9",
      "\xda\x86",
      "\xdb\x95",
      "\xda\xa4",
      "\xda\xaf",
      "\xda\x88",
      "\xda\x91",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xda\x98",
      "\xdb\x92",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x000000a0 => "\x81",
      0x000000ab => "\x8c",
      0x000000bb => "\x98",
      0x000000c4 => "\x80",
      0x000000c7 => "\x82",
      0x000000c9 => "\x83",
      0x000000d1 => "\x84",
      0x000000d6 => "\x85",
      0x000000dc => "\x86",
      0x000000e0 => "\x88",
      0x000000e1 => "\x87",
      0x000000e2 => "\x89",
      0x000000e4 => "\x8a",
      0x000000e7 => "\x8d",
      0x000000e8 => "\x8f",
      0x000000e9 => "\x8e",
      0x000000ea => "\x90",
      0x000000eb => "\x91",
      0x000000ed => "\x92",
      0x000000ee => "\x94",
      0x000000ef => "\x95",
      0x000000f1 => "\x96",
      0x000000f3 => "\x97",
      0x000000f4 => "\x99",
      0x000000f6 => "\x9a",
      0x000000f7 => "\x9b",
      0x000000f9 => "\x9d",
      0x000000fa => "\x9c",
      0x000000fb => "\x9e",
      0x000000fc => "\x9f",
      0x0000060c => "\xac",
      0x0000061b => "\xbb",
      0x0000061f => "\xbf",
      0x00000621 => "\xc1",
      0x00000622 => "\xc2",
      0x00000623 => "\xc3",
      0x00000624 => "\xc4",
      0x00000625 => "\xc5",
      0x00000626 => "\xc6",
      0x00000627 => "\xc7",
      0x00000628 => "\xc8",
      0x00000629 => "\xc9",
      0x0000062a => "\xca",
      0x0000062b => "\xcb",
      0x0000062c => "\xcc",
      0x0000062d => "\xcd",
      0x0000062e => "\xce",
      0x0000062f => "\xcf",
      0x00000630 => "\xd0",
      0x00000631 => "\xd1",
      0x00000632 => "\xd2",
      0x00000633 => "\xd3",
      0x00000634 => "\xd4",
      0x00000635 => "\xd5",
      0x00000636 => "\xd6",
      0x00000637 => "\xd7",
      0x00000638 => "\xd8",
      0x00000639 => "\xd9",
      0x0000063a => "\xda",
      0x00000640 => "\xe0",
      0x00000641 => "\xe1",
      0x00000642 => "\xe2",
      0x00000643 => "\xe3",
      0x00000644 => "\xe4",
      0x00000645 => "\xe5",
      0x00000646 => "\xe6",
      0x00000647 => "\xe7",
      0x00000648 => "\xe8",
      0x00000649 => "\xe9",
      0x0000064a => "\xea",
      0x0000064b => "\xeb",
      0x0000064c => "\xec",
      0x0000064d => "\xed",
      0x0000064e => "\xee",
      0x0000064f => "\xef",
      0x00000650 => "\xf0",
      0x00000651 => "\xf1",
      0x00000652 => "\xf2",
      0x00000660 => "\xb0",
      0x00000661 => "\xb1",
      0x00000662 => "\xb2",
      0x00000663 => "\xb3",
      0x00000664 => "\xb4",
      0x00000665 => "\xb5",
      0x00000666 => "\xb6",
      0x00000667 => "\xb7",
      0x00000668 => "\xb8",
      0x00000669 => "\xb9",
      0x0000066a => "\xa5",
      0x0000066d => "\xc0",
      0x00000679 => "\xf4",
      0x0000067e => "\xf3",
      0x00000686 => "\xf5",
      0x00000688 => "\xf9",
      0x00000691 => "\xfa",
      0x00000698 => "\xfe",
      0x000006a4 => "\xf7",
      0x000006af => "\xf8",
      0x000006ba => "\x8b",
      0x000006d2 => "\xff",
      0x000006d5 => "\xf6",
      0x00002026 => "\x93",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::MACARABIC - Conversion routines for MACARABIC
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for MACARABIC.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
  
   This charmap has been generated automatically from GNU libiconv
   conversions.
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE (DEL)
      80 |  000000C4 | LATIN CAPITAL LETTER A WITH DIAERESIS
      81 |  000000A0 | NO-BREAK SPACE
      82 |  000000C7 | LATIN CAPITAL LETTER C WITH CEDILLA
      83 |  000000C9 | LATIN CAPITAL LETTER E WITH ACUTE
      84 |  000000D1 | LATIN CAPITAL LETTER N WITH TILDE
      85 |  000000D6 | LATIN CAPITAL LETTER O WITH DIAERESIS
      86 |  000000DC | LATIN CAPITAL LETTER U WITH DIAERESIS
      87 |  000000E1 | LATIN SMALL LETTER A WITH ACUTE
      88 |  000000E0 | LATIN SMALL LETTER A WITH GRAVE
      89 |  000000E2 | LATIN SMALL LETTER A WITH CIRCUMFLEX
      8A |  000000E4 | LATIN SMALL LETTER A WITH DIAERESIS
      8B |  000006BA | ARABIC LETTER NOON GHUNNA
      8C |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
      8D |  000000E7 | LATIN SMALL LETTER C WITH CEDILLA
      8E |  000000E9 | LATIN SMALL LETTER E WITH ACUTE
      8F |  000000E8 | LATIN SMALL LETTER E WITH GRAVE
      90 |  000000EA | LATIN SMALL LETTER E WITH CIRCUMFLEX
      91 |  000000EB | LATIN SMALL LETTER E WITH DIAERESIS
      92 |  000000ED | LATIN SMALL LETTER I WITH ACUTE
      93 |  00002026 | HORIZONTAL ELLIPSIS
      94 |  000000EE | LATIN SMALL LETTER I WITH CIRCUMFLEX
      95 |  000000EF | LATIN SMALL LETTER I WITH DIAERESIS
      96 |  000000F1 | LATIN SMALL LETTER N WITH TILDE
      97 |  000000F3 | LATIN SMALL LETTER O WITH ACUTE
      98 |  000000BB | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
      99 |  000000F4 | LATIN SMALL LETTER O WITH CIRCUMFLEX
      9A |  000000F6 | LATIN SMALL LETTER O WITH DIAERESIS
      9B |  000000F7 | DIVISION SIGN
      9C |  000000FA | LATIN SMALL LETTER U WITH ACUTE
      9D |  000000F9 | LATIN SMALL LETTER U WITH GRAVE
      9E |  000000FB | LATIN SMALL LETTER U WITH CIRCUMFLEX
      9F |  000000FC | LATIN SMALL LETTER U WITH DIAERESIS
      A5 |  0000066A | ARABIC PERCENT SIGN
      AC |  0000060C | ARABIC COMMA
      B0 |  00000660 | ARABIC-INDIC DIGIT ZERO
      B1 |  00000661 | ARABIC-INDIC DIGIT ONE
      B2 |  00000662 | ARABIC-INDIC DIGIT TWO
      B3 |  00000663 | ARABIC-INDIC DIGIT THREE
      B4 |  00000664 | ARABIC-INDIC DIGIT FOUR
      B5 |  00000665 | ARABIC-INDIC DIGIT FIVE
      B6 |  00000666 | ARABIC-INDIC DIGIT SIX
      B7 |  00000667 | ARABIC-INDIC DIGIT SEVEN
      B8 |  00000668 | ARABIC-INDIC DIGIT EIGHT
      B9 |  00000669 | ARABIC-INDIC DIGIT NINE
      BB |  0000061B | ARABIC SEMICOLON
      BF |  0000061F | ARABIC QUESTION MARK
      C0 |  0000066D | ARABIC FIVE POINTED STAR
      C1 |  00000621 | ARABIC LETTER HAMZA
      C2 |  00000622 | ARABIC LETTER ALEF WITH MADDA ABOVE
      C3 |  00000623 | ARABIC LETTER ALEF WITH HAMZA ABOVE
      C4 |  00000624 | ARABIC LETTER WAW WITH HAMZA ABOVE
      C5 |  00000625 | ARABIC LETTER ALEF WITH HAMZA BELOW
      C6 |  00000626 | ARABIC LETTER YEH WITH HAMZA ABOVE
      C7 |  00000627 | ARABIC LETTER ALEF
      C8 |  00000628 | ARABIC LETTER BEH
      C9 |  00000629 | ARABIC LETTER TEH MARBUTA
      CA |  0000062A | ARABIC LETTER TEH
      CB |  0000062B | ARABIC LETTER THEH
      CC |  0000062C | ARABIC LETTER JEEM
      CD |  0000062D | ARABIC LETTER HAH
      CE |  0000062E | ARABIC LETTER KHAH
      CF |  0000062F | ARABIC LETTER DAL
      D0 |  00000630 | ARABIC LETTER THAL
      D1 |  00000631 | ARABIC LETTER REH
      D2 |  00000632 | ARABIC LETTER ZAIN
      D3 |  00000633 | ARABIC LETTER SEEN
      D4 |  00000634 | ARABIC LETTER SHEEN
      D5 |  00000635 | ARABIC LETTER SAD
      D6 |  00000636 | ARABIC LETTER DAD
      D7 |  00000637 | ARABIC LETTER TAH
      D8 |  00000638 | ARABIC LETTER ZAH
      D9 |  00000639 | ARABIC LETTER AIN
      DA |  0000063A | ARABIC LETTER GHAIN
      E0 |  00000640 | ARABIC TATWEEL
      E1 |  00000641 | ARABIC LETTER FEH
      E2 |  00000642 | ARABIC LETTER QAF
      E3 |  00000643 | ARABIC LETTER KAF
      E4 |  00000644 | ARABIC LETTER LAM
      E5 |  00000645 | ARABIC LETTER MEEM
      E6 |  00000646 | ARABIC LETTER NOON
      E7 |  00000647 | ARABIC LETTER HEH
      E8 |  00000648 | ARABIC LETTER WAW
      E9 |  00000649 | ARABIC LETTER ALEF MAKSURA
      EA |  0000064A | ARABIC LETTER YEH
      EB |  0000064B | ARABIC FATHATAN
      EC |  0000064C | ARABIC DAMMATAN
      ED |  0000064D | ARABIC KASRATAN
      EE |  0000064E | ARABIC FATHA
      EF |  0000064F | ARABIC DAMMA
      F0 |  00000650 | ARABIC KASRA
      F1 |  00000651 | ARABIC SHADDA
      F2 |  00000652 | ARABIC SUKUN
      F3 |  0000067E | ARABIC LETTER PEH
      F4 |  00000679 | ARABIC LETTER TTEH
      F5 |  00000686 | ARABIC LETTER TCHEH
      F6 |  000006D5 | ARABIC LETTER AE
      F7 |  000006A4 | ARABIC LETTER VEH
      F8 |  000006AF | ARABIC LETTER GAF
      F9 |  00000688 | ARABIC LETTER DDAL
      FA |  00000691 | ARABIC LETTER RREH
      FE |  00000698 | ARABIC LETTER JEH
      FF |  000006D2 | ARABIC LETTER YEH BARREE
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_MACARABIC

    $main::fatpacked{"Locale/RecodeData/MACCROATIAN.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_MACCROATIAN';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for MACCROATIAN.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::MACCROATIAN;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0x00c4,
      0x00c5,
      0x00c7,
      0x00c9,
      0x00d1,
      0x00d6,
      0x00dc,
      0x00e1,
      0x00e0,
      0x00e2,
      0x00e4,
      0x00e3,
      0x00e5,
      0x00e7,
      0x00e9,
      0x00e8,
      0x00ea,
      0x00eb,
      0x00ed,
      0x00ec,
      0x00ee,
      0x00ef,
      0x00f1,
      0x00f3,
      0x00f2,
      0x00f4,
      0x00f6,
      0x00f5,
      0x00fa,
      0x00f9,
      0x00fb,
      0x00fc,
      0x2020,
      0x00b0,
      0x00a2,
      0x00a3,
      0x00a7,
      0x2022,
      0x00b6,
      0x00df,
      0x00ae,
      0x0160,
      0x2122,
      0x00b4,
      0x00a8,
      0x2260,
      0x017d,
      0x00d8,
      0x221e,
      0x00b1,
      0x2264,
      0x2265,
      0x2206,
      0x00b5,
      0x2202,
      0x2211,
      0x220f,
      0x0161,
      0x222b,
      0x00aa,
      0x00ba,
      0x2126,
      0x017e,
      0x00f8,
      0x00bf,
      0x00a1,
      0x00ac,
      0x221a,
      0x0192,
      0x2248,
      0x0106,
      0x00ab,
      0x010c,
      0x2026,
      0x00a0,
      0x00c0,
      0x00c3,
      0x00d5,
      0x0152,
      0x0153,
      0x0110,
      0x2014,
      0x201c,
      0x201d,
      0x2018,
      0x2019,
      0x00f7,
      0x25ca,
      0xfffd,
      0x00a9,
      0x2044,
      0x00a4,
      0x2039,
      0x203a,
      0x00c6,
      0x00bb,
      0x2013,
      0x00b7,
      0x201a,
      0x201e,
      0x2030,
      0x00c2,
      0x0107,
      0x00c1,
      0x010d,
      0x00c8,
      0x00cd,
      0x00ce,
      0x00cf,
      0x00cc,
      0x00d3,
      0x00d4,
      0x0111,
      0x00d2,
      0x00da,
      0x00db,
      0x00d9,
      0x0131,
      0x02c6,
      0x02dc,
      0x00af,
      0x03c0,
      0x00cb,
      0x02da,
      0x00b8,
      0x00ca,
      0x00e6,
      0x02c7,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xc3\x84",
      "\xc3\x85",
      "\xc3\x87",
      "\xc3\x89",
      "\xc3\x91",
      "\xc3\x96",
      "\xc3\x9c",
      "\xc3\xa1",
      "\xc3\xa0",
      "\xc3\xa2",
      "\xc3\xa4",
      "\xc3\xa3",
      "\xc3\xa5",
      "\xc3\xa7",
      "\xc3\xa9",
      "\xc3\xa8",
      "\xc3\xaa",
      "\xc3\xab",
      "\xc3\xad",
      "\xc3\xac",
      "\xc3\xae",
      "\xc3\xaf",
      "\xc3\xb1",
      "\xc3\xb3",
      "\xc3\xb2",
      "\xc3\xb4",
      "\xc3\xb6",
      "\xc3\xb5",
      "\xc3\xba",
      "\xc3\xb9",
      "\xc3\xbb",
      "\xc3\xbc",
      "\xe2\x80\xa0",
      "\xc2\xb0",
      "\xc2\xa2",
      "\xc2\xa3",
      "\xc2\xa7",
      "\xe2\x80\xa2",
      "\xc2\xb6",
      "\xc3\x9f",
      "\xc2\xae",
      "\xc5\xa0",
      "\xe2\x84\xa2",
      "\xc2\xb4",
      "\xc2\xa8",
      "\xe2\x89\xa0",
      "\xc5\xbd",
      "\xc3\x98",
      "\xe2\x88\x9e",
      "\xc2\xb1",
      "\xe2\x89\xa4",
      "\xe2\x89\xa5",
      "\xe2\x88\x86",
      "\xc2\xb5",
      "\xe2\x88\x82",
      "\xe2\x88\x91",
      "\xe2\x88\x8f",
      "\xc5\xa1",
      "\xe2\x88\xab",
      "\xc2\xaa",
      "\xc2\xba",
      "\xe2\x84\xa6",
      "\xc5\xbe",
      "\xc3\xb8",
      "\xc2\xbf",
      "\xc2\xa1",
      "\xc2\xac",
      "\xe2\x88\x9a",
      "\xc6\x92",
      "\xe2\x89\x88",
      "\xc4\x86",
      "\xc2\xab",
      "\xc4\x8c",
      "\xe2\x80\xa6",
      "\xc2\xa0",
      "\xc3\x80",
      "\xc3\x83",
      "\xc3\x95",
      "\xc5\x92",
      "\xc5\x93",
      "\xc4\x90",
      "\xe2\x80\x94",
      "\xe2\x80\x9c",
      "\xe2\x80\x9d",
      "\xe2\x80\x98",
      "\xe2\x80\x99",
      "\xc3\xb7",
      "\xe2\x97\x8a",
      "\xef\xbf\xbd",
      "\xc2\xa9",
      "\xe2\x81\x84",
      "\xc2\xa4",
      "\xe2\x80\xb9",
      "\xe2\x80\xba",
      "\xc3\x86",
      "\xc2\xbb",
      "\xe2\x80\x93",
      "\xc2\xb7",
      "\xe2\x80\x9a",
      "\xe2\x80\x9e",
      "\xe2\x80\xb0",
      "\xc3\x82",
      "\xc4\x87",
      "\xc3\x81",
      "\xc4\x8d",
      "\xc3\x88",
      "\xc3\x8d",
      "\xc3\x8e",
      "\xc3\x8f",
      "\xc3\x8c",
      "\xc3\x93",
      "\xc3\x94",
      "\xc4\x91",
      "\xc3\x92",
      "\xc3\x9a",
      "\xc3\x9b",
      "\xc3\x99",
      "\xc4\xb1",
      "\xcb\x86",
      "\xcb\x9c",
      "\xc2\xaf",
      "\xcf\x80",
      "\xc3\x8b",
      "\xcb\x9a",
      "\xc2\xb8",
      "\xc3\x8a",
      "\xc3\xa6",
      "\xcb\x87",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x000000a0 => "\xca",
      0x000000a1 => "\xc1",
      0x000000a2 => "\xa2",
      0x000000a3 => "\xa3",
      0x000000a4 => "\xdb",
      0x000000a7 => "\xa4",
      0x000000a8 => "\xac",
      0x000000a9 => "\xd9",
      0x000000aa => "\xbb",
      0x000000ab => "\xc7",
      0x000000ac => "\xc2",
      0x000000ae => "\xa8",
      0x000000af => "\xf8",
      0x000000b0 => "\xa1",
      0x000000b1 => "\xb1",
      0x000000b4 => "\xab",
      0x000000b5 => "\xb5",
      0x000000b6 => "\xa6",
      0x000000b7 => "\xe1",
      0x000000b8 => "\xfc",
      0x000000ba => "\xbc",
      0x000000bb => "\xdf",
      0x000000bf => "\xc0",
      0x000000c0 => "\xcb",
      0x000000c1 => "\xe7",
      0x000000c2 => "\xe5",
      0x000000c3 => "\xcc",
      0x000000c4 => "\x80",
      0x000000c5 => "\x81",
      0x000000c6 => "\xde",
      0x000000c7 => "\x82",
      0x000000c8 => "\xe9",
      0x000000c9 => "\x83",
      0x000000ca => "\xfd",
      0x000000cb => "\xfa",
      0x000000cc => "\xed",
      0x000000cd => "\xea",
      0x000000ce => "\xeb",
      0x000000cf => "\xec",
      0x000000d1 => "\x84",
      0x000000d2 => "\xf1",
      0x000000d3 => "\xee",
      0x000000d4 => "\xef",
      0x000000d5 => "\xcd",
      0x000000d6 => "\x85",
      0x000000d8 => "\xaf",
      0x000000d9 => "\xf4",
      0x000000da => "\xf2",
      0x000000db => "\xf3",
      0x000000dc => "\x86",
      0x000000df => "\xa7",
      0x000000e0 => "\x88",
      0x000000e1 => "\x87",
      0x000000e2 => "\x89",
      0x000000e3 => "\x8b",
      0x000000e4 => "\x8a",
      0x000000e5 => "\x8c",
      0x000000e6 => "\xfe",
      0x000000e7 => "\x8d",
      0x000000e8 => "\x8f",
      0x000000e9 => "\x8e",
      0x000000ea => "\x90",
      0x000000eb => "\x91",
      0x000000ec => "\x93",
      0x000000ed => "\x92",
      0x000000ee => "\x94",
      0x000000ef => "\x95",
      0x000000f1 => "\x96",
      0x000000f2 => "\x98",
      0x000000f3 => "\x97",
      0x000000f4 => "\x99",
      0x000000f5 => "\x9b",
      0x000000f6 => "\x9a",
      0x000000f7 => "\xd6",
      0x000000f8 => "\xbf",
      0x000000f9 => "\x9d",
      0x000000fa => "\x9c",
      0x000000fb => "\x9e",
      0x000000fc => "\x9f",
      0x00000106 => "\xc6",
      0x00000107 => "\xe6",
      0x0000010c => "\xc8",
      0x0000010d => "\xe8",
      0x00000110 => "\xd0",
      0x00000111 => "\xf0",
      0x00000131 => "\xf5",
      0x00000152 => "\xce",
      0x00000153 => "\xcf",
      0x00000160 => "\xa9",
      0x00000161 => "\xb9",
      0x0000017d => "\xae",
      0x0000017e => "\xbe",
      0x00000192 => "\xc4",
      0x000002c6 => "\xf6",
      0x000002c7 => "\xff",
      0x000002da => "\xfb",
      0x000002dc => "\xf7",
      0x000003c0 => "\xf9",
      0x00002013 => "\xe0",
      0x00002014 => "\xd1",
      0x00002018 => "\xd4",
      0x00002019 => "\xd5",
      0x0000201a => "\xe2",
      0x0000201c => "\xd2",
      0x0000201d => "\xd3",
      0x0000201e => "\xe3",
      0x00002020 => "\xa0",
      0x00002022 => "\xa5",
      0x00002026 => "\xc9",
      0x00002030 => "\xe4",
      0x00002039 => "\xdc",
      0x0000203a => "\xdd",
      0x00002044 => "\xda",
      0x00002122 => "\xaa",
      0x00002126 => "\xbd",
      0x00002202 => "\xb6",
      0x00002206 => "\xb4",
      0x0000220f => "\xb8",
      0x00002211 => "\xb7",
      0x0000221a => "\xc3",
      0x0000221e => "\xb0",
      0x0000222b => "\xba",
      0x00002248 => "\xc5",
      0x00002260 => "\xad",
      0x00002264 => "\xb2",
      0x00002265 => "\xb3",
      0x000025ca => "\xd7",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::MACCROATIAN - Conversion routines for MACCROATIAN
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for MACCROATIAN.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
  
   This charmap has been generated automatically from GNU libiconv
   conversions.
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE (DEL)
      80 |  000000C4 | LATIN CAPITAL LETTER A WITH DIAERESIS
      81 |  000000C5 | LATIN CAPITAL LETTER A WITH RING ABOVE
      82 |  000000C7 | LATIN CAPITAL LETTER C WITH CEDILLA
      83 |  000000C9 | LATIN CAPITAL LETTER E WITH ACUTE
      84 |  000000D1 | LATIN CAPITAL LETTER N WITH TILDE
      85 |  000000D6 | LATIN CAPITAL LETTER O WITH DIAERESIS
      86 |  000000DC | LATIN CAPITAL LETTER U WITH DIAERESIS
      87 |  000000E1 | LATIN SMALL LETTER A WITH ACUTE
      88 |  000000E0 | LATIN SMALL LETTER A WITH GRAVE
      89 |  000000E2 | LATIN SMALL LETTER A WITH CIRCUMFLEX
      8A |  000000E4 | LATIN SMALL LETTER A WITH DIAERESIS
      8B |  000000E3 | LATIN SMALL LETTER A WITH TILDE
      8C |  000000E5 | LATIN SMALL LETTER A WITH RING ABOVE
      8D |  000000E7 | LATIN SMALL LETTER C WITH CEDILLA
      8E |  000000E9 | LATIN SMALL LETTER E WITH ACUTE
      8F |  000000E8 | LATIN SMALL LETTER E WITH GRAVE
      90 |  000000EA | LATIN SMALL LETTER E WITH CIRCUMFLEX
      91 |  000000EB | LATIN SMALL LETTER E WITH DIAERESIS
      92 |  000000ED | LATIN SMALL LETTER I WITH ACUTE
      93 |  000000EC | LATIN SMALL LETTER I WITH GRAVE
      94 |  000000EE | LATIN SMALL LETTER I WITH CIRCUMFLEX
      95 |  000000EF | LATIN SMALL LETTER I WITH DIAERESIS
      96 |  000000F1 | LATIN SMALL LETTER N WITH TILDE
      97 |  000000F3 | LATIN SMALL LETTER O WITH ACUTE
      98 |  000000F2 | LATIN SMALL LETTER O WITH GRAVE
      99 |  000000F4 | LATIN SMALL LETTER O WITH CIRCUMFLEX
      9A |  000000F6 | LATIN SMALL LETTER O WITH DIAERESIS
      9B |  000000F5 | LATIN SMALL LETTER O WITH TILDE
      9C |  000000FA | LATIN SMALL LETTER U WITH ACUTE
      9D |  000000F9 | LATIN SMALL LETTER U WITH GRAVE
      9E |  000000FB | LATIN SMALL LETTER U WITH CIRCUMFLEX
      9F |  000000FC | LATIN SMALL LETTER U WITH DIAERESIS
      A0 |  00002020 | DAGGER
      A1 |  000000B0 | DEGREE SIGN
      A2 |  000000A2 | CENT SIGN
      A3 |  000000A3 | POUND SIGN
      A4 |  000000A7 | SECTION SIGN
      A5 |  00002022 | BULLET
      A6 |  000000B6 | PILCROW SIGN
      A7 |  000000DF | LATIN SMALL LETTER SHARP S
      A8 |  000000AE | REGISTERED SIGN
      A9 |  00000160 | LATIN CAPITAL LETTER S WITH CARON
      AA |  00002122 | TRADE MARK SIGN
      AB |  000000B4 | ACUTE ACCENT
      AC |  000000A8 | DIAERESIS
      AD |  00002260 | NOT EQUAL TO
      AE |  0000017D | LATIN CAPITAL LETTER Z WITH CARON
      AF |  000000D8 | LATIN CAPITAL LETTER O WITH STROKE
      B0 |  0000221E | INFINITY
      B1 |  000000B1 | PLUS-MINUS SIGN
      B2 |  00002264 | LESS-THAN OR EQUAL TO
      B3 |  00002265 | GREATER-THAN OR EQUAL TO
      B4 |  00002206 | INCREMENT
      B5 |  000000B5 | MICRO SIGN
      B6 |  00002202 | PARTIAL DIFFERENTIAL
      B7 |  00002211 | N-ARY SUMMATION
      B8 |  0000220F | N-ARY PRODUCT
      B9 |  00000161 | LATIN SMALL LETTER S WITH CARON
      BA |  0000222B | INTEGRAL
      BB |  000000AA | FEMININE ORDINAL INDICATOR
      BC |  000000BA | MASCULINE ORDINAL INDICATOR
      BD |  00002126 | OHM SIGN
      BE |  0000017E | LATIN SMALL LETTER Z WITH CARON
      BF |  000000F8 | LATIN SMALL LETTER O WITH STROKE
      C0 |  000000BF | INVERTED QUESTION MARK
      C1 |  000000A1 | INVERTED EXCLAMATION MARK
      C2 |  000000AC | NOT SIGN
      C3 |  0000221A | SQUARE ROOT
      C4 |  00000192 | LATIN SMALL LETTER F WITH HOOK
      C5 |  00002248 | ALMOST EQUAL TO
      C6 |  00000106 | LATIN CAPITAL LETTER C WITH ACUTE
      C7 |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
      C8 |  0000010C | LATIN CAPITAL LETTER C WITH CARON
      C9 |  00002026 | HORIZONTAL ELLIPSIS
      CA |  000000A0 | NO-BREAK SPACE
      CB |  000000C0 | LATIN CAPITAL LETTER A WITH GRAVE
      CC |  000000C3 | LATIN CAPITAL LETTER A WITH TILDE
      CD |  000000D5 | LATIN CAPITAL LETTER O WITH TILDE
      CE |  00000152 | LATIN CAPITAL LIGATURE OE
      CF |  00000153 | LATIN SMALL LIGATURE OE
      D0 |  00000110 | LATIN CAPITAL LETTER D WITH STROKE
      D1 |  00002014 | EM DASH
      D2 |  0000201C | LEFT DOUBLE QUOTATION MARK
      D3 |  0000201D | RIGHT DOUBLE QUOTATION MARK
      D4 |  00002018 | LEFT SINGLE QUOTATION MARK
      D5 |  00002019 | RIGHT SINGLE QUOTATION MARK
      D6 |  000000F7 | DIVISION SIGN
      D7 |  000025CA | LOZENGE
      D9 |  000000A9 | COPYRIGHT SIGN
      DA |  00002044 | FRACTION SLASH
      DB |  000000A4 | CURRENCY SIGN
      DC |  00002039 | SINGLE LEFT-POINTING ANGLE QUOTATION MARK
      DD |  0000203A | SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
      DE |  000000C6 | LATIN CAPITAL LETTER AE
      DF |  000000BB | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
      E0 |  00002013 | EN DASH
      E1 |  000000B7 | MIDDLE DOT
      E2 |  0000201A | SINGLE LOW-9 QUOTATION MARK
      E3 |  0000201E | DOUBLE LOW-9 QUOTATION MARK
      E4 |  00002030 | PER MILLE SIGN
      E5 |  000000C2 | LATIN CAPITAL LETTER A WITH CIRCUMFLEX
      E6 |  00000107 | LATIN SMALL LETTER C WITH ACUTE
      E7 |  000000C1 | LATIN CAPITAL LETTER A WITH ACUTE
      E8 |  0000010D | LATIN SMALL LETTER C WITH CARON
      E9 |  000000C8 | LATIN CAPITAL LETTER E WITH GRAVE
      EA |  000000CD | LATIN CAPITAL LETTER I WITH ACUTE
      EB |  000000CE | LATIN CAPITAL LETTER I WITH CIRCUMFLEX
      EC |  000000CF | LATIN CAPITAL LETTER I WITH DIAERESIS
      ED |  000000CC | LATIN CAPITAL LETTER I WITH GRAVE
      EE |  000000D3 | LATIN CAPITAL LETTER O WITH ACUTE
      EF |  000000D4 | LATIN CAPITAL LETTER O WITH CIRCUMFLEX
      F0 |  00000111 | LATIN SMALL LETTER D WITH STROKE
      F1 |  000000D2 | LATIN CAPITAL LETTER O WITH GRAVE
      F2 |  000000DA | LATIN CAPITAL LETTER U WITH ACUTE
      F3 |  000000DB | LATIN CAPITAL LETTER U WITH CIRCUMFLEX
      F4 |  000000D9 | LATIN CAPITAL LETTER U WITH GRAVE
      F5 |  00000131 | LATIN SMALL LETTER DOTLESS I
      F6 |  000002C6 | MODIFIER LETTER CIRCUMFLEX ACCENT
      F7 |  000002DC | SMALL TILDE
      F8 |  000000AF | MACRON
      F9 |  000003C0 | GREEK SMALL LETTER PI
      FA |  000000CB | LATIN CAPITAL LETTER E WITH DIAERESIS
      FB |  000002DA | RING ABOVE
      FC |  000000B8 | CEDILLA
      FD |  000000CA | LATIN CAPITAL LETTER E WITH CIRCUMFLEX
      FE |  000000E6 | LATIN SMALL LETTER AE
      FF |  000002C7 | CARON
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_MACCROATIAN

    $main::fatpacked{"Locale/RecodeData/MACCYRILLIC.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_MACCYRILLIC';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for MACCYRILLIC.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::MACCYRILLIC;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0x0410,
      0x0411,
      0x0412,
      0x0413,
      0x0414,
      0x0415,
      0x0416,
      0x0417,
      0x0418,
      0x0419,
      0x041a,
      0x041b,
      0x041c,
      0x041d,
      0x041e,
      0x041f,
      0x0420,
      0x0421,
      0x0422,
      0x0423,
      0x0424,
      0x0425,
      0x0426,
      0x0427,
      0x0428,
      0x0429,
      0x042a,
      0x042b,
      0x042c,
      0x042d,
      0x042e,
      0x042f,
      0x2020,
      0x00b0,
      0x00a2,
      0x00a3,
      0x00a7,
      0x2022,
      0x00b6,
      0x0406,
      0x00ae,
      0x00a9,
      0x2122,
      0x0402,
      0x0452,
      0x2260,
      0x0403,
      0x0453,
      0x221e,
      0x00b1,
      0x2264,
      0x2265,
      0x0456,
      0x00b5,
      0x2202,
      0x0408,
      0x0404,
      0x0454,
      0x0407,
      0x0457,
      0x0409,
      0x0459,
      0x040a,
      0x045a,
      0x0458,
      0x0405,
      0x00ac,
      0x221a,
      0x0192,
      0x2248,
      0x2206,
      0x00ab,
      0x00bb,
      0x2026,
      0x00a0,
      0x040b,
      0x045b,
      0x040c,
      0x045c,
      0x0455,
      0x2013,
      0x2014,
      0x201c,
      0x201d,
      0x2018,
      0x2019,
      0x00f7,
      0x201e,
      0x040e,
      0x045e,
      0x040f,
      0x045f,
      0x2116,
      0x0401,
      0x0451,
      0x044f,
      0x0430,
      0x0431,
      0x0432,
      0x0433,
      0x0434,
      0x0435,
      0x0436,
      0x0437,
      0x0438,
      0x0439,
      0x043a,
      0x043b,
      0x043c,
      0x043d,
      0x043e,
      0x043f,
      0x0440,
      0x0441,
      0x0442,
      0x0443,
      0x0444,
      0x0445,
      0x0446,
      0x0447,
      0x0448,
      0x0449,
      0x044a,
      0x044b,
      0x044c,
      0x044d,
      0x044e,
      0x00a4,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xd0\x90",
      "\xd0\x91",
      "\xd0\x92",
      "\xd0\x93",
      "\xd0\x94",
      "\xd0\x95",
      "\xd0\x96",
      "\xd0\x97",
      "\xd0\x98",
      "\xd0\x99",
      "\xd0\x9a",
      "\xd0\x9b",
      "\xd0\x9c",
      "\xd0\x9d",
      "\xd0\x9e",
      "\xd0\x9f",
      "\xd0\xa0",
      "\xd0\xa1",
      "\xd0\xa2",
      "\xd0\xa3",
      "\xd0\xa4",
      "\xd0\xa5",
      "\xd0\xa6",
      "\xd0\xa7",
      "\xd0\xa8",
      "\xd0\xa9",
      "\xd0\xaa",
      "\xd0\xab",
      "\xd0\xac",
      "\xd0\xad",
      "\xd0\xae",
      "\xd0\xaf",
      "\xe2\x80\xa0",
      "\xc2\xb0",
      "\xc2\xa2",
      "\xc2\xa3",
      "\xc2\xa7",
      "\xe2\x80\xa2",
      "\xc2\xb6",
      "\xd0\x86",
      "\xc2\xae",
      "\xc2\xa9",
      "\xe2\x84\xa2",
      "\xd0\x82",
      "\xd1\x92",
      "\xe2\x89\xa0",
      "\xd0\x83",
      "\xd1\x93",
      "\xe2\x88\x9e",
      "\xc2\xb1",
      "\xe2\x89\xa4",
      "\xe2\x89\xa5",
      "\xd1\x96",
      "\xc2\xb5",
      "\xe2\x88\x82",
      "\xd0\x88",
      "\xd0\x84",
      "\xd1\x94",
      "\xd0\x87",
      "\xd1\x97",
      "\xd0\x89",
      "\xd1\x99",
      "\xd0\x8a",
      "\xd1\x9a",
      "\xd1\x98",
      "\xd0\x85",
      "\xc2\xac",
      "\xe2\x88\x9a",
      "\xc6\x92",
      "\xe2\x89\x88",
      "\xe2\x88\x86",
      "\xc2\xab",
      "\xc2\xbb",
      "\xe2\x80\xa6",
      "\xc2\xa0",
      "\xd0\x8b",
      "\xd1\x9b",
      "\xd0\x8c",
      "\xd1\x9c",
      "\xd1\x95",
      "\xe2\x80\x93",
      "\xe2\x80\x94",
      "\xe2\x80\x9c",
      "\xe2\x80\x9d",
      "\xe2\x80\x98",
      "\xe2\x80\x99",
      "\xc3\xb7",
      "\xe2\x80\x9e",
      "\xd0\x8e",
      "\xd1\x9e",
      "\xd0\x8f",
      "\xd1\x9f",
      "\xe2\x84\x96",
      "\xd0\x81",
      "\xd1\x91",
      "\xd1\x8f",
      "\xd0\xb0",
      "\xd0\xb1",
      "\xd0\xb2",
      "\xd0\xb3",
      "\xd0\xb4",
      "\xd0\xb5",
      "\xd0\xb6",
      "\xd0\xb7",
      "\xd0\xb8",
      "\xd0\xb9",
      "\xd0\xba",
      "\xd0\xbb",
      "\xd0\xbc",
      "\xd0\xbd",
      "\xd0\xbe",
      "\xd0\xbf",
      "\xd1\x80",
      "\xd1\x81",
      "\xd1\x82",
      "\xd1\x83",
      "\xd1\x84",
      "\xd1\x85",
      "\xd1\x86",
      "\xd1\x87",
      "\xd1\x88",
      "\xd1\x89",
      "\xd1\x8a",
      "\xd1\x8b",
      "\xd1\x8c",
      "\xd1\x8d",
      "\xd1\x8e",
      "\xc2\xa4",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x000000a0 => "\xca",
      0x000000a2 => "\xa2",
      0x000000a3 => "\xa3",
      0x000000a4 => "\xff",
      0x000000a7 => "\xa4",
      0x000000a9 => "\xa9",
      0x000000ab => "\xc7",
      0x000000ac => "\xc2",
      0x000000ae => "\xa8",
      0x000000b0 => "\xa1",
      0x000000b1 => "\xb1",
      0x000000b5 => "\xb5",
      0x000000b6 => "\xa6",
      0x000000bb => "\xc8",
      0x000000f7 => "\xd6",
      0x00000192 => "\xc4",
      0x00000401 => "\xdd",
      0x00000402 => "\xab",
      0x00000403 => "\xae",
      0x00000404 => "\xb8",
      0x00000405 => "\xc1",
      0x00000406 => "\xa7",
      0x00000407 => "\xba",
      0x00000408 => "\xb7",
      0x00000409 => "\xbc",
      0x0000040a => "\xbe",
      0x0000040b => "\xcb",
      0x0000040c => "\xcd",
      0x0000040e => "\xd8",
      0x0000040f => "\xda",
      0x00000410 => "\x80",
      0x00000411 => "\x81",
      0x00000412 => "\x82",
      0x00000413 => "\x83",
      0x00000414 => "\x84",
      0x00000415 => "\x85",
      0x00000416 => "\x86",
      0x00000417 => "\x87",
      0x00000418 => "\x88",
      0x00000419 => "\x89",
      0x0000041a => "\x8a",
      0x0000041b => "\x8b",
      0x0000041c => "\x8c",
      0x0000041d => "\x8d",
      0x0000041e => "\x8e",
      0x0000041f => "\x8f",
      0x00000420 => "\x90",
      0x00000421 => "\x91",
      0x00000422 => "\x92",
      0x00000423 => "\x93",
      0x00000424 => "\x94",
      0x00000425 => "\x95",
      0x00000426 => "\x96",
      0x00000427 => "\x97",
      0x00000428 => "\x98",
      0x00000429 => "\x99",
      0x0000042a => "\x9a",
      0x0000042b => "\x9b",
      0x0000042c => "\x9c",
      0x0000042d => "\x9d",
      0x0000042e => "\x9e",
      0x0000042f => "\x9f",
      0x00000430 => "\xe0",
      0x00000431 => "\xe1",
      0x00000432 => "\xe2",
      0x00000433 => "\xe3",
      0x00000434 => "\xe4",
      0x00000435 => "\xe5",
      0x00000436 => "\xe6",
      0x00000437 => "\xe7",
      0x00000438 => "\xe8",
      0x00000439 => "\xe9",
      0x0000043a => "\xea",
      0x0000043b => "\xeb",
      0x0000043c => "\xec",
      0x0000043d => "\xed",
      0x0000043e => "\xee",
      0x0000043f => "\xef",
      0x00000440 => "\xf0",
      0x00000441 => "\xf1",
      0x00000442 => "\xf2",
      0x00000443 => "\xf3",
      0x00000444 => "\xf4",
      0x00000445 => "\xf5",
      0x00000446 => "\xf6",
      0x00000447 => "\xf7",
      0x00000448 => "\xf8",
      0x00000449 => "\xf9",
      0x0000044a => "\xfa",
      0x0000044b => "\xfb",
      0x0000044c => "\xfc",
      0x0000044d => "\xfd",
      0x0000044e => "\xfe",
      0x0000044f => "\xdf",
      0x00000451 => "\xde",
      0x00000452 => "\xac",
      0x00000453 => "\xaf",
      0x00000454 => "\xb9",
      0x00000455 => "\xcf",
      0x00000456 => "\xb4",
      0x00000457 => "\xbb",
      0x00000458 => "\xc0",
      0x00000459 => "\xbd",
      0x0000045a => "\xbf",
      0x0000045b => "\xcc",
      0x0000045c => "\xce",
      0x0000045e => "\xd9",
      0x0000045f => "\xdb",
      0x00002013 => "\xd0",
      0x00002014 => "\xd1",
      0x00002018 => "\xd4",
      0x00002019 => "\xd5",
      0x0000201c => "\xd2",
      0x0000201d => "\xd3",
      0x0000201e => "\xd7",
      0x00002020 => "\xa0",
      0x00002022 => "\xa5",
      0x00002026 => "\xc9",
      0x00002116 => "\xdc",
      0x00002122 => "\xaa",
      0x00002202 => "\xb6",
      0x00002206 => "\xc6",
      0x0000221a => "\xc3",
      0x0000221e => "\xb0",
      0x00002248 => "\xc5",
      0x00002260 => "\xad",
      0x00002264 => "\xb2",
      0x00002265 => "\xb3",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::MACCYRILLIC - Conversion routines for MACCYRILLIC
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for MACCYRILLIC.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
  
   This charmap has been generated automatically from GNU libiconv
   conversions.
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE (DEL)
      80 |  00000410 | CYRILLIC CAPITAL LETTER A
      81 |  00000411 | CYRILLIC CAPITAL LETTER BE
      82 |  00000412 | CYRILLIC CAPITAL LETTER VE
      83 |  00000413 | CYRILLIC CAPITAL LETTER GHE
      84 |  00000414 | CYRILLIC CAPITAL LETTER DE
      85 |  00000415 | CYRILLIC CAPITAL LETTER IE
      86 |  00000416 | CYRILLIC CAPITAL LETTER ZHE
      87 |  00000417 | CYRILLIC CAPITAL LETTER ZE
      88 |  00000418 | CYRILLIC CAPITAL LETTER I
      89 |  00000419 | CYRILLIC CAPITAL LETTER SHORT I
      8A |  0000041A | CYRILLIC CAPITAL LETTER KA
      8B |  0000041B | CYRILLIC CAPITAL LETTER EL
      8C |  0000041C | CYRILLIC CAPITAL LETTER EM
      8D |  0000041D | CYRILLIC CAPITAL LETTER EN
      8E |  0000041E | CYRILLIC CAPITAL LETTER O
      8F |  0000041F | CYRILLIC CAPITAL LETTER PE
      90 |  00000420 | CYRILLIC CAPITAL LETTER ER
      91 |  00000421 | CYRILLIC CAPITAL LETTER ES
      92 |  00000422 | CYRILLIC CAPITAL LETTER TE
      93 |  00000423 | CYRILLIC CAPITAL LETTER U
      94 |  00000424 | CYRILLIC CAPITAL LETTER EF
      95 |  00000425 | CYRILLIC CAPITAL LETTER HA
      96 |  00000426 | CYRILLIC CAPITAL LETTER TSE
      97 |  00000427 | CYRILLIC CAPITAL LETTER CHE
      98 |  00000428 | CYRILLIC CAPITAL LETTER SHA
      99 |  00000429 | CYRILLIC CAPITAL LETTER SHCHA
      9A |  0000042A | CYRILLIC CAPITAL LETTER HARD SIGN
      9B |  0000042B | CYRILLIC CAPITAL LETTER YERU
      9C |  0000042C | CYRILLIC CAPITAL LETTER SOFT SIGN
      9D |  0000042D | CYRILLIC CAPITAL LETTER E
      9E |  0000042E | CYRILLIC CAPITAL LETTER YU
      9F |  0000042F | CYRILLIC CAPITAL LETTER YA
      A0 |  00002020 | DAGGER
      A1 |  000000B0 | DEGREE SIGN
      A2 |  000000A2 | CENT SIGN
      A3 |  000000A3 | POUND SIGN
      A4 |  000000A7 | SECTION SIGN
      A5 |  00002022 | BULLET
      A6 |  000000B6 | PILCROW SIGN
      A7 |  00000406 | CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
      A8 |  000000AE | REGISTERED SIGN
      A9 |  000000A9 | COPYRIGHT SIGN
      AA |  00002122 | TRADE MARK SIGN
      AB |  00000402 | CYRILLIC CAPITAL LETTER DJE
      AC |  00000452 | CYRILLIC SMALL LETTER DJE
      AD |  00002260 | NOT EQUAL TO
      AE |  00000403 | CYRILLIC CAPITAL LETTER GJE
      AF |  00000453 | CYRILLIC SMALL LETTER GJE
      B0 |  0000221E | INFINITY
      B1 |  000000B1 | PLUS-MINUS SIGN
      B2 |  00002264 | LESS-THAN OR EQUAL TO
      B3 |  00002265 | GREATER-THAN OR EQUAL TO
      B4 |  00000456 | CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
      B5 |  000000B5 | MICRO SIGN
      B6 |  00002202 | PARTIAL DIFFERENTIAL
      B7 |  00000408 | CYRILLIC CAPITAL LETTER JE
      B8 |  00000404 | CYRILLIC CAPITAL LETTER UKRAINIAN IE
      B9 |  00000454 | CYRILLIC SMALL LETTER UKRAINIAN IE
      BA |  00000407 | CYRILLIC CAPITAL LETTER YI
      BB |  00000457 | CYRILLIC SMALL LETTER YI
      BC |  00000409 | CYRILLIC CAPITAL LETTER LJE
      BD |  00000459 | CYRILLIC SMALL LETTER LJE
      BE |  0000040A | CYRILLIC CAPITAL LETTER NJE
      BF |  0000045A | CYRILLIC SMALL LETTER NJE
      C0 |  00000458 | CYRILLIC SMALL LETTER JE
      C1 |  00000405 | CYRILLIC CAPITAL LETTER DZE
      C2 |  000000AC | NOT SIGN
      C3 |  0000221A | SQUARE ROOT
      C4 |  00000192 | LATIN SMALL LETTER F WITH HOOK
      C5 |  00002248 | ALMOST EQUAL TO
      C6 |  00002206 | INCREMENT
      C7 |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
      C8 |  000000BB | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
      C9 |  00002026 | HORIZONTAL ELLIPSIS
      CA |  000000A0 | NO-BREAK SPACE
      CB |  0000040B | CYRILLIC CAPITAL LETTER TSHE
      CC |  0000045B | CYRILLIC SMALL LETTER TSHE
      CD |  0000040C | CYRILLIC CAPITAL LETTER KJE
      CE |  0000045C | CYRILLIC SMALL LETTER KJE
      CF |  00000455 | CYRILLIC SMALL LETTER DZE
      D0 |  00002013 | EN DASH
      D1 |  00002014 | EM DASH
      D2 |  0000201C | LEFT DOUBLE QUOTATION MARK
      D3 |  0000201D | RIGHT DOUBLE QUOTATION MARK
      D4 |  00002018 | LEFT SINGLE QUOTATION MARK
      D5 |  00002019 | RIGHT SINGLE QUOTATION MARK
      D6 |  000000F7 | DIVISION SIGN
      D7 |  0000201E | DOUBLE LOW-9 QUOTATION MARK
      D8 |  0000040E | CYRILLIC CAPITAL LETTER SHORT U
      D9 |  0000045E | CYRILLIC SMALL LETTER SHORT U
      DA |  0000040F | CYRILLIC CAPITAL LETTER DZHE
      DB |  0000045F | CYRILLIC SMALL LETTER DZHE
      DC |  00002116 | NUMERO SIGN
      DD |  00000401 | CYRILLIC CAPITAL LETTER IO
      DE |  00000451 | CYRILLIC SMALL LETTER IO
      DF |  0000044F | CYRILLIC SMALL LETTER YA
      E0 |  00000430 | CYRILLIC SMALL LETTER A
      E1 |  00000431 | CYRILLIC SMALL LETTER BE
      E2 |  00000432 | CYRILLIC SMALL LETTER VE
      E3 |  00000433 | CYRILLIC SMALL LETTER GHE
      E4 |  00000434 | CYRILLIC SMALL LETTER DE
      E5 |  00000435 | CYRILLIC SMALL LETTER IE
      E6 |  00000436 | CYRILLIC SMALL LETTER ZHE
      E7 |  00000437 | CYRILLIC SMALL LETTER ZE
      E8 |  00000438 | CYRILLIC SMALL LETTER I
      E9 |  00000439 | CYRILLIC SMALL LETTER SHORT I
      EA |  0000043A | CYRILLIC SMALL LETTER KA
      EB |  0000043B | CYRILLIC SMALL LETTER EL
      EC |  0000043C | CYRILLIC SMALL LETTER EM
      ED |  0000043D | CYRILLIC SMALL LETTER EN
      EE |  0000043E | CYRILLIC SMALL LETTER O
      EF |  0000043F | CYRILLIC SMALL LETTER PE
      F0 |  00000440 | CYRILLIC SMALL LETTER ER
      F1 |  00000441 | CYRILLIC SMALL LETTER ES
      F2 |  00000442 | CYRILLIC SMALL LETTER TE
      F3 |  00000443 | CYRILLIC SMALL LETTER U
      F4 |  00000444 | CYRILLIC SMALL LETTER EF
      F5 |  00000445 | CYRILLIC SMALL LETTER HA
      F6 |  00000446 | CYRILLIC SMALL LETTER TSE
      F7 |  00000447 | CYRILLIC SMALL LETTER CHE
      F8 |  00000448 | CYRILLIC SMALL LETTER SHA
      F9 |  00000449 | CYRILLIC SMALL LETTER SHCHA
      FA |  0000044A | CYRILLIC SMALL LETTER HARD SIGN
      FB |  0000044B | CYRILLIC SMALL LETTER YERU
      FC |  0000044C | CYRILLIC SMALL LETTER SOFT SIGN
      FD |  0000044D | CYRILLIC SMALL LETTER E
      FE |  0000044E | CYRILLIC SMALL LETTER YU
      FF |  000000A4 | CURRENCY SIGN
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_MACCYRILLIC

    $main::fatpacked{"Locale/RecodeData/MACGREEK.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_MACGREEK';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for MACGREEK.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::MACGREEK;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0x00c4,
      0x00b9,
      0x00b2,
      0x00c9,
      0x00b3,
      0x00d6,
      0x00dc,
      0x0385,
      0x00e0,
      0x00e2,
      0x00e4,
      0x0384,
      0x00a8,
      0x00e7,
      0x00e9,
      0x00e8,
      0x00ea,
      0x00eb,
      0x00a3,
      0x2122,
      0x00ee,
      0x00ef,
      0x2022,
      0x00bd,
      0x2030,
      0x00f4,
      0x00f6,
      0x00a6,
      0x00ad,
      0x00f9,
      0x00fb,
      0x00fc,
      0x2020,
      0x0393,
      0x0394,
      0x0398,
      0x039b,
      0x039e,
      0x03a0,
      0x00df,
      0x00ae,
      0x00a9,
      0x03a3,
      0x03aa,
      0x00a7,
      0x2260,
      0x00b0,
      0x0387,
      0x0391,
      0x00b1,
      0x2264,
      0x2265,
      0x00a5,
      0x0392,
      0x0395,
      0x0396,
      0x0397,
      0x0399,
      0x039a,
      0x039c,
      0x03a6,
      0x03ab,
      0x03a8,
      0x03a9,
      0x03ac,
      0x039d,
      0x00ac,
      0x039f,
      0x03a1,
      0x2248,
      0x03a4,
      0x00ab,
      0x00bb,
      0x2026,
      0x00a0,
      0x03a5,
      0x03a7,
      0x0386,
      0x0388,
      0x0153,
      0x2013,
      0x2015,
      0x201c,
      0x201d,
      0x2018,
      0x2019,
      0x00f7,
      0x0389,
      0x038a,
      0x038c,
      0x038e,
      0x03ad,
      0x03ae,
      0x03af,
      0x03cc,
      0x038f,
      0x03cd,
      0x03b1,
      0x03b2,
      0x03c8,
      0x03b4,
      0x03b5,
      0x03c6,
      0x03b3,
      0x03b7,
      0x03b9,
      0x03be,
      0x03ba,
      0x03bb,
      0x03bc,
      0x03bd,
      0x03bf,
      0x03c0,
      0x03ce,
      0x03c1,
      0x03c3,
      0x03c4,
      0x03b8,
      0x03c9,
      0x03c2,
      0x03c7,
      0x03c5,
      0x03b6,
      0x03ca,
      0x03cb,
      0x0390,
      0x03b0,
      0xfffd,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xc3\x84",
      "\xc2\xb9",
      "\xc2\xb2",
      "\xc3\x89",
      "\xc2\xb3",
      "\xc3\x96",
      "\xc3\x9c",
      "\xce\x85",
      "\xc3\xa0",
      "\xc3\xa2",
      "\xc3\xa4",
      "\xce\x84",
      "\xc2\xa8",
      "\xc3\xa7",
      "\xc3\xa9",
      "\xc3\xa8",
      "\xc3\xaa",
      "\xc3\xab",
      "\xc2\xa3",
      "\xe2\x84\xa2",
      "\xc3\xae",
      "\xc3\xaf",
      "\xe2\x80\xa2",
      "\xc2\xbd",
      "\xe2\x80\xb0",
      "\xc3\xb4",
      "\xc3\xb6",
      "\xc2\xa6",
      "\xc2\xad",
      "\xc3\xb9",
      "\xc3\xbb",
      "\xc3\xbc",
      "\xe2\x80\xa0",
      "\xce\x93",
      "\xce\x94",
      "\xce\x98",
      "\xce\x9b",
      "\xce\x9e",
      "\xce\xa0",
      "\xc3\x9f",
      "\xc2\xae",
      "\xc2\xa9",
      "\xce\xa3",
      "\xce\xaa",
      "\xc2\xa7",
      "\xe2\x89\xa0",
      "\xc2\xb0",
      "\xce\x87",
      "\xce\x91",
      "\xc2\xb1",
      "\xe2\x89\xa4",
      "\xe2\x89\xa5",
      "\xc2\xa5",
      "\xce\x92",
      "\xce\x95",
      "\xce\x96",
      "\xce\x97",
      "\xce\x99",
      "\xce\x9a",
      "\xce\x9c",
      "\xce\xa6",
      "\xce\xab",
      "\xce\xa8",
      "\xce\xa9",
      "\xce\xac",
      "\xce\x9d",
      "\xc2\xac",
      "\xce\x9f",
      "\xce\xa1",
      "\xe2\x89\x88",
      "\xce\xa4",
      "\xc2\xab",
      "\xc2\xbb",
      "\xe2\x80\xa6",
      "\xc2\xa0",
      "\xce\xa5",
      "\xce\xa7",
      "\xce\x86",
      "\xce\x88",
      "\xc5\x93",
      "\xe2\x80\x93",
      "\xe2\x80\x95",
      "\xe2\x80\x9c",
      "\xe2\x80\x9d",
      "\xe2\x80\x98",
      "\xe2\x80\x99",
      "\xc3\xb7",
      "\xce\x89",
      "\xce\x8a",
      "\xce\x8c",
      "\xce\x8e",
      "\xce\xad",
      "\xce\xae",
      "\xce\xaf",
      "\xcf\x8c",
      "\xce\x8f",
      "\xcf\x8d",
      "\xce\xb1",
      "\xce\xb2",
      "\xcf\x88",
      "\xce\xb4",
      "\xce\xb5",
      "\xcf\x86",
      "\xce\xb3",
      "\xce\xb7",
      "\xce\xb9",
      "\xce\xbe",
      "\xce\xba",
      "\xce\xbb",
      "\xce\xbc",
      "\xce\xbd",
      "\xce\xbf",
      "\xcf\x80",
      "\xcf\x8e",
      "\xcf\x81",
      "\xcf\x83",
      "\xcf\x84",
      "\xce\xb8",
      "\xcf\x89",
      "\xcf\x82",
      "\xcf\x87",
      "\xcf\x85",
      "\xce\xb6",
      "\xcf\x8a",
      "\xcf\x8b",
      "\xce\x90",
      "\xce\xb0",
      "\xef\xbf\xbd",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x000000a0 => "\xca",
      0x000000a3 => "\x92",
      0x000000a5 => "\xb4",
      0x000000a6 => "\x9b",
      0x000000a7 => "\xac",
      0x000000a8 => "\x8c",
      0x000000a9 => "\xa9",
      0x000000ab => "\xc7",
      0x000000ac => "\xc2",
      0x000000ad => "\x9c",
      0x000000ae => "\xa8",
      0x000000b0 => "\xae",
      0x000000b1 => "\xb1",
      0x000000b2 => "\x82",
      0x000000b3 => "\x84",
      0x000000b9 => "\x81",
      0x000000bb => "\xc8",
      0x000000bd => "\x97",
      0x000000c4 => "\x80",
      0x000000c9 => "\x83",
      0x000000d6 => "\x85",
      0x000000dc => "\x86",
      0x000000df => "\xa7",
      0x000000e0 => "\x88",
      0x000000e2 => "\x89",
      0x000000e4 => "\x8a",
      0x000000e7 => "\x8d",
      0x000000e8 => "\x8f",
      0x000000e9 => "\x8e",
      0x000000ea => "\x90",
      0x000000eb => "\x91",
      0x000000ee => "\x94",
      0x000000ef => "\x95",
      0x000000f4 => "\x99",
      0x000000f6 => "\x9a",
      0x000000f7 => "\xd6",
      0x000000f9 => "\x9d",
      0x000000fb => "\x9e",
      0x000000fc => "\x9f",
      0x00000153 => "\xcf",
      0x00000384 => "\x8b",
      0x00000385 => "\x87",
      0x00000386 => "\xcd",
      0x00000387 => "\xaf",
      0x00000388 => "\xce",
      0x00000389 => "\xd7",
      0x0000038a => "\xd8",
      0x0000038c => "\xd9",
      0x0000038e => "\xda",
      0x0000038f => "\xdf",
      0x00000390 => "\xfd",
      0x00000391 => "\xb0",
      0x00000392 => "\xb5",
      0x00000393 => "\xa1",
      0x00000394 => "\xa2",
      0x00000395 => "\xb6",
      0x00000396 => "\xb7",
      0x00000397 => "\xb8",
      0x00000398 => "\xa3",
      0x00000399 => "\xb9",
      0x0000039a => "\xba",
      0x0000039b => "\xa4",
      0x0000039c => "\xbb",
      0x0000039d => "\xc1",
      0x0000039e => "\xa5",
      0x0000039f => "\xc3",
      0x000003a0 => "\xa6",
      0x000003a1 => "\xc4",
      0x000003a3 => "\xaa",
      0x000003a4 => "\xc6",
      0x000003a5 => "\xcb",
      0x000003a6 => "\xbc",
      0x000003a7 => "\xcc",
      0x000003a8 => "\xbe",
      0x000003a9 => "\xbf",
      0x000003aa => "\xab",
      0x000003ab => "\xbd",
      0x000003ac => "\xc0",
      0x000003ad => "\xdb",
      0x000003ae => "\xdc",
      0x000003af => "\xdd",
      0x000003b0 => "\xfe",
      0x000003b1 => "\xe1",
      0x000003b2 => "\xe2",
      0x000003b3 => "\xe7",
      0x000003b4 => "\xe4",
      0x000003b5 => "\xe5",
      0x000003b6 => "\xfa",
      0x000003b7 => "\xe8",
      0x000003b8 => "\xf5",
      0x000003b9 => "\xe9",
      0x000003ba => "\xeb",
      0x000003bb => "\xec",
      0x000003bc => "\xed",
      0x000003bd => "\xee",
      0x000003be => "\xea",
      0x000003bf => "\xef",
      0x000003c0 => "\xf0",
      0x000003c1 => "\xf2",
      0x000003c2 => "\xf7",
      0x000003c3 => "\xf3",
      0x000003c4 => "\xf4",
      0x000003c5 => "\xf9",
      0x000003c6 => "\xe6",
      0x000003c7 => "\xf8",
      0x000003c8 => "\xe3",
      0x000003c9 => "\xf6",
      0x000003ca => "\xfb",
      0x000003cb => "\xfc",
      0x000003cc => "\xde",
      0x000003cd => "\xe0",
      0x000003ce => "\xf1",
      0x00002013 => "\xd0",
      0x00002015 => "\xd1",
      0x00002018 => "\xd4",
      0x00002019 => "\xd5",
      0x0000201c => "\xd2",
      0x0000201d => "\xd3",
      0x00002020 => "\xa0",
      0x00002022 => "\x96",
      0x00002026 => "\xc9",
      0x00002030 => "\x98",
      0x00002122 => "\x93",
      0x00002248 => "\xc5",
      0x00002260 => "\xad",
      0x00002264 => "\xb2",
      0x00002265 => "\xb3",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::MACGREEK - Conversion routines for MACGREEK
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for MACGREEK.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
  
   This charmap has been generated automatically from GNU libiconv
   conversions.
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE (DEL)
      80 |  000000C4 | LATIN CAPITAL LETTER A WITH DIAERESIS
      81 |  000000B9 | SUPERSCRIPT ONE
      82 |  000000B2 | SUPERSCRIPT TWO
      83 |  000000C9 | LATIN CAPITAL LETTER E WITH ACUTE
      84 |  000000B3 | SUPERSCRIPT THREE
      85 |  000000D6 | LATIN CAPITAL LETTER O WITH DIAERESIS
      86 |  000000DC | LATIN CAPITAL LETTER U WITH DIAERESIS
      87 |  00000385 | GREEK DIALYTIKA TONOS
      88 |  000000E0 | LATIN SMALL LETTER A WITH GRAVE
      89 |  000000E2 | LATIN SMALL LETTER A WITH CIRCUMFLEX
      8A |  000000E4 | LATIN SMALL LETTER A WITH DIAERESIS
      8B |  00000384 | GREEK TONOS
      8C |  000000A8 | DIAERESIS
      8D |  000000E7 | LATIN SMALL LETTER C WITH CEDILLA
      8E |  000000E9 | LATIN SMALL LETTER E WITH ACUTE
      8F |  000000E8 | LATIN SMALL LETTER E WITH GRAVE
      90 |  000000EA | LATIN SMALL LETTER E WITH CIRCUMFLEX
      91 |  000000EB | LATIN SMALL LETTER E WITH DIAERESIS
      92 |  000000A3 | POUND SIGN
      93 |  00002122 | TRADE MARK SIGN
      94 |  000000EE | LATIN SMALL LETTER I WITH CIRCUMFLEX
      95 |  000000EF | LATIN SMALL LETTER I WITH DIAERESIS
      96 |  00002022 | BULLET
      97 |  000000BD | VULGAR FRACTION ONE HALF
      98 |  00002030 | PER MILLE SIGN
      99 |  000000F4 | LATIN SMALL LETTER O WITH CIRCUMFLEX
      9A |  000000F6 | LATIN SMALL LETTER O WITH DIAERESIS
      9B |  000000A6 | BROKEN BAR
      9C |  000000AD | SOFT HYPHEN
      9D |  000000F9 | LATIN SMALL LETTER U WITH GRAVE
      9E |  000000FB | LATIN SMALL LETTER U WITH CIRCUMFLEX
      9F |  000000FC | LATIN SMALL LETTER U WITH DIAERESIS
      A0 |  00002020 | DAGGER
      A1 |  00000393 | GREEK CAPITAL LETTER GAMMA
      A2 |  00000394 | GREEK CAPITAL LETTER DELTA
      A3 |  00000398 | GREEK CAPITAL LETTER THETA
      A4 |  0000039B | GREEK CAPITAL LETTER LAMDA
      A5 |  0000039E | GREEK CAPITAL LETTER XI
      A6 |  000003A0 | GREEK CAPITAL LETTER PI
      A7 |  000000DF | LATIN SMALL LETTER SHARP S
      A8 |  000000AE | REGISTERED SIGN
      A9 |  000000A9 | COPYRIGHT SIGN
      AA |  000003A3 | GREEK CAPITAL LETTER SIGMA
      AB |  000003AA | GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
      AC |  000000A7 | SECTION SIGN
      AD |  00002260 | NOT EQUAL TO
      AE |  000000B0 | DEGREE SIGN
      AF |  00000387 | GREEK ANO TELEIA
      B0 |  00000391 | GREEK CAPITAL LETTER ALPHA
      B1 |  000000B1 | PLUS-MINUS SIGN
      B2 |  00002264 | LESS-THAN OR EQUAL TO
      B3 |  00002265 | GREATER-THAN OR EQUAL TO
      B4 |  000000A5 | YEN SIGN
      B5 |  00000392 | GREEK CAPITAL LETTER BETA
      B6 |  00000395 | GREEK CAPITAL LETTER EPSILON
      B7 |  00000396 | GREEK CAPITAL LETTER ZETA
      B8 |  00000397 | GREEK CAPITAL LETTER ETA
      B9 |  00000399 | GREEK CAPITAL LETTER IOTA
      BA |  0000039A | GREEK CAPITAL LETTER KAPPA
      BB |  0000039C | GREEK CAPITAL LETTER MU
      BC |  000003A6 | GREEK CAPITAL LETTER PHI
      BD |  000003AB | GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
      BE |  000003A8 | GREEK CAPITAL LETTER PSI
      BF |  000003A9 | GREEK CAPITAL LETTER OMEGA
      C0 |  000003AC | GREEK SMALL LETTER ALPHA WITH TONOS
      C1 |  0000039D | GREEK CAPITAL LETTER NU
      C2 |  000000AC | NOT SIGN
      C3 |  0000039F | GREEK CAPITAL LETTER OMICRON
      C4 |  000003A1 | GREEK CAPITAL LETTER RHO
      C5 |  00002248 | ALMOST EQUAL TO
      C6 |  000003A4 | GREEK CAPITAL LETTER TAU
      C7 |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
      C8 |  000000BB | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
      C9 |  00002026 | HORIZONTAL ELLIPSIS
      CA |  000000A0 | NO-BREAK SPACE
      CB |  000003A5 | GREEK CAPITAL LETTER UPSILON
      CC |  000003A7 | GREEK CAPITAL LETTER CHI
      CD |  00000386 | GREEK CAPITAL LETTER ALPHA WITH TONOS
      CE |  00000388 | GREEK CAPITAL LETTER EPSILON WITH TONOS
      CF |  00000153 | LATIN SMALL LIGATURE OE
      D0 |  00002013 | EN DASH
      D1 |  00002015 | HORIZONTAL BAR
      D2 |  0000201C | LEFT DOUBLE QUOTATION MARK
      D3 |  0000201D | RIGHT DOUBLE QUOTATION MARK
      D4 |  00002018 | LEFT SINGLE QUOTATION MARK
      D5 |  00002019 | RIGHT SINGLE QUOTATION MARK
      D6 |  000000F7 | DIVISION SIGN
      D7 |  00000389 | GREEK CAPITAL LETTER ETA WITH TONOS
      D8 |  0000038A | GREEK CAPITAL LETTER IOTA WITH TONOS
      D9 |  0000038C | GREEK CAPITAL LETTER OMICRON WITH TONOS
      DA |  0000038E | GREEK CAPITAL LETTER UPSILON WITH TONOS
      DB |  000003AD | GREEK SMALL LETTER EPSILON WITH TONOS
      DC |  000003AE | GREEK SMALL LETTER ETA WITH TONOS
      DD |  000003AF | GREEK SMALL LETTER IOTA WITH TONOS
      DE |  000003CC | GREEK SMALL LETTER OMICRON WITH TONOS
      DF |  0000038F | GREEK CAPITAL LETTER OMEGA WITH TONOS
      E0 |  000003CD | GREEK SMALL LETTER UPSILON WITH TONOS
      E1 |  000003B1 | GREEK SMALL LETTER ALPHA
      E2 |  000003B2 | GREEK SMALL LETTER BETA
      E3 |  000003C8 | GREEK SMALL LETTER PSI
      E4 |  000003B4 | GREEK SMALL LETTER DELTA
      E5 |  000003B5 | GREEK SMALL LETTER EPSILON
      E6 |  000003C6 | GREEK SMALL LETTER PHI
      E7 |  000003B3 | GREEK SMALL LETTER GAMMA
      E8 |  000003B7 | GREEK SMALL LETTER ETA
      E9 |  000003B9 | GREEK SMALL LETTER IOTA
      EA |  000003BE | GREEK SMALL LETTER XI
      EB |  000003BA | GREEK SMALL LETTER KAPPA
      EC |  000003BB | GREEK SMALL LETTER LAMDA
      ED |  000003BC | GREEK SMALL LETTER MU
      EE |  000003BD | GREEK SMALL LETTER NU
      EF |  000003BF | GREEK SMALL LETTER OMICRON
      F0 |  000003C0 | GREEK SMALL LETTER PI
      F1 |  000003CE | GREEK SMALL LETTER OMEGA WITH TONOS
      F2 |  000003C1 | GREEK SMALL LETTER RHO
      F3 |  000003C3 | GREEK SMALL LETTER SIGMA
      F4 |  000003C4 | GREEK SMALL LETTER TAU
      F5 |  000003B8 | GREEK SMALL LETTER THETA
      F6 |  000003C9 | GREEK SMALL LETTER OMEGA
      F7 |  000003C2 | GREEK SMALL LETTER FINAL SIGMA
      F8 |  000003C7 | GREEK SMALL LETTER CHI
      F9 |  000003C5 | GREEK SMALL LETTER UPSILON
      FA |  000003B6 | GREEK SMALL LETTER ZETA
      FB |  000003CA | GREEK SMALL LETTER IOTA WITH DIALYTIKA
      FC |  000003CB | GREEK SMALL LETTER UPSILON WITH DIALYTIKA
      FD |  00000390 | GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
      FE |  000003B0 | GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_MACGREEK

    $main::fatpacked{"Locale/RecodeData/MACHEBREW.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_MACHEBREW';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for MACHEBREW.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::MACHEBREW;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0x00c4,
      0xfb1f,
      0x00c7,
      0x00c9,
      0x00d1,
      0x00d6,
      0x00dc,
      0x00e1,
      0x00e0,
      0x00e2,
      0x00e4,
      0x00e3,
      0x00e5,
      0x00e7,
      0x00e9,
      0x00e8,
      0x00ea,
      0x00eb,
      0x00ed,
      0x00ec,
      0x00ee,
      0x00ef,
      0x00f1,
      0x00f3,
      0x00f2,
      0x00f4,
      0x00f6,
      0x00f5,
      0x00fa,
      0x00f9,
      0x00fb,
      0x00fc,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x20aa,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x201e,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x05bc,
      0xfb4b,
      0xfb35,
      0x2026,
      0x00a0,
      0x05b8,
      0x05b7,
      0x05b5,
      0x05b6,
      0x05b4,
      0x2013,
      0x2014,
      0x201c,
      0x201d,
      0x2018,
      0x2019,
      0xfb2a,
      0xfb2b,
      0x05bf,
      0x05b0,
      0x05b2,
      0x05b1,
      0x05bb,
      0x05b9,
      0xfffd,
      0x05b3,
      0x05d0,
      0x05d1,
      0x05d2,
      0x05d3,
      0x05d4,
      0x05d5,
      0x05d6,
      0x05d7,
      0x05d8,
      0x05d9,
      0x05da,
      0x05db,
      0x05dc,
      0x05dd,
      0x05de,
      0x05df,
      0x05e0,
      0x05e1,
      0x05e2,
      0x05e3,
      0x05e4,
      0x05e5,
      0x05e6,
      0x05e7,
      0x05e8,
      0x05e9,
      0x05ea,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xc3\x84",
      "\xef\xac\x9f",
      "\xc3\x87",
      "\xc3\x89",
      "\xc3\x91",
      "\xc3\x96",
      "\xc3\x9c",
      "\xc3\xa1",
      "\xc3\xa0",
      "\xc3\xa2",
      "\xc3\xa4",
      "\xc3\xa3",
      "\xc3\xa5",
      "\xc3\xa7",
      "\xc3\xa9",
      "\xc3\xa8",
      "\xc3\xaa",
      "\xc3\xab",
      "\xc3\xad",
      "\xc3\xac",
      "\xc3\xae",
      "\xc3\xaf",
      "\xc3\xb1",
      "\xc3\xb3",
      "\xc3\xb2",
      "\xc3\xb4",
      "\xc3\xb6",
      "\xc3\xb5",
      "\xc3\xba",
      "\xc3\xb9",
      "\xc3\xbb",
      "\xc3\xbc",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xe2\x82\xaa",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xe2\x80\x9e",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xd6\xbc",
      "\xef\xad\x8b",
      "\xef\xac\xb5",
      "\xe2\x80\xa6",
      "\xc2\xa0",
      "\xd6\xb8",
      "\xd6\xb7",
      "\xd6\xb5",
      "\xd6\xb6",
      "\xd6\xb4",
      "\xe2\x80\x93",
      "\xe2\x80\x94",
      "\xe2\x80\x9c",
      "\xe2\x80\x9d",
      "\xe2\x80\x98",
      "\xe2\x80\x99",
      "\xef\xac\xaa",
      "\xef\xac\xab",
      "\xd6\xbf",
      "\xd6\xb0",
      "\xd6\xb2",
      "\xd6\xb1",
      "\xd6\xbb",
      "\xd6\xb9",
      "\xef\xbf\xbd",
      "\xd6\xb3",
      "\xd7\x90",
      "\xd7\x91",
      "\xd7\x92",
      "\xd7\x93",
      "\xd7\x94",
      "\xd7\x95",
      "\xd7\x96",
      "\xd7\x97",
      "\xd7\x98",
      "\xd7\x99",
      "\xd7\x9a",
      "\xd7\x9b",
      "\xd7\x9c",
      "\xd7\x9d",
      "\xd7\x9e",
      "\xd7\x9f",
      "\xd7\xa0",
      "\xd7\xa1",
      "\xd7\xa2",
      "\xd7\xa3",
      "\xd7\xa4",
      "\xd7\xa5",
      "\xd7\xa6",
      "\xd7\xa7",
      "\xd7\xa8",
      "\xd7\xa9",
      "\xd7\xaa",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x000000a0 => "\xca",
      0x000000c4 => "\x80",
      0x000000c7 => "\x82",
      0x000000c9 => "\x83",
      0x000000d1 => "\x84",
      0x000000d6 => "\x85",
      0x000000dc => "\x86",
      0x000000e0 => "\x88",
      0x000000e1 => "\x87",
      0x000000e2 => "\x89",
      0x000000e3 => "\x8b",
      0x000000e4 => "\x8a",
      0x000000e5 => "\x8c",
      0x000000e7 => "\x8d",
      0x000000e8 => "\x8f",
      0x000000e9 => "\x8e",
      0x000000ea => "\x90",
      0x000000eb => "\x91",
      0x000000ec => "\x93",
      0x000000ed => "\x92",
      0x000000ee => "\x94",
      0x000000ef => "\x95",
      0x000000f1 => "\x96",
      0x000000f2 => "\x98",
      0x000000f3 => "\x97",
      0x000000f4 => "\x99",
      0x000000f5 => "\x9b",
      0x000000f6 => "\x9a",
      0x000000f9 => "\x9d",
      0x000000fa => "\x9c",
      0x000000fb => "\x9e",
      0x000000fc => "\x9f",
      0x000005b0 => "\xd9",
      0x000005b1 => "\xdb",
      0x000005b2 => "\xda",
      0x000005b3 => "\xdf",
      0x000005b4 => "\xcf",
      0x000005b5 => "\xcd",
      0x000005b6 => "\xce",
      0x000005b7 => "\xcc",
      0x000005b8 => "\xcb",
      0x000005b9 => "\xdd",
      0x000005bb => "\xdc",
      0x000005bc => "\xc6",
      0x000005bf => "\xd8",
      0x000005d0 => "\xe0",
      0x000005d1 => "\xe1",
      0x000005d2 => "\xe2",
      0x000005d3 => "\xe3",
      0x000005d4 => "\xe4",
      0x000005d5 => "\xe5",
      0x000005d6 => "\xe6",
      0x000005d7 => "\xe7",
      0x000005d8 => "\xe8",
      0x000005d9 => "\xe9",
      0x000005da => "\xea",
      0x000005db => "\xeb",
      0x000005dc => "\xec",
      0x000005dd => "\xed",
      0x000005de => "\xee",
      0x000005df => "\xef",
      0x000005e0 => "\xf0",
      0x000005e1 => "\xf1",
      0x000005e2 => "\xf2",
      0x000005e3 => "\xf3",
      0x000005e4 => "\xf4",
      0x000005e5 => "\xf5",
      0x000005e6 => "\xf6",
      0x000005e7 => "\xf7",
      0x000005e8 => "\xf8",
      0x000005e9 => "\xf9",
      0x000005ea => "\xfa",
      0x00002013 => "\xd0",
      0x00002014 => "\xd1",
      0x00002018 => "\xd4",
      0x00002019 => "\xd5",
      0x0000201c => "\xd2",
      0x0000201d => "\xd3",
      0x0000201e => "\xc1",
      0x00002026 => "\xc9",
      0x000020aa => "\xa6",
      0x0000fb1f => "\x81",
      0x0000fb2a => "\xd6",
      0x0000fb2b => "\xd7",
      0x0000fb35 => "\xc8",
      0x0000fb4b => "\xc7",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::MACHEBREW - Conversion routines for MACHEBREW
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for MACHEBREW.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
  
   This charmap has been generated automatically from GNU libiconv
   conversions.
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE (DEL)
      80 |  000000C4 | LATIN CAPITAL LETTER A WITH DIAERESIS
      81 |  0000FB1F | HEBREW LIGATURE YIDDISH YOD YOD PATAH
      82 |  000000C7 | LATIN CAPITAL LETTER C WITH CEDILLA
      83 |  000000C9 | LATIN CAPITAL LETTER E WITH ACUTE
      84 |  000000D1 | LATIN CAPITAL LETTER N WITH TILDE
      85 |  000000D6 | LATIN CAPITAL LETTER O WITH DIAERESIS
      86 |  000000DC | LATIN CAPITAL LETTER U WITH DIAERESIS
      87 |  000000E1 | LATIN SMALL LETTER A WITH ACUTE
      88 |  000000E0 | LATIN SMALL LETTER A WITH GRAVE
      89 |  000000E2 | LATIN SMALL LETTER A WITH CIRCUMFLEX
      8A |  000000E4 | LATIN SMALL LETTER A WITH DIAERESIS
      8B |  000000E3 | LATIN SMALL LETTER A WITH TILDE
      8C |  000000E5 | LATIN SMALL LETTER A WITH RING ABOVE
      8D |  000000E7 | LATIN SMALL LETTER C WITH CEDILLA
      8E |  000000E9 | LATIN SMALL LETTER E WITH ACUTE
      8F |  000000E8 | LATIN SMALL LETTER E WITH GRAVE
      90 |  000000EA | LATIN SMALL LETTER E WITH CIRCUMFLEX
      91 |  000000EB | LATIN SMALL LETTER E WITH DIAERESIS
      92 |  000000ED | LATIN SMALL LETTER I WITH ACUTE
      93 |  000000EC | LATIN SMALL LETTER I WITH GRAVE
      94 |  000000EE | LATIN SMALL LETTER I WITH CIRCUMFLEX
      95 |  000000EF | LATIN SMALL LETTER I WITH DIAERESIS
      96 |  000000F1 | LATIN SMALL LETTER N WITH TILDE
      97 |  000000F3 | LATIN SMALL LETTER O WITH ACUTE
      98 |  000000F2 | LATIN SMALL LETTER O WITH GRAVE
      99 |  000000F4 | LATIN SMALL LETTER O WITH CIRCUMFLEX
      9A |  000000F6 | LATIN SMALL LETTER O WITH DIAERESIS
      9B |  000000F5 | LATIN SMALL LETTER O WITH TILDE
      9C |  000000FA | LATIN SMALL LETTER U WITH ACUTE
      9D |  000000F9 | LATIN SMALL LETTER U WITH GRAVE
      9E |  000000FB | LATIN SMALL LETTER U WITH CIRCUMFLEX
      9F |  000000FC | LATIN SMALL LETTER U WITH DIAERESIS
      A6 |  000020AA | NEW SHEQEL SIGN
      C1 |  0000201E | DOUBLE LOW-9 QUOTATION MARK
      C6 |  000005BC | HEBREW POINT DAGESH OR MAPIQ
      C7 |  0000FB4B | HEBREW LETTER VAV WITH HOLAM
      C8 |  0000FB35 | HEBREW LETTER VAV WITH DAGESH
      C9 |  00002026 | HORIZONTAL ELLIPSIS
      CA |  000000A0 | NO-BREAK SPACE
      CB |  000005B8 | HEBREW POINT QAMATS
      CC |  000005B7 | HEBREW POINT PATAH
      CD |  000005B5 | HEBREW POINT TSERE
      CE |  000005B6 | HEBREW POINT SEGOL
      CF |  000005B4 | HEBREW POINT HIRIQ
      D0 |  00002013 | EN DASH
      D1 |  00002014 | EM DASH
      D2 |  0000201C | LEFT DOUBLE QUOTATION MARK
      D3 |  0000201D | RIGHT DOUBLE QUOTATION MARK
      D4 |  00002018 | LEFT SINGLE QUOTATION MARK
      D5 |  00002019 | RIGHT SINGLE QUOTATION MARK
      D6 |  0000FB2A | HEBREW LETTER SHIN WITH SHIN DOT
      D7 |  0000FB2B | HEBREW LETTER SHIN WITH SIN DOT
      D8 |  000005BF | HEBREW POINT RAFE
      D9 |  000005B0 | HEBREW POINT SHEVA
      DA |  000005B2 | HEBREW POINT HATAF PATAH
      DB |  000005B1 | HEBREW POINT HATAF SEGOL
      DC |  000005BB | HEBREW POINT QUBUTS
      DD |  000005B9 | HEBREW POINT HOLAM
      DF |  000005B3 | HEBREW POINT HATAF QAMATS
      E0 |  000005D0 | HEBREW LETTER ALEF
      E1 |  000005D1 | HEBREW LETTER BET
      E2 |  000005D2 | HEBREW LETTER GIMEL
      E3 |  000005D3 | HEBREW LETTER DALET
      E4 |  000005D4 | HEBREW LETTER HE
      E5 |  000005D5 | HEBREW LETTER VAV
      E6 |  000005D6 | HEBREW LETTER ZAYIN
      E7 |  000005D7 | HEBREW LETTER HET
      E8 |  000005D8 | HEBREW LETTER TET
      E9 |  000005D9 | HEBREW LETTER YOD
      EA |  000005DA | HEBREW LETTER FINAL KAF
      EB |  000005DB | HEBREW LETTER KAF
      EC |  000005DC | HEBREW LETTER LAMED
      ED |  000005DD | HEBREW LETTER FINAL MEM
      EE |  000005DE | HEBREW LETTER MEM
      EF |  000005DF | HEBREW LETTER FINAL NUN
      F0 |  000005E0 | HEBREW LETTER NUN
      F1 |  000005E1 | HEBREW LETTER SAMEKH
      F2 |  000005E2 | HEBREW LETTER AYIN
      F3 |  000005E3 | HEBREW LETTER FINAL PE
      F4 |  000005E4 | HEBREW LETTER PE
      F5 |  000005E5 | HEBREW LETTER FINAL TSADI
      F6 |  000005E6 | HEBREW LETTER TSADI
      F7 |  000005E7 | HEBREW LETTER QOF
      F8 |  000005E8 | HEBREW LETTER RESH
      F9 |  000005E9 | HEBREW LETTER SHIN
      FA |  000005EA | HEBREW LETTER TAV
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_MACHEBREW

    $main::fatpacked{"Locale/RecodeData/MACICELAND.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_MACICELAND';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for MACICELAND.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::MACICELAND;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0x00c4,
      0x00c5,
      0x00c7,
      0x00c9,
      0x00d1,
      0x00d6,
      0x00dc,
      0x00e1,
      0x00e0,
      0x00e2,
      0x00e4,
      0x00e3,
      0x00e5,
      0x00e7,
      0x00e9,
      0x00e8,
      0x00ea,
      0x00eb,
      0x00ed,
      0x00ec,
      0x00ee,
      0x00ef,
      0x00f1,
      0x00f3,
      0x00f2,
      0x00f4,
      0x00f6,
      0x00f5,
      0x00fa,
      0x00f9,
      0x00fb,
      0x00fc,
      0x00dd,
      0x00b0,
      0x00a2,
      0x00a3,
      0x00a7,
      0x2022,
      0x00b6,
      0x00df,
      0x00ae,
      0x00a9,
      0x2122,
      0x00b4,
      0x00a8,
      0x2260,
      0x00c6,
      0x00d8,
      0x221e,
      0x00b1,
      0x2264,
      0x2265,
      0x00a5,
      0x00b5,
      0x2202,
      0x2211,
      0x220f,
      0x03c0,
      0x222b,
      0x00aa,
      0x00ba,
      0x2126,
      0x00e6,
      0x00f8,
      0x00bf,
      0x00a1,
      0x00ac,
      0x221a,
      0x0192,
      0x2248,
      0x2206,
      0x00ab,
      0x00bb,
      0x2026,
      0x00a0,
      0x00c0,
      0x00c3,
      0x00d5,
      0x0152,
      0x0153,
      0x2013,
      0x2014,
      0x201c,
      0x201d,
      0x2018,
      0x2019,
      0x00f7,
      0x25ca,
      0x00ff,
      0x0178,
      0x2044,
      0x00a4,
      0x00d0,
      0x00f0,
      0x00de,
      0x00fe,
      0x00fd,
      0x00b7,
      0x201a,
      0x201e,
      0x2030,
      0x00c2,
      0x00ca,
      0x00c1,
      0x00cb,
      0x00c8,
      0x00cd,
      0x00ce,
      0x00cf,
      0x00cc,
      0x00d3,
      0x00d4,
      0xfffd,
      0x00d2,
      0x00da,
      0x00db,
      0x00d9,
      0x0131,
      0x02c6,
      0x02dc,
      0x00af,
      0x02d8,
      0x02d9,
      0x02da,
      0x00b8,
      0x02dd,
      0x02db,
      0x02c7,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xc3\x84",
      "\xc3\x85",
      "\xc3\x87",
      "\xc3\x89",
      "\xc3\x91",
      "\xc3\x96",
      "\xc3\x9c",
      "\xc3\xa1",
      "\xc3\xa0",
      "\xc3\xa2",
      "\xc3\xa4",
      "\xc3\xa3",
      "\xc3\xa5",
      "\xc3\xa7",
      "\xc3\xa9",
      "\xc3\xa8",
      "\xc3\xaa",
      "\xc3\xab",
      "\xc3\xad",
      "\xc3\xac",
      "\xc3\xae",
      "\xc3\xaf",
      "\xc3\xb1",
      "\xc3\xb3",
      "\xc3\xb2",
      "\xc3\xb4",
      "\xc3\xb6",
      "\xc3\xb5",
      "\xc3\xba",
      "\xc3\xb9",
      "\xc3\xbb",
      "\xc3\xbc",
      "\xc3\x9d",
      "\xc2\xb0",
      "\xc2\xa2",
      "\xc2\xa3",
      "\xc2\xa7",
      "\xe2\x80\xa2",
      "\xc2\xb6",
      "\xc3\x9f",
      "\xc2\xae",
      "\xc2\xa9",
      "\xe2\x84\xa2",
      "\xc2\xb4",
      "\xc2\xa8",
      "\xe2\x89\xa0",
      "\xc3\x86",
      "\xc3\x98",
      "\xe2\x88\x9e",
      "\xc2\xb1",
      "\xe2\x89\xa4",
      "\xe2\x89\xa5",
      "\xc2\xa5",
      "\xc2\xb5",
      "\xe2\x88\x82",
      "\xe2\x88\x91",
      "\xe2\x88\x8f",
      "\xcf\x80",
      "\xe2\x88\xab",
      "\xc2\xaa",
      "\xc2\xba",
      "\xe2\x84\xa6",
      "\xc3\xa6",
      "\xc3\xb8",
      "\xc2\xbf",
      "\xc2\xa1",
      "\xc2\xac",
      "\xe2\x88\x9a",
      "\xc6\x92",
      "\xe2\x89\x88",
      "\xe2\x88\x86",
      "\xc2\xab",
      "\xc2\xbb",
      "\xe2\x80\xa6",
      "\xc2\xa0",
      "\xc3\x80",
      "\xc3\x83",
      "\xc3\x95",
      "\xc5\x92",
      "\xc5\x93",
      "\xe2\x80\x93",
      "\xe2\x80\x94",
      "\xe2\x80\x9c",
      "\xe2\x80\x9d",
      "\xe2\x80\x98",
      "\xe2\x80\x99",
      "\xc3\xb7",
      "\xe2\x97\x8a",
      "\xc3\xbf",
      "\xc5\xb8",
      "\xe2\x81\x84",
      "\xc2\xa4",
      "\xc3\x90",
      "\xc3\xb0",
      "\xc3\x9e",
      "\xc3\xbe",
      "\xc3\xbd",
      "\xc2\xb7",
      "\xe2\x80\x9a",
      "\xe2\x80\x9e",
      "\xe2\x80\xb0",
      "\xc3\x82",
      "\xc3\x8a",
      "\xc3\x81",
      "\xc3\x8b",
      "\xc3\x88",
      "\xc3\x8d",
      "\xc3\x8e",
      "\xc3\x8f",
      "\xc3\x8c",
      "\xc3\x93",
      "\xc3\x94",
      "\xef\xbf\xbd",
      "\xc3\x92",
      "\xc3\x9a",
      "\xc3\x9b",
      "\xc3\x99",
      "\xc4\xb1",
      "\xcb\x86",
      "\xcb\x9c",
      "\xc2\xaf",
      "\xcb\x98",
      "\xcb\x99",
      "\xcb\x9a",
      "\xc2\xb8",
      "\xcb\x9d",
      "\xcb\x9b",
      "\xcb\x87",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x000000a0 => "\xca",
      0x000000a1 => "\xc1",
      0x000000a2 => "\xa2",
      0x000000a3 => "\xa3",
      0x000000a4 => "\xdb",
      0x000000a5 => "\xb4",
      0x000000a7 => "\xa4",
      0x000000a8 => "\xac",
      0x000000a9 => "\xa9",
      0x000000aa => "\xbb",
      0x000000ab => "\xc7",
      0x000000ac => "\xc2",
      0x000000ae => "\xa8",
      0x000000af => "\xf8",
      0x000000b0 => "\xa1",
      0x000000b1 => "\xb1",
      0x000000b4 => "\xab",
      0x000000b5 => "\xb5",
      0x000000b6 => "\xa6",
      0x000000b7 => "\xe1",
      0x000000b8 => "\xfc",
      0x000000ba => "\xbc",
      0x000000bb => "\xc8",
      0x000000bf => "\xc0",
      0x000000c0 => "\xcb",
      0x000000c1 => "\xe7",
      0x000000c2 => "\xe5",
      0x000000c3 => "\xcc",
      0x000000c4 => "\x80",
      0x000000c5 => "\x81",
      0x000000c6 => "\xae",
      0x000000c7 => "\x82",
      0x000000c8 => "\xe9",
      0x000000c9 => "\x83",
      0x000000ca => "\xe6",
      0x000000cb => "\xe8",
      0x000000cc => "\xed",
      0x000000cd => "\xea",
      0x000000ce => "\xeb",
      0x000000cf => "\xec",
      0x000000d0 => "\xdc",
      0x000000d1 => "\x84",
      0x000000d2 => "\xf1",
      0x000000d3 => "\xee",
      0x000000d4 => "\xef",
      0x000000d5 => "\xcd",
      0x000000d6 => "\x85",
      0x000000d8 => "\xaf",
      0x000000d9 => "\xf4",
      0x000000da => "\xf2",
      0x000000db => "\xf3",
      0x000000dc => "\x86",
      0x000000dd => "\xa0",
      0x000000de => "\xde",
      0x000000df => "\xa7",
      0x000000e0 => "\x88",
      0x000000e1 => "\x87",
      0x000000e2 => "\x89",
      0x000000e3 => "\x8b",
      0x000000e4 => "\x8a",
      0x000000e5 => "\x8c",
      0x000000e6 => "\xbe",
      0x000000e7 => "\x8d",
      0x000000e8 => "\x8f",
      0x000000e9 => "\x8e",
      0x000000ea => "\x90",
      0x000000eb => "\x91",
      0x000000ec => "\x93",
      0x000000ed => "\x92",
      0x000000ee => "\x94",
      0x000000ef => "\x95",
      0x000000f0 => "\xdd",
      0x000000f1 => "\x96",
      0x000000f2 => "\x98",
      0x000000f3 => "\x97",
      0x000000f4 => "\x99",
      0x000000f5 => "\x9b",
      0x000000f6 => "\x9a",
      0x000000f7 => "\xd6",
      0x000000f8 => "\xbf",
      0x000000f9 => "\x9d",
      0x000000fa => "\x9c",
      0x000000fb => "\x9e",
      0x000000fc => "\x9f",
      0x000000fd => "\xe0",
      0x000000fe => "\xdf",
      0x000000ff => "\xd8",
      0x00000131 => "\xf5",
      0x00000152 => "\xce",
      0x00000153 => "\xcf",
      0x00000178 => "\xd9",
      0x00000192 => "\xc4",
      0x000002c6 => "\xf6",
      0x000002c7 => "\xff",
      0x000002d8 => "\xf9",
      0x000002d9 => "\xfa",
      0x000002da => "\xfb",
      0x000002db => "\xfe",
      0x000002dc => "\xf7",
      0x000002dd => "\xfd",
      0x000003c0 => "\xb9",
      0x00002013 => "\xd0",
      0x00002014 => "\xd1",
      0x00002018 => "\xd4",
      0x00002019 => "\xd5",
      0x0000201a => "\xe2",
      0x0000201c => "\xd2",
      0x0000201d => "\xd3",
      0x0000201e => "\xe3",
      0x00002022 => "\xa5",
      0x00002026 => "\xc9",
      0x00002030 => "\xe4",
      0x00002044 => "\xda",
      0x00002122 => "\xaa",
      0x00002126 => "\xbd",
      0x00002202 => "\xb6",
      0x00002206 => "\xc6",
      0x0000220f => "\xb8",
      0x00002211 => "\xb7",
      0x0000221a => "\xc3",
      0x0000221e => "\xb0",
      0x0000222b => "\xba",
      0x00002248 => "\xc5",
      0x00002260 => "\xad",
      0x00002264 => "\xb2",
      0x00002265 => "\xb3",
      0x000025ca => "\xd7",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::MACICELAND - Conversion routines for MACICELAND
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for MACICELAND.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
  
   This charmap has been generated automatically from GNU libiconv
   conversions.
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE (DEL)
      80 |  000000C4 | LATIN CAPITAL LETTER A WITH DIAERESIS
      81 |  000000C5 | LATIN CAPITAL LETTER A WITH RING ABOVE
      82 |  000000C7 | LATIN CAPITAL LETTER C WITH CEDILLA
      83 |  000000C9 | LATIN CAPITAL LETTER E WITH ACUTE
      84 |  000000D1 | LATIN CAPITAL LETTER N WITH TILDE
      85 |  000000D6 | LATIN CAPITAL LETTER O WITH DIAERESIS
      86 |  000000DC | LATIN CAPITAL LETTER U WITH DIAERESIS
      87 |  000000E1 | LATIN SMALL LETTER A WITH ACUTE
      88 |  000000E0 | LATIN SMALL LETTER A WITH GRAVE
      89 |  000000E2 | LATIN SMALL LETTER A WITH CIRCUMFLEX
      8A |  000000E4 | LATIN SMALL LETTER A WITH DIAERESIS
      8B |  000000E3 | LATIN SMALL LETTER A WITH TILDE
      8C |  000000E5 | LATIN SMALL LETTER A WITH RING ABOVE
      8D |  000000E7 | LATIN SMALL LETTER C WITH CEDILLA
      8E |  000000E9 | LATIN SMALL LETTER E WITH ACUTE
      8F |  000000E8 | LATIN SMALL LETTER E WITH GRAVE
      90 |  000000EA | LATIN SMALL LETTER E WITH CIRCUMFLEX
      91 |  000000EB | LATIN SMALL LETTER E WITH DIAERESIS
      92 |  000000ED | LATIN SMALL LETTER I WITH ACUTE
      93 |  000000EC | LATIN SMALL LETTER I WITH GRAVE
      94 |  000000EE | LATIN SMALL LETTER I WITH CIRCUMFLEX
      95 |  000000EF | LATIN SMALL LETTER I WITH DIAERESIS
      96 |  000000F1 | LATIN SMALL LETTER N WITH TILDE
      97 |  000000F3 | LATIN SMALL LETTER O WITH ACUTE
      98 |  000000F2 | LATIN SMALL LETTER O WITH GRAVE
      99 |  000000F4 | LATIN SMALL LETTER O WITH CIRCUMFLEX
      9A |  000000F6 | LATIN SMALL LETTER O WITH DIAERESIS
      9B |  000000F5 | LATIN SMALL LETTER O WITH TILDE
      9C |  000000FA | LATIN SMALL LETTER U WITH ACUTE
      9D |  000000F9 | LATIN SMALL LETTER U WITH GRAVE
      9E |  000000FB | LATIN SMALL LETTER U WITH CIRCUMFLEX
      9F |  000000FC | LATIN SMALL LETTER U WITH DIAERESIS
      A0 |  000000DD | LATIN CAPITAL LETTER Y WITH ACUTE
      A1 |  000000B0 | DEGREE SIGN
      A2 |  000000A2 | CENT SIGN
      A3 |  000000A3 | POUND SIGN
      A4 |  000000A7 | SECTION SIGN
      A5 |  00002022 | BULLET
      A6 |  000000B6 | PILCROW SIGN
      A7 |  000000DF | LATIN SMALL LETTER SHARP S
      A8 |  000000AE | REGISTERED SIGN
      A9 |  000000A9 | COPYRIGHT SIGN
      AA |  00002122 | TRADE MARK SIGN
      AB |  000000B4 | ACUTE ACCENT
      AC |  000000A8 | DIAERESIS
      AD |  00002260 | NOT EQUAL TO
      AE |  000000C6 | LATIN CAPITAL LETTER AE
      AF |  000000D8 | LATIN CAPITAL LETTER O WITH STROKE
      B0 |  0000221E | INFINITY
      B1 |  000000B1 | PLUS-MINUS SIGN
      B2 |  00002264 | LESS-THAN OR EQUAL TO
      B3 |  00002265 | GREATER-THAN OR EQUAL TO
      B4 |  000000A5 | YEN SIGN
      B5 |  000000B5 | MICRO SIGN
      B6 |  00002202 | PARTIAL DIFFERENTIAL
      B7 |  00002211 | N-ARY SUMMATION
      B8 |  0000220F | N-ARY PRODUCT
      B9 |  000003C0 | GREEK SMALL LETTER PI
      BA |  0000222B | INTEGRAL
      BB |  000000AA | FEMININE ORDINAL INDICATOR
      BC |  000000BA | MASCULINE ORDINAL INDICATOR
      BD |  00002126 | OHM SIGN
      BE |  000000E6 | LATIN SMALL LETTER AE
      BF |  000000F8 | LATIN SMALL LETTER O WITH STROKE
      C0 |  000000BF | INVERTED QUESTION MARK
      C1 |  000000A1 | INVERTED EXCLAMATION MARK
      C2 |  000000AC | NOT SIGN
      C3 |  0000221A | SQUARE ROOT
      C4 |  00000192 | LATIN SMALL LETTER F WITH HOOK
      C5 |  00002248 | ALMOST EQUAL TO
      C6 |  00002206 | INCREMENT
      C7 |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
      C8 |  000000BB | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
      C9 |  00002026 | HORIZONTAL ELLIPSIS
      CA |  000000A0 | NO-BREAK SPACE
      CB |  000000C0 | LATIN CAPITAL LETTER A WITH GRAVE
      CC |  000000C3 | LATIN CAPITAL LETTER A WITH TILDE
      CD |  000000D5 | LATIN CAPITAL LETTER O WITH TILDE
      CE |  00000152 | LATIN CAPITAL LIGATURE OE
      CF |  00000153 | LATIN SMALL LIGATURE OE
      D0 |  00002013 | EN DASH
      D1 |  00002014 | EM DASH
      D2 |  0000201C | LEFT DOUBLE QUOTATION MARK
      D3 |  0000201D | RIGHT DOUBLE QUOTATION MARK
      D4 |  00002018 | LEFT SINGLE QUOTATION MARK
      D5 |  00002019 | RIGHT SINGLE QUOTATION MARK
      D6 |  000000F7 | DIVISION SIGN
      D7 |  000025CA | LOZENGE
      D8 |  000000FF | LATIN SMALL LETTER Y WITH DIAERESIS
      D9 |  00000178 | LATIN CAPITAL LETTER Y WITH DIAERESIS
      DA |  00002044 | FRACTION SLASH
      DB |  000000A4 | CURRENCY SIGN
      DC |  000000D0 | LATIN CAPITAL LETTER ETH
      DD |  000000F0 | LATIN SMALL LETTER ETH
      DE |  000000DE | LATIN CAPITAL LETTER THORN
      DF |  000000FE | LATIN SMALL LETTER THORN
      E0 |  000000FD | LATIN SMALL LETTER Y WITH ACUTE
      E1 |  000000B7 | MIDDLE DOT
      E2 |  0000201A | SINGLE LOW-9 QUOTATION MARK
      E3 |  0000201E | DOUBLE LOW-9 QUOTATION MARK
      E4 |  00002030 | PER MILLE SIGN
      E5 |  000000C2 | LATIN CAPITAL LETTER A WITH CIRCUMFLEX
      E6 |  000000CA | LATIN CAPITAL LETTER E WITH CIRCUMFLEX
      E7 |  000000C1 | LATIN CAPITAL LETTER A WITH ACUTE
      E8 |  000000CB | LATIN CAPITAL LETTER E WITH DIAERESIS
      E9 |  000000C8 | LATIN CAPITAL LETTER E WITH GRAVE
      EA |  000000CD | LATIN CAPITAL LETTER I WITH ACUTE
      EB |  000000CE | LATIN CAPITAL LETTER I WITH CIRCUMFLEX
      EC |  000000CF | LATIN CAPITAL LETTER I WITH DIAERESIS
      ED |  000000CC | LATIN CAPITAL LETTER I WITH GRAVE
      EE |  000000D3 | LATIN CAPITAL LETTER O WITH ACUTE
      EF |  000000D4 | LATIN CAPITAL LETTER O WITH CIRCUMFLEX
      F1 |  000000D2 | LATIN CAPITAL LETTER O WITH GRAVE
      F2 |  000000DA | LATIN CAPITAL LETTER U WITH ACUTE
      F3 |  000000DB | LATIN CAPITAL LETTER U WITH CIRCUMFLEX
      F4 |  000000D9 | LATIN CAPITAL LETTER U WITH GRAVE
      F5 |  00000131 | LATIN SMALL LETTER DOTLESS I
      F6 |  000002C6 | MODIFIER LETTER CIRCUMFLEX ACCENT
      F7 |  000002DC | SMALL TILDE
      F8 |  000000AF | MACRON
      F9 |  000002D8 | BREVE
      FA |  000002D9 | DOT ABOVE
      FB |  000002DA | RING ABOVE
      FC |  000000B8 | CEDILLA
      FD |  000002DD | DOUBLE ACUTE ACCENT
      FE |  000002DB | OGONEK
      FF |  000002C7 | CARON
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_MACICELAND

    $main::fatpacked{"Locale/RecodeData/MACINTOSH.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_MACINTOSH';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for MACINTOSH.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::MACINTOSH;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0x00c4,
      0x00c5,
      0x00c7,
      0x00c9,
      0x00d1,
      0x00d6,
      0x00dc,
      0x00e1,
      0x00e0,
      0x00e2,
      0x00e4,
      0x00e3,
      0x00e5,
      0x00e7,
      0x00e9,
      0x00e8,
      0x00ea,
      0x00eb,
      0x00ed,
      0x00ec,
      0x00ee,
      0x00ef,
      0x00f1,
      0x00f3,
      0x00f2,
      0x00f4,
      0x00f6,
      0x00f5,
      0x00fa,
      0x00f9,
      0x00fb,
      0x00fc,
      0x2020,
      0x00b0,
      0x00a2,
      0x00a3,
      0x00a7,
      0x2022,
      0x00b6,
      0x00df,
      0x00ae,
      0x00a9,
      0x2122,
      0x00b4,
      0x00a8,
      0x2260,
      0x00c6,
      0x00d8,
      0x221e,
      0x00b1,
      0x2264,
      0x2265,
      0x00a5,
      0x00b5,
      0x2202,
      0x2211,
      0x220f,
      0x03c0,
      0x222b,
      0x00aa,
      0x00ba,
      0x03a9,
      0x00e6,
      0x00f8,
      0x00bf,
      0x00a1,
      0x00ac,
      0x221a,
      0x0192,
      0x2248,
      0x0394,
      0x00ab,
      0x00bb,
      0x2026,
      0x00a0,
      0x00c0,
      0x00c3,
      0x00d5,
      0x0152,
      0x0153,
      0x2013,
      0x2014,
      0x201c,
      0x201d,
      0x2018,
      0x2019,
      0x00f7,
      0x25ca,
      0x00ff,
      0x0178,
      0x2044,
      0x20ac,
      0x2039,
      0x203a,
      0xfb01,
      0xfb02,
      0x2021,
      0x00b7,
      0x201a,
      0x201e,
      0x2030,
      0x00c2,
      0x00ca,
      0x00c1,
      0x00cb,
      0x00c8,
      0x00cd,
      0x00ce,
      0x00cf,
      0x00cc,
      0x00d3,
      0x00d4,
      0xe01e,
      0x00d2,
      0x00da,
      0x00db,
      0x00d9,
      0x0131,
      0x02c6,
      0x02dc,
      0x00af,
      0x02d8,
      0x02d9,
      0x02da,
      0x00b8,
      0x02dd,
      0x02db,
      0x02c7,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xc3\x84",
      "\xc3\x85",
      "\xc3\x87",
      "\xc3\x89",
      "\xc3\x91",
      "\xc3\x96",
      "\xc3\x9c",
      "\xc3\xa1",
      "\xc3\xa0",
      "\xc3\xa2",
      "\xc3\xa4",
      "\xc3\xa3",
      "\xc3\xa5",
      "\xc3\xa7",
      "\xc3\xa9",
      "\xc3\xa8",
      "\xc3\xaa",
      "\xc3\xab",
      "\xc3\xad",
      "\xc3\xac",
      "\xc3\xae",
      "\xc3\xaf",
      "\xc3\xb1",
      "\xc3\xb3",
      "\xc3\xb2",
      "\xc3\xb4",
      "\xc3\xb6",
      "\xc3\xb5",
      "\xc3\xba",
      "\xc3\xb9",
      "\xc3\xbb",
      "\xc3\xbc",
      "\xe2\x80\xa0",
      "\xc2\xb0",
      "\xc2\xa2",
      "\xc2\xa3",
      "\xc2\xa7",
      "\xe2\x80\xa2",
      "\xc2\xb6",
      "\xc3\x9f",
      "\xc2\xae",
      "\xc2\xa9",
      "\xe2\x84\xa2",
      "\xc2\xb4",
      "\xc2\xa8",
      "\xe2\x89\xa0",
      "\xc3\x86",
      "\xc3\x98",
      "\xe2\x88\x9e",
      "\xc2\xb1",
      "\xe2\x89\xa4",
      "\xe2\x89\xa5",
      "\xc2\xa5",
      "\xc2\xb5",
      "\xe2\x88\x82",
      "\xe2\x88\x91",
      "\xe2\x88\x8f",
      "\xcf\x80",
      "\xe2\x88\xab",
      "\xc2\xaa",
      "\xc2\xba",
      "\xce\xa9",
      "\xc3\xa6",
      "\xc3\xb8",
      "\xc2\xbf",
      "\xc2\xa1",
      "\xc2\xac",
      "\xe2\x88\x9a",
      "\xc6\x92",
      "\xe2\x89\x88",
      "\xce\x94",
      "\xc2\xab",
      "\xc2\xbb",
      "\xe2\x80\xa6",
      "\xc2\xa0",
      "\xc3\x80",
      "\xc3\x83",
      "\xc3\x95",
      "\xc5\x92",
      "\xc5\x93",
      "\xe2\x80\x93",
      "\xe2\x80\x94",
      "\xe2\x80\x9c",
      "\xe2\x80\x9d",
      "\xe2\x80\x98",
      "\xe2\x80\x99",
      "\xc3\xb7",
      "\xe2\x97\x8a",
      "\xc3\xbf",
      "\xc5\xb8",
      "\xe2\x81\x84",
      "\xe2\x82\xac",
      "\xe2\x80\xb9",
      "\xe2\x80\xba",
      "\xef\xac\x81",
      "\xef\xac\x82",
      "\xe2\x80\xa1",
      "\xc2\xb7",
      "\xe2\x80\x9a",
      "\xe2\x80\x9e",
      "\xe2\x80\xb0",
      "\xc3\x82",
      "\xc3\x8a",
      "\xc3\x81",
      "\xc3\x8b",
      "\xc3\x88",
      "\xc3\x8d",
      "\xc3\x8e",
      "\xc3\x8f",
      "\xc3\x8c",
      "\xc3\x93",
      "\xc3\x94",
      "\xee\x80\x9e",
      "\xc3\x92",
      "\xc3\x9a",
      "\xc3\x9b",
      "\xc3\x99",
      "\xc4\xb1",
      "\xcb\x86",
      "\xcb\x9c",
      "\xc2\xaf",
      "\xcb\x98",
      "\xcb\x99",
      "\xcb\x9a",
      "\xc2\xb8",
      "\xcb\x9d",
      "\xcb\x9b",
      "\xcb\x87",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x000000a0 => "\xca",
      0x000000a1 => "\xc1",
      0x000000a2 => "\xa2",
      0x000000a3 => "\xa3",
      0x000000a5 => "\xb4",
      0x000000a7 => "\xa4",
      0x000000a8 => "\xac",
      0x000000a9 => "\xa9",
      0x000000aa => "\xbb",
      0x000000ab => "\xc7",
      0x000000ac => "\xc2",
      0x000000ae => "\xa8",
      0x000000af => "\xf8",
      0x000000b0 => "\xa1",
      0x000000b1 => "\xb1",
      0x000000b4 => "\xab",
      0x000000b5 => "\xb5",
      0x000000b6 => "\xa6",
      0x000000b7 => "\xe1",
      0x000000b8 => "\xfc",
      0x000000ba => "\xbc",
      0x000000bb => "\xc8",
      0x000000bf => "\xc0",
      0x000000c0 => "\xcb",
      0x000000c1 => "\xe7",
      0x000000c2 => "\xe5",
      0x000000c3 => "\xcc",
      0x000000c4 => "\x80",
      0x000000c5 => "\x81",
      0x000000c6 => "\xae",
      0x000000c7 => "\x82",
      0x000000c8 => "\xe9",
      0x000000c9 => "\x83",
      0x000000ca => "\xe6",
      0x000000cb => "\xe8",
      0x000000cc => "\xed",
      0x000000cd => "\xea",
      0x000000ce => "\xeb",
      0x000000cf => "\xec",
      0x000000d1 => "\x84",
      0x000000d2 => "\xf1",
      0x000000d3 => "\xee",
      0x000000d4 => "\xef",
      0x000000d5 => "\xcd",
      0x000000d6 => "\x85",
      0x000000d8 => "\xaf",
      0x000000d9 => "\xf4",
      0x000000da => "\xf2",
      0x000000db => "\xf3",
      0x000000dc => "\x86",
      0x000000df => "\xa7",
      0x000000e0 => "\x88",
      0x000000e1 => "\x87",
      0x000000e2 => "\x89",
      0x000000e3 => "\x8b",
      0x000000e4 => "\x8a",
      0x000000e5 => "\x8c",
      0x000000e6 => "\xbe",
      0x000000e7 => "\x8d",
      0x000000e8 => "\x8f",
      0x000000e9 => "\x8e",
      0x000000ea => "\x90",
      0x000000eb => "\x91",
      0x000000ec => "\x93",
      0x000000ed => "\x92",
      0x000000ee => "\x94",
      0x000000ef => "\x95",
      0x000000f1 => "\x96",
      0x000000f2 => "\x98",
      0x000000f3 => "\x97",
      0x000000f4 => "\x99",
      0x000000f5 => "\x9b",
      0x000000f6 => "\x9a",
      0x000000f7 => "\xd6",
      0x000000f8 => "\xbf",
      0x000000f9 => "\x9d",
      0x000000fa => "\x9c",
      0x000000fb => "\x9e",
      0x000000fc => "\x9f",
      0x000000ff => "\xd8",
      0x00000131 => "\xf5",
      0x00000152 => "\xce",
      0x00000153 => "\xcf",
      0x00000178 => "\xd9",
      0x00000192 => "\xc4",
      0x000002c6 => "\xf6",
      0x000002c7 => "\xff",
      0x000002d8 => "\xf9",
      0x000002d9 => "\xfa",
      0x000002da => "\xfb",
      0x000002db => "\xfe",
      0x000002dc => "\xf7",
      0x000002dd => "\xfd",
      0x00000394 => "\xc6",
      0x000003a9 => "\xbd",
      0x000003c0 => "\xb9",
      0x00002013 => "\xd0",
      0x00002014 => "\xd1",
      0x00002018 => "\xd4",
      0x00002019 => "\xd5",
      0x0000201a => "\xe2",
      0x0000201c => "\xd2",
      0x0000201d => "\xd3",
      0x0000201e => "\xe3",
      0x00002020 => "\xa0",
      0x00002021 => "\xe0",
      0x00002022 => "\xa5",
      0x00002026 => "\xc9",
      0x00002030 => "\xe4",
      0x00002039 => "\xdc",
      0x0000203a => "\xdd",
      0x00002044 => "\xda",
      0x000020ac => "\xdb",
      0x00002122 => "\xaa",
      0x00002202 => "\xb6",
      0x0000220f => "\xb8",
      0x00002211 => "\xb7",
      0x0000221a => "\xc3",
      0x0000221e => "\xb0",
      0x0000222b => "\xba",
      0x00002248 => "\xc5",
      0x00002260 => "\xad",
      0x00002264 => "\xb2",
      0x00002265 => "\xb3",
      0x000025ca => "\xd7",
      0x0000e01e => "\xf0",
      0x0000fb01 => "\xde",
      0x0000fb02 => "\xdf",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::MACINTOSH - Conversion routines for MACINTOSH
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for MACINTOSH.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: The Unicode Standard ver 1.0, ISBN 0-201-56788-1, Oct 1991
   alias MAC
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE (DEL)
      80 |  000000C4 | LATIN CAPITAL LETTER A WITH DIAERESIS
      81 |  000000C5 | LATIN CAPITAL LETTER A WITH RING ABOVE
      82 |  000000C7 | LATIN CAPITAL LETTER C WITH CEDILLA
      83 |  000000C9 | LATIN CAPITAL LETTER E WITH ACUTE
      84 |  000000D1 | LATIN CAPITAL LETTER N WITH TILDE
      85 |  000000D6 | LATIN CAPITAL LETTER O WITH DIAERESIS
      86 |  000000DC | LATIN CAPITAL LETTER U WITH DIAERESIS
      87 |  000000E1 | LATIN SMALL LETTER A WITH ACUTE
      88 |  000000E0 | LATIN SMALL LETTER A WITH GRAVE
      89 |  000000E2 | LATIN SMALL LETTER A WITH CIRCUMFLEX
      8A |  000000E4 | LATIN SMALL LETTER A WITH DIAERESIS
      8B |  000000E3 | LATIN SMALL LETTER A WITH TILDE
      8C |  000000E5 | LATIN SMALL LETTER A WITH RING ABOVE
      8D |  000000E7 | LATIN SMALL LETTER C WITH CEDILLA
      8E |  000000E9 | LATIN SMALL LETTER E WITH ACUTE
      8F |  000000E8 | LATIN SMALL LETTER E WITH GRAVE
      90 |  000000EA | LATIN SMALL LETTER E WITH CIRCUMFLEX
      91 |  000000EB | LATIN SMALL LETTER E WITH DIAERESIS
      92 |  000000ED | LATIN SMALL LETTER I WITH ACUTE
      93 |  000000EC | LATIN SMALL LETTER I WITH GRAVE
      94 |  000000EE | LATIN SMALL LETTER I WITH CIRCUMFLEX
      95 |  000000EF | LATIN SMALL LETTER I WITH DIAERESIS
      96 |  000000F1 | LATIN SMALL LETTER N WITH TILDE
      97 |  000000F3 | LATIN SMALL LETTER O WITH ACUTE
      98 |  000000F2 | LATIN SMALL LETTER O WITH GRAVE
      99 |  000000F4 | LATIN SMALL LETTER O WITH CIRCUMFLEX
      9A |  000000F6 | LATIN SMALL LETTER O WITH DIAERESIS
      9B |  000000F5 | LATIN SMALL LETTER O WITH TILDE
      9C |  000000FA | LATIN SMALL LETTER U WITH ACUTE
      9D |  000000F9 | LATIN SMALL LETTER U WITH GRAVE
      9E |  000000FB | LATIN SMALL LETTER U WITH CIRCUMFLEX
      9F |  000000FC | LATIN SMALL LETTER U WITH DIAERESIS
      A0 |  00002020 | DAGGER
      A1 |  000000B0 | DEGREE SIGN
      A2 |  000000A2 | CENT SIGN
      A3 |  000000A3 | POUND SIGN
      A4 |  000000A7 | SECTION SIGN
      A5 |  00002022 | BULLET
      A6 |  000000B6 | PILCROW SIGN
      A7 |  000000DF | LATIN SMALL LETTER SHARP S (German)
      A8 |  000000AE | REGISTERED SIGN
      A9 |  000000A9 | COPYRIGHT SIGN
      AA |  00002122 | TRADE MARK SIGN
      AB |  000000B4 | ACUTE ACCENT
      AC |  000000A8 | DIAERESIS
      AD |  00002260 | NOT EQUAL TO
      AE |  000000C6 | LATIN CAPITAL LETTER AE
      AF |  000000D8 | LATIN CAPITAL LETTER O WITH STROKE
      B0 |  0000221E | INFINITY
      B1 |  000000B1 | PLUS-MINUS SIGN
      B2 |  00002264 | LESS-THAN OR EQUAL TO
      B3 |  00002265 | GREATER-THAN OR EQUAL TO
      B4 |  000000A5 | YEN SIGN
      B5 |  000000B5 | MICRO SIGN
      B6 |  00002202 | PARTIAL DIFFERENTIAL
      B7 |  00002211 | N-ARY SUMMATION
      B8 |  0000220F | N-ARY PRODUCT
      B9 |  000003C0 | GREEK SMALL LETTER PI
      BA |  0000222B | INTEGRAL
      BB |  000000AA | FEMININE ORDINAL INDICATOR
      BC |  000000BA | MASCULINE ORDINAL INDICATOR
      BD |  000003A9 | GREEK CAPITAL LETTER OMEGA
      BE |  000000E6 | LATIN SMALL LETTER AE
      BF |  000000F8 | LATIN SMALL LETTER O WITH STROKE
      C0 |  000000BF | INVERTED QUESTION MARK
      C1 |  000000A1 | INVERTED EXCLAMATION MARK
      C2 |  000000AC | NOT SIGN
      C3 |  0000221A | SQUARE ROOT
      C4 |  00000192 | LATIN SMALL LETTER F WITH HOOK
      C5 |  00002248 | ALMOST EQUAL TO
      C6 |  00000394 | GREEK CAPITAL LETTER DELTA
      C7 |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
      C8 |  000000BB | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
      C9 |  00002026 | HORIZONTAL ELLIPSIS
      CA |  000000A0 | NO-BREAK SPACE
      CB |  000000C0 | LATIN CAPITAL LETTER A WITH GRAVE
      CC |  000000C3 | LATIN CAPITAL LETTER A WITH TILDE
      CD |  000000D5 | LATIN CAPITAL LETTER O WITH TILDE
      CE |  00000152 | LATIN CAPITAL LIGATURE OE
      CF |  00000153 | LATIN SMALL LIGATURE OE
      D0 |  00002013 | EN DASH
      D1 |  00002014 | EM DASH
      D2 |  0000201C | LEFT DOUBLE QUOTATION MARK
      D3 |  0000201D | RIGHT DOUBLE QUOTATION MARK
      D4 |  00002018 | LEFT SINGLE QUOTATION MARK
      D5 |  00002019 | RIGHT SINGLE QUOTATION MARK
      D6 |  000000F7 | DIVISION SIGN
      D7 |  000025CA | LOZENGE
      D8 |  000000FF | LATIN SMALL LETTER Y WITH DIAERESIS
      D9 |  00000178 | LATIN CAPITAL LETTER Y WITH DIAERESIS
      DA |  00002044 | FRACTION SLASH
      DB |  000020AC | EURO SIGN
      DC |  00002039 | SINGLE LEFT-POINTING ANGLE QUOTATION MARK
      DD |  0000203A | SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
      DE |  0000FB01 | LATIN SMALL LIGATURE FI
      DF |  0000FB02 | LATIN SMALL LIGATURE FL
      E0 |  00002021 | DOUBLE DAGGER
      E1 |  000000B7 | MIDDLE DOT
      E2 |  0000201A | SINGLE LOW-9 QUOTATION MARK
      E3 |  0000201E | DOUBLE LOW-9 QUOTATION MARK
      E4 |  00002030 | PER MILLE SIGN
      E5 |  000000C2 | LATIN CAPITAL LETTER A WITH CIRCUMFLEX
      E6 |  000000CA | LATIN CAPITAL LETTER E WITH CIRCUMFLEX
      E7 |  000000C1 | LATIN CAPITAL LETTER A WITH ACUTE
      E8 |  000000CB | LATIN CAPITAL LETTER E WITH DIAERESIS
      E9 |  000000C8 | LATIN CAPITAL LETTER E WITH GRAVE
      EA |  000000CD | LATIN CAPITAL LETTER I WITH ACUTE
      EB |  000000CE | LATIN CAPITAL LETTER I WITH CIRCUMFLEX
      EC |  000000CF | LATIN CAPITAL LETTER I WITH DIAERESIS
      ED |  000000CC | LATIN CAPITAL LETTER I WITH GRAVE
      EE |  000000D3 | LATIN CAPITAL LETTER O WITH ACUTE
      EF |  000000D4 | LATIN CAPITAL LETTER O WITH CIRCUMFLEX
      F0 |  0000E01E | APPLE LOGO (Macintosh_F0)
      F1 |  000000D2 | LATIN CAPITAL LETTER O WITH GRAVE
      F2 |  000000DA | LATIN CAPITAL LETTER U WITH ACUTE
      F3 |  000000DB | LATIN CAPITAL LETTER U WITH CIRCUMFLEX
      F4 |  000000D9 | LATIN CAPITAL LETTER U WITH GRAVE
      F5 |  00000131 | LATIN SMALL LETTER DOTLESS I
      F6 |  000002C6 | MODIFIER LETTER CIRCUMFLEX ACCENT
      F7 |  000002DC | SMALL TILDE
      F8 |  000000AF | MACRON
      F9 |  000002D8 | BREVE
      FA |  000002D9 | DOT ABOVE (Mandarin Chinese light tone)
      FB |  000002DA | RING ABOVE
      FC |  000000B8 | CEDILLA
      FD |  000002DD | DOUBLE ACUTE ACCENT
      FE |  000002DB | OGONEK
      FF |  000002C7 | CARON (Mandarin Chinese third tone)
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_MACINTOSH

    $main::fatpacked{"Locale/RecodeData/MACROMANIA.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_MACROMANIA';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for MACROMANIA.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::MACROMANIA;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0x00c4,
      0x00c5,
      0x00c7,
      0x00c9,
      0x00d1,
      0x00d6,
      0x00dc,
      0x00e1,
      0x00e0,
      0x00e2,
      0x00e4,
      0x00e3,
      0x00e5,
      0x00e7,
      0x00e9,
      0x00e8,
      0x00ea,
      0x00eb,
      0x00ed,
      0x00ec,
      0x00ee,
      0x00ef,
      0x00f1,
      0x00f3,
      0x00f2,
      0x00f4,
      0x00f6,
      0x00f5,
      0x00fa,
      0x00f9,
      0x00fb,
      0x00fc,
      0x2020,
      0x00b0,
      0x00a2,
      0x00a3,
      0x00a7,
      0x2022,
      0x00b6,
      0x00df,
      0x00ae,
      0x00a9,
      0x2122,
      0x00b4,
      0x00a8,
      0x2260,
      0x0102,
      0x015e,
      0x221e,
      0x00b1,
      0x2264,
      0x2265,
      0x00a5,
      0x00b5,
      0x2202,
      0x2211,
      0x220f,
      0x03c0,
      0x222b,
      0x00aa,
      0x00ba,
      0x2126,
      0x0103,
      0x015f,
      0x00bf,
      0x00a1,
      0x00ac,
      0x221a,
      0x0192,
      0x2248,
      0x2206,
      0x00ab,
      0x00bb,
      0x2026,
      0x00a0,
      0x00c0,
      0x00c3,
      0x00d5,
      0x0152,
      0x0153,
      0x2013,
      0x2014,
      0x201c,
      0x201d,
      0x2018,
      0x2019,
      0x00f7,
      0x25ca,
      0x00ff,
      0x0178,
      0x2044,
      0x00a4,
      0x2039,
      0x203a,
      0x0162,
      0x0163,
      0x2021,
      0x00b7,
      0x201a,
      0x201e,
      0x2030,
      0x00c2,
      0x00ca,
      0x00c1,
      0x00cb,
      0x00c8,
      0x00cd,
      0x00ce,
      0x00cf,
      0x00cc,
      0x00d3,
      0x00d4,
      0xfffd,
      0x00d2,
      0x00da,
      0x00db,
      0x00d9,
      0x0131,
      0x02c6,
      0x02dc,
      0x00af,
      0x02d8,
      0x02d9,
      0x02da,
      0x00b8,
      0x02dd,
      0x02db,
      0x02c7,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xc3\x84",
      "\xc3\x85",
      "\xc3\x87",
      "\xc3\x89",
      "\xc3\x91",
      "\xc3\x96",
      "\xc3\x9c",
      "\xc3\xa1",
      "\xc3\xa0",
      "\xc3\xa2",
      "\xc3\xa4",
      "\xc3\xa3",
      "\xc3\xa5",
      "\xc3\xa7",
      "\xc3\xa9",
      "\xc3\xa8",
      "\xc3\xaa",
      "\xc3\xab",
      "\xc3\xad",
      "\xc3\xac",
      "\xc3\xae",
      "\xc3\xaf",
      "\xc3\xb1",
      "\xc3\xb3",
      "\xc3\xb2",
      "\xc3\xb4",
      "\xc3\xb6",
      "\xc3\xb5",
      "\xc3\xba",
      "\xc3\xb9",
      "\xc3\xbb",
      "\xc3\xbc",
      "\xe2\x80\xa0",
      "\xc2\xb0",
      "\xc2\xa2",
      "\xc2\xa3",
      "\xc2\xa7",
      "\xe2\x80\xa2",
      "\xc2\xb6",
      "\xc3\x9f",
      "\xc2\xae",
      "\xc2\xa9",
      "\xe2\x84\xa2",
      "\xc2\xb4",
      "\xc2\xa8",
      "\xe2\x89\xa0",
      "\xc4\x82",
      "\xc5\x9e",
      "\xe2\x88\x9e",
      "\xc2\xb1",
      "\xe2\x89\xa4",
      "\xe2\x89\xa5",
      "\xc2\xa5",
      "\xc2\xb5",
      "\xe2\x88\x82",
      "\xe2\x88\x91",
      "\xe2\x88\x8f",
      "\xcf\x80",
      "\xe2\x88\xab",
      "\xc2\xaa",
      "\xc2\xba",
      "\xe2\x84\xa6",
      "\xc4\x83",
      "\xc5\x9f",
      "\xc2\xbf",
      "\xc2\xa1",
      "\xc2\xac",
      "\xe2\x88\x9a",
      "\xc6\x92",
      "\xe2\x89\x88",
      "\xe2\x88\x86",
      "\xc2\xab",
      "\xc2\xbb",
      "\xe2\x80\xa6",
      "\xc2\xa0",
      "\xc3\x80",
      "\xc3\x83",
      "\xc3\x95",
      "\xc5\x92",
      "\xc5\x93",
      "\xe2\x80\x93",
      "\xe2\x80\x94",
      "\xe2\x80\x9c",
      "\xe2\x80\x9d",
      "\xe2\x80\x98",
      "\xe2\x80\x99",
      "\xc3\xb7",
      "\xe2\x97\x8a",
      "\xc3\xbf",
      "\xc5\xb8",
      "\xe2\x81\x84",
      "\xc2\xa4",
      "\xe2\x80\xb9",
      "\xe2\x80\xba",
      "\xc5\xa2",
      "\xc5\xa3",
      "\xe2\x80\xa1",
      "\xc2\xb7",
      "\xe2\x80\x9a",
      "\xe2\x80\x9e",
      "\xe2\x80\xb0",
      "\xc3\x82",
      "\xc3\x8a",
      "\xc3\x81",
      "\xc3\x8b",
      "\xc3\x88",
      "\xc3\x8d",
      "\xc3\x8e",
      "\xc3\x8f",
      "\xc3\x8c",
      "\xc3\x93",
      "\xc3\x94",
      "\xef\xbf\xbd",
      "\xc3\x92",
      "\xc3\x9a",
      "\xc3\x9b",
      "\xc3\x99",
      "\xc4\xb1",
      "\xcb\x86",
      "\xcb\x9c",
      "\xc2\xaf",
      "\xcb\x98",
      "\xcb\x99",
      "\xcb\x9a",
      "\xc2\xb8",
      "\xcb\x9d",
      "\xcb\x9b",
      "\xcb\x87",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x000000a0 => "\xca",
      0x000000a1 => "\xc1",
      0x000000a2 => "\xa2",
      0x000000a3 => "\xa3",
      0x000000a4 => "\xdb",
      0x000000a5 => "\xb4",
      0x000000a7 => "\xa4",
      0x000000a8 => "\xac",
      0x000000a9 => "\xa9",
      0x000000aa => "\xbb",
      0x000000ab => "\xc7",
      0x000000ac => "\xc2",
      0x000000ae => "\xa8",
      0x000000af => "\xf8",
      0x000000b0 => "\xa1",
      0x000000b1 => "\xb1",
      0x000000b4 => "\xab",
      0x000000b5 => "\xb5",
      0x000000b6 => "\xa6",
      0x000000b7 => "\xe1",
      0x000000b8 => "\xfc",
      0x000000ba => "\xbc",
      0x000000bb => "\xc8",
      0x000000bf => "\xc0",
      0x000000c0 => "\xcb",
      0x000000c1 => "\xe7",
      0x000000c2 => "\xe5",
      0x000000c3 => "\xcc",
      0x000000c4 => "\x80",
      0x000000c5 => "\x81",
      0x000000c7 => "\x82",
      0x000000c8 => "\xe9",
      0x000000c9 => "\x83",
      0x000000ca => "\xe6",
      0x000000cb => "\xe8",
      0x000000cc => "\xed",
      0x000000cd => "\xea",
      0x000000ce => "\xeb",
      0x000000cf => "\xec",
      0x000000d1 => "\x84",
      0x000000d2 => "\xf1",
      0x000000d3 => "\xee",
      0x000000d4 => "\xef",
      0x000000d5 => "\xcd",
      0x000000d6 => "\x85",
      0x000000d9 => "\xf4",
      0x000000da => "\xf2",
      0x000000db => "\xf3",
      0x000000dc => "\x86",
      0x000000df => "\xa7",
      0x000000e0 => "\x88",
      0x000000e1 => "\x87",
      0x000000e2 => "\x89",
      0x000000e3 => "\x8b",
      0x000000e4 => "\x8a",
      0x000000e5 => "\x8c",
      0x000000e7 => "\x8d",
      0x000000e8 => "\x8f",
      0x000000e9 => "\x8e",
      0x000000ea => "\x90",
      0x000000eb => "\x91",
      0x000000ec => "\x93",
      0x000000ed => "\x92",
      0x000000ee => "\x94",
      0x000000ef => "\x95",
      0x000000f1 => "\x96",
      0x000000f2 => "\x98",
      0x000000f3 => "\x97",
      0x000000f4 => "\x99",
      0x000000f5 => "\x9b",
      0x000000f6 => "\x9a",
      0x000000f7 => "\xd6",
      0x000000f9 => "\x9d",
      0x000000fa => "\x9c",
      0x000000fb => "\x9e",
      0x000000fc => "\x9f",
      0x000000ff => "\xd8",
      0x00000102 => "\xae",
      0x00000103 => "\xbe",
      0x00000131 => "\xf5",
      0x00000152 => "\xce",
      0x00000153 => "\xcf",
      0x0000015e => "\xaf",
      0x0000015f => "\xbf",
      0x00000162 => "\xde",
      0x00000163 => "\xdf",
      0x00000178 => "\xd9",
      0x00000192 => "\xc4",
      0x000002c6 => "\xf6",
      0x000002c7 => "\xff",
      0x000002d8 => "\xf9",
      0x000002d9 => "\xfa",
      0x000002da => "\xfb",
      0x000002db => "\xfe",
      0x000002dc => "\xf7",
      0x000002dd => "\xfd",
      0x000003c0 => "\xb9",
      0x00002013 => "\xd0",
      0x00002014 => "\xd1",
      0x00002018 => "\xd4",
      0x00002019 => "\xd5",
      0x0000201a => "\xe2",
      0x0000201c => "\xd2",
      0x0000201d => "\xd3",
      0x0000201e => "\xe3",
      0x00002020 => "\xa0",
      0x00002021 => "\xe0",
      0x00002022 => "\xa5",
      0x00002026 => "\xc9",
      0x00002030 => "\xe4",
      0x00002039 => "\xdc",
      0x0000203a => "\xdd",
      0x00002044 => "\xda",
      0x00002122 => "\xaa",
      0x00002126 => "\xbd",
      0x00002202 => "\xb6",
      0x00002206 => "\xc6",
      0x0000220f => "\xb8",
      0x00002211 => "\xb7",
      0x0000221a => "\xc3",
      0x0000221e => "\xb0",
      0x0000222b => "\xba",
      0x00002248 => "\xc5",
      0x00002260 => "\xad",
      0x00002264 => "\xb2",
      0x00002265 => "\xb3",
      0x000025ca => "\xd7",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::MACROMANIA - Conversion routines for MACROMANIA
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for MACROMANIA.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
  
   This charmap has been generated automatically from GNU libiconv
   conversions.
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE (DEL)
      80 |  000000C4 | LATIN CAPITAL LETTER A WITH DIAERESIS
      81 |  000000C5 | LATIN CAPITAL LETTER A WITH RING ABOVE
      82 |  000000C7 | LATIN CAPITAL LETTER C WITH CEDILLA
      83 |  000000C9 | LATIN CAPITAL LETTER E WITH ACUTE
      84 |  000000D1 | LATIN CAPITAL LETTER N WITH TILDE
      85 |  000000D6 | LATIN CAPITAL LETTER O WITH DIAERESIS
      86 |  000000DC | LATIN CAPITAL LETTER U WITH DIAERESIS
      87 |  000000E1 | LATIN SMALL LETTER A WITH ACUTE
      88 |  000000E0 | LATIN SMALL LETTER A WITH GRAVE
      89 |  000000E2 | LATIN SMALL LETTER A WITH CIRCUMFLEX
      8A |  000000E4 | LATIN SMALL LETTER A WITH DIAERESIS
      8B |  000000E3 | LATIN SMALL LETTER A WITH TILDE
      8C |  000000E5 | LATIN SMALL LETTER A WITH RING ABOVE
      8D |  000000E7 | LATIN SMALL LETTER C WITH CEDILLA
      8E |  000000E9 | LATIN SMALL LETTER E WITH ACUTE
      8F |  000000E8 | LATIN SMALL LETTER E WITH GRAVE
      90 |  000000EA | LATIN SMALL LETTER E WITH CIRCUMFLEX
      91 |  000000EB | LATIN SMALL LETTER E WITH DIAERESIS
      92 |  000000ED | LATIN SMALL LETTER I WITH ACUTE
      93 |  000000EC | LATIN SMALL LETTER I WITH GRAVE
      94 |  000000EE | LATIN SMALL LETTER I WITH CIRCUMFLEX
      95 |  000000EF | LATIN SMALL LETTER I WITH DIAERESIS
      96 |  000000F1 | LATIN SMALL LETTER N WITH TILDE
      97 |  000000F3 | LATIN SMALL LETTER O WITH ACUTE
      98 |  000000F2 | LATIN SMALL LETTER O WITH GRAVE
      99 |  000000F4 | LATIN SMALL LETTER O WITH CIRCUMFLEX
      9A |  000000F6 | LATIN SMALL LETTER O WITH DIAERESIS
      9B |  000000F5 | LATIN SMALL LETTER O WITH TILDE
      9C |  000000FA | LATIN SMALL LETTER U WITH ACUTE
      9D |  000000F9 | LATIN SMALL LETTER U WITH GRAVE
      9E |  000000FB | LATIN SMALL LETTER U WITH CIRCUMFLEX
      9F |  000000FC | LATIN SMALL LETTER U WITH DIAERESIS
      A0 |  00002020 | DAGGER
      A1 |  000000B0 | DEGREE SIGN
      A2 |  000000A2 | CENT SIGN
      A3 |  000000A3 | POUND SIGN
      A4 |  000000A7 | SECTION SIGN
      A5 |  00002022 | BULLET
      A6 |  000000B6 | PILCROW SIGN
      A7 |  000000DF | LATIN SMALL LETTER SHARP S
      A8 |  000000AE | REGISTERED SIGN
      A9 |  000000A9 | COPYRIGHT SIGN
      AA |  00002122 | TRADE MARK SIGN
      AB |  000000B4 | ACUTE ACCENT
      AC |  000000A8 | DIAERESIS
      AD |  00002260 | NOT EQUAL TO
      AE |  00000102 | LATIN CAPITAL LETTER A WITH BREVE
      AF |  0000015E | LATIN CAPITAL LETTER S WITH CEDILLA
      B0 |  0000221E | INFINITY
      B1 |  000000B1 | PLUS-MINUS SIGN
      B2 |  00002264 | LESS-THAN OR EQUAL TO
      B3 |  00002265 | GREATER-THAN OR EQUAL TO
      B4 |  000000A5 | YEN SIGN
      B5 |  000000B5 | MICRO SIGN
      B6 |  00002202 | PARTIAL DIFFERENTIAL
      B7 |  00002211 | N-ARY SUMMATION
      B8 |  0000220F | N-ARY PRODUCT
      B9 |  000003C0 | GREEK SMALL LETTER PI
      BA |  0000222B | INTEGRAL
      BB |  000000AA | FEMININE ORDINAL INDICATOR
      BC |  000000BA | MASCULINE ORDINAL INDICATOR
      BD |  00002126 | OHM SIGN
      BE |  00000103 | LATIN SMALL LETTER A WITH BREVE
      BF |  0000015F | LATIN SMALL LETTER S WITH CEDILLA
      C0 |  000000BF | INVERTED QUESTION MARK
      C1 |  000000A1 | INVERTED EXCLAMATION MARK
      C2 |  000000AC | NOT SIGN
      C3 |  0000221A | SQUARE ROOT
      C4 |  00000192 | LATIN SMALL LETTER F WITH HOOK
      C5 |  00002248 | ALMOST EQUAL TO
      C6 |  00002206 | INCREMENT
      C7 |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
      C8 |  000000BB | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
      C9 |  00002026 | HORIZONTAL ELLIPSIS
      CA |  000000A0 | NO-BREAK SPACE
      CB |  000000C0 | LATIN CAPITAL LETTER A WITH GRAVE
      CC |  000000C3 | LATIN CAPITAL LETTER A WITH TILDE
      CD |  000000D5 | LATIN CAPITAL LETTER O WITH TILDE
      CE |  00000152 | LATIN CAPITAL LIGATURE OE
      CF |  00000153 | LATIN SMALL LIGATURE OE
      D0 |  00002013 | EN DASH
      D1 |  00002014 | EM DASH
      D2 |  0000201C | LEFT DOUBLE QUOTATION MARK
      D3 |  0000201D | RIGHT DOUBLE QUOTATION MARK
      D4 |  00002018 | LEFT SINGLE QUOTATION MARK
      D5 |  00002019 | RIGHT SINGLE QUOTATION MARK
      D6 |  000000F7 | DIVISION SIGN
      D7 |  000025CA | LOZENGE
      D8 |  000000FF | LATIN SMALL LETTER Y WITH DIAERESIS
      D9 |  00000178 | LATIN CAPITAL LETTER Y WITH DIAERESIS
      DA |  00002044 | FRACTION SLASH
      DB |  000000A4 | CURRENCY SIGN
      DC |  00002039 | SINGLE LEFT-POINTING ANGLE QUOTATION MARK
      DD |  0000203A | SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
      DE |  00000162 | LATIN CAPITAL LETTER T WITH CEDILLA
      DF |  00000163 | LATIN SMALL LETTER T WITH CEDILLA
      E0 |  00002021 | DOUBLE DAGGER
      E1 |  000000B7 | MIDDLE DOT
      E2 |  0000201A | SINGLE LOW-9 QUOTATION MARK
      E3 |  0000201E | DOUBLE LOW-9 QUOTATION MARK
      E4 |  00002030 | PER MILLE SIGN
      E5 |  000000C2 | LATIN CAPITAL LETTER A WITH CIRCUMFLEX
      E6 |  000000CA | LATIN CAPITAL LETTER E WITH CIRCUMFLEX
      E7 |  000000C1 | LATIN CAPITAL LETTER A WITH ACUTE
      E8 |  000000CB | LATIN CAPITAL LETTER E WITH DIAERESIS
      E9 |  000000C8 | LATIN CAPITAL LETTER E WITH GRAVE
      EA |  000000CD | LATIN CAPITAL LETTER I WITH ACUTE
      EB |  000000CE | LATIN CAPITAL LETTER I WITH CIRCUMFLEX
      EC |  000000CF | LATIN CAPITAL LETTER I WITH DIAERESIS
      ED |  000000CC | LATIN CAPITAL LETTER I WITH GRAVE
      EE |  000000D3 | LATIN CAPITAL LETTER O WITH ACUTE
      EF |  000000D4 | LATIN CAPITAL LETTER O WITH CIRCUMFLEX
      F1 |  000000D2 | LATIN CAPITAL LETTER O WITH GRAVE
      F2 |  000000DA | LATIN CAPITAL LETTER U WITH ACUTE
      F3 |  000000DB | LATIN CAPITAL LETTER U WITH CIRCUMFLEX
      F4 |  000000D9 | LATIN CAPITAL LETTER U WITH GRAVE
      F5 |  00000131 | LATIN SMALL LETTER DOTLESS I
      F6 |  000002C6 | MODIFIER LETTER CIRCUMFLEX ACCENT
      F7 |  000002DC | SMALL TILDE
      F8 |  000000AF | MACRON
      F9 |  000002D8 | BREVE
      FA |  000002D9 | DOT ABOVE
      FB |  000002DA | RING ABOVE
      FC |  000000B8 | CEDILLA
      FD |  000002DD | DOUBLE ACUTE ACCENT
      FE |  000002DB | OGONEK
      FF |  000002C7 | CARON
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_MACROMANIA

    $main::fatpacked{"Locale/RecodeData/MACTHAI.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_MACTHAI';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for MACTHAI.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::MACTHAI;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0x00ab,
      0x00bb,
      0x2026,
      0xf88c,
      0xf88f,
      0xf892,
      0xf895,
      0xf898,
      0xf88b,
      0xf88e,
      0xf891,
      0xf894,
      0xf897,
      0x201c,
      0x201d,
      0xf899,
      0xfffd,
      0x2022,
      0xf884,
      0xf889,
      0xf885,
      0xf886,
      0xf887,
      0xf888,
      0xf88a,
      0xf88d,
      0xf890,
      0xf893,
      0xf896,
      0x2018,
      0x2019,
      0xfffd,
      0x00a0,
      0x0e01,
      0x0e02,
      0x0e03,
      0x0e04,
      0x0e05,
      0x0e06,
      0x0e07,
      0x0e08,
      0x0e09,
      0x0e0a,
      0x0e0b,
      0x0e0c,
      0x0e0d,
      0x0e0e,
      0x0e0f,
      0x0e10,
      0x0e11,
      0x0e12,
      0x0e13,
      0x0e14,
      0x0e15,
      0x0e16,
      0x0e17,
      0x0e18,
      0x0e19,
      0x0e1a,
      0x0e1b,
      0x0e1c,
      0x0e1d,
      0x0e1e,
      0x0e1f,
      0x0e20,
      0x0e21,
      0x0e22,
      0x0e23,
      0x0e24,
      0x0e25,
      0x0e26,
      0x0e27,
      0x0e28,
      0x0e29,
      0x0e2a,
      0x0e2b,
      0x0e2c,
      0x0e2d,
      0x0e2e,
      0x0e2f,
      0x0e30,
      0x0e31,
      0x0e32,
      0x0e33,
      0x0e34,
      0x0e35,
      0x0e36,
      0x0e37,
      0x0e38,
      0x0e39,
      0x0e3a,
      0xfeff,
      0x200b,
      0x2013,
      0x2014,
      0x0e3f,
      0x0e40,
      0x0e41,
      0x0e42,
      0x0e43,
      0x0e44,
      0x0e45,
      0x0e46,
      0x0e47,
      0x0e48,
      0x0e49,
      0x0e4a,
      0x0e4b,
      0x0e4c,
      0x0e4d,
      0x2122,
      0x0e4f,
      0x0e50,
      0x0e51,
      0x0e52,
      0x0e53,
      0x0e54,
      0x0e55,
      0x0e56,
      0x0e57,
      0x0e58,
      0x0e59,
      0x00ae,
      0x00a9,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xc2\xab",
      "\xc2\xbb",
      "\xe2\x80\xa6",
      "\xef\xa2\x8c",
      "\xef\xa2\x8f",
      "\xef\xa2\x92",
      "\xef\xa2\x95",
      "\xef\xa2\x98",
      "\xef\xa2\x8b",
      "\xef\xa2\x8e",
      "\xef\xa2\x91",
      "\xef\xa2\x94",
      "\xef\xa2\x97",
      "\xe2\x80\x9c",
      "\xe2\x80\x9d",
      "\xef\xa2\x99",
      "\xef\xbf\xbd",
      "\xe2\x80\xa2",
      "\xef\xa2\x84",
      "\xef\xa2\x89",
      "\xef\xa2\x85",
      "\xef\xa2\x86",
      "\xef\xa2\x87",
      "\xef\xa2\x88",
      "\xef\xa2\x8a",
      "\xef\xa2\x8d",
      "\xef\xa2\x90",
      "\xef\xa2\x93",
      "\xef\xa2\x96",
      "\xe2\x80\x98",
      "\xe2\x80\x99",
      "\xef\xbf\xbd",
      "\xc2\xa0",
      "\xe0\xb8\x81",
      "\xe0\xb8\x82",
      "\xe0\xb8\x83",
      "\xe0\xb8\x84",
      "\xe0\xb8\x85",
      "\xe0\xb8\x86",
      "\xe0\xb8\x87",
      "\xe0\xb8\x88",
      "\xe0\xb8\x89",
      "\xe0\xb8\x8a",
      "\xe0\xb8\x8b",
      "\xe0\xb8\x8c",
      "\xe0\xb8\x8d",
      "\xe0\xb8\x8e",
      "\xe0\xb8\x8f",
      "\xe0\xb8\x90",
      "\xe0\xb8\x91",
      "\xe0\xb8\x92",
      "\xe0\xb8\x93",
      "\xe0\xb8\x94",
      "\xe0\xb8\x95",
      "\xe0\xb8\x96",
      "\xe0\xb8\x97",
      "\xe0\xb8\x98",
      "\xe0\xb8\x99",
      "\xe0\xb8\x9a",
      "\xe0\xb8\x9b",
      "\xe0\xb8\x9c",
      "\xe0\xb8\x9d",
      "\xe0\xb8\x9e",
      "\xe0\xb8\x9f",
      "\xe0\xb8\xa0",
      "\xe0\xb8\xa1",
      "\xe0\xb8\xa2",
      "\xe0\xb8\xa3",
      "\xe0\xb8\xa4",
      "\xe0\xb8\xa5",
      "\xe0\xb8\xa6",
      "\xe0\xb8\xa7",
      "\xe0\xb8\xa8",
      "\xe0\xb8\xa9",
      "\xe0\xb8\xaa",
      "\xe0\xb8\xab",
      "\xe0\xb8\xac",
      "\xe0\xb8\xad",
      "\xe0\xb8\xae",
      "\xe0\xb8\xaf",
      "\xe0\xb8\xb0",
      "\xe0\xb8\xb1",
      "\xe0\xb8\xb2",
      "\xe0\xb8\xb3",
      "\xe0\xb8\xb4",
      "\xe0\xb8\xb5",
      "\xe0\xb8\xb6",
      "\xe0\xb8\xb7",
      "\xe0\xb8\xb8",
      "\xe0\xb8\xb9",
      "\xe0\xb8\xba",
      "\xef\xbb\xbf",
      "\xe2\x80\x8b",
      "\xe2\x80\x93",
      "\xe2\x80\x94",
      "\xe0\xb8\xbf",
      "\xe0\xb9\x80",
      "\xe0\xb9\x81",
      "\xe0\xb9\x82",
      "\xe0\xb9\x83",
      "\xe0\xb9\x84",
      "\xe0\xb9\x85",
      "\xe0\xb9\x86",
      "\xe0\xb9\x87",
      "\xe0\xb9\x88",
      "\xe0\xb9\x89",
      "\xe0\xb9\x8a",
      "\xe0\xb9\x8b",
      "\xe0\xb9\x8c",
      "\xe0\xb9\x8d",
      "\xe2\x84\xa2",
      "\xe0\xb9\x8f",
      "\xe0\xb9\x90",
      "\xe0\xb9\x91",
      "\xe0\xb9\x92",
      "\xe0\xb9\x93",
      "\xe0\xb9\x94",
      "\xe0\xb9\x95",
      "\xe0\xb9\x96",
      "\xe0\xb9\x97",
      "\xe0\xb9\x98",
      "\xe0\xb9\x99",
      "\xc2\xae",
      "\xc2\xa9",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x000000a0 => "\xa0",
      0x000000a9 => "\xfb",
      0x000000ab => "\x80",
      0x000000ae => "\xfa",
      0x000000bb => "\x81",
      0x00000e01 => "\xa1",
      0x00000e02 => "\xa2",
      0x00000e03 => "\xa3",
      0x00000e04 => "\xa4",
      0x00000e05 => "\xa5",
      0x00000e06 => "\xa6",
      0x00000e07 => "\xa7",
      0x00000e08 => "\xa8",
      0x00000e09 => "\xa9",
      0x00000e0a => "\xaa",
      0x00000e0b => "\xab",
      0x00000e0c => "\xac",
      0x00000e0d => "\xad",
      0x00000e0e => "\xae",
      0x00000e0f => "\xaf",
      0x00000e10 => "\xb0",
      0x00000e11 => "\xb1",
      0x00000e12 => "\xb2",
      0x00000e13 => "\xb3",
      0x00000e14 => "\xb4",
      0x00000e15 => "\xb5",
      0x00000e16 => "\xb6",
      0x00000e17 => "\xb7",
      0x00000e18 => "\xb8",
      0x00000e19 => "\xb9",
      0x00000e1a => "\xba",
      0x00000e1b => "\xbb",
      0x00000e1c => "\xbc",
      0x00000e1d => "\xbd",
      0x00000e1e => "\xbe",
      0x00000e1f => "\xbf",
      0x00000e20 => "\xc0",
      0x00000e21 => "\xc1",
      0x00000e22 => "\xc2",
      0x00000e23 => "\xc3",
      0x00000e24 => "\xc4",
      0x00000e25 => "\xc5",
      0x00000e26 => "\xc6",
      0x00000e27 => "\xc7",
      0x00000e28 => "\xc8",
      0x00000e29 => "\xc9",
      0x00000e2a => "\xca",
      0x00000e2b => "\xcb",
      0x00000e2c => "\xcc",
      0x00000e2d => "\xcd",
      0x00000e2e => "\xce",
      0x00000e2f => "\xcf",
      0x00000e30 => "\xd0",
      0x00000e31 => "\xd1",
      0x00000e32 => "\xd2",
      0x00000e33 => "\xd3",
      0x00000e34 => "\xd4",
      0x00000e35 => "\xd5",
      0x00000e36 => "\xd6",
      0x00000e37 => "\xd7",
      0x00000e38 => "\xd8",
      0x00000e39 => "\xd9",
      0x00000e3a => "\xda",
      0x00000e3f => "\xdf",
      0x00000e40 => "\xe0",
      0x00000e41 => "\xe1",
      0x00000e42 => "\xe2",
      0x00000e43 => "\xe3",
      0x00000e44 => "\xe4",
      0x00000e45 => "\xe5",
      0x00000e46 => "\xe6",
      0x00000e47 => "\xe7",
      0x00000e48 => "\xe8",
      0x00000e49 => "\xe9",
      0x00000e4a => "\xea",
      0x00000e4b => "\xeb",
      0x00000e4c => "\xec",
      0x00000e4d => "\xed",
      0x00000e4f => "\xef",
      0x00000e50 => "\xf0",
      0x00000e51 => "\xf1",
      0x00000e52 => "\xf2",
      0x00000e53 => "\xf3",
      0x00000e54 => "\xf4",
      0x00000e55 => "\xf5",
      0x00000e56 => "\xf6",
      0x00000e57 => "\xf7",
      0x00000e58 => "\xf8",
      0x00000e59 => "\xf9",
      0x0000200b => "\xdc",
      0x00002013 => "\xdd",
      0x00002014 => "\xde",
      0x00002018 => "\x9d",
      0x00002019 => "\x9e",
      0x0000201c => "\x8d",
      0x0000201d => "\x8e",
      0x00002022 => "\x91",
      0x00002026 => "\x82",
      0x00002122 => "\xee",
      0x0000f884 => "\x92",
      0x0000f885 => "\x94",
      0x0000f886 => "\x95",
      0x0000f887 => "\x96",
      0x0000f888 => "\x97",
      0x0000f889 => "\x93",
      0x0000f88a => "\x98",
      0x0000f88b => "\x88",
      0x0000f88c => "\x83",
      0x0000f88d => "\x99",
      0x0000f88e => "\x89",
      0x0000f88f => "\x84",
      0x0000f890 => "\x9a",
      0x0000f891 => "\x8a",
      0x0000f892 => "\x85",
      0x0000f893 => "\x9b",
      0x0000f894 => "\x8b",
      0x0000f895 => "\x86",
      0x0000f896 => "\x9c",
      0x0000f897 => "\x8c",
      0x0000f898 => "\x87",
      0x0000f899 => "\x8f",
      0x0000feff => "\xdb",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::MACTHAI - Conversion routines for MACTHAI
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for MACTHAI.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
  
   This charmap has been generated automatically from GNU libiconv
   conversions.
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE (DEL)
      80 |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
      81 |  000000BB | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
      82 |  00002026 | HORIZONTAL ELLIPSIS
      83 |  0000F88C | E<lt>CJKE<gt>
      84 |  0000F88F | E<lt>CJKE<gt>
      85 |  0000F892 | E<lt>CJKE<gt>
      86 |  0000F895 | E<lt>CJKE<gt>
      87 |  0000F898 | E<lt>CJKE<gt>
      88 |  0000F88B | E<lt>CJKE<gt>
      89 |  0000F88E | E<lt>CJKE<gt>
      8A |  0000F891 | E<lt>CJKE<gt>
      8B |  0000F894 | E<lt>CJKE<gt>
      8C |  0000F897 | E<lt>CJKE<gt>
      8D |  0000201C | LEFT DOUBLE QUOTATION MARK
      8E |  0000201D | RIGHT DOUBLE QUOTATION MARK
      8F |  0000F899 | E<lt>CJKE<gt>
      91 |  00002022 | BULLET
      92 |  0000F884 | E<lt>CJKE<gt>
      93 |  0000F889 | E<lt>CJKE<gt>
      94 |  0000F885 | E<lt>CJKE<gt>
      95 |  0000F886 | E<lt>CJKE<gt>
      96 |  0000F887 | E<lt>CJKE<gt>
      97 |  0000F888 | E<lt>CJKE<gt>
      98 |  0000F88A | E<lt>CJKE<gt>
      99 |  0000F88D | E<lt>CJKE<gt>
      9A |  0000F890 | E<lt>CJKE<gt>
      9B |  0000F893 | E<lt>CJKE<gt>
      9C |  0000F896 | E<lt>CJKE<gt>
      9D |  00002018 | LEFT SINGLE QUOTATION MARK
      9E |  00002019 | RIGHT SINGLE QUOTATION MARK
      A0 |  000000A0 | NO-BREAK SPACE
      A1 |  00000E01 | THAI CHARACTER KO KAI
      A2 |  00000E02 | THAI CHARACTER KHO KHAI
      A3 |  00000E03 | THAI CHARACTER KHO KHUAT
      A4 |  00000E04 | THAI CHARACTER KHO KHWAI
      A5 |  00000E05 | THAI CHARACTER KHO KHON
      A6 |  00000E06 | THAI CHARACTER KHO RAKHANG
      A7 |  00000E07 | THAI CHARACTER NGO NGU
      A8 |  00000E08 | THAI CHARACTER CHO CHAN
      A9 |  00000E09 | THAI CHARACTER CHO CHING
      AA |  00000E0A | THAI CHARACTER CHO CHANG
      AB |  00000E0B | THAI CHARACTER SO SO
      AC |  00000E0C | THAI CHARACTER CHO CHOE
      AD |  00000E0D | THAI CHARACTER YO YING
      AE |  00000E0E | THAI CHARACTER DO CHADA
      AF |  00000E0F | THAI CHARACTER TO PATAK
      B0 |  00000E10 | THAI CHARACTER THO THAN
      B1 |  00000E11 | THAI CHARACTER THO NANGMONTHO
      B2 |  00000E12 | THAI CHARACTER THO PHUTHAO
      B3 |  00000E13 | THAI CHARACTER NO NEN
      B4 |  00000E14 | THAI CHARACTER DO DEK
      B5 |  00000E15 | THAI CHARACTER TO TAO
      B6 |  00000E16 | THAI CHARACTER THO THUNG
      B7 |  00000E17 | THAI CHARACTER THO THAHAN
      B8 |  00000E18 | THAI CHARACTER THO THONG
      B9 |  00000E19 | THAI CHARACTER NO NU
      BA |  00000E1A | THAI CHARACTER BO BAIMAI
      BB |  00000E1B | THAI CHARACTER PO PLA
      BC |  00000E1C | THAI CHARACTER PHO PHUNG
      BD |  00000E1D | THAI CHARACTER FO FA
      BE |  00000E1E | THAI CHARACTER PHO PHAN
      BF |  00000E1F | THAI CHARACTER FO FAN
      C0 |  00000E20 | THAI CHARACTER PHO SAMPHAO
      C1 |  00000E21 | THAI CHARACTER MO MA
      C2 |  00000E22 | THAI CHARACTER YO YAK
      C3 |  00000E23 | THAI CHARACTER RO RUA
      C4 |  00000E24 | THAI CHARACTER RU
      C5 |  00000E25 | THAI CHARACTER LO LING
      C6 |  00000E26 | THAI CHARACTER LU
      C7 |  00000E27 | THAI CHARACTER WO WAEN
      C8 |  00000E28 | THAI CHARACTER SO SALA
      C9 |  00000E29 | THAI CHARACTER SO RUSI
      CA |  00000E2A | THAI CHARACTER SO SUA
      CB |  00000E2B | THAI CHARACTER HO HIP
      CC |  00000E2C | THAI CHARACTER LO CHULA
      CD |  00000E2D | THAI CHARACTER O ANG
      CE |  00000E2E | THAI CHARACTER HO NOKHUK
      CF |  00000E2F | THAI CHARACTER PAIYANNOI
      D0 |  00000E30 | THAI CHARACTER SARA A
      D1 |  00000E31 | THAI CHARACTER MAI HAN-AKAT
      D2 |  00000E32 | THAI CHARACTER SARA AA
      D3 |  00000E33 | THAI CHARACTER SARA AM
      D4 |  00000E34 | THAI CHARACTER SARA I
      D5 |  00000E35 | THAI CHARACTER SARA II
      D6 |  00000E36 | THAI CHARACTER SARA UE
      D7 |  00000E37 | THAI CHARACTER SARA UEE
      D8 |  00000E38 | THAI CHARACTER SARA U
      D9 |  00000E39 | THAI CHARACTER SARA UU
      DA |  00000E3A | THAI CHARACTER PHINTHU
      DB |  0000FEFF | ZERO WIDTH NO-BREAK SPACE
      DC |  0000200B | ZERO WIDTH SPACE
      DD |  00002013 | EN DASH
      DE |  00002014 | EM DASH
      DF |  00000E3F | THAI CURRENCY SYMBOL BAHT
      E0 |  00000E40 | THAI CHARACTER SARA E
      E1 |  00000E41 | THAI CHARACTER SARA AE
      E2 |  00000E42 | THAI CHARACTER SARA O
      E3 |  00000E43 | THAI CHARACTER SARA AI MAIMUAN
      E4 |  00000E44 | THAI CHARACTER SARA AI MAIMALAI
      E5 |  00000E45 | THAI CHARACTER LAKKHANGYAO
      E6 |  00000E46 | THAI CHARACTER MAIYAMOK
      E7 |  00000E47 | THAI CHARACTER MAITAIKHU
      E8 |  00000E48 | THAI CHARACTER MAI EK
      E9 |  00000E49 | THAI CHARACTER MAI THO
      EA |  00000E4A | THAI CHARACTER MAI TRI
      EB |  00000E4B | THAI CHARACTER MAI CHATTAWA
      EC |  00000E4C | THAI CHARACTER THANTHAKHAT
      ED |  00000E4D | THAI CHARACTER NIKHAHIT
      EE |  00002122 | TRADE MARK SIGN
      EF |  00000E4F | THAI CHARACTER FONGMAN
      F0 |  00000E50 | THAI DIGIT ZERO
      F1 |  00000E51 | THAI DIGIT ONE
      F2 |  00000E52 | THAI DIGIT TWO
      F3 |  00000E53 | THAI DIGIT THREE
      F4 |  00000E54 | THAI DIGIT FOUR
      F5 |  00000E55 | THAI DIGIT FIVE
      F6 |  00000E56 | THAI DIGIT SIX
      F7 |  00000E57 | THAI DIGIT SEVEN
      F8 |  00000E58 | THAI DIGIT EIGHT
      F9 |  00000E59 | THAI DIGIT NINE
      FA |  000000AE | REGISTERED SIGN
      FB |  000000A9 | COPYRIGHT SIGN
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_MACTHAI

    $main::fatpacked{"Locale/RecodeData/MACTURKISH.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_MACTURKISH';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for MACTURKISH.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::MACTURKISH;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0x00c4,
      0x00c5,
      0x00c7,
      0x00c9,
      0x00d1,
      0x00d6,
      0x00dc,
      0x00e1,
      0x00e0,
      0x00e2,
      0x00e4,
      0x00e3,
      0x00e5,
      0x00e7,
      0x00e9,
      0x00e8,
      0x00ea,
      0x00eb,
      0x00ed,
      0x00ec,
      0x00ee,
      0x00ef,
      0x00f1,
      0x00f3,
      0x00f2,
      0x00f4,
      0x00f6,
      0x00f5,
      0x00fa,
      0x00f9,
      0x00fb,
      0x00fc,
      0x2020,
      0x00b0,
      0x00a2,
      0x00a3,
      0x00a7,
      0x2022,
      0x00b6,
      0x00df,
      0x00ae,
      0x00a9,
      0x2122,
      0x00b4,
      0x00a8,
      0x2260,
      0x00c6,
      0x00d8,
      0x221e,
      0x00b1,
      0x2264,
      0x2265,
      0x00a5,
      0x00b5,
      0x2202,
      0x2211,
      0x220f,
      0x03c0,
      0x222b,
      0x00aa,
      0x00ba,
      0x2126,
      0x00e6,
      0x00f8,
      0x00bf,
      0x00a1,
      0x00ac,
      0x221a,
      0x0192,
      0x2248,
      0x2206,
      0x00ab,
      0x00bb,
      0x2026,
      0x00a0,
      0x00c0,
      0x00c3,
      0x00d5,
      0x0152,
      0x0153,
      0x2013,
      0x2014,
      0x201c,
      0x201d,
      0x2018,
      0x2019,
      0x00f7,
      0x25ca,
      0x00ff,
      0x0178,
      0x011e,
      0x011f,
      0x0130,
      0x0131,
      0x015e,
      0x015f,
      0x2021,
      0x00b7,
      0x201a,
      0x201e,
      0x2030,
      0x00c2,
      0x00ca,
      0x00c1,
      0x00cb,
      0x00c8,
      0x00cd,
      0x00ce,
      0x00cf,
      0x00cc,
      0x00d3,
      0x00d4,
      0xfffd,
      0x00d2,
      0x00da,
      0x00db,
      0x00d9,
      0xfffd,
      0x02c6,
      0x02dc,
      0x00af,
      0x02d8,
      0x02d9,
      0x02da,
      0x00b8,
      0x02dd,
      0x02db,
      0x02c7,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xc3\x84",
      "\xc3\x85",
      "\xc3\x87",
      "\xc3\x89",
      "\xc3\x91",
      "\xc3\x96",
      "\xc3\x9c",
      "\xc3\xa1",
      "\xc3\xa0",
      "\xc3\xa2",
      "\xc3\xa4",
      "\xc3\xa3",
      "\xc3\xa5",
      "\xc3\xa7",
      "\xc3\xa9",
      "\xc3\xa8",
      "\xc3\xaa",
      "\xc3\xab",
      "\xc3\xad",
      "\xc3\xac",
      "\xc3\xae",
      "\xc3\xaf",
      "\xc3\xb1",
      "\xc3\xb3",
      "\xc3\xb2",
      "\xc3\xb4",
      "\xc3\xb6",
      "\xc3\xb5",
      "\xc3\xba",
      "\xc3\xb9",
      "\xc3\xbb",
      "\xc3\xbc",
      "\xe2\x80\xa0",
      "\xc2\xb0",
      "\xc2\xa2",
      "\xc2\xa3",
      "\xc2\xa7",
      "\xe2\x80\xa2",
      "\xc2\xb6",
      "\xc3\x9f",
      "\xc2\xae",
      "\xc2\xa9",
      "\xe2\x84\xa2",
      "\xc2\xb4",
      "\xc2\xa8",
      "\xe2\x89\xa0",
      "\xc3\x86",
      "\xc3\x98",
      "\xe2\x88\x9e",
      "\xc2\xb1",
      "\xe2\x89\xa4",
      "\xe2\x89\xa5",
      "\xc2\xa5",
      "\xc2\xb5",
      "\xe2\x88\x82",
      "\xe2\x88\x91",
      "\xe2\x88\x8f",
      "\xcf\x80",
      "\xe2\x88\xab",
      "\xc2\xaa",
      "\xc2\xba",
      "\xe2\x84\xa6",
      "\xc3\xa6",
      "\xc3\xb8",
      "\xc2\xbf",
      "\xc2\xa1",
      "\xc2\xac",
      "\xe2\x88\x9a",
      "\xc6\x92",
      "\xe2\x89\x88",
      "\xe2\x88\x86",
      "\xc2\xab",
      "\xc2\xbb",
      "\xe2\x80\xa6",
      "\xc2\xa0",
      "\xc3\x80",
      "\xc3\x83",
      "\xc3\x95",
      "\xc5\x92",
      "\xc5\x93",
      "\xe2\x80\x93",
      "\xe2\x80\x94",
      "\xe2\x80\x9c",
      "\xe2\x80\x9d",
      "\xe2\x80\x98",
      "\xe2\x80\x99",
      "\xc3\xb7",
      "\xe2\x97\x8a",
      "\xc3\xbf",
      "\xc5\xb8",
      "\xc4\x9e",
      "\xc4\x9f",
      "\xc4\xb0",
      "\xc4\xb1",
      "\xc5\x9e",
      "\xc5\x9f",
      "\xe2\x80\xa1",
      "\xc2\xb7",
      "\xe2\x80\x9a",
      "\xe2\x80\x9e",
      "\xe2\x80\xb0",
      "\xc3\x82",
      "\xc3\x8a",
      "\xc3\x81",
      "\xc3\x8b",
      "\xc3\x88",
      "\xc3\x8d",
      "\xc3\x8e",
      "\xc3\x8f",
      "\xc3\x8c",
      "\xc3\x93",
      "\xc3\x94",
      "\xef\xbf\xbd",
      "\xc3\x92",
      "\xc3\x9a",
      "\xc3\x9b",
      "\xc3\x99",
      "\xef\xbf\xbd",
      "\xcb\x86",
      "\xcb\x9c",
      "\xc2\xaf",
      "\xcb\x98",
      "\xcb\x99",
      "\xcb\x9a",
      "\xc2\xb8",
      "\xcb\x9d",
      "\xcb\x9b",
      "\xcb\x87",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x000000a0 => "\xca",
      0x000000a1 => "\xc1",
      0x000000a2 => "\xa2",
      0x000000a3 => "\xa3",
      0x000000a5 => "\xb4",
      0x000000a7 => "\xa4",
      0x000000a8 => "\xac",
      0x000000a9 => "\xa9",
      0x000000aa => "\xbb",
      0x000000ab => "\xc7",
      0x000000ac => "\xc2",
      0x000000ae => "\xa8",
      0x000000af => "\xf8",
      0x000000b0 => "\xa1",
      0x000000b1 => "\xb1",
      0x000000b4 => "\xab",
      0x000000b5 => "\xb5",
      0x000000b6 => "\xa6",
      0x000000b7 => "\xe1",
      0x000000b8 => "\xfc",
      0x000000ba => "\xbc",
      0x000000bb => "\xc8",
      0x000000bf => "\xc0",
      0x000000c0 => "\xcb",
      0x000000c1 => "\xe7",
      0x000000c2 => "\xe5",
      0x000000c3 => "\xcc",
      0x000000c4 => "\x80",
      0x000000c5 => "\x81",
      0x000000c6 => "\xae",
      0x000000c7 => "\x82",
      0x000000c8 => "\xe9",
      0x000000c9 => "\x83",
      0x000000ca => "\xe6",
      0x000000cb => "\xe8",
      0x000000cc => "\xed",
      0x000000cd => "\xea",
      0x000000ce => "\xeb",
      0x000000cf => "\xec",
      0x000000d1 => "\x84",
      0x000000d2 => "\xf1",
      0x000000d3 => "\xee",
      0x000000d4 => "\xef",
      0x000000d5 => "\xcd",
      0x000000d6 => "\x85",
      0x000000d8 => "\xaf",
      0x000000d9 => "\xf4",
      0x000000da => "\xf2",
      0x000000db => "\xf3",
      0x000000dc => "\x86",
      0x000000df => "\xa7",
      0x000000e0 => "\x88",
      0x000000e1 => "\x87",
      0x000000e2 => "\x89",
      0x000000e3 => "\x8b",
      0x000000e4 => "\x8a",
      0x000000e5 => "\x8c",
      0x000000e6 => "\xbe",
      0x000000e7 => "\x8d",
      0x000000e8 => "\x8f",
      0x000000e9 => "\x8e",
      0x000000ea => "\x90",
      0x000000eb => "\x91",
      0x000000ec => "\x93",
      0x000000ed => "\x92",
      0x000000ee => "\x94",
      0x000000ef => "\x95",
      0x000000f1 => "\x96",
      0x000000f2 => "\x98",
      0x000000f3 => "\x97",
      0x000000f4 => "\x99",
      0x000000f5 => "\x9b",
      0x000000f6 => "\x9a",
      0x000000f7 => "\xd6",
      0x000000f8 => "\xbf",
      0x000000f9 => "\x9d",
      0x000000fa => "\x9c",
      0x000000fb => "\x9e",
      0x000000fc => "\x9f",
      0x000000ff => "\xd8",
      0x0000011e => "\xda",
      0x0000011f => "\xdb",
      0x00000130 => "\xdc",
      0x00000131 => "\xdd",
      0x00000152 => "\xce",
      0x00000153 => "\xcf",
      0x0000015e => "\xde",
      0x0000015f => "\xdf",
      0x00000178 => "\xd9",
      0x00000192 => "\xc4",
      0x000002c6 => "\xf6",
      0x000002c7 => "\xff",
      0x000002d8 => "\xf9",
      0x000002d9 => "\xfa",
      0x000002da => "\xfb",
      0x000002db => "\xfe",
      0x000002dc => "\xf7",
      0x000002dd => "\xfd",
      0x000003c0 => "\xb9",
      0x00002013 => "\xd0",
      0x00002014 => "\xd1",
      0x00002018 => "\xd4",
      0x00002019 => "\xd5",
      0x0000201a => "\xe2",
      0x0000201c => "\xd2",
      0x0000201d => "\xd3",
      0x0000201e => "\xe3",
      0x00002020 => "\xa0",
      0x00002021 => "\xe0",
      0x00002022 => "\xa5",
      0x00002026 => "\xc9",
      0x00002030 => "\xe4",
      0x00002122 => "\xaa",
      0x00002126 => "\xbd",
      0x00002202 => "\xb6",
      0x00002206 => "\xc6",
      0x0000220f => "\xb8",
      0x00002211 => "\xb7",
      0x0000221a => "\xc3",
      0x0000221e => "\xb0",
      0x0000222b => "\xba",
      0x00002248 => "\xc5",
      0x00002260 => "\xad",
      0x00002264 => "\xb2",
      0x00002265 => "\xb3",
      0x000025ca => "\xd7",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::MACTURKISH - Conversion routines for MACTURKISH
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for MACTURKISH.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
  
   This charmap has been generated automatically from GNU libiconv
   conversions.
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE (DEL)
      80 |  000000C4 | LATIN CAPITAL LETTER A WITH DIAERESIS
      81 |  000000C5 | LATIN CAPITAL LETTER A WITH RING ABOVE
      82 |  000000C7 | LATIN CAPITAL LETTER C WITH CEDILLA
      83 |  000000C9 | LATIN CAPITAL LETTER E WITH ACUTE
      84 |  000000D1 | LATIN CAPITAL LETTER N WITH TILDE
      85 |  000000D6 | LATIN CAPITAL LETTER O WITH DIAERESIS
      86 |  000000DC | LATIN CAPITAL LETTER U WITH DIAERESIS
      87 |  000000E1 | LATIN SMALL LETTER A WITH ACUTE
      88 |  000000E0 | LATIN SMALL LETTER A WITH GRAVE
      89 |  000000E2 | LATIN SMALL LETTER A WITH CIRCUMFLEX
      8A |  000000E4 | LATIN SMALL LETTER A WITH DIAERESIS
      8B |  000000E3 | LATIN SMALL LETTER A WITH TILDE
      8C |  000000E5 | LATIN SMALL LETTER A WITH RING ABOVE
      8D |  000000E7 | LATIN SMALL LETTER C WITH CEDILLA
      8E |  000000E9 | LATIN SMALL LETTER E WITH ACUTE
      8F |  000000E8 | LATIN SMALL LETTER E WITH GRAVE
      90 |  000000EA | LATIN SMALL LETTER E WITH CIRCUMFLEX
      91 |  000000EB | LATIN SMALL LETTER E WITH DIAERESIS
      92 |  000000ED | LATIN SMALL LETTER I WITH ACUTE
      93 |  000000EC | LATIN SMALL LETTER I WITH GRAVE
      94 |  000000EE | LATIN SMALL LETTER I WITH CIRCUMFLEX
      95 |  000000EF | LATIN SMALL LETTER I WITH DIAERESIS
      96 |  000000F1 | LATIN SMALL LETTER N WITH TILDE
      97 |  000000F3 | LATIN SMALL LETTER O WITH ACUTE
      98 |  000000F2 | LATIN SMALL LETTER O WITH GRAVE
      99 |  000000F4 | LATIN SMALL LETTER O WITH CIRCUMFLEX
      9A |  000000F6 | LATIN SMALL LETTER O WITH DIAERESIS
      9B |  000000F5 | LATIN SMALL LETTER O WITH TILDE
      9C |  000000FA | LATIN SMALL LETTER U WITH ACUTE
      9D |  000000F9 | LATIN SMALL LETTER U WITH GRAVE
      9E |  000000FB | LATIN SMALL LETTER U WITH CIRCUMFLEX
      9F |  000000FC | LATIN SMALL LETTER U WITH DIAERESIS
      A0 |  00002020 | DAGGER
      A1 |  000000B0 | DEGREE SIGN
      A2 |  000000A2 | CENT SIGN
      A3 |  000000A3 | POUND SIGN
      A4 |  000000A7 | SECTION SIGN
      A5 |  00002022 | BULLET
      A6 |  000000B6 | PILCROW SIGN
      A7 |  000000DF | LATIN SMALL LETTER SHARP S
      A8 |  000000AE | REGISTERED SIGN
      A9 |  000000A9 | COPYRIGHT SIGN
      AA |  00002122 | TRADE MARK SIGN
      AB |  000000B4 | ACUTE ACCENT
      AC |  000000A8 | DIAERESIS
      AD |  00002260 | NOT EQUAL TO
      AE |  000000C6 | LATIN CAPITAL LETTER AE
      AF |  000000D8 | LATIN CAPITAL LETTER O WITH STROKE
      B0 |  0000221E | INFINITY
      B1 |  000000B1 | PLUS-MINUS SIGN
      B2 |  00002264 | LESS-THAN OR EQUAL TO
      B3 |  00002265 | GREATER-THAN OR EQUAL TO
      B4 |  000000A5 | YEN SIGN
      B5 |  000000B5 | MICRO SIGN
      B6 |  00002202 | PARTIAL DIFFERENTIAL
      B7 |  00002211 | N-ARY SUMMATION
      B8 |  0000220F | N-ARY PRODUCT
      B9 |  000003C0 | GREEK SMALL LETTER PI
      BA |  0000222B | INTEGRAL
      BB |  000000AA | FEMININE ORDINAL INDICATOR
      BC |  000000BA | MASCULINE ORDINAL INDICATOR
      BD |  00002126 | OHM SIGN
      BE |  000000E6 | LATIN SMALL LETTER AE
      BF |  000000F8 | LATIN SMALL LETTER O WITH STROKE
      C0 |  000000BF | INVERTED QUESTION MARK
      C1 |  000000A1 | INVERTED EXCLAMATION MARK
      C2 |  000000AC | NOT SIGN
      C3 |  0000221A | SQUARE ROOT
      C4 |  00000192 | LATIN SMALL LETTER F WITH HOOK
      C5 |  00002248 | ALMOST EQUAL TO
      C6 |  00002206 | INCREMENT
      C7 |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
      C8 |  000000BB | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
      C9 |  00002026 | HORIZONTAL ELLIPSIS
      CA |  000000A0 | NO-BREAK SPACE
      CB |  000000C0 | LATIN CAPITAL LETTER A WITH GRAVE
      CC |  000000C3 | LATIN CAPITAL LETTER A WITH TILDE
      CD |  000000D5 | LATIN CAPITAL LETTER O WITH TILDE
      CE |  00000152 | LATIN CAPITAL LIGATURE OE
      CF |  00000153 | LATIN SMALL LIGATURE OE
      D0 |  00002013 | EN DASH
      D1 |  00002014 | EM DASH
      D2 |  0000201C | LEFT DOUBLE QUOTATION MARK
      D3 |  0000201D | RIGHT DOUBLE QUOTATION MARK
      D4 |  00002018 | LEFT SINGLE QUOTATION MARK
      D5 |  00002019 | RIGHT SINGLE QUOTATION MARK
      D6 |  000000F7 | DIVISION SIGN
      D7 |  000025CA | LOZENGE
      D8 |  000000FF | LATIN SMALL LETTER Y WITH DIAERESIS
      D9 |  00000178 | LATIN CAPITAL LETTER Y WITH DIAERESIS
      DA |  0000011E | LATIN CAPITAL LETTER G WITH BREVE
      DB |  0000011F | LATIN SMALL LETTER G WITH BREVE
      DC |  00000130 | LATIN CAPITAL LETTER I WITH DOT ABOVE
      DD |  00000131 | LATIN SMALL LETTER DOTLESS I
      DE |  0000015E | LATIN CAPITAL LETTER S WITH CEDILLA
      DF |  0000015F | LATIN SMALL LETTER S WITH CEDILLA
      E0 |  00002021 | DOUBLE DAGGER
      E1 |  000000B7 | MIDDLE DOT
      E2 |  0000201A | SINGLE LOW-9 QUOTATION MARK
      E3 |  0000201E | DOUBLE LOW-9 QUOTATION MARK
      E4 |  00002030 | PER MILLE SIGN
      E5 |  000000C2 | LATIN CAPITAL LETTER A WITH CIRCUMFLEX
      E6 |  000000CA | LATIN CAPITAL LETTER E WITH CIRCUMFLEX
      E7 |  000000C1 | LATIN CAPITAL LETTER A WITH ACUTE
      E8 |  000000CB | LATIN CAPITAL LETTER E WITH DIAERESIS
      E9 |  000000C8 | LATIN CAPITAL LETTER E WITH GRAVE
      EA |  000000CD | LATIN CAPITAL LETTER I WITH ACUTE
      EB |  000000CE | LATIN CAPITAL LETTER I WITH CIRCUMFLEX
      EC |  000000CF | LATIN CAPITAL LETTER I WITH DIAERESIS
      ED |  000000CC | LATIN CAPITAL LETTER I WITH GRAVE
      EE |  000000D3 | LATIN CAPITAL LETTER O WITH ACUTE
      EF |  000000D4 | LATIN CAPITAL LETTER O WITH CIRCUMFLEX
      F1 |  000000D2 | LATIN CAPITAL LETTER O WITH GRAVE
      F2 |  000000DA | LATIN CAPITAL LETTER U WITH ACUTE
      F3 |  000000DB | LATIN CAPITAL LETTER U WITH CIRCUMFLEX
      F4 |  000000D9 | LATIN CAPITAL LETTER U WITH GRAVE
      F6 |  000002C6 | MODIFIER LETTER CIRCUMFLEX ACCENT
      F7 |  000002DC | SMALL TILDE
      F8 |  000000AF | MACRON
      F9 |  000002D8 | BREVE
      FA |  000002D9 | DOT ABOVE
      FB |  000002DA | RING ABOVE
      FC |  000000B8 | CEDILLA
      FD |  000002DD | DOUBLE ACUTE ACCENT
      FE |  000002DB | OGONEK
      FF |  000002C7 | CARON
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_MACTURKISH

    $main::fatpacked{"Locale/RecodeData/MACUKRAINE.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_MACUKRAINE';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for MACUKRAINE.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::MACUKRAINE;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0x0410,
      0x0411,
      0x0412,
      0x0413,
      0x0414,
      0x0415,
      0x0416,
      0x0417,
      0x0418,
      0x0419,
      0x041a,
      0x041b,
      0x041c,
      0x041d,
      0x041e,
      0x041f,
      0x0420,
      0x0421,
      0x0422,
      0x0423,
      0x0424,
      0x0425,
      0x0426,
      0x0427,
      0x0428,
      0x0429,
      0x042a,
      0x042b,
      0x042c,
      0x042d,
      0x042e,
      0x042f,
      0x2020,
      0x00b0,
      0x0490,
      0x00a3,
      0x00a7,
      0x2022,
      0x00b6,
      0x0406,
      0x00ae,
      0x00a9,
      0x2122,
      0x0402,
      0x0452,
      0x2260,
      0x0403,
      0x0453,
      0x221e,
      0x00b1,
      0x2264,
      0x2265,
      0x0456,
      0x00b5,
      0x0491,
      0x0408,
      0x0404,
      0x0454,
      0x0407,
      0x0457,
      0x0409,
      0x0459,
      0x040a,
      0x045a,
      0x0458,
      0x0405,
      0x00ac,
      0x221a,
      0x0192,
      0x2248,
      0x2206,
      0x00ab,
      0x00bb,
      0x2026,
      0x00a0,
      0x040b,
      0x045b,
      0x040c,
      0x045c,
      0x0455,
      0x2013,
      0x2014,
      0x201c,
      0x201d,
      0x2018,
      0x2019,
      0x00f7,
      0x201e,
      0x040e,
      0x045e,
      0x040f,
      0x045f,
      0x2116,
      0x0401,
      0x0451,
      0x044f,
      0x0430,
      0x0431,
      0x0432,
      0x0433,
      0x0434,
      0x0435,
      0x0436,
      0x0437,
      0x0438,
      0x0439,
      0x043a,
      0x043b,
      0x043c,
      0x043d,
      0x043e,
      0x043f,
      0x0440,
      0x0441,
      0x0442,
      0x0443,
      0x0444,
      0x0445,
      0x0446,
      0x0447,
      0x0448,
      0x0449,
      0x044a,
      0x044b,
      0x044c,
      0x044d,
      0x044e,
      0x00a4,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xd0\x90",
      "\xd0\x91",
      "\xd0\x92",
      "\xd0\x93",
      "\xd0\x94",
      "\xd0\x95",
      "\xd0\x96",
      "\xd0\x97",
      "\xd0\x98",
      "\xd0\x99",
      "\xd0\x9a",
      "\xd0\x9b",
      "\xd0\x9c",
      "\xd0\x9d",
      "\xd0\x9e",
      "\xd0\x9f",
      "\xd0\xa0",
      "\xd0\xa1",
      "\xd0\xa2",
      "\xd0\xa3",
      "\xd0\xa4",
      "\xd0\xa5",
      "\xd0\xa6",
      "\xd0\xa7",
      "\xd0\xa8",
      "\xd0\xa9",
      "\xd0\xaa",
      "\xd0\xab",
      "\xd0\xac",
      "\xd0\xad",
      "\xd0\xae",
      "\xd0\xaf",
      "\xe2\x80\xa0",
      "\xc2\xb0",
      "\xd2\x90",
      "\xc2\xa3",
      "\xc2\xa7",
      "\xe2\x80\xa2",
      "\xc2\xb6",
      "\xd0\x86",
      "\xc2\xae",
      "\xc2\xa9",
      "\xe2\x84\xa2",
      "\xd0\x82",
      "\xd1\x92",
      "\xe2\x89\xa0",
      "\xd0\x83",
      "\xd1\x93",
      "\xe2\x88\x9e",
      "\xc2\xb1",
      "\xe2\x89\xa4",
      "\xe2\x89\xa5",
      "\xd1\x96",
      "\xc2\xb5",
      "\xd2\x91",
      "\xd0\x88",
      "\xd0\x84",
      "\xd1\x94",
      "\xd0\x87",
      "\xd1\x97",
      "\xd0\x89",
      "\xd1\x99",
      "\xd0\x8a",
      "\xd1\x9a",
      "\xd1\x98",
      "\xd0\x85",
      "\xc2\xac",
      "\xe2\x88\x9a",
      "\xc6\x92",
      "\xe2\x89\x88",
      "\xe2\x88\x86",
      "\xc2\xab",
      "\xc2\xbb",
      "\xe2\x80\xa6",
      "\xc2\xa0",
      "\xd0\x8b",
      "\xd1\x9b",
      "\xd0\x8c",
      "\xd1\x9c",
      "\xd1\x95",
      "\xe2\x80\x93",
      "\xe2\x80\x94",
      "\xe2\x80\x9c",
      "\xe2\x80\x9d",
      "\xe2\x80\x98",
      "\xe2\x80\x99",
      "\xc3\xb7",
      "\xe2\x80\x9e",
      "\xd0\x8e",
      "\xd1\x9e",
      "\xd0\x8f",
      "\xd1\x9f",
      "\xe2\x84\x96",
      "\xd0\x81",
      "\xd1\x91",
      "\xd1\x8f",
      "\xd0\xb0",
      "\xd0\xb1",
      "\xd0\xb2",
      "\xd0\xb3",
      "\xd0\xb4",
      "\xd0\xb5",
      "\xd0\xb6",
      "\xd0\xb7",
      "\xd0\xb8",
      "\xd0\xb9",
      "\xd0\xba",
      "\xd0\xbb",
      "\xd0\xbc",
      "\xd0\xbd",
      "\xd0\xbe",
      "\xd0\xbf",
      "\xd1\x80",
      "\xd1\x81",
      "\xd1\x82",
      "\xd1\x83",
      "\xd1\x84",
      "\xd1\x85",
      "\xd1\x86",
      "\xd1\x87",
      "\xd1\x88",
      "\xd1\x89",
      "\xd1\x8a",
      "\xd1\x8b",
      "\xd1\x8c",
      "\xd1\x8d",
      "\xd1\x8e",
      "\xc2\xa4",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x000000a0 => "\xca",
      0x000000a3 => "\xa3",
      0x000000a4 => "\xff",
      0x000000a7 => "\xa4",
      0x000000a9 => "\xa9",
      0x000000ab => "\xc7",
      0x000000ac => "\xc2",
      0x000000ae => "\xa8",
      0x000000b0 => "\xa1",
      0x000000b1 => "\xb1",
      0x000000b5 => "\xb5",
      0x000000b6 => "\xa6",
      0x000000bb => "\xc8",
      0x000000f7 => "\xd6",
      0x00000192 => "\xc4",
      0x00000401 => "\xdd",
      0x00000402 => "\xab",
      0x00000403 => "\xae",
      0x00000404 => "\xb8",
      0x00000405 => "\xc1",
      0x00000406 => "\xa7",
      0x00000407 => "\xba",
      0x00000408 => "\xb7",
      0x00000409 => "\xbc",
      0x0000040a => "\xbe",
      0x0000040b => "\xcb",
      0x0000040c => "\xcd",
      0x0000040e => "\xd8",
      0x0000040f => "\xda",
      0x00000410 => "\x80",
      0x00000411 => "\x81",
      0x00000412 => "\x82",
      0x00000413 => "\x83",
      0x00000414 => "\x84",
      0x00000415 => "\x85",
      0x00000416 => "\x86",
      0x00000417 => "\x87",
      0x00000418 => "\x88",
      0x00000419 => "\x89",
      0x0000041a => "\x8a",
      0x0000041b => "\x8b",
      0x0000041c => "\x8c",
      0x0000041d => "\x8d",
      0x0000041e => "\x8e",
      0x0000041f => "\x8f",
      0x00000420 => "\x90",
      0x00000421 => "\x91",
      0x00000422 => "\x92",
      0x00000423 => "\x93",
      0x00000424 => "\x94",
      0x00000425 => "\x95",
      0x00000426 => "\x96",
      0x00000427 => "\x97",
      0x00000428 => "\x98",
      0x00000429 => "\x99",
      0x0000042a => "\x9a",
      0x0000042b => "\x9b",
      0x0000042c => "\x9c",
      0x0000042d => "\x9d",
      0x0000042e => "\x9e",
      0x0000042f => "\x9f",
      0x00000430 => "\xe0",
      0x00000431 => "\xe1",
      0x00000432 => "\xe2",
      0x00000433 => "\xe3",
      0x00000434 => "\xe4",
      0x00000435 => "\xe5",
      0x00000436 => "\xe6",
      0x00000437 => "\xe7",
      0x00000438 => "\xe8",
      0x00000439 => "\xe9",
      0x0000043a => "\xea",
      0x0000043b => "\xeb",
      0x0000043c => "\xec",
      0x0000043d => "\xed",
      0x0000043e => "\xee",
      0x0000043f => "\xef",
      0x00000440 => "\xf0",
      0x00000441 => "\xf1",
      0x00000442 => "\xf2",
      0x00000443 => "\xf3",
      0x00000444 => "\xf4",
      0x00000445 => "\xf5",
      0x00000446 => "\xf6",
      0x00000447 => "\xf7",
      0x00000448 => "\xf8",
      0x00000449 => "\xf9",
      0x0000044a => "\xfa",
      0x0000044b => "\xfb",
      0x0000044c => "\xfc",
      0x0000044d => "\xfd",
      0x0000044e => "\xfe",
      0x0000044f => "\xdf",
      0x00000451 => "\xde",
      0x00000452 => "\xac",
      0x00000453 => "\xaf",
      0x00000454 => "\xb9",
      0x00000455 => "\xcf",
      0x00000456 => "\xb4",
      0x00000457 => "\xbb",
      0x00000458 => "\xc0",
      0x00000459 => "\xbd",
      0x0000045a => "\xbf",
      0x0000045b => "\xcc",
      0x0000045c => "\xce",
      0x0000045e => "\xd9",
      0x0000045f => "\xdb",
      0x00000490 => "\xa2",
      0x00000491 => "\xb6",
      0x00002013 => "\xd0",
      0x00002014 => "\xd1",
      0x00002018 => "\xd4",
      0x00002019 => "\xd5",
      0x0000201c => "\xd2",
      0x0000201d => "\xd3",
      0x0000201e => "\xd7",
      0x00002020 => "\xa0",
      0x00002022 => "\xa5",
      0x00002026 => "\xc9",
      0x00002116 => "\xdc",
      0x00002122 => "\xaa",
      0x00002206 => "\xc6",
      0x0000221a => "\xc3",
      0x0000221e => "\xb0",
      0x00002248 => "\xc5",
      0x00002260 => "\xad",
      0x00002264 => "\xb2",
      0x00002265 => "\xb3",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::MACUKRAINE - Conversion routines for MACUKRAINE
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for MACUKRAINE.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
  
   This charmap has been generated automatically from GNU libiconv
   conversions.
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE (DEL)
      80 |  00000410 | CYRILLIC CAPITAL LETTER A
      81 |  00000411 | CYRILLIC CAPITAL LETTER BE
      82 |  00000412 | CYRILLIC CAPITAL LETTER VE
      83 |  00000413 | CYRILLIC CAPITAL LETTER GHE
      84 |  00000414 | CYRILLIC CAPITAL LETTER DE
      85 |  00000415 | CYRILLIC CAPITAL LETTER IE
      86 |  00000416 | CYRILLIC CAPITAL LETTER ZHE
      87 |  00000417 | CYRILLIC CAPITAL LETTER ZE
      88 |  00000418 | CYRILLIC CAPITAL LETTER I
      89 |  00000419 | CYRILLIC CAPITAL LETTER SHORT I
      8A |  0000041A | CYRILLIC CAPITAL LETTER KA
      8B |  0000041B | CYRILLIC CAPITAL LETTER EL
      8C |  0000041C | CYRILLIC CAPITAL LETTER EM
      8D |  0000041D | CYRILLIC CAPITAL LETTER EN
      8E |  0000041E | CYRILLIC CAPITAL LETTER O
      8F |  0000041F | CYRILLIC CAPITAL LETTER PE
      90 |  00000420 | CYRILLIC CAPITAL LETTER ER
      91 |  00000421 | CYRILLIC CAPITAL LETTER ES
      92 |  00000422 | CYRILLIC CAPITAL LETTER TE
      93 |  00000423 | CYRILLIC CAPITAL LETTER U
      94 |  00000424 | CYRILLIC CAPITAL LETTER EF
      95 |  00000425 | CYRILLIC CAPITAL LETTER HA
      96 |  00000426 | CYRILLIC CAPITAL LETTER TSE
      97 |  00000427 | CYRILLIC CAPITAL LETTER CHE
      98 |  00000428 | CYRILLIC CAPITAL LETTER SHA
      99 |  00000429 | CYRILLIC CAPITAL LETTER SHCHA
      9A |  0000042A | CYRILLIC CAPITAL LETTER HARD SIGN
      9B |  0000042B | CYRILLIC CAPITAL LETTER YERU
      9C |  0000042C | CYRILLIC CAPITAL LETTER SOFT SIGN
      9D |  0000042D | CYRILLIC CAPITAL LETTER E
      9E |  0000042E | CYRILLIC CAPITAL LETTER YU
      9F |  0000042F | CYRILLIC CAPITAL LETTER YA
      A0 |  00002020 | DAGGER
      A1 |  000000B0 | DEGREE SIGN
      A2 |  00000490 | CYRILLIC CAPITAL LETTER GHE WITH UPTURN
      A3 |  000000A3 | POUND SIGN
      A4 |  000000A7 | SECTION SIGN
      A5 |  00002022 | BULLET
      A6 |  000000B6 | PILCROW SIGN
      A7 |  00000406 | CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
      A8 |  000000AE | REGISTERED SIGN
      A9 |  000000A9 | COPYRIGHT SIGN
      AA |  00002122 | TRADE MARK SIGN
      AB |  00000402 | CYRILLIC CAPITAL LETTER DJE
      AC |  00000452 | CYRILLIC SMALL LETTER DJE
      AD |  00002260 | NOT EQUAL TO
      AE |  00000403 | CYRILLIC CAPITAL LETTER GJE
      AF |  00000453 | CYRILLIC SMALL LETTER GJE
      B0 |  0000221E | INFINITY
      B1 |  000000B1 | PLUS-MINUS SIGN
      B2 |  00002264 | LESS-THAN OR EQUAL TO
      B3 |  00002265 | GREATER-THAN OR EQUAL TO
      B4 |  00000456 | CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
      B5 |  000000B5 | MICRO SIGN
      B6 |  00000491 | CYRILLIC SMALL LETTER GHE WITH UPTURN
      B7 |  00000408 | CYRILLIC CAPITAL LETTER JE
      B8 |  00000404 | CYRILLIC CAPITAL LETTER UKRAINIAN IE
      B9 |  00000454 | CYRILLIC SMALL LETTER UKRAINIAN IE
      BA |  00000407 | CYRILLIC CAPITAL LETTER YI
      BB |  00000457 | CYRILLIC SMALL LETTER YI
      BC |  00000409 | CYRILLIC CAPITAL LETTER LJE
      BD |  00000459 | CYRILLIC SMALL LETTER LJE
      BE |  0000040A | CYRILLIC CAPITAL LETTER NJE
      BF |  0000045A | CYRILLIC SMALL LETTER NJE
      C0 |  00000458 | CYRILLIC SMALL LETTER JE
      C1 |  00000405 | CYRILLIC CAPITAL LETTER DZE
      C2 |  000000AC | NOT SIGN
      C3 |  0000221A | SQUARE ROOT
      C4 |  00000192 | LATIN SMALL LETTER F WITH HOOK
      C5 |  00002248 | ALMOST EQUAL TO
      C6 |  00002206 | INCREMENT
      C7 |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
      C8 |  000000BB | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
      C9 |  00002026 | HORIZONTAL ELLIPSIS
      CA |  000000A0 | NO-BREAK SPACE
      CB |  0000040B | CYRILLIC CAPITAL LETTER TSHE
      CC |  0000045B | CYRILLIC SMALL LETTER TSHE
      CD |  0000040C | CYRILLIC CAPITAL LETTER KJE
      CE |  0000045C | CYRILLIC SMALL LETTER KJE
      CF |  00000455 | CYRILLIC SMALL LETTER DZE
      D0 |  00002013 | EN DASH
      D1 |  00002014 | EM DASH
      D2 |  0000201C | LEFT DOUBLE QUOTATION MARK
      D3 |  0000201D | RIGHT DOUBLE QUOTATION MARK
      D4 |  00002018 | LEFT SINGLE QUOTATION MARK
      D5 |  00002019 | RIGHT SINGLE QUOTATION MARK
      D6 |  000000F7 | DIVISION SIGN
      D7 |  0000201E | DOUBLE LOW-9 QUOTATION MARK
      D8 |  0000040E | CYRILLIC CAPITAL LETTER SHORT U
      D9 |  0000045E | CYRILLIC SMALL LETTER SHORT U
      DA |  0000040F | CYRILLIC CAPITAL LETTER DZHE
      DB |  0000045F | CYRILLIC SMALL LETTER DZHE
      DC |  00002116 | NUMERO SIGN
      DD |  00000401 | CYRILLIC CAPITAL LETTER IO
      DE |  00000451 | CYRILLIC SMALL LETTER IO
      DF |  0000044F | CYRILLIC SMALL LETTER YA
      E0 |  00000430 | CYRILLIC SMALL LETTER A
      E1 |  00000431 | CYRILLIC SMALL LETTER BE
      E2 |  00000432 | CYRILLIC SMALL LETTER VE
      E3 |  00000433 | CYRILLIC SMALL LETTER GHE
      E4 |  00000434 | CYRILLIC SMALL LETTER DE
      E5 |  00000435 | CYRILLIC SMALL LETTER IE
      E6 |  00000436 | CYRILLIC SMALL LETTER ZHE
      E7 |  00000437 | CYRILLIC SMALL LETTER ZE
      E8 |  00000438 | CYRILLIC SMALL LETTER I
      E9 |  00000439 | CYRILLIC SMALL LETTER SHORT I
      EA |  0000043A | CYRILLIC SMALL LETTER KA
      EB |  0000043B | CYRILLIC SMALL LETTER EL
      EC |  0000043C | CYRILLIC SMALL LETTER EM
      ED |  0000043D | CYRILLIC SMALL LETTER EN
      EE |  0000043E | CYRILLIC SMALL LETTER O
      EF |  0000043F | CYRILLIC SMALL LETTER PE
      F0 |  00000440 | CYRILLIC SMALL LETTER ER
      F1 |  00000441 | CYRILLIC SMALL LETTER ES
      F2 |  00000442 | CYRILLIC SMALL LETTER TE
      F3 |  00000443 | CYRILLIC SMALL LETTER U
      F4 |  00000444 | CYRILLIC SMALL LETTER EF
      F5 |  00000445 | CYRILLIC SMALL LETTER HA
      F6 |  00000446 | CYRILLIC SMALL LETTER TSE
      F7 |  00000447 | CYRILLIC SMALL LETTER CHE
      F8 |  00000448 | CYRILLIC SMALL LETTER SHA
      F9 |  00000449 | CYRILLIC SMALL LETTER SHCHA
      FA |  0000044A | CYRILLIC SMALL LETTER HARD SIGN
      FB |  0000044B | CYRILLIC SMALL LETTER YERU
      FC |  0000044C | CYRILLIC SMALL LETTER SOFT SIGN
      FD |  0000044D | CYRILLIC SMALL LETTER E
      FE |  0000044E | CYRILLIC SMALL LETTER YU
      FF |  000000A4 | CURRENCY SIGN
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_MACUKRAINE

    $main::fatpacked{"Locale/RecodeData/MAC_IS.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_MAC_IS';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for MAC-IS.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::MAC_IS;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0x00c4,
      0x00c5,
      0x00c7,
      0x00c9,
      0x00d1,
      0x00d6,
      0x00dc,
      0x00e1,
      0x00e0,
      0x00e2,
      0x00e4,
      0x00e3,
      0x00e5,
      0x00e7,
      0x00e9,
      0x00e8,
      0x00ea,
      0x00eb,
      0x00ed,
      0x00ec,
      0x00ee,
      0x00ef,
      0x00f1,
      0x00f3,
      0x00f2,
      0x00f4,
      0x00f6,
      0x00f5,
      0x00fa,
      0x00f9,
      0x00fb,
      0x00fc,
      0x2020,
      0x00b0,
      0x00a2,
      0x00a3,
      0x00a7,
      0x2022,
      0x00b6,
      0x00df,
      0x00ae,
      0x00a9,
      0x2122,
      0x00b4,
      0x00a8,
      0x2260,
      0x00c6,
      0x00d8,
      0x221e,
      0x00b1,
      0x2264,
      0x2265,
      0x00a5,
      0x00b5,
      0x2202,
      0x2211,
      0x220f,
      0x03c0,
      0x222b,
      0x00aa,
      0x00ba,
      0x03a9,
      0x00e6,
      0x00f8,
      0x00bf,
      0x00a1,
      0x00ac,
      0x221a,
      0x0192,
      0x2248,
      0x0394,
      0x00ab,
      0x00bb,
      0x2026,
      0x00a0,
      0x00c0,
      0x00c3,
      0x00d5,
      0x0152,
      0x0153,
      0x2014,
      0x2013,
      0x201c,
      0x201d,
      0x2018,
      0x2019,
      0x00f7,
      0x25c6,
      0x00ff,
      0x0178,
      0x2044,
      0x00a4,
      0x0110,
      0x0111,
      0x00de,
      0x00fe,
      0x2021,
      0x00b7,
      0x201a,
      0x201e,
      0x2030,
      0x00c2,
      0x00ca,
      0x00c1,
      0x00cb,
      0x00c8,
      0x00cd,
      0x00ce,
      0x00cf,
      0x00cc,
      0x00d3,
      0x00d4,
      0xe01e,
      0x00d2,
      0x00da,
      0x00db,
      0x00d9,
      0x0131,
      0xfffd,
      0xfffd,
      0x00af,
      0x02d8,
      0x02d9,
      0x02da,
      0x00b8,
      0x02dd,
      0x02db,
      0x02c7,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xc3\x84",
      "\xc3\x85",
      "\xc3\x87",
      "\xc3\x89",
      "\xc3\x91",
      "\xc3\x96",
      "\xc3\x9c",
      "\xc3\xa1",
      "\xc3\xa0",
      "\xc3\xa2",
      "\xc3\xa4",
      "\xc3\xa3",
      "\xc3\xa5",
      "\xc3\xa7",
      "\xc3\xa9",
      "\xc3\xa8",
      "\xc3\xaa",
      "\xc3\xab",
      "\xc3\xad",
      "\xc3\xac",
      "\xc3\xae",
      "\xc3\xaf",
      "\xc3\xb1",
      "\xc3\xb3",
      "\xc3\xb2",
      "\xc3\xb4",
      "\xc3\xb6",
      "\xc3\xb5",
      "\xc3\xba",
      "\xc3\xb9",
      "\xc3\xbb",
      "\xc3\xbc",
      "\xe2\x80\xa0",
      "\xc2\xb0",
      "\xc2\xa2",
      "\xc2\xa3",
      "\xc2\xa7",
      "\xe2\x80\xa2",
      "\xc2\xb6",
      "\xc3\x9f",
      "\xc2\xae",
      "\xc2\xa9",
      "\xe2\x84\xa2",
      "\xc2\xb4",
      "\xc2\xa8",
      "\xe2\x89\xa0",
      "\xc3\x86",
      "\xc3\x98",
      "\xe2\x88\x9e",
      "\xc2\xb1",
      "\xe2\x89\xa4",
      "\xe2\x89\xa5",
      "\xc2\xa5",
      "\xc2\xb5",
      "\xe2\x88\x82",
      "\xe2\x88\x91",
      "\xe2\x88\x8f",
      "\xcf\x80",
      "\xe2\x88\xab",
      "\xc2\xaa",
      "\xc2\xba",
      "\xce\xa9",
      "\xc3\xa6",
      "\xc3\xb8",
      "\xc2\xbf",
      "\xc2\xa1",
      "\xc2\xac",
      "\xe2\x88\x9a",
      "\xc6\x92",
      "\xe2\x89\x88",
      "\xce\x94",
      "\xc2\xab",
      "\xc2\xbb",
      "\xe2\x80\xa6",
      "\xc2\xa0",
      "\xc3\x80",
      "\xc3\x83",
      "\xc3\x95",
      "\xc5\x92",
      "\xc5\x93",
      "\xe2\x80\x94",
      "\xe2\x80\x93",
      "\xe2\x80\x9c",
      "\xe2\x80\x9d",
      "\xe2\x80\x98",
      "\xe2\x80\x99",
      "\xc3\xb7",
      "\xe2\x97\x86",
      "\xc3\xbf",
      "\xc5\xb8",
      "\xe2\x81\x84",
      "\xc2\xa4",
      "\xc4\x90",
      "\xc4\x91",
      "\xc3\x9e",
      "\xc3\xbe",
      "\xe2\x80\xa1",
      "\xc2\xb7",
      "\xe2\x80\x9a",
      "\xe2\x80\x9e",
      "\xe2\x80\xb0",
      "\xc3\x82",
      "\xc3\x8a",
      "\xc3\x81",
      "\xc3\x8b",
      "\xc3\x88",
      "\xc3\x8d",
      "\xc3\x8e",
      "\xc3\x8f",
      "\xc3\x8c",
      "\xc3\x93",
      "\xc3\x94",
      "\xee\x80\x9e",
      "\xc3\x92",
      "\xc3\x9a",
      "\xc3\x9b",
      "\xc3\x99",
      "\xc4\xb1",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc2\xaf",
      "\xcb\x98",
      "\xcb\x99",
      "\xcb\x9a",
      "\xc2\xb8",
      "\xcb\x9d",
      "\xcb\x9b",
      "\xcb\x87",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x000000a0 => "\xca",
      0x000000a1 => "\xc1",
      0x000000a2 => "\xa2",
      0x000000a3 => "\xa3",
      0x000000a4 => "\xdb",
      0x000000a5 => "\xb4",
      0x000000a7 => "\xa4",
      0x000000a8 => "\xac",
      0x000000a9 => "\xa9",
      0x000000aa => "\xbb",
      0x000000ab => "\xc7",
      0x000000ac => "\xc2",
      0x000000ae => "\xa8",
      0x000000af => "\xf8",
      0x000000b0 => "\xa1",
      0x000000b1 => "\xb1",
      0x000000b4 => "\xab",
      0x000000b5 => "\xb5",
      0x000000b6 => "\xa6",
      0x000000b7 => "\xe1",
      0x000000b8 => "\xfc",
      0x000000ba => "\xbc",
      0x000000bb => "\xc8",
      0x000000bf => "\xc0",
      0x000000c0 => "\xcb",
      0x000000c1 => "\xe7",
      0x000000c2 => "\xe5",
      0x000000c3 => "\xcc",
      0x000000c4 => "\x80",
      0x000000c5 => "\x81",
      0x000000c6 => "\xae",
      0x000000c7 => "\x82",
      0x000000c8 => "\xe9",
      0x000000c9 => "\x83",
      0x000000ca => "\xe6",
      0x000000cb => "\xe8",
      0x000000cc => "\xed",
      0x000000cd => "\xea",
      0x000000ce => "\xeb",
      0x000000cf => "\xec",
      0x000000d1 => "\x84",
      0x000000d2 => "\xf1",
      0x000000d3 => "\xee",
      0x000000d4 => "\xef",
      0x000000d5 => "\xcd",
      0x000000d6 => "\x85",
      0x000000d8 => "\xaf",
      0x000000d9 => "\xf4",
      0x000000da => "\xf2",
      0x000000db => "\xf3",
      0x000000dc => "\x86",
      0x000000de => "\xde",
      0x000000df => "\xa7",
      0x000000e0 => "\x88",
      0x000000e1 => "\x87",
      0x000000e2 => "\x89",
      0x000000e3 => "\x8b",
      0x000000e4 => "\x8a",
      0x000000e5 => "\x8c",
      0x000000e6 => "\xbe",
      0x000000e7 => "\x8d",
      0x000000e8 => "\x8f",
      0x000000e9 => "\x8e",
      0x000000ea => "\x90",
      0x000000eb => "\x91",
      0x000000ec => "\x93",
      0x000000ed => "\x92",
      0x000000ee => "\x94",
      0x000000ef => "\x95",
      0x000000f1 => "\x96",
      0x000000f2 => "\x98",
      0x000000f3 => "\x97",
      0x000000f4 => "\x99",
      0x000000f5 => "\x9b",
      0x000000f6 => "\x9a",
      0x000000f7 => "\xd6",
      0x000000f8 => "\xbf",
      0x000000f9 => "\x9d",
      0x000000fa => "\x9c",
      0x000000fb => "\x9e",
      0x000000fc => "\x9f",
      0x000000fe => "\xdf",
      0x000000ff => "\xd8",
      0x00000110 => "\xdc",
      0x00000111 => "\xdd",
      0x00000131 => "\xf5",
      0x00000152 => "\xce",
      0x00000153 => "\xcf",
      0x00000178 => "\xd9",
      0x00000192 => "\xc4",
      0x000002c7 => "\xff",
      0x000002d8 => "\xf9",
      0x000002d9 => "\xfa",
      0x000002da => "\xfb",
      0x000002db => "\xfe",
      0x000002dd => "\xfd",
      0x00000394 => "\xc6",
      0x000003a9 => "\xbd",
      0x000003c0 => "\xb9",
      0x00002013 => "\xd1",
      0x00002014 => "\xd0",
      0x00002018 => "\xd4",
      0x00002019 => "\xd5",
      0x0000201a => "\xe2",
      0x0000201c => "\xd2",
      0x0000201d => "\xd3",
      0x0000201e => "\xe3",
      0x00002020 => "\xa0",
      0x00002021 => "\xe0",
      0x00002022 => "\xa5",
      0x00002026 => "\xc9",
      0x00002030 => "\xe4",
      0x00002044 => "\xda",
      0x00002122 => "\xaa",
      0x00002202 => "\xb6",
      0x0000220f => "\xb8",
      0x00002211 => "\xb7",
      0x0000221a => "\xc3",
      0x0000221e => "\xb0",
      0x0000222b => "\xba",
      0x00002248 => "\xc5",
      0x00002260 => "\xad",
      0x00002264 => "\xb2",
      0x00002265 => "\xb3",
      0x000025c6 => "\xd7",
      0x0000e01e => "\xf0",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::MAC_IS - Conversion routines for MAC-IS
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for MAC-IS.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE (DEL)
      80 |  000000C4 | LATIN CAPITAL LETTER A WITH DIAERESIS
      81 |  000000C5 | LATIN CAPITAL LETTER A WITH RING ABOVE
      82 |  000000C7 | LATIN CAPITAL LETTER C WITH CEDILLA
      83 |  000000C9 | LATIN CAPITAL LETTER E WITH ACUTE
      84 |  000000D1 | LATIN CAPITAL LETTER N WITH TILDE
      85 |  000000D6 | LATIN CAPITAL LETTER O WITH DIAERESIS
      86 |  000000DC | LATIN CAPITAL LETTER U WITH DIAERESIS
      87 |  000000E1 | LATIN SMALL LETTER A WITH ACUTE
      88 |  000000E0 | LATIN SMALL LETTER A WITH GRAVE
      89 |  000000E2 | LATIN SMALL LETTER A WITH CIRCUMFLEX
      8A |  000000E4 | LATIN SMALL LETTER A WITH DIAERESIS
      8B |  000000E3 | LATIN SMALL LETTER A WITH TILDE
      8C |  000000E5 | LATIN SMALL LETTER A WITH RING ABOVE
      8D |  000000E7 | LATIN SMALL LETTER C WITH CEDILLA
      8E |  000000E9 | LATIN SMALL LETTER E WITH ACUTE
      8F |  000000E8 | LATIN SMALL LETTER E WITH GRAVE
      90 |  000000EA | LATIN SMALL LETTER E WITH CIRCUMFLEX
      91 |  000000EB | LATIN SMALL LETTER E WITH DIAERESIS
      92 |  000000ED | LATIN SMALL LETTER I WITH ACUTE
      93 |  000000EC | LATIN SMALL LETTER I WITH GRAVE
      94 |  000000EE | LATIN SMALL LETTER I WITH CIRCUMFLEX
      95 |  000000EF | LATIN SMALL LETTER I WITH DIAERESIS
      96 |  000000F1 | LATIN SMALL LETTER N WITH TILDE
      97 |  000000F3 | LATIN SMALL LETTER O WITH ACUTE
      98 |  000000F2 | LATIN SMALL LETTER O WITH GRAVE
      99 |  000000F4 | LATIN SMALL LETTER O WITH CIRCUMFLEX
      9A |  000000F6 | LATIN SMALL LETTER O WITH DIAERESIS
      9B |  000000F5 | LATIN SMALL LETTER O WITH TILDE
      9C |  000000FA | LATIN SMALL LETTER U WITH ACUTE
      9D |  000000F9 | LATIN SMALL LETTER U WITH GRAVE
      9E |  000000FB | LATIN SMALL LETTER U WITH CIRCUMFLEX
      9F |  000000FC | LATIN SMALL LETTER U WITH DIAERESIS
      A0 |  00002020 | DAGGER
      A1 |  000000B0 | DEGREE SIGN
      A2 |  000000A2 | CENT SIGN
      A3 |  000000A3 | POUND SIGN
      A4 |  000000A7 | SECTION SIGN
      A5 |  00002022 | BULLET
      A6 |  000000B6 | PILCROW SIGN
      A7 |  000000DF | LATIN SMALL LETTER SHARP S (German)
      A8 |  000000AE | REGISTERED SIGN
      A9 |  000000A9 | COPYRIGHT SIGN
      AA |  00002122 | TRADE MARK SIGN
      AB |  000000B4 | ACUTE ACCENT
      AC |  000000A8 | DIAERESIS
      AD |  00002260 | NOT EQUAL TO
      AE |  000000C6 | LATIN CAPITAL LETTER AE
      AF |  000000D8 | LATIN CAPITAL LETTER O WITH STROKE
      B0 |  0000221E | INFINITY
      B1 |  000000B1 | PLUS-MINUS SIGN
      B2 |  00002264 | LESS-THAN OR EQUAL TO
      B3 |  00002265 | GREATER-THAN OR EQUAL TO
      B4 |  000000A5 | YEN SIGN
      B5 |  000000B5 | MICRO SIGN
      B6 |  00002202 | PARTIAL DIFFERENTIAL
      B7 |  00002211 | N-ARY SUMMATION
      B8 |  0000220F | N-ARY PRODUCT
      B9 |  000003C0 | GREEK SMALL LETTER PI
      BA |  0000222B | INTEGRAL
      BB |  000000AA | FEMININE ORDINAL INDICATOR
      BC |  000000BA | MASCULINE ORDINAL INDICATOR
      BD |  000003A9 | GREEK CAPITAL LETTER OMEGA
      BE |  000000E6 | LATIN SMALL LETTER AE
      BF |  000000F8 | LATIN SMALL LETTER O WITH STROKE
      C0 |  000000BF | INVERTED QUESTION MARK
      C1 |  000000A1 | INVERTED EXCLAMATION MARK
      C2 |  000000AC | NOT SIGN
      C3 |  0000221A | SQUARE ROOT
      C4 |  00000192 | LATIN SMALL LETTER F WITH HOOK
      C5 |  00002248 | ALMOST EQUAL TO
      C6 |  00000394 | GREEK CAPITAL LETTER DELTA
      C7 |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
      C8 |  000000BB | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
      C9 |  00002026 | HORIZONTAL ELLIPSIS
      CA |  000000A0 | NO-BREAK SPACE
      CB |  000000C0 | LATIN CAPITAL LETTER A WITH GRAVE
      CC |  000000C3 | LATIN CAPITAL LETTER A WITH TILDE
      CD |  000000D5 | LATIN CAPITAL LETTER O WITH TILDE
      CE |  00000152 | LATIN CAPITAL LIGATURE OE
      CF |  00000153 | LATIN SMALL LIGATURE OE
      D0 |  00002014 | EM DASH
      D1 |  00002013 | EN DASH
      D2 |  0000201C | LEFT DOUBLE QUOTATION MARK
      D3 |  0000201D | RIGHT DOUBLE QUOTATION MARK
      D4 |  00002018 | LEFT SINGLE QUOTATION MARK
      D5 |  00002019 | RIGHT SINGLE QUOTATION MARK
      D6 |  000000F7 | DIVISION SIGN
      D7 |  000025C6 | BLACK DIAMOND
      D8 |  000000FF | LATIN SMALL LETTER Y WITH DIAERESIS
      D9 |  00000178 | LATIN CAPITAL LETTER Y WITH DIAERESIS
      DA |  00002044 | FRACTION SLASH
      DB |  000000A4 | CURRENCY SIGN
      DC |  00000110 | LATIN CAPITAL LETTER D WITH STROKE
      DD |  00000111 | LATIN SMALL LETTER D WITH STROKE
      DE |  000000DE | LATIN CAPITAL LETTER THORN (Icelandic)
      DF |  000000FE | LATIN SMALL LETTER THORN (Icelandic)
      E0 |  00002021 | DOUBLE DAGGER
      E1 |  000000B7 | MIDDLE DOT
      E2 |  0000201A | SINGLE LOW-9 QUOTATION MARK
      E3 |  0000201E | DOUBLE LOW-9 QUOTATION MARK
      E4 |  00002030 | PER MILLE SIGN
      E5 |  000000C2 | LATIN CAPITAL LETTER A WITH CIRCUMFLEX
      E6 |  000000CA | LATIN CAPITAL LETTER E WITH CIRCUMFLEX
      E7 |  000000C1 | LATIN CAPITAL LETTER A WITH ACUTE
      E8 |  000000CB | LATIN CAPITAL LETTER E WITH DIAERESIS
      E9 |  000000C8 | LATIN CAPITAL LETTER E WITH GRAVE
      EA |  000000CD | LATIN CAPITAL LETTER I WITH ACUTE
      EB |  000000CE | LATIN CAPITAL LETTER I WITH CIRCUMFLEX
      EC |  000000CF | LATIN CAPITAL LETTER I WITH DIAERESIS
      ED |  000000CC | LATIN CAPITAL LETTER I WITH GRAVE
      EE |  000000D3 | LATIN CAPITAL LETTER O WITH ACUTE
      EF |  000000D4 | LATIN CAPITAL LETTER O WITH CIRCUMFLEX
      F0 |  0000E01E | APPLE LOGO (Macintosh_F0)
      F1 |  000000D2 | LATIN CAPITAL LETTER O WITH GRAVE
      F2 |  000000DA | LATIN CAPITAL LETTER U WITH ACUTE
      F3 |  000000DB | LATIN CAPITAL LETTER U WITH CIRCUMFLEX
      F4 |  000000D9 | LATIN CAPITAL LETTER U WITH GRAVE
      F5 |  00000131 | LATIN SMALL LETTER DOTLESS I
      F8 |  000000AF | MACRON
      F9 |  000002D8 | BREVE
      FA |  000002D9 | DOT ABOVE (Mandarin Chinese light tone)
      FB |  000002DA | RING ABOVE
      FC |  000000B8 | CEDILLA
      FD |  000002DD | DOUBLE ACUTE ACCENT
      FE |  000002DB | OGONEK
      FF |  000002C7 | CARON (Mandarin Chinese third tone)
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_MAC_IS

    $main::fatpacked{"Locale/RecodeData/MAC_SAMI.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_MAC_SAMI';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for MAC-SAMI.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::MAC_SAMI;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0x00c4,
      0x00c5,
      0x00c7,
      0x00c9,
      0x00d1,
      0x00d6,
      0x00dc,
      0x00e1,
      0x00e0,
      0x00e2,
      0x00e4,
      0x00e3,
      0x00e5,
      0x00e7,
      0x00e9,
      0x00e8,
      0x00ea,
      0x00eb,
      0x00ed,
      0x00ec,
      0x00ee,
      0x00ef,
      0x00f1,
      0x00f3,
      0x00f2,
      0x00f4,
      0x00f6,
      0x00f5,
      0x00fa,
      0x00f9,
      0x00fb,
      0x00fc,
      0x00dd,
      0x00b0,
      0x010c,
      0x00a3,
      0x00a7,
      0x2022,
      0x00b6,
      0x00df,
      0x00ae,
      0x00a9,
      0x2122,
      0x00b4,
      0x00a8,
      0x2260,
      0x00c6,
      0x00d8,
      0x0110,
      0x014a,
      0x821e,
      0x821f,
      0x0160,
      0x0166,
      0x2202,
      0x017d,
      0x010d,
      0x0111,
      0x014b,
      0x0161,
      0x0167,
      0x017e,
      0x00e6,
      0x00f8,
      0x00bf,
      0x00a1,
      0x00ac,
      0x221a,
      0x0192,
      0x2248,
      0x2206,
      0x00ab,
      0x00bb,
      0x2026,
      0x00a0,
      0x00c0,
      0x00c3,
      0x00d5,
      0x0152,
      0x0153,
      0x2013,
      0x2014,
      0x201c,
      0x201d,
      0x2018,
      0x2019,
      0x00f7,
      0x25ca,
      0x00ff,
      0x0178,
      0x2044,
      0x00a4,
      0x00d0,
      0x00f0,
      0x00de,
      0x00fe,
      0x00fd,
      0x00b7,
      0x201a,
      0x201e,
      0x2030,
      0x00c2,
      0x00ca,
      0x00c1,
      0x00cb,
      0x00c8,
      0x00cd,
      0x00ce,
      0x00cf,
      0x00cc,
      0x00d3,
      0x00d4,
      0xf8ff,
      0x00d2,
      0x00da,
      0x00db,
      0x00d9,
      0x0131,
      0x01b7,
      0x0292,
      0x01ee,
      0x01ef,
      0x01e4,
      0x01e5,
      0x01e6,
      0x01e7,
      0x01e8,
      0x01e9,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xc3\x84",
      "\xc3\x85",
      "\xc3\x87",
      "\xc3\x89",
      "\xc3\x91",
      "\xc3\x96",
      "\xc3\x9c",
      "\xc3\xa1",
      "\xc3\xa0",
      "\xc3\xa2",
      "\xc3\xa4",
      "\xc3\xa3",
      "\xc3\xa5",
      "\xc3\xa7",
      "\xc3\xa9",
      "\xc3\xa8",
      "\xc3\xaa",
      "\xc3\xab",
      "\xc3\xad",
      "\xc3\xac",
      "\xc3\xae",
      "\xc3\xaf",
      "\xc3\xb1",
      "\xc3\xb3",
      "\xc3\xb2",
      "\xc3\xb4",
      "\xc3\xb6",
      "\xc3\xb5",
      "\xc3\xba",
      "\xc3\xb9",
      "\xc3\xbb",
      "\xc3\xbc",
      "\xc3\x9d",
      "\xc2\xb0",
      "\xc4\x8c",
      "\xc2\xa3",
      "\xc2\xa7",
      "\xe2\x80\xa2",
      "\xc2\xb6",
      "\xc3\x9f",
      "\xc2\xae",
      "\xc2\xa9",
      "\xe2\x84\xa2",
      "\xc2\xb4",
      "\xc2\xa8",
      "\xe2\x89\xa0",
      "\xc3\x86",
      "\xc3\x98",
      "\xc4\x90",
      "\xc5\x8a",
      "\xe8\x88\x9e",
      "\xe8\x88\x9f",
      "\xc5\xa0",
      "\xc5\xa6",
      "\xe2\x88\x82",
      "\xc5\xbd",
      "\xc4\x8d",
      "\xc4\x91",
      "\xc5\x8b",
      "\xc5\xa1",
      "\xc5\xa7",
      "\xc5\xbe",
      "\xc3\xa6",
      "\xc3\xb8",
      "\xc2\xbf",
      "\xc2\xa1",
      "\xc2\xac",
      "\xe2\x88\x9a",
      "\xc6\x92",
      "\xe2\x89\x88",
      "\xe2\x88\x86",
      "\xc2\xab",
      "\xc2\xbb",
      "\xe2\x80\xa6",
      "\xc2\xa0",
      "\xc3\x80",
      "\xc3\x83",
      "\xc3\x95",
      "\xc5\x92",
      "\xc5\x93",
      "\xe2\x80\x93",
      "\xe2\x80\x94",
      "\xe2\x80\x9c",
      "\xe2\x80\x9d",
      "\xe2\x80\x98",
      "\xe2\x80\x99",
      "\xc3\xb7",
      "\xe2\x97\x8a",
      "\xc3\xbf",
      "\xc5\xb8",
      "\xe2\x81\x84",
      "\xc2\xa4",
      "\xc3\x90",
      "\xc3\xb0",
      "\xc3\x9e",
      "\xc3\xbe",
      "\xc3\xbd",
      "\xc2\xb7",
      "\xe2\x80\x9a",
      "\xe2\x80\x9e",
      "\xe2\x80\xb0",
      "\xc3\x82",
      "\xc3\x8a",
      "\xc3\x81",
      "\xc3\x8b",
      "\xc3\x88",
      "\xc3\x8d",
      "\xc3\x8e",
      "\xc3\x8f",
      "\xc3\x8c",
      "\xc3\x93",
      "\xc3\x94",
      "\xef\xa3\xbf",
      "\xc3\x92",
      "\xc3\x9a",
      "\xc3\x9b",
      "\xc3\x99",
      "\xc4\xb1",
      "\xc6\xb7",
      "\xca\x92",
      "\xc7\xae",
      "\xc7\xaf",
      "\xc7\xa4",
      "\xc7\xa5",
      "\xc7\xa6",
      "\xc7\xa7",
      "\xc7\xa8",
      "\xc7\xa9",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x000000a0 => "\xca",
      0x000000a1 => "\xc1",
      0x000000a3 => "\xa3",
      0x000000a4 => "\xdb",
      0x000000a7 => "\xa4",
      0x000000a8 => "\xac",
      0x000000a9 => "\xa9",
      0x000000ab => "\xc7",
      0x000000ac => "\xc2",
      0x000000ae => "\xa8",
      0x000000b0 => "\xa1",
      0x000000b4 => "\xab",
      0x000000b6 => "\xa6",
      0x000000b7 => "\xe1",
      0x000000bb => "\xc8",
      0x000000bf => "\xc0",
      0x000000c0 => "\xcb",
      0x000000c1 => "\xe7",
      0x000000c2 => "\xe5",
      0x000000c3 => "\xcc",
      0x000000c4 => "\x80",
      0x000000c5 => "\x81",
      0x000000c6 => "\xae",
      0x000000c7 => "\x82",
      0x000000c8 => "\xe9",
      0x000000c9 => "\x83",
      0x000000ca => "\xe6",
      0x000000cb => "\xe8",
      0x000000cc => "\xed",
      0x000000cd => "\xea",
      0x000000ce => "\xeb",
      0x000000cf => "\xec",
      0x000000d0 => "\xdc",
      0x000000d1 => "\x84",
      0x000000d2 => "\xf1",
      0x000000d3 => "\xee",
      0x000000d4 => "\xef",
      0x000000d5 => "\xcd",
      0x000000d6 => "\x85",
      0x000000d8 => "\xaf",
      0x000000d9 => "\xf4",
      0x000000da => "\xf2",
      0x000000db => "\xf3",
      0x000000dc => "\x86",
      0x000000dd => "\xa0",
      0x000000de => "\xde",
      0x000000df => "\xa7",
      0x000000e0 => "\x88",
      0x000000e1 => "\x87",
      0x000000e2 => "\x89",
      0x000000e3 => "\x8b",
      0x000000e4 => "\x8a",
      0x000000e5 => "\x8c",
      0x000000e6 => "\xbe",
      0x000000e7 => "\x8d",
      0x000000e8 => "\x8f",
      0x000000e9 => "\x8e",
      0x000000ea => "\x90",
      0x000000eb => "\x91",
      0x000000ec => "\x93",
      0x000000ed => "\x92",
      0x000000ee => "\x94",
      0x000000ef => "\x95",
      0x000000f0 => "\xdd",
      0x000000f1 => "\x96",
      0x000000f2 => "\x98",
      0x000000f3 => "\x97",
      0x000000f4 => "\x99",
      0x000000f5 => "\x9b",
      0x000000f6 => "\x9a",
      0x000000f7 => "\xd6",
      0x000000f8 => "\xbf",
      0x000000f9 => "\x9d",
      0x000000fa => "\x9c",
      0x000000fb => "\x9e",
      0x000000fc => "\x9f",
      0x000000fd => "\xe0",
      0x000000fe => "\xdf",
      0x000000ff => "\xd8",
      0x0000010c => "\xa2",
      0x0000010d => "\xb8",
      0x00000110 => "\xb0",
      0x00000111 => "\xb9",
      0x00000131 => "\xf5",
      0x0000014a => "\xb1",
      0x0000014b => "\xba",
      0x00000152 => "\xce",
      0x00000153 => "\xcf",
      0x00000160 => "\xb4",
      0x00000161 => "\xbb",
      0x00000166 => "\xb5",
      0x00000167 => "\xbc",
      0x00000178 => "\xd9",
      0x0000017d => "\xb7",
      0x0000017e => "\xbd",
      0x00000192 => "\xc4",
      0x000001b7 => "\xf6",
      0x000001e4 => "\xfa",
      0x000001e5 => "\xfb",
      0x000001e6 => "\xfc",
      0x000001e7 => "\xfd",
      0x000001e8 => "\xfe",
      0x000001e9 => "\xff",
      0x000001ee => "\xf8",
      0x000001ef => "\xf9",
      0x00000292 => "\xf7",
      0x00002013 => "\xd0",
      0x00002014 => "\xd1",
      0x00002018 => "\xd4",
      0x00002019 => "\xd5",
      0x0000201a => "\xe2",
      0x0000201c => "\xd2",
      0x0000201d => "\xd3",
      0x0000201e => "\xe3",
      0x00002022 => "\xa5",
      0x00002026 => "\xc9",
      0x00002030 => "\xe4",
      0x00002044 => "\xda",
      0x00002122 => "\xaa",
      0x00002202 => "\xb6",
      0x00002206 => "\xc6",
      0x0000221a => "\xc3",
      0x00002248 => "\xc5",
      0x00002260 => "\xad",
      0x000025ca => "\xd7",
      0x0000821e => "\xb2",
      0x0000821f => "\xb3",
      0x0000f8ff => "\xf0",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::MAC_SAMI - Conversion routines for MAC-SAMI
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for MAC-SAMI.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   source:  http://www.indigo.ie/egt/standards/se/mac-sami.html
   author:  Regnor Jernsletten E<lt>Regnor.Jernsletten@sami.uit.noE<gt>
   date:    2001-07-31
   comment: Macintosh sami standard.
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL
      01 |  00000001 | START OF HEADING
      02 |  00000002 | START OF TEXT
      03 |  00000003 | END OF TEXT
      04 |  00000004 | END OF TRANSMISSION
      05 |  00000005 | ENQUIRY
      06 |  00000006 | ACKNOWLEDGE
      07 |  00000007 | BELL
      08 |  00000008 | BACKSPACE
      09 |  00000009 | HORIZONTAL TABULATION
      0A |  0000000A | LINE FEED
      0B |  0000000B | VERTICAL TABULATION
      0C |  0000000C | FORM FEED
      0D |  0000000D | CARRIAGE RETURN
      0E |  0000000E | SHIFT OUT
      0F |  0000000F | SHIFT IN
      10 |  00000010 | DATA LINK ESCAPE
      11 |  00000011 | DEVICE CONTROL ONE
      12 |  00000012 | DEVICE CONTROL TWO
      13 |  00000013 | DEVICE CONTROL THREE
      14 |  00000014 | DEVICE CONTROL FOUR
      15 |  00000015 | NEGATIVE ACKNOWLEDGE
      16 |  00000016 | SYNCHRONOUS IDLE
      17 |  00000017 | END OF TRANSMISSION BLOCK
      18 |  00000018 | CANCEL
      19 |  00000019 | END OF MEDIUM
      1A |  0000001A | SUBSTITUTE
      1B |  0000001B | ESCAPE
      1C |  0000001C | FILE SEPARATOR
      1D |  0000001D | GROUP SEPARATOR
      1E |  0000001E | RECORD SEPARATOR
      1F |  0000001F | UNIT SEPARATOR
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE
      80 |  000000C4 | LATIN CAPITAL LETTER A WITH DIAERESIS
      81 |  000000C5 | LATIN CAPITAL LETTER A WITH RING ABOVE
      82 |  000000C7 | LATIN CAPITAL LETTER C WITH CEDILLA
      83 |  000000C9 | LATIN CAPITAL LETTER E WITH ACUTE
      84 |  000000D1 | LATIN CAPITAL LETTER N WITH TILDE
      85 |  000000D6 | LATIN CAPITAL LETTER O WITH DIAERESIS
      86 |  000000DC | LATIN CAPITAL LETTER U WITH DIAERESIS
      87 |  000000E1 | LATIN SMALL LETTER A WITH ACUTE
      88 |  000000E0 | LATIN SMALL LETTER A WITH GRAVE
      89 |  000000E2 | LATIN SMALL LETTER A WITH CIRCUMFLEX
      8A |  000000E4 | LATIN SMALL LETTER A WITH DIAERESIS
      8B |  000000E3 | LATIN SMALL LETTER A WITH TILDE
      8C |  000000E5 | LATIN SMALL LETTER A WITH RING ABOVE
      8D |  000000E7 | LATIN SMALL LETTER C WITH CEDILLA
      8E |  000000E9 | LATIN SMALL LETTER E WITH ACUTE
      8F |  000000E8 | LATIN SMALL LETTER E WITH GRAVE
      90 |  000000EA | LATIN SMALL LETTER E WITH CIRCUMFLEX
      91 |  000000EB | LATIN SMALL LETTER E WITH DIAERESIS
      92 |  000000ED | LATIN SMALL LETTER I WITH ACUTE
      93 |  000000EC | LATIN SMALL LETTER I WITH GRAVE
      94 |  000000EE | LATIN SMALL LETTER I WITH CIRCUMFLEX
      95 |  000000EF | LATIN SMALL LETTER I WITH DIAERESIS
      96 |  000000F1 | LATIN SMALL LETTER N WITH TILDE
      97 |  000000F3 | LATIN SMALL LETTER O WITH ACUTE
      98 |  000000F2 | LATIN SMALL LETTER O WITH GRAVE
      99 |  000000F4 | LATIN SMALL LETTER O WITH CIRCUMFLEX
      9A |  000000F6 | LATIN SMALL LETTER O WITH DIAERESIS
      9B |  000000F5 | LATIN SMALL LETTER O WITH TILDE
      9C |  000000FA | LATIN SMALL LETTER U WITH ACUTE
      9D |  000000F9 | LATIN SMALL LETTER U WITH GRAVE
      9E |  000000FB | LATIN SMALL LETTER U WITH CIRCUMFLEX
      9F |  000000FC | LATIN SMALL LETTER U WITH DIAERESIS
      A0 |  000000DD | LATIN CAPITAL LETTER Y WITH ACUTE
      A1 |  000000B0 | DEGREE SIGN
      A2 |  0000010C | LATIN CAPITAL LETTER C WITH CARON
      A3 |  000000A3 | POUND SIGN
      A4 |  000000A7 | SECTION SIGN
      A5 |  00002022 | BULLET
      A6 |  000000B6 | PILCROW SIGN
      A7 |  000000DF | LATIN SMALL LETTER SHARP S (German)
      A8 |  000000AE | REGISTERED SIGN
      A9 |  000000A9 | COPYRIGHT SIGN
      AA |  00002122 | TRADE MARK SIGN
      AB |  000000B4 | ACUTE ACCENT
      AC |  000000A8 | DIAERESIS
      AD |  00002260 | NOT EQUAL TO
      AE |  000000C6 | LATIN CAPITAL LETTER AE
      AF |  000000D8 | LATIN CAPITAL LETTER O WITH STROKE
      B0 |  00000110 | LATIN CAPITAL LETTER D WITH STROKE
      B1 |  0000014A | LATIN CAPITAL LETTER ENG
      B2 |  0000821E | LATIN CAPITAL LETTER H WITH CARON
      B3 |  0000821F | LATIN SMALL LETTER H WITH CARON
      B4 |  00000160 | LATIN CAPITAL LETTER S WITH CARON
      B5 |  00000166 | LATIN CAPITAL LETTER T WITH STROKE
      B6 |  00002202 | PARTIAL DIFFERENTIAL
      B7 |  0000017D | LATIN CAPITAL LETTER Z WITH CARON
      B8 |  0000010D | LATIN SMALL LETTER C WITH CARON
      B9 |  00000111 | LATIN SMALL LETTER D WITH STROKE
      BA |  0000014B | LATIN SMALL LETTER ENG
      BB |  00000161 | LATIN SMALL LETTER S WITH CARON
      BC |  00000167 | LATIN SMALL LETTER T WITH STROKE
      BD |  0000017E | LATIN SMALL LETTER Z WITH CARON
      BE |  000000E6 | LATIN SMALL LETTER AE
      BF |  000000F8 | LATIN SMALL LETTER O WITH STROKE
      C0 |  000000BF | INVERTED QUESTION MARK
      C1 |  000000A1 | INVERTED EXCLAMATION MARK
      C2 |  000000AC | NOT SIGN
      C3 |  0000221A | SQUARE ROOT
      C4 |  00000192 | LATIN SMALL LETTER F WITH HOOK
      C5 |  00002248 | ALMOST EQUAL TO
      C6 |  00002206 | INCREMENT
      C7 |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
      C8 |  000000BB | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
      C9 |  00002026 | HORIZONTAL ELLIPSIS
      CA |  000000A0 | NO-BREAK SPACE
      CB |  000000C0 | LATIN CAPITAL LETTER A WITH GRAVE
      CC |  000000C3 | LATIN CAPITAL LETTER A WITH TILDE
      CD |  000000D5 | LATIN CAPITAL LETTER O WITH TILDE
      CE |  00000152 | LATIN CAPITAL LETTER LIGATURE OE
      CF |  00000153 | LATIN SMALL LETTER LIGATURE OE
      D0 |  00002013 | EN DASH
      D1 |  00002014 | EM DASH
      D2 |  0000201C | LEFT DOUBLE QUOTATION MARK
      D3 |  0000201D | RIGHT DOUBLE QUOTATION MARK
      D4 |  00002018 | LEFT SINGLE QUOTATION MARK
      D5 |  00002019 | RIGHT SINGLE QUOTATION MARK
      D6 |  000000F7 | DIVISION SIGN
      D7 |  000025CA | LOZENGE
      D8 |  000000FF | LATIN SMALL LETTER Y WITH DIAERESIS
      D9 |  00000178 | LATIN CAPITAL LETTER Y WITH DIAERESIS
      DA |  00002044 | FRACTION SLASH
      DB |  000000A4 | CURRENCY SIGN
      DC |  000000D0 | LATIN CAPITAL LETTER ETH
      DD |  000000F0 | LATIN SMALL LETTER ETH
      DE |  000000DE | LATIN CAPITAL LETTER THORN
      DF |  000000FE | LATIN SMALL LETTER THORN
      E0 |  000000FD | LATIN SMALL LETTER Y WITH ACUTE
      E1 |  000000B7 | MIDDLE DOT
      E2 |  0000201A | SINGLE LOW-9 QUOTATION MARK
      E3 |  0000201E | DOUBLE LOW-9 QUOTATION MARK
      E4 |  00002030 | PER MILLE SIGN
      E5 |  000000C2 | LATIN CAPITAL LETTER A WITH CIRCUMFLEX
      E6 |  000000CA | LATIN CAPITAL LETTER E WITH CIRCUMFLEX
      E7 |  000000C1 | LATIN CAPITAL LETTER A WITH ACUTE
      E8 |  000000CB | LATIN CAPITAL LETTER E WITH DIAERESIS
      E9 |  000000C8 | LATIN CAPITAL LETTER E WITH GRAVE
      EA |  000000CD | LATIN CAPITAL LETTER I WITH ACUTE
      EB |  000000CE | LATIN CAPITAL LETTER I WITH CIRCUMFLEX
      EC |  000000CF | LATIN CAPITAL LETTER I WITH DIAERESIS
      ED |  000000CC | LATIN CAPITAL LETTER I WITH GRAVE
      EE |  000000D3 | LATIN CAPITAL LETTER O WITH ACUTE
      EF |  000000D4 | LATIN CAPITAL LETTER O WITH CIRCUMFLEX
      F0 |  0000F8FF | APPLE SIGN
      F1 |  000000D2 | LATIN CAPITAL LETTER O WITH GRAVE
      F2 |  000000DA | LATIN CAPITAL LETTER U WITH ACUTE
      F3 |  000000DB | LATIN CAPITAL LETTER U WITH CIRCUMFLEX
      F4 |  000000D9 | LATIN CAPITAL LETTER U WITH GRAVE
      F5 |  00000131 | LATIN SMALL LETTER DOTLESS I
      F6 |  000001B7 | LATIN CAPITAL LETTER EZH
      F7 |  00000292 | LATIN SMALL LETTER EZH
      F8 |  000001EE | LATIN CAPITAL LETTER EZH WITH CARON
      F9 |  000001EF | LATIN SMALL LETTER EZH WITH CARON
      FA |  000001E4 | LATIN CAPITAL LETTER G WITH STROKE
      FB |  000001E5 | LATIN SMALLL LETTER G WITH STROKE
      FC |  000001E6 | LATIN CAPITAL LETTER G WITH CARON
      FD |  000001E7 | LATIN SMALL LETTER G WITH CARON
      FE |  000001E8 | LATIN CAPITAL LETTER K WITH CARON
      FF |  000001E9 | LATIN SMALL LETTER K WITH CARON
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_MAC_SAMI

    $main::fatpacked{"Locale/RecodeData/MAC_UK.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_MAC_UK';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for MAC-UK.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::MAC_UK;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0x0410,
      0x0411,
      0x0412,
      0x0413,
      0x0414,
      0x0415,
      0x0416,
      0x0417,
      0x0418,
      0x0419,
      0x041a,
      0x041b,
      0x041c,
      0x041d,
      0x041e,
      0x041f,
      0x0420,
      0x0421,
      0x0422,
      0x0423,
      0x0424,
      0x0425,
      0x0426,
      0x0427,
      0x0428,
      0x0429,
      0x042a,
      0x042b,
      0x042c,
      0x042d,
      0x042e,
      0x042f,
      0x2020,
      0x00b0,
      0x0490,
      0x00a3,
      0x00a7,
      0x2022,
      0x00b6,
      0x0406,
      0x00ae,
      0x00a9,
      0x2122,
      0x0402,
      0x0452,
      0x2260,
      0x0403,
      0x0453,
      0x221e,
      0x00b1,
      0x2264,
      0x2265,
      0x0456,
      0x00b5,
      0x0491,
      0x0408,
      0x0404,
      0x0454,
      0x0407,
      0x0457,
      0x0409,
      0x0459,
      0x040a,
      0x045a,
      0x0458,
      0x0405,
      0x00ac,
      0x221a,
      0x0192,
      0x2248,
      0x2206,
      0x00ab,
      0x00bb,
      0x2026,
      0x00a0,
      0x040b,
      0x045b,
      0x040c,
      0x045c,
      0x0455,
      0x2013,
      0x2014,
      0x201c,
      0x201d,
      0x2018,
      0x2019,
      0x00f7,
      0x201e,
      0x040e,
      0x045e,
      0x040f,
      0x045f,
      0x2116,
      0x0401,
      0x0451,
      0x044f,
      0x0430,
      0x0431,
      0x0432,
      0x0433,
      0x0434,
      0x0435,
      0x0436,
      0x0437,
      0x0438,
      0x0439,
      0x043a,
      0x043b,
      0x043c,
      0x043d,
      0x043e,
      0x043f,
      0x0440,
      0x0441,
      0x0442,
      0x0443,
      0x0444,
      0x0445,
      0x0446,
      0x0447,
      0x0448,
      0x0449,
      0x044a,
      0x044b,
      0x044c,
      0x044d,
      0x044e,
      0x00a4,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xd0\x90",
      "\xd0\x91",
      "\xd0\x92",
      "\xd0\x93",
      "\xd0\x94",
      "\xd0\x95",
      "\xd0\x96",
      "\xd0\x97",
      "\xd0\x98",
      "\xd0\x99",
      "\xd0\x9a",
      "\xd0\x9b",
      "\xd0\x9c",
      "\xd0\x9d",
      "\xd0\x9e",
      "\xd0\x9f",
      "\xd0\xa0",
      "\xd0\xa1",
      "\xd0\xa2",
      "\xd0\xa3",
      "\xd0\xa4",
      "\xd0\xa5",
      "\xd0\xa6",
      "\xd0\xa7",
      "\xd0\xa8",
      "\xd0\xa9",
      "\xd0\xaa",
      "\xd0\xab",
      "\xd0\xac",
      "\xd0\xad",
      "\xd0\xae",
      "\xd0\xaf",
      "\xe2\x80\xa0",
      "\xc2\xb0",
      "\xd2\x90",
      "\xc2\xa3",
      "\xc2\xa7",
      "\xe2\x80\xa2",
      "\xc2\xb6",
      "\xd0\x86",
      "\xc2\xae",
      "\xc2\xa9",
      "\xe2\x84\xa2",
      "\xd0\x82",
      "\xd1\x92",
      "\xe2\x89\xa0",
      "\xd0\x83",
      "\xd1\x93",
      "\xe2\x88\x9e",
      "\xc2\xb1",
      "\xe2\x89\xa4",
      "\xe2\x89\xa5",
      "\xd1\x96",
      "\xc2\xb5",
      "\xd2\x91",
      "\xd0\x88",
      "\xd0\x84",
      "\xd1\x94",
      "\xd0\x87",
      "\xd1\x97",
      "\xd0\x89",
      "\xd1\x99",
      "\xd0\x8a",
      "\xd1\x9a",
      "\xd1\x98",
      "\xd0\x85",
      "\xc2\xac",
      "\xe2\x88\x9a",
      "\xc6\x92",
      "\xe2\x89\x88",
      "\xe2\x88\x86",
      "\xc2\xab",
      "\xc2\xbb",
      "\xe2\x80\xa6",
      "\xc2\xa0",
      "\xd0\x8b",
      "\xd1\x9b",
      "\xd0\x8c",
      "\xd1\x9c",
      "\xd1\x95",
      "\xe2\x80\x93",
      "\xe2\x80\x94",
      "\xe2\x80\x9c",
      "\xe2\x80\x9d",
      "\xe2\x80\x98",
      "\xe2\x80\x99",
      "\xc3\xb7",
      "\xe2\x80\x9e",
      "\xd0\x8e",
      "\xd1\x9e",
      "\xd0\x8f",
      "\xd1\x9f",
      "\xe2\x84\x96",
      "\xd0\x81",
      "\xd1\x91",
      "\xd1\x8f",
      "\xd0\xb0",
      "\xd0\xb1",
      "\xd0\xb2",
      "\xd0\xb3",
      "\xd0\xb4",
      "\xd0\xb5",
      "\xd0\xb6",
      "\xd0\xb7",
      "\xd0\xb8",
      "\xd0\xb9",
      "\xd0\xba",
      "\xd0\xbb",
      "\xd0\xbc",
      "\xd0\xbd",
      "\xd0\xbe",
      "\xd0\xbf",
      "\xd1\x80",
      "\xd1\x81",
      "\xd1\x82",
      "\xd1\x83",
      "\xd1\x84",
      "\xd1\x85",
      "\xd1\x86",
      "\xd1\x87",
      "\xd1\x88",
      "\xd1\x89",
      "\xd1\x8a",
      "\xd1\x8b",
      "\xd1\x8c",
      "\xd1\x8d",
      "\xd1\x8e",
      "\xc2\xa4",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x000000a0 => "\xca",
      0x000000a3 => "\xa3",
      0x000000a4 => "\xff",
      0x000000a7 => "\xa4",
      0x000000a9 => "\xa9",
      0x000000ab => "\xc7",
      0x000000ac => "\xc2",
      0x000000ae => "\xa8",
      0x000000b0 => "\xa1",
      0x000000b1 => "\xb1",
      0x000000b5 => "\xb5",
      0x000000b6 => "\xa6",
      0x000000bb => "\xc8",
      0x000000f7 => "\xd6",
      0x00000192 => "\xc4",
      0x00000401 => "\xdd",
      0x00000402 => "\xab",
      0x00000403 => "\xae",
      0x00000404 => "\xb8",
      0x00000405 => "\xc1",
      0x00000406 => "\xa7",
      0x00000407 => "\xba",
      0x00000408 => "\xb7",
      0x00000409 => "\xbc",
      0x0000040a => "\xbe",
      0x0000040b => "\xcb",
      0x0000040c => "\xcd",
      0x0000040e => "\xd8",
      0x0000040f => "\xda",
      0x00000410 => "\x80",
      0x00000411 => "\x81",
      0x00000412 => "\x82",
      0x00000413 => "\x83",
      0x00000414 => "\x84",
      0x00000415 => "\x85",
      0x00000416 => "\x86",
      0x00000417 => "\x87",
      0x00000418 => "\x88",
      0x00000419 => "\x89",
      0x0000041a => "\x8a",
      0x0000041b => "\x8b",
      0x0000041c => "\x8c",
      0x0000041d => "\x8d",
      0x0000041e => "\x8e",
      0x0000041f => "\x8f",
      0x00000420 => "\x90",
      0x00000421 => "\x91",
      0x00000422 => "\x92",
      0x00000423 => "\x93",
      0x00000424 => "\x94",
      0x00000425 => "\x95",
      0x00000426 => "\x96",
      0x00000427 => "\x97",
      0x00000428 => "\x98",
      0x00000429 => "\x99",
      0x0000042a => "\x9a",
      0x0000042b => "\x9b",
      0x0000042c => "\x9c",
      0x0000042d => "\x9d",
      0x0000042e => "\x9e",
      0x0000042f => "\x9f",
      0x00000430 => "\xe0",
      0x00000431 => "\xe1",
      0x00000432 => "\xe2",
      0x00000433 => "\xe3",
      0x00000434 => "\xe4",
      0x00000435 => "\xe5",
      0x00000436 => "\xe6",
      0x00000437 => "\xe7",
      0x00000438 => "\xe8",
      0x00000439 => "\xe9",
      0x0000043a => "\xea",
      0x0000043b => "\xeb",
      0x0000043c => "\xec",
      0x0000043d => "\xed",
      0x0000043e => "\xee",
      0x0000043f => "\xef",
      0x00000440 => "\xf0",
      0x00000441 => "\xf1",
      0x00000442 => "\xf2",
      0x00000443 => "\xf3",
      0x00000444 => "\xf4",
      0x00000445 => "\xf5",
      0x00000446 => "\xf6",
      0x00000447 => "\xf7",
      0x00000448 => "\xf8",
      0x00000449 => "\xf9",
      0x0000044a => "\xfa",
      0x0000044b => "\xfb",
      0x0000044c => "\xfc",
      0x0000044d => "\xfd",
      0x0000044e => "\xfe",
      0x0000044f => "\xdf",
      0x00000451 => "\xde",
      0x00000452 => "\xac",
      0x00000453 => "\xaf",
      0x00000454 => "\xb9",
      0x00000455 => "\xcf",
      0x00000456 => "\xb4",
      0x00000457 => "\xbb",
      0x00000458 => "\xc0",
      0x00000459 => "\xbd",
      0x0000045a => "\xbf",
      0x0000045b => "\xcc",
      0x0000045c => "\xce",
      0x0000045e => "\xd9",
      0x0000045f => "\xdb",
      0x00000490 => "\xa2",
      0x00000491 => "\xb6",
      0x00002013 => "\xd0",
      0x00002014 => "\xd1",
      0x00002018 => "\xd4",
      0x00002019 => "\xd5",
      0x0000201c => "\xd2",
      0x0000201d => "\xd3",
      0x0000201e => "\xd7",
      0x00002020 => "\xa0",
      0x00002022 => "\xa5",
      0x00002026 => "\xc9",
      0x00002116 => "\xdc",
      0x00002122 => "\xaa",
      0x00002206 => "\xc6",
      0x0000221a => "\xc3",
      0x0000221e => "\xb0",
      0x00002248 => "\xc5",
      0x00002260 => "\xad",
      0x00002264 => "\xb2",
      0x00002265 => "\xb3",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::MAC_UK - Conversion routines for MAC-UK
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for MAC-UK.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   automatically generated from the charDB
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL
      01 |  00000001 | START OF HEADING
      02 |  00000002 | START OF TEXT
      03 |  00000003 | END OF TEXT
      04 |  00000004 | END OF TRANSMISSION
      05 |  00000005 | ENQUIRY
      06 |  00000006 | ACKNOWLEDGE
      07 |  00000007 | BELL
      08 |  00000008 | BACKSPACE
      09 |  00000009 | HORIZONTAL TABULATION
      0A |  0000000A | LINE FEED
      0B |  0000000B | VERTICAL TABULATION
      0C |  0000000C | FORM FEED
      0D |  0000000D | CARRIAGE RETURN
      0E |  0000000E | SHIFT OUT
      0F |  0000000F | SHIFT IN
      10 |  00000010 | DATA LINK ESCAPE
      11 |  00000011 | DEVICE CONTROL ONE
      12 |  00000012 | DEVICE CONTROL TWO
      13 |  00000013 | DEVICE CONTROL THREE
      14 |  00000014 | DEVICE CONTROL FOUR
      15 |  00000015 | NEGATIVE ACKNOWLEDGE
      16 |  00000016 | SYNCHRONOUS IDLE
      17 |  00000017 | END OF TRANSMISSION BLOCK
      18 |  00000018 | CANCEL
      19 |  00000019 | END OF MEDIUM
      1A |  0000001A | SUBSTITUTE
      1B |  0000001B | ESCAPE
      1C |  0000001C | FILE SEPARATOR
      1D |  0000001D | GROUP SEPARATOR
      1E |  0000001E | RECORD SEPARATOR
      1F |  0000001F | UNIT SEPARATOR
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE
      80 |  00000410 | CYRILLIC CAPITAL LETTER A
      81 |  00000411 | CYRILLIC CAPITAL LETTER BE
      82 |  00000412 | CYRILLIC CAPITAL LETTER VE
      83 |  00000413 | CYRILLIC CAPITAL LETTER GHE
      84 |  00000414 | CYRILLIC CAPITAL LETTER DE
      85 |  00000415 | CYRILLIC CAPITAL LETTER IE
      86 |  00000416 | CYRILLIC CAPITAL LETTER ZHE
      87 |  00000417 | CYRILLIC CAPITAL LETTER ZE
      88 |  00000418 | CYRILLIC CAPITAL LETTER I
      89 |  00000419 | CYRILLIC CAPITAL LETTER SHORT I
      8A |  0000041A | CYRILLIC CAPITAL LETTER KA
      8B |  0000041B | CYRILLIC CAPITAL LETTER EL
      8C |  0000041C | CYRILLIC CAPITAL LETTER EM
      8D |  0000041D | CYRILLIC CAPITAL LETTER EN
      8E |  0000041E | CYRILLIC CAPITAL LETTER O
      8F |  0000041F | CYRILLIC CAPITAL LETTER PE
      90 |  00000420 | CYRILLIC CAPITAL LETTER ER
      91 |  00000421 | CYRILLIC CAPITAL LETTER ES
      92 |  00000422 | CYRILLIC CAPITAL LETTER TE
      93 |  00000423 | CYRILLIC CAPITAL LETTER U
      94 |  00000424 | CYRILLIC CAPITAL LETTER EF
      95 |  00000425 | CYRILLIC CAPITAL LETTER HA
      96 |  00000426 | CYRILLIC CAPITAL LETTER TSE
      97 |  00000427 | CYRILLIC CAPITAL LETTER CHE
      98 |  00000428 | CYRILLIC CAPITAL LETTER SHA
      99 |  00000429 | CYRILLIC CAPITAL LETTER SHCHA
      9A |  0000042A | CYRILLIC CAPITAL LETTER HARD SIGN
      9B |  0000042B | CYRILLIC CAPITAL LETTER YERU
      9C |  0000042C | CYRILLIC CAPITAL LETTER SOFT SIGN
      9D |  0000042D | CYRILLIC CAPITAL LETTER E
      9E |  0000042E | CYRILLIC CAPITAL LETTER YU
      9F |  0000042F | CYRILLIC CAPITAL LETTER YA
      A0 |  00002020 | DAGGER
      A1 |  000000B0 | DEGREE SIGN
      A2 |  00000490 | CYRILLIC CAPITAL LETTER GHE WITH UPTURN
      A3 |  000000A3 | POUND SIGN
      A4 |  000000A7 | SECTION SIGN
      A5 |  00002022 | BULLET
      A6 |  000000B6 | PILCROW SIGN
      A7 |  00000406 | CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
      A8 |  000000AE | REGISTERED SIGN
      A9 |  000000A9 | COPYRIGHT SIGN
      AA |  00002122 | TRADE MARK SIGN
      AB |  00000402 | CYRILLIC CAPITAL LETTER DJE
      AC |  00000452 | CYRILLIC SMALL LETTER DJE
      AD |  00002260 | NOT EQUAL TO
      AE |  00000403 | CYRILLIC CAPITAL LETTER GJE
      AF |  00000453 | CYRILLIC SMALL LETTER GJE
      B0 |  0000221E | INFINITY
      B1 |  000000B1 | PLUS-MINUS SIGN
      B2 |  00002264 | LESS-THAN OR EQUAL TO
      B3 |  00002265 | GREATER-THAN OR EQUAL TO
      B4 |  00000456 | CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
      B5 |  000000B5 | MICRO SIGN
      B6 |  00000491 | CYRILLIC SMALL LETTER GHE WITH UPTURN
      B7 |  00000408 | CYRILLIC CAPITAL LETTER JE
      B8 |  00000404 | CYRILLIC CAPITAL LETTER UKRAINIAN IE
      B9 |  00000454 | CYRILLIC SMALL LETTER UKRAINIAN IE
      BA |  00000407 | CYRILLIC CAPITAL LETTER YI
      BB |  00000457 | CYRILLIC SMALL LETTER YI
      BC |  00000409 | CYRILLIC CAPITAL LETTER LJE
      BD |  00000459 | CYRILLIC SMALL LETTER LJE
      BE |  0000040A | CYRILLIC CAPITAL LETTER NJE
      BF |  0000045A | CYRILLIC SMALL LETTER NJE
      C0 |  00000458 | CYRILLIC SMALL LETTER JE
      C1 |  00000405 | CYRILLIC CAPITAL LETTER DZE
      C2 |  000000AC | NOT SIGN
      C3 |  0000221A | SQUARE ROOT
      C4 |  00000192 | LATIN SMALL LETTER F WITH HOOK
      C5 |  00002248 | ALMOST EQUAL TO
      C6 |  00002206 | INCREMENT
      C7 |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
      C8 |  000000BB | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
      C9 |  00002026 | HORIZONTAL ELLIPSIS
      CA |  000000A0 | NO-BREAK SPACE
      CB |  0000040B | CYRILLIC CAPITAL LETTER TSHE
      CC |  0000045B | CYRILLIC SMALL LETTER TSHE
      CD |  0000040C | CYRILLIC CAPITAL LETTER KJE
      CE |  0000045C | CYRILLIC SMALL LETTER KJE
      CF |  00000455 | CYRILLIC SMALL LETTER DZE
      D0 |  00002013 | EN DASH
      D1 |  00002014 | EM DASH
      D2 |  0000201C | LEFT DOUBLE QUOTATION MARK
      D3 |  0000201D | RIGHT DOUBLE QUOTATION MARK
      D4 |  00002018 | LEFT SINGLE QUOTATION MARK
      D5 |  00002019 | RIGHT SINGLE QUOTATION MARK
      D6 |  000000F7 | DIVISION SIGN
      D7 |  0000201E | DOUBLE LOW-9 QUOTATION MARK
      D8 |  0000040E | CYRILLIC CAPITAL LETTER SHORT U
      D9 |  0000045E | CYRILLIC SMALL LETTER SHORT U
      DA |  0000040F | CYRILLIC CAPITAL LETTER DZHE
      DB |  0000045F | CYRILLIC SMALL LETTER DZHE
      DC |  00002116 | NUMERO SIGN
      DD |  00000401 | CYRILLIC CAPITAL LETTER IO
      DE |  00000451 | CYRILLIC SMALL LETTER IO
      DF |  0000044F | CYRILLIC SMALL LETTER YA
      E0 |  00000430 | CYRILLIC SMALL LETTER A
      E1 |  00000431 | CYRILLIC SMALL LETTER BE
      E2 |  00000432 | CYRILLIC SMALL LETTER VE
      E3 |  00000433 | CYRILLIC SMALL LETTER GHE
      E4 |  00000434 | CYRILLIC SMALL LETTER DE
      E5 |  00000435 | CYRILLIC SMALL LETTER IE
      E6 |  00000436 | CYRILLIC SMALL LETTER ZHE
      E7 |  00000437 | CYRILLIC SMALL LETTER ZE
      E8 |  00000438 | CYRILLIC SMALL LETTER I
      E9 |  00000439 | CYRILLIC SMALL LETTER SHORT I
      EA |  0000043A | CYRILLIC SMALL LETTER KA
      EB |  0000043B | CYRILLIC SMALL LETTER EL
      EC |  0000043C | CYRILLIC SMALL LETTER EM
      ED |  0000043D | CYRILLIC SMALL LETTER EN
      EE |  0000043E | CYRILLIC SMALL LETTER O
      EF |  0000043F | CYRILLIC SMALL LETTER PE
      F0 |  00000440 | CYRILLIC SMALL LETTER ER
      F1 |  00000441 | CYRILLIC SMALL LETTER ES
      F2 |  00000442 | CYRILLIC SMALL LETTER TE
      F3 |  00000443 | CYRILLIC SMALL LETTER U
      F4 |  00000444 | CYRILLIC SMALL LETTER EF
      F5 |  00000445 | CYRILLIC SMALL LETTER HA
      F6 |  00000446 | CYRILLIC SMALL LETTER TSE
      F7 |  00000447 | CYRILLIC SMALL LETTER CHE
      F8 |  00000448 | CYRILLIC SMALL LETTER SHA
      F9 |  00000449 | CYRILLIC SMALL LETTER SHCHA
      FA |  0000044A | CYRILLIC SMALL LETTER HARD SIGN
      FB |  0000044B | CYRILLIC SMALL LETTER YERU
      FC |  0000044C | CYRILLIC SMALL LETTER SOFT SIGN
      FD |  0000044D | CYRILLIC SMALL LETTER E
      FE |  0000044E | CYRILLIC SMALL LETTER YU
      FF |  000000A4 | CURRENCY SIGN
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_MAC_UK

    $main::fatpacked{"Locale/RecodeData/NATS_DANO.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_NATS_DANO';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for NATS-DANO.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::NATS_DANO;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x00ab,
      0x00bb,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0xe018,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x00c6,
      0x00d8,
      0x00c5,
      0x25a0,
      0x005f,
      0xe019,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x00e6,
      0x00f8,
      0x00e5,
      0x2013,
      0x007f,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\xc2\xab",
      "\xc2\xbb",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\xee\x80\x98",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\xc3\x86",
      "\xc3\x98",
      "\xc3\x85",
      "\xe2\x96\xa0",
      "\x5f",
      "\xee\x80\x99",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\xc3\xa6",
      "\xc3\xb8",
      "\xc3\xa5",
      "\xe2\x80\x93",
      "\x7f",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005f => "\x5f",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007f => "\x7f",
      0x000000ab => "\x22",
      0x000000bb => "\x23",
      0x000000c5 => "\x5d",
      0x000000c6 => "\x5b",
      0x000000d8 => "\x5c",
      0x000000e5 => "\x7d",
      0x000000e6 => "\x7b",
      0x000000f8 => "\x7c",
      0x00002013 => "\x7e",
      0x000025a0 => "\x5e",
      0x0000e018 => "\x40",
      0x0000e019 => "\x60",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::NATS_DANO - Conversion routines for NATS_DANO
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for NATS-DANO.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: ECMA registry
   alias ISO-IR-9-1
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
      23 |  000000BB | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  0000E018 | Unit space A E<lt>ISO-IR-8-1_40E<gt>
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  000000C6 | LATIN CAPITAL LETTER AE
      5C |  000000D8 | LATIN CAPITAL LETTER O WITH STROKE
      5D |  000000C5 | LATIN CAPITAL LETTER A WITH RING ABOVE
      5E |  000025A0 | BLACK SQUARE
      5F |  0000005F | LOW LINE
      60 |  0000E019 | Unit space B E<lt>ISO-IR-8-1_60E<gt>
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  000000E6 | LATIN SMALL LETTER AE
      7C |  000000F8 | LATIN SMALL LETTER O WITH STROKE
      7D |  000000E5 | LATIN SMALL LETTER A WITH RING ABOVE
      7E |  00002013 | EN DASH
      7F |  0000007F | DELETE (DEL)
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_NATS_DANO

    $main::fatpacked{"Locale/RecodeData/NATS_SEFI.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_NATS_SEFI';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for NATS-SEFI.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::NATS_SEFI;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0xe018,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x00c4,
      0x00d6,
      0x00c5,
      0x25a0,
      0x005f,
      0xe019,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x00e4,
      0x00f6,
      0x00e5,
      0x2013,
      0x007f,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\xee\x80\x98",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\xc3\x84",
      "\xc3\x96",
      "\xc3\x85",
      "\xe2\x96\xa0",
      "\x5f",
      "\xee\x80\x99",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\xc3\xa4",
      "\xc3\xb6",
      "\xc3\xa5",
      "\xe2\x80\x93",
      "\x7f",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005f => "\x5f",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007f => "\x7f",
      0x000000c4 => "\x5b",
      0x000000c5 => "\x5d",
      0x000000d6 => "\x5c",
      0x000000e4 => "\x7b",
      0x000000e5 => "\x7d",
      0x000000f6 => "\x7c",
      0x00002013 => "\x7e",
      0x000025a0 => "\x5e",
      0x0000e018 => "\x40",
      0x0000e019 => "\x60",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::NATS_SEFI - Conversion routines for NATS_SEFI
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for NATS-SEFI.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    source: ECMA registry
   alias ISO-IR-8-1
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  0000E018 | Unit space A E<lt>ISO-IR-8-1_40E<gt>
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  000000C4 | LATIN CAPITAL LETTER A WITH DIAERESIS
      5C |  000000D6 | LATIN CAPITAL LETTER O WITH DIAERESIS
      5D |  000000C5 | LATIN CAPITAL LETTER A WITH RING ABOVE
      5E |  000025A0 | BLACK SQUARE
      5F |  0000005F | LOW LINE
      60 |  0000E019 | Unit space B E<lt>ISO-IR-8-1_60E<gt>
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  000000E4 | LATIN SMALL LETTER A WITH DIAERESIS
      7C |  000000F6 | LATIN SMALL LETTER O WITH DIAERESIS
      7D |  000000E5 | LATIN SMALL LETTER A WITH RING ABOVE
      7E |  00002013 | EN DASH
      7F |  0000007F | DELETE (DEL)
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_NATS_SEFI

    $main::fatpacked{"Locale/RecodeData/NEXTSTEP.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_NEXTSTEP';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for NEXTSTEP.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::NEXTSTEP;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0x00a0,
      0x00c0,
      0x00c1,
      0x00c2,
      0x00c3,
      0x00c4,
      0x00c5,
      0x00c7,
      0x00c8,
      0x00c9,
      0x00ca,
      0x00cb,
      0x00cc,
      0x00cd,
      0x00ce,
      0x00cf,
      0x00d0,
      0x00d1,
      0x00d2,
      0x00d3,
      0x00d4,
      0x00d5,
      0x00d6,
      0x00d9,
      0x00da,
      0x00db,
      0x00dc,
      0x00dd,
      0x00de,
      0x00b5,
      0x00d7,
      0x00f7,
      0x00a9,
      0x00a1,
      0x00a2,
      0x00a3,
      0x2044,
      0x00a5,
      0x0192,
      0x00a7,
      0x00a4,
      0x2019,
      0x201c,
      0x00ab,
      0x2039,
      0x203a,
      0xfb01,
      0xfb02,
      0x00ae,
      0x2013,
      0x2020,
      0x2021,
      0x00b7,
      0x00a6,
      0x00b6,
      0x2022,
      0x201a,
      0x201e,
      0x201d,
      0x00bb,
      0x2026,
      0x2030,
      0x00ac,
      0x00bf,
      0x00b9,
      0x02cb,
      0x00b4,
      0x02c6,
      0x02dc,
      0x00af,
      0x02d8,
      0x02d9,
      0x00a8,
      0x00b2,
      0x02da,
      0x00b8,
      0x00b3,
      0x02dd,
      0x02db,
      0x02c7,
      0x2014,
      0x00b1,
      0x00bc,
      0x00bd,
      0x00be,
      0x00e0,
      0x00e1,
      0x00e2,
      0x00e3,
      0x00e4,
      0x00e5,
      0x00e7,
      0x00e8,
      0x00e9,
      0x00ea,
      0x00eb,
      0x00ec,
      0x00c6,
      0x00ed,
      0x00aa,
      0x00ee,
      0x00ef,
      0x00f0,
      0x00f1,
      0x0141,
      0x00d8,
      0x0152,
      0x00ba,
      0x00f2,
      0x00f3,
      0x00f4,
      0x00f5,
      0x00f6,
      0x00e6,
      0x00f9,
      0x00fa,
      0x00fb,
      0x0131,
      0x00fc,
      0x00fd,
      0x0142,
      0x00f8,
      0x0153,
      0x00df,
      0x00fe,
      0x00ff,
      0xfffd,
      0xfffd,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xc2\xa0",
      "\xc3\x80",
      "\xc3\x81",
      "\xc3\x82",
      "\xc3\x83",
      "\xc3\x84",
      "\xc3\x85",
      "\xc3\x87",
      "\xc3\x88",
      "\xc3\x89",
      "\xc3\x8a",
      "\xc3\x8b",
      "\xc3\x8c",
      "\xc3\x8d",
      "\xc3\x8e",
      "\xc3\x8f",
      "\xc3\x90",
      "\xc3\x91",
      "\xc3\x92",
      "\xc3\x93",
      "\xc3\x94",
      "\xc3\x95",
      "\xc3\x96",
      "\xc3\x99",
      "\xc3\x9a",
      "\xc3\x9b",
      "\xc3\x9c",
      "\xc3\x9d",
      "\xc3\x9e",
      "\xc2\xb5",
      "\xc3\x97",
      "\xc3\xb7",
      "\xc2\xa9",
      "\xc2\xa1",
      "\xc2\xa2",
      "\xc2\xa3",
      "\xe2\x81\x84",
      "\xc2\xa5",
      "\xc6\x92",
      "\xc2\xa7",
      "\xc2\xa4",
      "\xe2\x80\x99",
      "\xe2\x80\x9c",
      "\xc2\xab",
      "\xe2\x80\xb9",
      "\xe2\x80\xba",
      "\xef\xac\x81",
      "\xef\xac\x82",
      "\xc2\xae",
      "\xe2\x80\x93",
      "\xe2\x80\xa0",
      "\xe2\x80\xa1",
      "\xc2\xb7",
      "\xc2\xa6",
      "\xc2\xb6",
      "\xe2\x80\xa2",
      "\xe2\x80\x9a",
      "\xe2\x80\x9e",
      "\xe2\x80\x9d",
      "\xc2\xbb",
      "\xe2\x80\xa6",
      "\xe2\x80\xb0",
      "\xc2\xac",
      "\xc2\xbf",
      "\xc2\xb9",
      "\xcb\x8b",
      "\xc2\xb4",
      "\xcb\x86",
      "\xcb\x9c",
      "\xc2\xaf",
      "\xcb\x98",
      "\xcb\x99",
      "\xc2\xa8",
      "\xc2\xb2",
      "\xcb\x9a",
      "\xc2\xb8",
      "\xc2\xb3",
      "\xcb\x9d",
      "\xcb\x9b",
      "\xcb\x87",
      "\xe2\x80\x94",
      "\xc2\xb1",
      "\xc2\xbc",
      "\xc2\xbd",
      "\xc2\xbe",
      "\xc3\xa0",
      "\xc3\xa1",
      "\xc3\xa2",
      "\xc3\xa3",
      "\xc3\xa4",
      "\xc3\xa5",
      "\xc3\xa7",
      "\xc3\xa8",
      "\xc3\xa9",
      "\xc3\xaa",
      "\xc3\xab",
      "\xc3\xac",
      "\xc3\x86",
      "\xc3\xad",
      "\xc2\xaa",
      "\xc3\xae",
      "\xc3\xaf",
      "\xc3\xb0",
      "\xc3\xb1",
      "\xc5\x81",
      "\xc3\x98",
      "\xc5\x92",
      "\xc2\xba",
      "\xc3\xb2",
      "\xc3\xb3",
      "\xc3\xb4",
      "\xc3\xb5",
      "\xc3\xb6",
      "\xc3\xa6",
      "\xc3\xb9",
      "\xc3\xba",
      "\xc3\xbb",
      "\xc4\xb1",
      "\xc3\xbc",
      "\xc3\xbd",
      "\xc5\x82",
      "\xc3\xb8",
      "\xc5\x93",
      "\xc3\x9f",
      "\xc3\xbe",
      "\xc3\xbf",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x000000a0 => "\x80",
      0x000000a1 => "\xa1",
      0x000000a2 => "\xa2",
      0x000000a3 => "\xa3",
      0x000000a4 => "\xa8",
      0x000000a5 => "\xa5",
      0x000000a6 => "\xb5",
      0x000000a7 => "\xa7",
      0x000000a8 => "\xc8",
      0x000000a9 => "\xa0",
      0x000000aa => "\xe3",
      0x000000ab => "\xab",
      0x000000ac => "\xbe",
      0x000000ae => "\xb0",
      0x000000af => "\xc5",
      0x000000b1 => "\xd1",
      0x000000b2 => "\xc9",
      0x000000b3 => "\xcc",
      0x000000b4 => "\xc2",
      0x000000b5 => "\x9d",
      0x000000b6 => "\xb6",
      0x000000b7 => "\xb4",
      0x000000b8 => "\xcb",
      0x000000b9 => "\xc0",
      0x000000ba => "\xeb",
      0x000000bb => "\xbb",
      0x000000bc => "\xd2",
      0x000000bd => "\xd3",
      0x000000be => "\xd4",
      0x000000bf => "\xbf",
      0x000000c0 => "\x81",
      0x000000c1 => "\x82",
      0x000000c2 => "\x83",
      0x000000c3 => "\x84",
      0x000000c4 => "\x85",
      0x000000c5 => "\x86",
      0x000000c6 => "\xe1",
      0x000000c7 => "\x87",
      0x000000c8 => "\x88",
      0x000000c9 => "\x89",
      0x000000ca => "\x8a",
      0x000000cb => "\x8b",
      0x000000cc => "\x8c",
      0x000000cd => "\x8d",
      0x000000ce => "\x8e",
      0x000000cf => "\x8f",
      0x000000d0 => "\x90",
      0x000000d1 => "\x91",
      0x000000d2 => "\x92",
      0x000000d3 => "\x93",
      0x000000d4 => "\x94",
      0x000000d5 => "\x95",
      0x000000d6 => "\x96",
      0x000000d7 => "\x9e",
      0x000000d8 => "\xe9",
      0x000000d9 => "\x97",
      0x000000da => "\x98",
      0x000000db => "\x99",
      0x000000dc => "\x9a",
      0x000000dd => "\x9b",
      0x000000de => "\x9c",
      0x000000df => "\xfb",
      0x000000e0 => "\xd5",
      0x000000e1 => "\xd6",
      0x000000e2 => "\xd7",
      0x000000e3 => "\xd8",
      0x000000e4 => "\xd9",
      0x000000e5 => "\xda",
      0x000000e6 => "\xf1",
      0x000000e7 => "\xdb",
      0x000000e8 => "\xdc",
      0x000000e9 => "\xdd",
      0x000000ea => "\xde",
      0x000000eb => "\xdf",
      0x000000ec => "\xe0",
      0x000000ed => "\xe2",
      0x000000ee => "\xe4",
      0x000000ef => "\xe5",
      0x000000f0 => "\xe6",
      0x000000f1 => "\xe7",
      0x000000f2 => "\xec",
      0x000000f3 => "\xed",
      0x000000f4 => "\xee",
      0x000000f5 => "\xef",
      0x000000f6 => "\xf0",
      0x000000f7 => "\x9f",
      0x000000f8 => "\xf9",
      0x000000f9 => "\xf2",
      0x000000fa => "\xf3",
      0x000000fb => "\xf4",
      0x000000fc => "\xf6",
      0x000000fd => "\xf7",
      0x000000fe => "\xfc",
      0x000000ff => "\xfd",
      0x00000131 => "\xf5",
      0x00000141 => "\xe8",
      0x00000142 => "\xf8",
      0x00000152 => "\xea",
      0x00000153 => "\xfa",
      0x00000192 => "\xa6",
      0x000002c6 => "\xc3",
      0x000002c7 => "\xcf",
      0x000002cb => "\xc1",
      0x000002d8 => "\xc6",
      0x000002d9 => "\xc7",
      0x000002da => "\xca",
      0x000002db => "\xce",
      0x000002dc => "\xc4",
      0x000002dd => "\xcd",
      0x00002013 => "\xb1",
      0x00002014 => "\xd0",
      0x00002019 => "\xa9",
      0x0000201a => "\xb8",
      0x0000201c => "\xaa",
      0x0000201d => "\xba",
      0x0000201e => "\xb9",
      0x00002020 => "\xb2",
      0x00002021 => "\xb3",
      0x00002022 => "\xb7",
      0x00002026 => "\xbc",
      0x00002030 => "\xbd",
      0x00002039 => "\xac",
      0x0000203a => "\xad",
      0x00002044 => "\xa4",
      0x0000fb01 => "\xae",
      0x0000fb02 => "\xaf",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::NEXTSTEP - Conversion routines for NEXTSTEP
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for NEXTSTEP.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
  
   This charmap has been generated automatically from GNU libiconv
   conversions.
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE (DEL)
      80 |  000000A0 | NO-BREAK SPACE
      81 |  000000C0 | LATIN CAPITAL LETTER A WITH GRAVE
      82 |  000000C1 | LATIN CAPITAL LETTER A WITH ACUTE
      83 |  000000C2 | LATIN CAPITAL LETTER A WITH CIRCUMFLEX
      84 |  000000C3 | LATIN CAPITAL LETTER A WITH TILDE
      85 |  000000C4 | LATIN CAPITAL LETTER A WITH DIAERESIS
      86 |  000000C5 | LATIN CAPITAL LETTER A WITH RING ABOVE
      87 |  000000C7 | LATIN CAPITAL LETTER C WITH CEDILLA
      88 |  000000C8 | LATIN CAPITAL LETTER E WITH GRAVE
      89 |  000000C9 | LATIN CAPITAL LETTER E WITH ACUTE
      8A |  000000CA | LATIN CAPITAL LETTER E WITH CIRCUMFLEX
      8B |  000000CB | LATIN CAPITAL LETTER E WITH DIAERESIS
      8C |  000000CC | LATIN CAPITAL LETTER I WITH GRAVE
      8D |  000000CD | LATIN CAPITAL LETTER I WITH ACUTE
      8E |  000000CE | LATIN CAPITAL LETTER I WITH CIRCUMFLEX
      8F |  000000CF | LATIN CAPITAL LETTER I WITH DIAERESIS
      90 |  000000D0 | LATIN CAPITAL LETTER ETH
      91 |  000000D1 | LATIN CAPITAL LETTER N WITH TILDE
      92 |  000000D2 | LATIN CAPITAL LETTER O WITH GRAVE
      93 |  000000D3 | LATIN CAPITAL LETTER O WITH ACUTE
      94 |  000000D4 | LATIN CAPITAL LETTER O WITH CIRCUMFLEX
      95 |  000000D5 | LATIN CAPITAL LETTER O WITH TILDE
      96 |  000000D6 | LATIN CAPITAL LETTER O WITH DIAERESIS
      97 |  000000D9 | LATIN CAPITAL LETTER U WITH GRAVE
      98 |  000000DA | LATIN CAPITAL LETTER U WITH ACUTE
      99 |  000000DB | LATIN CAPITAL LETTER U WITH CIRCUMFLEX
      9A |  000000DC | LATIN CAPITAL LETTER U WITH DIAERESIS
      9B |  000000DD | LATIN CAPITAL LETTER Y WITH ACUTE
      9C |  000000DE | LATIN CAPITAL LETTER THORN
      9D |  000000B5 | MICRO SIGN
      9E |  000000D7 | MULTIPLICATION SIGN
      9F |  000000F7 | DIVISION SIGN
      A0 |  000000A9 | COPYRIGHT SIGN
      A1 |  000000A1 | INVERTED EXCLAMATION MARK
      A2 |  000000A2 | CENT SIGN
      A3 |  000000A3 | POUND SIGN
      A4 |  00002044 | FRACTION SLASH
      A5 |  000000A5 | YEN SIGN
      A6 |  00000192 | LATIN SMALL LETTER F WITH HOOK
      A7 |  000000A7 | SECTION SIGN
      A8 |  000000A4 | CURRENCY SIGN
      A9 |  00002019 | RIGHT SINGLE QUOTATION MARK
      AA |  0000201C | LEFT DOUBLE QUOTATION MARK
      AB |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
      AC |  00002039 | SINGLE LEFT-POINTING ANGLE QUOTATION MARK
      AD |  0000203A | SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
      AE |  0000FB01 | LATIN SMALL LIGATURE FI
      AF |  0000FB02 | LATIN SMALL LIGATURE FL
      B0 |  000000AE | REGISTERED SIGN
      B1 |  00002013 | EN DASH
      B2 |  00002020 | DAGGER
      B3 |  00002021 | DOUBLE DAGGER
      B4 |  000000B7 | MIDDLE DOT
      B5 |  000000A6 | BROKEN BAR
      B6 |  000000B6 | PILCROW SIGN
      B7 |  00002022 | BULLET
      B8 |  0000201A | SINGLE LOW-9 QUOTATION MARK
      B9 |  0000201E | DOUBLE LOW-9 QUOTATION MARK
      BA |  0000201D | RIGHT DOUBLE QUOTATION MARK
      BB |  000000BB | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
      BC |  00002026 | HORIZONTAL ELLIPSIS
      BD |  00002030 | PER MILLE SIGN
      BE |  000000AC | NOT SIGN
      BF |  000000BF | INVERTED QUESTION MARK
      C0 |  000000B9 | SUPERSCRIPT ONE
      C1 |  000002CB | MODIFIER LETTER GRAVE ACCENT
      C2 |  000000B4 | ACUTE ACCENT
      C3 |  000002C6 | MODIFIER LETTER CIRCUMFLEX ACCENT
      C4 |  000002DC | SMALL TILDE
      C5 |  000000AF | MACRON
      C6 |  000002D8 | BREVE
      C7 |  000002D9 | DOT ABOVE
      C8 |  000000A8 | DIAERESIS
      C9 |  000000B2 | SUPERSCRIPT TWO
      CA |  000002DA | RING ABOVE
      CB |  000000B8 | CEDILLA
      CC |  000000B3 | SUPERSCRIPT THREE
      CD |  000002DD | DOUBLE ACUTE ACCENT
      CE |  000002DB | OGONEK
      CF |  000002C7 | CARON
      D0 |  00002014 | EM DASH
      D1 |  000000B1 | PLUS-MINUS SIGN
      D2 |  000000BC | VULGAR FRACTION ONE QUARTER
      D3 |  000000BD | VULGAR FRACTION ONE HALF
      D4 |  000000BE | VULGAR FRACTION THREE QUARTERS
      D5 |  000000E0 | LATIN SMALL LETTER A WITH GRAVE
      D6 |  000000E1 | LATIN SMALL LETTER A WITH ACUTE
      D7 |  000000E2 | LATIN SMALL LETTER A WITH CIRCUMFLEX
      D8 |  000000E3 | LATIN SMALL LETTER A WITH TILDE
      D9 |  000000E4 | LATIN SMALL LETTER A WITH DIAERESIS
      DA |  000000E5 | LATIN SMALL LETTER A WITH RING ABOVE
      DB |  000000E7 | LATIN SMALL LETTER C WITH CEDILLA
      DC |  000000E8 | LATIN SMALL LETTER E WITH GRAVE
      DD |  000000E9 | LATIN SMALL LETTER E WITH ACUTE
      DE |  000000EA | LATIN SMALL LETTER E WITH CIRCUMFLEX
      DF |  000000EB | LATIN SMALL LETTER E WITH DIAERESIS
      E0 |  000000EC | LATIN SMALL LETTER I WITH GRAVE
      E1 |  000000C6 | LATIN CAPITAL LETTER AE
      E2 |  000000ED | LATIN SMALL LETTER I WITH ACUTE
      E3 |  000000AA | FEMININE ORDINAL INDICATOR
      E4 |  000000EE | LATIN SMALL LETTER I WITH CIRCUMFLEX
      E5 |  000000EF | LATIN SMALL LETTER I WITH DIAERESIS
      E6 |  000000F0 | LATIN SMALL LETTER ETH
      E7 |  000000F1 | LATIN SMALL LETTER N WITH TILDE
      E8 |  00000141 | LATIN CAPITAL LETTER L WITH STROKE
      E9 |  000000D8 | LATIN CAPITAL LETTER O WITH STROKE
      EA |  00000152 | LATIN CAPITAL LIGATURE OE
      EB |  000000BA | MASCULINE ORDINAL INDICATOR
      EC |  000000F2 | LATIN SMALL LETTER O WITH GRAVE
      ED |  000000F3 | LATIN SMALL LETTER O WITH ACUTE
      EE |  000000F4 | LATIN SMALL LETTER O WITH CIRCUMFLEX
      EF |  000000F5 | LATIN SMALL LETTER O WITH TILDE
      F0 |  000000F6 | LATIN SMALL LETTER O WITH DIAERESIS
      F1 |  000000E6 | LATIN SMALL LETTER AE
      F2 |  000000F9 | LATIN SMALL LETTER U WITH GRAVE
      F3 |  000000FA | LATIN SMALL LETTER U WITH ACUTE
      F4 |  000000FB | LATIN SMALL LETTER U WITH CIRCUMFLEX
      F5 |  00000131 | LATIN SMALL LETTER DOTLESS I
      F6 |  000000FC | LATIN SMALL LETTER U WITH DIAERESIS
      F7 |  000000FD | LATIN SMALL LETTER Y WITH ACUTE
      F8 |  00000142 | LATIN SMALL LETTER L WITH STROKE
      F9 |  000000F8 | LATIN SMALL LETTER O WITH STROKE
      FA |  00000153 | LATIN SMALL LIGATURE OE
      FB |  000000DF | LATIN SMALL LETTER SHARP S
      FC |  000000FE | LATIN SMALL LETTER THORN
      FD |  000000FF | LATIN SMALL LETTER Y WITH DIAERESIS
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_NEXTSTEP

    $main::fatpacked{"Locale/RecodeData/SAMI_WS2.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_SAMI_WS2';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for WIN-SAMI-2.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::SAMI_WS2;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0x20ac,
      0xfffd,
      0x010c,
      0x0192,
      0x010d,
      0x01b7,
      0x0292,
      0x01ee,
      0x01ef,
      0x0110,
      0x0160,
      0x2039,
      0x0152,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x2018,
      0x2019,
      0x201c,
      0x201d,
      0x2022,
      0x2013,
      0x2014,
      0x0111,
      0x01e6,
      0x0161,
      0x203a,
      0x0153,
      0xfffd,
      0xfffd,
      0x0178,
      0x00a0,
      0x01e7,
      0x01e4,
      0x00a3,
      0x00a4,
      0x01e5,
      0x00a6,
      0x00a7,
      0x00a8,
      0x00a9,
      0x021e,
      0x00ab,
      0x00ac,
      0x00ad,
      0x00ae,
      0x021f,
      0x00b0,
      0x00b1,
      0x01e8,
      0x01e9,
      0x00b4,
      0x00b5,
      0x00b6,
      0x00b7,
      0x014a,
      0x014b,
      0x0166,
      0x00bb,
      0x0167,
      0x00bd,
      0x017d,
      0x017e,
      0x00c0,
      0x00c1,
      0x00c2,
      0x00c3,
      0x00c4,
      0x00c5,
      0x00c6,
      0x00c7,
      0x00c8,
      0x00c9,
      0x00ca,
      0x00cb,
      0x00cc,
      0x00cd,
      0x00ce,
      0x00cf,
      0x00d0,
      0x00d1,
      0x00d2,
      0x00d3,
      0x00d4,
      0x00d5,
      0x00d6,
      0x00d7,
      0x00d8,
      0x00d9,
      0x00da,
      0x00db,
      0x00dc,
      0x00dd,
      0x00de,
      0x00df,
      0x00e0,
      0x00e1,
      0x00e2,
      0x00e3,
      0x00e4,
      0x00e5,
      0x00e6,
      0x00e7,
      0x00e8,
      0x00e9,
      0x00ea,
      0x00eb,
      0x00ec,
      0x00ed,
      0x00ee,
      0x00ef,
      0x00f0,
      0x00f1,
      0x00f2,
      0x00f3,
      0x00f4,
      0x00f5,
      0x00f6,
      0x00f7,
      0x00f8,
      0x00f9,
      0x00fa,
      0x00fb,
      0x00fc,
      0x00fd,
      0x00fe,
      0x00ff,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xe2\x82\xac",
      "\xef\xbf\xbd",
      "\xc4\x8c",
      "\xc6\x92",
      "\xc4\x8d",
      "\xc6\xb7",
      "\xca\x92",
      "\xc7\xae",
      "\xc7\xaf",
      "\xc4\x90",
      "\xc5\xa0",
      "\xe2\x80\xb9",
      "\xc5\x92",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xe2\x80\x98",
      "\xe2\x80\x99",
      "\xe2\x80\x9c",
      "\xe2\x80\x9d",
      "\xe2\x80\xa2",
      "\xe2\x80\x93",
      "\xe2\x80\x94",
      "\xc4\x91",
      "\xc7\xa6",
      "\xc5\xa1",
      "\xe2\x80\xba",
      "\xc5\x93",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xc5\xb8",
      "\xc2\xa0",
      "\xc7\xa7",
      "\xc7\xa4",
      "\xc2\xa3",
      "\xc2\xa4",
      "\xc7\xa5",
      "\xc2\xa6",
      "\xc2\xa7",
      "\xc2\xa8",
      "\xc2\xa9",
      "\xc8\x9e",
      "\xc2\xab",
      "\xc2\xac",
      "\xc2\xad",
      "\xc2\xae",
      "\xc8\x9f",
      "\xc2\xb0",
      "\xc2\xb1",
      "\xc7\xa8",
      "\xc7\xa9",
      "\xc2\xb4",
      "\xc2\xb5",
      "\xc2\xb6",
      "\xc2\xb7",
      "\xc5\x8a",
      "\xc5\x8b",
      "\xc5\xa6",
      "\xc2\xbb",
      "\xc5\xa7",
      "\xc2\xbd",
      "\xc5\xbd",
      "\xc5\xbe",
      "\xc3\x80",
      "\xc3\x81",
      "\xc3\x82",
      "\xc3\x83",
      "\xc3\x84",
      "\xc3\x85",
      "\xc3\x86",
      "\xc3\x87",
      "\xc3\x88",
      "\xc3\x89",
      "\xc3\x8a",
      "\xc3\x8b",
      "\xc3\x8c",
      "\xc3\x8d",
      "\xc3\x8e",
      "\xc3\x8f",
      "\xc3\x90",
      "\xc3\x91",
      "\xc3\x92",
      "\xc3\x93",
      "\xc3\x94",
      "\xc3\x95",
      "\xc3\x96",
      "\xc3\x97",
      "\xc3\x98",
      "\xc3\x99",
      "\xc3\x9a",
      "\xc3\x9b",
      "\xc3\x9c",
      "\xc3\x9d",
      "\xc3\x9e",
      "\xc3\x9f",
      "\xc3\xa0",
      "\xc3\xa1",
      "\xc3\xa2",
      "\xc3\xa3",
      "\xc3\xa4",
      "\xc3\xa5",
      "\xc3\xa6",
      "\xc3\xa7",
      "\xc3\xa8",
      "\xc3\xa9",
      "\xc3\xaa",
      "\xc3\xab",
      "\xc3\xac",
      "\xc3\xad",
      "\xc3\xae",
      "\xc3\xaf",
      "\xc3\xb0",
      "\xc3\xb1",
      "\xc3\xb2",
      "\xc3\xb3",
      "\xc3\xb4",
      "\xc3\xb5",
      "\xc3\xb6",
      "\xc3\xb7",
      "\xc3\xb8",
      "\xc3\xb9",
      "\xc3\xba",
      "\xc3\xbb",
      "\xc3\xbc",
      "\xc3\xbd",
      "\xc3\xbe",
      "\xc3\xbf",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x000000a0 => "\xa0",
      0x000000a3 => "\xa3",
      0x000000a4 => "\xa4",
      0x000000a6 => "\xa6",
      0x000000a7 => "\xa7",
      0x000000a8 => "\xa8",
      0x000000a9 => "\xa9",
      0x000000ab => "\xab",
      0x000000ac => "\xac",
      0x000000ad => "\xad",
      0x000000ae => "\xae",
      0x000000b0 => "\xb0",
      0x000000b1 => "\xb1",
      0x000000b4 => "\xb4",
      0x000000b5 => "\xb5",
      0x000000b6 => "\xb6",
      0x000000b7 => "\xb7",
      0x000000bb => "\xbb",
      0x000000bd => "\xbd",
      0x000000c0 => "\xc0",
      0x000000c1 => "\xc1",
      0x000000c2 => "\xc2",
      0x000000c3 => "\xc3",
      0x000000c4 => "\xc4",
      0x000000c5 => "\xc5",
      0x000000c6 => "\xc6",
      0x000000c7 => "\xc7",
      0x000000c8 => "\xc8",
      0x000000c9 => "\xc9",
      0x000000ca => "\xca",
      0x000000cb => "\xcb",
      0x000000cc => "\xcc",
      0x000000cd => "\xcd",
      0x000000ce => "\xce",
      0x000000cf => "\xcf",
      0x000000d0 => "\xd0",
      0x000000d1 => "\xd1",
      0x000000d2 => "\xd2",
      0x000000d3 => "\xd3",
      0x000000d4 => "\xd4",
      0x000000d5 => "\xd5",
      0x000000d6 => "\xd6",
      0x000000d7 => "\xd7",
      0x000000d8 => "\xd8",
      0x000000d9 => "\xd9",
      0x000000da => "\xda",
      0x000000db => "\xdb",
      0x000000dc => "\xdc",
      0x000000dd => "\xdd",
      0x000000de => "\xde",
      0x000000df => "\xdf",
      0x000000e0 => "\xe0",
      0x000000e1 => "\xe1",
      0x000000e2 => "\xe2",
      0x000000e3 => "\xe3",
      0x000000e4 => "\xe4",
      0x000000e5 => "\xe5",
      0x000000e6 => "\xe6",
      0x000000e7 => "\xe7",
      0x000000e8 => "\xe8",
      0x000000e9 => "\xe9",
      0x000000ea => "\xea",
      0x000000eb => "\xeb",
      0x000000ec => "\xec",
      0x000000ed => "\xed",
      0x000000ee => "\xee",
      0x000000ef => "\xef",
      0x000000f0 => "\xf0",
      0x000000f1 => "\xf1",
      0x000000f2 => "\xf2",
      0x000000f3 => "\xf3",
      0x000000f4 => "\xf4",
      0x000000f5 => "\xf5",
      0x000000f6 => "\xf6",
      0x000000f7 => "\xf7",
      0x000000f8 => "\xf8",
      0x000000f9 => "\xf9",
      0x000000fa => "\xfa",
      0x000000fb => "\xfb",
      0x000000fc => "\xfc",
      0x000000fd => "\xfd",
      0x000000fe => "\xfe",
      0x000000ff => "\xff",
      0x0000010c => "\x82",
      0x0000010d => "\x84",
      0x00000110 => "\x89",
      0x00000111 => "\x98",
      0x0000014a => "\xb8",
      0x0000014b => "\xb9",
      0x00000152 => "\x8c",
      0x00000153 => "\x9c",
      0x00000160 => "\x8a",
      0x00000161 => "\x9a",
      0x00000166 => "\xba",
      0x00000167 => "\xbc",
      0x00000178 => "\x9f",
      0x0000017d => "\xbe",
      0x0000017e => "\xbf",
      0x00000192 => "\x83",
      0x000001b7 => "\x85",
      0x000001e4 => "\xa2",
      0x000001e5 => "\xa5",
      0x000001e6 => "\x99",
      0x000001e7 => "\xa1",
      0x000001e8 => "\xb2",
      0x000001e9 => "\xb3",
      0x000001ee => "\x87",
      0x000001ef => "\x88",
      0x0000021e => "\xaa",
      0x0000021f => "\xaf",
      0x00000292 => "\x86",
      0x00002013 => "\x96",
      0x00002014 => "\x97",
      0x00002018 => "\x91",
      0x00002019 => "\x92",
      0x0000201c => "\x93",
      0x0000201d => "\x94",
      0x00002022 => "\x95",
      0x00002039 => "\x8b",
      0x0000203a => "\x9b",
      0x000020ac => "\x80",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::SAMI_WS2 - Conversion routines for SAMI_WS2
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for WIN-SAMI-2.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   source: E<lt>URL:http://www2.isl.uit.no/trond/ws2t.htmlE<gt> and
           E<lt>URL:http://www.unicode.org/unicode/alloc/Pipeline.htmlE<gt>
   author: Petter Reinholdtsen E<lt>pere@td.org.uit.noE<gt>
   date:   1999-01-20
   based on info from Trond Trosterud E<lt>Trond.Trosterud@hum.uit.noE<gt>.
   This charmap is based on MS CP1252, not ISO 8859/1.
   alias WS2
   alias WINDOWS-SAMI2
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE (DEL)
      80 |  000020AC | EURO SIGN
      82 |  0000010C | LATIN CAPITAL LETTER C WITH CARON
      83 |  00000192 | LATIN SMALL LETTER F WITH HOOK
      84 |  0000010D | LATIN SMALL LETTER C WITH CARON
      85 |  000001B7 | LATIN CAPITAL LETTER EZH
      86 |  00000292 | LATIN SMALL LETTER EZH
      87 |  000001EE | LATIN CAPITAL LETTER EZH WITH CARON
      88 |  000001EF | LATIN SMALL LETTER EZH WITH CARON
      89 |  00000110 | LATIN CAPITAL LETTER D WITH STROKE
      8A |  00000160 | LATIN CAPITAL LETTER S WITH CARON
      8B |  00002039 | SINGLE LEFT-POINTING ANGLE QUOTATION MARK
      8C |  00000152 | LATIN CAPITAL LIGATURE OE
      91 |  00002018 | LEFT SINGLE QUOTATION MARK
      92 |  00002019 | RIGHT SINGLE QUOTATION MARK
      93 |  0000201C | LEFT DOUBLE QUOTATION MARK
      94 |  0000201D | RIGHT DOUBLE QUOTATION MARK
      95 |  00002022 | BULLET
      96 |  00002013 | EN DASH
      97 |  00002014 | EM DASH
      98 |  00000111 | LATIN SMALL LETTER D WITH STROKE
      99 |  000001E6 | LATIN CAPITAL LETTER G WITH CARON
      9A |  00000161 | LATIN SMALL LETTER S WITH CARON
      9B |  0000203A | SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
      9C |  00000153 | LATIN SMALL LIGATURE OE
      9F |  00000178 | LATIN CAPITAL LETTER Y WITH DIAERESIS
      A0 |  000000A0 | NO-BREAK SPACE
      A1 |  000001E7 | LATIN SMALL LETTER G WITH CARON
      A2 |  000001E4 | LATIN CAPITAL LETTER G WITH STROKE
      A3 |  000000A3 | POUND SIGN
      A4 |  000000A4 | CURRENCY SIGN
      A5 |  000001E5 | LATIN SMALL LETTER G WITH STROKE
      A6 |  000000A6 | BROKEN BAR
      A7 |  000000A7 | SECTION SIGN
      A8 |  000000A8 | DIAERESIS
      A9 |  000000A9 | COPYRIGHT SIGN
      AA |  0000021E | LATIN CAPITAL LETTER H WITH CARON
      AB |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
      AC |  000000AC | NOT SIGN
      AD |  000000AD | SOFT HYPHEN
      AE |  000000AE | REGISTERED SIGN
      AF |  0000021F | LATIN SMALL LETTER H WITH CARON
      B0 |  000000B0 | DEGREE SIGN
      B1 |  000000B1 | PLUS-MINUS SIGN
      B2 |  000001E8 | LATIN CAPITAL LETTER K WITH CARON
      B3 |  000001E9 | LATIN SMALL LETTER K WITH CARON
      B4 |  000000B4 | ACUTE ACCENT
      B5 |  000000B5 | MICRO SIGN
      B6 |  000000B6 | PILCROW SIGN
      B7 |  000000B7 | MIDDLE DOT
      B8 |  0000014A | LATIN CAPITAL LETTER ENG (Sami)
      B9 |  0000014B | LATIN SMALL LETTER ENG (Sami)
      BA |  00000166 | LATIN CAPITAL LETTER T WITH STROKE
      BB |  000000BB | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
      BC |  00000167 | LATIN SMALL LETTER T WITH STROKE
      BD |  000000BD | VULGAR FRACTION ONE HALF
      BE |  0000017D | LATIN CAPITAL LETTER Z WITH CARON
      BF |  0000017E | LATIN SMALL LETTER Z WITH CARON
      C0 |  000000C0 | LATIN CAPITAL LETTER A WITH GRAVE
      C1 |  000000C1 | LATIN CAPITAL LETTER A WITH ACUTE
      C2 |  000000C2 | LATIN CAPITAL LETTER A WITH CIRCUMFLEX
      C3 |  000000C3 | LATIN CAPITAL LETTER A WITH TILDE
      C4 |  000000C4 | LATIN CAPITAL LETTER A WITH DIAERESIS
      C5 |  000000C5 | LATIN CAPITAL LETTER A WITH RING ABOVE
      C6 |  000000C6 | LATIN CAPITAL LETTER AE
      C7 |  000000C7 | LATIN CAPITAL LETTER C WITH CEDILLA
      C8 |  000000C8 | LATIN CAPITAL LETTER E WITH GRAVE
      C9 |  000000C9 | LATIN CAPITAL LETTER E WITH ACUTE
      CA |  000000CA | LATIN CAPITAL LETTER E WITH CIRCUMFLEX
      CB |  000000CB | LATIN CAPITAL LETTER E WITH DIAERESIS
      CC |  000000CC | LATIN CAPITAL LETTER I WITH GRAVE
      CD |  000000CD | LATIN CAPITAL LETTER I WITH ACUTE
      CE |  000000CE | LATIN CAPITAL LETTER I WITH CIRCUMFLEX
      CF |  000000CF | LATIN CAPITAL LETTER I WITH DIAERESIS
      D0 |  000000D0 | LATIN CAPITAL LETTER ETH (Icelandic)
      D1 |  000000D1 | LATIN CAPITAL LETTER N WITH TILDE
      D2 |  000000D2 | LATIN CAPITAL LETTER O WITH GRAVE
      D3 |  000000D3 | LATIN CAPITAL LETTER O WITH ACUTE
      D4 |  000000D4 | LATIN CAPITAL LETTER O WITH CIRCUMFLEX
      D5 |  000000D5 | LATIN CAPITAL LETTER O WITH TILDE
      D6 |  000000D6 | LATIN CAPITAL LETTER O WITH DIAERESIS
      D7 |  000000D7 | MULTIPLICATION SIGN
      D8 |  000000D8 | LATIN CAPITAL LETTER O WITH STROKE
      D9 |  000000D9 | LATIN CAPITAL LETTER U WITH GRAVE
      DA |  000000DA | LATIN CAPITAL LETTER U WITH ACUTE
      DB |  000000DB | LATIN CAPITAL LETTER U WITH CIRCUMFLEX
      DC |  000000DC | LATIN CAPITAL LETTER U WITH DIAERESIS
      DD |  000000DD | LATIN CAPITAL LETTER Y WITH ACUTE
      DE |  000000DE | LATIN CAPITAL LETTER THORN (Icelandic)
      DF |  000000DF | LATIN SMALL LETTER SHARP S (German)
      E0 |  000000E0 | LATIN SMALL LETTER A WITH GRAVE
      E1 |  000000E1 | LATIN SMALL LETTER A WITH ACUTE
      E2 |  000000E2 | LATIN SMALL LETTER A WITH CIRCUMFLEX
      E3 |  000000E3 | LATIN SMALL LETTER A WITH TILDE
      E4 |  000000E4 | LATIN SMALL LETTER A WITH DIAERESIS
      E5 |  000000E5 | LATIN SMALL LETTER A WITH RING ABOVE
      E6 |  000000E6 | LATIN SMALL LETTER AE
      E7 |  000000E7 | LATIN SMALL LETTER C WITH CEDILLA
      E8 |  000000E8 | LATIN SMALL LETTER E WITH GRAVE
      E9 |  000000E9 | LATIN SMALL LETTER E WITH ACUTE
      EA |  000000EA | LATIN SMALL LETTER E WITH CIRCUMFLEX
      EB |  000000EB | LATIN SMALL LETTER E WITH DIAERESIS
      EC |  000000EC | LATIN SMALL LETTER I WITH GRAVE
      ED |  000000ED | LATIN SMALL LETTER I WITH ACUTE
      EE |  000000EE | LATIN SMALL LETTER I WITH CIRCUMFLEX
      EF |  000000EF | LATIN SMALL LETTER I WITH DIAERESIS
      F0 |  000000F0 | LATIN SMALL LETTER ETH (Icelandic)
      F1 |  000000F1 | LATIN SMALL LETTER N WITH TILDE
      F2 |  000000F2 | LATIN SMALL LETTER O WITH GRAVE
      F3 |  000000F3 | LATIN SMALL LETTER O WITH ACUTE
      F4 |  000000F4 | LATIN SMALL LETTER O WITH CIRCUMFLEX
      F5 |  000000F5 | LATIN SMALL LETTER O WITH TILDE
      F6 |  000000F6 | LATIN SMALL LETTER O WITH DIAERESIS
      F7 |  000000F7 | DIVISION SIGN
      F8 |  000000F8 | LATIN SMALL LETTER O WITH STROKE
      F9 |  000000F9 | LATIN SMALL LETTER U WITH GRAVE
      FA |  000000FA | LATIN SMALL LETTER U WITH ACUTE
      FB |  000000FB | LATIN SMALL LETTER U WITH CIRCUMFLEX
      FC |  000000FC | LATIN SMALL LETTER U WITH DIAERESIS
      FD |  000000FD | LATIN SMALL LETTER Y WITH ACUTE
      FE |  000000FE | LATIN SMALL LETTER THORN (Icelandic)
      FF |  000000FF | LATIN SMALL LETTER Y WITH DIAERESIS
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_SAMI_WS2

    $main::fatpacked{"Locale/RecodeData/TIS_620.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_TIS_620';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for TIS-620.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::TIS_620;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x0002,
      0x0003,
      0x0004,
      0x0005,
      0x0006,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x0014,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x0019,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x001e,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0e01,
      0x0e02,
      0x0e03,
      0x0e04,
      0x0e05,
      0x0e06,
      0x0e07,
      0x0e08,
      0x0e09,
      0x0e0a,
      0x0e0b,
      0x0e0c,
      0x0e0d,
      0x0e0e,
      0x0e0f,
      0x0e10,
      0x0e11,
      0x0e12,
      0x0e13,
      0x0e14,
      0x0e15,
      0x0e16,
      0x0e17,
      0x0e18,
      0x0e19,
      0x0e1a,
      0x0e1b,
      0x0e1c,
      0x0e1d,
      0x0e1e,
      0x0e1f,
      0x0e20,
      0x0e21,
      0x0e22,
      0x0e23,
      0x0e24,
      0x0e25,
      0x0e26,
      0x0e27,
      0x0e28,
      0x0e29,
      0x0e2a,
      0x0e2b,
      0x0e2c,
      0x0e2d,
      0x0e2e,
      0x0e2f,
      0x0e30,
      0x0e31,
      0x0e32,
      0x0e33,
      0x0e34,
      0x0e35,
      0x0e36,
      0x0e37,
      0x0e38,
      0x0e39,
      0x0e3a,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
      0x0e3f,
      0x0e40,
      0x0e41,
      0x0e42,
      0x0e43,
      0x0e44,
      0x0e45,
      0x0e46,
      0x0e47,
      0x0e48,
      0x0e49,
      0x0e4a,
      0x0e4b,
      0x0e4c,
      0x0e4d,
      0x0e4e,
      0x0e4f,
      0x0e50,
      0x0e51,
      0x0e52,
      0x0e53,
      0x0e54,
      0x0e55,
      0x0e56,
      0x0e57,
      0x0e58,
      0x0e59,
      0x0e5a,
      0x0e5b,
      0xfffd,
      0xfffd,
      0xfffd,
      0xfffd,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\x02",
      "\x03",
      "\x04",
      "\x05",
      "\x06",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\x14",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\x19",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\x1e",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xe0\xb8\x81",
      "\xe0\xb8\x82",
      "\xe0\xb8\x83",
      "\xe0\xb8\x84",
      "\xe0\xb8\x85",
      "\xe0\xb8\x86",
      "\xe0\xb8\x87",
      "\xe0\xb8\x88",
      "\xe0\xb8\x89",
      "\xe0\xb8\x8a",
      "\xe0\xb8\x8b",
      "\xe0\xb8\x8c",
      "\xe0\xb8\x8d",
      "\xe0\xb8\x8e",
      "\xe0\xb8\x8f",
      "\xe0\xb8\x90",
      "\xe0\xb8\x91",
      "\xe0\xb8\x92",
      "\xe0\xb8\x93",
      "\xe0\xb8\x94",
      "\xe0\xb8\x95",
      "\xe0\xb8\x96",
      "\xe0\xb8\x97",
      "\xe0\xb8\x98",
      "\xe0\xb8\x99",
      "\xe0\xb8\x9a",
      "\xe0\xb8\x9b",
      "\xe0\xb8\x9c",
      "\xe0\xb8\x9d",
      "\xe0\xb8\x9e",
      "\xe0\xb8\x9f",
      "\xe0\xb8\xa0",
      "\xe0\xb8\xa1",
      "\xe0\xb8\xa2",
      "\xe0\xb8\xa3",
      "\xe0\xb8\xa4",
      "\xe0\xb8\xa5",
      "\xe0\xb8\xa6",
      "\xe0\xb8\xa7",
      "\xe0\xb8\xa8",
      "\xe0\xb8\xa9",
      "\xe0\xb8\xaa",
      "\xe0\xb8\xab",
      "\xe0\xb8\xac",
      "\xe0\xb8\xad",
      "\xe0\xb8\xae",
      "\xe0\xb8\xaf",
      "\xe0\xb8\xb0",
      "\xe0\xb8\xb1",
      "\xe0\xb8\xb2",
      "\xe0\xb8\xb3",
      "\xe0\xb8\xb4",
      "\xe0\xb8\xb5",
      "\xe0\xb8\xb6",
      "\xe0\xb8\xb7",
      "\xe0\xb8\xb8",
      "\xe0\xb8\xb9",
      "\xe0\xb8\xba",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xe0\xb8\xbf",
      "\xe0\xb9\x80",
      "\xe0\xb9\x81",
      "\xe0\xb9\x82",
      "\xe0\xb9\x83",
      "\xe0\xb9\x84",
      "\xe0\xb9\x85",
      "\xe0\xb9\x86",
      "\xe0\xb9\x87",
      "\xe0\xb9\x88",
      "\xe0\xb9\x89",
      "\xe0\xb9\x8a",
      "\xe0\xb9\x8b",
      "\xe0\xb9\x8c",
      "\xe0\xb9\x8d",
      "\xe0\xb9\x8e",
      "\xe0\xb9\x8f",
      "\xe0\xb9\x90",
      "\xe0\xb9\x91",
      "\xe0\xb9\x92",
      "\xe0\xb9\x93",
      "\xe0\xb9\x94",
      "\xe0\xb9\x95",
      "\xe0\xb9\x96",
      "\xe0\xb9\x97",
      "\xe0\xb9\x98",
      "\xe0\xb9\x99",
      "\xe0\xb9\x9a",
      "\xe0\xb9\x9b",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
      "\xef\xbf\xbd",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000002 => "\x02",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000005 => "\x05",
      0x00000006 => "\x06",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000014 => "\x14",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x00000019 => "\x19",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001e => "\x1e",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x00000e01 => "\xa1",
      0x00000e02 => "\xa2",
      0x00000e03 => "\xa3",
      0x00000e04 => "\xa4",
      0x00000e05 => "\xa5",
      0x00000e06 => "\xa6",
      0x00000e07 => "\xa7",
      0x00000e08 => "\xa8",
      0x00000e09 => "\xa9",
      0x00000e0a => "\xaa",
      0x00000e0b => "\xab",
      0x00000e0c => "\xac",
      0x00000e0d => "\xad",
      0x00000e0e => "\xae",
      0x00000e0f => "\xaf",
      0x00000e10 => "\xb0",
      0x00000e11 => "\xb1",
      0x00000e12 => "\xb2",
      0x00000e13 => "\xb3",
      0x00000e14 => "\xb4",
      0x00000e15 => "\xb5",
      0x00000e16 => "\xb6",
      0x00000e17 => "\xb7",
      0x00000e18 => "\xb8",
      0x00000e19 => "\xb9",
      0x00000e1a => "\xba",
      0x00000e1b => "\xbb",
      0x00000e1c => "\xbc",
      0x00000e1d => "\xbd",
      0x00000e1e => "\xbe",
      0x00000e1f => "\xbf",
      0x00000e20 => "\xc0",
      0x00000e21 => "\xc1",
      0x00000e22 => "\xc2",
      0x00000e23 => "\xc3",
      0x00000e24 => "\xc4",
      0x00000e25 => "\xc5",
      0x00000e26 => "\xc6",
      0x00000e27 => "\xc7",
      0x00000e28 => "\xc8",
      0x00000e29 => "\xc9",
      0x00000e2a => "\xca",
      0x00000e2b => "\xcb",
      0x00000e2c => "\xcc",
      0x00000e2d => "\xcd",
      0x00000e2e => "\xce",
      0x00000e2f => "\xcf",
      0x00000e30 => "\xd0",
      0x00000e31 => "\xd1",
      0x00000e32 => "\xd2",
      0x00000e33 => "\xd3",
      0x00000e34 => "\xd4",
      0x00000e35 => "\xd5",
      0x00000e36 => "\xd6",
      0x00000e37 => "\xd7",
      0x00000e38 => "\xd8",
      0x00000e39 => "\xd9",
      0x00000e3a => "\xda",
      0x00000e3f => "\xdf",
      0x00000e40 => "\xe0",
      0x00000e41 => "\xe1",
      0x00000e42 => "\xe2",
      0x00000e43 => "\xe3",
      0x00000e44 => "\xe4",
      0x00000e45 => "\xe5",
      0x00000e46 => "\xe6",
      0x00000e47 => "\xe7",
      0x00000e48 => "\xe8",
      0x00000e49 => "\xe9",
      0x00000e4a => "\xea",
      0x00000e4b => "\xeb",
      0x00000e4c => "\xec",
      0x00000e4d => "\xed",
      0x00000e4e => "\xee",
      0x00000e4f => "\xef",
      0x00000e50 => "\xf0",
      0x00000e51 => "\xf1",
      0x00000e52 => "\xf2",
      0x00000e53 => "\xf3",
      0x00000e54 => "\xf4",
      0x00000e55 => "\xf5",
      0x00000e56 => "\xf6",
      0x00000e57 => "\xf7",
      0x00000e58 => "\xf8",
      0x00000e59 => "\xf9",
      0x00000e5a => "\xfa",
      0x00000e5b => "\xfb",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::TIS_620 - Conversion routines for TIS-620
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for TIS-620.
  
  =head1 COMMENTS
  
  The following comments have been extracted from the original charmap:
  
   version: 1.0
    sources: Thai Industrial Standards Institute, ECMA registry, IANA
   alias TIS620
   alias TIS620-0
   alias TIS620.2529-1
   alias TIS620.2533-0
   alias ISO-IR-166
  
  Please note that aliases listed above are not necessarily valid!
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE (DEL)
      A1 |  00000E01 | THAI CHARACTER KO KAI
      A2 |  00000E02 | THAI CHARACTER KHO KHAI
      A3 |  00000E03 | THAI CHARACTER KHO KHUAT
      A4 |  00000E04 | THAI CHARACTER KHO KHWAI
      A5 |  00000E05 | THAI CHARACTER KHO KHON
      A6 |  00000E06 | THAI CHARACTER KHO RAKHANG
      A7 |  00000E07 | THAI CHARACTER NGO NGU
      A8 |  00000E08 | THAI CHARACTER CHO CHAN
      A9 |  00000E09 | THAI CHARACTER CHO CHING
      AA |  00000E0A | THAI CHARACTER CHO CHANG
      AB |  00000E0B | THAI CHARACTER SO SO
      AC |  00000E0C | THAI CHARACTER CHO CHOE
      AD |  00000E0D | THAI CHARACTER YO YING
      AE |  00000E0E | THAI CHARACTER DO CHADA
      AF |  00000E0F | THAI CHARACTER TO PATAK
      B0 |  00000E10 | THAI CHARACTER THO THAN
      B1 |  00000E11 | THAI CHARACTER THO NANGMONTHO
      B2 |  00000E12 | THAI CHARACTER THO PHUTHAO
      B3 |  00000E13 | THAI CHARACTER NO NEN
      B4 |  00000E14 | THAI CHARACTER DO DEK
      B5 |  00000E15 | THAI CHARACTER TO TAO
      B6 |  00000E16 | THAI CHARACTER THO THUNG
      B7 |  00000E17 | THAI CHARACTER THO THAHAN
      B8 |  00000E18 | THAI CHARACTER THO THONG
      B9 |  00000E19 | THAI CHARACTER NO NU
      BA |  00000E1A | THAI CHARACTER BO BAIMAI
      BB |  00000E1B | THAI CHARACTER PO PLA
      BC |  00000E1C | THAI CHARACTER PHO PHUNG
      BD |  00000E1D | THAI CHARACTER FO FA
      BE |  00000E1E | THAI CHARACTER PHO PHAN
      BF |  00000E1F | THAI CHARACTER FO FAN
      C0 |  00000E20 | THAI CHARACTER PHO SAMPHAO
      C1 |  00000E21 | THAI CHARACTER MO MA
      C2 |  00000E22 | THAI CHARACTER YO YAK
      C3 |  00000E23 | THAI CHARACTER RO RUA
      C4 |  00000E24 | THAI CHARACTER RU
      C5 |  00000E25 | THAI CHARACTER LO LING
      C6 |  00000E26 | THAI CHARACTER LU
      C7 |  00000E27 | THAI CHARACTER WO WAEN
      C8 |  00000E28 | THAI CHARACTER SO SALA
      C9 |  00000E29 | THAI CHARACTER SO RUSI
      CA |  00000E2A | THAI CHARACTER SO SUA
      CB |  00000E2B | THAI CHARACTER HO HIP
      CC |  00000E2C | THAI CHARACTER LO CHULA
      CD |  00000E2D | THAI CHARACTER O ANG
      CE |  00000E2E | THAI CHARACTER HO NOKHUK
      CF |  00000E2F | THAI CHARACTER PAIYANNOI
      D0 |  00000E30 | THAI CHARACTER SARA A
      D1 |  00000E31 | THAI CHARACTER MAI HAN-AKAT
      D2 |  00000E32 | THAI CHARACTER SARA AA
      D3 |  00000E33 | THAI CHARACTER SARA AM
      D4 |  00000E34 | THAI CHARACTER SARA I
      D5 |  00000E35 | THAI CHARACTER SARA II
      D6 |  00000E36 | THAI CHARACTER SARA UE
      D7 |  00000E37 | THAI CHARACTER SARA UEE
      D8 |  00000E38 | THAI CHARACTER SARA U
      D9 |  00000E39 | THAI CHARACTER SARA UU
      DA |  00000E3A | THAI CHARACTER PHINTHU
      DF |  00000E3F | THAI CHARACTER SYMBOL BAHT
      E0 |  00000E40 | THAI CHARACTER SARA E
      E1 |  00000E41 | THAI CHARACTER SARA AE
      E2 |  00000E42 | THAI CHARACTER SARA O
      E3 |  00000E43 | THAI CHARACTER SARA AI MAIMUAN
      E4 |  00000E44 | THAI CHARACTER SARA AI MAIMALAI
      E5 |  00000E45 | THAI CHARACTER LAKKHANGYAO
      E6 |  00000E46 | THAI CHARACTER MAIYAMOK
      E7 |  00000E47 | THAI CHARACTER MAITAIKHU
      E8 |  00000E48 | THAI CHARACTER MAI EK
      E9 |  00000E49 | THAI CHARACTER MAI THO
      EA |  00000E4A | THAI CHARACTER MAI TRI
      EB |  00000E4B | THAI CHARACTER MAI CHATTAWA
      EC |  00000E4C | THAI CHARACTER THANTHAKHAT
      ED |  00000E4D | THAI CHARACTER NIKHAHIT
      EE |  00000E4E | THAI CHARACTER YAMAKKAN
      EF |  00000E4F | THAI CHARACTER FONGMAN
      F0 |  00000E50 | THAI DIGIT ZERO
      F1 |  00000E51 | THAI DIGIT ONE
      F2 |  00000E52 | THAI DIGIT TWO
      F3 |  00000E53 | THAI DIGIT THREE
      F4 |  00000E54 | THAI DIGIT FOUR
      F5 |  00000E55 | THAI DIGIT FIVE
      F6 |  00000E56 | THAI DIGIT SIX
      F7 |  00000E57 | THAI DIGIT SEVEN
      F8 |  00000E58 | THAI DIGIT EIGHT
      F9 |  00000E59 | THAI DIGIT NINE
      FA |  00000E5A | THAI CHARACTER ANGKHANKHU
      FB |  00000E5B | THAI CHARACTER KHOMUT
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_TIS_620

    $main::fatpacked{"Locale/RecodeData/US_ASCII.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_US_ASCII';
  #! /bin/false
  
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for US-ASCII.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::US_ASCII;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		# FIXME: Maybe the lookup is cheaper than the call to chr().
  		$_[1] = join '', 
  		    map $_ > 0x7f ? '?' : chr $_,
  			    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8') {
  		# FIXME: Maybe the lookup is cheaper than the call to chr().
  		$_[1] = join '', 
  		    map $_ > 0x7f ? "\xef\xbf\xbd" : chr $_, unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map { $_ > 0x7f ? 0xfffd : $_ } unpack 'C*', $_[1] ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::US_ASCII - Conversion routines for US-ASCII
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module contains the conversion tables and routines for US-ASCII.
  
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00000002 | START OF TEXT (STX)
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00000005 | ENQUIRY (ENQ)
      06 |  00000006 | ACKNOWLEDGE (ACK)
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00000014 | DEVICE CONTROL FOUR (DC4)
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00000019 | END OF MEDIUM (EM)
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  0000001E | RECORD SEPARATOR (IS2)
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE (DEL)
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_US_ASCII

    $main::fatpacked{"Locale/RecodeData/UTF_8.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_UTF_8';
  #! /bin/false
  
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for UTF-8 (perl < 5.8.0).
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::UTF_8;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  	return $_[0]->_fromInternal ($_[1]);
      } else {
  	return $_[0]->_toInternal ($_[1]);
      }
  }
  
  # This routine assumes that the internal representation is always sane
  # and contains valid codes only.
  sub _fromInternal
  {
      $_[1] = join '', map {
  	if ($_ <= 0x7f) {
  	    chr $_;
  	} elsif ($_ <= 0x7ff) {
  	    pack ("C2", 
  		  (0xc0 | (($_ >> 6) & 0x1f)),
  		  (0x80 | ($_ & 0x3f)));
  	} elsif ($_ <= 0xffff) {
  	    pack ("C3", 
  		  (0xe0 | (($_ >> 12) & 0xf)),
  		  (0x80 | (($_ >> 6) & 0x3f)),
  		  (0x80 | ($_ & 0x3f)));
  	} elsif ($_ <= 0x1fffff) {
  	    pack ("C4", 
  		  (0xf0 | (($_ >> 18) & 0x7)),
  		  (0x80 | (($_ >> 12) & 0x3f)),
  		  (0x80 | (($_ >> 6) & 0x3f)),
  		  (0x80 | ($_ & 0x3f)));
  	} elsif ($_ <= 0x3ffffff) {
  	    pack ("C5", 
  		  (0xf0 | (($_ >> 24) & 0x3)),
  		  (0x80 | (($_ >> 18) & 0x3f)),
  		  (0x80 | (($_ >> 12) & 0x3f)),
  		  (0x80 | (($_ >> 6) & 0x3f)),
  		  (0x80 | ($_ & 0x3f)));
  	} else {
  	    pack ("C6", 
  		  (0xf0 | (($_ >> 30) & 0x3)),
  		  (0x80 | (($_ >> 24) & 0x1)),
  		  (0x80 | (($_ >> 18) & 0x3f)),
  		  (0x80 | (($_ >> 12) & 0x3f)),
  		  (0x80 | (($_ >> 6) & 0x3f)),
  		  (0x80 | ($_ & 0x3f)));
  	}
      } @{$_[1]};
      return 1;
  }
  
  # Decode UTF-8 into integers.  We do not bother to care about possibly
  # configured replacement characters here and simply fall back to 0xfffd.
  # Rationale: the internal format is never output directly and the other
  # encoders will handle the replacement character correctly.
  sub _toInternal
  {
      if ($] >= 5.006) {
  	$_[1] = [ unpack "U*", $_[1] ];
  	return 1;
      }
  
      # Sigh, we have to decode ourselves.  FIXME: Should be optimized.
      # The routine is awfully slow.
      # It also does not necessarily detect illegal multi-byte sequences.
  
      my @chars = ();
      my @bytes = unpack "C*", $_[1];
  
      BYTE: while (@bytes) {
  	my $byte = shift @bytes;
          if ($byte < 0x80) {
              push @chars, $byte;
          } elsif ($byte < 0xc0 || $byte > 0xfd) {
              push @chars, 0xfffd;
          } else {
              my $num_bytes;
              my $char;
              if ($byte < 0xe0) {
                  $char = $byte & 0x1f;
                  $num_bytes = 1;
              } elsif ($byte < 0xf0) {
                  $char = $byte & 0xf;
                  $num_bytes = 2;
              } elsif ($byte < 0xf8) {
                  $char = $byte & 0x7;
                  $num_bytes = 3;
              } elsif ($byte < 0xfc) {
                  $char = $byte & 0x3;
                  $num_bytes = 4;
              } else {
                  $char = $byte & 0x1;
                  $num_bytes = 5;
              }
              for (my $i = 0; $i < $num_bytes; ++$i) {
                  my $next = shift @bytes;
                  if (!defined $next || $next < 0x80 || $next > 0xbf) {
                      push @chars, 0xfffd;
                      next BYTE;
                  } else {
                      $char <<= 6;
                      $char |= $next & 0x3f;
                  }
              }
              push @chars, $char;
          }
      }
      
      $_[1] = \@chars;
      
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::UTF_8 - Conversion routines for UTF-8
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This modules contains the conversion tables for UTF-8.  It is capable of
  converting from UTF-8 to the internal format of libintl-perl and vice
  versa.   It is only suitable for Perl versions E<lt>= 5.8.0.  However,
  you do not have to bother about version checking, Locale::Recode(3)
  will do that for you.
  
  
  =head1 CHARACTER TABLE
  
  See http://www.unicode.org/.
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_UTF_8

    $main::fatpacked{"Locale/RecodeData/VISCII.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA_VISCII';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Conversion routines for VISCII.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::VISCII;
  
  use strict;
  
  require Locale::RecodeData;
  use base qw(Locale::RecodeData);
  
  my @to_ucs4 = (
      0x0000,
      0x0001,
      0x1eb2,
      0x0003,
      0x0004,
      0x1eb4,
      0x1eaa,
      0x0007,
      0x0008,
      0x0009,
      0x000a,
      0x000b,
      0x000c,
      0x000d,
      0x000e,
      0x000f,
      0x0010,
      0x0011,
      0x0012,
      0x0013,
      0x1ef6,
      0x0015,
      0x0016,
      0x0017,
      0x0018,
      0x1ef8,
      0x001a,
      0x001b,
      0x001c,
      0x001d,
      0x1ef4,
      0x001f,
      0x0020,
      0x0021,
      0x0022,
      0x0023,
      0x0024,
      0x0025,
      0x0026,
      0x0027,
      0x0028,
      0x0029,
      0x002a,
      0x002b,
      0x002c,
      0x002d,
      0x002e,
      0x002f,
      0x0030,
      0x0031,
      0x0032,
      0x0033,
      0x0034,
      0x0035,
      0x0036,
      0x0037,
      0x0038,
      0x0039,
      0x003a,
      0x003b,
      0x003c,
      0x003d,
      0x003e,
      0x003f,
      0x0040,
      0x0041,
      0x0042,
      0x0043,
      0x0044,
      0x0045,
      0x0046,
      0x0047,
      0x0048,
      0x0049,
      0x004a,
      0x004b,
      0x004c,
      0x004d,
      0x004e,
      0x004f,
      0x0050,
      0x0051,
      0x0052,
      0x0053,
      0x0054,
      0x0055,
      0x0056,
      0x0057,
      0x0058,
      0x0059,
      0x005a,
      0x005b,
      0x005c,
      0x005d,
      0x005e,
      0x005f,
      0x0060,
      0x0061,
      0x0062,
      0x0063,
      0x0064,
      0x0065,
      0x0066,
      0x0067,
      0x0068,
      0x0069,
      0x006a,
      0x006b,
      0x006c,
      0x006d,
      0x006e,
      0x006f,
      0x0070,
      0x0071,
      0x0072,
      0x0073,
      0x0074,
      0x0075,
      0x0076,
      0x0077,
      0x0078,
      0x0079,
      0x007a,
      0x007b,
      0x007c,
      0x007d,
      0x007e,
      0x007f,
      0x1ea0,
      0x1eae,
      0x1eb0,
      0x1eb6,
      0x1ea4,
      0x1ea6,
      0x1ea8,
      0x1eac,
      0x1ebc,
      0x1eb8,
      0x1ebe,
      0x1ec0,
      0x1ec2,
      0x1ec4,
      0x1ec6,
      0x1ed0,
      0x1ed2,
      0x1ed4,
      0x1ed6,
      0x1ed8,
      0x1ee2,
      0x1eda,
      0x1edc,
      0x1ede,
      0x1eca,
      0x1ece,
      0x1ecc,
      0x1ec8,
      0x1ee6,
      0x0168,
      0x1ee4,
      0x1ef2,
      0x00d5,
      0x1eaf,
      0x1eb1,
      0x1eb7,
      0x1ea5,
      0x1ea7,
      0x1ea9,
      0x1ead,
      0x1ebd,
      0x1eb9,
      0x1ebf,
      0x1ec1,
      0x1ec3,
      0x1ec5,
      0x1ec7,
      0x1ed1,
      0x1ed3,
      0x1ed5,
      0x1ed7,
      0x1ee0,
      0x01a0,
      0x1ed9,
      0x1edd,
      0x1edf,
      0x1ecb,
      0x1ef0,
      0x1ee8,
      0x1eea,
      0x1eec,
      0x01a1,
      0x1edb,
      0x01af,
      0x00c0,
      0x00c1,
      0x00c2,
      0x00c3,
      0x1ea2,
      0x0102,
      0x1eb3,
      0x1eb5,
      0x00c8,
      0x00c9,
      0x00ca,
      0x1eba,
      0x00cc,
      0x00cd,
      0x0128,
      0x1ef3,
      0x0110,
      0x1ee9,
      0x00d2,
      0x00d3,
      0x00d4,
      0x1ea1,
      0x1ef7,
      0x1eeb,
      0x1eed,
      0x00d9,
      0x00da,
      0x1ef9,
      0x1ef5,
      0x00dd,
      0x1ee1,
      0x01b0,
      0x00e0,
      0x00e1,
      0x00e2,
      0x00e3,
      0x1ea3,
      0x0103,
      0x1eef,
      0x1eab,
      0x00e8,
      0x00e9,
      0x00ea,
      0x1ebb,
      0x00ec,
      0x00ed,
      0x0129,
      0x1ec9,
      0x0111,
      0x1ef1,
      0x00f2,
      0x00f3,
      0x00f4,
      0x00f5,
      0x1ecf,
      0x1ecd,
      0x1ee5,
      0x00f9,
      0x00fa,
      0x0169,
      0x1ee7,
      0x00fd,
      0x1ee3,
      0x1eee,
  );
  
  my @to_utf8 = (
      "\x00",
      "\x01",
      "\xe1\xba\xb2",
      "\x03",
      "\x04",
      "\xe1\xba\xb4",
      "\xe1\xba\xaa",
      "\x07",
      "\x08",
      "\x09",
      "\x0a",
      "\x0b",
      "\x0c",
      "\x0d",
      "\x0e",
      "\x0f",
      "\x10",
      "\x11",
      "\x12",
      "\x13",
      "\xe1\xbb\xb6",
      "\x15",
      "\x16",
      "\x17",
      "\x18",
      "\xe1\xbb\xb8",
      "\x1a",
      "\x1b",
      "\x1c",
      "\x1d",
      "\xe1\xbb\xb4",
      "\x1f",
      "\x20",
      "\x21",
      "\x22",
      "\x23",
      "\x24",
      "\x25",
      "\x26",
      "\x27",
      "\x28",
      "\x29",
      "\x2a",
      "\x2b",
      "\x2c",
      "\x2d",
      "\x2e",
      "\x2f",
      "\x30",
      "\x31",
      "\x32",
      "\x33",
      "\x34",
      "\x35",
      "\x36",
      "\x37",
      "\x38",
      "\x39",
      "\x3a",
      "\x3b",
      "\x3c",
      "\x3d",
      "\x3e",
      "\x3f",
      "\x40",
      "\x41",
      "\x42",
      "\x43",
      "\x44",
      "\x45",
      "\x46",
      "\x47",
      "\x48",
      "\x49",
      "\x4a",
      "\x4b",
      "\x4c",
      "\x4d",
      "\x4e",
      "\x4f",
      "\x50",
      "\x51",
      "\x52",
      "\x53",
      "\x54",
      "\x55",
      "\x56",
      "\x57",
      "\x58",
      "\x59",
      "\x5a",
      "\x5b",
      "\x5c",
      "\x5d",
      "\x5e",
      "\x5f",
      "\x60",
      "\x61",
      "\x62",
      "\x63",
      "\x64",
      "\x65",
      "\x66",
      "\x67",
      "\x68",
      "\x69",
      "\x6a",
      "\x6b",
      "\x6c",
      "\x6d",
      "\x6e",
      "\x6f",
      "\x70",
      "\x71",
      "\x72",
      "\x73",
      "\x74",
      "\x75",
      "\x76",
      "\x77",
      "\x78",
      "\x79",
      "\x7a",
      "\x7b",
      "\x7c",
      "\x7d",
      "\x7e",
      "\x7f",
      "\xe1\xba\xa0",
      "\xe1\xba\xae",
      "\xe1\xba\xb0",
      "\xe1\xba\xb6",
      "\xe1\xba\xa4",
      "\xe1\xba\xa6",
      "\xe1\xba\xa8",
      "\xe1\xba\xac",
      "\xe1\xba\xbc",
      "\xe1\xba\xb8",
      "\xe1\xba\xbe",
      "\xe1\xbb\x80",
      "\xe1\xbb\x82",
      "\xe1\xbb\x84",
      "\xe1\xbb\x86",
      "\xe1\xbb\x90",
      "\xe1\xbb\x92",
      "\xe1\xbb\x94",
      "\xe1\xbb\x96",
      "\xe1\xbb\x98",
      "\xe1\xbb\xa2",
      "\xe1\xbb\x9a",
      "\xe1\xbb\x9c",
      "\xe1\xbb\x9e",
      "\xe1\xbb\x8a",
      "\xe1\xbb\x8e",
      "\xe1\xbb\x8c",
      "\xe1\xbb\x88",
      "\xe1\xbb\xa6",
      "\xc5\xa8",
      "\xe1\xbb\xa4",
      "\xe1\xbb\xb2",
      "\xc3\x95",
      "\xe1\xba\xaf",
      "\xe1\xba\xb1",
      "\xe1\xba\xb7",
      "\xe1\xba\xa5",
      "\xe1\xba\xa7",
      "\xe1\xba\xa9",
      "\xe1\xba\xad",
      "\xe1\xba\xbd",
      "\xe1\xba\xb9",
      "\xe1\xba\xbf",
      "\xe1\xbb\x81",
      "\xe1\xbb\x83",
      "\xe1\xbb\x85",
      "\xe1\xbb\x87",
      "\xe1\xbb\x91",
      "\xe1\xbb\x93",
      "\xe1\xbb\x95",
      "\xe1\xbb\x97",
      "\xe1\xbb\xa0",
      "\xc6\xa0",
      "\xe1\xbb\x99",
      "\xe1\xbb\x9d",
      "\xe1\xbb\x9f",
      "\xe1\xbb\x8b",
      "\xe1\xbb\xb0",
      "\xe1\xbb\xa8",
      "\xe1\xbb\xaa",
      "\xe1\xbb\xac",
      "\xc6\xa1",
      "\xe1\xbb\x9b",
      "\xc6\xaf",
      "\xc3\x80",
      "\xc3\x81",
      "\xc3\x82",
      "\xc3\x83",
      "\xe1\xba\xa2",
      "\xc4\x82",
      "\xe1\xba\xb3",
      "\xe1\xba\xb5",
      "\xc3\x88",
      "\xc3\x89",
      "\xc3\x8a",
      "\xe1\xba\xba",
      "\xc3\x8c",
      "\xc3\x8d",
      "\xc4\xa8",
      "\xe1\xbb\xb3",
      "\xc4\x90",
      "\xe1\xbb\xa9",
      "\xc3\x92",
      "\xc3\x93",
      "\xc3\x94",
      "\xe1\xba\xa1",
      "\xe1\xbb\xb7",
      "\xe1\xbb\xab",
      "\xe1\xbb\xad",
      "\xc3\x99",
      "\xc3\x9a",
      "\xe1\xbb\xb9",
      "\xe1\xbb\xb5",
      "\xc3\x9d",
      "\xe1\xbb\xa1",
      "\xc6\xb0",
      "\xc3\xa0",
      "\xc3\xa1",
      "\xc3\xa2",
      "\xc3\xa3",
      "\xe1\xba\xa3",
      "\xc4\x83",
      "\xe1\xbb\xaf",
      "\xe1\xba\xab",
      "\xc3\xa8",
      "\xc3\xa9",
      "\xc3\xaa",
      "\xe1\xba\xbb",
      "\xc3\xac",
      "\xc3\xad",
      "\xc4\xa9",
      "\xe1\xbb\x89",
      "\xc4\x91",
      "\xe1\xbb\xb1",
      "\xc3\xb2",
      "\xc3\xb3",
      "\xc3\xb4",
      "\xc3\xb5",
      "\xe1\xbb\x8f",
      "\xe1\xbb\x8d",
      "\xe1\xbb\xa5",
      "\xc3\xb9",
      "\xc3\xba",
      "\xc5\xa9",
      "\xe1\xbb\xa7",
      "\xc3\xbd",
      "\xe1\xbb\xa3",
      "\xe1\xbb\xae",
  );
  
  my %from_ucs4 = (
      0x00000000 => "\x00",
      0x00000001 => "\x01",
      0x00000003 => "\x03",
      0x00000004 => "\x04",
      0x00000007 => "\x07",
      0x00000008 => "\x08",
      0x00000009 => "\x09",
      0x0000000a => "\x0a",
      0x0000000b => "\x0b",
      0x0000000c => "\x0c",
      0x0000000d => "\x0d",
      0x0000000e => "\x0e",
      0x0000000f => "\x0f",
      0x00000010 => "\x10",
      0x00000011 => "\x11",
      0x00000012 => "\x12",
      0x00000013 => "\x13",
      0x00000015 => "\x15",
      0x00000016 => "\x16",
      0x00000017 => "\x17",
      0x00000018 => "\x18",
      0x0000001a => "\x1a",
      0x0000001b => "\x1b",
      0x0000001c => "\x1c",
      0x0000001d => "\x1d",
      0x0000001f => "\x1f",
      0x00000020 => "\x20",
      0x00000021 => "\x21",
      0x00000022 => "\x22",
      0x00000023 => "\x23",
      0x00000024 => "\x24",
      0x00000025 => "\x25",
      0x00000026 => "\x26",
      0x00000027 => "\x27",
      0x00000028 => "\x28",
      0x00000029 => "\x29",
      0x0000002a => "\x2a",
      0x0000002b => "\x2b",
      0x0000002c => "\x2c",
      0x0000002d => "\x2d",
      0x0000002e => "\x2e",
      0x0000002f => "\x2f",
      0x00000030 => "\x30",
      0x00000031 => "\x31",
      0x00000032 => "\x32",
      0x00000033 => "\x33",
      0x00000034 => "\x34",
      0x00000035 => "\x35",
      0x00000036 => "\x36",
      0x00000037 => "\x37",
      0x00000038 => "\x38",
      0x00000039 => "\x39",
      0x0000003a => "\x3a",
      0x0000003b => "\x3b",
      0x0000003c => "\x3c",
      0x0000003d => "\x3d",
      0x0000003e => "\x3e",
      0x0000003f => "\x3f",
      0x00000040 => "\x40",
      0x00000041 => "\x41",
      0x00000042 => "\x42",
      0x00000043 => "\x43",
      0x00000044 => "\x44",
      0x00000045 => "\x45",
      0x00000046 => "\x46",
      0x00000047 => "\x47",
      0x00000048 => "\x48",
      0x00000049 => "\x49",
      0x0000004a => "\x4a",
      0x0000004b => "\x4b",
      0x0000004c => "\x4c",
      0x0000004d => "\x4d",
      0x0000004e => "\x4e",
      0x0000004f => "\x4f",
      0x00000050 => "\x50",
      0x00000051 => "\x51",
      0x00000052 => "\x52",
      0x00000053 => "\x53",
      0x00000054 => "\x54",
      0x00000055 => "\x55",
      0x00000056 => "\x56",
      0x00000057 => "\x57",
      0x00000058 => "\x58",
      0x00000059 => "\x59",
      0x0000005a => "\x5a",
      0x0000005b => "\x5b",
      0x0000005c => "\x5c",
      0x0000005d => "\x5d",
      0x0000005e => "\x5e",
      0x0000005f => "\x5f",
      0x00000060 => "\x60",
      0x00000061 => "\x61",
      0x00000062 => "\x62",
      0x00000063 => "\x63",
      0x00000064 => "\x64",
      0x00000065 => "\x65",
      0x00000066 => "\x66",
      0x00000067 => "\x67",
      0x00000068 => "\x68",
      0x00000069 => "\x69",
      0x0000006a => "\x6a",
      0x0000006b => "\x6b",
      0x0000006c => "\x6c",
      0x0000006d => "\x6d",
      0x0000006e => "\x6e",
      0x0000006f => "\x6f",
      0x00000070 => "\x70",
      0x00000071 => "\x71",
      0x00000072 => "\x72",
      0x00000073 => "\x73",
      0x00000074 => "\x74",
      0x00000075 => "\x75",
      0x00000076 => "\x76",
      0x00000077 => "\x77",
      0x00000078 => "\x78",
      0x00000079 => "\x79",
      0x0000007a => "\x7a",
      0x0000007b => "\x7b",
      0x0000007c => "\x7c",
      0x0000007d => "\x7d",
      0x0000007e => "\x7e",
      0x0000007f => "\x7f",
      0x000000c0 => "\xc0",
      0x000000c1 => "\xc1",
      0x000000c2 => "\xc2",
      0x000000c3 => "\xc3",
      0x000000c8 => "\xc8",
      0x000000c9 => "\xc9",
      0x000000ca => "\xca",
      0x000000cc => "\xcc",
      0x000000cd => "\xcd",
      0x000000d2 => "\xd2",
      0x000000d3 => "\xd3",
      0x000000d4 => "\xd4",
      0x000000d5 => "\xa0",
      0x000000d9 => "\xd9",
      0x000000da => "\xda",
      0x000000dd => "\xdd",
      0x000000e0 => "\xe0",
      0x000000e1 => "\xe1",
      0x000000e2 => "\xe2",
      0x000000e3 => "\xe3",
      0x000000e8 => "\xe8",
      0x000000e9 => "\xe9",
      0x000000ea => "\xea",
      0x000000ec => "\xec",
      0x000000ed => "\xed",
      0x000000f2 => "\xf2",
      0x000000f3 => "\xf3",
      0x000000f4 => "\xf4",
      0x000000f5 => "\xf5",
      0x000000f9 => "\xf9",
      0x000000fa => "\xfa",
      0x000000fd => "\xfd",
      0x00000102 => "\xc5",
      0x00000103 => "\xe5",
      0x00000110 => "\xd0",
      0x00000111 => "\xf0",
      0x00000128 => "\xce",
      0x00000129 => "\xee",
      0x00000168 => "\x9d",
      0x00000169 => "\xfb",
      0x000001a0 => "\xb4",
      0x000001a1 => "\xbd",
      0x000001af => "\xbf",
      0x000001b0 => "\xdf",
      0x00001ea0 => "\x80",
      0x00001ea1 => "\xd5",
      0x00001ea2 => "\xc4",
      0x00001ea3 => "\xe4",
      0x00001ea4 => "\x84",
      0x00001ea5 => "\xa4",
      0x00001ea6 => "\x85",
      0x00001ea7 => "\xa5",
      0x00001ea8 => "\x86",
      0x00001ea9 => "\xa6",
      0x00001eaa => "\x06",
      0x00001eab => "\xe7",
      0x00001eac => "\x87",
      0x00001ead => "\xa7",
      0x00001eae => "\x81",
      0x00001eaf => "\xa1",
      0x00001eb0 => "\x82",
      0x00001eb1 => "\xa2",
      0x00001eb2 => "\x02",
      0x00001eb3 => "\xc6",
      0x00001eb4 => "\x05",
      0x00001eb5 => "\xc7",
      0x00001eb6 => "\x83",
      0x00001eb7 => "\xa3",
      0x00001eb8 => "\x89",
      0x00001eb9 => "\xa9",
      0x00001eba => "\xcb",
      0x00001ebb => "\xeb",
      0x00001ebc => "\x88",
      0x00001ebd => "\xa8",
      0x00001ebe => "\x8a",
      0x00001ebf => "\xaa",
      0x00001ec0 => "\x8b",
      0x00001ec1 => "\xab",
      0x00001ec2 => "\x8c",
      0x00001ec3 => "\xac",
      0x00001ec4 => "\x8d",
      0x00001ec5 => "\xad",
      0x00001ec6 => "\x8e",
      0x00001ec7 => "\xae",
      0x00001ec8 => "\x9b",
      0x00001ec9 => "\xef",
      0x00001eca => "\x98",
      0x00001ecb => "\xb8",
      0x00001ecc => "\x9a",
      0x00001ecd => "\xf7",
      0x00001ece => "\x99",
      0x00001ecf => "\xf6",
      0x00001ed0 => "\x8f",
      0x00001ed1 => "\xaf",
      0x00001ed2 => "\x90",
      0x00001ed3 => "\xb0",
      0x00001ed4 => "\x91",
      0x00001ed5 => "\xb1",
      0x00001ed6 => "\x92",
      0x00001ed7 => "\xb2",
      0x00001ed8 => "\x93",
      0x00001ed9 => "\xb5",
      0x00001eda => "\x95",
      0x00001edb => "\xbe",
      0x00001edc => "\x96",
      0x00001edd => "\xb6",
      0x00001ede => "\x97",
      0x00001edf => "\xb7",
      0x00001ee0 => "\xb3",
      0x00001ee1 => "\xde",
      0x00001ee2 => "\x94",
      0x00001ee3 => "\xfe",
      0x00001ee4 => "\x9e",
      0x00001ee5 => "\xf8",
      0x00001ee6 => "\x9c",
      0x00001ee7 => "\xfc",
      0x00001ee8 => "\xba",
      0x00001ee9 => "\xd1",
      0x00001eea => "\xbb",
      0x00001eeb => "\xd7",
      0x00001eec => "\xbc",
      0x00001eed => "\xd8",
      0x00001eee => "\xff",
      0x00001eef => "\xe6",
      0x00001ef0 => "\xb9",
      0x00001ef1 => "\xf1",
      0x00001ef2 => "\x9f",
      0x00001ef3 => "\xcf",
      0x00001ef4 => "\x1e",
      0x00001ef5 => "\xdc",
      0x00001ef6 => "\x14",
      0x00001ef7 => "\xd6",
      0x00001ef8 => "\x19",
      0x00001ef9 => "\xdb",
  );
  
  sub _recode
  {
      if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = join '',
  	        map $from_ucs4{$_} 
                  || (defined $from_ucs4{$_} ? $from_ucs4{$_} : "\x3f"),
  		    @{$_[1]};
      } elsif ($_[0]->{_to} eq 'UTF-8',) {
  		$_[1] = join '', map $to_utf8[$_], unpack 'C*', $_[1];
      } else {
  		$_[1] = [ map 
  				  $to_ucs4[$_],
  				  unpack 'C*', $_[1] 
  				  ];
      }
  
      return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::VISCII - Conversion routines for VISCII
  
  =head1 SYNOPSIS
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module is generated and contains the conversion tables and
  routines for VISCII.
  =head1 CHARACTER TABLE
  
  The following table is sorted in the same order as the original charmap.
  All character codes are in hexadecimal.  Please read 'ISO-10646' as
  'ISO-10646-UCS4'.
  
   Local | ISO-10646 | Description
  -------+-----------+-------------------------------------------------
      00 |  00000000 | NULL (NUL)
      01 |  00000001 | START OF HEADING (SOH)
      02 |  00001EB2 | LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE
      03 |  00000003 | END OF TEXT (ETX)
      04 |  00000004 | END OF TRANSMISSION (EOT)
      05 |  00001EB4 | LATIN CAPITAL LETTER A WITH BREVE AND TILDE
      06 |  00001EAA | LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE
      07 |  00000007 | BELL (BEL)
      08 |  00000008 | BACKSPACE (BS)
      09 |  00000009 | CHARACTER TABULATION (HT)
      0A |  0000000A | LINE FEED (LF)
      0B |  0000000B | LINE TABULATION (VT)
      0C |  0000000C | FORM FEED (FF)
      0D |  0000000D | CARRIAGE RETURN (CR)
      0E |  0000000E | SHIFT OUT (SO)
      0F |  0000000F | SHIFT IN (SI)
      10 |  00000010 | DATALINK ESCAPE (DLE)
      11 |  00000011 | DEVICE CONTROL ONE (DC1)
      12 |  00000012 | DEVICE CONTROL TWO (DC2)
      13 |  00000013 | DEVICE CONTROL THREE (DC3)
      14 |  00001EF6 | LATIN CAPITAL LETTER Y WITH HOOK ABOVE
      15 |  00000015 | NEGATIVE ACKNOWLEDGE (NAK)
      16 |  00000016 | SYNCHRONOUS IDLE (SYN)
      17 |  00000017 | END OF TRANSMISSION BLOCK (ETB)
      18 |  00000018 | CANCEL (CAN)
      19 |  00001EF8 | LATIN CAPITAL LETTER Y WITH TILDE
      1A |  0000001A | SUBSTITUTE (SUB)
      1B |  0000001B | ESCAPE (ESC)
      1C |  0000001C | FILE SEPARATOR (IS4)
      1D |  0000001D | GROUP SEPARATOR (IS3)
      1E |  00001EF4 | LATIN CAPITAL LETTER Y WITH DOT BELOW
      1F |  0000001F | UNIT SEPARATOR (IS1)
      20 |  00000020 | SPACE
      21 |  00000021 | EXCLAMATION MARK
      22 |  00000022 | QUOTATION MARK
      23 |  00000023 | NUMBER SIGN
      24 |  00000024 | DOLLAR SIGN
      25 |  00000025 | PERCENT SIGN
      26 |  00000026 | AMPERSAND
      27 |  00000027 | APOSTROPHE
      28 |  00000028 | LEFT PARENTHESIS
      29 |  00000029 | RIGHT PARENTHESIS
      2A |  0000002A | ASTERISK
      2B |  0000002B | PLUS SIGN
      2C |  0000002C | COMMA
      2D |  0000002D | HYPHEN-MINUS
      2E |  0000002E | FULL STOP
      2F |  0000002F | SOLIDUS
      30 |  00000030 | DIGIT ZERO
      31 |  00000031 | DIGIT ONE
      32 |  00000032 | DIGIT TWO
      33 |  00000033 | DIGIT THREE
      34 |  00000034 | DIGIT FOUR
      35 |  00000035 | DIGIT FIVE
      36 |  00000036 | DIGIT SIX
      37 |  00000037 | DIGIT SEVEN
      38 |  00000038 | DIGIT EIGHT
      39 |  00000039 | DIGIT NINE
      3A |  0000003A | COLON
      3B |  0000003B | SEMICOLON
      3C |  0000003C | LESS-THAN SIGN
      3D |  0000003D | EQUALS SIGN
      3E |  0000003E | GREATER-THAN SIGN
      3F |  0000003F | QUESTION MARK
      40 |  00000040 | COMMERCIAL AT
      41 |  00000041 | LATIN CAPITAL LETTER A
      42 |  00000042 | LATIN CAPITAL LETTER B
      43 |  00000043 | LATIN CAPITAL LETTER C
      44 |  00000044 | LATIN CAPITAL LETTER D
      45 |  00000045 | LATIN CAPITAL LETTER E
      46 |  00000046 | LATIN CAPITAL LETTER F
      47 |  00000047 | LATIN CAPITAL LETTER G
      48 |  00000048 | LATIN CAPITAL LETTER H
      49 |  00000049 | LATIN CAPITAL LETTER I
      4A |  0000004A | LATIN CAPITAL LETTER J
      4B |  0000004B | LATIN CAPITAL LETTER K
      4C |  0000004C | LATIN CAPITAL LETTER L
      4D |  0000004D | LATIN CAPITAL LETTER M
      4E |  0000004E | LATIN CAPITAL LETTER N
      4F |  0000004F | LATIN CAPITAL LETTER O
      50 |  00000050 | LATIN CAPITAL LETTER P
      51 |  00000051 | LATIN CAPITAL LETTER Q
      52 |  00000052 | LATIN CAPITAL LETTER R
      53 |  00000053 | LATIN CAPITAL LETTER S
      54 |  00000054 | LATIN CAPITAL LETTER T
      55 |  00000055 | LATIN CAPITAL LETTER U
      56 |  00000056 | LATIN CAPITAL LETTER V
      57 |  00000057 | LATIN CAPITAL LETTER W
      58 |  00000058 | LATIN CAPITAL LETTER X
      59 |  00000059 | LATIN CAPITAL LETTER Y
      5A |  0000005A | LATIN CAPITAL LETTER Z
      5B |  0000005B | LEFT SQUARE BRACKET
      5C |  0000005C | REVERSE SOLIDUS
      5D |  0000005D | RIGHT SQUARE BRACKET
      5E |  0000005E | CIRCUMFLEX ACCENT
      5F |  0000005F | LOW LINE
      60 |  00000060 | GRAVE ACCENT
      61 |  00000061 | LATIN SMALL LETTER A
      62 |  00000062 | LATIN SMALL LETTER B
      63 |  00000063 | LATIN SMALL LETTER C
      64 |  00000064 | LATIN SMALL LETTER D
      65 |  00000065 | LATIN SMALL LETTER E
      66 |  00000066 | LATIN SMALL LETTER F
      67 |  00000067 | LATIN SMALL LETTER G
      68 |  00000068 | LATIN SMALL LETTER H
      69 |  00000069 | LATIN SMALL LETTER I
      6A |  0000006A | LATIN SMALL LETTER J
      6B |  0000006B | LATIN SMALL LETTER K
      6C |  0000006C | LATIN SMALL LETTER L
      6D |  0000006D | LATIN SMALL LETTER M
      6E |  0000006E | LATIN SMALL LETTER N
      6F |  0000006F | LATIN SMALL LETTER O
      70 |  00000070 | LATIN SMALL LETTER P
      71 |  00000071 | LATIN SMALL LETTER Q
      72 |  00000072 | LATIN SMALL LETTER R
      73 |  00000073 | LATIN SMALL LETTER S
      74 |  00000074 | LATIN SMALL LETTER T
      75 |  00000075 | LATIN SMALL LETTER U
      76 |  00000076 | LATIN SMALL LETTER V
      77 |  00000077 | LATIN SMALL LETTER W
      78 |  00000078 | LATIN SMALL LETTER X
      79 |  00000079 | LATIN SMALL LETTER Y
      7A |  0000007A | LATIN SMALL LETTER Z
      7B |  0000007B | LEFT CURLY BRACKET
      7C |  0000007C | VERTICAL LINE
      7D |  0000007D | RIGHT CURLY BRACKET
      7E |  0000007E | TILDE
      7F |  0000007F | DELETE (DEL)
      80 |  00001EA0 | LATIN CAPITAL LETTER A WITH DOT BELOW
      81 |  00001EAE | LATIN CAPITAL LETTER A WITH BREVE AND ACUTE
      82 |  00001EB0 | LATIN CAPITAL LETTER A WITH BREVE AND GRAVE
      83 |  00001EB6 | LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW
      84 |  00001EA4 | LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE
      85 |  00001EA6 | LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE
      86 |  00001EA8 | LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
      87 |  00001EAC | LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW
      88 |  00001EBC | LATIN CAPITAL LETTER E WITH TILDE
      89 |  00001EB8 | LATIN CAPITAL LETTER E WITH DOT BELOW
      8A |  00001EBE | LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE
      8B |  00001EC0 | LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE
      8C |  00001EC2 | LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
      8D |  00001EC4 | LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE
      8E |  00001EC6 | LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW
      8F |  00001ED0 | LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE
      90 |  00001ED2 | LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE
      91 |  00001ED4 | LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
      92 |  00001ED6 | LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE
      93 |  00001ED8 | LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW
      94 |  00001EE2 | LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW
      95 |  00001EDA | LATIN CAPITAL LETTER O WITH HORN AND ACUTE
      96 |  00001EDC | LATIN CAPITAL LETTER O WITH HORN AND GRAVE
      97 |  00001EDE | LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE
      98 |  00001ECA | LATIN CAPITAL LETTER I WITH DOT BELOW
      99 |  00001ECE | LATIN CAPITAL LETTER O WITH HOOK ABOVE
      9A |  00001ECC | LATIN CAPITAL LETTER O WITH DOT BELOW
      9B |  00001EC8 | LATIN CAPITAL LETTER I WITH HOOK ABOVE
      9C |  00001EE6 | LATIN CAPITAL LETTER U WITH HOOK ABOVE
      9D |  00000168 | LATIN CAPITAL LETTER U WITH TILDE
      9E |  00001EE4 | LATIN CAPITAL LETTER U WITH DOT BELOW
      9F |  00001EF2 | LATIN CAPITAL LETTER Y WITH GRAVE
      A0 |  000000D5 | LATIN CAPITAL LETTER O WITH TILDE
      A1 |  00001EAF | LATIN SMALL LETTER A WITH BREVE AND ACUTE
      A2 |  00001EB1 | LATIN SMALL LETTER A WITH BREVE AND GRAVE
      A3 |  00001EB7 | LATIN SMALL LETTER A WITH BREVE AND DOT BELOW
      A4 |  00001EA5 | LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE
      A5 |  00001EA7 | LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE
      A6 |  00001EA9 | LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
      A7 |  00001EAD | LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW
      A8 |  00001EBD | LATIN SMALL LETTER E WITH TILDE
      A9 |  00001EB9 | LATIN SMALL LETTER E WITH DOT BELOW
      AA |  00001EBF | LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE
      AB |  00001EC1 | LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE
      AC |  00001EC3 | LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
      AD |  00001EC5 | LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE
      AE |  00001EC7 | LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW
      AF |  00001ED1 | LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE
      B0 |  00001ED3 | LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE
      B1 |  00001ED5 | LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
      B2 |  00001ED7 | LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE
      B3 |  00001EE0 | LATIN CAPITAL LETTER O WITH HORN AND TILDE
      B4 |  000001A0 | LATIN CAPITAL LETTER O WITH HORN
      B5 |  00001ED9 | LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW
      B6 |  00001EDD | LATIN SMALL LETTER O WITH HORN AND GRAVE
      B7 |  00001EDF | LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE
      B8 |  00001ECB | LATIN SMALL LETTER I WITH DOT BELOW
      B9 |  00001EF0 | LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW
      BA |  00001EE8 | LATIN CAPITAL LETTER U WITH HORN AND ACUTE
      BB |  00001EEA | LATIN CAPITAL LETTER U WITH HORN AND GRAVE
      BC |  00001EEC | LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE
      BD |  000001A1 | LATIN SMALL LETTER O WITH HORN
      BE |  00001EDB | LATIN SMALL LETTER O WITH HORN AND ACUTE
      BF |  000001AF | LATIN CAPITAL LETTER U WITH HORN
      C0 |  000000C0 | LATIN CAPITAL LETTER A WITH GRAVE
      C1 |  000000C1 | LATIN CAPITAL LETTER A WITH ACUTE
      C2 |  000000C2 | LATIN CAPITAL LETTER A WITH CIRCUMFLEX
      C3 |  000000C3 | LATIN CAPITAL LETTER A WITH TILDE
      C4 |  00001EA2 | LATIN CAPITAL LETTER A WITH HOOK ABOVE
      C5 |  00000102 | LATIN CAPITAL LETTER A WITH BREVE
      C6 |  00001EB3 | LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE
      C7 |  00001EB5 | LATIN SMALL LETTER A WITH BREVE AND TILDE
      C8 |  000000C8 | LATIN CAPITAL LETTER E WITH GRAVE
      C9 |  000000C9 | LATIN CAPITAL LETTER E WITH ACUTE
      CA |  000000CA | LATIN CAPITAL LETTER E WITH CIRCUMFLEX
      CB |  00001EBA | LATIN CAPITAL LETTER E WITH HOOK ABOVE
      CC |  000000CC | LATIN CAPITAL LETTER I WITH GRAVE
      CD |  000000CD | LATIN CAPITAL LETTER I WITH ACUTE
      CE |  00000128 | LATIN CAPITAL LETTER I WITH TILDE
      CF |  00001EF3 | LATIN SMALL LETTER Y WITH GRAVE
      D0 |  00000110 | LATIN CAPITAL LETTER D WITH STROKE
      D1 |  00001EE9 | LATIN SMALL LETTER U WITH HORN AND ACUTE
      D2 |  000000D2 | LATIN CAPITAL LETTER O WITH GRAVE
      D3 |  000000D3 | LATIN CAPITAL LETTER O WITH ACUTE
      D4 |  000000D4 | LATIN CAPITAL LETTER O WITH CIRCUMFLEX
      D5 |  00001EA1 | LATIN SMALL LETTER A WITH DOT BELOW
      D6 |  00001EF7 | LATIN SMALL LETTER Y WITH HOOK ABOVE
      D7 |  00001EEB | LATIN SMALL LETTER U WITH HORN AND GRAVE
      D8 |  00001EED | LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE
      D9 |  000000D9 | LATIN CAPITAL LETTER U WITH GRAVE
      DA |  000000DA | LATIN CAPITAL LETTER U WITH ACUTE
      DB |  00001EF9 | LATIN SMALL LETTER Y WITH TILDE
      DC |  00001EF5 | LATIN SMALL LETTER Y WITH DOT BELOW
      DD |  000000DD | LATIN CAPITAL LETTER Y WITH ACUTE
      DE |  00001EE1 | LATIN SMALL LETTER O WITH HORN AND TILDE
      DF |  000001B0 | LATIN SMALL LETTER U WITH HORN
      E0 |  000000E0 | LATIN SMALL LETTER A WITH GRAVE
      E1 |  000000E1 | LATIN SMALL LETTER A WITH ACUTE
      E2 |  000000E2 | LATIN SMALL LETTER A WITH CIRCUMFLEX
      E3 |  000000E3 | LATIN SMALL LETTER A WITH TILDE
      E4 |  00001EA3 | LATIN SMALL LETTER A WITH HOOK ABOVE
      E5 |  00000103 | LATIN SMALL LETTER A WITH BREVE
      E6 |  00001EEF | LATIN SMALL LETTER U WITH HORN AND TILDE
      E7 |  00001EAB | LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE
      E8 |  000000E8 | LATIN SMALL LETTER E WITH GRAVE
      E9 |  000000E9 | LATIN SMALL LETTER E WITH ACUTE
      EA |  000000EA | LATIN SMALL LETTER E WITH CIRCUMFLEX
      EB |  00001EBB | LATIN SMALL LETTER E WITH HOOK ABOVE
      EC |  000000EC | LATIN SMALL LETTER I WITH GRAVE
      ED |  000000ED | LATIN SMALL LETTER I WITH ACUTE
      EE |  00000129 | LATIN SMALL LETTER I WITH TILDE
      EF |  00001EC9 | LATIN SMALL LETTER I WITH HOOK ABOVE
      F0 |  00000111 | LATIN SMALL LETTER D WITH STROKE
      F1 |  00001EF1 | LATIN SMALL LETTER U WITH HORN AND DOT BELOW
      F2 |  000000F2 | LATIN SMALL LETTER O WITH GRAVE
      F3 |  000000F3 | LATIN SMALL LETTER O WITH ACUTE
      F4 |  000000F4 | LATIN SMALL LETTER O WITH CIRCUMFLEX
      F5 |  000000F5 | LATIN SMALL LETTER O WITH TILDE
      F6 |  00001ECF | LATIN SMALL LETTER O WITH HOOK ABOVE
      F7 |  00001ECD | LATIN SMALL LETTER O WITH DOT BELOW
      F8 |  00001EE5 | LATIN SMALL LETTER U WITH DOT BELOW
      F9 |  000000F9 | LATIN SMALL LETTER U WITH GRAVE
      FA |  000000FA | LATIN SMALL LETTER U WITH ACUTE
      FB |  00000169 | LATIN SMALL LETTER U WITH TILDE
      FC |  00001EE7 | LATIN SMALL LETTER U WITH HOOK ABOVE
      FD |  000000FD | LATIN SMALL LETTER Y WITH ACUTE
      FE |  00001EE3 | LATIN SMALL LETTER O WITH HORN AND DOT BELOW
      FF |  00001EEE | LATIN CAPITAL LETTER U WITH HORN AND TILDE
  
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::RecodeData(3), Locale::Recode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA_VISCII

    $main::fatpacked{"Locale/RecodeData/_Encode.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_RECODEDATA__ENCODE';
  #! /bin/false
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Interface to Encode.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::RecodeData::_Encode;
  
  use strict;
  use integer;
  
  use Encode;
  
  require Locale::RecodeData;
  use base qw (Locale::RecodeData);
  
  sub _recode
  {
  	use bytes;
  
  	my $retval;
  	
  	if ($_[0]->{_from} eq 'INTERNAL') {
  		$_[1] = pack "N*", @{$_[1]};
  		$retval = Encode::from_to ($_[1], 'UTF-32BE', $_[0]->{_to});
  	} elsif ($_[0]->{_to} eq 'INTERNAL') {
  		$retval = Encode::from_to ($_[1], $_[0]->{_from}, 'UTF-32BE');
  		return unless defined $retval;
  		$_[1] = [ unpack "N*", $_[1] ];
  	} else {
  		$retval = Encode::from_to ($_[1], $_[0]->{_from}, $_[0]->{_to});
  	}
  	
  	return unless defined $retval;
  	return 1;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::RecodeData::_Encode - Internal wrapper around Encode 
  
  =head1 SYNOPSIS
  
  use Locale::RecodeData::_Encode;
  
  This module is internal to libintl.  Do not use directly!
  
  =head1 DESCRIPTION
  
  This module converts text with the help of Encode(3).  It is 
  tried first for conversions if libintl-perl detects the presence
  of Encode.
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::Recode(3), Encode(3), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_RECODEDATA__ENCODE

    $main::fatpacked{"Locale/TextDomain.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_TEXTDOMAIN';
  #! /bin/false
  
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # High-level interface to Perl i18n.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package __TiedTextDomain;
  
  use strict;
  
  sub TIEHASH
  {
      my ($class, $function) = @_;
      bless {
          __function => $function,
      }, $class;
  }
  
  sub FETCH
  {
      my ($self, $msg) = @_;
  
      &{$self->{__function}} ($msg);
  }
  
  sub FIRSTKEY
  {
      my $self = shift;
      my $reset_iterator = keys %$self;
      return scalar each %$self;
  }
  
  sub NEXTKEY
  {
      my $self = shift;
      return scalar each %$self;
  }
  
  sub CLEAR {}
  sub STORE {}
  sub DELETE {}
  
  1;
  
  package Locale::TextDomain;
  
  use strict;
  
  use Locale::Messages qw (textdomain bindtextdomain dgettext dngettext dpgettext dnpgettext);
  use Cwd qw (abs_path);
  
  use vars qw ($VERSION);
  
  $VERSION = '1.31';
  
  require Exporter;
  
  use vars qw (@ISA @EXPORT %__ $__);
  
  @ISA = ('Exporter');
  @EXPORT = qw (__ __x __n __nx __xn __p __px __np __npx $__ %__
                N__ N__n N__p N__np);
  
  my %textdomains = ();
  my %bound_dirs = ();
  my @default_dirs = ();
  
  sub __ ($);
  
  sub __find_domain ($);
  sub __expand ($%);
  sub __tied_gettext ($$);
  
  BEGIN {
      # Tie the hash to gettext().
      tie %__, '__TiedTextDomain', \&__tied_gettext;
      $__ = \%__;
  
  	# Add default search directories, but only if they exist.
  	for my $dir (qw (/usr/share/locale /usr/local/share/locale)) {
          if (-d $dir) {
              @default_dirs = ($dir);
              last;
          }
      }
  }
  
  # Class methods.
  sub keywords {
      join ' ', (
          '--keyword=__',
          '--keyword=%__',
          '--keyword=$__',
          '--keyword=__x',
          '--keyword=__n:1,2',
          '--keyword=__nx:1,2',
          '--keyword=__xn:1,2',
          '--keyword=__p:1c,2',
          '--keyword=__px:1c,2',
          '--keyword=__np:1c,2,3',
          '--keyword=__npx:1c,2,3',
          '--keyword=N__',
          '--keyword=N__n:1,2',
          '--keyword=N__p:1c,2',
          '--keyword=N__np:1c,2,3',
      );
  }
  
  sub flags {
      join ' ', (
          '--flag=__:1:pass-perl-format',
          '--flag=%__:1:pass-perl-format',
          '--flag=$__:1:pass-perl-format',
          '--flag=__x:1:perl-brace-format',
          '--flag=__x:1:pass-perl-format',
          '--flag=__n:1:pass-perl-format',
          '--flag=__n:2:pass-perl-format',
          '--flag=__nx:1:perl-brace-format',
          '--flag=__nx:1:pass-perl-format',
          '--flag=__nx:2:perl-brace-format',
          '--flag=__nx:2:pass-perl-format',
          '--flag=__xn:1:perl-brace-format',
          '--flag=__xn:1:pass-perl-format',
          '--flag=__xn:2:perl-brace-format',
          '--flag=__xn:2:pass-perl-format',
          '--flag=__p:2:pass-perl-format',
          '--flag=__px:2:perl-brace-format',
          '--flag=__px:2:pass-perl-format',
          '--flag=__np:2:pass-perl-format',
          '--flag=__np:3:pass-perl-format',
          '--flag=__npx:2:perl-brace-format',
          '--flag=__npx:2:pass-perl-format',
          '--flag=__npx:3:perl-brace-format',
          '--flag=__npx:3:pass-perl-format',
          '--flag=N__:1:pass-perl-format',
          '--flag=N__n:1:pass-perl-format',
          '--flag=N__n:2:pass-perl-format',
          '--flag=N__p:2:pass-perl-format',
          '--flag=N__np:2:pass-perl-format',
          '--flag=N__np:3:pass-perl-format',
      );
  }
  
  sub options {
      my ($class) = @_;
  
      join ' ', $class->keywords, $class->flags;
  }
  
  # Normal gettext.
  sub __ ($)
  {
      my $msgid = shift;
  
      my $package = caller;
  
      my $textdomain = $textdomains{$package};
  
      __find_domain $textdomain if
  		defined $textdomain && defined $bound_dirs{$textdomain};
  
      return dgettext $textdomain => $msgid;
  }
  
  # Called from tied hash.
  sub __tied_gettext ($$)
  {
      my ($msgid) = @_;
  
      my ($package) = caller (1);
  
      my $textdomain = $textdomains{$package};
      unless (defined $textdomain) {
  		my ($maybe_package, $filename, $line) = caller (2);
  		if (exists $textdomains{$maybe_package}) {
  			warn <<EOF;
  Probable use of \$__ or \%__ where __() should be used at $filename:$line.
  EOF
  		}
  	}
      __find_domain $textdomain if
  		defined $textdomain && defined $bound_dirs{$textdomain};
  
      return dgettext $textdomain => $msgid;
  }
  
  # With interpolation.
  sub __x ($@)
  {
      my ($msgid, %vars) = @_;
  
      my $package = caller;
  
      my $textdomain = $textdomains{$package};
  
      __find_domain $textdomain if
  		defined $textdomain && defined $bound_dirs{$textdomain};
  
      return __expand ((dgettext $textdomain => $msgid), %vars);
  }
  
  # Plural.
  sub __n ($$$)
  {
      my ($msgid, $msgid_plural, $count) = @_;
  
      my $package = caller;
  
      my $textdomain = $textdomains{$package};
  
      __find_domain $textdomain if
  		defined $textdomain && defined $bound_dirs{$textdomain};
  
      return dngettext $textdomain, $msgid, $msgid_plural, $count;
  }
  
  # Plural with interpolation.
  sub __nx ($$$@)
  {
      my ($msgid, $msgid_plural, $count, %args) = @_;
  
      my $package = caller;
  
      my $textdomain = $textdomains{$package};
  
      __find_domain $textdomain if
  		defined $textdomain && defined $bound_dirs{$textdomain};
  
      return __expand ((dngettext $textdomain, $msgid, $msgid_plural, $count),
  					 %args);
  }
  
  # Plural with interpolation.
  sub __xn ($$$@)
  {
      my ($msgid, $msgid_plural, $count, %args) = @_;
  
      my $package = caller;
  
      my $textdomain = $textdomains{$package};
  
      __find_domain $textdomain if
  		defined $textdomain && defined $bound_dirs{$textdomain};
  
      return __expand ((dngettext $textdomain, $msgid, $msgid_plural, $count),
  					 %args);
  }
  
  # Context. (p is for particular or special)
  sub __p ($$)
  {
      my $msgctxt = shift;
      my $msgid = shift;
  
      my $package = caller;
  
      my $textdomain = $textdomains{$package};
  
      __find_domain $textdomain if
  		defined $textdomain && defined $bound_dirs{$textdomain};
  
      return dpgettext $textdomain => $msgctxt, $msgid;
  }
  
  # With interpolation.
  sub __px ($$@)
  {
      my ($msgctxt, $msgid, %vars) = @_;
  
      my $package = caller;
  
      my $textdomain = $textdomains{$package};
  
      __find_domain $textdomain if
  		defined $textdomain && defined $bound_dirs{$textdomain};
  
      return __expand ((dpgettext $textdomain => $msgctxt, $msgid), %vars);
  }
  
  # Context + Plural.
  sub __np ($$$$)
  {
      my ($msgctxt, $msgid, $msgid_plural, $count) = @_;
  
      my $package = caller;
  
      my $textdomain = $textdomains{$package};
  
      __find_domain $textdomain if
  		defined $textdomain && defined $bound_dirs{$textdomain};
  
      return dnpgettext $textdomain, $msgctxt, $msgid, $msgid_plural, $count;
  }
  
  # Plural with interpolation.
  sub __npx ($$$$@)
  {
      my ($msgctxt, $msgid, $msgid_plural, $count, %args) = @_;
  
      my $package = caller;
  
      my $textdomain = $textdomains{$package};
  
      __find_domain $textdomain if
  		defined $textdomain && defined $bound_dirs{$textdomain};
  
      return __expand ((dnpgettext $textdomain, $msgctxt, $msgid, $msgid_plural, $count),
  					 %args);
  }
  
  # Dummy functions for string marking.
  sub N__($)
  {
      return shift;
  }
  
  sub N__n($$$)
  {
      return @_;
  }
  
  sub N__p($$) {
      return @_;
  }
  
  sub N__np($$$$) {
      return @_;
  }
  
  sub import
  {
      my ($self, $textdomain, @search_dirs) = @_;
  
      # Check our caller.
      my $package = caller;
      return if exists $textdomains{$package};
  
      # Was a textdomain specified?
  	$textdomain = textdomain unless defined $textdomain && length $textdomain;
  
      # Remember the textdomain of that package.
      $textdomains{$package} = $textdomain;
  
      # Remember that we still have to bind that textdomain to
      # a directory.
      unless (exists $bound_dirs{$textdomain}) {
  		unless (@search_dirs) {
  			@search_dirs = ((map $_ . '/LocaleData', @INC), @default_dirs)
  				unless @search_dirs;
  			if (my $share = eval {
  				require File::ShareDir;
  				File::ShareDir::dist_dir ($textdomain);
  			}) {
  				unshift @search_dirs,
                          map { "$share/$_" }
                          qw (locale LocaleData);
              }
  		}
  		$bound_dirs{$textdomain} = [grep { -d $_ } @search_dirs];
      }
  
      Locale::TextDomain->export_to_level (1, $package, @EXPORT);
  
      return;
  }
  
  # Private functions.
  sub __find_domain ($)
  {
  	my $domain = shift;
  
  	my $try_dirs = $bound_dirs{$domain};
  
  	if (defined $try_dirs) {
  		my $found_dir = '';
  
  		TRYDIR: foreach my $dir (map { abs_path $_ } grep { -d $_ } @$try_dirs) {
  			# Is there a message catalog?  We have to search recursively
  			# for it.  Since globbing is reported to be buggy under
  			# MS-DOS, we roll our own version.
  			local *DIR;
  			if (opendir DIR, $dir) {
  				my @files = map { "$dir/$_/LC_MESSAGES/$domain.mo" }
  					grep { ! /^\.\.?$/ } readdir DIR;
  
  				foreach my $file (@files) {
  					if (-f $file || -l $file) {
  						# If we find a non-readable file on our way,
  						# we access has been disabled on purpose.
  						# Therefore no -r check here.
  						$found_dir = $dir;
  						last TRYDIR;
  					}
  				}
  			}
  		}
  
  		#print "D:found_dir=$found_dir, domain=$domain\n";
          # If there was no success, this will fall back to the default search
  		# directories.
  		bindtextdomain $domain => $found_dir;
      }
  
      # The search has completed.
      undef $bound_dirs{$domain};
  
      return 1;
  }
  
  sub __expand ($%)
  {
      my ($translation, %args) = @_;
  
      my $re = join '|', map { quotemeta $_ } keys %args;
      $translation =~ s/\{($re)\}/defined $args{$1} ? $args{$1} : "{$1}"/ge;
  
      return $translation;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::TextDomain - Perl Interface to Uniforum Message Translation
  
  =head1 SYNOPSIS
  
   use Locale::TextDomain ('my-package', @locale_dirs);
  
   use Locale::TextDomain qw (my-package);
  
   my $translated = __"Hello World!\n";
  
   my $alt = $__{"Hello World!\n"};
  
   my $alt2 = $__->{"Hello World!\n"};
  
   my @list = (N__"Hello",
               N__"World");
  
   printf (__n ("one file read",
                "%d files read",
                $num_files),
           $num_files);
  
   print __nx ("one file read", "{num} files read", $num_files,
               num => $num_files);
  
   my $translated_context = __p ("Verb, to view", "View");
  
   printf (__np ("Files read from filesystems",
                 "one file read",
                 "%d files read",
                 $num_files),
           $num_files);
  
   print __npx ("Files read from filesystems",
                "one file read",
                "{num} files read",
                $num_files,
                num => $num_files);
  
  
  =head1 DESCRIPTION
  
  The module Locale::TextDomain(3pm) provides a high-level interface
  to Perl message translation.
  
  =head2 Textdomains
  
  When you request a translation for a given string, the system used
  in libintl-perl follows a standard strategy to find a suitable message
  catalog containing the translation: Unless you explicitely define
  a name for the message catalog, libintl-perl will assume that your
  catalog is called 'messages' (unless you have changed the default
  value to something else via Locale::Messages(3pm), method textdomain()).
  
  You might think that his default strategy leaves room for optimization
  and you are right.  It would be a lot smarter if multiple software
  packages, all with their individual message catalogs, could be installed
  on one system, and it should also be possible that third-party
  components of your software (like Perl modules) can load their
  message catalogs, too, without interfering with yours.
  
  The solution is clear, you have to assign a unique name to your message
  database, and you have to specify that name at run-time.  That unique
  name is the so-called I<textdomain> of your software package.  The name is
  actually arbitrary but you should follow these best-practice guidelines
  to ensure maximum interoperability:
  
  =over 8
  
  =item File System Safety
  
  In practice, textdomains get mapped into file names, and you should
  therefore make sure that the textdomain you choose is a valid filename
  on every system that will run your software.
  
  =item Case-sensitivity
  
  Textdomains are always case-sensitive (i. e. 'Package' and 'PACKAGE'
  are not the same).  However, since the message catalogs will be stored
  on file systems, that may or may not distinguish case when looking
  up file names, you should avoid potential conflicts here.
  
  =item Textdomain Should Match CPAN Name
  
  If your software is listed as a module on CPAN, you should simply
  choose the name on CPAN as your textdomain.  The textdomain for
  libintl-perl is hence 'libintl-perl'.  But please replace all
  periods ('.') in your package name with an underscore because ...
  
  =item Internet Domain Names as a Fallback
  
  ... if your software is I<not> a module listed on CPAN, as a last
  resort you should use the Java(tm) package scheme, i. e. choose
  an internet domain that you are owner of (or ask the owner of an
  internet domain) and concatenate your preferred textdomain with the
  reversed internet domain.  Example: Your company runs the web-site
  'www.foobar.org' and is the owner of the domain 'foobar.org'.  The
  textdomain for your company's software 'barfoos' should hence be
  'org.foobar.barfoos'.
  
  =back
  
  If your software is likely to be installed in different versions on
  the same system, it is probably a good idea to append some version
  information to your textdomain.
  
  Other systems are less strict with the naming scheme for textdomains
  but the phenomena known as Perl is actually a plethora of small,
  specialized modules and it is probably wisest to postulate some
  namespace model in order to avoid chaos.
  
  =head2 Binding textdomains to directories
  
  Once the system knows the I<textdomain> of the message that you
  want to get translated into the user's language, it still has to
  find the correct message catalog.  By default, libintl-perl will
  look up the string in the translation database found in the
  directories F</usr/share/locale> and F</usr/local/share/locale>
  (in that order).
  
  It is neither guaranteed that these directories exist on the target
  machine, nor can you be sure that the installation routine has write
  access to these locations.  You can therefore instruct libintl-perl
  to search other directories prior to the default directories.  Specifying
  a differnt search directory is called I<binding> a textdomain to a
  directory.
  
  Beginning with version 1.20, B<Locale::TextDomain> extends the default
  strategy by a Perl-specific approach.  If L<File::ShareDir> is installed, it
  will look in the subdirectories named F<locale> and F<LocaleData> (in that
  order) in the directory returned by C<File::ShareDir::dist_dir ($textdomain)>
  (if L<File::ShareDir> is installed),
  and check for a database containing the message for your textdomain there.
  This allows you to install your database in the Perl-specific shared directory
  using L<Module::Install>'s C<install_share> directive or the Dist::Zilla
  L<ShareDir plugin|Dist::Zilla::Plugin::ShareDir>.
  
  If L<File::ShareDir> is not availabe, or if Locale::TextDomain fails to find
  the translation files in the L<File::ShareDir> directory, it will next look in
  every directory found in the standard include path C<@INC>, and check for a
  database containing the message for your textdomain there. Example: If the
  path F</usr/lib/perl/5.8.0/site_perl> is in your C<@INC>, you can install your
  translation files in F</usr/lib/perl/5.8.0/site_perl/LocaleData>, and they
  will be found at run-time.
  
  =head1 USAGE
  
  It is crucial to remember that you use Locale::TextDomain(3) as
  specified in the section L</SYNOPSIS>, that means you have to
  B<use> it, not B<require> it.  The module behaves quite differently
  compared to other modules.
  
  The most significant difference is the meaning of the list passed
  as an argument to the use() function.  It actually works like this:
  
      use Locale::TextDomain (TEXTDOMAIN, DIRECTORY, ...)
  
  The first argument (the first string passed to use()) is the textdomain
  of your package, optionally followed by a list of directories to search
  I<instead> of the Perl-specific directories (see above: F</LocaleData>
  appended to a F<File::ShareDir> directory and every path in C<@INC>).
  
  If you are the author of a package 'barfoos', you will probably put
  the line
  
      use Locale::TextDomain 'barfoos';
  
  resp. for non-CPAN modules
  
      use Locale::TextDomain 'org.foobar.barfoos';
  
  in every module of your package that contains translatable strings. If
  your module has been installed properly, including the message catalogs,
  it will then be able to retrieve these translations at run-time.
  
  If you have not installed the translation database in a directory
  F<LocaleData> in the L<File::ShareDir> directory or the standard include
  path C<@INC> (or in the system directories F</usr/share/locale> resp.
  F</usr/local/share/locale>), you have to explicitely specify a search
  path by giving the names of directories (as strings!) as additional
  arguments to use():
  
      use Locale::TextDomain qw (barfoos ./dir1 ./dir2);
  
  Alternatively you can call the function bindtextdomain() with suitable
  arguments (see the entry for bindtextdomain() in
  L<Locale::Messages/FUNCTIONS>).  If you do so, you should pass
  C<undef> as an additional argument in order to avoid unnecessary
  lookups:
  
      use Locale::TextDomain ('barfoos', undef);
  
  You see that the arguments given to use() have nothing to do with
  what is imported into your namespace, but they are rather arguments
  to textdomain(), resp. bindtextdomain().  Does that mean that
  B<Locale::TextDomain> exports nothing into your namespace? Umh, not
  exactly ... in fact it imports I<all> functions listed below into
  your namespace, and hence you should not define conflicting functions
  (and variables) yourself.
  
  So, why has Locale::TextDomain to be different from other modules?
  If you have ever written software in C and prepared it for
  internationalization (i18n), you will probably have defined some
  preprocessor macros like:
  
      #define _(String) dgettext ("my-textdomain", String)
      #define N_(String) String
  
  You only have to define that once in C, and the textdomain for your
  package is automatically inserted into all gettext functions.  In
  Perl there is no such mechanism (at least it is not portable,
  option -P) and using the gettext functions could become quite
  cumbersome without some extra fiddling:
  
      print dgettext ("my-textdomain", "Hello world!\n");
  
  This is no fun.  In C it would merely be a
  
      printf (_("Hello world!\n"));
  
  Perl has to be more concise and shorter than C ... see the next
  section for how you can use B<Locale::TextDomain> to end up in Perl
  with a mere
  
      print __"Hello World!\n";
  
  =head1 EXPORTED FUNCTIONS
  
  All functions have quite funny names on purpose.  In fact the
  purpose for that is quite clear: They should be short, operator-like,
  and they should not yell for conflicts with existing functions in
  I<your> namespace.  You will understand it, when you internationalize
  your first Perl program or module.  Preparing it is more like marking
  strings as being translatable than inserting function calls.  Here
  we go:
  
  =over 4
  
  =item B<__ MSGID>
  
  B<NOTE:> This is a I<double> underscore!
  
  The basic and most-used function.  It is a short-cut for a call
  to gettext() resp. dgettext(), and simply returns the translation for
  B<MSGID>.  If your old code reads like this:
  
      print "permission denied";
  
  You will now write:
  
      print __"permission denied";
  
  That's all, the string will be output in the user's preferred language,
  provided that you have installed a translation for it.
  
  Of course you can also use parentheses:
  
      print __("permission denied");
  
  Or even:
  
      print (__("permission denied"));
  
  In my eyes, the first version without parentheses looks best.
  
  =item B<__x MSGID, ID1 =E<gt> VAL1, ID2 =E<gt> VAL2, ...>
  
  One of the nicest features in Perl is its capability to interpolate
  variables into strings:
  
      print "This is the $color $thing.\n";
  
  This nice feature might con you into thinking that you could now
  write
  
      print __"This is the $color $thing.\n";
  
  Alas, that would be nice, but it is not possible.  Remember that the
  function __() serves both as an operator for translating strings
  I<and> as a mark for translatable strings.  If the above string would
  get extracted from your Perl code, the un-interpolated form would
  end up in the message catalog because when parsing your code it
  is unpredictable what values the variables C<$thing> and C<$color>
  will have at run-time (this fact is most probably one of the reasons
  you have written your program for).
  
  However, at run-time, Perl will have interpolated the values already
  I<before> __() (resp. the underlying gettext() function) has seen the
  original string.  Consequently something like "This is the red car.\n"
  will be looked up in the message catalog, it will not be found (because
  only "This is the $color $thing.\n" is included in the database),
  and the original, untranslated string will be returned.
  Honestly, because this is almost always an error, the xgettext(1)
  program will bail out with a fatal error when it comes across that
  string in your code.
  
  There are two workarounds for that:
  
      printf __"This is the %s %s.\n", $color, $thing;
  
  But that has several disadvantages: Your translator will only
  see the isolated string, and without the surrounding code it
  is almost impossible to interpret it correctly.  Of course, GNU
  emacs and other software capable of editing PO translation files
  will allow you to examine the context in the source code, but it
  is more likely that your translator will look for a less challenging
  translation project when she frequently comes across such messages.
  
  And even if she does understand the underlying programming, what
  if she has to reorder the color and the thing like in French:
  
      msgid "This is the red car.\n";
      msgstr "Cela est la voiture rouge.\n"
  
  Zut alors! While it is possible to reorder the arguments to printf()
  and friends, it requires a syntax that is is nothing that you want to
  learn.
  
  So what? The Perl backend to GNU gettext has defined an alternative
  format for interpolatable strings:
  
      "This is the {color} {thing}.\n";
  
  Instead of Perl variables you use place-holders (legal Perl variables
  are also legal place-holders) in curly braces, and then you call
  
      print __x ("This is the {color} {thing}.\n",
                 thing => $thang,
                 color => $color);
  
  The function __x() will take the additional hash and replace all
  occurencies of the hash keys in curly braces with the corresponding
  values.  Simple, readable, understandable to translators, what else
  would you want?  And if the translator forgets, misspells or otherwise
  messes up some "variables", the msgfmt(1) program, that is used to
  compile the textual translation file into its binary representation
  will even choke on these errors and refuse to compile the translation.
  
  =item B<__n MSGID, MSGID_PLURAL, COUNT>
  
  Whew! That looks complicated ... It is best explained with an example.
  We'll have another look at your vintage code:
  
      if ($files_deleted > 1) {
          print "All files have been deleted.\n";
      } else {
          print "One file has been deleted.\n";
      }
  
  Your intent is clear, you wanted to avoid the cumbersome
  "1 files deleted".  This is okay for English, but other languages
  have more than one plural form.  For example in Russian it makes
  a difference whether you want to say 1 file, 3 files or 6 files.
  You will use three different forms of the noun 'file' in each
  case.  [Note: Yep, very smart you are, the Russian word for 'file'
  is in fact the English word, and it is an invariable noun, but if you
  know that, you will also understand the rest despite this little
  simplification ...].
  
  That is the reason for the existance of the function ngettext(),
  that __n() is a short-cut for:
  
      print __n"One file has been deleted.\n",
               "All files have been deleted.\n",
               $files_deleted;
  
  Alternatively:
  
      print __n ("One file has been deleted.\n",
                 "All files have been deleted.\n",
                 $files_deleted);
  
  The effect is always the same: libintl-perl will find out which
  plural form to pick for your user's language, and the output string
  will always look okay.
  
  =item B<__nx MSGID, MSGID_PLURAL, COUNT, VAR1 =E<gt> VAL1, VAR2 =E<gt> VAL2, ...>
  
  Bringing it all together:
  
      print __nx ("One file has been deleted.\n",
                  "{count} files have been deleted.\n",
                  $num_files,
                  count => $num_files);
  
  The function __nx() picks the correct plural form (also for English!)
  I<and> it is capable of interpolating variables into strings.
  
  Have a close look at the order of arguments: The first argument is the
  string in the singular, the second one is the plural string. The third
  one is an integer indicating the number of items.  This third argument
  is I<only> used to pick the correct translation.  The optionally
  following arguments make up the hash used for interpolation.  In the
  beginning it is often a little confusing that the variable holding the
  number of items will usually be repeated somewhere in the interpolation
  hash.
  
  =item B<__xn MSGID, MSGID_PLURAL, COUNT, VAR1 =E<gt> VAL1, VAR2 =E<gt> VAL2, ...>
  
  Does exactly the same thing as __nx().  In fact it is a common typo
  promoted to a feature.
  
  =item B<__p MSGCTXT, MSGID>
  
  This is much like __. The "p" stands for "particular", and the MSGCTXT
  is used to provide context to the translator. This may be neccessary
  when your string is short, and could stand for multiple things. For example:
  
      print __p"Verb, to view", "View";
      print __p"Noun, a view", "View";
  
  The above may be "View" entries in a menu, where View->Source and File->View
  are different forms of "View", and likely need to be translated differently.
  
  A typical usage are GUI programs.  Imagine a program with a main
  menu and the notorious "Open" entry in the "File" menu.  Now imagine,
  there is another menu entry Preferences->Advanced->Policy where you have
  a choice between the alternatives "Open" and "Closed".  In English, "Open"
  is the adequate text at both places.  In other languages, it is very
  likely that you need two different translations.  Therefore, you would
  now write:
  
      __p"File|", "Open";
      __p"Preferences|Advanced|Policy", "Open";
  
  In English, or if no translation can be found, the second argument
  (MSGID) is returned.
  
  This function was introduced in libintl-perl 1.17.
  
  =item B<__px MSGCTXT, MSGID, VAR1 =E<gt> VAL1, VAR2 =E<gt> VAL2, ...>
  
  Like __p(), but supports variable substitution in the string, like __x().
  
      print __px("Verb, to view", "View {file}", file => $filename);
  
  See __p() and __x() for more details.
  
  This function was introduced in libintl-perl 1.17.
  
  =item B<__np MSGCTXT, MSGID, MSGID_PLURAL, COUNT>
  
  This adds context to plural calls. It should not be needed very often,
  if at all, due to the __nx() function. The type of variable substitution
  used in other gettext libraries (using sprintf-like sybols, like %s or %1)
  sometimes required context. For a (bad) example of this:
  
      printf (__np("[count] files have been deleted",
                  "One file has been deleted.\n",
                  "%s files have been deleted.\n",
                  $num_files),
              $num_files);
  
  NOTE: The above usage is discouraged. Just use the __nx() call, which
  provides inline context via the key names.
  
  This function was introduced in libintl-perl 1.17.
  
  =item B<__npx MSGCTXT, MSGID, MSGID_PLURAL, COUNT, VAR1 =E<gt> VAL1, VAR2 =E<gt> VAL2, ...>
  
  This is provided for comleteness. It adds the variable interpolation
  into the string to the previous method, __np().
  
  It's usage would be like so:
  
      print __npx ("Files being permenantly removed",
                   "One file has been deleted.\n",
                   "{count} files have been deleted.\n",
                   $num_files,
                   count => $num_files);
  
  I cannot think of any situations requiring this, but we can easily
  support it, so here it is.
  
  This function was introduced in libintl-perl 1.17.
  
  =item B<N__(ARG1)>
  
  A no-op function that simply echoes its arguments to the caller.  Take
  the following piece of Perl:
  
      my @options = (
          "Open",
          "Save",
          "Save As",
      );
  
      ...
  
      my $option = $options[1];
  
  Now say that you want to have this translatable.  You could sometimes
  simply do:
  
      my @options = (
          __"Open",
          __"Save",
          __"Save As",
      );
  
      ...
  
      my $option = $options[1];
  
  But often times this will not be what you want, for example when you
  also need the unmodified original string.  Sometimes it may not even
  work, for example, when the preferred user language is not yet
  determined at the time that the list is initialized.
  
  In these cases you would write:
  
      my @options = (
          N__"Open",
          N__"Save",
          N__"Save As",
      );
  
      ...
  
      my $option = __($options[1]);
      # or: my $option = dgettext ('my-domain', $options[1]);
  
  Now all the strings in C<@options> will be left alone, since N__()
  returns its arguments (one ore more) unmodified.  Nevertheless, the
  string extractor will be able to recognize the strings as being
  translatable.  And you can still get the translation later by passing
  the variable instead of the string to one of the above translation
  functions.
  
  =item B<N__n (MSGID, MSGID_PLURAL, COUNT)>
  
  Does exactly the same as N__().  You will use this form if you have
  to mark the strings as having plural forms.
  
  =item B<N__p (MSGCTXT, MSGID)>
  
  Marks B<MSGID> as N__() does, but in the context B<MSGCTXT>.
  
  =item B<N__np (MSGCTXT, MSGID, MSGID_PLURAL, COUNT)>
  
  Marks B<MSGID> as N__n() does, but in the context B<MSGCTXT>.
  =back
  
  =head1 EXPORTED VARIABLES
  
  The module exports several variables into your namespace:
  
  =over 4
  
  =item B<%__>
  
  A tied hash.  Its keys are your original messages, the values are
  their translations:
  
      my $title = "<h1>$__{'My Homepage'}</h1>";
  
  This is much better for your translation team than
  
      my $title = __"<h1>My Homepage</h1>";
  
  In the second case the HTML code will make it into the translation
  database and your translators have to be aware of HTML syntax when
  translating strings.
  
  B<Warning:> Do I<not> use this hash outside of double-quoted strings!
  The code in the tied hash object relies on the correct working of
  the function caller() (see "perldoc -f caller"), and this function
  will report incorrect results if the tied hash value is the argument
  to a function from another package, for example:
  
    my $result = Other::Package::do_it ($__{'Some string'});
  
  The tied hash code will see "Other::Package" as the calling package,
  instead of your own package.  Consequently it will look up the message
  in the wrong text domain.  There is no workaround for this bug.
  Therefore:
  
  Never use the tied hash interpolated strings!
  
  =item B<$__>
  
  A reference to C<%__>, in case you prefer:
  
       my $title = "<h1>$__->{'My Homepage'}</h1>";
  
  =back
  
  =head1 CLASS METHODS
  
  The following class methods are defined:
  
  =over 4
  
  =item B<options>
  
  Returns a space-separated list of all '--keyword' and all '--flag' options
  for B<xgettext(1)>, when extracing strings from Perl source files localized
  with B<Locale::TextDomain>.
  
  The option should rather be called B<xgettextDefaultOptions>.  With regard
  to the typical use-case, a shorter name has been picked:
  
      xgettext `perl -MLocale::TextDomain -e 'print Locale::TextDomain->options'`
  
  See L<https://www.gnu.org/software/gettext/manual/html_node/xgettext-Invocation.html>
  for more information about the xgettext options '--keyword' and '--flag'.
  
  If you want to disable the use of the xgettext default keywords, you
  should pass an option '--keyword=""' to xgettext before the options returned
  by this method.
  
  If you doubt the usefulness of this method, check the output on the
  command-line:
  
      perl -MLocale::TextDomain -e 'print Locale::TextDomain->options'
  
  Nothing that you want to type yourself.
  
  This method was added in libintl-perl 1.28.
  
  =item B<keywords>
  
  Returns a space-separated list of all '--keyword' options for B<xgettext(1)>
  so that all translatable strings are properly extracted.
  
  This method was added in libintl-perl 1.28.
  
  =item B<flags>
  
  Returns a space-separated list of all '--flag' options for B<xgettext(1)>
  so that extracted strings are properly flagged.
  
  This method was added in libintl-perl 1.28.
  
  =back
  
  =head1 PERFORMANCE
  
  Message translation can be a time-consuming task.  Take this little
  example:
  
      1: use Locale::TextDomain ('my-domain');
      2: use POSIX (:locale_h);
      3:
      4: setlocale (LC_ALL, '');
      5: print __"Hello world!\n";
  
  This will usually be quite fast, but in pathological cases it may
  run for several seconds.  A worst-case scenario would be a
  Chinese user at a terminal that understands the codeset Big5-HKSCS.
  Your translator for Chinese has however chosen to encode the translations
  in the codeset EUC-TW.
  
  What will happen at run-time?  First, the library will search and load a
  (maybe large) message catalog for your textdomain 'my-domain'.  Then
  it will look up the translation for "Hello world!\n", it will find that
  it is encoded in EUC-TW.  Since that differs from the output codeset
  Big5-HKSCS, it will first load a conversion table containing several
  ten-thousands of codepoints for EUC-TW, then it does the same with
  the smaller, but still very large conversion table for Big5-HKSCS,
  it will convert the translation on the fly from EUC-TW into Big5-HKSCS,
  and finally it will return the converted translation.
  
  A worst-case scenario but realistic.  And for these five lines of codes,
  there is not much you can do to make it any faster.  You should understand,
  however, I<when> the different steps will take place, so that you can
  arrange your code for it.
  
  You have learned in the section L</DESCRIPTION> that line 1 is
  responsible for locating your message database.  However, the
  use() will do nothing more than remembering your settings.  It will
  not search any directories, it will not load any catalogs or
  conversion tables.
  
  Somewhere in your code you will always have a call to
  POSIX::setlocale(), and the performance of this call may be time-consuming,
  depending on the architecture of your system.  On some systems, this
  will consume very little time, on others it will only consume a
  considerable amount of time for the first call, and on others it may
  always be time-consuming.  Since you cannot know, how setlocale() is
  implemented on the target system, you should reduce the calls to
  setlocale() to a minimum.
  
  Line 5 requests the translation for your string.  Only now, the library
  will actually load the message catalog, and only now will it load
  eventually needed conversion tables.  And from now on, all this information
  will be cached in memory.  This strategy is used throughout libintl-perl,
  and you may describe it as 'load-on-first-access'.  Getting the next
  translation will consume very little resources.
  
  However, although the translation retrieval is somewhat obfuscated
  by an operator-like function call, it is still a function call, and in
  fact it even involves a chain of function calls.  Consequently, the
  following example is probably bad practice:
  
      foreach (1 .. 100_000) {
          print __"Hello world!\n";
      }
  
  This example introduces a lot of overhead into your program.  Better
  do this:
  
      my $string = __"Hello world!\n";
      foreach (1 .. 100_000) {
          print $string;
      }
  
  The translation will never change, there is no need to retrieve it
  over and over again.  Although libintl-perl will of course cache
  the translation read from the file system, you can still avoid the
  overhead for the function calls.
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::Messages(3pm), Locale::gettext_pp(3pm), perl(1),
  gettext(1), gettext(3)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_TEXTDOMAIN

    $main::fatpacked{"Locale/TextDomain/UTF8.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_TEXTDOMAIN_UTF8';
  package Locale::TextDomain::UTF8;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2019-12-26'; # DATE
  our $DIST = 'Locale-TextDomain-UTF8'; # DIST
  our $VERSION = '0.020'; # VERSION
  
  # IFUNBUILT
  # use strict;
  # use warnings;
  # END IFUNBUILT
  
  use Encode             ();
  use Locale::Messages   ();
  
  $ENV{OUTPUT_CHARSET} = 'UTF-8';
  sub import {
      my ($class, $textdomain, @search_dirs) = @_;
  
      my $pkg = caller;
  
      eval qq[package $pkg; use Locale::TextDomain \$textdomain, \@search_dirs;];
      die if $@;
      Locale::Messages::bind_textdomain_filter(
          $textdomain, \&Encode::decode_utf8);
  }
  
  1;
  # ABSTRACT: Shortcut to use Locale::TextDomain and decoding to UTF8
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Locale::TextDomain::UTF8 - Shortcut to use Locale::TextDomain and decoding to UTF8
  
  =head1 VERSION
  
  This document describes version 0.020 of Locale::TextDomain::UTF8 (from Perl distribution Locale-TextDomain-UTF8), released on 2019-12-26.
  
  =head1 SYNOPSIS
  
  Instead of:
  
   use Locale::TextDomain 'Some-TextDomain';
  
  you now say:
  
   use Locale::TextDomain::UTF8 'Some-TextDomain';
  
  =head1 DESCRIPTION
  
   use Locale::TextDomain::UTF8 'Some-TextDomain'
  
  is equivalent to:
  
   use Locale::TextDomain 'Some-TextDomain';
   use Locale::Messages qw(bind_textdomain_filter);
   use Encode;
   BEGIN {
       $ENV{OUTPUT_CHARSET} = 'UTF-8';
       bind_textdomain_filter 'Some-TextDomain' => \&Encode::decode_utf8;
   }
  
  it's just more convenient, especially if you have to do it for each textdomain.
  
  Why would you want this? To ensure that strings returned by the C<__()>, et al
  functions are UTF8-encoded Perl strings. For example, if you want to pass the
  strings to L<Unicode::GCString>. For more details, see the Perl Advent article
  mentioned in the SEE ALSO section.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Locale-TextDomain-UTF8>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Locale-TextDomain-UTF8>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Locale-TextDomain-UTF8>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Locale::TextDomain::UTF8::IfEnv>
  
  L<Locale::TextDomain>
  
  L<Locale::Messages>
  
  L<http://www.perladvent.org/2013/2013-12-09.html>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2019, 2013 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
LOCALE_TEXTDOMAIN_UTF8

    $main::fatpacked{"Locale/Util.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_UTIL';
  #! /bin/false
  
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Portable methods for locale handling.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::Util;
  
  use strict;
  
  use constant DEBUG => 0;
  
  use base qw (Exporter);
  
  use vars qw (@EXPORT_OK);
  
  @EXPORT_OK = qw (parse_http_accept_language
  				 parse_http_accept_charset
  				 set_locale set_locale_cache get_locale_cache
  				 web_set_locale);
  
  # The following list maps languages to a rough guess of the country that
  # is most likely to be meant if no locale info for the country alone is
  # found.  I have assembled the list to the best of my knowledge, preferring
  # the country that has the language as its official language, and in doubt
  # listing the country that has the most speakers of that language.  Corrections
  # are welcome.
  use constant LANG2COUNTRY => {
      aa => 'ET', # Afar => Ethiopia
      ab => 'AB', # Abkhazian => Georgia
      # ae => '??', # Avestan => ??, Iran?
      af => 'za',  # Afrikaans => South Africa
      am => 'ET', # Amharic => Ethiopia
      ar => 'EG', # Arabic => Egypt
      as => 'IN', # Assamese => India
      ay => 'BO', # Aymara => Bolivia
      az => 'AZ', # Azerbaijani => Azerbaijan
      ba => 'RU', # Bashkir => Russia
      be => 'BY', # Belarusian => Belarus
      bg => 'BG', # Bulgarian => Bulgaria
      bh => 'IN', # Bihari => India
      bi => 'VU', # Bislama => Vanuatu
      bn => 'BD', # Bengali => Bangladesh
      bo => 'CN', # Tibetan => China
      br => 'FR', # Breton => France
      bs => 'BA', # Bosnian => Bosnia and Herzegovina
      ca => 'ES', # Catalan => Spain
      ce => 'RU', # Chechen => Russia
      ch => '??', # Chamorro => Guam (or mp?)
      co => 'FR', # Corsican => France
      cs => 'CZ', # Czech => Czech Republic
      cu => 'BG', # Church Slavic => Bulgaria
      cv => 'RU', # Chuvash => Russia
      cy => 'GB', # Welsh => United Kingdom
      da => 'DK', # Danish => Denmark
      de => 'DE', # German => Germany
      dz => 'BT', # Dzongkha => Bhutan
      el => 'GR', # Greek => Greece
      en => 'US', # English => United States
      es => 'ES', # Actually Mexico and the US have more Spanish speakers
                  # than Spain.  But it can be assumed that they either add
                  # the country to their browser settings or will not care
                  # to much.
      et => 'EE', # Estonian => Estonia
      fa => 'IR', # Iran, Islamic Republic of
      fi => 'FI', # Finnish => Finland
      fj => 'FJ', # Fijian => Fiji
      fo => 'FO', # Faeroese => Faroe Islands
      fr => 'FR', # French => France
      fy => 'FY', # Frisian => Netherlands
      ga => 'IE', # Irish => Ireland
      gd => 'GB', # Gaelic (Scots) => United Kingdom
      gl => 'ES', # Gallegan => Spain
      gn => 'PY', # Guarani => Paraguay
      gu => 'IN', # Gujarati => IN
      gv => 'GB', # Manx => United Kingdom
      ha => 'NE', # Hausa => Niger (ng?)
      he => 'IL', # Hebrew => Israel
      hi => 'IN', # Hindi => India
      ho => 'PG', # Hiri Motu => Papua New Guinea
      hr => 'HR', # Croatian
      hu => 'HU', # Hungarian => Hungary
      hy => 'AM', # Armenian => Armenia
      hz => 'NA', # Herero => Namibia
      # ia => '??', # Interlingua (aka "latino sine flexione") => ??
      id => 'ID', # Indonesian => Indonesia
      # ie => '??', # Interlingue => ???
      ik => 'US', # Inupiaq => United States
      is => 'IS', # Icelandic => Iceland
      it => 'IT', # Italian => Italy
      iu => 'CA', # Inuktitut => Canada
      iw => 'IL', # Hebrew => Israel
      ja => 'JP', # Japanese => Japan
      jw => 'ID', # Javanese => Indonesia
      ka => 'GE', # Georgian => Georgia
      ki => 'KE', # Kikuyu => Kenya
      kj => 'AO', # Kuanyama => Angola (na?)
      kk => 'KZ', # Kazakh => Kazakhstan
      kl => 'GL', # Kalaallisut => Greenland
      km => 'KH', # Khmer => Cambodia
      kn => 'IN', # Kannada => India
      ko => 'KR', # Korean => Korea, Republic of (more speakers than North Korea)
      ks => 'IN', # Kashmiri => India
      ku => 'TR', # Kurdish => Turkey
      kv => 'RU', # Komi => Russia
      kw => 'GB', # Cornish => United Kingdom
      ky => 'KG', # Kirghyz => Kyrgyzstan
      la => 'VA', # Latin => Holy See (Vatican City State)
      lb => 'LU', # Letzeburgesch => Luxembourg
      ln => 'CG', # Lingala => Republic of the Congo (cd?)
      lo => 'LA', # Lao => Lao People's Democratic Republic
      lt => 'LT', # Lithuanian => Lithuania
      lv => 'LV', # Latvian => Latvia
      mg => 'MG', # Malagasy => Madagascar
      mh => 'MH', # Marshall => Marshall Islands
      mi => 'NZ', # Maori => New Zealand
      mk => 'MK', # Macedonian => Macedonia, the Former Yugoslav Republic of
      ml => 'IN', # Malayalam => India
      mn => 'MN', # Mongolian => Mongolia
      mr => 'IN', # Marathi => India
      ms => 'MY', # Malay => Malaysia (FIXME: not really sure ...)
      mt => 'MT', # Maltese => Malta
      my => 'MM', # Burmese => Myanmar
      na => 'NR', # Nauru => Nauru
      nb => 'NO', # Norwegian Bokmål => Norway
      nd => 'ZA', # Ndebele, North => South Africa
      ne => 'NP', # Nepali => Nepal
      ng => 'NA', # Ndonga => Namibia
      nl => 'NL', # Dutch => Netherlands
      nn => 'NO', # Norwegian Nynorsk => Norway
      no => 'NO', # Norwegian => Norway
      nr => 'ZA', # Ndebele, South => South Africa
      nv => 'US', # Navajo => United States
      ny => 'MW', # Chichewa; Nyanja => Malawi
      oc => 'FR', # Occitan (post 1500) => France
      om => 'ET', # Oromo => Ethiopia
      or => 'IN', # Oriya => India
      os => 'RU', # Ossetian; Ossetic => Russia (FIXME: Or Georgia?)
      pa => 'IN', # Panjabi => India
      pi => 'IN', # Pali => India (FIXME: Or Thailand, Sri Lanka, Myanmar,
                  # Cambodia)
      pl => 'PL', # Polish => Poland
      ps => 'PK', # Pushto => Pakistan
      pt => 'PT', # Portuguese => Portugal (following our rules this should
                  # actually be Brazil but that would be to unrealistic,
                  # people from Brazil set their locale to pt_BR).
      qu => 'PE', # Quechua => Peru
      rm => 'CH', # Rhaeto-Romance => Switzerland
      rn => 'RW', # Rundi => Rwanda
      ro => 'RO', # Romanian => Romania
      ru => 'RU', # Russian => Russia
      rw => 'RW', # Kinyarwanda => Rwanda
      sa => 'IN', # Sanskrit => India
      sc => 'IT', # Sardinian => Italy
      sd => 'IN', # Sindhi => India
      se => 'SE', # Sami => Sweden (Totally unsure here.  The Sami languages 
  	            # are also spoken in Norway, Finland and Russia, but the 
                  # largest part of the area seems to be in Sweden. 
      sg => '??', # Sango => Central African Republic
      si => 'LK', # Sinhalese => Sri Lanka
      sk => 'SK', # Slovakian => Slovakia
      sl => 'SI', # Slovenian => Slovenia
      sm => 'WS', # Samoan => Samoa
      sh => 'ZW', # Shona => Zimbabwe (FIXME: Rather Mozambique?)
      so => 'SO', # Somali => Somalia
      sq => 'AL', # Albanian => Albania
      sr => 'YU', # Serbian => Yugoslavia
      ss => '??', # Swati => Swaziland (za?)
      st => 'LS', # Sotho => Lesotho
      su => 'IN', # Sundanese => Indonesia
      sv => 'SE', # Swedish => Sweden
      sw => 'TZ', # Suaheli => Tanzania, United Republic of
      ta => 'LK', # Tamil => Sri Lanka
      te => 'IN', # Telugu => India
      tg => 'TJ', # Tajik => Tajikistan
      th => 'TH', # Thai => Thailand
      ti => 'ER', # Tigrinya => Eritrea
      tk => 'TM', # Turkmen => Turkmenistan
      tl => 'PH', # Tagalog => Philippines
      tn => 'BW', # Tswana => Botswana
      to => 'TO', # Tonga => Tonga
      tr => 'TR', # Turkish => Turkish
      tt => 'RU', # Tatar => Russia
      tw => 'GH', # Twi => Ghana
      ug => 'CN', # Uighur => China
      uk => 'UA', # Ukrainian => Ukraine
      ur => 'PK', # Urdu => Pakistan
      uz => 'UZ', # Uzbek => Uzbekistan
      vi => 'VN', # Vietnamese => Vietnam
      # vo => '??', # Volapuk => Nowhere
      wo => 'SN', # Wolof => Senegal
      xh => 'ZA', # Xhosa => South Africa
      yi => 'IL', # Yiddish => Israel (FIXME: Rather United States?)
      yo => 'NG', # Yoruba => Nigeria
      za => 'CN', # Zhuang => China
      zh => 'CN', # Chinese => China
      zu => 'ZA', # Zulu => South Africa
  };
  
  use constant WIN32LANGUAGE => {
      aa => "Afar",
      ab => "Abkhazian",
      ae => "Avestan",
      af => "Afrikaans",
      am => "Amharic",
      ar => "Arabic",
      as => "Assamese",
      ay => "Aymara",
      az => "Azerbaijani",
      ba => "Bashkir",
      be => "Belarusian",
      bg => "Bulgarian",
      bh => "Bihari",
      bi => "Bislama",
      bn => "Bengali",
      bo => "Tibetan",
      br => "Breton",
      bs => "Bosnian",
      ca => "Catalan",
      ce => "Chechen",
      ch => "Chamorro",
      co => "Corsican",
      cs => "Czech",
      cu => "Church Slavic",
      cv => "Chuvash",
      cy => "Welsh",
      da => "Danish",
      de => "German",
      dz => "Dzongkha",
      el => "Greek",
      en => "English",
      eo => "Esperanto",
      es => "Spanish",
      et => "Estonian",
      eu => "Basque",
      fa => "Persian",
      fi => "Finnish",
      fj => "Fijian",
      fo => "Faeroese",
      fr => "French",
      fy => "Frisian",
      ga => "Irish",
      gd => "Gaelic (Scots)",
      gl => "Gallegan",
      gn => "Guarani",
      gu => "Gujarati",
      gv => "Manx",
      ha => "Hausa",
      he => "Hebrew",
      hi => "Hindi",
      ho => "Hiri Motu",
      hr => "Croatian",
      hu => "Hungarian",
      hy => "Armenian",
      hz => "Herero",
      ia => "Interlingua",
      id => "Indonesian",
      ie => "Interlingue",
      ik => "Inupiaq",
      is => "Icelandic",
      it => "Italian",
      iu => "Inuktitut",
      ja => "Japanese",
      jw => "Javanese",
      ka => "Georgian",
      ki => "Kikuyu",
      kj => "Kuanyama",
      kk => "Kazakh",
      kl => "Kalaallisut",
      km => "Khmer",
      kn => "Kannada",
      ko => "Korean",
      ks => "Kashmiri",
      ku => "Kurdish",
      kv => "Komi",
      kw => "Cornish",
      ky => "Kirghiz",
      la => "Latin",
      lb => "Letzeburgesch",
      ln => "Lingala",
      lo => "Lao",
      lt => "Lithuanian",
      lv => "Latvian",
      mg => "Malagasy",
      mh => "Marshall",
      mi => "Maori",
      # Sorry, lads, but that is what M$ calls your language ...
      mk => "FYRO Macedonian",
      ml => "Malayalam",
      mn => "Mongolian",
      mo => "Moldavian",
      mr => "Marathi",
      ms => "Malay",
      mt => "Maltese",
      my => "Burmese",
      na => "Nauru",
      nb => "Norwegian (Bokmål)",
      nd => "Ndebele, North",
      ne => "Nepali",
      ng => "Ndonga",
      nl => "Dutch",
      nn => "Norwegian-Nynorsk",
      no => "Norwegian-Nynorsk",
      nr => "Ndebele, South",
      nv => "Navajo",
      ny => "Chichewa",
      oc => "Occitan (post 1500)",
      om => "Oromo",
      or => "Oriya",
      os => "Ossetian",
      pa => "Panjabi",
      pi => "Pali",
      pl => "Polish",
      ps => "Pushto",
      pt => "Portuguese",
      qu => "Quechua",
      rm => "Rhaeto-Romance",
      rn => "Rundi",
      ro => "Romanian",
      ru => "Russian",
      rw => "Kinyarwanda",
      sa => "Sanskrit",
      sc => "Sardinian",
      sd => "Sindhi",
      se => "Sami",
      sg => "Sango",
      si => "Sinhalese",
      sk => "Slovak",
      sl => "Slovenian",
      sm => "Samoan",
      sn => "Shona",
      so => "Somali",
      sq => "Albanian",
      sr => "Serbian",
      ss => "Swati",
      st => "Sotho",
      su => "Sundanese",
      sv => "Swedish",
      sw => "Swahili",
      ta => "Tamil",
      te => "Telugu",
      tg => "Tajik",
      th => "Thai",
      ti => "Tigrinya",
      tk => "Turkmen",
      tl => "Tagalog",
      tn => "Tswana",
      to => "Tonga",
      tr => "Turkish",
      ts => "Tsonga",
      tt => "Tatar",
      tw => "Twi",
      ug => "Uighur",
      uk => "Ukrainian",
      ur => "Urdu",
      uz => "Uzbek",
      vi => "Vietnamese",
      vo => "Volapuk",
      wo => "Wolof",
      xh => "Xhosa",
      yi => "Yiddish",
      yo => "Yoruba",
      za => "Zhuang",
      zh => "Chinese",
      zu => "Zulu",
  };
  
  use constant WIN32COUNTRY => {
      ad => "Andorra",
      ae => "United Arab Emirates",
      af => "Afghanistan",
      ag => "Antigua and Barbuda",
      ai => "Anguilla",
      al => "Albania",
      am => "Armenia",
      an => "Netherlands Antilles",
      ao => "Angola",
      aq => "Antarctica",
      ar => "Argentina",
      as => "American Samoa",
      at => "Austria",
      au => "Australia",
      aw => "Aruba",
      ax => "Aland Islands",
      az => "Azerbaijan",
      ba => "Bosnia and Herzegovina",
      bb => "Barbados",
      bd => "Bangladesh",
      be => "Belgium",
      bf => "Burkina Faso",
      bg => "Bulgaria",
      bh => "Bahrain",
      bi => "Burundi",
      bj => "Benin",
      bm => "Bermuda",
      bn => "Brunei Darussalam",
      bo => "Bolivia",
      br => "Brazil",
      bs => "Bahamas",
      bt => "Bhutan",
      bv => "Bouvet Island",
      bw => "Botswana",
      by => "Belarus",
      bz => "Belize",
      ca => "Canada",
      cc => "Cocos (Keeling) Islands",
      cd => "Congo, The Democratic Republic of the",
      cf => "Central African Republic",
      cg => "Congo",
      ch => "Switzerland",
      ci => "Cote D'Ivoire",
      ck => "Cook Islands",
      cl => "Chile",
      cm => "Cameroon",
      cn => "China",
      co => "Colombia",
      cr => "Costa Rica",
      cs => "Serbia and Montenegro",
      cu => "Cuba",
      cv => "Cape Verde",
      cx => "Christmas Island",
      cy => "Cyprus",
      cz => "Czech Republic",
      de => "Germany",
      dj => "Djibouti",
      dk => "Denmark",
      dm => "Dominica",
      do => "Dominican Republic",
      dz => "Algeria",
      ec => "Ecuador",
      ee => "Estonia",
      eg => "Egypt",
      eh => "Western Sahara",
      er => "Eritrea",
      es => "Spain",
      et => "Ethiopia",
      fi => "Finland",
      fj => "Fiji",
      fk => "Falkland Islands (Malvinas)",
      fm => "Micronesia, Federated States of",
      fo => "Faroe Islands",
      fr => "France",
      fx => "France, Metropolitan",
      ga => "Gabon",
      gb => "United Kingdom",
      gd => "Grenada",
      ge => "Georgia",
      gf => "French Guiana",
      gh => "Ghana",
      gi => "Gibraltar",
      gl => "Greenland",
      gm => "Gambia",
      gn => "Guinea",
      gp => "Guadeloupe",
      gq => "Equatorial Guinea",
      gr => "Greece",
      gs => "South Georgia and the South Sandwich Islands",
      gt => "Guatemala",
      gu => "Guam",
      gw => "Guinea-Bissau",
      gy => "Guyana",
      hk => "Hong Kong",
      hm => "Heard Island and McDonald Islands",
      hn => "Honduras",
      hr => "Croatia",
      ht => "Haiti",
      hu => "Hungary",
      id => "Indonesia",
      ie => "Ireland",
      il => "Israel",
      in => "India",
      io => "British Indian Ocean Territory",
      iq => "Iraq",
      ir => "Iran",
      is => "Iceland",
      it => "Italy",
      jm => "Jamaica",
      jo => "Jordan",
      jp => "Japan",
      ke => "Kenya",
      kg => "Kyrgyzstan",
      kh => "Cambodia",
      ki => "Kiribati",
      km => "Comoros",
      kn => "Saint Kitts and Nevis",
      kp => "North-Korea",
      kr => "Korea",
      kw => "Kuwait",
      ky => "Cayman Islands",
      kz => "Kazakhstan",
      la => "Laos",
      lb => "Lebanon",
      lc => "Saint Lucia",
      li => "Liechtenstein",
      lk => "Sri Lanka",
      lr => "Liberia",
      ls => "Lesotho",
      lt => "Lithuania",
      lu => "Luxembourg",
      lv => "Latvia",
      ly => "Libyan",
      ma => "Morocco",
      mc => "Monaco",
      md => "Moldova",
      mg => "Madagascar",
      mh => "Marshall Islands",
      mk => "Former Yugoslav Republic of Macedonia",
      ml => "Mali",
      mm => "Myanmar",
      mn => "Mongolia",
      mo => "Macao",
      mp => "Northern Mariana Islands",
      mq => "Martinique",
      mr => "Mauritania",
      ms => "Montserrat",
      mt => "Malta",
      mu => "Mauritius",
      mv => "Maldives",
      mw => "Malawi",
      mx => "Mexico",
      my => "Malaysia",
      mz => "Mozambique",
      na => "Namibia",
      nc => "New Caledonia",
      ne => "Niger",
      nf => "Norfolk Island",
      ng => "Nigeria",
      ni => "Nicaragua",
      nl => "Netherlands",
      no => "Norway",
      np => "Nepal",
      nr => "Nauru",
      nu => "Niue",
      nz => "New Zealand",
      om => "Oman",
      pa => "Panama",
      pe => "Peru",
      pf => "French Polynesia",
      pg => "Papua New Guinea",
      ph => "Philippines",
      pk => "Pakistan",
      pl => "Poland",
      pm => "Saint Pierre and Miquelon",
      pn => "Pitcairn",
      pr => "Puerto Rico",
      ps => "Palestinian Territory, Occupied",
      pt => "Portugal",
      pw => "Palau",
      py => "Paraguay",
      qa => "Qatar",
      re => "Reunion",
      ro => "Romania",
      ru => "Russian Federation",
      rw => "Rwanda",
      sa => "Saudi Arabia",
      sb => "Solomon Islands",
      sc => "Seychelles",
      sd => "Sudan",
      se => "Sweden",
      sg => "Singapore",
      sh => "Saint Helena",
      si => "Slovenia",
      sj => "Svalbard and Jan Mayen",
      sk => "Slovakia",
      sl => "Sierra Leone",
      sm => "San Marino",
      sn => "Senegal",
      so => "Somalia",
      sr => "Suriname",
      st => "Sao Tome and Principe",
      sv => "El Salvador",
      sy => "Syrian Arab Republic",
      sz => "Swaziland",
      tc => "Turks and Caicos Islands",
      td => "Chad",
      tf => "French Southern Territories",
      tg => "Togo",
      th => "Thailand",
      tj => "Tajikistan",
      tk => "Tokelau",
      tl => "Timor-Leste",
      tm => "Turkmenistan",
      tn => "Tunisia",
      to => "Tonga",
      tr => "Turkey",
      tt => "Trinidad and Tobago",
      tv => "Tuvalu",
      tw => "Taiwan, Province of China",
      tz => "Tanzania, United Republic of",
      ua => "Ukraine",
      ug => "Uganda",
      um => "United States Minor Outlying Islands",
      us => "United States",
      uy => "Uruguay",
      uz => "Uzbekistan",
      va => "Holy See (Vatican City State)",
      vc => "Saint Vincent and the Grenadines",
      ve => "Venezuela",
      vg => "Virgin Islands, British",
      vi => "Virgin Islands, U.S.",
      vn => "Vietnam",
      vu => "Vanuatu",
      wf => "Wallis and Futuna",
      ws => "Samoa",
      ye => "Yemen",
      yt => "Mayotte",
      za => "South Africa",
      zm => "Zambia",
      zw => "Zimbabwe",
  };
  
  my $locale_cache;
  
  sub parse_http_accept_language {
  	my ($string) = @_;
  
  	my @tokens = split / *, */, $string;
  	
  	my %retval;
  	foreach my $token (@tokens) {
  		my $quality = 1;
  		# This RE is more forgiving than the standard.  It accepts
  		# values greater than 1.0 and with more fractional digits
  		# than 3.
  		if ($token =~ s/ *; *q *= *([0-9]+(?:\.([0-9]+))?)$//) {
  			$quality = $1;
  		}
  		$retval{$token} = $quality;
  	}
  
  	# RFC 2616 only allows 1-8 characters for language and country
  	# but we are more forgiving.
  	return grep { 
  		/^[A-Za-z]+(?:-[A-Za-z]+)?$/
  		} map {
  			$_ = 'C' if $_ eq '*'; $_
  		}	sort { 
  			$retval{$b} <=> $retval{$a} 
  		} keys %retval;
  }
  
  sub parse_http_accept_charset {
  	my ($string) = @_;
  
  	my @tokens = split / *, */, $string;
  	
  	my %retval;
  	foreach my $token (@tokens) {
  		my $quality = 1;
  		# This RE is more forgiving than the standard.  It accepts
  		# values greater than 1.0 and with more fractional digits
  		# than 3.
  		if ($token =~ s/ *; *q *= *([0-9]+(?:\.([0-9]+))?)$//) {
  			$quality = $1;
  		}
  		$retval{$token} = $quality;
  	}
  
  	return grep { 
  		# This is really allowed in character set names ...
  		/^[-!\#\$\%\&\'\+\.0-9A-Z_\`a-z\|\~]+$/
  		} map {
  			$_ = undef if $_ eq '*'; $_
  		}	sort { 
  			$retval{$b} <=> $retval{$a} 
  		} keys %retval;
  }
  
  sub set_locale {
  	my ($category, $language, $country, $charset) = @_;
  	
  	require POSIX;
  
      $country = '' unless defined $country;
      $charset = '' unless defined $charset;
      
  	my $set_locale;
  	# Look up the cache first.
      if (my $retval = $locale_cache->{$language}->{$country}->{$charset}) {
      	my ($locale, $country) = @$retval;
  	POSIX::setlocale ($category, $locale);
          return @$retval;
      }
  
  	# Initialize the cache with the undefined value so that we can do
  	# error returns without setting it.
  	$locale_cache->{$language}->{$country}->{$charset} = undef;
  
  	my $windows = ($^O !~ /darwin/i && $^O =~ /win/i) ? 1 : 0;
  	if ($windows) {
  		return &__set_locale_windows;
  	}
  	
  	my $set_language;
  	my $set_country;
  
  	# First we try to only use the language.
  	my @languages = ($language);
  	my @lc_languages = map { lc $_ } @languages;
  	my @uc_languages = map { uc $_ } @languages;
  	my %seen = ();
  
  	foreach my $language (@languages, @lc_languages, @uc_languages) {
  		next if $seen{$language}++;
  		warn "Trying lingua only setlocale '$language'.\n" if DEBUG;
  		my $result = POSIX::setlocale ($category, $language);
  		if ($result) {
  			$set_locale = $set_language = $result if $result;
  			last;
  		}
  	}
  
  	# Now try it with the country appended.
  	my @countries = length $country ? ($country) : ();
  	my @uc_countries = map { uc $_ } @countries;
  	my @lc_countries = map { uc $_ } @countries;
  	push @countries, @uc_countries, @lc_countries;
   
   LINGUA: foreach my $language (@languages, @lc_languages, @uc_languages) {
  		my $count = 0;
  		my @guessed_countries = (LANG2COUNTRY->{lc $language},
  								 lc LANG2COUNTRY->{lc $language},
  								 uc LANG2COUNTRY->{lc $language});
  		foreach my $c (@countries, @guessed_countries) {
  			++$count;
  			next unless defined $c && length $c;
  			my $try = $language . '_' . $c;
  			next if $seen{$try}++;
  			warn "Trying setlocale '$try'.\n" if DEBUG;
  			my $result = POSIX::setlocale ($category, $try);
  			if ($result) {
  				$set_locale = $result;
  				if ($count >= @countries) {
  					$set_country = $c; 
  				} else {
  					$set_country = $country;
  				}
  
  				last LINGUA;
  			}
  		}
  	}
  	
  	unless (length $charset) {
  		return unless defined $set_locale && length $set_locale;
  		
  		$locale_cache->{$language}->{$country}->{$charset} = 
  			[$set_locale, $set_country];
  		return wantarray ? ($set_locale, $set_country) : $set_locale;
  	}
  	
  	my @charsets = ($charset);
  	my $cleaned = $charset;
  	push @charsets, $cleaned if $cleaned =~ s/-//g;
  	my @lc_charsets = map { lc $charset } @charsets;
  	my @uc_charsets = map { uc $charset } @charsets;
  	push @charsets, @lc_charsets, @uc_charsets;
  	
  	%seen = ();
   LINGUA2: foreach my $language (@languages, 
  								@lc_languages, @uc_languages) {
  	     my @guessed_countries = (LANG2COUNTRY->{lc $language},
  								 lc LANG2COUNTRY->{lc $language},
  								 uc LANG2COUNTRY->{lc $language});
  	     my $count = 0;
  		 foreach my $c (@countries, @guessed_countries) {
  			 ++$count;
  			 $c = '' unless defined $c && length $c;
  			 my $country_try = $language;
  			 $country_try .= (length $c) ? "_$c" : '';
  			 
  			 foreach my $ch (@charsets, @lc_charsets, @uc_charsets) {
  				 my $try = $country_try . '.' . $ch;
  				 next if $seen{$try}++;
  				 warn "Trying setlocale '$try'.\n" if DEBUG;
  				 
  				 my $result = POSIX::setlocale ($category, $try);
  				 if ($result) {
  					 $set_locale = $result;
  					 if ($count >= @countries) {
  						 $set_country = $c; 
  					 } else {
  						 $set_country = $country;
  					 }
  					 
  					 last LINGUA2;
  				 }
  			 }
  		 } 
  	 }
  
  	return unless defined $set_locale && length $set_locale;
  
  	$locale_cache->{$language}->{$country}->{$charset} = 
  		[$set_locale, $set_country];
  
  	return wantarray ? ($set_locale, $set_country) : $set_locale;
  }
  
  sub __set_locale_windows {
  	my ($category, $language, $country, $charset) = @_;
  
      my $set_locale;
  
      $country = '' unless defined $country;
      $charset = '' unless defined $charset;
      	
  	# First we try to only use the language.
  	my $long_language = WIN32LANGUAGE->{lc $language};
  	my @languages = ($long_language, $language);
  	my %seen = ();
  	foreach my $language (@languages) {
  		next if $seen{$language}++;
  		warn "Trying lingua only setlocale '$language'.\n" if DEBUG;
  		my $result = POSIX::setlocale ($category, $language);
  		if ($result) {
  			$set_locale = $result if $result;
  			last;
  		}
  	}
  	
  	# Now try it with the country appended.
  	my $set_country;
  	if (length $country) {
          COMBI: foreach my $language (@languages) {
              # We do not need a fallback country here, because the "system" already
              # provides the information.
  	        my @short_countries = ($country);
  		    my @countries = map { 
  			    WIN32COUNTRY->{lc $_} 
  			    } grep { length $_ } @short_countries;
  		    foreach my $c (@countries) {
  			    next unless defined $c && length $c;
  			    my $try = $language . '_' . $c;
  			    next if $seen{$try}++;
  			    warn "Trying setlocale '$try'.\n" if DEBUG;
  			    my $result = POSIX::setlocale ($category, $try);
  			    if ($result) {
  				    $set_locale = $result;
  					$set_country = $c;
  				    last COMBI;
  			    }
  		    }
  	    }
  	}
  
  	return unless defined $set_locale && length $set_locale;
  
      # Apparently, there is no point in setting a charset.  Even the new
      # MS-DOS versions like 2000 or XP still have the concept of more or
      # less fixed codepages.  Switching to UTF-8 does not work.
  	$locale_cache->{$language}->{$country}->{$charset} = 
  		[$set_locale, $set_country];
  	return wantarray ? ($set_locale, $set_country) : $set_locale;
  }
  
  sub get_locale_cache {
  	$locale_cache;
  }
  
  sub set_locale_cache {
  	if (ref $_[0] && 'HASH' eq ref $_[0]) {
  		$locale_cache = $_[0];
      } else {
  		my %locale_cache = @_;
  		$locale_cache = \%locale_cache;
  	}
  }
  
  sub web_set_locale {
  	my ($accept_language, $accept_charset, $category, $available) = @_;
  
  	my %available;
  	if ($available) {
  		foreach (@$available) {
  			my $locale = $_;
  			$locale =~ s/[_\@\.].*//;
  			$available{lc $locale} = 1;
  		}
  	}
  
  	my @languages;
  	if (ref $accept_language && 'ARRAY' eq ref $accept_language) {
  		@languages = @$accept_language;
  	} else {
  		@languages = parse_http_accept_language $accept_language;
  	}
  
  	if ($available) {
  		my @all = @languages;
  		@languages = ();
  		foreach my $locale (@all) {
  			my $language = lc $locale;
  			$language =~ s/[_\@\.].*//;
  			push @languages, $locale if $available{$language};
  		}
  	}
  
  	my @charsets;
  	if (defined $accept_charset) {
  		if (ref $accept_charset && 'ARRAY' eq ref $accept_charset) {
  			@charsets = @$accept_charset;
  		} else {
  			@charsets = parse_http_accept_charset $accept_charset;
  		}
  	}
  
  	unless (defined $category) {
  		require POSIX;
  		$category = POSIX::LC_ALL();
  	}
  
  	my ($set_locale, $set_language, $set_country, $set_charset);
  	foreach my $lang (@languages) {
  		my ($language, $country) = split /-/, $lang, 2;
  
  		my ($locale, $country_used) = 
  			set_locale ($category, $language, $country, $charsets[0]);
  		
  		if (defined $locale) {
  			# If a country was specified, we have to check whether it
  			# was actually selected.
  			if (defined $country) {
  				if (!defined $country
  					|| ($country ne $country_used)) {
  					$set_language = $language;
  					$set_locale = $locale;
  					$set_country = $country_used;
  					$set_charset = $charsets[0];
  				}
  			}
  
  			if (wantarray) {
  				return $locale, $lang, $country_used, $charsets[0];
  			} else {
  				return $locale;
  			}
  		}
  	}
  	
  	if (defined $set_locale) {
  		if (wantarray) {
  			return $set_locale, $set_language, $set_country, $set_charset;
  		} else {
  			return $set_locale;
  		}
  	}
  
  	return;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::Util - Portable l10n and i10n functions
  
  =head1 SYNOPSIS
  
    use Locale::Util;
  
    my @linguas = parse_http_accept_language $ENV{HTTP_ACCEPT_LANGUAGE};
  
    my @charsets = parse_http_accept_charset $ENV{HTTP_ACCEPT_CHARSET};
  
    # Trie to set the locale to Brasilian Portuguese in UTF-8.
    my $set_locale = set_locale LC_ALL, 'pt', 'BR', 'utf-8';
  
    set_locale_cache $last_cache;
    
    my $cache = get_locale_cache;
  
    web_set_locale ($ENV{HTTP_ACCEPT_LANGUAGE}, $ENV_ACCEPT_CHARSET);
  
    web_set_locale (['fr-BE', 'fr', 'it'], ['cp1252', 'utf-8']);
  
  =head1 DESCRIPTION
  
  This module provides portable functions dealing with localization
  (l10n) and internationalization(i10n).  It doesn't export anything
  by default, you have to specify each function you need in the import
  list, or use the fully qualified name.
  
  The functions here have a focus on web development, although they 
  are general enough to have them in the Locale:: namespace.
  
  This module is considered alpha code.  The interface is not stable.
  Please contact the author if you want to use it in production code.
  
  This module was introduced in libintl-perl 1.17.
  
  =head1 FUNCTIONS
  
  =over 4
  
  =item B<parse_http_accept_language STRING>
  
  Parses a string as passed in the HTTP header "Accept-Language".
  It returns a list of tokens sorted by the quality value, see RFC 2616 
  for details.
  
  Example:
  
    parse_http_accept ("fr-fr, fr; q=0.7, de; q=0.3");
  
  This means: Give me French for France with a quality value of 1.0
  (the maximum).  Otherwise I will take any other French version 
  (quality 0.7), German has a quality of 0.3 for me.
  
  The function will return a list of tokens in the order of their quality
  values, in this case "fr-fr", "fr" and "de".
  
  The function is more forgiving than RFC 2616.  It accepts quality
  values greater than 1.0 and with more than 3 decimal places.  It
  also accepts languages and country names with more than 8 characters.
  The language "*" is translated into "C".
  
  =item B<parse_http_accept_charset STRING>
  
  Parses a string as passed in the HTTP header "Accept-Charset".
  It returns a list of tokens sorted by the quality value, see RFC 2616 
  for details.
  
  The special character set "*" (means all character sets) will be
  translated to the undefined value.
  
  =item B<set_locale CATEGORY, LANGUAGE[, COUNTRY, CHARSET]>
  
  Tries to set the user locale by means of POSIX::setlocale().  The latter
  function has the disadvantage, that its second argument (the locale
  description string) is completely non-standard and system-dependent.
  This function tries its best at guessing the system's notion of a locale
  dientifier, with the arguments supplied:
  
  =over 8
  
  =item B<CATEGORY>
  
  An integer argument for a valid locale category.  These are the
  LC_* constants (LC_ALL, LC_CTIME, LC_COLLATE, ...) defined in both
  Locale::Messages(3pm) and POSIX(3pm).
  
  =item B<LANGUAGE>
  
  A 2-letter language identifier as per ISO 639.  Case doesn't matter,
  but an unchanged version (ie. not lower-cased) of the language you
  provided will always be tried to.
  
  =item B<COUNTRY>
  
  A 2-letter language identifier as per ISO 639.  Case doesn't matter,
  but an unchanged version (ie. not lower-cased) of the language you
  provided will always be tried to.
  
  This parameter is optional.  If it is not defined, the function will
  try to guess an appropriate country, otherwise leave it to the 
  operating system.
  
  =item B<CHARSET>
  
  A valid charset name.  Valid means valid!  The charset "utf8" is not
  valid (it is "utf-8").  Charset names that are accepted by the
  guessing algorithms in Encode(3pm) are also not necessarily valid.
  
  If the parameter is undefined, it is ignored.  It is always ignored
  under Windows.
  
  =back
  
  The function tries to approach the desired locale in loops, refining
  it on every success.  It will first try to set the language (for 
  any country), then try to select the correct language, and finally
  try to select the correct charset.
  
  The return value is false in case of failure, or the return value
  of the underlying POSIX::setlocale() call in case of success.
  
  In array context, the function returns the country name 
  that was passed in the successful
  call to POSIX::setlocale().  If this string is equal to the country
  name you passed as an argument, you can be reasonably sure that
  the settings for this country are really used.  If it is not
  equal, the function has taken a guess at the country (it has a list
  of "default" countries for each language).  It seems that under
  Windows, POSIX::setlocale() also succeeds, if you pass a country
  name that is actually not supported.  Therefore, the information
  is not completely reliable.
  
  Please note that this function is intended for server processes 
  (especially web applications) that need to switch in a portable
  way to a certain locale.  It is B<not> the recommended way to set 
  the program locale for a regular application.  In a regular application
  you should do the following:
  
      use POSIX qw (setlocale LC_ALL);
      setlocale LC_ALL, '';
  
  The empty string as the second argument means, that the system
  should switch to the user's default locale.
  
  =item B<get_locale_cache>
  
  The function set_locale() is potentially expansive, especially when
  it fails, because it can try a lot of different combinations, and 
  the system may have to load a lot of locale definitions from its
  internal database.
  
  In order to speed up things, results are internally cached in a 
  hash, keys are the languages, subkeys countries, subsubkeys the
  charsets.  You can get a reference to this hash with get_locale_cache().
  
  The function cannot fail.
  
  =item B<set_locale_cache HASH>
  
  Sets the internal cache.  You can either pass a hash or a hash reference.
  The function will use this as its cache, discarding its old cache.
  This allows you to keep the hash persistent.
  
  The function cannot fail.
  
  =item B<web_set_locale (ACCEPT_LANGUAGE, ACCEPT_CHARSET, CATEGORY,
                          AVAILABLE)>
  
  Try to change the locale to the settings described by ACCEPT_LANGUAGE
  and ACCEPT_CHARSET.  For each argument you can either pass a string
  as in the corresponding http header, or a reference to an array
  of language resp. charset identifiers.
  
  Currently only the first charset passed is used as an argument.
  You are strongly encouraged to pass a hard-coded value here, so
  that you have control about your output.
  
  The argument B<CATEGORY> specifies the category (one of the LC_*
  constants as defined in Locale::Messages(3pm) or in POSIX(3pm)).
  The category defaults to LC_ALL.
  
  You can pass an optional reference to a list of locales in 
  XPG4 format that are available in your application.  This is
  useful if you know which languages are supported by your application.
  In fact, only the language part of the values in the list are
  considered (for example for "en_US", only "en" is used).  The
  country or other parts are ignored.
  
  The function returns the return value of the underlying set_locale()
  call, or false on failure.
  
  The function returns false on failure.  On success it returns the 
  return value of the underlying set_locale() call.  This value can
  be used directly in subsequent calls to POSIX::setlocale().  In 
  array context, it additionally returns the identifiers for the language, 
  the country, and the charset actually used.
  
  =back
  
  =head1 BUGS
  
  The function set_locale() probably fails to guess the correct locale
  identifier on a lot of systems.  If you have found such a case,
  please submit it as a bug report.
  
  The bug tracking system for this packags is at
  http://rt.cpan.org/NoAuth/Bugs.html?libintl-perl
  
  Please note that this module is considered alpha code, and the interface
  is not stable.  Please contact the author, if you want to use it in
  production code.
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  POSIX(3pm), perl(1)
  
  =cut
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  cperl-indent-level: 4
  cperl-continued-statement-offset: 2
  tab-width: 4
  End:
  =cut
LOCALE_UTIL

    $main::fatpacked{"Locale/gettext_dumb.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_GETTEXT_DUMB';
  #! /bin/false
  
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Pure Perl implementation of Uniforum message translation.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::gettext_dumb;
  
  use Locale::gettext_pp;
  
  use vars qw (%EXPORT_TAGS @EXPORT_OK @ISA $VERSION);
  
  %EXPORT_TAGS = (locale_h => [ qw (gettext
                                    dgettext
                                    dcgettext
                                    ngettext
                                    dngettext
                                    dcngettext
                                    pgettext
                                    dpgettext
                                    dcpgettext
                                    npgettext
                                    dnpgettext
                                    dcnpgettext
                                    textdomain
                                    bindtextdomain
                                    bind_textdomain_codeset
                                    )],
                  libintl_h => [ qw (LC_CTYPE
                                     LC_NUMERIC
                                     LC_TIME
                                     LC_COLLATE
                                     LC_MONETARY
                                     LC_MESSAGES
                                     LC_ALL)],
                  );
  
  @EXPORT_OK = qw (gettext
                   dgettext
                   dcgettext
                   ngettext
                   dngettext
                   dcngettext
                   pgettext
                   dpgettext
                   dcpgettext
                   npgettext
                   dnpgettext
                   dcnpgettext
                   textdomain
                   bindtextdomain
                   bind_textdomain_codeset
                   nl_putenv
                   setlocale
                   LC_CTYPE
                   LC_NUMERIC
                   LC_TIME
                   LC_COLLATE
                   LC_MONETARY
                   LC_MESSAGES
                   LC_ALL);
                   
  @ISA = qw (Exporter);
  
  *Locale::gettext_dumb::textdomain = \&Locale::gettext_pp::textdomain;
  *Locale::gettext_dumb::bindtextdomain = \&Locale::gettext_pp::bindtextdomain;
  *Locale::gettext_dumb::bind_textdomain_codeset = 
      \&Locale::gettext_pp::bind_textdomain_codeset;
  
  *Locale::gettext_dumb::nl_putenv = \&Locale::gettext_pp::nl_putenv;
  
  *Locale::gettext_dumb::LC_CTYPE = \&Locale::gettext_pp::LC_CTYPE;
  *Locale::gettext_dumb::LC_NUMERIC = \&Locale::gettext_pp::LC_NUMERIC;
  *Locale::gettext_dumb::LC_TIME= \&Locale::gettext_pp::LC_TIME;
  *Locale::gettext_dumb::LC_COLLATE = \&Locale::gettext_pp::LC_COLLATE;
  *Locale::gettext_dumb::LC_MONETARY = \&Locale::gettext_pp::LC_MONETARY;
  *Locale::gettext_dumb::LC_MESSAGES = \&Locale::gettext_pp::LC_MESSAGES;
  *Locale::gettext_dumb::LC_ALL = \&Locale::gettext_pp::LC_ALL;
  
  
  sub gettext ($) {
      my ($msgid) = @_;
  
      return dcnpgettext ('', undef, $msgid, undef, undef, undef);
  }
  
  sub dgettext ($$) {
      my ($domainname, $msgid) = @_;
  
      return dcnpgettext ($domainname, undef, $msgid, undef, undef, undef);
  }
  
  sub dcgettext ($$$) {
      my ($domainname, $msgid, $category) = @_;
  
      return dcnpgettext ($domainname, undef, $msgid, undef, undef, undef);
  }
  
  sub ngettext ($$$) {
      my ($msgid, $msgid_plural, $n) = @_;
  
      return dcnpgettext ('', undef, $msgid, $msgid_plural, $n, undef);
  }
  
  sub dngettext ($$$$) {
      my ($domainname, $msgid, $msgid_plural, $n) = @_;
  
      return dcnpgettext ($domainname, undef, $msgid, $msgid_plural, $n, undef);
  }
  
  sub dcngettext ($$$$$) {
      my ($domainname, $msgid, $msgid_plural, $n, $category) = @_;
  
      return dcnpgettext ($domainname, undef, $msgid, $msgid_plural, $n, , 
                          $category);
  }
  
  sub pgettext ($$) {
      my ($msgctxt, $msgid) = @_;
  
      return dcnpgettext ('', $msgctxt, $msgid, undef, undef, undef);
  }
  
  sub dpgettext ($$$) {
      my ($domainname, $msgctxt, $msgid) = @_;
  
      return dcnpgettext ($domainname, $msgctxt, $msgid, undef, undef, undef);
  }
  
  sub dcpgettext($$$$) {
      my ($domainname, $msgctxt, $msgid, $category) = @_;
  
      return dcnpgettext ($domainname, $msgctxt, $msgid, undef, undef, undef);
  }
  
  sub npgettext ($$$$) {
      my ($msgctxt, $msgid, $msgid_plural, $n) = @_;
  
      return dcnpgettext ('', $msgctxt, $msgid, $msgid_plural, $n, undef);
  }
  
  sub dnpgettext ($$$$$) {
      my ($domainname, $msgctxt, $msgid, $msgid_plural, $n) = @_;
  
      return dcnpgettext ($domainname, $msgctxt, $msgid, $msgid_plural, $n, undef);
  }
  
  sub __get_locale() {
      my $locale;
  
      if (exists $ENV{LANGUAGE} && length $ENV{LANGUAGE}) {
          $locale = $ENV{LANGUAGE};
          $locale =~ s/:.*//s;
      } elsif (exists $ENV{LC_ALL} && length $ENV{LC_ALL}) {
          $locale = $ENV{LC_ALL};
      } elsif (exists $ENV{LANG} && length $ENV{LANG}) {
          $locale = $ENV{LANG};
      } elsif (exists $ENV{LC_MESSAGES} && length $ENV{LC_MESSAGES}) {
          $locale = $ENV{LC_MESSAGES};
      } else {
          $locale = 'C';
      }
      
      return $locale;
  }
  
  sub dcnpgettext ($$$$$$) {
      my ($domainname, $msgctxt, $msgid, $msgid_plural, $n, $category) = @_;
  
      my $locale = __get_locale;
  
      return Locale::gettext_pp::_dcnpgettext_impl ($domainname, $msgctxt,
                                                    $msgid, $msgid_plural, $n,
                                                    $category, $locale);
  }
  
  sub setlocale($;$) {
  	&POSIX::setlocale;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::gettext_dumb - Locale unaware Implementation of Uniforum Message Translation
  
  =head1 SYNOPSIS
  
   use Locale::gettext_dumb qw(:locale_h :libintl_h);
  
   # Normally, you will not want to include this module directly but this way:
   use Locale::Messages;
   
   my $selected = Locale::Messages->select_package ('gettext_dumb');
  
   gettext $msgid;
   dgettext $domainname, $msgid;
   dcgettext $domainname, $msgid, LC_MESSAGES;
   ngettext $msgid, $msgid_plural, $count;
   dngettext $domainname, $msgid, $msgid_plural, $count;
   dcngettext $domainname, $msgid, $msgid_plural, $count, LC_MESSAGES;
   pgettext $msgctxt, $msgid;
   dpgettext $domainname, $msgctxt, $msgid;
   dcpgettext $domainname, $msgctxt, $msgid, LC_MESSAGES;
   npgettext $msgctxt, $msgid, $msgid_plural, $count;
   dnpgettext $domainname, $msgctxt, $msgid, $msgid_plural, $count;
   dcnpgettext $domainname, $msgctxt, $msgid, $msgid_plural, $count, LC_MESSAGES;
   textdomain $domainname;
   bindtextdomain $domainname, $directory;
   bind_textdomain_codeset $domainname, $encoding;
   my $category = LC_CTYPE;
   my $category = LC_NUMERIC;
   my $category = LC_TIME;
   my $category = LC_COLLATE;
   my $category = LC_MONETARY;
   my $category = LC_MESSAGES;
   my $category = LC_ALL;
  
  =head1 DESCRIPTION
  
  B<IMPORTANT!> This module is experimental.  It may not work as described!
  
  The module B<Locale::gettext_dumb> does exactly the same as 
  Locale::gettext_xs(3pm) or Locale::gettext_pp(3pm).
  
  While both other modules use POSIX::setlocale() to determine the currently
  selected locale, this backend only checks the environment variables
  LANGUAGE, LANG, LC_ALL, LC_MESSAGES (in that order), when it tries to locate
  a message catalog (a .mo file).
  
  This class was introduced in libintl-perl 1.22.
  
  =head1 USAGE
  
  This module should not be used for desktop software or scripts run locally.
  Why? If you use a message catalog for example in Danish in UTF-8 (da_DA.UTF8)
  but the  system locale is set to Russian with KOI8-R (ru_RU.KOI8-R) you
  may produce invalid output, either invalid multi-byte sequences or invalid
  text, depending on how you look at it.
  
  That will happen, when you mix output from B<Locale::gettext_pp> with
  locale-dependent output from the operating system like the contents of
  the variable "$!", date and time formatting functions (localtime(),
  gmtime(), POSIX::strftime() etc.), number formatting with printf() and
  friends, and so on.
  
  A typical usage scenario looks like this:
  
  You have a server application (for example a web application) that is supposed
  to display a fixed set of messages in many languages.  If you want to do this
  with Locale::gettext_xs(3pm) or Locale::gettext_pp(3pm), you have to install
  the locale data for all of those languages.  Otherwise, translating the
  messages will not work.
  
  With Locale::gettext_dumb(3pm) you can relax these requirements, and display
  messages for all languages that you have mo files for.
  
  On the other hand, you will soon reach limits with this approach.  Almost
  any application requires more than bare translation of messages for
  localisation.  You want to formatted dates and times, you want to display
  numbers in the correct formatting for the selected languages, and you may
  want to display system error messages ("$!").
  
  In practice, Locale::gettext_dumb(3pm) is still useful in these scenarios.
  Your users will have to live with the fact that the presented output is
  in different languages resp. for different locales, when "their" locale
  is not installed on your system.
  
  More dangerous is mixing output in different character sets but that can
  be easily avoided.  Simply make sure that B<Locale::gettext_dump> uses 
  UTF-8 (for example by setting the environment variable OUTPUT_CHARSET or
  by calling bind_textdomain_codeset()) and make sure that the system locale
  also uses UTF-8, for example "en_US.UTF8".  If that fails, switch to a
  locale that uses a subset of UTF-8.  In practice that will be US-ASCII, the
  character set used by the default locale "C" resp. "POSIX".
  
  Your application will then to a certain extent mix output for different
  localisations resp. languages.  But this is completely under your control.
  
  =head1 EXAMPLE
  
  See above! Normally you should not use this module! However, let us assume
  you have read the warnings.  In a web application you would do something
  like this:
  
      use Locale::TextDomain qw (com.example.yourapp);
      use Locale::Messages qw (nl_putenv LC_ALL bindtextdomain
                               bind_textdomain_codeset);
      use Locale::Util qw (web_set_locale);
      use POSIX qw (setlocale);
      
      # First try to switch to the locale requested by the user.  If you
      # know it you can try to pass it to setlocale like this:
      #
      #   my $hardcoded_locale = 'fr_FR.UTF-8';
      #   my $success = POSIX::setlocale (LC_ALL, $hardcoded_locale);
      #
      # However, we try to let libintl-perl do a better job for us:
      my $success = web_set_locale $ENV{HTTP_ACCEPT_LANGUAGE},
                                   $ENV{HTTP_ACCEPT_CHARSET};
      # Note: If your application forces the use of UTF-8 for its output
      # you should pass 'UTF-8' as the second argument to web_set_locale
      # instead of $ENV{HTTP_ACCEPT_CHARSET}.
      
      if (!$success) {
          # Did not work.  Switch to the dumb interface of
          # Locale::Messages.
          Locale::Messages->select_package ('gettext_dumb');
          
          # And try to switch to a default locale:
          if (!setlocale (LC_ALL, 'en_US.UTF-8')) {
              # Still no luck.  Enforce at least US-ASCII:
              setlocale (LC_ALL, 'C');
          }
          bind_textdomain_codeset 'com.example.yourapp', 'utf-8';
      }
      
  If your application forces the usage of UTF-8 you should ignore the environment
  variable 
      
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::TextDomain(3pm), Locale::Messages(3pm), Encode(3pm),
  perllocale(3pm), POSIX(3pm), perl(1), gettext(1), gettext(3)
  
  =cut
  
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  tab-width: 4
  End:
LOCALE_GETTEXT_DUMB

    $main::fatpacked{"Locale/gettext_pp.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOCALE_GETTEXT_PP';
  #! /bin/false
  
  # vim: set autoindent shiftwidth=4 tabstop=4:
  
  # Pure Perl implementation of Uniforum message translation.
  # Copyright (C) 2002-2017 Guido Flohr <guido.flohr@cantanea.com>,
  # all rights reserved.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 3 of the License, or
  # (at your option) any later version.
  
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
  package Locale::gettext_pp;
  
  use strict;
  
  require 5.004;
  
  use vars qw ($__gettext_pp_default_dir 
      		 $__gettext_pp_textdomain
      		 $__gettext_pp_domain_bindings
      		 $__gettext_pp_domain_codeset_bindings
      		 $__gettext_pp_domains
      		 $__gettext_pp_recoders
      		 $__gettext_pp_unavailable_dirs
      		 $__gettext_pp_domain_cache
      		 $__gettext_pp_alias_cache
      		 $__gettext_pp_context_glue);
  
  use locale;
  use File::Spec;
  use Locale::Messages;
  
  BEGIN {
      $__gettext_pp_textdomain = 'messages';
      $__gettext_pp_domain_bindings = {};
      $__gettext_pp_domain_codeset_bindings = {};
      $__gettext_pp_domains = {};
      $__gettext_pp_recoders = {};
      $__gettext_pp_unavailable_dirs = {};
      $__gettext_pp_domain_cache = {};
      $__gettext_pp_alias_cache = {};
      # The separator between msgctxt and msgid in a .mo file.  */
      $__gettext_pp_context_glue = "\004";
      
      $__gettext_pp_default_dir = '';
      
      for my $dir (qw (/usr/share/locale /usr/local/share/locale)) {
      	if (-d $dir) {
      		$__gettext_pp_default_dir = $dir;
      		last;
      	}
      }
  }
  
  BEGIN {
      	require POSIX;
      	require Exporter;
      	use IO::Handle;
      	require Locale::Recode;
  
      	local $@;
      	my ($has_messages, $five_ok);
      	
      	$has_messages = eval '&POSIX::LC_MESSAGES';
  
      	unless (defined $has_messages && length $has_messages) {
      			$five_ok = ! grep {my $x = eval "&POSIX::$_" || 0; $x eq '5';}
      							qw (LC_CTYPE
      							   LC_NUMERIC
      							   LC_TIME
      							   LC_COLLATE
      							   LC_MONETARY
      							   LC_ALL);
      		if ($five_ok) {
      			$five_ok = POSIX::setlocale (5, '');
      		}
      	}
      	
      	if (defined $has_messages && length $has_messages) {
  eval <<'EOF';
  sub LC_MESSAGES()
  {
      local $!; # Do not clobber errno!
      
      return &POSIX::LC_MESSAGES;
  }
  EOF
      	} elsif ($five_ok) {
  eval <<'EOF';
  sub LC_MESSAGES()
  {
      local $!; # Do not clobber errno!
  
      # Hack: POSIX.pm deems LC_MESSAGES an invalid macro until
      # Perl 5.8.0.  However, on LC_MESSAGES should be 5 ...
      return 5;
  }
  EOF
      	} else {
  eval <<'EOF';
  sub LC_MESSAGES()
  {
      local $!; # Do not clobber errno!
  
      # This fallback value is widely used,
      # when LC_MESSAGES is not available.
      return 1729;
  }
  EOF
      	}
  }
  
  use vars qw (%EXPORT_TAGS @EXPORT_OK @ISA $VERSION);
  
  %EXPORT_TAGS = (locale_h => [ qw (
      							  gettext
      							  dgettext
      							  dcgettext
      							  ngettext
      							  dngettext
      							  dcngettext
      							  pgettext
      							  dpgettext
      							  dcpgettext
      							  npgettext
      							  dnpgettext
      							  dcnpgettext
      							  textdomain
      							  bindtextdomain
      							  bind_textdomain_codeset
      							  )
      						  ],
      			libintl_h => [ qw (LC_CTYPE
      							   LC_NUMERIC
      							   LC_TIME
      							   LC_COLLATE
      							   LC_MONETARY
      							   LC_MESSAGES
      							   LC_ALL)
      						   ],
      			);
  
  @EXPORT_OK = qw (gettext
      			 dgettext
      			 dcgettext
      			 ngettext
      			 dngettext
      			 dcngettext
      			 pgettext
      			 dpgettext
      			 dcpgettext
      			 npgettext
      			 dnpgettext
      			 dcnpgettext
      			 textdomain
      			 bindtextdomain
      			 bind_textdomain_codeset
                   nl_putenv
                   setlocale
      			 LC_CTYPE
      			 LC_NUMERIC
      			 LC_TIME
      			 LC_COLLATE
      			 LC_MONETARY
      			 LC_MESSAGES
      			 LC_ALL);
  @ISA = qw (Exporter);
  
  my $has_nl_langinfo;
  
  sub __load_catalog;
  sub __load_domain;
  sub __locale_category;
  sub __untaint_plural_header;
  sub __compile_plural_function;
  
  sub LC_NUMERIC()
  {
      &POSIX::LC_NUMERIC;
  }
  
  sub LC_CTYPE()
  {
      &POSIX::LC_CTYPE;
  }
  
  sub LC_TIME()
  {
      &POSIX::LC_TIME;
  }
  
  sub LC_COLLATE()
  {
      &POSIX::LC_COLLATE;
  }
  
  sub LC_MONETARY()
  {
      &POSIX::LC_MONETARY;
  }
  
  sub LC_ALL()
  {
      &POSIX::LC_ALL;
  }
  
  sub textdomain(;$)
  {
      my $new_domain = shift;
      
      $__gettext_pp_textdomain = $new_domain if defined $new_domain && 
      	length $new_domain;
      
      return $__gettext_pp_textdomain;
  }
  
  sub bindtextdomain($;$)
  {
      my ($domain, $directory) = @_;
  
      my $retval;	
      if (defined $domain && length $domain) {
      	if (defined $directory && length $directory) {
      		$retval = $__gettext_pp_domain_bindings->{$domain} 
      			= $directory;
      	} elsif (exists $__gettext_pp_domain_bindings->{$domain}) {
      		$retval = $__gettext_pp_domain_bindings->{$domain};
      	} else {
      		$retval = $__gettext_pp_default_dir;
      	}
      	$retval = '/usr/share/locale' unless defined $retval && 
      		length $retval;
      	return $retval;
      } else {
      	return;
      }
  }
  
  sub bind_textdomain_codeset($;$)
  {
      my ($domain, $codeset) = @_;
      
      if (defined $domain && length $domain) {
      	if (defined $codeset && length $codeset) {
      		return $__gettext_pp_domain_codeset_bindings->{$domain} = $codeset;
      	} elsif (exists $__gettext_pp_domain_codeset_bindings->{$domain}) {
      		return $__gettext_pp_domain_codeset_bindings->{$domain};
      	}
      }
      
      return;
  }
  
  sub gettext($)
  {
      my ($msgid) = @_;
  
      return dcnpgettext ('', undef, $msgid, undef, undef, undef);
  }
  
  sub dgettext($$)
  {
      my ($domainname, $msgid) = @_;
  
      return dcnpgettext ($domainname, undef, $msgid, undef, undef, undef);
  }
  
  sub dcgettext($$$)
  {
      my ($domainname, $msgid, $category) = @_;
  
      return dcnpgettext ($domainname, undef, $msgid, undef, undef, undef);
  }
  
  sub ngettext($$$)
  {
      my ($msgid, $msgid_plural, $n) = @_;
  
      return dcnpgettext ('', undef, $msgid, $msgid_plural, $n, undef);
  }
  
  sub dngettext($$$$)
  {
      my ($domainname, $msgid, $msgid_plural, $n) = @_;
  
      return dcnpgettext ($domainname, undef, $msgid, $msgid_plural, $n, undef);
  }
  
  sub dcngettext($$$$$)
  {
      my ($domainname, $msgid, $msgid_plural, $n, $category) = @_;
  
      return dcnpgettext ($domainname, undef, $msgid, $msgid_plural, $n, , $category);
  }
  
  
  sub pgettext($$)
  {
      my ($msgctxt, $msgid) = @_;
  
      return dcnpgettext ('', $msgctxt, $msgid, undef, undef, undef);
  }
  
  sub dpgettext($$$)
  {
      my ($domainname, $msgctxt, $msgid) = @_;
  
      return dcnpgettext ($domainname, $msgctxt, $msgid, undef, undef, undef);
  }
  
  sub dcpgettext($$$$)
  {
      my ($domainname, $msgctxt, $msgid, $category) = @_;
  
      return dcnpgettext ($domainname, $msgctxt, $msgid, undef, undef, undef);
  }
  
  sub npgettext($$$$)
  {
      my ($msgctxt, $msgid, $msgid_plural, $n) = @_;
  
      return dcnpgettext ('', $msgctxt, $msgid, $msgid_plural, $n, undef);
  }
  
  sub dnpgettext($$$$$)
  {
      my ($domainname, $msgctxt, $msgid, $msgid_plural, $n) = @_;
  
      return dcnpgettext ($domainname, $msgctxt, $msgid, $msgid_plural, $n, undef);
  }
  
  # This is the actual implementation of dncpgettext.  It is also used by the
  # corresponding function in Locale::gettext_dumb.
  sub _dcnpgettext_impl {
      my ($domainname, $msgctxt, $msgid, $msgid_plural, $n, $category,
          $locale) = @_;
  
      return unless defined $msgid;
  
      my $plural = defined $msgid_plural;
      Locale::Messages::turn_utf_8_off($msgid);
      Locale::Messages::turn_utf_8_off($msgctxt) if defined $msgctxt;
      my $msg_ctxt_id = defined $msgctxt ? join($__gettext_pp_context_glue, ($msgctxt, $msgid)) : $msgid;
      
      local $!; # Do not clobber errno!
      
      # This is also done in __load_domain but we need a proper value.
      $domainname = $__gettext_pp_textdomain
      	unless defined $domainname && length $domainname;
      
      # Category is always LC_MESSAGES (other categories are ignored).
      my $category_name = 'LC_MESSAGES';
      $category = LC_MESSAGES;
  
      my $domains = __load_domain ($domainname, $category, $category_name,
                                   $locale);
      
      my @trans = ();
      my $domain;
      my $found;
      foreach my $this_domain (@$domains) {
      	if ($this_domain && defined $this_domain->{messages}->{$msg_ctxt_id}) {
      		@trans = @{$this_domain->{messages}->{$msg_ctxt_id}};
      		shift @trans;
      		$domain = $this_domain;
      		$found = 1;
      		last;
      	}
      }
      @trans = ($msgid, $msgid_plural) unless @trans;
      
      my $trans = $trans[0];
      if ($plural) {
      	if ($domain) {
      		my $nplurals = 0;
      		($nplurals, $plural) = &{$domain->{plural_func}} ($n);
      		$plural = 0 unless defined $plural;
      		$nplurals = 0 unless defined $nplurals;
      		$plural = 0 if $nplurals <= $plural;
      	} else {
      		$plural = $n != 1 || 0;
      	}
      	
      	$trans = $trans[$plural] if defined $trans[$plural];
      }
      
      if ($found && defined $domain->{po_header}->{charset}) {
      	my $input_codeset = $domain->{po_header}->{charset};
      	# Convert into output charset.
      	my $output_codeset = $__gettext_pp_domain_codeset_bindings->{$domainname};
  
      	$output_codeset = $ENV{OUTPUT_CHARSET} unless defined $output_codeset;
      	$output_codeset = __get_codeset ($category, $category_name,
      									 $domain->{locale_id})
      		unless defined $output_codeset;
      	
      	unless (defined $output_codeset) {
      		# Still no point.
      		my $lc_ctype = __locale_category (POSIX::LC_CTYPE(), 
      									   'LC_CTYPE');
      		$output_codeset = $1
      			if $lc_ctype =~ /^[a-z]{2}(?:_[A-Z]{2})?\.([^@]+)/;
      	}
  
      	# No point. :-(
      	$output_codeset = $domain->{po_header}->{charset}
      		unless defined $output_codeset;
      
      	if (exists $__gettext_pp_domain_cache->{$output_codeset}) {
      		$output_codeset = $__gettext_pp_domain_cache->{$output_codeset};
      	} else {
      		$output_codeset = 'utf-8' if lc $output_codeset eq 'utf8';
      		$output_codeset = 
      			$__gettext_pp_domain_cache->{$output_codeset} =
      			Locale::Recode->resolveAlias ($output_codeset);
      	}
      	
      	if (defined $output_codeset &&
      		$output_codeset ne $domain->{po_header}->{charset}) {
      		# We have to convert.
      		my $recoder;
      		
      		if (exists 
      			$__gettext_pp_recoders->{$input_codeset}->{$output_codeset}) {
      			$recoder = $__gettext_pp_recoders->{$input_codeset}->{$output_codeset};
      		} else {
      			$recoder = 
      				$__gettext_pp_recoders->{$input_codeset}->{$output_codeset} =
      				Locale::Recode->new (from => $input_codeset,
      									 to => $output_codeset,
      									 );
      		}
      		
      		$recoder->recode ($trans);
      	}
      }
      
      return $trans;
  }
  
  sub dcnpgettext ($$$$$$) {
      return &_dcnpgettext_impl;
  }
  
  sub nl_putenv ($)
  {
      my ($envspec) = @_;
      return unless defined $envspec;
      return unless length $envspec;
      return if substr ($envspec, 0, 1) eq '=';
      
      my ($var, $value) = split /=/, $envspec, 2;
  
      # In Perl we *could* set empty environment variables even under
      # MS-DOS, but for compatibility reasons, we implement the
      # brain-damaged behavior of the Microsoft putenv().
      if ($^O eq 'MSWin32') {
          $value = '' unless defined $value;
          if (length $value) {
              $ENV{$var} = $value;
          } else {
              delete $ENV{$var};
          }
      } else {
          if (defined $value) {
              $ENV{$var} = $value;
          } else {
              delete $ENV{$var};
          }
      }
  
      return 1;
  }
  
  sub setlocale($;$) {
  	require POSIX;
  	&POSIX::setlocale;
  }
  
  sub __selected_locales {
  	my ($locale, $category, $category_name) = @_;
  
      my @locales;
      my $cache_key;
  
      if (defined $ENV{LANGUAGE} && length $ENV{LANGUAGE}) {
      	@locales = split /:/, $ENV{LANGUAGE};
      	$cache_key = $ENV{LANGUAGE};
      } elsif (!defined $locale) {
          # The system does not have LC_MESSAGES.  Guess the value.
      	@locales = $cache_key = __locale_category ($category, 
      	                                           $category_name);
      } else {
              @locales = $cache_key = $locale;
      }
  
  	return $cache_key, @locales;
  }
  
  sub __extend_locales {
  	my (@locales) = @_;
  
  	my @tries = @locales;
      my %locale_lookup = map { $_ => $_ } @tries;
  
      foreach my $locale (@locales) {
      	if ($locale =~ /^([a-z][a-z])
      		(?:(_[A-Z][A-Z])?
      		 (\.[-_A-Za-z0-9]+)?
      		 )?
      		(\@[-_A-Za-z0-9]+)?$/x) {
      		
      		if (defined $3) {
      			defined $2 ?
      				push @tries, $1 . $2 . $3 : push @tries, $1 . $3;
  					$locale_lookup{$tries[-1]} = $locale;
      		}
      		if (defined $2) {
      			push @tries, $1 . $2;
      			$locale_lookup{$1 . $2} = $locale;
      		}
      		if (defined $1) {
      			push @tries, $1 if defined $1;
      			$locale_lookup{$1} = $locale;
      		}
      	}
      }
  
  	return \@tries, \%locale_lookup;
  }
  
  sub __load_domain {
      my ($domainname, $category, $category_name, $locale) = @_;
  
      # If no locale was selected for the requested locale category,
      # l10n is disabled completely.  This matches the behavior of GNU
      # gettext.
      if ($category != LC_MESSAGES) {
          # Not supported.
          return [];
      }
          
      if (!defined $locale && $category != 1729) {
          $locale = POSIX::setlocale ($category);
          if (!defined $locale || 'C' eq $locale || 'POSIX' eq $locale) {
              return [];
          }
      }
      
      $domainname = $__gettext_pp_textdomain
      	unless defined $domainname && length $domainname;
  
      my $dir = bindtextdomain ($domainname, '');
      $dir = $__gettext_pp_default_dir unless defined $dir && length $dir;
  
      return [] unless defined $dir && length $dir;
  
  	my ($cache_key, @locales) = __selected_locales $locale, $category, $category_name;
  
      # Have we looked that one up already?
      my $domains = $__gettext_pp_domain_cache->{$dir}->{$cache_key}->{$category_name}->{$domainname};
      return $domains if defined $domains;
      return [] unless @locales;
      
      my @dirs = ($dir);
      my ($tries, $lookup) = __extend_locales @locales;
  
      push @dirs, $__gettext_pp_default_dir
  		if $__gettext_pp_default_dir && $dir ne $__gettext_pp_default_dir;
      
      my %seen;
  	my %loaded;
      foreach my $basedir (@dirs) {
      	foreach my $try (@$tries) {
  			# If we had already found a catalog for "xy_XY", do not try it
  			# again.
  			next if $loaded{$try};
  
      		my $fulldir = File::Spec->catfile($basedir, $try, $category_name);
      		next if $seen{$fulldir}++;
  
      		# If the cache for unavailable directories is removed,
      		# the three lines below should be replaced by:
      		# 'next unless -d $fulldir;'
      		next if $__gettext_pp_unavailable_dirs->{$fulldir};
      		++$__gettext_pp_unavailable_dirs->{$fulldir} and next
      				unless -d $fulldir;
              my $filename = File::Spec->catfile($fulldir, "$domainname.mo");
      		my $domain = __load_catalog $filename, $try;
      		next unless $domain;
      		
  			$loaded{$try} = 1;
  
      		$domain->{locale_id} = $lookup->{$try};
      		push @$domains, $domain;
      	}
      }
  
      $domains = [] unless defined $domains;
      
      $__gettext_pp_domain_cache->{$dir}
                                ->{$cache_key}
                                ->{$category_name}
                                ->{$domainname} = $domains;
  
      return $domains;
  }
  
  sub __load_catalog
  {
      my ($filename, $locale) = @_;
      
      # Alternatively we could check the filename for evil characters ...
      # (Important for CGIs).
      return unless -f $filename && -r $filename;
      
      local $/;
      local *HANDLE;
      
      open HANDLE, "<$filename"
      	or return;
      binmode HANDLE;
      my $raw = <HANDLE>;
      close HANDLE;
      
      # Corrupted?
      return if ! defined $raw || length $raw < 28;
      
      my $filesize = length $raw;
      
      # Read the magic number in order to determine the byte order.
      my $domain = {
  		filename => $filename
  	};
      my $unpack = 'N';
      $domain->{magic} = unpack $unpack, substr $raw, 0, 4;
      
      if ($domain->{magic} == 0xde120495) {
      	$unpack = 'V';
      } elsif ($domain->{magic} != 0x950412de) {
      	return;
      }
      my $domain_unpack = $unpack x 6;
      
      my ($revision, $num_strings, $msgids_off, $msgstrs_off,
      	$hash_size, $hash_off) = 
      		unpack (($unpack x 6), substr $raw, 4, 24);
      
      my $major = $revision >> 16;
      return if $major != 0; # Invalid revision number.
      
      $domain->{revision} = $revision;
      $domain->{num_strings} = $num_strings;
      $domain->{msgids_off} = $msgids_off;
      $domain->{msgstrs_off} = $msgstrs_off;
      $domain->{hash_size} = $hash_size;
      $domain->{hash_off} = $hash_off;
      
      return if $msgids_off + 4 * $num_strings > $filesize;
      return if $msgstrs_off + 4 * $num_strings > $filesize;
      
      my @orig_tab = unpack (($unpack x (2 * $num_strings)), 
      					   substr $raw, $msgids_off, 8 * $num_strings);
      my @trans_tab = unpack (($unpack x (2 * $num_strings)), 
      						substr $raw, $msgstrs_off, 8 * $num_strings);
      
      my $messages = {};
      
      for (my $count = 0; $count < 2 * $num_strings; $count += 2) {
      	my $orig_length = $orig_tab[$count];
      	my $orig_offset = $orig_tab[$count + 1];
      	my $trans_length = $trans_tab[$count];
      	my $trans_offset = $trans_tab[$count + 1];
      	
      	return if $orig_offset + $orig_length > $filesize;
      	return if $trans_offset + $trans_length > $filesize;
      	
      	my @origs = split /\000/, substr $raw, $orig_offset, $orig_length;
      	my @trans = split /\000/, substr $raw, $trans_offset, $trans_length;
      	
      	# The singular is the key, the plural plus all translations is the
      	# value.
      	my $msgid = $origs[0];
      	$msgid = '' unless defined $msgid && length $msgid;
      	my $msgstr = [ $origs[1], @trans ];
      	$messages->{$msgid} = $msgstr;
      }
      
      $domain->{messages} = $messages;
      
      # Try to find po header information.
      my $po_header = {};
      my $null_entry = $messages->{''}->[1];
      if ($null_entry) {
      	my @lines = split /\n/, $null_entry;
      	foreach my $line (@lines) {
      		my ($key, $value) = split /:/, $line, 2;
      		$key =~ s/-/_/g;
      		$po_header->{lc $key} = $value;
      	}
      }
      $domain->{po_header} = $po_header;
      
      if (exists $domain->{po_header}->{content_type}) {
      	my $content_type = $domain->{po_header}->{content_type};
      	if ($content_type =~ s/.*=//) {
      		$domain->{po_header}->{charset} = $content_type;
      	}
      }
      
      my $code = $domain->{po_header}->{plural_forms} || '';
      
      # Whitespace, locale-independent.
      my $s = '[ \011-\015]';
  
      # Untaint the plural header.
      # Keep line breaks as is (Perl 5_005 compatibility).
      $code = $domain->{po_header}->{plural_forms} 
          = __untaint_plural_header $code;
  
      $domain->{plural_func} = __compile_plural_function $code;
  
      unless (defined $domain->{po_header}->{charset} 
              && length $domain->{po_header}->{charset} 
              && $locale =~ /^(?:[a-z][a-z])
                              (?:(?:_[A-Z][A-Z])?
                               (\.[-_A-Za-z0-9]+)?
                              )?
                              (?:\@[-_A-Za-z0-9]+)?$/x) {
          $domain->{po_header}->{charset} = $1;
      }
                                  
      if (defined $domain->{po_header}->{charset}) {
          $domain->{po_header}->{charset} = 
              Locale::Recode->resolveAlias ($domain->{po_header}->{charset});
      }
      
      return $domain;
  }
  
  sub __locale_category
  {
      my ($category, $category_name) = @_;
      
      local $@;
      my $value = eval {POSIX::setlocale ($category)};
      
      # We support only XPG syntax, i. e.
      # language[_territory[.codeset]][@modifier].
      undef $value unless (defined $value && 
      					 length $value &&
      					 $value =~ /^[a-z][a-z]
      					 (?:_[A-Z][A-Z]
      					  (?:\.[-_A-Za-z0-9]+)?
      					  )?
      					 (?:\@[-_A-Za-z0-9]+)?$/x);
  
      unless ($value) {
      	$value = $ENV{LC_ALL};
      	$value = $ENV{$category_name} unless defined $value && length $value;
      	$value = $ENV{LANG} unless defined $value && length $value;
      	return 'C' unless defined $value && length $value;
      }
      
      return $value if $value ne 'C' && $value ne 'POSIX';
  }
  
  sub __get_codeset
  {
      my ($category, $category_name, $locale_id) = @_;
  
      local $@;
      unless (defined $has_nl_langinfo) {
      	eval {
      		require I18N::Langinfo;
      	};
      	$has_nl_langinfo = !$@;
      }
  
      if ($has_nl_langinfo) {
      	# Try to set the locale via the specified id.
      	my $saved_locale = eval { POSIX::setlocale (LC_ALL) };
      	my $had_lc_all = exists $ENV{LC_ALL};
      	my $saved_lc_all = $ENV{LC_ALL} if $had_lc_all;
  
      	# Now try to set the locale via the environment.  There is no
      	# point in calling the langinfo routines if this fails.
      	$ENV{LC_ALL} = $locale_id;
      	my $codeset;
      	my $lc_all = eval { POSIX::setlocale (LC_ALL, $locale_id); };
      	$codeset = I18N::Langinfo::langinfo (I18N::Langinfo::CODESET())
      		if defined $lc_all;
  
          # Restore environment.
      	if ($saved_locale) {
      		eval { POSIX::setlocale (LC_ALL, $saved_locale); }
      	}
      	if ($had_lc_all) {
              $ENV{LC_ALL} = $saved_lc_all if $had_lc_all;
      	} else {
      	    delete $ENV{LC_ALL};
      	}
      	return $codeset;
      }
  
      return;
  }
      
  sub __untaint_plural_header {
      my ($code) = @_;
  
      # Whitespace, locale-independent.
      my $s = '[ \t\r\n\013\014]';
  
      if ($code =~ m{^($s*
      				 nplurals$s*=$s*[0-9]+
      				 $s*;$s*
      				 plural$s*=$s*(?:$s|[-\?\|\&=!<>+*/\%:;a-zA-Z0-9_\(\)])+
      				 )}xms) {
      	return $1;
      }
  
      return '';    
  }
  
  sub __compile_plural_function {
      my ($code) = @_;
  
      # The leading and trailing space is necessary to be able to match
      # against word boundaries.
      my $plural_func;
      
      if (length $code) {
      	my $code = ' ' . $code . ' ';
      	$code =~ 
      		s/(?<=[^_a-zA-Z0-9])[_a-z][_A-Za-z0-9]*(?=[^_a-zA-Z0-9])/\$$&/gs;
      	
      	$code = "sub { my \$n = shift || 0; 
      			   my (\$plural, \$nplurals); 
      			   $code; 
      			   return (\$nplurals, \$plural ? \$plural : 0); }";
      	
      	# Now try to evaluate the code.	 There is no need to run the code in
      	# a Safe compartment.  The above substitutions should have destroyed
      	# all evil code.  Corrections are welcome!
          #warn $code;
      	$plural_func = eval $code;
          #warn $@ if $@;
      	undef $plural_func if $@;
      }
          
      # Default is Germanic plural (which is incorrect for French).
      $plural_func = eval "sub { (2, 1 != shift || 0) }" unless $plural_func;
  
      return $plural_func;    
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Locale::gettext_pp - Pure Perl Implementation of Uniforum Message Translation
  
  =head1 SYNOPSIS
  
   use Locale::gettext_pp qw(:locale_h :libintl_h);
  
   gettext $msgid;
   dgettext $domainname, $msgid;
   dcgettext $domainname, $msgid, LC_MESSAGES;
   ngettext $msgid, $msgid_plural, $count;
   dngettext $domainname, $msgid, $msgid_plural, $count;
   dcngettext $domainname, $msgid, $msgid_plural, $count, LC_MESSAGES;
   pgettext $msgctxt, $msgid;
   dpgettext $domainname, $msgctxt, $msgid;
   dcpgettext $domainname, $msgctxt, $msgid, LC_MESSAGES;
   npgettext $msgctxt, $msgid, $msgid_plural, $count;
   dnpgettext $domainname, $msgctxt, $msgid, $msgid_plural, $count;
   dcnpgettext $domainname, $msgctxt, $msgid, $msgid_plural, $count, LC_MESSAGES;
   textdomain $domainname;
   bindtextdomain $domainname, $directory;
   bind_textdomain_codeset $domainname, $encoding;
   my $category = LC_CTYPE;
   my $category = LC_NUMERIC;
   my $category = LC_TIME;
   my $category = LC_COLLATE;
   my $category = LC_MONETARY;
   my $category = LC_MESSAGES;
   my $category = LC_ALL;
  
  =head1 DESCRIPTION
  
  The module B<Locale::gettext_pp> is the low-level interface to 
  message translation according to the Uniforum approach that is
  for example used in GNU gettext and Sun's Solaris.
  
  Normally you should not use this module directly, but the high
  level interface Locale::TextDomain(3) that provides a much simpler
  interface.    This description is therefore deliberately kept
  brief.    Please refer to the GNU gettext documentation available at
  L<http://www.gnu.org/manual/gettext/> for in-depth and background 
  information on the topic.
  
  =head1 FUNCTIONS
  
  The module exports by default nothing.    Every function has to be
  imported explicitely or via an export tag (L<"EXPORT TAGS">).
  
  =over 4
  
  =item B<gettext MSGID>
  
  See L<Locale::Messages/FUNCTIONS>.
  
  =item B<dgettext TEXTDOMAIN, MSGID>
  
  See L<Locale::Messages/FUNCTIONS>.
  
  =item B<dcgettext TEXTDOMAIN, MSGID, CATEGORY>
  
  See L<Locale::Messages/FUNCTIONS>.
  
  =item B<ngettext MSGID, MSGID_PLURAL, COUNT>
  
  See L<Locale::Messages/FUNCTIONS>.
  
  =item B<dngettext TEXTDOMAIN, MSGID, MSGID_PLURAL, COUNT>
  
  See L<Locale::Messages/FUNCTIONS>.
  
  =item B<dcngettext TEXTDOMAIN, MSGID, MSGID_PLURAL, COUNT, CATEGORY>
  
  See L<Locale::Messages/FUNCTIONS>.
  
  =item B<pgettext MSGCTXT, MSGID>
  
  See L<Locale::Messages/FUNCTIONS>.
  
  =item B<dpgettext TEXTDOMAIN, MSGCTXT, MSGID>
  
  See L<Locale::Messages/FUNCTIONS>.
  
  =item B<dcpgettext TEXTDOMAIN, MSGCTXT, MSGID, CATEGORY>
  
  See L<Locale::Messages/FUNCTIONS>.
  
  =item B<npgettext MSGCTXT, MSGID, MSGID_PLURAL, COUNT>
  
  See L<Locale::Messages/FUNCTIONS>.
  
  =item B<dnpgettext TEXTDOMAIN, MSGCTXT, MSGID, MSGID_PLURAL, COUNT>
  
  See L<Locale::Messages/FUNCTIONS>.
  
  =item B<dcnpgettext TEXTDOMAIN, MSGCTXT, MSGID, MSGID_PLURAL, COUNT, CATEGORY>
  
  See L<Locale::Messages/FUNCTIONS>.
  
  =item B<textdomain TEXTDOMAIN>
  
  See L<Locale::Messages/FUNCTIONS>.
  
  =item B<bindtextdomain TEXTDOMAIN, DIRECTORY>
  
  See L<Locale::Messages/FUNCTIONS>.
  
  =item B<bind_textdomain_codeset TEXTDOMAIN, ENCODING>
  
  =item B<nl_putenv ENVSPEC>
  
  See L<Locale::Messages/FUNCTIONS>.
  
  =item B<setlocale>
  
  See L<Locale::Messages/FUNCTIONS>.
  
  =back
  
  =head1 CONSTANTS
  
  You can (maybe) get the same constants from POSIX(3); see there for
  a detailed description
  
  =over 4
  
  =item B<LC_CTYPE>
  
  =item B<LC_NUMERIC>
  
  =item B<LC_TIME>
  
  =item B<LC_COLLATE>
  
  =item B<LC_MONETARY>
  
  =item B<LC_MESSAGES>
  
  =item B<LC_ALL>
  
  See L<Locale::Messages/CONSTANTS> for more information.
  
  =back
  
  =head1 EXPORT TAGS
  
  This module does not export anything unless explicitely requested.
  You can import groups of functions via two tags:
  
  =over 4
  
  =item B<use Locale::gettext_pp qw(':locale_h')>
  
  Imports the functions that are normally defined in the C include
  file F<locale.h>:
  
  =over 8
  
  =item B<gettext()>
  
  =item B<dgettext()>
  
  =item B<dcgettext()>
  
  =item B<ngettext()>
  
  =item B<dngettext()>
  
  =item B<dcngettext()>
  
  =item B<pgettext()>
  
  Introduced with libintl-perl 1.17.
  
  =item B<dpgettext()>
  
  Introduced with libintl-perl 1.17.
  
  =item B<dcpgettext()>
  
  Introduced with libintl-perl 1.17.
  
  =item B<npgettext()>
  
  Introduced with libintl-perl 1.17.
  
  =item B<dnpgettext()>
  
  Introduced with libintl-perl 1.17.
  
  =item B<dcnpgettext()>
  
  Introduced with libintl-perl 1.17.
  
  =item B<textdomain()>
  
  =item B<bindtextdomain()>
  
  =item B<bind_textdomain_codeset()>
  
  =back
  
  =item B<use Locale::gettext_pp (':libintl_h')>
  
  Imports the locale category constants:
  
  =over 8
  
  =item B<LC_CTYPE>
  
  =item B<LC_NUMERIC>
  
  =item B<LC_TIME>
  
  =item B<LC_COLLATE>
  
  =item B<LC_MONETARY>
  
  =item B<LC_MESSAGES>
  
  =item B<LC_ALL>
  
  =back
  
  =back
  
  =head1 AUTHOR
  
  Copyright (C) 2002-2017 L<Guido Flohr|http://www.guido-flohr.net/>
  (L<mailto:guido.flohr@cantanea.com>), all rights reserved.  See the source
  code for details!code for details!
  
  =head1 SEE ALSO
  
  Locale::TextDomain(3pm), Locale::Messages(3pm), Encode(3pm),
  perllocale(3pm), POSIX(3pm), perl(1), gettext(1), gettext(3)
  
  =cut
  
  Local Variables:
  mode: perl
  perl-indent-level: 4
  perl-continued-statement-offset: 4
  perl-continued-brace-offset: 0
  perl-brace-offset: -4
  perl-brace-imaginary-offset: 0
  perl-label-offset: -4
  tab-width: 4
  End:
  
  =cut
LOCALE_GETTEXT_PP

    $main::fatpacked{"Log/ger.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOG_GER';
  package Log::ger;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-03-11'; # DATE
  our $DIST = 'Log-ger'; # DIST
  our $VERSION = '0.037'; # VERSION
  
  #IFUNBUILT
  # use strict 'subs', 'vars';
  # use warnings;
  #END IFUNBUILT
  
  our $re_addr = qr/\(0x([0-9a-f]+)/o;
  
  our %Levels = (
      fatal   => 10,
      error   => 20,
      warn    => 30,
      info    => 40,
      debug   => 50,
      trace   => 60,
  );
  
  our %Level_Aliases = (
      off     => 0,
      warning => 30,
  );
  
  our $Current_Level = 30;
  
  our $Caller_Depth_Offset = 0;
  
  # a flag that can be used by null output to skip using formatter
  our $_outputter_is_null;
  
  our $_dumper;
  
  our %Global_Hooks;
  
  # in Log/ger/Heavy.pm
  # our %Default_Hooks = (
  
  our %Package_Targets; # key = package name, value = \%per_target_conf
  our %Per_Package_Hooks; # key = package name, value = { phase => hooks, ... }
  
  our %Hash_Targets; # key = hash address, value = [$hashref, \%per_target_conf]
  our %Per_Hash_Hooks; # key = hash address, value = { phase => hooks, ... }
  
  our %Object_Targets; # key = object address, value = [$obj, \%per_target_conf]
  our %Per_Object_Hooks; # key = object address, value = { phase => hooks, ... }
  
  my $sub0 = sub {0};
  my $sub1 = sub {1};
  my $default_null_routines;
  
  sub install_routines {
      my ($target, $target_arg, $routines, $name_routines) = @_;
  
      if ($name_routines && !defined &subname) {
          if (eval { require Sub::Name; 1 }) {
              *subname = \&Sub::Name::subname;
          } else {
              *subname = sub {};
          }
      }
  
      if ($target eq 'package') {
  #IFUNBUILT
  #         no warnings 'redefine';
  #END IFUNBUILT
          for my $r (@$routines) {
              my ($code, $name, $lnum, $type) = @$r;
              next unless $type =~ /_sub\z/;
              #print "D:installing $name to package $target_arg\n";
              *{"$target_arg\::$name"} = $code;
              subname("$target_arg\::$name", $code) if $name_routines;
          }
      } elsif ($target eq 'object') {
  #IFUNBUILT
  #         no warnings 'redefine';
  #END IFUNBUILT
          my $pkg = ref $target_arg;
          for my $r (@$routines) {
              my ($code, $name, $lnum, $type) = @$r;
              next unless $type =~ /_method\z/;
              *{"$pkg\::$name"} = $code;
              subname("$pkg\::$name", $code) if $name_routines;
          }
      } elsif ($target eq 'hash') {
          for my $r (@$routines) {
              my ($code, $name, $lnum, $type) = @$r;
              next unless $type =~ /_sub\z/;
              $target_arg->{$name} = $code;
          }
      }
  }
  
  sub add_target {
      my ($target_type, $target_name, $per_target_conf, $replace) = @_;
      $replace = 1 unless defined $replace;
  
      if ($target_type eq 'package') {
          unless ($replace) { return if $Package_Targets{$target_name} }
          $Package_Targets{$target_name} = $per_target_conf;
      } elsif ($target_type eq 'object') {
          my ($addr) = "$target_name" =~ $re_addr;
          unless ($replace) { return if $Object_Targets{$addr} }
          $Object_Targets{$addr} = [$target_name, $per_target_conf];
      } elsif ($target_type eq 'hash') {
          my ($addr) = "$target_name" =~ $re_addr;
          unless ($replace) { return if $Hash_Targets{$addr} }
          $Hash_Targets{$addr} = [$target_name, $per_target_conf];
      }
  }
  
  sub _set_default_null_routines {
      $default_null_routines ||= [
          (map {(
              [$sub0, "log_$_", $Levels{$_}, 'logger_sub'],
              [$Levels{$_} > $Current_Level ? $sub0 : $sub1, "log_is_$_", $Levels{$_}, 'level_checker_sub'],
              [$sub0, $_, $Levels{$_}, 'logger_method'],
              [$Levels{$_} > $Current_Level ? $sub0 : $sub1, "is_$_", $Levels{$_}, 'level_checker_method'],
          )} keys %Levels),
      ];
  }
  
  sub get_logger {
      my ($package, %per_target_conf) = @_;
  
      my $caller = caller(0);
      $per_target_conf{category} = $caller
          if !defined($per_target_conf{category});
      my $obj = []; $obj =~ $re_addr;
      my $pkg = "Log::ger::Obj$1"; bless $obj, $pkg;
      add_target(object => $obj, \%per_target_conf);
      if (keys %Global_Hooks) {
          require Log::ger::Heavy;
          init_target(object => $obj, \%per_target_conf);
      } else {
          # if we haven't added any hooks etc, skip init_target() process and use
          # this preconstructed routines as shortcut, to save startup overhead
          _set_default_null_routines();
          install_routines(object => $obj, $default_null_routines, 0);
      }
      $obj; # XXX add DESTROY to remove from list of targets
  }
  
  sub _import_to {
      my ($package, $target_pkg, %per_target_conf) = @_;
  
      $per_target_conf{category} = $target_pkg
          if !defined($per_target_conf{category});
      add_target(package => $target_pkg, \%per_target_conf);
      if (keys %Global_Hooks) {
          require Log::ger::Heavy;
          init_target(package => $target_pkg, \%per_target_conf);
      } else {
          # if we haven't added any hooks etc, skip init_target() process and use
          # this preconstructed routines as shortcut, to save startup overhead
          _set_default_null_routines();
          install_routines(package => $target_pkg, $default_null_routines, 0);
      }
  }
  
  sub import {
      my ($package, %per_target_conf) = @_;
  
      my $caller = caller(0);
      $package->_import_to($caller, %per_target_conf);
  }
  
  1;
  # ABSTRACT: A lightweight, flexible logging framework
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Log::ger - A lightweight, flexible logging framework
  
  =head1 VERSION
  
  version 0.037
  
  =head1 SYNOPSIS
  
  =head2 Producing logs
  
  In your module (producer):
  
   package Foo;
   use Log::ger; # will install some logger routines e.g. log_warn, log_error
  
   sub foo {
       ...
       # produce some logs. no need to configure output or level.
       log_error "an error occured: %03d - %s", $errcode, $errmsg;
       ...
       log_debug "http response: %s", $http; # automatic dumping of data
   }
   1;
  
  =head2 Consuming logs
  
  =head3 Choosing an output
  
  In your application (consumer/listener):
  
   use Foo;
   use Log::ger::Output 'Screen'; # configure output
   # level is by default 'warn'
   foo(); # the error message is shown, but debug message is not.
  
  =head3 Choosing multiple outputs
  
  Instead of screen, you can output to multiple outputs (including multiple
  files):
  
   use Log::ger::Output 'Composite' => (
       outputs => {
           Screen => {},
           File   => [
               {conf=>{path=>'/path/to/app.log'}},
               ...
           ],
           ...
       },
   );
  
  See L<Log::ger::Manual::Tutorial::481_Output_Composite> for more examples.
  
  =head3 Choosing level
  
  One way to set level:
  
   use Log::ger::Util;
   Log::ger::Util::set_level('debug'); # be more verbose
   foo(); # the error message as well as debug message are now shown
  
  There are better ways, e.g. letting users configure log level via configuration
  file or command-line option. See L<Log::ger::Manual::Tutorial::300_Level> for
  more details.
  
  =head1 DESCRIPTION
  
  Log::ger is yet another logging framework with the following features:
  
  =over
  
  =item * Separation of producers and consumers/listeners
  
  Like L<Log::Any>, this offers a very easy way for modules to produce some logs
  without having to configure anything. Configuring output, level, etc can be done
  in the application as log consumers/listeners. To read more about this, see the
  documentation of L<Log::Any> or L<Log::ger::Manual> (but nevertheless see
  L<Log::ger::Manual> on why you might prefer Log::ger to Log::Any).
  
  =item * Lightweight and fast
  
  B<Slim distribution.> No non-core dependencies, extra functionalities are
  provided in separate distributions to be pulled as needed.
  
  B<Low startup overhead.> Only ~0.5-1ms. For comparison, L<strict> ~0.2-0.5ms,
  L<warnings> ~2ms, L<Log::Any> (v0.15) ~2-3ms, Log::Any (v1.049) ~8-10ms,
  L<Log::Log4perl> ~35ms. This is measured on a 2014-2015 PC and before doing any
  output configuration. I strive to make C<use Log::ger;> statement to be roughly
  as light as C<use strict;> or C<use warnings;> so the impact of adding the
  statement is really minimal and you can just add logging without much thought to
  most of your modules. This is important to me because I want logging to be
  pervasive.
  
  To test for yourself, try e.g. with L<bencher-code>:
  
   % bencher-code 'use Log::ger' 'use Log::Any' --startup
  
  B<Fast>. Low null-/stealth-logging overhead, about 1.5x faster than Log::Any, 3x
  faster than Log4perl, 5x faster than L<Log::Fast>, ~40x faster than
  L<Log::Contextual>, and ~100x faster than L<Log::Dispatch>.
  
  For more benchmarks, see L<Bencher::Scenarios::LogGer>.
  
  B<Conditional compilation.> There is a plugin to optimize away unneeded logging
  statements, like assertion/conditional compilation, so they have zero runtime
  performance cost. See L<Log::ger::Plugin::OptAway>.
  
  Being lightweight means the module can be used more universally, from CLI to
  long-running daemons to inside routines with tight loops.
  
  =item * Flexible
  
  B<Customizable levels and routine/method names.> Can be used in a procedural or
  OO style. Log::ger can mimic the interface of L<Log::Any>, L<Log::Contextual>,
  L<Log::Log4perl>, or some other popular logging frameworks, to ease migration or
  adjust with your personal style.
  
  B<Per-package settings.> Each importer package can use its own format/layout,
  output. For example, a module that is migrated from Log::Any uses Log::Any-style
  logging, while another uses native Log::ger style, and yet some other uses block
  formatting like Log::Contextual. This eases code migration and teamwork. Each
  module author can preserve her own logging style, if wanted, and all the modules
  still use the same framework.
  
  B<Dynamic.> Outputs and levels can be changed anytime during run-time and logger
  routines will be updated automatically. This is useful in situation like a
  long-running server application: you can turn on tracing logs temporarily to
  debug problems, then turn them off again, without restarting your server.
  
  B<Interoperability.> There are modules to interop with Log::Any, either consume
  Log::Any logs (see L<Log::Any::Adapter::LogGer>) or produce logs to be consumed
  by Log::Any (see L<Log::ger::Output::LogAny>).
  
  B<Many output modules and plugins.> See C<Log::ger::Output::*>,
  C<Log::ger::Format::*>, C<Log::ger::Layout::*>, C<Log::ger::Plugin::*>. Writing
  an output module in Log::ger is easier than writing a Log::Any::Adapter::*.
  
  =back
  
  For more documentation, start with L<Log::ger::Manual>.
  
  =for Pod::Coverage ^(.+)$
  
  =head1 SEE ALSO
  
  Some other popular logging frameworks: L<Log::Any>, L<Log::Contextual>,
  L<Log::Log4perl>, L<Log::Dispatch>, L<Log::Dispatchouli>.
  
  If you still prefer debugging using the good old C<print()>, there's
  L<Debug::Print>.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
LOG_GER

    $main::fatpacked{"Log/ger/App.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOG_GER_APP';
  package Log::ger::App;
  
  our $DATE = '2019-10-06'; # DATE
  our $VERSION = '0.013'; # VERSION
  
  # IFUNBUILT
  # use strict;
  # use warnings;
  # END IFUNBUILT
  
  our $DEBUG = defined($ENV{LOG_GER_APP_DEBUG}) ? $ENV{LOG_GER_APP_DEBUG} : 0;
  
  sub _set_level {
      my $name = shift;
  
      while (my ($source, $param, $note) = splice @_, 0, 3) {
          if ($source eq 'val') {
              if (defined $param) {
                  warn "[lga] Setting $name to $param (from $note)\n" if $DEBUG;
                  return $param;
              }
          } elsif ($source eq 'envset') {
              my $prefix = $param;
              if (defined $ENV{"${prefix}LOG_LEVEL"}) {
                  my $val = $ENV{"${prefix}LOG_LEVEL"};
                  warn "[lga] Setting $name to $val (from environment ${prefix}LOG_LEVEL)\n" if $DEBUG;
                  return $val;
              }
              if ($ENV{"${prefix}TRACE"}) {
                  warn "[lga] Setting $name to trace (from environment ${prefix}TRACE)\n" if $DEBUG;
                  return 'trace';
              }
              if ($ENV{"${prefix}DEBUG"}) {
                  warn "[lga] Setting $name to debug (from environment ${prefix}DEBUG)\n" if $DEBUG;
                  return 'debug';
              }
              if ($ENV{"${prefix}VERBOSE"}) {
                  warn "[lga] Setting $name to info (from environment ${prefix}VERBOSE)\n" if $DEBUG;
                  return 'info';
              }
              if ($ENV{"${prefix}QUIET"}) {
                  warn "[lga] Setting $name to trace (from environment ${prefix}QUIET)\n" if $DEBUG;
                  return 'error';
              }
          } else {
              die "BUG: Unknown level source '$source'";
          }
      }
      'warn';
  }
  
  sub _is_daemon {
      return $main::IS_DAEMON if defined $main::IS_DAEMON;
      for (
          "App/Daemon.pm",
          "Daemon/Easy.pm",
          "Daemon/Daemonize.pm",
          "Daemon/Generic.pm",
          "Daemonise.pm",
          "Daemon/Simple.pm",
          "HTTP/Daemon.pm",
          "IO/Socket/INET/Daemon.pm",
          #"Mojo/Server/Daemon.pm", # simply loading Mojo::UserAgent will load this too
          "MooseX/Daemonize.pm",
          "Net/Daemon.pm",
          "Net/Server.pm",
          "Proc/Daemon.pm",
          "Proc/PID/File.pm",
          "Win32/Daemon/Simple.pm") {
          return 1 if $INC{$_};
      }
      0;
  }
  
  sub import {
      no warnings 'once'; # $Log::ger::Current_Level
  
      my ($pkg, %args) = @_;
  
      require Log::ger;
      require Log::ger::Util;
  
      my $level_arg = delete $args{level};
      my $default_level_arg = delete $args{default_level};
  
      my $level = _set_level(
          "general log level",
          val => $level_arg, "import argument 'level'",
          envset => "", "",
          val => $default_level_arg, "import argument 'default_level'",
          val => 'warn', "fallback value",
      );
      $Log::ger::Current_Level = Log::ger::Util::numeric_level($level);
  
      my $is_daemon = delete $args{daemon};
      $is_daemon = _is_daemon() if !defined($is_daemon);
  
      my $is_oneliner = $0 eq '-e';
  
      my $progname = delete $args{name};
      unless (defined $progname) {
          ($progname = $0) =~ s!.+/!!;
          $progname =~ s/\.pl$//;
      }
      unless (length $progname) {
          $progname = "prog";
      }
  
      # configuration for Log::ger::Output::Composite
      my %conf = (
          outputs => {},
      );
  
      # add Screen
      {
          last if $is_daemon;
          my $olevel = _set_level(
              "screen log level",
              envset => "SCREEN_", "",
              val => $level, "general log level",
          );
          last if $olevel eq 'off';
          my $fmt = ($ENV{LOG_ADD_TIMESTAMP} ? '[%d] ': ''). '%m';
          $conf{outputs}{Screen} = {
              conf   => { formatter => sub { "$progname: $_[0]" } },
              level  => $olevel,
              layout => [Pattern => {format => $fmt}],
          };
      }
  
      # add File
      {
          my $file_name = delete $args{file_name};
          unless (defined $file_name) {
              $file_name = "$progname.log";
          }
  
          my $file_dir  = delete $args{file_dir};
          unless (defined $file_dir) {
              require PERLANCAR::File::HomeDir;
              $file_dir = $> ? PERLANCAR::File::HomeDir::get_my_home_dir() :
                  (-d "/var/log" ? "/var/log" : "/");
          }
  
          last if $0 eq '-';
  
          my $file_path = "$file_dir/$file_name";
          my $olevel = _set_level(
              "file ($file_path) log level",
              envset => "FILE_", "",
              val => $level, "general log level",
          );
          last if $olevel eq 'off';
          $conf{outputs}{File} = {
              conf   => { path => $file_path },
              level  => $olevel,
              layout => [Pattern => {format => '[pid %P] [%d] %m'}],
          };
      }
  
      # add Syslog
      {
          last unless $is_daemon;
          my $olevel = _set_level(
              "syslog log level",
              envset => "SYSLOG_", "",
              val => $level, "general log level",
          );
          last if $olevel eq 'off';
          $conf{outputs}{Syslog} = {
              conf => { ident => $progname, facility => 'daemon' },
              level => $olevel,
          };
      }
  
      if (my $outputs = delete $args{outputs}) {
          $conf{outputs}{$_} = $outputs->{$_}
              for keys %{$outputs->{$_}};
      }
  
      die "Unknown argument(s): ".join(", ", sort keys %args)
          if keys %args;
  
      require Log::ger::Output;
      Log::ger::Output->set('Composite', %conf);
  }
  
  1;
  # ABSTRACT: An easy way to use Log::ger in applications
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Log::ger::App - An easy way to use Log::ger in applications
  
  =head1 VERSION
  
  version 0.013
  
  =head1 SYNOPSIS
  
  In your script:
  
   use Log::ger::App;
   use Your::App::Module; # your module which uses Log::ger to do its logging
  
  If you also do logging in your script:
  
   use Log::ger::App;
   use Log::ger;
  
   log_warn("Some log ...");
  
  =head1 DESCRIPTION
  
  This module basically loads L<Log::ger::Output::Composite> with some sensible
  defaults and allows customizing some aspects via environment variable.
  
  =head2 Default outputs
  
   Code                            Screen  File                   Syslog
   ------------------------------  ------  ----                   ------
   One-liner (-e)                  y       -                      -
   Script running as normal user   y       ~/PROGNAME.log         -
   Script running as root          y       /var/log/PROGNAME.log  -
   Daemon                          -       /var/log/PROGNAME.log  y
  
  =head2 Determining if script is a daemon
  
  Log::ger::App assumes your script is a daemon if some daemon-related modules are
  loaded, e.g. L<App::Daemon>, L<HTTP::Daemon>, L<Net::Daemon>, etc (see the
  source code for the complete list). Alternatively, you can also set
  C<$main::IS_DAEMON> to 1 (0) to specifically state that your script is (not) a
  daemon. Or, you can set it via import argument (see L</"import">).
  
  =head2 Setting general log level
  
  B<Via import argument 'level'.> You can set general log level via import
  argument C<level> (see L</"import">) but users of your script will not be able
  to customize it:
  
   use Log::ger::App level => 'debug'; # hard-coded to debug, not recommended
  
  B<Via environment variables.> You can also set general log level from
  environment using C<LOG_LEVEL> (e.g. C<LOG_LEVEL=trace> to set level to trace or
  C<LOG_LEVEL=0> to turn off logging). Alternatively, you can set to C<trace>
  using C<TRACE=1>, or C<debug> with C<DEBUG=1>, C<info> with C<VERBOSE=1>,
  C<error> with C<QUIET=1>.
  
  B<Via import argument 'default_level'>. If the environment variables does not
  provide a value, next the import argument C<default_level> is consulted. This is
  the preferred method of setting default level:
  
   use Log::ger::App default_level => 'info'; # be verbose by default. unless changed by env vars
  
  C<warn>. The fallback level is warn, if all the above does not provide a value.
  
  =head2 Setting per-output log level
  
  B<Via environment variables.> You can set level for each output using
  I<OUTPUT_NAME>_{C<LOG_LEVEL|TRACE|DEBUG|VERBOSE|QUIET>} environment variables.
  For example, C<SCREEN_DEBUG=1> to set screen level to C<debug> or
  C<FILE_LOG_LEVEL=off> to turn off file logging.
  
  B<General level.> If the environment variables do not provide a value, the
  general level (see L</"Setting general log level">) will be used.
  
  =head2 Showing timestamp
  
  Timestamps are shown in log files. On the screen, timestamps are not shown by
  default. To show timestamps on the screen, set C<LOG_ADD_TIMESTAMP> to true. For
  example, when timestamps are not shown:
  
   myprog: First log message
   myprog: Doing task 1 ...
   myprog: Doing task 2 ...
  
  When timestamps are shown:
  
   myprog: [2018-08-30T15:14:50] First log message
   myprog: [2018-08-30T15:14:50] Doing task 1 ...
   myprog: [2018-08-30T15:15:01] Doing task 2 ...
  
  =head1 FUNCTIONS
  
  =head2 import
  
  Usage:
  
   $pkg->import(%args)
  
  Arguments:
  
  =over
  
  =item * level
  
  str|num. Explicitly set a hard-coded level. Not recommended because of lack of
  flexibility. See instead: L</default_level>.
  
  =item * default_level
  
  str|num. Instead of hard-coding level with L</level>, you can set a default
  level. Environment variables will be consulted first (as described in
  L</DESCRIPTION>) before falling back to this level.
  
  =item * name
  
  str. Explicitly set program name. Otherwise, default will be taken from C<$0>
  (after path and '.pl' suffix is removed) or set to C<prog>.
  
  Program name will be shown on the screen, e.g.:
  
   myprog: First log message
   myprog: Doing task 1 ...
   myprog: Doing task 2 ...
   myprog: Exiting ...
  
  =item * file_name
  
  str. Explicitly set log filename. By default, filename will be set to
  I<name>.log.
  
  =item * file_dir
  
  str. Explicitly set log file's directory. By default, it is user's home (if not
  running as root), or F</var/log> (if running as root).
  
  =item * daemon
  
  bool. Explicitly tell Log::ger::App that your application is a daemon or not.
  Otherwise, Log::ger::App will try some heuristics to guess whether your
  application is a daemon: from the value of C<$main::IS_DAEMON> and from the
  presence of modules like L<HTTP::Daemon>, L<Proc::Daemon>, etc.
  
  =item * outputs
  
  hash. Specify extra outputs. Will be passed to L<Log::ger::Output::Composite>
  configuration.
  
  =back
  
  =head1 VARIABLES
  
  =head2 $DEBUG
  
  Default is false. If set to true, will show more details about how log level,
  etc is set.
  
  =head1 ENVIRONMENT
  
  =head2 LOG_GER_APP_DEBUG
  
  Used to set the default for C<$DEBUG>.
  
  =head2 LOG_ADD_TIMESTAMP
  
  Boolean. Default to false. If set to true, will add timestamps to the screen
  log. Normally, timestamps will only be added to the file log.
  
  =head2 LOG_LEVEL
  
  String. Can be set to C<off> or numeric/string log level.
  
  =head2 TRACE
  
  Bool.
  
  =head2 DEBUG
  
  Bool.
  
  =head2 VERBOSE
  
  Bool.
  
  =head2 QUIET
  
  Bool.
  
  =head2 SCREEN_LOG_LEVEL
  
  =head2 SCREEN_TRACE
  
  =head2 SCREEN_DEBUG
  
  =head2 SCREEN_VERBOSE
  
  =head2 SCREEN_QUIET
  
  =head2 FILE_LOG_LEVEL
  
  =head2 FILE_TRACE
  
  =head2 FILE_DEBUG
  
  =head2 FILE_VERBOSE
  
  =head2 FILE_QUIET
  
  =head2 SYSLOG_LOG_LEVEL
  
  =head2 SYSLOG_TRACE
  
  =head2 SYSLOG_DEBUG
  
  =head2 SYSLOG_VERBOSE
  
  =head2 SYSLOG_QUIET
  
  =head1 FAQS
  
  =head2 How do I turn off file logging?
  
  By default, file logging is on unless running as a Perl one-liner (under
  C<perl>'s C<-e>).
  
  To explicitly turn file logging off, you can set I<FILE_LEVEL> environment
  variable to C<off>, for example:
  
   BEGIN { $ENV{FILE_LEVEL} //= "off" }
   use Log::ger::App;
  
  =head2 How do I turn off screen logging?
  
  By default, screen logging is on unless script is a daemon.
  
  To explicitly turn screen logging off, you can set I<SCREEN_LEVEL> environment
  variable to C<off>, for example:
  
   BEGIN { $ENV{SCREEN_LEVEL} //= "off" }
   use Log::ger::App;
  
  =head2 How do I turn off syslog logging?
  
  By default, syslog logging is on if script is a daemon.
  
  To explicitly turn syslog logging off, you can set I<SYSLOG_LEVEL> environment
  variable to C<off>, for example:
  
   BEGIN { $ENV{SYSLOG_LEVEL} //= "off" }
   use Log::ger::App;
  
  =head2 Why doesn't re-setting log level using Log::ger::Util::set_level() work?
  
  (This FAQ item is from L<Log::ger::Output::Composite>'s, slightly modified).
  
  The Log::ger::Output::Composite plugin that Log::ger::App uses sets its own
  levels and logs using a multilevel routine (which gets called for all levels).
  Re-setting log level dynamically via L<Log::ger::Util>'s C<set_level> will not
  work as intended, which is fortunate or unfortunate depending on your need.
  
  If you want to override all levels settings with a single value, you can use
  C<Log::ger::Output::Composite::set_level>, for example:
  
   Log::ger::Util::set_level('trace'); # also set this too
   Log::ger::Output::Composite::set_level('trace');
  
  This sets an internal level setting which is respected and has the highest
  precedence so all levels settings will use this instead. If previously you have:
  
   Log::ger::Output->set(Composite => {
       default_level => 'error',
       outputs => {
           File => {path=>'/foo', level=>'debug'},
           Screen => {level=>'info', category_level=>{MyApp=>'warn'}},
       },
       category_level => {
           'MyApp::SubModule1' => 'debug',
       },
   });
  
  then after the C<Log::ger::Output::Composite::set_level('trace')>, all the above
  per-category and per-output levels will be set to C<trace>.
  
  =head1 SEE ALSO
  
  L<Log::ger>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2019, 2018, 2017 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
LOG_GER_APP

    $main::fatpacked{"Log/ger/Filter.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOG_GER_FILTER';
  package Log::ger::Filter;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-03-11'; # DATE
  our $DIST = 'Log-ger'; # DIST
  our $VERSION = '0.037'; # VERSION
  
  use parent qw(Log::ger::Plugin);
  
  1;
  # ABSTRACT: Use a filter plugin
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Log::ger::Filter - Use a filter plugin
  
  =head1 VERSION
  
  version 0.037
  
  =head1 SYNOPSIS
  
  To set globally:
  
   use Log::ger::Filter;
   Log::ger::Filter->set('Code', code => sub{ ... });
  
  or:
  
   use Log::ger::Filter 'Code', (code => sub { ... });
  
  To set for current package only:
  
   use Log::ger::Filter;
   Log::ger::Filter->set_for_current_package('Code', code => sub { ... });
  
  =for Pod::Coverage ^(.+)$
  
  =head1 SEE ALSO
  
  L<Log::ger::Output>
  
  L<Log::ger::Plugin>
  
  L<Log::ger::Format>
  
  L<Log::ger::Layout>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
LOG_GER_FILTER

    $main::fatpacked{"Log/ger/Filter/Code.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOG_GER_FILTER_CODE';
  package Log::ger::Filter::Code;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-03-11'; # DATE
  our $DIST = 'Log-ger'; # DIST
  our $VERSION = '0.037'; # VERSION
  
  use strict;
  use warnings;
  
  sub meta { +{
      v => 1,
  } }
  
  sub get_hooks {
      my %conf = @_;
  
      $conf{code} or die "Please specify code";
  
      return {
          create_filter => [
              __PACKAGE__, # key
              50,          # priority
              sub {        # hook
                  my %hook_args = @_; # see Log::ger::Manual::Internals/"Arguments passed to hook"
  
                  [$conf{code}];
              }],
      };
  }
  
  1;
  # ABSTRACT: Filter using a coderef
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Log::ger::Filter::Code - Filter using a coderef
  
  =head1 VERSION
  
  version 0.037
  
  =head1 SYNOPSIS
  
   use Log::ger::Filter Code => (
       code => sub { ... },
   );
  
  =head1 DESCRIPTION
  
  Mainly for testing only.
  
  =for Pod::Coverage ^(.+)$
  
  =head1 CONFIGURATION
  
  =head2 code => coderef
  
  Required.
  
  =head1 SEE ALSO
  
  L<Log::ger>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
LOG_GER_FILTER_CODE

    $main::fatpacked{"Log/ger/Format.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOG_GER_FORMAT';
  package Log::ger::Format;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-03-11'; # DATE
  our $DIST = 'Log-ger'; # DIST
  our $VERSION = '0.037'; # VERSION
  
  use parent qw(Log::ger::Plugin);
  
  sub _import_sets_for_current_package { 1 }
  
  1;
  # ABSTRACT: Use a format plugin
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Log::ger::Format - Use a format plugin
  
  =head1 VERSION
  
  version 0.037
  
  =head1 SYNOPSIS
  
  To set for current package only:
  
   use Log::ger::Format 'Block';
  
  or:
  
   use Log::ger::Format;
   Log::ger::Format->set_for_current_package('Block');
  
  To set globally:
  
   use Log::ger::Format;
   Log::ger::Format->set('Block');
  
  =head1 DESCRIPTION
  
  Note: Since format plugins affect log-producing code, the import syntax defaults
  to setting for current package instead of globally.
  
  =for Pod::Coverage ^(.+)$
  
  =head1 SEE ALSO
  
  L<Log::ger::Layout>
  
  L<Log::ger::Output>
  
  L<Log::ger::Plugin>
  
  L<Log::ger::Filter>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
LOG_GER_FORMAT

    $main::fatpacked{"Log/ger/Format/Default.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOG_GER_FORMAT_DEFAULT';
  package Log::ger::Format::Default;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-03-11'; # DATE
  our $DIST = 'Log-ger'; # DIST
  our $VERSION = '0.037'; # VERSION
  
  use strict;
  use warnings;
  
  sub meta { +{
      v => 2,
  } }
  
  sub get_hooks {
      my %conf = @_;
  
      return {
          create_formatter => [
              __PACKAGE__, # key
              50,          # priority
              sub {        # hook
                  my %hook_args = @_; # see Log::ger::Manual::Internals/"Arguments passed to hook"
  
  
               my $formatter =
  
                   # the default formatter is sprintf-style that dumps data
                   # structures arguments as well as undef as '<undef>'.
                   sub {
                       return $_[0] if @_ < 2;
                       my $fmt = shift;
                       my @args;
                       for (@_) {
                           if (!defined($_)) {
                               push @args, '<undef>';
                           } elsif (ref $_) {
                               require Log::ger::Util unless $Log::ger::_dumper;
                               push @args, Log::ger::Util::_dump($_);
                           } else {
                               push @args, $_;
                           }
                       }
                       # redefine is just a dummy category for perls < 5.22 which
                       # don't have 'redundant' yet
                       no warnings ($warnings::Bits{'redundant'} ? 'redundant' : 'redefine');
                       sprintf $fmt, @args;
                   };
  
               [$formatter];
  
  
              }],
      };
  }
  
  1;
  # ABSTRACT: Use default Log::ger formatting style
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Log::ger::Format::Default - Use default Log::ger formatting style
  
  =head1 VERSION
  
  version 0.037
  
  =head1 SYNOPSIS
  
   use Log::ger::Format 'Default';
   use Log::ger;
  
   log_debug "Printed as is";
   # will format the log message as: Printed as is
  
   log_debug "Data for %s is %s", "budi", {foo=>'blah', bar=>undef};
   # will format the log message as: Data for budi is {bar=>undef,foo=>"blah"}
  
  =head1 DESCRIPTION
  
  This is the default Log::ger formatter, which: 1) passes the argument as-is if
  there is only a single argument; or, if there are more than one argument, 2)
  treats the arguments like sprintf(), where the first argument is the template
  and the rest are variables to be substituted to the conversions inside the
  template. In the second case, reference arguments will be dumped using
  L<Data::Dmp> or L<Data::Dumper> by default (but the dumper is configurable by
  setting C<$Log::ger::_dumper>; see for example L<Log::ger::UseDataDump> or
  L<Log::ger::UseDataDumpColor>).
  
  The same code is already included in L<Log::ger::Heavy>; this module just
  repackages it so it's more reusable.
  
  =for Pod::Coverage ^(.+)$
  
  =head1 SEE ALSO
  
  L<Log::ger::Format::Join>
  
  L<Log::ger>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
LOG_GER_FORMAT_DEFAULT

    $main::fatpacked{"Log/ger/Format/None.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOG_GER_FORMAT_NONE';
  package Log::ger::Format::None;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-03-11'; # DATE
  our $DIST = 'Log-ger'; # DIST
  our $VERSION = '0.037'; # VERSION
  
  sub meta { +{
      v => 2,
  } }
  
  sub get_hooks {
      return {
          create_formatter => [
              __PACKAGE__, # key
              50,          # priority
              sub {        # hook
                  my %hook_args = @_; # see Log::ger::Manual::Internals/"Arguments passed to hook"
                  my $formatter = sub { shift };
                  [$formatter];
              }],
      };
  }
  
  1;
  # ABSTRACT: Perform no formatting on the message
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Log::ger::Format::None - Perform no formatting on the message
  
  =head1 VERSION
  
  version 0.037
  
  =head1 SYNOPSIS
  
   use Log::ger::Format 'None';
  
  =head1 DESCRIPTION
  
  =for Pod::Coverage ^(.+)$
  
  =head1 CONFIGURATION
  
  =head1 SEE ALSO
  
  L<Log::ger>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
LOG_GER_FORMAT_NONE

    $main::fatpacked{"Log/ger/Heavy.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOG_GER_HEAVY';
  package Log::ger::Heavy;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-03-11'; # DATE
  our $DIST = 'Log-ger'; # DIST
  our $VERSION = '0.037'; # VERSION
  
  #IFUNBUILT
  # use strict;
  # use warnings;
  #END IFUNBUILT
  
  package
      Log::ger;
  
  #IFUNBUILT
  # use vars qw(
  #                $re_addr
  #                %Levels
  #                %Level_Aliases
  #                $Current_Level
  #                $_outputter_is_null
  #                $_dumper
  #                %Global_Hooks
  #                %Package_Targets
  #                %Per_Package_Hooks
  #                %Hash_Targets
  #                %Per_Hash_Hooks
  #                %Object_Targets
  #                %Per_Object_Hooks
  #        );
  #END IFUNBUILT
  
  # key = phase, value = [ [key, prio, coderef], ... ]
  our %Default_Hooks = (
      create_filter => [],
  
      create_formatter => [
          [__PACKAGE__, 90,
           sub {
               my %args = @_;
  
  # BEGIN_BLOCK: default_formatter
  
               my $formatter =
  
                   # the default formatter is sprintf-style that dumps data
                   # structures arguments as well as undef as '<undef>'.
                   sub {
                       return $_[0] if @_ < 2;
                       my $fmt = shift;
                       my @args;
                       for (@_) {
                           if (!defined($_)) {
                               push @args, '<undef>';
                           } elsif (ref $_) {
                               require Log::ger::Util unless $Log::ger::_dumper;
                               push @args, Log::ger::Util::_dump($_);
                           } else {
                               push @args, $_;
                           }
                       }
                       # redefine is just a dummy category for perls < 5.22 which
                       # don't have 'redundant' yet
                       no warnings ($warnings::Bits{'redundant'} ? 'redundant' : 'redefine');
                       sprintf $fmt, @args;
                   };
  
               [$formatter];
  
  # END_BLOCK: default_formatter
  
           }],
      ],
  
      create_layouter => [],
  
      create_routine_names => [
          [__PACKAGE__, 90,
           # the default names are log_LEVEL() and log_is_LEVEL() for subroutine
           # names, or LEVEL() and is_LEVEL() for method names
           sub {
               my %args = @_;
  
               my $levels = [keys %Levels];
  
               return [{
                   logger_subs           => [map { ["log_$_", $_]    } @$levels],
                   level_checker_subs    => [map { ["log_is_$_", $_] } @$levels],
                   # used when installing to hash or object
                   logger_methods        => [map { ["$_", $_]        } @$levels],
                   level_checker_methods => [map { ["is_$_", $_]     } @$levels],
               }, 1];
           }],
      ],
  
      # old name for create_outputter, deprecated and will be removed in the
      # future
      create_log_routine => [],
  
      create_outputter => [
          [__PACKAGE__, 10,
           # the default behavior is to create a null routine for levels that are
           # too high than the global level ($Current_Level). since we run at high
           # priority (10), we block typical output plugins at normal priority
           # (50). this is a convenience so normally a plugin does not have to
           # deal with level checking. plugins that want to do its own level
           # checking can use a higher priority.
           sub {
               my %args = @_;
               my $level = $args{level};
               my $num_outputs = 0;
               $num_outputs += @{ $Global_Hooks{create_log_routine} }; # old name, will be removed
               $num_outputs += @{ $Global_Hooks{create_outputter} };
               if ( # level indicates routine should be a null logger
                   (defined $level && $Current_Level < $level) ||
                       # there's only us that produces log routines (e.g. no outputs)
                       $num_outputs == 1
               ) {
                   $_outputter_is_null = 1;
                   return [sub {0}];
               }
               [undef]; # decline, let output plugin supply logger routines
           }],
      ],
  
      # old name for create_level_checker, deprecated and will be removed in the
      # future
      create_is_routine => [],
  
      create_level_checker => [
          [__PACKAGE__, 90,
           # the default behavior is to compare to global level. normally this
           # behavior suffices. we run at low priority (90) so normal plugins
           # which typically use priority 50 can override us.
           sub {
               my %args = @_;
               my $level = $args{level};
               [sub { $Current_Level >= $level }];
           }],
      ],
  
      before_install_routines => [],
  
      after_install_routines => [],
  );
  
  for my $phase (keys %Default_Hooks) {
      $Global_Hooks{$phase} = [@{ $Default_Hooks{$phase} }];
  }
  
  # if flow_control is 1, stops after the first hook that gives non-undef result.
  # flow_control can also be a coderef that will be called after each hook with
  # ($hook, $hook_res) and can return 1 to mean stop.
  sub run_hooks {
      my ($phase, $hook_args, $flow_control,
          $target_type, $target_name) = @_;
      #print "D: running hooks for phase $phase\n";
  
      $Global_Hooks{$phase} or die "Unknown phase '$phase'";
      my @hooks = @{ $Global_Hooks{$phase} };
  
      if ($target_type eq 'package') {
          unshift @hooks, @{ $Per_Package_Hooks{$target_name}{$phase} || [] };
      } elsif ($target_type eq 'hash') {
          my ($addr) = "$target_name" =~ $re_addr;
          unshift @hooks, @{ $Per_Hash_Hooks{$addr}{$phase} || [] };
      } elsif ($target_type eq 'object') {
          my ($addr) = "$target_name" =~ $re_addr;
          unshift @hooks, @{ $Per_Object_Hooks{$addr}{$phase} || [] };
      }
  
      my $res;
      for my $hook (sort {$a->[1] <=> $b->[1]} @hooks)  {
          my $hook_res = $hook->[2]->(%$hook_args);
          if (defined $hook_res->[0]) {
              $res = $hook_res->[0];
              #print "D:   got result from hook $hook->[0]: $res\n";
              if (ref $flow_control eq 'CODE') {
                  last if $flow_control->($hook, $hook_res);
              } else {
                  last if $flow_control;
              }
          }
          last if $hook_res->[1];
      }
      return $res;
  }
  
  sub init_target {
      my ($target_type, $target_name, $per_target_conf) = @_;
  
      #print "D:init_target($target_type, $target_name, ...)\n";
      my %hook_args = (
          target_type     => $target_type,
          target_name     => $target_name,
          per_target_conf => $per_target_conf,
      );
  
      # collect only a single filter
      my %filters;
      run_hooks(
          'create_filter', \%hook_args,
          # collect filters, until a hook instructs to stop
          sub {
              my ($hook, $hook_res) = @_;
              my ($filter, $flow_control, $fltname) = @$hook_res;
              $fltname = 'default' if !defined($fltname);
              $filters{$fltname} ||= $filter;
              $flow_control;
          },
          $target_type, $target_name);
  
      my %formatters;
      run_hooks(
          'create_formatter', \%hook_args,
          # collect formatters, until a hook instructs to stop
          sub {
              my ($hook, $hook_res) = @_;
              my ($formatter, $flow_control, $fmtname) = @$hook_res;
              $fmtname = 'default' if !defined($fmtname);
              $formatters{$fmtname} ||= $formatter;
              $flow_control;
          },
          $target_type, $target_name);
  
      # collect only a single layouter
      my $layouter =
          run_hooks(
              'create_layouter', \%hook_args, 1, $target_type, $target_name);
  
      my $routine_names = {};
      run_hooks(
          'create_routine_names', \%hook_args,
          # collect routine names, until a hook instructs to stop.
          sub {
              my ($hook, $hook_res) = @_;
              my ($routine_name_rec, $flow_control) = @$hook_res;
              $routine_name_rec or return;
              for (keys %$routine_name_rec) {
                  push @{ $routine_names->{$_} }, @{ $routine_name_rec->{$_} };
              }
              $flow_control;
          },
          $target_type, $target_name);
  
      my @routines;
      my $is_object = $target_type eq 'object';
  
    CREATE_LOGGER_ROUTINES:
      {
          my @routine_name_recs;
          if ($target_type eq 'package') {
              push @routine_name_recs, @{ $routine_names->{log_subs} || [] }; # old name, will be removed
              push @routine_name_recs, @{ $routine_names->{logger_subs} || [] };
          } else {
              push @routine_name_recs, @{ $routine_names->{log_methods} || [] }; # old name, will be removed
              push @routine_name_recs, @{ $routine_names->{logger_methods} || [] };
          }
        NAME:
          for my $routine_name_rec (@routine_name_recs) {
              my ($rname, $lname, $fmtname, $rper_target_conf, $fltname)
                  = @$routine_name_rec;
              my $lnum; $lnum = $Levels{$lname} if defined $lname;
              $fmtname = 'default' if !defined($fmtname);
  
              my ($output_routine, $logger);
              $_outputter_is_null = 0;
              local $hook_args{name} = $rname; # compat, deprecated
              local $hook_args{routine_name} = $rname;
              local $hook_args{level} = $lnum;
              local $hook_args{str_level} = $lname;
              my $outputter;
              {
                  $outputter = run_hooks("create_outputter"  , \%hook_args, 1, $target_type, $target_name) and last;
                  $outputter = run_hooks("create_log_routine", \%hook_args, 1, $target_type, $target_name); # old name, will be removed in the future
              }
              die "BUG in configuration: No outputter is produced for routine name $rname" unless $outputter;
  
              { # enclosing block
                  if ($_outputter_is_null) {
  
                      # if outputter is a null outputter (sub {0}) we don't need
                      # to format message, layout message, or care about the
                      # logger routine being a subroutine/object. shortcut here
                      # for faster init.
  
                      $logger = $outputter;
                      last;
                  }
  
                  my $formatter = $formatters{$fmtname};
                  my $filter    = defined($fltname) ? $filters{$fltname} : undef;
  
                  # zoom out to see vertical alignments... we have filter(x2) x
                  # formatter+layouter(x3) x OO/non-OO (x2) = 12 permutations. we
                  # create specialized subroutines for each case, for performance
                  # reason.
                  if ($filter) { if ($formatter) { if ($layouter) { if ($is_object) { $logger = sub { shift; return 0 unless my $per_msg_conf = $filter->(@_); $outputter->($rper_target_conf || $per_target_conf, $layouter->($formatter->(@_), $per_target_conf, $lnum, $lname, $per_msg_conf), $per_msg_conf) };       # has-filter has-formatter has-layouter with-oo
                                                                    } else {          $logger = sub {        return 0 unless my $per_msg_conf = $filter->(@_); $outputter->($rper_target_conf || $per_target_conf, $layouter->($formatter->(@_), $per_target_conf, $lnum, $lname, $per_msg_conf), $per_msg_conf) }; }     # has-filter has-formatter has-layouter  not-oo
                                                   } else {         if ($is_object) { $logger = sub { shift; return 0 unless my $per_msg_conf = $filter->(@_); $outputter->($rper_target_conf || $per_target_conf,             $formatter->(@_),                                                  $per_msg_conf) };       # has-filter has-formatter  no-layouter with-oo
                                                                    } else {          $logger = sub {        return 0 unless my $per_msg_conf = $filter->(@_); $outputter->($rper_target_conf || $per_target_conf,             $formatter->(@_),                                                  $per_msg_conf) }; } }   # has-filter has-formatter  no-layouter  not-oo
                                 } else {                           if ($is_object) { $logger = sub { shift; return 0 unless my $per_msg_conf = $filter->(@_); $outputter->($rper_target_conf || $per_target_conf,                         \@_,                                                   $per_msg_conf) };       # has-filter  no-formatter  no-layouter with-oo
                                                                    } else {          $logger = sub {        return 0 unless my $per_msg_conf = $filter->(@_); $outputter->($rper_target_conf || $per_target_conf,                         \@_,                                                   $per_msg_conf) }; } }   # has-filter  no-formatter  no-layouter  not-oo
                  } else {       if ($formatter) { if ($layouter) { if ($is_object) { $logger = sub { shift;                                                   $outputter->($rper_target_conf || $per_target_conf, $layouter->($formatter->(@_), $per_target_conf, $lnum, $lname               )               ) };       #  no-filter has-formatter has-layouter with-oo
                                                                    } else {          $logger = sub {                                                          $outputter->($rper_target_conf || $per_target_conf, $layouter->($formatter->(@_), $per_target_conf, $lnum, $lname               )               ) }; }     #  no-filter has-formatter has-layouter  not-oo
                                                 } else {           if ($is_object) { $logger = sub { shift;                                                   $outputter->($rper_target_conf || $per_target_conf,             $formatter->(@_)                                                                ) };       #  no-filter has-formatter  no-layouter with-oo
                                                                    } else {          $logger = sub {                                                          $outputter->($rper_target_conf || $per_target_conf,             $formatter->(@_)                                                                ) }; } }   #  no-filter has-formatter  no-layouter  not-oo
                                 } else {                           if ($is_object) { $logger = sub { shift;                                                   $outputter->($rper_target_conf || $per_target_conf,                         \@_                                                                 ) };       #  no-filter  no-formatter  no-layouter with-oo
                                                                    } else {          $logger = sub {                                                          $outputter->($rper_target_conf || $per_target_conf,                         \@_                                                                 ) }; } } } #  no-filter  no-formatter  no-layouter  not-oo
              } # enclosing block
            L1:
              my $rtype = $is_object ? 'logger_method' : 'logger_sub';
              push @routines, [$logger, $rname, $lnum, $rtype, $rper_target_conf||$per_target_conf];
          }
      }
  
    CREATE_LEVEL_CHECKER_ROUTINES:
      {
          my @routine_name_recs;
          my $type;
          if ($target_type eq 'package') {
              push @routine_name_recs, @{ $routine_names->{is_subs} || [] }; # old name, will be removed
              push @routine_name_recs, @{ $routine_names->{level_checker_subs} || [] };
              $type = 'level_checker_sub';
          } else {
              push @routine_name_recs, @{ $routine_names->{is_methods} || [] }; # old name, will be removed
              push @routine_name_recs, @{ $routine_names->{level_checker_methods} || [] };
              $type = 'level_checker_method';
          }
          for my $routine_name_rec (@routine_name_recs) {
              my ($rname, $lname) = @$routine_name_rec;
              my $lnum = $Levels{$lname};
  
              local $hook_args{name} = $rname;
              local $hook_args{level} = $lnum;
              local $hook_args{str_level} = $lname;
  
              my $code_is;
              {
                  $code_is = run_hooks('create_is_routine'   , \%hook_args, 1, $target_type, $target_name) and last; # old name, will be removed
                  $code_is = run_hooks('create_level_checker', \%hook_args, 1, $target_type, $target_name);
              }
              die "BUG in configuration: No level_checker routine is produced for routine name $rname" unless $code_is;
  
              push @routines, [$code_is, $rname, $lnum, $type, $per_target_conf];
          }
      }
  
      {
          local $hook_args{routines} = \@routines;
          local $hook_args{filters} = \%filters;
          local $hook_args{formatters} = \%formatters;
          local $hook_args{layouter} = $layouter;
          run_hooks('before_install_routines', \%hook_args, 0,
                    $target_type, $target_name);
      }
  
      install_routines($target_type, $target_name, \@routines, 1);
  
      {
          local $hook_args{routines} = \@routines;
          run_hooks('after_install_routines', \%hook_args, 0,
                    $target_type, $target_name);
      }
  }
  
  1;
  # ABSTRACT: The bulk of the implementation of Log::ger
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Log::ger::Heavy - The bulk of the implementation of Log::ger
  
  =head1 VERSION
  
  version 0.037
  
  =head1 DESCRIPTION
  
  This module contains the bulk of the implementation of Log::ger, to keep
  Log::ger superslim.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
LOG_GER_HEAVY

    $main::fatpacked{"Log/ger/Layout.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOG_GER_LAYOUT';
  package Log::ger::Layout;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-03-11'; # DATE
  our $DIST = 'Log-ger'; # DIST
  our $VERSION = '0.037'; # VERSION
  
  use parent qw(Log::ger::Plugin);
  
  # we only use one layout, so set() should replace all hooks from previously set
  # plugin package
  sub _replace_package_regex { qr/\ALog::ger::Layout::/ }
  
  1;
  # ABSTRACT: Use a layout plugin
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Log::ger::Layout - Use a layout plugin
  
  =head1 VERSION
  
  version 0.037
  
  =head1 SYNOPSIS
  
  To set globally:
  
   use Log::ger::Layout;
   Log::ger::Layout->set('Pattern');
  
  or:
  
   use Log::ger::Layout 'Pattern';
  
  To set for current package only:
  
   use Log::ger::Layout;
   Log::ger::Layout->set_for_current_package('Pattern');
  
  =for Pod::Coverage ^(.+)$
  
  =head1 SEE ALSO
  
  L<Log::ger::Output>
  
  L<Log::ger::Plugin>
  
  L<Log::ger::Format>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
LOG_GER_LAYOUT

    $main::fatpacked{"Log/ger/Layout/Pattern.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOG_GER_LAYOUT_PATTERN';
  package Log::ger::Layout::Pattern;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-03-11'; # DATE
  our $DIST = 'Log-ger-Layout-Pattern'; # DIST
  our $VERSION = '0.006'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  use Devel::Caller::Util;
  use Log::ger ();
  use Time::HiRes qw(time);
  
  our $time_start = time();
  our $time_now   = $time_start;
  our $time_last  = $time_start;
  
  my %per_message_data;
  
  our %format_for = (
      'c' => sub { $_[1]{category} },
      'C' => sub { $per_message_data{caller0}[0] },
      'd' => sub {
          my @t = localtime($time_now);
          sprintf(
              "%04d-%02d-%02dT%02d:%02d:%02d",
              $t[5]+1900, $t[4]+1, $t[3],
              $t[2], $t[1], $t[0],
          );
      },
      'D' => sub {
          my @t = gmtime($time_now);
          sprintf(
              "%04d-%02d-%02dT%02d:%02d:%02d",
              $t[5]+1900, $t[4]+1, $t[3],
              $t[2], $t[1], $t[0],
          );
      },
      'F' => sub { $per_message_data{caller0}[1] },
      'H' => sub {
          require Sys::Hostname;
          Sys::Hostname::hostname();
      },
      'l' => sub {
          sprintf(
              "%s (%s:%d)",
              $per_message_data{caller1}[3] // '',
              $per_message_data{caller0}[1],
              $per_message_data{caller0}[2],
          );
      },
      'L' => sub { $per_message_data{caller0}[2] },
      'm' => sub { $_[0] },
      'M' => sub {
          $per_message_data{caller1}[3] // '';
      },
      'n' => sub { "\n" },
      'p' => sub { $_[3] },
      'P' => sub { $$ },
      'r' => sub { sprintf("%.3f", $time_now - $time_start) },
      'R' => sub { sprintf("%.3f", $time_now - $time_last ) },
      'T' => sub {
          join(", ", map { "$_->[3] called at $_->[1] line $_->[2]" }
                   @{ $per_message_data{callers} });
      },
      # test
      #'z' => sub { use DD; my $i = 0; while (my @c = caller($i++)) { dd \@c } },
      '%' => sub { '%' },
  );
  
  sub meta { +{
      v => 2,
  } }
  
  sub _layout {
      my $format = shift;
      my $packages_to_ignore = shift;
      my $subroutines_to_ignore = shift;
  
      ($time_last, $time_now) = ($time_now, time());
      %per_message_data = ();
  
      my %mentioned_formats;
      while ($format =~ m/%(.)/g) {
          if (exists $format_for{$1}) {
              $mentioned_formats{$1} = 1;
          } else {
              die "Unknown format '%$1'";
          }
      }
  
      if ($mentioned_formats{C} ||
              $mentioned_formats{F} ||
              $mentioned_formats{L} ||
              $mentioned_formats{l}
          ) {
          $per_message_data{caller0}  =
              [Devel::Caller::Util::caller (0, 0, $packages_to_ignore, $subroutines_to_ignore)];
      }
      if ($mentioned_formats{l} ||
              $mentioned_formats{M}
          ) {
          $per_message_data{caller1}  =
              [Devel::Caller::Util::caller (1, 0, $packages_to_ignore, $subroutines_to_ignore)];
      }
      if ($mentioned_formats{T}) {
          $per_message_data{callers} =
              [Devel::Caller::Util::callers(0, 0, $packages_to_ignore, $subroutines_to_ignore)];
      }
  
      $format =~ s#%(.)#$format_for{$1}->(@_)#eg;
      $format;
  }
  
  sub get_hooks {
      my %plugin_conf = @_;
  
      $plugin_conf{format} or die "Please specify format";
      $plugin_conf{packages_to_ignore} //= [
          "Log::ger",
          "Log::ger::Layout::Pattern",
          "Try::Tiny",
      ];
  
      return {
          create_layouter => [
              __PACKAGE__, # key
              50,          # priority
              sub {        # hook
                  my %hook_args = @_; # see Log::ger::Manual::Internals/"Arguments passed to hook"
                  my $layouter = sub {
                      _layout($plugin_conf{format}, $plugin_conf{packages_to_ignore}, $plugin_conf{subroutines_to_ignore}, @_);
                  };
                  [$layouter];
              }],
      };
  }
  
  1;
  # ABSTRACT: Pattern layout
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Log::ger::Layout::Pattern - Pattern layout
  
  =head1 VERSION
  
  version 0.006
  
  =head1 SYNOPSIS
  
   use Log::ger::Layout 'Pattern', format => '%d (%F:%L)> %m';
   use Log::ger;
  
  =head1 DESCRIPTION
  
  Known placeholder in format string:
  
   %c Category of the logging event
   %C Fully qualified package (or class) name of the caller
   %d Current date in ISO8601 format (YYYY-MM-DD<T>hh:mm:ss) (localtime)
   %D Current date in ISO8601 format (YYYY-MM-DD<T>hh:mm:ss) (GMT)
   %F File where the logging event occurred
   %H Hostname (if Sys::Hostname is available)
   %l Fully qualified name of the calling method followed by the
      callers source the file name and line number between
      parentheses.
   %L Line number within the file where the log statement was issued
   %m The message to be logged
   %M Method or function where the logging request was issued
   %n Newline (OS-independent)
   %p Level ("priority")of the logging event
   %P pid of the current process
   %r Number of seconds elapsed from program start to logging event
   %R Number of seconds elapsed from last logging event to current
      logging event
   %T A stack trace of functions called
   %% A literal percent (%) sign
  
  =for Pod::Coverage ^(.+)$
  
  =head1 CONFIGURATION
  
  =head2 format
  
  =head2 packages_to_ignore
  
  Regex or arrayref. When producing caller or stack trace information, will pass
  this to L<Devel::Caller::Util>'s C<caller()> or C<callers()>.
  
  =head2 subroutines_to_ignore
  
  Regex or arrayref. When producing caller or stack trace information, will pass
  this to L<Devel::Caller::Util>'s C<caller()> or C<callers()>.
  
  =head1 SEE ALSO
  
  L<Log::ger::Layout::Pattern::Multiline>
  
  Modelled after L<Log::Log4perl::Layout::Pattern> but note that full
  compatibility or feature parity is not a goal. See also L<Log::Log4perl::Tiny>.
  
  L<Log::ger>
  
  L<Log::ger::Layout::LTSV>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2017 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
LOG_GER_LAYOUT_PATTERN

    $main::fatpacked{"Log/ger/Output.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOG_GER_OUTPUT';
  package Log::ger::Output;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-03-11'; # DATE
  our $DIST = 'Log-ger'; # DIST
  our $VERSION = '0.037'; # VERSION
  
  use parent 'Log::ger::Plugin';
  
  # we only use one output, so set() should replace all hooks from previously set
  # plugin package
  sub _replace_package_regex { qr/\ALog::ger::Output::/ }
  
  1;
  # ABSTRACT: Set logging output
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Log::ger::Output - Set logging output
  
  =head1 VERSION
  
  version 0.037
  
  =head1 SYNOPSIS
  
  To set globally:
  
   use Log::ger::Output;
   Log::ger::Output->set(Screen => (
       use_color => 1,
       ...
   );
  
  or:
  
   use Log::ger::Output 'Screen', (
       use_color=>1,
       ...
   );
  
  To set for current package only:
  
   use Log::ger::Output;
   Log::ger::Output->set_for_current_package(Screen => (
       use_color => 1,
       ...
   );
  
  =for Pod::Coverage ^(.+)$
  
  =head1 SEE ALSO
  
  L<Log::ger::Format>
  
  L<Log::ger::Layout>
  
  L<Log::ger::Plugin>
  
  L<Log::ger::Filter>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
LOG_GER_OUTPUT

    $main::fatpacked{"Log/ger/Output/Array.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOG_GER_OUTPUT_ARRAY';
  package Log::ger::Output::Array;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-03-11'; # DATE
  our $DIST = 'Log-ger'; # DIST
  our $VERSION = '0.037'; # VERSION
  
  use strict;
  use warnings;
  
  sub meta { +{
      v => 2,
  } }
  
  sub get_hooks {
      my %plugin_conf = @_;
  
      $plugin_conf{array} or die "Please specify array";
  
      return {
          create_outputter => [
              __PACKAGE__, # key
              50,          # priority
              sub {        # hook
                  my %hook_args = @_; # see Log::ger::Manual::Internals/"Arguments passed to hook"
  
                  my $outputter = sub {
                      my ($per_target_conf, $msg, $per_msg_conf) = @_;
                      push @{$plugin_conf{array}}, $msg;
                  };
                  [$outputter];
              }],
      };
  }
  
  1;
  # ABSTRACT: Log to array
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Log::ger::Output::Array - Log to array
  
  =head1 VERSION
  
  version 0.037
  
  =head1 SYNOPSIS
  
   use Log::ger::Output Array => (
       array         => $ary,
   );
  
  =head1 DESCRIPTION
  
  Mainly for testing only.
  
  =for Pod::Coverage ^(.+)$
  
  =head1 CONFIGURATION
  
  =head2 array => arrayref
  
  Required.
  
  =head1 SEE ALSO
  
  L<Log::ger>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
LOG_GER_OUTPUT_ARRAY

    $main::fatpacked{"Log/ger/Output/Composite.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOG_GER_OUTPUT_COMPOSITE';
  package Log::ger::Output::Composite;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-03-11'; # DATE
  our $DIST = 'Log-ger-Output-Composite'; # DIST
  our $VERSION = '0.016'; # VERSION
  
  use strict;
  use warnings;
  use Log::ger::Util;
  
  # this can be used to override all level settings as it has the highest
  # precedence.
  our $Current_Level;
  
  sub meta { +{
      v => 2,
  } }
  
  sub _get_min_max_level {
      my $level = shift;
      my ($min, $max);
      if (defined $level) {
          if (defined $Current_Level) {
              $min = 0;
              $max = $Current_Level;
          } elsif (ref $level eq 'ARRAY') {
              $min = Log::ger::Util::numeric_level($level->[0]);
              $max = Log::ger::Util::numeric_level($level->[1]);
              ($min, $max) = ($max, $min) if $min > $max;
          } else {
              $min = 0;
              $max = Log::ger::Util::numeric_level($level);
          }
      }
      ($min, $max);
  }
  
  sub get_hooks {
      my %plugin_conf = @_;
  
      # check arguments
      for my $k (keys %plugin_conf) {
          my $conf = $plugin_conf{$k};
          if ($k eq 'outputs') {
              for my $o (keys %$conf) {
                  for my $oconf (ref $conf->{$o} eq 'ARRAY' ?
                                     @{ $conf->{$o} } : $conf->{$o}) {
                      for my $k2 (keys %$oconf) {
                          unless ($k2 =~
                                      /\A(conf|level|category_level|layout)\z/) {
                              die "Unknown configuration for output '$o': '$k2'";
                          }
                      }
                  }
              }
          } elsif ($k =~ /\A(category_level)\z/) {
          } else {
              die "Unknown configuration: '$k'";
          }
      }
  
      my @ospecs;
      {
          my $outputs = $plugin_conf{outputs};
          for my $oname (sort keys %$outputs) {
              my $ospec0 = $outputs->{$oname};
              my @ospecs0;
              if (ref $ospec0 eq 'ARRAY') {
                  @ospecs0 = map { +{ %{$_} } } @$ospec0;
              } else {
                  @ospecs0 = (+{ %{ $ospec0 } });
              }
  
              die "Invalid output name '$oname'"
                  unless $oname =~ /\A\w+(::\w+)*\z/;
              my $mod = "Log::ger::Output::$oname";
              (my $mod_pm = "$mod.pm") =~ s!::!/!g;
              require $mod_pm;
              for my $ospec (@ospecs0) {
                  $ospec->{_name} = $oname;
                  $ospec->{_mod} = $mod;
                  push @ospecs, $ospec;
              }
          }
      }
  
      return {
          create_outputter => [
              __PACKAGE__, # key
              9,           # priority.
              # we use a high priority to override Log::ger's default hook (at
              # priority 10) which create null outputter for levels lower than the
              # general level, since we want to do our own custom level checking.
              sub {        # hook
                  no strict 'refs';
                  require Data::Dmp;
  
                  my %hook_args = @_; # see Log::ger::Manual::Internals/"Arguments passed to hook"
  
                  my $outputters = [];
                  my $layouters = [];
                  for my $ospec (@ospecs) {
                      my $oname = $ospec->{_name};
                      my $mod = "Log::ger::Output::$oname";
                      my $hooks = &{"$mod\::get_hooks"}(%{ $ospec->{conf} || {} })
                          or die "Output module $mod does not return any hooks";
                      my @hook_args = (
                          routine_name    => $hook_args{routine_name},
                          target_type     => $hook_args{target_type},
                          target_name     => $hook_args{target_name},
                          per_target_conf => $hook_args{per_target_conf},
                      );
                      my $res;
                      {
                          push @hook_args, (level => 60, str_level => 'trace');
                          if ($hooks->{create_log_routine}) { # old name, will be removed in the future
                              $res = $hooks->{create_log_routine}->[2]->(
                                  @hook_args);
                              if ($res->[0]) {
                                  push @$outputters, $res->[0];
                                  last;
                              }
                          }
                          if ($hooks->{create_outputter}) {
                              $res = $hooks->{create_outputter}->[2]->(
                                  @hook_args);
                              if ($res->[0]) {
                                  push @$outputters, $res->[0];
                                  last;
                              }
                          }
                          die "Output module $mod does not produce outputter in ".
                              "its create_outputter (or create_log_routine) hook"; # old name create_log_routine will be removed in the future
                      }
                      if ($ospec->{layout}) {
                          my $lname = $ospec->{layout}[0];
                          my $lconf = $ospec->{layout}[1] || {};
                          my $lmod  = "Log::ger::Layout::$lname";
                          (my $lmod_pm = "$lmod.pm") =~ s!::!/!g;
                          require $lmod_pm;
                          my $lhooks = &{"$lmod\::get_hooks"}(%$lconf)
                              or die "Layout module $lmod does not return ".
                              "any hooks";
                          $lhooks->{create_layouter}
                              or die "Layout module $mod does not declare ".
                              "layouter";
                          my @lhook_args = (
                              target_type     => $hook_args{target_type},
                              target_name     => $hook_args{target_name},
                              per_target_conf => $hook_args{per_target_conf},
                          );
                          my $lres = $lhooks->{create_layouter}->[2]->(
                              @lhook_args) or die "Hook from layout module ".
                                  "$lmod does not produce layout routine";
                          ref $lres->[0] eq 'CODE'
                              or die "Layouter from layout module $lmod ".
                              "is not a coderef";
                          push @$layouters, $lres->[0];
                      } else {
                          push @$layouters, undef;
                      }
                  }
                  unless (@$outputters) {
                      $Log::ger::_outputter_is_null = 1;
                      return [sub {0}];
                  }
  
                  # put the data that are mentioned in string-eval'ed code in a
                  # package so they are addressable
                  my $varname = do {
                      my $suffix;
                      if ($hook_args{target_type} eq 'package') {
                          $suffix = $hook_args{target_name};
                      } else {
                          ($suffix) = "$hook_args{target_name}" =~ /\(0x(\w+)/;
                      }
                      "Log::ger::Stash::OComposite_$suffix";
                  };
                  {
                      no strict 'refs';
                      ${$varname} = [];
                      ${$varname}->[0] = $outputters;
                      ${$varname}->[1] = $layouters;
                      ${$varname}->[2] = $hook_args{per_target_conf};
                  }
  
                  # generate our outputter routine
                  my $composite_outputter;
                  {
                      my @src;
                      push @src, "sub {\n";
                      push @src, "  my (\$per_target_conf, \$fmsg, \$per_msg_conf) = \@_;\n";
                      push @src, "  my \$lvl; if (\$per_msg_conf) { \$lvl = \$per_msg_conf->{level} }", (defined $hook_args{level} ? " if (!defined \$lvl) { \$lvl = $hook_args{level} }" : ""), "\n";
                      push @src, "  if (!\$per_msg_conf) { \$per_msg_conf = {level=>\$lvl} }\n"; # since we want to pass level etc to other outputs
  
                      for my $i (0..$#ospecs) {
                          my $ospec = $ospecs[$i];
                          push @src, "  # output #$i: $ospec->{_name}\n";
                          push @src, "  {\n";
  
                          # filter by output's category_level and category-level
                          if ($ospec->{category_level} || $plugin_conf{category_level}) {
                              push @src, "    my \$cat = (\$per_msg_conf ? \$per_msg_conf->{category} : undef) || \$per_target_conf->{category} || '';\n";
                              push @src, "    local \$per_msg_conf->{category} = \$cat;\n";
  
                              my @cats;
                              if ($ospec->{category_level}) {
                                  for my $cat (keys %{$ospec->{category_level}}) {
                                      my $clevel = $ospec->{category_level}{$cat};
                                      push @cats, [$cat, 1, $clevel];
                                  }
                              }
                              if ($plugin_conf{category_level}) {
                                  for my $cat (keys %{$plugin_conf{category_level}}) {
                                      my $clevel = $plugin_conf{category_level}{$cat};
                                      push @cats, [$cat, 2, $clevel];
                                  }
                              }
  
                              for my $cat (sort {
                                  length($b->[0]) <=> length($a->[0]) ||
                                      $a->[0] cmp $b->[0] ||
                                          $a->[1] <=> $b->[1]} @cats) {
                                  push @src, "    if (\$cat eq ".Data::Dmp::dmp($cat->[0])." || index(\$cat, ".Data::Dmp::dmp("$cat->[0]\::").") == 0) { ";
                                  my ($min_level, $max_level) =
                                      _get_min_max_level($cat->[2]);
                                  push @src, "if (\$lvl >= $min_level && ".
                                      "\$lvl <= $max_level) { goto LOG } else { last }";
                                  push @src, " }\n";
                              }
                              push @src, "\n";
                          }
  
                          # filter by output level
                          my ($min_level, $max_level) = _get_min_max_level(
                              $ospec->{level});
                          if (defined $min_level) {
                              push @src, "    if (\$lvl >= $min_level && ".
                                  "\$lvl <= $max_level) { goto LOG } else { last }\n";
                          }
  
                          # filter by general level
                          push @src, "    if (\$Log::ger::Current_Level >= \$lvl) { goto LOG } else { last }\n";
  
                          # run output's log routine
                          push @src, "    LOG:\n";
                          push @src, "    if (\$$varname\->[1][$i]) {\n";
                          push @src, "      \$$varname\->[0][$i]->(\$per_target_conf, \$$varname\->[1][$i]->(\$fmsg, \$$varname\->[2], \$lvl, Log::ger::Util::string_level(\$lvl)), \$per_msg_conf);\n";
                          push @src, "    } else {\n";
                          push @src, "      \$$varname\->[0][$i]->(\$per_target_conf, \$fmsg, \$per_msg_conf);\n";
                          push @src, "    }\n";
                          push @src, "  }\n";
                          push @src, "  # end output #$i\n\n";
                      } # for ospec
  
                      push @src, "};\n";
                      my $src = join("", @src);
                      if ($ENV{LOG_LOG_GER_OUTPUT_COMPOSITE_CODE}) {
                          warn "Log::ger::Output::Composite logger source code (target type=$hook_args{target_type} target name=$hook_args{target_name}, routine name=$hook_args{routine_name}): <<$src>>\n";
                      }
  
                      $composite_outputter = eval $src;
                  }
                  [$composite_outputter];
              }] # hook record
      };
  }
  
  sub set_level {
      $Current_Level = Log::ger::Util::numeric_level(shift);
      Log::ger::Util::reinit_all_targets();
  }
  
  1;
  # ABSTRACT: Composite output
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Log::ger::Output::Composite - Composite output
  
  =head1 VERSION
  
  version 0.016
  
  =head1 SYNOPSIS
  
   use Log::ger::Output Composite => (
       outputs => {
           # single screen output
           Screen => {
               conf   => { use_color=>1 },                        # output config, optional.
               level  => 'info',                                  # set per-output level. optional.
               layout => [Pattern => {format=>'%d (%F:%L)> %m'}], # add per-output layout, optional.
           },
           # multiple file outputs
           File => [
               {
                   conf  => { path=>'/var/log/myapp.log' },
                   level => 'warn',
                   category_level => {                            # set per-category, per-output level. optional.
                       # don't log MyApp::Security messages to this file
                       'MyApp::Security' => 'off',
                       ...
                   },
               },
               {
                   conf => { path => '/var/log/myapp-security.log' },
                   level => 'warn',
                   category_level => {
                       # only MyApp::Security messages go to this file
                       'MyApp::Security' => 'warn',
                       ...
                   },
               },
           ],
       },
       category_level => {                                        # set per-category level. optional.
          'MyApp::SubModule1' => 'info',
          'MyApp::SubModule2' => 'debug',
          ...
       },
   );
   use Log::ger;
  
   log_warn "blah...";
  
  =head1 DESCRIPTION
  
  This is a L<Log::ger> output that can multiplex output to several outputs and do
  filtering on the basis of per-category level, per-output level, or per-output
  per-category level. It can also apply per-output layout.
  
  =for Pod::Coverage ^(.+)$
  
  =head1 CONFIGURATION
  
  =head2 outputs => hash
  
  Specify outputs. It's a hash with output name as keys and output specification
  as values.
  
  Output name is the name of output module without the C<Log::ger::Output::>
  prefix, e.g. L<Screen|Log::ger::Output::Screen> or
  L<File|Log::ger::Output::File>.
  
  Output specification is either a hashref or arrayref of hashrefs to specify
  multiple outputs per type (e.g. if you want to output to two File's). Known
  hashref keys:
  
  =over
  
  =item * conf => hashref
  
  Specify output configuration. Optional. See each output documentation for the
  list of available configuration parameters.
  
  =item * level => str|int|[min, max]
  
  Specify per-output level. Optional. If specified, logging will be done at this
  level instead of the general level. For example, if this is set to C<debug> then
  debug messages and higher will be sent to output even though the general level
  is C<warn>. Vice versa, if this is set to C<error> then even though the general
  level is C<warn>, warning messages won't be sent to this output; only C<error>
  messages and higher will be sent.
  
  You can specify a single level (e.g. 1 or "trace") or a two-element array to
  specify minimum and maximum level (e.g. C<<["trace", "info"]>>). If you
  accidentally mix up minimum and maximum, this module will helpfully fix it for
  you.
  
  =item * category_level => hash
  
  Specify per-output per-category level. Optional. Hash key is category name,
  value is level (which can be a string/numeric level or a two-element array
  containing minimum and maximum level).
  
  =item * layout => [Name => {conf1=>..., conf2=>..., ...}]
  
  Specify per-output layout. Optional. Value is two-element array containing
  layout name (without the C<Log::ger::Layout::> prefix, e.g.
  L<Pattern|Log::ger::Layout::Pattern>) and configuration hash. See each layout
  module documentation for the list of available configuration parameters.
  
  Note that if you also use a layout module outside of Composite configuration,
  e.g.:
  
   use Log::ger::Output Composite => (...);
   use Log::ger::Layout Pattern => (format => '...');
  
  then both layouts will be applied, the general layout will be applied before the
  per-output layout.
  
  =back
  
  =head2 category_level => hash
  
  Specify per-category level. Optional. Hash key is category name, value is level
  (which can be a string/numeric level or a two-element array containing minimum
  and maximum level).
  
  =head1 FAQS
  
  =head2 Why doesn't re-setting log level using Log::ger::Util::set_level() work?
  
  This output plugin sets its own levels and logs using a multilevel routine
  (which gets called for all levels). Re-setting log level dynamically via
  L<Log::ger::Util>'s C<set_level> will not work as intended, which is fortunate
  or unfortunate depending on your need.
  
  If you want to override all levels settings with a single value, you can use
  C<Log::ger::Output::Composite::set_level>, for example:
  
   Log::ger::Util::set_level('trace'); # also set this too
   Log::ger::Output::Composite::set_level('trace');
  
  This sets an internal level setting which is respected and has the highest
  precedence so all levels settings will use this instead. If previously you have:
  
   Log::ger::Output->set(Composite => {
       default_level => 'error',
       outputs => {
           File => {path=>'/foo', level=>'debug'},
           Screen => {level=>'info', category_level=>{MyApp=>'warn'}},
       },
       category_level => {
           'MyApp::SubModule1' => 'debug',
       },
   });
  
  then after the C<Log::ger::Output::Composite::set_level('trace')>, all the above
  per-category and per-output levels will be set to C<trace>.
  
  =head1 ENVIRONMENT
  
  =head2 LOG_LOG_GER_OUTPUT_COMPOSITE_CODE
  
  Bool. If set to true will print the generated logger source code to stderr.
  
  =head1 SEE ALSO
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2017 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
LOG_GER_OUTPUT_COMPOSITE

    $main::fatpacked{"Log/ger/Output/File.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOG_GER_OUTPUT_FILE';
  ## no critic (InputOutput::RequireBriefOpen)
  
  package Log::ger::Output::File;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-03-11'; # DATE
  our $DIST = 'Log-ger-Output-File'; # DIST
  our $VERSION = '0.012'; # VERSION
  
  use strict;
  use warnings;
  
  # supply object methods for filehandles, required for older perls e.g. 5.10
  use FileHandle;
  
  our %lock_handles;
  
  sub meta { +{
      v => 2,
  } }
  
  sub get_hooks {
      my %plugin_conf = @_;
  
      my $lazy      = $plugin_conf{lazy};
      my $autoflush = $plugin_conf{autoflush}; $autoflush = 1 unless defined $autoflush;
      my $lock_mode = $plugin_conf{lock_mode} || 'none';
  
      (defined($plugin_conf{path}) || $plugin_conf{handle}) or
          die "Please specify 'path' or 'handle'";
      $lock_mode =~ /\A(none|write|exclusive)\z/ or
          die "Invalid lock_mode, please choose none|write|exclusive";
      $lock_mode ne 'none' && $plugin_conf{handle} and
          die "Locking using handle not supported for now";
  
      my $code_lock = sub {
          require File::Flock::Retry;
          my $key = defined($plugin_conf{path}) ? ":$plugin_conf{path}" : $plugin_conf{handle};
          if ($lock_handles{$key}) {
              return $lock_handles{$key};
          }
          $lock_handles{$key} = File::Flock::Retry->lock("$plugin_conf{path}.lck");
          #Scalar::Util::weaken($lock_handles{$key});
          # XXX how do we purge old %lock_handles keys?
          return $lock_handles{$key};
      };
  
      my $fh;
      my $code_open = sub {
          return if $fh;
          if (defined(my $path = $plugin_conf{path})) {
              open $fh, ">>", $path or die "Can't open log file '$path': $!";
          } else {
              $fh = $plugin_conf{handle};
          }
          $fh;
      };
  
      if ($lock_mode eq 'exclusive') {
          $code_lock->();
      }
  
      $code_open->() unless $lazy;
  
      return {
          create_outputter => [
              __PACKAGE__, # key
              50,          # priority
              sub {        # hook
                  my %hook_args = @_; # see Log::ger::Manual::Internals/"Arguments passed to hook"
  
                  my $outputter = sub {
                      my ($per_target_conf, $msg, $per_msg_conf) = @_;
                      my $lock_handle;
                      $code_open->() if $lazy && !$fh;
                      $lock_handle = $code_lock->() if $lock_mode eq 'write';
                      print $fh $msg;
                      print $fh "\n" unless $msg =~ /\R\z/;
                      $fh->flush if $autoflush || $lock_handle;
                      undef $lock_handle;
                  };
                  [$outputter];
              }],
      };
  }
  
  1;
  # ABSTRACT: Send logs to file
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Log::ger::Output::File - Send logs to file
  
  =head1 VERSION
  
  version 0.012
  
  =head1 SYNOPSIS
  
   use Log::ger::Output 'File' => (
       path => '/path/to/file.log', # or handle => $fh
       lazy => 1,                   # optional, default 0
   );
   use Log::ger;
  
   log_warn "blah ...";
  
  =head1 DESCRIPTION
  
  This is a plugin to send logs to a file, with some options. File will be opened
  with append mode. A lock can be requested at every write, or when opening the
  file. By default, filehandle will be flushed after each log.
  
  =for Pod::Coverage ^(.+)$
  
  =head1 CONFIGURATION
  
  =head2 path => filename
  
  Specify filename to open. File will be opened in append mode.
  
  =head2 handle => glob|obj
  
  Alternatively, you can provide an already opened filehandle.
  
  =head2 autoflush => bool (default: 1)
  
  Can be turned off if you need more speed, but note that under the absence of
  autoflush, partial log messages might be written.
  
  =head2 lazy => bool (default: 0)
  
  If set to true, will only open the file right before we need to log the message
  (instead of during output initialization). If you have lots of applications that
  use file logging, this can avoid the proliferation of zero-sized log files. On
  the other hand, the application bears an additional risk of failing to open a
  log file in the middle of the run.
  
  =head2 lock_mode => str (none|write|exclusive, default: none)
  
  If you set this to C<none> (the default), no locking is done. When there are
  several applications/processes that output log to the same file, messages from
  applications might get jumbled, e.g. partial message from application 1 is
  followed by message from application 2 and 3, then continued by the rest of
  message from application 1, and so on.
  
  If you set this to C<write>, an attempt to acquire an exclusive lock to C<<
  <PATH>.lck >> will be made. If all logger processes use locking, this makes it
  safe to log to the same file. However, this increases the overhead of writing
  the log which will become non-negligible once you log to files at the rate of
  thousands per second. Also, when a locking attempt fails after 60 seconds, this
  module will die. C<autoflush> is automatically turned on under this locking
  mode.
  
  If you set this to C<exclusive>, locking will be attempted only once during the
  output initialization.
  
  =head1 TODO
  
  When C<lock_mode> is set to C<exclusive>, and user switches output, we have not
  released the lock.
  
  =head1 SEE ALSO
  
  L<Log::ger>
  
  L<Log::ger::Output::SimpleFile> is a simpler output plugin: no locking,
  autoflush, or lazy options.
  
  L<Log::ger::Output::FileWriteRotate> offers autorotation feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2017 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
LOG_GER_OUTPUT_FILE

    $main::fatpacked{"Log/ger/Output/Null.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOG_GER_OUTPUT_NULL';
  package Log::ger::Output::Null;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-03-11'; # DATE
  our $DIST = 'Log-ger'; # DIST
  our $VERSION = '0.037'; # VERSION
  
  sub meta { +{
      v => 2,
  } }
  
  sub get_hooks {
      return {
          create_outputter => [
              __PACKAGE__, # key
              50,          # priority
              sub {        # hook
                  my %hook_args = @_; # see Log::ger::Manual::Internals/"Arguments passed to hook"
  
                  $Log::ger::_outputter_is_null = 1;
                  my $outputter = sub {0};
                  [$outputter];
              }],
      };
  }
  
  1;
  # ABSTRACT: Null output
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Log::ger::Output::Null - Null output
  
  =head1 VERSION
  
  version 0.037
  
  =head1 SYNOPSIS
  
   use Log::ger;
   use Log::ger::Output 'Null';
  
   log_warn "blah...";
  
  =head1 DESCRIPTION
  
  =for Pod::Coverage ^(.+)$
  
  =head1 CONFIGURATION
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
LOG_GER_OUTPUT_NULL

    $main::fatpacked{"Log/ger/Output/Screen.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOG_GER_OUTPUT_SCREEN';
  package Log::ger::Output::Screen;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-03-11'; # DATE
  our $DIST = 'Log-ger-Output-Screen'; # DIST
  our $VERSION = '0.014'; # VERSION
  
  use strict;
  use warnings;
  
  use Log::ger::Util;
  
  our %colors = (
      10 => "\e[31m"  , # fatal, red
      20 => "\e[35m"  , # error, magenta
      30 => "\e[1;34m", # warning, light blue
      40 => "\e[32m"  , # info, green
      50 => "",         # debug, no color
      60 => "\e[33m"  , # trace, orange
  );
  
  our %level_map;
  
  sub meta { +{
      v => 2,
  } }
  
  sub _pick_color {
      my $level = shift;
      if (defined(my $c = $colors{$level})) {
          return $c;
      }
      if (defined(my $clevel = $level_map{$level})) {
          return $colors{$clevel};
      }
  
      # find the nearest
      my ($dist, $clevel);
      for my $k (keys %colors) {
          my $d = abs($k - $level);
          if (!defined($dist) || $dist > $d) {
              $dist = $d;
              $clevel = $k;
          }
      }
      $level_map{$level} = $clevel;
      return $colors{$clevel};
  }
  
  sub hook_before_log {
      my ($ctx, $msg) = @_;
  }
  
  sub hook_after_log {
      my ($ctx, $msg) = @_;
      print { $ctx->{_fh} } "\n" unless $msg =~ /\R\z/;
  }
  
  sub get_hooks {
      my %plugin_conf = @_;
  
      my $stderr = $plugin_conf{stderr};
      $stderr = 1 unless defined $stderr;
      my $handle = $stderr ? \*STDERR : \*STDOUT;
      my $use_color = do {
          if (defined $plugin_conf{use_color}) {
              $plugin_conf{use_color};
          } elsif (exists $ENV{NO_COLOR}) {
              0;
          } elsif (defined $ENV{COLOR}) {
              $ENV{COLOR};
          } else {
              $stderr ? (-t STDERR) : (-t STDOUT);
          }
      };
      my $formatter = $plugin_conf{formatter};
  
      return {
          create_outputter => [
              __PACKAGE__, # key
              50,          # priority
              sub {        # hook
                  my %hook_args = @_; # see Log::ger::Manual::Internals/"Arguments passed to hook"
                  my $outputter = sub {
                      my ($per_target_conf, $msg, $per_msg_conf) = @_;
                      my $level; $level = $per_msg_conf->{level} if $per_msg_conf; $level = $hook_args{level} unless defined $level;
                      if ($formatter) {
                          $msg = $formatter->($msg);
                      }
                      hook_before_log({ _fh=>$handle }, $msg);
                      if ($use_color) {
                          print $handle _pick_color($level), $msg, "\e[0m";
                      } else {
                          print $handle $msg;
                      }
                      hook_after_log({ _fh=>$handle }, $msg);
                  };
                  [$outputter];
              }],
      };
  }
  
  1;
  # ABSTRACT: Output log to screen
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Log::ger::Output::Screen - Output log to screen
  
  =head1 VERSION
  
  version 0.014
  
  =head1 SYNOPSIS
  
   use Log::ger::Output Screen => (
       # stderr => 1,    # set to 0 to print to stdout instead of stderr
       # use_color => 0, # set to 1/0 to force usage of color, default is from NO_COLOR/COLOR or (-t STDOUT)
       # formatter => sub { ... },
   );
   use Log::ger;
  
   log_warn "blah...";
  
  =head1 DESCRIPTION
  
  =for Pod::Coverage ^(.+)$
  
  =head1 CONFIGURATION
  
  =head2 stderr
  
  Bool, default 1. Whether to print to STDERR (the default) or st=head2 use_color
  => bool
  
  =head2 use_color
  
  Bool. The default is to look at the NO_COLOR and COLOR environment variables, or
  1 when in interactive mode and 0 when not in interactive mode.
  
  =head2 formatter
  
  Coderef. When defined, will pass the formatted message (but being applied with
  colors) to this custom formatter.
  
  =head1 ENVIRONMENT
  
  =head2 NO_COLOR
  
  Can be set (to anything) to disable color by default, if C</use_color> is not
  set. Consulted before L</COLOR>.
  
  =head2 COLOR
  
  Can be set to disable/enable color by default, if C</use_color> is not set.
  
  =head1 SEE ALSO
  
  Modelled after L<Log::Any::Adapter::Screen>.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2018, 2017 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
LOG_GER_OUTPUT_SCREEN

    $main::fatpacked{"Log/ger/Output/String.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOG_GER_OUTPUT_STRING';
  package Log::ger::Output::String;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-03-11'; # DATE
  our $DIST = 'Log-ger'; # DIST
  our $VERSION = '0.037'; # VERSION
  
  use strict;
  use warnings;
  
  sub meta { +{
      v => 2,
  } }
  
  sub get_hooks {
      my %plugin_conf = @_;
  
      $plugin_conf{string} or die "Please specify string";
  
      my $formatter = $plugin_conf{formatter};
      my $append_newline = $plugin_conf{append_newline};
      $append_newline = 1 unless defined $append_newline;
  
      return {
          create_outputter => [
              __PACKAGE__, # key
              50,          # priority
              sub {        # hook
                  my %hook_args = @_; # see Log::ger::Manual::Internals/"Arguments passed to hook"
                  my $level = $hook_args{level};
                  my $outputter = sub {
                      my ($per_target_conf, $msg, $per_msg_conf) = @_;
                      if ($formatter) {
                          $msg = $formatter->($msg);
                      }
                      ${ $plugin_conf{string} } .= $msg;
                      ${ $plugin_conf{string} } .= "\n"
                          unless !$append_newline || $msg =~ /\R\z/;
                  };
                  [$outputter];
              }],
      };
  }
  
  1;
  # ABSTRACT: Set output to a string
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Log::ger::Output::String - Set output to a string
  
  =head1 VERSION
  
  version 0.037
  
  =head1 SYNOPSIS
  
   use var '$str';
   use Log::ger::Output 'String' => (
       string => \$str,
       # append_newline => 0, # default is true, to mimic Log::ger::Output::Screen
   );
   use Log::ger;
  
   log_warn "warn ...";
   log_error "debug ...";
  
  C<$str> will contain "warn ...\n".
  
  =head1 DESCRIPTION
  
  For testing only.
  
  =for Pod::Coverage ^(.+)$
  
  =head1 CONFIGURATION
  
  =head2 string => scalarref
  
  Required.
  
  =head2 formatter => coderef
  
  Optional.
  
  =head2 append_newline => bool (default: 1)
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
LOG_GER_OUTPUT_STRING

    $main::fatpacked{"Log/ger/Output/Syslog.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOG_GER_OUTPUT_SYSLOG';
  package Log::ger::Output::Syslog;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-03-11'; # DATE
  our $DIST = 'Log-ger-Output-Syslog'; # DIST
  our $VERSION = '0.005'; # VERSION
  
  use strict 'subs', 'vars';
  use warnings;
  
  use Log::ger::Util;
  
  our %level_map = (
      # Log::ger default level => syslog level
      # => emerg
      # => alert
      fatal => 'crit',
      error => 'err',
      warn  => 'warning',
      # => notice
      info  => 'info',
      debug => 'debug',
      trace => 'debug',
  );
  
  sub meta { +{
      v => 2,
  } }
  
  sub get_hooks {
      my %plugin_conf = @_;
  
      my $ident = delete($plugin_conf{ident});
      defined($ident) or die "Please specify ident";
  
      my $facility = delete($plugin_conf{facility}) || 'user';
      $facility =~ /\A(auth|authpriv|cron|daemon|ftp|kern|local[0-7]|lpr|mail|news|syslog|user|uucp)\z/
          or die "Invalid value for facility, please choose ".
          "auth|authpriv|cron|daemon|ftp|kern|local[0-7]|lpr|mail|news|syslog|user|uucp";
  
      my $logopt = delete($plugin_conf{logopt});
      $logopt = "pid" unless defined $logopt;
  
      keys %plugin_conf and
          die "Unknown configuration: ".join(", ", sort keys %plugin_conf);
  
      require Sys::Syslog;
      Sys::Syslog::openlog($ident, $logopt, $facility) or die;
  
      return {
          create_outputter => [
              __PACKAGE__, # key
              50,          # priority
              sub {        # hook
                  my %hook_args = @_; # see Log::ger::Manual::Internals/"Arguments passed to hook"
  
                  my $outputter = sub {
                      my ($per_target_conf, $fmsg, $per_msg_conf) = @_;
  
                      my $num_level = $per_msg_conf ? $per_msg_conf->{level} : undef; $num_level = $hook_args{level} if !defined $num_level;
                      my $str_level = Log::ger::Util::string_level($num_level);
                      $level_map{$str_level} or die "Don't know how to map ".
                          "Log::ger level '$str_level' to syslog level";
  
                      Sys::Syslog::syslog(
                          &{"Sys::Syslog::LOG_".uc($level_map{$str_level})},
                          $fmsg,
                      );
                  };
                  [$outputter];
              }],
      };
  }
  
  1;
  # ABSTRACT: Send logs to syslog
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Log::ger::Output::Syslog - Send logs to syslog
  
  =head1 VERSION
  
  version 0.005
  
  =head1 SYNOPSIS
  
   use Log::ger::Output 'Syslog' => (
       ident    => 'myprog', # required
       facility => 'daemon', # optional, default 'user'
   );
   use Log::ger;
  
   log_warn "blah ...";
  
  =head1 DESCRIPTION
  
  This output plugin sends logs to syslog using L<Sys::Syslog>.
  It accepts all C<syslog(3)> facilities.
  
  =for Pod::Coverage ^(.+)$
  
  =head1 CONFIGURATION
  
  =head2 ident
  
  =head2 facility
  
  =head2 logopt
  
  =head1 SEE ALSO
  
  L<Log::ger>
  
  L<Sys::Syslog>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2017 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
LOG_GER_OUTPUT_SYSLOG

    $main::fatpacked{"Log/ger/Plugin.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOG_GER_PLUGIN';
  package Log::ger::Plugin;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-03-11'; # DATE
  our $DIST = 'Log-ger'; # DIST
  our $VERSION = '0.037'; # VERSION
  
  use strict;
  use warnings;
  
  use Log::ger::Util;
  
  sub set {
      my $pkg = shift;
  
      my %args;
      if (ref $_[0] eq 'HASH') {
          %args = %{shift()};
      } else {
          %args = (name => shift, conf => {@_});
      }
  
      $args{prefix} ||= $pkg . '::';
      $args{replace_package_regex} = $pkg->_replace_package_regex;
      Log::ger::Util::set_plugin(%args);
  }
  
  sub set_for_current_package {
      my $pkg = shift;
  
      my %args;
      if (ref $_[0] eq 'HASH') {
          %args = %{shift()};
      } else {
          %args = (name => shift, conf => {@_});
      }
  
      my $caller = caller(0);
      $args{target} = 'package';
      $args{target_arg} = $caller;
  
      set($pkg, \%args);
  }
  
  sub _import_sets_for_current_package { 0 }
  
  sub _replace_package_regex { undef }
  
  sub import {
      if (@_ > 1) {
          if ($_[0]->_import_sets_for_current_package) {
              goto &set_for_current_package;
          } else {
              goto &set;
          }
      }
  }
  
  1;
  # ABSTRACT: Use a plugin
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Log::ger::Plugin - Use a plugin
  
  =head1 VERSION
  
  version 0.037
  
  =head1 SYNOPSIS
  
  To set globally:
  
   use Log::ger::Plugin;
   Log::ger::Plugin->set('OptAway');
  
  or:
  
   use Log::ger::Plugin 'OptAway';
  
  To set for current package only:
  
   use Log::ger::Plugin;
   Log::ger::Plugin->set_for_current_package('OptAway');
  
  =for Pod::Coverage ^(.+)$
  
  =head1 SEE ALSO
  
  L<Log::ger::Format>
  
  L<Log::ger::Layout>
  
  L<Log::ger::Output>
  
  L<Log::ger::Filter>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
LOG_GER_PLUGIN

    $main::fatpacked{"Log/ger/Plugin/MultilevelLog.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOG_GER_PLUGIN_MULTILEVELLOG';
  package Log::ger::Plugin::MultilevelLog;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-03-11'; # DATE
  our $DIST = 'Log-ger'; # DIST
  our $VERSION = '0.037'; # VERSION
  
  use strict;
  use warnings;
  
  use Log::ger::Util;
  
  sub meta { +{
      v => 2,
  } }
  
  sub get_hooks {
      my %conf = @_;
  
      my $sub_name    = $conf{sub_name}    || 'log';
      my $method_name = $conf{method_name} || 'log';
  
      return {
          create_filter => [
              __PACKAGE__, # key
              50,          # priority
              sub {        # hook
                  my %hook_args = @_; # see Log::ger::Manual::Internals/"Arguments passed to hook"
  
                  my $filter = sub {
                      my $level = Log::ger::Util::numeric_level(shift);
                      return 0 unless $level <= $Log::ger::Current_Level;
                      {level=>$level};
                  };
  
                  [$filter, 0, 'ml'];
              },
          ],
  
          create_formatter => [
              __PACKAGE__, # key
              50,          # priority
              sub {        # hook
                  my %hook_args = @_; # see Log::ger::Manual::Internals/"Arguments passed to hook"
  
                  my $formatter =
  
                   # just like the default formatter, except it accepts first
                   # argument (level)
                      sub {
                          shift; # level
                          return $_[0] if @_ < 2;
                          my $fmt = shift;
                          my @args;
                          for (@_) {
                              if (!defined($_)) {
                                  push @args, '<undef>';
                              } elsif (ref $_) {
                                  push @args, Log::ger::Util::_dump($_);
                              } else {
                                  push @args, $_;
                              }
                          }
                          # redefine is just a dummy category for perls < 5.22
                          # which don't have 'redundant' yet
                          no warnings ($warnings::Bits{'redundant'} ? 'redundant' : 'redefine');
                          sprintf $fmt, @args;
                      };
  
                  [$formatter, 0, 'ml'];
              },
          ],
  
          create_routine_names => [
              __PACKAGE__, # key
              50,          # priority
              sub {        # hook
                  my %hook_args = @_; # see Log::ger::Manual::Internals/"Arguments passed to hook"
                  return [{
                      logger_subs    => [[$sub_name   , undef, 'ml', undef, 'ml']],
                      logger_methods => [[$method_name, undef, 'ml', undef, 'ml']],
                  }, $conf{exclusive}];
              },
          ],
      };
  }
  
  1;
  # ABSTRACT: Create a log($LEVEL, ...) subroutine/method
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Log::ger::Plugin::MultilevelLog - Create a log($LEVEL, ...) subroutine/method
  
  =head1 VERSION
  
  version 0.037
  
  =head1 SYNOPSIS
  
   use Log::ger::Plugin MultilevelLog => (
       # sub_name => 'log_it',    # optional, defaults to 'log'
       # method_name => 'log_it', # optional, defaults to 'log'
       # exclusive => 1,          # optional, defaults to 0
   );
   use Log::ger;
  
   log('warn', 'This is a warning');
   log('debug', 'This is a debug, data is %s', $data);
  
  =head1 DESCRIPTION
  
  The Log::ger default is to create separate C<log_LEVEL> subroutine (or C<LEVEL>
  methods) for each level, e.g. C<log_trace> subroutine (or C<trace> method),
  C<log_warn> (or C<warn>), and so on. But sometimes you might want a log routine
  that takes $level as the first argument. That is, instead of:
  
   log_warn('blah ...');
  
  or:
  
   $log->debug('Blah: %s', $data);
  
  you prefer:
  
   log('warn', 'blah ...');
  
  or:
  
   $log->log('debug', 'Blah: %s', $data);
  
  This plugin can create such log routine for you.
  
  Note: the multilevel log is slightly slower because of the extra argument and
  additional string level -> numeric level conversion. See benchmarks in
  L<Bencher::Scenarios::LogGer>.
  
  Note: the individual separate C<log_LEVEL> subroutines (or C<LEVEL> methods) are
  still installed, unless you specify configuration L</exclusive> to true.
  
  =for Pod::Coverage ^(.+)$
  
  =head1 CONFIGURATION
  
  =head2 sub_name
  
  String. Defaults to C<log>.
  
  =head2 method_name
  
  String. Defaults to C<log>.
  
  =head2 exclusive
  
  Boolean. If set to true, will block the generation of the default C<log_LEVEL>
  subroutines or C<LEVEL> methods (e.g. C<log_warn>, C<trace>, ...).
  
  =head1 SEE ALSO
  
  L<Log::ger::Plugin::HashArgs>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
LOG_GER_PLUGIN_MULTILEVELLOG

    $main::fatpacked{"Log/ger/Util.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'LOG_GER_UTIL';
  package Log::ger::Util;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-03-11'; # DATE
  our $DIST = 'Log-ger'; # DIST
  our $VERSION = '0.037'; # VERSION
  
  use strict;
  use warnings;
  
  require Log::ger;
  require Log::ger::Heavy;
  
  sub _dump {
      unless ($Log::ger::_dumper) {
          eval {
              no warnings 'once';
              require Data::Dmp;
              $Data::Dmp::OPT_REMOVE_PRAGMAS = 1;
              1;
          };
          if ($@) {
              no warnings 'once';
              require Data::Dumper;
              $Log::ger::_dumper = sub {
                  local $Data::Dumper::Terse = 1;
                  local $Data::Dumper::Indent = 0;
                  local $Data::Dumper::Useqq = 1;
                  local $Data::Dumper::Deparse = 1;
                  local $Data::Dumper::Quotekeys = 0;
                  local $Data::Dumper::Sortkeys = 1;
                  local $Data::Dumper::Trailingcomma = 1;
                  local $Data::Dumper::Useqq = 1; # to show "\034", possible bug in Data::Dumper
                  Data::Dumper::Dumper($_[0]);
              };
          } else {
              $Log::ger::_dumper = sub { Data::Dmp::dmp($_[0]) };
          }
      }
      $Log::ger::_dumper->($_[0]);
  }
  
  sub numeric_level {
      my $level = shift;
      return $level if $level =~ /\A\d+\z/;
      return $Log::ger::Levels{$level}
          if defined $Log::ger::Levels{$level};
      return $Log::ger::Level_Aliases{$level}
          if defined $Log::ger::Level_Aliases{$level};
      die "Unknown level '$level'";
  }
  
  sub string_level {
      my $level = shift;
      return $level if defined $Log::ger::Levels{$level};
      $level = $Log::ger::Level_Aliases{$level}
          if defined $Log::ger::Level_Aliases{$level};
      for (keys %Log::ger::Levels) {
          my $v = $Log::ger::Levels{$_};
          return $_ if $v == $level;
      }
      die "Unknown level '$level'";
  }
  
  sub set_level {
      no warnings 'once';
      $Log::ger::Current_Level = numeric_level(shift);
      reinit_all_targets();
  }
  
  sub _action_on_hooks {
      no warnings 'once';
  
      my ($action, $target_type, $target_name, $phase) = splice @_, 0, 4;
  
      my $hooks = $Log::ger::Global_Hooks{$phase} or die "Unknown phase '$phase'";
      if ($target_type eq 'package') {
          $hooks = ($Log::ger::Per_Package_Hooks{$target_name}{$phase} ||= []);
      } elsif ($target_type eq 'object') {
          my ($addr) = $target_name =~ $Log::ger::re_addr;
          $hooks = ($Log::ger::Per_Object_Hooks{$addr}{$phase} ||= []);
      } elsif ($target_type eq 'hash') {
          my ($addr) = $target_name =~ $Log::ger::re_addr;
          $hooks = ($Log::ger::Per_Hash_Hooks{$addr}{$phase} ||= []);
      }
  
      if ($action eq 'add') {
          my $hook = shift;
          # XXX remove duplicate key
          # my $key = $hook->[0];
          unshift @$hooks, $hook;
      } elsif ($action eq 'remove') {
          my $code = shift;
          for my $i (reverse 0..$#{$hooks}) {
              splice @$hooks, $i, 1 if $code->($hooks->[$i]);
          }
      } elsif ($action eq 'reset') {
          my $saved = [@$hooks];
          splice @$hooks, 0, scalar(@$hooks),
              @{ $Log::ger::Default_Hooks{$phase} };
          return $saved;
      } elsif ($action eq 'empty') {
          my $saved = [@$hooks];
          splice @$hooks, 0;
          return $saved;
      } elsif ($action eq 'save') {
          return [@$hooks];
      } elsif ($action eq 'restore') {
          my $saved = shift;
          splice @$hooks, 0, scalar(@$hooks), @$saved;
          return $saved;
      }
  }
  
  sub add_hook {
      my ($phase, $hook) = @_;
      _action_on_hooks('add', '', undef, $phase, $hook);
  }
  
  sub add_per_target_hook {
      my ($target_type, $target_name, $phase, $hook) = @_;
      _action_on_hooks('add', $target_type, $target_name, $phase, $hook);
  }
  
  sub remove_hook {
      my ($phase, $code) = @_;
      _action_on_hooks('remove', '', undef, $phase, $code);
  }
  
  sub remove_per_target_hook {
      my ($target_type, $target_name, $phase, $code) = @_;
      _action_on_hooks('remove', $target_type, $target_name, $phase, $code);
  }
  
  sub reset_hooks {
      my ($phase) = @_;
      _action_on_hooks('reset', '', undef, $phase);
  }
  
  sub reset_per_target_hooks {
      my ($target_type, $target_name, $phase) = @_;
      _action_on_hooks('reset', $target_type, $target_name, $phase);
  }
  
  sub empty_hooks {
      my ($phase) = @_;
      _action_on_hooks('empty', '', undef, $phase);
  }
  
  sub empty_per_target_hooks {
      my ($target_type, $target_name, $phase) = @_;
      _action_on_hooks('empty', $target_type, $target_name, $phase);
  }
  
  sub save_hooks {
      my ($phase) = @_;
      _action_on_hooks('save', '', undef, $phase);
  }
  
  sub save_per_target_hooks {
      my ($target_type, $target_name, $phase) = @_;
      _action_on_hooks('save', $target_type, $target_name, $phase);
  }
  
  sub restore_hooks {
      my ($phase, $saved) = @_;
      _action_on_hooks('restore', '', undef, $phase, $saved);
  }
  
  sub restore_per_target_hooks {
      my ($target_type, $target_name, $phase, $saved) = @_;
      _action_on_hooks('restore', $target_type, $target_name, $phase, $saved);
  }
  
  sub reinit_target {
      my ($target_type, $target_name) = @_;
  
      # adds target if not already exists
      Log::ger::add_target($target_type, $target_name, {}, 0);
  
      if ($target_type eq 'package') {
          my $per_target_conf = $Log::ger::Package_Targets{$target_name};
          Log::ger::init_target(package => $target_name, $per_target_conf);
      } elsif ($target_type eq 'object') {
          my ($obj_addr) = $target_name =~ $Log::ger::re_addr
              or die "Invalid object '$target_name': not a reference";
          my $v = $Log::ger::Object_Targets{$obj_addr}
              or die "Unknown object target '$target_name'";
          Log::ger::init_target(object => $v->[0], $v->[1]);
      } elsif ($target_type eq 'hash') {
          my ($hash_addr) = $target_name =~ $Log::ger::re_addr
              or die "Invalid hashref '$target_name': not a reference";
          my $v = $Log::ger::Hash_Targets{$hash_addr}
              or die "Unknown hash target '$target_name'";
          Log::ger::init_target(hash => $v->[0], $v->[1]);
      } else {
          die "Unknown target type '$target_type'";
      }
  }
  
  sub reinit_all_targets {
      for my $pkg (keys %Log::ger::Package_Targets) {
          #print "D:reinit package $pkg\n";
          Log::ger::init_target(
              package => $pkg, $Log::ger::Package_Targets{$pkg});
      }
      for my $k (keys %Log::ger::Object_Targets) {
          my ($obj, $per_target_conf) = @{ $Log::ger::Object_Targets{$k} };
          Log::ger::init_target(object => $obj, $per_target_conf);
      }
      for my $k (keys %Log::ger::Hash_Targets) {
          my ($hash, $per_target_conf) = @{ $Log::ger::Hash_Targets{$k} };
          Log::ger::init_target(hash => $hash, $per_target_conf);
      }
  }
  
  sub set_plugin {
      my %args = @_;
  
      my $hooks;
      if ($args{hooks}) {
          $hooks = $args{hooks};
      } else {
          no strict 'refs';
          my $prefix = $args{prefix} || 'Log::ger::Plugin::';
          my $mod = $args{name};
          $mod = $prefix . $mod unless index($mod, $prefix) == 0;
          (my $mod_pm = "$mod.pm") =~ s!::!/!g;
          require $mod_pm;
          my $meta  = $mod->can("meta") ? $mod->meta : {v=>1};
          my $v     = $meta->{v} || 1;
  
          # history of v bumping:
          #
          # - v increased from 1 to 2 in Log::ger v0.037 to force all plugins that
          #   were not compatible with Log::ger 0.032 (removed
          #   create_logml_routine phase) to be upgraded.
  
          unless ($v == 2) {
              die "Plugin '$mod' (version ".(${"$mod\::VERSION"} || "dev").")".
                  " follows meta version $v but Log::ger (version ".
                  (${__PACKAGE__."::VERSION"} || "dev").
                  ") (>0.032) requires meta version 2, ".
                  "please upgrade the plugin first";
          }
          $hooks = &{"$mod\::get_hooks"}(%{ $args{conf} || {} });
      }
  
      {
          last unless $args{replace_package_regex};
          my $all_hooks;
          if (!$args{target}) {
              $all_hooks = \%Log::ger::Global_Hooks;
          } elsif ($args{target} eq 'package') {
              $all_hooks = $Log::ger::Per_Package_Hooks{ $args{target_arg} };
          } elsif ($args{target} eq 'object') {
              my ($addr) = $args{target_arg} =~ $Log::ger::re_addr;
              $all_hooks = $Log::ger::Per_Object_Hooks{$addr};
          } elsif ($args{target} eq 'hash') {
              my ($addr) = $args{target_arg} =~ $Log::ger::re_addr;
              $all_hooks = $Log::ger::Per_Hash_Hooks{$addr};
          }
          last unless $all_hooks;
          for my $phase (keys %$all_hooks) {
              my $hooks = $all_hooks->{$phase};
              for my $i (reverse 0..$#{$hooks}) {
                  splice @$hooks, $i, 1
                      if $hooks->[$i][0] =~ $args{replace_package_regex};
              }
          }
      }
  
      for my $phase (keys %$hooks) {
          my $hook = $hooks->{$phase};
          if (defined $args{target}) {
              add_per_target_hook(
                  $args{target}, $args{target_arg}, $phase, $hook);
          } else {
              add_hook($phase, $hook);
          }
      }
  
      my $reinit = $args{reinit};
      $reinit = 1 unless defined $reinit;
      if ($reinit) {
          if (defined $args{target}) {
              reinit_target($args{target}, $args{target_arg});
          } else {
              reinit_all_targets();
          }
      }
  }
  
  1;
  # ABSTRACT: Utility routines for Log::ger
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Log::ger::Util - Utility routines for Log::ger
  
  =head1 VERSION
  
  version 0.037
  
  =head1 DESCRIPTION
  
  This package is created to keep Log::ger as minimalist as possible.
  
  =for Pod::Coverage ^(.+)$
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
LOG_GER_UTIL

    $main::fatpacked{"MRO/Compat.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'MRO_COMPAT';
  package MRO::Compat;
  use strict;
  use warnings;
  require 5.006_000;
  
  # Keep this < 1.00, so people can tell the fake
  #  mro.pm from the real one
  our $VERSION = '0.13';
  
  BEGIN {
      # Alias our private functions over to
      # the mro:: namespace and load
      # Class::C3 if Perl < 5.9.5
      if($] < 5.009_005) {
          $mro::VERSION # to fool Module::Install when generating META.yml
              = $VERSION;
          $INC{'mro.pm'} = __FILE__;
          *mro::import            = \&__import;
          *mro::get_linear_isa    = \&__get_linear_isa;
          *mro::set_mro           = \&__set_mro;
          *mro::get_mro           = \&__get_mro;
          *mro::get_isarev        = \&__get_isarev;
          *mro::is_universal      = \&__is_universal;
          *mro::method_changed_in = \&__method_changed_in;
          *mro::invalidate_all_method_caches
                                  = \&__invalidate_all_method_caches;
          require Class::C3;
          if($Class::C3::XS::VERSION && $Class::C3::XS::VERSION > 0.03) {
              *mro::get_pkg_gen   = \&__get_pkg_gen_c3xs;
          }
          else {
              *mro::get_pkg_gen   = \&__get_pkg_gen_pp;
          }
      }
  
      # Load mro.pm and provide no-op Class::C3::.*initialize() funcs for 5.9.5+
      else {
          require mro;
          no warnings 'redefine';
          *Class::C3::initialize = sub { 1 };
          *Class::C3::reinitialize = sub { 1 };
          *Class::C3::uninitialize = sub { 1 };
      }
  }
  
  =head1 NAME
  
  MRO::Compat - mro::* interface compatibility for Perls < 5.9.5
  
  =head1 SYNOPSIS
  
     package PPP;      use base qw/Exporter/;
     package X;        use base qw/PPP/;
     package Y;        use base qw/PPP/;
     package Z;        use base qw/PPP/;
  
     package FooClass; use base qw/X Y Z/;
  
     package main;
     use MRO::Compat;
     my $linear = mro::get_linear_isa('FooClass');
     print join(q{, }, @$linear);
  
     # Prints: FooClass, X, PPP, Exporter, Y, Z
  
  =head1 DESCRIPTION
  
  The "mro" namespace provides several utilities for dealing
  with method resolution order and method caching in general
  in Perl 5.9.5 and higher.
  
  This module provides those interfaces for
  earlier versions of Perl (back to 5.6.0 anyways).
  
  It is a harmless no-op to use this module on 5.9.5+.  That
  is to say, code which properly uses L<MRO::Compat> will work
  unmodified on both older Perls and 5.9.5+.
  
  If you're writing a piece of software that would like to use
  the parts of 5.9.5+'s mro:: interfaces that are supported
  here, and you want compatibility with older Perls, this
  is the module for you.
  
  Some parts of this code will work better and/or faster with
  L<Class::C3::XS> installed (which is an optional prereq
  of L<Class::C3>, which is in turn a prereq of this
  package), but it's not a requirement.
  
  This module never exports any functions.  All calls must
  be fully qualified with the C<mro::> prefix.
  
  The interface documentation here serves only as a quick
  reference of what the function basically does, and what
  differences between L<MRO::Compat> and 5.9.5+ one should
  look out for.  The main docs in 5.9.5's L<mro> are the real
  interface docs, and contain a lot of other useful information.
  
  =head1 Functions
  
  =head2 mro::get_linear_isa($classname[, $type])
  
  Returns an arrayref which is the linearized "ISA" of the given class.
  Uses whichever MRO is currently in effect for that class by default,
  or the given MRO (either C<c3> or C<dfs> if specified as C<$type>).
  
  The linearized ISA of a class is a single ordered list of all of the
  classes that would be visited in the process of resolving a method
  on the given class, starting with itself.  It does not include any
  duplicate entries.
  
  Note that C<UNIVERSAL> (and any members of C<UNIVERSAL>'s MRO) are not
  part of the MRO of a class, even though all classes implicitly inherit
  methods from C<UNIVERSAL> and its parents.
  
  =cut
  
  sub __get_linear_isa_dfs {
      no strict 'refs';
  
      my $classname = shift;
  
      my @lin = ($classname);
      my %stored;
      foreach my $parent (@{"$classname\::ISA"}) {
          my $plin = __get_linear_isa_dfs($parent);
          foreach (@$plin) {
              next if exists $stored{$_};
              push(@lin, $_);
              $stored{$_} = 1;
          }
      }
      return \@lin;
  }
  
  sub __get_linear_isa {
      my ($classname, $type) = @_;
      die "mro::get_mro requires a classname" if !defined $classname;
  
      $type ||= __get_mro($classname);
      if($type eq 'dfs') {
          return __get_linear_isa_dfs($classname);
      }
      elsif($type eq 'c3') {
          return [Class::C3::calculateMRO($classname)];
      }
      die "type argument must be 'dfs' or 'c3'";
  }
  
  =head2 mro::import
  
  This allows the C<use mro 'dfs'> and
  C<use mro 'c3'> syntaxes, providing you
  L<use MRO::Compat> first.  Please see the
  L</USING C3> section for additional details.
  
  =cut
  
  sub __import {
      if($_[1]) {
          goto &Class::C3::import if $_[1] eq 'c3';
          __set_mro(scalar(caller), $_[1]);
      }
  }
  
  =head2 mro::set_mro($classname, $type)
  
  Sets the mro of C<$classname> to one of the types
  C<dfs> or C<c3>.  Please see the L</USING C3>
  section for additional details.
  
  =cut
  
  sub __set_mro {
      my ($classname, $type) = @_;
  
      if(!defined $classname || !$type) {
          die q{Usage: mro::set_mro($classname, $type)};
      }
  
      if($type eq 'c3') {
          eval "package $classname; use Class::C3";
          die $@ if $@;
      }
      elsif($type eq 'dfs') {
          # In the dfs case, check whether we need to undo C3
          if(defined $Class::C3::MRO{$classname}) {
              Class::C3::_remove_method_dispatch_table($classname);
          }
          delete $Class::C3::MRO{$classname};
      }
      else {
          die qq{Invalid mro type "$type"};
      }
  
      return;
  }
  
  =head2 mro::get_mro($classname)
  
  Returns the MRO of the given class (either C<c3> or C<dfs>).
  
  It considers any Class::C3-using class to have C3 MRO
  even before L<Class::C3::initialize()> is called.
  
  =cut
  
  sub __get_mro {
      my $classname = shift;
      die "mro::get_mro requires a classname" if !defined $classname;
      return 'c3' if exists $Class::C3::MRO{$classname};
      return 'dfs';
  }
  
  =head2 mro::get_isarev($classname)
  
  Returns an arrayref of classes who are subclasses of the
  given classname.  In other words, classes in whose @ISA
  hierarchy we appear, no matter how indirectly.
  
  This is much slower on pre-5.9.5 Perls with MRO::Compat
  than it is on 5.9.5+, as it has to search the entire
  package namespace.
  
  =cut
  
  sub __get_all_pkgs_with_isas {
      no strict 'refs';
      no warnings 'recursion';
  
      my @retval;
  
      my $search = shift;
      my $pfx;
      my $isa;
      if(defined $search) {
          $isa = \@{"$search\::ISA"};
          $pfx = "$search\::";
      }
      else {
          $search = 'main';
          $isa = \@main::ISA;
          $pfx = '';
      }
  
      push(@retval, $search) if scalar(@$isa);
  
      foreach my $cand (keys %{"$search\::"}) {
          if($cand =~ s/::$//) {
              next if $cand eq $search; # skip self-reference (main?)
              push(@retval, @{__get_all_pkgs_with_isas($pfx . $cand)});
          }
      }
  
      return \@retval;
  }
  
  sub __get_isarev_recurse {
      no strict 'refs';
  
      my ($class, $all_isas, $level) = @_;
  
      die "Recursive inheritance detected" if $level > 100;
  
      my %retval;
  
      foreach my $cand (@$all_isas) {
          my $found_me;
          foreach (@{"$cand\::ISA"}) {
              if($_ eq $class) {
                  $found_me = 1;
                  last;
              }
          }
          if($found_me) {
              $retval{$cand} = 1;
              map { $retval{$_} = 1 }
                  @{__get_isarev_recurse($cand, $all_isas, $level+1)};
          }
      }
      return [keys %retval];
  }
  
  sub __get_isarev {
      my $classname = shift;
      die "mro::get_isarev requires a classname" if !defined $classname;
  
      __get_isarev_recurse($classname, __get_all_pkgs_with_isas(), 0);
  }
  
  =head2 mro::is_universal($classname)
  
  Returns a boolean status indicating whether or not
  the given classname is either C<UNIVERSAL> itself,
  or one of C<UNIVERSAL>'s parents by C<@ISA> inheritance.
  
  Any class for which this function returns true is
  "universal" in the sense that all classes potentially
  inherit methods from it.
  
  =cut
  
  sub __is_universal {
      my $classname = shift;
      die "mro::is_universal requires a classname" if !defined $classname;
  
      my $lin = __get_linear_isa('UNIVERSAL');
      foreach (@$lin) {
          return 1 if $classname eq $_;
      }
  
      return 0;
  }
  
  =head2 mro::invalidate_all_method_caches
  
  Increments C<PL_sub_generation>, which invalidates method
  caching in all packages.
  
  Please note that this is rarely necessary, unless you are
  dealing with a situation which is known to confuse Perl's
  method caching.
  
  =cut
  
  sub __invalidate_all_method_caches {
      # Super secret mystery code :)
      @f845a9c1ac41be33::ISA = @f845a9c1ac41be33::ISA;
      return;
  }
  
  =head2 mro::method_changed_in($classname)
  
  Invalidates the method cache of any classes dependent on the
  given class.  In L<MRO::Compat> on pre-5.9.5 Perls, this is
  an alias for C<mro::invalidate_all_method_caches> above, as
  pre-5.9.5 Perls have no other way to do this.  It will still
  enforce the requirement that you pass it a classname, for
  compatibility.
  
  Please note that this is rarely necessary, unless you are
  dealing with a situation which is known to confuse Perl's
  method caching.
  
  =cut
  
  sub __method_changed_in {
      my $classname = shift;
      die "mro::method_changed_in requires a classname" if !defined $classname;
  
      __invalidate_all_method_caches();
  }
  
  =head2 mro::get_pkg_gen($classname)
  
  Returns an integer which is incremented every time a local
  method of or the C<@ISA> of the given package changes on
  Perl 5.9.5+.  On earlier Perls with this L<MRO::Compat> module,
  it will probably increment a lot more often than necessary.
  
  =cut
  
  {
      my $__pkg_gen = 2;
      sub __get_pkg_gen_pp {
          my $classname = shift;
          die "mro::get_pkg_gen requires a classname" if !defined $classname;
          return $__pkg_gen++;
      }
  }
  
  sub __get_pkg_gen_c3xs {
      my $classname = shift;
      die "mro::get_pkg_gen requires a classname" if !defined $classname;
  
      return Class::C3::XS::_plsubgen();
  }
  
  =head1 USING C3
  
  While this module makes the 5.9.5+ syntaxes
  C<use mro 'c3'> and C<mro::set_mro("Foo", 'c3')> available
  on older Perls, it does so merely by passing off the work
  to L<Class::C3>.
  
  It does not remove the need for you to call
  C<Class::C3::initialize()>, C<Class::C3::reinitialize()>, and/or
  C<Class::C3::uninitialize()> at the appropriate times
  as documented in the L<Class::C3> docs.  These three functions
  are always provided by L<MRO::Compat>, either via L<Class::C3>
  itself on older Perls, or directly as no-ops on 5.9.5+.
  
  =head1 SEE ALSO
  
  L<Class::C3>
  
  L<mro>
  
  =head1 AUTHOR
  
  Brandon L. Black, E<lt>blblack@gmail.comE<gt>
  
  =head1 COPYRIGHT AND LICENSE
  
  Copyright 2007-2008 Brandon L. Black E<lt>blblack@gmail.comE<gt>
  
  This library is free software; you can redistribute it and/or modify
  it under the same terms as Perl itself. 
  
  =cut
  
  1;
MRO_COMPAT

    $main::fatpacked{"Mo.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'MO';
  package Mo;
  $Mo::VERSION = '0.40';
  $VERSION='0.40';
  no warnings;my$M=__PACKAGE__.'::';*{$M.Object::new}=sub{my$c=shift;my$s=bless{@_},$c;my%n=%{$c.'::'.':E'};map{$s->{$_}=$n{$_}->()if!exists$s->{$_}}keys%n;$s};*{$M.import}=sub{import warnings;$^H|=1538;my($P,%e,%o)=caller.'::';shift;eval"no Mo::$_",&{$M.$_.::e}($P,\%e,\%o,\@_)for@_;return if$e{M};%e=(extends,sub{eval"no $_[0]()";@{$P.ISA}=$_[0]},has,sub{my$n=shift;my$m=sub{$#_?$_[0]{$n}=$_[1]:$_[0]{$n}};@_=(default,@_)if!($#_%2);$m=$o{$_}->($m,$n,@_)for sort keys%o;*{$P.$n}=$m},%e,);*{$P.$_}=$e{$_}for keys%e;@{$P.ISA}=$M.Object};
MO

    $main::fatpacked{"Mo/Golf.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'MO_GOLF';
  ##
  # name:      Mo::Golf
  # abstract:  Module for Compacting Mo Modules
  # author:    Ingy döt Net <ingy@ingy.net>
  # license:   perl
  # copyright: 2011
  # see:
  # - Mo
  
  use strict;
  use warnings;
  package Mo::Golf;
  
  our $VERSION='0.40';
  
  use PPI;
  
  # This is the mapping of common names to shorter forms that still make some
  # sense.
  my %short_names = (
      (
          map {($_, substr($_, 0, 1))}
          qw(
              args builder class default exports features
              generator import is_lazy method MoPKG name
              nonlazy_defaults options reftype self
          )
      ),
      build_subs => 'B',
      old_constructor => 'C',
      caller_pkg => 'P',
  );
  
  my %short_barewords = ( EAGERINIT => q{':E'}, NONLAZY => q{':N'} );
  
  my %hands_off = map {($_,1)} qw'&import *import';
  
  sub import {
      return unless @_ == 2 and $_[1] eq 'golf';
      binmode STDOUT;
      my $text = do { local $/; <> };
      print STDOUT golf( $text );
  };
  
  sub golf {
      my ( $text ) = @_;
  
      my $tree = PPI::Document->new( \$text );
  
      my %finder_subs = _finder_subs();
  
      my @order = qw( comments duplicate_whitespace whitespace trailing_whitespace );
  
      for my $name ( @order ) {
          my $elements = $tree->find( $finder_subs{$name} );
          die $@ if !defined $elements;
          $_->delete for @{ $elements || [] };
      }
  
      $tree->find( $finder_subs{$_} )
        for qw( del_superfluous_concat del_last_semicolon_in_block separate_version shorten_var_names shorten_barewords );
      die $@ if $@;
  
      for my $name ( 'double_semicolon' ) {
          my $elements = $tree->find( $finder_subs{$name} );
          die $@ if !defined $elements;
          $_->delete for @{ $elements || [] };
      }
  
      return $tree->serialize . "\n";
  }
  
  sub tok { "PPI::Token::$_[0]" }
  
  sub _finder_subs {
      return (
          comments => sub { $_[1]->isa( tok 'Comment' ) },
  
          duplicate_whitespace => sub {
              my ( $top, $current ) = @_;
              return 0 if !$current->isa( tok 'Whitespace' );
  
              $current->set_content(' ') if 1 < length $current->content;
  
              return 0 if !$current->next_token;
              return 0 if !$current->next_token->isa( tok 'Whitespace' );
              return 1;
          },
  
          whitespace => sub {
              my ( $top, $current ) = @_;
              return 0 if !$current->isa( tok 'Whitespace' );
              my $prev = $current->previous_token;
              my $next = $current->next_token;
  
              return 1 if $prev->isa( tok 'Number' ) and $next->isa( tok 'Operator' ) and $next->content =~ /^\W/; # my $P
              return 1 if $prev->isa( tok 'Word' )   and $next->isa( tok 'Operator' ) and $next->content =~ /^\W/; # my $P
              return 1 if $prev->isa( tok 'Symbol' ) and $next->isa( tok 'Operator' ) and $next->content =~ /^\W/; # $VERSION =  but not $v and
  
              return 1 if $prev->isa( tok 'Operator' ) and $next->isa( tok 'Quote::Single' ) and $next->content =~ /^\W/; # eq ''
              return 1 if $prev->isa( tok 'Operator' ) and $next->isa( tok 'Quote::Double' ) and $next->content =~ /^\W/; # eq ""
              return 1 if $prev->isa( tok 'Operator' ) and $next->isa( tok 'Symbol' )        and $next->content =~ /^\W/; # eq $v
              return 1 if $prev->isa( tok 'Operator' ) and $next->isa( tok 'Structure' )     and $next->content =~ /^\W/; # eq (
  
              return 1 if $prev->isa( tok 'Word' )       and $next->isa( tok 'Symbol' );           # my $P
              return 1 if $prev->isa( tok 'Word' )       and $next->isa( tok 'Structure' );        # sub {
              return 1 if $prev->isa( tok 'Word' )       and $next->isa( tok 'Quote::Double' );    # eval "
              return 1 if $prev->isa( tok 'Symbol' )     and $next->isa( tok 'Structure' );        # %a )
              return 1 if $prev->isa( tok 'ArrayIndex' ) and $next->isa( tok 'Operator' );         # $#_ ?
              return 1 if $prev->isa( tok 'Word' )       and $next->isa( tok 'Cast' );             # exists &$_
              return 0;
          },
  
          trailing_whitespace => sub {
              my ( $top, $current ) = @_;
              return 0 if !$current->isa( tok 'Whitespace' );
              my $prev = $current->previous_token;
  
              return 1 if $prev->isa( tok 'Structure' );                                           # ;[\n\s]
              return 1 if $prev->isa( tok 'Operator' ) and $prev->content =~ /\W$/;                # = 0.24
              return 1 if $prev->isa( tok 'Quote::Double' );                                       # " .
              return 1 if $prev->isa( tok 'Quote::Single' );                                       # ' }
  
              return 0;
          },
  
          double_semicolon => sub {
              my ( $top, $current ) = @_;
              return 0 if !$current->isa( tok 'Structure' );
              return 0 if $current->content ne ';';
  
              my $prev = $current->previous_token;
  
              return 0 if !$prev->isa( tok 'Structure' );
              return 0 if $prev->content ne ';';
  
              return 1;
          },
  
          del_last_semicolon_in_block => sub {
              my ( $top, $current ) = @_;
              return 0 if !$current->isa( 'PPI::Structure::Block' );
  
              my $last = $current->last_token;
  
              return 0 if !$last->isa( tok 'Structure' );
              return 0 if $last->content ne '}';
  
              my $maybe_semi = $last->previous_token;
  
              return 0 if !$maybe_semi->isa( tok 'Structure' );
              return 0 if $maybe_semi->content ne ';';
  
              $maybe_semi->delete;
  
              return 1;
          },
  
          del_superfluous_concat => sub {
              my ( $top, $current ) = @_;
              return 0 if !$current->isa( tok 'Operator' );
  
              my $prev = $current->previous_token;
              my $next = $current->next_token;
  
              return 0 if $current->content ne '.';
              return 0 if !$prev->isa( tok 'Quote::Double' );
              return 0 if !$next->isa( tok 'Quote::Double' );
  
              $current->delete;
              $prev->set_content( $prev->{separator} . $prev->string . $next->string . $prev->{separator} );
              $next->delete;
  
              return 1;
          },
  
          separate_version => sub {
              my ( $top, $current ) = @_;
              return 0 if !$current->isa( 'PPI::Statement' );
  
              my $first = $current->first_token;
              return 0 if $first->content ne '$VERSION';
  
              $current->$_( PPI::Token::Whitespace->new( "\n" ) ) for qw( insert_before insert_after );
  
              return 1;
          },
  
          shorten_var_names => sub {
              my ( $top, $current ) = @_;
              return 0 if !$current->isa( tok 'Symbol' );
  
              my $long_name = $current->canonical;
  
              return 1 if $hands_off{$long_name};
              (my $name = $long_name) =~ s/^([\$\@\%])// or die $long_name;
              my $sigil = $1;
              die "variable $long_name conflicts with shortened var name"
                  if grep {
                      $name eq $_
                  } values %short_names;
  
              my $short_name = $short_names{$name};
              $current->set_content( "$sigil$short_name" ) if $short_name;
  
              return 1;
          },
  
          shorten_barewords => sub {
              my ( $top, $current ) = @_;
              return 0 if !$current->isa( tok 'Word' );
  
              my $name = $current->content;
  
              die "bareword $name conflicts with shortened bareword"
                  if grep {
                      $name eq $_
                  } values %short_barewords;
  
              my $short_name = $short_barewords{$name};
              $current->set_content( $short_name ) if $short_name;
  
              return 1;
          },
      );
  }
  
  =head1 SYNOPSIS
  
      perl -MMo::Golf=golf < src/Mo/foo.pm > lib/Mo/foo.pm
  
  =head1 DESCRIPTION
  
  This is the module that is responsible for taking Mo code (which is
  documented and fairly readable) and reducing it to a single undecipherable
  line.
MO_GOLF

    $main::fatpacked{"Mo/Inline.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'MO_INLINE';
  ##
  # name:      Mo::Inline
  # abstract:  Inline Mo and Features into your package
  # author:    Ingy döt Net <ingy@ingy.net>
  # license:   perl
  # copyright: 2011
  # see:
  # - Mo
  
  package Mo::Inline;
  use Mo;
  
  our $VERSION='0.40';
  
  use IO::All;
  
  my $matcher = qr/((?m:^#\s*use Mo(\s.*)?;.*\n))(?:#.*\n)*(?:.{400,}\n)?/;
  
  sub run {
      my $self = shift;
      my @files;
      if (not @_ and -d 'lib') {
          print "Searching the 'lib' directory for a Mo to inline:\n";
          @_ = 'lib';
      }
      if (not @_ or @_ == 1 and $_[0] =~ /^(?:-\?|-h|--help)$/) {
          print usage();
          return 0;
      }
      for my $name (@_) {
          die "No file or directory called '$name'"
              unless -e $name;
          die "'$name' is not a Perl module"
              if -f $name and $name !~ /\.pm$/;
          if (-f $name) {
              push @files, $name;
          }
          elsif (-d $name) {
              push @_, grep /\.pm$/, map { "$_" } io($name)->All_Files;
          }
      }
  
      die "No .pm files specified"
          unless @files;
  
      for my $file (@files) {
          my $text = io($file)->all;
          if ($text !~ $matcher) {
              print "Ignoring $file - No Mo to Inline!\n";
              next;
          }
          $self->inline($file, 1);
      }
  }
  
  sub inline {
      my ($self, $file, $noisy) = @_;
      my $text = io($file)->all;
      $text =~ s/$matcher/"$1" . &inliner($2)/eg;
      io($file)->print($text);
      print "Mo Inlined $file\n"
          if $noisy;
  }
  
  sub inliner {
      my $mo = shift;
      require Mo;
      my @features = grep {$_ ne 'qw'} ($mo =~ /(\w+)/g);
      for (@features) {
          eval "require Mo::$_; 1" or die $@;
      }
      my $inline = '';
      $inline .= $_ for map {
          my $module = $_;
          $module .= '.pm';
          my @lines = io($INC{$module})->chomp->getlines;
          $lines[-1];
      } ('Mo', map { s!::!/!g; "Mo/$_" } @features);
      return <<"...";
  #   The following line of code was produced from the previous line by
  #   Mo::Inline version $VERSION
  $inline\@f=qw[@features];use strict;use warnings;
  ...
  }
  
  sub usage {
      <<'...';
  Usage: mo-linline <perl module files or directories>
  
  ...
  }
  
  1;
  
  =head1 SYNOPSIS
  
  In your Mo module:
  
      # This is effectively your own private Mo(ose) setup
      package MyModule::Mo;
      # use Mo qw'build builder default import';
      1;
  
  From the command line:
  
      > mo-inline lib/MyModule/Mo.pm
  
  or:
  
      > mo-inline lib/
  
  or (if you are really lazy):
  
      > mo-inline
  
  Then from another module:
  
      package MyModule::Foo;
      use MyModule::Mo;       # gets build, builder and default automatically
  
  =head1 DESCRIPTION
  
  Mo is so small that you can easily inline it, along with any feature modules.
  Mo provides a script called C<mo-inline> that will do it for you.
  
  All you need to do is comment out the line that uses Mo, and run C<mo-inline>
  on the file. C<mo-inline> will find such comments and do the inlining for you.
  It will also replace any old inlined Mo with the latest version.
  
  What Mo could you possibly want?
  
  =head1 AUTOMATIC FEATURES
  
  By using the L<Mo::import> feature, all uses of your Mo class will turn on all
  the features you specified. You can override it if you want, but that will be
  the default.
  
  =head1 REAL WORLD EXAMPLES
  
  For real world examples of Mo inlined using C<mo-inline>, see L<YAML::Mo>,
  L<Pegex::Mo> and L<TestML::Mo>.
MO_INLINE

    $main::fatpacked{"Mo/Moose.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'MO_MOOSE';
  package Mo::Moose;
  $Mo::Moose::VERSION = '0.40';$M="Mo::";
  $VERSION='0.40';
  *{$M.'Moose::e'}=sub{my($P,$e)=@_;$P=~s/::$//;%$e=(M=>1);require Moose;Moose->import({into=>$P});Moose::Util::MetaRole::apply_metaroles(for=>$P,class_metaroles=>{attribute=>['Attr::Trait']},)};BEGIN{package Attr::Trait;
  $Attr::Trait::VERSION = '0.40';use Moose::Role;around _process_options=>sub{my$orig=shift;my$c=shift;my($n,$o)=@_;$o->{is}||='rw';$o->{lazy}||=1 if defined$o->{default}or defined$o->{builder};$c->$orig(@_)};$INC{'Attr/Trait.pm'}=1}
MO_MOOSE

    $main::fatpacked{"Mo/Mouse.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'MO_MOUSE';
  package Mo::Mouse;
  $Mo::Mouse::VERSION = '0.40';$M="Mo::";
  $VERSION='0.40';
  *{$M.'Mouse::e'}=sub{my($P,$e)=@_;$P=~s/::$//;%$e=(M=>1);require Mouse;require Mouse::Util::MetaRole;Mouse->import({into=>$P});Mouse::Util::MetaRole::apply_metaroles(for=>$P,class_metaroles=>{attribute=>['Attr::Trait']},)};BEGIN{package Attr::Trait;
  $Attr::Trait::VERSION = '0.40';use Mouse::Role;around _process_options=>sub{my$orig=shift;my$c=shift;my($n,$o)=@_;$o->{is}||='rw';$o->{lazy}||=1 if defined$o->{default}or defined$o->{builder};$c->$orig(@_)};$INC{'Attr/Trait.pm'}=1}
MO_MOUSE

    $main::fatpacked{"Mo/build.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'MO_BUILD';
  package Mo::build;
  $Mo::build::VERSION = '0.40';my$M="Mo::";
  $VERSION='0.40';
  *{$M.'build::e'}=sub{my($P,$e)=@_;$e->{new}=sub{$c=shift;my$s=&{$M.Object::new}($c,@_);my@B;do{@B=($c.::BUILD,@B)}while($c)=@{$c.::ISA};exists&$_&&&$_($s)for@B;$s}};
MO_BUILD

    $main::fatpacked{"Mo/builder.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'MO_BUILDER';
  package Mo::builder;
  $Mo::builder::VERSION = '0.40';my$M="Mo::";
  $VERSION='0.40';
  *{$M.'builder::e'}=sub{my($P,$e,$o)=@_;$o->{builder}=sub{my($m,$n,%a)=@_;my$b=$a{builder}or return$m;my$i=exists$a{lazy}?$a{lazy}:!${$P.':N'};$i or ${$P.':E'}{$n}=\&{$P.$b}and return$m;sub{$#_?$m->(@_):!exists$_[0]{$n}?$_[0]{$n}=$_[0]->$b:$m->(@_)}}};
MO_BUILDER

    $main::fatpacked{"Mo/chain.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'MO_CHAIN';
  package Mo::chain;
  $Mo::chain::VERSION = '0.40';my$M="Mo::";
  $VERSION='0.40';
  *{$M.'chain::e'}=sub{my($P,$e,$o)=@_;$o->{chain}=sub{my($m,$n,%a)=@_;$a{chain}or return$m;sub{$#_?($m->(@_),return$_[0]):$m->(@_)}}};
MO_CHAIN

    $main::fatpacked{"Mo/coerce.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'MO_COERCE';
  package Mo::coerce;
  $Mo::coerce::VERSION = '0.40';my$M="Mo::";
  $VERSION='0.40';
  *{$M.'coerce::e'}=sub{my($P,$e,$o)=@_;$o->{coerce}=sub{my($m,$n,%a)=@_;$a{coerce}or return$m;sub{$#_?$m->($_[0],$a{coerce}->($_[1])):$m->(@_)}};my$C=$e->{new}||*{$M.Object::new}{CODE};$e->{new}=sub{my$s=$C->(@_);$s->$_($s->{$_})for keys%$s;$s}};
MO_COERCE

    $main::fatpacked{"Mo/default.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'MO_DEFAULT';
  package Mo::default;
  $Mo::default::VERSION = '0.40';my$M="Mo::";
  $VERSION='0.40';
  *{$M.'default::e'}=sub{my($P,$e,$o)=@_;$o->{default}=sub{my($m,$n,%a)=@_;exists$a{default}or return$m;my($d,$r)=$a{default};my$g='HASH'eq($r=ref$d)?sub{+{%$d}}:'ARRAY'eq$r?sub{[@$d]}:'CODE'eq$r?$d:sub{$d};my$i=exists$a{lazy}?$a{lazy}:!${$P.':N'};$i or ${$P.':E'}{$n}=$g and return$m;sub{$#_?$m->(@_):!exists$_[0]{$n}?$_[0]{$n}=$g->(@_):$m->(@_)}}};
MO_DEFAULT

    $main::fatpacked{"Mo/exporter.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'MO_EXPORTER';
  package Mo::exporter;
  $Mo::exporter::VERSION = '0.40';my$M="Mo::";
  $VERSION='0.40';
  *{$M.'exporter::e'}=sub{my($P)=@_;if(@{$M.EXPORT}){*{$P.$_}=\&{$M.$_}for@{$M.EXPORT}}};
MO_EXPORTER

    $main::fatpacked{"Mo/import.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'MO_IMPORT';
  package Mo::import;
  $Mo::import::VERSION = '0.40';my$M="Mo::";
  $VERSION='0.40';
  my$i=\&import;*{$M.import}=sub{(@_==2 and not$_[1])?pop@_:@_==1?push@_,grep!/import/,@f:();goto&$i};
MO_IMPORT

    $main::fatpacked{"Mo/importer.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'MO_IMPORTER';
  package Mo::importer;
  $Mo::importer::VERSION = '0.40';my$M="Mo::";
  $VERSION='0.40';
  *{$M.'importer::e'}=sub{my($P,$e,$o,$f)=@_;(my$pkg=$P)=~s/::$//;&{$P.'importer'}($pkg,@$f)if defined&{$P.'importer'}};
MO_IMPORTER

    $main::fatpacked{"Mo/is.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'MO_IS';
  package Mo::is;
  $Mo::is::VERSION = '0.40';$M="Mo::";
  $VERSION='0.40';
  *{$M.'is::e'}=sub{my($P,$e,$o)=@_;$o->{is}=sub{my($m,$n,%a)=@_;$a{is}or return$m;sub{$#_&&$a{is}eq'ro'&&caller ne'Mo::coerce'?die$n.' is ro':$m->(@_)}}};
MO_IS

    $main::fatpacked{"Mo/nonlazy.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'MO_NONLAZY';
  package Mo::nonlazy;
  $Mo::nonlazy::VERSION = '0.40';my$M="Mo::";
  $VERSION='0.40';
  *{$M.'nonlazy::e'}=sub{${shift().':N'}=1};
MO_NONLAZY

    $main::fatpacked{"Mo/option.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'MO_OPTION';
  package Mo::option;
  $Mo::option::VERSION = '0.40';my$M="Mo::";
  $VERSION='0.40';
  *{$M.'option::e'}=sub{my($P,$e,$o)=@_;$o->{option}=sub{my($m,$n,%a)=@_;$a{option}or return$m;my$n2=$n;*{$P."read_$n2"}=sub{$_[0]->{$n2}};sub{$#_?$m->(@_):$m->(@_,1);$_[0]}}};
MO_OPTION

    $main::fatpacked{"Mo/required.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'MO_REQUIRED';
  package Mo::required;
  $Mo::required::VERSION = '0.40';my$M="Mo::";
  $VERSION='0.40';
  *{$M.'required::e'}=sub{my($P,$e,$o)=@_;$o->{required}=sub{my($m,$n,%a)=@_;if($a{required}){my$C=*{$P."new"}{CODE}||*{$M.Object::new}{CODE};no warnings 'redefine';*{$P."new"}=sub{my$s=$C->(@_);my%a=@_[1..$#_];die$n." required"if!exists$a{$n};$s}}$m}};
MO_REQUIRED

    $main::fatpacked{"Mo/xs.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'MO_XS';
  package Mo::xs;
  $Mo::xs::VERSION = '0.40';my$M="Mo::";
  $VERSION='0.40';
  require Class::XSAccessor;*{$M.'xs::e'}=sub{my($P,$e,$o,$f)=@_;$P=~s/::$//;$e->{has}=sub{my($n,%a)=@_;Class::XSAccessor->import(class=>$P,accessors=>{$n=>$n})}if!grep!/^xs$/,@$f};
MO_XS

    $main::fatpacked{"Module/Implementation.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'MODULE_IMPLEMENTATION';
  package Module::Implementation;
  # git description: v0.08-2-gd599347
  $Module::Implementation::VERSION = '0.09';
  
  use strict;
  use warnings;
  
  use Module::Runtime 0.012 qw( require_module );
  use Try::Tiny;
  
  # This is needed for the benefit of Test::CleanNamespaces, which in turn loads
  # Package::Stash, which in turn loads this module and expects a minimum
  # version.
  unless ( exists $Module::Implementation::{VERSION}
      && ${ $Module::Implementation::{VERSION} } ) {
  
      $Module::Implementation::{VERSION} = \42;
  }
  
  my %Implementation;
  
  sub build_loader_sub {
      my $caller = caller();
  
      return _build_loader( $caller, @_ );
  }
  
  sub _build_loader {
      my $package = shift;
      my %args    = @_;
  
      my @implementations = @{ $args{implementations} };
      my @symbols = @{ $args{symbols} || [] };
  
      my $implementation;
      my $env_var = uc $package;
      $env_var =~ s/::/_/g;
      $env_var .= '_IMPLEMENTATION';
  
      return sub {
          my ( $implementation, $loaded ) = _load_implementation(
              $package,
              $ENV{$env_var},
              \@implementations,
          );
  
          $Implementation{$package} = $implementation;
  
          _copy_symbols( $loaded, $package, \@symbols );
  
          return $loaded;
      };
  }
  
  sub implementation_for {
      my $package = shift;
  
      return $Implementation{$package};
  }
  
  sub _load_implementation {
      my $package         = shift;
      my $env_value       = shift;
      my $implementations = shift;
  
      if ($env_value) {
          die "$env_value is not a valid implementation for $package"
              unless grep { $_ eq $env_value } @{$implementations};
  
          my $requested = "${package}::$env_value";
  
          # Values from the %ENV hash are tainted. We know it's safe to untaint
          # this value because the value was one of our known implementations.
          ($requested) = $requested =~ /^(.+)$/;
  
          try {
              require_module($requested);
          }
          catch {
              require Carp;
              Carp::croak("Could not load $requested: $_");
          };
  
          return ( $env_value, $requested );
      }
      else {
          my $err;
          for my $possible ( @{$implementations} ) {
              my $try = "${package}::$possible";
  
              my $ok;
              try {
                  require_module($try);
                  $ok = 1;
              }
              catch {
                  $err .= $_ if defined $_;
              };
  
              return ( $possible, $try ) if $ok;
          }
  
          require Carp;
          if ( defined $err && length $err ) {
              Carp::croak(
                  "Could not find a suitable $package implementation: $err");
          }
          else {
              Carp::croak(
                  'Module::Runtime failed to load a module but did not throw a real error. This should never happen. Something is very broken'
              );
          }
      }
  }
  
  sub _copy_symbols {
      my $from_package = shift;
      my $to_package   = shift;
      my $symbols      = shift;
  
      for my $sym ( @{$symbols} ) {
          my $type = $sym =~ s/^([\$\@\%\&\*])// ? $1 : '&';
  
          my $from = "${from_package}::$sym";
          my $to   = "${to_package}::$sym";
  
          {
              no strict 'refs';
              no warnings 'once';
  
              # Copied from Exporter
              *{$to}
                  = $type eq '&' ? \&{$from}
                  : $type eq '$' ? \${$from}
                  : $type eq '@' ? \@{$from}
                  : $type eq '%' ? \%{$from}
                  : $type eq '*' ? *{$from}
                  : die
                  "Can't copy symbol from $from_package to $to_package: $type$sym";
          }
      }
  }
  
  1;
  
  # ABSTRACT: Loads one of several alternate underlying implementations for a module
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Module::Implementation - Loads one of several alternate underlying implementations for a module
  
  =head1 VERSION
  
  version 0.09
  
  =head1 SYNOPSIS
  
    package Foo::Bar;
  
    use Module::Implementation;
  
    BEGIN {
        my $loader = Module::Implementation::build_loader_sub(
            implementations => [ 'XS',  'PurePerl' ],
            symbols         => [ 'run', 'check' ],
        );
  
        $loader->();
    }
  
    package Consumer;
  
    # loads the first viable implementation
    use Foo::Bar;
  
  =head1 DESCRIPTION
  
  This module abstracts out the process of choosing one of several underlying
  implementations for a module. This can be used to provide XS and pure Perl
  implementations of a module, or it could be used to load an implementation for
  a given OS or any other case of needing to provide multiple implementations.
  
  This module is only useful when you know all the implementations ahead of
  time. If you want to load arbitrary implementations then you probably want
  something like a plugin system, not this module.
  
  =head1 API
  
  This module provides two subroutines, neither of which are exported.
  
  =head2 Module::Implementation::build_loader_sub(...)
  
  This subroutine takes the following arguments.
  
  =over 4
  
  =item * implementations
  
  This should be an array reference of implementation names. Each name should
  correspond to a module in the caller's namespace.
  
  In other words, using the example in the L</SYNOPSIS>, this module will look
  for the C<Foo::Bar::XS> and C<Foo::Bar::PurePerl> modules.
  
  This argument is required.
  
  =item * symbols
  
  A list of symbols to copy from the implementation package to the calling
  package.
  
  These can be prefixed with a variable type: C<$>, C<@>, C<%>, C<&>, or
  C<*)>. If no prefix is given, the symbol is assumed to be a subroutine.
  
  This argument is optional.
  
  =back
  
  This subroutine I<returns> the implementation loader as a sub reference.
  
  It is up to you to call this loader sub in your code.
  
  I recommend that you I<do not> call this loader in an C<import()> sub. If a
  caller explicitly requests no imports, your C<import()> sub will not be run at
  all, which can cause weird breakage.
  
  =head2 Module::Implementation::implementation_for($package)
  
  Given a package name, this subroutine returns the implementation that was
  loaded for the package. This is not a full package name, just the suffix that
  identifies the implementation. For the L</SYNOPSIS> example, this subroutine
  would be called as C<Module::Implementation::implementation_for('Foo::Bar')>,
  and it would return "XS" or "PurePerl".
  
  =head1 HOW THE IMPLEMENTATION LOADER WORKS
  
  The implementation loader works like this ...
  
  First, it checks for an C<%ENV> var specifying the implementation to load. The
  env var is based on the package name which loads the implementations. The
  C<::> package separator is replaced with C<_>, and made entirely
  upper-case. Finally, we append "_IMPLEMENTATION" to this name.
  
  So in our L</SYNOPSIS> example, the corresponding C<%ENV> key would be
  C<FOO_BAR_IMPLEMENTATION>.
  
  If this is set, then the loader will B<only> try to load this one
  implementation.
  
  If the env var requests an implementation which doesn't match one of the
  implementations specified when the loader was created, an error is thrown.
  
  If this one implementation fails to load then loader throws an error. This is
  useful for testing. You can request a specific implementation in a test file
  by writing something like this:
  
    BEGIN { $ENV{FOO_BAR_IMPLEMENTATION} = 'XS' }
    use Foo::Bar;
  
  If the environment variable is I<not> set, then the loader simply tries the
  implementations originally passed to C<Module::Implementation>. The
  implementations are tried in the order in which they were originally passed.
  
  The loader will use the first implementation that loads without an error. It
  will copy any requested symbols from this implementation.
  
  If none of the implementations can be loaded, then the loader throws an
  exception.
  
  The loader returns the name of the package it loaded.
  
  =head1 AUTHOR
  
  Dave Rolsky <autarch@urth.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is Copyright (c) 2014 by Dave Rolsky.
  
  This is free software, licensed under:
  
    The Artistic License 2.0 (GPL Compatible)
  
  =cut
MODULE_IMPLEMENTATION

    $main::fatpacked{"Module/Installed/Tiny.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'MODULE_INSTALLED_TINY';
  package Module::Installed::Tiny;
  
  our $DATE = '2020-01-04'; # DATE
  our $VERSION = '0.004'; # VERSION
  
  use strict;
  use warnings;
  
  use Exporter qw(import);
  our @EXPORT_OK = qw(module_installed module_source);
  
  our $SEPARATOR;
  BEGIN {
      if ($^O =~ /^(dos|os2)/i) {
          $SEPARATOR = '\\';
      } elsif ($^O =~ /^MacOS/i) {
          $SEPARATOR = ':';
      } else {
          $SEPARATOR = '/';
      }
  }
  
  sub _module_source {
      my $name_pm = shift;
  
      for my $entry (@INC) {
          next unless defined $entry;
          my $ref = ref($entry);
          my ($is_hook, @hook_res);
          if ($ref eq 'ARRAY') {
              $is_hook++;
              @hook_res = $entry->[0]->($entry, $name_pm);
          } elsif (UNIVERSAL::can($entry, 'INC')) {
              $is_hook++;
              @hook_res = $entry->INC($name_pm);
          } elsif ($ref eq 'CODE') {
              $is_hook++;
              @hook_res = $entry->($entry, $name_pm);
          } else {
              my $path = "$entry$SEPARATOR$name_pm";
              if (-f $path) {
                  open my($fh), "<", $path
                      or die "Can't locate $name_pm: $path: $!";
                  local $/;
                  return wantarray ? (scalar <$fh>, $path) : scalar <$fh>;
              }
          }
  
          if ($is_hook) {
              next unless @hook_res;
              my $prepend_ref; $prepend_ref = shift @hook_res if ref($hook_res[0]) eq 'SCALAR';
              my $fh         ; $fh          = shift @hook_res if ref($hook_res[0]) eq 'GLOB';
              my $code       ; $code        = shift @hook_res if ref($hook_res[0]) eq 'CODE';
              my $code_state ; $code_state  = shift @hook_res if @hook_res;
              if ($fh) {
                  my $src = "";
                  local $_;
                  while (!eof($fh)) {
                      $_ = <$fh>;
                      if ($code) {
                          $code->($code, $code_state);
                      }
                      $src .= $_;
                  }
                  $src = $$prepend_ref . $src if $prepend_ref;
                  return wantarray ? ($src, $entry) : $src;
              } elsif ($code) {
                  my $src = "";
                  local $_;
                  while ($code->($code, $code_state)) {
                      $src .= $_;
                  }
                  $src = $$prepend_ref . $src if $prepend_ref;
                  return wantarray ? ($src, $entry) : $src;
              }
          }
      }
  
      die "Can't locate $name_pm in \@INC (\@INC contains: ".join(" ", @INC).")";
  }
  
  sub module_source {
      my $name = shift;
  
      # convert Foo::Bar -> Foo/Bar.pm
      my $name_pm;
      if ($name =~ /\A\w+(?:::\w+)*\z/) {
          ($name_pm = "$name.pm") =~ s!::!$SEPARATOR!g;
      } else {
          $name_pm = $name;
      }
  
      _module_source $name_pm;
  }
  
  sub module_installed {
      my $name = shift;
  
      # convert Foo::Bar -> Foo/Bar.pm
      my $name_pm;
      if ($name =~ /\A\w+(?:::\w+)*\z/) {
          ($name_pm = "$name.pm") =~ s!::!$SEPARATOR!g;
      } else {
          $name_pm = $name;
      }
  
      return 1 if exists $INC{$name_pm};
  
      if (eval { _module_source $name_pm; 1 }) {
          1;
      } else {
          0;
      }
  }
  
  1;
  # ABSTRACT: Check if a module is installed, with as little code as possible
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Module::Installed::Tiny - Check if a module is installed, with as little code as possible
  
  =head1 VERSION
  
  This document describes version 0.004 of Module::Installed::Tiny (from Perl distribution Module-Installed-Tiny), released on 2020-01-04.
  
  =head1 SYNOPSIS
  
   use Module::Installed::Tiny qw(module_installed module_source);
  
   # check if a module is available
   if (module_installed "Foo::Bar") {
       # Foo::Bar is available
   } elsif (module_installed "Foo/Baz.pm") {
       # Foo::Baz is available
   }
  
   # get a module's source code, dies on failure
   my $src = module_source("Foo/Baz.pm");
  
  =head1 DESCRIPTION
  
  To check if a module is installed (available), generally the simplest way is to
  try to C<require()> it:
  
   if (eval { require Foo::Bar; 1 }) {
       # Foo::Bar is available
   }
  
  However, this actually loads the module. There are some cases where this is not
  desirable: 1) we have to check a lot of modules (actually loading the modules
  will take a lot of CPU time and memory; 2) some of the modules conflict with one
  another and cannot all be loaded; 3) the module is OS specific and might not
  load under another OS; 4) we simply do not want to execute the module, for
  security or other reasons.
  
  C<Module::Installed::Tiny> provides a routine C<module_installed()> which works
  like Perl's C<require> but does not actually load the module.
  
  This module does not require any other module except L<Exporter>.
  
  =head1 FUNCTIONS
  
  =head2 module_installed($name) => bool
  
  Check that module named C<$name> is available to load. This means that: either
  the module file exists on the filesystem and searchable in C<@INC> and the
  contents of the file can be retrieved, or when there is a require hook in
  C<@INC>, the module's source can be retrieved from the hook.
  
  Note that this does not guarantee that the module can eventually be loaded
  successfully, as there might be syntax or runtime errors in the module's source.
  To check for that, one would need to actually load the module using C<require>.
  
  =head2 module_source($name) => str | (str, source_name)
  
  Return module's source code, without actually loading it. Die on failure (e.g.
  module named C<$name> not found in C<@INC>).
  
  In list context:
  
   my @res = module_source($name);
  
  will return the list:
  
  (str, source_name)
  
  where C<str> is the module source code and C<source_name> is source information
  (file path, or the @INC ref entry when entry is a ref).
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Module-Installed-Tiny>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Module-Installed-Tiny>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Module-Installed-Tiny>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Module::Load::Conditional> provides C<check_install> which also does what
  C<module_installed> does, plus can check module version. It also has a couple
  other knobs to customize its behavior. It's less tiny than
  Module::Installed::Tiny though.
  
  L<Module::Path> and L<Module::Path::More>. These modules can also be used to
  check if a module on the filesystem is available. They do not handle require
  hooks, nor do they actually check that the module file is readable.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
MODULE_INSTALLED_TINY

    $main::fatpacked{"Module/List.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'MODULE_LIST';
  =head1 NAME
  
  Module::List - module `directory' listing
  
  =head1 SYNOPSIS
  
      use Module::List qw(list_modules);
  
      $id_modules = list_modules("Data::ID::", { list_modules => 1});
      $prefixes = list_modules("",
  		    { list_prefixes => 1, recurse => 1 });
  
  =head1 DESCRIPTION
  
  This module deals with the examination of the namespace of Perl modules.
  The contents of the module namespace is split across several physical
  directory trees, but this module hides that detail, providing instead
  a view of the abstract namespace.
  
  =cut
  
  package Module::List;
  
  { use 5.006; }
  use warnings;
  use strict;
  
  use Carp qw(croak);
  use File::Spec;
  use IO::Dir 1.03;
  
  our $VERSION = "0.004";
  
  use parent "Exporter";
  our @EXPORT_OK = qw(list_modules);
  
  =head1 FUNCTIONS
  
  =over
  
  =item list_modules(PREFIX, OPTIONS)
  
  This function generates a listing of the contents of part of the module
  namespace.  The part of the namespace under the module name prefix PREFIX
  is examined, and information about it returned as specified by OPTIONS.
  
  Module names are handled by this function in standard bareword syntax.
  They are always fully-qualified; isolated name components are never used.
  A module name prefix is the part of a module name that comes before
  a component of the name, and so either ends with "::" or is the empty
  string.
  
  OPTIONS is a reference to a hash, the elements of which specify what is
  to be returned.  The options are:
  
  =over
  
  =item list_modules
  
  Truth value, default false.  If true, return names of modules in the relevant
  part of the namespace.
  
  =item list_prefixes
  
  Truth value, default false.  If true, return module name prefixes in the
  relevant part of the namespace.  Note that prefixes are returned if the
  corresponding directory exists, even if there is nothing in it.
  
  =item list_pod
  
  Truth value, default false.  If true, return names of POD documentation
  files that are in the module namespace.
  
  =item trivial_syntax
  
  Truth value, default false.  If false, only valid bareword names are
  permitted.  If true, bareword syntax is ignored, and any "::"-separated
  name that can be turned into a correct filename by interpreting name
  components as filename components is permitted.  This is of no use in
  listing actual Perl modules, because the illegal names can't be used in
  Perl, but some programs such as B<perldoc> use a "::"-separated name for
  the sake of appearance without really using bareword syntax.  The loosened
  syntax applies both to the names returned and to the I<PREFIX> parameter.
  
  Precisely, the `trivial syntax' is that each "::"-separated component
  cannot be "." or "..", cannot contain "::" or "/", and (except for the
  final component of a leaf name) cannot end with ":".  This is precisely
  what is required to achieve a unique interconvertible "::"-separated path
  syntax on Unix.  This criterion might change in the future on non-Unix
  systems, where the filename syntax differs.
  
  =item recurse
  
  Truth value, default false.  If false, only names at the next level down
  from PREFIX (having one more component) are returned.  If true, names
  at all lower levels are returned.
  
  =item use_pod_dir
  
  Truth value, default false.  If false, POD documentation files are
  expected to be in the same directory that the corresponding module file
  would be in.  If true, POD files may also be in a subdirectory of that
  named "C<pod>".  (Any POD files in such a subdirectory will therefore be
  visible under two module names, one treating the "C<pod>" subdirectory
  level as part of the module name.)
  
  =item return_path
  
  Truth value, default false.  If false, only the existence of requested
  items is reported.  If true, the pathnames of the files in which they
  exist are reported.
  
  =back
  
  Note that the default behaviour, if an empty options hash is supplied, is
  to return nothing.  You I<must> specify what kind of information you want.
  
  The function returns a reference to a hash, the keys of which are the
  names of interest.  By default, the value associated with each of these
  keys is undef.  If additional information about each item was requested,
  the value for each item is a reference to a hash, containing some subset
  of these items:
  
  =over
  
  =item module_path
  
  Pathname of the module of this name.  Specifically, this identifies
  the file that would be read in order to load the module.  This may be
  a C<.pmc> file if one is available.  Absent if there is no module.
  
  =item pod_path
  
  Pathname of the POD document of this name.  Absent if there is no
  discrete POD document.  (POD in a module file doesn't constitute a
  discrete POD document.)
  
  =item prefix_paths
  
  Reference to an array of the pathnames of the directories referenced
  by this prefix.  The directories are listed in the order corresponding
  to @INC.  Absent if this is not a prefix.
  
  =back
  
  =cut
  
  sub list_modules($$) {
      my($prefix, $options) = @_;
      my $trivial_syntax = $options->{trivial_syntax};
      my($root_leaf_rx, $root_notleaf_rx);
      my($notroot_leaf_rx, $notroot_notleaf_rx);
      if($trivial_syntax) {
  	$root_leaf_rx = $notroot_leaf_rx = qr#:?(?:[^/:]+:)*[^/:]+:?#;
  	$root_notleaf_rx = $notroot_notleaf_rx = qr#:?(?:[^/:]+:)*[^/:]+#;
      } else {
  	$root_leaf_rx = $root_notleaf_rx = qr/[a-zA-Z_][0-9a-zA-Z_]*/;
  	$notroot_leaf_rx = $notroot_notleaf_rx = qr/[0-9a-zA-Z_]+/;
      }
      croak "bad module name prefix `$prefix'"
  	unless $prefix =~ /\A(?:${root_notleaf_rx}::
  				 (?:${notroot_notleaf_rx}::)*)?\z/x &&
  		 $prefix !~ /(?:\A|[^:]::)\.\.?::/;
      my $list_modules = $options->{list_modules};
      my $list_prefixes = $options->{list_prefixes};
      my $list_pod = $options->{list_pod};
      my $use_pod_dir = $options->{use_pod_dir};
      return {} unless $list_modules || $list_prefixes || $list_pod;
      my $recurse = $options->{recurse};
      my $return_path = $options->{return_path};
      my @prefixes = ($prefix);
      my %seen_prefixes;
      my %results;
      while(@prefixes) {
  	my $prefix = pop(@prefixes);
  	my @dir_suffix = split(/::/, $prefix);
  	my $module_rx = $prefix eq "" ? $root_leaf_rx : $notroot_leaf_rx;
  	my $pmc_rx = qr/\A($module_rx)\.pmc\z/;
  	my $pm_rx = qr/\A($module_rx)\.pm\z/;
  	my $pod_rx = qr/\A($module_rx)\.pod\z/;
  	my $dir_rx = $prefix eq "" ? $root_notleaf_rx : $notroot_notleaf_rx;
  	$dir_rx = qr/\A$dir_rx\z/;
  	foreach my $incdir (@INC) {
  	    my $dir = File::Spec->catdir($incdir, @dir_suffix);
  	    my $dh = IO::Dir->new($dir) or next;
  	    my @entries = $dh->read;
  	    $dh->close;
  	    if($list_modules) {
  		foreach my $pmish_rx ($pmc_rx, $pm_rx) {
  		    foreach my $entry (@entries) {
  			if($entry =~ $pmish_rx) {
  			    my $name = $prefix.$1;
  			    if($return_path) {
  				my $path = File::Spec->catfile($dir, $entry);
  				$results{$name} ||= {};
  				$results{$name}->{module_path} = $path
  				    unless
  					exists($results{$name}->{module_path});
  			    } else {
  				$results{$name} = undef;
  			    }
  			}
  		    }
  		}
  	    }
  	    if($list_pod) {
  		my @poddirs = [ $dir, \@entries ];
  		if($use_pod_dir) {
  		    my $pdir = File::Spec->catdir($dir, "pod");
  		    my $pdh = IO::Dir->new($pdir);
  		    if($pdh) {
  			push @poddirs, [ $pdir, [$pdh->read] ];
  			$pdh->close;
  		    }
  		}
  		foreach(@poddirs) {
  		    my($dir, $entries) = @$_;
  		    foreach my $entry (@$entries) {
  			if($entry =~ $pod_rx) {
  			    my $name = $prefix.$1;
  			    if($return_path) {
  				my $path = File::Spec->catfile($dir, $entry);
  				$results{$name} ||= {};
  				$results{$name}->{pod_path} = $path
  				    unless exists($results{$name}->{pod_path});
  			    } else {
  				$results{$name} = undef;
  			    }
  			}
  		    }
  		}
  	    }
  	    if($list_prefixes || $recurse) {
  		foreach my $entry (@entries) {
  		    if(File::Spec->no_upwards($entry) && $entry =~ $dir_rx &&
  			    -d File::Spec->catdir($dir, $entry)) {
  			my $newpfx = $prefix.$entry."::";
  			if($recurse && !exists($seen_prefixes{$newpfx})) {
  			    push @prefixes, $newpfx;
  			    $seen_prefixes{$newpfx} = undef;
  			}
  			if($list_prefixes) {
  			    if($return_path) {
  				$results{$newpfx} ||= { prefix_paths => [] };
  				push @{$results{$newpfx}->{prefix_paths}},
  				    File::Spec->catfile($dir, $entry);
  			    } else {
  				$results{$newpfx} = undef;
  			    }
  			}
  		    }
  		}
  	    }
  	}
      }
      return \%results;
  }
  
  =back
  
  =head1 SEE ALSO
  
  L<Module::Runtime>
  
  =head1 AUTHOR
  
  Andrew Main (Zefram) <zefram@fysh.org>
  
  =head1 COPYRIGHT
  
  Copyright (C) 2004, 2006, 2009, 2011, 2017
  Andrew Main (Zefram) <zefram@fysh.org>
  
  =head1 LICENSE
  
  This module is free software; you can redistribute it and/or modify it
  under the same terms as Perl itself.
  
  =cut
  
  1;
MODULE_LIST

    $main::fatpacked{"Module/Path/More.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'MODULE_PATH_MORE';
  package Module::Path::More;
  
  our $DATE = '2017-02-01'; # DATE
  our $VERSION = '0.33'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  require Exporter;
  our @ISA       = qw(Exporter);
  our @EXPORT_OK = qw(module_path pod_path);
  
  our $SEPARATOR;
  
  our %SPEC;
  
  $SPEC{':package'} = {
      v => 1.1,
      summary => 'Get path to locally installed Perl module',
  };
  
  BEGIN {
      if ($^O =~ /^(dos|os2)/i) {
          $SEPARATOR = '\\';
      } elsif ($^O =~ /^MacOS/i) {
          $SEPARATOR = ':';
      } else {
          $SEPARATOR = '/';
      }
  }
  
  $SPEC{module_path} = {
      v => 1.1,
      summary => 'Get path to locally installed Perl module',
      description => <<'_',
  
  Search `@INC` (reference entries are skipped) and return path(s) to Perl module
  files with the requested name.
  
  This function is like the one from <pm:Module::Path>, except with a different
  interface and more options (finding all matches instead of the first, the option
  of not absolutizing paths, finding `.pmc` & `.pod` files, finding module
  prefixes).
  
  _
      args => {
          module => {
              summary => 'Module name to search',
              schema  => 'str*',
              req     => 1,
              pos     => 0,
          },
          find_pm => {
              summary => 'Whether to find .pm files',
              schema  => ['int*', min=>0],
              default => 1,
              description => <<'_',
  
  The value of this option is an integer number from 0. 0 means to not search for
  .pm files, while number larger than 0 means to search for .pm files. The larger
  the number, the lower the priority. If more than one type is found (prefix, .pm,
  .pmc, .pod) then the type with the lowest number is returned first.
  
  _
          },
          find_pmc => {
              summary => 'Whether to find .pmc files',
              schema  => ['int*', min=>0],
              default => 2,
              description => <<'_',
  
  The value of this option is an integer number from 0. 0 means to not search for
  .pmc files, while number larger than 0 means to search for .pmc files. The
  larger the number, the lower the priority. If more than one type is found
  (prefix, .pm, .pmc, .pod) then the type with the lowest number is returned
  first.
  
  _
          },
          find_pod => {
              summary => 'Whether to find .pod files',
              schema  => ['int*', min=>0],
              default => 0,
              description => <<'_',
  
  The value of this option is an integer number from 0. 0 means to not search for
  .pod files, while number larger than 0 means to search for .pod files. The
  larger the number, the lower the priority. If more than one type is found
  (prefix, .pm, .pmc, .pod) then the type with the lowest number is returned
  first.
  
  _
          },
          find_prefix => {
              summary => 'Whether to find module prefixes',
              schema  => ['int*', min=>0],
              default => 0,
              description => <<'_',
  
  The value of this option is an integer number from 0. 0 means to not search for
  module prefix, while number larger than 0 means to search for module prefix. The
  larger the number, the lower the priority. If more than one type is found
  (prefix, .pm, .pmc, .pod) then the type with the lowest number is returned
  first.
  
  _
          },
          all => {
              summary => 'Return all results instead of just the first',
              schema  => 'bool',
              default => 0,
          },
          abs => {
              summary => 'Whether to return absolute paths',
              schema  => 'bool',
              default => 0,
          },
      },
      result => {
          schema => ['any' => of => ['str*', ['array*' => of => 'str*']]],
      },
      result_naked => 1,
      examples => [
          {
              summary => 'Find the first Foo::Bar (.pm or .pmc) in @INC',
              args => {module => 'Foo::Bar'},
          },
          {
              summary => 'Find all Foo::Bar (.pm or .pmc) in @INC, return absolute paths',
              args => {module => 'Foo::Bar', all => 1, abs => 1},
          },
          {
              summary => 'Find the Rinci (.pod first, then .pm) in @INC',
              args => {module => 'Rinci', find_pod => 1, find_pm => 2, find_pmc => 0},
          },
      ],
  };
  sub module_path {
      my %args = @_;
  
      my $module = $args{module} or die "Please specify module";
  
      $args{abs}         //= 0;
      $args{all}         //= 0;
      $args{find_pm}     //= 1;
      $args{find_pmc}    //= 2;
      $args{find_pod}    //= 0;
      $args{find_prefix} //= 0;
  
      require Cwd if $args{abs};
  
      my @res;
      my %unfound = (
          ("pm" => 1)     x !!$args{find_pm},
          ("pmc" => 1)    x !!$args{find_pmc},
          ("pod" => 1)    x !!$args{find_pod},
          ("prefix" => 1) x !!$args{find_prefix},
      );
      my $add = sub {
          my ($path, $prio) = @_;
          push @res, [$args{abs} ? Cwd::abs_path($path) : $path, $prio];
      };
  
      my $relpath;
  
      ($relpath = $module) =~ s/::/$SEPARATOR/g;
      $relpath =~ s/\.(pm|pmc|pod)\z//i;
  
      foreach my $dir (@INC) {
          next if not defined($dir);
          next if ref($dir);
  
          my $prefix = $dir . $SEPARATOR . $relpath;
          if ($args{find_pm}) {
              my $file = $prefix . ".pm";
              if (-f $file) {
                  $add->($file, $args{find_pm});
                  delete $unfound{pm};
                  last if !keys(%unfound) && !$args{all};
              }
          }
          if ($args{find_pmc}) {
              my $file = $prefix . ".pmc";
              if (-f $file) {
                  $add->($file, $args{find_pmc});
                  delete $unfound{pmc};
                  last if !keys(%unfound) && !$args{all};
              }
          }
          if ($args{find_pod}) {
              my $file = $prefix . ".pod";
              if (-f $file) {
                  $add->($file, $args{find_pod});
                  delete $unfound{pod};
                  last if !keys(%unfound) && !$args{all};
              }
          }
          if ($args{find_prefix}) {
              if (-d $prefix) {
                  $add->($prefix, $args{find_prefix});
                  delete $unfound{prefix};
                  last if !keys(%unfound) && !$args{all};
              }
          }
      }
  
      @res = map { $_->[0] } sort { $a->[1] <=> $b->[1] } @res;
  
      if ($args{all}) {
          return \@res;
      } else {
          return @res ? $res[0] : undef;
      }
  }
  
  $SPEC{pod_path} = {
      v => 1.1,
      summary => 'Get path to locally installed POD',
      description => <<'_',
  
  This is a shortcut for:
  
      module_path(%args, find_pm=>0, find_pmc=>0, find_pod=>1, find_prefix=>0)
  
  _
      args => {
          module => {
              summary => 'Module name to search',
              schema  => 'str*',
              req     => 1,
              pos     => 0,
          },
          all => {
              summary => 'Return all results instead of just the first',
              schema  => 'bool',
              default => 0,
          },
          abs => {
              summary => 'Whether to return absolute paths',
              schema  => 'bool',
              default => 0,
          },
      },
      result => {
          schema => ['any' => of => ['str*', ['array*' => of => 'str*']]],
      },
      result_naked => 1,
  };
  sub pod_path {
      module_path(@_, find_pm=>0, find_pmc=>0, find_pod=>1, find_prefix=>0);
  }
  
  1;
  # ABSTRACT: Get path to locally installed Perl module
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Module::Path::More - Get path to locally installed Perl module
  
  =head1 VERSION
  
  This document describes version 0.33 of Module::Path::More (from Perl distribution Module-Path-More), released on 2017-02-01.
  
  =head1 SYNOPSIS
  
   use Module::Path::More qw(module_path pod_path);
  
   $path = module_path(module=>'Test::More');
   if (defined($path)) {
     print "Test::More found at $path\n";
   } else {
     print "Danger Will Robinson!\n";
   }
  
   # find all found modules, as well as .pmc and .pod files
   $paths = module_path(module=>'Foo::Bar', all=>1, find_pmc=>1, find_pod=>1);
  
   # just a shortcut for module_path(module=>'Foo',
   #                                 find_pm=>0, find_pmc=>0, find_pod=>1);
   $path = pod_path(module=>'Foo');
  
  =head1 DESCRIPTION
  
  Module::Path::More provides a function, C<module_path()>, which will find where
  a module (or module prefix, or .pod file) is installed locally. (There is also
  another function C<pod_path()> which is just a convenience wrapper.)
  
  It works by looking in all the directories in @INC for an appropriately named
  file. If module is C<Foo::Bar>, will search for C<Foo/Bar.pm>, C<Foo/Bar.pmc>
  (if C<find_pmc> argument is true), C<Foo/Bar> directory (if C<find_prefix>
  argument is true), or C<Foo/Bar.pod> (if C<find_pod> argument is true).
  
  Caveats: Obviously this only works where the module you're after has its own
  C<.pm> file. If a file defines multiple packages, this won't work. This also
  won't find any modules that are being loaded in some special way, for example
  using a code reference in C<@INC>, as described in C<require> in L<perlfunc>.
  
  To check whether a module is available/loadable, it's generally better to use
  something like:
  
   if (eval { require Some::Module; 1 }) {
       # module is available
   }
  
  because this works with fatpacking or any other C<@INC> hook that might be
  installed. If you use:
  
   if (module_path(module => "Some::Module")) {
       # module is available
   }
  
  then it only works if the module is locatable in the filesystem. But on the
  other hand this method can avoid actual loading of the module.
  
  =head1 FUNCTIONS
  
  
  =head2 module_path(%args) -> str|array[str]
  
  Get path to locally installed Perl module.
  
  Examples:
  
  =over
  
  =item * Find the first Foo::Bar (.pm or .pmc) in @INC:
  
   module_path(module => "Foo::Bar"); # -> undef
  
  =item * Find all Foo::Bar (.pm or .pmc) in @INC, return absolute paths:
  
   module_path(module => "Foo::Bar", abs => 1, all => 1); # -> []
  
  =item * Find the Rinci (.pod first, then .pm) in @INC:
  
   module_path(module => "Rinci", find_pm => 2, find_pmc => 0, find_pod => 1);
  
  Result:
  
   "/home/u1/perl5/perlbrew/perls/perl-5.24.0/lib/site_perl/5.24.0/Rinci.pod"
  
  =back
  
  Search C<@INC> (reference entries are skipped) and return path(s) to Perl module
  files with the requested name.
  
  This function is like the one from L<Module::Path>, except with a different
  interface and more options (finding all matches instead of the first, the option
  of not absolutizing paths, finding C<.pmc> & C<.pod> files, finding module
  prefixes).
  
  This function is not exported by default, but exportable.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<abs> => I<bool> (default: 0)
  
  Whether to return absolute paths.
  
  =item * B<all> => I<bool> (default: 0)
  
  Return all results instead of just the first.
  
  =item * B<find_pm> => I<int> (default: 1)
  
  Whether to find .pm files.
  
  The value of this option is an integer number from 0. 0 means to not search for
  .pm files, while number larger than 0 means to search for .pm files. The larger
  the number, the lower the priority. If more than one type is found (prefix, .pm,
  .pmc, .pod) then the type with the lowest number is returned first.
  
  =item * B<find_pmc> => I<int> (default: 2)
  
  Whether to find .pmc files.
  
  The value of this option is an integer number from 0. 0 means to not search for
  .pmc files, while number larger than 0 means to search for .pmc files. The
  larger the number, the lower the priority. If more than one type is found
  (prefix, .pm, .pmc, .pod) then the type with the lowest number is returned
  first.
  
  =item * B<find_pod> => I<int> (default: 0)
  
  Whether to find .pod files.
  
  The value of this option is an integer number from 0. 0 means to not search for
  .pod files, while number larger than 0 means to search for .pod files. The
  larger the number, the lower the priority. If more than one type is found
  (prefix, .pm, .pmc, .pod) then the type with the lowest number is returned
  first.
  
  =item * B<find_prefix> => I<int> (default: 0)
  
  Whether to find module prefixes.
  
  The value of this option is an integer number from 0. 0 means to not search for
  module prefix, while number larger than 0 means to search for module prefix. The
  larger the number, the lower the priority. If more than one type is found
  (prefix, .pm, .pmc, .pod) then the type with the lowest number is returned
  first.
  
  =item * B<module>* => I<str>
  
  Module name to search.
  
  =back
  
  Return value:  (str|array[str])
  
  
  =head2 pod_path(%args) -> str|array[str]
  
  Get path to locally installed POD.
  
  This is a shortcut for:
  
   module_path(%args, find_pm=>0, find_pmc=>0, find_pod=>1, find_prefix=>0)
  
  This function is not exported by default, but exportable.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<abs> => I<bool> (default: 0)
  
  Whether to return absolute paths.
  
  =item * B<all> => I<bool> (default: 0)
  
  Return all results instead of just the first.
  
  =item * B<module>* => I<str>
  
  Module name to search.
  
  =back
  
  Return value:  (str|array[str])
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Module-Path-More>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Module-Path-More>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Module-Path-More>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Module::Path>. Module::Path::More is actually a fork of Module::Path.
  Module::Path::More contains features that are not (or have not been accepted) in
  the original module, namely: finding all matches instead of the first found
  match, and finding C<.pmc/.pod> in addition to .pm files. B<Note that the
  interface is different> (Module::Path::More accepts hash/named arguments) so the
  two modules are not drop-in replacements for each other. Also, note that by
  default Module::Path::More does B<not> do an C<abs_path()> to each file it
  finds. I think this module's choice (not doing abs_path) is a more sensible
  default, because usually there is no actual need to do so and doing abs_path()
  or resolving symlinks will sometimes fail or expose filesystem quirks that we
  might not want to deal with at all. However, if you want to do abs_path, you can
  do so by setting C<abs> option to true.
  
  Command-line utility is not included in this distribution, unlike L<mpath> in
  C<Module-Path>. However, you can use L<pmpath|https://metacpan.org/pod/distribution/App-PMUtils/bin/pmpath> from L<App::PMUtils> distribution
  which uses this module.
  
  References:
  
  =over
  
  =item * L<https://github.com/neilbowers/Module-Path/issues/6>
  
  =item * L<https://github.com/neilbowers/Module-Path/issues/7>
  
  =item * L<https://github.com/neilbowers/Module-Path/issues/10>
  
  =item * L<https://rt.cpan.org/Public/Bug/Display.html?id=100979>
  
  =back
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2017 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
MODULE_PATH_MORE

    $main::fatpacked{"Module/Runtime.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'MODULE_RUNTIME';
  =head1 NAME
  
  Module::Runtime - runtime module handling
  
  =head1 SYNOPSIS
  
      use Module::Runtime qw(
  	$module_name_rx is_module_name check_module_name
  	module_notional_filename require_module);
  
      if($module_name =~ /\A$module_name_rx\z/o) { ...
      if(is_module_name($module_name)) { ...
      check_module_name($module_name);
  
      $notional_filename = module_notional_filename($module_name);
      require_module($module_name);
  
      use Module::Runtime qw(use_module use_package_optimistically);
  
      $bi = use_module("Math::BigInt", 1.31)->new("1_234");
      $widget = use_package_optimistically("Local::Widget")->new;
  
      use Module::Runtime qw(
  	$top_module_spec_rx $sub_module_spec_rx
  	is_module_spec check_module_spec
  	compose_module_name);
  
      if($spec =~ /\A$top_module_spec_rx\z/o) { ...
      if($spec =~ /\A$sub_module_spec_rx\z/o) { ...
      if(is_module_spec("Standard::Prefix", $spec)) { ...
      check_module_spec("Standard::Prefix", $spec);
  
      $module_name = compose_module_name("Standard::Prefix", $spec);
  
  =head1 DESCRIPTION
  
  The functions exported by this module deal with runtime handling of
  Perl modules, which are normally handled at compile time.  This module
  avoids using any other modules, so that it can be used in low-level
  infrastructure.
  
  The parts of this module that work with module names apply the same syntax
  that is used for barewords in Perl source.  In principle this syntax
  can vary between versions of Perl, and this module applies the syntax of
  the Perl on which it is running.  In practice the usable syntax hasn't
  changed yet.  There's some intent for Unicode module names to be supported
  in the future, but this hasn't yet amounted to any consistent facility.
  
  The functions of this module whose purpose is to load modules include
  workarounds for three old Perl core bugs regarding C<require>.  These
  workarounds are applied on any Perl version where the bugs exist, except
  for a case where one of the bugs cannot be adequately worked around in
  pure Perl.
  
  =head2 Module name syntax
  
  The usable module name syntax has not changed from Perl 5.000 up to
  Perl 5.19.8.  The syntax is composed entirely of ASCII characters.
  From Perl 5.6 onwards there has been some attempt to allow the use of
  non-ASCII Unicode characters in Perl source, but it was fundamentally
  broken (like the entirety of Perl 5.6's Unicode handling) and remained
  pretty much entirely unusable until it got some attention in the Perl
  5.15 series.  Although Unicode is now consistently accepted by the
  parser in some places, it remains broken for module names.  Furthermore,
  there has not yet been any work on how to map Unicode module names into
  filenames, so in that respect also Unicode module names are unusable.
  
  The module name syntax is, precisely: the string must consist of one or
  more segments separated by C<::>; each segment must consist of one or more
  identifier characters (ASCII alphanumerics plus "_"); the first character
  of the string must not be a digit.  Thus "C<IO::File>", "C<warnings>",
  and "C<foo::123::x_0>" are all valid module names, whereas "C<IO::>"
  and "C<1foo::bar>" are not.  C<'> separators are not permitted by this
  module, though they remain usable in Perl source, being translated to
  C<::> in the parser.
  
  =head2 Core bugs worked around
  
  The first bug worked around is core bug [perl #68590], which causes
  lexical state in one file to leak into another that is C<require>d/C<use>d
  from it.  This bug is present from Perl 5.6 up to Perl 5.10, and is
  fixed in Perl 5.11.0.  From Perl 5.9.4 up to Perl 5.10.0 no satisfactory
  workaround is possible in pure Perl.  The workaround means that modules
  loaded via this module don't suffer this pollution of their lexical
  state.  Modules loaded in other ways, or via this module on the Perl
  versions where the pure Perl workaround is impossible, remain vulnerable.
  The module L<Lexical::SealRequireHints> provides a complete workaround
  for this bug.
  
  The second bug worked around causes some kinds of failure in module
  loading, principally compilation errors in the loaded module, to be
  recorded in C<%INC> as if they were successful, so later attempts to load
  the same module immediately indicate success.  This bug is present up
  to Perl 5.8.9, and is fixed in Perl 5.9.0.  The workaround means that a
  compilation error in a module loaded via this module won't be cached as
  a success.  Modules loaded in other ways remain liable to produce bogus
  C<%INC> entries, and if a bogus entry exists then it will mislead this
  module if it is used to re-attempt loading.
  
  The third bug worked around causes the wrong context to be seen at
  file scope of a loaded module, if C<require> is invoked in a location
  that inherits context from a higher scope.  This bug is present up to
  Perl 5.11.2, and is fixed in Perl 5.11.3.  The workaround means that
  a module loaded via this module will always see the correct context.
  Modules loaded in other ways remain vulnerable.
  
  =cut
  
  package Module::Runtime;
  
  # Don't "use 5.006" here, because Perl 5.15.6 will load feature.pm if
  # the version check is done that way.
  BEGIN { require 5.006; }
  # Don't "use warnings" here, to avoid dependencies.  Do standardise the
  # warning status by lexical override; unfortunately the only safe bitset
  # to build in is the empty set, equivalent to "no warnings".
  BEGIN { ${^WARNING_BITS} = ""; }
  # Don't "use strict" here, to avoid dependencies.
  
  our $VERSION = "0.016";
  
  # Don't use Exporter here, to avoid dependencies.
  our @EXPORT_OK = qw(
  	$module_name_rx is_module_name is_valid_module_name check_module_name
  	module_notional_filename require_module
  	use_module use_package_optimistically
  	$top_module_spec_rx $sub_module_spec_rx
  	is_module_spec is_valid_module_spec check_module_spec
  	compose_module_name
  );
  my %export_ok = map { ($_ => undef) } @EXPORT_OK;
  sub import {
  	my $me = shift;
  	my $callpkg = caller(0);
  	my $errs = "";
  	foreach(@_) {
  		if(exists $export_ok{$_}) {
  			# We would need to do "no strict 'refs'" here
  			# if we had enabled strict at file scope.
  			if(/\A\$(.*)\z/s) {
  				*{$callpkg."::".$1} = \$$1;
  			} else {
  				*{$callpkg."::".$_} = \&$_;
  			}
  		} else {
  			$errs .= "\"$_\" is not exported by the $me module\n";
  		}
  	}
  	if($errs ne "") {
  		die "${errs}Can't continue after import errors ".
  			"at @{[(caller(0))[1]]} line @{[(caller(0))[2]]}.\n";
  	}
  }
  
  # Logic duplicated from Params::Classify.  Duplicating it here avoids
  # an extensive and potentially circular dependency graph.
  sub _is_string($) {
  	my($arg) = @_;
  	return defined($arg) && ref(\$arg) eq "SCALAR";
  }
  
  =head1 REGULAR EXPRESSIONS
  
  These regular expressions do not include any anchors, so to check
  whether an entire string matches a syntax item you must supply the
  anchors yourself.
  
  =over
  
  =item $module_name_rx
  
  Matches a valid Perl module name in bareword syntax.
  
  =cut
  
  our $module_name_rx = qr/[A-Z_a-z][0-9A-Z_a-z]*(?:::[0-9A-Z_a-z]+)*/;
  
  =item $top_module_spec_rx
  
  Matches a module specification for use with L</compose_module_name>,
  where no prefix is being used.
  
  =cut
  
  my $qual_module_spec_rx =
  	qr#(?:/|::)[A-Z_a-z][0-9A-Z_a-z]*(?:(?:/|::)[0-9A-Z_a-z]+)*#;
  
  my $unqual_top_module_spec_rx =
  	qr#[A-Z_a-z][0-9A-Z_a-z]*(?:(?:/|::)[0-9A-Z_a-z]+)*#;
  
  our $top_module_spec_rx = qr/$qual_module_spec_rx|$unqual_top_module_spec_rx/o;
  
  =item $sub_module_spec_rx
  
  Matches a module specification for use with L</compose_module_name>,
  where a prefix is being used.
  
  =cut
  
  my $unqual_sub_module_spec_rx = qr#[0-9A-Z_a-z]+(?:(?:/|::)[0-9A-Z_a-z]+)*#;
  
  our $sub_module_spec_rx = qr/$qual_module_spec_rx|$unqual_sub_module_spec_rx/o;
  
  =back
  
  =head1 FUNCTIONS
  
  =head2 Basic module handling
  
  =over
  
  =item is_module_name(ARG)
  
  Returns a truth value indicating whether I<ARG> is a plain string
  satisfying Perl module name syntax as described for L</$module_name_rx>.
  
  =cut
  
  sub is_module_name($) { _is_string($_[0]) && $_[0] =~ /\A$module_name_rx\z/o }
  
  =item is_valid_module_name(ARG)
  
  Deprecated alias for L</is_module_name>.
  
  =cut
  
  *is_valid_module_name = \&is_module_name;
  
  =item check_module_name(ARG)
  
  Check whether I<ARG> is a plain string
  satisfying Perl module name syntax as described for L</$module_name_rx>.
  Return normally if it is, or C<die> if it is not.
  
  =cut
  
  sub check_module_name($) {
  	unless(&is_module_name) {
  		die +(_is_string($_[0]) ? "`$_[0]'" : "argument").
  			" is not a module name\n";
  	}
  }
  
  =item module_notional_filename(NAME)
  
  Generates a notional relative filename for a module, which is used in
  some Perl core interfaces.
  The I<NAME> is a string, which should be a valid module name (one or
  more C<::>-separated segments).  If it is not a valid name, the function
  C<die>s.
  
  The notional filename for the named module is generated and returned.
  This filename is always in Unix style, with C</> directory separators
  and a C<.pm> suffix.  This kind of filename can be used as an argument to
  C<require>, and is the key that appears in C<%INC> to identify a module,
  regardless of actual local filename syntax.
  
  =cut
  
  sub module_notional_filename($) {
  	&check_module_name;
  	my($name) = @_;
  	$name =~ s!::!/!g;
  	return $name.".pm";
  }
  
  =item require_module(NAME)
  
  This is essentially the bareword form of C<require>, in runtime form.
  The I<NAME> is a string, which should be a valid module name (one or
  more C<::>-separated segments).  If it is not a valid name, the function
  C<die>s.
  
  The module specified by I<NAME> is loaded, if it hasn't been already,
  in the manner of the bareword form of C<require>.  That means that a
  search through C<@INC> is performed, and a byte-compiled form of the
  module will be used if available.
  
  The return value is as for C<require>.  That is, it is the value returned
  by the module itself if the module is loaded anew, or C<1> if the module
  was already loaded.
  
  =cut
  
  # Don't "use constant" here, to avoid dependencies.
  BEGIN {
  	*_WORK_AROUND_HINT_LEAKAGE =
  		"$]" < 5.011 && !("$]" >= 5.009004 && "$]" < 5.010001)
  			? sub(){1} : sub(){0};
  	*_WORK_AROUND_BROKEN_MODULE_STATE = "$]" < 5.009 ? sub(){1} : sub(){0};
  }
  
  BEGIN { if(_WORK_AROUND_BROKEN_MODULE_STATE) { eval q{
  	sub Module::Runtime::__GUARD__::DESTROY {
  		delete $INC{$_[0]->[0]} if @{$_[0]};
  	}
  	1;
  }; die $@ if $@ ne ""; } }
  
  sub require_module($) {
  	# Localise %^H to work around [perl #68590], where the bug exists
  	# and this is a satisfactory workaround.  The bug consists of
  	# %^H state leaking into each required module, polluting the
  	# module's lexical state.
  	local %^H if _WORK_AROUND_HINT_LEAKAGE;
  	if(_WORK_AROUND_BROKEN_MODULE_STATE) {
  		my $notional_filename = &module_notional_filename;
  		my $guard = bless([ $notional_filename ],
  				"Module::Runtime::__GUARD__");
  		my $result = CORE::require($notional_filename);
  		pop @$guard;
  		return $result;
  	} else {
  		return scalar(CORE::require(&module_notional_filename));
  	}
  }
  
  =back
  
  =head2 Structured module use
  
  =over
  
  =item use_module(NAME[, VERSION])
  
  This is essentially C<use> in runtime form, but without the importing
  feature (which is fundamentally a compile-time thing).  The I<NAME> is
  handled just like in C<require_module> above: it must be a module name,
  and the named module is loaded as if by the bareword form of C<require>.
  
  If a I<VERSION> is specified, the C<VERSION> method of the loaded module is
  called with the specified I<VERSION> as an argument.  This normally serves to
  ensure that the version loaded is at least the version required.  This is
  the same functionality provided by the I<VERSION> parameter of C<use>.
  
  On success, the name of the module is returned.  This is unlike
  L</require_module>, and is done so that the entire call to L</use_module>
  can be used as a class name to call a constructor, as in the example in
  the synopsis.
  
  =cut
  
  sub use_module($;$) {
  	my($name, $version) = @_;
  	require_module($name);
  	$name->VERSION($version) if @_ >= 2;
  	return $name;
  }
  
  =item use_package_optimistically(NAME[, VERSION])
  
  This is an analogue of L</use_module> for the situation where there is
  uncertainty as to whether a package/class is defined in its own module
  or by some other means.  It attempts to arrange for the named package to
  be available, either by loading a module or by doing nothing and hoping.
  
  An attempt is made to load the named module (as if by the bareword form
  of C<require>).  If the module cannot be found then it is assumed that
  the package was actually already loaded by other means, and no error
  is signalled.  That's the optimistic bit.
  
  I<Warning:> this optional module loading is liable to cause unreliable
  behaviour, including security problems.  It interacts especially badly
  with having C<.> in C<@INC>, which was the default state of affairs in
  Perls prior to 5.25.11.  If a package is actually defined by some means
  other than a module, then applying this function to it causes a spurious
  attempt to load a module that is expected to be non-existent.  If a
  module actually exists under that name then it will be unintentionally
  loaded.  If C<.> is in C<@INC> and this code is ever run with the current
  directory being one writable by a malicious user (such as F</tmp>), then
  the malicious user can easily cause the victim to run arbitrary code, by
  creating a module file under the predictable spuriously-loaded name in the
  writable directory.  Generally, optional module loading should be avoided.
  
  This is mostly the same operation that is performed by the L<base> pragma
  to ensure that the specified base classes are available.  The behaviour
  of L<base> was simplified in version 2.18, and later improved in version
  2.20, and on both occasions this function changed to match.
  
  If a I<VERSION> is specified, the C<VERSION> method of the loaded package is
  called with the specified I<VERSION> as an argument.  This normally serves
  to ensure that the version loaded is at least the version required.
  On success, the name of the package is returned.  These aspects of the
  function work just like L</use_module>.
  
  =cut
  
  sub use_package_optimistically($;$) {
  	my($name, $version) = @_;
  	my $fn = module_notional_filename($name);
  	eval { local $SIG{__DIE__}; require_module($name); };
  	die $@ if $@ ne "" &&
  		($@ !~ /\ACan't locate \Q$fn\E .+ at \Q@{[__FILE__]}\E line/s ||
  		 $@ =~ /^Compilation\ failed\ in\ require
  			 \ at\ \Q@{[__FILE__]}\E\ line/xm);
  	$name->VERSION($version) if @_ >= 2;
  	return $name;
  }
  
  =back
  
  =head2 Module name composition
  
  =over
  
  =item is_module_spec(PREFIX, SPEC)
  
  Returns a truth value indicating
  whether I<SPEC> is valid input for L</compose_module_name>.
  See below for what that entails.  Whether a I<PREFIX> is supplied affects
  the validity of I<SPEC>, but the exact value of the prefix is unimportant,
  so this function treats I<PREFIX> as a truth value.
  
  =cut
  
  sub is_module_spec($$) {
  	my($prefix, $spec) = @_;
  	return _is_string($spec) &&
  		$spec =~ ($prefix ? qr/\A$sub_module_spec_rx\z/o :
  				    qr/\A$top_module_spec_rx\z/o);
  }
  
  =item is_valid_module_spec(PREFIX, SPEC)
  
  Deprecated alias for L</is_module_spec>.
  
  =cut
  
  *is_valid_module_spec = \&is_module_spec;
  
  =item check_module_spec(PREFIX, SPEC)
  
  Check whether I<SPEC> is valid input for L</compose_module_name>.
  Return normally if it is, or C<die> if it is not.
  
  =cut
  
  sub check_module_spec($$) {
  	unless(&is_module_spec) {
  		die +(_is_string($_[1]) ? "`$_[1]'" : "argument").
  			" is not a module specification\n";
  	}
  }
  
  =item compose_module_name(PREFIX, SPEC)
  
  This function is intended to make it more convenient for a user to specify
  a Perl module name at runtime.  Users have greater need for abbreviations
  and context-sensitivity than programmers, and Perl module names get a
  little unwieldy.  I<SPEC> is what the user specifies, and this function
  translates it into a module name in standard form, which it returns.
  
  I<SPEC> has syntax approximately that of a standard module name: it
  should consist of one or more name segments, each of which consists
  of one or more identifier characters.  However, C</> is permitted as a
  separator, in addition to the standard C<::>.  The two separators are
  entirely interchangeable.
  
  Additionally, if I<PREFIX> is not C<undef> then it must be a module
  name in standard form, and it is prefixed to the user-specified name.
  The user can inhibit the prefix addition by starting I<SPEC> with a
  separator (either C</> or C<::>).
  
  =cut
  
  sub compose_module_name($$) {
  	my($prefix, $spec) = @_;
  	check_module_name($prefix) if defined $prefix;
  	&check_module_spec;
  	if($spec =~ s#\A(?:/|::)##) {
  		# OK
  	} else {
  		$spec = $prefix."::".$spec if defined $prefix;
  	}
  	$spec =~ s#/#::#g;
  	return $spec;
  }
  
  =back
  
  =head1 BUGS
  
  On Perl versions 5.7.2 to 5.8.8, if C<require> is overridden by the
  C<CORE::GLOBAL> mechanism, it is likely to break the heuristics used by
  L</use_package_optimistically>, making it signal an error for a missing
  module rather than assume that it was already loaded.  From Perl 5.8.9
  onwards, and on 5.7.1 and earlier, this module can avoid being confused
  by such an override.  On the affected versions, a C<require> override
  might be installed by L<Lexical::SealRequireHints>, if something requires
  its bugfix but for some reason its XS implementation isn't available.
  
  =head1 SEE ALSO
  
  L<Lexical::SealRequireHints>,
  L<base>,
  L<perlfunc/require>,
  L<perlfunc/use>
  
  =head1 AUTHOR
  
  Andrew Main (Zefram) <zefram@fysh.org>
  
  =head1 COPYRIGHT
  
  Copyright (C) 2004, 2006, 2007, 2009, 2010, 2011, 2012, 2014, 2017
  Andrew Main (Zefram) <zefram@fysh.org>
  
  =head1 LICENSE
  
  This module is free software; you can redistribute it and/or modify it
  under the same terms as Perl itself.
  
  =cut
  
  1;
MODULE_RUNTIME

    $main::fatpacked{"Monkey/Patch/Action.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'MONKEY_PATCH_ACTION';
  package Monkey::Patch::Action;
  
  our $DATE = '2018-04-02'; # DATE
  our $VERSION = '0.061'; # VERSION
  
  use 5.010001;
  use warnings;
  use strict;
  
  use Monkey::Patch::Action::Handle;
  use Scalar::Util qw(blessed);
  
  use Exporter qw(import);
  our @EXPORT_OK = qw(patch_package patch_object);
  our %EXPORT_TAGS = (all => \@EXPORT_OK);
  
  sub patch_package {
      my ($package, $subname, $action, $code, @extra) = @_;
  
      die "Please specify action" unless $action;
      if ($action eq 'delete') {
          die "code not needed for 'delete' action" if $code;
      } else {
          die "Please specify code" unless $code;
      }
  
      my $name = "$package\::$subname";
      my $type;
      if ($action eq 'add') {
          die "Adding $name: must not already exist" if defined(&$name);
          $type = 'sub';
      } elsif ($action eq 'replace') {
          die "Replacing $name: must already exist" unless defined(&$name);
          $type = 'sub';
      } elsif ($action eq 'add_or_replace') {
          $type = 'sub';
      } elsif ($action eq 'wrap') {
          die "Wrapping $name: must already exist" unless defined(&$name);
          $type = 'wrap';
      } elsif ($action eq 'delete') {
          $type = 'delete';
      } else {
          die "Unknown action '$action', please use either ".
              "wrap/add/replace/add_or_replace/delete";
      }
  
      my @caller = caller(0);
  
      Monkey::Patch::Action::Handle->new(
          package => $package,
          subname => $subname,
          extra   => \@extra,
          patcher => \@caller,
          code    => $code,
  
          -type   => $type,
      );
  }
  
  sub patch_object {
      my ($obj, $methname, $action0, $code0, @extra) = @_;
  
      die "'$obj' not an object" unless blessed($obj);
      die "Please specify action" unless $action0;
      die "Invalid action '$action0', please choose add|replace|add_or_replace|wrap|delete"
          unless $action0 =~ /\A(add|replace|add_or_replace|wrap|delete)\z/;
      if ($action0 eq 'delete') {
          die "code not needed for 'delete' action" if $code0;
      } else {
          die "Please specify code" unless $code0;
      }
  
      my $package = ref($obj);
      my $name = "$package\::$methname";
      my $action = defined(&$name) ? 'wrap' : 'add';
  
      my $code = sub {
          my $ctx  = $action eq 'wrap' ? shift : undef;
          my $self = $_[0];
          no warnings 'numeric';
          if ($obj == $self) {
              if ($action0 eq 'add') {
                  $code0->(@_);
              } elsif ($action0 eq 'replace') {
                  $code0->(@_);
              } elsif ($action0 eq 'add_or_replace') {
                  $code0->(@_);
              } elsif ($action0 eq 'wrap') {
                  my $octx = {%$ctx};
                  $code0->($octx, @_);
              } elsif ($action0 eq 'delete') {
                  die "Undefined method '$methname' for object '$obj'";
              } else {
                  die "BUG: Unknown action '$action0'";
              }
          } else {
              if ($action eq 'wrap') {
                  return $ctx->{orig}->(@_);
              } else {
                  die "Undefined method '$methname' for object '$obj'";
              }
          }
      };
  
      patch_package($package, $methname, $action, $code, @extra);
  }
  
  1;
  # ABSTRACT: Wrap/add/replace/delete subs from other package (with restore)
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Monkey::Patch::Action - Wrap/add/replace/delete subs from other package (with restore)
  
  =head1 VERSION
  
  This document describes version 0.061 of Monkey::Patch::Action (from Perl distribution Monkey-Patch-Action), released on 2018-04-02.
  
  =head1 SYNOPSIS
  
  Patching package or class:
  
   use Monkey::Patch::Action qw(patch_package);
  
   package Foo;
   sub sub1  { say "Foo's sub1" }
   sub sub2  { say "Foo's sub2, args=", join(",", @_) }
   sub meth1 { my $self = shift; say "Foo's meth1" }
  
   package Bar;
   our @ISA = qw(Foo);
  
   package main;
   my $h; # handle object
   my $foo = Foo->new;
   my $bar = Bar->new;
  
   # replacing a subroutine
   $h = patch_package('Foo', 'sub1', 'replace', sub { "qux" });
   Foo::sub1(); # says "qux"
   undef $h;
   Foo::sub1(); # says "Foo's sub1"
  
   # adding a subroutine
   $h = patch_package('Foo', 'sub3', 'add', sub { "qux" });
   Foo::sub3(); # says "qux"
   undef $h;
   Foo::sub3(); # dies
  
   # deleting a subroutine
   $h = patch_package('Foo', 'sub2', 'delete');
   Foo::sub2(); # dies
   undef $h;
   Foo::sub2(); # says "Foo's sub2, args="
  
   # wrapping a subroutine
   $h = patch_package('Foo', 'sub2', 'wrap',
       sub {
           my $ctx = shift;
           say "wrapping $ctx->{package}::$ctx->{subname}";
           $ctx->{orig}->(@_);
       }
   );
   Foo::sub2(1,2,3); # says "wrapping Foo::sub2" then "Foo's sub2, args=1,2,3"
   undef $h;
   Foo::sub2(1,2,3); # says "Foo's sub2, args=1,2,3"
  
   # stacking patches (note: can actually be unapplied in random order)
   my ($h2, $h3);
   $h  = patch_package('Foo', 'sub1', 'replace', sub { "qux" });
   Foo::sub1(); # says "qux"
   $h2 = patch_package('Foo', 'sub1', 'delete');
   Foo::sub1(); # dies
   $h3 = patch_package('Foo', 'sub1', 'replace', sub { "quux" });
   Foo::sub1(); # says "quux"
   undef $h3;
   Foo::sub1(); # dies
   undef $h2;
   Foo::sub1(); # says "qux"
   undef $h;
   Foo::sub1(); # says "Foo's sub1"
  
  Patching object:
  
   use Monkey::Patch::Action qw(patch_package);
  
   package Foo;
   sub meth1 { say "Foo's meth1" }
  
   package Bar;
   our @ISA = qw(Foo);
   sub meth2 { say "Bar's meth2" }
  
   package main;
   my $h; # handle object
   my $foo1 = Foo->new;
   my $foo2 = Foo->new;
   my $bar1 = Bar->new;
   my $bar2 = Bar->new;
  
   # replacing a method
   $h = patch_object($foo1, 'meth1', 'replace', sub { say "Foo's modified meth1" });
   $foo1->meth1; # says "Foo's modified meth1"
   $foo2->meth1; # says "Foo's meth1"
   undef $h;
   $foo1->meth1; # says "Foo's meth1"
  
   $h = patch_object($bar1, 'meth3', 'add', sub { "Bar's meth3" });
   $bar1->meth3; # says "Bar's meth3"
   $bar2->meth3; # dies
   undef $h;
   $bar1->meth3; # dies
  
   # deleting a method
   $h = patch_object($foo1, 'meth1', 'delete');
   $foo1->meth1; # dies
   $foo2->meth1; # says "Foo's meth1"
   undef $h;
   $foo1->meth1; # says "Foo's meth1"
  
   # wrapping a method
   $h = patch_object($foo1, 'meth1', 'wrap',
       sub {
           my $ctx = shift;
           say "Wrapping $ctx->{package}::$ctx->{subname}";
           $ctx->{orig}->(@_);
       }
   );
   $foo1->meth1; # says "Wrapping Foo::meth1" then "Foo's meth1"
   $foo2->meth1; # says "Foo's meth1"
   undef $h;
   $foo1->meth1; # says "Foo's meth1"
  
  =head1 DESCRIPTION
  
  Monkey-patching is the act of modifying a package at runtime: adding a
  subroutine/method, replacing/deleting/wrapping another, etc. Perl makes it easy
  to do that, for example:
  
   # add a subroutine
   *{"Target::sub1"} = sub { ... };
  
   # another way, can be done from any file
   package Target;
   sub sub2 { ... }
  
   # delete a subroutine
   undef *{"Target::sub3"};
  
  This module makes things even easier by helping you apply a stack of patches and
  unapply them later in flexible order.
  
  =head1 FUNCTIONS
  
  =head2 patch_package
  
  Usage:
  
   patch_package($package, $subname, $action, $code, @extra) => HANDLE
  
  Patch C<$package>'s subroutine named C<$subname>. C<$action> is either:
  
  =over
  
  =item * C<wrap>
  
  C<$subname> must already exist. C<code> is required.
  
  Your code receives a context hash as its first argument, followed by any
  arguments the subroutine would have normally gotten. Context hash contains:
  C<orig> (the original subroutine that is being wrapped), C<subname>, C<package>,
  C<extra>.
  
  =item * C<add>
  
  C<subname> must not already exist. C<code> is required.
  
  =item * C<replace>
  
  C<subname> must already exist. C<code> is required.
  
  =item * C<add_or_replace>
  
  C<code> is required.
  
  =item * C<delete>
  
  C<code> is not needed.
  
  =back
  
  Die on error.
  
  Function returns a handle object. As soon as you lose the value of the handle
  (by calling in void context, assigning over the variable, undeffing the
  variable, letting it go out of scope, etc), the patch is unapplied.
  
  Patches can be unapplied in random order, but unapplying a patch where the next
  patch is a wrapper can lead to an error. Example: first patch (P1) adds a
  subroutine and second patch (P2) wraps it. If P1 is unapplied before P2, the
  subroutine is now no longer there, and P2 no longer works. Unapplying P1 after
  P2 works, of course.
  
  =head2 patch_object
  
  Usage:
  
   patch_object($obj, $methname, $action, $code, @extra) => HANDLE
  
  Basically just a wrapper for C<patch_package> to patch "only specific
  object(s)". Basically it does something like this:
  
   die "'$obj' is not an object" unless blessed($obj);
   my $package = ref($obj);
   patch_package($package, $methname, 'wrap',
       sub {
           my $ctx = shift;
           my $self = shift;
  
           my $o = $ctx->{extra}[0];
           no warnings 'numeric';
           if ($o == $self) {
               # do stuff
           } else {
               # not our target object
               $ctx->{orig}->(@_);
           }
       },
   );
  
  =head1 FAQ
  
  =head2 Differences with Monkey::Patch?
  
  This module is based on the wonderful L<Monkey::Patch> by Paul Driver. The
  differences are:
  
  =over
  
  =item *
  
  This module adds the ability to add/replace/delete subroutines instead of just
  wrapping them.
  
  =item *
  
  Interface to patch_package() is slightly different (see previous item for the
  cause).
  
  =item *
  
  Using this module, the wrapper receives a context hash instead of just the
  original subroutine.
  
  =item *
  
  =back
  
  =head2 How to patch classes and objects?
  
  Patching a class is basically the same as patching any other package, since Perl
  implements a class with a package. One thing to note is that to call a parent's
  method inside your wrapper code, instead of:
  
   $self->SUPER::methname(...)
  
  you need to do something like:
  
   use SUPER;
   SUPER::find_parent(ref($self), 'methname')->methname(...)
  
  Patching an object is also basically patching a class/package, because Perl does
  not have per-object method like Ruby. But if you just want to provide a modified
  behavior for a certain object only, you can do something like:
  
   patch_package($package, $methname, 'wrap',
   sub {
       my $ctx = shift;
       my $self = shift;
  
       my $obj = $ctx->{extra}[0];
       no warnings 'numeric';
       if ($obj == $self) {
           # do stuff
       }
       $ctx->{orig}->(@_);
   }, $obj);
  
  This is basically what L</"patch_object"> does.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Monkey-Patch-Action>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Monkey-Patch-Action>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Monkey-Patch-Action>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Monkey::Patch>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2018, 2017, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
MONKEY_PATCH_ACTION

    $main::fatpacked{"Monkey/Patch/Action/Handle.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'MONKEY_PATCH_ACTION_HANDLE';
  package Monkey::Patch::Action::Handle;
  
  our $DATE = '2018-04-02'; # DATE
  our $VERSION = '0.061'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  
  use Scalar::Util qw(weaken);
  use Sub::Delete;
  
  my %stacks;
  
  sub __find_previous {
      my ($stack, $code) = @_;
      state $empty = sub {};
  
      for my $i (1..$#$stack) {
          if ($stack->[$i][1] == $code) {
              return $stack->[$i-1][2] // $stack->[$i-1][1];
          }
      }
      $empty;
  }
  
  sub new {
      my ($class, %args) = @_;
  
      my $type = $args{-type};
      delete $args{-type};
  
      my $code = $args{code};
  
      my $name = "$args{package}::$args{subname}";
      my $stack;
      if (!$stacks{$name}) {
          $stacks{$name} = [];
          push @{$stacks{$name}}, [sub => \&$name] if defined(&$name);
      }
      $stack = $stacks{$name};
  
      my $self = bless \%args, $class;
  
      no strict 'refs';
      no warnings 'redefine';
      if ($type eq 'sub') {
          push @$stack, [$type => $code];
          *$name = $code;
      } elsif ($type eq 'delete') {
          $code = sub {};
          $args{code} = $code;
          push @$stack, [$type, $code];
          delete_sub $name;
      } elsif ($type eq 'wrap') {
          weaken($self);
          my $wrapper = sub {
              my $ctx = {
                  package => $self->{package},
                  subname => $self->{subname},
                  extra   => $self->{extra},
                  orig    => __find_previous($stack, $self->{code}),
              };
              unshift @_, $ctx;
              goto &{$self->{code}};
          };
          push @$stack, [$type => $code => $wrapper];
          *$name = $wrapper;
      }
  
      $self;
  }
  
  sub DESTROY {
      my $self = shift;
  
      my $name  = "$self->{package}::$self->{subname}";
      my $stack = $stacks{$name};
      my $code  = $self->{code};
  
      for my $i (0..$#$stack) {
          if($stack->[$i][1] == $code) {
              if ($stack->[$i+1]) {
                  # check conflict
                  if ($stack->[$i+1][0] eq 'wrap' &&
                          ($i == 0 || $stack->[$i-1][0] eq 'delete')) {
                      my $p = $self->{patcher};
                      warn "Warning: unapplying patch to $name ".
                          "(applied in $p->[1]:$p->[2]) before a wrapping patch";
                  }
              }
  
              no strict 'refs';
              if ($i == @$stack-1) {
                  if ($i) {
                      no warnings 'redefine';
                      if ($stack->[$i-1][0] eq 'delete') {
                          delete_sub $name;
                      } else {
                          *$name = $stack->[$i-1][2] // $stack->[$i-1][1];
                      }
                  } else {
                      delete_sub $name;
                  }
              }
              splice @$stack, $i, 1;
              last;
          }
      }
  }
  
  1;
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Monkey::Patch::Action::Handle
  
  =head1 VERSION
  
  This document describes version 0.061 of Monkey::Patch::Action::Handle (from Perl distribution Monkey-Patch-Action), released on 2018-04-02.
  
  =for Pod::Coverage .*
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Monkey-Patch-Action>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Monkey-Patch-Action>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Monkey-Patch-Action>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2018, 2017, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
MONKEY_PATCH_ACTION_HANDLE

    $main::fatpacked{"Net/HTTP.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'NET_HTTP';
  package Net::HTTP;
  our $VERSION = '6.19';
  use strict;
  use warnings;
  
  use vars qw($SOCKET_CLASS);
  unless ($SOCKET_CLASS) {
      # Try several, in order of capability and preference
      if (eval { require IO::Socket::IP }) {
         $SOCKET_CLASS = "IO::Socket::IP";    # IPv4+IPv6
      } elsif (eval { require IO::Socket::INET6 }) {
         $SOCKET_CLASS = "IO::Socket::INET6"; # IPv4+IPv6
      } elsif (eval { require IO::Socket::INET }) {
         $SOCKET_CLASS = "IO::Socket::INET";  # IPv4 only
      } else {
         require IO::Socket;
         $SOCKET_CLASS = "IO::Socket::INET";
      }
  }
  require Net::HTTP::Methods;
  require Carp;
  
  our @ISA = ($SOCKET_CLASS, 'Net::HTTP::Methods');
  
  sub new {
      my $class = shift;
      Carp::croak("No Host option provided") unless @_;
      $class->SUPER::new(@_);
  }
  
  sub configure {
      my($self, $cnf) = @_;
      $self->http_configure($cnf);
  }
  
  sub http_connect {
      my($self, $cnf) = @_;
      $self->SUPER::configure($cnf);
  }
  
  1;
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Net::HTTP - Low-level HTTP connection (client)
  
  =head1 VERSION
  
  version 6.19
  
  =head1 SYNOPSIS
  
   use Net::HTTP;
   my $s = Net::HTTP->new(Host => "www.perl.com") || die $@;
   $s->write_request(GET => "/", 'User-Agent' => "Mozilla/5.0");
   my($code, $mess, %h) = $s->read_response_headers;
  
   while (1) {
      my $buf;
      my $n = $s->read_entity_body($buf, 1024);
      die "read failed: $!" unless defined $n;
      last unless $n;
      print $buf;
   }
  
  =head1 DESCRIPTION
  
  The C<Net::HTTP> class is a low-level HTTP client.  An instance of the
  C<Net::HTTP> class represents a connection to an HTTP server.  The
  HTTP protocol is described in RFC 2616.  The C<Net::HTTP> class
  supports C<HTTP/1.0> and C<HTTP/1.1>.
  
  C<Net::HTTP> is a sub-class of one of C<IO::Socket::IP> (IPv6+IPv4),
  C<IO::Socket::INET6> (IPv6+IPv4), or C<IO::Socket::INET> (IPv4 only).  
  You can mix the methods described below with reading and writing from the
  socket directly.  This is not necessary a good idea, unless you know what
  you are doing.
  
  The following methods are provided (in addition to those of
  C<IO::Socket::INET>):
  
  =over
  
  =item $s = Net::HTTP->new( %options )
  
  The C<Net::HTTP> constructor method takes the same options as
  C<IO::Socket::INET>'s as well as these:
  
    Host:            Initial host attribute value
    KeepAlive:       Initial keep_alive attribute value
    SendTE:          Initial send_te attribute_value
    HTTPVersion:     Initial http_version attribute value
    PeerHTTPVersion: Initial peer_http_version attribute value
    MaxLineLength:   Initial max_line_length attribute value
    MaxHeaderLines:  Initial max_header_lines attribute value
  
  The C<Host> option is also the default for C<IO::Socket::INET>'s
  C<PeerAddr>.  The C<PeerPort> defaults to 80 if not provided.
  The C<PeerPort> specification can also be embedded in the C<PeerAddr>
  by preceding it with a ":", and closing the IPv6 address on brackets "[]" if
  necessary: "192.0.2.1:80","[2001:db8::1]:80","any.example.com:80".
  
  The C<Listen> option provided by C<IO::Socket::INET>'s constructor
  method is not allowed.
  
  If unable to connect to the given HTTP server then the constructor
  returns C<undef> and $@ contains the reason.  After a successful
  connect, a C<Net:HTTP> object is returned.
  
  =item $s->host
  
  Get/set the default value of the C<Host> header to send.  The $host
  must not be set to an empty string (or C<undef>) for HTTP/1.1.
  
  =item $s->keep_alive
  
  Get/set the I<keep-alive> value.  If this value is TRUE then the
  request will be sent with headers indicating that the server should try
  to keep the connection open so that multiple requests can be sent.
  
  The actual headers set will depend on the value of the C<http_version>
  and C<peer_http_version> attributes.
  
  =item $s->send_te
  
  Get/set the a value indicating if the request will be sent with a "TE"
  header to indicate the transfer encodings that the server can choose to
  use.  The list of encodings announced as accepted by this client depends
  on availability of the following modules: C<Compress::Raw::Zlib> for
  I<deflate>, and C<IO::Compress::Gunzip> for I<gzip>.
  
  =item $s->http_version
  
  Get/set the HTTP version number that this client should announce.
  This value can only be set to "1.0" or "1.1".  The default is "1.1".
  
  =item $s->peer_http_version
  
  Get/set the protocol version number of our peer.  This value will
  initially be "1.0", but will be updated by a successful
  read_response_headers() method call.
  
  =item $s->max_line_length
  
  Get/set a limit on the length of response line and response header
  lines.  The default is 8192.  A value of 0 means no limit.
  
  =item $s->max_header_length
  
  Get/set a limit on the number of header lines that a response can
  have.  The default is 128.  A value of 0 means no limit.
  
  =item $s->format_request($method, $uri, %headers, [$content])
  
  Format a request message and return it as a string.  If the headers do
  not include a C<Host> header, then a header is inserted with the value
  of the C<host> attribute.  Headers like C<Connection> and
  C<Keep-Alive> might also be added depending on the status of the
  C<keep_alive> attribute.
  
  If $content is given (and it is non-empty), then a C<Content-Length>
  header is automatically added unless it was already present.
  
  =item $s->write_request($method, $uri, %headers, [$content])
  
  Format and send a request message.  Arguments are the same as for
  format_request().  Returns true if successful.
  
  =item $s->format_chunk( $data )
  
  Returns the string to be written for the given chunk of data.  
  
  =item $s->write_chunk($data)
  
  Will write a new chunk of request entity body data.  This method
  should only be used if the C<Transfer-Encoding> header with a value of
  C<chunked> was sent in the request.  Note, writing zero-length data is
  a no-op.  Use the write_chunk_eof() method to signal end of entity
  body data.
  
  Returns true if successful.
  
  =item $s->format_chunk_eof( %trailers )
  
  Returns the string to be written for signaling EOF when a
  C<Transfer-Encoding> of C<chunked> is used.
  
  =item $s->write_chunk_eof( %trailers )
  
  Will write eof marker for chunked data and optional trailers.  Note
  that trailers should not really be used unless is was signaled
  with a C<Trailer> header.
  
  Returns true if successful.
  
  =item ($code, $mess, %headers) = $s->read_response_headers( %opts )
  
  Read response headers from server and return it.  The $code is the 3
  digit HTTP status code (see L<HTTP::Status>) and $mess is the textual
  message that came with it.  Headers are then returned as key/value
  pairs.  Since key letter casing is not normalized and the same key can
  even occur multiple times, assigning these values directly to a hash
  is not wise.  Only the $code is returned if this method is called in
  scalar context.
  
  As a side effect this method updates the 'peer_http_version'
  attribute.
  
  Options might be passed in as key/value pairs.  There are currently
  only two options supported; C<laxed> and C<junk_out>.
  
  The C<laxed> option will make read_response_headers() more forgiving
  towards servers that have not learned how to speak HTTP properly.  The
  C<laxed> option is a boolean flag, and is enabled by passing in a TRUE
  value.  The C<junk_out> option can be used to capture bad header lines
  when C<laxed> is enabled.  The value should be an array reference.
  Bad header lines will be pushed onto the array.
  
  The C<laxed> option must be specified in order to communicate with
  pre-HTTP/1.0 servers that don't describe the response outcome or the
  data they send back with a header block.  For these servers
  peer_http_version is set to "0.9" and this method returns (200,
  "Assumed OK").
  
  The method will raise an exception (die) if the server does not speak
  proper HTTP or if the C<max_line_length> or C<max_header_length>
  limits are reached.  If the C<laxed> option is turned on and
  C<max_line_length> and C<max_header_length> checks are turned off,
  then no exception will be raised and this method will always
  return a response code.
  
  =item $n = $s->read_entity_body($buf, $size);
  
  Reads chunks of the entity body content.  Basically the same interface
  as for read() and sysread(), but the buffer offset argument is not
  supported yet.  This method should only be called after a successful
  read_response_headers() call.
  
  The return value will be C<undef> on read errors, 0 on EOF, -1 if no data
  could be returned this time, otherwise the number of bytes assigned
  to $buf.  The $buf is set to "" when the return value is -1.
  
  You normally want to retry this call if this function returns either
  -1 or C<undef> with C<$!> as EINTR or EAGAIN (see L<Errno>).  EINTR
  can happen if the application catches signals and EAGAIN can happen if
  you made the socket non-blocking.
  
  This method will raise exceptions (die) if the server does not speak
  proper HTTP.  This can only happen when reading chunked data.
  
  =item %headers = $s->get_trailers
  
  After read_entity_body() has returned 0 to indicate end of the entity
  body, you might call this method to pick up any trailers.
  
  =item $s->_rbuf
  
  Get/set the read buffer content.  The read_response_headers() and
  read_entity_body() methods use an internal buffer which they will look
  for data before they actually sysread more from the socket itself.  If
  they read too much, the remaining data will be left in this buffer.
  
  =item $s->_rbuf_length
  
  Returns the number of bytes in the read buffer.  This should always be
  the same as:
  
      length($s->_rbuf)
  
  but might be more efficient.
  
  =back
  
  =head1 SUBCLASSING
  
  The read_response_headers() and read_entity_body() will invoke the
  sysread() method when they need more data.  Subclasses might want to
  override this method to control how reading takes place.
  
  The object itself is a glob.  Subclasses should avoid using hash key
  names prefixed with C<http_> and C<io_>.
  
  =head1 SEE ALSO
  
  L<LWP>, L<IO::Socket::INET>, L<Net::HTTP::NB>
  
  =head1 AUTHOR
  
  Gisle Aas <gisle@activestate.com>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2001-2017 by Gisle Aas.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
  
  __END__
  
  # ABSTRACT: Low-level HTTP connection (client)
  
NET_HTTP

    $main::fatpacked{"Net/HTTP/Methods.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'NET_HTTP_METHODS';
  package Net::HTTP::Methods;
  our $VERSION = '6.19';
  use strict;
  use warnings;
  use URI;
  
  my $CRLF = "\015\012";   # "\r\n" is not portable
  
  *_bytes = defined(&utf8::downgrade) ?
      sub {
          unless (utf8::downgrade($_[0], 1)) {
              require Carp;
              Carp::croak("Wide character in HTTP request (bytes required)");
          }
          return $_[0];
      }
      :
      sub {
          return $_[0];
      };
  
  
  sub new {
      my $class = shift;
      unshift(@_, "Host") if @_ == 1;
      my %cnf = @_;
      require Symbol;
      my $self = bless Symbol::gensym(), $class;
      return $self->http_configure(\%cnf);
  }
  
  sub http_configure {
      my($self, $cnf) = @_;
  
      die "Listen option not allowed" if $cnf->{Listen};
      my $explicit_host = (exists $cnf->{Host});
      my $host = delete $cnf->{Host};
      my $peer = $cnf->{PeerAddr} || $cnf->{PeerHost};
      if (!$peer) {
  	die "No Host option provided" unless $host;
  	$cnf->{PeerAddr} = $peer = $host;
      }
  
      # CONNECTIONS
      # PREFER: port number from PeerAddr, then PeerPort, then http_default_port
      my $peer_uri = URI->new("http://$peer");
      $cnf->{"PeerPort"} =  $peer_uri->_port || $cnf->{PeerPort} ||  $self->http_default_port;
      $cnf->{"PeerAddr"} = $peer_uri->host;
  
      # HOST header:
      # If specified but blank, ignore.
      # If specified with a value, add the port number
      # If not specified, set to PeerAddr and port number
      # ALWAYS: If IPv6 address, use [brackets]  (thanks to the URI package)
      # ALWAYS: omit port number if http_default_port
      if (($host) || (! $explicit_host)) {
          my $uri =  ($explicit_host) ? URI->new("http://$host") : $peer_uri->clone;
          if (!$uri->_port) {
              # Always use *our*  $self->http_default_port  instead of URI's  (Covers HTTP, HTTPS)
              $uri->port( $cnf->{PeerPort} ||  $self->http_default_port);
          }
          my $host_port = $uri->host_port;               # Returns host:port or [ipv6]:port
          my $remove = ":" . $self->http_default_port;   # we want to remove the default port number
          if (substr($host_port,0-length($remove)) eq $remove) {
              substr($host_port,0-length($remove)) = "";
          }
          $host = $host_port;
      }
  
      $cnf->{Proto} = 'tcp';
  
      my $keep_alive = delete $cnf->{KeepAlive};
      my $http_version = delete $cnf->{HTTPVersion};
      $http_version = "1.1" unless defined $http_version;
      my $peer_http_version = delete $cnf->{PeerHTTPVersion};
      $peer_http_version = "1.0" unless defined $peer_http_version;
      my $send_te = delete $cnf->{SendTE};
      my $max_line_length = delete $cnf->{MaxLineLength};
      $max_line_length = 8*1024 unless defined $max_line_length;
      my $max_header_lines = delete $cnf->{MaxHeaderLines};
      $max_header_lines = 128 unless defined $max_header_lines;
  
      return undef unless $self->http_connect($cnf);
  
      $self->host($host);
      $self->keep_alive($keep_alive);
      $self->send_te($send_te);
      $self->http_version($http_version);
      $self->peer_http_version($peer_http_version);
      $self->max_line_length($max_line_length);
      $self->max_header_lines($max_header_lines);
  
      ${*$self}{'http_buf'} = "";
  
      return $self;
  }
  
  sub http_default_port {
      80;
  }
  
  # set up property accessors
  for my $method (qw(host keep_alive send_te max_line_length max_header_lines peer_http_version)) {
      my $prop_name = "http_" . $method;
      no strict 'refs';
      *$method = sub {
  	my $self = shift;
  	my $old = ${*$self}{$prop_name};
  	${*$self}{$prop_name} = shift if @_;
  	return $old;
      };
  }
  
  # we want this one to be a bit smarter
  sub http_version {
      my $self = shift;
      my $old = ${*$self}{'http_version'};
      if (@_) {
  	my $v = shift;
  	$v = "1.0" if $v eq "1";  # float
  	unless ($v eq "1.0" or $v eq "1.1") {
  	    require Carp;
  	    Carp::croak("Unsupported HTTP version '$v'");
  	}
  	${*$self}{'http_version'} = $v;
      }
      $old;
  }
  
  sub format_request {
      my $self = shift;
      my $method = shift;
      my $uri = shift;
  
      my $content = (@_ % 2) ? pop : "";
  
      for ($method, $uri) {
  	require Carp;
  	Carp::croak("Bad method or uri") if /\s/ || !length;
      }
  
      push(@{${*$self}{'http_request_method'}}, $method);
      my $ver = ${*$self}{'http_version'};
      my $peer_ver = ${*$self}{'http_peer_http_version'} || "1.0";
  
      my @h;
      my @connection;
      my %given = (host => 0, "content-length" => 0, "te" => 0);
      while (@_) {
  	my($k, $v) = splice(@_, 0, 2);
  	my $lc_k = lc($k);
  	if ($lc_k eq "connection") {
  	    $v =~ s/^\s+//;
  	    $v =~ s/\s+$//;
  	    push(@connection, split(/\s*,\s*/, $v));
  	    next;
  	}
  	if (exists $given{$lc_k}) {
  	    $given{$lc_k}++;
  	}
  	push(@h, "$k: $v");
      }
  
      if (length($content) && !$given{'content-length'}) {
  	push(@h, "Content-Length: " . length($content));
      }
  
      my @h2;
      if ($given{te}) {
  	push(@connection, "TE") unless grep lc($_) eq "te", @connection;
      }
      elsif ($self->send_te && gunzip_ok()) {
  	# gzip is less wanted since the IO::Uncompress::Gunzip interface for
  	# it does not really allow chunked decoding to take place easily.
  	push(@h2, "TE: deflate,gzip;q=0.3");
  	push(@connection, "TE");
      }
  
      unless (grep lc($_) eq "close", @connection) {
  	if ($self->keep_alive) {
  	    if ($peer_ver eq "1.0") {
  		# from looking at Netscape's headers
  		push(@h2, "Keep-Alive: 300");
  		unshift(@connection, "Keep-Alive");
  	    }
  	}
  	else {
  	    push(@connection, "close") if $ver ge "1.1";
  	}
      }
      push(@h2, "Connection: " . join(", ", @connection)) if @connection;
      unless ($given{host}) {
  	my $h = ${*$self}{'http_host'};
  	push(@h2, "Host: $h") if $h;
      }
  
      return _bytes(join($CRLF, "$method $uri HTTP/$ver", @h2, @h, "", $content));
  }
  
  
  sub write_request {
      my $self = shift;
      $self->print($self->format_request(@_));
  }
  
  sub format_chunk {
      my $self = shift;
      return $_[0] unless defined($_[0]) && length($_[0]);
      return _bytes(sprintf("%x", length($_[0])) . $CRLF . $_[0] . $CRLF);
  }
  
  sub write_chunk {
      my $self = shift;
      return 1 unless defined($_[0]) && length($_[0]);
      $self->print(_bytes(sprintf("%x", length($_[0])) . $CRLF . $_[0] . $CRLF));
  }
  
  sub format_chunk_eof {
      my $self = shift;
      my @h;
      while (@_) {
  	push(@h, sprintf "%s: %s$CRLF", splice(@_, 0, 2));
      }
      return _bytes(join("", "0$CRLF", @h, $CRLF));
  }
  
  sub write_chunk_eof {
      my $self = shift;
      $self->print($self->format_chunk_eof(@_));
  }
  
  
  sub my_read {
      die if @_ > 3;
      my $self = shift;
      my $len = $_[1];
      for (${*$self}{'http_buf'}) {
  	if (length) {
  	    $_[0] = substr($_, 0, $len, "");
  	    return length($_[0]);
  	}
  	else {
  	    die "read timeout" unless $self->can_read;
  	    return $self->sysread($_[0], $len);
  	}
      }
  }
  
  
  sub my_readline {
      my $self = shift;
      my $what = shift;
      for (${*$self}{'http_buf'}) {
  	my $max_line_length = ${*$self}{'http_max_line_length'};
  	my $pos;
  	while (1) {
  	    # find line ending
  	    $pos = index($_, "\012");
  	    last if $pos >= 0;
  	    die "$what line too long (limit is $max_line_length)"
  		if $max_line_length && length($_) > $max_line_length;
  
  	    # need to read more data to find a line ending
              my $new_bytes = 0;
  
            READ:
              {   # wait until bytes start arriving
                  $self->can_read
                       or die "read timeout";
  
                  # consume all incoming bytes
                  my $bytes_read = $self->sysread($_, 1024, length);
                  if(defined $bytes_read) {
                      $new_bytes += $bytes_read;
                  }
                  elsif($!{EINTR} || $!{EAGAIN} || $!{EWOULDBLOCK}) {
                      redo READ;
                  }
                  else {
                      # if we have already accumulated some data let's at
                      # least return that as a line
                      length or die "$what read failed: $!";
                  }
  
                  # no line-ending, no new bytes
                  return length($_) ? substr($_, 0, length($_), "") : undef
                      if $new_bytes==0;
              }
  	}
  	die "$what line too long ($pos; limit is $max_line_length)"
  	    if $max_line_length && $pos > $max_line_length;
  
  	my $line = substr($_, 0, $pos+1, "");
  	$line =~ s/(\015?\012)\z// || die "Assert";
  	return wantarray ? ($line, $1) : $line;
      }
  }
  
  
  sub can_read {
      my $self = shift;
      return 1 unless defined(fileno($self));
      return 1 if $self->isa('IO::Socket::SSL') && $self->pending;
      return 1 if $self->isa('Net::SSL') && $self->can('pending') && $self->pending;
  
      # With no timeout, wait forever.  An explicit timeout of 0 can be
      # used to just check if the socket is readable without waiting.
      my $timeout = @_ ? shift : (${*$self}{io_socket_timeout} || undef);
  
      my $fbits = '';
      vec($fbits, fileno($self), 1) = 1;
    SELECT:
      {
          my $before;
          $before = time if $timeout;
          my $nfound = select($fbits, undef, undef, $timeout);
          if ($nfound < 0) {
              if ($!{EINTR} || $!{EAGAIN} || $!{EWOULDBLOCK}) {
                  # don't really think EAGAIN/EWOULDBLOCK can happen here
                  if ($timeout) {
                      $timeout -= time - $before;
                      $timeout = 0 if $timeout < 0;
                  }
                  redo SELECT;
              }
              die "select failed: $!";
          }
          return $nfound > 0;
      }
  }
  
  
  sub _rbuf {
      my $self = shift;
      if (@_) {
  	for (${*$self}{'http_buf'}) {
  	    my $old;
  	    $old = $_ if defined wantarray;
  	    $_ = shift;
  	    return $old;
  	}
      }
      else {
  	return ${*$self}{'http_buf'};
      }
  }
  
  sub _rbuf_length {
      my $self = shift;
      return length ${*$self}{'http_buf'};
  }
  
  
  sub _read_header_lines {
      my $self = shift;
      my $junk_out = shift;
  
      my @headers;
      my $line_count = 0;
      my $max_header_lines = ${*$self}{'http_max_header_lines'};
      while (my $line = my_readline($self, 'Header')) {
  	if ($line =~ /^(\S+?)\s*:\s*(.*)/s) {
  	    push(@headers, $1, $2);
  	}
  	elsif (@headers && $line =~ s/^\s+//) {
  	    $headers[-1] .= " " . $line;
  	}
  	elsif ($junk_out) {
  	    push(@$junk_out, $line);
  	}
  	else {
  	    die "Bad header: '$line'\n";
  	}
  	if ($max_header_lines) {
  	    $line_count++;
  	    if ($line_count >= $max_header_lines) {
  		die "Too many header lines (limit is $max_header_lines)";
  	    }
  	}
      }
      return @headers;
  }
  
  
  sub read_response_headers {
      my($self, %opt) = @_;
      my $laxed = $opt{laxed};
  
      my($status, $eol) = my_readline($self, 'Status');
      unless (defined $status) {
  	die "Server closed connection without sending any data back";
      }
  
      my($peer_ver, $code, $message) = split(/\s+/, $status, 3);
      if (!$peer_ver || $peer_ver !~ s,^HTTP/,, || $code !~ /^[1-5]\d\d$/) {
  	die "Bad response status line: '$status'" unless $laxed;
  	# assume HTTP/0.9
  	${*$self}{'http_peer_http_version'} = "0.9";
  	${*$self}{'http_status'} = "200";
  	substr(${*$self}{'http_buf'}, 0, 0) = $status . ($eol || "");
  	return 200 unless wantarray;
  	return (200, "Assumed OK");
      };
  
      ${*$self}{'http_peer_http_version'} = $peer_ver;
      ${*$self}{'http_status'} = $code;
  
      my $junk_out;
      if ($laxed) {
  	$junk_out = $opt{junk_out} || [];
      }
      my @headers = $self->_read_header_lines($junk_out);
  
      # pick out headers that read_entity_body might need
      my @te;
      my $content_length;
      for (my $i = 0; $i < @headers; $i += 2) {
  	my $h = lc($headers[$i]);
  	if ($h eq 'transfer-encoding') {
  	    my $te = $headers[$i+1];
  	    $te =~ s/^\s+//;
  	    $te =~ s/\s+$//;
  	    push(@te, $te) if length($te);
  	}
  	elsif ($h eq 'content-length') {
  	    # ignore bogus and overflow values
  	    if ($headers[$i+1] =~ /^\s*(\d{1,15})(?:\s|$)/) {
  		$content_length = $1;
  	    }
  	}
      }
      ${*$self}{'http_te'} = join(",", @te);
      ${*$self}{'http_content_length'} = $content_length;
      ${*$self}{'http_first_body'}++;
      delete ${*$self}{'http_trailers'};
      return $code unless wantarray;
      return ($code, $message, @headers);
  }
  
  
  sub read_entity_body {
      my $self = shift;
      my $buf_ref = \$_[0];
      my $size = $_[1];
      die "Offset not supported yet" if $_[2];
  
      my $chunked;
      my $bytes;
  
      if (${*$self}{'http_first_body'}) {
  	${*$self}{'http_first_body'} = 0;
  	delete ${*$self}{'http_chunked'};
  	delete ${*$self}{'http_bytes'};
  	my $method = shift(@{${*$self}{'http_request_method'}});
  	my $status = ${*$self}{'http_status'};
  	if ($method eq "HEAD") {
  	    # this response is always empty regardless of other headers
  	    $bytes = 0;
  	}
  	elsif (my $te = ${*$self}{'http_te'}) {
  	    my @te = split(/\s*,\s*/, lc($te));
  	    die "Chunked must be last Transfer-Encoding '$te'"
  		unless pop(@te) eq "chunked";
  	    pop(@te) while @te && $te[-1] eq "chunked";  # ignore repeated chunked spec
  
  	    for (@te) {
  		if ($_ eq "deflate" && inflate_ok()) {
  		    #require Compress::Raw::Zlib;
  		    my ($i, $status) = Compress::Raw::Zlib::Inflate->new();
  		    die "Can't make inflator: $status" unless $i;
  		    $_ = sub { my $out; $i->inflate($_[0], \$out); $out }
  		}
  		elsif ($_ eq "gzip" && gunzip_ok()) {
  		    #require IO::Uncompress::Gunzip;
  		    my @buf;
  		    $_ = sub {
  			push(@buf, $_[0]);
  			return "" unless $_[1];
  			my $input = join("", @buf);
  			my $output;
  			IO::Uncompress::Gunzip::gunzip(\$input, \$output, Transparent => 0)
  			    or die "Can't gunzip content: $IO::Uncompress::Gunzip::GunzipError";
  			return \$output;
  		    };
  		}
  		elsif ($_ eq "identity") {
  		    $_ = sub { $_[0] };
  		}
  		else {
  		    die "Can't handle transfer encoding '$te'";
  		}
  	    }
  
  	    @te = reverse(@te);
  
  	    ${*$self}{'http_te2'} = @te ? \@te : "";
  	    $chunked = -1;
  	}
  	elsif (defined(my $content_length = ${*$self}{'http_content_length'})) {
  	    $bytes = $content_length;
  	}
          elsif ($status =~ /^(?:1|[23]04)/) {
              # RFC 2616 says that these responses should always be empty
              # but that does not appear to be true in practice [RT#17907]
              $bytes = 0;
          }
  	else {
  	    # XXX Multi-Part types are self delimiting, but RFC 2616 says we
  	    # only has to deal with 'multipart/byteranges'
  
  	    # Read until EOF
  	}
      }
      else {
  	$chunked = ${*$self}{'http_chunked'};
  	$bytes   = ${*$self}{'http_bytes'};
      }
  
      if (defined $chunked) {
  	# The state encoded in $chunked is:
  	#   $chunked == 0:   read CRLF after chunk, then chunk header
          #   $chunked == -1:  read chunk header
  	#   $chunked > 0:    bytes left in current chunk to read
  
  	if ($chunked <= 0) {
  	    my $line = my_readline($self, 'Entity body');
  	    if ($chunked == 0) {
  		die "Missing newline after chunk data: '$line'"
  		    if !defined($line) || $line ne "";
  		$line = my_readline($self, 'Entity body');
  	    }
  	    die "EOF when chunk header expected" unless defined($line);
  	    my $chunk_len = $line;
  	    $chunk_len =~ s/;.*//;  # ignore potential chunk parameters
  	    unless ($chunk_len =~ /^([\da-fA-F]+)\s*$/) {
  		die "Bad chunk-size in HTTP response: $line";
  	    }
  	    $chunked = hex($1);
  	    ${*$self}{'http_chunked'} = $chunked;
  	    if ($chunked == 0) {
  		${*$self}{'http_trailers'} = [$self->_read_header_lines];
  		$$buf_ref = "";
  
  		my $n = 0;
  		if (my $transforms = delete ${*$self}{'http_te2'}) {
  		    for (@$transforms) {
  			$$buf_ref = &$_($$buf_ref, 1);
  		    }
  		    $n = length($$buf_ref);
  		}
  
  		# in case somebody tries to read more, make sure we continue
  		# to return EOF
  		delete ${*$self}{'http_chunked'};
  		${*$self}{'http_bytes'} = 0;
  
  		return $n;
  	    }
  	}
  
  	my $n = $chunked;
  	$n = $size if $size && $size < $n;
  	$n = my_read($self, $$buf_ref, $n);
  	return undef unless defined $n;
  
  	${*$self}{'http_chunked'} = $chunked - $n;
  
  	if ($n > 0) {
  	    if (my $transforms = ${*$self}{'http_te2'}) {
  		for (@$transforms) {
  		    $$buf_ref = &$_($$buf_ref, 0);
  		}
  		$n = length($$buf_ref);
  		$n = -1 if $n == 0;
  	    }
  	}
  	return $n;
      }
      elsif (defined $bytes) {
  	unless ($bytes) {
  	    $$buf_ref = "";
  	    return 0;
  	}
  	my $n = $bytes;
  	$n = $size if $size && $size < $n;
  	$n = my_read($self, $$buf_ref, $n);
  	${*$self}{'http_bytes'} = defined $n ? $bytes - $n : $bytes;
  	return $n;
      }
      else {
  	# read until eof
  	$size ||= 8*1024;
  	return my_read($self, $$buf_ref, $size);
      }
  }
  
  sub get_trailers {
      my $self = shift;
      @{${*$self}{'http_trailers'} || []};
  }
  
  BEGIN {
  my $gunzip_ok;
  my $inflate_ok;
  
  sub gunzip_ok {
      return $gunzip_ok if defined $gunzip_ok;
  
      # Try to load IO::Uncompress::Gunzip.
      local $@;
      local $SIG{__DIE__};
      $gunzip_ok = 0;
  
      eval {
  	require IO::Uncompress::Gunzip;
  	$gunzip_ok++;
      };
  
      return $gunzip_ok;
  }
  
  sub inflate_ok {
      return $inflate_ok if defined $inflate_ok;
  
      # Try to load Compress::Raw::Zlib.
      local $@;
      local $SIG{__DIE__};
      $inflate_ok = 0;
  
      eval {
  	require Compress::Raw::Zlib;
  	$inflate_ok++;
      };
  
      return $inflate_ok;
  }
  
  } # BEGIN
  
  1;
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Net::HTTP::Methods - Methods shared by Net::HTTP and Net::HTTPS
  
  =head1 VERSION
  
  version 6.19
  
  =head1 AUTHOR
  
  Gisle Aas <gisle@activestate.com>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2001-2017 by Gisle Aas.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
  
  __END__
  
  # ABSTRACT: Methods shared by Net::HTTP and Net::HTTPS
NET_HTTP_METHODS

    $main::fatpacked{"Net/HTTP/NB.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'NET_HTTP_NB';
  package Net::HTTP::NB;
  our $VERSION = '6.19';
  use strict;
  use warnings;
  
  use base 'Net::HTTP';
  
  sub can_read {
      return 1;
  }
  
  sub sysread {
      my $self = $_[0];
      if (${*$self}{'httpnb_read_count'}++) {
  	${*$self}{'http_buf'} = ${*$self}{'httpnb_save'};
  	die "Multi-read\n";
      }
      my $buf;
      my $offset = $_[3] || 0;
      my $n = sysread($self, $_[1], $_[2], $offset);
      ${*$self}{'httpnb_save'} .= substr($_[1], $offset);
      return $n;
  }
  
  sub read_response_headers {
      my $self = shift;
      ${*$self}{'httpnb_read_count'} = 0;
      ${*$self}{'httpnb_save'} = ${*$self}{'http_buf'};
      my @h = eval { $self->SUPER::read_response_headers(@_) };
      if ($@) {
  	return if $@ eq "Multi-read\n";
  	die;
      }
      return @h;
  }
  
  sub read_entity_body {
      my $self = shift;
      ${*$self}{'httpnb_read_count'} = 0;
      ${*$self}{'httpnb_save'} = ${*$self}{'http_buf'};
      # XXX I'm not so sure this does the correct thing in case of
      # transfer-encoding transforms
      my $n = eval { $self->SUPER::read_entity_body(@_); };
      if ($@) {
  	$_[0] = "";
  	return -1;
      }
      return $n;
  }
  
  1;
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Net::HTTP::NB - Non-blocking HTTP client
  
  =head1 VERSION
  
  version 6.19
  
  =head1 SYNOPSIS
  
   use Net::HTTP::NB;
   my $s = Net::HTTP::NB->new(Host => "www.perl.com") || die $@;
   $s->write_request(GET => "/");
  
   use IO::Select;
   my $sel = IO::Select->new($s);
  
   READ_HEADER: {
      die "Header timeout" unless $sel->can_read(10);
      my($code, $mess, %h) = $s->read_response_headers;
      redo READ_HEADER unless $code;
   }
  
   while (1) {
      die "Body timeout" unless $sel->can_read(10);
      my $buf;
      my $n = $s->read_entity_body($buf, 1024);
      last unless $n;
      print $buf;
   }
  
  =head1 DESCRIPTION
  
  Same interface as C<Net::HTTP> but it will never try multiple reads
  when the read_response_headers() or read_entity_body() methods are
  invoked.  This make it possible to multiplex multiple Net::HTTP::NB
  using select without risk blocking.
  
  If read_response_headers() did not see enough data to complete the
  headers an empty list is returned.
  
  If read_entity_body() did not see new entity data in its read
  the value -1 is returned.
  
  =head1 SEE ALSO
  
  L<Net::HTTP>
  
  =head1 AUTHOR
  
  Gisle Aas <gisle@activestate.com>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2001-2017 by Gisle Aas.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
  
  __END__
  
  #ABSTRACT: Non-blocking HTTP client
  
NET_HTTP_NB

    $main::fatpacked{"Net/HTTPS.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'NET_HTTPS';
  package Net::HTTPS;
  our $VERSION = '6.19';
  use strict;
  use warnings;
  
  # Figure out which SSL implementation to use
  use vars qw($SSL_SOCKET_CLASS);
  if ($SSL_SOCKET_CLASS) {
      # somebody already set it
  }
  elsif ($SSL_SOCKET_CLASS = $ENV{PERL_NET_HTTPS_SSL_SOCKET_CLASS}) {
      unless ($SSL_SOCKET_CLASS =~ /^(IO::Socket::SSL|Net::SSL)\z/) {
  	die "Bad socket class [$SSL_SOCKET_CLASS]";
      }
      eval "require $SSL_SOCKET_CLASS";
      die $@ if $@;
  }
  elsif ($IO::Socket::SSL::VERSION) {
      $SSL_SOCKET_CLASS = "IO::Socket::SSL"; # it was already loaded
  }
  elsif ($Net::SSL::VERSION) {
      $SSL_SOCKET_CLASS = "Net::SSL";
  }
  else {
      eval { require IO::Socket::SSL; };
      if ($@) {
  	my $old_errsv = $@;
  	eval {
  	    require Net::SSL;  # from Crypt-SSLeay
  	};
  	if ($@) {
  	    $old_errsv =~ s/\s\(\@INC contains:.*\)/)/g;
  	    die $old_errsv . $@;
  	}
  	$SSL_SOCKET_CLASS = "Net::SSL";
      }
      else {
  	$SSL_SOCKET_CLASS = "IO::Socket::SSL";
      }
  }
  
  require Net::HTTP::Methods;
  
  our @ISA=($SSL_SOCKET_CLASS, 'Net::HTTP::Methods');
  
  sub configure {
      my($self, $cnf) = @_;
      $self->http_configure($cnf);
  }
  
  sub http_connect {
      my($self, $cnf) = @_;
      if ($self->isa("Net::SSL")) {
  	if ($cnf->{SSL_verify_mode}) {
  	    if (my $f = $cnf->{SSL_ca_file}) {
  		$ENV{HTTPS_CA_FILE} = $f;
  	    }
  	    if (my $f = $cnf->{SSL_ca_path}) {
  		$ENV{HTTPS_CA_DIR} = $f;
  	    }
  	}
  	if ($cnf->{SSL_verifycn_scheme}) {
  	    $@ = "Net::SSL from Crypt-SSLeay can't verify hostnames; either install IO::Socket::SSL or turn off verification by setting the PERL_LWP_SSL_VERIFY_HOSTNAME environment variable to 0";
  	    return undef;
  	}
      }
      $self->SUPER::configure($cnf);
  }
  
  sub http_default_port {
      443;
  }
  
  if ($SSL_SOCKET_CLASS eq "Net::SSL") {
      # The underlying SSLeay classes fails to work if the socket is
      # placed in non-blocking mode.  This override of the blocking
      # method makes sure it stays the way it was created.
      *blocking = sub { };
  }
  
  1;
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Net::HTTPS - Low-level HTTP over SSL/TLS connection (client)
  
  =head1 VERSION
  
  version 6.19
  
  =head1 DESCRIPTION
  
  The C<Net::HTTPS> is a low-level HTTP over SSL/TLS client.  The interface is the same
  as the interface for C<Net::HTTP>, but the constructor takes additional parameters
  as accepted by L<IO::Socket::SSL>.  The C<Net::HTTPS> object is an C<IO::Socket::SSL>
  too, which makes it inherit additional methods from that base class.
  
  For historical reasons this module also supports using C<Net::SSL> (from the
  Crypt-SSLeay distribution) as its SSL driver and base class.  This base is
  automatically selected if available and C<IO::Socket::SSL> isn't.  You might
  also force which implementation to use by setting $Net::HTTPS::SSL_SOCKET_CLASS
  before loading this module.  If not set this variable is initialized from the
  C<PERL_NET_HTTPS_SSL_SOCKET_CLASS> environment variable.
  
  =head1 ENVIRONMENT
  
  You might set the C<PERL_NET_HTTPS_SSL_SOCKET_CLASS> environment variable to the name
  of the base SSL implementation (and Net::HTTPS base class) to use.  The default
  is C<IO::Socket::SSL>.  Currently the only other supported value is C<Net::SSL>.
  
  =head1 SEE ALSO
  
  L<Net::HTTP>, L<IO::Socket::SSL>
  
  =head1 AUTHOR
  
  Gisle Aas <gisle@activestate.com>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2001-2017 by Gisle Aas.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
  
  __END__
  
  #ABSTRACT: Low-level HTTP over SSL/TLS connection (client)
  
NET_HTTPS

    $main::fatpacked{"Nodejs/Util.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'NODEJS_UTIL';
  package Nodejs::Util;
  
  our $DATE = '2018-03-21'; # DATE
  our $VERSION = '0.012'; # VERSION
  
  use 5.010001;
  use strict 'subs', 'vars';
  use warnings;
  
  use Exporter qw(import);
  our @EXPORT_OK = qw(
                         get_nodejs_path
                         nodejs_path
                         nodejs_available
                         system_nodejs
                         nodejs_module_path
                 );
  
  our %SPEC;
  
  my %arg_all = (
      all => {
          schema => 'bool',
          summary => 'Find all node.js instead of the first found',
          description => <<'_',
  
  If this option is set to true, will return an array of paths intead of path.
  
  _
      },
  );
  
  $SPEC{nodejs_path} = {
      v => 1.1,
      summary => 'Check the availability of Node.js executable in PATH',
      description => <<'_',
  
  Return the path to executable or undef if none is available. Node.js is usually
  installed as 'node' or 'nodejs'.
  
  _
      args => {
          %arg_all,
      },
      result_naked => 1,
  };
  sub nodejs_path {
      require File::Which;
      require IPC::System::Options;
  
      my %args = @_;
  
      my @paths;
      for my $name (qw/nodejs node/) {
          my $path = File::Which::which($name);
          next unless $path;
  
          # check if it's really nodejs
          my $out = IPC::System::Options::readpipe(
              $path, '-e', 'console.log(1+1)');
          if ($out =~ /\A2\n?\z/) {
              return $path unless $args{all};
              push @paths, $path;
          } else {
              #say "D:Output of $cmd: $out";
          }
      }
      return undef unless @paths;
      \@paths;
  }
  
  *get_nodejs_path = \&nodejs_path;
  
  $SPEC{nodejs_available} = {
      v => 1.1,
      summary => 'Check the availability of Node.js',
      description => <<'_',
  
  This is a more advanced alternative to `nodejs_path()`. Will check for `node` or
  `nodejs` in the PATH, like `nodejs_path()`. But you can also specify minimum
  version (and other options in the future). And it will return more details.
  
  Will return status 200 if everything is okay. Actual result will return the path
  to executable, and result metadata will contain extra result like detected
  version in `func.version`.
  
  Will return satus 412 if something is wrong. The return message will tell the
  reason.
  
  _
      args => {
          min_version => {
              schema => 'str*',
          },
          path => {
              summary => 'Search this instead of PATH environment variable',
              schema => ['str*'],
          },
          %arg_all,
      },
  };
  sub nodejs_available {
      require IPC::System::Options;
  
      my %args = @_;
      my $all = $args{all};
  
      my $paths = do {
          local $ENV{PATH} = $args{path} if defined $args{path};
          nodejs_path(all => 1);
      };
      defined $paths or return [412, "node.js not detected in PATH"];
  
      my $res = [200, "OK"];
      my @filtered_paths;
      my @versions;
      my @errors;
  
      for my $path (@$paths) {
          my $v;
          if ($args{min_version}) {
              my $out = IPC::System::Options::readpipe(
                  $path, '-v');
              $out =~ /^(v\d+\.\d+\.\d+)$/ or do {
                  push @errors, "Can't recognize output of $path -v: $out";
                  next;
              };
              # node happens to use semantic versioning, which we can parse using
              # version.pm
              $v = version->parse($1);
              $v >= version->parse($args{min_version}) or do {
                  push @errors, "Version of $path less than $args{min_version}";
                  next;
              };
          }
          push @filtered_paths, $path;
          push @versions, defined($v) ? "$v" : undef;
      }
  
      $res->[2]                 = $all ? \@filtered_paths : $filtered_paths[0];
      $res->[3]{'func.path'}    = $all ? \@filtered_paths : $filtered_paths[0];
      $res->[3]{'func.version'} = $all ? \@versions       : $versions[0];
      $res->[3]{'func.errors'}  = \@errors;
  
      unless (@filtered_paths) {
          $res->[0] = 412;
          $res->[1] = @errors == 1 ? $errors[0] :
              "No eligible node.js found in PATH";
      }
  
      $res;
  }
  
  sub system_nodejs {
      require IPC::System::Options;
      my $opts = ref($_[0]) eq 'HASH' ? shift : {};
  
      my $harmony_scoping = delete $opts->{harmony_scoping};
      my $path = delete $opts->{path};
  
      my %detect_nodejs_args;
      if ($harmony_scoping) {
          $detect_nodejs_args{min_version} = '0.5.10';
      }
      if ($path) {
          $detect_nodejs_args{path} = $path;
      }
      my $detect_res = nodejs_available(%detect_nodejs_args);
      die "No eligible node.js binary available: ".
          "$detect_res->[0] - $detect_res->[1]" unless $detect_res->[0] == 200;
  
      my @extra_args;
      if ($harmony_scoping) {
          my $node_v = $detect_res->[3]{'func.version'};
          if (version->parse($node_v) < version->parse("2.0.0")) {
              push @extra_args, "--use_strict", "--harmony_scoping";
          } else {
              push @extra_args, "--use_strict";
          }
      }
  
      IPC::System::Options::system(
          $opts,
          $detect_res->[2],
          @extra_args,
          @_,
      );
  }
  
  sub nodejs_module_path {
      my $opts = ref $_[0] eq 'HASH' ? shift : {};
      my $module = shift;
  
      my ($dir, $name, $ext) = $module =~ m!\A(?:(.*)/)?(.+?)(\.\w+)?\z!;
      #use DD; dd {dir=>$dir, name=>$name, ext=>$ext};
  
      my  @dirs;
      if (defined $dir) {
          @dirs = ($dir);
      } else {
          my $cwd = do {
              if (defined $opts->{cwd}) {
                  $opts->{cwd};
              } else {
                  require Cwd;
                  Cwd::getcwd();
              }
          };
          $cwd =~ s!/node_modules\z!!;
          while (1) {
              push @dirs, "$cwd/node_modules";
              $cwd =~ s!(.*)/.+!$1!
                  or last;
          }
      }
  
      if (defined $ENV{NODE_PATH}) {
          my $sep = $^O =~ /win32/i ? qr/;/ : qr/:/;
          push @dirs, split($sep, $ENV{NODE_PATH});
      }
  
      if (defined $ENV{HOME}) {
          push @dirs, "$ENV{HOME}/.node_modules";
          push @dirs, "$ENV{HOME}/.node_libraries";
      }
  
      if (defined $ENV{PREFIX}) {
          push @dirs, "$ENV{PREFIX}/lib/node";
      }
  
      #use DD; dd \@dirs;
  
      my @res;
      for my $d (@dirs) {
          next unless -d $d;
          if (defined $ext) {
              my $p = "$d/$name$ext";
              if (-f $p) {
                  push @res, $p;
                  last unless $opts->{all};
              }
          } else {
              my $p;
              for my $e (".js", ".json", ".node") {
                  $p = "$d/$name$e";
                  if (-f $p) {
                      push @res, $p;
                      last unless $opts->{all};
                  }
              }
              $p = "$d/$name";
              if (-d $p) {
                  if (-f "$p/index.js") {
                      push @res, "$p/index.js";
                      last unless $opts->{all};
                  } elsif (-f "$p/package.json") {
                      push @res, "$p/package.json";
                      last unless $opts->{all};
                  }
              }
          }
      }
  
      if ($opts->{all}) {
          return \@res;
      } else {
          return $res[0];
      }
  }
  
  1;
  # ABSTRACT: Utilities related to Node.js
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Nodejs::Util - Utilities related to Node.js
  
  =head1 VERSION
  
  This document describes version 0.012 of Nodejs::Util (from Perl distribution Nodejs-Util), released on 2018-03-21.
  
  =for Pod::Coverage ^(get_nodejs_path)$
  
  =head1 FUNCTIONS
  
  
  =head2 nodejs_available
  
  Usage:
  
   nodejs_available(%args) -> [status, msg, result, meta]
  
  Check the availability of Node.js.
  
  This is a more advanced alternative to C<nodejs_path()>. Will check for C<node> or
  C<nodejs> in the PATH, like C<nodejs_path()>. But you can also specify minimum
  version (and other options in the future). And it will return more details.
  
  Will return status 200 if everything is okay. Actual result will return the path
  to executable, and result metadata will contain extra result like detected
  version in C<func.version>.
  
  Will return satus 412 if something is wrong. The return message will tell the
  reason.
  
  This function is not exported by default, but exportable.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<all> => I<bool>
  
  Find all node.js instead of the first found.
  
  If this option is set to true, will return an array of paths intead of path.
  
  =item * B<min_version> => I<str>
  
  =item * B<path> => I<str>
  
  Search this instead of PATH environment variable.
  
  =back
  
  Returns an enveloped result (an array).
  
  First element (status) is an integer containing HTTP status code
  (200 means OK, 4xx caller error, 5xx function error). Second element
  (msg) is a string containing error message, or 'OK' if status is
  200. Third element (result) is optional, the actual result. Fourth
  element (meta) is called result metadata and is optional, a hash
  that contains extra information.
  
  Return value:  (any)
  
  
  =head2 nodejs_path
  
  Usage:
  
   nodejs_path(%args) -> any
  
  Check the availability of Node.js executable in PATH.
  
  Return the path to executable or undef if none is available. Node.js is usually
  installed as 'node' or 'nodejs'.
  
  This function is not exported by default, but exportable.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<all> => I<bool>
  
  Find all node.js instead of the first found.
  
  If this option is set to true, will return an array of paths intead of path.
  
  =back
  
  Return value:  (any)
  
  =head2 system_nodejs
  
  Usage:
  
   system_nodejs([ \%opts ], @argv)
  
  Will call L<IPC::System::Options>'s system(), but with node.js binary as the
  first argument. Known options:
  
  =over
  
  =item * harmony_scoping => bool
  
  If set to 1, will attempt to enable block scoping. This means at least node.js
  v0.5.10 (where C<--harmony_scoping> is first recognized). But
  C<--harmony_scoping> is no longer needed after v2.0.0 and no longer recognized
  in later versions.
  
  =item * path => str
  
  Will be passed to C<nodejs_available()>.
  
  =back
  
  Other options will be passed to C<IPC::System::Options>'s C<system()>.
  
  =head2 nodejs_module_path
  
  Usage:
  
   nodejs_module_path([ \%opts, ] $module) => str|array
  
  Search module in filesystem according to Node.js rule described in
  L<https://nodejs.org/api/modules.html>. C<$module> can be either a
  relative/absolute path (e.g. C<./bip39.js>, C<../bip39.js>, or
  C</home/foo/bip39.js>), a filename (e.g. C<bip39.js>), or a filename with the
  C<.js> removed (e.g. C<bip39>).
  
  Will return undef if no module is found, or string containing the found path.
  
  Known options:
  
  =over
  
  =item * parse_package_json => bool (default: 0)
  
  Not yet implemented.
  
  =item * cwd => str
  
  Use this directory instead of using C<Cwd::get_cwd()>.
  
  =item * all => bool
  
  If set to true, will return an array of all found paths instead of string
  containing the first found path.
  
  =back
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Nodejs-Util>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Nodejs-Util>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Nodejs-Util>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2018, 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
NODEJS_UTIL

    $main::fatpacked{"Number/Format/BigFloat.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'NUMBER_FORMAT_BIGFLOAT';
  package Number::Format::BigFloat;
  
  our $DATE = '2017-12-09'; # DATE
  our $VERSION = '0.001'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  use Math::BigFloat;
  
  use Exporter qw(import);
  our @EXPORT_OK = qw(
                         format_number
                 );
  
  sub format_number {
      my ($num, $opts) = @_;
      $opts //= {};
  
      $opts->{thousands_sep}  //= ',';
      $opts->{decimal_point}  //= '.';
      $opts->{decimal_digits} //= 2;
  
      my $str = Math::BigFloat->new($num)->round(0, -$opts->{decimal_digits});
      my ($sign, $int, $decpoint, $frac) =
          $str =~ /\A(-?)([0-9]+)(\.?)([0-9]*)\z/
          or return $num;
  
      $int =~ s/(?<=[0-9])(?=([0-9]{3})+(?![0-9]))/$opts->{thousands_sep}/g
          if length $opts->{thousands_sep};
  
      $decpoint = $opts->{decimal_point}
          if length $decpoint;
  
      "$sign$int$decpoint$frac";
  }
  
  1;
  # ABSTRACT: Format Math::BigFloat number
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Number::Format::BigFloat - Format Math::BigFloat number
  
  =head1 VERSION
  
  This document describes version 0.001 of Number::Format::BigFloat (from Perl distribution Number-Format-BigFloat), released on 2017-12-09.
  
  =head1 SYNOPSIS
  
   use Number::Format::BigFloat qw(format_number);
  
   format_number(1.1);                                             # => "1.10"
   format_number(1.1, {decimal_digits=>20});                       # => "1.10000000000000000000"
   format_number("1.123456789012345678901", {decimal_digits=>20}); # => "1.12345678901234567890"
  
  =head1 FUNCTIONS
  
  None exported by default but all of them exportable.
  
  =head2 format_number($num, \%opts) => STR
  
  Format C<$num>. C<$num> will be converted to L<Math::BigFloat> instance first.
  Will return C<$num> as-is if C<$num> is not expressable as decimal notation
  number.
  
  Known options:
  
  =over
  
  =item * thousands_sep => str (default: ",")
  
  =item * decimal_point => str (default: ".")
  
  =item * decimal_digits => int (default: 2)
  
  =back
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Number-Format-BigFloat>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Number-Format-BigFloat>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Number-Format-BigFloat>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  Other number formatting modules: L<Number::Format>.
  
  L<Math::BigFloat>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2017 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
NUMBER_FORMAT_BIGFLOAT

    $main::fatpacked{"PERLANCAR/File/HomeDir.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PERLANCAR_FILE_HOMEDIR';
  package PERLANCAR::File::HomeDir;
  
  our $DATE = '2018-09-20'; # DATE
  our $VERSION = '0.060'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  use Exporter qw(import);
  our @EXPORT_OK = qw(
                         get_my_home_dir
                         get_user_home_dir
                 );
  
  our $DIE_ON_FAILURE = 0;
  
  # borrowed from File::HomeDir, with some modifications
  sub get_my_home_dir {
      if ($^O eq 'MSWin32') {
          # File::HomeDir always uses exists($ENV{x}) first, does it want to avoid
          # accidentally creating env vars?
          return $ENV{HOME} if $ENV{HOME};
          return $ENV{USERPROFILE} if $ENV{USERPROFILE};
          return join($ENV{HOMEDRIVE}, "\\", $ENV{HOMEPATH})
              if $ENV{HOMEDRIVE} && $ENV{HOMEPATH};
      } else {
          return $ENV{HOME} if $ENV{HOME};
          my @pw;
          eval { @pw = getpwuid($>) };
          return $pw[7] if @pw;
      }
  
      if ($DIE_ON_FAILURE) {
          die "Can't get home directory";
      } else {
          return undef;
      }
  }
  
  # borrowed from File::HomeDir, with some modifications
  sub get_user_home_dir {
      my ($name) = @_;
  
      if ($^O eq 'MSWin32') {
          # not yet implemented
          return undef;
      } else {
          # IF and only if we have getpwuid support, and the name of the user is
          # our own, shortcut to my_home. This is needed to handle HOME
          # environment settings.
          if ($name eq getpwuid($<)) {
              return get_my_home_dir();
          }
  
        SCOPE: {
              my $home = (getpwnam($name))[7];
              return $home if $home and -d $home;
          }
  
          return undef;
      }
  
  }
  
  1;
  # ABSTRACT: Lightweight way to get current user's home directory
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  PERLANCAR::File::HomeDir - Lightweight way to get current user's home directory
  
  =head1 VERSION
  
  This document describes version 0.060 of PERLANCAR::File::HomeDir (from Perl distribution PERLANCAR-File-HomeDir), released on 2018-09-20.
  
  =head1 SYNOPSIS
  
   use PERLANCAR::File::HomeDir qw(get_my_home_dir get_user_home_dir);
  
   my $dir = get_my_home_dir(); # e.g. "/home/ujang"
  
   $dir = get_user_home_dir("ujang");
  
  =head1 DESCRIPTION
  
  This is a (temporary?) module to get user's home directory. It is a lightweight
  version of L<File::HomeDir> with fewer OS support (only Windows and Unix) and
  fewer logic/heuristic.
  
  =head1 VARIABLES
  
  =head2 $DIE_ON_FAILURE => bool (default: 0)
  
  If set to true, will die on failure. Else, function usually return undef on
  failure.
  
  =head1 FUNCTIONS
  
  None are exported by default, but they are exportable.
  
  =head2 get_my_home_dir
  
  Usage:
  
   my $home_dir = get_my_home_dir();
  
  Try several ways to get home directory of the current user. Return undef or die
  (depends on C<$DIE_ON_FAILURE>) if everything fails.
  
  =head2 get_user_home_dir
  
  Usage:
  
   my $home_dir = get_user_home_dir($username);
  
  Try several ways to get home directory of a specified user (C<$username>).
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/PERLANCAR-File-HomeDir>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-PERLANCAR-File-HomeDir>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=PERLANCAR-File-HomeDir>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<File::HomeDir>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2018, 2017, 2016, 2015 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
PERLANCAR_FILE_HOMEDIR

    $main::fatpacked{"Package/MoreUtil.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PACKAGE_MOREUTIL';
  package Package::MoreUtil;
  
  our $DATE = '2019-12-25'; # DATE
  our $VERSION = '0.592'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  require Exporter;
  our @ISA = qw(Exporter);
  our @EXPORT_OK = qw(
                         package_exists
                         list_package_contents
                         list_package_subs
                         list_subpackages
                 );
  
  sub package_exists {
      no strict 'refs';
  
      my $pkg = shift;
  
      # opt
      #return unless $pkg =~ /\A\w+(::\w+)*\z/;
  
      if ($pkg =~ s/::(\w+)\z//) {
          return !!${$pkg . "::"}{$1 . "::"};
      } else {
          return !!$::{$pkg . "::"};
      }
  }
  
  # XXX incomplete/improper
  sub list_package_contents {
      no strict 'refs';
  
      my $pkg = shift;
  
      return () unless !length($pkg) || package_exists($pkg);
      my $symtbl = \%{$pkg . "::"};
  
      my %res;
      while (my ($k, $v) = each %$symtbl) {
          next if $k =~ /::$/; # subpackage
          my $n;
          if ("$v" !~ /^\*/) {
              # constant
              $res{$k} = $v;
              next;
          }
          if (defined *$v{CODE}) {
              $res{$k} = *$v{CODE}; # subroutine
              $n++;
          }
          if (defined *$v{HASH}) {
              $res{"\%$k"} = \%{*$v}; # hash
              $n++;
          }
          if (defined *$v{ARRAY}) {
              $res{"\@$k"} = \@{*$v}; # array
              $n++;
          }
          if (defined(*$v{SCALAR}) # XXX always defined?
                  && defined(${*$v})) { # currently we filter undef values
              $res{"\$$k"} = \${*$v}; # scalar
              $n++;
          }
  
          if (!$n) {
              $res{"\*$k"} = $v; # glob
          }
      }
  
      %res;
  }
  
  # XXX incomplete/improper too?
  sub list_package_subs {
      no strict 'refs';
  
      my $pkg = shift;
  
      return () unless !length($pkg) || package_exists($pkg);
      my $symtbl = \%{$pkg . "::"};
  
      my @res;
      while (my ($k, $v) = each %$symtbl) {
          if (
              ref $v eq 'CODE' || # perl >= 5.22
                  defined *$v{CODE}) {
              push @res, $k;
          }
      }
  
      @res;
  }
  
  sub list_subpackages {
      no strict 'refs';
  
      my ($pkg, $recursive, $cur_res, $ref_mem) = @_;
  
      return () unless !length($pkg) || package_exists($pkg);
  
      # this is used to avoid deep recursion. for example (the only one?) %:: and
      # %main:: point to the same thing.
      $ref_mem //= {};
  
      my $symtbl = \%{$pkg . "::"};
      return () if $ref_mem->{"$symtbl"}++;
  
      my $res = $cur_res // [];
      for (sort keys %$symtbl) {
          next unless s/::$//;
          my $name = (length($pkg) ? "$pkg\::" : "" ) . $_;
          push @$res, $name;
          list_subpackages($name, 1, $res, $ref_mem) if $recursive;
      }
  
      @$res;
  }
  
  1;
  # ABSTRACT: Package-related utilities
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Package::MoreUtil - Package-related utilities
  
  =head1 VERSION
  
  This document describes version 0.592 of Package::MoreUtil (from Perl distribution Package-MoreUtil), released on 2019-12-25.
  
  =head1 SYNOPSIS
  
   use Package::MoreUtil qw(
       package_exists
       list_package_contents
       list_package_subs
       list_subpackages
   );
  
   print "Package Foo::Bar exists" if package_exists("Foo::Bar");
   my %content   = list_package_contents("Foo::Bar");
   my @subnames  = list_package_subs("Foo::Bar");
   my @subpkg    = list_subpackages("Foo::Bar");
   my @allsubpkg = list_subpackages("Foo::Bar", 1); # recursive
  
  =head1 DESCRIPTION
  
  B<DEPRECATION NOTICE:> This module is deprecated in favor of L<Package::Stash>
  and L<Package::Util::Lite>.
  
  =head1 FUNCTIONS
  
  =head2 package_exists($name) => BOOL
  
  Return true if package "exists". By "exists", it means that the package has been
  defined by C<package> statement or some entries have been created in the symbol
  table (e.g. C<$Foo::var = 1;> will make the C<Foo> package "exist").
  
  This function can be used e.g. for checking before aliasing one package to
  another. Or to casually check whether a module has been loaded.
  
  =head2 list_package_contents($name) => %res
  
  Return a hash containing package contents. For example:
  
   (
       sub1  => \&Foo::Bar::sub1,
       sub2  => \&Foo::Bar::sub2,
       '%h1' => \%Foo::Bar::h1,
       '@a1' => \@Foo::Bar::a1,
       ...
   )
  
  This module won't list subpackages. Use list_subpackages() for that.
  
  =head2 list_package_subs($pkg) => @subnames
  
  Return a list containing subroutine names in package C<$pkg>.
  
  =head2 list_subpackages($name[, $recursive]) => @res
  
  List subpackages, e.g.:
  
   (
       "Foo::Bar::Baz",
       "Foo::Bar::Qux",
       ...
   )
  
  If $recursive is true, will also list subpackages of subpackages, and so on.
  
  =head1 FAQ
  
  =head2 How to list all existing packages?
  
  You can recurse from the top, e.g.:
  
   list_subpackages("", 1);
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Package-MoreUtil>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Package-MoreUtil>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Package-MoreUtil>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Package::Stash>
  
  L<Package::Util::Lite>
  
  L<perlmod>
  
  L<Package::Util> (currently empty/placeholder at the time of this writing)
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2019, 2018, 2014, 2013 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
PACKAGE_MOREUTIL

    $main::fatpacked{"Package/Stash.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PACKAGE_STASH';
  package Package::Stash; # git description: 5468b00
  use strict;
  use warnings;
  use 5.008001;
  # ABSTRACT: routines for manipulating stashes
  
  our $VERSION = '0.38';
  our $IMPLEMENTATION;
  
  use Module::Implementation 0.06;
  
  BEGIN {
      local $ENV{PACKAGE_STASH_IMPLEMENTATION} = $IMPLEMENTATION
        if ( $IMPLEMENTATION and not $ENV{PACKAGE_STASH_IMPLEMENTATION} );
  
      Module::Implementation::build_loader_sub(
          implementations => [ 'XS', 'PP' ],
          symbols         => [qw(
              new
              name
              namespace
              add_symbol
              remove_glob
              has_symbol
              get_symbol
              get_or_add_symbol
              remove_symbol
              list_all_symbols
              get_all_symbols
          )],
      )->();
      $IMPLEMENTATION = Module::Implementation::implementation_for(__PACKAGE__);
  }
  
  
  1;
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Package::Stash - routines for manipulating stashes
  
  =head1 VERSION
  
  version 0.38
  
  =head1 SYNOPSIS
  
    my $stash = Package::Stash->new('Foo');
    $stash->add_symbol('%foo', {bar => 1});
    # $Foo::foo{bar} == 1
    $stash->has_symbol('$foo') # false
    my $namespace = $stash->namespace;
    *{ $namespace->{foo} }{HASH} # {bar => 1}
  
  =head1 DESCRIPTION
  
  Manipulating stashes (Perl's symbol tables) is occasionally necessary, but
  incredibly messy, and easy to get wrong. This module hides all of that behind a
  simple API.
  
  NOTE: Most methods in this class require a variable specification that includes
  a sigil. If this sigil is absent, it is assumed to represent the IO slot.
  
  Due to limitations in the typeglob API available to perl code, and to typeglob
  manipulation in perl being quite slow, this module provides two
  implementations - one in pure perl, and one using XS. The XS implementation is
  to be preferred for most usages; the pure perl one is provided for cases where
  XS modules are not a possibility. The current implementation in use can be set
  by setting C<$ENV{PACKAGE_STASH_IMPLEMENTATION}> or
  C<$Package::Stash::IMPLEMENTATION> before loading Package::Stash (with the
  environment variable taking precedence), otherwise, it will use the XS
  implementation if possible, falling back to the pure perl one.
  
  =head1 METHODS
  
  =head2 new $package_name
  
  Creates a new C<Package::Stash> object, for the package given as the only
  argument.
  
  =head2 name
  
  Returns the name of the package that this object represents.
  
  =head2 namespace
  
  Returns the raw stash itself.
  
  =head2 add_symbol $variable $value %opts
  
  Adds a new package symbol, for the symbol given as C<$variable>, and optionally
  gives it an initial value of C<$value>. C<$variable> should be the name of
  variable including the sigil, so
  
    Package::Stash->new('Foo')->add_symbol('%foo')
  
  will create C<%Foo::foo>.
  
  Valid options (all optional) are C<filename>, C<first_line_num>, and
  C<last_line_num>.
  
  C<$opts{filename}>, C<$opts{first_line_num}>, and C<$opts{last_line_num}> can
  be used to indicate where the symbol should be regarded as having been defined.
  Currently these values are only used if the symbol is a subroutine ('C<&>'
  sigil) and only if C<$^P & 0x10> is true, in which case the special C<%DB::sub>
  hash is updated to record the values of C<filename>, C<first_line_num>, and
  C<last_line_num> for the subroutine. If these are not passed, their values are
  inferred (as much as possible) from C<caller> information.
  
  This is especially useful for debuggers and profilers, which use C<%DB::sub> to
  determine where the source code for a subroutine can be found.  See
  L<http://perldoc.perl.org/perldebguts.html#Debugger-Internals> for more
  information about C<%DB::sub>.
  
  =head2 remove_glob $name
  
  Removes all package variables with the given name, regardless of sigil.
  
  =head2 has_symbol $variable
  
  Returns whether or not the given package variable (including sigil) exists.
  
  =head2 get_symbol $variable
  
  Returns the value of the given package variable (including sigil).
  
  =head2 get_or_add_symbol $variable
  
  Like C<get_symbol>, except that it will return an empty hashref or
  arrayref if the variable doesn't exist.
  
  =head2 remove_symbol $variable
  
  Removes the package variable described by C<$variable> (which includes the
  sigil); other variables with the same name but different sigils will be
  untouched.
  
  =head2 list_all_symbols $type_filter
  
  Returns a list of package variable names in the package, without sigils. If a
  C<type_filter> is passed, it is used to select package variables of a given
  type, where valid types are the slots of a typeglob ('SCALAR', 'CODE', 'HASH',
  etc). Note that if the package contained any C<BEGIN> blocks, perl will leave
  an empty typeglob in the C<BEGIN> slot, so this will show up if no filter is
  used (and similarly for C<INIT>, C<END>, etc).
  
  =head2 get_all_symbols $type_filter
  
  Returns a hashref, keyed by the variable names in the package. If
  C<$type_filter> is passed, the hash will contain every variable of that type in
  the package as values, otherwise, it will contain the typeglobs corresponding
  to the variable names (basically, a clone of the stash).
  
  =head1 WORKING WITH VARIABLES
  
  It is important to note, that when working with scalar variables, the default
  behavior is to B<copy> values.
  
    my $stash = Package::Stash->new('Some::Namespace');
    my $variable = 1;
    # $Some::Namespace::name is a copy of $variable
    $stash->add_symbol('$name', $variable);
    $variable++
    # $Some::Namespace::name == 1 , $variable == 2
  
  This will likely confuse people who expect it to work the same as typeglob
  assignment, which simply creates new references to existing variables.
  
    my $variable = 1;
    {
        no strict 'refs';
        # assign $Package::Stash::name = $variable
        *{'Package::Stash::name'} = \$variable;
    }
    $variable++ # affects both names
  
  If this behaviour is desired when working with Package::Stash, simply pass
  Package::Stash a scalar ref:
  
    my $stash = Package::Stash->new('Some::Namespace');
    my $variable = 1;
    # $Some::Namespace::name is now $variable
    $stash->add_symbol('$name', \$variable);
    $variable++
    # $Some::Namespace::name == 2 , $variable == 2
  
  This will be what you want as well if you're ever working with L<Readonly>
  variables:
  
    use Readonly;
    Readonly my $value, 'hello';
  
    $stash->add_symbol('$name', \$value); # reference
    print $Some::Namespace::name; # hello
    # Tries to modify the read-only 'hello' and dies.
    $Some::Namespace::name .= " world";
  
    $stash->add_symbol('$name', $value); # copy
    print $Some::Namespace::name; # hello
    # No problem, modifying a copy, not the original
    $Some::Namespace::name .= " world";
  
  =head1 SEE ALSO
  
  =over 4
  
  =item * L<Class::MOP::Package>
  
  This module is a factoring out of code that used to live here
  
  =back
  
  =head1 SUPPORT
  
  You can find this documentation for this module with the perldoc command.
  
      perldoc Package::Stash
  
  You can also look for information at:
  
  =over 4
  
  =item * MetaCPAN
  
  L<https://metacpan.org/release/Package-Stash>
  
  =item * Github
  
  L<https://github.com/moose/Package-Stash>
  
  =item * RT: CPAN's request tracker
  
  L<http://rt.cpan.org/NoAuth/Bugs.html?Dist=Package-Stash>
  
  =item * CPAN Ratings
  
  L<http://cpanratings.perl.org/d/Package-Stash>
  
  =back
  
  =head1 HISTORY
  
  Based on code from L<Class::MOP::Package>, by Stevan Little and the Moose
  Cabal.
  
  =head1 BUGS / CAVEATS
  
  =over 4
  
  =item * Prior to perl 5.10, scalar slots are only considered to exist if they are defined
  
  This is due to a shortcoming within perl itself. See
  L<perlref/Making References> point 7 for more information.
  
  =item * GLOB and FORMAT variables are not (yet) accessible through this module.
  
  =item * Also, see the BUGS section for the specific backends (L<Package::Stash::XS> and L<Package::Stash::PP>)
  
  =back
  
  Bugs may be submitted through L<the RT bug tracker|https://rt.cpan.org/Public/Dist/Display.html?Name=Package-Stash>
  (or L<bug-Package-Stash@rt.cpan.org|mailto:bug-Package-Stash@rt.cpan.org>).
  
  =head1 AUTHOR
  
  Jesse Luehrs <doy@tozt.net>
  
  =head1 CONTRIBUTORS
  
  =for stopwords Karen Etheridge Carlos Lima Kent Fredric Justin Hunter Christian Walde Dave Rolsky Niko Tyni Renee Tim Bunce
  
  =over 4
  
  =item *
  
  Karen Etheridge <ether@cpan.org>
  
  =item *
  
  Carlos Lima <carlos@multi>
  
  =item *
  
  Kent Fredric <kentfredric@gmail.com>
  
  =item *
  
  Justin Hunter <justin.d.hunter@gmail.com>
  
  =item *
  
  Christian Walde <walde.christian@googlemail.com>
  
  =item *
  
  Dave Rolsky <autarch@urth.org>
  
  =item *
  
  Niko Tyni <ntyni@debian.org>
  
  =item *
  
  Renee <reb@perl-services.de>
  
  =item *
  
  Tim Bunce <Tim.Bunce@pobox.com>
  
  =back
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2018 by Jesse Luehrs.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
PACKAGE_STASH

    $main::fatpacked{"Package/Stash/PP.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PACKAGE_STASH_PP';
  package Package::Stash::PP;
  use strict;
  use warnings;
  # ABSTRACT: pure perl implementation of the Package::Stash API
  
  our $VERSION = '0.38';
  
  use B;
  use Carp qw(confess);
  use Scalar::Util qw(blessed reftype weaken);
  use Symbol;
  # before 5.12, assigning to the ISA glob would make it lose its magical ->isa
  # powers
  use constant BROKEN_ISA_ASSIGNMENT => ($] < 5.012);
  # before 5.10, stashes don't ever seem to drop to a refcount of zero, so
  # weakening them isn't helpful
  use constant BROKEN_WEAK_STASH     => ($] < 5.010);
  # before 5.10, the scalar slot was always treated as existing if the
  # glob existed
  use constant BROKEN_SCALAR_INITIALIZATION => ($] < 5.010);
  # add_method on anon stashes triggers rt.perl #1804 otherwise
  # fixed in perl commit v5.13.3-70-g0fe688f
  use constant BROKEN_GLOB_ASSIGNMENT => ($] < 5.013004);
  # pre-5.10, ->isa lookups were cached in the ::ISA::CACHE:: slot
  use constant HAS_ISA_CACHE => ($] < 5.010);
  
  
  sub new {
      my $class = shift;
      my ($package) = @_;
  
      if (!defined($package) || (ref($package) && reftype($package) ne 'HASH')) {
          confess "Package::Stash->new must be passed the name of the "
                . "package to access";
      }
      elsif (ref($package) && reftype($package) eq 'HASH') {
          confess "The PP implementation of Package::Stash does not support "
                . "anonymous stashes before perl 5.14"
              if BROKEN_GLOB_ASSIGNMENT;
  
          return bless {
              'namespace' => $package,
          }, $class;
      }
      elsif ($package =~ /\A[0-9A-Z_a-z]+(?:::[0-9A-Z_a-z]+)*\z/) {
          return bless {
              'package' => $package,
          }, $class;
      }
      else {
          confess "$package is not a module name";
      }
  
  }
  
  sub name {
      confess "Can't call name as a class method"
          unless blessed($_[0]);
      confess "Can't get the name of an anonymous package"
          unless defined($_[0]->{package});
      return $_[0]->{package};
  }
  
  sub namespace {
      confess "Can't call namespace as a class method"
          unless blessed($_[0]);
  
      if (BROKEN_WEAK_STASH) {
          no strict 'refs';
          return \%{$_[0]->name . '::'};
      }
      else {
          return $_[0]->{namespace} if defined $_[0]->{namespace};
  
          {
              no strict 'refs';
              $_[0]->{namespace} = \%{$_[0]->name . '::'};
          }
  
          weaken($_[0]->{namespace});
  
          return $_[0]->{namespace};
      }
  }
  
  {
      my %SIGIL_MAP = (
          '$' => 'SCALAR',
          '@' => 'ARRAY',
          '%' => 'HASH',
          '&' => 'CODE',
          ''  => 'IO',
      );
  
      sub _deconstruct_variable_name {
          my ($variable) = @_;
  
          my @ret;
          if (ref($variable) eq 'HASH') {
              @ret = @{$variable}{qw[name sigil type]};
          }
          else {
              (defined $variable && length $variable)
                  || confess "You must pass a variable name";
  
              my $sigil = substr($variable, 0, 1, '');
  
              if (exists $SIGIL_MAP{$sigil}) {
                  @ret = ($variable, $sigil, $SIGIL_MAP{$sigil});
              }
              else {
                  @ret = ("${sigil}${variable}", '', $SIGIL_MAP{''});
              }
          }
  
          # XXX in pure perl, this will access things in inner packages,
          # in xs, this will segfault - probably look more into this at
          # some point
          ($ret[0] !~ /::/)
              || confess "Variable names may not contain ::";
  
          return @ret;
      }
  }
  
  sub _valid_for_type {
      my ($value, $type) = @_;
      if ($type eq 'HASH' || $type eq 'ARRAY'
       || $type eq 'IO'   || $type eq 'CODE') {
          return reftype($value) eq $type;
      }
      else {
          my $ref = reftype($value);
          return !defined($ref) || $ref eq 'SCALAR' || $ref eq 'REF' || $ref eq 'LVALUE' || $ref eq 'REGEXP' || $ref eq 'VSTRING';
      }
  }
  
  sub add_symbol {
      my ($self, $variable, $initial_value, %opts) = @_;
  
      my ($name, $sigil, $type) = _deconstruct_variable_name($variable);
  
      if (@_ > 2) {
          _valid_for_type($initial_value, $type)
              || confess "$initial_value is not of type $type";
  
          # cheap fail-fast check for PERLDBf_SUBLINE and '&'
          if ($^P and $^P & 0x10 && $sigil eq '&') {
              my $filename = $opts{filename};
              my $first_line_num = $opts{first_line_num};
  
              (undef, $filename, $first_line_num) = caller
                  if not defined $filename;
  
              my $last_line_num = $opts{last_line_num} || ($first_line_num ||= 0);
  
              # http://perldoc.perl.org/perldebguts.html#Debugger-Internals
              $DB::sub{$self->name . '::' . $name} = "$filename:$first_line_num-$last_line_num";
          }
      }
  
      if (BROKEN_GLOB_ASSIGNMENT) {
          if (@_ > 2) {
              no strict 'refs';
              no warnings 'redefine';
              *{ $self->name . '::' . $name } = ref $initial_value
                  ? $initial_value : \$initial_value;
          }
          else {
              no strict 'refs';
              if (BROKEN_ISA_ASSIGNMENT && $name eq 'ISA') {
                  *{ $self->name . '::' . $name };
              }
              else {
                  my $undef = _undef_ref_for_type($type);
                  *{ $self->name . '::' . $name } = $undef;
              }
          }
      }
      else {
          my $namespace = $self->namespace;
          {
              # using glob aliasing instead of Symbol::gensym, because otherwise,
              # magic doesn't get applied properly.
              # see <20120710063744.19360.qmail@lists-nntp.develooper.com> on p5p
              local *__ANON__:: = $namespace;
              no strict 'refs';
              no warnings 'void';
              no warnings 'once';
              *{"__ANON__::$name"};
          }
  
          if (@_ > 2) {
              no warnings 'redefine';
              *{ $namespace->{$name} } = ref $initial_value
                  ? $initial_value : \$initial_value;
          }
          else {
              return if BROKEN_ISA_ASSIGNMENT && $name eq 'ISA';
              *{ $namespace->{$name} } = _undef_ref_for_type($type);
          }
      }
  }
  
  sub _undef_ref_for_type {
      my ($type) = @_;
  
      if ($type eq 'ARRAY') {
          return [];
      }
      elsif ($type eq 'HASH') {
          return {};
      }
      elsif ($type eq 'SCALAR') {
          return \undef;
      }
      elsif ($type eq 'IO') {
          return Symbol::geniosym;
      }
      elsif ($type eq 'CODE') {
          confess "Don't know how to vivify CODE variables";
      }
      else {
          confess "Unknown type $type in vivication";
      }
  }
  
  sub remove_glob {
      my ($self, $name) = @_;
      delete $self->namespace->{$name};
  }
  
  sub has_symbol {
      my ($self, $variable) = @_;
  
      my ($name, $sigil, $type) = _deconstruct_variable_name($variable);
  
      my $namespace = $self->namespace;
  
      return unless exists $namespace->{$name};
  
      my $entry_ref = \$namespace->{$name};
      if (reftype($entry_ref) eq 'GLOB') {
          if ($type eq 'SCALAR') {
              if (BROKEN_SCALAR_INITIALIZATION) {
                  return defined ${ *{$entry_ref}{$type} };
              }
              else {
                  my $sv = B::svref_2object($entry_ref)->SV;
                  return $sv->isa('B::SV')
                      || ($sv->isa('B::SPECIAL')
                       && $B::specialsv_name[$$sv] ne 'Nullsv');
              }
          }
          else {
              return defined *{$entry_ref}{$type};
          }
      }
      else {
          # a symbol table entry can be -1 (stub), string (stub with prototype),
          # or reference (constant)
          return $type eq 'CODE';
      }
  }
  
  sub get_symbol {
      my ($self, $variable, %opts) = @_;
  
      my ($name, $sigil, $type) = _deconstruct_variable_name($variable);
  
      my $namespace = $self->namespace;
  
      if (!exists $namespace->{$name}) {
          if ($opts{vivify}) {
              $self->add_symbol($variable);
          }
          else {
              return undef;
          }
      }
  
      my $entry_ref = \$namespace->{$name};
  
      if (ref($entry_ref) eq 'GLOB') {
          return *{$entry_ref}{$type};
      }
      else {
          if ($type eq 'CODE') {
              if (BROKEN_GLOB_ASSIGNMENT || defined($self->{package})) {
                  no strict 'refs';
                  return \&{ $self->name . '::' . $name };
              }
  
              # XXX we should really be able to support arbitrary anonymous
              # stashes here... (not just via Package::Anon)
              if (blessed($namespace) && $namespace->isa('Package::Anon')) {
                  # ->can will call gv_init for us, which inflates the glob
                  # don't know how to do this in general
                  $namespace->bless(\(my $foo))->can($name);
              }
              else {
                  confess "Don't know how to inflate a " . ref($entry_ref)
                        . " into a full coderef (perhaps you could use"
                        . " Package::Anon instead of a bare stash?)"
              }
  
              return *{ $namespace->{$name} }{CODE};
          }
          else {
              return undef;
          }
      }
  }
  
  sub get_or_add_symbol {
      my $self = shift;
      $self->get_symbol(@_, vivify => 1);
  }
  
  sub remove_symbol {
      my ($self, $variable) = @_;
  
      my ($name, $sigil, $type) = _deconstruct_variable_name($variable);
  
      # FIXME:
      # no doubt this is grossly inefficient and
      # could be done much easier and faster in XS
  
      my %desc = (
          SCALAR => { sigil => '$', type => 'SCALAR', name => $name },
          ARRAY  => { sigil => '@', type => 'ARRAY',  name => $name },
          HASH   => { sigil => '%', type => 'HASH',   name => $name },
          CODE   => { sigil => '&', type => 'CODE',   name => $name },
          IO     => { sigil => '',  type => 'IO',     name => $name },
      );
      confess "This should never ever ever happen" if !$desc{$type};
  
      my @types_to_store = grep { $type ne $_ && $self->has_symbol($desc{$_}) }
                                keys %desc;
      my %values = map { $_, $self->get_symbol($desc{$_}) } @types_to_store;
  
      $values{SCALAR} = $self->get_symbol($desc{SCALAR})
        if !defined $values{SCALAR}
          && $type ne 'SCALAR'
          && BROKEN_SCALAR_INITIALIZATION;
  
      $self->remove_glob($name);
  
      $self->add_symbol($desc{$_} => $values{$_})
          for grep { defined $values{$_} } keys %values;
  }
  
  sub list_all_symbols {
      my ($self, $type_filter) = @_;
  
      my $namespace = $self->namespace;
      if (HAS_ISA_CACHE) {
          return grep { $_ ne '::ISA::CACHE::' } keys %{$namespace}
              unless defined $type_filter;
      }
      else {
          return keys %{$namespace}
              unless defined $type_filter;
      }
  
      # NOTE:
      # or we can filter based on
      # type (SCALAR|ARRAY|HASH|CODE)
      if ($type_filter eq 'CODE') {
          return grep {
              # any non-typeglob in the symbol table is a constant or stub
              ref(\$namespace->{$_}) ne 'GLOB'
                  # regular subs are stored in the CODE slot of the typeglob
                  || defined(*{$namespace->{$_}}{CODE})
          } keys %{$namespace};
      }
      elsif ($type_filter eq 'SCALAR') {
          return grep {
              !(HAS_ISA_CACHE && $_ eq '::ISA::CACHE::') &&
              (BROKEN_SCALAR_INITIALIZATION
                  ? (ref(\$namespace->{$_}) eq 'GLOB'
                        && defined(${*{$namespace->{$_}}{'SCALAR'}}))
                  : (do {
                        my $entry = \$namespace->{$_};
                        ref($entry) eq 'GLOB'
                            && B::svref_2object($entry)->SV->isa('B::SV')
                    }))
          } keys %{$namespace};
      }
      else {
          return grep {
              ref(\$namespace->{$_}) eq 'GLOB'
                  && defined(*{$namespace->{$_}}{$type_filter})
          } keys %{$namespace};
      }
  }
  
  sub get_all_symbols {
      my ($self, $type_filter) = @_;
  
      my $namespace = $self->namespace;
      return { %{$namespace} } unless defined $type_filter;
  
      return {
          map { $_ => $self->get_symbol({name => $_, type => $type_filter}) }
              $self->list_all_symbols($type_filter)
      }
  }
  
  
  1;
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Package::Stash::PP - pure perl implementation of the Package::Stash API
  
  =head1 VERSION
  
  version 0.38
  
  =head1 SYNOPSIS
  
    use Package::Stash;
  
  =head1 DESCRIPTION
  
  This is a backend for L<Package::Stash> implemented in pure perl, for those without a compiler or who would like to use this inline in scripts.
  
  =head1 SEE ALSO
  
  =over 4
  
  =item * L<Class::MOP::Package>
  
  This module is a factoring out of code that used to live here
  
  =back
  
  =head1 SUPPORT
  
  You can find this documentation for this module with the perldoc command.
  
      perldoc Package::Stash
  
  You can also look for information at:
  
  =over 4
  
  =item * CPAN Ratings
  
  L<http://cpanratings.perl.org/d/Package-Stash>
  
  =item * RT: CPAN's request tracker
  
  L<http://rt.cpan.org/NoAuth/Bugs.html?Dist=Package-Stash>
  
  =item * Search CPAN
  
  L<http://search.cpan.org/dist/Package-Stash>
  
  =back
  
  =for Pod::Coverage BROKEN_ISA_ASSIGNMENT
  add_symbol
  get_all_symbols
  get_or_add_symbol
  get_symbol
  has_symbol
  list_all_symbols
  name
  namespace
  new
  remove_glob
  
  =head1 BUGS
  
  =over 4
  
  =item * remove_symbol also replaces the associated typeglob
  
  This can cause unexpected behavior when doing manipulation at compile time -
  removing subroutines will still allow them to be called from within the package
  as subroutines (although they will not be available as methods). This can be
  considered a feature in some cases (this is how L<namespace::clean> works, for
  instance), but should not be relied upon - use C<remove_glob> directly if you
  want this behavior.
  
  =item * Some minor memory leaks
  
  The pure perl implementation has a couple minor memory leaks (see the TODO
  tests in t/20-leaks.t) that I'm having a hard time tracking down - these may be
  core perl bugs, it's hard to tell.
  
  =back
  
  Bugs may be submitted through L<the RT bug tracker|https://rt.cpan.org/Public/Dist/Display.html?Name=Package-Stash>
  (or L<bug-Package-Stash@rt.cpan.org|mailto:bug-Package-Stash@rt.cpan.org>).
  
  =head1 AUTHOR
  
  Jesse Luehrs <doy at tozt dot net>
  
  Mostly copied from code from L<Class::MOP::Package>, by Stevan Little and the
  Moose Cabal.
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2018 by Jesse Luehrs.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
PACKAGE_STASH_PP

    $main::fatpacked{"Package/Util/Lite.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PACKAGE_UTIL_LITE';
  package Package::Util::Lite;
  
  our $DATE = '2019-01-06'; # DATE
  our $VERSION = '0.001'; # VERSION
  
  use strict 'subs', 'vars';
  use warnings;
  
  require Exporter;
  our @ISA = qw(Exporter);
  our @EXPORT_OK = qw(
                         package_exists
                         list_subpackages
                 );
  
  sub package_exists {
      no strict 'refs';
  
      my $pkg = shift;
  
      # opt
      #return unless $pkg =~ /\A\w+(::\w+)*\z/;
  
      if ($pkg =~ s/::(\w+)\z//) {
          return !!${$pkg . "::"}{$1 . "::"};
      } else {
          return !!$::{$pkg . "::"};
      }
  }
  
  sub list_subpackages {
      my ($pkg, $recursive, $cur_res, $ref_mem) = @_;
  
      return () unless !length($pkg) || package_exists($pkg);
  
      # this is used to avoid deep recursion. for example (the only one?) %:: and
      # %main:: point to the same thing.
      $ref_mem ||= {};
  
      my $symtbl = \%{$pkg . "::"};
      return () if $ref_mem->{"$symtbl"}++;
  
      my $res = $cur_res || [];
      for (sort keys %$symtbl) {
          next unless s/::$//;
          my $name = (length($pkg) ? "$pkg\::" : "" ) . $_;
          push @$res, $name;
          list_subpackages($name, 1, $res, $ref_mem) if $recursive;
      }
  
      @$res;
  }
  
  1;
  # ABSTRACT: Package-related utilities
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Package::Util::Lite - Package-related utilities
  
  =head1 VERSION
  
  This document describes version 0.001 of Package::Util::Lite (from Perl distribution Package-Util-Lite), released on 2019-01-06.
  
  =head1 SYNOPSIS
  
   use Package::Util::Lite qw(
       package_exists
       list_subpackages
   );
  
   print "Package Foo::Bar exists" if package_exists("Foo::Bar");
  
   my @subpkg    = list_subpackages("Foo::Bar");
   my @allsubpkg = list_subpackages("Foo::Bar", 1); # recursive
  
  =head1 DESCRIPTION
  
  This module provides package-related utilities. You should check
  L<Package::Stash> first, then here.
  
  =head1 FUNCTIONS
  
  =head2 package_exists
  
  Usage:
  
   package_exists($name) => bool
  
  Return true if package "exists". By "exists", it means that the package has been
  defined by C<package> statement or some entries have been created in the symbol
  table (e.g. C<$Foo::var = 1;> will make the C<Foo> package "exist").
  
  This function can be used e.g. for checking before aliasing one package to
  another. Or to casually check whether a module has been loaded.
  
  =head2 list_subpackages($name[, $recursive]) => @res
  
  List subpackages, e.g.:
  
   (
       "Foo::Bar::Baz",
       "Foo::Bar::Qux",
       ...
   )
  
  If $recursive is true, will also list subpackages of subpackages, and so on.
  
  =head1 FAQ
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Package-Util-Lite>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Package-Util-Lite>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Package-Util-Lite>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Package::Stash>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2019 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
PACKAGE_UTIL_LITE

    $main::fatpacked{"Params/ValidationCompiler.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PARAMS_VALIDATIONCOMPILER';
  package Params::ValidationCompiler;
  
  use strict;
  use warnings;
  
  our $VERSION = '0.30';
  
  use Params::ValidationCompiler::Compiler;
  
  use Exporter qw( import );
  
  our @EXPORT_OK = qw( compile source_for validation_for );
  
  sub validation_for {
      return Params::ValidationCompiler::Compiler->new(@_)->subref;
  }
  
  ## no critic (TestingAndDebugging::ProhibitNoWarnings)
  no warnings 'once';
  *compile = \&validation_for;
  ## use critic
  
  sub source_for {
      return Params::ValidationCompiler::Compiler->new(@_)->source;
  }
  
  1;
  
  # ABSTRACT: Build an optimized subroutine parameter validator once, use it forever
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Params::ValidationCompiler - Build an optimized subroutine parameter validator once, use it forever
  
  =head1 VERSION
  
  version 0.30
  
  =head1 SYNOPSIS
  
      use Types::Standard qw( Int Str );
      use Params::ValidationCompiler qw( validation_for );
  
      {
          my $validator = validation_for(
              params => {
                  foo => { type => Int },
                  bar => {
                      type     => Str,
                      optional => 1,
                  },
                  baz => {
                      type    => Int,
                      default => 42,
                  },
              },
          );
  
          sub foo {
              my %args = $validator->(@_);
          }
      }
  
      {
          my $validator = validation_for(
              params => [
                  { type => Int },
                  {
                      type     => Str,
                      optional => 1,
                  },
              ],
          );
  
          sub bar {
              my ( $int, $str ) = $validator->(@_);
          }
      }
  
      {
          my $validator = validation_for(
              params => [
                  foo => { type => Int },
                  bar => {
                      type     => Str,
                      optional => 1,
                  },
              ],
              named_to_list => 1,
          );
  
          sub baz {
              my ( $foo, $bar ) = $validator->(@_);
          }
      }
  
  =head1 DESCRIPTION
  
  This module creates a customized, highly efficient parameter checking
  subroutine. It can handle named or positional parameters, and can return the
  parameters as key/value pairs or a list of values.
  
  In addition to type checks, it also supports parameter defaults, optional
  parameters, and extra "slurpy" parameters.
  
  =for Pod::Coverage compile
  
  =head1 PARAMETERS
  
  This module has two options exports, C<validation_for> and C<source_for>. Both
  of these subs accept the same options:
  
  =head2 params
  
  An arrayref or hashref containing a parameter specification.
  
  If you pass a hashref then the generated validator sub will expect named
  parameters. The C<params> value should be a hashref where the parameter names
  are keys and the specs are the values.
  
  If you pass an arrayref and C<named_to_list> is false, the validator will
  expect positional params. Each element of the C<params> arrayref should be a
  parameter spec.
  
  If you pass an arrayref and C<named_to_list> is true, the validator will
  expect named params, but will return a list of values. In this case the
  arrayref should contain a I<list> of key/value pairs, where parameter names
  are the keys and the specs are the values.
  
  Each spec can contain either a boolean or hashref. If the spec is a boolean,
  this indicates required (true) or optional (false).
  
  The spec hashref accepts the following keys:
  
  =over 4
  
  =item * type
  
  A type object. This can be a L<Moose> type (from L<Moose> or
  L<MooseX::Types>), a L<Type::Tiny> type, or a L<Specio> type.
  
  If the type has coercions, those will always be used.
  
  =item * default
  
  This can either be a simple (non-reference) scalar or a subroutine
  reference. The sub ref will be called without any arguments (for now).
  
  =item * optional
  
  A boolean indicating whether or not the parameter is optional. By default,
  parameters are required unless you provide a default.
  
  =back
  
  =head2 slurpy
  
  If this is a simple true value, then the generated subroutine accepts
  additional arguments not specified in C<params>. By default, extra arguments
  cause an exception.
  
  You can also pass a type constraint here, in which case all extra arguments
  must be values of the specified type.
  
  =head2 named_to_list
  
  If this is true, the generated subroutine will expect a list of key-value
  pairs or a hashref and it will return a list containing only values. The
  C<params> you pass must be a arrayref of key-value pairs. The order of these
  pairs determines the order in which values are returned.
  
  You cannot combine C<slurpy> with C<named_to_list> as there is no way to know
  how to order the extra return values.
  
  =head2 return_object
  
  If this is true, the generated subroutine will return an object instead of a
  hashref. You cannot set this option to true if you set either or C<slurpy> or
  C<named_to_list>.
  
  The object's methods correspond to the parameter names passed to the
  subroutine. While calling methods on an object is slower than accessing a
  hashref, the advantage is that if you typo a parameter name you'll get a
  helpful error.
  
  If you have L<Class::XSAccessor> installed then this will be used to create
  the class's methods, which makes it fairly fast.
  
  The returned object is in a generated class. Do not rely on this class name
  being anything in specific, and don't check this object using C<isa>, C<DOES>,
  or anything similar.
  
  When C<return_object> is true, the parameter spec hashref also accepts to the
  following additional keys:
  
  =over 4
  
  =item * getter
  
  Use this to set an explicit getter method name for the parameter. By default
  the method name will be the same as the parameter name. Note that if the
  parameter name is not a valid sub name, then you will get an error compiling
  the validation sub unless you specify a getter for the parameter.
  
  =item * predicate
  
  Use this to ask for a predicate method to be created for this parameter. The
  predicate method returns true if the parameter was passed and false if it
  wasn't. Note that this is only useful for optional parameters, but you can ask
  for a predicate for any parameter.
  
  =back
  
  =head1 EXPORTS
  
  The exported subs are:
  
  =head2 validation_for(...)
  
  This returns a subroutine that implements the specific parameter
  checking. This subroutine expects to be given the parameters to validate in
  C<@_>. If all the parameters are valid, it will return the validated
  parameters (with defaults as appropriate), either as a list of key-value pairs
  or as a list of just values. If any of the parameters are invalid it will
  throw an exception.
  
  For validators expected named params, the generated subroutine accepts either
  a list of key-value pairs or a single hashref. Otherwise the validator expects
  a list of values.
  
  For now, you must shift off the invocant yourself.
  
  This subroutine accepts the following additional parameters:
  
  =over 4
  
  =item * name
  
  If this is given, then the generated subroutine will be named using
  L<Sub::Util>. This is strongly recommended as it makes it possible to
  distinguish different check subroutines when profiling or in stack traces.
  
  This name will also be used in some exception messages, even if L<Sub::Util>
  is not available.
  
  Note that you must install L<Sub::Util> yourself separately, as it is not
  required by this distribution, in order to avoid requiring a compiler.
  
  =item * name_is_optional
  
  If this is true, then the name is ignored when C<Sub::Util> is not
  installed. If this is false, then passing a name when L<Sub::Util> cannot be
  loaded causes an exception.
  
  This is useful for CPAN modules where you want to set a name if you can, but
  you do not want to add a prerequisite on L<Sub::Util>.
  
  =item * debug
  
  Sets the C<EVAL_CLOSURE_PRINT_SOURCE> environment variable to true before
  calling C<Eval::Closure::eval_closure()>. This causes the source of the
  subroutine to be printed before it's C<eval>'d.
  
  =back
  
  =head2 source_for(...)
  
  This returns a two element list. The first is a string containing the source
  code for the generated sub. The second is a hashref of "environment" variables
  to be used when generating the subroutine. These are the arguments that are
  passed to L<Eval::Closure>.
  
  =head1 SUPPORT
  
  Bugs may be submitted at L<https://github.com/houseabsolute/Params-ValidationCompiler/issues>.
  
  I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
  
  =head1 SOURCE
  
  The source code repository for Params-ValidationCompiler can be found at L<https://github.com/houseabsolute/Params-ValidationCompiler>.
  
  =head1 DONATIONS
  
  If you'd like to thank me for the work I've done on this module, please
  consider making a "donation" to me via PayPal. I spend a lot of free time
  creating free software, and would appreciate any support you'd care to offer.
  
  Please note that B<I am not suggesting that you must do this> in order for me
  to continue working on this particular software. I will continue to do so,
  inasmuch as I have in the past, for as long as it interests me.
  
  Similarly, a donation made in this way will probably not make me work on this
  software much more, unless I get so many donations that I can consider working
  on free software full time (let's all have a chuckle at that together).
  
  To donate, log into PayPal and send money to autarch@urth.org, or use the
  button at L<http://www.urth.org/~autarch/fs-donation.html>.
  
  =head1 AUTHOR
  
  Dave Rolsky <autarch@urth.org>
  
  =head1 CONTRIBUTORS
  
  =for stopwords Gregory Oschwald Tomasz Konojacki
  
  =over 4
  
  =item *
  
  Gregory Oschwald <goschwald@maxmind.com>
  
  =item *
  
  Gregory Oschwald <oschwald@gmail.com>
  
  =item *
  
  Tomasz Konojacki <me@xenu.pl>
  
  =back
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is Copyright (c) 2016 - 2018 by Dave Rolsky.
  
  This is free software, licensed under:
  
    The Artistic License 2.0 (GPL Compatible)
  
  The full text of the license can be found in the
  F<LICENSE> file included with this distribution.
  
  =cut
PARAMS_VALIDATIONCOMPILER

    $main::fatpacked{"Params/ValidationCompiler/Compiler.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PARAMS_VALIDATIONCOMPILER_COMPILER';
  package Params::ValidationCompiler::Compiler;
  
  use strict;
  use warnings;
  
  our $VERSION = '0.30';
  
  use Carp qw( croak );
  use Eval::Closure qw( eval_closure );
  use List::Util 1.29 qw( pairkeys pairvalues );
  use Params::ValidationCompiler::Exceptions;
  use Scalar::Util qw( blessed looks_like_number reftype );
  use overload ();
  use B qw( perlstring );
  
  our @CARP_NOT = ( 'Params::ValidationCompiler', __PACKAGE__ );
  
  BEGIN {
      ## no critic (Variables::RequireInitializationForLocalVars)
      local $@;
      my $has_sub_util = eval {
          require Sub::Util;
          Sub::Util->VERSION(1.40);
          Sub::Util->import('set_subname');
          1;
      };
  
      sub HAS_SUB_UTIL () {$has_sub_util}
  
      unless ($has_sub_util) {
          *set_subname = sub {
              croak
                  'Cannot name a generated validation subroutine. Please install Sub::Util.';
          };
      }
  
      my $has_cxsa = eval {
          require Class::XSAccessor;
          1;
      };
  
      sub HAS_CXSA {$has_cxsa}
  }
  
  my %known
      = map { $_ => 1 }
      qw( debug name name_is_optional named_to_list params return_object slurpy );
  
  # I'd rather use Moo here but I want to make things relatively high on the
  # CPAN river like DateTime use this distro, so reducing deps is important.
  sub new {
      my $class = shift;
      my %p     = @_;
  
      unless ( exists $p{params} ) {
          croak
              q{You must provide a "params" parameter when creating a parameter validator};
      }
  
      if ( ref $p{params} eq 'HASH' ) {
          croak q{The "params" hashref must contain at least one key-value pair}
              unless %{ $p{params} };
  
          croak
              q{"named_to_list" must be used with arrayref params containing key-value pairs}
              if $p{named_to_list};
  
          $class->_validate_param_spec($_) for values %{ $p{params} };
      }
      elsif ( ref $p{params} eq 'ARRAY' ) {
          croak q{The "params" arrayref must contain at least one element}
              unless @{ $p{params} };
  
          croak q{You can only use "return_object" with named params}
              if $p{return_object};
  
          my @specs
              = $p{named_to_list}
              ? pairvalues @{ $p{params} }
              : @{ $p{params} };
  
          $class->_validate_param_spec($_) for @specs;
      }
      else {
          my $type = _describe( $p{params} );
          croak
              qq{The "params" parameter when creating a parameter validator must be a hashref or arrayref, you passed $type};
      }
  
      if ( $p{named_to_list} && $p{slurpy} ) {
          croak q{You cannot use "named_to_list" and "slurpy" together};
      }
  
      if ( exists $p{name} && ( !defined $p{name} || ref $p{name} ) ) {
          my $type = _describe( $p{name} );
          croak
              qq{The "name" parameter when creating a parameter validator must be a scalar, you passed $type};
      }
  
      if ( $p{return_object} && $p{slurpy} ) {
          croak q{You cannot use "return_object" and "slurpy" together};
      }
  
      my @unknown = sort grep { !$known{$_} } keys %p;
      if (@unknown) {
          croak
              "You passed unknown parameters when creating a parameter validator: [@unknown]";
      }
  
      my $self = bless \%p, $class;
  
      $self->{_source} = [];
      $self->{_env}    = {};
  
      return $self;
  }
  
  sub _describe {
      my $thing = shift;
  
      if ( !defined $thing ) {
          return 'an undef';
      }
      elsif ( my $class = blessed $thing ) {
          my $article = $class =~ /^[aeiou]/i ? 'an' : 'a';
          return "$article $class object";
      }
      elsif ( ref $thing ) {
          my $ref = lc ref $thing;
          my $article = $ref =~ /^[aeiou]/i ? 'an' : 'a';
          return "$article $ref" . 'ref';
      }
  
      return 'a scalar';
  }
  
  {
      my %known_keys = (
          default   => 1,
          getter    => 1,
          optional  => 1,
          predicate => 1,
          type      => 1,
      );
  
      sub _validate_param_spec {
          shift;
          my $spec = shift;
  
          my $ref = ref $spec;
          return unless $ref;
  
          croak
              "Specifications must be a scalar or hashref, but received a $ref"
              unless $ref eq 'HASH';
  
          my @unknown = sort grep { !$known_keys{$_} } keys %{$spec};
          if (@unknown) {
              croak "Specification contains unknown keys: [@unknown]";
          }
      }
  }
  
  sub name      { $_[0]->{name} }
  sub _has_name { exists $_[0]->{name} }
  
  sub _name_is_optional { $_[0]->{name_is_optional} }
  
  # I have no idea why critic thinks _caller isn't used.
  
  ## no critic (Subroutines::ProhibitUnusedPrivateSubroutines)
  sub _caller { $_[0]->{caller} }
  ## use critic
  sub _has_caller { exists $_[0]->{caller} }
  
  sub params { $_[0]->{params} }
  
  sub slurpy { $_[0]->{slurpy} }
  
  sub _source { $_[0]->{_source} }
  
  sub _env { $_[0]->{_env} }
  
  sub named_to_list { $_[0]->{named_to_list} }
  
  sub return_object { $_[0]->{return_object} }
  
  sub _inlineable_name {
      return defined $_[0]->{name}
          ? $_[0]->{name}
          : 'an un-named validation subroutine';
  }
  
  sub _any_type_has_coercion {
      my $self = shift;
  
      return $self->{_has_coercion} if exists $self->{_has_coercion};
  
      for my $type ( $self->_types ) {
  
          # Specio
          if ( $type->can('has_coercions') && $type->has_coercions ) {
              return $self->{_has_coercion} = 1;
          }
  
          # Moose and Type::Tiny
          elsif ( $type->can('has_coercion') && $type->has_coercion ) {
              return $self->{_has_coercion} = 1;
          }
      }
  
      return $self->{_has_coercion} = 0;
  }
  
  sub _types {
      my $self = shift;
  
      my @types;
      if ( ref $self->params eq 'HASH' ) {
          @types = map { $_->{type} || () }
              grep { ref $_ } values %{ $self->params };
      }
      elsif ( ref $self->params eq 'ARRAY' ) {
          if ( $self->named_to_list ) {
              my %p = @{ $self->params };
              @types = map { $_->{type} || () } grep { ref $_ } values %p;
          }
          else {
              @types
                  = map { $_->{type} || () } grep { ref $_ } @{ $self->params };
          }
      }
  
      push @types, $self->slurpy if $self->slurpy && ref $self->slurpy;
  
      return @types;
  }
  
  sub subref {
      my $self = shift;
  
      $self->_compile;
  
      local $ENV{EVAL_CLOSURE_PRINT_SOURCE} = 1 if $self->{debug};
      my $sub = eval_closure(
          source => 'sub { ' . ( join "\n", @{ $self->_source } ) . ' };',
          environment => $self->_env,
      );
  
      if ( $self->_has_name ) {
          my $caller = $self->_has_caller ? $self->_caller : caller(1);
          my $name = join '::', $caller, $self->name;
  
          return $sub if $self->_name_is_optional && !HAS_SUB_UTIL;
          set_subname( $name, $sub );
      }
  
      return $sub;
  }
  
  sub source {
      my $self = shift;
  
      $self->_compile;
      return (
          ( join "\n", @{ $self->_source } ),
          $self->_env,
      );
  }
  
  sub _compile {
      my $self = shift;
  
      if ( ref $self->params eq 'HASH' ) {
          $self->_compile_named_args_check;
      }
      elsif ( ref $self->params eq 'ARRAY' ) {
          if ( $self->named_to_list ) {
              $self->_compile_named_args_list_check;
          }
          else {
              $self->_compile_positional_args_check;
          }
      }
  }
  
  sub _compile_named_args_check {
      my $self = shift;
  
      $self->_compile_named_args_check_body( $self->params );
  
      if ( $self->return_object ) {
          push @{ $self->_source }, $self->_add_return_named_args_object;
      }
      else {
          push @{ $self->_source }, 'return %args;';
      }
  
      return;
  }
  
  {
      my $class_id = 0;
  
      sub _add_return_named_args_object {
          my $self = shift;
  
          my $params = $self->params;
          my %getters;
          my %predicates;
          for my $p ( keys %{$params} ) {
              $getters{
                  ref $params->{$p} && exists $params->{$p}{getter}
                  ? $params->{$p}{getter}
                  : $p
              } = $p;
              $predicates{ $params->{$p}{predicate} } = $p
                  if ref $params->{$p} && exists $params->{$p}{predicate};
          }
  
          my $use_cxsa = HAS_CXSA && !$ENV{TEST_NAMED_ARGS_OBJECT_WITHOUT_CXSA};
          my $class = sprintf(
              '%s::OO::Args%d::%s',
              __PACKAGE__,
              $class_id++,
              $use_cxsa ? 'XS' : 'PP',
          );
  
          if ($use_cxsa) {
              $self->_create_cxsa_return_class(
                  $class,
                  \%getters,
                  \%predicates,
              );
          }
          else {
              $self->_create_pp_return_class( $class, \%getters, \%predicates );
          }
  
          return sprintf( 'bless \%%args, %s', perlstring($class) );
      }
  }
  
  sub _create_cxsa_return_class {
      my $self       = shift;
      my $class      = shift;
      my $getters    = shift;
      my $predicates = shift;
  
      Class::XSAccessor->import(
          redefine          => 1,
          class             => $class,
          getters           => $getters,
          exists_predicates => $predicates,
      );
  
      return;
  }
  
  sub _create_pp_return_class {
      my $self       = shift;
      my $class      = shift;
      my $getters    = shift;
      my $predicates = shift;
  
      my @source = sprintf( 'package %s;', $class );
      for my $sub ( keys %{$getters} ) {
          push @source,
              sprintf(
              'sub %s { return $_[0]->{%s} }', $sub,
              perlstring( $getters->{$sub} )
              );
      }
      for my $sub ( keys %{$predicates} ) {
          push @source,
              sprintf(
              'sub %s { return exists $_[0]->{%s} }', $sub,
              perlstring( $predicates->{$sub} )
              );
      }
      push @source, q{1;};
      ## no critic (BuiltinFunctions::ProhibitStringyEval, ErrorHandling::RequireCheckingReturnValueOfEval)
      eval join q{}, @source
          or die $@;
  
      return;
  }
  
  sub _compile_named_args_list_check {
      my $self = shift;
  
      $self->_compile_named_args_check_body( { @{ $self->params } } );
  
      my @keys = map { perlstring($_) } pairkeys @{ $self->params };
  
      # If we don't handle the one-key case specially we end up getting a
      # warning like "Scalar value @args{"bar"} better written as $args{"bar"}
      # at ..."
      if ( @keys == 1 ) {
          push @{ $self->_source }, "return \$args{$keys[0]};";
      }
      else {
          my $keys_str = join q{, }, @keys;
          push @{ $self->_source }, "return \@args{$keys_str};";
      }
  
      return;
  }
  
  sub _compile_named_args_check_body {
      my $self   = shift;
      my $params = shift;
  
      push @{ $self->_source }, $self->_set_named_args_hash;
  
      for my $name ( sort keys %{$params} ) {
          my $spec = $params->{$name};
          $spec = { optional => !$spec } unless ref $spec;
  
          my $qname  = perlstring($name);
          my $access = "\$args{$qname}";
  
          # We check exists $spec->{optional} so as not to blow up on a
          # restricted hash.
          $self->_add_check_for_required_named_param( $access, $name )
              unless ( exists $spec->{optional} && $spec->{optional} )
              || exists $spec->{default};
  
          $self->_add_named_default_assignment(
              $access,
              $name,
              $spec->{default}
          ) if exists $spec->{default};
  
          # Same issue with restricted hashes here.
          $self->_add_type_check( $access, $name, $spec )
              if exists $spec->{type} && $spec->{type};
      }
  
      if ( $self->slurpy ) {
          $self->_add_check_for_extra_hash_param_types( $self->slurpy, $params )
              if ref $self->slurpy;
      }
      else {
          $self->_add_check_for_extra_hash_params($params);
      }
  
      return;
  }
  
  sub _set_named_args_hash {
      my $self = shift;
  
      push @{ $self->_source },
          sprintf( <<'EOF', ( $self->_inlineable_name ) x 4 );
  my %%args;
  if ( @_ %% 2 == 0 ) {
      %%args = @_;
  }
  elsif ( @_ == 1 ) {
      if ( ref $_[0] ) {
          if ( Scalar::Util::blessed( $_[0] ) ) {
              if ( overload::Overloaded( $_[0] )
                  && defined overload::Method( $_[0], '%%{}' ) ) {
  
                  %%args = %%{ $_[0] };
              }
              else {
                  Params::ValidationCompiler::Exception::BadArguments->throw(
                      message =>
                          'Expected a hash or hash reference but a single object argument was passed to %s',
                      show_trace => 1,
                  );
              }
          }
          elsif ( ref $_[0] eq 'HASH' ) {
              %%args = %%{ $_[0] };
          }
          else {
              Params::ValidationCompiler::Exception::BadArguments->throw(
                  message =>
                      'Expected a hash or hash reference but a single '
                      . ( ref $_[0] )
                      . ' reference argument was passed to %s',
                  show_trace => 1,
              );
          }
      }
      else {
          Params::ValidationCompiler::Exception::BadArguments->throw(
              message =>
                  'Expected a hash or hash reference but a single non-reference argument was passed to %s',
              show_trace => 1,
          );
      }
  }
  else {
      Params::ValidationCompiler::Exception::BadArguments->throw(
          message =>
              'Expected a hash or hash reference but an odd number of arguments was passed to %s',
          show_trace => 1,
      );
  }
  EOF
  
      return;
  }
  
  sub _add_check_for_required_named_param {
      my $self   = shift;
      my $access = shift;
      my $name   = shift;
  
      my $qname = perlstring($name);
      push @{ $self->_source },
          sprintf( <<'EOF', $access, $qname, $self->_inlineable_name, $qname );
  exists %s
      or Params::ValidationCompiler::Exception::Named::Required->throw(
      message    => %s . ' is a required parameter for %s',
      parameter  => %s,
      show_trace => 1,
      );
  EOF
  
      return;
  }
  
  sub _add_check_for_extra_hash_param_types {
      my $self   = shift;
      my $type   = shift;
      my $params = shift;
  
      $self->_env->{'%known'}
          = { map { $_ => 1 } keys %{$params} };
  
      # We need to set the name argument to something that won't conflict with
      # names someone would actually use for a parameter.
      my $check = join q{}, $self->_type_check(
          '$args{$key}',
          '__PCC extra parameters__',
          $type,
      );
      push @{ $self->_source }, sprintf( <<'EOF', $check );
  for my $key ( grep { !$known{$_} } keys %%args ) {
      %s;
  }
  EOF
  
      return;
  }
  
  sub _add_check_for_extra_hash_params {
      my $self   = shift;
      my $params = shift;
  
      $self->_env->{'%known'}
          = { map { $_ => 1 } keys %{$params} };
      push @{ $self->_source }, sprintf( <<'EOF', $self->_inlineable_name );
  my @extra = grep { !$known{$_} } keys %%args;
  if (@extra) {
      my $u = join ', ', sort @extra;
      Params::ValidationCompiler::Exception::Named::Extra->throw(
          message    => "Found extra parameters passed to %s: [$u]",
          parameters => \@extra,
          show_trace => 1,
      );
  }
  EOF
  
      return;
  }
  
  sub _compile_positional_args_check {
      my $self = shift;
  
      my @specs = $self->_munge_and_check_positional_params;
  
      my $first_optional_idx = -1;
      for my $i ( 0 .. $#specs ) {
          next unless $specs[$i]{optional} || exists $specs[$i]{default};
          $first_optional_idx = $i;
          last;
      }
  
      # If optional params start anywhere after the first parameter spec then we
      # must require at least one param. If there are no optional params then
      # they're all required.
      $self->_add_check_for_required_positional_params(
          $first_optional_idx == -1
          ? ( scalar @specs )
          : $first_optional_idx
      ) if $first_optional_idx != 0;
  
      $self->_add_check_for_extra_positional_params( scalar @specs )
          unless $self->slurpy;
  
      my $access_var = '$_';
      my $return_var = '@_';
      if ( $self->_any_type_has_coercion ) {
          push @{ $self->_source }, 'my @copy = @_;';
          $access_var = '$copy';
          $return_var = '@copy';
      }
  
      for my $i ( 0 .. $#specs ) {
          my $spec = $specs[$i];
  
          my $name = "Parameter $i";
          my $access = sprintf( '%s[%i]', $access_var, $i );
  
          $self->_add_positional_default_assignment(
              $i,
              $access,
              $name,
              $spec->{default}
          ) if exists $spec->{default};
  
          $self->_add_type_check( $access, $name, $spec )
              if $spec->{type};
      }
  
      if ( ref $self->slurpy ) {
          $self->_add_check_for_extra_positional_param_types(
              scalar @specs,
              $self->slurpy,
              $access_var,
          );
      }
  
      push @{ $self->_source }, sprintf( 'return %s;', $return_var );
  
      return;
  }
  
  sub _munge_and_check_positional_params {
      my $self = shift;
  
      my @specs;
      my $in_optional = 0;
  
      for my $spec ( @{ $self->params } ) {
          $spec = ref $spec ? $spec : { optional => !$spec };
          if ( $spec->{optional} || exists $spec->{default} ) {
              $in_optional = 1;
          }
          elsif ($in_optional) {
              croak
                  'Parameter list contains an optional parameter followed by a required parameter.';
          }
  
          push @specs, $spec;
      }
  
      return @specs;
  }
  
  sub _add_check_for_required_positional_params {
      my $self = shift;
      my $min  = shift;
  
      push @{ $self->_source },
          sprintf( <<'EOF', ($min) x 2, $self->_inlineable_name, $min );
  if ( @_ < %d ) {
      my $got = scalar @_;
      my $got_n = @_ == 1 ? 'parameter' : 'parameters';
      Params::ValidationCompiler::Exception::Positional::Required->throw(
          message    => "Got $got $got_n but expected at least %d for %s",
          minimum    => %d,
          got        => scalar @_,
          show_trace => 1,
      );
  }
  EOF
  
      return;
  }
  
  sub _add_check_for_extra_positional_param_types {
      my $self       = shift;
      my $max        = shift;
      my $type       = shift;
      my $access_var = shift;
  
      # We need to set the name argument to something that won't conflict with
      # names someone would actually use for a parameter.
      my $check = join q{}, $self->_type_check(
          sprintf( '%s[$i]', $access_var ),
          '__PCC extra parameters__',
          $type,
      );
      push @{ $self->_source }, sprintf( <<'EOF', $max, $max, $check );
  if ( @_ > %d ) {
      for my $i ( %d .. $#_ ) {
          %s;
      }
  }
  EOF
  
      return;
  }
  
  sub _add_check_for_extra_positional_params {
      my $self = shift;
      my $max  = shift;
  
      push @{ $self->_source },
          sprintf( <<'EOF', ($max) x 2, $self->_inlineable_name, $max );
  if ( @_ > %d ) {
      my $extra = @_ - %d;
      my $extra_n = $extra == 1 ? 'parameter' : 'parameters';
      Params::ValidationCompiler::Exception::Positional::Extra->throw(
          message    => "Got $extra extra $extra_n for %s",
          maximum    => %d,
          got        => scalar @_,
          show_trace => 1,
      );
  }
  EOF
  
      return;
  }
  
  sub _add_positional_default_assignment {
      my $self     = shift;
      my $position = shift;
      my $access   = shift;
      my $name     = shift;
      my $default  = shift;
  
      push @{ $self->_source }, "if ( \$#_ < $position ) {";
      $self->_add_shared_default_assignment( $access, $name, $default );
      push @{ $self->_source }, '}';
  
      return;
  }
  
  sub _add_named_default_assignment {
      my $self    = shift;
      my $access  = shift;
      my $name    = shift;
      my $default = shift;
  
      my $qname = perlstring($name);
      push @{ $self->_source }, "unless ( exists \$args{$qname} ) {";
      $self->_add_shared_default_assignment( $access, $name, $default );
      push @{ $self->_source }, '}';
  
      return;
  }
  
  sub _add_shared_default_assignment {
      my $self    = shift;
      my $access  = shift;
      my $name    = shift;
      my $default = shift;
  
      my $qname = perlstring($name);
  
      croak 'Default must be either a plain scalar or a subroutine reference'
          if ref $default && reftype($default) ne 'CODE';
  
      if ( ref $default ) {
          push @{ $self->_source }, "$access = \$defaults{$qname}->();";
          $self->_env->{'%defaults'}{$name} = $default;
      }
      else {
          if ( defined $default ) {
              if ( looks_like_number($default) ) {
                  push @{ $self->_source }, "$access = $default;";
              }
              else {
                  push @{ $self->_source },
                      "$access = " . perlstring($default) . ';';
              }
          }
          else {
              push @{ $self->_source }, "$access = undef;";
          }
      }
  
      return;
  }
  
  sub _add_type_check {
      my $self   = shift;
      my $access = shift;
      my $name   = shift;
      my $spec   = shift;
  
      my $type = $spec->{type};
      croak "Passed a type that is not an object for $name: $type"
          unless blessed $type;
  
      push @{ $self->_source }, sprintf( 'if ( exists %s ) {', $access )
          if $spec->{optional};
  
      push @{ $self->_source },
          $self->_type_check( $access, $name, $spec->{type} );
  
      push @{ $self->_source }, '}'
          if $spec->{optional};
  
      return;
  }
  
  sub _type_check {
      my $self   = shift;
      my $access = shift;
      my $name   = shift;
      my $type   = shift;
  
      # Specio
      return $type->can('can_inline_coercion_and_check')
          ? $self->_add_specio_check( $access, $name, $type )
  
          # Type::Tiny
          : $type->can('inline_assert')
          ? $self->_add_type_tiny_check( $access, $name, $type )
  
          # Moose
          : $type->can('can_be_inlined')
          ? $self->_add_moose_check( $access, $name, $type )
          : croak 'Unknown type object ' . ref $type;
  }
  
  # From reading through the Type::Tiny source, I can't see any cases where a
  # Type::Tiny type or coercion needs to provide any environment variables to
  # compile with.
  sub _add_type_tiny_check {
      my $self   = shift;
      my $access = shift;
      my $name   = shift;
      my $type   = shift;
  
      my $qname = perlstring($name);
  
      my @source;
      if ( $type->has_coercion ) {
          my $coercion = $type->coercion;
          if ( $coercion->can_be_inlined ) {
              push @source,
                  "$access = " . $coercion->inline_coercion($access) . ';';
          }
          else {
              $self->_env->{'%tt_coercions'}{$name}
                  = $coercion->compiled_coercion;
              push @source,
                  sprintf(
                  '%s = $tt_coercions{%s}->( %s );',
                  $access, $qname, $access,
                  );
          }
      }
  
      if ( $type->can_be_inlined ) {
          push @source,
              $type->inline_assert($access);
      }
      else {
          push @source,
              sprintf(
              '$types{%s}->assert_valid( %s );',
              $qname, $access,
              );
          $self->_env->{'%types'}{$name} = $type;
      }
  
      return @source;
  }
  
  sub _add_specio_check {
      my $self   = shift;
      my $access = shift;
      my $name   = shift;
      my $type   = shift;
  
      my $qname = perlstring($name);
  
      my @source;
  
      if ( $type->can_inline_coercion_and_check ) {
          if ( $type->has_coercions ) {
              my ( $source, $env ) = $type->inline_coercion_and_check($access);
              push @source, sprintf( '%s = %s;', $access, $source );
              $self->_add_to_environment(
                  sprintf(
                      'The inline_coercion_and_check for %s ',
                      $type->_description
                  ),
                  $env,
              );
          }
          else {
              my ( $source, $env ) = $type->inline_assert($access);
              push @source, $source . ';';
              $self->_add_to_environment(
                  sprintf(
                      'The inline_assert for %s ',
                      $type->_description
                  ),
                  $env,
              );
          }
      }
      else {
          my @coercions = $type->coercions;
          $self->_env->{'%specio_coercions'}{$name} = \@coercions;
          for my $i ( 0 .. $#coercions ) {
              my $c = $coercions[$i];
              if ( $c->can_be_inlined ) {
                  push @source,
                      sprintf(
                      '%s = %s if %s;',
                      $access,
                      $c->inline_coercion($access),
                      $c->from->inline_check($access)
                      );
                  $self->_add_to_environment(
                      sprintf(
                          'The inline_coercion for %s ',
                          $c->_description
                      ),
  
                      # This should really be public in Specio
                      $c->_inline_environment,
                  );
              }
              else {
                  push @source,
                      sprintf(
                      '%s = $specio_coercions{%s}[%s]->coerce(%s) if $specio_coercions{%s}[%s]->from->value_is_valid(%s);',
                      $access,
                      $qname,
                      $i,
                      $access,
                      $qname,
                      $i,
                      $access
                      );
              }
          }
  
          push @source,
              sprintf(
              '$types{%s}->validate_or_die(%s);',
              $qname, $access,
              );
  
          $self->_env->{'%types'}{$name} = $type;
      }
  
      return @source;
  }
  
  sub _add_moose_check {
      my $self   = shift;
      my $access = shift;
      my $name   = shift;
      my $type   = shift;
  
      my $qname = perlstring($name);
  
      my @source;
  
      if ( $type->has_coercion ) {
          $self->_env->{'%moose_coercions'}{$name} = $type->coercion;
          push @source,
              sprintf(
              '%s = $moose_coercions{%s}->coerce( %s );',
              $access, $qname, $access,
              );
      }
  
      $self->_env->{'%types'}{$name} = $type;
  
      my $code = <<'EOF';
  if ( !%s ) {
      my $type  = $types{%s};
      my $param = %s;
      my $value = %s;
      my $msg   = $param . q{ failed with: } . $type->get_message($value);
      die
          Params::ValidationCompiler::Exception::ValidationFailedForMooseTypeConstraint
          ->new(
          message   => $msg,
          parameter => $param,
          value     => $value,
          type      => $type,
          );
  }
  EOF
  
      my $check
          = $type->can_be_inlined
          ? $type->_inline_check($access)
          : sprintf( '$types{%s}->check( %s )', $qname, $access );
  
      push @source, sprintf(
          $code,
          $check,
          $qname,
          $qname,
          $access,
      );
  
      if ( $type->can_be_inlined ) {
          $self->_add_to_environment(
              sprintf( 'The %s type', $type->name ),
              $type->inline_environment,
          );
      }
  
      return @source;
  }
  
  sub _add_to_environment {
      my $self    = shift;
      my $what    = shift;
      my $new_env = shift;
  
      my $env = $self->_env;
      for my $key ( keys %{$new_env} ) {
          if ( exists $env->{$key} ) {
              croak sprintf(
                        '%s has an inline environment variable named %s'
                      . ' that conflicts with a variable already in the environment',
                  $what, $key
              );
          }
          $self->_env->{$key} = $new_env->{$key};
      }
  }
  
  1;
  
  # ABSTRACT: Object that implements the check subroutine compilation
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Params::ValidationCompiler::Compiler - Object that implements the check subroutine compilation
  
  =head1 VERSION
  
  version 0.30
  
  =for Pod::Coverage .*
  
  =head1 SUPPORT
  
  Bugs may be submitted at L<https://github.com/houseabsolute/Params-ValidationCompiler/issues>.
  
  I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
  
  =head1 SOURCE
  
  The source code repository for Params-ValidationCompiler can be found at L<https://github.com/houseabsolute/Params-ValidationCompiler>.
  
  =head1 AUTHOR
  
  Dave Rolsky <autarch@urth.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is Copyright (c) 2016 - 2018 by Dave Rolsky.
  
  This is free software, licensed under:
  
    The Artistic License 2.0 (GPL Compatible)
  
  The full text of the license can be found in the
  F<LICENSE> file included with this distribution.
  
  =cut
PARAMS_VALIDATIONCOMPILER_COMPILER

    $main::fatpacked{"Params/ValidationCompiler/Exceptions.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PARAMS_VALIDATIONCOMPILER_EXCEPTIONS';
  package Params::ValidationCompiler::Exceptions;
  
  use strict;
  use warnings;
  
  our $VERSION = '0.30';
  
  use Exception::Class (
      'Params::ValidationCompiler::Exception::BadArguments',
      'Params::ValidationCompiler::Exception::Named::Extra' => {
          fields => ['parameters'],
      },
      'Params::ValidationCompiler::Exception::Named::Required' => {
          fields => ['parameter'],
      },
      'Params::ValidationCompiler::Exception::Positional::Extra' => {
          fields => [ 'got', 'maximum' ],
      },
      'Params::ValidationCompiler::Exception::Positional::Required' => {
          fields => [ 'got', 'minimum' ],
      },
      'Params::ValidationCompiler::Exception::ValidationFailedForMooseTypeConstraint'
          => {
          fields => [qw( parameter value type )],
          },
  );
  
  1;
  
  # ABSTRACT: Defines exceptions thrown by Params::ValidationCompiler
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Params::ValidationCompiler::Exceptions - Defines exceptions thrown by Params::ValidationCompiler
  
  =head1 VERSION
  
  version 0.30
  
  =head1 DESCRIPTION
  
  This module defines the following exceptions:
  
  =head2 Params::ValidationCompiler::Exception::BadArguments
  
  Exception thrown when @_ does not contain a hash or hashref.
  
  =head2 Params::ValidationCompiler::Exception::Named::Extra
  
  Exception thrown when @_ contains unexpected extra named arguments.
  
  =head2 Params::ValidationCompiler::Exception::Named::Required
  
  Exception thrown when a required named parameter is not passed.
  
  =head2 Params::ValidationCompiler::Exception::Positional::Extra
  
  Exception thrown when @_ contains unexpected extra arguments.
  
  =head2 Params::ValidationCompiler::Exception::Positional::Required
  
  Exception thrown when a required positional parameter is not passed.
  
  =head2 Params::ValidationCompiler::Exception::ValidationFailedForMooseTypeConstraint
  
  Exception thrown when a Moose type constraint check fails. This class provides
  the following methods:
  
  =head3 $e->parameter
  
  This returns a string describing the parameter, something like C<The 'foo'
  parameter> or C<Parameter #1>.
  
  =head3 $e->value
  
  This is the value that failed the type constraint check.
  
  =head3 $e->type
  
  This is the type constraint object that did not accept the value.
  
  =head1 SUPPORT
  
  Bugs may be submitted at L<https://github.com/houseabsolute/Params-ValidationCompiler/issues>.
  
  I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
  
  =head1 SOURCE
  
  The source code repository for Params-ValidationCompiler can be found at L<https://github.com/houseabsolute/Params-ValidationCompiler>.
  
  =head1 AUTHOR
  
  Dave Rolsky <autarch@urth.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is Copyright (c) 2016 - 2018 by Dave Rolsky.
  
  This is free software, licensed under:
  
    The Artistic License 2.0 (GPL Compatible)
  
  The full text of the license can be found in the
  F<LICENSE> file included with this distribution.
  
  =cut
PARAMS_VALIDATIONCOMPILER_EXCEPTIONS

    $main::fatpacked{"Parse/VarName.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PARSE_VARNAME';
  package Parse::VarName;
  
  our $DATE = '2016-06-14'; # DATE
  our $VERSION = '0.03'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  use Exporter qw(import);
  our @EXPORT_OK = qw(split_varname_words);
  
  our %SPEC;
  
  $SPEC{':package'} = {
      v => 1.1,
      summary => 'Routines to parse variable name',
  };
  
  # cannot be put inside sub, warning "Variable %s will not stay shared"
  my @res;
  
  $SPEC{split_varname_words} = {
      v => 1.1,
      summary => 'Split words found in variable name',
      description => <<'_',
  
  Try to split words found in a variable name, e.g. mTime -> [m, Time], foo1Bar ->
  [foo, 1, Bar], Foo::barBaz::Qux2 -> [Foo, bar, Baz, Qux, 2].
  
  _
      args => {
          varname => {
              schema => 'str*',
              req => 1,
              pos => 1,
          },
          include_sep => {
              summary => 'Whether to include non-alphanum separator in result',
              description => <<'_',
  
  For example, under include_sep=true, Foo::barBaz::Qux2 -> [Foo, ::, bar, Baz,
  ::, Qux, 2].
  
  _
              schema => [bool => {default=>0}],
          },
      },
      result_naked => 1,
  };
  sub split_varname_words {
      my %args = @_;
      my $v = $args{varname} or return [400, "Please specify varname"];
  
      #no warnings;
      @res = ();
      $v =~ m!\A(?:
                  (
                      [A-Z][A-Z]+ |
                      [A-Z][a-z]+ |
                      [a-z]+ |
                      [0-9]+ |
                      [^A-Za-z0-9]+
                  )
                  (?{ push @res, $1 })
              )+\z!sxg
                  or return [];
      unless ($args{include_sep}) {
          @res = grep {/[A-Za-z0-9]/} @res;
      }
  
      \@res;
  }
  
  1;
  # ABSTRACT: Routines to parse variable name
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Parse::VarName - Routines to parse variable name
  
  =head1 VERSION
  
  This document describes version 0.03 of Parse::VarName (from Perl distribution Parse-VarName), released on 2016-06-14.
  
  =head1 FUNCTIONS
  
  
  =head2 split_varname_words(%args) -> any
  
  Split words found in variable name.
  
  Try to split words found in a variable name, e.g. mTime -> [m, Time], foo1Bar ->
  [foo, 1, Bar], Foo::barBaz::Qux2 -> [Foo, bar, Baz, Qux, 2].
  
  This function is not exported by default, but exportable.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<include_sep> => I<bool> (default: 0)
  
  Whether to include non-alphanum separator in result.
  
  For example, under include_sep=true, Foo::barBaz::Qux2 -> [Foo, ::, bar, Baz,
  ::, Qux, 2].
  
  =item * B<varname>* => I<str>
  
  =back
  
  Return value:  (any)
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Parse-VarName>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Parse-VarName>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Parse-VarName>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
PARSE_VARNAME

    $main::fatpacked{"Perinci/Access.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PERINCI_ACCESS';
  package Perinci::Access;
  
  our $DATE = '2017-07-10'; # DATE
  our $VERSION = '0.45'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  use Log::ger;
  
  use Scalar::Util qw(blessed);
  use URI::Split qw(uri_split uri_join);
  
  our $Log_Request  = $ENV{LOG_RIAP_REQUEST}  // 0;
  our $Log_Response = $ENV{LOG_RIAP_RESPONSE} // 0;
  
  sub new {
      my ($class, %opts) = @_;
  
      $opts{riap_version}           //= 1.1;
      $opts{handlers}               //= {};
      $opts{handlers}{''}           //= 'Perinci::Access::Schemeless';
      $opts{handlers}{pl}           //= 'Perinci::Access::Perl';
      $opts{handlers}{http}         //= 'Perinci::Access::HTTP::Client';
      $opts{handlers}{https}        //= 'Perinci::Access::HTTP::Client';
      $opts{handlers}{'riap+tcp'}   //= 'Perinci::Access::Simple::Client';
      $opts{handlers}{'riap+unix'}  //= 'Perinci::Access::Simple::Client';
      $opts{handlers}{'riap+pipe'}  //= 'Perinci::Access::Simple::Client';
  
      $opts{_handler_objs}          //= {};
      bless \%opts, $class;
  }
  
  sub _request_or_parse_url {
      my $self = shift;
      my $which = shift;
  
      my ($action, $uri, $extra, $copts);
      if ($which eq 'request') {
          ($action, $uri, $extra, $copts) = @_;
      } else {
          ($uri, $copts) = @_;
      }
  
      my ($sch, $auth, $path, $query, $frag) = uri_split($uri);
      $sch //= "";
      die "Can't handle scheme '$sch' in URL" unless $self->{handlers}{$sch};
  
      # convert riap://perl/Foo/Bar to pl:/Foo/Bar/ as Perl only accepts pl
      if ($sch eq 'riap') {
          $auth //= '';
          die "Unsupported auth '$auth' in riap: scheme, ".
              "only 'perl' is supported" unless $auth eq 'perl';
          $sch = 'pl';
          $auth = undef;
          $uri = uri_join($sch, $auth, $path, $query, $frag);
      }
  
      unless ($self->{_handler_objs}{$sch}) {
          if (blessed($self->{handlers}{$sch})) {
              $self->{_handler_objs}{$sch} = $self->{handlers}{$sch};
          } else {
              my $modp = $self->{handlers}{$sch};
              $modp =~ s!::!/!g; $modp .= ".pm";
              require $modp;
              #$log->tracef("TMP: Creating Riap client object for schema %s with args %s", $sch, $self->{handler_args});
              $self->{_handler_objs}{$sch} = $self->{handlers}{$sch}->new(
                  riap_version => $self->{riap_version},
                  %{ $self->{handler_args} // {}});
          }
      }
  
      my $res;
      if ($which eq 'request') {
          if ($Log_Request && log_is_trace()) {
              log_trace(
                  "Riap request (%s): %s -> %s (%s)",
                  ref($self->{_handler_objs}{$sch}),
                  $action, $uri, $extra, $copts);
          }
          $res = $self->{_handler_objs}{$sch}->request(
              $action, $uri, $extra, $copts);
          if ($Log_Response && log_is_trace()) {
              log_trace("Riap response: %s", $res);
          }
      } else {
          $res = $self->{_handler_objs}{$sch}->parse_url($uri, $copts);
      }
      $res;
  }
  
  sub request {
      my $self = shift;
      $self->_request_or_parse_url('request', @_);
  }
  
  sub parse_url {
      my $self = shift;
      $self->_request_or_parse_url('parse_url', @_);
  }
  
  1;
  # ABSTRACT: Wrapper for Perinci Riap clients
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Perinci::Access - Wrapper for Perinci Riap clients
  
  =head1 VERSION
  
  This document describes version 0.45 of Perinci::Access (from Perl distribution Perinci-Access), released on 2017-07-10.
  
  =head1 SYNOPSIS
  
   use Perinci::Access;
  
   my $pa = Perinci::Access->new;
   my $res;
  
   ### launching Riap request
  
   # use Perinci::Access::Perl
   $res = $pa->request(call => "pl:/Mod/SubMod/func");
  
   # use Perinci::Access::Schemeless
   $res = $pa->request(call => "/Mod/SubMod/func");
  
   # use Perinci::Access::HTTP::Client
   $res = $pa->request(info => "http://example.com/Sub/ModSub/func",
                       {uri=>'/Sub/ModSub/func'});
  
   # use Perinci::Access::Simple::Client
   $res = $pa->request(meta => "riap+tcp://localhost:7001/Sub/ModSub/");
  
   # dies, unknown scheme
   $res = $pa->request(call => "baz://example.com/Sub/ModSub/");
  
   ### parse URI
  
   $res = $pa->parse_url("/Foo/bar");                              # {proto=>'pl', path=>"/Foo/bar"}
   $res = $pa->parse_url("pl:/Foo/bar");                           # ditto
   $res = $pa->parse_url("riap+unix:/var/run/apid.sock//Foo/bar"); # {proto=>'riap+unix', path=>"/Foo/bar", unix_sock_path=>"/var/run/apid.sock"}
   $res = $pa->parse_url("riap+tcp://localhost:7001/Sub/ModSub/"); # {proto=>'riap+tcp', path=>"/Sub/ModSub/", host=>"localhost", port=>7001}
   $res = $pa->parse_url("http://cpanlists.org/api/");             # {proto=>'http', path=>"/App/cpanlists/Server/"} # will perform an 'info' Riap request to the server first
  
  =head1 DESCRIPTION
  
  This module provides a convenient wrapper to select appropriate Riap client
  (Perinci::Access::*) objects based on URI scheme.
  
   /Foo/Bar/             -> Perinci::Access::Schemeless
   pl:/Foo/Bar           -> Perinci::Access::Perl
   riap://perl/Foo/Bar/  -> Perinci::Access::Perl (converted to pl:/Foo/Bar/)
   http://...            -> Perinci::Access::HTTP::Client
   https://...           -> Perinci::Access::HTTP::Client
   riap+tcp://...        -> Perinci::Access::Simple::Client
   riap+unix://...       -> Perinci::Access::Simple::Client
   riap+pipe://...       -> Perinci::Access::Simple::Client
  
  For more details on each scheme, please consult the appropriate module.
  
  You can customize or add supported schemes by providing class name or object to
  the B<handlers> attribute (see its documentation for more details).
  
  =head1 VARIABLES
  
  =head2 $Log_Request (BOOL)
  
  Whether to log every Riap request. Default is from environment variable
  LOG_RIAP_REQUEST, or false. Logging is done with L<Log::ger> at trace level.
  
  =head2 $Log_Response (BOOL)
  
  Whether to log every Riap response. Default is from environment variable
  LOG_RIAP_RESPONSE, or false. Logging is done with L<Log::ger> at trace level.
  
  =head1 METHODS
  
  =head2 new(%opts) -> OBJ
  
  Create new instance. Known options:
  
  =over 4
  
  =item * handlers => HASH
  
  A mapping of scheme names and class names or objects. If values are class names,
  they will be require'd and instantiated. The default is:
  
   {
     ''           => 'Perinci::Access::Schemeless',
     pl           => 'Perinci::Access::Perl',
     http         => 'Perinci::Access::HTTP::Client',
     https        => 'Perinci::Access::HTTP::Client',
     'riap+tcp'   => 'Perinci::Access::Simple::Client',
     'riap+unix'  => 'Perinci::Access::Simple::Client',
     'riap+pipe'  => 'Perinci::Access::Simple::Client',
   }
  
  Objects can be given instead of class names. This is used if you need to pass
  special options when instantiating the class.
  
  =item * handler_args => HASH
  
  Arguments to pass to handler objects' constructors.
  
  =back
  
  =head2 $pa->request($action, $server_url[, \%extra_keys[, \%client_opts]]) -> RESP
  
  Send Riap request to Riap server. Pass the request to the appropriate Riap
  client (as configured in C<handlers> constructor options). RESP is the enveloped
  result.
  
  C<%extra_keys> is optional, containing Riap request keys (the C<action> request
   key is taken from C<$action>).
  
  C<%client_opts> is optional, containing Riap-client-specific options. For
  example, to pass HTTP credentials to C<Perinci::Access::HTTP::Client>, you can
  do:
  
   $pa->request(call => 'http://example.com/Foo/bar', {args=>{a=>1}},
                {user=>'admin', password=>'secret'});
  
  =head2 $pa->parse_url($server_url[, \%client_opts]) => HASH
  
  Parse C<$server_url> into its components. Will be done by respective subclasses.
  Die on failure (e.g. invalid URL). Return a hash on success, containing at least
  these keys:
  
  =over
  
  =item * proto => STR
  
  =item * path => STR
  
  Code entity path. Most URL schemes include the code entity path as part of the
  URL, e.g. C<pl>, C<riap+unix>, C<riap+tcp>, or C<riap+pipe>. Some do not, e.g.
  C<http> and C<https>. For the latter case, an C<info> Riap request will be sent
  to the server first to find out the code entity path .
  
  =back
  
  Subclasses will add other appropriate keys.
  
  =head1 ENVIRONMENT
  
  LOG_RIAP_REQUEST
  
  LOG_RIAP_RESPONSE
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Perinci-Access>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Perinci-Access>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Perinci-Access>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Perinci::Access::Schemeless>
  
  L<Perinci::Access::Perl>
  
  L<Perinci::Access::HTTP::Client>
  
  L<Perinci::Access::Simple::Client>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2017, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
PERINCI_ACCESS

    $main::fatpacked{"Perinci/Access/Base.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PERINCI_ACCESS_BASE';
  package Perinci::Access::Base;
  
  use 5.010001;
  use strict;
  use warnings;
  
  use URI::Split qw(uri_split);
  
  our $VERSION = '0.33'; # VERSION
  
  sub new {
      my ($class, %opts) = @_;
      $opts{riap_version} //= 1.1;
      bless \%opts, $class;
  }
  
  our $re_var     = qr/\A[A-Za-z_][A-Za-z_0-9]*\z/;
  our $re_req_key = $re_var;
  our $re_action  = $re_var;
  
  # do some basic sanity checks on request
  sub check_request {
      my ($self, $req) = @_;
  
      # XXX schema
      #$req //= {};
      #return [400, "Invalid req: must be hashref"]
      #    unless ref($req) eq 'HASH';
  
      # skipped for squeezing out performance
      #for my $k (keys %$req) {
      #    return [400, "Invalid request key '$k', ".
      #                "please only use letters/numbers"]
      #        unless $k =~ $re_req_key;
      #}
  
      $req->{v} //= 1.1;
      return [500, "Protocol version not supported"]
          if $req->{v} ne '1.1' && $req->{v} ne '1.2';
  
      my $action = $req->{action};
      return [400, "Please specify action"] unless $action;
      return [400, "Invalid action, please only use letters/numbers"]
          unless $action =~ $re_action;
  
      if (defined $req->{uri}) {
          ($req->{-uri_scheme}, $req->{-uri_auth}, $req->{-uri_path},
           $req->{-uri_query}, $req->{-uri_frag}) = uri_split($req->{uri});
      }
  
      # return success for further processing
      0;
  }
  
  1;
  # ABSTRACT: Base class for all Perinci Riap clients
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Perinci::Access::Base - Base class for all Perinci Riap clients
  
  =head1 VERSION
  
  This document describes version 0.33 of Perinci::Access::Base (from Perl distribution Perinci-Access-Base), released on 2015-09-06.
  
  =head1 DESCRIPTION
  
  This is a thin base class for all Riap clients (C<Perinci::Access::*>). It
  currently only provides check_request() which does the following:
  
  =over
  
  =item * perform some basic sanity checking of the Riap request hash C<$req>
  
  =item * split request keys C<uri>
  
  Split result is put in C<< $req->{-uri_scheme} >>, C<< $req->{-uri_auth} >>, C<<
  $req->{-uri_path} >>, C<< $req->{-uri_query} >>, and C<< $req->{-uri_frag} >>.
  
  =back
  
  =head1 ATTRIBUTES
  
  =head2 riap_version => float (default: 1.1)
  
  =head1 METHODS
  
  =head2 new(%args) => OBJ
  
  Constructor. Does nothing except creating a blessed hashref from C<%args>.
  Subclasses should override this method and do additional stuffs as needed.
  
  =head2 check_request($req) => RESP|undef
  
  Should be called by subclasses during the early phase in C<request()>. Will
  return an enveloped error response on error, or undef on success.
  
  =head1 SEE ALSO
  
  L<Perinci::Access>
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Perinci-Access-Base>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/sharyanto/perl-Perinci-Access-Base>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Perinci-Access-Base>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2015 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
PERINCI_ACCESS_BASE

    $main::fatpacked{"Perinci/Access/HTTP/Client.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PERINCI_ACCESS_HTTP_CLIENT';
  package Perinci::Access::HTTP::Client;
  
  our $DATE = '2017-07-03'; # DATE
  our $VERSION = '0.24'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  use experimental 'smartmatch';
  use Log::ger;
  
  use Perinci::AccessUtil qw(strip_riap_stuffs_from_res);
  use Scalar::Util qw(blessed);
  
  use parent qw(Perinci::Access::Base);
  
  my @logging_levels = keys %Log::ger::Levels;
  
  sub new {
      my $class = shift;
  
      my $self = $class->SUPER::new(@_);
  
      # attributes
      $self->{retries}         //= 2;
      $self->{retry_delay}     //= 3;
      unless (defined $self->{log_level}) {
          $self->{log_level} =
              $ENV{TRACE} ? 6 :
                  $ENV{DEBUG} ? 5 :
                      $ENV{VERBOSE} ? 4 :
                          $ENV{QUIET} ? 2 :
                              0;
      }
      $self->{log_callback}    //= undef;
      $self->{ssl_cert_file}   //= $ENV{SSL_CERT_FILE};
      $self->{ssl_ca_file}     //= $ENV{SSL_CA_FILE};
      $self->{user}            //= $ENV{PERINCI_HTTP_USER};
      $self->{password}        //= $ENV{PERINCI_HTTP_PASSWORD};
  
      $self;
  }
  
  # for older Perinci::Access::Base 0.28-, to remove later
  sub _init {}
  
  sub request {
      my ($self, $action, $server_url, $extra, $copts) = @_;
      $extra //= {};
      $copts //= {};
      log_trace(
          "=> %s\::request(action=%s, server_url=%s, extra=%s)",
          __PACKAGE__, $action, $server_url, $extra);
      return [400, "Please specify server_url"] unless $server_url;
      my $rreq = { v=>$self->{riap_version},
                   action=>$action,
                   ua=>"Perinci/".($Perinci::Access::HTTP::Client::VERSION//"?"),
                   %$extra };
      my $res = $self->check_request($rreq);
      return $res if $res;
  
      state $json = do {
          require JSON::MaybeXS;
          JSON::MaybeXS->new->allow_nonref;
      };
  
      state $ua;
      state $callback = sub {
          my ($resp, $ua, $h, $data) = @_;
  
          # we collect HTTP response body into __buffer first. if __mark is set
          # then we need to separate each log message and response part.
          # otherwise, everything just needs to go to __body.
  
          #$log->tracef("got resp: %s (%d bytes)", $data, length($data));
          #say sprintf("D:got resp: %s (%d bytes)", $data, length($data));
  
          if ($ua->{__mark}) {
              $ua->{__buffer} .= $data;
              if ($ua->{__buffer} =~ /\A([lr])(\d+) /) {
                  my ($chtype, $chlen) = ($1, $2);
                  # not enough data yet
                  my $hlen = 1+length($chlen)+1;
                  return 1 unless length($ua->{__buffer}) >= $hlen + $chlen;
                  my $chdata = substr($ua->{__buffer}, $hlen, $chlen);
                  substr($ua->{__buffer}, 0, $hlen+$chlen) = "";
                  if ($chtype eq 'l') {
                      if ($self->{log_callback}) {
                          $self->{log_callback}->($chdata);
                      } else {
                          $chdata =~ s/^\[(\w+)\]//;
                          my $level = $1;
                          $level = "error" unless $level ~~ @logging_levels;
                          my $logger_name = "log_$level";
                          no strict 'refs';
                          &{$logger_name}("[$server_url] $chdata");
                      }
                      return 1;
                  } elsif ($chtype eq 'r') {
                      $ua->{__body} .= $chdata;
                  } else {
                      $ua->{__body} = "[500,\"Unknown chunk type $chtype".
                          "try updating ${\(__PACKAGE__)} version\"]";
                      return 0;
                  }
              } else {
                  $ua->{__body} = "[500,\"Invalid response from server,".
                      " server is probably using older version of ".
                          "Riap::HTTP server library\"]";
                  return 0;
              }
          } else {
              $ua->{__body} .= $data;
          }
      };
  
      if (!$ua) {
          require LWP::UserAgent;
          $ua = LWP::UserAgent->new(
              ssl_opts => {
                  SSL_cert_file => $self->{ssl_cert_file},
                  SSL_ca_file   => $self->{ssl_ca_file},
              },
          );
          $ua->env_proxy;
          $ua->set_my_handler(
              "request_send", sub {
                  my ($req, $ua, $h) = @_;
                  $ua->{__buffer} = "";
                  $ua->{__body} = "";
              });
          $ua->set_my_handler(
              "response_header", sub {
                  my ($resp, $ua, $h) = @_;
                  if ($resp->header('x-riap-logging')) {
                      $ua->{__mark} = 1;
                  } else {
                      $ua->{__log_level} = 0;
                  }
              });
          $ua->set_my_handler(
              "response_data", $callback);
      }
  
      my $authuser = $copts->{user}     // $self->{user};
      my $authpass = $copts->{password} // $self->{password};
      if (defined $authuser) {
          require URI;
          my $suri = URI->new($server_url);
          my $host = $suri->host;
          my $port = $suri->port;
          $ua->credentials(
              "$host:$port",
              $self->{realm} // "restricted area",
              $authuser,
              $authpass,
          );
      }
  
      my $http_req = HTTP::Request->new(POST => $server_url);
      for (keys %$rreq) {
          next if /\A(?:args|fmt|loglevel|_.*)\z/;
          my $hk = "x-riap-$_";
          my $hv = $rreq->{$_};
          if (!defined($hv) || ref($hv)) {
              $hk = "$hk-j-";
              $hv = $json->encode($hv);
          }
          $http_req->header($hk => $hv);
      }
      $ua->{__log_level} = $self->{log_level};
      $http_req->header('x-riap-loglevel' => $ua->{__log_level});
      $http_req->header('x-riap-fmt'      => 'json');
  
      my %args;
      if ($rreq->{args}) {
          for (keys %{$rreq->{args}}) {
              $args{$_} = $rreq->{args}{$_};
          }
      }
      my $args_s = $json->encode(\%args);
      $http_req->header('Content-Type' => 'application/json');
      $http_req->header('Content-Length' => length($args_s));
      $http_req->content($args_s);
  
      #use Data::Dump; dd $http_req;
  
      my $custom_lwp_imp;
      if ($server_url =~ m!\Ahttps?:/[^/]!i) { # XXX we don't support https, rite?
          require LWP::Protocol::http::SocketUnixAlt;
          $custom_lwp_imp = "LWP::Protocol::http::SocketUnixAlt";
      }
  
      my $attempts = 0;
      my $do_retry;
      my $http_res;
      while (1) {
          $do_retry = 0;
  
          my $old_imp;
          if ($custom_lwp_imp) {
              $old_imp = LWP::Protocol::implementor("http");
              LWP::Protocol::implementor("http", $custom_lwp_imp);
          }
  
          eval { $http_res = $ua->request($http_req) };
          my $eval_err = $@;
  
          if ($old_imp) {
              LWP::Protocol::implementor("http", $old_imp);
          }
  
          return [500, "Client died: $eval_err"] if $eval_err;
  
          if ($http_res->code >= 500) {
              log_warn("Network failure (%d - %s), retrying ...",
                          $http_res->code, $http_res->message);
              $do_retry++;
          }
  
          if ($do_retry && $attempts++ < $self->{retries}) {
              sleep $self->{retry_delay};
          } else {
              last;
          }
      }
  
      return [500, "Network failure: ".$http_res->code." - ".$http_res->message]
          unless $http_res->is_success;
  
      # empty __buffer
      $callback->($http_res, $ua, undef, "") if length($ua->{__buffer});
  
      return [500, "Empty response from server (1)"]
          if !length($http_res->content);
      return [500, "Empty response from server (2)"]
          unless length($ua->{__body});
  
      eval {
          #say "D:body=$ua->{__body}";
          log_trace("body: %s", $ua->{__body});
          $res = $json->decode($ua->{__body});
      };
      my $eval_err = $@;
      return [500, "Invalid JSON from server: $eval_err"] if $eval_err;
  
      #use Data::Dump; dd $res;
      strip_riap_stuffs_from_res($res);
  }
  
  sub parse_url {
      require URI::Split;
  
      my ($self, $uri, $copts) = @_;
      die "Please specify url" unless $uri;
  
      my $res = $self->request(info => $uri, {}, $copts);
      die "Can't 'info' on $uri: $res->[0] - $res->[1]" unless $res->[0] == 200;
  
      my $resuri = $res->[2]{uri};
      my ($sch, $auth, $path) = URI::Split::uri_split($resuri);
      $sch //= "pl";
  
      {proto=>$sch, path=>$path};
  }
  
  1;
  # ABSTRACT: Riap::HTTP client
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Perinci::Access::HTTP::Client - Riap::HTTP client
  
  =head1 VERSION
  
  This document describes version 0.24 of Perinci::Access::HTTP::Client (from Perl distribution Perinci-Access-HTTP-Client), released on 2017-07-03.
  
  =head1 SYNOPSIS
  
   use Perinci::Access::HTTP::Client;
   my $pa = Perinci::Access::HTTP::Client->new;
  
   ## perform Riap requests
  
   # list all functions in package
   my $res = $pa->request(list => 'http://localhost:5000/api/',
                          {uri=>'/Some/Module/', type=>'function'});
   # -> [200, "OK", ['/Some/Module/mult2', '/Some/Module/mult2']]
  
   # call function
   $res = $pa->request(call => 'http://localhost:5000/api/',
                       {uri=>'/Some/Module/mult2', args=>{a=>2, b=>3}});
   # -> [200, "OK", 6]
  
   # get function metadata
   $res = $pa->request(meta => 'http://localhost:5000/api/',
                       {uri=>'/Foo/Bar/multn'});
   # -> [200, "OK", {v=>1.1, summary=>'Multiple many numbers', ...}]
  
   # pass HTTP credentials (via object attribute)
   my $pa = Perinci::Access::HTTP::Client->new(user => 'admin', password=>'123');
   my $res = $pa->request(call => '...', {...});
   # -> [200, "OK", 'result']
  
   # HTTP credentials can also be passed on a per-request basis
   my $pa = Perinci::Access::HTTP::Client->new();
   my $res = $pa->request(call => '...', {...}, {user=>'admin', password=>'123'});
  
   ## parse server URL
   $res = $pa->parse_url("https://cpanlists.org/api/"); # {proto=>"https", path=>"/App/cpanlists/Server/"}
  
  =head1 DESCRIPTION
  
  This class implements L<Riap::HTTP> client.
  
  =for Pod::Coverage ^action_.+
  
  =head1 ATTRIBUTES
  
  =over
  
  =item * realm => STR
  
  For HTTP basic authentication. Defaults to "restricted area" (this is the
  default realm used by L<Plack::Middleware::Auth::Basic>).
  
  =item * user => STR
  
  For HTTP basic authentication. Default will be taken from environment
  C<PERINCI_HTTP_USER>.
  
  =item * password => STR
  
  For HTTP basic authentication. Default will be taken from environment
  C<PERINCI_HTTP_PASSWORD>.
  
  =item * ssl_cert_file => STR
  
  Path to SSL client certificate. Default will be taken from environment
  C<SSL_CERT_FILE>.
  
  =item * ssl_cert_file => STR
  
  Path to SSL CA certificate. Default will be taken from environment
  C<SSL_CA_FILE>.
  
  =back
  
  =head1 METHODS
  
  =head2 PKG->new(%attrs) => OBJ
  
  Instantiate object. Known attributes:
  
  =over
  
  =item * retries => INT (default 2)
  
  Number of retries to do on network failure. Setting it to 0 will disable
  retries.
  
  =item * retry_delay => INT (default 3)
  
  Number of seconds to wait between retries.
  
  =item * log_level => INT (default 0 or from environment)
  
  Will be fed into Riap request key 'loglevel' (if >0). Note that some servers
  might forbid setting log level.
  
  If TRACE environment variable is true, default log_level will be set to 6. If
  DEBUG, 5. If VERBOSE, 4. If quiet, 1. Else 0.
  
  =item * log_callback => CODE
  
  Pass log messages from the server to this subroutine. If not specified, log
  messages will be "rethrown" into Log::ger loggers (e.g. log_warn(), log_debug(),
  etc).
  
  =back
  
  =head2 $pa->request($action => $server_url[, \%extra_keys[, \%client_opts]]) => $res
  
  Send Riap request to $server_url. Note that $server_url is the HTTP URL of Riap
  server. You will need to specify code entity URI via C<uri> key in %extra_keys.
  
  C<%extra_keys> is optional and contains additional Riap request keys (except
  C<action>, which is taken from C<$action>).
  
  C<%client_opts> is optional and contains additional information, like C<user>
  (HTTP authentication user, overrides one in object attribute), C<password> (HTTP
  authentication user, overrides one in object attribute).
  
  =head2 $pa->parse_url($server_url[, \%client_opts]) => HASH
  
  =head1 FAQ
  
  =head2 How do I connect to a HTTP server that listens on a Unix socket?
  
  This class can switch to using L<LWP::Protocol::http::SocketUnixAlt> when it
  detects that the server is on a Unix socket, using this syntax (notice the
  single instead of double slash after C<http:>):
  
   http:/path/to/unix.sock//uri
  
  =head2 How do I connect to an HTTPS server without a "real" SSL certificate?
  
  Since this module is using L<LWP>, you can set environment variable
  C<PERL_LWP_SSL_VERIFY_HOSTNAME> to 0. See LWP for more details.
  
  =head1 ENVIRONMENT
  
  C<PERINCI_HTTP_USER>.
  
  C<PERINCI_HTTP_PASSWORD>.
  
  C<SSL_CERT_FILE>, C<SSL_CA_FILE>.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Perinci-Access-HTTP-Client>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/sharyanto/perl-Perinci-Access-HTTP-Client>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Perinci-Access-HTTP-Client>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Perinci::Access::HTTP::Server>
  
  L<Riap>, L<Rinci>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2017, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
PERINCI_ACCESS_HTTP_CLIENT

    $main::fatpacked{"Perinci/Access/Lite.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PERINCI_ACCESS_LITE';
  package Perinci::Access::Lite;
  
  our $DATE = '2016-09-25'; # DATE
  our $VERSION = '0.14'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  use Perinci::AccessUtil qw(strip_riap_stuffs_from_res);
  
  sub new {
      my ($class, %args) = @_;
      $args{riap_version} //= 1.1;
      bless \%args, $class;
  }
  
  # copy-pasted from SHARYANTO::Package::Util
  sub __package_exists {
      no strict 'refs';
  
      my $pkg = shift;
  
      return unless $pkg =~ /\A\w+(::\w+)*\z/;
      if ($pkg =~ s/::(\w+)\z//) {
          return !!${$pkg . "::"}{$1 . "::"};
      } else {
          return !!$::{$pkg . "::"};
      }
  }
  
  sub request {
      no strict 'refs';
  
      my ($self, $action, $url, $extra) = @_;
  
      #say "D:request($action => $url)";
  
      $extra //= {};
  
      my $v = $extra->{v} // 1.1;
      if ($v ne '1.1' && $v ne '1.2') {
          return [501, "Riap protocol not supported, must be 1.1 or 1.2"];
      }
  
      my $res;
      if ($url =~ m!\A(?:pl:)?/(\w+(?:/\w+)*)/(\w*)\z!) {
          my ($mod_uripath, $func) = ($1, $2);
          (my $pkg = $mod_uripath) =~ s!/!::!g;
          my $mod_pm = "$mod_uripath.pm";
  
          my $pkg_exists;
  
        LOAD:
          {
              last if exists $INC{$mod_pm};
              $pkg_exists = __package_exists($pkg);
              # special names
              last LOAD if $pkg =~ /\A(main)\z/;
              last if $pkg_exists && defined(${"$pkg\::VERSION"});
              #say "D:Loading $pkg ...";
              eval { require $mod_pm };
              return [500, "Can't load module $pkg: $@"] if $@;
          }
  
          if ($action eq 'list') {
              return [501, "Action 'list' not implemented for ".
                          "non-package entities"]
                  if length($func);
              no strict 'refs';
              my $spec = \%{"$pkg\::SPEC"};
              return [200, "OK (list)", [grep {/\A\w+\z/} sort keys %$spec]];
          } elsif ($action eq 'info') {
              my $data = {
                  uri => "$mod_uripath/$func",
                  type => (!length($func) ? "package" :
                               $func =~ /\A\w+\z/ ? "function" :
                                   $func =~ /\A[\@\$\%]/ ? "variable" :
                                       "?"),
              };
              return [200, "OK (info)", $data];
          } elsif ($action eq 'meta' || $action eq 'call') {
              return [501, "Action 'call' not implemented for package entity"]
                  if !length($func) && $action eq 'call';
              my $meta;
              {
                  no strict 'refs';
                  if (length $func) {
                      $meta = ${"$pkg\::SPEC"}{$func}
                          or return [
                              500, "No metadata for '$url' (".
                                  ($pkg_exists ? "package '$pkg' exists, perhaps you mentioned '$pkg' somewhere without actually loading the module, or perhaps '$func' is a typo?" :
                                       "package '$pkg' doesn't exist, perhaps '$mod_uripath' or '$func' is a typo?") .
                                  ")"];
                  } else {
                      $meta = ${"$pkg\::SPEC"}{':package'} // {v=>1.1};
                  }
                  $meta->{entity_v}    //= ${"$pkg\::VERSION"};
                  $meta->{entity_date} //= ${"$pkg\::DATE"};
              }
  
              require Perinci::Sub::Normalize;
              $meta = Perinci::Sub::Normalize::normalize_function_metadata($meta);
              if ($action eq 'meta') {
                  $meta->{_orig_args_as} = $meta->{args_as};
                  $meta->{args_as} = 'hash';
                  $meta->{_orig_result_naked} = $meta->{result_naked};
                  $meta->{result_naked} = 0;
                  return [200, "OK ($action)", $meta];
              }
  
              # form args (and add special args)
              my $args = { %{$extra->{args} // {}} }; # shallow copy
              if ($meta->{features} && $meta->{features}{progress}) {
                  require Progress::Any;
                  $args->{-progress} = Progress::Any->get_indicator;
              }
  
              # convert args
              my $aa = $meta->{args_as} // 'hash';
              my @args;
              if ($aa =~ /array/) {
                  require Perinci::Sub::ConvertArgs::Array;
                  my $convres = Perinci::Sub::ConvertArgs::Array::convert_args_to_array(
                      args => $args, meta => $meta,
                  );
                  return $convres unless $convres->[0] == 200;
                  if ($aa =~ /ref/) {
                      @args = ($convres->[2]);
                  } else {
                      @args = @{ $convres->[2] };
                  }
              } elsif ($aa eq 'hashref') {
                  @args = ({ %$args });
              } else {
                  # hash
                  @args = %$args;
              }
  
              # call!
              {
                  no strict 'refs';
                  $res = &{"$pkg\::$func"}(@args);
              }
  
              # add envelope
              if ($meta->{result_naked}) {
                  $res = [200, "OK (envelope added by ".__PACKAGE__.")", $res];
              }
  
              # add hint that result is binary
              if (defined $res->[2]) {
                  if ($meta->{result} && $meta->{result}{schema} &&
                          $meta->{result}{schema}[0] eq 'buf') {
                      $res->[3]{'x.hint.result_binary'} = 1;
                  }
              }
  
          } else {
              return [501, "Unknown/unsupported action '$action'"];
          }
      } elsif ($url =~ m!\Ahttps?:/(/?)!i) {
          my $is_unix = !$1;
          my $ht;
          require JSON;
          state $json = JSON->new->allow_nonref;
          if ($is_unix) {
              require HTTP::Tiny::UNIX;
              $ht = HTTP::Tiny::UNIX->new;
          } else {
              require HTTP::Tiny;
              $ht = HTTP::Tiny->new;
          }
          my %headers = (
              "x-riap-v" => $self->{riap_version},
              "x-riap-action" => $action,
              "x-riap-fmt" => "json",
              "content-type" => "application/json",
          );
          my $args = $extra->{args} // {};
          for (keys %$extra) {
              next if /\Aargs\z/;
              $headers{"x-riap-$_"} = $extra->{$_};
          }
          my $htres = $ht->post(
              $url, {
                  headers => \%headers,
                  content => $json->encode($args),
              });
          return [500, "Network error: $htres->{status} - $htres->{reason}"]
              if $htres->{status} != 200;
          return [500, "Server error: didn't return JSON (".$htres->{headers}{'content-type'}.")"]
              unless $htres->{headers}{'content-type'} eq 'application/json';
          return [500, "Server error: didn't return Riap 1.1 response (".$htres->{headers}{'x-riap-v'}.")"]
              unless $htres->{headers}{'x-riap-v'} =~ /\A1\.1(\.\d+)?\z/;
          $res = $json->decode($htres->{content});
      } else {
          return [501, "Unsupported scheme or bad URL '$url'"];
      }
  
      strip_riap_stuffs_from_res($res);
  }
  
  1;
  # ABSTRACT: A lightweight Riap client library
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Perinci::Access::Lite - A lightweight Riap client library
  
  =head1 VERSION
  
  This document describes version 0.14 of Perinci::Access::Lite (from Perl distribution Perinci-Access-Lite), released on 2016-09-25.
  
  =head1 DESCRIPTION
  
  This module is a lightweight alternative to L<Perinci::Access>. It has less
  prerequisites but does fewer things. The things it supports:
  
  =over
  
  =item * Local (in-process) access to Perl modules and functions
  
  Currently only C<call>, C<meta>, and C<list> actions are implemented. Variables
  and other entities are not yet supported.
  
  The C<list> action only gathers keys from C<%SPEC> and do not yet list
  subpackages.
  
  =item * HTTP/HTTPS
  
  =item * HTTP over Unix socket
  
  =back
  
  Differences with Perinci::Access:
  
  =over
  
  =item * For network access, uses HTTP::Tiny module family instead of LWP
  
  This results in fewer dependencies.
  
  =item * No wrapping, no argument checking
  
  For 'pl' or schemeless URL, no wrapping (L<Perinci::Sub::Wrapper>) is done, only
  normalization (using L<Perinci::Sub::Normalize>).
  
  =item * No transaction or logging support
  
  =item * No support for some schemes
  
  This includes: Riap::Simple over pipe/TCP socket.
  
  =back
  
  =head1 ADDED RESULT METADATA
  
  This class might add the following property/attribute in result metadata:
  
  =head2 x.hint.result_binary => bool
  
  If result's schema type is C<buf>, then this class will set this attribute to
  true, to give hints to result formatters.
  
  =head1 ATTRIBUTES
  
  =head2 riap_version => float (default: 1.1)
  
  =head1 METHODS
  
  =head2 new(%attrs) => obj
  
  =head2 $pa->request($action, $url, $extra) => hash
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Perinci-Access-Lite>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Perinci-Access-Lite>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Perinci-Access-Lite>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Perinci::Access>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
PERINCI_ACCESS_LITE

    $main::fatpacked{"Perinci/Access/Perl.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PERINCI_ACCESS_PERL';
  package Perinci::Access::Perl;
  
  our $DATE = '2020-03-04'; # DATE
  our $VERSION = '0.892'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  use URI::Split qw(uri_split);
  
  use parent qw(Perinci::Access::Schemeless);
  
  sub new {
      my $class = shift;
  
      my $self = $class->SUPER::new(@_);
  
      # The pl: uri scheme has a 1:1 mapping between Perl package and path, so
      # /Foo/Bar/ must mean the Foo::Bar package. We don't allow package_prefix or
      # anything fancy like that.
      delete $self->{package_prefix};
  
      $self->{allow_schemes} = ['pl', ''];
      $self->{deny_schemes} = undef;
  
      $self;
  }
  
  sub parse_url {
      my ($self, $uri) = @_;
      die "Please specify url" unless $uri;
  
      my ($sch, $auth, $path) = uri_split($uri);
      $sch //= "";
  
      die "Only pl uri scheme is supported" unless $sch eq 'pl';
      {proto=>"pl", path=>$path};
  }
  
  1;
  # ABSTRACT: Access Perl module, functions, variables through Riap
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Perinci::Access::Perl - Access Perl module, functions, variables through Riap
  
  =head1 VERSION
  
  This document describes version 0.892 of Perinci::Access::Perl (from Perl distribution Perinci-Access-Perl), released on 2020-03-04.
  
  =head1 SYNOPSIS
  
  First write your code and add Rinci metadata to them:
  
   package MyMod::MySubMod;
  
   our %SPEC;
  
   $SPEC{':package'} = {
       v => 1.1,
       summary => 'This package is blah blah',
   };
  
   $SPEC{'$var1'} = {
       v => 1.1,
       summary => 'This variable is blah blah',
   };
   our $var1;
  
   $SPEC{func1} = {
       v => 1.1,
       summary => 'This function does blah blah',
       args => {
           a => { schema => 'int', req => 1 },
           b => { schema => 'int' },
       },
   };
   sub func1 {
       ...
   }
   1;
  
  then access them through Riap:
  
   use Perinci::Access::Perl;
   my $pa = Perinci::Access::Perl->new;
  
   # call function
   $res = $pa->request(call => '/MyMod/MySubMod/func1', {args=>{a=>1, b=>2}});
  
   # get variables
   $res = $pa->request(get => '/MyMod/MySubMod/$var1');
  
  =head1 DESCRIPTION
  
  This class allows you to access Perl modules, functions, and variables through
  Riap. Only those which have L<Rinci> metadata are accessible. The metadata is
  put in C<%SPEC> package variables, with function names as keys, or C<:package>
  for package metadata, or C<$NAME> for variables. Functions will be wrapped
  before executed (unless you pass C<< wrap => 0 >> to the constructor).
  
  You should probably use this through L<Perinci::Access>.
  
  =head1 FUNCTIONS
  
  =head2 new(%opts) => OBJ
  
  Constructor. For a list of options, see superclass
  L<Perinci::Access::Schemeless> except for C<package_prefix> which are not
  recognized by this class.
  
  =head2 $pa->request($action, $uri, \%extras) => RESP
  
  =head2 $pa->parse_url($url) => HASH
  
  =head1 FAQ
  
  =head2 Why C<%SPEC> (instead of C<%META>, C<%METADATA>, C<%RINCI>, etc)?
  
  The name was first chosen during Sub::Spec era (see BackPAN) in 2011, it stuck.
  By that time I already had had a lot of code written using C<%SPEC>.
  
  =head2 Why wrap?
  
  The wrapping process accomplishes several things, among others: checking of
  metadata, normalization of schemas in metadata, also argument validation and
  exception trapping in function.
  
  The function wrapping introduces a small overhead when performing a sub call
  (typically around several to tens of microseconds on an Intel Core i5 1.7GHz
  notebook). This is usually smaller than the overhead of Perinci::Access::Perl
  itself (typically in the range of 100 microseconds). But if you are concerned
  about the wrapping overhead, see the C<< wrap => 0 >> option.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Perinci-Access-Perl>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Perinci-Access-Perl>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Perinci-Access-Perl>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Perinci::Access::Schemeless>
  
  L<Perinci::Access>
  
  L<Riap>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
PERINCI_ACCESS_PERL

    $main::fatpacked{"Perinci/Access/Schemeless.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PERINCI_ACCESS_SCHEMELESS';
  package Perinci::Access::Schemeless;
  
  our $DATE = '2020-03-04'; # DATE
  our $VERSION = '0.892'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  use experimental 'smartmatch';
  use Log::ger;
  
  use parent qw(Perinci::Access::Base);
  
  use List::Util qw(first);
  use Perinci::Object;
  use Perinci::Sub::Normalize qw(normalize_function_metadata);
  use Perinci::Sub::Util qw(err);
  use Scalar::Util qw(blessed);
  use Module::Path::More qw(module_path);
  use Package::Util::Lite qw(package_exists);
  use Tie::Cache;
  use URI::Split qw(uri_split uri_join);
  
  our $re_perl_package =
      qr/\A[A-Za-z_][A-Za-z_0-9]*(::[A-Za-z_0-9][A-Za-z_0-9]*)*\z/;
  
  sub new {
      require Class::Inspector;
  
      my $class = shift;
      my $self = $class->SUPER::new(@_);
  
      # build a list of supported actions for each type of entity
      my %typeacts = (
          package  => [],
          function => [],
          variable => [],
      ); # key = type, val = [[ACTION, META], ...]
  
      my @comacts;
      for my $meth (@{Class::Inspector->methods(ref $self)}) {
          next unless $meth =~ /^actionmeta_(.+)/;
          my $act = $1;
          my $meta = $self->$meth();
          $self->{_actionmetas}{$act} = $meta;
          for my $type (@{$meta->{applies_to}}) {
              if ($type eq '*') {
                  push @comacts, [$act, $meta];
              } else {
                  push @{$typeacts{$type}}, [$act, $meta];
              }
          }
      }
      for my $type (keys %typeacts) {
          $typeacts{$type} = { map {$_->[0] => $_->[1]}
                                   @{$typeacts{$type}}, @comacts };
      }
      $self->{_typeacts} = \%typeacts;
  
      $self->{cache_size}              //= 100; # for caching metadata & code
      #$self->{use_tx}                  //= 0;
      $self->{wrap}                    //= 1;
      #$self->{custom_tx_manager}       //= undef;
      $self->{load}                    //= 1;
      $self->{normalize_metadata}      //= 1;
      #$self->{after_load}
      #$self->{allow_paths}
      #$self->{deny_paths}
      #$self->{allow_schemes}
      #$self->{deny_schemes}
      #$self->{package_prefix}
      $self->{debug}                   //= $ENV{PERINCI_ACCESS_SCHEMELESS_DEBUG} // 0;
      $self->{accept_argv}             //= 1;
  
      if ($self->{cache_size} > 0) {
          my %metacache;
          tie %metacache, 'Tie::Cache', $self->{cache_size};
          $self->{_meta_cache} = \%metacache;
          my %codecache;
          tie %codecache, 'Tie::Cache', $self->{cache_size};
          $self->{_code_cache} = \%codecache;
      }
  
      $self;
  }
  
  # for older Perinci::Access::Base 0.28-, to remove later
  sub _init {}
  
  # if paths=/a/b, will match /a/b as well as /a/b/c
  sub __match_paths {
      my ($path, $paths) = @_;
  
      my $pathslash = $path =~ m!/\z! ? $path : "$path/";
  
      for (ref($paths) eq 'ARRAY' ? @$paths : $paths) {
          if (ref($_) eq 'Regexp') {
              return 1 if $path =~ $_;
          } else {
              if (m!/\z!) {
                  return 1 if $_ eq $pathslash || index($pathslash, $_) == 0;
              } else {
                  my $p = "$_/";
                  return 1 if $p eq $path || index($pathslash, $p) == 0;
              }
          }
      }
      0;
  }
  
  # if paths=/a/b, will match /a/b as well as /a/b/c AS WELL AS /a and /. only
  # suitable for 'list' action, e.g. allow_path is '/a/b' but we can do 'list /'
  # and 'list /a' too (but not 'list /c').
  sub __match_paths2 {
      my ($path, $paths) = @_;
  
      my $pathslash = $path =~ m!/\z! ? $path : "$path/";
  
      for (ref($paths) eq 'ARRAY' ? @$paths : $paths) {
          if (ref($_) eq 'Regexp') {
              # we can't match a regex against a string, so we just pass here
              return 1;
          } else {
              if (m!/\z!) {
                  return 1 if $_ eq $pathslash || index($_, $pathslash) == 0 ||
                      index($pathslash, $_) == 0;
              } else {
                  my $p = "$_/";
                  return 1 if $p eq $path || index($p, $pathslash) == 0 ||
                      index($pathslash, $p) == 0 ;
              }
          }
      }
      0;
  }
  
  sub _parse_uri {
      my ($self, $req) = @_;
  
      my $path = $req->{-uri_path};
      if (defined $self->{allow_paths}) {
          my $allow;
          if ($self->{_actionmetas}{$req->{action}}{allow_request_parent_path}) {
              $allow = __match_paths2($path, $self->{allow_paths});
          } else {
              $allow = __match_paths($path, $self->{allow_paths});
          }
          return err(403, "Forbidden uri path (does not match allow_paths)")
              unless $allow;
      }
      if (defined($self->{deny_paths}) &&
              __match_paths($path, $self->{deny_paths})) {
          return err(403, "Forbidden uri path (matches deny_paths)");
      }
  
      my $sch = $req->{-uri_scheme} // "";
      if (defined($self->{allow_schemes}) && !($sch ~~ $self->{allow_schemes})) {
          return err(501,
                     "Unsupported uri scheme (does not match allow_schemes)");
      }
      if (defined($self->{deny_schemes}) && ($sch ~~ $self->{deny_schemes})) {
          return err(501, "Unsupported uri scheme (matches deny_schemes)");
      }
  
      my ($dir, $leaf, $perl_package);
      if ($path =~ m!(.*)/(.*)!) {
          $dir  = $1;
          $leaf = $2;
      } else {
          $dir  = $path;
          $leaf = '';
      }
      for ($perl_package) {
          $_ = $dir;
          s!^/+!!;
          s!/+!::!g;
          if (defined $self->{package_prefix}) {
              $_ = $self->{package_prefix} . (length($_) ? "::":"") . $_;
          }
      }
      return err(400, "Invalid perl package name: $perl_package")
          if $perl_package && $perl_package !~ $re_perl_package;
  
      my $type;
      if (length $leaf) {
          if ($leaf =~ /^[%\@\$]/) {
              $type = 'variable';
          } else {
              $type = 'function';
          }
      } else {
          $type = 'package';
          # make sure path ends in /, to ease processing
          $req->{-uri_path} .= "/" unless $path =~ m!/\z!;
      }
  
      $req->{-uri_dir}      = $dir;
      $req->{-uri_leaf}     = $leaf;
      $req->{-perl_package} = $perl_package;
      $req->{-type}         = $type;
  
      #$log->tracef("TMP: req=%s", $req);
      return;
  }
  
  # key = module_p, val = error resp or undef if successful
  my %loadcache;
  tie %loadcache, 'Tie::Cache', 200;
  
  sub _load_module {
      my ($self, $req) = @_;
  
      my $pkg = $req->{-perl_package};
  
      # skip there is no module to load
      return if !$pkg;
  
      # if we are instructed not to load any module, we just check via existence
      # of packages
      unless ($self->{load}) {
          return if package_exists($pkg);
          return err(500, "Package $pkg does not exist");
      }
  
      my $module_p = $pkg;
      $module_p =~ s!::!/!g;
      $module_p .= ".pm";
  
      # module has been required before and successfully loaded
      return if $INC{$module_p};
  
      # module has been required before and failed
      return err(500, "Module $pkg has failed to load previously" .
                     $loadcache{$module_p} ?
                         ": $loadcache{$module_p}[0] - $loadcache{$module_p}[1]" :
                             "")
          if exists($INC{$module_p});
  
      # use cache result (for caching errors, or packages like 'main' and 'CORE'
      # where no modules for such packages exist)
      return $loadcache{$module_p} if exists $loadcache{$module_p};
  
      # load and cache negative result
      my $res;
      {
          my $fullpath = module_path(module=>$pkg, find_pmc=>0, find_prefix=>1);
  
          # when the module path does not exist, but the package does, we can
          # ignore this error. for example: main, CORE, etc.
          my $pkg_exists = package_exists($pkg);
  
          if (!$fullpath) {
              last if $pkg_exists;
              $res = [404, "Can't find module or prefix path for package $pkg"];
              last;
          } elsif ($fullpath !~ /\.pm$/) {
              last if $pkg_exists;
              $res = [405, "Can only find a prefix path for package $pkg"];
              last;
          }
          eval { require $module_p };
          if ($@) {
              $res = [500, "Can't load module $pkg (probably compile error): $@"];
              last;
          }
          # load is successful
          if ($self->{after_load}) {
              eval { $self->{after_load}($self, module=>$pkg) };
              log_error("after_load for package $pkg dies: $@") if $@;
          }
      }
      $loadcache{$module_p} = $res;
      return $res;
  }
  
  sub __inject_entity_v_date {
      no strict 'refs';
  
      my ($req, $meta) = @_;
  
      my $pkg = $req->{-perl_package};
      unless (defined $meta->{entity_v}) {
          my $ver = ${"$pkg\::VERSION"};
          if (defined $ver) {
              $meta->{entity_v} = $ver;
          }
      }
      unless (defined $meta->{entity_date}) {
          my $date = ${"$pkg\::DATE"};
          if (defined $date) {
              $meta->{entity_date} = $date;
          }
      }
  }
  
  sub get_meta {
      no strict 'refs';
  
      my ($self, $req) = @_;
  
      my $pkg  = $req->{-perl_package};
      my $leaf = $req->{-uri_leaf};
      my $type = $req->{-type};
      if (!length($pkg)) {
          if (length $leaf) {
              # 404 for all non-subpackage entity directly under /
              return [404, "No metadata for ::$leaf (".
                  (package_exists($pkg) ? "package '$pkg' exists, perhaps you mentioned '$pkg' somewhere without actually loading the module, or perhaps '$leaf' is a typo?" :
                       "package '$pkg' doesn't exist, perhaps '$pkg' or '$leaf' is a typo?").
                      ")"
              ];
          } else {
              # empty metadata for root (/)
              $req->{-meta} = {v=>1.1};
              return;
          }
      }
  
      my $name = "$pkg\::$leaf";
      if ($self->{_meta_cache}{$name}) {
          $req->{-meta} = $self->{_meta_cache}{$name};
          $req->{-orig_meta} = $self->{_orig_meta_cache}{$name}
              if $self->{_orig_meta_cache}{$name};
          return;
      }
  
      my $res = $self->_load_module($req);
      # missing module (but existing prefix) is okay for package, we construct an
      # empty package metadata for it
      return $res if $res && !($type eq 'package' && $res->[0] == 405);
  
      my $meta;
      my $metas = \%{"$pkg\::SPEC"};
      $meta = $metas->{ $leaf || ":package" };
  
      if (!$meta && $type eq 'package') {
          $meta = {v=>1.1};
      }
  
      return err(404,
                 join("",
                      "No metadata for $name (package '$pkg' exists, ",
                      "perhaps you mentioned '$pkg' ",
                      "somewhere without actually loading the module, or ",
                      "perhaps '$leaf' is a typo?)",
                  )) unless $meta;
  
      if ($res) {
          if ($res->[0] == 405) {
              $meta = {v=>1.1}; # empty package metadata for dir
          } elsif ($res->[0] != 200) {
              return $res;
          }
      }
  
      # normalize has only been implemented for function
      if ($type eq 'function' && $self->{normalize_metadata}) {
          eval { $meta = normalize_function_metadata($meta) };
          if ($@) {
              return [500, "Can't normalize function metadata: $@"];
          }
  
          $meta->{args} //= {};
          $meta->{_orig_args_as} = $meta->{args_as};
          $meta->{args_as} = 'hash';
          $meta->{_orig_result_naked} = $meta->{result_naked};
          $meta->{result_naked} = 0;
          my $sfp = $self->{set_function_properties};
          if ($sfp) {
              for (keys %$sfp) {
                  $meta->{"_orig_$_"} = $meta->{$_};
                  $meta->{$_} = $sfp->{$_};
              }
          }
      }
  
      __inject_entity_v_date($req, $meta);
  
      if ($self->{cache_size} > 0) {
          $self->{_meta_cache}{$name} = $meta;
      }
  
      $req->{-meta} = $meta;
      return;
  }
  
  sub get_code {
      my ($self, $req) = @_;
  
      # because we're lazy, we assume here that type is already function. it
      # should be okay since get_code() is only called by action_call().
  
      my $name = $req->{-perl_package} . "::" . $req->{-uri_leaf};
      if ($self->{_code_cache}{$name}) {
          $req->{-code} = $self->{_code_cache}{$name};
          return;
      }
  
      my $res = $self->_load_module($req);
      return $res if $res;
  
      return err(404, "Can't find function $req->{-uri_leaf} in ".
                     "module $req->{-perl_package}")
          unless defined &{$name};
  
      # we get our own meta and not use get_meta() because we want to get the
      # original metadata
      my $meta;
      {
          no strict 'refs';
          my $metas = \%{"$req->{-perl_package}::SPEC"};
          $meta = $metas->{ $req->{-uri_leaf} || ":package" };
      }
  
      return err(404, "Can't find function metadata $req->{-uri_leaf} in ".
                     "module $req->{-perl_package}")
          unless $meta;
  
      my $code;
    GET_CODE:
      {
          # we don't need to wrap
          if (!$self->{wrap} ||
                  $meta->{"x.perinci.sub.wrapper.logs"} &&
                      (first {$_->{validate_args}}
                           @{ $meta->{"x.perinci.sub.wrapper.logs"} })
              ) {
              $code = \&{$name};
              last GET_CODE;
          }
  
          require Perinci::Sub::Wrapper;
          my $sfp = $self->{set_function_properties};
  
          my $wrapres = Perinci::Sub::Wrapper::wrap_sub(
              sub_name=>$name, meta=>$meta,
              convert=>{args_as=>'hash', result_naked=>0,
                        ($sfp ? %$sfp : ())
                    });
          return err(500, "Can't wrap function", $wrapres)
              unless $wrapres->[0] == 200;
          $code = $wrapres->[2]{sub};
  
          if ($self->{cache_size} > 0) {
              $self->{_code_cache}{$name} = $code;
              # also put wrapper-generated meta in the cache, so further meta
              # request can use this. the metadata from wrapper contains wrapper
              # logs (x.perinci.sub.wrapper.logs) which can be helpful hint for
              # some uses.
              my $newmeta = $wrapres->[2]{meta};
              $newmeta->{_orig_result_naked} = $meta->{result_naked};
              $newmeta->{_orig_args_as}      = $meta->{args_as};
              if ($sfp) {
                  for (keys %$sfp) {
                      $newmeta->{"_orig_$_"} = $meta->{$_};
                  }
              }
              __inject_entity_v_date($req, $newmeta);
              $self->{_meta_cache}{$name} = $newmeta;
          }
      }
  
      $req->{-code} = $code;
      return;
  }
  
  sub request {
      no strict 'refs';
  
      my ($self, $action, $uri, $extra) = @_;
  
      return err(400, "Please specify URI") unless $uri;
  
      my $req = { action=>$action, uri=>$uri, %{$extra // {}} };
      my $res = $self->check_request($req);
      return $res if $res;
  
      return err(501, "Action '$action' not implemented")
          unless $self->can("actionmeta_$action");
  
      my $am = $self->${\("actionmeta_$action")};
  
      $res = $self->_parse_uri($req);
      return $res if $res;
  
      return err(501, "Action '$action' not implemented for ".
                     "'$req->{-type}' entity")
          unless $am->{applies_to}[0] eq '*' ||
              $req->{-type} ~~ @{ $am->{applies_to} };
  
      my $meth = "action_$action";
      # check transaction
  
      $res = $self->$meth($req);
      if ($self->{debug}) {
          $res->[3] //= {};
          $res->[3]{debug} = {
              req => $req,
          };
      }
      $res;
  }
  
  sub parse_url {
      my ($self, $uri) = @_;
      die "Please specify url" unless $uri;
      my ($sch, $auth, $path) = uri_split($uri);
      return {
          # to mark that we are schemeless
          proto=>'',
          path=>$path,
      };
  }
  
  sub actionmeta_info { +{
      applies_to => ['*'],
      summary    => "Get general information on code entity",
      needs_meta => 0,
      needs_code => 0,
  } }
  
  sub action_info {
      my ($self, $req) = @_;
  
      my $mres = $self->get_meta($req);
      return $mres if $mres;
  
      my $res = {
          uri  => $req->{uri},
          type => $req->{-type},
      };
  
      [200, "OK (info action)", $res];
  }
  
  sub actionmeta_actions { +{
      applies_to => ['*'],
      summary    => "List available actions for code entity",
      needs_meta => 0,
      needs_code => 0,
  } }
  
  sub action_actions {
      my ($self, $req) = @_;
  
      my $mres = $self->get_meta($req);
      return $mres if $mres;
  
      my @res;
      for my $k (sort keys %{ $self->{_typeacts}{$req->{-type}} }) {
          my $v = $self->{_typeacts}{$req->{-type}}{$k};
          if ($req->{detail}) {
              push @res, {name=>$k, summary=>$v->{summary}};
          } else {
              push @res, $k;
          }
      }
      [200, "OK (actions action)", \@res];
  }
  
  sub actionmeta_list { +{
      applies_to => ['package'],
      summary    => "List code entities inside this package code entity",
      # this means, even if allow_path is '/a/b', we allow request on '/a' or '/'.
      allow_request_parent_path => 1,
  } }
  
  sub action_list {
      require Module::List;
  
      my ($self, $req) = @_;
      my $detail = $req->{detail};
      my $f_type = $req->{type} || "";
  
      my @res;
  
      my $filter_path = sub {
          my $path = shift;
          if (defined($self->{allow_paths}) &&
                  !__match_paths2($path, $self->{allow_paths})) {
              return 0;
          }
          if (defined($self->{deny_paths}) &&
                  __match_paths2($path, $self->{deny_paths})) {
              return 0;
          }
          1;
      };
  
      my %mem;
  
      # get submodules
      unless ($f_type && $f_type ne 'package') {
          my $lres = Module::List::list_modules(
              $req->{-perl_package} ? "$req->{-perl_package}\::" : "",
              {list_modules=>1, list_prefixes=>1});
          my $dir = $req->{-uri_dir};
          for my $m (sort keys %$lres) {
              $m =~ s!::$!!;
              $m =~ s!.+::!!;
              my $path = "$dir/$m/";
              next unless $filter_path->($path);
              next if $mem{$path}++;
              if ($detail) {
                  push @res, {uri=>"$m/", type=>"package"};
              } else {
                  push @res, "$m/";
              }
          }
      }
  
      my $res = $self->_load_module($req);
      return $res if $res && $res->[0] != 405;
  
      # get all entities from this module
      no strict 'refs';
      my $spec = \%{"$req->{-perl_package}\::SPEC"};
      my $dir = $req->{-uri_dir};
      for my $e (sort keys %$spec) {
          next if $e =~ /^:/;
          my $path = "$dir/$e";
          next unless $filter_path->($path);
          next if $mem{$path}++;
          my $t = $e =~ /^[%\@\$]/ ? 'variable' : 'function';
          next if $f_type && $f_type ne $t;
          if ($detail) {
              push @res, {
                  uri=>$e, type=>$t,
              };
          } else {
              push @res, $e;
          }
      }
  
      [200, "OK (list action)", \@res];
  }
  
  sub actionmeta_meta { +{
      applies_to => ['*'],
      summary    => "Get metadata",
  } }
  
  sub action_meta {
      my ($self, $req) = @_;
  
      my $res = $self->get_meta($req);
      return $res if $res;
  
      [200, "OK (meta action)", $req->{-meta}];
  }
  
  sub actionmeta_call { +{
      applies_to => ['function'],
      summary    => "Call function",
  } }
  
  sub action_call {
      require UUID::Random;
  
      my ($self, $req) = @_;
  
      my $res;
  
      my $tm; # = does client mention tx_id?
      if (defined $req->{tx_id}) {
          $res = $self->_pre_tx_action($req);
          return $res if $res;
          $tm = $self->{_tx_manager};
          $tm->{_tx_id} = $req->{tx_id};
      }
  
      $res = $self->get_meta($req);
      return $res if $res;
      $res = $self->get_code($req);
      return $res if $res;
  
      my %args;
  
      # try to convert from argv if given argv
      if (exists($req->{argv}) && $self->{accept_argv}) {
          require Perinci::Sub::GetArgs::Argv;
          $res = Perinci::Sub::GetArgs::Argv::get_args_from_argv(
              argv => [@{ $req->{argv} }],
              meta => $req->{-meta},
          );
          return err(400, "Can't parse argv", $res) unless $res->[0] == 200;
          %args = %{ $res->[2] };
      } else {
          %args = %{ $req->{args} // {} };
      }
  
      my $risub = risub($req->{-meta});
  
      if ($req->{dry_run}) {
          return err(412, "Function does not support dry run")
              unless $risub->can_dry_run;
          if ($risub->feature('dry_run')) {
              $args{-dry_run} = 1;
          } else {
              $args{-dry_run} = 1;
              $args{-tx_action} = 'check_state';
              $args{-tx_action_id} = UUID::Random::generate();
              undef $tm;
          }
      }
  
      if ($risub->feature('progress')) {
          require Progress::Any;
          $args{-progress} = Progress::Any->get_indicator();
      }
  
      if ($tm) {
          $res = $tm->action(
              f => "$req->{-perl_package}::$req->{-uri_leaf}", args=>\%args,
              confirm => $req->{confirm},
          );
          $tm->{_tx_id} = undef if $tm;
      } else {
          $args{-confirm} = 1 if $req->{confirm};
          eval { $res = $req->{-code}->(%args) };
          my $eval_err = $@;
          if ($eval_err) {
              $res = err(500, "Function died: $eval_err");
          }
      }
  
      # add hint that result is binary
      if (defined $res->[2]) {
          if ($req->{-meta}{result} && $req->{-meta}{result}{schema} &&
                  $req->{-meta}{result}{schema}[0] eq 'buf') {
              $res->[3]{'x.hint.result_binary'} = 1;
          }
      }
  
      $res;
  }
  
  sub actionmeta_complete_arg_val { +{
      applies_to => ['function'],
      summary    => "Complete function's argument value"
  } }
  
  sub action_complete_arg_val {
      require Perinci::Sub::Complete;
  
      my ($self, $req) = @_;
      my $arg = $req->{arg} or return err(400, "Please specify arg");
      my $word = $req->{word} // "";
      my $ci = $req->{ci};
  
      my $res = $self->get_meta($req);
      return $res if $res;
      [200, "OK (complete_arg_val action)",
       Perinci::Sub::Complete::complete_arg_val(meta=>$req->{-meta}, word=>$word,
                                                arg=>$arg, ci=>$ci) // []];
  }
  
  sub actionmeta_complete_arg_elem { +{
      applies_to => ['function'],
      summary    => "Complete function's argument element value"
  } }
  
  sub action_complete_arg_elem {
      require Perinci::Sub::Complete;
  
      my ($self, $req) = @_;
      my $arg = $req->{arg} or return err(400, "Please specify arg");
      defined(my $index = $req->{index})
          or return err(400, "Please specify index");
      my $word = $req->{word} // "";
      my $ci = $req->{ci};
  
      my $res = $self->get_meta($req);
      return $res if $res;
      [200, "OK (complete_arg_elem action)",
       Perinci::Sub::Complete::complete_arg_elem(
           meta=>$req->{-meta}, word=>$word, arg=>$arg, ci=>$ci, index=>$index,
       ) // []];
  }
  
  sub actionmeta_child_metas { +{
      applies_to => ['package'],
      summary    => "Get metadata of all child entities",
  } }
  
  sub action_child_metas {
      my ($self, $req) = @_;
  
      my $res = $self->action_list($req);
      return $res unless $res->[0] == 200;
      my $ents = $res->[2];
  
      my %res;
      my %om;
      my $base = uri_join(
          $req->{-uri_scheme}, $req->{-uri_auth}, $req->{-uri_dir});
  
      for my $ent (@$ents) {
          $res = $self->request(meta => "$base/$ent");
          # ignore failed request
          next unless $res->[0] == 200;
          $res{$ent} = $res->[2];
      }
      [200, "OK (child_metas action)", \%res];
  }
  
  sub actionmeta_get { +{
      applies_to => ['variable'],
      summary    => "Get value of variable",
  } }
  
  sub action_get {
      no strict 'refs';
  
      my ($self, $req) = @_;
      local $req->{-uri_leaf} = $req->{-uri_leaf};
  
      # extract prefix
      $req->{-uri_leaf} =~ s/^([%\@\$])//
          or return err(500, "BUG: Unknown variable prefix");
      my $prefix = $1;
      my $name = $req->{-perl_package} . "::" . $req->{-uri_leaf};
      my $res =
          $prefix eq '$' ? ${$name} :
              $prefix eq '@' ? \@{$name} :
                  $prefix eq '%' ? \%{$name} :
                      undef;
      [200, "OK (get action)", $res];
  }
  
  sub _pre_tx_action {
      my ($self, $req) = @_;
  
      return err(501, "Transaction not supported by server")
          unless $self->{use_tx};
  
      # instantiate custom tx manager, per request if necessary
      if (ref($self->{custom_tx_manager}) eq 'CODE') {
          eval {
              $self->{_tx_manager} = $self->{custom_tx_manager}->($self);
              die $self->{_tx_manager} unless blessed($self->{_tx_manager});
          };
          return err(500, "Can't initialize custom tx manager: ".
                         "$self->{_tx_manager}: $@") if $@;
      } elsif (!blessed($self->{_tx_manager})) {
          my $tm_cl = $self->{custom_tx_manager} // "Perinci::Tx::Manager";
          my $tm_cl_p = $tm_cl; $tm_cl_p =~ s!::!/!g; $tm_cl_p .= ".pm";
          eval {
              require $tm_cl_p;
              $self->{_tx_manager} = $tm_cl->new(pa => $self);
              die $self->{_tx_manager} unless blessed($self->{_tx_manager});
          };
          return err(500, "Can't initialize tx manager ($tm_cl): $@") if $@;
          # we just want to force newer version, we currently can't specify this
          # in Makefile.PL because peritm's tests use us. this might be rectified
          # in the future.
          if ($tm_cl eq 'Perinci::Tx::Manager') {
              $Perinci::Tx::Manager::VERSION >= 0.29
                  or die "Your Perinci::Tx::Manager is too old, ".
                      "please install v0.29 or later";
          }
      }
  
      return;
  }
  
  sub actionmeta_begin_tx { +{
      applies_to => ['*'],
      summary    => "Start a new transaction",
  } }
  
  sub action_begin_tx {
      my ($self, $req) = @_;
      my $res = $self->_pre_tx_action($req);
      return $res if $res;
  
      $self->{_tx_manager}->begin(
          tx_id   => $req->{tx_id},
          summary => $req->{summary},
      );
  }
  
  sub actionmeta_commit_tx { +{
      applies_to => ['*'],
      summary    => "Commit a transaction",
  } }
  
  sub action_commit_tx {
      my ($self, $req) = @_;
      my $res = $self->_pre_tx_action($req);
      return $res if $res;
  
      $self->{_tx_manager}->commit(
          tx_id  => $req->{tx_id},
      );
  }
  
  sub actionmeta_savepoint_tx { +{
      applies_to => ['*'],
      summary    => "Create a savepoint in a transaction",
  } }
  
  sub action_savepoint_tx {
      my ($self, $req) = @_;
      my $res = $self->_pre_tx_action($req);
      return $res if $res;
  
      $self->{_tx_manager}->savepoint(
          tx_id => $req->{tx_id},
          sp    => $req->{tx_spid},
      );
  }
  
  sub actionmeta_release_tx_savepoint { +{
      applies_to => ['*'],
      summary    => "Release a transaction savepoint",
  } }
  
  sub action_release_tx_savepoint {
      my ($self, $req) =\ @_;
      my $res = $self->_pre_tx_action($req);
      return $res if $res;
  
      $self->{_tx_manager}->release_savepoint(
          tx_id => $req->{tx_id},
          sp    => $req->{tx_spid},
      );
  }
  
  sub actionmeta_rollback_tx { +{
      applies_to => ['*'],
      summary    => "Rollback a transaction (optionally to a savepoint)",
  } }
  
  sub action_rollback_tx {
      my ($self, $req) = @_;
      my $res = $self->_pre_tx_action($req);
      return $res if $res;
  
      $self->{_tx_manager}->rollback(
          tx_id => $req->{tx_id},
          sp    => $req->{tx_spid},
      );
  }
  
  sub actionmeta_list_txs { +{
      applies_to => ['*'],
      summary    => "List transactions",
  } }
  
  sub action_list_txs {
      my ($self, $req) = @_;
      my $res = $self->_pre_tx_action($req);
      return $res if $res;
  
      $self->{_tx_manager}->list(
          detail    => $req->{detail},
          tx_status => $req->{tx_status},
          tx_id     => $req->{tx_id},
      );
  }
  
  sub actionmeta_undo { +{
      applies_to => ['*'],
      summary    => "Undo a committed transaction",
  } }
  
  sub action_undo {
      my ($self, $req) = @_;
      my $res = $self->_pre_tx_action($req);
      return $res if $res;
  
      $self->{_tx_manager}->undo(
          tx_id   => $req->{tx_id},
          confirm => $req->{confirm},
      );
  }
  
  sub actionmeta_redo { +{
      applies_to => ['*'],
      summary    => "Redo an undone committed transaction",
  } }
  
  sub action_redo {
      my ($self, $req) = @_;
      my $res = $self->_pre_tx_action($req);
      return $res if $res;
  
      $self->{_tx_manager}->redo(
          tx_id   => $req->{tx_id},
          confirm => $req->{confirm},
      );
  }
  
  sub actionmeta_discard_tx { +{
      applies_to => ['*'],
      summary    => "Discard (forget) a committed transaction",
  } }
  
  sub action_discard_tx {
      my ($self, $req) = @_;
      my $res = $self->_pre_tx_action($req);
      return $res if $res;
  
      $self->{_tx_manager}->discard(
          tx_id => $req->{tx_id},
      );
  }
  
  sub actionmeta_discard_all_txs { +{
      applies_to => ['*'],
      summary    => "Discard (forget) all committed transactions",
  } }
  
  sub action_discard_all_txs {
      my ($self, $req) = @_;
      my $res = $self->_pre_tx_action($req);
      return $res if $res;
  
      $self->{_tx_manager}->discard_all(
          # XXX select client
      );
  }
  
  1;
  # ABSTRACT: Base class for Perinci::Access::Perl
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Perinci::Access::Schemeless - Base class for Perinci::Access::Perl
  
  =head1 VERSION
  
  This document describes version 0.892 of Perinci::Access::Schemeless (from Perl distribution Perinci-Access-Perl), released on 2020-03-04.
  
  =head1 DESCRIPTION
  
  This class is the base class for L<Perinci::Access::Perl>, and by default acts
  like Perinci::Access::Perl (e.g. given uri C</Foo/Bar/baz> it will refer to
  function C<baz> in Perl package C<Foo::Bar>; it also looks for Rinci metadata in
  C<%SPEC> package variables by default). But this class is designed to be
  flexible: you can override aspects of it so it can map uri to different Perl
  packages (e.g. using option like C<package_prefix>), you can retrieve Rinci
  metadata from a database or whatever, etc.
  
  Supported features:
  
  =over
  
  =item * Basic Riap actions
  
  These include C<info>, C<actions>, C<meta>, C<list>, and C<call> actions.
  
  =item * Transaction/undo
  
  According to L<Rinci::Transaction>.
  
  =item * Function wrapping
  
  Wrapping is used to convert argument passing style, produce result envelope, add
  argument validation, as well as numerous other functionalities. See
  L<Perinci::Sub::Wrapper> for more details on wrapping. The default behavior will
  call wrapped functions.
  
  =item * Custom location of metadata
  
  By default, metadata are assumed to be stored embedded in Perl source code in
  C<%SPEC> package variables (with keys matching function names, C<$variable>
  names, or C<:package> for the package metadata itself).
  
  You can override C<get_meta()> to provide custom behavior. For example, you can
  store metadata in separate file or database.
  
  =item * Custom code entity tree
  
  By default, tree are formed by traversing Perl packages and their contents, for
  example if a C<list> action is requested on uri C</Foo/Bar/> then the contents
  of package C<Foo::Bar> and its subpackages will be traversed for the entities.
  
  You can override C<action_list()> to provide custom behavior. For example, you
  can lookup from the database.
  
  =item * Progress indicator
  
  Functions can express that they do progress updating through the C<features>
  property in its metadata:
  
   features => {
       progress => 1,
       ...
   }
  
  For these functions, this class will pass a special argument C<-progress>
  containing L<Progress::Any> object. Functions can update progress using this
  object.
  
  =back
  
  =head2 How request is processed
  
  User calls C<< $pa->request($action => $uri, \%extras) >>. Internally, the
  method creates a hash C<$req> which contains Riap request keys as well as
  internal information about the Riap request (the latter will be prefixed with
  dash C<->). Initially it will contain C<action> and C<uri> and the C<%extras>
  keys from the request() arguments sent by the user.
  
  Internal C<_parse_uri()> method will be called to parse C<uri> into C<-uri_dir>
  (the "dir" part), C<-uri_leaf> (the "basename" part), and C<-perl_package>.
  Forbidden or invalid paths will cause this method to return an enveloped error
  response and the request to stop. For example, if C<uri> is C</Foo/Bar/> then
  C<-uri_dir> is C</Foo/Bar/> and C<-uri_leaf> is an empty string. If C<uri> is
  C</Foo/Bar/baz> then C<-uri_dir> is C</Foo/Bar/> while C<-uri_leaf> is C<baz>.
  C<-uri_dir> will be used for the C<list> action. In both cases, C<-perl_package>
  will be set to C<Foo::Bar>.
  
  The code entity type is then determined currently using a few simple heuristic
  rules: if C<-uri_leaf> is empty string, type is C<package>. If C<-uri_leaf>
  begins with C<[$%@]>, type is C<variable>. Otherwise, type is C<function>.
  C<-type> will be set.
  
  After this, the appropriate C<action_ACTION()> method will be called. For
  example if action is C<meta> then C<action_meta()> method will be called, with
  C<$req> as the argument. This will in turn, depending on the action, either call
  C<get_meta()> (for example if action is C<meta>) or C<get_code()> (for example
  if action is C<call>), also with C<$req> as the argument. C<get_meta()> and
  C<get_code()> should return nothing on success, and set either C<-meta> (a
  defhash containing Rinci metadata) or C<-code> (a coderef), respectively. On
  error, they must return an enveloped error response.
  
  C<get_meta()> or C<get_code()> might call C<_load_module()> to load Perl modules
  if the C<load> attribute is set to true.
  
  =for Pod::Coverage ^(actionmeta_.+|action_.+|get_(meta|code))$
  
  =head1 ADDED RESULT METADATA
  
  This class might add the following property/attribute in result metadata:
  
  =head2 x.hint.result_binary => bool
  
  If result's schema type is C<buf>, then this class will set this attribute to
  true, to give hints to result formatters.
  
  =head1 METHODS
  
  =head2 PKG->new(%attrs) => OBJ
  
  Instantiate object. Known attributes:
  
  =over 4
  
  =item * load => BOOL (default: 1)
  
  Whether to load Perl modules that are requested.
  
  =item * after_load => CODE
  
  If set, code will be executed the first time Perl module is successfully loaded.
  
  =item * wrap => BOOL (default: 1)
  
  If set to false, then wil use original subroutine and metadata instead of
  wrapped ones, for example if you are very concerned about performance (do not
  want to add another eval {} and subroutine call introduced by wrapping) or do
  not need the functionality provided by the wrapper (e.g. your function already
  validates its arguments, accepts arguments as hash, and returns enveloped
  result).
  
  Wrapping is implemented inside C<get_code()>.
  
  =item * set_function_properties => HASH
  
  If set, will be passed to L<Perinci::Sub::Wrapper> wrap_sub()'s C<convert>
  argument when wrapping subroutines. Some applications of this include: changing
  C<default_lang> of metadata.
  
  This is only relevant if you enable C<wrap>.
  
  =item * cache_size => INT (default: 100)
  
  Specify cache size (in number of items), for caching metadata and wrapping
  result. Setting this to 0 disables caching.
  
  Caching is implemented inside C<get_meta()> and C<get_code()> so you might want
  to implement your own caching if you override those.
  
  =item * allow_paths => REGEX|STR|ARRAY
  
  If defined, only requests with C<uri> matching specified path will be allowed.
  Can be a string (e.g. C</spanel/api/>) or regex (e.g. C<< qr{^/[^/]+/api/} >>)
  or an array of those.
  
  =item * deny_paths => REGEX|STR|ARRAY
  
  If defined, requests with C<uri> matching specified path will be denied. Like
  C<allow_paths>, value can be a string (e.g. C</spanel/api/>) or regex (e.g. C<<
  qr{^/[^/]+/api/} >>) or an array of those.
  
  =item * allow_schemes => REGEX|STR|ARRAY
  
  By default this class does not care about schemes, it only looks at the uri
  path. You can use this option to limit allowed schemes.
  
  =item * deny_schemes => REGEX|STR|ARRAY
  
  By default this class does not care about schemes, it only looks at the uri
  path. You can use this option to specify forbidden schemes.
  
  =item * use_tx => BOOL (default: 0)
  
  Whether to allow transaction requests from client. Since this can cause the
  server to store transaction/undo data, this must be explicitly allowed.
  
  You need to install L<Perinci::Tx::Manager> for transaction support (unless you
  are using another transaction manager).
  
  =item * custom_tx_manager => STR|CODE
  
  Can be set to a string (class name) or a code that is expected to return a
  transaction manager class.
  
  By default, L<Perinci::Tx::Manager> is instantiated and maintained (not
  reinstantiated on every request), but if C<custom_tx_manager> is a coderef, it
  will be called on each request to get transaction manager. This can be used to
  instantiate Perinci::Tx::Manager in a custom way, e.g. specifying per-user
  transaction data directory and limits, which needs to be done on a per-request
  basis.
  
  =item * accept_argv => BOOL (default: 1)
  
  From version 0.64, C<argv> key is accepted by the C<call> action and will be
  converted to C<args>. This server-side conversion from C<argv> to <args> can
  handle coderefs in C<cmdline_aliases> (and probably other things too) compared
  when doing conversion at the client-side.
  
  This option allows disabling this behavior.
  
  =back
  
  =head2 $pa->request($action => $server_url, \%extra) => $res
  
  Process Riap request and return enveloped result. $server_url will be used as
  the Riap request key 'uri', as there is no server in this case.
  
  =head2 $pa->parse_url($server_url) => HASH
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Perinci-Access-Perl>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Perinci-Access-Perl>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Perinci-Access-Perl>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Riap>, L<Rinci>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
PERINCI_ACCESS_SCHEMELESS

    $main::fatpacked{"Perinci/Access/Simple/Client.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PERINCI_ACCESS_SIMPLE_CLIENT';
  package Perinci::Access::Simple::Client;
  
  our $DATE = '2017-07-03'; # DATE
  our $VERSION = '0.23'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  use Log::ger;
  
  use Cwd qw(abs_path);
  use Perinci::AccessUtil qw(strip_riap_stuffs_from_res);
  use POSIX qw(:sys_wait_h);
  use Tie::Cache;
  use URI::Split qw(uri_split);
  use URI::Escape;
  
  use parent qw(Perinci::Access::Base);
  
  sub new {
      my $class = shift;
  
      my $self = $class->SUPER::new(@_);
  
      # attributes
      $self->{retries}         //= 2;
      $self->{retry_delay}     //= 3;
      $self->{conn_cache_size} //= 32;
  
      # connection cache, key="tcp:HOST:PORT" OR "unix:ABSPATH" or "pipe:ABSPATH
      # ARGS". value=hash, for tcp & unix {socket=>...} and for pipe {pid=>...,
      # chld_out=>..., chld_in=>...}
      tie my(%conns), 'Tie::Cache', $self->{conn_cache_size};
      $self->{_conns} = \%conns;
  
      $self;
  }
  
  # for older Perinci::Access::Base 0.28-, to remove later
  sub _init {}
  
  sub _delete_cache {
      my ($self, $wanted) = @_;
      my $conns = $self->{_conns};
      return unless $conns;
  
      for my $k ($wanted ? ($wanted) : (keys %$conns)) {
          if ($k =~ /^pipe:/) {
              waitpid($conns->{$k}{pid}, WNOHANG);
          }
          delete $self->{_conns}{$k};
      }
  }
  
  sub DESTROY {
      my ($self) = @_;
  
      #$self->_delete_cache;
  }
  
  sub request {
      my $self = shift;
      $self->_parse_or_request('request', @_);
  }
  
  sub _parse {
      my $self = shift;
      $self->_parse_or_request('parse2', @_);
  }
  
  # which: parse0 = quick parse (for parse_url(), parse2 = more thorough parse
  # (for testing)
  sub _parse_or_request {
      my ($self, $which, $action, $server_url, $extra) = @_;
      log_trace("=> %s\::request(action=%s, server_url=%s, extra=%s)",
                   __PACKAGE__, $action, $server_url, $extra);
      return [400, "Please specify server_url"] unless $server_url;
  
      my ($uri,
          $cache_key,
          $host, $port, # tcp
          $path,        # unix & pipe
          $args         # pipe
      );
      my ($srvsch, $srvauth, $srvpath, $srvquery, $srvfrag) =
          uri_split($server_url);
      $srvauth //= "";
      $srvpath //= "";
      return [400, "Please supply only riap+tcp/riap+unix/riap+pipe URL"]
          unless $srvsch =~ /\Ariap\+(tcp|unix|pipe)\z/;
      if ($srvsch eq 'riap+tcp') {
          if ($srvauth =~ m!^(.+):(\d+)$!) {
              ($host, $port) = ($1, $2, $3);
              $uri = $srvpath;
              $cache_key = "tcp:".lc($host).":$port";
          } else {
              return [400, "Invalid riap+tcp URL, please use this format: ".
                  "riap+tcp://host:1234 or riap+tcp://host:1234/uri"];
          }
      } elsif ($srvsch eq 'riap+unix') {
          if ($srvpath =~ m!(.+)/(/.*)!) {
              ($path, $uri) = (uri_unescape($1), $2);
          } elsif ($srvpath =~ m!(.+)!) {
              $path = uri_unescape($1);
          }
          unless ($which eq 'parse0') {
              if (defined($path)) {
                  my $apath = abs_path($path) or
                      return [500, "Can't find absolute path for $path"];
                  $cache_key = "unix:$apath";
              } else {
                  return [400, "Invalid riap+unix URL, please use this format: ".
                              ", e.g.: riap+unix:/path/to/unix/socket or ".
                                  "riap+unix:/path/to/unix/socket//uri"];
              }
          }
      } elsif ($srvsch eq 'riap+pipe') {
          if ($srvpath =~ m!(.+?)//(.*?)/(/.*)!) {
              ($path, $args, $uri) = (uri_unescape($1), $2, $3);
          } elsif ($srvpath =~ m!(.+?)//(.*)!) {
              ($path, $args) = (uri_unescape($1), $2);
          } elsif ($srvpath =~ m!(.+)!) {
              $path = uri_unescape($1);
              $args = '';
          }
          $args = [map {uri_unescape($_)} split m!/!, $args // ''];
          unless ($which eq 'parse0') {
              if (defined($path)) {
                  my $apath = abs_path($path) or
                      return [500, "Can't find absolute path for $path"];
                  $cache_key = "pipe:$apath ".join(" ", @$args);
              } else {
                  return [400, "Invalid riap+pipe URL, please use this format: ".
                              "riap+pipe:/path/to/prog or ".
                                  "riap+pipe:/path/to/prog//arg1/arg2 or ".
                                      "riap+pipe:/path/to/prog//arg1/arg2//uri"];
              }
          }
      }
  
      my $req;
      my $res;
  
      unless ($which eq 'parse0') {
          $req = { v=>$self->{riap_version}, action=>$action, %{$extra // {}} };
          $uri ||= $req->{uri}; $req->{uri} //= $uri;
          $res = $self->check_request($req);
          return $res if $res;
      }
  
      if ($which =~ /parse/) {
          return [200, "OK", {
              args=>$args, host=>$host, path=>$path, port=>$port,
              scheme=>$srvsch, uri=>$uri,
          }];
      }
  
      log_trace("Parsed URI, scheme=%s, host=%s, port=%s, path=%s, args=%s, ".
                       "uri=%s", $srvsch, $host, $port, $path, $args, $uri);
  
      require JSON::MaybeXS;
      state $json = JSON::MaybeXS->new->allow_nonref;
  
      my $attempts = 0;
      my $do_retry;
      my $e;
      while (1) {
          $do_retry = 0;
  
          my ($in, $out);
          my $cache = $self->{_conns}{$cache_key};
          # check cache staleness
          if ($cache) {
              if ($srvsch =~ /tcp|unix/) {
                  if ($cache->{socket}->connected) {
                      $in = $out = $cache->{socket};
                  } else {
                      log_info("Stale socket cache (%s), discarded",
                                  $cache_key);
                      $cache = undef;
                  }
              } else {
                  if (kill(0, $cache->{pid})) {
                      $in  = $cache->{chld_out};
                      $out = $cache->{chld_in};
                  } else {
                      log_info(
                          "Process (%s) seems dead/unsignalable, discarded",
                          $cache_key);
                      $cache = undef;
                  }
              }
          }
          # connect
          if (!$cache) {
              if ($srvsch =~ /tcp|unix/) {
                  my $sock;
                  if ($srvsch eq 'riap+tcp') {
                      require IO::Socket::INET;
                      $sock = IO::Socket::INET->new(
                          PeerHost => $host,
                          PeerPort => $port,
                          Proto    => 'tcp',
                      );
                  } else {
                      use IO::Socket::UNIX;
                      $sock = IO::Socket::UNIX->new(
                          Type => SOCK_STREAM,
                          Peer => $path,
                      );
                  }
                  $e = $@;
                  if ($sock) {
                      $self->{_conns}{$cache_key} = {socket=>$sock};
                      $in = $out = $sock;
                  } else {
                      $e = $srvsch eq 'riap+tcp' ?
                          "Can't connect to TCP socket $host:$port: $e" :
                              "Can't connect to Unix socket $path: $e";
                      $do_retry++; goto RETRY;
                  }
              } else {
                  # taken from Modern::Perl. enable methods on filehandles;
                  # unnecessary when 5.14 autoloads them
                  require IO::File;
                  require IO::Handle;
  
                  require IPC::Open2;
  
                  require String::ShellQuote;
                  my $cmd = $path . (@$args ? " " . join(" ", map {
                      String::ShellQuote::shell_quote($_) } @$args) : "");
                  log_trace("executing cmd: %s", $cmd);
  
                  # using shell
                  #my $pid = IPC::Open2::open2($in, $out, $cmd, @$args);
  
                  # not using shell
                  my $pid = IPC::Open2::open2($in, $out, $path, @$args);
  
                  if ($pid) {
                      $self->{_conns}{$cache_key} = {
                          pid=>$pid, chld_out=>$in, chld_in=>$out};
                  } else {
                      $e = "Can't open2 $cmd: $!";
                      $do_retry++; goto RETRY;
                  }
              }
          }
  
          my $req_json;
          eval { $req_json = $json->encode($req) };
          $e = $@;
          return [400, "Can't encode request as JSON: $e"] if $e;
  
          $out->write("j$req_json\015\012");
          log_trace("Sent request to server: %s", $req_json);
  
          # XXX alarm/timeout
          my $line = $in->getline;
          log_trace("Got line from server: %s", $line);
          if (!$line) {
              $self->_delete_cache($cache_key);
              return [500, "Empty response from server"];
          } elsif ($line !~ /^j(.+)/) {
              $self->_delete_cache($cache_key);
              return [500, "Invalid response line from server: $line"];
          }
          eval { $res = $json->decode($1) };
          $e = $@;
          if ($e) {
              $self->_delete_cache($cache_key);
              return [500, "Invalid JSON response from server: $e"];
          }
          strip_riap_stuffs_from_res($res);
          return $res;
  
        RETRY:
          if ($do_retry && $attempts++ < $self->{retries}) {
              log_trace("Request failed ($e), waiting to retry #%s...",
                           $attempts);
              sleep $self->{retry_delay};
          } else {
              last;
          }
      }
      return [500, "$e (tried $attempts times)"];
  }
  
  sub request_tcp {
      my ($self, $action, $hostport, $extra) = @_;
      $self->request($action, "riap+tcp://$hostport->[0]:$hostport->[1]", $extra);
  }
  
  sub request_unix {
      my ($self, $action, $sockpath, $extra) = @_;
      $self->request($action => "riap+unix:" . uri_escape($sockpath), $extra);
  }
  
  sub request_pipe {
      my ($self, $action, $cmd, $extra) = @_;
      $self->request($action => "riap+pipe:" . uri_escape($cmd->[0]) . "//" .
                         join("/", map {uri_escape($_)} @$cmd[1..@$cmd-1]),
                     $extra);
  }
  
  sub parse_url {
      my ($self, $uri) = @_;
  
      my $res0 = $self->_parse_or_request('parse0', 'dummy', $uri);
      #use Data::Dump; dd $res0;
      die "Can't parse URL $uri: $res0->[0] - $res0->[1]" unless $res0->[0]==200;
      $res0 = $res0->[2];
      my $res = {proto=>$res0->{scheme}, path=>$res0->{uri}};
      if ($res->{proto} eq 'riap+unix') {
          $res->{unix_sock_path} = $res0->{path};
      } elsif ($res->{proto} eq 'riap+tcp') {
          $res->{host} = $res0->{host};
          $res->{port} = $res0->{port};
      } elsif ($res->{proto} eq 'riap+pipe') {
          $res->{prog_path} = $res0->{path};
          $res->{args} = $res0->{args};
      }
  
      $res;
  }
  
  1;
  # ABSTRACT: Riap::Simple client
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Perinci::Access::Simple::Client - Riap::Simple client
  
  =head1 VERSION
  
  This document describes version 0.23 of Perinci::Access::Simple::Client (from Perl distribution Perinci-Access-Simple-Client), released on 2017-07-03.
  
  =head1 SYNOPSIS
  
   use Perinci::Access::Simple::Client;
   my $pa = Perinci::Access::Simple::Client->new;
  
   my $res;
  
   ## performing Riap requests
  
   # to request server over TCP
   $res = $pa->request(call => 'riap+tcp://localhost:5678/Foo/Bar/func',
                       {args => {a1=>1, a2=>2}});
  
   # to request server over Unix socket (separate Unix socket path and Riap
   # request key 'uri' with an extra slash /)
   $res = $pa->request(call => 'riap+unix:/var/run/api.sock//Foo/Bar/func',
                       {args => {a1=>1, a2=>2}});
  
   # to request "server" (program) over pipe (separate program path and first
   # argument with an extra slash /, then separate each program argument with
   # slashes, finally separate last program argument with Riap request key 'uri'
   # with an extra slash /). Arguments are URL-escaped so they can contain slashes
   # if needed (in the encoded form of %2F).
   $res = $pa->request(call => 'riap+pipe:/path/to/prog//arg1/arg2//Foo/Bar/func',
                       {args => {a1=>1, a2=>2}});
  
   # an example for riap+pipe, accessing a remote program via SSH client
   use URI::Escape;
   my @cmd = ('ssh', '-T', 'user@host', '/path/to/program', 'first arg', '2nd');
   my $uri = "/Foo/Bar/func";
   $res = $pa->request(call => 'riap+pipe:' .
                               uri_escape($cmd[0]) . '//' .
                               join('/', map { uri_escape($_) } @cmd[1..@cmd-1]) . '/' .
                               $uri,
                       {args => {a1=>1, a2=>2}});
  
   # helper for riap+tcp
   $res = $pa->request_tcp(call => [$host, $port], \%extra);
  
   # helper for riap+unix
   $res = $pa->request_unix(call => $sockpath, \%extra);
  
   # helper for riap+pipe
   my @cmd = ('/path/to/program', 'first arg', '2nd');
   $res = $pa->request_pipe(call => \@cmd, \%extra);
  
   ## parsing URL
  
   $res = $pa->parse_url("riap+unix:/var/run/apid.sock//Foo/bar");   # -> {proto=>"riap+unix", path=>"/Foo/bar", unix_sock_path=>"/var/run/apid.sock"}
   $res = $pa->parse_url("riap+tcp://localhost:5000/Foo/bar");       # -> {proto=>"riap+tcp" , path=>"/Foo/bar", host=>"localhost", port=>5000}
   $res = $pa->parse_url("riap+pipe:/path/to/prog//a1/a2//Foo/bar"); # -> {proto=>"riap+pipe", path=>"/Foo/bar", prog_path=>"/path/to/prog", args=>["a1", "a2"]}
  
  =head1 DESCRIPTION
  
  This class implements L<Riap::Simple> client. It supports the 'riap+tcp',
  'riap+unix', and 'riap+pipe' schemes for a variety of methods to access the
  server: either via TCP (where the server can be on a remote computer), Unix
  socket, or a program (where the program can also be on a remote computer, e.g.
  accessed via ssh).
  
  =head1 METHODS
  
  =head2 PKG->new(%attrs) => OBJ
  
  Instantiate object. Known attributes:
  
  =over 4
  
  =item * retries => INT (default 2)
  
  Number of retries to do on network failure. Setting it to 0 will disable
  retries.
  
  =item * retry_delay => INT (default 3)
  
  Number of seconds to wait between retries.
  
  =back
  
  =head2 $pa->request($action => $server_url, \%extra) => $res
  
  Send Riap request to C<$server_url>.
  
  =head2 $pa->request_tcp($action => [$host, $port], \%extra) => $res
  
  Helper/wrapper for request(), it forms C<$server_url> using:
  
   "riap+tcp://$host:$port"
  
  You need to specify Riap request key 'uri' in C<%extra>.
  
  =head2 $pa->request_unix($action => $sockpath, \%extra) => $res
  
  Helper/wrapper for request(), it forms C<$server_url> using:
  
   "riap+unix:" . uri_escape($sockpath)
  
  You need to specify Riap request key 'uri' in C<%extra>.
  
  =head2 $pa->request_pipe($action => \@cmd, \%extra) => $res
  
  Helper/wrapper for request(), it forms C<$server_url> using:
  
   "riap+pipe:" . uri_escape($cmd[0]) . "//" .
   join("/", map {uri_escape($_)} @cmd[1..@cmd-1])
  
  You need to specify Riap request key 'uri' in C<%extra>.
  
  =head2 $pa->parse_url($server_url) => HASH
  
  =head1 FAQ
  
  =head2 When I use riap+pipe, is the program executed for each Riap request?
  
  No, this module does some caching, so if you call the same program (with the
  same arguments) 10 times, the same program will be used and it will receive 10
  Riap requests using the L<Riap::Simple> protocol.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Perinci-Access-Simple-Client>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/sharyanto/perl-Perinci-Access-Simple-Client>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Perinci-Access-Simple-Client>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Perinci::Access::Simple::Server>
  
  L<Riap::Simple>, L<Riap>, L<Rinci>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2017, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
PERINCI_ACCESS_SIMPLE_CLIENT

    $main::fatpacked{"Perinci/AccessUtil.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PERINCI_ACCESSUTIL';
  package Perinci::AccessUtil;
  
  our $DATE = '2015-09-06'; # DATE
  our $VERSION = '0.06'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  use MIME::Base64;
  
  require Exporter;
  our @ISA = qw(Exporter);
  our @EXPORT_OK = qw(insert_riap_stuffs_to_res
                      strip_riap_stuffs_from_res
                      decode_args_in_riap_req);
  
  sub insert_riap_stuffs_to_res {
      my ($res, $def_ver, $nmeta, $encode) = @_;
  
      $res->[3]{'riap.v'} //= $def_ver // 1.1;
      if ($res->[3]{'riap.v'} >= 1.2) {
          # do we need to base64-encode?
          {
              last unless $encode // 1;
              last if $res->[3]{'riap.result_encoding'};
              if ($nmeta) {
                  last unless $nmeta->{result}{schema} &&
                      $nmeta->{result}{schema}[0] eq 'buf';
              }
              last unless defined($res->[2]) && !ref($res->[2]) &&
                  $res->[2] =~ /[^\x20-\x7f]/;
              $res->[2] = encode_base64($res->[2], "");
              $res->[3]{'riap.result_encoding'} = 'base64';
          }
      }
      $res;
  }
  
  sub strip_riap_stuffs_from_res {
      my $res = shift;
  
      my $ver = $res->[3]{'riap.v'} // 1.1;
      return [501, "Riap version returned by server ($ver) is not supported, ".
                  "only recognize v1.1 and v1.2"]
          unless $ver == 1.1 || $ver == 1.2;
  
      if ($ver >= 1.2) {
          # check and strip riap.*
          for my $k (keys %{$res->[3]}) {
              next unless $k =~ /\Ariap\./;
              my $val = $res->[3]{$k};
              if ($k eq 'riap.v') {
              } elsif ($k eq 'riap.result_encoding') {
                  return [501, "Unknown result_encoding returned by server ".
                              "($val), only base64 is supported"]
                      unless $val eq 'base64';
                  $res->[2] = decode_base64($res->[2]//'');
              } else {
                  return [501, "Unknown Riap attribute in result metadata ".
                              "returned by server ($k)"];
              }
              delete $res->[3]{$k};
          }
      }
  
      $res;
  }
  
  sub decode_args_in_riap_req {
      my $req = shift;
  
      my $v = $req->{v} // 1.1;
      if ($v >= 1.2) {
          if ($req->{args}) {
              my $args = $req->{args};
              for (keys %$args) {
                  next unless /\A(.+):base64\z/;
                  $args->{$1} = decode_base64($args->{$_});
                  delete $args->{$_};
              }
          }
      }
      $req;
  }
  
  1;
  # ABSTRACT: Utility module for Riap client/server
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Perinci::AccessUtil - Utility module for Riap client/server
  
  =head1 VERSION
  
  This document describes version 0.06 of Perinci::AccessUtil (from Perl distribution Perinci-AccessUtil), released on 2015-09-06.
  
  =head1 SYNOPSIS
  
   use Perinci::AccessUtil qw(
       strip_riap_stuffs_from_res
       insert_riap_stuffs_to_res
       decode_args_in_riap_req
   );
  
   strip_riap_stuffs_from_res([200,"OK",undef,{"riap.v"=>1.1}]); # => [200,"OK",undef]
   strip_riap_stuffs_from_res([200,"OK",undef,{"riap.foo"=>1}]); # => [501, "Unknown Riap attribute in result metadata: riap.foo"]
  
   insert_riap_stuffs_to_res([200,"OK",undef); # => [200,"OK",undef,{"riap.v"=>1.1}]
  
   decode_args_in_riap_req({v=>1.2, args=>{"a:base64"=>"AAAA"}}); # => {v=>1.2, args=>{a=>"\0\0\0"}}
  
  =head1 DESCRIPTION
  
  =head1 FUNCTIONS
  
  =head2 insert_riap_stuffs_to_res($envres[, $def_ver, $nmeta, $decode]) => array
  
  Starting in Riap protocol v1.2, server is required to return C<riap.v> in result
  metadata. This routine does just that. In addition to that, this routine also
  encodes result with base64 when necessary.
  
  This routine is used by Riap network server libraries, e.g.
  L<Perinci::Access::HTTP::Server> and L<Perinci::Access::Simple::Server>.
  
  =head2 strip_riap_stuffs_from_res($envres) => array
  
  Starting in Riap protocol v1.2, client is required to check and strip all
  C<riap.*> keys in result metadata (C<< $envres->[3] >>). This routine does just
  that. In addition, this routine also decode result if C<riap.result_encoding> is
  set, so the user already gets the decoded content.
  
  This routine is used by Riap client libraries, e.g. L<Perinci::Access::Lite>,
  L<Perinci::Access::Perl>, and L<Perinci::Access::HTTP::Client>,
  L<Perinci::Access::Simple::Client>.
  
  If there is no error, will return C<$envres> with all C<riap.*> keys already
  stripped. If there is an error, an error response will be returned instead.
  Either way, you can use the response returned by this function to user.
  
  =head2 decode_args_in_riap_req($req) => $req
  
  Replace C<ARGNAME:base64> keys in C<arg> in Riap request C<$req> with their
  decoded values. Only done when C<v> key is at least 1.2.
  
  This routine is used in Riap server libraries like in
  L<Perinci::Access::HTTP::Server> and Perinci::Access::Simple::Server::*.
  
  =head1 SEE ALSO
  
  L<Riap>, L<Perinci::Access>.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Perinci-AccessUtil>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Perinci-AccessUtil-Check>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Perinci-AccessUtil>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2015 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
PERINCI_ACCESSUTIL

    $main::fatpacked{"Perinci/CmdLine/Base.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PERINCI_CMDLINE_BASE';
  package Perinci::CmdLine::Base;
  
  our $DATE = '2020-01-31'; # DATE
  our $VERSION = '1.826'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  use Log::ger;
  
  # this class can actually be a role instead of base class for pericmd &
  # pericmd-lite, but Mo is more lightweight than Role::Tiny (also R::T doesn't
  # have attributes), Role::Basic, or Moo::Role.
  
  BEGIN {
      if ($INC{'Perinci/CmdLine/Classic.pm'}) {
          require Moo; Moo->import;
      } else {
          require Mo; Mo->import(qw(build default));
      }
  }
  
  # BEGIN taken from Array::Iter
  sub __array_iter {
      my $ary = shift;
      my $i = 0;
      sub {
          if ($i < @$ary) {
              return $ary->[$i++];
          } else {
              return undef;
          }
      };
  }
  
  sub __list_iter {
      __array_iter([@_]);
  }
  # END from Array::Iter
  
  has actions => (is=>'rw');
  has common_opts => (is=>'rw');
  has completion => (is=>'rw');
  has default_subcommand => (is=>'rw');
  has get_subcommand_from_arg => (is=>'rw', default=>1);
  has auto_abbrev_subcommand => (is=>'rw', default=>1);
  has description => (is=>'rw');
  has exit => (is=>'rw', default=>1);
  has formats => (is=>'rw');
  has default_format => (is=>'rw');
  has pass_cmdline_object => (is=>'rw', default=>0);
  has per_arg_json => (is=>'rw');
  has per_arg_yaml => (is=>'rw');
  has program_name => (
      is=>'rw',
      default => sub {
          my $pn = $ENV{PERINCI_CMDLINE_PROGRAM_NAME};
          if (!defined($pn)) {
              $pn = $0; $pn =~ s!.+/!!;
          }
          $pn;
      });
  has riap_version => (is=>'rw', default=>1.1);
  has riap_client => (is=>'rw');
  has riap_client_args => (is=>'rw');
  has subcommands => (is=>'rw');
  has summary => (is=>'rw');
  has tags => (is=>'rw');
  has url => (is=>'rw');
  has log => (is=>'rw', default => 0);
  has log_level => (is=>'rw');
  
  has read_env => (is=>'rw', default=>1);
  has env_name => (
      is => 'rw',
      lazy => 1,
      default => sub {
          my $self = shift;
          __default_env_name($self->program_name);
      },
  );
  
  has read_config => (is=>'rw', default=>1);
  has config_filename => (is=>'rw');
  has config_dirs => (
      is=>'rw',
      default => sub {
          require Perinci::CmdLine::Util::Config;
          Perinci::CmdLine::Util::Config::get_default_config_dirs();
      },
  );
  
  has cleanser => (
      is => 'rw',
      lazy => 1,
      default => sub {
          require Data::Clean::JSON;
          Data::Clean::JSON->get_cleanser;
      },
  );
  has use_cleanser => (is=>'rw', default=>1);
  
  has extra_urls_for_version => (is=>'rw');
  
  has skip_format => (is=>'rw');
  
  has use_utf8 => (
      is=>'rw',
      default => sub {
          $ENV{UTF8} // 0;
      },
  );
  
  has use_locale => (
      is=>'rw',
      default => 0,
  );
  
  has default_dry_run => (
      is=>'rw',
      default => 0,
  );
  
  # role: requires 'default_prompt_template'
  
  # role: requires 'hook_before_run'
  # role: requires 'hook_before_parse_argv'
  # role: requires 'hook_before_read_config_file'
  # role: requires 'hook_config_file_section'
  # role: requires 'hook_after_read_config_file'
  # role: requires 'hook_after_get_meta'
  # role: requires 'hook_after_parse_argv'
  # role: requires 'hook_before_action'
  # role: requires 'hook_format_row' (for action=call)
  # role: requires 'hook_after_action'
  # role: requires 'hook_format_result'
  # role: requires 'hook_display_result'
  # role: requires 'hook_after_run'
  
  # we put common stuffs here, but PC::Classic's final version will differ from
  # PC::Lite's in several aspects: translation, supported output formats,
  # PC::Classic currently adds some extra keys, some options are not added by
  # PC::Lite (e.g. history/undo stuffs).
  our %copts = (
  
      version => {
          getopt  => "version|v",
          summary => "Display program's version and exit",
          usage   => "--version (or -v)",
          handler => sub {
              my ($go, $val, $r) = @_;
              $r->{action} = 'version';
              $r->{skip_parse_subcommand_argv} = 1;
          },
      },
  
      help => {
          getopt  => 'help|h|?',
          summary => 'Display help message and exit',
          usage   => "--help (or -h, -?)",
          handler => sub {
              my ($go, $val, $r) = @_;
              $r->{action} = 'help';
              $r->{skip_parse_subcommand_argv} = 1;
          },
          order => 0, # high
      },
  
      format => {
          getopt  => 'format=s',
          summary => 'Choose output format, e.g. json, text',
          handler => sub {
              my ($go, $val, $r) = @_;
              $r->{format} = $val;
          },
          default => undef,
          tags => ['category:output'],
          is_settable_via_config => 1,
      },
      json => {
          getopt  => 'json',
          summary => 'Set output format to json',
          handler => sub {
              my ($go, $val, $r) = @_;
              $r->{format} = (-t STDOUT) ? 'json-pretty' : 'json';
          },
          tags => ['category:output'],
      },
  
      page_result => {
          getopt  => "page-result:s",
          summary => "Filter output through a pager",
          usage   => "--page-result (or --page-result=PROGNAME)",
          handler => sub {
              my ($go, $val, $r) = @_;
              $r->{page_result} = 1;
              $r->{pager} = $val if length $val;
          },
          tags => ['category:output'],
      },
  
      naked_res => {
          getopt  => 'naked-res!',
          summary => 'When outputing as JSON, strip result envelope',
          'summary.alt.bool.not' => 'When outputing as JSON, add result envelope',
          description => <<'_',
  
  By default, when outputing as JSON, the full enveloped result is returned, e.g.:
  
      [200,"OK",[1,2,3],{"func.extra"=>4}]
  
  The reason is so you can get the status (1st element), status message (2nd
  element) as well as result metadata/extra result (4th element) instead of just
  the result (3rd element). However, sometimes you want just the result, e.g. when
  you want to pipe the result for more post-processing. In this case you can use
  `--naked-res` so you just get:
  
      [1,2,3]
  
  _
          handler => sub {
              my ($go, $val, $r) = @_;
              $r->{naked_res} = $val ? 1:0;
          },
          default => 0,
          tags => ['category:output'],
          is_settable_via_config => 1,
      },
  
      subcommands => {
          getopt  => 'subcommands',
          summary => 'List available subcommands',
          usage   => "--subcommands",
          show_in_usage => sub {
              my ($self, $r) = @_;
              !$r->{subcommand_name};
          },
          handler => sub {
              my ($go, $val, $r) = @_;
              $r->{action} = 'subcommands';
              $r->{skip_parse_subcommand_argv} = 1;
          },
      },
  
      # 'cmd=SUBCOMMAND_NAME' can be used to select other subcommands when
      # default_subcommand is in effect.
      cmd => {
          getopt  => "cmd=s",
          summary => 'Select subcommand',
          handler => sub {
              my ($go, $val, $r) = @_;
              $r->{subcommand_name} = $val;
              $r->{subcommand_name_from} = '--cmd';
          },
          completion => sub {
              require Complete::Util;
              my %args = @_;
              my $cmdline = $args{cmdline};
              Complete::Util::complete_array_elem(
                  array => [keys %{ $cmdline->list_subcommands }],
                  word  => $args{word},
                  ci    => 1,
              );
          },
      },
  
      config_path => {
          getopt  => 'config-path=s@',
          schema  => ['array*', of => 'filename*'],
          summary => 'Set path to configuration file',
          handler => sub {
              my ($go, $val, $r) = @_;
              $r->{config_paths} //= [];
              push @{ $r->{config_paths} }, $val;
          },
          tags => ['category:configuration'],
      },
      no_config => {
          getopt  => 'no-config',
          summary => 'Do not use any configuration file',
          handler => sub {
              my ($go, $val, $r) = @_;
              $r->{read_config} = 0;
          },
          tags => ['category:configuration'],
      },
      no_env => {
          getopt  => 'no-env',
          summary => 'Do not read environment for default options',
          handler => sub {
              my ($go, $val, $r) = @_;
              $r->{read_env} = 0;
          },
          tags => ['category:environment'],
      },
      config_profile => {
          getopt  => 'config-profile=s',
          summary => 'Set configuration profile to use',
          handler => sub {
              my ($go, $val, $r) = @_;
              $r->{config_profile} = $val;
          },
          completion => sub {
              # return list of profiles in read config file
  
              my %args = @_;
              my $word    = $args{word} // '';
              my $cmdline = $args{cmdline};
              my $r       = $args{r};
  
              # we are not called from cmdline, bail (actually we might want to
              # return list of programs anyway, but we want to read the value of
              # bash_global_dir et al)
              return {message=>'No completion (not called from cmdline)'}
                  unless $cmdline;
  
              # since this is common option, at this point we haven't parsed
              # argument or even read config file. let's parse argv first (argv
              # might set --config-path). then read the config files.
              {
                  # this is not activated yet
                  $r->{read_config} = 1;
  
                  my $res = $cmdline->parse_argv($r);
                  #return undef unless $res->[0] == 200;
  
                  # parse_argv() might decide that it doesn't need to read config
                  # files (e.g. in the case of program having a subcommand and
                  # user does not specify any subcommand name, then it will
                  # shortcut to --help and set skip_parse_subcommand_argv=1). we
                  # don't want that here, we want to force reading config files:
                  $cmdline->_read_config($r) unless $r->{config};
              }
  
              # we are not reading any config file, return empty list
              return {message=>'No completion (not reading any config file)'}
                  unless $r->{config};
  
              my @profiles;
              for my $section (keys %{$r->{config}}) {
                  my %keyvals;
                  for my $word (split /\s+/, ($section eq 'GLOBAL' ? '' : $section)) {
                      if ($word =~ /(.+)=(.*)/) {
                          $keyvals{$1} = $2;
                      } else {
                          # old syntax, will be removed sometime in the future
                          $keyvals{subcommand} = $word;
                      }
                  }
                  if (defined(my $p = $keyvals{profile})) {
                      push @profiles, $p unless grep {$_ eq $p} @profiles;
                  }
              }
  
              require Complete::Util;
              Complete::Util::complete_array_elem(
                  array=>\@profiles, word=>$word, ci=>1);
          },
          tags => ['category:configuration'],
      },
  
      # since the cmdline opts is consumed, Log::Any::App doesn't see this. we
      # currently work around this via setting env.
      log_level => {
          getopt  => 'log-level=s',
          summary => 'Set log level',
          schema  => ['str*' => in => [
              qw/trace debug info warn warning error fatal/]],
          handler => sub {
              my ($go, $val, $r) = @_;
              $r->{log_level} = $val;
          },
          is_settable_via_config => 1,
          tags => ['category:logging'],
      },
      trace => {
          getopt  => "trace",
          summary => "Shortcut for --log-level=trace",
          handler => sub {
              my ($go, $val, $r) = @_;
              $r->{log_level} = 'trace';
          },
          tags => ['category:logging'],
      },
      debug => {
          getopt  => "debug",
          summary => "Shortcut for --log-level=debug",
          handler => sub {
              my ($go, $val, $r) = @_;
              $r->{log_level} = 'debug';
          },
          tags => ['category:logging'],
      },
      verbose => {
          getopt  => "verbose",
          summary => "Shortcut for --log-level=info",
          handler => sub {
              my ($go, $val, $r) = @_;
              $r->{log_level} = 'info';
              $r->{_help_verbose} = 1;
          },
          tags => ['category:logging'],
      },
      quiet => {
          getopt  => "quiet",
          summary => "Shortcut for --log-level=error",
          handler => sub {
              my ($go, $val, $r) = @_;
              $r->{log_level} = 'error';
          },
          tags => ['category:logging'],
      },
  
  );
  
  sub __default_env_name {
      my ($prog) = @_;
  
      for ($prog) {
          $_ //= "PROG"; # shouldn't happen
          $_ = uc($_);
          s/[^A-Z0-9]+/_/g;
          $_ = "_$_" if /\A\d/;
      }
      "${prog}_OPT";
  }
  
  sub hook_before_run {}
  
  sub hook_before_read_config_file {}
  
  sub hook_after_read_config_file {}
  
  sub hook_before_action {}
  
  sub hook_after_action {}
  
  sub get_meta {
      my ($self, $r, $url) = @_;
  
      my $res = $self->riap_client->request(meta => $url);
      die $res unless $res->[0] == 200;
      my $meta = $res->[2];
      $r->{meta} = $meta;
      log_trace("[pericmd] Running hook_after_get_meta ...");
      $self->hook_after_get_meta($r);
      $meta;
  }
  
  sub get_program_and_subcommand_name {
      my ($self, $r) = @_;
      my $res = ($self->program_name // "") . " " .
          ($r->{subcommand_name} // "");
      $res =~ s/\s+$//;
      $res;
  }
  
  sub get_subcommand_data {
      my ($self, $name) = @_;
  
      my $scs = $self->subcommands;
      return undef unless $scs;
  
      if (ref($scs) eq 'CODE') {
          return $scs->($self, name=>$name);
      } else {
          return $scs->{$name};
      }
  }
  
  sub list_subcommands {
      my ($self) = @_;
      return $self->{_cache_subcommands} if $self->{_cache_subcommands};
  
      my $scs = $self->subcommands;
      my $res;
      if ($scs) {
          if (ref($scs) eq 'CODE') {
              $scs = $scs->($self);
              die [500, "BUG: Subcommands code didn't return a hashref"]
                  unless ref($scs) eq 'HASH';
          }
          $res = $scs;
      } else {
          $res = {};
      }
      $self->{_cache_subcommands} = $res;
      $res;
  }
  
  sub status2exitcode {
      my ($self, $status) = @_;
      return 0 if $status =~ /^2..|304/;
      $status - 300;
  }
  
  sub _detect_completion {
      my ($self, $r) = @_;
  
      if ($ENV{COMP_SHELL}) {
          $r->{shell} = $ENV{COMP_SHELL};
          return 1;
      } elsif ($ENV{COMP_LINE}) {
          $r->{shell} = 'bash';
          return 1;
      } elsif ($ENV{COMMAND_LINE}) {
          $r->{shell} = 'tcsh';
          return 1;
      }
  
      $r->{shell} //= 'bash';
      0;
  }
  
  sub _read_env {
      my ($self, $r) = @_;
  
      return [] unless $self->read_env;
      my $env_name = $self->env_name;
      my $env = $ENV{$env_name};
      log_trace("[pericmd] Checking env %s: %s", $env_name, $env);
      return [] unless defined $env;
  
      # XXX is it "proper" to use Complete::* modules to parse cmdline, outside
      # the context of completion?
  
      my $words;
      if ($r->{shell} eq 'bash') {
          require Complete::Bash;
          ($words, undef) = @{ Complete::Bash::parse_cmdline($env, 0) };
      } elsif ($r->{shell} eq 'fish') {
          ($words, undef) = @{ Complete::Base::parse_cmdline($env) };
      } elsif ($r->{shell} eq 'tcsh') {
          require Complete::Tcsh;
          ($words, undef) = @{ Complete::Tcsh::parse_cmdline($env) };
      } elsif ($r->{shell} eq 'zsh') {
          require Complete::Bash;
          ($words, undef) = @{ Complete::Bash::parse_cmdline($env) };
      } else {
          die "Unsupported shell '$r->{shell}'";
      }
      log_trace("[pericmd] Words from env: %s", $words);
      $words;
  }
  
  sub do_dump_object {
      require Data::Dump;
  
      my ($self, $r) = @_;
  
      local $r->{in_dump_object} = 1;
  
      # check whether subcommand is defined. try to search from --cmd, first
      # command-line argument, or default_subcommand.
      $self->hook_before_parse_argv($r);
      $self->_parse_argv1($r);
  
      if ($r->{read_env}) {
          my $env_words = $self->_read_env($r);
          unshift @ARGV, @$env_words;
      }
  
      my $scd = $r->{subcommand_data};
      # we do get_meta() currently because some common option like dry_run is
      # added in hook_after_get_meta().
      my $meta = $self->get_meta($r, $scd->{url} // $self->{url});
  
      # additional information, because scripts often put their metadata in 'main'
      # package
      $self->{'x.main.spec'} = \%main::SPEC;
  
      my $label = $ENV{PERINCI_CMDLINE_DUMP_OBJECT} //
          $ENV{PERINCI_CMDLINE_DUMP}; # old name that will be removed
      my $dump = join(
          "",
          "# BEGIN DUMP $label\n",
          Data::Dump::dump($self), "\n",
          "# END DUMP $label\n",
      );
  
      [200, "OK", $dump,
       {
           stream => 0,
           "cmdline.skip_format" => 1,
       }];
  }
  
  sub do_dump_args {
      require Data::Dump;
  
      my ($self, $r) = @_;
  
      [200, "OK", Data::Dump::dump($r->{args}) . "\n",
       {
           stream => 0,
           "cmdline.skip_format" => 1,
       }];
  }
  
  sub do_dump_config {
      require Data::Dump;
  
      my ($self, $r) = @_;
  
      [200, "OK", Data::Dump::dump($r->{config}) . "\n",
       {
           stream => 0,
           "cmdline.skip_format" => 1,
       }];
  }
  
  sub do_completion {
      my ($self, $r) = @_;
  
      local $r->{in_completion} = 1;
  
      my ($words, $cword);
      if ($r->{shell} eq 'bash') {
          require Complete::Bash;
          require Encode;
          ($words, $cword) = @{ Complete::Bash::parse_cmdline(undef, undef, {truncate_current_word=>1}) };
          ($words, $cword) = @{ Complete::Bash::join_wordbreak_words($words, $cword) };
          $words = [map {Encode::decode('UTF-8', $_)} @$words];
      } elsif ($r->{shell} eq 'fish') {
          require Complete::Bash;
          ($words, $cword) = @{ Complete::Bash::parse_cmdline() };
      } elsif ($r->{shell} eq 'tcsh') {
          require Complete::Tcsh;
          ($words, $cword) = @{ Complete::Tcsh::parse_cmdline() };
      } elsif ($r->{shell} eq 'zsh') {
          require Complete::Bash;
          ($words, $cword) = @{ Complete::Bash::parse_cmdline() };
      } else {
          die "Unsupported shell '$r->{shell}'";
      }
  
      shift @$words; $cword--; # strip program name
  
      # @ARGV given by bash is messed up / different. during completion, we
      # get ARGV from parsing COMP_LINE/COMP_POINT.
      @ARGV = @$words;
  
      # check whether subcommand is defined. try to search from --cmd, first
      # command-line argument, or default_subcommand.
      $self->hook_before_parse_argv($r);
      $self->_parse_argv1($r);
  
      if ($r->{read_env}) {
          my $env_words = $self->_read_env($r);
          unshift @ARGV, @$env_words;
          $cword += @$env_words;
      }
  
      #log_trace("ARGV=%s", \@ARGV);
      #log_trace("words=%s", $words);
  
      # force format to text for completion, because user might type 'cmd --format
      # blah -^'.
      $r->{format} = 'text';
  
      my $scd = $r->{subcommand_data};
      my $meta = $self->get_meta($r, $scd->{url} // $self->{url});
  
      my $subcommand_name_from = $r->{subcommand_name_from} // '';
  
      require Perinci::Sub::Complete;
      my $compres = Perinci::Sub::Complete::complete_cli_arg(
          meta            => $meta, # must be normalized
          words           => $words,
          cword           => $cword,
          common_opts     => $self->common_opts,
          riap_server_url => $scd->{url},
          riap_uri        => undef,
          riap_client     => $self->riap_client,
          extras          => {r=>$r, cmdline=>$self},
          func_arg_starts_at => ($subcommand_name_from eq 'arg' ? 1:0),
          completion      => sub {
              my %args = @_;
              my $type = $args{type};
  
              # user specifies custom completion routine, so use that first
              if ($self->completion) {
                  my $res = $self->completion(%args);
                  return $res if $res;
              }
              # if subcommand name has not been supplied and we're at arg#0,
              # complete subcommand name
              if ($self->subcommands &&
                      $subcommand_name_from ne '--cmd' &&
                           $type eq 'arg' && $args{argpos}==0) {
                  require Complete::Util;
                  my $subcommands    = $self->list_subcommands;
                  my @subc_names     = keys %$subcommands;
                  my @subc_summaries = map { $subcommands->{$_}{summary} }
                      @subc_names;
                  return Complete::Util::complete_array_elem(
                      array     => \@subc_names,
                      summaries => \@subc_summaries,
                      word      => $words->[$cword]);
              }
  
              # otherwise let periscomp do its thing
              return undef;
          },
      );
  
      my $formatted;
      if ($r->{shell} eq 'bash') {
          require Complete::Bash;
          $formatted = Complete::Bash::format_completion(
              $compres, {word=>$words->[$cword]});
      } elsif ($r->{shell} eq 'fish') {
          require Complete::Fish;
          $formatted = Complete::Fish::format_completion($compres);
      } elsif ($r->{shell} eq 'tcsh') {
          require Complete::Tcsh;
          $formatted = Complete::Tcsh::format_completion($compres);
      } elsif ($r->{shell} eq 'zsh') {
          require Complete::Zsh;
          $formatted = Complete::Zsh::format_completion($compres);
      }
  
      # to properly display unicode filenames
      $self->use_utf8(1);
  
      [200, "OK", $formatted,
       # these extra result are for debugging
       {
           "func.words" => $words,
           "func.cword" => $cword,
           "cmdline.skip_format" => 1,
       }];
  }
  
  sub _read_config {
      require Perinci::CmdLine::Util::Config;
  
      my ($self, $r) = @_;
  
      my $hook_section;
      if ($self->can("hook_config_file_section")) {
          $hook_section = sub {
              my ($section_name, $section_content) = @_;
              $self->hook_config_file_section(
                  $r, $section_name, $section_content);
          };
      }
  
      my $res = Perinci::CmdLine::Util::Config::read_config(
          config_paths     => $r->{config_paths},
          config_filename  => $self->config_filename,
          config_dirs      => $self->config_dirs,
          program_name     => $self->program_name,
          hook_section     => $hook_section,
      );
      die $res unless $res->[0] == 200;
      $r->{config} = $res->[2];
      $r->{read_config_files} = $res->[3]{'func.read_files'};
      $r->{_config_section_read_order} = $res->[3]{'func.section_read_order'}; # we currently don't want to publish this request key
  
      if ($ENV{LOG_DUMP_CONFIG}) {
          log_trace "config: %s", $r->{config};
          log_trace "read_config_files: %s", $r->{read_config_files};
      }
  }
  
  sub __min(@) {
      my $m = $_[0];
      for (@_) {
          $m = $_ if $_ < $m;
      }
      $m;
  }
  
  # straight copy of Wikipedia's "Levenshtein Distance"
  sub __editdist {
      my @a = split //, shift;
      my @b = split //, shift;
  
      # There is an extra row and column in the matrix. This is the distance from
      # the empty string to a substring of the target.
      my @d;
      $d[$_][0] = $_ for 0 .. @a;
      $d[0][$_] = $_ for 0 .. @b;
  
      for my $i (1 .. @a) {
          for my $j (1 .. @b) {
              $d[$i][$j] = (
                  $a[$i-1] eq $b[$j-1]
                      ? $d[$i-1][$j-1]
                      : 1 + __min(
                          $d[$i-1][$j],
                          $d[$i][$j-1],
                          $d[$i-1][$j-1]
                      )
                  );
          }
      }
  
      $d[@a][@b];
  }
  
  sub __uniq {
      my %seen = ();
      my $k;
      my $seen_undef;
      grep { defined $_ ? not $seen{ $k = $_ }++ : not $seen_undef++ } @_;
  }
  
  # $cut is whether we should only compare each element of haystack up to the
  # length of needle, so if needle is "foo" and haystack is ["bar", "baroque",
  # "fizzle", "food"], it will be as if haystack is ["bar", "bar", "fiz", "foo"].
  sub __find_similar_strings {
      my ($needle, $haystack, $cut) = @_;
  
      my $factor   = 1.5;
      my $max_dist = 4;
  
      my @res =
          map { $_->[0] }
          sort { $a->[1] <=> $b->[1] }
          grep { defined }
          map {
              my $el = $_;
              if ($cut && length($_) > length($needle)) {
                  $el = substr($el, 0, length($needle));
              }
              my $d = __editdist($el, $needle);
              my $max_distance = __min(
                  __min(length($el), length($needle))/$factor,
                  $max_dist,
              );
              ($d <= $max_distance) ? [$_, $d] : undef
          } @$haystack;
  
      $cut ? __uniq(@res) : @res;
  }
  
  sub __find_similar_go_opts {
      my ($opt, $go_spec) = @_;
  
      $opt =~ s/^--?//;
  
      my @ospecs0 = ref($go_spec) eq 'ARRAY' ?
          keys(%{ { @$go_spec } }) : keys(%$go_spec);
      my @ospecs;
      for my $o (@ospecs0) {
          $o =~ s/^--?//;
          my $is_neg = $o =~ /\!$/;
          $o =~ s/[=:].+|[?+!]$//;
          for (split /\|/, $o) {
              if ($is_neg && length($_) > 1) {
                  push @ospecs, $_, "no$_", "no-$_";
              } else {
                  push @ospecs, $_;
              }
          }
      }
  
      map { length($_) > 1 ? "--$_" : "-$_" }
          __find_similar_strings($opt, \@ospecs, "cut");
  }
  
  sub _parse_argv1 {
      my ($self, $r) = @_;
  
      # parse common_opts which potentially sets subcommand
      my @go_spec;
      {
          # one small downside for this is that we cannot do autoabbrev here,
          # because we're not yet specifying all options here.
  
          require Getopt::Long;
          my $old_go_conf = Getopt::Long::Configure(
              'pass_through', 'no_ignore_case', 'no_auto_abbrev',
              'no_getopt_compat', 'gnu_compat', 'bundling');
          my $co = $self->common_opts // {};
          for my $k (keys %$co) {
              push @go_spec, $co->{$k}{getopt} => sub {
                  my ($go, $val) = @_;
                  $co->{$k}{handler}->($go, $val, $r);
              };
          }
          #log_trace("\@ARGV before parsing common opts: %s", \@ARGV);
          Getopt::Long::GetOptions(@go_spec);
          Getopt::Long::Configure($old_go_conf);
          #log_trace("\@ARGV after  parsing common opts: %s", \@ARGV);
      }
  
      # select subcommand and fill subcommand data
      {
          my $scn = $r->{subcommand_name};
          my $scn_from = $r->{subcommand_name_from};
          if (!defined($scn) && defined($self->{default_subcommand})) {
              # get from default_subcommand
              if ($self->get_subcommand_from_arg == 1) {
                  $scn = $self->{default_subcommand};
                  $scn_from = 'default_subcommand';
              } elsif ($self->get_subcommand_from_arg == 2 && !@ARGV) {
                  $scn = $self->{default_subcommand};
                  $scn_from = 'default_subcommand';
              }
          }
          if (!defined($scn) && $self->{subcommands} && @ARGV) {
              # get from first command-line arg
              if ($ARGV[0] =~ /\A-/) {
                  if ($r->{in_completion}) {
                      $scn = shift @ARGV;
                      $scn_from = 'arg';
                  } else {
                      my $suggestion = '';
                      my @similar = __find_similar_go_opts($ARGV[0], \@go_spec);
                      $suggestion = " (perhaps you meant ".
                          join("/", @similar)."?)" if @similar;
                      die [400, "Unknown option: $ARGV[0]".$suggestion];
                  }
              } else {
                  $scn = shift @ARGV;
                  $scn_from = 'arg';
              }
          }
  
          my $scd;
          if (defined $scn) {
              $scd = $self->get_subcommand_data($scn);
              unless ($r->{in_completion}) {
                  unless ($scd) {
                      my $scs = $self->list_subcommands;
                      if ($self->auto_abbrev_subcommand) {
                          # check that subcommand is an unambiguous abbreviation
                          # of an existing subcommand
                          my $num_matches = 0;
                          my $complete_scn;
                          for (keys %$scs) {
                              if (index($_, $scn) == 0) {
                                  $num_matches++;
                                  $complete_scn = $_;
                                  last if $num_matches > 1;
                              }
                          }
                          if ($num_matches == 1) {
                              $scn = $complete_scn;
                              $scd = $self->get_subcommand_data($scn);
                              goto L1;
                          }
                      }
                      # provide suggestion of probably mistyped subcommand to user
                      my @similar =
                          __find_similar_strings($scn, [keys %$scs]);
                      my $suggestion = '';
                      $suggestion = " (perhaps you meant ".
                          join("/", @similar)."?)" if @similar;
                      die [500, "Unknown subcommand: $scn".$suggestion];
                  }
              }
          } elsif (!$r->{action} && $self->{subcommands}) {
              # program has subcommands but user doesn't specify any subcommand,
              # or specific action. display help instead.
              $r->{action} = 'help';
              $r->{skip_parse_subcommand_argv} = 1;
          } else {
              $scn = '';
              $scd = {
                  url => $self->url,
                  summary => $self->summary,
                  description => $self->description,
                  pass_cmdline_object => $self->pass_cmdline_object,
                  tags => $self->tags,
              };
          }
        L1:
          $r->{subcommand_name} = $scn;
          $r->{subcommand_name_from} = $scn_from;
          $r->{subcommand_data} = $scd;
      }
  
      $r->{_parse_argv1_done} = 1;
  }
  
  sub _parse_argv2 {
      require Perinci::CmdLine::Util::Config;
  
      my ($self, $r) = @_;
  
      my %args;
  
      if ($r->{read_env}) {
          my $env_words = $self->_read_env($r);
          unshift @ARGV, @$env_words;
      }
  
      # parse argv for per-subcommand command-line opts
      if ($r->{skip_parse_subcommand_argv}) {
          return [200, "OK (subcommand options parsing skipped)"];
      } else {
          my $scd = $r->{subcommand_data};
          if ($r->{meta} && !$self->{subcommands}) {
              # we have retrieved meta, no need to get it again
          } else {
              $self->get_meta($r, $scd->{url});
          }
  
          # first fill in from subcommand specification
          if ($scd->{args}) {
              $args{$_} = $scd->{args}{$_} for keys %{ $scd->{args} };
          }
  
          # then read from configuration
          if ($r->{read_config}) {
  
              log_trace("[pericmd] Running hook_before_read_config_file ...");
              $self->hook_before_read_config_file($r);
  
              $self->_read_config($r) unless $r->{config};
  
              log_trace("[pericmd] Running hook_after_read_config_file ...");
              $self->hook_after_read_config_file($r);
  
              my $res = Perinci::CmdLine::Util::Config::get_args_from_config(
                  r                  => $r,
                  config             => $r->{config},
                  args               => \%args,
                  program_name       => $self->program_name,
                  subcommand_name    => $r->{subcommand_name},
                  config_profile     => $r->{config_profile},
                  common_opts        => $self->common_opts,
                  meta               => $r->{meta},
                  meta_is_normalized => 1,
              );
              die $res unless $res->[0] == 200;
              log_trace("[pericmd] args after reading config files: %s",
                           \%args);
              my $found = $res->[3]{'func.found'};
              if (defined($r->{config_profile}) && !$found &&
                      defined($r->{read_config_files}) &&
                          @{$r->{read_config_files}} &&
                              !$r->{ignore_missing_config_profile_section}) {
                  return [412, "Profile '$r->{config_profile}' not found ".
                              "in configuration file"];
              }
  
          }
  
          # finally get from argv
  
          # since get_args_from_argv() doesn't pass $r, we need to wrap it
          my $copts = $self->common_opts;
          my %old_handlers;
          for (keys %$copts) {
              my $h = $copts->{$_}{handler};
              $copts->{$_}{handler} = sub {
                  my ($go, $val) = @_;
                  $h->($go, $val, $r);
              };
              $old_handlers{$_} = $h;
          }
  
          my $has_cmdline_src;
          for my $ak (keys %{$r->{meta}{args} // {}}) {
              my $av = $r->{meta}{args}{$ak};
              if ($av->{cmdline_src}) {
                  $has_cmdline_src = 1;
                  last;
              }
          }
  
          require Perinci::Sub::GetArgs::Argv;
          my $ga_res = Perinci::Sub::GetArgs::Argv::get_args_from_argv(
              argv                => \@ARGV,
              args                => \%args,
              meta                => $r->{meta},
              meta_is_normalized  => 1,
              allow_extra_elems   => $has_cmdline_src ? 1:0,
              per_arg_json        => $self->{per_arg_json},
              per_arg_yaml        => $self->{per_arg_yaml},
              common_opts         => $copts,
              strict              => $r->{in_completion} ? 0:1,
              (ggls_res            => $r->{_ggls_res}) x defined($r->{_ggls_res}),
              on_missing_required_args => sub {
                  my %a = @_;
  
                  my ($an, $aa, $as) = ($a{arg}, $a{args}, $a{spec});
                  my $src = $as->{cmdline_src} // '';
  
                  # we only get from stdin if stdin is piped
                  $src = '' if $src eq 'stdin_or_args' && -t STDIN;
  
                  if ($src && $as->{req}) {
                      # don't complain, we will fill argument from other source
                      return 1;
                  } else {
                      # we have no other sources, so we complain about missing arg
                      return 0;
                  }
              },
          );
  
          return $ga_res unless $ga_res->[0] == 200;
  
          # wrap stream arguments with iterator
          my $args_p = $r->{meta}{args} // {};
          for my $arg (keys %{$ga_res->[2]}) {
              next unless $args_p->{$arg};
              next unless $args_p->{$arg}{stream};
              for ($ga_res->[2]{$arg}) {
                  $_ = ref $_ eq 'ARRAY' ? __array_iter($_) : __list_iter($_);
              }
          }
  
          # restore
          for (keys %$copts) {
              $copts->{$_}{handler} = $old_handlers{$_};
          }
  
          return $ga_res;
      }
  }
  
  sub parse_argv {
      my ($self, $r) = @_;
  
      log_trace("[pericmd] Parsing \@ARGV: %s", \@ARGV);
  
      # we parse argv twice. the first parse is with common_opts only so we're
      # able to catch --help, --version, etc early without having to know about
      # subcommands. two reasons for this: sometimes we need to get subcommand
      # name *from* cmdline opts (e.g. --cmd) and thus it's a chicken-and-egg
      # problem. second, it's faster because we don't have to load Riap client and
      # request the meta through it (especially in the case of remote URL).
      #
      # the second parse is after ge get subcommand name and the function
      # metadata. we can parse the remaining argv to get function arguments.
      #
      # note that when doing completion we're not using this algorithem and only
      # parse argv once. this is to make completion work across common- and
      # per-subcommand opts, e.g. --he<tab> resulting in --help (common opt) as
      # well as --height (function argument).
  
      $self->_parse_argv1($r) unless $r->{_parse_argv1_done};
      $self->_parse_argv2($r);
  }
  
  sub __gen_iter {
      require Data::Sah::Util::Type;
  
      my ($fh, $argspec, $argname) = @_;
      my $schema = $argspec->{schema};
      $schema = $schema->[1]{of} if $schema->[0] eq 'array';
      my $type = Data::Sah::Util::Type::get_type($schema);
  
      if (Data::Sah::Util::Type::is_simple($schema)) {
          my $chomp = $type eq 'buf' ? 0 :
              $argspec->{'cmdline.chomp'} // 1;
          return sub {
              # XXX this will be configurable later. currently by default reading
              # binary is per-64k while reading string is line-by-line.
              local $/ = \(64*1024) if $type eq 'buf';
  
              state $eof;
              return undef if $eof;
              my $l = <$fh>;
              unless (defined $l) {
                  $eof++; return undef;
              }
              chomp($l) if $chomp;
              $l;
          };
      } else {
          # expect JSON stream for non-simple types
          require JSON::MaybeXS;
          state $json = JSON::MaybeXS->new->allow_nonref;
          my $i = -1;
          return sub {
              state $eof;
              return undef if $eof;
              $i++;
              my $l = <$fh>;
              unless (defined $l) {
                  $eof++; return undef;
              }
              eval { $l = $json->decode($l) };
              if ($@) {
                  die "Invalid JSON in stream argument '$argname' record #$i: $@";
              }
              $l;
          };
      }
  }
  
  # parse cmdline_src argument spec properties for filling argument value from
  # file and/or stdin. currently does not support argument submetadata.
  sub parse_cmdline_src {
      my ($self, $r) = @_;
  
      my $action = $r->{action};
      my $meta   = $r->{meta};
  
      #if ($self->use_utf8) {
      #    require open; open->import(":utf8");
      #} elsif ($self->use_locale) {
      #    require open; open->import(":locale");
      #}
  
      my $url = $r->{subcommand_data}{url} // $self->{url} // '';
      my $is_network = $url =~ m!^(https?|riap[^:]+):!;
  
      # handle cmdline_src
      if ($action eq 'call') {
          my $args_p = $meta->{args} // {};
          my $stdin_seen;
          for my $an (sort {
              my $csa  = $args_p->{$a}{cmdline_src};
              my $csb  = $args_p->{$b}{cmdline_src};
              my $posa = $args_p->{$a}{pos} // 9999;
              my $posb = $args_p->{$b}{pos} // 9999;
  
              # first, always put stdin_line before stdin / stdin_or_files
              (
                  !$csa || !$csb ? 0 :
                      $csa eq 'stdin_line' && $csb eq 'stdin_line' ? 0 :
                      $csa eq 'stdin_line' && $csb =~ /^(stdin|stdin_or_files?|stdin_or_args)/ ? -1 :
                      $csb eq 'stdin_line' && $csa =~ /^(stdin|stdin_or_files?|stdin_or_args)/ ? 1 : 0
              )
              ||
  
              # then order by pos
              ($posa <=> $posb)
  
              ||
              # then by name
              ($a cmp $b)
          } keys %$args_p) {
              #log_trace("TMP: handle cmdline_src for arg=%s", $an);
              my $as = $args_p->{$an};
              my $src = $as->{cmdline_src};
              my $type = $as->{schema}[0]
                  or die "BUG: No schema is defined for arg '$an'";
              # Riap::HTTP currently does not support streaming input
              my $do_stream = $as->{stream} && $url !~ /^https?:/;
              if ($src) {
                  die [531,
                       "Invalid 'cmdline_src' value for argument '$an': $src"]
                      unless $src =~ /\A(stdin|file|stdin_or_files?|stdin_or_args|stdin_line)\z/;
                  die [531,
                       "Sorry, argument '$an' is set cmdline_src=$src, but type ".
                           "is not str/buf/array, only those are supported now"]
                      unless $do_stream || $type =~ /\A(str|buf|array)\z/; # XXX stdin_or_args needs array only, not str/buf
  
                  if ($src =~ /\A(stdin|stdin_or_files?|stdin_or_args)\z/) {
                      die [531, "Only one argument can be specified ".
                               "cmdline_src stdin/stdin_or_file/stdin_or_files/stdin_or_args"]
                          if $stdin_seen++;
                  }
                  my $is_ary = $type eq 'array';
                  if ($src eq 'stdin_line' && !exists($r->{args}{$an})) {
                      require Perinci::Object;
                      my $term_readkey_available = eval { require Term::ReadKey; 1 };
                      my $prompt = Perinci::Object::rimeta($as)->langprop('cmdline_prompt') //
                          sprintf($self->default_prompt_template, $an);
                      print $prompt;
                      my $iactive = (-t STDOUT);
                      Term::ReadKey::ReadMode('noecho')
                            if $term_readkey_available && $iactive && $as->{is_password};
                      chomp($r->{args}{$an} = <STDIN>);
                      do { print "\n"; Term::ReadKey::ReadMode(0) if $term_readkey_available }
                          if $iactive && $as->{is_password};
                      $r->{args}{"-cmdline_src_$an"} = 'stdin_line';
                  } elsif ($src eq 'stdin' || $src eq 'file' &&
                          ($r->{args}{$an}//"") eq '-') {
                      die [400, "Argument $an must be set to '-' which means ".
                               "from stdin"]
                          if defined($r->{args}{$an}) &&
                              $r->{args}{$an} ne '-';
                      #log_trace("Getting argument '$an' value from stdin ...");
                      $r->{args}{$an} = $do_stream ?
                          __gen_iter(\*STDIN, $as, $an) :
                              $is_ary ? [<STDIN>] :
                                  do {local $/; ~~<STDIN>};
                      $r->{args}{"-cmdline_src_$an"} = 'stdin';
                  } elsif ($src eq 'stdin_or_file' || $src eq 'stdin_or_files') {
                      # push back argument value to @ARGV so <> can work to slurp
                      # all the specified files
                      local @ARGV = @ARGV;
                      unshift @ARGV, $r->{args}{$an}
                          if defined $r->{args}{$an};
  
                      # with stdin_or_file, we only accept one file
                      splice @ARGV, 1
                          if @ARGV > 1 && $src eq 'stdin_or_file';
  
                      #log_trace("Getting argument '$an' value from ".
                      #                 "$src, \@ARGV=%s ...", \@ARGV);
  
                      # perl doesn't seem to check files, so we check it here
                      for (@ARGV) {
                          next if $_ eq '-';
                          die [500, "Can't read file '$_': $!"] if !(-r $_);
                      }
  
                      $r->{args}{"-cmdline_srcfilenames_$an"} = [@ARGV];
                      $r->{args}{$an} = $do_stream ?
                          __gen_iter(\*ARGV, $as, $an) :
                              $is_ary ? [<>] :
                                  do {local $/; ~~<>};
                      $r->{args}{"-cmdline_src_$an"} = $src;
                  } elsif ($src eq 'stdin_or_args' && !(-t STDIN)) {
                      unless (defined($r->{args}{$an})) {
                          $r->{args}{$an} = $do_stream ?
                              __gen_iter(\*STDIN, $as, $an) :
                              $is_ary ? [map {chomp;$_} <STDIN>] :
                                  do {local $/; ~~<STDIN>};
                      }
                  } elsif ($src eq 'file') {
                      unless (exists $r->{args}{$an}) {
                          if ($as->{req}) {
                              die [400,
                                   "Please specify filename for argument '$an'"];
                          } else {
                              next;
                          }
                      }
                      die [400, "Please specify filename for argument '$an'"]
                          unless defined $r->{args}{$an};
                      #log_trace("Getting argument '$an' value from ".
                      #                "file ...");
                      my $fh;
                      my $fname = $r->{args}{$an};
                      unless (open $fh, "<", $fname) {
                          die [500, "Can't open file '$fname' for argument '$an'".
                                   ": $!"];
                      }
                      $r->{args}{$an} = $do_stream ?
                          __gen_iter($fh, $as, $an) :
                              $is_ary ? [<$fh>] :
                                  do { local $/; ~~<$fh> };
                      close $fh;
                      $r->{args}{"-cmdline_src_$an"} = 'file';
                      $r->{args}{"-cmdline_srcfilenames_$an"} = [$fname];
                  }
              }
  
              # encode to base64 if binary and we want to cross network (because
              # it's usually JSON)
              if ($self->riap_version == 1.2 && $is_network &&
                      defined($r->{args}{$an}) && $args_p->{$an}{schema} &&
                          $args_p->{$an}{schema}[0] eq 'buf' &&
                              !$r->{args}{"$an:base64"}) {
                  require MIME::Base64;
                  $r->{args}{"$an:base64"} =
                      MIME::Base64::encode_base64($r->{args}{$an}, "");
                  delete $r->{args}{$an};
              }
          } # for arg
      }
      #log_trace("args after cmdline_src is processed: %s", $r->{args});
  }
  
  # determine filehandle to output to (normally STDOUT, but we can also send to a
  # pager, or a temporary file when sending to viewer (the difference between
  # pager and viewer: when we page we use pipe, when we view we write to temporary
  # file then open the viewer. viewer settings override pager settings.
  sub select_output_handle {
      my ($self, $r) = @_;
  
      my $resmeta = $r->{res}[3] // {};
  
      my $handle;
    SELECT_HANDLE:
      {
          # view result using external program
          if ($ENV{VIEW_RESULT} // $resmeta->{"cmdline.view_result"}) {
              my $viewer = $resmeta->{"cmdline.viewer"} // $ENV{VIEWER} //
                  $ENV{BROWSER};
              last if defined $viewer && !$viewer; # ENV{VIEWER} can be set 0/'' to disable viewing result using external program
              die [500, "No VIEWER program set"] unless defined $viewer;
              $r->{viewer} = $viewer;
              require File::Temp;
              my $filename;
              ($handle, $filename) = File::Temp::tempfile();
              $r->{viewer_temp_path} = $filename;
          }
  
          if ($r->{page_result} // $ENV{PAGE_RESULT} // $resmeta->{"cmdline.page_result"}) {
              require File::Which;
              my $pager = $r->{pager} // $resmeta->{"cmdline.pager"} //
                  $ENV{PAGER};
              unless (defined $pager) {
                  $pager = "less -FRSX" if File::Which::which("less");
              }
              unless (defined $pager) {
                  $pager = "more" if File::Which::which("more");
              }
              unless (defined $pager) {
                  die [500, "Can't determine PAGER"];
              }
              last unless $pager; # ENV{PAGER} can be set 0/'' to disable paging
              #log_trace("Paging output using %s", $pager);
              ## no critic (InputOutput::RequireBriefOpen)
              open $handle, "| $pager";
          }
          $handle //= \*STDOUT;
      }
      $r->{output_handle} = $handle;
  }
  
  sub save_output {
      my ($self, $r, $dir) = @_;
      $dir //= $ENV{PERINCI_CMDLINE_OUTPUT_DIR};
  
      unless (-d $dir) {
          warn "Can't save output to $dir: doesn't exist or not a directory,skipped saving program output";
          return;
      }
  
      my $time = do {
          if (eval { require Time::HiRes; 1 }) {
              Time::HiRes::time();
          } else {
              time();
          }
      };
  
      my $fmttime = do {
          my @time = gmtime($time);
          sprintf(
              "%04d-%02d-%02dT%02d%02d%02d.%09dZ",
              $time[5]+1900,
              $time[4]+1,
              $time[3],
              $time[2],
              $time[1],
              $time[0],
              ($time - int($time))*1_000_000_000,
          );
      };
  
      my ($fpath_out, $fpath_meta);
      my ($fh_out, $fh_meta);
      {
          require Fcntl;
          my $counter = -1;
          while (1) {
              if ($counter++ >= 10_000) {
                  warn "Can't create file to save program output, skipped saving program output";
                  return;
              }
              my $fpath_out  = "$dir/" . ($counter ? "$fmttime.out.$counter"  : "$fmttime.out");
              my $fpath_meta = "$dir/" . ($counter ? "$fmttime.meta.$counter" : "$fmttime.meta");
              if ((-e $fpath_out) || (-e $fpath_meta)) {
                  next;
              }
              unless (sysopen $fh_out , $fpath_out , Fcntl::O_WRONLY() | Fcntl::O_CREAT() | Fcntl::O_EXCL()) {
                  warn "Can't create file '$fpath_out' to save program output: $!, skipped saving program output";
                  return;
              }
              unless (sysopen $fh_meta, $fpath_meta, Fcntl::O_WRONLY() | Fcntl::O_CREAT() | Fcntl::O_EXCL()) {
                  warn "Can't create file '$fpath_meta' to save program output meta information: $!, skipped saving program output";
                  unlink $fpath_out;
                  return;
              }
              last;
          }
      }
  
      require JSON::MaybeXS;
      state $json = JSON::MaybeXS->new->allow_nonref;
  
      my $out = $self->cleanser->clone_and_clean($r->{res});
      my $meta = {
          time        => $time,
          pid         => $$,
          argv        => $r->{orig_argv},
          read_env    => $r->{read_env},
          read_config => $r->{read_config},
          read_config_files => $r->{read_config_files},
      };
      log_trace "Saving program output to %s ...", $fpath_out;
      print $fh_out $json->encode($out);
      log_trace "Saving program output's meta information to %s ...", $fpath_meta;
      print $fh_meta $json->encode($meta);
  }
  
  sub display_result {
      require Data::Sah::Util::Type;
  
      my ($self, $r) = @_;
  
      my $meta = $r->{meta};
      my $res = $r->{res};
      my $fres = $r->{fres};
      my $resmeta = $res->[3] // {};
  
      my $handle = $r->{output_handle};
  
      my $sch = $meta->{result}{schema} // $resmeta->{schema};
      my $type = Data::Sah::Util::Type::get_type($sch) // '';
  
      if ($resmeta->{stream} // $meta->{result}{stream}) {
          my $x = $res->[2];
          if (ref($x) eq 'CODE') {
              if (Data::Sah::Util::Type::is_simple($sch)) {
                  while (defined(my $l = $x->())) {
                      print $l;
                      print "\n" unless $type eq 'buf';
                  }
              } else {
                  require JSON::MaybeXS;
                  state $json = JSON::MaybeXS->new->allow_nonref;
                  if ($self->use_cleanser) {
                      while (defined(my $rec = $x->())) {
                          print $json->encode(
                              $self->cleanser->clone_and_clean($rec)), "\n";
                      }
                  } else {
                      while (defined(my $rec = $x->())) {
                          print $json->encode($rec), "\n";
                      }
                  }
              }
          } else {
              die "Result is a stream but no coderef provided";
          }
      } else {
          print $handle $fres;
          if ($r->{viewer}) {
              require ShellQuote::Any::Tiny;
              my $cmd = $r->{viewer} ." ". ShellQuote::Any::Tiny::shell_quote($r->{viewer_temp_path});
              system $cmd;
          }
      }
  }
  
  sub run {
      my ($self) = @_;
      log_trace("[pericmd] -> run(), \@ARGV=%s", \@ARGV);
  
      my $co = $self->common_opts;
  
      my $r = {
          orig_argv   => [@ARGV],
          common_opts => $co,
      };
  
      # dump object is special case, we delegate to do_dump_object()
      if ($ENV{PERINCI_CMDLINE_DUMP_OBJECT} //
              $ENV{PERINCI_CMDLINE_DUMP} # old name that will be removed
          ) {
          $r->{res} = $self->do_dump_object($r);
          goto FORMAT;
      }
  
      # completion is special case, we delegate to do_completion()
      if ($self->_detect_completion($r)) {
          $r->{res} = $self->do_completion($r);
          goto FORMAT;
      }
  
      # set default from common options
      $r->{naked_res} = $co->{naked_res}{default} if $co->{naked_res};
      $r->{format}    = $co->{format}{default} if $co->{format};
  
      # EXPERIMENTAL, set default format to json if we are running in a pipeline
      # and the right side of the pipe is the 'td' program
      {
          last if (-t STDOUT) || $r->{format};
          last unless eval { require Pipe::Find; 1 };
          my $pipeinfo = Pipe::Find::get_stdout_pipe_process();
          last unless $pipeinfo;
          last unless $pipeinfo->{exe} =~ m![/\\]td\z! ||
              $pipeinfo->{cmdline} =~ m!\A([^\0]*[/\\])?perl\0([^\0]*[/\\])?td\0!;
          $r->{format} = 'json';
      }
  
      $r->{format} //= $self->default_format;
  
      if ($self->read_config) {
          # note that we will be reading config file
          $r->{read_config} = 1;
      }
  
      if ($self->read_env) {
          # note that we will be reading env for default options
          $r->{read_env} = 1;
      }
  
      eval {
          log_trace("[pericmd] Running hook_before_run ...");
          $self->hook_before_run($r);
  
          log_trace("[pericmd] Running hook_before_parse_argv ...");
          $self->hook_before_parse_argv($r);
  
          my $parse_res = $self->parse_argv($r);
          if ($parse_res->[0] == 501) {
              # we'll need to send ARGV to the server, because it's impossible to
              # get args from ARGV (e.g. there's a cmdline_alias with CODE, which
              # has been transformed into string when crossing network boundary)
              $r->{send_argv} = 1;
          } elsif ($parse_res->[0] != 200) {
              die $parse_res;
          }
          $r->{parse_argv_res} = $parse_res;
          $r->{args} = $parse_res->[2] // {};
  
          # set defaults
          $r->{action} //= 'call';
  
          # init logging
          if ($self->log) {
              require Log::ger::App;
              my $default_level = do {
                  my $dry_run = $r->{dry_run} // $self->default_dry_run;
                  $dry_run ? 'info' : 'warn';
              };
              Log::ger::App->import(
                  level => $r->{log_level} // $self->log_level // $default_level,
                  name  => $self->program_name,
              );
          }
  
          log_trace("[pericmd] Running hook_after_parse_argv ...");
          $self->hook_after_parse_argv($r);
  
          if ($ENV{PERINCI_CMDLINE_DUMP_CONFIG}) {
              log_trace "[pericmd] Dumping config ...";
              $r->{res} = $self->do_dump_config($r);
              goto FORMAT;
          }
  
          $self->parse_cmdline_src($r);
  
          #log_trace("TMP: parse_res: %s", $parse_res);
  
          my $missing = $parse_res->[3]{"func.missing_args"};
          die [400, "Missing required argument(s): ".join(", ", @$missing)]
              if $missing && @$missing;
  
          my $scd = $r->{subcommand_data};
          if ($scd->{pass_cmdline_object} // $self->pass_cmdline_object) {
              $r->{args}{-cmdline} = $self;
              $r->{args}{-cmdline_r} = $r;
          }
  
          log_trace("[pericmd] Running hook_before_action ...");
          $self->hook_before_action($r);
  
          my $meth = "action_$r->{action}";
          die [500, "Unknown action $r->{action}"] unless $self->can($meth);
          if ($ENV{PERINCI_CMDLINE_DUMP_ARGS}) {
              log_trace "[pericmd] Dumping arguments ...";
              $r->{res} = $self->do_dump_args($r);
              goto FORMAT;
          }
          log_trace("[pericmd] Running %s() ...", $meth);
          $r->{res} = $self->$meth($r);
          #log_trace("[pericmd] res=%s", $r->{res}); #1
  
          log_trace("[pericmd] Running hook_after_action ...");
          $self->hook_after_action($r);
      };
      my $err = $@;
      if ($err || !$r->{res}) {
          if ($err) {
              $err = [500, "Died: $err"] unless ref($err) eq 'ARRAY';
              if (%Devel::Confess::) {
                  no warnings 'once';
                  require Scalar::Util;
                  my $id = Scalar::Util::refaddr($err);
                  my $stack_trace = $Devel::Confess::MESSAGES{$id};
                  $err->[1] .= "\n$stack_trace" if $stack_trace;
              }
              $err->[1] =~ s/\n+$//;
              $r->{res} = $err;
          } else {
              $r->{res} = [500, "Bug: no response produced"];
          }
      } elsif (ref($r->{res}) ne 'ARRAY') {
          log_trace("[pericmd] res=%s", $r->{res}); #2
          $r->{res} = [500, "Bug in program: result not an array"];
      }
  
      if (!$r->{res}[0] || $r->{res}[0] < 200 || $r->{res}[0] > 555) {
          $r->{res}[3]{'x.orig_status'} = $r->{res}[0];
          $r->{res}[0] = 555;
      }
  
      $r->{format} //= $r->{res}[3]{'cmdline.default_format'};
      $r->{format} //= $r->{meta}{'cmdline.default_format'};
      my $restore_orig_result;
      my $orig_result;
      if (exists $r->{res}[3]{'cmdline.result.noninteractive'} && !(-t STDOUT)) {
          $restore_orig_result = 1;
          $orig_result = $r->{res}[2];
          $r->{res}[2] = $r->{res}[3]{'cmdline.result.noninteractive'};
      } elsif (exists $r->{res}[3]{'cmdline.result.interactive'} && -t STDOUT) {
          $restore_orig_result = 1;
          $orig_result = $r->{res}[2];
          $r->{res}[2] = $r->{res}[3]{'cmdline.result.interactive'};
      } elsif (exists $r->{res}[3]{'cmdline.result'}) {
          $restore_orig_result = 1;
          $orig_result = $r->{res}[2];
          $r->{res}[2] = $r->{res}[3]{'cmdline.result'};
      }
    FORMAT:
      my $is_success = $r->{res}[0] =~ /\A2/ || $r->{res}[0] == 304;
  
      if (defined $ENV{PERINCI_CMDLINE_OUTPUT_DIR}) {
          $self->save_output($r);
      }
  
      if ($is_success &&
              ($self->skip_format ||
               $r->{meta}{'cmdline.skip_format'} ||
               $r->{res}[3]{'cmdline.skip_format'})) {
          $r->{fres} = $r->{res}[2] // '';
      } elsif ($is_success &&
                   ($r->{res}[3]{stream} // $r->{meta}{result}{stream})) {
          # stream will be formatted as displayed by display_result()
      }else {
          log_trace("[pericmd] Running hook_format_result ...");
          $r->{res}[3]{stream} = 0;
          $r->{fres} = $self->hook_format_result($r) // '';
      }
      $self->select_output_handle($r);
      log_trace("[pericmd] Running hook_display_result ...");
      $self->hook_display_result($r);
      log_trace("[pericmd] Running hook_after_run ...");
      $self->hook_after_run($r);
  
      if ($restore_orig_result) {
          $r->{res}[2] = $orig_result;
      }
  
      my $exitcode;
      if ($r->{res}[3] && defined($r->{res}[3]{'cmdline.exit_code'})) {
          $exitcode = $r->{res}[3]{'cmdline.exit_code'};
      } else {
          $exitcode = $self->status2exitcode($r->{res}[0]);
      }
      if ($self->exit) {
          log_trace("[pericmd] exit(%s)", $exitcode);
          exit $exitcode;
      } else {
          # so this can be tested
          log_trace("[pericmd] <- run(), exitcode=%s", $exitcode);
          $r->{res}[3]{'x.perinci.cmdline.base.exit_code'} = $exitcode;
          return $r->{res};
      }
  }
  
  1;
  # ABSTRACT: Base class for Perinci::CmdLine{::Classic,::Lite}
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Perinci::CmdLine::Base - Base class for Perinci::CmdLine{::Classic,::Lite}
  
  =head1 VERSION
  
  This document describes version 1.826 of Perinci::CmdLine::Base (from Perl distribution Perinci-CmdLine-Lite), released on 2020-01-31.
  
  =head1 DESCRIPTION
  
  =for Pod::Coverage ^(.+)$
  
  =head1 PROGRAM FLOW (NORMAL)
  
  If you execute C<run()>, this is what will happen, in order:
  
  =over
  
  =item * Detect if we are running under tab completion mode
  
  This is done by checking the existence of special environment varibles like
  C<COMP_LINE> (bash) or C<COMMAND_LINE> (tcsh). If yes, then jump to L</"PROGRAM
  FLOW (TAB COMPLETION)">. Otherwise, continue.
  
  =item * Run hook_before_run, if defined
  
  This hook (and every other hook) will be passed a single argument C<$r>, a hash
  that contains request data (see L</"REQUEST KEYS">).
  
  Some ideas that you can do in this hook: XXX.
  
  =item * Parse command-line arguments (@ARGV) and set C<action>
  
  If C<read_env> attribute is set to true, and there is environment variable
  defined to set default options (see documentation on C<read_env> and C<env_name>
  attributes) then the environment variable is parsed and prepended first to the
  command-line, so it can be parsed together. For example, if your program is
  called C<foo> and environment variable C<FOO_OPT> is set to C<--opt1 --opt2
  val>. When you execute:
  
   % foo --no-opt1 --trace 1 2
  
  then C<@ARGV> will be set to C<< ('--opt1', '--opt2', 'val', '--no-opt1',
  '--trace', 1, 2) >>. This way, command-line arguments can have a higher
  precedence and override settings from the environment variable (in this example,
  C<--opt1> is negated by C<--no-opt1>).
  
  Currently, parsing is done in two steps. The first step is to extract subcommand
  name. Because we want to allow e.g. C<cmd --verbose subcmd> in addition to C<cmd
  subcmd> (that is, user is allowed to specify options before subcommand name) we
  cannot simply get subcommand name from the first element of C<@ARGV> but must
  parse command-line options. Also, we want to allow user specifying subcommand
  name from option C<cmd --cmd subcmd> because we want to support the notion of
  "default subcommand" (subcommand that takes effect if there is no subcommand
  specified).
  
  In the first step, since we do not know the subcommand yet, we only parse common
  options and strip them. Unknown options at this time will be passed through.
  
  If user specifies common option like C<--help> or C<--version>, then action will
  be set to (respectively) C<help> and C<version> and the second step will be
  skipped. Otherwise we continue the the second step and action by default is set
  to C<call>.
  
  At the end of the first step, we already know the subcommand name (of course, if
  subcommand name is unknown, we exit with error) along with subcommand spec: its
  URL, per-subcommand settings, and so on (see the C<subcommands> attribute). If
  there are no subcommands, subcommand name is set to C<''> (empty string) and the
  subcommand spec is filled from the attributes, e.g. C<url>, C<summary>, <tags>,
  and so on.
  
  We then perform a C<meta> Riap request to the URL to get the Rinci metadata.
  After that, C<hook_after_get_meta> is run if provided. From the Rinci metadata
  we get list of arguments (the C<args> property). From this, we generate a spec
  of command-line options to feed to L<Getopt::Long>. There are some conversions
  being done, e.g. an argument called C<foo_bar> will become command-line option
  C<--foo-bar>. Command-line aliases from metadata are also added to the
  C<Getopt::Long> spec.
  
  Config file: It is also at this step that we read config file (if C<read_config>
  attribute is true). We run C<hook_before_read_config_file> first. Some ideas to
  do in this hook: setting default config profile. For each found config section,
  we also run C<hook_config_file_section> first. The hook will be fed C<< ($r,
  $section_name, $section_content) >> and should return 200 status or 204 (no
  content) to skip this config section or 4xx/5xx to terminate config reading with
  an error message. After config files are read, we run
  C<hook_after_read_config_file>.
  
  We then pass the spec to C<Getopt::Long::GetOptions>, we get function arguments.
  
  We then run C<hook_after_parse_argv>. Some ideas to do in this hook: XXX.
  
  Function arguments that are still missing can be filled from STDIN or files, if
  the metadata specifies C<cmdline_src> property (see L<Rinci::function> for more
  details).
  
  =item * Delegate to C<action_$action> method
  
  Before running the C<action_$action> method, C<hook_before_action> is called
  e.g. to allow changing/fixing action, last chance to check arguments, etc.
  
  After we get the action from the previous step, we delegate to separate
  C<action_$action> method (so there is C<action_version>, C<action_help>, and so
  on; and also C<action_call>). These methods also receive C<$r> as their argument
  and must return an enveloped result (see L<Rinci::function> for more details).
  
  Result is put in C<< $r->{res} >>.
  
  C<hook_after_action> is then called e.g. to preformat result.
  
  =item * Run hook_format_result
  
  Hook must set C<< $r->{fres} >> (formatted result).
  
  If C<skip_format> attribute is true, or function metadata has
  C<cmdline.skip_format> set to true, or result has C<cmdline.skip_format>
  metadata property set to true, then this step is skipped and C<< $r->{fres} >>
  is simply taken from C<< $r->{res}[2] >>.
  
  =item * Run hook_display_result
  
  This hook is used by XXX.
  
  =item * Run hook_after_run, if defined
  
  Some ideas to do in this hook: XXX.
  
  =item * Exit (or return result)
  
  If C<exit> attribute is true, will C<exit()> with the action's envelope result
  status. If status is 200, exit code is 0. Otherwise exit code is status minus
  300. So, a response C<< [501, "Not implemented"] >> will result in exit code of
  201.
  
  If C<exit> attribute is false, will simply return the action result (C<<
  $r->{res} >>). And will also set exit code in C<<
  $r->{res}[3]{'x.perinci.cmdline.base.exit_code'} >>.
  
  =back
  
  =head1 PROGRAM FLOW (TAB COMPLETION)
  
  If program is detected running in tab completion mode, there is some differences
  in the flow. First, C<@ARGV> is set from C<COMP_LINE> (or C<COMMAND_LINE>)
  environment variable. Afterwards, completion is done by calling
  L<Perinci::Sub::Complete>'s C<complete_cli_arg>.
  
  The result is then output to STDOUT (resume from Run hook_format_result step in
  the normal program flow).
  
  =head1 REQUEST KEYS
  
  The various values in the C<$r> hash/stash.
  
  =over
  
  =item * orig_argv => array
  
  Original C<@ARGV> at the beginning of C<run()>.
  
  =item * common_opts => hash
  
  Value of C<common_opts> attribute, for convenience.
  
  =item * action => str
  
  Selected action to use. Usually set from the common options.
  
  =item * format => str
  
  Selected format to use. Usually set from the common option C<--format>.
  
  =item * read_config => bool
  
  This is set in run() to signify that we have tried to read config file (this is
  set to true even though config file does not exist). This is never set to true
  when C<read_config> attribute is set, which means that we never try to read any
  config file.
  
  =item * read_env => bool
  
  This is set in run() to signify that we will try to read env for default
  options. This settng can be turned off e.g. in common option C<no_env>. This is
  never set to true when C<read_env> attribute is set to false, which means that
  we never try to read environment.
  
  =item * config => hash
  
  This is set in the routine that reads config file, containing the config hash.
  It might be an empty hash (if there is on config file to read), or a hash with
  sections as keys and hashrefs as values (configuration for each section). The
  data can be merged from several existing config files.
  
  =item * read_config_files => array
  
  This is set in the routine that reads config file, containing the list of config
  files actually read, in order.
  
  =item * config_paths => array of str
  
  =item * config_profile => str
  
  =item * parse_argv_res => array
  
  Enveloped result of C<parse_argv()>.
  
  =item * ignore_missing_config_profile_section => bool (default 1)
  
  This is checked in the parse_argv(). To aid error checking, when a user
  specifies a profile (e.g. via C<--config-profile FOO>) and config file exists
  but the said profile section is not found in the config file, an error is
  returned. This is to notify user that perhaps she mistypes the profile name.
  
  But this checking can be turned off with this setting. This is sometimes used
  when e.g. a subclass wants to pick a config profile automatically by setting C<<
  $r->{config_profile} >> somewhere before reading config file, but do not want to
  fail execution when config profile is not found. An example of code that does
  this is L<Perinci::CmdLine::depak>.
  
  =item * subcommand_name => str
  
  Also set by C<parse_argv()>. The subcommand name in effect, either set
  explicitly by user using C<--cmd> or the first command-line argument, or set
  implicitly with the C<default_subcommand> attribute. Undef if there is no
  subcommand name in effect.
  
  =item * subcommand_name_from => str
  
  Also set by C<parse_argv()>. Tells how the C<subcommand_name> request key is
  set. Value is either C<--cmd> (if set through C<--cmd> common option), C<arg>
  (if set through first command-line argument), C<default_subcommand> (if set to
  C<default_subcommand> attribute), or undef if there is no subcommand_name set.
  
  =item * subcommand_data => hash
  
  Also set by C<parse_argv()>. Subcommand data, including its URL, summary (if
  exists), and so on. Note that if there is no subcommand, this will contain data
  for the main command, i.e. URL will be set from C<url> attribute, summary from
  C<summary> attribute, and so on. This is a convenient way to get what URL and
  summary to use, and so on.
  
  =item * skip_parse_subcommand_argv => bool
  
  Checked by C<parse_argv()>. Can be set to 1, e.g. in common option handler for
  C<--help> or C<--version> to skip parsing @ARGV for per-subcommand options.
  
  =item * args => hash
  
  Also taken from C<parse_argv()> result.
  
  =item * meta => hash
  
  Result of C<get_meta()>.
  
  =item * dry_run => bool
  
  Whether to pass C<-dry_run> special argument to function.
  
  =item * res => array
  
  Enveloped result of C<action_ACTION()>.
  
  =item * fres => str
  
  Result from C<hook_format_result()>.
  
  =item * output_handle => handle
  
  Set by select_output_handle() to choose output handle. Normally it's STDOUT but
  can also be pipe to pager (if paging is turned on).
  
  =item * naked_res => bool
  
  Set to true if user specifies C<--naked-res>.
  
  =item * viewer => str
  
  Program to use as external viewer.
  
  =item * viewer_temp_path => str
  
  Set to temporary filename created to store the result to view to external viewer
  program.
  
  =item * page_result => bool
  
  =item * pager => str
  
  =back
  
  =head1 HOOKS
  
  All hooks will receive the argument C<$r>, a per-request hash/stash. The list
  below is by order of calling.
  
  =head2 $cmd->hook_before_run($r)
  
  Called at the start of C<run()>. Can be used to set some initial values of other
  C<$r> keys. Or setup the logger.
  
  =head2 $cmd->hook_before_read_config_file($r)
  
  Only called when C<read_config> attribute is true.
  
  =head2 $cmd->hook_after_read_config_file($r)
  
  Only called when C<read_config> attribute is true.
  
  =head2 $cmd->hook_after_get_meta($r)
  
  Called after the C<get_meta> method gets function metadata, which normally
  happens during parsing argument, because parsing function arguments require the
  metadata (list of arguments, etc).
  
  PC:Lite as well as PC:Classic use this hook to insert a common option
  C<--dry-run> if function metadata expresses that function supports dry-run mode.
  
  PC:Lite also checks the C<deps> property here. PC:Classic doesn't do this
  because it uses function wrapper (L<Perinci::Sub::Wrapper>) which does this.
  
  =head2 $cmd->hook_after_parse_argv($r)
  
  Called after C<run()> calls C<parse_argv()> and before it checks the result.
  C<$r->{parse_argv_res}> will contain the result of C<parse_argv()>. The hook
  gets a chance to, e.g. fill missing arguments from other source.
  
  Note that for sources specified in the C<cmdline_src> property, this base class
  will do the filling in after running this hook, so no need to do that here.
  
  PC:Lite uses this hook to give default values to function arguments C<<
  $r->{args} >> from the Rinci metadata. PC:Classic doesn't do this because it
  uses function wrapper (L<Perinci::Sub::Wrapper>) which will do this as well as
  some other stuffs (validate function arguments, etc).
  
  =head2 $cmd->hook_before_action($r)
  
  Called before calling the C<action_ACTION> method. Some ideas to do in this
  hook: modifying action to run (C<< $r->{action} >>), last check of arguments
  (C<< $r->{args} >>) before passing them to function.
  
  PC:Lite uses this hook to validate function arguments. PC:Classic does not do
  this because it uses function wrapper which already does this.
  
  =head2 $cmd->hook_after_action($r)
  
  Called after calling C<action_ACTION> method. Some ideas to do in this hook:
  preformatting result (C<< $r->{res} >>).
  
  =head2 $cmd->hook_format_result($r)
  
  The hook is supposed to format result in C<$res->{res}> (an array).
  
  All direct subclasses of PC:Base do the formatting here.
  
  =head2 $cmd->hook_display_result($r)
  
  The hook is supposed to display the formatted result (stored in C<$r->{fres}>)
  to STDOUT. But in the case of streaming output, this hook can also set it up.
  
  All direct subclasses of PC:Base do the formatting here.
  
  =head2 $cmd->hook_after_run($r)
  
  Called at the end of C<run()>, right before it exits (if C<exit> attribute is
  true) or returns C<$r->{res}>. The hook has a chance to modify exit code or
  result.
  
  =head1 SPECIAL ARGUMENTS
  
  Below is list of special arguments that may be passed to your function by the
  framework. Per L<Rinci> specification, these are prefixed by C<-> (dash).
  
  =head2 -dry_run => bool
  
  Only when in dry run mode, to notify function that we are in dry run mode.
  
  =head2 -cmdline => obj
  
  Only when C<pass_cmdline_object> attribute is set to true. This can be useful
  for the function to know about various stuffs, by probing the framework object.
  
  =head2 -cmdline_r => hash
  
  Only when C<pass_cmdline_object> attribute is set to true. Contains the C<$r>
  per-request hash/stash. This can be useful for the function to know about
  various stuffs, e.g. parsed configuration data, etc.
  
  =head2 -cmdline_src_ARGNAME => str
  
  This will be set if argument is retrieved from C<file>, C<stdin>,
  C<stdin_or_file>, C<stdin_or_files>, or C<stdin_line>.
  
  =head2 -cmdline_srcfilenames_ARGNAME => array
  
  An extra information if argument value is retrieved from file(s), so the
  function can know the filename(s).
  
  =head1 METADATA PROPERTY ATTRIBUTE
  
  This module observes the following Rinci metadata property attributes:
  
  =head2 cmdline.default_format => STR
  
  Set default output format (if user does not specify via --format command-line
  option).
  
  =head2 cmdline.skip_format => bool
  
  If you set it to 1, you specify that function's result never needs formatting
  (i.e. the function outputs raw text to be outputted directly), so no formatting
  will be done. See also: C<skip_format> attribute, C<cmdline.skip_format> result
  metadata attribute.
  
  =head1 RESULT METADATA
  
  This module interprets the following result metadata property/attribute:
  
  =head2 attribute: cmdline.exit_code => int
  
  Instruct to use this exit code, instead of using (function status - 300).
  
  =head2 attribute: cmdline.result => any
  
  Replace result. Can be useful for example in this case:
  
   sub is_palindrome {
       my %args = @_;
       my $str = $args{str};
       my $is_palindrome = $str eq reverse($str);
       [200, "OK", $is_palindrome,
        {"cmdline.result" => ($is_palindrome ? "Palindrome" : "Not palindrome")}];
   }
  
  When called as a normal function we return boolean value. But as a CLI, we
  display a more user-friendly message.
  
  =head2 attribute: cmdline.result.interactive => any
  
  Like C<cmdline.result> but when script is run interactively.
  
  =head2 attribute: cmdline.result.noninteractive => any
  
  Like C<cmdline.result> but when script is run non-interactively (in a pipeline).
  
  =head2 attribute: cmdline.default_format => str
  
  Default format to use. Can be useful when you want to display the result using a
  certain format by default, but still allows user to override the default.
  
  =head2 attribute: cmdline.page_result => bool
  
  If you want to filter the result through pager (currently defaults to
  C<$ENV{PAGER}> or C<less -FRSX>), you can set C<cmdline.page_result> in result
  metadata to true.
  
  For example:
  
   $SPEC{doc} = { ... };
   sub doc {
       ...
       [200, "OK", $doc, {"cmdline.page_result"=>1}];
   }
  
  =head2 attribute: cmdline.pager => STR
  
  Instruct to use specified pager instead of C<$ENV{PAGER}> or the default C<less>
  or C<more>.
  
  =head2 attribute: cmdline.view_result => bool
  
  Aside from using a pager, you can also use a viewer. The difference is, when we
  use a pager we pipe the output directly to the pager, but when we use a viewer
  we write to a temporary file then call the viewer with that temporary filename
  as argument. Viewer settings override pager settings.
  
  If this attribute is set to true, will view result using external viewer
  (external viewer program is set either from C<cmdline.viewer> or C<VIEWER> or
  C<BROWSER>. An error is raised when there is no viewer set.)
  
  =head2 attribute: cmdline.viewer => STR
  
  Instruct to use specified viewer instead of C<$ENV{VIEWER}> or C<$ENV{BROWSER}>.
  
  =head2 attribute: cmdline.skip_format => bool (default: 0)
  
  When we want the command-line framework to just print the result without any
  formatting. See also: C<skip_format> attribute, C<cmdline.skip_format> function
  metadata attribute.
  
  =head2 attribute: x.perinci.cmdline.base.exit_code => int
  
  This is added by this module, so exit code can be tested.
  
  =head1 ATTRIBUTES
  
  =head2 actions => array
  
  Contains a list of known actions and their metadata. Keys should be action
  names, values should be metadata. Metadata is a hash containing these keys:
  
  =head2 common_opts => hash
  
  A hash of common options, which are command-line options that are not associated
  with any subcommand. Each option is itself a specification hash containing these
  keys:
  
  =over
  
  =item * category (str)
  
  Optional, for grouping options in help/usage message, defaults to C<Common
  options>.
  
  =item * getopt (str)
  
  Required, for Getopt::Long specification.
  
  =item * handler (code)
  
  Required, for Getopt::Long specification. Note that the handler will receive C<<
  ($geopt, $val, $r) >> (an extra C<$r>).
  
  =item * usage (str)
  
  Optional, displayed in usage line in help/usage text.
  
  =item * summary (str)
  
  Optional, displayed in description of the option in help/usage text.
  
  =item * show_in_usage (bool or code, default: 1)
  
  A flag, can be set to 0 if we want to skip showing this option in usage in
  --help, to save some space. The default is to show all, except --subcommand when
  we are executing a subcommand (obviously).
  
  =item * show_in_options (bool or code, default: 1)
  
  A flag, can be set to 0 if we want to skip showing this option in options in
  --help. The default is to 0 for --help and --version in compact help. Or
  --subcommands, if we are executing a subcommand (obviously).
  
  =item * order (int)
  
  Optional, for ordering. Lower number means higher precedence, defaults to 1.
  
  =back
  
  A partial example from the default set by the framework:
  
   {
       help => {
           category        => 'Common options',
           getopt          => 'help|h|?',
           usage           => '--help (or -h, -?)',
           handler         => sub { ... },
           order           => 0,
           show_in_options => sub { $ENV{VERBOSE} },
       },
       format => {
           category    => 'Common options',
           getopt      => 'format=s',
           summary     => 'Choose output format, e.g. json, text',
           handler     => sub { ... },
       },
       undo => {
           category => 'Undo options',
           getopt   => 'undo',
           ...
       },
       ...
   }
  
  The default contains: help (getopt C<help|h|?>), version (getopt C<version|v>),
  action (getopt C<action>), format (getopt C<format=s>), format_options (getopt
  C<format-options=s>), json). If there are more than one subcommands, this will
  also be added: list (getopt C<list|l>). If dry-run is supported by function,
  there will also be: dry_run (getopt C<dry-run>). If undo is turned on, there
  will also be: undo (getopt C<undo>), redo (getopt C<redo>), history (getopt
  C<history>), clear_history (getopt C<clear-history>).
  
  Sometimes you do not want some options, e.g. to remove C<format> and
  C<format_options>:
  
   delete $cmd->common_opts->{format};
   delete $cmd->common_opts->{format_options};
   $cmd->run;
  
  Sometimes you want to rename some command-line options, e.g. to change version
  to use capital C<-V> instead of C<-v>:
  
   $cmd->common_opts->{version}{getopt} = 'version|V';
  
  Sometimes you want to add subcommands as common options instead. For example:
  
   $cmd->common_opts->{halt} = {
       category    => 'Server options',
       getopt      => 'halt',
       summary     => 'Halt the server',
       handler     => sub {
           my ($go, $val, $r) = @_;
           $r->{subcommand_name} = 'shutdown';
       },
   };
  
  This will make:
  
   % cmd --halt
  
  equivalent to executing the 'shutdown' subcommand:
  
   % cmd shutdown
  
  =head2 completion => code
  
  Will be passed to L<Perinci::Sub::Complete>'s C<complete_cli_arg()>. See its
  documentation for more details.
  
  =head2 default_subcommand => str
  
  Set subcommand to this if user does not specify which to use (either via first
  command-line argument or C<--cmd> option). See also: C<get_subcommand_from_arg>.
  
  =head2 auto_abbrev_subcommand => bool (default: 1)
  
  If set to yes, then if a partial subcommand name is given on the command-line
  and unambiguously completes to an existing subcommand name, it will be assumed
  to be the complete subcommand name. This is like the C<auto_abbrev> behavior of
  L<Getopt::Long>. For example:
  
   % myapp c
  
  If there are subcommands C<create>, C<modify>, C<move>, C<delete>, then C<c> is
  assumed to be C<create>. But if:
  
   % myapp mo
  
  then it results in an unknown subcommand error because mo is ambiguous between
  C<modify> and C<move>.
  
  Note that subcommand name in config section must be specified in full. This
  option is about convenience at the command-line only.
  
  =head2 get_subcommand_from_arg => int (default: 1)
  
  The default is 1, which is to get subcommand from the first command-line
  argument except when there is C<default_subcommand> defined. Other valid values
  are: 0 (not getting from first command-line argument), 2 (get from first
  command-line argument even though there is C<default_subcommand> defined).
  
  =head2 description => str
  
  =head2 exit => bool (default: 1)
  
  =head2 formats => array
  
  Available output formats.
  
  =head2 default_format => str
  
  Default format.
  
  =head2 pass_cmdline_object => bool (default: 0)
  
  Whether to pass special argument C<-cmdline> containing the cmdline object to
  function. This can be overriden using the C<pass_cmdline_object> on a
  per-subcommand basis.
  
  In addition to C<-cmdline>, C<-cmdline_r> will also be passed, containing the
  C<$r> per-request stash/hash (see L</"REQUEST KEYS">).
  
  Passing the cmdline object can be useful, e.g. to call action_help(), to get the
  settings of the Perinci::CmdLine, etc.
  
  =head2 per_arg_json => bool (default: 1 in ::Lite)
  
  This will be passed to L<Perinci::Sub::GetArgs::Argv>.
  
  =head2 per_arg_yaml => bool (default: 0 in ::Lite)
  
  This will be passed to L<Perinci::Sub::GetArgs::Argv>.
  
  =head2 program_name => str
  
  Default is from PERINCI_CMDLINE_PROGRAM_NAME environment or from $0.
  
  =head2 riap_version => float (default: 1.1)
  
  Specify L<Riap> protocol version to use. Will be passed to Riap client
  constructor (unless you already provide a Riap client object, see
  C<riap_client>).
  
  =head2 riap_client => obj
  
  Set to Riap client instance, should you want to create one yourself. Otherwise
  will be set L<Perinci::Access> (in PC:Classic), or L<Perinci::Access::Lite> (in
  PC:Lite).
  
  =head2 riap_client_args => hash
  
  Arguments to pass to Riap client constructor. Will be used unless you create
  your own Riap client object (see C<riap_client>). One of the things this
  attribute is used is to pass HTTP basic authentication to Riap client
  (L<Perinci::Access::HTTP::Client>):
  
   riap_client_args => {handler_args => {user=>$USER, password=>$PASS}}
  
  =head2 subcommands => hash | code
  
  Should be a hash of subcommand specifications or a coderef.
  
  Each subcommand specification is also a hash(ref) and should contain these keys:
  
  =over
  
  =item * C<url> (str, required)
  
  Location of function (accessed via Riap).
  
  =item * C<summary> (str, optional)
  
  Will be retrieved from function metadata at C<url> if unset
  
  =item * C<description> (str, optional)
  
  Shown in verbose help message, if description from function metadata is unset.
  
  =item * C<tags> (array of str, optional)
  
  For grouping or categorizing subcommands, e.g. when displaying list of
  subcommands.
  
  =item * C<use_utf8> (bool, optional)
  
  Whether to issue C<< use open, ":utf8" >>. Alternative: C<use_locale>. Takes
  precedence over C<use_locale>.
  
  =item * C<use_locale> (bool, optional)
  
  Whether to issue C<< use open, ":locale" >>. Alternative: C<use_utf8>.
  
  =item * C<undo> (bool, optional)
  
  Can be set to 0 to disable transaction for this subcommand; this is only
  relevant when C<undo> attribute is set to true.
  
  =item * C<show_in_help> (bool, optional, default 1)
  
  If you have lots of subcommands, and want to show only some of them in --help
  message, set this to 0 for subcommands that you do not want to show.
  
  =item * C<pass_cmdline_object> (bool, optional, default 0)
  
  To override C<pass_cmdline_object> attribute on a per-subcommand basis.
  
  =item * C<args> (hash, optional)
  
  If specified, will send the arguments (as well as arguments specified via the
  command-line). This can be useful for a function that serves more than one
  subcommand, e.g.:
  
   subcommands => {
       sub1 => {
           summary => 'Subcommand one',
           url     => '/some/func',
           args    => {flag=>'one'},
       },
       sub2 => {
           summary => 'Subcommand two',
           url     => '/some/func',
           args    => {flag=>'two'},
       },
   }
  
  In the example above, both subcommand C<sub1> and C<sub2> point to function at
  C</some/func>. But the function can differentiate between the two via the
  C<flag> argument being sent.
  
   % cmdprog sub1 --foo 1 --bar 2
   % cmdprog sub2 --foo 2
  
  In the first invocation, function will receive arguments C<< {foo=>1, bar=>2,
  flag=>'one'} >> and for the second: C<< {foo=>2, flag=>'two'} >>.
  
  =back
  
  Subcommands can also be a coderef, for dynamic list of subcommands. The coderef
  will be called as a method with hash arguments. It can be called in two cases.
  First, if called without argument C<name> (usually when doing --subcommands) it
  must return a hashref of subcommand specifications. If called with argument
  C<name> it must return subcommand specification for subcommand with the
  requested name only.
  
  =head2 summary => str
  
  =head2 tags => array of str
  
  =head2 url => str
  
  Required if you only want to run one function. URL should point to a function
  entity.
  
  Alternatively you can provide multiple functions from which the user can select
  using the first argument (see B<subcommands>).
  
  =head2 read_env => bool (default: 1)
  
  Whether to read environment variable for default options.
  
  =head2 env_name => str
  
  Environment name to read default options from. Default is from program name,
  upper-cased, sequences of dashes/nonalphanums replaced with a single underscore,
  plus a C<_OPT> suffix. So if your program name is called C<cpandb-cpanmeta> the
  default environment name is C<CPANDB_CPANMETA_OPT>.
  
  =head2 read_config => bool (default: 1)
  
  Whether to read configuration files.
  
  =head2 config_filename => str|array[str]|array[hash]
  
  Configuration filename(s). The default is C<< program_name . ".conf" >>. For
  example, if your program is named C<foo-bar>, config_filename will be
  C<foo-bar.conf>.
  
  You can specify an array of filename strings, which will be checked in order,
  e.g.: C<< ["myapp.conf", "myapp.ini"] >>.
  
  You can also specify an array of hashrefs, for more complex scenario. Each hash
  can contain these keys: C<filename>, C<section>. For example:
  
   [
       {filename => 'mysuite.conf', section=>'myapp1'},
       {filename => 'myapp1.conf'}, # section = GLOBAL (default)
   ]
  
  This means, configuration will be searched in C<mysuite.conf> under the section
  C<myapp1>, and then in C<myapp1.conf> in the default/global section.
  
  =head2 config_dirs => array of str
  
  Which directories to look for configuration file. The default is to look at the
  user's home and then system location. On Unix, it's C<< [ "$ENV{HOME}/.config",
  $ENV{HOME}, "/etc"] >>. If $ENV{HOME} is empty, getpwuid() is used to get home
  directory entry.
  
  =head2 cleanser => obj
  
  Object to cleanse result for JSON output. By default this is an instance of
  L<Data::Clean::JSON> and should not be set to other value in most cases.
  
  =head2 use_cleanser => bool (default: 1)
  
  When a function returns result, and the user wants to display the result as
  JSON, the result might need to be cleansed first (using L<Data::Clean::JSON> by
  default) before it can be encoded to JSON, for example it might contain Perl
  objects or scalar references or other stuffs. If you are sure that your function
  does not produce those kinds of data, you can set this to false to produce a
  more lightweight script.
  
  =head2 extra_urls_for_version => array of str
  
  =head2 skip_format => bool
  
  If set to 1, assume that function returns raw text that need not be translated,
  and so will not offer common command-line options C<--format>, C<--json>, as
  well as C<--naked-res>.
  
  As an alternative to this, can also be done on a per-function level by setting
  function metadata property C<cmdline.skip_format> to true. Or, can also be done
  on a per-function result basis by returning result metadata
  C<cmdline.skip_format> set to true.
  
  =head2 use_utf8 => bool (default: from env UTF8, or 0)
  
  Whether or not to set utf8 flag on output. If undef, will default to UTF8
  environment. If that is also undef, will default to 0.
  
  =head2 default_dry_run => bool (default: 0)
  
  If set to 1, then dry-mode will be turned on by default unless user uses
  DRY_RUN=0 or C<--no-dry-run>.
  
  =head2 log => bool
  
  Whether to enable logging. Default is off. If true, will load L<Log::ger::App>.
  
  =head2 log_level => str
  
  Set default log level. Will be overriden by C<< $r->{log_level} >> which is set
  from command-line options like C<--log-level>, C<--trace>, etc.
  
  =head1 METHODS
  
  =head2 $cmd->run() => ENVRES
  
  The main method to run your application. See L</"PROGRAM FLOW"> for more details
  on what this method does.
  
  =head2 $cmd->do_dump() => ENVRES
  
  Called by run().
  
  =head2 $cmd->do_completion() => ENVRES
  
  Called by run().
  
  =head2 $cmd->parse_argv() => ENVRES
  
  Called by run().
  
  =head2 $cmd->get_meta($r, $url) => ENVRES
  
  Called by parse_argv() or do_dump() or do_completion(). Subclass has to
  implement this.
  
  =head1 ENVIRONMENT
  
  =head2 BROWSER
  
  String. When L</"VIEWER"> is not set, then this environment variable will be
  used to select external viewer program.
  
  =head2 LOG_DUMP_CONFIG
  
  Boolean. If set to true, will dump parsed configuration at the trace level.
  
  =head2 PAGE_RESULT
  
  Boolean. Can be set to 1 to force paging of result. Can be set to 0 to
  explicitly disable paging even though C<cmd.page_result> result metadata
  attribute is active.
  
  See also: L</"PAGER">.
  
  =head2 PAGER
  
  String. Like in other programs, can be set to select the pager program (when
  C<cmdline.page_result> result metadata is active). Can also be set to C<''> or
  C<0> to explicitly disable paging even though C<cmd.page_result> result metadata
  is active.
  
  =head2 PERINCI_CMDLINE_DUMP_ARGS
  
  Boolean. If set to true, instead of running normal action, will instead dump
  arguments that will be passed to function, (after merge with values from
  environment/config files, and validation/coercion), in Perl format (using
  L<Data::Dump>) and exit.
  
  Useful for debugging or information extraction.
  
  =head2 PERINCI_CMDLINE_DUMP_CONFIG
  
  Boolean. If set to true, instead of running normal action, will dump
  configuration that is using C<read_config()>, in Perl format (using
  L<Data::Dump>) and exit.
  
  Useful for debugging or information extraction.
  
  =head2 PERINCI_CMDLINE_DUMP_OBJECT
  
  String. Default undef. If set to a true value, instead of running normal action,
  will dump Perinci::CmdLine object at the start of run() in Perl format (using
  L<Data::Dump>) and exit. Useful to get object's attributes and reconstruct the
  object later. Used in, e.g. L<App::shcompgen> to generate an appropriate
  completion script for the CLI, or L<Pod::Weaver::Plugin::Rinci> to generate POD
  documentation about the script. See also L<Perinci::CmdLine::Dump>.
  
  The value of the this variable will be used as the label in the dump delimiter,
  .e.g:
  
   # BEGIN DUMP foo
   ...
   # END DUMP foo
  
  Useful for debugging or information extraction.
  
  =head2 PERINCI_CMDLINE_OUTPUT_DIR
  
  String. If set, then aside from displaying output as usual, the unformatted
  result (enveloped result) will also be saved as JSON to an output directory. The
  filename will be I<UTC timestamp in ISO8601 format>C<.out>, e.g.:
  
   2017-12-11T123456.000000000Z.out
   2017-12-11T123456.000000000Z.out.1 (if the same filename already exists)
  
  or each output (C<.out>) file there will also be a corresponding C<.meta> file
  that contains information like: command-line arguments, PID, etc. Some notes:
  
  Output directory must already exist, or Perinci::CmdLine will display a warning
  and then skip saving output.
  
  Data that is not representable as JSON will be cleansed using
  L<Data::Clean::JSON>.
  
  Streaming output will not be saved appropriately, because streaming output
  contains coderef that will be called repeatedly during the normal displaying of
  result.
  
  =head2 PERINCI_CMDLINE_PROGRAM_NAME
  
  String. Can be used to set CLI program name.
  
  =head2 UTF8
  
  Boolean. To set default for C<use_utf8> attribute.
  
  =head2 VIEW_RESULT
  
  Boolean. Can be set to 1 to force using viewer to view result. Can be set to 0
  to explicitly disable using viewer to view result even though
  C<cmdline.view_result> result metadata attribute is active.
  
  =head2 VIEWER
  
  String. Can be set to select the viewer program to override C<cmdline.viewer>.
  Can also be set to C<''> or C<0> to explicitly disable using viewer to view
  result even though C<cmdline.view_result> result metadata attribute is active.
  
  See also L</"BROWSER">.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Perinci-CmdLine-Lite>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Perinci-CmdLine-Lite>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Perinci-CmdLine-Lite>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
PERINCI_CMDLINE_BASE

    $main::fatpacked{"Perinci/CmdLine/Classic.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PERINCI_CMDLINE_CLASSIC';
  package Perinci::CmdLine::Classic;
  
  our $DATE = '2019-04-15'; # DATE
  our $VERSION = '1.813'; # VERSION
  
  use 5.010001;
  #use strict; # enabled by Moo
  #use warnings; # enabled by Moo
  use Log::ger;
  
  use Moo;
  use experimental 'smartmatch'; # must be after Moo
  use Locale::TextDomain::UTF8 'Perinci-CmdLine-Classic';
  use Perinci::Object;
  use Scalar::Util qw(blessed);
  
  our $REQ_VERSION = 0; # version requested by user
  
  extends 'Perinci::CmdLine::Base';
  
  with 'Color::Theme::Role::ANSI' unless $ENV{COMP_LINE};
  with 'Perinci::CmdLine::Classic::Role::Help' unless $ENV{COMP_LINE};
  with 'Term::App::Role::Attrs' unless $ENV{COMP_LINE};
  
  has undo => (is=>'rw', default=>sub{0});
  has undo_dir => (
      is => 'rw',
      lazy => 1,
      default => sub {
          require File::HomeDir;
  
          my $self = shift;
          my $dir = File::HomeDir->my_home . "/." . $self->program_name;
          mkdir $dir unless -d $dir;
          $dir .= "/.undo";
          mkdir $dir unless -d $dir;
          $dir;
      }
  );
  has riap_client => (
      is => 'rw',
      lazy => 1,
      default => sub {
          my $self = shift;
  
          require Perinci::Access;
          require Perinci::Access::Perl;
          require Perinci::Access::Schemeless;
          my %args = (
              riap_version => $self->riap_version,
              %{$self->riap_client_args // {}},
          );
          my %opts;
          if ($self->undo) {
              $opts{use_tx} = 1;
              $opts{custom_tx_manager} = sub {
                  my $pa = shift;
                  require Perinci::Tx::Manager;
                  state $txm = Perinci::Tx::Manager->new(
                      data_dir => $self->undo_dir,
                      pa => $pa,
                  );
                  $txm;
             };
          }
          $args{handlers} = {
              pl => Perinci::Access::Perl->new(%opts),
              '' => Perinci::Access::Schemeless->new(%opts),
          };
          #$log->tracef("Creating Perinci::Access object with args: %s", \%args);
          Perinci::Access->new(%args);
      }
  );
  has action_metadata => (
      is => 'rw',
      default => sub {
          return {
              clear_history => {
              },
              help => {
                  use_utf8 => 1,
              },
              history => {
              },
              subcommands => {
                  use_utf8 => 1,
              },
              redo => {
              },
              call => {
              },
              undo => {
              },
              version => {
                  use_utf8 => 1,
              },
          },
      },
  );
  has default_prompt_template => (is=>'rw');
  
  sub VERSION {
      my ($pkg, $req) = @_;
      $REQ_VERSION = $req;
  }
  
  sub BUILD {
      my ($self, $args) = @_;
  
      my $formats = [qw(
                           text text-simple text-pretty
                           json json-pretty yaml perl
                           ruby phpserialization)];
  
      if (!$self->{default_prompt_template}) {
          $self->{default_prompt_template} = N__("Enter %s:") . " ";
      }
  
      if (!$self->{actions}) {
          $self->{actions} = {
              version => {
                  use_utf8 => 1,
              },
              help => {
                  use_utf8 => 1,
              },
              subcommands => {
                  use_utf8 => 1,
              },
              call => {},
  
              history => {},
              clear_history => {},
              redo => {},
              undo => {},
          };
      }
  
      # translate summary & usage
      my $_t = sub {
          no warnings;
          my $co_name = shift;
          my $copt = $Perinci::CmdLine::Base::copts{$co_name};
          my %res;
          for (keys %$copt) {
              if ($_ eq 'summary' || $_ eq 'usage') {
                  $res{$_} = N__($copt->{$_});
              } else {
                  $res{$_} = $copt->{$_};
              }
          }
          %res;
      };
  
      if (!$self->{common_opts}) {
          my $copts = {};
  
          $copts->{version} = {
              $_t->('version'),
              show_in_options => sub { $ENV{VERBOSE} },
          };
          $copts->{help} = {
              $_t->('help'),
              show_in_options => sub { $ENV{VERBOSE} },
          };
  
          unless ($self->skip_format) {
              $copts->{format} = {
                  $_t->('format'),
                  schema => ['str*' => in => $formats],
              };
              $copts->{json} = {
                  $_t->('json'),
                  summary => N__("Equivalent to --format=json-pretty"),
              };
              $copts->{naked_res} = {
                  $_t->('naked_res'),
                  summary => N__("When outputing as JSON, strip result envelope"),
              };
              $copts->{format_options} = {
                  getopt  => "format-options=s",
                  summary => N__("Pass options to formatter"),
                  handler => sub {
                      my ($go, $val, $r) = @_;
                      $r->{format_options} = __json_decode($val);
                  },
                  is_settable_via_config => 1,
                  tags => ['category:output'],
              };
          }
  
          if ($self->subcommands) {
              $copts->{subcommands} = {
                  $_t->('subcommands'),
                  show_in_options => sub {
                      my ($self, $r) = @_;
                      $ENV{VERBOSE} && !$r->{subcommand_name};
                  },
                  show_in_help => 0,
              };
          }
  
          if (defined $self->default_subcommand) {
              $copts->{cmd} = { $_t->('cmd') };
          }
  
          if ($self->read_config) {
              $copts->{config_path}    = { $_t->('config_path') };
              $copts->{no_config}      = { $_t->('no_config') };
              $copts->{config_profile} = { $_t->('config_profile') };
          }
  
          if ($self->read_env) {
              $copts->{no_env} = { $_t->('no_env') };
          }
  
          if ($self->log) {
              $copts->{log_level} = { $_t->('log_level'), };
              $copts->{trace}     = { $_t->('trace'), };
              $copts->{debug}     = { $_t->('debug'), };
              $copts->{verbose}   = { $_t->('verbose'), };
              $copts->{quiet}     = { $_t->('quiet'), };
          }
  
          if ($self->undo) {
              $copts->{history} = {
                  getopt  => 'history',
                  summary => N__('List actions history'),
                  handler => sub {
                      my ($go, $val, $r) = @_;
                      $r->{action} = 'history';
                      $r->{skip_parse_subcommand_argv} = 1;
                  },
                  tags => ['category:undo'],
              };
              $copts->{clear_history} = {
                  getopt  => "clear-history",
                  summary => N__('Clear actions history'),
                  handler => sub {
                      my ($go, $val, $r) = @_;
                      $r->{action} = 'clear_history';
                      $r->{skip_parse_subcommand_argv} = 1;
                  },
                  tags => ['category:undo'],
              };
              $copts->{undo} = {
                  getopt  => 'undo',
                  summary => N__('Undo previous action'),
                  handler => sub {
                      my ($go, $val, $r) = @_;
                      $r->{action} = 'undo';
                      $r->{skip_parse_subcommand_argv} = 1;
                  },
                  tags => ['category:undo'],
              };
              $copts->{redo} = {
                  getopt  => 'redo',
                  summary => N__('Redo previous undone action'),
                  handler => sub {
                      my ($go, $val, $r) = @_;
                      $r->{action} = 'redo';
                      $r->{skip_parse_subcommand_argv} = 1;
                  },
              };
          }
          $self->{common_opts} = $copts;
      }
  
      $self->{formats} //= $formats;
      $self->{per_arg_json} //= 1;
  
      unless ($ENV{COMP_LINE}) {
          my $ct = $self->{color_theme} // $ENV{PERINCI_CMDLINE_COLOR_THEME};
          if (!$ct) {
              if ($self->use_color) {
                  my $bg = $self->detect_terminal->{default_bgcolor} // '';
                  $ct = 'Default::default' .
                      ($bg eq 'ffffff' ? '_whitebg' : '');
              } else {
                  $ct = 'Default::no_color';
              }
          }
          $self->color_theme($ct);
      }
  }
  
  sub __json_decode {
      require JSON::MaybeXS;
      state $json = do { JSON::MaybeXS->new->allow_nonref };
      $json->decode(shift);
  }
  
  sub __json_encode {
      require JSON::MaybeXS;
      state $json = do { JSON::MaybeXS->new->allow_nonref };
      $json->encode(shift);
  }
  
  sub _color {
      my ($self, $color_name, $text) = @_;
      my $color_code = $color_name ?
          $self->get_theme_color_as_ansi($color_name) : "";
      my $reset_code = $color_code ? "\e[0m" : "";
      "$color_code$text$reset_code";
  }
  
  #NOW UNUSED
  #sub err {
  #    my ($self, $msg) = @_;
  #    $msg .= "\n" unless $msg =~ /\n\z/;
  #    $self->_color('error_label', "ERROR: ") . $msg;
  #}
  
  # format array item as row
  sub hook_format_row {
      state $dfpc = do {
          require Data::Format::Pretty::Console;
          Data::Format::Pretty::Console->new({interactive=>0});
      };
  
      my ($self, $r, $row) = @_;
      my $ref = ref($row);
      # we catch common cases to be faster (avoid dfpc's structure identification)
      if (!$ref) {
          # simple scalar
          return ($row // "") . "\n";
      } elsif ($ref eq 'ARRAY' && !(grep {ref($_)} @$row)) {
          # an array of scalars
          return join("\t", map { $dfpc->_format_cell($_) } @$row) . "\n";
      } else {
          # otherwise, just feed it to dfpc
          return $dfpc->_format($row);
      }
  }
  
  sub hook_after_get_meta {
      my ($self, $r) = @_;
  
      my $metao = risub($r->{meta});
      if ($metao->can_dry_run) {
          my $default_dry_run = $metao->default_dry_run // $self->default_dry_run;
          $r->{dry_run} = 1 if $default_dry_run;
          $r->{dry_run} = ($ENV{DRY_RUN} ? 1:0) if defined $ENV{DRY_RUN};
          $self->common_opts->{dry_run} = {
              getopt  => $default_dry_run ? 'dry-run!' : 'dry-run',
              summary => $default_dry_run ?
                  N__("Disable simulation mode (also via DRY_RUN=0)") :
                  N__("Run in simulation mode (also via DRY_RUN=1)"),
              handler => sub {
                  my ($go, $val, $r) = @_;
                  if ($val) {
                      log_debug("[pericmd] Dry-run mode is activated");
                      $r->{dry_run} = 1;
                      #$ENV{VERBOSE} = 1;
                  } else {
                      log_debug("[pericmd] Dry-run mode is deactivated");
                      $r->{dry_run} = 0;
                  }
              },
          };
      }
  }
  
  my ($ph1, $ph2); # patch handles
  my $setup_progress;
  sub _setup_progress_output {
      my $self = shift;
  
      if ($ENV{PROGRESS} // (-t STDOUT)) {
          require Progress::Any::Output;
          my $out = Progress::Any::Output->set("TermProgressBarColor");
          $setup_progress = 1;
          # we need to patch the logger adapters so it won't interfere with
          # progress meter's output
          require Monkey::Patch::Action;
          $ph1 = Monkey::Patch::Action::patch_package(
              'Log::Log4perl::Appender::Screen', 'log',
              'replace', sub {
                  my ($self, %params) = @_;
  
                  my $msg = $params{message};
                  $msg =~ s/\n//g;
  
                  # clean currently displayed progress bar first
                  if ($out->{lastlen}) {
                      print
                          "\b" x $out->{lastlen},
                              " " x $out->{lastlen},
                                  "\b" x $out->{lastlen};
                      undef $out->{lastlen};
                  }
  
                  # force output update so progress bar is displayed again
                  # immediately
                  $Progress::Any::output_data{"$out"}{force_update} = 1;
  
                  say $msg;
              },
          ) if defined &{"Log::Log4perl::Appender::Screen::log"};
          $ph2 = Monkey::Patch::Action::patch_package(
              'Log::Log4perl::Appender::ScreenColoredLevels', 'log',
              'replace', sub {
                  my ($self, %params) = @_;
                  # BEGIN copy-paste'ish from ScreenColoredLevels.pm
                  my $msg = $params{message};
                  $msg =~ s/\n//g;
                  if (my $color=$self->{color}->{$params{log4p_level}}) {
                      $msg = Term::ANSIColor::colored($msg, $color);
                  }
                  # END copy-paste'ish
  
                  # clean currently displayed progress bar first
                  if ($out->{lastlen}) {
                      print
                          "\b" x $out->{lastlen},
                              " " x $out->{lastlen},
                                  "\b" x $out->{lastlen};
                      undef $out->{lastlen};
                  }
  
                  # force output update so progress bar is displayed again
                  # immediately
                  $Progress::Any::output_data{"$out"}{force_update} = 1;
  
                  # XXX duplicated code above, perhaps move this to
                  # TermProgressBarColor's clean_bar() or something
  
                  say $msg;
              }
          ) if defined &{"Log::Log4perl::Appender::ScreenColoredLevels::log"};
      }
  }
  
  sub _unsetup_progress_output {
      my $self = shift;
  
      return unless $setup_progress;
      my $out = $Progress::Any::outputs{''}[0];
      $out->cleanup if $out->can("cleanup");
      undef $ph1;
      undef $ph2;
      $setup_progress = 0;
  }
  
  # this hook is called at the start of run(), can be used to initialize stuffs
  sub hook_before_run {
      my ($self, $r) = @_;
  
      log_trace("Start of CLI run");
  
      # save, for showing in history, among others
      $r->{orig_argv} = [@ARGV];
  }
  
  sub hook_before_parse_argv {
  }
  
  sub hook_after_parse_argv {
  }
  
  sub hook_format_result {
      # save startup time under completion
      return if $ENV{COMP_LINE};
  
      my ($self, $r) = @_;
  
      my $res    = $r->{res};
      my $format = $r->{format} // 'text';
      my $meta   = $r->{meta};
  
      require Perinci::Result::Format;
  
      unless ($format ~~ @{ $self->formats }) {
          warn "Unknown output format '$format'";
          $format = 'text';
      }
  
      $res->[3]{format_options} = $r->{format_options} if $r->{format_options};
  
      my $fres;
      if ($res->[3]{is_stream}) {
          log_trace("Result is a stream");
          return undef;
      } elsif ($res->[3]{'x.hint.result_binary'} && $format =~ /text/) {
          $fres = $res->[2];
      } else {
          log_trace("Formatting output with %s", $format);
          $fres = Perinci::Result::Format::format($res, $format, $r->{naked_res});
      }
  
      # ux: prefix error message with program name
      if ($format=~/text/ && $r->{res}[0] =~ /\A[45]/ && defined($r->{res}[1])) {
          $fres = "$self->{program_name}: $fres";
      }
  
      $fres;
  }
  
  sub hook_display_result {
      my ($self, $r) = @_;
  
      my $res  = $r->{res};
      my $resmeta = $res->[3] // {};
  
      my $handle = $r->{output_handle};
  
      if ($ENV{COMP_LINE} || $res->[3]{"cmdline.skip_format"}) {
          print $handle $res->[2];
          return;
      }
  
      # set utf8 flag
      my $utf8;
      {
          if ($resmeta->{'x.hint.result_binary'}) {
              # XXX only when format is text?
              $utf8 = 0; last;
          }
  
          my $am;
          $am = $self->action_metadata->{$r->{action}}
              if $r->{action};
          last if defined($utf8 = $am->{use_utf8});
  
          if ($r->{subcommand_data}) {
              last if defined($utf8 = $r->{subcommand_data}{use_utf8});
          }
  
          $utf8 = $self->use_utf8;
      }
      binmode($handle, ":encoding(utf8)") if $utf8;
  
      $self->display_result($r);
  }
  
  sub hook_after_run {
      my ($self, $r) = @_;
      $self->_unsetup_progress_output;
  }
  
  sub action_subcommands {
      my ($self, $r) = @_;
  
      if (!$self->subcommands) {
          return [200, "OK", __("There are no subcommands") . ".",
                  {"cmdline.skip_format"=>1}];
      }
  
      $r->{_help_buf} = '';
  
      my $subcommands = $self->list_subcommands;
  
      # XXX get summary from Riap if not exist, but this results in multiple Riap
      # requests.
  
      my %percat_subc; # (cat1 => {subcmd1=>..., ...}, ...)
      while (my ($scn, $sc) = each %$subcommands) {
          my $cat = "";
          for my $tag (@{$sc->{tags} // []}) {
              my $tn = ref($tag) ? $tag->{name} : $tag;
              next unless $tn =~ /^category:(.+)/;
              $cat = $1;
              last;
          }
          $percat_subc{$cat}       //= {};
          $percat_subc{$cat}{$scn}   = $sc;
      }
      my $has_many_cats = scalar(keys %percat_subc) > 1;
  
      my $i = 0;
      for my $cat (sort keys %percat_subc) {
          if ($has_many_cats) {
              $self->_help_add_heading(
                  $r,
                  __x("{category} subcommands",
                      category => ucfirst($cat || __("main"))));
          }
          my $subc = $percat_subc{$cat};
          for my $scn (sort keys %$subc) {
              my $sc = $subc->{$scn};
              my $summary = rimeta($sc)->langprop("summary");
              $self->_help_add_row(
                  $r,
                  [$self->_color('program_name', $scn), $summary],
                  {column_widths=>[-17, -40], indent=>1});
          }
      }
      $self->_help_draw_curtbl($r);
  
      [200, "OK", $r->{_help_buf},
       {"cmdline.skip_format"=>1}];
  }
  
  sub action_version {
      no strict 'refs';
  
      my ($self, $r) = @_;
  
      my $url = $r->{subcommand_data}{url} // $self->url;
  
      my @text;
  
      {
          my $meta = $self->get_meta($r, $url);
          push @text, __x(
              "{program} version {version}",
              program => $self->_color('program_name',
                                       $self->get_program_and_subcommand_name),
              version => $self->_color('emphasis', ($meta->{entity_v} // "?")),
          ),
              ($meta->{entity_date} ? " ($meta->{entity_date})" : ""),
              "\n";
          for my $mod (@{ $meta->{'x.dynamic_generator_modules'} // [] }) {
              push @text, "  ", __x(
                  "{program} version {version}",
                  program => $self->_color('emphasis', $mod),
                  version => $self->_color('emphasis', (${"$mod\::VERSION"} // "?")),
              ),
                  (${"$mod\::DATE"} ? " (".${"$mod\::DATE"}.")" : ""),
                      "\n";
          }
      }
  
      for my $url (@{ $self->extra_urls_for_version // [] }) {
          my $meta = $self->get_meta($r, $url);
          push @text, "  ", __x(
              "{program} version {version}",
              program => $self->_color('emphasis', $url),
              version => $self->_color('emphasis', ($meta->{entity_v} // "?")),
          ),
              ($meta->{entity_date} ? " ($meta->{entity_date})" : ''),
              "\n";
      }
  
      push @text, "  ", __x(
          "{program} version {version}",
          program => $self->_color('emphasis', "Perinci::CmdLine::Classic"),
          version => $self->_color('emphasis',
                                   $Perinci::CmdLine::Classic::VERSION || "dev"),
      ),
          ($Perinci::CmdLine::Classic::DATE ? " ($Perinci::CmdLine::Classic::DATE)" : ""),
          "\n";
  
      [200, "OK", join("", @text), {"cmdline.skip_format"=>1}];
  }
  
  sub action_call {
      my ($self, $r) = @_;
  
      my $scn = $r->{subcommand_name};
      my $scd = $r->{subcommand_data};
  
      my %fargs = %{$r->{args} // {}};
  
      my $tx_id;
  
      my $dry_run = $r->{dry_run};
      my $using_tx = !$dry_run && $self->undo && ($scd->{undo} // 1);
  
      # currently we don't attempt to insert tx_id or dry_run when using argv,
      # we'll just give up
      if ($r->{send_argv} && ($dry_run || $using_tx)) {
          return $r->{parse_argv_res};
      }
  
      if ($using_tx) {
          require UUID::Random;
          $tx_id = UUID::Random::generate();
          $tx_id =~ s/-.+//; # 32bit suffices for small number of txs
          my $summary = join(" ", @{ $r->{orig_argv} });
          my $tres = $self->riap_client->request(
              begin_tx => "/", {tx_id=>$tx_id, summary=>$summary});
          if ($tres->[0] != 200) {
              return [$tres->[0], "Can't start transaction '$tx_id': $tres->[1]"];
          }
      }
  
      # setup output progress indicator
      if ($r->{meta}{features}{progress}) {
          $self->_setup_progress_output;
      }
  
      # call function
      my $res;
      if ($r->{send_argv}) {
          $res = $self->riap_client->request(
              call => $scd->{url},
              {argv=>$r->{orig_argv}}, # XXX tx_id, dry_run (see above)
          );
      } else {
          #$log->tracef("Calling function via _pa with arguments: %s", \%fargs);
          $res = $self->riap_client->request(
              call => $scd->{url},
              {args=>\%fargs, tx_id=>$tx_id, dry_run=>$dry_run});
      }
      log_trace("call res=%s", $res);
  
      # commit transaction (if using tx)
      if ($using_tx && $res->[0] =~ /\A(?:200|304)\z/) {
          my $tres = $self->riap_client->request(commit_tx => "/", {tx_id=>$tx_id});
          if ($tres->[0] != 200) {
              return [$tres->[0],"Can't commit transaction '$tx_id': $tres->[1]"];
          }
      }
  
      $res;
  }
  
  sub action_history {
      my ($self, $r) = @_;
      my $res = $self->riap_client->request(list_txs => "/", {detail=>1});
      log_trace("list_txs res=%s", $res);
      return $res unless $res->[0] == 200;
      $res->[2] = [sort {($b->{tx_commit_time}//0) <=> ($a->{tx_commit_time}//0)}
                       @{$res->[2]}];
      my @txs;
      for my $tx (@{$res->[2]}) {
          next unless $tx->{tx_status} =~ /[CUX]/;
          push @txs, {
              id          => $tx->{tx_id},
              start_time  => $tx->{tx_start_time},
              commit_time => $tx->{tx_commit_time},
              status      => $tx->{tx_status} eq 'X' ? 'error' :
                  $tx->{tx_status} eq 'U' ? 'undone' : '',
              summary     => $tx->{tx_summary},
          };
      }
      [200, "OK", \@txs];
  }
  
  sub action_clear_history {
      my ($self, $r) = @_;
      $self->riap_client->request(discard_all_txs => "/");
  }
  
  sub action_undo {
      my ($self, $r) = @_;
      $self->riap_client->request(undo => "/");
  }
  
  sub action_redo {
      my ($self, $r) = @_;
      $self->riap_client->request(redo => "/");
  }
  
  1;
  # ABSTRACT: Rinci/Riap-based command-line application framework
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Perinci::CmdLine::Classic - Rinci/Riap-based command-line application framework
  
  =head1 VERSION
  
  This document describes version 1.813 of Perinci::CmdLine::Classic (from Perl distribution Perinci-CmdLine-Classic), released on 2019-04-15.
  
  =head1 SYNOPSIS
  
  In C<gen-random-num> script:
  
   use Perinci::CmdLine::Classic;
  
   our %SPEC;
  
   $SPEC{gen_random_num} = {
       v => 1.1,
       summary => 'Generate some random numbers',
       args => {
           count => {
               summary => 'How many numbers to generate',
               schema => ['int*' => min=>0],
               default => 1,
               cmdline_aliases=>{n=>{}},
               req => 1,
               pos => 0,
           },
           min => {
               summary => 'Lower limit of random number',
               schema => 'float*',
               default => 0,
           },
           max => {
               summary => 'Upper limit of random number',
               schema => 'float*',
               default => 1,
           },
       },
       result_naked => 1,
   };
   sub gen_random_num {
       my %args = @_;
  
       my @res;
       for (1..$args{count}) {
           push @res, $args{min} + rand()*($args{max}-$args{min});
       }
       \@res;
   }
  
   Perinci::CmdLine::Classic->new(url => '/main/gen_random_num')->run;
  
  Run your script:
  
   % ./gen-random-num
   0.999473691060306
  
   % ./gen-random-num --min 1 --max 10 5
   1.27390166158969
   1.69077475473679
   8.97748327778684
   5.86943773494068
   8.34341298182493
  
  JSON output support out of the box:
  
   % ./gen-random-num -n3 --json
   [200,"OK (envelope added by Perinci::Access::Lite)",[0.257073684902029,0.393782991540746,0.848740540017513],{}]
  
  Automatic help message:
  
   % ./gen-random-num -h
   gen-random-num - Generate some random numbers
  
   Usage:
     gen-random-num --help (or -h, -?)
     gen-random-num --version (or -v)
     gen-random-num [options] [count]
   Options:
     --config-path=s     Set path to configuration file
     --config-profile=s  Set configuration profile to use
     --count=i, -n       How many numbers to generate (=arg[0]) [1]
     --format=s          Choose output format, e.g. json, text [undef]
     --help, -h, -?      Display this help message
     --json              Set output format to json
     --max=f             Upper limit of random number [1]
     --min=f             Lower limit of random number [0]
     --naked-res         When outputing as JSON, strip result envelope [0]
     --no-config         Do not use any configuration file
     --version, -v
  
  Automatic configuration file support:
  
   % cat ~/gen-random-num.conf
   count=5
   max=0.01
  
   % ./gen-random-num
   0.00105268954838724
   0.00701443611501844
   0.0021247476506154
   0.00813872824513005
   0.00752832346491306
  
  Automatic tab completion support:
  
   % complete -C gen-random-num gen-random-num
   % gen-random-num --mi<tab>
  
  See L<Perinci::CmdLine::Manual> for details on other available features
  (subcommands, automatic formatting of data structures, automatic schema
  validation, dry-run mode, automatic POD generation, remote function support,
  automatic CLI generation, automatic --version, automatic HTTP API,
  undo/transactions, configurable output format, logging, progress bar,
  colors/Unicode, and more).
  
  =head1 DESCRIPTION
  
  Perinci::CmdLine is a command-line application framework. It allows you to
  create full-featured CLI applications easily and quickly.
  
  See L<Perinci::CmdLine::Manual> for more details.
  
  There is also a blog post series on Perinci::CmdLine tutorial:
  L<https://perlancar.wordpress.com/category/pericmd-tut/>
  
  Perinci::CmdLine::Classic is the heavier backend implementation which supports
  some extra features currently not supported by the default backend
  implementation L<Perinci::CmdLine::Lite>. These features come at some startup
  overhead cost and more dependencies. You normally should use
  L<Perinci::CmdLine::Any> instead to be able to switch backend on the fly.
  
  Screenshots:
  
  =for Pod::Coverage ^(.+)$
  
  =begin HTML
  
  <p><img src="http://blogs.perl.org/users/perlancar/screenshot-pericmd-help.jpg" /><br />Autogenerated help message
  
  <p><img src="http://blogs.perl.org/users/perlancar/screenshot-pericmd-help_verbose.jpg" /><br />Autogenerated help message (verbose mode)
  
  <p><img src="http://blogs.perl.org/users/perlancar/progany-tpc.jpg" /><br />Progress bar
  
  <p><img src="http://blogs.perl.org/users/perlancar/screenshot-pericmd-completion.jpg" /><br />Tab completion
  
  <p><img src="http://blogs.perl.org/users/perlancar/screenshot-pericmd-format.jpg" /><br />Some output formats
  
  <p><img src="http://blogs.perl.org/users/perlancar/screenshot-trashu.jpg" /><br />Undo/redo
  
  =end HTML
  
  =head1 REQUEST KEYS
  
  See also L<Perinci::CmdLine::Base>. Extra stuffs put by this module to the C<$r>
  hash/stash.
  
  =over
  
  =item * format_options => hash
  
  =back
  
  =head1 RESULT METADATA
  
  All those supported by L<Perinci::CmdLine::Base>, plus:
  
  =head2 x.hint.result_binary => bool
  
  If set to true, then when formatting to C<text> formats, this class won't print
  any newline to keep the data being printed unmodified.
  
  =head1 ATTRIBUTES
  
  All the attributes of L<Perinci::CmdLine::Base>, plus:
  
  =head2 use_utf8 => BOOL
  
  From L<Term::App::Role::Attrs> (please see its docs for more details). There are
  several other attributes added by the role.
  
  =head2 undo => BOOL (optional, default 0)
  
  Whether to enable undo/redo functionality. Some things to note if you intend to
  use undo:
  
  =over
  
  =item * These common command-line options will be recognized
  
  C<--undo>, C<--redo>, C<--history>, C<--clear-history>.
  
  =item * Transactions will be used
  
  C<< use_tx=>1 >> will be passed to L<Perinci::Access>, which will cause it to
  initialize the transaction manager. Riap requests begin_tx and commit_tx will
  enclose the call request to function.
  
  =item * Called function will need to support transaction and undo
  
  Function which does not meet qualifications will refuse to be called.
  
  Exception is when subcommand is specified with C<< undo=>0 >>, where transaction
  will not be used for that subcommand. For an example of disabling transaction
  for some subcommands, see C<bin/u-trash> in the distribution.
  
  =back
  
  =head2 undo_dir => STR (optional, default ~/.<program_name>/.undo)
  
  Where to put undo data. This is actually the transaction manager's data dir.
  
  =head1 METHODS
  
  All the methods of L<Perinci::CmdLine::Base>, plus:
  
  =over
  
  =back
  
  =head1 ENVIRONMENT
  
  All the environment variables that L<Perinci::CmdLine::Base> supports, plus:
  
  =head2 PERINCI_CMDLINE_COLOR_THEME => STR
  
  Can be used to set C<color_theme>.
  
  =head2 PROGRESS => BOOL
  
  Explicitly turn the progress bar on/off.
  
  =head2 COLOR => INT
  
  Please see L<Term::App::Role::Attrs>.
  
  =head2 UTF8 => BOOL
  
  Please see L<Term::App::Role::Attrs>.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Perinci-CmdLine-Classic>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Perinci-CmdLine-Classic>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Perinci-CmdLine-Classic>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Perinci::CmdLine::Any>, L<Perinci::CmdLine::Lite>.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012, 2011 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
PERINCI_CMDLINE_CLASSIC

    $main::fatpacked{"Perinci/CmdLine/Classic/ColorTheme/Default.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PERINCI_CMDLINE_CLASSIC_COLORTHEME_DEFAULT';
  package Perinci::CmdLine::Classic::ColorTheme::Default;
  
  our $DATE = '2019-04-15'; # DATE
  our $VERSION = '1.813'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  
  our %color_themes = (
  
      no_color => {
          v => 1.1,
          summary => 'Special theme that means no color',
          colors => {
          },
          no_color => 1,
      },
  
      default => {
          v => 1.1,
          summary => 'Default (for terminals with black background)',
          colors => {
              heading       => 'ff9933',
              text          => undef,
              error_label   => 'cc0000',
              warning_label => 'cccc00',
              program_name  => {ansi_fg=>"\e[1m"}, # bold
              option_name   => 'cc6633',
              emphasis      => {ansi_fg=>"\e[1m"}, # bold
              #option_value  => undef,
              #argument      => undef,
          },
      },
  
      default_whitebg => {
          v => 1.1,
          summary => 'Default (for terminals with white background)',
          colors => {
          },
      },
  
  );
  
  1;
  # ABSTRACT: Default color themes
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Perinci::CmdLine::Classic::ColorTheme::Default - Default color themes
  
  =head1 VERSION
  
  This document describes version 1.813 of Perinci::CmdLine::Classic::ColorTheme::Default (from Perl distribution Perinci-CmdLine-Classic), released on 2019-04-15.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Perinci-CmdLine-Classic>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Perinci-CmdLine-Classic>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Perinci-CmdLine-Classic>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012, 2011 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
PERINCI_CMDLINE_CLASSIC_COLORTHEME_DEFAULT

    $main::fatpacked{"Perinci/CmdLine/Classic/Role/Help.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PERINCI_CMDLINE_CLASSIC_ROLE_HELP';
  ## no critic: (ControlStructures::ProhibitMutatingListFunctions)
  
  package Perinci::CmdLine::Classic::Role::Help;
  
  our $DATE = '2019-04-15'; # DATE
  our $VERSION = '1.813'; # VERSION
  
  # split here just so it's more organized
  
  use 5.010;
  use Moo::Role;
  
  use Locale::TextDomain::UTF8 'Perinci-CmdLine';
  use Perinci::Object;
  
  sub _help_draw_curtbl {
      my ($self, $r) = @_;
  
      if ($r->{_help_curtbl}) {
          $r->{_help_buf} .= $r->{_help_curtbl}->draw;
          undef $r->{_help_curtbl};
      }
  }
  
  # ansitables are used to draw formatted help. they are 100% wide, with no
  # borders (except space), but you can customize the number of columns (which
  # will be divided equally)
  sub _help_add_table {
      require Text::ANSITable;
  
      my ($self, $r, %args) = @_;
      my $columns = $args{columns} // 1;
  
      $self->_help_draw_curtbl($r);
      my $t = Text::ANSITable->new;
      $t->border_style('Default::spacei_ascii');
      $t->cell_pad(0);
      if ($args{column_widths}) {
          for (0..$columns-1) {
              $t->set_column_style($_, width => $args{column_widths}[$_]);
          }
      } else {
          my $tw = $self->term_width;
          my $cw = int($tw/$columns)-1;
          $t->cell_width($cw);
      }
      $t->show_header(0);
      $t->column_wrap(0); # we'll do our own wrapping, before indent
      $t->columns([0..$columns-1]);
  
      $r->{_help_curtbl} = $t;
  }
  
  sub _help_add_row {
      my ($self, $r, $row, $args) = @_;
      $args //= {};
      my $wrap    = $args->{wrap}   // 0;
      my $indent  = $args->{indent} // 0;
      my $columns = @$row;
  
      # start a new table if necessary
      $self->_help_add_table(
          $r,
          columns=>$columns, column_widths=>$args->{column_widths})
          if !$r->{_help_curtbl} ||
              $columns != @{ $r->{_help_curtbl}{columns} };
  
      my $t = $r->{_help_curtbl};
      my $rownum = @{ $t->{rows} };
  
      $t->add_row($row);
  
      my $dux_available = eval { require Data::Unixish; 1 } && !$@;
  
      if ($dux_available) {
          for (0..@{$t->{columns}}-1) {
              my %styles = (formats=>[]);
              push @{ $styles{formats} },
                  [wrap=>{ansi=>1, mb=>1, width=>$t->{cell_width}-$indent*2}]
                  if $wrap;
              push @{ $styles{formats} }, [lins=>{text=>"  " x $indent}]
                  if $indent && $_ == 0;
              $t->set_cell_style($rownum, $_, \%styles);
          }
      }
  }
  
  sub _help_add_heading {
      my ($self, $r, $heading) = @_;
      $self->_help_add_row($r, [$self->_color('heading', $heading)]);
  }
  
  sub _color {
      my ($self, $color_name, $text) = @_;
      my $color_code = $color_name ?
          $self->get_theme_color_as_ansi($color_name) : "";
      my $reset_code = $color_code ? "\e[0m" : "";
      "$color_code$text$reset_code";
  }
  
  sub help_section_summary {
      my ($self, $r) = @_;
  
      my $summary = rimeta($r->{_help_meta})->langprop("summary");
      return unless $summary;
  
      my $name = $self->get_program_and_subcommand_name($r);
      my $ct = join(
          "",
          $self->_color('program_name', $name),
          ($name && $summary ? ' - ' : ''),
          $summary // "",
      );
      $self->_help_add_row($r, [$ct], {wrap=>1});
  }
  
  sub help_section_usage {
      my ($self, $r) = @_;
  
      my $co = $self->common_opts;
      my @con = grep {
          my $cov = $co->{$_};
          my $show = $cov->{show_in_usage} // 1;
          for ($show) { if (ref($_) eq 'CODE') { $_ = $_->($self, $r) } }
          $show;
      } sort {
          ($co->{$a}{order}//1) <=> ($co->{$b}{order}//1) || $a cmp $b
      } keys %$co;
  
      my $pn = $self->_color(
          'program_name', $self->get_program_and_subcommand_name($r));
      my $ct = "";
      for my $con (@con) {
          my $cov = $co->{$con};
          next unless $cov->{usage};
          $ct .= ($ct ? "\n" : "") . $pn . " " . __($cov->{usage});
      }
      if ($self->subcommands && !$r->{subcommand_name}) {
          if (defined $self->default_subcommand) {
              $ct .= ($ct ? "\n" : "") . $pn .
                  " " . __("--cmd=<other-subcommand> [options]");
          } else {
              $ct .= ($ct ? "\n" : "") . $pn .
                  " " . __("<subcommand> [options]");
          }
      } else {
          my $usage = $r->{_help_clidocdata}{usage_line};
          $usage =~ s/\[\[prog\]\]/$pn/;
          $usage =~ s/\[options\]/__("[options]")/e;
          $ct .= ($ct ? "\n" : "") . $usage;
      }
      $self->_help_add_heading($r, __("Usage"));
      $self->_help_add_row($r, [$ct], {indent=>1});
  }
  
  sub help_section_options {
      my ($self, $r) = @_;
  
      my $opts = $r->{_help_clidocdata}{opts};
      return unless keys %$opts;
  
      my $verbose = $r->{_help_verbose};
      my $info = $r->{_help_info};
      my $meta = $r->{_help_meta};
      my $args_p = $meta->{args};
      my $sc = $self->subcommands;
  
      # group options by raw category, e.g. $cats{""} (for options
      # without category and common options) or $cat{"cat1"}.
      my %cats; # val = [ospec, ...]
  
      for (keys %$opts) {
          push @{ $cats{$opts->{$_}{raw_category} // ''} }, $_;
      }
  
      for my $cat (sort keys %cats) {
          # find the longest option
          my @opts = sort {length($b)<=>length($a)} @{ $cats{$cat} };
          my $len = length($opts[0]);
          # sort again by name
          @opts = sort {
              (my $a_without_dash = $a) =~ s/^-+//;
              (my $b_without_dash = $b) =~ s/^-+//;
              lc($a) cmp lc($b);
          } @opts;
  
          my $cat_title;
          if ($cat eq '') {
              $cat_title = __("Options");
          } else {
              $cat_title = __x("{category} options", category=>ucfirst($cat));
          }
          $self->_help_add_heading($r, $cat_title);
  
          if ($verbose) {
              for my $opt_name (@opts) {
                  my $opt_spec = $opts->{$opt_name};
                  my $arg_spec = $opt_spec->{arg_spec};
                  my $ct = $self->_color('option_name', $opt_name);
                  # BEGIN DUPE1
                  if ($arg_spec && !$opt_spec->{main_opt} &&
                          defined($arg_spec->{pos})) {
                      if ($arg_spec->{slurpy} // $arg_spec->{greedy}) {
                          $ct .= " (=arg[$arg_spec->{pos}-])";
                      } else {
                          $ct .= " (=arg[$arg_spec->{pos}])";
                      }
                  }
                  if ($arg_spec && !$opt_spec->{main_opt} &&
                          defined($arg_spec->{cmdline_src})) {
                      $ct .= " (or from $arg_spec->{cmdline_src})";
                      $ct =~ s!_or_!/!;
                  }
                  # END DUPE1
                  $self->_help_add_row($r, [$ct], {indent=>1});
  
                  if ($opt_spec->{summary} || $opt_spec->{description}) {
                      my $ct = "";
                      $ct .= ($ct ? "\n\n":"")."$opt_spec->{summary}."
                          if $opt_spec->{summary};
                      $ct .= ($ct ? "\n\n":"").$opt_spec->{description}
                          if $opt_spec->{description};
                      $self->_help_add_row($r, [$ct], {indent=>2, wrap=>1});
                  }
              }
          } else {
              # for compactness, display in columns
              my $tw = $self->term_width;
              my $columns = int($tw/40); $columns = 1 if $columns < 1;
              while (1) {
                  my @row;
                  for (1..$columns) {
                      last unless @opts;
                      my $opt_name = shift @opts;
                      my $opt_spec = $opts->{$opt_name};
                      my $arg_spec = $opt_spec->{arg_spec};
                      my $ct = $self->_color('option_name', $opt_name);
                      # BEGIN DUPE1
                      if ($arg_spec && !$opt_spec->{main_opt} &&
                              defined($arg_spec->{pos})) {
                          if ($arg_spec->{slurpy} // $arg_spec->{greedy}) {
                              $ct .= " (=arg[$arg_spec->{pos}-])";
                          } else {
                              $ct .= " (=arg[$arg_spec->{pos}])";
                          }
                      }
                      if ($arg_spec && !$opt_spec->{main_opt} &&
                              defined($arg_spec->{cmdline_src})) {
                          $ct .= " (or from $arg_spec->{cmdline_src})";
                          $ct =~ s!_or_!/!;
                      }
                      # END DUPE1
                      push @row, $ct;
                  }
                  last unless @row;
                  for (@row+1 .. $columns) { push @row, "" }
                  $self->_help_add_row($r, \@row, {indent=>1});
              }
          }
      }
  }
  
  sub help_section_subcommands {
      my ($self, $r) = @_;
  
      my $verbose = $r->{_help_verbose};
      return unless $self->subcommands && !$r->{subcommand_name};
      my $scs = $self->list_subcommands;
  
      my @scs = sort keys %$scs;
      my @shown_scs;
      for my $scn (@scs) {
          my $sc = $scs->{$scn};
          next unless $sc->{show_in_help} // 1;
          $sc->{name} = $scn;
          push @shown_scs, $sc;
      }
  
      # for help_section_hints
      my $some_not_shown = @scs > @shown_scs;
      $r->{_help_hide_some_subcommands} = 1 if $some_not_shown;
  
      $self->_help_add_heading(
          $r, $some_not_shown ? __("Popular subcommands") : __("Subcommands"));
  
      # in compact mode, we try to not exceed one screen, so show long mode only
      # if there are a few subcommands.
      my $long_mode = $verbose || @shown_scs < 12;
      if ($long_mode) {
          for (@shown_scs) {
              my $summary = rimeta($_)->langprop("summary");
              $self->_help_add_row(
                  $r,
                  [$self->_color('program_name', $_->{name}), $summary],
                  {column_widths=>[-17, -40], indent=>1});
          }
      } else {
          # for compactness, display in columns
          my $tw = $self->term_width;
          my $columns = int($tw/25); $columns = 1 if $columns < 1;
              while (1) {
                  my @row;
                  for (1..$columns) {
                      last unless @shown_scs;
                      my $sc = shift @shown_scs;
                      push @row, $sc->{name};
                  }
                  last unless @row;
                  for (@row+1 .. $columns) { push @row, "" }
                  $self->_help_add_row($r, \@row, {indent=>1});
              }
  
      }
  }
  
  sub help_section_hints {
      my ($self, $r) = @_;
  
      my $verbose = $r->{_help_verbose};
      my @hints;
      unless ($verbose) {
          push @hints, N__("For more complete help, use '--help --verbose'");
      }
      if ($r->{_help_hide_some_subcommands}) {
          push @hints,
              N__("To see all available subcommands, use '--subcommands'");
      }
      return unless @hints;
  
      $self->_help_add_row(
          $r, [join(" ", map { __($_)."." } @hints)], {wrap=>1});
  }
  
  sub help_section_description {
      my ($self, $r) = @_;
  
      my $desc = rimeta($r->{_help_meta})->langprop("description") //
          $self->description;
      return unless $desc;
  
      $self->_help_add_heading($r, __("Description"));
      $self->_help_add_row($r, [$desc], {wrap=>1, indent=>1});
  }
  
  sub help_section_examples {
      my ($self, $r) = @_;
  
      my $verbose = $r->{_help_verbose};
      my $meta = $r->{_help_meta};
      my $egs = $r->{_help_clidocdata}{examples};
      return unless $egs && @$egs;
  
      $self->_help_add_heading($r, __("Examples"));
      my $pn = $self->_color(
          'program_name', $self->get_program_and_subcommand_name($r));
      for my $eg (@$egs) {
          my $cmdline = $eg->{cmdline};
          $cmdline =~ s/\[\[prog\]\]/$pn/;
          $self->_help_add_row($r, ["% $cmdline"], {indent=>1});
          if ($verbose) {
              my $ct = "";
              if ($eg->{summary}) { $ct .= "$eg->{summary}." }
              if ($eg->{description}) { $ct .= "\n\n$eg->{description}" }
              $self->_help_add_row($r, [$ct], {indent=>2}) if $ct;
          }
      }
  }
  
  sub help_section_result {
      my ($self, $r) = @_;
  
      my $meta   = $r->{_help_meta};
      my $rmeta  = $meta->{result};
      my $rmetao = rimeta($rmeta);
      my $text;
  
      my $summary = $rmetao->langprop('summary') // '';
      my $desc    = $rmetao->langprop('description') // '';
      $text = $summary . ($summary ? "\n\n" : "") . $desc;
  
      # collect handler
      my %handlers;
      for my $k0 (keys %$rmeta) {
          my $v = $rmeta->{$k0};
  
          my $k = $k0; $k =~ s/\..+//;
          next if $k =~ /\A_/;
  
          # check builtin result spec key
          next if $k =~ /\A(
                             summary|description|tags|default_lang|
                             schema|
                             x
                         )\z/x;
  
          # try a property module first
          require "Perinci/Sub/Property/result/$k.pm";
          my $meth = "help_hookmeta_result__$k";
          unless ($self->can($meth)) {
              die "No help handler for property result/$k0 ($meth)";
          }
          my $hmeta = $self->$meth;
          $handlers{$k} = {
              prio => $hmeta->{prio},
              meth => "help_hook_result__$k",
          };
      }
  
      # call all the handlers in order
      for my $k (sort {$handlers{$a}{prio} <=> $handlers{$b}{prio}}
                     keys %handlers) {
          my $h = $handlers{$k};
          my $meth = $h->{meth};
          my $t = $self->$meth($r);
          $text .= $t if $t;
      }
  
      return unless length $text;
  
      $self->_help_add_heading($r, __("Result"));
      $self->_help_add_row($r, [$text], {wrap=>1, indent=>1});
  }
  
  sub help_section_links {
      # not yet
  }
  
  sub action_help {
      my ($self, $r) = @_;
  
      $r->{_help_buf} = '';
  
      my $verbose = $ENV{VERBOSE} // 0;
      local $r->{_help_verbose} = $verbose;
  
      # get function metadata first
      unless ($r->{_help_meta}) {
          my $url = $r->{subcommand_data}{url} // $self->url;
          my $res = $self->riap_client->request(info => $url);
          die [500, "Can't info '$url': $res->[0] - $res->[1]"]
              unless $res->[0] == 200;
          $r->{_help_info} = $res->[2];
          $res = $self->riap_client->request(meta => $url);
          die [500, "Can't meta '$url': $res->[0] - $res->[1]"]
              unless $res->[0] == 200;
          $r->{_help_meta} = $res->[2]; # cache here
      }
  
      # get cli opt spec
      unless ($r->{_help_clidocdata}) {
          require Perinci::Sub::To::CLIDocData;
          my $res = Perinci::Sub::To::CLIDocData::gen_cli_doc_data_from_meta(
              meta => $r->{_help_meta}, meta_is_normalized => 1,
              common_opts  => $self->common_opts,
              per_arg_json => $self->per_arg_json,
              per_arg_yaml => $self->per_arg_yaml,
          );
          die [500, "Can't gen_cli_doc_data_from_meta: $res->[0] - $res->[1]"]
              unless $res->[0] == 200;
          $r->{_help_clidocdata} = $res->[2]; # cache here
      }
  
      # ux: since --verbose will potentially show lots of paragraph text, let's
      # default to 80 and not wider width, unless user specifically requests
      # column width via COLUMNS.
      if ($verbose && !defined($ENV{COLUMNS}) && $self->term_width > 80) {
          $self->term_width(80);
      }
  
      # determine which help sections should we generate
      my @hsects;
      if ($verbose) {
          @hsects = (
              'summary',
              'usage',
              'subcommands',
              'examples',
              'description',
              'options',
              'result',
              'links',
              'hints',
          );
      } else {
          @hsects = (
              'summary',
              'usage',
              'subcommands',
              'examples',
              'options',
              'hints',
          );
      }
  
      for my $s (@hsects) {
          my $meth = "help_section_$s";
          #say "D:$meth";
          #$log->tracef("=> $meth()");
          $self->$meth($r);
      }
      $self->_help_draw_curtbl($r);
      [200, "OK", $r->{_help_buf}, {"cmdline.skip_format"=>1}];
  }
  
  1;
  # ABSTRACT: Help-related routines
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Perinci::CmdLine::Classic::Role::Help - Help-related routines
  
  =head1 VERSION
  
  This document describes version 1.813 of Perinci::CmdLine::Classic::Role::Help (from Perl distribution Perinci-CmdLine-Classic), released on 2019-04-15.
  
  =for Pod::Coverage ^(.+)$
  
  =head1 REQUEST KEYS
  
  =over
  
  =item * _help_*
  
  Temporary. Various data stored during help generation that is passed between the
  various C<_help_*> methods.
  
  =back
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Perinci-CmdLine-Classic>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Perinci-CmdLine-Classic>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Perinci-CmdLine-Classic>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012, 2011 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
PERINCI_CMDLINE_CLASSIC_ROLE_HELP

    $main::fatpacked{"Perinci/CmdLine/Help.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PERINCI_CMDLINE_HELP';
  package Perinci::CmdLine::Help;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-02-06'; # DATE
  our $DIST = 'Perinci-CmdLine-Help'; # DIST
  our $VERSION = '0.172'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  require Exporter;
  our @ISA = qw(Exporter);
  our @EXPORT_OK = qw(gen_help);
  
  our %SPEC;
  
  $SPEC{gen_help} = {
      v => 1.1,
      summary => 'Generate help message for Perinci::CmdLine-based app',
      args => {
          program_name => {
              schema => 'str*',
              req => 1,
          },
          program_summary => {
              schema => 'str*',
          },
          subcommands => {
              schema => 'hash',
          },
          meta => {
              summary => 'Function metadata',
              schema => 'hash*',
              req => 1,
          },
          meta_is_normalized => {
              schema => 'bool*',
          },
          common_opts => {
              schema => 'hash*',
              default => {},
          },
          per_arg_json => {
              schema => 'bool*',
          },
          per_arg_yaml => {
              schema => 'bool*',
          },
          ggls_res => {
              summary => 'Full result from gen_getopt_long_spec_from_meta()',
              schema  => 'array*', # XXX envres
              description => <<'_',
  
  If you already call <pm:Perinci::Sub::GetArgs::Argv>'s
  `gen_getopt_long_spec_from_meta()`, you can pass the _full_ enveloped result
  here, to avoid calculating twice.
  
  _
          },
      },
  };
  sub gen_help {
      no warnings 'once';
      require Text::Wrap;
  
      my %args = @_;
  
      local $Text::Wrap::columns = $ENV{COLUMNS} // 80;
  
      my $meta = $args{meta} or return [400, 'Please specify meta'];
      unless ($args{meta_is_normalized}) {
          require Perinci::Sub::Normalize;
          $meta = Perinci::Sub::Normalize::normalize_function_metadata($meta);
      }
      my $common_opts = $args{common_opts} // {};
  
      my @help;
  
      # summary
      my $progname = $args{program_name};
      {
          my $sum = $args{program_summary} // $meta->{summary};
          last unless $sum;
          push @help, $progname, " - ", $sum, "\n\n";
      }
  
      my $clidocdata;
  
      # usage
      push @help, "Usage:\n";
      {
          for (sort {
              ($common_opts->{$a}{order} // 99) <=>
                  ($common_opts->{$b}{order} // 99) ||
                      $a cmp $b
              } keys %$common_opts) {
              my $co = $common_opts->{$_};
              next unless $co->{usage};
              push @help, "  $progname $co->{usage}\n";
          }
  
          require Perinci::Sub::To::CLIDocData;
          my $res = Perinci::Sub::To::CLIDocData::gen_cli_doc_data_from_meta(
              meta => $meta, meta_is_normalized => 1,
              common_opts  => $common_opts,
              per_arg_json => $args{per_arg_json},
              per_arg_yaml => $args{per_arg_yaml},
              (ggls_res => $args{ggls_res}) x defined($args{ggls_res}),
          );
          die [500, "gen_cli_doc_data_from_meta failed: ".
                   "$res->[0] - $res->[1]"] unless $res->[0] == 200;
          $clidocdata = $res->[2];
          my $usage = $clidocdata->{usage_line};
          $usage =~ s/\[\[prog\]\]/$progname/;
          push @help, "  $usage\n";
      }
  
      # subcommands
      {
          my $subcommands = $args{subcommands} or last;
          push @help, "\nSubcommands:\n";
          if (keys(%$subcommands) >= 12) {
              # comma-separated list
              push @help, Text::Wrap::wrap(
                  "  ", "  ", join(", ", sort keys %$subcommands)), "\n";
          } else {
              for my $sc_name (sort keys %$subcommands) {
                  my $sc_spec = $subcommands->{$sc_name};
                  next unless $sc_spec->{show_in_help} //1;
                  push @help, "  $sc_name\n";
              }
          }
      }
  
      # example
      {
          # XXX categorize too, like options
          last unless @{ $clidocdata->{examples} };
          push @help, "\nExamples:\n";
          my $i = 0;
          my $egs = $clidocdata->{examples};
          for my $eg (@$egs) {
              $i++;
              my $cmdline = $eg->{cmdline};
              $cmdline =~ s/\[\[prog\]\]/$progname/;
              push @help, "\n" if $eg->{summary} && $i > 1;
              if ($eg->{summary}) {
                  push @help, "  $eg->{summary}:\n";
              } else {
                  push @help, "\n";
              }
              push @help, "  % $cmdline\n";
          }
      }
  
      # description
      {
          # XXX use proper alt. search
          my $desc = $args{program_description} //
              $meta->{'description.alt.env.cmdline'} // $meta->{description};
          last unless $desc;
          $desc =~ s/\A\n+//;
          $desc =~ s/\n+\z//;
          push @help, "\n", $desc, "\n" if $desc =~ /\S/;
      }
  
      # options
      {
          require Data::Dmp;
  
          my $opts = $clidocdata->{opts};
          last unless keys %$opts;
  
          # find all the categories
          my %options_by_cat; # val=[options...]
          for my $optkey (keys %$opts) {
              for my $cat (@{ $opts->{$optkey}{categories} }) {
                  push @{ $options_by_cat{$cat} }, $optkey;
              }
          }
  
          my $cats_spec = $clidocdata->{option_categories};
          for my $cat (sort {
              ($cats_spec->{$a}{order} // 50) <=> ($cats_spec->{$b}{order} // 50)
                  || $a cmp $b }
                           keys %options_by_cat) {
              # find the longest option
              my @opts = sort {length($b)<=>length($a)}
                  @{ $options_by_cat{$cat} };
              my $len = length($opts[0]);
              # sort again by name
              @opts = sort {
                  (my $a_without_dash = $a) =~ s/^-+//;
                  (my $b_without_dash = $b) =~ s/^-+//;
                  lc($a) cmp lc($b);
              } @opts;
              push @help, "\n$cat:\n";
              for my $opt (@opts) {
                  my $ospec = $opts->{$opt};
                  my $arg_spec = $ospec->{arg_spec};
                  next if grep {$_ eq 'hidden'} @{$arg_spec->{tags} // []};
                  my $is_bool = $arg_spec->{schema} &&
                      $arg_spec->{schema}[0] eq 'bool';
                  my $show_default = exists($ospec->{default}) &&
                      !$is_bool && !$ospec->{is_base64} &&
                          !$ospec->{is_json} && !$ospec->{is_yaml} &&
                              !$ospec->{is_alias};
  
                  my $add_sum = '';
                  if ($ospec->{is_base64}) {
                      $add_sum = " (as base64-encoded str)";
                  } elsif ($ospec->{is_json}) {
                      $add_sum = " (as JSON-encoded str)";
                  } elsif ($ospec->{is_yaml}) {
                      $add_sum = " (as YAML-encoded str)";
                  }
  
                  my $argv = '';
                  if (!$ospec->{main_opt} && defined($ospec->{pos})) {
                      if ($ospec->{slurpy} // $ospec->{greedy}) {
                          $argv = " (=arg[$ospec->{pos}-])";
                      } else {
                          $argv = " (=arg[$ospec->{pos}])";
                      }
                  }
  
                  my $cmdline_src = '';
                  if (!$ospec->{main_opt} && defined($arg_spec->{cmdline_src})) {
                      $cmdline_src = " (or from $arg_spec->{cmdline_src})";
                      $cmdline_src =~ s!_or_!/!g;
                  }
  
                  push @help, sprintf(
                      "  %-${len}s  %s%s%s%s%s\n",
                      $opt,
                      Text::Wrap::wrap("", " " x (2+$len+2 +2),
                                       $ospec->{summary}//''),
                      $add_sum,
                      $argv,
                      $cmdline_src,
                      ($show_default && defined($ospec->{default}) ?
                           " [".Data::Dmp::dmp($ospec->{default})."]":""),
  
                  );
              }
          }
      }
  
      [200, "OK", join("", @help)];
  }
  
  1;
  # ABSTRACT: Generate help message for Perinci::CmdLine-based app
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Perinci::CmdLine::Help - Generate help message for Perinci::CmdLine-based app
  
  =head1 VERSION
  
  This document describes version 0.172 of Perinci::CmdLine::Help (from Perl distribution Perinci-CmdLine-Help), released on 2020-02-06.
  
  =head1 DESCRIPTION
  
  Currently used by L<Perinci::CmdLine::Lite> and L<App::riap>. Eventually I want
  L<Perinci::CmdLine> to use this also (needs prettier and more sophisticated
  formatting options first though).
  
  =head1 FUNCTIONS
  
  
  =head2 gen_help
  
  Usage:
  
   gen_help(%args) -> [status, msg, payload, meta]
  
  Generate help message for Perinci::CmdLine-based app.
  
  This function is not exported by default, but exportable.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<common_opts> => I<hash> (default: {})
  
  =item * B<ggls_res> => I<array>
  
  Full result from gen_getopt_long_spec_from_meta().
  
  If you already call L<Perinci::Sub::GetArgs::Argv>'s
  C<gen_getopt_long_spec_from_meta()>, you can pass the I<full> enveloped result
  here, to avoid calculating twice.
  
  =item * B<meta>* => I<hash>
  
  Function metadata.
  
  =item * B<meta_is_normalized> => I<bool>
  
  =item * B<per_arg_json> => I<bool>
  
  =item * B<per_arg_yaml> => I<bool>
  
  =item * B<program_name>* => I<str>
  
  =item * B<program_summary> => I<str>
  
  =item * B<subcommands> => I<hash>
  
  
  =back
  
  Returns an enveloped result (an array).
  
  First element (status) is an integer containing HTTP status code
  (200 means OK, 4xx caller error, 5xx function error). Second element
  (msg) is a string containing error message, or 'OK' if status is
  200. Third element (payload) is optional, the actual result. Fourth
  element (meta) is called result metadata and is optional, a hash
  that contains extra information.
  
  Return value:  (any)
  
  =for Pod::Coverage ^()$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Perinci-CmdLine-Help>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Perinci-CmdLine-Help>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Perinci-CmdLine-Help>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2017, 2016, 2015, 2014 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
PERINCI_CMDLINE_HELP

    $main::fatpacked{"Perinci/CmdLine/Lite.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PERINCI_CMDLINE_LITE';
  package Perinci::CmdLine::Lite;
  
  our $DATE = '2020-01-31'; # DATE
  our $VERSION = '1.826'; # VERSION
  
  use 5.010001;
  # use strict; # already enabled by Mo
  # use warnings; # already enabled by Mo
  use Log::ger;
  
  use List::Util qw(first);
  use Mo qw(build default);
  #use Moo;
  extends 'Perinci::CmdLine::Base';
  
  # when debugging, use this instead of the above because Mo doesn't give clear
  # error message if base class has errors.
  #use parent 'Perinci::CmdLine::Base';
  
  has default_prompt_template => (
      is=>'rw',
      default => 'Enter %s: ',
  );
  has validate_args => (
      is=>'rw',
      default => 1,
  );
  
  my $formats = [qw/text text-simple text-pretty json json-pretty csv html html+datatables perl/];
  
  sub BUILD {
      my ($self, $args) = @_;
  
      if (!$self->{riap_client}) {
          require Perinci::Access::Lite;
          my %rcargs = (
              riap_version => $self->{riap_version} // 1.1,
              %{ $self->{riap_client_args} // {} },
          );
          $self->{riap_client} = Perinci::Access::Lite->new(%rcargs);
      }
  
      if (!$self->{actions}) {
          $self->{actions} = {
              call => {},
              version => {},
              subcommands => {},
              help => {},
          };
      }
  
      my $_copy = sub {
          no warnings;
          my $co_name = shift;
          my $href = $Perinci::CmdLine::Base::copts{$co_name};
          %$href;
      };
  
      if (!$self->{common_opts}) {
          my $copts = {};
  
          $copts->{version}   = { $_copy->('version'), };
          $copts->{help}      = { $_copy->('help'), };
  
          unless ($self->skip_format) {
              $copts->{format}    = {
                  $_copy->('format'),
                  schema => ['str*' => in => $formats],
              };
              $copts->{json}        = { $_copy->('json'), };
              $copts->{naked_res}   = { $_copy->('naked_res'), };
              $copts->{page_result} = { $_copy->('page_result'), };
          }
          if ($self->subcommands) {
              $copts->{subcommands} = { $_copy->('subcommands'), };
          }
          if ($self->default_subcommand) {
              $copts->{cmd} = { $_copy->('cmd') };
          }
          if ($self->read_config) {
              $copts->{config_path}    = { $_copy->('config_path') };
              $copts->{no_config}      = { $_copy->('no_config') };
              $copts->{config_profile} = { $_copy->('config_profile') };
          }
          if ($self->read_env) {
              $copts->{no_env} = { $_copy->('no_env') };
          }
          if ($self->log) {
              $copts->{log_level} = { $_copy->('log_level'), };
              $copts->{trace}     = { $_copy->('trace'), };
              $copts->{debug}     = { $_copy->('debug'), };
              $copts->{verbose}   = { $_copy->('verbose'), };
              $copts->{quiet}     = { $_copy->('quiet'), };
          }
          $self->{common_opts} = $copts;
      }
  
      $self->{formats} //= $formats;
  
      $self->{per_arg_json} //= 1;
  }
  
  my $setup_progress;
  sub _setup_progress_output {
      my $self = shift;
  
      return unless $ENV{PROGRESS} // (-t STDOUT);
  
      require Progress::Any::Output;
      Progress::Any::Output->set("TermProgressBarColor");
      $setup_progress = 1;
  }
  
  sub _unsetup_progress_output {
      my $self = shift;
  
      return unless $setup_progress;
      no warnings 'once';
      my $out = $Progress::Any::outputs{''}[0];
      $out->cleanup if $out->can("cleanup");
      $setup_progress = 0;
  }
  
  sub hook_after_parse_argv {
      my ($self, $r) = @_;
  
      # since unlike Perinci::CmdLine, we don't wrap the function (where the
      # wrapper assigns default values for arguments), we must do it here
      # ourselves.
      my $ass  = $r->{meta}{args} // {};
      my $args = $r->{args};
      for (keys %$ass) {
          next if exists $args->{$_};
          my $as = $ass->{$_};
          if (exists $as->{default}) {
              $args->{$_} = $as->{default};
          } elsif ($as->{schema} && exists $as->{schema}[1]{default}) {
              $args->{$_} = $as->{schema}[1]{default};
          }
      }
  }
  
  # BEGIN_BLOCK: equal2
  sub equal2 {
      state $require = do { require Scalar::Util };
  
      # for lack of a better name, currently i name this 'equal2'
      my ($val1, $val2) = @_;
  
      # here are the rules:
      # - if both are undef, 1
      # - undef equals nothing else
      # - if both are ref, equal if their refaddr() are equal
      # - if only one is ref, 0
      # - if none is ref, compare using eq
  
      if (defined $val1) {
          return 0 unless defined $val2;
          if (ref $val1) {
              return 0 unless ref $val2;
              return Scalar::Util::refaddr($val1) eq Scalar::Util::refaddr($val2);
          } else {
              return 0 if ref $val2;
              return $val1 eq $val2;
          }
      } else {
          return 0 if defined $val2;
          return 1;
      }
  }
  # END_BLOCK: equal2
  
  sub hook_before_parse_argv {
      my ($self, $r) = @_;
  
      # in this hook, we want to add several shortcut options (e.g. -C for
      # --no-config, etc) if the function is not using those shortcut options. but
      # to do this, we need to get meta first and this is only possible when there
      # is no subcommand
      return if $r->{subcommands};
      $self->get_meta($r, $self->{url});
  
      my $copts = $self->common_opts;
  
      # XXX cache
      require Perinci::Sub::GetArgs::Argv;
      my $ggls_res = Perinci::Sub::GetArgs::Argv::gen_getopt_long_spec_from_meta(
          meta               => $r->{meta},
          meta_is_normalized => 1,
          args               => $r->{args},
          common_opts        => $copts,
          per_arg_json       => $self->{per_arg_json},
          per_arg_yaml       => $self->{per_arg_yaml},
      );
  
      my $meta_uses_opt_P = 0;
      my $meta_uses_opt_c = 0;
      my $meta_uses_opt_C = 0;
      {
          last unless $ggls_res->[0] == 200;
          my $opts = $ggls_res->[3]{'func.opts'};
          if (grep { $_ eq '-P' } @$opts) { $meta_uses_opt_P = 1 }
          if (grep { $_ eq '-c' } @$opts) { $meta_uses_opt_c = 1 }
          if (grep { $_ eq '-C' } @$opts) { $meta_uses_opt_C = 1 }
      }
  
      #say "D:meta_uses_opt_P=<$meta_uses_opt_P>";
      #say "D:meta_uses_opt_c=<$meta_uses_opt_c>";
      #say "D:meta_uses_opt_C=<$meta_uses_opt_C>";
  
      # add -P shortcut for --config-profile if no conflict
      if ($copts->{config_profile} && !$meta_uses_opt_P) {
          $copts->{config_profile}{getopt} = 'config-profile|P=s';
      }
  
      # add -c shortcut for --config-path if no conflict
      if ($copts->{config_path} && !$meta_uses_opt_c) {
          $copts->{config_path}{getopt} = 'config-path|c=s';
      }
  
      # add -P shortcut for --no-config if no conflict
      if ($copts->{no_config} && !$meta_uses_opt_C) {
          $copts->{no_config}{getopt} = 'no-config|C';
      }
  }
  
  sub hook_before_action {
  
      my ($self, $r) = @_;
  
      # validate arguments using schema from metadata
    VALIDATE_ARGS:
      {
          no strict 'refs';
  
          last unless $self->validate_args;
  
          # unless we're feeding the arguments to function, don't bother
          # validating arguments
          last unless $r->{action} eq 'call';
  
          my $meta = $r->{meta};
  
          # function is probably already wrapped
          last if $meta->{'x.perinci.sub.wrapper.logs'} &&
              (grep { $_->{validate_args} }
               @{ $meta->{'x.perinci.sub.wrapper.logs'} });
  
          # function can validate its args, so we don't have to do validation for
          # it
          last if $meta->{features} && $meta->{features}{validate_vars};
  
          # to be cheap, we simply use "$ref" as key as cache key. to be proper,
          # it should be hash of serialized content.
          my %validators_by_arg; # key = argname
  
        USE_VALIDATORS_FROM_SCHEMA_V: {
              my $url = $r->{subcommand_data}{url};
              $url =~ m!\A/(.+)/(\w+)\z! or last;
              my $func = $2;
              (my $mod = $1) =~ s!/!::!g;
              my $schemav_mod = "Sah::SchemaV::$mod";
              (my $schemav_mod_pm = "$schemav_mod.pm") =~ s!::!/!g;
              eval { require $schemav_mod_pm };
              last if $@;
  
              #say "D:we have pre-compiled validator codes";
  
              for my $arg (sort keys %{ $meta->{args} // {} }) {
                  next unless exists($r->{args}{$arg});
  
                  # we don't support validation of input stream because this must
                  # be done after each 'get item' (but periswrap does)
                  next if $meta->{args}{$arg}{stream};
  
                  my $v = ${"$schemav_mod\::Args_Validators"}{$func}{$arg}
                      or next;
                  #say "D:using precompiled validator for arg $arg";
                  $validators_by_arg{$arg} = $v;
              }
          }
  
        GEN_VALIDATORS: {
              my %validators_by_schema; # key = "$schema"
              require Data::Sah;
              for my $arg (sort keys %{ $meta->{args} // {} }) {
                  next unless exists($r->{args}{$arg});
  
                  # we don't support validation of input stream because this must
                  # be done after each 'get item' (but periswrap does)
                  next if $meta->{args}{$arg}{stream};
  
                  my $schema = $meta->{args}{$arg}{schema};
                  next unless $schema;
  
                  unless ($validators_by_schema{"$schema"}) {
                      my $v = Data::Sah::gen_validator($schema, {
                          return_type => 'str+val',
                          schema_is_normalized => 1,
                      });
                      $validators_by_schema{"$schema"} = $v;
                      $validators_by_arg{$arg} = $v;
                  }
              }
          }
  
        DO_VALIDATE: {
              for my $arg (sort keys %{ $meta->{args} // {} }) {
                  my $v = $validators_by_arg{$arg} or next;
                  my $res = $v->($r->{args}{$arg});
                  if ($res->[0]) {
                      die [400, "Argument '$arg' fails validation: $res->[0]"];
                  }
                  my $val0 = $r->{args}{$arg};
                  my $coerced_val = $res->[1];
                  $r->{args}{$arg} = $coerced_val;
                  $r->{args}{"-orig_$arg"} = $val0
                      unless equal2($val0, $coerced_val);
              }
          } # DO_VALIDATE
  
        DO_VALIDATE_ARGS_RELS: {
              last unless $meta->{args_rels};
  
              # we haven't precompiled validator for args_rels yet
              require Data::Sah;
  
              my $schema = [hash => $meta->{args_rels}];
              my $sah = Data::Sah->new;
              my $hc  = $sah->get_compiler("human");
              my $cd  = $hc->init_cd;
              $cd->{args}{lang} //= $cd->{default_lang};
              my $v = Data::Sah::gen_validator($schema, {
                  return_type => 'str',
                  human_hash_values => {
                      field  => $hc->_xlt($cd, "argument"),
                      fields => $hc->_xlt($cd, "arguments"),
                  },
              });
              my $res = $v->($r->{args});
              if ($res) {
                  die [400, $res];
              }
          } # DO_VALIDATE_ARGS_RELS
  
      }
  }
  
  sub hook_format_result {
      require Perinci::Result::Format::Lite;
      my ($self, $r) = @_;
  
      my $fmt = $r->{format} // 'text';
  
      if ($fmt eq 'html+datatables') {
          $fmt = 'text-pretty';
          $ENV{VIEW_RESULT} //= 1;
          $ENV{FORMAT_PRETTY_TABLE_BACKEND} //= 'Text::Table::HTML::DataTables';
      }
  
      my $fres = Perinci::Result::Format::Lite::format(
          $r->{res}, $fmt, $r->{naked_res}, $self->{use_cleanser});
  
      # ux: prefix error message with program name
      if ($fmt =~ /text/ && $r->{res}[0] =~ /\A[45]/ && defined($r->{res}[1])) {
          $fres = $self->program_name . ": $fres";
      }
  
      $fres;
  }
  
  sub hook_format_row {
      my ($self, $r, $row) = @_;
  
      if (ref($row) eq 'ARRAY') {
          return join("\t", @$row) . "\n";
      } else {
          return ($row // "") . "\n";
      }
  }
  
  sub hook_display_result {
      my ($self, $r) = @_;
  
      my $res  = $r->{res};
      my $resmeta = $res->[3] // {};
  
      my $handle = $r->{output_handle};
  
      my $layer;
    SELECT_LAYER:
      {
          if ($resmeta->{'x.hint.result_binary'}) {
              # XXX only when format is text?
              $layer = ":bytes"; last;
          }
  
          if ($ENV{UTF8} ||
                  defined($r->{subcommand_data} && $r->{subcommand_data}{use_utf8}) ||
                  $self->use_utf8) {
              $layer = ":encoding(utf8)"; last;
          }
  
          if ($self->use_locale) {
              $layer = ":locale"; last;
          }
  
      }
      binmode($handle, $layer) if $layer;
  
      $self->display_result($r);
  }
  
  sub hook_after_run {
      my ($self, $r) = @_;
      $self->_unsetup_progress_output;
  }
  
  sub hook_after_get_meta {
      my ($self, $r) = @_;
  
      my $copts = $self->common_opts;
  
      # note: we cannot cache this to $r->{_ggls_res} because we produce this
      # without dry-run
      require Perinci::Sub::GetArgs::Argv;
      my $ggls_res = Perinci::Sub::GetArgs::Argv::gen_getopt_long_spec_from_meta(
          meta               => $r->{meta},
          meta_is_normalized => 1,
          args               => $r->{args},
          common_opts        => $copts,
          per_arg_json       => $self->{per_arg_json},
          per_arg_yaml       => $self->{per_arg_yaml},
      );
  
      my $meta_uses_opt_n = 0;
      {
          last unless $ggls_res->[0] == 200;
          my $opts = $ggls_res->[3]{'func.opts'};
          if (grep { $_ eq '-n' } @$opts) { $meta_uses_opt_n = 1 }
      }
  
      require Perinci::Object;
      my $metao = Perinci::Object::risub($r->{meta});
  
      # delete --format, --json, --naked-res if function does not want its output
      # to be formatted
      {
          last if $self->skip_format; # already doesn't have those copts
          last unless $r->{meta}{'cmdline.skip_format'};
          delete $copts->{format};
          delete $copts->{json};
          delete $copts->{naked_res};
      }
  
      # add --dry-run (and -n shortcut, if no conflict)
      {
          last unless $metao->can_dry_run;
          my $default_dry_run = $metao->default_dry_run // $self->default_dry_run;
          $r->{dry_run} = 1 if $default_dry_run;
          $r->{dry_run} = ($ENV{DRY_RUN} ? 1:0) if defined $ENV{DRY_RUN};
  
          my $optname = 'dry-run' . ($meta_uses_opt_n ? '' : '|n');
          $copts->{dry_run} = {
              getopt  => $default_dry_run ? "$optname!" : $optname,
              summary => "Run in simulation mode (also via DRY_RUN=1)",
              "summary.alt.bool.not" =>
                  "Disable simulation mode (also via DRY_RUN=0)",
              handler => sub {
                  my ($go, $val, $r) = @_;
                  if ($val) {
                      log_debug("[pericmd] Dry-run mode is activated");
                      $r->{dry_run} = 1;
                  } else {
                      log_debug("[pericmd] Dry-run mode is deactivated");
                      $r->{dry_run} = 0;
                  }
              },
              default => $default_dry_run,
          };
      }
  
      # check deps property. XXX this should be done only when we don't wrap
      # subroutine, because Perinci::Sub::Wrapper already checks the deps
      # property.
      if ($r->{meta}{deps} && !$r->{in_dump_object} && !$r->{in_completion}) {
          require Perinci::Sub::DepChecker;
          my $res = Perinci::Sub::DepChecker::check_deps($r->{meta}{deps});
          if ($res) {
              die [412, "Dependency failed: $res"];
          }
      }
  }
  
  sub action_subcommands {
      my ($self, $r) = @_;
  
      if (!$self->subcommands) {
          say "There are no subcommands.";
          return 0;
      }
  
      say "Available subcommands:";
      my $scs = $self->list_subcommands;
      my $longest = 6;
      for (keys %$scs) { my $l = length; $longest = $l if $l > $longest }
      [200, "OK",
       join("",
            (map { sprintf("  %-${longest}s  %s\n",$_,$scs->{$_}{summary}//"") }
                 sort keys %$scs),
        )];
  }
  
  sub action_version {
      no strict 'refs';
  
      my ($self, $r) = @_;
  
      my @text;
  
      {
          my $meta = $r->{meta} = $self->get_meta($r, $self->url);
          push @text, $self->get_program_and_subcommand_name($r),
              " version ", ($meta->{entity_v} // "?"),
              ($meta->{entity_date} ? " ($meta->{entity_date})" : ''),
              "\n";
          for my $mod (@{ $meta->{'x.dynamic_generator_modules'} // [] }) {
              push @text, "  $mod version ", ${"$mod\::VERSION"},
                  (${"$mod\::DATE"} ? " (".${"$mod\::DATE"}.")" : ""),
                      "\n";
          }
      }
  
      for my $url (@{ $self->extra_urls_for_version // [] }) {
          my $meta = $self->get_meta($r, $url);
          push @text, "  $url version ", ($meta->{entity_v} // "?"),
              ($meta->{entity_date} ? " ($meta->{entity_date})" : ''),
              "\n";
      }
  
      push @text, "  ", __PACKAGE__,
          " version ", ($Perinci::CmdLine::Lite::VERSION // "?"),
          ($Perinci::CmdLine::Lite::DATE ?
           " ($Perinci::CmdLine::Lite::DATE)":''),
          "\n";
  
      [200, "OK", join("", @text)];
  }
  
  sub action_help {
      require Perinci::CmdLine::Help;
  
      my ($self, $r) = @_;
  
      my @help;
      my $scn    = $r->{subcommand_name};
      my $scd    = $r->{subcommand_data};
  
      my $meta = $self->get_meta($r, $scd->{url} // $self->{url});
  
      # XXX use 'delete local' when we bump minimal perl to 5.12
      my $common_opts = { %{$self->common_opts} };
  
      # hide usage '--subcommands' if we have subcommands but user has specified a
      # subcommand to use
      my $has_sc_no_sc = $self->subcommands &&
          !length($r->{subcommand_name} // '');
      delete $common_opts->{subcommands} if $self->subcommands && !$has_sc_no_sc;
  
      my $res = Perinci::CmdLine::Help::gen_help(
          program_name => $self->get_program_and_subcommand_name($r),
          program_summary => ($scd ? $scd->{summary}:undef ) // $meta->{summary},
          program_description => $scd ? $scd->{description} : undef,
          meta => $meta,
          subcommands => $has_sc_no_sc ? $self->list_subcommands : undef,
          common_opts => $common_opts,
          per_arg_json => $self->per_arg_json,
          per_arg_yaml => $self->per_arg_yaml,
      );
  
      $res->[3]{"cmdline.skip_format"} = 1;
      $res;
  }
  
  sub action_call {
      my ($self, $r) = @_;
  
      my %extra;
      if ($r->{send_argv}) {
          log_trace("[pericmd] Sending argv to server: %s", $extra{argv});
          $extra{argv} = $r->{orig_argv};
      } else {
          my %extra_args;
          $extra_args{-dry_run} = 1 if $r->{dry_run};
          $extra{args} = {%extra_args, %{$r->{args}}};
      }
  
      $extra{stream_arg} = 1 if $r->{stream_arg};
  
      my $url = $r->{subcommand_data}{url};
  
      # currently we don't log args because it's potentially large
      log_trace("[pericmd] Riap request: action=call, url=%s", $url);
  
      #log_trace("TMP: extra=%s", \%extra);
  
      # setup output progress indicator
      if ($r->{meta}{features}{progress}) {
          $self->_setup_progress_output;
      }
  
      $self->riap_client->request(
          call => $url, \%extra);
  }
  
  1;
  # ABSTRACT: A Rinci/Riap-based command-line application framework
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Perinci::CmdLine::Lite - A Rinci/Riap-based command-line application framework
  
  =head1 VERSION
  
  This document describes version 1.826 of Perinci::CmdLine::Lite (from Perl distribution Perinci-CmdLine-Lite), released on 2020-01-31.
  
  =head1 SYNOPSIS
  
  In C<gen-random-num> script:
  
   use Perinci::CmdLine::Lite;
  
   our %SPEC;
  
   $SPEC{gen_random_num} = {
       v => 1.1,
       summary => 'Generate some random numbers',
       args => {
           count => {
               summary => 'How many numbers to generate',
               schema => ['int*' => min=>0],
               default => 1,
               cmdline_aliases=>{n=>{}},
               req => 1,
               pos => 0,
           },
           min => {
               summary => 'Lower limit of random number',
               schema => 'float*',
               default => 0,
           },
           max => {
               summary => 'Upper limit of random number',
               schema => 'float*',
               default => 1,
           },
       },
       result_naked => 1,
   };
   sub gen_random_num {
       my %args = @_;
  
       my @res;
       for (1..$args{count}) {
           push @res, $args{min} + rand()*($args{max}-$args{min});
       }
       \@res;
   }
  
   Perinci::CmdLine::Lite->new(url => '/main/gen_random_num')->run;
  
  Run your script:
  
   % ./gen-random-num
   0.999473691060306
  
   % ./gen-random-num --min 1 --max 10 5
   1.27390166158969
   1.69077475473679
   8.97748327778684
   5.86943773494068
   8.34341298182493
  
  JSON output support out of the box:
  
   % ./gen-random-num -n3 --json
   [200,"OK (envelope added by Perinci::Access::Lite)",[0.257073684902029,0.393782991540746,0.848740540017513],{}]
  
  Automatic help message:
  
   % ./gen-random-num -h
   gen-random-num - Generate some random numbers
  
   Usage:
     gen-random-num --help (or -h, -?)
     gen-random-num --version (or -v)
     gen-random-num [options] [count]
   Options:
     --config-path=s     Set path to configuration file
     --config-profile=s  Set configuration profile to use
     --count=i, -n       How many numbers to generate (=arg[0]) [1]
     --format=s          Choose output format, e.g. json, text [undef]
     --help, -h, -?      Display this help message
     --json              Set output format to json
     --max=f             Upper limit of random number [1]
     --min=f             Lower limit of random number [0]
     --naked-res         When outputing as JSON, strip result envelope [0]
     --no-config         Do not use any configuration file
     --version, -v
  
  Automatic configuration file support:
  
   % cat ~/gen-random-num.conf
   count=5
   max=0.01
  
   % ./gen-random-num
   0.00105268954838724
   0.00701443611501844
   0.0021247476506154
   0.00813872824513005
   0.00752832346491306
  
  Automatic tab completion support:
  
   % complete -C gen-random-num gen-random-num
   % gen-random-num --mi<tab>
  
  See L<Perinci::CmdLine::Manual> for details on other available features
  (subcommands, automatic formatting of data structures, automatic schema
  validation, dry-run mode, automatic POD generation, remote function support,
  automatic CLI generation, automatic --version, automatic HTTP API,
  undo/transactions, configurable output format, logging, progress bar,
  colors/Unicode, and more).
  
  =head1 DESCRIPTION
  
  Perinci::CmdLine is a command-line application framework. It allows you to
  create full-featured CLI applications easily and quickly.
  
  See L<Perinci::CmdLine::Manual> for more details.
  
  There is also a blog post series on Perinci::CmdLine tutorial:
  L<https://perlancar.wordpress.com/category/pericmd-tut/>
  
  Perinci::CmdLine::Lite is the default backend implementation. Another
  implementation is the heavier L<Perinci::CmdLine::Classic> which has a couple of
  more features not yet incorporated into ::Lite, e.g. transactions.
  
  You normally should use L<Perinci::CmdLine::Any> instead to be able to switch
  backend on the fly.
  
  =for Pod::Coverage ^(BUILD|get_meta|hook_.+|action_.+)$
  
  =head1 REQUEST KEYS
  
  All those supported by L<Perinci::CmdLine::Base>, plus:
  
  =over
  
  =back
  
  =head1 RESULT METADATA
  
  All those supported by L<Perinci::CmdLine::Base>, plus:
  
  =head2 x.hint.result_binary => bool
  
  If set to true, then when formatting to C<text> formats, this class won't print
  any newline to keep the data being printed unmodified.
  
  =head1 ATTRIBUTES
  
  All the attributes of L<Perinci::CmdLine::Base>, plus:
  
  =head2 validate_args => bool (default: 1)
  
  =head1 METHODS
  
  All the methods of L<Perinci::CmdLine::Base>, plus:
  
  =head1 ENVIRONMENT
  
  All the environment variables that L<Perinci::CmdLine::Base> supports, plus:
  
  =head2 DEBUG
  
  Set log level to 'debug'.
  
  =head2 VERBOSE
  
  Set log level to 'info'.
  
  =head2 QUIET
  
  Set log level to 'error'.
  
  =head2 TRACE
  
  Set log level to 'trace'.
  
  =head2 LOG_LEVEL
  
  Set log level.
  
  =head2 PROGRESS => bool
  
  Explicitly turn the progress bar on/off.
  
  =head2 FORMAT_PRETTY_TABLE_COLUMN_ORDERS => array (json)
  
  Set the default of C<table_column_orders> in C<format_options> in result
  metadata, similar to what's implemented in L<Perinci::Result::Format> and
  L<Data::Format::Pretty::Console>.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Perinci-CmdLine-Lite>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Perinci-CmdLine-Lite>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Perinci-CmdLine-Lite>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Perinci::CmdLine::Any>
  
  L<Perinci::CmdLine::Classic>
  
  L<Perinci::CmdLine::Inline>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
PERINCI_CMDLINE_LITE

    $main::fatpacked{"Perinci/CmdLine/Util/Config.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PERINCI_CMDLINE_UTIL_CONFIG';
  package Perinci::CmdLine::Util::Config;
  
  our $DATE = '2019-05-29'; # DATE
  our $VERSION = '1.722'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  use Log::ger;
  
  use Exporter qw(import);
  our @EXPORT_OK = (
      'get_default_config_dirs',
      'read_config',
      'get_args_from_config',
  );
  
  our %SPEC;
  
  # from PERLANCAR::File::HomeDir 0.03, with minor modification
  sub _get_my_home_dir {
      if ($^O eq 'MSWin32') {
          # File::HomeDir always uses exists($ENV{x}) first, does it want to avoid
          # accidentally creating env vars?
          return $ENV{HOME} if $ENV{HOME};
          return $ENV{USERPROFILE} if $ENV{USERPROFILE};
          return join($ENV{HOMEDRIVE}, "\\", $ENV{HOMEPATH})
              if $ENV{HOMEDRIVE} && $ENV{HOMEPATH};
      } else {
          return $ENV{HOME} if $ENV{HOME};
          my @pw;
          eval { @pw = getpwuid($>) };
          return $pw[7] if @pw;
      }
      die "Can't get home directory";
  }
  
  $SPEC{get_default_config_dirs} = {
      v => 1.1,
      args => {},
  };
  sub get_default_config_dirs {
      my @dirs;
      #local $PERLANCAR::File::HomeDir::DIE_ON_FAILURE = 1;
      my $home = _get_my_home_dir();
      if ($^O eq 'MSWin32') {
          push @dirs, $home;
      } else {
          push @dirs, "$home/.config", $home, "/etc";
      }
      \@dirs;
  }
  
  $SPEC{read_config} = {
      v => 1.1,
      args => {
          config_paths    => {},
          config_filename => {},
          config_dirs     => {},
          program_name    => {},
          # TODO: hook_file
          hook_section    => {},
          # TODO: hook_param?
      },
  };
  sub read_config {
      require Config::IOD::Reader;
  
      my %args = @_;
  
      my $config_dirs = $args{config_dirs} // get_default_config_dirs();
  
      my $paths;
  
      my @filenames;
      my %section_config_filename_map;
      if (my $names = $args{config_filename}) {
          for my $name (ref($names) eq 'ARRAY' ? @$names : ($names)) {
              if (ref($name) eq 'HASH') {
                  $section_config_filename_map{$name->{filename}} = $name->{section};
                  push @filenames, $name->{filename};
              } else {
                  $section_config_filename_map{$name} = 'GLOBAL';
                  push @filenames, $name;
              }
          }
      }
      unless (@filenames) {
          @filenames = (($args{program_name} // "prog") . ".conf");
      }
  
      if ($args{config_paths}) {
          $paths = $args{config_paths};
      } else {
          for my $dir (@$config_dirs) {
              for my $name (@filenames) {
                  my $path = "$dir/" . $name;
                  push @$paths, $path if -e $path;
              }
          }
      }
  
      my $reader = Config::IOD::Reader->new;
      my %res;
      my @read;
      my %section_read_order;
    FILE:
      for my $i (0..$#{$paths}) {
          my $path           = $paths->[$i];
          my $filename = $path; $filename =~ s!.*[/\\]!!;
          my $wanted_section = $section_config_filename_map{$filename};
          log_trace "[pericmd] Reading config file '%s' ...", $path;
          my $j = 0;
          $section_read_order{GLOBAL} = [$i, $j++];
          my @file_sections = ("GLOBAL");
          my $hoh = $reader->read_file(
              $path,
              sub {
                  my %args = @_;
                  return unless $args{event} eq 'section';
                  my $section = $args{section};
                  push @file_sections, $section
                      unless grep {$section eq $_} @file_sections;
                  $section_read_order{$section} = [$i, $j++];
              },
          );
          push @read, $path;
        SECTION:
          for my $section (@file_sections) {
              my $hash = $hoh->{$section};
  
              my $s = $section; $s =~ s/\s*\S*=.*\z//; # strip key=value pairs
              $s = 'GLOBAL' if $s eq '';
  
              if ($args{hook_section}) {
                  my $res = $args{hook_section}->($section, $hash);
                  if ($res->[0] == 204) {
                      log_trace "[pericmd] Skipped config section '$section' ".
                          "in file '$path': hook_section returns 204";
                      next SECTION;
                  } elsif ($res->[0] >= 400 && $res->[0] <= 599) {
                      return [$res->[0], "Error when reading config file '$path'".
                                  ": $res->[1]"];
                  }
              }
  
              next unless !defined($wanted_section) || $s eq $wanted_section;
  
              for (keys %$hash) {
                  $res{$section}{$_} = $hash->{$_};
              }
          }
      }
      [200, "OK", \%res, {
          'func.read_files' => \@read,
          'func.section_read_order' => \%section_read_order,
      }];
  }
  
  $SPEC{get_args_from_config} = {
      v => 1.1,
      args => {
          r => {},
          config => {},
          args => {},
          subcommand_name => {},
          config_profile => {},
          common_opts => {},
          meta => {},
          meta_is_normalized => {},
      },
  };
  sub get_args_from_config {
      my %fargs = @_;
  
      my $r       = $fargs{r};
      my $conf    = $fargs{config};
      my $progn   = $fargs{program_name};
      my $scn     = $fargs{subcommand_name} // '';
      my $profile = $fargs{config_profile};
      my $args    = $fargs{args} // {};
      my $copts   = $fargs{common_opts};
      my $meta    = $fargs{meta};
      my $found;
  
      unless ($fargs{meta_is_normalized}) {
          require Perinci::Sub::Normalize;
          $meta = Perinci::Sub::Normalize::normalize_function_metadata($meta);
      }
  
      my $csro = $r->{_config_section_read_order} // {};
      my @sections = sort {
          # sort according to the order the section is seen in the file
          my $csro_a = $csro->{$a} // [0,0];
          my $csro_b = $csro->{$b} // [0,0];
          $csro_a->[0] <=> $csro_b->[0] ||
              $csro_a->[1] <=> $csro_b->[1] ||
              $a cmp $b
          } keys %$conf;
  
      my %seen_profiles; # for debugging message
      for my $section0 (@sections) {
          my %keyvals;
          my $sect_name;
          for my $word (split /\s+/, $section0) {
              if ($word =~ /(.*?)=(.*)/) {
                  $keyvals{$1} = $2;
              } else {
                  $sect_name //= $word;
              }
          }
          $seen_profiles{$keyvals{profile}}++ if defined $keyvals{profile};
  
          my $sect_scn     = $keyvals{subcommand} // '';
          my $sect_profile = $keyvals{profile};
  
          # if there is a subcommand name, use section with no subcommand=... or
          # the matching subcommand
          if (length $scn) {
              if (length($sect_scn) && $sect_scn ne $scn) {
                  log_trace(
                      "[pericmd] Skipped config section '%s' (%s)",
                      $section0, "subcommand does not match '$scn'",
                  );
                  next;
              }
          } else {
              if (length $sect_scn) {
                  log_trace(
                      "[pericmd] Skipped config section '%s' (%s)",
                      $section0, "only for a certain subcommand",
                  );
                  next;
              }
          }
  
          # if user chooses a profile, only use section with no profile=... or the
          # matching profile
          if (defined $profile) {
              if (defined($sect_profile) && $sect_profile ne $profile) {
                  log_trace(
                      "[pericmd] Skipped config section '%s' (%s)",
                      $section0, "profile does not match '$profile'",
                  );
                  next;
              }
              $found = 1 if defined($sect_profile) && $sect_profile eq $profile;
          } else {
              if (defined($sect_profile)) {
                  log_trace(
                      "[pericmd] Skipped config section '%s' (%s)",
                      $section0, "only for a certain profile",
                  );
                  next;
              }
          }
  
          # only use section marked with program=... if the program name matches
          if (defined($progn) && defined($keyvals{program})) {
              if ($progn ne $keyvals{program}) {
                  log_trace(
                      "[pericmd] Skipped config section '%s' (%s)",
                      $section0, "program does not match '$progn'",
                  );
                  next;
              }
          }
  
          # if user specifies env=... then apply filtering by ENV variable
          if (defined(my $env = $keyvals{env})) {
              my ($var, $val);
              if (($var, $val) = $env =~ /\A(\w+)=(.*)\z/) {
                  if (($ENV{$var} // '') ne $val) {
                      log_trace(
                          "[pericmd] Skipped config section '%s' (%s)",
                          $section0, "env $var has non-matching value '".
                              ($ENV{$var} // '')."'",
                      );
                      next;
                  }
              } elsif (($var, $val) = $env =~ /\A(\w+)!=(.*)\z/) {
                  if (($ENV{$var} // '') eq $val) {
                      log_trace(
                          "[pericmd] Skipped config section '%s' (%s)",
                          $section0, "env $var has that value",
                      );
                      next;
                  }
              } elsif (($var, $val) = $env =~ /\A(\w+)\*=(.*)\z/) {
                  if (index(($ENV{$var} // ''), $val) < 0) {
                      log_trace(
                          "[pericmd] Skipped config section '%s' (%s)",
                          $section0, "env $var has value '".
                              ($ENV{$var} // '')."' which does not contain the ".
                                  "requested string"
                      );
                      next;
                  }
              } else {
                  if (!$ENV{$env}) {
                      log_trace(
                          "[pericmd] Skipped config section '%s' (%s)",
                          $section0, "env $env is not set/true",
                      );
                      next;
                  }
              }
          }
  
          log_trace("[pericmd] Reading config section '%s'", $section0);
  
          my $as = $meta->{args} // {};
          for my $k (keys %{ $conf->{$section0} }) {
              my $v = $conf->{$section0}{$k};
              if ($copts->{$k} && $copts->{$k}{is_settable_via_config}) {
                  my $sch = $copts->{$k}{schema};
                  if ($sch) {
                      require Data::Sah::Normalize;
                      $sch = Data::Sah::Normalize::normalize_schema($sch);
                      # since IOD might return a scalar or an array (depending on
                      # whether there is a single param=val or multiple param=
                      # lines), we need to arrayify the value if the argument is
                      # expected to be an array.
                      if (ref($v) ne 'ARRAY' && $sch->[0] eq 'array') {
                          $v = [$v];
                      }
                  }
                  $copts->{$k}{handler}->(undef, $v, $r);
              } else {
                  # when common option clashes with function argument name, user
                  # can use NAME.arg to refer to function argument.
                  $k =~ s/\.arg\z//;
  
                  # since IOD might return a scalar or an array (depending on
                  # whether there is a single param=val or multiple param= lines),
                  # we need to arrayify the value if the argument is expected to
                  # be an array.
                  if (ref($v) ne 'ARRAY' && $as->{$k} && $as->{$k}{schema} &&
                          $as->{$k}{schema}[0] eq 'array') {
                      $v = [$v];
                  }
                  $args->{$k} = $v;
              }
          }
      }
      log_trace("[pericmd] Seen config profiles: %s",
                [sort keys %seen_profiles]);
  
      [200, "OK", $args, {'func.found'=>$found}];
  }
  
  1;
  # ABSTRACT: Utility routines related to config files
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Perinci::CmdLine::Util::Config - Utility routines related to config files
  
  =head1 VERSION
  
  This document describes version 1.722 of Perinci::CmdLine::Util::Config (from Perl distribution Perinci-CmdLine-Util-Config), released on 2019-05-29.
  
  =head1 FUNCTIONS
  
  
  =head2 get_args_from_config
  
  Usage:
  
   get_args_from_config(%args) -> [status, msg, payload, meta]
  
  This function is not exported by default, but exportable.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<args> => I<any>
  
  =item * B<common_opts> => I<any>
  
  =item * B<config> => I<any>
  
  =item * B<config_profile> => I<any>
  
  =item * B<meta> => I<any>
  
  =item * B<meta_is_normalized> => I<any>
  
  =item * B<r> => I<any>
  
  =item * B<subcommand_name> => I<any>
  
  =back
  
  Returns an enveloped result (an array).
  
  First element (status) is an integer containing HTTP status code
  (200 means OK, 4xx caller error, 5xx function error). Second element
  (msg) is a string containing error message, or 'OK' if status is
  200. Third element (payload) is optional, the actual result. Fourth
  element (meta) is called result metadata and is optional, a hash
  that contains extra information.
  
  Return value:  (any)
  
  
  =head2 get_default_config_dirs
  
  Usage:
  
   get_default_config_dirs() -> [status, msg, payload, meta]
  
  This function is not exported by default, but exportable.
  
  No arguments.
  
  Returns an enveloped result (an array).
  
  First element (status) is an integer containing HTTP status code
  (200 means OK, 4xx caller error, 5xx function error). Second element
  (msg) is a string containing error message, or 'OK' if status is
  200. Third element (payload) is optional, the actual result. Fourth
  element (meta) is called result metadata and is optional, a hash
  that contains extra information.
  
  Return value:  (any)
  
  
  =head2 read_config
  
  Usage:
  
   read_config(%args) -> [status, msg, payload, meta]
  
  This function is not exported by default, but exportable.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<config_dirs> => I<any>
  
  =item * B<config_filename> => I<any>
  
  =item * B<config_paths> => I<any>
  
  =item * B<hook_section> => I<any>
  
  =item * B<program_name> => I<any>
  
  =back
  
  Returns an enveloped result (an array).
  
  First element (status) is an integer containing HTTP status code
  (200 means OK, 4xx caller error, 5xx function error). Second element
  (msg) is a string containing error message, or 'OK' if status is
  200. Third element (payload) is optional, the actual result. Fourth
  element (meta) is called result metadata and is optional, a hash
  that contains extra information.
  
  Return value:  (any)
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Perinci-CmdLine-Util-Config>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Perinci-CmdLine-Util-Config>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Perinci-CmdLine-Util-Config>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2019, 2018, 2017 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
PERINCI_CMDLINE_UTIL_CONFIG

    $main::fatpacked{"Perinci/Object.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PERINCI_OBJECT';
  ## no critic: (Modules::ProhibitAutomaticExportation)
  
  package Perinci::Object;
  
  our $DATE = '2018-10-18'; # DATE
  our $VERSION = '0.310'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  require Exporter;
  our @ISA    = qw(Exporter);
  our @EXPORT = qw(rimeta risub rivar ripkg envres envresmulti envrestable
                   riresmeta);
  
  sub rimeta {
      require Perinci::Object::Metadata;
      Perinci::Object::Metadata->new(@_);
  }
  
  sub risub {
      require Perinci::Object::Function;
      Perinci::Object::Function->new(@_);
  }
  
  sub rivar {
      require Perinci::Object::Variable;
      Perinci::Object::Variable->new(@_);
  }
  
  sub ripkg {
      require Perinci::Object::Package;
      Perinci::Object::Package->new(@_);
  }
  
  sub envres {
      require Perinci::Object::EnvResult;
      Perinci::Object::EnvResult->new(@_);
  }
  
  sub envresmulti {
      require Perinci::Object::EnvResultMulti;
      Perinci::Object::EnvResultMulti->new(@_);
  }
  
  sub envrestable {
      require Perinci::Object::EnvResultTable;
      Perinci::Object::EnvResultTable->new(@_);
  }
  
  sub riresmeta {
      require Perinci::Object::ResMeta;
      Perinci::Object::ResMeta->new(@_);
  }
  
  1;
  # ABSTRACT: Object-oriented interface for Rinci metadata
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Perinci::Object - Object-oriented interface for Rinci metadata
  
  =head1 VERSION
  
  This document describes version 0.310 of Perinci::Object (from Perl distribution Perinci-Object), released on 2018-10-18.
  
  =head1 SYNOPSIS
  
   use Perinci::Object; # automatically exports risub(), rivar(), ripkg(),
                        # envres(), envresmulti(), envrestable(), riresmeta()
   use Data::Dump; # for dd()
  
   # OO interface to function metadata.
  
   my $risub = risub {
       v => 1.1,
       summary => 'Calculate foo and bar',
       "summary.alt.lang.id_ID" => 'Menghitung foo dan bar',
       args => { a1 => { schema => 'int*' }, a2 => { schema => 'str' } },
       features => { pure=>1 },
   };
   dd $risub->type,                                 # "function"
      $risub->v,                                    # 1.1
      $risub->arg('a1'),                            # { schema=>'int*' }
      $risub->arg('a3'),                            # undef
      $risub->feature('pure'),                      # 1
      $risub->feature('foo'),                       # undef
      $risub->langprop('summary'),                  # 'Calculate foo and bar'
      $risub->langprop({lang=>'id_ID'}, 'summary'), # 'Menghitung foo dan bar'
  
   # setting arg and property
   $risub->arg('a3', 'array');  # will actually fail for 1.0 metadata
   $risub->feature('foo', 2);   # ditto
  
   # OO interface to variable metadata
  
   my $rivar = rivar { ... };
  
   # OO interface to package metadata
  
   my $ripkg = ripkg { ... };
  
   # OO interface to enveloped result
  
   my $envres = envres [200, "OK", [1, 2, 3]];
   dd $envres->is_success, # 1
      $envres->status,     # 200
      $envres->message,    # "OK"
      $envres->result,     # [1, 2, 3]
      $envres->meta;       # undef
  
   # setting status, message, result, extra
   $envres->status(404);
   $envres->message('Not found');
   $envres->result(undef);
   $envres->meta({errno=>-100});
  
   # OO interface to function/method result metadata
   my $riresmeta = riresmeta { ... };
  
   # an example of using envresmulti()
   sub myfunc {
       ...
  
       my $envres = envresmulti();
  
       # add result for each item
       $envres->add_result(200, "OK", {item_id=>1});
       $envres->add_result(202, "OK", {item_id=>2, note=>"blah"});
       $envres->add_result(404, "Not found", {item_id=>3});
       ...
  
       # finally, return the result
       return $envres->as_struct;
   }
  
   # an example of using envrestable()
   sub myfunc {
       ...
       my $envres = envrestable();
       $envres->add_field('foo');
       $envres->add_field('bar');
       ...
       return $envres->as_struct;
   }
  
  =head1 DESCRIPTION
  
  L<Rinci> works using pure data structures, but sometimes it's convenient to have
  an object-oriented interface (wrapper) for those data. This module provides just
  that.
  
  =head1 FUNCTIONS
  
  =head2 rimeta $meta => OBJECT
  
  Exported by default. A shortcut for Perinci::Object::Metadata->new($meta).
  
  =head2 risub $meta => OBJECT
  
  Exported by default. A shortcut for Perinci::Object::Function->new($meta).
  
  =head2 rivar $meta => OBJECT
  
  Exported by default. A shortcut for Perinci::Object::Variable->new($meta).
  
  =head2 ripkg $meta => OBJECT
  
  Exported by default. A shortcut for Perinci::Object::Package->new($meta).
  
  =head2 envres $res => OBJECT
  
  Exported by default. A shortcut for Perinci::Object::EnvResult->new($res).
  
  =head2 envresmulti $res => OBJECT
  
  Exported by default. A shortcut for Perinci::Object::EnvResultMulti->new($res).
  
  =head2 envrestable $res => OBJECT
  
  Exported by default. A shortcut for Perinci::Object::EnvResultTable->new($res).
  
  =head2 riresmeta $resmeta => OBJECT
  
  Exported by default. A shortcut for Perinci::Object::ResMeta->new($res).
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Perinci-Object>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Perinci-Object>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Perinci-Object>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Rinci>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2018, 2017, 2016, 2015, 2014, 2013, 2012, 2011 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
PERINCI_OBJECT

    $main::fatpacked{"Perinci/Object/EnvResult.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PERINCI_OBJECT_ENVRESULT';
  package Perinci::Object::EnvResult;
  
  our $DATE = '2018-10-18'; # DATE
  our $VERSION = '0.310'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  
  sub new {
      my ($class, $res) = @_;
      $res //= [0, "", undef];
      my $obj = \$res;
      bless $obj, $class;
  }
  
  sub new_ok {
      my $class = shift;
      my $res = [200, "OK"];
      if (@_) {
          push @$res, $_[0];
      }
      $class->new($res);
  }
  
  sub status {
      my ($self, $new) = @_;
      if (defined $new) {
          die "Status must be an integer between 100 and 555" unless
              int($new) eq $new && $new >= 100 && $new <= 555;
          my $old = ${$self}->[0];
          ${$self}->[0] = $new;
          return $old;
      }
      ${$self}->[0];
  }
  
  sub message {
      my ($self, $new) = @_;
      if (defined $new) {
          die "Extra must be a string" if ref($new);
          my $old = ${$self}->[1];
          ${$self}->[1] = $new;
          return $old;
      }
      ${$self}->[1];
  }
  
  # avoid 'result' as this is ambiguous (the enveloped one? the naked one?). even
  # avoid 'enveloped' (the payload being enveloped? the enveloped result
  # (envelope+result inside)?)
  
  sub payload {
      my ($self, $new) = @_;
      if (defined $new) {
          my $old = ${$self}->[2];
          ${$self}->[2] = $new;
          return $old;
      }
      ${$self}->[2];
  }
  
  sub meta {
      my ($self, $new) = @_;
      if (defined $new) {
          die "Extra must be a hashref" unless ref($new) eq 'HASH';
          my $old = ${$self}->[3];
          ${$self}->[3] = $new;
          return $old;
      }
      ${$self}->[3];
  }
  
  sub is_success {
      my ($self) = @_;
      my $status = ${$self}->[0];
      $status >= 200 && $status <= 299;
  }
  
  sub as_struct {
      my ($self) = @_;
      ${$self};
  }
  
  1;
  # ABSTRACT: Represent enveloped result
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Perinci::Object::EnvResult - Represent enveloped result
  
  =head1 VERSION
  
  This document describes version 0.310 of Perinci::Object::EnvResult (from Perl distribution Perinci-Object), released on 2018-10-18.
  
  =head1 SYNOPSIS
  
   use Perinci::Object::EnvResult;
   use Data::Dump; # for dd()
  
   my $envres = Perinci::Object::EnvResult->new([200, "OK", [1, 2, 3]]);
   dd $envres->is_success, # 1
      $envres->status,     # 200
      $envres->message,    # "OK"
      $envres->payload,    # [1, 2, 3]
      $envres->meta,       # undef
      $envres->as_struct;  # [200, "OK", [1, 2, 3]]
  
   # setting status, message, result, extra
   $envres->status(404);
   $envres->message('Not found');
   $envres->payload(undef);
   $envres->meta({errno=>-100});
  
   # shortcut: create a new OK result ([200, "OK"] or [200, "OK", $payload])
   $envres = Perinci::Object::EnvResult->new_ok();
   $envres = Perinci::Object::EnvResult->new_ok(42);
  
  =head1 DESCRIPTION
  
  This class provides an object-oriented interface for enveloped result (see
  L<Rinci::function> for more details).
  
  =head1 METHODS
  
  =head2 new($res) => OBJECT
  
  Create a new object from $res enveloped result array.
  
  =head2 new_ok([ $actual_res ]) => OBJECT
  
  Shortcut for C<< new([200,"OK",$actual_res]) >>, or just C<< new([200,"OK"]) >>
  if C<$actual_res> is not specified.
  
  =head2 $envres->status
  
  Get or set status (the 1st element).
  
  =head2 $envres->message
  
  Get or set message (the 2nd element).
  
  =head2 $envres->payload
  
  Get or set the actual payload (the 3rd element).
  
  =head2 $envres->meta
  
  Get or set result metadata (the 4th element).
  
  =head2 $envres->as_struct
  
  Return the represented data structure.
  
  =head2 $envres->is_success
  
  True if status is between 200-299.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Perinci-Object>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Perinci-Object>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Perinci-Object>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Perinci::Object>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2018, 2017, 2016, 2015, 2014, 2013, 2012, 2011 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
PERINCI_OBJECT_ENVRESULT

    $main::fatpacked{"Perinci/Object/EnvResultMulti.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PERINCI_OBJECT_ENVRESULTMULTI';
  package Perinci::Object::EnvResultMulti;
  
  our $DATE = '2018-10-18'; # DATE
  our $VERSION = '0.310'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  
  use parent qw(Perinci::Object::EnvResult);
  
  sub new {
      my ($class, $res) = @_;
      $res //= [200, "Success/no items"];
      my $obj = \$res;
      bless $obj, $class;
  }
  
  sub add_result {
      my ($self, $status, $message, $extra) = @_;
      my $num_ok  = 0;
      my $num_nok = 0;
  
      push @{ ${$self}->[3]{results} },
          {status=>$status, message=>$message, %{ $extra // {} }};
      for (@{ ${$self}->[3]{results} // [] }) {
          if ($_->{status} =~ /\A(2|304)/) {
              $num_ok++;
          } else {
              $num_nok++;
          }
      }
      if ($num_ok) {
          if ($num_nok) {
              ${$self}->[0] = 207;
              ${$self}->[1] = "Partial success";
          } else {
              my $overall_status = 200;
              my %statuses;
              for (@{ ${$self}->[3]{results} // []}) {
                  $statuses{ $_->{status} }++;
              }
              if (keys %statuses == 1) {
                  my @tmp = keys %statuses;
                  $overall_status = $tmp[0];
              }
              ${$self}->[0] = $overall_status;
              ${$self}->[1] = "All success";
          }
      } else {
          ${$self}->[0] = $status;
          ${$self}->[1] = $message;
      }
  }
  
  1;
  # ABSTRACT: Represent enveloped result (multistatus)
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Perinci::Object::EnvResultMulti - Represent enveloped result (multistatus)
  
  =head1 VERSION
  
  This document describes version 0.310 of Perinci::Object::EnvResultMulti (from Perl distribution Perinci-Object), released on 2018-10-18.
  
  =head1 SYNOPSIS
  
   use Perinci::Object::EnvResultMulti;
   use Data::Dump; # for dd()
  
   sub myfunc {
       ...
  
       # if unspecified, the default status will be [200, "Success/no items"]
       my $envres = Perinci::Object::EnvResultMulti->new;
  
       # then you can add result for each item
       $envres->add_result(200, "OK", {item_id=>1});
       $envres->add_result(202, "OK", {item_id=>2, note=>"blah"});
       $envres->add_result(404, "Not found", {item_id=>3});
       ...
  
       # if you add a success status, the overall status will still be 200
  
       # if you add a non-success staus, the overall status will be 207, or
       # the non-success status (if no success has been added)
  
       # finally, return the result
       return $envres->as_struct;
  
       # the result from the above will be: [207, "Partial success", undef,
       # {results => [
       #     {success=>200, message=>"OK", item_id=>1},
       #     {success=>201, message=>"OK", item_id=>2, note=>"blah"},
       #     {success=>404, message=>"Not found", item_id=>3},
       # ]}]
   } # myfunc
  
  =head1 DESCRIPTION
  
  This class is a subclass of L<Perinci::Object::EnvResult> and provides a
  convenience method when you want to use multistatus/detailed per-item results
  (specified in L<Rinci> 1.1.63: C<results> result metadata property). In this
  case, response status can be 200, 207, or non-success. As you add more per-item
  results, this class will set/update the overall response status for you.
  
  =head1 METHODS
  
  =head2 new($res) => OBJECT
  
  Create a new object from C<$res> enveloped result array. If C<$res> is not
  specified, the default is C<< [200, "Success/no items"] >>.
  
  =head2 $envres->add_result($status, $message, \%extra)
  
  Add an item result.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Perinci-Object>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Perinci-Object>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Perinci-Object>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Perinci::Object>
  
  L<Perinci::Object::EnvResult>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2018, 2017, 2016, 2015, 2014, 2013, 2012, 2011 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
PERINCI_OBJECT_ENVRESULTMULTI

    $main::fatpacked{"Perinci/Object/EnvResultTable.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PERINCI_OBJECT_ENVRESULTTABLE';
  package Perinci::Object::EnvResultTable;
  
  our $DATE = '2018-10-18'; # DATE
  our $VERSION = '0.310'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  
  use parent qw(Perinci::Object::EnvResult);
  
  sub add_field {
      my ($self, $name, %attrs) = @_;
      ${$self}->[3]{'table.fields'} //= [];
      push @{ ${$self}->[3]{'table.fields'} }, $name;
  }
  
  1;
  # ABSTRACT: Represent enveloped result (table)
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Perinci::Object::EnvResultTable - Represent enveloped result (table)
  
  =head1 VERSION
  
  This document describes version 0.310 of Perinci::Object::EnvResultTable (from Perl distribution Perinci-Object), released on 2018-10-18.
  
  =head1 SYNOPSIS
  
   use Perinci::Object::EnvResultTable;
  
   sub myfunc {
       ...
  
       my $envres = Perinci::Object::EnvResultTable->new;
  
       # add fields
       $envres->add_field('foo');
       $envres->add_field('foo');
  
       # finally, return the result
       return $envres->as_struct;
   }
  
  =head1 DESCRIPTION
  
  This class is a subclass of L<Perinci::Object::EnvResult> and provides
  convenience methods when you want to return table data.
  
  =head1 METHODS
  
  =head2 new($res) => OBJECT
  
  Create a new object from C<$res> enveloped result array.
  
  =head2 $envres->add_field($name, %attrs)
  
  Add a table field. This will create/push an entry to the C<table.fields> result
  metadata array.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Perinci-Object>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Perinci-Object>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Perinci-Object>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Perinci::Object>
  
  L<Perinci::Object::EnvResult>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2018, 2017, 2016, 2015, 2014, 2013, 2012, 2011 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
PERINCI_OBJECT_ENVRESULTTABLE

    $main::fatpacked{"Perinci/Object/Function.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PERINCI_OBJECT_FUNCTION';
  package Perinci::Object::Function;
  
  our $DATE = '2018-10-18'; # DATE
  our $VERSION = '0.310'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  
  use parent qw(Perinci::Object::Metadata);
  
  sub type { "function" }
  
  # convenience for accessing features property
  sub feature {
      my $self = shift;
      my $name = shift;
      if (@_) {
          die "1.0 can't set feature" if $self->v eq 1.0;
          my $value = shift;
          ${$self}->{features} //= {};
          my $old = ${$self}->{features}{$name};
          ${$self}->{features}{$name} = $value;
          return $old;
      } else {
          ${$self}->{features}{$name};
      }
  }
  
  sub features {
      my $self = shift;
      ${$self}->{features} // {};
  }
  
  # transaction can be used to emulate dry run, by calling with -tx_action =>
  # 'check_state' only
  sub can_dry_run {
      my $self = shift;
      my $ff = ${$self}->{features} // {};
      $ff->{dry_run} // $ff->{tx} && $ff->{tx}{v} == 2;
  }
  
  sub default_dry_run {
      my $self = shift;
      my $ff = ${$self}->{features} // {};
      ref($ff->{dry_run}) eq 'HASH' && $ff->{dry_run}{default};
  }
  
  # convenience for accessing args property
  sub arg {
      my $self = shift;
      my $name = shift;
      if (@_) {
          die "1.0 can't set arg" if $self->v eq 1.0;
          my $value = shift;
          ${$self}->{args} //= {};
          my $old = ${$self}->{args}{$name};
          ${$self}->{args}{$name} = $value;
          return $old;
      } else {
          ${$self}->{args}{$name};
      }
  }
  
  1;
  # ABSTRACT: Represent function metadata
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Perinci::Object::Function - Represent function metadata
  
  =head1 VERSION
  
  This document describes version 0.310 of Perinci::Object::Function (from Perl distribution Perinci-Object), released on 2018-10-18.
  
  =head1 SYNOPSIS
  
   use Perinci::Object;
  
   $SPEC{foo} = {
       v        => 1.1,
       args     => { b => {schema=>'int', req=>0} },
       features => {idempotent=>1},
   };
   my $risub = risub $SPEC{foo};
   print $risub->feature('idempotent'), # 1
         $risub->arg('b')->{req},       # 0
         $risub->arg('a');              # undef
  
  =head1 DESCRIPTION
  
  This class provides an object-oriented interface for function metadata.
  
  =head1 METHODS
  
  =head2 new($meta) => OBJECT
  
  Create a new object from $meta. If $meta is undef, creates an empty metadata.
  
  =head2 $risub->type => str
  
  Will return C<function>.
  
  =head2 $risub->features => HASH
  
  Return the C<features> property.
  
  =head2 $risub->feature(NAME[, VALUE])
  
  Get or set named feature (B<features> property in metadata). If a feature
  doesn't exist, undef will be returned.
  
  =head2 $risub->can_dry_run => BOOL
  
  Check whether function can do dry run, either from the C<dry_run> feature, or
  from the C<tx> feature. (Transaction can be used to emulate dry run, by calling
  the function with C<< -tx_action => 'check_state' >> only.)
  
  =head2 $risub->default_dry_run => BOOL
  
  Starting from Rinci 1.1.83, the C<dry_run> feature property can be a hash
  instead of a bool, and can contain this pair C<< default=>1 >> to specify that
  dry-run mode should be the default operation (e.g. for safety).
  
  =head2 $risub->arg(NAME[, VALUE])
  
  Get or set argument (B<args> property in metadata). If an argument doesn't
  exist, undef will be returned.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Perinci-Object>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Perinci-Object>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Perinci-Object>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Perinci::Object>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2018, 2017, 2016, 2015, 2014, 2013, 2012, 2011 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
PERINCI_OBJECT_FUNCTION

    $main::fatpacked{"Perinci/Object/Metadata.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PERINCI_OBJECT_METADATA';
  package Perinci::Object::Metadata;
  
  our $DATE = '2018-10-18'; # DATE
  our $VERSION = '0.310'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  
  # BEGIN COPY-PASTE FROM String::Trim::More
  sub __trim_blank_lines {
      local $_ = shift;
      return $_ unless defined;
      s/\A(?:\n\s*)+//;
      s/(?:\n\s*){2,}\z/\n/;
      $_;
  }
  # END COPY-PASTE
  
  sub new {
      my ($class, $meta) = @_;
      $meta //= {};
      my $obj = \$meta;
      bless $obj, $class;
  }
  
  sub v {
      my $self = shift;
      ${$self}->{v} // 1.0;
  }
  
  sub type {
      die "BUG: type() must be subclassed";
  }
  
  sub as_struct {
      my $self = shift;
      ${$self};
  }
  
  sub langprop {
      my $self = shift;
      my $opts;
      if (ref($_[0]) eq 'HASH') {
          $opts = shift;
      } else {
          $opts = {};
      }
      my $prop = shift;
  
      my $deflang = ${$self}->{default_lang} // "en_US";
      my $olang   = $opts->{lang} || $ENV{LANGUAGE} || $ENV{LANG} || $deflang;
      $olang =~ s/\W.+//; # change "en_US.UTF-8" to "en_US"
      $olang = "en_US" if $olang eq 'C';
      (my $olang2 = $olang) =~ s/\A([a-z]{2})_[A-Z]{2}\z/$1/; # change "en_US" to "en"
      my $mark    = $opts->{mark_different_lang} // 1;
      #print "deflang=$deflang, olang=$olang, mark_different_lang=$mark\n";
  
      my @k;
      if ($olang eq $deflang) {
          @k = ([$olang, $prop, 0]);
      } else {
          @k = (
              [$olang, "$prop.alt.lang.$olang", 0],
              ([$olang2, "$prop.alt.lang.$olang2", 0]) x !!($olang2 ne $olang),
              [$deflang, $prop, $mark],
          );
      }
  
      my $v;
    GET:
      for my $k (@k) {
          #print "k=".join(", ", @$k)."\n";
          $v = ${$self}->{$k->[1]};
          if (defined $v) {
              if ($k->[2]) {
                  my $has_nl = $v =~ s/\n\z//;
                  $v = "{$olang|$k->[0] $v}" . ($has_nl ? "\n" : "");
              }
              $v = __trim_blank_lines($v);
              last GET;
          }
      }
  
      if (@_) {
          # set value
          ${$self}->{$k[0][1]} = $_[0];
      }
  
      $v;
  }
  
  sub name {
      my $self = shift;
      my $opts;
      if (@_ && ref($_[0]) eq 'HASH') {
          $opts = shift;
      } else {
          $opts = {};
      }
      $self->langprop($opts, "name", @_);
  }
  
  sub caption {
      my $self = shift;
      my $opts;
      if (@_ && ref($_[0]) eq 'HASH') {
          $opts = shift;
      } else {
          $opts = {};
      }
      $self->langprop($opts, "caption", @_);
  }
  
  sub summary {
      my $self = shift;
      my $opts;
      if (@_ && ref($_[0]) eq 'HASH') {
          $opts = shift;
      } else {
          $opts = {};
      }
      $self->langprop($opts, "summary", @_);
  }
  
  sub description {
      my $self = shift;
      my $opts;
      if (@_ && ref($_[0]) eq 'HASH') {
          $opts = shift;
      } else {
          $opts = {};
      }
      $self->langprop($opts, "description", @_);
  }
  
  1;
  # ABSTRACT: Base class for Perinci::Object metadata classes
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Perinci::Object::Metadata - Base class for Perinci::Object metadata classes
  
  =head1 VERSION
  
  This document describes version 0.310 of Perinci::Object::Metadata (from Perl distribution Perinci-Object), released on 2018-10-18.
  
  =head1 METHODS
  
  =head2 new => obj
  
  Constructor.
  
  =head2 v => float
  
  Get version.
  
  =head2 as_struct => hash
  
  Get underlying data structure.
  
  =head2 type => str
  
  Return type (e.g. C<function>, C<package>).
  
  =head2 langprop([ \%opts, ]$prop[, $new_value])
  
  Get or set property value in the specified language (i.e., either in C<prop> or
  C<prop.alt.lang.XXX> properties).
  
  Known options:
  
  =over 4
  
  =item * lang => STR
  
  Defaults to metadata's C<default_lang> (which in turns default to C<en_US> if
  unspecified).
  
  =item * mark_different_lang => BOOL (defaults to 1)
  
  If set to true, text with different language than the language requested will be
  marked, e.g. C<"I love you"> requested in Indonesian language where the value
  for that language is unavailable will result in C<"{en_US I love you}"> being
  returned.
  
  =back
  
  =head2 name([ $new_value ]) => $value
  
  Get or set C<name> property. Will call C<langprop()>.
  
  =head2 summary([ $new_value ]) => $value
  
  Get or set C<summary> property. Will call C<langprop()>.
  
  =head2 description([ $new_value ]) => $value
  
  Get or set C<description> property. Will call C<langprop()>.
  
  =head2 caption([ $new_value ]) => $value
  
  Get or set C<caption> property. Will call C<langprop()>.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Perinci-Object>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Perinci-Object>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Perinci-Object>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2018, 2017, 2016, 2015, 2014, 2013, 2012, 2011 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
PERINCI_OBJECT_METADATA

    $main::fatpacked{"Perinci/Object/Package.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PERINCI_OBJECT_PACKAGE';
  package Perinci::Object::Package;
  
  our $DATE = '2018-10-18'; # DATE
  our $VERSION = '0.310'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  
  use parent qw(Perinci::Object::Metadata);
  
  sub type { "package" }
  
  1;
  # ABSTRACT: Represent package metadata
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Perinci::Object::Package - Represent package metadata
  
  =head1 VERSION
  
  This document describes version 0.310 of Perinci::Object::Package (from Perl distribution Perinci-Object), released on 2018-10-18.
  
  =head1 METHODS
  
  =head2 $ripkg->type => str
  
  Will return C<package>.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Perinci-Object>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Perinci-Object>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Perinci-Object>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2018, 2017, 2016, 2015, 2014, 2013, 2012, 2011 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
PERINCI_OBJECT_PACKAGE

    $main::fatpacked{"Perinci/Object/ResMeta.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PERINCI_OBJECT_RESMETA';
  package Perinci::Object::ResMeta;
  
  our $DATE = '2018-10-18'; # DATE
  our $VERSION = '0.310'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  
  use parent qw(Perinci::Object::Metadata);
  
  sub type { "resmeta" }
  
  1;
  # ABSTRACT: Represent function/method result metadata
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Perinci::Object::ResMeta - Represent function/method result metadata
  
  =head1 VERSION
  
  This document describes version 0.310 of Perinci::Object::ResMeta (from Perl distribution Perinci-Object), released on 2018-10-18.
  
  =head1 METHODS
  
  =head2 $riresmeta->type => str
  
  Will return C<resmeta>.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Perinci-Object>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Perinci-Object>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Perinci-Object>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2018, 2017, 2016, 2015, 2014, 2013, 2012, 2011 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
PERINCI_OBJECT_RESMETA

    $main::fatpacked{"Perinci/Object/Variable.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PERINCI_OBJECT_VARIABLE';
  package Perinci::Object::Variable;
  
  our $DATE = '2018-10-18'; # DATE
  our $VERSION = '0.310'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  
  use parent qw(Perinci::Object::Metadata);
  
  sub type { "variable" }
  
  1;
  # ABSTRACT: Represent variable metadata
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Perinci::Object::Variable - Represent variable metadata
  
  =head1 VERSION
  
  This document describes version 0.310 of Perinci::Object::Variable (from Perl distribution Perinci-Object), released on 2018-10-18.
  
  =head1 METHODS
  
  =head2 $rivar->type => str
  
  Will return C<variable>.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Perinci-Object>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Perinci-Object>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Perinci-Object>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2018, 2017, 2016, 2015, 2014, 2013, 2012, 2011 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
PERINCI_OBJECT_VARIABLE

    $main::fatpacked{"Perinci/Result/Format.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PERINCI_RESULT_FORMAT';
  package Perinci::Result::Format;
  
  our $DATE = '2015-11-29'; # DATE
  our $VERSION = '0.45'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  our $Enable_Decoration = 1;
  our $Enable_Cleansing  = 0;
  
  # text formats are special. since they are more oriented towards human instead
  # of machine, we remove envelope when status is 2xx, so users only see content.
  
  # XXX color theme?
  
  my $format_text = sub {
      my ($format, $res) = @_;
  
      my $stack_trace_printed;
  
      my $print_err = sub {
          require Color::ANSI::Util;
          require Term::Detect::Software;
  
          my $use_color = $ENV{COLOR} // 1;
          my $terminfo = Term::Detect::Software::detect_terminal_cached();
          $use_color = 0 if !$terminfo->{color_depth};
          my $colorize = sub {
              my ($color, $str) = @_;
              if ($use_color) {
                  if (ref($color) eq 'ARRAY') {
                      (defined($color->[0]) ?
                           Color::ANSI::Util::ansifg($color->[0]):"").
                                 (defined($color->[1]) ?
                                      Color::ANSI::Util::ansibg($color->[1]):"").
                                            $str . "\e[0m";
                  } else {
                      Color::ANSI::Util::ansifg($color) . $str . "\e[0m";
                  }
              } else {
                  $str;
              }
          };
  
          my $res = shift;
          my $out = $colorize->("cc0000", "ERROR $res->[0]") .
              ($res->[1] ? ": $res->[1]" : "");
          $out =~ s/\n+\z//;
          my $clog; $clog = $res->[3]{logs}[0]
              if $res->[3] && $res->[3]{logs};
          if ($clog->{file} && $clog->{line}) {
              $out .= " (at ".$colorize->('3399cc', $clog->{file}).
                  " line ".$colorize->('3399cc', $clog->{line}).")";
          }
          $out .= "\n";
          if ($clog->{stack_trace} && $INC{"Carp/Always.pm"} &&
                  !$stack_trace_printed) {
              require Data::Dump::OneLine;
              my $i;
              for my $c (@{ $clog->{stack_trace} }) {
                  next unless $i++; # skip first entry
                  my $args;
                  if (!$c->[4]) {
                      $args = "()";
                  } elsif (!ref($c->[4])) {
                      $args = "(...)";
                  } else {
                      # periutil 0.37+ stores call arguments in [4]
  
                      # XXX a flag to let user choose which
  
                      # dump version
                      #$args = Data::Dump::OneLine::dump1(@{ $c->[4] });
                      #$args = "($args)" if @{$c->[4]} < 2;
  
                      # stringify version
                      $args = Data::Dump::OneLine::dump1(
                          map {defined($_) ? "$_":$_} @{ $c->[4] });
                      $args = "($args)" if @{$c->[4]} == 1;
                  }
                  $out .= "    $c->[3]${args} called at $c->[1] line $c->[2]\n";
              }
              $stack_trace_printed++;
          }
          $out;
      };
  
      if (!defined($res->[2])) {
          my $out = $res->[0] =~ /\A(?:2..|304)\z/ ? "" : $print_err->($res);
          my $max = 30;
          my $i = 0;
          my $prev = $res;
          while (1) {
              if ($i > $max) {
                  $out .= "  Previous error list too deep, stopping here\n";
                  last;
              }
              last unless $prev = $prev->[3]{prev};
              last unless ref($prev) eq 'ARRAY';
              $out .= "  " . $print_err->($prev);
              $i++;
          }
          return $out;
      }
      my ($r, $opts);
      if ($res->[0] =~ /\A2../) {
          $r = $res->[2];
          my $rfo = $res->[3]{format_options} // {};
          my $tff = $res->[3]{'table.fields'};
          if ($rfo->{$format}) {
              $opts = $rfo->{$format};
          } elsif ($rfo->{any}) {
              $opts = $rfo->{any};
          } elsif ($tff) {
              $opts = {table_column_orders=>[$tff]};
          }
      } else {
          $r = $res;
      }
      $opts //= {};
      if ($format eq 'text') {
          return Data::Format::Pretty::format_pretty(
              $r, {%$opts, module=>'Console'});
      }
      if ($format eq 'text-simple') {
          return Data::Format::Pretty::format_pretty(
              $r, {%$opts, module=>'SimpleText'});
      }
      if ($format eq 'text-pretty') {
          return Data::Format::Pretty::format_pretty(
              $r, {%$opts, module=>'Text'});
      }
  };
  
  our %Formats = (
      # YAML::Tiny::Color currently does not support circular refs
      yaml          => ['YAML', 'text/yaml', {circular=>0}],
      json          => ['CompactJSON', 'application/json', {circular=>0}],
      'json-pretty' => ['JSON', 'application/json', {circular=>0}],
      text          => [$format_text, 'text/plain', {circular=>0}],
      'text-simple' => [$format_text, 'text/plain', {circular=>0}],
      'text-pretty' => [$format_text, 'text/plain', {circular=>0}],
      'perl'        => ['Perl', 'text/x-perl', {circular=>1}],
      #'php'         => ['PHP', 'application/x-httpd-php', {circular=>0}],
      'phpserialization' => ['PHPSerialization', 'application/vnd.php.serialized', {circular=>0}],
      'ruby'        => ['Ruby', 'application/x-ruby', {circular=>1}],
  );
  
  sub format {
      require Data::Format::Pretty;
  
      my ($res, $format, $is_naked) = @_;
  
      my $fmtinfo = $Formats{$format} or return undef;
      my $formatter = $fmtinfo->[0];
  
      state $cleanser;
      if ($Enable_Cleansing && !$fmtinfo->[2]{circular}) {
          # currently we only have one type of cleansing, oriented towards JSON
          if (!$cleanser) {
              require Data::Clean::JSON;
              $cleanser = Data::Clean::JSON->get_cleanser;
          }
          $res = $cleanser->clone_and_clean($res);
      }
  
      my $deco = $Enable_Decoration;
  
      if (ref($formatter) eq 'CODE') {
          return $formatter->($format, $res);
      } else {
          my %o;
          $o{color} = 0 if !$deco && $format =~ /json|yaml|perl/;
          my $data = $is_naked ? $res->[2] : $res;
          return Data::Format::Pretty::format_pretty(
              $data, {%o, module=>$formatter});
      }
  }
  
  1;
  # ABSTRACT: Format envelope result
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Perinci::Result::Format - Format envelope result
  
  =head1 VERSION
  
  This document describes version 0.45 of Perinci::Result::Format (from Perl distribution Perinci-Result-Format), released on 2015-11-29.
  
  =head1 SYNOPSIS
  
  =head1 DESCRIPTION
  
  This module formats enveloped result to YAML, JSON, etc. It uses
  L<Data::Format::Pretty> for the backend. It is used by other Perinci modules
  like L<Perinci::CmdLine> and L<Perinci::Access::HTTP::Server>.
  
  The default supported formats are:
  
  =over 4
  
  =item * json
  
  Using Data::Format::Pretty::CompactJSON.
  
  =item * json-pretty
  
  Using Data::Format::Pretty::JSON.
  
  =item * text-simple
  
  Using Data::Format::Pretty::SimpleText.
  
  =item * text-pretty
  
  Using Data::Format::Pretty::Text.
  
  =item * text
  
  Using Data::Format::Pretty::Console.
  
  =item * yaml
  
  Using Data::Format::Pretty::YAML.
  
  =item * perl
  
  Using Data::Format::Pretty::Perl.
  
  =item * phpserialization
  
  Using Data::Format::Pretty::PHPSerialization.
  
  =item * ruby
  
  Using Data::Format::Pretty::Ruby.
  
  =back
  
  =for Pod::Coverage .*
  
  =head1 VARIABLES
  
  =head1 %Perinci::Result::Format::Formats => HASH
  
  Contains a mapping between format names and Data::Format::Pretty::* module
  names + MIME type.
  
  =head1 $Enable_Decoration => BOOL (default: 1)
  
  Decorations include color or other markup, which might make a data structure
  like JSON or YAML string become invalid JSON/YAML. This should be turned off if
  one wants to send the formatting over network.
  
  =head1 $Enable_Cleansing => BOOL (default: 0)
  
  If enabled, cleansing will be done to data to help make sure that data does not
  contain item that cannot be handled by formatter. for example, JSON format
  cannot handle circular references or complex types other than hash/array.
  
  =head1 FUNCTIONS
  
  None is currently exported/exportable.
  
  =head1 format($res, $format[ , $is_naked=0 ]) => STR
  
  Format enveloped result C<$res> with format named C<$format>.
  
  Result metadata (C<< $res->[3] >>) is also checked for key named
  C<format_options>. The value should be a hash like this C<< { FORMAT_NAME =>
  OPTS, ... } >>. FORMAT_NAME can be C<any> to mean any format. This way, function
  results can specify the details of formatting. An example enveloped result:
  
   [200, "OK", ["foo", "bar", "baz"], {
       format_options => {
           "text"        => {list_max_columns=>1},
           "text-pretty" => {list_max_columns=>1},
       }
   }]
  
  The above result specifies that if it is displayed using C<text> or
  C<text-pretty> format, it should be displayed in one columns instead of
  multicolumns.
  
  =head1 RESULT METADATA
  
  =over
  
  =item * property: format_options => HASH
  
  =back
  
  =head1 FAQ
  
  =head2 How to list supported formats?
  
  Simply:
  
   my @supported_formats = keys %Perinci::Result::Format::Formats;
  
  =head2 How to add support for new formats?
  
  First make sure that Data::Format::Pretty::<FORMAT> module is available for your
  format. Look on CPAN. If it's not, i't also not hard to create one.
  
  Then, add your format to %Perinci::Result::Format::Formats hash:
  
   use Perinci::Result::Format;
  
   # this means format named 'xml' will be handled by Data::Format::Pretty::XML
   $Perinci::Result::Format::Formats{xml} = ['XML', 'text/xml'];
  
  =head1 SEE ALSO
  
  L<Data::Format::Pretty>
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Perinci-Result-Format>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/sharyanto/perl-Perinci-Result-Format>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Perinci-Result-Format>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2015 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
PERINCI_RESULT_FORMAT

    $main::fatpacked{"Perinci/Result/Format/Lite.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PERINCI_RESULT_FORMAT_LITE';
  package Perinci::Result::Format::Lite;
  
  our $DATE = '2018-07-04'; # DATE
  our $VERSION = '0.274'; # VERSION
  
  use 5.010001;
  #IFUNBUILT
  # use strict;
  # use warnings;
  #END IFUNBUILT
  
  use List::Util qw(first max);
  
  use Exporter qw(import);
  our @EXPORT_OK = qw(format);
  
  # copy-pasted from List::MoreUtils::PP
  sub firstidx (&@) {
      my $f = shift;
      foreach my $i ( 0 .. $#_ )
          {
              local *_ = \$_[$i];
              return $i if $f->();
          }
      return -1;
  }
  
  sub _json {
      state $json = do {
          if    (eval { require Cpanel::JSON::XS; 1 })   { Cpanel::JSON::XS->new->canonical(1)->convert_blessed->allow_nonref }
          elsif (eval { require JSON::Tiny::Subclassable; 1 }) { JSON::Tiny::Subclassable->new }
          elsif (eval { require JSON::PP; 1 })   { JSON::PP->new->canonical(1)->convert_blessed->allow_nonref }
          else { die "Can't find any JSON module" }
      };
      $json;
  };
  
  sub __cleanse {
      state $cleanser = do {
          eval { require Data::Clean::JSON; 1 };
          if ($@) {
              undef;
          } else {
              Data::Clean::JSON->get_cleanser;
          }
      };
      if ($cleanser) {
          $cleanser->clean_in_place($_[0]);
      } else {
          $_[0];
      }
  }
  
  sub __gen_table {
      my ($data, $header_row, $resmeta, $format) = @_;
  
      $resmeta //= {};
  
      # column names
      my @columns;
      if ($header_row) {
          @columns = @{$data->[0]};
      } else {
          @columns = map {"col$_"} 0..@{$data->[0]}-1;
      }
  
      my $column_orders; # e.g. [col2, col1, col3, ...]
    SET_COLUMN_ORDERS: {
  
          # find column orders from 'table_column_orders' in result metadata (or
          # from env)
          my $tcos;
          if ($ENV{FORMAT_PRETTY_TABLE_COLUMN_ORDERS}) {
              $tcos = _json->encode($ENV{FORMAT_PRETTY_TABLE_COLUMN_ORDERS});
          } elsif (my $rfos = ($resmeta->{'cmdline.format_options'} //
                                   $resmeta->{format_options})) {
              my $rfo = $rfos->{'text-pretty'} // $rfos->{text} // $rfos->{any};
              if ($rfo) {
                  $tcos = $rfo->{table_column_orders};
              }
          }
          if ($tcos) {
              # find an entry in tcos that @columns contains all the columns of
            COLS:
              for my $cols (@$tcos) {
                  for my $col (@$cols) {
                      next COLS unless first {$_ eq $col} @columns;
                  }
                  $column_orders = $cols;
                  last SET_COLUMN_ORDERS;
              }
          }
  
          if ($resmeta->{'table.field_orders'}) {
              $column_orders = $resmeta->{'table.field_orders'};
              last SET_COLUMN_ORDERS;
          }
  
          # find column orders from table spec
          $column_orders = $resmeta->{'table.fields'};
      }
  
      # reorder each row according to requested column order
      if ($column_orders) {
          require Sort::BySpec;
          my $cmp = Sort::BySpec::cmp_by_spec(spec => $column_orders);
          # 0->2, 1->0, ... (map column position from unordered to ordered)
          my @map0 = sort { $cmp->($a->[1], $b->[1]) }
              map {[$_, $columns[$_]]} 0..$#columns;
          #use DD; dd \@map0;
          my @map;
          for (0..$#map0) {
              $map[$_] = $map0[$_][0];
          }
          #use DD; dd \@map;
          my $newdata = [];
          for my $row (@$data) {
              my @newrow;
              for (0..$#map) { $newrow[$_] = $row->[$map[$_]] }
              push @$newdata, \@newrow;
          }
          $data = $newdata;
          my @newcolumns;
          for (@map) { push @newcolumns, $columns[$_] }
          @columns = @newcolumns;
      }
  
      my @field_idxs; # map column to index in table.fields
      {
          my $tff = $resmeta->{'table.fields'} or last;
          for my $i (0..$#columns) {
              $field_idxs[$i] = firstidx { $_ eq $columns[$i] } @$tff;
          }
      }
  
      # determine field labels
      {
          last unless $header_row && @$data;
          my $tff = $resmeta->{'table.fields'} or last;
          my $tfl = $resmeta->{'table.field_labels'};
          my $tfu = $resmeta->{'table.field_units'};
          for my $i (0..$#columns) {
              my $field_idx = $field_idxs[$i];
              next unless $field_idx >= 0;
              if ($tfl && defined $tfl->[$field_idx]) {
                  $data->[0][$i] = $tfl->[$field_idx];
              } elsif ($tfu && defined $tfu->[$field_idx]) {
                  # add field units as label suffix to header (" (UNIT)")
                  $data->[0][$i] .= " ($tfu->[$field_idx])";
              }
          }
      }
  
    FORMAT_CELLS:
      {
          my $tffmt         = $resmeta->{'table.field_formats'};
          my $tffmt_code    = $resmeta->{'table.field_format_code'};
          my $tffmt_default = $resmeta->{'table.default_field_format'};
          last unless $tffmt || $tffmt_code || $tffmt_default;
  
          my (@fmt_names, @fmt_opts); # key: column index
          for my $i (0..$#columns) {
              my $field_idx = $field_idxs[$i];
              my $fmt = $tffmt_code ? $tffmt_code->($columns[$i]) : undef;
              $fmt //= $tffmt->[$field_idx] if $field_idx >= 0;
              $fmt //= $tffmt_default;
              if (ref $fmt eq 'ARRAY') {
                  $fmt_names[$i] = $fmt->[0];
                  $fmt_opts [$i] = $fmt->[1] // {};
              } else {
                  $fmt_names[$i] = $fmt;
                  $fmt_opts [$i] = {};
              }
          }
  
          my $nf;
  
          for my $i (0..$#{$data}) {
              next if $i==0 && $header_row;
              my $row = $data->[$i];
              for my $j (0..$#columns) {
                  next unless defined $row->[$j];
                  my $fmt_name = $fmt_names[$j];
                  #say "D:j=$j fmt_name=$fmt_name";
                  next unless $fmt_name;
                  my $fmt_opts = $fmt_opts [$j];
                  if ($fmt_name eq 'iso8601_datetime' || $fmt_name eq 'iso8601_date') {
                      if ($row->[$j] =~ /\A[0-9]+(\.[0-9]*)?\z/) {
                          my $frac = $1 ? "0$1"+0 : 0;
                          my @t = gmtime($row->[$j]);
                          if ($fmt_name eq 'iso8601_datetime') {
                              $row->[$j] = sprintf(
                                  "%04d-%02d-%02dT%02d:%02d:".($frac ? "%06.3f" : "%02d")."Z",
                                  $t[5]+1900, $t[4]+1, $t[3], $t[2], $t[1], $t[0]+$frac);
                          } else {
                              $row->[$j] = sprintf(
                                  "%04d-%02d-%02d",
                                  $t[5]+1900, $t[4]+1, $t[3]);
                          }
                      }
                  } elsif ($fmt_name eq 'boolstr') {
                      $row->[$j] = $row->[$j] ? "yes" : "no";
                  } elsif ($fmt_name eq 'sci2dec') {
                      if ($row->[$j] =~ /\A(?:[+-]?)(?:\d+\.|\d*\.(\d+))[eE]([+-]?\d+)\z/) {
                          my $n = length($1 || "") - $2; $n = 0 if $n < 0;
                          $row->[$j] = sprintf("%.${n}f", $row->[$j]);
                      }
                  } elsif ($fmt_name eq 'percent') {
                      my $fmt = $fmt_opts->{sprintf} // '%.2f%%';
                      $row->[$j] = sprintf($fmt, $row->[$j] * 100);
                  } elsif ($fmt_name eq 'number') {
                      require Number::Format::BigFloat;
                      $row->[$j] = Number::Format::BigFloat::format_number(
                          $row->[$j], {
                              thousands_sep  => $fmt_opts->{thousands_sep} // ',',
                              decimal_point  => $fmt_opts->{decimal_point} // '.',
                              decimal_digits => $fmt_opts->{precision} // 0,
                              # XXX decimal_fill
                          });
                  }
              }
          }
      }
  
      if ($format eq 'text-pretty') {
        ALIGN_COLUMNS:
          {
              # XXX we just want to turn off 'uninitialized' and 'negative repeat
              # count does nothing' from the operator x
              no warnings;
  
              my $tfa         = $resmeta->{'table.field_aligns'};
              my $tfa_code    = $resmeta->{'table.field_align_code'};
              my $tfa_default = $resmeta->{'table.default_field_align'};
              last unless $tfa || $tfa_code || $tfa_default;
              last unless @$data;
  
              for my $colidx (0..$#columns) {
                  my $field_idx = $field_idxs[$colidx];
                  my $align = $tfa_code ? $tfa_code->($columns[$colidx]) : undef;
                  $align //= $tfa->[$field_idx] if $field_idx >= 0;
                  $align //= $tfa_default;
                  next unless $align;
  
                  # determine max widths
                  my $maxw;
                  my ($maxw_bd, $maxw_d, $maxw_ad); # before digit, digit, after d
                  if ($align eq 'number') {
                      my (@w_bd, @w_d, @w_ad);
                      for my $i (0..$#{$data}) {
                          my $row = $data->[$i];
                          if (@$row > $colidx) {
                              my $cell = $row->[$colidx];
                              if ($header_row && $i == 0) {
                                  my $w = length($cell);
                                  push @w_bd, 0;
                                  push @w_bd, 0;
                                  push @w_ad, 0;
                              } elsif ($cell =~ /\A([+-]?\d+)(\.?)(\d*)\z/) {
                                  # decimal notation number
                                  push @w_bd, length($1);
                                  push @w_d , length($2);
                                  push @w_ad, length($3);
                              } elsif ($cell =~ /\A([+-]?\d+\.?\d*)([eE])([+-]?\d+)\z/) {
                                  # scientific notation number
                                  push @w_bd, length($1);
                                  push @w_d , length($2);
                                  push @w_ad, length($3);
                              } else {
                                  # not a number
                                  push @w_bd, length($cell);
                                  push @w_bd, 0;
                                  push @w_ad, 0;
                              }
                          } else {
                              push @w_bd, 0;
                              push @w_d , 0;
                              push @w_ad, 0;
                          }
                      }
                      $maxw_bd = max(@w_bd);
                      $maxw_d  = max(@w_d);
                      $maxw_ad = max(@w_ad);
                      if ($header_row) {
                          my $w = length($data->[0][$colidx]);
                          if ($maxw_d == 0 && $maxw_ad == 0) {
                              $maxw_bd = $w;
                          }
                      }
                  }
  
                  $maxw = max(map {
                      @$_ > $colidx ? length($_->[$colidx]) : 0
                  } @$data);
  
                  # do the alignment
                  for my $i (0..$#{$data}) {
                      my $row = $data->[$i];
                      for my $i (0..$#{$data}) {
                          my $row = $data->[$i];
                          next unless @$row > $colidx;
                          my $cell = $row->[$colidx];
                          next unless defined($cell);
                          if ($align eq 'number') {
                              my ($bd, $d, $ad);
                              if ($header_row && $i == 0) {
                              } elsif (($bd, $d, $ad) = $cell =~ /\A([+-]?\d+)(\.?)(\d*)\z/) {
                                  $cell = join(
                                      '',
                                      (' ' x ($maxw_bd - length($bd))), $bd,
                                      $d , (' ' x ($maxw_d  - length($d ))),
                                      $ad, (' ' x ($maxw_ad - length($ad))),
                                  );
                              } elsif (($bd, $d, $ad) = $cell =~ /\A([+-]?\d+\.?\d*)([eE])([+-]?\d+)\z/) {
                                  $cell = join(
                                      '',
                                      (' ' x ($maxw_bd - length($bd))), $bd,
                                      $d , (' ' x ($maxw_d  - length($d ))),
                                      $ad, (' ' x ($maxw_ad - length($ad))),
                                  );
                              }
                              my $w = length($cell);
                              $cell = (' ' x ($maxw - $w)) . $cell
                                  if $maxw > $w;
                          } elsif ($align eq 'right') {
                              $cell = (' ' x ($maxw - length($cell))) . $cell;
                          } elsif ($align eq 'middle' || $align eq 'center') {
                              my $w = length($cell);
                              my $n = int(($maxw-$w)/2);
                              $cell = (' ' x $n) . $cell . (' ' x ($maxw-$w-$n));
                          } else {
                              # assumed left
                              $cell .= (' ' x ($maxw - length($cell)));
  
                          }
                          $row->[$colidx] = $cell;
                      }
                  }
              } # for $colidx
          } # END align columns
  
          my $fres;
          if (my $backend = $ENV{FORMAT_PRETTY_TABLE_BACKEND}) {
              require Text::Table::Any;
              $fres = Text::Table::Any::table(rows=>$data, header_row=>$header_row, backend=>$backend);
          } else {
              require Text::Table::Tiny;
              $fres = Text::Table::Tiny::table(rows=>$data, header_row=>$header_row);
          }
          $fres .= "\n" unless $fres =~ /\R\z/ || !length($fres);
          $fres;
      } elsif ($format eq 'csv') {
          no warnings 'uninitialized';
          join(
              "",
              map {
                  my $row = $_;
                  join(
                      ",",
                      map {
                          my $cell = $_;
                          $cell =~ s/(["\\])/\\$1/g;
                          qq("$cell");
                      } @$row)."\n";
              } @$data
          );
      } elsif ($format eq 'html') {
          no warnings 'uninitialized';
          require HTML::Entities;
  
          my $tfa = $resmeta->{'table.field_aligns'};
  
          my @res;
          push @res, "<table".($resmeta->{'table.html_class'} ?
                                   " class=\"".HTML::Entities::encode_entities(
                                       $resmeta->{'table.html_class'})."\"" : "").
                                           ">\n";
          for my $i (0..$#{$data}) {
              my $data_elem = $i == 0 ? "th" : "td";
              push @res, "<thead>\n" if $i == 0;
              push @res, "<tbody>\n" if $i == 1;
              push @res, " <tr>\n";
              my $row = $data->[$i];
              for my $j (0..$#{$row}) {
                  my $field_idx = $field_idxs[$j];
                  my $align;
                  if ($field_idx >= 0 && $tfa->[$field_idx]) {
                      $align = $tfa->[$field_idx];
                      $align = "right" if $align eq 'number';
                      $align = "middle" if $align eq 'center';
                  }
                  push @res, "  <$data_elem",
                      ($align ? " align=\"$align\"" : ""),
                      ">", HTML::Entities::encode_entities($row->[$j]),
                      "</$data_elem>\n";
              }
              push @res, " </tr>\n";
              push @res, "</thead>\n" if $i == 0;
          }
          push @res, "</tbody>\n";
          push @res, "</table>\n";
          join '', @res;
      } else {
          no warnings 'uninitialized';
          shift @$data if $header_row;
          join("", map {join("\t", @$_)."\n"} @$data);
      }
  }
  
  sub format {
      my ($res, $format, $is_naked, $cleanse) = @_;
  
      if ($format =~ /\A(text|text-simple|text-pretty|csv|html)\z/) {
          $format = $format eq 'text' ?
              ((-t STDOUT) ? 'text-pretty' : 'text-simple') : $format;
          no warnings 'uninitialized';
          if ($res->[0] !~ /^(2|304)/) {
              my $fres = "ERROR $res->[0]: $res->[1]";
              if (my $prev = $res->[3]{prev}) {
                  $fres .= " ($prev->[0]: $prev->[1])";
              }
              return "$fres\n";
          } elsif ($res->[3] && $res->[3]{"x.hint.result_binary"}) {
              return $res->[2];
          } else {
              require Data::Check::Structure;
              my $data = $res->[2];
              my $max = 5;
              if (!ref($data)) {
                  $data //= "";
                  $data .= "\n" unless !length($data) || $data =~ /\n\z/;
                  return $data;
              } elsif (ref($data) eq 'ARRAY' && !@$data) {
                  return "";
              } elsif (Data::Check::Structure::is_aos($data, {max=>$max})) {
                  return join("", map {"$_\n"} @$data);
              } elsif (Data::Check::Structure::is_aoaos($data, {max=>$max})) {
                  my $header_row = 0;
                  my $data = $data;
                  if ($res->[3]{'table.fields'}) {
                      $data = [$res->[3]{'table.fields'}, @$data];
                      $header_row = 1;
                  }
                  return __gen_table($data, $header_row, $res->[3], $format);
              } elsif (Data::Check::Structure::is_hos($data, {max=>$max})) {
                  $data = [map {[$_, $data->{$_}]} sort keys %$data];
                  unshift @$data, ["key", "value"];
                  return __gen_table($data, 1, $res->[3], $format);
              } elsif (Data::Check::Structure::is_aohos($data, {max=>$max})) {
                  # collect all mentioned fields
                  my @fieldnames;
                  if ($res->[3] && $res->[3]{'table.fields'} &&
                          $res->[3]{'table.hide_unknown_fields'}) {
                      @fieldnames = @{ $res->[3]{'table.fields'} };
                  } else {
                      my %fieldnames;
                      for my $row (@$data) {
                          $fieldnames{$_}++ for keys %$row;
                      }
                      @fieldnames = sort keys %fieldnames;
                  }
                  my $newdata = [];
                  for my $row (@$data) {
                      push @$newdata, [map {$row->{$_}} @fieldnames];
                  }
                  unshift @$newdata, \@fieldnames;
                  return __gen_table($newdata, 1, $res->[3], $format);
              } else {
                  $format = 'json-pretty';
              }
          }
      }
  
      my $tff = $res->[3]{'table.fields'};
      $res = $res->[2] if $is_naked;
  
      if ($format eq 'perl') {
          my $use_color = $ENV{COLOR} // (-t STDOUT);
          if ($use_color && eval { require Data::Dump::Color; 1 }) {
              return Data::Dump::Color::dump($res);
          } elsif (eval { require Data::Dump; 1 }) {
              return Data::Dump::dump($res);
          } else {
              no warnings 'once';
              require Data::Dumper;
              local $Data::Dumper::Terse = 1;
              local $Data::Dumper::Indent = 1;
              local $Data::Dumper::Useqq = 1;
              local $Data::Dumper::Deparse = 1;
              local $Data::Dumper::Quotekeys = 0;
              local $Data::Dumper::Sortkeys = 1;
              local $Data::Dumper::Trailingcomma = 1;
              return Data::Dumper::Dumper($res);
          }
      }
  
      unless ($format =~ /\Ajson(-pretty)?\z/) {
          warn "Unknown format '$format', fallback to json-pretty";
          $format = 'json-pretty';
      }
      __cleanse($res) if ($cleanse//1);
      if ($format =~ /json/) {
          if ($tff && _json->can("sort_by") &&
                  eval { require Sort::ByExample; 1}) {
              my $cmp = Sort::ByExample->cmp($tff);
              _json->sort_by(sub { $cmp->($JSON::PP::a, $JSON::PP::b) });
          }
  
          if ($format eq 'json') {
              return _json->encode($res) . "\n";
          } else {
              _json->pretty(1);
              return _json->encode($res);
          }
      }
  }
  
  1;
  # ABSTRACT: Format enveloped result
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Perinci::Result::Format::Lite - Format enveloped result
  
  =head1 VERSION
  
  This document describes version 0.274 of Perinci::Result::Format::Lite (from Perl distribution Perinci-Result-Format-Lite), released on 2018-07-04.
  
  =head1 SYNOPSIS
  
  =head1 DESCRIPTION
  
  =for Pod::Coverage ^(firstidx)$
  
  =head1 FUNCTIONS
  
  =head2 format($res, $format[ , $is_naked=0, $cleanse=1 ]) => str
  
  =head1 ENVIRONMENT
  
  =head2 FORMAT_PRETTY_TABLE_BACKEND => str
  
  If this is set, will render text table using L<Text::Table::Any> (with
  C<backend> set to the value of this environment variable) instead of the default
  L<Text::Table::Tiny>. This is useful if you want to output text table in a
  different format, for example to generate Org tables (make sure
  L<Text::Table::Org> backend is already installed):
  
   % FORMAT_PRETTY_TABLE_BACKEND=Text::Table::Org lcpan rdeps Getopt::Lucid
  
  =head2 FORMAT_PRETTY_TABLE_COLUMN_ORDERS => array (json)
  
  Set the default of C<table_column_orders> in C<format_options> in result
  metadata, similar to what's implemented in L<Perinci::Result::Format> and
  L<Data::Format::Pretty::Console>.
  
  =head2 COLOR => bool
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Perinci-Result-Format-Lite>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Perinci-Result-Format-Lite>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Perinci-Result-Format-Lite>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Perinci::Result::Format>, a more heavyweight version of this module.
  
  L<Perinci::CmdLine::Lite> uses this module to format enveloped result.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2018, 2017, 2016, 2015 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
PERINCI_RESULT_FORMAT_LITE

    $main::fatpacked{"Perinci/Sub/Complete.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PERINCI_SUB_COMPLETE';
  package Perinci::Sub::Complete;
  
  our $DATE = '2020-03-04'; # DATE
  our $VERSION = '0.942'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  use Log::ger;
  
  use Complete::Common qw(:all);
  use Complete::Sah;
  use Complete::Util qw(hashify_answer complete_array_elem complete_hash_key combine_answers modify_answer);
  use Perinci::Sub::Util qw(gen_modified_sub);
  
  require Exporter;
  our @ISA       = qw(Exporter);
  our @EXPORT_OK = qw(
                         complete_from_schema
                         complete_arg_val
                         complete_arg_index
                         complete_arg_elem
                         complete_cli_arg
                 );
  our %SPEC;
  
  $SPEC{':package'} = {
      v => 1.1,
      summary => 'Complete command-line argument using Rinci metadata',
  };
  
  my %common_args_riap = (
      riap_client => {
          summary => 'Optional, to perform complete_arg_val to the server',
          schema  => 'obj*',
          description => <<'_',
  
  When the argument spec in the Rinci metadata contains `completion` key, this
  means there is custom completion code for that argument. However, if retrieved
  from a remote server, sometimes the `completion` key no longer contains the code
  (it has been cleansed into a string). Moreover, the completion code needs to run
  on the server.
  
  If supplied this argument and te `riap_server_url` argument, the function will
  try to request to the server (via Riap request `complete_arg_val`). Otherwise,
  the function will just give up/decline completing.
  
  _
          },
      riap_server_url => {
          summary => 'Optional, to perform complete_arg_val to the server',
          schema  => 'str*',
          description => <<'_',
  
  See the `riap_client` argument.
  
  _
      },
      riap_uri => {
          summary => 'Optional, to perform complete_arg_val to the server',
          schema  => 'str*',
          description => <<'_',
  
  See the `riap_client` argument.
  
  _
      },
  );
  
  # backward compatibility, will be removed in the future
  *complete_from_schema = \&Complete::Sah::complete_from_schema;
  $SPEC{complete_from_schema} = $Complete::Sah::SPEC{complete_from_schema};
  
  $SPEC{complete_arg_val} = {
      v => 1.1,
      summary => 'Given argument name and function metadata, complete value',
      description => <<'_',
  
  Will attempt to complete using the completion routine specified in the argument
  specification (the `completion` property, or in the case of `complete_arg_elem`
  function, the `element_completion` property), or if that is not specified, from
  argument's schema using `complete_from_schema`.
  
  Completion routine will get `%args`, with the following keys:
  
  * `word` (str, the word to be completed)
  * `arg` (str, the argument name which value is currently being completed)
  * `index (int, only for the `complete_arg_elem` function, the index in the
     argument array that is currently being completed, starts from 0)
  * `args` (hash, the argument hash to the function, so far)
  
  as well as extra keys from `extras` (but these won't overwrite the above
  standard keys).
  
  Completion routine should return a completion answer structure (described in
  <pm:Complete>) which is either a hash or an array. The simplest form of answer
  is just to return an array of strings. Completion routine can also return undef
  to express declination.
  
  _
      args => {
          meta => {
              summary => 'Rinci function metadata, must be normalized',
              schema => 'hash*',
              req => 1,
          },
          arg => {
              summary => 'Argument name',
              schema => 'str*',
              req => 1,
          },
          word => {
              summary => 'Word to be completed',
              schema => ['str*', default => ''],
          },
          args => {
              summary => 'Collected arguments so far, '.
                  'will be passed to completion routines',
              schema  => 'hash',
          },
          extras => {
              summary => 'Add extra arguments to completion routine',
              schema  => 'hash',
              description => <<'_',
  
  The keys from this `extras` hash will be merged into the final `%args` passed to
  completion routines. Note that standard keys like `word`, `cword`, and so on as
  described in the function description will not be overwritten by this.
  
  _
          },
  
          %common_args_riap,
      },
      result_naked => 1,
      result => {
          schema => 'array', # XXX of => str*
      },
  };
  sub complete_arg_val {
      my %args = @_;
  
      log_trace("[comp][periscomp] entering complete_arg_val, arg=<%s>", $args{arg});
      my $fres;
  
      my $extras = $args{extras} // {};
  
      my $meta = $args{meta} or do {
          log_trace("[comp][periscomp] meta is not supplied, declining");
          goto RETURN_RES;
      };
      my $arg  = $args{arg} or do {
          log_trace("[comp][periscomp] arg is not supplied, declining");
          goto RETURN_RES;
      };
      my $word = $args{word} // '';
  
      # XXX reject if meta's v is not 1.1
  
      my $args_prop = $meta->{args} // {};
      my $arg_spec = $args_prop->{$arg} or do {
          log_trace("[comp][periscomp] arg '$arg' is not specified in meta, declining");
          goto RETURN_RES;
      };
  
      my $static;
      eval { # completion sub can die, etc.
  
          my $comp;
        GET_COMP_ROUTINE:
          {
              $comp = $arg_spec->{completion};
              if ($comp) {
                  log_trace("[comp][periscomp] using arg completion routine from arg spec's 'completion' property");
                  last GET_COMP_ROUTINE;
              }
              my $xcomp = $arg_spec->{'x.completion'};
              if ($xcomp) {
                  if (ref($xcomp) eq 'CODE') {
                      $comp = $xcomp;
                  } else {
                      my ($submod, $xcargs);
                      if (ref($xcomp) eq 'ARRAY') {
                          $submod = $xcomp->[0];
                          $xcargs = $xcomp->[1];
                      } else {
                          $submod = $xcomp;
                          $xcargs = {};
                      }
                      my $mod = "Perinci::Sub::XCompletion::$submod";
                      require Module::Installed::Tiny;
                      if (Module::Installed::Tiny::module_installed($mod)) {
                          log_trace("[comp][periscomp] loading module %s ...", $mod);
                          my $mod_pm = $mod; $mod_pm =~ s!::!/!g; $mod_pm .= ".pm";
                          require $mod_pm;
                          my $fref = \&{"$mod\::gen_completion"};
                          log_trace("[comp][periscomp] invoking gen_completion() from %s ...", $mod);
                          $comp = $fref->(%$xcargs);
                      } else {
                          log_trace("[comp][periscomp] module %s is not installed, skipped", $mod);
                      }
                  }
                  if ($comp) {
                      log_trace("[comp][periscomp] using arg completion routine from arg spec's 'x.completion' attribute");
                      last GET_COMP_ROUTINE;
                  }
              }
              my $ent = $arg_spec->{'x.schema.entity'};
              if ($ent) {
                  require Module::Installed::Tiny;
                  my $mod = "Perinci::Sub::ArgEntity::$ent";
                  if (Module::Installed::Tiny::module_installed($mod)) {
                      log_trace("[comp][periscomp] loading module %s ...", $mod);
                      my $mod_pm = $mod; $mod_pm =~ s!::!/!g; $mod_pm .= ".pm";
                      require $mod_pm;
                      if (defined &{"$mod\::complete_arg_val"}) {
                          log_trace("[comp][periscomp] invoking complete_arg_val() from %s ...", $mod);
                          $comp = \&{"$mod\::complete_arg_val"};
                          last GET_COMP_ROUTINE;
                      } else {
                          log_trace("[comp][periscomp] module %s doesn't define complete_arg_val(), skipped", $mod);
                      }
                  } else {
                      log_trace("[comp][periscomp] module %s not installed, skipped", $mod);
                  }
              }
          } # GET_COMP_ROUTINE
  
          if ($comp) {
              if (ref($comp) eq 'CODE') {
                  log_trace("[comp][periscomp] invoking arg completion routine");
                  $fres = $comp->(
                      %$extras,
                      word=>$word, arg=>$arg, args=>$args{args});
                  return; # from eval
              } elsif (ref($comp) eq 'ARRAY') {
                  # this is deprecated but will be supported for some time
                  log_trace("[comp][periscomp] using array specified in arg completion routine: %s", $comp);
                  $fres = complete_array_elem(array=>$comp, word=>$word);
                  $static++;
                  return; # from eval
              }
  
              log_trace("[comp][periscomp] arg spec's 'completion' property is not a coderef or arrayref");
              if ($args{riap_client} && $args{riap_server_url}) {
                  log_trace("[comp][periscomp] trying to perform complete_arg_val request to Riap server");
                  my $res = $args{riap_client}->request(
                      complete_arg_val => $args{riap_server_url},
                      {(uri=>$args{riap_uri}) x !!defined($args{riap_uri}),
                       arg=>$arg, word=>$word},
                  );
                  if ($res->[0] != 200) {
                      log_trace("[comp][periscomp] Riap request failed (%s), declining", $res);
                      return; # from eval
                  }
                  $fres = $res->[2];
                  return; # from eval
              }
  
              log_trace("[comp][periscomp] declining");
              return; # from eval
          }
  
          my $fres_from_arg_examples;
        COMPLETE_FROM_ARG_EXAMPLES:
          {
              my $egs = $arg_spec->{examples};
              unless ($egs) {
                  log_trace("[comp][periscomp] arg spec does not specify examples");
                  last COMPLETE_FROM_ARG_EXAMPLES;
              }
              my @array;
              my @summaries;
              for my $eg (@$egs) {
                  if (ref $eg eq 'HASH') {
                      next unless defined $eg->{value};
                      next if ref $eg->{value};
                      push @array, $eg->{value};
                      push @summaries, $eg->{summary};
                  } else {
                      next unless defined $eg;
                      next if ref $eg;
                      push @array, $eg;
                      push @summaries, undef;
                  }
              }
              $fres_from_arg_examples = complete_array_elem(
                  word=>$word, array=>\@array, summaries=>\@summaries);
              $static //= 1;
          } # COMPLETE_FROM_ARG_EXAMPLES
  
          my $fres_from_schema;
        COMPLETE_FROM_SCHEMA:
          {
              my $sch = $arg_spec->{schema};
              unless ($sch) {
                  log_trace("[comp][periscomp] arg spec does not specify schema");
                  last COMPLETE_FROM_SCHEMA;
              }
              # XXX normalize schema if not normalized
              $fres_from_schema = complete_from_schema(
                  arg=>$arg, extras=>$extras, schema=>$sch, word=>$word,
              );
              $static //= 1;
          } # COMPLETE_FROM_SCHEMA
  
          $fres = combine_answers(grep {defined} (
              $fres_from_arg_examples,
              $fres_from_schema,
          ));
      };
      log_debug("[comp][periscomp] completion died: $@") if $@;
      unless ($fres) {
          log_trace("[comp][periscomp] no completion from metadata possible, declining");
          goto RETURN_RES;
      }
  
      $fres = hashify_answer($fres);
      $fres->{static} //= $static && $word eq '' ? 1:0;
    RETURN_RES:
      log_trace("[comp][periscomp] leaving complete_arg_val, result=%s", $fres);
      $fres;
  }
  
  gen_modified_sub(
      output_name  => 'complete_arg_elem',
      install_sub  => 0,
      base_name    => 'complete_arg_val',
      summary      => 'Given argument name and function metadata, '.
          'complete array element',
      add_args     => {
          index => {
              summary => 'Index of element to complete',
              schema  => ['str*'],
          },
      },
  );
  sub complete_arg_elem {
      require Data::Sah::Normalize;
  
      my %args = @_;
  
      my $fres;
  
      log_trace("[comp][periscomp] entering complete_arg_elem, arg=<%s>, index=<%d>",
                   $args{arg}, $args{index});
  
      my $extras = $args{extras} // {};
  
      my $ourextras = {arg=>$args{arg}, args=>$args{args}};
  
      my $meta = $args{meta} or do {
          log_trace("[comp][periscomp] meta is not supplied, declining");
          goto RETURN_RES;
      };
      my $arg  = $args{arg} or do {
          log_trace("[comp][periscomp] arg is not supplied, declining");
          goto RETURN_RES;
      };
      defined(my $index = $args{index}) or do {
          log_trace("[comp][periscomp] index is not supplied, declining");
          goto RETURN_RES;
      };
      my $word = $args{word} // '';
  
      # XXX reject if meta's v is not 1.1
  
      my $args_prop = $meta->{args} // {};
      my $arg_spec = $args_prop->{$arg} or do {
          log_trace("[comp][periscomp] arg '$arg' is not specified in meta, declining");
          goto RETURN_RES;
      };
  
      my $static;
      eval { # completion sub can die, etc.
  
          my $elcomp;
        GET_ELCOMP_ROUTINE:
          {
              $elcomp = $arg_spec->{element_completion};
              if ($elcomp) {
                  log_trace("[comp][periscomp] using arg element completion routine from 'element_completion' property");
                  last GET_ELCOMP_ROUTINE;
              }
              my $xelcomp = $arg_spec->{'x.element_completion'};
              if ($xelcomp) {
                  if (ref($xelcomp) eq 'CODE') {
                      $elcomp = $xelcomp;
                  } else {
                      my ($submod, $xcargs);
                      if (ref($xelcomp) eq 'ARRAY') {
                          $submod = $xelcomp->[0];
                          $xcargs = $xelcomp->[1];
                      } else {
                          $submod = $xelcomp;
                          $xcargs = {};
                      }
                      my $mod = "Perinci::Sub::XCompletion::$submod";
                      require Module::Installed::Tiny;
                      if (Module::Installed::Tiny::module_installed($mod)) {
                          log_trace("[comp][periscomp] loading module %s ...", $mod);
                          my $mod_pm = $mod; $mod_pm =~ s!::!/!g; $mod_pm .= ".pm";
                          require $mod_pm;
                          my $fref = \&{"$mod\::gen_completion"};
                          log_trace("[comp][periscomp] invoking gen_completion() from %s ...", $mod);
                          $elcomp = $fref->(%$xcargs);
                      } else {
                          log_trace("[comp][periscomp] module %s is not installed, skipped", $mod);
                      }
                  }
                  if ($elcomp) {
                      log_trace("[comp][periscomp] using arg element completion routine from 'x.element_completion' attribute");
                      last GET_ELCOMP_ROUTINE;
                  }
              }
              my $ent = $arg_spec->{'x.schema.element_entity'};
              if ($ent) {
                  require Module::Installed::Tiny;
                  my $mod = "Perinci::Sub::ArgEntity::$ent";
                  if (Module::Installed::Tiny::module_installed($mod)) {
                      log_trace("[comp][periscomp] loading module %s ...", $mod);
                      my $mod_pm = $mod; $mod_pm =~ s!::!/!g; $mod_pm .= ".pm";
                      require $mod_pm;
                      if (defined &{"$mod\::complete_arg_val"}) {
                          log_trace("[comp][periscomp] invoking complete_arg_val() from %s ...", $mod);
                          $elcomp = \&{"$mod\::complete_arg_val"};
                          last GET_ELCOMP_ROUTINE;
                      } else {
                          log_trace("[comp][periscomp] module %s doesn't defined complete_arg_val(), skipped", $mod);
                      }
                  } else {
                      log_trace("[comp][periscomp] module %s is not installed, skipped", $mod);
                  }
              }
          } # GET_ELCOMP_ROUTINE
  
          $ourextras->{index} = $index;
          if ($elcomp) {
              if (ref($elcomp) eq 'CODE') {
                  log_trace("[comp][periscomp] invoking arg element completion routine");
                  $fres = $elcomp->(
                      %$extras,
                      %$ourextras,
                      word=>$word);
                  return; # from eval
              } elsif (ref($elcomp) eq 'ARRAY') {
                  log_trace("[comp][periscomp] using array specified in arg element completion routine: %s", $elcomp);
                  $fres = complete_array_elem(array=>$elcomp, word=>$word);
                  $static = $word eq '';
              }
  
              log_trace("[comp][periscomp] arg spec's 'element_completion' property is not a coderef or ".
                               "arrayref");
              if ($args{riap_client} && $args{riap_server_url}) {
                  log_trace("[comp][periscomp] trying to perform complete_arg_elem request to Riap server");
                  my $res = $args{riap_client}->request(
                      complete_arg_elem => $args{riap_server_url},
                      {(uri=>$args{riap_uri}) x !!defined($args{riap_uri}),
                       arg=>$arg, args=>$args{args}, word=>$word,
                       index=>$index},
                  );
                  if ($res->[0] != 200) {
                      log_trace("[comp][periscomp] Riap request failed (%s), declining", $res);
                      return; # from eval
                  }
                  $fres = $res->[2];
                  return; # from eval
              }
  
              log_trace("[comp][periscomp] declining");
              return; # from eval
          } # if ($elcomp)
  
          my $sch = $arg_spec->{schema};
          unless ($sch) {
              log_trace("[comp][periscomp] arg spec does not specify schema, declining");
              return; # from eval
          };
  
          my $nsch = Data::Sah::Normalize::normalize_schema($sch);
  
          my ($type, $cs) = @$nsch;
          if ($type ne 'array') {
              log_trace("[comp][periscomp] can't complete element for non-array");
              return; # from eval
          }
  
          unless ($cs->{of}) {
              log_trace("[comp][periscomp] schema does not specify 'of' clause, declining");
              return; # from eval
          }
  
          # normalize subschema because normalize_schema (as of 0.01) currently
          # does not do it yet
          my $elsch = Data::Sah::Normalize::normalize_schema($cs->{of});
  
          $fres = complete_from_schema(
              schema=>$elsch, word=>$word,
              schema_is_normalized=>1,
          );
      };
      log_debug("[comp][periscomp] completion died: $@") if $@;
      unless ($fres) {
          log_trace("[comp][periscomp] no completion from metadata possible, declining");
          goto RETURN_RES;
      }
  
      $fres = hashify_answer($fres);
      $fres->{static} //= $static && $word eq '' ? 1:0;
    RETURN_RES:
      log_trace("[comp][periscomp] leaving complete_arg_elem, result=%s", $fres);
      $fres;
  }
  
  $SPEC{complete_arg_index} = {
      v => 1.1,
      summary => 'Given argument name and function metadata, complete arg element index',
      description => <<'_',
  
  This is only relevant for arguments which have `index_completion` property set
  (currently only `hash` type arguments). When that property is not set, will
  simply return undef.
  
  Completion routine will get `%args`, with the following keys:
  
  * `word` (str, the word to be completed)
  * `arg` (str, the argument name which value is currently being completed)
  * `args` (hash, the argument hash to the function, so far)
  
  as well as extra keys from `extras` (but these won't overwrite the above
  standard keys).
  
  Completion routine should return a completion answer structure (described in
  <pm:Complete>) which is either a hash or an array. The simplest form of answer
  is just to return an array of strings. Completion routine can also return undef
  to express declination.
  
  _
      args => {
          meta => {
              summary => 'Rinci function metadata, must be normalized',
              schema => 'hash*',
              req => 1,
          },
          arg => {
              summary => 'Argument name',
              schema => 'str*',
              req => 1,
          },
          word => {
              summary => 'Word to be completed',
              schema => ['str*', default => ''],
          },
          args => {
              summary => 'Collected arguments so far, '.
                  'will be passed to completion routines',
              schema  => 'hash',
          },
          extras => {
              summary => 'Add extra arguments to completion routine',
              schema  => 'hash',
              description => <<'_',
  
  The keys from this `extras` hash will be merged into the final `%args` passed to
  completion routines. Note that standard keys like `word`, `cword`, and so on as
  described in the function description will not be overwritten by this.
  
  _
          },
  
          %common_args_riap,
      },
      result_naked => 1,
      result => {
          schema => 'array', # XXX of => str*
      },
  };
  sub complete_arg_index {
      require Data::Sah::Normalize;
  
      my %args = @_;
  
      my $fres;
  
      log_trace("[comp][periscomp] entering complete_arg_index, arg=<%s>",
                   $args{arg});
  
      my $extras = $args{extras} // {};
  
      my $ourextras = {arg=>$args{arg}, args=>$args{args}};
  
      my $meta = $args{meta} or do {
          log_trace("[comp][periscomp] meta is not supplied, declining");
          goto RETURN_RES;
      };
      my $arg  = $args{arg} or do {
          log_trace("[comp][periscomp] arg is not supplied, declining");
          goto RETURN_RES;
      };
      my $word = $args{word} // '';
  
      # XXX reject if meta's v is not 1.1
  
      my $args_prop = $meta->{args} // {};
      my $arg_spec = $args_prop->{$arg} or do {
          log_trace("[comp][periscomp] arg '$arg' is not specified in meta, declining");
          goto RETURN_RES;
      };
  
      my $static;
      eval { # completion sub can die, etc.
  
          my $idxcomp;
        GET_IDXCOMP_ROUTINE:
          {
              $idxcomp = $arg_spec->{index_completion};
              if ($idxcomp) {
                  log_trace("[comp][periscomp] using arg element index completion routine from 'index_completion' property");
                  last GET_IDXCOMP_ROUTINE;
              }
          } # GET_IDXCOMP_ROUTINE
  
          if ($idxcomp) {
              if (ref($idxcomp) eq 'CODE') {
                  log_trace("[comp][periscomp] invoking arg element index completion routine");
                  $fres = $idxcomp->(
                      %$extras,
                      %$ourextras,
                      word=>$word);
                  return; # from eval
              } elsif (ref($idxcomp) eq 'ARRAY') {
                  log_trace("[comp][periscomp] using array specified in arg element index completion routine: %s", $idxcomp);
                  $fres = complete_array_elem(array=>$idxcomp, word=>$word);
                  $static = $word eq '';
              }
  
              log_trace("[comp][periscomp] arg spec's 'index_completion' property is not a coderef or ".
                               "arrayref");
              if ($args{riap_client} && $args{riap_server_url}) {
                  log_trace("[comp][periscomp] trying to perform complete_arg_index request to Riap server");
                  my $res = $args{riap_client}->request(
                      complete_arg_index => $args{riap_server_url},
                      {(uri=>$args{riap_uri}) x !!defined($args{riap_uri}),
                       arg=>$arg, args=>$args{args}, word=>$word},
                  );
                  if ($res->[0] != 200) {
                      log_trace("[comp][periscomp] Riap request failed (%s), declining", $res);
                      return; # from eval
                  }
                  $fres = $res->[2];
                  return; # from eval
              }
  
              log_trace("[comp][periscomp] declining");
              return; # from eval
          } # if ($idxcomp)
  
          my $sch = $arg_spec->{schema};
          unless ($sch) {
              log_trace("[comp][periscomp] arg spec does not specify schema, declining");
              return; # from eval
          };
  
          my $nsch = Data::Sah::Normalize::normalize_schema($sch);
  
          my ($type, $cs) = @$nsch;
          if ($type ne 'hash') {
              log_trace("[comp][periscomp] can't complete element index for non-hash");
              return; # from eval
          }
  
          # collect known keys from some clauses
          my %keys;
          if ($cs->{keys}) {
              $keys{$_}++ for keys %{ $cs->{keys} };
          }
          if ($cs->{indices}) {
              $keys{$_}++ for keys %{ $cs->{indices} };
          }
          if ($cs->{req_keys}) {
              $keys{$_}++ for @{ $cs->{req_keys} };
          }
          if ($cs->{allowed_keys}) {
              $keys{$_}++ for @{ $cs->{allowed_keys} };
          }
  
          # exclude keys that have been specified in collected args
          for (keys %{$args{args}{$arg} // {}}) {
              delete $keys{$_};
          }
  
          $fres = complete_hash_key(word => $word, hash => \%keys);
  
      }; # eval
      log_debug("[comp][periscomp] completion died: $@") if $@;
      unless ($fres) {
          log_trace("[comp][periscomp] no index completion from metadata possible, declining");
          goto RETURN_RES;
      }
  
      $fres = hashify_answer($fres);
      $fres->{static} //= $static && $word eq '' ? 1:0;
    RETURN_RES:
      log_trace("[comp][periscomp] leaving complete_arg_index, result=%s", $fres);
      $fres;
  }
  
  $SPEC{complete_cli_arg} = {
      v => 1.1,
      summary => 'Complete command-line argument using Rinci function metadata',
      description => <<'_',
  
  This routine uses <pm:Perinci::Sub::GetArgs::Argv> to generate <pm:Getopt::Long>
  specification from arguments list in Rinci function metadata and common options.
  Then, it will use <pm:Complete::Getopt::Long> to complete option names, option
  values, as well as arguments.
  
  _
      args => {
          meta => {
              summary => 'Rinci function metadata',
              schema => 'hash*',
              req => 1,
          },
          words => {
              summary => 'Command-line arguments',
              schema => ['array*' => {of=>'str*'}],
              req => 1,
          },
          cword => {
              summary => 'On which argument cursor is located (zero-based)',
              schema => 'int*',
              req => 1,
          },
          completion => {
              summary => 'Supply custom completion routine',
              description => <<'_',
  
  If supplied, instead of the default completion routine, this code will be called
  instead. Will receive all arguments that <pm:Complete::Getopt::Long> will pass,
  and additionally:
  
  * `arg` (str, the name of function argument)
  * `args` (hash, the function arguments formed so far)
  * `index` (int, if completing argument element value)
  
  _
              schema => 'code*',
          },
          per_arg_json => {
              summary => 'Will be passed to Perinci::Sub::GetArgs::Argv',
              schema  => 'bool',
          },
          per_arg_yaml => {
              summary => 'Will be passed to Perinci::Sub::GetArgs::Argv',
              schema  => 'bool',
          },
          common_opts => {
              summary => 'Common options',
              description => <<'_',
  
  A hash where the values are hashes containing these keys: `getopt` (Getopt::Long
  option specification), `handler` (Getopt::Long handler). Will be passed to
  `get_args_from_argv()`. Example:
  
      {
          help => {
              getopt  => 'help|h|?',
              handler => sub { ... },
              summary => 'Display help and exit',
          },
          version => {
              getopt  => 'version|v',
              handler => sub { ... },
              summary => 'Display version and exit',
          },
      }
  
  _
              schema => ['hash*'],
          },
          extras => {
              summary => 'Add extra arguments to completion routine',
              schema  => 'hash',
              description => <<'_',
  
  The keys from this `extras` hash will be merged into the final `%args` passed to
  completion routines. Note that standard keys like `word`, `cword`, and so on as
  described in the function description will not be overwritten by this.
  
  _
          },
          func_arg_starts_at => {
              schema  => 'int*',
              default => 0,
              description => <<'_',
  
  This is a (temporary?) workaround for <pm:Perinci::CmdLine>. In an application
  with subcommands (e.g. `cmd --verbose subcmd arg0 arg1 ...`), then `words` will
  still contain the subcommand name. Positional function arguments then start at 1
  not 0. This option allows offsetting function arguments.
  
  _
          },
          %common_args_riap,
      },
      result_naked => 1,
      result => {
          schema => 'hash*',
          description => <<'_',
  
  You can use `format_completion` function in <pm:Complete::Bash> module to format
  the result of this function for bash.
  
  _
      },
  };
  sub complete_cli_arg {
      require Complete::Getopt::Long;
      require Perinci::Sub::GetArgs::Argv;
  
      my %args   = @_;
      my $meta   = $args{meta} or die "Please specify meta";
      my $words  = $args{words} or die "Please specify words";
      my $cword  = $args{cword}; defined($cword) or die "Please specify cword";
      my $copts  = $args{common_opts} // {};
      my $comp   = $args{completion};
      my $extras = {
          %{ $args{extras} // {} },
          words => $args{words},
          cword => $args{cword},
      };
  
      my $fname = __PACKAGE__ . "::complete_cli_arg"; # XXX use __SUB__
      my $fres;
  
      my $word   = $words->[$cword];
      my $args_prop = $meta->{args} // {};
  
      log_trace('[comp][periscomp] entering %s(), words=%s, cword=%d, word=<%s>',
                   $fname, $words, $cword, $word);
  
      my $ggls_res = Perinci::Sub::GetArgs::Argv::gen_getopt_long_spec_from_meta(
          meta         => $meta,
          common_opts  => $copts,
          per_arg_json => $args{per_arg_json},
          per_arg_yaml => $args{per_arg_yaml},
          ignore_converted_code => 1,
      );
      die "Can't generate getopt spec from meta: $ggls_res->[0] - $ggls_res->[1]"
          unless $ggls_res->[0] == 200;
      $extras->{ggls_res} = $ggls_res;
      my $gospec = $ggls_res->[2];
      my $specmeta = $ggls_res->[3]{'func.specmeta'};
  
      my $gares = Perinci::Sub::GetArgs::Argv::get_args_from_argv(
          argv   => [@$words],
          meta   => $meta,
          strict => 0,
      );
  
      my $copts_by_ospec = {};
      for (keys %$copts) { $copts_by_ospec->{$copts->{$_}{getopt}}=$copts->{$_} }
  
      my $compgl_comp = sub {
          log_trace("[comp][periscomp] entering completion routine (that we supply to Complete::Getopt::Long)");
          my %cargs = @_;
          my $type  = $cargs{type};
          my $ospec = $cargs{ospec} // '';
          my $word  = $cargs{word};
  
          my $fres;
  
          my %rargs = (
              riap_server_url => $args{riap_server_url},
              riap_uri        => $args{riap_uri},
              riap_client     => $args{riap_client},
          );
  
          $extras->{parsed_opts} = $cargs{parsed_opts};
  
          if (my $sm = $specmeta->{$ospec}) {
              $cargs{type} = 'optval';
              if ($sm->{arg}) {
                  log_trace("[comp][periscomp] completing option value for a known function argument, arg=<%s>, ospec=<%s>", $sm->{arg}, $ospec);
                  $cargs{arg} = $sm->{arg};
                  my $arg_spec = $args_prop->{$sm->{arg}} or goto RETURN_RES;
                  if ($comp) {
                      log_trace("[comp][periscomp] invoking routine supplied from 'completion' argument");
                      my $compres;
                      eval { $compres = $comp->(%cargs) };
                      log_debug("[comp][periscomp] completion died: $@") if $@;
                      log_trace("[comp][periscomp] result from 'completion' routine: %s", $compres);
                      if ($compres) {
                          $fres = $compres;
                          goto RETURN_RES;
                      }
                  }
                  if ($ospec =~ /\@$/) {
                      $fres = complete_arg_elem(
                          meta=>$meta, arg=>$sm->{arg}, args=>$gares->[2],
                          word=>$word, index=>$cargs{nth}, # XXX correct index
                          extras=>$extras, %rargs);
                      goto RETURN_RES;
                  } elsif ($ospec =~ /\%$/) {
                      if ($word =~ /(.*?)=(.*)/s) {
                          my $key = $1;
                          my $val = $2;
                          $fres = complete_arg_elem(
                              meta=>$meta, arg=>$sm->{arg}, args=>$gares->[2],
                              word=>$val, index=>$key,
                              extras=>$extras, %rargs);
                          modify_answer(answer=>$fres, prefix=>"$key=");
                          goto RETURN_RES;
                      } else {
                          $fres = complete_arg_index(
                              meta=>$meta, arg=>$sm->{arg}, args=>$gares->[2],
                              word=>$word, extras=>$extras, %rargs);
                          modify_answer(answer=>$fres, suffix=>"=");
                          $fres->{path_sep} = "=";
                          # XXX actually not entirely correct, we want normal
                          # escaping but without escaping "=", maybe we should
                          # allow customizing, e.g. esc_mode=normal, dont_esc="="
                          # (list of characters to not escape)
                          $fres->{esc_mode} = "none";
                          goto RETURN_RES;
                      }
                  } else {
                      $fres = complete_arg_val(
                          meta=>$meta, arg=>$sm->{arg}, args=>$gares->[2],
                          word=>$word, extras=>$extras, %rargs);
                      goto RETURN_RES;
                  }
              } else {
                  log_trace("[comp][periscomp] completing option value for a common option, ospec=<%s>", $ospec);
                  $cargs{arg}  = undef;
                  my $codata = $copts_by_ospec->{$ospec};
                  if ($comp) {
                      log_trace("[comp][periscomp] invoking routine supplied from 'completion' argument");
                      my $res;
                      eval { $res = $comp->(%cargs) };
                      log_debug("[comp][periscomp] completion died: $@") if $@;
                      if ($res) {
                          $fres = $res;
                          goto RETURN_RES;
                      }
                  }
                  if ($codata->{completion}) {
                      $cargs{arg}  = undef;
                      log_trace("[comp][periscomp] completing with common option's 'completion' property");
                      my $res;
                      eval { $res = $codata->{completion}->(%cargs) };
                      log_debug("[comp][periscomp] completion died: $@") if $@;
                      if ($res) {
                          $fres = $res;
                          goto RETURN_RES;
                      }
                  }
                  if ($codata->{schema}) {
                      require Data::Sah::Normalize;
                      my $nsch = Data::Sah::Normalize::normalize_schema(
                          $codata->{schema});
                      log_trace("[comp][periscomp] completing with common option's schema");
                      $fres = complete_from_schema(
                          schema => $nsch, word=>$word,
                          schema_is_normalized=>1,
                      );
                      goto RETURN_RES;
                  }
                  goto RETURN_RES;
              }
          } elsif ($type eq 'arg') {
              log_trace("[comp][periscomp] completing argument #%d", $cargs{argpos});
              $cargs{type} = 'arg';
  
              my $pos = $cargs{argpos};
              my $fasa = $args{func_arg_starts_at} // 0;
  
              # find if there is a non-slurpy argument with the exact position
              for my $an (keys %$args_prop) {
                  my $arg_spec = $args_prop->{$an};
                  next unless !($arg_spec->{slurpy} // $arg_spec->{greedy}) &&
                      defined($arg_spec->{pos}) && $arg_spec->{pos} == $pos - $fasa;
                  log_trace("[comp][periscomp] this argument position is for non-slurpy function argument <%s>", $an);
                  $cargs{arg} = $an;
                  if ($comp) {
                      log_trace("[comp][periscomp] invoking routine supplied from 'completion' argument");
                      my $res;
                      eval { $res = $comp->(%cargs) };
                      log_debug("[comp][periscomp] completion died: $@") if $@;
                      if ($res) {
                          $fres = $res;
                          goto RETURN_RES;
                      }
                  }
                  $fres = complete_arg_val(
                      meta=>$meta, arg=>$an, args=>$gares->[2],
                      word=>$word, extras=>$extras, %rargs);
                  goto RETURN_RES;
              }
  
              # find if there is a slurpy argument which takes elements at that
              # position
              for my $an (sort {
                  ($args_prop->{$b}{pos} // 9999) <=> ($args_prop->{$a}{pos} // 9999)
              } keys %$args_prop) {
                  my $arg_spec = $args_prop->{$an};
                  next unless ($arg_spec->{slurpy} // $arg_spec->{greedy}) &&
                      defined($arg_spec->{pos}) && $arg_spec->{pos} <= $pos - $fasa;
                  my $index = $pos - $fasa - $arg_spec->{pos};
                  $cargs{arg} = $an;
                  $cargs{index} = $index;
                  log_trace("[comp][periscomp] this position is for slurpy function argument <%s>'s element[%d]", $an, $index);
                  if ($comp) {
                      log_trace("[comp][periscomp] invoking routine supplied from 'completion' argument");
                      my $res;
                      eval { $res = $comp->(%cargs) };
                      log_debug("[comp][periscomp] completion died: $@") if $@;
                      if ($res) {
                          $fres = $res;
                          goto RETURN_RES;
                      }
                  }
                  $fres = complete_arg_elem(
                      meta=>$meta, arg=>$an, args=>$gares->[2],
                      word=>$word, index=>$index, extras=>$extras, %rargs);
                  goto RETURN_RES;
              }
  
              log_trace("[comp][periscomp] there is no matching function argument at this position");
              if ($comp) {
                  log_trace("[comp][periscomp] invoking routine supplied from 'completion' argument");
                  my $res;
                  eval { $res = $comp->(%cargs) };
                  log_debug("[comp][periscomp] completion died: $@") if $@;
                  if ($res) {
                      $fres = $res;
                      goto RETURN_RES;
                  }
              }
              goto RETURN_RES;
          } else {
              log_trace("[comp][periscomp] completing option value for an unknown/ambiguous option, declining ...");
              # decline because there's nothing in Rinci metadata that can aid us
              goto RETURN_RES;
          }
        RETURN_RES:
          log_trace("[comp][periscomp] leaving completion routine (that we supply to Complete::Getopt::Long)");
          $fres;
      }; # completion routine
  
      $fres = Complete::Getopt::Long::complete_cli_arg(
          getopt_spec => $gospec,
          words       => $words,
          cword       => $cword,
          completion  => $compgl_comp,
          extras      => $extras,
      );
  
    RETURN_RES:
      log_trace('[comp][periscomp] leaving %s(), result=%s',
                   $fname, $fres);
      $fres;
  }
  
  1;
  # ABSTRACT: Complete command-line argument using Rinci metadata
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Perinci::Sub::Complete - Complete command-line argument using Rinci metadata
  
  =head1 VERSION
  
  This document describes version 0.942 of Perinci::Sub::Complete (from Perl distribution Perinci-Sub-Complete), released on 2020-03-04.
  
  =head1 SYNOPSIS
  
  See L<Perinci::CmdLine> or L<Perinci::CmdLine::Lite> or L<App::riap> which use
  this module.
  
  =head1 DESCRIPTION
  
  =head1 FUNCTIONS
  
  
  =head2 complete_arg_elem
  
  Usage:
  
   complete_arg_elem(%args) -> array
  
  Given argument name and function metadata, complete array element.
  
  Will attempt to complete using the completion routine specified in the argument
  specification (the C<completion> property, or in the case of C<complete_arg_elem>
  function, the C<element_completion> property), or if that is not specified, from
  argument's schema using C<complete_from_schema>.
  
  Completion routine will get C<%args>, with the following keys:
  
  =over
  
  =item * C<word> (str, the word to be completed)
  
  =item * C<arg> (str, the argument name which value is currently being completed)
  
  =item * C<index (int, only for the>complete_arg_elem` function, the index in the
  argument array that is currently being completed, starts from 0)
  
  =item * C<args> (hash, the argument hash to the function, so far)
  
  =back
  
  as well as extra keys from C<extras> (but these won't overwrite the above
  standard keys).
  
  Completion routine should return a completion answer structure (described in
  L<Complete>) which is either a hash or an array. The simplest form of answer
  is just to return an array of strings. Completion routine can also return undef
  to express declination.
  
  This function is not exported by default, but exportable.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<arg>* => I<str>
  
  Argument name.
  
  =item * B<args> => I<hash>
  
  Collected arguments so far, will be passed to completion routines.
  
  =item * B<extras> => I<hash>
  
  Add extra arguments to completion routine.
  
  The keys from this C<extras> hash will be merged into the final C<%args> passed to
  completion routines. Note that standard keys like C<word>, C<cword>, and so on as
  described in the function description will not be overwritten by this.
  
  =item * B<index> => I<str>
  
  Index of element to complete.
  
  =item * B<meta>* => I<hash>
  
  Rinci function metadata, must be normalized.
  
  =item * B<riap_client> => I<obj>
  
  Optional, to perform complete_arg_val to the server.
  
  When the argument spec in the Rinci metadata contains C<completion> key, this
  means there is custom completion code for that argument. However, if retrieved
  from a remote server, sometimes the C<completion> key no longer contains the code
  (it has been cleansed into a string). Moreover, the completion code needs to run
  on the server.
  
  If supplied this argument and te C<riap_server_url> argument, the function will
  try to request to the server (via Riap request C<complete_arg_val>). Otherwise,
  the function will just give up/decline completing.
  
  =item * B<riap_server_url> => I<str>
  
  Optional, to perform complete_arg_val to the server.
  
  See the C<riap_client> argument.
  
  =item * B<riap_uri> => I<str>
  
  Optional, to perform complete_arg_val to the server.
  
  See the C<riap_client> argument.
  
  =item * B<word> => I<str> (default: "")
  
  Word to be completed.
  
  
  =back
  
  Return value:  (array)
  
  
  
  =head2 complete_arg_index
  
  Usage:
  
   complete_arg_index(%args) -> array
  
  Given argument name and function metadata, complete arg element index.
  
  This is only relevant for arguments which have C<index_completion> property set
  (currently only C<hash> type arguments). When that property is not set, will
  simply return undef.
  
  Completion routine will get C<%args>, with the following keys:
  
  =over
  
  =item * C<word> (str, the word to be completed)
  
  =item * C<arg> (str, the argument name which value is currently being completed)
  
  =item * C<args> (hash, the argument hash to the function, so far)
  
  =back
  
  as well as extra keys from C<extras> (but these won't overwrite the above
  standard keys).
  
  Completion routine should return a completion answer structure (described in
  L<Complete>) which is either a hash or an array. The simplest form of answer
  is just to return an array of strings. Completion routine can also return undef
  to express declination.
  
  This function is not exported by default, but exportable.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<arg>* => I<str>
  
  Argument name.
  
  =item * B<args> => I<hash>
  
  Collected arguments so far, will be passed to completion routines.
  
  =item * B<extras> => I<hash>
  
  Add extra arguments to completion routine.
  
  The keys from this C<extras> hash will be merged into the final C<%args> passed to
  completion routines. Note that standard keys like C<word>, C<cword>, and so on as
  described in the function description will not be overwritten by this.
  
  =item * B<meta>* => I<hash>
  
  Rinci function metadata, must be normalized.
  
  =item * B<riap_client> => I<obj>
  
  Optional, to perform complete_arg_val to the server.
  
  When the argument spec in the Rinci metadata contains C<completion> key, this
  means there is custom completion code for that argument. However, if retrieved
  from a remote server, sometimes the C<completion> key no longer contains the code
  (it has been cleansed into a string). Moreover, the completion code needs to run
  on the server.
  
  If supplied this argument and te C<riap_server_url> argument, the function will
  try to request to the server (via Riap request C<complete_arg_val>). Otherwise,
  the function will just give up/decline completing.
  
  =item * B<riap_server_url> => I<str>
  
  Optional, to perform complete_arg_val to the server.
  
  See the C<riap_client> argument.
  
  =item * B<riap_uri> => I<str>
  
  Optional, to perform complete_arg_val to the server.
  
  See the C<riap_client> argument.
  
  =item * B<word> => I<str> (default: "")
  
  Word to be completed.
  
  
  =back
  
  Return value:  (array)
  
  
  
  =head2 complete_arg_val
  
  Usage:
  
   complete_arg_val(%args) -> array
  
  Given argument name and function metadata, complete value.
  
  Will attempt to complete using the completion routine specified in the argument
  specification (the C<completion> property, or in the case of C<complete_arg_elem>
  function, the C<element_completion> property), or if that is not specified, from
  argument's schema using C<complete_from_schema>.
  
  Completion routine will get C<%args>, with the following keys:
  
  =over
  
  =item * C<word> (str, the word to be completed)
  
  =item * C<arg> (str, the argument name which value is currently being completed)
  
  =item * C<index (int, only for the>complete_arg_elem` function, the index in the
  argument array that is currently being completed, starts from 0)
  
  =item * C<args> (hash, the argument hash to the function, so far)
  
  =back
  
  as well as extra keys from C<extras> (but these won't overwrite the above
  standard keys).
  
  Completion routine should return a completion answer structure (described in
  L<Complete>) which is either a hash or an array. The simplest form of answer
  is just to return an array of strings. Completion routine can also return undef
  to express declination.
  
  This function is not exported by default, but exportable.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<arg>* => I<str>
  
  Argument name.
  
  =item * B<args> => I<hash>
  
  Collected arguments so far, will be passed to completion routines.
  
  =item * B<extras> => I<hash>
  
  Add extra arguments to completion routine.
  
  The keys from this C<extras> hash will be merged into the final C<%args> passed to
  completion routines. Note that standard keys like C<word>, C<cword>, and so on as
  described in the function description will not be overwritten by this.
  
  =item * B<meta>* => I<hash>
  
  Rinci function metadata, must be normalized.
  
  =item * B<riap_client> => I<obj>
  
  Optional, to perform complete_arg_val to the server.
  
  When the argument spec in the Rinci metadata contains C<completion> key, this
  means there is custom completion code for that argument. However, if retrieved
  from a remote server, sometimes the C<completion> key no longer contains the code
  (it has been cleansed into a string). Moreover, the completion code needs to run
  on the server.
  
  If supplied this argument and te C<riap_server_url> argument, the function will
  try to request to the server (via Riap request C<complete_arg_val>). Otherwise,
  the function will just give up/decline completing.
  
  =item * B<riap_server_url> => I<str>
  
  Optional, to perform complete_arg_val to the server.
  
  See the C<riap_client> argument.
  
  =item * B<riap_uri> => I<str>
  
  Optional, to perform complete_arg_val to the server.
  
  See the C<riap_client> argument.
  
  =item * B<word> => I<str> (default: "")
  
  Word to be completed.
  
  
  =back
  
  Return value:  (array)
  
  
  
  =head2 complete_cli_arg
  
  Usage:
  
   complete_cli_arg(%args) -> hash
  
  Complete command-line argument using Rinci function metadata.
  
  This routine uses L<Perinci::Sub::GetArgs::Argv> to generate L<Getopt::Long>
  specification from arguments list in Rinci function metadata and common options.
  Then, it will use L<Complete::Getopt::Long> to complete option names, option
  values, as well as arguments.
  
  This function is not exported by default, but exportable.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<common_opts> => I<hash>
  
  Common options.
  
  A hash where the values are hashes containing these keys: C<getopt> (Getopt::Long
  option specification), C<handler> (Getopt::Long handler). Will be passed to
  C<get_args_from_argv()>. Example:
  
   {
       help => {
           getopt  => 'help|h|?',
           handler => sub { ... },
           summary => 'Display help and exit',
       },
       version => {
           getopt  => 'version|v',
           handler => sub { ... },
           summary => 'Display version and exit',
       },
   }
  
  =item * B<completion> => I<code>
  
  Supply custom completion routine.
  
  If supplied, instead of the default completion routine, this code will be called
  instead. Will receive all arguments that L<Complete::Getopt::Long> will pass,
  and additionally:
  
  =over
  
  =item * C<arg> (str, the name of function argument)
  
  =item * C<args> (hash, the function arguments formed so far)
  
  =item * C<index> (int, if completing argument element value)
  
  =back
  
  =item * B<cword>* => I<int>
  
  On which argument cursor is located (zero-based).
  
  =item * B<extras> => I<hash>
  
  Add extra arguments to completion routine.
  
  The keys from this C<extras> hash will be merged into the final C<%args> passed to
  completion routines. Note that standard keys like C<word>, C<cword>, and so on as
  described in the function description will not be overwritten by this.
  
  =item * B<func_arg_starts_at> => I<int> (default: 0)
  
  This is a (temporary?) workaround for L<Perinci::CmdLine>. In an application
  with subcommands (e.g. C<cmd --verbose subcmd arg0 arg1 ...>), then C<words> will
  still contain the subcommand name. Positional function arguments then start at 1
  not 0. This option allows offsetting function arguments.
  
  =item * B<meta>* => I<hash>
  
  Rinci function metadata.
  
  =item * B<per_arg_json> => I<bool>
  
  Will be passed to Perinci::Sub::GetArgs::Argv.
  
  =item * B<per_arg_yaml> => I<bool>
  
  Will be passed to Perinci::Sub::GetArgs::Argv.
  
  =item * B<riap_client> => I<obj>
  
  Optional, to perform complete_arg_val to the server.
  
  When the argument spec in the Rinci metadata contains C<completion> key, this
  means there is custom completion code for that argument. However, if retrieved
  from a remote server, sometimes the C<completion> key no longer contains the code
  (it has been cleansed into a string). Moreover, the completion code needs to run
  on the server.
  
  If supplied this argument and te C<riap_server_url> argument, the function will
  try to request to the server (via Riap request C<complete_arg_val>). Otherwise,
  the function will just give up/decline completing.
  
  =item * B<riap_server_url> => I<str>
  
  Optional, to perform complete_arg_val to the server.
  
  See the C<riap_client> argument.
  
  =item * B<riap_uri> => I<str>
  
  Optional, to perform complete_arg_val to the server.
  
  See the C<riap_client> argument.
  
  =item * B<words>* => I<array[str]>
  
  Command-line arguments.
  
  
  =back
  
  Return value:  (hash)
  
  
  You can use C<format_completion> function in L<Complete::Bash> module to format
  the result of this function for bash.
  
  
  
  =head2 complete_from_schema
  
  Usage:
  
   complete_from_schema(%args) -> [status, msg, payload, meta]
  
  Complete a value from schema.
  
  Employ some heuristics to complete a value from Sah schema. For example, if
  schema is C<< [str =E<gt> in =E<gt> [qw/new open resolved rejected/]] >>, then we can
  complete from the C<in> clause. Or for something like C<< [int =E<gt> between =E<gt> [1,
  20]] >> we can complete using values from 1 to 20.
  
  This function is not exported by default, but exportable.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<schema>* => I<any>
  
  Will be normalized, unless when C<schema_is_normalized> is set to true, in which
  case schema must already be normalized.
  
  =item * B<schema_is_normalized> => I<bool> (default: 0)
  
  =item * B<word>* => I<str> (default: "")
  
  
  =back
  
  Returns an enveloped result (an array).
  
  First element (status) is an integer containing HTTP status code
  (200 means OK, 4xx caller error, 5xx function error). Second element
  (msg) is a string containing error message, or 'OK' if status is
  200. Third element (payload) is optional, the actual result. Fourth
  element (meta) is called result metadata and is optional, a hash
  that contains extra information.
  
  Return value:  (any)
  
  =for Pod::Coverage ^(.+)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Perinci-Sub-Complete>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Perinci-Sub-Complete>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Perinci-Sub-Complete>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Complete>, L<Complete::Getopt::Long>
  
  L<Perinci::CmdLine>, L<Perinci::CmdLine::Lite>, L<App::riap>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012, 2011 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
PERINCI_SUB_COMPLETE

    $main::fatpacked{"Perinci/Sub/ConvertArgs/Argv.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PERINCI_SUB_CONVERTARGS_ARGV';
  package Perinci::Sub::ConvertArgs::Argv;
  
  our $DATE = '2019-04-15'; # DATE
  our $VERSION = '0.110'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  use Data::Sah::Util::Type qw(is_simple);
  
  use Exporter;
  our @ISA = qw(Exporter);
  our @EXPORT_OK = qw(convert_args_to_argv);
  
  our %SPEC;
  
  sub _json {
      require JSON;
      state $json = JSON->new->allow_nonref;
      $json->encode($_[0]);
  }
  
  sub _encode {
      ref($_[0]) ? _json($_[0]) : $_[0];
  }
  
  $SPEC{convert_args_to_argv} = {
      v => 1.1,
      summary => 'Convert hash arguments to command-line options (and arguments)',
      description => <<'_',
  
  Convert hash arguments to command-line arguments. This is the reverse of
  `Perinci::Sub::GetArgs::Argv::get_args_from_argv`.
  
  Note: currently the function expects schemas in metadata to be normalized
  already.
  
  _
      args => {
          args => {req=>1, schema=>'hash*', pos=>0},
          meta => {req=>0, schema=>'hash*', pos=>1},
          use_pos => {
              summary => 'Whether to use positional arguments',
              schema  => 'bool',
              description => <<'_',
  
  For example, given this metadata:
  
      {
          v => 1.1,
          args => {
            arg1 => {pos=>0, req=>1},
            arg2 => {pos=>1},
            arg3 => {},
          },
      }
  
  then under `use_pos=0` the hash `{arg1=>1, arg2=>2, arg3=>'a b'}` will be
  converted to `['--arg1', 1, '--arg2', 2, '--arg3', 'a b']`. Meanwhile if
  `use_pos=1` the same hash will be converted to `[1, 2, '--arg3', 'a b']`.
  
  _
          },
      },
  };
  sub convert_args_to_argv {
      my %fargs = @_;
  
      my $iargs = $fargs{args} or return [400, "Please specify args"];
      my $meta  = $fargs{meta} // {v=>1.1};
      my $args_prop = $meta->{args} // {};
  
      my $v = $meta->{v} // 1.0;
      return [412, "Sorry, only metadata version 1.1 is supported (yours: $v)"]
          unless $v == 1.1;
  
      my @argv;
      my %iargs = %$iargs; # copy 'coz we will delete them one by one as we fill
  
      if ($fargs{use_pos}) {
          for my $arg (sort {$args_prop->{$a}{pos} <=> $args_prop->{$b}{pos}}
                           grep {defined $args_prop->{$_}{pos}} keys %iargs) {
              my $pos = $args_prop->{$arg}{pos};
              if ($args_prop->{$arg}{slurpy} // $args_prop->{$arg}{greedy}) {
                  my $sch = $args_prop->{$arg}{schema};
                  my $is_array_of_simple = $sch && $sch->[0] eq 'array' &&
                      is_simple($sch->[1]{of} // $sch->[1]{each_elem});
                  for my $el (@{ $iargs{$arg} }) {
                      $argv[$pos] = $is_array_of_simple ? $el : _encode($el);
                      $pos++;
                  }
              } else {
                  $argv[$pos] = _encode($iargs{$arg});
              }
              delete $iargs{$arg};
          }
      }
  
      for (sort keys %iargs) {
          my $sch = $args_prop->{$_}{schema};
          my $is_bool = $sch && $sch->[0] eq 'bool';
          my $is_array_of_simple = $sch && $sch->[0] eq 'array' &&
              $sch->[1]{of} && is_simple($sch->[1]{of});
          my $is_hash_of_simple = $sch && $sch->[0] eq 'hash' &&
              is_simple($sch->[1]{of} // $sch->[1]{each_value} // $sch->[1]{each_elem});
          my $can_be_comma_separated = $is_array_of_simple &&
              $sch->[1]{of}[0] =~ /\A(int|float)\z/; # XXX as well as other simple types that cannot contain commas
          my $opt = $_; $opt =~ s/_/-/g;
          my $dashopt = length($opt) > 1 ? "--$opt" : "-$opt";
          if ($is_bool) {
              if ($iargs{$_}) {
                  push @argv, $dashopt;
              } else {
                  push @argv, "--no$opt";
              }
          } elsif ($can_be_comma_separated) {
              push @argv, "$dashopt", join(",", @{ $iargs{$_} });
          } elsif ($is_array_of_simple) {
              for (@{ $iargs{$_} }) {
                  push @argv, "$dashopt", $_;
              }
          } elsif ($is_hash_of_simple) {
              my $arg = $iargs{$_};
              for (sort keys %$arg) {
                  push @argv, "$dashopt", "$_=$arg->{$_}";
              }
          } else {
              if (ref $iargs{$_}) {
                  push @argv, "$dashopt-json", _encode($iargs{$_});
              } else {
                  push @argv, $dashopt, "$iargs{$_}";
              }
          }
      }
      [200, "OK", \@argv];
  }
  
  1;
  # ABSTRACT: Convert hash arguments to command-line options (and arguments)
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Perinci::Sub::ConvertArgs::Argv - Convert hash arguments to command-line options (and arguments)
  
  =head1 VERSION
  
  This document describes version 0.110 of Perinci::Sub::ConvertArgs::Argv (from Perl distribution Perinci-Sub-ConvertArgs-Argv), released on 2019-04-15.
  
  =head1 SYNOPSIS
  
   use Perinci::Sub::ConvertArgs::Argv qw(convert_args_to_argv);
  
   my $res = convert_args_to_argv(args=>\%args, meta=>$meta, ...);
  
  =head1 FUNCTIONS
  
  
  =head2 convert_args_to_argv
  
  Usage:
  
   convert_args_to_argv(%args) -> [status, msg, payload, meta]
  
  Convert hash arguments to command-line options (and arguments).
  
  Convert hash arguments to command-line arguments. This is the reverse of
  C<Perinci::Sub::GetArgs::Argv::get_args_from_argv>.
  
  Note: currently the function expects schemas in metadata to be normalized
  already.
  
  This function is not exported by default, but exportable.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<args>* => I<hash>
  
  =item * B<meta> => I<hash>
  
  =item * B<use_pos> => I<bool>
  
  Whether to use positional arguments.
  
  For example, given this metadata:
  
   {
       v => 1.1,
       args => {
         arg1 => {pos=>0, req=>1},
         arg2 => {pos=>1},
         arg3 => {},
       },
   }
  
  then under C<use_pos=0> the hash C<< {arg1=E<gt>1, arg2=E<gt>2, arg3=E<gt>'a b'} >> will be
  converted to C<['--arg1', 1, '--arg2', 2, '--arg3', 'a b']>. Meanwhile if
  C<use_pos=1> the same hash will be converted to C<[1, 2, '--arg3', 'a b']>.
  
  =back
  
  Returns an enveloped result (an array).
  
  First element (status) is an integer containing HTTP status code
  (200 means OK, 4xx caller error, 5xx function error). Second element
  (msg) is a string containing error message, or 'OK' if status is
  200. Third element (payload) is optional, the actual result. Fourth
  element (meta) is called result metadata and is optional, a hash
  that contains extra information.
  
  Return value:  (any)
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Perinci-Sub-ConvertArgs-Argv>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Perinci-Sub-ConvertArgs-Argv>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Perinci-Sub-ConvertArgs-Argv>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Perinci::CmdLine>, which uses this module for presenting command-line
  examples.
  
  L<Perinci::Sub::GetArgs::Argv> which does the reverse: converting command-line
  arguments to hash.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2019, 2016, 2015, 2014, 2013 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
PERINCI_SUB_CONVERTARGS_ARGV

    $main::fatpacked{"Perinci/Sub/ConvertArgs/Array.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PERINCI_SUB_CONVERTARGS_ARRAY';
  package Perinci::Sub::ConvertArgs::Array;
  
  our $DATE = '2019-04-15'; # DATE
  our $VERSION = '0.090'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  use Exporter;
  our @ISA = qw(Exporter);
  our @EXPORT_OK = qw(convert_args_to_array);
  
  our %SPEC;
  
  $SPEC{convert_args_to_array} = {
      v => 1.1,
      summary => 'Convert hash arguments to array',
      description => <<'_',
  
  Using information in 'args' property (particularly the 'pos' and 'slurpy' of
  each argument spec), convert hash arguments to array.
  
  Example:
  
      my $meta = {
          v => 1.1,
          summary => 'Multiply 2 numbers (a & b)',
          args => {
              a => ['num*' => {arg_pos=>0}],
              b => ['num*' => {arg_pos=>1}],
          }
      }
  
  then 'convert_args_to_array(args=>{a=>2, b=>3}, meta=>$meta)' will produce:
  
      [200, "OK", [2, 3]]
  
  _
      args => {
          args => {req=>1, schema=>'hash*', pos=>0},
          meta => {req=>1, schema=>'hash*', pos=>1},
      },
  };
  sub convert_args_to_array {
      my %input_args   = @_;
      my $args         = $input_args{args} or return [400, "Please specify args"];
      my $meta         = $input_args{meta} or return [400, "Please specify meta"];
      my $args_prop    = $meta->{args} // {};
  
      my $v = $meta->{v} // 1.0;
      return [412, "Sorry, only metadata version 1.1 is supported (yours: $v)"]
          unless $v == 1.1;
  
      #$log->tracef("-> convert_args_to_array(), args=%s", $args);
  
      my @array;
  
      while (my ($k, $v) = each %$args) {
          next if $k =~ /\A-/; # skip special arguments
          my $as = $args_prop->{$k};
          return [412, "Argument $k: Not specified in args property"] unless $as;
          my $pos = $as->{pos};
          return [412, "Argument $k: No pos specified in arg spec"]
              unless defined $pos;
          if ($as->{slurpy} // $as->{greedy}) {
              $v = [$v] if ref($v) ne 'ARRAY';
              # splice can't work if $pos is beyond array's length
              for (@array .. $pos-1) {
                  $array[$_] = undef;
              }
              splice @array, $pos, 0, @$v;
          } else {
              $array[$pos] = $v;
          }
      }
      [200, "OK", \@array];
  }
  
  1;
  # ABSTRACT: Convert hash arguments to array
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Perinci::Sub::ConvertArgs::Array - Convert hash arguments to array
  
  =head1 VERSION
  
  This document describes version 0.090 of Perinci::Sub::ConvertArgs::Array (from Perl distribution Perinci-Sub-ConvertArgs-Array), released on 2019-04-15.
  
  =head1 SYNOPSIS
  
   use Perinci::Sub::ConvertArgs::Array qw(convert_args_to_array);
  
   my $res = convert_args_to_array(args=>\%args, meta=>$meta, ...);
  
  =head1 DESCRIPTION
  
  This module provides convert_args_to_array() (and
  gencode_convert_args_to_array(), upcoming). This module is used by, among
  others, L<Perinci::Sub::Wrapper>.
  
  =head1 FUNCTIONS
  
  
  =head2 convert_args_to_array
  
  Usage:
  
   convert_args_to_array(%args) -> [status, msg, payload, meta]
  
  Convert hash arguments to array.
  
  Using information in 'args' property (particularly the 'pos' and 'slurpy' of
  each argument spec), convert hash arguments to array.
  
  Example:
  
   my $meta = {
       v => 1.1,
       summary => 'Multiply 2 numbers (a & b)',
       args => {
           a => ['num*' => {arg_pos=>0}],
           b => ['num*' => {arg_pos=>1}],
       }
   }
  
  then 'convert_args_to_array(args=>{a=>2, b=>3}, meta=>$meta)' will produce:
  
   [200, "OK", [2, 3]]
  
  This function is not exported by default, but exportable.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<args>* => I<hash>
  
  =item * B<meta>* => I<hash>
  
  =back
  
  Returns an enveloped result (an array).
  
  First element (status) is an integer containing HTTP status code
  (200 means OK, 4xx caller error, 5xx function error). Second element
  (msg) is a string containing error message, or 'OK' if status is
  200. Third element (payload) is optional, the actual result. Fourth
  element (meta) is called result metadata and is optional, a hash
  that contains extra information.
  
  Return value:  (any)
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Perinci-Sub-ConvertArgs-Array>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Perinci-Sub-ConvertArgs-Array>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Perinci-Sub-ConvertArgs-Array>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2019, 2015, 2014, 2012, 2011 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
PERINCI_SUB_CONVERTARGS_ARRAY

    $main::fatpacked{"Perinci/Sub/DepChecker.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PERINCI_SUB_DEPCHECKER';
  package Perinci::Sub::DepChecker;
  
  use 5.010001;
  use strict;
  use warnings;
  use experimental 'smartmatch';
  #use Log::Any '$log';
  
  require Exporter;
  our @ISA = qw(Exporter);
  our @EXPORT_OK = qw(
                         check_deps
                         dep_satisfy_rel
                         list_mentioned_dep_clauses
                 );
  
  our $VERSION = '0.11'; # VERSION
  our $DATE = '2015-09-03'; # DATE
  
  my $pa;
  
  sub check_deps {
      my ($val) = @_;
      #say "D:check: ", dump($val);
      for my $dname (keys %$val) {
          my $dval = $val->{$dname};
          unless (defined &{"checkdep_$dname"}) {
              # give a chance to load from a module first
              eval { require "Perinci/Sub/Dep/$dname.pm" };
              return "Unknown dependency type: $dname"
                  unless defined &{"checkdep_$dname"};
          }
          my $check = \&{"checkdep_$dname"};
          my $res = $check->($dval);
          if ($res) {
              $res = "$dname: $res";
              return $res;
          }
      }
      "";
  }
  
  sub checkdep_all {
      my ($val) = @_;
      #say "D:check_all: ", dump($val);
      for (@$val) {
          my $res = check_deps($_);
          return "Some dependencies not met: $res" if $res;
      }
      "";
  }
  
  sub checkdep_any {
      my ($val) = @_;
      my $nfail = 0;
      for (@$val) {
          return "" unless check_deps($_);
          $nfail++;
      }
      $nfail ? "None of the dependencies are met" : "";
  }
  
  sub checkdep_none {
      my ($val) = @_;
      for (@$val) {
          my $res = check_deps($_);
          return "A dependency is met when it shouldn't: $res" unless $res;
      }
      "";
  }
  
  sub checkdep_env {
      my ($cval) = @_;
      $ENV{$cval} ? "" : "Environment variable $cval not set/true";
  }
  
  sub checkdep_code {
      my ($cval) = @_;
      $cval->() ? "" : "code doesn't return true value";
  }
  
  sub checkdep_prog {
      my ($cval) = @_;
  
      if ($cval =~ m!/!) {
          return "Program $cval not executable" unless (-x $cval);
      } else {
          require File::Which;
          return "Program $cval not found in PATH (".
              join(":", File::Spec->path).")"
                  unless File::Which::which($cval);
      }
      "";
  }
  
  sub riap_client {
      return $pa if $pa;
      require Perinci::Access;
      $pa = Perinci::Access->new;
      $pa;
  }
  
  sub checkdep_pkg {
      my ($cval) = @_;
      my $res = riap_client->request(info => $cval);
      $res->[0] == 200 or return "Can't perform 'info' Riap request on '$cval': ".
          "$res->[0] $res->[1]";
      $res->[2]{type} eq 'package' or return "$cval is not a Riap package";
      "";
  }
  
  sub checkdep_func {
      my ($cval) = @_;
      my $res = riap_client->request(info => $cval);
      $res->[0] == 200 or return "Can't perform 'info' Riap request on '$cval': ".
          "$res->[0] $res->[1]";
      $res->[2]{type} eq 'function' or return "$cval is not a Riap function";
      "";
  }
  
  # for backward-compatibility
  sub checkdep_exec { checkdep_prog(@_) }
  
  # we check this dep by checking arguments, so we'll let something like
  # Perinci::Sub::Wrapper to do it
  sub checkdep_tmp_dir { "" }
  
  # we check this dep by checking arguments, so we'll let something like
  # Perinci::Sub::Wrapper to do it
  sub checkdep_trash_dir { "" }
  
  # we check this dep by checking arguments, so we'll let something like
  # Perinci::Sub::Wrapper to do it
  sub checkdep_undo_trash_dir { "" }
  
  sub _all_elems_is {
      my ($ary, $el) = @_;
      (grep {$_ eq $el} @$ary) && !(grep {$_ ne $el} @$ary);
  }
  
  sub _all_nonblank_elems_is {
      my ($ary, $el) = @_;
      (grep {$_ eq $el} @$ary) && !(grep {$_ && $_ ne $el} @$ary);
  }
  
  sub dep_satisfy_rel {
      my ($wanted, $deps) = @_;
      #$log->tracef("=> dep_satisfy_rel(%s, %s)", $wanted, $deps);
  
      my $res;
      for my $dname (keys %$deps) {
          my $dval = $deps->{$dname};
  
          if ($dname eq 'all') {
              my @r = map { dep_satisfy_rel($wanted, $_) } @$dval;
              #$log->tracef("all: %s", \@r);
              next unless @r;
              return "impossible" if "impossible" ~~ @r;
              return "impossible" if "must" ~~ @r && "must not" ~~ @r;
              return "must"       if "must" ~~ @r;
              return "must not"   if "must not" ~~ @r;
              return "might"      if _all_nonblank_elems_is(\@r, "might");
          } elsif ($dname eq 'any') {
              my @r = map { dep_satisfy_rel($wanted, $_) } @$dval;
              #$log->tracef("any: %s", \@r);
              next unless @r;
              return "impossible" if "impossible" ~~ @r;
              return "must"       if _all_elems_is(\@r, "must");
              return "must not"   if _all_elems_is(\@r, "must not");
              next                if _all_elems_is(\@r, "");
              return "might";
          } elsif ($dname eq 'none') {
              my @r = map { dep_satisfy_rel($wanted, $_) } @$dval;
              #$log->tracef("none: %s", \@r);
              next unless @r;
              return "impossible" if "impossible" ~~ @r;
              return "impossible" if "must" ~~ @r && "must not" ~~ @r;
              return "must not"   if "must" ~~ @r;
              return "must"       if "must not" ~~ @r;
              return "might"      if _all_nonblank_elems_is(\@r, "might");
          } else {
              return "must" if $dname eq $wanted;
          }
      }
      "";
  }
  
  sub list_mentioned_dep_clauses {
      my ($deps, $res) = @_;
      $res //= [];
      for my $dname (keys %$deps) {
          my $dval = $deps->{$dname};
          push @$res, $dname unless $dname ~~ @$res;
          if ($dname =~ /\A(?:all|any|none)\z/) {
              list_mentioned_dep_clauses($_, $res) for @$dval;
          }
      }
      $res;
  }
  
  1;
  # ABSTRACT: Check dependencies from 'deps' property
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Perinci::Sub::DepChecker - Check dependencies from 'deps' property
  
  =head1 VERSION
  
  This document describes version 0.11 of Perinci::Sub::DepChecker (from Perl distribution Perinci-Sub-DepChecker), released on 2015-09-03.
  
  =head1 SYNOPSIS
  
   use Perinci::Spec::DepChecker qw(check_deps dep_satisfy_rel list_mentioned_dep_clauses);
  
   my $err = check_deps($meta->{deps});
   print "Dependencies not met: $err" if $err;
  
   print "We need to prepare foo"
       if dep_satisfy_rel('foo', $meta->{deps}) =~ /^(?:must|might)$/;
  
  =head1 DESCRIPTION
  
  The 'deps' spec clause adds information about subroutine dependencies. This
  module performs check on it.
  
  This module is currently mainly used by L<Perinci::Sub::Wrapper>.
  
  =for Pod::Coverage ^(checkdep_.*|riap_client)$
  
  =head1 FUNCTIONS
  
  None is exported by default, but every function is exportable.
  
  =head2 check_deps($deps) => ERRSTR
  
  Check dependencies. Will in turn call various C<checkdep_NAME()> subroutines.
  Return empty string if all dependencies are met, or a string containing an error
  message stating a dependency error.
  
  Example:
  
   my $err = check_deps({env=>'DEBUG'});
  
  Will check environment variable C<DEBUG>. If true, will return an empty string.
  Otherwise will set $err with something like C<Environment variable DEBUG not
  set/true>.
  
  Another example:
  
   my $err = check_deps({ all=>[{env=>"A"}, {env=>"B", prog=>"bc"}] });
  
  The above will check environment variables C<A>, C<B>, as well as program C<bc>.
  All dependencies must be met (because we use the C<and> metaclause).
  
  To support a custom dependency named C<NAME>, just define C<checkdep_NAME>
  subroutine in L<Perinci::Sub::DepChecker> package which accepts a value and
  should return an empty string on success or an error message string.
  
  =head2 dep_satisfy_rel($name, $deps) => STR
  
  Check dep satisfication relationship, i.e. whether dependency named C<$name>
  must be satisfied in C<$deps>. Due to B<all>, B<any>, and B<none> clauses, this
  needs to be checked recursively and might yield an inconclusive answer
  ("maybe").
  
  Return "must" if C<$name> definitely must be satisfied in C<$deps>, "must not"
  if definitely not, "" if need not be satisfied (dep clause does not exist in
  deps), "impossible" if condition is impossible to be satisfied (due to
  conflicts), "might" if dep might need to be satisfied (but might also not).
  
  Examples:
  
   dep_satisfy_rel('env', {env=>"A"})              # => "must"
   dep_satisfy_rel('a', {all=>[{a=>1}, {b=>1}]})   # => "must"
   dep_satisfy_rel('a', {b=>2})                    # => ""
   dep_satisfy_rel('a', {none=>[{a=>1}, {b=>1}]})  # => "must not"
   dep_satisfy_rel('c', {none=>[{a=>1}, {b=>1}]})  # => ""
   dep_satisfy_rel('a', {any=>[{a=>1}, {b=>1}]})   # => "might"
   dep_satisfy_rel('a', {all=>[{a=>1},
                               {none=>[{a=>1}]}]}) # => "impossible"
  
  This function is useful if we want to prepare something that "must" or "might"
  be needed, or want to avoid preparing something that "must not" be present.
  
  =head2 list_mentioned_dep_clauses($deps) => ARRAYREF
  
  List all dep clauses mentioned in $deps. The returned array is I<not> sorted
  alphabetically, so you will have to do it yourself if you need it sorted.
  
  Example:
  
   list_mentioned_dep_clauses({any=>[{a=>1}, {b=>1}]}) # => [qw/any a b/]
  
  =head1 SEE ALSO
  
  L<Perinci>
  
  'deps' section in L<Rinci::function>
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Perinci-Sub-DepChecker>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Perinci-Sub-DepChecker>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Perinci-Sub-DepChecker>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2015 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
PERINCI_SUB_DEPCHECKER

    $main::fatpacked{"Perinci/Sub/GetArgs/Argv.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PERINCI_SUB_GETARGS_ARGV';
  package Perinci::Sub::GetArgs::Argv;
  
  our $DATE = '2019-06-26'; # DATE
  our $VERSION = '0.843'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  #use Log::Any '$log';
  
  use Data::Sah::Normalize qw(normalize_schema);
  use Data::Sah::Util::Type qw(is_type is_simple);
  use Getopt::Long::Negate::EN qw(negations_for_option);
  use Getopt::Long::Util qw(parse_getopt_long_opt_spec);
  use List::Util qw(first);
  use Perinci::Sub::GetArgs::Array qw(get_args_from_array);
  use Perinci::Sub::Util qw(err);
  
  use Exporter;
  our @ISA = qw(Exporter);
  our @EXPORT_OK = qw(
                         gen_getopt_long_spec_from_meta
                         get_args_from_argv
                 );
  
  our %SPEC;
  
  $SPEC{':package'} = {
      v => 1.1,
      summary => 'Get subroutine arguments from command line arguments (@ARGV)',
  };
  
  # retun ($success?, $errmsg, $res)
  sub _parse_json {
      my $str = shift;
  
      state $json = do {
          require JSON::PP;
          JSON::PP->new->allow_nonref;
      };
  
      # to rid of those JSON::PP::Boolean objects which currently choke
      # Data::Sah-generated validator code. in the future Data::Sah can be
      # modified to handle those, or we use a fork of JSON::PP which doesn't
      # produce those in the first place (probably only when performance is
      # critical).
      state $cleanser = do {
          if (eval { require Data::Clean::FromJSON; 1 }) {
              Data::Clean::FromJSON->get_cleanser;
          } else {
              undef;
          }
      };
  
      my $res;
      eval { $res = $json->decode($str); $cleanser->clean_in_place($res) if $cleanser };
      my $e = $@;
      return (!$e, $e, $res);
  }
  
  sub _parse_yaml {
      no warnings 'once';
  
      state $yaml_xs_available = do {
          if (eval { require YAML::XS; 1 }) {
              1;
          } else {
              require YAML::Old;
              0;
          }
      };
  
      my $str = shift;
  
      #local $YAML::Syck::ImplicitTyping = 1;
      my $res;
      eval {
          if ($yaml_xs_available) {
              $res = YAML::XS::Load($str);
          } else {
              # YAML::Old is too strict, it requires "--- " header and newline
              # ending
              $str = "--- $str" unless $str =~ /\A--- /;
              $str .= "\n" unless $str =~ /\n\z/;
              $res = YAML::Old::Load($str);
          }
      };
      my $e = $@;
      return (!$e, $e, $res);
  }
  
  sub _arg2opt {
      my $opt = shift;
      $opt =~ s/[^A-Za-z0-9-]+/-/g; # foo.bar_baz becomes --foo-bar-baz
      $opt;
  }
  
  # this subroutine checks whether a schema mentions a coercion rule from simple
  # types (e.g. 'str_comma_sep', etc).
  sub _is_coercible_from_simple {
      my $nsch = shift;
      my $cset = $nsch->[1] or return 0;
      my $rules = $cset->{'x.perl.coerce_rules'} // $cset->{'x.coerce_rules'}
          or return 0;
      for my $rule (@$rules) {
          next unless $rule =~ /\A([^_]+)_/;
          return 1 if is_simple($1);
      }
      0;
  }
  
  sub _is_simple_or_coercible_from_simple {
      my $nsch = shift;
      is_simple($nsch) || _is_coercible_from_simple($nsch);
  }
  
  # this routine's job is to avoid using Data::Sah::Resolve unless it needs to, to
  # reduce startup overhead
  sub _is_simple_or_array_of_simple_or_hash_of_simple {
      my $nsch = shift;
  
      my $is_simple = 0;
      my $is_array_of_simple = 0;
      my $is_hash_of_simple = 0;
      my $eltype;
  
      my $type = $nsch->[0];
      my $cset = $nsch->[1];
  
      {
          # if not known as builtin type, then resolve it first
          unless (is_type($nsch)) {
              require Data::Sah::Resolve;
              my $res = Data::Sah::Resolve::resolve_schema(
                  {merge_clause_sets => 0}, $nsch);
              $type = $res->[0];
              $cset = $res->[1][0] // {};
          }
  
          $is_simple = _is_simple_or_coercible_from_simple([$type, $cset]);
          last if $is_simple;
  
          if ($type eq 'array') {
              my $elnsch = $cset->{of} // $cset->{each_elem};
              last unless $elnsch;
              $elnsch = normalize_schema($elnsch);
              $eltype = $elnsch->[0];
  
              # if not known as builtin type, then resolve it first
              unless (is_type($elnsch)) {
                  require Data::Sah::Resolve;
                  my $res = Data::Sah::Resolve::resolve_schema(
                      {merge_clause_sets => 0}, $elnsch);
                  $elnsch = [$res->[0], $res->[1][0] // {}]; # XXX we only take the first clause set
                  $eltype = $res->[0];
              }
  
              $is_array_of_simple = _is_simple_or_coercible_from_simple($elnsch);
              last;
          }
  
          if ($type eq 'hash') {
              my $elnsch = $cset->{of} // $cset->{each_value} // $cset->{each_elem};
              last unless $elnsch;
              $elnsch = normalize_schema($elnsch);
              $eltype = $elnsch->[0];
  
              # if not known as builtin type, then resolve it first
              unless (is_type($elnsch)) {
                  require Data::Sah::Resolve;
                  my $res = Data::Sah::Resolve::resolve_schema(
                      {merge_clause_sets => 0}, $elnsch);
                  $elnsch = [$res->[0], $res->[1][0] // {}]; # XXX we only take the first clause set
                  $eltype = $res->[0];
              }
  
              $is_hash_of_simple = _is_simple_or_coercible_from_simple($elnsch);
              last;
          }
      }
  
      #{ no warnings 'uninitialized'; say "D:$nsch->[0]: is_simple=<$is_simple>, is_array_of_simple=<$is_array_of_simple>, is_hash_of_simple=<$is_hash_of_simple>, type=<$type>, eltype=<$eltype>" };
      ($is_simple, $is_array_of_simple, $is_hash_of_simple, $type, $cset, $eltype);
  }
  
  # return one or more triplets of Getopt::Long option spec, its parsed structure,
  # and extra stuffs. we do this to avoid having to call
  # parse_getopt_long_opt_spec().
  sub _opt2ospec {
      my ($opt, $schema, $arg_spec) = @_;
      my ($is_simple, $is_array_of_simple, $is_hash_of_simple, $type, $cset, $eltype) =
          _is_simple_or_array_of_simple_or_hash_of_simple($schema);
  
      my (@opts, @types, @isaos, @ishos);
  
      if ($is_array_of_simple || $is_hash_of_simple) {
          my $singular_opt;
          if ($arg_spec && $arg_spec->{'x.name.is_plural'}) {
              if ($arg_spec->{'x.name.singular'}) {
                  $singular_opt = _arg2opt($arg_spec->{'x.name.singular'});
              } else {
                  require Lingua::EN::PluralToSingular;
                  $singular_opt = Lingua::EN::PluralToSingular::to_singular($opt);
              }
          } else {
              $singular_opt = $opt;
          }
          push @opts , $singular_opt;
          push @types, $eltype;
          push @isaos, $is_array_of_simple ? 1:0;
          push @ishos, $is_hash_of_simple  ? 1:0;
      }
  
      if ($is_simple || !@opts) {
          push @opts , $opt;
          push @types, $type;
          push @isaos, 0;
          push @ishos, 0;
      }
  
      my @res;
  
      for my $i (0..$#opts) {
          my $opt   = $opts[$i];
          my $type  = $types[$i];
          my $isaos = $isaos[$i];
          my $ishos = $ishos[$i];
  
          if ($type eq 'bool') {
              if (length $opt == 1) {
                  # single-letter option like -b doesn't get --nob.
                  push @res, ($opt, {opts=>[$opt]}), undef;
              } elsif ($cset->{is} || $cset->{is_true}) {
                  # an always-true bool ('true' or [bool => {is=>1}] or
                  # [bool=>{is_true=>1}] also means it's a flag and should not get
                  # --nofoo.
                  push @res, ($opt, {opts=>[$opt]}), undef;
              } elsif ((defined $cset->{is} && !$cset->{is}) ||
                           (defined $cset->{is_true} && !$cset->{is_true})) {
                  # an always-false bool ('false' or [bool => {is=>0}] or
                  # [bool=>{is_true=>0}] also means it's a flag and should only be
                  # getting --nofoo.
                  for (negations_for_option($opt)) {
                      push @res, $_, {opts=>[$_]}, {is_neg=>1, pos_opts=>[$opt]};
                  }
              } else {
                  # a regular bool gets --foo as well as --nofoo
                  my @negs = negations_for_option($opt);
                  push @res, $opt, {opts=>[$opt]}, {is_neg=>0, neg_opts=>\@negs};
                  for (@negs) {
                      push @res, $_, {opts=>[$_]}, {is_neg=>1, pos_opts=>[$opt]};
                  }
              }
          } elsif ($type eq 'buf') {
              push @res, (
                  "$opt=s", {opts=>[$opt], desttype=>"", type=>"s"}, undef,
                  "$opt-base64=s", {opts=>["$opt-base64"], desttype=>"", type=>"s"}, {is_base64=>1},
              );
          } else {
              my $t = ($type eq 'int' ? 's' : $type eq 'float' ? 's' : 's') .
                  ($isaos ? '@' : $ishos ? '%' : '');
              push @res, ("$opt=$t", {opts=>[$opt], desttype=>"", type=>$t}, undef);
          }
      }
  
      @res;
  }
  
  sub _args2opts {
      my %args = @_;
  
      my $argprefix        = $args{argprefix};
      my $parent_args      = $args{parent_args};
      my $meta             = $args{meta};
      my $seen_opts        = $args{seen_opts};
      my $seen_common_opts = $args{seen_common_opts};
      my $seen_func_opts   = $args{seen_func_opts};
      my $rargs            = $args{rargs};
      my $go_spec          = $args{go_spec};
      my $specmeta         = $args{specmeta};
  
      my $args_prop = $meta->{args} // {};
  
      for my $arg (keys %$args_prop) {
          my $fqarg    = "$argprefix$arg";
          my $arg_spec = $args_prop->{$arg};
          next if grep { $_ eq 'hidden' || $_ eq 'hidden-cli' }
              @{ $arg_spec->{tags} // [] };
          my $sch      = $arg_spec->{schema} // ['any', {}];
          my ($is_simple, $is_array_of_simple, $is_hash_of_simple, $type, $cset, $eltype) =
              _is_simple_or_array_of_simple_or_hash_of_simple($sch);
  
          # XXX normalization of 'of' clause should've been handled by sah itself
          if ($type eq 'array' && $cset->{of}) {
              $cset->{of} = normalize_schema($cset->{of});
          }
          my $opt = _arg2opt($fqarg);
          if ($seen_opts->{$opt}) {
              my $i = 1;
              my $opt2;
              while (1) {
                  $opt2 = "$opt-arg" . ($i > 1 ? $i : '');
                  last unless $seen_opts->{$opt2};
                  $i++;
              }
              $opt = $opt2;
          }
  
          my $stash = {};
  
          # why we use coderefs here? due to Getopt::Long's behavior. when
          # @ARGV=qw() and go_spec is ('foo=s' => \$opts{foo}) then %opts will
          # become (foo=>undef). but if go_spec is ('foo=s' => sub { $opts{foo} =
          # $_[1] }) then %opts will become (), which is what we prefer, so we can
          # later differentiate "unspecified" (exists($opts{foo}) == false) and
          # "specified as undef" (exists($opts{foo}) == true but
          # defined($opts{foo}) == false).
  
          my $handler = sub {
              my ($val, $val_set);
  
              # how many times have been called for this argument?
              my $num_called = ++$stash->{called}{$arg};
  
              # hashify rargs till the end of the handler scope if it happens to
              # be an array (this is the case when we want to fill values using
              # element_meta).
              my $rargs = do {
                  if (ref($rargs) eq 'ARRAY') {
                      $rargs->[$num_called-1] //= {};
                      $rargs->[$num_called-1];
                  } else {
                      $rargs;
                  }
              };
  
              if ($is_simple) {
                  $val_set = 1; $val = $_[1];
                  $rargs->{$arg} = $val;
              } elsif ($is_array_of_simple) {
                  $rargs->{$arg} //= [];
                  $val_set = 1; $val = $_[1];
                  push @{ $rargs->{$arg} }, $val;
              } elsif ($is_hash_of_simple) {
                  $rargs->{$arg} //= {};
                  $val_set = 1; $val = $_[2];
                  $rargs->{$arg}{$_[1]} = $val;
              } else {
                  {
                      my ($success, $e, $decoded);
                      ($success, $e, $decoded) = _parse_json($_[1]);
                      if ($success) {
                          $val_set = 1; $val = $decoded;
                          $rargs->{$arg} = $val;
                          last;
                      }
                      ($success, $e, $decoded) = _parse_yaml($_[1]);
                      if ($success) {
                          $val_set = 1; $val = $decoded;
                          $rargs->{$arg} = $val;
                          last;
                      }
                      die "Invalid YAML/JSON in arg '$fqarg'";
                  }
              }
              if ($val_set && $arg_spec->{cmdline_on_getopt}) {
                  $arg_spec->{cmdline_on_getopt}->(
                      arg=>$arg, fqarg=>$fqarg, value=>$val, args=>$rargs,
                      opt=>$opt,
                  );
              }
          }; # handler
  
          my @triplets = _opt2ospec($opt, $sch, $arg_spec);
          my $aliases_processed;
          while (my ($ospec, $parsed, $extra) = splice @triplets, 0, 3) {
              $extra //= {};
              if ($extra->{is_neg}) {
                  $go_spec->{$ospec} = sub { $handler->($_[0], 0) };
              } elsif (defined $extra->{is_neg}) {
                  $go_spec->{$ospec} = sub { $handler->($_[0], 1) };
              } elsif ($extra->{is_base64}) {
                  $go_spec->{$ospec} = sub {
                      require MIME::Base64;
                      my $decoded = MIME::Base64::decode($_[1]);
                      $handler->($_[0], $decoded);
                  };
              } else {
                  $go_spec->{$ospec} = $handler;
              }
  
              $specmeta->{$ospec} = {arg=>$arg, fqarg=>$fqarg, parsed=>$parsed, %$extra};
              for (@{ $parsed->{opts} }) {
                  $seen_opts->{$_}++; $seen_func_opts->{$_} = $fqarg;
              }
  
              if ($parent_args->{per_arg_json} && !$is_simple) {
                  my $jopt = "$opt-json";
                  if ($seen_opts->{$jopt}) {
                      warn "Clash of option: $jopt, not added";
                  } else {
                      my $jospec = "$jopt=s";
                      my $parsed = {type=>"s", opts=>[$jopt]};
                      $go_spec->{$jospec} = sub {
                          my ($success, $e, $decoded);
                          ($success, $e, $decoded) = _parse_json($_[1]);
                          if ($success) {
                              $rargs->{$arg} = $decoded;
                          } else {
                              die "Invalid JSON in option --$jopt: $_[1]: $e";
                          }
                      };
                      $specmeta->{$jospec} = {arg=>$arg, fqarg=>$fqarg, is_json=>1, parsed=>$parsed, %$extra};
                      $seen_opts->{$jopt}++; $seen_func_opts->{$jopt} = $fqarg;
                  }
              }
              if ($parent_args->{per_arg_yaml} && !$is_simple) {
                  my $yopt = "$opt-yaml";
                  if ($seen_opts->{$yopt}) {
                      warn "Clash of option: $yopt, not added";
                  } else {
                      my $yospec = "$yopt=s";
                      my $parsed = {type=>"s", opts=>[$yopt]};
                      $go_spec->{$yospec} = sub {
                          my ($success, $e, $decoded);
                          ($success, $e, $decoded) = _parse_yaml($_[1]);
                          if ($success) {
                              $rargs->{$arg} = $decoded;
                          } else {
                              die "Invalid YAML in option --$yopt: $_[1]: $e";
                          }
                      };
                      $specmeta->{$yospec} = {arg=>$arg, fqarg=>$fqarg, is_yaml=>1, parsed=>$parsed, %$extra};
                      $seen_opts->{$yopt}++; $seen_func_opts->{$yopt} = $fqarg;
                  }
              }
  
              # parse argv_aliases
              if ($arg_spec->{cmdline_aliases} && !$aliases_processed++) {
                  for my $al (keys %{$arg_spec->{cmdline_aliases}}) {
                      my $alspec = $arg_spec->{cmdline_aliases}{$al};
                      my $alsch = $alspec->{schema} //
                          $alspec->{is_flag} ? [bool=>{req=>1,is=>1}] : $sch;
                      my $altype = $alsch->[0];
                      my $alopt = _arg2opt("$argprefix$al");
                      if ($seen_opts->{$alopt}) {
                          warn "Clash of cmdline_alias option $al";
                          next;
                      }
                      my $alcode = $alspec->{code};
                      my $alospec;
                      my $parsed;
                      if ($alcode && $alsch->[0] eq 'bool') {
                          # bool --alias doesn't get --noalias if has code
                          $alospec = $alopt; # instead of "$alopt!"
                          $parsed = {opts=>[$alopt]};
                      } else {
                          ($alospec, $parsed) = _opt2ospec($alopt, $alsch);
                      }
  
                      if ($alcode) {
                          if ($alcode eq 'CODE') {
                              if ($parent_args->{ignore_converted_code}) {
                                  $alcode = sub {};
                              } else {
                                  return [
                                      501,
                                      join("",
                                           "Code in cmdline_aliases for arg $fqarg ",
                                           "got converted into string, probably ",
                                           "because of JSON/YAML transport"),
                                  ];
                              }
                          }
                          # alias handler
                          $go_spec->{$alospec} = sub {
  
                              # do the same like in arg handler
                              my $num_called = ++$stash->{called}{$arg};
                              my $rargs = do {
                                  if (ref($rargs) eq 'ARRAY') {
                                      $rargs->[$num_called-1] //= {};
                                      $rargs->[$num_called-1];
                                  } else {
                                      $rargs;
                                  }
                              };
  
                              $alcode->($rargs, $_[1]);
                          };
                      } else {
                          $go_spec->{$alospec} = $handler;
                      }
                      $specmeta->{$alospec} = {
                          alias     => $al,
                          is_alias  => 1,
                          alias_for => $ospec,
                          arg       => $arg,
                          fqarg     => $fqarg,
                          is_code   => $alcode ? 1:0,
                          parsed    => $parsed,
                          %$extra,
                      };
                      push @{$specmeta->{$ospec}{($alcode ? '':'non').'code_aliases'}},
                          $alospec;
                      $seen_opts->{$alopt}++; $seen_func_opts->{$alopt} = $fqarg;
                  }
              } # cmdline_aliases
  
              # submetadata
              if ($arg_spec->{meta}) {
                  $rargs->{$arg} = {};
                  my $res = _args2opts(
                      %args,
                      argprefix => "$argprefix$arg\::",
                      meta      => $arg_spec->{meta},
                      rargs     => $rargs->{$arg},
                  );
                  return $res if $res;
              }
  
              # element submetadata
              if ($arg_spec->{element_meta}) {
                  $rargs->{$arg} = [];
                  my $res = _args2opts(
                      %args,
                      argprefix => "$argprefix$arg\::",
                      meta      => $arg_spec->{element_meta},
                      rargs     => $rargs->{$arg},
                  );
                  return $res if $res;
              }
          } # for ospec triplet
  
      } # for arg
  
      undef;
  }
  
  $SPEC{gen_getopt_long_spec_from_meta} = {
      v           => 1.1,
      summary     => 'Generate Getopt::Long spec from Rinci function metadata',
      description => <<'_',
  
  This routine will produce a <pm:Getopt::Long> specification from Rinci function
  metadata, as well as some more data structure in the result metadata to help
  producing a command-line help/usage message.
  
  Function arguments will be mapped to command-line options with the same name,
  with non-alphanumeric characters changed to `-` (`-` is preferred over `_`
  because it lets user avoid pressing Shift on popular keyboards). For example:
  `file_size` becomes `file-size`, `file_size.max` becomes `file-size-max`. If
  function argument option name clashes with command-line option or another
  existing option, it will be renamed to `NAME-arg` (or `NAME-arg2` and so on).
  For example: `help` will become `help-arg` (if `common_opts` contains `help`,
  that is).
  
  Each command-line alias (`cmdline_aliases` property) in the argument
  specification will also be added as command-line option, except if it clashes
  with an existing option, in which case this function will warn and skip adding
  the alias. For more information about `cmdline_aliases`, see `Rinci::function`.
  
  For arguments with type of `bool`, Getopt::Long will by default also
  automatically recognize `--noNAME` or `--no-NAME` in addition to `--name`. So
  this function will also check those names for clashes.
  
  For arguments with type array of simple scalar, `--NAME` can be specified more
  than once to append to the array.
  
  If `per_arg_json` setting is active, and argument's schema is not a "required
  simple scalar" (e.g. an array, or a nullable string), then `--NAME-json` will
  also be added to let users input undef (through `--NAME-json null`) or a
  non-scalar value (e.g. `--NAME-json '[1,2,3]'`). If this name conflicts with
  another existing option, a warning will be displayed and the option will not be
  added.
  
  If `per_arg_yaml` setting is active, and argument's schema is not a "required
  simple scalar" (e.g. an array, or a nullable string), then `--NAME-yaml` will
  also be added to let users input undef (through `--NAME-yaml '~'`) or a
  non-scalar value (e.g. `--NAME-yaml '[foo, bar]'`). If this name conflicts with
  another existing option, a warning will be displayed and the option will not be
  added. YAML can express a larger set of values, e.g. binary data, circular
  references, etc.
  
  Will produce a hash (Getopt::Long spec), with `func.specmeta`, `func.opts`,
  `func.common_opts`, `func.func_opts` that contain extra information
  (`func.specmeta` is a hash of getopt spec name and a hash of extra information
  while `func.*opts` lists all used option names).
  
  _
      args => {
          meta => {
              summary => 'Rinci function metadata',
              schema  => 'hash*',
              req     => 1,
          },
          meta_is_normalized => {
              schema => 'bool*',
          },
          args => {
              summary => 'Reference to hash which will store the result',
              schema  => 'hash*',
          },
          common_opts => {
              summary => 'Common options',
              description => <<'_',
  
  A hash where the values are hashes containing these keys: `getopt` (Getopt::Long
  option specification), `handler` (Getopt::Long handler). Will be passed to
  `get_args_from_argv()`. Example:
  
      {
          help => {
              getopt  => 'help|h|?',
              handler => sub { ... },
              summary => 'Display help and exit',
          },
          version => {
              getopt  => 'version|v',
              handler => sub { ... },
              summary => 'Display version and exit',
          },
      }
  
  _
              schema => ['hash*'],
          },
          per_arg_json => {
              summary => 'Whether to add --NAME-json for non-simple arguments',
              schema  => 'bool',
              default => 0,
              description => <<'_',
  
  Will also interpret command-line arguments as JSON if assigned to function
  arguments, if arguments' schema is not simple scalar.
  
  _
          },
          per_arg_yaml => {
              summary => 'Whether to add --NAME-yaml for non-simple arguments',
              schema  => 'bool',
              default => 0,
              description => <<'_',
  
  Will also interpret command-line arguments as YAML if assigned to function
  arguments, if arguments' schema is not simple scalar.
  
  _
          },
          ignore_converted_code => {
              summary => 'Whether to ignore coderefs converted to string',
              schema => 'bool',
              default => 0,
              description => <<'_',
  
  Across network through JSON encoding, coderef in metadata (e.g. in
  `cmdline_aliases` property) usually gets converted to string `CODE`. In some
  cases, like for tab completion, this is pretty harmless so you can turn this
  option on. For example, in the case of `cmdline_aliases`, the effect is just
  that command-line aliases code are not getting executed, but this is usually
  okay.
  
  _
          },
      },
  };
  sub gen_getopt_long_spec_from_meta {
      my %fargs = @_;
  
      my $meta       = $fargs{meta} or return [400, "Please specify meta"];
      unless ($fargs{meta_is_normalized}) {
          require Perinci::Sub::Normalize;
          $meta = Perinci::Sub::Normalize::normalize_function_metadata($meta);
      }
      my $co           = $fargs{common_opts} // {};
      my $per_arg_yaml = $fargs{per_arg_yaml} // 0;
      my $per_arg_json = $fargs{per_arg_json} // 0;
      my $ignore_converted_code = $fargs{ignore_converted_code};
      my $rargs        = $fargs{args} // {};
  
      my %go_spec;
      my %specmeta; # key = option spec, val = hash of extra info
      my %seen_opts;
      my %seen_common_opts;
      my %seen_func_opts;
  
      for my $k (keys %$co) {
          my $v = $co->{$k};
          my $ospec   = $v->{getopt};
          my $handler = $v->{handler};
          my $res = parse_getopt_long_opt_spec($ospec)
              or return [400, "Can't parse common opt spec '$ospec'"];
          $go_spec{$ospec} = $handler;
          $specmeta{$ospec} = {common_opt=>$k, arg=>undef, parsed=>$res};
          for (@{ $res->{opts} }) {
              return [412, "Clash of common opt '$_'"] if $seen_opts{$_};
              $seen_opts{$_}++; $seen_common_opts{$_} = $ospec;
              if ($res->{is_neg}) {
                  $seen_opts{"no$_"}++ ; $seen_common_opts{"no$_"}  = $ospec;
                  $seen_opts{"no-$_"}++; $seen_common_opts{"no-$_"} = $ospec;
              }
          }
      }
  
      my $res = _args2opts(
          argprefix        => "",
          parent_args      => \%fargs,
          meta             => $meta,
          seen_opts        => \%seen_opts,
          seen_common_opts => \%seen_common_opts,
          seen_func_opts   => \%seen_func_opts,
          rargs            => $rargs,
          go_spec          => \%go_spec,
          specmeta         => \%specmeta,
      );
      return $res if $res;
  
      my $opts        = [sort(map {length($_)>1 ? "--$_":"-$_"} keys %seen_opts)];
      my $common_opts = [sort(map {length($_)>1 ? "--$_":"-$_"} keys %seen_common_opts)];
      my $func_opts   = [sort(map {length($_)>1 ? "--$_":"-$_"} keys %seen_func_opts)];
      my $opts_by_common = {};
      for my $k (keys %$co) {
          my $v = $co->{$k};
          my $ospec = $v->{getopt};
          my @opts;
          for (keys %seen_common_opts) {
              next unless $seen_common_opts{$_} eq $ospec;
              push @opts, (length($_)>1 ? "--$_":"-$_");
          }
          $opts_by_common->{$ospec} = [sort @opts];
      }
  
      my $opts_by_arg = {};
      for (keys %seen_func_opts) {
          my $fqarg = $seen_func_opts{$_};
          push @{ $opts_by_arg->{$fqarg} }, length($_)>1 ? "--$_":"-$_";
      }
      for (keys %$opts_by_arg) {
          $opts_by_arg->{$_} = [sort @{ $opts_by_arg->{$_} }];
      }
  
      [200, "OK", \%go_spec,
       {
           "func.specmeta"       => \%specmeta,
           "func.opts"           => $opts,
           "func.common_opts"    => $common_opts,
           "func.func_opts"      => $func_opts,
           "func.opts_by_arg"    => $opts_by_arg,
           "func.opts_by_common" => $opts_by_common,
       }];
  }
  
  $SPEC{get_args_from_argv} = {
      v => 1.1,
      summary => 'Get subroutine arguments (%args) from command-line arguments '.
          '(@ARGV)',
      description => <<'_',
  
  Using information in Rinci function metadata's `args` property, parse command
  line arguments `@argv` into hash `%args`, suitable for passing into subroutines.
  
  Currently uses <pm:Getopt::Long>'s `GetOptions` to do the parsing.
  
  As with GetOptions, this function modifies its `argv` argument, so you might
  want to copy the original `argv` first (or pass a copy instead) if you want to
  preserve the original.
  
  See also: gen_getopt_long_spec_from_meta() which is the routine that generates
  the specification.
  
  _
      args => {
          argv => {
              schema => ['array*' => {
                  of => 'str*',
              }],
              description => 'If not specified, defaults to @ARGV',
          },
          args => {
              summary => 'Specify input args, with some arguments preset',
              schema  => ['hash'],
          },
          meta => {
              schema => ['hash*' => {}],
              req => 1,
          },
          meta_is_normalized => {
              summary => 'Can be set to 1 if your metadata is normalized, '.
                  'to avoid duplicate effort',
              schema => 'bool',
              default => 0,
          },
          strict => {
              schema => ['bool' => {default=>1}],
              summary => 'Strict mode',
              description => <<'_',
  
  If set to 0, will still return parsed argv even if there are parsing errors
  (reported by Getopt::Long). If set to 1 (the default), will die upon error.
  
  Normally you would want to use strict mode, for more error checking. Setting off
  strict is used by, for example, Perinci::Sub::Complete during completion where
  the command-line might still be incomplete.
  
  Should probably be named `ignore_errors`. :-)
  
  _
          },
          per_arg_yaml => {
              schema => ['bool' => {default=>0}],
              summary => 'Whether to recognize --ARGNAME-yaml',
              description => <<'_',
  
  This is useful for example if you want to specify a value which is not
  expressible from the command-line, like 'undef'.
  
      % script.pl --name-yaml '~'
  
  See also: per_arg_json. You should enable just one instead of turning on both.
  
  _
          },
          per_arg_json => {
              schema => ['bool' => {default=>0}],
              summary => 'Whether to recognize --ARGNAME-json',
              description => <<'_',
  
  This is useful for example if you want to specify a value which is not
  expressible from the command-line, like 'undef'.
  
      % script.pl --name-json 'null'
  
  But every other string will need to be quoted:
  
      % script.pl --name-json '"foo"'
  
  See also: per_arg_yaml. You should enable just one instead of turning on both.
  
  _
          },
          common_opts => {
              summary => 'Common options',
              description => <<'_',
  
  A hash where the values are hashes containing these keys: `getopt` (Getopt::Long
  option specification), `handler` (Getopt::Long handler). Will be passed to
  `get_args_from_argv()`. Example:
  
      {
          help => {
              getopt  => 'help|h|?',
              handler => sub { ... },
              summary => 'Display help and exit',
          },
          version => {
              getopt  => 'version|v',
              handler => sub { ... },
              summary => 'Display version and exit',
          },
      }
  
  _
              schema => ['hash*'],
          },
          allow_extra_elems => {
              schema => ['bool' => {default=>0}],
              summary => 'Allow extra/unassigned elements in argv',
              description => <<'_',
  
  If set to 1, then if there are array elements unassigned to one of the
  arguments, instead of generating an error, this function will just ignore them.
  
  This option will be passed to Perinci::Sub::GetArgs::Array's allow_extra_elems.
  
  _
          },
          on_missing_required_args => {
              schema => 'code',
              summary => 'Execute code when there is missing required args',
              description => <<'_',
  
  This can be used to give a chance to supply argument value from other sources if
  not specified by command-line options. Perinci::CmdLine, for example, uses this
  hook to supply value from STDIN or file contents (if argument has `cmdline_src`
  specification key set).
  
  This hook will be called for each missing argument. It will be supplied hash
  arguments: (arg => $the_missing_argument_name, args =>
  $the_resulting_args_so_far, spec => $the_arg_spec).
  
  The hook can return true if it succeeds in making the missing situation
  resolved. In this case, this function will not report the argument as missing.
  
  _
          },
          ignore_converted_code => {
              summary => 'Whether to ignore coderefs converted to string',
              schema => 'bool',
              default => 0,
              description => <<'_',
  
  Across network through JSON encoding, coderef in metadata (e.g. in
  `cmdline_aliases` property) usually gets converted to string `CODE`. In some
  cases, like for tab completion, this is harmless so you can turn this option on.
  
  _
          },
          ggls_res => {
              summary => 'Full result from gen_getopt_long_spec_from_meta()',
              schema  => 'array*', # XXX envres
              description => <<'_',
  
  If you already call `gen_getopt_long_spec_from_meta()`, you can pass the _full_ enveloped result
  here, to avoid calculating twice.
  
  _
              tags => ['category:optimization'],
          },
      },
      result => {
          description => <<'_',
  
  Error codes:
  
  * 400 - Error in Getopt::Long option specification, e.g. in common_opts.
  
  * 500 - failure in GetOptions, meaning argv is not valid according to metadata
    specification (only if 'strict' mode is enabled).
  
  * 501 - coderef in cmdline_aliases got converted into a string, probably because
    the metadata was transported (e.g. through Riap::HTTP/Riap::Simple).
  
  _
      },
  };
  sub get_args_from_argv {
      require Getopt::Long;
  
      my %fargs = @_;
      my $argv       = $fargs{argv} // \@ARGV;
      my $meta       = $fargs{meta} or return [400, "Please specify meta"];
      unless ($fargs{meta_is_normalized}) {
          require Perinci::Sub::Normalize;
          $meta = Perinci::Sub::Normalize::normalize_function_metadata($meta);
      }
      my $strict            = $fargs{strict} // 1;
      my $common_opts       = $fargs{common_opts} // {};
      my $per_arg_yaml      = $fargs{per_arg_yaml} // 0;
      my $per_arg_json      = $fargs{per_arg_json} // 0;
      my $allow_extra_elems = $fargs{allow_extra_elems} // 0;
      my $on_missing        = $fargs{on_missing_required_args};
      my $ignore_converted_code = $fargs{ignore_converted_code};
      #$log->tracef("-> get_args_from_argv(), argv=%s", $argv);
  
      # to store the resulting args
      my $rargs = $fargs{args} // {};
  
      # 1. first we generate Getopt::Long spec
      my $genres = $fargs{ggls_res} // gen_getopt_long_spec_from_meta(
          meta => $meta, meta_is_normalized => 1,
          args => $rargs,
          common_opts  => $common_opts,
          per_arg_json => $per_arg_json,
          per_arg_yaml => $per_arg_yaml,
          ignore_converted_code => $ignore_converted_code,
      );
      return err($genres->[0], "Can't generate Getopt::Long spec", $genres)
          if $genres->[0] != 200;
      my $go_spec = $genres->[2];
  
      # 2. then we run GetOptions to fill $rargs from command-line opts
      #$log->tracef("GetOptions spec: %s", \@go_spec);
      {
          local $SIG{__WARN__} = sub{} if !$strict;
          my $old_go_conf = Getopt::Long::Configure(
              $strict ? "no_pass_through" : "pass_through",
              "no_ignore_case", "permute", "no_getopt_compat", "gnu_compat", "bundling");
          my $res = Getopt::Long::GetOptionsFromArray($argv, %$go_spec);
          Getopt::Long::Configure($old_go_conf);
          unless ($res) {
              return [500, "GetOptions failed"] if $strict;
          }
      }
  
      # 3. then we try to fill $rargs from remaining command-line arguments (for
      # args which have 'pos' spec specified)
  
      my $args_prop = $meta->{args};
  
      if (@$argv) {
          my $res = get_args_from_array(
              array=>$argv, meta => $meta,
              meta_is_normalized => 1,
              allow_extra_elems => $allow_extra_elems,
          );
          if ($res->[0] != 200 && $strict) {
              return err(500, "Get args from array failed", $res);
          } elsif ($strict && $res->[0] != 200) {
              return err("Can't get args from argv", $res);
          } elsif ($res->[0] == 200) {
              my $pos_args = $res->[2];
              for my $name (keys %$pos_args) {
                  my $arg_spec = $args_prop->{$name};
                  my $val      = $pos_args->{$name};
                  if (exists $rargs->{$name}) {
                      return [400, "You specified option --$name but also ".
                                  "argument #".$arg_spec->{pos}] if $strict;
                  }
                  my ($is_simple, $is_array_of_simple, $is_hash_of_simple, $type, $cset, $eltype) =
                      _is_simple_or_array_of_simple_or_hash_of_simple($arg_spec->{schema});
  
                  if (($arg_spec->{slurpy} // $arg_spec->{greedy}) && ref($val) eq 'ARRAY' &&
                          !$is_array_of_simple && !$is_hash_of_simple) {
                      my $i = 0;
                      for (@$val) {
                        TRY_PARSING_AS_JSON_YAML:
                          {
                              my ($success, $e, $decoded);
                              if ($per_arg_json) {
                                  ($success, $e, $decoded) = _parse_json($_);
                                  if ($success) {
                                      $_ = $decoded;
                                      last TRY_PARSING_AS_JSON_YAML;
                                  } else {
                                      warn "Failed trying to parse argv #$i as JSON: $e";
                                  }
                              }
                              if ($per_arg_yaml) {
                                  ($success, $e, $decoded) = _parse_yaml($_);
                                  if ($success) {
                                      $_ = $decoded;
                                      last TRY_PARSING_AS_JSON_YAML;
                                  } else {
                                      warn "Failed trying to parse argv #$i as YAML: $e";
                                  }
                              }
                          }
                          $i++;
                      }
                  }
                  if (!($arg_spec->{slurpy} // $arg_spec->{greedy}) && !$is_simple) {
                    TRY_PARSING_AS_JSON_YAML:
                      {
                          my ($success, $e, $decoded);
                          if ($per_arg_json) {
                              ($success, $e, $decoded) = _parse_json($val);
                              if ($success) {
                                  $val = $decoded;
                                  last TRY_PARSING_AS_JSON_YAML;
                              } else {
                                  warn "Failed trying to parse argv #$arg_spec->{pos} as JSON: $e";
                              }
                          }
                          if ($per_arg_yaml) {
                              ($success, $e, $decoded) = _parse_yaml($val);
                              if ($success) {
                                  $val = $decoded;
                                  last TRY_PARSING_AS_JSON_YAML;
                              } else {
                                  warn "Failed trying to parse argv #$arg_spec->{pos} as YAML: $e";
                              }
                          }
                      }
                  }
                  $rargs->{$name} = $val;
                  # we still call cmdline_on_getopt for this
                  if ($arg_spec->{cmdline_on_getopt}) {
                      if ($arg_spec->{slurpy} // $arg_spec->{greedy}) {
                          $arg_spec->{cmdline_on_getopt}->(
                              arg=>$name, fqarg=>$name, value=>$_, args=>$rargs,
                              opt=>undef, # this marks that value is retrieved from cmdline arg
                          ) for @$val;
                      } else {
                          $arg_spec->{cmdline_on_getopt}->(
                              arg=>$name, fqarg=>$name, value=>$val, args=>$rargs,
                              opt=>undef, # this marks that value is retrieved from cmdline arg
                          );
                      }
                  }
              }
          }
      }
  
      # 4. check missing required args
  
      my %missing_args;
      for my $arg (keys %$args_prop) {
          my $arg_spec = $args_prop->{$arg};
          if (!exists($rargs->{$arg})) {
              next unless $arg_spec->{req};
              # give a chance to hook to set missing arg
              if ($on_missing) {
                  next if $on_missing->(arg=>$arg, args=>$rargs, spec=>$arg_spec);
              }
              next if exists $rargs->{$arg};
              $missing_args{$arg} = 1;
          }
      }
  
      # 5. check 'deps', currently we only support 'arg' dep type
      {
          last unless $strict;
  
          for my $arg (keys %$args_prop) {
              my $arg_spec = $args_prop->{$arg};
              next unless exists $rargs->{$arg};
              next unless $arg_spec->{deps};
              my $dep_arg = $arg_spec->{deps}{arg};
              next unless $dep_arg;
              return [400, "You specify '$arg', but don't specify '$dep_arg' ".
                          "(upon which '$arg' depends)"]
                  unless exists $rargs->{$dep_arg};
          }
      }
  
      #$log->tracef("<- get_args_from_argv(), args=%s, remaining argv=%s",
      #             $rargs, $argv);
      [200, "OK", $rargs, {
          "func.missing_args" => [sort keys %missing_args],
          "func.gen_getopt_long_spec_result" => $genres,
      }];
  }
  
  1;
  # ABSTRACT: Get subroutine arguments from command line arguments (@ARGV)
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Perinci::Sub::GetArgs::Argv - Get subroutine arguments from command line arguments (@ARGV)
  
  =head1 VERSION
  
  This document describes version 0.843 of Perinci::Sub::GetArgs::Argv (from Perl distribution Perinci-Sub-GetArgs-Argv), released on 2019-06-26.
  
  =head1 SYNOPSIS
  
   use Perinci::Sub::GetArgs::Argv;
  
   my $res = get_args_from_argv(argv=>\@ARGV, meta=>$meta, ...);
  
  =head1 DESCRIPTION
  
  This module provides C<get_args_from_argv()>, which parses command line
  arguments (C<@ARGV>) into subroutine arguments (C<%args>). This module is used
  by L<Perinci::CmdLine>. For explanation on how command-line options are
  processed, see Perinci::CmdLine's documentation.
  
  =head1 FUNCTIONS
  
  
  =head2 gen_getopt_long_spec_from_meta
  
  Usage:
  
   gen_getopt_long_spec_from_meta(%args) -> [status, msg, payload, meta]
  
  Generate Getopt::Long spec from Rinci function metadata.
  
  This routine will produce a L<Getopt::Long> specification from Rinci function
  metadata, as well as some more data structure in the result metadata to help
  producing a command-line help/usage message.
  
  Function arguments will be mapped to command-line options with the same name,
  with non-alphanumeric characters changed to C<-> (C<-> is preferred over C<_>
  because it lets user avoid pressing Shift on popular keyboards). For example:
  C<file_size> becomes C<file-size>, C<file_size.max> becomes C<file-size-max>. If
  function argument option name clashes with command-line option or another
  existing option, it will be renamed to C<NAME-arg> (or C<NAME-arg2> and so on).
  For example: C<help> will become C<help-arg> (if C<common_opts> contains C<help>,
  that is).
  
  Each command-line alias (C<cmdline_aliases> property) in the argument
  specification will also be added as command-line option, except if it clashes
  with an existing option, in which case this function will warn and skip adding
  the alias. For more information about C<cmdline_aliases>, see C<Rinci::function>.
  
  For arguments with type of C<bool>, Getopt::Long will by default also
  automatically recognize C<--noNAME> or C<--no-NAME> in addition to C<--name>. So
  this function will also check those names for clashes.
  
  For arguments with type array of simple scalar, C<--NAME> can be specified more
  than once to append to the array.
  
  If C<per_arg_json> setting is active, and argument's schema is not a "required
  simple scalar" (e.g. an array, or a nullable string), then C<--NAME-json> will
  also be added to let users input undef (through C<--NAME-json null>) or a
  non-scalar value (e.g. C<--NAME-json '[1,2,3]'>). If this name conflicts with
  another existing option, a warning will be displayed and the option will not be
  added.
  
  If C<per_arg_yaml> setting is active, and argument's schema is not a "required
  simple scalar" (e.g. an array, or a nullable string), then C<--NAME-yaml> will
  also be added to let users input undef (through C<--NAME-yaml '~'>) or a
  non-scalar value (e.g. C<--NAME-yaml '[foo, bar]'>). If this name conflicts with
  another existing option, a warning will be displayed and the option will not be
  added. YAML can express a larger set of values, e.g. binary data, circular
  references, etc.
  
  Will produce a hash (Getopt::Long spec), with C<func.specmeta>, C<func.opts>,
  C<func.common_opts>, C<func.func_opts> that contain extra information
  (C<func.specmeta> is a hash of getopt spec name and a hash of extra information
  while C<func.*opts> lists all used option names).
  
  This function is not exported by default, but exportable.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<args> => I<hash>
  
  Reference to hash which will store the result.
  
  =item * B<common_opts> => I<hash>
  
  Common options.
  
  A hash where the values are hashes containing these keys: C<getopt> (Getopt::Long
  option specification), C<handler> (Getopt::Long handler). Will be passed to
  C<get_args_from_argv()>. Example:
  
   {
       help => {
           getopt  => 'help|h|?',
           handler => sub { ... },
           summary => 'Display help and exit',
       },
       version => {
           getopt  => 'version|v',
           handler => sub { ... },
           summary => 'Display version and exit',
       },
   }
  
  =item * B<ignore_converted_code> => I<bool> (default: 0)
  
  Whether to ignore coderefs converted to string.
  
  Across network through JSON encoding, coderef in metadata (e.g. in
  C<cmdline_aliases> property) usually gets converted to string C<CODE>. In some
  cases, like for tab completion, this is pretty harmless so you can turn this
  option on. For example, in the case of C<cmdline_aliases>, the effect is just
  that command-line aliases code are not getting executed, but this is usually
  okay.
  
  =item * B<meta>* => I<hash>
  
  Rinci function metadata.
  
  =item * B<meta_is_normalized> => I<bool>
  
  =item * B<per_arg_json> => I<bool> (default: 0)
  
  Whether to add --NAME-json for non-simple arguments.
  
  Will also interpret command-line arguments as JSON if assigned to function
  arguments, if arguments' schema is not simple scalar.
  
  =item * B<per_arg_yaml> => I<bool> (default: 0)
  
  Whether to add --NAME-yaml for non-simple arguments.
  
  Will also interpret command-line arguments as YAML if assigned to function
  arguments, if arguments' schema is not simple scalar.
  
  =back
  
  Returns an enveloped result (an array).
  
  First element (status) is an integer containing HTTP status code
  (200 means OK, 4xx caller error, 5xx function error). Second element
  (msg) is a string containing error message, or 'OK' if status is
  200. Third element (payload) is optional, the actual result. Fourth
  element (meta) is called result metadata and is optional, a hash
  that contains extra information.
  
  Return value:  (any)
  
  
  
  =head2 get_args_from_argv
  
  Usage:
  
   get_args_from_argv(%args) -> [status, msg, payload, meta]
  
  Get subroutine arguments (%args) from command-line arguments (@ARGV).
  
  Using information in Rinci function metadata's C<args> property, parse command
  line arguments C<@argv> into hash C<%args>, suitable for passing into subroutines.
  
  Currently uses L<Getopt::Long>'s C<GetOptions> to do the parsing.
  
  As with GetOptions, this function modifies its C<argv> argument, so you might
  want to copy the original C<argv> first (or pass a copy instead) if you want to
  preserve the original.
  
  See also: gen_getopt_long_spec_from_meta() which is the routine that generates
  the specification.
  
  This function is not exported by default, but exportable.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<allow_extra_elems> => I<bool> (default: 0)
  
  Allow extra/unassigned elements in argv.
  
  If set to 1, then if there are array elements unassigned to one of the
  arguments, instead of generating an error, this function will just ignore them.
  
  This option will be passed to Perinci::Sub::GetArgs::Array's allow_extra_elems.
  
  =item * B<args> => I<hash>
  
  Specify input args, with some arguments preset.
  
  =item * B<argv> => I<array[str]>
  
  If not specified, defaults to @ARGV
  
  =item * B<common_opts> => I<hash>
  
  Common options.
  
  A hash where the values are hashes containing these keys: C<getopt> (Getopt::Long
  option specification), C<handler> (Getopt::Long handler). Will be passed to
  C<get_args_from_argv()>. Example:
  
   {
       help => {
           getopt  => 'help|h|?',
           handler => sub { ... },
           summary => 'Display help and exit',
       },
       version => {
           getopt  => 'version|v',
           handler => sub { ... },
           summary => 'Display version and exit',
       },
   }
  
  =item * B<ggls_res> => I<array>
  
  Full result from gen_getopt_long_spec_from_meta().
  
  If you already call C<gen_getopt_long_spec_from_meta()>, you can pass the I<full> enveloped result
  here, to avoid calculating twice.
  
  =item * B<ignore_converted_code> => I<bool> (default: 0)
  
  Whether to ignore coderefs converted to string.
  
  Across network through JSON encoding, coderef in metadata (e.g. in
  C<cmdline_aliases> property) usually gets converted to string C<CODE>. In some
  cases, like for tab completion, this is harmless so you can turn this option on.
  
  =item * B<meta>* => I<hash>
  
  =item * B<meta_is_normalized> => I<bool> (default: 0)
  
  Can be set to 1 if your metadata is normalized, to avoid duplicate effort.
  
  =item * B<on_missing_required_args> => I<code>
  
  Execute code when there is missing required args.
  
  This can be used to give a chance to supply argument value from other sources if
  not specified by command-line options. Perinci::CmdLine, for example, uses this
  hook to supply value from STDIN or file contents (if argument has C<cmdline_src>
  specification key set).
  
  This hook will be called for each missing argument. It will be supplied hash
  arguments: (arg => $the_missing_argument_name, args =>
  $the_resulting_args_so_far, spec => $the_arg_spec).
  
  The hook can return true if it succeeds in making the missing situation
  resolved. In this case, this function will not report the argument as missing.
  
  =item * B<per_arg_json> => I<bool> (default: 0)
  
  Whether to recognize --ARGNAME-json.
  
  This is useful for example if you want to specify a value which is not
  expressible from the command-line, like 'undef'.
  
   % script.pl --name-json 'null'
  
  But every other string will need to be quoted:
  
   % script.pl --name-json '"foo"'
  
  See also: per_arg_yaml. You should enable just one instead of turning on both.
  
  =item * B<per_arg_yaml> => I<bool> (default: 0)
  
  Whether to recognize --ARGNAME-yaml.
  
  This is useful for example if you want to specify a value which is not
  expressible from the command-line, like 'undef'.
  
   % script.pl --name-yaml '~'
  
  See also: per_arg_json. You should enable just one instead of turning on both.
  
  =item * B<strict> => I<bool> (default: 1)
  
  Strict mode.
  
  If set to 0, will still return parsed argv even if there are parsing errors
  (reported by Getopt::Long). If set to 1 (the default), will die upon error.
  
  Normally you would want to use strict mode, for more error checking. Setting off
  strict is used by, for example, Perinci::Sub::Complete during completion where
  the command-line might still be incomplete.
  
  Should probably be named C<ignore_errors>. :-)
  
  =back
  
  Returns an enveloped result (an array).
  
  First element (status) is an integer containing HTTP status code
  (200 means OK, 4xx caller error, 5xx function error). Second element
  (msg) is a string containing error message, or 'OK' if status is
  200. Third element (payload) is optional, the actual result. Fourth
  element (meta) is called result metadata and is optional, a hash
  that contains extra information.
  
  Return value:  (any)
  
  
  Error codes:
  
  =over
  
  =item * 400 - Error in Getopt::Long option specification, e.g. in common_opts.
  
  =item * 500 - failure in GetOptions, meaning argv is not valid according to metadata
  specification (only if 'strict' mode is enabled).
  
  =item * 501 - coderef in cmdline_aliases got converted into a string, probably because
  the metadata was transported (e.g. through Riap::HTTP/Riap::Simple).
  
  =back
  
  =head1 FAQ
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Perinci-Sub-GetArgs-Argv>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Perinci-Sub-GetArgs-Argv>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Perinci-Sub-GetArgs-Argv>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Perinci>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2019, 2017, 2016, 2015, 2014, 2013, 2012, 2011 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
PERINCI_SUB_GETARGS_ARGV

    $main::fatpacked{"Perinci/Sub/GetArgs/Array.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PERINCI_SUB_GETARGS_ARRAY';
  package Perinci::Sub::GetArgs::Array;
  
  our $DATE = '2019-04-15'; # DATE
  our $VERSION = '0.170'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  #use Log::Any '$log';
  
  use Exporter;
  our @ISA = qw(Exporter);
  our @EXPORT_OK = qw(get_args_from_array);
  
  our %SPEC;
  
  $SPEC{':package'} = {
      v => 1.1,
  };
  
  $SPEC{get_args_from_array} = {
      v => 1.1,
      summary => 'Get subroutine arguments (%args) from array',
      description => <<'_',
  
  Using information in metadata's `args` property (particularly the `pos` and
  `slurpy` arg type clauses), extract arguments from an array into a hash
  `\%args`, suitable for passing into subs.
  
  Example:
  
      my $meta = {
          v => 1.1,
          summary => 'Multiply 2 numbers (a & b)',
          args => {
              a => {schema=>'num*', pos=>0},
              b => {schema=>'num*', pos=>1},
          }
      }
  
  then `get_args_from_array(array=>[2, 3], meta=>$meta)` will produce:
  
      [200, "OK", {a=>2, b=>3}]
  
  _
      args => {
          array => {
              schema => ['array*' => {}],
              req => 1,
              description => <<'_',
  
  NOTE: array will be modified/emptied (elements will be taken from the array as
  they are put into the resulting args). Copy your array first if you want to
  preserve its content.
  
  _
          },
          meta => {
              schema => ['hash*' => {}],
              req => 1,
          },
          meta_is_normalized => {
              summary => 'Can be set to 1 if your metadata is normalized, '.
                  'to avoid duplicate effort',
              schema => 'bool',
              default => 0,
          },
          allow_extra_elems => {
              schema => ['bool' => {default=>0}],
              summary => 'Allow extra/unassigned elements in array',
              description => <<'_',
  
  If set to 1, then if there are array elements unassigned to one of the arguments
  (due to missing `pos`, for example), instead of generating an error, the
  function will just ignore them.
  
  _
          },
      },
  };
  sub get_args_from_array {
      my %fargs = @_;
      my $ary  = $fargs{array} or return [400, "Please specify array"];
      my $meta = $fargs{meta} or return [400, "Please specify meta"];
      unless ($fargs{meta_is_normalized}) {
          require Perinci::Sub::Normalize;
          $meta = Perinci::Sub::Normalize::normalize_function_metadata(
              $meta);
      }
      my $allow_extra_elems = $fargs{allow_extra_elems} // 0;
  
      my $rargs = {};
  
      my $args_p = $meta->{args} // {};
      for my $i (reverse 0..@$ary-1) {
          #$log->tracef("i=$i");
          while (my ($a, $as) = each %$args_p) {
              my $o = $as->{pos};
              if (defined($o) && $o == $i) {
                  if ($as->{slurpy} // $as->{greedy}) {
                      my $type = $as->{schema}[0];
                      my @elems = splice(@$ary, $i);
                      if ($type eq 'array') {
                          $rargs->{$a} = \@elems;
                      } elsif ($type eq 'hash') {
                          $rargs->{$a} = {};
                          for my $j (0..$#elems) {
                              my $elem = $elems[$j];
                              unless ($elem =~ /(.*?)=(.*)/) {
                                  return [400, "Invalid key=value pair in element #$j"];
                              }
                              $rargs->{$a}{$1} = $2;
                          }
                      } else {
                          $rargs->{$a} = join " ", @elems;
                      }
                      #$log->tracef("assign %s to arg->{$a}", $rargs->{$a});
                  } else {
                      $rargs->{$a} = splice(@$ary, $i, 1);
                      #$log->tracef("assign %s to arg->{$a}", $rargs->{$a});
                  }
              }
          }
      }
  
      return [400, "There are extra, unassigned elements in array: [".
                  join(", ", @$ary)."]"] if @$ary && !$allow_extra_elems;
  
      [200, "OK", $rargs];
  }
  
  1;
  # ABSTRACT: Get subroutine arguments (%args) from array
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Perinci::Sub::GetArgs::Array - Get subroutine arguments (%args) from array
  
  =head1 VERSION
  
  This document describes version 0.170 of Perinci::Sub::GetArgs::Array (from Perl distribution Perinci-Sub-GetArgs-Array), released on 2019-04-15.
  
  =head1 SYNOPSIS
  
   use Perinci::Sub::GetArgs::Array;
  
   my $res = get_args_from_array(array=>\@ary, meta=>$meta, ...);
  
  =head1 DESCRIPTION
  
  This module provides get_args_from_array(). This module is used by, among
  others, L<Perinci::Sub::GetArgs::Argv>.
  
  =head1 FUNCTIONS
  
  
  =head2 get_args_from_array
  
  Usage:
  
   get_args_from_array(%args) -> [status, msg, payload, meta]
  
  Get subroutine arguments (%args) from array.
  
  Using information in metadata's C<args> property (particularly the C<pos> and
  C<slurpy> arg type clauses), extract arguments from an array into a hash
  C<\%args>, suitable for passing into subs.
  
  Example:
  
   my $meta = {
       v => 1.1,
       summary => 'Multiply 2 numbers (a & b)',
       args => {
           a => {schema=>'num*', pos=>0},
           b => {schema=>'num*', pos=>1},
       }
   }
  
  then C<< get_args_from_array(array=E<gt>[2, 3], meta=E<gt>$meta) >> will produce:
  
   [200, "OK", {a=>2, b=>3}]
  
  This function is not exported by default, but exportable.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<allow_extra_elems> => I<bool> (default: 0)
  
  Allow extra/unassigned elements in array.
  
  If set to 1, then if there are array elements unassigned to one of the arguments
  (due to missing C<pos>, for example), instead of generating an error, the
  function will just ignore them.
  
  =item * B<array>* => I<array>
  
  NOTE: array will be modified/emptied (elements will be taken from the array as
  they are put into the resulting args). Copy your array first if you want to
  preserve its content.
  
  =item * B<meta>* => I<hash>
  
  =item * B<meta_is_normalized> => I<bool> (default: 0)
  
  Can be set to 1 if your metadata is normalized, to avoid duplicate effort.
  
  =back
  
  Returns an enveloped result (an array).
  
  First element (status) is an integer containing HTTP status code
  (200 means OK, 4xx caller error, 5xx function error). Second element
  (msg) is a string containing error message, or 'OK' if status is
  200. Third element (payload) is optional, the actual result. Fourth
  element (meta) is called result metadata and is optional, a hash
  that contains extra information.
  
  Return value:  (any)
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Perinci-Sub-GetArgs-Array>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Perinci-Sub-GetArgs-Array>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Perinci-Sub-GetArgs-Array>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Perinci>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2019, 2016, 2015, 2014, 2013, 2012, 2011 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
PERINCI_SUB_GETARGS_ARRAY

    $main::fatpacked{"Perinci/Sub/Normalize.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PERINCI_SUB_NORMALIZE';
  package Perinci::Sub::Normalize;
  
  our $DATE = '2018-09-10'; # DATE
  our $VERSION = '0.200'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  require Exporter;
  our @ISA = qw(Exporter);
  our @EXPORT_OK = qw(
                         normalize_function_metadata
                 );
  
  sub _normalize{
      my ($meta, $ver, $opts, $proplist, $nmeta, $prefix, $modprefix) = @_;
  
      my $opt_aup = $opts->{allow_unknown_properties};
      my $opt_nss = $opts->{normalize_sah_schemas};
      my $opt_rip = $opts->{remove_internal_properties};
  
      if (defined $ver) {
          defined($meta->{v}) && $meta->{v} eq $ver
              or die "$prefix: Metadata version must be $ver";
      }
  
    KEY:
      for my $k (keys %$meta) {
          die "Invalid prop/attr syntax '$k', must be word/dotted-word only"
              unless $k =~ /\A(\w+)(?:\.(\w+(?:\.\w+)*))?(?:\((\w+)\))?\z/;
  
          my ($prop, $attr);
          if (defined $3) {
              $prop = $1;
              $attr = defined($2) ? "$2.alt.lang.$3" : "alt.lang.$3";
          } else {
              $prop = $1;
              $attr = $2;
          }
  
          my $nk = "$prop" . (defined($attr) ? ".$attr" : "");
  
          # strip property/attr started with _
          if ($prop =~ /\A_/ || defined($attr) && $attr =~ /\A_|\._/) {
              unless ($opt_rip) {
                  $nmeta->{$nk} = $meta->{$k};
              }
              next KEY;
          }
  
          my $prop_proplist = $proplist->{$prop};
  
          # try to load module that declare new props first
          if (!$opt_aup && !$prop_proplist) {
              $modprefix //= $prefix;
              my $mod = "Perinci/Sub/Property$modprefix/$prop.pm";
              eval { require $mod };
              # hide technical error message from require()
              if ($@) {
                  die "Unknown property '$prefix/$prop' (and couldn't ".
                      "load property module '$mod'): $@" if $@;
              }
              $prop_proplist = $proplist->{$prop};
          }
          die "Unknown property '$prefix/$prop'"
              unless $opt_aup || $prop_proplist;
  
          if ($prop_proplist && $prop_proplist->{_prop}) {
              die "Property '$prefix/$prop' must be a hash"
                  unless ref($meta->{$k}) eq 'HASH';
              $nmeta->{$nk} = {};
              _normalize(
                  $meta->{$k},
                  $prop_proplist->{_ver},
                  $opts,
                  $prop_proplist->{_prop},
                  $nmeta->{$nk},
                  "$prefix/$prop",
              );
          } elsif ($prop_proplist && $prop_proplist->{_elem_prop}) {
              die "Property '$prefix/$prop' must be an array"
                  unless ref($meta->{$k}) eq 'ARRAY';
              $nmeta->{$nk} = [];
              my $i = 0;
              for (@{ $meta->{$k} }) {
                  my $href = {};
                  if (ref($_) eq 'HASH') {
                      _normalize(
                          $_,
                          $prop_proplist->{_ver},
                          $opts,
                          $prop_proplist->{_elem_prop},
                          $href,
                          "$prefix/$prop/$i",
                      );
                      push @{ $nmeta->{$nk} }, $href;
                  } else {
                      push @{ $nmeta->{$nk} }, $_;
                  }
                  $i++;
              }
          } elsif ($prop_proplist && $prop_proplist->{_value_prop}) {
              die "Property '$prefix/$prop' must be a hash"
                  unless ref($meta->{$k}) eq 'HASH';
              $nmeta->{$nk} = {};
              for (keys %{ $meta->{$k} }) {
                  $nmeta->{$nk}{$_} = {};
                  die "Property '$prefix/$prop/$_' must be a hash"
                      unless ref($meta->{$k}{$_}) eq 'HASH';
                  _normalize(
                      $meta->{$k}{$_},
                      $prop_proplist->{_ver},
                      $opts,
                      $prop_proplist->{_value_prop},
                      $nmeta->{$nk}{$_},
                      "$prefix/$prop/$_",
                      ($prop eq 'args' ? "$prefix/arg" : undef),
                  );
              }
          } else {
              if ($k eq 'schema' && $opt_nss) { # XXX currently hardcoded
                  require Data::Sah::Normalize;
                  $nmeta->{$nk} = Data::Sah::Normalize::normalize_schema(
                      $meta->{$k});
              } else {
                  $nmeta->{$nk} = $meta->{$k};
              }
          }
      }
  
      $nmeta;
  }
  
  sub normalize_function_metadata($;$) {
      my ($meta, $opts) = @_;
  
      $opts //= {};
  
      $opts->{allow_unknown_properties}    //= 0;
      $opts->{normalize_sah_schemas}       //= 1;
      $opts->{remove_internal_properties}  //= 0;
  
      require Sah::Schema::rinci::function_meta;
      my $sch = $Sah::Schema::rinci::function_meta::schema;
      my $sch_proplist = $sch->[1]{_prop}
          or die "BUG: Rinci schema structure changed (1a)";
  
      _normalize($meta, 1.1, $opts, $sch_proplist, {}, '');
  }
  
  1;
  # ABSTRACT: Normalize Rinci function metadata
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Perinci::Sub::Normalize - Normalize Rinci function metadata
  
  =head1 VERSION
  
  This document describes version 0.200 of Perinci::Sub::Normalize (from Perl distribution Perinci-Sub-Normalize), released on 2018-09-10.
  
  =head1 SYNOPSIS
  
   use Perinci::Sub::Normalize qw(normalize_function_metadata);
  
   my $nmeta = normalize_function_metadata($meta);
  
  =head1 FUNCTIONS
  
  =head2 normalize_function_metadata($meta[ , \%opts ]) => HASH
  
  Normalize and check L<Rinci> function metadata C<$meta>. Return normalized
  metadata, which is a shallow copy of C<$meta>. Die on error.
  
  Available options:
  
  =over
  
  =item * allow_unknown_properties => BOOL (default: 0)
  
  If set to true, will die if there are unknown properties.
  
  =item * normalize_sah_schemas => BOOL (default: 1)
  
  By default, L<Sah> schemas e.g. in C<result/schema> or C<args/*/schema> property
  is normalized using L<Data::Sah>'s C<normalize_schema>. Set this to 0 if you
  don't want this.
  
  =item * remove_internal_properties => BOOL (default: 0)
  
  If set to 1, all properties and attributes starting with underscore (C<_>) with
  will be stripped. According to L<DefHash> specification, they are ignored and
  usually contain notes/comments/extra information.
  
  =back
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Perinci-Sub-Normalize>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Perinci-Sub-Normalize>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Perinci-Sub-Normalize>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Rinci::function>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2018, 2016, 2015, 2014 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
PERINCI_SUB_NORMALIZE

    $main::fatpacked{"Perinci/Sub/To/CLIDocData.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PERINCI_SUB_TO_CLIDOCDATA';
  package Perinci::Sub::To::CLIDocData;
  
  our $DATE = '2019-07-26'; # DATE
  our $VERSION = '0.291'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  use Perinci::Object;
  use Perinci::Sub::Util qw(err);
  
  our %SPEC;
  
  require Exporter;
  our @ISA = qw(Exporter);
  our @EXPORT_OK = qw(gen_cli_doc_data_from_meta);
  
  sub _has_cats {
      for my $spec (@{ $_[0] }) {
          for (@{ $spec->{tags} // [] }) {
              my $tag_name = ref($_) ? $_->{name} : $_;
              if ($tag_name =~ /^category:/) {
                  return 1;
              }
          }
      }
      0;
  }
  
  sub _add_category_from_spec {
      my ($cats_spec, $thing, $spec, $noun, $has_cats) = @_;
      my @cats;
      for (@{ $spec->{tags} // [] }) {
          my $tag_name = ref($_) ? $_->{name} : $_;
          if ($tag_name =~ /^category(\d+)?:(.+)/) {
              my $cat = ucfirst($2);
              my $ordering = $1 // 50;
              $cat =~ s/-/ /g;
              $cat .= " " . $noun;
              push @cats, [$cat, $ordering]; # name, ordering
          }
      }
      if (!@cats) {
          @cats = [$has_cats ? "Other $noun" : ucfirst($noun), 99]; # XXX translatable?
      }
  
      # old, will be removed someday
      $thing->{category} = $cats[0][0];
      # new/current
      $thing->{categories} = [map {$_->[0]} @cats];
  
      $cats_spec->{$_->[0]}{order} //= $_->[1] for @cats;
  }
  
  sub _add_default_from_arg_spec {
      my ($opt, $arg_spec) = @_;
      if (exists $arg_spec->{default}) {
          $opt->{default} = $arg_spec->{default};
      } elsif ($arg_spec->{schema} && exists($arg_spec->{schema}[1]{default})) {
          $opt->{default} = $arg_spec->{schema}[1]{default};
      }
  }
  
  sub _dash_prefix {
      length($_[0]) > 1 ? "--$_[0]" : "-$_[0]";
  }
  
  sub _fmt_opt {
      my $spec = shift;
      my @ospecs = @_;
      my @res;
      my $i = 0;
      for my $ospec (@ospecs) {
          my $j = 0;
          my $parsed = $ospec->{parsed};
          for (@{ $parsed->{opts} }) {
              my $opt = _dash_prefix($_);
              if ($i==0 && $j==0) {
                  if ($parsed->{type}) {
                      if ($spec->{'x.schema.entity'}) {
                          $opt .= "=".$spec->{'x.schema.entity'};
                      } elsif ($spec->{'x.schema.element_entity'}) {
                          $opt .= "=".$spec->{'x.schema.element_entity'};
                      } else {
                          $opt .= "=$parsed->{type}";
                      }
                  }
                  # mark required option with a '*'
                  $opt .= "*" if $spec->{req} && !$ospec->{is_base64} &&
                      !$ospec->{is_json} && !$ospec->{is_yaml};
              }
              push @res, $opt;
              $j++;
          }
          $i++;
      }
      join ", ", @res;
  }
  
  $SPEC{gen_cli_doc_data_from_meta} = {
      v => 1.1,
      summary => 'From Rinci function metadata, generate structure convenient '.
          'for producing CLI documentation (help/usage/POD)',
      description => <<'_',
  
  This function calls <pm:Perinci::Sub::GetArgs::Argv>'s
  `gen_getopt_long_spec_from_meta()` (or receive its result as an argument, if
  passed, to avoid calling the function twice) and post-processes it: produce
  command usage line, format the options, include information from metadata, group
  the options by category. It also selects examples in the `examples` property
  which are applicable to CLI environment and format them.
  
  The resulting data structure is convenient to use when one wants to produce a
  documentation for CLI program (including help/usage message and POD).
  
  _
      args => {
          meta => {
              schema => 'hash*', # XXX rifunc
              req => 1,
              pos => 0,
          },
          meta_is_normalized => {
              schema => 'bool*',
          },
          common_opts => {
              summary => 'Will be passed to gen_getopt_long_spec_from_meta()',
              schema  => 'hash*',
          },
          ggls_res => {
              summary => 'Full result from gen_getopt_long_spec_from_meta()',
              schema  => 'array*', # XXX envres
              description => <<'_',
  
  If you already call <pm:Perinci::Sub::GetArgs::Argv>'s
  `gen_getopt_long_spec_from_meta()`, you can pass the _full_ enveloped result
  here, to avoid calculating twice. What will be useful for the function is the
  extra result in result metadata (`func.*` keys in `$res->[3]` hash).
  
  _
          },
          per_arg_json => {
              schema => 'bool',
              summary => 'Pass per_arg_json=1 to Perinci::Sub::GetArgs::Argv',
          },
          per_arg_yaml => {
              schema => 'bool',
              summary => 'Pass per_arg_json=1 to Perinci::Sub::GetArgs::Argv',
          },
          lang => {
              schema => 'str*',
          },
      },
      result => {
          schema => 'hash*',
      },
  };
  sub gen_cli_doc_data_from_meta {
      require Getopt::Long::Negate::EN;
  
      my %args = @_;
  
      my $lang = $args{lang};
      my $meta = $args{meta} or return [400, 'Please specify meta'];
      my $common_opts = $args{common_opts};
      unless ($args{meta_is_normalized}) {
          require Perinci::Sub::Normalize;
          $meta = Perinci::Sub::Normalize::normalize_function_metadata($meta);
      }
      my $ggls_res = $args{ggls_res} // do {
          require Perinci::Sub::GetArgs::Argv;
          Perinci::Sub::GetArgs::Argv::gen_getopt_long_spec_from_meta(
              meta=>$meta, meta_is_normalized=>1, common_opts=>$common_opts,
              per_arg_json => $args{per_arg_json},
              per_arg_yaml => $args{per_arg_yaml},
          );
      };
      $ggls_res->[0] == 200 or return $ggls_res;
  
      my $args_prop = $meta->{args} // {};
      my $clidocdata = {
          option_categories => {},
          example_categories => {},
      };
  
      # generate usage line
      {
          my @args;
          my %args_prop = %$args_prop; # copy because we want to iterate & delete
          my $max_pos = -1;
          for (values %args_prop) {
              $max_pos = $_->{pos}
                  if defined($_->{pos}) && $_->{pos} > $max_pos;
          }
          my $pos = 0;
          while ($pos <= $max_pos) {
              my ($arg, $arg_spec);
              for (keys %args_prop) {
                  $arg_spec = $args_prop{$_};
                  if (defined($arg_spec->{pos}) && $arg_spec->{pos}==$pos) {
                      $arg = $_;
                      last;
                  }
              }
              $pos++;
              next unless defined($arg);
              if ($arg_spec->{slurpy} // $arg_spec->{greedy}) {
                  # try to find the singular form
                  $arg = $arg_spec->{'x.name.singular'}
                      if $arg_spec->{'x.name.is_plural'} &&
                      defined $arg_spec->{'x.name.singular'};
              }
              if ($arg_spec->{req}) {
                  push @args, "<$arg>";
              } else {
                  push @args, "[$arg]";
              }
              $args[-1] .= " ..." if ($arg_spec->{slurpy} // $arg_spec->{greedy});
              delete $args_prop{$arg};
          }
          unshift @args, "[options]" if keys(%args_prop) || keys(%$common_opts); # XXX translatable?
          $clidocdata->{usage_line} = "[[prog]]".
              (@args ? " ".join(" ", @args) : "");
      }
  
      # generate list of options
      my %opts;
      {
          my $ospecs = $ggls_res->[3]{'func.specmeta'};
          # separate groupable aliases because they will be merged with the
          # argument options
          my (@k, @k_aliases);
        OSPEC1:
          for (sort keys %$ospecs) {
              my $ospec = $ospecs->{$_};
              {
                  last unless $ospec->{is_alias};
                  next if $ospec->{is_code};
                  my $arg_spec = $args_prop->{$ospec->{arg}};
                  my $alias_spec = $arg_spec->{cmdline_aliases}{$ospec->{alias}};
                  next if $alias_spec->{summary};
                  push @k_aliases, $_;
                  next OSPEC1;
              }
              push @k, $_;
          }
  
          my %negs; # key=arg, only show one negation form for each arg option
  
        OSPEC2:
          while (@k) {
              my $k = shift @k;
              my $ospec = $ospecs->{$k};
              my $opt;
              my $optkey;
  
              if ($ospec->{is_alias} || defined($ospec->{arg})) {
                  my $arg_spec;
                  my $alias_spec;
  
                  if ($ospec->{is_alias}) {
                      # non-groupable alias
  
                      my $real_opt_ospec = $ospecs->{ $ospec->{alias_for} };
  
                      $arg_spec = $args_prop->{ $ospec->{arg} };
                      $alias_spec = $arg_spec->{cmdline_aliases}{$ospec->{alias}};
                      my $rimeta = rimeta($alias_spec);
                      $optkey = _fmt_opt($arg_spec, $ospec);
                      $opt = {
                          opt_parsed => $ospec->{parsed},
                          orig_opt => $k,
                          is_alias => 1,
                          alias_for => $ospec->{alias_for},
                          summary => $rimeta->langprop({lang=>$lang}, 'summary') //
                              "Alias for "._dash_prefix($real_opt_ospec->{parsed}{opts}[0]),
                          description =>
                              $rimeta->langprop({lang=>$lang}, 'description'),
                      };
                  } else {
                      # an option for argument
  
                      $arg_spec = $args_prop->{$ospec->{arg}};
                      my $rimeta = rimeta($arg_spec);
                      $opt = {
                          opt_parsed => $ospec->{parsed},
                          orig_opt => $k,
                      };
  
                      # for bool, only display either the positive (e.g. --bool)
                      # or the negative (e.g. --nobool) depending on the default
                      if (defined($ospec->{is_neg})) {
                          my $default = $arg_spec->{default} //
                              $arg_spec->{schema}[1]{default};
                          next OSPEC2 if  $default && !$ospec->{is_neg};
                          next OSPEC2 if !$default &&  $ospec->{is_neg};
                          if ($ospec->{is_neg}) {
                              next OSPEC2 if $negs{$ospec->{arg}}++;
                          }
                      }
  
                      if ($ospec->{is_neg}) {
                          # for negative option, use negative summary instead of
                          # regular (positive sentence) summary
                          $opt->{summary} =
                              $rimeta->langprop({lang=>$lang}, 'summary.alt.bool.not');
                      } elsif (defined $ospec->{is_neg}) {
                          # for boolean option which we show the positive, show
                          # the positive summary if available
                          $opt->{summary} =
                              $rimeta->langprop({lang=>$lang}, 'summary.alt.bool.yes') //
                                  $rimeta->langprop({lang=>$lang}, 'summary');
                      } elsif (($ospec->{parsed}{type}//'') eq 's@') {
                          # for array of string that can be specified via multiple
                          # --opt, show singular version of summary if available.
                          # otherwise show regular summary.
                          $opt->{summary} =
                              $rimeta->langprop({lang=>$lang}, 'summary.alt.plurality.singular') //
                                  $rimeta->langprop({lang=>$lang}, 'summary');
                      } else {
                          $opt->{summary} =
                              $rimeta->langprop({lang=>$lang}, 'summary');
                      }
                      $opt->{description} =
                          $rimeta->langprop({lang=>$lang}, 'description');
  
                      # find aliases that can be grouped together with this option
                      my @aliases;
                      my $j = $#k_aliases;
                      while ($j >= 0) {
                          my $aospec = $ospecs->{ $k_aliases[$j] };
                          {
                              last unless $aospec->{arg} eq $ospec->{arg};
                              push @aliases, $aospec;
                              splice @k_aliases, $j, 1;
                          }
                          $j--;
                      }
  
                      $optkey = _fmt_opt($arg_spec, $ospec, @aliases);
                  }
  
                  $opt->{arg_spec} = $arg_spec;
                  $opt->{alias_spec} = $alias_spec if $alias_spec;
  
                  # include keys from func.specmeta
                  for (qw/arg fqarg is_base64 is_json is_yaml/) {
                      $opt->{$_} = $ospec->{$_} if defined $ospec->{$_};
                  }
  
                  # include keys from arg_spec
                  for (qw/req pos slurpy greedy is_password links tags/) {
                      $opt->{$_} = $arg_spec->{$_} if defined $arg_spec->{$_};
                  }
  
                  {
                      # we don't want argument options to end up in "Other" like
                      # --help or -v, they are put at the end. so if an argument
                      # option does not have category, we'll put it in the "main"
                      # category.
                      local $arg_spec->{tags} = ['category0:main']
                          if !$arg_spec->{tags} || !@{$arg_spec->{tags}};
                      _add_category_from_spec($clidocdata->{option_categories},
                                              $opt, $arg_spec, "options", 1);
                  }
                  _add_default_from_arg_spec($opt, $arg_spec);
  
              } else {
                  # option from common_opts
  
                  my $spec = $common_opts->{$ospec->{common_opt}};
  
                  # for bool, only display either the positive (e.g. --bool)
                  # or the negative (e.g. --nobool) depending on the default
                  my $show_neg = $ospec->{parsed}{is_neg} && $spec->{default};
  
                  local $ospec->{parsed}{opts} = do {
                      # XXX check if it's single-letter, get first
                      # non-single-letter
                      my @opts = Getopt::Long::Negate::EN::negations_for_option(
                          $ospec->{parsed}{opts}[0]);
                      [ $opts[0] ];
                  } if $show_neg;
  
                  $optkey = _fmt_opt($spec, $ospec);
                  my $rimeta = rimeta($spec);
                  $opt = {
                      opt_parsed => $ospec->{parsed},
                      orig_opt => $k,
                      common_opt => $ospec->{common_opt},
                      common_opt_spec => $spec,
                      summary => $show_neg ?
                          $rimeta->langprop({lang=>$lang}, 'summary.alt.bool.not') :
                              $rimeta->langprop({lang=>$lang}, 'summary'),
                      (schema => $spec->{schema}) x !!$spec->{schema},
                      ('x.schema.entity' => $spec->{'x.schema.entity'}) x !!$spec->{'x.schema.entity'},
                      ('x.schema.element_entity' => $spec->{'x.schema.element_entity'}) x !!$spec->{'x.schema.element_entity'},
                      description =>
                          $rimeta->langprop({lang=>$lang}, 'description'),
                      (default => $spec->{default}) x !!(exists($spec->{default}) && !$show_neg),
                  };
  
                  _add_category_from_spec($clidocdata->{option_categories},
                                          $opt, $spec, "options", 1);
  
              }
  
              $opts{$optkey} = $opt;
          }
  
          # link ungrouped alias to its main opt
        OPT1:
          for my $k (keys %opts) {
              my $opt = $opts{$k};
              next unless $opt->{is_alias} || $opt->{is_base64} ||
                  $opt->{is_json} || $opt->{is_yaml};
              for my $k2 (keys %opts) {
                  my $arg_opt = $opts{$k2};
                  next if $arg_opt->{is_alias} || $arg_opt->{is_base64} ||
                      $arg_opt->{is_json} || $arg_opt->{is_yaml};
                  next unless defined($arg_opt->{arg}) &&
                      $arg_opt->{arg} eq $opt->{arg};
                  $opt->{main_opt} = $k2;
                  next OPT1;
              }
          }
  
      }
      $clidocdata->{opts} = \%opts;
  
      # filter and format examples
      my @examples;
      {
          my $examples = $meta->{examples} // [];
          my $has_cats = _has_cats($examples);
  
          for my $eg (@$examples) {
              my $rimeta = rimeta($eg);
              my $argv;
              my $cmdline;
              if (defined($eg->{src})) {
                  # we only show shell command examples
                  if ($eg->{src_plang} =~ /^(sh|bash)$/) {
                      $cmdline = $eg->{src};
                  } else {
                      next;
                  }
              } else {
                  require String::ShellQuote;
                  if ($eg->{argv}) {
                      $argv = $eg->{argv};
                  } else {
                      require Perinci::Sub::ConvertArgs::Argv;
                      my $res = Perinci::Sub::ConvertArgs::Argv::convert_args_to_argv(
                          args => $eg->{args}, meta => $meta, use_pos => 1);
                      return err($res, 500, "Can't convert args to argv")
                          unless $res->[0] == 200;
                      $argv = $res->[2];
                  }
                  $cmdline = "[[prog]]";
                  for my $arg (@$argv) {
                      my $qarg = String::ShellQuote::shell_quote($arg);
                      $cmdline .= " $qarg"; # XXX markup with color?
                  }
              }
              my $egdata = {
                  cmdline      => $cmdline,
                  summary      => $rimeta->langprop({lang=>$lang}, 'summary'),
                  description  => $rimeta->langprop({lang=>$lang}, 'description'),
                  example_spec => $eg,
              };
              # XXX show result from $eg
              _add_category_from_spec($clidocdata->{example_categories},
                                      $egdata, $eg, "examples", $has_cats);
              push @examples, $egdata;
          }
      }
      $clidocdata->{examples} = \@examples;
  
      [200, "OK", $clidocdata];
  }
  
  1;
  # ABSTRACT: From Rinci function metadata, generate structure convenient for producing CLI documentation (help/usage/POD)
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Perinci::Sub::To::CLIDocData - From Rinci function metadata, generate structure convenient for producing CLI documentation (help/usage/POD)
  
  =head1 VERSION
  
  This document describes version 0.291 of Perinci::Sub::To::CLIDocData (from Perl distribution Perinci-Sub-To-CLIDocData), released on 2019-07-26.
  
  =head1 SYNOPSIS
  
   use Perinci::Sub::To::CLIDocData qw(gen_cli_doc_data_from_meta);
   my $clidocdata = gen_cli_doc_data_from_meta(meta => $meta);
  
  Sample function metadata (C<$meta>):
  
   {
     args => {
       bool1 => {
                  cmdline_aliases => { z => { summary => "This is summary for option `-z`" } },
                  schema => "bool",
                  summary => "Another bool option",
                  tags => ["category:cat1"],
                },
       flag1 => {
                  cmdline_aliases => { f => {} },
                  schema => ["bool", "is", 1],
                  tags => ["category:cat1"],
                },
       str1  => {
                  pos => 0,
                  req => 1,
                  schema => "str*",
                  summary => "A required option as well as positional argument",
                },
     },
     examples => [
       {
         argv    => ["a value", "--bool1"],
         summary => "Summary for an example",
         test    => 0,
       },
     ],
     summary => "Function summary",
     v => 1.1,
   }
  
  Sample result:
  
   do {
     my $a = [
       200,
       "OK",
       {
         example_categories => { Examples => { order => 99 } },
         examples => [
           {
             categories   => ["Examples"],
             category     => "Examples",
             cmdline      => "[[prog]] 'a value' --bool1",
             description  => undef,
             example_spec => {
                               argv    => ["a value", "--bool1"],
                               summary => "Summary for an example",
                               test    => 0,
                             },
             summary      => "Summary for an example",
           },
         ],
         option_categories => { "Cat1 options" => { order => 50 }, "Main options" => { order => 0 } },
         opts => {
           "--bool1" => {
             arg         => "bool1",
             arg_spec    => {
                              cmdline_aliases => { z => { summary => "This is summary for option `-z`" } },
                              schema => ["bool", {}, {}],
                              summary => "Another bool option",
                              tags => ["category:cat1"],
                            },
             categories  => ["Cat1 options"],
             category    => "Cat1 options",
             description => undef,
             fqarg       => "bool1",
             opt_parsed  => { opts => ["bool1"] },
             orig_opt    => "bool1",
             summary     => "Another bool option",
             tags        => 'fix',
           },
           "--flag1, -f" => {
             arg         => "flag1",
             arg_spec    => {
                              cmdline_aliases => { f => {} },
                              schema => ["bool", { is => 1 }, {}],
                              tags => ["category:cat1"],
                            },
             categories  => ["Cat1 options"],
             category    => "Cat1 options",
             description => undef,
             fqarg       => "flag1",
             opt_parsed  => { opts => ["flag1"] },
             orig_opt    => "flag1",
             summary     => undef,
             tags        => 'fix',
           },
           "--str1=s*" => {
             arg => "str1",
             arg_spec => {
               pos => 0,
               req => 1,
               schema => ["str", { req => 1 }, {}],
               summary => "A required option as well as positional argument",
             },
             categories => ["Main options"],
             category => "Main options",
             description => undef,
             fqarg => "str1",
             opt_parsed => { desttype => "", opts => ["str1"], type => "s" },
             orig_opt => "str1=s",
             pos => 0,
             req => 1,
             summary => "A required option as well as positional argument",
           },
           "-z" => {
             alias_for   => "bool1",
             alias_spec  => 'fix',
             arg         => "bool1",
             arg_spec    => 'fix',
             categories  => ["Cat1 options"],
             category    => "Cat1 options",
             description => undef,
             fqarg       => "bool1",
             is_alias    => 1,
             main_opt    => "--bool1",
             opt_parsed  => { opts => ["z"] },
             orig_opt    => "z",
             summary     => "This is summary for option `-z`",
             tags        => 'fix',
           },
         },
         usage_line => "[[prog]] [options] <str1>",
       },
     ];
     $a->[2]{opts}{"--bool1"}{tags} = $a->[2]{opts}{"--bool1"}{arg_spec}{tags};
     $a->[2]{opts}{"--flag1, -f"}{tags} = $a->[2]{opts}{"--flag1, -f"}{arg_spec}{tags};
     $a->[2]{opts}{"-z"}{alias_spec} = $a->[2]{opts}{"--bool1"}{arg_spec}{cmdline_aliases}{z};
     $a->[2]{opts}{"-z"}{arg_spec} = $a->[2]{opts}{"--bool1"}{arg_spec};
     $a->[2]{opts}{"-z"}{tags} = $a->[2]{opts}{"--bool1"}{arg_spec}{tags};
     $a;
   }
  
  For a more complete sample, see function metadata for C<demo_cli_opts> in
  L<Perinci::Examples::CLI>.
  
  =head1 FUNCTIONS
  
  
  =head2 gen_cli_doc_data_from_meta
  
  Usage:
  
   gen_cli_doc_data_from_meta(%args) -> [status, msg, payload, meta]
  
  From Rinci function metadata, generate structure convenient for producing CLI documentation (help/usage/POD).
  
  This function calls L<Perinci::Sub::GetArgs::Argv>'s
  C<gen_getopt_long_spec_from_meta()> (or receive its result as an argument, if
  passed, to avoid calling the function twice) and post-processes it: produce
  command usage line, format the options, include information from metadata, group
  the options by category. It also selects examples in the C<examples> property
  which are applicable to CLI environment and format them.
  
  The resulting data structure is convenient to use when one wants to produce a
  documentation for CLI program (including help/usage message and POD).
  
  This function is not exported by default, but exportable.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<common_opts> => I<hash>
  
  Will be passed to gen_getopt_long_spec_from_meta().
  
  =item * B<ggls_res> => I<array>
  
  Full result from gen_getopt_long_spec_from_meta().
  
  If you already call L<Perinci::Sub::GetArgs::Argv>'s
  C<gen_getopt_long_spec_from_meta()>, you can pass the I<full> enveloped result
  here, to avoid calculating twice. What will be useful for the function is the
  extra result in result metadata (C<func.*> keys in C<< $res-E<gt>[3] >> hash).
  
  =item * B<lang> => I<str>
  
  =item * B<meta>* => I<hash>
  
  =item * B<meta_is_normalized> => I<bool>
  
  =item * B<per_arg_json> => I<bool>
  
  Pass per_arg_json=1 to Perinci::Sub::GetArgs::Argv.
  
  =item * B<per_arg_yaml> => I<bool>
  
  Pass per_arg_json=1 to Perinci::Sub::GetArgs::Argv.
  
  =back
  
  Returns an enveloped result (an array).
  
  First element (status) is an integer containing HTTP status code
  (200 means OK, 4xx caller error, 5xx function error). Second element
  (msg) is a string containing error message, or 'OK' if status is
  200. Third element (payload) is optional, the actual result. Fourth
  element (meta) is called result metadata and is optional, a hash
  that contains extra information.
  
  Return value:  (hash)
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Perinci-Sub-To-CLIDocData>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Perinci-Sub-To-CLIOptSpec>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Perinci-Sub-To-CLIDocData>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Perinci::CmdLine>, L<Perinci::CmdLine::Lite>
  
  L<Pod::Weaver::Plugin::Rinci>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2019, 2016, 2015, 2014 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
PERINCI_SUB_TO_CLIDOCDATA

    $main::fatpacked{"Perinci/Sub/Util.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PERINCI_SUB_UTIL';
  package Perinci::Sub::Util;
  
  our $DATE = '2017-01-31'; # DATE
  our $VERSION = '0.46'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  require Exporter;
  our @ISA = qw(Exporter);
  our @EXPORT_OK = qw(
                         err
                         caller
                         warn_err
                         die_err
                         gen_modified_sub
                         gen_curried_sub
                 );
  
  our %SPEC;
  
  $SPEC{':package'} = {
      v => 1.1,
      summary => 'Helper when writing functions',
  };
  
  our $STACK_TRACE;
  our @_c; # to store temporary celler() result
  our $_i; # temporary variable
  sub err {
      require Scalar::Util;
  
      # get information about caller
      my @caller = CORE::caller(1);
      if (!@caller) {
          # probably called from command-line (-e)
          @caller = ("main", "-e", 1, "program");
      }
  
      my ($status, $msg, $meta, $prev);
  
      for (@_) {
          my $ref = ref($_);
          if ($ref eq 'ARRAY') { $prev = $_ }
          elsif ($ref eq 'HASH') { $meta = $_ }
          elsif (!$ref) {
              if (Scalar::Util::looks_like_number($_)) {
                  $status = $_;
              } else {
                  $msg = $_;
              }
          }
      }
  
      $status //= 500;
      $msg  //= "$caller[3] failed";
      $meta //= {};
      $meta->{prev} //= $prev if $prev;
  
      # put information on who produced this error and where/when
      if (!$meta->{logs}) {
  
          # should we produce a stack trace?
          my $stack_trace;
          {
              no warnings;
              # we use Carp::Always as a sign that user wants stack traces
              last unless $STACK_TRACE // $INC{"Carp/Always.pm"};
              # stack trace is already there in previous result's log
              last if $prev && ref($prev->[3]) eq 'HASH' &&
                  ref($prev->[3]{logs}) eq 'ARRAY' &&
                      ref($prev->[3]{logs}[0]) eq 'HASH' &&
                          $prev->[3]{logs}[0]{stack_trace};
              $stack_trace = [];
              $_i = 1;
              while (1) {
                  {
                      package DB;
                      @_c = CORE::caller($_i);
                      if (@_c) {
                          $_c[4] = [@DB::args];
                      }
                  }
                  last unless @_c;
                  push @$stack_trace, [@_c];
                  $_i++;
              }
          }
          push @{ $meta->{logs} }, {
              type    => 'create',
              time    => time(),
              package => $caller[0],
              file    => $caller[1],
              line    => $caller[2],
              func    => $caller[3],
              ( stack_trace => $stack_trace ) x !!$stack_trace,
          };
      }
  
      #die;
      [$status, $msg, undef, $meta];
  }
  
  sub warn_err {
      require Carp;
  
      my $res = err(@_);
      Carp::carp("ERROR $res->[0]: $res->[1]");
  }
  
  sub die_err {
      require Carp;
  
      my $res = err(@_);
      Carp::croak("ERROR $res->[0]: $res->[1]");
  }
  
  sub caller {
      my $n0 = shift;
      my $n  = $n0 // 0;
  
      my $pkg = $Perinci::Sub::Wrapper::default_wrapped_package //
          'Perinci::Sub::Wrapped';
  
      my @r;
      my $i =  0;
      my $j = -1;
      while ($i <= $n+1) { # +1 for this sub itself
          $j++;
          @r = CORE::caller($j);
          last unless @r;
          if ($r[0] eq $pkg && $r[1] =~ /^\(eval /) {
              next;
          }
          $i++;
      }
  
      return unless @r;
      return defined($n0) ? @r : $r[0];
  }
  
  $SPEC{gen_modified_sub} = {
      v => 1.1,
      summary => 'Generate modified metadata (and subroutine) based on another',
      description => <<'_',
  
  Often you'll want to create another sub (and its metadata) based on another, but
  with some modifications, e.g. add/remove/rename some arguments, change summary,
  add/remove some properties, and so on.
  
  Instead of cloning the Rinci metadata and modify it manually yourself, this
  routine provides some shortcuts.
  
  You can specify base sub/metadata using `base_name` (string, subroutine name,
  either qualified or not) or `base_code` (coderef) + `base_meta` (hash).
  
  _
      args => {
          base_name => {
              summary => 'Subroutine name (either qualified or not)',
              schema => 'str*',
              description => <<'_',
  
  If not qualified with package name, will be searched in the caller's package.
  Rinci metadata will be searched in `%SPEC` package variable.
  
  Alternatively, you can also specify `base_code` and `base_meta`.
  
  _
          },
          base_code => {
              summary => 'Base subroutine code',
              schema  => 'code*',
              description => <<'_',
  
  If you specify this, you'll also need to specify `base_meta`.
  
  Alternatively, you can specify `base_name` instead, to let this routine search
  the base subroutine from existing Perl package.
  
  _
          },
          base_meta => {
              summary => 'Base Rinci metadata',
              schema  => 'hash*', # XXX defhash/rifunc
          },
          output_name => {
              summary => 'Where to install the modified sub',
              schema  => 'str*',
              description => <<'_',
  
  Subroutine will be put in the specified name. If the name is not qualified with
  package name, will use caller's package. If no `output_code` is specified, the
  base subroutine reference will be assigned here.
  
  Note that this argument is optional.
  
  _
          },
          output_code => {
              summary => 'Code for the modified sub',
              schema  => 'code*',
              description => <<'_',
  
  If not specified will use `base_code` (which will then be required).
  
  _
          },
          summary => {
              summary => 'Summary for the mod subroutine',
              schema  => 'str*',
          },
          description => {
              summary => 'Description for the mod subroutine',
              schema  => 'str*',
          },
          remove_args => {
              summary => 'List of arguments to remove',
              schema  => 'array*',
          },
          add_args => {
              summary => 'Arguments to add',
              schema  => 'hash*',
          },
          replace_args => {
              summary => 'Arguments to add',
              schema  => 'hash*',
          },
          rename_args => {
              summary => 'Arguments to rename',
              schema  => 'hash*',
          },
          modify_args => {
              summary => 'Arguments to modify',
              description => <<'_',
  
  For each argument you can specify a coderef. The coderef will receive the
  argument ($arg_spec) and is expected to modify the argument specification.
  
  _
              schema  => 'hash*',
          },
          modify_meta => {
              summary => 'Specify code to modify metadata',
              schema  => 'code*',
              description => <<'_',
  
  Code will be called with arguments ($meta) where $meta is the cloned Rinci
  metadata.
  
  _
          },
          install_sub => {
              schema  => 'bool',
              default => 1,
          },
      },
      result => {
          schema => ['hash*' => {
              keys => {
                  code => ['code*'],
                  meta => ['hash*'], # XXX defhash/risub
              },
          }],
      },
  };
  sub gen_modified_sub {
      require Function::Fallback::CoreOrPP;
  
      my %args = @_;
  
      # get base code/meta
      my ($base_code, $base_meta);
      if ($args{base_name}) {
          my ($pkg, $leaf);
          if ($args{base_name} =~ /(.+)::(.+)/) {
              ($pkg, $leaf) = ($1, $2);
          } else {
              $pkg  = CORE::caller();
              $leaf = $args{base_name};
          }
          no strict 'refs';
          $base_code = \&{"$pkg\::$leaf"};
          $base_meta = ${"$pkg\::SPEC"}{$leaf};
          die "Can't find Rinci metadata for $pkg\::$leaf" unless $base_meta;
      } elsif ($args{base_meta}) {
          $base_meta = $args{base_meta};
          $base_code = $args{base_code}
              or die "Please specify base_code";
      } else {
          die "Please specify base_name or base_code+base_meta";
      }
  
      my $output_meta = Function::Fallback::CoreOrPP::clone($base_meta);
      my $output_code = $args{output_code} // $base_code;
  
      # modify metadata
      for (qw/summary description/) {
          $output_meta->{$_} = $args{$_} if $args{$_};
      }
      if ($args{remove_args}) {
          delete $output_meta->{args}{$_} for @{ $args{remove_args} };
      }
      if ($args{add_args}) {
          for my $k (keys %{ $args{add_args} }) {
              my $v = $args{add_args}{$k};
              die "Can't add arg '$k' in mod sub: already exists"
                  if $output_meta->{args}{$k};
              $output_meta->{args}{$k} = $v;
          }
      }
      if ($args{replace_args}) {
          for my $k (keys %{ $args{replace_args} }) {
              my $v = $args{replace_args}{$k};
              die "Can't replace arg '$k' in mod sub: doesn't exist"
                  unless $output_meta->{args}{$k};
              $output_meta->{args}{$k} = $v;
          }
      }
      if ($args{rename_args}) {
          for my $old (keys %{ $args{rename_args} }) {
              my $new = $args{rename_args}{$old};
              my $as = $output_meta->{args}{$old};
              die "Can't rename arg '$old' in mod sub: doesn't exist" unless $as;
              die "Can't rename arg '$old'->'$new' in mod sub: ".
                  "new name already exist" if $output_meta->{args}{$new};
              $output_meta->{args}{$new} = $as;
              delete $output_meta->{args}{$old};
          }
      }
      if ($args{modify_args}) {
          for (keys %{ $args{modify_args} }) {
              $args{modify_args}{$_}->($output_meta->{args}{$_});
          }
      }
      if ($args{modify_meta}) {
          $args{modify_meta}->($output_meta);
      }
  
      # install
      if ($args{output_name}) {
          my ($pkg, $leaf);
          if ($args{output_name} =~ /(.+)::(.+)/) {
              ($pkg, $leaf) = ($1, $2);
          } else {
              $pkg  = CORE::caller();
              $leaf = $args{output_name};
          }
          no strict 'refs';
          no warnings 'redefine';
          *{"$pkg\::$leaf"}       = $output_code if $args{install_sub} // 1;
          ${"$pkg\::SPEC"}{$leaf} = $output_meta;
      }
  
      [200, "OK", {code=>$output_code, meta=>$output_meta}];
  }
  
  $SPEC{gen_curried_sub} = {
      v => 1.1,
      summary => 'Generate curried subroutine (and its metadata)',
      description => <<'_',
  
  This is a more convenient helper than `gen_modified_sub` if you want to create a
  new subroutine that has some of its arguments preset (so they no longer need to
  be present in the new metadata).
  
  For more general needs of modifying a subroutine (e.g. add some arguments,
  modify some arguments, etc) use `gen_modified_sub`.
  
  _
      args => {
          base_name => {
              summary => 'Subroutine name (either qualified or not)',
              schema => 'str*',
              description => <<'_',
  
  If not qualified with package name, will be searched in the caller's package.
  Rinci metadata will be searched in `%SPEC` package variable.
  
  _
              req => 1,
              pos => 0,
          },
          set_args => {
              summary => 'Arguments to set',
              schema  => 'hash*',
          },
          output_name => {
              summary => 'Where to install the modified sub',
              schema  => 'str*',
              description => <<'_',
  
  Subroutine will be put in the specified name. If the name is not qualified with
  package name, will use caller's package.
  
  _
              req => 1,
              pos => 2,
          },
      },
      args_as => 'array',
      result_naked => 1,
  };
  sub gen_curried_sub {
      my ($base_name, $set_args, $output_name) = @_;
  
      my $caller = CORE::caller();
  
      my ($base_pkg, $base_leaf);
      if ($base_name =~ /(.+)::(.+)/) {
          ($base_pkg, $base_leaf) = ($1, $2);
      } else {
          $base_pkg  = $caller;
          $base_leaf = $base_name;
      }
  
      my ($output_pkg, $output_leaf);
      if ($output_name =~ /(.+)::(.+)/) {
          ($output_pkg, $output_leaf) = ($1, $2);
      } else {
          $output_pkg  = $caller;
          $output_leaf = $output_name;
      }
  
      my $base_sub = \&{"$base_pkg\::$base_leaf"};
  
      my $res = gen_modified_sub(
          base_name   => "$base_pkg\::$base_leaf",
          output_name => "$output_pkg\::$output_leaf",
          output_code => sub {
              no strict 'refs';
              $base_sub->(@_, %$set_args);
          },
          remove_args => [keys %$set_args],
          install => 1,
      );
  
      die "Can't generate curried sub: $res->[0] - $res->[1]"
          unless $res->[0] == 200;
  
      1;
  }
  
  1;
  # ABSTRACT: Helper when writing functions
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Perinci::Sub::Util - Helper when writing functions
  
  =head1 VERSION
  
  This document describes version 0.46 of Perinci::Sub::Util (from Perl distribution Perinci-Sub-Util), released on 2017-01-31.
  
  =head1 SYNOPSIS
  
  Example for err() and caller():
  
   use Perinci::Sub::Util qw(err caller);
  
   sub foo {
       my %args = @_;
       my $res;
  
       my $caller = caller();
  
       $res = bar(...);
       return err($err, 500, "Can't foo") if $res->[0] != 200;
  
       [200, "OK"];
   }
  
  Example for die_err() and warn_err():
  
   use Perinci::Sub::Util qw(warn_err die_err);
   warn_err(403, "Forbidden");
   die_err(403, "Forbidden");
  
  Example for gen_modified_sub():
  
   use Perinci::Sub::Util qw(gen_modified_sub);
  
   $SPEC{list_users} = {
       v => 1.1,
       args => {
           search => {},
           is_suspended => {},
       },
   };
   sub list_users { ... }
  
   gen_modified_sub(
       output_name => 'list_suspended_users',
       base_name   => 'list_users',
       remove_args => ['is_suspended'],
       output_code => sub {
           list_users(@_, is_suspended=>1);
       },
   );
  
  Example for gen_curried_sub():
  
   use Perinci::Sub::Util qw(gen_curried_sub);
  
   $SPEC{list_users} = {
       v => 1.1,
       args => {
           search => {},
           is_suspended => {},
       },
   };
   sub list_users { ... }
  
   # simpler/shorter than gen_modified_sub, but can be used for currying only
   gen_curried_sub('list_users', {is_suspended=>1}, 'list_suspended_users');
  
  =head1 FUNCTIONS
  
  
  =head2 gen_curried_sub($base_name, $output_name, $set_args) -> any
  
  Generate curried subroutine (and its metadata).
  
  This is a more convenient helper than C<gen_modified_sub> if you want to create a
  new subroutine that has some of its arguments preset (so they no longer need to
  be present in the new metadata).
  
  For more general needs of modifying a subroutine (e.g. add some arguments,
  modify some arguments, etc) use C<gen_modified_sub>.
  
  This function is not exported by default, but exportable.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<$base_name>* => I<str>
  
  Subroutine name (either qualified or not).
  
  If not qualified with package name, will be searched in the caller's package.
  Rinci metadata will be searched in C<%SPEC> package variable.
  
  =item * B<$output_name>* => I<str>
  
  Where to install the modified sub.
  
  Subroutine will be put in the specified name. If the name is not qualified with
  package name, will use caller's package.
  
  =item * B<$set_args> => I<hash>
  
  Arguments to set.
  
  =back
  
  Return value:  (any)
  
  
  =head2 gen_modified_sub(%args) -> [status, msg, result, meta]
  
  Generate modified metadata (and subroutine) based on another.
  
  Often you'll want to create another sub (and its metadata) based on another, but
  with some modifications, e.g. add/remove/rename some arguments, change summary,
  add/remove some properties, and so on.
  
  Instead of cloning the Rinci metadata and modify it manually yourself, this
  routine provides some shortcuts.
  
  You can specify base sub/metadata using C<base_name> (string, subroutine name,
  either qualified or not) or C<base_code> (coderef) + C<base_meta> (hash).
  
  This function is not exported by default, but exportable.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<add_args> => I<hash>
  
  Arguments to add.
  
  =item * B<base_code> => I<code>
  
  Base subroutine code.
  
  If you specify this, you'll also need to specify C<base_meta>.
  
  Alternatively, you can specify C<base_name> instead, to let this routine search
  the base subroutine from existing Perl package.
  
  =item * B<base_meta> => I<hash>
  
  Base Rinci metadata.
  
  =item * B<base_name> => I<str>
  
  Subroutine name (either qualified or not).
  
  If not qualified with package name, will be searched in the caller's package.
  Rinci metadata will be searched in C<%SPEC> package variable.
  
  Alternatively, you can also specify C<base_code> and C<base_meta>.
  
  =item * B<description> => I<str>
  
  Description for the mod subroutine.
  
  =item * B<install_sub> => I<bool> (default: 1)
  
  =item * B<modify_args> => I<hash>
  
  Arguments to modify.
  
  For each argument you can specify a coderef. The coderef will receive the
  argument ($arg_spec) and is expected to modify the argument specification.
  
  =item * B<modify_meta> => I<code>
  
  Specify code to modify metadata.
  
  Code will be called with arguments ($meta) where $meta is the cloned Rinci
  metadata.
  
  =item * B<output_code> => I<code>
  
  Code for the modified sub.
  
  If not specified will use C<base_code> (which will then be required).
  
  =item * B<output_name> => I<str>
  
  Where to install the modified sub.
  
  Subroutine will be put in the specified name. If the name is not qualified with
  package name, will use caller's package. If no C<output_code> is specified, the
  base subroutine reference will be assigned here.
  
  Note that this argument is optional.
  
  =item * B<remove_args> => I<array>
  
  List of arguments to remove.
  
  =item * B<rename_args> => I<hash>
  
  Arguments to rename.
  
  =item * B<replace_args> => I<hash>
  
  Arguments to add.
  
  =item * B<summary> => I<str>
  
  Summary for the mod subroutine.
  
  =back
  
  Returns an enveloped result (an array).
  
  First element (status) is an integer containing HTTP status code
  (200 means OK, 4xx caller error, 5xx function error). Second element
  (msg) is a string containing error message, or 'OK' if status is
  200. Third element (result) is optional, the actual result. Fourth
  element (meta) is called result metadata and is optional, a hash
  that contains extra information.
  
  Return value:  (hash)
  
  =head2 caller([ $n ])
  
  Just like Perl's builtin caller(), except that this one will ignore wrapper code
  in the call stack. You should use this if your code is potentially wrapped. See
  L<Perinci::Sub::Wrapper> for more details.
  
  =head2 err(...) => ARRAY
  
  Experimental.
  
  Generate an enveloped error response (see L<Rinci::function>). Can accept
  arguments in an unordered fashion, by utilizing the fact that status codes are
  always integers, messages are strings, result metadata are hashes, and previous
  error responses are arrays. Error responses also seldom contain actual result.
  Status code defaults to 500, status message will default to "FUNC failed". This
  function will also fill the information in the C<logs> result metadata.
  
  Examples:
  
   err();    # => [500, "FUNC failed", undef, {...}];
   err(404); # => [404, "FUNC failed", undef, {...}];
   err(404, "Not found"); # => [404, "Not found", ...]
   err("Not found", 404); # => [404, "Not found", ...]; # order doesn't matter
   err([404, "Prev error"]); # => [500, "FUNC failed", undef,
                             #     {logs=>[...], prev=>[404, "Prev error"]}]
  
  Will put C<stack_trace> in logs only if C<Carp::Always> module is loaded.
  
  =head2 warn_err(...)
  
  This is a shortcut for:
  
   $res = err(...);
   warn "ERROR $res->[0]: $res->[1]";
  
  =head2 die_err(...)
  
  This is a shortcut for:
  
   $res = err(...);
   die "ERROR $res->[0]: $res->[1]";
  
  =head1 FAQ
  
  =head2 What if I want to put result ($res->[2]) into my result with err()?
  
  You can do something like this:
  
   my $err = err(...) if ERROR_CONDITION;
   $err->[2] = SOME_RESULT;
   return $err;
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Perinci-Sub-Util>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/sharyanto/perl-Perinci-Sub-Util>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Perinci-Sub-Util>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Perinci>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2017 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
PERINCI_SUB_UTIL

    $main::fatpacked{"Perinci/Sub/Util/Args.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PERINCI_SUB_UTIL_ARGS';
  package Perinci::Sub::Util::Args;
  
  our $DATE = '2017-01-31'; # DATE
  our $VERSION = '0.46'; # VERSION
  
  use 5.010001;
  use strict 'subs', 'vars';
  use warnings;
  
  use Exporter qw(import);
  our @EXPORT_OK = qw(
                         args_by_tag
                         argnames_by_tag
                         func_args_by_tag
                         func_argnames_by_tag
                         call_with_its_args
  );
  
  sub args_by_tag {
      my ($meta, $args, $tag) = @_;
  
      my @res;
      my $args_prop = $meta->{args} or return ();
      my $neg = $tag =~ s/\A!//;
      for my $argname (keys %$args_prop) {
          my $argspec = $args_prop->{$argname};
          if ($neg) {
              next unless !$argspec->{tags} ||
                  !(grep {$_ eq $tag} @{$argspec->{tags}});
          } else {
              next unless $argspec->{tags} &&
                  grep {$_ eq $tag} @{$argspec->{tags}};
          }
          push @res, $argname, $args->{$argname}
              if exists $args->{$argname};
      }
      @res;
  }
  
  sub argnames_by_tag {
      my ($meta, $tag) = @_;
  
      my @res;
      my $args_prop = $meta->{args} or return ();
      my $neg = 1 if $tag =~ s/\A!//;
      for my $argname (keys %$args_prop) {
          my $argspec = $args_prop->{$argname};
          if ($neg) {
              next unless !$argspec->{tags} ||
                  !(grep {$_ eq $tag} @{$argspec->{tags}});
          } else {
              next unless $argspec->{tags} &&
                  grep {$_ eq $tag} @{$argspec->{tags}};
          }
          push @res, $argname;
      }
      sort @res;
  }
  
  sub _find_meta {
      my $caller = shift;
      my $func_name = shift;
  
      if ($func_name =~ /(.+)::(.+)/) {
          return ${"$1::SPEC"}{$2};
      } else {
          return ${"$caller->[0]::SPEC"}{$func_name};
      }
  }
  
  sub func_args_by_tag {
      my ($func_name, $args, $tag) = @_;
      my $meta = _find_meta([caller(1)], $func_name)
          or die "Can't find Rinci function metadata for $func_name";
      args_by_tag($meta, $args, $tag);
  }
  
  sub func_argnames_by_tag {
      my ($func_name, $tag) = @_;
      my $meta = _find_meta([caller(1)], $func_name)
          or die "Can't find Rinci function metadata for $func_name";
      argnames_by_tag($meta, $tag);
  }
  
  sub call_with_its_args {
      my ($func_name, $args) = @_;
  
      my ($meta, $func);
      if ($func_name =~ /(.+)::(.+)/) {
          defined &{$func_name}
              or die "Function $func_name not defined";
          $func = \&{$func_name};
          $meta = ${"$1::SPEC"}{$2};
      } else {
          my @caller = caller(1);
          my $fullname = "$caller[0]::$func_name";
          defined &{$fullname}
              or die "Function $fullname not defined";
          $func = \&{$fullname};
          $meta = ${"$caller[0]::SPEC"}{$func_name};
      }
      $meta or die "Can't find Rinci function metadata for $func_name";
  
      my @args;
      if ($meta->{args}) {
          for my $argname (keys %{ $meta->{args} }) {
              push @args, $argname, $args->{$argname}
                  if exists $args->{$argname};
          }
      }
      $func->(@args);
  }
  
  1;
  # ABSTRACT: Utility routines related to Rinci arguments
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Perinci::Sub::Util::Args - Utility routines related to Rinci arguments
  
  =head1 VERSION
  
  This document describes version 0.46 of Perinci::Sub::Util::Args (from Perl distribution Perinci-Sub-Util), released on 2017-01-31.
  
  =head1 SYNOPSIS
  
   package MyPackage;
  
   use Perinci::Sub::Util::Args qw(
       args_by_tag
       argnames_by_tag
       func_args_by_tag
       func_argnames_by_tag
       call_with_its_args
   );
  
   our %SPEC;
  
   my %func1_args;
  
   $SPEC{myfunc1} = {
       v => 1.1,
       summary => 'My function one',
       args => {
           %func1_args = (
               foo => {tags=>['t1', 't2']},
               bar => {tags=>['t2', 't3']},
               baz => {},
           ),
       },
   };
   sub myfunc1 {
       my %args = @_;
   }
  
   $SPEC{myfunc2} = {
       v => 1.1,
       summary => 'My function two',
       args => {
           %func1_args,
           qux => {tags=>['t3']},
       },
   };
   sub myfunc2 {
       my %args = @_;
       my $res = call_with_its_args('myfunc1', \%args);
   }
  
  =head1 DESCRIPTION
  
  =head1 FUNCTIONS
  
  =head2 args_by_tag
  
  Usage:
  
   my %args = args_by_tag($meta, \%args0, $tag);
  
  Will select only keypairs from C<%args0> arguments which have tag C<$tag>.
  Examples:
  
   my %args = args_by_tag($SPEC{myfunc1}, {foo=>1, bar=>2, baz=>3, qux=>4}, 't2'); # (foo=>1, bar=>2)
  
  =head2 argnames_by_tag
  
  Usage:
  
   my @arg_names = argnames_by_tag($meta, $tag);
  
  Will select only argument names which have tag C<$tag>.
  
  =head2 func_args_by_tag
  
  Usage:
  
   my %args = func_args_by_tag($func_name, \%args0, $tag);
  
  Like L</args_by_tag> except that instead of supplying Rinci function metadata,
  you supply a function name. Rinci metadata will be searched in C<%SPEC>
  variable.
  
  =head2 func_argnames_by_tag
  
  Usage:
  
   my @argnames = func_argnames_by_tag($func_name, $tag);
  
  Like L</argnames_by_tag> except that instead of supplying Rinci function
  metadata, you supply a function name. Rinci metadata will be searched in
  C<%SPEC> variable.
  
  =head2 call_with_its_args
  
  Usage:
  
   my $res = call_with_its_args($func_name, \%args);
  
  Call function with arguments taken from C<%args>. Only arguments which the
  function declares it accepts will be passed.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Perinci-Sub-Util>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/sharyanto/perl-Perinci-Sub-Util>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Perinci-Sub-Util>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2017 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
PERINCI_SUB_UTIL_ARGS

    $main::fatpacked{"Perinci/Sub/Util/ResObj.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PERINCI_SUB_UTIL_RESOBJ';
  package Perinci::Sub::Util::ResObj;
  
  our $DATE = '2017-01-31'; # DATE
  our $VERSION = '0.46'; # VERSION
  
  use Carp;
  use overload
      q("") => sub {
          my $res = shift; "ERROR $err->[0]: $err->[1]\n" . Carp::longmess();
      };
  
  1;
  # ABSTRACT: An object that represents enveloped response suitable for die()-ing
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Perinci::Sub::Util::ResObj - An object that represents enveloped response suitable for die()-ing
  
  =head1 VERSION
  
  This document describes version 0.46 of Perinci::Sub::Util::ResObj (from Perl distribution Perinci-Sub-Util), released on 2017-01-31.
  
  =head1 SYNOPSIS
  
  Currently unused. See L<Perinci::Sub::Util>'s C<warn_err> and C<die_err>
  instead.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Perinci-Sub-Util>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/sharyanto/perl-Perinci-Sub-Util>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Perinci-Sub-Util>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2017 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
PERINCI_SUB_UTIL_RESOBJ

    $main::fatpacked{"Perinci/Sub/Util/Sort.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PERINCI_SUB_UTIL_SORT';
  package Perinci::Sub::Util::Sort;
  
  our $DATE = '2017-01-31'; # DATE
  our $VERSION = '0.46'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  
  require Exporter;
  our @ISA = qw(Exporter);
  our @EXPORT_OK = qw(
                         sort_args
                 );
  
  our %SPEC;
  
  sub sort_args {
      my $args = shift;
      sort {
          (($args->{$a}{pos} // 9999) <=> ($args->{$b}{pos} // 9999)) ||
              $a cmp $b
          } keys %$args;
  }
  
  1;
  # ABSTRACT: Sort routines
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Perinci::Sub::Util::Sort - Sort routines
  
  =head1 VERSION
  
  This document describes version 0.46 of Perinci::Sub::Util::Sort (from Perl distribution Perinci-Sub-Util), released on 2017-01-31.
  
  =head1 SYNOPSIS
  
   use Perinci::Sub::Util::Sort qw(sort_args);
  
   my $meta = {
       v => 1.1,
       args => {
           a1 => { pos=>0 },
           a2 => { pos=>1 },
           opt1 => {},
           opt2 => {},
       },
   };
   my @args = sort_args($meta->{args}); # ('a1','a2','opt1','opt2')
  
  =head1 FUNCTIONS
  
  =head2 sort_args(\%args) => LIST
  
  Sort argument in args property by pos, then by name.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Perinci-Sub-Util>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/sharyanto/perl-Perinci-Sub-Util>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Perinci-Sub-Util>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2017 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
PERINCI_SUB_UTIL_SORT

    $main::fatpacked{"Perinci/Sub/Wrapper.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PERINCI_SUB_WRAPPER';
  package Perinci::Sub::Wrapper;
  
  our $DATE = '2019-07-04'; # DATE
  our $VERSION = '0.851'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  use experimental 'smartmatch';
  use Log::ger;
  
  use Data::Dmp qw(dmp);
  use Function::Fallback::CoreOrPP qw(clone);
  use Perinci::Sub::Normalize qw(normalize_function_metadata);
  use Perinci::Sub::Util qw(err);
  
  use Exporter qw(import);
  our @EXPORT_OK = qw(wrap_sub);
  
  our $Log_Wrapper_Code = $ENV{LOG_PERINCI_WRAPPER_CODE} // 0;
  
  our %SPEC;
  
  $SPEC{':package'} = {
      v => 1.1,
      summary => 'A multi-purpose subroutine wrapping framework',
  };
  
  # "protocol version" (v). whenever there's a significant change in the basic
  # structure of the wrapper, which potentially cause some/a lot of property
  # handlers to stop working, we increase this. property handler must always state
  # which version it follows in its meta. if unspecified, it's assumed to be 1.
  our $protocol_version = 2;
  
  sub new {
      my ($class) = @_;
      bless {}, $class;
  }
  
  sub _check_module {
      my ($self, $mod) = @_;
  
      if ($self->{_args}{core}) {
          if ($mod =~ /\A(experimental|Scalar::Numeric::Util|Scalar::Util::Numeric::PP)\z/) {
              die "BUG: Requested non-core module '$mod' while wrap arg core=1";
          } elsif ($mod =~ /\A(warnings|List::Util)\z/) {
              # core modules
          } else {
              die "BUG: Haven't noted whether module '$mod' is core/non-core";
          }
      }
  
      if ($self->{_args}{pp}) {
          if ($mod =~ /\A(List::Util|Scalar::Numeric::Util)\z/) {
              die "BUG: Requested XS module '$mod' while wrap arg pp=1";
          } elsif ($mod =~ /\A(experimental|warnings|Scalar::Util::Numeric::PP)\z/) {
              # pp modules
          } else {
              die "BUG: Haven't noted whether module '$mod' is pure-perl/XS";
          }
      }
  
      if ($self->{_args}{core_or_pp}) {
          if ($mod =~ /\A(Scalar::Numeric::Util)\z/) {
              die "BUG: Requested non-core XS module '$mod' while wrap arg core_or_pp=1";
          } elsif ($mod =~ /\A(experimental|warnings|List::Util|Scalar::Util::Numeric::PP)\z/) {
              # core or pp modules
          } else {
              die "BUG: Haven't noted whether module '$mod' is non-core xs or not";
          }
      }
  }
  
  sub _add_module {
      my ($self, $mod) = @_;
      unless ($mod ~~ $self->{_modules}) {
          local $self->{_cur_section};
          $self->select_section('before_sub_require_modules');
          if ($mod =~ /\A(use|no) (\S+)/) {
              $self->_check_module($2);
              $self->push_lines("$mod;");
          } elsif ($mod =~ /\A\w+(::\w+)*\z/) {
              $self->_check_module($mod);
              $self->push_lines("require $mod;");
          } else {
              die "BUG: Invalid module name/statement: $mod";
          }
          push @{ $self->{_modules} }, $mod;
      }
  }
  
  sub _add_var {
      my ($self, $var, $value) = @_;
      unless (exists $self->{_vars}{$var}) {
          local $self->{_cur_section};
          $self->select_section('declare_vars');
          $self->push_lines("my \$$var = ".dmp($value).";");
          $self->{_vars}{$var} = $value;
      }
  }
  
  sub _known_sections {
  
      # order=>N regulates the order of code. embed=>1 means the code is for embed
      # mode only and should not be included in dynamic wrapper code.
  
      state $val = {
          before_sub_require_modules => {order=>1},
  
          # reserved by wrapper for setting Perl package and declaring 'sub {'
          OPEN_SUB => {order=>4},
  
          # reserved to say 'my %args = @_;' or 'my @args = @_;' etc
          ACCEPT_ARGS => {order=>5},
  
          # reserved to get args values if converted from array/arrayref
          ACCEPT_ARGS2 => {order=>6},
  
          declare_vars => {order=>7},
  
          # for handlers to put stuffs right before eval. for example, 'timeout'
          # uses this to set ALRM signal handler.
          before_eval => {order=>10},
  
          # reserved by wrapper for generating 'eval {'
          OPEN_EVAL => {order=>20},
  
          # used e.g. to load modules used by validation
          before_call_before_arg_validation => {order=>31},
  
          before_call_arg_validation => {order=>32},
  
          # used e.g. by dependency checking
          before_call_after_arg_validation => {order=>33},
  
          # feed arguments to sub
          before_call_feed_args => {order=>48},
  
          # for handlers that *must* do stuffs right before call
          before_call_right_before_call => {order=>49},
  
          # reserved by the wrapper for calling the sub
          CALL => {order=>50},
  
          # for handlers that *must* do stuffs right after call
          after_call_right_after_call => {order=>51},
  
          # reserved by the wrapper for adding/stripping result envelope, this
          # happens before result validation
          AFTER_CALL_ADD_OR_STRIP_RESULT_ENVELOPE => {order=>52},
  
          # used e.g. to load modules used by validation
          after_call_before_res_validation => {order=>61},
  
          after_call_res_validation => {order=>62},
  
          after_call_after_res_validation => {order=>63},
  
          # reserved by wrapper to put eval end '}' and capturing result in
          # $_w_res and $@ in $eval_err
          CLOSE_EVAL => {order=>70},
  
          # for handlers to put checks against $eval_err
          after_eval => {order=>80},
  
          # reserved for returning final result '$_w_res'
          BEFORE_CLOSE_SUB => {order=>99},
  
          # reserved for sub closing '}' line
          CLOSE_SUB => {order=>100},
      };
      $val;
  }
  
  sub section_empty {
      my ($self, $section) = @_;
      !$self->{_codes}{$section};
  }
  
  sub _needs_eval {
      my ($self) = @_;
      !($self->section_empty('before_eval') &&
            $self->section_empty('after_eval'));
  }
  
  # whether we need to store call result to a variable ($_w_res)
  sub _needs_store_res {
      my ($self) = @_;
      return 1 if $self->{_args}{validate_result};
      return 1 if $self->_needs_eval;
      my $ks = $self->_known_sections;
      for (grep {/^after_call/} keys %$ks) {
          return 1 unless $self->section_empty($_);
      }
      0;
  }
  
  sub _check_known_section {
      my ($self, $section) = @_;
      my $ks = $self->_known_sections;
      $ks->{$section} or die "BUG: Unknown code section '$section'";
  }
  
  sub _err {
      my ($self, $c_status, $c_msg) = @_;
      if ($self->{_meta}{result_naked}) {
          $self->push_lines(
              "warn 'ERROR ' . ($c_status) . ': '. ($c_msg);",
              'return undef;',
          );
      } else {
          $self->push_lines("return [$c_status, $c_msg];");
      }
  }
  
  sub _errif {
      my ($self, $c_status, $c_msg, $c_cond) = @_;
      $self->push_lines("if ($c_cond) {");
      $self->indent;
      $self->_err($c_status, $c_msg);
      $self->unindent;
      $self->push_lines('}');
  }
  
  sub select_section {
      my ($self, $section) = @_;
      $self->_check_known_section($section);
      $self->{_cur_section} = $section;
      $self;
  }
  
  sub indent {
      my ($self) = @_;
      my $section = $self->{_cur_section};
      $self->{_codes}{$section} //= undef;
      $self->{_levels}{$section}++;
      $self;
  }
  
  sub unindent {
      my ($self) = @_;
      my $section = $self->{_cur_section};
      $self->{_codes}{$section} //= undef;
      $self->{_levels}{$section}--;
      $self;
  }
  
  sub get_indent_level {
      my ($self) = @_;
      my $section = $self->{_cur_section};
      $self->{_levels}{$section} // 0;
  }
  
  # line can be code or comment. code should not contain string literals that
  # cross lines (i.e. contain literal newlines) because push_lines() might add
  # comment at the end of each line.
  
  sub push_lines {
      my ($self, @lines) = @_;
      my $section = $self->{_cur_section};
  
      unless (exists $self->{_codes}{$section}) {
          unshift @lines, "# * section: $section";
          # don't give blank line for the top-most section (order=>0)
          unshift @lines, "" if $self->_known_sections->{$section}{order};
          $self->{_codes}{$section} = [];
          $self->{_levels}{$section} = 0;
      }
  
      @lines = map {[$self->{_levels}{$section}, $_]} @lines;
      if ($self->{_args}{debug}) {
          for my $l (@lines) {
              $l->[2] =
                  $self->{_cur_handler} ?
                      "$self->{_cur_handler} prio=".$self->{_cur_handler_meta}{prio}
                          : "";
          }
      }
      push @{$self->{_codes}{$section}}, @lines;
      $self;
  }
  
  sub _join_codes {
      my ($self, $crit, $prev_section_level) = @_;
      my @lines;
      my $ks = $self->_known_sections;
      $prev_section_level //= 0;
      my $i = 0;
      for my $s (sort {$ks->{$a}{order} <=> $ks->{$b}{order}}
                     keys %$ks) {
          next if $self->section_empty($s);
          next unless $crit->(section => $s);
          $i++;
          for my $l (@{ $self->{_codes}{$s} }) {
              $l->[0] += $prev_section_level;
              die "BUG: Negative indent level in line $i (section $s): '$l->[1]'"
                  if $l->[0] < 0;
              my $s = ($self->{_args}{indent} x $l->[0]) . $l->[1];
              if (defined $l->[2]) {
                  my $num_ws = 80 - length($s);
                  $num_ws = 1 if $num_ws < 1;
                  $s .= (" " x $num_ws) . "## $l->[2]";
              }
              push @lines, $s;
          }
          $prev_section_level += $self->{_levels}{$s};
      }
      [join("\n", @lines), $prev_section_level];
  }
  
  sub _format_dyn_wrapper_code {
      my ($self) = @_;
      my $ks = $self->_known_sections;
      $self->_join_codes(
          sub {
              my %args = @_;
              my $section = $args{section};
              !$ks->{$section}{embed};
          })->[0];
  }
  
  # for embedded, we need to produce three sections which will be inserted in
  # different places, demonstrated below:
  #
  #   $SPEC{foo} = {
  #       ...
  #   };
  #   sub foo {
  #       my %args = @_;
  #       # do stuffs
  #   }
  #
  # becomes:
  #
  #   #PRESUB1: require modules (inserted before sub declaration)
  #   require Data::Dumper;
  #   require Scalar::Util;
  #
  #   $SPEC{foo} = {
  #       ...
  #   };
  #   #PRESUB2: modify metadata piece-by-piece (inserted before sub declaration &
  #   #after $SPEC{foo}). we're avoiding dumping the new modified metadata because
  #   #metadata might contain coderefs which is sometimes problematic when dumping
  #   {
  #       my $meta = $SPEC{foo};
  #       $meta->{v} = 1.1;
  #       $meta->{result_naked} = 0;
  #   }
  #
  #   sub foo {
  #       my %args = @_;
  #       #PREAMBLE: before call sections (inserted after accept args), e.g.
  #       #validate arguments, convert argument type, setup eval block
  #       #...
  #
  #       # do stuffs
  #
  #       #POSTAMBLE: after call sections (inserted before sub end), e.g.
  #       #validate result, close eval block and do retry/etc.
  #       #...
  #   }
  sub _format_embed_wrapper_code {
      my ($self) = @_;
  
      my $res = {};
      my $ks = $self->_known_sections;
      my $j;
  
      $j = $self->_join_codes(
          sub {
              my %args = @_;
              my $section = $args{section};
              $section =~ /\A(before_sub_require_modules)\z/;
          });
      $res->{presub1} = $j->[0];
  
      # no longer needed/produce, code to modify metadata
      $res->{presub2} = '';
  
      $j = $self->_join_codes(
          sub {
              my %args = @_;
              my $section = $args{section};
              my $order = $ks->{$section}{order};
              return 1 if $order > $ks->{ACCEPT_ARGS}{order} &&
                  $order < $ks->{CALL}{order};
              0;
          }, 1);
      $res->{preamble} = $j->[0];
  
      $j = $self->_join_codes(
          sub {
              my %args = @_;
              my $section = $args{section};
              my $order = $ks->{$section}{order};
              return 1 if $order > $ks->{CALL}{order} &&
                  $order < $ks->{CLOSE_SUB}{order};
              0;
          }, $j->[1]);
      $res->{postamble} = $j->[0];
  
      $res;
  }
  
  sub handlemeta_v { {} }
  sub handlemeta_name { {} }
  sub handlemeta_summary { {} }
  sub handlemeta_description { {} }
  sub handlemeta_tags { {} }
  sub handlemeta_default_lang { {} }
  sub handlemeta_links { {} }
  sub handlemeta_text_markup { {} }
  sub handlemeta_is_func { {} }
  sub handlemeta_is_meth { {} }
  sub handlemeta_is_class_meth { {} }
  sub handlemeta_examples { {} }
  
  # after args
  sub handlemeta_features { {v=>2, prio=>15} }
  sub handle_features {
      my ($self, %args) = @_;
  
      my $meta = $self->{_meta};
      my $v = $meta->{features} // {};
  
      $self->select_section('before_call_before_arg_validation');
  
      if ($v->{tx} && $v->{tx}{req}) {
          $self->push_lines('', '# check required transaction');
          $self->_errif(412, '"Must run with transaction (pass -tx_manager)"',
                        '!$args{-tx_manager}');
      }
  }
  
  # run before args
  sub handlemeta_args_as { {v=>2, prio=>1, convert=>1} }
  sub handle_args_as {
      my ($self, %args) = @_;
  
      my $value  = $args{value};
      my $new    = $args{new};
      my $meta   = $self->{_meta};
      my $args_p = $meta->{args} // {};
      my $opt_va = $self->{_args}{validate_args};
  
      # We support conversion of arguments between hash/hashref/array/arrayref. To
      # make it simple, currently the algorithm is as follow: we first form the
      # %args hash. If args_as is already 'hash', we just do 'my %args = @_'.
      # Otherwise, we convert from the other forms.
      #
      # We then validate each argument in %args (code generated in 'args'
      # handler).
      #
      # Finally, unless original args_as is 'hash' we convert to the final form
      # that the wrapped sub expects.
      #
      # This setup is optimal when both the sub and generated wrapper accept
      # 'hash', but suboptimal for other cases (especially positional ones, as
      # they have to undergo a round-trip to hash even when both accept 'array').
      # This will be rectified in the future.
  
      my $v = $new // $value;
  
      $self->select_section('ACCEPT_ARGS');
      if ($v eq 'hash') {
           $self->push_lines(q{die 'BUG: Odd number of hash elements supplied' if @_ % 2;})
               if $opt_va;
           $self->push_lines('my %args = @_;');
      } elsif ($v eq 'hashref') {
          $self->push_lines(q{die 'BUG: $_[0] needs to be hashref' if @_ && ref($_[0]) ne "HASH";})
              if $opt_va;
          $self->push_lines('my %args = %{$_[0] // {}};');
      } elsif ($v =~ /\Aarray(ref)?\z/) {
          my $ref = $1 ? 1:0;
          if ($ref) {
              $self->push_lines(q{die 'BUG: $_[0] needs to be arrayref' if @_ && ref($_[0]) ne "ARRAY";})
                  if $opt_va;
          }
          $self->push_lines('my %args;');
          $self->select_section('ACCEPT_ARGS2');
          for my $a (sort keys %$args_p) {
              my $as = $args_p->{$a};
              my $line = '$args{'.dmp($a).'} = ';
              defined($as->{pos}) or die "Error in args property for arg '$a': ".
                  "no pos defined";
              my $pos = int($as->{pos} + 0);
              $pos >= 0 or die "Error in args property for arg '$a': ".
                  "negative value in pos";
              if ($as->{slurpy} // $as->{greedy}) {
                  if ($ref) {
                      $line .= '[splice @{$_[0]}, '.$pos.'] if @{$_[0]} > '.$pos;
                  } else {
                      $line .= '[splice @_, '.$pos.'] if @_ > '.$pos;
                  }
              } else {
                  if ($ref) {
                      $line .= '$_[0]['.$pos.'] if @{$_[0]} > '.$pos;
                  } else {
                      $line .= '$_['.$pos.'] if @_ > '.$pos;
                  }
              }
              $self->push_lines("$line;");
          }
      } else {
          die "Unknown args_as value '$v'";
      }
  
      $self->select_section('ACCEPT_ARGS');
      if ($value eq 'hashref') {
          $self->push_lines('my $args;');
      } elsif ($value eq 'array') {
          $self->push_lines('my @args;');
      } elsif ($value eq 'arrayref') {
          $self->push_lines('my $args;');
      }
  
      my $tok;
      $self->select_section('before_call_feed_args');
      $v = $value;
      if ($v eq 'hash') {
          $tok = '%args';
      } elsif ($v eq 'hashref') {
          $tok = '$args';
          $self->push_lines($tok.' = \%args;'); # XXX should we set each arg instead?
      } elsif ($v =~ /\Aarray(ref)?\z/) {
          my $ref = $1 ? 1:0;
          $tok = ($ref ? '$':'@') . 'args';
          for my $a (sort {$args_p->{$a}{pos} <=> $args_p->{$b}{pos}}
                         keys %$args_p) {
              my $as = $args_p->{$a};
              my $t = '$args{'.dmp($a).'}';
              my $line;
              defined($as->{pos}) or die "Error in args property for arg '$a': ".
                  "no pos defined";
              my $pos = int($as->{pos} + 0);
              $pos >= 0 or die "Error in args property for arg '$a': ".
                  "negative value in pos";
              if ($as->{slurpy} // $as->{greedy}) {
                  $line = 'splice @args, '.$pos.', scalar(@args)-1, @{'.$t.'}';
              } else {
                  $line = '$args'.($ref ? '->':'').'['.$pos."] = $t if exists $t";
              }
              $self->push_lines("$line;");
          }
      } else {
          die "Unknown args_as value '$v'";
      }
      $self->{_args_token} = $tok;
  }
  
  sub _sah {
      require Data::Sah;
  
      my $self = shift;
      state $sah = Data::Sah->new;
      $sah;
  }
  
  sub _plc {
      my $self = shift;
      state $plc = do {
          my $plc = $self->_sah->get_compiler("perl");
          $plc->comment_style('shell2'); # to make all comment uses ## instead of #
          $plc;
      };
  }
  
  sub _handle_args {
      my ($self, %args) = @_;
  
      my $v = $args{v} // $self->{_meta}{args};
      return unless $v;
  
      my $opt_sin = $self->{_args}{_schema_is_normalized};
      my $opt_va  = $self->{_args}{validate_args};
  
      my $prefix = $args{prefix} // '';
      my $argsterm = $args{argsterm} // '%args';
  
      if ($opt_va) {
          $self->_add_module("use experimental 'smartmatch'");
          $self->select_section('before_call_arg_validation');
          $self->push_lines('', '# check args') if $prefix eq '';
          $self->push_lines("for (sort keys $argsterm) {");
          $self->indent;
          $self->_errif(400, q["Invalid argument name (please use letters/numbers/underscores only)'].$prefix.q[$_'"],
                        '!/\A(-?)\w+(\.\w+)*\z/o');
          $self->_errif(400, q["Unknown argument '].$prefix.q[$_'"],
                        '!($1 || $_ ~~ '.dmp([sort keys %$v]).')');
          $self->unindent;
          $self->push_lines('}');
      }
  
      for my $argname (sort keys %$v) {
          my $argspec = $v->{$argname};
  
          my $argterm = $argsterm;
          if ($argterm =~ /^%\{\s*(.+)\s*\}/) {
              $argterm = $1 . "->{'$argname'}";
          } elsif ($argterm =~ s/^%/\$/) {
              $argterm .= "{'$argname'}";
          } else {
              $argterm .= "->{'$argname'}";
          }
  
          my $has_default_prop = exists($argspec->{default});
          my $sch = $argspec->{schema};
  
          if ($sch) {
              my $has_sch_default  = ref($sch) eq 'ARRAY' &&
                  exists($sch->[1]{default}) ? 1:0;
              if ($opt_va) {
  
                  $self->push_lines("if (exists($argterm)) {");
                  $self->indent;
  
                  if ($argspec->{stream}) {
                      die "Error in schema for argument '$argname': must be str/buf/array if stream=1"
                          unless $sch->[0] =~ /\A(str|buf|array)\z/; # XXX allow 'any' if all of its 'of' values are str/buf/array
                      die "Error in schema for argument '$argname': must specify 'of' array clause if stream=1"
                          if $sch->[0] eq 'array' && !$sch->[1]{of};
  
                      $self->_errif(
                          400,
                          qq["Argument '$prefix$argname' (stream) fails validation: must be coderef"],
                          "!(ref($argterm) eq 'CODE')",
                      );
                      $self->push_lines('{ ## introduce scope because we want to declare a generic variable $i');
                      $self->indent;
                      $self->push_lines(
                          'my $i = -1;',
                          "my \$origsub = $argterm;",
                          '# arg coderef wrapper for validation',
                          "$argterm = sub {",
                      );
                      $self->indent;
                      $self->push_lines(
                          '$i++;',
                          "my \$rec = \$origsub->();",
                          'return undef unless defined $rec;',
                      );
                  }
  
                  my $dn = $argname; $dn =~ s/\W+/_/g;
                  my $cd = $self->_plc->compile(
                      data_name            => $dn,
                      data_term            => $argspec->{stream} ? '$rec' : $argterm,
                      schema               => $argspec->{stream} && $sch->[0] eq 'array' ? $sch->[1]{of} : $sch,
                      schema_is_normalized => $opt_sin,
                      return_type          => 'str',
                      indent_level         => $self->get_indent_level + 1,
                      core                 => $self->{_args}{core},
                      core_or_pp           => $self->{_args}{core_or_pp},
                      pp                   => $self->{_args}{pp},
                      %{ $self->{_args}{_extra_sah_compiler_args} // {}},
                  );
                  die "Incompatible Data::Sah version (cd v=$cd->{v}, expected 2)" unless $cd->{v} == 2;
                  for my $mod_rec (@{ $cd->{modules} }) {
                      next unless $mod_rec->{phase} eq 'runtime';
                      $self->_add_module($mod_rec->{use_statement} // $mod_rec->{name});
                  }
                  $self->_add_var($_, $cd->{vars}{$_})
                      for sort keys %{ $cd->{vars} };
                  $cd->{result} =~ s/\A\s+//;
                  $self->push_lines(
                      "my \$err_$dn;",
                      "$cd->{result};",
                  );
                  if ($argspec->{stream}) {
                      $self->push_lines(
                          'if ('."\$err_$dn".') { die "Record #$i of streaming argument '."'$prefix$argname'".' ($rec) fails validation: '."\$err_$dn".'" }',
                          '$rec;',
                      );
                  } else {
                      $self->_errif(
                          400, qq["Argument '$prefix$argname' fails validation: \$err_$dn"],
                          "\$err_$dn");
                  }
                  if ($argspec->{meta}) {
                      $self->push_lines("# check subargs of $prefix$argname");
                      $self->_handle_args(
                              %args,
                              v => $argspec->{meta}{args},
                              prefix => ($prefix ? "$prefix/" : "") . "$argname/",
                              argsterm => '%{'.$argterm.'}',
                          );
                  }
                  if ($argspec->{element_meta}) {
                      $self->push_lines("# check element subargs of $prefix$argname");
                      my $indexterm = "$prefix$argname";
                      $indexterm =~ s/\W+/_/g;
                      $indexterm = '$i_' . $indexterm;
                      $self->push_lines('for my '.$indexterm.' (0..$#{ '.$argterm.' }) {');
                      $self->indent;
                      $self->_errif(
                          400, qq("Argument '$prefix$argname\[).qq($indexterm]' fails validation: must be hash"),
                          "ref($argterm\->[$indexterm]) ne 'HASH'");
                      $self->_handle_args(
                          %args,
                          v => $argspec->{element_meta}{args},
                          prefix => ($prefix ? "$prefix/" : "") . "$argname\[$indexterm]/",
                          argsterm => '%{'.$argterm.'->['.$indexterm.']}',
                      );
                      $self->unindent;
                      $self->push_lines('}');
                  }
                  $self->unindent;
                  if ($argspec->{stream}) {
                      $self->push_lines('}; ## arg coderef wrapper');
                      $self->unindent;
                      $self->push_lines('} ## close scope');
                      $self->unindent;
                  }
                  if ($has_default_prop) {
                      $self->push_lines(
                          '} else {',
                          "    $argterm //= ".dmp($argspec->{default}).";");
                  } elsif ($has_sch_default) {
                      $self->push_lines(
                          '} else {',
                          "    $argterm //= ".dmp($sch->[1]{default}).";");
                  }
                  $self->push_lines("} ## if exists arg $prefix$argname");
              } # if opt_va
  
          } elsif ($has_default_prop) {
              # doesn't have schema but have 'default' property, we still need to
              # set default here
              $self->push_lines("$argterm = ".dmp($argspec->{default}).
                                    " if !exists($argterm);");
          }
          if ($argspec->{req} && $opt_va) {
              $self->_errif(
                  400, qq["Missing required argument: $argname"],
                  "!exists($argterm)");
          }
      } # for arg
  }
  
  sub handlemeta_args { {v=>2, prio=>10} }
  sub handle_args {
      my ($self, %args) = @_;
      $self->_handle_args(%args);
  }
  
  # after args
  sub handlemeta_args_rels { {v=>2, prio=>11} }
  sub handle_args_rels {
      my ($self, %args) = @_;
  
      my $v = $args{v} // $self->{_meta}{args_rels};
      return unless $v;
  
      my $argsterm = $args{argsterm} // '%args';
  
      $self->select_section('before_call_arg_validation');
      $self->push_lines('', '# check args_rels');
  
      my $dn = "args_rels";
      my $hc = $self->_sah->get_compiler("human");
      my $cd_h = $hc->init_cd;
      $cd_h->{args}{lang} //= $cd_h->{default_lang};
  
      my $cd = $self->_plc->compile(
          data_name            => $dn,
          data_term            => "\\$argsterm",
          schema               => ['hash', $v],
          return_type          => 'str',
          indent_level         => $self->get_indent_level + 1,
          human_hash_values    => {
              field  => $hc->_xlt($cd_h, "argument"),
              fields => $hc->_xlt($cd_h, "arguments"),
          },
          core                 => $self->{_args}{core},
          core_or_pp           => $self->{_args}{core_or_pp},
          pp                   => $self->{_args}{pp},
      );
      die "Incompatible Data::Sah version (cd v=$cd->{v}, expected 2)" unless $cd->{v} == 2;
      for my $mod_rec (@{ $cd->{modules} }) {
          next unless $mod_rec->{phase} eq 'runtime';
          $self->_add_module($mod_rec->{use_statement} // $mod_rec->{name});
      }
      $self->_add_var($_, $cd->{vars}{$_}) for sort keys %{ $cd->{vars} };
      $cd->{result} =~ s/\A\s+//;
      $self->push_lines(
          "my \$err_$dn;",
          "$cd->{result};",
      );
      $self->_errif(
          400, qq["\$err_$dn"],
          "\$err_$dn");
  }
  
  sub handlemeta_result { {v=>2, prio=>50} }
  sub handle_result {
      require Data::Sah;
  
      my ($self, %args) = @_;
  
      my $meta = $self->{_meta};
      my $v = $meta->{result};
      return unless $v;
  
      my $opt_sin = $self->{_args}{_schema_is_normalized};
      my $opt_vr  = $self->{_args}{validate_result};
  
      my %schemas_by_status; # key = status, value = schema
  
      # collect and check handlers
      my %handler_args;
      my %handler_metas;
      for my $k0 (keys %$v) {
          my $k = $k0;
          $k =~ s/\..+//;
          next if $k =~ /\A_/;
  
          # check builtin result spec key
          next if $k =~ /\A(
                             summary|description|tags|default_lang|
                             schema|statuses|stream|
                             x
                         )\z/x;
          # try a property module first
          require "Perinci/Sub/Property/result/$k.pm";
          my $meth = "handlemeta_result__$k";
          unless ($self->can($meth)) {
              die "No handler for property result/$k0 ($meth)";
          }
          my $hm = $self->$meth;
          $hm->{v} //= 1;
          next unless defined $hm->{prio};
          die "Please update property handler result/$k which is still at v=$hm->{v} ".
              "(needs v=$protocol_version)"
                  unless $hm->{v} == $protocol_version;
          my $ha = {
              prio=>$hm->{prio}, value=>$v->{$k0}, property=>$k0,
              meth=>"handle_result__$k",
          };
          $handler_args{$k} = $ha;
          $handler_metas{$k} = $hm;
      }
  
      # call all the handlers in order
      for my $k (sort {$handler_args{$a}{prio} <=> $handler_args{$b}{prio}}
                     keys %handler_args) {
          my $ha = $handler_args{$k};
          my $meth = $ha->{meth};
          local $self->{_cur_handler}      = $meth;
          local $self->{_cur_handler_meta} = $handler_metas{$k};
          local $self->{_cur_handler_args} = $ha;
          $self->$meth(args=>\%args, meta=>$meta, %$ha);
      }
  
      # validate result
      my @modules;
      if ($v->{schema} && $opt_vr) {
          $schemas_by_status{200} = $v->{schema};
      }
      if ($v->{statuses} && $opt_vr) {
          for my $s (keys %{$v->{statuses}}) {
              my $sv = $v->{statuses}{$s};
              if ($sv->{schema}) {
                  $schemas_by_status{$s} = $sv->{schema};
              }
          }
      }
  
      my $sub_name = $self->{_args}{sub_name};
  
      if ($opt_vr) {
          $self->select_section('after_call_res_validation');
          $self->push_lines(
              'my $_w_res2 = $_w_res->[2];',
              'my $_w_res_is_stream = $_w_res->[3]{stream} // ' . ($v->{stream} ? 1:0) . ';',
          );
          $self->_errif(
              500,
              q["Stream result must be coderef"],
              '$_w_res_is_stream && ref($_w_res2) ne "CODE"',
          );
          for my $s (sort keys %schemas_by_status) {
              my $sch = $schemas_by_status{$s};
              if ($v->{stream}) {
                  die "Error in result schema: must be str/buf/array if stream=1"
                      unless $sch->[0] =~ /\A(str|buf|array)\z/; # XXX allow 'any' if all of its 'of' values are str/buf/array
                  die "Error in result schema: must specify 'of' array clause if stream=1"
                      if $sch->[0] eq 'array' && !$sch->[1]{of};
              }
              $self->push_lines("if (\$_w_res->[0] == $s) {");
              $self->indent;
              $self->push_lines('if (!$_w_res_is_stream) {');
              $self->indent;
  
              # validation for when not a stream
              my $cd = $self->_plc->compile(
                  data_name            => '_w_res2',
                  # err_res can clash on arg named 'res'
                  err_term             => '$_w_err2_res',
                  schema               => $sch,
                  schema_is_normalized => $opt_sin,
                  return_type          => 'str',
                  indent_level         => $self->get_indent_level + 1,
                  core                 => $self->{_args}{core},
                  core_or_pp           => $self->{_args}{core_or_pp},
                  pp                   => $self->{_args}{pp},
                  %{ $self->{_args}{_extra_sah_compiler_args} // {}},
              );
              die "Incompatible Data::Sah version (cd v=$cd->{v}, expected 2)" unless $cd->{v} == 2;
              for my $mod_rec (@{ $cd->{modules} }) {
                  next unless $mod_rec->{phase} eq 'runtime';
                  $self->_add_module($mod_rec->{use_statement} // $mod_rec->{name});
              }
              $self->_add_var($_, $cd->{vars}{$_})
                  for sort keys %{ $cd->{vars} };
              $self->push_lines("my \$_w_err2_res;");
              $cd->{result} =~ s/\A\s+//;
              $self->push_lines("$cd->{result};");
              $self->_errif(
                  500,
                  qq["BUG: Result from sub $sub_name (\$_w_res2) fails validation: ].
                      qq[\$_w_err2_res"],
                  "\$_w_err2_res");
              $self->unindent;
              $self->push_lines("} else {"); # stream
              $self->indent;
              $self->push_lines(
                  'my $i = -1;',
                  '# wrap result coderef for validation',
                  '$_w_res->[2] = sub {',
              );
              $self->indent;
              $self->push_lines(
                  '$i++;',
                  'my $rec = $_w_res2->();',
                  'return undef unless defined $rec;',
              );
              # generate schema code once again, this time for when stream
              $cd = $self->_plc->compile(
                  data_name            => 'rec',
                  # err_res can clash on arg named 'res'
                  err_term             => '$rec_err',
                  schema               => $sch->[0] eq 'array' ? $sch->[1]{of} : $sch,
                  schema_is_normalized => $opt_sin,
                  return_type          => 'str',
                  indent_level         => $self->get_indent_level + 1,
                  core                 => $self->{_args}{core},
                  core_or_pp           => $self->{_args}{core_or_pp},
                  pp                   => $self->{_args}{pp},
                  %{ $self->{_args}{_extra_sah_compiler_args} // {}},
              );
              die "Incompatible Data::Sah version (cd v=$cd->{v}, expected 2)" unless $cd->{v} == 2;
              # XXX no need to require modules required by validator?
              $self->push_lines('my $rec_err;');
              $cd->{result} =~ s/\A\s+//;
              $self->push_lines("$cd->{result};");
              $self->push_lines('if ($rec_err) { die "BUG: Result stream record #$i ($rec) fails validation: $rec_err" }');
              $self->push_lines('$rec;');
              $self->unindent;
              $self->push_lines('}; ## result coderef wrapper');
              $self->unindent;
              $self->push_lines("} ## if stream");
              $self->unindent;
              $self->push_lines("} ## if status=$s");
          } # for schemas_by_status
      }
  }
  
  sub handlemeta_result_naked { {v=>2, prio=>99, convert=>1} }
  sub handle_result_naked {
      my ($self, %args) = @_;
  
      my $old = $args{value};
      my $v   = $args{new} // $old;
  
      return if !!$v == !!$old;
  
      $self->select_section('AFTER_CALL_ADD_OR_STRIP_RESULT_ENVELOPE');
      if ($v) {
          $self->push_lines(
              '', '# strip result envelope',
              '$_w_res = $_w_res->[2];',
          );
      } else {
          $self->push_lines(
              '', '# add result envelope',
              '$_w_res = [200, "OK", $_w_res];',
          );
      }
  }
  
  sub handlemeta_deps { {v=>2, prio=>0.5} }
  sub handle_deps {
      my ($self, %args) = @_;
      my $value = $args{value};
      my $meta  = $self->{_meta};
      my $v     = $self->{_args}{meta_name};
      $self->select_section('before_call_after_arg_validation');
      $self->push_lines('', '# check dependencies');
      $self->_add_module("Perinci::Sub::DepChecker");
      #$self->push_lines('use Data::Dump; dd '.$v.';');
      $self->push_lines('my $_w_deps_res = Perinci::Sub::DepChecker::check_deps('.
                            $v.'->{deps});');
      $self->_errif(412, '"Deps failed: $_w_deps_res"', '$_w_deps_res');
  
      # we handle some deps our own
      if ($value->{tmp_dir}) {
          $self->_errif(412, '"Dep failed: please specify -tmp_dir"',
                        '!$args{-tmp_dir}');
      }
      if ($value->{trash_dir}) {
          $self->_errif(412, '"Dep failed: please specify -trash_dir"',
                        '!$args{-trash_dir}');
      }
      if ($value->{undo_trash_dir}) {
          $self->_errif(412, '"Dep failed: please specify -undo_trash_dir"',
                        '!($args{-undo_trash_dir} || $args{-tx_manager} || '.
                            '$args{-undo_action} && $args{-undo_action}=~/\A(?:undo|redo)\z/)');
      }
  }
  
  sub handlemeta_x { {} }
  sub handlemeta_entity_v { {} }
  sub handlemeta_entity_date { {} }
  
  sub _reset_work_data {
      my ($self, %args) = @_;
  
      # to make it stand out more, all work/state data is prefixed with
      # underscore.
  
      $self->{_cur_section}      = undef;
      $self->{_cur_handler}      = undef;
      $self->{_cur_handler_args} = undef;
      $self->{_cur_handler_meta} = undef;
      $self->{_levels}           = {};
      $self->{_codes}            = {};
      $self->{_modules}          = []; # modules loaded by wrapper sub
      $self->{$_} = $args{$_} for keys %args;
  }
  
  sub wrap {
      require Scalar::Util;
  
      my ($self, %args) = @_;
  
      my $wrap_log_prop = "x.perinci.sub.wrapper.logs";
  
      # required arguments
      my $sub      = $args{sub};
      my $sub_name = $args{sub_name};
      $sub || $sub_name or return [400, "Please specify sub or sub_name"];
      $args{meta} or return [400, "Please specify meta"];
      my $meta_name = $args{meta_name};
      # we clone the meta because we'll replace stuffs
      my $meta     = clone($args{meta});
      my $wrap_logs = $meta->{$wrap_log_prop} // [];
  
      # currently internal args, not exposed/documented
      $args{_compiled_package}           //= 'Perinci::Sub::Wrapped';
      my $comppkg  = $args{_compiled_package};
      $args{_schema_is_normalized}       //=
          $wrap_logs->[-1] && $wrap_logs->[-1]{normalize_schema} ? 1 : 0;
      $args{_embed}                      //= 0;
      $args{_extra_sah_compiler_args}    //= undef;
  
      # defaults for arguments
      $args{indent}                      //= " " x 4;
      $args{convert}                     //= {};
      $args{compile}                     //= 1;
      $args{log}                         //= 1;
      $args{validate_args}               //= 0
          # function states that it can validate args, so by default we don't have
          # to do validation for it.
          if $meta->{features} && $meta->{features}{validate_args};
      $args{validate_args}               //= 0
          # function might want to disable validate_args by default, e.g. if
          # source code has been processed with
          # Dist::Zilla::Plugin::Rinci::Validate
          if $meta->{'x.perinci.sub.wrapper.disable_validate_args'};
      $args{validate_args}               //= 0
          # by default do not validate args again if previous wrapper(s) have
          # already done it
          if (grep {$_->{validate_args}} @$wrap_logs);
      $args{validate_args}               //= 1;
      $args{validate_result}             //= 0
          # function might want to disable validate_result by default, e.g. if
          # source code has been processed with
          # Dist::Zilla::Plugin::Rinci::Validate
          if $meta->{'x.perinci.sub.wrapper.disable_validate_result'};
      $args{validate_result}             //= 0
          # by default do not validate result again if previous wrapper(s) have
          # already done it
          if (grep {$_->{validate_result}} @$wrap_logs);
      $args{validate_result}             //= 1;
      $args{core}                        //= $ENV{PERINCI_WRAPPER_CORE};
      $args{core_or_pp}                  //= $ENV{PERINCI_WRAPPER_CORE_OR_PP};
      $args{pp}                          //= $ENV{PERINCI_WRAPPER_PP};
  
      my $sub_ref_name;
      # if sub_name is not provided, create a unique name for it. it is needed by
      # the wrapper-generated code (e.g. printing error messages)
      if (!$sub_name || $sub) {
          my $n = $comppkg . "::sub".Scalar::Util::refaddr($sub);
          no strict 'refs'; no warnings; ${$n} = $sub;
          use experimental 'smartmatch';
          if (!$sub_name) {
              $args{sub_name} = $sub_name = '$' . $n;
          }
          $sub_ref_name = '$' . $n;
      }
      # if meta name is not provided, we store the meta somewhere, it is needed by
      # the wrapper-generated code (e.g. deps clause).
      if (!$meta_name) {
          my $n = $comppkg . "::meta".Scalar::Util::refaddr($meta);
          no strict 'refs'; no warnings; ${$n} = $meta;
          use experimental 'smartmatch';
          $args{meta_name} = $meta_name = '$' . $n;
      }
  
      # shallow copy
      my $opt_cvt = { %{ $args{convert} } };
      my $opt_sin = $args{_schema_is_normalized};
  
      $meta = normalize_function_metadata($meta)
          unless $opt_sin;
  
      $self->_reset_work_data(_args=>\%args, _meta=>$meta);
  
      # add properties from convert, if not yet mentioned in meta
      for (keys %$opt_cvt) {
          $meta->{$_} = undef unless exists $meta->{$_};
      }
  
      # mark in the metadata that we have done the wrapping, so future wrapping
      # can avoid needless duplicated functionality (like validating args twice).
      # note that handler can log their mark too.
      {
          my @wrap_log = @{ $meta->{$wrap_log_prop} // [] };
          push @wrap_log, {
              validate_args     => $args{validate_args},
              validate_result   => $args{validate_result},
              normalize_schema  => !$opt_sin,
          };
          if ($args{log}) {
              $meta->{$wrap_log_prop} = \@wrap_log;
          }
      }
  
      # start iterating over properties
  
      $self->select_section('OPEN_SUB');
      $self->push_lines(
          "package $comppkg;", 'sub {');
      $self->indent;
  
      $meta->{args_as} //= "hash";
  
      if ($meta->{args_as} =~ /hash/) {
          $self->select_section('before_call_after_arg_validation');
          # tell function it's being wrapped, currently disabled
          #$self->push_lines('$args{-wrapped} = 1;');
      }
  
      my %props = map {$_=>1} keys %$meta;
      $props{$_} = 1 for keys %$opt_cvt;
  
      # collect and check handlers
      my %handler_args;
      my %handler_metas;
      for my $k0 (keys %props) {
          my $k = $k0;
          $k =~ s/\..+//;
          next if $k =~ /\A_/;
          next if $handler_args{$k};
          #if ($k ~~ $self->{_args}{skip}) {
          #    $log->tracef("Skipped property %s (mentioned in skip)", $k);
          #    next;
          #}
          return [500, "Invalid property name $k"] unless $k =~ /\A\w+\z/;
          my $meth = "handlemeta_$k";
          unless ($self->can($meth)) {
              # try a property module first
              require "Perinci/Sub/Property/$k.pm";
              unless ($self->can($meth)) {
                  return [500, "No handler for property $k0 ($meth)"];
              }
          }
          my $hm = $self->$meth;
          $hm->{v} //= 1;
          next unless defined $hm->{prio};
          die "Please update property handler $k which is still at v=$hm->{v} ".
              "(needs v=$protocol_version)"
                  unless $hm->{v} == $protocol_version;
          my $ha = {
              prio=>$hm->{prio}, value=>$meta->{$k0}, property=>$k0,
              meth=>"handle_$k",
          };
          if (exists $opt_cvt->{$k0}) {
              return [501, "Property '$k0' does not support conversion"]
                  unless $hm->{convert};
              $ha->{new}   = $opt_cvt->{$k0};
              $meta->{$k0} = $opt_cvt->{$k0};
          }
          $handler_args{$k}  = $ha;
          $handler_metas{$k} = $hm;
      }
  
      # call all the handlers in order
      for my $k (sort {$handler_args{$a}{prio} <=> $handler_args{$b}{prio}}
                     keys %handler_args) {
          my $ha = $handler_args{$k};
          my $meth = $ha->{meth};
          local $self->{_cur_handler}      = $meth;
          local $self->{_cur_handler_meta} = $handler_metas{$k};
          local $self->{_cur_handler_args} = $ha;
          $self->$meth(args=>\%args, meta=>$meta, %$ha);
      }
  
      my $needs_store_res = $self->_needs_store_res;
      if ($needs_store_res) {
          $self->_add_var('_w_res');
      }
  
      $self->select_section('CALL');
      my $sn = $sub_ref_name // $sub_name;
      $self->push_lines(
          ($needs_store_res ? '$_w_res = ' : "") .
          $sn. ($sn =~ /^\$/ ? "->" : "").
              "(".$self->{_args_token}.");");
      if ($args{validate_result}) {
          $self->select_section('after_call_before_res_validation');
          unless ($meta->{result_naked}) {
              $self->push_lines(
                  '',
                  '# check that sub produces enveloped result',
                  'unless (ref($_w_res) eq "ARRAY" && $_w_res->[0]) {',
              );
              $self->indent;
              if (log_is_trace) {
                  $self->_add_module('Data::Dumper');
                  $self->push_lines(
                      'local $Data::Dumper::Purity   = 1;',
                      'local $Data::Dumper::Terse    = 1;',
                      'local $Data::Dumper::Indent   = 0;',
                  );
                  $self->_err(500,
                              qq['BUG: Sub $sub_name does not produce envelope: '.].
                                  qq[Data::Dumper::Dumper(\$_w_res)]);
              } else {
                  $self->_err(500,
                              qq['BUG: Sub $sub_name does not produce envelope']);
              }
              $self->unindent;
              $self->push_lines('}');
          }
      }
  
      my $use_eval = $self->_needs_eval;
      if ($use_eval) {
          $self->select_section('CLOSE_EVAL');
          $self->push_lines('return $_w_res;');
          $self->unindent;
          $self->_add_var('_w_eval_err');
          $self->push_lines(
              '};',
              '$_w_eval_err = $@;');
  
          # _needs_eval will automatically be enabled here, due after_eval being
          # filled
          $self->select_section('after_eval');
          $self->push_lines('warn $_w_eval_err if $_w_eval_err;');
          $self->_errif(500, '"Function died: $_w_eval_err"', '$_w_eval_err');
  
          $self->select_section('OPEN_EVAL');
          $self->push_lines('eval {');
          $self->indent;
      }
  
      # return sub result
      $self->select_section('BEFORE_CLOSE_SUB');
      $self->push_lines('return $_w_res;') if $needs_store_res;
      $self->select_section('CLOSE_SUB');
      $self->unindent;
      $self->push_lines('}'); # wrapper sub
  
      # return wrap result
      my $result = {
          sub_name     => $sub_name,
          sub_ref_name => $sub_ref_name,
          meta         => $meta,
          meta_name    => $meta_name,
          use_eval     => $use_eval,
      };
      if ($args{embed}) {
          $result->{source} = $self->_format_embed_wrapper_code;
      } else {
          my $source = $self->_format_dyn_wrapper_code;
          if ($Log_Wrapper_Code && log_is_trace()) {
              require String::LineNumber;
              log_trace("wrapper code:\n%s",
                           $ENV{LINENUM} // 1 ?
                               String::LineNumber::linenum($source) :
                                     $source);
          }
          $result->{source} = $source;
          if ($args{compile}) {
              my $wrapped = eval $source;
              die "BUG: Wrapper code can't be compiled: $@" if $@ || !$wrapped;
              $result->{sub}  = $wrapped;
          }
      }
  
      [200, "OK", $result];
  }
  
  $SPEC{wrap_sub} = {
      v => 1.1,
      summary => 'Wrap subroutine to do various things, '.
          'like enforcing Rinci properties',
      result => {
          summary => 'The wrapped subroutine along with its new metadata',
          description => <<'_',
  
  Aside from wrapping the subroutine, the wrapper will also create a new metadata
  for the subroutine. The new metadata is a clone of the original, with some
  properties changed, e.g. schema in `args` and `result` normalized, some values
  changed according to the `convert` argument, some defaults set, etc.
  
  The new metadata will also contain (or append) the wrapping log located in the
  `x.perinci.sub.wrapper.logs` attribute. The wrapping log marks that the wrapper
  has added some functionality (like validating arguments or result) so that
  future nested wrapper can choose to avoid duplicating the same functionality.
  
  _
          schema=>['hash*'=>{keys=>{
              sub=>'code*',
              source=>['any*' => of => ['str*', ['hash*' => each_value=>'str*']]],
              meta=>'hash*',
          }}],
      },
      args => {
          sub => {
              schema => 'str*',
              summary => 'The code to be wrapped',
              description => <<'_',
  
  At least one of `sub` or `sub_name` must be specified.
  
  _
          },
          sub_name => {
              schema => 'str*',
              summary => 'The name of the subroutine, '.
                  'e.g. func or Foo::func (qualified)',
              description => <<'_',
  
  At least one of `sub` or `sub_name` must be specified.
  
  _
          },
          meta => {
              schema => 'hash*',
              summary => 'The function metadata',
              req => 1,
          },
          meta_name => {
              schema => 'str*',
              summary => 'Where to find the metadata, e.g. "$SPEC{foo}"',
              description => <<'_',
  
  Some wrapper code (e.g. handler for `dep` property) needs to refer to the
  function metadata. If not provided, the wrapper will store the function metadata
  in a unique variable (e.g. `$Perinci::Sub::Wrapped::meta34127816`).
  
  _
          },
          convert => {
              schema => 'hash*',
              summary => 'Properties to convert to new value',
              description => <<'_',
  
  Not all properties can be converted, but these are a partial list of those that
  can: v (usually do not need to be specified when converting from 1.0 to 1.1,
  will be done automatically), args_as, result_naked, default_lang.
  
  _
          },
          compile => {
              schema => ['bool' => {default=>1}],
              summary => 'Whether to compile the generated wrapper',
              description => <<'_',
  
  Can be set to 0 to not actually wrap but just return the generated wrapper
  source code.
  
  _
          },
          compile => {
              schema => ['bool' => {default=>1}],
              summary => 'Whether to compile the generated wrapper',
              description => <<'_',
  
  Can be set to 0 to not actually wrap but just return the generated wrapper
  source code.
  
  _
          },
          debug => {
              schema => [bool => {default=>0}],
              summary => 'Generate code with debugging',
              description => <<'_',
  
  If turned on, will produce various debugging in the generated code. Currently
  what this does:
  
  * add more comments (e.g. for each property handler)
  
  _
          },
          validate_args => {
              schema => ['bool'],
              summary => 'Whether wrapper should validate arguments',
              description => <<'_',
  
  If set to true, will validate arguments. Validation error will cause status 400
  to be returned. The default is to enable this unless previous wrapper(s) have
  already done this.
  
  _
          },
          validate_result => {
              schema => ['bool'],
              summary => 'Whether wrapper should validate arguments',
              description => <<'_',
  
  If set to true, will validate sub's result. Validation error will cause wrapper
  to return status 500 instead of sub's result. The default is to enable this
  unless previous wrapper(s) have already done this.
  
  _
          },
          core => {
              summary => 'If set to true, will avoid the use of non-core modules',
              schema => 'bool',
          },
          core_or_pp => {
              summary => 'If set to true, will avoid the use of non-core XS modules',
              schema => 'bool',
              description => <<'_',
  
  In other words, will stick to core or pure-perl modules only.
  
  _
          },
          pp => {
              summary => 'If set to true, will avoid the use of XS modules',
              schema => 'bool',
          },
      },
  };
  sub wrap_sub {
      __PACKAGE__->new->wrap(@_);
  }
  
  1;
  # ABSTRACT: A multi-purpose subroutine wrapping framework
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Perinci::Sub::Wrapper - A multi-purpose subroutine wrapping framework
  
  =head1 VERSION
  
  This document describes version 0.851 of Perinci::Sub::Wrapper (from Perl distribution Perinci-Sub-Wrapper), released on 2019-07-04.
  
  =head1 SYNOPSIS
  
  For dynamic usage:
  
   use Perinci::Sub::Wrapper qw(wrap_sub);
   my $res = wrap_sub(sub_name => "mysub", meta=>{...});
   my ($wrapped_sub, $meta) = ($res->[2]{sub}, $res->[2]{meta});
   $wrapped_sub->(); # call the wrapped function
  
  =head1 DESCRIPTION
  
  Perinci::Sub::Wrapper (PSW for short) is an extensible subroutine wrapping
  framework. It generates code to do stuffs before calling your subroutine, like
  validate arguments, convert arguments from positional/array to named/hash or
  vice versa, etc; as well as generate code to do stuffs after calling your
  subroutine, like retry calling for a number of times if subroutine returns a
  non-success status, check subroutine result against a schema, etc). Some other
  things it can do: apply a timeout, currying, and so on.
  
  PSW differs from other function composition or decoration system like Python
  decorators (or its Perl equivalent L<Python::Decorator>) in a couple of ways:
  
  =over
  
  =item * Single wrapper
  
  Instead of multiple/nested wrapping for implementing different features, PSW
  is designed to generate a single large wrapper around your code, i.e.:
  
   sub _wrapper_for_your_sub {
       ...
       # do various stuffs before calling:
  
       # e.g. start timer
       # e.g. convert, prefill, validate arguments
       my @args = ...;
       ...
       your_sub(@args);
       ...
       # do various stuffs after calling
       ...
       # e.g. report times
       # e.g. perform retry
       # e.g. convert or envelope results
  
       # return result
   }
  
  Multiple functionalities will be added and combined in this single wrapper
  subroutine in the appropriate location. This is done to reduce function call
  overhead or depth of nested call levels. And also to make it easier to embed the
  wrapping code to your source code (see L<Dist::Zilla::Plugin::Rinci::Wrap>).
  
  Of course, you can still wrap multiple times if wanted.
  
  =item * Rinci
  
  The wrapper code is built according to the L<Rinci> metadata you provide. Rinci
  allows you to specify various things for your function, e.g. list of arguments
  including the expected data type of each argument and whether an argument is
  required or optional. PSW can then be used to generate the necessary code to
  enforce this specification, e.g. generate validator for the function arguments.
  
  Since Rinci specification is extensible, you can describe additional stuffs for
  your function and write a PSW plugin to generate the necessary code to implement
  your specification. An example is C<timeout> to specify execution time limit,
  implemented by L<Perinci::Sub::Property::timeout> which generates code to call
  function inside an C<eval()> block and use C<alarm()> to limit the execution.
  Another example is C<retry> property, implemented by
  L<Perinci::Sub::Property::retry> which generates code to call function inside a
  simple retry loop.
  
  =back
  
  Normally you do not use PSW directly in your applications. You might want to
  check out L<Perinci::Access::Perl> and L<Perinci::Exporter> on examples of
  wrapping function dynamically (during runtime), or
  L<Dist::Zilla::Plugin::Rinci::Wrap> on an example of embedding the generated
  wrapping code to source code during build.
  
  =head1 EXTENDING
  
  The framework is simple and extensible. Please delve directly into the source
  code for now. Some notes:
  
  The internal uses OO.
  
  The main wrapper building mechanism is in the C<wrap()> method.
  
  For each Rinci property, it will call C<handle_NAME()> wrapper handler method.
  The C<handlemeta_NAME()> methods are called first, to determine order of
  processing. You can supply these methods either by subclassing the class or,
  more simply, monkeypatching the method in the C<Perinci::Sub::Wrapper> package.
  
  The wrapper handler method will be called with a hash argument, containing these
  keys: B<value> (property value), B<new> (this key will exist if C<convert>
  argument of C<wrap()> exists, to convert a property to a new value).
  
  For properties that have name in the form of C<NAME1.NAME2.NAME3> (i.e., dotted)
  only the first part of the name will be used (i.e., C<handle_NAME1()>).
  
  =head1 VARIABLES
  
  =head2 $Log_Wrapper_Code (BOOL)
  
  Whether to log wrapper result. Default is from environment variable
  LOG_PERINCI_WRAPPER_CODE, or false. Logging is done with L<Log::ger> at trace
  level.
  
  =head1 RINCI FUNCTION METADATA
  
  =head2 x.perinci.sub.wrapper.disable_validate_args => bool
  
  Can be set to 1 to set C<validate_args> to 0 by default. This is used e.g. if
  you already embed/insert code to validate arguments by other means and do not
  want to repeat validating arguments. E.g. used if you use
  L<Dist::Zilla::Plugin::Rinci::Validate>.
  
  =head2 x.perinci.sub.wrapper.disable_validate_result => bool
  
  Can be set to 1 to set C<validate_result> to 0 by default. This is used e.g. if
  you already embed/insert code to validate result by other means and do not want
  to repeat validating result. E.g. used if you use
  L<Dist::Zilla::Plugin::Rinci::Validate>.
  
  =head2 x.perinci.sub.wrapper.logs => array
  
  Generated/added by this module to the function metadata for every wrapping done.
  Used to avoid adding repeated code, e.g. to validate result or arguments.
  
  =head1 PERFORMANCE NOTES
  
  The following numbers are produced on an Intel Core i5-2400 3.1GHz desktop using
  PSW v0.51 and Perl v5.18.2. Operating system is Debian sid (64bit).
  
  For perspective, empty subroutine (C<< sub {} >>) as well as C<< sub { [200,
  "OK"] } >> can be called around 5.3 mil/sec.
  
  Wrapping this subroutine C<< sub { [200, "OK"] } >> and this simple metadata C<<
  {v=>1.1} >> using default options yields call performance for C<< $sub->() >> of
  about 0.9 mil/sec. With C<< validate_args=>0 >> and C<< validate_result=>0 >>,
  it's 1.5 mil/sec.
  
  As more (and more complex) arguments are introduced and validated, overhead will
  increase. The significant portion of the overhead is in argument validation. For
  example, this metadata C<< {v=>1.1, args=>{a=>{schema=>"int"}}} >> yields 0.5
  mil/sec.
  
  =head1 FUNCTIONS
  
  
  =head2 wrap_sub
  
  Usage:
  
   wrap_sub(%args) -> [status, msg, payload, meta]
  
  Wrap subroutine to do various things, like enforcing Rinci properties.
  
  This function is not exported by default, but exportable.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<compile> => I<bool> (default: 1)
  
  Whether to compile the generated wrapper.
  
  Can be set to 0 to not actually wrap but just return the generated wrapper
  source code.
  
  =item * B<convert> => I<hash>
  
  Properties to convert to new value.
  
  Not all properties can be converted, but these are a partial list of those that
  can: v (usually do not need to be specified when converting from 1.0 to 1.1,
  will be done automatically), args_as, result_naked, default_lang.
  
  =item * B<core> => I<bool>
  
  If set to true, will avoid the use of non-core modules.
  
  =item * B<core_or_pp> => I<bool>
  
  If set to true, will avoid the use of non-core XS modules.
  
  In other words, will stick to core or pure-perl modules only.
  
  =item * B<debug> => I<bool> (default: 0)
  
  Generate code with debugging.
  
  If turned on, will produce various debugging in the generated code. Currently
  what this does:
  
  =over
  
  =item * add more comments (e.g. for each property handler)
  
  =back
  
  =item * B<meta>* => I<hash>
  
  The function metadata.
  
  =item * B<meta_name> => I<str>
  
  Where to find the metadata, e.g. "$SPEC{foo}".
  
  Some wrapper code (e.g. handler for C<dep> property) needs to refer to the
  function metadata. If not provided, the wrapper will store the function metadata
  in a unique variable (e.g. C<$Perinci::Sub::Wrapped::meta34127816>).
  
  =item * B<pp> => I<bool>
  
  If set to true, will avoid the use of XS modules.
  
  =item * B<sub> => I<str>
  
  The code to be wrapped.
  
  At least one of C<sub> or C<sub_name> must be specified.
  
  =item * B<sub_name> => I<str>
  
  The name of the subroutine, e.g. func or Foo::func (qualified).
  
  At least one of C<sub> or C<sub_name> must be specified.
  
  =item * B<validate_args> => I<bool>
  
  Whether wrapper should validate arguments.
  
  If set to true, will validate arguments. Validation error will cause status 400
  to be returned. The default is to enable this unless previous wrapper(s) have
  already done this.
  
  =item * B<validate_result> => I<bool>
  
  Whether wrapper should validate arguments.
  
  If set to true, will validate sub's result. Validation error will cause wrapper
  to return status 500 instead of sub's result. The default is to enable this
  unless previous wrapper(s) have already done this.
  
  =back
  
  Returns an enveloped result (an array).
  
  First element (status) is an integer containing HTTP status code
  (200 means OK, 4xx caller error, 5xx function error). Second element
  (msg) is a string containing error message, or 'OK' if status is
  200. Third element (payload) is optional, the actual result. Fourth
  element (meta) is called result metadata and is optional, a hash
  that contains extra information.
  
  Return value: The wrapped subroutine along with its new metadata (hash)
  
  
  Aside from wrapping the subroutine, the wrapper will also create a new metadata
  for the subroutine. The new metadata is a clone of the original, with some
  properties changed, e.g. schema in C<args> and C<result> normalized, some values
  changed according to the C<convert> argument, some defaults set, etc.
  
  The new metadata will also contain (or append) the wrapping log located in the
  C<x.perinci.sub.wrapper.logs> attribute. The wrapping log marks that the wrapper
  has added some functionality (like validating arguments or result) so that
  future nested wrapper can choose to avoid duplicating the same functionality.
  
  =for Pod::Coverage ^(new|handle(meta)?_.+|wrap|add_.+|section_empty|indent|unindent|get_indent_level|select_section|push_lines)$
  
  =head1 METHODS
  
  The OO interface is only used internally or when you want to extend the wrapper.
  
  =head1 FAQ
  
  =head2 General
  
  =over
  
  =item * What is a function wrapper?
  
  A wrapper function calls the target function but with additional behaviors. The
  goal is similar to function composition or decorator system like in Python (or
  its Perl equivalent L<Python::Decorator>) where you use a higher-order function
  which accepts another function and modifies it.
  
  It is used to add various functionalities, e.g.: cache/memoization, singleton,
  adding benchmarking/timing around function call, logging, argument validation
  (parameter checking), checking pre/post-condition, authentication/authorization
  checking, etc. The Python folks use decorators quite a bit; see discussions on
  the Internet on those.
  
  =item * How is PSW different from Python::Decorator?
  
  PSW uses dynamic code generation (it generates Perl code on the fly). It also
  creates a single large wrapper instead of nested wrappers. It builds wrapper
  code according to L<Rinci> specification.
  
  =item * Why use code generation?
  
  Mainly because L<Data::Sah>, which is the module used to do argument validation,
  also uses code generation. Data::Sah allows us to do data validation at full
  Perl speed, which can be one or two orders of magnitude faster than
  "interpreter" modules like L<Data::FormValidator>.
  
  =item * Why use a single large wrapper?
  
  This is just a design approach. It can impose some restriction for wrapper code
  authors, since everything needs to be put in a single subroutine, but has nice
  properties like less stack trace depth and less function call overhead.
  
  =back
  
  =head2 Debugging
  
  =over
  
  =item * How to display the wrapper code being generated?
  
  If environment variable L<LOG_PERINCI_WRAPPER_CODE> or package variable
  $Log_Perinci_Wrapper_Code is set to true, generated wrapper source code is
  logged at trace level using L<Log::ger>. It can be displayed, for example:
  
   % LOG_PERINCI_WRAPPER_CODE=1 TRACE=1 \
     perl -MLog::ger::LevelFromEnv -MLog::ger::Output=Screen \
     -MPerinci::Sub::Wrapper=wrap_sub \
     -e 'wrap_sub(sub=>sub{}, meta=>{v=>1.1, args=>{a=>{schema=>"int"}}});'
  
  Note that L<Data::Sah> (the module used to generate validator code) observes
  C<LOG_SAH_VALIDATOR_CODE>, but during wrapping this environment flag is
  currently disabled by this module, so you need to set
  L<LOG_PERINCI_WRAPPER_CODE> instead.
  
  =back
  
  =head2 caller() doesn't work from inside my wrapped code!
  
  Wrapping adds at least one or two levels of calls: one for the wrapper
  subroutine itself, the other is for the eval trap when necessary.
  
  This poses a problem if you need to call caller() from within your wrapped code;
  it will also be off by at least one or two.
  
  The solution is for your function to use the caller() replacement, provided by
  L<Perinci::Sub::Util>. Or use embedded mode, where the wrapper code won't add
  extra subroutine calls.
  
  =head1 ENVIRONMENT
  
  =head2 LOG_PERINCI_WRAPPER_CODE (bool)
  
  If set to 1, will log the generated wrapper code. This value is used to set
  C<$Log_Wrapper_Code> if it is not already set.
  
  =head2 PERINCI_WRAPPER_CORE => bool
  
  Set default for wrap argument C<core>.
  
  =head2 PERINCI_WRAPPER_CORE_OR_PP => bool
  
  Set default for wrap argument C<core_or_pp>.
  
  =head2 PERINCI_WRAPPER_PP => bool
  
  Set default for wrap argument C<pp>.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Perinci-Sub-Wrapper>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Perinci-Sub-Wrapper>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Perinci-Sub-Wrapper>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Perinci>, L<Rinci>
  
  L<Python::Decorator>
  
  L<Dist::Zilla::Plugin::Rinci::Wrap>
  
  L<Dist::Zilla::Plugin::Rinci::Validate>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2019, 2017, 2016, 2015, 2014, 2013, 2012, 2011 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
PERINCI_SUB_WRAPPER

    $main::fatpacked{"Proc/ChildError.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PROC_CHILDERROR';
  package Proc::ChildError;
  
  our $DATE = '2016-01-06'; # DATE
  our $VERSION = '0.04'; # VERSION
  
  use strict;
  use warnings;
  
  require Exporter;
  our @ISA       = qw(Exporter);
  our @EXPORT_OK = qw(explain_child_error);
  
  sub explain_child_error {
      my $opts;
      if (ref($_[0]) eq 'HASH') {
          $opts = shift;
      } else {
          $opts = {};
      }
  
      my ($num, $str);
      if (defined $_[0]) {
          $num = $_[0];
          $str = $_[1];
      } else {
          $num = $?;
          $str = $!;
      }
  
      my $prefix = "";
      if (defined $opts->{prog}) {
          $prefix = "$opts->{prog} ";
      }
  
      if ($num == -1) {
          return "${prefix}failed to execute: ".($str ? "$str ":"")."($num)";
      } elsif ($num & 127) {
          return sprintf(
              "${prefix}died with signal %d, %s coredump",
              ($num & 127),
              (($num & 128) ? 'with' : 'without'));
      } else {
          return sprintf("${prefix}exited with code %d", $num >> 8);
      }
  }
  
  1;
  # ABSTRACT: Explain process child error
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Proc::ChildError - Explain process child error
  
  =head1 VERSION
  
  This document describes version 0.04 of Proc::ChildError (from Perl distribution Proc-ChildError), released on 2016-01-06.
  
  =head1 FUNCTIONS
  
  =head2 explain_child_error([\%opts, ]$child_error, $os_error) => STR
  
  Produce a string description of an error number. C<$child_error> defaults to
  C<$?> if not specified. C<$os_error> defaults to C<$!> if not specified.
  
  The algorithm is taken from perldoc -f system. Some sample output:
  
   failed to execute: No such file or directory (-1)
   died with signal 15, with coredump
   exited with value 3
  
  An options hashref can be specified as the first argument to add information.
  Currently known keys:
  
  =over
  
  =item * prog => str
  
  Program name/path, to include in error messages:
  
   /usr/bin/foo failed to execute: Permission denied (-1)
   foo died with signal 15, with coredump
   /usr/bin/foo exited with value 3
  
  =back
  
  =head1 SEE ALSO
  
  L<Process::Status> provides a lightweight OO interface for C<$?>. I recommend
  this module now over Proc::ChildError.
  
  L<IPC::System::Simple> provides a replacement for Perl's C<system()>, with the
  difference that it will print a diagnostic error message similar to what
  C<Proc::ChildError> provides. You only need to do C<use IPC::System::Simple
  qw(system)> and use C<system()> as usual. Recommended.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Proc-ChildError>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Proc-ChildError>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Proc-ChildError>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
PROC_CHILDERROR

    $main::fatpacked{"Progress/Any.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PROGRESS_ANY';
  package Progress::Any;
  
  our $DATE = '2018-03-26'; # DATE
  our $VERSION = '0.214'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  use Time::Duration qw();
  use Time::HiRes qw(time);
  
  sub import {
      my ($self, @args) = @_;
      my $caller = caller();
      for (@args) {
          if ($_ eq '$progress') {
              my $progress = $self->get_indicator(task => '');
              {
                  no strict 'refs';
                  my $v = "$caller\::progress";
                  *$v = \$progress;
              }
          } else {
              die "Unknown import argument: $_";
          }
      }
  }
  
  # store Progress::Any objects for each task
  our %indicators;  # key = task name
  
  # store output objects
  our %outputs;     # key = task name, value = [$outputobj, ...]
  
  # internal attributes:
  # - _elapsed (float*) = accumulated elapsed time so far
  # - _start_time (float) = when is the last time the indicator state is changed
  #     from 'stopped' to 'started'. when indicator is changed from 'started' to
  #     'stopped', this will be set to undef.
  # - _remaining = used to store user's estimation of remaining time. will be
  #     unset after each update().
  
  # return 1 if created, 0 if already created/initialized
  sub _init_indicator {
      my ($class, $task) = @_;
  
      #say "D: _init_indicator($task)";
  
      # prevent double initialization
      return $indicators{$task} if $indicators{$task};
  
      my $progress = bless({
          task        => $task,
          title       => $task,
          target      => undef,
          pos         => 0,
          state       => 'stopped',
  
          _remaining          => undef,
          _set_remaining_time => undef,
          _elapsed            => 0,
          _start_time         => 0,
      }, $class);
      $indicators{$task} = $progress;
  
      # if we create an indicator named a.b.c, we must also create a.b, a, and ''.
      if ($task =~ s/\.?\w+\z//) {
          $class->_init_indicator($task);
      }
  
      $progress;
  }
  
  sub get_indicator {
      my ($class, %args) = @_;
  
      my %oargs = %args;
  
      my $task   = delete($args{task});
      if (!defined($task)) {
          my @caller = caller(0);
          #say "D:caller=".join(",",map{$_//""} @caller);
          $task = $caller[0] eq '(eval)' ? 'main' : $caller[0];
          $task =~ s/::/./g;
          $task =~ s/[^.\w]+/_/g;
      }
      die "Invalid task syntax '$task', please only use dotted words"
          unless $task =~ /\A(?:\w+(\.\w+)*)?\z/;
  
      my %uargs;
  
      my $p = $class->_init_indicator($task);
      for my $an (qw/title target pos remaining state/) {
          if (exists $args{$an}) {
              $uargs{$an} = delete($args{$an});
          }
      }
      die "Unknown argument(s) to get_indicator(): ".join(", ", keys(%args))
          if keys(%args);
      $p->_update(%uargs) if keys %uargs;
  
      $p;
  }
  
  my %attrs = (
      title     => {is => 'rw'},
      target    => {is => 'rw'},
      pos       => {is => 'rw'},
      state     => {is => 'rw'},
  );
  
  # create attribute methods
  for my $an (keys %attrs) {
      next if $attrs{$an}{manual};
      my $code;
      if ($attrs{$an}{is} eq 'rw') {
          $code = sub {
              my $self = shift;
              if (@_) {
                  $self->_update($an => shift);
              }
              $self->{$an};
          };
      } else {
          $code = sub {
              my $self = shift;
              die "Can't set value, $an is an ro attribute" if @_;
              $self->{$an};
          };
      }
      no strict 'refs';
      *{$an} = $code;
  }
  
  sub elapsed {
      my $self = shift;
  
      if ($self->{state} eq 'started') {
          return $self->{_elapsed} + (time()-$self->{_start_time});
      } else {
          return $self->{_elapsed};
      }
  }
  
  sub total_pos {
      my $self = shift;
  
      my $t = $self->{task};
  
      my $res = $self->{pos};
      for (keys %indicators) {
          if ($t eq '') {
              next if $_ eq '';
          } else {
              next unless index($_, "$t.") == 0;
          }
          $res += $indicators{$_}{pos};
      }
      $res;
  }
  
  sub total_target {
      my $self = shift;
  
      my $t = $self->{task};
  
      my $res = $self->{target};
      return undef unless defined($res);
  
      for (keys %indicators) {
          if ($t eq '') {
              next if $_ eq '';
          } else {
              next unless index($_, "$t.") == 0;
          }
          return undef unless defined $indicators{$_}{target};
          $res += $indicators{$_}{target};
      }
      $res;
  }
  
  sub percent_complete {
      my $self = shift;
  
      my $total_pos    = $self->total_pos;
      my $total_target = $self->total_target;
  
      return undef unless defined($total_target);
      if ($total_target == 0) {
          if ($self->{state} eq 'finished') {
              return 100;
          } else {
              return 0;
          }
      } else {
          return $total_pos / $total_target * 100;
      }
  }
  
  sub remaining {
      my $self = shift;
  
      if (defined $self->{_remaining}) {
          if ($self->{state} eq 'started') {
              my $r = $self->{_remaining}-(time()-$self->{_set_remaining_time});
              return $r > 0 ? $r : 0;
          } else {
              return $self->{_remaining};
          }
      } else {
          if (defined $self->{target}) {
              if ($self->{pos} == 0) {
                  return 0;
              } else {
                  return ($self->{target} - $self->{pos})/$self->{pos} *
                      $self->elapsed;
              }
          } else {
              return undef;
          }
      }
  }
  
  sub total_remaining {
      my $self = shift;
  
      my $t = $self->{task};
  
      my $res = $self->remaining;
      return undef unless defined $res;
  
      for (keys %indicators) {
          if ($t eq '') {
              next if $_ eq '';
          } else {
              next unless index($_, "$t.") == 0;
          }
          my $res2 = $indicators{$_}->remaining;
          return undef unless defined $res2;
          $res += $res2;
      }
      $res;
  }
  
  # the routine to use to update rw attributes, does validation and checks to make
  # sure things are consistent.
  sub _update {
      my ($self, %args) = @_;
  
      # no need to check for unknown arg in %args, it's an internal method anyway
  
      my $now = time();
  
      my $task = $self->{task};
      #use Data::Dump; print "D: _update($task) "; dd \%args;
  
    SET_TITLE:
      {
          last unless exists $args{title};
          my $val = $args{title};
          die "Invalid value for title, must be defined"
              unless defined($val);
          $self->{title} = $val;
      }
  
    SET_TARGET:
      {
          last unless exists $args{target};
          my $val = $args{target};
          die "Invalid value for target, must be a positive number or undef"
              unless !defined($val) || $val >= 0;
          # ensure that pos does not exceed target
          if (defined($val) && $self->{pos} > $val) {
              $self->{pos} = $val;
          }
          $self->{target} = $val;
          undef $self->{_remaining};
      }
  
    SET_POS:
      {
          last unless exists $args{pos};
          my $val = $args{pos};
          die "Invalid value for pos, must be a positive number"
              unless defined($val) && $val >= 0;
          # ensure that pos does not exceed target
          if (defined($self->{target}) && $val > $self->{target}) {
              $val = $self->{target};
          }
          $self->{pos} = $val;
          undef $self->{_remaining};
      }
  
    SET_REMAINING:
      {
          last unless exists $args{remaining};
          my $val = $args{remaining};
          die "Invalid value for remaining, must be a positive number"
              unless defined($val) && $val >= 0;
          $self->{_remaining} = $val;
          $self->{_set_remaining_time} = $now;
      }
  
    SET_STATE:
      {
          last unless exists $args{state};
          my $old = $self->{state};
          my $val = $args{state} // 'started';
          die "Invalid value for state, must be stopped/started/finished"
              unless $val =~ /\A(?:stopped|started|finished)\z/;
          last if $old eq $val;
          if ($val eq 'started') {
              $self->{_start_time} = $now;
  
              # automatically start parents
              my @parents;
              {
                  my $t = $task;
                  while (1) {
                      last unless $t =~ s/\.\w+\z//;
                      push @parents, $t;
                  }
                  push @parents, '';
              }
              for my $t (@parents) {
                  my $p = $indicators{$t};
                  if ($p->{state} ne 'started') {
                      $p->{state}       = 'started';
                      $p->{_start_time} = $now;
                  }
              }
          } else {
              $self->{_elapsed} += $now - $self->{_start_time};
              if ($val eq 'finished') {
                  die "BUG: Can't finish task '$task', pos is still < target"
                      if defined($self->{target}) &&
                          $self->{pos} < $self->{target};
                  $self->{_remaining} = 0;
                  $self->{_set_remaining_time} = $now;
              }
          }
          $self->{state} = $val;
      }
  
    DONE:
      #use Data::Dump; print "after update: "; dd $self;
      return;
  }
  
  sub _should_update_output {
      my ($self, $output, $now, $priority) = @_;
  
      my $key = "$output";
      if (!defined($output->{_mtime})) {
          # output has never been updated, update
          return 1;
      } elsif ($self->{state} eq 'finished') {
          # finishing, update the output to show finished state
          return 1;
      } elsif ($output->{force_update}) {
          # force update
          delete $output->{force_update};
          return 1;
      } elsif ($priority eq 'high') {
          # high priority, send to output module
          return 1;
      } else {
          # normal-/low-priority update, update if not too frequent
          if (!defined($output->{freq})) {
              # negative number means seconds, positive means pos delta. only
              # update if that number of seconds, or that difference in pos has
              # been passed.
              $output->{freq} = -0.5;
          }
          if ($output->{freq} == 0) {
              return 1;
          } if ($output->{freq} < 0) {
              return 1 if $now >= $output->{_mtime} - $output->{freq};
          } else {
              return 1 if abs($self->{pos} - $output->{_pos}) >= $output->{freq};
          }
          return 0;
      }
  }
  
  sub update {
      my ($self, %args) = @_;
  
      my $pos   = delete($args{pos}) // $self->{pos} + 1;
      my $state = delete($args{state}) // 'started';
      $self->_update(pos => $pos, state => $state);
  
      my $message  = delete($args{message});
      my $priority = delete($args{priority}) // 'normal';
      die "Unknown argument(s) to update(): ".join(", ", keys(%args))
          if keys(%args);
  
      my $now = time();
  
      # find output(s) and call it
      {
          last unless $ENV{PROGRESS} // 1;
          my $task = $self->{task};
          while (1) {
              if ($outputs{$task}) {
                  for my $output (@{ $outputs{$task} }) {
                      next unless $self->_should_update_output($output, $now, $priority);
                      if (ref($message) eq 'CODE') {
                          $message = $message->();
                      }
                      $output->update(
                          indicator => $indicators{$task},
                          message   => $message,
                          priority  => $priority,
                          time      => $now,
                      );
                      $output->{_mtime} = $now;
                      $output->{_pos}   = $pos;
                  }
              }
              last unless $task =~ s/\.?\w+\z//;
          }
      }
  }
  
  sub start {
      my $self = shift;
      $self->_update(state => 'started');
  }
  
  sub stop {
      my $self = shift;
      $self->_update(state => 'stopped');
  }
  
  sub finish {
      my ($self, %args) = @_;
      $self->update(pos=>$self->{target}, state=>'finished', %args);
  }
  
  our $template_regex = qr{( # all=1
                               %
                               ( #width=2
                                   -?\d+ )?
                               ( #dot=3
                                   \.?)
                               ( #prec=4
                                   \d+)?
                               ( #conv=5
                                   [A-Za-z%])
                           )}x;
  
  sub fill_template {
      my ($self, $template0, %args) = @_;
  
      # TODO: some caching so "%e%e" produces two identical numbers
  
      my ($template, $opts);
      if (ref $template0 eq 'HASH') {
          $opts = $template0;
          $template = $opts->{template};
      } else {
          $template = $template0;
          $opts = {};
      }
  
      state $sub = sub {
          my %args = @_;
  
          my ($all, $width, $dot, $prec, $conv) = ($1, $2, $3, $4, $5);
  
          my $p = $args{indicator};
  
          my ($fmt, $sconv, $data);
          if ($conv eq 'n') {
              $data = $p->{task};
          } elsif ($conv eq 't') {
              $data = $p->{title};
          } elsif ($conv eq '%') {
              $data = '%';
          } elsif ($conv eq 'm') {
              $data = $args{message} // '';
          } elsif ($conv eq 'p') {
              my $val = $p->percent_complete;
              $width //= 3;
              if (defined $val) {
                  $data = $val;
                  $prec //= 0;
                  $sconv = "f";
              } else {
                  $data = '?';
              }
          } elsif ($conv eq 'P') {
              $data = $p->total_pos;
              $prec //= 0;
              $sconv = "f";
          } elsif ($conv eq 'T') {
              my $val = $p->total_target;
              if (defined $val) {
                  $data = $val;
                  $prec //= 0;
                  $sconv = "f";
              } else {
                  $data = '?';
              }
          } elsif ($conv eq 'e') {
              my $val = $p->elapsed;
              $val = 1 if $val < 1; # TMP, prevent duration() return "just now"
              $data = Time::Duration::concise(Time::Duration::duration($val));
              $width //= -8;
          } elsif ($conv eq 'r') {
              my $val = $p->total_remaining;
              if (defined $val) {
                  $val = 1 if $val < 1; # TMP, prevent duration() return "just now
                  $data = Time::Duration::concise(Time::Duration::duration($val));
              } else {
                  $data = '?';
              }
              $width //= -8;
          } elsif ($conv eq 'R') {
              my $val = $p->total_remaining;
              if (defined $val) {
                  $val = 1 if $val < 1; # TMP, prevent duration() return "just now
                  $data = Time::Duration::concise(Time::Duration::duration($val)).
                      " left"; # XXX i18n
              } else {
                  $val = $p->elapsed;
                  $val = 1 if $val < 1; # TMP, prevent duration() return "just now
                  $data = Time::Duration::concise(Time::Duration::duration($val)).
                      " elapsed"; # XXX i18n
              }
              $width //= -(8 + 1 + 7);
          } else {
              if ($opts->{handle_unknown_conversion}) {
                  my @res = $opts->{handle_unknown_conversion}->(
                      indicator => $p,
                      args  => \%args,
  
                      all   => $all,
                      width => $width,
                      dot   => $dot,
                      conv  => $conv,
                      prec  => $prec,
                  );
                  if (@res) {
                      ($fmt, $data) = @res;
                  } else {
                  # return as-is
                      $fmt = '%s';
                      $data = $all;
                  }
              } else {
                  # return as-is
                  $fmt = '%s';
                  $data = $all;
              }
          }
  
          # sprintf format
          $sconv //= 's';
          $dot = "." if $sconv eq 'f';
          $fmt //= join("", grep {defined} ("%", $width, $dot, $prec, $sconv));
  
          #say "D:fmt=$fmt";
          sprintf $fmt, $data;
      };
      $template =~ s{$template_regex}{$sub->(%args, indicator=>$self)}egox;
  
      $template;
  }
  
  1;
  # ABSTRACT: Record progress to any output
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Progress::Any - Record progress to any output
  
  =head1 VERSION
  
  This document describes version 0.214 of Progress::Any (from Perl distribution Progress-Any), released on 2018-03-26.
  
  =head1 SYNOPSIS
  
  Example of using in a script with terminal progress bar as output (progress bar
  will be cleared on C<finish()>):
  
   use Progress::Any '$progress';
   use Progress::Any::Output 'TermProgressBarColor';
  
   $progress->target(10);
   for (1..10) {
       $progress->update(message => "Doing item $_");
       sleep 1;
   }
   $progress->finish();
  
  Sample output:
  
   % ./script.pl
    60% [Doing item 6====           ]3s left
  
  Another example, this time with terminal message as output (see :
  
   use Progress::Any '$progress';
   use Progress::Any::Output 'TermMessage', template => '[%n] %P/%T (%6.2p%%) %m';
  
   $progress->target(10);
   for (1..10) {
       $progress->update(message => "Item $_/10");
       sleep 1;
   }
   sleep 1;
   $progress->finish(message => "Finished!");
  
  Sample output:
  
   % ./script.pl
   [] 1/10 ( 10.00%) Item 1/10
   [] 2/10 ( 20.00%) Item 2/10
   ...
   [] 10/10 (100.00%) Item 10/10
   [] 10/10 (100.00%) Finished!
  
  Example of using in a module as well as script:
  
   # in lib/MyApp.pm
   package MyApp;
   use Progress::Any;
  
   sub download {
       my @urls = @_;
       return unless @urls;
       my $progress = Progress::Any->get_indicator(
           task => "download", pos=>0, target=>~~@urls);
       for my $url (@urls) {
           # download the $url ...
           $progress->update(message => "Downloaded $url");
       }
       $progress->finish;
   }
  
   # in script.pl
   use MyApp;
   use Progress::Any::Output;
   Progress::Any::Output->set('TermProgressBarColor');
  
   MyApp::download("url1", "url2", "url3", "url4", "url5");
  
  Sample output:
  
   % ./script.pl
    20% [====== Downloaded url1           ]0m00s Left
  
  Example that demonstrates multiple indicator objects:
  
   use Progress::Any;
   use Progress::Any::Output;
  
   my $pdl = Progress::Any->get_indicator(task => 'download');
   Progress::Any::Output->set({task=>'download'}, 'TermMessage', template => '[%-8t] [%P/%2T] %m');
   my $pcp = Progress::Any->get_indicator(task => 'copy');
   Progress::Any::Output->set({task=>'copy'    }, 'TermMessage', template => '[%-8t] [%P/%2T] %m');
  
   $pdl->target(10);
   $pdl->update(message => "downloading A");
   $pcp->update(message => "copying A");
   sleep 1;
   $pdl->update(message => "downloading B");
   $pcp->update(message => "copying B");
  
  will show something like:
  
   [download] [1/10] downloading A
   [copy    ] [1/ ?] copying A
   [download] [2/10] downloading B
   [copy    ] [2/ ?] copying B
  
  =head2 Example of using with Perinci::CmdLine
  
  If you use L<Perinci::CmdLine>, you can mark your function as expecting a
  Progress::Any object and it will be supplied to you in a special argument
  C<-progress>:
  
   use File::chdir;
   use Perinci::CmdLine;
   $SPEC{check_dir} = {
       v => 1.1,
       args => {
           dir => {summary=>"Path to check", schema=>"str*", req=>1, pos=>0},
       },
       features => {progress=>1},
   };
   sub check_dir {
       my %args = @_;
       my $progress = $args{-progress};
       my $dir = $args{dir};
       (-d $dir) or return [412, "No such dir: $dir"];
       local $CWD = $dir;
       opendir my($dh), $dir;
       my @ent = readdir($dh);
       $progress->pos(0);
       $progress->target(~~@ent);
       for (@ent) {
           # do the check ...
           $progress->update(message => $_);
           sleep 1;
       }
       $progress->finish;
       [200];
   }
   Perinci::CmdLine->new(url => '/main/check_dir')->run;
  
  =head1 DESCRIPTION
  
  C<Progress::Any> is an interface for applications that want to display progress
  to users. It decouples progress updating and output, rather similar to how
  L<Log::Any> decouples log producers and consumers (output). The API is also
  rather similar to Log::Any, except I<Adapter> is called I<Output> and
  I<category> is called I<task>.
  
  Progress::Any records position/target and calculates elapsed time, estimated
  remaining time, and percentage of completion. One or more output modules
  (Progress::Any::Output::*) display this information.
  
  In your modules, you typically only need to use Progress::Any, get one or more
  indicators, set target and update it during work. In your application, you use
  Progress::Any::Output and set/add one or more outputs to display the progress.
  By setting output only in the application and not in modules, you separate the
  formatting/display concern from the logic.
  
  Screenshots:
  
  =head1 STATUS
  
  API might still change, will be stabilized in 1.0.
  
  =begin HTML
  
  <p><img src="http://blogs.perl.org/users/perlancar/progany-tpc-sample.jpg" /><br />Using TermProgressBarColor output
  
  <p><img src="http://blogs.perl.org/users/perlancar/progany-dn-sample.jpg" /><br />Using DesktopNotify output
  
  =end HTML
  
  The list of features:
  
  =over
  
  =item * multiple progress indicators
  
  You can use different indicator for each task/subtask.
  
  =item * customizable output
  
  Output is handled by one of C<Progress::Any::Output::*> modules. Currently
  available outputs: C<Null> (no output), C<TermMessage> (display as simple
  message on terminal), C<TermProgressBarColor> (display as color progress bar on
  terminal), C<LogAny> (log using L<Log::Any>), C<Callback> (call a subroutine).
  Other possible output ideas: IM/Twitter/SMS, GUI, web/AJAX, remote/RPC (over
  L<Riap> for example, so that L<Perinci::CmdLine>-based command-line clients can
  display progress update from remote functions).
  
  =item * multiple outputs
  
  One or more outputs can be used to display one or more indicators.
  
  =item * hierarchical progress
  
  A task can be divided into subtasks. If a subtask is updated, its parent task
  (and its parent, and so on) are also updated proportionally.
  
  =item * message
  
  Aside from setting a number/percentage, allow including a message when updating
  indicator.
  
  =item * undefined target
  
  Target can be undefined, so a bar output might not show any bar (or show them,
  but without percentage indicator), but can still show messages.
  
  =item * retargetting
  
  Target can be changed in the middle of things.
  
  =back
  
  =head1 EXPORTS
  
  =head2 $progress => OBJ
  
  The root indicator. Equivalent to:
  
   Progress::Any->get_indicator(task => '')
  
  =head1 ATTRIBUTES
  
  Below are the attributes of an indicator/task:
  
  =head2 task
  
  String. Default: from caller's package, or C<main>.
  
  Task name. If not specified will be set to caller's package (C<::> will be
  replaced with C<.>), e.g. if you are calling this method from
  C<Foo::Bar::baz()>, then task will be set to C<Foo.Bar>. If caller is code
  inside eval, C<main> will be used instead.
  
  =head2 title
  
  String. Default: task name.
  
  Specify task title. Task title is a longer description for a task and can
  contain spaces and other characters. It is displayed in some outputs, as well as
  using C<%t> in C<fill_template()>. For example, for a task called C<copy>, its
  title might be C<Copying files to remote server>.
  
  =head2 target
  
  Non-negative number. Default: 0.
  
  The total number of items to finish. Can be set to undef to mean that we don't
  know (yet) how many items there are to finish (in which case, we cannot estimate
  percent of completion and remaining time).
  
  =head2 pos
  
  Non-negative number. Default: 0.
  
  The number of items that are already done. It cannot be larger than C<target>,
  if C<target> is defined. If C<target> is set to a value smaller than C<pos> or
  C<pos> is set to a value larger than C<target>, C<pos> will be changed to be
  C<target>.
  
  =head2 state
  
  String. Default: C<stopped>.
  
  State of task/indicator. Either: C<stopped>, C<started>, or C<finished>.
  Initially it will be set to C<stopped>, which means elapsed time won't be
  running and will stay at 0. C<update()> will set the state to C<started> to get
  elapsed time to run. At the end of task, you can call C<finish()> (or
  alternatively set C<state> to C<finished>) to stop the elapsed time again.
  
  The difference between C<stopped> and C<finished> is: when C<target> and C<pos>
  are both at 0, percent completed is assumed to be 0% when state is C<stopped>,
  but 100% when state is C<finished>.
  
  =head1 METHODS
  
  =head2 get_indicator
  
  Usage:
  
   Progress::Any->get_indicator(%args) => obj
  
  Get a progress indicator for a certain task. C<%args> contain attribute values,
  at least C<task> must be specified.
  
  Note that this module maintains a list of indicator singleton objects for each
  task (in C<%indicators> package variable), so subsequent C<get_indicator()> for
  the same task will return the same object.
  
  =head2 update
  
  Usage:
  
   $progress->update(%args)
  
  Update indicator. Will also, usually, update associated output(s) if necessary.
  
  Arguments:
  
  =over
  
  =item * pos => NUM
  
  Set the new position. If unspecified, defaults to current position + 1. If pos
  is larger than target, outputs will generally still show 100%. Note that
  fractions are allowed.
  
  =item * message => str|code
  
  Set a message to be displayed when updating indicator.
  
  Aside from a string, you can also pass a coderef here. It can be used to delay
  costly calculation. The message will only be calculated when actually sent to
  output.
  
  =item * priority => str ("normal"|"low"|"high", default: "normal")
  
  Set importance level of this update. Default is C<normal>. Output can choose to
  ignore updates lower than a certain level.
  
  =item * state => STR
  
  Can be set to C<finished> to finish a task.
  
  =back
  
  =head2 finish
  
  Usage:
  
   $progress->finish(%args)
  
  Equivalent to:
  
   $progress->update(
       ( pos => $progress->target ) x !!defined($progress->target),
       state => 'finished',
       %args,
   );
  
  =head2 start
  
  Usage:
  
   $progress->start()
  
  Set state to C<started>.
  
  =head2 stop
  
  Usage:
  
   $progress->stop()
  
  Set state to C<stopped>.
  
  =head2 elapsed
  
  Usage:
  
   $progress->elapsed() => float
  
  Get elapsed time. Just like a stop-watch, when state is C<started> elapsed time
  will run and when state is C<stopped>, it will freeze.
  
  =head2 remaining
  
  Usage:
  
   $progress->remaining() => undef|float
  
  Give estimated remaining time until task is finished, which will depend on how
  fast the C<update()> is called, i.e. how fast C<pos> is approaching C<target>.
  Will be undef if C<target> is undef.
  
  =head2 total_remaining
  
  Usage:
  
   $progress->total_remaining() => undef|FLOAT
  
  Give estimated remaining time added by all its subtasks' remaining. Return undef
  if any one of those time is undef.
  
  =head2 total_pos
  
  Usage:
  
   $progress->total_pos() => float
  
  Total of indicator's pos and all of its subtasks'.
  
  =head2 total_target
  
  Usage:
  
   $progress->total_target() => undef|float
  
  Total of indicator's target and all of its subtasks'. Return undef if any one of
  those is undef.
  
  =head2 percent_complete
  
  Usage:
  
   $progress->percent_complete() => undef|float
  
  Give percentage of completion, calculated using C<< total_pos / total_target *
  100 >>. Undef if total_target is undef.
  
  =head2 fill_template
  
  Usage:
  
   $progress->fill_template($template) => str
  
  Fill template with values, like in C<sprintf()>. Usually used by output modules.
  Available templates:
  
  =over
  
  =item * C<%(width)n>
  
  Task name (the value of the C<task> attribute). C<width> is optional, an
  integer, like in C<sprintf()>, can be negative to mean left-justify instead of
  right.
  
  =item * C<%(width)t>
  
  Task title (the value of the C<title> attribute).
  
  =item * C<%(width)e>
  
  Elapsed time (the result from the C<elapsed()> method). Currently using
  L<Time::Duration> concise format, e.g. 10s, 1m40s, 16m40s, 1d4h, and so on.
  Format might be configurable and localizable in the future. Default width is -8.
  Examples:
  
   2m30s
   10s
  
  =item * C<%(width)r>
  
  Estimated remaining time (the result of the C<total_remaining()> method).
  Currently using L<Time::Duration> concise format, e.g. 10s, 1m40s, 16m40s, 1d4h,
  and so on. Will show C<?> if unknown. Format might be configurable and
  localizable in the future. Default width is -8. Examples:
  
   1m40s
   5s
  
  =item * C<%(width)R>
  
  Estimated remaining time I<or> elapsed time, if estimated remaining time is not
  calculatable (e.g. when target is undefined). Format might be configurable and
  localizable in the future. Default width is -(8+1+7). Examples:
  
   30s left
   1m40s elapsed
  
  =item * C<%(width).(prec)p>
  
  Percentage of completion (the result of the C<percent_complete()> method).
  C<width> and C<precision> are optional, like C<%f> in Perl's C<sprintf()>,
  default is C<%3.0p>. If percentage is unknown (due to target being undef), will
  show C<?>.
  
  =item * C<%(width)P>
  
  Current position (the result of the C<total_pos()> method).
  
  =item * C<%(width)T>
  
  Target (the result of the C<total_target()> method). If undefined, will show
  C<?>.
  
  =item * C<%m>
  
  Message (the C<update()> parameter). If message is unspecified, will show empty
  string.
  
  =item * C<%%>
  
  A literal C<%> sign.
  
  =back
  
  =head1 FAQ
  
  =head1 ENVIRONMENT
  
  =head2 PROGRESS
  
  Boolean. Default 1. Can be set to 0 to display progress output.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Progress-Any>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Progress-Any>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Progress-Any>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  Other progress modules on CPAN: L<Term::ProgressBar>,
  L<Term::ProgressBar::Simple>, L<Time::Progress>, among others.
  
  Output modules: C<Progress::Any::Output::*>
  
  See examples on how Progress::Any is used by other modules: L<Perinci::CmdLine>
  (supplying progress object to functions), L<Git::Bunch> (using progress object).
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2018, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
PROGRESS_ANY

    $main::fatpacked{"Progress/Any/Output.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PROGRESS_ANY_OUTPUT';
  package Progress::Any::Output;
  
  our $DATE = '2018-03-26'; # DATE
  our $VERSION = '0.214'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  require Progress::Any;
  
  sub import {
      my $self = shift;
      __PACKAGE__->set(@_) if @_;
  }
  
  sub _set_or_add {
      my $class = shift;
      my $which = shift;
  
      my $opts;
      if (@_ && ref($_[0]) eq 'HASH') {
          $opts = shift;
      } else {
          $opts = {};
      }
  
      my $output = shift or die "Please specify output name";
      $output =~ /\A(?:\w+(::\w+)*)?\z/ or die "Invalid output syntax '$output'";
  
      my $task = $opts->{task} // "";
  
      my $outputo;
      unless (ref $outputo) {
          my $outputpm = $output; $outputpm =~ s!::!/!g; $outputpm .= ".pm";
          require "Progress/Any/Output/$outputpm";
          no strict 'refs';
          $outputo = "Progress::Any::Output::$output"->new(@_);
      }
  
      if ($which eq 'set') {
          $Progress::Any::outputs{$task} = [$outputo];
      } else {
          $Progress::Any::outputs{$task} //= [];
          push @{ $Progress::Any::outputs{$task} }, $outputo;
      }
  
      $outputo;
  }
  
  sub set {
      my $class = shift;
      $class->_set_or_add('set', @_);
  }
  
  sub add {
      my $class = shift;
      $class->_set_or_add('add', @_);
  }
  
  1;
  # ABSTRACT: Assign output to progress indicators
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Progress::Any::Output - Assign output to progress indicators
  
  =head1 VERSION
  
  This document describes version 0.214 of Progress::Any::Output (from Perl distribution Progress-Any), released on 2018-03-26.
  
  =head1 SYNOPSIS
  
  In your application:
  
   use Progress::Any::Output;
   Progress::Any::Output->set('TermProgressBarColor');
  
  or:
  
   use Progress::Any::Output 'TermProgressBarColor';
  
  To give parameters to output:
  
   use Progress::Any::Output;
   Progress::Any::Output->set('TermProgressBarColor', width=>50, ...);
  
  or:
  
   use Progress::Any::Output 'TermProgressBarColor', width=>50, ...;
  
  To assign output to a certain (sub)task:
  
   use Progress::Any::Output;
   Progress::Any::Output->set({task=>'main.download'}, 'TermMessage');
  
  To add additional output, use C<add()> instead of C<set()>.
  
  =head1 DESCRIPTION
  
  See L<Progress::Any> for overview.
  
  =head1 METHODS
  
  =head2 Progress::Any::Output->set([ \%opts ], $output[, @args]) => obj
  
  Set (or replace) output. Will load and instantiate
  C<Progress::Any::Output::$output>. To only set output for a certain (sub)task,
  set C<%opts> to C<< { task => $task } >>. C<@args> will be passed to output
  module's constructor.
  
  Return the instantiated object.
  
  If C<$output> is an object (a reference, really), it will be used as-is.
  
  =head2 Progress::Any::Output->add([ \%opts ], $output[, @args])
  
  Like set(), but will add output instead of replace existing one(s).
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Progress-Any>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Progress-Any>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Progress-Any>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Progress::Any>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2018, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
PROGRESS_ANY_OUTPUT

    $main::fatpacked{"Progress/Any/Output/Null.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PROGRESS_ANY_OUTPUT_NULL';
  package Progress::Any::Output::Null;
  
  use 5.010;
  use strict;
  use warnings;
  
  our $VERSION = '0.214'; # VERSION
  
  sub new {
      my ($class, %args) = @_;
      bless \%args, $class;
  }
  
  sub update {
      1;
  }
  
  1;
  # ABSTRACT: Null output
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Progress::Any::Output::Null - Null output
  
  =head1 VERSION
  
  This document describes version 0.214 of Progress::Any::Output::Null (from Perl distribution Progress-Any), released on 2018-03-26.
  
  =for Pod::Coverage ^(new|update)$
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Progress-Any>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Progress-Any>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Progress-Any>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2018, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
PROGRESS_ANY_OUTPUT_NULL

    $main::fatpacked{"Progress/Any/Output/TermProgressBarColor.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PROGRESS_ANY_OUTPUT_TERMPROGRESSBARCOLOR';
  package Progress::Any::Output::TermProgressBarColor;
  
  our $DATE = '2019-07-30'; # DATE
  our $VERSION = '0.246'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  use Color::ANSI::Util qw(ansifg ansibg);
  require Win32::Console::ANSI if $^O =~ /Win/;
  
  $|++;
  
  # patch handle
  my ($ph1, $ph2);
  
  sub _patch {
      my $out = shift;
  
      return if $ph1;
      require Monkey::Patch::Action;
      if (defined &{"Log::Any::Adapter::Screen::hook_before_log"}) {
          $ph1 = Monkey::Patch::Action::patch_package(
              'Log::Any::Adapter::Screen', 'hook_before_log', 'replace',
              sub {
                  # we install a hook to clean up progress indicator first before
                  # we print log message to the screen.
                  $out->cleanup(1);
                  $Progress::Any::output_data{"$out"}{force_update} = 1;
              }
          );
      } elsif (defined  &{"Log::ger::Output::Screen::hook_before_log"}) {
          $ph1 = Monkey::Patch::Action::patch_package(
              'Log::ger::Output::Screen', 'hook_before_log', 'replace',
              sub {
                  # we install a hook to clean up progress indicator first before
                  # we print log message to the screen.
                  $out->cleanup(1);
                  $Progress::Any::output_data{"$out"}{force_update} = 1;
              }
          );
      }
  
      if (defined &{"Log::Any::Adapter::Screen::hook_after_log"}) {
          $ph2 = Monkey::Patch::Action::patch_package(
              'Log::Any::Adapter::Screen', 'hook_after_log', 'replace',
              sub {
                  my ($self, $msg) = @_;
                  # make sure we print a newline after logging so progress bar
                  # starts at column 1
                  print { $self->{_fh} } "\n" unless $msg =~ /\R\z/;
  
                  # reset show_delay because we have displayed something
                  $out->keep_delay_showing if $out->{show_delay};
  
                  # redisplay progress bar if were cleaned up
                  print { $self->{_fh} } $out->{_bar} if $out->{_bar};
              }
          );
      } elsif (defined &{"Log::ger::Output::Screen::hook_after_log"}) {
          $ph2 = Monkey::Patch::Action::patch_package(
              'Log::ger::Output::Screen', 'hook_after_log', 'replace',
              sub {
                  my ($ctx, $msg) = @_;
                  # make sure we print a newline after logging so progress bar
                  # starts at column 1
                  print { $ctx->{_fh} } "\n" unless $msg =~ /\R\z/;
  
                  # reset show_delay because we have displayed something
                  $out->keep_delay_showing if $out->{show_delay};
  
                  # redisplay progress bar if were cleaned up
                  print { $ctx->{_fh} } $out->{_bar} if $out->{_bar};
              }
          );
      }
  }
  
  sub _unpatch {
      undef $ph1;
      undef $ph2;
  }
  
  sub _template_length {
      require Progress::Any; # for $template_regex
      no warnings 'once'; # $Progress::Any::template_regex
  
      my ($self, $template) = @_;
  
      my $template_length = length($template);
  
      while ($template =~ /$Progress::Any::template_regex/g) {
          my ($all, $width, $dot, $prec, $conv) =
              ($1, $2, $3, $4, $5);
  
          if (defined $template_length) {
  
              if ($conv eq '%') {
                  $width //= 1;
              } elsif ($conv eq 'b' || $conv eq 'B') {
                  $width //= $self->{_default_b_width};
              } elsif ($conv eq 'p') {
                  $width //= 3;
              } elsif ($conv eq 'e') {
                  $width //= -8;
              } elsif ($conv eq 'r') {
                  $width //= -8;
              } elsif ($conv eq 'R') {
                  $width //= -(8 + 1 + 7);
              }
  
              if (defined $width) {
                  $template_length += abs($width) - length($all);
              } else {
                  $template_length = undef;
              }
  
          }
      }
  
      $template_length;
  }
  
  sub new {
      my ($class, %args0) = @_;
  
      my %args;
  
      $args{width} = delete($args0{width});
      if (!defined($args{width})) {
          my ($cols, $rows);
          if ($ENV{COLUMNS}) {
              $cols = $ENV{COLUMNS};
          } elsif (eval { require Term::Size; 1 }) {
              ($cols, $rows) = Term::Size::chars(*STDOUT{IO});
          } else {
              $cols = 80;
          }
          # on windows if we print at rightmost column, cursor will move to the
          # next line, so we try to avoid that
          $args{width} = $^O =~ /Win/ ? $cols-1 : $cols;
      }
  
      $args{fh} = delete($args0{fh});
      $args{fh} //= \*STDERR;
  
      $args{show_delay} = delete($args0{show_delay});
  
      $args{freq} = delete($args0{freq});
  
      $args{wide} = delete($args0{wide});
  
      $args{template} = delete($args0{template}) //
          '<color ffff00>%p%%</color> <color 808000>[</color>%B<color 808000>]</color><color ffff00>%R</color>';
  
      keys(%args0) and die "Unknown output parameter(s): ".
          join(", ", keys(%args0));
  
      $args{_last_hide_time} = time();
  
      require Text::ANSI::Util;
      if ($args{wide}) {
          require Text::ANSI::WideUtil;
      }
  
      my $self = bless \%args, $class;
  
      # determine the default width for %b and %B
      {
          $self->{_default_b_width} = 0;
          (my $template = $args{template}) =~ s!<color \w+>|</color>!!g;
          my $len = $self->_template_length($template) // 16;
          $self->{_default_b_width} = $args{width} - $len;
      }
  
      # render color in template
      ($self->{_template} = $self->{template}) =~ s!<color (\w+)>|<(/)color>!$1 ? ansifg($1) : "\e[0m"!eg;
  
      $self;
  }
  
  sub _handle_unknown_conversion {
      my %args = @_;
  
      my $conv = $args{conv};
      return () unless $conv eq 'b' || $conv eq 'B';
  
      my $p = $args{indicator};
      my $self = $args{self};
  
      my $tottgt = $p->total_target;
      my $totpos = $p->total_pos;
  
      my $bar_bar = '';
      my $bwidth = abs($args{width} // $self->{_default_b_width});
  
      if ($tottgt) {
          my $bfilled = int($totpos / $tottgt * $bwidth);
          $bfilled = $bwidth if $bfilled > $bwidth;
          $bar_bar = ("=" x $bfilled) . (" " x ($bwidth-$bfilled));
      } else {
          # display 15% width of bar just moving right
          my $bfilled = int(0.15 * $bwidth);
          $bfilled = 1 if $bfilled < 1;
          $self->{_x}++;
          if ($self->{_x} > $bwidth-$bfilled) {
              $self->{_x} = 0;
          }
          $bar_bar = (" " x $self->{_x}) . ("=" x $bfilled) .
              (" " x ($bwidth-$self->{_x}-$bfilled));
      }
  
      my $msg = $args{args}{message};
      if ($conv eq 'B' && defined $msg) {
          if ($msg =~ m!</elspan!) {
              require String::Elide::Parts;
              $msg = String::Elide::Parts::elide($msg, $bwidth);
          }
          my $mwidth;
          if ($self->{wide}) {
              $msg = Text::ANSI::WideUtil::ta_mbtrunc($msg, $bwidth);
              $mwidth = Text::ANSI::WideUtil::ta_mbswidth($msg);
          } else {
              $msg = Text::ANSI::Util::ta_trunc($msg, $bwidth);
              $mwidth = Text::ANSI::Util::ta_length($msg);
          }
          $bar_bar = $msg . substr($bar_bar, $mwidth);
      }
  
      return ("%s", $bar_bar);
  }
  
  sub update {
      my ($self, %args) = @_;
  
      return unless $ENV{PROGRESS_TERM_BAR} // $ENV{PROGRESS} // (-t $self->{fh});
  
      my $now = time();
  
      # if there is show_delay, don't display until we've surpassed it
      if (defined $self->{show_delay}) {
          return if $now - $self->{show_delay} < $self->{_last_hide_time};
      }
  
      $self->_patch;
  
      $self->cleanup;
  
      my $p = $args{indicator};
      my $is_finished = $p->{state} eq 'finished';
      if ($is_finished) {
          if ($self->{_lastlen}) {
              $self->{_last_hide_time} = $now;
          }
          return;
      }
  
      my $bar = $p->fill_template(
          {
              template => $self->{_template},
              handle_unknown_conversion => sub {
                  _handle_unknown_conversion(
                      self => $self,
                      @_,
                  );
              },
          },
          %args,
      );
  
      my $len = Text::ANSI::Util::ta_length($bar);
      $self->{_bar}   = $bar . ("\b" x $len);
      print { $self->{fh} } $self->{_bar};
      $self->{_lastlen} = $len;
  }
  
  sub cleanup {
      my ($self, $dont_reset_lastlen) = @_;
  
      # sometimes (e.g. when a subtask's target is undefined) we don't get
      # state=finished at the end. but we need to cleanup anyway at the end of
      # app, so this method is provided and will be called by e.g.
      # Perinci::CmdLine
  
      my $ll = $self->{_lastlen};
      return unless $ll;
      print { $self->{fh} } " " x $ll, "\b" x $ll;
      undef $self->{_lastlen} unless $dont_reset_lastlen;
  }
  
  sub keep_delay_showing {
      my $self = shift;
  
      $self->{_last_hide_time} = time();
  }
  
  sub DESTROY {
      my $self = shift;
      $self->_unpatch;
  }
  
  1;
  # ABSTRACT: Output progress to terminal as color bar
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Progress::Any::Output::TermProgressBarColor - Output progress to terminal as color bar
  
  =head1 VERSION
  
  This document describes version 0.246 of Progress::Any::Output::TermProgressBarColor (from Perl distribution Progress-Any-Output-TermProgressBarColor), released on 2019-07-30.
  
  =head1 SYNOPSIS
  
   use Progress::Any::Output;
  
   # use default options
   Progress::Any::Output->set('TermProgressBarColor');
  
   # set options
   Progress::Any::Output->set('TermProgressBarColor',
                              width=>50, fh=>\*STDERR, show_delay=>5);
  
  =head1 DESCRIPTION
  
  B<THIS IS AN EARLY RELEASE, SOME THINGS ARE NOT YET IMPLEMENTED E.G. STYLES,
  COLOR THEMES>.
  
  Sample screenshots:
  
  =for Pod::Coverage ^(update|cleanup)$
  
  =for HTML <img src="http://blogs.perl.org/users/perlancar/progany-tpc-sample.jpg" />
  
  This output displays progress indicators as colored progress bar on terminal. It
  produces output similar to that produced by L<Term::ProgressBar>, except that it
  uses the L<Progress::Any> framework and has additional features:
  
  =over
  
  =item * colors and color themes
  
  =item * template and styles
  
  =item * displaying message text in addition to bar/percentage number
  
  =item * wide character support
  
  =back
  
  XXX option to cleanup when complete or not (like in Term::ProgressBar) and
  should default to 1.
  
  =head1 METHODS
  
  =head2 new(%args) => OBJ
  
  Instantiate. Usually called through C<<
  Progress::Any::Output->set("TermProgressBarColor", %args) >>.
  
  Known arguments:
  
  =over
  
  =item * freq => num
  
  Limit the frequency of output updating. 0 means no frequency limiting (update
  output after every C<update()>).
  
  A positive number means to update output when there has been that amount of
  difference in position since last C<update()>. For example, if C<freq> is 10 and
  the last C<update()> was at position 5, then the next output update will be when
  position is at least 15.
  
  A negative number means to update output when time has passed that amount of
  absolute value (in seconds). For example, if C<freq> is -3 and the last
  C<update()> was 1 second ago, then the next output update will not be until the
  next two seconds has passed.
  
  By default undef, in which case Progress::Any will use the default -0.5 (at most
  once every 0.5 seconds).
  
  =item * wide => bool
  
  If set to 1, enable wide character support (requires L<Text::ANSI::WideUtil>.
  
  =item * width => INT
  
  Width of progress bar. The default is to detect terminal width and use the whole
  width.
  
  =item * color_theme => STR
  
  Not yet implemented.
  
  Choose color theme. To see what color themes are available, use
  C<list_color_themes()>.
  
  =item * style => STR
  
  Not yet implemented.
  
  Choose style. To see what styles are available, use C<list_styles()>. Styles
  determine the characters used for drawing the bar, alignment, etc.
  
  =item * template => str
  
  See B<fill_template> in Progress::Any's documentation. Aside from conversions
  supported by Progress::Any, this output recognizes these additional conversions:
  C<%b> to display the progress bar (with width using the rest of the available
  width), C<%B> to display the progress bar as well as the message inside it. You
  can also enclose parts of text with "<color RGB>" ... "</color>" to give color.
  
  The default template is:
  
   <color ffff00>%p</color> <color 808000>[</color>%B<color 808000>]</color><color ffff00>%e</color>
  
  =item * fh => handle (default: \*STDERR)
  
  Instead of the default STDERR, you can direct the output to another filehandle
  e.g. STDOUT.
  
  =item * show_delay => int
  
  If set, will delay showing the progress bar until the specified number of
  seconds. This can be used to create, e.g. a CLI application that is relatively
  not chatty but will display progress after several seconds of seeming inactivity
  to indicate users that the process is still going on.
  
  =back
  
  =head2 keep_delay_showing()
  
  Can be called to reset the timer that counts down to show progress bar when
  C<show_delay> is defined. For example, if C<show_delay> is 5 seconds and two
  seconds have passed, it should've been 3 seconds before progress bar is shown in
  the next C<update()>. However, if you call this method, it will be 5 seconds
  again before showing.
  
  =head1 FAQ
  
  =head2 How to update progress bar output more often?
  
  Set C<freq> to e.g. -0.1 or -0.05. The default C<freq>, when unset, is -0.5
  which means to update output at most once every 0.5 second.
  
  =head1 ENVIRONMENT
  
  =head2 NO_COLOR
  
  Bool. Can be used to disable color. Consulted before L<NO_COLOR>. See
  L<Color::ANSI::Util>.
  
  =head2 COLOR
  
  Bool. Can be used to force or disable color. See L<Color::ANSI::Util>.
  
  =head2 COLOR_DEPTH
  
  Integer. Can be used to override color depth detection. See
  L<Color::ANSI::Util>.
  
  =head2 COLUMNS
  
  Integer. Can be used to override terminal width detection.
  
  =head2 PROGRESS_TERM_BAR
  
  Bool. Forces disabling or enabling progress output (just for this output).
  
  In the absence of PROGRESS_TERM_MESSAGE and PROGRESS, will default to 1 if
  filehandle is detected as interactive (using C<-t>).
  
  =head2 PROGRESS
  
  Bool. Forces disabling or enabling progress output (for all outputs).
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Progress-Any-Output-TermProgressBarColor>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Progress-Any-Output-TermProgressBarColor>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Progress-Any-Output-TermProgressBarColor>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Progress::Any>
  
  L<Term::ProgressBar>
  
  Ruby library: ruby-progressbar, L<https://github.com/jfelchner/ruby-progressbar>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2019, 2018, 2017, 2016, 2015, 2014, 2013 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
PROGRESS_ANY_OUTPUT_TERMPROGRESSBARCOLOR

    $main::fatpacked{"Regexp/Stringify.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'REGEXP_STRINGIFY';
  package Regexp::Stringify;
  
  our $DATE = '2016-10-29'; # DATE
  our $VERSION = '0.06'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  use re qw(regexp_pattern);
  
  use Exporter;
  our @ISA = qw(Exporter);
  our @EXPORT_OK = qw(stringify_regexp);
  
  our %SPEC;
  
  $SPEC{stringify_regexp} = {
      v => 1.1,
      summary => 'Stringify a Regexp object',
      description => <<'_',
  
  This routine is an alternative to Perl's default stringification of Regexp
  object (i.e.:`"$re"`) and has some features/options, e.g.: producing regexp
  string that is compatible with certain perl versions.
  
  If given a string (or other non-Regexp object), will return it as-is.
  
  _
      args => {
          regexp => {
              schema => 're*',
              req => 1,
              pos => 0,
          },
          plver => {
              summary => 'Target perl version',
              schema => 'str*',
              description => <<'_',
  
  Try to produce a regexp object compatible with a certain perl version (should at
  least be >= 5.10).
  
  For example, in perl 5.14 regex stringification changes, e.g. `qr/hlagh/i` would
  previously be stringified as `(?i-xsm:hlagh)`, but now it's stringified as
  `(?^i:hlagh)`. If you set `plver` to 5.10 or 5.12, then this routine will
  still produce the former. It will also ignore regexp modifiers that are
  introduced in newer perls.
  
  Note that not all regexp objects are translatable to older perls, e.g. if they
  contain constructs not known to older perls like `(?^...)` before perl 5.14.
  
  _
          },
          with_qr => {
              schema  => 'bool',
              description => <<'_',
  
  If you set this to 1, then `qr/a/i` will be stringified as `'qr/a/i'` instead as
  `'(?^i:a)'`. The resulting string can then be eval-ed to recreate the Regexp
  object.
  
  _
          },
      },
      result_naked => 1,
      result => {
          schema => 'str*',
      },
  };
  sub stringify_regexp {
      my %args = @_;
  
      my $re = $args{regexp};
      return $re unless ref($re) eq 'Regexp';
      my $plver = $args{plver} // $^V;
  
      my ($pat, $mod) = regexp_pattern($re);
  
      my $ge_5140 = version->parse($plver) >= version->parse('5.14.0');
      unless ($ge_5140) {
          $mod =~ s/[adlu]//g;
      }
  
      if ($args{with_qr}) {
          return "qr($pat)$mod";
      } else {
          if ($ge_5140) {
              return "(^$mod:$pat)";
          } else {
              return "(?:(?$mod-)$pat)";
          }
      }
  }
  
  1;
  # ABSTRACT: Stringify a Regexp object
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Regexp::Stringify - Stringify a Regexp object
  
  =head1 VERSION
  
  This document describes version 0.06 of Regexp::Stringify (from Perl distribution Regexp-Stringify), released on 2016-10-29.
  
  =head1 SYNOPSIS
  
  Assuming this runs on Perl 5.14 or newer.
  
   use Regexp::Stringify qw(stringify_regexp);
   $str = stringify_regexp(regexp=>qr/a/i);                       # '(^i:a)'
   $str = stringify_regexp(regexp=>qr/a/i, with_qr=>1);           # 'qr(a)i'
   $str = stringify_regexp(regexp=>qr/a/i, plver=>5.010);         # '(?:(?i-)a)'
   $str = stringify_regexp(regexp=>qr/a/ui, plver=>5.010);        # '(?:(?i-)a)'
  
  =head1 FUNCTIONS
  
  
  =head2 stringify_regexp(%args) -> str
  
  Stringify a Regexp object.
  
  This routine is an alternative to Perl's default stringification of Regexp
  object (i.e.:C<"$re">) and has some features/options, e.g.: producing regexp
  string that is compatible with certain perl versions.
  
  If given a string (or other non-Regexp object), will return it as-is.
  
  This function is not exported by default, but exportable.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<plver> => I<str>
  
  Target perl version.
  
  Try to produce a regexp object compatible with a certain perl version (should at
  least be >= 5.10).
  
  For example, in perl 5.14 regex stringification changes, e.g. C<qr/hlagh/i> would
  previously be stringified as C<(?i-xsm:hlagh)>, but now it's stringified as
  C<(?^i:hlagh)>. If you set C<plver> to 5.10 or 5.12, then this routine will
  still produce the former. It will also ignore regexp modifiers that are
  introduced in newer perls.
  
  Note that not all regexp objects are translatable to older perls, e.g. if they
  contain constructs not known to older perls like C<(?^...)> before perl 5.14.
  
  =item * B<regexp>* => I<re>
  
  =item * B<with_qr> => I<bool>
  
  If you set this to 1, then C<qr/a/i> will be stringified as C<'qr/a/i'> instead as
  C<'(?^i:a)'>. The resulting string can then be eval-ed to recreate the Regexp
  object.
  
  =back
  
  Return value:  (str)
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Regexp-Stringify>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Regexp-Stringify>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Regexp-Stringify>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
REGEXP_STRINGIFY

    $main::fatpacked{"Role/Tiny.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'ROLE_TINY';
  package Role::Tiny;
  
  sub _getglob { \*{$_[0]} }
  sub _getstash { \%{"$_[0]::"} }
  
  use strict;
  use warnings;
  
  our $VERSION = '2.000008';
  $VERSION =~ tr/_//d;
  
  our %INFO;
  our %APPLIED_TO;
  our %COMPOSED;
  our %COMPOSITE_INFO;
  our @ON_ROLE_CREATE;
  
  # Module state workaround totally stolen from Zefram's Module::Runtime.
  
  BEGIN {
    *_WORK_AROUND_BROKEN_MODULE_STATE = "$]" < 5.009 ? sub(){1} : sub(){0};
    *_WORK_AROUND_HINT_LEAKAGE
      = "$]" < 5.011 && !("$]" >= 5.009004 && "$]" < 5.010001)
        ? sub(){1} : sub(){0};
    *_MRO_MODULE = "$]" < 5.010 ? sub(){"MRO/Compat.pm"} : sub(){"mro.pm"};
  }
  
  sub croak {
    require Carp;
    no warnings 'redefine';
    *croak = \&Carp::croak;
    goto &Carp::croak;
  }
  
  sub Role::Tiny::__GUARD__::DESTROY {
    delete $INC{$_[0]->[0]} if @{$_[0]};
  }
  
  sub _load_module {
    my ($module) = @_;
    (my $file = "$module.pm") =~ s{::}{/}g;
    return 1
      if $INC{$file};
  
    # can't just ->can('can') because a sub-package Foo::Bar::Baz
    # creates a 'Baz::' key in Foo::Bar's symbol table
    return 1
      if grep !/::\z/, keys %{_getstash($module)};
    my $guard = _WORK_AROUND_BROKEN_MODULE_STATE
      && bless([ $file ], 'Role::Tiny::__GUARD__');
    local %^H if _WORK_AROUND_HINT_LEAKAGE;
    require $file;
    pop @$guard if _WORK_AROUND_BROKEN_MODULE_STATE;
    return 1;
  }
  
  sub import {
    my $target = caller;
    my $me = shift;
    strict->import;
    warnings->import;
    $me->_install_subs($target);
    return if $me->is_role($target); # already exported into this package
    $INFO{$target}{is_role} = 1;
    # get symbol table reference
    my $stash = _getstash($target);
    # grab all *non-constant* (stash slot is not a scalarref) subs present
    # in the symbol table and store their refaddrs (no need to forcibly
    # inflate constant subs into real subs) with a map to the coderefs in
    # case of copying or re-use
    my @not_methods = map +(ref $_ eq 'CODE' ? $_ : ref $_ ? () : *$_{CODE}||()), values %$stash;
    @{$INFO{$target}{not_methods}={}}{@not_methods} = @not_methods;
    # a role does itself
    $APPLIED_TO{$target} = { $target => undef };
    foreach my $hook (@ON_ROLE_CREATE) {
      $hook->($target);
    }
  }
  
  sub _install_subs {
    my ($me, $target) = @_;
    return if $me->is_role($target);
    # install before/after/around subs
    foreach my $type (qw(before after around)) {
      *{_getglob "${target}::${type}"} = sub {
        push @{$INFO{$target}{modifiers}||=[]}, [ $type => @_ ];
        return;
      };
    }
    *{_getglob "${target}::requires"} = sub {
      push @{$INFO{$target}{requires}||=[]}, @_;
      return;
    };
    *{_getglob "${target}::with"} = sub {
      $me->apply_roles_to_package($target, @_);
      return;
    };
  }
  
  sub role_application_steps {
    qw(_install_methods _check_requires _install_modifiers _copy_applied_list);
  }
  
  sub apply_single_role_to_package {
    my ($me, $to, $role) = @_;
  
    _load_module($role);
  
    croak "This is apply_role_to_package" if ref($to);
    croak "${role} is not a Role::Tiny" unless $me->is_role($role);
  
    foreach my $step ($me->role_application_steps) {
      $me->$step($to, $role);
    }
  }
  
  sub _copy_applied_list {
    my ($me, $to, $role) = @_;
    # copy our role list into the target's
    @{$APPLIED_TO{$to}||={}}{keys %{$APPLIED_TO{$role}}} = ();
  }
  
  sub apply_roles_to_object {
    my ($me, $object, @roles) = @_;
    croak "No roles supplied!" unless @roles;
    my $class = ref($object);
    # on perl < 5.8.9, magic isn't copied to all ref copies. bless the parameter
    # directly, so at least the variable passed to us will get any magic applied
    bless($_[1], $me->create_class_with_roles($class, @roles));
  }
  
  my $role_suffix = 'A000';
  sub _composite_name {
    my ($me, $superclass, @roles) = @_;
  
    my $new_name = join(
      '__WITH__', $superclass, my $compose_name = join '__AND__', @roles
    );
  
    if (length($new_name) > 252) {
      $new_name = $COMPOSED{abbrev}{$new_name} ||= do {
        my $abbrev = substr $new_name, 0, 250 - length $role_suffix;
        $abbrev =~ s/(?<!:):$//;
        $abbrev.'__'.$role_suffix++;
      };
    }
    return wantarray ? ($new_name, $compose_name) : $new_name;
  }
  
  sub create_class_with_roles {
    my ($me, $superclass, @roles) = @_;
  
    croak "No roles supplied!" unless @roles;
  
    _load_module($superclass);
    {
      my %seen;
      if (my @dupes = grep 1 == $seen{$_}++, @roles) {
        croak "Duplicated roles: ".join(', ', @dupes);
      }
    }
  
    my ($new_name, $compose_name) = $me->_composite_name($superclass, @roles);
  
    return $new_name if $COMPOSED{class}{$new_name};
  
    foreach my $role (@roles) {
      _load_module($role);
      croak "${role} is not a Role::Tiny" unless $me->is_role($role);
    }
  
    require(_MRO_MODULE);
  
    my $composite_info = $me->_composite_info_for(@roles);
    my %conflicts = %{$composite_info->{conflicts}};
    if (keys %conflicts) {
      my $fail =
        join "\n",
          map {
            "Method name conflict for '$_' between roles "
            ."'".join("' and '", sort values %{$conflicts{$_}})."'"
            .", cannot apply these simultaneously to an object."
          } keys %conflicts;
      croak $fail;
    }
  
    my @composable = map $me->_composable_package_for($_), reverse @roles;
  
    # some methods may not exist in the role, but get generated by
    # _composable_package_for (Moose accessors via Moo).  filter out anything
    # provided by the composable packages, excluding the subs we generated to
    # make modifiers work.
    my @requires = grep {
      my $method = $_;
      !grep $_->can($method) && !$COMPOSED{role}{$_}{modifiers_only}{$method},
        @composable
    } @{$composite_info->{requires}};
  
    $me->_check_requires(
      $superclass, $compose_name, \@requires
    );
  
    *{_getglob("${new_name}::ISA")} = [ @composable, $superclass ];
  
    @{$APPLIED_TO{$new_name}||={}}{
      map keys %{$APPLIED_TO{$_}}, @roles
    } = ();
  
    $COMPOSED{class}{$new_name} = 1;
    return $new_name;
  }
  
  # preserved for compat, and apply_roles_to_package calls it to allow an
  # updated Role::Tiny to use a non-updated Moo::Role
  
  sub apply_role_to_package { shift->apply_single_role_to_package(@_) }
  
  sub apply_roles_to_package {
    my ($me, $to, @roles) = @_;
  
    return $me->apply_role_to_package($to, $roles[0]) if @roles == 1;
  
    my %conflicts = %{$me->_composite_info_for(@roles)->{conflicts}};
    my @have = grep $to->can($_), keys %conflicts;
    delete @conflicts{@have};
  
    if (keys %conflicts) {
      my $fail =
        join "\n",
          map {
            "Due to a method name conflict between roles "
            ."'".join(' and ', sort values %{$conflicts{$_}})."'"
            .", the method '$_' must be implemented by '${to}'"
          } keys %conflicts;
      croak $fail;
    }
  
    # conflicting methods are supposed to be treated as required by the
    # composed role. we don't have an actual composed role, but because
    # we know the target class already provides them, we can instead
    # pretend that the roles don't do for the duration of application.
    my @role_methods = map $me->_concrete_methods_of($_), @roles;
    # separate loops, since local ..., delete ... for ...; creates a scope
    local @{$_}{@have} for @role_methods;
    delete @{$_}{@have} for @role_methods;
  
    # the if guard here is essential since otherwise we accidentally create
    # a $INFO for something that isn't a Role::Tiny (or Moo::Role) because
    # autovivification hates us and wants us to die()
    if ($INFO{$to}) {
      delete $INFO{$to}{methods}; # reset since we're about to add methods
    }
  
    # backcompat: allow subclasses to use apply_single_role_to_package
    # to apply changes.  set a local var so ours does nothing.
    our %BACKCOMPAT_HACK;
    if($me ne __PACKAGE__
        and exists $BACKCOMPAT_HACK{$me} ? $BACKCOMPAT_HACK{$me} :
        $BACKCOMPAT_HACK{$me} =
          $me->can('role_application_steps')
            == \&role_application_steps
          && $me->can('apply_single_role_to_package')
            != \&apply_single_role_to_package
    ) {
      foreach my $role (@roles) {
        $me->apply_single_role_to_package($to, $role);
      }
    }
    else {
      foreach my $step ($me->role_application_steps) {
        foreach my $role (@roles) {
          $me->$step($to, $role);
        }
      }
    }
    $APPLIED_TO{$to}{join('|',@roles)} = 1;
  }
  
  sub _composite_info_for {
    my ($me, @roles) = @_;
    $COMPOSITE_INFO{join('|', sort @roles)} ||= do {
      foreach my $role (@roles) {
        _load_module($role);
      }
      my %methods;
      foreach my $role (@roles) {
        my $this_methods = $me->_concrete_methods_of($role);
        $methods{$_}{$this_methods->{$_}} = $role for keys %$this_methods;
      }
      my %requires;
      @requires{map @{$INFO{$_}{requires}||[]}, @roles} = ();
      delete $requires{$_} for keys %methods;
      delete $methods{$_} for grep keys(%{$methods{$_}}) == 1, keys %methods;
      +{ conflicts => \%methods, requires => [keys %requires] }
    };
  }
  
  sub _composable_package_for {
    my ($me, $role) = @_;
    my $composed_name = 'Role::Tiny::_COMPOSABLE::'.$role;
    return $composed_name if $COMPOSED{role}{$composed_name};
    $me->_install_methods($composed_name, $role);
    my $base_name = $composed_name.'::_BASE';
    # force stash to exist so ->can doesn't complain
    _getstash($base_name);
    # Not using _getglob, since setting @ISA via the typeglob breaks
    # inheritance on 5.10.0 if the stash has previously been accessed an
    # then a method called on the class (in that order!), which
    # ->_install_methods (with the help of ->_install_does) ends up doing.
    { no strict 'refs'; @{"${composed_name}::ISA"} = ( $base_name ); }
    my $modifiers = $INFO{$role}{modifiers}||[];
    my @mod_base;
    my @modifiers = grep !$composed_name->can($_),
      do { my %h; @h{map @{$_}[1..$#$_-1], @$modifiers} = (); keys %h };
    foreach my $modified (@modifiers) {
      push @mod_base, "sub ${modified} { shift->next::method(\@_) }";
    }
    my $e;
    {
      local $@;
      eval(my $code = join "\n", "package ${base_name};", @mod_base);
      $e = "Evaling failed: $@\nTrying to eval:\n${code}" if $@;
    }
    die $e if $e;
    $me->_install_modifiers($composed_name, $role);
    $COMPOSED{role}{$composed_name} = {
      modifiers_only => { map { $_ => 1 } @modifiers },
    };
    return $composed_name;
  }
  
  sub _check_requires {
    my ($me, $to, $name, $requires) = @_;
    return unless my @requires = @{$requires||$INFO{$name}{requires}||[]};
    if (my @requires_fail = grep !$to->can($_), @requires) {
      # role -> role, add to requires, role -> class, error out
      if (my $to_info = $INFO{$to}) {
        push @{$to_info->{requires}||=[]}, @requires_fail;
      } else {
        croak "Can't apply ${name} to ${to} - missing ".join(', ', @requires_fail);
      }
    }
  }
  
  sub _concrete_methods_of {
    my ($me, $role) = @_;
    my $info = $INFO{$role};
    # grab role symbol table
    my $stash = _getstash($role);
    # reverse so our keys become the values (captured coderefs) in case
    # they got copied or re-used since
    my $not_methods = { reverse %{$info->{not_methods}||{}} };
    $info->{methods} ||= +{
      # grab all code entries that aren't in the not_methods list
      map {;
        no strict 'refs';
        my $code = exists &{"${role}::$_"} ? \&{"${role}::$_"} : undef;
        ( ! $code or exists $not_methods->{$code} ) ? () : ($_ => $code)
      } grep +(!ref($stash->{$_}) || ref($stash->{$_}) eq 'CODE'), keys %$stash
    };
  }
  
  sub methods_provided_by {
    my ($me, $role) = @_;
    croak "${role} is not a Role::Tiny" unless $me->is_role($role);
    (keys %{$me->_concrete_methods_of($role)}, @{$INFO{$role}->{requires}||[]});
  }
  
  sub _install_methods {
    my ($me, $to, $role) = @_;
  
    my $info = $INFO{$role};
  
    my $methods = $me->_concrete_methods_of($role);
  
    # grab target symbol table
    my $stash = _getstash($to);
  
    # determine already extant methods of target
    my %has_methods;
    @has_methods{grep
      +(ref($stash->{$_}) || *{$stash->{$_}}{CODE}),
      keys %$stash
    } = ();
  
    foreach my $i (grep !exists $has_methods{$_}, keys %$methods) {
      no warnings 'once';
      my $glob = _getglob "${to}::${i}";
      *$glob = $methods->{$i};
  
      # overloads using method names have the method stored in the scalar slot
      # and &overload::nil in the code slot.
      next
        unless $i =~ /^\(/
          && ((defined &overload::nil && $methods->{$i} == \&overload::nil)
              || (defined &overload::_nil && $methods->{$i} == \&overload::_nil));
  
      my $overload = ${ *{_getglob "${role}::${i}"}{SCALAR} };
      next
        unless defined $overload;
  
      *$glob = \$overload;
    }
  
    $me->_install_does($to);
  }
  
  sub _install_modifiers {
    my ($me, $to, $name) = @_;
    return unless my $modifiers = $INFO{$name}{modifiers};
    my $info = $INFO{$to};
    my $existing = ($info ? $info->{modifiers} : $COMPOSED{modifiers}{$to}) ||= [];
    my @modifiers = grep {
      my $modifier = $_;
      !grep $_ == $modifier, @$existing;
    } @{$modifiers||[]};
    push @$existing, @modifiers;
  
    if (!$info) {
      foreach my $modifier (@modifiers) {
        $me->_install_single_modifier($to, @$modifier);
      }
    }
  }
  
  my $vcheck_error;
  
  sub _install_single_modifier {
    my ($me, @args) = @_;
    defined($vcheck_error) or $vcheck_error = do {
      local $@;
      eval {
        require Class::Method::Modifiers;
        Class::Method::Modifiers->VERSION(1.05);
        1;
      } ? 0 : $@;
    };
    $vcheck_error and die $vcheck_error;
    Class::Method::Modifiers::install_modifier(@args);
  }
  
  my $FALLBACK = sub { 0 };
  sub _install_does {
    my ($me, $to) = @_;
  
    # only add does() method to classes
    return if $me->is_role($to);
  
    my $does = $me->can('does_role');
    # add does() only if they don't have one
    *{_getglob "${to}::does"} = $does unless $to->can('does');
  
    return
      if $to->can('DOES') and $to->can('DOES') != (UNIVERSAL->can('DOES') || 0);
  
    my $existing = $to->can('DOES') || $to->can('isa') || $FALLBACK;
    my $new_sub = sub {
      my ($proto, $role) = @_;
      $proto->$does($role) or $proto->$existing($role);
    };
    no warnings 'redefine';
    return *{_getglob "${to}::DOES"} = $new_sub;
  }
  
  sub does_role {
    my ($proto, $role) = @_;
    require(_MRO_MODULE);
    foreach my $class (@{mro::get_linear_isa(ref($proto)||$proto)}) {
      return 1 if exists $APPLIED_TO{$class}{$role};
    }
    return 0;
  }
  
  sub is_role {
    my ($me, $role) = @_;
    return !!($INFO{$role} && ($INFO{$role}{is_role} || $INFO{$role}{not_methods}));
  }
  
  1;
  __END__
  
  =encoding utf-8
  
  =head1 NAME
  
  Role::Tiny - Roles: a nouvelle cuisine portion size slice of Moose
  
  =head1 SYNOPSIS
  
   package Some::Role;
  
   use Role::Tiny;
  
   sub foo { ... }
  
   sub bar { ... }
  
   around baz => sub { ... };
  
   1;
  
  elsewhere
  
   package Some::Class;
  
   use Role::Tiny::With;
  
   # bar gets imported, but not foo
   with 'Some::Role';
  
   sub foo { ... }
  
   # baz is wrapped in the around modifier by Class::Method::Modifiers
   sub baz { ... }
  
   1;
  
  If you wanted attributes as well, look at L<Moo::Role>.
  
  =head1 DESCRIPTION
  
  C<Role::Tiny> is a minimalist role composition tool.
  
  =head1 ROLE COMPOSITION
  
  Role composition can be thought of as much more clever and meaningful multiple
  inheritance.  The basics of this implementation of roles is:
  
  =over 2
  
  =item *
  
  If a method is already defined on a class, that method will not be composed in
  from the role. A method inherited by a class gets overridden by the role's
  method of the same name, though.
  
  =item *
  
  If a method that the role L</requires> to be implemented is not implemented,
  role application will fail loudly.
  
  =back
  
  Unlike L<Class::C3>, where the B<last> class inherited from "wins," role
  composition is the other way around, where the class wins. If multiple roles
  are applied in a single call (single with statement), then if any of their
  provided methods clash, an exception is raised unless the class provides
  a method since this conflict indicates a potential problem.
  
  =head1 IMPORTED SUBROUTINES
  
  =head2 requires
  
   requires qw(foo bar);
  
  Declares a list of methods that must be defined to compose role.
  
  =head2 with
  
   with 'Some::Role1';
  
   with 'Some::Role1', 'Some::Role2';
  
  Composes another role into the current role (or class via L<Role::Tiny::With>).
  
  If you have conflicts and want to resolve them in favour of Some::Role1 you
  can instead write:
  
   with 'Some::Role1';
   with 'Some::Role2';
  
  If you have conflicts and want to resolve different conflicts in favour of
  different roles, please refactor your codebase.
  
  =head2 before
  
   before foo => sub { ... };
  
  See L<< Class::Method::Modifiers/before method(s) => sub { ... } >> for full
  documentation.
  
  Note that since you are not required to use method modifiers,
  L<Class::Method::Modifiers> is lazily loaded and we do not declare it as
  a dependency. If your L<Role::Tiny> role uses modifiers you must depend on
  both L<Class::Method::Modifiers> and L<Role::Tiny>.
  
  =head2 around
  
   around foo => sub { ... };
  
  See L<< Class::Method::Modifiers/around method(s) => sub { ... } >> for full
  documentation.
  
  Note that since you are not required to use method modifiers,
  L<Class::Method::Modifiers> is lazily loaded and we do not declare it as
  a dependency. If your L<Role::Tiny> role uses modifiers you must depend on
  both L<Class::Method::Modifiers> and L<Role::Tiny>.
  
  =head2 after
  
   after foo => sub { ... };
  
  See L<< Class::Method::Modifiers/after method(s) => sub { ... } >> for full
  documentation.
  
  Note that since you are not required to use method modifiers,
  L<Class::Method::Modifiers> is lazily loaded and we do not declare it as
  a dependency. If your L<Role::Tiny> role uses modifiers you must depend on
  both L<Class::Method::Modifiers> and L<Role::Tiny>.
  
  =head2 Strict and Warnings
  
  In addition to importing subroutines, using C<Role::Tiny> applies L<strict> and
  L<warnings> to the caller.
  
  =head1 SUBROUTINES
  
  =head2 does_role
  
   if (Role::Tiny::does_role($foo, 'Some::Role')) {
     ...
   }
  
  Returns true if class has been composed with role.
  
  This subroutine is also installed as ->does on any class a Role::Tiny is
  composed into unless that class already has an ->does method, so
  
    if ($foo->does('Some::Role')) {
      ...
    }
  
  will work for classes but to test a role, one must use ::does_role directly.
  
  Additionally, Role::Tiny will override the standard Perl C<DOES> method
  for your class. However, if C<any> class in your class' inheritance
  hierarchy provides C<DOES>, then Role::Tiny will not override it.
  
  =head1 METHODS
  
  =head2 apply_roles_to_package
  
   Role::Tiny->apply_roles_to_package(
     'Some::Package', 'Some::Role', 'Some::Other::Role'
   );
  
  Composes role with package.  See also L<Role::Tiny::With>.
  
  =head2 apply_roles_to_object
  
   Role::Tiny->apply_roles_to_object($foo, qw(Some::Role1 Some::Role2));
  
  Composes roles in order into object directly. Object is reblessed into the
  resulting class. Note that the object's methods get overridden by the role's
  ones with the same names.
  
  =head2 create_class_with_roles
  
   Role::Tiny->create_class_with_roles('Some::Base', qw(Some::Role1 Some::Role2));
  
  Creates a new class based on base, with the roles composed into it in order.
  New class is returned.
  
  =head2 is_role
  
   Role::Tiny->is_role('Some::Role1')
  
  Returns true if the given package is a role.
  
  =head1 CAVEATS
  
  =over 4
  
  =item * On perl 5.8.8 and earlier, applying a role to an object won't apply any
  overloads from the role to other copies of the object.
  
  =item * On perl 5.16 and earlier, applying a role to a class won't apply any
  overloads from the role to any existing instances of the class.
  
  =back
  
  =head1 SEE ALSO
  
  L<Role::Tiny> is the attribute-less subset of L<Moo::Role>; L<Moo::Role> is
  a meta-protocol-less subset of the king of role systems, L<Moose::Role>.
  
  Ovid's L<Role::Basic> provides roles with a similar scope, but without method
  modifiers, and having some extra usage restrictions.
  
  =head1 AUTHOR
  
  mst - Matt S. Trout (cpan:MSTROUT) <mst@shadowcat.co.uk>
  
  =head1 CONTRIBUTORS
  
  dg - David Leadbeater (cpan:DGL) <dgl@dgl.cx>
  
  frew - Arthur Axel "fREW" Schmidt (cpan:FREW) <frioux@gmail.com>
  
  hobbs - Andrew Rodland (cpan:ARODLAND) <arodland@cpan.org>
  
  jnap - John Napiorkowski (cpan:JJNAPIORK) <jjn1056@yahoo.com>
  
  ribasushi - Peter Rabbitson (cpan:RIBASUSHI) <ribasushi@cpan.org>
  
  chip - Chip Salzenberg (cpan:CHIPS) <chip@pobox.com>
  
  ajgb - Alex J. G. Burzyński (cpan:AJGB) <ajgb@cpan.org>
  
  doy - Jesse Luehrs (cpan:DOY) <doy at tozt dot net>
  
  perigrin - Chris Prather (cpan:PERIGRIN) <chris@prather.org>
  
  Mithaldu - Christian Walde (cpan:MITHALDU) <walde.christian@googlemail.com>
  
  ilmari - Dagfinn Ilmari Mannsåker (cpan:ILMARI) <ilmari@ilmari.org>
  
  tobyink - Toby Inkster (cpan:TOBYINK) <tobyink@cpan.org>
  
  haarg - Graham Knop (cpan:HAARG) <haarg@haarg.org>
  
  =head1 COPYRIGHT
  
  Copyright (c) 2010-2012 the Role::Tiny L</AUTHOR> and L</CONTRIBUTORS>
  as listed above.
  
  =head1 LICENSE
  
  This library is free software and may be distributed under the same terms
  as perl itself.
  
  =cut
ROLE_TINY

    $main::fatpacked{"Role/Tiny/With.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'ROLE_TINY_WITH';
  package Role::Tiny::With;
  
  use strict;
  use warnings;
  
  our $VERSION = '2.000008';
  $VERSION =~ tr/_//d;
  
  use Role::Tiny ();
  
  use Exporter 'import';
  our @EXPORT = qw( with );
  
  sub with {
      my $target = caller;
      Role::Tiny->apply_roles_to_package($target, @_)
  }
  
  1;
  
  =head1 NAME
  
  Role::Tiny::With - Neat interface for consumers of Role::Tiny roles
  
  =head1 SYNOPSIS
  
   package Some::Class;
  
   use Role::Tiny::With;
  
   with 'Some::Role';
  
   # The role is now mixed in
  
  =head1 DESCRIPTION
  
  C<Role::Tiny> is a minimalist role composition tool.  C<Role::Tiny::With>
  provides a C<with> function to compose such roles.
  
  =head1 AUTHORS
  
  See L<Role::Tiny> for authors.
  
  =head1 COPYRIGHT AND LICENSE
  
  See L<Role::Tiny> for the copyright and license.
  
  =cut
  
  
ROLE_TINY_WITH

    $main::fatpacked{"Role/Versioning/Scheme.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'ROLE_VERSIONING_SCHEME';
  package Role::Versioning::Scheme;
  
  our $DATE = '2019-04-14'; # DATE
  our $VERSION = '0.010'; # VERSION
  
  use Role::Tiny;
  
  requires qw(
                 is_valid_version
                 normalize_version
                 cmp_version
                 bump_version
                 parse_version
         );
  
  1;
  # ABSTRACT: Role for Versioning::Scheme::* modules
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Role::Versioning::Scheme - Role for Versioning::Scheme::* modules
  
  =head1 VERSION
  
  This document describes version 0.010 of Role::Versioning::Scheme (from Perl distribution Versioning-Scheme), released on 2019-04-14.
  
  =head1 REQUIRED METHODS
  
  =head2 is_valid_version
  
  Usage:
  
   my $valid = $vs->is_valid_version('1.2.3'); # bool
  
  Must return true when a string is a valid version number for the associated
  scheme, or false otherwise.
  
  =head2 parse_version
  
  Usage:
  
   my $hash = $vs->parse_version('1.2.3'); # => {major=>1, minor=>2, patch=>3}
  
  Parse version number into elements. Should return hashref, or undef if version
  number is invalid.
  
  =head2 normalize_version
  
  Usage:
  
   my $normalized = $vs->normalize_version('1.2.3'); # bool
  
  Return the canonical string form of a version number according to the associated
  scheme.
  
  Must die when input is not a valid version number string.
  
  =head2 cmp_version
  
  Usage:
  
   my $res = $vs->cmp_version($v1, $v2); # -1|0|1
  
  Compare two version number strings and, like Perl's C<cmp>, must return -1, 0,
  or 1 depending on C<$v1> is less than, equal to, or greater than C<$v2>,
  respectively, according to the associated scheme.
  
  Must die when either C<$v1> or C<$v2> is invalid.
  
  =head2 bump_version
  
  Usage:
  
   my $v2 = $vs->bump_version($v[ , \%opts ]); # => str
  
  Bump a version number string and return a bumped version number string.
  
  Must die when C<$v> is invalid.
  
  By default it must bump the bumpable least significant part by one. Example in
  dotted scheme:
  
   my $v2 = $vs->bump_version('1.2.3'); # => '1.2.4'
  
  In monotonic scheme:
  
   my $v2 = $vs->bump_version('1.2+foo'); # => '1.3+foo'
  
  Some options this method can accept:
  
  =over
  
  =item * num => int (default: 1)
  
  Number of version numbers to bump, for example:
  
   my $v2 = $vs->bump_version('1.2.3', {num=>2}); # => '1.2.5'
  
  It can be negative:
  
   my $v2 = $vs->bump_version('1.2.3', {num=>-1}); # => '1.2.2'
   my $v2 = $vs->bump_version('1.2.3', {num=>-3}); # => '1.2.0'
  
  It must die when an ambiguous number is specified:
  
   my $v2 = $vs->bump_version('1.2.3', {num=>-4}); # dies
  
  =item * part => int
  
  Specify which part to bump, where 0 means the most significant part, 1 means the
  second most significant part, and so on. It can also be negative (-1 means the
  least significant part, -2 the second least significant part, and so on). The
  default should be the bumpable least significant part. For example in dotted
  version:
  
   my $v2 = $vs->bump_version('1.2.3', {part=>-2}); # => '1.3.0'
  
  =item * reset_smaller => bool (default: 1)
  
  By default, when a bigger part is increased, the smaller parts are reset (see
  previous example). Setting this option to 0 prevents that:
  
   my $v2 = $vs->bump_version('1.2.3', {part=>-2, reset_smaller=>0}); # => '1.3.3'
  
  =back
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Versioning-Scheme>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Versioning-Scheme>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Versioning-Scheme>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2019, 2018 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
ROLE_VERSIONING_SCHEME

    $main::fatpacked{"Sah/Schema/rinci/function_meta.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'SAH_SCHEMA_RINCI_FUNCTION_META';
  package Sah::Schema::rinci::function_meta;
  
  our $DATE = '2019-05-24'; # DATE
  our $VERSION = '1.1.90.0'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  use Data::Sah::Normalize ();
  use Sah::Schema::rinci::meta ();
  
  our $schema = [hash => {
      summary => 'Rinci function metadata',
  
      # tmp
      _ver => 1.1,
      _prop => {
          %Sah::Schema::rinci::meta::_dh_props,
  
          # from common rinci metadata
          entity_v => {},
          entity_date => {},
          links => {},
  
          is_func => {},
          is_meth => {},
          is_class_meth => {},
          args => {
              _value_prop => {
                  %Sah::Schema::rinci::meta::_dh_props,
  
                  # common rinci metadata
                  links => {},
  
                  schema => {},
                  filters => {},
                  default => {},
                  req => {},
                  pos => {},
                  slurpy => {},
                  greedy => {}, # old alias for slurpy, will be removed in Rinci 1.2
                  partial => {},
                  stream => {},
                  is_password => {},
                  cmdline_aliases => {
                      _value_prop => {
                          summary => {},
                          description => {},
                          schema => {},
                          code => {},
                          is_flag => {},
                      },
                  },
                  cmdline_on_getopt => {},
                  cmdline_prompt => {},
                  completion => {},
                  index_completion => {},
                  element_completion => {},
                  cmdline_src => {},
                  meta => 'fix',
                  element_meta => 'fix',
                  deps => {
                      _keys => {
                          arg => {},
                          all => {},
                          any => {},
                          none => {},
                      },
                  },
                  examples => {},
              },
          },
          args_as => {},
          args_rels => {},
          result => {
              _prop => {
                  %Sah::Schema::rinci::meta::_dh_props,
  
                  schema => {},
                  statuses => {
                      _value_prop => {
                          # from defhash
                          summary => {},
                          description => {},
                          schema => {},
                      },
                  },
                  partial => {},
                  stream => {},
              },
          },
          result_naked => {},
          examples => {
              _elem_prop => {
                  %Sah::Schema::rinci::meta::_dh_props,
  
                  args => {},
                  argv => {},
                  src => {},
                  src_plang => {},
                  status => {},
                  result => {},
                  test => {},
              },
          },
          features => {
              _keys => {
                  reverse => {},
                  tx => {},
                  dry_run => {},
                  pure => {},
                  immutable => {},
                  idempotent => {},
                  check_arg => {},
              },
          },
          deps => {
              _keys => {
                  all => {},
                  any => {},
                  none => {},
                  env => {},
                  prog => {},
                  pkg => {},
                  func => {},
                  code => {},
                  tmp_dir => {},
                  trash_dir => {},
              },
          },
      },
  }, {}];
  
  $schema->[1]{_prop}{args}{_value_prop}{meta} = $schema->[1];
  $schema->[1]{_prop}{args}{_value_prop}{element_meta} = $schema->[1];
  
  # just so the dzil plugin won't complain about schema not being normalized.
  # because this is a circular structure and normalizing creates a shallow copy.
  
  $schema = Data::Sah::Normalize::normalize_schema($schema);
  
  1;
  # ABSTRACT: Rinci function metadata
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Sah::Schema::rinci::function_meta - Rinci function metadata
  
  =head1 VERSION
  
  This document describes version 1.1.90.0 of Sah::Schema::rinci::function_meta (from Perl distribution Sah-Schemas-Rinci), released on 2019-05-24.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Sah-Schemas-Rinci>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Sah-Schemas-Rinci>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Sah-Schemas-Rinci>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2019, 2018, 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
SAH_SCHEMA_RINCI_FUNCTION_META

    $main::fatpacked{"Sah/Schema/rinci/meta.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'SAH_SCHEMA_RINCI_META';
  package Sah::Schema::rinci::meta;
  
  our $DATE = '2019-05-24'; # DATE
  our $VERSION = '1.1.90.0'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  our %_dh_props = (
      v => {},
      defhash_v => {},
      name => {},
      caption => {},
      summary => {},
      description => {},
      tags => {},
      default_lang => {},
      x => {},
  );
  
  our $schema = [hash => {
      summary => 'Rinci metadata',
      # tmp
      _ver => 1.1, # this has the effect of version checking
      _prop => {
          %_dh_props,
  
          entity_v => {},
          entity_date => {},
          links => {
              _elem_prop => {
                  %_dh_props,
  
                  url => {},
              },
          },
      },
  }, {}];
  
  1;
  # ABSTRACT: Rinci metadata
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Sah::Schema::rinci::meta - Rinci metadata
  
  =head1 VERSION
  
  This document describes version 1.1.90.0 of Sah::Schema::rinci::meta (from Perl distribution Sah-Schemas-Rinci), released on 2019-05-24.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Sah-Schemas-Rinci>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Sah-Schemas-Rinci>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Sah-Schemas-Rinci>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2019, 2018, 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
SAH_SCHEMA_RINCI_META

    $main::fatpacked{"Sah/Schema/rinci/result_meta.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'SAH_SCHEMA_RINCI_RESULT_META';
  package Sah::Schema::rinci::result_meta;
  
  our $DATE = '2019-05-24'; # DATE
  our $VERSION = '1.1.90.0'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  use Sah::Schema::rinci::meta;
  
  our $schema = [hash => {
      summary => 'Rinci envelope result metadata',
  
      # tmp
      _ver => 1.1,
      _prop => {
          %Sah::Schema::rinci::meta::_dh_props,
  
          schema => {},
          perm_err => {},
          func => {}, # XXX func.*
          cmdline => {}, # XXX cmdline.*
          logs => {},
          prev => {},
          results => {},
          part_start => {},
          part_len => {},
          len => {},
          stream => {},
      },
  }, {}];
  
  1;
  # ABSTRACT: Rinci envelope result metadata
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Sah::Schema::rinci::result_meta - Rinci envelope result metadata
  
  =head1 VERSION
  
  This document describes version 1.1.90.0 of Sah::Schema::rinci::result_meta (from Perl distribution Sah-Schemas-Rinci), released on 2019-05-24.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Sah-Schemas-Rinci>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Sah-Schemas-Rinci>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Sah-Schemas-Rinci>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2019, 2018, 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
SAH_SCHEMA_RINCI_RESULT_META

    $main::fatpacked{"Sah/SchemaR/rinci/function_meta.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'SAH_SCHEMAR_RINCI_FUNCTION_META';
  package Sah::SchemaR::rinci::function_meta;
  
  our $DATE = '2019-05-24'; # DATE
  our $VERSION = '1.1.90.0'; # VERSION
  
  our $rschema = do{my$a=["hash",[{_prop=>{args=>{_value_prop=>{caption=>{},cmdline_aliases=>{_value_prop=>{code=>{},description=>{},is_flag=>{},schema=>{},summary=>{}}},cmdline_on_getopt=>{},cmdline_prompt=>{},cmdline_src=>{},completion=>{},default=>{},default_lang=>{},defhash_v=>{},deps=>{_keys=>{all=>{},any=>{},arg=>{},none=>{}}},description=>{},element_completion=>{},element_meta=>{_prop=>'fix',_ver=>1.1,summary=>"Rinci function metadata"},examples=>{},filters=>{},greedy=>{},index_completion=>{},is_password=>{},links=>{},meta=>'fix',name=>{},partial=>{},pos=>{},req=>{},schema=>{},slurpy=>{},stream=>{},summary=>{},tags=>{},v=>{},x=>{}}},args_as=>{},args_rels=>{},caption=>'fix',default_lang=>'fix',defhash_v=>'fix',deps=>{_keys=>{all=>{},any=>{},code=>{},env=>{},func=>{},none=>{},pkg=>{},prog=>{},tmp_dir=>{},trash_dir=>{}}},description=>'fix',entity_date=>{},entity_v=>{},examples=>{_elem_prop=>{args=>{},argv=>{},caption=>'fix',default_lang=>'fix',defhash_v=>'fix',description=>'fix',name=>'fix',result=>{},src=>{},src_plang=>{},status=>{},summary=>'fix',tags=>'fix',test=>{},v=>'fix',x=>'fix'}},features=>{_keys=>{check_arg=>{},dry_run=>{},idempotent=>{},immutable=>{},pure=>{},reverse=>{},tx=>{}}},is_class_meth=>{},is_func=>{},is_meth=>{},links=>{},name=>'fix',result=>{_prop=>{caption=>'fix',default_lang=>'fix',defhash_v=>'fix',description=>'fix',name=>'fix',partial=>{},schema=>{},statuses=>{_value_prop=>{description=>{},schema=>{},summary=>{}}},stream=>{},summary=>'fix',tags=>'fix',v=>'fix',x=>'fix'}},result_naked=>{},summary=>'fix',tags=>'fix',v=>'fix',x=>'fix'},_ver=>1.1,summary=>"Rinci function metadata"}],["hash"]];$a->[1][0]{_prop}{args}{_value_prop}{element_meta}{_prop}=$a->[1][0]{_prop};$a->[1][0]{_prop}{args}{_value_prop}{meta}=$a->[1][0]{_prop}{args}{_value_prop}{element_meta};$a->[1][0]{_prop}{caption}=$a->[1][0]{_prop}{args}{_value_prop}{caption};$a->[1][0]{_prop}{default_lang}=$a->[1][0]{_prop}{args}{_value_prop}{default_lang};$a->[1][0]{_prop}{defhash_v}=$a->[1][0]{_prop}{args}{_value_prop}{defhash_v};$a->[1][0]{_prop}{description}=$a->[1][0]{_prop}{args}{_value_prop}{description};$a->[1][0]{_prop}{examples}{_elem_prop}{caption}=$a->[1][0]{_prop}{args}{_value_prop}{caption};$a->[1][0]{_prop}{examples}{_elem_prop}{default_lang}=$a->[1][0]{_prop}{args}{_value_prop}{default_lang};$a->[1][0]{_prop}{examples}{_elem_prop}{defhash_v}=$a->[1][0]{_prop}{args}{_value_prop}{defhash_v};$a->[1][0]{_prop}{examples}{_elem_prop}{description}=$a->[1][0]{_prop}{args}{_value_prop}{description};$a->[1][0]{_prop}{examples}{_elem_prop}{name}=$a->[1][0]{_prop}{args}{_value_prop}{name};$a->[1][0]{_prop}{examples}{_elem_prop}{summary}=$a->[1][0]{_prop}{args}{_value_prop}{summary};$a->[1][0]{_prop}{examples}{_elem_prop}{tags}=$a->[1][0]{_prop}{args}{_value_prop}{tags};$a->[1][0]{_prop}{examples}{_elem_prop}{v}=$a->[1][0]{_prop}{args}{_value_prop}{v};$a->[1][0]{_prop}{examples}{_elem_prop}{x}=$a->[1][0]{_prop}{args}{_value_prop}{x};$a->[1][0]{_prop}{name}=$a->[1][0]{_prop}{args}{_value_prop}{name};$a->[1][0]{_prop}{result}{_prop}{caption}=$a->[1][0]{_prop}{args}{_value_prop}{caption};$a->[1][0]{_prop}{result}{_prop}{default_lang}=$a->[1][0]{_prop}{args}{_value_prop}{default_lang};$a->[1][0]{_prop}{result}{_prop}{defhash_v}=$a->[1][0]{_prop}{args}{_value_prop}{defhash_v};$a->[1][0]{_prop}{result}{_prop}{description}=$a->[1][0]{_prop}{args}{_value_prop}{description};$a->[1][0]{_prop}{result}{_prop}{name}=$a->[1][0]{_prop}{args}{_value_prop}{name};$a->[1][0]{_prop}{result}{_prop}{summary}=$a->[1][0]{_prop}{args}{_value_prop}{summary};$a->[1][0]{_prop}{result}{_prop}{tags}=$a->[1][0]{_prop}{args}{_value_prop}{tags};$a->[1][0]{_prop}{result}{_prop}{v}=$a->[1][0]{_prop}{args}{_value_prop}{v};$a->[1][0]{_prop}{result}{_prop}{x}=$a->[1][0]{_prop}{args}{_value_prop}{x};$a->[1][0]{_prop}{summary}=$a->[1][0]{_prop}{args}{_value_prop}{summary};$a->[1][0]{_prop}{tags}=$a->[1][0]{_prop}{args}{_value_prop}{tags};$a->[1][0]{_prop}{v}=$a->[1][0]{_prop}{args}{_value_prop}{v};$a->[1][0]{_prop}{x}=$a->[1][0]{_prop}{args}{_value_prop}{x};$a};
  
  1;
  # ABSTRACT: Rinci function metadata
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Sah::SchemaR::rinci::function_meta - Rinci function metadata
  
  =head1 VERSION
  
  This document describes version 1.1.90.0 of Sah::SchemaR::rinci::function_meta (from Perl distribution Sah-Schemas-Rinci), released on 2019-05-24.
  
  =head1 DESCRIPTION
  
  This module is automatically generated by Dist::Zilla::Plugin::Sah::Schemas during distribution build.
  
  A Sah::SchemaR::* module is useful if a client wants to quickly lookup the base type of a schema without having to do any extra resolving. With Sah::Schema::*, one might need to do several lookups if a schema is based on another schema, and so on. Compare for example L<Sah::Schema::poseven> vs L<Sah::SchemaR::poseven>, where in Sah::SchemaR::poseven one can immediately get that the base type is C<int>. Currently L<Perinci::Sub::Complete> uses Sah::SchemaR::* instead of Sah::Schema::* for reduced startup overhead when doing tab completion.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Sah-Schemas-Rinci>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Sah-Schemas-Rinci>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Sah-Schemas-Rinci>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2019, 2018, 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
SAH_SCHEMAR_RINCI_FUNCTION_META

    $main::fatpacked{"Sah/SchemaR/rinci/meta.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'SAH_SCHEMAR_RINCI_META';
  package Sah::SchemaR::rinci::meta;
  
  our $DATE = '2019-05-24'; # DATE
  our $VERSION = '1.1.90.0'; # VERSION
  
  our $rschema = do{my$a=["hash",[{_prop=>{caption=>{},default_lang=>{},defhash_v=>{},description=>{},entity_date=>{},entity_v=>{},links=>{_elem_prop=>{caption=>'fix',default_lang=>'fix',defhash_v=>'fix',description=>'fix',name=>{},summary=>{},tags=>{},url=>{},v=>{},x=>{}}},name=>'fix',summary=>'fix',tags=>'fix',v=>'fix',x=>'fix'},_ver=>1.1,summary=>"Rinci metadata"}],["hash"]];$a->[1][0]{_prop}{links}{_elem_prop}{caption}=$a->[1][0]{_prop}{caption};$a->[1][0]{_prop}{links}{_elem_prop}{default_lang}=$a->[1][0]{_prop}{default_lang};$a->[1][0]{_prop}{links}{_elem_prop}{defhash_v}=$a->[1][0]{_prop}{defhash_v};$a->[1][0]{_prop}{links}{_elem_prop}{description}=$a->[1][0]{_prop}{description};$a->[1][0]{_prop}{name}=$a->[1][0]{_prop}{links}{_elem_prop}{name};$a->[1][0]{_prop}{summary}=$a->[1][0]{_prop}{links}{_elem_prop}{summary};$a->[1][0]{_prop}{tags}=$a->[1][0]{_prop}{links}{_elem_prop}{tags};$a->[1][0]{_prop}{v}=$a->[1][0]{_prop}{links}{_elem_prop}{v};$a->[1][0]{_prop}{x}=$a->[1][0]{_prop}{links}{_elem_prop}{x};$a};
  
  1;
  # ABSTRACT: Rinci metadata
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Sah::SchemaR::rinci::meta - Rinci metadata
  
  =head1 VERSION
  
  This document describes version 1.1.90.0 of Sah::SchemaR::rinci::meta (from Perl distribution Sah-Schemas-Rinci), released on 2019-05-24.
  
  =head1 DESCRIPTION
  
  This module is automatically generated by Dist::Zilla::Plugin::Sah::Schemas during distribution build.
  
  A Sah::SchemaR::* module is useful if a client wants to quickly lookup the base type of a schema without having to do any extra resolving. With Sah::Schema::*, one might need to do several lookups if a schema is based on another schema, and so on. Compare for example L<Sah::Schema::poseven> vs L<Sah::SchemaR::poseven>, where in Sah::SchemaR::poseven one can immediately get that the base type is C<int>. Currently L<Perinci::Sub::Complete> uses Sah::SchemaR::* instead of Sah::Schema::* for reduced startup overhead when doing tab completion.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Sah-Schemas-Rinci>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Sah-Schemas-Rinci>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Sah-Schemas-Rinci>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2019, 2018, 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
SAH_SCHEMAR_RINCI_META

    $main::fatpacked{"Sah/SchemaR/rinci/result_meta.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'SAH_SCHEMAR_RINCI_RESULT_META';
  package Sah::SchemaR::rinci::result_meta;
  
  our $DATE = '2019-05-24'; # DATE
  our $VERSION = '1.1.90.0'; # VERSION
  
  our $rschema = ["hash",[{_prop=>{caption=>{},cmdline=>{},default_lang=>{},defhash_v=>{},description=>{},func=>{},len=>{},logs=>{},name=>{},part_len=>{},part_start=>{},perm_err=>{},prev=>{},results=>{},schema=>{},stream=>{},summary=>{},tags=>{},v=>{},x=>{}},_ver=>1.1,summary=>"Rinci envelope result metadata"}],["hash"]];
  
  1;
  # ABSTRACT: Rinci envelope result metadata
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Sah::SchemaR::rinci::result_meta - Rinci envelope result metadata
  
  =head1 VERSION
  
  This document describes version 1.1.90.0 of Sah::SchemaR::rinci::result_meta (from Perl distribution Sah-Schemas-Rinci), released on 2019-05-24.
  
  =head1 DESCRIPTION
  
  This module is automatically generated by Dist::Zilla::Plugin::Sah::Schemas during distribution build.
  
  A Sah::SchemaR::* module is useful if a client wants to quickly lookup the base type of a schema without having to do any extra resolving. With Sah::Schema::*, one might need to do several lookups if a schema is based on another schema, and so on. Compare for example L<Sah::Schema::poseven> vs L<Sah::SchemaR::poseven>, where in Sah::SchemaR::poseven one can immediately get that the base type is C<int>. Currently L<Perinci::Sub::Complete> uses Sah::SchemaR::* instead of Sah::Schema::* for reduced startup overhead when doing tab completion.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Sah-Schemas-Rinci>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Sah-Schemas-Rinci>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Sah-Schemas-Rinci>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2019, 2018, 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
SAH_SCHEMAR_RINCI_RESULT_META

    $main::fatpacked{"Sah/Schemas/Rinci.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'SAH_SCHEMAS_RINCI';
  package Sah::Schemas::Rinci;
  
  our $DATE = '2019-05-24'; # DATE
  our $VERSION = '1.1.90.0'; # VERSION
  
  1;
  # ABSTRACT: Sah schemas for Rinci
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Sah::Schemas::Rinci - Sah schemas for Rinci
  
  =head1 VERSION
  
  This document describes version 1.1.90.0 of Sah::Schemas::Rinci (from Perl distribution Sah-Schemas-Rinci), released on 2019-05-24.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Sah-Schemas-Rinci>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Sah-Schemas-Rinci>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Sah-Schemas-Rinci>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Sah> - specification
  
  L<Data::Sah>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2019, 2018, 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
SAH_SCHEMAS_RINCI

    $main::fatpacked{"Scalar/Util/Numeric/PP.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'SCALAR_UTIL_NUMERIC_PP';
  package Scalar::Util::Numeric::PP;
  
  our $DATE = '2016-01-22'; # DATE
  our $VERSION = '0.04'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  require Exporter;
  our @ISA       = qw(Exporter);
  our @EXPORT_OK = qw(
                         isint
                         isnum
                         isnan
                         isinf
                         isneg
                         isfloat
                 );
  
  sub isint {
      local $_ = shift;
      return 0 unless defined;
      return 1 if /\A\s*[+-]?(?:0|[1-9][0-9]*)\s*\z/s;
      0;
  }
  
  sub isnan($) {
      local $_ = shift;
      return 0 unless defined;
      return 1 if /\A\s*[+-]?nan\s*\z/is;
      0;
  }
  
  sub isinf($) {
      local $_ = shift;
      return 0 unless defined;
      return 1 if /\A\s*[+-]?inf(?:inity)?\s*\z/is;
      0;
  }
  
  sub isneg($) {
      local $_ = shift;
      return 0 unless defined;
      return 1 if /\A\s*-/;
      0;
  }
  
  sub isnum($) {
      local $_ = shift;
      return 0 unless defined;
      return 1 if isint($_);
      return 1 if isfloat($_);
      0;
  }
  
  sub isfloat($) {
      local $_ = shift;
      return 0 unless defined;
      return 1 if /\A\s*[+-]?
                   (?: (?:0|[1-9][0-9]*)(\.[0-9]+)? | (\.[0-9]+) )
                   ([eE][+-]?[0-9]+)?\s*\z/sx && $1 || $2 || $3;
      return 1 if isnan($_) || isinf($_);
      0;
  }
  
  1;
  # ABSTRACT: Pure-perl drop-in replacement/approximation of Scalar::Util::Numeric
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Scalar::Util::Numeric::PP - Pure-perl drop-in replacement/approximation of Scalar::Util::Numeric
  
  =head1 VERSION
  
  This document describes version 0.04 of Scalar::Util::Numeric::PP (from Perl distribution Scalar-Util-Numeric-PP), released on 2016-01-22.
  
  =head1 SYNOPSIS
  
  =head1 DESCRIPTION
  
  This module is written mainly for the convenience of L<Data::Sah>, as a drop-in
  pure-perl replacement for the XS module L<Scalar::Util::Numeric>, in the case
  when Data::Sah needs to generate code that uses PP modules instead of XS ones.
  
  Not all functions from Scalar::Util::Numeric have been provided.
  
  =head1 FUNCTIONS
  
  =head2 isint
  
  =head2 isfloat
  
  =head2 isnum
  
  =head2 isneg
  
  =head2 isinf
  
  =head2 isnan
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Scalar-Util-Numeric-PP>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Scalar-Util-Numeric-PP>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Scalar-Util-Numeric-PP>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Data::Sah>
  
  L<Scalar::Util::Numeric>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
SCALAR_UTIL_NUMERIC_PP

    $main::fatpacked{"Sort/BySpec.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'SORT_BYSPEC';
  package Sort::BySpec;
  
  our $DATE = '2017-02-17'; # DATE
  our $VERSION = '0.03'; # VERSION
  
  use 5.010001;
  use strict 'subs', 'vars';
  use warnings;
  
  use Exporter qw(import);
  our @EXPORT_OK = qw(sort_by_spec cmp_by_spec);
  
  our %SPEC;
  
  $SPEC{':package'} = {
      v => 1.1,
      summary => 'Sort array (or create a list sorter) according to '.
          'specification',
  };
  
  $SPEC{sort_by_spec} = {
      v => 1.1,
      summary => 'Sort array (or create a list sorter) according to '.
          'specification',
      description => <<'_',
  
  
  _
      args => {
          spec => {
              schema => 'array*',
              req => 1,
              pos => 0,
          },
          xform => {
              schema => 'code*',
              summary => 'Code to return sort keys from data elements',
              description => <<'_',
  
  This is just like `xform` in `Sort::ByExample`.
  
  _
          },
          reverse => {
              summary => 'If set to true, will reverse the sort order',
              schema => ['bool*', is=>1],
          },
          array => {
              schema => 'array*',
          },
      },
      result => {
          summary => 'Sorted array, or sort coderef',
          schema => ['any*', of=>['array*','code*']],
          description => <<'_',
  
  If array is specified, will returned the sorted array. If array is not specified
  in the argument, will return a sort subroutine that can be used to sort a list
  and return the sorted list.
  
  _
      },
      result_naked => 1,
      examples => [
          {
              summary => 'Sort according to a sequence of scalars (like Sort::ByExample)',
              args => {
                  spec => ['foo', 'bar', 'baz'],
                  array => [1, 2, 3, 'bar', 'a', 'b', 'c', 'baz'],
              },
          },
          {
              summary => 'Like previous example, but reversed',
              args => {
                  spec => ['foo', 'bar', 'baz'],
                  array => [1, 2, 3, 'bar', 'a', 'b', 'c', 'baz'],
                  reverse => 1,
              },
          },
          {
              summary => 'Put integers first (in descending order), then '.
                  'a sequence of scalars, then others (in ascending order)',
              args => {
                  spec => [
                      qr/\A\d+\z/ => sub { $_[1] <=> $_[0] },
                      'foo', 'bar', 'baz',
                      qr// => sub { $_[0] cmp $_[1] },
                  ],
                  array => ["qux", "b", "a", "bar", "foo", 1, 10, 2],
              },
          },
      ],
  };
  sub sort_by_spec {
      my %args = @_;
  
      my $spec  = $args{spec};
      my $xform = $args{xform};
  
      my $code_get_rank = sub {
          my $val = shift;
  
          my $j;
          for my $which (0..2) { # 0=scalar, 1=regexp, 2=code
              $j = -1;
              while ($j < $#{$spec}) {
                  $j++;
                  my $spec_elem = $spec->[$j];
                  my $ref = ref($spec_elem);
                  if (!$ref) {
                      if ($which == 0 && $val eq $spec_elem) {
                          return($j);
                      }
                  } elsif ($ref eq 'Regexp') {
                      my $sortsub;
                      if ($j < $#{$spec} && ref($spec->[$j+1]) eq 'CODE') {
                          $sortsub = $spec->[$j+1];
                      }
                      if ($which == 1 && $val =~ $spec_elem) {
                          return($j, $sortsub);
                      }
                      $j++ if $sortsub;
                  } elsif ($ref eq 'CODE') {
                      my $sortsub;
                      if ($j < $#{$spec} && ref($spec->[$j+1]) eq 'CODE') {
                          $sortsub = $spec->[$j+1];
                      }
                      if ($which == 2 && $spec_elem->($val)) {
                          return($j, $sortsub);
                      }
                      $j++ if $sortsub;
                  } else {
                      die "Invalid spec[$j]: not a scalar/Regexp/code";
                  }
              } # loop element of spec
          } # which
          return($j+1);
      };
  
      if ($args{_return_cmp}) {
          my $cmp = sub {
              my ($a, $b);
  
              if (@_ >= 2) {
                  $a = $_[0];
                  $b = $_[1];
              } else {
                  my $caller = caller();
                  $a = ${"caller\::a"};
                  $b = ${"caller\::b"};
              }
  
              if ($xform) {
                  $a = $xform->($a);
                  $b = $xform->($b);
              }
  
              if ($args{reverse}) {
                  ($a, $b) = ($b, $a);
              }
  
              my ($rank_a, $sortsub) = $code_get_rank->($a);
              my ($rank_b          ) = $code_get_rank->($b);
  
              if ($rank_a != $rank_b) {
                  return $rank_a <=> $rank_b;
              }
              return 0 unless $sortsub;
              return $sortsub->($a, $b);
          };
          return $cmp;
      } else {
          # use schwartzian transform to speed sorting longer lists
          my $sorter = sub {
              return map { $_->[0] }
                  sort {
                      $a->[2] <=> $b->[2] ||
                          ($a->[3] ? $a->[3]($a->[1], $b->[1]) : 0) }
                      map {
                          my $x = $xform ? $xform->($_) : $_;
                          [$_, $x, $code_get_rank->($x)]
                      } @_;
          };
  
          if ($args{array}) {
              return [$sorter->(@{ $args{array} })];
          }
          return $sorter;
      }
  }
  
  $SPEC{cmp_by_spec} = do {
      # poor man's "clone"
      my $meta = { %{ $SPEC{sort_by_spec} } };
      $meta->{summary} = 'Create a compare subroutine to be used in sort()';
      $meta->{args} = { %{$meta->{args}} };
      delete $meta->{args}{array};
      $meta->{result} = {
          schema => ['code*'],
      };
      delete $meta->{examples};
      $meta;
  };
  sub cmp_by_spec {
      sort_by_spec(
          @_,
          _return_cmp => 1,
      );
  }
  
  1;
  # ABSTRACT: Sort array (or create a list sorter) according to specification
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Sort::BySpec - Sort array (or create a list sorter) according to specification
  
  =head1 VERSION
  
  This document describes version 0.03 of Sort::BySpec (from Perl distribution Sort-BySpec), released on 2017-02-17.
  
  =head1 SYNOPSIS
  
   use Sort::BySpec qw(sort_by_spec cmp_by_spec);
  
   my $sorter = sort_by_spec(spec => [
       # put odd numbers first, in ascending order
       qr/[13579]\z/ => sub { $_[0] <=> $_[1] },
  
       # then put specific numbers here, in this order
       4, 2, 42,
  
       # put even numbers last, in descending order
       sub { $_[0] % 2 == 0 } => sub { $_[1] <=> $_[0] },
   ]);
  
   my @res = $sorter->(1..15, 42);
   # => (1,3,5,7,9,11,13,15,  4,2,42,   14,12,10,8,6)
  
  =head1 DESCRIPTION
  
  This package provides a more powerful alternative to L<Sort::ByExample>. Unlike
  in `Sort::ByExample` where you only provide a single array of example, you can
  specify multiple examples as well as regex or matcher subroutine coupled with
  sort rules. With this, you can more precisely specify how elements of your list
  should be ordered. If your needs are not met by Sort::ByExample, you might want
  to consider this package. The downside is performance penalty, especially when
  your list is large.
  
  To sort using Sort::BySpec, you provide a "spec" which is an array of strings,
  regexes, or coderefs to match against elements of your list to be sorted. In the
  simplest form, the spec contains only a list of examples:
  
   my $sorter = sort_by_spec(spec => ["foo", "bar", "baz"]); # [1]
  
  and this is equivalent to Sort::ByExample:
  
   my $sorter = sbe(["foo", "bar", "baz"]);
  
  You can also specify regex to match elements. This is evaluated after strings,
  so this work:
  
   my $sorter = sort_by_spec(spec => [qr/o/, "foo", "bar", "baz", qr/a/]);
   my @list = ("foo", "food", "bar", "back", "baz", "fool", "boat");
   my @res = $sorter->(@list);
   # => ("food","boat","fool",   "foo","bar","baz",   "back")
  
  Right after a regex, you can optionally specify a sort subroutine to tell how to
  sort elements matching that regex, for example:
  
   my $sorter = sort_by_spec(spec => [
       qr/o/ => sub { $_[0] cmp $_[1] },
       "foo", "bar", "baz",
       qr/a/
   ]);
  
   # the same list @list above will now be sorted into:
   # => ("boat","food","fool",   "foo","bar","baz",   "back")
  
  Note that instead of C<$a> and C<$b>, you should use C<$_[0]> and C<$_[1]>
  respectively. This avoids the package scoping issue of C<$a> and C<$b>, making
  your sorter subroutine works everywhere without any special workaround.
  
  Finally, aside from strings and regexes, you can also specify a coderef matcher
  for more complex matching:
  
   my $sorter = sort_by_spec(spec => [
       # put odd numbers first, in ascending order
       sub { $_[0] % 2 } => sub { $_[0] <=> $_[1] },
  
       # then put specific numbers here, in this order
       4, 2, 42,
  
       # put even numbers last, in descending order
       sub { $_[0] % 2 == 0 } => sub { $_[1] <=> $_[0] },
   ]);
  
   my @res = $sorter->(1..15, 42);
   # => (1,3,5,7,9,11,13,15,  4,2,42,   14,12,10,8,6)
  
  =head1 FUNCTIONS
  
  
  =head2 cmp_by_spec
  
  Usage:
  
   cmp_by_spec(%args) -> code
  
  Create a compare subroutine to be used in sort().
  
  This function is not exported by default, but exportable.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<reverse> => I<bool>
  
  If set to true, will reverse the sort order.
  
  =item * B<spec>* => I<array>
  
  =item * B<xform> => I<code>
  
  Code to return sort keys from data elements.
  
  This is just like C<xform> in C<Sort::ByExample>.
  
  =back
  
  Return value:  (code)
  
  
  =head2 sort_by_spec
  
  Usage:
  
   sort_by_spec(%args) -> array|code
  
  Sort array (or create a list sorter) according to specification.
  
  Examples:
  
  =over
  
  =item * Sort according to a sequence of scalars (like Sort::ByExample):
  
   sort_by_spec(
   spec  => ["foo", "bar", "baz"],
     array => [1, 2, 3, "bar", "a", "b", "c", "baz"]
   );
  
  Result:
  
   ["bar", "baz", 1, 2, 3, "a", "b", "c"]
  
  =item * Like previous example, but reversed:
  
   sort_by_spec(
   spec    => ["foo", "bar", "baz"],
     array   => [1, 2, 3, "bar", "a", "b", "c", "baz"],
     reverse => 1
   );
  
  Result:
  
   ["bar", "baz", 1, 2, 3, "a", "b", "c"]
  
  =item * Put integers first (in descending order), then a sequence of scalars, then others (in ascending order):
  
   sort_by_spec(
   spec  => [
                qr/\A\d+\z/,
                sub { $_[1] <=> $_[0] },
                "foo",
                "bar",
                "baz",
                qr//,
                sub { $_[0] cmp $_[1] },
              ],
     array => ["qux", "b", "a", "bar", "foo", 1, 10, 2]
   );
  
  Result:
  
   [10, 2, 1, "foo", "bar", "a", "b", "qux"]
  
  =back
  
  This function is not exported by default, but exportable.
  
  Arguments ('*' denotes required arguments):
  
  =over 4
  
  =item * B<array> => I<array>
  
  =item * B<reverse> => I<bool>
  
  If set to true, will reverse the sort order.
  
  =item * B<spec>* => I<array>
  
  =item * B<xform> => I<code>
  
  Code to return sort keys from data elements.
  
  This is just like C<xform> in C<Sort::ByExample>.
  
  =back
  
  Return value: Sorted array, or sort coderef (array|code)
  
  
  If array is specified, will returned the sorted array. If array is not specified
  in the argument, will return a sort subroutine that can be used to sort a list
  and return the sorted list.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Sort-BySpec>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Sort-BySpec>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Sort-BySpec>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Sort::ByExample>
  
  L<Bencher::Scenario::SortBySpec>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2017, 2015 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
SORT_BYSPEC

    $main::fatpacked{"Specio.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'SPECIO';
  package Specio;
  
  use strict;
  use warnings;
  
  use 5.008;
  
  our $VERSION = '0.44';
  
  1;
  
  # ABSTRACT: Type constraints and coercions for Perl
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Specio - Type constraints and coercions for Perl
  
  =head1 VERSION
  
  version 0.44
  
  =head1 SYNOPSIS
  
      package MyApp::Type::Library;
  
      use Specio::Declare;
      use Specio::Library::Builtins;
  
      declare(
          'PositiveInt',
          parent => t('Int'),
          inline => sub {
              $_[0]->parent->inline_check( $_[1] )
                  . ' && ( '
                  . $_[1]
                  . ' > 0 )';
          },
      );
  
      # or ...
  
      declare(
          'PositiveInt',
          parent => t('Int'),
          where  => sub { $_[0] > 0 },
      );
  
      declare(
          'ArrayRefOfPositiveInt',
          parent => t(
              'ArrayRef',
              of => t('PositiveInt'),
          ),
      );
  
      coerce(
          'ArrayRefOfPositiveInt',
          from  => t('PositiveInt'),
          using => sub { [ $_[0] ] },
      );
  
      any_can_type(
          'Duck',
          methods => [ 'duck_walk', 'quack' ],
      );
  
      object_isa_type('MyApp::Person');
  
  =head1 DESCRIPTION
  
  The C<Specio> distribution provides classes for representing type constraints
  and coercion, along with syntax sugar for declaring them.
  
  Note that this is not a proper type system for Perl. Nothing in this
  distribution will magically make the Perl interpreter start checking a value's
  type on assignment to a variable. In fact, there's no built-in way to apply a
  type to a variable at all.
  
  Instead, you can explicitly check a value against a type, and optionally
  coerce values to that type.
  
  My long-term goal is to replace Moose's built-in types and L<MooseX::Types>
  with this module.
  
  =head1 WHAT IS A TYPE?
  
  At it's core, a type is simply a constraint. A constraint is code that checks
  a value and returns true or false. Most constraints are represented by
  L<Specio::Constraint::Simple> objects. However, there are other type
  constraint classes for specialized kinds of constraints.
  
  Types can be named or anonymous, and each type can have a parent type. A
  type's constraint is optional because sometimes you may want to create a named
  subtype of some existing type without adding additional constraints.
  
  Constraints can be expressed either in terms of a simple subroutine reference
  or in terms of an inline generator subroutine reference. The former is easier
  to write but the latter is preferred because it allow for better optimization.
  
  A type can also have an optional message generator subroutine reference. You
  can use this to provide a more intelligent error message when a value does not
  pass the constraint, though the default message should suffice for most cases.
  
  Finally, you can associate a set of coercions with a type. A coercion is a
  subroutine reference (or inline generator, like constraints), that takes a
  value of one type and turns it into a value that matches the type the coercion
  belongs to.
  
  =head1 BUILTIN TYPES
  
  This distribution ships with a set of builtin types representing the types
  provided by the Perl interpreter itself. They are arranged in a hierarchy as
  follows:
  
    Item
        Bool
        Maybe (of `a)
        Undef
        Defined
            Value
                Str
                    Num
                        Int
                    ClassName
            Ref
                ScalarRef (of `a)
                ArrayRef (of `a)
                HashRef (of `a)
                CodeRef
                RegexpRef
                GlobRef
                FileHandle
                Object
  
  The C<Item> type accepts anything and everything.
  
  The C<Bool> type only accepts C<undef>, C<0>, or C<1>.
  
  The C<Undef> type only accepts C<undef>.
  
  The C<Defined> type accepts anything I<except> C<undef>.
  
  The C<Num> and C<Int> types are stricter about numbers than Perl
  is. Specifically, they do not allow any sort of space in the number, nor do
  they accept "Nan", "Inf", or "Infinity".
  
  The C<ClassName> type constraint checks that the name is valid I<and> that the
  class is loaded.
  
  The C<FileHandle> type accepts either a glob, a scalar filehandle, or anything
  that isa L<IO::Handle>.
  
  All types accept overloaded objects that support the required operation. See
  below for details.
  
  =head2 Overloading
  
  Perl's overloading is horribly broken and doesn't make much sense at all.
  
  However, unlike Moose, all type constraints allow overloaded objects where
  they make sense.
  
  For types where overloading makes sense, we explicitly check that the object
  provides the type overloading we expect. We I<do not> simply try to use the
  object as the type in question and hope it works. This means that these checks
  effectively ignore the C<fallback> setting for the overloaded object. In other
  words, an object that overloads stringification will not pass the C<Bool> type
  check unless it I<also> overloads boolification.
  
  Most types do not check that the overloaded method actually returns something
  that matches the constraint. This may change in the future.
  
  The C<Bool> type accepts an object that implements C<bool> overloading.
  
  The C<Str> type accepts an object that implements string (C<q{""}>)
  overloading.
  
  The C<Num> type accepts an object that implements numeric (C<'0+'}>)
  overloading. The C<Int> type does as well, but it will check that the
  overloading returns an actual integer.
  
  The C<ClassName> type will accept an object with string overloading that
  returns a class name.
  
  To make this all more confusing, the C<Value> type will I<never> accept an
  object, even though some of its subtypes will.
  
  The various reference types all accept objects which provide the appropriate
  overloading. The C<FileHandle> type accepts an object which overloads
  globification as long as the returned glob is an open filehandle.
  
  =head1 PARAMETERIZABLE TYPES
  
  Any type followed by a type parameter C<of `a> in the hierarchy above can be
  parameterized. The parameter is itself a type, so you can say you want an
  "ArrayRef of Int", or even an "ArrayRef of HashRef of ScalarRef of ClassName".
  
  When they are parameterized, the C<ScalarRef> and C<ArrayRef> types check that
  the value(s) they refer to match the type parameter. For the C<HashRef> type,
  the parameter applies to the values (keys are never checked).
  
  =head2 Maybe
  
  The C<Maybe> type is a special parameterized type. It allows for either
  C<undef> or a value. All by itself, it is meaningless, since it is equivalent
  to "Maybe of Item", which is equivalent to Item. When parameterized, it
  accepts either an C<undef> or the type of its parameter.
  
  This is useful for optional attributes or parameters. However, you're probably
  better off making your code simply not pass the parameter at all This usually
  makes for a simpler API.
  
  =head1 REGISTRIES AND IMPORTING
  
  Types are local to each package where they are used. When you "import" types
  from some other library, you are actually making a copy of that type.
  
  This means that a type named "Foo" in one package may not be the same as "Foo"
  in another package. This has potential for confusion, but it also avoids the
  magic action at a distance pollution that comes with a global type naming
  system.
  
  The registry is managed internally by the Specio distribution's modules, and is
  not exposed to your code. To access a type, you always call C<t('TypeName')>.
  
  This returns the named type or dies if no such type exists.
  
  Because types are always copied on import, it's safe to create coercions on
  any type. Your coercion from C<Str> to C<Int> will not be seen by any other
  package, unless that package explicitly imports your C<Int> type.
  
  When you import types, you import every type defined in the package you import
  from. However, you I<can> overwrite an imported type with your own type
  definition. You I<cannot> define the same type twice internally.
  
  =head1 CREATING A TYPE LIBRARY
  
  By default, all types created inside a package are invisible to other
  packages. If you want to create a type library, you need to inherit from
  L<Specio::Exporter> package:
  
    package MyApp::Type::Library;
  
    use parent 'Specio::Exporter';
  
    use Specio::Declare;
    use Specio::Library::Builtins;
  
    declare(
        'Foo',
        parent => t('Str'),
        where  => sub { $_[0] =~ /foo/i },
    );
  
  Now the MyApp::Type::Library package will export a single type named
  C<Foo>. It I<does not> re-export the types provided by
  L<Specio::Library::Builtins>.
  
  If you want to make your library re-export some other libraries types, you can
  ask for this explicitly:
  
    package MyApp::Type::Library;
  
    use parent 'Specio::Exporter';
  
    use Specio::Declare;
    use Specio::Library::Builtins -reexport;
  
    declare( 'Foo, ... );
  
  Now MyApp::Types::Library exports any types it defines, as well as all the
  types defined in L<Specio::Library::Builtins>.
  
  =head1 DECLARING TYPES
  
  Use the L<Specio::Declare> module to declare types. It exports a set of helpers
  for declaring types. See that module's documentation for more details on these
  helpers.
  
  =head1 USING SPECIO WITH L<Moose>
  
  This should just work. Use a Specio type anywhere you'd specify a type.
  
  =head1 USING SPECIO WITH L<Moo>
  
  Using Specio with Moo is easy. You can pass Specio constraint objects as
  C<isa> parameters for attributes. For coercions, simply call C<<
  $type->coercion_sub >>.
  
      package Foo;
  
      use Specio::Declare;
      use Specio::Library::Builtins;
      use Moo;
  
      my $str_type = t('Str');
      has string => (
         is  => 'ro',
         isa => $str_type,
      );
  
      my $ucstr = declare(
          'UCStr',
          parent => t('Str'),
          where  => sub { $_[0] =~ /^[A-Z]+$/ },
      );
  
      coerce(
          $ucstr,
          from  => t('Str'),
          using => sub { return uc $_[0] },
      );
  
      has ucstr => (
          is     => 'ro',
          isa    => $ucstr,
          coerce => $ucstr->coercion_sub,
      );
  
  The subs returned by Specio use L<Sub::Quote> internally and are suitable for
  inlining.
  
  =head1 USING SPECIO WITH OTHER THINGS
  
  See L<Specio::Constraint::Simple> for the API that all constraint objects
  share.
  
  =head1 L<Moose>, L<MooseX::Types>, and Specio
  
  This module aims to supplant both L<Moose>'s built-in type system (see
  L<Moose::Util::TypeConstraints> aka MUTC) and L<MooseX::Types>, which attempts
  to patch some of the holes in the Moose built-in type design.
  
  Here are some of the salient differences:
  
  =over 4
  
  =item * Types names are strings, but they're not global
  
  Unlike Moose and MooseX::Types, type names are always local to the current
  package. There is no possibility of name collision between different modules,
  so you can safely use short type names.
  
  Unlike MooseX::Types, types are strings, so there is no possibility of
  colliding with existing class or subroutine names.
  
  =item * No type auto-creation
  
  Types are always retrieved using the C<t()> subroutine. If you pass an unknown
  name to this subroutine it dies. This is different from Moose and
  MooseX::Types, which assume that unknown names are class names.
  
  =item * Anon types are explicit
  
  With L<Moose> and L<MooseX::Types>, you use the same subroutine, C<subtype()>,
  to declare both named and anonymous types. With Specio, you use C<declare()> for
  named types and C<anon()> for anonymous types.
  
  =item * Class and object types are separate
  
  Moose and MooseX::Types have C<class_type> and C<duck_type>. The former type
  requires an object, while the latter accepts a class name or object.
  
  With Specio, the distinction between accepting an object versus object or
  class is explicit. There are six declaration helpers, C<object_can_type>,
  C<object_does_type>, C<object_isa_type>, C<any_can_type>, C<any_does_type>,
  and C<any_isa_type>.
  
  =item * Overloading support is baked in
  
  Perl's overloading is quite broken but ignoring it makes Moose's type system
  frustrating to use in many cases.
  
  =item * Types can either have a constraint or inline generator, not both
  
  Moose and MooseX::Types types can be defined with a subroutine reference as
  the constraint, an inline generator subroutine, or both. This is purely for
  backwards compatibility, and it makes the internals more complicated than they
  need to be.
  
  With Specio, a constraint can have I<either> a subroutine reference or an
  inline generator, not both.
  
  =item * Coercions can be inlined
  
  I simply never got around to implementing this in Moose.
  
  =item * No crazy coercion features
  
  Moose has some bizarre (and mostly) undocumented features relating to
  coercions and parameterizable types. This is a misfeature.
  
  =back
  
  =head1 OPTIONAL PREREQS
  
  There are several optional prereqs that if installed will make this
  distribution better in some way.
  
  =over 4
  
  =item * L<Ref::Util>
  
  Installing this will speed up a number of type checks for built-in types.
  
  =item * L<XString>
  
  If this is installed it will be loaded instead of the L<B> module if you have
  Perl 5.10 or greater. This module is much more memory efficient than loading
  all of L<B>.
  
  =item * L<Sub::Util> or L<Sub::Name>
  
  If one of these is installed then stack traces that end up in Specio code will
  have much better subroutine names for any frames.
  
  =back
  
  =head1 WHY THE NAME?
  
  This distro was originally called "Type", but that's an awfully generic top
  level namespace. Specio is Latin for for "look at" and "spec" is the root for
  the word "species". It's short, relatively easy to type, and not used by any
  other distro.
  
  =head1 LONG-TERM PLANS
  
  Eventually I'd like to see this distro replace Moose's internal type system,
  which would also make MooseX::Types obsolete.
  
  =head1 SUPPORT
  
  Bugs may be submitted at L<https://github.com/houseabsolute/Specio/issues>.
  
  I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
  
  =head1 SOURCE
  
  The source code repository for Specio can be found at L<https://github.com/houseabsolute/Specio>.
  
  =head1 DONATIONS
  
  If you'd like to thank me for the work I've done on this module, please
  consider making a "donation" to me via PayPal. I spend a lot of free time
  creating free software, and would appreciate any support you'd care to offer.
  
  Please note that B<I am not suggesting that you must do this> in order for me
  to continue working on this particular software. I will continue to do so,
  inasmuch as I have in the past, for as long as it interests me.
  
  Similarly, a donation made in this way will probably not make me work on this
  software much more, unless I get so many donations that I can consider working
  on free software full time (let's all have a chuckle at that together).
  
  To donate, log into PayPal and send money to autarch@urth.org, or use the
  button at L<http://www.urth.org/~autarch/fs-donation.html>.
  
  =head1 AUTHOR
  
  Dave Rolsky <autarch@urth.org>
  
  =head1 CONTRIBUTORS
  
  =for stopwords Chris White cpansprout Graham Knop Karen Etheridge
  
  =over 4
  
  =item *
  
  Chris White <chrisw@leehayes.com>
  
  =item *
  
  cpansprout <cpansprout@gmail.com>
  
  =item *
  
  Graham Knop <haarg@haarg.org>
  
  =item *
  
  Karen Etheridge <ether@cpan.org>
  
  =back
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is Copyright (c) 2012 - 2019 by Dave Rolsky.
  
  This is free software, licensed under:
  
    The Artistic License 2.0 (GPL Compatible)
  
  The full text of the license can be found in the
  F<LICENSE> file included with this distribution.
  
  =cut
SPECIO

    $main::fatpacked{"Specio/Coercion.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'SPECIO_COERCION';
  package Specio::Coercion;
  
  use strict;
  use warnings;
  
  our $VERSION = '0.44';
  
  use Specio::OO;
  
  use Role::Tiny::With;
  
  use Specio::Role::Inlinable;
  with 'Specio::Role::Inlinable';
  
  {
      ## no critic (Subroutines::ProtectPrivateSubs)
      my $role_attrs = Specio::Role::Inlinable::_attrs();
      ## use critic
  
      my $attrs = {
          %{$role_attrs},
          from => {
              does     => 'Specio::Constraint::Role::Interface',
              required => 1,
          },
          to => {
              does     => 'Specio::Constraint::Role::Interface',
              required => 1,
              weak_ref => 1,
          },
          _coercion => {
              isa       => 'CodeRef',
              predicate => '_has_coercion',
              init_arg  => 'coercion',
          },
          _optimized_coercion => {
              isa      => 'CodeRef',
              init_arg => undef,
              lazy     => 1,
              builder  => '_build_optimized_coercion',
          },
      };
  
      ## no critic (Subroutines::ProhibitUnusedPrivateSubroutines)
      sub _attrs {
          return $attrs;
      }
  }
  
  sub BUILD {
      my $self = shift;
  
      die
          'A type coercion should have either a coercion or inline_generator parameter, not both'
          if $self->_has_coercion && $self->_has_inline_generator;
  
      die
          'A type coercion must have either a coercion or inline_generator parameter'
          unless $self->_has_coercion || $self->_has_inline_generator;
  
      return;
  }
  
  sub coerce {
      my $self  = shift;
      my $value = shift;
  
      return $self->_optimized_coercion->($value);
  }
  
  sub inline_coercion {
      my $self = shift;
  
      return $self->_inline_generator->( $self, @_ );
  }
  
  sub _build_optimized_coercion {
      my $self = shift;
  
      if ( $self->_has_inline_generator ) {
          return $self->_generated_inline_sub;
      }
      else {
          return $self->_coercion;
      }
  }
  
  sub can_be_inlined {
      my $self = shift;
  
      return $self->_has_inline_generator && $self->from->can_be_inlined;
  }
  
  sub _build_description {
      my $self = shift;
  
      my $from_name
          = defined $self->from->name ? $self->from->name : 'anonymous type';
      my $to_name
          = defined $self->to->name ? $self->to->name : 'anonymous type';
      my $desc = "coercion from $from_name to $to_name";
  
      $desc .= q{ } . $self->declared_at->description;
  
      return $desc;
  }
  
  sub clone_with_new_to {
      my $self   = shift;
      my $new_to = shift;
  
      my $from = $self->from;
  
      local $self->{from} = undef;
      local $self->{to}   = undef;
  
      my $clone = $self->clone;
  
      $clone->{from} = $from;
      $clone->{to}   = $new_to;
  
      return $clone;
  }
  
  __PACKAGE__->_ooify;
  
  1;
  
  # ABSTRACT: A class representing a coercion from one type to another
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Specio::Coercion - A class representing a coercion from one type to another
  
  =head1 VERSION
  
  version 0.44
  
  =head1 SYNOPSIS
  
      my $coercion = $type->coercion_from_type('Int');
  
      my $new_value = $coercion->coerce_value(42);
  
      if ( $coercion->can_be_inlined() ) {
          my $code = $coercion->inline_coercion('$_[0]');
      }
  
  =head1 DESCRIPTION
  
  This class represents a coercion from one type to another. Internally, a
  coercion is a piece of code that takes a value of one type returns a new value
  of a new type. For example, a coercion from c<Num> to C<Int> might round a
  number to its nearest integer and return that integer.
  
  Coercions can be implemented either as a simple subroutine reference or as an
  inline generator subroutine. Using an inline generator is faster but more
  complicated.
  
  =for Pod::Coverage BUILD clone_with_new_to
  
  =head1 API
  
  This class provides the following methods.
  
  =head2 Specio::Coercion->new( ... )
  
  This method creates a new coercion object. It accepts the following named
  parameters:
  
  =over 4
  
  =item * from => $type
  
  The type this coercion is from. The type must be an object which does the
  L<Specio::Constraint::Role::Interface> interface.
  
  This parameter is required.
  
  =item * to => $type
  
  The type this coercion is to. The type must be an object which does the
  L<Specio::Constraint::Role::Interface> interface.
  
  This parameter is required.
  
  =item * coercion => sub { ... }
  
  A subroutine reference implementing the coercion. It will be called as a
  method on the object and passed a single argument, the value to coerce.
  
  It should return the new value.
  
  This parameter is mutually exclusive with C<inline_generator>.
  
  Either this parameter or the C<inline_generator> parameter is required.
  
  You can also pass this option with the key C<using> in the parameter list.
  
  =item * inline_generator => sub { ... }
  
  This should be a subroutine reference which returns a string containing a
  single term. This code should I<not> end in a semicolon. This code should
  implement the coercion.
  
  The generator will be called as a method on the coercion with a single
  argument. That argument is the name of the variable being coerced, something
  like C<'$_[0]'> or C<'$var'>.
  
  This parameter is mutually exclusive with C<coercion>.
  
  Either this parameter or the C<coercion> parameter is required.
  
  You can also pass this option with the key C<inline> in the parameter list.
  
  =item * inline_environment => {}
  
  This should be a hash reference of variable names (with sigils) and values for
  that variable. The values should be I<references> to the values of the
  variables.
  
  This environment will be used when compiling the coercion as part of a
  subroutine. The named variables will be captured as closures in the generated
  subroutine, using L<Eval::Closure>.
  
  It should be very rare to need to set this in the constructor. It's more
  likely that a special coercion subclass would need to provide values that it
  generates internally.
  
  This parameter defaults to an empty hash reference.
  
  =item * declared_at => $declared_at
  
  This parameter must be a L<Specio::DeclaredAt> object.
  
  This parameter is required.
  
  =back
  
  =head2 $coercion->from(), $coercion->to(), $coercion->declared_at()
  
  These methods are all read-only attribute accessors for the corresponding
  attribute.
  
  =head2 $coercion->description
  
  This returns a string describing the coercion. This includes the names of the
  to and from type and where the coercion was declared, so you end up with
  something like C<'coercion from Foo to Bar declared in package My::Lib
  (lib/My/Lib.pm) at line 42'>.
  
  =head2 $coercion->coerce($value)
  
  Given a value of the right "from" type, returns a new value of the "to" type.
  
  This method does not actually check that the types of given or return values.
  
  =head2 $coercion->inline_coercion($var)
  
  Given a variable name like C<'$_[0]'> this returns a string with code for the
  coercion.
  
  Note that this method will die if the coercion does not have an inline
  generator.
  
  =head2 $coercion->can_be_inlined()
  
  This returns true if the coercion has an inline generator I<and> the
  constraint it is from can be inlined. This exists primarily for the benefit of
  the C<inline_coercion_and_check()> method for type constraint object.
  
  =head2 $coercion->inline_environment()
  
  This returns a hash defining the variables that need to be closed over when
  inlining the coercion. The keys are full variable names like C<'$foo'> or
  C<'@bar'>. The values are I<references> to a variable of the matching type.
  
  =head2 $coercion->clone()
  
  Returns a clone of this object.
  
  =head2 $coercion->clone_with_new_to($new_to_type)
  
  This returns a clone of the coercion, replacing the "to" type with a new
  one. This is intended for use when the to type itself is being cloned as part
  of importing that type. We need to make sure the newly cloned coercion has the
  newly cloned type as well.
  
  =head1 ROLES
  
  This class does the L<Specio::Role::Inlinable> role.
  
  =head1 SUPPORT
  
  Bugs may be submitted at L<https://github.com/houseabsolute/Specio/issues>.
  
  I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
  
  =head1 SOURCE
  
  The source code repository for Specio can be found at L<https://github.com/houseabsolute/Specio>.
  
  =head1 AUTHOR
  
  Dave Rolsky <autarch@urth.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is Copyright (c) 2012 - 2019 by Dave Rolsky.
  
  This is free software, licensed under:
  
    The Artistic License 2.0 (GPL Compatible)
  
  The full text of the license can be found in the
  F<LICENSE> file included with this distribution.
  
  =cut
SPECIO_COERCION

    $main::fatpacked{"Specio/Constraint/AnyCan.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'SPECIO_CONSTRAINT_ANYCAN';
  package Specio::Constraint::AnyCan;
  
  use strict;
  use warnings;
  
  our $VERSION = '0.44';
  
  use List::Util 1.33 ();
  use Role::Tiny::With;
  use Scalar::Util ();
  use Specio::Helpers qw( perlstring );
  use Specio::Library::Builtins;
  use Specio::OO;
  
  use Specio::Constraint::Role::CanType;
  with 'Specio::Constraint::Role::CanType';
  
  {
      my $Defined = t('Defined');
      sub _build_parent {$Defined}
  }
  
  {
      my $_inline_generator = sub {
          my $self = shift;
          my $val  = shift;
  
          my $methods = join ', ', map { perlstring($_) } @{ $self->methods };
          return sprintf( <<'EOF', $val, $methods );
  (
      do {
          # We need to assign this since if it's something like $_[0] then
          # inside the all block @_ gets redefined and we can no longer get at
          # the value.
          my $v = %s;
          (
              Scalar::Util::blessed($v) || (
                     defined($v)
                  && !ref($v)
                  && length($v)
                  && $v !~ /\A
                            \s*
                            -?[0-9]+(?:\.[0-9]+)?
                            (?:[Ee][\-+]?[0-9]+)?
                            \s*
                            \z/xs
  
                  # Passing a GLOB from (my $glob = *GLOB) gives us a very weird
                  # scalar. It's not a ref and it has a length but trying to
                  # call ->can on it throws an exception
                  && ref( \$v ) ne 'GLOB'
              )
          ) && List::Util::all { $v->can($_) } %s;
          }
      )
  EOF
      };
  
      sub _build_inline_generator {$_inline_generator}
  }
  
  ## no critic (Subroutines::ProhibitUnusedPrivateSubroutines)
  sub _allow_classes {1}
  ## use critic
  
  __PACKAGE__->_ooify;
  
  1;
  
  # ABSTRACT: A class for constraints which require a class name or object with a set of methods
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Specio::Constraint::AnyCan - A class for constraints which require a class name or object with a set of methods
  
  =head1 VERSION
  
  version 0.44
  
  =head1 SYNOPSIS
  
      my $type = Specio::Constraint::AnyCan->new(...);
      print $_, "\n" for @{ $type->methods };
  
  =head1 DESCRIPTION
  
  This is a specialized type constraint class for types which require a class
  name or object with a defined set of methods.
  
  =head1 API
  
  This class provides all of the same methods as L<Specio::Constraint::Simple>,
  with a few differences:
  
  =head2 Specio::Constraint::AnyCan->new( ... )
  
  The C<parent> parameter is ignored if it passed, as it is always set to the
  C<Defined> type.
  
  The C<inline_generator> and C<constraint> parameters are also ignored. This
  class provides its own default inline generator subroutine reference.
  
  This class overrides the C<message_generator> default if none is provided.
  
  Finally, this class requires an additional parameter, C<methods>. This must be
  an array reference of method names which the constraint requires. You can also
  pass a single string and it will be converted to an array reference
  internally.
  
  =head2 $any_can->methods
  
  Returns an array reference containing the methods this constraint requires.
  
  =head1 ROLES
  
  This class does the L<Specio::Constraint::Role::IsaType>,
  L<Specio::Constraint::Role::Interface>, and L<Specio::Role::Inlinable> roles.
  
  =head1 SUPPORT
  
  Bugs may be submitted at L<https://github.com/houseabsolute/Specio/issues>.
  
  I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
  
  =head1 SOURCE
  
  The source code repository for Specio can be found at L<https://github.com/houseabsolute/Specio>.
  
  =head1 AUTHOR
  
  Dave Rolsky <autarch@urth.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is Copyright (c) 2012 - 2019 by Dave Rolsky.
  
  This is free software, licensed under:
  
    The Artistic License 2.0 (GPL Compatible)
  
  The full text of the license can be found in the
  F<LICENSE> file included with this distribution.
  
  =cut
SPECIO_CONSTRAINT_ANYCAN

    $main::fatpacked{"Specio/Constraint/AnyDoes.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'SPECIO_CONSTRAINT_ANYDOES';
  package Specio::Constraint::AnyDoes;
  
  use strict;
  use warnings;
  
  our $VERSION = '0.44';
  
  use Role::Tiny::With;
  use Scalar::Util ();
  use Specio::Helpers qw( perlstring );
  use Specio::Library::Builtins;
  use Specio::OO;
  
  use Specio::Constraint::Role::DoesType;
  with 'Specio::Constraint::Role::DoesType';
  
  {
      my $Defined = t('Defined');
      sub _build_parent {$Defined}
  }
  
  {
      my $_inline_generator = sub {
          my $self = shift;
          my $val  = shift;
  
          return sprintf( <<'EOF', ($val) x 8, perlstring( $self->role ) );
  (
      (
          Scalar::Util::blessed(%s) || (
                !ref(%s)
              && defined(%s)
              && length(%s)
              && %s !~ /\A
                        \s*
                        -?[0-9]+(?:\.[0-9]+)?
                        (?:[Ee][\-+]?[0-9]+)?
                        \s*
                        \z/xs
              && ref( \%s ) ne 'GLOB'
          )
      )
          && %s->can('does')
          && %s->does(%s)
      )
  EOF
      };
  
      sub _build_inline_generator {$_inline_generator}
  }
  
  ## no critic (Subroutines::ProhibitUnusedPrivateSubroutines)
  sub _allow_classes {1}
  ## use critic
  
  __PACKAGE__->_ooify;
  
  1;
  
  # ABSTRACT: A class for constraints which require a class name or an object that does a specific role
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Specio::Constraint::AnyDoes - A class for constraints which require a class name or an object that does a specific role
  
  =head1 VERSION
  
  version 0.44
  
  =head1 SYNOPSIS
  
      my $type = Specio::Constraint::AnyDoes->new(...);
      print $type->role;
  
  =head1 DESCRIPTION
  
  This is a specialized type constraint class for types which require a class
  name or an object that does a specific role.
  
  =head1 API
  
  This class provides all of the same methods as L<Specio::Constraint::Simple>,
  with a few differences:
  
  =head2 Specio::Constraint::AnyDoes->new( ... )
  
  The C<parent> parameter is ignored if it passed, as it is always set to the
  C<Defined> type.
  
  The C<inline_generator> and C<constraint> parameters are also ignored. This
  class provides its own default inline generator subroutine reference.
  
  This class overrides the C<message_generator> default if none is provided.
  
  Finally, this class requires an additional parameter, C<role>. This must be a
  single role name.
  
  =head2 $any_isa->role
  
  Returns the role name passed to the constructor.
  
  =head1 ROLES
  
  This class does the L<Specio::Constraint::Role::DoesType>,
  L<Specio::Constraint::Role::Interface>, L<Specio::Role::Inlinable>, and
  L<MooseX::Clone> roles.
  
  =head1 SUPPORT
  
  Bugs may be submitted at L<https://github.com/houseabsolute/Specio/issues>.
  
  I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
  
  =head1 SOURCE
  
  The source code repository for Specio can be found at L<https://github.com/houseabsolute/Specio>.
  
  =head1 AUTHOR
  
  Dave Rolsky <autarch@urth.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is Copyright (c) 2012 - 2019 by Dave Rolsky.
  
  This is free software, licensed under:
  
    The Artistic License 2.0 (GPL Compatible)
  
  The full text of the license can be found in the
  F<LICENSE> file included with this distribution.
  
  =cut
SPECIO_CONSTRAINT_ANYDOES

    $main::fatpacked{"Specio/Constraint/AnyIsa.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'SPECIO_CONSTRAINT_ANYISA';
  package Specio::Constraint::AnyIsa;
  
  use strict;
  use warnings;
  
  our $VERSION = '0.44';
  
  use Role::Tiny::With;
  use Scalar::Util ();
  use Specio::Helpers qw( perlstring );
  use Specio::Library::Builtins;
  use Specio::OO;
  
  use Specio::Constraint::Role::IsaType;
  with 'Specio::Constraint::Role::IsaType';
  
  {
      my $Defined = t('Defined');
      sub _build_parent {$Defined}
  }
  
  {
      my $_inline_generator = sub {
          my $self = shift;
          my $val  = shift;
  
          return sprintf( <<'EOF', ($val) x 7, perlstring( $self->class ) );
  (
      (
          Scalar::Util::blessed(%s)
              || (
                 defined(%s)
              && !ref(%s)
              && length(%s)
              && %s !~ /\A
                        \s*
                        -?[0-9]+(?:\.[0-9]+)?
                        (?:[Ee][\-+]?[0-9]+)?
                        \s*
                        \z/xs
  
              # Passing a GLOB from (my $glob = *GLOB) gives us a very weird
              # scalar. It's not a ref and it has a length but trying to
              # call ->can on it throws an exception
              && ref( \%s ) ne 'GLOB'
              )
      )
          && %s->isa(%s)
      )
  EOF
      };
  
      sub _build_inline_generator {$_inline_generator}
  }
  
  ## no critic (Subroutines::ProhibitUnusedPrivateSubroutines)
  sub _allow_classes {1}
  ## use critic
  
  __PACKAGE__->_ooify;
  
  1;
  
  # ABSTRACT: A class for constraints which require a class name or an object that inherit from a specific class
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Specio::Constraint::AnyIsa - A class for constraints which require a class name or an object that inherit from a specific class
  
  =head1 VERSION
  
  version 0.44
  
  =head1 SYNOPSIS
  
      my $type = Specio::Constraint::AnyIsa->new(...);
      print $type->class;
  
  =head1 DESCRIPTION
  
  This is a specialized type constraint class for types which require a class
  name or an object that inherit from a specific class.
  
  =head1 API
  
  This class provides all of the same methods as L<Specio::Constraint::Simple>,
  with a few differences:
  
  =head2 Specio::Constraint::AnyIsa->new( ... )
  
  The C<parent> parameter is ignored if it passed, as it is always set to the
  C<Defined> type.
  
  The C<inline_generator> and C<constraint> parameters are also ignored. This
  class provides its own default inline generator subroutine reference.
  
  This class overrides the C<message_generator> default if none is provided.
  
  Finally, this class requires an additional parameter, C<class>. This must be a
  single class name.
  
  =head2 $any_isa->class
  
  Returns the class name passed to the constructor.
  
  =head1 ROLES
  
  This class does the L<Specio::Constraint::Role::IsaType>,
  L<Specio::Constraint::Role::Interface>, and L<Specio::Role::Inlinable> roles.
  
  =head1 SUPPORT
  
  Bugs may be submitted at L<https://github.com/houseabsolute/Specio/issues>.
  
  I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
  
  =head1 SOURCE
  
  The source code repository for Specio can be found at L<https://github.com/houseabsolute/Specio>.
  
  =head1 AUTHOR
  
  Dave Rolsky <autarch@urth.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is Copyright (c) 2012 - 2019 by Dave Rolsky.
  
  This is free software, licensed under:
  
    The Artistic License 2.0 (GPL Compatible)
  
  The full text of the license can be found in the
  F<LICENSE> file included with this distribution.
  
  =cut
SPECIO_CONSTRAINT_ANYISA

    $main::fatpacked{"Specio/Constraint/Enum.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'SPECIO_CONSTRAINT_ENUM';
  package Specio::Constraint::Enum;
  
  use strict;
  use warnings;
  
  our $VERSION = '0.44';
  
  use Role::Tiny::With;
  use Scalar::Util qw( refaddr );
  use Specio::Library::Builtins;
  use Specio::OO;
  use Storable qw( dclone );
  
  use Specio::Constraint::Role::Interface;
  with 'Specio::Constraint::Role::Interface';
  
  {
      ## no critic (Subroutines::ProtectPrivateSubs)
      my $attrs = dclone( Specio::Constraint::Role::Interface::_attrs() );
      ## use critic
  
      for my $name (qw( parent _inline_generator )) {
          $attrs->{$name}{init_arg} = undef;
          $attrs->{$name}{builder}
              = $name =~ /^_/ ? '_build' . $name : '_build_' . $name;
      }
  
      $attrs->{values} = {
          isa      => 'ArrayRef',
          required => 1,
      };
  
      ## no critic (Subroutines::ProhibitUnusedPrivateSubroutines)
      sub _attrs {
          return $attrs;
      }
  }
  
  {
      my $Str = t('Str');
      sub _build_parent {$Str}
  }
  
  {
      my $_inline_generator = sub {
          my $self = shift;
          my $val  = shift;
  
          return sprintf( <<'EOF', ($val) x 2, $self->_env_var_name, $val );
  ( !ref( %s ) && defined( %s ) && $%s{ %s } )
  EOF
      };
  
      sub _build_inline_generator {$_inline_generator}
  }
  
  sub _build_inline_environment {
      my $self = shift;
  
      my %values = map { $_ => 1 } @{ $self->values };
  
      return { '%' . $self->_env_var_name => \%values };
  }
  
  sub _env_var_name {
      my $self = shift;
  
      return '_Specio_Constraint_Enum_' . refaddr($self);
  }
  
  __PACKAGE__->_ooify;
  
  1;
  
  # ABSTRACT: A class for constraints which require a string matching one of a set of values
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Specio::Constraint::Enum - A class for constraints which require a string matching one of a set of values
  
  =head1 VERSION
  
  version 0.44
  
  =head1 SYNOPSIS
  
      my $type = Specio::Constraint::Enum->new(...);
      print $_, "\n" for @{ $type->values };
  
  =head1 DESCRIPTION
  
  This is a specialized type constraint class for types which require a string
  that matches one of a list of values.
  
  =head1 API
  
  This class provides all of the same methods as L<Specio::Constraint::Simple>,
  with a few differences:
  
  =head2 Specio::Constraint::Enum->new( ... )
  
  The C<parent> parameter is ignored if it passed, as it is always set to the
  C<Str> type.
  
  The C<inline_generator> and C<constraint> parameters are also ignored. This
  class provides its own default inline generator subroutine reference.
  
  Finally, this class requires an additional parameter, C<values>. This must be a
  an arrayref of valid strings for the type.
  
  =head2 $enum->values
  
  Returns an array reference of valid values for the type.
  
  =head1 ROLES
  
  This class does the L<Specio::Constraint::Role::Interface> and
  L<Specio::Role::Inlinable> roles.
  
  =head1 SUPPORT
  
  Bugs may be submitted at L<https://github.com/houseabsolute/Specio/issues>.
  
  I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
  
  =head1 SOURCE
  
  The source code repository for Specio can be found at L<https://github.com/houseabsolute/Specio>.
  
  =head1 AUTHOR
  
  Dave Rolsky <autarch@urth.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is Copyright (c) 2012 - 2019 by Dave Rolsky.
  
  This is free software, licensed under:
  
    The Artistic License 2.0 (GPL Compatible)
  
  The full text of the license can be found in the
  F<LICENSE> file included with this distribution.
  
  =cut
SPECIO_CONSTRAINT_ENUM

    $main::fatpacked{"Specio/Constraint/Intersection.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'SPECIO_CONSTRAINT_INTERSECTION';
  package Specio::Constraint::Intersection;
  
  use strict;
  use warnings;
  
  our $VERSION = '0.44';
  
  use List::Util qw( all );
  use Role::Tiny::With;
  use Specio::OO;
  use Storable qw( dclone );
  
  use Specio::Constraint::Role::Interface;
  with 'Specio::Constraint::Role::Interface';
  
  {
      ## no critic (Subroutines::ProtectPrivateSubs)
      my $attrs = dclone( Specio::Constraint::Role::Interface::_attrs() );
      ## use critic
  
      for my $name (qw( _constraint _inline_generator )) {
          delete $attrs->{$name}{predicate};
          $attrs->{$name}{init_arg} = undef;
          $attrs->{$name}{lazy}     = 1;
          $attrs->{$name}{builder}
              = $name =~ /^_/ ? '_build' . $name : '_build_' . $name;
      }
  
      delete $attrs->{parent};
  
      delete $attrs->{name}{predicate};
      $attrs->{name}{lazy}    = 1;
      $attrs->{name}{builder} = '_build_name';
  
      $attrs->{of} = {
          isa      => 'ArrayRef',
          required => 1,
      };
  
      ## no critic (Subroutines::ProhibitUnusedPrivateSubroutines)
      sub _attrs {
          return $attrs;
      }
  }
  
  sub parent {undef}
  
  ## no critic (Subroutines::ProhibitUnusedPrivateSubroutines)
  sub _has_parent {0}
  
  sub _has_name {
      my $self = shift;
      return defined $self->name;
  }
  
  sub _build_name {
      my $self = shift;
  
      return unless all { $_->_has_name } @{ $self->of };
      return join q{ & }, map { $_->name } @{ $self->of };
  }
  
  ## no critic (Subroutines::ProhibitUnusedPrivateSubroutines)
  sub _has_constraint {
      my $self = shift;
  
      return !$self->_has_inline_generator;
  }
  ## use critic
  
  sub _build_constraint {
      return $_[0]->_optimized_constraint;
  }
  
  sub _build_optimized_constraint {
      my $self = shift;
  
      ## no critic (Subroutines::ProtectPrivateSubs)
      my @c = map { $_->_optimized_constraint } @{ $self->of };
      return sub {
          return all { $_->( $_[0] ) } @c;
      };
  }
  
  sub _has_inline_generator {
      my $self = shift;
  
      ## no critic (Subroutines::ProtectPrivateSubs)
      return all { $_->_has_inline_generator } @{ $self->of };
  }
  
  sub _build_inline_generator {
      my $self = shift;
  
      return sub {
          return '(' . (
              join q{ && },
              map { sprintf( '( %s )', $_->_inline_generator->( $_, $_[1] ) ) }
                  @{ $self->of }
          ) . ')';
      }
  }
  
  sub _build_inline_environment {
      my $self = shift;
  
      my %env;
      for my $type ( @{ $self->of } ) {
          %env = (
              %env,
              %{ $type->inline_environment },
          );
      }
  
      return \%env;
  }
  
  __PACKAGE__->_ooify;
  
  1;
  
  # ABSTRACT: A class for intersection constraints
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Specio::Constraint::Intersection - A class for intersection constraints
  
  =head1 VERSION
  
  version 0.44
  
  =head1 SYNOPSIS
  
      my $type = Specio::Constraint::Untion->new(...);
  
  =head1 DESCRIPTION
  
  This is a specialized type constraint class for intersections, which will
  allow a value which matches each one of several distinct types.
  
  =for Pod::Coverage parent
  
  =head1 API
  
  This class provides all of the same methods as L<Specio::Constraint::Simple>,
  with a few differences:
  
  =head2 Specio::Constraint::Intersection->new( ... )
  
  The C<parent> parameter is ignored if it passed, as it is always C<undef>
  
  The C<inline_generator> and C<constraint> parameters are also ignored. This
  class provides its own default inline generator subroutine reference.
  
  Finally, this class requires an additional parameter, C<of>. This must be an
  arrayref of type objects.
  
  =head2 $union->of
  
  Returns an array reference of the individual types which makes up this
  intersection.
  
  =head1 ROLES
  
  This class does the L<Specio::Constraint::Role::Interface> and
  L<Specio::Role::Inlinable> roles.
  
  =head1 SUPPORT
  
  Bugs may be submitted at L<https://github.com/houseabsolute/Specio/issues>.
  
  I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
  
  =head1 SOURCE
  
  The source code repository for Specio can be found at L<https://github.com/houseabsolute/Specio>.
  
  =head1 AUTHOR
  
  Dave Rolsky <autarch@urth.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is Copyright (c) 2012 - 2019 by Dave Rolsky.
  
  This is free software, licensed under:
  
    The Artistic License 2.0 (GPL Compatible)
  
  The full text of the license can be found in the
  F<LICENSE> file included with this distribution.
  
  =cut
SPECIO_CONSTRAINT_INTERSECTION

    $main::fatpacked{"Specio/Constraint/ObjectCan.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'SPECIO_CONSTRAINT_OBJECTCAN';
  package Specio::Constraint::ObjectCan;
  
  use strict;
  use warnings;
  
  our $VERSION = '0.44';
  
  use List::Util 1.33 ();
  use Role::Tiny::With;
  use Scalar::Util ();
  use Specio::Helpers qw( perlstring );
  use Specio::Library::Builtins;
  use Specio::OO;
  
  use Specio::Constraint::Role::CanType;
  with 'Specio::Constraint::Role::CanType';
  
  {
      my $Object = t('Object');
      sub _build_parent {$Object}
  }
  
  {
      my $_inline_generator = sub {
          my $self = shift;
          my $val  = shift;
  
          my $methods = join ', ', map { perlstring($_) } @{ $self->methods };
          return sprintf( <<'EOF', $val, $methods );
  (
      do {
          my $v = %s;
          Scalar::Util::blessed($v)
              && List::Util::all { $v->can($_) } %s;
          }
      )
  EOF
      };
  
      sub _build_inline_generator {$_inline_generator}
  }
  
  ## no critic (Subroutines::ProhibitUnusedPrivateSubroutines)
  sub _allow_classes {0}
  ## use critic
  
  __PACKAGE__->_ooify;
  
  1;
  
  # ABSTRACT: A class for constraints which require an object with a set of methods
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Specio::Constraint::ObjectCan - A class for constraints which require an object with a set of methods
  
  =head1 VERSION
  
  version 0.44
  
  =head1 SYNOPSIS
  
      my $type = Specio::Constraint::ObjectCan->new(...);
      print $_, "\n" for @{ $type->methods };
  
  =head1 DESCRIPTION
  
  This is a specialized type constraint class for types which require an object
  with a defined set of methods.
  
  =head1 API
  
  This class provides all of the same methods as L<Specio::Constraint::Simple>,
  with a few differences:
  
  =head2 Specio::Constraint::ObjectCan->new( ... )
  
  The C<parent> parameter is ignored if it passed, as it is always set to the
  C<Object> type.
  
  The C<inline_generator> and C<constraint> parameters are also ignored. This
  class provides its own default inline generator subroutine reference.
  
  This class overrides the C<message_generator> default if none is provided.
  
  Finally, this class requires an additional parameter, C<methods>. This must be
  an array reference of method names which the constraint requires. You can also
  pass a single string and it will be converted to an array reference
  internally.
  
  =head2 $object_can->methods
  
  Returns an array reference containing the methods this constraint requires.
  
  =head1 ROLES
  
  This class does the L<Specio::Constraint::Role::CanType>,
  L<Specio::Constraint::Role::Interface>, and L<Specio::Role::Inlinable> roles.
  
  =head1 SUPPORT
  
  Bugs may be submitted at L<https://github.com/houseabsolute/Specio/issues>.
  
  I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
  
  =head1 SOURCE
  
  The source code repository for Specio can be found at L<https://github.com/houseabsolute/Specio>.
  
  =head1 AUTHOR
  
  Dave Rolsky <autarch@urth.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is Copyright (c) 2012 - 2019 by Dave Rolsky.
  
  This is free software, licensed under:
  
    The Artistic License 2.0 (GPL Compatible)
  
  The full text of the license can be found in the
  F<LICENSE> file included with this distribution.
  
  =cut
SPECIO_CONSTRAINT_OBJECTCAN

    $main::fatpacked{"Specio/Constraint/ObjectDoes.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'SPECIO_CONSTRAINT_OBJECTDOES';
  package Specio::Constraint::ObjectDoes;
  
  use strict;
  use warnings;
  
  our $VERSION = '0.44';
  
  use Role::Tiny::With;
  use Scalar::Util ();
  use Specio::Helpers qw( perlstring );
  use Specio::Library::Builtins;
  use Specio::OO;
  
  use Specio::Constraint::Role::DoesType;
  with 'Specio::Constraint::Role::DoesType';
  
  {
      my $Object = t('Object');
      sub _build_parent {$Object}
  }
  
  {
      my $_inline_generator = sub {
          my $self = shift;
          my $val  = shift;
  
          return sprintf( <<'EOF', ($val) x 3, perlstring( $self->role ) );
  ( Scalar::Util::blessed(%s) && %s->can('does') && %s->does(%s) )
  EOF
      };
  
      sub _build_inline_generator {$_inline_generator}
  }
  
  ## no critic (Subroutines::ProhibitUnusedPrivateSubroutines)
  sub _allow_classes {0}
  ## use critic
  
  __PACKAGE__->_ooify;
  
  1;
  
  # ABSTRACT: A class for constraints which require an object that does a specific role
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Specio::Constraint::ObjectDoes - A class for constraints which require an object that does a specific role
  
  =head1 VERSION
  
  version 0.44
  
  =head1 SYNOPSIS
  
      my $type = Specio::Constraint::ObjectDoes->new(...);
      print $type->role;
  
  =head1 DESCRIPTION
  
  This is a specialized type constraint class for types which require an object
  that does a specific role.
  
  =head1 API
  
  This class provides all of the same methods as L<Specio::Constraint::Simple>,
  with a few differences:
  
  =head2 Specio::Constraint::ObjectDoes->new( ... )
  
  The C<parent> parameter is ignored if it passed, as it is always set to the
  C<Defined> type.
  
  The C<inline_generator> and C<constraint> parameters are also ignored. This
  class provides its own default inline generator subroutine reference.
  
  This class overrides the C<message_generator> default if none is provided.
  
  Finally, this class requires an additional parameter, C<role>. This must be a
  single role name.
  
  =head2 $object_isa->role
  
  Returns the role name passed to the constructor.
  
  =head1 ROLES
  
  This class does the L<Specio::Constraint::Role::DoesType>,
  L<Specio::Constraint::Role::Interface>, and L<Specio::Role::Inlinable> roles.
  
  =head1 SUPPORT
  
  Bugs may be submitted at L<https://github.com/houseabsolute/Specio/issues>.
  
  I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
  
  =head1 SOURCE
  
  The source code repository for Specio can be found at L<https://github.com/houseabsolute/Specio>.
  
  =head1 AUTHOR
  
  Dave Rolsky <autarch@urth.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is Copyright (c) 2012 - 2019 by Dave Rolsky.
  
  This is free software, licensed under:
  
    The Artistic License 2.0 (GPL Compatible)
  
  The full text of the license can be found in the
  F<LICENSE> file included with this distribution.
  
  =cut
SPECIO_CONSTRAINT_OBJECTDOES

    $main::fatpacked{"Specio/Constraint/ObjectIsa.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'SPECIO_CONSTRAINT_OBJECTISA';
  package Specio::Constraint::ObjectIsa;
  
  use strict;
  use warnings;
  
  our $VERSION = '0.44';
  
  use Role::Tiny::With;
  use Scalar::Util ();
  use Specio::Helpers qw( perlstring );
  use Specio::Library::Builtins;
  use Specio::OO;
  
  use Specio::Constraint::Role::IsaType;
  with 'Specio::Constraint::Role::IsaType';
  
  {
      my $Object = t('Object');
      sub _build_parent {$Object}
  }
  
  {
      my $_inline_generator = sub {
          my $self = shift;
          my $val  = shift;
  
          return sprintf( <<'EOF', $val, $val, perlstring( $self->class ) );
  ( Scalar::Util::blessed( %s ) && %s->isa(%s) )
  EOF
      };
  
      sub _build_inline_generator {$_inline_generator}
  }
  
  ## no critic (Subroutines::ProhibitUnusedPrivateSubroutines)
  sub _allow_classes {0}
  ## use critic
  
  __PACKAGE__->_ooify;
  
  1;
  
  # ABSTRACT: A class for constraints which require an object that inherits from a specific class
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Specio::Constraint::ObjectIsa - A class for constraints which require an object that inherits from a specific class
  
  =head1 VERSION
  
  version 0.44
  
  =head1 SYNOPSIS
  
      my $type = Specio::Constraint::ObjectIsa->new(...);
      print $type->class;
  
  =head1 DESCRIPTION
  
  This is a specialized type constraint class for types which require an object
  that inherits from a specific class.
  
  =head1 API
  
  This class provides all of the same methods as L<Specio::Constraint::Simple>,
  with a few differences:
  
  =head2 Specio::Constraint::ObjectIsa->new( ... )
  
  The C<parent> parameter is ignored if it passed, as it is always set to the
  C<Defined> type.
  
  The C<inline_generator> and C<constraint> parameters are also ignored. This
  class provides its own default inline generator subroutine reference.
  
  This class overrides the C<message_generator> default if none is provided.
  
  Finally, this class requires an additional parameter, C<class>. This must be a
  single class name.
  
  =head2 $object_isa->class
  
  Returns the class name passed to the constructor.
  
  =head1 ROLES
  
  This class does the L<Specio::Constraint::Role::IsaType>,
  L<Specio::Constraint::Role::Interface>, and L<Specio::Role::Inlinable> roles.
  
  =head1 SUPPORT
  
  Bugs may be submitted at L<https://github.com/houseabsolute/Specio/issues>.
  
  I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
  
  =head1 SOURCE
  
  The source code repository for Specio can be found at L<https://github.com/houseabsolute/Specio>.
  
  =head1 AUTHOR
  
  Dave Rolsky <autarch@urth.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is Copyright (c) 2012 - 2019 by Dave Rolsky.
  
  This is free software, licensed under:
  
    The Artistic License 2.0 (GPL Compatible)
  
  The full text of the license can be found in the
  F<LICENSE> file included with this distribution.
  
  =cut
SPECIO_CONSTRAINT_OBJECTISA

    $main::fatpacked{"Specio/Constraint/Parameterizable.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'SPECIO_CONSTRAINT_PARAMETERIZABLE';
  package Specio::Constraint::Parameterizable;
  
  use strict;
  use warnings;
  
  our $VERSION = '0.44';
  
  use Carp qw( confess );
  use Role::Tiny::With;
  use Specio::Constraint::Parameterized;
  use Specio::DeclaredAt;
  use Specio::OO;
  use Specio::TypeChecks qw( does_role isa_class );
  
  use Specio::Constraint::Role::Interface;
  with 'Specio::Constraint::Role::Interface';
  
  {
      ## no critic (Subroutines::ProtectPrivateSubs)
      my $role_attrs = Specio::Constraint::Role::Interface::_attrs();
      ## use critic
  
      my $attrs = {
          %{$role_attrs},
          _parameterized_constraint_generator => {
              isa       => 'CodeRef',
              init_arg  => 'parameterized_constraint_generator',
              predicate => '_has_parameterized_constraint_generator',
          },
          _parameterized_inline_generator => {
              isa       => 'CodeRef',
              init_arg  => 'parameterized_inline_generator',
              predicate => '_has_parameterized_inline_generator',
          },
      };
  
      ## no critic (Subroutines::ProhibitUnusedPrivateSubroutines)
      sub _attrs {
          return $attrs;
      }
  }
  
  sub BUILD {
      my $self = shift;
  
      if ( $self->_has_constraint ) {
          die
              'A parameterizable constraint with a constraint parameter must also have a parameterized_constraint_generator'
              unless $self->_has_parameterized_constraint_generator;
      }
  
      if ( $self->_has_inline_generator ) {
          die
              'A parameterizable constraint with an inline_generator parameter must also have a parameterized_inline_generator'
              unless $self->_has_parameterized_inline_generator;
      }
  
      return;
  }
  
  sub parameterize {
      my $self = shift;
      my %args = @_;
  
      my ( $parameter, $declared_at ) = @args{qw( of declared_at )};
      does_role( $parameter, 'Specio::Constraint::Role::Interface' )
          or confess
          'The "of" parameter passed to ->parameterize must be an object which does the Specio::Constraint::Role::Interface role';
  
      if ($declared_at) {
          isa_class( $declared_at, 'Specio::DeclaredAt' )
              or confess
              'The "declared_at" parameter passed to ->parameterize must be a Specio::DeclaredAt object';
      }
  
      $declared_at = Specio::DeclaredAt->new_from_caller(1)
          unless defined $declared_at;
  
      my %p = (
          parent      => $self,
          parameter   => $parameter,
          declared_at => $declared_at,
      );
  
      if ( $self->_has_parameterized_constraint_generator ) {
          $p{constraint}
              = $self->_parameterized_constraint_generator->($parameter);
      }
      else {
          confess
              'The "of" parameter passed to ->parameterize must be an inlinable constraint if the parameterizable type has an inline_generator'
              unless $parameter->can_be_inlined;
  
          my $ig = $self->_parameterized_inline_generator;
          $p{inline_generator} = sub { $ig->( shift, $parameter, @_ ) };
      }
  
      return Specio::Constraint::Parameterized->new(%p);
  }
  
  __PACKAGE__->_ooify;
  
  1;
  
  # ABSTRACT: A class which represents parameterizable constraints
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Specio::Constraint::Parameterizable - A class which represents parameterizable constraints
  
  =head1 VERSION
  
  version 0.44
  
  =head1 SYNOPSIS
  
      my $arrayref = t('ArrayRef');
  
      my $arrayref_of_int = $arrayref->parameterize( of => t('Int') );
  
  =head1 DESCRIPTION
  
  This class implements the API for parameterizable types like C<ArrayRef> and
  C<Maybe>.
  
  =for Pod::Coverage BUILD
  
  =head1 API
  
  This class implements the same API as L<Specio::Constraint::Simple>, with a few
  additions.
  
  =head2 Specio::Constraint::Parameterizable->new(...)
  
  This class's constructor accepts two additional parameters:
  
  =over 4
  
  =item * parameterized_constraint_generator
  
  This is a subroutine that generates a new constraint subroutine when the type
  is parameterized.
  
  It will be called as a method on the type and will be passed a single
  argument, the type object for the type parameter.
  
  This parameter is mutually exclusive with the
  C<parameterized_inline_generator> parameter.
  
  =item * parameterized_inline_generator
  
  This is a subroutine that generates a new inline generator subroutine when the
  type is parameterized.
  
  It will be called as a method on the L<Specio::Constraint::Parameterized>
  object when that object needs to generate an inline constraint. It will
  receive the type parameter as the first argument and the variable name as a
  string as the second.
  
  This probably seems fairly confusing, so looking at the examples in the
  L<Specio::Library::Builtins> code may be helpful.
  
  This parameter is mutually exclusive with the
  C<parameterized_constraint_generator> parameter.
  
  =back
  
  =head2 $type->parameterize(...)
  
  This method takes two arguments. The C<of> argument should be an object which
  does the L<Specio::Constraint::Role::Interface> role, and is required.
  
  The other argument, C<declared_at>, is optional. If it is not given, then a
  new L<Specio::DeclaredAt> object is creating using a call stack depth of 1.
  
  This method returns a new L<Specio::Constraint::Parameterized> object.
  
  =head1 SUPPORT
  
  Bugs may be submitted at L<https://github.com/houseabsolute/Specio/issues>.
  
  I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
  
  =head1 SOURCE
  
  The source code repository for Specio can be found at L<https://github.com/houseabsolute/Specio>.
  
  =head1 AUTHOR
  
  Dave Rolsky <autarch@urth.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is Copyright (c) 2012 - 2019 by Dave Rolsky.
  
  This is free software, licensed under:
  
    The Artistic License 2.0 (GPL Compatible)
  
  The full text of the license can be found in the
  F<LICENSE> file included with this distribution.
  
  =cut
SPECIO_CONSTRAINT_PARAMETERIZABLE

    $main::fatpacked{"Specio/Constraint/Parameterized.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'SPECIO_CONSTRAINT_PARAMETERIZED';
  package Specio::Constraint::Parameterized;
  
  use strict;
  use warnings;
  
  our $VERSION = '0.44';
  
  use Role::Tiny::With;
  use Specio::OO;
  use Storable qw( dclone );
  
  use Specio::Constraint::Role::Interface;
  with 'Specio::Constraint::Role::Interface';
  
  {
      ## no critic (Subroutines::ProtectPrivateSubs)
      my $attrs = dclone( Specio::Constraint::Role::Interface::_attrs() );
      ## use critic
  
      $attrs->{parent}{isa}      = 'Specio::Constraint::Parameterizable';
      $attrs->{parent}{required} = 1;
  
      delete $attrs->{name}{predicate};
      $attrs->{name}{lazy}    = 1;
      $attrs->{name}{builder} = '_build_name';
  
      $attrs->{parameter} = {
          does     => 'Specio::Constraint::Role::Interface',
          required => 1,
      };
  
      ## no critic (Subroutines::ProhibitUnusedPrivateSubroutines)
      sub _attrs {
          return $attrs;
      }
  }
  
  sub _has_name {
      my $self = shift;
      return defined $self->name;
  }
  
  sub _build_name {
      my $self = shift;
  
      ## no critic (Subroutines::ProtectPrivateSubs)
      return unless $self->parent->_has_name && $self->parameter->_has_name;
      return $self->parent->name . '[' . $self->parameter->name . ']';
  }
  
  sub can_be_inlined {
      my $self = shift;
  
      return $self->_has_inline_generator
          && $self->parameter->can_be_inlined;
  }
  
  # Moose compatibility methods - these exist as a temporary hack to make Specio
  # work with Moose.
  
  sub type_parameter {
      shift->parameter;
  }
  
  __PACKAGE__->_ooify;
  
  1;
  
  # ABSTRACT: A class which represents parameterized constraints
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Specio::Constraint::Parameterized - A class which represents parameterized constraints
  
  =head1 VERSION
  
  version 0.44
  
  =head1 SYNOPSIS
  
      my $arrayref = t('ArrayRef');
  
      my $arrayref_of_int = $arrayref->parameterize( of => t('Int') );
  
      my $parent = $arrayref_of_int->parent; # returns ArrayRef
      my $parameter = $arrayref_of_int->parameter; # returns Int
  
  =head1 DESCRIPTION
  
  This class implements the API for parameterized types.
  
  =for Pod::Coverage can_be_inlined type_parameter
  
  =head1 API
  
  This class implements the same API as L<Specio::Constraint::Simple>, with a few
  additions.
  
  =head2 Specio::Constraint::Parameterized->new(...)
  
  This class's constructor accepts two additional parameters:
  
  =over 4
  
  =item * parent
  
  This should be the L<Specio::Constraint::Parameterizable> object from which this
  object was created.
  
  This parameter is required.
  
  =item * parameter
  
  This is the type parameter for the parameterized type. This must be an object
  which does the L<Specio::Constraint::Role::Interface> role.
  
  This parameter is required.
  
  =back
  
  =head2 $type->parameter
  
  Returns the type that was passed to the constructor.
  
  =head1 SUPPORT
  
  Bugs may be submitted at L<https://github.com/houseabsolute/Specio/issues>.
  
  I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
  
  =head1 SOURCE
  
  The source code repository for Specio can be found at L<https://github.com/houseabsolute/Specio>.
  
  =head1 AUTHOR
  
  Dave Rolsky <autarch@urth.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is Copyright (c) 2012 - 2019 by Dave Rolsky.
  
  This is free software, licensed under:
  
    The Artistic License 2.0 (GPL Compatible)
  
  The full text of the license can be found in the
  F<LICENSE> file included with this distribution.
  
  =cut
SPECIO_CONSTRAINT_PARAMETERIZED

    $main::fatpacked{"Specio/Constraint/Role/CanType.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'SPECIO_CONSTRAINT_ROLE_CANTYPE';
  package Specio::Constraint::Role::CanType;
  
  use strict;
  use warnings;
  
  our $VERSION = '0.44';
  
  use Scalar::Util qw( blessed );
  use Specio::PartialDump qw( partial_dump );
  use Storable qw( dclone );
  
  use Role::Tiny;
  
  use Specio::Constraint::Role::Interface;
  with 'Specio::Constraint::Role::Interface';
  
  {
      ## no critic (Subroutines::ProtectPrivateSubs)
      my $attrs = dclone( Specio::Constraint::Role::Interface::_attrs() );
      ## use critic
  
      for my $name (qw( parent _inline_generator )) {
          $attrs->{$name}{init_arg} = undef;
          $attrs->{$name}{builder}
              = $name =~ /^_/ ? '_build' . $name : '_build_' . $name;
      }
  
      $attrs->{methods} = {
          isa      => 'ArrayRef',
          required => 1,
      };
  
      ## no critic (Subroutines::ProhibitUnusedPrivateSubroutines)
      sub _attrs {
          return $attrs;
      }
  }
  
  ## no critic (Subroutines::ProhibitUnusedPrivateSubroutines)
  sub _wrap_message_generator {
      my $self      = shift;
      my $generator = shift;
  
      my $type          = ( split /::/, blessed $self)[-1];
      my @methods       = @{ $self->methods };
      my $all_word_list = _word_list(@methods);
      my $allow_classes = $self->_allow_classes;
  
      unless ( defined $generator ) {
          $generator = sub {
              shift;
              my $value = shift;
  
              return
                  "An undef will never pass an $type check (wants $all_word_list)"
                  unless defined $value;
  
              my $class = blessed $value;
              if ( !defined $class ) {
  
                  # If we got here we know that blessed returned undef, so if
                  # it's a ref then it must not be blessed.
                  if ( ref $value ) {
                      my $dump = partial_dump($value);
                      return
                          "An unblessed reference ($dump) will never pass an $type check (wants $all_word_list)";
                  }
  
                  # If it's defined and not an unblessed ref it must be a
                  # string. If we allow classes (vs just objects) then it might
                  # be a valid class name.  But an empty string is never a valid
                  # class name. We cannot call q{}->can.
                  return
                      "An empty string will never pass an $type check (wants $all_word_list)"
                      unless length $value;
  
                  if ( ref \$value eq 'GLOB' ) {
                      return
                          "A glob will never pass an $type check (wants $all_word_list)";
                  }
  
                  if (
                      $value =~ /\A
                          \s*
                          -?[0-9]+(?:\.[0-9]+)?
                          (?:[Ee][\-+]?[0-9]+)?
                          \s*
                          \z/xs
                  ) {
                      return
                          "A number ($value) will never pass an $type check (wants $all_word_list)";
                  }
  
                  $class = $value if $allow_classes;
  
                  # At this point we either have undef or a non-empty string in
                  # $class.
                  unless ( defined $class ) {
                      my $dump = partial_dump($value);
                      return
                          "A plain scalar ($dump) will never pass an $type check (wants $all_word_list)";
                  }
              }
  
              my @missing = grep { !$value->can($_) } @methods;
  
              my $noun = @missing == 1 ? 'method' : 'methods';
              my $list = _word_list( map {qq['$_']} @missing );
  
              return "The $class class is missing the $list $noun";
          };
      }
  
      return sub { $generator->( undef, @_ ) };
  }
  ## use critic
  
  sub _word_list {
      my @items = sort { $a cmp $b } @_;
  
      return $items[0] if @items == 1;
      return join ' and ', @items if @items == 2;
  
      my $final = pop @items;
      my $list  = join ', ', @items;
      $list .= ', and ' . $final;
  
      return $list;
  }
  
  1;
  
  # ABSTRACT: Provides a common implementation for Specio::Constraint::AnyCan and Specio::Constraint::ObjectCan
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Specio::Constraint::Role::CanType - Provides a common implementation for Specio::Constraint::AnyCan and Specio::Constraint::ObjectCan
  
  =head1 VERSION
  
  version 0.44
  
  =head1 DESCRIPTION
  
  See L<Specio::Constraint::AnyCan> and L<Specio::Constraint::ObjectCan> for details.
  
  =head1 SUPPORT
  
  Bugs may be submitted at L<https://github.com/houseabsolute/Specio/issues>.
  
  I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
  
  =head1 SOURCE
  
  The source code repository for Specio can be found at L<https://github.com/houseabsolute/Specio>.
  
  =head1 AUTHOR
  
  Dave Rolsky <autarch@urth.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is Copyright (c) 2012 - 2019 by Dave Rolsky.
  
  This is free software, licensed under:
  
    The Artistic License 2.0 (GPL Compatible)
  
  The full text of the license can be found in the
  F<LICENSE> file included with this distribution.
  
  =cut
SPECIO_CONSTRAINT_ROLE_CANTYPE

    $main::fatpacked{"Specio/Constraint/Role/DoesType.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'SPECIO_CONSTRAINT_ROLE_DOESTYPE';
  package Specio::Constraint::Role::DoesType;
  
  use strict;
  use warnings;
  
  our $VERSION = '0.44';
  
  use Role::Tiny;
  use Scalar::Util qw( blessed );
  use Specio::PartialDump qw( partial_dump );
  use Storable qw( dclone );
  
  use Specio::Constraint::Role::Interface;
  with 'Specio::Constraint::Role::Interface';
  
  {
      ## no critic (Subroutines::ProtectPrivateSubs)
      my $attrs = dclone( Specio::Constraint::Role::Interface::_attrs() );
      ## use critic
  
      for my $name (qw( parent _inline_generator )) {
          $attrs->{$name}{init_arg} = undef;
          $attrs->{$name}{builder}
              = $name =~ /^_/ ? '_build' . $name : '_build_' . $name;
      }
  
      $attrs->{role} = {
          isa      => 'Str',
          required => 1,
      };
  
      ## no critic (Subroutines::ProhibitUnusedPrivateSubroutines)
      sub _attrs {
          return $attrs;
      }
  }
  
  ## no critic (Subroutines::ProhibitUnusedPrivateSubroutines)
  sub _wrap_message_generator {
      my $self      = shift;
      my $generator = shift;
  
      my $type          = ( split /::/, blessed $self)[-1];
      my $role          = $self->role;
      my $allow_classes = $self->_allow_classes;
  
      unless ( defined $generator ) {
          $generator = sub {
              shift;
              my $value = shift;
  
              return "An undef will never pass an $type check (wants $role)"
                  unless defined $value;
  
              if ( ref $value && !blessed $value ) {
                  my $dump = partial_dump($value);
                  return
                      "An unblessed reference ($dump) will never pass an $type check (wants $role)";
              }
  
              if ( !blessed $value) {
                  return
                      "An empty string will never pass an $type check (wants $role)"
                      unless length $value;
  
                  if (
                      $value =~ /\A
                          \s*
                          -?[0-9]+(?:\.[0-9]+)?
                          (?:[Ee][\-+]?[0-9]+)?
                          \s*
                          \z/xs
                  ) {
                      return
                          "A number ($value) will never pass an $type check (wants $role)";
                  }
  
                  if ( !$allow_classes ) {
                      my $dump = partial_dump($value);
                      return
                          "A plain scalar ($dump) will never pass an $type check (wants $role)";
                  }
              }
  
              my $got = blessed $value;
              $got ||= $value;
  
              return "The $got class does not consume the $role role";
          };
      }
  
      return sub { $generator->( undef, @_ ) };
  }
  ## use critic
  
  1;
  
  # ABSTRACT: Provides a common implementation for Specio::Constraint::AnyDoes and Specio::Constraint::ObjectDoes
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Specio::Constraint::Role::DoesType - Provides a common implementation for Specio::Constraint::AnyDoes and Specio::Constraint::ObjectDoes
  
  =head1 VERSION
  
  version 0.44
  
  =head1 DESCRIPTION
  
  See L<Specio::Constraint::AnyDoes> and L<Specio::Constraint::ObjectDoes> for
  details.
  
  =head1 SUPPORT
  
  Bugs may be submitted at L<https://github.com/houseabsolute/Specio/issues>.
  
  I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
  
  =head1 SOURCE
  
  The source code repository for Specio can be found at L<https://github.com/houseabsolute/Specio>.
  
  =head1 AUTHOR
  
  Dave Rolsky <autarch@urth.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is Copyright (c) 2012 - 2019 by Dave Rolsky.
  
  This is free software, licensed under:
  
    The Artistic License 2.0 (GPL Compatible)
  
  The full text of the license can be found in the
  F<LICENSE> file included with this distribution.
  
  =cut
SPECIO_CONSTRAINT_ROLE_DOESTYPE

    $main::fatpacked{"Specio/Constraint/Role/Interface.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'SPECIO_CONSTRAINT_ROLE_INTERFACE';
  package Specio::Constraint::Role::Interface;
  
  use strict;
  use warnings;
  
  our $VERSION = '0.44';
  
  use Carp qw( confess );
  use Eval::Closure qw( eval_closure );
  use List::Util 1.33 qw( all any first );
  use Specio::Exception;
  use Specio::PartialDump qw( partial_dump );
  use Specio::TypeChecks qw( is_CodeRef );
  
  use Role::Tiny 1.003003;
  
  use Specio::Role::Inlinable;
  with 'Specio::Role::Inlinable';
  
  use overload(
      q{""}  => sub { $_[0] },
      '&{}'  => '_subification',
      'bool' => sub {1},
  );
  
  {
      ## no critic (Subroutines::ProtectPrivateSubs)
      my $role_attrs = Specio::Role::Inlinable::_attrs();
      ## use critic
  
      my $attrs = {
          %{$role_attrs},
          name => {
              isa       => 'Str',
              predicate => '_has_name',
          },
          parent => {
              does      => 'Specio::Constraint::Role::Interface',
              predicate => '_has_parent',
          },
          _constraint => {
              isa       => 'CodeRef',
              init_arg  => 'constraint',
              predicate => '_has_constraint',
          },
          _optimized_constraint => {
              isa      => 'CodeRef',
              init_arg => undef,
              lazy     => 1,
              builder  => '_build_optimized_constraint',
          },
          _ancestors => {
              isa      => 'ArrayRef',
              init_arg => undef,
              lazy     => 1,
              builder  => '_build_ancestors',
          },
          _message_generator => {
              isa      => 'CodeRef',
              init_arg => undef,
          },
          _coercions => {
              builder => '_build_coercions',
              clone   => '_clone_coercions',
          },
          _subification => {
              init_arg => undef,
              lazy     => 1,
              builder  => '_build_subification',
          },
  
          # Because types are cloned on import, we can't directly compare type
          # objects. Because type names can be reused between packages (no global
          # registry) we can't compare types based on name either.
          _signature => {
              isa      => 'Str',
              init_arg => undef,
              lazy     => 1,
              builder  => '_build_signature',
          },
      };
  
      ## no critic (Subroutines::ProhibitUnusedPrivateSubroutines)
      sub _attrs {
          return $attrs;
      }
  }
  
  my $NullConstraint = sub {1};
  
  # See Specio::OO to see how this is used.
  
  ## no critic (Subroutines::ProhibitUnusedPrivateSubroutines)
  sub _Specio_Constraint_Role_Interface_BUILD {
      my $self = shift;
      my $p    = shift;
  
      unless ( $self->_has_constraint || $self->_has_inline_generator ) {
          $self->{_constraint} = $NullConstraint;
      }
  
      die
          'A type constraint should have either a constraint or inline_generator parameter, not both'
          if $self->_has_constraint && $self->_has_inline_generator;
  
      $self->{_message_generator}
          = $self->_wrap_message_generator( $p->{message_generator} );
  
      return;
  }
  ## use critic
  
  sub _wrap_message_generator {
      my $self      = shift;
      my $generator = shift;
  
      unless ( defined $generator ) {
          $generator = sub {
              my $description = shift;
              my $value       = shift;
  
              return "Validation failed for $description with value "
                  . partial_dump($value);
          };
      }
  
      my $d = $self->description;
  
      return sub { $generator->( $d, @_ ) };
  }
  
  sub coercions               { values %{ $_[0]->{_coercions} } }
  sub coercion_from_type      { $_[0]->{_coercions}{ $_[1] } }
  sub _has_coercion_from_type { exists $_[0]->{_coercions}{ $_[1] } }
  sub _add_coercion           { $_[0]->{_coercions}{ $_[1] } = $_[2] }
  sub has_coercions           { scalar keys %{ $_[0]->{_coercions} } }
  
  sub validate_or_die {
      my $self  = shift;
      my $value = shift;
  
      return if $self->value_is_valid($value);
  
      Specio::Exception->throw(
          message => $self->_message_generator->($value),
          type    => $self,
          value   => $value,
      );
  }
  
  sub value_is_valid {
      my $self  = shift;
      my $value = shift;
  
      return $self->_optimized_constraint->($value);
  }
  
  sub _ancestors_and_self {
      my $self = shift;
  
      return ( ( reverse @{ $self->_ancestors } ), $self );
  }
  
  sub is_a_type_of {
      my $self = shift;
      my $type = shift;
  
      return any { $_->_signature eq $type->_signature }
      $self->_ancestors_and_self;
  }
  
  sub is_same_type_as {
      my $self = shift;
      my $type = shift;
  
      return $self->_signature eq $type->_signature;
  }
  
  sub is_anon {
      my $self = shift;
  
      return !$self->_has_name;
  }
  
  sub has_real_constraint {
      my $self = shift;
  
      return ( $self->_has_constraint && $self->_constraint ne $NullConstraint )
          || $self->_has_inline_generator;
  }
  
  sub can_be_inlined {
      my $self = shift;
  
      return 1 if $self->_has_inline_generator;
      return 0
          if $self->_has_constraint && $self->_constraint ne $NullConstraint;
  
      # If this type is an empty subtype of an inlinable parent, then we can
      # inline this type as well.
      return 1 if $self->_has_parent && $self->parent->can_be_inlined;
      return 0;
  }
  
  sub _build_generated_inline_sub {
      my $self = shift;
  
      my $type = $self->_self_or_first_inlinable_ancestor;
  
      my $source
          = 'sub { ' . $type->_inline_generator->( $type, '$_[0]' ) . '}';
  
      return eval_closure(
          source      => $source,
          environment => $type->inline_environment,
          description => 'inlined sub for ' . $self->description,
      );
  }
  
  sub _self_or_first_inlinable_ancestor {
      my $self = shift;
  
      my $type = first { $_->_has_inline_generator }
      reverse $self->_ancestors_and_self;
  
      # This should never happen because ->can_be_inlined should always be
      # checked before this builder is called.
      die 'Cannot generate an inline sub' unless $type;
  
      return $type;
  }
  
  sub _build_optimized_constraint {
      my $self = shift;
  
      if ( $self->can_be_inlined ) {
          return $self->_generated_inline_sub;
      }
      else {
          return $self->_constraint_with_parents;
      }
  }
  
  sub _constraint_with_parents {
      my $self = shift;
  
      my @constraints;
      for my $type ( $self->_ancestors_and_self ) {
          next unless $type->has_real_constraint;
  
          # If a type can be inlined, we can use that and discard all of the
          # ancestors we've seen so far, since we can assume that the inlined
          # constraint does all of the ancestor checks in addition to its own.
          if ( $type->can_be_inlined ) {
              @constraints = $type->_generated_inline_sub;
          }
          else {
              push @constraints, $type->_constraint;
          }
      }
  
      return $NullConstraint unless @constraints;
  
      return sub {
          all { $_->( $_[0] ) } @constraints;
      };
  }
  
  # This is only used for identifying from types as part of coercions, but I
  # want to leave open the possibility of using something other than
  # _description in the future.
  sub id {
      my $self = shift;
  
      return $self->description;
  }
  
  sub add_coercion {
      my $self     = shift;
      my $coercion = shift;
  
      my $from_id = $coercion->from->id;
  
      confess "Cannot add two coercions fom the same type: $from_id"
          if $self->_has_coercion_from_type($from_id);
  
      $self->_add_coercion( $from_id => $coercion );
  
      return;
  }
  
  sub has_coercion_from_type {
      my $self = shift;
      my $type = shift;
  
      return $self->_has_coercion_from_type( $type->id );
  }
  
  sub coerce_value {
      my $self  = shift;
      my $value = shift;
  
      for my $coercion ( $self->coercions ) {
          next unless $coercion->from->value_is_valid($value);
  
          return $coercion->coerce($value);
      }
  
      return $value;
  }
  
  sub can_inline_coercion {
      my $self = shift;
  
      return all { $_->can_be_inlined } $self->coercions;
  }
  
  sub can_inline_coercion_and_check {
      my $self = shift;
  
      return all { $_->can_be_inlined } $self, $self->coercions;
  }
  
  sub inline_coercion {
      my $self     = shift;
      my $arg_name = shift;
  
      die 'Cannot inline coercion'
          unless $self->can_inline_coercion;
  
      my $source = 'do { my $value = ' . $arg_name . ';';
  
      my ( $coerce, $env );
      ( $coerce, $arg_name, $env ) = $self->_inline_coercion($arg_name);
      $source .= $coerce . $arg_name . '};';
  
      return ( $source, $env );
  }
  
  sub inline_coercion_and_check {
      my $self     = shift;
      my $arg_name = shift;
  
      die 'Cannot inline coercion and check'
          unless $self->can_inline_coercion_and_check;
  
      my $source = 'do { my $value = ' . $arg_name . ';';
  
      my ( $coerce, $env );
      ( $coerce, $arg_name, $env ) = $self->_inline_coercion($arg_name);
      my ( $assert, $assert_env ) = $self->inline_assert($arg_name);
  
      $source .= $coerce;
      $source .= $assert;
      $source .= $arg_name . '};';
  
      return ( $source, { %{$env}, %{$assert_env} } );
  }
  
  sub _inline_coercion {
      my $self     = shift;
      my $arg_name = shift;
  
      return ( q{}, $arg_name, {} ) unless $self->has_coercions;
  
      my %env;
  
      $arg_name = '$value';
      my $source = $arg_name . ' = ';
      for my $coercion ( $self->coercions ) {
          $source
              .= '('
              . $coercion->from->inline_check($arg_name) . ') ? ('
              . $coercion->inline_coercion($arg_name) . ') : ';
  
          %env = (
              %env,
              %{ $coercion->inline_environment },
              %{ $coercion->from->inline_environment },
          );
      }
      $source .= $arg_name . ';';
  
      return ( $source, $arg_name, \%env );
  }
  
  {
      my $counter = 1;
  
      sub inline_assert {
          my $self = shift;
  
          my $type_var_name = '$_Specio_Constraint_Interface_type' . $counter;
          my $message_generator_var_name
              = '$_Specio_Constraint_Interface_message_generator' . $counter;
          my %env = (
              $type_var_name              => \$self,
              $message_generator_var_name => \( $self->_message_generator ),
              %{ $self->inline_environment },
          );
  
          my $source = $self->inline_check( $_[0] );
          $source .= ' or ';
          $source .= $self->_inline_throw_exception(
              $_[0],
              $message_generator_var_name,
              $type_var_name
          );
          $source .= ';';
  
          $counter++;
  
          return ( $source, \%env );
      }
  }
  
  sub inline_check {
      my $self = shift;
  
      die 'Cannot inline' unless $self->can_be_inlined;
  
      my $type = $self->_self_or_first_inlinable_ancestor;
      return $type->_inline_generator->( $type, @_ );
  }
  
  # For some idiotic reason I called $type->_subify directly in Code::TidyAll so
  # I'll leave this in here for now.
  
  ## no critic (Subroutines::ProhibitUnusedPrivateSubroutines)
  sub _subify { $_[0]->_subification }
  ## use critic
  
  sub _build_subification {
      my $self = shift;
  
      if ( defined &Sub::Quote::quote_sub && $self->can_be_inlined ) {
          return Sub::Quote::quote_sub( $self->inline_assert('$_[0]') );
      }
      else {
          return sub { $self->validate_or_die( $_[0] ) };
      }
  }
  
  sub _inline_throw_exception {
      my $self                       = shift;
      my $value_var                  = shift;
      my $message_generator_var_name = shift;
      my $type_var_name              = shift;
  
      #<<<
      return 'Specio::Exception->throw( '
          . ' message => ' . $message_generator_var_name . '->(' . $value_var . '),'
          . ' type    => ' . $type_var_name . ','
          . ' value   => ' . $value_var . ' )';
      #>>>
  }
  
  # This exists for the benefit of Moo
  sub coercion_sub {
      my $self = shift;
  
      if ( defined &Sub::Quote::quote_sub
          && all { $_->can_be_inlined } $self->coercions ) {
  
          my $inline = q{};
          my %env;
  
          for my $coercion ( $self->coercions ) {
              $inline .= sprintf(
                  '$_[0] = %s if %s;' . "\n",
                  $coercion->inline_coercion('$_[0]'),
                  $coercion->from->inline_check('$_[0]')
              );
  
              %env = (
                  %env,
                  %{ $coercion->inline_environment },
                  %{ $coercion->from->inline_environment },
              );
          }
  
          $inline .= sprintf( "%s;\n", '$_[0]' );
  
          return Sub::Quote::quote_sub( $inline, \%env );
      }
      else {
          return sub { $self->coerce_value(shift) };
      }
  }
  
  sub _build_ancestors {
      my $self = shift;
  
      my @parents;
  
      my $type = $self;
      while ( $type = $type->parent ) {
          push @parents, $type;
      }
  
      return \@parents;
  
  }
  
  sub _build_description {
      my $self = shift;
  
      my $desc
          = $self->is_anon ? 'anonymous type' : 'type named ' . $self->name;
  
      $desc .= q{ } . $self->declared_at->description;
  
      return $desc;
  }
  
  sub _build_coercions { {} }
  
  ## no critic (Subroutines::ProhibitUnusedPrivateSubroutines)
  sub _clone_coercions {
      my $self = shift;
  
      my $coercions = $self->_coercions;
      my %clones;
  
      for my $name ( keys %{$coercions} ) {
          my $coercion = $coercions->{$name};
          $clones{$name} = $coercion->clone_with_new_to($self);
      }
  
      return \%clones;
  }
  ## use critic
  
  sub _build_signature {
      my $self = shift;
  
      # This assumes that when a type is cloned, the underlying constraint or
      # generator sub is copied by _reference_, so it has the same memory
      # address and stringifies to the same value. XXX - will this break under
      # threads?
      return join "\n",
          ( $self->_has_parent ? $self->parent->_signature : () ),
          (
          defined $self->_constraint
          ? $self->_constraint
          : $self->_inline_generator
          );
  }
  
  # Moose compatibility methods - these exist as a temporary hack to make Specio
  # work with Moose.
  
  sub has_coercion {
      shift->has_coercions;
  }
  
  ## no critic (Subroutines::ProhibitUnusedPrivateSubroutines)
  sub _inline_check {
      shift->inline_check(@_);
  }
  
  sub _compiled_type_constraint {
      shift->_optimized_constraint;
  }
  ## use critic;
  
  # This class implements the methods that Moose expects from coercions as well.
  sub coercion {
      return shift;
  }
  
  ## no critic (Subroutines::ProhibitUnusedPrivateSubroutines)
  sub _compiled_type_coercion {
      my $self = shift;
  
      return sub {
          return $self->coerce_value(shift);
      };
  }
  ## use critic
  
  sub has_message {
      1;
  }
  
  sub message {
      shift->_message_generator;
  }
  
  sub get_message {
      my $self  = shift;
      my $value = shift;
  
      return $self->_message_generator->( $self, $value );
  }
  
  sub check {
      shift->value_is_valid(@_);
  }
  
  sub coerce {
      shift->coerce_value(@_);
  }
  
  1;
  
  # ABSTRACT: The interface all type constraints should provide
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Specio::Constraint::Role::Interface - The interface all type constraints should provide
  
  =head1 VERSION
  
  version 0.44
  
  =head1 DESCRIPTION
  
  This role defines the interface that all type constraints must provide, and
  provides most (or all) of the implementation. The L<Specio::Constraint::Simple>
  class simply consumes this role and provides no additional code. Other
  constraint classes add features or override some of this role's functionality.
  
  =for Pod::Coverage .*
  
  =head1 API
  
  See the L<Specio::Constraint::Simple> documentation for details. See the
  internals of various constraint classes to see how this role can be overridden
  or expanded upon.
  
  =head1 ROLES
  
  This role does the L<Specio::Role::Inlinable> role.
  
  =head1 SUPPORT
  
  Bugs may be submitted at L<https://github.com/houseabsolute/Specio/issues>.
  
  I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
  
  =head1 SOURCE
  
  The source code repository for Specio can be found at L<https://github.com/houseabsolute/Specio>.
  
  =head1 AUTHOR
  
  Dave Rolsky <autarch@urth.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is Copyright (c) 2012 - 2019 by Dave Rolsky.
  
  This is free software, licensed under:
  
    The Artistic License 2.0 (GPL Compatible)
  
  The full text of the license can be found in the
  F<LICENSE> file included with this distribution.
  
  =cut
SPECIO_CONSTRAINT_ROLE_INTERFACE

    $main::fatpacked{"Specio/Constraint/Role/IsaType.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'SPECIO_CONSTRAINT_ROLE_ISATYPE';
  package Specio::Constraint::Role::IsaType;
  
  use strict;
  use warnings;
  
  our $VERSION = '0.44';
  
  use Scalar::Util qw( blessed );
  use Specio::PartialDump qw( partial_dump );
  use Storable qw( dclone );
  
  use Role::Tiny;
  
  use Specio::Constraint::Role::Interface;
  with 'Specio::Constraint::Role::Interface';
  
  {
      ## no critic (Subroutines::ProtectPrivateSubs)
      my $attrs = dclone( Specio::Constraint::Role::Interface::_attrs() );
      ## use critic
  
      for my $name (qw( parent _inline_generator )) {
          $attrs->{$name}{init_arg} = undef;
          $attrs->{$name}{builder}
              = $name =~ /^_/ ? '_build' . $name : '_build_' . $name;
      }
  
      $attrs->{class} = {
          isa      => 'ClassName',
          required => 1,
      };
  
      ## no critic (Subroutines::ProhibitUnusedPrivateSubroutines)
      sub _attrs {
          return $attrs;
      }
  }
  
  ## no critic (Subroutines::ProhibitUnusedPrivateSubroutines)
  sub _wrap_message_generator {
      my $self      = shift;
      my $generator = shift;
  
      my $type          = ( split /::/, blessed $self)[-1];
      my $class         = $self->class;
      my $allow_classes = $self->_allow_classes;
  
      unless ( defined $generator ) {
          $generator = sub {
              shift;
              my $value = shift;
  
              return "An undef will never pass an $type check (wants $class)"
                  unless defined $value;
  
              if ( ref $value && !blessed $value) {
                  my $dump = partial_dump($value);
                  return
                      "An unblessed reference ($dump) will never pass an $type check (wants $class)";
              }
  
              if ( !blessed $value) {
                  return
                      "An empty string will never pass an $type check (wants $class)"
                      unless length $value;
  
                  if (
                      $value =~ /\A
                          \s*
                          -?[0-9]+(?:\.[0-9]+)?
                          (?:[Ee][\-+]?[0-9]+)?
                          \s*
                          \z/xs
                  ) {
                      return
                          "A number ($value) will never pass an $type check (wants $class)";
                  }
  
                  if ( !$allow_classes ) {
                      my $dump = partial_dump($value);
                      return
                          "A plain scalar ($dump) will never pass an $type check (wants $class)";
                  }
              }
  
              my $got = blessed $value;
              $got ||= $value;
  
              return "The $got class is not a subclass of the $class class";
          };
      }
  
      return sub { $generator->( undef, @_ ) };
  }
  ## use critic
  
  1;
  
  # ABSTRACT: Provides a common implementation for Specio::Constraint::AnyIsa and Specio::Constraint::ObjectIsa
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Specio::Constraint::Role::IsaType - Provides a common implementation for Specio::Constraint::AnyIsa and Specio::Constraint::ObjectIsa
  
  =head1 VERSION
  
  version 0.44
  
  =head1 DESCRIPTION
  
  See L<Specio::Constraint::AnyIsa> and L<Specio::Constraint::ObjectIsa> for details.
  
  =head1 SUPPORT
  
  Bugs may be submitted at L<https://github.com/houseabsolute/Specio/issues>.
  
  I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
  
  =head1 SOURCE
  
  The source code repository for Specio can be found at L<https://github.com/houseabsolute/Specio>.
  
  =head1 AUTHOR
  
  Dave Rolsky <autarch@urth.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is Copyright (c) 2012 - 2019 by Dave Rolsky.
  
  This is free software, licensed under:
  
    The Artistic License 2.0 (GPL Compatible)
  
  The full text of the license can be found in the
  F<LICENSE> file included with this distribution.
  
  =cut
SPECIO_CONSTRAINT_ROLE_ISATYPE

    $main::fatpacked{"Specio/Constraint/Simple.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'SPECIO_CONSTRAINT_SIMPLE';
  package Specio::Constraint::Simple;
  
  use strict;
  use warnings;
  
  our $VERSION = '0.44';
  
  use Role::Tiny::With;
  use Specio::OO;
  
  with 'Specio::Constraint::Role::Interface';
  
  __PACKAGE__->_ooify;
  
  1;
  
  # ABSTRACT: Class for simple (non-parameterized or specialized) types
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Specio::Constraint::Simple - Class for simple (non-parameterized or specialized) types
  
  =head1 VERSION
  
  version 0.44
  
  =head1 SYNOPSIS
  
      my $str = t('Str');
  
      print $str->name; # Str
  
      my $parent = $str->parent;
  
      if ( $str->value_is_valid($value) ) { ... }
  
      $str->validate_or_die($value);
  
      my $code = $str->inline_coercion_and_check('$_[0]');
  
  =head1 DESCRIPTION
  
  This class implements simple type constraints, constraints without special
  properties or parameterization.
  
  It does not actually contain any real code of its own. The entire
  implementation is provided by the L<Specio::Constraint::Role::Interface> role,
  but the primary API for type constraints is documented here.
  
  All other type constraint classes in this distribution implement this API,
  except where otherwise noted.
  
  =head1 API
  
  This class provides the following methods.
  
  =head2 Specio::Constraint::Simple->new(...)
  
  This creates a new constraint. It accepts the following named parameters:
  
  =over 4
  
  =item * name => $name
  
  This is the type's name. The name is optional, but if provided it must be a
  string.
  
  =item * parent => $type
  
  The type's parent type. This must be an object which does the
  L<Specio::Constraint::Role::Interface> role.
  
  This parameter is optional.
  
  =item * constraint => sub { ... }
  
  A subroutine reference implementing the constraint. It will be called as a
  method on the object and passed a single argument, the value to check.
  
  It should return true or false to indicate whether the value matches the
  constraint.
  
  This parameter is mutually exclusive with C<inline_generator>.
  
  You can also pass this option with the key C<where> in the parameter list.
  
  =item * inline_generator => sub { ... }
  
  This should be a subroutine reference which returns a string containing a
  single term. This code should I<not> end in a semicolon. This code should
  implement the constraint.
  
  The generator will be called as a method on the constraint with a single
  argument. That argument is the name of the variable being coerced, something
  like C<'$_[0]'> or C<'$var'>.
  
  The inline generator is expected to include code to implement both the current
  type and all its parents. Typically, the easiest way to do this is to write a
  subroutine something like this:
  
    sub {
        my $self = shift;
        my $var  = shift;
  
        return $_[0]->parent->inline_check( $_[1] )
            . ' and more checking code goes here';
    }
  
  This parameter is mutually exclusive with C<constraint>.
  
  You can also pass this option with the key C<inline> in the parameter list.
  
  =item * inline_environment => {}
  
  This should be a hash reference of variable names (with sigils) and values for
  that variable. The values should be I<references> to the values of the
  variables.
  
  This environment will be used when compiling the constraint as part of a
  subroutine. The named variables will be captured as closures in the generated
  subroutine, using L<Eval::Closure>.
  
  It should be very rare to need to set this in the constructor. It's more
  likely that a special type subclass would need to provide values that it
  generates internally.
  
  If you do set this, you are responsible for generating variable names that
  won't clash with anything else in the inlined code.
  
  This parameter defaults to an empty hash reference.
  
  =item * message_generator => sub { ... }
  
  A subroutine to generate an error message when the type check fails. The
  default message says something like "Validation failed for type named Int
  declared in package Specio::Library::Builtins
  (.../Specio/blib/lib/Specio/Library/Builtins.pm) at line 147 in sub named (eval)
  with value 1.1".
  
  You can override this to provide something more specific about the way the
  type failed.
  
  The subroutine you provide will be called as a subroutine, I<not as a method>,
  with two arguments. The first is the description of the type (the bit in the
  message above that starts with "type named Int ..." and ends with "... in sub
  named (eval)". This description says what the thing is and where it was
  defined.
  
  The second argument is the value that failed the type check, after any
  coercions that might have been applied.
  
  You can also pass this option with the key C<message> in the parameter list.
  
  =item * declared_at => $declared_at
  
  This parameter must be a L<Specio::DeclaredAt> object.
  
  This parameter is required.
  
  =back
  
  It is possible to create a type without a constraint of its own.
  
  =head2 $type->name
  
  Returns the name of the type as it was passed the constructor.
  
  =head2 $type->parent
  
  Returns the parent type passed to the constructor. If the type has no parent
  this returns C<undef>.
  
  =head2 $type->is_anon
  
  Returns false for named types, true otherwise.
  
  =head2 $type->is_a_type_of($other_type)
  
  Given a type object, this returns true if the type this method is called on is
  a descendant of that type or is that type.
  
  =head2 $type->is_same_type_as($other_type)
  
  Given a type object, this returns true if the type this method is called on is
  the same as that type.
  
  =head2 $type->coercions
  
  Returns a list of L<Specio::Coercion> objects which belong to this constraint.
  
  =head2 $type->coercion_from_type($name)
  
  Given a type name, this method returns a L<Specio::Coercion> object which
  coerces from that type, if such a coercion exists.
  
  =head2 $type->validate_or_die($value)
  
  This method does nothing if the value is valid. If it is not, it throws a
  L<Specio::Exception>.
  
  =head2 $type->value_is_valid($value)
  
  Returns true or false depending on whether the C<$value> passes the type
  constraint.
  
  =head2 $type->has_real_constraint
  
  This returns true if the type was created with a C<constraint> or
  C<inline_generator> parameter. This is used internally to skip type checks for
  types that don't actually implement a constraint.
  
  =head2 $type->description
  
  This returns a string describing the type. This includes the type's name and
  where it was declared, so you end up with something like C<'type named Foo
  declared in package My::Lib (lib/My/Lib.pm) at line 42'>. If the type is
  anonymous the name will be "anonymous type".
  
  =head2 $type->id
  
  This is a unique id for the type as a string. This is useful if you need to
  make a hash key based on a type, for example. This should be treated as an
  essentially arbitrary and opaque string, and could change at any time in the
  future. If you want something human-readable, use the C<< $type->description
  >> method.
  
  =head2 $type->add_coercion($coercion)
  
  This adds a new L<Specio::Coercion> to the type. If the type already has a
  coercion from the same type as the new coercion, it will throw an error.
  
  =head2 $type->has_coercion_from_type($other_type)
  
  This method returns true if the type can coerce from the other type.
  
  =head2 $type->coerce_value($value)
  
  This attempts to coerce a value into a new value that matches the type. It
  checks all of the type's coercions. If it finds one which has a "from" type
  that accepts the value, it runs the coercion and returns the new value.
  
  If it cannot find a matching coercion it returns the original value.
  
  =head2 $type->inline_coercion_and_check($var)
  
  Given a variable name, this returns a string of code and an environment hash
  that implements all of the type's coercions as well as the type check itself.
  
  This will throw an exception unless both the type and all of its coercions are
  inlinable.
  
  The generated code will throw a L<Specio::Exception> if the type constraint
  fails. If the constraint passes, then the generated code returns the (possibly
  coerced) value.
  
  The return value is a two-element list. The first element is the code. The
  second is a hash reference containing variables which need to be in scope for
  the code to work. This is intended to be passed to L<Eval::Closure>'s
  C<eval_closure> subroutine.
  
  The returned code is a single C<do { }> block without a terminating
  semicolon.
  
  =head2 $type->inline_assert($var)
  
  Given a variable name, this generates code that implements the constraint and
  throws an exception if the variable does not pass the constraint.
  
  The return value is a two-element list. The first element is the code. The
  second is a hash reference containing variables which need to be in scope for
  the code to work. This is intended to be passed to L<Eval::Closure>'s
  C<eval_closure> subroutine.
  
  =head2 $type->inline_check($var)
  
  Given a variable name, this returns a string of code that implements the
  constraint. If the type is not inlinable, this method throws an error.
  
  =head2 $type->inline_coercion($var)
  
  Given a variable name, this returns a string of code and an environment hash
  that implements all of the type's coercions. I<It does not check that the
  resulting value is valid.>
  
  This will throw an exception unless all of the type's coercions are inlinable.
  
  The return value is a two-element list. The first element is the code. The
  second is a hash reference containing variables which need to be in scope for
  the code to work. This is intended to be passed to L<Eval::Closure>'s
  C<eval_closure> subroutine.
  
  The returned code is a single C<do { }> block without a terminating
  semicolon.
  
  =head2 $type->inline_environment()
  
  This returns a hash defining the variables that need to be closed over when
  inlining the type. The keys are full variable names like C<'$foo'> or
  C<'@bar'>. The values are I<references> to a variable of the matching type.
  
  =head2 $type->coercion_sub
  
  This method returns a sub ref that takes a single argument and applied all
  relevant coercions to it. This sub ref will use L<Sub::Quote> if all the
  type's coercions are inlinable.
  
  This method exists primarily for the benefit of L<Moo>.
  
  =head1 OVERLOADING
  
  All constraints overloading subroutine de-referencing for the benefit of
  L<Moo>. The returned subroutine uses L<Sub::Quote> if the type constraint is
  inlinable.
  
  =head1 ROLES
  
  This role does the L<Specio::Constraint::Role::Interface> and
  L<Specio::Role::Inlinable> roles.
  
  =head1 SUPPORT
  
  Bugs may be submitted at L<https://github.com/houseabsolute/Specio/issues>.
  
  I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
  
  =head1 SOURCE
  
  The source code repository for Specio can be found at L<https://github.com/houseabsolute/Specio>.
  
  =head1 AUTHOR
  
  Dave Rolsky <autarch@urth.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is Copyright (c) 2012 - 2019 by Dave Rolsky.
  
  This is free software, licensed under:
  
    The Artistic License 2.0 (GPL Compatible)
  
  The full text of the license can be found in the
  F<LICENSE> file included with this distribution.
  
  =cut
SPECIO_CONSTRAINT_SIMPLE

    $main::fatpacked{"Specio/Constraint/Structurable.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'SPECIO_CONSTRAINT_STRUCTURABLE';
  package Specio::Constraint::Structurable;
  
  use strict;
  use warnings;
  
  our $VERSION = '0.44';
  
  use Carp qw( confess );
  use Role::Tiny::With;
  use Scalar::Util qw( blessed );
  use Specio::DeclaredAt;
  use Specio::OO;
  use Specio::Constraint::Structured;
  use Specio::TypeChecks qw( does_role isa_class );
  
  use Specio::Constraint::Role::Interface;
  with 'Specio::Constraint::Role::Interface';
  
  {
      ## no critic (Subroutines::ProtectPrivateSubs)
      my $role_attrs = Specio::Constraint::Role::Interface::_attrs();
      ## use critic
  
      my $attrs = {
          %{$role_attrs},
          _parameterization_args_builder => {
              isa      => 'CodeRef',
              init_arg => 'parameterization_args_builder',
              required => 1,
          },
          _name_builder => {
              isa      => 'CodeRef',
              init_arg => 'name_builder',
              required => 1,
          },
          _structured_constraint_generator => {
              isa       => 'CodeRef',
              init_arg  => 'structured_constraint_generator',
              predicate => '_has_structured_constraint_generator',
          },
          _structured_inline_generator => {
              isa       => 'CodeRef',
              init_arg  => 'structured_inline_generator',
              predicate => '_has_structured_inline_generator',
          },
      };
  
      ## no critic (Subroutines::ProhibitUnusedPrivateSubroutines)
      sub _attrs {
          return $attrs;
      }
  }
  
  sub BUILD {
      my $self = shift;
  
      if ( $self->_has_constraint ) {
          die
              'A structurable constraint with a constraint parameter must also have a structured_constraint_generator'
              unless $self->_has_structured_constraint_generator;
      }
  
      if ( $self->_has_inline_generator ) {
          die
              'A structurable constraint with an inline_generator parameter must also have a structured_inline_generator'
              unless $self->_has_structured_inline_generator;
      }
  
      return;
  }
  
  sub parameterize {
      my $self = shift;
      my %args = @_;
  
      my $declared_at = $args{declared_at};
  
      if ($declared_at) {
          isa_class( $declared_at, 'Specio::DeclaredAt' )
              or confess
              q{The "declared_at" parameter passed to ->parameterize must be a Specio::DeclaredAt object};
      }
  
      my %parameters
          = $self->_parameterization_args_builder->( $self, $args{of} );
  
      $declared_at = Specio::DeclaredAt->new_from_caller(1)
          unless defined $declared_at;
  
      my %new_p = (
          parent      => $self,
          parameters  => \%parameters,
          declared_at => $declared_at,
          name        => $self->_name_builder->( $self, \%parameters ),
      );
  
      if ( $self->_has_structured_constraint_generator ) {
          $new_p{constraint}
              = $self->_structured_constraint_generator->(%parameters);
      }
      else {
          for my $p (
              grep {
                         blessed($_)
                      && does_role('Specio::Constraint::Role::Interface')
              } values %parameters
          ) {
  
              confess
                  q{Any type objects passed to ->parameterize must be inlinable constraints if the structurable type has an inline_generator}
                  unless $p->can_be_inlined;
          }
  
          my $ig = $self->_structured_inline_generator;
          $new_p{inline_generator}
              = sub { $ig->( shift, shift, %parameters, @_ ) };
      }
  
      return Specio::Constraint::Structured->new(%new_p);
  }
  
  ## no critic (Subroutines::ProhibitUnusedPrivateSubroutines)
  sub _name_or_anon {
      return $_[1]->_has_name ? $_[1]->name : 'ANON';
  }
  ## use critic
  
  __PACKAGE__->_ooify;
  
  1;
  
  # ABSTRACT: A class which represents structurable constraints
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Specio::Constraint::Structurable - A class which represents structurable constraints
  
  =head1 VERSION
  
  version 0.44
  
  =head1 SYNOPSIS
  
      my $tuple = t('Tuple');
  
      my $tuple_of_str_int = $tuple->parameterize( of => [ t('Str'), t('Int') ] );
  
  =head1 DESCRIPTION
  
  This class implements the API for structurable types like C<Dict>, C<Map>< and
  C<Tuple>.
  
  =for Pod::Coverage BUILD
  
  =head1 API
  
  This class implements the same API as L<Specio::Constraint::Simple>, with a few
  additions.
  
  =head2 Specio::Constraint::Structurable->new(...)
  
  This class's constructor accepts two additional parameters:
  
  =over 4
  
  =item * parameterization_args_builder
  
  This is a subroutine that takes the values passed to C<of> and returns a hash
  of named arguments. These arguments will then be passed into the
  C<structured_constraint_generator> or C<structured_inline_generator>.
  
  This should also do argument checking to make sure that the argument passed
  are valid. For example, the C<Tuple> type turns the arrayref passed to C<of>
  into a hash, along the way checking that the caller did not do things like
  interleave optional and required elements or mix optional and slurpy together
  in the definition.
  
  This parameter is required.
  
  =item * name_builder
  
  This is a subroutine that is called to generate a name for the structured type
  when it is created. This will be called as a method on the
  C<Specio::Constraint::Structurable> object. It will be passed the hash of
  arguments returned by the C<parameterization_args_builder>.
  
  This parameter is required.
  
  =item * structured_constraint_generator
  
  This is a subroutine that generates a new constraint subroutine when the type
  is structured.
  
  It will be called as a method on the type and will be passed the hash of
  arguments returned by the C<parameterization_args_builder>.
  
  This parameter is mutually exclusive with the C<structured_inline_generator>
  parameter.
  
  This parameter or the C<structured_inline_generator> parameter is required.
  
  =item * structured_inline_generator
  
  This is a subroutine that generates a new inline generator subroutine when the
  type is structured.
  
  It will be called as a method on the L<Specio::Constraint::Structured> object
  when that object needs to generate an inline constraint. It will receive the
  type parameter as the first argument and the variable name as a string as the
  second.
  
  The remaining arguments will be the parameter hash returned by the
  C<parameterization_args_builder>.
  
  This probably seems fairly confusing, so looking at the examples in the
  L<Specio::Library::Structured::*> code may be helpful.
  
  This parameter is mutually exclusive with the
  C<structured_constraint_generator> parameter.
  
  This parameter or the C<structured_constraint_generator> parameter is
  required.
  
  =back
  
  =head2 $type->parameterize(...)
  
  This method takes two arguments. The C<of> argument should be an object which
  does the L<Specio::Constraint::Role::Interface> role, and is required.
  
  The other argument, C<declared_at>, is optional. If it is not given, then a
  new L<Specio::DeclaredAt> object is creating using a call stack depth of 1.
  
  This method returns a new L<Specio::Constraint::Structured> object.
  
  =head1 SUPPORT
  
  Bugs may be submitted at L<https://github.com/houseabsolute/Specio/issues>.
  
  I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
  
  =head1 SOURCE
  
  The source code repository for Specio can be found at L<https://github.com/houseabsolute/Specio>.
  
  =head1 AUTHOR
  
  Dave Rolsky <autarch@urth.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is Copyright (c) 2012 - 2019 by Dave Rolsky.
  
  This is free software, licensed under:
  
    The Artistic License 2.0 (GPL Compatible)
  
  The full text of the license can be found in the
  F<LICENSE> file included with this distribution.
  
  =cut
SPECIO_CONSTRAINT_STRUCTURABLE

    $main::fatpacked{"Specio/Constraint/Structured.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'SPECIO_CONSTRAINT_STRUCTURED';
  package Specio::Constraint::Structured;
  
  use strict;
  use warnings;
  
  our $VERSION = '0.44';
  
  use List::Util qw( all );
  use Role::Tiny::With;
  use Specio::OO;
  use Specio::TypeChecks qw( does_role );
  use Storable qw( dclone );
  
  use Specio::Constraint::Role::Interface;
  with 'Specio::Constraint::Role::Interface';
  
  {
      ## no critic (Subroutines::ProtectPrivateSubs)
      my $attrs = dclone( Specio::Constraint::Role::Interface::_attrs() );
      ## use critic
  
      $attrs->{parent}{isa}      = 'Specio::Constraint::Structurable';
      $attrs->{parent}{required} = 1;
  
      $attrs->{parameters} = {
          isa      => 'HashRef',
          required => 1,
      };
  
      ## no critic (Subroutines::ProhibitUnusedPrivateSubroutines)
      sub _attrs {
          return $attrs;
      }
  }
  
  sub can_be_inlined {
      my $self = shift;
      return $self->_has_inline_generator;
  }
  
  __PACKAGE__->_ooify;
  
  1;
  
  # ABSTRACT: A class which represents structured constraints
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Specio::Constraint::Structured - A class which represents structured constraints
  
  =head1 VERSION
  
  version 0.44
  
  =head1 SYNOPSIS
  
      my $tuple = t('Tuple');
  
      my $tuple_of_str_int = $tuple->parameterize( of => [ t('Str'), t('Int') ] );
  
      my $parent = $tuple_of_str_int->parent; # returns Tuple
      my $parameters = $arrayref_of_int->parameters; # returns { of => [ t('Str'), t('Int') ] }
  
  =head1 DESCRIPTION
  
  This class implements the API for structured types.
  
  =for Pod::Coverage can_be_inlined type_parameter
  
  =head1 API
  
  This class implements the same API as L<Specio::Constraint::Simple>, with a few
  additions.
  
  =head2 Specio::Constraint::Structured->new(...)
  
  This class's constructor accepts two additional parameters:
  
  =over 4
  
  =item * parent
  
  This should be the L<Specio::Constraint::Structurable> object from which this
  object was created.
  
  This parameter is required.
  
  =item * parameters
  
  This is the hashref of parameters for the structured type. These are the
  parameters returned by the C<Structurable> type's
  C<parameterization_args_builder>. The exact form of this hashref will vary for
  each structured type.
  
  This parameter is required.
  
  =back
  
  =head2 $type->parameters
  
  Returns the hashref that was passed to the constructor.
  
  =head1 SUPPORT
  
  Bugs may be submitted at L<https://github.com/houseabsolute/Specio/issues>.
  
  I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
  
  =head1 SOURCE
  
  The source code repository for Specio can be found at L<https://github.com/houseabsolute/Specio>.
  
  =head1 AUTHOR
  
  Dave Rolsky <autarch@urth.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is Copyright (c) 2012 - 2019 by Dave Rolsky.
  
  This is free software, licensed under:
  
    The Artistic License 2.0 (GPL Compatible)
  
  The full text of the license can be found in the
  F<LICENSE> file included with this distribution.
  
  =cut
SPECIO_CONSTRAINT_STRUCTURED

    $main::fatpacked{"Specio/Constraint/Union.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'SPECIO_CONSTRAINT_UNION';
  package Specio::Constraint::Union;
  
  use strict;
  use warnings;
  
  our $VERSION = '0.44';
  
  use List::Util qw( all any );
  use Role::Tiny::With;
  use Specio::OO;
  use Storable qw( dclone );
  
  use Specio::Constraint::Role::Interface;
  with 'Specio::Constraint::Role::Interface';
  
  {
      ## no critic (Subroutines::ProtectPrivateSubs)
      my $attrs = dclone( Specio::Constraint::Role::Interface::_attrs() );
      ## use critic
  
      for my $name (qw( _constraint _inline_generator )) {
          delete $attrs->{$name}{predicate};
          $attrs->{$name}{init_arg} = undef;
          $attrs->{$name}{lazy}     = 1;
          $attrs->{$name}{builder}
              = $name =~ /^_/ ? '_build' . $name : '_build_' . $name;
      }
  
      delete $attrs->{parent};
  
      delete $attrs->{name}{predicate};
      $attrs->{name}{lazy}    = 1;
      $attrs->{name}{builder} = '_build_name';
  
      $attrs->{of} = {
          isa      => 'ArrayRef',
          required => 1,
      };
  
      ## no critic (Subroutines::ProhibitUnusedPrivateSubroutines)
      sub _attrs {
          return $attrs;
      }
  }
  
  sub parent {undef}
  
  ## no critic (Subroutines::ProhibitUnusedPrivateSubroutines)
  sub _has_parent {0}
  
  sub _has_name {
      my $self = shift;
      return defined $self->name;
  }
  
  sub _build_name {
      my $self = shift;
  
      return unless all { $_->_has_name } @{ $self->of };
      return join q{ | }, map { $_->name } @{ $self->of };
  }
  
  ## no critic (Subroutines::ProhibitUnusedPrivateSubroutines)
  sub _has_constraint {
      my $self = shift;
  
      return !$self->_has_inline_generator;
  }
  ## use critic
  
  sub _build_constraint {
      return $_[0]->_optimized_constraint;
  }
  
  sub _build_optimized_constraint {
      my $self = shift;
  
      ## no critic (Subroutines::ProtectPrivateSubs)
      my @c = map { $_->_optimized_constraint } @{ $self->of };
      return sub {
          return any { $_->( $_[0] ) } @c;
      };
  }
  
  sub _has_inline_generator {
      my $self = shift;
  
      ## no critic (Subroutines::ProtectPrivateSubs)
      return all { $_->_has_inline_generator } @{ $self->of };
  }
  
  sub _build_inline_generator {
      my $self = shift;
  
      return sub {
          return '(' . (
              join q{ || },
              map { sprintf( '( %s )', $_->_inline_generator->( $_, $_[1] ) ) }
                  @{ $self->of }
          ) . ')';
      }
  }
  
  sub _build_inline_environment {
      my $self = shift;
  
      my %env;
      for my $type ( @{ $self->of } ) {
          %env = (
              %env,
              %{ $type->inline_environment },
          );
      }
  
      return \%env;
  }
  
  __PACKAGE__->_ooify;
  
  1;
  
  # ABSTRACT: A class for union constraints
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Specio::Constraint::Union - A class for union constraints
  
  =head1 VERSION
  
  version 0.44
  
  =head1 SYNOPSIS
  
      my $type = Specio::Constraint::Untion->new(...);
  
  =head1 DESCRIPTION
  
  This is a specialized type constraint class for unions, which will allow a
  value which matches any one of several distinct types.
  
  =for Pod::Coverage parent
  
  =head1 API
  
  This class provides all of the same methods as L<Specio::Constraint::Simple>,
  with a few differences:
  
  =head2 Specio::Constraint::Union->new( ... )
  
  The C<parent> parameter is ignored if it passed, as it is always C<undef>
  
  The C<inline_generator> and C<constraint> parameters are also ignored. This
  class provides its own default inline generator subroutine reference.
  
  Finally, this class requires an additional parameter, C<of>. This must be an
  arrayref of type objects.
  
  =head2 $union->of
  
  Returns an array reference of the individual types which makes up this union.
  
  =head1 ROLES
  
  This class does the L<Specio::Constraint::Role::Interface> and
  L<Specio::Role::Inlinable> roles.
  
  =head1 SUPPORT
  
  Bugs may be submitted at L<https://github.com/houseabsolute/Specio/issues>.
  
  I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
  
  =head1 SOURCE
  
  The source code repository for Specio can be found at L<https://github.com/houseabsolute/Specio>.
  
  =head1 AUTHOR
  
  Dave Rolsky <autarch@urth.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is Copyright (c) 2012 - 2019 by Dave Rolsky.
  
  This is free software, licensed under:
  
    The Artistic License 2.0 (GPL Compatible)
  
  The full text of the license can be found in the
  F<LICENSE> file included with this distribution.
  
  =cut
SPECIO_CONSTRAINT_UNION

    $main::fatpacked{"Specio/Declare.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'SPECIO_DECLARE';
  package Specio::Declare;
  
  use strict;
  use warnings;
  
  use parent 'Exporter';
  
  our $VERSION = '0.44';
  
  use Carp qw( croak );
  use Specio::Coercion;
  use Specio::Constraint::Simple;
  use Specio::DeclaredAt;
  use Specio::Helpers qw( install_t_sub _STRINGLIKE );
  use Specio::Registry qw( internal_types_for_package register );
  
  ## no critic (Modules::ProhibitAutomaticExportation)
  our @EXPORT = qw(
      anon
      any_can_type
      any_does_type
      any_isa_type
      coerce
      declare
      enum
      intersection
      object_can_type
      object_does_type
      object_isa_type
      union
  );
  ## use critic
  
  sub import {
      my $package = shift;
  
      # What the heck is this monstrosity?
      #
      # Moose version 2.0901 included a first pass at support for Specio. This
      # was based on Specio c. 0.06 when Specio itself still used
      # Moose. Unfortunately, recent changes to Specio broke this support and
      # the Moose core needs updating.
      #
      # However, stable versions of Moose have since shipped with a test that
      # attempts to test itself with Specio 0.07+. This was fine until I wanted
      # to release a non-TRIAL Specio.
      #
      # Once that's out, anyone installing Specio will cause future attempts to
      # install Moose to fail until Moose includes updated Specio support!
      # Breaking Moose is not acceptable, thus this mess.
      #
      # Note that since Moose 2.1207 this test was renamed and the Specio tests
      # actually run (and pass). We still need to leave this in here for quite
      # some time. People should be able to install Specio and then install an
      # older Moose indefinitely (or at least for a year or two).
      if (   $ENV{HARNESS_ACTIVE}
          && $0 =~ m{t[\\/]type_constraints[\\/]specio\.t$} ) {
  
          require Test::More;
          Test::More::plan( skip_all =>
                  'These tests will not pass with this version of Specio' );
          exit 0;
      }
  
      my $caller = caller();
  
      $package->export_to_level( 1, $package, @_ );
  
      install_t_sub(
          $caller,
          internal_types_for_package($caller)
      );
  
      return;
  }
  
  sub declare {
      my $name = _STRINGLIKE(shift)
          or croak 'You must provide a name for declared types';
      my %p = @_;
  
      my $tc = _make_tc( name => $name, %p );
  
      register( scalar caller(), $name, $tc, 'exportable' );
  
      return $tc;
  }
  
  sub anon {
      return _make_tc(@_);
  }
  
  sub enum {
      my $name;
      $name = shift if @_ % 2;
      my %p = @_;
  
      require Specio::Constraint::Enum;
  
      my $tc = _make_tc(
          ( defined $name ? ( name => $name ) : () ),
          values     => $p{values},
          type_class => 'Specio::Constraint::Enum',
      );
  
      register( scalar caller(), $name, $tc, 'exportable' )
          if defined $name;
  
      return $tc;
  }
  
  sub object_can_type {
      my $name;
      $name = shift if @_ % 2;
      my %p = @_;
  
      # This cannot be loaded earlier, since it loads Specio::Library::Builtins,
      # which in turn wants to load Specio::Declare (the current module).
      require Specio::Constraint::ObjectCan;
  
      my $tc = _make_tc(
          ( defined $name ? ( name => $name ) : () ),
          methods    => $p{methods},
          type_class => 'Specio::Constraint::ObjectCan',
      );
  
      register( scalar caller(), $name, $tc, 'exportable' )
          if defined $name;
  
      return $tc;
  }
  
  sub object_does_type {
      my $name;
      $name = shift if @_ % 2;
      my %p = @_;
  
      my $caller = scalar caller();
  
      # If we are being called repeatedly with a single argument, then we don't
      # want to blow up because the type has already been declared. This would
      # force the user to use t() for all calls but the first, making their code
      # pointlessly more complicated.
      unless ( keys %p ) {
          if ( my $exists = internal_types_for_package($caller)->{$name} ) {
              return $exists;
          }
      }
  
      require Specio::Constraint::ObjectDoes;
  
      my $tc = _make_tc(
          ( defined $name ? ( name => $name ) : () ),
          role       => ( defined $p{role} ? $p{role} : $name ),
          type_class => 'Specio::Constraint::ObjectDoes',
      );
  
      register( scalar caller(), $name, $tc, 'exportable' )
          if defined $name;
  
      return $tc;
  }
  
  sub object_isa_type {
      my $name;
      $name = shift if @_ % 2;
      my %p = @_;
  
      my $caller = scalar caller();
      unless ( keys %p ) {
          if ( my $exists = internal_types_for_package($caller)->{$name} ) {
              return $exists;
          }
      }
  
      require Specio::Constraint::ObjectIsa;
  
      my $tc = _make_tc(
          ( defined $name ? ( name => $name ) : () ),
          class      => ( defined $p{class} ? $p{class} : $name ),
          type_class => 'Specio::Constraint::ObjectIsa',
      );
  
      register( $caller, $name, $tc, 'exportable' )
          if defined $name;
  
      return $tc;
  }
  
  sub any_can_type {
      my $name;
      $name = shift if @_ % 2;
      my %p = @_;
  
      # This cannot be loaded earlier, since it loads Specio::Library::Builtins,
      # which in turn wants to load Specio::Declare (the current module).
      require Specio::Constraint::AnyCan;
  
      my $tc = _make_tc(
          ( defined $name ? ( name => $name ) : () ),
          methods    => $p{methods},
          type_class => 'Specio::Constraint::AnyCan',
      );
  
      register( scalar caller(), $name, $tc, 'exportable' )
          if defined $name;
  
      return $tc;
  }
  
  sub any_does_type {
      my $name;
      $name = shift if @_ % 2;
      my %p = @_;
  
      my $caller = scalar caller();
      unless ( keys %p ) {
          if ( my $exists = internal_types_for_package($caller)->{$name} ) {
              return $exists;
          }
      }
  
      require Specio::Constraint::AnyDoes;
  
      my $tc = _make_tc(
          ( defined $name ? ( name => $name ) : () ),
          role       => ( defined $p{role} ? $p{role} : $name ),
          type_class => 'Specio::Constraint::AnyDoes',
      );
  
      register( scalar caller(), $name, $tc, 'exportable' )
          if defined $name;
  
      return $tc;
  }
  
  sub any_isa_type {
      my $name;
      $name = shift if @_ % 2;
      my %p = @_;
  
      my $caller = scalar caller();
      unless ( keys %p ) {
          if ( my $exists = internal_types_for_package($caller)->{$name} ) {
              return $exists;
          }
      }
  
      require Specio::Constraint::AnyIsa;
  
      my $tc = _make_tc(
          ( defined $name ? ( name => $name ) : () ),
          class      => ( defined $p{class} ? $p{class} : $name ),
          type_class => 'Specio::Constraint::AnyIsa',
      );
  
      register( scalar caller(), $name, $tc, 'exportable' )
          if defined $name;
  
      return $tc;
  }
  
  sub intersection {
      my $name;
      $name = shift if @_ % 2;
      my %p = @_;
  
      require Specio::Constraint::Intersection;
  
      my $tc = _make_tc(
          ( defined $name ? ( name => $name ) : () ),
          %p,
          type_class => 'Specio::Constraint::Intersection',
      );
  
      register( scalar caller(), $name, $tc, 'exportable' )
          if defined $name;
  
      return $tc;
  }
  
  sub union {
      my $name;
      $name = shift if @_ % 2;
      my %p = @_;
  
      require Specio::Constraint::Union;
  
      my $tc = _make_tc(
          ( defined $name ? ( name => $name ) : () ),
          %p,
          type_class => 'Specio::Constraint::Union',
      );
  
      register( scalar caller(), $name, $tc, 'exportable' )
          if defined $name;
  
      return $tc;
  }
  
  sub _make_tc {
      my %p = @_;
  
      my $class = delete $p{type_class} || 'Specio::Constraint::Simple';
  
      $p{constraint}        = delete $p{where}   if exists $p{where};
      $p{message_generator} = delete $p{message} if exists $p{message};
      $p{inline_generator}  = delete $p{inline}  if exists $p{inline};
  
      return $class->new(
          %p,
          declared_at => Specio::DeclaredAt->new_from_caller(2),
      );
  }
  
  sub coerce {
      my $to = shift;
      my %p  = @_;
  
      $p{coercion}         = delete $p{using}  if exists $p{using};
      $p{inline_generator} = delete $p{inline} if exists $p{inline};
  
      return $to->add_coercion(
          Specio::Coercion->new(
              to => $to,
              %p,
              declared_at => Specio::DeclaredAt->new_from_caller(1),
          )
      );
  }
  
  1;
  
  # ABSTRACT: Specio declaration subroutines
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Specio::Declare - Specio declaration subroutines
  
  =head1 VERSION
  
  version 0.44
  
  =head1 SYNOPSIS
  
      package MyApp::Type::Library;
  
      use parent 'Specio::Exporter';
  
      use Specio::Declare;
      use Specio::Library::Builtins;
  
      declare(
          'Foo',
          parent => t('Str'),
          where  => sub { $_[0] =~ /foo/i },
      );
  
      declare(
          'ArrayRefOfInt',
          parent => t( 'ArrayRef', of => t('Int') ),
      );
  
      my $even = anon(
          parent => t('Int'),
          inline => sub {
              my $type      = shift;
              my $value_var = shift;
  
              return $value_var . ' % 2 == 0';
          },
      );
  
      coerce(
          t('ArrayRef'),
          from  => t('Foo'),
          using => sub { [ $_[0] ] },
      );
  
      coerce(
          $even,
          from  => t('Int'),
          using => sub { $_[0] % 2 ? $_[0] + 1 : $_[0] },
      );
  
      # Specio name is DateTime
      any_isa_type('DateTime');
  
      # Specio name is DateTimeObject
      object_isa_type( 'DateTimeObject', class => 'DateTime' );
  
      any_can_type(
          'Duck',
          methods => [ 'duck_walk', 'quack' ],
      );
  
      object_can_type(
          'DuckObject',
          methods => [ 'duck_walk', 'quack' ],
      );
  
      enum(
          'Colors',
          values => [qw( blue green red )],
      );
  
      intersection(
          'HashRefAndArrayRef',
          of => [ t('HashRef'), t('ArrayRef') ],
      );
  
      union(
          'IntOrArrayRef',
          of => [ t('Int'), t('ArrayRef') ],
      );
  
  =head1 DESCRIPTION
  
  This package exports a set of type declaration helpers. Importing this package
  also causes it to create a C<t> subroutine the caller.
  
  =head1 SUBROUTINES
  
  This module exports the following subroutines.
  
  =head2 t('name')
  
  This subroutine lets you access any types you have declared so far, as well as
  any types you imported from another type library.
  
  If you pass an unknown name, it throws an exception.
  
  =head2 declare(...)
  
  This subroutine declares a named type. The first argument is the type name,
  followed by a set of key/value parameters:
  
  =over 4
  
  =item * parent => $type
  
  The parent should be another type object. Specifically, it can be anything
  which does the L<Specio::Constraint::Role::Interface> role. The parent can be a
  named or anonymous type.
  
  =item * where => sub { ... }
  
  This is a subroutine which defines the type constraint. It will be passed a
  single argument, the value to check, and it should return true or false to
  indicate whether or not the value is valid for the type.
  
  This parameter is mutually exclusive with the C<inline> parameter.
  
  =item * inline => sub { ... }
  
  This is a subroutine that is called to generate inline code to validate the
  type. Inlining can be I<much> faster than simply providing a subroutine with
  the C<where> parameter, but is often more complicated to get right.
  
  The inline generator is called as a method on the type with one argument. This
  argument is a I<string> containing the variable name to use in the generated
  code. Typically this is something like C<'$_[0]'> or C<'$value'>.
  
  The inline generator subroutine should return a I<string> of code representing
  a single term, and it I<should not> be terminated with a semicolon. This
  allows the inlined code to be safely included in an C<if> statement, for
  example. You can use C<do { }> blocks and ternaries to get everything into one
  term. Do not assign to the variable you are testing. This single term should
  evaluate to true or false.
  
  The inline generator is expected to include code to implement both the current
  type and all its parents. Typically, the easiest way to do this is to write a
  subroutine something like this:
  
    sub {
        my $self = shift;
        my $var  = shift;
  
        return $self->parent->inline_check($var)
            . ' and more checking code goes here';
    }
  
  Or, more concisely:
  
    sub { $_[0]->parent->inline_check( $_[1] ) . 'more code that checks $_[1]' }
  
  The C<inline> parameter is mutually exclusive with the C<where> parameter.
  
  =item * message_generator => sub { ... }
  
  A subroutine to generate an error message when the type check fails. The
  default message says something like "Validation failed for type named Int
  declared in package Specio::Library::Builtins
  (.../Specio/blib/lib/Specio/Library/Builtins.pm) at line 147 in sub named (eval)
  with value 1.1".
  
  You can override this to provide something more specific about the way the
  type failed.
  
  The subroutine you provide will be called as a method on the type with two
  arguments. The first is the description of the type (the bit in the message
  above that starts with "type named Int ..." and ends with "... in sub named
  (eval)". This description says what the thing is and where it was defined.
  
  The second argument is the value that failed the type check, after any
  coercions that might have been applied.
  
  =back
  
  =head2 anon(...)
  
  This subroutine declares an anonymous type. It is identical to C<declare>
  except that it expects a list of key/value parameters without a type name as
  the first parameter.
  
  =head2 coerce(...)
  
  This declares a coercion from one type to another. The first argument should
  be an object which does the L<Specio::Constraint::Role::Interface> role. This
  can be either a named or anonymous type. This type is the type that the
  coercion is I<to>.
  
  The remaining arguments are key/value parameters:
  
  =over 4
  
  =item * from => $type
  
  This must be an object which does the L<Specio::Constraint::Role::Interface>
  role. This is type that we are coercing I<from>. Again, this can be either a
  named or anonymous type.
  
  =item * using => sub { ... }
  
  This is a subroutine which defines the type coercion. It will be passed a
  single argument, the value to coerce. It should return a new value of the type
  this coercion is to.
  
  This parameter is mutually exclusive with the C<inline> parameter.
  
  =item * inline => sub { ... }
  
  This is a subroutine that is called to generate inline code to perform the
  coercion.
  
  The inline generator is called as a method on the type with one argument. This
  argument is a I<string> containing the variable name to use in the generated
  code. Typically this is something like C<'$_[0]'> or C<'$value'>.
  
  The inline generator subroutine should return a I<string> of code representing
  a single term, and it I<should not> be terminated with a semicolon. This
  allows the inlined code to be safely included in an C<if> statement, for
  example. You can use C<do { }> blocks and ternaries to get everything into one
  term. This single term should evaluate to the new value.
  
  =back
  
  =head1 DECLARATION HELPERS
  
  This module also exports some helper subs for declaring certain kinds of types:
  
  =head2 any_isa_type, object_isa_type
  
  The C<any_isa_type> helper creates a type which accepts a class name or
  object of the given class. The C<object_isa_type> helper creates a type
  which only accepts an object of the given class.
  
  These subroutines take a type name as the first argument. The remaining
  arguments are key/value pairs. Currently this is just the C<class> key, which
  should be a class name. This is the class that the type requires.
  
  The type name argument can be omitted to create an anonymous type.
  
  You can also pass just a single argument, in which case that will be used as
  both the type's name and the class for the constraint to check.
  
  =head2 any_does_type, object_does_type
  
  The C<any_does_type> helper creates a type which accepts a class name or
  object which does the given role. The C<object_does_type> helper creates a
  type which only accepts an object which does the given role.
  
  These subroutines take a type name as the first argument. The remaining
  arguments are key/value pairs. Currently this is just the C<role> key, which
  should be a role name. This is the class that the type requires.
  
  This should just work (I hope) with roles created by L<Moose>, L<Mouse>, and
  L<Moo> (using L<Role::Tiny>).
  
  The type name argument can be omitted to create an anonymous type.
  
  You can also pass just a single argument, in which case that will be used as
  both the type's name and the role for the constraint to check.
  
  =head2 any_can_type, object_can_type
  
  The C<any_can_type> helper creates a type which accepts a class name or
  object with the given methods. The C<object_can_type> helper creates a type
  which only accepts an object with the given methods.
  
  These subroutines take a type name as the first argument. The remaining
  arguments are key/value pairs. Currently this is just the C<methods> key,
  which can be either a string or array reference of strings. These strings are
  the required methods for the type.
  
  The type name argument can be omitted to create an anonymous type.
  
  =head2 enum
  
  This creates a type which accepts a string matching a given list of acceptable
  values.
  
  The first argument is the type name. The remaining arguments are key/value
  pairs. Currently this is just the C<values> key. This should an array
  reference of acceptable string values.
  
  The type name argument can be omitted to create an anonymous type.
  
  =head2 intersection
  
  This creates a type which is the intersection of two or more other types. A
  union only accepts values which match all of its underlying types.
  
  The first argument is the type name. The remaining arguments are key/value
  pairs. Currently this is just the C<of> key. This should an array
  reference of types.
  
  The type name argument can be omitted to create an anonymous type.
  
  =head2 union
  
  This creates a type which is the union of two or more other types. A union
  accepts any of its underlying types.
  
  The first argument is the type name. The remaining arguments are key/value
  pairs. Currently this is just the C<of> key. This should an array
  reference of types.
  
  The type name argument can be omitted to create an anonymous type.
  
  =head1 PARAMETERIZED TYPES
  
  You can create a parameterized type by calling C<t> with additional
  parameters, like this:
  
    my $arrayref_of_int = t( 'ArrayRef', of => t('Int') );
  
    my $arrayref_of_hashref_of_int = t(
        'ArrayRef',
        of => t(
            'HashRef',
            of => t('Int'),
        ),
    );
  
  The C<t> subroutine assumes that if it receives more than one argument, it
  should look up the named type and call C<< $type->parameterize(...) >> with
  the additional arguments.
  
  If the named type cannot be parameterized, it throws an error.
  
  You can also call C<< $type->parameterize >> directly if needed. See
  L<Specio::Constraint::Parameterizable> for details.
  
  =head1 SUPPORT
  
  Bugs may be submitted at L<https://github.com/houseabsolute/Specio/issues>.
  
  I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
  
  =head1 SOURCE
  
  The source code repository for Specio can be found at L<https://github.com/houseabsolute/Specio>.
  
  =head1 AUTHOR
  
  Dave Rolsky <autarch@urth.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is Copyright (c) 2012 - 2019 by Dave Rolsky.
  
  This is free software, licensed under:
  
    The Artistic License 2.0 (GPL Compatible)
  
  The full text of the license can be found in the
  F<LICENSE> file included with this distribution.
  
  =cut
SPECIO_DECLARE

    $main::fatpacked{"Specio/DeclaredAt.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'SPECIO_DECLAREDAT';
  package Specio::DeclaredAt;
  
  use strict;
  use warnings;
  
  our $VERSION = '0.44';
  
  use Specio::OO;
  
  {
      my $attrs = {
          package => {
              isa      => 'Str',
              required => 1,
          },
          filename => {
              isa      => 'Str',
              required => 1,
          },
          line => {
              isa      => 'Int',
              required => 1,
          },
          subroutine => {
              isa       => 'Str',
              predicate => 'has_subroutine',
          },
      };
  
      ## no critic (Subroutines::ProhibitUnusedPrivateSubroutines)
      sub _attrs {
          return $attrs;
      }
  }
  
  sub new_from_caller {
      my $class = shift;
      my $depth = shift;
  
      my %p;
      @p{qw( package filename line )} = ( caller($depth) )[ 0, 1, 2 ];
  
      my $sub = ( caller( $depth + 1 ) )[3];
      $p{subroutine} = $sub if defined $sub;
  
      return $class->new(%p);
  }
  
  sub description {
      my $self = shift;
  
      my $package  = $self->package;
      my $filename = $self->filename;
      my $line     = $self->line;
  
      my $desc = "declared in package $package ($filename) at line $line";
      if ( $self->has_subroutine ) {
          $desc .= ' in sub named ' . $self->subroutine;
      }
  
      return $desc;
  }
  
  __PACKAGE__->_ooify;
  
  1;
  
  # ABSTRACT: A class to represent where a type or coercion was declared
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Specio::DeclaredAt - A class to represent where a type or coercion was declared
  
  =head1 VERSION
  
  version 0.44
  
  =head1 SYNOPSIS
  
      my $declared = Specio::DeclaredAt->new_from_caller(1);
  
      print $declared->description;
  
  =head1 DESCRIPTION
  
  This class provides a thin wrapper around some of the return values from
  Perl's C<caller> built-in. It's used internally to identify where types and
  coercions are being declared, which is useful when generating error messages.
  
  =head1 API
  
  This class provides the following methods.
  
  =head2 Specio::DeclaredAt->new_from_caller($depth)
  
  Given a call stack depth, this method returns a new C<Specio::DeclaredAt>
  object.
  
  =head2 $declared_at->package, $declared_at->filename, $declared_at->line
  
  Returns the call stack information recorded when the object was created. These
  values are always populated.
  
  =head2 $declared_at->subroutine
  
  Returns the subroutine from the call stack. This may be an C<udnef>
  
  =head2 $declared_at->has_subroutine
  
  Returns true if there is a subroutine name associated with this object.
  
  =head2 $declared_at->description
  
  Puts all the information together into a single string like "declared in
  package Foo::Bar (.../Foo/Bar.pm) at line 42 in sub named blah".
  
  =head1 SUPPORT
  
  Bugs may be submitted at L<https://github.com/houseabsolute/Specio/issues>.
  
  I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
  
  =head1 SOURCE
  
  The source code repository for Specio can be found at L<https://github.com/houseabsolute/Specio>.
  
  =head1 AUTHOR
  
  Dave Rolsky <autarch@urth.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is Copyright (c) 2012 - 2019 by Dave Rolsky.
  
  This is free software, licensed under:
  
    The Artistic License 2.0 (GPL Compatible)
  
  The full text of the license can be found in the
  F<LICENSE> file included with this distribution.
  
  =cut
SPECIO_DECLAREDAT

    $main::fatpacked{"Specio/Exception.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'SPECIO_EXCEPTION';
  package Specio::Exception;
  
  use strict;
  use warnings;
  
  use overload
      q{""}    => 'as_string',
      fallback => 1;
  
  our $VERSION = '0.44';
  
  use Devel::StackTrace;
  use Scalar::Util qw( blessed );
  use Specio::OO;
  
  {
      my $attrs = {
          message => {
              isa      => 'Str',
              required => 1,
          },
          type => {
              does     => 'Specio::Constraint::Role::Interface',
              required => 1,
          },
          value => {
              required => 1,
          },
          stack_trace => {
              init_arg => undef,
          },
      };
  
      ## no critic (Subroutines::ProhibitUnusedPrivateSubroutines)
      sub _attrs {
          return $attrs;
      }
  }
  
  sub BUILD {
      my $self = shift;
  
      $self->{stack_trace}
          = Devel::StackTrace->new( ignore_package => __PACKAGE__ );
  
      return;
  }
  
  sub as_string {
      my $self = shift;
  
      my $str = $self->message;
      $str .= "\n\n" . $self->stack_trace->as_string;
  
      return $str;
  }
  
  sub throw {
      my $self = shift;
  
      die $self if blessed $self;
  
      die $self->new(@_);
  }
  
  __PACKAGE__->_ooify;
  
  1;
  
  # ABSTRACT: An exception class for type constraint failures
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Specio::Exception - An exception class for type constraint failures
  
  =head1 VERSION
  
  version 0.44
  
  =head1 SYNOPSIS
  
    use Try::Tiny;
  
    try {
        $type->validate_or_die($value);
    }
    catch {
        if ( $_->isa('Specio::Exception') ) {
            print $_->message, "\n";
            print $_->type->name, "\n";
            print $_->value, "\n";
        }
    };
  
  =head1 DESCRIPTION
  
  This exception class is thrown by Specio when a type check fails. It emulates
  the L<Throwable::Error> API, but doesn't use that module to avoid adding a
  dependency on L<Moo>.
  
  =for Pod::Coverage BUILD throw
  
  =head1 API
  
  This class provides the following methods:
  
  =head2 $exception->message
  
  The error message associated with the exception.
  
  =head2 $exception->stack_trace
  
  A L<Devel::StackTrace> object for the exception.
  
  =head2 $exception->type
  
  The type constraint object against which the value failed.
  
  =head2 $exception->value
  
  The value that failed the type check.
  
  =head2 $exception->as_string
  
  The exception as a string. This includes the method and the stack trace.
  
  =head1 OVERLOADING
  
  This class overloads stringification to call the C<as_string> method.
  
  =head1 SUPPORT
  
  Bugs may be submitted at L<https://github.com/houseabsolute/Specio/issues>.
  
  I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
  
  =head1 SOURCE
  
  The source code repository for Specio can be found at L<https://github.com/houseabsolute/Specio>.
  
  =head1 AUTHOR
  
  Dave Rolsky <autarch@urth.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is Copyright (c) 2012 - 2019 by Dave Rolsky.
  
  This is free software, licensed under:
  
    The Artistic License 2.0 (GPL Compatible)
  
  The full text of the license can be found in the
  F<LICENSE> file included with this distribution.
  
  =cut
SPECIO_EXCEPTION

    $main::fatpacked{"Specio/Exporter.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'SPECIO_EXPORTER';
  package Specio::Exporter;
  
  use strict;
  use warnings;
  
  our $VERSION = '0.44';
  
  use parent 'Exporter';
  
  use Specio::Helpers qw( install_t_sub );
  use Specio::Registry
      qw( exportable_types_for_package internal_types_for_package register );
  
  my %Exported;
  
  sub import {
      my $package  = shift;
      my $reexport = shift;
  
      my $caller = caller();
  
      return if $Exported{$caller}{$package};
  
      my $exported = exportable_types_for_package($package);
  
      while ( my ( $name, $type ) = each %{$exported} ) {
          register( $caller, $name, $type->clone, $reexport );
      }
  
      install_t_sub(
          $caller,
          internal_types_for_package($caller),
      );
  
      if ( $package->can('_also_export') ) {
          for my $sub ( $package->_also_export ) {
              ## no critic (TestingAndDebugging::ProhibitNoStrict)
              no strict 'refs';
              *{ $caller . '::' . $sub } = \&{ $package . '::' . $sub };
          }
      }
  
      $Exported{$caller}{$package} = 1;
  
      return;
  }
  
  1;
  
  # ABSTRACT: Base class for type libraries
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Specio::Exporter - Base class for type libraries
  
  =head1 VERSION
  
  version 0.44
  
  =head1 SYNOPSIS
  
      package MyApp::Type::Library;
  
      use parent 'Specio::Exporter';
  
      use Specio::Declare;
  
      declare( ... );
  
      # more types here
  
      package MyApp::Foo;
  
      use MyApp::Type::Library
  
  =head1 DESCRIPTION
  
  Inheriting from this package makes your package a type exporter. By default,
  types defined in a package are never visible outside of the package. When you
  inherit from this package, all the types you define internally become
  available via exports.
  
  The exported types are available through the importing package's C<t>
  subroutine.
  
  By default, types your package imports are not re-exported:
  
    package MyApp::Type::Library;
  
    use parent 'Specio::Exporter';
  
    use Specio::Declare;
    use Specio::Library::Builtins;
  
  In this case, the types provided by L<Specio::Library::Builtins> are not
  exported to packages which C<use MyApp::Type::Library>.
  
  You can explicitly ask for types to be re-exported:
  
    package MyApp::Type::Library;
  
    use parent 'Specio::Exporter';
  
    use Specio::Declare;
    use Specio::Library::Builtins -reexport;
  
  In this case, packages which C<use MyApp::Type::Library> will get all the
  types from L<Specio::Library::Builtins> as well as any types defined in
  C<MyApp::Type::Library>.
  
  =head1 ADDITIONAL EXPORTS
  
  If you want to export some additional subroutines from a package which has
  C<Specio::Exporter> as its parent, define a sub named C<_also_export>. This
  sub should return a I<list> of subroutines defined in your package that should
  also be exported. These subs will be exported unconditionally to any package
  that uses your package.
  
  =head1 COMBINING LIBRARIES WITH L<Specio::Subs>
  
  You can combine loading libraries with subroutine generation using
  L<Specio::Subs> by using C<_also_export> and
  C<Specio::Subs::subs_installed_into>:
  
      package My::Library;
  
      use My::Library::Internal -reexport;
      use Specio::Library::Builtins -reexport;
      use Specio::Subs qw( My::Library::Internal Specio::Library::Builtins );
  
      sub _also_export {
          return Specio::Subs::subs_installed_into(__PACKAGE__);
      }
  
  =head1 SUPPORT
  
  Bugs may be submitted at L<https://github.com/houseabsolute/Specio/issues>.
  
  I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
  
  =head1 SOURCE
  
  The source code repository for Specio can be found at L<https://github.com/houseabsolute/Specio>.
  
  =head1 AUTHOR
  
  Dave Rolsky <autarch@urth.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is Copyright (c) 2012 - 2019 by Dave Rolsky.
  
  This is free software, licensed under:
  
    The Artistic License 2.0 (GPL Compatible)
  
  The full text of the license can be found in the
  F<LICENSE> file included with this distribution.
  
  =cut
SPECIO_EXPORTER

    $main::fatpacked{"Specio/Helpers.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'SPECIO_HELPERS';
  package Specio::Helpers;
  
  use strict;
  use warnings;
  
  use Carp qw( croak );
  use Exporter 'import';
  use overload ();
  
  our $VERSION = '0.44';
  
  use Scalar::Util qw( blessed );
  
  our @EXPORT_OK = qw( install_t_sub is_class_loaded perlstring _STRINGLIKE  );
  
  sub install_t_sub {
  
      # Specio::DeclaredAt use Specio::OO, which in turn uses
      # Specio::Helpers. If we load this with "use" we get a cirular require and
      # a big mess.
      require Specio::DeclaredAt;
  
      my $caller = shift;
      my $types  = shift;
  
      # XXX - check to see if their t() is something else entirely?
      return if $caller->can('t');
  
      my $t = sub {
          my $name = shift;
  
          croak 'The t subroutine requires a single non-empty string argument'
              unless _STRINGLIKE($name);
  
          croak "There is no type named $name available for the $caller package"
              unless exists $types->{$name};
  
          my $found = $types->{$name};
  
          return $found unless @_;
  
          my %p = @_;
  
          croak 'Cannot parameterize a non-parameterizable type'
              unless $found->can('parameterize');
  
          return $found->parameterize(
              declared_at => Specio::DeclaredAt->new_from_caller(1),
              %p,
          );
      };
  
      {
          ## no critic (TestingAndDebugging::ProhibitNoStrict)
          no strict 'refs';
          no warnings 'redefine';
          *{ $caller . '::t' } = $t;
      }
  
      return;
  }
  
  ## no critic (Subroutines::ProhibitSubroutinePrototypes, Subroutines::ProhibitExplicitReturnUndef)
  sub _STRINGLIKE ($) {
      return $_[0] if _STRING( $_[0] );
  
      return $_[0]
          if blessed $_[0]
          && overload::Method( $_[0], q{""} )
          && length "$_[0]";
  
      return undef;
  }
  
  # Borrowed from Params::Util
  sub _STRING ($) {
      return defined $_[0] && !ref $_[0] && length( $_[0] ) ? $_[0] : undef;
  }
  
  BEGIN {
      if ( $] >= 5.010 && eval { require XString; 1 } ) {
          *perlstring = \&XString::perlstring;
      }
      else {
          require B;
          *perlstring = \&B::perlstring;
      }
  }
  
  # Borrowed from Types::Standard
  sub is_class_loaded {
      my $stash = do {
          ## no critic (TestingAndDebugging::ProhibitNoStrict)
          no strict 'refs';
          \%{ $_[0] . '::' };
      };
  
      return 1 if exists $stash->{ISA};
      return 1 if exists $stash->{VERSION};
  
      foreach my $globref ( values %{$stash} ) {
          return 1
              if ref \$globref eq 'GLOB'
              ? *{$globref}{CODE}
              : ref $globref;    # const or sub ref
      }
  
      return 0;
  }
  
  1;
  
  # ABSTRACT: Helper subs for the Specio distro
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Specio::Helpers - Helper subs for the Specio distro
  
  =head1 VERSION
  
  version 0.44
  
  =head1 DESCRIPTION
  
  There's nothing public here.
  
  =for Pod::Coverage .*
  
  =head1 SUPPORT
  
  Bugs may be submitted at L<https://github.com/houseabsolute/Specio/issues>.
  
  I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
  
  =head1 SOURCE
  
  The source code repository for Specio can be found at L<https://github.com/houseabsolute/Specio>.
  
  =head1 AUTHOR
  
  Dave Rolsky <autarch@urth.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is Copyright (c) 2012 - 2019 by Dave Rolsky.
  
  This is free software, licensed under:
  
    The Artistic License 2.0 (GPL Compatible)
  
  The full text of the license can be found in the
  F<LICENSE> file included with this distribution.
  
  =cut
SPECIO_HELPERS

    $main::fatpacked{"Specio/Library/Builtins.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'SPECIO_LIBRARY_BUILTINS';
  package Specio::Library::Builtins;
  
  use strict;
  use warnings;
  
  our $VERSION = '0.44';
  
  use parent 'Specio::Exporter';
  
  use List::Util 1.33 ();
  use overload     ();
  use re           ();
  use Scalar::Util ();
  use Specio::Constraint::Parameterizable;
  use Specio::Declare;
  use Specio::Helpers ();
  
  BEGIN {
      local $@ = undef;
      my $has_ref_util
          = eval { require Ref::Util; Ref::Util->VERSION('0.112'); 1 };
      sub _HAS_REF_UTIL () {$has_ref_util}
  }
  
  declare(
      'Item',
      inline => sub {'1'}
  );
  
  declare(
      'Undef',
      parent => t('Item'),
      inline => sub {
          '!defined(' . $_[1] . ')';
      }
  );
  
  declare(
      'Defined',
      parent => t('Item'),
      inline => sub {
          'defined(' . $_[1] . ')';
      }
  );
  
  declare(
      'Bool',
      parent => t('Item'),
      inline => sub {
          return sprintf( <<'EOF', ( $_[1] ) x 7 );
  (
      (
          !ref( %s )
          && (
                 !defined( %s )
                 || %s eq q{}
                 || %s eq '1'
                 || %s eq '0'
             )
      )
      ||
      (
          Scalar::Util::blessed( %s )
          && defined overload::Method( %s, 'bool' )
      )
  )
  EOF
      }
  );
  
  declare(
      'Value',
      parent => t('Defined'),
      inline => sub {
          $_[0]->parent->inline_check( $_[1] ) . ' && !ref(' . $_[1] . ')';
      }
  );
  
  declare(
      'Ref',
      parent => t('Defined'),
  
      # no need to call parent - ref also checks for definedness
      inline => sub { 'ref(' . $_[1] . ')' }
  );
  
  declare(
      'Str',
      parent => t('Value'),
      inline => sub {
          return sprintf( <<'EOF', ( $_[1] ) x 6 );
  (
      (
          defined( %s )
          && !ref( %s )
          && (
                 ( ref( \%s ) eq 'SCALAR' )
                 || do { ( ref( \( my $val = %s ) ) eq 'SCALAR' ) }
             )
      )
      ||
      (
          Scalar::Util::blessed( %s )
          && defined overload::Method( %s, q{""} )
      )
  )
  EOF
      }
  );
  
  my $value_type = t('Value');
  declare(
      'Num',
      parent => t('Str'),
      inline => sub {
          return sprintf( <<'EOF', ( $_[1] ) x 5 );
  (
      (
          defined( %s )
          && !ref( %s )
          && (
                 do {
                     ( my $val = %s ) =~
                         /\A
                          -?[0-9]+(?:\.[0-9]+)?
                          (?:[Ee][\-+]?[0-9]+)?
                          \z/x
                 }
             )
      )
      ||
      (
          Scalar::Util::blessed( %s )
          && defined overload::Method( %s, '0+' )
      )
  )
  EOF
      }
  );
  
  declare(
      'Int',
      parent => t('Num'),
      inline => sub {
          return sprintf( <<'EOF', ( $_[1] ) x 6 );
  (
      (
          defined( %s )
          && !ref( %s )
          && (
                 do { ( my $val1 = %s ) =~ /\A-?[0-9]+(?:[Ee]\+?[0-9]+)?\z/ }
             )
      )
      ||
      (
          Scalar::Util::blessed( %s )
          && defined overload::Method( %s, '0+' )
          && do { ( my $val2 = %s + 0 ) =~ /\A-?[0-9]+(?:[Ee]\+?[0-9]+)?\z/ }
      )
  )
  EOF
      }
  );
  
  {
      my $ref_check
          = _HAS_REF_UTIL
          ? 'Ref::Util::is_plain_coderef(%s)'
          : q{ref(%s) eq 'CODE'};
  
      declare(
          'CodeRef',
          parent => t('Ref'),
          inline => sub {
              return sprintf( <<"EOF", ( $_[1] ) x 3 );
  (
      $ref_check
      ||
      (
          Scalar::Util::blessed( %s )
          && defined overload::Method( %s, '&{}' )
      )
  )
  EOF
          }
      );
  }
  
  {
      # This is a 5.8 back-compat shim stolen from Type::Tiny's Devel::Perl58Compat
      # module.
      unless ( exists &re::is_regexp || _HAS_REF_UTIL ) {
          require B;
          *re::is_regexp = sub {
              ## no critic (ErrorHandling::RequireCheckingReturnValueOfEval)
              eval { B::svref_2object( $_[0] )->MAGIC->TYPE eq 'r' };
          };
      }
  
      my $ref_check
          = _HAS_REF_UTIL
          ? 'Ref::Util::is_regexpref(%s)'
          : 're::is_regexp(%s)';
  
      declare(
          'RegexpRef',
          parent => t('Ref'),
          inline => sub {
              return sprintf( <<"EOF", ( $_[1] ) x 3 );
  (
      $ref_check
      ||
      (
          Scalar::Util::blessed( %s )
          && defined overload::Method( %s, 'qr' )
      )
  )
  EOF
          },
      );
  }
  
  {
      my $ref_check
          = _HAS_REF_UTIL
          ? 'Ref::Util::is_plain_globref(%s)'
          : q{ref( %s ) eq 'GLOB'};
  
      declare(
          'GlobRef',
          parent => t('Ref'),
          inline => sub {
              return sprintf( <<"EOF", ( $_[1] ) x 3 );
  (
      $ref_check
      ||
      (
          Scalar::Util::blessed( %s )
          && defined overload::Method( %s, '*{}' )
      )
  )
  EOF
          }
      );
  }
  
  {
      my $ref_check
          = _HAS_REF_UTIL
          ? 'Ref::Util::is_plain_globref(%s)'
          : q{ref( %s ) eq 'GLOB'};
  
      # NOTE: scalar filehandles are GLOB refs, but a GLOB ref is not always a
      # filehandle
      declare(
          'FileHandle',
          parent => t('Ref'),
          inline => sub {
              return sprintf( <<"EOF", ( $_[1] ) x 6 );
  (
      (
          $ref_check
          && Scalar::Util::openhandle( %s )
      )
      ||
      (
          Scalar::Util::blessed( %s )
          &&
          (
              %s->isa('IO::Handle')
              ||
              (
                  defined overload::Method( %s, '*{}' )
                  && Scalar::Util::openhandle( *{ %s } )
              )
          )
      )
  )
  EOF
          }
      );
  }
  
  {
      my $ref_check
          = _HAS_REF_UTIL
          ? 'Ref::Util::is_blessed_ref(%s)'
          : 'Scalar::Util::blessed(%s)';
  
      declare(
          'Object',
          parent => t('Ref'),
          inline => sub { sprintf( $ref_check, $_[1] ) },
      );
  }
  
  declare(
      'ClassName',
      parent => t('Str'),
      inline => sub {
          return
              sprintf(
              <<'EOF', $_[0]->parent->inline_check( $_[1] ), ( $_[1] ) x 2 );
  (
      ( %s )
      && length "%s"
      && Specio::Helpers::is_class_loaded( "%s" )
  )
  EOF
      },
  );
  
  {
      my $ref_check
          = _HAS_REF_UTIL
          ? 'Ref::Util::is_plain_scalarref(%s) || Ref::Util::is_plain_refref(%s)'
          : q{ref( %s ) eq 'SCALAR' || ref( %s ) eq 'REF'};
  
      my $base_scalarref_check = sub {
          return sprintf( <<"EOF", ( $_[0] ) x 4 );
  (
      (
          $ref_check
      )
      ||
      (
          Scalar::Util::blessed( %s )
          && defined overload::Method( %s, '\${}' )
      )
  )
  EOF
      };
  
      declare(
          'ScalarRef',
          type_class => 'Specio::Constraint::Parameterizable',
          parent     => t('Ref'),
          inline     => sub { $base_scalarref_check->( $_[1] ) },
          parameterized_inline_generator => sub {
              my $self      = shift;
              my $parameter = shift;
              my $val       = shift;
  
              return sprintf(
                  '( ( %s ) && ( %s ) )',
                  $base_scalarref_check->($val),
                  $parameter->inline_check( '${' . $val . '}' ),
              );
          }
      );
  }
  
  {
      my $ref_check
          = _HAS_REF_UTIL
          ? 'Ref::Util::is_plain_arrayref(%s)'
          : q{ref( %s ) eq 'ARRAY'};
  
      my $base_arrayref_check = sub {
          return sprintf( <<"EOF", ( $_[0] ) x 3 );
  (
      $ref_check
      ||
      (
          Scalar::Util::blessed( %s )
          && defined overload::Method( %s, '\@{}' )
      )
  )
  EOF
      };
  
      declare(
          'ArrayRef',
          type_class => 'Specio::Constraint::Parameterizable',
          parent     => t('Ref'),
          inline     => sub { $base_arrayref_check->( $_[1] ) },
          parameterized_inline_generator => sub {
              my $self      = shift;
              my $parameter = shift;
              my $val       = shift;
  
              return sprintf(
                  '( ( %s ) && ( List::Util::all { %s } @{ %s } ) )',
                  $base_arrayref_check->($val),
                  $parameter->inline_check('$_'),
                  $val,
              );
          }
      );
  }
  
  {
      my $ref_check
          = _HAS_REF_UTIL
          ? 'Ref::Util::is_plain_hashref(%s)'
          : q{ref( %s ) eq 'HASH'};
  
      my $base_hashref_check = sub {
          return sprintf( <<"EOF", ( $_[0] ) x 3 );
  (
      $ref_check
      ||
      (
          Scalar::Util::blessed( %s )
          && defined overload::Method( %s, '%%{}' )
      )
  )
  EOF
      };
  
      declare(
          'HashRef',
          type_class => 'Specio::Constraint::Parameterizable',
          parent     => t('Ref'),
          inline     => sub { $base_hashref_check->( $_[1] ) },
          parameterized_inline_generator => sub {
              my $self      = shift;
              my $parameter = shift;
              my $val       = shift;
  
              return sprintf(
                  '( ( %s ) && ( List::Util::all { %s } values %%{ %s } ) )',
                  $base_hashref_check->($val),
                  $parameter->inline_check('$_'),
                  $val,
              );
          }
      );
  }
  
  declare(
      'Maybe',
      type_class                     => 'Specio::Constraint::Parameterizable',
      parent                         => t('Item'),
      inline                         => sub {'1'},
      parameterized_inline_generator => sub {
          my $self      = shift;
          my $parameter = shift;
          my $val       = shift;
  
          return sprintf( <<'EOF', $val, $parameter->inline_check($val) );
  ( !defined( %s ) || ( %s ) )
  EOF
      },
  );
  
  1;
  
  # ABSTRACT: Implements type constraint objects for Perl's built-in types
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Specio::Library::Builtins - Implements type constraint objects for Perl's built-in types
  
  =head1 VERSION
  
  version 0.44
  
  =head1 DESCRIPTION
  
  This library provides a set of types parallel to those provided by Moose.
  
  The types are in the following hierarchy
  
    Item
        Bool
        Maybe (of `a)
        Undef
        Defined
            Value
                Str
                    Num
                        Int
                    ClassName
            Ref
                ScalarRef (of `a)
                ArrayRef (of `a)
                HashRef (of `a)
                CodeRef
                RegexpRef
                GlobRef
                FileHandle
                Object
  
  =head2 Item
  
  Accepts any value
  
  =head2 Bool
  
  Accepts a non-reference that is C<undef>, an empty string, C<0>, or C<1>. It
  also accepts any object which overloads boolification.
  
  =head2 Maybe (of `a)
  
  A parameterizable type which accepts C<undef> or the type C<`a>. If not
  parameterized this type will accept any value.
  
  =head2 Undef
  
  Only accepts C<undef>.
  
  =head2 Value
  
  Accepts any non-reference value.
  
  =head2 Str
  
  Accepts any non-reference value or an object which overloads stringification.
  
  =head2 Num
  
  Accepts nearly the same values as C<Scalar::Util::looks_like_number>, but does
  not accept numbers with leading or trailing spaces, infinities, or NaN. Also
  accepts an object which overloads numification.
  
  =head2 Int
  
  Accepts any integer value, or an object which overloads numification and
  numifies to an integer.
  
  =head2 ClassName
  
  Accepts any value which passes C<Str> where the string is a loaded package.
  
  =head2 Ref
  
  Accepts any reference.
  
  =head2 ScalarRef (of `a)
  
  Accepts a scalar reference or an object which overloads scalar
  dereferencing. If parameterized, the dereferenced value must be of type C<`a>.
  
  =head2 ArrayRef (of `a)
  
  Accepts a array reference or an object which overloads array dereferencing. If
  parameterized, the values in the arrayref must be of type C<`a>.
  
  =head2 HashRef (of `a)
  
  Accepts a hash reference or an object which overloads hash dereferencing. If
  parameterized, the values in the hashref must be of type C<`a>.
  
  =head2 CodeRef
  
  Accepts a code (sub) reference or an object which overloads code
  dereferencing.
  
  =head2 RegexpRef
  
  Accepts a regex object created by C<qr//> or an object which overloads
  regex interpolation.
  
  =head2 GlobRef
  
  Accepts a glob reference or an object which overloads glob dereferencing.
  
  =head2 FileHandle
  
  Accepts a glob reference which is an open file handle, any C<IO::Handle>
  Object or subclass, or an object which overloads glob dereferencing and
  returns a glob reference which is an open file handle.
  
  =head2 Object
  
  Accepts any blessed object.
  
  =head1 SUPPORT
  
  Bugs may be submitted at L<https://github.com/houseabsolute/Specio/issues>.
  
  I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
  
  =head1 SOURCE
  
  The source code repository for Specio can be found at L<https://github.com/houseabsolute/Specio>.
  
  =head1 AUTHOR
  
  Dave Rolsky <autarch@urth.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is Copyright (c) 2012 - 2019 by Dave Rolsky.
  
  This is free software, licensed under:
  
    The Artistic License 2.0 (GPL Compatible)
  
  The full text of the license can be found in the
  F<LICENSE> file included with this distribution.
  
  =cut
SPECIO_LIBRARY_BUILTINS

    $main::fatpacked{"Specio/Library/Numeric.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'SPECIO_LIBRARY_NUMERIC';
  package Specio::Library::Numeric;
  
  use strict;
  use warnings;
  
  our $VERSION = '0.44';
  
  use parent 'Specio::Exporter';
  
  use Specio::Declare;
  use Specio::Library::Builtins;
  
  declare(
      'PositiveNum',
      parent => t('Num'),
      inline => sub {
          return
              sprintf( <<'EOF', $_[0]->parent->inline_check( $_[1] ), $_[1] );
  (
      %s
      &&
      %s > 0
  )
  EOF
      },
  );
  
  declare(
      'PositiveOrZeroNum',
      parent => t('Num'),
      inline => sub {
          return
              sprintf( <<'EOF', $_[0]->parent->inline_check( $_[1] ), $_[1] );
  (
      %s
      &&
      %s >= 0
  )
  EOF
      },
  );
  
  declare(
      'PositiveInt',
      parent => t('Int'),
      inline => sub {
          return
              sprintf( <<'EOF', $_[0]->parent->inline_check( $_[1] ), $_[1] );
  (
      %s
      &&
      %s > 0
  )
  EOF
      },
  );
  
  declare(
      'PositiveOrZeroInt',
      parent => t('Int'),
      inline => sub {
          return
              sprintf( <<'EOF', $_[0]->parent->inline_check( $_[1] ), $_[1] );
  (
      %s
      &&
      %s >= 0
  )
  EOF
      },
  );
  
  declare(
      'NegativeNum',
      parent => t('Num'),
      inline => sub {
          return
              sprintf( <<'EOF', $_[0]->parent->inline_check( $_[1] ), $_[1] );
  (
      %s
      &&
      %s < 0
  )
  EOF
      },
  );
  
  declare(
      'NegativeOrZeroNum',
      parent => t('Num'),
      inline => sub {
          return
              sprintf( <<'EOF', $_[0]->parent->inline_check( $_[1] ), $_[1] );
  (
      %s
      &&
      %s <= 0
  )
  EOF
      },
  );
  
  declare(
      'NegativeInt',
      parent => t('Int'),
      inline => sub {
          return
              sprintf( <<'EOF', $_[0]->parent->inline_check( $_[1] ), $_[1] );
  (
      %s
      &&
      %s < 0
  )
  EOF
      },
  );
  
  declare(
      'NegativeOrZeroInt',
      parent => t('Int'),
      inline => sub {
          return
              sprintf( <<'EOF', $_[0]->parent->inline_check( $_[1] ), $_[1] );
  (
      %s
      &&
      %s <= 0
  )
  EOF
      },
  );
  
  declare(
      'SingleDigit',
      parent => t('Int'),
      inline => sub {
          return
              sprintf(
              <<'EOF', $_[0]->parent->inline_check( $_[1] ), ( $_[1] ) x 2 );
  (
      %s
      &&
      %s >= -9
      &&
      %s <= 9
  )
  EOF
      },
  );
  
  1;
  
  # ABSTRACT: Implements type constraint objects for some common numeric types
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Specio::Library::Numeric - Implements type constraint objects for some common numeric types
  
  =head1 VERSION
  
  version 0.44
  
  =head1 DESCRIPTION
  
  This library provides some additional string numeric for common cases.
  
  =head2 PositiveNum
  
  =head2 PositiveOrZeroNum
  
  =head2 PositiveInt
  
  =head2 PositiveOrZeroInt
  
  =head2 NegativeNum
  
  =head2 NegativeOrZeroNum
  
  =head2 NegativeInt
  
  =head2 NegativeOrZeroInt
  
  =head2 SingleDigit
  
  A single digit from -9 to 9.
  
  =head1 SUPPORT
  
  Bugs may be submitted at L<https://github.com/houseabsolute/Specio/issues>.
  
  I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
  
  =head1 SOURCE
  
  The source code repository for Specio can be found at L<https://github.com/houseabsolute/Specio>.
  
  =head1 AUTHOR
  
  Dave Rolsky <autarch@urth.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is Copyright (c) 2012 - 2019 by Dave Rolsky.
  
  This is free software, licensed under:
  
    The Artistic License 2.0 (GPL Compatible)
  
  The full text of the license can be found in the
  F<LICENSE> file included with this distribution.
  
  =cut
SPECIO_LIBRARY_NUMERIC

    $main::fatpacked{"Specio/Library/Perl.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'SPECIO_LIBRARY_PERL';
  package Specio::Library::Perl;
  
  use strict;
  use warnings;
  
  our $VERSION = '0.44';
  
  use parent 'Specio::Exporter';
  
  use Specio::Library::String;
  use version 0.83 ();
  
  use Specio::Declare;
  
  my $package_inline = sub {
      return sprintf( <<'EOF', $_[0]->parent->inline_check( $_[1] ), $_[1] );
  (
      %s
      &&
      %s =~ /\A[^\W\d]\w*(?:::\w+)*\z/
  )
  EOF
  };
  
  declare(
      'PackageName',
      parent => t('NonEmptyStr'),
      inline => $package_inline,
  );
  
  declare(
      'ModuleName',
      parent => t('NonEmptyStr'),
      inline => $package_inline,
  );
  
  declare(
      'DistName',
      parent => t('NonEmptyStr'),
      inline => sub {
          return
              sprintf( <<'EOF', $_[0]->parent->inline_check( $_[1] ), $_[1] );
  (
      %s
      &&
      %s =~ /\A[^\W\d]\w*(?:-\w+)*\z/
  )
  EOF
      },
  );
  
  declare(
      'Identifier',
      parent => t('NonEmptyStr'),
      inline => sub {
          return
              sprintf( <<'EOF', $_[0]->parent->inline_check( $_[1] ), $_[1] );
  (
      %s
      &&
      %s =~ /\A[^\W\d]\w*\z/
  )
  EOF
      },
  );
  
  declare(
      'SafeIdentifier',
      parent => t('Identifier'),
      inline => sub {
          return
              sprintf( <<'EOF', $_[0]->parent->inline_check( $_[1] ), $_[1] );
  (
      %s
      &&
      %s !~ /\A[_ab]\z/
  )
  EOF
      },
  );
  
  declare(
      'LaxVersionStr',
      parent => t('NonEmptyStr'),
      inline => sub {
          return
              sprintf( <<'EOF', $_[0]->parent->inline_check( $_[1] ), $_[1] );
  (
      %s
      &&
      version::is_lax(%s)
  )
  EOF
      },
  );
  
  declare(
      'StrictVersionStr',
      parent => t('NonEmptyStr'),
      inline => sub {
          return
              sprintf( <<'EOF', $_[0]->parent->inline_check( $_[1] ), $_[1] );
  (
      %s
      &&
      version::is_strict(%s)
  )
  EOF
      },
  );
  
  1;
  
  # ABSTRACT: Implements type constraint objects for some common Perl language things
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Specio::Library::Perl - Implements type constraint objects for some common Perl language things
  
  =head1 VERSION
  
  version 0.44
  
  =head1 DESCRIPTION
  
  This library provides some additional string types for common cases.
  
  =head2 PackageName
  
  A valid package name. Unlike the C<ClassName> constraint from the
  L<Specio::Library::Builtins> library, this package does not need to be loaded.
  
  This type does allow Unicode characters.
  
  =head2 ModuleName
  
  Same as C<PackageName>.
  
  =head2 DistName
  
  A valid distribution name like C<DBD-Pg> Basically this is the same as a
  package name with the double-colons replaced by dashes. Note that there are
  some historical distribution names that don't fit this pattern, like
  C<CGI.pm>.
  
  This type does allow Unicode characters.
  
  =head2 Identifier
  
  An L<Identifier|perldata/Variable names> is something that could be used as a
  symbol name or other identifier (filehandle, directory handle, subroutine
  name, format name, or label). It's what you put after the sigil (dollar sign,
  at sign, percent sign) in a variable name. Generally, it's a bunch of
  word characters not starting with a digit.
  
  This type does allow Unicode characters.
  
  =head2 SafeIdentifier
  
  This is just like an C<Identifier> but it excludes the single-character
  variables underscore (C<_>), C<a>< and C<b>, as these are special variables to
  the Perl interpreter.
  
  =head2 LaxVersionStr and StrictVersionStr
  
  Lax and strict version strings use the L<is_lax|version/is_lax> and
  L<is_strict|version/is_strict> methods from C<version> to check if the given
  string would be a valid lax or strict version. L<version::Internals> covers
  the details but basically: lax versions are everything you may do, and strict
  omit many of the usages best avoided.
  
  =head2 CREDITS
  
  Much of the code and docs for this library comes from MooseX::Types::Perl,
  written by Ricardo SIGNES <rjbs@cpan.org>.
  
  =head1 SUPPORT
  
  Bugs may be submitted at L<https://github.com/houseabsolute/Specio/issues>.
  
  I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
  
  =head1 SOURCE
  
  The source code repository for Specio can be found at L<https://github.com/houseabsolute/Specio>.
  
  =head1 AUTHOR
  
  Dave Rolsky <autarch@urth.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is Copyright (c) 2012 - 2019 by Dave Rolsky.
  
  This is free software, licensed under:
  
    The Artistic License 2.0 (GPL Compatible)
  
  The full text of the license can be found in the
  F<LICENSE> file included with this distribution.
  
  =cut
SPECIO_LIBRARY_PERL

    $main::fatpacked{"Specio/Library/String.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'SPECIO_LIBRARY_STRING';
  package Specio::Library::String;
  
  use strict;
  use warnings;
  
  our $VERSION = '0.44';
  
  use parent 'Specio::Exporter';
  
  use Specio::Declare;
  use Specio::Library::Builtins;
  
  declare(
      'NonEmptySimpleStr',
      parent => t('Str'),
      inline => sub {
          return
              sprintf(
              <<'EOF', $_[0]->parent->inline_check( $_[1] ), ( $_[1] ) x 3 );
  (
      %s
      &&
      length %s > 0
      &&
      length %s <= 255
      &&
      %s !~ /[\n\r\x{2028}\x{2029}]/
  )
  EOF
      },
  );
  
  declare(
      'NonEmptyStr',
      parent => t('Str'),
      inline => sub {
          return
              sprintf( <<'EOF', $_[0]->parent->inline_check( $_[1] ), $_[1] );
  (
      %s
      &&
      length %s
  )
  EOF
      },
  );
  
  declare(
      'SimpleStr',
      parent => t('Str'),
      inline => sub {
          return
              sprintf(
              <<'EOF', $_[0]->parent->inline_check( $_[1] ), ( $_[1] ) x 2 );
  (
      %s
      &&
      length %s <= 255
      &&
      %s !~ /[\n\r\x{2028}\x{2029}]/
  )
  EOF
      },
  );
  
  1;
  
  # ABSTRACT: Implements type constraint objects for some common string types
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Specio::Library::String - Implements type constraint objects for some common string types
  
  =head1 VERSION
  
  version 0.44
  
  =head1 DESCRIPTION
  
  This library provides some additional string types for common cases.
  
  =head2 NonEmptyStr
  
  A string which has at least one character.
  
  =head2 SimpleStr
  
  A string that is 255 characters or less with no vertical whitespace
  characters.
  
  =head2 NonEmptySimpleStr
  
  A non-empty string that is 255 characters or less with no vertical whitespace
  characters.
  
  =head1 SUPPORT
  
  Bugs may be submitted at L<https://github.com/houseabsolute/Specio/issues>.
  
  I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
  
  =head1 SOURCE
  
  The source code repository for Specio can be found at L<https://github.com/houseabsolute/Specio>.
  
  =head1 AUTHOR
  
  Dave Rolsky <autarch@urth.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is Copyright (c) 2012 - 2019 by Dave Rolsky.
  
  This is free software, licensed under:
  
    The Artistic License 2.0 (GPL Compatible)
  
  The full text of the license can be found in the
  F<LICENSE> file included with this distribution.
  
  =cut
SPECIO_LIBRARY_STRING

    $main::fatpacked{"Specio/Library/Structured.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'SPECIO_LIBRARY_STRUCTURED';
  package Specio::Library::Structured;
  
  use strict;
  use warnings;
  
  our $VERSION = '0.44';
  
  use parent 'Specio::Exporter';
  
  use Carp qw( confess );
  use List::Util ();
  use Scalar::Util qw( blessed );
  use Specio::Constraint::Structurable;
  use Specio::Declare;
  use Specio::Library::Builtins;
  use Specio::Library::Structured::Dict;
  use Specio::Library::Structured::Map;
  use Specio::Library::Structured::Tuple;
  use Specio::TypeChecks qw( does_role );
  
  ## no critic (Variables::ProtectPrivateVars)
  declare(
      'Dict',
      type_class => 'Specio::Constraint::Structurable',
      parent     => Specio::Library::Structured::Dict->parent,
      inline     => \&Specio::Library::Structured::Dict::_inline,
      parameterization_args_builder =>
          \&Specio::Library::Structured::Dict::_parameterization_args_builder,
      name_builder => \&Specio::Library::Structured::Dict::_name_builder,
      structured_inline_generator =>
          \&Specio::Library::Structured::Dict::_structured_inline_generator,
  );
  
  declare(
      'Map',
      type_class => 'Specio::Constraint::Structurable',
      parent     => Specio::Library::Structured::Map->parent,
      inline     => \&Specio::Library::Structured::Map::_inline,
      parameterization_args_builder =>
          \&Specio::Library::Structured::Map::_parameterization_args_builder,
      name_builder => \&Specio::Library::Structured::Map::_name_builder,
      structured_inline_generator =>
          \&Specio::Library::Structured::Map::_structured_inline_generator,
  );
  
  declare(
      'Tuple',
      type_class => 'Specio::Constraint::Structurable',
      parent     => Specio::Library::Structured::Tuple->parent,
      inline     => \&Specio::Library::Structured::Tuple::_inline,
      parameterization_args_builder =>
          \&Specio::Library::Structured::Tuple::_parameterization_args_builder,
      name_builder => \&Specio::Library::Structured::Tuple::_name_builder,
      structured_inline_generator =>
          \&Specio::Library::Structured::Tuple::_structured_inline_generator,
  );
  ## use critic
  
  sub optional {
      return { optional => shift };
  }
  
  sub slurpy {
      return { slurpy => shift };
  }
  
  ## no critic (Subroutines::ProhibitUnusedPrivateSubroutines)
  sub _also_export {qw( optional slurpy )}
  ## use critic
  
  1;
  
  # ABSTRACT: Structured types for Specio (Dict, Map, Tuple)
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Specio::Library::Structured - Structured types for Specio (Dict, Map, Tuple)
  
  =head1 VERSION
  
  version 0.44
  
  =head1 SYNOPSIS
  
      use Specio::Library::Builtins;
      use Specio::Library::String;
      use Specio::Library::Structured;
  
      my $map = t(
          'Map',
          of => {
              key   => t('NonEmptyStr'),
              value => t('Int'),
          },
      );
      my $tuple = t(
          'Tuple',
          of => [ t('Str'), t('Num') ],
      );
      my $dict = t(
          'Dict',
          of => {
              kv => {
                  name => t('Str'),
                  age  => t('Int'),
              },
          },
      );
  
  =head1 DESCRIPTION
  
  B<This particular library should be considered in an alpha state. The syntax
  for defining structured types may change, as well as some of the internals of
  its implementation.>
  
  This library provides a set of structured types for Specio, C<Dict>, C<Map>,
  and C<Tuple>. This library also exports two helper subs used for some types,
  C<optional> and C<slurpy>.
  
  All structured types are parameterized by calling C<< t( 'Type Name', of =>
  ... ) >>. The arguments passed after C<of> vary for each type.
  
  =head2 Dict
  
  A C<Dict> is a hashref with a well-defined set of keys and types for those
  key.
  
  The argument passed to C<of> should be a single hashref. That hashref must
  contain a C<kv> key defining the expected keys and the types for their
  values. This C<kv> value is itself a hashref. If a key/value pair is optional,
  use C<optional> around the I<type> for that key:
  
      my $person = t(
          'Dict',
          of => {
              kv => {
                  first  => t('NonEmptyStr'),
                  middle => optional( t('NonEmptyStr') ),
                  last   => t('NonEmptyStr'),
              },
          },
      );
  
  If a key is optional, then it can be omitted entirely, but if it passed then
  it's type will be checked, so it cannot just be set to C<undef>.
  
  You can also pass a C<slurpy> key. If this is passed, then the C<Dict> will
  allow other, unknown keys, as long as they match the specified type:
  
      my $person = t(
          'Dict',
          of => {
              kv => {
                  first  => t('NonEmptyStr'),
                  middle => optional( t('NonEmptyStr') ),
                  last   => t('NonEmptyStr'),
              },
              slurpy => t('Int'),
          },
      );
  
  =head2 Map
  
  A C<Map> is a hashref with specified types for its keys and values, but no
  well-defined key names.
  
  The argument passed to C<of> should be a single hashref with two keys, C<key>
  and C<value>. The type for the C<key> will typically be some sort of key, but
  if you're using a tied hash or an object with hash overloading it could
  conceivably be any sort of value.
  
  =head2 Tuple
  
  A C<Tuple> is an arrayref with a fixed set of members in a specific order.
  
  The argument passed to C<of> should be a single arrayref consisting of
  types. You can mark a slot in the C<Tuple> as optional by wrapping the type in
  a call to C<optional>:
  
      my $record = t(
          'Tuple',
          of => [
              t('PositiveInt'),
              t('Str'),
              optional( t('Num') ),
              optional( t('Num') ),
          ],
      );
  
  You can have as many C<optional> elements as you want, but they must always
  come in sequence at the end of the tuple definition. You cannot interleave
  required and optional elements.
  
  You can also make the Tuple accept an arbitrary number of values by wrapping
  the last type in a call to C<slurpy>:
  
      my $record = t(
          'Tuple',
          of => [
              t('PositiveInt'),
              t('Str'),
              slurpy( t('Num') ),
          ],
      );
  
  In this case, the C<Tuple> will require the first two elements and then allow
  any number (including zero) of C<Num> elements.
  
  You cannot mix C<optional> and C<slurpy> in a C<Tuple> definition.
  
  =for Pod::Coverage optional slurpy
  
  =head1 LIMITATIONS
  
  Currently all structured types require that the types they are structured with
  can be inlined. This may change in the future, but inlining all your types is
  a really good idea, so you should do that anyway.
  
  =head1 SUPPORT
  
  Bugs may be submitted at L<https://github.com/houseabsolute/Specio/issues>.
  
  I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
  
  =head1 SOURCE
  
  The source code repository for Specio can be found at L<https://github.com/houseabsolute/Specio>.
  
  =head1 AUTHOR
  
  Dave Rolsky <autarch@urth.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is Copyright (c) 2012 - 2019 by Dave Rolsky.
  
  This is free software, licensed under:
  
    The Artistic License 2.0 (GPL Compatible)
  
  The full text of the license can be found in the
  F<LICENSE> file included with this distribution.
  
  =cut
SPECIO_LIBRARY_STRUCTURED

    $main::fatpacked{"Specio/Library/Structured/Dict.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'SPECIO_LIBRARY_STRUCTURED_DICT';
  package Specio::Library::Structured::Dict;
  
  use strict;
  use warnings;
  
  our $VERSION = '0.44';
  
  use Carp qw( confess );
  use List::Util ();
  use Scalar::Util qw( blessed );
  use Specio::Helpers qw( perlstring );
  use Specio::Library::Builtins;
  use Specio::TypeChecks qw( does_role );
  
  my $hashref = t('HashRef');
  
  sub parent {$hashref}
  
  ## no critic (Subroutines::ProhibitUnusedPrivateSubroutines)
  sub _inline {
      $hashref->inline_check( $_[1] );
  }
  
  sub _parameterization_args_builder {
      my $self = shift;
      my $args = shift;
  
      for my $p ( ( $args->{slurpy} || () ), values %{ $args->{kv} } ) {
          my $type;
          if ( blessed($p) ) {
              $type = $p;
          }
          else {
              if ( ref $p eq 'HASH' && $p->{optional} ) {
                  $type = $p->{optional};
              }
              else {
                  confess
                      'Can only pass types, optional types, and slurpy types when defining a Dict';
              }
          }
  
          does_role( $type, 'Specio::Constraint::Role::Interface' )
              or confess
              'All parameters passed to ->parameterize must be objects which do the Specio::Constraint::Role::Interface role';
  
          confess
              'All parameters passed to ->parameterize must be inlinable constraints'
              unless $type->can_be_inlined;
      }
  
      return %{$args};
  }
  
  sub _name_builder {
      my $self = shift;
      my $p    = shift;
  
      ## no critic (Subroutines::ProtectPrivateSubs)
      my @kv;
      for my $k ( sort keys %{ $p->{kv} } ) {
          my $v = $p->{kv}{$k};
          if ( blessed($v) ) {
              push @kv, "$k => " . $self->_name_or_anon($v);
          }
          elsif ( $v->{optional} ) {
              push @kv,
                  "$k => " . $self->_name_or_anon( $v->{optional} ) . '?';
          }
      }
  
      if ( $p->{slurpy} ) {
          push @kv, $self->_name_or_anon( $p->{slurpy} ) . '...';
      }
  
      return 'Dict{ ' . ( join ', ', @kv ) . ' }';
  }
  
  sub _structured_inline_generator {
      my $self = shift;
      my $val  = shift;
      my %args = @_;
  
      my @code = sprintf( '( %s )', $hashref->_inline_check($val) );
  
      for my $k ( sort keys %{ $args{kv} } ) {
          my $p      = $args{kv}{$k};
          my $access = sprintf( '%s->{%s}', $val, perlstring($k) );
  
          if ( !blessed($p) ) {
              my $type = $p->{optional};
  
              push @code,
                  sprintf(
                  '( exists %s ? ( %s ) : 1 )',
                  $access, $type->_inline_check($access)
                  );
          }
          else {
              push @code, sprintf( '( %s )', $p->_inline_check($access) );
          }
      }
  
      if ( $args{slurpy} ) {
          my $check
              = '( do { my %%_____known_____ = map { $_ => 1 } ( %s ); List::Util::all { %s } grep { ! $_____known_____{$_} } sort keys %%{ %s } } )';
          push @code,
              sprintf(
              $check,
              ( join ', ', map { perlstring($_) } keys %{ $args{kv} } ),
              $args{slurpy}->_inline_check( sprintf( '%s->{$_}', $val ) ),
              $val,
              );
      }
  
      return '( ' . ( join ' && ', @code ) . ' )';
  }
  
  1;
  
  # ABSTRACT: Guts of Dict structured type
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Specio::Library::Structured::Dict - Guts of Dict structured type
  
  =head1 VERSION
  
  version 0.44
  
  =head1 DESCRIPTION
  
  There are no user facing parts here.
  
  =for Pod::Coverage .*
  
  =head1 SUPPORT
  
  Bugs may be submitted at L<https://github.com/houseabsolute/Specio/issues>.
  
  I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
  
  =head1 SOURCE
  
  The source code repository for Specio can be found at L<https://github.com/houseabsolute/Specio>.
  
  =head1 AUTHOR
  
  Dave Rolsky <autarch@urth.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is Copyright (c) 2012 - 2019 by Dave Rolsky.
  
  This is free software, licensed under:
  
    The Artistic License 2.0 (GPL Compatible)
  
  The full text of the license can be found in the
  F<LICENSE> file included with this distribution.
  
  =cut
SPECIO_LIBRARY_STRUCTURED_DICT

    $main::fatpacked{"Specio/Library/Structured/Map.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'SPECIO_LIBRARY_STRUCTURED_MAP';
  package Specio::Library::Structured::Map;
  
  use strict;
  use warnings;
  
  our $VERSION = '0.44';
  
  use Carp qw( confess );
  use List::Util ();
  use Specio::Library::Builtins;
  use Specio::TypeChecks qw( does_role );
  
  my $hashref = t('HashRef');
  
  sub parent {$hashref}
  
  ## no critic (Subroutines::ProhibitUnusedPrivateSubroutines)
  sub _inline {
      $hashref->inline_check( $_[1] );
  }
  
  sub _parameterization_args_builder {
      my $self = shift;
      my $args = shift;
  
      for my $k (qw( key value )) {
          does_role(
              $args->{$k},
              'Specio::Constraint::Role::Interface'
              )
              or confess
              qq{The "$k" parameter passed to ->parameterize must be one or more objects which do the Specio::Constraint::Role::Interface role};
  
          confess
              qq{The "$k" parameter passed to ->parameterize must be an inlinable constraint}
              unless $args->{$k}->can_be_inlined;
      }
      return map { $_ => $args->{$_} } qw( key value );
  }
  
  sub _name_builder {
      my $self = shift;
      my $p    = shift;
  
      ## no critic (Subroutines::ProtectPrivateSubs)
      return
            'Map{ '
          . $self->_name_or_anon( $p->{key} ) . ' => '
          . $self->_name_or_anon( $p->{value} ) . ' }';
  }
  
  sub _structured_inline_generator {
      my $self = shift;
      my $val  = shift;
      my %args = @_;
  
      my $code = <<'EOF';
  (
      ( %s )
      && ( List::Util::all { %s } keys %%{ %s } )
      && ( List::Util::all { %s } values %%{ %s } )
  )
  EOF
  
      return sprintf(
          $code,
          $hashref->_inline_check($val),
          $args{key}->inline_check('$_'),
          $val,
          $args{value}->inline_check('$_'),
          $val,
      );
  }
  
  1;
  
  # ABSTRACT: Guts of Map structured type
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Specio::Library::Structured::Map - Guts of Map structured type
  
  =head1 VERSION
  
  version 0.44
  
  =head1 DESCRIPTION
  
  There are no user facing parts here.
  
  =for Pod::Coverage .*
  
  =head1 SUPPORT
  
  Bugs may be submitted at L<https://github.com/houseabsolute/Specio/issues>.
  
  I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
  
  =head1 SOURCE
  
  The source code repository for Specio can be found at L<https://github.com/houseabsolute/Specio>.
  
  =head1 AUTHOR
  
  Dave Rolsky <autarch@urth.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is Copyright (c) 2012 - 2019 by Dave Rolsky.
  
  This is free software, licensed under:
  
    The Artistic License 2.0 (GPL Compatible)
  
  The full text of the license can be found in the
  F<LICENSE> file included with this distribution.
  
  =cut
SPECIO_LIBRARY_STRUCTURED_MAP

    $main::fatpacked{"Specio/Library/Structured/Tuple.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'SPECIO_LIBRARY_STRUCTURED_TUPLE';
  package Specio::Library::Structured::Tuple;
  
  use strict;
  use warnings;
  
  our $VERSION = '0.44';
  
  use Carp qw( confess );
  use List::Util ();
  use Scalar::Util qw( blessed );
  use Specio::Library::Builtins;
  use Specio::TypeChecks qw( does_role );
  
  my $arrayref = t('ArrayRef');
  
  sub parent {$arrayref}
  
  ## no critic (Subroutines::ProhibitUnusedPrivateSubroutines)
  sub _inline {
      $arrayref->inline_check( $_[1] );
  }
  
  sub _parameterization_args_builder {
      my $self = shift;
      my $args = shift;
  
      my $saw_slurpy;
      my $saw_optional;
      for my $p ( @{$args} ) {
          if ($saw_slurpy) {
              confess
                  'A Tuple cannot have any parameters after a slurpy parameter';
          }
          if ( $saw_optional && blessed($p) ) {
              confess
                  'A Tuple cannot have a non-optional parameter after an optional parameter';
          }
  
          my $type;
          if ( blessed($p) ) {
              $type = $p;
          }
          else {
              if ( ref $p eq 'HASH' ) {
                  if ( $p->{optional} ) {
                      $saw_optional = 1;
                      $type         = $p->{optional};
                  }
                  if ( $p->{slurpy} ) {
                      $saw_slurpy = 1;
                      $type       = $p->{slurpy};
                  }
              }
              else {
                  confess
                      'Can only pass types, optional types, and slurpy types when defining a Tuple';
              }
          }
  
          if ( $saw_optional && $saw_slurpy ) {
              confess
                  'Cannot defined a slurpy Tuple with optional slots as well';
          }
  
          does_role( $type, 'Specio::Constraint::Role::Interface' )
              or confess
              'All parameters passed to ->parameterize must be objects which do the Specio::Constraint::Role::Interface role';
  
          confess
              'All parameters passed to ->parameterize must be inlinable constraints'
              unless $type->can_be_inlined;
      }
  
      return ( of => $args );
  }
  
  sub _name_builder {
      my $self = shift;
      my $p    = shift;
  
      my @names;
      for my $m ( @{ $p->{of} } ) {
          ## no critic (Subroutines::ProtectPrivateSubs)
          if ( blessed($m) ) {
              push @names, $self->_name_or_anon($m);
          }
          elsif ( $m->{optional} ) {
              push @names, $self->_name_or_anon( $m->{optional} ) . '?';
          }
          elsif ( $m->{slurpy} ) {
              push @names, $self->_name_or_anon( $m->{slurpy} ) . '...';
          }
      }
  
      return 'Tuple[ ' . ( join ', ', @names ) . ' ]';
  }
  
  sub _structured_inline_generator {
      my $self = shift;
      my $val  = shift;
      my %args = @_;
  
      my @of = @{ $args{of} };
  
      my $slurpy;
      $slurpy = ( pop @of )->{slurpy}
          if !blessed( $of[-1] ) && $of[-1]->{slurpy};
  
      my @code = sprintf( '( %s )', $arrayref->_inline_check($val) );
  
      unless ($slurpy) {
          my $min = 0;
          my $max = 0;
          for my $p (@of) {
  
              # Unblessed values are optional.
              if ( blessed($p) ) {
                  $min++;
                  $max++;
              }
              else {
                  $max++;
              }
          }
  
          if ($min) {
              push @code,
                  sprintf(
                  '( @{ %s } >= %d && @{ %s } <= %d  )',
                  $val, $min, $val, $max
                  );
          }
      }
  
      for my $i ( 0 .. $#of ) {
          my $p      = $of[$i];
          my $access = sprintf( '%s->[%d]', $val, $i );
  
          if ( !blessed($p) ) {
              my $type = $p->{optional};
  
              push @code,
                  sprintf(
                  '( @{%s} >= %d ? ( %s ) : 1 )', $val, $i + 1,
                  $type->_inline_check($access)
                  );
          }
          else {
              push @code,
                  sprintf( '( %s )', $p->_inline_check($access) );
          }
      }
  
      if ($slurpy) {
          my $non_slurpy = scalar @of;
          my $check
              = '( @{%s} > %d ? ( List::Util::all { %s } @{%s}[%d .. $#{%s}] ) : 1 )';
          push @code,
              sprintf(
              $check,
              $val, $non_slurpy, $slurpy->_inline_check('$_'),
              $val, $non_slurpy, $val,
              );
      }
  
      return '( ' . ( join ' && ', @code ) . ' )';
  }
  
  1;
  
  # ABSTRACT: Guts of Tuple structured type
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Specio::Library::Structured::Tuple - Guts of Tuple structured type
  
  =head1 VERSION
  
  version 0.44
  
  =head1 DESCRIPTION
  
  There are no user facing parts here.
  
  =for Pod::Coverage .*
  
  =head1 SUPPORT
  
  Bugs may be submitted at L<https://github.com/houseabsolute/Specio/issues>.
  
  I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
  
  =head1 SOURCE
  
  The source code repository for Specio can be found at L<https://github.com/houseabsolute/Specio>.
  
  =head1 AUTHOR
  
  Dave Rolsky <autarch@urth.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is Copyright (c) 2012 - 2019 by Dave Rolsky.
  
  This is free software, licensed under:
  
    The Artistic License 2.0 (GPL Compatible)
  
  The full text of the license can be found in the
  F<LICENSE> file included with this distribution.
  
  =cut
SPECIO_LIBRARY_STRUCTURED_TUPLE

    $main::fatpacked{"Specio/OO.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'SPECIO_OO';
  package Specio::OO;
  
  use strict;
  use warnings;
  
  use Carp qw( confess );
  use List::Util qw( all );
  use MRO::Compat;
  use Role::Tiny;
  use Scalar::Util qw( weaken );
  use Specio::Helpers qw( perlstring );
  use Specio::PartialDump qw( partial_dump );
  use Specio::TypeChecks;
  use Storable qw( dclone );
  
  our $VERSION = '0.44';
  
  use Exporter qw( import );
  
  ## no critic (Modules::ProhibitAutomaticExportation)
  our @EXPORT = qw(
      clone
      _ooify
  );
  ## use critic
  
  ## no critic (Subroutines::ProhibitUnusedPrivateSubroutines)
  sub _ooify {
      my $class = shift;
  
      my $attrs = $class->_attrs;
      for my $name ( sort keys %{$attrs} ) {
          my $attr = $attrs->{$name};
  
          _inline_reader( $class, $name, $attr );
          _inline_predicate( $class, $name, $attr );
      }
  
      _inline_constructor($class);
  }
  ## use critic
  
  sub _inline_reader {
      my $class = shift;
      my $name  = shift;
      my $attr  = shift;
  
      my $reader;
      if ( $attr->{lazy} && ( my $builder = $attr->{builder} ) ) {
          my $source = <<'EOF';
  sub {
       unless ( exists $_[0]->{%s} ) {
           $_[0]->{%s} = $_[0]->%s;
           Scalar::Util::weaken( $_[0]->{%s} ) if %s && ref $_[0]->{%s};
       }
       $_[0]->{%s};
  }
  EOF
          $reader = sprintf(
              $source,
              $name,
              $name,
              $builder,
              $name,
              ( $attr->{weak_ref} ? 1 : 0 ),
              $name,
              $name,
          );
      }
      else {
          $reader = sprintf( 'sub { $_[0]->{%s} }', $name );
      }
  
      {
          ## no critic (TestingAndDebugging::ProhibitNoStrict)
          no strict 'refs';
          *{ $class . '::' . $name } = _eval_or_die(
              $reader, $class . '->' . $name,
          );
      }
  }
  
  sub _inline_predicate {
      my $class = shift;
      my $name  = shift;
      my $attr  = shift;
  
      return unless $attr->{predicate};
  
      my $predicate = "sub { exists \$_[0]->{$name} }";
  
      {
          ## no critic (TestingAndDebugging::ProhibitNoStrict)
          no strict 'refs';
          *{ $class . '::' . $attr->{predicate} } = _eval_or_die(
              $predicate, $class . '->' . $attr->{predicate},
          );
      }
  }
  
  my @RolesWithBUILD = qw( Specio::Constraint::Role::Interface );
  
  # This is an optimization to avoid calling this many times over:
  #
  #     Specio::TypeChecks->can( 'is_' . $attr->{isa} )
  my %TypeChecks;
  
  BEGIN {
      for my $sub (@Specio::TypeChecks::EXPORT_OK) {
          my ($type) = $sub =~ /^is_(.+)$/
              or next;
          $TypeChecks{$type} = Specio::TypeChecks->can($sub);
      }
  }
  
  sub _inline_constructor {
      my $class = shift;
  
      my @build_subs;
      for my $parent ( @{ mro::get_linear_isa($class) } ) {
          {
              ## no critic (TestingAndDebugging::ProhibitNoStrict)
              no strict 'refs';
              push @build_subs, $parent . '::BUILD'
                  if defined &{ $parent . '::BUILD' };
          }
      }
  
      # This is all a hack to avoid needing Class::Method::Modifiers to add a
      # BUILD from a role. We can't just call the method in the role "BUILD" or
      # it will be shadowed by a class's BUILD. So we give it a wacky unique
      # name. We need to explicitly know which roles have a _X_BUILD method
      # because Role::Tiny doesn't provide a way to list all the roles applied
      # to a class.
      for my $role (@RolesWithBUILD) {
          if ( Role::Tiny::does_role( $class, $role ) ) {
              ( my $build_name = $role ) =~ s/::/_/g;
              $build_name = q{_} . $build_name . '_BUILD';
              push @build_subs, $role . '::' . $build_name;
          }
      }
  
      my $constructor = <<'EOF';
  sub {
      my $class = shift;
  
      my %p = do {
          if ( @_ == 1 ) {
              if ( ref $_[0] eq 'HASH' ) {
                  %{ shift() };
              }
              else {
                  Specio::OO::_constructor_confess(
                      Specio::OO::_bad_args_message( $class, @_ ) );
              }
          }
          else {
              Specio::OO::_constructor_confess(
                  Specio::OO::_bad_args_message( $class, @_ ) )
                  if @_ % 2;
              @_;
          }
      };
  
      my $self = bless {}, $class;
  
  EOF
  
      my $attrs = $class->_attrs;
      for my $name ( sort keys %{$attrs} ) {
          my $attr     = $attrs->{$name};
          my $key_name = defined $attr->{init_arg} ? $attr->{init_arg} : $name;
  
          if ( $attr->{required} ) {
              $constructor .= <<"EOF";
      Specio::OO::_constructor_confess(
          "$class->new requires a $key_name argument.")
          unless exists \$p{$key_name};
  EOF
          }
  
          if ( $attr->{builder} && !$attr->{lazy} ) {
              my $builder = $attr->{builder};
              $constructor .= <<"EOF";
      \$p{$key_name} = $class->$builder unless exists \$p{$key_name};
  EOF
          }
  
          if ( $attr->{isa} ) {
              my $validator;
              if ( $TypeChecks{ $attr->{isa} } ) {
                  $validator
                      = 'Specio::TypeChecks::is_'
                      . $attr->{isa}
                      . "( \$p{$key_name} )";
              }
              else {
                  my $quoted_class = perlstring( $attr->{isa} );
                  $validator
                      = "Specio::TypeChecks::isa_class( \$p{$key_name}, $quoted_class )";
              }
  
              $constructor .= <<"EOF";
      if ( exists \$p{$key_name} && !$validator ) {
          Carp::confess(
              Specio::OO::_bad_value_message(
                  "The value you provided to $class->new for $key_name is not a valid $attr->{isa}.",
                  \$p{$key_name},
              )
          );
      }
  EOF
          }
  
          if ( $attr->{does} ) {
              my $quoted_role = perlstring( $attr->{does} );
              $constructor .= <<"EOF";
      if ( exists \$p{$key_name} && !Specio::TypeChecks::does_role( \$p{$key_name}, $quoted_role ) ) {
          Carp::confess(
              Specio::OO::_bad_value_message(
                  "The value you provided to $class->new for $key_name does not do the $attr->{does} role.",
                  \$p{$key_name},
              )
          );
      }
  EOF
          }
  
          if ( $attr->{weak_ref} ) {
              $constructor .= "    Scalar::Util::weaken( \$p{$key_name} );\n";
          }
  
          $constructor
              .= "    \$self->{$name} = \$p{$key_name} if exists \$p{$key_name};\n";
  
          $constructor .= "\n";
      }
  
      $constructor .= '    $self->' . $_ . "(\\%p);\n" for @build_subs;
      $constructor .= <<'EOF';
  
      return $self;
  }
  EOF
  
      {
          ## no critic (TestingAndDebugging::ProhibitNoStrict)
          no strict 'refs';
          *{ $class . '::new' } = _eval_or_die(
              $constructor, $class . '->new',
          );
      }
  }
  
  # This used to be done with Eval::Closure but that added a lot of unneeded
  # overhead. We're never actually eval'ing a closure, just plain source, so
  # doing it by hand is a worthwhile optimization.
  sub _eval_or_die {
      local $@ = undef;
      ## no critic (Variables::RequireInitializationForLocalVars)
      # $SIG{__DIE__} = undef causes warnings with 5.8.x
      local $SIG{__DIE__};
      ## no critic (BuiltinFunctions::ProhibitStringyEval)
      my $sub = eval <<"EOF";
  #line 1 "$_[1]"
  $_[0];
  EOF
      my $e = $@;
      die $e if $e;
      return $sub;
  }
  
  ## no critic (Subroutines::ProhibitUnusedPrivateSubroutines)
  sub _constructor_confess {
      local $Carp::CarpLevel = $Carp::CarpLevel + 1;
      confess shift;
  }
  
  sub _bad_args_message {
      my $class = shift;
  
      return
          "$class->new requires either a hashref or hash as arguments. You passed "
          . partial_dump(@_);
  }
  
  sub _bad_value_message {
      my $message = shift;
      my $value   = shift;
  
      return $message . ' You passed ' . partial_dump($value);
  }
  ## use critic
  
  my %BuiltinTypes = map { $_ => 1 } qw(
      SCALAR
      ARRAY
      HASH
      CODE
      REF
      GLOB
      LVALUE
      FORMAT
      IO
      VSTRING
      Regexp
  );
  
  sub clone {
      my $self = shift;
  
      # Attributes which provide a clone method are cloned by calling that
      # method on the _clone_ (not the original). This is primarily to allow us
      # to clone the coercions contained by a type in a way that doesn't lead to
      # circular clone (type clones coercions which in turn need to clone their
      # to/from types which in turn ...).
      my $attrs   = $self->_attrs;
      my %special = map { $_ => $attrs->{$_}{clone} }
          grep { $attrs->{$_}{clone} } keys %{$attrs};
  
      my $new;
      for my $key ( keys %{$self} ) {
          my $value = $self->{$key};
  
          if ( $special{$key} ) {
              $new->{$key} = $value;
              next;
          }
  
          # We need to special case arrays of Specio objects, as they may
          # contain code refs which cannot be cloned with dclone. Not using
          # blessed is a small optimization.
          if ( ( ref $value eq 'ARRAY' )
              && all { ( ref($_) || q{} ) =~ /Specio/ } @{$value} ) {
  
              $new->{$key} = [ map { $_->clone } @{$value} ];
              next;
          }
  
          # This is a weird hacky way of trying to avoid calling
          # Scalar::Util::blessed, which showed up as a hotspot in profiling of
          # loading DateTime. That's because we call ->clone a _lot_ (it's
          # called every time a type is exported).
          my $ref = ref $value;
          $new->{$key}
              = !$ref               ? $value
              : $ref eq 'CODE'      ? $value
              : $BuiltinTypes{$ref} ? dclone($value)
              :                       $value->clone;
      }
  
      bless $new, ( ref $self );
  
      for my $key ( keys %special ) {
          my $method = $special{$key};
          $new->{$key} = $new->$method;
      }
  
      return $new;
  }
  
  1;
  
  # ABSTRACT: A painfully poor reimplementation of Moo(se)
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Specio::OO - A painfully poor reimplementation of Moo(se)
  
  =head1 VERSION
  
  version 0.44
  
  =head1 DESCRIPTION
  
  Specio can't depend on Moo or Moose, so this module provides a terrible
  reimplementation of a small slice of their features.
  
  =for Pod::Coverage .*
  
  =head1 SUPPORT
  
  Bugs may be submitted at L<https://github.com/houseabsolute/Specio/issues>.
  
  I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
  
  =head1 SOURCE
  
  The source code repository for Specio can be found at L<https://github.com/houseabsolute/Specio>.
  
  =head1 AUTHOR
  
  Dave Rolsky <autarch@urth.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is Copyright (c) 2012 - 2019 by Dave Rolsky.
  
  This is free software, licensed under:
  
    The Artistic License 2.0 (GPL Compatible)
  
  The full text of the license can be found in the
  F<LICENSE> file included with this distribution.
  
  =cut
SPECIO_OO

    $main::fatpacked{"Specio/PartialDump.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'SPECIO_PARTIALDUMP';
  package Specio::PartialDump;
  
  use strict;
  use warnings;
  
  our $VERSION = '0.44';
  
  use Scalar::Util qw( looks_like_number reftype blessed );
  
  use Exporter qw( import );
  
  our @EXPORT_OK = qw( partial_dump );
  
  my $MaxLength   = 100;
  my $MaxElements = 6;
  my $MaxDepth    = 2;
  
  sub partial_dump {
      my (@args) = @_;
  
      my $dump
          = _should_dump_as_pairs(@args)
          ? _dump_as_pairs( 1, @args )
          : _dump_as_list( 1, @args );
  
      if ( length($dump) > $MaxLength ) {
          my $max_length = $MaxLength - 3;
          $max_length = 0 if $max_length < 0;
          substr( $dump, $max_length, length($dump) - $max_length ) = '...';
      }
  
      return $dump;
  }
  
  sub _should_dump_as_pairs {
      my (@what) = @_;
  
      return if @what % 2 != 0;    # must be an even list
  
      for ( my $i = 0; $i < @what; $i += 2 ) {
          return if ref $what[$i];    # plain strings are keys
      }
  
      return 1;
  }
  
  sub _dump_as_pairs {
      my ( $depth, @what ) = @_;
  
      my $truncated;
      if ( defined $MaxElements and ( @what / 2 ) > $MaxElements ) {
          $truncated = 1;
          @what = splice( @what, 0, $MaxElements * 2 );
      }
  
      return join(
          ', ', _dump_as_pairs_recursive( $depth, @what ),
          ( $truncated ? "..." : () )
      );
  }
  
  sub _dump_as_pairs_recursive {
      my ( $depth, @what ) = @_;
  
      return unless @what;
  
      my ( $key, $value, @rest ) = @what;
  
      return (
          ( _format_key( $depth, $key ) . ': ' . _format( $depth, $value ) ),
          _dump_as_pairs_recursive( $depth, @rest ),
      );
  }
  
  sub _dump_as_list {
      my ( $depth, @what ) = @_;
  
      my $truncated;
      if ( @what > $MaxElements ) {
          $truncated = 1;
          @what = splice( @what, 0, $MaxElements );
      }
  
      return join(
          ', ', ( map { _format( $depth, $_ ) } @what ),
          ( $truncated ? "..." : () )
      );
  }
  
  sub _format {
      my ( $depth, $value ) = @_;
  
      defined($value)
          ? (
          ref($value)
          ? (
                blessed($value)
              ? _format_object( $depth, $value )
              : _format_ref( $depth, $value )
              )
          : (
                looks_like_number($value)
              ? _format_number( $depth, $value )
              : _format_string( $depth, $value )
          )
          )
          : _format_undef( $depth, $value ),
  }
  
  sub _format_key {
      my ( undef, $key ) = @_;
      return $key;
  }
  
  sub _format_ref {
      my ( $depth, $ref ) = @_;
  
      if ( $depth > $MaxDepth ) {
          return overload::StrVal($ref);
      }
      else {
          my $reftype = reftype($ref);
          $reftype = 'SCALAR'
              if $reftype eq 'REF' || $reftype eq 'LVALUE';
          my $method = "_format_" . lc $reftype;
  
          if ( my $sub = __PACKAGE__->can($method) ) {
              return $sub->( $depth, $ref );
          }
          else {
              return overload::StrVal($ref);
          }
      }
  }
  
  sub _format_array {
      my ( $depth, $array ) = @_;
  
      my $class = blessed($array) || '';
      $class .= "=" if $class;
  
      return $class . "[ " . _dump_as_list( $depth + 1, @$array ) . " ]";
  }
  
  sub _format_hash {
      my ( $depth, $hash ) = @_;
  
      my $class = blessed($hash) || '';
      $class .= "=" if $class;
  
      return $class . "{ " . _dump_as_pairs(
          $depth + 1,
          map { $_ => $hash->{$_} } sort keys %$hash
      ) . " }";
  }
  
  sub _format_scalar {
      my ( $depth, $scalar ) = @_;
  
      my $class = blessed($scalar) || '';
      $class .= "=" if $class;
  
      return $class . "\\" . _format( $depth + 1, $$scalar );
  }
  
  sub _format_object {
      my ( $depth, $object ) = @_;
  
      return _format_ref( $depth, $object );
  }
  
  sub _format_string {
      my ( undef, $str ) = @_;
  
      # FIXME use String::Escape ?
  
      # remove vertical whitespace
      $str =~ s/\n/\\n/g;
      $str =~ s/\r/\\r/g;
  
      # reformat nonprintables
      $str =~ s/(\P{IsPrint})/"\\x{" . sprintf("%x", ord($1)) . "}"/ge;
  
      _quote($str);
  }
  
  sub _quote {
      my ($str) = @_;
  
      qq{"$str"};
  }
  
  sub _format_undef {"undef"}
  
  sub _format_number {
      my ( undef, $value ) = @_;
      return "$value";
  }
  
  # ABSTRACT: A partially rear-ended copy of Devel::PartialDump without prereqs
  
  1;
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Specio::PartialDump - A partially rear-ended copy of Devel::PartialDump without prereqs
  
  =head1 VERSION
  
  version 0.44
  
  =head1 SYNOPSIS
  
    use Specio::PartialDump qw( partial_dump );
  
    partial_dump( { foo => 42 } );
    partial_dump(qw( a b c d e f g ));
    partial_dump( foo => 42, bar => [ 1, 2, 3 ], );
  
  =head1 DESCRIPTION
  
  This is a copy of Devel::PartialDump with all the OO bits and prereqs
  removed. You may want to use this module in your own code to generate nicely
  formatted messages when a type constraint fails.
  
  This module optionally exports one sub, C<partial_dump>. This sub accepts any
  number of arguments. If given more than one, it will assume that it's either
  been given a list of key/value pairs (to build a hash) or a list of values (to
  build an array) and dump them appropriately. Objects and references are
  stringified in a sane way.
  
  =for Pod::Coverage partial_dump
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2008 by יובל קוג'מן (Yuval Kogman).
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =head1 SUPPORT
  
  Bugs may be submitted at L<https://github.com/houseabsolute/Specio/issues>.
  
  I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
  
  =head1 SOURCE
  
  The source code repository for Specio can be found at L<https://github.com/houseabsolute/Specio>.
  
  =head1 AUTHOR
  
  Dave Rolsky <autarch@urth.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is Copyright (c) 2012 - 2019 by Dave Rolsky.
  
  This is free software, licensed under:
  
    The Artistic License 2.0 (GPL Compatible)
  
  The full text of the license can be found in the
  F<LICENSE> file included with this distribution.
  
  =cut
SPECIO_PARTIALDUMP

    $main::fatpacked{"Specio/Registry.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'SPECIO_REGISTRY';
  package Specio::Registry;
  
  use strict;
  use warnings;
  
  use parent 'Exporter';
  
  our $VERSION = '0.44';
  
  use Carp qw( confess croak );
  
  our @EXPORT_OK
      = qw( exportable_types_for_package internal_types_for_package register );
  
  my %Registry;
  
  sub register {
      confess
          'register requires three or four arguments (package, name, type, [exportable])'
          unless @_ == 3 || @_ == 4;
  
      my $package    = shift;
      my $name       = shift;
      my $type       = shift;
      my $exportable = shift;
  
      croak "The $package package already has a type named $name"
          if $Registry{$package}{internal}{$name};
  
      # This is structured so that we can always return a _reference_ for
      # *_types_for_package. This means that the generated t sub sees any
      # changes to the registry as they happen. This is important inside a
      # package that is declaring new types. It needs to be able to see types it
      # has declared.
      $Registry{$package}{internal}{$name}   = $type;
      $Registry{$package}{exportable}{$name} = $type
          if $exportable;
  
      return;
  }
  
  sub exportable_types_for_package {
      my $package = shift;
  
      return $Registry{$package}{exportable} ||= {};
  }
  
  sub internal_types_for_package {
      my $package = shift;
  
      return $Registry{$package}{internal} ||= {};
  }
  
  1;
  
  # ABSTRACT: Implements the per-package type registry
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Specio::Registry - Implements the per-package type registry
  
  =head1 VERSION
  
  version 0.44
  
  =head1 DESCRIPTION
  
  There's nothing public here.
  
  =for Pod::Coverage .*
  
  =head1 SUPPORT
  
  Bugs may be submitted at L<https://github.com/houseabsolute/Specio/issues>.
  
  I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
  
  =head1 SOURCE
  
  The source code repository for Specio can be found at L<https://github.com/houseabsolute/Specio>.
  
  =head1 AUTHOR
  
  Dave Rolsky <autarch@urth.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is Copyright (c) 2012 - 2019 by Dave Rolsky.
  
  This is free software, licensed under:
  
    The Artistic License 2.0 (GPL Compatible)
  
  The full text of the license can be found in the
  F<LICENSE> file included with this distribution.
  
  =cut
SPECIO_REGISTRY

    $main::fatpacked{"Specio/Role/Inlinable.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'SPECIO_ROLE_INLINABLE';
  package Specio::Role::Inlinable;
  
  use strict;
  use warnings;
  
  our $VERSION = '0.44';
  
  use Eval::Closure qw( eval_closure );
  
  use Role::Tiny;
  
  requires '_build_description';
  
  {
      my $attrs = {
          _inline_generator => {
              is        => 'ro',
              isa       => 'CodeRef',
              predicate => '_has_inline_generator',
              init_arg  => 'inline_generator',
          },
          inline_environment => {
              is       => 'ro',
              isa      => 'HashRef',
              lazy     => 1,
              init_arg => 'inline_environment',
              builder  => '_build_inline_environment',
          },
          _generated_inline_sub => {
              is       => 'ro',
              isa      => 'CodeRef',
              init_arg => undef,
              lazy     => 1,
              builder  => '_build_generated_inline_sub',
          },
          declared_at => {
              is       => 'ro',
              isa      => 'Specio::DeclaredAt',
              required => 1,
          },
          description => {
              is       => 'ro',
              isa      => 'Str',
              init_arg => undef,
              lazy     => 1,
              builder  => '_build_description',
          },
      };
  
      ## no critic (Subroutines::ProhibitUnusedPrivateSubroutines)
      sub _attrs {
          return $attrs;
      }
  }
  
  # These are here for backwards compatibility. Some other packages that I wrote
  # may call the private methods.
  
  ## no critic (Subroutines::ProhibitUnusedPrivateSubroutines)
  sub _description        { $_[0]->description }
  sub _inline_environment { $_[0]->inline_environment }
  ## use critic
  
  sub can_be_inlined {
      my $self = shift;
  
      return $self->_has_inline_generator;
  }
  
  sub _build_generated_inline_sub {
      my $self = shift;
  
      my $source
          = 'sub { ' . $self->_inline_generator->( $self, '$_[0]' ) . '}';
  
      return eval_closure(
          source      => $source,
          environment => $self->inline_environment,
          description => 'inlined sub for ' . $self->description,
      );
  }
  
  sub _build_inline_environment {
      return {};
  }
  
  1;
  
  # ABSTRACT: A role for things which can be inlined (type constraints and coercions)
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Specio::Role::Inlinable - A role for things which can be inlined (type constraints and coercions)
  
  =head1 VERSION
  
  version 0.44
  
  =head1 DESCRIPTION
  
  This role implements a common API for inlinable things, type constraints and
  coercions. It is fully documented in the relevant classes.
  
  =for Pod::Coverage .*
  
  =head1 SUPPORT
  
  Bugs may be submitted at L<https://github.com/houseabsolute/Specio/issues>.
  
  I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
  
  =head1 SOURCE
  
  The source code repository for Specio can be found at L<https://github.com/houseabsolute/Specio>.
  
  =head1 AUTHOR
  
  Dave Rolsky <autarch@urth.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is Copyright (c) 2012 - 2019 by Dave Rolsky.
  
  This is free software, licensed under:
  
    The Artistic License 2.0 (GPL Compatible)
  
  The full text of the license can be found in the
  F<LICENSE> file included with this distribution.
  
  =cut
SPECIO_ROLE_INLINABLE

    $main::fatpacked{"Specio/Subs.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'SPECIO_SUBS';
  package Specio::Subs;
  
  use strict;
  use warnings;
  
  our $VERSION = '0.44';
  
  use Carp qw( croak );
  use Eval::Closure qw( eval_closure );
  use Module::Runtime qw( use_package_optimistically );
  use Specio::Library::Perl;
  use Specio::Registry qw( exportable_types_for_package );
  
  my $counter = 0;
  
  sub import {
      shift;
      my @libs = @_;
  
      my $caller = caller();
  
      my $ident = t('Identifier');
  
      use_package_optimistically($_) for @libs;
  
      for my $types ( map { exportable_types_for_package($_) } @libs ) {
          for my $name ( keys %{$types} ) {
              croak
                  qq{Cannot use '$name' type to create a check sub. It results in an invalid Perl subroutine name}
                  unless $ident->check( 'is_' . $name );
  
              _export_subs( $name, $types->{$name}, $caller );
          }
      }
  }
  
  sub _export_subs {
      my $name   = shift;
      my $type   = shift;
      my $caller = shift;
  
      _export_validation_subs( $name, $type, $caller );
  
      return unless $type->has_coercions;
  
      _export_coercion_subs( $name, $type, $caller );
  }
  
  sub _export_validation_subs {
      my $name   = shift;
      my $type   = shift;
      my $caller = shift;
  
      my $is_name     = 'is_' . $name;
      my $assert_name = 'assert_' . $name;
      if ( $type->can_be_inlined ) {
          _make_sub(
              $caller, $is_name,
              $type->inline_check('$_[0]')
          );
          _make_sub(
              $caller, $assert_name,
              $type->inline_assert('$_[0]')
          );
      }
      else {
          _install_sub(
              $caller, $is_name,
              sub { $type->value_is_valid( $_[0] ) }
          );
          _install_sub(
              $caller, $assert_name,
              sub { $type->validate_or_die( $_[0] ) }
          );
      }
  }
  
  sub _export_coercion_subs {
      my $name   = shift;
      my $type   = shift;
      my $caller = shift;
  
      my $to_name = 'to_' . $name;
      if ( $type->can_inline_coercion ) {
          _make_sub(
              $caller, $to_name,
              $type->inline_coercion('$_[0]')
          );
      }
      else {
          _install_sub(
              $caller, $to_name,
              sub { $type->coerce_value( $_[0] ) }
          );
      }
  
      my $force_name = 'force_' . $name;
      if ( $type->can_inline_coercion_and_check ) {
          _make_sub(
              $caller, $force_name,
              $type->inline_coercion_and_check('$_[0]')
          );
      }
      else {
          _install_sub(
              $caller, $force_name,
              sub {
                  my $val = $type->coerce_value( $_[0] );
                  $type->validate_or_die($val);
                  return $val;
              }
          );
      }
  }
  
  sub _make_sub {
      my $caller   = shift;
      my $sub_name = shift;
      my $source   = shift;
      my $env      = shift;
  
      my $sub = eval_closure(
          source      => 'sub { ' . $source . ' }',
          environment => $env,
          description => $caller . '::'
              . $sub_name
              . ' generated by '
              . __PACKAGE__,
      );
  
      _install_sub( $caller, $sub_name, $sub );
  
      return;
  }
  
  my $sub_namer = do {
      eval {
          require Sub::Util;
          Sub::Util->VERSION(1.40);
          Sub::Util->can('set_subname');
      } or eval {
          require Sub::Name;
          Sub::Name->can('subname');
      }
          or sub { return $_[1] };
  };
  
  my %Installed;
  
  sub _install_sub {
      my $caller   = shift;
      my $sub_name = shift;
      my $sub      = shift;
  
      my $fq_name = $caller . '::' . $sub_name;
  
      {
          ## no critic (TestingAndDebugging::ProhibitNoStrict)
          no strict 'refs';
          *{$fq_name} = $sub_namer->( $fq_name, $sub );
      }
  
      $Installed{$caller} ||= [];
      push @{ $Installed{$caller} }, $sub_name;
  
      return;
  }
  
  sub subs_installed_into {
      my $package = shift;
  
      return @{ $Installed{$package} || [] };
  }
  
  1;
  
  # ABSTRACT: Make validation and coercion subs from Specio types
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Specio::Subs - Make validation and coercion subs from Specio types
  
  =head1 VERSION
  
  version 0.44
  
  =head1 SYNOPSIS
  
    use Specio::Subs qw( Specio::Library::Builtins Specio::Library::Perl My::Lib );
  
    if ( is_PackageName($var) ) { ... }
  
    assert_Str($var);
  
    my $person1 = to_Person($var);
    my $person2 = force_Person($var);
  
  =head1 DESCRIPTION
  
  This module generates a set of helpful validation and coercion subroutines for
  all of the types defined in one or more libraries.
  
  To use it, simply import C<Specio::Subs> passing a list of one or more library
  names. This module will load those libraries as needed.
  
  If any of the types in any libraries have names that do not work as part of a
  Perl subroutine name, this module will throw an exception.
  
  If you have L<Sub::Util> or L<Sub::Name> installed, one of those will be used
  to name the generated subroutines.
  
  =head1 "EXPORTS"
  
  The following subs are created in the importing package:
  
  =head2 is_$type($value)
  
  This subroutine returns a boolean indicating whether or not the C<$value> is
  valid for the type.
  
  =head2 assert_$type($value)
  
  This subroutine dies if the C<$value> is not valid for the type.
  
  =head2 to_$type($value)
  
  This subroutine attempts to coerce C<$value> into the given type. If it cannot
  be coerced it returns the original C<$value>.
  
  This is only created if the type has coercions.
  
  =head2 force_$type($value)
  
  This subroutine attempts to coerce C<$value> into the given type, and dies if
  it cannot do so.
  
  This is only created if the type has coercions.
  
  =head1 ADDITIONAL API
  
  =for Pod::Coverage subs_installed_into
  
  This module has a subroutine named C<subs_installed_into>. It is not exported
  but it can be called by its fully qualified name. It accepts a single
  argument, a package name. It returns a list of subs that it generated and
  installed in the given package, if any.
  
  This exists to make it easy to write a type library that combines other
  library and generates helper subs for export all at once.
  
  =head1 SUPPORT
  
  Bugs may be submitted at L<https://github.com/houseabsolute/Specio/issues>.
  
  I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
  
  =head1 SOURCE
  
  The source code repository for Specio can be found at L<https://github.com/houseabsolute/Specio>.
  
  =head1 AUTHOR
  
  Dave Rolsky <autarch@urth.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is Copyright (c) 2012 - 2019 by Dave Rolsky.
  
  This is free software, licensed under:
  
    The Artistic License 2.0 (GPL Compatible)
  
  The full text of the license can be found in the
  F<LICENSE> file included with this distribution.
  
  =cut
SPECIO_SUBS

    $main::fatpacked{"Specio/TypeChecks.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'SPECIO_TYPECHECKS';
  package Specio::TypeChecks;
  
  use strict;
  use warnings;
  
  our $VERSION = '0.44';
  
  use Exporter qw( import );
  use Specio::Helpers qw( is_class_loaded );
  use Scalar::Util qw( blessed );
  
  our @EXPORT_OK = qw(
      does_role
      is_ArrayRef
      is_ClassName
      is_CodeRef
      is_HashRef
      is_Int
      is_Str
      isa_class
  );
  
  sub is_ArrayRef {
      return ref $_[0] eq 'ARRAY';
  }
  
  sub is_CodeRef {
      return ref $_[0] eq 'CODE';
  }
  
  sub is_HashRef {
      return ref $_[0] eq 'HASH';
  }
  
  sub is_Str {
      defined( $_[0] ) && !ref( $_[0] ) && ref( \$_[0] ) eq 'SCALAR'
          || ref( \( my $val = $_[0] ) eq 'SCALAR' );
  }
  
  sub is_Int {
      ( defined( $_[0] ) && !ref( $_[0] ) && ref( \$_[0] ) eq 'SCALAR'
              || ref( \( my $val = $_[0] ) eq 'SCALAR' ) )
          && $_[0] =~ /^[0-9]+$/;
  }
  
  sub is_ClassName {
      is_class_loaded( $_[0] );
  }
  
  sub isa_class {
      blessed( $_[0] ) && $_[0]->isa( $_[1] );
  }
  
  sub does_role {
      blessed( $_[0] ) && $_[0]->can('does') && $_[0]->does( $_[1] );
  }
  
  1;
  
  # ABSTRACT: Type checks used internally for Specio classes (it's not self-bootstrapping (yet?))
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Specio::TypeChecks - Type checks used internally for Specio classes (it's not self-bootstrapping (yet?))
  
  =head1 VERSION
  
  version 0.44
  
  =head1 DESCRIPTION
  
  There's nothing public here.
  
  =for Pod::Coverage .*
  
  =head1 SUPPORT
  
  Bugs may be submitted at L<https://github.com/houseabsolute/Specio/issues>.
  
  I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
  
  =head1 SOURCE
  
  The source code repository for Specio can be found at L<https://github.com/houseabsolute/Specio>.
  
  =head1 AUTHOR
  
  Dave Rolsky <autarch@urth.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is Copyright (c) 2012 - 2019 by Dave Rolsky.
  
  This is free software, licensed under:
  
    The Artistic License 2.0 (GPL Compatible)
  
  The full text of the license can be found in the
  F<LICENSE> file included with this distribution.
  
  =cut
SPECIO_TYPECHECKS

    $main::fatpacked{"String/Elide/Parts.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'STRING_ELIDE_PARTS';
  package String::Elide::Parts;
  
  our $DATE = '2017-01-29'; # DATE
  our $VERSION = '0.07'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  use Exporter;
  our @ISA = qw(Exporter);
  our @EXPORT_OK = qw(elide);
  
  sub _elide_part {
      my ($str, $len, $marker, $truncate) = @_;
  
      my $len_marker = length($marker);
      if ($len <= $len_marker) {
          return substr($marker, 0, $len);
      }
  
      if ($truncate eq 'left') {
          return $marker . substr($str, length($str) - $len+$len_marker);
      } elsif ($truncate eq 'middle') {
          my $left  = substr($str, 0,
                             ($len-$len_marker)/2);
          my $right = substr($str,
                             length($str) - ($len-$len_marker-length($left)));
          return $left . $marker . $right;
      } elsif ($truncate eq 'ends') {
          if ($len <= 2*$len_marker) {
              return substr($marker . $marker, 0, $len);
          }
          return $marker . substr($str, (length($str)-$len)/2 + $len_marker,
                                  $len-2*$len_marker) . $marker;
      } else { # right
          return substr($str, 0, $len-$len_marker) . $marker;
      }
  }
  
  sub elide {
      my ($str, $len, $opts) = @_;
  
      $opts //= {};
      my $truncate  = $opts->{truncate} // 'right';
      my $marker = $opts->{marker} // '..';
      my $default_prio = $opts->{default_prio} // 1;
  
      # split into parts by priority
      my @parts;
      my @parts_attrs;
      while ($str =~ m#<elspan([^>]*)>(.*?)</elspan>|(.*?)(?=<elspan)|(.*)#gs) {
          if (defined $1) {
              next unless length $2;
              push @parts, $2;
              push @parts_attrs, $1;
          } elsif (defined $3) {
              next unless length $3;
              push @parts, $3;
              push @parts_attrs, undef;
          } elsif (defined $4) {
              next unless length $4;
              push @parts, $4;
              push @parts_attrs, undef;
          }
      }
      return "" unless @parts && $len > 0;
      for my $i (0..@parts-1) {
          if (defined $parts_attrs[$i]) {
              my $attrs = {};
              $attrs->{truncate} = $1 // $2
                  if $parts_attrs[$i] =~ /\btruncate=(?:"([^"]*)"|(\S+))/;
              $attrs->{marker} = $1 // $2
                  if $parts_attrs[$i] =~ /\bmarker=(?:"([^"]*)"|(\S+))/;
              $attrs->{prio} = $1 // $2
                  if $parts_attrs[$i] =~ /\bprio(?:rity)?=(?:"([^"]*)"|(\S+))/;
              $parts_attrs[$i] = $attrs;
          } else {
              $parts_attrs[$i] = {prio=>$default_prio};
          }
      }
  
      #use DD; dd \@parts; dd \@parts_attrs;
  
      # elide and truncate prio by prio until str is short enough
    PRIO:
      while (1) {
          # (re)calculate total len of all parts
          my $all_parts_len = 0;
          $all_parts_len += length($_) for @parts;
  
          # total len of all parts is short enough, we're done
          if ($all_parts_len <= $len) {
              return join("", @parts);
          }
  
          # we still need to elide some parts. first collect part indexes that
          # have the current largest priority.
          my $highest_prio;
          for (@parts_attrs) {
              $highest_prio = $_->{prio} if !defined($highest_prio) ||
                  $highest_prio < $_->{prio};
          }
          my @high_indexes;
          my $high_parts_len = 0;
          for my $i (0..$#parts_attrs) {
              if ($parts_attrs[$i]{prio} == $highest_prio) {
                  $high_parts_len += length $parts[$i];
                  push @high_indexes, $i;
              }
          }
  
          if ($all_parts_len - $high_parts_len >= $len) {
              # we need to fully eliminate all the highest parts part then search
              # for another set of parts
              for (reverse @high_indexes) {
                  splice @parts, $_, 1;
                  splice @parts_attrs, $_, 1;
                  next PRIO;
              }
          }
  
          # elide all to-be-elided parts equally
  
          # after this position, must elide a total of this number of characters
          # after this position
          my @must_elide_total_len_after_this;
          my $tot_to_elide = $all_parts_len - $len;
          for my $i (0..$#high_indexes) {
              $must_elide_total_len_after_this[$i] =
                  int( ($i+1)/@high_indexes * $tot_to_elide );
          }
          #use DD; dd \@must_elide_total_len_after_this;
  
          # calculate how many characters to truncate for each part
          my $tot_already_elided = 0;
          my $tot_still_to_elide = 0;
          for my $i (reverse 0..$#high_indexes) {
              my $idx = $high_indexes[$i];
              my $part_len = length $parts[$idx];
              my $to_elide = $must_elide_total_len_after_this[$#high_indexes - $i] -
                  $tot_already_elided;
              #say "D:[", ($i+1), "/", ~~@high_indexes, "] must_elide_total_len_after_this=", $must_elide_total_len_after_this[$#high_indexes-$i], " to_elide=$to_elide";
              if ($to_elide <= 0) {
                  # leave this part alone
                  #say "D:  leave alone <$parts[$idx]>";
              } elsif ($part_len <= $to_elide) {
                  # we need to eliminate this part
                  #say "D:  eliminate <$parts[$idx]>";
                  splice @parts, $idx, 1;
                  splice @parts_attrs, $idx, 1;
                  $tot_already_elided += $part_len;
                  $tot_still_to_elide += ($to_elide - $part_len);
                  #say "D:  tot_already_elided=$tot_already_elided, tot_still_to_elide=$tot_still_to_elide";
              } else {
                  #say "D:  elide <$parts[$idx]>";
                  $parts[$idx] = _elide_part(
                      $parts[$idx],
                      $part_len - $to_elide,
                      $parts_attrs[$idx]{marker} // $marker,
                      $parts_attrs[$idx]{truncate} // $truncate,
                  );
                  #say "D:  elide result <$parts[$idx]>";
                  $tot_already_elided += $to_elide;
                  $tot_still_to_elide = 0;
                  #say "D:  tot_already_elided=$tot_already_elided, tot_still_to_elide=$tot_still_to_elide";
              }
          }
  
      } # while 1
  }
  
  1;
  # ABSTRACT: Elide a string with multiple parts of different priorities
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  String::Elide::Parts - Elide a string with multiple parts of different priorities
  
  =head1 VERSION
  
  This document describes version 0.07 of String::Elide::Parts (from Perl distribution String-Elide-Parts), released on 2017-01-29.
  
  =head1 SYNOPSIS
  
   use String::Elide::Parts qw(elide);
  
  Eliding string with no parts:
  
   my $text = "this is your brain";
   #                                            0----5---10---15---20
   elide($text, 16);                       # -> "this is your ..."
   elide($text, 16, {truncate=>"left"});   # -> "...is your brain"
   elide($text, 16, {truncate=>"middle"}); # -> "this is... brain"
   elide($text, 16, {truncate=>"ends"});   # -> "... is your b..."
  
   elide($text, 16, {marker=>"--"});       # -> "this is your b--"
  
  Eliding string with multiple parts marked with markup. We want to elide URL
  first (prio=3), then the C<Downloading> text (prio=2), then the speed (prio=1,
  default):
  
   $text = "<elspan prio=2>Downloading</elspan> <elspan prio=3 truncate=middle>http://www.example.com/somefile</elspan> 320.0k/5.5M";
   #                      0----5---10---15---20---25---30---35---40---45---50---55---60
   elide($text, 56); # -> "Downloading http://www.example.com/somefile 320.0k/5.5M"
   elide($text, 55); # -> "Downloading http://www.example.com/somefile 320.0k/5.5M"
   elide($text, 50); # -> "Downloading http://www.e..com/somefile 320.0k/5.5M"
   elide($text, 45); # -> "Downloading http://ww..m/somefile 320.0k/5.5M"
   elide($text, 40); # -> "Downloading http://..omefile 320.0k/5.5M"
   elide($text, 35); # -> "Downloading http..efile 320.0k/5.5M"
   elide($text, 30); # -> "Downloading ht..le 320.0k/5.5M"
   elide($text, 25); # -> "Downloading . 320.0k/5.5M"
   elide($text, 24); # -> "Downloading  320.0k/5.5M"
   elide($text, 23); # -> "Download..  320.0k/5.5M"
   elide($text, 20); # -> "Downl..  320.0k/5.5M"
   elide($text, 15); # -> "..  320.0k/5.5M"
   elide($text, 13); # -> "  320.0k/5.5M"
   elide($text, 10); # -> " 320.0k/.."
   elide($text,  5); # -> " 32.."
   #                      0----5---10---15---20---25---30---35---40---45---50---55---60
  
  =head1 DESCRIPTION
  
  String::Elide::Parts is similar to other string eliding modules, with one main
  difference: it accepts string marked with parts of different priorities. The
  goal is to retain more important information as much as possible when length is
  reduced.
  
  =head1 FUNCTIONS
  
  =head2 elide($str, $len[, \%opts]) => str
  
  Elide a string if length exceeds C<$len>.
  
  String can be marked with C<< <elspan prio=N truncate=T marker=M>...</elspan> >>
  so there can be multiple parts with different priorities and truncate direction.
  The default priority is 1. You can mark less important strings with higher
  priority to let it be elided first. The markup will be removed from the string
  before eliding.
  
  Known options:
  
  =over
  
  =item * marker => str (default: '..')
  
  =item * truncate => 'left'|'middle'|'middle'|'ends' (default: 'right')
  
  =item * default_prio => int (default: 1)
  
  =back
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/String-Elide-Parts>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-String-Elide-Parts>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=String-Elide-Parts>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  =head2 Similar elide modules
  
  L<Text::Elide> is simple, does not have many options, and elides at word
  boundaries.
  
  L<String::Truncate> has similar interface like String::Elide::Parts and has some
  options.
  
  L<String::Elide::Lines> is based on this module but works on a line-basis.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2017 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
STRING_ELIDE_PARTS

    $main::fatpacked{"String/Indent.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'STRING_INDENT';
  package String::Indent;
  
  our $DATE = '2015-03-06'; # DATE
  our $VERSION = '0.03'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  use Exporter;
  our @ISA = qw(Exporter);
  our @EXPORT_OK = qw(
                         indent
                 );
  
  sub indent {
      my ($indent, $str, $opts) = @_;
      $opts //= {};
  
      my $ibl = $opts->{indent_blank_lines} // 1;
      my $fli = $opts->{first_line_indent} // $indent;
      my $sli = $opts->{subsequent_lines_indent} // $indent;
      #say "D:ibl=<$ibl>, fli=<$fli>, sli=<$sli>";
  
      my $i = 0;
      $str =~ s/^([^\r\n]?)/$i++; !$ibl && !$1 ? "$1" : $i==1 ? "$fli$1" : "$sli$1"/egm;
      $str;
  }
  
  1;
  # ABSTRACT: String indenting routines
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  String::Indent - String indenting routines
  
  =head1 VERSION
  
  This document describes version 0.03 of String::Indent (from Perl distribution String-Indent), released on 2015-03-06.
  
  =head1 FUNCTIONS
  
  =head2 indent($indent, $str, \%opts) => STR
  
  Indent every line in $str with $indent. Example:
  
   indent('  ', "one\ntwo\nthree") # "  one\n  two\n  three"
  
  %opts is optional. Known options:
  
  =over 4
  
  =item * indent_blank_lines => bool (default: 1)
  
  If set to false, does not indent blank lines (i.e., lines containing only zero
  or more whitespaces).
  
  =item * first_line_indent => str
  
  If set, then the first line will be set to this instead of the normal indent.
  
  =item * subsequent_lines_indent => str
  
  If set, then all lines but the first line will be set to this instead of the
  normal indent.
  
  =back
  
  =head1 SEE ALSO
  
  L<Indent::String>, L<String::Nudge>
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/String-Indent>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-String-Indent>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=String-Indent>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2015 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
STRING_INDENT

    $main::fatpacked{"String/LineNumber.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'STRING_LINENUMBER';
  package String::LineNumber;
  
  our $DATE = '2014-12-10'; # DATE
  our $VERSION = '0.01'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  use Exporter;
  our @ISA = qw(Exporter);
  our @EXPORT_OK = qw(
                         linenum
                 );
  
  sub linenum {
      my ($str, $opts) = @_;
      $opts //= {};
      $opts->{width}      //= 4;
      $opts->{zeropad}    //= 0;
      $opts->{skip_empty} //= 1;
  
      my $i = 0;
      $str =~ s/^(([\t ]*\S)?.*)/
          sprintf(join("",
                       "%",
                       ($opts->{zeropad} && !($opts->{skip_empty}
                                                  && !defined($2)) ? "0" : ""),
                       $opts->{width}, "s",
                       "|%s"),
                  ++$i && $opts->{skip_empty} && !defined($2) ? "" : $i,
                  $1)/meg;
  
      $str;
  }
  
  1;
  # ABSTRACT: Give line number to each line of string
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  String::LineNumber - Give line number to each line of string
  
  =head1 VERSION
  
  This document describes version 0.01 of String::LineNumber (from Perl distribution String-LineNumber), released on 2014-12-10.
  
  =head1 FUNCTIONS
  
  =head2 linenum($str, \%opts) => STR
  
  Add line numbers. For example:
  
       1|line1
       2|line2
        |
       4|line4
  
  Known options:
  
  =over 4
  
  =item * width => INT (default: 4)
  
  =item * zeropad => BOOL (default: 0)
  
  If turned on, will output something like:
  
    0001|line1
    0002|line2
        |
    0004|line4
  
  =item * skip_empty => BOOL (default: 1)
  
  If set to false, keep printing line number even if line is empty:
  
       1|line1
       2|line2
       3|
       4|line4
  
  =back
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/String-LineNumber>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-String-LineNumber>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=String-LineNumber>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2014 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
STRING_LINENUMBER

    $main::fatpacked{"String/PerlQuote.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'STRING_PERLQUOTE';
  package String::PerlQuote;
  
  our $DATE = '2016-10-07'; # DATE
  our $VERSION = '0.02'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  use Exporter;
  our @ISA = qw(Exporter);
  our @EXPORT_OK = qw(
                         single_quote
                         double_quote
                 );
  
  # BEGIN COPY PASTE FROM Data::Dump
  my %esc = (
      "\a" => "\\a",
      "\b" => "\\b",
      "\t" => "\\t",
      "\n" => "\\n",
      "\f" => "\\f",
      "\r" => "\\r",
      "\e" => "\\e",
  );
  
  # put a string value in double quotes
  sub double_quote {
    local($_) = $_[0];
    # If there are many '"' we might want to use qq() instead
    s/([\\\"\@\$])/\\$1/g;
    return qq("$_") unless /[^\040-\176]/;  # fast exit
  
    s/([\a\b\t\n\f\r\e])/$esc{$1}/g;
  
    # no need for 3 digits in escape for these
    s/([\0-\037])(?!\d)/sprintf('\\%o',ord($1))/eg;
  
    s/([\0-\037\177-\377])/sprintf('\\x%02X',ord($1))/eg;
    s/([^\040-\176])/sprintf('\\x{%X}',ord($1))/eg;
  
    return qq("$_");
  }
  # END COPY PASTE FROM Data::Dump
  
  sub single_quote {
    local($_) = $_[0];
    s/([\\'])/\\$1/g;
    return qq('$_');
  }
  1;
  # ABSTRACT: Quote a string as Perl does
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  String::PerlQuote - Quote a string as Perl does
  
  =head1 VERSION
  
  This document describes version 0.02 of String::PerlQuote (from Perl distribution String-PerlQuote), released on 2016-10-07.
  
  =head1 FUNCTIONS
  
  =head2 double_quote($str) => STR
  
  Quote or encode C<$str> to the Perl double quote (C<">) literal representation
  of the string. Example:
  
   say double_quote("a");        # => "a"     (with the quotes)
   say double_quote("a\n");      # => "a\n"
   say double_quote('"');        # => "\""
   say double_quote('$foo');     # => "\$foo"
  
  This code is taken from C<quote()> in L<Data::Dump>. Maybe I didn't look more
  closely, but I couldn't a module that provides a function to do something like
  this. L<String::Escape>, for example, provides C<qqbackslash> but it does not
  escape C<$>.
  
  =head2 single_quote($str) => STR
  
  Like C<double_quote> but will produce a Perl single quote literal representation
  instead of the double quote ones. In single quotes, only literal backslash C<\>
  and single quote character C<'> are escaped, the rest are displayed as-is, so
  the result might span multiple lines or contain other non-printable characters.
  
   say single_quote("Mom's");    # => 'Mom\'s' (with the quotes)
   say single_quote("a\\");      # => 'a\\"
   say single_quote('"');        # => '"'
   say single_quote("\$foo");    # => '$foo'
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/String-PerlQuote>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-String-PerlQuote>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=String-PerlQuote>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
STRING_PERLQUOTE

    $main::fatpacked{"String/ShellQuote.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'STRING_SHELLQUOTE';
  # $Id: ShellQuote.pm,v 1.11 2010-06-11 20:08:57 roderick Exp $
  #
  # Copyright (c) 1997 Roderick Schertler.  All rights reserved.  This
  # program is free software; you can redistribute it and/or modify it
  # under the same terms as Perl itself.
  
  =head1 NAME
  
  String::ShellQuote - quote strings for passing through the shell
  
  =head1 SYNOPSIS
  
      $string = shell_quote @list;
      $string = shell_quote_best_effort @list;
      $string = shell_comment_quote $string;
  
  =head1 DESCRIPTION
  
  This module contains some functions which are useful for quoting strings
  which are going to pass through the shell or a shell-like object.
  
  =over
  
  =cut
  
  package String::ShellQuote;
  
  use strict;
  use vars qw($VERSION @ISA @EXPORT);
  
  require Exporter;
  
  $VERSION	= '1.04';
  @ISA		= qw(Exporter);
  @EXPORT		= qw(shell_quote shell_quote_best_effort shell_comment_quote);
  
  sub croak {
      require Carp;
      goto &Carp::croak;
  }
  
  sub _shell_quote_backend {
      my @in = @_;
      my @err = ();
  
      if (0) {
  	require RS::Handy;
  	print RS::Handy::data_dump(\@in);
      }
  
      return \@err, '' unless @in;
  
      my $ret = '';
      my $saw_non_equal = 0;
      foreach (@in) {
  	if (!defined $_ or $_ eq '') {
  	    $_ = "''";
  	    next;
  	}
  
  	if (s/\x00//g) {
  	    push @err, "No way to quote string containing null (\\000) bytes";
  	}
  
      	my $escape = 0;
  
  	# = needs quoting when it's the first element (or part of a
  	# series of such elements), as in command position it's a
  	# program-local environment setting
  
  	if (/=/) {
  	    if (!$saw_non_equal) {
  	    	$escape = 1;
  	    }
  	}
  	else {
  	    $saw_non_equal = 1;
  	}
  
  	if (m|[^\w!%+,\-./:=@^]|) {
  	    $escape = 1;
  	}
  
  	if ($escape
  		|| (!$saw_non_equal && /=/)) {
  
  	    # ' -> '\''
      	    s/'/'\\''/g;
  
  	    # make multiple ' in a row look simpler
  	    # '\'''\'''\'' -> '"'''"'
      	    s|((?:'\\''){2,})|q{'"} . (q{'} x (length($1) / 4)) . q{"'}|ge;
  
  	    $_ = "'$_'";
  	    s/^''//;
  	    s/''$//;
  	}
      }
      continue {
  	$ret .= "$_ ";
      }
  
      chop $ret;
      return \@err, $ret;
  }
  
  =item B<shell_quote> [I<string>]...
  
  B<shell_quote> quotes strings so they can be passed through the shell.
  Each I<string> is quoted so that the shell will pass it along as a
  single argument and without further interpretation.  If no I<string>s
  are given an empty string is returned.
  
  If any I<string> can't be safely quoted B<shell_quote> will B<croak>.
  
  =cut
  
  sub shell_quote {
      my ($rerr, $s) = _shell_quote_backend @_;
  
      if (@$rerr) {
      	my %seen;
      	@$rerr = grep { !$seen{$_}++ } @$rerr;
  	my $s = join '', map { "shell_quote(): $_\n" } @$rerr;
  	chomp $s;
  	croak $s;
      }
      return $s;
  }
  
  =item B<shell_quote_best_effort> [I<string>]...
  
  This is like B<shell_quote>, excpet if the string can't be safely quoted
  it does the best it can and returns the result, instead of dying.
  
  =cut
  
  sub shell_quote_best_effort {
      my ($rerr, $s) = _shell_quote_backend @_;
  
      return $s;
  }
  
  =item B<shell_comment_quote> [I<string>]
  
  B<shell_comment_quote> quotes the I<string> so that it can safely be
  included in a shell-style comment (the current algorithm is that a sharp
  character is placed after any newlines in the string).
  
  This routine might be changed to accept multiple I<string> arguments
  in the future.  I haven't done this yet because I'm not sure if the
  I<string>s should be joined with blanks ($") or nothing ($,).  Cast
  your vote today!  Be sure to justify your answer.
  
  =cut
  
  sub shell_comment_quote {
      return '' unless @_;
      unless (@_ == 1) {
  	croak "Too many arguments to shell_comment_quote "
  	    	    . "(got " . @_ . " expected 1)";
      }
      local $_ = shift;
      s/\n/\n#/g;
      return $_;
  }
  
  1;
  
  __END__
  
  =back
  
  =head1 EXAMPLES
  
      $cmd = 'fuser 2>/dev/null ' . shell_quote @files;
      @pids = split ' ', `$cmd`;
  
      print CFG "# Configured by: ",
  		shell_comment_quote($ENV{LOGNAME}), "\n";
  
  =head1 BUGS
  
  Only Bourne shell quoting is supported.  I'd like to add other shells
  (particularly cmd.exe), but I'm not familiar with them.  It would be a
  big help if somebody supplied the details.
  
  =head1 AUTHOR
  
  Roderick Schertler <F<roderick@argon.org>>
  
  =head1 SEE ALSO
  
  perl(1).
  
  =cut
STRING_SHELLQUOTE

    $main::fatpacked{"String/Wildcard/Bash.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'STRING_WILDCARD_BASH';
  package String::Wildcard::Bash;
  
  our $DATE = '2019-08-30'; # DATE
  our $VERSION = '0.043'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  use Exporter;
  our @ISA = qw(Exporter);
  our @EXPORT_OK = qw(
                         $RE_WILDCARD_BASH
                         contains_wildcard
                         convert_wildcard_to_sql
                         convert_wildcard_to_re
                 );
  
  our $re_bash_brace_element =
      qr(
            (?:(?:\\\\ | \\, | \\\{ | \\\} | [^\\\{,\}])*)
    )x;
  
  # note: order is important here, brace encloses the other
  our $RE_WILDCARD_BASH =
      qr(
            # non-escaped brace expression, with at least one comma
            (?P<bash_brace>
                (?<!\\)(?P<slashes_before_bash_brace>\\\\)*\{
                (?P<bash_brace_content>
                    $re_bash_brace_element(?:, $re_bash_brace_element )+
                )
                (?<!\\)(?:\\\\)*\}
            )
        |
            # non-escaped brace expression, to catch * or ? or [...] inside so
            # they don't go to below pattern, because bash doesn't consider them
            # wildcards, e.g. '/{et?,us*}' expands to '/etc /usr', but '/{et?}'
            # doesn't expand at all to /etc.
            (?P<literal_brace_single_element>
                (?<!\\)(?:\\\\)*\{
                $re_bash_brace_element
                (?<!\\)(?:\\\\)*\}
            )
        |
            (?P<bash_class>
                # non-empty, non-escaped character class
                (?<!\\)(?:\\\\)*\[
                (?:  \\\\ | \\\[ | \\\] | [^\\\[\]] )+
                (?<!\\)(?:\\\\)*\]
            )
        |
            (?P<bash_joker>
                # non-escaped * and ?
                (?<!\\)(?:\\\\)*(?:\*\*?|\?)
            )
        |
            (?P<sql_joker>
                # non-escaped % and ?
                (?<!\\)(?:\\\\)*[%_]
            )
        |
            (?P<literal>
                [^\\\[\]\{\}*?%_]+
            |
                .+?
            )
        )ox;
  
  sub contains_wildcard {
      my $str = shift;
  
      while ($str =~ /$RE_WILDCARD_BASH/go) {
          my %m = %+;
          return 1 if $m{bash_brace} || $m{bash_class} || $m{bash_joker};
      }
      0;
  }
  
  sub convert_wildcard_to_sql {
      my $opts = ref $_[0] eq 'HASH' ? shift : {};
      my $str = shift;
  
      my @res;
      my $p;
      while ($str =~ /$RE_WILDCARD_BASH/g) {
          my %m = %+;
          if (defined($p = $m{bash_brace_content})) {
              die "Cannot convert brace pattern '$p' to SQL";
          } elsif ($p = $m{bash_joker}) {
              if ($m{bash_joker} eq '*' || $m{bash_joker} eq '**') {
                  push @res, "%";
              } else {
                  push @res, "_";
              }
          } elsif ($p = $m{sql_joker}) {
              push @res, "\\$p";
          } elsif (defined($p = $m{literal_brace_single_element})) {
              die "Currently cannot convert brace literal '$p' to SQL";
          } elsif (defined($p = $m{bash_class})) {
              die "Currently cannot convert class pattern '$p' to SQL";
          } elsif (defined($p = $m{literal})) {
              push @res, $p;
          }
      }
  
      join "", @res;
  }
  
  sub convert_wildcard_to_re {
      my $opts = ref $_[0] eq 'HASH' ? shift : {};
      my $str = shift;
  
      my $opt_brace   = $opts->{brace} // 1;
      my $opt_dotglob = $opts->{dotglob} // 0;
  
      my @res;
      my $p;
      while ($str =~ /$RE_WILDCARD_BASH/g) {
          my %m = %+;
          if (defined($p = $m{bash_brace_content})) {
              push @res, quotemeta($m{slashes_before_bash_brace}) if
                  $m{slashes_before_bash_brace};
              if ($opt_brace) {
                  my @elems;
                  while ($p =~ /($re_bash_brace_element)(,|\z)/g) {
                      push @elems, $1;
                      last unless $2;
                  }
                  #use DD; dd \@elems;
                  push @res, "(?:", join("|", map {
                      convert_wildcard_to_re({
                          bash_brace => 0,
                          dotglob    => $opt_dotglob || @res,
                      }, $_)} @elems), ")";
              } else {
                  push @res, quotemeta($m{bash_brace});
              }
  
          } elsif (defined($p = $m{bash_joker})) {
              if ($p eq '?') {
                  push @res, '.';
              } elsif ($p eq '*') {
                  push @res, $opt_dotglob || @res ? '.*' : '[^.].*';
              } elsif ($p eq '**') {
                  push @res, '.*';
              }
  
          } elsif (defined($p = $m{literal_brace_single_element})) {
              push @res, quotemeta($p);
          } elsif (defined($p = $m{bash_class})) {
              # XXX no need to escape some characters?
              push @res, $p;
          } elsif (defined($p = $m{sql_joker})) {
              push @res, quotemeta($p);
          } elsif (defined($p = $m{literal})) {
              push @res, quotemeta($p);
          }
      }
  
      join "", @res;
  }
  
  1;
  # ABSTRACT: Bash wildcard string routines
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  String::Wildcard::Bash - Bash wildcard string routines
  
  =head1 VERSION
  
  This document describes version 0.043 of String::Wildcard::Bash (from Perl distribution String-Wildcard-Bash), released on 2019-08-30.
  
  =head1 SYNOPSIS
  
      use String::Wildcard::Bash qw(
          $RE_WILDCARD_BASH
          contains_wildcard
          convert_wildcard_to_sql
          convert_wildcard_to_re
      );
  
      say 1 if contains_wildcard(""));      # -> 0
      say 1 if contains_wildcard("ab*"));   # -> 1
      say 1 if contains_wildcard("ab\\*")); # -> 0
  
      say convert_wildcard_to_sql("foo*");  # -> "foo%"
  
      say convert_wildcard_to_re("foo*");   # -> "foo.*"
  
  =head1 DESCRIPTION
  
  =for Pod::Coverage ^(qqquote)$
  
  =head1 VARIABLES
  
  =head2 $RE_WILDCARD_BASH
  
  =head1 FUNCTIONS
  
  =head2 contains_wildcard
  
  Usage:
  
   $bool = contains_wildcard($wildcard_str)
  
  Return true if C<$str> contains wildcard pattern. Wildcard patterns include
  I<joker> such as C<*> (meaning zero or more of any characters) and C<?> (exactly
  one of any character), I<character class> C<[...]>, and I<brace> C<{...,}>
  (brace expansion). A pattern can be escaped using a bacslash so it becomes
  literal, e.g. C<foo\*> does not contain wildcard because it's C<foo> followed by
  a literal asterisk C<*>.
  
  Aside from the abovementioned wildcard patterns, bash does other types of
  expansions/substitutions too, but these are not considered wildcard. These
  include tilde expansion (e.g. C<~> becomes C</home/alice>), parameter and
  variable expansion (e.g. C<$0> and C<$HOME>), arithmetic expression (e.g.
  C<$[1+2]>), or history (C<!>).
  
  Although this module has 'Bash' in its name, this set of wildcards should be
  applicable to other Unix shells. Haven't checked completely though.
  
  For more specific needs, e.g. you want to check if a string just contains joker
  and not other types of wildcard patterns, use L</"$RE_WILDCARD_BASH"> directly.
  
  =head2 convert_wildcard_to_sql
  
  Usage:
  
   $sql_str = convert_wildcard_to_sql($wildcard_str);
  
  Convert bash wildcard to SQL pattern. This includes:
  
  =over
  
  =item * converting unescaped C<*> to C<%>
  
  =item * converting unescaped C<?> to C<_>
  
  =item * escaping unescaped C<%>
  
  =item * escaping unescaped C<_>
  
  =back
  
  Unsupported constructs will cause the function to die.
  
  =head2 convert_wildcard_to_re
  
  Usage:
  
   $re_str = convert_wildcard_to_re([ \%opts, ] $wildcard_str);
  
  Convert bash wildcard to regular expression string.
  
  Known options:
  
  =over
  
  =item * brace
  
  Bool. Default is true. Whether to expand braces or not. If set to false, will
  simply treat brace as literals.
  
  Examples:
  
   convert_wildcard_to_re(            "{a,b}"); # => "(?:a|b)"
   convert_wildcard_to_re({brace=>0}, "{a,b}"); # => "\\{a\\,b\\}"
  
  =item * dotglob
  
  Bool. Default is false. Whether joker C<*> (asterisk) will match a dot file. The
  default behavior follows bash; that is, dot file must be matched explicitly with
  C<.*>.
  
  This setting is similar to shell behavior (shopt) setting C<dotglob>.
  
  Examples:
  
   convert_wildcard_to_re({}          , '*a*'); # => "[^.].*a.*"
   convert_wildcard_to_re({dotglob=>1}, '*a*'); # => ".*a.*"
  
  =back
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/String-Wildcard-Bash>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-String-Wildcard-Bash>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=String-Wildcard-Bash>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Regexp::Wildcards> can also convert a string with wildcard pattern to
  equivalent regexp pattern, like L</convert_wildcard_to_re>. Can handle Unix
  wildcards as well as SQL and DOS/Win32. As of this writing (v1.05), it does not
  handle character class (C<[...]>) and interprets brace expansion differently
  than bash. String::Wildcard::Bash's C<convert_wildcard_to_re> follows bash
  behavior more closely and also provides more options.
  
  Other C<String::Wildcard::*> modules.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2019, 2015, 2014 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
STRING_WILDCARD_BASH

    $main::fatpacked{"Sub/Defer.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'SUB_DEFER';
  package Sub::Defer;
  use strict;
  use warnings;
  use Exporter qw(import);
  use Scalar::Util qw(weaken);
  use Carp qw(croak);
  
  our $VERSION = '2.006003';
  $VERSION = eval $VERSION;
  
  our @EXPORT = qw(defer_sub undefer_sub undefer_all);
  our @EXPORT_OK = qw(undefer_package defer_info);
  
  sub _getglob { no strict 'refs'; \*{$_[0]} }
  
  BEGIN {
    my $no_subname;
    *_subname
      = defined &Sub::Util::set_subname ? \&Sub::Util::set_subname
      : defined &Sub::Name::subname     ? \&Sub::Name::subname
      : (eval { require Sub::Util } && defined &Sub::Util::set_subname) ? \&Sub::Util::set_subname
      : (eval { require Sub::Name } && defined &Sub::Name::subname    ) ? \&Sub::Name::subname
      : ($no_subname = 1, sub { $_[1] });
    *_CAN_SUBNAME = $no_subname ? sub(){0} : sub(){1};
  }
  
  sub _name_coderef {
    shift if @_ > 2; # three args is (target, name, sub)
    _CAN_SUBNAME ? _subname(@_) : $_[1];
  }
  
  sub _install_coderef {
    my ($glob, $code) = (_getglob($_[0]), _name_coderef(@_));
    no warnings 'redefine';
    if (*{$glob}{CODE}) {
      *{$glob} = $code;
    }
    # perl will sometimes warn about mismatched prototypes coming from the
    # inheritance cache, so disable them if we aren't redefining a sub
    else {
      no warnings 'prototype';
      *{$glob} = $code;
    }
  }
  
  # We are dealing with three subs.  The first is the generator sub.  It is
  # provided by the user, so we cannot modify it.  When called, it generates the
  # undeferred sub.  This is also created, so it also cannot be modified.  These
  # are wrapped in a third sub.  The deferred sub is generated by us, and when
  # called it uses the generator sub to create the undeferred sub.  If it is a
  # named sub, it is installed in the symbol table, usually overwriting the
  # deferred sub.  From then on, the deferred sub will goto the undeferred sub
  # if it is called.
  #
  # In %DEFERRED we store array refs with information about these subs.  The key
  # is the stringified subref.  We have a CLONE method to fix this up in the
  # case of threading to deal with changing refaddrs.  The arrayrefs contain:
  #
  # 0. fully qualified sub name (or undef)
  # 1. generator sub
  # 2. options (attributes)
  # 3. scalar ref to undeferred sub (inner reference weakened)
  # 4. deferred sub (deferred only)
  # 5. info arrayref for undeferred sub (deferred only, after undefer)
  #
  # The deferred sub contains a strong reference to its info arrayref, and the
  # undeferred.
  
  our %DEFERRED;
  
  sub undefer_sub {
    my ($deferred) = @_;
    my $info = $DEFERRED{$deferred} or return $deferred;
    my ($target, $maker, $options, $undeferred_ref, $deferred_sub) = @$info;
  
    if (!(
      $deferred_sub && $deferred eq $deferred_sub
      || ${$undeferred_ref} && $deferred eq ${$undeferred_ref}
    )) {
      return $deferred;
    }
  
    return ${$undeferred_ref}
      if ${$undeferred_ref};
    ${$undeferred_ref} = my $made = $maker->();
  
    # make sure the method slot has not changed since deferral time
    if (defined($target) && $deferred eq *{_getglob($target)}{CODE}||'') {
      no warnings 'redefine';
  
      # I believe $maker already evals with the right package/name, so that
      # _install_coderef calls are not necessary --ribasushi
      *{_getglob($target)} = $made;
    }
    my $undefer_info = [ $target, $maker, $options, $undeferred_ref ];
    $info->[5] = $DEFERRED{$made} = $undefer_info;
    weaken ${$undefer_info->[3]};
  
    return $made;
  }
  
  sub undefer_all {
    undefer_sub($_) for keys %DEFERRED;
    return;
  }
  
  sub undefer_package {
    my $package = shift;
    undefer_sub($_)
      for grep {
        my $name = $DEFERRED{$_} && $DEFERRED{$_}[0];
        $name && $name =~ /^${package}::[^:]+$/
      } keys %DEFERRED;
    return;
  }
  
  sub defer_info {
    my ($deferred) = @_;
    my $info = $DEFERRED{$deferred||''} or return undef;
  
    my ($target, $maker, $options, $undeferred_ref, $deferred_sub) = @$info;
    if (!(
      $deferred_sub && $deferred eq $deferred_sub
      || ${$undeferred_ref} && $deferred eq ${$undeferred_ref}
    )) {
      delete $DEFERRED{$deferred};
      return undef;
    }
    [
      $target, $maker, $options,
      ( $undeferred_ref && $$undeferred_ref ? $$undeferred_ref : ()),
    ];
  }
  
  sub defer_sub {
    my ($target, $maker, $options) = @_;
    my $package;
    my $subname;
    ($package, $subname) = $target =~ /^(.*)::([^:]+)$/
      or croak "$target is not a fully qualified sub name!"
      if $target;
    $package ||= $options && $options->{package} || caller;
    my @attributes = @{$options && $options->{attributes} || []};
    if (@attributes) {
      /\A\w+(?:\(.*\))?\z/s || croak "invalid attribute $_"
        for @attributes;
    }
    my $deferred;
    my $undeferred;
    my $deferred_info = [ $target, $maker, $options, \$undeferred ];
    if (@attributes || $target && !_CAN_SUBNAME) {
      my $code
        =  q[#line ].(__LINE__+2).q[ "].__FILE__.qq["\n]
        . qq[package $package;\n]
        . ($target ? "sub $subname" : '+sub') . join('', map " :$_", @attributes)
        . q[ {
          package Sub::Defer;
          # uncoverable subroutine
          # uncoverable statement
          $undeferred ||= undefer_sub($deferred_info->[4]);
          goto &$undeferred; # uncoverable statement
          $undeferred; # fake lvalue return
        }]."\n"
        . ($target ? "\\&$subname" : '');
      my $e;
      $deferred = do {
        no warnings qw(redefine closure);
        local $@;
        eval $code or $e = $@; # uncoverable branch true
      };
      die $e if defined $e; # uncoverable branch true
    }
    else {
      # duplicated from above
      $deferred = sub {
        $undeferred ||= undefer_sub($deferred_info->[4]);
        goto &$undeferred;
      };
      _install_coderef($target, $deferred)
        if $target;
    }
    weaken($deferred_info->[4] = $deferred);
    weaken($DEFERRED{$deferred} = $deferred_info);
    return $deferred;
  }
  
  sub CLONE {
    %DEFERRED = map {
      defined $_ ? (
          $_->[4] ? ($_->[4] => $_)
        : ($_->[3] && ${$_->[3]}) ? (${$_->[3]} => $_)
        : ()
      ) : ()
    } values %DEFERRED;
  }
  
  1;
  __END__
  
  =head1 NAME
  
  Sub::Defer - Defer generation of subroutines until they are first called
  
  =head1 SYNOPSIS
  
   use Sub::Defer;
  
   my $deferred = defer_sub 'Logger::time_since_first_log' => sub {
      my $t = time;
      sub { time - $t };
   };
  
    Logger->time_since_first_log; # returns 0 and replaces itself
    Logger->time_since_first_log; # returns time - $t
  
  =head1 DESCRIPTION
  
  These subroutines provide the user with a convenient way to defer creation of
  subroutines and methods until they are first called.
  
  =head1 SUBROUTINES
  
  =head2 defer_sub
  
   my $coderef = defer_sub $name => sub { ... }, \%options;
  
  This subroutine returns a coderef that encapsulates the provided sub - when
  it is first called, the provided sub is called and is -itself- expected to
  return a subroutine which will be goto'ed to on subsequent calls.
  
  If a name is provided, this also installs the sub as that name - and when
  the subroutine is undeferred will re-install the final version for speed.
  
  Exported by default.
  
  =head3 Options
  
  A hashref of options can optionally be specified.
  
  =over 4
  
  =item package
  
  The package to generate the sub in.  Will be overridden by a fully qualified
  C<$name> option.  If not specified, will default to the caller's package.
  
  =item attributes
  
  The L<perlsub/Subroutine Attributes> to apply to the sub generated.  Should be
  specified as an array reference.
  
  =back
  
  =head2 undefer_sub
  
   my $coderef = undefer_sub \&Foo::name;
  
  If the passed coderef has been L<deferred|/defer_sub> this will "undefer" it.
  If the passed coderef has not been deferred, this will just return it.
  
  If this is confusing, take a look at the example in the L</SYNOPSIS>.
  
  Exported by default.
  
  =head2 defer_info
  
   my $data = defer_info $sub;
   my ($name, $generator, $options, $undeferred_sub) = @$data;
  
  Returns original arguments to defer_sub, plus the undeferred version if this
  sub has already been undeferred.
  
  Note that $sub can be either the original deferred version or the undeferred
  version for convenience.
  
  Not exported by default.
  
  =head2 undefer_all
  
   undefer_all();
  
  This will undefer all deferred subs in one go.  This can be very useful in a
  forking environment where child processes would each have to undefer the same
  subs.  By calling this just before you start forking children you can undefer
  all currently deferred subs in the parent so that the children do not have to
  do it.  Note this may bake the behavior of some subs that were intended to
  calculate their behavior later, so it shouldn't be used midway through a
  module load or class definition.
  
  Exported by default.
  
  =head2 undefer_package
  
    undefer_package($package);
  
  This undefers all deferred subs in a package.
  
  Not exported by default.
  
  =head1 SUPPORT
  
  See L<Sub::Quote> for support and contact information.
  
  =head1 AUTHORS
  
  See L<Sub::Quote> for authors.
  
  =head1 COPYRIGHT AND LICENSE
  
  See L<Sub::Quote> for the copyright and license.
  
  =cut
SUB_DEFER

    $main::fatpacked{"Sub/Delete.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'SUB_DELETE';
  use 5.008003;
  
  package Sub::Delete;
  
  $VERSION = '1.00002';
  @EXPORT = delete_sub;
  
use Exporter 5.57 'import';
  use constant point0 => 0+$] eq 5.01;
  
  # This sub must come before any lexical vars.
  sub strict_eval($) {
   local %^H if point0;
   local *@;
   use#
    strict 'vars';
   local $SIG{__WARN__} = sub {};
   eval shift
  }
  
  my %sigils = qw( SCALAR $  ARRAY @  HASH % );
  
  sub delete_sub {
  	my $sub = shift;
  	my($stashname, $key) = $sub =~ /(.*::)((?:(?!::).)*)\z/s
  		? ($1,$2) : (caller()."::", $sub);
  	exists +(my $stash = \%$stashname)->{$key} or return;
  	ref $stash->{$key} eq 'SCALAR' and  # perl5.10 constant
  		delete $stash->{$key}, return;
  	my $globname = "$stashname$key"; 
  	my $glob = *$globname; # autovivify the glob in case future perl
  	defined *$glob{CODE} or return;  # versions add new funny stuff
  	my $check_importedness
  	 = $stashname =~ /^(?:(?!\d)\w*(?:::\w*)*)\z/
  	   && $key    =~ /^(?!\d)\w+\z/;
  	my %imported_slots;
  	my $package;
  	if($check_importedness) {
  		$package = substr $stashname, 0, -2;
  		for (qw "SCALAR ARRAY HASH") {
  			defined *$glob{$_} or next;
  			$imported_slots{$_} = strict_eval
  			  "package $package; 0 && $sigils{$_}$key; 1"
  		}
  	}
          delete $stash->{$key};
  	keys %imported_slots == 1 and exists $imported_slots{SCALAR}
  	 and !$imported_slots{SCALAR} and Internals'SvREFCNT $$glob =>== 1
  	 and !defined *$glob{IO} and !defined *$glob{FORMAT}
  	 and return; # empty glob
  	my $newglob = \*$globname;
  	local *alias = *$newglob;
  	defined *$glob{$_} and (
  	 !$check_importedness || $imported_slots{$_}
  	  ? *$newglob
  	  : *alias
  	) = *$glob{$_}
  		for qw "SCALAR ARRAY HASH";
  	defined *$glob{$_} and *$newglob = *$glob{$_}
  		for qw "IO FORMAT";
  	return # nothing;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  Sub::Delete - Perl module enabling one to delete subroutines
  
  =head1 VERSION
  
  1.00002
  
  =head1 SYNOPSIS
  
      use Sub::Delete;
      sub foo {}
      delete_sub 'foo';
      eval 'foo();1' or die; # dies
  
  =head1 DESCRIPTION
  
  This module provides one function, C<delete_sub>, that deletes the
  subroutine whose name is passed to it. (To load the module without
  importing the function, write S<C<use Sub::Delete();>>.)
  
  This does more than simply undefine
  the subroutine in the manner of C<undef &foo>, which leaves a stub that
  can trigger AUTOLOAD (and, consequently, won't work for deleting methods).
  The subroutine is completely obliterated from the
  symbol table (though there may be
  references to it elsewhere, including in compiled code).
  
  =head1 PREREQUISITES
  
  This module requires L<perl> 5.8.3 or higher.
  
  =head1 LIMITATIONS
  
  If you take a reference to a glob containing a subroutine, and then delete
  the subroutine with C<delete_sub>, you will find that the glob you 
  referenced still has a subroutine in it. This is because C<delete_sub>
  removes a glob, replaces it with another, and then copies the contents of
  the old glob into the new one, except for the C<CODE> slot. (This is nearly
  impossible to fix without breaking constant::lexical.)
  
  =head1 BUGS
  
  If you find any bugs, please report them to the author via e-mail.
  
  =head1 AUTHOR & COPYRIGHT
  
  Copyright (C) 2008-10 Father Chrysostomos (sprout at, um, cpan dot org)
  
  This program is free software; you may redistribute or modify it (or both)
  under the same terms as perl.
  
  =head1 SEE ALSO
  
  L<perltodo>, which has C<delete &sub> listed as a possible future feature
  
  L<Symbol::Glob> and L<Symbol::Util>, both of which predate this module (but
  I only discovered them recently), and which allow one to delete any
  arbitrary slot from a glob. Neither of them takes perl 5.10 constants
  into account, however. They also both differ from this module, in that a
  subroutine referenced in compiled code can no longer be called if deleted
  from its glob. The entire glob must be replaced (which this module does).
  
  =cut
SUB_DELETE

    $main::fatpacked{"Sub/Exporter/Progressive.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'SUB_EXPORTER_PROGRESSIVE';
  package Sub::Exporter::Progressive;
  $Sub::Exporter::Progressive::VERSION = '0.001013';
  use strict;
  use warnings;
  
  # ABSTRACT: Only use Sub::Exporter if you need it
  
  sub _croak {
    require Carp;
    &Carp::croak;
  }
  
  sub import {
     my ($self, @args) = @_;
  
     my $inner_target = caller;
     my $export_data = sub_export_options($inner_target, @args);
  
     my $full_exporter;
     no strict 'refs';
     no warnings 'once';
     @{"${inner_target}::EXPORT_OK"} = @{$export_data->{exports}};
     @{"${inner_target}::EXPORT"} = @{$export_data->{defaults}};
     %{"${inner_target}::EXPORT_TAGS"} = %{$export_data->{tags}};
     *{"${inner_target}::import"} = sub {
        use strict;
        my ($self, @args) = @_;
  
        if ( grep {
           length ref $_
              or
           $_ !~ / \A [:-]? \w+ \z /xm
        } @args ) {
           _croak 'your usage of Sub::Exporter::Progressive requires Sub::Exporter to be installed'
              unless eval { require Sub::Exporter };
           $full_exporter ||= Sub::Exporter::build_exporter($export_data->{original});
  
           goto $full_exporter;
        } elsif ( defined( (my ($num) = grep { m/^\d/ } @args)[0] ) ) {
           _croak "cannot export symbols with a leading digit: '$num'";
        } else {
           require Exporter;
           s/ \A - /:/xm for @args;
           @_ = ($self, @args);
           goto \&Exporter::import;
        }
     };
     return;
  }
  
  my $too_complicated = <<'DEATH';
  You are using Sub::Exporter::Progressive, but the features your program uses from
  Sub::Exporter cannot be implemented without Sub::Exporter, so you might as well
  just use vanilla Sub::Exporter
  DEATH
  
  sub sub_export_options {
     my ($inner_target, $setup, $options) = @_;
  
     my @exports;
     my @defaults;
     my %tags;
  
     if ( ($setup||'') eq '-setup') {
        my %options = %$options;
  
        OPTIONS:
        for my $opt (keys %options) {
           if ($opt eq 'exports') {
  
              _croak $too_complicated if ref $options{exports} ne 'ARRAY';
              @exports = @{$options{exports}};
              _croak $too_complicated if grep { length ref $_ } @exports;
  
           } elsif ($opt eq 'groups') {
              %tags = %{$options{groups}};
              for my $tagset (values %tags) {
                 _croak $too_complicated if grep {
                    length ref $_
                       or
                    $_ =~ / \A - (?! all \b ) /x
                 } @{$tagset};
              }
              @defaults = @{$tags{default} || [] };
           } else {
              _croak $too_complicated;
           }
        }
        @{$_} = map { / \A  [:-] all \z /x ? @exports : $_ } @{$_} for \@defaults, values %tags;
        $tags{all} ||= [ @exports ];
        my %exports = map { $_ => 1 } @exports;
        my @errors = grep { not $exports{$_} } @defaults;
        _croak join(', ', @errors) . " is not exported by the $inner_target module\n" if @errors;
     }
  
     return {
        exports => \@exports,
        defaults => \@defaults,
        original => $options,
        tags => \%tags,
     };
  }
  
  1;
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Sub::Exporter::Progressive - Only use Sub::Exporter if you need it
  
  =head1 VERSION
  
  version 0.001013
  
  =head1 SYNOPSIS
  
   package Syntax::Keyword::Gather;
  
   use Sub::Exporter::Progressive -setup => {
     exports => [qw( break gather gathered take )],
     groups => {
       default => [qw( break gather gathered take )],
     },
   };
  
   # elsewhere
  
   # uses Exporter for speed
   use Syntax::Keyword::Gather;
  
   # somewhere else
  
   # uses Sub::Exporter for features
   use Syntax::Keyword::Gather 'gather', take => { -as => 'grab' };
  
  =head1 DESCRIPTION
  
  L<Sub::Exporter> is an incredibly powerful module, but with that power comes
  great responsibility, er- as well as some runtime penalties.  This module
  is a C<Sub::Exporter> wrapper that will let your users just use L<Exporter>
  if all they are doing is picking exports, but use C<Sub::Exporter> if your
  users try to use C<Sub::Exporter>'s more advanced features, like
  renaming exports, if they try to use them.
  
  Note that this module will export C<@EXPORT>, C<@EXPORT_OK> and
  C<%EXPORT_TAGS> package variables for C<Exporter> to work.  Additionally, if
  your package uses advanced C<Sub::Exporter> features like currying, this module
  will only ever use C<Sub::Exporter>, so you might as well use it directly.
  
  =head1 CONTRIBUTORS
  
  ilmari - Dagfinn Ilmari Mannsåker (cpan:ILMARI) <ilmari@ilmari.org>
  
  mst - Matt S. Trout (cpan:MSTROUT) <mst@shadowcat.co.uk>
  
  leont - Leon Timmermans (cpan:LEONT) <leont@cpan.org>
  
  =head1 AUTHOR
  
  Arthur Axel "fREW" Schmidt <Sub-Exporter-Progressive@afoolishmanifesto.com>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2016 by Arthur Axel "fREW" Schmidt.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
SUB_EXPORTER_PROGRESSIVE

    $main::fatpacked{"Sub/Quote.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'SUB_QUOTE';
  package Sub::Quote;
  
  sub _clean_eval { eval $_[0] }
  
  use strict;
  use warnings;
  
  use Sub::Defer qw(defer_sub);
  use Scalar::Util qw(weaken);
  use Exporter qw(import);
  use Carp qw(croak);
  BEGIN { our @CARP_NOT = qw(Sub::Defer) }
  use B ();
  BEGIN {
    *_HAVE_IS_UTF8 = defined &utf8::is_utf8 ? sub(){1} : sub(){0};
    *_HAVE_PERLSTRING = defined &B::perlstring ? sub(){1} : sub(){0};
    *_BAD_BACKSLASH_ESCAPE = _HAVE_PERLSTRING() && "$]" == 5.010_000 ? sub(){1} : sub(){0};
  }
  
  our $VERSION = '2.006003';
  $VERSION = eval $VERSION;
  
  our @EXPORT = qw(quote_sub unquote_sub quoted_from_sub qsub);
  our @EXPORT_OK = qw(quotify capture_unroll inlinify sanitize_identifier);
  
  our %QUOTED;
  
  my %escape;
  if (_BAD_BACKSLASH_ESCAPE) {
    %escape = (
      (map +(chr($_) => sprintf '\x%02x', $_), 0 .. 0x31, 0x7f),
      "\t" => "\\t",
      "\n" => "\\n",
      "\r" => "\\r",
      "\f" => "\\f",
      "\b" => "\\b",
      "\a" => "\\a",
      "\e" => "\\e",
      (map +($_ => "\\$_"), qw(" \ $ @)),
    );
  }
  
  sub quotify {
    my $value = $_[0];
    no warnings 'numeric';
    ! defined $value     ? 'undef()'
    # numeric detection
    : (!(_HAVE_IS_UTF8 && utf8::is_utf8($value))
      && length( (my $dummy = '') & $value )
      && 0 + $value eq $value
    ) ? (
      $value != $value ? (
        $value eq -CORE::sin(9**9**9)
          ? '(-CORE::sin(9**9**9))' # -nan
          : 'CORE::sin(9**9**9)'    # nan
      )
      : $value == 9**9**9 ? '(9**9**9)'      # inf
      : $value == -9**9**9 ? '(-9**9**9)'    # -inf
      : int($value) == $value ? $value       # integer
      : do {
        my $float = sprintf('%.20f', $value);
        $float =~ s/(\.[0-9]+?)0+\z/$1/;
        $float;
      }
    )
    : !length($value) && eval { use warnings 'FATAL' => 'numeric'; $value == 0 } ? '(!1)' # false
    : _BAD_BACKSLASH_ESCAPE && _HAVE_IS_UTF8 && utf8::is_utf8($value) ? do {
      $value =~ s/(["\$\@\\[:cntrl:]]|[^\x00-\x7f])/
        $escape{$1} || sprintf('\x{%x}', ord($1))
      /ge;
      qq["$value"];
    }
    : _HAVE_PERLSTRING ? B::perlstring($value)
    : qq["\Q$value\E"];
  }
  
  sub sanitize_identifier {
    my $name = shift;
    $name =~ s/([_\W])/sprintf('_%x', ord($1))/ge;
    $name;
  }
  
  sub capture_unroll {
    my ($from, $captures, $indent) = @_;
    join(
      '',
      map {
        /^([\@\%\$])/
          or croak "capture key should start with \@, \% or \$: $_";
        (' ' x $indent).qq{my ${_} = ${1}{${from}->{${\quotify $_}}};\n};
      } keys %$captures
    );
  }
  
  sub inlinify {
    my ($code, $args, $extra, $local) = @_;
    $args = '()'
      if !defined $args;
    my $do = 'do { '.($extra||'');
    if ($code =~ s/^(\s*package\s+([a-zA-Z0-9:]+);)//) {
      $do .= $1;
    }
    if ($code =~ s{
      \A((?:\#\ BEGIN\ quote_sub\ PRELUDE\n.*?\#\ END\ quote_sub\ PRELUDE\n)?\s*)
      (^\s*) my \s* \(([^)]+)\) \s* = \s* \@_;
    }{}xms) {
      my ($pre, $indent, $code_args) = ($1, $2, $3);
      $do .= $pre;
      if ($code_args ne $args) {
        $do .= $indent . 'my ('.$code_args.') = ('.$args.'); ';
      }
    }
    elsif ($local || $args ne '@_') {
      $do .= ($local ? 'local ' : '').'@_ = ('.$args.'); ';
    }
    $do.$code.' }';
  }
  
  sub quote_sub {
    # HOLY DWIMMERY, BATMAN!
    # $name => $code => \%captures => \%options
    # $name => $code => \%captures
    # $name => $code
    # $code => \%captures => \%options
    # $code
    my $options =
      (ref($_[-1]) eq 'HASH' and ref($_[-2]) eq 'HASH')
        ? pop
        : {};
    my $captures = ref($_[-1]) eq 'HASH' ? pop : undef;
    undef($captures) if $captures && !keys %$captures;
    my $code = pop;
    my $name = $_[0];
    if ($name) {
      my $subname = $name;
      my $package = $subname =~ s/(.*)::// ? $1 : caller;
      $name = join '::', $package, $subname;
      croak qq{package name "$package" too long!}
        if length $package > 252;
      croak qq{package name "$package" is not valid!}
        unless $package =~ /^[^\d\W]\w*(?:::\w+)*$/;
      croak qq{sub name "$subname" too long!}
        if length $subname > 252;
      croak qq{sub name "$subname" is not valid!}
        unless $subname =~ /^[^\d\W]\w*$/;
    }
    my @caller = caller(0);
    my ($attributes, $file, $line) = @{$options}{qw(attributes file line)};
    if ($attributes) {
      /\A\w+(?:\(.*\))?\z/s || croak "invalid attribute $_"
        for @$attributes;
    }
    my $quoted_info = {
      name     => $name,
      code     => $code,
      captures => $captures,
      package      => (exists $options->{package}      ? $options->{package}      : $caller[0]),
      hints        => (exists $options->{hints}        ? $options->{hints}        : $caller[8]),
      warning_bits => (exists $options->{warning_bits} ? $options->{warning_bits} : $caller[9]),
      hintshash    => (exists $options->{hintshash}    ? $options->{hintshash}    : $caller[10]),
      ($attributes ? (attributes => $attributes) : ()),
      ($file       ? (file => $file) : ()),
      ($line       ? (line => $line) : ()),
    };
    my $unquoted;
    weaken($quoted_info->{unquoted} = \$unquoted);
    if ($options->{no_defer}) {
      my $fake = \my $var;
      local $QUOTED{$fake} = $quoted_info;
      my $sub = unquote_sub($fake);
      Sub::Defer::_install_coderef($name, $sub) if $name && !$options->{no_install};
      return $sub;
    }
    else {
      my $deferred = defer_sub(
        ($options->{no_install} ? undef : $name),
        sub {
          $unquoted if 0;
          unquote_sub($quoted_info->{deferred});
        },
        {
          ($attributes ? ( attributes => $attributes ) : ()),
          ($name ? () : ( package => $quoted_info->{package} )),
        },
      );
      weaken($quoted_info->{deferred} = $deferred);
      weaken($QUOTED{$deferred} = $quoted_info);
      return $deferred;
    }
  }
  
  sub _context {
    my $info = shift;
    $info->{context} ||= do {
      my ($package, $hints, $warning_bits, $hintshash, $file, $line)
        = @{$info}{qw(package hints warning_bits hintshash file line)};
  
      $line ||= 1
        if $file;
  
      my $line_mark = '';
      if ($line) {
        $line_mark = "#line ".($line-1);
        if ($file) {
          $line_mark .= qq{ "$file"};
        }
        $line_mark .= "\n";
      }
  
      $info->{context}
        ="# BEGIN quote_sub PRELUDE\n"
        ."package $package;\n"
        ."BEGIN {\n"
        ."  \$^H = ".quotify($hints).";\n"
        ."  \${^WARNING_BITS} = ".quotify($warning_bits).";\n"
        ."  \%^H = (\n"
        . join('', map
        "    ".quotify($_)." => ".quotify($hintshash->{$_}).",\n",
          keys %$hintshash)
        ."  );\n"
        ."}\n"
        .$line_mark
        ."# END quote_sub PRELUDE\n";
    };
  }
  
  sub quoted_from_sub {
    my ($sub) = @_;
    my $quoted_info = $QUOTED{$sub||''} or return undef;
    my ($name, $code, $captures, $unquoted, $deferred)
      = @{$quoted_info}{qw(name code captures unquoted deferred)};
    $code = _context($quoted_info) . $code;
    $unquoted &&= $$unquoted;
    if (($deferred && $deferred eq $sub)
        || ($unquoted && $unquoted eq $sub)) {
      return [ $name, $code, $captures, $unquoted, $deferred ];
    }
    return undef;
  }
  
  sub unquote_sub {
    my ($sub) = @_;
    my $quoted_info = $QUOTED{$sub} or return undef;
    my $unquoted = $quoted_info->{unquoted};
    unless ($unquoted && $$unquoted) {
      my ($name, $code, $captures, $package, $attributes)
        = @{$quoted_info}{qw(name code captures package attributes)};
  
      ($package, $name) = $name =~ /(.*)::(.*)/
        if $name;
  
      my %captures = $captures ? %$captures : ();
      $captures{'$_UNQUOTED'} = \$unquoted;
      $captures{'$_QUOTED'} = \$quoted_info;
  
      my $make_sub
        = "{\n"
        . capture_unroll("\$_[1]", \%captures, 2)
        . "  package ${package};\n"
        . (
          $name
            # disable the 'variable $x will not stay shared' warning since
            # we're not letting it escape from this scope anyway so there's
            # nothing trying to share it
            ? "  no warnings 'closure';\n  sub ${name} "
            : "  \$\$_UNQUOTED = sub "
        )
        . ($attributes ? join('', map ":$_ ", @$attributes) : '') . "{\n"
        . "  (\$_QUOTED,\$_UNQUOTED) if 0;\n"
        . _context($quoted_info)
        . $code
        . "  }".($name ? "\n  \$\$_UNQUOTED = \\&${name}" : '') . ";\n"
        . "}\n"
        . "1;\n";
      if (my $debug = $ENV{SUB_QUOTE_DEBUG}) {
        if ($debug =~ m{^([^\W\d]\w*(?:::\w+)*(?:::)?)$}) {
          my $filter = $1;
          my $match
            = $filter =~ /::$/ ? $package.'::'
            : $filter =~ /::/  ? $package.'::'.($name||'__ANON__')
            : ($name||'__ANON__');
          warn $make_sub
            if $match eq $filter;
        }
        elsif ($debug =~ m{\A/(.*)/\z}s) {
          my $filter = $1;
          warn $make_sub
            if $code =~ $filter;
        }
        else {
          warn $make_sub;
        }
      }
      {
        no strict 'refs';
        local *{"${package}::${name}"} if $name;
        my ($success, $e);
        {
          local $@;
          $success = _clean_eval($make_sub, \%captures);
          $e = $@;
        }
        unless ($success) {
          my $space = length($make_sub =~ tr/\n//);
          my $line = 0;
          $make_sub =~ s/^/sprintf "%${space}d: ", ++$line/emg;
          croak "Eval went very, very wrong:\n\n${make_sub}\n\n$e";
        }
        weaken($QUOTED{$$unquoted} = $quoted_info);
      }
    }
    $$unquoted;
  }
  
  sub qsub ($) {
    goto &quote_sub;
  }
  
  sub CLONE {
    my @quoted = map { defined $_ ? (
      $_->{unquoted} && ${$_->{unquoted}} ? (${ $_->{unquoted} } => $_) : (),
      $_->{deferred} ? ($_->{deferred} => $_) : (),
    ) : () } values %QUOTED;
    %QUOTED = @quoted;
    weaken($_) for values %QUOTED;
  }
  
  1;
  __END__
  
  =encoding utf-8
  
  =head1 NAME
  
  Sub::Quote - Efficient generation of subroutines via string eval
  
  =head1 SYNOPSIS
  
   package Silly;
  
   use Sub::Quote qw(quote_sub unquote_sub quoted_from_sub);
  
   quote_sub 'Silly::kitty', q{ print "meow" };
  
   quote_sub 'Silly::doggy', q{ print "woof" };
  
   my $sound = 0;
  
   quote_sub 'Silly::dagron',
     q{ print ++$sound % 2 ? 'burninate' : 'roar' },
     { '$sound' => \$sound };
  
  And elsewhere:
  
   Silly->kitty;  # meow
   Silly->doggy;  # woof
   Silly->dagron; # burninate
   Silly->dagron; # roar
   Silly->dagron; # burninate
  
  =head1 DESCRIPTION
  
  This package provides performant ways to generate subroutines from strings.
  
  =head1 SUBROUTINES
  
  =head2 quote_sub
  
   my $coderef = quote_sub 'Foo::bar', q{ print $x++ . "\n" }, { '$x' => \0 };
  
  Arguments: ?$name, $code, ?\%captures, ?\%options
  
  C<$name> is the subroutine where the coderef will be installed.
  
  C<$code> is a string that will be turned into code.
  
  C<\%captures> is a hashref of variables that will be made available to the
  code.  The keys should be the full name of the variable to be made available,
  including the sigil.  The values should be references to the values.  The
  variables will contain copies of the values.  See the L</SYNOPSIS>'s
  C<Silly::dagron> for an example using captures.
  
  Exported by default.
  
  =head3 options
  
  =over 2
  
  =item C<no_install>
  
  B<Boolean>.  Set this option to not install the generated coderef into the
  passed subroutine name on undefer.
  
  =item C<no_defer>
  
  B<Boolean>.  Prevents a Sub::Defer wrapper from being generated for the quoted
  sub.  If the sub will most likely be called at some point, setting this is a
  good idea.  For a sub that will most likely be inlined, it is not recommended.
  
  =item C<package>
  
  The package that the quoted sub will be evaluated in.  If not specified, the
  package from sub calling C<quote_sub> will be used.
  
  =item C<hints>
  
  The value of L<< C<$^H> | perlvar/$^H >> to use for the code being evaluated.
  This captures the settings of the L<strict> pragma.  If not specified, the value
  from the calling code will be used.
  
  =item C<warning_bits>
  
  The value of L<< C<${^WARNING_BITS}> | perlvar/${^WARNING_BITS} >> to use for
  the code being evaluated.  This captures the L<warnings> set.  If not specified,
  the warnings from the calling code will be used.
  
  =item C<%^H>
  
  The value of L<< C<%^H> | perlvar/%^H >> to use for the code being evaluated.
  This captures additional pragma settings.  If not specified, the value from the
  calling code will be used if possible (on perl 5.10+).
  
  =item C<attributes>
  
  The L<perlsub/Subroutine Attributes> to apply to the sub generated.  Should be
  specified as an array reference.  The attributes will be applied to both the
  generated sub and the deferred wrapper, if one is used.
  
  =item C<file>
  
  The apparent filename to use for the code being evaluated.
  
  =item C<line>
  
  The apparent line number
  to use for the code being evaluated.
  
  =back
  
  =head2 unquote_sub
  
   my $coderef = unquote_sub $sub;
  
  Forcibly replace subroutine with actual code.
  
  If $sub is not a quoted sub, this is a no-op.
  
  Exported by default.
  
  =head2 quoted_from_sub
  
   my $data = quoted_from_sub $sub;
  
   my ($name, $code, $captures, $compiled_sub) = @$data;
  
  Returns original arguments to quote_sub, plus the compiled version if this
  sub has already been unquoted.
  
  Note that $sub can be either the original quoted version or the compiled
  version for convenience.
  
  Exported by default.
  
  =head2 inlinify
  
   my $prelude = capture_unroll '$captures', {
     '$x' => 1,
     '$y' => 2,
   }, 4;
  
   my $inlined_code = inlinify q{
     my ($x, $y) = @_;
  
     print $x + $y . "\n";
   }, '$x, $y', $prelude;
  
  Takes a string of code, a string of arguments, a string of code which acts as a
  "prelude", and a B<Boolean> representing whether or not to localize the
  arguments.
  
  =head2 quotify
  
   my $quoted_value = quotify $value;
  
  Quotes a single (non-reference) scalar value for use in a code string.  Numbers
  aren't treated specially and will be quoted as strings, but undef will quoted as
  C<undef()>.
  
  =head2 capture_unroll
  
   my $prelude = capture_unroll '$captures', {
     '$x' => 1,
     '$y' => 2,
   }, 4;
  
  Arguments: $from, \%captures, $indent
  
  Generates a snippet of code which is suitable to be used as a prelude for
  L</inlinify>.  C<$from> is a string will be used as a hashref in the resulting
  code.  The keys of C<%captures> are the names of the variables and the values
  are ignored.  C<$indent> is the number of spaces to indent the result by.
  
  =head2 qsub
  
   my $hash = {
    coderef => qsub q{ print "hello"; },
    other   => 5,
   };
  
  Arguments: $code
  
  Works exactly like L</quote_sub>, but includes a prototype to only accept a
  single parameter.  This makes it easier to include in hash structures or lists.
  
  Exported by default.
  
  =head2 sanitize_identifier
  
   my $var_name = '$variable_for_' . sanitize_identifier('@name');
   quote_sub qq{ print \$${var_name} }, { $var_name => \$value };
  
  Arguments: $identifier
  
  Sanitizes a value so that it can be used in an identifier.
  
  =head1 ENVIRONMENT
  
  =head2 SUB_QUOTE_DEBUG
  
  Causes code to be output to C<STDERR> before being evaled.  Several forms are
  supported:
  
  =over 4
  
  =item C<1>
  
  All subs will be output.
  
  =item C</foo/>
  
  Subs will be output if their code matches the given regular expression.
  
  =item C<simple_identifier>
  
  Any sub with the given name will be output.
  
  =item C<Full::identifier>
  
  A sub matching the full name will be output.
  
  =item C<Package::Name::>
  
  Any sub in the given package (including anonymous subs) will be output.
  
  =back
  
  =head1 CAVEATS
  
  Much of this is just string-based code-generation, and as a result, a few
  caveats apply.
  
  =head2 return
  
  Calling C<return> from a quote_sub'ed sub will not likely do what you intend.
  Instead of returning from the code you defined in C<quote_sub>, it will return
  from the overall function it is composited into.
  
  So when you pass in:
  
     quote_sub q{  return 1 if $condition; $morecode }
  
  It might turn up in the intended context as follows:
  
    sub foo {
  
      <important code a>
      do {
        return 1 if $condition;
        $morecode
      };
      <important code b>
  
    }
  
  Which will obviously return from foo, when all you meant to do was return from
  the code context in quote_sub and proceed with running important code b.
  
  =head2 pragmas
  
  C<Sub::Quote> preserves the environment of the code creating the
  quoted subs.  This includes the package, strict, warnings, and any
  other lexical pragmas.  This is done by prefixing the code with a
  block that sets up a matching environment.  When inlining C<Sub::Quote>
  subs, care should be taken that user pragmas won't effect the rest
  of the code.
  
  =head1 SUPPORT
  
  Users' IRC: #moose on irc.perl.org
  
  =for :html
  L<(click for instant chatroom login)|http://chat.mibbit.com/#moose@irc.perl.org>
  
  Development and contribution IRC: #web-simple on irc.perl.org
  
  =for :html
  L<(click for instant chatroom login)|http://chat.mibbit.com/#web-simple@irc.perl.org>
  
  Bugtracker: L<https://rt.cpan.org/Public/Dist/Display.html?Name=Sub-Quote>
  
  Git repository: L<git://github.com/moose/Sub-Quote.git>
  
  Git browser: L<https://github.com/moose/Sub-Quote>
  
  =head1 AUTHOR
  
  mst - Matt S. Trout (cpan:MSTROUT) <mst@shadowcat.co.uk>
  
  =head1 CONTRIBUTORS
  
  frew - Arthur Axel "fREW" Schmidt (cpan:FREW) <frioux@gmail.com>
  
  ribasushi - Peter Rabbitson (cpan:RIBASUSHI) <ribasushi@cpan.org>
  
  Mithaldu - Christian Walde (cpan:MITHALDU) <walde.christian@googlemail.com>
  
  tobyink - Toby Inkster (cpan:TOBYINK) <tobyink@cpan.org>
  
  haarg - Graham Knop (cpan:HAARG) <haarg@cpan.org>
  
  bluefeet - Aran Deltac (cpan:BLUEFEET) <bluefeet@gmail.com>
  
  ether - Karen Etheridge (cpan:ETHER) <ether@cpan.org>
  
  dolmen - Olivier Mengué (cpan:DOLMEN) <dolmen@cpan.org>
  
  alexbio - Alessandro Ghedini (cpan:ALEXBIO) <alexbio@cpan.org>
  
  getty - Torsten Raudssus (cpan:GETTY) <torsten@raudss.us>
  
  arcanez - Justin Hunter (cpan:ARCANEZ) <justin.d.hunter@gmail.com>
  
  kanashiro - Lucas Kanashiro (cpan:KANASHIRO) <kanashiro.duarte@gmail.com>
  
  djerius - Diab Jerius (cpan:DJERIUS) <djerius@cfa.harvard.edu>
  
  =head1 COPYRIGHT
  
  Copyright (c) 2010-2016 the Sub::Quote L</AUTHOR> and L</CONTRIBUTORS>
  as listed above.
  
  =head1 LICENSE
  
  This library is free software and may be distributed under the same terms
  as perl itself. See L<http://dev.perl.org/licenses/>.
  
  =cut
SUB_QUOTE

    $main::fatpacked{"Sub/Uplevel.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'SUB_UPLEVEL';
  package Sub::Uplevel;
  use 5.006;
  use strict;
  # ABSTRACT: apparently run a function in a higher stack frame
  
  our $VERSION = '0.2800';
  
  # Frame check global constant
  our $CHECK_FRAMES;
  BEGIN {
    $CHECK_FRAMES = !! $CHECK_FRAMES;
  }
  use constant CHECK_FRAMES => $CHECK_FRAMES;
  
  # We must override *CORE::GLOBAL::caller if it hasn't already been 
  # overridden or else Perl won't see our local override later.
  
  if ( not defined *CORE::GLOBAL::caller{CODE} ) {
    *CORE::GLOBAL::caller = \&_normal_caller;
  }
  
  # modules to force reload if ":aggressive" is specified
  my @reload_list = qw/Exporter Exporter::Heavy/;
  
  sub import {
    no strict 'refs'; ## no critic
    my ($class, @args) = @_;
    for my $tag ( @args, 'uplevel' ) {
      if ( $tag eq 'uplevel' ) {
        my $caller = caller(0);
        *{"$caller\::uplevel"} = \&uplevel;
      }
      elsif( $tag eq ':aggressive' ) {
        _force_reload( @reload_list );
      }
      else {
        die qq{"$tag" is not exported by the $class module\n}
      }
    }
    return;
  }
  
  sub _force_reload {
    no warnings 'redefine';
    local $^W = 0;
    for my $m ( @_ ) {
      $m =~ s{::}{/}g;
      $m .= ".pm";
      require $m if delete $INC{$m};
    }
  }
  
  #pod =head1 SYNOPSIS
  #pod
  #pod   use Sub::Uplevel;
  #pod
  #pod   sub foo {
  #pod       print join " - ", caller;
  #pod   }
  #pod
  #pod   sub bar {
  #pod       uplevel 1, \&foo;
  #pod   }
  #pod
  #pod   #line 11
  #pod   bar();    # main - foo.plx - 11
  #pod
  #pod =head1 DESCRIPTION
  #pod
  #pod Like Tcl's uplevel() function, but not quite so dangerous.  The idea
  #pod is just to fool caller().  All the really naughty bits of Tcl's
  #pod uplevel() are avoided.
  #pod
  #pod B<THIS IS NOT THE SORT OF THING YOU WANT TO DO EVERYDAY>
  #pod
  #pod =over 4
  #pod
  #pod =item B<uplevel>
  #pod
  #pod   uplevel $num_frames, \&func, @args;
  #pod
  #pod Makes the given function think it's being executed $num_frames higher
  #pod than the current stack level.  So when they use caller($frames) it
  #pod will actually give caller($frames + $num_frames) for them.
  #pod
  #pod C<uplevel(1, \&some_func, @_)> is effectively C<goto &some_func> but
  #pod you don't immediately exit the current subroutine.  So while you can't
  #pod do this:
  #pod
  #pod     sub wrapper {
  #pod         print "Before\n";
  #pod         goto &some_func;
  #pod         print "After\n";
  #pod     }
  #pod
  #pod you can do this:
  #pod
  #pod     sub wrapper {
  #pod         print "Before\n";
  #pod         my @out = uplevel 1, &some_func;
  #pod         print "After\n";
  #pod         return @out;
  #pod     }
  #pod
  #pod C<uplevel> has the ability to issue a warning if C<$num_frames> is more than
  #pod the current call stack depth, although this warning is disabled and compiled
  #pod out by default as the check is relatively expensive.
  #pod
  #pod To enable the check for debugging or testing, you should set the global
  #pod C<$Sub::Uplevel::CHECK_FRAMES> to true before loading Sub::Uplevel for the
  #pod first time as follows:
  #pod
  #pod     #!/usr/bin/perl
  #pod     
  #pod     BEGIN {
  #pod         $Sub::Uplevel::CHECK_FRAMES = 1;
  #pod     }
  #pod     use Sub::Uplevel;
  #pod
  #pod Setting or changing the global after the module has been loaded will have
  #pod no effect.
  #pod
  #pod =cut
  
  # @Up_Frames -- uplevel stack
  # $Caller_Proxy -- whatever caller() override was in effect before uplevel
  our (@Up_Frames, $Caller_Proxy);
  
  sub _apparent_stack_height {
      my $height = 1; # start above this function 
      while ( 1 ) {
          last if ! defined scalar $Caller_Proxy->($height);
          $height++;
      }
      return $height - 1; # subtract 1 for this function
  }
  
  sub uplevel {
      # Backwards compatible version of "no warnings 'redefine'"
      my $old_W = $^W;
      $^W = 0;
  
      # Update the caller proxy if the uplevel override isn't in effect
      local $Caller_Proxy = *CORE::GLOBAL::caller{CODE}
          if *CORE::GLOBAL::caller{CODE} != \&_uplevel_caller;
      local *CORE::GLOBAL::caller = \&_uplevel_caller;
  
      # Restore old warnings state
      $^W = $old_W;
  
      if ( CHECK_FRAMES and $_[0] >= _apparent_stack_height() ) {
        require Carp;
        Carp::carp("uplevel $_[0] is more than the caller stack");
      }
  
      local @Up_Frames = (shift, @Up_Frames );
  
      my $function = shift;
      return $function->(@_);
  }
  
  sub _normal_caller (;$) { ## no critic Prototypes
      my ($height) = @_;
      $height++;
      my @caller = CORE::caller($height);
      if ( CORE::caller() eq 'DB' ) {
          # Oops, redo picking up @DB::args
          package DB;
          @caller = CORE::caller($height);
      }
  
      return if ! @caller;                  # empty
      return $caller[0] if ! wantarray;     # scalar context
      return @_ ? @caller : @caller[0..2];  # extra info or regular
  }
  
  sub _uplevel_caller (;$) { ## no critic Prototypes
      my $height = $_[0] || 0;
  
      # shortcut if no uplevels have been called
      # always add +1 to CORE::caller (proxy caller function)
      # to skip this function's caller
      return $Caller_Proxy->( $height + 1 ) if ! @Up_Frames;
  
  #pod =begin _private
  #pod
  #pod So it has to work like this:
  #pod
  #pod     Call stack               Actual     uplevel 1
  #pod CORE::GLOBAL::caller
  #pod Carp::short_error_loc           0
  #pod Carp::shortmess_heavy           1           0
  #pod Carp::croak                     2           1
  #pod try_croak                       3           2
  #pod uplevel                         4            
  #pod function_that_called_uplevel    5            
  #pod caller_we_want_to_see           6           3
  #pod its_caller                      7           4
  #pod
  #pod So when caller(X) winds up below uplevel(), it only has to use  
  #pod CORE::caller(X+1) (to skip CORE::GLOBAL::caller).  But when caller(X)
  #pod winds up no or above uplevel(), it's CORE::caller(X+1+uplevel+1).
  #pod
  #pod Which means I'm probably going to have to do something nasty like walk
  #pod up the call stack on each caller() to see if I'm going to wind up   
  #pod before or after Sub::Uplevel::uplevel().
  #pod
  #pod =end _private
  #pod
  #pod =begin _dagolden
  #pod
  #pod I found the description above a bit confusing.  Instead, this is the logic
  #pod that I found clearer when CORE::GLOBAL::caller is invoked and we have to
  #pod walk up the call stack:
  #pod
  #pod * if searching up to the requested height in the real call stack doesn't find
  #pod a call to uplevel, then we can return the result at that height in the
  #pod call stack
  #pod
  #pod * if we find a call to uplevel, we need to keep searching upwards beyond the
  #pod requested height at least by the amount of upleveling requested for that
  #pod call to uplevel (from the Up_Frames stack set during the uplevel call)
  #pod
  #pod * additionally, we need to hide the uplevel subroutine call, too, so we search
  #pod upwards one more level for each call to uplevel
  #pod
  #pod * when we've reached the top of the search, we want to return that frame
  #pod in the call stack, i.e. the requested height plus any uplevel adjustments
  #pod found during the search
  #pod
  #pod =end _dagolden
  #pod
  #pod =cut
  
      my $saw_uplevel = 0;
      my $adjust = 0;
  
      # walk up the call stack to fight the right package level to return;
      # look one higher than requested for each call to uplevel found
      # and adjust by the amount found in the Up_Frames stack for that call.
      # We *must* use CORE::caller here since we need the real stack not what 
      # some other override says the stack looks like, just in case that other
      # override breaks things in some horrible way
      my $test_caller;
      for ( my $up = 0; $up <= $height + $adjust; $up++ ) {
          $test_caller = scalar CORE::caller($up + 1);
          if( $test_caller && $test_caller eq __PACKAGE__ ) {
              # add one for each uplevel call seen
              # and look into the uplevel stack for the offset
              $adjust += 1 + $Up_Frames[$saw_uplevel];
              $saw_uplevel++;
          }
      }
  
      # For returning values, we pass through the call to the proxy caller
      # function, just at a higher stack level
      my @caller = $Caller_Proxy->($height + $adjust + 1);
      if ( CORE::caller() eq 'DB' ) {
          # Oops, redo picking up @DB::args
          package DB;
          @caller = $Sub::Uplevel::Caller_Proxy->($height + $adjust + 1);
      }
  
      return if ! @caller;                  # empty
      return $caller[0] if ! wantarray;     # scalar context
      return @_ ? @caller : @caller[0..2];  # extra info or regular
  }
  
  #pod =back
  #pod
  #pod =head1 EXAMPLE
  #pod
  #pod The main reason I wrote this module is so I could write wrappers
  #pod around functions and they wouldn't be aware they've been wrapped.
  #pod
  #pod     use Sub::Uplevel;
  #pod
  #pod     my $original_foo = \&foo;
  #pod
  #pod     *foo = sub {
  #pod         my @output = uplevel 1, $original_foo;
  #pod         print "foo() returned:  @output";
  #pod         return @output;
  #pod     };
  #pod
  #pod If this code frightens you B<you should not use this module.>
  #pod
  #pod
  #pod =head1 BUGS and CAVEATS
  #pod
  #pod Well, the bad news is uplevel() is about 5 times slower than a normal
  #pod function call.  XS implementation anyone?  It also slows down every invocation
  #pod of caller(), regardless of whether uplevel() is in effect.
  #pod
  #pod Sub::Uplevel overrides CORE::GLOBAL::caller temporarily for the scope of
  #pod each uplevel call.  It does its best to work with any previously existing
  #pod CORE::GLOBAL::caller (both when Sub::Uplevel is first loaded and within 
  #pod each uplevel call) such as from Contextual::Return or Hook::LexWrap.  
  #pod
  #pod However, if you are routinely using multiple modules that override 
  #pod CORE::GLOBAL::caller, you are probably asking for trouble.
  #pod
  #pod You B<should> load Sub::Uplevel as early as possible within your program.  As
  #pod with all CORE::GLOBAL overloading, the overload will not affect modules that
  #pod have already been compiled prior to the overload.  One module that often is
  #pod unavoidably loaded prior to Sub::Uplevel is Exporter.  To forcibly recompile
  #pod Exporter (and Exporter::Heavy) after loading Sub::Uplevel, use it with the
  #pod ":aggressive" tag:
  #pod
  #pod     use Sub::Uplevel qw/:aggressive/;
  #pod
  #pod The private function C<Sub::Uplevel::_force_reload()> may be passed a list of
  #pod additional modules to reload if ":aggressive" is not aggressive enough.  
  #pod Reloading modules may break things, so only use this as a last resort.
  #pod
  #pod As of version 0.20, Sub::Uplevel requires Perl 5.6 or greater.
  #pod
  #pod =head1 HISTORY
  #pod
  #pod Those who do not learn from HISTORY are doomed to repeat it.
  #pod
  #pod The lesson here is simple:  Don't sit next to a Tcl programmer at the
  #pod dinner table.
  #pod
  #pod =head1 THANKS
  #pod
  #pod Thanks to Brent Welch, Damian Conway and Robin Houston.
  #pod
  #pod See http://www.perl.com/perl/misc/Artistic.html
  #pod
  #pod =head1 SEE ALSO
  #pod
  #pod PadWalker (for the similar idea with lexicals), Hook::LexWrap, 
  #pod Tcl's uplevel() at http://www.scriptics.com/man/tcl8.4/TclCmd/uplevel.htm
  #pod
  #pod =cut
  
  1;
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Sub::Uplevel - apparently run a function in a higher stack frame
  
  =head1 VERSION
  
  version 0.2800
  
  =head1 SYNOPSIS
  
    use Sub::Uplevel;
  
    sub foo {
        print join " - ", caller;
    }
  
    sub bar {
        uplevel 1, \&foo;
    }
  
    #line 11
    bar();    # main - foo.plx - 11
  
  =head1 DESCRIPTION
  
  Like Tcl's uplevel() function, but not quite so dangerous.  The idea
  is just to fool caller().  All the really naughty bits of Tcl's
  uplevel() are avoided.
  
  B<THIS IS NOT THE SORT OF THING YOU WANT TO DO EVERYDAY>
  
  =over 4
  
  =item B<uplevel>
  
    uplevel $num_frames, \&func, @args;
  
  Makes the given function think it's being executed $num_frames higher
  than the current stack level.  So when they use caller($frames) it
  will actually give caller($frames + $num_frames) for them.
  
  C<uplevel(1, \&some_func, @_)> is effectively C<goto &some_func> but
  you don't immediately exit the current subroutine.  So while you can't
  do this:
  
      sub wrapper {
          print "Before\n";
          goto &some_func;
          print "After\n";
      }
  
  you can do this:
  
      sub wrapper {
          print "Before\n";
          my @out = uplevel 1, &some_func;
          print "After\n";
          return @out;
      }
  
  C<uplevel> has the ability to issue a warning if C<$num_frames> is more than
  the current call stack depth, although this warning is disabled and compiled
  out by default as the check is relatively expensive.
  
  To enable the check for debugging or testing, you should set the global
  C<$Sub::Uplevel::CHECK_FRAMES> to true before loading Sub::Uplevel for the
  first time as follows:
  
      #!/usr/bin/perl
      
      BEGIN {
          $Sub::Uplevel::CHECK_FRAMES = 1;
      }
      use Sub::Uplevel;
  
  Setting or changing the global after the module has been loaded will have
  no effect.
  
  =begin _private
  
  So it has to work like this:
  
      Call stack               Actual     uplevel 1
  CORE::GLOBAL::caller
  Carp::short_error_loc           0
  Carp::shortmess_heavy           1           0
  Carp::croak                     2           1
  try_croak                       3           2
  uplevel                         4            
  function_that_called_uplevel    5            
  caller_we_want_to_see           6           3
  its_caller                      7           4
  
  So when caller(X) winds up below uplevel(), it only has to use  
  CORE::caller(X+1) (to skip CORE::GLOBAL::caller).  But when caller(X)
  winds up no or above uplevel(), it's CORE::caller(X+1+uplevel+1).
  
  Which means I'm probably going to have to do something nasty like walk
  up the call stack on each caller() to see if I'm going to wind up   
  before or after Sub::Uplevel::uplevel().
  
  =end _private
  
  =begin _dagolden
  
  I found the description above a bit confusing.  Instead, this is the logic
  that I found clearer when CORE::GLOBAL::caller is invoked and we have to
  walk up the call stack:
  
  * if searching up to the requested height in the real call stack doesn't find
  a call to uplevel, then we can return the result at that height in the
  call stack
  
  * if we find a call to uplevel, we need to keep searching upwards beyond the
  requested height at least by the amount of upleveling requested for that
  call to uplevel (from the Up_Frames stack set during the uplevel call)
  
  * additionally, we need to hide the uplevel subroutine call, too, so we search
  upwards one more level for each call to uplevel
  
  * when we've reached the top of the search, we want to return that frame
  in the call stack, i.e. the requested height plus any uplevel adjustments
  found during the search
  
  =end _dagolden
  
  =back
  
  =head1 EXAMPLE
  
  The main reason I wrote this module is so I could write wrappers
  around functions and they wouldn't be aware they've been wrapped.
  
      use Sub::Uplevel;
  
      my $original_foo = \&foo;
  
      *foo = sub {
          my @output = uplevel 1, $original_foo;
          print "foo() returned:  @output";
          return @output;
      };
  
  If this code frightens you B<you should not use this module.>
  
  =head1 BUGS and CAVEATS
  
  Well, the bad news is uplevel() is about 5 times slower than a normal
  function call.  XS implementation anyone?  It also slows down every invocation
  of caller(), regardless of whether uplevel() is in effect.
  
  Sub::Uplevel overrides CORE::GLOBAL::caller temporarily for the scope of
  each uplevel call.  It does its best to work with any previously existing
  CORE::GLOBAL::caller (both when Sub::Uplevel is first loaded and within 
  each uplevel call) such as from Contextual::Return or Hook::LexWrap.  
  
  However, if you are routinely using multiple modules that override 
  CORE::GLOBAL::caller, you are probably asking for trouble.
  
  You B<should> load Sub::Uplevel as early as possible within your program.  As
  with all CORE::GLOBAL overloading, the overload will not affect modules that
  have already been compiled prior to the overload.  One module that often is
  unavoidably loaded prior to Sub::Uplevel is Exporter.  To forcibly recompile
  Exporter (and Exporter::Heavy) after loading Sub::Uplevel, use it with the
  ":aggressive" tag:
  
      use Sub::Uplevel qw/:aggressive/;
  
  The private function C<Sub::Uplevel::_force_reload()> may be passed a list of
  additional modules to reload if ":aggressive" is not aggressive enough.  
  Reloading modules may break things, so only use this as a last resort.
  
  As of version 0.20, Sub::Uplevel requires Perl 5.6 or greater.
  
  =head1 HISTORY
  
  Those who do not learn from HISTORY are doomed to repeat it.
  
  The lesson here is simple:  Don't sit next to a Tcl programmer at the
  dinner table.
  
  =head1 THANKS
  
  Thanks to Brent Welch, Damian Conway and Robin Houston.
  
  See http://www.perl.com/perl/misc/Artistic.html
  
  =head1 SEE ALSO
  
  PadWalker (for the similar idea with lexicals), Hook::LexWrap, 
  Tcl's uplevel() at http://www.scriptics.com/man/tcl8.4/TclCmd/uplevel.htm
  
  =for :stopwords cpan testmatrix url annocpan anno bugtracker rt cpants kwalitee diff irc mailto metadata placeholders metacpan
  
  =head1 SUPPORT
  
  =head2 Bugs / Feature Requests
  
  Please report any bugs or feature requests through the issue tracker
  at L<https://github.com/Perl-Toolchain-Gang/Sub-Uplevel/issues>.
  You will be notified automatically of any progress on your issue.
  
  =head2 Source Code
  
  This is open source software.  The code repository is available for
  public review and contribution under the terms of the license.
  
  L<https://github.com/Perl-Toolchain-Gang/Sub-Uplevel>
  
    git clone https://github.com/Perl-Toolchain-Gang/Sub-Uplevel.git
  
  =head1 AUTHORS
  
  =over 4
  
  =item *
  
  Michael Schwern <mschwern@cpan.org>
  
  =item *
  
  David Golden <dagolden@cpan.org>
  
  =back
  
  =head1 CONTRIBUTORS
  
  =for stopwords Adam Kennedy Alexandr Ciornii David Golden Graham Ollis J. Nick Koston Michael Gray
  
  =over 4
  
  =item *
  
  Adam Kennedy <adamk@cpan.org>
  
  =item *
  
  Alexandr Ciornii <alexchorny@gmail.com>
  
  =item *
  
  David Golden <xdg@xdg.me>
  
  =item *
  
  Graham Ollis <plicease@cpan.org>
  
  =item *
  
  J. Nick Koston <nick@cpanel.net>
  
  =item *
  
  Michael Gray <mg13@sanger.ac.uk>
  
  =back
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2017 by Michael Schwern and David Golden.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
SUB_UPLEVEL

    $main::fatpacked{"Term/App/Role/Attrs.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'TERM_APP_ROLE_ATTRS';
  package Term::App::Role::Attrs;
  
  our $DATE = '2019-07-30'; # DATE
  our $VERSION = '0.030'; # VERSION
  
  use 5.010001;
  use Moo::Role;
  
  my $dt_cache;
  sub detect_terminal {
      my $self = shift;
  
      if (!$dt_cache) {
          require Term::Detect::Software;
          $dt_cache = Term::Detect::Software::detect_terminal_cached();
          #use Data::Dump; dd $dt_cache;
      }
      $dt_cache;
  }
  
  my $termw_cache;
  my $termh_cache;
  sub _term_size {
      my $self = shift;
  
      if (defined $termw_cache) {
          return ($termw_cache, $termh_cache);
      }
  
      ($termw_cache, $termh_cache) = (0, 0);
      if (eval { require Term::Size; 1 }) {
          ($termw_cache, $termh_cache) = Term::Size::chars(*STDOUT{IO});
      }
      ($termw_cache, $termh_cache);
  }
  
  # return undef if fail to parse
  sub __parse_color_depth {
      my $val = shift;
      if ($val =~ /\A\d+\z/) {
          return $val;
      } elsif ($val =~ /\A(\d+)[ _-]?(?:bit|b)\z/) {
          return 2**$val;
      } else {
          # IDEA: parse 'high color', 'true color'?
          return undef;
      }
  }
  
  has interactive => (
      is      => 'rw',
      lazy    => 1,
      default => sub {
          my $self = shift;
          if (defined $ENV{INTERACTIVE}) {
              $self->{_term_attrs_debug_info}{interactive_from} =
                  'INTERACTIVE env';
              return $ENV{INTERACTIVE};
          } else {
              $self->{_term_attrs_debug_info}{interactive_from} =
                  '-t STDOUT';
              return (-t STDOUT);
          }
      },
  );
  
  has use_color => (
      is      => 'rw',
      lazy    => 1,
      default => sub {
          my $self = shift;
          if (exists $ENV{NO_COLOR}) {
              $self->{_term_attrs_debug_info}{use_color_from} =
                  'NO_COLOR env';
              return 0;
          } elsif (defined $ENV{COLOR}) {
              $self->{_term_attrs_debug_info}{use_color_from} =
                  'COLOR env';
              return $ENV{COLOR};
          } elsif (defined $ENV{COLOR_DEPTH}) {
              $self->{_term_attrs_debug_info}{use_color_from} =
                  'COLOR_DEPTH env';
              my $val = __parse_color_depth($ENV{COLOR_DEPTH}) //
                  $ENV{COLOR_DEPTH};
              return $val ? 1:0;
          } else {
              $self->{_term_attrs_debug_info}{use_color_from} =
                  'interactive + color_deth';
              return $self->interactive && $self->color_depth > 0;
          }
      },
      trigger => sub {
          my ($self, $val) = @_;
          return if !defined($val) || $val =~ /\A(|1|0)\z/;
          my $pval = __parse_color_depth($val);
          $self->{color_depth} = $pval if defined $pval;
      },
  );
  
  has color_depth => (
      is      => 'rw',
      lazy    => 1,
      default => sub {
          my $self = shift;
          my $pval;
          if (defined($ENV{COLOR_DEPTH}) &&
                  defined($pval = __parse_color_depth($ENV{COLOR_DEPTH}))) {
              $self->{_term_attrs_debug_info}{color_depth_from} =
                  'COLOR_DEPTH env';
              return $pval;
          } elsif (defined($ENV{COLOR}) && $ENV{COLOR} !~ /^(|0|1)$/ &&
                       defined($pval = __parse_color_depth($ENV{COLOR}))) {
                  $self->{_term_attrs_debug_info}{color_depth_from} =
                      'COLOR env';
              return $pval;
          } elsif (defined(my $cd = $self->detect_terminal->{color_depth})) {
              $self->{_term_attrs_debug_info}{color_depth_from} =
                  'detect_terminal';
              return $cd;
          } else {
              $self->{_term_attrs_debug_info}{color_depth_from} =
                  'hardcoded default';
              return 16;
          }
      },
      trigger => sub {
          my ($self, $val) = @_;
          if (defined(my $pval = __parse_color_depth($val))) {
              $self->{color_depth} = $val = $pval;
          }
          if ($val) {
              $self->{use_color} = 1;
          } else {
              $self->{use_color} = 0;
          }
      },
  );
  
  has use_box_chars => (
      is      => 'rw',
      lazy    => 1,
      default => sub {
          my $self = shift;
          if (defined $ENV{BOX_CHARS}) {
              $self->{_term_attrs_debug_info}{use_box_chars_from} =
                  'BOX_CHARS env';
              return $ENV{BOX_CHARS};
          } elsif (!$self->interactive) {
              # most pager including 'less -R' does not support interpreting
              # boxchar escape codes.
              $self->{_term_attrs_debug_info}{use_box_chars_from} =
                  '(not) interactive';
              return 0;
          } elsif (defined(my $bc = $self->detect_terminal->{box_chars})) {
              $self->{_term_attrs_debug_info}{use_box_chars_from} =
                  'detect_terminal';
              return $bc;
          } else {
              $self->{_term_attrs_debug_info}{use_box_chars_from} =
                  'hardcoded default';
              return 0;
          }
      },
  );
  
  has use_utf8 => (
      is      => 'rw',
      lazy    => 1,
      default => sub {
          my $self = shift;
          if (defined $ENV{UTF8}) {
              $self->{_term_attrs_debug_info}{use_utf8_from} =
                  'UTF8 env';
              return $ENV{UTF8};
          } elsif (defined(my $termuni = $self->detect_terminal->{unicode})) {
              $self->{_term_attrs_debug_info}{use_utf8_from} =
                  'detect_terminal + LANG/LANGUAGE env must include "utf8"';
              return $termuni &&
                  (($ENV{LANG} || $ENV{LANGUAGE} || "") =~ /utf-?8/i ? 1:0);
          } else {
              $self->{_term_attrs_debug_info}{use_utf8_from} =
                  'hardcoded default';
              return 0;
          }
      },
  );
  
  has _term_attrs_debug_info => (is => 'rw', default=>sub{ {} });
  
  has term_width => (
      is      => 'rw',
      lazy    => 1,
      default => sub {
          my $self = shift;
          if ($ENV{COLUMNS}) {
              $self->{_term_attrs_debug_info}{term_width_from} = 'COLUMNS env';
              return $ENV{COLUMNS};
          }
          my ($termw, undef) = $self->_term_size;
          if ($termw) {
              $self->{_term_attrs_debug_info}{term_width_from} = 'term_size';
          } else {
              # sane default, on windows printing to rightmost column causes
              # cursor to move to the next line.
              $self->{_term_attrs_debug_info}{term_width_from} =
                  'hardcoded default';
              $termw = $^O =~ /Win/ ? 79 : 80;
          }
          $termw;
      },
  );
  
  has term_height => (
      is      => 'rw',
      lazy    => 1,
      default => sub {
          my $self = shift;
          if ($ENV{LINES}) {
              $self->{_term_attrs_debug_info}{term_height_from} = 'LINES env';
              return $ENV{LINES};
          }
          my (undef, $termh) = $self->_term_size;
          if ($termh) {
              $self->{_term_attrs_debug_info}{term_height_from} = 'term_size';
          } else {
              $self->{_term_attrs_debug_info}{term_height_from} = 'default';
              # sane default
              $termh = 25;
          }
          $termh;
      },
  );
  
  1;
  # ABSTRACT: Role for terminal-related attributes
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Term::App::Role::Attrs - Role for terminal-related attributes
  
  =head1 VERSION
  
  This document describes version 0.030 of Term::App::Role::Attrs (from Perl distribution Term-App-Roles), released on 2019-07-30.
  
  =head1 DESCRIPTION
  
  This role gives several options to turn on/off terminal-oriented features like
  whether to use UTF8 characters, whether to use colors, and color depth. Defaults
  are set from environment variables or by detecting terminal
  software/capabilities.
  
  =head1 ATTRIBUTES
  
  =head2 use_utf8 => BOOL (default: from env, or detected from terminal)
  
  The default is retrieved from environment: if C<UTF8> is set, it is used.
  Otherwise, the default is on if terminal emulator software supports Unicode
  I<and> language (LANG/LANGUAGE) setting has /utf-?8/i in it.
  
  =head2 use_box_chars => BOOL (default: from env, or detected from OS)
  
  Default is 0 for Windows.
  
  =head2 interactive => BOOL (default: from env, or detected from terminal)
  
  =head2 use_color => BOOL (default: from env, or detected from terminal)
  
  For convenience, this attribute is "linked" with C<color_depth>. Setting
  C<use_color> will also set C<color_depth> when the value is not ''/1/0 and
  matches color depth pattern. For example, setting C<use_color> to 256 or '8bit'
  will also set C<color_depth> to 256.
  
  =head2 color_depth => INT (or STR, default: from env, or detected from terminal)
  
  Get/set color depth. When setting, you can use string like '8 bit' or '24b' and
  it will be converted to 256 (2**8) or 16777216 (2**24).
  
  For convenience, this attribute is "linked" with C<use_color>. Setting
  C<color_depth> to non-zero value will enable C<use_color>, while setting it to 0
  will disable C<use_color>.
  
  =head2 term_width => INT (default: from env, or detected from terminal)
  
  =head2 term_height => INT (default: from env, or detected from terminal)
  
  =head1 METHODS
  
  =head2 detect_terminal() => HASH
  
  Call L<Term::Detect::Software>'s C<detect_terminal_cached>.
  
  =head1 ENVIRONMENT
  
  =over
  
  =item * UTF8 => BOOL
  
  Can be used to set C<use_utf8>.
  
  =item * INTERACTIVE => BOOL
  
  Can be used to set C<interactive>.
  
  =item * NO_COLOR
  
  Can be used to disable color. Takes precedence over C<COLOR>.
  
  For more information, see L<https://no-color.org>.
  
  =item * COLOR => BOOL (or INT or STR)
  
  Can be used to set C<use_color>. Can also be used to set C<color_depth> (if
  C<COLOR_DEPTH> is not defined).
  
  =item * COLOR_DEPTH => INT (or STR)
  
  Can be used to set C<color_depth>. Can also be used to enable/disable
  C<use_color>.
  
  =item * BOX_CHARS => BOOL
  
  Can be used to set C<use_box_chars>.
  
  =item * COLUMNS => INT
  
  Can be used to set C<term_width>.
  
  =item * LINES => INT
  
  Can be used to set C<term_height>.
  
  =back
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Term-App-Roles>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Term-App-Roles>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Term-App-Roles>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2019, 2018, 2014 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
TERM_APP_ROLE_ATTRS

    $main::fatpacked{"Term/App/Roles.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'TERM_APP_ROLES';
  package Term::App::Roles;
  
  our $DATE = '2019-07-30'; # DATE
  our $VERSION = '0.030'; # VERSION
  
  1;
  # ABSTRACT: Collection of roles for terminal-based application
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Term::App::Roles - Collection of roles for terminal-based application
  
  =head1 VERSION
  
  This document describes version 0.030 of Term::App::Roles (from Perl distribution Term-App-Roles), released on 2019-07-30.
  
  =head1 DESCRIPTION
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Term-App-Roles>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Term-App-Roles>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Term-App-Roles>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2019, 2018, 2014 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
TERM_APP_ROLES

    $main::fatpacked{"Term/Detect/Software.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'TERM_DETECT_SOFTWARE';
  package Term::Detect::Software;
  
  our $DATE = '2019-08-21'; # DATE
  our $VERSION = '0.222'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  use experimental 'smartmatch';
  #use Log::Any '$log';
  
  require Exporter;
  our @ISA       = qw(Exporter);
  our @EXPORT_OK = qw(detect_terminal detect_terminal_cached);
  
  my $dt_cache;
  sub detect_terminal_cached {
      if (!$dt_cache) {
          $dt_cache = detect_terminal(@_);
      }
      $dt_cache;
  }
  
  sub detect_terminal {
      my @dbg;
      my $info = {_debug_info=>\@dbg};
  
    DETECT:
      {
          unless (defined $ENV{TERM}) {
              push @dbg, "skip: TERM env undefined";
              $info->{emulator_engine}   = '';
              $info->{emulator_software} = '';
              last DETECT;
          }
  
          if ($ENV{KONSOLE_DBUS_SERVICE} || $ENV{KONSOLE_DBUS_SESSION}) {
              push @dbg, "detect: konsole via KONSOLE_DBUS_{SERVICE,SESSION} env";
              $info->{emulator_engine} = 'konsole';
              $info->{color_depth}     = 2**24;
              $info->{default_bgcolor} = '000000';
              $info->{unicode}         = 1;
              $info->{box_chars}       = 1;
              last DETECT;
          }
  
          if ($ENV{XTERM_VERSION}) {
              push @dbg, "detect: xterm via XTERM_VERSION env";
              $info->{emulator_engine} = 'xterm';
              $info->{color_depth}     = 256;
              $info->{default_bgcolor} = 'ffffff';
              $info->{unicode}         = 0;
              $info->{box_chars}       = 1;
              last DETECT;
          }
  
          # cygwin terminal
          if ($ENV{TERM} eq 'xterm' && ($ENV{OSTYPE} // '') eq 'cygwin') {
              push @dbg, "detect: xterm via TERM env (cygwin)";
              $info->{emulator_engine} = 'cygwin';
              $info->{color_depth}     = 16;
              $info->{default_bgcolor} = '000000';
              $info->{unicode}         = 0; # CONFIRM?
              $info->{box_chars}       = 1;
              last DETECT;
          }
  
          if ($ENV{TERM} eq 'linux') {
              push @dbg, "detect: linux via TERM env";
              # Linux virtual console
              $info->{emulator_engine} = 'linux';
              $info->{color_depth}     = 16;
              $info->{default_bgcolor} = '000000';
              # actually it can show a few Unicode characters like single borders
              $info->{unicode}         = 0;
              $info->{box_chars}       = 0;
              last DETECT;
          }
  
          my $gnome_terminal_terms = [qw/gnome-terminal guake xfce4-terminal
                                         mlterm lxterminal/];
  
          my $set_gnome_terminal_term = sub {
              $info->{emulator_software} = $_[0];
              $info->{emulator_engine}   = 'gnome-terminal';
  
              # xfce4-terminal only shows 16 color, despite being
              # gnome-terminal-based?
              $info->{color_depth}       = $_[0] =~ /xfce4/ ? 16 : 256;
  
              $info->{unicode}           = 1;
              if ($_[0] ~~ [qw/mlterm/]) {
                  $info->{default_bgcolor} = 'ffffff';
              } else {
                  $info->{default_bgcolor} = '000000';
              }
              $info->{box_chars} = 1;
          };
  
          if (($ENV{COLORTERM} // '') ~~ $gnome_terminal_terms) {
              push @dbg, "detect: gnome-terminal via COLORTERM";
              $set_gnome_terminal_term->($ENV{COLORTERM});
              last DETECT;
          }
  
          # Windows command prompt
          if ($ENV{TERM} eq 'dumb' && $ENV{windir}) {
              push @dbg, "detect: windows via TERM & windir env";
              $info->{emulator_software} = 'windows';
              $info->{emulator_engine}   = 'windows';
              $info->{color_depth}       = 16;
              $info->{unicode}           = 0;
              $info->{default_bgcolor}   = '000000';
              $info->{box_chars}         = 0;
              last DETECT;
          }
  
          # run under CGI or something like that
          if ($ENV{TERM} eq 'dumb') {
              push @dbg, "detect: dumb via TERM env";
              $info->{emulator_software} = 'dumb';
              $info->{emulator_engine}   = 'dumb';
              $info->{color_depth}       = 0;
              # XXX how to determine unicode support?
              $info->{default_bgcolor}   = '000000';
              $info->{box_chars}         = 0;
              last DETECT;
          }
  
          {
              last if $^O =~ /Win/;
  
              require Proc::Find::Parents;
              my $ppids = Proc::Find::Parents::get_parent_processes();
              unless (defined $ppids) {
                  push @dbg, "skip: get_parent_processes returns undef";
                  last;
              }
  
              # [0] is shell
              my $proc = @$ppids >= 1 ? $ppids->[1]{name} : '';
              #say "D:proc=$proc";
              if ($proc ~~ $gnome_terminal_terms) {
                  push @dbg, "detect: gnome-terminal via procname ($proc)";
                  $set_gnome_terminal_term->($proc);
                  last DETECT;
              } elsif ($proc ~~ [qw/rxvt mrxvt/]) {
                  push @dbg, "detect: rxvt via procname ($proc)";
                  $info->{emulator_software} = $proc;
                  $info->{emulator_engine}   = 'rxvt';
                  $info->{color_depth}       = 16;
                  $info->{unicode}           = 0;
                  $info->{default_bgcolor}   = 'd6d2d0';
                  $info->{box_chars}         = 1;
                  last DETECT;
              } elsif ($proc eq 'st' && $ENV{TERM} eq 'xterm-256color') {
                  push @dbg, "detect: st via procname";
                  $info->{emulator_software} = 'st';
                  $info->{emulator_engine}   = 'st';
                  $info->{color_depth}       = 256;
                  $info->{unicode}           = 1;
                  $info->{default_bgcolor}   = '000000';
                  $info->{box_chars}         = 1; # some characters are currently flawed though as of 0.6
                  last DETECT;
              } elsif ($proc ~~ [qw/pterm/]) {
                  push @dbg, "detect: pterm via procname ($proc)";
                  $info->{emulator_software} = $proc;
                  $info->{emulator_engine}   = 'putty';
                  $info->{color_depth}       = 256;
                  $info->{unicode}           = 0;
                  $info->{default_bgcolor}   = '000000';
                  last DETECT;
              } elsif ($proc ~~ [qw/xvt/]) {
                  push @dbg, "detect: xvt via procname ($proc)";
                  $info->{emulator_software} = $proc;
                  $info->{emulator_engine}   = 'xvt';
                  $info->{color_depth}       = 0; # only support bold
                  $info->{unicode}           = 0;
                  $info->{default_bgcolor}   = 'd6d2d0';
                  last DETECT;
              }
          }
  
          # generic
          {
              unless (exists $info->{color_depth}) {
                  if ($ENV{TERM} =~ /256color/) {
                      push @dbg, "detect color_depth: 256 via TERM env";
                      $info->{color_depth} = 256;
                  } else {
                      require File::Which;
                      if (File::Which::which("tput")) {
                          my $res = `tput colors` + 0;
                          push @dbg, "detect color_depth: $res via tput";
                          $res = 16 if $res == 8; # 8 is basically 16 (8 low-intensity + 8 high-intensity)
                          $info->{color_depth} = $res;
                      }
                  }
              }
  
              $info->{emulator_software} //= '(generic)';
              $info->{emulator_engine} //= '(generic)';
              $info->{unicode} //= 0;
              $info->{color_depth} //= 0;
              $info->{box_chars} //= 0;
              $info->{default_bgcolor} //= '000000';
          }
  
      } # DETECT
  
      # some additional detections
  
      # we're running under emacs, it doesn't support box chars
      if ($ENV{INSIDE_EMACS}) {
          $info->{inside_emacs} = 1;
          $info->{box_chars} = 0;
      }
  
      $info;
  }
  
  1;
  # ABSTRACT: Detect terminal (emulator) software and its capabilities
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Term::Detect::Software - Detect terminal (emulator) software and its capabilities
  
  =head1 VERSION
  
  This document describes version 0.222 of Term::Detect::Software (from Perl distribution Term-Detect-Software), released on 2019-08-21.
  
  =head1 SYNOPSIS
  
   use Term::Detect::Software qw(detect_terminal detect_terminal_cached);
   my $res = detect_terminal();
   die "Not running under terminal!" unless $res->{emulator_engine};
   say "Emulator engine: ", $res->{emulator_engine};
   say "Emulator software: ", $res->{emulator_software};
   say "Unicode support? ", $res->{unicode} ? "yes":"no";
   say "Boxchars support? ", $res->{box_chars} ? "yes":"no";
   say "Color depth: ", $res->{color_depth};
   say "Inside emacs? ", $res->{inside_emacs} ? "yes":"no";
  
  =head1 DESCRIPTION
  
  This module uses several heuristics to find out what terminal (emulator)
  software the current process is running in, and its capabilities/settings. This
  module complements other modules such as L<Term::Terminfo> and
  L<Term::Encoding>.
  
  =head1 FUNCTIONS
  
  =head2 detect_terminal() => HASHREF
  
  Return a hashref containing information about running terminal (emulator)
  software and its capabilities/settings.
  
  Detection method is tried from the easiest/cheapest (e.g. checking environment
  variables) or by looking at known process names in the process tree. Terminal
  capabilities is determined using heuristics.
  
  Currently Konsole and Konsole-based terminals (like Yakuake) can be detected
  through existence of environment variables C<KONSOLE_DBUS_SERVICE> or
  C<KONSOLE_DBUS_SESSION>. xterm is detected through C<XTERM_VERSION>. XFCE's
  Terminal is detected using C<COLORTERM>. The other software are detected via
  known process names.
  
  Terminal capabilities and settings are currently determined via heuristics.
  Probing terminal configuration files might be performed in the future.
  
  Result:
  
  =over
  
  =item * emulator_engine => STR
  
  Possible values: C<konsole>, C<xterm>, C<gnome-terminal>, C<rxvt>, C<pterm>
  (PuTTY), C<xvt>, C<windows> (CMD.EXE), C<cygwin>, C<st> (suckless.org's terminal
  emulator), or empty string (if not detected running under terminal).
  
  =item * emulator_software => STR
  
  Either: C<xfce4-terminal>, C<guake>, C<gnome-terminal>, C<mlterm>,
  C<lxterminal>, C<rxvt>, C<mrxvt>, C<putty>, C<xvt>, C<windows> (CMD.EXE), C<st>
  (suckless.org's terminal emulator), or empty string (if not detected running
  under terminal).
  
  =item * color_depth => INT
  
  Either 0 (does not support ANSI color codes), 16, 256, or 16777216 (2**24).
  
  =item * default_bgcolor => STR (6-hexdigit RGB)
  
  For example, any xterm is assumed to have white background (ffffff) by default,
  while Konsole is assumed to have black (000000). Better heuristics will be done
  in the future.
  
  =item * unicode => BOOL
  
  Whether terminal software supports Unicode/wide characters. Note that you should
  also check encoding, e.g. using L<Term::Encoding>.
  
  =item * box_chars => BOOL
  
  Whether terminal supports box-drawing characters.
  
  =back
  
  =head2 detect_terminal_cached([$flag]) => ANY
  
  Just like C<detect_terminal()> but will cache the result. Can be used by
  applications or modules to avoid repeating detection process.
  
  =head1 FAQ
  
  =head2 What is this module for? Why not Term::Terminfo or Term::Encoding?
  
  This module is first written for L<Text::ANSITable> so that the module can
  provide good defaults when displaying formatted and colored tables, especially
  on popular terminal emulation software like Konsole (KDE's default terminal),
  gnome-terminal (GNOME's default), Terminal (XFCE's default), xterm, rxvt.
  
  The module works by trying to figure out the terminal emulation software because
  the information provided by L<Term::Terminfo> and L<Term::Encoding> are
  sometimes not specific enough. For example, Term::Encoding can return L<utf-8>
  when running under rxvt, but since the software currently lacks Unicode support
  we shouldn't display Unicode characters. Another example is color depth:
  Term::Terminfo currently doesn't recognize Konsole's 24bit color support and
  only gives C<max_colors> 256.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Term-Detect-Software>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Term-Detect-Software>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Term-Detect-Software>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Term::Terminfo>
  
  L<Term::Encoding>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2019, 2015, 2014, 2013 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
TERM_DETECT_SOFTWARE

    $main::fatpacked{"Test/Config/IOD/Common.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'TEST_CONFIG_IOD_COMMON';
  package Test::Config::IOD::Common;
  
  our $DATE = '2019-01-17'; # DATE
  our $VERSION = '0.342'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  
  use Test::More 0.98;
  
  our $CLASS = "Config::IOD::Reader";
  
  sub test_common_iod {
  
      eval "require $CLASS"; die if $@;
  
      subtest "opt: default_section" => sub {
          test_read_iod(
              args  => {default_section=>'bawaan'},
              input => <<'_',
  a=1
  _
              result => {bawaan=>{a=>1}},
          );
      };
  
      subtest "opt: allow_directives" => sub {
          test_read_iod(
              args  => {allow_directives=>['merge']},
              input => <<'_',
  ;!noop
  _
              dies  => 1,
          );
          test_read_iod(
              args  => {allow_directives=>['noop']},
              input => <<'_',
  ;!noop
  _
              result => {},
          );
      };
  
      subtest "opt: disallow_directives" => sub {
          test_read_iod(
              args  => {disallow_directives=>['noop']},
              input => <<'_',
  ;!noop
  _
              dies  => 1,
          );
          test_read_iod(
              args  => {disallow_directives=>['merge']},
              input => <<'_',
  ;!noop
  _
              result => {},
          );
      };
  
      subtest "opt: allow_directives + disallow_directives" => sub {
          test_read_iod(
              args  => {
                  allow_directives    => ['noop'],
                  disallow_directives => ['noop'],
              },
              input => <<'_',
  ;!noop
  _
              dies  => 1,
          );
      };
  
      subtest "opt: enable_directive=0" => sub {
          test_read_iod(
              args  => {enable_directive=>0},
              input => <<'_',
  [s1]
  a=1
  [s2]
  ;!merge s1
  b=2
  _
              result => {s1=>{a=>1}, s2=>{b=>2}},
          );
          test_read_iod(
              args  => {enable_directive=>0},
              input => <<'_',
  [s1]
  a=1
  [s2]
  !merge s1
  b=2
  _
              dies => 1,
          );
      };
  
      subtest "opt: enable_quoting=0" => sub {
          test_read_iod(
              args  => {enable_quoting=>0},
              input => <<'_',
  name="1\n2"
  _
              result => {GLOBAL=>{name=>'"1\\n2"'}},
          );
      };
  
      subtest "opt: enable_bracket=0" => sub {
          test_read_iod(
              args  => {enable_bracket=>0},
              input => <<'_',
  name=[1,2,3]
  _
              result => {GLOBAL=>{name=>'[1,2,3]'}},
          );
      };
  
      subtest "opt: enable_brace=0" => sub {
          test_read_iod(
              args  => {enable_brace=>0},
              input => <<'_',
  name={"a":1}
  _
              result => {GLOBAL=>{name=>'{"a":1}'}},
          );
      };
  
      subtest "opt: enable_encoding=0" => sub {
          test_read_iod(
              args  => {enable_encoding=>0},
              input => <<'_',
  name=!hex 5e5e
  _
              result => {GLOBAL=>{name=>'!hex 5e5e'}},
          );
      };
  
      subtest "opt: allow_encodings" => sub {
          test_read_iod(
              args  => {allow_encodings=>['hex']},
              input => <<'_',
  name=!json "1\n2"
  _
              dies => 1,
          );
          test_read_iod(
              args  => {allow_encodings=>['json']},
              input => <<'_',
  name=!json "1\n2"
  name2=!j "3\n4"
  _
              result => {GLOBAL=>{name=>"1\n2", name2=>"3\n4"}},
          );
      };
  
      subtest "opt: disallow_encodings" => sub {
          test_read_iod(
              args  => {disallow_encodings=>['json']},
              input => <<'_',
  name=!json "1\n2"
  _
              dies => 1,
          );
          test_read_iod(
              args  => {disallow_encodings=>['json']},
              input => <<'_',
  name=!j "1\n2"
  _
              dies => 1,
          );
          test_read_iod(
              args  => {disallow_encodings=>['hex']},
              input => <<'_',
  name=!json "1\n2"
  _
              result => {GLOBAL=>{name=>"1\n2"}},
          );
      };
  
      subtest "opt: allow_encodings + disallow_encodings" => sub {
          test_read_iod(
              args  => {
                  allow_encodings   =>['json'],
                  disallow_encodings=>['json'],
              },
              input => <<'_',
  name=!json "1\n2"
  _
              dies => 1,
          );
      };
  
      subtest "opt: allow_bang_only=0" => sub {
          test_read_iod(
              args  => {allow_bang_only=>0},
              input => <<'_',
  a=1
  !noop
  _
              dies => 1,
          );
      };
  
      subtest "opt: allow_duplicate_key=0" => sub {
          test_read_iod(
              args  => {allow_duplicate_key=>0},
              input => <<'_',
  a=1
  a=2
  _
              dies => 1,
          );
      };
  
      subtest "opt: ignore_unknown_directive=1" => sub {
          test_read_iod(
              args  => {ignore_unknown_directive=>1},
              input => <<'_',
  ;!foo bar
  _
              result => {},
          );
      };
  
      # temporarily placed here
      subtest "expr" => sub {
          test_read_iod(
              name  => "must be enabled first",
              args  => {},
              input => <<'_',
  a=!e 1+1
  _
              dies => 1,
          );
          test_read_iod(
              name  => "must be valid",
              args  => {enable_expr=>1},
              input => <<'_',
  a=!e 1+
  _
              dies => 1,
          );
          test_read_iod(
              args  => {enable_expr=>1},
              input => <<'_',
  a=!e 1+1
  [sect]
  b=!e val("GLOBAL.a")*3
  c=!e val("b") x 3
  _
              result => {GLOBAL=>{a=>2}, sect=>{b=>6, c=>666}},
          );
      };
  }
  
  sub test_read_iod {
      my %args = @_;
  
      my $parser_args = $args{args};
      my $test_name = $args{name} //
          "{". join(", ",
                    (map {"$_=$parser_args->{$_}"}
                         sort keys %$parser_args),
                ) . "}";
      subtest $test_name => sub {
  
          my $parser = $CLASS->new(%$parser_args);
  
          my $res;
          eval {
              if ($CLASS eq 'Config::IOD') {
                  $res = $parser->read_string($args{input})->dump;
              } else {
                  $res = $parser->read_string($args{input});
              }
          };
          my $err = $@;
          if ($args{dies}) {
              ok($err, "dies") or diag explain $res;
              return;
          } else {
              ok(!$err, "doesn't die")
                  or do { diag explain "err=$err"; return };
              is_deeply($res, $args{result}, 'result')
                  or diag explain $res;
          }
      };
  }
  
  1;
  # ABSTRACT: Common tests for Config::IOD and Config::IOD::Reader
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Test::Config::IOD::Common - Common tests for Config::IOD and Config::IOD::Reader
  
  =head1 VERSION
  
  This document describes version 0.342 of Test::Config::IOD::Common (from Perl distribution Config-IOD-Reader), released on 2019-01-17.
  
  =for Pod::Coverage .+
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Config-IOD-Reader>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Config-IOD-Reader>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Config-IOD-Reader>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2019, 2018, 2017, 2016, 2015, 2014 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
TEST_CONFIG_IOD_COMMON

    $main::fatpacked{"Test/Data/Sah.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'TEST_DATA_SAH';
  ## no critic: (ControlStructures::ProhibitUnreachableCode)
  
  package Test::Data::Sah;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  use Test::More 0.98;
  
  use Data::Dump qw(dump);
  use Data::Sah qw(gen_validator);
  use File::chdir;
  use File::Slurper qw(read_text);
  
  use Exporter qw(import);
  our @EXPORT_OK = qw(
                         test_sah_cases
                         run_spectest
                         all_match
                         any_match
                         none_match
                 );
  
  # XXX support js & human testing too
  sub test_sah_cases {
      my $tests = shift;
      my $opts  = shift // {};
  
      my $sah = Data::Sah->new;
      my $plc = $sah->get_compiler('perl');
  
      my $gvopts = $opts->{gen_validator_opts} // {};
      my $rt = $gvopts->{return_type} // 'bool_valid';
  
      for my $test (@$tests) {
          my $v = gen_validator($test->{schema}, $gvopts);
          my $res = $v->($test->{input});
          my $name = $test->{name} //
              "data " . dump($test->{input}) . " should".
                  ($test->{valid} ? " pass" : " not pass"). " schema " .
                      dump($test->{schema});
          my $testres;
          if ($test->{valid}) {
              if ($rt eq 'bool_valid') {
                  $testres = ok($res, $name);
              } elsif ($rt eq 'str_errmsg') {
                  $testres = is($res, "", $name) or diag explain $res;
              } elsif ($rt eq 'hash_details') {
                  $testres = is(scalar keys(%{$res->{errors}}), 0, $name) or diag explain $res;
              }
          } else {
              if ($rt eq 'bool_valid') {
                  $testres = ok(!$res, $name);
              } elsif ($rt eq 'str_errmsg') {
                  $testres = isnt($res, "", $name) or diag explain $res;
              } elsif ($rt eq 'hash_details') {
                  $testres = isnt(scalar keys(%{$res->{errors}}), 0, $name) or diag explain $res;
              }
          }
          next if $testres;
  
          # when test fails, show the validator generated code to help debugging
          my $cd = $plc->compile(schema => $test->{schema});
          diag "schema compilation result:\n----begin generated code----\n",
              explain($cd->{result}), "\n----end generated code----\n",
                  "that code should return ", ($test->{valid} ? "true":"false"),
                      " when fed \$data=", dump($test->{input}),
                          " but instead returns ", dump($res);
  
          # also show the result for return_type=hash_details
          my $vhash = gen_validator($test->{schema}, {return_type=>"hash_details"});
          diag "\nvalidator result (hash_details):\n----begin result----\n",
              explain($vhash->($test->{input})), "----end result----";
      }
  }
  
  sub _decode_json {
      state $json = do {
          require JSON;
          JSON->new->allow_nonref;
      };
      $json->decode(@_);
  }
  
  sub run_spectest {
      require File::ShareDir;
      require File::ShareDir::Tarball;
      require Sah;
  
      my %args = @_;
  
      my $sah = Data::Sah->new;
  
      my $dir;
      if (version->parse($Sah::VERSION) == version->parse("0.9.27")) {
          # this version of Sah temporarily uses ShareDir instead of
          # ShareDir::Tarball due to garbled output problem of tarball.
          $dir = File::ShareDir::dist_dir("Sah");
      } else {
          $dir = File::ShareDir::Tarball::dist_dir("Sah");
      }
      $dir && (-d $dir) or die "Can't find spectest, have you installed Sah?";
      (-f "$dir/spectest/00-normalize_schema.json")
          or die "Something's wrong, spectest doesn't contain the correct files";
  
      my @specfiles;
      {
          local $CWD = "$dir/spectest";
          @specfiles = glob("*.json");
      }
  
      # to test certain files only
      my @files;
      if ($ENV{TEST_SAH_SPECTEST_FILES}) {
          @files = split /\s*,\s*|\s+/, $ENV{TEST_SAH_SPECTEST_FILES};
      } else {
          @files = @ARGV;
      }
  
      # to test certain types only
      my @types;
      if ($ENV{TEST_SAH_SPECTEST_TYPES}) {
          @types = split /\s*,\s*|\s+/, $ENV{TEST_SAH_SPECTEST_TYPES};
      }
  
      # to test only tests that have all matching tags
      my @include_tags;
      if ($ENV{TEST_SAH_SPECTEST_INCLUDE_TAGS}) {
          @include_tags = split /\s*,\s*|\s+/,
              $ENV{TEST_SAH_SPECTEST_INCLUDE_TAGS};
      }
  
      # to skip tests that have all matching tags
      my @exclude_tags;
      if ($ENV{TEST_SAH_SPECTEST_EXCLUDE_TAGS}) {
          @exclude_tags = split /\s*,\s*|\s+/,
              $ENV{TEST_SAH_SPECTEST_EXCLUDE_TAGS};
      }
  
      my $code_test_excluded = sub {
          my $test = shift;
  
          if ($test->{tags} && @exclude_tags) {
              if (any_match(\@exclude_tags, $test->{tags})) {
                  return "contains excluded tag(s) (".
                      join(", ", @exclude_tags).")";
              }
          }
          if (@include_tags) {
              if (!all_match(\@include_tags, $test->{tags} // [])) {
                  return "does not contain all include tags (".
                      join(", ", @include_tags).")";
              }
          }
          "";
      };
  
      {
          last unless $args{test_normalize_schema};
  
          for my $file ("00-normalize_schema.json") {
              unless (!@files || grep { $_ eq $file } @files) {
                  diag "Skipping file $file";
                  next;
              }
              subtest $file => sub {
                  my $tspec = _decode_json(read_text("$dir/spectest/$file"));
                  for my $test (@{ $tspec->{tests} }) {
                      subtest $test->{name} => sub {
                          if (my $reason = $code_test_excluded->($test)) {
                              plan skip_all => "Skipping test $test->{name}: $reason";
                              return;
                          }
                          eval {
                              is_deeply(normalize_schema($test->{input}),
                                        $test->{result}, "result");
                          };
                          my $eval_err = $@;
                          if ($test->{dies}) {
                              ok($eval_err, "dies");
                          } else {
                              ok(!$eval_err, "doesn't die")
                                  or diag $eval_err;
                          }
                      };
                  }
                  ok 1; # an extra dummy ok to pass even if all spectest is skipped
              };
          }
      }
  
      {
          last unless $args{test_merge_clause_sets};
  
          for my $file ("01-merge_clause_sets.json") {
              last; # we currently remove _merge_clause_sets() from Data::Sah
              unless (!@files || grep { $_ eq $file } @files) {
                  diag "Skipping file $file";
                  next;
              }
              subtest $file => sub {
                  my $tspec = _decode_json(scalar read_text("$dir/spectest/$file"));
                  for my $test (@{ $tspec->{tests} }) {
                      subtest $test->{name} => sub {
                          if (my $reason = $code_test_excluded->($test)) {
                              plan skip_all => "Skipping test $test->{name}: $reason";
                              return;
                          }
                          eval {
                              is_deeply($sah->_merge_clause_sets(@{ $test->{input} }),
                                        $test->{result}, "result");
                          };
                          my $eval_err = $@;
                          if ($test->{dies}) {
                              ok($eval_err, "dies");
                          } else {
                              ok(!$eval_err, "doesn't die")
                                  or diag $eval_err;
                          }
                      };
                  }
                  ok 1; # an extra dummy ok to pass even if all spectest is skipped
              };
          }
      }
  
      {
          for my $file (grep {/^10-type-/ || /^20-clause-(prefilters)/} @specfiles) {
              unless (!@files || grep { $_ eq $file } @files) {
                  diag "Skipping file $file";
                  next;
              }
              subtest $file => sub {
                  diag "Loading $file ...";
                  my $tspec = _decode_json(read_text("$dir/spectest/$file"));
                  note "Test version: ", $tspec->{version};
                  my $tests = $tspec->{tests};
                  if ($args{tests_func}) {
                      $args{tests_func}->($tests, {
                          parent_args => \%args,
                          code_test_excluded => $code_test_excluded,
                      });
                  } elsif ($args{test_func}) {
                      for my $test (@$tests) {
                          my $skip_reason;
                          {
                              if ($args{skip_if}) {
                                  $skip_reason = $args{skip_if}->($test);
                                  last if $skip_reason;
                              }
                              $skip_reason = $code_test_excluded->($test);
                              last if $skip_reason;
                          }
                          my $tname = "(tags=".join(", ", sort @{ $test->{tags} // [] }).
                              ") $test->{name}";
                          if ($skip_reason) {
                              diag "Skipping test $tname: $skip_reason";
                              next;
                          }
                          note explain $test;
                          subtest $tname => sub {
                              $args{test_func}->($test);
                          };
                      } # for $test
                      ok 1; # an extra dummy ok to pass even if all spectest is skipped
                  } else {
                      die "Please specify 'test_func' or 'tests_func'";
                  }
              }; # subtest $file
          } # for $file
      }
  
  }
  
  sub all_match {
      my ($list1, $list2) = @_;
  
      for my $el (@$list1) {
          return 0 unless grep { $_ eq $el } @$list2;
      }
      1;
  }
  
  sub any_match {
      my ($list1, $list2) = @_;
  
      for my $el (@$list1) {
          return 1 if grep { $_ eq $el } @$list2;
      }
      0;
  }
  
  sub none_match {
      my ($list1, $list2) = @_;
  
      for my $el (@$list1) {
          return 0 if grep { $_ eq $el } @$list2;
      }
      1;
  }
  
  1;
  # ABSTRACT: Test routines for Data::Sah
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Test::Data::Sah - Test routines for Data::Sah
  
  =head1 VERSION
  
  This document describes version 0.907 of Test::Data::Sah (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =head1 FUNCTIONS
  
  =head2 test_sah_cases(\@tests)
  
  =head2 run_spectest(\@tests, \%opts)
  
  =head2 all_match(\@array1, \@array2) => bool
  
  A utility routine. Probably will be moved to another module in the future.
  
  Return true if all of the elements in C<@array1> is in C<@array2>.
  
  =head2 any_match(\@array1, \@array2) => bool
  
  A utility routine. Probably will be moved to another module in the future.
  
  Return true if any element in C<@array1> is in C<@array2>.
  
  =head2 none_match(\@array1, \@array2) => bool
  
  A utility routine. Probably will be moved to another module in the future.
  
  Return true if none of the elements in C<@array1> is in C<@array2>.
  
  =head1 ENVIRONMENT
  
  =head2 TEST_SAH_SPECTEST_FILES => str
  
  Comma-separated list of files in spectest to test. Default is all files. If you
  only want to test certain spectest files, use this.
  
  =head2 TEST_SAH_SPECTEST_TYPES => str
  
  Comma-separated list of types to test. Default is all types. If you only want to
  test certain types, use this.
  
  =head2 TEST_SAH_SPECTEST_INCLUDE_TAGS => str
  
  Comma-separated list of tags to include. If you only want to include tests that
  have certain tags, use this.
  
  =head2 TEST_SAH_SPECTEST_EXCLUDE_TAGS => str
  
  Comma-separated list of tags to exclude. If you want to exclude tests that have
  certain tags, use this.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
TEST_DATA_SAH

    $main::fatpacked{"Test/Data/Sah/Human.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'TEST_DATA_SAH_HUMAN';
  package Test::Data::Sah::Human;
  
  our $DATE = '2020-02-12'; # DATE
  our $VERSION = '0.907'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  use Test::More 0.98;
  
  use Data::Sah;
  
  use Exporter qw(import);
  our @EXPORT_OK = qw(test_human);
  
  sub test_human {
      my %args = @_;
      subtest $args{name} // $args{result}, sub {
          my $sah = Data::Sah->new;
          my $hc = $sah->get_compiler("human");
          my %hargs = (
              schema => $args{schema},
              lang => $args{lang},
              %{ $args{compile_opts} // {} },
          );
          $hargs{format} //= "inline_text";
          my $cd = $hc->compile(%hargs);
  
          if (defined $args{result}) {
              if (ref($args{result}) eq 'Regexp') {
                  like($cd->{result}, $args{result}, 'result');
              } else {
                  is($cd->{result}, $args{result}, 'result');
              }
          }
      };
  }
  
  1;
  # ABSTRACT: Routines to test Data::Sah (human compiler)
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Test::Data::Sah::Human - Routines to test Data::Sah (human compiler)
  
  =head1 VERSION
  
  This document describes version 0.907 of Test::Data::Sah::Human (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =head1 FUNCTIONS
  
  =head2 test_human(%args)
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
TEST_DATA_SAH_HUMAN

    $main::fatpacked{"Test/Data/Sah/Perl.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'TEST_DATA_SAH_PERL';
  package Test::Data::Sah::Perl;
  
  our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
  our $DATE = '2020-02-12'; # DATE
  our $DIST = 'Data-Sah'; # DIST
  our $VERSION = '0.907'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  use Test::Data::Sah qw(run_spectest all_match);
  use Test::More 0.98;
  
  use Data::Sah qw(gen_validator);
  
  use Exporter qw(import);
  our @EXPORT_OK = qw(run_spectest_for_perl);
  
  sub run_spectest_for_perl {
      run_spectest(
          test_merge_clause_sets => 1,
          test_func => sub {
              my $test = shift;
  
              my $data = $test->{input};
              my $ho = exists($test->{output}); # has output
              my $vbool;
              eval { $vbool = gen_validator(
                  $test->{schema}, {accept_ref=>$ho}) };
              my $eval_err = $@;
              if ($test->{dies}) {
                  ok($eval_err, "compile error");
                  return;
              } else {
                  ok(!$eval_err, "compile success") or do {
                      diag $eval_err;
                      return;
                  };
              }
  
              if ($test->{valid_inputs}) {
                  # test multiple inputs, currently only done for rt=bool_valid
                  for my $i (0..@{ $test->{valid_inputs} }-1) {
                      my $data = $test->{valid_inputs}[$i];
                      ok($vbool->($ho ? \$data : $data), "valid input [$i]");
                  }
                  for my $i (0..@{ $test->{invalid_inputs} }-1) {
                      my $data = $test->{invalid_inputs}[$i];
                      ok(!$vbool->($ho ? \$data : $data), "invalid input [$i]");
                  }
              } elsif (exists $test->{valid}) {
                  # test a single input
                  if ($test->{valid}) {
                      ok($vbool->($ho ? \$data : $data), "valid (rt=bool_valid)");
                      if ($ho) {
                          is_deeply($data, $test->{output}, "output");
                      }
                  } else {
                      ok(!$vbool->($ho ? \$data : $data), "invalid (rt=bool_valid)");
                  }
              }
  
              my $vstr = gen_validator($test->{schema},
                                       {return_type=>'str_errmsg'});
              if (exists $test->{valid}) {
                  if ($test->{valid}) {
                      is($vstr->($test->{input}), "", "valid (rt=str_errmsg)");
                  } else {
                      like($vstr->($test->{input}), qr/\S/, "invalid (rt=str_errmsg)");
                  }
              }
  
              my $vfull = gen_validator($test->{schema},
                                        {return_type=>'hash_details'});
              my $res = $vfull->($test->{input});
              is(ref($res), 'HASH', "validator (rt=hash_details) returns hash");
              if (exists($test->{errors}) || exists($test->{warnings}) ||
                      exists($test->{valid})) {
                  my $errors = $test->{errors} // ($test->{valid} ? 0 : 1);
                  is(scalar(keys %{ $res->{errors} // {} }), $errors, "errors (rt=hash_details)")
                      or diag explain $res;
                  my $warnings = $test->{warnings} // 0;
                  is(scalar(keys %{ $res->{warnings} // {} }), $warnings,
                     "warnings (rt=hash_details)")
                      or diag explain $res;
              }
          }, # test_func
  
          skip_if => sub {
              my $t = shift;
              return 0 unless $t->{tags};
  
              # disabled temporarily because failing for bool, even though i've
              # adjust stuffs. but 'between' clause should be very seldomly used
              # on bool, moreover with op, so i haven't looked into it.
              return "currently failing"
                  if all_match([qw/type:bool clause:between op/], $t->{tags});
  
              for (qw/
  
                         check
                         check_each_elem
                         check_each_index
                         check_each_key
                         check_each_value
                         check_prop
                         exists
                         if
                         postfilters
                         prop
                         uniq
  
                     /) {
                  return "clause $_ not yet implemented"
                      if all_match(["clause:$_"], $t->{tags});
              }
  
              return "properties are not yet implemented"
                  if grep {/^prop:/} @{ $t->{tags} };
  
              0;
          }, # skip_if
  
      );
  }
  
  1;
  # ABSTRACT: Routines for testing Data::Sah (perl compiler)
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Test::Data::Sah::Perl - Routines for testing Data::Sah (perl compiler)
  
  =head1 VERSION
  
  This document describes version 0.907 of Test::Data::Sah::Perl (from Perl distribution Data-Sah), released on 2020-02-12.
  
  =head1 FUNCTIONS
  
  =head2 run_spectest_for_perl()
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Data-Sah>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Data-Sah>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Sah>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
TEST_DATA_SAH_PERL

    $main::fatpacked{"Test/Exception.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'TEST_EXCEPTION';
  use strict;
  use warnings;
  
  package Test::Exception;
  use Test::Builder;
  use Sub::Uplevel qw( uplevel );
  use base qw( Exporter );
  
  our $VERSION = '0.43';
  $VERSION = eval $VERSION;
  
  our @EXPORT = qw(dies_ok lives_ok throws_ok lives_and);
  
  my $Tester = Test::Builder->new;
  
  sub import {
      my $self = shift;
      if ( @_ ) {
          my $package = caller;
          $Tester->exported_to( $package );
          $Tester->plan( @_ );
      };
      $self->export_to_level( 1, $self, $_ ) foreach @EXPORT;
  }
  
  =head1 NAME
  
  Test::Exception - Test exception-based code
  
  =head1 SYNOPSIS
  
    use Test::More tests => 5;
    use Test::Exception;
  
    # or if you don't need Test::More
  
    use Test::Exception tests => 5;
  
    # then...
  
    # Check that the stringified exception matches given regex
    throws_ok { $foo->method } qr/division by zero/, 'zero caught okay';
  
    # Check an exception of the given class (or subclass) is thrown
    throws_ok { $foo->method } 'Error::Simple', 'simple error thrown';
    
    # all Test::Exceptions subroutines are guaranteed to preserve the state 
    # of $@ so you can do things like this after throws_ok and dies_ok
    like $@, 'what the stringified exception should look like';
  
    # Check that something died - we do not care why
    dies_ok { $foo->method } 'expecting to die';
  
    # Check that something did not die
    lives_ok { $foo->method } 'expecting to live';
  
    # Check that a test runs without an exception
    lives_and { is $foo->method, 42 } 'method is 42';
    
    # or if you don't like prototyped functions
    
    throws_ok( sub { $foo->method }, qr/division by zero/,
        'zero caught okay' );
    throws_ok( sub { $foo->method }, 'Error::Simple', 
        'simple error thrown' );
    dies_ok( sub { $foo->method }, 'expecting to die' );
    lives_ok( sub { $foo->method }, 'expecting to live' );
    lives_and( sub { is $foo->method, 42 }, 'method is 42' );
  
  
  =head1 DESCRIPTION
  
  This module provides a few convenience methods for testing exception based code. It is built with 
  L<Test::Builder> and plays happily with L<Test::More> and friends.
  
  If you are not already familiar with L<Test::More> now would be the time to go take a look.
  
  You can specify the test plan when you C<use Test::Exception> in the same way as C<use Test::More>.
  See L<Test::More> for details.
  
  NOTE: Test::Exception only checks for exceptions. It will ignore other methods of stopping 
  program execution - including exit(). If you have an exit() in evalled code Test::Exception
  will not catch this with any of its testing functions.
  
  NOTE: This module uses L<Sub::Uplevel> and relies on overriding
  C<CORE::GLOBAL::caller> to hide your test blocks from the call stack.  If this
  use of global overrides concerns you, the L<Test::Fatal> module offers a more
  minimalist alternative.
  
  =cut
  
  sub _quiet_caller (;$) { ## no critic Prototypes
      my $height = $_[0];
      $height++;
  
      if ( CORE::caller() eq 'DB' ) {
          # passthrough the @DB::args trick
          package DB;
          if( wantarray ) {
              if ( !@_ ) {
                  return (CORE::caller($height))[0..2];
              }
              else {
                  # If we got here, we are within a Test::Exception test, and
                  # something is producing a stacktrace. In case this is a full
                  # trace (i.e. confess() ), we have to make sure that the sub
                  # args are not visible. If we do not do this, and the test in
                  # question is throws_ok() with a regex, it will end up matching
                  # against itself in the args to throws_ok().
                  #
                  # While it is possible (and maybe wise), to test if we are
                  # indeed running under throws_ok (by crawling the stack right
                  # up from here), the old behavior of Test::Exception was to
                  # simply obliterate @DB::args altogether in _quiet_caller, so
                  # we are just preserving the behavior to avoid surprises
                  #
                  my @frame_info = CORE::caller($height);
                  @DB::args = ();
                  return @frame_info;
              }
          }
  
          # fallback if nothing above returns
          return CORE::caller($height);
      }
      else {
          if( wantarray and !@_ ) {
              return (CORE::caller($height))[0..2];
          }
          else {
              return CORE::caller($height);
          }
      }
  }
  
  sub _try_as_caller {
      my $coderef = shift;
  
      # local works here because Sub::Uplevel has already overridden caller
      local *CORE::GLOBAL::caller;
      { no warnings 'redefine'; *CORE::GLOBAL::caller = \&_quiet_caller; }
  
      eval { uplevel 3, $coderef };
      return $@;
  };
  
  
  sub _is_exception {
      my $exception = shift;
      return ref $exception || $exception ne '';
  };
  
  
  sub _exception_as_string {
      my ( $prefix, $exception ) = @_;
      return "$prefix normal exit" unless _is_exception( $exception );
      my $class = ref $exception;
      $exception = "$class ($exception)" 
              if $class && "$exception" !~ m/^\Q$class/;
      chomp $exception;
      return "$prefix $exception";
  };
  
  
  =over 4
  
  =item B<throws_ok>
  
  Tests to see that a specific exception is thrown. throws_ok() has two forms: 
  
    throws_ok BLOCK REGEX, TEST_DESCRIPTION
    throws_ok BLOCK CLASS, TEST_DESCRIPTION
  
  In the first form the test passes if the stringified exception matches the give regular expression. For example:
  
      throws_ok { read_file( 'unreadable' ) } qr/No file/, 'no file';
  
  If your perl does not support C<qr//> you can also pass a regex-like string, for example:
  
      throws_ok { read_file( 'unreadable' ) } '/No file/', 'no file';
  
  The second form of throws_ok() test passes if the exception is of the same class as the one supplied, or a subclass of that class. For example:
  
      throws_ok { $foo->bar } "Error::Simple", 'simple error';
  
  Will only pass if the C<bar> method throws an Error::Simple exception, or a subclass of an Error::Simple exception.
  
  You can get the same effect by passing an instance of the exception you want to look for. The following is equivalent to the previous example:
  
      my $SIMPLE = Error::Simple->new;
      throws_ok { $foo->bar } $SIMPLE, 'simple error';
  
  Should a throws_ok() test fail it produces appropriate diagnostic messages. For example:
  
      not ok 3 - simple error
      #     Failed test (test.t at line 48)
      # expecting: Error::Simple exception
      # found: normal exit
  
  Like all other Test::Exception functions you can avoid prototypes by passing a subroutine explicitly:
  
      throws_ok( sub {$foo->bar}, "Error::Simple", 'simple error' );
  
  A true value is returned if the test succeeds, false otherwise. On exit $@ is guaranteed to be the cause of death (if any).
  
  A description of the exception being checked is used if no optional test description is passed.
  
  NOTE: Remember when you C<die $string_without_a_trailing_newline> perl will 
  automatically add the current script line number, input line number and a newline. This will
  form part of the string that throws_ok regular expressions match against.
  
  
  =cut
  
  
  sub throws_ok (&$;$) {
      my ( $coderef, $expecting, $description ) = @_;
      unless (defined $expecting) {
          require Carp;
          Carp::croak( "throws_ok: must pass exception class/object or regex" ); 
      }
      $description = _exception_as_string( "threw", $expecting )
          unless defined $description;
      my $exception = _try_as_caller( $coderef );
      my $regex = $Tester->maybe_regex( $expecting );
      my $ok = $regex 
          ? ( $exception =~ m/$regex/ ) 
          : eval { 
              $exception->isa( ref $expecting ? ref $expecting : $expecting ) 
          };
      $Tester->ok( $ok, $description );
      unless ( $ok ) {
          $Tester->diag( _exception_as_string( "expecting:", $expecting ) );
          $Tester->diag( _exception_as_string( "found:", $exception ) );
      };
      $@ = $exception;
      return $ok;
  };
  
  
  =item B<dies_ok>
  
  Checks that a piece of code dies, rather than returning normally. For example:
  
      sub div {
          my ( $a, $b ) = @_;
          return $a / $b;
      };
  
      dies_ok { div( 1, 0 ) } 'divide by zero detected';
  
      # or if you don't like prototypes
      dies_ok( sub { div( 1, 0 ) }, 'divide by zero detected' );
  
  A true value is returned if the test succeeds, false otherwise. On exit $@ is guaranteed to be the cause of death (if any).
  
  Remember: This test will pass if the code dies for any reason. If you care about the reason it might be more sensible to write a more specific test using throws_ok().
  
  The test description is optional, but recommended. 
  
  =cut
  
  sub dies_ok (&;$) {
      my ( $coderef, $description ) = @_;
      my $exception = _try_as_caller( $coderef );
      my $ok = $Tester->ok( _is_exception($exception), $description );
      $@ = $exception;
      return $ok;
  }
  
  
  =item B<lives_ok>
  
  Checks that a piece of code doesn't die. This allows your test script to continue, rather than aborting if you get an unexpected exception. For example:
  
      sub read_file {
          my $file = shift;
          local $/;
          open my $fh, '<', $file or die "open failed ($!)\n";
          $file = <FILE>;
          return $file;
      };
  
      my $file;
      lives_ok { $file = read_file('test.txt') } 'file read';
  
      # or if you don't like prototypes
      lives_ok( sub { $file = read_file('test.txt') }, 'file read' );
  
  Should a lives_ok() test fail it produces appropriate diagnostic messages. For example:
  
      not ok 1 - file read
      #     Failed test (test.t at line 15)
      # died: open failed (No such file or directory)
  
  A true value is returned if the test succeeds, false otherwise. On exit $@ is guaranteed to be the cause of death (if any).
  
  The test description is optional, but recommended. 
  
  =cut
  
  sub lives_ok (&;$) {
      my ( $coderef, $description ) = @_;
      my $exception = _try_as_caller( $coderef );
      my $ok = $Tester->ok( ! _is_exception( $exception ), $description );
      $Tester->diag( _exception_as_string( "died:", $exception ) ) unless $ok;
      $@ = $exception;
      return $ok;
  }
  
  
  =item B<lives_and>
  
  Run a test that may throw an exception. For example, instead of doing:
  
    my $file;
    lives_ok { $file = read_file('answer.txt') } 'read_file worked';
    is $file, "42", 'answer was 42';
  
  You can use lives_and() like this:
  
    lives_and { is read_file('answer.txt'), "42" } 'answer is 42';
    # or if you don't like prototypes
    lives_and(sub {is read_file('answer.txt'), "42"}, 'answer is 42');
  
  Which is the same as doing
  
    is read_file('answer.txt'), "42\n", 'answer is 42';
  
  unless C<read_file('answer.txt')> dies, in which case you get the same kind of error as lives_ok()
  
    not ok 1 - answer is 42
    #     Failed test (test.t at line 15)
    # died: open failed (No such file or directory)
  
  A true value is returned if the test succeeds, false otherwise. On exit $@ is guaranteed to be the cause of death (if any).
  
  The test description is optional, but recommended.
  
  =cut
  
  sub lives_and (&;$) {
      my ( $test, $description ) = @_;
      {
          my $ok = \&Test::Builder::ok;
          no warnings;
          local *Test::Builder::ok = sub {
              local $Test::Builder::Level = $Test::Builder::Level + 1;
              $_[2] = $description unless defined $_[2];
              $ok->(@_);
          };
          use warnings;
          eval { $test->() } and return 1;
      };
      my $exception = $@;
      if ( _is_exception( $exception ) ) {
          $Tester->ok( 0, $description );
          $Tester->diag( _exception_as_string( "died:", $exception ) );
      };
      $@ = $exception;
      return;
  }
  
  =back
  
  
  =head1 SKIPPING TEST::EXCEPTION TESTS
  
  Sometimes we want to use Test::Exception tests in a test suite, but don't want to force the user to have Test::Exception installed. One way to do this is to skip the tests if Test::Exception is absent. You can do this with code something like this:
  
    use strict;
    use warnings;
    use Test::More;
    
    BEGIN {
        eval "use Test::Exception";
        plan skip_all => "Test::Exception needed" if $@;
    }
    
    plan tests => 2;
    # ... tests that need Test::Exception ...
  
  Note that we load Test::Exception in a C<BEGIN> block ensuring that the subroutine prototypes are in place before the rest of the test script is compiled.
  
  
  =head1 BUGS
  
  There are some edge cases in Perl's exception handling where Test::Exception will miss exceptions
  thrown in DESTROY blocks. See the RT bug L<http://rt.cpan.org/Ticket/Display.html?id=24678> for
  details, along with the t/edge-cases.t in the distribution test suite. These will be addressed in
  a future Test::Exception release.
  
  If you find any more bugs please let me know by e-mail, or report the problem with 
  L<http://rt.cpan.org/>.
  
  
  =head1 COMMUNITY
  
  =over 4
  
  =item perl-qa
  
  If you are interested in testing using Perl I recommend you visit L<http://qa.perl.org/> and join the excellent perl-qa mailing list. See L<http://lists.perl.org/showlist.cgi?name=perl-qa> for details on how to subscribe.
  
  =item perlmonks
  
  You can find users of Test::Exception, including the module author, on  L<http://www.perlmonks.org/>. Feel free to ask questions on Test::Exception there.
  
  =item CPAN::Forum
  
  The CPAN Forum is a web forum for discussing Perl's CPAN modules.   The Test::Exception forum can be found at L<http://www.cpanforum.com/dist/Test-Exception>.
  
  =item AnnoCPAN
  
  AnnoCPAN is a web site that allows community annotations of Perl module documentation. The Test::Exception annotations can be found at L<http://annocpan.org/~ADIE/Test-Exception/>.
  
  =back
  
  
  =head1 TO DO
  
  If you think this module should do something that it doesn't (or does something that it shouldn't) please let me know.
  
  You can see my current to do list at L<http://adrianh.tadalist.com/lists/public/15421>, with an RSS feed of changes at L<http://adrianh.tadalist.com/lists/feed_public/15421>.
  
  
  =head1 ACKNOWLEDGMENTS
  
  Thanks to chromatic and Michael G Schwern for the excellent Test::Builder, without which this module wouldn't be possible.
  
  Thanks to 
  Adam Kennedy,
  Andy Lester, 
  Aristotle Pagaltzis, 
  Ben Prew, 
  Cees Hek,
  Chris Dolan,
  chromatic, 
  Curt Sampson,
  David Cantrell,
  David Golden, 
  David Tulloh,
  David Wheeler, 
  J. K. O'Brien,
  Janek Schleicher,
  Jim Keenan, 
  Jos I. Boumans, 
  Joshua ben Jore,
  Jost Krieger,
  Mark Fowler, 
  Michael G Schwern, 
  Nadim Khemir,
  Paul McCann,
  Perrin Harkins, 
  Peter Rabbitson,
  Peter Scott, 
  Ricardo Signes,
  Rob Muhlestein,
  Scott R. Godin,
  Steve Purkis,
  Steve, 
  Tim Bunce,
  and various anonymous folk for comments, suggestions, bug reports and patches.
  
  =head1 AUTHOR
  
  Adrian Howard <adrianh@quietstars.com>
  
  If you can spare the time, please drop me a line if you find this module useful.
  
  
  =head1 SEE ALSO
  
  =over 4
  
  =item L<http://del.icio.us/tag/Test::Exception>
  
  Delicious links on Test::Exception.
  
  =item L<Test::Fatal>
  
  A slightly different interface to testing exceptions, without overriding C<CORE::caller>.
  
  =item L<Test::Warnings> & L<Test::Warn> & L<Test::NoWarnings>
  
  Modules to help test warnings.
  
  =item L<Test::Builder>
  
  Support module for building test libraries.
  
  =item L<Test::Simple> & L<Test::More>
  
  Basic utilities for writing tests.
  
  =item L<http://qa.perl.org/test-modules.html>
  
  Overview of some of the many testing modules available on CPAN.
  
  =item L<http://del.icio.us/tag/perl+testing>
  
  Delicious links on perl testing.
  
  =back
  
  
  =head1 LICENCE
  
  Copyright 2002-2007 Adrian Howard, All Rights Reserved.
  
  This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
  
  =cut
  
  1;
TEST_EXCEPTION

    $main::fatpacked{"Test/Fatal.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'TEST_FATAL';
  use strict;
  use warnings;
  package Test::Fatal;
  # ABSTRACT: incredibly simple helpers for testing code with exceptions
  $Test::Fatal::VERSION = '0.014';
  #pod =head1 SYNOPSIS
  #pod
  #pod   use Test::More;
  #pod   use Test::Fatal;
  #pod
  #pod   use System::Under::Test qw(might_die);
  #pod
  #pod   is(
  #pod     exception { might_die; },
  #pod     undef,
  #pod     "the code lived",
  #pod   );
  #pod
  #pod   like(
  #pod     exception { might_die; },
  #pod     qr/turns out it died/,
  #pod     "the code died as expected",
  #pod   );
  #pod
  #pod   isa_ok(
  #pod     exception { might_die; },
  #pod     'Exception::Whatever',
  #pod     'the thrown exception',
  #pod   );
  #pod
  #pod =head1 DESCRIPTION
  #pod
  #pod Test::Fatal is an alternative to the popular L<Test::Exception>.  It does much
  #pod less, but should allow greater flexibility in testing exception-throwing code
  #pod with about the same amount of typing.
  #pod
  #pod It exports one routine by default: C<exception>.
  #pod
  #pod =cut
  
  use Carp ();
  use Try::Tiny 0.07;
  
  use Exporter 5.57 'import';
  
  our @EXPORT    = qw(exception);
  our @EXPORT_OK = qw(exception success dies_ok lives_ok);
  
  #pod =func exception
  #pod
  #pod   my $exception = exception { ... };
  #pod
  #pod C<exception> takes a bare block of code and returns the exception thrown by
  #pod that block.  If no exception was thrown, it returns undef.
  #pod
  #pod B<Achtung!>  If the block results in a I<false> exception, such as 0 or the
  #pod empty string, Test::Fatal itself will die.  Since either of these cases
  #pod indicates a serious problem with the system under testing, this behavior is
  #pod considered a I<feature>.  If you must test for these conditions, you should use
  #pod L<Try::Tiny>'s try/catch mechanism.  (Try::Tiny is the underlying exception
  #pod handling system of Test::Fatal.)
  #pod
  #pod Note that there is no TAP assert being performed.  In other words, no "ok" or
  #pod "not ok" line is emitted.  It's up to you to use the rest of C<exception> in an
  #pod existing test like C<ok>, C<isa_ok>, C<is>, et cetera.  Or you may wish to use
  #pod the C<dies_ok> and C<lives_ok> wrappers, which do provide TAP output.
  #pod
  #pod C<exception> does I<not> alter the stack presented to the called block, meaning
  #pod that if the exception returned has a stack trace, it will include some frames
  #pod between the code calling C<exception> and the thing throwing the exception.
  #pod This is considered a I<feature> because it avoids the occasionally twitchy
  #pod C<Sub::Uplevel> mechanism.
  #pod
  #pod B<Achtung!>  This is not a great idea:
  #pod
  #pod   sub exception_like(&$;$) {
  #pod       my ($code, $pattern, $name) = @_;
  #pod       like( &exception($code), $pattern, $name );
  #pod   }
  #pod
  #pod   exception_like(sub { }, qr/foo/, 'foo appears in the exception');
  #pod
  #pod If the code in the C<...> is going to throw a stack trace with the arguments to
  #pod each subroutine in its call stack (for example via C<Carp::confess>,
  #pod the test name, "foo appears in the exception" will itself be matched by the
  #pod regex.  Instead, write this:
  #pod
  #pod   like( exception { ... }, qr/foo/, 'foo appears in the exception' );
  #pod
  #pod B<Achtung>: One final bad idea:
  #pod
  #pod   isnt( exception { ... }, undef, "my code died!");
  #pod
  #pod It's true that this tests that your code died, but you should really test that
  #pod it died I<for the right reason>.  For example, if you make an unrelated mistake
  #pod in the block, like using the wrong dereference, your test will pass even though
  #pod the code to be tested isn't really run at all.  If you're expecting an
  #pod inspectable exception with an identifier or class, test that.  If you're
  #pod expecting a string exception, consider using C<like>.
  #pod
  #pod =cut
  
  our ($REAL_TBL, $REAL_CALCULATED_TBL) = (1, 1);
  
  sub exception (&) {
    my $code = shift;
  
    return try {
      my $incremented = $Test::Builder::Level - $REAL_CALCULATED_TBL;
      local $Test::Builder::Level = $REAL_CALCULATED_TBL;
      if ($incremented) {
          # each call to exception adds 5 stack frames
          $Test::Builder::Level += 5;
          for my $i (1..$incremented) {
              # -2 because we want to see it from the perspective of the call to
              # is() within the call to $code->()
              my $caller = caller($Test::Builder::Level - 2);
              if ($caller eq __PACKAGE__) {
                  # each call to exception adds 5 stack frames
                  $Test::Builder::Level = $Test::Builder::Level + 5;
              }
              else {
                  $Test::Builder::Level = $Test::Builder::Level + 1;
              }
          }
      }
  
      local $REAL_CALCULATED_TBL = $Test::Builder::Level;
      $code->();
      return undef;
    } catch {
      return $_ if $_;
  
      my $problem = defined $_ ? 'false' : 'undef';
      Carp::confess("$problem exception caught by Test::Fatal::exception");
    };
  }
  
  #pod =func success
  #pod
  #pod   try {
  #pod     should_live;
  #pod   } catch {
  #pod     fail("boo, we died");
  #pod   } success {
  #pod     pass("hooray, we lived");
  #pod   };
  #pod
  #pod C<success>, exported only by request, is a L<Try::Tiny> helper with semantics
  #pod identical to L<C<finally>|Try::Tiny/finally>, but the body of the block will
  #pod only be run if the C<try> block ran without error.
  #pod
  #pod Although almost any needed exception tests can be performed with C<exception>,
  #pod success blocks may sometimes help organize complex testing.
  #pod
  #pod =cut
  
  sub success (&;@) {
    my $code = shift;
    return finally( sub {
      return if @_; # <-- only run on success
      $code->();
    }, @_ );
  }
  
  #pod =func dies_ok
  #pod
  #pod =func lives_ok
  #pod
  #pod Exported only by request, these two functions run a given block of code, and
  #pod provide TAP output indicating if it did, or did not throw an exception. 
  #pod These provide an easy upgrade path for replacing existing unit tests based on
  #pod C<Test::Exception>.
  #pod
  #pod RJBS does not suggest using this except as a convenience while porting tests to
  #pod use Test::Fatal's C<exception> routine.
  #pod
  #pod   use Test::More tests => 2;
  #pod   use Test::Fatal qw(dies_ok lives_ok);
  #pod
  #pod   dies_ok { die "I failed" } 'code that fails';
  #pod
  #pod   lives_ok { return "I'm still alive" } 'code that does not fail';
  #pod
  #pod =cut
  
  my $Tester;
  
  # Signature should match that of Test::Exception
  sub dies_ok (&;$) {
    my $code = shift;
    my $name = shift;
  
    require Test::Builder;
    $Tester ||= Test::Builder->new;
  
    my $ok = $Tester->ok( exception( \&$code ), $name );
    $ok or $Tester->diag( "expected an exception but none was raised" );
    return $ok;
  }
  
  sub lives_ok (&;$) {
    my $code = shift;
    my $name = shift;
  
    require Test::Builder;
    $Tester ||= Test::Builder->new;
  
    my $ok = $Tester->ok( !exception( \&$code ), $name );
    $ok or $Tester->diag( "expected return but an exception was raised" );
    return $ok;
  }
  
  1;
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Test::Fatal - incredibly simple helpers for testing code with exceptions
  
  =head1 VERSION
  
  version 0.014
  
  =head1 SYNOPSIS
  
    use Test::More;
    use Test::Fatal;
  
    use System::Under::Test qw(might_die);
  
    is(
      exception { might_die; },
      undef,
      "the code lived",
    );
  
    like(
      exception { might_die; },
      qr/turns out it died/,
      "the code died as expected",
    );
  
    isa_ok(
      exception { might_die; },
      'Exception::Whatever',
      'the thrown exception',
    );
  
  =head1 DESCRIPTION
  
  Test::Fatal is an alternative to the popular L<Test::Exception>.  It does much
  less, but should allow greater flexibility in testing exception-throwing code
  with about the same amount of typing.
  
  It exports one routine by default: C<exception>.
  
  =head1 FUNCTIONS
  
  =head2 exception
  
    my $exception = exception { ... };
  
  C<exception> takes a bare block of code and returns the exception thrown by
  that block.  If no exception was thrown, it returns undef.
  
  B<Achtung!>  If the block results in a I<false> exception, such as 0 or the
  empty string, Test::Fatal itself will die.  Since either of these cases
  indicates a serious problem with the system under testing, this behavior is
  considered a I<feature>.  If you must test for these conditions, you should use
  L<Try::Tiny>'s try/catch mechanism.  (Try::Tiny is the underlying exception
  handling system of Test::Fatal.)
  
  Note that there is no TAP assert being performed.  In other words, no "ok" or
  "not ok" line is emitted.  It's up to you to use the rest of C<exception> in an
  existing test like C<ok>, C<isa_ok>, C<is>, et cetera.  Or you may wish to use
  the C<dies_ok> and C<lives_ok> wrappers, which do provide TAP output.
  
  C<exception> does I<not> alter the stack presented to the called block, meaning
  that if the exception returned has a stack trace, it will include some frames
  between the code calling C<exception> and the thing throwing the exception.
  This is considered a I<feature> because it avoids the occasionally twitchy
  C<Sub::Uplevel> mechanism.
  
  B<Achtung!>  This is not a great idea:
  
    sub exception_like(&$;$) {
        my ($code, $pattern, $name) = @_;
        like( &exception($code), $pattern, $name );
    }
  
    exception_like(sub { }, qr/foo/, 'foo appears in the exception');
  
  If the code in the C<...> is going to throw a stack trace with the arguments to
  each subroutine in its call stack (for example via C<Carp::confess>,
  the test name, "foo appears in the exception" will itself be matched by the
  regex.  Instead, write this:
  
    like( exception { ... }, qr/foo/, 'foo appears in the exception' );
  
  B<Achtung>: One final bad idea:
  
    isnt( exception { ... }, undef, "my code died!");
  
  It's true that this tests that your code died, but you should really test that
  it died I<for the right reason>.  For example, if you make an unrelated mistake
  in the block, like using the wrong dereference, your test will pass even though
  the code to be tested isn't really run at all.  If you're expecting an
  inspectable exception with an identifier or class, test that.  If you're
  expecting a string exception, consider using C<like>.
  
  =head2 success
  
    try {
      should_live;
    } catch {
      fail("boo, we died");
    } success {
      pass("hooray, we lived");
    };
  
  C<success>, exported only by request, is a L<Try::Tiny> helper with semantics
  identical to L<C<finally>|Try::Tiny/finally>, but the body of the block will
  only be run if the C<try> block ran without error.
  
  Although almost any needed exception tests can be performed with C<exception>,
  success blocks may sometimes help organize complex testing.
  
  =head2 dies_ok
  
  =head2 lives_ok
  
  Exported only by request, these two functions run a given block of code, and
  provide TAP output indicating if it did, or did not throw an exception. 
  These provide an easy upgrade path for replacing existing unit tests based on
  C<Test::Exception>.
  
  RJBS does not suggest using this except as a convenience while porting tests to
  use Test::Fatal's C<exception> routine.
  
    use Test::More tests => 2;
    use Test::Fatal qw(dies_ok lives_ok);
  
    dies_ok { die "I failed" } 'code that fails';
  
    lives_ok { return "I'm still alive" } 'code that does not fail';
  
  =head1 AUTHOR
  
  Ricardo Signes <rjbs@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2010 by Ricardo Signes.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
TEST_FATAL

    $main::fatpacked{"Test/Perinci/Sub/Wrapper.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'TEST_PERINCI_SUB_WRAPPER';
  package Test::Perinci::Sub::Wrapper;
  
  our $DATE = '2019-07-04'; # DATE
  our $VERSION = '0.851'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  
  use Function::Fallback::CoreOrPP qw(clone);
  #use List::Util qw(shuffle);
  use Perinci::Sub::Wrapper qw(wrap_sub);
  use Test::More 0.96;
  
  our @ISA = qw(Exporter);
  our @EXPORT_OK = qw(test_wrap);
  
  sub test_wrap {
      my %test_args = @_;
      $test_args{wrap_args} or die "BUG: wrap_args not defined";
      my $test_name = $test_args{name} or die "BUG: test_name not defined";
  
      for my $wrapper_type (qw/dynamic embed/) {
          next if $wrapper_type eq 'dynamic' && $test_args{skip_dynamic};
          next if $wrapper_type eq 'embed'   && $test_args{skip_embed};
          subtest "$test_name ($wrapper_type)" => sub {
  
              if ($test_args{pretest}) {
                  $test_args{pretest}->();
              }
  
              my $wrap_args = clone($test_args{wrap_args});
              die "BUG: embed must not be specified in wrap_args, test_wrap() ".
                  "will always test dynamic (embed=0) *and* embed mode"
                      if exists $wrap_args->{embed};
              if ($wrapper_type eq 'embed') {
                  $wrap_args->{embed} = 1;
                  #diag explain $wrap_args->{meta};
              } else {
                  $wrap_args->{embed} = 0;
              }
  
              my $wrap_res;
              eval { $wrap_res = wrap_sub(%$wrap_args) };
              my $wrap_eval_err = $@;
              if ($test_args{wrap_dies}) {
                  ok($wrap_eval_err, "wrap dies");
                  return;
              } else {
                  ok(!$wrap_eval_err, "wrap doesn't die") or do {
                      diag $wrap_eval_err;
                      return;
                  };
              }
  
              if (defined $test_args{wrap_status}) {
                  is(ref($wrap_res), 'ARRAY', 'wrap res is array');
                  is($wrap_res->[0], $test_args{wrap_status},
                     "wrap status is $test_args{wrap_status}")
                      or diag "wrap res: ", explain($wrap_res);
              }
  
              return unless $wrap_res->[0] == 200;
  
              my $sub;
              if ($wrapper_type eq 'embed') {
                  my $src = $wrap_res->[2]{source};
                  my $meta = $wrap_res->[2]{meta};
                  my $args_as = $meta->{args_as};
                  my $orig_args_as = $wrap_args->{meta}{args_as} // 'hash';
                  my $sub_name = $wrap_res->[2]{sub_name};
                  my $eval_src = join(
                      "\n",
                      $src->{presub1},
                      $src->{presub2},
                      'sub {',
                      '    my %args;',
                      ('    my @args;') x !!($orig_args_as eq 'array' || $args_as eq 'array'),
                      ('    my $args;') x !!($orig_args_as =~ /ref/ || $args_as =~ /ref/),
                      '    '.
                          ($args_as eq 'hash' ? '%args = @_;' :
                               $args_as eq 'hashref' ? '$args = $_[0] // {}; %args = %$args;' :
                                   $args_as eq 'array' ? '@args = @_;' :
                                       '$args = $_[0] // [];'),
                      $src->{preamble},
                      ($src->{postamble} ? '    $_w_res = do {' : ''),
                      $sub_name. ($sub_name =~ /\A\$/ ? '->':'').'('.
                          ($orig_args_as eq 'hash' ? '%args' :
                               $orig_args_as eq 'hashref' ? '$args' :
                                   $orig_args_as eq 'array' ? '@args' :
                                       '$args').');',
                      ($src->{postamble} ? '}; # do' : ''),
                      $src->{postamble},
                      '}; # sub',
                  );
                  $sub = eval $eval_src;
                  my $eval_err = $@;
                  ok(!$eval_err, "embed code compiles ok") or do {
                      diag "eval err: ", $eval_err;
                      diag "eval source: ", $eval_src;
                      return;
                  };
                  diag "eval source: ", $eval_src
                      if $ENV{LOG_PERINCI_WRAPPER_CODE};
              } else {
  
                  # check that we don't generate comment after code (unless it
                  # uses '##' instead of '#'), because this makes cutting comments
                  # easier. XXX this is using a simple regex and misses some.
                  for my $line (split /^/, $wrap_res->[2]{source}) {
                      if ($line =~ /(.*?)\s+#\s+(.*)/) {
                          my ($before, $after) = ($1, $2);
                          next unless $before =~ /\S/;
                          ok 0; diag "Source code contains comment line after some code '$line' (if you do this, you must use ## instead of # to help ease removing comment lines (e.g. in Dist::Zilla::Plugin::Rinci::Wrap))";
                      }
                  }
  
                  $sub = $wrap_res->[2]{sub};
              }
  
              # testing a single sub call
              my $call_argsr = $test_args{call_argsr};
              my $call_res;
              if ($call_argsr) {
                  eval { $call_res = $sub->(@$call_argsr) };
                  my $call_eval_err = $@;
                  if ($test_args{call_dies}) {
                      ok($call_eval_err, "call dies");
                      if ($test_args{call_die_message}) {
                          like($call_eval_err, $test_args{call_die_message},
                               "call die message");
                      }
                      return;
                  } else {
                      ok(!$call_eval_err, "call doesn't die")
                          or diag $call_eval_err;
                  }
  
                  if (defined $test_args{call_status}) {
                      is(ref($call_res), 'ARRAY', 'call res is array')
                          or diag "call res = ", explain($call_res);
                      is($call_res->[0], $test_args{call_status},
                         "call status is $test_args{call_status}")
                          or diag "call res = ", explain($call_res);
                  }
  
                  if (exists $test_args{call_res}) {
                      is_deeply($call_res, $test_args{call_res},
                                "call res")
                          or diag explain $call_res;
                  }
  
                  if (exists $test_args{call_actual_res}) {
                      is_deeply($call_res->[2], $test_args{call_actual_res},
                                "call actual res")
                          or diag explain $call_res->[2];
                  }
  
                  if (exists $test_args{call_actual_res_re}) {
                      like($call_res->[2], $test_args{call_actual_res_re},
                           "call actual res");
                  }
              }
  
              # testing multiple sub calls
              if ($test_args{calls}) {
                  my $i = 0;
                  for my $call (@{$test_args{calls}}) {
                      $i++;
                      subtest "call #$i: ".($call->{name} // "") => sub {
                          my $res;
                          eval { $res = $sub->(@{$call->{argsr}}) };
                          my $eval_err = $@;
                          if ($call->{dies}) {
                              ok($eval_err, "dies");
                              if ($call->{die_message}) {
                                  like($eval_err, $call->{die_message},
                                       "die message");
                              }
                              return;
                          } else {
                              ok(!$eval_err, "doesn't die")
                                  or diag $eval_err;
                          }
  
                          if (defined $call->{status}) {
                              is(ref($res), 'ARRAY', 'res is array')
                                  or diag "res = ", explain($res);
                              is($res->[0], $call->{status},
                                 "status is $call->{status}")
                                  or diag "res = ", explain($res);
                          }
  
                          if (exists $call->{res}) {
                              is_deeply($res, $call->{res}, "res")
                                  or diag explain $res;
                          }
  
                          if (exists $call->{actual_res}) {
                              is_deeply($res->[2], $call->{actual_res}, "actual res")
                                  or diag explain $res->[2];
                          }
  
                          if (exists $call->{actual_res_re}) {
                              like($res->[2], $call->{actual_res_re},
                                   "actual res re");
                          }
                      }; # subtest call #$i
                  }
              } # if calls
  
              if ($test_args{posttest}) {
                  $test_args{posttest}->($wrap_res, $call_res, $sub);
              }
  
              done_testing();
  
          }; # subtest
      } # for $wrapper_type
  }
  
  1;
  # ABSTRACT: Provide test_wrap() to test wrapper
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Test::Perinci::Sub::Wrapper - Provide test_wrap() to test wrapper
  
  =head1 VERSION
  
  This document describes version 0.851 of Test::Perinci::Sub::Wrapper (from Perl distribution Perinci-Sub-Wrapper), released on 2019-07-04.
  
  =for Pod::Coverage test_wrap
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Perinci-Sub-Wrapper>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Perinci-Sub-Wrapper>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Perinci-Sub-Wrapper>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2019, 2017, 2016, 2015, 2014, 2013, 2012, 2011 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
TEST_PERINCI_SUB_WRAPPER

    $main::fatpacked{"Test/Specio.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'TEST_SPECIO';
  package Test::Specio;
  
  use strict;
  use warnings;
  
  our $VERSION = '0.44';
  
  use IO::File;
  use Scalar::Util qw( blessed looks_like_number openhandle );
  use Specio::Library::Builtins;
  use Specio::Library::Numeric;
  use Specio::Library::Perl;
  use Specio::Library::String;
  
  # Loading this will force subification to use Sub::Quote, which can expose
  # some bugs.
  use Sub::Quote;
  use Test::Fatal;
  use Test::More 0.96;
  use Try::Tiny;
  
  use Exporter qw( import );
  
  our $ZERO    = 0;
  our $ONE     = 1;
  our $INT     = 100;
  our $NEG_INT = -100;
  our $NUM     = 42.42;
  our $NEG_NUM = -42.42;
  
  our $EMPTY_STRING  = q{};
  our $STRING        = 'foo';
  our $NUM_IN_STRING = 'has 42 in it';
  our $INT_WITH_NL1  = "1\n";
  our $INT_WITH_NL2  = "\n1";
  
  our $SCALAR_REF = do {
      ## no critic (Variables::ProhibitUnusedVariables)
      \( my $var );
  };
  our $SCALAR_REF_REF = \$SCALAR_REF;
  our $ARRAY_REF      = [];
  our $HASH_REF       = {};
  our $CODE_REF       = sub { };
  
  our $GLOB_REF = \*GLOB;
  
  our $FH;
  ## no critic (InputOutput::RequireBriefOpen)
  open $FH, '<', $INC{'Test/Specio.pm'}
      or die "Could not open $INC{'Test/Specio.pm'} for the test";
  
  our $FH_OBJECT = IO::File->new( $INC{'Test/Specio.pm'}, 'r' )
      or die "Could not open $INC{'Test/Specio.pm'} for the test";
  
  our $REGEX      = qr/../;
  our $REGEX_OBJ  = bless qr/../, 'BlessedQR';
  our $FAKE_REGEX = bless {}, 'Regexp';
  
  our $OBJECT = bless {}, 'FakeObject';
  
  our $UNDEF = undef;
  
  ## no critic (Modules::ProhibitMultiplePackages)
  {
      package _T::Thing;
  
      sub foo { }
  }
  
  our $CLASS_NAME = '_T::Thing';
  
  {
      package _T::BoolOverload;
  
      use overload
          'bool'   => sub { ${ $_[0] } },
          fallback => 0;
  
      sub new {
          my $bool = $_[1];
          bless \$bool, __PACKAGE__;
      }
  }
  
  our $BOOL_OVERLOAD_TRUE  = _T::BoolOverload->new(1);
  our $BOOL_OVERLOAD_FALSE = _T::BoolOverload->new(0);
  
  {
      package _T::StrOverload;
  
      use overload
          q{""}    => sub { ${ $_[0] } },
          fallback => 0;
  
      sub new {
          my $str = $_[1];
          bless \$str, __PACKAGE__;
      }
  }
  
  our $STR_OVERLOAD_EMPTY      = _T::StrOverload->new(q{});
  our $STR_OVERLOAD_FULL       = _T::StrOverload->new('full');
  our $STR_OVERLOAD_CLASS_NAME = _T::StrOverload->new('_T::StrOverload');
  
  {
      package _T::NumOverload;
  
      use overload
          '0+' => sub { ${ $_[0] } },
          '+'  => sub { ${ $_[0] } + $_[1] },
          fallback => 0;
  
      sub new {
          my $num = $_[1];
          bless \$num, __PACKAGE__;
      }
  }
  
  our $NUM_OVERLOAD_ZERO        = _T::NumOverload->new(0);
  our $NUM_OVERLOAD_ONE         = _T::NumOverload->new(1);
  our $NUM_OVERLOAD_NEG         = _T::NumOverload->new(-42);
  our $NUM_OVERLOAD_DECIMAL     = _T::NumOverload->new(42.42);
  our $NUM_OVERLOAD_NEG_DECIMAL = _T::NumOverload->new(42.42);
  
  {
      package _T::CodeOverload;
  
      use overload
          '&{}'    => sub { ${ $_[0] } },
          fallback => 0;
  
      sub new {
          my $code = $_[1];
          bless \$code, __PACKAGE__;
      }
  }
  
  our $CODE_OVERLOAD = _T::CodeOverload->new( sub { } );
  
  {
      package _T::RegexOverload;
  
      use overload
          'qr'     => sub { ${ $_[0] } },
          fallback => 0;
  
      sub new {
          my $regex = $_[1];
          bless \$regex, __PACKAGE__;
      }
  }
  
  our $REGEX_OVERLOAD = _T::RegexOverload->new(qr/foo/);
  
  {
      package _T::GlobOverload;
  
      use overload
          '*{}'    => sub { ${ $_[0] } },
          fallback => 0;
  
      sub new {
          my $glob = $_[1];
          bless \$glob, __PACKAGE__;
      }
  }
  
  {
      package _T::ScalarOverload;
  
      use overload
          '${}'    => sub { $_[0][0] },
          fallback => 0;
  
      sub new {
          my $scalar = $_[1];
          bless [$scalar], __PACKAGE__;
      }
  }
  
  our $SCALAR_OVERLOAD = _T::ScalarOverload->new('x');
  
  {
      package _T::ArrayOverload;
  
      use overload
          '@{}'    => sub { $_[0]{array} },
          fallback => 0;
  
      sub new {
          my $array = $_[1];
          bless { array => $array }, __PACKAGE__;
      }
  }
  
  our $ARRAY_OVERLOAD = _T::ArrayOverload->new( [ 1, 2, 3 ] );
  
  {
      package _T::HashOverload;
  
      use overload
          '%{}'    => sub { $_[0][0] },
          fallback => 0;
  
      sub new {
          my $hash = $_[1];
  
          # We use an array-based object so we make sure we test hash
          # overloading as opposed to just treating the object as a hash.
          bless [$hash], __PACKAGE__;
      }
  }
  
  our $HASH_OVERLOAD = _T::HashOverload->new( { x => 42, y => 84 } );
  
  my @vars;
  
  BEGIN {
      open my $fh, '<', $INC{'Test/Specio.pm'} or die $!;
      while (<$fh>) {
          push @vars, $1 if /^our (\$[A-Z0-9_]+)(?: +=|;)/;
      }
  }
  
  our @EXPORT_OK   = ( @vars, qw( builtins_tests describe test_constraint ) );
  our %EXPORT_TAGS = ( vars => \@vars );
  
  sub builtins_tests {
      my $GLOB             = shift;
      my $GLOB_OVERLOAD    = shift;
      my $GLOB_OVERLOAD_FH = shift;
  
      return {
          Item => {
              accept => [
                  $ZERO,
                  $ONE,
                  $BOOL_OVERLOAD_TRUE,
                  $BOOL_OVERLOAD_FALSE,
                  $INT,
                  $NEG_INT,
                  $NUM,
                  $NEG_NUM,
                  $NUM_OVERLOAD_ZERO,
                  $NUM_OVERLOAD_ONE,
                  $NUM_OVERLOAD_NEG,
                  $NUM_OVERLOAD_NEG_DECIMAL,
                  $NUM_OVERLOAD_DECIMAL,
                  $EMPTY_STRING,
                  $STRING,
                  $NUM_IN_STRING,
                  $STR_OVERLOAD_EMPTY,
                  $STR_OVERLOAD_FULL,
                  $INT_WITH_NL1,
                  $INT_WITH_NL2,
                  $SCALAR_REF,
                  $SCALAR_REF_REF,
                  $SCALAR_OVERLOAD,
                  $ARRAY_REF,
                  $ARRAY_OVERLOAD,
                  $HASH_REF,
                  $HASH_OVERLOAD,
                  $CODE_REF,
                  $CODE_OVERLOAD,
                  $GLOB,
                  $GLOB_REF,
                  $GLOB_OVERLOAD,
                  $GLOB_OVERLOAD_FH,
                  $FH,
                  $FH_OBJECT,
                  $REGEX,
                  $REGEX_OBJ,
                  $REGEX_OVERLOAD,
                  $FAKE_REGEX,
                  $OBJECT,
                  $UNDEF,
              ],
          },
          Defined => {
              accept => [
                  $ZERO,
                  $ONE,
                  $BOOL_OVERLOAD_TRUE,
                  $BOOL_OVERLOAD_FALSE,
                  $INT,
                  $NEG_INT,
                  $NUM,
                  $NEG_NUM,
                  $NUM_OVERLOAD_ZERO,
                  $NUM_OVERLOAD_ONE,
                  $NUM_OVERLOAD_NEG,
                  $NUM_OVERLOAD_NEG_DECIMAL,
                  $NUM_OVERLOAD_DECIMAL,
                  $EMPTY_STRING,
                  $STRING,
                  $NUM_IN_STRING,
                  $STR_OVERLOAD_EMPTY,
                  $STR_OVERLOAD_FULL,
                  $INT_WITH_NL1,
                  $INT_WITH_NL2,
                  $SCALAR_REF,
                  $SCALAR_REF_REF,
                  $SCALAR_OVERLOAD,
                  $ARRAY_REF,
                  $ARRAY_OVERLOAD,
                  $HASH_REF,
                  $HASH_OVERLOAD,
                  $CODE_REF,
                  $CODE_OVERLOAD,
                  $GLOB,
                  $GLOB_REF,
                  $GLOB_OVERLOAD,
                  $GLOB_OVERLOAD_FH,
                  $FH,
                  $FH_OBJECT,
                  $REGEX,
                  $REGEX_OBJ,
                  $REGEX_OVERLOAD,
                  $FAKE_REGEX,
                  $OBJECT,
              ],
              reject => [
                  $UNDEF,
              ],
          },
          Undef => {
              accept => [
                  $UNDEF,
              ],
              reject => [
                  $ZERO,
                  $ONE,
                  $BOOL_OVERLOAD_TRUE,
                  $BOOL_OVERLOAD_FALSE,
                  $INT,
                  $NEG_INT,
                  $NUM,
                  $NEG_NUM,
                  $NUM_OVERLOAD_ZERO,
                  $NUM_OVERLOAD_ONE,
                  $NUM_OVERLOAD_NEG,
                  $NUM_OVERLOAD_NEG_DECIMAL,
                  $NUM_OVERLOAD_DECIMAL,
                  $EMPTY_STRING,
                  $STRING,
                  $NUM_IN_STRING,
                  $STR_OVERLOAD_EMPTY,
                  $STR_OVERLOAD_FULL,
                  $INT_WITH_NL1,
                  $INT_WITH_NL2,
                  $SCALAR_REF,
                  $SCALAR_REF_REF,
                  $SCALAR_OVERLOAD,
                  $ARRAY_REF,
                  $ARRAY_OVERLOAD,
                  $HASH_REF,
                  $HASH_OVERLOAD,
                  $CODE_REF,
                  $CODE_OVERLOAD,
                  $GLOB,
                  $GLOB_REF,
                  $GLOB_OVERLOAD,
                  $GLOB_OVERLOAD_FH,
                  $FH,
                  $FH_OBJECT,
                  $REGEX,
                  $REGEX_OBJ,
                  $REGEX_OVERLOAD,
                  $FAKE_REGEX,
                  $OBJECT,
              ],
          },
          Bool => {
              accept => [
                  $ZERO,
                  $ONE,
                  $BOOL_OVERLOAD_TRUE,
                  $BOOL_OVERLOAD_FALSE,
                  $EMPTY_STRING,
                  $UNDEF,
              ],
              reject => [
                  $INT,
                  $NEG_INT,
                  $NUM,
                  $NEG_NUM,
                  $NUM_OVERLOAD_ZERO,
                  $NUM_OVERLOAD_ONE,
                  $NUM_OVERLOAD_NEG,
                  $NUM_OVERLOAD_NEG_DECIMAL,
                  $NUM_OVERLOAD_DECIMAL,
                  $STRING,
                  $NUM_IN_STRING,
                  $STR_OVERLOAD_EMPTY,
                  $STR_OVERLOAD_FULL,
                  $INT_WITH_NL1,
                  $INT_WITH_NL2,
                  $SCALAR_REF,
                  $SCALAR_REF_REF,
                  $SCALAR_OVERLOAD,
                  $ARRAY_REF,
                  $ARRAY_OVERLOAD,
                  $HASH_REF,
                  $HASH_OVERLOAD,
                  $CODE_REF,
                  $CODE_OVERLOAD,
                  $GLOB,
                  $GLOB_REF,
                  $GLOB_OVERLOAD,
                  $GLOB_OVERLOAD_FH,
                  $FH,
                  $FH_OBJECT,
                  $REGEX,
                  $REGEX_OBJ,
                  $REGEX_OVERLOAD,
                  $FAKE_REGEX,
                  $OBJECT,
              ],
          },
          Maybe => {
              accept => [
                  $ZERO,
                  $ONE,
                  $BOOL_OVERLOAD_TRUE,
                  $BOOL_OVERLOAD_FALSE,
                  $INT,
                  $NEG_INT,
                  $NUM,
                  $NEG_NUM,
                  $NUM_OVERLOAD_ZERO,
                  $NUM_OVERLOAD_ONE,
                  $NUM_OVERLOAD_NEG,
                  $NUM_OVERLOAD_NEG_DECIMAL,
                  $NUM_OVERLOAD_DECIMAL,
                  $EMPTY_STRING,
                  $STRING,
                  $NUM_IN_STRING,
                  $STR_OVERLOAD_EMPTY,
                  $STR_OVERLOAD_FULL,
                  $INT_WITH_NL1,
                  $INT_WITH_NL2,
                  $SCALAR_REF,
                  $SCALAR_REF_REF,
                  $SCALAR_OVERLOAD,
                  $ARRAY_REF,
                  $ARRAY_OVERLOAD,
                  $HASH_REF,
                  $HASH_OVERLOAD,
                  $CODE_REF,
                  $CODE_OVERLOAD,
                  $GLOB,
                  $GLOB_REF,
                  $GLOB_OVERLOAD,
                  $GLOB_OVERLOAD_FH,
                  $FH,
                  $FH_OBJECT,
                  $REGEX,
                  $REGEX_OBJ,
                  $REGEX_OVERLOAD,
                  $FAKE_REGEX,
                  $OBJECT,
                  $UNDEF,
              ],
          },
          Value => {
              accept => [
                  $ZERO,
                  $ONE,
                  $INT,
                  $NEG_INT,
                  $NUM,
                  $NEG_NUM,
                  $EMPTY_STRING,
                  $STRING,
                  $NUM_IN_STRING,
                  $INT_WITH_NL1,
                  $INT_WITH_NL2,
                  $GLOB,
              ],
              reject => [
                  $BOOL_OVERLOAD_TRUE,
                  $BOOL_OVERLOAD_FALSE,
                  $STR_OVERLOAD_EMPTY,
                  $STR_OVERLOAD_FULL,
                  $NUM_OVERLOAD_ZERO,
                  $NUM_OVERLOAD_ONE,
                  $NUM_OVERLOAD_NEG,
                  $NUM_OVERLOAD_NEG_DECIMAL,
                  $NUM_OVERLOAD_DECIMAL,
                  $SCALAR_REF,
                  $SCALAR_REF_REF,
                  $SCALAR_OVERLOAD,
                  $ARRAY_REF,
                  $ARRAY_OVERLOAD,
                  $HASH_REF,
                  $HASH_OVERLOAD,
                  $CODE_REF,
                  $CODE_OVERLOAD,
                  $GLOB_REF,
                  $GLOB_OVERLOAD,
                  $GLOB_OVERLOAD_FH,
                  $FH,
                  $FH_OBJECT,
                  $REGEX,
                  $REGEX_OBJ,
                  $REGEX_OVERLOAD,
                  $FAKE_REGEX,
                  $OBJECT,
                  $UNDEF,
              ],
          },
          Ref => {
              accept => [
                  $BOOL_OVERLOAD_TRUE,
                  $BOOL_OVERLOAD_FALSE,
                  $STR_OVERLOAD_EMPTY,
                  $STR_OVERLOAD_FULL,
                  $NUM_OVERLOAD_ZERO,
                  $NUM_OVERLOAD_ONE,
                  $NUM_OVERLOAD_NEG,
                  $NUM_OVERLOAD_NEG_DECIMAL,
                  $NUM_OVERLOAD_DECIMAL,
                  $SCALAR_REF,
                  $SCALAR_REF_REF,
                  $SCALAR_OVERLOAD,
                  $ARRAY_REF,
                  $ARRAY_OVERLOAD,
                  $HASH_REF,
                  $HASH_OVERLOAD,
                  $CODE_REF,
                  $CODE_OVERLOAD,
                  $GLOB_REF,
                  $GLOB_OVERLOAD,
                  $GLOB_OVERLOAD_FH,
                  $FH,
                  $FH_OBJECT,
                  $REGEX,
                  $REGEX_OBJ,
                  $REGEX_OVERLOAD,
                  $FAKE_REGEX,
                  $OBJECT,
              ],
              reject => [
                  $ZERO,
                  $ONE,
                  $INT,
                  $NEG_INT,
                  $NUM,
                  $NEG_NUM,
                  $EMPTY_STRING,
                  $STRING,
                  $NUM_IN_STRING,
                  $INT_WITH_NL1,
                  $INT_WITH_NL2,
                  $GLOB,
                  $UNDEF,
              ],
          },
          Num => {
              accept => [
                  $ZERO,
                  $ONE,
                  $INT,
                  $NEG_INT,
                  $NUM,
                  $NEG_NUM,
                  $NUM_OVERLOAD_ZERO,
                  $NUM_OVERLOAD_ONE,
                  $NUM_OVERLOAD_NEG,
                  $NUM_OVERLOAD_NEG_DECIMAL,
                  $NUM_OVERLOAD_DECIMAL,
                  qw(
                      1e10
                      1e-10
                      1.23456e10
                      1.23456e-10
                      1e10
                      1e-10
                      1.23456e10
                      1.23456e-10
                      -1e10
                      -1e-10
                      -1.23456e10
                      -1.23456e-10
                      -1e10
                      -1e-10
                      -1.23456e10
                      -1.23456e-10
                      -1e+10
                      1E10
                      ),
              ],
              reject => [
                  $BOOL_OVERLOAD_TRUE,
                  $BOOL_OVERLOAD_FALSE,
                  $EMPTY_STRING,
                  $STRING,
                  $NUM_IN_STRING,
                  $STR_OVERLOAD_EMPTY,
                  $STR_OVERLOAD_FULL,
                  $SCALAR_REF,
                  $SCALAR_REF_REF,
                  $SCALAR_OVERLOAD,
                  $ARRAY_REF,
                  $ARRAY_OVERLOAD,
                  $HASH_REF,
                  $HASH_OVERLOAD,
                  $CODE_REF,
                  $CODE_OVERLOAD,
                  $GLOB,
                  $GLOB_REF,
                  $GLOB_OVERLOAD,
                  $GLOB_OVERLOAD_FH,
                  $FH,
                  $FH_OBJECT,
                  $INT_WITH_NL1,
                  $INT_WITH_NL2,
                  $REGEX,
                  $REGEX_OBJ,
                  $REGEX_OVERLOAD,
                  $FAKE_REGEX,
                  $OBJECT,
                  $UNDEF,
              ],
          },
          Int => {
              accept => [
                  $ZERO,
                  $ONE,
                  $INT,
                  $NEG_INT,
                  $NUM_OVERLOAD_ZERO,
                  $NUM_OVERLOAD_ONE,
                  $NUM_OVERLOAD_NEG,
                  qw(
                      1e20
                      1e100
                      -1e10
                      -1e+10
                      1E20
                      ),
              ],
              reject => [
                  $BOOL_OVERLOAD_TRUE,
                  $BOOL_OVERLOAD_FALSE,
                  $NUM,
                  $NEG_NUM,
                  $NUM_OVERLOAD_NEG_DECIMAL,
                  $NUM_OVERLOAD_DECIMAL,
                  $EMPTY_STRING,
                  $STRING,
                  $NUM_IN_STRING,
                  $STR_OVERLOAD_EMPTY,
                  $STR_OVERLOAD_FULL,
                  $INT_WITH_NL1,
                  $INT_WITH_NL2,
                  $SCALAR_REF,
                  $SCALAR_REF_REF,
                  $SCALAR_OVERLOAD,
                  $ARRAY_REF,
                  $ARRAY_OVERLOAD,
                  $HASH_REF,
                  $HASH_OVERLOAD,
                  $CODE_REF,
                  $CODE_OVERLOAD,
                  $GLOB,
                  $GLOB_REF,
                  $GLOB_OVERLOAD,
                  $GLOB_OVERLOAD_FH,
                  $FH,
                  $FH_OBJECT,
                  $REGEX,
                  $REGEX_OBJ,
                  $REGEX_OVERLOAD,
                  $FAKE_REGEX,
                  $OBJECT,
                  $UNDEF,
                  qw(
                      1e-10
                      -1e-10
                      1.23456e10
                      1.23456e-10
                      -1.23456e10
                      -1.23456e-10
                      -1.23456e+10
                      ),
              ],
          },
          Str => {
              accept => [
                  $ZERO,
                  $ONE,
                  $INT,
                  $NEG_INT,
                  $NUM,
                  $NEG_NUM,
                  $EMPTY_STRING,
                  $STRING,
                  $NUM_IN_STRING,
                  $STR_OVERLOAD_EMPTY,
                  $STR_OVERLOAD_FULL,
                  $INT_WITH_NL1,
                  $INT_WITH_NL2,
              ],
              reject => [
                  $BOOL_OVERLOAD_TRUE,
                  $BOOL_OVERLOAD_FALSE,
                  $NUM_OVERLOAD_ZERO,
                  $NUM_OVERLOAD_ONE,
                  $NUM_OVERLOAD_NEG,
                  $NUM_OVERLOAD_NEG_DECIMAL,
                  $NUM_OVERLOAD_DECIMAL,
                  $SCALAR_REF,
                  $SCALAR_REF_REF,
                  $SCALAR_OVERLOAD,
                  $ARRAY_REF,
                  $ARRAY_OVERLOAD,
                  $HASH_REF,
                  $HASH_OVERLOAD,
                  $CODE_REF,
                  $CODE_OVERLOAD,
                  $GLOB,
                  $GLOB_REF,
                  $GLOB_OVERLOAD,
                  $GLOB_OVERLOAD_FH,
                  $FH,
                  $FH_OBJECT,
                  $REGEX,
                  $REGEX_OBJ,
                  $REGEX_OVERLOAD,
                  $FAKE_REGEX,
                  $OBJECT,
                  $UNDEF,
              ],
          },
          ScalarRef => {
              accept => [
                  $SCALAR_REF,
                  $SCALAR_REF_REF,
                  $SCALAR_OVERLOAD,
              ],
              reject => [
                  $ZERO,
                  $ONE,
                  $BOOL_OVERLOAD_TRUE,
                  $BOOL_OVERLOAD_FALSE,
                  $INT,
                  $NEG_INT,
                  $NUM,
                  $NEG_NUM,
                  $NUM_OVERLOAD_ZERO,
                  $NUM_OVERLOAD_ONE,
                  $NUM_OVERLOAD_NEG,
                  $NUM_OVERLOAD_NEG_DECIMAL,
                  $NUM_OVERLOAD_DECIMAL,
                  $EMPTY_STRING,
                  $STRING,
                  $NUM_IN_STRING,
                  $STR_OVERLOAD_EMPTY,
                  $STR_OVERLOAD_FULL,
                  $INT_WITH_NL1,
                  $INT_WITH_NL2,
                  $ARRAY_REF,
                  $ARRAY_OVERLOAD,
                  $HASH_REF,
                  $HASH_OVERLOAD,
                  $CODE_REF,
                  $CODE_OVERLOAD,
                  $GLOB,
                  $GLOB_REF,
                  $GLOB_OVERLOAD,
                  $GLOB_OVERLOAD_FH,
                  $FH,
                  $FH_OBJECT,
                  $REGEX,
                  $REGEX_OBJ,
                  $REGEX_OVERLOAD,
                  $FAKE_REGEX,
                  $OBJECT,
                  $UNDEF,
              ],
          },
          ArrayRef => {
              accept => [
                  $ARRAY_REF,
                  $ARRAY_OVERLOAD,
              ],
              reject => [
                  $ZERO,
                  $ONE,
                  $BOOL_OVERLOAD_TRUE,
                  $BOOL_OVERLOAD_FALSE,
                  $INT,
                  $NEG_INT,
                  $NUM,
                  $NEG_NUM,
                  $NUM_OVERLOAD_ZERO,
                  $NUM_OVERLOAD_ONE,
                  $NUM_OVERLOAD_NEG,
                  $NUM_OVERLOAD_NEG_DECIMAL,
                  $NUM_OVERLOAD_DECIMAL,
                  $EMPTY_STRING,
                  $STRING,
                  $NUM_IN_STRING,
                  $STR_OVERLOAD_EMPTY,
                  $STR_OVERLOAD_FULL,
                  $INT_WITH_NL1,
                  $INT_WITH_NL2,
                  $SCALAR_REF,
                  $SCALAR_REF_REF,
                  $SCALAR_OVERLOAD,
                  $HASH_REF,
                  $HASH_OVERLOAD,
                  $CODE_REF,
                  $CODE_OVERLOAD,
                  $GLOB,
                  $GLOB_REF,
                  $GLOB_OVERLOAD,
                  $GLOB_OVERLOAD_FH,
                  $FH,
                  $FH_OBJECT,
                  $REGEX,
                  $REGEX_OBJ,
                  $REGEX_OVERLOAD,
                  $FAKE_REGEX,
                  $OBJECT,
                  $UNDEF,
              ],
          },
          HashRef => {
              accept => [
                  $HASH_REF,
                  $HASH_OVERLOAD,
              ],
              reject => [
                  $ZERO,
                  $ONE,
                  $BOOL_OVERLOAD_TRUE,
                  $BOOL_OVERLOAD_FALSE,
                  $INT,
                  $NEG_INT,
                  $NUM,
                  $NEG_NUM,
                  $NUM_OVERLOAD_ZERO,
                  $NUM_OVERLOAD_ONE,
                  $NUM_OVERLOAD_NEG,
                  $NUM_OVERLOAD_NEG_DECIMAL,
                  $NUM_OVERLOAD_DECIMAL,
                  $EMPTY_STRING,
                  $STRING,
                  $NUM_IN_STRING,
                  $STR_OVERLOAD_EMPTY,
                  $STR_OVERLOAD_FULL,
                  $INT_WITH_NL1,
                  $INT_WITH_NL2,
                  $SCALAR_REF,
                  $SCALAR_REF_REF,
                  $SCALAR_OVERLOAD,
                  $ARRAY_REF,
                  $ARRAY_OVERLOAD,
                  $CODE_REF,
                  $CODE_OVERLOAD,
                  $GLOB,
                  $GLOB_REF,
                  $GLOB_OVERLOAD,
                  $GLOB_OVERLOAD_FH,
                  $FH,
                  $FH_OBJECT,
                  $REGEX,
                  $REGEX_OBJ,
                  $REGEX_OVERLOAD,
                  $FAKE_REGEX,
                  $OBJECT,
                  $UNDEF,
              ],
          },
          CodeRef => {
              accept => [
                  $CODE_REF,
                  $CODE_OVERLOAD,
              ],
              reject => [
                  $ZERO,
                  $ONE,
                  $BOOL_OVERLOAD_TRUE,
                  $BOOL_OVERLOAD_FALSE,
                  $INT,
                  $NEG_INT,
                  $NUM,
                  $NEG_NUM,
                  $NUM_OVERLOAD_ZERO,
                  $NUM_OVERLOAD_ONE,
                  $NUM_OVERLOAD_NEG,
                  $NUM_OVERLOAD_NEG_DECIMAL,
                  $NUM_OVERLOAD_DECIMAL,
                  $EMPTY_STRING,
                  $STRING,
                  $NUM_IN_STRING,
                  $STR_OVERLOAD_EMPTY,
                  $STR_OVERLOAD_FULL,
                  $INT_WITH_NL1,
                  $INT_WITH_NL2,
                  $SCALAR_REF,
                  $SCALAR_REF_REF,
                  $SCALAR_OVERLOAD,
                  $ARRAY_REF,
                  $ARRAY_OVERLOAD,
                  $HASH_REF,
                  $HASH_OVERLOAD,
                  $GLOB,
                  $GLOB_REF,
                  $GLOB_OVERLOAD,
                  $GLOB_OVERLOAD_FH,
                  $FH,
                  $FH_OBJECT,
                  $REGEX,
                  $REGEX_OBJ,
                  $REGEX_OVERLOAD,
                  $FAKE_REGEX,
                  $OBJECT,
                  $UNDEF,
              ],
          },
          RegexpRef => {
              accept => [
                  $REGEX,
                  $REGEX_OBJ,
                  $REGEX_OVERLOAD,
              ],
              reject => [
                  $ZERO,
                  $ONE,
                  $BOOL_OVERLOAD_TRUE,
                  $BOOL_OVERLOAD_FALSE,
                  $INT,
                  $NEG_INT,
                  $NUM,
                  $NEG_NUM,
                  $NUM_OVERLOAD_ZERO,
                  $NUM_OVERLOAD_ONE,
                  $NUM_OVERLOAD_NEG,
                  $NUM_OVERLOAD_NEG_DECIMAL,
                  $NUM_OVERLOAD_DECIMAL,
                  $EMPTY_STRING,
                  $STRING,
                  $NUM_IN_STRING,
                  $STR_OVERLOAD_EMPTY,
                  $STR_OVERLOAD_FULL,
                  $INT_WITH_NL1,
                  $INT_WITH_NL2,
                  $SCALAR_REF,
                  $SCALAR_REF_REF,
                  $SCALAR_OVERLOAD,
                  $ARRAY_REF,
                  $ARRAY_OVERLOAD,
                  $HASH_REF,
                  $HASH_OVERLOAD,
                  $CODE_REF,
                  $CODE_OVERLOAD,
                  $GLOB,
                  $GLOB_REF,
                  $GLOB_OVERLOAD,
                  $GLOB_OVERLOAD_FH,
                  $FH,
                  $FH_OBJECT,
                  $OBJECT,
                  $UNDEF,
                  $FAKE_REGEX,
              ],
          },
          GlobRef => {
              accept => [
                  $GLOB_REF,
                  $GLOB_OVERLOAD,
                  $GLOB_OVERLOAD_FH,
                  $FH,
              ],
              reject => [
                  $ZERO,
                  $ONE,
                  $BOOL_OVERLOAD_TRUE,
                  $BOOL_OVERLOAD_FALSE,
                  $INT,
                  $NEG_INT,
                  $NUM,
                  $NEG_NUM,
                  $NUM_OVERLOAD_ZERO,
                  $NUM_OVERLOAD_ONE,
                  $NUM_OVERLOAD_NEG,
                  $NUM_OVERLOAD_NEG_DECIMAL,
                  $NUM_OVERLOAD_DECIMAL,
                  $EMPTY_STRING,
                  $STRING,
                  $NUM_IN_STRING,
                  $STR_OVERLOAD_EMPTY,
                  $STR_OVERLOAD_FULL,
                  $INT_WITH_NL1,
                  $INT_WITH_NL2,
                  $SCALAR_REF,
                  $SCALAR_REF_REF,
                  $SCALAR_OVERLOAD,
                  $ARRAY_REF,
                  $ARRAY_OVERLOAD,
                  $HASH_REF,
                  $HASH_OVERLOAD,
                  $CODE_REF,
                  $CODE_OVERLOAD,
                  $GLOB,
                  $FH_OBJECT,
                  $OBJECT,
                  $REGEX,
                  $REGEX_OBJ,
                  $REGEX_OVERLOAD,
                  $FAKE_REGEX,
                  $UNDEF,
              ],
          },
          FileHandle => {
              accept => [
                  $FH,
                  $FH_OBJECT,
                  $GLOB_OVERLOAD_FH,
              ],
              reject => [
                  $ZERO,
                  $ONE,
                  $BOOL_OVERLOAD_TRUE,
                  $BOOL_OVERLOAD_FALSE,
                  $INT,
                  $NEG_INT,
                  $NUM,
                  $NEG_NUM,
                  $NUM_OVERLOAD_ZERO,
                  $NUM_OVERLOAD_ONE,
                  $NUM_OVERLOAD_NEG,
                  $NUM_OVERLOAD_NEG_DECIMAL,
                  $NUM_OVERLOAD_DECIMAL,
                  $EMPTY_STRING,
                  $STRING,
                  $NUM_IN_STRING,
                  $STR_OVERLOAD_EMPTY,
                  $STR_OVERLOAD_FULL,
                  $INT_WITH_NL1,
                  $INT_WITH_NL2,
                  $SCALAR_REF,
                  $SCALAR_REF_REF,
                  $SCALAR_OVERLOAD,
                  $ARRAY_REF,
                  $ARRAY_OVERLOAD,
                  $HASH_REF,
                  $HASH_OVERLOAD,
                  $CODE_REF,
                  $CODE_OVERLOAD,
                  $GLOB,
                  $GLOB_REF,
                  $GLOB_OVERLOAD,
                  $OBJECT,
                  $REGEX,
                  $REGEX_OBJ,
                  $REGEX_OVERLOAD,
                  $FAKE_REGEX,
                  $UNDEF,
              ],
          },
          Object => {
              accept => [
                  $BOOL_OVERLOAD_TRUE,
                  $BOOL_OVERLOAD_FALSE,
                  $STR_OVERLOAD_EMPTY,
                  $STR_OVERLOAD_FULL,
                  $NUM_OVERLOAD_ZERO,
                  $NUM_OVERLOAD_ONE,
                  $NUM_OVERLOAD_NEG,
                  $NUM_OVERLOAD_NEG_DECIMAL,
                  $NUM_OVERLOAD_DECIMAL,
                  $CODE_OVERLOAD,
                  $FH_OBJECT,
                  $REGEX,
                  $REGEX_OBJ,
                  $REGEX_OVERLOAD,
                  $FAKE_REGEX,
                  $GLOB_OVERLOAD,
                  $GLOB_OVERLOAD_FH,
                  $SCALAR_OVERLOAD,
                  $ARRAY_OVERLOAD,
                  $HASH_OVERLOAD,
                  $OBJECT,
              ],
              reject => [
                  $ZERO,
                  $ONE,
                  $INT,
                  $NEG_INT,
                  $NUM,
                  $NEG_NUM,
                  $EMPTY_STRING,
                  $STRING,
                  $NUM_IN_STRING,
                  $INT_WITH_NL1,
                  $INT_WITH_NL2,
                  $SCALAR_REF,
                  $SCALAR_REF_REF,
                  $ARRAY_REF,
                  $HASH_REF,
                  $CODE_REF,
                  $GLOB,
                  $GLOB_REF,
                  $FH,
                  $UNDEF,
              ],
          },
          ClassName => {
              accept => [
                  $CLASS_NAME,
                  $STR_OVERLOAD_CLASS_NAME,
              ],
              reject => [
                  $ZERO,
                  $ONE,
                  $BOOL_OVERLOAD_TRUE,
                  $BOOL_OVERLOAD_FALSE,
                  $INT,
                  $NEG_INT,
                  $NUM,
                  $NEG_NUM,
                  $NUM_OVERLOAD_ZERO,
                  $NUM_OVERLOAD_ONE,
                  $NUM_OVERLOAD_NEG,
                  $NUM_OVERLOAD_NEG_DECIMAL,
                  $NUM_OVERLOAD_DECIMAL,
                  $EMPTY_STRING,
                  $STRING,
                  $NUM_IN_STRING,
                  $STR_OVERLOAD_EMPTY,
                  $STR_OVERLOAD_FULL,
                  $INT_WITH_NL1,
                  $INT_WITH_NL2,
                  $SCALAR_REF,
                  $SCALAR_REF_REF,
                  $SCALAR_OVERLOAD,
                  $ARRAY_REF,
                  $ARRAY_OVERLOAD,
                  $HASH_REF,
                  $HASH_OVERLOAD,
                  $CODE_REF,
                  $CODE_OVERLOAD,
                  $GLOB,
                  $GLOB_REF,
                  $GLOB_OVERLOAD,
                  $GLOB_OVERLOAD_FH,
                  $FH,
                  $FH_OBJECT,
                  $REGEX,
                  $REGEX_OBJ,
                  $REGEX_OVERLOAD,
                  $FAKE_REGEX,
                  $OBJECT,
                  $UNDEF,
              ],
          },
      };
  }
  
  sub test_constraint {
      my $type      = shift;
      my $tests     = shift;
      my $describer = shift || \&describe;
  
      local $Test::Builder::Level = $Test::Builder::Level + 1;
  
      $type = t($type) unless blessed $type;
  
      subtest(
          ( $type->name || '<anon>' ),
          sub {
              try {
                  my $not_inlined = $type->_constraint_with_parents;
  
                  my $inlined;
                  if ( $type->can_be_inlined ) {
                      $inlined = $type->_generated_inline_sub;
                  }
  
                  for my $accept ( @{ $tests->{accept} || [] } ) {
                      my $described = $describer->($accept);
                      subtest(
                          "accepts $described",
                          sub {
                              ok(
                                  $type->value_is_valid($accept),
                                  'using ->value_is_valid'
                              );
                              is(
                                  exception { $type->($accept) },
                                  undef,
                                  'using subref overloading'
                              );
                              ok(
                                  $not_inlined->($accept),
                                  'using non-inlined constraint'
                              );
                              if ($inlined) {
                                  ok(
                                      $inlined->($accept),
                                      'using inlined constraint'
                                  );
                              }
                          }
                      );
                  }
  
                  for my $reject ( @{ $tests->{reject} || [] } ) {
                      my $described = $describer->($reject);
                      subtest(
                          "rejects $described",
                          sub {
                              ok(
                                  !$type->value_is_valid($reject),
                                  'using ->value_is_valid'
                              );
  
                              # I don't love this test, but there's no way to know the
                              # exact content of each type's validation failure
                              # exception. We can, however, reasonably assume (I think)
                              # that the exception thrown will include a trace starting
                              # with Specio::Exception.
                              like(
                                  exception { $type->($reject) },
                                  qr/\QTrace begun at Specio::Exception->new/,
                                  'using subref overloading'
                              );
                              if ($inlined) {
                                  ok(
                                      !$inlined->($reject),
                                      'using inlined constraint'
                                  );
                              }
                          }
                      );
                  }
              }
              catch {
                  fail('No exception in test_constraint');
                  diag($_);
              };
          }
      );
  }
  
  sub describe {
      my $val = shift;
  
      return 'undef' unless defined $val;
  
      if ( !ref $val ) {
          return q{''} if $val eq q{};
  
          return looks_like_number($val)
              && $val !~ /\n/ ? $val : Specio::Helpers::perlstring($val);
      }
  
      return 'open filehandle'
          if openhandle $val && !blessed $val;
  
      if ( blessed $val ) {
          my $desc = ( ref $val ) . ' object';
          if ( $val->isa('_T::StrOverload') ) {
              $desc .= ' (' . describe("$val") . ')';
          }
          elsif ( $val->isa('_T::BoolOverload') ) {
              $desc .= ' (' . ( $val ? 'true' : 'false' ) . ')';
          }
          elsif ( $val->isa('_T::NumOverload') ) {
              $desc .= ' (' . describe( ${$val} ) . ')';
          }
  
          return $desc;
      }
      else {
          return ( ref $val ) . ' reference';
      }
  }
  
  1;
  
  # ABSTRACT: Test helpers for Specio
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Test::Specio - Test helpers for Specio
  
  =head1 VERSION
  
  version 0.44
  
  =head1 SYNOPSIS
  
    use Test::Specio qw( test_constraint :vars );
  
    test_constraint(
        t('Foo'), {
            accept => [ 'foo', 'bar' ],
            reject => [ 42,    {}, $EMPTY_STRING, $HASH_REF ],
        }
    );
  
  =head1 DESCRIPTION
  
  This package provides some helper functions and variables for testing Specio
  types.
  
  =head1 EXPORTS
  
  This module provides the following exports:
  
  =head2 test_constraint( $type, $tests, [ $describer ] )
  
  This subroutine accepts two arguments. The first should be a Specio type
  object. The second is hashref which can contain the keys C<accept> and
  C<reject>. Each key should contain an arrayref of values which the type
  accepts or rejects.
  
  The third argument is optional. This is a sub reference which will be called
  to generate a description of the value being tested. This defaults to calling
  this package's C<describe> sub, but you can provide your own.
  
  =head2 describe($value)
  
  Given a value, this subroutine returns a string describing that value in a
  useful way for test output. It know about the various classes used for the
  variables exported by this package and will do something intelligent when such
  a variable.
  
  =head2 builtins_tests( $GLOB, $GLOB_OVERLOAD, $GLOB_OVERLOAD_FH )
  
  This subroutine returns a hashref containing test variables for all builtin
  types. The hashref has a form like this:
  
    {
        Bool => {
            accept => [
                $ZERO,
                $ONE,
                $BOOL_OVERLOAD_TRUE,
                $BOOL_OVERLOAD_FALSE,
                ...,
            ],
            reject => [
                $INT,
                $NEG_INT,
                $NUM,
                $NEG_NUM,
                ...,
                $OBJECT,
            ],
        },
        Maybe => {...},
    }
  
  You need to pass in a glob, an object which overloads globification, and an
  object which overloads globification to return an open filehandle. See below
  for more details on how to create these things.
  
  =head2 Variables
  
  This module also exports many variables containing values which are useful for
  testing constraints. Note that references are always empty unless stated
  otherwise. You can import these variables individually or import all of them
  with the C<:vars> import tag.
  
  =over 4
  
  =item * C<$ZERO>
  
  =item * C<$ONE>
  
  =item * C<$INT>
  
  An arbitrary positive integer.
  
  =item * C<$NEG_INT>
  
  An arbitrary negative integer.
  
  =item * C<$NUM>
  
  An arbitrary positive non-integer number.
  
  =item * C<$NEG_NUM>
  
  An arbitrary negative non-integer number.
  
  =item * C<$EMPTY_STRING>
  
  =item * C<$STRING>
  
  An arbitrary non-empty string.
  
  =item * C<$NUM_IN_STRING>
  
  An arbitrary string which contains a number.
  
  =item * C<$INT_WITH_NL1>
  
  An string containing an integer followed by a newline.
  
  =item * C<$INT_WITH_NL2>
  
  An string containing a newline followed by an integer.
  
  =item * C<$SCALAR_REF>
  
  =item * C<$SCALAR_REF_REF>
  
  A reference containing a reference to a scalar.
  
  =item * C<$ARRAY_REF>
  
  =item * C<$HASH_REF>
  
  =item * C<$CODE_REF>
  
  =item * C<$GLOB_REF>
  
  =item * C<$FH>
  
  An opened filehandle.
  
  =item * C<$FH_OBJECT>
  
  An opened L<IO::File> object.
  
  =item * C<$REGEX>
  
  A regex created with C<qr//>.
  
  =item * C<$REGEX_OBJ>
  
  A regex created with C<qr//> that was then blessed into class.
  
  =item * C<$FAKE_REGEX>
  
  A non-regex blessed into the C<Regexp> class which Perl uses internally for
  C<qr//> objects.
  
  =item * C<$OBJECT>
  
  An arbitrary object.
  
  =item * C<$UNDEF>
  
  =item * C<$CLASS_NAME>
  
  A string containing a loaded package name.
  
  =item * C<$BOOL_OVERLOAD_TRUE>
  
  An object which overloads boolification to return true.
  
  =item * C<$BOOL_OVERLOAD_FALSE>
  
  An object which overloads boolification to return false.
  
  =item * C<$STR_OVERLOAD_EMPTY>
  
  An object which overloads stringification to return an empty string.
  
  =item * C<$STR_OVERLOAD_FULL>
  
  An object which overloads stringification to return a non-empty string.
  
  =item * C<$STR_OVERLOAD_CLASS_NAME>
  
  An object which overloads stringification to return a loaded package name.
  
  =item * C<$NUM_OVERLOAD_ZERO>
  
  =item * C<$NUM_OVERLOAD_ONE>
  
  =item * C<$NUM_OVERLOAD_NEG>
  
  =item * C<$NUM_OVERLOAD_DECIMAL>
  
  =item * C<$NUM_OVERLOAD_NEG_DECIMAL>
  
  =item * C<$CODE_OVERLOAD>
  
  =item * C<$SCALAR_OVERLOAD>
  
  An object which overloads scalar dereferencing to return a non-empty string.
  
  =item * C<$ARRAY_OVERLOAD>
  
  An object which overloads array dereferencing to return a non-empty array.
  
  =item * C<$HASH_OVERLOAD>
  
  An object which overloads hash dereferencing to return a non-empty hash.
  
  =back
  
  =head2 Globs and the _T::GlobOverload package
  
  To create a glob you can pass around for tests, use this code:
  
    my $GLOB = do {
        no warnings 'once';
        *SOME_GLOB;
    };
  
  The C<_T::GlobOverload> package is defined when you load C<Test::Specio> so
  you can create your own glob overloading objects. Such objects cannot be
  exported because the glob they return does not transfer across packages
  properly.
  
  You can create such a variable like this:
  
    local *FOO;
    my $GLOB_OVERLOAD = _T::GlobOverload->new( \*FOO );
  
  If you want to create a glob overloading object that returns a filehandle, do
  this:
  
    local *BAR;
    open BAR, '<', $0 or die "Could not open $0 for the test";
    my $GLOB_OVERLOAD_FH = _T::GlobOverload->new( \*BAR );
  
  =head1 SUPPORT
  
  Bugs may be submitted at L<https://github.com/houseabsolute/Specio/issues>.
  
  I am also usually active on IRC as 'autarch' on C<irc://irc.perl.org>.
  
  =head1 SOURCE
  
  The source code repository for Specio can be found at L<https://github.com/houseabsolute/Specio>.
  
  =head1 AUTHOR
  
  Dave Rolsky <autarch@urth.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is Copyright (c) 2012 - 2019 by Dave Rolsky.
  
  This is free software, licensed under:
  
    The Artistic License 2.0 (GPL Compatible)
  
  The full text of the license can be found in the
  F<LICENSE> file included with this distribution.
  
  =cut
TEST_SPECIO

    $main::fatpacked{"Text/ANSI/BaseUtil.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'TEXT_ANSI_BASEUTIL';
  package Text::ANSI::BaseUtil;
  
  our $DATE = '2019-04-22'; # DATE
  our $VERSION = '0.230'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  use List::Util qw(min max);
  
  our $re       = qr/\e\[[0-9;]+m/s;
  our $re_mult  = qr/(?:\e\[[0-9;]+m)+/s;
  
  sub ta_detect {
      my $text = shift;
      $text =~ $re ? 1:0;
  }
  
  sub ta_length {
      my $text = shift;
      length(ta_strip($text));
  }
  
  sub _ta_length_height {
      my ($is_mb, $text) = @_;
      my $num_lines = 0;
      my @lens;
      for my $e (split /(\r?\n)/, ta_strip($text)) {
          if ($e =~ /\n/) {
              $num_lines++;
              next;
          }
          $num_lines = 1 if $num_lines == 0;
          push @lens, $is_mb ? Text::WideChar::Util::mbswidth($e) : length($e);
      }
      [max(@lens) // 0, $num_lines];
  }
  
  sub ta_length_height {
      _ta_length_height(0, @_);
  }
  
  sub ta_mbswidth_height {
      _ta_length_height(1, @_);
  }
  
  sub ta_strip {
      my $text = shift;
      $text =~ s/$re//go;
      $text;
  }
  
  sub ta_extract_codes {
      my $text = shift;
      my $res = "";
      $res .= $1 while $text =~ /($re_mult)/go;
      $res;
  }
  
  sub ta_split_codes {
      my $text = shift;
      return split(/($re_mult)/o, $text);
  }
  
  sub ta_split_codes_single {
      my $text = shift;
      return split(/($re)/o, $text);
  }
  
  # same like _ta_mbswidth, but without handling multiline text
  sub _ta_mbswidth0 {
      my $text = shift;
      Text::WideChar::Util::mbswidth(ta_strip($text));
  }
  
  sub ta_mbswidth {
      my $text = shift;
      ta_mbswidth_height($text)->[0];
  }
  
  sub _ta_wrap {
      my ($is_mb, $text, $width, $opts) = @_;
      $width //= 80;
      $opts  //= {};
  
      # basically similar to Text::WideChar::Util's algorithm. we adjust for
      # dealing with ANSI codes by splitting codes first (to easily do color
      # resets/replays), then grouping into words and paras, then doing wrapping.
  
      my $_re1 = $is_mb ?
          qr/($Text::WideChar::Util::re_cjk+)|(\S+)|(\s+)/ :
          qr/()(\S+)|(\s+)/;
  
      my $_re2 = $is_mb ?
          qr/($Text::WideChar::Util::re_cjk_class+)|
             ($Text::WideChar::Util::re_cjk_negclass+)/x : undef;
  
      my @termst; # store term type, 's' (spaces), 'w' (word), 'c' (cjk word) or
                  # 'p' (parabreak)
      my @terms;  # store the text (w/ codes); for ws, only store the codes
      my @pterms; # store the plaintext ver, but only for ws to check parabreak
      my @termsw; # store width of each term, only for non-ws
      my @termsc; # store color replay code
      {
          my @ch = ta_split_codes_single($text);
          my $crcode = ""; # code for color replay to be put at the start of line
          my $term      = '';
          my $pterm     = '';
          my $prev_type = '';
          while (my ($pt, $c) = splice(@ch, 0, 2)) {
              #use Data::Dump; print "D:chunk: "; dd [$pt, $c];
  
              # split into (CJK and non-CJK) words and spaces.
  
              my @s; # (WORD1, TYPE, ...) where type is 's' for space, 'c' for
                     # CJK word, or 'w' for non-CJK word
              while ($pt =~ /$_re1/g) {
                  if ($is_mb && $1) {
                      push @s, $1, 'c';
                  } elsif ($3) {
                      push @s, $3, 's';
                  } else {
                      if ($is_mb) {
                          my $pt2 = $2;
                          while ($pt2 =~ /$_re2/g) {
                              if ($1) {
                                  push @s, $1, 'c';
                              } else {
                                  push @s, $2, 'w';
                              }
                          }
                      } else {
                          push @s, $2, 'w';
                      }
                  }
              }
  
              #use Data::Dump; say "D:s=",Data::Dump::dump(\@s);
  
              my $only_code; $only_code = 1 if !@s;
              while (1) {
                  my ($s, $s_type) = splice @s, 0, 2;
                  $s_type //= '';
                  last unless $only_code || defined($s);
                  # empty text, only code
                  if ($only_code) {
                      $s = "";
                      $term .= $c if defined $c;
                  }
                  #say "D:s=[$s]  prev_type=$prev_type \@ch=",~~@ch,"  \@s=",~~@s;
  
                  if ($s_type && $s_type ne 's') {
                      if ($prev_type eq 's') {
                          #say "D:found word, completed previous ws [$term]";
                          push @termst, 's';
                          push @terms , $term;
                          push @pterms, $pterm;
                          push @termsw, undef;
                          push @termsc, $crcode;
                          # start new word
                          $pterm = ''; $term = '';
                      } elsif ($prev_type && $prev_type ne $s_type) {
                          #say "D:found a ".($s_type eq 'c' ? 'CJK':'non-CJK')." word, completed previous ".($prev_type eq 'c' ? 'CJK':'non-CJK')." word [$term]";
                          push @termst, $prev_type;
                          push @terms , $term;
                          push @pterms, $pterm;
                          push @termsw, $is_mb ? Text::WideChar::Util::mbswidth($pterm):length($pterm);
                          push @termsc, $crcode;
                          # start new word
                          $pterm = ''; $term = '';
                      }
                      $pterm .= $s;
                      $term  .= $s; $term .= $c if defined($c) && !@s;
                      if (!@s && !@ch) {
                          #say "D:complete word because this is the last token";
                          push @termst, $s_type;
                          push @terms , $term;
                          push @pterms, "";
                          push @termsw, $is_mb ? Text::WideChar::Util::mbswidth($pterm):length($pterm);
                          push @termsc, $crcode;
                      }
                  } elsif (length($s)) {
                      if ($prev_type ne 's') {
                          #say "D:found ws, completed previous word [$term]";
                          push @termst, $prev_type;
                          push @terms , $term;
                          push @pterms, "";
                          push @termsw, $is_mb ? Text::WideChar::Util::mbswidth($pterm):length($pterm);
                          push @termsc, $crcode;
                          # start new ws
                          $pterm = ''; $term = '';
                      }
                      $pterm .= $s;
                      $term  .= $c if defined($c) && !@s;
                      if (!@s && !@ch) {
                          #say "D:complete ws because this is the last token";
                          push @termst, 's';
                          push @terms , $term;
                          push @pterms, $pterm;
                          push @termsw, undef;
                          push @termsc, $crcode;
                      }
                  }
                  $prev_type = $s_type;
  
                  if (!@s) {
                      if (defined($c) && $c =~ /m\z/) {
                          if ($c eq "\e[0m") {
                              #say "D:found color reset, emptying crcode";
                              $crcode = "";
                          } elsif ($c =~ /m\z/) {
                              #say "D:adding to crcode";
                              $crcode .= $c;
                          }
                      }
                      last if $only_code;
                  }
  
              } # splice @s
          } # splice @ch
      }
  
      # mark parabreaks
      {
          my $i = 0;
          while ($i < @pterms) {
              if ($termst[$i] eq 's') {
                  if ($pterms[$i] =~ /[ \t]*(\n(?:[ \t]*\n)+)([ \t]*)/) {
                      #say "D:found parabreak";
                      $pterms[$i] = $1;
                      $termst[$i] = 'p';
                      if ($i < @pterms-1) {
                          # stick color code to the beginning of next para
                          $terms [$i+1] = $terms[$i] . $terms [$i+1];
                          $terms [$i] = "";
                      }
                      if (length $2) {
                          #say "D:found space after parabreak, splitting";
                          splice @termst, $i+1, 0, "s";
                          splice @terms , $i+1, 0, "";
                          splice @pterms, $i+1, 0, $2;
                          splice @termsw, $i+1, 0, undef;
                          splice @termsc, $i+1, 0, $termsc[$i];
                          $i += 2;
                          next;
                      }
                  }
              }
              $i++;
          }
      }
  
      #use Data::Dump::Color; my @d; for (0..$#terms) { push @d, {type=>$termst[$_], term=>$terms[$_], pterm=>$pterms[$_], termc=>$termsc[$_], termw=>$termsw[$_], } } dd \@d;
      #return;
  
      #use Data::Dump; say "D:termst=".Data::Dump::dump(\@termst);
      #use Data::Dump; say "D:terms =".Data::Dump::dump(\@terms);
      #use Data::Dump; say "D:pterms=".Data::Dump::dump(\@pterms);
      #use Data::Dump; say "D:termsw=".Data::Dump::dump(\@termsw);
      #use Data::Dump; say "D:termsc=".Data::Dump::dump(\@termsc);
  
      my ($maxww, $minww);
  
      # now we perform wrapping
  
      my @res;
      {
          my $tw = $opts->{tab_width} // 8;
          die "Please specify a positive tab width" unless $tw > 0;
          my $optfli  = $opts->{flindent};
          my $optfliw; $optfliw = Text::WideChar::Util::_get_indent_width($is_mb, $optfli, $tw) if defined $optfli;
          my $optsli  = $opts->{slindent};
          my $optsliw; $optsliw = Text::WideChar::Util::_get_indent_width($is_mb, $optsli, $tw) if defined $optsli;
          my $pad = $opts->{pad};
          my $x = 0;
          my $y = 0;
          my ($fli, $sli, $fliw, $sliw);
          my $is_parastart = 1;
          my $line_has_word = 0;
          my ($termt, $prev_t);
        TERM:
          for my $i (0..$#terms) {
              $prev_t = $termt if $i;
              $termt = $termst[$i];
              my $term  = $terms[$i];
              my $pterm = $pterms[$i];
              my $termw = $termsw[$i];
              my $crcode = $i > 0 ? $termsc[$i-1] : "";
              #say "D:term=[", ($termt eq 'w' ? $term : $pterm), "] ($termt)";
  
              # end of paragraph
              if ($termt eq 'p') {
                  my $numnl = 0;
                  $numnl++ while $pterm =~ /\n/g;
                  for (1..$numnl) {
                      push @res, "\e[0m" if $crcode && $_ == 1;
                      push @res, " " x ($width-$x) if $pad;
                      push @res, "\n";
                      $x = 0;
                      $y++;
                  }
                  $line_has_word = 0;
                  $x = 0;
                  $is_parastart = 1;
                  next TERM;
              }
  
              if ($is_parastart) {
                  # this is the start of paragraph, determine indents
                  if (defined $optfli) {
                      $fli  = $optfli;
                      $fliw = $optfliw;
                  } else {
                      if ($termt eq 's') {
                          $fli  = $pterm;
                          $fliw = Text::WideChar::Util::_get_indent_width($is_mb, $fli, $tw);
                      } else {
                          $fli  = "";
                          $fliw = 0;
                      }
                      #say "D:deduced fli from text [$fli] ($fliw)";
                      my $j = $i;
                      $sli = undef;
                      while ($j < @terms && $termst[$j] ne 'p') {
                          if ($termst[$j] eq 's') {
                              if ($pterms[$j] =~ /\n([ \t]+)/) {
                                  $sli  = $1;
                                  $sliw = Text::WideChar::Util::_get_indent_width($is_mb, $sli, $tw);
                                  last;
                              }
                          }
                          $j++;
                      }
                      if (!defined($sli)) {
                          $sli  = "";
                          $sliw = 0;
                      }
                      #say "D:deduced sli from text [$sli] ($sliw)";
                      die "Subsequent indent must be less than width" if $sliw >= $width;
                  }
  
                  #say "D:inserting the fli [$fli] ($fliw)";
                  push @res, $fli;
                  $x += $fliw;
              } # parastart
  
              $is_parastart = 0;
  
              if ($termt eq 's') {
                  # just print the codes
                  push @res, $term;
  
                  # maintain terminating newline
                  if ($pterm =~ /\n/ && $i == $#terms) {
                      push @res, "\e[0m" if $crcode;
                      push @res, " " x ($width-$x) if $pad;
                      push @res, "\n";
                      $line_has_word = 0;
                  }
              }
  
              if ($termt ne 's') {
                  # we need to chop long words
                  my @words;
                  my @wordsw;
                  my @wordst; # c if cjk, w if not
                  my @wordswsb; # whether there are ws before the word
                  my $j = 0;
                  my $c = ""; # see below for explanation
                  while (1) {
                      $j++;
                      # most words shouldn't be that long. and we don't need to
                      # truncate long CJK word first here because it will get
                      # truncated later.
                      if ($termw <= $width-$sliw || $termt eq 'c') {
                          push @words   , $c . $term;
                          push @wordsw  , $termw;
                          push @wordst  , $termt;
                          push @wordswsb, ($prev_t && $prev_t eq 's')?1:0;
                          last;
                      }
                      #use Data::Dump; print "D:truncating long word "; dd $term;
                      my $res = $is_mb ? ta_mbtrunc($term, $width-$sliw, 1) :
                          ta_trunc($term, $width-$sliw, 1);
  
                      my ($tword, $twordw);
                      if ($j == 1) {
                          $tword  = $res->[0];
                          $twordw = $res->[1];
                      } else {
                          # since ta_{,mb}trunc() adds the codes until the end of
                          # the word, to avoid messing colors, for the second word
                          # and so on we need to replay colors by prefixing with:
                          # \e[0m (reset) + $crcode + (all the codes from the
                          # start of the long word up until the truncated
                          # position, stored in $c).
                          #
                          # there might be faster way, but it is expected that
                          # long words are not that common.
                          $tword  = ($crcode ? "\e[0m" . $crcode : "") .
                              $c . $res->[0];
                          $twordw = $res->[1];
                      }
                      $c .= ta_extract_codes(substr($term, 0, $res->[2]));
                      #use Data::Dump; print "D:truncated word is "; dd $tword;
  
                      push @words   , $tword;
                      push @wordsw  , $twordw;
                      push @wordst  , $termt;
                      push @wordswsb, $j == 1 ? (($prev_t && $prev_t eq 's')?1:0) : 0;
                      $term  = substr($term, $res->[2]);
                      $termw = $is_mb ? _ta_mbswidth0($term) : ta_length($term);
                  }
  
                  #use Data::Dump; print "D:words="; dd \@words; print "D:wordsw="; dd \@wordsw; print "D:wordswsb="; dd \@wordswsb;
  
                  # the core of the wrapping algo
                  for my $word (@words) {
                      my $wordw = shift @wordsw;
                      my $wordt = shift @wordst;
                      my $ws_before = shift @wordswsb;
                      #say "D:x=$x word=$word wordw=$wordw wordt=$wordt ws_before=$ws_before line_has_word=$line_has_word width=$width";
  
                      $maxww = $wordw if !defined($maxww) || $maxww < $wordw;
                      $minww = $wordw if !defined($minww) || $minww > $wordw;
  
                      if ($x + ($line_has_word ? 1:0) + $wordw <= $width) {
                          if ($line_has_word && $ws_before) {
                              push @res, " ";
                              $x++;
                          }
                          push @res, $word;
                          $x += $wordw;
                      } else {
                          # line break
                          while (1) {
                              if ($wordt eq 'c') {
                                  # a CJK word can be line-broken
                                  my $res;
                                  if ($ws_before) {
                                      $res = ta_mbtrunc($word, $width-$x-1, 1);
                                      push @res, " ", $res->[0];
                                  } else {
                                      $res = ta_mbtrunc($word, $width-$x, 1);
                                      push @res, $res->[0];
                                  }
                                  #say "D:truncated CJK word: $word (".length($word)."), ".($width-$x)." -> $res->[0] (".length($res->[0]).") & $res->[1], remaining=$res->[3] (".length($res->[3]).")";
                                  $word = $res->[3];
                                  $wordw = _ta_mbswidth0($res->[3]);
                              } else {
                                  push @res, "\e[0m" if $crcode;
                              }
                              push @res, " " x ($width-$x) if $pad;
                              push @res, "\n";
                              $y++;
                              push @res, $crcode;
                              push @res, $sli;
  
                              if ($sliw + $wordw <= $width) {
                                  push @res, $word;
                                  $x = $sliw + $wordw;
                                  last;
                              } else {
                                  # word still too long, break again
                                  $x = $sliw;
                              }
                          }
                      }
                      $line_has_word++;
                  }
  
              }
          } # for term
          push @res, " " x ($width-$x) if $line_has_word && $pad;
      }
  
      if ($opts->{return_stats}) {
          return [join("", @res), {
              max_word_width => $maxww,
              min_word_width => $minww,
          }];
      } else {
          return join("", @res);
      }
  }
  
  sub ta_wrap {
      _ta_wrap(0, @_);
  }
  
  sub ta_mbwrap {
      _ta_wrap(1, @_);
  }
  
  sub _ta_pad {
      my ($is_mb, $text, $width, $which, $padchar, $is_trunc) = @_;
      if ($which) {
          $which = substr($which, 0, 1);
      } else {
          $which = "r";
      }
      $padchar //= " ";
  
      my $w = $is_mb ? _ta_mbswidth0($text) : ta_length($text);
      if ($is_trunc && $w > $width) {
          my $res = $is_mb ?
              ta_mbtrunc($text, $width, 1) : ta_trunc($text, $width, 1);
          $text = $res->[0] . ($padchar x ($width-$res->[1]));
      } else {
          if ($which eq 'l') {
              $text = ($padchar x ($width-$w)) . $text;
          } elsif ($which eq 'c') {
              my $n = int(($width-$w)/2);
              $text = ($padchar x $n) . $text . ($padchar x ($width-$w-$n));
          } else {
              $text .= ($padchar x ($width-$w)) if $width > $w;
          }
      }
      $text;
  }
  
  sub ta_pad {
      _ta_pad(0, @_);
  }
  
  sub ta_mbpad {
      _ta_pad(1, @_);
  }
  
  sub _ta_trunc {
      my ($is_mb, $text, $width, $return_extra) = @_;
  
      # return_extra (undocumented): if set to 1, will return [truncated_text,
      # visual width, length(chars) up to truncation point, rest of the text not
      # included]
  
      my $w = $is_mb ? _ta_mbswidth0($text) : ta_length($text);
      if ($w <= $width) {
          return $return_extra ? [$text, $w, length($text), ''] : $text;
      }
      my @p = ta_split_codes_single($text);
      my $res = '';
      my $append = 1; # whether we should add more text
      my $code4rest = '';
      my $rest = '';
      $w = 0;
      my $c = 0;
      #use Data::Dump; dd \@p;
      while (my ($t, $ansi) = splice @p, 0, 2) {
          #say "D: t=<$t>, \@p=", ~~@p, ", code4rest=<$code4rest>, rest=<$rest>";
          if ($append) {
              my $tw = $is_mb ? Text::WideChar::Util::mbswidth($t) : length($t);
              #say "D: tw=$tw";
              if ($w+$tw <= $width) {
                  $res .= $t;
                  $w += $tw;
                  $c += length($t);
                  $append = 0 if $w == $width;
                  #say "D:end1" unless $append;
              } else {
                  my $tres = $is_mb ?
                      Text::WideChar::Util::mbtrunc($t, $width-$w, 1) :
                        [substr($t, 0, $width-$w), $width-$w, $width-$w];
                  #use Data::Dump; dd $tres;
                  $res .= $tres->[0];
                  $w += $tres->[1];
                  $c += $tres->[2];
                  $rest = substr($t, $tres->[2]);
                  $append = 0;
                  #say "D:end2";
              }
          } else {
              $rest .= $t;
          }
          if (defined $ansi) {
              if ($append) {
                  if ($ansi eq "\e[0m") {
                      #say "D:found color reset, resetting code4rest";
                      $c = length($ansi);
                      $code4rest = $ansi;
                  } else {
                      $c += length($ansi);
                      $code4rest .= $ansi;
                  }
                  $res .= $ansi;
              } else {
                  $res .= $ansi;
                  $rest .= $ansi;
              }
          }
      }
  
      # ta_trunc/ta_mbtrunc currently adds unpruned color codes at the end of
      # truncated string. pruned meaning strings of color codes right before reset
      # code is removed, e.g. \e[1m\e[30m...\e[0m becomes \e[0m. you might want to
      # prune the result of trunc using _ta_prune_codes.
  
      if ($return_extra) {
          return [$res, $w, $c, $code4rest . $rest];
      } else {
          return $res;
      }
  }
  
  sub _ta_prune_codes {
      my $text = shift;
      $text =~ s/($re_mult)\e\[0m/\e\[0m/g;
      $text;
  }
  
  sub ta_trunc {
      _ta_trunc(0, @_);
  }
  
  sub ta_mbtrunc {
      _ta_trunc(1, @_);
  }
  
  sub _ta_highlight {
      my ($is_all, $text, $needle, $color) = @_;
  
      # break into chunks
      my (@chptext, @chcode, @chsavedc); # chunk plain texts, codes, saved codes
      my $sc = "";
      my $plaintext = "";
      my @ch = ta_split_codes_single($text);
      while (my ($pt, $c) = splice(@ch, 0, 2)) {
          push @chptext , $pt;
          push @chcode  , $c;
          push @chsavedc, $sc;
          $plaintext .= $pt;
          if (defined($c) && $c =~ /m\z/) {
              if ($c eq "\e[0m") {
                  $sc = "";
              } elsif ($c =~ /m\z/) {
                  $sc .= $c;
              }
          }
      }
      #use Data::Dump; print "\@chptext: "; dd \@chptext; print "\@chcode: "; dd \@chcode; print "\@chsavedc: "; dd \@chsavedc;
  
      # gather a list of needles to highlight, with their positions
      my (@needle, @npos);
      if (ref($needle) eq 'Regexp') {
          my @m = $plaintext =~ /$needle/g;
          return $text unless @m;
          my $pos = 0;
          while ($pos < length($plaintext)) {
              my @pt;
              for (@m) {
                  my $p = index($plaintext, $_, $pos);
                  push @pt, [$p, $_] if $p >= 0;
              }
              last unless @pt;
              my $pmin = $pt[0][0];
              my $t = $pt[0][1];
              for (@pt) {
                  if ($pmin > $_->[0] ||
                          $pmin==$_->[0] && length($t) < length($_->[1])) {
                      $pmin = $_->[0];
                      $t = $_->[1];
                  }
              }
              push @needle, $t;
              push @npos  , $pmin;
              last unless $is_all;
              $pos = $pmin + length($t);
          }
      } else {
          my $pos = 0;
          while (1) {
              #say "D:finding '$needle' in '$plaintext' from pos '$pos'";
              my $p = index($plaintext, $needle, $pos);
              last if $p < 0;
              push @needle, $needle;
              push @npos  , $p;
              last unless $is_all;
              $pos = $p + length($needle);
              last if $pos >= length($plaintext);
          }
          return $text unless @needle;
      }
      #use Data::Dump; print "\@needle: "; dd \@needle; print "\@npos: "; dd \@npos;
  
      my @res;
      my $found = 1;
      my $pos = 0;
      my $i = 0;
      my $curneed = shift @needle;
      my $npos    = shift @npos;
    CHUNK:
      while (1) {
          last if $i >= @chptext;
          my $pos2  = $pos+length($chptext[$i])-1;
          my $npos2 = $npos+length($curneed)-1;
          #say "D: chunk=[$chptext[$i]], npos=$npos, npos2=$npos2, pos=$pos, pos2=$pos2";
          if ($pos > $npos2 || $pos2 < $npos || !$found) {
              #say "D:inserting chunk: [$chptext[$i]]";
              # no need to highlight
              push @res, $chptext[$i];
              push @res, $chcode[$i] if defined $chcode[$i];
              goto L1;
          }
  
          # there is chunk text at the left of needle?
          if ($pos < $npos) {
              my $pre = substr($chptext[$i], 0, $npos-$pos);
              #say "D:inserting pre=[$pre]";
              push @res, $pre;
          }
  
          my $npart = substr($curneed,
                             max(0, $pos-$npos),
                             min($pos2, $npos2)-max($pos, $npos)+1);
          if (length($npart)) {
              #say "D:inserting npart=[$npart]";
              push @res, $color, $npart;
              push @res, "\e[0m";
              #use Data::Dump; dd [$chsaved[$i], $chcode[$i]];
              push @res, $chsavedc[$i];
          }
  
          # is there chunk text at the right of needle?
          if ($npos2 <= $pos2) {
              #say "D:We have run past current needle [$curneed]";
              my $post = substr($chptext[$i], $npos2-$pos+1);
  
              if (@needle) {
                  $curneed = shift @needle;
                  $npos    = shift @npos;
                  #say "D:Finding the next needle ($curneed) at pos $npos";
                  $pos     = $npos2+1;
                  $chptext[$i] = $post;
                  $found = 1;
                  redo CHUNK;
              } else {
                  # we're done finding needle
                  $found = 0;
              }
  
              if (!$found) {
                  #say "D:inserting post=[$post]";
                  push @res, $post;
                  push @res, $chcode[$i] if defined $chcode[$i];
              }
          }
  
        L1:
          $pos = $pos2+1;
          $i++;
      }
  
      join "", @res;
  }
  
  sub ta_highlight {
      _ta_highlight(0, @_);
  }
  
  sub ta_highlight_all {
      _ta_highlight(1, @_);
  }
  
  sub ta_add_color_resets {
      my (@text) = @_;
  
      my @res;
      my $i = 0;
      my $savedc = "";
      for my $text (@text) {
          $i++;
          my $newt = $i > 1 && !$savedc ? "\e[0m" : $savedc;
  
          # break into chunks
          my @ch = ta_split_codes_single($text);
          while (my ($t, $c) = splice(@ch, 0, 2)) {
              $newt .= $t;
              if (defined($c) && $c =~ /m\z/) {
                  $newt .= $c;
                  if ($c eq "\e[0m") {
                      $savedc = "";
                  } elsif ($c =~ /m\z/) {
                      $savedc .= $c;
                  }
              }
          }
  
          $newt .= "\e[0m" if $savedc && $i < @text;
          push @res, $newt;
      }
  
      @res;
  }
  
  sub _ta_substr {
      my $is_mb = shift;
      my $str   = shift;
      my $pos   = shift;
      my $len   = shift;
  
      my $res1 = _ta_trunc($is_mb, $str, $pos, 1);
      my $res2 = _ta_trunc($is_mb, $res1->[3], $len, 1);
  
      if (@_) {
          # left + replacement + right
          return _ta_prune_codes($res1->[0] . $_[0] . $res2->[3]);
      } else {
          return _ta_prune_codes($res2->[0]);
      }
  }
  
  sub ta_substr {
      _ta_substr(0, @_);
  }
  
  sub ta_mbsubstr {
      _ta_substr(1, @_);
  }
  
  
  1;
  # ABSTRACT: Base for Text::ANSI::{Util,WideUtil}
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Text::ANSI::BaseUtil - Base for Text::ANSI::{Util,WideUtil}
  
  =head1 VERSION
  
  This document describes version 0.230 of Text::ANSI::BaseUtil (from Perl distribution Text-ANSI-Util), released on 2019-04-22.
  
  =for Pod::Coverage .*
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Text-ANSI-Util>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Text-ANSI-Util>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Text-ANSI-Util>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2019, 2016, 2015, 2014, 2013 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
TEXT_ANSI_BASEUTIL

    $main::fatpacked{"Text/ANSI/Util.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'TEXT_ANSI_UTIL';
  package Text::ANSI::Util;
  
  our $DATE = '2019-04-22'; # DATE
  our $VERSION = '0.230'; # VERSION
  
  use 5.010001;
  use strict 'subs', 'vars';
  use warnings;
  
  require Exporter;
  our @ISA       = qw(Exporter);
  our @EXPORT_OK = qw(
                         ta_add_color_resets
                         ta_detect
                         ta_extract_codes
                         ta_highlight
                         ta_highlight_all
                         ta_length
                         ta_length_height
                         ta_pad
                         ta_split_codes
                         ta_split_codes_single
                         ta_strip
                         ta_substr
                         ta_trunc
                         ta_wrap
                 );
  
  use Text::ANSI::BaseUtil ();
  
  our $re = $Text::ANSI::BaseUtil::re;
  *{$_} = \&{"Text::ANSI::BaseUtil::$_"} for @EXPORT_OK;
  
  1;
  # ABSTRACT: Routines for text containing ANSI color codes
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Text::ANSI::Util - Routines for text containing ANSI color codes
  
  =head1 VERSION
  
  This document describes version 0.230 of Text::ANSI::Util (from Perl distribution Text-ANSI-Util), released on 2019-04-22.
  
  =head1 SYNOPSIS
  
   use Text::ANSI::Util qw(
                         ta_add_color_resets
                         ta_detect
                         ta_extract_codes
                         ta_highlight
                         ta_highlight_all
                         ta_length
                         ta_length_height
                         ta_pad
                         ta_split_codes
                         ta_split_codes_single
                         ta_strip
                         ta_substr
                         ta_trunc
                         ta_wrap
                        );
  
   # detect whether text has ANSI color codes?
   say ta_detect("red");       # => false
   say ta_detect("\e[31mred"); # => true
  
   # calculate length of text (excluding the ANSI color codes)
   say ta_length("red");       # => 3
   say ta_length("\e[31mred"); # => 3
  
   # strip ANSI color codes
   say ta_strip("\e[31mred"); # => "red"
  
   # split codes (ANSI color codes are always on the even positions)
   my @parts = ta_split_codes("\e[31mred"); # => ("", "\e[31m", "red")
  
   # wrap text to a certain column width, handle ANSI color codes
   say ta_wrap("....", 40);
  
   # pad (left, right, center) text to a certain width
   say ta_pad("foo", 10);                          # => "foo       "
   say ta_pad("foo", 10, "left");                  # => "       foo"
   say ta_pad("foo\nbarbaz\n", 10, "center", "."); # => "...foo....\n..barbaz..\n"
  
   # truncate text to a certain width while still passing ANSI color codes
   use Term::ANSIColor;
   my $text = color("red")."red text".color("reset"); # => "\e[31mred text\e[0m"
   say ta_trunc($text, 5);                            # => "\e[31mred t\e[0m"
  
   # highlight the first occurrence of some string within text
   say ta_highlight("some text", "ome", "\e[7m\e[31m");
  
   # ditto, but highlight all occurrences
   say ta_highlight_all(...);
  
   # get substring
   my $substr = ta_substr("...", $pos, $len);
  
   # return text but with substring replaced with replacement
   say ta_substr("...", $pos, $len, $replacement);
  
  =head1 DESCRIPTION
  
  This module provides routines for dealing with text that contains ANSI color
  codes, e.g. for determining its length/width (excluding the color codes),
  stripping the color codes, extracting the color codes, and so on.
  
  For functions that support wide characters, see L<Text::ANSI::WideUtil>.
  
  Current caveats:
  
  =over
  
  =item * Other ANSI codes (non-color codes) are ignored
  
  These are codes like for altering cursor positions, etc.
  
  =item * Single-character CSI (control sequence introducer) currently ignored
  
  Only C<ESC+[> (two-character CSI) is currently parsed.
  
  BTW, in ASCII terminals, single-character CSI is C<0x9b>. In UTF-8 terminals, it
  is C<0xc2, 0x9b> (2 bytes).
  
  =item * Private-mode- and trailing-intermediate character currently not parsed
  
  =item * Only color reset code \e[0m is recognized
  
  For simplicity, currently multiple SGR parameters inside a single ANSI color
  code is not parsed. This means that color reset code like C<\e[1;0m> or
  C<\e[31;47;0m> is not recognized, only C<\e[0m> is. I believe this should not be
  a problem with most real-world text out there.
  
  =back
  
  =head1 FUNCTIONS
  
  =head2 ta_add_color_resets(@text) => LIST
  
  Make sure that a color reset command (add C<\e[0m>) to the end of each element
  and a replay of all the color codes from the previous element, from the last
  color reset) to the start of the next element, and so on. Return the new list.
  
  This makes each element safe to be combined with other array of text into a
  single line, e.g. in a multicolumn/tabular layout. An example:
  
  Without color resets:
  
   my @col1 = split /\n/, "\e[31mred\nmerah\e[0m";
   my @col2 = split /\n/, "\e[32mgreen\e[1m\nhijau tebal\e[0m";
  
   printf "%s | %s\n", $col1[0], $col2[0];
   printf "%s | %s\n", $col1[1], $col2[1];
  
  the printed output:
  
   \e[31mred | \e[32mgreen
   merah\e[0m | \e[1mhijau tebal\e[0m
  
  The C<merah> text on the second line will become green because of the effect of
  the last color command printed (C<\e[32m>). However, with ta_add_color_resets():
  
   my @col1 = ta_add_color_resets(split /\n/, "\e[31mred\nmerah\e[0m");
   my @col2 = ta_add_color_resets(split /\n/, "\e[32mgreen\e[1m\nhijau tebal\e[0m");
  
   printf "%s | %s\n", $col1[0], $col2[0];
   printf "%s | %s\n", $col1[1], $col2[1];
  
  the printed output (C<< <...> >>) marks the code added by ta_add_color_resets():
  
   \e[31mred<\e[0m> | \e[32mgreen\e[1m<\e[0m>
   <\e[31m>merah\e[0m | <\e[32m\e[1m>hijau tebal\e[0m
  
  All the cells are printed with the intended colors.
  
  =head2 ta_detect($text) => BOOL
  
  Return true if C<$text> contains ANSI color codes, false otherwise.
  
  =head2 ta_extract_codes($text) => STR
  
  This is the opposite of C<ta_strip()>, return only the ANSI codes in C<$text>.
  
  =head2 ta_highlight($text, $needle, $color) => STR
  
  Highlight the first occurrence of C<$needle> in C<$text> with <$color>, taking
  care not to mess up existing colors.
  
  C<$needle> can be a string or a Regexp object.
  
  Implementation note: to not mess up colors, we save up all color codes from the
  last reset (C<\e[0m>) before inserting the highlight color + highlight text.
  Then we issue C<\e[0m> and the saved up color code to return back to the color
  state before the highlight is inserted. This is the same technique as described
  in C<ta_add_color_resets()>.
  
  =head2 ta_highlight_all($text, $needle, $color) => STR
  
  Like C<ta_highlight()>, but highlight all occurrences instead of only the first.
  
  =head2 ta_length($text) => INT
  
  Count the number of characters in $text, while ignoring ANSI color codes.
  Equivalent to C<< length(ta_strip($text)) >>. See also: C<ta_mbswidth()> in
  L<Text::ANSI::WideUtil>.
  
  =head2 ta_length_height($text) => [INT, INT]
  
  Like C<ta_length()>, but also gives height (number of lines). For example, C<<
  ta_length_height("foobar\nb\n") >> gives C<[6, 3]>.
  
  See also: C<ta_mbswidth_height()> in L<Text::ANSI::WideUtil>.
  
  =head2 ta_pad($text, $width[, $which[, $padchar[, $truncate]]]) => STR
  
  Return C<$text> padded with C<$padchar> to C<$width> columns. C<$which> is
  either "r" or "right" for padding on the right (the default if not specified),
  "l" or "left" for padding on the right, or "c" or "center" or "centre" for
  left+right padding to center the text.
  
  C<$padchar> is whitespace if not specified. It should be string having the width
  of 1 column.
  
  Does *not* handle multiline text; you can split text by C</\r?\n/> yourself.
  
  See also: C<ta_mbpad()> in L<Text::ANSI::WideUtil>.
  
  =head2 ta_split_codes($text) => LIST
  
  Split C<$text> to a list containing alternating ANSI color codes and text. ANSI
  color codes are always on the second element, fourth, and so on. Example:
  
   ta_split_codes("");              # => ()
   ta_split_codes("a");             # => ("a")
   ta_split_codes("a\e[31m");       # => ("a", "\e[31m")
   ta_split_codes("\e[31ma");       # => ("", "\e[31m", "a")
   ta_split_codes("\e[31ma\e[0m");  # => ("", "\e[31m", "a", "\e[0m")
   ta_split_codes("\e[31ma\e[0mb"); # => ("", "\e[31m", "a", "\e[0m", "b")
   ta_split_codes("\e[31m\e[0mb");  # => ("", "\e[31m\e[0m", "b")
  
  so you can do something like:
  
   my @parts = ta_split_codes($text);
   while (my ($text, $ansicode) = splice(@parts, 0, 2)) {
       ...
   }
  
  =head2 ta_split_codes_single($text) => LIST
  
  Like C<ta_split_codes()> but each ANSI color code is split separately, instead
  of grouped together. This routine is currently used internally e.g. for
  C<ta_wrap()> and C<ta_highlight()> to trace color reset/replay codes.
  
  =head2 ta_strip($text) => STR
  
  Strip ANSI color codes from C<$text>, returning the stripped text.
  
  =head2 ta_substr($text, $pos, $len[ , $replacement ]) => STR
  
  A bit like Perl's C<substr()>. If C<$replacement> is not specified, will return
  the substring. If C<$replacement> is specified, will return $text with the
  substring replaced by C<$replacement>.
  
  See also: C<ta_mbsubstr()> in L<Text::ANSI::WideUtil>.
  
  =head2 ta_trunc($text, $width) => STR
  
  Truncate C<$text> to C<$width> columns while still including all the ANSI color
  codes. This ensures that truncated text still reset colors, etc.
  
  Does *not* handle multiline text; you can split text by C</\r?\n/> yourself.
  
  See also: C<ta_mbtrunc()> in L<Text::ANSI::WideUtil>.
  
  =head2 ta_wrap($text, $width, \%opts) => STR
  
  Like L<Text::WideChar::Util>'s C<wrap()> except handles ANSI color codes.
  Perform color reset at the end of each line and a color replay at the start of
  subsequent line so the text is safe for combining in a multicolumn/tabular
  layout.
  
  Options:
  
  =over
  
  =item * flindent => STR
  
  First line indent. See Text::WideChar::Util for more details.
  
  =item * slindent => STR
  
  First line indent. See Text::WideChar::Util for more details.
  
  =item * tab_width => INT (default: 8)
  
  First line indent. See Text::WideChar::Util for more details.
  
  =item * pad => BOOL (default: 0)
  
  If set to true, will pad each line to C<$width>. This is convenient if you need
  the lines padded, saves calls to ta_pad().
  
  =item * return_stats => BOOL (default: 0)
  
  If set to true, then instead of returning the wrapped string, function will
  return C<< [$wrapped, $stats] >> where C<$stats> is a hash containing some
  information like C<max_word_width>, C<min_word_width>.
  
  =back
  
  Performance: ~500/s on my Core i5 1.7GHz laptop for a ~1KB of text (with zero to
  moderate amount of color codes).
  
  See also: C<ta_mbwrap()> in L<Text::ANSI::WideUtil>.
  
  =head1 FAQ
  
  =head2 How do I highlight a string case-insensitively?
  
  You can currently use a regex for the C<$needle> and use the C<i> modifier.
  Example:
  
   use Term::ANSIColor;
   ta_highlight($text, qr/\b(foo)\b/i, color("bold red"));
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Text-ANSI-Util>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Text-ANSI-Util>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Text-ANSI-Util>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Text::ANSI::WideUtil>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2019, 2016, 2015, 2014, 2013 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
TEXT_ANSI_UTIL

    $main::fatpacked{"Text/ANSITable.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'TEXT_ANSITABLE';
  package Text::ANSITable;
  
  our $DATE = '2018-12-02'; # DATE
  our $VERSION = '0.501'; # VERSION
  
  use 5.010001;
  use Carp;
  use Log::ger;
  use Moo;
  use experimental 'smartmatch';
  
  #use List::Util qw(first);
  use Scalar::Util 'looks_like_number';
  require Win32::Console::ANSI if $^O =~ /Win/;
  
  my $ATTRS = [qw(
  
                    use_color color_depth use_box_chars use_utf8 columns rows
                    column_filter row_filter show_row_separator show_header
                    show_header cell_width cell_height cell_pad cell_lpad
                    cell_rpad cell_vpad cell_tpad cell_bpad cell_fgcolor
                    cell_bgcolor cell_align cell_valign header_align header_valign
                    header_vpad header_tpad header_bpad header_fgcolor
                    header_bgcolor color_theme_args border_style_args
  
            )];
  my $STYLES = $ATTRS;
  my $COLUMN_STYLES = [qw(
  
                            type width align valign pad lpad rpad formats fgcolor
                            bgcolor wrap
  
                    )];
  my $ROW_STYLES = [qw(
  
                         height align valign vpad tpad bpad fgcolor bgcolor
  
                 )];
  my $CELL_STYLES = [qw(
  
                          align valign formats fgcolor bgcolor
  
                  )];
  
  has columns => (
      is      => 'rw',
      default => sub { [] },
      trigger => sub {
          my $self = shift;
          $self->{_columns_set}++;
      },
  );
  has rows => (
      is      => 'rw',
      default => sub { [] },
      trigger => sub {
          my ($self, $rows) = @_;
          $self->_set_default_cols($rows->[0]);
      },
  );
  has column_filter => (
      is => 'rw',
  );
  has column_wrap => (
      is => 'rw',
  );
  has row_filter => (
      is => 'rw',
  );
  has _row_separators => ( # [index after which sep should be drawn, ...] sorted
      is      => 'rw',
      default => sub { [] },
  );
  has show_row_separator => (
      is      => 'rw',
      default => sub { 2 },
  );
  has show_header => (
      is      => 'rw',
      default => sub { 1 },
  );
  
  has _column_styles => ( # store per-column styles
      is      => 'rw',
      default => sub { [] },
  );
  has _row_styles => ( # store per-row styles
      is      => 'rw',
      default => sub { [] },
  );
  has _cell_styles => ( # store per-cell styles
      is      => 'rw',
      default => sub { [] },
  );
  
  # each element of _cond_*styles is a two-element [$cond, ], where $cond is code
  # (str|coderef) and the second element is a hashref containing styles.
  
  has _cond_column_styles => ( # store conditional column styles
      is      => 'rw',
      default => sub { [] },
  );
  has _cond_row_styles => ( # store conditional row styles
      is      => 'rw',
      default => sub { [] },
  );
  has _cond_cell_styles => ( # store conditional cell styles
      is      => 'rw',
      default => sub { [] },
  );
  
  has cell_width => (
      is      => 'rw',
  );
  has cell_height => (
      is      => 'rw',
  );
  has cell_pad => (
      is      => 'rw',
      default => sub { 1 },
  );
  has cell_lpad => (
      is      => 'rw',
  );
  has cell_rpad => (
      is      => 'rw',
  );
  has cell_vpad => (
      is      => 'rw',
      default => sub { 0 },
  );
  has cell_tpad => (
      is      => 'rw',
  );
  has cell_bpad => (
      is      => 'rw',
  );
  has cell_fgcolor => (
      is => 'rw',
  );
  has cell_bgcolor => (
      is => 'rw',
  );
  has cell_align => (
      is => 'rw',
  );
  has cell_valign => (
      is => 'rw',
  );
  
  has header_align => (
      is      => 'rw',
  );
  has header_valign => (
      is      => 'rw',
  );
  has header_vpad => (
      is      => 'rw',
  );
  has header_tpad => (
      is      => 'rw',
  );
  has header_bpad => (
      is      => 'rw',
  );
  has header_fgcolor => (
      is      => 'rw',
  );
  has header_bgcolor => (
      is      => 'rw',
  );
  
  with 'Border::Style::Role';
  with 'Color::Theme::Role::ANSI';
  with 'Term::App::Role::Attrs';
  
  sub BUILD {
      my ($self, $args) = @_;
  
      if ($ENV{ANSITABLE_STYLE_SETS}) {
          require JSON::MaybeXS;
          my $sets = JSON::MaybeXS::decode_json($ENV{ANSITABLE_STYLE_SETS});
          croak "ANSITABLE_STYLE_SETS must be an array"
              unless ref($sets) eq 'ARRAY';
          for my $set (@$sets) {
              if (ref($set) eq 'ARRAY') {
                  $self->apply_style_set($set->[0], $set->[1]);
              } else {
                  $self->apply_style_set($set);
              }
          }
      }
  
      if ($ENV{ANSITABLE_STYLE}) {
          require JSON::MaybeXS;
          my $s = JSON::MaybeXS::decode_json($ENV{ANSITABLE_STYLE});
          for my $k (keys %$s) {
              my $v = $s->{$k};
              croak "Unknown table style '$k' in ANSITABLE_STYLE environment, ".
                  "please use one of [".join(", ", @$STYLES)."]"
                      unless $k ~~ $STYLES;
              $self->{$k} = $v;
          }
      }
  
      # set "pseudo"-attributes, they are not declared using 'has' so Moo doesn't
      # set them and we need to set them manually
      if ($args->{border_style}) { $self->border_style($args->{border_style}) }
      if ($args->{color_theme}) { $self->color_theme($args->{color_theme}) }
  
      # pick a default border style
      unless ($self->{border_style}) {
          my $bs;
  
          my $use_utf8 = $self->use_utf8;
  
          # even though Term::Detect::Software decides that linux virtual console
          # does not support unicode, it actually can display some uni characters
          # like single borders, so we use it as the default here instead of
          # singleo_ascii (linux vc doesn't seem to support box_chars).
          my $emu_eng  = $self->detect_terminal->{emulator_engine} // '';
          my $linux_vc = $emu_eng eq 'linux' && !defined($ENV{UTF8});
          if ($linux_vc) {
              $use_utf8 = 1;
              $bs = 'Default::singleo_utf8';
          }
          # use statement modifier style to avoid block and make local work
          local $self->{use_utf8} = 1 if $linux_vc;
  
          # we only default to utf8 border if user has set something like
          # binmode(STDOUT, ":utf8") to avoid 'Wide character in print' warning.
          unless (defined $ENV{UTF8}) {
              require PerlIO;
              my @layers = PerlIO::get_layers(STDOUT);
              $use_utf8 = 0 unless 'utf8' ~~ @layers;
          }
  
          if (defined $ENV{ANSITABLE_BORDER_STYLE}) {
              $bs = $ENV{ANSITABLE_BORDER_STYLE};
          } elsif ($use_utf8) {
              $bs //= 'Default::bricko';
          } elsif ($self->use_box_chars) {
              $bs = 'Default::singleo_boxchar';
          } else {
              $bs = 'Default::singleo_ascii';
          }
  
          $self->border_style($bs);
      }
  
      # pick a default color theme
      unless ($self->{color_theme}) {
          my $ct;
          if (defined $ENV{ANSITABLE_COLOR_THEME}) {
              $ct = $ENV{ANSITABLE_COLOR_THEME};
          } elsif ($self->use_color) {
              my $bg = $self->detect_terminal->{default_bgcolor} // '';
              if ($self->color_depth >= 2**24) {
                  $ct = 'Default::default_gradation' .
                      ($bg eq 'ffffff' ? '_whitebg' : '');
              } else {
                  $ct = 'Default::default_nogradation' .
                      ($bg eq 'ffffff' ? '_whitebg' : '');;
              }
          } else {
              $ct = 'Default::no_color';
          }
          $self->color_theme($ct);
      }
  
      unless (defined $self->{wide}) {
          $self->{wide} = eval { require Text::ANSI::WideUtil; 1 } ? 1:0;
      }
      require Text::ANSI::Util;
      $self->{_func_add_color_resets} = \&Text::ANSI::Util::ta_add_color_resets;
      if ($self->{wide}) {
          require Text::ANSI::WideUtil;
          $self->{_func_length_height} = \&Text::ANSI::WideUtil::ta_mbswidth_height;
          $self->{_func_pad}           = \&Text::ANSI::WideUtil::ta_mbpad;
          $self->{_func_wrap}          = \&Text::ANSI::WideUtil::ta_mbwrap;
      } else {
          $self->{_func_length_height} = \&Text::ANSI::Util::ta_length_height;
          $self->{_func_pad}           = \&Text::ANSI::Util::ta_pad;
          $self->{_func_wrap}          = \&Text::ANSI::Util::ta_wrap;
      }
  }
  
  sub _set_default_cols {
      my ($self, $row) = @_;
      return if $self->{_columns_set}++;
      $self->columns([map {"col$_"} 0..@$row-1]) if $row;
  }
  
  sub add_row {
      my ($self, $row, $styles) = @_;
      croak "Row must be arrayref" unless ref($row) eq 'ARRAY';
      push @{ $self->{rows} }, $row;
      $self->_set_default_cols($row) unless $self->{_columns_set}++;
      if ($styles) {
          my $i = @{ $self->{rows} }-1;
          for my $s (keys %$styles) {
              $self->set_row_style($i, $s, $styles->{$s});
          }
      }
      $self;
  }
  
  sub add_row_separator {
      my ($self) = @_;
      my $idx = ~~@{$self->{rows}}-1;
      # ignore duplicate separators
      push @{ $self->{_row_separators} }, $idx
          unless @{ $self->{_row_separators} } &&
              $self->{_row_separators}[-1] == $idx;
      $self;
  }
  
  sub add_rows {
      my ($self, $rows, $styles) = @_;
      croak "Rows must be arrayref" unless ref($rows) eq 'ARRAY';
      $self->add_row($_, $styles) for @$rows;
      $self;
  }
  
  sub _colnum {
      my $self = shift;
      my $colname = shift;
  
      return $colname if looks_like_number($colname);
      my $cols = $self->{columns};
      for my $i (0..@$cols-1) {
          return $i if $cols->[$i] eq $colname;
      }
      croak "Unknown column name '$colname'";
  }
  
  sub get_cell {
      my ($self, $row_num, $col) = @_;
  
      $col = $self->_colnum($col);
  
      $self->{rows}[$row_num][$col];
  }
  
  sub set_cell {
      my ($self, $row_num, $col, $val) = @_;
  
      $col = $self->_colnum($col);
  
      my $oldval = $self->{rows}[$row_num][$col];
      $self->{rows}[$row_num][$col] = $val;
      $oldval;
  }
  
  sub get_column_style {
      my ($self, $col, $style) = @_;
  
      $col = $self->_colnum($col);
      $self->{_column_styles}[$col]{$style};
  }
  
  sub set_column_style {
      my $self = shift;
      my $col  = shift;
  
      $col = $self->_colnum($col);
  
      my %sets = ref($_[0]) eq 'HASH' ? %{$_[0]} : @_;
  
      for my $style (keys %sets) {
          my $val = $sets{$style};
          croak "Unknown per-column style '$style', please use one of [".
              join(", ", @$COLUMN_STYLES) . "]" unless $style ~~ $COLUMN_STYLES;
          $self->{_column_styles}[$col]{$style} = $val;
      }
  }
  
  sub get_cond_column_styles {
      my $self = shift;
      $self->{_cond_column_styles};
  }
  
  #sub set_cond_column_style {
  #    my ($self, $styles) = @_;
  #    $self->{_cond_column_styles} = $styles;
  #}
  
  sub add_cond_column_style {
      my $self = shift;
      my $cond = shift;
      if (ref($cond) ne 'CODE') {
          croak "cond must be a coderef";
      }
  
      my $styles;
      if (ref($_[0]) eq 'HASH') {
          $styles = shift;
      } else {
          $styles = { @_ };
      }
  
      for my $style (keys %$styles) {
          croak "Unknown per-column style '$style', please use one of [".
              join(", ", @$COLUMN_STYLES) . "]" unless $style ~~ $COLUMN_STYLES;
      }
  
      push @{ $self->{_cond_column_styles} }, [$cond, $styles];
  }
  
  #sub clear_cond_column_styles {
  #    my $self = shift;
  #    $self->{_cond_column_styles} = [];
  #}
  
  sub get_eff_column_style {
      my ($self, $col, $style) = @_;
  
      $col = $self->_colnum($col);
  
      # the result of calculation is cached here
      if (defined $self->{_draw}{eff_column_styles}[$col]) {
          return $self->{_draw}{eff_column_styles}[$col]{$style};
      }
  
      my $cols = $self->{columns};
      my %styles;
  
      # apply conditional styles
    COND:
      for my $ei (0..@{ $self->{_cond_column_styles} }-1) {
          my $e = $self->{_cond_column_styles}[$ei];
          local $_ = $col;
          my $res = $e->[0]->(
              $self,
              col     => $col,
              colname => $cols->[$col],
          );
          next COND unless $res;
          if (ref($res) eq 'HASH') {
              $styles{$_} = $res->{$_} for keys %$res;
          }
          $styles{$_} = $e->[1]{$_} for keys %{ $e->[1] };
      }
  
      # apply per-column styles
      my $rss = $self->{_column_styles}[$col];
      if ($rss) {
          $styles{$_} = $rss->{$_} for keys %$rss;
      }
  
      $self->{_draw}{eff_column_styles}[$col] = \%styles;
  
      $styles{$style};
  }
  
  sub get_row_style {
      my ($self, $row, $style) = @_;
  
      $self->{_row_styles}[$row]{$style};
  }
  
  sub set_row_style {
      my $self = shift;
      my $row  = shift;
  
      my %sets = ref($_[0]) eq 'HASH' ? %{$_[0]} : @_;
  
      for my $style (keys %sets) {
          my $val = $sets{$style};
          croak "Unknown per-row style '$style', please use one of [".
              join(", ", @$ROW_STYLES) . "]" unless $style ~~ $ROW_STYLES;
          $self->{_row_styles}[$row]{$style} = $val;
      }
  }
  
  sub get_cond_row_styles {
      my $self = shift;
      $self->{_cond_row_styles};
  }
  
  #sub set_cond_row_style {
  #    my ($self, $styles) = @_;
  #    $self->{_cond_row_styles} = $styles;
  #}
  
  sub add_cond_row_style {
      my $self = shift;
      my $cond = shift;
      if (ref($cond) ne 'CODE') {
          croak "cond must be a coderef";
      }
  
      my $styles;
      if (ref($_[0]) eq 'HASH') {
          $styles = shift;
      } else {
          $styles = { @_ };
      }
  
      for my $style (keys %$styles) {
          croak "Unknown per-row style '$style', please use one of [".
              join(", ", @$ROW_STYLES) . "]" unless $style ~~ $ROW_STYLES;
      }
  
      push @{ $self->{_cond_row_styles} }, [$cond, $styles];
  }
  
  #sub clear_cond_row_styles {
  #    my $self = shift;
  #    $self->{_cond_row_styles} = [];
  #}
  
  sub get_eff_row_style {
      my ($self, $row, $style) = @_;
  
      # the result of calculation is cached here
      if (defined $self->{_draw}{eff_row_styles}[$row]) {
          return $self->{_draw}{eff_row_styles}[$row]{$style};
      }
  
      my $rows = $self->{rows};
      my %styles;
  
      # apply conditional styles
    COND:
      for my $ei (0..@{ $self->{_cond_row_styles} }-1) {
          my $e = $self->{_cond_row_styles}[$ei];
          local $_ = $row;
          my $res = $e->[0]->(
              $self,
              row      => $row,
              row_data => $rows->[$row],
          );
          next COND unless $res;
          if (ref($res) eq 'HASH') {
              $styles{$_} = $res->{$_} for keys %$res;
          }
          $styles{$_} = $e->[1]{$_} for keys %{ $e->[1] };
      }
  
      # apply per-row styles
      my $rss = $self->{_row_styles}[$row];
      if ($rss) {
          $styles{$_} = $rss->{$_} for keys %$rss;
      }
  
      $self->{_draw}{eff_row_styles}[$row] = \%styles;
  
      $styles{$style};
  }
  
  sub get_cell_style {
      my ($self, $row, $col, $style) = @_;
  
      $col = $self->_colnum($col);
      $self->{_cell_styles}[$row][$col]{$style};
  }
  
  sub set_cell_style {
      my $self = shift;
      my $row  = shift;
      my $col  = shift;
  
      $col = $self->_colnum($col);
  
      my %sets = ref($_[0]) eq 'HASH' ? %{$_[0]} : @_;
  
      for my $style (keys %sets) {
          my $val = $sets{$style};
          croak "Unknown per-cell style '$style', please use one of [".
              join(", ", @$CELL_STYLES) . "]" unless $style ~~ $CELL_STYLES;
          $self->{_cell_styles}[$row][$col]{$style} = $val;
      }
  }
  
  sub get_cond_cell_styles {
      my $self = shift;
      $self->{_cond_cell_styles};
  }
  
  #sub set_cond_cell_style {
  #    my ($self, $styles) = @_;
  #    $self->{_cond_cell_styles} = $styles;
  #}
  
  sub add_cond_cell_style {
      my $self = shift;
      my $cond = shift;
      if (ref($cond) ne 'CODE') {
          croak "cond must be a coderef";
      }
  
      my $styles;
      if (ref($_[0]) eq 'HASH') {
          $styles = shift;
      } else {
          $styles = { @_ };
      }
  
      for my $style (keys %$styles) {
          croak "Unknown per-cell style '$style', please use one of [".
              join(", ", @$CELL_STYLES) . "]" unless $style ~~ $CELL_STYLES;
      }
  
      push @{ $self->{_cond_cell_styles} }, [$cond, $styles];
  }
  
  #sub clear_cond_cell_styles {
  #    my $self = shift;
  #    $self->{_cond_cell_styles} = [];
  #}
  
  sub get_eff_cell_style {
      my ($self, $row, $col, $style) = @_;
  
      # the result of calculation is cached here
      if (defined $self->{_draw}{eff_cell_styles}[$row][$col]) {
          return $self->{_draw}{eff_cell_styles}[$row][$col]{$style};
      }
  
      my $rows = $self->{rows};
      my %styles;
  
      # apply conditional styles
    COND:
      for my $ei (0..@{ $self->{_cond_cell_styles} }-1) {
          my $e = $self->{_cond_cell_styles}[$ei];
          local $_ = $rows->[$row][$col];
          my $res = $e->[0]->(
              $self,
              content  => $_,
              col      => $col,
              row      => $row,
              row_data => $rows->[$row],
          );
          next COND unless $res;
          if (ref($res) eq 'HASH') {
              $styles{$_} = $res->{$_} for keys %$res;
          }
          $styles{$_} = $e->[1]{$_} for keys %{ $e->[1] };
      }
  
      # apply per-cell styles
      my $css = $self->{_cell_styles}[$row][$col];
      if ($css) {
          $styles{$_} = $css->{$_} for keys %$css;
      }
  
      $self->{_draw}{eff_cell_styles}[$row][$col] = \%styles;
  
      $styles{$style};
  }
  
  sub apply_style_set {
      my $self = shift;
      my $name = shift;
      $name =~ /\A[A-Za-z0-9_]+(?:::[A-Za-z0-9_]+)*\z/
          or croak "Invalid style set name, please use alphanums only";
      {
          my $name = $name;
          $name =~ s!::!/!g;
          require "Text/ANSITable/StyleSet/$name.pm";
      }
      my %args = ref($_[0]) eq 'HASH' ? %{$_[0]} : @_;
      my $obj = "Text::ANSITable::StyleSet::$name"->new(%args);
      $obj->apply($self);
  }
  
  sub list_style_sets {
      require Module::List;
      require Module::Load;
      require Package::MoreUtil;
  
      my ($self, $detail) = @_;
  
      my $prefix = (ref($self) ? ref($self) : $self ) .
          '::StyleSet'; # XXX allow override
      my $all_sets = $self->{_all_style_sets};
  
      if (!$all_sets) {
          my $mods = Module::List::list_modules("$prefix\::",
                                                {list_modules=>1, recurse=>1});
          $all_sets = {};
          for my $mod (sort keys %$mods) {
              #$log->tracef("Loading style set module '%s' ...", $mod);
              Module::Load::load($mod);
              my $name = $mod; $name =~ s/\A\Q$prefix\:://;
              my $summary = $mod->summary;
              # we don't have meta, so dig it ourselves
              my %ct = Package::MoreUtil::list_package_contents($mod);
              my $args = [sort grep {!/\W/ && !/\A(new|summary|apply)\z/}
                              keys %ct];
              $all_sets->{$name} = {name=>$name, summary=>$summary, args=>$args};
          }
          $self->{_all_style_sets} = $all_sets;
      }
  
      if ($detail) {
          return $all_sets;
      } else {
          return (sort keys %$all_sets);
      }
  }
  
  # read environment variables for style, this will only be done once per object
  sub _read_style_envs {
      my $self = shift;
  
      next if $self->{_read_style_envs}++;
  
      if ($ENV{ANSITABLE_COLUMN_STYLES}) {
          require JSON::MaybeXS;
          my $ss = JSON::MaybeXS::decode_json($ENV{ANSITABLE_COLUMN_STYLES});
          croak "ANSITABLE_COLUMN_STYLES must be a hash"
              unless ref($ss) eq 'HASH';
          for my $col (keys %$ss) {
              my $ci = $self->_colnum($col);
              my $s = $ss->{$col};
              for my $k (keys %$s) {
                  my $v = $s->{$k};
              croak "Unknown column style '$k' (for column $col) in ".
                  "ANSITABLE_COLUMN_STYLES environment, ".
                      "please use one of [".join(", ", @$COLUMN_STYLES)."]"
                          unless $k ~~ $COLUMN_STYLES;
                  $self->{_column_styles}[$ci]{$k} //= $v;
              }
          }
      }
  
      if ($ENV{ANSITABLE_ROW_STYLES}) {
          require JSON::MaybeXS;
          my $ss = JSON::MaybeXS::decode_json($ENV{ANSITABLE_ROW_STYLES});
          croak "ANSITABLE_ROW_STYLES must be a hash"
              unless ref($ss) eq 'HASH';
          for my $row (keys %$ss) {
              my $s = $ss->{$row};
              for my $k (keys %$s) {
                  my $v = $s->{$k};
              croak "Unknown row style '$k' (for row $row) in ".
                  "ANSITABLE_ROW_STYLES environment, ".
                      "please use one of [".join(", ", @$ROW_STYLES)."]"
                          unless $k ~~ $ROW_STYLES;
                  $self->{_row_styles}[$row]{$k} //= $v;
              }
          }
      }
  
      if ($ENV{ANSITABLE_CELL_STYLES}) {
          require JSON::MaybeXS;
          my $ss = JSON::MaybeXS::decode_json($ENV{ANSITABLE_CELL_STYLES});
          croak "ANSITABLE_CELL_STYLES must be a hash"
              unless ref($ss) eq 'HASH';
          for my $cell (keys %$ss) {
              croak "Invalid cell specification in ANSITABLE_CELL_STYLES: ".
                  "$cell, please use 'row,col'"
                      unless $cell =~ /^(.+),(.+)$/;
              my $row = $1;
              my $col = $2;
              my $ci = $self->_colnum($col);
              my $s = $ss->{$cell};
              for my $k (keys %$s) {
                  my $v = $s->{$k};
              croak "Unknown cell style '$k' (for cell $row,$col) in ".
                  "ANSITABLE_CELL_STYLES environment, ".
                      "please use one of [".join(", ", @$CELL_STYLES)."]"
                          unless $k ~~ $CELL_STYLES;
                  $self->{_cell_styles}[$row][$ci]{$k} //= $v;
              }
          }
      }
  }
  
  # determine which columns to show (due to column_filter)
  sub _calc_fcols {
      my $self = shift;
  
      my $cols = $self->{columns};
      my $cf   = $self->{column_filter};
  
      my $fcols;
      if (ref($cf) eq 'CODE') {
          $fcols = [grep {$cf->($_)} @$cols];
      } elsif (ref($cf) eq 'ARRAY') {
          $fcols = [grep {defined} map {looks_like_number($_) ?
                                            $cols->[$_] : $_} @$cf];
      } else {
          $fcols = $cols;
      }
      $self->{_draw}{fcols} = $fcols;
  }
  
  # calculate widths/heights of header, store width settings, column [lr]pads
  sub _calc_header_height {
      my $self = shift;
  
      my $cols  = $self->{columns};
      my $fcols = $self->{_draw}{fcols};
  
      my $fcol_widths = []; # index = [colnum]
      my $header_height = 1;
      my $fcol_lpads  = []; # index = [colnum]
      my $fcol_rpads  = []; # ditto
      my $fcol_setwidths  = []; # index = [colnum], from cell_width/col width
      my $frow_setheights = []; # index = [frownum], from cell_height/row height
  
      my %seen;
      my $lpad = $self->{cell_lpad} // $self->{cell_pad}; # tbl-lvl leftp
      my $rpad = $self->{cell_rpad} // $self->{cell_pad}; # tbl-lvl rightp
      for my $i (0..@$cols-1) {
          next unless $cols->[$i] ~~ $fcols;
          next if $seen{$cols->[$i]}++;
  
          $fcol_setwidths->[$i] = $self->get_eff_column_style($i, 'width') //
              $self->{cell_width};
          my $wh = $self->_opt_calc_cell_width_height(undef, $i, $cols->[$i]);
          $fcol_widths->[$i] = $wh->[0];
          $header_height = $wh->[1]
              if !defined($header_height) || $header_height < $wh->[1];
          $fcol_lpads->[$i] = $self->get_eff_column_style($i, 'lpad') //
              $self->get_eff_column_style($i, 'pad') // $lpad;
          $fcol_rpads->[$i] = $self->get_eff_column_style($i, 'rpad') //
              $self->get_eff_column_style($i, 'pad') // $rpad;
      }
  
      $self->{_draw}{header_height}   = $header_height;
      $self->{_draw}{fcol_lpads}      = $fcol_lpads;
      $self->{_draw}{fcol_rpads}      = $fcol_rpads;
      $self->{_draw}{fcol_setwidths}  = $fcol_setwidths;
      $self->{_draw}{frow_setheights} = $frow_setheights;
      $self->{_draw}{fcol_widths}     = $fcol_widths;
  }
  
  # determine which rows to show, calculate vertical paddings of data rows, store
  # height settings
  sub _calc_frows {
      my $self = shift;
  
      my $rows = $self->{rows};
      my $rf   = $self->{row_filter};
      my $frow_setheights = $self->{_draw}{frow_setheights};
  
      my $frow_tpads  = []; # index = [frownum]
      my $frow_bpads  = []; # ditto
      my $frows = [];
      my $frow_separators = [];
      my $frow_orig_indices = []; # needed when accessing original row data
  
      my $tpad = $self->{cell_tpad} // $self->{cell_vpad}; # tbl-lvl top pad
      my $bpad = $self->{cell_bpad} // $self->{cell_vpad}; # tbl-lvl botom pad
      my $i = -1;
      my $j = -1;
      for my $row (@$rows) {
          $i++;
          if (ref($rf) eq 'CODE') {
              next unless $rf->($row, $i);
          } elsif ($rf) {
              next unless $i ~~ $rf;
          }
          $j++;
          push @$frow_setheights, $self->get_eff_row_style($i, 'height') //
              $self->{cell_height};
          push @$frows, [@$row]; # 1-level clone, for storing formatted values
          push @$frow_separators, $j if $i ~~ $self->{_row_separators};
          push @$frow_tpads, $self->get_eff_row_style($i, 'tpad') //
              $self->get_eff_row_style($i, 'vpad') // $tpad;
          push @$frow_bpads, $self->get_eff_row_style($i, 'bpad') //
              $self->get_eff_row_style($i, 'vpad') // $bpad;
          push @$frow_orig_indices, $i;
      }
  
      $self->{_draw}{frows}             = $frows;
      $self->{_draw}{frow_separators}   = $frow_separators;
      $self->{_draw}{frow_tpads}        = $frow_tpads;
      $self->{_draw}{frow_bpads}        = $frow_bpads;
      $self->{_draw}{frow_orig_indices} = $frow_orig_indices;
  }
  
  # detect column type from data/header name. assign default column align, valign,
  # fgcolor, bgcolor, formats.
  sub _detect_column_types {
      my $self = shift;
  
      my $cols = $self->{columns};
      my $rows = $self->{rows};
      my $ct   = $self->{color_theme};
  
      my $fcol_detect = [];
      my %seen;
      for my $i (0..@$cols-1) {
          my $col = $cols->[$i];
          my $res = {};
          $fcol_detect->[$i] = $res;
  
          # optim: skip detecting columns we're not showing
          next unless $col ~~ $self->{_draw}{fcols};
  
          # but detect from all rows, not just ones we're showing
          my $type = $self->get_eff_column_style($col, 'type');
          my $subtype;
        DETECT:
          {
              last DETECT if $type;
              if ($col =~ /^(can|is|has|does)_|\?$/) {
                  $type = 'bool';
                  last DETECT;
              }
  
              require Parse::VarName;
              my @words = map {lc} @{ Parse::VarName::split_varname_words(
                  varname=>$col) };
              for (qw/date time ctime mtime utime atime stime/) {
                  if ($_ ~~ @words) {
                      $type = 'date';
                      last DETECT;
                  }
              }
  
              my $pass = 1;
              for my $j (0..@$rows) {
                  my $v = $rows->[$j][$i];
                  next unless defined($v);
                  do { $pass=0; last } unless looks_like_number($v);
              }
              if ($pass) {
                  $type = 'num';
                  if ($col =~ /(pct|percent(?:age))\b|\%/) {
                      $subtype = 'pct';
                  }
                  last DETECT;
              }
              $type = 'str';
          } # DETECT
  
          $res->{type} = $type;
          if ($type eq 'bool') {
              $res->{align}   = 'center';
              $res->{valign}  = 'center';
              $res->{fgcolor} = $ct->{colors}{bool_data};
              $res->{formats} = [[bool => {style => $self->{use_utf8} ?
                                               "check_cross" : "Y_N"}]];
          } elsif ($type eq 'date') {
              $res->{align}   = 'middle';
              $res->{fgcolor} = $ct->{colors}{date_data};
              $res->{formats} = [['date' => {}]];
          } elsif ($type =~ /\A(num|float|int)\z/) {
              $res->{align}   = 'right';
              $res->{fgcolor} = $ct->{colors}{num_data};
              if (($subtype//"") eq 'pct') {
                  $res->{formats} = [[num => {style=>'percent'}]];
              }
          } else {
              $res->{fgcolor} = $ct->{colors}{str_data};
              $res->{wrap}    = $ENV{WRAP} // 1;
          }
      }
  
      #use Data::Dump; print "D:fcol_detect: "; dd $fcol_detect;
      $self->{_draw}{fcol_detect} = $fcol_detect;
  }
  
  # calculate width and height of a cell, but skip calculating (to save some
  # cycles) if width is already set by frow_setheights / fcol_setwidths.
  sub _opt_calc_cell_width_height {
      my ($self, $frow_num, $col, $text) = @_;
  
      $col = $self->_colnum($col);
      my $setw  = $self->{_draw}{fcol_setwidths}[$col];
      my $calcw = !defined($setw) || $setw < 0;
      my $seth  = defined($frow_num) ?
          $self->{_draw}{frow_setheights}[$frow_num] : undef;
      my $calch = !defined($seth) || $seth < 0;
  
      my $wh;
      if ($calcw) {
          $wh = $self->{_func_length_height}->($text);
          $wh->[0] = -$setw if defined($setw) && $setw<0 && $wh->[0] < -$setw;
          $wh->[1] = $seth if !$calch;
          $wh->[1] = -$seth if defined($seth) && $seth<0 && $wh->[1] < -$seth;
      } elsif ($calch) {
          my $h = 1; $h++ while $text =~ /\n/go;
          $h = -$seth if defined($seth) && $seth<0 && $h < -$seth;
          $wh = [$setw, $h];
      } else {
          $wh = [$setw, $seth];
      }
      #say "D:_opt_calc_cell_width_height(", $frow_num//"undef", ", $col) = $wh->[0], $wh->[1]";
      $wh;
  }
  
  sub _apply_column_formats {
      my $self = shift;
  
      my $cols  = $self->{columns};
      my $frows = $self->{_draw}{frows};
      my $fcols = $self->{_draw}{fcols};
      my $fcol_detect = $self->{_draw}{fcol_detect};
  
      my %seen;
      for my $i (0..@$cols-1) {
          next unless $cols->[$i] ~~ $fcols;
          next if $seen{$cols->[$i]}++;
          my @fmts = @{ $self->get_eff_column_style($i, 'formats') //
                            $fcol_detect->[$i]{formats} // [] };
          if (@fmts) {
              require Data::Unixish::Apply;
              my $res = Data::Unixish::Apply::apply(
                  in => [map {$frows->[$_][$i]} 0..@$frows-1],
                  functions => \@fmts,
              );
              croak "Can't format column $cols->[$i]: $res->[0] - $res->[1]"
                  unless $res->[0] == 200;
              $res = $res->[2];
              for (0..@$frows-1) { $frows->[$_][$i] = $res->[$_] // "" }
          } else {
              # change null to ''
              for (0..@$frows-1) { $frows->[$_][$i] //= "" }
          }
      }
  }
  
  sub _apply_cell_formats {
      my $self = shift;
  
      my $cols  = $self->{columns};
      my $rows  = $self->{rows};
      my $fcols = $self->{_draw}{fcols};
      my $frows = $self->{_draw}{frows};
      my $frow_orig_indices = $self->{_draw}{frow_orig_indices};
  
      for my $i (0..@$frows-1) {
          my %seen;
          my $origi = $frow_orig_indices->[$i];
          for my $j (0..@$cols-1) {
              next unless $cols->[$j] ~~ $fcols;
              next if $seen{$cols->[$j]}++;
  
              my $fmts = $self->get_eff_cell_style($origi, $j, 'formats');
              if (defined $fmts) {
                  require Data::Unixish::Apply;
                  my $res = Data::Unixish::Apply::apply(
                      in => [ $frows->[$i][$j] ],
                      functions => $fmts,
                  );
                  croak "Can't format cell ($origi, $cols->[$j]): ".
                      "$res->[0] - $res->[1]" unless $res->[0] == 200;
                  $frows->[$i][$j] = $res->[2][0] // "";
              }
          } # col
      }
  }
  
  sub _calc_row_widths_heights {
      my $self = shift;
  
      my $cols  = $self->{columns};
      my $fcols = $self->{_draw}{fcols};
      my $frows = $self->{_draw}{frows};
  
      my $frow_heights = [];
      my $fcol_widths  = $self->{_draw}{fcol_widths};
      my $frow_orig_indices = $self->{_draw}{frow_orig_indices};
  
      my $height = $self->{cell_height};
      my $tpad = $self->{cell_tpad} // $self->{cell_vpad}; # tbl-lvl tpad
      my $bpad = $self->{cell_bpad} // $self->{cell_vpad}; # tbl-lvl bpad
      my $cswidths = [map {$self->get_eff_column_style($_, 'width')} 0..@$cols-1];
      for my $i (0..@$frows-1) {
          my %seen;
          my $origi = $frow_orig_indices->[$i];
          my $rsheight = $self->get_eff_row_style($origi, 'height');
          for my $j (0..@$cols-1) {
              next unless $cols->[$j] ~~ $fcols;
              next if $seen{$cols->[$j]}++;
  
              my $wh = $self->_opt_calc_cell_width_height($i,$j,$frows->[$i][$j]);
  
              $fcol_widths->[$j]  = $wh->[0] if $fcol_widths->[$j] < $wh->[0];
              $frow_heights->[$i] = $wh->[1] if !defined($frow_heights->[$i])
                  || $frow_heights->[$i] < $wh->[1];
          } # col
      }
      $self->{_draw}{frow_heights}  = $frow_heights;
  }
  
  sub _wrap_wrappable_columns {
      my $self = shift;
  
      my $cols  = $self->{columns};
      my $fcols = $self->{_draw}{fcols};
      my $frows = $self->{_draw}{frows};
      my $fcol_detect    = $self->{_draw}{fcol_detect};
      my $fcol_setwidths = $self->{_draw}{fcol_setwidths};
  
      my %seen;
      for my $i (0..@$cols-1) {
          next unless $cols->[$i] ~~ $fcols;
          next if $seen{$cols->[$i]}++;
  
          if (($self->get_eff_column_style($i, 'wrap') // $self->{column_wrap} //
                   $fcol_detect->[$i]{wrap}) &&
                       defined($fcol_setwidths->[$i]) &&
                           $fcol_setwidths->[$i]>0) {
              for (0..@$frows-1) {
                  $frows->[$_][$i] = $self->{_func_wrap}->(
                      $frows->[$_][$i], $fcol_setwidths->[$i]);
              }
          }
      }
  }
  
  sub _calc_table_width_height {
      my $self = shift;
  
      my $cols  = $self->{columns};
      my $fcols = $self->{_draw}{fcols};
      my $frows = $self->{_draw}{frows};
      my $fcol_widths  = $self->{_draw}{fcol_widths};
      my $fcol_lpads   = $self->{_draw}{fcol_lpads};
      my $fcol_rpads   = $self->{_draw}{fcol_rpads};
      my $frow_tpads   = $self->{_draw}{frow_tpads};
      my $frow_bpads   = $self->{_draw}{frow_bpads};
      my $frow_heights = $self->{_draw}{frow_heights};
  
      my $w = 0;
      $w += 1 if length($self->get_border_char(3, 0));
      my $has_vsep = length($self->get_border_char(3, 1));
      for my $i (0..@$cols-1) {
          next unless $cols->[$i] ~~ $fcols;
          $w += $fcol_lpads->[$i] + $fcol_widths->[$i] + $fcol_rpads->[$i];
          if ($i < @$cols-1) {
              $w += 1 if $has_vsep;
          }
      }
      $w += 1 if length($self->get_border_char(3, 2));
      $self->{_draw}{table_width}  = $w;
  
      my $h = 0;
      $h += 1 if length($self->get_border_char(0, 0)); # top border line
      $h += $self->{header_tpad} // $self->{header_vpad} //
          $self->{cell_tpad} // $self->{cell_vpad};
      $h += $self->{_draw}{header_height} // 0;
      $h += $self->{header_bpad} // $self->{header_vpad} //
          $self->{cell_bpad} // $self->{cell_vpad};
      $h += 1 if length($self->get_border_char(2, 0));
      for my $i (0..@$frows-1) {
          $h += ($frow_tpads->[$i] // 0) +
              ($frow_heights->[$i] // 0) +
                  ($frow_bpads->[$i] // 0);
          $h += 1 if $self->_should_draw_row_separator($i);
      }
      $h += 1 if length($self->get_border_char(5, 0));
      $self->{_draw}{table_height}  = $h;
  }
  
  # if there are text columns with no width set, and the column width is wider
  # than terminal, try to adjust widths so it fit into the terminal, if possible.
  # return 1 if widths (fcol_widths) adjusted.
  sub _adjust_column_widths {
      my $self = shift;
  
      # try to find wrappable columns that do not have their widths set. currently
      # the algorithm is not proper, it just targets columns which are wider than
      # a hard-coded value (30). it should take into account the longest word in
      # the content/header, but this will require another pass at the text to
      # analyze it.
  
      my $fcols = $self->{_draw}{fcols};
      my $frows = $self->{_draw}{frows};
      my $fcol_setwidths = $self->{_draw}{fcol_setwidths};
      my $fcol_detect    = $self->{_draw}{fcol_detect};
      my $fcol_widths    = $self->{_draw}{fcol_widths};
      my %acols;
      my %origw;
      for my $i (0..@$fcols-1) {
          my $ci = $self->_colnum($fcols->[$i]);
          next if defined($fcol_setwidths->[$ci]) && $fcol_setwidths->[$ci]>0;
          next if $fcol_widths->[$ci] < 30;
          next unless $self->get_eff_column_style($ci, 'wrap') //
              $self->{column_wrap} // $fcol_detect->[$ci]{wrap};
          $acols{$ci}++;
          $origw{$ci} = $fcol_widths->[$ci];
      }
      return 0 unless %acols;
  
      # only do this if table width exceeds terminal width
      my $termw = $self->term_width;
      return 0 unless $termw > 0;
      my $excess = $self->{_draw}{table_width} - $termw;
      return 0 unless $excess > 0;
  
      # reduce text columns proportionally
      my $w = 0; # total width of all to-be-adjusted columns
      $w += $fcol_widths->[$_] for keys %acols;
      return 0 unless $w > 0;
      my $reduced = 0;
    REDUCE:
      while (1) {
          my $has_reduced;
          for my $ci (keys %acols) {
              last REDUCE if $reduced >= $excess;
              if ($fcol_widths->[$ci] > 30) {
                  $fcol_widths->[$ci]--;
                  $reduced++;
                  $has_reduced++;
              }
          }
          last if !$has_reduced;
      }
  
      # reset widths
      for my $ci (keys %acols) {
          $fcol_setwidths->[$ci] = $fcol_widths->[$ci];
          $fcol_widths->[$ci] = 0; # reset
      }
  
      # wrap and set setwidths so it doesn't grow again during recalculate
      for my $ci (keys %acols) {
          next unless $origw{$ci} != $fcol_widths->[$ci];
          for (0..@$frows-1) {
              $frows->[$_][$ci] = $self->{_func_wrap}->(
                  $frows->[$_][$ci], $fcol_setwidths->[$ci]);
          }
      }
  
      # recalculate column widths
      $self->_calc_row_widths_heights;
      $self->_calc_table_width_height;
      1;
  }
  
  # filter columns & rows, calculate widths/paddings, format data, put the results
  # in _draw (draw data) attribute.
  sub _prepare_draw {
      my $self = shift;
  
      $self->{_draw} = {};
  
      $self->_read_style_envs;
      $self->_calc_fcols;
      $self->_calc_header_height;
      $self->_calc_frows;
      $self->_detect_column_types;
      $self->_apply_column_formats;
      $self->_apply_cell_formats;
      $self->_wrap_wrappable_columns;
      $self->_calc_row_widths_heights;
      $self->_calc_table_width_height;
      $self->_adjust_column_widths;
  }
  
  # push string into the drawing buffer. also updates "cursor" position.
  sub draw_str {
      my $self = shift;
      # currently x position is not recorded because this involves doing
      # ta_mbswidth() (or ta_mbswidth_height()) for every string, which is rather
      # expensive. so only the y position is recorded by counting newlines.
  
      for (@_) {
          my $num_nl = 0;
          $num_nl++ while /\r?\n/og;
          push @{$self->{_draw}{buf}}, $_;
          $self->{_draw}{y} += $num_nl;
      }
      $self;
  }
  
  sub draw_theme_color {
      my $self = shift;
      my $c = $self->get_theme_color_as_ansi(@_);
      $self->draw_str($c) if length($c);
  }
  
  sub get_color_reset {
      my $self = shift;
      return "" if $self->{color_theme}{no_color};
      "\e[0m";
  }
  
  sub draw_color_reset {
      my $self = shift;
      my $c = $self->get_color_reset;
      $self->draw_str($c) if length($c);
  }
  
  # draw border character(s). drawing border character involves setting border
  # color, setting drawing mode (for boxchar styles), aside from drawing the
  # actual characters themselves. arguments are list of (y, x, n) tuples where y
  # and x are the row and col number of border character, n is the number of
  # characters to print. n defaults to 1 if not specified.
  sub draw_border_char {
      my $self = shift;
      my $args; $args = shift if ref($_[0]) eq 'HASH';
  
      $self->draw_str($self->{_draw}{set_line_draw_mode});
      while (my ($y, $x, $n) = splice @_, 0, 3) {
          $n //= 1;
          if (!$self->{use_color}) {
              # save some CPU cycles
          } elsif ($args) {
              $self->draw_theme_color('border',
                                      {border=>[$y, $x, $n], %$args});
          } else {
              $self->draw_theme_color('border',
                                      {border=>[$y, $x, $n]});
          }
          $self->draw_str($self->get_border_char($y, $x, $n));
          $self->draw_color_reset;
      }
      $self->draw_str($self->{_draw}{reset_line_draw_mode});
  }
  
  sub _should_draw_row_separator {
      my ($self, $i) = @_;
  
      return $i < @{$self->{_draw}{frows}}-1 &&
          (($self->{show_row_separator}==2 && $i~~$self->{_draw}{frow_separators})
               || $self->{show_row_separator}==1);
  }
  
  # apply align/valign, apply padding, apply default fgcolor/bgcolor to text,
  # truncate to specified cell's width & height
  sub _get_cell_lines {
      my $self = shift;
      #say "D: get_cell_lines ".join(", ", map{$_//""} @_);
      my ($text, $width, $height, $align, $valign,
          $lpad, $rpad, $tpad, $bpad, $color) = @_;
  
      my @lines;
      push @lines, "" for 1..$tpad;
      my @dlines = split(/\r?\n/, $text);
      @dlines = ("") unless @dlines;
      my ($la, $lb);
      $valign //= 'top';
      if ($valign =~ /^[Bb]/o) { # bottom
          $la = $height-@dlines;
          $lb = 0;
      } elsif ($valign =~ /^[MmCc]/o) { # middle/center
          $la = int(($height-@dlines)/2);
          $lb = $height-@dlines-$la;
      } else { # top
          $la = 0;
          $lb = $height-@dlines;
      }
      push @lines, "" for 1..$la;
      push @lines, @dlines;
      push @lines, "" for 1..$lb;
      push @lines, "" for 1..$bpad;
  
      $align //= 'left';
      my $pad = $align =~ /^[Ll]/o ? "right" :
          ($align =~ /^[Rr]/o ? "left" : "center");
  
      for (@lines) {
          $_ = (" "x$lpad) . $self->{_func_pad}->($_, $width, $pad, " ", 1) . (" "x$rpad);
          if ($self->{use_color}) {
              # add default color
              s/\e\[0m(?=.)/\e[0m$color/g if length($color);
              $_ = $color . $_;
          }
      }
  
      \@lines;
  }
  
  sub _get_header_cell_lines {
      my ($self, $i) = @_;
  
      my $ct = $self->{color_theme};
  
      my $fgcolor;
      if (defined $self->{header_fgcolor}) {
          $fgcolor = $self->theme_color_to_ansi($self->{header_fgcolor});
      } elsif (defined $self->{cell_fgcolor}) {
          $fgcolor = $self->theme_color_to_ansi($self->{cell_fgcolor});
      #} elsif (defined $self->{_draw}{fcol_detect}[$i]{fgcolor}) {
      #    $fgcolor = $self->themecol2ansi($self->{_draw}{fcol_detect}[$i]{fgcolor});
      } elsif (defined $ct->{colors}{header}) {
          $fgcolor = $self->get_theme_color_as_ansi('header');
      } elsif (defined $ct->{colors}{cell}) {
          $fgcolor = $self->get_theme_color_as_ansi('cell');
      } else {
          $fgcolor = "";
      }
  
      my $bgcolor;
      if (defined $self->{header_bgcolor}) {
          $bgcolor = $self->theme_color_to_ansi($self->{header_bgcolor},
                                                undef, 1);
      } elsif (defined $self->{cell_bgcolor}) {
          $bgcolor = $self->theme_color_to_ansi($self->{cell_bgcolor},
                                                undef, 1);
      } elsif (defined $self->{_draw}{fcol_detect}[$i]{bgcolor}) {
          $fgcolor = $self->theme_color_to_ansi($self->{_draw}{fcol_detect}[$i]{bgcolor},
                                                undef, 1);
      } elsif (defined $ct->{colors}{header_bg}) {
          $bgcolor = $self->get_theme_color_as_ansi('header_bg');
      } elsif (defined $ct->{colors}{cell_bg}) {
          $bgcolor = $self->get_theme_color_as_ansi('cell_bg');
      } else {
          $bgcolor = "";
      }
  
      my $align =
          $self->{header_align} //
              $self->{cell_align} //
                  $self->{_draw}{fcol_detect}[$i]{align} //
                      'left';
      my $valign =
          $self->{header_valign} //
              $self->{cell_valign} //
                  $self->{_draw}{fcol_detect}[$i]{valign} //
                      'top';
  
      my $lpad = $self->{_draw}{fcol_lpads}[$i];
      my $rpad = $self->{_draw}{fcol_rpads}[$i];
      my $tpad = $self->{header_tpad} // $self->{header_vpad} // 0;
      my $bpad = $self->{header_bpad} // $self->{header_vpad} // 0;
  
      #use Data::Dump; print "D:header cell: "; dd {i=>$i, col=>$self->{columns}[$i], fgcolor=>$fgcolor, bgcolor=>$bgcolor};
      my $res = $self->_get_cell_lines(
          $self->{columns}[$i],            # text
          $self->{_draw}{fcol_widths}[$i], # width
          $self->{_draw}{header_height},   # height
          $align, $valign,                 # aligns
          $lpad, $rpad, $tpad, $bpad,      # paddings
          $fgcolor . $bgcolor);
      #use Data::Dump; print "D:res: "; dd $res;
      $res;
  }
  
  sub _get_data_cell_lines {
      my ($self, $y, $x) = @_;
  
      my $ct   = $self->{color_theme};
      my $oy   = $self->{_draw}{frow_orig_indices}[$y];
      my $cell = $self->{_draw}{frows}[$y][$x];
      my $args = {row_num=>$y, col_num=>$x, data=>$cell,
                  orig_data=>$self->{rows}[$oy][$x]};
  
      my $tmp;
      my $fgcolor;
      if (defined ($tmp = $self->get_eff_cell_style($oy, $x, 'fgcolor'))) {
          $fgcolor = $self->theme_color_to_ansi($tmp, $args);
      } elsif (defined ($tmp = $self->get_eff_row_style($oy, 'fgcolor'))) {
          $fgcolor = $self->theme_color_to_ansi($tmp, $args);
      } elsif (defined ($tmp = $self->get_eff_column_style($x, 'fgcolor'))) {
          $fgcolor = $self->theme_color_to_ansi($tmp, $args);
      } elsif (defined ($tmp = $self->{cell_fgcolor})) {
          $fgcolor = $self->theme_color_to_ansi($tmp, $args);
      } elsif (defined ($tmp = $self->{_draw}{fcol_detect}[$x]{fgcolor})) {
          $fgcolor = $self->theme_color_to_ansi($tmp, $args);
      } elsif (defined $ct->{colors}{cell}) {
          $fgcolor = $self->get_theme_color_as_ansi('cell', $args);
      } else {
          $fgcolor = "";
      }
  
      my $bgcolor;
      if (defined ($tmp = $self->get_eff_cell_style($oy, $x, 'bgcolor'))) {
          $bgcolor = $self->theme_color_to_ansi($tmp, $args, 1);
      } elsif (defined ($tmp = $self->get_eff_row_style($oy, 'bgcolor'))) {
          $bgcolor = $self->theme_color_to_ansi($tmp, $args, 1);
      } elsif (defined ($tmp = $self->get_eff_column_style($x, 'bgcolor'))) {
          $bgcolor = $self->theme_color_to_ansi($tmp, $args, 1);
      } elsif (defined ($tmp = $self->{cell_bgcolor})) {
          $bgcolor = $self->theme_color_to_ansi($tmp, $args, 1);
      } elsif (defined ($tmp = $self->{_draw}{fcol_detect}[$x]{bgcolor})) {
          $bgcolor = $self->theme_color_to_ansi($tmp, $args, 1);
      } elsif (defined $ct->{colors}{cell_bg}) {
          $bgcolor = $self->get_theme_color_as_ansi('cell_bg', $args);
      } else {
          $bgcolor = "";
      }
  
      my $align =
          $self->get_eff_cell_style($oy, $x, 'align') //
              $self->get_eff_row_style($oy, 'align') //
                  $self->get_eff_column_style($x, 'align') //
                      $self->{cell_align} //
                          $self->{_draw}{fcol_detect}[$x]{align} //
                              'left';
      my $valign =
          $self->get_eff_cell_style($oy, $x, 'valign') //
              $self->get_eff_row_style($oy, 'valign') //
                  $self->get_eff_column_style($x, 'valign') //
                      $self->{cell_valign} //
                          $self->{_draw}{fcol_detect}[$x]{valign} //
                              'top';
      #say "D:y=$y, x=$x, align=$align, valign=$valign";
  
      my $lpad = $self->{_draw}{fcol_lpads}[$x];
      my $rpad = $self->{_draw}{fcol_rpads}[$x];
      my $tpad = $self->{_draw}{frow_tpads}[$y];
      my $bpad = $self->{_draw}{frow_bpads}[$y];
  
      my $res = $self->_get_cell_lines(
          $cell,                            # text
          $self->{_draw}{fcol_widths}[$x],  # width
          $self->{_draw}{frow_heights}[$y], # height
          $align, $valign,                  # aligns
          $lpad, $rpad, $tpad, $bpad,       # paddings
          $fgcolor . $bgcolor);
      $res;
  }
  
  sub draw {
      my ($self) = @_;
  
      $self->_prepare_draw;
  
      $self->{_draw}{buf} = []; # output buffer
      $self->{_draw}{y} = 0; # current line
  
      # ansi codes to set and reset line-drawing mode.
      {
          my $bs = $self->{border_style};
          $self->{_draw}{set_line_draw_mode}   = $bs->{box_chars} ? "\e(0" : "";
          $self->{_draw}{reset_line_draw_mode} = $bs->{box_chars} ? "\e(B" : "";
      }
  
      my $cols  = $self->{columns};
      my $fcols = $self->{_draw}{fcols};
      my $frows = $self->{_draw}{frows};
      my $frow_heights    = $self->{_draw}{frow_heights};
      my $frow_tpads      = $self->{_draw}{frow_tpads};
      my $frow_bpads      = $self->{_draw}{frow_bpads};
      my $fcol_lpads      = $self->{_draw}{fcol_lpads};
      my $fcol_rpads      = $self->{_draw}{fcol_rpads};
      my $fcol_widths     = $self->{_draw}{fcol_widths};
  
      # draw border top line
      {
          last unless length($self->get_border_char(0, 0));
          my @b;
          push @b, 0, 0, 1;
          for my $i (0..@$fcols-1) {
              my $ci = $self->_colnum($fcols->[$i]);
              push @b, 0, 1,
                  $fcol_lpads->[$ci] + $fcol_widths->[$ci] + $fcol_rpads->[$ci];
              push @b, 0, 2, 1 if $i < @$fcols-1;
          }
          push @b, 0, 3, 1;
          $self->draw_border_char(@b);
          $self->draw_str("\n");
      }
  
      # draw header
      if ($self->{show_header}) {
          my %seen;
          my $hcell_lines = []; # index = [fcolnum]
          if (@$fcols) {
              for my $i (0..@$fcols-1) {
                  my $ci = $self->_colnum($fcols->[$i]);
                  if (defined($seen{$i})) {
                      $hcell_lines->[$i] = $hcell_lines->[$seen{$i}];
                  }
                  $seen{$i} = $ci;
                  $hcell_lines->[$i] = $self->_get_header_cell_lines($ci);
              }
          } else {
              # so we can still draw header
              $hcell_lines->[0] = [""];
          }
          #use Data::Dump; print "D:hcell_lines: "; dd $hcell_lines;
          for my $l (0..@{ $hcell_lines->[0] }-1) {
              $self->draw_border_char(1, 0);
              for my $i (0..@$fcols-1) {
                  $self->draw_str($hcell_lines->[$i][$l]);
                  $self->draw_color_reset;
                  $self->draw_border_char(1, 1) unless $i == @$fcols-1;
              }
              $self->draw_border_char(1, 2);
              $self->draw_str("\n");
          }
      }
  
      # draw header-data row separator
      if ($self->{show_header} && length($self->get_border_char(2, 0))) {
          my @b;
          push @b, 2, 0, 1;
          for my $i (0..@$fcols-1) {
              my $ci = $self->_colnum($fcols->[$i]);
              push @b, 2, 1,
                  $fcol_lpads->[$ci] + $fcol_widths->[$ci] + $fcol_rpads->[$ci];
              push @b, 2, 2, 1 unless $i==@$fcols-1;
          }
          push @b, 2, 3, 1;
          $self->draw_border_char(@b);
          $self->draw_str("\n");
      }
  
      # draw data rows
      {
          for my $r (0..@$frows-1) {
              #$self->draw_str("r$r");
              my $dcell_lines = []; # index = [fcolnum]
              my %seen;
              if (@$fcols) {
                  for my $i (0..@$fcols-1) {
                      my $ci = $self->_colnum($fcols->[$i]);
                      if (defined($seen{$i})) {
                          $dcell_lines->[$i] = $dcell_lines->[$seen{$i}];
                      }
                      $seen{$i} = $ci;
                      $dcell_lines->[$i] = $self->_get_data_cell_lines($r, $ci);
                  }
              } else {
                  # so we can still print row
                  $dcell_lines->[0] = [" "];
              }
              #use Data::Dump; print "TMP: dcell_lines: "; dd $dcell_lines;
              for my $l (0..@{ $dcell_lines->[0] }-1) {
                  $self->draw_border_char({row_num=>$r}, 3, 0);
                  for my $i (0..@$fcols-1) {
                      $self->draw_str($dcell_lines->[$i][$l]);
                      $self->draw_color_reset;
                      $self->draw_border_char({row_num=>$r}, 3, 1)
                          unless $i == @$fcols-1;
                  }
                  $self->draw_border_char({row_num=>$r}, 3, 2);
                  $self->draw_str("\n");
              }
  
              # draw separators between row
              if ($self->_should_draw_row_separator($r)) {
                  my @b;
                  push @b, 4, 0, 1;
                  for my $i (0..@$fcols-1) {
                      my $ci = $self->_colnum($fcols->[$i]);
                      push @b, 4, 1,
                          $fcol_lpads->[$ci] + $fcol_widths->[$ci] +
                              $fcol_rpads->[$ci];
                      push @b, 4, $i==@$fcols-1 ? 3:2, 1;
                  }
                  $self->draw_border_char({row_num=>$r}, @b);
                  $self->draw_str("\n");
              }
          } # for frow
      }
  
      # draw border bottom line
      {
          last unless length($self->get_border_char(5, 0));
          my @b;
          push @b, 5, 0, 1;
          for my $i (0..@$fcols-1) {
              my $ci = $self->_colnum($fcols->[$i]);
              push @b, 5, 1,
                  $fcol_lpads->[$ci] + $fcol_widths->[$ci] + $fcol_rpads->[$ci];
              push @b, 5, 2, 1 unless $i == @$fcols-1;
          }
          push @b, 5, 3, 1;
          $self->draw_border_char(@b);
          $self->draw_str("\n");
      }
  
      join "", @{$self->{_draw}{buf}};
  }
  
  1;
  # ABSTRACT: Create nice formatted tables using extended ASCII and ANSI colors
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Text::ANSITable - Create nice formatted tables using extended ASCII and ANSI colors
  
  =head1 VERSION
  
  This document describes version 0.501 of Text::ANSITable (from Perl distribution Text-ANSITable), released on 2018-12-02.
  
  =head1 SYNOPSIS
  
   use 5.010;
   use Text::ANSITable;
  
   # don't forget this if you want to output utf8 characters
   binmode(STDOUT, ":utf8");
  
   my $t = Text::ANSITable->new;
  
   # set styles
   $t->border_style('Default::bold');  # if not, a nice default is picked
   $t->color_theme('Default::sepia');  # if not, a nice default is picked
  
   # fill data
   $t->columns(["name"       , "color" , "price"]);
   $t->add_row(["chiki"      , "yellow",    2000]);
   $t->add_row(["lays"       , "green" ,    7000]);
   $t->add_row(["tao kae noi", "blue"  ,   18500]);
  
   # draw it!
   print $t->draw;
  
  Samples of output:
  
  =head1 DESCRIPTION
  
  This module is yet another text table formatter module like L<Text::ASCIITable>
  or L<Text::SimpleTable>, with the following differences:
  
  =over
  
  =item * Colors and color themes
  
  ANSI color codes will be used by default (even 256 and 24bit colors), but will
  degrade to lower color depth and black/white according to terminal support.
  
  =item * Box-drawing characters
  
  Box-drawing characters will be used by default, but will degrade to using normal
  ASCII characters if terminal does not support them.
  
  =item * Unicode and wide character support
  
  Border styles using Unicode characters (double lines, bold/heavy lines, brick
  style, etc). Columns containing wide characters stay aligned. (Note: support for
  wide characters requires L<Text::ANSI::WideUtil> which is currently set as an
  optional prereq, so you'll need to install it explicitly or set your CPAN client
  to install 'recommends' prereq).
  
  =back
  
  Compared to Text::ASCIITable, it uses C<lower_case> method/attr names instead of
  C<CamelCase>, and it uses arrayref for C<columns> and C<add_row>. When
  specifying border styles, the order of characters are slightly different. More
  fine-grained options to customize appearance.
  
  =for Pod::Coverage ^(BUILD|draw_.+|get_color_reset|get_border_char)$
  
  =begin HTML
  
  <p><img src="http://blogs.perl.org/users/steven_haryanto/ansitable1.png" /></p>
  
  <p><img src="http://blogs.perl.org/users/steven_haryanto/ansitable2.png" /></p>
  
  <p><img src="http://blogs.perl.org/users/steven_haryanto/ansitable3.png" /></p>
  
  <p><img src="http://blogs.perl.org/users/steven_haryanto/ansitable4.png" /></p>
  
  <p><img src="http://blogs.perl.org/users/steven_haryanto/ansitable5.png" /></p>
  
  =end HTML
  
  =head1 BORDER STYLES
  
  To list available border styles:
  
   say $_ for $t->list_border_styles;
  
  Or you can also try out borders using the provided
  L<ansitable-list-border-styles> script. Or, you can also view the documentation
  for the C<Text::ANSITable::BorderStyle::*> modules, where border styles are
  searched.
  
  To choose border style, either set the C<border_style> attribute to an available
  border style or a border specification directly.
  
   $t->border_style("Default::singleh_boxchar");
   $t->border_style("Foo::bar");   # dies, no such border style
   $t->border_style({ ... }); # set specification directly
  
  If no border style is selected explicitly, a nice default will be chosen. You
  can also set the C<ANSITABLE_BORDER_STYLE> environment variable to set the
  default.
  
  To create a new border style, create a module under
  C<Text::ANSITable::BorderStyle::>. Please see one of the existing border style
  modules for example, like L<Text::ANSITable::BorderStyle::Default>. For more
  about border styles, refer to L<Border::Style::Role>.
  
  =head1 COLOR THEMES
  
  To list available color themes:
  
   say $_ for $t->list_color_themes;
  
  Or you can also run the provided L<ansitable-list-color-themes> script. Or you
  can view the documentation for the C<Text::ANSITable::ColorTheme::*> modules
  where color themes are searched.
  
  To choose a color theme, either set the C<color_theme> attribute to an available
  color theme or a color theme specification directly.
  
   $t->color_theme("Default::default_nogradation");
   $t->color_theme("Foo::bar");    # dies, no such color theme
   $t->color_theme({ ... });  # set specification directly
  
  If no color theme is selected explicitly, a nice default will be chosen. You can
  also set the C<ANSITABLE_COLOR_THEME> environment variable to set the default.
  
  To create a new color theme, create a module under
  C<Text::ANSITable::ColorTheme::>. Please see one of the existing color theme
  modules for example, like L<Text::ANSITable::ColorTheme::Default>. For more
  about color themes, refer to L<Color::Theme::Role>.
  
  =head1 COLUMN WIDTHS
  
  By default column width is set just so it is enough to show the widest data.
  This can be customized in the following ways (in order of precedence, from
  lowest):
  
  =over
  
  =item * table-level C<cell_width> attribute
  
  This sets width for all columns.
  
  =item * conditional column styles
  
  The example below sets column width to 10 for columns whose names matching
  C</[acm]time/>, else sets the column width to 20.
  
   $t->add_cond_column_style(sub {  /[acm]time/ }, width => 10);
   $t->add_cond_column_style(sub { !/[acm]time/ }, width => 20);
  
  =item * per-column C<width> style
  
   $t->set_column_style('colname', width => 20);
  
  =back
  
  You can use negative number to mean I<minimum> width.
  
  =head1 ROW HEIGHTS
  
  This can be customized in the following ways (in order of precedence, from
  lowest):
  
  =over
  
  =item * table-level C<cell_height> attribute
  
  This sets height for all rows.
  
  =item * conditional row styles
  
  The example below sets row height to 2 for every odd rows, and 1 for even rows.
  
   $t->add_cond_row_style(sub { $_ % 2 == 0 }, height => 2);
   $t->add_cond_row_style(sub { $_ % 2      }, height => 1);
  
  =item * per-row C<height> style
  
   $t->set_row_style(1, height => 2);
  
  =back
  
  You can use negative number to mean I<minimum> height.
  
  =head1 CELL (HORIZONTAL) PADDING
  
  By default cell (horizontal) padding is 1. This can be customized in the
  following ways (in order of precedence, from lowest):
  
  =over
  
  =item * table-level C<cell_pad> attribute
  
  This sets left and right padding for all columns.
  
  =item * table-level C<cell_lpad> and C<cell_rpad> attributes
  
  They set left and right padding for all columns, respectively.
  
  =item * conditional column C<pad> style
  
   $t->add_cond_column_style($cond, pad => 0);
  
  =item * conditional column C<lpad>/C<rpad> style
  
   $t->add_cond_column_style($cond, lpad => 1, rpad => 2);
  
  =item * per-column C<pad> style
  
   $t->set_column_style($colname, pad => 0);
  
  =item * per-column C<lpad>/C<rpad> style
  
   $t->set_column_style($colname, lpad => 1);
   $t->set_column_style($colname, rpad => 2);
  
  =back
  
  =head1 ROW VERTICAL PADDING
  
  Default vertical padding is 0. This can be changed in the following ways (in
  order of precedence, from lowest):
  
  =over
  
  =item * table-level C<cell_vpad> attribute
  
  This sets top and bottom padding for all rows.
  
  =item * table-level C<cell_tpad>/C<cell_bpad> attributes
  
  They set top/bottom padding separately for all rows.
  
  =item * conditional row C<vpad> style
  
  Example:
  
   $t->add_cond_row_style($cond, vpad => 1);
  
  =item * per-row C<vpad> style
  
  Example:
  
   $t->set_row_style($rownum, vpad => 1);
  
  When adding row:
  
   $t->add_row($rownum, {vpad=>1});
  
  =item * per-row C<tpad>/C<bpad> style
  
  Example:
  
   $t->set_row_style($row_num, tpad => 1);
   $t->set_row_style($row_num, bpad => 2);
  
  When adding row:
  
   $t->add_row($row, {tpad=>1, bpad=>2});
  
  =back
  
  =head1 CELL COLORS
  
  By default data format colors are used, e.g. cyan/green for text (using the
  default color scheme, items C<num_data>, C<bool_data>, etc). In absense of that,
  C<cell_fgcolor> and C<cell_bgcolor> from the color scheme are used. You can
  customize colors in the following ways (ordered by precedence, from lowest):
  
  =over
  
  =item * table-level C<cell_fgcolor> and C<cell_bgcolor> attributes
  
  Sets all cells' colors. Color should be specified using 6-hexdigit RGB which
  will be converted to the appropriate terminal color.
  
  Can also be set to a coderef which will receive ($rownum, $colname) and should
  return an RGB color.
  
  =item * conditional column C<fgcolor> and C<bgcolor> style
  
  Example:
  
   $t->add_cond_column_style($cond, fgcolor => 'fa8888', bgcolor => '202020');
  
  =item * per-column C<fgcolor> and C<bgcolor> styles
  
  Example:
  
   $t->set_column_style('colname', fgcolor => 'fa8888');
   $t->set_column_style('colname', bgcolor => '202020');
  
  =item * conditional row C<fgcolor> and C<bgcolor> style
  
  Example:
  
   $t->add_cond_row_style($cond, fgcolor => 'fa8888', bgcolor => '202020');
  
  =item * per-row C<fgcolor> and C<bgcolor> styles
  
  Example:
  
   $t->set_row_style($rownum, {fgcolor => 'fa8888', bgcolor => '202020'});
  
  When adding row/rows:
  
   $t->add_row($row, {fgcolor=>..., bgcolor=>...});
   $t->add_rows($rows, {bgcolor=>...});
  
  =item * conditional cell C<fgcolor> and C<bgcolor> style
  
   $t->add_cond_cell_style($cond, fgcolor=>..., bgcolor=>...);
  
  =item * per-cell C<fgcolor> and C<bgcolor> styles
  
  Example:
  
   $t->set_cell_style($rownum, $colname, fgcolor => 'fa8888');
   $t->set_cell_style($rownum, $colname, bgcolor => '202020');
  
  =back
  
  For flexibility, all colors can be specified as coderef. See L</"COLOR THEMES">
  for more details.
  
  =head1 CELL (HORIZONTAL AND VERTICAL) ALIGNMENT
  
  By default, numbers are right-aligned, dates and bools are centered, and the
  other data types (text including) are left-aligned. All data are top-valigned.
  This can be customized in the following ways (in order of precedence, from
  lowest):
  
  =over
  
  =item * table-level C<cell_align> and C<cell_valign> attribute
  
  =item * conditional column C<align> and <valign> styles
  
   $t->add_cond_column_style($cond, align=>..., valign=>...);
  
  =item * per-column C<align> and C<valign> styles
  
  Example:
  
   $t->set_column_style($colname, align  => 'middle'); # or left, or right
   $t->set_column_style($colname, valign => 'top');    # or bottom, or middle
  
  =item * conditional row C<align> and <valign> styles
  
   $t->add_cond_row_style($cond, align=>..., valign=>...);
  
  =item * per-row C<align> and C<valign> styles
  
  =item * conditional cell C<align> and <valign> styles
  
   $t->add_cond_cell_style($cond, align=>..., valign=>...);
  
  =item * per-cell C<align> and C<valign> styles
  
   $t->set_cell_style($rownum, $colname, align  => 'middle');
   $t->set_cell_style($rownum, $colname, valign => 'top');
  
  =back
  
  =head1 CELL FORMATS
  
  The per-column- and per-cell- C<formats> style regulates how to format data. The
  value for this style setting will be passed to L<Data::Unixish::Apply>'s
  C<apply()>, as the C<functions> argument. So it should be a single string (like
  C<date>) or an array (like C<< ['date', ['centerpad', {width=>20}]] >>).
  
  L<Data::Unixish::Apply> is an optional prerequisite, so you will need to install
  it separately if you need this feature.
  
  To see what functions are available, install L<App::dux> and then run C<dux -l>.
  Functions of interest to formatting data include: C<bool>, C<num>, C<sprintf>,
  C<sprintfn>, C<wrap>, C<ANSI::*> (in L<Data::Unixish::ANSI> distribution),
  (among others).
  
  =head1 CONDITIONAL STYLES
  
  As an alternative to setting styles for specific {column,row,cell}, you can also
  create conditional styles. You specify a Perl code for the condition, then if
  the condition evaluates to true, the corresponding styles are applied to the
  corresponding {column,row,cell}.
  
  To add a conditional style, use the C<add_cond_{column,row,cell}_style> methods.
  These methods accept condition code as its first argument and one or more styles
  in the subsequent argument(s). For example:
  
   $t->add_cond_row_style(sub { $_ % 2 }, bgcolor=>'202020');
  
  The above example will set row bgcolor for odd rows. You can add more
  conditional styles:
  
   $t->add_cond_row_style(sub { $_ % 2 == 0 }, bgcolor=>'404040');
  
  All the conditions will be evaluated and the applicable styles will be merged
  together. For example, if we add a third conditional row style:
  
   $t->add_cond_row_style(sub { $_ % 10 == 0 }, height=>2, fgcolor=>'ffff00');
  
  then every tenth row will have its height set to 2, fgcolor set to ffff00, and
  bgcolor set to 404040 (from the second conditional).
  
  Condition coderef will be called with these arguments:
  
   ($self, %args)
  
  Available keys in C<%args> for conditional column styles: C<col> (int, column
  index), C<colname> (str, column name). Additionally, C<$_> will be set locally
  to the column index.
  
  Available keys in C<%args> for conditional row styles: C<row> (int, row index),
  C<row_data> (array). Additionally, C<$_> will be set locally to the row index.
  
  Available keys in C<%args> for conditional cell styles: C<content> (str), C<col>
  (int, column index), C<row> (int, row index). Additionally, C<$_> will be set
  locally to the cell content.
  
  Coderef should return boolean indicating whether style should be applied to a
  particular column/row/cell. When returning a true value, coderef can also return
  a hashref to return additional styles that will be merged/applied too.
  
  =head1 STYLE SETS
  
  A style set is just a collection of style settings that can be applied.
  Organizing styles into style sets makes applying the styles simpler and more
  reusable.
  
  More than one style sets can be applied.
  
  Style set module accepts arguments.
  
  For example, the L<Text::ANSITable::StyleSet::AltRow> style set defines this:
  
   has odd_bgcolor  => (is => 'rw');
   has even_bgcolor => (is => 'rw');
   has odd_fgcolor  => (is => 'rw');
   has even_fgcolor => (is => 'rw');
  
   sub apply {
       my ($self, $table) = @_;
  
       $table->add_cond_row_style(sub {
           my ($t, %args) = @_;
           my %styles;
           if ($_ % 2) {
               $styles{bgcolor} = $self->odd_bgcolor
                   if defined $self->odd_bgcolor;
               $styles{fgcolor} = $self->odd_fgcolor
                   if defined $self->odd_bgcolor;
           } else {
               $styles{bgcolor} = $self->even_bgcolor
                   if defined $self->even_bgcolor;
               $styles{fgcolor} = $self->even_fgcolor
                   if defined $self->even_bgcolor;
           }
           \%styles;
       });
   }
  
  To apply this style set:
  
   $t->apply_style_set("AltRow", odd_bgcolor=>"003300", even_bgcolor=>"000000");
  
  To create a new style set, create a module under C<Text::ANSITable::StyleSet::>
  like the above example. Please see the other existing style set modules for more
  examples.
  
  =head1 ATTRIBUTES
  
  =head2 columns => ARRAY OF STR
  
  Store column names. Note that when drawing, you can omit some columns, reorder
  them, or display some more than once (see C<column_filter> attribute).
  
  Caveat: Since, for convenience, a column can be referred to using its name or
  position, weird/unecxpected thing can happen if you name a column with a number
  (e.g. 0, 1, 2, ...). So don't do that.
  
  =head2 rows => ARRAY OF ARRAY OF STR
  
  Store row data. You can set this attribute directly, or add rows incrementally
  using C<add_row()> and C<add_rows()> methods.
  
  =head2 row_filter => CODE|ARRAY OF INT
  
  When drawing, only show rows that match this. Can be an array containing indices
  of rows which should be shown, or a coderef which will be called for each row
  with arguments C<< ($row, $row_num) >> and should return a bool value indicating
  whether that row should be displayed.
  
  Internal note: During drawing, rows will be filtered and put into C<<
  $t->{_draw}{frows} >>.
  
  =head2 column_filter => CODE|ARRAY OF STR
  
  When drawing, only show columns that match this. Can be an array containing
  names of columns that should be displayed (column names can be in different
  order or duplicate, column can also be referred to with its numeric index). Can
  also be a coderef which will be called with C<< ($col_name, $col_num) >> for
  every column and should return a bool value indicating whether that column
  should be displayed. The coderef version is more limited in that it cannot
  reorder the columns or instruct for the same column to be displayed more than
  once.
  
  Internal note: During drawing, column names will be filtered and put into C<<
  $t->{_draw}{fcols} >>.
  
  =head2 column_wrap => BOOL
  
  Set column wrapping for all columns. Can be overriden by per-column C<wrap>
  style. By default column wrapping will only be done for text columns and when
  width is explicitly set to a positive value.
  
  =head2 use_color => BOOL
  
  Whether to output color. Default is taken from C<NO_COLOR> environment variable,
  C<COLOR> environment variable, or detected via C<(-t STDOUT)>. If C<use_color>
  is set to 0, an attempt to use a colored color theme (i.e. anything that is not
  the C<no_color> theme) will result in an exception.
  
  (In the future, setting C<use_color> to 0 might opt the module to use
  normal/plain string routines instead of the slower ta_* functions from
  L<Text::ANSI::Util>; this also means that the module won't handle ANSI escape
  codes in the content text.)
  
  =head2 color_depth => INT
  
  Terminal's color depth. Either 16, 256, or 2**24 (16777216). Default will be
  retrieved from C<COLOR_DEPTH> environment or detected using L<Term::Detect>.
  
  =head2 use_box_chars => BOOL
  
  Whether to use box drawing characters. Drawing box drawing characters can be
  problematic in some places because it uses ANSI escape codes to switch to (and
  back from) line drawing mode (C<"\e(0"> and C<"\e(B">, respectively).
  
  Default is taken from C<BOX_CHARS> environment variable, or 1. If
  C<use_box_chars> is set to 0, an attempt to use a border style that uses box
  drawing chararacters will result in an exception.
  
  =head2 use_utf8 => BOOL
  
  Whether to use Unicode (UTF8) characters. Default is taken from C<UTF8>
  environment variable, or detected using L<Term::Detect>, or guessed via L<LANG>
  environment variable. If C<use_utf8> is set to 0, an attempt to select a border
  style that uses Unicode characters will result in an exception.
  
  (In the future, setting C<use_utf8> to 0 might opt the module to use the
  non-"mb_*" version of functions from L<Text::ANSI::Util>, e.g. C<ta_wrap()>
  instead of C<ta_mbwrap()>, and so on).
  
  =head2 wide => BOOL
  
  Whether to support wide characters. The default is to check for the existence of
  L<Text::ANSI::WideUtil> (an optional prereq). You can explicitly enable or
  disable wide-character support here.
  
  =head2 border_style => HASH
  
  Border style specification to use.
  
  You can set this attribute's value with a specification or border style name.
  See L<"/BORDER STYLES"> for more details.
  
  =head2 border_style_args => HASH
  
  Some border styles can accept arguments. You can set it here. See the
  corresponding border style's documentation for information on what arguments it
  accepts.
  
  =head2 color_theme => HASH
  
  Color theme specification to use.
  
  You can set this attribute's value with a specification or color theme name. See
  L<"/COLOR THEMES"> for more details.
  
  =head2 color_theme_args => HASH
  
  Some color themes can accept arguments. You can set it here. See the
  corresponding color theme's documentation for information on what arguments it
  accepts.
  
  =head2 show_header => BOOL (default: 1)
  
  When drawing, whether to show header.
  
  =head2 show_row_separator => INT (default: 2)
  
  When drawing, whether to show separator lines between rows. The default (2) is
  to only show separators drawn using C<add_row_separator()>. If you set this to
  1, lines will be drawn after every data row. If you set this attribute to 0, no
  lines will be drawn whatsoever.
  
  =head2 cell_width => INT
  
  Set width for all cells. Can be overriden by per-column C<width> style.
  
  =head2 cell_height => INT
  
  Set height for all cell. Can be overriden by per-row C<height> style.
  
  =head2 cell_align => STR
  
  Set (horizontal) alignment for all cells. Either C<left>, C<middle>, or
  C<right>. Can be overriden by per-column/per-row/per-cell C<align> style.
  
  =head2 cell_valign => STR
  
  Set (horizontal) alignment for all cells. Either C<top>, C<middle>, or
  C<bottom>. Can be overriden by per-column/per-row/per-cell C<align> style.
  
  =head2 cell_pad => INT
  
  Set (horizontal) padding for all cells. Can be overriden by per-column C<pad>
  style.
  
  =head2 cell_lpad => INT
  
  Set left padding for all cells. Overrides the C<cell_pad> attribute. Can be
  overriden by per-column C<lpad> style.
  
  =head2 cell_rpad => INT
  
  Set right padding for all cells. Overrides the C<cell_pad> attribute. Can be
  overriden by per-column C<rpad> style.
  
  =head2 cell_vpad => INT
  
  Set vertical padding for all cells. Can be overriden by per-row C<vpad> style.
  
  =head2 cell_tpad => INT
  
  Set top padding for all cells. Overrides the C<cell_vpad> attribute. Can be
  overriden by per-row C<tpad> style.
  
  =head2 cell_bpad => INT
  
  Set bottom padding for all cells. Overrides the C<cell_vpad> attribute. Can be
  overriden by per-row C<bpad> style.
  
  =head2 cell_fgcolor => RGB|CODE
  
  Set foreground color for all cells. Value should be 6-hexdigit RGB. Can also be
  a coderef that will receive %args (e.g. row_num, col_name, col_num) and should
  return an RGB color. Can be overriden by per-cell C<fgcolor> style.
  
  =head2 cell_bgcolor => RGB|CODE
  
  Like C<cell_fgcolor> but for background color.
  
  =head2 header_fgcolor => RGB|CODE
  
  Set foreground color for all headers. Overrides C<cell_fgcolor> for headers.
  Value should be a 6-hexdigit RGB. Can also be a coderef that will receive %args
  (e.g. col_name, col_num) and should return an RGB color.
  
  =head2 header_bgcolor => RGB|CODE
  
  Like C<header_fgcolor> but for background color.
  
  =head2 header_align => STR
  
  =head2 header_valign => STR
  
  =head2 header_vpad => INT
  
  =head2 header_tpad => INT
  
  =head2 header_bpad => INT
  
  =head1 METHODS
  
  =head2 $t = Text::ANSITable->new(%attrs) => OBJ
  
  Constructor.
  
  =head2 $t->list_border_styles => LIST
  
  Return the names of available border styles. Border styles will be searched in
  C<Text::ANSITable::BorderStyle::*> modules.
  
  =head2 $t->list_color_themes => LIST
  
  Return the names of available color themes. Color themes will be searched in
  C<Text::ANSITable::ColorTheme::*> modules.
  
  =head2 $t->list_style_sets => LIST
  
  Return the names of available style sets. Style set names are retrieved by
  listing modules under C<Text::ANSITable::StyleSet::*> namespace.
  
  =head2 $t->get_border_style($name) => HASH
  
  Can also be called as a static method: C<<
  Text::ANSITable->get_border_style($name) >>.
  
  =head2 $t->get_color_theme($name) => HASH
  
  Can also be called as a static method: C<<
  Text::ANSITable->get_color_theme($name) >>.
  
  =head2 $t->add_row(\@row[, \%styles]) => OBJ
  
  Add a row. Note that row data is not copied, only referenced.
  
  Can also add per-row styles (which can also be done using C<row_style()>).
  
  =head2 $t->add_rows(\@rows[, \%styles]) => OBJ
  
  Add multiple rows. Note that row data is not copied, only referenced.
  
  Can also add per-row styles (which can also be done using C<row_style()>).
  
  =head2 $t->add_row_separator() => OBJ
  
  Add a row separator line.
  
  =head2 $t->get_cell($row_num, $col) => VAL
  
  Get cell value at row #C<$row_num> (starts from zero) and column named/numbered
  C<$col>.
  
  =head2 $t->set_cell($row_num, $col, $newval) => VAL
  
  Set cell value at row #C<$row_num> (starts from zero) and column named/numbered
  C<$col>. Return old value.
  
  =head2 $t->get_column_style($col, $style) => VAL
  
  Get per-column style for column named/numbered C<$col>.
  
  =head2 $t->set_column_style($col, $style=>$val[, $style2=>$val2, ...])
  
  Set per-column style(s) for column named/numbered C<$col>. Available values for
  C<$style>: C<align>, C<valign>, C<pad>, C<lpad>, C<rpad>, C<width>, C<formats>,
  C<fgcolor>, C<bgcolor>, C<type>, C<wrap>.
  
  =head2 $t->get_cond_column_styles => ARRAY
  
  Get all the conditional column styles set so far.
  
  =head2 $t->add_cond_column_style($cond, $style=>$val[, $style2=>$val2 ...])
  
  Add a new conditional column style. See L</"CONDITIONAL STYLES"> for more
  details on conditional style.
  
  =for comment | =head2 $t->clear_cond_column_styles | Clear all the conditional column styles.
  
  =head2 $t->get_eff_column_style($col, $style) => VAL
  
  Get "effective" column style named C<$style> for a particular column. Effective
  column style is calculated from all the conditional column styles and the
  per-column styles then merged together. This is the per-column style actually
  applied.
  
  =head2 $t->get_row_style($row_num) => VAL
  
  Get per-row style for row numbered C<$row_num>.
  
  =head2 $t->set_row_style($row_num, $style=>$newval[, $style2=>$newval2, ...])
  
  Set per-row style(s) for row numbered C<$row_num>. Available values for
  C<$style>: C<align>, C<valign>, C<height>, C<vpad>, C<tpad>, C<bpad>,
  C<fgcolor>, C<bgcolor>.
  
  =head2 $t->get_cond_row_styles => ARRAY
  
  Get all the conditional row styles set so far.
  
  =head2 $t->add_cond_row_style($cond, $style=>$val[, $style2=>$val2 ...])
  
  Add a new conditional row style. See L</"CONDITIONAL STYLES"> for more details
  on conditional style.
  
  =for comment | =head2 $t->clear_cond_row_styles | Clear all the conditional row styles.
  
  =head2 $t->get_eff_row_style($row_num, $style) => VAL
  
  Get "effective" row style named C<$style> for a particular row. Effective row
  style is calculated from all the conditional row styles and the per-row styles
  then merged together. This is the per-row style actually applied.
  
  =head2 $t->get_cell_style($row_num, $col, $style) => VAL
  
  Get per-cell style named C<$style> for a particular cell. Return undef if there
  is no per-cell style with that name.
  
  =head2 $t->set_cell_style($row_num, $col, $style=>$newval[, $style2=>$newval2, ...])
  
  Set per-cell style(s). Available values for C<$style>: C<align>, C<valign>,
  C<formats>, C<fgcolor>, C<bgcolor>.
  
  =head2 $t->get_cond_cell_styles => ARRAY
  
  Get all the conditional cell styles set so far.
  
  =head2 $t->add_cond_cell_style($cond, $style=>$val[, $style2=>$val2 ...])
  
  Add a new conditional cell style. See L</"CONDITIONAL STYLES"> for more details
  on conditional style.
  
  =for comment | =head2 $t->clear_cond_cell_styles | Clear all the conditional cell styles.
  
  =head2 $t->get_eff_cell_style($row_num, $col, $style) => VAL
  
  Get "effective" cell style named C<$style> for a particular cell. Effective cell
  style is calculated from all the conditional cell styles and the per-cell styles
  then merged together. This is the per-cell style actually applied.
  
  =head2 $t->apply_style_set($name, %args)
  
  Apply a style set. See L</"STYLE SETS"> for more details.
  
  =head2 $t->draw => STR
  
  Render table.
  
  =head1 FAQ
  
  =head2 General
  
  =head3 Output is too fancy! I just want to generate some plain (Text::ASCIITable-like) output to be copy-pasted to my document.
  
   $t->use_utf8(0);
   $t->use_box_chars(0);
   $t->use_color(0);
   $t->border_style('Default::single_ascii');
  
  and you're good to go. Alternatively you can set environment UTF8=0,
  BOX_CHARS=0, COLOR=0, and ANSITABLE_BORDER_STYLE=Default::single_ascii.
  
  =head3 Why am I getting 'Wide character in print' warning?
  
  You are probably using a utf8 border style, and you haven't done something like
  this to your output:
  
   binmode(STDOUT, ":utf8");
  
  =head3 My table looks garbled when viewed through pager like B<less>!
  
  That's because B<less> by default escapes ANSI color and box_char codes. Try
  using C<-R> option of B<less> to display ANSI color codes raw.
  
  Or, try not using colors and box_char border styles:
  
   $t->use_color(0);
   $t->use_box_chars(0);
  
  Note that as of this writing, B<less -R> does not interpret box_char codes so
  you'll need to avoid using box_char border styles if you want your output to
  display properly under B<less>.
  
  =head3 How do I hide some columns/rows when drawing?
  
  Use the C<column_filter> and C<row_filter> attributes. For example, given this
  table:
  
   my $t = Text::ANSITable->new;
   $t->columns([qw/one two three/]);
   $t->add_row([$_, $_, $_]) for 1..10;
  
  Doing this:
  
   $t->row_filter([0, 1, 4]);
   print $t->draw;
  
  will show:
  
    one | two | three
   -----+-----+-------
      1 |   1 |     1
      2 |   2 |     2
      5 |   5 |     5
  
  Doing this:
  
   $t->row_filter(sub { my ($row, $idx) = @_; $row->[0] % 2 }
  
  will display:
  
    one | two | three
   -----+-----+-------
      1 |   1 |     1
      3 |   3 |     3
      5 |   5 |     5
      7 |   7 |     7
      9 |   9 |     9
  
  Doing this:
  
   $t->column_filter([qw/two one 0/]);
  
  will display:
  
    two | one | one
   -----+-----+-----
      1 |   1 |   1
      2 |   2 |   2
      3 |   3 |   3
      4 |   4 |   4
      5 |   5 |   5
      6 |   6 |   6
      7 |   7 |   7
      8 |   8 |   8
      9 |   9 |   9
     10 |  10 |  10
  
  Doing this:
  
   $t->column_filter(sub { my ($colname, $idx) = @_; $colname =~ /t/ });
  
  will display:
  
    two | three
   -----+-------
      1 |     1
      2 |     2
      3 |     3
      4 |     4
      5 |     5
      6 |     6
      7 |     7
      8 |     8
      9 |     9
     10 |    10
  
  =head2 Formatting data
  
  =head3 How do I format data?
  
  Use the C<formats> per-column style or per-cell style. For example:
  
   $t->set_column_style('available', formats => [[bool=>{style=>'check_cross'}],
                                                 [centerpad=>{width=>10}]]);
   $t->set_column_style('amount'   , formats => [[num=>{decimal_digits=>2}]]);
   $t->set_column_style('size'     , formats => [[num=>{style=>'kilo'}]]);
  
  See L<Data::Unixish::Apply> and L<Data::Unixish> for more details on the
  available formatting functions.
  
  =head3 How does the module determine column data type?
  
  Currently: if column name has the word C<date> or C<time> in it, the column is
  assumed to contain B<date> data. If column name has C<?> in it, the column is
  assumed to be B<bool>. If a column contains only numbers (or undefs), it is
  B<num>. Otherwise, it is B<str>.
  
  =head3 How does the module format data types?
  
  Currently: B<num> will be right aligned and applied C<num_data> color (cyan in
  the default theme). B<date> will be centered and applied C<date_data> color
  (gold in the default theme). B<bool> will be centered and formatted as
  check/cross symbol and applied C<bool_data> color (red/green depending on
  whether the data is false/true). B<str> will be applied C<str_data> color (no
  color in the default theme).
  
  Other color themes might use different colors.
  
  =head3 How do I force column to be of a certain data type?
  
  For example, you have a column named C<deleted> but want to display it as
  B<bool>. You can do:
  
   $t->set_column_style(deleted => type => 'bool');
  
  =head3 How do I wrap long text?
  
  The C<wrap> dux function can be used to wrap text (see: L<Data::Unixish::wrap>).
  You'll want to set C<ansi> and C<mb> both to 1 to handle ANSI escape codes and
  wide characters in your text (unless you are sure that your text does not
  contain those):
  
   $t->set_column_style('description', formats=>[[wrap => {width=>60, ansi=>1, mb=>1}]]);
  
  =head3 How do I highlight text with color?
  
  The C<ansi::highlight> dux function can be used to highlight text (see:
  L<Data::Unixish::ANSI::highlight>).
  
   $t->set_column_style(2, formats => [[highlight => {pattern=>$pat}]]);
  
  =head3 I want to change the default bool cross/check sign representation!
  
  By default, bool columns are shown as cross/check sign. This can be changed,
  e.g.:
  
   $t->set_column_style($colname, type    => 'bool',
                                  formats => [[bool => {style=>"Y_N"}]]);
  
  See L<Data::Unixish::bool> for more details.
  
  =head3 How do I do conditional cell formatting?
  
  There are several ways.
  
  First, you can use the C<cond> dux function through C<formats> style. For
  example, if the cell contains the string "Cuti", you want to color the cell
  yellow. Otherwise, you want to color the cell red:
  
   $t->set_column_style($colname, formats => [
       [cond => {
           if   => sub { $_ =~ /Cuti/ },
           then => ["ansi::color", {color=>"yellow"}],
           else => ["ansi::color", {color=>"red"}],
       }]
   ]);
  
  Another way is to use the C<add_cond_{cell,row,column}> methods. See
  L</"CONDITIONAL STYLES"> for more details. An example:
  
   $t->add_cond_row_style(sub {
       my %args = @_;
       $args{colname} =~ /Cuti/ ? {bgcolor=>"ffff00"} : {bgcolor=>"ff0000"};
   });
  
  And another way is to use (or create) style set, which is basically a packaging
  of the above ways. An advantage of using style set is, because you do not
  specify coderef directly, you can specify it from the environment variable. See
  L</"STYLE SETS"> for more details.
  
  =head2 Border
  
  =head3 How to hide borders?
  
  There is currently no C<show_border> attribute. Choose border styles like
  C<Default::space_ascii> or C<Default::none_utf8>:
  
   $t->border_style("Default::none");
  
  =head3 Why are there 'none_ascii' as well 'none_utf8' and 'none_boxchar' border styles?
  
  Because of the row separator, that can still be drawn if C<add_row_separator()>
  is used. See next question.
  
  =head3 I want to hide borders, and I do not want row separators to be shown!
  
  The default is for separator lines to be drawn if drawn using
  C<add_row_separator()>, e.g.:
  
   $t->add_row(['row1']);
   $t->add_row(['row2']);
   $t->add_row_separator;
   $t->add_row(['row3']);
  
  The result will be:
  
     row1
     row2
   --------
     row3
  
  However, if you set C<show_row_separator> to 0, no separator lines will be drawn
  whatsoever:
  
     row1
     row2
     row3
  
  =head3 I want to separate each row with a line!
  
  Set C<show_row_separator> to 1, or alternatively, set
  C<ANSITABLE_STYLE='{"show_row_separator":1}>.
  
  =head2 Color
  
  =head3 How to disable colors?
  
  Set C<use_color> attribute or C<COLOR> environment to 0.
  
  =head3 How to specify colors using names (e.g. red, 'navy blue') instead of RGB?
  
  Use modules like L<Graphics::ColorNames>.
  
  =head3 I'm not seeing colors when output is piped (e.g. to a pager)!
  
  The default is to disable colors when (-t STDOUT) is false. You can force-enable
  colors by setting C<use_color> attribute or C<COLOR> environment to 1.
  
  =head3 How to enable 256 colors? I'm seeing only 16 colors.
  
  Use terminal emulators that support 256 colors, e.g. Konsole, xterm,
  gnome-terminal, PuTTY/pterm (but the last one has minimal Unicode support).
  Better yet, use Konsole or Konsole-based emulators which supports 24bit colors.
  
  =head3 How to enable 24bit colors (true color)?
  
  Currently only B<Konsole> and the Konsole-based B<Yakuake> terminal emulator
  software support 24bit colors.
  
  =head3 How to force lower color depth? (e.g. I use Konsole but want 16 colors)
  
  Set C<COLOR_DEPTH> to 16.
  
  =head3 How to change border gradation color?
  
  The default color theme applies vertical color gradation to borders from white
  (ffffff) to gray (444444). To change this, set C<border1> and C<border2> theme
  arguments:
  
   $t->color_theme_args({border1=>'ff0000', border2=>'00ff00'}); # red to green
  
  =head3 I'm using terminal emulator with white background, the texts are not very visible!
  
  Try using the "*_whitebg" themes, as the other themes are geared towards
  terminal emulators with black background.
  
  =head3 How to set different background colors for odd/even rows?
  
  Aside from doing C<< $t->set_row_style($row_num, bgcolor=>...) >> for each row,
  you can also do this:
  
   $t->cell_bgcolor(sub { my ($self, %args) = @_; $args{row_num} % 2 ? '202020' : undef });
  
  Or, you can use conditional row styles:
  
   $t->add_cond_row_style(sub { $_ % 2 }, {bgcolor=>'202020'});
  
  Or, you can use the L<Text::ANSITable::StyleSet::AltRow> style set:
  
   $t->apply_style_set(AltRow => {even_bgcolor=>'202020'});
  
  =head1 ENVIRONMENT
  
  =head2 COLOR => BOOL
  
  Can be used to set default value for the C<color> attribute.
  
  =head2 COLOR_DEPTH => INT
  
  Can be used to set default value for the C<color_depth> attribute.
  
  =head2 BOX_CHARS => BOOL
  
  Can be used to set default value for the C<box_chars> attribute.
  
  =head2 UTF8 => BOOL
  
  Can be used to set default value for the C<utf8> attribute.
  
  =head2 COLUMNS => INT
  
  Can be used to override terminal width detection.
  
  =head2 ANSITABLE_BORDER_STYLE => STR
  
  Can be used to set default value for C<border_style> attribute.
  
  =head2 ANSITABLE_COLOR_THEME => STR
  
  Can be used to set default value for C<border_style> attribute.
  
  =head2 ANSITABLE_STYLE => str(json)
  
  Can be used to set table's most attributes. Value should be a JSON-encoded hash
  of C<< attr => val >> pairs. Example:
  
   % ANSITABLE_STYLE='{"show_row_separator":1}' ansitable-list-border-styles
  
  will display table with row separator lines after every row.
  
  =head2 WRAP => BOOL
  
  Can be used to set default value for the C<wrap> column style.
  
  =head2 ANSITABLE_COLUMN_STYLES => str(json)
  
  Can be used to set per-column styles. Interpreted right before draw(). Value
  should be a JSON-encoded hash of C<< col => {style => val, ...} >> pairs.
  Example:
  
   % ANSITABLE_COLUMN_STYLES='{"2":{"type":"num"},"3":{"type":"str"}}' ansitable-list-border-styles
  
  will display the bool columns as num and str instead.
  
  =head2 ANSITABLE_ROW_STYLES => str(json)
  
  Can be used to set per-row styles. Interpreted right before draw(). Value should
  be a JSON-encoded a hash of C<< row_num => {style => val, ...} >> pairs.
  Example:
  
   % ANSITABLE_ROW_STYLES='{"0":{"bgcolor":"000080","vpad":1}}' ansitable-list-border-styles
  
  will display the first row with blue background color and taller height.
  
  =head2 ANSITABLE_CELL_STYLES => str(json)
  
  Can be used to set per-cell styles. Interpreted right before draw(). Value
  should be a JSON-encoded a hash of C<< "row_num,col" => {style => val, ...} >>
  pairs. Example:
  
   % ANSITABLE_CELL_STYLES='{"1,1":{"bgcolor":"008000"}}' ansitable-list-border-styles
  
  will display the second-on-the-left, second-on-the-top cell with green
  background color.
  
  =head2 ANSITABLE_STYLE_SETS => str(json)
  
  Can be used to apply style sets. Value should be a JSON-encoded array. Each
  element must be a style set name or a 2-element array containing style set name
  and its arguments (C<< [$name, \%args] >>). Example:
  
   % ANSITABLE_STYLE_SETS='[["AltRow",{"odd_bgcolor":"003300"}]]'
  
  will display table with row separator lines after every row.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Text-ANSITable>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Text-ANSITable>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Text-ANSITable>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  =head2 Related to Text::ANSITable family
  
  For collections of border styles, search for C<Text::ANSITable::BorderStyle::*>
  modules.
  
  For collections of color themes, search for C<Text::ANSITable::ColorTheme::*>
  modules.
  
  =head2 Other table-formatting CPAN modules
  
  L<Text::ASCIITable> is one of the most popular table-formatting module. There
  are a couple of "extensions" for Text::ASCIITable: L<Text::ASCIITable::TW>,
  L<Text::ASCIITable::Wrap>; Text::ANSITable can be an alternative for all those
  modules since it can already handle wide-characters, multiline text in cells.
  
  L<Text::TabularDisplay>
  
  L<Text::Table>
  
  L<Text::SimpleTable>
  
  L<Text::UnicodeTable::Simple>
  
  L<Table::Simple>
  
  =head2 Other
  
  Unix command B<column> (e.g. C<column -t>).
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2018, 2017, 2016, 2015, 2014, 2013 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
TEXT_ANSITABLE

    $main::fatpacked{"Text/ANSITable/BorderStyle/Default.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'TEXT_ANSITABLE_BORDERSTYLE_DEFAULT';
  package Text::ANSITable::BorderStyle::Default;
  
  our $DATE = '2018-12-02'; # DATE
  our $VERSION = '0.501'; # VERSION
  
  use 5.010;
  use strict;
  use utf8;
  use warnings;
  
  our %border_styles = (
  
      # none
  
      none_ascii => {
          summary => 'No border',
          chars => [
              ['','','',''],     # 0
              ['','',''],        # 1
              ['','','',''],     # 2
              ['','',''],        # 3
              [' ','-','-',' '], # 4
              ['','','',''],     # 5
          ],
      },
  
      none_boxchar => {
          summary => 'No border',
          chars => [
              ['','','',''],     # 0
              ['','',''],        # 1
              ['','','',''],     # 2
              ['','',''],        # 3
              ['','q','q',''],   # 4
              ['','','',''],     # 5
          ],
          box_chars => 1,
      },
  
      none_utf8 => {
          summary => 'No border',
          chars => [
              ['','','',''],     # 0
              ['','',''],        # 1
              ['','','',''],     # 2
              ['','',''],        # 3
              ['','─','─',''],   # 4
              ['','','',''],     # 5
          ],
          utf8 => 1,
      },
  
  
      # space
  
      space_ascii => {
          summary => 'Space as border',
          chars => [
              [' ',' ',' ',' '], # 0
              [' ',' ',' '],     # 1
              [' ',' ',' ',' '], # 2
              [' ',' ',' '],     # 3
              [' ','-','-',' '], # 4
              [' ',' ',' ',' '], # 5
          ],
      },
  
      space_boxchar => {
          summary => 'Space as border',
          chars => [
              [' ',' ',' ',' '], # 0
              [' ',' ',' '],     # 1
              [' ',' ',' ',' '], # 2
              [' ',' ',' '],     # 3
              [' ','q','q',' '], # 4
              [' ',' ',' ',' '], # 5
          ],
          box_chars => 1,
      },
  
      space_utf8 => {
          summary => 'Space as border',
          chars => [
              [' ',' ',' ',' '], # 0
              [' ',' ',' '],     # 1
              [' ',' ',' ',' '], # 2
              [' ',' ',' '],     # 3
              [' ','─','─',' '], # 4
              [' ',' ',' ',' '], # 5
          ],
          utf8 => 1,
      },
  
      spacei_ascii => {
          summary => 'Space, inner-only',
          chars => [
              ['','','',''],   # 0
              ['',' ',''],     # 1
              ['',' ',' ',''], # 2
              ['',' ',''],     # 3
              ['','-','-',''], # 4
              ['','','',''],   # 5
          ],
      },
  
      spacei_boxchar => {
          summary => 'Space, inner-only',
          chars => [
              ['','','',''],   # 0
              ['',' ',''],     # 1
              ['',' ',' ',''], # 2
              ['',' ',''],     # 3
              ['','q','q',''], # 4
              ['','','',''],   # 5
          ],
          box_chars => 1,
      },
  
      spacei_utf8 => {
          summary => 'Space, inner-only',
          chars => [
              ['','','',''],   # 0
              ['',' ',''],     # 1
              ['',' ',' ',''], # 2
              ['',' ',''],     # 3
              ['','─','─',''], # 4
              ['','','',''],   # 5
          ],
          utf8 => 1,
      },
  
      # single
  
      single_ascii => {
          summary => 'Single',
          chars => [
              ['.','-','+','.'], # 0
              ['|','|','|'],     # 1
              ['+','-','+','+'], # 2
              ['|','|','|'],     # 3
              ['+','-','+','+'], # 4
              ['`','-','+',"'"], # 5
          ],
      },
  
      single_boxchar => {
          summary => 'Single',
          chars => [
              ['l','q','w','k'], # 0
              ['x','x','x'],     # 1
              ['t','q','n','u'], # 2
              ['x','x','x'],     # 3
              ['t','q','n','u'], # 4
              ['m','q','v','j'], # 5
          ],
          box_chars => 1,
      },
  
      single_utf8 => {
          summary => 'Single',
          chars => [
              ['┌','─','┬','┐'], # 0
              ['│','│','│'],     # 1
              ['├','─','┼','┤'], # 2
              ['│','│','│'],     # 3
              ['├','─','┼','┤'], # 4
              ['└','─','┴','┘'], # 5
          ],
          utf8 => 1,
      },
  
  
      # single, horizontal only
  
      singleh_ascii => {
          summary => 'Single, horizontal only',
          chars => [
              ['-','-','-','-'], # 0
              [' ',' ',' '],     # 1
              ['-','-','-','-'], # 2
              [' ',' ',' '],     # 3
              ['-','-','-','-'], # 4
              ['-','-','-','-'], # 5
          ],
      },
  
      singleh_boxchar => {
          summary => 'Single, horizontal only',
          chars => [
              ['q','q','q','q'], # 0
              [' ',' ',' '],     # 1
              ['q','q','q','q'], # 2
              [' ',' ',' '],     # 3
              ['q','q','q','q'], # 4
              ['q','q','q','q'], # 5
          ],
          box_chars => 1,
      },
  
      singleh_utf8 => {
          summary => 'Single, horizontal only',
          chars => [
              ['─','─','─','─'], # 0
              [' ',' ',' '],     # 1
              ['─','─','─','─'], # 2
              [' ',' ',' '],     # 3
              ['─','─','─','─'], # 4
              ['─','─','─','─'], # 5
          ],
          utf8 => 1,
      },
  
  
      # single, vertical only
  
      singlev_ascii => {
          summary => 'Single border, only vertical',
          chars => [
              ['|',' ','|','|'], # 0
              ['|','|','|'],     # 1
              ['|',' ','|','|'], # 2
              ['|','|','|'],     # 3
              ['|','-','|','|'], # 4
              ['|',' ','|','|'], # 5
          ],
      },
  
      singlev_boxchar => {
          summary => 'Single, vertical only',
          chars => [
              ['x',' ','x','x'], # 0
              ['x','x','x'],     # 1
              ['x',' ','x','x'], # 2
              ['x','x','x'],     # 3
              ['x','q','x','x'], # 4
              ['x',' ','x','x'], # 5
          ],
          box_chars => 1,
      },
  
      singlev_utf8 => {
          summary => 'Single, vertical only',
          chars => [
              ['│',' ','│','│'], # 0
              ['│','│','│'],     # 1
              ['│',' ','│','│'], # 2
              ['│','│','│'],     # 3
              ['│','─','│','│'], # 4
              ['│',' ','│','│'], # 5
          ],
          utf8 => 1,
      },
  
  
      # single, inner only
  
      singlei_ascii => {
          summary => 'Single, inner only (like in psql command-line client)',
          chars => [
              ['','','',''],     # 0
              [' ','|',' '],     # 1
              [' ','-','+',' '], # 2
              [' ','|',' '],     # 3
              [' ','-','+',' '], # 4
              ['','','',''],     # 5
          ],
      },
  
      singlei_boxchar => {
          summary => 'Single, inner only (like in psql command-line client)',
          chars => [
              ['','','',''],     # 0
              [' ','x',' '],     # 1
              [' ','q','n',' '], # 2
              [' ','x',' '],     # 3
              [' ','q','n',' '], # 4
              ['','','',''],     # 5
          ],
          box_chars => 1,
      },
  
      singlei_utf8 => {
          summary => 'Single, inner only (like in psql command-line client)',
          chars => [
              ['','','',''],     # 0
              [' ','│',' '],     # 1
              [' ','─','┼',' '], # 2
              [' ','│',' '],     # 3
              [' ','─','┼',' '], # 4
              ['','','',''],     # 5
          ],
          utf8 => 1,
      },
  
  
      # single, outer only
  
      singleo_ascii => {
          summary => 'Single, outer only',
          chars => [
              ['.','-','-','.'], # 0
              ['|',' ','|'],     # 1
              ['|',' ',' ','|'], # 2
              ['|',' ','|'],     # 3
              ['+','-','-','+'], # 4
              ['`','-','-',"'"], # 5
          ],
      },
  
      singleo_boxchar => {
          summary => 'Single, outer only',
          chars => [
              ['l','q','q','k'], # 0
              ['x',' ','x'],     # 1
              ['x',' ',' ','x'], # 2
              ['x',' ','x'],     # 3
              ['t','q','q','u'], # 4
              ['m','q','q','j'], # 5
          ],
          box_chars => 1,
      },
  
      singleo_utf8 => {
          summary => 'Single, outer only',
          chars => [
              ['┌','─','─','┐'], # 0
              ['│',' ','│'],     # 1
              ['│',' ',' ','│'], # 2
              ['│',' ','│'],     # 3
              ['├','─','─','┤'], # 4
              ['└','─','─','┘'], # 5
          ],
          utf8 => 1,
      },
  
  
      # curved single
  
      csingle => {
          summary => 'Curved single',
          chars => [
              ['╭','─','┬','╮'], # 0
              ['│','│','│'],     # 1
              ['├','─','┼','┤'], # 2
              ['│','│','│'],     # 3
              ['├','─','┼','┤'], # 4
              ['╰','─','┴','╯'], # 5
          ],
          utf8 => 1,
      },
  
  
      # bold single
  
      bold => {
          summary => 'Bold',
          chars => [
              ['┏','━','┳','┓'], # 0
              ['┃','┃','┃'],     # 1
              ['┣','━','╋','┫'], # 2
              ['┃','┃','┃'],     # 3
              ['┣','━','╋','┫'], # 4
              ['┗','━','┻','┛'], # 5
          ],
          utf8 => 1,
      },
  
  
      #boldv => {
      #    summary => 'Vertically-bold',
      #},
  
  
      #boldh => {
      #    summary => 'Horizontally-bold',
      #},
  
  
      # double
  
      double => {
          summary => 'Double',
          chars => [
              ['╔','═','╦','╗'], # 0
              ['║','║','║'],     # 1
              ['╠','═','╬','╣'], # 2
              ['║','║','║'],     # 3
              ['╠','═','╬','╣'], # 4
              ['╚','═','╩','╝'], # 5
          ],
          utf8 => 1,
      },
  
  
      # brick
  
      brick => {
          summary => 'Single, bold on bottom right to give illusion of depth',
          chars => [
              ['┌','─','┬','┒'], # 0
              ['│','│','┃'],     # 1
              ['├','─','┼','┨'], # 2
              ['│','│','┃'],     # 3
              ['├','─','┼','┨'], # 4
              ['┕','━','┷','┛'], # 5
          ],
          utf8 => 1,
      },
  
      bricko => {
          summary => 'Single, outer only, '.
              'bold on bottom right to give illusion of depth',
          chars => [
              ['┌','─','─','┒'], # 0
              ['│',' ','┃'],     # 1
              ['│',' ',' ','┃'], # 2
              ['│',' ','┃'],     # 3
              ['├','─','─','┨'], # 4
              ['┕','━','━','┛'], # 5
          ],
          utf8 => 1,
      },
  
  );
  
  1;
  # ABSTRACT: Default border styles
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Text::ANSITable::BorderStyle::Default - Default border styles
  
  =head1 VERSION
  
  This document describes version 0.501 of Text::ANSITable::BorderStyle::Default (from Perl distribution Text-ANSITable), released on 2018-12-02.
  
  =head1 BORDER STYLES
  
  Below are the border styles included in this package:
  
  =head2 Default::bold
  
  Bold (utf8: yes, box_chars: no).
  
   ┏━━━━━━━━━┳━━━━━━━━━┓
   ┃ column1 ┃ column2 ┃
   ┣━━━━━━━━━╋━━━━━━━━━┫
   ┃ row1.1  ┃ row1.2  ┃
   ┃ row2.1  ┃ row3.2  ┃
   ┣━━━━━━━━━╋━━━━━━━━━┫
   ┃ row3.1  ┃ row3.2  ┃
   ┗━━━━━━━━━┻━━━━━━━━━┛
  
  
  =head2 Default::brick
  
  Single, bold on bottom right to give illusion of depth (utf8: yes, box_chars: no).
  
   ┌─────────┬─────────┒
   │ column1 │ column2 ┃
   ├─────────┼─────────┨
   │ row1.1  │ row1.2  ┃
   │ row2.1  │ row3.2  ┃
   ├─────────┼─────────┨
   │ row3.1  │ row3.2  ┃
   ┕━━━━━━━━━┷━━━━━━━━━┛
  
  
  =head2 Default::bricko
  
  Single, outer only, bold on bottom right to give illusion of depth (utf8: yes, box_chars: no).
  
   ┌───────────────────┒
   │ column1   column2 ┃
   │                   ┃
   │ row1.1    row1.2  ┃
   │ row2.1    row3.2  ┃
   ├───────────────────┨
   │ row3.1    row3.2  ┃
   ┕━━━━━━━━━━━━━━━━━━━┛
  
  
  =head2 Default::csingle
  
  Curved single (utf8: yes, box_chars: no).
  
   ╭─────────┬─────────╮
   │ column1 │ column2 │
   ├─────────┼─────────┤
   │ row1.1  │ row1.2  │
   │ row2.1  │ row3.2  │
   ├─────────┼─────────┤
   │ row3.1  │ row3.2  │
   ╰─────────┴─────────╯
  
  
  =head2 Default::double
  
  Double (utf8: yes, box_chars: no).
  
   ╔═════════╦═════════╗
   ║ column1 ║ column2 ║
   ╠═════════╬═════════╣
   ║ row1.1  ║ row1.2  ║
   ║ row2.1  ║ row3.2  ║
   ╠═════════╬═════════╣
   ║ row3.1  ║ row3.2  ║
   ╚═════════╩═════════╝
  
  
  =head2 Default::none_ascii
  
  No border (utf8: no, box_chars: no).
  
    column1  column2 
    row1.1   row1.2  
    row2.1   row3.2  
    ------------------- 
    row3.1   row3.2  
  
  
  =head2 Default::none_boxchar
  
  No border (utf8: no, box_chars: yes).
  
  =head2 Default::none_utf8
  
  No border (utf8: yes, box_chars: no).
  
    column1  column2 
    row1.1   row1.2  
    row2.1   row3.2  
   ───────────────────
    row3.1   row3.2  
  
  
  =head2 Default::single_ascii
  
  Single (utf8: no, box_chars: no).
  
   .---------+---------.
   | column1 | column2 |
   +---------+---------+
   | row1.1  | row1.2  |
   | row2.1  | row3.2  |
   +---------+---------+
   | row3.1  | row3.2  |
   `---------+---------'
  
  
  =head2 Default::single_boxchar
  
  Single (utf8: no, box_chars: yes).
  
  =head2 Default::single_utf8
  
  Single (utf8: yes, box_chars: no).
  
   ┌─────────┬─────────┐
   │ column1 │ column2 │
   ├─────────┼─────────┤
   │ row1.1  │ row1.2  │
   │ row2.1  │ row3.2  │
   ├─────────┼─────────┤
   │ row3.1  │ row3.2  │
   └─────────┴─────────┘
  
  
  =head2 Default::singleh_ascii
  
  Single, horizontal only (utf8: no, box_chars: no).
  
   ---------------------
     column1   column2  
   ---------------------
     row1.1    row1.2   
     row2.1    row3.2   
   ---------------------
     row3.1    row3.2   
   ---------------------
  
  
  =head2 Default::singleh_boxchar
  
  Single, horizontal only (utf8: no, box_chars: yes).
  
  =head2 Default::singleh_utf8
  
  Single, horizontal only (utf8: yes, box_chars: no).
  
   ─────────────────────
     column1   column2  
   ─────────────────────
     row1.1    row1.2   
     row2.1    row3.2   
   ─────────────────────
     row3.1    row3.2   
   ─────────────────────
  
  
  =head2 Default::singlei_ascii
  
  Single, inner only (like in psql command-line client) (utf8: no, box_chars: no).
  
     column1 | column2  
    ---------+--------- 
     row1.1  | row1.2   
     row2.1  | row3.2   
    ---------+--------- 
     row3.1  | row3.2   
  
  
  =head2 Default::singlei_boxchar
  
  Single, inner only (like in psql command-line client) (utf8: no, box_chars: yes).
  
  =head2 Default::singlei_utf8
  
  Single, inner only (like in psql command-line client) (utf8: yes, box_chars: no).
  
     column1 │ column2  
    ─────────┼───────── 
     row1.1  │ row1.2   
     row2.1  │ row3.2   
    ─────────┼───────── 
     row3.1  │ row3.2   
  
  
  =head2 Default::singleo_ascii
  
  Single, outer only (utf8: no, box_chars: no).
  
   .-------------------.
   | column1   column2 |
   |                   |
   | row1.1    row1.2  |
   | row2.1    row3.2  |
   +-------------------+
   | row3.1    row3.2  |
   `-------------------'
  
  
  =head2 Default::singleo_boxchar
  
  Single, outer only (utf8: no, box_chars: yes).
  
  =head2 Default::singleo_utf8
  
  Single, outer only (utf8: yes, box_chars: no).
  
   ┌───────────────────┐
   │ column1   column2 │
   │                   │
   │ row1.1    row1.2  │
   │ row2.1    row3.2  │
   ├───────────────────┤
   │ row3.1    row3.2  │
   └───────────────────┘
  
  
  =head2 Default::singlev_ascii
  
  Single border, only vertical (utf8: no, box_chars: no).
  
   |         |         |
   | column1 | column2 |
   |         |         |
   | row1.1  | row1.2  |
   | row2.1  | row3.2  |
   |---------|---------|
   | row3.1  | row3.2  |
   |         |         |
  
  
  =head2 Default::singlev_boxchar
  
  Single, vertical only (utf8: no, box_chars: yes).
  
  =head2 Default::singlev_utf8
  
  Single, vertical only (utf8: yes, box_chars: no).
  
   │         │         │
   │ column1 │ column2 │
   │         │         │
   │ row1.1  │ row1.2  │
   │ row2.1  │ row3.2  │
   │─────────│─────────│
   │ row3.1  │ row3.2  │
   │         │         │
  
  
  =head2 Default::space_ascii
  
  Space as border (utf8: no, box_chars: no).
  
                        
     column1   column2  
                        
     row1.1    row1.2   
     row2.1    row3.2   
    ------------------- 
     row3.1    row3.2   
                        
  
  
  =head2 Default::space_boxchar
  
  Space as border (utf8: no, box_chars: yes).
  
  =head2 Default::space_utf8
  
  Space as border (utf8: yes, box_chars: no).
  
                        
     column1   column2  
                        
     row1.1    row1.2   
     row2.1    row3.2   
    ─────────────────── 
     row3.1    row3.2   
                        
  
  
  =head2 Default::spacei_ascii
  
  Space, inner-only (utf8: no, box_chars: no).
  
    column1   column2 
    row1.1    row1.2  
    row2.1    row3.2  
   -------------------
    row3.1    row3.2  
  
  
  =head2 Default::spacei_boxchar
  
  Space, inner-only (utf8: no, box_chars: yes).
  
  =head2 Default::spacei_utf8
  
  Space, inner-only (utf8: yes, box_chars: no).
  
    column1   column2 
    row1.1    row1.2  
    row2.1    row3.2  
   ───────────────────
    row3.1    row3.2  
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Text-ANSITable>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Text-ANSITable>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Text-ANSITable>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2018, 2017, 2016, 2015, 2014, 2013 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
TEXT_ANSITABLE_BORDERSTYLE_DEFAULT

    $main::fatpacked{"Text/ANSITable/ColorTheme/Default.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'TEXT_ANSITABLE_COLORTHEME_DEFAULT';
  package Text::ANSITable::ColorTheme::Default;
  
  our $DATE = '2018-12-02'; # DATE
  our $VERSION = '0.501'; # VERSION
  
  use 5.010;
  use strict;
  use warnings;
  
  use Color::RGB::Util qw(mix_2_rgb_colors);
  use Function::Fallback::CoreOrPP qw(clone);
  
  our %color_themes = (
  
      no_color => {
          v => 1.1,
          summary => 'Special theme that means no color',
          colors => {
          },
          no_color => 1,
      },
  
      #default_16 => {
      #    v => 1.1,
      #    summary => 'Default for 16-color terminal',
      #    colors => {
      #    },
      #},
  
      #default_256 => {
      default_gradation => {
          v => 1.1,
          summary => 'Default (for terminal with black background)',
          description => <<'_',
  
  Border color has gradation from top to bottom. Accept arguments C<border1> and
  C<border2> to set first (top) and second (bottom) foreground RGB colors. Colors
  will fade from the top color to bottom color. Also accept C<border1_bg> and
  C<border2_bg> to set background RGB colors.
  
  _
          colors => {
              border      => sub {
                  my ($self, %args) = @_;
  
                  my $pct = ($self->{_draw}{y}+1) / $self->{_draw}{table_height};
  
                  my $rgbf1 = $self->{color_theme_args}{border1} // $self->{color_theme}{data}{default_border1} // 'ffffff';
                  my $rgbf2 = $self->{color_theme_args}{border2} // $self->{color_theme}{data}{default_border2} // '444444';
                  my $rgbf  = mix_2_rgb_colors($rgbf1, $rgbf2, $pct);
  
                  my $rgbb1 = $self->{color_theme_args}{border1_bg};
                  my $rgbb2 = $self->{color_theme_args}{border2_bg};
                  my $rgbb;
                  if ($rgbb1 && $rgbb2) {
                      $rgbb = mix_2_rgb_colors($rgbb1, $rgbb2, $pct);
                  }
  
                  #say "D:$rgbf, $rgbb";
                  {fg=>$rgbf, bg=>$rgbb};
              },
  
              header      => '808080',
              header_bg   => undef,
              cell        => undef,
              cell_bg     => undef,
  
              num_data    => '66ffff',
              str_data    => undef,
              date_data   => 'aaaa00',
              bool_data   => sub {
                  my ($self, %args) = @_;
  
                  $args{orig_data} ? '00ff00' : 'ff0000';
              },
          },
      },
  
  );
  
  {
      my $ct = clone($color_themes{default_gradation});
      $ct->{summary} = 'Default (for terminal with white background)';
      $ct->{colors}{header_bg} = 'cccccc';
      $ct->{data}{default_border1} = '000000';
      $ct->{data}{default_border2} = 'cccccc';
      $ct->{colors}{num_data}  = '006666';
      $ct->{colors}{date_data} = '666600';
      $ct->{colors}{bool_data} = sub {
          my ($self, %args) = @_;
          $args{orig_data} ? '00cc00' : 'cc0000';
      };
      $color_themes{default_gradation_whitebg} = $ct;
  }
  
  
  {
      my $ct = clone($color_themes{default_gradation});
      $ct->{colors}{border} = '666666';
      delete $ct->{description};
      $color_themes{default_nogradation} = $ct;
  }
  
  {
      my $ct = clone($color_themes{default_gradation_whitebg});
      $ct->{colors}{border} = '666666';
      delete $ct->{description};
      $color_themes{default_nogradation_whitebg} = $ct;
  }
  
  1;
  # ABSTRACT: Default color themes
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Text::ANSITable::ColorTheme::Default - Default color themes
  
  =head1 VERSION
  
  This document describes version 0.501 of Text::ANSITable::ColorTheme::Default (from Perl distribution Text-ANSITable), released on 2018-12-02.
  
  =head1 COLOR THEMES
  
  Below are the color themes included in this package:
  
  =head2 Default::default_gradation
  
  Default (for terminal with black background).
  
  
  Border color has gradation from top to bottom. Accept arguments C<border1> and
  C<border2> to set first (top) and second (bottom) foreground RGB colors. Colors
  will fade from the top color to bottom color. Also accept C<border1_bg> and
  C<border2_bg> to set background RGB colors.
  
  
  
  =head2 Default::default_gradation_whitebg
  
  Default (for terminal with white background).
  
  
  Border color has gradation from top to bottom. Accept arguments C<border1> and
  C<border2> to set first (top) and second (bottom) foreground RGB colors. Colors
  will fade from the top color to bottom color. Also accept C<border1_bg> and
  C<border2_bg> to set background RGB colors.
  
  
  
  =head2 Default::default_nogradation
  
  Default (for terminal with black background).
  
  =head2 Default::default_nogradation_whitebg
  
  Default (for terminal with white background).
  
  =head2 Default::no_color
  
  Special theme that means no color.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Text-ANSITable>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Text-ANSITable>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Text-ANSITable>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2018, 2017, 2016, 2015, 2014, 2013 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
TEXT_ANSITABLE_COLORTHEME_DEFAULT

    $main::fatpacked{"Text/ANSITable/StyleSet/AltRow.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'TEXT_ANSITABLE_STYLESET_ALTROW';
  package Text::ANSITable::StyleSet::AltRow;
  
  our $DATE = '2018-12-02'; # DATE
  our $VERSION = '0.501'; # VERSION
  
  use 5.010;
  use Moo;
  use namespace::clean;
  
  has odd_bgcolor  => (is => 'rw');
  has even_bgcolor => (is => 'rw');
  has odd_fgcolor  => (is => 'rw');
  has even_fgcolor => (is => 'rw');
  
  sub summary {
      "Set different foreground and/or background color for odd/even rows";
  }
  
  sub apply {
      my ($self, $table) = @_;
  
      $table->add_cond_row_style(
          sub {
              my ($t, %args) = @_;
              my %styles;
              # because we count from 0
              if ($_ % 2 == 0) {
                  $styles{bgcolor} = $self->odd_bgcolor
                      if defined $self->odd_bgcolor;
                  $styles{fgcolor}=$self->odd_fgcolor
                      if defined $self->odd_fgcolor;
              } else {
                  $styles{bgcolor} = $self->even_bgcolor
                      if defined $self->even_bgcolor;
                  $styles{fgcolor} = $self->even_fgcolor
                      if defined $self->even_fgcolor;
              }
              \%styles;
          },
      );
  }
  
  1;
  
  # ABSTRACT: Set different foreground and/or background color for odd/even rows";
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Text::ANSITable::StyleSet::AltRow - Set different foreground and/or background color for odd/even rows";
  
  =head1 VERSION
  
  This document describes version 0.501 of Text::ANSITable::StyleSet::AltRow (from Perl distribution Text-ANSITable), released on 2018-12-02.
  
  =for Pod::Coverage ^(summary|apply)$
  
  =head1 ATTRIBUTES
  
  =head2 odd_bgcolor
  
  =head2 odd_fgcolor
  
  =head2 even_bgcolor
  
  =head2 even_fgcolor
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Text-ANSITable>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Text-ANSITable>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Text-ANSITable>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2018, 2017, 2016, 2015, 2014, 2013 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
TEXT_ANSITABLE_STYLESET_ALTROW

    $main::fatpacked{"Text/Table/ASV.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'TEXT_TABLE_ASV';
  package Text::Table::ASV;
  
  our $DATE = '2018-07-23'; # DATE
  our $VERSION = '0.001'; # VERSION
  
  #IFUNBUILT
  # # use 5.010001;
  # # use strict;
  # # use warnings;
  #END IFUNBUILT
  
  sub _encode {
      my $val = shift;
      $val =~ s/[\x1c\x1d\x1e\x1f]/ /g;
      $val;
  }
  
  sub table {
      my %params = @_;
      my $rows = $params{rows} or die "Must provide rows!";
  
      my $header_row = defined $params{header_row} ? $params{header_row} : 1;
      my $max_index = _max_array_index($rows);
  
      # here we go...
      my @table;
  
      # then the data
      my $i = 0;
      foreach my $row ( @{ $rows }[0..$#$rows] ) {
          $i++;
          next if $i==1 && !$header_row;
          push @table, join(
  	    "\x1f",
  	    map { _encode(defined($row->[$_]) ? $row->[$_] : '') } (0..$max_index)
  	);
      }
  
      return join("\x1e", grep {$_} @table);
  }
  
  # FROM_MODULE: PERLANCAR::List::Util::PP
  # BEGIN_BLOCK: max
  sub max {
      return undef unless @_;
      my $res = $_[0];
      my $i = 0;
      while (++$i < @_) { $res = $_[$i] if $_[$i] > $res }
      $res;
  }
  # END_BLOCK: max
  
  # return highest top-index from all rows in case they're different lengths
  sub _max_array_index {
      my $rows = shift;
      return max( map { $#$_ } @$rows );
  }
  
  1;
  # ABSTRACT: Generate TSV
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Text::Table::ASV - Generate TSV
  
  =head1 VERSION
  
  This document describes version 0.001 of Text::Table::ASV (from Perl distribution Text-Table-ASV), released on 2018-07-23.
  
  =head1 SYNOPSIS
  
   use Text::Table::ASV;
  
   my $rows = [
       # header row
       ['Name', 'Rank', 'Serial'],
       # rows
       ['alice', 'pvt', '123456'],
       ['bob',   'cpl', '98765321'],
       ['carol', 'brig gen', '8745'],
   ];
   print Text::Table::TSV::table(rows => $rows, header_row => 1);
  
  =head1 DESCRIPTION
  
  This module provides a single function, C<table>, which formats a
  two-dimensional array of data as ASV. This is basically a way to generate ASV
  using the same interface as that of L<Text::Table::Tiny> (v0.03) or
  L<Text::Table::Org>.
  
  ASV (ASCII separated values, also sometimes DEL a.k.a. Delimited ASCII) is a
  format similar to TSV (tab separated values). Instead of Tab character ("\t") as
  the field separator, ASV uses "\x1f" (ASCII Unit Separator character) and
  instead of newline ("\n") as the record separator, ASV uses "\x1e" (ASCII Record
  Separator). There is currently no quoting or escaping mechanism provided.
  "\x1c", "\x1d", "\x1e", and "\x1f" characters in cell will be replaced by
  spaces.
  
  The example shown in the SYNOPSIS generates the following table (the record
  separator and unit separator are shown using "\x1f" and "\x1f" respectively):
  
   Name\x1fRank\x1fSerial\x1ealice\x1fpvt\x1f123456\x1ebob\x1fcpl\x1f98765321\x1ecarol\x1fbrig gen\x1f8745
  
  =for Pod::Coverage ^(max)$
  
  =head1 FUNCTIONS
  
  =head2 table(%params) => str
  
  =head2 OPTIONS
  
  The C<table> function understands these arguments, which are passed as a hash.
  
  =over
  
  =item * rows (aoaos)
  
  Takes an array reference which should contain one or more rows of data, where
  each row is an array reference.
  
  =back
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Text-Table-ASV>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Text-Table-ASV>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Text-Table-ASV>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Text::Table::Tiny>
  
  L<Bencher::Scenario::TextTableModules>.
  
  L<https://en.wikipedia.org/wiki/Delimiter-separated_values>
  
  L<https://en.wikipedia.org/wiki/C0_and_C1_control_codes#Field_separators>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2018 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
TEXT_TABLE_ASV

    $main::fatpacked{"Text/Table/Any.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'TEXT_TABLE_ANY';
  package Text::Table::Any;
  
  our $DATE = '2019-11-29'; # DATE
  our $VERSION = '0.096'; # VERSION
  
  #IFUNBUILT
  # # use 5.010001;
  # # use strict;
  # # use warnings;
  #END IFUNBUILT
  
  our @BACKENDS = qw(
                        Text::Table::Tiny
                        Text::Table::TinyColor
                        Text::Table::TinyColorWide
                        Text::Table::TinyWide
                        Text::Table::Org
                        Text::Table::CSV
                        Text::Table::TSV
                        Text::Table::LTSV
                        Text::Table::ASV
                        Text::Table::HTML
                        Text::Table::HTML::DataTables
                        Text::Table::Paragraph
                        Text::ANSITable
                        Text::ASCIITable
                        Text::FormatTable
                        Text::MarkdownTable
                        Text::Table
                        Text::TabularDisplay
                        Text::Table::XLSX
                        Term::TablePrint
                );
  
  sub _encode {
      my $val = shift;
      $val =~ s/([\\"])/\\$1/g;
      "\"$val\"";
  }
  
  sub backends {
      @BACKENDS;
  }
  
  sub table {
      my %params = @_;
  
      my $rows       = $params{rows} or die "Must provide rows!";
      my $backend    = $params{backend} || 'Text::Table::Tiny';
      my $header_row = $params{header_row} // 1;
  
      if ($backend eq 'Text::Table::Tiny') {
          require Text::Table::Tiny;
          return Text::Table::Tiny::table(
              rows => $rows, header_row => $header_row) . "\n";
      } elsif ($backend eq 'Text::Table::TinyColor') {
          require Text::Table::TinyColor;
          return Text::Table::TinyColor::table(
              rows => $rows, header_row => $header_row) . "\n";
      } elsif ($backend eq 'Text::Table::TinyColorWide') {
          require Text::Table::TinyColorWide;
          return Text::Table::TinyColorWide::table(
              rows => $rows, header_row => $header_row) . "\n";
      } elsif ($backend eq 'Text::Table::TinyWide') {
          require Text::Table::TinyWide;
          return Text::Table::TinyWide::table(
              rows => $rows, header_row => $header_row) . "\n";
      } elsif ($backend eq 'Text::Table::Org') {
          require Text::Table::Org;
          return Text::Table::Org::table(
              rows => $rows, header_row => $header_row);
      } elsif ($backend eq 'Text::Table::CSV') {
          require Text::Table::CSV;
          return Text::Table::CSV::table(
              rows => $rows, header_row => $header_row);
      } elsif ($backend eq 'Text::Table::TSV') {
          require Text::Table::TSV;
          return Text::Table::TSV::table(
              rows => $rows);
      } elsif ($backend eq 'Text::Table::LTSV') {
          require Text::Table::LTSV;
          return Text::Table::LTSV::table(
              rows => $rows);
      } elsif ($backend eq 'Text::Table::ASV') {
          require Text::Table::ASV;
          return Text::Table::ASV::table(
              rows => $rows, header_row => $header_row);
      } elsif ($backend eq 'Text::Table::HTML') {
          require Text::Table::HTML;
          return Text::Table::HTML::table(
              rows => $rows, header_row => $header_row);
      } elsif ($backend eq 'Text::Table::HTML::DataTables') {
          require Text::Table::HTML::DataTables;
          return Text::Table::HTML::DataTables::table(
              rows => $rows, header_row => $header_row);
      } elsif ($backend eq 'Text::Table::Paragraph') {
          require Text::Table::Paragraph;
          return Text::Table::Paragraph::table(
              rows => $rows, header_row => $header_row);
      } elsif ($backend eq 'Text::ANSITable') {
          require Text::ANSITable;
          my $t = Text::ANSITable->new(
              use_utf8 => 0,
              use_box_chars => 0,
              use_color => 0,
              border_style => 'Default::single_ascii',
          );
          # XXX pick an appropriate border style when header_row=0
          if ($header_row) {
              $t->columns($rows->[0]);
              $t->add_row($rows->[$_]) for 1..@$rows-1;
          } else {
              $t->columns([ map {"col$_"} 0..$#{$rows->[0]} ]);
              $t->add_row($_) for @$rows;
          }
          return $t->draw;
      } elsif ($backend eq 'Text::ASCIITable') {
          require Text::ASCIITable;
          my $t = Text::ASCIITable->new();
          if ($header_row) {
              $t->setCols(@{ $rows->[0] });
              $t->addRow(@{ $rows->[$_] }) for 1..@$rows-1;
          } else {
              $t->setCols(map { "col$_" } 0..$#{ $rows->[0] });
              $t->addRow(@$_) for @$rows;
          }
          return "$t";
      } elsif ($backend eq 'Text::FormatTable') {
          require Text::FormatTable;
          my $t = Text::FormatTable->new(join('|', ('l') x @{ $rows->[0] }));
          $t->head(@{ $rows->[0] });
          $t->row(@{ $rows->[$_] }) for 1..@$rows-1;
          return $t->render;
      } elsif ($backend eq 'Text::MarkdownTable') {
          require Text::MarkdownTable;
          my $out = "";
          my $fields =  $header_row ?
              $rows->[0] : [map {"col$_"} 0..$#{ $rows->[0] }];
          my $t = Text::MarkdownTable->new(file => \$out, columns => $fields);
          foreach (($header_row ? 1:0) .. $#{$rows}) {
              my $row = $rows->[$_];
              $t->add( {
                  map { $fields->[$_] => $row->[$_] } 0..@$fields-1
              });
          }
          $t->done;
          return $out;
      } elsif ($backend eq 'Text::Table') {
          require Text::Table;
          my $t = Text::Table->new(@{ $rows->[0] });
          $t->load(@{ $rows }[1..@$rows-1]);
          return $t;
      } elsif ($backend eq 'Text::TabularDisplay') {
          require Text::TabularDisplay;
          my $t = Text::TabularDisplay->new(@{ $rows->[0] });
          $t->add(@{ $rows->[$_] }) for 1..@$rows-1;
          return $t->render . "\n";
      } elsif ($backend eq 'Text::Table::XLSX') {
          require Text::Table::XLSX;
          return Text::Table::XLSX::table(
              rows => $rows, header_row => $header_row);
      } elsif ($backend eq 'Term::TablePrint') {
          require Term::TablePrint;
          my $rows2;
          if ($header_row) {
              $rows2 = $rows;
          } else {
              $rows2 = [@$rows];
              shift @$rows2;
          }
          return Term::TablePrint::print_table($rows);
      } else {
          die "Unknown backend '$backend'";
      }
  }
  
  1;
  # ABSTRACT: Generate text table using one of several backends
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Text::Table::Any - Generate text table using one of several backends
  
  =head1 VERSION
  
  This document describes version 0.096 of Text::Table::Any (from Perl distribution Text-Table-Any), released on 2019-11-29.
  
  =head1 SYNOPSIS
  
   use Text::Table::Any;
  
   my $rows = [
       # header row
       ['Name', 'Rank', 'Serial'],
       # rows
       ['alice', 'pvt', '123456'],
       ['bob',   'cpl', '98765321'],
       ['carol', 'brig gen', '8745'],
   ];
   print Text::Table::Any::table(rows => $rows, header_row => 1,
                                 backend => 'Text::Table::Tiny');
  
  =head1 DESCRIPTION
  
  This module provides a single function, C<table>, which formats a
  two-dimensional array of data as text table, using one of several available
  backends. The interface is modelled after L<Text::Table::Tiny> (0.3);
  Text::Table::Tiny also happens to be the default backend.
  
  The example shown in the SYNOPSIS generates the following table:
  
   +-------+----------+----------+
   | Name  | Rank     | Serial   |
   +-------+----------+----------+
   | alice | pvt      | 123456   |
   | bob   | cpl      | 98765321 |
   | carol | brig gen | 8745     |
   +-------+----------+----------+
  
  When using C<Text::Table::Org> backend, the result is something like:
  
   | Name  | Rank     | Serial   |
   |-------+----------+----------|
   | alice | pvt      | 123456   |
   | bob   | cpl      | 98765321 |
   | carol | brig gen | 8745     |
  
  When using C<Text::Table::CSV> backend:
  
   "Name","Rank","Serial"
   "alice","pvt","123456"
   "bob","cpl","98765321"
   "carol","brig gen","8745"
  
  When using C<Text::ANSITable> backend:
  
   .-------+----------+----------.
   | Name  | Rank     |   Serial |
   +-------+----------+----------+
   | alice | pvt      |   123456 |
   | bob   | cpl      | 98765321 |
   | carol | brig gen |     8745 |
   `-------+----------+----------'
  
  When using C<Text::ASCIITable> backend:
  
   .-----------------------------.
   | Name  | Rank     | Serial   |
   +-------+----------+----------+
   | alice | pvt      |   123456 |
   | bob   | cpl      | 98765321 |
   | carol | brig gen |     8745 |
   '-------+----------+----------'
  
  When using C<Text::FormatTable> backend:
  
   Name |Rank    |Serial
   alice|pvt     |123456
   bob  |cpl     |98765321
   carol|brig gen|8745
  
  When using C<Text::MarkdownTable> backend:
  
   | Name  | Rank     | Serial   |
   |-------|----------|----------|
   | alice | pvt      | 123456   |
   | bob   | cpl      | 98765321 |
   | carol | brig gen | 8745     |
  
  When using C<Text::Table> backend:
  
   Name  Rank     Serial
   alice pvt        123456
   bob   cpl      98765321
   carol brig gen     8745
  
  When using C<Text::TabularDisplay> backend:
  
   +-------+----------+----------+
   | Name  | Rank     | Serial   |
   +-------+----------+----------+
   | alice | pvt      | 123456   |
   | bob   | cpl      | 98765321 |
   | carol | brig gen | 8745     |
   +-------+----------+----------+
  
  =head1 VARIABLES
  
  =head2 @BACKENDS
  
  List of supported backends.
  
  =head1 FUNCTIONS
  
  =head2 table
  
  Usage:
  
   table(%params) => str
  
  Known arguments:
  
  =over
  
  =item * rows (aoaos)
  
  Required. Takes an array reference which should contain one or more rows of
  data, where each row is an array reference.
  
  =item * backend (str, default C<Text::Table::Tiny>)
  
  Optional. Pick a backend module. Supported backends:
  
  =over
  
  =item * Text::Table::Tiny
  
  =item * Text::Table::TinyColor
  
  =item * Text::Table::TinyColorWide
  
  =item * Text::Table::TinyWide
  
  =item * Text::Table::Org
  
  =item * Text::Table::CSV
  
  =item * Text::Table::TSV
  
  =item * Text::Table::LTSV
  
  =item * Text::Table::ASV
  
  =item * Text::Table::HTML
  
  =item * Text::Table::HTML::DataTables
  
  =item * Text::Table::Paragraph
  
  =item * Text::ANSITable
  
  =item * Text::ASCIITable
  
  =item * Text::FormatTable
  
  =item * Text::MarkdownTable
  
  =item * Text::Table
  
  =item * Text::TabularDisplay
  
  =item * Text::Table::XLSX
  
  =item * Term::TablePrint
  
  =back
  
  =item * header_row (bool, default 0)
  
  Optional. If given a true value, the first row in the data will be interpreted
  as a header row, and separated visually from the rest of the table (e.g. with a
  ruled line). But some backends won't display differently.
  
  =back
  
  =head2 backends
  
  Return list of supported backends. You can also get the list from the
  L</@BACKENDS> package variable.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Text-Table-Any>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Text-Table-Any>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Text-Table-Any>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Bencher::Scenario::TextTableModules>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2019, 2018, 2017, 2016, 2015 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
TEXT_TABLE_ANY

    $main::fatpacked{"Text/Table/Tiny.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'TEXT_TABLE_TINY';
  use 5.006;
  use strict;
  use warnings;
  package Text::Table::Tiny;
  $Text::Table::Tiny::VERSION = '0.05';
  use parent 'Exporter';
  use List::Util qw();
  use Carp qw/ croak /;
  
  our @EXPORT_OK = qw/ generate_table /;
  
  # ABSTRACT: makes simple tables from two-dimensional arrays, with limited templating options
  
  
  our $COLUMN_SEPARATOR = '|';
  our $ROW_SEPARATOR = '-';
  our $CORNER_MARKER = '+';
  our $HEADER_ROW_SEPARATOR = '=';
  our $HEADER_CORNER_MARKER = 'O';
  
  sub generate_table {
  
      my %params = @_;
      my $rows = $params{rows} or croak "generate_table(): you must pass the 'rows' argument!";
  
      # foreach col, get the biggest width
      my $widths = _maxwidths($rows);
      my $max_index = _max_array_index($rows);
  
      # use that to get the field format and separators
      my $format = _get_format($widths);
      my $row_sep = _get_row_separator($widths);
      my $head_row_sep = _get_header_row_separator($widths);
  
      # here we go...
      my @table;
      push(@table, $row_sep) unless $params{top_and_tail};
  
      # if the first row's a header:
      my $data_begins = 0;
      if ( $params{header_row} ) {
          my $header_row = $rows->[0];
          $data_begins++;
          push @table, sprintf(
                           $format, 
                           map { defined($header_row->[$_]) ? $header_row->[$_] : '' } (0..$max_index)
                       );
          push @table, $params{separate_rows} ? $head_row_sep : $row_sep;
      }
  
      # then the data
      my $row_number = 0;
      my $last_line_number = int(@$rows);
      $last_line_number-- if $params{header_row};
      foreach my $row ( @{ $rows }[$data_begins..$#$rows] ) {
          $row_number++;
          push(@table, sprintf(
                               $format, 
                               map { defined($row->[$_]) ? $row->[$_] : '' } (0..$max_index)
                              ));
  
          push(@table, $row_sep) if $params{separate_rows} && (!$params{top_and_tail} || $row_number < $last_line_number);
  
      }
  
      # this will have already done the bottom if called explicitly
      push(@table, $row_sep) unless $params{separate_rows} || $params{top_and_tail};
      return join("\n",grep {$_} @table);
  }
  
  
  sub _maxwidths {
      my $rows = shift;
      # what's the longest array in this list of arrays?
      my $max_index = _max_array_index($rows);
      my $widths = [];
      for my $i (0..$max_index) {
          # go through the $i-th element of each array, find the longest
          my $max = List::Util::max(map {defined $$_[$i] ? length($$_[$i]) : 0} @$rows);
          push @$widths, $max;
      }
      return $widths;
  }
  
  # return highest top-index from all rows in case they're different lengths
  sub _max_array_index {
      my $rows = shift;
      return List::Util::max( map { $#$_ } @$rows );
  }
  
  sub _get_format {
      my $widths = shift;
      return "$COLUMN_SEPARATOR ".join(" $COLUMN_SEPARATOR ",map { "%-${_}s" } @$widths)." $COLUMN_SEPARATOR";
  }
  
  sub _get_row_separator {
      my $widths = shift;
      return "$CORNER_MARKER$ROW_SEPARATOR".join("$ROW_SEPARATOR$CORNER_MARKER$ROW_SEPARATOR",map { $ROW_SEPARATOR x $_ } @$widths)."$ROW_SEPARATOR$CORNER_MARKER";
  }
  
  sub _get_header_row_separator {
      my $widths = shift;
      return "$HEADER_CORNER_MARKER$HEADER_ROW_SEPARATOR".join("$HEADER_ROW_SEPARATOR$HEADER_CORNER_MARKER$HEADER_ROW_SEPARATOR",map { $HEADER_ROW_SEPARATOR x $_ } @$widths)."$HEADER_ROW_SEPARATOR$HEADER_CORNER_MARKER";
  }
  
  # Back-compat: 'table' is an alias for 'generate_table', but isn't exported
  *table = \&generate_table;
  
  1;
  
  __END__
  
  =pod
  
  =head1 NAME
  
  Text::Table::Tiny - simple text tables from 2D arrays, with limited templating options
  
  =head1 SYNOPSIS
  
      use Text::Table::Tiny 0.04 qw/ generate_table /;
  
      my $rows = [
          # header row
          ['Name', 'Rank', 'Serial'],
          # rows
          ['alice', 'pvt', '123456'],
          ['bob',   'cpl', '98765321'],
          ['carol', 'brig gen', '8745'],
      ];
      print generate_table(rows => $rows, header_row => 1);
  
  
  =head1 DESCRIPTION
  
  This module provides a single function, C<generate_table>, which formats
  a two-dimensional array of data as a text table.
  
  The example shown in the SYNOPSIS generates the following table:
  
      +-------+----------+----------+
      | Name  | Rank     | Serial   |
      +-------+----------+----------+
      | alice | pvt      | 123456   |
      | bob   | cpl      | 98765321 |
      | carol | brig gen | 8745     |
      +-------+----------+----------+
  
  B<NOTE>: the interface changed with version 0.04, so if you
  use the C<generate_table()> function illustrated above,
  then you need to require at least version 0.04 of this module,
  as shown in the SYNOPSIS.
  
  
  =head2 generate_table()
  
  The C<generate_table> function understands three arguments,
  which are passed as a hash.
  
  =over 4
  
  
  =item *
  
  rows
  
  Takes an array reference which should contain one or more rows
  of data, where each row is an array reference.
  
  
  =item *
  
  header_row
  
  If given a true value, the first row in the data will be interpreted
  as a header row, and separated from the rest of the table with a ruled line.
  
  
  =item *
  
  separate_rows
  
  If given a true value, a separator line will be drawn between every row in
  the table,
  and a thicker line will be used for the header separator.
  
  =item *
  
  top_and_tail
  
  If given a true value, then the top and bottom border lines will be skipped.
  This reduces the vertical height of the generated table.
  
  =back
  
  
  =head2 EXAMPLES
  
  If you just pass the data and no other options:
  
   generate_table(rows => $rows);
  
  You get minimal ruling:
  
      +-------+----------+----------+
      | Name  | Rank     | Serial   |
      | alice | pvt      | 123456   |
      | bob   | cpl      | 98765321 |
      | carol | brig gen | 8745     |
      +-------+----------+----------+
  
  If you want lines between every row, and also want a separate header:
  
   generate_table(rows => $rows, header_row => 1, separate_rows => 1);
  
  You get the maximally ornate:
  
      +-------+----------+----------+
      | Name  | Rank     | Serial   |
      O=======O==========O==========O
      | alice | pvt      | 123456   |
      +-------+----------+----------+
      | bob   | cpl      | 98765321 |
      +-------+----------+----------+
      | carol | brig gen | 8745     |
      +-------+----------+----------+
  
  =head1 FORMAT VARIABLES
  
  You can set a number of package variables inside the C<Text::Table::Tiny> package
  to configure the appearance of the table.
  This interface is likely to be deprecated in the future,
  and some other mechanism provided.
  
  =over 4
  
  =item *
  
  $Text::Table::Tiny::COLUMN_SEPARATOR = '|';
  
  =item *
  
  $Text::Table::Tiny::ROW_SEPARATOR = '-';
  
  =item *
  
  $Text::Table::Tiny::CORNER_MARKER = '+';
  
  =item *
  
  $Text::Table::Tiny::HEADER_ROW_SEPARATOR = '=';
  
  =item *
  
  $Text::Table::Tiny::HEADER_CORNER_MARKER = 'O';
  
  =back
  
  
  =head1 PREVIOUS INTERFACE
  
  Prior to version 0.04 this module provided a function called C<table()>,
  which wasn't available for export. It took exactly the same arguments:
  
   use Text::Table::Tiny;
   my $rows = [ ... ];
   print Text::Table::Tiny::table(rows => $rows, separate_rows => 1, header_row => 1);
  
  For backwards compatibility this interface is still supported.
  The C<table()> function isn't available for export though.
  
  
  =head1 SEE ALSO
  
  There are many modules for formatting text tables on CPAN.
  A good number of them are listed in the
  L<See Also|https://metacpan.org/pod/Text::Table::Manifold#See-Also>
  section of the documentation for L<Text::Table::Manifold>.
  
  
  =head1 REPOSITORY
  
  L<https://github.com/neilb/Text-Table-Tiny>
  
  
  =head1 AUTHOR
  
  Creighton Higgins <chiggins@chiggins.com>
  
  Now maintained by Neil Bowers <neilb@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2012 by Creighton Higgins.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
  
TEXT_TABLE_TINY

    $main::fatpacked{"Text/sprintfn.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'TEXT_SPRINTFN';
  ## no critic: Modules::ProhibitAutomaticExportation
  
  package Text::sprintfn;
  
  use 5.010001;
  use strict;
  use warnings;
  
  require Exporter;
  our @ISA       = qw(Exporter);
  our @EXPORT    = qw(sprintfn printfn);
  
  our $VERSION = '0.090'; # VERSION
  
  our $distance  = 10;
  
  my  $re1   = qr/[^)]+/s;
  my  $re2   = qr{(?<fmt>
                      %
                         (?<pi> \d+\$ | \((?<npi>$re1)\)\$?)?
                         (?<flags> [ +0#-]+)?
                         (?<vflag> \*?[v])?
                         (?<width> -?\d+ |
                             \*\d+\$? |
                             \((?<nwidth>$re1)\))?
                         (?<dot>\.?)
                         (?<prec>
                             (?: \d+ | \* |
                             \((?<nprec>$re1)\) ) ) ?
                         (?<conv> [%csduoxefgXEGbBpniDUOF])
                     )}x;
  our $regex = qr{($re2|%|[^%]+)}s;
  
  # faster version, without using named capture
  if (1) {
      $regex = qr{( #all=1
                      ( #fmt=2
                          %
                          (#pi=3
                              \d+\$ | \(
                              (#npi=4
                                  [^)]+)\)\$?)?
                          (#flags=5
                              [ +0#-]+)?
                          (#vflag=6
                              \*?[v])?
                          (#width=7
                              -?\d+ |
                              \*\d+\$? |
                              \((#nwidth=8
                                  [^)]+)\))?
                          (#dot=9
                              \.?)
                          (#prec=10
                              (?: \d+ | \* |
                                  \((#nprec=11
                                      [^)]+)\) ) ) ?
                          (#conv=12
                              [%csduoxefgXEGbBpniDUOF])
                      ) | % | [^%]+
                  )}xs;
  }
  
  sub sprintfn {
      my ($format, @args) = @_;
  
      my $hash;
      if (ref($args[0]) eq 'HASH') {
          $hash = shift(@args);
      }
      return sprintf($format, @args) if !$hash;
  
      my %indexes; # key = $hash key, value = index for @args
      push @args, (undef) x $distance;
  
      $format =~ s{$regex}{
          my ($all, $fmt, $pi, $npi, $flags,
              $vflag, $width, $nwidth, $dot, $prec,
              $nprec, $conv) =
              ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12);
  
          my $res;
          if ($fmt) {
  
              if (defined $npi) {
                  my $i = $indexes{$npi};
                  if (!$i) {
                      $i = @args + 1;
                      push @args, $hash->{$npi};
                      $indexes{$npi} = $i;
                  }
                  $pi = "${i}\$";
              }
  
              if (defined $nwidth) {
                  $width = $hash->{$nwidth};
              }
  
              if (defined $nprec) {
                  $prec = $hash->{$nprec};
              }
  
              $res = join("",
                  grep {defined} (
                      "%",
                      $pi, $flags, $vflag,
                      $width, $dot, $prec, $conv)
                  );
          } else {
              my $i = @args + 1;
              push @args, $all;
              $res = "\%${i}\$s";
          }
          $res;
      }xego;
  
      # DEBUG
      #use Data::Dump; dd [$format, @args];
  
      sprintf $format, @args;
  }
  
  sub printfn {
      print sprintfn @_;
  }
  
  1;
  # ABSTRACT: Drop-in replacement for sprintf(), with named parameter support
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Text::sprintfn - Drop-in replacement for sprintf(), with named parameter support
  
  =head1 VERSION
  
  This document describes version 0.090 of Text::sprintfn (from Perl distribution Text-sprintfn), released on 2019-11-19.
  
  =head1 SYNOPSIS
  
   use Text::sprintfn; # by default exports sprintfn() and printfn()
  
   # with no hash, behaves just like printf
   printfn '<%04d>', 1, 2; # <0001>
  
   # named parameter
   printfn '<%(v1)-4d>', {v1=>-2}; # <-2  >
  
   # mixed named and positional
   printfn '<%d> <%(v1)d> <%d>', {v1=>1}, 2, 3; # <2> <1> <3>
  
   # named width
   printfn "<%(v1)(v2).1f>", {v1=>3, v2=>4}; # <   3>
  
   # named precision
   printfn "<%(v1)(v2).(v2)f>", {v1=>3, v2=>4}; # <3.0000>
  
  =head1 DESCRIPTION
  
  This module provides sprintfn() and printfn(), which are like sprintf() and
  printf(), with the exception that they support named parameters from a hash.
  
  =head1 RATIONALE
  
  There exist other CPAN modules for string formatting with named parameter
  support. Two of such modules are L<String::Formatter> and
  L<Text::Sprintf::Named>. This module is far simpler to use and retains all of
  the features of Perl's sprintf() (which we like, or perhaps hate, but
  nevertheless are familiar with).
  
  String::Formatter requires you to create a new formatter function first.
  Text::Sprintf::Named also accordingly requires you to instantiate an object
  first. There is currently no way to mix named and positional parameters. And you
  don't get the full features of sprintf().
  
  =head1 HOW IT WORKS
  
  Text::sprintfn works by converting the format string into sprintf format, i.e.
  replacing the named parameters like C<%(foo)s> to something like C<%11$s>.
  
  =head1 DOWNSIDES
  
  Currently the main downside is speed. C<sprintfn()> is about 2-3 orders of
  magnitude slower than C<sprintf()>. See L<Bencher::Scenario::Textsprintfn> for
  benchmarks.
  
  =head1 TIPS AND TRICKS
  
  =head2 Common mistake 1
  
  Writing
  
   %(var)
  
  instead of
  
   %(var)s
  
  =head2 Common mistake 2 (a bit more newbish)
  
  Writing
  
   sprintfn $format, %hash, ...;
  
  instead of
  
   sprintfn $format, \%hash, ...;
  
  =head2 Alternative hashes
  
  You have several hashes (%h1, %h2, %h3) which should be consulted for values.
  You can either merge the hash first:
  
   %h = (%h1, %h2, %h3); # or use some hash merging module
   printfn $format, \%h, ...;
  
  or create a tied hash which can consult hashes for you:
  
   tie %h, 'Your::Module', \%h1, \%h2, \%h3;
   printfn $format, \%h, ...;
  
  =head1 FUNCTIONS
  
  =head2 sprintfn $fmt, \%hash, ...
  
  If first argument after format is not a hash, sprintfn() will behave exactly
  like sprintf().
  
  If hash is given, sprintfn() will look for named parameters in argument and
  supply the values from the hash. Named parameters are surrounded with
  parentheses, i.e. "(NAME)". They can occur in format parameter index:
  
   %2$d        # sprintf version, take argument at index 2
   %(two)d     # $ is optional
   %(two)$d    # same
  
  or in width:
  
   %-10d       # sprintf version, use (minimum) width of 10
   %-(width)d  # like sprintf, but use width from hash key 'width'
   %(var)-(width)d  # format hash key 'var' with width from hash key 'width'
  
  or in precision:
  
   %6.2f       # sprintf version, use precision of 2 decimals
   %6.(prec)f  # like sprintf, but use precision from hash key 'prec'
   %(width).(prec)f
   %(var)(width).(prec)f
  
  The existence of formats using hash keys will not affect indexes of the rest of
  the argument, example:
  
   sprintfn "<%(v1)s> <%2$d> <%d>", {v1=>10}, 0, 1, 2; # "<10> <2> <0>"
  
  Like sprintf(), if format is unknown/erroneous, it will be printed as-is.
  
  There is currently no way to escape ")" in named parameter, e.g.:
  
   %(var containing ))s
  
  =head2 printfn $fmt, ...
  
  Equivalent to: print sprintfn($fmt, ...).
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Text-sprintfn>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Text-sprintfn>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Text-sprintfn>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  sprintf() section on L<perlfunc>
  
  L<String::Formatter>
  
  L<Text::Sprintf::Named>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2019, 2015, 2012, 2011 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
TEXT_SPRINTFN

    $main::fatpacked{"Tie/Cache.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'TIE_CACHE';
  #!/usr/local/bin/perl -w
  
  package Tie::Cache;
  use strict;
  use vars qw(
   $VERSION $Debug $STRUCT_SIZE $REF_SIZE
   $BEFORE $AFTER $KEY $VALUE $BYTES $DIRTY
  );
  
  $VERSION = .21;
  $Debug = 0; # set to 1 for summary, 2 for debug output
  $STRUCT_SIZE = 240; # per cached elem bytes overhead, approximate
  $REF_SIZE    = 16;
  
  # NODE ARRAY STRUCT
  $KEY    = 0;
  $VALUE  = 1;
  $BYTES  = 2;
  $BEFORE = 3;
  $AFTER  = 4;
  $DIRTY  = 5;
  
  =pod
  
  =head1 NAME
  
  Tie::Cache - LRU Cache in Memory
  
  =head1 SYNOPSIS
  
   use Tie::Cache;
   tie %cache, 'Tie::Cache', 100, { Debug => 1 };   
   tie %cache2, 'Tie::Cache', { MaxCount => 100, MaxBytes => 50000 };
   tie %cache3, 'Tie::Cache', 100, { Debug => 1 , WriteSync => 0};   
  
   # Options ##################################################################
   #
   # Debug =>	 0 - DEFAULT, no debugging output
   #		 1 - prints cache statistics upon destroying
   #		 2 - prints detailed debugging info
   #
   # MaxCount =>	 Maximum entries in cache.
   #
   # MaxBytes =>   Maximum bytes taken in memory for cache based on approximate 
   #               size of total cache structure in memory
   #
   #               There is approximately 240 bytes used per key/value pair in the cache for 
   #               the cache data structures, so a cache of 5000 entries would take
   #               at approximately 1.2M plus the size of the data being cached.
   #
   # MaxSize  =>   Maximum size of each cache entry. Larger entries are not cached.
   #                   This helps prevent much of the cache being flushed when 
   #                   you set an exceptionally large entry.  Defaults to MaxBytes/10
   #
   # WriteSync =>  1 - DEFAULT, write() when data is dirtied for 
   #                   TRUE CACHE (see below)
   #               0 - write() dirty data as late as possible, when leaving 
   #                   cache, or when cache is being DESTROY'd
   #
   ############################################################################
  
   # cache supports normal tied hash functions
   $cache{1} = 2;       # STORE
   print "$cache{1}\n"; # FETCH
  
   # FIRSTKEY, NEXTKEY
   while(($k, $v) = each %cache) { print "$k: $v\n"; } 
   
   delete $cache{1};    # DELETE
   %cache = ();         # CLEAR
  
  =head1 DESCRIPTION
  
  This module implements a least recently used (LRU) cache in memory
  through a tie interface.  Any time data is stored in the tied hash,
  that key/value pair has an entry time associated with it, and 
  as the cache fills up, those members of the cache that are
  the oldest are removed to make room for new entries.
  
  So, the cache only "remembers" the last written entries, up to the 
  size of the cache.  This can be especially useful if you access 
  great amounts of data, but only access a minority of the data a 
  majority of the time. 
  
  The implementation is a hash, for quick lookups, 
  overlaying a doubly linked list for quick insertion and deletion.
  On a WinNT PII 300, writes to the hash were done at a rate 
  3100 per second, and reads from the hash at 6300 per second.   
  Work has been done to optimize refreshing cache entries that are 
  frequently read from, code like $cache{entry}, which moves the 
  entry to the end of the linked list internally.
  
  =cut
  
  # Documentation continues at the end of the module.
  
  sub TIEHASH {
      my($class, $max_count, $options) = @_;
  
      if(ref($max_count)) {
  	$options = $max_count;
  	$max_count = $options->{MaxCount};
      }
  	
      unless($max_count || $options->{MaxBytes}) {
  	die('you must specify cache size with either MaxBytes or MaxCount');
      }
  
      my $sync = exists($options->{WriteSync}) ? $options->{WriteSync} : 1;
  
      my $self = bless 
        { 
         # how many items to cache
         max_count=> $max_count, 
         
         # max bytes to cache
         max_bytes => $options->{MaxBytes},
         
         # max size (in bytes) of an individual cache entry
         max_size => $options->{MaxSize} || ($options->{MaxBytes} ? (int($options->{MaxBytes}/10) + 1) : 0),
         
         # class track, so know if overridden subs should be used
         'class'    => $class,
         'subclass' => $class ne 'Tie::Cache' ? 1 : 0,
         
         # current sizes
         count=>0,
         bytes=>0,
         
         # inner structures
         head=>0, 
         tail=>0, 
         nodes=>{},
         'keys'=>[],
         
         # statistics
         hit => 0,
         miss => 0,
         
         # config
         sync => $sync,
         dbg => $options->{Debug} || $Debug
         
         
        }, $class;
      
      if (($self->{max_bytes} && ! $self->{max_size})) {
  	die("MaxSize must be defined when MaxBytes is");
      }
  
      if($self->{max_bytes} and $self->{max_bytes} < 1000) {
  	die("cannot set MaxBytes to under 1000, each raw entry takes $STRUCT_SIZE bytes alone");
      }
  
      if($self->{max_size} && $self->{max_size} < 3) {
  	die("cannot set MaxSize to under 3 bytes, assuming error in config");
      }
  
      $self;
  }
  
  # override to write data leaving cache
  sub write { undef; }
  # commented this section out for speed
  #    my($self, $key, $value) = @_;
  #    1;
  #}
  
  # override to get data if not in cache, should return $value
  # associated with $key
  sub read { undef; }
  # commented this section out for speed
  #    my($self, $key) = @_;
  #    undef;
  #}
  
  sub FETCH {
      my($self, $key) = @_;
  
      my $node = $self->{nodes}{$key};
      if($node) {
  	# refresh node's entry
  	$self->{hit}++; # if $self->{dbg};
  
  	# we used to call delete then insert, but we streamlined code
  	if(my $after = $node->[$AFTER]) {
  	    $self->{dbg} > 1 and $self->print("update() node $node to tail of list");
  	    # reconnect the nodes
  	    my $before = $after->[$BEFORE] = $node->[$BEFORE];
  	    if($before) {
  		$before->[$AFTER] = $after;
  	    } else {
  		$self->{head} = $after;
  	    }
  
  	    # place at the end
  	    $self->{tail}[$AFTER] = $node;
  	    $node->[$BEFORE] = $self->{tail};
  	    $node->[$AFTER] = undef;
  	    $self->{tail} = $node; # always true after this
  	} else {
  	    # if there is nothing after node, then we are at the end already
  	    # so don't do anything to move the nodes around
  	    die("this node is the tail, so something's wrong") 
  		unless($self->{tail} eq $node);
  	}
  
  	$self->print("FETCH [$key, $node->[$VALUE]]") if ($self->{dbg} > 1);
  	$node->[$VALUE];
      } else {
  	# we have a cache miss here
  	$self->{miss}++; # if $self->{dbg};
  
  	# its fine to always insert a node, even when we have an undef,
  	# because even if we aren't a sub-class, we should assume use
  	# that would then set the entry.  This model works well with
  	# sub-classing and reads() that might want to return undef as
  	# a valid value.
  	my $value;
  	if ($self->{subclass}) {
  	    $self->print("read() for key $key") if $self->{dbg} > 1;
  	    $value = $self->read($key);
  	}
  
  	if(defined $value) {
  	    my $length;
  	    if($self->{max_size}) {
  		# check max size of entry, that it not exceed max size
  		$length = &_get_data_length(\$key, \$value);
  		if($length > $self->{max_size}) {
  		    $self->print("direct read() [$key, $value]") if ($self->{dbg} > 1);
  		    return $value;
  		}
  	    }
  	    # if we get here, we should insert the new node
  	    $node = &create_node($self, \$key, \$value, $length);
  	    &insert($self, $node);
  	    $value;
  	} else {
  	    undef;
  	}
      }
  }
  
  sub STORE {
      my($self, $key, $value) = @_;
      my $node;
  
      $self->print("STORE [$key,$value]") if ($self->{dbg} > 1);
  
      # do not cache undefined values
      defined($value) || return(undef);
  
      # check max size of entry, that it not exceed max size
      my $length;
      if($self->{max_size}) {
  	$length = &_get_data_length(\$key, \$value);
  	if($length > $self->{max_size}) {
  	    if ($self->{subclass}) {
  		$self->print("direct write() [$key, $value]") if ($self->{dbg} > 1);
  		$self->write($key, $value);
  	    }
  	    return $value;
  	}
      }
  
      # do we have node already ?
      if($self->{nodes}{$key}) {
  	$node = &delete($self, $key);
  #	$node = &delete($self, $key);
  #	$node->[$VALUE] = $value;
  #	$node->[$BYTES] = $length || &_get_data_length(\$key, \$value);
      }
  
      # insert new node  
      $node = &create_node($self, \$key, \$value, $length);
  #    $node ||= &create_node($self, \$key, \$value, $length);
      &insert($self, $node);
  
      # if the data is sync'd call write now, otherwise defer the data
      # writing, but mark it dirty so it can be cleanup up at the end
      if ($self->{subclass}) {
  	if($self->{sync}) {
  	    $self->print("sync write() [$key, $value]") if $self->{dbg} > 1;
  	    $self->write($key, $value);
  	} else {
  	    $node->[$DIRTY] = 1;
  	}
      }
  
      $value;
  }
  
  sub DELETE {
      my($self, $key) = @_;
  
      $self->print("DELETE $key") if ($self->{dbg} > 1);
      my $node = $self->delete($key);
      $node ? $node->[$VALUE] : undef;
  }
  
  sub CLEAR {
      my($self) = @_;
  
      $self->print("CLEAR CACHE") if ($self->{dbg} > 1);
  
      if($self->{subclass}) {
  	my $flushed = $self->flush();
  	$self->print("FLUSH COUNT $flushed") if ($self->{dbg} > 1);
      }
  
      my $node;
      while($node = $self->{head}) {
  	$self->delete($self->{head}[$KEY]);
      }
  
      1;
  }
  
  sub EXISTS {
      my($self, $key) = @_;
      exists $self->{nodes}{$key};
  }
      
  # firstkey / nextkey emulate keys() and each() behavior by
  # taking a snapshot of all the nodes at firstkey, and 
  # iterating through the keys with nextkey
  #
  # this method therefore will only supports one each() / keys()
  # happening during any given time.
  #
  sub FIRSTKEY {
      my($self) = @_;
  
      $self->{'keys'} = [];
      my $node = $self->{head};
      while($node) {
  	push(@{$self->{'keys'}}, $node->[$KEY]);
  	$node = $node->[$AFTER];
      }
  
      shift @{$self->{'keys'}};
  }
  
  sub NEXTKEY {
      my($self, $lastkey) = @_;
      shift @{$self->{'keys'}};
  }
  
  sub DESTROY {
      my($self) = @_;
  
      # if debugging, snapshot cache before clearing
      if($self->{dbg}) {
  	if($self->{hit} || $self->{miss}) {
  	    $self->{hit_ratio} = 
  		sprintf("%4.3f", $self->{hit} / ($self->{hit} + $self->{miss})); 
  	}
  	$self->print($self->pretty_self());
  	if($self->{dbg} > 1) {
  	    $self->print($self->pretty_chains());
  	}
      }
      
      $self->print("DESTROYING") if $self->{dbg} > 1;
      $self->CLEAR();
      
      1;
  }
  
  ####PERL##LRU##TIE##CACHE##PERL##LRU##TIE##CACHE##PERL##LRU##TIE##CACHE
  ## Helper Routines
  ####PERL##LRU##TIE##CACHE##PERL##LRU##TIE##CACHE##PERL##LRU##TIE##CACHE
  
  # we use scalar_refs for the data for speed
  sub create_node {
      my($self, $key, $value, $length) = @_;
      (defined($$key) && defined($$value)) 
        || die("need more localized data than $$key and $$value");
      
      # max_size always defined when max_bytes is
      if (($self->{max_size})) {
  	$length = defined $length ? $length : &_get_data_length($key, $value)
      } else {
  	$length = 0;
      }
      
      # ORDER SPECIFIC, see top for NODE ARRAY STRUCT
      my $node = [ $$key, $$value, $length ];
  }
  
  sub _get_data_length {
      my($key, $value) = @_;
      my $length = 0;
      my %refs;
  
      my @data = ($$key, $$value);
      while(my $elem = shift @data) {
  	next if $refs{$elem};
  	$refs{$elem} = 1;
  	if(ref $elem && ref($elem) =~ /^(SCALAR|HASH|ARRAY)$/) {
  	    my $type = $1;
  	    $length += $REF_SIZE; # guess, 16 bytes per ref, probably more
  	    if (($type eq 'SCALAR')) {
  		$length += length($$elem);
  	    } elsif (($type eq 'HASH')) {
  		while (my($k,$v) = each %$elem) {
  		    for my $kv($k,$v) {
  			if ((ref $kv)) {
  			    push(@data, $kv);
  			} else {
  			    $length += length($kv);
  			}
  		    }
  		}
  	    } elsif (($type eq 'ARRAY')) {
  		for my $val (@$elem){
  		    if ((ref $val)) {
  			push(@data, $val);
  		    } else {
  			$length += length($val);
  		    }
  		}
  	    }
  	} else {
  	    $length += length($elem);
  	}
      }
  
      $length;
  }
  
  sub insert {
      my($self, $new_node) = @_;
      
      $new_node->[$AFTER] = 0;
      $new_node->[$BEFORE] = $self->{tail};
      $self->print("insert() [$new_node->[$KEY], $new_node->[$VALUE]]") if ($self->{dbg} > 1);
      
      $self->{nodes}{$new_node->[$KEY]} = $new_node;
  
      # current sizes
      $self->{count}++;
      $self->{bytes} += $new_node->[$BYTES] + $STRUCT_SIZE;
  
      if($self->{tail}) {
  	$self->{tail}[$AFTER] = $new_node;
      } else {
  	$self->{head} = $new_node;
      }
      $self->{tail} = $new_node;
  
      ## if we are too big now, remove head
      while(($self->{max_count} && ($self->{count} > $self->{max_count})) ||
  	  ($self->{max_bytes} && ($self->{bytes} > $self->{max_bytes}))) 
      {
  	if($self->{dbg} > 1) {
  	    $self->print("current/max: ".
  			 "bytes ($self->{bytes}/$self->{max_bytes}) ".
  			 "count ($self->{count}/$self->{max_count}) "
  			 );
  	}
  	my $old_node = $self->delete($self->{head}[$KEY]);
  	if ($self->{subclass}) {
  	    if($old_node->[$DIRTY]) {
  		$self->print("dirty write() [$old_node->[$KEY], $old_node->[$VALUE]]") 
  		  if ($self->{dbg} > 1);
  		$self->write($old_node->[$KEY], $old_node->[$VALUE]);
  	    }
  	}
  #	if($self->{dbg} > 1) {
  #	    $self->print("after delete - bytes $self->{bytes}; count $self->{count}");
  #	}
      }
      
      1;
  }
  
  sub delete {
      my($self, $key) = @_;    
      my $node = $self->{nodes}{$key} || return;
  #    return unless $node;
  
      $self->print("delete() [$key, $node->[$VALUE]]") if ($self->{dbg} > 1);
  
      my $before = $node->[$BEFORE];
      my $after = $node->[$AFTER];
  
      #    my($before, $after) = $node->{before,after};
      if($before) {
  	($before->[$AFTER] = $after);
      } else {
  	$self->{head} = $after;
      }
  
      if($after) {
  	($after->[$BEFORE] = $before);
      } else {
  	$self->{tail} = $before;
      }
  
      delete $self->{nodes}{$key};
      $self->{bytes} -= ($node->[$BYTES] + $STRUCT_SIZE);
      $self->{count}--;
      
      $node;
  }
  
  sub flush {
      my $self = shift;
  
      $self->print("FLUSH CACHE") if ($self->{dbg} > 1);
  
      my $node = $self->{head};
      my $flush_count = 0;
      while($node) {
  	if($node->[$DIRTY]) {
  	    $self->print("flush dirty write() [$node->[$KEY], $node->[$VALUE]]") 
  	      if ($self->{dbg} > 1);
  	    $self->write($node->[$KEY], $node->[$VALUE]);
  	    $node->[$DIRTY] = 0;
  	    $flush_count++;
  	}
  	$node = $node->[$AFTER];
      }
  
      $flush_count;
  }
  
  sub print {
      my($self, $msg) = @_;
      print "$self: $msg\n";
  }
  
  sub pretty_self {
      my($self) = @_;
      
      my(@prints);
      for(sort keys %{$self}) { 
  	next unless defined $self->{$_};
  	push(@prints, "$_=>$self->{$_}"); 
      }
  
      "{ " . join(", ", @prints) . " }";
  }
  
  sub pretty_chains {
      my($self) = @_;
      my($str);
      my $k = $self->FIRSTKEY();
  
      $str .= "[head]->";
      my($curr_node) = $self->{head};
      while($curr_node) {
  	$str .= "[$curr_node->[$KEY],$curr_node->[$VALUE]]->";
  	$curr_node = $curr_node->[$AFTER];
      }
      $str .= "[tail]->";
  
      $curr_node = $self->{tail};
      while($curr_node) {
  	$str .= "[$curr_node->[$KEY],$curr_node->[$VALUE]]->";
  	$curr_node = $curr_node->[$BEFORE];
      }
      $str .= "[head]";
  
      $str;
  }
  
  1;
  
  __END__
  
  =head1 INSTALLATION
  
  Tie::Cache installs easily using the make or nmake commands as
  shown below.  Otherwise, just copy Cache.pm to $PERLLIB/site/Tie
  
  	> perl Makefile.PL
  	> make
          > make test 
  	> make install
  
          * use nmake for win32
          ** you can also just copy Cache.pm to $perllib/Tie
  
  =head1 BENCMARKS
  
  There is another simpler LRU cache implementation in CPAN,
  Tie::Cache::LRU, which has the same basic size limiting 
  functionality, and for this functionality, the exact same 
  interface.
  
  Through healthy competition, Michael G Schwern got 
  Tie::Cache::LRU mostly faster than Tie::Cache on reads & writes:
  
   Cache Size 5000       Tie::Cache 0.17  Tie::Cache::LRU 20110205.00
   10000 Writes             0.63 CPU sec          0.47 CPU sec
   40000 Reads              0.79 CPU sec          0.71 CPU sec
   10000 Deletes            0.23 CPU sec          0.26 CPU sec
  
  Unless you are using TRUE CACHE or MaxBytes functionality,
  using Tie::Cache::LRU could be an easy replacement for Tie::Cache.
  
  OTOH one nice thing about this module is its lack of external module dependencies!
  
  =head1 TRUE CACHE
  
  To use class as a true cache, which acts as the sole interface 
  for some data set, subclass the real cache off Tie::Cache, 
  with @ISA = qw( 'Tie::Cache' ) notation.  Then override
  the read() method for behavior when there is a cache miss,
  and the write() method for behavior when the cache's data 
  changes.
  
  When WriteSync is 1 or TRUE (DEFAULT), write() is called immediately
  when data in the cache is modified.  If set to 0, data that has 
  been modified in the cache gets written out when the entries are deleted or
  during the DESTROY phase of the cache object, usually at the end of
  a script.
  
  To have the dirty data write() periodically while WriteSync is set to 0,
  there is a flush() cache API call that will flush the dirty writes
  in this way.  Just call the flush() API like:
  
    my $write_flush_count = tied(%cache)->flush();
  
  The flush() API was added in the .17 release thanks to Rob Bloodgood.
  
  =head1 TRUE CACHE EXAMPLE
  
   use Tie::Cache;
  
   # personalize the Tie::Cache object, by inheriting from it
   package My::Cache;
   @ISA = qw(Tie::Cache);
  
   # override the read() and write() member functions
   # these tell the cache what to do with a cache miss or flush
   sub read { 
      my($self, $key) = @_; 
      print "cache miss for $key, read() data\n";
      rand() * $key; 
   }
   sub write { 
      my($self, $key, $value) = @_;
      print "flushing [$key, $value] from cache, write() data\n";
   }
  
   my $cache_size   = $ARGV[0] || 2;
   my $num_to_cache = $ARGV[1] || 4;   
   my $Debug = $ARGV[2] || 1;
  
   tie %cache, 'My::Cache', $cache_size, {Debug => $Debug};   
  
   # load the cache with new data, each through its contents,
   # and then reload in reverse order.
   for(1..$num_to_cache) { print "read data $_: $cache{$_}\n" }
   while(my($k, $v) = each %cache) { print "each data $k: $v\n"; }
   for(my $i=$num_to_cache; $i>0; $i--) { print "read data $i: $cache{$i}\n"; }
  
   # flush writes now, trivial use since will happen in DESTROY() anyway
   tied(%cache)->flush(); 
  
   # clear cache in 2 ways, write will flush out to disk
   %cache = ();
   undef %cache;
  
  =head1 NOTES
  
  Many thanks to all those who helped me make this module a reality, 
  including:
  
  	:) Tom Hukins who provided me insight and motivation for
  	   finishing this module.
  	:) Jamie McCarthy, for trying to make Tie::Cache be all
  	   that it can be.
  	:) Rob Fugina who knows how to "TRULY CACHE".
  	:) Rob Bloodgood, for the TRUE CACHE flush() API
  
  =head1 AUTHOR
  
  Please send any questions or comments to Joshua Chamas at chamas@alumni.stanford.org
  
  =head1 COPYRIGHT
  
  Copyright (c) 1999-2012 Joshua Chamas, Chamas Enterprises Inc.  
  Sponsored by development on NodeWorks http://nodeworks.com and Web Test.org http://web-test.org
  
  All rights reserved. This program is free software; you can redistribute it and/or modify it under the same 
  terms as Perl itself. 
  
  =cut
  
  
  
  
  
  
TIE_CACHE

    $main::fatpacked{"Tie/IxHash.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'TIE_IXHASH';
  #
  # Tie/IxHash.pm
  #
  # Indexed hash implementation for Perl
  #
  # See below for documentation.
  #
  
  require 5.005;
  
  package Tie::IxHash;
  use strict;
  use integer;
  require Tie::Hash;
  use vars qw/@ISA $VERSION/;
  @ISA = qw(Tie::Hash);
  
  $VERSION = $VERSION = '1.23';
  
  #
  # standard tie functions
  #
  
  sub TIEHASH {
    my($c) = shift;
    my($s) = [];
    $s->[0] = {};   # hashkey index
    $s->[1] = [];   # array of keys
    $s->[2] = [];   # array of data
    $s->[3] = 0;    # iter count
  
    bless $s, $c;
  
    $s->Push(@_) if @_;
  
    return $s;
  }
  
  #sub DESTROY {}           # costly if there's nothing to do
  
  sub FETCH {
    my($s, $k) = (shift, shift);
    return exists( $s->[0]{$k} ) ? $s->[2][ $s->[0]{$k} ] : undef;
  }
  
  sub STORE {
    my($s, $k, $v) = (shift, shift, shift);
    
    if (exists $s->[0]{$k}) {
      my($i) = $s->[0]{$k};
      $s->[1][$i] = $k;
      $s->[2][$i] = $v;
      $s->[0]{$k} = $i;
    }
    else {
      push(@{$s->[1]}, $k);
      push(@{$s->[2]}, $v);
      $s->[0]{$k} = $#{$s->[1]};
    }
  }
  
  sub DELETE {
    my($s, $k) = (shift, shift);
  
    if (exists $s->[0]{$k}) {
      my($i) = $s->[0]{$k};
      for ($i+1..$#{$s->[1]}) {    # reset higher elt indexes
        $s->[0]{ $s->[1][$_] }--;    # timeconsuming, is there is better way?
      }
      if ( $i == $s->[3]-1 ) {
        $s->[3]--;
      }
      delete $s->[0]{$k};
      splice @{$s->[1]}, $i, 1;
      return (splice(@{$s->[2]}, $i, 1))[0];
    }
    return undef;
  }
  
  sub EXISTS {
    exists $_[0]->[0]{ $_[1] };
  }
  
  sub FIRSTKEY {
    $_[0][3] = 0;
    &NEXTKEY;
  }
  
  sub NEXTKEY {
    return $_[0][1][ $_[0][3]++ ] if ($_[0][3] <= $#{ $_[0][1] } );
    return undef;
  }
  
  
  
  #
  #
  # class functions that provide additional capabilities
  #
  #
  
  sub new { TIEHASH(@_) }
  
  sub Clear {
    my $s = shift;
    $s->[0] = {};   # hashkey index
    $s->[1] = [];   # array of keys
    $s->[2] = [];   # array of data
    $s->[3] = 0;    # iter count
    return;
  }
  
  #
  # add pairs to end of indexed hash
  # note that if a supplied key exists, it will not be reordered
  #
  sub Push {
    my($s) = shift;
    while (@_) {
      $s->STORE(shift, shift);
    }
    return scalar(@{$s->[1]});
  }
  
  sub Push2 {
    my($s) = shift;
    $s->Splice($#{$s->[1]}+1, 0, @_);
    return scalar(@{$s->[1]});
  }
  
  #
  # pop last k-v pair
  #
  sub Pop {
    my($s) = shift;
    my($k, $v, $i);
    $k = pop(@{$s->[1]});
    $v = pop(@{$s->[2]});
    if (defined $k) {
      delete $s->[0]{$k};
      return ($k, $v);
    }
    return undef;
  }
  
  sub Pop2 {
    return $_[0]->Splice(-1);
  }
  
  #
  # shift
  #
  sub Shift {
    my($s) = shift;
    my($k, $v, $i);
    $k = shift(@{$s->[1]});
    $v = shift(@{$s->[2]});
    if (defined $k) {
      delete $s->[0]{$k};
      for (keys %{$s->[0]}) {
        $s->[0]{$_}--;
      }
      return ($k, $v);
    }
    return undef;
  }
  
  sub Shift2 {
    return $_[0]->Splice(0, 1);
  }
  
  #
  # unshift
  # if a supplied key exists, it will not be reordered
  #
  sub Unshift {
    my($s) = shift;
    my($k, $v, @k, @v, $len, $i);
  
    while (@_) {
      ($k, $v) = (shift, shift);
      if (exists $s->[0]{$k}) {
        $i = $s->[0]{$k};
        $s->[1][$i] = $k;
        $s->[2][$i] = $v;
        $s->[0]{$k} = $i;
      }
      else {
        push(@k, $k);
        push(@v, $v);
        $len++;
      }
    }
    if (defined $len) {
      for (keys %{$s->[0]}) {
        $s->[0]{$_} += $len;
      }
      $i = 0;
      for (@k) {
        $s->[0]{$_} = $i++;
      }
      unshift(@{$s->[1]}, @k);
      return unshift(@{$s->[2]}, @v);
    }
    return scalar(@{$s->[1]});
  }
  
  sub Unshift2 {
    my($s) = shift;
    $s->Splice(0,0,@_);
    return scalar(@{$s->[1]});
  }
  
  #
  # splice 
  #
  # any existing hash key order is preserved. the value is replaced for
  # such keys, and the new keys are spliced in the regular fashion.
  #
  # supports -ve offsets but only +ve lengths
  #
  # always assumes a 0 start offset
  #
  sub Splice {
    my($s, $start, $len) = (shift, shift, shift);
    my($k, $v, @k, @v, @r, $i, $siz);
    my($end);                   # inclusive
  
    # XXX  inline this 
    ($start, $end, $len) = $s->_lrange($start, $len);
  
    if (defined $start) {
      if ($len > 0) {
        my(@k) = splice(@{$s->[1]}, $start, $len);
        my(@v) = splice(@{$s->[2]}, $start, $len);
        while (@k) {
          $k = shift(@k);
          delete $s->[0]{$k};
          push(@r, $k, shift(@v));
        }
        for ($start..$#{$s->[1]}) {
          $s->[0]{$s->[1][$_]} -= $len;
        }
      }
      while (@_) {
        ($k, $v) = (shift, shift);
        if (exists $s->[0]{$k}) {
          #      $s->STORE($k, $v);
          $i = $s->[0]{$k};
          $s->[1][$i] = $k;
          $s->[2][$i] = $v;
          $s->[0]{$k} = $i;
        }
        else {
          push(@k, $k);
          push(@v, $v);
          $siz++;
        }
      }
      if (defined $siz) {
        for ($start..$#{$s->[1]}) {
          $s->[0]{$s->[1][$_]} += $siz;
        }
        $i = $start;
        for (@k) {
          $s->[0]{$_} = $i++;
        }
        splice(@{$s->[1]}, $start, 0, @k);
        splice(@{$s->[2]}, $start, 0, @v);
      }
    }
    return @r;
  }
  
  #
  # delete elements specified by key
  # other elements higher than the one deleted "slide" down 
  #
  sub Delete {
    my($s) = shift;
  
    for (@_) {
      #
      # XXX potential optimization: could do $s->DELETE only if $#_ < 4.
      #     otherwise, should reset all the hash indices in one loop
      #
      $s->DELETE($_);
    }
  }
  
  #
  # replace hash element at specified index
  #
  # if the optional key is not supplied the value at index will simply be 
  # replaced without affecting the order.
  #
  # if an element with the supplied key already exists, it will be deleted first.
  #
  # returns the key of replaced value if it succeeds.
  #
  sub Replace {
    my($s) = shift;
    my($i, $v, $k) = (shift, shift, shift);
    if (defined $i and $i <= $#{$s->[1]} and $i >= 0) {
      if (defined $k) {
        delete $s->[0]{ $s->[1][$i] };
        $s->DELETE($k) ; #if exists $s->[0]{$k};
        $s->[1][$i] = $k;
        $s->[2][$i] = $v;
        $s->[0]{$k} = $i;
        return $k;
      }
      else {
        $s->[2][$i] = $v;
        return $s->[1][$i];
      }
    }
    return undef;
  }
  
  #
  # Given an $start and $len, returns a legal start and end (where start <= end)
  # for the current hash. 
  # Legal range is defined as 0 to $#s+1
  # $len defaults to number of elts upto end of list
  #
  #          0   1   2   ...
  #          | X | X | X ... X | X | X |
  #                           -2  -1       (no -0 alas)
  # X's above are the elements 
  #
  sub _lrange {
    my($s) = shift;
    my($offset, $len) = @_;
    my($start, $end);         # both inclusive
    my($size) = $#{$s->[1]}+1;
  
    return undef unless defined $offset;
    if($offset < 0) {
      $start = $offset + $size;
      $start = 0 if $start < 0;
    }
    else {
      ($offset > $size) ? ($start = $size) : ($start = $offset);
    }
  
    if (defined $len) {
      $len = -$len if $len < 0;
      $len = $size - $start if $len > $size - $start;
    }
    else {
      $len = $size - $start;
    }
    $end = $start + $len - 1;
  
    return ($start, $end, $len);
  }
  
  #
  # Return keys at supplied indices
  # Returns all keys if no args.
  #
  sub Keys   { 
    my($s) = shift;
    return ( @_ == 1
  	 ? $s->[1][$_[0]]
  	 : ( @_
  	   ? @{$s->[1]}[@_]
  	   : @{$s->[1]} ) );
  }
  
  #
  # Returns values at supplied indices
  # Returns all values if no args.
  #
  sub Values {
    my($s) = shift;
    return ( @_ == 1
  	 ? $s->[2][$_[0]]
  	 : ( @_
  	   ? @{$s->[2]}[@_]
  	   : @{$s->[2]} ) );
  }
  
  #
  # get indices of specified hash keys
  #
  sub Indices { 
    my($s) = shift;
    return ( @_ == 1 ? $s->[0]{$_[0]} : @{$s->[0]}{@_} );
  }
  
  #
  # number of k-v pairs in the ixhash
  # note that this does not equal the highest index
  # owing to preextended arrays
  #
  sub Length {
   return scalar @{$_[0]->[1]};
  }
  
  #
  # Reorder the hash in the supplied key order
  #
  # warning: any unsupplied keys will be lost from the hash
  # any supplied keys that dont exist in the hash will be ignored
  #
  sub Reorder {
    my($s) = shift;
    my(@k, @v, %x, $i);
    return unless @_;
  
    $i = 0;
    for (@_) {
      if (exists $s->[0]{$_}) {
        push(@k, $_);
        push(@v, $s->[2][ $s->[0]{$_} ] );
        $x{$_} = $i++;
      }
    }
    $s->[1] = \@k;
    $s->[2] = \@v;
    $s->[0] = \%x;
    return $s;
  }
  
  sub SortByKey {
    my($s) = shift;
    $s->Reorder(sort $s->Keys);
  }
  
  sub SortByValue {
    my($s) = shift;
    $s->Reorder(sort { $s->FETCH($a) cmp $s->FETCH($b) } $s->Keys)
  }
  
  1;
  __END__
  
  =head1 NAME
  
  Tie::IxHash - ordered associative arrays for Perl
  
  
  =head1 SYNOPSIS
  
      # simple usage
      use Tie::IxHash;
      tie HASHVARIABLE, 'Tie::IxHash' [, LIST];
  
      # OO interface with more powerful features
      use Tie::IxHash;
      TIEOBJECT = Tie::IxHash->new( [LIST] );
      TIEOBJECT->Splice( OFFSET [, LENGTH [, LIST]] );
      TIEOBJECT->Push( LIST );
      TIEOBJECT->Pop;
      TIEOBJECT->Shift;
      TIEOBJECT->Unshift( LIST );
      TIEOBJECT->Keys( [LIST] );
      TIEOBJECT->Values( [LIST] );
      TIEOBJECT->Indices( LIST );
      TIEOBJECT->Delete( [LIST] );
      TIEOBJECT->Replace( OFFSET, VALUE, [KEY] );
      TIEOBJECT->Reorder( LIST );
      TIEOBJECT->SortByKey;
      TIEOBJECT->SortByValue;
      TIEOBJECT->Length;
  
  
  =head1 DESCRIPTION
  
  This Perl module implements Perl hashes that preserve the order in which the
  hash elements were added.  The order is not affected when values
  corresponding to existing keys in the IxHash are changed.  The elements can
  also be set to any arbitrary supplied order.  The familiar perl array
  operations can also be performed on the IxHash.
  
  
  =head2 Standard C<TIEHASH> Interface
  
  The standard C<TIEHASH> mechanism is available. This interface is 
  recommended for simple uses, since the usage is exactly the same as
  regular Perl hashes after the C<tie> is declared.
  
  
  =head2 Object Interface
  
  This module also provides an extended object-oriented interface that can be
  used for more powerful operations with the IxHash.  The following methods
  are available:
  
  =over 8
  
  =item FETCH, STORE, DELETE, EXISTS
  
  These standard C<TIEHASH> methods mandated by Perl can be used directly.
  See the C<tie> entry in perlfunc(1) for details.
  
  =item Push, Pop, Shift, Unshift, Splice
  
  These additional methods resembling Perl functions are available for
  operating on key-value pairs in the IxHash. The behavior is the same as the
  corresponding perl functions, except when a supplied hash key already exists
  in the hash. In that case, the existing value is updated but its order is
  not affected.  To unconditionally alter the order of a supplied key-value
  pair, first C<DELETE> the IxHash element.
  
  =item Keys
  
  Returns an array of IxHash element keys corresponding to the list of supplied
  indices.  Returns an array of all the keys if called without arguments.
  Note the return value is mostly only useful when used in a list context
  (since perl will convert it to the number of elements in the array when
  used in a scalar context, and that may not be very useful).
  
  If a single argument is given, returns the single key corresponding to
  the index.  This is usable in either scalar or list context.
  
  =item Values
  
  Returns an array of IxHash element values corresponding to the list of supplied
  indices.  Returns an array of all the values if called without arguments.
  Note the return value is mostly only useful when used in a list context
  (since perl will convert it to the number of elements in the array when
  used in a scalar context, and that may not be very useful).
  
  If a single argument is given, returns the single value corresponding to
  the index.  This is usable in either scalar or list context.
  
  =item Indices
  
  Returns an array of indices corresponding to the supplied list of keys.
  Note the return value is mostly only useful when used in a list context
  (since perl will convert it to the number of elements in the array when
  used in a scalar context, and that may not be very useful).
  
  If a single argument is given, returns the single index corresponding to
  the key.  This is usable in either scalar or list context.
  
  =item Delete
  
  Removes elements with the supplied keys from the IxHash.
  
  =item Replace
  
  Substitutes the IxHash element at the specified index with the supplied
  value-key pair.  If a key is not supplied, simply substitutes the value at
  index with the supplied value. If an element with the supplied key already
  exists, it will be removed from the IxHash first.
  
  =item Reorder
  
  This method can be used to manipulate the internal order of the IxHash
  elements by supplying a list of keys in the desired order.  Note however,
  that any IxHash elements whose keys are not in the list will be removed from
  the IxHash.
  
  =item Length
  
  Returns the number of IxHash elements.
  
  =item SortByKey
  
  Reorders the IxHash elements by textual comparison of the keys.
  
  =item SortByValue
  
  Reorders the IxHash elements by textual comparison of the values.
  
  =item Clear
  
  Resets the IxHash to its pristine state: with no elements at all.
  
  =back
  
  
  =head1 EXAMPLE
  
      use Tie::IxHash;
  
      # simple interface
      $t = tie(%myhash, 'Tie::IxHash', 'a' => 1, 'b' => 2);
      %myhash = (first => 1, second => 2, third => 3);
      $myhash{fourth} = 4;
      @keys = keys %myhash;
      @values = values %myhash;
      print("y") if exists $myhash{third};
  
      # OO interface
      $t = Tie::IxHash->new(first => 1, second => 2, third => 3);
      $t->Push(fourth => 4); # same as $myhash{'fourth'} = 4;
      ($k, $v) = $t->Pop;    # $k is 'fourth', $v is 4
      $t->Unshift(neg => -1, zeroth => 0); 
      ($k, $v) = $t->Shift;  # $k is 'neg', $v is -1
      @oneandtwo = $t->Splice(1, 2, foo => 100, bar => 101);
  
      @keys = $t->Keys;
      @values = $t->Values;
      @indices = $t->Indices('foo', 'zeroth');
      @itemkeys = $t->Keys(@indices);
      @itemvals = $t->Values(@indices);
      $t->Replace(2, 0.3, 'other');
      $t->Delete('second', 'zeroth');
      $len = $t->Length;     # number of key-value pairs
  
      $t->Reorder(reverse @keys);
      $t->SortByKey;
      $t->SortByValue;
  
  
  =head1 BUGS
  
  You cannot specify a negative length to C<Splice>. Negative indexes are OK,
  though.
  
  
  =head1 NOTE
  
  Indexing always begins at 0 (despite the current C<$[> setting) for 
  all the functions.
  
  
  =head1 TODO
  
  Addition of elements with keys that already exist to the end of the IxHash
  must be controlled by a switch.
  
  Provide C<TIEARRAY> interface when it stabilizes in Perl.
  
  Rewrite using XSUBs for efficiency.
  
  
  =head1 AUTHOR
  
  Gurusamy Sarathy        gsar@umich.edu
  
  Copyright (c) 1995 Gurusamy Sarathy. All rights reserved.
  This program is free software; you can redistribute it and/or
  modify it under the same terms as Perl itself.
  
  
  =head1 VERSION
  
  Version 1.23
  
  
  =head1 SEE ALSO
  
  perl(1)
  
  =cut
TIE_IXHASH

    $main::fatpacked{"Time/Duration.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'TIME_DURATION';
  package Time::Duration;
  $Time::Duration::VERSION = '1.21';
  use 5.006;
  use strict;
  use warnings;
  use constant DEBUG => 0;
  
  require Exporter;
  
  our @ISA         = ('Exporter');
  our @EXPORT      = qw( later later_exact earlier earlier_exact
                         ago ago_exact from_now from_now_exact
                         duration duration_exact
                         concise
                       );
  our @EXPORT_OK   = ('interval', @EXPORT);
  our $MILLISECOND = 0;
  
  # ALL SUBS ARE PURE FUNCTIONS
  
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  
  sub concise ($) {
    my $string = $_[0];
    DEBUG and print "in : $string\n";
    $string =~ tr/,//d;
    $string =~ s/\band\b//;
    $string =~ s/\b(year|day|hour|minute|second)s?\b/substr($1,0,1)/eg;
    $string =~ s/\b(millisecond)s?\b/ms/g;
    $string =~ s/\s*(\d+)\s*/$1/g;
    return $string;
  }
  
  sub later          { interval(      $_[0], $_[1], ' earlier',  ' later',    'right then'); }
  sub later_exact    { interval_exact($_[0], $_[1], ' earlier',  ' later',    'right then'); }
  sub earlier        { interval(      $_[0], $_[1], ' later',    ' earlier',  'right then'); }
  sub earlier_exact  { interval_exact($_[0], $_[1], ' later',    ' earlier',  'right then'); }
  sub ago            { interval(      $_[0], $_[1], ' from now', ' ago',      'right now');  }
  sub ago_exact      { interval_exact($_[0], $_[1], ' from now', ' ago',      'right now');  }
  sub from_now       { interval(      $_[0], $_[1], ' ago',      ' from now', 'right now');  }
  sub from_now_exact { interval_exact($_[0], $_[1], ' ago',      ' from now', 'right now');  }
  
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  sub duration_exact {
    my $span = $_[0];   # interval in seconds
    my $precision = int($_[1] || 0) || 2;  # precision (default: 2)
    return '0 seconds' unless $span;
    _render('',
            _separate(abs $span));
  }
  
  sub duration {
    my $span = $_[0];   # interval in seconds
    my $precision = int($_[1] || 0) || 2;  # precision (default: 2)
    return '0 seconds' unless $span;
    _render('',
            _approximate($precision,
                         _separate(abs $span)));
  }
  
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  
  sub interval_exact {
    my $span = $_[0];                    # interval, in seconds
                                         # precision is ignored
    my $direction = ($span < 0) ? $_[2]  # what a neg number gets
                  : ($span > 0) ? $_[3]  # what a pos number gets
                  : return        $_[4]; # what zero gets
    _render($direction,
            _separate($span));
  }
  
  sub interval {
    my $span = $_[0];                     # interval, in seconds
    my $precision = int($_[1] || 0) || 2; # precision (default: 2)
    my $direction = ($span < 0) ? $_[2]   # what a neg number gets
                  : ($span > 0) ? $_[3]   # what a pos number gets
                  : return        $_[4];  # what zero gets
    _render($direction,
            _approximate($precision,
                         _separate($span)));
  }
  
  #~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#
  #
  # The actual figuring is below here
  
  use constant MINUTE => 60;
  use constant HOUR => 3600;
  use constant DAY  => 24 * HOUR;
  use constant YEAR => 365 * DAY;
  
  sub _separate {
    # Breakdown of seconds into units, starting with the most significant
    
    my $remainder = abs $_[0]; # remainder
    my $this; # scratch
    my @wheel; # retval
    
    # Years:
    $this = int($remainder / (365 * 24 * 60 * 60));
    push @wheel, ['year', $this, 1_000_000_000];
    $remainder -= $this * (365 * 24 * 60 * 60);
      
    # Days:
    $this = int($remainder / (24 * 60 * 60));
    push @wheel, ['day', $this, 365];
    $remainder -= $this * (24 * 60 * 60);
      
    # Hours:
    $this = int($remainder / (60 * 60));
    push @wheel, ['hour', $this, 24];
    $remainder -= $this * (60 * 60);
    
    # Minutes:
    $this = int($remainder / 60);
    push @wheel, ['minute', $this, 60];
    $remainder -= $this * 60;
    
    push @wheel, ['second', int($remainder), 60];
  
  	# Thanks to Steven Haryanto (http://search.cpan.org/~sharyanto/) for the basis of this change.
  	if ($MILLISECOND) {
  		$remainder -= int($remainder);
  		push @wheel, ['millisecond', sprintf("%0.f", $remainder * 1000), 1000];
  	}
  
    return @wheel;
  }
  
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  sub _approximate {
    # Now nudge the wheels into an acceptably (im)precise configuration
    my($precision, @wheel) = @_;
  
   Fix:
    {
      # Constraints for leaving this block:
      #  1) number of nonzero wheels must be <= $precision
      #  2) no wheels can be improperly expressed (like having "60" for mins)
    
      my $nonzero_count = 0;
      my $improperly_expressed;
  
      DEBUG and print join ' ', '#', (map "${$_}[1] ${$_}[0]",  @wheel), "\n";
      for(my $i = 0; $i < @wheel; $i++) {
        my $this = $wheel[$i];
        next if $this->[1] == 0; # Zeros require no attention.
        ++$nonzero_count;
        next if $i == 0; # the years wheel is never improper or over any limit; skip
        
        if($nonzero_count > $precision) {
          # This is one nonzero wheel too many!
          DEBUG and print '', $this->[0], " is one nonzero too many!\n";
  
          # Incr previous wheel if we're big enough:
          if($this->[1] >= ($this->[-1] / 2)) {
            DEBUG and printf "incrementing %s from %s to %s\n",
             $wheel[$i-1][0], $wheel[$i-1][1], 1 + $wheel[$i-1][1], ;
            ++$wheel[$i-1][1];
          }
  
          # Reset this and subsequent wheels to 0:
          for(my $j = $i; $j < @wheel; $j++) { $wheel[$j][1] = 0 }
          redo Fix; # Start over.
        } elsif($this->[1] >= $this->[-1]) {
          # It's an improperly expressed wheel.  (Like "60" on the mins wheel)
          $improperly_expressed = $i;
          DEBUG and print '', $this->[0], ' (', $this->[1], 
             ") is improper!\n";
        }
      }
      
      if(defined $improperly_expressed) {
        # Only fix the least-significant improperly expressed wheel (at a time).
        DEBUG and printf "incrementing %s from %s to %s\n",
         $wheel[$improperly_expressed-1][0], $wheel[$improperly_expressed-1][1], 
          1 + $wheel[$improperly_expressed-1][1], ;
        ++$wheel[ $improperly_expressed - 1][1];
        $wheel[ $improperly_expressed][1] = 0;
        # We never have a "150" in the minutes slot -- if it's improper,
        #  it's only by having been rounded up to the limit.
        redo Fix; # Start over.
      }
      
      # Otherwise there's not too many nonzero wheels, and there's no
      #  improperly expressed wheels, so fall thru...
    }
  
    return @wheel;
  }
  
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  sub _render {
    # Make it into English
  
    my $direction = shift @_;
    my @wheel = map
          {;
              (  $_->[1] == 0) ? ()  # zero wheels
              : ($_->[1] == 1) ? "${$_}[1] ${$_}[0]"  # singular
              :                  "${$_}[1] ${$_}[0]s" # plural
          }
          @_
    ;
    return "just now" unless @wheel; # sanity
    $wheel[-1] .= $direction;
    return $wheel[0] if @wheel == 1;
    return "$wheel[0] and $wheel[1]" if @wheel == 2;
    $wheel[-1] = "and $wheel[-1]";
    return join q{, }, @wheel;
  }
  
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  1;
  
  __END__
  
  so "1y 0d 1h 50m 50s", N=3, so you round at minutes to "1y 0d 1h 51m 0s",
  #That's okay, so fall thru.
  
  so "1y 1d 0h 59m 50s", N=3, so you round at minutes to "1y 1d 0h 60m 0s",
  but that's not improperly expressed, so you loop around and get
  "1y 1d 1h 0m 0s", which is short enough, and is properly expressed.
  
  =head1 NAME
  
  Time::Duration - rounded or exact English expression of durations
  
  =head1 SYNOPSIS
  
  Example use in a program that ends by noting its runtime:
  
    my $start_time = time();
    use Time::Duration;
    
    # then things that take all that time, and then ends:
    print "Runtime ", duration(time() - $start_time), ".\n";
  
  Example use in a program that reports age of a file:
  
    use Time::Duration;
    my $file = 'that_file';
    my $age = $^T - (stat($file))[9];  # 9 = modtime
    print "$file was modified ", ago($age);
  
  =head1 DESCRIPTION
  
  This module provides functions for expressing durations in rounded or exact
  terms.
  
  
  In the first example in the Synopsis, using duration($interval_seconds):
  
  If the C<time() - $start_time> is 3 seconds, this prints
  "Runtime: B<3 seconds>.".  If it's 0 seconds, it's "Runtime: B<0 seconds>.".
  If it's 1 second, it's "Runtime: B<1 second>.".  If it's 125 seconds, you
  get "Runtime: B<2 minutes and 5 seconds>.".  If it's 3820 seconds (which
  is exactly 1h, 3m, 40s), you get it rounded to fit within two expressed
  units: "Runtime: B<1 hour and 4 minutes>.".  Using duration_exact instead
  would return "Runtime: B<1 hour, 3 minutes, and 40 seconds>".
  
  In the second example in the Synopsis, using ago($interval_seconds):
  
  If the $age is 3 seconds, this prints
  "I<file> was modified B<3 seconds ago>".  If it's 0 seconds, it's
  "I<file> was modified B<just now>", as a special case.  If it's 1 second,
  it's "from B<1 second ago>".  If it's 125 seconds, you get "I<file> was
  modified B<2 minutes and 5 seconds ago>".  If it's 3820 seconds (which
  is exactly 1h, 3m, 40s), you get it rounded to fit within two expressed
  units: "I<file> was modified B<1 hour and 4 minutes ago>".  
  Using ago_exact instead
  would return "I<file> was modified B<1 hour, 3 minutes, and 40 seconds
  ago>".  And if the file's
  modtime is, surprisingly, three seconds into the future, $age is -3,
  and you'll get the equally and appropriately surprising
  "I<file> was modified B<3 seconds from now>."
  
  =head1 MILLISECOND MODE
  
  By default, this module assumes input is an integer representing number
  of seconds and only emits results based on the integer part of any
  floating-point values passed to it.  However, if you set the variable
  C<$Time::Duration::MILLISECOND> to any true value, then the methods will
  interpret inputs as floating-point numbers and will emit results containing
  information about the number of milliseconds in the value.
  
  For example, C<duration(1.021)> will return B<1 second and 21 milliseconds>
  in this mode.
  
  Millisecond mode is not enabled by default because this module sees heavy use
  and existing users of it may be relying on its implicit truncation of non-integer
  arguments.
  
  
  =head1 FUNCTIONS
  
  This module provides all the following functions, which are all exported
  by default when you call C<use Time::Duration;>.
  
  
  =over
  
  =item duration($seconds)
  
  =item duration($seconds, $precision)
  
  Returns English text expressing the approximate time duration 
  of abs($seconds), with at most S<C<$precision || 2>> expressed units.
  (That is, duration($seconds) is the same as duration($seconds,2).)
  
  For example, duration(120) or duration(-120) is "2 minutes".  And
  duration(0) is "0 seconds".
  
  The precision figure means that no more than that many units will
  be used in expressing the time duration.  For example,
  31,629,659 seconds is a duration of I<exactly>
  1 year, 1 day, 2 hours, and 59 seconds (assuming 1 year = exactly
  365 days, as we do assume in this module).  However, if you wanted
  an approximation of this to at most two expressed (i.e., nonzero) units, it
  would round it and truncate it to "1 year and 1 day".  Max of 3 expressed
  units would get you "1 year, 1 day, and 2 hours".  Max of 4 expressed
  units would get you "1 year, 1 day, 2 hours, and 59 seconds",
  which happens to be exactly true.  Max of 5 (or more) expressed units
  would get you the same, since there are only four nonzero units possible
  in for that duration.
  
  =item duration_exact($seconds)
  
  Same as duration($seconds), except that the returned value is an exact
  (unrounded) expression of $seconds.  For example, duration_exact(31629659)
  returns "1 year, 1 day, 2 hours, and 59 seconds later",
  which is I<exactly> true.
  
  
  =item ago($seconds)
  
  =item ago($seconds, $precision)
  
  For a positive value of seconds, this prints the same as
  C<duration($seconds, [$precision]) . S<' ago'>>.  For example,
  ago(120) is "2 minutes ago".  For a negative value of seconds,
  this prints the same as
  C<duration($seconds, [$precision]) . S<' from now'>>.  For example,
  ago(-120) is "2 minutes from now".  As a special case, ago(0)
  returns "right now".
  
  =item ago_exact($seconds)
  
  Same as ago($seconds), except that the returned value is an exact
  (unrounded) expression of $seconds.
  
  
  =item from_now($seconds)
  
  =item from_now($seconds, $precision)
  
  =item from_now_exact($seconds)
  
  The same as ago(-$seconds), ago(-$seconds, $precision), 
  ago_exact(-$seconds).  For example, from_now(120) is "2 minutes from now".
  
  
  =item later($seconds)
  
  =item later($seconds, $precision)
  
  For a positive value of seconds, this prints the same as
  C<duration($seconds, [$precision]) . S<' later'>>.  For example,
  ago(120) is "2 minutes later".  For a negative value of seconds,
  this prints the same as
  C<duration($seconds, [$precision]) . S<' earlier'>>.  For example,
  later(-120) is "2 minutes earlier".  As a special case, later(0)
  returns "right then".
  
  =item later_exact($seconds)
  
  Same as later($seconds), except that the returned value is an exact
  (unrounded) expression of $seconds.
  
  =item earlier($seconds)
  
  =item earlier($seconds, $precision)
  
  =item earlier_exact($seconds)
  
  The same as later(-$seconds), later(-$seconds, $precision), 
  later_exact(-$seconds).  For example, earlier(120) is "2 minutes earlier".
  
  
  =item concise( I<function(> ... ) )
  
  Concise takes the string output of one of the above functions and makes
  it more concise.  For example, 
  C<< ago(4567) >> returns "1 hour and 16 minutes ago", but
  C<< concise(ago(4567)) >> returns "1h16m ago".
  
  =back
  
  
  
  =head1 I18N/L10N NOTES
  
  Little of the internals of this module are English-specific.  See source
  and/or contact me if you're interested in making a localized version
  for some other language than English.
  
  
  
  =head1 BACKSTORY
  
  I wrote the basic C<ago()> function for use in Infobot
  (C<http://www.infobot.org>), because I was tired of this sort of
  response from the Purl Infobot:
  
    me> Purl, seen Woozle?
    <Purl> Woozle was last seen on #perl 20 days, 7 hours, 32 minutes
    and 40 seconds ago, saying: Wuzzle!
  
  I figured if it was 20 days ago, I don't care about the seconds.  So
  once I had written C<ago()>, I abstracted the code a bit and got
  all the other functions.
  
  
  =head1 CAVEAT
  
  This module calls a durational "year" an interval of exactly 365
  days of exactly 24 hours each, with no provision for leap years or
  monkey business with 23/25 hour days (much less leap seconds!).  But
  since the main work of this module is approximation, that shouldn't
  be a great problem for most purposes.
  
  
  =head1 SEE ALSO
  
  L<Time::Elapsed> - similarly converts durations to natural language,
  but in addition to English also supports Danish, German, French, and Turkish.
  
  L<Date::Interval|Date::Interval>, which is similarly named, but does
  something rather different.
  
  I<Star Trek: The Next Generation> (1987-1994), where the character
  Data would express time durations like
  "1 year, 20 days, 22 hours, 59 minutes, and 35 seconds"
  instead of rounding to "1 year and 21 days".  This is because no-one
  ever told him to use Time::Duration.
  
  
  
  =head1 COPYRIGHT AND DISCLAIMER
  
  Copyright 2013, Sean M. Burke C<sburke@cpan.org>; Avi Finkel,
  C<avi@finkel.org>, all rights reserved.  This program is free
  software; you can redistribute it and/or modify it under the
  same terms as Perl itself.
  
  This program is distributed in the hope that it will be useful,
  but without any warranty; without even the implied warranty of
  merchantability or fitness for a particular purpose.
  
  =head1 AUTHOR
  
  Original author Sean M. Burke, C<sburke@cpan.org>.
  
  Then maintained by Avi Finkel, C<avi@finkel.org>.
  
  Currently maintained by Neil Bowers, C<neilb@cpan.org>.
  
  =cut
  
  
TIME_DURATION

    $main::fatpacked{"Time/Duration/Parse/AsHash.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'TIME_DURATION_PARSE_ASHASH';
  package Time::Duration::Parse::AsHash;
  
  our $DATE = '2017-01-02'; # DATE
  our $VERSION = '0.10.6'; # VERSION
  
  #IFUNBUILT
  # # use strict;
  # # use warnings;
  #END IFUNBUILT
  
  use Exporter;
  our @ISA    = qw( Exporter );
  our @EXPORT = qw( parse_duration );
  
  my %Units = ( map(($_, "nanoseconds" ), qw(ns nanosecond nanoseconds)),
                map(($_, "milliseconds"), qw(ms millisecond milliseconds milisecond miliseconds)),
                map(($_, "microseconds"), qw(microsecond microseconds)),
                map(($_, "seconds"), qw(s second seconds sec secs)),
                map(($_, "minutes"), qw(m minute minutes min mins)),
                map(($_,   "hours"), qw(h hr hour hours)),
                map(($_,    "days"), qw(d day days)),
                map(($_,   "weeks"), qw(w week weeks)),
                map(($_,  "months"), qw(M month months mon mons mo mos)),
                map(($_,   "years"), qw(y year years)),
                map(($_, "decades"), qw(decade decades)),
            );
  my %Converts = (
      nanoseconds  => ["seconds" => 1e-9],
      microseconds => ["seconds" => 1e-6],
      milliseconds => ["seconds" => 1e-3],
      decades      => ["years"   => 10],
  );
  
  sub parse_duration {
      my $timespec = shift;
  
      # You can have an optional leading '+', which has no effect
      $timespec =~ s/^\s*\+\s*//;
  
      # Treat a plain number as a number of seconds (and parse it later)
      if ($timespec =~ /^\s*(-?\d+(?:[.,]\d+)?)\s*$/) {
          $timespec = "$1s";
      }
  
      # Convert hh:mm(:ss)? to something we understand
      $timespec =~ s/\b(\d+):(\d\d):(\d\d(?:\.\d+)?)\b/$1h $2m $3s/g;
      $timespec =~ s/\b(\d+):(\d\d)\b/$1h $2m/g;
  
      my %res;
      while ($timespec =~ s/^\s*(-?\d+(?:[.,]\d+)?)\s*([a-zA-Z]+)(?:\s*(?:,|and)\s*)*//i) {
          my($amount, $unit) = ($1, $2);
          $unit = lc($unit) unless length($unit) == 1;
  
          if (my $canon_unit = $Units{$unit}) {
              $amount =~ s/,/./;
              if (my $convert = $Converts{$canon_unit}) {
                  $canon_unit = $convert->[0];
                  $amount *= $convert->[1];
              }
              $res{$canon_unit} += $amount;
          } else {
              die "Unknown timespec: $1 $2";
          }
      }
  
      if ($timespec =~ /\S/) {
          die "Unknown timespec: $timespec";
      }
  
      for (keys %res) {
          delete $res{$_} if $res{$_} == 0;
      }
  
      if ($_[0]) {
          return
              ( $res{seconds} || 0) +
              (($res{minutes} || 0) *        60) +
              (($res{hours}   || 0) *      3600) +
              (($res{days}    || 0) *     86400) +
              (($res{weeks}   || 0) *   7*86400) +
              (($res{months}  || 0) *  30*86400) +
              (($res{years}   || 0) * 365*86400);
      }
  
      \%res;
  }
  
  1;
  # ABSTRACT: Parse string that represents time duration
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Time::Duration::Parse::AsHash - Parse string that represents time duration
  
  =head1 VERSION
  
  version 0.10.6
  
  =head1 SYNOPSIS
  
   use Time::Duration::Parse::AsHash;
  
   my $res = parse_duration("2 minutes and 3 seconds");    # => {minutes=>2, seconds=>3}
      $res = parse_duration("2m3.2s", 1); # => 123.2
  
      $res = parse_duration("01:02:03", 1); # => 3723
  
  =head1 DESCRIPTION
  
  Time::Duration::Parse::AsHash is like L<Time::Duration::Parse> except:
  
  =over
  
  =item * By default it returns a hashref of parsed duration elements instead of number of seconds
  
  There are some circumstances when you want this, e.g. when feeding into
  L<DateTime::Duration> and you want to count for leap seconds.
  
  To return number of seconds like Time::Duration::Parse, pass a true value as the
  second argument.
  
  =item * By default seconds are not rounded
  
  For example: C<"0.1s"> or C<100ms> will return result C<< { seconds => 0.1 } >>,
  and C<"2.3s"> will return C<< { seconds => 2.3 } >>.
  
  Also, <01:02:03> being recognized as C<1h2min3s>,
  C<01:02:03.4567> will also be recognized as C<1h2min3.4567s>.
  
  =item * It recognizes more duration units
  
  C<milliseconds> (C<ms>), which will be returned in the C<seconds> key, for
  example C<"400ms"> returns C<< { seconds => 0.4 } >>.
  
  C<microseconds>. This will also be returned in C<seconds> key.
  
  C<nanoseconds> (C<ns>). This will also be returned in C<seconds> key.
  
  C<decades>. This will be returned in C<years> key, for example C<"1.5 decades">
  will return C<< { years => 15 } >>.
  
  =item * It has a lower startup overhead
  
  By avoiding modules like L<Carp> and L<Exporter::Lite>, even L<strict> and
  L<warnings> (starts up in ~3m vs ~9ms on my computer).
  
  =back
  
  =head1 FUNCTIONS
  
  =head2 parse_duration($str [, $as_secs ]) => hash
  
  Parses duration string and returns hash (unless when the second argument is
  true, in which case will return the number of seconds). Dies on parse failure.
  
  Currently two forms of string are recognized: the first is a series of number
  and time units (e.g. "2 days, 3 hours, 4.5 minutes" or "2h3m4s") and the second
  is time in the format of hh:mm:ss (the seconds can contain decimal numbers) or
  hh:mm.
  
  This function is exported by default.
  
  Note that if the function is instructed to return number of seconds, the result
  is an approximation: leap seconds are not regarded (so a minute is always 60
  seconds), a month is always 30 days, a year is always 365 days.
  
  =head1 SEE ALSO
  
  L<Time::Duration::Parse>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2017 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
TIME_DURATION_PARSE_ASHASH

    $main::fatpacked{"Time/Zone.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'TIME_ZONE';
  
  package Time::Zone;
  
  =head1 NAME
  
  Time::Zone -- miscellaneous timezone manipulations routines
  
  =head1 SYNOPSIS
  
  	use Time::Zone;
  	print tz2zone();
  	print tz2zone($ENV{'TZ'});
  	print tz2zone($ENV{'TZ'}, time());
  	print tz2zone($ENV{'TZ'}, undef, $isdst);
  	$offset = tz_local_offset();
  	$offset = tz_offset($TZ);
  
  =head1 DESCRIPTION
  
  This is a collection of miscellaneous timezone manipulation routines.
  
  C<tz2zone()> parses the TZ environment variable and returns a timezone
  string suitable for inclusion in L<date(1)>-like output.  It opionally takes
  a timezone string, a time, and a is-dst flag.
  
  C<tz_local_offset()> determins the offset from GMT time in seconds.  It
  only does the calculation once.
  
  C<tz_offset()> determines the offset from GMT in seconds of a specified
  timezone.  
  
  C<tz_name()> determines the name of the timezone based on its offset
  
  =head1 AUTHORS
  
  Graham Barr <gbarr@pobox.com>
  David Muir Sharnoff <muir@idiom.com>
  Paul Foley <paul@ascent.com>
  
  =cut
  
  require 5.002;
  
  require Exporter;
  use Carp;
  use strict;
  use vars qw(@ISA @EXPORT $VERSION @tz_local);
  
  @ISA = qw(Exporter);
  @EXPORT = qw(tz2zone tz_local_offset tz_offset tz_name);
  $VERSION = "2.24";
  
  # Parts stolen from code by Paul Foley <paul@ascent.com>
  
  sub tz2zone (;$$$)
  {
  	my($TZ, $time, $isdst) = @_;
  
  	use vars qw(%tzn_cache);
  
  	$TZ = defined($ENV{'TZ'}) ? ( $ENV{'TZ'} ? $ENV{'TZ'} : 'GMT' ) : ''
  	    unless $TZ;
  
  	# Hack to deal with 'PST8PDT' format of TZ
  	# Note that this can't deal with all the esoteric forms, but it
  	# does recognize the most common: [:]STDoff[DST[off][,rule]]
  
  	if (! defined $isdst) {
  		my $j;
  		$time = time() unless $time;
  		($j, $j, $j, $j, $j, $j, $j, $j, $isdst) = localtime($time);
  	}
  
  	if (defined $tzn_cache{$TZ}->[$isdst]) {
  		return $tzn_cache{$TZ}->[$isdst];
  	}
        
  	if ($TZ =~ /^
  		    ( [^:\d+\-,] {3,} )
  		    ( [+-] ?
  		      \d {1,2}
  		      ( : \d {1,2} ) {0,2} 
  		    )
  		    ( [^\d+\-,] {3,} )?
  		    /x
  	    ) {
  		my $dsttz = defined($4) ? $4 : $1;
  		$TZ = $isdst ? $dsttz : $1;
  		$tzn_cache{$TZ} = [ $1, $dsttz ];
  	} else {
  		$tzn_cache{$TZ} = [ $TZ, $TZ ];
  	}
  	return $TZ;
  }
  
  sub tz_local_offset (;$)
  {
  	my ($time) = @_;
  
  	$time = time() unless $time;
  	my (@l) = localtime($time);
  	my $isdst = $l[8];
  
  	if (defined($tz_local[$isdst])) {
  		return $tz_local[$isdst];
  	}
  
  	$tz_local[$isdst] = &calc_off($time);
  
  	return $tz_local[$isdst];
  }
  
  sub calc_off
  {
  	my ($time) = @_;
  
  	my (@l) = localtime($time);
  	my (@g) = gmtime($time);
  
  	my $off;
  
  	$off =     $l[0] - $g[0]
  		+ ($l[1] - $g[1]) * 60
  		+ ($l[2] - $g[2]) * 3600;
  
  	# subscript 7 is yday.
  
  	if ($l[7] == $g[7]) {
  		# done
  	} elsif ($l[7] == $g[7] + 1) {
  		$off += 86400;
  	} elsif ($l[7] == $g[7] - 1) {
  		$off -= 86400;
  	} elsif ($l[7] < $g[7]) {
  		# crossed over a year boundry!
  		# localtime is beginning of year, gmt is end
  		# therefore local is ahead
  		$off += 86400;
  	} else {
  		$off -= 86400;
  	}
  
  	return $off;
  }
  
  # constants
  
  CONFIG: {
  	use vars qw(%dstZone %zoneOff %dstZoneOff %Zone);
  
  	my @dstZone = (
  	#   "ndt"  =>   -2*3600-1800,	 # Newfoundland Daylight   
  	    "brst" =>   -2*3600,         # Brazil Summer Time (East Daylight)
  	    "adt"  =>   -3*3600,  	 # Atlantic Daylight   
  	    "edt"  =>   -4*3600,  	 # Eastern Daylight
  	    "cdt"  =>   -5*3600,  	 # Central Daylight
  	    "mdt"  =>   -6*3600,  	 # Mountain Daylight
  	    "pdt"  =>   -7*3600,  	 # Pacific Daylight
  	    "akdt" =>   -8*3600,         # Alaska Daylight
  	    "ydt"  =>   -8*3600,  	 # Yukon Daylight
  	    "hdt"  =>   -9*3600,  	 # Hawaii Daylight
  	    "bst"  =>   +1*3600,  	 # British Summer   
  	    "mest" =>   +2*3600,  	 # Middle European Summer   
  	    "metdst" => +2*3600, 	 # Middle European DST
  	    "sst"  =>   +2*3600,  	 # Swedish Summer
  	    "fst"  =>   +2*3600,  	 # French Summer
              "cest" =>   +2*3600,         # Central European Daylight
              "eest" =>   +3*3600,         # Eastern European Summer
              "msd"  =>   +4*3600,         # Moscow Daylight
  	    "wadt" =>   +8*3600,  	 # West Australian Daylight
  	    "kdt"  =>  +10*3600,	 # Korean Daylight
  	#   "cadt" =>  +10*3600+1800,	 # Central Australian Daylight
  	    "aedt" =>  +11*3600,  	 # Eastern Australian Daylight
  	    "eadt" =>  +11*3600,  	 # Eastern Australian Daylight
  	    "nzd"  =>  +13*3600,  	 # New Zealand Daylight   
  	    "nzdt" =>  +13*3600,  	 # New Zealand Daylight   
  	);
  
  	my @Zone = (
  	    "gmt"	=>   0,  	 # Greenwich Mean
  	    "ut"        =>   0,  	 # Universal (Coordinated)
  	    "utc"       =>   0,
  	    "wet"       =>   0,  	 # Western European
  	    "wat"       =>  -1*3600,	 # West Africa
  	    "at"        =>  -2*3600,	 # Azores
  	    "fnt"	=>  -2*3600,	 # Brazil Time (Extreme East - Fernando Noronha)
  	    "brt"	=>  -3*3600,	 # Brazil Time (East Standard - Brasilia)
  	# For completeness.  BST is also British Summer, and GST is also Guam Standard.
  	#   "bst"       =>  -3*3600,	 # Brazil Standard
  	#   "gst"       =>  -3*3600,	 # Greenland Standard
  	#   "nft"       =>  -3*3600-1800,# Newfoundland
  	#   "nst"       =>  -3*3600-1800,# Newfoundland Standard
  	    "mnt"	=>  -4*3600,	 # Brazil Time (West Standard - Manaus)
  	    "ewt"       =>  -4*3600,	 # U.S. Eastern War Time
  	    "ast"       =>  -4*3600,	 # Atlantic Standard
  	    "est"       =>  -5*3600,	 # Eastern Standard
  	    "act"	=>  -5*3600,	 # Brazil Time (Extreme West - Acre)
  	    "cst"       =>  -6*3600,	 # Central Standard
  	    "mst"       =>  -7*3600,	 # Mountain Standard
  	    "pst"       =>  -8*3600,	 # Pacific Standard
  	    "akst"      =>  -9*3600,     # Alaska Standard
  	    "yst"	=>  -9*3600,	 # Yukon Standard
  	    "hst"	=> -10*3600,	 # Hawaii Standard
  	    "cat"	=> -10*3600,	 # Central Alaska
  	    "ahst"	=> -10*3600,	 # Alaska-Hawaii Standard
  	    "nt"	=> -11*3600,	 # Nome
  	    "idlw"	=> -12*3600,	 # International Date Line West
  	    "cet"	=>  +1*3600, 	 # Central European
  	    "mez"	=>  +1*3600, 	 # Central European (German)
  	    "ect"	=>  +1*3600, 	 # Central European (French)
  	    "met"	=>  +1*3600, 	 # Middle European
  	    "mewt"	=>  +1*3600, 	 # Middle European Winter
  	    "swt"	=>  +1*3600, 	 # Swedish Winter
  	    "set"	=>  +1*3600, 	 # Seychelles
  	    "fwt"	=>  +1*3600, 	 # French Winter
  	    "eet"	=>  +2*3600, 	 # Eastern Europe, USSR Zone 1
  	    "ukr"	=>  +2*3600, 	 # Ukraine
  	    "bt"	=>  +3*3600, 	 # Baghdad, USSR Zone 2
              "msk"       =>  +3*3600,     # Moscow
  	#   "it"	=>  +3*3600+1800,# Iran
  	    "zp4"	=>  +4*3600, 	 # USSR Zone 3
  	    "zp5"	=>  +5*3600, 	 # USSR Zone 4
  	#   "ist"	=>  +5*3600+1800,# Indian Standard
  	    "zp6"	=>  +6*3600, 	 # USSR Zone 5
  	# For completeness.  NST is also Newfoundland Stanard, and SST is also Swedish Summer.
  	#   "nst"	=>  +6*3600+1800,# North Sumatra
  	#   "sst"	=>  +7*3600, 	 # South Sumatra, USSR Zone 6
  	#   "jt"	=>  +7*3600+1800,# Java (3pm in Cronusland!)
  	    "wst"	=>  +8*3600, 	 # West Australian Standard
  	    "hkt"	=>  +8*3600, 	 # Hong Kong
  	    "cct"	=>  +8*3600, 	 # China Coast, USSR Zone 7
  	    "jst"	=>  +9*3600,	 # Japan Standard, USSR Zone 8
  	    "kst"	=>  +9*3600,	 # Korean Standard
  	#   "cast"	=>  +9*3600+1800,# Central Australian Standard
  	    "aest"	=> +10*3600,	 # Eastern Australian Standard
  	    "east"	=> +10*3600,	 # Eastern Australian Standard
  	    "gst"	=> +10*3600,	 # Guam Standard, USSR Zone 9
  	    "nzt"	=> +12*3600,	 # New Zealand
  	    "nzst"	=> +12*3600,	 # New Zealand Standard
  	    "idle"	=> +12*3600,	 # International Date Line East
  	);
  
  	%Zone = @Zone;
  	%dstZone = @dstZone;
  	%zoneOff = reverse(@Zone);
  	%dstZoneOff = reverse(@dstZone);
  
  }
  
  sub tz_offset (;$$)
  {
  	my ($zone, $time) = @_;
  
  	return &tz_local_offset($time) unless($zone);
  
  	$time = time() unless $time;
  	my(@l) = localtime($time);
  	my $dst = $l[8];
  
  	$zone = lc $zone;
  
  	if($zone =~ /^(([\-\+])\d\d?)(\d\d)$/) {
  		my $v = $2 . $3;
  		return $1 * 3600 + $v * 60;
  	} elsif (exists $dstZone{$zone} && ($dst || !exists $Zone{$zone})) {
  		return $dstZone{$zone};
  	} elsif(exists $Zone{$zone}) {
  		return $Zone{$zone};
  	}
  	undef;
  }
  
  sub tz_name (;$$)
  {
  	my ($off, $dst) = @_;
  
  	$off = tz_offset()
  		unless(defined $off);
  
  	$dst = (localtime(time))[8]
  		unless(defined $dst);
  
  	if (exists $dstZoneOff{$off} && ($dst || !exists $zoneOff{$off})) {
  		return $dstZoneOff{$off};
  	} elsif (exists $zoneOff{$off}) {
  		return $zoneOff{$off};
  	}
  	sprintf("%+05d", int($off / 60) * 100 + $off % 60);
  }
  
  1;
TIME_ZONE

    $main::fatpacked{"Try/Tiny.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'TRY_TINY';
  package Try::Tiny; # git description: v0.29-2-g3b23a06
  use 5.006;
  # ABSTRACT: Minimal try/catch with proper preservation of $@
  
  our $VERSION = '0.30';
  
  use strict;
  use warnings;
  
  use Exporter 5.57 'import';
  our @EXPORT = our @EXPORT_OK = qw(try catch finally);
  
  use Carp;
  $Carp::Internal{+__PACKAGE__}++;
  
  BEGIN {
    my $su = $INC{'Sub/Util.pm'} && defined &Sub::Util::set_subname;
    my $sn = $INC{'Sub/Name.pm'} && eval { Sub::Name->VERSION(0.08) };
    unless ($su || $sn) {
      $su = eval { require Sub::Util; } && defined &Sub::Util::set_subname;
      unless ($su) {
        $sn = eval { require Sub::Name; Sub::Name->VERSION(0.08) };
      }
    }
  
    *_subname = $su ? \&Sub::Util::set_subname
              : $sn ? \&Sub::Name::subname
              : sub { $_[1] };
    *_HAS_SUBNAME = ($su || $sn) ? sub(){1} : sub(){0};
  }
  
  my %_finally_guards;
  
  # Need to prototype as @ not $$ because of the way Perl evaluates the prototype.
  # Keeping it at $$ means you only ever get 1 sub because we need to eval in a list
  # context & not a scalar one
  
  sub try (&;@) {
    my ( $try, @code_refs ) = @_;
  
    # we need to save this here, the eval block will be in scalar context due
    # to $failed
    my $wantarray = wantarray;
  
    # work around perl bug by explicitly initializing these, due to the likelyhood
    # this will be used in global destruction (perl rt#119311)
    my ( $catch, @finally ) = ();
  
    # find labeled blocks in the argument list.
    # catch and finally tag the blocks by blessing a scalar reference to them.
    foreach my $code_ref (@code_refs) {
  
      if ( ref($code_ref) eq 'Try::Tiny::Catch' ) {
        croak 'A try() may not be followed by multiple catch() blocks'
          if $catch;
        $catch = ${$code_ref};
      } elsif ( ref($code_ref) eq 'Try::Tiny::Finally' ) {
        push @finally, ${$code_ref};
      } else {
        croak(
          'try() encountered an unexpected argument ('
        . ( defined $code_ref ? $code_ref : 'undef' )
        . ') - perhaps a missing semi-colon before or'
        );
      }
    }
  
    # FIXME consider using local $SIG{__DIE__} to accumulate all errors. It's
    # not perfect, but we could provide a list of additional errors for
    # $catch->();
  
    # name the blocks if we have Sub::Name installed
    _subname(caller().'::try {...} ' => $try)
      if _HAS_SUBNAME;
  
    # set up scope guards to invoke the finally blocks at the end.
    # this should really be a function scope lexical variable instead of
    # file scope + local but that causes issues with perls < 5.20 due to
    # perl rt#119311
    local $_finally_guards{guards} = [
      map { Try::Tiny::ScopeGuard->_new($_) }
      @finally
    ];
  
    # save the value of $@ so we can set $@ back to it in the beginning of the eval
    # and restore $@ after the eval finishes
    my $prev_error = $@;
  
    my ( @ret, $error );
  
    # failed will be true if the eval dies, because 1 will not be returned
    # from the eval body
    my $failed = not eval {
      $@ = $prev_error;
  
      # evaluate the try block in the correct context
      if ( $wantarray ) {
        @ret = $try->();
      } elsif ( defined $wantarray ) {
        $ret[0] = $try->();
      } else {
        $try->();
      };
  
      return 1; # properly set $failed to false
    };
  
    # preserve the current error and reset the original value of $@
    $error = $@;
    $@ = $prev_error;
  
    # at this point $failed contains a true value if the eval died, even if some
    # destructor overwrote $@ as the eval was unwinding.
    if ( $failed ) {
      # pass $error to the finally blocks
      push @$_, $error for @{$_finally_guards{guards}};
  
      # if we got an error, invoke the catch block.
      if ( $catch ) {
        # This works like given($error), but is backwards compatible and
        # sets $_ in the dynamic scope for the body of C<$catch>
        for ($error) {
          return $catch->($error);
        }
  
        # in case when() was used without an explicit return, the C<for>
        # loop will be aborted and there's no useful return value
      }
  
      return;
    } else {
      # no failure, $@ is back to what it was, everything is fine
      return $wantarray ? @ret : $ret[0];
    }
  }
  
  sub catch (&;@) {
    my ( $block, @rest ) = @_;
  
    croak 'Useless bare catch()' unless wantarray;
  
    _subname(caller().'::catch {...} ' => $block)
      if _HAS_SUBNAME;
    return (
      bless(\$block, 'Try::Tiny::Catch'),
      @rest,
    );
  }
  
  sub finally (&;@) {
    my ( $block, @rest ) = @_;
  
    croak 'Useless bare finally()' unless wantarray;
  
    _subname(caller().'::finally {...} ' => $block)
      if _HAS_SUBNAME;
    return (
      bless(\$block, 'Try::Tiny::Finally'),
      @rest,
    );
  }
  
  {
    package # hide from PAUSE
      Try::Tiny::ScopeGuard;
  
    use constant UNSTABLE_DOLLARAT => ("$]" < '5.013002') ? 1 : 0;
  
    sub _new {
      shift;
      bless [ @_ ];
    }
  
    sub DESTROY {
      my ($code, @args) = @{ $_[0] };
  
      local $@ if UNSTABLE_DOLLARAT;
      eval {
        $code->(@args);
        1;
      } or do {
        warn
          "Execution of finally() block $code resulted in an exception, which "
        . '*CAN NOT BE PROPAGATED* due to fundamental limitations of Perl. '
        . 'Your program will continue as if this event never took place. '
        . "Original exception text follows:\n\n"
        . (defined $@ ? $@ : '$@ left undefined...')
        . "\n"
        ;
      }
    }
  }
  
  __PACKAGE__
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Try::Tiny - Minimal try/catch with proper preservation of $@
  
  =head1 VERSION
  
  version 0.30
  
  =head1 SYNOPSIS
  
  You can use Try::Tiny's C<try> and C<catch> to expect and handle exceptional
  conditions, avoiding quirks in Perl and common mistakes:
  
    # handle errors with a catch handler
    try {
      die "foo";
    } catch {
      warn "caught error: $_"; # not $@
    };
  
  You can also use it like a standalone C<eval> to catch and ignore any error
  conditions.  Obviously, this is an extreme measure not to be undertaken
  lightly:
  
    # just silence errors
    try {
      die "foo";
    };
  
  =head1 DESCRIPTION
  
  This module provides bare bones C<try>/C<catch>/C<finally> statements that are designed to
  minimize common mistakes with eval blocks, and NOTHING else.
  
  This is unlike L<TryCatch> which provides a nice syntax and avoids adding
  another call stack layer, and supports calling C<return> from the C<try> block to
  return from the parent subroutine. These extra features come at a cost of a few
  dependencies, namely L<Devel::Declare> and L<Scope::Upper> which are
  occasionally problematic, and the additional catch filtering uses L<Moose>
  type constraints which may not be desirable either.
  
  The main focus of this module is to provide simple and reliable error handling
  for those having a hard time installing L<TryCatch>, but who still want to
  write correct C<eval> blocks without 5 lines of boilerplate each time.
  
  It's designed to work as correctly as possible in light of the various
  pathological edge cases (see L</BACKGROUND>) and to be compatible with any style
  of error values (simple strings, references, objects, overloaded objects, etc).
  
  If the C<try> block dies, it returns the value of the last statement executed in
  the C<catch> block, if there is one. Otherwise, it returns C<undef> in scalar
  context or the empty list in list context. The following examples all
  assign C<"bar"> to C<$x>:
  
    my $x = try { die "foo" } catch { "bar" };
    my $x = try { die "foo" } || "bar";
    my $x = (try { die "foo" }) // "bar";
  
    my $x = eval { die "foo" } || "bar";
  
  You can add C<finally> blocks, yielding the following:
  
    my $x;
    try { die 'foo' } finally { $x = 'bar' };
    try { die 'foo' } catch { warn "Got a die: $_" } finally { $x = 'bar' };
  
  C<finally> blocks are always executed making them suitable for cleanup code
  which cannot be handled using local.  You can add as many C<finally> blocks to a
  given C<try> block as you like.
  
  Note that adding a C<finally> block without a preceding C<catch> block
  suppresses any errors. This behaviour is consistent with using a standalone
  C<eval>, but it is not consistent with C<try>/C<finally> patterns found in
  other programming languages, such as Java, Python, Javascript or C#. If you
  learnt the C<try>/C<finally> pattern from one of these languages, watch out for
  this.
  
  =head1 EXPORTS
  
  All functions are exported by default using L<Exporter>.
  
  If you need to rename the C<try>, C<catch> or C<finally> keyword consider using
  L<Sub::Import> to get L<Sub::Exporter>'s flexibility.
  
  =over 4
  
  =item try (&;@)
  
  Takes one mandatory C<try> subroutine, an optional C<catch> subroutine and C<finally>
  subroutine.
  
  The mandatory subroutine is evaluated in the context of an C<eval> block.
  
  If no error occurred the value from the first block is returned, preserving
  list/scalar context.
  
  If there was an error and the second subroutine was given it will be invoked
  with the error in C<$_> (localized) and as that block's first and only
  argument.
  
  C<$@> does B<not> contain the error. Inside the C<catch> block it has the same
  value it had before the C<try> block was executed.
  
  Note that the error may be false, but if that happens the C<catch> block will
  still be invoked.
  
  Once all execution is finished then the C<finally> block, if given, will execute.
  
  =item catch (&;@)
  
  Intended to be used in the second argument position of C<try>.
  
  Returns a reference to the subroutine it was given but blessed as
  C<Try::Tiny::Catch> which allows try to decode correctly what to do
  with this code reference.
  
    catch { ... }
  
  Inside the C<catch> block the caught error is stored in C<$_>, while previous
  value of C<$@> is still available for use.  This value may or may not be
  meaningful depending on what happened before the C<try>, but it might be a good
  idea to preserve it in an error stack.
  
  For code that captures C<$@> when throwing new errors (i.e.
  L<Class::Throwable>), you'll need to do:
  
    local $@ = $_;
  
  =item finally (&;@)
  
    try     { ... }
    catch   { ... }
    finally { ... };
  
  Or
  
    try     { ... }
    finally { ... };
  
  Or even
  
    try     { ... }
    finally { ... }
    catch   { ... };
  
  Intended to be the second or third element of C<try>. C<finally> blocks are always
  executed in the event of a successful C<try> or if C<catch> is run. This allows
  you to locate cleanup code which cannot be done via C<local()> e.g. closing a file
  handle.
  
  When invoked, the C<finally> block is passed the error that was caught.  If no
  error was caught, it is passed nothing.  (Note that the C<finally> block does not
  localize C<$_> with the error, since unlike in a C<catch> block, there is no way
  to know if C<$_ == undef> implies that there were no errors.) In other words,
  the following code does just what you would expect:
  
    try {
      die_sometimes();
    } catch {
      # ...code run in case of error
    } finally {
      if (@_) {
        print "The try block died with: @_\n";
      } else {
        print "The try block ran without error.\n";
      }
    };
  
  B<You must always do your own error handling in the C<finally> block>. C<Try::Tiny> will
  not do anything about handling possible errors coming from code located in these
  blocks.
  
  Furthermore B<exceptions in C<finally> blocks are not trappable and are unable
  to influence the execution of your program>. This is due to limitation of
  C<DESTROY>-based scope guards, which C<finally> is implemented on top of. This
  may change in a future version of Try::Tiny.
  
  In the same way C<catch()> blesses the code reference this subroutine does the same
  except it bless them as C<Try::Tiny::Finally>.
  
  =back
  
  =head1 BACKGROUND
  
  There are a number of issues with C<eval>.
  
  =head2 Clobbering $@
  
  When you run an C<eval> block and it succeeds, C<$@> will be cleared, potentially
  clobbering an error that is currently being caught.
  
  This causes action at a distance, clearing previous errors your caller may have
  not yet handled.
  
  C<$@> must be properly localized before invoking C<eval> in order to avoid this
  issue.
  
  More specifically,
  L<before Perl version 5.14.0|perl5140delta/"Exception Handling">
  C<$@> was clobbered at the beginning of the C<eval>, which
  also made it impossible to capture the previous error before you die (for
  instance when making exception objects with error stacks).
  
  For this reason C<try> will actually set C<$@> to its previous value (the one
  available before entering the C<try> block) in the beginning of the C<eval>
  block.
  
  =head2 Localizing $@ silently masks errors
  
  Inside an C<eval> block, C<die> behaves sort of like:
  
    sub die {
      $@ = $_[0];
      return_undef_from_eval();
    }
  
  This means that if you were polite and localized C<$@> you can't die in that
  scope, or your error will be discarded (printing "Something's wrong" instead).
  
  The workaround is very ugly:
  
    my $error = do {
      local $@;
      eval { ... };
      $@;
    };
  
    ...
    die $error;
  
  =head2 $@ might not be a true value
  
  This code is wrong:
  
    if ( $@ ) {
      ...
    }
  
  because due to the previous caveats it may have been unset.
  
  C<$@> could also be an overloaded error object that evaluates to false, but
  that's asking for trouble anyway.
  
  The classic failure mode (fixed in L<Perl 5.14.0|perl5140delta/"Exception Handling">) is:
  
    sub Object::DESTROY {
      eval { ... }
    }
  
    eval {
      my $obj = Object->new;
  
      die "foo";
    };
  
    if ( $@ ) {
  
    }
  
  In this case since C<Object::DESTROY> is not localizing C<$@> but still uses
  C<eval>, it will set C<$@> to C<"">.
  
  The destructor is called when the stack is unwound, after C<die> sets C<$@> to
  C<"foo at Foo.pm line 42\n">, so by the time C<if ( $@ )> is evaluated it has
  been cleared by C<eval> in the destructor.
  
  The workaround for this is even uglier than the previous ones. Even though we
  can't save the value of C<$@> from code that doesn't localize, we can at least
  be sure the C<eval> was aborted due to an error:
  
    my $failed = not eval {
      ...
  
      return 1;
    };
  
  This is because an C<eval> that caught a C<die> will always return a false
  value.
  
  =head1 ALTERNATE SYNTAX
  
  Using Perl 5.10 you can use L<perlsyn/"Switch statements"> (but please don't,
  because that syntax has since been deprecated because there was too much
  unexpected magical behaviour).
  
  =for stopwords topicalizer
  
  The C<catch> block is invoked in a topicalizer context (like a C<given> block),
  but note that you can't return a useful value from C<catch> using the C<when>
  blocks without an explicit C<return>.
  
  This is somewhat similar to Perl 6's C<CATCH> blocks. You can use it to
  concisely match errors:
  
    try {
      require Foo;
    } catch {
      when (/^Can't locate .*?\.pm in \@INC/) { } # ignore
      default { die $_ }
    };
  
  =head1 CAVEATS
  
  =over 4
  
  =item *
  
  C<@_> is not available within the C<try> block, so you need to copy your
  argument list. In case you want to work with argument values directly via C<@_>
  aliasing (i.e. allow C<$_[1] = "foo">), you need to pass C<@_> by reference:
  
    sub foo {
      my ( $self, @args ) = @_;
      try { $self->bar(@args) }
    }
  
  or
  
    sub bar_in_place {
      my $self = shift;
      my $args = \@_;
      try { $_ = $self->bar($_) for @$args }
    }
  
  =item *
  
  C<return> returns from the C<try> block, not from the parent sub (note that
  this is also how C<eval> works, but not how L<TryCatch> works):
  
    sub parent_sub {
      try {
        die;
      }
      catch {
        return;
      };
  
      say "this text WILL be displayed, even though an exception is thrown";
    }
  
  Instead, you should capture the return value:
  
    sub parent_sub {
      my $success = try {
        die;
        1;
      };
      return unless $success;
  
      say "This text WILL NEVER appear!";
    }
    # OR
    sub parent_sub_with_catch {
      my $success = try {
        die;
        1;
      }
      catch {
        # do something with $_
        return undef; #see note
      };
      return unless $success;
  
      say "This text WILL NEVER appear!";
    }
  
  Note that if you have a C<catch> block, it must return C<undef> for this to work,
  since if a C<catch> block exists, its return value is returned in place of C<undef>
  when an exception is thrown.
  
  =item *
  
  C<try> introduces another caller stack frame. L<Sub::Uplevel> is not used. L<Carp>
  will not report this when using full stack traces, though, because
  C<%Carp::Internal> is used. This lack of magic is considered a feature.
  
  =for stopwords unhygienically
  
  =item *
  
  The value of C<$_> in the C<catch> block is not guaranteed to be the value of
  the exception thrown (C<$@>) in the C<try> block.  There is no safe way to
  ensure this, since C<eval> may be used unhygienically in destructors.  The only
  guarantee is that the C<catch> will be called if an exception is thrown.
  
  =item *
  
  The return value of the C<catch> block is not ignored, so if testing the result
  of the expression for truth on success, be sure to return a false value from
  the C<catch> block:
  
    my $obj = try {
      MightFail->new;
    } catch {
      ...
  
      return; # avoid returning a true value;
    };
  
    return unless $obj;
  
  =item *
  
  C<$SIG{__DIE__}> is still in effect.
  
  Though it can be argued that C<$SIG{__DIE__}> should be disabled inside of
  C<eval> blocks, since it isn't people have grown to rely on it. Therefore in
  the interests of compatibility, C<try> does not disable C<$SIG{__DIE__}> for
  the scope of the error throwing code.
  
  =item *
  
  Lexical C<$_> may override the one set by C<catch>.
  
  For example Perl 5.10's C<given> form uses a lexical C<$_>, creating some
  confusing behavior:
  
    given ($foo) {
      when (...) {
        try {
          ...
        } catch {
          warn $_; # will print $foo, not the error
          warn $_[0]; # instead, get the error like this
        }
      }
    }
  
  Note that this behavior was changed once again in
  L<Perl5 version 18|https://metacpan.org/module/perldelta#given-now-aliases-the-global-_>.
  However, since the entirety of lexical C<$_> is now L<considered experimental
  |https://metacpan.org/module/perldelta#Lexical-_-is-now-experimental>, it
  is unclear whether the new version 18 behavior is final.
  
  =back
  
  =head1 SEE ALSO
  
  =over 4
  
  =item L<TryCatch>
  
  Much more feature complete, more convenient semantics, but at the cost of
  implementation complexity.
  
  =item L<autodie>
  
  Automatic error throwing for builtin functions and more. Also designed to
  work well with C<given>/C<when>.
  
  =item L<Throwable>
  
  A lightweight role for rolling your own exception classes.
  
  =item L<Error>
  
  Exception object implementation with a C<try> statement. Does not localize
  C<$@>.
  
  =item L<Exception::Class::TryCatch>
  
  Provides a C<catch> statement, but properly calling C<eval> is your
  responsibility.
  
  The C<try> keyword pushes C<$@> onto an error stack, avoiding some of the
  issues with C<$@>, but you still need to localize to prevent clobbering.
  
  =back
  
  =head1 LIGHTNING TALK
  
  I gave a lightning talk about this module, you can see the slides (Firefox
  only):
  
  L<http://web.archive.org/web/20100628040134/http://nothingmuch.woobling.org/talks/takahashi.xul>
  
  Or read the source:
  
  L<http://web.archive.org/web/20100305133605/http://nothingmuch.woobling.org/talks/yapc_asia_2009/try_tiny.yml>
  
  =head1 SUPPORT
  
  Bugs may be submitted through L<the RT bug tracker|https://rt.cpan.org/Public/Dist/Display.html?Name=Try-Tiny>
  (or L<bug-Try-Tiny@rt.cpan.org|mailto:bug-Try-Tiny@rt.cpan.org>).
  
  =head1 AUTHORS
  
  =over 4
  
  =item *
  
  יובל קוג'מן (Yuval Kogman) <nothingmuch@woobling.org>
  
  =item *
  
  Jesse Luehrs <doy@tozt.net>
  
  =back
  
  =head1 CONTRIBUTORS
  
  =for stopwords Karen Etheridge Peter Rabbitson Ricardo Signes Mark Fowler Graham Knop Lukas Mai Aristotle Pagaltzis Dagfinn Ilmari Mannsåker Paul Howarth Rudolf Leermakers anaxagoras awalker chromatic Alex cm-perl Andrew Yates David Lowe Glenn Hans Dieter Pearcey Jens Berthold Jonathan Yu Marc Mims Stosberg Pali
  
  =over 4
  
  =item *
  
  Karen Etheridge <ether@cpan.org>
  
  =item *
  
  Peter Rabbitson <ribasushi@cpan.org>
  
  =item *
  
  Ricardo Signes <rjbs@cpan.org>
  
  =item *
  
  Mark Fowler <mark@twoshortplanks.com>
  
  =item *
  
  Graham Knop <haarg@haarg.org>
  
  =item *
  
  Lukas Mai <l.mai@web.de>
  
  =item *
  
  Aristotle Pagaltzis <pagaltzis@gmx.de>
  
  =item *
  
  Dagfinn Ilmari Mannsåker <ilmari@ilmari.org>
  
  =item *
  
  Paul Howarth <paul@city-fan.org>
  
  =item *
  
  Rudolf Leermakers <rudolf@hatsuseno.org>
  
  =item *
  
  anaxagoras <walkeraj@gmail.com>
  
  =item *
  
  awalker <awalker@sourcefire.com>
  
  =item *
  
  chromatic <chromatic@wgz.org>
  
  =item *
  
  Alex <alex@koban.(none)>
  
  =item *
  
  cm-perl <cm-perl@users.noreply.github.com>
  
  =item *
  
  Andrew Yates <ayates@haddock.local>
  
  =item *
  
  David Lowe <davidl@lokku.com>
  
  =item *
  
  Glenn Fowler <cebjyre@cpan.org>
  
  =item *
  
  Hans Dieter Pearcey <hdp@weftsoar.net>
  
  =item *
  
  Jens Berthold <jens@jebecs.de>
  
  =item *
  
  Jonathan Yu <JAWNSY@cpan.org>
  
  =item *
  
  Marc Mims <marc@questright.com>
  
  =item *
  
  Mark Stosberg <mark@stosberg.com>
  
  =item *
  
  Pali <pali@cpan.org>
  
  =back
  
  =head1 COPYRIGHT AND LICENCE
  
  This software is Copyright (c) 2009 by יובל קוג'מן (Yuval Kogman).
  
  This is free software, licensed under:
  
    The MIT (X11) License
  
  =cut
TRY_TINY

    $main::fatpacked{"URI.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'URI';
  package URI;
  
  use strict;
  use warnings;
  
  our $VERSION = '1.76';
  
  our ($ABS_REMOTE_LEADING_DOTS, $ABS_ALLOW_RELATIVE_SCHEME, $DEFAULT_QUERY_FORM_DELIMITER);
  
  my %implements;  # mapping from scheme to implementor class
  
  # Some "official" character classes
  
  our $reserved   = q(;/?:@&=+$,[]);
  our $mark       = q(-_.!~*'());                                    #'; emacs
  our $unreserved = "A-Za-z0-9\Q$mark\E";
  our $uric       = quotemeta($reserved) . $unreserved . "%";
  
  our $scheme_re  = '[a-zA-Z][a-zA-Z0-9.+\-]*';
  
  use Carp ();
  use URI::Escape ();
  
  use overload ('""'     => sub { ${$_[0]} },
                '=='     => sub { _obj_eq(@_) },
                '!='     => sub { !_obj_eq(@_) },
                fallback => 1,
               );
  
  # Check if two objects are the same object
  sub _obj_eq {
      return overload::StrVal($_[0]) eq overload::StrVal($_[1]);
  }
  
  sub new
  {
      my($class, $uri, $scheme) = @_;
  
      $uri = defined ($uri) ? "$uri" : "";   # stringify
      # Get rid of potential wrapping
      $uri =~ s/^<(?:URL:)?(.*)>$/$1/;  # 
      $uri =~ s/^"(.*)"$/$1/;
      $uri =~ s/^\s+//;
      $uri =~ s/\s+$//;
  
      my $impclass;
      if ($uri =~ m/^($scheme_re):/so) {
  	$scheme = $1;
      }
      else {
  	if (($impclass = ref($scheme))) {
  	    $scheme = $scheme->scheme;
  	}
  	elsif ($scheme && $scheme =~ m/^($scheme_re)(?::|$)/o) {
  	    $scheme = $1;
          }
      }
      $impclass ||= implementor($scheme) ||
  	do {
  	    require URI::_foreign;
  	    $impclass = 'URI::_foreign';
  	};
  
      return $impclass->_init($uri, $scheme);
  }
  
  
  sub new_abs
  {
      my($class, $uri, $base) = @_;
      $uri = $class->new($uri, $base);
      $uri->abs($base);
  }
  
  
  sub _init
  {
      my $class = shift;
      my($str, $scheme) = @_;
      # find all funny characters and encode the bytes.
      $str = $class->_uric_escape($str);
      $str = "$scheme:$str" unless $str =~ /^$scheme_re:/o ||
                                   $class->_no_scheme_ok;
      my $self = bless \$str, $class;
      $self;
  }
  
  
  sub _uric_escape
  {
      my($class, $str) = @_;
      $str =~ s*([^$uric\#])* URI::Escape::escape_char($1) *ego;
      utf8::downgrade($str);
      return $str;
  }
  
  my %require_attempted;
  
  sub implementor
  {
      my($scheme, $impclass) = @_;
      if (!$scheme || $scheme !~ /\A$scheme_re\z/o) {
  	require URI::_generic;
  	return "URI::_generic";
      }
  
      $scheme = lc($scheme);
  
      if ($impclass) {
  	# Set the implementor class for a given scheme
          my $old = $implements{$scheme};
          $impclass->_init_implementor($scheme);
          $implements{$scheme} = $impclass;
          return $old;
      }
  
      my $ic = $implements{$scheme};
      return $ic if $ic;
  
      # scheme not yet known, look for internal or
      # preloaded (with 'use') implementation
      $ic = "URI::$scheme";  # default location
  
      # turn scheme into a valid perl identifier by a simple transformation...
      $ic =~ s/\+/_P/g;
      $ic =~ s/\./_O/g;
      $ic =~ s/\-/_/g;
  
      no strict 'refs';
      # check we actually have one for the scheme:
      unless (@{"${ic}::ISA"}) {
          if (not exists $require_attempted{$ic}) {
              # Try to load it
              my $_old_error = $@;
              eval "require $ic";
              die $@ if $@ && $@ !~ /Can\'t locate.*in \@INC/;
              $@ = $_old_error;
          }
          return undef unless @{"${ic}::ISA"};
      }
  
      $ic->_init_implementor($scheme);
      $implements{$scheme} = $ic;
      $ic;
  }
  
  
  sub _init_implementor
  {
      my($class, $scheme) = @_;
      # Remember that one implementor class may actually
      # serve to implement several URI schemes.
  }
  
  
  sub clone
  {
      my $self = shift;
      my $other = $$self;
      bless \$other, ref $self;
  }
  
  sub TO_JSON { ${$_[0]} }
  
  sub _no_scheme_ok { 0 }
  
  sub _scheme
  {
      my $self = shift;
  
      unless (@_) {
  	return undef unless $$self =~ /^($scheme_re):/o;
  	return $1;
      }
  
      my $old;
      my $new = shift;
      if (defined($new) && length($new)) {
  	Carp::croak("Bad scheme '$new'") unless $new =~ /^$scheme_re$/o;
  	$old = $1 if $$self =~ s/^($scheme_re)://o;
  	my $newself = URI->new("$new:$$self");
  	$$self = $$newself; 
  	bless $self, ref($newself);
      }
      else {
  	if ($self->_no_scheme_ok) {
  	    $old = $1 if $$self =~ s/^($scheme_re)://o;
  	    Carp::carp("Oops, opaque part now look like scheme")
  		if $^W && $$self =~ m/^$scheme_re:/o
  	}
  	else {
  	    $old = $1 if $$self =~ m/^($scheme_re):/o;
  	}
      }
  
      return $old;
  }
  
  sub scheme
  {
      my $scheme = shift->_scheme(@_);
      return undef unless defined $scheme;
      lc($scheme);
  }
  
  sub has_recognized_scheme {
      my $self = shift;
      return ref($self) !~ /^URI::_(?:foreign|generic)\z/;
  }
  
  sub opaque
  {
      my $self = shift;
  
      unless (@_) {
  	$$self =~ /^(?:$scheme_re:)?([^\#]*)/o or die;
  	return $1;
      }
  
      $$self =~ /^($scheme_re:)?    # optional scheme
  	        ([^\#]*)          # opaque
                  (\#.*)?           # optional fragment
                $/sx or die;
  
      my $old_scheme = $1;
      my $old_opaque = $2;
      my $old_frag   = $3;
  
      my $new_opaque = shift;
      $new_opaque = "" unless defined $new_opaque;
      $new_opaque =~ s/([^$uric])/ URI::Escape::escape_char($1)/ego;
      utf8::downgrade($new_opaque);
  
      $$self = defined($old_scheme) ? $old_scheme : "";
      $$self .= $new_opaque;
      $$self .= $old_frag if defined $old_frag;
  
      $old_opaque;
  }
  
  sub path { goto &opaque }  # alias
  
  
  sub fragment
  {
      my $self = shift;
      unless (@_) {
  	return undef unless $$self =~ /\#(.*)/s;
  	return $1;
      }
  
      my $old;
      $old = $1 if $$self =~ s/\#(.*)//s;
  
      my $new_frag = shift;
      if (defined $new_frag) {
  	$new_frag =~ s/([^$uric])/ URI::Escape::escape_char($1) /ego;
  	utf8::downgrade($new_frag);
  	$$self .= "#$new_frag";
      }
      $old;
  }
  
  
  sub as_string
  {
      my $self = shift;
      $$self;
  }
  
  
  sub as_iri
  {
      my $self = shift;
      my $str = $$self;
      if ($str =~ s/%([89a-fA-F][0-9a-fA-F])/chr(hex($1))/eg) {
  	# All this crap because the more obvious:
  	#
  	#   Encode::decode("UTF-8", $str, sub { sprintf "%%%02X", shift })
  	#
  	# doesn't work before Encode 2.39.  Wait for a standard release
  	# to bundle that version.
  
  	require Encode;
  	my $enc = Encode::find_encoding("UTF-8");
  	my $u = "";
  	while (length $str) {
  	    $u .= $enc->decode($str, Encode::FB_QUIET());
  	    if (length $str) {
  		# escape next char
  		$u .= URI::Escape::escape_char(substr($str, 0, 1, ""));
  	    }
  	}
  	$str = $u;
      }
      return $str;
  }
  
  
  sub canonical
  {
      # Make sure scheme is lowercased, that we don't escape unreserved chars,
      # and that we use upcase escape sequences.
  
      my $self = shift;
      my $scheme = $self->_scheme || "";
      my $uc_scheme = $scheme =~ /[A-Z]/;
      my $esc = $$self =~ /%[a-fA-F0-9]{2}/;
      return $self unless $uc_scheme || $esc;
  
      my $other = $self->clone;
      if ($uc_scheme) {
  	$other->_scheme(lc $scheme);
      }
      if ($esc) {
  	$$other =~ s{%([0-9a-fA-F]{2})}
  	            { my $a = chr(hex($1));
                        $a =~ /^[$unreserved]\z/o ? $a : "%\U$1"
                      }ge;
      }
      return $other;
  }
  
  # Compare two URIs, subclasses will provide a more correct implementation
  sub eq {
      my($self, $other) = @_;
      $self  = URI->new($self, $other) unless ref $self;
      $other = URI->new($other, $self) unless ref $other;
      ref($self) eq ref($other) &&                # same class
  	$self->canonical->as_string eq $other->canonical->as_string;
  }
  
  # generic-URI transformation methods
  sub abs { $_[0]; }
  sub rel { $_[0]; }
  
  sub secure { 0 }
  
  # help out Storable
  sub STORABLE_freeze {
         my($self, $cloning) = @_;
         return $$self;
  }
  
  sub STORABLE_thaw {
         my($self, $cloning, $str) = @_;
         $$self = $str;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  URI - Uniform Resource Identifiers (absolute and relative)
  
  =head1 SYNOPSIS
  
   use URI;
  
   $u1 = URI->new("http://www.perl.com");
   $u2 = URI->new("foo", "http");
   $u3 = $u2->abs($u1);
   $u4 = $u3->clone;
   $u5 = URI->new("HTTP://WWW.perl.com:80")->canonical;
  
   $str = $u->as_string;
   $str = "$u";
  
   $scheme = $u->scheme;
   $opaque = $u->opaque;
   $path   = $u->path;
   $frag   = $u->fragment;
  
   $u->scheme("ftp");
   $u->host("ftp.perl.com");
   $u->path("cpan/");
  
  =head1 DESCRIPTION
  
  This module implements the C<URI> class.  Objects of this class
  represent "Uniform Resource Identifier references" as specified in RFC
  2396 (and updated by RFC 2732).
  
  A Uniform Resource Identifier is a compact string of characters that
  identifies an abstract or physical resource.  A Uniform Resource
  Identifier can be further classified as either a Uniform Resource Locator
  (URL) or a Uniform Resource Name (URN).  The distinction between URL
  and URN does not matter to the C<URI> class interface. A
  "URI-reference" is a URI that may have additional information attached
  in the form of a fragment identifier.
  
  An absolute URI reference consists of three parts:  a I<scheme>, a
  I<scheme-specific part> and a I<fragment> identifier.  A subset of URI
  references share a common syntax for hierarchical namespaces.  For
  these, the scheme-specific part is further broken down into
  I<authority>, I<path> and I<query> components.  These URIs can also
  take the form of relative URI references, where the scheme (and
  usually also the authority) component is missing, but implied by the
  context of the URI reference.  The three forms of URI reference
  syntax are summarized as follows:
  
    <scheme>:<scheme-specific-part>#<fragment>
    <scheme>://<authority><path>?<query>#<fragment>
    <path>?<query>#<fragment>
  
  The components into which a URI reference can be divided depend on the
  I<scheme>.  The C<URI> class provides methods to get and set the
  individual components.  The methods available for a specific
  C<URI> object depend on the scheme.
  
  =head1 CONSTRUCTORS
  
  The following methods construct new C<URI> objects:
  
  =over 4
  
  =item $uri = URI->new( $str )
  
  =item $uri = URI->new( $str, $scheme )
  
  Constructs a new URI object.  The string
  representation of a URI is given as argument, together with an optional
  scheme specification.  Common URI wrappers like "" and <>, as well as
  leading and trailing white space, are automatically removed from
  the $str argument before it is processed further.
  
  The constructor determines the scheme, maps this to an appropriate
  URI subclass, constructs a new object of that class and returns it.
  
  If the scheme isn't one of those that URI recognizes, you still get
  an URI object back that you can access the generic methods on.  The
  C<< $uri->has_recognized_scheme >> method can be used to test for
  this.
  
  The $scheme argument is only used when $str is a
  relative URI.  It can be either a simple string that
  denotes the scheme, a string containing an absolute URI reference, or
  an absolute C<URI> object.  If no $scheme is specified for a relative
  URI $str, then $str is simply treated as a generic URI (no scheme-specific
  methods available).
  
  The set of characters available for building URI references is
  restricted (see L<URI::Escape>).  Characters outside this set are
  automatically escaped by the URI constructor.
  
  =item $uri = URI->new_abs( $str, $base_uri )
  
  Constructs a new absolute URI object.  The $str argument can
  denote a relative or absolute URI.  If relative, then it is
  absolutized using $base_uri as base. The $base_uri must be an absolute
  URI.
  
  =item $uri = URI::file->new( $filename )
  
  =item $uri = URI::file->new( $filename, $os )
  
  Constructs a new I<file> URI from a file name.  See L<URI::file>.
  
  =item $uri = URI::file->new_abs( $filename )
  
  =item $uri = URI::file->new_abs( $filename, $os )
  
  Constructs a new absolute I<file> URI from a file name.  See
  L<URI::file>.
  
  =item $uri = URI::file->cwd
  
  Returns the current working directory as a I<file> URI.  See
  L<URI::file>.
  
  =item $uri->clone
  
  Returns a copy of the $uri.
  
  =back
  
  =head1 COMMON METHODS
  
  The methods described in this section are available for all C<URI>
  objects.
  
  Methods that give access to components of a URI always return the
  old value of the component.  The value returned is C<undef> if the
  component was not present.  There is generally a difference between a
  component that is empty (represented as C<"">) and a component that is
  missing (represented as C<undef>).  If an accessor method is given an
  argument, it updates the corresponding component in addition to
  returning the old value of the component.  Passing an undefined
  argument removes the component (if possible).  The description of
  each accessor method indicates whether the component is passed as
  an escaped (percent-encoded) or an unescaped string.  A component that can be further
  divided into sub-parts are usually passed escaped, as unescaping might
  change its semantics.
  
  The common methods available for all URI are:
  
  =over 4
  
  =item $uri->scheme
  
  =item $uri->scheme( $new_scheme )
  
  Sets and returns the scheme part of the $uri.  If the $uri is
  relative, then $uri->scheme returns C<undef>.  If called with an
  argument, it updates the scheme of $uri, possibly changing the
  class of $uri, and returns the old scheme value.  The method croaks
  if the new scheme name is illegal; a scheme name must begin with a
  letter and must consist of only US-ASCII letters, numbers, and a few
  special marks: ".", "+", "-".  This restriction effectively means
  that the scheme must be passed unescaped.  Passing an undefined
  argument to the scheme method makes the URI relative (if possible).
  
  Letter case does not matter for scheme names.  The string
  returned by $uri->scheme is always lowercase.  If you want the scheme
  just as it was written in the URI in its original case,
  you can use the $uri->_scheme method instead.
  
  =item $uri->has_recognized_scheme
  
  Returns TRUE if the URI scheme is one that URI recognizes.
  
  It will also be TRUE for relative URLs where a recognized
  scheme was provided to the constructor, even if C<< $uri->scheme >>
  returns C<undef> for these.
  
  =item $uri->opaque
  
  =item $uri->opaque( $new_opaque )
  
  Sets and returns the scheme-specific part of the $uri
  (everything between the scheme and the fragment)
  as an escaped string.
  
  =item $uri->path
  
  =item $uri->path( $new_path )
  
  Sets and returns the same value as $uri->opaque unless the URI
  supports the generic syntax for hierarchical namespaces.
  In that case the generic method is overridden to set and return
  the part of the URI between the I<host name> and the I<fragment>.
  
  =item $uri->fragment
  
  =item $uri->fragment( $new_frag )
  
  Returns the fragment identifier of a URI reference
  as an escaped string.
  
  =item $uri->as_string
  
  Returns a URI object to a plain ASCII string.  URI objects are
  also converted to plain strings automatically by overloading.  This
  means that $uri objects can be used as plain strings in most Perl
  constructs.
  
  =item $uri->as_iri
  
  Returns a Unicode string representing the URI.  Escaped UTF-8 sequences
  representing non-ASCII characters are turned into their corresponding Unicode
  code point.
  
  =item $uri->canonical
  
  Returns a normalized version of the URI.  The rules
  for normalization are scheme-dependent.  They usually involve
  lowercasing the scheme and Internet host name components,
  removing the explicit port specification if it matches the default port,
  uppercasing all escape sequences, and unescaping octets that can be
  better represented as plain characters.
  
  For efficiency reasons, if the $uri is already in normalized form,
  then a reference to it is returned instead of a copy.
  
  =item $uri->eq( $other_uri )
  
  =item URI::eq( $first_uri, $other_uri )
  
  Tests whether two URI references are equal.  URI references
  that normalize to the same string are considered equal.  The method
  can also be used as a plain function which can also test two string
  arguments.
  
  If you need to test whether two C<URI> object references denote the
  same object, use the '==' operator.
  
  =item $uri->abs( $base_uri )
  
  Returns an absolute URI reference.  If $uri is already
  absolute, then a reference to it is simply returned.  If the $uri
  is relative, then a new absolute URI is constructed by combining the
  $uri and the $base_uri, and returned.
  
  =item $uri->rel( $base_uri )
  
  Returns a relative URI reference if it is possible to
  make one that denotes the same resource relative to $base_uri.
  If not, then $uri is simply returned.
  
  =item $uri->secure
  
  Returns a TRUE value if the URI is considered to point to a resource on
  a secure channel, such as an SSL or TLS encrypted one.
  
  =back
  
  =head1 GENERIC METHODS
  
  The following methods are available to schemes that use the
  common/generic syntax for hierarchical namespaces.  The descriptions of
  schemes below indicate which these are.  Unrecognized schemes are
  assumed to support the generic syntax, and therefore the following
  methods:
  
  =over 4
  
  =item $uri->authority
  
  =item $uri->authority( $new_authority )
  
  Sets and returns the escaped authority component
  of the $uri.
  
  =item $uri->path
  
  =item $uri->path( $new_path )
  
  Sets and returns the escaped path component of
  the $uri (the part between the host name and the query or fragment).
  The path can never be undefined, but it can be the empty string.
  
  =item $uri->path_query
  
  =item $uri->path_query( $new_path_query )
  
  Sets and returns the escaped path and query
  components as a single entity.  The path and the query are
  separated by a "?" character, but the query can itself contain "?".
  
  =item $uri->path_segments
  
  =item $uri->path_segments( $segment, ... )
  
  Sets and returns the path.  In a scalar context, it returns
  the same value as $uri->path.  In a list context, it returns the
  unescaped path segments that make up the path.  Path segments that
  have parameters are returned as an anonymous array.  The first element
  is the unescaped path segment proper;  subsequent elements are escaped
  parameter strings.  Such an anonymous array uses overloading so it can
  be treated as a string too, but this string does not include the
  parameters.
  
  Note that absolute paths have the empty string as their first
  I<path_segment>, i.e. the I<path> C</foo/bar> have 3
  I<path_segments>; "", "foo" and "bar".
  
  =item $uri->query
  
  =item $uri->query( $new_query )
  
  Sets and returns the escaped query component of
  the $uri.
  
  =item $uri->query_form
  
  =item $uri->query_form( $key1 => $val1, $key2 => $val2, ... )
  
  =item $uri->query_form( $key1 => $val1, $key2 => $val2, ..., $delim )
  
  =item $uri->query_form( \@key_value_pairs )
  
  =item $uri->query_form( \@key_value_pairs, $delim )
  
  =item $uri->query_form( \%hash )
  
  =item $uri->query_form( \%hash, $delim )
  
  Sets and returns query components that use the
  I<application/x-www-form-urlencoded> format.  Key/value pairs are
  separated by "&", and the key is separated from the value by a "="
  character.
  
  The form can be set either by passing separate key/value pairs, or via
  an array or hash reference.  Passing an empty array or an empty hash
  removes the query component, whereas passing no arguments at all leaves
  the component unchanged.  The order of keys is undefined if a hash
  reference is passed.  The old value is always returned as a list of
  separate key/value pairs.  Assigning this list to a hash is unwise as
  the keys returned might repeat.
  
  The values passed when setting the form can be plain strings or
  references to arrays of strings.  Passing an array of values has the
  same effect as passing the key repeatedly with one value at a time.
  All the following statements have the same effect:
  
      $uri->query_form(foo => 1, foo => 2);
      $uri->query_form(foo => [1, 2]);
      $uri->query_form([ foo => 1, foo => 2 ]);
      $uri->query_form([ foo => [1, 2] ]);
      $uri->query_form({ foo => [1, 2] });
  
  The $delim parameter can be passed as ";" to force the key/value pairs
  to be delimited by ";" instead of "&" in the query string.  This
  practice is often recommended for URLs embedded in HTML or XML
  documents as this avoids the trouble of escaping the "&" character.
  You might also set the $URI::DEFAULT_QUERY_FORM_DELIMITER variable to
  ";" for the same global effect.
  
  The C<URI::QueryParam> module can be loaded to add further methods to
  manipulate the form of a URI.  See L<URI::QueryParam> for details.
  
  =item $uri->query_keywords
  
  =item $uri->query_keywords( $keywords, ... )
  
  =item $uri->query_keywords( \@keywords )
  
  Sets and returns query components that use the
  keywords separated by "+" format.
  
  The keywords can be set either by passing separate keywords directly
  or by passing a reference to an array of keywords.  Passing an empty
  array removes the query component, whereas passing no arguments at
  all leaves the component unchanged.  The old value is always returned
  as a list of separate words.
  
  =back
  
  =head1 SERVER METHODS
  
  For schemes where the I<authority> component denotes an Internet host,
  the following methods are available in addition to the generic
  methods.
  
  =over 4
  
  =item $uri->userinfo
  
  =item $uri->userinfo( $new_userinfo )
  
  Sets and returns the escaped userinfo part of the
  authority component.
  
  For some schemes this is a user name and a password separated by
  a colon.  This practice is not recommended. Embedding passwords in
  clear text (such as URI) has proven to be a security risk in almost
  every case where it has been used.
  
  =item $uri->host
  
  =item $uri->host( $new_host )
  
  Sets and returns the unescaped hostname.
  
  If the $new_host string ends with a colon and a number, then this
  number also sets the port.
  
  For IPv6 addresses the brackets around the raw address is removed in the return
  value from $uri->host.  When setting the host attribute to an IPv6 address you
  can use a raw address or one enclosed in brackets.  The address needs to be
  enclosed in brackets if you want to pass in a new port value as well.
  
  =item $uri->ihost
  
  Returns the host in Unicode form.  Any IDNA A-labels are turned into U-labels.
  
  =item $uri->port
  
  =item $uri->port( $new_port )
  
  Sets and returns the port.  The port is a simple integer
  that should be greater than 0.
  
  If a port is not specified explicitly in the URI, then the URI scheme's default port
  is returned. If you don't want the default port
  substituted, then you can use the $uri->_port method instead.
  
  =item $uri->host_port
  
  =item $uri->host_port( $new_host_port )
  
  Sets and returns the host and port as a single
  unit.  The returned value includes a port, even if it matches the
  default port.  The host part and the port part are separated by a
  colon: ":".
  
  For IPv6 addresses the bracketing is preserved; thus
  URI->new("http://[::1]/")->host_port returns "[::1]:80".  Contrast this with
  $uri->host which will remove the brackets.
  
  =item $uri->default_port
  
  Returns the default port of the URI scheme to which $uri
  belongs.  For I<http> this is the number 80, for I<ftp> this
  is the number 21, etc.  The default port for a scheme can not be
  changed.
  
  =back
  
  =head1 SCHEME-SPECIFIC SUPPORT
  
  Scheme-specific support is provided for the following URI schemes.  For C<URI>
  objects that do not belong to one of these, you can only use the common and
  generic methods.
  
  =over 4
  
  =item B<data>:
  
  The I<data> URI scheme is specified in RFC 2397.  It allows inclusion
  of small data items as "immediate" data, as if it had been included
  externally.
  
  C<URI> objects belonging to the data scheme support the common methods
  and two new methods to access their scheme-specific components:
  $uri->media_type and $uri->data.  See L<URI::data> for details.
  
  =item B<file>:
  
  An old specification of the I<file> URI scheme is found in RFC 1738.
  A new RFC 2396 based specification in not available yet, but file URI
  references are in common use.
  
  C<URI> objects belonging to the file scheme support the common and
  generic methods.  In addition, they provide two methods for mapping file URIs
  back to local file names; $uri->file and $uri->dir.  See L<URI::file>
  for details.
  
  =item B<ftp>:
  
  An old specification of the I<ftp> URI scheme is found in RFC 1738.  A
  new RFC 2396 based specification in not available yet, but ftp URI
  references are in common use.
  
  C<URI> objects belonging to the ftp scheme support the common,
  generic and server methods.  In addition, they provide two methods for
  accessing the userinfo sub-components: $uri->user and $uri->password.
  
  =item B<gopher>:
  
  The I<gopher> URI scheme is specified in
  <draft-murali-url-gopher-1996-12-04> and will hopefully be available
  as a RFC 2396 based specification.
  
  C<URI> objects belonging to the gopher scheme support the common,
  generic and server methods. In addition, they support some methods for
  accessing gopher-specific path components: $uri->gopher_type,
  $uri->selector, $uri->search, $uri->string.
  
  =item B<http>:
  
  The I<http> URI scheme is specified in RFC 2616.
  The scheme is used to reference resources hosted by HTTP servers.
  
  C<URI> objects belonging to the http scheme support the common,
  generic and server methods.
  
  =item B<https>:
  
  The I<https> URI scheme is a Netscape invention which is commonly
  implemented.  The scheme is used to reference HTTP servers through SSL
  connections.  Its syntax is the same as http, but the default
  port is different.
  
  =item B<ldap>:
  
  The I<ldap> URI scheme is specified in RFC 2255.  LDAP is the
  Lightweight Directory Access Protocol.  An ldap URI describes an LDAP
  search operation to perform to retrieve information from an LDAP
  directory.
  
  C<URI> objects belonging to the ldap scheme support the common,
  generic and server methods as well as ldap-specific methods: $uri->dn,
  $uri->attributes, $uri->scope, $uri->filter, $uri->extensions.  See
  L<URI::ldap> for details.
  
  =item B<ldapi>:
  
  Like the I<ldap> URI scheme, but uses a UNIX domain socket.  The
  server methods are not supported, and the local socket path is
  available as $uri->un_path.  The I<ldapi> scheme is used by the
  OpenLDAP package.  There is no real specification for it, but it is
  mentioned in various OpenLDAP manual pages.
  
  =item B<ldaps>:
  
  Like the I<ldap> URI scheme, but uses an SSL connection.  This
  scheme is deprecated, as the preferred way is to use the I<start_tls>
  mechanism.
  
  =item B<mailto>:
  
  The I<mailto> URI scheme is specified in RFC 2368.  The scheme was
  originally used to designate the Internet mailing address of an
  individual or service.  It has (in RFC 2368) been extended to allow
  setting of other mail header fields and the message body.
  
  C<URI> objects belonging to the mailto scheme support the common
  methods and the generic query methods.  In addition, they support the
  following mailto-specific methods: $uri->to, $uri->headers.
  
  Note that the "foo@example.com" part of a mailto is I<not> the
  C<userinfo> and C<host> but instead the C<path>.  This allows a
  mailto URI to contain multiple comma separated email addresses.
  
  =item B<mms>:
  
  The I<mms> URL specification can be found at L<http://sdp.ppona.com/>.
  C<URI> objects belonging to the mms scheme support the common,
  generic, and server methods, with the exception of userinfo and
  query-related sub-components.
  
  =item B<news>:
  
  The I<news>, I<nntp> and I<snews> URI schemes are specified in
  <draft-gilman-news-url-01> and will hopefully be available as an RFC
  2396 based specification soon.
  
  C<URI> objects belonging to the news scheme support the common,
  generic and server methods.  In addition, they provide some methods to
  access the path: $uri->group and $uri->message.
  
  =item B<nntp>:
  
  See I<news> scheme.
  
  =item B<pop>:
  
  The I<pop> URI scheme is specified in RFC 2384. The scheme is used to
  reference a POP3 mailbox.
  
  C<URI> objects belonging to the pop scheme support the common, generic
  and server methods.  In addition, they provide two methods to access the
  userinfo components: $uri->user and $uri->auth
  
  =item B<rlogin>:
  
  An old specification of the I<rlogin> URI scheme is found in RFC
  1738. C<URI> objects belonging to the rlogin scheme support the
  common, generic and server methods.
  
  =item B<rtsp>:
  
  The I<rtsp> URL specification can be found in section 3.2 of RFC 2326.
  C<URI> objects belonging to the rtsp scheme support the common,
  generic, and server methods, with the exception of userinfo and
  query-related sub-components.
  
  =item B<rtspu>:
  
  The I<rtspu> URI scheme is used to talk to RTSP servers over UDP
  instead of TCP.  The syntax is the same as rtsp.
  
  =item B<rsync>:
  
  Information about rsync is available from L<http://rsync.samba.org/>.
  C<URI> objects belonging to the rsync scheme support the common,
  generic and server methods.  In addition, they provide methods to
  access the userinfo sub-components: $uri->user and $uri->password.
  
  =item B<sip>:
  
  The I<sip> URI specification is described in sections 19.1 and 25
  of RFC 3261.  C<URI> objects belonging to the sip scheme support the
  common, generic, and server methods with the exception of path related
  sub-components.  In addition, they provide two methods to get and set
  I<sip> parameters: $uri->params_form and $uri->params.
  
  =item B<sips>:
  
  See I<sip> scheme.  Its syntax is the same as sip, but the default
  port is different.
  
  =item B<snews>:
  
  See I<news> scheme.  Its syntax is the same as news, but the default
  port is different.
  
  =item B<telnet>:
  
  An old specification of the I<telnet> URI scheme is found in RFC
  1738. C<URI> objects belonging to the telnet scheme support the
  common, generic and server methods.
  
  =item B<tn3270>:
  
  These URIs are used like I<telnet> URIs but for connections to IBM
  mainframes.  C<URI> objects belonging to the tn3270 scheme support the
  common, generic and server methods.
  
  =item B<ssh>:
  
  Information about ssh is available at L<http://www.openssh.com/>.
  C<URI> objects belonging to the ssh scheme support the common,
  generic and server methods. In addition, they provide methods to
  access the userinfo sub-components: $uri->user and $uri->password.
  
  =item B<sftp>:
  
  C<URI> objects belonging to the sftp scheme support the common,
  generic and server methods. In addition, they provide methods to
  access the userinfo sub-components: $uri->user and $uri->password.
  
  =item B<urn>:
  
  The syntax of Uniform Resource Names is specified in RFC 2141.  C<URI>
  objects belonging to the urn scheme provide the common methods, and also the
  methods $uri->nid and $uri->nss, which return the Namespace Identifier
  and the Namespace-Specific String respectively.
  
  The Namespace Identifier basically works like the Scheme identifier of
  URIs, and further divides the URN namespace.  Namespace Identifier
  assignments are maintained at
  L<http://www.iana.org/assignments/urn-namespaces>.
  
  Letter case is not significant for the Namespace Identifier.  It is
  always returned in lower case by the $uri->nid method.  The $uri->_nid
  method can be used if you want it in its original case.
  
  =item B<urn>:B<isbn>:
  
  The C<urn:isbn:> namespace contains International Standard Book
  Numbers (ISBNs) and is described in RFC 3187.  A C<URI> object belonging
  to this namespace has the following extra methods (if the
  Business::ISBN module is available): $uri->isbn,
  $uri->isbn_publisher_code, $uri->isbn_group_code (formerly isbn_country_code,
  which is still supported by issues a deprecation warning), $uri->isbn_as_ean.
  
  =item B<urn>:B<oid>:
  
  The C<urn:oid:> namespace contains Object Identifiers (OIDs) and is
  described in RFC 3061.  An object identifier consists of sequences of digits
  separated by dots.  A C<URI> object belonging to this namespace has an
  additional method called $uri->oid that can be used to get/set the oid
  value.  In a list context, oid numbers are returned as separate elements.
  
  =back
  
  =head1 CONFIGURATION VARIABLES
  
  The following configuration variables influence how the class and its
  methods behave:
  
  =over 4
  
  =item $URI::ABS_ALLOW_RELATIVE_SCHEME
  
  Some older parsers used to allow the scheme name to be present in the
  relative URL if it was the same as the base URL scheme.  RFC 2396 says
  that this should be avoided, but you can enable this old behaviour by
  setting the $URI::ABS_ALLOW_RELATIVE_SCHEME variable to a TRUE value.
  The difference is demonstrated by the following examples:
  
    URI->new("http:foo")->abs("http://host/a/b")
        ==>  "http:foo"
  
    local $URI::ABS_ALLOW_RELATIVE_SCHEME = 1;
    URI->new("http:foo")->abs("http://host/a/b")
        ==>  "http:/host/a/foo"
  
  
  =item $URI::ABS_REMOTE_LEADING_DOTS
  
  You can also have the abs() method ignore excess ".."
  segments in the relative URI by setting $URI::ABS_REMOTE_LEADING_DOTS
  to a TRUE value.  The difference is demonstrated by the following
  examples:
  
    URI->new("../../../foo")->abs("http://host/a/b")
        ==> "http://host/../../foo"
  
    local $URI::ABS_REMOTE_LEADING_DOTS = 1;
    URI->new("../../../foo")->abs("http://host/a/b")
        ==> "http://host/foo"
  
  =item $URI::DEFAULT_QUERY_FORM_DELIMITER
  
  This value can be set to ";" to have the query form C<key=value> pairs
  delimited by ";" instead of "&" which is the default.
  
  =back
  
  =head1 BUGS
  
  There are some things that are not quite right:
  
  =over
  
  =item *
  
  Using regexp variables like $1 directly as arguments to the URI accessor methods
  does not work too well with current perl implementations.  I would argue
  that this is actually a bug in perl.  The workaround is to quote
  them. Example:
  
     /(...)/ || die;
     $u->query("$1");
  
  
  =item *
  
  The escaping (percent encoding) of chars in the 128 .. 255 range passed to the
  URI constructor or when setting URI parts using the accessor methods depend on
  the state of the internal UTF8 flag (see utf8::is_utf8) of the string passed.
  If the UTF8 flag is set the UTF-8 encoded version of the character is percent
  encoded.  If the UTF8 flag isn't set the Latin-1 version (byte) of the
  character is percent encoded.  This basically exposes the internal encoding of
  Perl strings.
  
  =back
  
  =head1 PARSING URIs WITH REGEXP
  
  As an alternative to this module, the following (official) regular
  expression can be used to decode a URI:
  
    my($scheme, $authority, $path, $query, $fragment) =
    $uri =~ m|(?:([^:/?#]+):)?(?://([^/?#]*))?([^?#]*)(?:\?([^#]*))?(?:#(.*))?|;
  
  The C<URI::Split> module provides the function uri_split() as a
  readable alternative.
  
  =head1 SEE ALSO
  
  L<URI::file>, L<URI::WithBase>, L<URI::QueryParam>, L<URI::Escape>,
  L<URI::Split>, L<URI::Heuristic>
  
  RFC 2396: "Uniform Resource Identifiers (URI): Generic Syntax",
  Berners-Lee, Fielding, Masinter, August 1998.
  
  L<http://www.iana.org/assignments/uri-schemes>
  
  L<http://www.iana.org/assignments/urn-namespaces>
  
  L<http://www.w3.org/Addressing/>
  
  =head1 COPYRIGHT
  
  Copyright 1995-2009 Gisle Aas.
  
  Copyright 1995 Martijn Koster.
  
  This program is free software; you can redistribute it and/or modify
  it under the same terms as Perl itself.
  
  =head1 AUTHORS / ACKNOWLEDGMENTS
  
  This module is based on the C<URI::URL> module, which in turn was
  (distantly) based on the C<wwwurl.pl> code in the libwww-perl for
  perl4 developed by Roy Fielding, as part of the Arcadia project at the
  University of California, Irvine, with contributions from Brooks
  Cutter.
  
  C<URI::URL> was developed by Gisle Aas, Tim Bunce, Roy Fielding and
  Martijn Koster with input from other people on the libwww-perl mailing
  list.
  
  C<URI> and related subclasses was developed by Gisle Aas.
  
  =cut
URI

    $main::fatpacked{"URI/Escape.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'URI_ESCAPE';
  package URI::Escape;
  
  use strict;
  use warnings;
  
  =head1 NAME
  
  URI::Escape - Percent-encode and percent-decode unsafe characters
  
  =head1 SYNOPSIS
  
   use URI::Escape;
   $safe = uri_escape("10% is enough\n");
   $verysafe = uri_escape("foo", "\0-\377");
   $str  = uri_unescape($safe);
  
  =head1 DESCRIPTION
  
  This module provides functions to percent-encode and percent-decode URI strings as
  defined by RFC 3986. Percent-encoding URI's is informally called "URI escaping".
  This is the terminology used by this module, which predates the formalization of the
  terms by the RFC by several years.
  
  A URI consists of a restricted set of characters.  The restricted set
  of characters consists of digits, letters, and a few graphic symbols
  chosen from those common to most of the character encodings and input
  facilities available to Internet users.  They are made up of the
  "unreserved" and "reserved" character sets as defined in RFC 3986.
  
     unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"
     reserved      = ":" / "/" / "?" / "#" / "[" / "]" / "@"
                     "!" / "$" / "&" / "'" / "(" / ")"
                   / "*" / "+" / "," / ";" / "="
  
  In addition, any byte (octet) can be represented in a URI by an escape
  sequence: a triplet consisting of the character "%" followed by two
  hexadecimal digits.  A byte can also be represented directly by a
  character, using the US-ASCII character for that octet.
  
  Some of the characters are I<reserved> for use as delimiters or as
  part of certain URI components.  These must be escaped if they are to
  be treated as ordinary data.  Read RFC 3986 for further details.
  
  The functions provided (and exported by default) from this module are:
  
  =over 4
  
  =item uri_escape( $string )
  
  =item uri_escape( $string, $unsafe )
  
  Replaces each unsafe character in the $string with the corresponding
  escape sequence and returns the result.  The $string argument should
  be a string of bytes.  The uri_escape() function will croak if given a
  characters with code above 255.  Use uri_escape_utf8() if you know you
  have such chars or/and want chars in the 128 .. 255 range treated as
  UTF-8.
  
  The uri_escape() function takes an optional second argument that
  overrides the set of characters that are to be escaped.  The set is
  specified as a string that can be used in a regular expression
  character class (between [ ]).  E.g.:
  
    "\x00-\x1f\x7f-\xff"          # all control and hi-bit characters
    "a-z"                         # all lower case characters
    "^A-Za-z"                     # everything not a letter
  
  The default set of characters to be escaped is all those which are
  I<not> part of the C<unreserved> character class shown above as well
  as the reserved characters.  I.e. the default is:
  
      "^A-Za-z0-9\-\._~"
  
  =item uri_escape_utf8( $string )
  
  =item uri_escape_utf8( $string, $unsafe )
  
  Works like uri_escape(), but will encode chars as UTF-8 before
  escaping them.  This makes this function able to deal with characters
  with code above 255 in $string.  Note that chars in the 128 .. 255
  range will be escaped differently by this function compared to what
  uri_escape() would.  For chars in the 0 .. 127 range there is no
  difference.
  
  Equivalent to:
  
      utf8::encode($string);
      my $uri = uri_escape($string);
  
  Note: JavaScript has a function called escape() that produces the
  sequence "%uXXXX" for chars in the 256 .. 65535 range.  This function
  has really nothing to do with URI escaping but some folks got confused
  since it "does the right thing" in the 0 .. 255 range.  Because of
  this you sometimes see "URIs" with these kind of escapes.  The
  JavaScript encodeURIComponent() function is similar to uri_escape_utf8().
  
  =item uri_unescape($string,...)
  
  Returns a string with each %XX sequence replaced with the actual byte
  (octet).
  
  This does the same as:
  
     $string =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg;
  
  but does not modify the string in-place as this RE would.  Using the
  uri_unescape() function instead of the RE might make the code look
  cleaner and is a few characters less to type.
  
  In a simple benchmark test I did,
  calling the function (instead of the inline RE above) if a few chars
  were unescaped was something like 40% slower, and something like 700% slower if none were.  If
  you are going to unescape a lot of times it might be a good idea to
  inline the RE.
  
  If the uri_unescape() function is passed multiple strings, then each
  one is returned unescaped.
  
  =back
  
  The module can also export the C<%escapes> hash, which contains the
  mapping from all 256 bytes to the corresponding escape codes.  Lookup
  in this hash is faster than evaluating C<sprintf("%%%02X", ord($byte))>
  each time.
  
  =head1 SEE ALSO
  
  L<URI>
  
  
  =head1 COPYRIGHT
  
  Copyright 1995-2004 Gisle Aas.
  
  This program is free software; you can redistribute it and/or modify
  it under the same terms as Perl itself.
  
  =cut
  
  use Exporter 5.57 'import';
  our %escapes;
  our @EXPORT = qw(uri_escape uri_unescape uri_escape_utf8);
  our @EXPORT_OK = qw(%escapes);
  our $VERSION = "3.31";
  
  use Carp ();
  
  # Build a char->hex map
  for (0..255) {
      $escapes{chr($_)} = sprintf("%%%02X", $_);
  }
  
  my %subst;  # compiled patterns
  
  my %Unsafe = (
      RFC2732 => qr/[^A-Za-z0-9\-_.!~*'()]/,
      RFC3986 => qr/[^A-Za-z0-9\-\._~]/,
  );
  
  sub uri_escape {
      my($text, $patn) = @_;
      return undef unless defined $text;
      if (defined $patn){
          unless (exists  $subst{$patn}) {
              # Because we can't compile the regex we fake it with a cached sub
              (my $tmp = $patn) =~ s,/,\\/,g;
              eval "\$subst{\$patn} = sub {\$_[0] =~ s/([$tmp])/\$escapes{\$1} || _fail_hi(\$1)/ge; }";
              Carp::croak("uri_escape: $@") if $@;
          }
          &{$subst{$patn}}($text);
      } else {
          $text =~ s/($Unsafe{RFC3986})/$escapes{$1} || _fail_hi($1)/ge;
      }
      $text;
  }
  
  sub _fail_hi {
      my $chr = shift;
      Carp::croak(sprintf "Can't escape \\x{%04X}, try uri_escape_utf8() instead", ord($chr));
  }
  
  sub uri_escape_utf8 {
      my $text = shift;
      return undef unless defined $text;
      utf8::encode($text);
      return uri_escape($text, @_);
  }
  
  sub uri_unescape {
      # Note from RFC1630:  "Sequences which start with a percent sign
      # but are not followed by two hexadecimal characters are reserved
      # for future extension"
      my $str = shift;
      if (@_ && wantarray) {
          # not executed for the common case of a single argument
          my @str = ($str, @_);  # need to copy
          for (@str) {
              s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg;
          }
          return @str;
      }
      $str =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg if defined $str;
      $str;
  }
  
  # XXX FIXME escape_char is buggy as it assigns meaning to the string's storage format.
  sub escape_char {
      # Old versions of utf8::is_utf8() didn't properly handle magical vars (e.g. $1).
      # The following forces a fetch to occur beforehand.
      my $dummy = substr($_[0], 0, 0);
  
      if (utf8::is_utf8($_[0])) {
          my $s = shift;
          utf8::encode($s);
          unshift(@_, $s);
      }
  
      return join '', @URI::Escape::escapes{split //, $_[0]};
  }
  
  1;
URI_ESCAPE

    $main::fatpacked{"URI/Find.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'URI_FIND';
  package URI::Find;
  
  require 5.006;
  
  use strict;
  use warnings;
  use base qw(Exporter);
  use vars qw($VERSION @EXPORT);
  
  $VERSION        = 20160806;
  @EXPORT         = qw(find_uris);
  
  use constant YES => (1==1);
  use constant NO  => !YES;
  
  use Carp        qw(croak);
  
  require URI;
  
  my $reserved   = q(;/?:@&=+$,[]);
  my $mark       = q(-_.!~*'());
  my $unreserved = "A-Za-z0-9\Q$mark\E";
  my $uric       = quotemeta($reserved) . '\p{isAlpha}' . $unreserved . "%";
  
  # URI scheme pattern without the non-alpha numerics.
  # Those are extremely uncommon and interfere with the match.
  my($schemeRe) = qr/[a-zA-Z][a-zA-Z0-9\+]*/;
  my($uricSet)  = $uric; # use new set
  
  # Some schemes which URI.pm does not explicitly support.
  my $extraSchemesRe = qr{^(?:git|svn|ssh|svn\+ssh)$};
  
  # We need to avoid picking up 'HTTP::Request::Common' so we have a
  # subset of uric without a colon ("I have no colon and yet I must poop")
  my($uricCheat) = __PACKAGE__->uric_set;
  $uricCheat =~ tr/://d;
  
  # Identifying characters accidentally picked up with a URI.
  my($cruftSet) = q{])\},.'";}; #'#
  
  
  =head1 NAME
  
  URI::Find - Find URIs in arbitrary text
  
  =head1 SYNOPSIS
  
    require URI::Find;
  
    my $finder = URI::Find->new(\&callback);
  
    $how_many_found = $finder->find(\$text);
  
  =head1 DESCRIPTION
  
  This module does one thing: Finds URIs and URLs in plain text.  It
  finds them quickly and it finds them B<all> (or what URI.pm considers
  a URI to be.)  It only finds URIs which include a scheme (http:// or
  the like), for something a bit less strict have a look at
  L<URI::Find::Schemeless|URI::Find::Schemeless>.
  
  For a command-line interface, L<urifind> is provided.
  
  =head2 Public Methods
  
  =over 4
  
  =item B<new>
  
    my $finder = URI::Find->new(\&callback);
  
  Creates a new URI::Find object.
  
  &callback is a function which is called on each URI found.  It is
  passed two arguments, the first is a URI object representing the URI
  found.  The second is the original text of the URI found.  The return
  value of the callback will replace the original URI in the text.
  
  =cut
  
  sub new {
      @_ == 2 || __PACKAGE__->badinvo;
      my($proto, $callback) = @_;
      my($class) = ref $proto || $proto;
      my $self = bless {}, $class;
  
      $self->{callback} = $callback;
  
      return $self;
  }
  
  =item B<find>
  
    my $how_many_found = $finder->find(\$text);
  
  $text is a string to search and possibly modify with your callback.
  
  Alternatively, C<find> can be called with a replacement function for
  the rest of the text:
  
    use CGI qw(escapeHTML);
    # ...
    my $how_many_found = $finder->find(\$text, \&escapeHTML);
  
  will not only call the callback function for every URL found (and
  perform the replacement instructions therein), but also run the rest
  of the text through C<escapeHTML()>. This makes it easier to turn
  plain text which contains URLs into HTML (see example below).
  
  =cut
  
  sub find {
      @_ == 2 || @_ == 3 || __PACKAGE__->badinvo;
      my($self, $r_text, $escape_func) = @_;
  
      # Might be slower, but it makes the code simpler
      $escape_func ||= sub { return $_[0] };
  
      # Store the escape func in the object temporarily for use
      # by other methods.
      local $self->{escape_func} = $escape_func;
  
      $self->{_uris_found} = 0;
  
      # Yes, evil.  Basically, look for something vaguely resembling a URL,
      # then hand it off to URI for examination.  If it passes, throw
      # it to a callback and put the result in its place.
      local $SIG{__DIE__} = 'DEFAULT';
      my $uri_cand;
      my $uri;
  
      my $uriRe = sprintf '(?:%s|%s)', $self->uri_re, $self->schemeless_uri_re;
  
      $$r_text =~ s{ (.*?) (?:(<(?:URL:)?)(.+?)(>)|($uriRe)) | (.+?)$ }{
          my $replace = '';
          if( defined $6 ) {
              $replace = $escape_func->($6);
          }
          else {
              my $maybe_uri = '';
  
              $replace = $escape_func->($1) if length $1;
  
              if( defined $2 ) {
                  $maybe_uri = $3;
                  my $is_uri = do {  # Don't alter $1...
                      $maybe_uri =~ s/\s+//g;
                      $maybe_uri =~ /^$uriRe/;
                  };
  
                  if( $is_uri ) {
                      $replace .= $escape_func->($2);
                      $replace .= $self->_uri_filter($maybe_uri);
                      $replace .= $escape_func->($4);
                  }
                  else {
                      # the whole text inside of the <...> was not a url, but
                      # maybe it has a url (like an HTML <a> link)
                      my $has_uri = do { # Don't alter $1...
                          $maybe_uri = $3;
                          $maybe_uri =~ /$uriRe/;
                      };
                      if( $has_uri ) {
                          my $pre = $2;
                          my $post = $4;
                          do { $self->find(\$maybe_uri, $escape_func) };
                          $replace .= $escape_func->($pre);
                          $replace .= $maybe_uri;  # already escaped by find()
                          $replace .= $escape_func->($post);
                      }
                      else {
                          $replace .= $escape_func->($2.$3.$4);
                      }
                  }
              }
              else {
                  $replace .= $self->_uri_filter($5);
              }
          }
  
          $replace;
      }gsex;
  
      return $self->{_uris_found};
  }
  
  
  sub _uri_filter {
      my($self, $orig_match) = @_;
  
      # A heuristic.  Often you'll see things like:
      # "I saw this site, http://www.foo.com, and its really neat!"
      # or "Foo Industries (at http://www.foo.com)"
      # We want to avoid picking up the trailing paren, period or comma.
      # Of course, this might wreck a perfectly valid URI, more often than
      # not it corrects a parse mistake.
      $orig_match = $self->decruft($orig_match);
  
      my $replacement = '';
      if( my $uri = $self->_is_uri(\$orig_match) ) {
          # It's a URI
          $self->{_uris_found}++;
          $replacement = $self->{callback}->($uri, $orig_match);
      }
      else {
          # False alarm
          $replacement = $self->{escape_func}->($orig_match);
      }
  
      # Return recrufted replacement
      return $self->recruft($replacement);
  }
  
  
  =back
  
  =head2 Protected Methods
  
  I got a bunch of mail from people asking if I'd add certain features
  to URI::Find.  Most wanted the search to be less restrictive, do more
  heuristics, etc...  Since many of the requests were contradictory, I'm
  letting people create their own custom subclasses to do what they
  want.
  
  The following are methods internal to URI::Find which a subclass can
  override to change the way URI::Find acts.  They are only to be called
  B<inside> a URI::Find subclass.  Users of this module are NOT to use
  these methods.
  
  =over
  
  =item B<uri_re>
  
    my $uri_re = $self->uri_re;
  
  Returns the regex for finding absolute, schemed URIs
  (http://www.foo.com and such).  This, combined with
  schemeless_uri_re() is what finds candidate URIs.
  
  Usually this method does not have to be overridden.
  
  =cut
  
  sub uri_re {
      @_ == 1 || __PACKAGE__->badinvo;
      my($self) = shift;
      return sprintf '%s:[%s][%s#]*', $schemeRe,
                                      $uricCheat,
                                      $self->uric_set;
  }
  
  =item B<schemeless_uri_re>
  
    my $schemeless_re = $self->schemeless_uri_re;
  
  Returns the regex for finding schemeless URIs (www.foo.com and such) and
  other things which might be URIs.  By default this will match nothing
  (though it used to try to find schemeless URIs which started with C<www>
  and C<ftp>).
  
  Many people will want to override this method.  See L<URI::Find::Schemeless>
  for a subclass does a reasonable job of finding URIs which might be missing
  the scheme.
  
  =cut
  
  sub schemeless_uri_re {
      @_ == 1 || __PACKAGE__->badinvo;
      my($self) = shift;
      return qr/\b\B/; # match nothing
  }
  
  =item B<uric_set>
  
    my $uric_set = $self->uric_set;
  
  Returns a set matching the 'uric' set defined in RFC 2396 suitable for
  putting into a character set ([]) in a regex.
  
  You almost never have to override this.
  
  =cut
  
  sub uric_set {
      @_ == 1 || __PACKAGE__->badinvo;
      return $uricSet;
  }
  
  =item B<cruft_set>
  
    my $cruft_set = $self->cruft_set;
  
  Returns a set of characters which are considered garbage.  Used by
  decruft().
  
  =cut
  
  sub cruft_set {
      @_ == 1 || __PACKAGE__->badinvo;
      return $cruftSet;
  }
  
  =item B<decruft>
  
    my $uri = $self->decruft($uri);
  
  Sometimes garbage characters like periods and parenthesis get
  accidentally matched along with the URI.  In order for the URI to be
  properly identified, it must sometimes be "decrufted", the garbage
  characters stripped.
  
  This method takes a candidate URI and strips off any cruft it finds.
  
  =cut
  
  my %balanced_cruft = (
      '('         => ')',
      '{'         => '}',
      '['         => ']',
      '"'         => '"',
      q[']        => q['],
  );
  
  sub decruft {
      @_ == 2 || __PACKAGE__->badinvo;
      my($self, $orig_match) = @_;
  
      $self->{start_cruft} = '';
      $self->{end_cruft} = '';
  
      if( $orig_match =~ s/([\Q$cruftSet\E]+)$// ) {
          # urls can end with HTML entities if found in HTML so let's put back semicolons
          # if this looks like the case
          my $cruft = $1;
          if( $cruft =~ /^;/ && $orig_match =~ /\&(\#[1-9]\d{1,3}|[a-zA-Z]{2,8})$/) {
              $orig_match .= ';';
              $cruft =~ s/^;//;
          }
  
          while( my($open, $close) = each %balanced_cruft ) {
              $self->recruft_balanced(\$orig_match, \$cruft, $open, $close);
          }
  
          $self->{end_cruft} = $cruft if $cruft;
      }
  
      return $orig_match;
  }
  
  
  sub recruft_balanced {
      my $self = shift;
      my($orig_match, $cruft, $open, $close) = @_;
  
      my $open_count  = () = $$orig_match =~ m{\Q$open}g;
      my $close_count = () = $$orig_match =~ m{\Q$close}g;
  
      if ( $$cruft =~ /\Q$close\E$/ && $open_count == ( $close_count + 1 ) ) {
          $$orig_match .= $close;
          $$cruft =~ s/\Q$close\E$//;
      }
  
      return;
  }
  
  
  =item B<recruft>
  
    my $uri = $self->recruft($uri);
  
  This method puts back the cruft taken off with decruft().  This is necessary
  because the cruft is destructively removed from the string before invoking
  the user's callback, so it has to be put back afterwards.
  
  =cut
  
  #'#
  
  sub recruft {
      @_ == 2 || __PACKAGE__->badinvo;
      my($self, $uri) = @_;
  
      return $self->{start_cruft} . $uri . $self->{end_cruft};
  }
  
  =item B<schemeless_to_schemed>
  
    my $schemed_uri = $self->schemeless_to_schemed($schemeless_uri);
  
  This takes a schemeless URI and returns an absolute, schemed URI.  The
  standard implementation supplies ftp:// for URIs which start with ftp.,
  and http:// otherwise.
  
  =cut
  
  sub schemeless_to_schemed {
      @_ == 2 || __PACKAGE__->badinvo;
      my($self, $uri_cand) = @_;
  
      $uri_cand =~ s|^(<?)ftp\.|$1ftp://ftp\.|
          or $uri_cand =~ s|^(<?)|${1}http://|;
  
      return $uri_cand;
  }
  
  =item B<is_schemed>
  
    $obj->is_schemed($uri);
  
  Returns whether or not the given URI is schemed or schemeless.  True for
  schemed, false for schemeless.
  
  =cut
  
  sub is_schemed {
      @_ == 2 || __PACKAGE__->badinvo;
      my($self, $uri) = @_;
      return scalar $uri =~ /^<?$schemeRe:/;
  }
  
  =item I<badinvo>
  
    __PACKAGE__->badinvo($extra_levels, $msg)
  
  This is used to complain about bogus subroutine/method invocations.
  The args are optional.
  
  =cut
  
  sub badinvo {
      my $package = shift;
      my $level   = @_ ? shift : 0;
      my $msg     = @_ ? " (" . shift() . ")" : '';
      my $subname = (caller $level + 1)[3];
      croak "Bogus invocation of $subname$msg";
  }
  
  =back
  
  =head2 Old Functions
  
  The old find_uri() function is still around and it works, but its
  deprecated.
  
  =cut
  
  # Old interface.
  sub find_uris (\$&) {
      @_ == 2 || __PACKAGE__->badinvo;
      my($r_text, $callback) = @_;
  
      my $self = __PACKAGE__->new($callback);
      return $self->find($r_text);
  }
  
  
  =head1 EXAMPLES
  
  Store a list of all URIs (normalized) in the document.
  
    my @uris;
    my $finder = URI::Find->new(sub {
        my($uri) = shift;
        push @uris, $uri;
    });
    $finder->find(\$text);
  
  Print the original URI text found and the normalized representation.
  
    my $finder = URI::Find->new(sub {
        my($uri, $orig_uri) = @_;
        print "The text '$orig_uri' represents '$uri'\n";
        return $orig_uri;
    });
    $finder->find(\$text);
  
  Check each URI in document to see if it exists.
  
    use LWP::Simple;
  
    my $finder = URI::Find->new(sub {
        my($uri, $orig_uri) = @_;
        if( head $uri ) {
            print "$orig_uri is okay\n";
        }
        else {
            print "$orig_uri cannot be found\n";
        }
        return $orig_uri;
    });
    $finder->find(\$text);
  
  
  Turn plain text into HTML, with each URI found wrapped in an HTML anchor.
  
    use CGI qw(escapeHTML);
    use URI::Find;
  
    my $finder = URI::Find->new(sub {
        my($uri, $orig_uri) = @_;
        return qq|<a href="$uri">$orig_uri</a>|;
    });
    $finder->find(\$text, \&escapeHTML);
    print "<pre>$text</pre>";
  
  =cut
  
  
  sub _is_uri {
      @_ == 2 || __PACKAGE__->badinvo;
      my($self, $r_uri_cand) = @_;
  
      my $uri = $$r_uri_cand;
  
      # Translate schemeless to schemed if necessary.
      $uri = $self->schemeless_to_schemed($uri) if
        $uri =~ $self->schemeless_uri_re   and
        $uri !~ /^<?$schemeRe:/;
  
      eval {
          $uri = URI->new($uri);
  
          # Throw out anything with an invalid scheme.
          my $has_invalid_scheme = $uri->isa("URI::_foreign") &&
                                   $uri->scheme !~ $extraSchemesRe;
  
          # Toss out things like http:// but keep file:///
          my $is_empty = $uri =~ m{^$schemeRe://$};
  
          undef $uri if $has_invalid_scheme || $is_empty;
      };
  
      if($@ || !defined $uri) {   # leave everything untouched, its not a URI.
          return NO;
      }
      else {                      # Its a URI.
          return $uri;
      }
  }
  
  
  =head1 NOTES
  
  Will not find URLs with Internationalized Domain Names or pretty much
  any non-ascii stuff in them.  See
  L<http://rt.cpan.org/Ticket/Display.html?id=44226>
  
  
  =head1 AUTHOR
  
  Michael G Schwern <schwern@pobox.com> with insight from Uri Gutman,
  Greg Bacon, Jeff Pinyan, Roderick Schertler and others.
  
  Roderick Schertler <roderick@argon.org> maintained versions 0.11 to 0.16.
  
  Darren Chamberlain wrote urifind.
  
  
  =head1 LICENSE
  
  Copyright 2000, 2009-2010, 2014, 2016 by Michael G Schwern E<lt>schwern@pobox.comE<gt>.
  
  This program is free software; you can redistribute it and/or 
  modify it under the same terms as Perl itself.
  
  See F<http://www.perlfoundation.org/artistic_license_1_0>
  
  =head1 SEE ALSO
  
  L<urifind>, L<URI::Find::Schemeless>, L<URI>, RFC 3986 Appendix C
  
  =cut
  
  1;
URI_FIND

    $main::fatpacked{"URI/Find/Schemeless.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'URI_FIND_SCHEMELESS';
  # Copyright (c) 2000, 2009 Michael G. Schwern.  All rights reserved.
  # This program is free software; you can redistribute it and/or modify
  # it under the same terms as Perl itself.
  
  package URI::Find::Schemeless;
  
  use strict;
  use warnings;
  use base qw(URI::Find);
  
  # base.pm error in 5.005_03 prevents it from loading URI::Find if I'm
  # required first.
  use URI::Find ();
  
  use vars qw($VERSION);
  $VERSION = 20160806;
  
  my($dnsSet) = '\p{isAlpha}A-Za-z0-9-'; # extended for IDNA domains
  
  my($cruftSet) = __PACKAGE__->cruft_set . '<>?}';
  
  my($tldRe) = __PACKAGE__->top_level_domain_re;
  
  my($uricSet) = __PACKAGE__->uric_set;
  
  =head1 NAME
  
  URI::Find::Schemeless - Find schemeless URIs in arbitrary text.
  
  
  =head1 SYNOPSIS
  
    require URI::Find::Schemeless;
  
    my $finder = URI::Find::Schemeless->new(\&callback);
  
    The rest is the same as URI::Find.
  
  
  =head1 DESCRIPTION
  
  URI::Find finds absolute URIs in plain text with some weak heuristics
  for finding schemeless URIs.  This subclass is for finding things
  which might be URIs in free text.  Things like "www.foo.com" and
  "lifes.a.bitch.if.you.aint.got.net".
  
  The heuristics are such that it hopefully finds a minimum of false
  positives, but there's no easy way for it know if "COMMAND.COM" refers
  to a web site or a file.
  
  =cut
  
  sub schemeless_uri_re {
      @_ == 1 || __PACKAGE__->badinvo;
      return qr{
                # Originally I constrained what couldn't be before the match
                # like this:  don't match email addresses, and don't start
                # anywhere but at the beginning of a host name
                #    (?<![\@.$dnsSet])
                # but I switched to saying what can be there after seeing a
                # false match of "Lite.pm" via "MIME/Lite.pm".
                (?: ^ | (?<=[\s<>()\{\}\[\]]) )
                # hostname
                (?: [$dnsSet]+(?:\.[$dnsSet]+)*\.$tldRe
                    | (?:\d{1,3}\.){3}\d{1,3} ) # not inet_aton() complete
                (?:
                    (?=[\s\Q$cruftSet\E]) # followed by unrelated thing
                    (?!\.\w)              #   but don't stop mid foo.xx.bar
                        (?<!\.p[ml])      #   but exclude Foo.pm and Foo.pl
                    |$                    # or end of line
                        (?<!\.p[ml])      #   but exclude Foo.pm and Foo.pl
                    |/[$uricSet#]*        # or slash and URI chars
                )
             }x;
  }
  
  =head3 top_level_domain_re
  
    my $tld_re = $self->top_level_domain_re;
  
  Returns the regex for matching top level DNS domains.  The regex shouldn't
  be anchored, it shouldn't do any capturing matches, and it should make
  itself ignore case.
  
  =cut
  
  sub top_level_domain_re {
      @_ == 1 || __PACKAGE__->badinvo;
      my($self) = shift;
  
      use utf8;
      # Updated from http://www.iana.org/domains/root/db/ with new TLDs
      my $plain = join '|', qw(
          AERO
          ARPA
          ASIA
          BIZ
          CAT
          COM
          COOP
          EDU
          GOV
          INFO
          INT
          JOBS
          MIL
          MOBI
          MUSEUM
          NAME
          NET
          ORG
          PRO
          TEL
          TRAVEL
          ac
          academy
          accountants
          active
          actor
          ad
          ae
          aero
          af
          ag
          agency
          ai
          airforce
          al
          am
          an
          ao
          aq
          ar
          archi
          army
          arpa
          as
          asia
          associates
          at
          attorney
          au
          audio
          autos
          aw
          ax
          axa
          az
          ba
          bar
          bargains
          bayern
          bb
          bd
          be
          beer
          berlin
          best
          bf
          bg
          bh
          bi
          bid
          bike
          bio
          biz
          bj
          bl
          black
          blackfriday
          blue
          bm
          bmw
          bn
          bo
          boutique
          bq
          br
          brussels
          bs
          bt
          build
          builders
          buzz
          bv
          bw
          by
          bz
          bzh
          ca
          cab
          camera
          camp
          capetown
          capital
          cards
          care
          career
          careers
          cash
          cat
          catering
          cc
          cd
          center
          ceo
          cf
          cg
          ch
          cheap
          christmas
          church
          ci
          citic
          ck
          cl
          claims
          cleaning
          clinic
          clothing
          club
          cm
          cn
          co
          codes
          coffee
          college
          cologne
          com
          community
          company
          computer
          condos
          construction
          consulting
          contractors
          cooking
          cool
          coop
          country
          cr
          credit
          creditcard
          cruises
          cu
          cv
          cw
          cx
          cy
          cz
          dance
          dating
          de
          degree
          democrat
          dental
          dentist
          desi
          diamonds
          digital
          directory
          discount
          dj
          dk
          dm
          dnp
          do
          domains
          durban
          dz
          ec
          edu
          education
          ee
          eg
          eh
          email
          engineer
          engineering
          enterprises
          equipment
          er
          es
          estate
          et
          eu
          eus
          events
          exchange
          expert
          exposed
          fail
          farm
          feedback
          fi
          finance
          financial
          fish
          fishing
          fitness
          fj
          fk
          flights
          florist
          fm
          fo
          foo
          foundation
          fr
          frogans
          fund
          furniture
          futbol
          ga
          gal
          gallery
          gb
          gd
          ge
          gf
          gg
          gh
          gi
          gift
          gives
          gl
          glass
          global
          globo
          gm
          gmo
          gn
          gop
          gov
          gp
          gq
          gr
          graphics
          gratis
          green
          gripe
          gs
          gt
          gu
          guide
          guitars
          guru
          gw
          gy
          hamburg
          haus
          hiphop
          hiv
          hk
          hm
          hn
          holdings
          holiday
          homes
          horse
          host
          house
          hr
          ht
          hu
          id
          ie
          il
          im
          immobilien
          in
          industries
          info
          ink
          institute
          insure
          int
          international
          investments
          io
          iq
          ir
          is
          it
          je
          jetzt
          jm
          jo
          jobs
          joburg
          jp
          juegos
          kaufen
          ke
          kg
          kh
          ki
          kim
          kitchen
          kiwi
          km
          kn
          koeln
          kp
          kr
          kred
          kw
          ky
          kz
          la
          land
          lawyer
          lb
          lc
          lease
          li
          life
          lighting
          limited
          limo
          link
          lk
          loans
          london
          lotto
          lr
          ls
          lt
          lu
          luxe
          luxury
          lv
          ly
          ma
          maison
          management
          mango
          market
          marketing
          mc
          md
          me
          media
          meet
          menu
          mf
          mg
          mh
          miami
          mil
          mini
          mk
          ml
          mm
          mn
          mo
          mobi
          moda
          moe
          monash
          mortgage
          moscow
          motorcycles
          mp
          mq
          mr
          ms
          mt
          mu
          museum
          mv
          mw
          mx
          my
          mz
          na
          nagoya
          name
          navy
          nc
          ne
          net
          neustar
          nf
          ng
          nhk
          ni
          ninja
          nl
          no
          np
          nr
          nu
          nyc
          nz
          okinawa
          om
          onl
          org
          organic
          ovh
          pa
          paris
          partners
          parts
          pe
          pf
          pg
          ph
          photo
          photography
          photos
          physio
          pics
          pictures
          pink
          pk
          pl
          plumbing
          pm
          pn
          post
          pr
          press
          pro
          productions
          properties
          ps
          pt
          pub
          pw
          py
          qa
          qpon
          quebec
          re
          recipes
          red
          rehab
          reise
          reisen
          ren
          rentals
          repair
          report
          republican
          rest
          reviews
          rich
          rio
          ro
          rocks
          rodeo
          rs
          ru
          ruhr
          rw
          ryukyu
          sa
          saarland
          sb
          sc
          schule
          scot
          sd
          se
          services
          sexy
          sg
          sh
          shiksha
          shoes
          si
          singles
          sj
          sk
          sl
          sm
          sn
          so
          social
          software
          sohu
          solar
          solutions
          soy
          space
          sr
          ss
          st
          su
          supplies
          supply
          support
          surf
          surgery
          sv
          sx
          sy
          systems
          sz
          tattoo
          tax
          tc
          td
          technology
          tel
          tf
          tg
          th
          tienda
          tips
          tirol
          tj
          tk
          tl
          tm
          tn
          to
          today
          tokyo
          tools
          town
          toys
          tp
          tr
          trade
          training
          travel
          tt
          tv
          tw
          tz
          ua
          ug
          uk
          um
          university
          uno
          us
          uy
          uz
          va
          vacations
          vc
          ve
          vegas
          ventures
          versicherung
          vet
          vg
          vi
          viajes
          villas
          vision
          vlaanderen
          vn
          vodka
          vote
          voting
          voto
          voyage
          vu
          wang
          watch
          webcam
          website
          wed
          wf
          wien
          wiki
          works
          ws
          wtc
          wtf
          测试
             परीक्षा
          集团
          在线
          한국
           ভারত
          موقع
           বাংলা
          公益
          公司
          移动
          我爱你
          москва
          испытание
          қаз
          онлайн
          сайт
          срб
          테스트
          орг
          삼성
            சிங்கப்பூர்
          商标
          商城
          дети
          мкд
          טעסט
          中文网
          中信
          中国
          中國
                       భారత్
                 ලංකා
          測試
                  ભારત
             भारत
          آزمایشی
             பரிட்சை
             संगठन
          网络
          укр
          香港
          δοκιμή
          إختبار
          台湾
          台灣
          мон
          الجزائر
          عمان
          ایران
          امارات
          بازار
          پاکستان
          الاردن
          بھارت
          المغرب
          السعودية
          سودان
          مليسيا
          شبكة
          გე
          机构
          组织机构
                       ไทย
          سورية
          рф
          تونس
          みんな
          世界
                       ਭਾਰਤ
          网址
          游戏
          مصر
          قطر
            இலங்கை
            இந்தியா
          新加坡
          فلسطين
          テスト
          政务
          xxx
          xyz
          yachts
          ye
          yokohama
          yt
          za
          zm
          zone
          zw
      );
      
      return qr/(?:$plain)/i;
  }
  
  =head1 AUTHOR
  
  Original code by Roderick Schertler <roderick@argon.org>, adapted by
  Michael G Schwern <schwern@pobox.com>.
  
  Currently maintained by Roderick Schertler <roderick@argon.org>.
  
  =head1 SEE ALSO
  
    L<URI::Find>
  
  =cut
  
  1;
URI_FIND_SCHEMELESS

    $main::fatpacked{"URI/Heuristic.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'URI_HEURISTIC';
  package URI::Heuristic;
  
  =head1 NAME
  
  URI::Heuristic - Expand URI using heuristics
  
  =head1 SYNOPSIS
  
   use URI::Heuristic qw(uf_uristr);
   $u = uf_uristr("perl");             # http://www.perl.com
   $u = uf_uristr("www.sol.no/sol");   # http://www.sol.no/sol
   $u = uf_uristr("aas");              # http://www.aas.no
   $u = uf_uristr("ftp.funet.fi");     # ftp://ftp.funet.fi
   $u = uf_uristr("/etc/passwd");      # file:/etc/passwd
  
  =head1 DESCRIPTION
  
  This module provides functions that expand strings into real absolute
  URIs using some built-in heuristics.  Strings that already represent
  absolute URIs (i.e. that start with a C<scheme:> part) are never modified
  and are returned unchanged.  The main use of these functions is to
  allow abbreviated URIs similar to what many web browsers allow for URIs
  typed in by the user.
  
  The following functions are provided:
  
  =over 4
  
  =item uf_uristr($str)
  
  Tries to make the argument string
  into a proper absolute URI string.  The "uf_" prefix stands for "User 
  Friendly".  Under MacOS, it assumes that any string with a common URL 
  scheme (http, ftp, etc.) is a URL rather than a local path.  So don't name 
  your volumes after common URL schemes and expect uf_uristr() to construct 
  valid file: URL's on those volumes for you, because it won't.
  
  =item uf_uri($str)
  
  Works the same way as uf_uristr() but
  returns a C<URI> object.
  
  =back
  
  =head1 ENVIRONMENT
  
  If the hostname portion of a URI does not contain any dots, then
  certain qualified guesses are made.  These guesses are governed by
  the following environment variables:
  
  =over 10
  
  =item COUNTRY
  
  The two-letter country code (ISO 3166) for your location.  If
  the domain name of your host ends with two letters, then it is taken
  to be the default country. See also L<Locale::Country>.
  
  =item HTTP_ACCEPT_LANGUAGE, LC_ALL, LANG
  
  If COUNTRY is not set, these standard environment variables are
  examined and country (not language) information possibly found in them
  is used as the default country.
  
  =item URL_GUESS_PATTERN
  
  Contains a space-separated list of URL patterns to try.  The string
  "ACME" is for some reason used as a placeholder for the host name in
  the URL provided.  Example:
  
   URL_GUESS_PATTERN="www.ACME.no www.ACME.se www.ACME.com"
   export URL_GUESS_PATTERN
  
  Specifying URL_GUESS_PATTERN disables any guessing rules based on
  country.  An empty URL_GUESS_PATTERN disables any guessing that
  involves host name lookups.
  
  =back
  
  =head1 COPYRIGHT
  
  Copyright 1997-1998, Gisle Aas
  
  This library is free software; you can redistribute it and/or
  modify it under the same terms as Perl itself.
  
  =cut
  
  use strict;
  use warnings;
  
  use Exporter 5.57 'import';
  our @EXPORT_OK = qw(uf_uri uf_uristr uf_url uf_urlstr);
  our $VERSION = "4.20";
  
  our ($MY_COUNTRY, $DEBUG);
  
  sub MY_COUNTRY() {
      for ($MY_COUNTRY) {
  	return $_ if defined;
  
  	# First try the environment.
  	$_ = $ENV{COUNTRY};
  	return $_ if defined;
  
  	# Try the country part of LC_ALL and LANG from environment
  	my @srcs = ($ENV{LC_ALL}, $ENV{LANG});
  	# ...and HTTP_ACCEPT_LANGUAGE before those if present
  	if (my $httplang = $ENV{HTTP_ACCEPT_LANGUAGE}) {
  	    # TODO: q-value processing/ordering
  	    for $httplang (split(/\s*,\s*/, $httplang)) {
  		if ($httplang =~ /^\s*([a-zA-Z]+)[_-]([a-zA-Z]{2})\s*$/) {
  		    unshift(@srcs, "${1}_${2}");
  		    last;
  		}
  	    }
  	}
  	for (@srcs) {
  	    next unless defined;
  	    return lc($1) if /^[a-zA-Z]+_([a-zA-Z]{2})(?:[.@]|$)/;
  	}
  
  	# Last bit of domain name.  This may access the network.
  	require Net::Domain;
  	my $fqdn = Net::Domain::hostfqdn();
  	$_ = lc($1) if $fqdn =~ /\.([a-zA-Z]{2})$/;
  	return $_ if defined;
  
  	# Give up.  Defined but false.
  	return ($_ = 0);
      }
  }
  
  our %LOCAL_GUESSING =
  (
   'us' => [qw(www.ACME.gov www.ACME.mil)],
   'gb' => [qw(www.ACME.co.uk www.ACME.org.uk www.ACME.ac.uk)],
   'au' => [qw(www.ACME.com.au www.ACME.org.au www.ACME.edu.au)],
   'il' => [qw(www.ACME.co.il www.ACME.org.il www.ACME.net.il)],
   # send corrections and new entries to <gisle@aas.no>
  );
  # Backwards compatibility; uk != United Kingdom in ISO 3166
  $LOCAL_GUESSING{uk} = $LOCAL_GUESSING{gb};
  
  
  sub uf_uristr ($)
  {
      local($_) = @_;
      print STDERR "uf_uristr: resolving $_\n" if $DEBUG;
      return unless defined;
  
      s/^\s+//;
      s/\s+$//;
  
      if (/^(www|web|home)[a-z0-9-]*(?:\.|$)/i) {
  	$_ = "http://$_";
  
      } elsif (/^(ftp|gopher|news|wais|https|http)[a-z0-9-]*(?:\.|$)/i) {
  	$_ = lc($1) . "://$_";
  
      } elsif ($^O ne "MacOS" && 
  	    (m,^/,      ||          # absolute file name
  	     m,^\.\.?/, ||          # relative file name
  	     m,^[a-zA-Z]:[/\\],)    # dosish file name
  	    )
      {
  	$_ = "file:$_";
  
      } elsif ($^O eq "MacOS" && m/:/) {
          # potential MacOS file name
  	unless (m/^(ftp|gopher|news|wais|http|https|mailto):/) {
  	    require URI::file;
  	    my $a = URI::file->new($_)->as_string;
  	    $_ = ($a =~ m/^file:/) ? $a : "file:$a";
  	}
      } elsif (/^\w+([\.\-]\w+)*\@(\w+\.)+\w{2,3}$/) {
  	$_ = "mailto:$_";
  
      } elsif (!/^[a-zA-Z][a-zA-Z0-9.+\-]*:/) {      # no scheme specified
  	if (s/^([-\w]+(?:\.[-\w]+)*)([\/:\?\#]|$)/$2/) {
  	    my $host = $1;
  
  	    my $scheme = "http";
  	    if (/^:(\d+)\b/) {
  		# Some more or less well known ports
  		if ($1 =~ /^[56789]?443$/) {
  		    $scheme = "https";
  		} elsif ($1 eq "21") {
  		    $scheme = "ftp";
  		}
  	    }
  
  	    if ($host !~ /\./ && $host ne "localhost") {
  		my @guess;
  		if (exists $ENV{URL_GUESS_PATTERN}) {
  		    @guess = map { s/\bACME\b/$host/; $_ }
  		             split(' ', $ENV{URL_GUESS_PATTERN});
  		} else {
  		    if (MY_COUNTRY()) {
  			my $special = $LOCAL_GUESSING{MY_COUNTRY()};
  			if ($special) {
  			    my @special = @$special;
  			    push(@guess, map { s/\bACME\b/$host/; $_ }
                                                 @special);
  			} else {
  			    push(@guess, "www.$host." . MY_COUNTRY());
  			}
  		    }
  		    push(@guess, map "www.$host.$_",
  			             "com", "org", "net", "edu", "int");
  		}
  
  
  		my $guess;
  		for $guess (@guess) {
  		    print STDERR "uf_uristr: gethostbyname('$guess.')..."
  		      if $DEBUG;
  		    if (gethostbyname("$guess.")) {
  			print STDERR "yes\n" if $DEBUG;
  			$host = $guess;
  			last;
  		    }
  		    print STDERR "no\n" if $DEBUG;
  		}
  	    }
  	    $_ = "$scheme://$host$_";
  
  	} else {
  	    # pure junk, just return it unchanged...
  
  	}
      }
      print STDERR "uf_uristr: ==> $_\n" if $DEBUG;
  
      $_;
  }
  
  sub uf_uri ($)
  {
      require URI;
      URI->new(uf_uristr($_[0]));
  }
  
  # legacy
  *uf_urlstr = \*uf_uristr;
  
  sub uf_url ($)
  {
      require URI::URL;
      URI::URL->new(uf_uristr($_[0]));
  }
  
  1;
URI_HEURISTIC

    $main::fatpacked{"URI/IRI.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'URI_IRI';
  package URI::IRI;
  
  # Experimental
  
  use strict;
  use warnings;
  use URI ();
  
  use overload '""' => sub { shift->as_string };
  
  our $VERSION = '1.76';
  
  sub new {
      my($class, $uri, $scheme) = @_;
      utf8::upgrade($uri);
      return bless {
  	uri => URI->new($uri, $scheme),
      }, $class;
  }
  
  sub clone {
      my $self = shift;
      return bless {
  	uri => $self->{uri}->clone,
      }, ref($self);
  }
  
  sub as_string {
      my $self = shift;
      return $self->{uri}->as_iri;
  }
  
  our $AUTOLOAD;
  sub AUTOLOAD
  {
      my $method = substr($AUTOLOAD, rindex($AUTOLOAD, '::')+2);
  
      # We create the function here so that it will not need to be
      # autoloaded the next time.
      no strict 'refs';
      *$method = sub { shift->{uri}->$method(@_) };
      goto &$method;
  }
  
  sub DESTROY {}   # avoid AUTOLOADing it
  
  1;
URI_IRI

    $main::fatpacked{"URI/QueryParam.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'URI_QUERYPARAM';
  package URI::QueryParam;
  
  use strict;
  use warnings;
  
  our $VERSION = '1.76';
  
  sub URI::_query::query_param {
      my $self = shift;
      my @old = $self->query_form;
  
      if (@_ == 0) {
  	# get keys
  	my (%seen, $i);
  	return grep !($i++ % 2 || $seen{$_}++), @old;
      }
  
      my $key = shift;
      my @i = grep $_ % 2 == 0 && $old[$_] eq $key, 0 .. $#old;
  
      if (@_) {
  	my @new = @old;
  	my @new_i = @i;
  	my @vals = map { ref($_) eq 'ARRAY' ? @$_ : $_ } @_;
  
  	while (@new_i > @vals) {
  	    splice @new, pop @new_i, 2;
  	}
  	if (@vals > @new_i) {
  	    my $i = @new_i ? $new_i[-1] + 2 : @new;
  	    my @splice = splice @vals, @new_i, @vals - @new_i;
  
  	    splice @new, $i, 0, map { $key => $_ } @splice;
  	}
  	if (@vals) {
  	    #print "SET $new_i[0]\n";
  	    @new[ map $_ + 1, @new_i ] = @vals;
  	}
  
  	$self->query_form(\@new);
      }
  
      return wantarray ? @old[map $_+1, @i] : @i ? $old[$i[0]+1] : undef;
  }
  
  sub URI::_query::query_param_append {
      my $self = shift;
      my $key = shift;
      my @vals = map { ref $_ eq 'ARRAY' ? @$_ : $_ } @_;
      $self->query_form($self->query_form, $key => \@vals);  # XXX
      return;
  }
  
  sub URI::_query::query_param_delete {
      my $self = shift;
      my $key = shift;
      my @old = $self->query_form;
      my @vals;
  
      for (my $i = @old - 2; $i >= 0; $i -= 2) {
  	next if $old[$i] ne $key;
  	push(@vals, (splice(@old, $i, 2))[1]);
      }
      $self->query_form(\@old) if @vals;
      return wantarray ? reverse @vals : $vals[-1];
  }
  
  sub URI::_query::query_form_hash {
      my $self = shift;
      my @old = $self->query_form;
      if (@_) {
  	$self->query_form(@_ == 1 ? %{shift(@_)} : @_);
      }
      my %hash;
      while (my($k, $v) = splice(@old, 0, 2)) {
  	if (exists $hash{$k}) {
  	    for ($hash{$k}) {
  		$_ = [$_] unless ref($_) eq "ARRAY";
  		push(@$_, $v);
  	    }
  	}
  	else {
  	    $hash{$k} = $v;
  	}
      }
      return \%hash;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  URI::QueryParam - Additional query methods for URIs
  
  =head1 SYNOPSIS
  
    use URI;
    use URI::QueryParam;
  
    $u = URI->new("", "http");
    $u->query_param(foo => 1, 2, 3);
    print $u->query;    # prints foo=1&foo=2&foo=3
  
    for my $key ($u->query_param) {
        print "$key: ", join(", ", $u->query_param($key)), "\n";
    }
  
  =head1 DESCRIPTION
  
  Loading the C<URI::QueryParam> module adds some extra methods to
  URIs that support query methods.  These methods provide an alternative
  interface to the $u->query_form data.
  
  The query_param_* methods have deliberately been made identical to the
  interface of the corresponding C<CGI.pm> methods.
  
  The following additional methods are made available:
  
  =over
  
  =item @keys = $u->query_param
  
  =item @values = $u->query_param( $key )
  
  =item $first_value = $u->query_param( $key )
  
  =item $u->query_param( $key, $value,... )
  
  If $u->query_param is called with no arguments, it returns all the
  distinct parameter keys of the URI.  In a scalar context it returns the
  number of distinct keys.
  
  When a $key argument is given, the method returns the parameter values with the
  given key.  In a scalar context, only the first parameter value is
  returned.
  
  If additional arguments are given, they are used to update successive
  parameters with the given key.  If any of the values provided are
  array references, then the array is dereferenced to get the actual
  values.
  
  Please note that you can supply multiple values to this method, but you cannot
  supply multiple keys.
  
  Do this:
  
      $uri->query_param( widget_id => 1, 5, 9 );
  
  Do NOT do this:
  
      $uri->query_param( widget_id => 1, frobnicator_id => 99 );
  
  =item $u->query_param_append($key, $value,...)
  
  Adds new parameters with the given
  key without touching any old parameters with the same key.  It
  can be explained as a more efficient version of:
  
     $u->query_param($key,
                     $u->query_param($key),
                     $value,...);
  
  One difference is that this expression would return the old values
  of $key, whereas the query_param_append() method does not.
  
  =item @values = $u->query_param_delete($key)
  
  =item $first_value = $u->query_param_delete($key)
  
  Deletes all key/value pairs with the given key.
  The old values are returned.  In a scalar context, only the first value
  is returned.
  
  Using the query_param_delete() method is slightly more efficient than
  the equivalent:
  
     $u->query_param($key, []);
  
  =item $hashref = $u->query_form_hash
  
  =item $u->query_form_hash( \%new_form )
  
  Returns a reference to a hash that represents the
  query form's key/value pairs.  If a key occurs multiple times, then the hash
  value becomes an array reference.
  
  Note that sequence information is lost.  This means that:
  
     $u->query_form_hash($u->query_form_hash);
  
  is not necessarily a no-op, as it may reorder the key/value pairs.
  The values returned by the query_param() method should stay the same
  though.
  
  =back
  
  =head1 SEE ALSO
  
  L<URI>, L<CGI>
  
  =head1 COPYRIGHT
  
  Copyright 2002 Gisle Aas.
  
  =cut
URI_QUERYPARAM

    $main::fatpacked{"URI/Split.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'URI_SPLIT';
  package URI::Split;
  
  use strict;
  use warnings;
  
  our $VERSION = '1.76';
  
  use Exporter 5.57 'import';
  our @EXPORT_OK = qw(uri_split uri_join);
  
  use URI::Escape ();
  
  sub uri_split {
       return $_[0] =~ m,(?:([^:/?#]+):)?(?://([^/?#]*))?([^?#]*)(?:\?([^#]*))?(?:#(.*))?,;
  }
  
  sub uri_join {
      my($scheme, $auth, $path, $query, $frag) = @_;
      my $uri = defined($scheme) ? "$scheme:" : "";
      $path = "" unless defined $path;
      if (defined $auth) {
  	$auth =~ s,([/?\#]), URI::Escape::escape_char($1),eg;
  	$uri .= "//$auth";
  	$path = "/$path" if length($path) && $path !~ m,^/,;
      }
      elsif ($path =~ m,^//,) {
  	$uri .= "//";  # XXX force empty auth
      }
      unless (length $uri) {
  	$path =~ s,(:), URI::Escape::escape_char($1),e while $path =~ m,^[^:/?\#]+:,;
      }
      $path =~ s,([?\#]), URI::Escape::escape_char($1),eg;
      $uri .= $path;
      if (defined $query) {
  	$query =~ s,(\#), URI::Escape::escape_char($1),eg;
  	$uri .= "?$query";
      }
      $uri .= "#$frag" if defined $frag;
      $uri;
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  URI::Split - Parse and compose URI strings
  
  =head1 SYNOPSIS
  
   use URI::Split qw(uri_split uri_join);
   ($scheme, $auth, $path, $query, $frag) = uri_split($uri);
   $uri = uri_join($scheme, $auth, $path, $query, $frag);
  
  =head1 DESCRIPTION
  
  Provides functions to parse and compose URI
  strings.  The following functions are provided:
  
  =over
  
  =item ($scheme, $auth, $path, $query, $frag) = uri_split($uri)
  
  Breaks up a URI string into its component
  parts.  An C<undef> value is returned for those parts that are not
  present.  The $path part is always present (but can be the empty
  string) and is thus never returned as C<undef>.
  
  No sensible value is returned if this function is called in a scalar
  context.
  
  =item $uri = uri_join($scheme, $auth, $path, $query, $frag)
  
  Puts together a URI string from its parts.
  Missing parts are signaled by passing C<undef> for the corresponding
  argument.
  
  Minimal escaping is applied to parts that contain reserved chars
  that would confuse a parser.  For instance, any occurrence of '?' or '#'
  in $path is always escaped, as it would otherwise be parsed back
  as a query or fragment.
  
  =back
  
  =head1 SEE ALSO
  
  L<URI>, L<URI::Escape>
  
  =head1 COPYRIGHT
  
  Copyright 2003, Gisle Aas
  
  This library is free software; you can redistribute it and/or
  modify it under the same terms as Perl itself.
  
  =cut
URI_SPLIT

    $main::fatpacked{"URI/URL.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'URI_URL';
  package URI::URL;
  
  use strict;
  use warnings;
  
  use parent 'URI::WithBase';
  
  our $VERSION = "5.04";
  
  # Provide as much as possible of the old URI::URL interface for backwards
  # compatibility...
  
  use Exporter 5.57 'import';
  our @EXPORT = qw(url);
  
  # Easy to use constructor
  sub url ($;$) { URI::URL->new(@_); }
  
  use URI::Escape qw(uri_unescape);
  
  sub new
  {
      my $class = shift;
      my $self = $class->SUPER::new(@_);
      $self->[0] = $self->[0]->canonical;
      $self;
  }
  
  sub newlocal
  {
      my $class = shift;
      require URI::file;
      bless [URI::file->new_abs(shift)], $class;
  }
  
  {package URI::_foreign;
      sub _init  # hope it is not defined
      {
  	my $class = shift;
  	die "Unknown URI::URL scheme $_[1]:" if $URI::URL::STRICT;
  	$class->SUPER::_init(@_);
      }
  }
  
  sub strict
  {
      my $old = $URI::URL::STRICT;
      $URI::URL::STRICT = shift if @_;
      $old;
  }
  
  sub print_on
  {
      my $self = shift;
      require Data::Dumper;
      print STDERR Data::Dumper::Dumper($self);
  }
  
  sub _try
  {
      my $self = shift;
      my $method = shift;
      scalar(eval { $self->$method(@_) });
  }
  
  sub crack
  {
      # should be overridden by subclasses
      my $self = shift;
      (scalar($self->scheme),
       $self->_try("user"),
       $self->_try("password"),
       $self->_try("host"),
       $self->_try("port"),
       $self->_try("path"),
       $self->_try("params"),
       $self->_try("query"),
       scalar($self->fragment),
      )
  }
  
  sub full_path
  {
      my $self = shift;
      my $path = $self->path_query;
      $path = "/" unless length $path;
      $path;
  }
  
  sub netloc
  {
      shift->authority(@_);
  }
  
  sub epath
  {
      my $path = shift->SUPER::path(@_);
      $path =~ s/;.*//;
      $path;
  }
  
  sub eparams
  {
      my $self = shift;
      my @p = $self->path_segments;
      return undef unless ref($p[-1]);
      @p = @{$p[-1]};
      shift @p;
      join(";", @p);
  }
  
  sub params { shift->eparams(@_); }
  
  sub path {
      my $self = shift;
      my $old = $self->epath(@_);
      return unless defined wantarray;
      return '/' if !defined($old) || !length($old);
      Carp::croak("Path components contain '/' (you must call epath)")
  	if $old =~ /%2[fF]/ and !@_;
      $old = "/$old" if $old !~ m|^/| && defined $self->netloc;
      return uri_unescape($old);
  }
  
  sub path_components {
      shift->path_segments(@_);
  }
  
  sub query {
      my $self = shift;
      my $old = $self->equery(@_);
      if (defined(wantarray) && defined($old)) {
  	if ($old =~ /%(?:26|2[bB]|3[dD])/) {  # contains escaped '=' '&' or '+'
  	    my $mess;
  	    for ($old) {
  		$mess = "Query contains both '+' and '%2B'"
  		  if /\+/ && /%2[bB]/;
  		$mess = "Form query contains escaped '=' or '&'"
  		  if /=/  && /%(?:3[dD]|26)/;
  	    }
  	    if ($mess) {
  		Carp::croak("$mess (you must call equery)");
  	    }
  	}
  	# Now it should be safe to unescape the string without losing
  	# information
  	return uri_unescape($old);
      }
      undef;
  
  }
  
  sub abs
  {
      my $self = shift;
      my $base = shift;
      my $allow_scheme = shift;
      $allow_scheme = $URI::URL::ABS_ALLOW_RELATIVE_SCHEME
  	unless defined $allow_scheme;
      local $URI::ABS_ALLOW_RELATIVE_SCHEME = $allow_scheme;
      local $URI::ABS_REMOTE_LEADING_DOTS = $URI::URL::ABS_REMOTE_LEADING_DOTS;
      $self->SUPER::abs($base);
  }
  
  sub frag { shift->fragment(@_); }
  sub keywords { shift->query_keywords(@_); }
  
  # file:
  sub local_path { shift->file; }
  sub unix_path  { shift->file("unix"); }
  sub dos_path   { shift->file("dos");  }
  sub mac_path   { shift->file("mac");  }
  sub vms_path   { shift->file("vms");  }
  
  # mailto:
  sub address { shift->to(@_); }
  sub encoded822addr { shift->to(@_); }
  sub URI::mailto::authority { shift->to(@_); }  # make 'netloc' method work
  
  # news:
  sub groupart { shift->_group(@_); }
  sub article  { shift->message(@_); }
  
  1;
  
  __END__
  
  =head1 NAME
  
  URI::URL - Uniform Resource Locators
  
  =head1 SYNOPSIS
  
   $u1 = URI::URL->new($str, $base);
   $u2 = $u1->abs;
  
  =head1 DESCRIPTION
  
  This module is provided for backwards compatibility with modules that
  depend on the interface provided by the C<URI::URL> class that used to
  be distributed with the libwww-perl library.
  
  The following differences exist compared to the C<URI> class interface:
  
  =over 3
  
  =item *
  
  The URI::URL module exports the url() function as an alternate
  constructor interface.
  
  =item *
  
  The constructor takes an optional $base argument.  The C<URI::URL>
  class is a subclass of C<URI::WithBase>.
  
  =item *
  
  The URI::URL->newlocal class method is the same as URI::file->new_abs.
  
  =item *
  
  URI::URL::strict(1)
  
  =item *
  
  $url->print_on method
  
  =item *
  
  $url->crack method
  
  =item *
  
  $url->full_path: same as ($uri->abs_path || "/")
  
  =item *
  
  $url->netloc: same as $uri->authority
  
  =item *
  
  $url->epath, $url->equery: same as $uri->path, $uri->query
  
  =item *
  
  $url->path and $url->query pass unescaped strings.
  
  =item *
  
  $url->path_components: same as $uri->path_segments (if you don't
  consider path segment parameters)
  
  =item *
  
  $url->params and $url->eparams methods
  
  =item *
  
  $url->base method.  See L<URI::WithBase>.
  
  =item *
  
  $url->abs and $url->rel have an optional $base argument.  See
  L<URI::WithBase>.
  
  =item *
  
  $url->frag: same as $uri->fragment
  
  =item *
  
  $url->keywords: same as $uri->query_keywords
  
  =item *
  
  $url->localpath and friends map to $uri->file.
  
  =item *
  
  $url->address and $url->encoded822addr: same as $uri->to for mailto URI
  
  =item *
  
  $url->groupart method for news URI
  
  =item *
  
  $url->article: same as $uri->message
  
  =back
  
  
  
  =head1 SEE ALSO
  
  L<URI>, L<URI::WithBase>
  
  =head1 COPYRIGHT
  
  Copyright 1998-2000 Gisle Aas.
  
  =cut
URI_URL

    $main::fatpacked{"URI/WithBase.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'URI_WITHBASE';
  package URI::WithBase;
  
  use strict;
  use warnings;
  
  use URI;
  use Scalar::Util 'blessed';
  
  our $VERSION = "2.20";
  
  use overload '""' => "as_string", fallback => 1;
  
  sub as_string;  # help overload find it
  
  sub new
  {
      my($class, $uri, $base) = @_;
      my $ibase = $base;
      if ($base && blessed($base) && $base->isa(__PACKAGE__)) {
  	$base = $base->abs;
  	$ibase = $base->[0];
      }
      bless [URI->new($uri, $ibase), $base], $class;
  }
  
  sub new_abs
  {
      my $class = shift;
      my $self = $class->new(@_);
      $self->abs;
  }
  
  sub _init
  {
      my $class = shift;
      my($str, $scheme) = @_;
      bless [URI->new($str, $scheme), undef], $class;
  }
  
  sub eq
  {
      my($self, $other) = @_;
      $other = $other->[0] if blessed($other) and $other->isa(__PACKAGE__);
      $self->[0]->eq($other);
  }
  
  our $AUTOLOAD;
  sub AUTOLOAD
  {
      my $self = shift;
      my $method = substr($AUTOLOAD, rindex($AUTOLOAD, '::')+2);
      return if $method eq "DESTROY";
      $self->[0]->$method(@_);
  }
  
  sub can {                                  # override UNIVERSAL::can
      my $self = shift;
      $self->SUPER::can(@_) || (
        ref($self)
        ? $self->[0]->can(@_)
        : undef
      )
  }
  
  sub base {
      my $self = shift;
      my $base  = $self->[1];
  
      if (@_) { # set
  	my $new_base = shift;
  	# ensure absoluteness
  	$new_base = $new_base->abs if ref($new_base) && $new_base->isa(__PACKAGE__);
  	$self->[1] = $new_base;
      }
      return unless defined wantarray;
  
      # The base attribute supports 'lazy' conversion from URL strings
      # to URL objects. Strings may be stored but when a string is
      # fetched it will automatically be converted to a URL object.
      # The main benefit is to make it much cheaper to say:
      #   URI::WithBase->new($random_url_string, 'http:')
      if (defined($base) && !ref($base)) {
  	$base = ref($self)->new($base);
  	$self->[1] = $base unless @_;
      }
      $base;
  }
  
  sub clone
  {
      my $self = shift;
      my $base = $self->[1];
      $base = $base->clone if ref($base);
      bless [$self->[0]->clone, $base], ref($self);
  }
  
  sub abs
  {
      my $self = shift;
      my $base = shift || $self->base || return $self->clone;
      $base = $base->as_string if ref($base);
      bless [$self->[0]->abs($base, @_), $base], ref($self);
  }
  
  sub rel
  {
      my $self = shift;
      my $base = shift || $self->base || return $self->clone;
      $base = $base->as_string if ref($base);
      bless [$self->[0]->rel($base, @_), $base], ref($self);
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  URI::WithBase - URIs which remember their base
  
  =head1 SYNOPSIS
  
   $u1 = URI::WithBase->new($str, $base);
   $u2 = $u1->abs;
  
   $base = $u1->base;
   $u1->base( $new_base )
  
  =head1 DESCRIPTION
  
  This module provides the C<URI::WithBase> class.  Objects of this class
  are like C<URI> objects, but can keep their base too.  The base
  represents the context where this URI was found and can be used to
  absolutize or relativize the URI.  All the methods described in L<URI>
  are supported for C<URI::WithBase> objects.
  
  The methods provided in addition to or modified from those of C<URI> are:
  
  =over 4
  
  =item $uri = URI::WithBase->new($str, [$base])
  
  The constructor takes an optional base URI as the second argument.
  If provided, this argument initializes the base attribute.
  
  =item $uri->base( [$new_base] )
  
  Can be used to get or set the value of the base attribute.
  The return value, which is the old value, is a URI object or C<undef>.
  
  =item $uri->abs( [$base_uri] )
  
  The $base_uri argument is now made optional as the object carries its
  base with it.  A new object is returned even if $uri is already
  absolute (while plain URI objects simply return themselves in
  that case).
  
  =item $uri->rel( [$base_uri] )
  
  The $base_uri argument is now made optional as the object carries its
  base with it.  A new object is always returned.
  
  =back
  
  
  =head1 SEE ALSO
  
  L<URI>
  
  =head1 COPYRIGHT
  
  Copyright 1998-2002 Gisle Aas.
  
  =cut
URI_WITHBASE

    $main::fatpacked{"URI/data.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'URI_DATA';
  package URI::data;  # RFC 2397
  
  use strict;
  use warnings;
  
  use parent 'URI';
  
  our $VERSION = '1.76';
  
  use MIME::Base64 qw(encode_base64 decode_base64);
  use URI::Escape  qw(uri_unescape);
  
  sub media_type
  {
      my $self = shift;
      my $opaque = $self->opaque;
      $opaque =~ /^([^,]*),?/ or die;
      my $old = $1;
      my $base64;
      $base64 = $1 if $old =~ s/(;base64)$//i;
      if (@_) {
  	my $new = shift;
  	$new = "" unless defined $new;
  	$new =~ s/%/%25/g;
  	$new =~ s/,/%2C/g;
  	$base64 = "" unless defined $base64;
  	$opaque =~ s/^[^,]*,?/$new$base64,/;
  	$self->opaque($opaque);
      }
      return uri_unescape($old) if $old;  # media_type can't really be "0"
      "text/plain;charset=US-ASCII";      # default type
  }
  
  sub data
  {
      my $self = shift;
      my($enc, $data) = split(",", $self->opaque, 2);
      unless (defined $data) {
  	$data = "";
  	$enc  = "" unless defined $enc;
      }
      my $base64 = ($enc =~ /;base64$/i);
      if (@_) {
  	$enc =~ s/;base64$//i if $base64;
  	my $new = shift;
  	$new = "" unless defined $new;
  	my $uric_count = _uric_count($new);
  	my $urienc_len = $uric_count + (length($new) - $uric_count) * 3;
  	my $base64_len = int((length($new)+2) / 3) * 4;
  	$base64_len += 7;  # because of ";base64" marker
  	if ($base64_len < $urienc_len || $_[0]) {
  	    $enc .= ";base64";
  	    $new = encode_base64($new, "");
  	} else {
  	    $new =~ s/%/%25/g;
  	}
  	$self->opaque("$enc,$new");
      }
      return unless defined wantarray;
      $data = uri_unescape($data);
      return $base64 ? decode_base64($data) : $data;
  }
  
  # I could not find a better way to interpolate the tr/// chars from
  # a variable.
  my $ENC = $URI::uric;
  $ENC =~ s/%//;
  
  eval <<EOT; die $@ if $@;
  sub _uric_count
  {
      \$_[0] =~ tr/$ENC//;
  }
  EOT
  
  1;
  
  __END__
  
  =head1 NAME
  
  URI::data - URI that contains immediate data
  
  =head1 SYNOPSIS
  
   use URI;
  
   $u = URI->new("data:");
   $u->media_type("image/gif");
   $u->data(scalar(`cat camel.gif`));
   print "$u\n";
   open(XV, "|xv -") and print XV $u->data;
  
  =head1 DESCRIPTION
  
  The C<URI::data> class supports C<URI> objects belonging to the I<data>
  URI scheme.  The I<data> URI scheme is specified in RFC 2397.  It
  allows inclusion of small data items as "immediate" data, as if it had
  been included externally.  Examples:
  
    data:,Perl%20is%20good
  
    data:image/gif;base64,R0lGODdhIAAgAIAAAAAAAPj8+CwAAAAAI
      AAgAAAClYyPqcu9AJyCjtIKc5w5xP14xgeO2tlY3nWcajmZZdeJcG
      Kxrmimms1KMTa1Wg8UROx4MNUq1HrycMjHT9b6xKxaFLM6VRKzI+p
      KS9XtXpcbdun6uWVxJXA8pNPkdkkxhxc21LZHFOgD2KMoQXa2KMWI
      JtnE2KizVUkYJVZZ1nczBxXlFopZBtoJ2diXGdNUymmJdFMAADs=
  
  
  
  C<URI> objects belonging to the data scheme support the common methods
  (described in L<URI>) and the following two scheme-specific methods:
  
  =over 4
  
  =item $uri->media_type( [$new_media_type] )
  
  Can be used to get or set the media type specified in the
  URI.  If no media type is specified, then the default
  C<"text/plain;charset=US-ASCII"> is returned.
  
  =item $uri->data( [$new_data] )
  
  Can be used to get or set the data contained in the URI.
  The data is passed unescaped (in binary form).  The decision about
  whether to base64 encode the data in the URI is taken automatically,
  based on the encoding that produces the shorter URI string.
  
  =back
  
  =head1 SEE ALSO
  
  L<URI>
  
  =head1 COPYRIGHT
  
  Copyright 1995-1998 Gisle Aas.
  
  This library is free software; you can redistribute it and/or
  modify it under the same terms as Perl itself.
  
  =cut
URI_DATA

    $main::fatpacked{"URI/file.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'URI_FILE';
  package URI::file;
  
  use strict;
  use warnings;
  
  use parent 'URI::_generic';
  our $VERSION = "4.21";
  
  use URI::Escape qw(uri_unescape);
  
  our $DEFAULT_AUTHORITY = "";
  
  # Map from $^O values to implementation classes.  The Unix
  # class is the default.
  our %OS_CLASS = (
       os2     => "OS2",
       mac     => "Mac",
       MacOS   => "Mac",
       MSWin32 => "Win32",
       win32   => "Win32",
       msdos   => "FAT",
       dos     => "FAT",
       qnx     => "QNX",
  );
  
  sub os_class
  {
      my($OS) = shift || $^O;
  
      my $class = "URI::file::" . ($OS_CLASS{$OS} || "Unix");
      no strict 'refs';
      unless (%{"$class\::"}) {
  	eval "require $class";
  	die $@ if $@;
      }
      $class;
  }
  
  sub host { uri_unescape(shift->authority(@_)) }
  
  sub new
  {
      my($class, $path, $os) = @_;
      os_class($os)->new($path);
  }
  
  sub new_abs
  {
      my $class = shift;
      my $file = $class->new(@_);
      return $file->abs($class->cwd) unless $$file =~ /^file:/;
      $file;
  }
  
  sub cwd
  {
      my $class = shift;
      require Cwd;
      my $cwd = Cwd::cwd();
      $cwd = VMS::Filespec::unixpath($cwd) if $^O eq 'VMS';
      $cwd = $class->new($cwd);
      $cwd .= "/" unless substr($cwd, -1, 1) eq "/";
      $cwd;
  }
  
  sub canonical {
      my $self = shift;
      my $other = $self->SUPER::canonical;
  
      my $scheme = $other->scheme;
      my $auth = $other->authority;
      return $other if !defined($scheme) && !defined($auth);  # relative
  
      if (!defined($auth) ||
  	$auth eq "" ||
  	lc($auth) eq "localhost" ||
  	(defined($DEFAULT_AUTHORITY) && lc($auth) eq lc($DEFAULT_AUTHORITY))
         )
      {
  	# avoid cloning if $auth already match
  	if ((defined($auth) || defined($DEFAULT_AUTHORITY)) &&
  	    (!defined($auth) || !defined($DEFAULT_AUTHORITY) || $auth ne $DEFAULT_AUTHORITY)
  	   )
  	{
  	    $other = $other->clone if $self == $other;
  	    $other->authority($DEFAULT_AUTHORITY);
          }
      }
  
      $other;
  }
  
  sub file
  {
      my($self, $os) = @_;
      os_class($os)->file($self);
  }
  
  sub dir
  {
      my($self, $os) = @_;
      os_class($os)->dir($self);
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  URI::file - URI that maps to local file names
  
  =head1 SYNOPSIS
  
   use URI::file;
   
   $u1 = URI->new("file:/foo/bar");
   $u2 = URI->new("foo/bar", "file");
   
   $u3 = URI::file->new($path);
   $u4 = URI::file->new("c:\\windows\\", "win32");
   
   $u1->file;
   $u1->file("mac");
  
  =head1 DESCRIPTION
  
  The C<URI::file> class supports C<URI> objects belonging to the I<file>
  URI scheme.  This scheme allows us to map the conventional file names
  found on various computer systems to the URI name space.  An old
  specification of the I<file> URI scheme is found in RFC 1738.  Some
  older background information is also in RFC 1630. There are no newer
  specifications as far as I know.
  
  If you simply want to construct I<file> URI objects from URI strings,
  use the normal C<URI> constructor.  If you want to construct I<file>
  URI objects from the actual file names used by various systems, then
  use one of the following C<URI::file> constructors:
  
  =over 4
  
  =item $u = URI::file->new( $filename, [$os] )
  
  Maps a file name to the I<file:> URI name space, creates a URI object
  and returns it.  The $filename is interpreted as belonging to the
  indicated operating system ($os), which defaults to the value of the
  $^O variable.  The $filename can be either absolute or relative, and
  the corresponding type of URI object for $os is returned.
  
  =item $u = URI::file->new_abs( $filename, [$os] )
  
  Same as URI::file->new, but makes sure that the URI returned
  represents an absolute file name.  If the $filename argument is
  relative, then the name is resolved relative to the current directory,
  i.e. this constructor is really the same as:
  
    URI::file->new($filename)->abs(URI::file->cwd);
  
  =item $u = URI::file->cwd
  
  Returns a I<file> URI that represents the current working directory.
  See L<Cwd>.
  
  =back
  
  The following methods are supported for I<file> URI (in addition to
  the common and generic methods described in L<URI>):
  
  =over 4
  
  =item $u->file( [$os] )
  
  Returns a file name.  It maps from the URI name space
  to the file name space of the indicated operating system.
  
  It might return C<undef> if the name can not be represented in the
  indicated file system.
  
  =item $u->dir( [$os] )
  
  Some systems use a different form for names of directories than for plain
  files.  Use this method if you know you want to use the name for
  a directory.
  
  =back
  
  The C<URI::file> module can be used to map generic file names to names
  suitable for the current system.  As such, it can work as a nice
  replacement for the C<File::Spec> module.  For instance, the following
  code translates the UNIX-style file name F<Foo/Bar.pm> to a name
  suitable for the local system:
  
    $file = URI::file->new("Foo/Bar.pm", "unix")->file;
    die "Can't map filename Foo/Bar.pm for $^O" unless defined $file;
    open(FILE, $file) || die "Can't open '$file': $!";
    # do something with FILE
  
  =head1 MAPPING NOTES
  
  Most computer systems today have hierarchically organized file systems.
  Mapping the names used in these systems to the generic URI syntax
  allows us to work with relative file URIs that behave as they should
  when resolved using the generic algorithm for URIs (specified in RFC
  2396).  Mapping a file name to the generic URI syntax involves mapping
  the path separator character to "/" and encoding any reserved
  characters that appear in the path segments of the file name.  If
  path segments consisting of the strings "." or ".." have a
  different meaning than what is specified for generic URIs, then these
  must be encoded as well.
  
  If the file system has device, volume or drive specifications as
  the root of the name space, then it makes sense to map them to the
  authority field of the generic URI syntax.  This makes sure that
  relative URIs can not be resolved "above" them, i.e. generally how
  relative file names work in those systems.
  
  Another common use of the authority field is to encode the host on which
  this file name is valid.  The host name "localhost" is special and
  generally has the same meaning as a missing or empty authority
  field.  This use is in conflict with using it as a device
  specification, but can often be resolved for device specifications
  having characters not legal in plain host names.
  
  File name to URI mapping in normally not one-to-one.  There are
  usually many URIs that map to any given file name.  For instance, an
  authority of "localhost" maps the same as a URI with a missing or empty
  authority.
  
  Example 1: The Mac classic (Mac OS 9 and earlier) used ":" as path separator,
  but not in the same way as a generic URI. ":foo" was a relative name.  "foo:bar"
  was an absolute name.  Also, path segments could contain the "/" character as well
  as the literal "." or "..".  So the mapping looks like this:
  
    Mac classic           URI
    ----------            -------------------
    :foo:bar     <==>     foo/bar
    :            <==>     ./
    ::foo:bar    <==>     ../foo/bar
    :::          <==>     ../../
    foo:bar      <==>     file:/foo/bar
    foo:bar:     <==>     file:/foo/bar/
    ..           <==>     %2E%2E
    <undef>      <==      /
    foo/         <==      file:/foo%2F
    ./foo.txt    <==      file:/.%2Ffoo.txt
  
  Note that if you want a relative URL, you *must* begin the path with a :.  Any
  path that begins with [^:] is treated as absolute.
  
  Example 2: The UNIX file system is easy to map, as it uses the same path
  separator as URIs, has a single root, and segments of "." and ".."
  have the same meaning.  URIs that have the character "\0" or "/" as
  part of any path segment can not be turned into valid UNIX file names.
  
    UNIX                  URI
    ----------            ------------------
    foo/bar      <==>     foo/bar
    /foo/bar     <==>     file:/foo/bar
    /foo/bar     <==      file://localhost/foo/bar
    file:         ==>     ./file:
    <undef>      <==      file:/fo%00/bar
    /            <==>     file:/
  
  =cut
  
  
  RFC 1630
  
     [...]
  
     There is clearly a danger of confusion that a link made to a local
     file should be followed by someone on a different system, with
     unexpected and possibly harmful results.  Therefore, the convention
     is that even a "file" URL is provided with a host part.  This allows
     a client on another system to know that it cannot access the file
     system, or perhaps to use some other local mechanism to access the
     file.
  
     The special value "localhost" is used in the host field to indicate
     that the filename should really be used on whatever host one is.
     This for example allows links to be made to files which are
     distributed on many machines, or to "your unix local password file"
     subject of course to consistency across the users of the data.
  
     A void host field is equivalent to "localhost".
  
  =head1 CONFIGURATION VARIABLES
  
  The following configuration variables influence how the class and its
  methods behave:
  
  =over
  
  =item %URI::file::OS_CLASS
  
  This hash maps OS identifiers to implementation classes.  You might
  want to add or modify this if you want to plug in your own file
  handler class.  Normally the keys should match the $^O values in use.
  
  If there is no mapping then the "Unix" implementation is used.
  
  =item $URI::file::DEFAULT_AUTHORITY
  
  This determine what "authority" string to include in absolute file
  URIs.  It defaults to "".  If you prefer verbose URIs you might set it
  to be "localhost".
  
  Setting this value to C<undef> force behaviour compatible to URI v1.31
  and earlier.  In this mode host names in UNC paths and drive letters
  are mapped to the authority component on Windows, while we produce
  authority-less URIs on Unix.
  
  =back
  
  
  =head1 SEE ALSO
  
  L<URI>, L<File::Spec>, L<perlport>
  
  =head1 COPYRIGHT
  
  Copyright 1995-1998,2004 Gisle Aas.
  
  This library is free software; you can redistribute it and/or
  modify it under the same terms as Perl itself.
  
  =cut
URI_FILE

    $main::fatpacked{"URI/file/Base.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'URI_FILE_BASE';
  package URI::file::Base;
  
  use strict;
  use warnings;
  
  use URI::Escape qw();
  
  our $VERSION = '1.76';
  
  sub new
  {
      my $class = shift;
      my $path  = shift;
      $path = "" unless defined $path;
  
      my($auth, $escaped_auth, $escaped_path);
  
      ($auth, $escaped_auth) = $class->_file_extract_authority($path);
      ($path, $escaped_path) = $class->_file_extract_path($path);
  
      if (defined $auth) {
  	$auth =~ s,%,%25,g unless $escaped_auth;
  	$auth =~ s,([/?\#]), URI::Escape::escape_char($1),eg;
  	$auth = "//$auth";
  	if (defined $path) {
  	    $path = "/$path" unless substr($path, 0, 1) eq "/";
  	} else {
  	    $path = "";
  	}
      } else {
  	return undef unless defined $path;
  	$auth = "";
      }
  
      $path =~ s,([%;?]), URI::Escape::escape_char($1),eg unless $escaped_path;
      $path =~ s/\#/%23/g;
  
      my $uri = $auth . $path;
      $uri = "file:$uri" if substr($uri, 0, 1) eq "/";
  
      URI->new($uri, "file");
  }
  
  sub _file_extract_authority
  {
      my($class, $path) = @_;
      return undef unless $class->_file_is_absolute($path);
      return $URI::file::DEFAULT_AUTHORITY;
  }
  
  sub _file_extract_path
  {
      return undef;
  }
  
  sub _file_is_absolute
  {
      return 0;
  }
  
  sub _file_is_localhost
  {
      shift; # class
      my $host = lc(shift);
      return 1 if $host eq "localhost";
      eval {
  	require Net::Domain;
  	lc(Net::Domain::hostfqdn() || '') eq $host ||
  	lc(Net::Domain::hostname() || '') eq $host;
      };
  }
  
  sub file
  {
      undef;
  }
  
  sub dir
  {
      my $self = shift;
      $self->file(@_);
  }
  
  1;
URI_FILE_BASE

    $main::fatpacked{"URI/file/FAT.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'URI_FILE_FAT';
  package URI::file::FAT;
  
  use strict;
  use warnings;
  
  use parent 'URI::file::Win32';
  
  our $VERSION = '1.76';
  
  sub fix_path
  {
      shift; # class
      for (@_) {
  	# turn it into 8.3 names
  	my @p = map uc, split(/\./, $_, -1);
  	return if @p > 2;     # more than 1 dot is not allowed
  	@p = ("") unless @p;  # split bug? (returns nothing when splitting "")
  	$_ = substr($p[0], 0, 8);
          if (@p > 1) {
  	    my $ext = substr($p[1], 0, 3);
  	    $_ .= ".$ext" if length $ext;
  	}
      }
      1;  # ok
  }
  
  1;
URI_FILE_FAT

    $main::fatpacked{"URI/file/Mac.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'URI_FILE_MAC';
  package URI::file::Mac;
  
  use strict;
  use warnings;
  
  use parent 'URI::file::Base';
  
  use URI::Escape qw(uri_unescape);
  
  our $VERSION = '1.76';
  
  sub _file_extract_path
  {
      my $class = shift;
      my $path = shift;
  
      my @pre;
      if ($path =~ s/^(:+)//) {
  	if (length($1) == 1) {
  	    @pre = (".") unless length($path);
  	} else {
  	    @pre = ("..") x (length($1) - 1);
  	}
      } else { #absolute
  	$pre[0] = "";
      }
  
      my $isdir = ($path =~ s/:$//);
      $path =~ s,([%/;]), URI::Escape::escape_char($1),eg;
  
      my @path = split(/:/, $path, -1);
      for (@path) {
  	if ($_ eq "." || $_ eq "..") {
  	    $_ = "%2E" x length($_);
  	}
  	$_ = ".." unless length($_);
      }
      push (@path,"") if $isdir;
      (join("/", @pre, @path), 1);
  }
  
  
  sub file
  {
      my $class = shift;
      my $uri = shift;
      my @path;
  
      my $auth = $uri->authority;
      if (defined $auth) {
  	if (lc($auth) ne "localhost" && $auth ne "") {
  	    my $u_auth = uri_unescape($auth);
  	    if (!$class->_file_is_localhost($u_auth)) {
  		# some other host (use it as volume name)
  		@path = ("", $auth);
  		# XXX or just return to make it illegal;
  	    }
  	}
      }
      my @ps = split("/", $uri->path, -1);
      shift @ps if @path;
      push(@path, @ps);
  
      my $pre = "";
      if (!@path) {
  	return;  # empty path; XXX return ":" instead?
      } elsif ($path[0] eq "") {
  	# absolute
  	shift(@path);
  	if (@path == 1) {
  	    return if $path[0] eq "";  # not root directory
  	    push(@path, "");           # volume only, effectively append ":"
  	}
  	@ps = @path;
  	@path = ();
          my $part;
  	for (@ps) {  #fix up "." and "..", including interior, in relatives
  	    next if $_ eq ".";
  	    $part = $_ eq ".." ? "" : $_;
  	    push(@path,$part);
  	}
  	if ($ps[-1] eq "..") {  #if this happens, we need another :
  	    push(@path,"");
  	}
  	
      } else {
  	$pre = ":";
  	@ps = @path;
  	@path = ();
          my $part;
  	for (@ps) {  #fix up "." and "..", including interior, in relatives
  	    next if $_ eq ".";
  	    $part = $_ eq ".." ? "" : $_;
  	    push(@path,$part);
  	}
  	if ($ps[-1] eq "..") {  #if this happens, we need another :
  	    push(@path,"");
  	}
  	
      }
      return unless $pre || @path;
      for (@path) {
  	s/;.*//;  # get rid of parameters
  	#return unless length; # XXX
  	$_ = uri_unescape($_);
  	return if /\0/;
  	return if /:/;  # Should we?
      }
      $pre . join(":", @path);
  }
  
  sub dir
  {
      my $class = shift;
      my $path = $class->file(@_);
      return unless defined $path;
      $path .= ":" unless $path =~ /:$/;
      $path;
  }
  
  1;
URI_FILE_MAC

    $main::fatpacked{"URI/file/OS2.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'URI_FILE_OS2';
  package URI::file::OS2;
  
  use strict;
  use warnings;
  
  use parent 'URI::file::Win32';
  
  our $VERSION = '1.76';
  
  # The Win32 version translates k:/foo to file://k:/foo  (?!)
  # We add an empty host
  
  sub _file_extract_authority
  {
      my $class = shift;
      return $1 if $_[0] =~ s,^\\\\([^\\]+),,;  # UNC
      return $1 if $_[0] =~ s,^//([^/]+),,;     # UNC too?
  
      if ($_[0] =~ m#^[a-zA-Z]{1,2}:#) {	      # allow for ab: drives
  	return "";
      }
      return;
  }
  
  sub file {
    my $p = &URI::file::Win32::file;
    return unless defined $p;
    $p =~ s,\\,/,g;
    $p;
  }
  
  1;
URI_FILE_OS2

    $main::fatpacked{"URI/file/QNX.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'URI_FILE_QNX';
  package URI::file::QNX;
  
  use strict;
  use warnings;
  
  use parent 'URI::file::Unix';
  
  our $VERSION = '1.76';
  
  sub _file_extract_path
  {
      my($class, $path) = @_;
      # tidy path
      $path =~ s,(.)//+,$1/,g; # ^// is correct
      $path =~ s,(/\.)+/,/,g;
      $path = "./$path" if $path =~ m,^[^:/]+:,,; # look like "scheme:"
      $path;
  }
  
  1;
URI_FILE_QNX

    $main::fatpacked{"URI/file/Unix.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'URI_FILE_UNIX';
  package URI::file::Unix;
  
  use strict;
  use warnings;
  
  use parent 'URI::file::Base';
  
  use URI::Escape qw(uri_unescape);
  
  our $VERSION = '1.76';
  
  sub _file_extract_path
  {
      my($class, $path) = @_;
  
      # tidy path
      $path =~ s,//+,/,g;
      $path =~ s,(/\.)+/,/,g;
      $path = "./$path" if $path =~ m,^[^:/]+:,,; # look like "scheme:"
  
      return $path;
  }
  
  sub _file_is_absolute {
      my($class, $path) = @_;
      return $path =~ m,^/,;
  }
  
  sub file
  {
      my $class = shift;
      my $uri = shift;
      my @path;
  
      my $auth = $uri->authority;
      if (defined($auth)) {
  	if (lc($auth) ne "localhost" && $auth ne "") {
  	    $auth = uri_unescape($auth);
  	    unless ($class->_file_is_localhost($auth)) {
  		push(@path, "", "", $auth);
  	    }
  	}
      }
  
      my @ps = $uri->path_segments;
      shift @ps if @path;
      push(@path, @ps);
  
      for (@path) {
  	# Unix file/directory names are not allowed to contain '\0' or '/'
  	return undef if /\0/;
  	return undef if /\//;  # should we really?
      }
  
      return join("/", @path);
  }
  
  1;
URI_FILE_UNIX

    $main::fatpacked{"URI/file/Win32.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'URI_FILE_WIN32';
  package URI::file::Win32;
  
  use strict;
  use warnings;
  
  use parent 'URI::file::Base';
  
  use URI::Escape qw(uri_unescape);
  
  our $VERSION = '1.76';
  
  sub _file_extract_authority
  {
      my $class = shift;
  
      return $class->SUPER::_file_extract_authority($_[0])
  	if defined $URI::file::DEFAULT_AUTHORITY;
  
      return $1 if $_[0] =~ s,^\\\\([^\\]+),,;  # UNC
      return $1 if $_[0] =~ s,^//([^/]+),,;     # UNC too?
  
      if ($_[0] =~ s,^([a-zA-Z]:),,) {
  	my $auth = $1;
  	$auth .= "relative" if $_[0] !~ m,^[\\/],;
  	return $auth;
      }
      return undef;
  }
  
  sub _file_extract_path
  {
      my($class, $path) = @_;
      $path =~ s,\\,/,g;
      #$path =~ s,//+,/,g;
      $path =~ s,(/\.)+/,/,g;
  
      if (defined $URI::file::DEFAULT_AUTHORITY) {
  	$path =~ s,^([a-zA-Z]:),/$1,;
      }
  
      return $path;
  }
  
  sub _file_is_absolute {
      my($class, $path) = @_;
      return $path =~ m,^[a-zA-Z]:, || $path =~ m,^[/\\],;
  }
  
  sub file
  {
      my $class = shift;
      my $uri = shift;
      my $auth = $uri->authority;
      my $rel; # is filename relative to drive specified in authority
      if (defined $auth) {
          $auth = uri_unescape($auth);
  	if ($auth =~ /^([a-zA-Z])[:|](relative)?/) {
  	    $auth = uc($1) . ":";
  	    $rel++ if $2;
  	} elsif (lc($auth) eq "localhost") {
  	    $auth = "";
  	} elsif (length $auth) {
  	    $auth = "\\\\" . $auth;  # UNC
  	}
      } else {
  	$auth = "";
      }
  
      my @path = $uri->path_segments;
      for (@path) {
  	return undef if /\0/;
  	return undef if /\//;
  	#return undef if /\\/;        # URLs with "\" is not uncommon
      }
      return undef unless $class->fix_path(@path);
  
      my $path = join("\\", @path);
      $path =~ s/^\\// if $rel;
      $path = $auth . $path;
      $path =~ s,^\\([a-zA-Z])[:|],\u$1:,;
  
      return $path;
  }
  
  sub fix_path { 1; }
  
  1;
URI_FILE_WIN32

    $main::fatpacked{"URI/ftp.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'URI_FTP';
  package URI::ftp;
  
  use strict;
  use warnings;
  
  our $VERSION = '1.76';
  
  use parent qw(URI::_server URI::_userpass);
  
  sub default_port { 21 }
  
  sub path { shift->path_query(@_) }  # XXX
  
  sub _user     { shift->SUPER::user(@_);     }
  sub _password { shift->SUPER::password(@_); }
  
  sub user
  {
      my $self = shift;
      my $user = $self->_user(@_);
      $user = "anonymous" unless defined $user;
      $user;
  }
  
  sub password
  {
      my $self = shift;
      my $pass = $self->_password(@_);
      unless (defined $pass) {
  	my $user = $self->user;
  	if ($user eq 'anonymous' || $user eq 'ftp') {
  	    # anonymous ftp login password
              # If there is no ftp anonymous password specified
              # then we'll just use 'anonymous@'
              # We don't try to send the read e-mail address because:
              # - We want to remain anonymous
              # - We want to stop SPAM
              # - We don't want to let ftp sites to discriminate by the user,
              #   host, country or ftp client being used.
  	    $pass = 'anonymous@';
  	}
      }
      $pass;
  }
  
  1;
URI_FTP

    $main::fatpacked{"URI/gopher.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'URI_GOPHER';
  package URI::gopher;  # <draft-murali-url-gopher>, Dec 4, 1996
  
  use strict;
  use warnings;
  
  our $VERSION = '1.76';
  
  use parent 'URI::_server';
  
  use URI::Escape qw(uri_unescape);
  
  #  A Gopher URL follows the common internet scheme syntax as defined in 
  #  section 4.3 of [RFC-URL-SYNTAX]:
  #
  #        gopher://<host>[:<port>]/<gopher-path>
  #
  #  where
  #
  #        <gopher-path> :=  <gopher-type><selector> | 
  #                          <gopher-type><selector>%09<search> |
  #                          <gopher-type><selector>%09<search>%09<gopher+_string>
  #
  #        <gopher-type> := '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7'
  #                         '8' | '9' | '+' | 'I' | 'g' | 'T'
  #
  #        <selector>    := *pchar     Refer to RFC 1808 [4]
  #        <search>      := *pchar
  #        <gopher+_string> := *uchar  Refer to RFC 1738 [3]
  #        
  #  If the optional port is omitted, the port defaults to 70. 
  
  sub default_port { 70 }
  
  sub _gopher_type
  {
      my $self = shift;
      my $path = $self->path_query;
      $path =~ s,^/,,;
      my $gtype = $1 if $path =~ s/^(.)//s;
      if (@_) {
  	my $new_type = shift;
  	if (defined($new_type)) {
  	    Carp::croak("Bad gopher type '$new_type'")
                 unless length($new_type) == 1;
  	    substr($path, 0, 0) = $new_type;
  	    $self->path_query($path);
  	} else {
  	    Carp::croak("Can't delete gopher type when selector is present")
  		if length($path);
  	    $self->path_query(undef);
  	}
      }
      return $gtype;
  }
  
  sub gopher_type
  {
      my $self = shift;
      my $gtype = $self->_gopher_type(@_);
      $gtype = "1" unless defined $gtype;
      $gtype;
  }
  
  sub gtype { goto &gopher_type }  # URI::URL compatibility
  
  sub selector { shift->_gfield(0, @_) }
  sub search   { shift->_gfield(1, @_) }
  sub string   { shift->_gfield(2, @_) }
  
  sub _gfield
  {
      my $self = shift;
      my $fno  = shift;
      my $path = $self->path_query;
  
      # not according to spec., but many popular browsers accept
      # gopher URLs with a '?' before the search string.
      $path =~ s/\?/\t/;
      $path = uri_unescape($path);
      $path =~ s,^/,,;
      my $gtype = $1 if $path =~ s,^(.),,s;
      my @path = split(/\t/, $path, 3);
      if (@_) {
  	# modify
  	my $new = shift;
  	$path[$fno] = $new;
  	pop(@path) while @path && !defined($path[-1]);
  	for (@path) { $_="" unless defined }
  	$path = $gtype;
  	$path = "1" unless defined $path;
  	$path .= join("\t", @path);
  	$self->path_query($path);
      }
      $path[$fno];
  }
  
  1;
URI_GOPHER

    $main::fatpacked{"URI/http.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'URI_HTTP';
  package URI::http;
  
  use strict;
  use warnings;
  
  our $VERSION = '1.76';
  
  use parent 'URI::_server';
  
  sub default_port { 80 }
  
  sub canonical
  {
      my $self = shift;
      my $other = $self->SUPER::canonical;
  
      my $slash_path = defined($other->authority) &&
          !length($other->path) && !defined($other->query);
  
      if ($slash_path) {
  	$other = $other->clone if $other == $self;
  	$other->path("/");
      }
      $other;
  }
  
  1;
URI_HTTP

    $main::fatpacked{"URI/https.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'URI_HTTPS';
  package URI::https;
  
  use strict;
  use warnings;
  
  our $VERSION = '1.76';
  
  use parent 'URI::http';
  
  sub default_port { 443 }
  
  sub secure { 1 }
  
  1;
URI_HTTPS

    $main::fatpacked{"URI/ldap.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'URI_LDAP';
  # Copyright (c) 1998 Graham Barr <gbarr@pobox.com>. All rights reserved.
  # This program is free software; you can redistribute it and/or
  # modify it under the same terms as Perl itself.
  
  package URI::ldap;
  
  use strict;
  use warnings;
  
  our $VERSION = '1.76';
  
  use parent qw(URI::_ldap URI::_server);
  
  sub default_port { 389 }
  
  sub _nonldap_canonical {
      my $self = shift;
      $self->URI::_server::canonical(@_);
  }
  
  1;
  
  __END__
  
  =head1 NAME
  
  URI::ldap - LDAP Uniform Resource Locators
  
  =head1 SYNOPSIS
  
    use URI;
  
    $uri = URI->new("ldap:$uri_string");
    $dn     = $uri->dn;
    $filter = $uri->filter;
    @attr   = $uri->attributes;
    $scope  = $uri->scope;
    %extn   = $uri->extensions;
    
    $uri = URI->new("ldap:");  # start empty
    $uri->host("ldap.itd.umich.edu");
    $uri->dn("o=University of Michigan,c=US");
    $uri->attributes(qw(postalAddress));
    $uri->scope('sub');
    $uri->filter('(cn=Babs Jensen)');
    print $uri->as_string,"\n";
  
  =head1 DESCRIPTION
  
  C<URI::ldap> provides an interface to parse an LDAP URI into its
  constituent parts and also to build a URI as described in
  RFC 2255.
  
  =head1 METHODS
  
  C<URI::ldap> supports all the generic and server methods defined by
  L<URI>, plus the following.
  
  Each of the following methods can be used to set or get the value in
  the URI. The values are passed in unescaped form.  None of these
  return undefined values, but elements without a default can be empty.
  If arguments are given, then a new value is set for the given part
  of the URI.
  
  =over 4
  
  =item $uri->dn( [$new_dn] )
  
  Sets or gets the I<Distinguished Name> part of the URI.  The DN
  identifies the base object of the LDAP search.
  
  =item $uri->attributes( [@new_attrs] )
  
  Sets or gets the list of attribute names which are
  returned by the search.
  
  =item $uri->scope( [$new_scope] )
  
  Sets or gets the scope to be used by the search. The value can be one of
  C<"base">, C<"one"> or C<"sub">. If none is given in the URI then the
  return value defaults to C<"base">.
  
  =item $uri->_scope( [$new_scope] )
  
  Same as scope(), but does not default to anything.
  
  =item $uri->filter( [$new_filter] )
  
  Sets or gets the filter to be used by the search. If none is given in
  the URI then the return value defaults to C<"(objectClass=*)">.
  
  =item $uri->_filter( [$new_filter] )
  
  Same as filter(), but does not default to anything.
  
  =item $uri->extensions( [$etype => $evalue,...] )
  
  Sets or gets the extensions used for the search. The list passed should
  be in the form etype1 => evalue1, etype2 => evalue2,... This is also
  the form of list that is returned.
  
  =back
  
  =head1 SEE ALSO
  
  L<http://tools.ietf.org/html/rfc2255>
  
  =head1 AUTHOR
  
  Graham Barr E<lt>F<gbarr@pobox.com>E<gt>
  
  Slightly modified by Gisle Aas to fit into the URI distribution.
  
  =head1 COPYRIGHT
  
  Copyright (c) 1998 Graham Barr. All rights reserved. This program is
  free software; you can redistribute it and/or modify it under the same
  terms as Perl itself.
  
  =cut
URI_LDAP

    $main::fatpacked{"URI/ldapi.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'URI_LDAPI';
  package URI::ldapi;
  
  use strict;
  use warnings;
  
  our $VERSION = '1.76';
  
  use parent qw(URI::_ldap URI::_generic);
  
  require URI::Escape;
  
  sub un_path {
      my $self = shift;
      my $old = URI::Escape::uri_unescape($self->authority);
      if (@_) {
  	my $p = shift;
  	$p =~ s/:/%3A/g;
  	$p =~ s/\@/%40/g;
  	$self->authority($p);
      }
      return $old;
  }
  
  sub _nonldap_canonical {
      my $self = shift;
      $self->URI::_generic::canonical(@_);
  }
  
  1;
URI_LDAPI

    $main::fatpacked{"URI/ldaps.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'URI_LDAPS';
  package URI::ldaps;
  
  use strict;
  use warnings;
  
  our $VERSION = '1.76';
  
  use parent 'URI::ldap';
  
  sub default_port { 636 }
  
  sub secure { 1 }
  
  1;
URI_LDAPS

    $main::fatpacked{"URI/mailto.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'URI_MAILTO';
  package URI::mailto;  # RFC 2368
  
  use strict;
  use warnings;
  
  our $VERSION = '1.76';
  
  use parent qw(URI URI::_query);
  
  sub to
  {
      my $self = shift;
      my @old = $self->headers;
      if (@_) {
  	my @new = @old;
  	# get rid of any other to: fields
  	for (my $i = 0; $i < @new; $i += 2) {
  	    if (lc($new[$i] || '') eq "to") {
  		splice(@new, $i, 2);
  		redo;
  	    }
  	}
  
  	my $to = shift;
  	$to = "" unless defined $to;
  	unshift(@new, "to" => $to);
  	$self->headers(@new);
      }
      return unless defined wantarray;
  
      my @to;
      while (@old) {
  	my $h = shift @old;
  	my $v = shift @old;
  	push(@to, $v) if lc($h) eq "to";
      }
      join(",", @to);
  }
  
  
  sub headers
  {
      my $self = shift;
  
      # The trick is to just treat everything as the query string...
      my $opaque = "to=" . $self->opaque;
      $opaque =~ s/\?/&/;
  
      if (@_) {
  	my @new = @_;
  
  	# strip out any "to" fields
  	my @to;
  	for (my $i=0; $i < @new; $i += 2) {
  	    if (lc($new[$i] || '') eq "to") {
  		push(@to, (splice(@new, $i, 2))[1]);  # remove header
  		redo;
  	    }
  	}
  
  	my $new = join(",",@to);
  	$new =~ s/%/%25/g;
  	$new =~ s/\?/%3F/g;
  	$self->opaque($new);
  	$self->query_form(@new) if @new;
      }
      return unless defined wantarray;
  
      # I am lazy today...
      URI->new("mailto:?$opaque")->query_form;
  }
  
  1;
URI_MAILTO

    $main::fatpacked{"URI/mms.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'URI_MMS';
  package URI::mms;
  
  use strict;
  use warnings;
  
  our $VERSION = '1.76';
  
  use parent 'URI::http';
  
  sub default_port { 1755 }
  
  1;
URI_MMS

    $main::fatpacked{"URI/news.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'URI_NEWS';
  package URI::news;  # draft-gilman-news-url-01
  
  use strict;
  use warnings;
  
  our $VERSION = '1.76';
  
  use parent 'URI::_server';
  
  use URI::Escape qw(uri_unescape);
  use Carp ();
  
  sub default_port { 119 }
  
  #   newsURL      =  scheme ":" [ news-server ] [ refbygroup | message ]
  #   scheme       =  "news" | "snews" | "nntp"
  #   news-server  =  "//" server "/"
  #   refbygroup   = group [ "/" messageno [ "-" messageno ] ]
  #   message      = local-part "@" domain
  
  sub _group
  {
      my $self = shift;
      my $old = $self->path;
      if (@_) {
  	my($group,$from,$to) = @_;
  	if ($group =~ /\@/) {
              $group =~ s/^<(.*)>$/$1/;  # "<" and ">" should not be part of it
  	}
  	$group =~ s,%,%25,g;
  	$group =~ s,/,%2F,g;
  	my $path = $group;
  	if (defined $from) {
  	    $path .= "/$from";
  	    $path .= "-$to" if defined $to;
  	}
  	$self->path($path);
      }
  
      $old =~ s,^/,,;
      if ($old !~ /\@/ && $old =~ s,/(.*),, && wantarray) {
  	my $extra = $1;
  	return (uri_unescape($old), split(/-/, $extra));
      }
      uri_unescape($old);
  }
  
  
  sub group
  {
      my $self = shift;
      if (@_) {
  	Carp::croak("Group name can't contain '\@'") if $_[0] =~ /\@/;
      }
      my @old = $self->_group(@_);
      return if $old[0] =~ /\@/;
      wantarray ? @old : $old[0];
  }
  
  sub message
  {
      my $self = shift;
      if (@_) {
  	Carp::croak("Message must contain '\@'") unless $_[0] =~ /\@/;
      }
      my $old = $self->_group(@_);
      return undef unless $old =~ /\@/;
      return $old;
  }
  
  1;
URI_NEWS

    $main::fatpacked{"URI/nntp.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'URI_NNTP';
  package URI::nntp;  # draft-gilman-news-url-01
  
  use strict;
  use warnings;
  
  our $VERSION = '1.76';
  
  use parent 'URI::news';
  
  1;
URI_NNTP

    $main::fatpacked{"URI/pop.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'URI_POP';
  package URI::pop;   # RFC 2384
  
  use strict;
  use warnings;
  
  our $VERSION = '1.76';
  
  use parent 'URI::_server';
  
  use URI::Escape qw(uri_unescape);
  
  sub default_port { 110 }
  
  #pop://<user>;auth=<auth>@<host>:<port>
  
  sub user
  {
      my $self = shift;
      my $old = $self->userinfo;
  
      if (@_) {
  	my $new_info = $old;
  	$new_info = "" unless defined $new_info;
  	$new_info =~ s/^[^;]*//;
  
  	my $new = shift;
  	if (!defined($new) && !length($new_info)) {
  	    $self->userinfo(undef);
  	} else {
  	    $new = "" unless defined $new;
  	    $new =~ s/%/%25/g;
  	    $new =~ s/;/%3B/g;
  	    $self->userinfo("$new$new_info");
  	}
      }
  
      return undef unless defined $old;
      $old =~ s/;.*//;
      return uri_unescape($old);
  }
  
  sub auth
  {
      my $self = shift;
      my $old = $self->userinfo;
  
      if (@_) {
  	my $new = $old;
  	$new = "" unless defined $new;
  	$new =~ s/(^[^;]*)//;
  	my $user = $1;
  	$new =~ s/;auth=[^;]*//i;
  
  	
  	my $auth = shift;
  	if (defined $auth) {
  	    $auth =~ s/%/%25/g;
  	    $auth =~ s/;/%3B/g;
  	    $new = ";AUTH=$auth$new";
  	}
  	$self->userinfo("$user$new");
  	
      }
  
      return undef unless defined $old;
      $old =~ s/^[^;]*//;
      return uri_unescape($1) if $old =~ /;auth=(.*)/i;
      return;
  }
  
  1;
URI_POP

    $main::fatpacked{"URI/rlogin.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'URI_RLOGIN';
  package URI::rlogin;
  
  use strict;
  use warnings;
  
  our $VERSION = '1.76';
  
  use parent 'URI::_login';
  
  sub default_port { 513 }
  
  1;
URI_RLOGIN

    $main::fatpacked{"URI/rsync.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'URI_RSYNC';
  package URI::rsync;  # http://rsync.samba.org/
  
  # rsync://[USER@]HOST[:PORT]/SRC
  
  use strict;
  use warnings;
  
  our $VERSION = '1.76';
  
  use parent qw(URI::_server URI::_userpass);
  
  sub default_port { 873 }
  
  1;
URI_RSYNC

    $main::fatpacked{"URI/rtsp.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'URI_RTSP';
  package URI::rtsp;
  
  use strict;
  use warnings;
  
  our $VERSION = '1.76';
  
  use parent 'URI::http';
  
  sub default_port { 554 }
  
  1;
URI_RTSP

    $main::fatpacked{"URI/rtspu.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'URI_RTSPU';
  package URI::rtspu;
  
  use strict;
  use warnings;
  
  our $VERSION = '1.76';
  
  use parent 'URI::rtsp';
  
  sub default_port { 554 }
  
  1;
URI_RTSPU

    $main::fatpacked{"URI/sftp.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'URI_SFTP';
  package URI::sftp;
  
  use strict;
  use warnings;
  
  use parent 'URI::ssh';
  
  our $VERSION = '1.76';
  
  1;
URI_SFTP

    $main::fatpacked{"URI/sip.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'URI_SIP';
  #
  # Written by Ryan Kereliuk <ryker@ryker.org>.  This file may be
  # distributed under the same terms as Perl itself.
  #
  # The RFC 3261 sip URI is <scheme>:<authority>;<params>?<query>.
  #
  
  package URI::sip;
  
  use strict;
  use warnings;
  
  use parent qw(URI::_server URI::_userpass);
  
  use URI::Escape qw(uri_unescape);
  
  our $VERSION = '1.76';
  
  sub default_port { 5060 }
  
  sub authority
  {
      my $self = shift;
      $$self =~ m,^($URI::scheme_re:)?([^;?]*)(.*)$,os or die;
      my $old = $2;
  
      if (@_) {
          my $auth = shift;
          $$self = defined($1) ? $1 : "";
          my $rest = $3;
          if (defined $auth) {
              $auth =~ s/([^$URI::uric])/ URI::Escape::escape_char($1)/ego;
              $$self .= "$auth";
          }
          $$self .= $rest;
      }
      $old;
  }
  
  sub params_form
  {
      my $self = shift;
      $$self =~ m,^((?:$URI::scheme_re:)?)(?:([^;?]*))?(;[^?]*)?(.*)$,os or die;
      my $paramstr = $3;
  
      if (@_) {
      	my @args = @_; 
          $$self = $1 . $2;
          my $rest = $4;
  	my @new;
  	for (my $i=0; $i < @args; $i += 2) {
  	    push(@new, "$args[$i]=$args[$i+1]");
  	}
  	$paramstr = join(";", @new);
  	$$self .= ";" . $paramstr . $rest;
      }
      $paramstr =~ s/^;//o;
      return split(/[;=]/, $paramstr);
  }
  
  sub params
  {
      my $self = shift;
      $$self =~ m,^((?:$URI::scheme_re:)?)(?:([^;?]*))?(;[^?]*)?(.*)$,os or die;
      my $paramstr = $3;
  
      if (@_) {
      	my $new = shift; 
          $$self = $1 . $2;
          my $rest = $4;
  	$$self .= $paramstr . $rest;
      }
      $paramstr =~ s/^;//o;
      return $paramstr;
  }
  
  # Inherited methods that make no sense for a SIP URI.
  sub path {}
  sub path_query {}
  sub path_segments {}
  sub abs { shift }
  sub rel { shift }
  sub query_keywords {}
  
  1;
URI_SIP

    $main::fatpacked{"URI/sips.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'URI_SIPS';
  package URI::sips;
  
  use strict;
  use warnings;
  
  our $VERSION = '1.76';
  
  use parent 'URI::sip';
  
  sub default_port { 5061 }
  
  sub secure { 1 }
  
  1;
URI_SIPS

    $main::fatpacked{"URI/snews.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'URI_SNEWS';
  package URI::snews;  # draft-gilman-news-url-01
  
  use strict;
  use warnings;
  
  our $VERSION = '1.76';
  
  use parent 'URI::news';
  
  sub default_port { 563 }
  
  sub secure { 1 }
  
  1;
URI_SNEWS

    $main::fatpacked{"URI/ssh.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'URI_SSH';
  package URI::ssh;
  
  use strict;
  use warnings;
  
  our $VERSION = '1.76';
  
  use parent 'URI::_login';
  
  # ssh://[USER@]HOST[:PORT]/SRC
  
  sub default_port { 22 }
  
  sub secure { 1 }
  
  1;
URI_SSH

    $main::fatpacked{"URI/telnet.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'URI_TELNET';
  package URI::telnet;
  
  use strict;
  use warnings;
  
  our $VERSION = '1.76';
  
  use parent 'URI::_login';
  
  sub default_port { 23 }
  
  1;
URI_TELNET

    $main::fatpacked{"URI/tn3270.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'URI_TN3270';
  package URI::tn3270;
  
  use strict;
  use warnings;
  
  our $VERSION = '1.76';
  
  use parent 'URI::_login';
  
  sub default_port { 23 }
  
  1;
URI_TN3270

    $main::fatpacked{"URI/urn.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'URI_URN';
  package URI::urn;  # RFC 2141
  
  use strict;
  use warnings;
  
  our $VERSION = '1.76';
  
  use parent 'URI';
  
  use Carp qw(carp);
  
  my %implementor;
  my %require_attempted;
  
  sub _init {
      my $class = shift;
      my $self = $class->SUPER::_init(@_);
      my $nid = $self->nid;
  
      my $impclass = $implementor{$nid};
      return $impclass->_urn_init($self, $nid) if $impclass;
  
      $impclass = "URI::urn";
      if ($nid =~ /^[A-Za-z\d][A-Za-z\d\-]*\z/) {
  	my $id = $nid;
  	# make it a legal perl identifier
  	$id =~ s/-/_/g;
  	$id = "_$id" if $id =~ /^\d/;
  
  	$impclass = "URI::urn::$id";
  	no strict 'refs';
  	unless (@{"${impclass}::ISA"}) {
              if (not exists $require_attempted{$impclass}) {
                  # Try to load it
                  my $_old_error = $@;
                  eval "require $impclass";
                  die $@ if $@ && $@ !~ /Can\'t locate.*in \@INC/;
                  $@ = $_old_error;
              }
  	    $impclass = "URI::urn" unless @{"${impclass}::ISA"};
  	}
      }
      else {
  	carp("Illegal namespace identifier '$nid' for URN '$self'") if $^W;
      }
      $implementor{$nid} = $impclass;
  
      return $impclass->_urn_init($self, $nid);
  }
  
  sub _urn_init {
      my($class, $self, $nid) = @_;
      bless $self, $class;
  }
  
  sub _nid {
      my $self = shift;
      my $opaque = $self->opaque;
      if (@_) {
  	my $v = $opaque;
  	my $new = shift;
  	$v =~ s/[^:]*/$new/;
  	$self->opaque($v);
  	# XXX possible rebless
      }
      $opaque =~ s/:.*//s;
      return $opaque;
  }
  
  sub nid {  # namespace identifier
      my $self = shift;
      my $nid = $self->_nid(@_);
      $nid = lc($nid) if defined($nid);
      return $nid;
  }
  
  sub nss {  # namespace specific string
      my $self = shift;
      my $opaque = $self->opaque;
      if (@_) {
  	my $v = $opaque;
  	my $new = shift;
  	if (defined $new) {
  	    $v =~ s/(:|\z).*/:$new/;
  	}
  	else {
  	    $v =~ s/:.*//s;
  	}
  	$self->opaque($v);
      }
      return undef unless $opaque =~ s/^[^:]*://;
      return $opaque;
  }
  
  sub canonical {
      my $self = shift;
      my $nid = $self->_nid;
      my $new = $self->SUPER::canonical;
      return $new if $nid !~ /[A-Z]/ || $nid =~ /%/;
      $new = $new->clone if $new == $self;
      $new->nid(lc($nid));
      return $new;
  }
  
  1;
URI_URN

    $main::fatpacked{"URI/urn/isbn.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'URI_URN_ISBN';
  package URI::urn::isbn;  # RFC 3187
  
  use strict;
  use warnings;
  
  our $VERSION = '1.76';
  
  use parent 'URI::urn';
  
  use Carp qw(carp);
  
  BEGIN {
      require Business::ISBN;
      
      local $^W = 0; # don't warn about dev versions, perl5.004 style
      warn "Using Business::ISBN version " . Business::ISBN->VERSION . 
          " which is deprecated.\nUpgrade to Business::ISBN version 2\n"
          if Business::ISBN->VERSION < 2;
      }
      
  sub _isbn {
      my $nss = shift;
      $nss = $nss->nss if ref($nss);
      my $isbn = Business::ISBN->new($nss);
      $isbn = undef if $isbn && !$isbn->is_valid;
      return $isbn;
  }
  
  sub _nss_isbn {
      my $self = shift;
      my $nss = $self->nss(@_);
      my $isbn = _isbn($nss);
      $isbn = $isbn->as_string if $isbn;
      return($nss, $isbn);
  }
  
  sub isbn {
      my $self = shift;
      my $isbn;
      (undef, $isbn) = $self->_nss_isbn(@_);
      return $isbn;
  }
  
  sub isbn_publisher_code {
      my $isbn = shift->_isbn || return undef;
      return $isbn->publisher_code;
  }
  
  BEGIN {
  my $group_method = do {
      local $^W = 0; # don't warn about dev versions, perl5.004 style
      Business::ISBN->VERSION >= 2 ? 'group_code' : 'country_code';
      };
  
  sub isbn_group_code {
      my $isbn = shift->_isbn || return undef;
      return $isbn->$group_method;
  }
  }
  
  sub isbn_country_code {
      my $name = (caller(0))[3]; $name =~ s/.*:://;
      carp "$name is DEPRECATED. Use isbn_group_code instead";
      
      no strict 'refs';
      &isbn_group_code;
  }
  
  BEGIN {
  my $isbn13_method = do {
      local $^W = 0; # don't warn about dev versions, perl5.004 style
      Business::ISBN->VERSION >= 2 ? 'as_isbn13' : 'as_ean';
      };
  
  sub isbn13 {
      my $isbn = shift->_isbn || return undef;
      
      # Business::ISBN 1.x didn't put hyphens in the EAN, and it was just a string
      # Business::ISBN 2.0 doesn't do EAN, but it does ISBN-13 objects
      #   and it uses the hyphens, so call as_string with an empty anon array
      # or, adjust the test and features to say that it comes out with hyphens.
      my $thingy = $isbn->$isbn13_method;
      return eval { $thingy->can( 'as_string' ) } ? $thingy->as_string([]) : $thingy;
  }
  }
  
  sub isbn_as_ean {
      my $name = (caller(0))[3]; $name =~ s/.*:://;
      carp "$name is DEPRECATED. Use isbn13 instead";
  
      no strict 'refs';
      &isbn13;
  }
  
  sub canonical {
      my $self = shift;
      my($nss, $isbn) = $self->_nss_isbn;
      my $new = $self->SUPER::canonical;
      return $new unless $nss && $isbn && $nss ne $isbn;
      $new = $new->clone if $new == $self;
      $new->nss($isbn);
      return $new;
  }
  
  1;
URI_URN_ISBN

    $main::fatpacked{"URI/urn/oid.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'URI_URN_OID';
  package URI::urn::oid;  # RFC 2061
  
  use strict;
  use warnings;
  
  our $VERSION = '1.76';
  
  use parent 'URI::urn';
  
  sub oid {
      my $self = shift;
      my $old = $self->nss;
      if (@_) {
  	$self->nss(join(".", @_));
      }
      return split(/\./, $old) if wantarray;
      return $old;
  }
  
  1;
URI_URN_OID

    $main::fatpacked{"UUID/Random.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'UUID_RANDOM';
  package UUID::Random;
  
  require 5.006_001;
  use strict;
  use warnings;
  
  
  our $VERSION = '0.04';
  
  sub generate {
    my @chars = ('a'..'f',0..9);
    my @string;
    push(@string, $chars[int(rand(16))]) for(1..32);
    splice(@string,8,0,'-');
    splice(@string,13,0,'-');
    splice(@string,18,0,'-');
    splice(@string,23,0,'-');
    return join('', @string);
  }
  
  1;
  __END__
  
  =head1 NAME
  
  UUID::Random - Generate random uuid strings
  
  =head1 SYNOPSIS
  
    use UUID::Random;
    my $uuid = UUID::Random::generate;
  
  =head1 DESCRIPTION
  
  This module generates random uuid strings. It does not satisfy any of the points listed in RFC 4122 (L<http://tools.ietf.org/html/rfc4122>) but the default format.
  
  
  
  =head1 SEE ALSO
  
  If you need RFC compliant UUID strings have a look at L<Data::UUID>
  
  =head1 AUTHOR
  
  Moritz Onken, E<lt>onken@houseofdesign.deE<gt>
  
  =head1 COPYRIGHT AND LICENSE
  
  Copyright (C) 2008 by Moritz Onken
  
  This library is free software; you can redistribute it and/or modify
  it under the same terms as Perl itself, either Perl version 5.8.8 or,
  at your option, any later version of Perl 5 you may have available.
  
  
  =cut
UUID_RANDOM

    $main::fatpacked{"UUID/Tiny.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'UUID_TINY';
  package UUID::Tiny;
  
  use 5.008;
  use warnings;
  use strict;
  use Carp;
  use Digest::MD5;
  use MIME::Base64;
  use Time::HiRes;
  use POSIX;
  
  my $SHA1_CALCULATOR = undef;
  
  {
      # Check for availability of SHA-1 ...
      local $@; # don't leak an error condition
      eval { require Digest::SHA;  $SHA1_CALCULATOR = Digest::SHA->new(1) } ||
      eval { require Digest::SHA1; $SHA1_CALCULATOR = Digest::SHA1->new() } ||
      eval {
          require Digest::SHA::PurePerl;
          $SHA1_CALCULATOR = Digest::SHA::PurePerl->new(1)
      };
  };
  
  my $MD5_CALCULATOR = Digest::MD5->new();
  
  
  # ToDo:
  # - Check and report for undefined UUIDs with all UUID manipulating functions!
  # - Better error propagation for better debugging.
  
  
  
  =head1 NAME
  
  UUID::Tiny - Pure Perl UUID Support With Functional Interface
  
  =head1 VERSION
  
  Version 1.04
  
  =cut
  
  our $VERSION = '1.04';
  
  
  =head1 SYNOPSIS
  
  Create version 1, 3, 4 and 5 UUIDs:
  
      use UUID::Tiny ':std';
  
      my $v1_mc_UUID      = create_uuid();
      my $v1_mc_UUID_2    = create_uuid(UUID_V1);
      my $v1_mc_UUID_3    = create_uuid(UUID_TIME);
      my $v3_md5_UUID     = create_uuid(UUID_V3, $str);
      my $v3_md5_UUID_2   = create_uuid(UUID_MD5, UUID_NS_DNS, 'caugustin.de');
      my $v4_rand_UUID    = create_uuid(UUID_V4);
      my $v4_rand_UUID_2  = create_uuid(UUID_RANDOM);
      my $v5_sha1_UUID    = create_uuid(UUID_V5, $str);
      my $v5_with_NS_UUID = create_uuid(UUID_SHA1, UUID_NS_DNS, 'caugustin.de');
  
      my $v1_mc_UUID_string  = create_uuid_as_string(UUID_V1);
      my $v3_md5_UUID_string = uuid_to_string($v3_md5_UUID);
  
      if ( version_of_uuid($v1_mc_UUID) == 1   ) { ... };
      if ( version_of_uuid($v5_sha1_UUID) == 5 ) { ... };
      if ( is_uuid_string($v1_mc_UUID_string)  ) { ... };
      if ( equal_uuids($uuid1, $uuid2)         ) { ... };
  
      my $uuid_time    = time_of_uuid($v1_mc_UUID);
      my $uuid_clk_seq = clk_seq_of_uuid($v1_mc_UUID);
  
  =cut
  
  
  =head1 DESCRIPTION
  
  UUID::Tiny is a lightweight, low dependency Pure Perl module for UUID
  creation and testing. This module provides the creation of version 1 time
  based UUIDs (using random multicast MAC addresses), version 3 MD5 based UUIDs,
  version 4 random UUIDs, and version 5 SHA-1 based UUIDs.
  
  ATTENTION! UUID::Tiny uses Perl's C<rand()> to create the basic random
  numbers, so the created v4 UUIDs are B<not> cryptographically strong!
  
  No fancy OO interface, no plethora of different UUID representation formats
  and transformations - just string and binary. Conversion, test and time
  functions equally accept UUIDs and UUID strings, so don't bother to convert
  UUIDs for them!
  
  Continuing with 1.0x versions all constants and public functions are exported
  by default, but this will change in the future (see below). 
  
  UUID::Tiny deliberately uses a minimal functional interface for UUID creation
  (and conversion/testing), because in this case OO looks like overkill to me
  and makes the creation and use of UUIDs unnecessarily complicated.
  
  If you need raw performance for UUID creation, or the real MAC address in
  version 1 UUIDs, or an OO interface, and if you can afford module compilation
  and installation on the target system, then better look at other CPAN UUID
  modules like L<Data::UUID>.
  
  This module is "fork safe", especially for random UUIDs (it works around
  Perl's rand() problem when forking processes).
  
  This module is currently B<not> "thread safe". Even though I've incorporated
  some changes proposed by Michael G. Schwern (thanks!), Digest::MD5 and
  Digest::SHA seem so have trouble with threads. There is a test file for
  threads, but it is de-activated. So use at your own risk!
  
  =cut
  
  
  =head1 DEPENDENCIES
  
  This module should run from Perl 5.8 up and uses mostly standard (5.8 core)
  modules for its job. No compilation or installation required. These are the
  modules UUID::Tiny depends on:
  
      Carp
      Digest::MD5   Perl 5.8 core
      Digest::SHA   Perl 5.10 core (or Digest::SHA1, or Digest::SHA::PurePerl)
      MIME::Base64  Perl 5.8 core
      Time::HiRes   Perl 5.8 core
      POSIX         Perl 5.8 core
  
  If you are using this module on a Perl prior to 5.10 and you don't have
  Digest::SHA1 installed, you can use Digest::SHA::PurePerl instead.
  
  =cut
  
  
  =head1 ATTENTION! NEW STANDARD INTERFACE
  
  After some debate I'm convinced that it is more Perlish (and far easier to
  write) to use all-lowercase function names - without exceptions. And that it
  is more polite to export symbols only on demand.
  
  While the 1.0x versions will continue to export the old, "legacy" interface on
  default, the future standard interface is available using the C<:std> tag on
  import from version 1.02 on:
  
      use UUID::Tiny ':std';
      my $md5_uuid = create_uuid(UUID_MD5, $str);
  
  In preparation for future version of UUID::Tiny you have to use the
  C<:legacy> tag if you want to stay with the version 1.0 interface:
  
      use UUID::Tiny ':legacy';
      my $md5_uuid = create_UUID(UUID_V3, $str);
  
  =cut
  
  use Exporter;
  our @ISA = qw(Exporter);
  our @EXPORT;
  our @EXPORT_OK;
  our %EXPORT_TAGS = (
       std =>         [qw(
                          UUID_NIL
                          UUID_NS_DNS UUID_NS_URL UUID_NS_OID UUID_NS_X500
                          UUID_V1 UUID_TIME
                          UUID_V3 UUID_MD5
                          UUID_V4 UUID_RANDOM
                          UUID_V5 UUID_SHA1
                          UUID_SHA1_AVAIL
                          create_uuid create_uuid_as_string
                          is_uuid_string
                          uuid_to_string string_to_uuid
                          version_of_uuid time_of_uuid clk_seq_of_uuid
                          equal_uuids
                      )],
      legacy =>       [qw(
                          UUID_NIL
                          UUID_NS_DNS UUID_NS_URL UUID_NS_OID UUID_NS_X500
                          UUID_V1
                          UUID_V3
                          UUID_V4
                          UUID_V5
                          UUID_SHA1_AVAIL
                          create_UUID create_UUID_as_string
                          is_UUID_string
                          UUID_to_string string_to_UUID
                          version_of_UUID time_of_UUID clk_seq_of_UUID
                          equal_UUIDs
                      )],
  );
  
  Exporter::export_tags('legacy');
  Exporter::export_ok_tags('std');
  
  
  =head1 CONSTANTS
  
  =cut
  
  =over 4
  
  =item B<NIL UUID>
  
  This module provides the NIL UUID (shown with its string representation):
  
      UUID_NIL: '00000000-0000-0000-0000-000000000000'
  
  =cut
  
  use constant UUID_NIL => "\x00" x 16;
  
  
  =item B<Pre-defined Namespace UUIDs>
  
  This module provides the common pre-defined namespace UUIDs (shown with their
  string representation):
  
      UUID_NS_DNS:  '6ba7b810-9dad-11d1-80b4-00c04fd430c8'
      UUID_NS_URL:  '6ba7b811-9dad-11d1-80b4-00c04fd430c8'
      UUID_NS_OID:  '6ba7b812-9dad-11d1-80b4-00c04fd430c8'
      UUID_NS_X500: '6ba7b814-9dad-11d1-80b4-00c04fd430c8'
  
  =cut
  
  use constant UUID_NS_DNS  =>
      "\x6b\xa7\xb8\x10\x9d\xad\x11\xd1\x80\xb4\x00\xc0\x4f\xd4\x30\xc8";
  use constant UUID_NS_URL  =>
      "\x6b\xa7\xb8\x11\x9d\xad\x11\xd1\x80\xb4\x00\xc0\x4f\xd4\x30\xc8";
  use constant UUID_NS_OID  =>
      "\x6b\xa7\xb8\x12\x9d\xad\x11\xd1\x80\xb4\x00\xc0\x4f\xd4\x30\xc8";
  use constant UUID_NS_X500 =>
      "\x6b\xa7\xb8\x14\x9d\xad\x11\xd1\x80\xb4\x00\xc0\x4f\xd4\x30\xc8";
  
  
  =item B<UUID versions>
  
  This module provides the UUID version numbers as constants:
  
      UUID_V1
      UUID_V3
      UUID_V4
      UUID_V5
  
  With C<use UUID::Tiny ':std';> you get additional, "speaking" constants:
  
      UUID_TIME
      UUID_MD5
      UUID_RANDOM
      UUID_SHA1
  
  =cut
  
  use constant UUID_V1 => 1; use constant UUID_TIME   => 1;
  use constant UUID_V3 => 3; use constant UUID_MD5    => 3;
  use constant UUID_V4 => 4; use constant UUID_RANDOM => 4;
  use constant UUID_V5 => 5; use constant UUID_SHA1   => 5;
  
  
  =item B<UUID_SHA1_AVAIL>
  
      my $uuid = create_UUID( UUID_SHA1_AVAIL? UUID_V5 : UUID_V3, $str );
  
  This function returns 1 if a module to create SHA-1 digests could be loaded, 0
  otherwise.
  
  UUID::Tiny (since version 1.02) tries to load Digest::SHA, Digest::SHA1 or
  Digest::SHA::PurePerl, but does not die if none of them is found. Instead
  C<create_UUID()> and C<create_UUID_as_string()> die when trying to create an
  SHA-1 based UUID without an appropriate module available.
  
  =cut
  
  sub UUID_SHA1_AVAIL {
      return defined $SHA1_CALCULATOR ? 1 : 0;
  }
  
  =back
  
  =cut
  
  =head1 FUNCTIONS
  
  All public functions are exported by default (they should not collide with
  other functions).
  
  C<create_UUID()> creates standard binary UUIDs in network byte order
  (MSB first), C<create_UUID_as_string()> creates the standard string
  representation of UUIDs.
  
  All query and test functions (except C<is_UUID_string>) accept both
  representations.
  
  =over 4
  
  =cut
  
  =item B<create_UUID()>, B<create_uuid()> (:std)
  
      my $v1_mc_UUID   = create_UUID();
      my $v1_mc_UUID   = create_UUID(UUID_V1);
      my $v3_md5_UUID  = create_UUID(UUID_V3, $ns_uuid, $name_or_filehandle);
      my $v3_md5_UUID  = create_UUID(UUID_V3, $name_or_filehandle);
      my $v4_rand_UUID = create_UUID(UUID_V4);
      my $v5_sha1_UUID = create_UUID(UUID_V5, $ns_uuid, $name_or_filehandle);
      my $v5_sha1_UUID = create_UUID(UUID_V5, $name_or_filehandle);
  
  Creates a binary UUID in network byte order (MSB first). For v3 and v5 UUIDs a
  C<SCALAR> (normally a string), C<GLOB> ("classic" file handle) or C<IO> object
  (i.e. C<IO::File>) can be used; files have to be opened for reading.
  
  I found no hint if and how UUIDs should be created from file content. It seems
  to be undefined, but it is useful - so I would suggest to use UUID_NIL as the
  namespace UUID, because no "real name" is used; UUID_NIL is used by default if
  a namespace UUID is missing (only 2 arguments are used).
  
  =cut
  
  sub create_uuid {
      use bytes;
      my ($v, $arg2, $arg3) = (shift || UUID_V1, shift, shift);
      my $uuid    = UUID_NIL;
      my $ns_uuid = string_to_uuid(defined $arg3 ? $arg2 : UUID_NIL);
      my $name    = defined $arg3 ? $arg3 : $arg2;
  
      if ($v == UUID_V1) {
          $uuid = _create_v1_uuid();
      }
      elsif ($v == UUID_V3 ) {
          $uuid = _create_v3_uuid($ns_uuid, $name);
      }
      elsif ($v == UUID_V4) {
          $uuid = _create_v4_uuid();
      }
      elsif ($v == UUID_V5) {
          $uuid = _create_v5_uuid($ns_uuid, $name);
      }
      else {
          croak __PACKAGE__ . "::create_uuid(): Invalid UUID version '$v'!";
      }
  
      # Set variant 2 in UUID ...
      substr $uuid, 8, 1, chr(ord(substr $uuid, 8, 1) & 0x3f | 0x80);
  
      return $uuid;
  }
  
  *create_UUID = \&create_uuid;
  
  
  sub _create_v1_uuid {
      my $uuid = '';
  
      # Create time and clock sequence ...
      my $timestamp = Time::HiRes::time();
      my $clk_seq   = _get_clk_seq($timestamp);
  
      # hi = time mod (1000000 / 0x100000000)
      my $hi = floor( $timestamp / 65536.0 / 512 * 78125 );
      $timestamp -= $hi * 512.0 * 65536 / 78125;
      my $low = floor( $timestamp * 10000000.0 + 0.5 );
  
      # MAGIC offset: 01B2-1DD2-13814000
      if ( $low < 0xec7ec000 ) {
          $low += 0x13814000;
      }
      else {
          $low -= 0xec7ec000;
          $hi++;
      }
  
      if ( $hi < 0x0e4de22e ) {
          $hi += 0x01b21dd2;
      }
      else {
          $hi -= 0x0e4de22e;    # wrap around
      }
  
      # Set time in UUID ...
      substr $uuid, 0, 4, pack( 'N', $low );            # set time low
      substr $uuid, 4, 2, pack( 'n', $hi & 0xffff );    # set time mid
      substr $uuid, 6, 2, pack( 'n', ( $hi >> 16 ) & 0x0fff );    # set time high
  
      # Set clock sequence in UUID ...
      substr $uuid, 8, 2, pack( 'n', $clk_seq );
  
      # Set random node in UUID ...
      substr $uuid, 10, 6, _random_node_id();
  
      return _set_uuid_version($uuid, 0x10);
  }
  
  sub _create_v3_uuid {
      my $ns_uuid = shift;
      my $name    = shift;
      my $uuid    = '';
  
      # Create digest in UUID ...
      $MD5_CALCULATOR->reset();
      $MD5_CALCULATOR->add($ns_uuid);
  
      if ( ref($name) =~ m/^(?:GLOB|IO::)/ ) {
          $MD5_CALCULATOR->addfile($name);
      }
      elsif ( ref $name ) {
          croak __PACKAGE__
              . '::create_uuid(): Name for v3 UUID'
              . ' has to be SCALAR, GLOB or IO object, not '
              . ref($name) .'!'
              ;
      }
      elsif ( defined $name ) {
          $MD5_CALCULATOR->add($name);
      }
      else {
          croak __PACKAGE__
              . '::create_uuid(): Name for v3 UUID is not defined!';
      }
  
      # Use only first 16 Bytes ...
      $uuid = substr( $MD5_CALCULATOR->digest(), 0, 16 ); 
  
      return _set_uuid_version( $uuid, 0x30 );
  }
  
  sub _create_v4_uuid {
      # Create random value in UUID ...
      my $uuid = '';
      for ( 1 .. 4 ) {
          $uuid .= pack 'I', _rand_32bit();
      }
  
      return _set_uuid_version($uuid, 0x40);
  }
  
  sub _create_v5_uuid {
      my $ns_uuid = shift;
      my $name    = shift;
      my $uuid    = '';
  
      if (!$SHA1_CALCULATOR) {
          croak __PACKAGE__
              . '::create_uuid(): No SHA-1 implementation available! '
              . 'Please install Digest::SHA1, Digest::SHA or '
              . 'Digest::SHA::PurePerl to use SHA-1 based UUIDs.'
              ;
      }
  
      $SHA1_CALCULATOR->reset();
      $SHA1_CALCULATOR->add($ns_uuid);
  
      if ( ref($name) =~ m/^(?:GLOB|IO::)/ ) {
          $SHA1_CALCULATOR->addfile($name);
      } elsif ( ref $name ) {
          croak __PACKAGE__
              . '::create_uuid(): Name for v5 UUID'
              . ' has to be SCALAR, GLOB or IO object, not '
              . ref($name) .'!'
              ;
      } elsif ( defined $name ) {
          $SHA1_CALCULATOR->add($name);
      } else {
          croak __PACKAGE__ 
              . '::create_uuid(): Name for v5 UUID is not defined!';
      }
  
      # Use only first 16 Bytes ...
      $uuid = substr( $SHA1_CALCULATOR->digest(), 0, 16 );
  
      return _set_uuid_version($uuid, 0x50);
  }
  
  sub _set_uuid_version {
      my $uuid = shift;
      my $version = shift;
      substr $uuid, 6, 1, chr( ord( substr( $uuid, 6, 1 ) ) & 0x0f | $version );
  
      return $uuid;
  }
  
  
  =item B<create_UUID_as_string()>, B<create_uuid_as_string()> (:std)
  
  Similar to C<create_UUID>, but creates a UUID string.
  
  =cut
  
  sub create_uuid_as_string {
      return uuid_to_string(create_uuid(@_));
  }
  
  *create_UUID_as_string = \&create_uuid_as_string;
  
  
  =item B<is_UUID_string()>, B<is_uuid_string()> (:std)
  
      my $bool = is_UUID_string($str);
  
  =cut
  
  our $IS_UUID_STRING = qr/^[0-9a-f]{8}(?:-[0-9a-f]{4}){3}-[0-9a-f]{12}$/is;
  our $IS_UUID_HEX    = qr/^[0-9a-f]{32}$/is;
  our $IS_UUID_Base64 = qr/^[+\/0-9A-Za-z]{22}(?:==)?$/s;
  
  sub is_uuid_string {
      my $uuid = shift;
      return $uuid =~ m/$IS_UUID_STRING/;
  }
  
  *is_UUID_string = \&is_uuid_string;
  
  
  =item B<UUID_to_string()>, B<uuid_to_string()> (:std)
  
      my $uuid_str = UUID_to_string($uuid);
  
  This function returns C<$uuid> unchanged if it is a UUID string already.
  
  =cut
  
  sub uuid_to_string {
      my $uuid = shift;
      use bytes;
      return $uuid
          if $uuid =~ m/$IS_UUID_STRING/;
      croak __PACKAGE__ . "::uuid_to_string(): Invalid UUID!"
          unless length $uuid == 16;
      return  join '-',
              map { unpack 'H*', $_ }
              map { substr $uuid, 0, $_, '' }
              ( 4, 2, 2, 2, 6 );
  }
  
  *UUID_to_string = \&uuid_to_string;
  
  
  =item B<string_to_UUID()>, B<string_to_uuid()> (:std)
  
      my $uuid = string_to_UUID($uuid_str);
  
  This function returns C<$uuid_str> unchanged if it is a UUID already.
  
  In addition to the standard UUID string representation and its URN forms
  (starting with C<urn:uuid:> or C<uuid:>), this function accepts 32 digit hex
  strings, variants with different positions of C<-> and Base64 encoded UUIDs.
  
  Throws an exception if string can't be interpreted as a UUID.
  
  If you want to make sure to have a "pure" standard UUID representation, check
  with C<is_UUID_string>!
  
  =cut
  
  sub string_to_uuid {
      my $uuid = shift;
  
      use bytes;
      return $uuid if length $uuid == 16;
      return decode_base64($uuid) if ($uuid =~ m/$IS_UUID_Base64/);
      my $str = $uuid;
      $uuid =~ s/^(?:urn:)?(?:uuid:)?//io;
      $uuid =~ tr/-//d;
      return pack 'H*', $uuid if $uuid =~ m/$IS_UUID_HEX/;
      croak __PACKAGE__ . "::string_to_uuid(): '$str' is no UUID string!";
  }
  
  *string_to_UUID = \&string_to_uuid;
  
  
  =item B<version_of_UUID()>, B<version_of_uuid()> (:std)
  
      my $version = version_of_UUID($uuid);
  
  This function accepts binary and string UUIDs.
  
  =cut
  
  sub version_of_uuid {
      my $uuid = shift;
      use bytes;
      $uuid = string_to_uuid($uuid);
      return (ord(substr($uuid, 6, 1)) & 0xf0) >> 4;
  }
  
  *version_of_UUID = \&version_of_uuid;
  
  
  =item B<time_of_UUID()>, B<time_of_uuid()> (:std)
  
      my $uuid_time = time_of_UUID($uuid);
  
  This function accepts UUIDs and UUID strings. Returns the time as a floating
  point value, so use C<int()> to get a C<time()> compatible value.
  
  Returns C<undef> if the UUID is not version 1.
  
  =cut
  
  sub time_of_uuid {
      my $uuid = shift;
      use bytes;
      $uuid = string_to_uuid($uuid);
      return unless version_of_uuid($uuid) == 1;
      
      my $low = unpack 'N', substr($uuid, 0, 4);
      my $mid = unpack 'n', substr($uuid, 4, 2);
      my $high = unpack('n', substr($uuid, 6, 2)) & 0x0fff;
  
      my $hi = $mid | $high << 16;
  
      # MAGIC offset: 01B2-1DD2-13814000
      if ($low >= 0x13814000) {
          $low -= 0x13814000;
      }
      else {
          $low += 0xec7ec000;
          $hi --;
      }
  
      if ($hi >= 0x01b21dd2) {
          $hi -= 0x01b21dd2;
      }
      else {
          $hi += 0x0e4de22e;  # wrap around
      }
  
      $low /= 10000000.0;
      $hi  /= 78125.0 / 512 / 65536;  # / 1000000 * 0x10000000
  
      return $hi + $low;
  }
  
  *time_of_UUID = \&time_of_uuid;
  
  
  =item B<clk_seq_of_UUID()>, B<clk_seq_of_uuid()> (:std)
  
      my $uuid_clk_seq = clk_seq_of_UUID($uuid);
  
  This function accepts UUIDs and UUID strings. Returns the clock sequence for a
  version 1 UUID. Returns C<undef> if UUID is not version 1.
  
  =cut
  
  sub clk_seq_of_uuid {
      use bytes;
      my $uuid = shift;
      $uuid = string_to_uuid($uuid);
      return unless version_of_uuid($uuid) == 1;
  
      my $r = unpack 'n', substr($uuid, 8, 2);
      my $v = $r >> 13;
      my $w = ($v >= 6) ? 3 # 11x
            : ($v >= 4) ? 2 # 10-
            :             1 # 0--
            ;
      $w = 16 - $w;
  
      return $r & ((1 << $w) - 1);
  }
  
  *clk_seq_of_UUID = \&clk_seq_of_uuid;
  
  
  =item B<equal_UUIDs()>, B<equal_uuids()> (:std)
  
      my $bool = equal_UUIDs($uuid1, $uuid2);
  
  Returns true if the provided UUIDs are equal. Accepts UUIDs and UUID strings
  (can be mixed).
  
  =cut
  
  sub equal_uuids {
      my ($u1, $u2) = @_;
      return unless defined $u1 && defined $u2;
      return string_to_uuid($u1) eq string_to_uuid($u2);
  }
  
  *equal_UUIDs = \&equal_uuids;
  
  
  #
  # Private functions ...
  #
  my $Last_Pid;
  my $Clk_Seq :shared;
  
  # There is a problem with $Clk_Seq and rand() on forking a process using
  # UUID::Tiny, because the forked process would use the same basic $Clk_Seq and
  # the same seed (!) for rand(). $Clk_Seq is UUID::Tiny's problem, but with
  # rand() it is Perl's bad behavior. So _init_globals() has to be called every
  # time before using $Clk_Seq or rand() ...
  
  sub _init_globals {
      lock $Clk_Seq;
  
      if (!defined $Last_Pid || $Last_Pid != $$) {
          $Last_Pid = $$;
          # $Clk_Seq = _generate_clk_seq();
          # There's a slight chance to get the same value as $Clk_Seq ...
          for (my $i = 0; $i <= 5; $i++) {
              my $new_clk_seq = _generate_clk_seq();
              if (!defined($Clk_Seq) || $new_clk_seq != $Clk_Seq) {
                  $Clk_Seq = $new_clk_seq;
                  last;
              }
              if ($i == 5) {
                  croak __PACKAGE__
                      . "::_init_globals(): Can't get unique clk_seq!";
              }
          }
          srand();
      }
  
      return;
  }
  
  my $Last_Timestamp :shared;
  
  sub _get_clk_seq {
      my $ts = shift;
      _init_globals();
  
      lock $Last_Timestamp;
      lock $Clk_Seq;
  
      #if (!defined $Last_Timestamp || $ts <= $Last_Timestamp) {
      if (defined $Last_Timestamp && $ts <= $Last_Timestamp) {
          #$Clk_Seq = ($Clk_Seq + 1) % 65536;
          # The old variant used modulo, but this looks unnecessary,
          # because we should only use the significant part of the
          # number, and that also lets the counter circle around:
          $Clk_Seq = ($Clk_Seq + 1) & 0x3fff;
      }
      $Last_Timestamp = $ts;
  
      #return $Clk_Seq & 0x03ff; # no longer needed - and it was wrong too!
      return $Clk_Seq;
  }
  
  sub _generate_clk_seq {
      my $self = shift;
      # _init_globals();
  
      my @data;
      push @data, ''  . $$;
      push @data, ':' . Time::HiRes::time();
  
      # 16 bit digest
      # We should return only the significant part of the number!
      return (unpack 'n', _digest_as_octets(2, @data)) & 0x3fff;
  }
  
  sub _random_node_id {
      my $self = shift;
  
      my $r1 = _rand_32bit();
      my $r2 = _rand_32bit();
  
      my $hi = ($r1 >> 8) ^ ($r2 & 0xff);
      my $lo = ($r2 >> 8) ^ ($r1 & 0xff);
  
      $hi |= 0x80;
  
      my $id  = substr pack('V', $hi), 0, 3;
         $id .= substr pack('V', $lo), 0, 3;
  
      return $id;
  }
  
  sub _rand_32bit {
      _init_globals();
      my $v1 = int(rand(65536)) % 65536;
      my $v2 = int(rand(65536)) % 65536;
      return ($v1 << 16) | $v2;
  }
  
  sub _fold_into_octets {
      use bytes;
      my ($num_octets, $s) = @_;
  
      my $x = "\x0" x $num_octets;
  
      while (length $s > 0) {
          my $n = '';
          while (length $x > 0) {
              my $c = ord(substr $x, -1, 1, '') ^ ord(substr $s, -1, 1, '');
              $n = chr($c) . $n;
              last if length $s <= 0;
          }
          $n = $x . $n;
  
          $x = $n;
      }
  
      return $x;
  }
  
  sub _digest_as_octets {
      my $num_octets = shift;
  
      $MD5_CALCULATOR->reset();
      $MD5_CALCULATOR->add($_) for @_;
  
      return _fold_into_octets($num_octets, $MD5_CALCULATOR->digest);
  }
  
  
  =back
  
  =cut
  
  
  =head1 DISCUSSION
  
  =over
  
  =item B<Why version 1 only with random multi-cast MAC addresses?>
  
  The random multi-cast MAC address gives privacy, and getting the real MAC
  address with Perl is really dirty (and slow);
  
  =item B<Should version 3 or version 5 be used?>
  
  Using SHA-1 reduces the probability of collisions and provides a better
  "randomness" of the resulting UUID compared to MD5. Version 5 is recommended
  in RFC 4122 if backward compatibility is not an issue.
  
  Using MD5 (version 3) has a better performance. This could be important with
  creating UUIDs from file content rather than names.
  
  =back
  
  
  =head1 UUID DEFINITION
  
  See RFC 4122 (L<http://www.ietf.org/rfc/rfc4122.txt>) for technical details on
  UUIDs. Wikipedia gives a more palatable description at
  L<http://en.wikipedia.org/wiki/Universally_unique_identifier>.
  
  
  =head1 AUTHOR
  
  Christian Augustin, C<< <mail at caugustin.de> >>
  
  
  =head1 CONTRIBUTORS
  
  Some of this code is based on UUID::Generator by ITO Nobuaki
  E<lt>banb@cpan.orgE<gt>. But that module is announced to be marked as
  "deprecated" in the future and it is much too complicated for my liking.
  
  So I decided to reduce it to the necessary parts and to re-implement those
  parts with a functional interface ...
  
  Jesse Vincent, C<< <jesse at bestpractical.com> >>, improved version 1.02 with
  his tips and a heavy refactoring.
  
  Michael G. Schwern provided a patch for better thread support (as far as
  UUID::Tiny can be improved itself) that is incorporated in version 1.04. 
  
  
  
  =head1 BUGS
  
  Please report any bugs or feature requests to C<bug-uuid-tiny at rt.cpan.org>,
  or through the web interface at
  L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=UUID-Tiny>.
  I will be notified, and then you'll automatically be notified of progress on
  your bug as I make changes.
  
  
  =head1 SUPPORT
  
  You can find documentation for this module with the perldoc command.
  
      perldoc UUID::Tiny
  
  You can also look for information at:
  
  =over 4
  
  =item * RT: CPAN's request tracker
  
  L<http://rt.cpan.org/NoAuth/Bugs.html?Dist=UUID-Tiny>
  
  =item * AnnoCPAN: Annotated CPAN documentation
  
  L<http://annocpan.org/dist/UUID-Tiny>
  
  =item * CPAN Ratings
  
  L<http://cpanratings.perl.org/d/UUID-Tiny>
  
  =item * Search CPAN
  
  L<http://search.cpan.org/dist/UUID-Tiny/>
  
  =back
  
  
  =head1 ACKNOWLEDGEMENTS
  
  Kudos to ITO Nobuaki E<lt>banb@cpan.orgE<gt> for his UUID::Generator::PurePerl
  module! My work is based on his code, and without it I would've been lost with
  all those incomprehensible RFC texts and C codes ...
  
  Thanks to Jesse Vincent (C<< <jesse at bestpractical.com> >>) for his feedback, tips and refactoring!
  
  
  =head1 COPYRIGHT & LICENSE
  
  Copyright 2009, 2010, 2013 Christian Augustin, all rights reserved.
  
  This program is free software; you can redistribute it and/or modify it
  under the same terms as Perl itself.
  
  ITO Nobuaki has very graciously given me permission to take over copyright for
  the portions of code that are copied from or resemble his work (see
  rt.cpan.org #53642 L<https://rt.cpan.org/Public/Bug/Display.html?id=53642>).
  
  =cut
  
  1; # End of UUID::Tiny
UUID_TINY

    $main::fatpacked{"Versioning/Scheme.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'VERSIONING_SCHEME';
  package Versioning::Scheme;
  
  our $DATE = '2019-04-14'; # DATE
  our $VERSION = '0.010'; # VERSION
  
  1;
  # ABSTRACT: Deal with various versioning schemes
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Versioning::Scheme - Deal with various versioning schemes
  
  =head1 VERSION
  
  This document describes version 0.010 of Versioning::Scheme (from Perl distribution Versioning-Scheme), released on 2019-04-14.
  
  =head1 DESCRIPTION
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Versioning-Scheme>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Versioning-Scheme>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Versioning-Scheme>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2019, 2018 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
VERSIONING_SCHEME

    $main::fatpacked{"Versioning/Scheme/Dotted.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'VERSIONING_SCHEME_DOTTED';
  package Versioning::Scheme::Dotted;
  
  our $DATE = '2019-04-14'; # DATE
  our $VERSION = '0.010'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  use Role::Tiny;
  use Role::Tiny::With;
  with 'Role::Versioning::Scheme';
  
  our $re = qr/\A[0-9]+(?:\.[0-9]+)*\z/;
  
  sub is_valid_version {
      my ($self, $v) = @_;
      $v =~ $re ? 1:0;
  }
  
  sub parse_version {
      my ($self, $v) = @_;
      $v =~ $re or return undef;
      {parts => [split /\./, $v]};
  }
  
  sub normalize_version {
      my ($self, $v, $opts) = @_;
      $opts //= {};
  
      die "Invalid version '$v'" unless $self->is_valid_version($v);
  
      my @parts = split /\./, $v;
      if (defined $opts->{parts}) {
          die "parts must at least be 1" unless $opts->{parts} >= 1;
          if ($opts->{parts} < @parts) {
              splice @parts, $opts->{parts};
          } else {
              $parts[$opts->{parts}-1] //= 0;
          }
      }
      join(".", map { $_ // "0" } @parts);
  }
  
  sub cmp_version {
      my ($self, $v1, $v2) = @_;
  
      die "Invalid version '$v1'" unless $self->is_valid_version($v1);
      die "Invalid version '$v2'" unless $self->is_valid_version($v2);
  
      my @parts1 = split /\./, $v1;
      my @parts2 = split /\./, $v2;
      my $n = @parts1 < @parts2 ? @parts2 : @parts1;
      for my $i (0..$n-1) {
          my $cmp = ($parts1[$i] // 0) <=> ($parts2[$i] // 0);
          return $cmp if $cmp;
      }
      0;
  }
  
  sub bump_version {
      my ($self, $v, $opts) = @_;
      $opts //= {};
      $opts->{num} //= 1;
      $opts->{part} //= -1;
      $opts->{reset_smaller} //= 1;
  
      die "Invalid version '$v'" unless $self->is_valid_version($v);
      die "Invalid 'num', must be non-zero" unless $opts->{num} != 0;
      my @parts = split /\./, $v;
      die "Invalid 'part', must not be smaller than -".@parts
          if $opts->{part} < -@parts;
  
      my $idx = $opts->{part};
      $parts[$idx] //= 0;
      die "Cannot decrease version, would result in a negative part"
          if $parts[$idx] + $opts->{num} < 0;
      $parts[$idx] = sprintf("%0".length($parts[$idx])."d",
                             $parts[$idx]+$opts->{num});
      if ($opts->{reset_smaller} && $opts->{num} > 0) {
          $idx = @parts + $idx if $idx < 0;
          for my $i ($idx+1 .. $#parts) {
              $parts[$i] //= 0;
              $parts[$i] = sprintf("%0".length($parts[$i])."d", 0);
          }
      }
      join(".", map {$_//0} @parts);
  }
  
  1;
  # ABSTRACT: Version as dotted numbers
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Versioning::Scheme::Dotted - Version as dotted numbers
  
  =head1 VERSION
  
  This document describes version 0.010 of Versioning::Scheme::Dotted (from Perl distribution Versioning-Scheme), released on 2019-04-14.
  
  =head1 SYNOPSIS
  
   use Versioning::Scheme::Dotted;
  
   # checking validity
   Versioning::Scheme::Dotted->is_valid_version('0.001.2.0');  # 1
   Versioning::Scheme::Dotted->is_valid_version('v0.001.2.0'); # 0
   Versioning::Scheme::Dotted->is_valid_version('1.2beta');    # 0
  
   # parsing
   $parsed = Versioning::Scheme::Dotted->parse_version('1.2beta'); # => undef
   $parsed = Versioning::Scheme::Dotted->parse_version('1.2.3');   # => {parts=>[1, 2, 3]}
  
   # normalizing
   Versioning::Scheme::Dotted->normalize_version('0.001.2.0');             # => '0.001.2.0'
   Versioning::Scheme::Dotted->normalize_version('0.001.2.0', {parts=>3}); # => '0.001.2'
   Versioning::Scheme::Dotted->normalize_version('0.001.2.0', {parts=>5}); # => '0.001.2.0.0'
  
   # comparing
   Versioning::Scheme::Dotted->cmp_version('1.2.3', '1.2.3.0'); # 0
   Versioning::Scheme::Dotted->cmp_version('1.2.3', '1.2.4');   # -1
   Versioning::Scheme::Dotted->cmp_version('1.3.1', '1.2.4');   # 1
  
   # bumping
   Versioning::Scheme::Dotted->bump_version('1.2.3');                               # => '1.2.4'
   Versioning::Scheme::Dotted->bump_version('1.2.009');                             # => '1.2.010'
   Versioning::Scheme::Dotted->bump_version('1.2.999');                             # => '1.2.1000'
   Versioning::Scheme::Dotted->bump_version('1.2.3', {num=>2});                     # => '1.2.5'
   Versioning::Scheme::Dotted->bump_version('1.2.3', {num=>-1});                    # => '1.2.2'
   Versioning::Scheme::Dotted->bump_version('1.2.3', {part=>-2});                   # => '1.3.0'
   Versioning::Scheme::Dotted->bump_version('1.2.3', {part=>0});                    # => '2.0.0'
   Versioning::Scheme::Dotted->bump_version('1.2.3', {part=>-2, reset_smaller=>0}); # => '1.3.3'
  
  You can also mix this role into your class.
  
  =head1 DESCRIPTION
  
  This is a general scheme where a version is specified as a series of
  one or more non-negative integers separated by dots. Examples:
  
   1
   1.2
   1.100.0394
   3.4.5.6
  
  This scheme is B<not> the same as the Perl versioning scheme implemented by
  L<version>, as the latter has some Perl-specific peculiarities.
  
  Normalizing basically does nothing except checking the validity. But it can
  accept an option C<parts> to specify number of parts.
  
  Comparing: Each part is compared numerically from the biggest (leftmost) part.
  
  Bumping: By default the smallest (rightmost) part is increased by 1. You can
  specify options: C<num>, C<part>, C<reset_smaller> like spacified in
  L<Role::Versioning::Scheme>.
  
  =head1 METHODS
  
  =head2 is_valid_version
  
  =head2 parse_version
  
  =head2 normalize_version
  
  =head2 cmp_version
  
  =head2 bump_version
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Versioning-Scheme>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Versioning-Scheme>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Versioning-Scheme>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<Versioning::Scheme>, L<Role::Versioning::Scheme>
  
  L<Versioning::Scheme::Semantic>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2019, 2018 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
VERSIONING_SCHEME_DOTTED

    $main::fatpacked{"Versioning/Scheme/Monotonic.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'VERSIONING_SCHEME_MONOTONIC';
  package Versioning::Scheme::Monotonic;
  
  our $DATE = '2019-04-14'; # DATE
  our $VERSION = '0.010'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  use Role::Tiny::With;
  with 'Role::Versioning::Scheme';
  
  our $re = qr/
                  \A
                  ([1-9][0-9]*)\.                             # 1=compatibility
                  ([1-9][0-9]*)                               # 2=release
                  (?:\.(0))?                                  # 3=semver_marker
                  (?:\+([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?  # 4=metadata
                  \z
              /x;
  
  sub is_valid_version {
      my ($self, $v) = @_;
      $v =~ $re ? 1:0;
  }
  
  sub parse_version {
      my ($self, $v) = @_;
      return undef unless my ($c, $r, $mark, $meta) = $v =~ $re;
      return {
          compatibility => $1,
          release => $2,
          semver_marker => $3,
          metadata => $4,
      };
  }
  
  sub normalize_version {
      my ($self, $v, $opts) = @_;
      $opts //= {};
  
      die "Invalid version '$v'" unless $v =~ $re;
  
      "$1.$2" . (defined $4 ? ".$4" : "");
  }
  
  sub cmp_version {
      my ($self, $v1, $v2) = @_;
  
      die "Invalid version '$v1'" unless my ($c1, $r1, undef, $m1) = $v1 =~ $re;
      die "Invalid version '$v2'" unless my ($c2, $r2, undef, $m2) = $v2 =~ $re;
  
      ($c1 <=> $c2) || ($r1 <=> $r2) || (($m1||'') cmp ($m2||''));
  }
  
  sub bump_version {
      my ($self, $v, $opts) = @_;
      $opts //= {};
      $opts->{num} //= 1;
      $opts->{part} //= 1;
  
      die "Invalid version '$v'" unless my ($c, $r, $mark, $meta) = $v =~ $re;
      die "Invalid 'num', must be non-zero" unless $opts->{num} != 0;
      die "Invalid 'part', must be 0|1" unless $opts->{part} =~ /\A(0|1)\z/;
  
      if ($opts->{part} == 0) {
          if ($c + $opts->{num} < 1) {
              die "Cannot decrease compatibility that would result in zero/negative number";
          }
          if ($r + ($opts->{num} < 0 ? -1 : 1) < 1) {
              die "Cannot decrease compatibility that would result in zero/negative release number";
          }
          $c = $c + $opts->{num};
          $r = $r + ($opts->{num} < 0 ? -1 : 1);
      } else {
          if ($r + $opts->{num} < 1) {
              die "Cannot decrease release that would result in zero/negative number";
          }
          $r = $r + $opts->{num};
      }
      join(
          "",
          $c, ".", $r,
          (defined $mark ? ".$mark" : ""),
          (defined $meta ? ".$meta" : ""),
      );
  }
  
  1;
  # ABSTRACT: Monotonic versioning
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Versioning::Scheme::Monotonic - Monotonic versioning
  
  =head1 VERSION
  
  This document describes version 0.010 of Versioning::Scheme::Monotonic (from Perl distribution Versioning-Scheme), released on 2019-04-14.
  
  =head1 SYNOPSIS
  
   use Versioning::Scheme::Monotonic;
  
   # checking validity
   Versioning::Scheme::Monotonic->is_valid_version('1.2');   # 1
   Versioning::Scheme::Monotonic->is_valid_version('1.02');  # 0
   Versioning::Scheme::Monotonic->is_valid_version('1.2.0'); # 1
   Versioning::Scheme::Monotonic->is_valid_version('1.2.1'); # 0
   Versioning::Scheme::Monotonic->is_valid_version('1.2+foo.123'); # 1
  
   # parsing
   Versioning::Scheme::Monotonic->parse_version('1.02');        # => undef
   Versioning::Scheme::Monotonic->parse_version('1.2+foo.123'); # {compatibility=>1, release=>2, metadata=>'foo.123'}
  
   # normalizing
   Versioning::Scheme::Monotonic->normalize_version('1.2.0'); # => '1.2'
   Versioning::Scheme::Monotonic->normalize_version('1.2.0+foo.123'); # => '1.2+foo.123'
  
   # comparing
   Versioning::Scheme::Monotonic->cmp_version('1.2', '1.2.0'); # 0
   Versioning::Scheme::Monotonic->cmp_version('1.2', '1.13');  # -1
   Versioning::Scheme::Monotonic->cmp_version('2.2', '1.13');  # 1
   Versioning::Scheme::Monotonic->cmp_version('2.2+alpha', '2.2+beta');  # -1
  
   # bumping
   Versioning::Scheme::Monotonic->bump_version('1.2');            # => '1.3'
   Versioning::Scheme::Monotonic->bump_version('1.2', {num=>2});  # => '1.4'
   Versioning::Scheme::Monotonic->bump_version('1.2', {part=>0}); # => '2.3'
   Versioning::Scheme::Monotonic->bump_version('2.2', {num=>-1, part=>0}); # => '1.1'
  
  You can also mix this role into your class.
  
  =head1 DESCRIPTION
  
  This role implements the monotonic versioning scheme as described in [1]. A
  version number comprises two whole numbers:
  
   COMPATIBILITY.RELEASE
  
  where COMPATIBILITY starts at 0 and RELEASE starts at 1 with no zero prefix. An
  additional ".0" marker is allowed for compatibility with semantic versioning:
  
   COMPATIBILITY.RELEASE.0
  
  And an additional metadata after the RELEASE or ".0" marker in the form of "+"
  followed by a dot-separated series of identifiers. Identifier must comprise only
  of [0-9A-Za-z-] and cannot be empty.
  
  RELEASE is always increased. COMPATIBILITY is increased whenever there's a
  backward-incompatibility introduced.
  
  Normalizing just normalized COMPATIBILITY.RELEASE.0 into COMPATIBILITY.RELEASE.
  
  Comparing is performed using this expression:
  
   (COMPATIBILITY1 <=> COMPATIBILITY2) || (RELEASE1 <=> RELEASE2) || (METADATA1 cmp METADATA2)
  
  Bumping by default increases RELEASE by 1. You can specify option C<num> (e.g.
  2) to bump RELEASE by that number. You can specify option C<part> (e.g. 0) to
  increase COMPATIBILITY instead; but in that case RELEASE will still be bumped by
  1.
  
  =head1 METHODS
  
  =head2 is_valid_version
  
  =head2 parse_version
  
  =head2 normalize_version
  
  =head2 cmp_version
  
  =head2 bump_version
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Versioning-Scheme>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Versioning-Scheme>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Versioning-Scheme>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  [1] L<http://blog.appliedcompscilab.com/monotonic_versioning_manifesto/>
  
  L<Version::Monotonic>, an older incantation of this module.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2019, 2018 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
VERSIONING_SCHEME_MONOTONIC

    $main::fatpacked{"Versioning/Scheme/Perl.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'VERSIONING_SCHEME_PERL';
  package Versioning::Scheme::Perl;
  
  our $DATE = '2019-04-14'; # DATE
  our $VERSION = '0.010'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  use Role::Tiny;
  use Role::Tiny::With;
  with 'Role::Versioning::Scheme';
  use version;
  
  sub is_valid_version {
      my ($self, $v) = @_;
      eval { version->parse($v) };
      $@ ? 0:1;
  }
  
  sub parse_version {
      my ($self, $v) = @_;
  
      my $vp;
      eval { $vp = version->parse($v) };
      return undef if $@;
      $vp =~ s/\Av//;
      {parts => [split /\./, $vp]};
  }
  
  sub normalize_version {
      my ($self, $v) = @_;
      version->parse($v)->normal;
  }
  
  sub cmp_version {
      my ($self, $v1, $v2) = @_;
  
      version->parse($v1) <=> version->parse($v2);
  }
  
  sub bump_version {
      my ($self, $v, $opts) = @_;
      $opts //= {};
      $opts->{num} //= 1;
      $opts->{part} //= -1;
      $opts->{reset_smaller} //= 1;
  
      die "Invalid 'num', must be non-zero" unless $opts->{num} != 0;
  
      if ($opts->{part} eq 'dev') {
          version->parse($v);
          my $dev1;
          if ($v =~ /_([0-9]+)\z/) { $dev1 = $1 } else { $v .= "_000"; $dev1 = "000" }
          my $dev2 = $dev1 + $opts->{num};
          die "Cannot decrease version, would result in a negative dev part"
              if $dev2 < 0;
          $v =~ s/_([0-9]+)\z/sprintf("_%0".length($dev1)."d", $dev2)/e;
          return $v;
      }
  
      my $vn = version->parse($v)->normal; $vn =~ s/\Av//;
      my @parts = split /\./, $vn;
      die "Invalid 'part', must not be smaller than -".@parts
          if $opts->{part} < -@parts;
      die "Invalid 'part', must not be larger than ".$#parts
          if $opts->{part} > $#parts;
  
      my $idx = $opts->{part}; $idx = @parts + $idx if $idx < 0;
      # for now, we do not allow decreasing that overflow to the next more
      # significant part
      die "Cannot decrease version, would result in a negative part"
          if $parts[$idx] + $opts->{num} < 0;
      my $i = $idx;
      my $left = $opts->{num};
      while (1) {
          if ($i == 0 || $parts[$i]+$left < 1000) {
              $parts[$i] += $left;
              $left = 0;
              last;
          } else {
              my $tmp = $parts[$i] + $left;
              $parts[$i] = $tmp % 1000;
              $left = int($tmp / 1000);
              $i--;
              next;
          }
      }
      if ($opts->{reset_smaller} && $opts->{num} > 0) {
          $idx = @parts + $idx if $idx < 0;
          for my $i ($idx+1 .. $#parts) {
              $parts[$i] //= 0;
              $parts[$i] = sprintf("%0".length($parts[$i])."d", 0);
          }
      }
      version->parse(join(".", @parts))->normal;
  }
  
  1;
  # ABSTRACT: Perl (version.pm) version numbering
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Versioning::Scheme::Perl - Perl (version.pm) version numbering
  
  =head1 VERSION
  
  This document describes version 0.010 of Versioning::Scheme::Perl (from Perl distribution Versioning-Scheme), released on 2019-04-14.
  
  =head1 SYNOPSIS
  
   use Versioning::Scheme::Perl;
  
   # checking validity
   Versioning::Scheme::Perl->is_valid_version('1.02');     # 1
   Versioning::Scheme::Perl->is_valid_version('1.0.0');    # 1
   Versioning::Scheme::Perl->is_valid_version('v1.0.0.0'); # 1
   Versioning::Scheme::Perl->is_valid_version('1.2beta');  # 0
  
   # parsing
   $parsed = Versioning::Scheme::Perl->parse_version('1.2beta'); # => undef
   $parsed = Versioning::Scheme::Perl->parse_version('1.2');     # => {parts=>[1, 2]}
  
   # normalizing
   Versioning::Scheme::Perl->normalize_version('0.1.2');             # => 'v0.1.2'
   Versioning::Scheme::Perl->normalize_version('1.02');              # => 'v1.20.0'
  
   # comparing
   Versioning::Scheme::Perl->cmp_version('1.2.3', '1.2.3.0'); # 0
   Versioning::Scheme::Perl->cmp_version('1.2.3', '1.2.4');   # -1
   Versioning::Scheme::Perl->cmp_version('1.3.1', '1.2.4');   # 1
  
   # bumping
   Versioning::Scheme::Perl->bump_version('1.2.3');                               # => 'v1.2.4'
   Versioning::Scheme::Perl->bump_version('1.2.999');                             # => 'v1.3.0'
   Versioning::Scheme::Perl->bump_version('1.2.3', {num=>2});                     # => 'v1.2.5'
   Versioning::Scheme::Perl->bump_version('1.2.3', {num=>-1});                    # => 'v1.2.2'
   Versioning::Scheme::Perl->bump_version('1.2.3', {part=>-2});                   # => 'v1.3.0'
   Versioning::Scheme::Perl->bump_version('1.2.3', {part=>0});                    # => 'v2.0.0'
   Versioning::Scheme::Perl->bump_version('1.2.3', {part=>-2, reset_smaller=>0}); # => 'v1.3.3'
   Versioning::Scheme::Perl->bump_version('1.2.3'    , {part=>'dev'}        ); # => '1.2.3_001
   Versioning::Scheme::Perl->bump_version('1.2.3_001', {part=>'dev', num=>2}); # => '1.2.3_003
  
  You can also mix this role into your class.
  
  =head1 DESCRIPTION
  
  This role is basically a glue between L<Role::Versioning::Scheme> and
  L<version>.pm.
  
  =head1 METHODS
  
  =head2 is_valid_version
  
  Uses L<version>.pm's C<parse()>.
  
  =head2 parse_version
  
  =head2 normalize_version
  
  Equivalent to:
  
   version->parse($v)->normal
  
  =head2 parse_version
  
  =head2 cmp_version
  
  Equivalent to:
  
   version->parse($v1) <=> version->parse($v2)
  
  =head2 bump_version
  
  B<Bumping major/minor/patchlevel part>: Set C<part> to -3, -2, -1 respectively
  (or 0, 1, 2). To do this, C<bump_version> Will first normalize the version
  using:
  
   version->parse($v)->normal
  
  followed by bumping the part. Except for the first (most significant) part, if a
  number is bumped beyond 999 it will overflow to the next more significant part,
  for example: bumping v1.0.999 will result in v1.1.0.
  
  B<Bumping dev part>: Set C<part> to C<dev>. Currently no overflowing is done. To
  do this, first will check version number using:
  
   version->parse($v)
  
  then will check for /_[0-9]+\z/ regex. Then will increment or decrement the dev
  part.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Versioning-Scheme>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Versioning-Scheme>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Versioning-Scheme>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<version>
  
  Other C<Versioning::Scheme::*> modules.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2019, 2018 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
VERSIONING_SCHEME_PERL

    $main::fatpacked{"Versioning/Scheme/Semantic.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'VERSIONING_SCHEME_SEMANTIC';
  package Versioning::Scheme::Semantic;
  
  our $DATE = '2019-04-14'; # DATE
  our $VERSION = '0.010'; # VERSION
  
  use 5.010001;
  use strict;
  use warnings;
  
  use Role::Tiny;
  use Role::Tiny::With;
  with 'Role::Versioning::Scheme';
  
  our $re = qr/
                  \A
                  ([0-9]|[1-9][0-9]*)\.                            # 1=major
                  ([0-9]|[1-9][0-9]*)\.                            # 2=minor
                  ([0-9]|[1-9][0-9]*)                              # 3=major
                  (?:-([0-9]|[1-9][0-9]*|[A-Za-z-][0-9A-Za-z-]*))? # 4=pre-release identifier
                  (?:\+([0-9A-Za-z-]+))?                           # 5=metadata
                  \z
              /x;
  
  sub is_valid_version {
      my ($self, $v) = @_;
      $v =~ $re ? 1:0;
  }
  
  sub parse_version {
      my ($self, $v) = @_;
      $v =~ $re or return undef;
      return {
          major => $1,
          minor => $2,
          patch => $3,
          prerelease => $4,
          metadata => $5,
      };
  }
  
  sub normalize_version {
      my ($self, $v, $opts) = @_;
      $opts //= {};
  
      die "Invalid version '$v'" unless $self->is_valid_version($v);
      $v;
  }
  
  sub cmp_version {
      my ($self, $v1, $v2) = @_;
  
      die "Invalid version '$v1'" unless my ($x1, $y1, $z1, $pre1) = $v1 =~ $re;
      die "Invalid version '$v2'" unless my ($x2, $y2, $z2, $pre2) = $v2 =~ $re;
  
      ($x1 <=> $x2) || ($y1 <=> $y2) || ($z1 <=> $z2) ||
          ((defined($pre1) ? 0:1) <=> (defined($pre2) ? 0:1)) ||
          (($pre1//'') cmp ($pre2//''));
  }
  
  sub bump_version {
      my ($self, $v, $opts) = @_;
      $opts //= {};
      $opts->{num} //= 1;
      $opts->{part} //= -1;
      $opts->{reset_smaller} //= 1;
  
      die "Invalid version '$v'" unless my ($x, $y, $z, $pre, $meta) = $v =~ $re;
      die "Invalid 'num', must be non-zero" unless $opts->{num} != 0;
      my @parts = ($x, $y, $z);
      die "Invalid 'part', must not be larger than ".$#parts
          if $opts->{part} > $#parts;
      die "Invalid 'part', must not be smaller than -".@parts
          if $opts->{part} < -@parts;
  
      my $idx = $opts->{part};
      $parts[$idx] //= 0;
      die "Cannot decrease version, would result in a negative number part"
          if $parts[$idx] + $opts->{num} < 0;
      $parts[$idx] = $parts[$idx]+$opts->{num};
      if ($opts->{reset_smaller} && $opts->{num} > 0) {
          $idx = @parts + $idx if $idx < 0;
          for my $i ($idx+1 .. $#parts) {
              $parts[$i] //= 0;
              $parts[$i] = sprintf("%0".length($parts[$i])."d", 0);
          }
      }
      join("",
           $parts[0], ".", $parts[1], ".", $parts[2],
           (defined $pre ? "-$pre" : ""),
           (defined $meta ? "+$meta" : ""),
       );
  }
  
  1;
  # ABSTRACT: Semantic versioning
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  Versioning::Scheme::Semantic - Semantic versioning
  
  =head1 VERSION
  
  This document describes version 0.010 of Versioning::Scheme::Semantic (from Perl distribution Versioning-Scheme), released on 2019-04-14.
  
  =head1 SYNOPSIS
  
   use Versioning::Scheme::Semantic;
  
   # checking validity
   Versioning::Scheme::Semantic->is_valid_version('0.0.1');    # 1
   Versioning::Scheme::Semantic->is_valid_version('0.01.1');   # 0 (zero prefix not allowed)
   Versioning::Scheme::Semantic->is_valid_version('0.1.1.0');  # 0 (only X.Y.Z permitted)
   Versioning::Scheme::Semantic->is_valid_version('0.1.1-beta1+foobar');  # 1 (pre-release identifier and metada allowed)
  
   # parsing
   $parsed = Versioning::Scheme::Semantic->parse_version('0.1');  # => undef
   $parsed = Versioning::Scheme::Semantic->parse_version('0.1.2-beta1+foobar');  # => {major=>0, minor=>1, patch=>2, prerelease=>'beta1', metadata=>'foobar'}
  
   # normalizing (currently does nothing other than checking for validity)
   Versioning::Scheme::Semantic->normalize_version('1.2.0'); # => '1.2.0'
  
   # comparing
   Versioning::Scheme::Semantic->cmp_version('1.2.3', '1.2.3');  # 0
   Versioning::Scheme::Semantic->cmp_version('1.2.3', '1.2.12'); # -1
   Versioning::Scheme::Semantic->cmp_version('1.3.0', '1.2.12'); # 1
   Versioning::Scheme::Semantic->cmp_version('1.2.3', '1.2.3-beta1'); # -1
   Versioning::Scheme::Semantic->cmp_version('1.2.3-beta1', '1.2.3-beta1'); # 0
   Versioning::Scheme::Semantic->cmp_version('1.2.3-beta1', '1.2.3-beta2'); # -1
  
   # bumping
   Versioning::Scheme::Semantic->bump_version('1.2.3');                               # => '1.2.4'
   Versioning::Scheme::Semantic->bump_version('1.2.3', {num=>2});                     # => '1.2.5'
   Versioning::Scheme::Semantic->bump_version('1.2.3', {num=>-1});                    # => '1.2.2'
   Versioning::Scheme::Semantic->bump_version('1.2.3', {part=>-2});                   # => '1.3.0'
   Versioning::Scheme::Semantic->bump_version('1.2.3', {part=>0});                    # => '2.0.0'
   Versioning::Scheme::Semantic->bump_version('1.2.3', {part=>-2, reset_smaller=>0}); # => '1.3.3'
  
  You can also mix this role into your class.
  
  =head1 DESCRIPTION
  
  This role implements the semantic versioning scheme as described in [1]. Version
  number comprises of three non-negative integers X.Y.Z where zero-prefix is not
  allowed.
  
  This scheme is B<not> the same as the Perl versioning scheme implemented by
  L<version>, as the latter has some Perl-specific peculiarities.
  
  Normalizing basically does nothing except checking the validity.
  
  Comparing: Each part is compared numerically from the biggest (leftmost) part.
  
  Bumping: By default the smallest (rightmost) part is increased by 1. You can
  specify options: C<num>, C<part>, C<reset_smaller> like spacified in
  L<Role::Versioning::Scheme>.
  
  =head1 METHODS
  
  =head2 is_valid_version
  
  =head2 parse_version
  
  =head2 normalize_version
  
  =head2 cmp_version
  
  =head2 bump_version
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/Versioning-Scheme>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-Versioning-Scheme>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Versioning-Scheme>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  [1] L<https://semver.org/>
  
  L<Versioning::Scheme::Dotted>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2019, 2018 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
VERSIONING_SCHEME_SEMANTIC

    $main::fatpacked{"WWW/Mechanize.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'WWW_MECHANIZE';
  package WWW::Mechanize;
  
  #ABSTRACT: Handy web browsing in a Perl object
  
  
  use strict;
  use warnings;
  
  our $VERSION = '1.91';
  
  use Tie::RefHash;
  use HTTP::Request 1.30;
  use LWP::UserAgent 5.827;
  use HTML::Form 1.00;
  use HTML::TokeParser;
  use Scalar::Util qw(tainted);
  
  use base 'LWP::UserAgent';
  
  our $HAS_ZLIB;
  BEGIN {
      $HAS_ZLIB = eval 'use Compress::Zlib (); 1;';
  }
  
  
  sub new {
      my $class = shift;
  
      my %parent_parms = (
          agent       => "WWW-Mechanize/$VERSION",
          cookie_jar  => {},
      );
  
      my %mech_parms = (
          autocheck     => ($class eq 'WWW::Mechanize' ? 1 : 0),
          onwarn        => \&WWW::Mechanize::_warn,
          onerror       => \&WWW::Mechanize::_die,
          quiet         => 0,
          stack_depth   => 8675309,     # Arbitrarily humongous stack
          headers       => {},
          noproxy       => 0,
          strict_forms  => 0,           # pass-through to HTML::Form
          verbose_forms => 0,           # pass-through to HTML::Form
      );
  
      my %passed_parms = @_;
  
      # Keep the mech-specific parms before creating the object.
      while ( my($key,$value) = each %passed_parms ) {
          if ( exists $mech_parms{$key} ) {
              $mech_parms{$key} = $value;
          }
          else {
              $parent_parms{$key} = $value;
          }
      }
  
      my $self = $class->SUPER::new( %parent_parms );
      bless $self, $class;
  
      # Use the mech parms now that we have a mech object.
      for my $parm ( keys %mech_parms ) {
          $self->{$parm} = $mech_parms{$parm};
      }
      $self->{page_stack} = [];
      $self->env_proxy() unless $mech_parms{noproxy};
  
      # libwww-perl 5.800 (and before, I assume) has a problem where
      # $ua->{proxy} can be undef and clone() doesn't handle it.
      $self->{proxy} = {} unless defined $self->{proxy};
      push( @{$self->requests_redirectable}, 'POST' );
  
      $self->_reset_page();
  
      return $self;
  }
  
  # overriding LWP::UA's static method
  sub _agent { "WWW-Mechanize/$VERSION" }
  
  
  my %known_agents = (
      'Windows IE 6'      => 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)',
      'Windows Mozilla'   => 'Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.4b) Gecko/20030516 Mozilla Firebird/0.6',
      'Mac Safari'        => 'Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/85 (KHTML, like Gecko) Safari/85',
      'Mac Mozilla'       => 'Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.4a) Gecko/20030401',
      'Linux Mozilla'     => 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4) Gecko/20030624',
      'Linux Konqueror'   => 'Mozilla/5.0 (compatible; Konqueror/3; Linux)',
  );
  
  sub agent_alias {
      my $self = shift;
      my $alias = shift;
  
      if ( defined $known_agents{$alias} ) {
          return $self->agent( $known_agents{$alias} );
      }
      else {
          $self->warn( qq{Unknown agent alias "$alias"} );
          return $self->agent();
      }
  }
  
  
  sub known_agent_aliases {
      return sort keys %known_agents;
  }
  
  
  sub get {
      my $self = shift;
      my $uri = shift;
  
      $uri = $uri->url if ref($uri) eq 'WWW::Mechanize::Link';
  
      $uri = $self->base
              ? URI->new_abs( $uri, $self->base )
              : URI->new( $uri );
  
      # It appears we are returning a super-class method,
      # but it in turn calls the request() method here in Mechanize
      return $self->SUPER::get( $uri->as_string, @_ );
  }
  
  
  sub post {
      my $self = shift;
      my $uri = shift;
  
      $uri = $uri->url if ref($uri) eq 'WWW::Mechanize::Link';
  
      $uri = $self->base
              ? URI->new_abs( $uri, $self->base )
              : URI->new( $uri );
  
      # It appears we are returning a super-class method,
      # but it in turn calls the request() method here in Mechanize
      return $self->SUPER::post( $uri->as_string, @_ );
  }
  
  
  sub put {
      my $self = shift;
      my $uri = shift;
  
      $uri = $uri->url if ref($uri) eq 'WWW::Mechanize::Link';
  
      $uri = $self->base
              ? URI->new_abs( $uri, $self->base )
              : URI->new( $uri );
  
      # It appears we are returning a super-class method,
      # but it in turn calls the request() method here in Mechanize
      return $self->_SUPER_put( $uri->as_string, @_ );
  }
  
  
  # Added until LWP::UserAgent has it.
  sub _SUPER_put {
      require HTTP::Request::Common;
      my($self, @parameters) = @_;
      my @suff = $self->_process_colonic_headers(\@parameters,1);
      return $self->request( HTTP::Request::Common::PUT( @parameters ), @suff );
  }
  
  
  sub reload {
      my $self = shift;
  
      return unless my $req = $self->{req};
  
      # LWP::UserAgent sets up a request_prepare handler that calls
      # $self->cookie_jar->add_cookie_header($req)
      #
      # HTTP::Cookies::add_cookie_header always preserves existing
      # cookies in a request object
      #
      # we pass an existing request to _make_request
      #
      # result: cookies will get repeated every time someone calls
      # ->reload, sooner or later leading to a "request too big" from
      # the server
      #
      # until https://rt.cpan.org/Public/Bug/Display.html?id=75897 is
      # fixed, let's clear the cookies from the existing request
      $req->remove_header('Cookie');
  
      return $self->_update_page( $req, $self->_make_request( $req, @_ ) );
  }
  
  
  sub back {
      my $self = shift;
  
      my $stack = $self->{page_stack};
      return unless $stack && @{$stack};
  
      my $popped = pop @{$self->{page_stack}};
      my $req    = $popped->{req};
      my $res    = $popped->{res};
  
      $self->_update_page( $req, $res );
  
      return 1;
  }
  
  
  sub clear_history {
      my $self = shift;
  
      delete $self->{page_stack};
  
      return 1;
  }
  
  
  sub history_count {
      my $self = shift;
  
      # If we don't have a "current" page, we certainly don't have any previous
      # ones.
      return 0 unless $self->{req} && $self->{res};
  
      my $stack = $self->{page_stack};
  
      return 1 unless $stack;
  
      return 1 + @$stack;
  }
  
  
  sub history {
      my $self = shift;
      my $n    = shift;
  
      return undef unless $self->{req} && $self->{res};
  
      if ($n == 0) {
        return { req => $self->{req}, res => $self->{res} };
      }
  
      my $stack = $self->{page_stack};
      return undef unless $stack && @$stack >= $n;
  
      return { req => $stack->[-$n]{req}, res => $stack->[-$n]{res} };
  }
  
  
  sub success {
      my $self = shift;
  
      return $self->res && $self->res->is_success;
  }
  
  
  
  sub uri {
      my $self = shift;
      return $self->response ? $self->response->request->uri : undef;
  }
  
  sub res {           my $self = shift; return $self->{res}; }
  sub response {      my $self = shift; return $self->{res}; }
  sub status {        my $self = shift; return $self->{status}; }
  sub ct {            my $self = shift; return $self->{ct}; }
  sub content_type {  my $self = shift; return $self->{ct}; }
  sub base {          my $self = shift; return $self->{base}; }
  sub is_html {
      my $self = shift;
      return defined $self->ct &&
          ($self->ct eq 'text/html' || $self->ct eq 'application/xhtml+xml');
  }
  
  
  sub title {
      my $self = shift;
  
      return unless $self->is_html;
  
      if ( not defined $self->{title} ) {
          require HTML::HeadParser;
          my $p = HTML::HeadParser->new;
          $p->parse($self->content);
          $self->{title} = $p->header('Title');
      }
      return $self->{title};
  }
  
  
  sub content {
      my $self = shift;
      my %parms = @_;
  
      my $content = $self->{content};
      if (delete $parms{raw}) {
          $content = $self->response()->content();
      }
      elsif (delete $parms{decoded_by_headers}) {
          $content = $self->response()->decoded_content(charset => 'none');
      }
      elsif (my $charset = delete $parms{charset}) {
          $content = $self->response()->decoded_content(charset => $charset);
      }
      elsif ( $self->is_html ) {
          if ( exists $parms{base_href} ) {
              my $base_href = (delete $parms{base_href}) || $self->base;
              $content=~s/<head>/<head>\n<base href="$base_href">/i;
          }
  
          if ( my $format = delete $parms{format} ) {
              if ( $format eq 'text' ) {
                  $content = $self->text;
              }
              else {
                  $self->die( qq{Unknown "format" parameter "$format"} );
              }
          }
  
          $self->_check_unhandled_parms( %parms );
      }
  
      return $content;
  }
  
  
  sub text {
      my $self = shift;
  
      if ( not defined $self->{text} ) {
          unless ( exists $INC{'HTML::TreeBuilder'} ) {
              require HTML::TreeBuilder;
              HTML::TreeBuilder->VERSION(5);
              HTML::TreeBuilder->import('-weak');
          }
          my $tree = HTML::TreeBuilder->new();
          $tree->parse( $self->content );
          $tree->eof();
          $tree->elementify(); # just for safety
          $self->{text} = $tree->as_text();
      }
  
      return $self->{text};
  }
  
  sub _check_unhandled_parms {
      my $self  = shift;
      my %parms = @_;
  
      for my $cmd ( sort keys %parms ) {
          $self->die( qq{Unknown named argument "$cmd"} );
      }
  }
  
  
  sub links {
      my $self = shift;
  
      $self->_extract_links() unless $self->{links};
  
      return @{$self->{links}} if wantarray;
      return $self->{links};
  }
  
  
  sub follow_link {
      my $self = shift;
      $self->die( qq{Needs to get key-value pairs of parameters.} ) if @_ % 2;
      my %parms = ( n=>1, @_ );
  
      if ( $parms{n} eq 'all' ) {
          delete $parms{n};
          $self->warn( q{follow_link(n=>"all") is not valid} );
      }
  
      my $link = $self->find_link(%parms);
      if ( $link ) {
          return $self->get( $link->url );
      }
  
      if ( $self->{autocheck} ) {
          $self->die( 'Link not found' );
      }
  
      return;
  }
  
  
  sub find_link {
      my $self = shift;
      my %parms = ( n=>1, @_ );
  
      my $wantall = ( $parms{n} eq 'all' );
  
      $self->_clean_keys( \%parms, qr/^(n|(text|url|url_abs|name|tag|id|class)(_regex)?)$/ );
  
      my @links = $self->links or return;
  
      my $nmatches = 0;
      my @matches;
      for my $link ( @links ) {
          if ( _match_any_link_parms($link,\%parms) ) {
              if ( $wantall ) {
                  push( @matches, $link );
              }
              else {
                  ++$nmatches;
                  return $link if $nmatches >= $parms{n};
              }
          }
      } # for @links
  
      if ( $wantall ) {
          return @matches if wantarray;
          return \@matches;
      }
  
      return;
  } # find_link
  
  # Used by find_links to check for matches
  # The logic is such that ALL parm criteria that are given must match
  sub _match_any_link_parms {
      my $link = shift;
      my $p = shift;
  
      # No conditions, anything matches
      return 1 unless keys %$p;
  
      return if defined $p->{url}           && !($link->url eq $p->{url} );
      return if defined $p->{url_regex}     && !($link->url =~ $p->{url_regex} );
      return if defined $p->{url_abs}       && !($link->url_abs eq $p->{url_abs} );
      return if defined $p->{url_abs_regex} && !($link->url_abs =~ $p->{url_abs_regex} );
      return if defined $p->{text}          && !(defined($link->text) && $link->text eq $p->{text} );
      return if defined $p->{text_regex}    && !(defined($link->text) && $link->text =~ $p->{text_regex} );
      return if defined $p->{name}          && !(defined($link->name) && $link->name eq $p->{name} );
      return if defined $p->{name_regex}    && !(defined($link->name) && $link->name =~ $p->{name_regex} );
      return if defined $p->{tag}           && !($link->tag && $link->tag eq $p->{tag} );
      return if defined $p->{tag_regex}     && !($link->tag && $link->tag =~ $p->{tag_regex} );
  
      return if defined $p->{id}            && !($link->attrs->{id} && $link->attrs->{id} eq $p->{id} );
      return if defined $p->{id_regex}      && !($link->attrs->{id} && $link->attrs->{id} =~ $p->{id_regex} );
      return if defined $p->{class}         && !($link->attrs->{class} && $link->attrs->{class} eq $p->{class} );
      return if defined $p->{class_regex}   && !($link->attrs->{class} && $link->attrs->{class} =~ $p->{class_regex} );
  
      # Success: everything that was defined passed.
      return 1;
  
  }
  
  # Cleans the %parms parameter for the find_link and find_image methods.
  sub _clean_keys {
      my $self = shift;
      my $parms = shift;
      my $rx_keyname = shift;
  
      for my $key ( keys %$parms ) {
          my $val = $parms->{$key};
          if ( $key !~ qr/$rx_keyname/ ) {
              $self->warn( qq{Unknown link-finding parameter "$key"} );
              delete $parms->{$key};
              next;
          }
  
          my $key_regex = ( $key =~ /_regex$/ );
          my $val_regex = ( ref($val) eq 'Regexp' );
  
          if ( $key_regex ) {
              if ( !$val_regex ) {
                  $self->warn( qq{$val passed as $key is not a regex} );
                  delete $parms->{$key};
                  next;
              }
          }
          else {
              if ( $val_regex ) {
                  $self->warn( qq{$val passed as '$key' is a regex} );
                  delete $parms->{$key};
                  next;
              }
              if ( $val =~ /^\s|\s$/ ) {
                  $self->warn( qq{'$val' is space-padded and cannot succeed} );
                  delete $parms->{$key};
                  next;
              }
          }
      } # for keys %parms
  
      return;
  } # _clean_keys()
  
  
  
  sub find_all_links {
      my $self = shift;
      return $self->find_link( @_, n=>'all' );
  }
  
  
  sub find_all_inputs {
      my $self = shift;
      my %criteria = @_;
  
      my $form = $self->current_form() or return;
  
      my @found;
      foreach my $input ( $form->inputs ) { # check every pattern for a match on the current hash
          my $matched = 1;
          foreach my $criterion ( sort keys %criteria ) { # Sort so we're deterministic
              my $field = $criterion;
              my $is_regex = ( $field =~ s/(?:_regex)$// );
              my $what = $input->{$field};
              $matched = defined($what) && (
                  $is_regex
                      ? ( $what =~ $criteria{$criterion} )
                      : ( $what eq $criteria{$criterion} )
                  );
              last if !$matched;
          }
          push @found, $input if $matched;
      }
      return @found;
  }
  
  
  sub find_all_submits {
      my $self = shift;
  
      return $self->find_all_inputs( @_, type_regex => qr/^(submit|image)$/ );
  }
  
  
  
  sub images {
      my $self = shift;
  
      $self->_extract_images() unless $self->{images};
  
      return @{$self->{images}} if wantarray;
      return $self->{images};
  }
  
  
  sub find_image {
      my $self = shift;
      my %parms = ( n=>1, @_ );
  
      my $wantall = ( $parms{n} eq 'all' );
  
      $self->_clean_keys( \%parms, qr/^(?:n|(?:alt|url|url_abs|tag|id|class)(?:_regex)?)$/ );
  
      my @images = $self->images or return;
  
      my $nmatches = 0;
      my @matches;
      for my $image ( @images ) {
          if ( _match_any_image_parms($image,\%parms) ) {
              if ( $wantall ) {
                  push( @matches, $image );
              }
              else {
                  ++$nmatches;
                  return $image if $nmatches >= $parms{n};
              }
          }
      } # for @images
  
      if ( $wantall ) {
          return @matches if wantarray;
          return \@matches;
      }
  
      return;
  }
  
  # Used by find_images to check for matches
  # The logic is such that ALL parm criteria that are given must match
  sub _match_any_image_parms {
      my $image = shift;
      my $p = shift;
  
      # No conditions, anything matches
      return 1 unless keys %$p;
  
      return if defined $p->{url}           && !($image->url eq $p->{url} );
      return if defined $p->{url_regex}     && !($image->url =~ $p->{url_regex} );
      return if defined $p->{url_abs}       && !($image->url_abs eq $p->{url_abs} );
      return if defined $p->{url_abs_regex} && !($image->url_abs =~ $p->{url_abs_regex} );
      return if defined $p->{alt}           && !(defined($image->alt) && $image->alt eq $p->{alt} );
      return if defined $p->{alt_regex}     && !(defined($image->alt) && $image->alt =~ $p->{alt_regex} );
      return if defined $p->{tag}           && !($image->tag && $image->tag eq $p->{tag} );
      return if defined $p->{tag_regex}     && !($image->tag && $image->tag =~ $p->{tag_regex} );
      return if defined $p->{id}            && !($image->attrs && $image->attrs->{id} && $image->attrs->{id} eq $p->{id} );
      return if defined $p->{id_regex}      && !($image->attrs && $image->attrs->{id} && $image->attrs->{id} =~ $p->{id_regex} );
      return if defined $p->{class}         && !($image->attrs && $image->attrs->{class} && $image->attrs->{class} eq $p->{class} );
      return if defined $p->{class_regex}   && !($image->attrs && $image->attrs->{class} && $image->attrs->{class} =~ $p->{class_regex} );
  
      # Success: everything that was defined passed.
      return 1;
  }
  
  
  
  sub find_all_images {
      my $self = shift;
      return $self->find_image( @_, n=>'all' );
  }
  
  
  sub forms {
      my $self = shift;
  
      $self->_extract_forms() unless $self->{forms};
  
      return @{$self->{forms}} if wantarray;
      return $self->{forms};
  }
  
  sub current_form {
      my $self = shift;
  
      if ( !$self->{current_form} ) {
          $self->form_number(1);
      }
  
      return $self->{current_form};
  }
  
  
  sub form_number {
      my ($self, $form) = @_;
      # XXX Should we die if no $form is defined? Same question for form_name()
  
      my $forms = $self->forms;
      if ( $forms->[$form-1] ) {
          $self->{current_form} = $forms->[$form-1];
          return wantarray
            ? ($self->{current_form}, $form)
            : $self->{current_form};
      }
  
      return wantarray ? () : undef;
  }
  
  
  sub form_name {
      my ($self, $form) = @_;
      return $self->form_with( name => $form );
  }
  
  
  sub form_id {
      my ($self, $formid) = @_;
      defined( my $form = $self->form_with( id => $formid ) )
        or $self->warn(qq{ There is no form with ID "$formid"});
      return $form;
  }
  
  
  
  sub all_forms_with_fields {
      my ($self, @fields) = @_;
      die 'no fields provided' unless scalar @fields;
  
      my @matches;
      FORMS: for my $form (@{ $self->forms }) {
          my @fields_in_form = $form->param();
          for my $field (@fields) {
              next FORMS unless grep { $_ eq $field } @fields_in_form;
          }
          push @matches, $form;
      }
      return @matches;
  }
  
  
  
  sub form_with_fields {
      my ($self, @fields) = @_;
      die 'no fields provided' unless scalar @fields;
  
      my @matches = $self->all_forms_with_fields(@fields);
      my $nmatches = @matches;
      if ( $nmatches > 0 ) {
          if ( $nmatches > 1 ) {
              $self->warn( "There are $nmatches forms with the named fields.  The first one was used." )
          }
          return $self->{current_form} = $matches[0];
      }
      else {
          $self->warn( qq{There is no form with the requested fields} );
          return undef;
      }
  }
  
  
  
  sub all_forms_with {
      my ( $self, %spec ) = @_;
  
      my @forms = $self->forms;
      foreach my $attr ( keys %spec ) {
          @forms = grep _equal( $spec{$attr}, $_->attr($attr) ), @forms or return;
      }
      return @forms;
  }
  
  
  sub form_with {
      my ( $self, %spec ) = @_;
  
      return if not $self->forms;
      my @forms = $self->all_forms_with(%spec);
      if ( @forms > 1 ) {    # Warn if several forms matched.
          # For ->form_with( method => 'POST', action => '', id => undef ) we get:
          # >>There are 2 forms with empty action and no id and method "POST".
          # The first one was used.<<
  
          $self->warn(
              'There are ' . @forms . ' forms ' . (
                  keys %spec    # explain search criteria if there were any
                  ? 'with ' . join(
                      ' and ',    # "with ... and ... and ..."
                      map {
                          unless ( defined $spec{$_} ) {    # case $attr => undef
                              qq{no $_};
                          }
                          elsif ( $spec{$_} eq '' ) {       # case $attr=> ''
                              qq{empty $_};
                          }
                          else {                            # case $attr => $value
                              qq{$_ "$spec{$_}"};
                          }
                        }                # case $attr => undef
                        sort keys %spec  # sort keys to get deterministic messages
                    )
                  : ''
                )
                . '.  The first one was used.'
          );
      }
  
      return $self->{current_form} = $forms[0];
  }
  
  # NOT an object method!
  # Expects two values and returns true only when either
  # both are defined and eq(ual) or when both are not defined.
  sub _equal {
      my ( $x, $y ) = @_;
      defined $x ? defined $y && $x eq $y : !defined $y;
  }
  
  
  
  sub field {
      my ($self, $name, $value, $number) = @_;
      $number ||= 1;
  
      my $form = $self->current_form();
      if ($number > 1) {
          $form->find_input($name, undef, $number)->value($value);
      }
      else {
          if ( ref($value) eq 'ARRAY' ) {
              $form->param($name, $value);
          }
          else {
              $form->value($name => $value);
          }
      }
  }
  
  
  sub select {
      my ($self, $name, $value) = @_;
  
      my $form = $self->current_form();
  
      my $input = $form->find_input($name);
      if (!$input) {
          $self->warn( qq{Input "$name" not found} );
          return;
      }
  
      if ($input->type ne 'option') {
          $self->warn( qq{Input "$name" is not type "select"} );
          return;
      }
  
      # For $mech->select($name, {n => 3}) or $mech->select($name, {n => [2,4]}),
      # transform the 'n' number(s) into value(s) and put it in $value.
      if (ref($value) eq 'HASH') {
          for (keys %$value) {
              $self->warn(qq{Unknown select value parameter "$_"})
                unless $_ eq 'n';
          }
  
          if (defined($value->{n})) {
              my @inputs = $form->find_input($name, 'option');
              my @values = ();
              # distinguish between multiple and non-multiple selects
              # (see INPUTS section of `perldoc HTML::Form`)
              if (@inputs == 1) {
                  @values = $inputs[0]->possible_values();
              }
              else {
                  foreach my $input (@inputs) {
                      my @possible = $input->possible_values();
                      push @values, pop @possible;
                  }
              }
  
              my $n = $value->{n};
              if (ref($n) eq 'ARRAY') {
                  $value = [];
                  for (@$n) {
                      unless (/^\d+$/) {
                          $self->warn(qq{"n" value "$_" is not a positive integer});
                          return;
                      }
                      push @$value, $values[$_ - 1];  # might be undef
                  }
              }
              elsif (!ref($n) && $n =~ /^\d+$/) {
                  $value = $values[$n - 1];           # might be undef
              }
              else {
                  $self->warn('"n" value is not a positive integer or an array ref');
                  return;
              }
          }
          else {
              $self->warn('Hash value is invalid');
              return;
          }
      } # hashref
  
      if (ref($value) eq 'ARRAY') {
          $form->param($name, $value);
          return 1;
      }
  
      $form->value($name => $value);
      return 1;
  }
  
  
  sub set_fields {
      my $self = shift;
      my %fields = @_;
  
      my $form = $self->current_form or $self->die( 'No form defined' );
  
      while ( my ( $field, $value ) = each %fields ) {
          if ( ref $value eq 'ARRAY' ) {
              $form->find_input( $field, undef,
                           $value->[1])->value($value->[0] );
          }
          else {
              $form->value($field => $value);
          }
      } # while
  } # set_fields()
  
  
  sub set_visible {
      my $self = shift;
  
      my $form = $self->current_form;
      my @inputs = $form->inputs;
  
      my $num_set = 0;
      for my $value ( @_ ) {
          # Handle type/value pairs an arrayref
          if ( ref $value eq 'ARRAY' ) {
              my ( $type, $value ) = @$value;
              while ( my $input = shift @inputs ) {
                  next if $input->type eq 'hidden';
                  if ( $input->type eq $type ) {
                      $input->value( $value );
                      $num_set++;
                      last;
                  }
              } # while
          }
          # by default, it's a value
          else {
              while ( my $input = shift @inputs ) {
                  next if $input->type eq 'hidden';
                  $input->value( $value );
                  $num_set++;
                  last;
              } # while
          }
      } # for
  
      return $num_set;
  } # set_visible()
  
  
  sub tick {
      my $self = shift;
      my $name = shift;
      my $value = shift;
      my $set = @_ ? shift : 1;  # default to 1 if not passed
  
      # loop though all the inputs
      my $index = 0;
      while ( my $input = $self->current_form->find_input( $name, 'checkbox', $index ) ) {
          # Can't guarantee that the first element will be undef and the second
          # element will be the right name
          foreach my $val ($input->possible_values()) {
              next unless defined $val;
              if ($val eq $value) {
                  $input->value($set ? $value : undef);
                  return;
              }
          }
  
          # move onto the next input
          $index++;
      } # while
  
      # got this far?  Didn't find anything
      $self->die( qq{No checkbox "$name" for value "$value" in form} );
  } # tick()
  
  
  sub untick {
      shift->tick(shift,shift,undef);
  }
  
  
  sub value {
      my $self = shift;
      my $name = shift;
      my $number = shift || 1;
  
      my $form = $self->current_form;
      if ( $number > 1 ) {
          return $form->find_input( $name, undef, $number )->value();
      }
      else {
          return $form->value( $name );
      }
  } # value
  
  
  sub click {
      my ($self, $button, $x, $y) = @_;
      for ($x, $y) { $_ = 1 unless defined; }
      my $request = $self->current_form->click($button, $x, $y);
      return $self->request( $request );
  }
  
  
  sub click_button {
      my $self = shift;
      my %args = @_;
  
      for ( keys %args ) {
          if ( !/^(number|name|value|id|input|x|y)$/ ) {
              $self->warn( qq{Unknown click_button parameter "$_"} );
          }
      }
  
      for ($args{x}, $args{y}) {
          $_ = 1 unless defined;
      }
  
      my $form = $self->current_form or $self->die( 'click_button: No form has been selected' );
  
      my $request;
      if ( $args{name} ) {
          $request = $form->click( $args{name}, $args{x}, $args{y} );
      }
      # 0 is a valid id in HTML5
      elsif ( defined $args{id} ) {
          # HTML::Form expects ids to be prefixed with '#'
          my $input = $form->find_input('#' . $args{id});
          $request = $input->click( $form, $args{x}, $args{y} );
      }
      elsif ( $args{number} ) {
          my $input = $form->find_input( undef, 'submit', $args{number} );
          $request = $input->click( $form, $args{x}, $args{y} );
      }
      elsif ( $args{input} ) {
          $request = $args{input}->click( $form, $args{x}, $args{y} );
      }
      elsif ( $args{value} ) {
          my $i = 1;
          while ( my $input = $form->find_input(undef, 'submit', $i) ) {
              if ( $args{value} && ($args{value} eq $input->value) ) {
                  $request = $input->click( $form, $args{x}, $args{y} );
                  last;
              }
              $i++;
          } # while
      } # $args{value}
  
      return $self->request( $request );
  }
  
  
  sub submit {
      my $self = shift;
  
      my $request = $self->current_form->make_request;
      return $self->request( $request );
  }
  
  
  sub submit_form {
      my( $self, %args ) = @_;
  
      for ( keys %args ) {
          if ( !/^(form_(number|name|fields|id)|(with_)?fields|button|x|y|strict_forms)$/ ) {
              # XXX Why not die here?
              $self->warn( qq{Unknown submit_form parameter "$_"} );
          }
      }
  
      my $fields;
      for (qw/with_fields fields/) {
          if ($args{$_}) {
              if ( ref $args{$_} eq 'HASH' ) {
                  $fields = $args{$_};
              }
              else {
                  die "$_ arg to submit_form must be a hashref";
              }
              last;
          }
      }
  
      my @filtered_sets;
      if ( $args{with_fields} ) {
          $fields || die q{must submit some 'fields' with with_fields};
          my @got = $self->all_forms_with_fields(keys %{$fields});
          die "There is no form with the requested fields" if not @got;
          push @filtered_sets, \@got;
      }
      if ( my $form_number = $args{form_number} ) {
          my $got = $self->form_number( $form_number );
          die "There is no form numbered $form_number" if not $got;
          push @filtered_sets, [ $got ];
      }
      if ( my $form_name = $args{form_name} ) {
          my @got = $self->all_forms_with( name => $form_name );
          die qq{There is no form named "$form_name"} if not @got;
          push @filtered_sets, \@got;
      }
      if ( my $form_id = $args{form_id} ) {
          my @got = $self->all_forms_with( id => $form_id );
          $self->warn(qq{ There is no form with ID "$form_id"}) if not @got;
          push @filtered_sets, \@got;
      }
  
      if (not @filtered_sets) {
          # No form selector was used.
          # Maybe a form was set separately, or we'll default to the first form.
      }
      else {
          # Need to intersect to apply all the various filters.
          # Assume that each filtered set only has a given form object once.
          # So we can count occurrences.
          #
          tie my %c, 'Tie::RefHash' or die;
          foreach (@filtered_sets) {
              foreach (@$_) {
                  ++$c{$_};
              }
          }
          my $expected_count = scalar @filtered_sets;
          my @matched = grep { $c{$_} == $expected_count } keys %c;
          if (not @matched) {
              die "There is no form that satisfies all the criteria";
          }
          if (@matched > 1) {
              die "More than one form satisfies all the criteria";
          }
          $self->{current_form} = $matched[0];
      }
  
      if (defined($args{strict_forms})) {
          # Strict argument has been passed, set the flag as appropriate
          # this must be done prior to attempting to set the fields
          $self->current_form->strict($args{strict_forms});
      }
  
      $self->set_fields( %{$fields} ) if $fields;
  
      my $response;
      if ( $args{button} ) {
          $response = $self->click( $args{button}, $args{x} || 0, $args{y} || 0 );
      }
      else {
          $response = $self->submit();
      }
  
      return $response;
  }
  
  
  sub add_header {
      my $self = shift;
      my $npairs = 0;
  
      while ( @_ ) {
          my $key = shift;
          my $value = shift;
          ++$npairs;
  
          $self->{headers}{$key} = $value;
      }
  
      return $npairs;
  }
  
  
  sub delete_header {
      my $self = shift;
  
      while ( @_ ) {
          my $key = shift;
  
          delete $self->{headers}{$key};
      }
  
      return;
  }
  
  
  
  sub quiet {
      my $self = shift;
  
      $self->{quiet} = $_[0] if @_;
  
      return $self->{quiet};
  }
  
  
  sub stack_depth {
      my $self = shift;
      $self->{stack_depth} = shift if @_;
      return $self->{stack_depth};
  }
  
  
  sub save_content {
      my $self = shift;
      my $filename = shift;
      my %opts = @_;
      if (delete $opts{binary}) {
          $opts{binmode} = ':raw';
          $opts{decoded_by_headers} = 1;
      }
  
      open( my $fh, '>', $filename ) or $self->die( "Unable to create $filename: $!" );
      if ((my $binmode = delete($opts{binmode}) || '') || ($self->content_type() !~ m{^text/})) {
          if (length($binmode) && (substr($binmode, 0, 1) eq ':')) {
              binmode $fh, $binmode;
          }
          else {
              binmode $fh;
          }
      }
      print {$fh} $self->content(%opts) or $self->die( "Unable to write to $filename: $!" );
      close $fh or $self->die( "Unable to close $filename: $!" );
  
      return;
  }
  
  
  
  sub _get_fh_default_stdout {
      my $self = shift;
      my $p = shift || '';
      if ( !$p ) {
          return \*STDOUT;
      } elsif ( !ref($p) ) {
          open my $fh, '>', $p or $self->die( "Unable to write to $p: $!" );;
          return $fh;
      } else {
          return $p;
      }
  }
  
  sub dump_headers {
      my $self = shift;
      my $fh   = $self->_get_fh_default_stdout(shift);
  
      print {$fh} $self->response->headers_as_string;
  
      return;
  }
  
  
  
  sub dump_links {
      my $self = shift;
      my $fh = shift || \*STDOUT;
      my $absolute = shift;
  
      for my $link ( $self->links ) {
          my $url = $absolute ? $link->url_abs : $link->url;
          $url = '' if not defined $url;
          print {$fh} $url, "\n";
      }
      return;
  }
  
  
  sub dump_images {
      my $self = shift;
      my $fh = shift || \*STDOUT;
      my $absolute = shift;
  
      for my $image ( $self->images ) {
          my $url = $absolute ? $image->url_abs : $image->url;
          $url = '' if not defined $url;
          print {$fh} $url, "\n";
      }
      return;
  }
  
  
  sub dump_forms {
      my $self = shift;
      my $fh = shift || \*STDOUT;
  
      for my $form ( $self->forms ) {
          print {$fh} $form->dump, "\n";
      }
      return;
  }
  
  
  sub dump_text {
      my $self = shift;
      my $fh = shift || \*STDOUT;
      my $absolute = shift;
  
      print {$fh} $self->text, "\n";
  
      return;
  }
  
  
  
  sub clone {
      my $self  = shift;
      my $clone = $self->SUPER::clone();
  
      $clone->cookie_jar( $self->cookie_jar );
      $clone->{headers} = { %{$self->{headers}} };
  
      return $clone;
  }
  
  
  
  sub redirect_ok {
      my $self = shift;
      my $prospective_request = shift;
      my $response = shift;
  
      my $ok = $self->SUPER::redirect_ok( $prospective_request, $response );
      if ( $ok ) {
          $self->{redirected_uri} = $prospective_request->uri;
      }
  
      return $ok;
  }
  
  
  
  sub request {
      my $self = shift;
      my $request = shift;
  
      _die( '->request was called without a request parameter' )
          unless $request;
  
      $request = $self->_modify_request( $request );
  
      if ( $request->method eq 'GET' || $request->method eq 'POST' ) {
          $self->_push_page_stack();
      }
  
      return $self->_update_page($request, $self->_make_request( $request, @_ ));
  }
  
  
  sub update_html {
      my $self = shift;
      my $html = shift;
  
      $self->_reset_page;
      $self->{ct} = 'text/html';
      $self->{content} = $html;
  
      return;
  }
  
  
  sub credentials {
      my $self = shift;
  
      # The latest LWP::UserAgent also supports 2 arguments,
      # in which case the first is host:port
      if (@_ == 4 || (@_ == 2 && $_[0] =~ /:\d+$/)) {
          return $self->SUPER::credentials(@_);
      }
  
      @_ == 2
          or $self->die( 'Invalid # of args for overridden credentials()' );
  
      return @$self{qw( __username __password )} = @_;
  }
  
  
  sub get_basic_credentials {
      my $self = shift;
      my @cred = grep { defined } @$self{qw( __username __password )};
      return @cred if @cred == 2;
      return $self->SUPER::get_basic_credentials(@_);
  }
  
  
  sub clear_credentials {
      my $self = shift;
      delete @$self{qw( __username __password )};
  }
  
  
  sub _update_page {
      my ($self, $request, $res) = @_;
  
      $self->{req} = $request;
      $self->{redirected_uri} = $request->uri->as_string;
  
      $self->{res} = $res;
  
      $self->{status}  = $res->code;
      $self->{base}    = $res->base;
      $self->{ct}      = $res->content_type || '';
  
      if ( $res->is_success ) {
          $self->{uri} = $self->{redirected_uri};
          $self->{last_uri} = $self->{uri};
      }
  
      if ( $res->is_error ) {
          if ( $self->{autocheck} ) {
              $self->die( 'Error ', $request->method, 'ing ', $request->uri, ': ', $res->message );
          }
      }
  
      $self->_reset_page;
  
      # Try to decode the content. Undef will be returned if there's nothing to decompress.
      # See docs in HTTP::Message for details. Do we need to expose the options there?
      my $content = $res->decoded_content();
      $content = $res->content if (not defined $content);
  
      $content .= _taintedness();
  
      if ($self->is_html) {
          $self->update_html($content);
      }
      else {
          $self->{content} = $content;
      }
  
      return $res;
  } # _update_page
  
  our $_taintbrush;
  
  # This is lifted wholesale from Test::Taint
  sub _taintedness {
      return $_taintbrush if defined $_taintbrush;
  
      # Somehow we need to get some taintedness into our $_taintbrush.
      # Let's try the easy way first. Either of these should be
      # tainted, unless somebody has untainted them, so this
      # will almost always work on the first try.
      # (Unless, of course, taint checking has been turned off!)
      $_taintbrush = substr("$0$^X", 0, 0);
      return $_taintbrush if tainted( $_taintbrush );
  
      # Let's try again. Maybe somebody cleaned those.
      $_taintbrush = substr(join('', grep { defined } @ARGV, %ENV), 0, 0);
      return $_taintbrush if tainted( $_taintbrush );
  
      # If those don't work, go try to open some file from some unsafe
      # source and get data from them.  That data is tainted.
      # (Yes, even reading from /dev/null works!)
      for my $filename ( qw(/dev/null / . ..), values %INC, $0, $^X ) {
          if ( open my $fh, '<', $filename ) {
              my $data;
              if ( defined sysread $fh, $data, 1 ) {
                  $_taintbrush = substr( $data, 0, 0 );
                  last if tainted( $_taintbrush );
              }
          }
      }
  
      # Sanity check
      die "Our taintbrush should have zero length!" if length $_taintbrush;
  
      return $_taintbrush;
  }
  
  
  
  sub _modify_request {
      my $self = shift;
      my $req = shift;
  
      # add correct Accept-Encoding header to restore compliance with
      # http://www.freesoft.org/CIE/RFC/2068/158.htm
      # http://use.perl.org/~rhesa/journal/25952
      if (not $req->header( 'Accept-Encoding' ) ) {
          # "identity" means "please! unencoded content only!"
          $req->header( 'Accept-Encoding', $HAS_ZLIB ? 'gzip' : 'identity' );
      }
  
      my $last = $self->{last_uri};
      if ( $last ) {
          $last = $last->as_string if ref($last);
          $req->header( Referer => $last );
      }
      while ( my($key,$value) = each %{$self->{headers}} ) {
          if ( defined $value ) {
              $req->header( $key => $value );
          }
          else {
              $req->remove_header( $key );
          }
      }
  
      return $req;
  }
  
  
  
  sub _make_request {
      my $self = shift;
      return $self->SUPER::request(@_);
  }
  
  
  sub _reset_page {
      my $self = shift;
  
      $self->{links}        = undef;
      $self->{images}       = undef;
      $self->{forms}        = undef;
      $self->{current_form} = undef;
      $self->{title}        = undef;
      $self->{text}         = undef;
  
      return;
  }
  
  
  my %link_tags = (
      a      => 'href',
      area   => 'href',
      frame  => 'src',
      iframe => 'src',
      link   => 'href',
      meta   => 'content',
  );
  
  sub _extract_links {
      my $self = shift;
  
  
      $self->{links} = [];
      if ( defined $self->{content} ) {
          my $parser = HTML::TokeParser->new(\$self->{content});
          while ( my $token = $parser->get_tag( keys %link_tags ) ) {
              my $link = $self->_link_from_token( $token, $parser );
              push( @{$self->{links}}, $link ) if $link;
          } # while
      }
  
      return;
  }
  
  
  my %image_tags = (
      img   => 'src',
      input => 'src',
  );
  
  sub _extract_images {
      my $self = shift;
  
      $self->{images} = [];
  
      if ( defined $self->{content} ) {
          my $parser = HTML::TokeParser->new(\$self->{content});
          while ( my $token = $parser->get_tag( keys %image_tags ) ) {
              my $image = $self->_image_from_token( $token, $parser );
              push( @{$self->{images}}, $image ) if $image;
          } # while
      }
  
      return;
  }
  
  sub _image_from_token {
      my $self = shift;
      my $token = shift;
      my $parser = shift;
  
      my $tag = $token->[0];
      my $attrs = $token->[1];
  
      if ( $tag eq 'input' ) {
          my $type = $attrs->{type} or return;
          return unless $type eq 'image';
      }
  
      require WWW::Mechanize::Image;
      return
          WWW::Mechanize::Image->new({
              tag     => $tag,
              base    => $self->base,
              url     => $attrs->{src},
              name    => $attrs->{name},
              height  => $attrs->{height},
              width   => $attrs->{width},
              alt     => $attrs->{alt},
              attrs   => $attrs,
          });
  }
  
  sub _link_from_token {
      my $self = shift;
      my $token = shift;
      my $parser = shift;
  
      my $tag = $token->[0];
      my $attrs = $token->[1];
      my $url = $attrs->{$link_tags{$tag}};
  
      my $text;
      my $name;
      if ( $tag eq 'a' ) {
          $text = $parser->get_trimmed_text("/$tag");
          $text = '' unless defined $text;
  
          my $onClick = $attrs->{onclick};
          if ( $onClick && ($onClick =~ /^window\.open\(\s*'([^']+)'/) ) {
              $url = $1;
          }
          elsif( $url && $url =~ /^javascript\:\s*(?:void\(\s*)?window\.open\(\s*'([^']+)'/s ){
              $url = $1;
          }
      } # a
  
      # Of the tags we extract from, only 'AREA' has an alt tag
      # The rest should have a 'name' attribute.
      # ... but we don't do anything with that bit of wisdom now.
  
      $name = $attrs->{name};
  
      if ( $tag eq 'meta' ) {
          my $equiv = $attrs->{'http-equiv'};
          my $content = $attrs->{'content'};
          return unless $equiv && (lc $equiv eq 'refresh') && defined $content;
  
          if ( $content =~ /^\d+\s*;\s*url\s*=\s*(\S+)/i ) {
              $url = $1;
              $url =~ s/^"(.+)"$/$1/ or $url =~ s/^'(.+)'$/$1/;
          }
          else {
              undef $url;
          }
      } # meta
  
      return unless defined $url;   # probably just a name link or <AREA NOHREF...>
  
      require WWW::Mechanize::Link;
      return
          WWW::Mechanize::Link->new({
              url  => $url,
              text => $text,
              name => $name,
              tag  => $tag,
              base => $self->base,
              attrs => $attrs,
          });
  } # _link_from_token
  
  
  sub _extract_forms {
      my $self = shift;
  
      my @forms = HTML::Form->parse(
          $self->content,
          base    => $self->base,
          strict  => $self->{strict_forms},
          verbose => $self->{verbose_forms},
      );
      $self->{forms} = \@forms;
      for my $form ( @forms ) {
          for my $input ($form->inputs) {
               if ($input->type eq 'file') {
                   $input->value( undef );
               }
          }
      }
  
      return;
  }
  
  
  sub _push_page_stack {
      my $self = shift;
  
      my $req = $self->{req};
      my $res = $self->{res};
  
      return unless $req && $res && $self->stack_depth;
  
      # Don't push anything if it's a virgin object
      my $stack = $self->{page_stack} ||= [];
      if ( @{$stack} >= $self->stack_depth ) {
          shift @{$stack};
      }
      push( @{$stack}, { req => $req, res => $res } );
  
      return 1;
  }
  
  
  sub warn {
      my $self = shift;
  
      return unless my $handler = $self->{onwarn};
  
      return if $self->quiet;
  
      return $handler->(@_);
  }
  
  
  sub die {
      my $self = shift;
  
      return unless my $handler = $self->{onerror};
  
      return $handler->(@_);
  }
  
  
  # NOT an object method!
  sub _warn {
      require Carp;
      return &Carp::carp; ## no critic
  }
  
  # NOT an object method!
  sub _die {
      require Carp;
      return &Carp::croak; ## no critic
  }
  
  1; # End of module
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  WWW::Mechanize - Handy web browsing in a Perl object
  
  =head1 VERSION
  
  version 1.91
  
  =head1 SYNOPSIS
  
  WWW::Mechanize supports performing a sequence of page fetches including
  following links and submitting forms. Each fetched page is parsed
  and its links and forms are extracted. A link or a form can be
  selected, form fields can be filled and the next page can be fetched.
  Mech also stores a history of the URLs you've visited, which can
  be queried and revisited.
  
      use WWW::Mechanize ();
      my $mech = WWW::Mechanize->new();
  
      $mech->get( $url );
  
      $mech->follow_link( n => 3 );
      $mech->follow_link( text_regex => qr/download this/i );
      $mech->follow_link( url => 'http://host.com/index.html' );
  
      $mech->submit_form(
          form_number => 3,
          fields      => {
              username    => 'mungo',
              password    => 'lost-and-alone',
          }
      );
  
      $mech->submit_form(
          form_name => 'search',
          fields    => { query  => 'pot of gold', },
          button    => 'Search Now'
      );
  
      # Enable strict form processing to catch typos and non-existant form fields.
      my $strict_mech = WWW::Mechanize->new( strict_forms => 1);
  
      $strict_mech->get( $url );
  
      # This method call will die, saving you lots of time looking for the bug.
      $strict_mech->submit_form(
          form_number => 3,
          fields      => {
              usernaem     => 'mungo',           # typo in field name
              password     => 'lost-and-alone',
              extra_field  => 123,               # field does not exist
          }
      );
  
  =head1 DESCRIPTION
  
  C<WWW::Mechanize>, or Mech for short, is a Perl module for stateful
  programmatic web browsing, used for automating interaction with
  websites.
  
  Features include:
  
  =over 4
  
  =item * All HTTP methods
  
  =item * High-level hyperlink and HTML form support, without having to parse HTML yourself
  
  =item * SSL support
  
  =item * Automatic cookies
  
  =item * Custom HTTP headers
  
  =item * Automatic handling of redirections
  
  =item * Proxies
  
  =item * HTTP authentication
  
  =back
  
  Mech is well suited for use in testing web applications.  If you use
  one of the Test::*, like L<Test::HTML::Lint> modules, you can check the
  fetched content and use that as input to a test call.
  
      use Test::More;
      like( $mech->content(), qr/$expected/, "Got expected content" );
  
  Each page fetch stores its URL in a history stack which you can
  traverse.
  
      $mech->back();
  
  If you want finer control over your page fetching, you can use
  these methods. C<follow_link> and C<submit_form> are just high
  level wrappers around them.
  
      $mech->find_link( n => $number );
      $mech->form_number( $number );
      $mech->form_name( $name );
      $mech->field( $name, $value );
      $mech->set_fields( %field_values );
      $mech->set_visible( @criteria );
      $mech->click( $button );
  
  L<WWW::Mechanize> is a proper subclass of L<LWP::UserAgent> and
  you can also use any of L<LWP::UserAgent>'s methods.
  
      $mech->add_header($name => $value);
  
  Please note that Mech does NOT support JavaScript, you need additional software
  for that. Please check L<WWW::Mechanize::FAQ/"JavaScript"> for more.
  
  =head1 IMPORTANT LINKS
  
  =over 4
  
  =item * L<https://github.com/libwww-perl/WWW-Mechanize/issues>
  
  The queue for bugs & enhancements in WWW::Mechanize.  Please note that the
  queue at L<http://rt.cpan.org> is no longer maintained.
  
  =item * L<https://metacpan.org/pod/WWW::Mechanize>
  
  The CPAN documentation page for Mechanize.
  
  =item * L<https://metacpan.org/pod/distribution/WWW-Mechanize/lib/WWW/Mechanize/FAQ.pod>
  
  Frequently asked questions.  Make sure you read here FIRST.
  
  =back
  
  =head1 CONSTRUCTOR AND STARTUP
  
  =head2 new()
  
  Creates and returns a new WWW::Mechanize object, hereafter referred to as
  the "agent".
  
      my $mech = WWW::Mechanize->new()
  
  The constructor for WWW::Mechanize overrides two of the parms to the
  LWP::UserAgent constructor:
  
      agent => 'WWW-Mechanize/#.##'
      cookie_jar => {}    # an empty, memory-only HTTP::Cookies object
  
  You can override these overrides by passing parms to the constructor,
  as in:
  
      my $mech = WWW::Mechanize->new( agent => 'wonderbot 1.01' );
  
  If you want none of the overhead of a cookie jar, or don't want your
  bot accepting cookies, you have to explicitly disallow it, like so:
  
      my $mech = WWW::Mechanize->new( cookie_jar => undef );
  
  Here are the parms that WWW::Mechanize recognizes.  These do not include
  parms that L<LWP::UserAgent> recognizes.
  
  =over 4
  
  =item * C<< autocheck => [0|1] >>
  
  Checks each request made to see if it was successful.  This saves
  you the trouble of manually checking yourself.  Any errors found
  are errors, not warnings.
  
  The default value is ON, unless it's being subclassed, in which
  case it is OFF.  This means that standalone L<WWW::Mechanize> instances
  have autocheck turned on, which is protective for the vast majority
  of Mech users who don't bother checking the return value of get()
  and post() and can't figure why their code fails. However, if
  L<WWW::Mechanize> is subclassed, such as for L<Test::WWW::Mechanize>
  or L<Test::WWW::Mechanize::Catalyst>, this may not be an appropriate
  default, so it's off.
  
  =item * C<< noproxy => [0|1] >>
  
  Turn off the automatic call to the L<LWP::UserAgent> C<env_proxy> function.
  
  This needs to be explicitly turned off if you're using L<Crypt::SSLeay> to
  access a https site via a proxy server.  Note: you still need to set your
  HTTPS_PROXY environment variable as appropriate.
  
  =item * C<< onwarn => \&func >>
  
  Reference to a C<warn>-compatible function, such as C<< L<Carp>::carp >>,
  that is called when a warning needs to be shown.
  
  If this is set to C<undef>, no warnings will ever be shown.  However,
  it's probably better to use the C<quiet> method to control that behavior.
  
  If this value is not passed, Mech uses C<Carp::carp> if L<Carp> is
  installed, or C<CORE::warn> if not.
  
  =item * C<< onerror => \&func >>
  
  Reference to a C<die>-compatible function, such as C<< L<Carp>::croak >>,
  that is called when there's a fatal error.
  
  If this is set to C<undef>, no errors will ever be shown.
  
  If this value is not passed, Mech uses C<Carp::croak> if L<Carp> is
  installed, or C<CORE::die> if not.
  
  =item * C<< quiet => [0|1] >>
  
  Don't complain on warnings.  Setting C<< quiet => 1 >> is the same as
  calling C<< $mech->quiet(1) >>.  Default is off.
  
  =item * C<< stack_depth => $value >>
  
  Sets the depth of the page stack that keeps track of all the
  downloaded pages. Default is effectively infinite stack size.  If
  the stack is eating up your memory, then set this to a smaller
  number, say 5 or 10.  Setting this to zero means Mech will keep no
  history.
  
  =back
  
  In addition, WWW::Mechanize also allows you to globally enable
  strict and verbose mode for form handling, which is done with L<HTML::Form>.
  
  =over 4
  
  =item * C<< strict_forms => [0|1] >>
  
  Globally sets the HTML::Form strict flag which causes form submission to
  croak if any of the passed fields don't exist in the form, and/or a value
  doesn't exist in a select element. This can still be disabled in individual
  calls to L<C<< submit_form()|"$mech->submit_form( ... )" >>>.
  
  Default is off.
  
  =item * C<< verbose_forms => [0|1] >>
  
  Globally sets the HTML::Form verbose flag which causes form submission to
  warn about any bad HTML form constructs found. This cannot be disabled
  later.
  
  Default is off.
  
  =back
  
  To support forms, WWW::Mechanize's constructor pushes POST
  on to the agent's C<requests_redirectable> list (see also
  L<LWP::UserAgent>.)
  
  =head2 $mech->agent_alias( $alias )
  
  Sets the user agent string to the expanded version from a table of actual user strings.
  I<$alias> can be one of the following:
  
  =over 4
  
  =item * Windows IE 6
  
  =item * Windows Mozilla
  
  =item * Mac Safari
  
  =item * Mac Mozilla
  
  =item * Linux Mozilla
  
  =item * Linux Konqueror
  
  =back
  
  then it will be replaced with a more interesting one.  For instance,
  
      $mech->agent_alias( 'Windows IE 6' );
  
  sets your User-Agent to
  
      Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
  
  The list of valid aliases can be returned from C<known_agent_aliases()>.  The current list is:
  
  =over
  
  =item * Windows IE 6
  
  =item * Windows Mozilla
  
  =item * Mac Safari
  
  =item * Mac Mozilla
  
  =item * Linux Mozilla
  
  =item * Linux Konqueror
  
  =back
  
  =head2 known_agent_aliases()
  
  Returns a list of all the agent aliases that Mech knows about.
  
  =head1 PAGE-FETCHING METHODS
  
  =head2 $mech->get( $uri )
  
  Given a URL/URI, fetches it.  Returns an L<HTTP::Response> object.
  I<$uri> can be a well-formed URL string, a L<URI> object, or a
  L<WWW::Mechanize::Link> object.
  
  The results are stored internally in the agent object, but you don't
  know that.  Just use the accessors listed below.  Poking at the
  internals is deprecated and subject to change in the future.
  
  C<get()> is a well-behaved overloaded version of the method in
  L<LWP::UserAgent>.  This lets you do things like
  
      $mech->get( $uri, ':content_file' => $tempfile );
  
  and you can rest assured that the parms will get filtered down
  appropriately.
  
  B<NOTE:> Because C<:content_file> causes the page contents to be
  stored in a file instead of the response object, some Mech functions
  that expect it to be there won't work as expected. Use with caution.
  
  =head2 $mech->post( $uri, content => $content )
  
  POSTs I<$content> to $uri.  Returns an L<HTTP::Response> object.
  I<$uri> can be a well-formed URI string, a L<URI> object, or a
  L<WWW::Mechanize::Link> object.
  
  =head2 $mech->put( $uri, content => $content )
  
  PUTs I<$content> to $uri.  Returns an L<HTTP::Response> object.
  I<$uri> can be a well-formed URI string, a L<URI> object, or a
  L<WWW::Mechanize::Link> object.
  
  =head2 $mech->reload()
  
  Acts like the reload button in a browser: repeats the current
  request. The history (as per the L<< back()|/$mech->back() >> method) is not altered.
  
  Returns the L<HTTP::Response> object from the reload, or C<undef>
  if there's no current request.
  
  =head2 $mech->back()
  
  The equivalent of hitting the "back" button in a browser.  Returns to
  the previous page.  Won't go back past the first page. (Really, what
  would it do if it could?)
  
  Returns true if it could go back, or false if not.
  
  =head2 $mech->clear_history()
  
  This deletes all the history entries and returns true.
  
  =head2 $mech->history_count()
  
  This returns the number of items in the browser history.  This number I<does>
  include the most recently made request.
  
  =head2 $mech->history($n)
  
  This returns the I<n>th item in history.  The 0th item is the most recent
  request and response, which would be acted on by methods like
  C<L<< find_link()|"$mech->find_link( ... )" >>>.
  The 1th item is the state you'd return to if you called
  C<L<< back()|/$mech->back() >>>.
  
  The maximum useful value for C<$n> is C<< $mech->history_count - 1 >>.
  Requests beyond that bound will return C<undef>.
  
  History items are returned as hash references, in the form:
  
    { req => $http_request, res => $http_response }
  
  =head1 STATUS METHODS
  
  =head2 $mech->success()
  
  Returns a boolean telling whether the last request was successful.
  If there hasn't been an operation yet, returns false.
  
  This is a convenience function that wraps C<< $mech->res->is_success >>.
  
  =head2 $mech->uri()
  
  Returns the current URI as a L<URI> object. This object stringifies
  to the URI itself.
  
  =head2 $mech->response() / $mech->res()
  
  Return the current response as an L<HTTP::Response> object.
  
  Synonym for C<< $mech->response() >>
  
  =head2 $mech->status()
  
  Returns the HTTP status code of the response.  This is a 3-digit
  number like 200 for OK, 404 for not found, and so on.
  
  =head2 $mech->ct() / $mech->content_type()
  
  Returns the content type of the response.
  
  =head2 $mech->base()
  
  Returns the base URI for the current response
  
  =head2 $mech->forms()
  
  When called in a list context, returns a list of the forms found in
  the last fetched page. In a scalar context, returns a reference to
  an array with those forms. The forms returned are all L<HTML::Form>
  objects.
  
  =head2 $mech->current_form()
  
  Returns the current form as an L<HTML::Form> object.
  
  =head2 $mech->links()
  
  When called in a list context, returns a list of the links found in the
  last fetched page.  In a scalar context it returns a reference to an array
  with those links.  Each link is a L<WWW::Mechanize::Link> object.
  
  =head2 $mech->is_html()
  
  Returns true/false on whether our content is HTML, according to the
  HTTP headers.
  
  =head2 $mech->title()
  
  Returns the contents of the C<< <TITLE> >> tag, as parsed by
  L<HTML::HeadParser>.  Returns undef if the content is not HTML.
  
  =head1 CONTENT-HANDLING METHODS
  
  =head2 $mech->content(...)
  
  Returns the content that the mech uses internally for the last page
  fetched. Ordinarily this is the same as
  C<< $mech->response()->decoded_content() >>,
  but this may differ for HTML documents if L<< update_html|/$mech->update_html( $html ) >> is
  overloaded (in which case the value passed to the base-class
  implementation of same will be returned), and/or extra named arguments
  are passed to I<content()>:
  
  =over 2
  
  =item I<< $mech->content( format => 'text' ) >>
  
  Returns a text-only version of the page, with all HTML markup
  stripped. This feature requires I<HTML::TreeBuilder> version 5 or higher
  to be installed, or a fatal error will be thrown. This works only if
  the contents are HTML.
  
  =item I<< $mech->content( base_href => [$base_href|undef] ) >>
  
  Returns the HTML document, modified to contain a
  C<< <base href="$base_href"> >> mark-up in the header.
  I<$base_href> is C<< $mech->base() >> if not specified. This is
  handy to pass the HTML to e.g. L<HTML::Display>. This works only if
  the contents are HTML.
  
  =item I<< $mech->content( raw => 1 ) >>
  
  Returns C<< $self->response()->content() >>, i.e. the raw contents from the
  response.
  
  =item I<< $mech->content( decoded_by_headers => 1 ) >>
  
  Returns the content after applying all C<Content-Encoding> headers but
  with not additional mangling.
  
  =item I<< $mech->content( charset => $charset ) >>
  
  Returns C<< $self->response()->decoded_content(charset => $charset) >>
  (see L<HTTP::Response> for details).
  
  =back
  
  To preserve backwards compatibility, additional parameters will be
  ignored unless none of C<< raw | decoded_by_headers | charset >> is
  specified and the text is HTML, in which case an error will be triggered.
  
  =head2 $mech->text()
  
  Returns the text of the current HTML content.  If the content isn't
  HTML, C<$mech> will die.
  
  The text is extracted by parsing the content, and then the extracted
  text is cached, so don't worry about performance of calling this
  repeatedly.
  
  =head1 LINK METHODS
  
  =head2 $mech->links()
  
  Lists all the links on the current page.  Each link is a
  WWW::Mechanize::Link object. In list context, returns a list of all
  links.  In scalar context, returns an array reference of all links.
  
  =head2 $mech->follow_link(...)
  
  Follows a specified link on the page.  You specify the match to be
  found using the same parms that C<L<< find_link()|"$mech->find_link( ... )" >>> uses.
  
  Here some examples:
  
  =over 4
  
  =item * 3rd link called "download"
  
      $mech->follow_link( text => 'download', n => 3 );
  
  =item * first link where the URL has "download" in it, regardless of case:
  
      $mech->follow_link( url_regex => qr/download/i );
  
  or
  
      $mech->follow_link( url_regex => qr/(?i:download)/ );
  
  =item * 3rd link on the page
  
      $mech->follow_link( n => 3 );
  
  =item * the link with the url
  
      $mech->follow_link( url => '/other/page' );
  
  or
  
      $mech->follow_link( url => 'http://example.com/page' );
  
  =back
  
  Returns the result of the GET method (an HTTP::Response object) if
  a link was found. If the page has no links, or the specified link
  couldn't be found, returns undef.
  
  =head2 $mech->find_link( ... )
  
  Finds a link in the currently fetched page. It returns a
  L<WWW::Mechanize::Link> object which describes the link.  (You'll
  probably be most interested in the C<url()> property.)  If it fails
  to find a link it returns undef.
  
  You can take the URL part and pass it to the C<get()> method.  If
  that's your plan, you might as well use the C<follow_link()> method
  directly, since it does the C<get()> for you automatically.
  
  Note that C<< <FRAME SRC="..."> >> tags are parsed out of the the HTML
  and treated as links so this method works with them.
  
  You can select which link to find by passing in one or more of these
  key/value pairs:
  
  =over 4
  
  =item * C<< text => 'string', >> and C<< text_regex => qr/regex/, >>
  
  C<text> matches the text of the link against I<string>, which must be an
  exact match.  To select a link with text that is exactly "download", use
  
      $mech->find_link( text => 'download' );
  
  C<text_regex> matches the text of the link against I<regex>.  To select a
  link with text that has "download" anywhere in it, regardless of case, use
  
      $mech->find_link( text_regex => qr/download/i );
  
  Note that the text extracted from the page's links are trimmed.  For
  example, C<< <a> foo </a> >> is stored as 'foo', and searching for
  leading or trailing spaces will fail.
  
  =item * C<< url => 'string', >> and C<< url_regex => qr/regex/, >>
  
  Matches the URL of the link against I<string> or I<regex>, as appropriate.
  The URL may be a relative URL, like F<foo/bar.html>, depending on how
  it's coded on the page.
  
  =item * C<< url_abs => string >> and C<< url_abs_regex => regex >>
  
  Matches the absolute URL of the link against I<string> or I<regex>,
  as appropriate.  The URL will be an absolute URL, even if it's relative
  in the page.
  
  =item * C<< name => string >> and C<< name_regex => regex >>
  
  Matches the name of the link against I<string> or I<regex>, as appropriate.
  
  =item * C<< id => string >> and C<< id_regex => regex >>
  
  Matches the attribute 'id' of the link against I<string> or
  I<regex>, as appropriate.
  
  =item * C<< class => string >> and C<< class_regex => regex >>
  
  Matches the attribute 'class' of the link against I<string> or
  I<regex>, as appropriate.
  
  =item * C<< tag => string >> and C<< tag_regex => regex >>
  
  Matches the tag that the link came from against I<string> or I<regex>,
  as appropriate.  The C<tag_regex> is probably most useful to check for
  more than one tag, as in:
  
      $mech->find_link( tag_regex => qr/^(a|frame)$/ );
  
  The tags and attributes looked at are defined below.
  
  =back
  
  If C<n> is not specified, it defaults to 1.  Therefore, if you don't
  specify any parms, this method defaults to finding the first link on the
  page.
  
  Note that you can specify multiple text or URL parameters, which
  will be ANDed together.  For example, to find the first link with
  text of "News" and with "cnn.com" in the URL, use:
  
      $mech->find_link( text => 'News', url_regex => qr/cnn\.com/ );
  
  The return value is a reference to an array containing a
  L<WWW::Mechanize::Link> object for every link in C<< $self->content >>.
  
  The links come from the following:
  
  =over 4
  
  =item C<< <a href=...> >>
  
  =item C<< <area href=...> >>
  
  =item C<< <frame src=...> >>
  
  =item C<< <iframe src=...> >>
  
  =item C<< <link href=...> >>
  
  =item C<< <meta content=...> >>
  
  =back
  
  =head2 $mech->find_all_links( ... )
  
  Returns all the links on the current page that match the criteria.  The
  method for specifying link criteria is the same as in
  C<L<< find_link()|"$mech->find_link( ... )" >>>.
  Each of the links returned is a L<WWW::Mechanize::Link> object.
  
  In list context, C<find_all_links()> returns a list of the links.
  Otherwise, it returns a reference to the list of links.
  
  C<find_all_links()> with no parameters returns all links in the
  page.
  
  =head2 $mech->find_all_inputs( ... criteria ... )
  
  find_all_inputs() returns an array of all the input controls in the
  current form whose properties match all of the regexes passed in.
  The controls returned are all descended from HTML::Form::Input.
  See L<HTML::Form/INPUTS> for details.
  
  If no criteria are passed, all inputs will be returned.
  
  If there is no current page, there is no form on the current
  page, or there are no submit controls in the current form
  then the return will be an empty array.
  
  You may use a regex or a literal string:
  
      # get all textarea controls whose names begin with "customer"
      my @customer_text_inputs = $mech->find_all_inputs(
          type       => 'textarea',
          name_regex => qr/^customer/,
      );
  
      # get all text or textarea controls called "customer"
      my @customer_text_inputs = $mech->find_all_inputs(
          type_regex => qr/^(text|textarea)$/,
          name       => 'customer',
      );
  
  =head2 $mech->find_all_submits( ... criteria ... )
  
  C<find_all_submits()> does the same thing as C<find_all_inputs()>
  except that it only returns controls that are submit controls,
  ignoring other types of input controls like text and checkboxes.
  
  =head1 IMAGE METHODS
  
  =head2 $mech->images
  
  Lists all the images on the current page.  Each image is a
  WWW::Mechanize::Image object. In list context, returns a list of all
  images.  In scalar context, returns an array reference of all images.
  
  =head2 $mech->find_image()
  
  Finds an image in the current page. It returns a
  L<WWW::Mechanize::Image> object which describes the image.  If it fails
  to find an image it returns undef.
  
  You can select which image to find by passing in one or more of these
  key/value pairs:
  
  =over 4
  
  =item * C<< alt => 'string' >> and C<< alt_regex => qr/regex/ >>
  
  C<alt> matches the ALT attribute of the image against I<string>, which must be an
  exact match. To select a image with an ALT tag that is exactly "download", use
  
      $mech->find_image( alt => 'download' );
  
  C<alt_regex> matches the ALT attribute of the image  against a regular
  expression.  To select an image with an ALT attribute that has "download"
  anywhere in it, regardless of case, use
  
      $mech->find_image( alt_regex => qr/download/i );
  
  =item * C<< url => 'string' >> and C<< url_regex => qr/regex/ >>
  
  Matches the URL of the image against I<string> or I<regex>, as appropriate.
  The URL may be a relative URL, like F<foo/bar.html>, depending on how
  it's coded on the page.
  
  =item * C<< url_abs => string >> and C<< url_abs_regex => regex >>
  
  Matches the absolute URL of the image against I<string> or I<regex>,
  as appropriate.  The URL will be an absolute URL, even if it's relative
  in the page.
  
  =item * C<< tag => string >> and C<< tag_regex => regex >>
  
  Matches the tag that the image came from against I<string> or I<regex>,
  as appropriate.  The C<tag_regex> is probably most useful to check for
  more than one tag, as in:
  
      $mech->find_image( tag_regex => qr/^(img|input)$/ );
  
  The tags supported are C<< <img> >> and C<< <input> >>.
  
  =item * C<< id => string >> and C<< id_regex => regex >>
  
  C<id> matches the id attribute of the image against I<string>, which must
  be an exact match. To select an image with the exact id "download-image", use
  
      $mech->find_image( id => 'download-image' );
  
  C<id_regex> matches the id attribute of the image against a regular
  expression. To select the first image with an id that contains "download"
  anywhere in it, use
  
      $mech->find_image( id_regex => qr/download/ );
  
  =item * C<< classs => string >> and C<< class_regex => regex >>
  
  C<class> matches the class attribute of the image against I<string>, which must
  be an exact match. To select an image with the exact class "img-fuid", use
  
      $mech->find_image( class => 'img-fluid' );
  
  To select an image with the class attribute "rounded float-left", use
  
      $mech->find_image( class => 'rounded float-left' );
  
  Note that the classes have to be matched as a complete string, in the exact
  order they appear in the website's source code.
  
  C<class_regex> matches the class attribute of the image against a regular
  expression. Use this if you want a partial class name, or if an image has
  several classes, but you only care about one.
  
  To select the first image with the class "rounded", where there are multiple
  images that might also have either class "float-left" or "float-right", use
  
      $mech->find_image( class_regex => qr/\brounded\b/ );
  
  Selecting an image with multiple classes where you do not care about the
  order they appear in the website's source code is not currently supported.
  
  =back
  
  If C<n> is not specified, it defaults to 1.  Therefore, if you don't
  specify any parms, this method defaults to finding the first image on the
  page.
  
  Note that you can specify multiple ALT or URL parameters, which
  will be ANDed together.  For example, to find the first image with
  ALT text of "News" and with "cnn.com" in the URL, use:
  
      $mech->find_image( image => 'News', url_regex => qr/cnn\.com/ );
  
  The return value is a reference to an array containing a
  L<WWW::Mechanize::Image> object for every image in C<< $self->content >>.
  
  =head2 $mech->find_all_images( ... )
  
  Returns all the images on the current page that match the criteria.  The
  method for specifying image criteria is the same as in
  C<L<< find_image()|"$mech->find_image()" >>>.
  Each of the images returned is a L<WWW::Mechanize::Image> object.
  
  In list context, C<find_all_images()> returns a list of the images.
  Otherwise, it returns a reference to the list of images.
  
  C<find_all_images()> with no parameters returns all images in the page.
  
  =head1 FORM METHODS
  
  These methods let you work with the forms on a page.  The idea is
  to choose a form that you'll later work with using the field methods
  below.
  
  =head2 $mech->forms
  
  Lists all the forms on the current page.  Each form is an L<HTML::Form>
  object.  In list context, returns a list of all forms.  In scalar
  context, returns an array reference of all forms.
  
  =head2 $mech->form_number($number)
  
  Selects the I<number>th form on the page as the target for subsequent
  calls to C<L<< field()|"$mech->field( $name, $value, $number )" >>>
  and C<L<< click()|"$mech->click( $button [, $x, $y] )" >>>.
  Also returns the form that was selected.
  
  If it is found, the form is returned as an L<HTML::Form> object and set internally
  for later use with Mech's form methods such as
  C<L<< field()|"$mech->field( $name, $value, $number )" >>> and
  C<L<< click()|"$mech->click( $button [, $x, $y] )" >>>.
  When called in a list context, the number of the found form is also returned as
  a second value.
  
  Emits a warning and returns undef if no form is found.
  
  The first form is number 1, not zero.
  
  =head2 $mech->form_name( $name )
  
  Selects a form by name.  If there is more than one form on the page
  with that name, then the first one is used, and a warning is
  generated.
  
  If it is found, the form is returned as an L<HTML::Form> object and
  set internally for later use with Mech's form methods such as
  C<L<< field()|"$mech->field( $name, $value, $number )" >>> and
  C<L<< click()|"$mech->click( $button [, $x, $y] )" >>>.
  
  Returns undef if no form is found.
  
  =head2 $mech->form_id( $name )
  
  Selects a form by ID.  If there is more than one form on the page
  with that ID, then the first one is used, and a warning is generated.
  
  If it is found, the form is returned as an L<HTML::Form> object and
  set internally for later use with Mech's form methods such as
  C<L<< field()|"$mech->field( $name, $value, $number )" >>> and
  C<L<< click()|"$mech->click( $button [, $x, $y] )" >>>.
  
  If no form is found it returns C<undef>.  This will also trigger a warning,
  unless C<quiet> is enabled.
  
  =head2 $mech->all_forms_with_fields( @fields )
  
  Selects a form by passing in a list of field names it must contain.  All matching forms (perhaps none) are returned as a list of L<HTML::Form> objects.
  
  =head2 $mech->form_with_fields( @fields )
  
  Selects a form by passing in a list of field names it must contain.  If there
  is more than one form on the page with that matches, then the first one is used,
  and a warning is generated.
  
  If it is found, the form is returned as an L<HTML::Form> object and set internally
  for later used with Mech's form methods such as
  C<L<< field()|"$mech->field( $name, $value, $number )" >>> and
  C<L<< click()|"$mech->click( $button [, $x, $y] )" >>>.
  
  Returns undef and emits a warning if no form is found.
  
  Note that this functionality requires libwww-perl 5.69 or higher.
  
  =head2 $mech->all_forms_with( $attr1 => $value1, $attr2 => $value2, ... )
  
  Searches for forms with arbitrary attribute/value pairs within the E<lt>formE<gt>
  tag.
  (Currently does not work for attribute C<action> due to implementation details
  of L<HTML::Form>.)
  When given more than one pair, all criteria must match.
  Using C<undef> as value means that the attribute in question may not be present.
  
  All matching forms (perhaps none) are returned as a list of L<HTML::Form> objects.
  
  =head2 $mech->form_with( $attr1 => $value1, $attr2 => $value2, ... )
  
  Searches for forms with arbitrary attribute/value pairs within the E<lt>formE<gt>
  tag.
  (Currently does not work for attribute C<action> due to implementation details
  of L<HTML::Form>.)
  When given more than one pair, all criteria must match.
  Using C<undef> as value means that the attribute in question may not be present.
  
  If it is found, the form is returned as an L<HTML::Form> object and set internally
  for later used with Mech's form methods such as
  C<L<< field()|"$mech->field( $name, $value, $number )" >>> and
  C<L<< click()|"$mech->click( $button [, $x, $y] )" >>>.
  
  Returns undef if no form is found.
  
  =head1 FIELD METHODS
  
  These methods allow you to set the values of fields in a given form.
  
  =head2 $mech->field( $name, $value, $number )
  
  =head2 $mech->field( $name, \@values, $number )
  
  Given the name of a field, set its value to the value specified.
  This applies to the current form (as set by the
  C<L<< form_name()|"$mech->form_name( $name )" >>> or
  C<L<< form_number()|"$mech->form_number($number)" >>>
  method or defaulting to the first form on the page).
  
  The optional I<$number> parameter is used to distinguish between two fields
  with the same name.  The fields are numbered from 1.
  
  =head2 $mech->select($name, $value)
  
  =head2 $mech->select($name, \@values)
  
  Given the name of a C<select> field, set its value to the value
  specified.  If the field is not C<< <select multiple> >> and the
  C<$value> is an array, only the B<first> value will be set.  [Note:
  the documentation previously claimed that only the last value would
  be set, but this was incorrect.]  Passing C<$value> as a hash with
  an C<n> key selects an item by number (e.g.
  C<< {n => 3} >> or C<< {n => [2,4]} >>).
  The numbering starts at 1.  This applies to the current form.
  
  If you have a field with C<< <select multiple> >> and you pass a single
  C<$value>, then C<$value> will be added to the list of fields selected,
  without clearing the others.  However, if you pass an array reference,
  then all previously selected values will be cleared.
  
  Returns true on successfully setting the value. On failure, returns
  false and calls C<< $self->warn() >> with an error message.
  
  =head2 $mech->set_fields( $name => $value ... )
  
  This method sets multiple fields of the current form. It takes a list
  of field name and value pairs. If there is more than one field with
  the same name, the first one found is set. If you want to select which
  of the duplicate field to set, use a value which is an anonymous array
  which has the field value and its number as the 2 elements.
  
          # set the second foo field
          $mech->set_fields( $name => [ 'foo', 2 ] );
  
  The fields are numbered from 1.
  
  This applies to the current form.
  
  =head2 $mech->set_visible( @criteria )
  
  This method sets fields of the current form without having to know
  their names.  So if you have a login screen that wants a username and
  password, you do not have to fetch the form and inspect the source (or
  use the F<mech-dump> utility, installed with WWW::Mechanize) to see
  what the field names are; you can just say
  
      $mech->set_visible( $username, $password );
  
  and the first and second fields will be set accordingly.  The method
  is called set_I<visible> because it acts only on visible fields;
  hidden form inputs are not considered.  The order of the fields is
  the order in which they appear in the HTML source which is nearly
  always the order anyone viewing the page would think they are in,
  but some creative work with tables could change that; caveat user.
  
  Each element in C<@criteria> is either a field value or a field
  specifier.  A field value is a scalar.  A field specifier allows
  you to specify the I<type> of input field you want to set and is
  denoted with an arrayref containing two elements.  So you could
  specify the first radio button with
  
      $mech->set_visible( [ radio => 'KCRW' ] );
  
  Field values and specifiers can be intermixed, hence
  
      $mech->set_visible( 'fred', 'secret', [ option => 'Checking' ] );
  
  would set the first two fields to "fred" and "secret", and the I<next>
  C<OPTION> menu field to "Checking".
  
  The possible field specifier types are: "text", "password", "hidden",
  "textarea", "file", "image", "submit", "radio", "checkbox" and "option".
  
  C<set_visible> returns the number of values set.
  
  =head2 $mech->tick( $name, $value [, $set] )
  
  "Ticks" the first checkbox that has both the name and value associated
  with it on the current form.  Dies if there is no named check box for
  that value.  Passing in a false value as the third optional argument
  will cause the checkbox to be unticked.
  
  =head2 $mech->untick($name, $value)
  
  Causes the checkbox to be unticked.  Shorthand for
  C<tick($name,$value,undef)>
  
  =head2 $mech->value( $name [, $number] )
  
  Given the name of a field, return its value. This applies to the current
  form.
  
  The optional I<$number> parameter is used to distinguish between two fields
  with the same name.  The fields are numbered from 1.
  
  If the field is of type file (file upload field), the value is always
  cleared to prevent remote sites from downloading your local files.
  To upload a file, specify its file name explicitly.
  
  =head2 $mech->click( $button [, $x, $y] )
  
  Has the effect of clicking a button on the current form.  The first
  argument is the name of the button to be clicked.  The second and
  third arguments (optional) allow you to specify the (x,y) coordinates
  of the click.
  
  If there is only one button on the form, C<< $mech->click() >> with
  no arguments simply clicks that one button.
  
  Returns an L<HTTP::Response> object.
  
  =head2 $mech->click_button( ... )
  
  Has the effect of clicking a button on the current form by specifying
  its name, value, or index.  Its arguments are a list of key/value
  pairs.  Only one of name, number, input or value must be specified in
  the keys.
  
  =over 4
  
  =item * C<< name => name >>
  
  Clicks the button named I<name> in the current form.
  
  =item * C<< id => id >>
  
  Clicks the button with the id I<id> in the current form.
  
  =item * C<< number => n >>
  
  Clicks the I<n>th button in the current form. Numbering starts at 1.
  
  =item * C<< value => value >>
  
  Clicks the button with the value I<value> in the current form.
  
  =item * C<< input => $inputobject >>
  
  Clicks on the button referenced by $inputobject, an instance of
  L<HTML::Form::SubmitInput> obtained e.g. from
  
      $mech->current_form()->find_input( undef, 'submit' )
  
  $inputobject must belong to the current form.
  
  =item * C<< x => x >>
  
  =item * C<< y => y >>
  
  These arguments (optional) allow you to specify the (x,y) coordinates
  of the click.
  
  =back
  
  =head2 $mech->submit()
  
  Submits the current form, without specifying a button to click.  Actually,
  no button is clicked at all.
  
  Returns an L<HTTP::Response> object.
  
  This used to be a synonym for C<< $mech->click( 'submit' ) >>, but is no
  longer so.
  
  =head2 $mech->submit_form( ... )
  
  This method lets you select a form from the previously fetched page,
  fill in its fields, and submit it. It combines the C<form_number>/C<form_name>,
  C<set_fields> and C<click> methods into one higher level call. Its arguments
  are a list of key/value pairs, all of which are optional.
  
  =over 4
  
  =item * C<< fields => \%fields >>
  
  Specifies the fields to be filled in the current form.
  
  =item * C<< with_fields => \%fields >>
  
  Probably all you need for the common case. It combines a smart form selector
  and data setting in one operation. It selects the first form that contains all
  fields mentioned in C<\%fields>.  This is nice because you don't need to know
  the name or number of the form to do this.
  
  (calls C<L</form_with_fields()>> and C<L</set_fields()>>).
  
  If you choose C<with_fields>, the C<fields> option will be ignored. The
  C<form_number>, C<form_name> and C<form_id> options will still be used.  An
  exception will be thrown unless exactly one form matches all of the provided
  criteria.
  
  =item * C<< form_number => n >>
  
  Selects the I<n>th form (calls
  C<L<< form_number()|"$mech->form_number($number)" >>>.  If this parm is not
  specified, the currently-selected form is used.
  
  =item * C<< form_name => name >>
  
  Selects the form named I<name> (calls
  C<L<< form_name()|"$mech->form_name( $name )" >>>)
  
  =item * C<< form_id => ID >>
  
  Selects the form with ID I<ID> (calls
  C<L<< form_id()|"$mech->form_id( $name )" >>>)>>)
  
  =item * C<< button => button >>
  
  Clicks on button I<button> (calls C<L<< click()|"$mech->click( $button [, $x, $y] )" >>>)
  
  =item * C<< x => x, y => y >>
  
  Sets the x or y values for C<L<< click()|"$mech->click( $button [, $x, $y] )" >>>
  
  =item * C<< strict_forms => bool >>
  
  Sets the HTML::Form strict flag which causes form submission to croak if any of the passed
  fields don't exist on the page, and/or a value doesn't exist in a select element.
  By default HTML::Form sets this value to false.
  
  This behavior can also be turned on globally by passing C<< strict_forms => 1 >> to
  C<< WWW::Mechanize->new >>. If you do that, you can still disable it for individual calls
  by passing C<< strict_forms => 0 >> here.
  
  =back
  
  If no form is selected, the first form found is used.
  
  If I<button> is not passed, then the L<C<< submit()|"$mech->submit()" >>>
  method is used instead.
  
  If you want to submit a file and get its content from a scalar rather
  than a file in the filesystem, you can use:
  
      $mech->submit_form(with_fields => { logfile => [ [ undef, 'whatever', Content => $content ], 1 ] } );
  
  Returns an L<HTTP::Response> object.
  
  =head1 MISCELLANEOUS METHODS
  
  =head2 $mech->add_header( name => $value [, name => $value... ] )
  
  Sets HTTP headers for the agent to add or remove from the HTTP request.
  
      $mech->add_header( Encoding => 'text/klingon' );
  
  If a I<value> is C<undef>, then that header will be removed from any
  future requests.  For example, to never send a Referer header:
  
      $mech->add_header( Referer => undef );
  
  If you want to delete a header, use C<delete_header>.
  
  Returns the number of name/value pairs added.
  
  B<NOTE>: This method was very different in WWW::Mechanize before 1.00.
  Back then, the headers were stored in a package hash, not as a member of
  the object instance.  Calling C<add_header()> would modify the headers
  for every WWW::Mechanize object, even after your object no longer existed.
  
  =head2 $mech->delete_header( name [, name ... ] )
  
  Removes HTTP headers from the agent's list of special headers.  For
  instance, you might need to do something like:
  
      # Don't send a Referer for this URL
      $mech->add_header( Referer => undef );
  
      # Get the URL
      $mech->get( $url );
  
      # Back to the default behavior
      $mech->delete_header( 'Referer' );
  
  =head2 $mech->quiet(true/false)
  
  Allows you to suppress warnings to the screen.
  
      $mech->quiet(0); # turns on warnings (the default)
      $mech->quiet(1); # turns off warnings
      $mech->quiet();  # returns the current quietness status
  
  =head2 $mech->stack_depth( $max_depth )
  
  Get or set the page stack depth. Use this if you're doing a lot of page
  scraping and running out of memory.
  
  A value of 0 means "no history at all."  By default, the max stack depth
  is humongously large, effectively keeping all history.
  
  =head2 $mech->save_content( $filename, %opts )
  
  Dumps the contents of C<< $mech->content >> into I<$filename>.
  I<$filename> will be overwritten.  Dies if there are any errors.
  
  If the content type does not begin with "text/", then the content
  is saved in binary mode (i.e. C<binmode()> is set on the output
  filehandle).
  
  Additional arguments can be passed as I<key>/I<value> pairs:
  
  =over
  
  =item I<< $mech->save_content( $filename, binary => 1 ) >>
  
  Filehandle is set with C<binmode> to C<:raw> and contents are taken
  calling C<< $self->content(decoded_by_headers => 1) >>. Same as calling:
  
      $mech->save_content( $filename, binmode => ':raw',
                           decoded_by_headers => 1 );
  
  This I<should> be the safest way to save contents verbatim.
  
  =item I<< $mech->save_content( $filename, binmode => $binmode ) >>
  
  Filehandle is set to binary mode. If C<$binmode> begins with ':', it is
  passed as a parameter to C<binmode>:
  
      binmode $fh, $binmode;
  
  otherwise the filehandle is set to binary mode if C<$binmode> is true:
  
      binmode $fh;
  
  =item I<all other arguments>
  
  are passed as-is to C<< $mech->content(%opts) >>. In particular,
  C<decoded_by_headers> might come handy if you want to revert the effect
  of line compression performed by the web server but without further
  interpreting the contents (e.g. decoding it according to the charset).
  
  =back
  
  =head2 $mech->dump_headers( [$fh] )
  
  Prints a dump of the HTTP response headers for the most recent
  response.  If I<$fh> is not specified or is undef, it dumps to
  STDOUT.
  
  Unlike the rest of the dump_* methods, $fh can be a scalar. It
  will be used as a file name.
  
  =head2 $mech->dump_links( [[$fh], $absolute] )
  
  Prints a dump of the links on the current page to I<$fh>.  If I<$fh>
  is not specified or is undef, it dumps to STDOUT.
  
  If I<$absolute> is true, links displayed are absolute, not relative.
  
  =head2 $mech->dump_images( [[$fh], $absolute] )
  
  Prints a dump of the images on the current page to I<$fh>.  If I<$fh>
  is not specified or is undef, it dumps to STDOUT.
  
  If I<$absolute> is true, links displayed are absolute, not relative.
  
  =head2 $mech->dump_forms( [$fh] )
  
  Prints a dump of the forms on the current page to I<$fh>.  If I<$fh>
  is not specified or is undef, it dumps to STDOUT. Running the following:
  
      my $mech = WWW::Mechanize->new();
      $mech->get("https://www.google.com/");
      $mech->dump_forms;
  
  will print:
  
      GET https://www.google.com/search [f]
        ie=ISO-8859-1                  (hidden readonly)
        hl=en                          (hidden readonly)
        source=hp                      (hidden readonly)
        biw=                           (hidden readonly)
        bih=                           (hidden readonly)
        q=                             (text)
        btnG=Google Search             (submit)
        btnI=I'm Feeling Lucky         (submit)
        gbv=1                          (hidden readonly)
  
  =head2 $mech->dump_text( [$fh] )
  
  Prints a dump of the text on the current page to I<$fh>.  If I<$fh>
  is not specified or is undef, it dumps to STDOUT.
  
  =head1 OVERRIDDEN LWP::UserAgent METHODS
  
  =head2 $mech->clone()
  
  Clone the mech object.  The clone will be using the same cookie jar
  as the original mech.
  
  =head2 $mech->redirect_ok()
  
  An overloaded version of C<redirect_ok()> in L<LWP::UserAgent>.
  This method is used to determine whether a redirection in the request
  should be followed.
  
  Note that WWW::Mechanize's constructor pushes POST on to the agent's
  C<requests_redirectable> list.
  
  =head2 $mech->request( $request [, $arg [, $size]])
  
  Overloaded version of C<request()> in L<LWP::UserAgent>.  Performs
  the actual request.  Normally, if you're using WWW::Mechanize, it's
  because you don't want to deal with this level of stuff anyway.
  
  Note that C<$request> will be modified.
  
  Returns an L<HTTP::Response> object.
  
  =head2 $mech->update_html( $html )
  
  Allows you to replace the HTML that the mech has found.  Updates the
  forms and links parse-trees that the mech uses internally.
  
  Say you have a page that you know has malformed output, and you want to
  update it so the links come out correctly:
  
      my $html = $mech->content;
      $html =~ s[</option>.{0,3}</td>][</option></select></td>]isg;
      $mech->update_html( $html );
  
  This method is also used internally by the mech itself to update its
  own HTML content when loading a page. This means that if you would
  like to I<systematically> perform the above HTML substitution, you
  would overload I<update_html> in a subclass thusly:
  
     package MyMech;
     use base 'WWW::Mechanize';
  
     sub update_html {
         my ($self, $html) = @_;
         $html =~ s[</option>.{0,3}</td>][</option></select></td>]isg;
         $self->WWW::Mechanize::update_html( $html );
     }
  
  If you do this, then the mech will use the tidied-up HTML instead of
  the original both when parsing for its own needs, and for returning to
  you through L</content>.
  
  Overloading this method is also the recommended way of implementing
  extra validation steps (e.g. link checkers) for every HTML page
  received.  L</warn> and L</die> would then come in handy to signal
  validation errors.
  
  =head2 $mech->credentials( $username, $password )
  
  Provide credentials to be used for HTTP Basic authentication for
  all sites and realms until further notice.
  
  The four argument form described in L<LWP::UserAgent> is still
  supported.
  
  =head2 $mech->get_basic_credentials( $realm, $uri, $isproxy )
  
  Returns the credentials for the realm and URI.
  
  =head2 $mech->clear_credentials()
  
  Remove any credentials set up with C<credentials()>.
  
  =head1 INHERITED UNCHANGED LWP::UserAgent METHODS
  
  As a subclass of L<LWP::UserAgent>, WWW::Mechanize inherits all of
  L<LWP::UserAgent>'s methods.  Many of which are overridden or
  extended. The following methods are inherited unchanged. View the
  L<LWP::UserAgent> documentation for their implementation descriptions.
  
  This is not meant to be an inclusive list.  LWP::UA may have added
  others.
  
  =head2 $mech->head()
  
  Inherited from L<LWP::UserAgent>.
  
  =head2 $mech->mirror()
  
  Inherited from L<LWP::UserAgent>.
  
  =head2 $mech->simple_request()
  
  Inherited from L<LWP::UserAgent>.
  
  =head2 $mech->is_protocol_supported()
  
  Inherited from L<LWP::UserAgent>.
  
  =head2 $mech->prepare_request()
  
  Inherited from L<LWP::UserAgent>.
  
  =head2 $mech->progress()
  
  Inherited from L<LWP::UserAgent>.
  
  =head1 INTERNAL-ONLY METHODS
  
  These methods are only used internally.  You probably don't need to
  know about them.
  
  =head2 $mech->_update_page($request, $response)
  
  Updates all internal variables in $mech as if $request was just
  performed, and returns $response. The page stack is B<not> altered by
  this method, it is up to caller (e.g.
  C<L<< request|"$mech->request( $request [, $arg [, $size]])" >>>)
  to do that.
  
  =head2 $mech->_modify_request( $req )
  
  Modifies a L<HTTP::Request> before the request is sent out,
  for both GET and POST requests.
  
  We add a C<Referer> header, as well as header to note that we can accept gzip
  encoded content, if L<Compress::Zlib> is installed.
  
  =head2 $mech->_make_request()
  
  Convenience method to make it easier for subclasses like
  L<WWW::Mechanize::Cached> to intercept the request.
  
  =head2 $mech->_reset_page()
  
  Resets the internal fields that track page parsed stuff.
  
  =head2 $mech->_extract_links()
  
  Extracts links from the content of a webpage, and populates the C<{links}>
  property with L<WWW::Mechanize::Link> objects.
  
  =head2 $mech->_push_page_stack()
  
  The agent keeps a stack of visited pages, which it can pop when it needs
  to go BACK and so on.
  
  The current page needs to be pushed onto the stack before we get a new
  page, and the stack needs to be popped when BACK occurs.
  
  Neither of these take any arguments, they just operate on the $mech
  object.
  
  =head2 warn( @messages )
  
  Centralized warning method, for diagnostics and non-fatal problems.
  Defaults to calling C<CORE::warn>, but may be overridden by setting
  C<onwarn> in the constructor.
  
  =head2 die( @messages )
  
  Centralized error method.  Defaults to calling C<CORE::die>, but
  may be overridden by setting C<onerror> in the constructor.
  
  =head1 BEST PRACTICES
  
  The default settings can get you up and running quickly, but there are settings
  you can change in order to make your life easier.
  
  =over 4
  
  =item autocheck
  
  C<autocheck> can save you the overhead of checking status codes for success.
  You may outgrow it as your needs get more sophisticated, but it's a safe option
  to start with.
  
      my $agent = WWW::Mechanize->new( autocheck => 1 );
  
  =item cookie_jar
  
  You are encouraged to install L<Mozilla::PublicSuffix> and use
  L<HTTP::CookieJar::LWP> as your cookie jar.  L<HTTP::CookieJar::LWP> provides a
  better security model matching that of current Web browsers when
  L<Mozilla::PublicSuffix> is installed.
  
      use HTTP::CookieJar::LWP ();
  
      my $jar = HTTP::CookieJar::LWP->new;
      my $agent = WWW::Mechanize->new( cookie_jar => $jar );
  
  =item protocols_allowed
  
  This option is inherited directly from L<LWP::UserAgent>.  It allows you to
  whitelist the protocols you're willing to allow.
  
      my $agent = WWW::Mechanize->new(
          protocols_allowed => [ 'http', 'https' ]
      );
  
  This will prevent you from inadvertently following URLs like
  C<file:///etc/passwd>
  
  =item protocols_forbidden
  
  This option is also inherited directly from L<LWP::UserAgent>.  It allows you to
  blacklist the protocols you're unwilling to allow.
  
      my $agent = WWW::Mechanize->new(
          protocols_forbidden => [ 'file', 'mailto', 'ssh', ]
      );
  
  This will prevent you from inadvertently following URLs like
  C<file:///etc/passwd>
  
  =item strict_forms
  
  Consider turning on the C<strict_forms> option when you create a new Mech.
  This will perform a helpful sanity check on form fields every time you are
  submitting a form, which can save you a lot of debugging time.
  
      my $agent = WWW::Mechanize->new( strict_forms => 1 );
  
  If you do not want to have this option globally, you can still turn it on for
  individual forms.
  
      $agent->submit_form( fields => { foo => 'bar' } , strict_forms => 1 );
  
  =back
  
  =head1 WWW::MECHANIZE'S GIT REPOSITORY
  
  WWW::Mechanize is hosted at GitHub.
  
  Repository: L<https://github.com/libwww-perl/WWW-Mechanize>.
  Bugs: L<https://github.com/libwww-perl/WWW-Mechanize/issues>.
  
  =head1 OTHER DOCUMENTATION
  
  =head2 I<Spidering Hacks>, by Kevin Hemenway and Tara Calishain
  
  I<Spidering Hacks> from O'Reilly
  (L<http://www.oreilly.com/catalog/spiderhks/>) is a great book for anyone
  wanting to know more about screen-scraping and spidering.
  
  There are six hacks that use Mech or a Mech derivative:
  
  =over 4
  
  =item #21 WWW::Mechanize 101
  
  =item #22 Scraping with WWW::Mechanize
  
  =item #36 Downloading Images from Webshots
  
  =item #44 Archiving Yahoo! Groups Messages with WWW::Yahoo::Groups
  
  =item #64 Super Author Searching
  
  =item #73 Scraping TV Listings
  
  =back
  
  The book was also positively reviewed on Slashdot:
  L<http://books.slashdot.org/article.pl?sid=03/12/11/2126256>
  
  =head1 ONLINE RESOURCES AND SUPPORT
  
  =over 4
  
  =item * WWW::Mechanize mailing list
  
  The Mech mailing list is at
  L<http://groups.google.com/group/www-mechanize-users> and is specific
  to Mechanize, unlike the LWP mailing list below.  Although it is a
  users list, all development discussion takes place here, too.
  
  =item * LWP mailing list
  
  The LWP mailing list is at
  L<http://lists.perl.org/showlist.cgi?name=libwww>, and is more
  user-oriented and well-populated than the WWW::Mechanize list.
  
  =item * Perlmonks
  
  L<http://perlmonks.org> is an excellent community of support, and
  many questions about Mech have already been answered there.
  
  =item * L<WWW::Mechanize::Examples>
  
  A random array of examples submitted by users, included with the
  Mechanize distribution.
  
  =back
  
  =head1 ARTICLES ABOUT WWW::MECHANIZE
  
  =over 4
  
  =item * L<http://www.ibm.com/developerworks/linux/library/wa-perlsecure/>
  
  IBM article "Secure Web site access with Perl"
  
  =item * L<http://www.oreilly.com/catalog/googlehks2/chapter/hack84.pdf>
  
  Leland Johnson's hack #84 in I<Google Hacks, 2nd Edition> is
  an example of a production script that uses WWW::Mechanize and
  HTML::TableContentParser. It takes in keywords and returns the estimated
  price of these keywords on Google's AdWords program.
  
  =item * L<http://www.perl.com/pub/a/2004/06/04/recorder.html>
  
  Linda Julien writes about using HTTP::Recorder to create WWW::Mechanize
  scripts.
  
  =item * L<http://www.developer.com/lang/other/article.php/3454041>
  
  Jason Gilmore's article on using WWW::Mechanize for scraping sales
  information from Amazon and eBay.
  
  =item * L<http://www.perl.com/pub/a/2003/01/22/mechanize.html>
  
  Chris Ball's article about using WWW::Mechanize for scraping TV
  listings.
  
  =item * L<http://www.stonehenge.com/merlyn/LinuxMag/col47.html>
  
  Randal Schwartz's article on scraping Yahoo News for images.  It's
  already out of date: He manually walks the list of links hunting
  for matches, which wouldn't have been necessary if the
  C<L<< find_link()|"$mech->find_link( ... )" >>> method existed at press time.
  
  =item * L<http://www.perladvent.org/2002/16th/>
  
  WWW::Mechanize on the Perl Advent Calendar, by Mark Fowler.
  
  =item * L<http://www.linux-magazin.de/ausgaben/2004/03/datenruessel/>
  
  Michael Schilli's article on Mech and L<WWW::Mechanize::Shell> for the
  German magazine I<Linux Magazin>.
  
  =back
  
  =head2 Other modules that use Mechanize
  
  Here are modules that use or subclass Mechanize.  Let me know of any others:
  
  =over 4
  
  =item * L<Finance::Bank::LloydsTSB>
  
  =item * L<HTTP::Recorder>
  
  Acts as a proxy for web interaction, and then generates WWW::Mechanize scripts.
  
  =item * L<Win32::IE::Mechanize>
  
  Just like Mech, but using Microsoft Internet Explorer to do the work.
  
  =item * L<WWW::Bugzilla>
  
  =item * L<WWW::CheckSite>
  
  =item * L<WWW::Google::Groups>
  
  =item * L<WWW::Hotmail>
  
  =item * L<WWW::Mechanize::Cached>
  
  =item * L<WWW::Mechanize::Cached::GZip>
  
  =item * L<WWW::Mechanize::FormFiller>
  
  =item * L<WWW::Mechanize::Shell>
  
  =item * L<WWW::Mechanize::Sleepy>
  
  =item * L<WWW::Mechanize::SpamCop>
  
  =item * L<WWW::Mechanize::Timed>
  
  =item * L<WWW::SourceForge>
  
  =item * L<WWW::Yahoo::Groups>
  
  =item * L<WWW::Scripter>
  
  =back
  
  =head1 ACKNOWLEDGEMENTS
  
  Thanks to the numerous people who have helped out on WWW::Mechanize in
  one way or another, including
  Kirrily Robert for the original C<WWW::Automate>,
  Lyle Hopkins,
  Damien Clark,
  Ansgar Burchardt,
  Gisle Aas,
  Jeremy Ary,
  Hilary Holz,
  Rafael Kitover,
  Norbert Buchmuller,
  Dave Page,
  David Sainty,
  H.Merijn Brand,
  Matt Lawrence,
  Michael Schwern,
  Adriano Ferreira,
  Miyagawa,
  Peteris Krumins,
  Rafael Kitover,
  David Steinbrunner,
  Kevin Falcone,
  Mike O'Regan,
  Mark Stosberg,
  Uri Guttman,
  Peter Scott,
  Philippe Bruhat,
  Ian Langworth,
  John Beppu,
  Gavin Estey,
  Jim Brandt,
  Ask Bjoern Hansen,
  Greg Davies,
  Ed Silva,
  Mark-Jason Dominus,
  Autrijus Tang,
  Mark Fowler,
  Stuart Children,
  Max Maischein,
  Meng Wong,
  Prakash Kailasa,
  Abigail,
  Jan Pazdziora,
  Dominique Quatravaux,
  Scott Lanning,
  Rob Casey,
  Leland Johnson,
  Joshua Gatcomb,
  Julien Beasley,
  Abe Timmerman,
  Peter Stevens,
  Pete Krawczyk,
  Tad McClellan,
  and the late great Iain Truskett.
  
  =head1 AUTHOR
  
  Andy Lester <andy at petdance.com>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2004-2016 by Andy Lester.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
WWW_MECHANIZE

    $main::fatpacked{"WWW/Mechanize/Image.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'WWW_MECHANIZE_IMAGE';
  package WWW::Mechanize::Image;
  
  use strict;
  use warnings;
  
  our $VERSION = '1.91';
  
  #ABSTRACT: Image object for WWW::Mechanize
  
  
  sub new {
      my $class = shift;
      my $parms = shift || {};
  
      my $self = bless {}, $class;
  
      for my $parm ( qw( url base tag height width alt name attrs ) ) {
          # Check for what we passed in, not whether it's defined
          $self->{$parm} = $parms->{$parm} if exists $parms->{$parm};
      }
  
      # url and tag are always required
      for ( qw( url tag ) ) {
          exists $self->{$_} or die "WWW::Mechanize::Image->new must have a $_ argument";
      }
  
      return $self;
  }
  
  
  sub url     { return ($_[0])->{url}; }
  sub base    { return ($_[0])->{base}; }
  sub name    { return ($_[0])->{name}; }
  sub tag     { return ($_[0])->{tag}; }
  sub height  { return ($_[0])->{height}; }
  sub width   { return ($_[0])->{width}; }
  sub alt     { return ($_[0])->{alt}; }
  sub attrs   { return ($_[0])->{attrs}; }
  
  
  sub URI {
      my $self = shift;
  
      require URI::URL;
      my $URI = URI::URL->new( $self->url, $self->base );
  
      return $URI;
  }
  
  
  sub url_abs {
      my $self = shift;
  
      return $self->URI->abs;
  }
  
  
  1;
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  WWW::Mechanize::Image - Image object for WWW::Mechanize
  
  =head1 VERSION
  
  version 1.91
  
  =head1 SYNOPSIS
  
  Image object to encapsulate all the stuff that Mech needs
  
  =head1 Constructor
  
  =head2 new()
  
  Creates and returns a new C<WWW::Mechanize::Image> object.
  
      my $image = WWW::Mechanize::Image->new( {
          url    => $url,
          base   => $base,
          tag    => $tag,
          name   => $name,     # From the INPUT tag
          height => $height,   # optional
          width  => $width,    # optional
          alt    => $alt,      # optional
          attrs  => $attr_ref, # optional
      } );
  
  =head1 Accessors
  
  =head2 $link->url()
  
  URL from the link
  
  =head2 $link->base()
  
  Base URL to which the links are relative.
  
  =head2 $link->name()
  
  Name for the field from the NAME attribute, if any.
  
  =head2 $link->tag()
  
  Tag name (either "image" or "input")
  
  =head2 $link->height()
  
  Image height
  
  =head2 $link->width()
  
  Image width
  
  =head2 $link->alt()
  
  ALT attribute from the source tag, if any.
  
  =head2 $link->attrs()
  
  Hash ref of all the attributes and attribute values in the tag.
  
  =head2 $link->URI()
  
  Returns the URL as a L<URI::URL> object.
  
  =head2 $link->url_abs()
  
  Returns the URL as an absolute URL string.
  
  =head1 SEE ALSO
  
  L<WWW::Mechanize> and L<WWW::Mechanize::Link>
  
  =head1 AUTHOR
  
  Andy Lester <andy at petdance.com>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2004-2016 by Andy Lester.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
WWW_MECHANIZE_IMAGE

    $main::fatpacked{"WWW/Mechanize/Link.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'WWW_MECHANIZE_LINK';
  package WWW::Mechanize::Link;
  
  use strict;
  use warnings;
  
  our $VERSION = '1.91';
  
  #ABSTRACT: Link object for WWW::Mechanize
  
  
  sub new {
      my $class = shift;
  
      my $self;
  
      # The order of the first four must stay as they are for
      # compatibility with older code.
      if ( ref $_[0] eq 'HASH' ) {
          $self = [ @{$_[0]}{ qw( url text name tag base attrs ) } ];
      }
      else {
          $self = [ @_ ];
      }
  
      return bless $self, $class;
  }
  
  
  sub url   { return ($_[0])->[0]; }
  sub text  { return ($_[0])->[1]; }
  sub name  { return ($_[0])->[2]; }
  sub tag   { return ($_[0])->[3]; }
  sub base  { return ($_[0])->[4]; }
  sub attrs { return ($_[0])->[5]; }
  
  
  sub URI {
      my $self = shift;
  
      require URI::URL;
      my $URI = URI::URL->new( $self->url, $self->base );
  
      return $URI;
  }
  
  
  sub url_abs {
      my $self = shift;
  
      return $self->URI->abs;
  }
  
  
  1;
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  WWW::Mechanize::Link - Link object for WWW::Mechanize
  
  =head1 VERSION
  
  version 1.91
  
  =head1 SYNOPSIS
  
  Link object to encapsulate all the stuff that Mech needs but nobody
  wants to deal with as an array.
  
  =head1 Constructor
  
  =head2 new()
  
      my $link = WWW::Mechanize::Link->new( {
          url  => $url,
          text => $text,
          name => $name,
          tag  => $tag,
          base => $base,
          attr => $attr_href,
      } );
  
  For compatibility, this older interface is also supported:
  
   new( $url, $text, $name, $tag, $base, $attr_href )
  
  Creates and returns a new C<WWW::Mechanize::Link> object.
  
  =head1 Accessors
  
  =head2 $link->url()
  
  URL from the link
  
  =head2 $link->text()
  
  Text of the link
  
  =head2 $link->name()
  
  NAME attribute from the source tag, if any.
  
  =head2 $link->tag()
  
  Tag name (one of: "a", "area", "frame", "iframe" or "meta").
  
  =head2 $link->base()
  
  Base URL to which the links are relative.
  
  =head2 $link->attrs()
  
  Returns hash ref of all the attributes and attribute values in the tag. 
  
  =head2 $link->URI()
  
  Returns the URL as a L<URI::URL> object.
  
  =head2 $link->url_abs()
  
  Returns a L<URI::URL> object for the absolute form of the string.
  
  =head1 SEE ALSO
  
  L<WWW::Mechanize> and L<WWW::Mechanize::Image>
  
  =head1 AUTHOR
  
  Andy Lester <andy at petdance.com>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2004-2016 by Andy Lester.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
WWW_MECHANIZE_LINK

    $main::fatpacked{"WWW/RobotRules.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'WWW_ROBOTRULES';
  package WWW::RobotRules;
  
  $VERSION = "6.02";
  sub Version { $VERSION; }
  
  use strict;
  use URI ();
  
  
  
  sub new {
      my($class, $ua) = @_;
  
      # This ugly hack is needed to ensure backwards compatibility.
      # The "WWW::RobotRules" class is now really abstract.
      $class = "WWW::RobotRules::InCore" if $class eq "WWW::RobotRules";
  
      my $self = bless { }, $class;
      $self->agent($ua);
      $self;
  }
  
  
  sub parse {
      my($self, $robot_txt_uri, $txt, $fresh_until) = @_;
      $robot_txt_uri = URI->new("$robot_txt_uri");
      my $netloc = $robot_txt_uri->host . ":" . $robot_txt_uri->port;
  
      $self->clear_rules($netloc);
      $self->fresh_until($netloc, $fresh_until || (time + 365*24*3600));
  
      my $ua;
      my $is_me = 0;		# 1 iff this record is for me
      my $is_anon = 0;		# 1 iff this record is for *
      my $seen_disallow = 0;      # watch for missing record separators
      my @me_disallowed = ();	# rules disallowed for me
      my @anon_disallowed = ();	# rules disallowed for *
  
      # blank lines are significant, so turn CRLF into LF to avoid generating
      # false ones
      $txt =~ s/\015\012/\012/g;
  
      # split at \012 (LF) or \015 (CR) (Mac text files have just CR for EOL)
      for(split(/[\012\015]/, $txt)) {
  
  	# Lines containing only a comment are discarded completely, and
          # therefore do not indicate a record boundary.
  	next if /^\s*\#/;
  
  	s/\s*\#.*//;        # remove comments at end-of-line
  
  	if (/^\s*$/) {	    # blank line
  	    last if $is_me; # That was our record. No need to read the rest.
  	    $is_anon = 0;
  	    $seen_disallow = 0;
  	}
          elsif (/^\s*User-Agent\s*:\s*(.*)/i) {
  	    $ua = $1;
  	    $ua =~ s/\s+$//;
  
  	    if ($seen_disallow) {
  		# treat as start of a new record
  		$seen_disallow = 0;
  		last if $is_me; # That was our record. No need to read the rest.
  		$is_anon = 0;
  	    }
  
  	    if ($is_me) {
  		# This record already had a User-agent that
  		# we matched, so just continue.
  	    }
  	    elsif ($ua eq '*') {
  		$is_anon = 1;
  	    }
  	    elsif($self->is_me($ua)) {
  		$is_me = 1;
  	    }
  	}
  	elsif (/^\s*Disallow\s*:\s*(.*)/i) {
  	    unless (defined $ua) {
  		warn "RobotRules <$robot_txt_uri>: Disallow without preceding User-agent\n" if $^W;
  		$is_anon = 1;  # assume that User-agent: * was intended
  	    }
  	    my $disallow = $1;
  	    $disallow =~ s/\s+$//;
  	    $seen_disallow = 1;
  	    if (length $disallow) {
  		my $ignore;
  		eval {
  		    my $u = URI->new_abs($disallow, $robot_txt_uri);
  		    $ignore++ if $u->scheme ne $robot_txt_uri->scheme;
  		    $ignore++ if lc($u->host) ne lc($robot_txt_uri->host);
  		    $ignore++ if $u->port ne $robot_txt_uri->port;
  		    $disallow = $u->path_query;
  		    $disallow = "/" unless length $disallow;
  		};
  		next if $@;
  		next if $ignore;
  	    }
  
  	    if ($is_me) {
  		push(@me_disallowed, $disallow);
  	    }
  	    elsif ($is_anon) {
  		push(@anon_disallowed, $disallow);
  	    }
  	}
          elsif (/\S\s*:/) {
               # ignore
          }
  	else {
  	    warn "RobotRules <$robot_txt_uri>: Malformed record: <$_>\n" if $^W;
  	}
      }
  
      if ($is_me) {
  	$self->push_rules($netloc, @me_disallowed);
      }
      else {
  	$self->push_rules($netloc, @anon_disallowed);
      }
  }
  
  
  #
  # Returns TRUE if the given name matches the
  # name of this robot
  #
  sub is_me {
      my($self, $ua_line) = @_;
      my $me = $self->agent;
  
      # See whether my short-name is a substring of the
      #  "User-Agent: ..." line that we were passed:
  
      if(index(lc($me), lc($ua_line)) >= 0) {
        return 1;
      }
      else {
        return '';
      }
  }
  
  
  sub allowed {
      my($self, $uri) = @_;
      $uri = URI->new("$uri");
  
      return 1 unless $uri->scheme eq 'http' or $uri->scheme eq 'https';
       # Robots.txt applies to only those schemes.
  
      my $netloc = $uri->host . ":" . $uri->port;
  
      my $fresh_until = $self->fresh_until($netloc);
      return -1 if !defined($fresh_until) || $fresh_until < time;
  
      my $str = $uri->path_query;
      my $rule;
      for $rule ($self->rules($netloc)) {
  	return 1 unless length $rule;
  	return 0 if index($str, $rule) == 0;
      }
      return 1;
  }
  
  
  # The following methods must be provided by the subclass.
  sub agent;
  sub visit;
  sub no_visits;
  sub last_visits;
  sub fresh_until;
  sub push_rules;
  sub clear_rules;
  sub rules;
  sub dump;
  
  
  
  package WWW::RobotRules::InCore;
  
  use vars qw(@ISA);
  @ISA = qw(WWW::RobotRules);
  
  
  
  sub agent {
      my ($self, $name) = @_;
      my $old = $self->{'ua'};
      if ($name) {
          # Strip it so that it's just the short name.
          # I.e., "FooBot"                                      => "FooBot"
          #       "FooBot/1.2"                                  => "FooBot"
          #       "FooBot/1.2 [http://foobot.int; foo@bot.int]" => "FooBot"
  
  	$name = $1 if $name =~ m/(\S+)/; # get first word
  	$name =~ s!/.*!!;  # get rid of version
  	unless ($old && $old eq $name) {
  	    delete $self->{'loc'}; # all old info is now stale
  	    $self->{'ua'} = $name;
  	}
      }
      $old;
  }
  
  
  sub visit {
      my($self, $netloc, $time) = @_;
      return unless $netloc;
      $time ||= time;
      $self->{'loc'}{$netloc}{'last'} = $time;
      my $count = \$self->{'loc'}{$netloc}{'count'};
      if (!defined $$count) {
  	$$count = 1;
      }
      else {
  	$$count++;
      }
  }
  
  
  sub no_visits {
      my ($self, $netloc) = @_;
      $self->{'loc'}{$netloc}{'count'};
  }
  
  
  sub last_visit {
      my ($self, $netloc) = @_;
      $self->{'loc'}{$netloc}{'last'};
  }
  
  
  sub fresh_until {
      my ($self, $netloc, $fresh_until) = @_;
      my $old = $self->{'loc'}{$netloc}{'fresh'};
      if (defined $fresh_until) {
  	$self->{'loc'}{$netloc}{'fresh'} = $fresh_until;
      }
      $old;
  }
  
  
  sub push_rules {
      my($self, $netloc, @rules) = @_;
      push (@{$self->{'loc'}{$netloc}{'rules'}}, @rules);
  }
  
  
  sub clear_rules {
      my($self, $netloc) = @_;
      delete $self->{'loc'}{$netloc}{'rules'};
  }
  
  
  sub rules {
      my($self, $netloc) = @_;
      if (defined $self->{'loc'}{$netloc}{'rules'}) {
  	return @{$self->{'loc'}{$netloc}{'rules'}};
      }
      else {
  	return ();
      }
  }
  
  
  sub dump
  {
      my $self = shift;
      for (keys %$self) {
  	next if $_ eq 'loc';
  	print "$_ = $self->{$_}\n";
      }
      for (keys %{$self->{'loc'}}) {
  	my @rules = $self->rules($_);
  	print "$_: ", join("; ", @rules), "\n";
      }
  }
  
  
  1;
  
  __END__
  
  
  # Bender: "Well, I don't have anything else
  #          planned for today.  Let's get drunk!"
  
  =head1 NAME
  
  WWW::RobotRules - database of robots.txt-derived permissions
  
  =head1 SYNOPSIS
  
   use WWW::RobotRules;
   my $rules = WWW::RobotRules->new('MOMspider/1.0');
  
   use LWP::Simple qw(get);
  
   {
     my $url = "http://some.place/robots.txt";
     my $robots_txt = get $url;
     $rules->parse($url, $robots_txt) if defined $robots_txt;
   }
  
   {
     my $url = "http://some.other.place/robots.txt";
     my $robots_txt = get $url;
     $rules->parse($url, $robots_txt) if defined $robots_txt;
   }
  
   # Now we can check if a URL is valid for those servers
   # whose "robots.txt" files we've gotten and parsed:
   if($rules->allowed($url)) {
       $c = get $url;
       ...
   }
  
  =head1 DESCRIPTION
  
  This module parses F</robots.txt> files as specified in
  "A Standard for Robot Exclusion", at
  <http://www.robotstxt.org/wc/norobots.html>
  Webmasters can use the F</robots.txt> file to forbid conforming
  robots from accessing parts of their web site.
  
  The parsed files are kept in a WWW::RobotRules object, and this object
  provides methods to check if access to a given URL is prohibited.  The
  same WWW::RobotRules object can be used for one or more parsed
  F</robots.txt> files on any number of hosts.
  
  The following methods are provided:
  
  =over 4
  
  =item $rules = WWW::RobotRules->new($robot_name)
  
  This is the constructor for WWW::RobotRules objects.  The first
  argument given to new() is the name of the robot.
  
  =item $rules->parse($robot_txt_url, $content, $fresh_until)
  
  The parse() method takes as arguments the URL that was used to
  retrieve the F</robots.txt> file, and the contents of the file.
  
  =item $rules->allowed($uri)
  
  Returns TRUE if this robot is allowed to retrieve this URL.
  
  =item $rules->agent([$name])
  
  Get/set the agent name. NOTE: Changing the agent name will clear the robots.txt
  rules and expire times out of the cache.
  
  =back
  
  =head1 ROBOTS.TXT
  
  The format and semantics of the "/robots.txt" file are as follows
  (this is an edited abstract of
  <http://www.robotstxt.org/wc/norobots.html>):
  
  The file consists of one or more records separated by one or more
  blank lines. Each record contains lines of the form
  
    <field-name>: <value>
  
  The field name is case insensitive.  Text after the '#' character on a
  line is ignored during parsing.  This is used for comments.  The
  following <field-names> can be used:
  
  =over 3
  
  =item User-Agent
  
  The value of this field is the name of the robot the record is
  describing access policy for.  If more than one I<User-Agent> field is
  present the record describes an identical access policy for more than
  one robot. At least one field needs to be present per record.  If the
  value is '*', the record describes the default access policy for any
  robot that has not not matched any of the other records.
  
  The I<User-Agent> fields must occur before the I<Disallow> fields.  If a
  record contains a I<User-Agent> field after a I<Disallow> field, that
  constitutes a malformed record.  This parser will assume that a blank
  line should have been placed before that I<User-Agent> field, and will
  break the record into two.  All the fields before the I<User-Agent> field
  will constitute a record, and the I<User-Agent> field will be the first
  field in a new record.
  
  =item Disallow
  
  The value of this field specifies a partial URL that is not to be
  visited. This can be a full path, or a partial path; any URL that
  starts with this value will not be retrieved
  
  =back
  
  Unrecognized records are ignored.
  
  =head1 ROBOTS.TXT EXAMPLES
  
  The following example "/robots.txt" file specifies that no robots
  should visit any URL starting with "/cyberworld/map/" or "/tmp/":
  
    User-agent: *
    Disallow: /cyberworld/map/ # This is an infinite virtual URL space
    Disallow: /tmp/ # these will soon disappear
  
  This example "/robots.txt" file specifies that no robots should visit
  any URL starting with "/cyberworld/map/", except the robot called
  "cybermapper":
  
    User-agent: *
    Disallow: /cyberworld/map/ # This is an infinite virtual URL space
  
    # Cybermapper knows where to go.
    User-agent: cybermapper
    Disallow:
  
  This example indicates that no robots should visit this site further:
  
    # go away
    User-agent: *
    Disallow: /
  
  This is an example of a malformed robots.txt file.
  
    # robots.txt for ancientcastle.example.com
    # I've locked myself away.
    User-agent: *
    Disallow: /
    # The castle is your home now, so you can go anywhere you like.
    User-agent: Belle
    Disallow: /west-wing/ # except the west wing!
    # It's good to be the Prince...
    User-agent: Beast
    Disallow:
  
  This file is missing the required blank lines between records.
  However, the intention is clear.
  
  =head1 SEE ALSO
  
  L<LWP::RobotUA>, L<WWW::RobotRules::AnyDBM_File>
  
  =head1 COPYRIGHT
  
    Copyright 1995-2009, Gisle Aas
    Copyright 1995, Martijn Koster
  
  This library is free software; you can redistribute it and/or
  modify it under the same terms as Perl itself.
WWW_ROBOTRULES

    $main::fatpacked{"WWW/RobotRules/AnyDBM_File.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'WWW_ROBOTRULES_ANYDBM_FILE';
  package WWW::RobotRules::AnyDBM_File;
  
  require  WWW::RobotRules;
  @ISA = qw(WWW::RobotRules);
  $VERSION = "6.00";
  
  use Carp ();
  use AnyDBM_File;
  use Fcntl;
  use strict;
  
  =head1 NAME
  
  WWW::RobotRules::AnyDBM_File - Persistent RobotRules
  
  =head1 SYNOPSIS
  
   require WWW::RobotRules::AnyDBM_File;
   require LWP::RobotUA;
  
   # Create a robot useragent that uses a diskcaching RobotRules
   my $rules = WWW::RobotRules::AnyDBM_File->new( 'my-robot/1.0', 'cachefile' );
   my $ua = WWW::RobotUA->new( 'my-robot/1.0', 'me@foo.com', $rules );
  
   # Then just use $ua as usual
   $res = $ua->request($req);
  
  =head1 DESCRIPTION
  
  This is a subclass of I<WWW::RobotRules> that uses the AnyDBM_File
  package to implement persistent diskcaching of F<robots.txt> and host
  visit information.
  
  The constructor (the new() method) takes an extra argument specifying
  the name of the DBM file to use.  If the DBM file already exists, then
  you can specify undef as agent name as the name can be obtained from
  the DBM database.
  
  =cut
  
  sub new 
  { 
    my ($class, $ua, $file) = @_;
    Carp::croak('WWW::RobotRules::AnyDBM_File filename required') unless $file;
  
    my $self = bless { }, $class;
    $self->{'filename'} = $file;
    tie %{$self->{'dbm'}}, 'AnyDBM_File', $file, O_CREAT|O_RDWR, 0640
      or Carp::croak("Can't open $file: $!");
    
    if ($ua) {
        $self->agent($ua);
    }
    else {
        # Try to obtain name from DBM file
        $ua = $self->{'dbm'}{"|ua-name|"};
        Carp::croak("No agent name specified") unless $ua;
    }
  
    $self;
  }
  
  sub agent {
      my($self, $newname) = @_;
      my $old = $self->{'dbm'}{"|ua-name|"};
      if (defined $newname) {
  	$newname =~ s!/?\s*\d+.\d+\s*$!!;  # loose version
  	unless ($old && $old eq $newname) {
  	# Old info is now stale.
  	    my $file = $self->{'filename'};
  	    untie %{$self->{'dbm'}};
  	    tie %{$self->{'dbm'}}, 'AnyDBM_File', $file, O_TRUNC|O_RDWR, 0640;
  	    %{$self->{'dbm'}} = ();
  	    $self->{'dbm'}{"|ua-name|"} = $newname;
  	}
      }
      $old;
  }
  
  sub no_visits {
      my ($self, $netloc) = @_;
      my $t = $self->{'dbm'}{"$netloc|vis"};
      return 0 unless $t;
      (split(/;\s*/, $t))[0];
  }
  
  sub last_visit {
      my ($self, $netloc) = @_;
      my $t = $self->{'dbm'}{"$netloc|vis"};
      return undef unless $t;
      (split(/;\s*/, $t))[1];
  }
  
  sub fresh_until {
      my ($self, $netloc, $fresh) = @_;
      my $old = $self->{'dbm'}{"$netloc|exp"};
      if ($old) {
  	$old =~ s/;.*//;  # remove cleartext
      }
      if (defined $fresh) {
  	$fresh .= "; " . localtime($fresh);
  	$self->{'dbm'}{"$netloc|exp"} = $fresh;
      }
      $old;
  }
  
  sub visit {
      my($self, $netloc, $time) = @_;
      $time ||= time;
  
      my $count = 0;
      my $old = $self->{'dbm'}{"$netloc|vis"};
      if ($old) {
  	my $last;
  	($count,$last) = split(/;\s*/, $old);
  	$time = $last if $last > $time;
      }
      $count++;
      $self->{'dbm'}{"$netloc|vis"} = "$count; $time; " . localtime($time);
  }
  
  sub push_rules {
      my($self, $netloc, @rules) = @_;
      my $cnt = 1;
      $cnt++ while $self->{'dbm'}{"$netloc|r$cnt"};
  
      foreach (@rules) {
  	$self->{'dbm'}{"$netloc|r$cnt"} = $_;
  	$cnt++;
      }
  }
  
  sub clear_rules {
      my($self, $netloc) = @_;
      my $cnt = 1;
      while ($self->{'dbm'}{"$netloc|r$cnt"}) {
  	delete $self->{'dbm'}{"$netloc|r$cnt"};
  	$cnt++;
      }
  }
  
  sub rules {
      my($self, $netloc) = @_;
      my @rules = ();
      my $cnt = 1;
      while (1) {
  	my $rule = $self->{'dbm'}{"$netloc|r$cnt"};
  	last unless $rule;
  	push(@rules, $rule);
  	$cnt++;
      }
      @rules;
  }
  
  sub dump
  {
  }
  
  1;
  
  =head1 SEE ALSO
  
  L<WWW::RobotRules>, L<LWP::RobotUA>
  
  =head1 AUTHORS
  
  Hakan Ardo E<lt>hakan@munin.ub2.lu.se>, Gisle Aas E<lt>aas@sn.no>
  
  =cut
  
WWW_ROBOTRULES_ANYDBM_FILE

    $main::fatpacked{"WordList.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'WORDLIST';
  package WordList;
  
  our $DATE = '2018-04-03'; # DATE
  our $VERSION = '0.4.1'; # VERSION
  
  use strict 'subs', 'vars';
  
  sub new {
      my $class = shift;
      my $fh = \*{"$class\::DATA"};
      binmode $fh, "encoding(utf8)";
      unless (defined ${"$class\::DATA_POS"}) {
          ${"$class\::DATA_POS"} = tell $fh;
      }
      bless [], $class;
  }
  
  sub each_word {
      my ($self, $code) = @_;
  
      my $class = ref($self);
  
      my $fh = \*{"$class\::DATA"};
  
      seek $fh, ${"$class\::DATA_POS"}, 0;
      while (defined(my $word = <$fh>)) {
          chomp $word;
          my $res = $code->($word);
          last if defined $res && $res == -2;
      }
  }
  
  sub pick {
      my ($self, $n) = @_;
  
      $n = 1 if !defined $n;
      die "Please specify a positive number of words to pick" if $n < 1;
  
      if ($n == 1) {
          my $i = 0;
          my $word;
          # algorithm from Learning Perl
          $self->each_word(
              sub {
                  $i++;
                  $word = $_[0] if rand($i) < 1;
              }
          );
          return $word;
      }
  
      my $i = 0;
      my @words;
      $self->each_word(
          sub {
              $i++;
              if (@words < $n) {
                  # we haven't reached $n, put word to result in a random position
                  splice @words, rand(@words+1), 0, $_[0];
              } else {
                  # we have reached $n, just replace a word randomly, using
                  # algorithm from Learning Perl, slightly modified
                  rand($i) < @words and splice @words, rand(@words), 1, $_[0];
              }
          }
      );
      @words;
  }
  
  sub word_exists {
      my ($self, $word) = @_;
  
      my $found = 0;
      $self->each_word(
          sub {
              if ($word eq $_[0]) {
                  $found = 1;
                  return -2;
              }
          }
      );
      $found;
  }
  
  sub all_words {
      my ($self) = @_;
  
      my @words;
      $self->each_word(
          sub {
              push @words, $_[0];
          }
      );
      @words;
  }
  
  1;
  # ABSTRACT: Word lists
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  WordList - Word lists
  
  =head1 VERSION
  
  This document describes version 0.4.1 of WordList (from Perl distribution WordList), released on 2018-04-03.
  
  =head1 SYNOPSIS
  
  Use one of the C<WordList::*> modules.
  
  =head1 DESCRIPTION
  
  C<WordList::*> modules are modules that contain, well, list of words. This
  module, C<WordList>, serves as a base class and establishes convention for such
  modules.
  
  C<WordList> is an alternative interface for L<Games::Word::Wordlist> and
  C<Games::Word::Wordlist::*>. Its main difference is: C<WordList::*> wordlists
  are read-only/immutable and the modules are designed to have low startup
  overhead. This makes them more suitable for use in CLI scripts which often only
  want to pick a word from one or several lists.
  
  Unless you are defining a dynamic wordlist (see below), words (or phrases) must
  be put in C<__DATA__> section, one per line. Putting the wordlist in the
  C<__DATA__> section relieves perl from having to parse the list during the
  loading of the module. To search for words or picking some random words from the
  list, the module also need not slurp the whole list into memory (and will not do
  so unless explicitly instructed).
  
  You must sort your words ascibetically (or by Unicode code point). Sorting makes
  it more convenient to diff different versions of the module, as well as
  performing binary search. If you have a different sort order other than
  ascibetical, you must set package variable C<$SORT> with some true value (say,
  C<frequency>).
  
  There must not be any duplicate entry in the word list.
  
  B<Dynamic and non-deterministic wordlist.> A dynamic wordlist must set package
  variable C<$DYNAMIC> to either 1 (deterministic) or 2 (non-deterministic). A
  dynamic wordlist does not put the wordlist in the DATA section; instead, user
  relies on C<each_word()> or C<all_words()> to get the list. A deterministic
  wordlist returns the same list everytime C<each_word()> or C<all_words()> is
  called. A non-deterministic list can return a different list for a different
  C<each_word()> or C<all_words()> call.
  
  =head1 DIFFERENCES WITH GAMES::WORD::WORDLIST
  
  Since this is a new and non-backward compatible interface from
  Games::Word::Wordlist, I also make some other changes:
  
  =over
  
  =item * Namespace is put outside C<Games::>
  
  Because obviously word lists are not only useful for games.
  
  =item * Interface is simpler
  
  This is partly due to the list being read-only. The methods provided are just:
  
  - C<pick> (pick one or several random entries)
  
  - C<word_exists> (check whether a word is in the list)
  
  - C<each_word> (run code for each entry)
  
  - C<all_words> (return all the words in a list)
  
  A couple of other functions might be added, with careful consideration.
  
  =item * Namespace is more language-neutral and not English-centric
  
  =back
  
  =head1 METHODS
  
  =head2 new
  
  Usage:
  
   $wl = WordList::Module->new => obj
  
  Constructor.
  
  =head2 each_word
  
  Usage:
  
   $wl->each_word($code)
  
  Call C<$code> for each word in the list. The code will receive the word as its
  first argument.
  
  If code return -2 will exit early.
  
  =head2 pick
  
  Usage:
  
   $wl->pick($n = 1) => list
  
  Pick C<$n> (default: 1) random word(s) from the list. If there are less then
  C<$n> words in the list, only that many will be returned.
  
  The algorithm used is from perlfaq ("perldoc -q "random line""), which scans the
  whole list once (a.k.a. each_word() once). The algorithm is for returning a
  single entry and is modified to support returning multiple entries.
  
  =head2 word_exists
  
  Usage:
  
   $wl->word_exists($word) => bool
  
  Check whether C<$word> is in the list.
  
  Algorithm in this implementation is linear scan (O(n)). Check out
  L<WordList::Role::BinarySearch> for an O(log n) implementation, or
  L<WordList::Role::Bloom> for O(1) implementation.
  
  =head2 all_words
  
  Usage:
  
   $wl->all_words() => list
  
  Return all the words in a list, in order. Note that if wordlist is very large
  you might want to use L</"each_word"> instead to avoid slurping all words into
  memory.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/WordList>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-WordList>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=WordList>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  C<WordList::Role::*> modules.
  
  Other C<WordList::*> modules.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2018, 2017, 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
WORDLIST

    $main::fatpacked{"WordList/HTTP/UserAgentString/PERLANCAR.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'WORDLIST_HTTP_USERAGENTSTRING_PERLANCAR';
  package WordList::HTTP::UserAgentString::PERLANCAR;
  
  our $DATE = '2019-06-17'; # DATE
  our $VERSION = '0.003'; # VERSION
  
  use WordList;
  our @ISA = qw(WordList);
  
  our %STATS = ("num_words_contains_unicode",0,"avg_word_len",95.6666666666667,"num_words",6,"longest_word_len",113,"shortest_word_len",68,"num_words_contains_whitespace",6,"num_words_contains_nonword_chars",6); # STATS
  
  1;
  # ABSTRACT: A selection of some HTTP User-Agent strings
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  WordList::HTTP::UserAgentString::PERLANCAR - A selection of some HTTP User-Agent strings
  
  =head1 VERSION
  
  This document describes version 0.003 of WordList::HTTP::UserAgentString::PERLANCAR (from Perl distribution WordList-HTTP-UserAgentString-PERLANCAR), released on 2019-06-17.
  
  =head1 SYNOPSIS
  
   use WordList::HTTP::UserAgentString::PERLANCAR;
  
   my $wl = WordList::HTTP::UserAgentString::PERLANCAR->new;
  
   # Pick a (or several) random word(s) from the list
   my $word = $wl->pick;
   my @words = $wl->pick(3);
  
   # Check if a word exists in the list
   if ($wl->word_exists('foo')) { ... }
  
   # Call a callback for each word
   $wl->each_word(sub { my $word = shift; ... });
  
   # Get all the words
   my @all_words = $wl->all_words;
  
  =head1 DESCRIPTION
  
  My selection: recent Firefox (Linux & Windows), recent Chrome (Linux & Windows).
  
  =head1 STATISTICS
  
   +----------------------------------+------------------+
   | key                              | value            |
   +----------------------------------+------------------+
   | avg_word_len                     | 95.6666666666667 |
   | longest_word_len                 | 113              |
   | num_words                        | 6                |
   | num_words_contains_nonword_chars | 6                |
   | num_words_contains_unicode       | 0                |
   | num_words_contains_whitespace    | 6                |
   | shortest_word_len                | 68               |
   +----------------------------------+------------------+
  
  The statistics is available in the C<%STATS> package variable.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/WordList-HTTP-UserAgentString-PERLANCAR>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-WordList-HTTP-UserAgentString-PERLANCAR>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=WordList-HTTP-UserAgentString-PERLANCAR>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2019 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
  
  __DATA__
  Mozilla/5.0 (Windows NT 6.1; WOW64; rv:67.0) Gecko/20100101 Firefox/67.0
  Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36
  Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.90 Safari/537.36
  Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36
  Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.90 Safari/537.36
  Mozilla/5.0 (X11; Linux x86_64; rv:67.0) Gecko/20100101 Firefox/67.0
WORDLIST_HTTP_USERAGENTSTRING_PERLANCAR

    $main::fatpacked{"WordList/Namespace.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'WORDLIST_NAMESPACE';
  package WordList::Namespace;
  
  our $DATE = '2018-04-03'; # DATE
  our $VERSION = '0.4.1'; # VERSION
  
  use strict;
  use warnings;
  
  use Exporter 'import';
  our @EXPORT_OK = qw(is_actual_wordlist_module);
  
  our %WordList_Modules = (
  );
  
  our %WordList_Namespaces = (
      'WordList::Char'            => 1,
      'WordList::Dynamic'         => 1,
      'WordList::MetaSyntactic'   => 1,
      'WordList::Number'          => 1,
      'WordList::Password'        => 1,
      'WordList::Phrase'          => 1,
  );
  
  our $WordList_Namespaces_RE = join(
      '|', map {quotemeta} sort {length($b) <=> length($a)}
          keys %WordList_Namespaces);
  $WordList_Namespaces_RE =
      qr/\A(?:$WordList_Namespaces_RE)(?:::|\z)/;
  
  our %Non_WordList_Modules = (
      'WordList'                  => 1,
      'WordList::MetaSyntactic'   => 1, # base class for WordList::MetaSyntactic::*
      'WordList::Namespace'       => 1, # us!
  );
  
  our %Non_WordList_Namespaces = (
      'WordList::Bloom'           => 1, # to store bloom filters
      'WordList::Mod'             => 1, # mods
  );
  
  our $Non_WordList_Namespaces_RE = join(
      '|', map {quotemeta} sort {length($b) <=> length($a)}
          keys %Non_WordList_Namespaces);
  $Non_WordList_Namespaces_RE =
      qr/\A(?:$Non_WordList_Namespaces_RE)(?:::|\z)/;
  
  sub is_actual_wordlist_module {
      my $mod = shift;
  
      $mod =~ /\AWordList::/ or return 0;
      $WordList_Modules{$mod} and return 3;
      $Non_WordList_Modules{$mod} and return 0;
      $mod =~ $WordList_Namespaces_RE and return 2;
      $mod =~ $Non_WordList_Namespaces_RE and return 0;
      1;
  }
  
  1;
  # ABSTRACT: Catalog of WordList::* namespaces
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  WordList::Namespace - Catalog of WordList::* namespaces
  
  =head1 VERSION
  
  This document describes version 0.4.1 of WordList::Namespace (from Perl distribution WordList), released on 2018-04-03.
  
  =head1 SYNOPSIS
  
   use WordList::Namespace;
  
   my $wl = WordList::Namespace->new;
  
   # Pick a (or several) random word(s) from the list
   my $word = $wl->pick;
   my @words = $wl->pick(3);
  
   # Check if a word exists in the list
   if ($wl->word_exists('foo')) { ... }
  
   # Call a callback for each word
   $wl->each_word(sub { my $word = shift; ... });
  
   # Get all the words
   my @all_words = $wl->all_words;
  
  =head1 DESCRIPTION
  
  This module might be useful if you want to know exactly which C<WordList::*>
  modules actually contain a word list and which contain something else. Initially
  all C<WordList::*> were actual wordlists, but some modules under this namespace
  end up being used for something else.
  
  =head1 FUNCTIONS
  
  =head2 is_actual_wordlist_module
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/WordList>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-WordList>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=WordList>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  Some modules that are known to use this module: L<App::wordlist>.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2018, 2017, 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
WORDLIST_NAMESPACE

    $main::fatpacked{"WordList/Test/OneTwo.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'WORDLIST_TEST_ONETWO';
  package WordList::Test::OneTwo;
  
  our $DATE = '2018-04-03'; # DATE
  our $VERSION = '0.4.1'; # VERSION
  
  use WordList;
  our @ISA = qw(WordList);
  
  our %STATS = ("num_words",2,"shortest_word_len",3,"num_words_contains_unicode",0,"longest_word_len",3,"num_words_contains_nonword_chars",0,"avg_word_len",3,"num_words_contains_whitespace",0); # STATS
  
  1;
  # ABSTRACT: Wordlist that contains "one" and "two"
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  WordList::Test::OneTwo - Wordlist that contains "one" and "two"
  
  =head1 VERSION
  
  This document describes version 0.4.1 of WordList::Test::OneTwo (from Perl distribution WordList), released on 2018-04-03.
  
  =head1 SYNOPSIS
  
   use WordList::Test::OneTwo;
  
   my $wl = WordList::Test::OneTwo->new;
  
   # Pick a (or several) random word(s) from the list
   my $word = $wl->pick;
   my @words = $wl->pick(3);
  
   # Check if a word exists in the list
   if ($wl->word_exists('foo')) { ... }
  
   # Call a callback for each word
   $wl->each_word(sub { my $word = shift; ... });
  
   # Get all the words
   my @all_words = $wl->all_words;
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/WordList>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-WordList>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=WordList>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2018, 2017, 2016 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
  
  __DATA__
  one
  two
WORDLIST_TEST_ONETWO

    $main::fatpacked{"YAML.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'YAML';
  package YAML;
  our $VERSION = '1.29';
  
  use YAML::Mo;
  
  use Exporter;
  push @YAML::ISA, 'Exporter';
  our @EXPORT = qw{ Dump Load };
  our @EXPORT_OK = qw{ freeze thaw DumpFile LoadFile Bless Blessed };
  our (
      $UseCode, $DumpCode, $LoadCode,
      $SpecVersion,
      $UseHeader, $UseVersion, $UseBlock, $UseFold, $UseAliases,
      $Indent, $SortKeys, $Preserve,
      $AnchorPrefix, $CompressSeries, $InlineSeries, $Purity,
      $Stringify, $Numify, $LoadBlessed,
  );
  
  $LoadBlessed = 1;
  
  
  use YAML::Node; # XXX This is a temp fix for Module::Build
  use Scalar::Util qw/ openhandle /;
  
  # XXX This VALUE nonsense needs to go.
  use constant VALUE => "\x07YAML\x07VALUE\x07";
  
  # YAML Object Properties
  has dumper_class => default => sub {'YAML::Dumper'};
  has loader_class => default => sub {'YAML::Loader'};
  has dumper_object => default => sub {$_[0]->init_action_object("dumper")};
  has loader_object => default => sub {$_[0]->init_action_object("loader")};
  
  sub Dump {
      my $yaml = YAML->new;
      $yaml->dumper_class($YAML::DumperClass)
          if $YAML::DumperClass;
      return $yaml->dumper_object->dump(@_);
  }
  
  sub Load {
      my $yaml = YAML->new;
      $yaml->loader_class($YAML::LoaderClass)
          if $YAML::LoaderClass;
      return $yaml->loader_object->load(@_);
  }
  
  {
      no warnings 'once';
      # freeze/thaw is the API for Storable string serialization. Some
      # modules make use of serializing packages on if they use freeze/thaw.
      *freeze = \ &Dump;
      *thaw   = \ &Load;
  }
  
  sub DumpFile {
      my $OUT;
      my $filename = shift;
      if (openhandle $filename) {
          $OUT = $filename;
      }
      else {
          my $mode = '>';
          if ($filename =~ /^\s*(>{1,2})\s*(.*)$/) {
              ($mode, $filename) = ($1, $2);
          }
          open $OUT, $mode, $filename
            or YAML::Mo::Object->die('YAML_DUMP_ERR_FILE_OUTPUT', $filename, "$!");
      }
      binmode $OUT, ':utf8';  # if $Config{useperlio} eq 'define';
      local $/ = "\n"; # reset special to "sane"
      print $OUT Dump(@_);
      unless (ref $filename eq 'GLOB') {
          close $OUT
            or do {
                my $errsav = $!;
                YAML::Mo::Object->die('YAML_DUMP_ERR_FILE_OUTPUT_CLOSE', $filename, $errsav);
            }
      }
  }
  
  sub LoadFile {
      my $IN;
      my $filename = shift;
      if (openhandle $filename) {
          $IN = $filename;
      }
      else {
          open $IN, '<', $filename
            or YAML::Mo::Object->die('YAML_LOAD_ERR_FILE_INPUT', $filename, "$!");
      }
      binmode $IN, ':utf8';  # if $Config{useperlio} eq 'define';
      return Load(do { local $/; <$IN> });
  }
  
  sub init_action_object {
      my $self = shift;
      my $object_class = (shift) . '_class';
      my $module_name = $self->$object_class;
      eval "require $module_name";
      $self->die("Error in require $module_name - $@")
          if $@ and "$@" !~ /Can't locate/;
      my $object = $self->$object_class->new;
      $object->set_global_options;
      return $object;
  }
  
  my $global = {};
  sub Bless {
      require YAML::Dumper::Base;
      YAML::Dumper::Base::bless($global, @_)
  }
  sub Blessed {
      require YAML::Dumper::Base;
      YAML::Dumper::Base::blessed($global, @_)
  }
  sub global_object { $global }
  
  1;
YAML

    $main::fatpacked{"YAML/Any.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'YAML_ANY';
  use strict; use warnings;
  package YAML::Any;
  our $VERSION = '1.29';
  
  use Exporter ();
  
  @YAML::Any::ISA       = 'Exporter';
  @YAML::Any::EXPORT    = qw(Dump Load);
  @YAML::Any::EXPORT_OK = qw(DumpFile LoadFile);
  
  my @dump_options = qw(
      UseCode
      DumpCode
      SpecVersion
      Indent
      UseHeader
      UseVersion
      SortKeys
      AnchorPrefix
      UseBlock
      UseFold
      CompressSeries
      InlineSeries
      UseAliases
      Purity
      Stringify
  );
  
  my @load_options = qw(
      UseCode
      LoadCode
      Preserve
  );
  
  my @implementations = qw(
      YAML::XS
      YAML::Syck
      YAML::Old
      YAML
      YAML::Tiny
  );
  
  sub import {
      __PACKAGE__->implementation;
      goto &Exporter::import;
  }
  
  sub Dump {
      no strict 'refs';
      no warnings 'once';
      my $implementation = __PACKAGE__->implementation;
      for my $option (@dump_options) {
          my $var = "$implementation\::$option";
          my $value = $$var;
          local $$var;
          $$var = defined $value ? $value : ${"YAML::$option"};
      }
      return &{"$implementation\::Dump"}(@_);
  }
  
  sub DumpFile {
      no strict 'refs';
      no warnings 'once';
      my $implementation = __PACKAGE__->implementation;
      for my $option (@dump_options) {
          my $var = "$implementation\::$option";
          my $value = $$var;
          local $$var;
          $$var = defined $value ? $value : ${"YAML::$option"};
      }
      return &{"$implementation\::DumpFile"}(@_);
  }
  
  sub Load {
      no strict 'refs';
      no warnings 'once';
      my $implementation = __PACKAGE__->implementation;
      for my $option (@load_options) {
          my $var = "$implementation\::$option";
          my $value = $$var;
          local $$var;
          $$var = defined $value ? $value : ${"YAML::$option"};
      }
      return &{"$implementation\::Load"}(@_);
  }
  
  sub LoadFile {
      no strict 'refs';
      no warnings 'once';
      my $implementation = __PACKAGE__->implementation;
      for my $option (@load_options) {
          my $var = "$implementation\::$option";
          my $value = $$var;
          local $$var;
          $$var = defined $value ? $value : ${"YAML::$option"};
      }
      return &{"$implementation\::LoadFile"}(@_);
  }
  
  sub order {
      return @YAML::Any::_TEST_ORDER
          if @YAML::Any::_TEST_ORDER;
      return @implementations;
  }
  
  sub implementation {
      my @order = __PACKAGE__->order;
      for my $module (@order) {
          my $path = $module;
          $path =~ s/::/\//g;
          $path .= '.pm';
          return $module if exists $INC{$path};
          eval "require $module; 1" and return $module;
      }
      croak("YAML::Any couldn't find any of these YAML implementations: @order");
  }
  
  sub croak {
      require Carp;
      Carp::croak(@_);
  }
  
  1;
YAML_ANY

    $main::fatpacked{"YAML/Dumper.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'YAML_DUMPER';
  package YAML::Dumper;
  
  use YAML::Mo;
  extends 'YAML::Dumper::Base';
  
  use YAML::Dumper::Base;
  use YAML::Node;
  use YAML::Types;
  use Scalar::Util qw();
  use B ();
  use Carp ();
  
  # Context constants
  use constant KEY       => 3;
  use constant BLESSED   => 4;
  use constant FROMARRAY => 5;
  use constant VALUE     => "\x07YAML\x07VALUE\x07";
  
  # Common YAML character sets
  my $ESCAPE_CHAR = '[\\x00-\\x08\\x0b-\\x0d\\x0e-\\x1f]';
  my $LIT_CHAR    = '|';
  
  #==============================================================================
  # OO version of Dump. YAML->new->dump($foo);
  sub dump {
      my $self = shift;
      $self->stream('');
      $self->document(0);
      for my $document (@_) {
          $self->{document}++;
          $self->transferred({});
          $self->id_refcnt({});
          $self->id_anchor({});
          $self->anchor(1);
          $self->level(0);
          $self->offset->[0] = 0 - $self->indent_width;
          $self->_prewalk($document);
          $self->_emit_header($document);
          $self->_emit_node($document);
      }
      return $self->stream;
  }
  
  # Every YAML document in the stream must begin with a YAML header, unless
  # there is only a single document and the user requests "no header".
  sub _emit_header {
      my $self = shift;
      my ($node) = @_;
      if (not $self->use_header and
          $self->document == 1
         ) {
          $self->die('YAML_DUMP_ERR_NO_HEADER')
            unless ref($node) =~ /^(HASH|ARRAY)$/;
          $self->die('YAML_DUMP_ERR_NO_HEADER')
            if ref($node) eq 'HASH' and keys(%$node) == 0;
          $self->die('YAML_DUMP_ERR_NO_HEADER')
            if ref($node) eq 'ARRAY' and @$node == 0;
          # XXX Also croak if aliased, blessed, or ynode
          $self->headless(1);
          return;
      }
      $self->{stream} .= '---';
  # XXX Consider switching to 1.1 style
      if ($self->use_version) {
  #         $self->{stream} .= " #YAML:1.0";
      }
  }
  
  # Walk the tree to be dumped and keep track of its reference counts.
  # This function is where the Dumper does all its work. All type
  # transfers happen here.
  sub _prewalk {
      my $self = shift;
      my $stringify = $self->stringify;
      my ($class, $type, $node_id) = $self->node_info(\$_[0], $stringify);
  
      # Handle typeglobs
      if ($type eq 'GLOB') {
          $self->transferred->{$node_id} =
            YAML::Type::glob->yaml_dump($_[0]);
          $self->_prewalk($self->transferred->{$node_id});
          return;
      }
  
      # Handle regexps
      if (ref($_[0]) eq 'Regexp') {
          return;
      }
  
      # Handle Purity for scalars.
      # XXX can't find a use case yet. Might be YAGNI.
      if (not ref $_[0]) {
          $self->{id_refcnt}{$node_id}++ if $self->purity;
          return;
      }
  
      # Make a copy of original
      my $value = $_[0];
      ($class, $type, $node_id) = $self->node_info($value, $stringify);
  
      # Must be a stringified object.
      return if (ref($value) and not $type);
  
      # Look for things already transferred.
      if ($self->transferred->{$node_id}) {
          (undef, undef, $node_id) = (ref $self->transferred->{$node_id})
            ? $self->node_info($self->transferred->{$node_id}, $stringify)
            : $self->node_info(\ $self->transferred->{$node_id}, $stringify);
          $self->{id_refcnt}{$node_id}++;
          return;
      }
  
      # Handle code refs
      if ($type eq 'CODE') {
          $self->transferred->{$node_id} = 'placeholder';
          YAML::Type::code->yaml_dump(
              $self->dump_code,
              $_[0],
              $self->transferred->{$node_id}
          );
          ($class, $type, $node_id) =
            $self->node_info(\ $self->transferred->{$node_id}, $stringify);
          $self->{id_refcnt}{$node_id}++;
          return;
      }
  
      # Handle blessed things
      if (defined $class) {
          if ($value->can('yaml_dump')) {
              $value = $value->yaml_dump;
          }
          elsif ($type eq 'SCALAR') {
              $self->transferred->{$node_id} = 'placeholder';
              YAML::Type::blessed->yaml_dump
                ($_[0], $self->transferred->{$node_id});
              ($class, $type, $node_id) =
                $self->node_info(\ $self->transferred->{$node_id}, $stringify);
              $self->{id_refcnt}{$node_id}++;
              return;
          }
          else {
              $value = YAML::Type::blessed->yaml_dump($value);
          }
          $self->transferred->{$node_id} = $value;
          (undef, $type, $node_id) = $self->node_info($value, $stringify);
      }
  
      # Handle YAML Blessed things
      require YAML;
      if (defined YAML->global_object()->{blessed_map}{$node_id}) {
          $value = YAML->global_object()->{blessed_map}{$node_id};
          $self->transferred->{$node_id} = $value;
          ($class, $type, $node_id) = $self->node_info($value, $stringify);
          $self->_prewalk($value);
          return;
      }
  
      # Handle hard refs
      if ($type eq 'REF' or $type eq 'SCALAR') {
          $value = YAML::Type::ref->yaml_dump($value);
          $self->transferred->{$node_id} = $value;
          (undef, $type, $node_id) = $self->node_info($value, $stringify);
      }
  
      # Handle ref-to-glob's
      elsif ($type eq 'GLOB') {
          my $ref_ynode = $self->transferred->{$node_id} =
            YAML::Type::ref->yaml_dump($value);
  
          my $glob_ynode = $ref_ynode->{&VALUE} =
            YAML::Type::glob->yaml_dump($$value);
  
          (undef, undef, $node_id) = $self->node_info($glob_ynode, $stringify);
          $self->transferred->{$node_id} = $glob_ynode;
          $self->_prewalk($glob_ynode);
          return;
      }
  
      # Increment ref count for node
      return if ++($self->{id_refcnt}{$node_id}) > 1;
  
      # Keep on walking
      if ($type eq 'HASH') {
          $self->_prewalk($value->{$_})
              for keys %{$value};
          return;
      }
      elsif ($type eq 'ARRAY') {
          $self->_prewalk($_)
              for @{$value};
          return;
      }
  
      # Unknown type. Need to know about it.
      $self->warn(<<"...");
  YAML::Dumper can't handle dumping this type of data.
  Please report this to the author.
  
  id:    $node_id
  type:  $type
  class: $class
  value: $value
  
  ...
  
      return;
  }
  
  # Every data element and sub data element is a node.
  # Everything emitted goes through this function.
  sub _emit_node {
      my $self = shift;
      my ($type, $node_id);
      my $ref = ref($_[0]);
      if ($ref) {
          if ($ref eq 'Regexp') {
              $self->_emit(' !!perl/regexp');
              $self->_emit_str("$_[0]");
              return;
          }
          (undef, $type, $node_id) = $self->node_info($_[0], $self->stringify);
      }
      else {
          $type = $ref || 'SCALAR';
          (undef, undef, $node_id) = $self->node_info(\$_[0], $self->stringify);
      }
  
      my ($ynode, $tag) = ('') x 2;
      my ($value, $context) = (@_, 0);
  
      if (defined $self->transferred->{$node_id}) {
          $value = $self->transferred->{$node_id};
          $ynode = ynode($value);
          if (ref $value) {
              $tag = defined $ynode ? $ynode->tag->short : '';
              (undef, $type, $node_id) =
                $self->node_info($value, $self->stringify);
          }
          else {
              $ynode = ynode($self->transferred->{$node_id});
              $tag = defined $ynode ? $ynode->tag->short : '';
              $type = 'SCALAR';
              (undef, undef, $node_id) =
                $self->node_info(
                    \ $self->transferred->{$node_id},
                    $self->stringify
                );
          }
      }
      elsif ($ynode = ynode($value)) {
          $tag = $ynode->tag->short;
      }
  
      if ($self->use_aliases) {
          $self->{id_refcnt}{$node_id} ||= 0;
          if ($self->{id_refcnt}{$node_id} > 1) {
              if (defined $self->{id_anchor}{$node_id}) {
                  $self->{stream} .= ' *' . $self->{id_anchor}{$node_id} . "\n";
                  return;
              }
              my $anchor = $self->anchor_prefix . $self->{anchor}++;
              $self->{stream} .= ' &' . $anchor;
              $self->{id_anchor}{$node_id} = $anchor;
          }
      }
  
      return $self->_emit_str("$value")   # Stringified object
        if ref($value) and not $type;
      return $self->_emit_scalar($value, $tag)
        if $type eq 'SCALAR' and $tag;
      return $self->_emit_str($value)
        if $type eq 'SCALAR';
      return $self->_emit_mapping($value, $tag, $node_id, $context)
        if $type eq 'HASH';
      return $self->_emit_sequence($value, $tag)
        if $type eq 'ARRAY';
      $self->warn('YAML_DUMP_WARN_BAD_NODE_TYPE', $type);
      return $self->_emit_str("$value");
  }
  
  # A YAML mapping is akin to a Perl hash.
  sub _emit_mapping {
      my $self = shift;
      my ($value, $tag, $node_id, $context) = @_;
      $self->{stream} .= " !$tag" if $tag;
  
      # Sometimes 'keys' fails. Like on a bad tie implementation.
      my $empty_hash = not(eval {keys %$value});
      $self->warn('YAML_EMIT_WARN_KEYS', $@) if $@;
      return ($self->{stream} .= " {}\n") if $empty_hash;
  
      # If CompressSeries is on (default) and legal is this context, then
      # use it and make the indent level be 2 for this node.
      if ($context == FROMARRAY and
          $self->compress_series and
          not (defined $self->{id_anchor}{$node_id} or $tag or $empty_hash)
         ) {
          $self->{stream} .= ' ';
          $self->offset->[$self->level+1] = $self->offset->[$self->level] + 2;
      }
      else {
          $context = 0;
          $self->{stream} .= "\n"
            unless $self->headless && not($self->headless(0));
          $self->offset->[$self->level+1] =
            $self->offset->[$self->level] + $self->indent_width;
      }
  
      $self->{level}++;
      my @keys;
      if ($self->sort_keys == 1) {
          if (ynode($value)) {
              @keys = keys %$value;
          }
          else {
              @keys = sort keys %$value;
          }
      }
      elsif ($self->sort_keys == 2) {
          @keys = sort keys %$value;
      }
      # XXX This is hackish but sometimes handy. Not sure whether to leave it in.
      elsif (ref($self->sort_keys) eq 'ARRAY') {
          my $i = 1;
          my %order = map { ($_, $i++) } @{$self->sort_keys};
          @keys = sort {
              (defined $order{$a} and defined $order{$b})
                ? ($order{$a} <=> $order{$b})
                : ($a cmp $b);
          } keys %$value;
      }
      else {
          @keys = keys %$value;
      }
      # Force the YAML::VALUE ('=') key to sort last.
      if (exists $value->{&VALUE}) {
          for (my $i = 0; $i < @keys; $i++) {
              if ($keys[$i] eq &VALUE) {
                  splice(@keys, $i, 1);
                  push @keys, &VALUE;
                  last;
              }
          }
      }
  
      for my $key (@keys) {
          $self->_emit_key($key, $context);
          $context = 0;
          $self->{stream} .= ':';
          $self->_emit_node($value->{$key});
      }
      $self->{level}--;
  }
  
  # A YAML series is akin to a Perl array.
  sub _emit_sequence {
      my $self = shift;
      my ($value, $tag) = @_;
      $self->{stream} .= " !$tag" if $tag;
  
      return ($self->{stream} .= " []\n") if @$value == 0;
  
      $self->{stream} .= "\n"
        unless $self->headless && not($self->headless(0));
  
      # XXX Really crufty feature. Better implemented by ynodes.
      if ($self->inline_series and
          @$value <= $self->inline_series and
          not (scalar grep {ref or /\n/} @$value)
         ) {
          $self->{stream} =~ s/\n\Z/ /;
          $self->{stream} .= '[';
          for (my $i = 0; $i < @$value; $i++) {
              $self->_emit_str($value->[$i], KEY);
              last if $i == $#{$value};
              $self->{stream} .= ', ';
          }
          $self->{stream} .= "]\n";
          return;
      }
  
      $self->offset->[$self->level + 1] =
        $self->offset->[$self->level] + $self->indent_width;
      $self->{level}++;
      for my $val (@$value) {
          $self->{stream} .= ' ' x $self->offset->[$self->level];
          $self->{stream} .= '-';
          $self->_emit_node($val, FROMARRAY);
      }
      $self->{level}--;
  }
  
  # Emit a mapping key
  sub _emit_key {
      my $self = shift;
      my ($value, $context) = @_;
      $self->{stream} .= ' ' x $self->offset->[$self->level]
        unless $context == FROMARRAY;
      $self->_emit_str($value, KEY);
  }
  
  # Emit a blessed SCALAR
  sub _emit_scalar {
      my $self = shift;
      my ($value, $tag) = @_;
      $self->{stream} .= " !$tag";
      $self->_emit_str($value, BLESSED);
  }
  
  sub _emit {
      my $self = shift;
      $self->{stream} .= join '', @_;
  }
  
  # Emit a string value. YAML has many scalar styles. This routine attempts to
  # guess the best style for the text.
  sub _emit_str {
      my $self = shift;
      my $type = $_[1] || 0;
  
      # Use heuristics to find the best scalar emission style.
      $self->offset->[$self->level + 1] =
        $self->offset->[$self->level] + $self->indent_width;
      $self->{level}++;
  
      my $sf = $type == KEY ? '' : ' ';
      my $sb = $type == KEY ? '? ' : ' ';
      my $ef = $type == KEY ? '' : "\n";
      my $eb = "\n";
  
      while (1) {
          $self->_emit($sf),
          $self->_emit_plain($_[0]),
          $self->_emit($ef), last
            if not defined $_[0];
          $self->_emit($sf, '=', $ef), last
            if $_[0] eq VALUE;
          $self->_emit($sf),
          $self->_emit_double($_[0]),
          $self->_emit($ef), last
            if $_[0] =~ /$ESCAPE_CHAR/;
          if ($_[0] =~ /\n/) {
              $self->_emit($sb),
              $self->_emit_block($LIT_CHAR, $_[0]),
              $self->_emit($eb), last
                if $self->use_block;
                Carp::cluck "[YAML] \$UseFold is no longer supported"
                if $self->use_fold;
              $self->_emit($sf),
              $self->_emit_double($_[0]),
              $self->_emit($ef), last
                if length $_[0] <= 30;
              $self->_emit($sf),
              $self->_emit_double($_[0]),
              $self->_emit($ef), last
                if $_[0] !~ /\n\s*\S/;
              $self->_emit($sb),
              $self->_emit_block($LIT_CHAR, $_[0]),
              $self->_emit($eb), last;
          }
          $self->_emit($sf),
          $self->_emit_number($_[0]),
          $self->_emit($ef), last
            if $self->is_literal_number($_[0]);
          $self->_emit($sf),
          $self->_emit_plain($_[0]),
          $self->_emit($ef), last
            if $self->is_valid_plain($_[0]);
          $self->_emit($sf),
          $self->_emit_double($_[0]),
          $self->_emit($ef), last
            if $_[0] =~ /'/;
          $self->_emit($sf),
          $self->_emit_single($_[0]),
          $self->_emit($ef);
          last;
      }
  
      $self->{level}--;
  
      return;
  }
  
  sub is_literal_number {
      my $self = shift;
      # Stolen from JSON::Tiny
      return B::svref_2object(\$_[0])->FLAGS & (B::SVp_IOK | B::SVp_NOK)
              && 0 + $_[0] eq $_[0];
  }
  
  sub _emit_number {
      my $self = shift;
      return $self->_emit_plain($_[0]);
  }
  
  # Check whether or not a scalar should be emitted as an plain scalar.
  sub is_valid_plain {
      my $self = shift;
      return 0 unless length $_[0];
      return 0 if $self->quote_numeric_strings and Scalar::Util::looks_like_number($_[0]);
      # refer to YAML::Loader::parse_inline_simple()
      return 0 if $_[0] =~ /^[\s\{\[\~\`\'\"\!\@\#\>\|\%\&\?\*\^]/;
      return 0 if $_[0] =~ /[\{\[\]\},]/;
      return 0 if $_[0] =~ /[:\-\?]\s/;
      return 0 if $_[0] =~ /\s#/;
      return 0 if $_[0] =~ /\:(\s|$)/;
      return 0 if $_[0] =~ /[\s\|\>]$/;
      return 0 if $_[0] eq '-';
      return 0 if $_[0] eq '=';
      return 1;
  }
  
  sub _emit_block {
      my $self = shift;
      my ($indicator, $value) = @_;
      $self->{stream} .= $indicator;
      $value =~ /(\n*)\Z/;
      my $chomp = length $1 ? (length $1 > 1) ? '+' : '' : '-';
      $value = '~' if not defined $value;
      $self->{stream} .= $chomp;
      $self->{stream} .= $self->indent_width if $value =~ /^\s/;
      $self->{stream} .= $self->indent($value);
  }
  
  # Plain means that the scalar is unquoted.
  sub _emit_plain {
      my $self = shift;
      $self->{stream} .= defined $_[0] ? $_[0] : '~';
  }
  
  # Double quoting is for single lined escaped strings.
  sub _emit_double {
      my $self = shift;
      (my $escaped = $self->escape($_[0])) =~ s/"/\\"/g;
      $self->{stream} .= qq{"$escaped"};
  }
  
  # Single quoting is for single lined unescaped strings.
  sub _emit_single {
      my $self = shift;
      my $item = shift;
      $item =~ s{'}{''}g;
      $self->{stream} .= "'$item'";
  }
  
  #==============================================================================
  # Utility subroutines.
  #==============================================================================
  
  # Indent a scalar to the current indentation level.
  sub indent {
      my $self = shift;
      my ($text) = @_;
      return $text unless length $text;
      $text =~ s/\n\Z//;
      my $indent = ' ' x $self->offset->[$self->level];
      $text =~ s/^/$indent/gm;
      $text = "\n$text";
      return $text;
  }
  
  # Escapes for unprintable characters
  my @escapes = qw(\0   \x01 \x02 \x03 \x04 \x05 \x06 \a
                   \x08 \t   \n   \v   \f   \r   \x0e \x0f
                   \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17
                   \x18 \x19 \x1a \e   \x1c \x1d \x1e \x1f
                  );
  
  # Escape the unprintable characters
  sub escape {
      my $self = shift;
      my ($text) = @_;
      $text =~ s/\\/\\\\/g;
      $text =~ s/([\x00-\x1f])/$escapes[ord($1)]/ge;
      return $text;
  }
  
  1;
YAML_DUMPER

    $main::fatpacked{"YAML/Dumper/Base.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'YAML_DUMPER_BASE';
  package YAML::Dumper::Base;
  
  use YAML::Mo;
  
  use YAML::Node;
  
  # YAML Dumping options
  has spec_version    => default => sub {'1.0'};
  has indent_width    => default => sub {2};
  has use_header      => default => sub {1};
  has use_version     => default => sub {0};
  has sort_keys       => default => sub {1};
  has anchor_prefix   => default => sub {''};
  has dump_code       => default => sub {0};
  has use_block       => default => sub {0};
  has use_fold        => default => sub {0};
  has compress_series => default => sub {1};
  has inline_series   => default => sub {0};
  has use_aliases     => default => sub {1};
  has purity          => default => sub {0};
  has stringify       => default => sub {0};
  has quote_numeric_strings => default => sub {0};
  
  # Properties
  has stream      => default => sub {''};
  has document    => default => sub {0};
  has transferred => default => sub {{}};
  has id_refcnt   => default => sub {{}};
  has id_anchor   => default => sub {{}};
  has anchor      => default => sub {1};
  has level       => default => sub {0};
  has offset      => default => sub {[]};
  has headless    => default => sub {0};
  has blessed_map => default => sub {{}};
  
  # Global Options are an idea taken from Data::Dumper. Really they are just
  # sugar on top of real OO properties. They make the simple Dump/Load API
  # easy to configure.
  sub set_global_options {
      my $self = shift;
      $self->spec_version($YAML::SpecVersion)
        if defined $YAML::SpecVersion;
      $self->indent_width($YAML::Indent)
        if defined $YAML::Indent;
      $self->use_header($YAML::UseHeader)
        if defined $YAML::UseHeader;
      $self->use_version($YAML::UseVersion)
        if defined $YAML::UseVersion;
      $self->sort_keys($YAML::SortKeys)
        if defined $YAML::SortKeys;
      $self->anchor_prefix($YAML::AnchorPrefix)
        if defined $YAML::AnchorPrefix;
      $self->dump_code($YAML::DumpCode || $YAML::UseCode)
        if defined $YAML::DumpCode or defined $YAML::UseCode;
      $self->use_block($YAML::UseBlock)
        if defined $YAML::UseBlock;
      $self->use_fold($YAML::UseFold)
        if defined $YAML::UseFold;
      $self->compress_series($YAML::CompressSeries)
        if defined $YAML::CompressSeries;
      $self->inline_series($YAML::InlineSeries)
        if defined $YAML::InlineSeries;
      $self->use_aliases($YAML::UseAliases)
        if defined $YAML::UseAliases;
      $self->purity($YAML::Purity)
        if defined $YAML::Purity;
      $self->stringify($YAML::Stringify)
        if defined $YAML::Stringify;
      $self->quote_numeric_strings($YAML::QuoteNumericStrings)
        if defined $YAML::QuoteNumericStrings;
  }
  
  sub dump {
      my $self = shift;
      $self->die('dump() not implemented in this class.');
  }
  
  sub blessed {
      my $self = shift;
      my ($ref) = @_;
      $ref = \$_[0] unless ref $ref;
      my (undef, undef, $node_id) = YAML::Mo::Object->node_info($ref);
      $self->{blessed_map}->{$node_id};
  }
  
  sub bless {
      my $self = shift;
      my ($ref, $blessing) = @_;
      my $ynode;
      $ref = \$_[0] unless ref $ref;
      my (undef, undef, $node_id) = YAML::Mo::Object->node_info($ref);
      if (not defined $blessing) {
          $ynode = YAML::Node->new($ref);
      }
      elsif (ref $blessing) {
          $self->die() unless ynode($blessing);
          $ynode = $blessing;
      }
      else {
          no strict 'refs';
          my $transfer = $blessing . "::yaml_dump";
          $self->die() unless defined &{$transfer};
          $ynode = &{$transfer}($ref);
          $self->die() unless ynode($ynode);
      }
      $self->{blessed_map}->{$node_id} = $ynode;
      my $object = ynode($ynode) or $self->die();
      return $object;
  }
  
  1;
YAML_DUMPER_BASE

    $main::fatpacked{"YAML/Error.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'YAML_ERROR';
  package YAML::Error;
  
  use YAML::Mo;
  
  has 'code';
  has 'type' => default => sub {'Error'};
  has 'line';
  has 'document';
  has 'arguments' => default => sub {[]};
  
  my ($error_messages, %line_adjust);
  
  sub format_message {
      my $self = shift;
      my $output = 'YAML ' . $self->type . ': ';
      my $code = $self->code;
      if ($error_messages->{$code}) {
          $code = sprintf($error_messages->{$code}, @{$self->arguments});
      }
      $output .= $code . "\n";
  
      $output .= '   Code: ' . $self->code . "\n"
          if defined $self->code;
      $output .= '   Line: ' . $self->line . "\n"
          if defined $self->line;
      $output .= '   Document: ' . $self->document . "\n"
          if defined $self->document;
      return $output;
  }
  
  sub error_messages {
      $error_messages;
  }
  
  %$error_messages = map {s/^\s+//;s/\\n/\n/;$_} split "\n", <<'...';
  YAML_PARSE_ERR_BAD_CHARS
    Invalid characters in stream. This parser only supports printable ASCII
  YAML_PARSE_ERR_BAD_MAJOR_VERSION
    Can't parse a %s document with a 1.0 parser
  YAML_PARSE_WARN_BAD_MINOR_VERSION
    Parsing a %s document with a 1.0 parser
  YAML_PARSE_WARN_MULTIPLE_DIRECTIVES
    '%s directive used more than once'
  YAML_PARSE_ERR_TEXT_AFTER_INDICATOR
    No text allowed after indicator
  YAML_PARSE_ERR_NO_ANCHOR
    No anchor for alias '*%s'
  YAML_PARSE_ERR_NO_SEPARATOR
    Expected separator '---'
  YAML_PARSE_ERR_SINGLE_LINE
    Couldn't parse single line value
  YAML_PARSE_ERR_BAD_ANCHOR
    Invalid anchor
  YAML_DUMP_ERR_INVALID_INDENT
    Invalid Indent width specified: '%s'
  YAML_LOAD_USAGE
    usage: YAML::Load($yaml_stream_scalar)
  YAML_PARSE_ERR_BAD_NODE
    Can't parse node
  YAML_PARSE_ERR_BAD_EXPLICIT
    Unsupported explicit transfer: '%s'
  YAML_DUMP_USAGE_DUMPCODE
    Invalid value for DumpCode: '%s'
  YAML_LOAD_ERR_FILE_INPUT
    Couldn't open %s for input:\n%s
  YAML_DUMP_ERR_FILE_CONCATENATE
    Can't concatenate to YAML file %s
  YAML_DUMP_ERR_FILE_OUTPUT
    Couldn't open %s for output:\n%s
  YAML_DUMP_ERR_FILE_OUTPUT_CLOSE
    Error closing %s:\n%s
  YAML_DUMP_ERR_NO_HEADER
    With UseHeader=0, the node must be a plain hash or array
  YAML_DUMP_WARN_BAD_NODE_TYPE
    Can't perform serialization for node type: '%s'
  YAML_EMIT_WARN_KEYS
    Encountered a problem with 'keys':\n%s
  YAML_DUMP_WARN_DEPARSE_FAILED
    Deparse failed for CODE reference
  YAML_DUMP_WARN_CODE_DUMMY
    Emitting dummy subroutine for CODE reference
  YAML_PARSE_ERR_MANY_EXPLICIT
    More than one explicit transfer
  YAML_PARSE_ERR_MANY_IMPLICIT
    More than one implicit request
  YAML_PARSE_ERR_MANY_ANCHOR
    More than one anchor
  YAML_PARSE_ERR_ANCHOR_ALIAS
    Can't define both an anchor and an alias
  YAML_PARSE_ERR_BAD_ALIAS
    Invalid alias
  YAML_PARSE_ERR_MANY_ALIAS
    More than one alias
  YAML_LOAD_ERR_NO_CONVERT
    Can't convert implicit '%s' node to explicit '%s' node
  YAML_LOAD_ERR_NO_DEFAULT_VALUE
    No default value for '%s' explicit transfer
  YAML_LOAD_ERR_NON_EMPTY_STRING
    Only the empty string can be converted to a '%s'
  YAML_LOAD_ERR_BAD_MAP_TO_SEQ
    Can't transfer map as sequence. Non numeric key '%s' encountered.
  YAML_DUMP_ERR_BAD_GLOB
    '%s' is an invalid value for Perl glob
  YAML_DUMP_ERR_BAD_REGEXP
    '%s' is an invalid value for Perl Regexp
  YAML_LOAD_ERR_BAD_MAP_ELEMENT
    Invalid element in map
  YAML_LOAD_WARN_DUPLICATE_KEY
    Duplicate map key '%s' found. Ignoring.
  YAML_LOAD_ERR_BAD_SEQ_ELEMENT
    Invalid element in sequence
  YAML_PARSE_ERR_INLINE_MAP
    Can't parse inline map
  YAML_PARSE_ERR_INLINE_SEQUENCE
    Can't parse inline sequence
  YAML_PARSE_ERR_BAD_DOUBLE
    Can't parse double quoted string
  YAML_PARSE_ERR_BAD_SINGLE
    Can't parse single quoted string
  YAML_PARSE_ERR_BAD_INLINE_IMPLICIT
    Can't parse inline implicit value '%s'
  YAML_PARSE_ERR_BAD_IMPLICIT
    Unrecognized implicit value '%s'
  YAML_PARSE_ERR_INDENTATION
    Error. Invalid indentation level
  YAML_PARSE_ERR_INCONSISTENT_INDENTATION
    Inconsistent indentation level
  YAML_LOAD_WARN_UNRESOLVED_ALIAS
    Can't resolve alias *%s
  YAML_LOAD_WARN_NO_REGEXP_IN_REGEXP
    No 'REGEXP' element for Perl regexp
  YAML_LOAD_WARN_BAD_REGEXP_ELEM
    Unknown element '%s' in Perl regexp
  YAML_LOAD_WARN_GLOB_NAME
    No 'NAME' element for Perl glob
  YAML_LOAD_WARN_PARSE_CODE
    Couldn't parse Perl code scalar: %s
  YAML_LOAD_WARN_CODE_DEPARSE
    Won't parse Perl code unless $YAML::LoadCode is set
  YAML_EMIT_ERR_BAD_LEVEL
    Internal Error: Bad level detected
  YAML_PARSE_WARN_AMBIGUOUS_TAB
    Amibiguous tab converted to spaces
  YAML_LOAD_WARN_BAD_GLOB_ELEM
    Unknown element '%s' in Perl glob
  YAML_PARSE_ERR_ZERO_INDENT
    Can't use zero as an indentation width
  YAML_LOAD_WARN_GLOB_IO
    Can't load an IO filehandle. Yet!!!
  ...
  
  %line_adjust = map {($_, 1)}
    qw(YAML_PARSE_ERR_BAD_MAJOR_VERSION
       YAML_PARSE_WARN_BAD_MINOR_VERSION
       YAML_PARSE_ERR_TEXT_AFTER_INDICATOR
       YAML_PARSE_ERR_NO_ANCHOR
       YAML_PARSE_ERR_MANY_EXPLICIT
       YAML_PARSE_ERR_MANY_IMPLICIT
       YAML_PARSE_ERR_MANY_ANCHOR
       YAML_PARSE_ERR_ANCHOR_ALIAS
       YAML_PARSE_ERR_BAD_ALIAS
       YAML_PARSE_ERR_MANY_ALIAS
       YAML_LOAD_ERR_NO_CONVERT
       YAML_LOAD_ERR_NO_DEFAULT_VALUE
       YAML_LOAD_ERR_NON_EMPTY_STRING
       YAML_LOAD_ERR_BAD_MAP_TO_SEQ
       YAML_LOAD_ERR_BAD_STR_TO_INT
       YAML_LOAD_ERR_BAD_STR_TO_DATE
       YAML_LOAD_ERR_BAD_STR_TO_TIME
       YAML_LOAD_WARN_DUPLICATE_KEY
       YAML_PARSE_ERR_INLINE_MAP
       YAML_PARSE_ERR_INLINE_SEQUENCE
       YAML_PARSE_ERR_BAD_DOUBLE
       YAML_PARSE_ERR_BAD_SINGLE
       YAML_PARSE_ERR_BAD_INLINE_IMPLICIT
       YAML_PARSE_ERR_BAD_IMPLICIT
       YAML_LOAD_WARN_NO_REGEXP_IN_REGEXP
       YAML_LOAD_WARN_BAD_REGEXP_ELEM
       YAML_LOAD_WARN_REGEXP_CREATE
       YAML_LOAD_WARN_GLOB_NAME
       YAML_LOAD_WARN_PARSE_CODE
       YAML_LOAD_WARN_CODE_DEPARSE
       YAML_LOAD_WARN_BAD_GLOB_ELEM
       YAML_PARSE_ERR_ZERO_INDENT
      );
  
  package YAML::Warning;
  
  our @ISA = 'YAML::Error';
  
  1;
YAML_ERROR

    $main::fatpacked{"YAML/Loader.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'YAML_LOADER';
  package YAML::Loader;
  
  use YAML::Mo;
  extends 'YAML::Loader::Base';
  
  use YAML::Loader::Base;
  use YAML::Types;
  use YAML::Node;
  
  # Context constants
  use constant LEAF       => 1;
  use constant COLLECTION => 2;
  use constant VALUE      => "\x07YAML\x07VALUE\x07";
  use constant COMMENT    => "\x07YAML\x07COMMENT\x07";
  
  # Common YAML character sets
  my $ESCAPE_CHAR = '[\\x00-\\x08\\x0b-\\x0d\\x0e-\\x1f]';
  my $FOLD_CHAR   = '>';
  my $LIT_CHAR    = '|';
  my $LIT_CHAR_RX = "\\$LIT_CHAR";
  
  sub load {
      my $self = shift;
      $self->stream($_[0] || '');
      return $self->_parse();
  }
  
  # Top level function for parsing. Parse each document in order and
  # handle processing for YAML headers.
  sub _parse {
      my $self = shift;
      my (%directives, $preface);
      $self->{stream} =~ s|\015\012|\012|g;
      $self->{stream} =~ s|\015|\012|g;
      $self->line(0);
      $self->die('YAML_PARSE_ERR_BAD_CHARS')
        if $self->stream =~ /$ESCAPE_CHAR/;
      $self->{stream} =~ s/(.)\n\Z/$1/s;
      $self->lines([split /\x0a/, $self->stream, -1]);
      $self->line(1);
      # Throw away any comments or blanks before the header (or start of
      # content for headerless streams)
      $self->_parse_throwaway_comments();
      $self->document(0);
      $self->documents([]);
      $self->zero_indent([]);
      # Add an "assumed" header if there is no header and the stream is
      # not empty (after initial throwaways).
      if (not $self->eos) {
          if ($self->lines->[0] !~ /^---(\s|$)/) {
              unshift @{$self->lines}, '---';
              $self->{line}--;
          }
      }
  
      # Main Loop. Parse out all the top level nodes and return them.
      while (not $self->eos) {
          $self->anchor2node({});
          $self->{document}++;
          $self->done(0);
          $self->level(0);
          $self->offset->[0] = -1;
  
          if ($self->lines->[0] =~ /^---\s*(.*)$/) {
              my @words = split /\s/, $1;
              %directives = ();
              while (@words) {
                  if ($words[0] =~ /^#(\w+):(\S.*)$/) {
                      my ($key, $value) = ($1, $2);
                      shift(@words);
                      if (defined $directives{$key}) {
                          $self->warn('YAML_PARSE_WARN_MULTIPLE_DIRECTIVES',
                            $key, $self->document);
                          next;
                      }
                      $directives{$key} = $value;
                  }
                  elsif ($words[0] eq '') {
                      shift @words;
                  }
                  else {
                      last;
                  }
              }
              $self->preface(join ' ', @words);
          }
          else {
              $self->die('YAML_PARSE_ERR_NO_SEPARATOR');
          }
  
          if (not $self->done) {
              $self->_parse_next_line(COLLECTION);
          }
          if ($self->done) {
              $self->{indent} = -1;
              $self->content('');
          }
  
          $directives{YAML} ||= '1.0';
          $directives{TAB} ||= 'NONE';
          ($self->{major_version}, $self->{minor_version}) =
            split /\./, $directives{YAML}, 2;
          $self->die('YAML_PARSE_ERR_BAD_MAJOR_VERSION', $directives{YAML})
            if $self->major_version ne '1';
          $self->warn('YAML_PARSE_WARN_BAD_MINOR_VERSION', $directives{YAML})
            if $self->minor_version ne '0';
          $self->die('Unrecognized TAB policy')
            unless $directives{TAB} =~ /^(NONE|\d+)(:HARD)?$/;
  
          push @{$self->documents}, $self->_parse_node();
      }
      return wantarray ? @{$self->documents} : $self->documents->[-1];
  }
  
  # This function is the dispatcher for parsing each node. Every node
  # recurses back through here. (Inlines are an exception as they have
  # their own sub-parser.)
  sub _parse_node {
      my $self = shift;
      my $preface = $self->preface;
      $self->preface('');
      my ($node, $type, $indicator, $chomp, $parsed_inline) = ('') x 5;
      my ($anchor, $alias, $explicit, $implicit) = ('') x 4;
      ($anchor, $alias, $explicit, $implicit, $preface) =
        $self->_parse_qualifiers($preface);
      if ($anchor) {
          $self->anchor2node->{$anchor} = CORE::bless [], 'YAML-anchor2node';
      }
      $self->inline('');
      while (length $preface) {
          if ($preface =~ s/^($FOLD_CHAR|$LIT_CHAR_RX)//) {
              $indicator = $1;
              if ($preface =~ s/^([+-])[0-9]*//) {
                  $chomp = $1;
              }
              elsif ($preface =~ s/^[0-9]+([+-]?)//) {
                  $chomp = $1;
              }
              if ($preface =~ s/^(?:\s+#.*$|\s*)$//) {
              }
              else {
                  $self->die('YAML_PARSE_ERR_TEXT_AFTER_INDICATOR');
              }
          }
          else {
              $self->inline($preface);
              $preface = '';
          }
      }
      if ($alias) {
          $self->die('YAML_PARSE_ERR_NO_ANCHOR', $alias)
            unless defined $self->anchor2node->{$alias};
          if (ref($self->anchor2node->{$alias}) ne 'YAML-anchor2node') {
              $node = $self->anchor2node->{$alias};
          }
          else {
              $node = do {my $sv = "*$alias"};
              push @{$self->anchor2node->{$alias}}, [\$node, $self->line];
          }
      }
      elsif (length $self->inline) {
          $node = $self->_parse_inline(1, $implicit, $explicit);
          $parsed_inline = 1;
          if (length $self->inline) {
              $self->die('YAML_PARSE_ERR_SINGLE_LINE');
          }
      }
      elsif ($indicator eq $LIT_CHAR) {
          $self->{level}++;
          $node = $self->_parse_block($chomp);
          $node = $self->_parse_implicit($node) if $implicit;
          $self->{level}--;
      }
      elsif ($indicator eq $FOLD_CHAR) {
          $self->{level}++;
          $node = $self->_parse_unfold($chomp);
          $node = $self->_parse_implicit($node) if $implicit;
          $self->{level}--;
      }
      else {
          $self->{level}++;
          $self->offset->[$self->level] ||= 0;
          if ($self->indent == $self->offset->[$self->level]) {
              if ($self->content =~ /^-( |$)/) {
                  $node = $self->_parse_seq($anchor);
              }
              elsif ($self->content =~ /(^\?|\:( |$))/) {
                  $node = $self->_parse_mapping($anchor);
              }
              elsif ($preface =~ /^\s*$/) {
                  $node = $self->_parse_implicit('');
              }
              else {
                  $self->die('YAML_PARSE_ERR_BAD_NODE');
              }
          }
          else {
              $node = undef;
          }
          $self->{level}--;
      }
      $#{$self->offset} = $self->level;
  
      if ($explicit) {
          $node = $self->_parse_explicit($node, $explicit) if !$parsed_inline;
      }
      if ($anchor) {
          if (ref($self->anchor2node->{$anchor}) eq 'YAML-anchor2node') {
              # XXX Can't remember what this code actually does
              for my $ref (@{$self->anchor2node->{$anchor}}) {
                  ${$ref->[0]} = $node;
                  $self->warn('YAML_LOAD_WARN_UNRESOLVED_ALIAS',
                      $anchor, $ref->[1]);
              }
          }
          $self->anchor2node->{$anchor} = $node;
      }
      return $node;
  }
  
  # Preprocess the qualifiers that may be attached to any node.
  sub _parse_qualifiers {
      my $self = shift;
      my ($preface) = @_;
      my ($anchor, $alias, $explicit, $implicit, $token) = ('') x 5;
      $self->inline('');
      while ($preface =~ /^[&*!]/) {
          if ($preface =~ s/^\!(\S+)\s*//) {
              $self->die('YAML_PARSE_ERR_MANY_EXPLICIT') if $explicit;
              $explicit = $1;
          }
          elsif ($preface =~ s/^\!\s*//) {
              $self->die('YAML_PARSE_ERR_MANY_IMPLICIT') if $implicit;
              $implicit = 1;
          }
          elsif ($preface =~ s/^\&([^ ,:]*)\s*//) {
              $token = $1;
              $self->die('YAML_PARSE_ERR_BAD_ANCHOR')
                unless $token =~ /^[a-zA-Z0-9_.\/-]+$/;
              $self->die('YAML_PARSE_ERR_MANY_ANCHOR') if $anchor;
              $self->die('YAML_PARSE_ERR_ANCHOR_ALIAS') if $alias;
              $anchor = $token;
          }
          elsif ($preface =~ s/^\*([^ ,:]*)\s*//) {
              $token = $1;
              $self->die('YAML_PARSE_ERR_BAD_ALIAS')
                unless $token =~ /^[a-zA-Z0-9_.\/-]+$/;
              $self->die('YAML_PARSE_ERR_MANY_ALIAS') if $alias;
              $self->die('YAML_PARSE_ERR_ANCHOR_ALIAS') if $anchor;
              $alias = $token;
          }
      }
      return ($anchor, $alias, $explicit, $implicit, $preface);
  }
  
  # Morph a node to it's explicit type
  sub _parse_explicit {
      my $self = shift;
      my ($node, $explicit) = @_;
      my ($type, $class);
      if ($explicit =~ /^\!?perl\/(hash|array|ref|scalar)(?:\:(\w(\w|\:\:)*)?)?$/) {
          ($type, $class) = (($1 || ''), ($2 || ''));
  
          # FIXME # die unless uc($type) eq ref($node) ?
  
          if ( $type eq "ref" ) {
              $self->die('YAML_LOAD_ERR_NO_DEFAULT_VALUE', 'XXX', $explicit)
              unless exists $node->{VALUE()} and scalar(keys %$node) == 1;
  
              my $value = $node->{VALUE()};
              $node = \$value;
          }
  
          if ( $type eq "scalar" and length($class) and !ref($node) ) {
              my $value = $node;
              $node = \$value;
          }
  
          if ( length($class) and $YAML::LoadBlessed ) {
              CORE::bless($node, $class);
          }
  
          return $node;
      }
      if ($explicit =~ m{^!?perl/(glob|regexp|code)(?:\:(\w(\w|\:\:)*)?)?$}) {
          ($type, $class) = (($1 || ''), ($2 || ''));
          my $type_class = "YAML::Type::$type";
          no strict 'refs';
          if ($type_class->can('yaml_load')) {
              return $type_class->yaml_load($node, $class, $self);
          }
          else {
              $self->die('YAML_LOAD_ERR_NO_CONVERT', 'XXX', $explicit);
          }
      }
      # This !perl/@Foo and !perl/$Foo are deprecated but still parsed
      elsif ($YAML::TagClass->{$explicit} ||
             $explicit =~ m{^perl/(\@|\$)?([a-zA-Z](\w|::)+)$}
            ) {
          $class = $YAML::TagClass->{$explicit} || $2;
          if ($class->can('yaml_load')) {
              require YAML::Node;
              return $class->yaml_load(YAML::Node->new($node, $explicit));
          }
          elsif ($YAML::LoadBlessed) {
              if (ref $node) {
                  return CORE::bless $node, $class;
              }
              else {
                  return CORE::bless \$node, $class;
              }
          }
          else {
              return $node;
          }
      }
      elsif (ref $node) {
          require YAML::Node;
          return YAML::Node->new($node, $explicit);
      }
      else {
          # XXX This is likely wrong. Failing test:
          # --- !unknown 'scalar value'
          return $node;
      }
  }
  
  # Parse a YAML mapping into a Perl hash
  sub _parse_mapping {
      my $self = shift;
      my ($anchor) = @_;
      my $mapping = $self->preserve ? YAML::Node->new({}) : {};
      $self->anchor2node->{$anchor} = $mapping;
      my $key;
      while (not $self->done and $self->indent == $self->offset->[$self->level]) {
          # If structured key:
          if ($self->{content} =~ s/^\?\s*//) {
              $self->preface($self->content);
              $self->_parse_next_line(COLLECTION);
              $key = $self->_parse_node();
              $key = "$key";
          }
          # If "default" key (equals sign)
          elsif ($self->{content} =~ s/^\=\s*(?=:)//) {
              $key = VALUE;
          }
          # If "comment" key (slash slash)
          elsif ($self->{content} =~ s/^\=\s*(?=:)//) {
              $key = COMMENT;
          }
          # Regular scalar key:
          else {
              $self->inline($self->content);
              $key = $self->_parse_inline();
              $key = "$key";
              $self->content($self->inline);
              $self->inline('');
          }
  
          unless ($self->{content} =~ s/^:(?:\s+#.*$|\s*)//) {
              $self->die('YAML_LOAD_ERR_BAD_MAP_ELEMENT');
          }
          $self->preface($self->content);
          my $level = $self->level;
  
          # we can get a zero indented sequence, possibly
          my $zero_indent = $self->zero_indent;
          $zero_indent->[ $level ] = 0;
          $self->_parse_next_line(COLLECTION);
          my $value = $self->_parse_node();
          $#$zero_indent = $level;
  
          if (exists $mapping->{$key}) {
              $self->warn('YAML_LOAD_WARN_DUPLICATE_KEY', $key);
          }
          else {
              $mapping->{$key} = $value;
          }
      }
      return $mapping;
  }
  
  # Parse a YAML sequence into a Perl array
  sub _parse_seq {
      my $self = shift;
      my ($anchor) = @_;
      my $seq = [];
      $self->anchor2node->{$anchor} = $seq;
      while (not $self->done and $self->indent == $self->offset->[$self->level]) {
          if ($self->content =~ /^-(?: (.*))?$/) {
              $self->preface(defined($1) ? $1 : '');
          }
          else {
              if ($self->zero_indent->[ $self->level ]) {
                  last;
              }
              $self->die('YAML_LOAD_ERR_BAD_SEQ_ELEMENT');
          }
  
          # Check whether the preface looks like a YAML mapping ("key: value").
          # This is complicated because it has to account for the possibility
          # that a key is a quoted string, which itself may contain escaped
          # quotes.
          my $preface = $self->preface;
          if ($preface =~ m/^ (\s*) ( - (?: \ .* | $ ) ) /x) {
              $self->indent($self->offset->[$self->level] + 2 + length($1));
              $self->content($2);
              $self->level($self->level + 1);
              $self->offset->[$self->level] = $self->indent;
              $self->preface('');
              push @$seq, $self->_parse_seq('');
              $self->{level}--;
              $#{$self->offset} = $self->level;
          }
          elsif (
               $preface =~ /^ (\s*) ((') (?:''|[^'])*? ' \s* \: (?:\ |$).*) $/x or
               $preface =~ /^ (\s*) ((") (?:\\\\|[^"])*? " \s* \: (?:\ |$).*) $/x or
               $preface =~ /^ (\s*) (\?.*$)/x or
               $preface =~ /^ (\s*) ([^'"\s:#&!\[\]\{\},*|>].*\:(\ .*|$))/x
             ) {
              $self->indent($self->offset->[$self->level] + 2 + length($1));
              $self->content($2);
              $self->level($self->level + 1);
              $self->offset->[$self->level] = $self->indent;
              $self->preface('');
              push @$seq, $self->_parse_mapping('');
              $self->{level}--;
              $#{$self->offset} = $self->level;
          }
          else {
              $self->_parse_next_line(COLLECTION);
              push @$seq, $self->_parse_node();
          }
      }
      return $seq;
  }
  
  # Parse an inline value. Since YAML supports inline collections, this is
  # the top level of a sub parsing.
  sub _parse_inline {
      my $self = shift;
      my ($top, $top_implicit, $top_explicit) = (@_, '', '', '');
      $self->{inline} =~ s/^\s*(.*)\s*$/$1/; # OUCH - mugwump
      my ($node, $anchor, $alias, $explicit, $implicit) = ('') x 5;
      ($anchor, $alias, $explicit, $implicit, $self->{inline}) =
        $self->_parse_qualifiers($self->inline);
      if ($anchor) {
          $self->anchor2node->{$anchor} = CORE::bless [], 'YAML-anchor2node';
      }
      $implicit ||= $top_implicit;
      $explicit ||= $top_explicit;
      ($top_implicit, $top_explicit) = ('', '');
      if ($alias) {
          $self->die('YAML_PARSE_ERR_NO_ANCHOR', $alias)
            unless defined $self->anchor2node->{$alias};
          if (ref($self->anchor2node->{$alias}) ne 'YAML-anchor2node') {
              $node = $self->anchor2node->{$alias};
          }
          else {
              $node = do {my $sv = "*$alias"};
              push @{$self->anchor2node->{$alias}}, [\$node, $self->line];
          }
      }
      elsif ($self->inline =~ /^\{/) {
          $node = $self->_parse_inline_mapping($anchor);
      }
      elsif ($self->inline =~ /^\[/) {
          $node = $self->_parse_inline_seq($anchor);
      }
      elsif ($self->inline =~ /^"/) {
          $node = $self->_parse_inline_double_quoted();
          $node = $self->_unescape($node);
          $node = $self->_parse_implicit($node) if $implicit;
      }
      elsif ($self->inline =~ /^'/) {
          $node = $self->_parse_inline_single_quoted();
          $node = $self->_parse_implicit($node) if $implicit;
      }
      else {
          if ($top) {
              $node = $self->inline;
              $self->inline('');
          }
          else {
              $node = $self->_parse_inline_simple();
          }
          $node = $self->_parse_implicit($node) unless $explicit;
  
          if ($self->numify and defined $node and not ref $node and length $node
              and $node =~ m/\A-?(?:0|[1-9][0-9]*)?(?:\.[0-9]*)?(?:[eE][+-]?[0-9]+)?\z/) {
              $node += 0;
          }
      }
      if ($explicit) {
          $node = $self->_parse_explicit($node, $explicit);
      }
      if ($anchor) {
          if (ref($self->anchor2node->{$anchor}) eq 'YAML-anchor2node') {
              for my $ref (@{$self->anchor2node->{$anchor}}) {
                  ${$ref->[0]} = $node;
                  $self->warn('YAML_LOAD_WARN_UNRESOLVED_ALIAS',
                      $anchor, $ref->[1]);
              }
          }
          $self->anchor2node->{$anchor} = $node;
      }
      return $node;
  }
  
  # Parse the inline YAML mapping into a Perl hash
  sub _parse_inline_mapping {
      my $self = shift;
      my ($anchor) = @_;
      my $node = {};
      $self->anchor2node->{$anchor} = $node;
  
      $self->die('YAML_PARSE_ERR_INLINE_MAP')
        unless $self->{inline} =~ s/^\{\s*//;
      while (not $self->{inline} =~ s/^\s*\}(\s+#.*$|\s*)//) {
          my $key = $self->_parse_inline();
          $self->die('YAML_PARSE_ERR_INLINE_MAP')
            unless $self->{inline} =~ s/^\: \s*//;
          my $value = $self->_parse_inline();
          if (exists $node->{$key}) {
              $self->warn('YAML_LOAD_WARN_DUPLICATE_KEY', $key);
          }
          else {
              $node->{$key} = $value;
          }
          next if $self->inline =~ /^\s*\}/;
          $self->die('YAML_PARSE_ERR_INLINE_MAP')
            unless $self->{inline} =~ s/^\,\s*//;
      }
      return $node;
  }
  
  # Parse the inline YAML sequence into a Perl array
  sub _parse_inline_seq {
      my $self = shift;
      my ($anchor) = @_;
      my $node = [];
      $self->anchor2node->{$anchor} = $node;
  
      $self->die('YAML_PARSE_ERR_INLINE_SEQUENCE')
        unless $self->{inline} =~ s/^\[\s*//;
      while (not $self->{inline} =~ s/^\s*\](\s+#.*$|\s*)//) {
          my $value = $self->_parse_inline();
          push @$node, $value;
          next if $self->inline =~ /^\s*\]/;
          $self->die('YAML_PARSE_ERR_INLINE_SEQUENCE')
            unless $self->{inline} =~ s/^\,\s*//;
      }
      return $node;
  }
  
  # Parse the inline double quoted string.
  sub _parse_inline_double_quoted {
      my $self = shift;
      my $inline = $self->inline;
      if ($inline =~ s/^"//) {
          my $node = '';
  
          while ($inline =~ s/^(\\.|[^"\\]+)//) {
              my $capture = $1;
              $capture =~ s/^\\"/"/;
              $node .= $capture;
              last unless length $inline;
          }
          if ($inline =~ s/^"(?:\s+#.*|\s*)//) {
              $self->inline($inline);
              return $node;
          }
      }
      $self->die('YAML_PARSE_ERR_BAD_DOUBLE');
  }
  
  
  # Parse the inline single quoted string.
  sub _parse_inline_single_quoted {
      my $self = shift;
      my $inline = $self->inline;
      if ($inline =~ s/^'//) {
          my $node = '';
          while ($inline =~ s/^(''|[^']+)//) {
              my $capture = $1;
              $capture =~ s/^''/'/;
              $node .= $capture;
              last unless length $inline;
          }
          if ($inline =~ s/^'(?:\s+#.*|\s*)//) {
              $self->inline($inline);
              return $node;
          }
      }
      $self->die('YAML_PARSE_ERR_BAD_SINGLE');
  }
  
  # Parse the inline unquoted string and do implicit typing.
  sub _parse_inline_simple {
      my $self = shift;
      my $value;
      if ($self->inline =~ /^(|[^!@#%^&*].*?)(?=[\[\]\{\},]|, |: |- |:\s*$|$)/) {
          $value = $1;
          substr($self->{inline}, 0, length($1)) = '';
      }
      else {
          $self->die('YAML_PARSE_ERR_BAD_INLINE_IMPLICIT', $value);
      }
      return $value;
  }
  
  sub _parse_implicit {
      my $self = shift;
      my ($value) = @_;
      # remove trailing comments and whitespace
      $value =~ s/^#.*$//;
      $value =~ s/\s+#.*$//;
      $value =~ s/\s*$//;
      return $value if $value eq '';
      return undef if $value =~ /^~$/;
      return $value
        unless $value =~ /^[\@\`]/ or
               $value =~ /^[\-\?]\s/;
      $self->die('YAML_PARSE_ERR_BAD_IMPLICIT', $value);
  }
  
  # Unfold a YAML multiline scalar into a single string.
  sub _parse_unfold {
      my $self = shift;
      my ($chomp) = @_;
      my $node = '';
      my $space = 0;
      while (not $self->done and $self->indent == $self->offset->[$self->level]) {
          $node .= $self->content. "\n";
          $self->_parse_next_line(LEAF);
      }
      $node =~ s/^(\S.*)\n(?=\S)/$1 /gm;
      $node =~ s/^(\S.*)\n(\n+\S)/$1$2/gm;
      $node =~ s/\n*\Z// unless $chomp eq '+';
      $node .= "\n" unless $chomp;
      return $node;
  }
  
  # Parse a YAML block style scalar. This is like a Perl here-document.
  sub _parse_block {
      my $self = shift;
      my ($chomp) = @_;
      my $node = '';
      while (not $self->done and $self->indent == $self->offset->[$self->level]) {
          $node .= $self->content . "\n";
          $self->_parse_next_line(LEAF);
      }
      return $node if '+' eq $chomp;
      $node =~ s/\n*\Z/\n/;
      $node =~ s/\n\Z// if $chomp eq '-';
      return $node;
  }
  
  # Handle Perl style '#' comments. Comments must be at the same indentation
  # level as the collection line following them.
  sub _parse_throwaway_comments {
      my $self = shift;
      while (@{$self->lines} and
             $self->lines->[0] =~ m{^\s*(\#|$)}
            ) {
          shift @{$self->lines};
          $self->{line}++;
      }
      $self->eos($self->{done} = not @{$self->lines});
  }
  
  # This is the routine that controls what line is being parsed. It gets called
  # once for each line in the YAML stream.
  #
  # This routine must:
  # 1) Skip past the current line
  # 2) Determine the indentation offset for a new level
  # 3) Find the next _content_ line
  #   A) Skip over any throwaways (Comments/blanks)
  #   B) Set $self->indent, $self->content, $self->line
  # 4) Expand tabs appropriately
  sub _parse_next_line {
      my $self = shift;
      my ($type) = @_;
      my $level = $self->level;
      my $offset = $self->offset->[$level];
      $self->die('YAML_EMIT_ERR_BAD_LEVEL') unless defined $offset;
      shift @{$self->lines};
      $self->eos($self->{done} = not @{$self->lines});
      if ($self->eos) {
          $self->offset->[$level + 1] = $offset + 1;
          return;
      }
      $self->{line}++;
  
      # Determine the offset for a new leaf node
      # TODO
      if ($self->preface =~
          qr/(?:^|\s)(?:$FOLD_CHAR|$LIT_CHAR_RX)(?:[+-]([0-9]*)|([0-9]*)[+-]?)(?:\s+#.*|\s*)$/
         ) {
          my $explicit_indent = defined $1 ? $1 : defined $2 ? $2 : '';
          $self->die('YAML_PARSE_ERR_ZERO_INDENT')
            if length($explicit_indent) and $explicit_indent == 0;
          $type = LEAF;
          if (length($explicit_indent)) {
              $self->offset->[$level + 1] = $offset + $explicit_indent;
          }
          else {
              # First get rid of any comments.
              while (@{$self->lines} && ($self->lines->[0] =~ /^\s*#/)) {
                  $self->lines->[0] =~ /^( *)/;
                  last unless length($1) <= $offset;
                  shift @{$self->lines};
                  $self->{line}++;
              }
              $self->eos($self->{done} = not @{$self->lines});
              return if $self->eos;
              if ($self->lines->[0] =~ /^( *)\S/ and length($1) > $offset) {
                  $self->offset->[$level+1] = length($1);
              }
              else {
                  $self->offset->[$level+1] = $offset + 1;
              }
          }
          $offset = $self->offset->[++$level];
      }
      # Determine the offset for a new collection level
      elsif ($type == COLLECTION and
             $self->preface =~ /^(\s*(\!\S*|\&\S+))*\s*$/) {
          $self->_parse_throwaway_comments();
          my $zero_indent = $self->zero_indent;
          if ($self->eos) {
              $self->offset->[$level+1] = $offset + 1;
              return;
          }
          elsif (
              defined $zero_indent->[ $level ]
              and not $zero_indent->[ $level ]
              and $self->lines->[0] =~ /^( {$offset,})-(?: |$)/
          ) {
              my $new_offset = length($1);
              $self->offset->[$level+1] = $new_offset;
              if ($new_offset == $offset) {
                  $zero_indent->[ $level+1 ] = 1;
              }
          }
          else {
              $self->lines->[0] =~ /^( *)\S/ or
                  $self->die('YAML_PARSE_ERR_NONSPACE_INDENTATION');
              if (length($1) > $offset) {
                  $self->offset->[$level+1] = length($1);
              }
              else {
                  $self->offset->[$level+1] = $offset + 1;
              }
          }
          $offset = $self->offset->[++$level];
      }
  
      if ($type == LEAF) {
          if (@{$self->lines} and
                 $self->lines->[0] =~ m{^( *)(\#)} and
                 length($1) < $offset
                ) {
              if ( length($1) < $offset) {
                  shift @{$self->lines};
                  $self->{line}++;
                  # every comment after that is also thrown away regardless
                  # of identation
                  while (@{$self->lines} and
                         $self->lines->[0] =~ m{^( *)(\#)}
                        ) {
                      shift @{$self->lines};
                      $self->{line}++;
                  }
              }
          }
          $self->eos($self->{done} = not @{$self->lines});
      }
      else {
          $self->_parse_throwaway_comments();
      }
      return if $self->eos;
  
      if ($self->lines->[0] =~ /^---(\s|$)/) {
          $self->done(1);
          return;
      }
      if ($type == LEAF and
          $self->lines->[0] =~ /^ {$offset}(.*)$/
         ) {
          $self->indent($offset);
          $self->content($1);
      }
      elsif ($self->lines->[0] =~ /^\s*$/) {
          $self->indent($offset);
          $self->content('');
      }
      else {
          $self->lines->[0] =~ /^( *)(\S.*)$/;
          while ($self->offset->[$level] > length($1)) {
              $level--;
          }
          $self->die('YAML_PARSE_ERR_INCONSISTENT_INDENTATION')
            if $self->offset->[$level] != length($1);
          $self->indent(length($1));
          $self->content($2);
      }
      $self->die('YAML_PARSE_ERR_INDENTATION')
        if $self->indent - $offset > 1;
  }
  
  #==============================================================================
  # Utility subroutines.
  #==============================================================================
  
  # Printable characters for escapes
  my %unescapes = (
     0 => "\x00",
     a => "\x07",
     t => "\x09",
     n => "\x0a",
     'v' => "\x0b", # Potential v-string error on 5.6.2 if not quoted
     f => "\x0c",
     r => "\x0d",
     e => "\x1b",
     '\\' => '\\',
    );
  
  # Transform all the backslash style escape characters to their literal meaning
  sub _unescape {
      my $self = shift;
      my ($node) = @_;
      $node =~ s/\\([never\\fart0]|x([0-9a-fA-F]{2}))/
                (length($1)>1)?pack("H2",$2):$unescapes{$1}/gex;
      return $node;
  }
  
  1;
YAML_LOADER

    $main::fatpacked{"YAML/Loader/Base.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'YAML_LOADER_BASE';
  package YAML::Loader::Base;
  
  use YAML::Mo;
  
  has load_code     => default => sub {0};
  has preserve      => default => sub {0};
  has stream        => default => sub {''};
  has document      => default => sub {0};
  has line          => default => sub {0};
  has documents     => default => sub {[]};
  has lines         => default => sub {[]};
  has eos           => default => sub {0};
  has done          => default => sub {0};
  has anchor2node   => default => sub {{}};
  has level         => default => sub {0};
  has offset        => default => sub {[]};
  has preface       => default => sub {''};
  has content       => default => sub {''};
  has indent        => default => sub {0};
  has major_version => default => sub {0};
  has minor_version => default => sub {0};
  has inline        => default => sub {''};
  has numify        => default => sub {0};
  has zero_indent   => default => sub {[]};
  
  sub set_global_options {
      my $self = shift;
      $self->load_code($YAML::LoadCode || $YAML::UseCode)
        if defined $YAML::LoadCode or defined $YAML::UseCode;
      $self->preserve($YAML::Preserve) if defined $YAML::Preserve;
      $self->numify($YAML::Numify) if defined $YAML::Numify;
  }
  
  sub load {
      die 'load() not implemented in this class.';
  }
  
  1;
YAML_LOADER_BASE

    $main::fatpacked{"YAML/Marshall.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'YAML_MARSHALL';
  use strict; use warnings;
  package YAML::Marshall;
  
  use YAML::Node ();
  
  sub import {
      my $class = shift;
      no strict 'refs';
      my $package = caller;
      unless (grep { $_ eq $class} @{$package . '::ISA'}) {
          push @{$package . '::ISA'}, $class;
      }
  
      my $tag = shift;
      if ( $tag ) {
          no warnings 'once';
          $YAML::TagClass->{$tag} = $package;
          ${$package . "::YamlTag"} = $tag;
      }
  }
  
  sub yaml_dump {
      my $self = shift;
      no strict 'refs';
      my $tag = ${ref($self) . "::YamlTag"} || 'perl/' . ref($self);
      $self->yaml_node($self, $tag);
  }
  
  sub yaml_load {
      my ($class, $node) = @_;
      if (my $ynode = $class->yaml_ynode($node)) {
          $node = $ynode->{NODE};
      }
      bless $node, $class;
  }
  
  sub yaml_node {
      shift;
      YAML::Node->new(@_);
  }
  
  sub yaml_ynode {
      shift;
      YAML::Node::ynode(@_);
  }
  
  1;
YAML_MARSHALL

    $main::fatpacked{"YAML/Mo.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'YAML_MO';
  package YAML::Mo;
  # use Mo qw[builder default import];
  #   The following line of code was produced from the previous line by
  #   Mo::Inline version 0.4
  no warnings;my$M=__PACKAGE__.'::';*{$M.Object::new}=sub{my$c=shift;my$s=bless{@_},$c;my%n=%{$c.'::'.':E'};map{$s->{$_}=$n{$_}->()if!exists$s->{$_}}keys%n;$s};*{$M.import}=sub{import warnings;$^H|=1538;my($P,%e,%o)=caller.'::';shift;eval"no Mo::$_",&{$M.$_.::e}($P,\%e,\%o,\@_)for@_;return if$e{M};%e=(extends,sub{eval"no $_[0]()";@{$P.ISA}=$_[0]},has,sub{my$n=shift;my$m=sub{$#_?$_[0]{$n}=$_[1]:$_[0]{$n}};@_=(default,@_)if!($#_%2);$m=$o{$_}->($m,$n,@_)for sort keys%o;*{$P.$n}=$m},%e,);*{$P.$_}=$e{$_}for keys%e;@{$P.ISA}=$M.Object};*{$M.'builder::e'}=sub{my($P,$e,$o)=@_;$o->{builder}=sub{my($m,$n,%a)=@_;my$b=$a{builder}or return$m;my$i=exists$a{lazy}?$a{lazy}:!${$P.':N'};$i or ${$P.':E'}{$n}=\&{$P.$b}and return$m;sub{$#_?$m->(@_):!exists$_[0]{$n}?$_[0]{$n}=$_[0]->$b:$m->(@_)}}};*{$M.'default::e'}=sub{my($P,$e,$o)=@_;$o->{default}=sub{my($m,$n,%a)=@_;exists$a{default}or return$m;my($d,$r)=$a{default};my$g='HASH'eq($r=ref$d)?sub{+{%$d}}:'ARRAY'eq$r?sub{[@$d]}:'CODE'eq$r?$d:sub{$d};my$i=exists$a{lazy}?$a{lazy}:!${$P.':N'};$i or ${$P.':E'}{$n}=$g and return$m;sub{$#_?$m->(@_):!exists$_[0]{$n}?$_[0]{$n}=$g->(@_):$m->(@_)}}};my$i=\&import;*{$M.import}=sub{(@_==2 and not$_[1])?pop@_:@_==1?push@_,grep!/import/,@f:();goto&$i};@f=qw[builder default import];use strict;use warnings;
  
  our $DumperModule = 'Data::Dumper';
  
  my ($_new_error, $_info, $_scalar_info);
  
  no strict 'refs';
  *{$M.'Object::die'} = sub {
      my $self = shift;
      my $error = $self->$_new_error(@_);
      $error->type('Error');
      Carp::croak($error->format_message);
  };
  
  *{$M.'Object::warn'} = sub {
      my $self = shift;
      return unless $^W;
      my $error = $self->$_new_error(@_);
      $error->type('Warning');
      Carp::cluck($error->format_message);
  };
  
  # This code needs to be refactored to be simpler and more precise, and no,
  # Scalar::Util doesn't DWIM.
  #
  # Can't handle:
  # * blessed regexp
  *{$M.'Object::node_info'} = sub {
      my $self = shift;
      my $stringify = $_[1] || 0;
      my ($class, $type, $id) =
          ref($_[0])
          ? $stringify
            ? &$_info("$_[0]")
            : do {
                require overload;
                my @info = &$_info(overload::StrVal($_[0]));
                if (ref($_[0]) eq 'Regexp') {
                    @info[0, 1] = (undef, 'REGEXP');
                }
                @info;
            }
          : &$_scalar_info($_[0]);
      ($class, $type, $id) = &$_scalar_info("$_[0]")
          unless $id;
      return wantarray ? ($class, $type, $id) : $id;
  };
  
  #-------------------------------------------------------------------------------
  $_info = sub {
      return (($_[0]) =~ qr{^(?:(.*)\=)?([^=]*)\(([^\(]*)\)$}o);
  };
  
  $_scalar_info = sub {
      my $id = 'undef';
      if (defined $_[0]) {
          \$_[0] =~ /\((\w+)\)$/o or CORE::die();
          $id = "$1-S";
      }
      return (undef, undef, $id);
  };
  
  $_new_error = sub {
      require Carp;
      my $self = shift;
      require YAML::Error;
  
      my $code = shift || 'unknown error';
      my $error = YAML::Error->new(code => $code);
      $error->line($self->line) if $self->can('line');
      $error->document($self->document) if $self->can('document');
      $error->arguments([@_]);
      return $error;
  };
  
  1;
YAML_MO

    $main::fatpacked{"YAML/Node.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'YAML_NODE';
  use strict; use warnings;
  package YAML::Node;
  
  use YAML::Tag;
  require YAML::Mo;
  
  use Exporter;
  our @ISA     = qw(Exporter YAML::Mo::Object);
  our @EXPORT  = qw(ynode);
  
  sub ynode {
      my $self;
      if (ref($_[0]) eq 'HASH') {
          $self = tied(%{$_[0]});
      }
      elsif (ref($_[0]) eq 'ARRAY') {
          $self = tied(@{$_[0]});
      }
      elsif (ref(\$_[0]) eq 'GLOB') {
          $self = tied(*{$_[0]});
      }
      else {
          $self = tied($_[0]);
      }
      return (ref($self) =~ /^yaml_/) ? $self : undef;
  }
  
  sub new {
      my ($class, $node, $tag) = @_;
      my $self;
      $self->{NODE} = $node;
      my (undef, $type) = YAML::Mo::Object->node_info($node);
      $self->{KIND} = (not defined $type) ? 'scalar' :
                      ($type eq 'ARRAY') ? 'sequence' :
                      ($type eq 'HASH') ? 'mapping' :
                      $class->die("Can't create YAML::Node from '$type'");
      tag($self, ($tag || ''));
      if ($self->{KIND} eq 'scalar') {
          yaml_scalar->new($self, $_[1]);
          return \ $_[1];
      }
      my $package = "yaml_" . $self->{KIND};
      $package->new($self)
  }
  
  sub node { $_->{NODE} }
  sub kind { $_->{KIND} }
  sub tag {
      my ($self, $value) = @_;
      if (defined $value) {
                 $self->{TAG} = YAML::Tag->new($value);
          return $self;
      }
      else {
         return $self->{TAG};
      }
  }
  sub keys {
      my ($self, $value) = @_;
      if (defined $value) {
                 $self->{KEYS} = $value;
          return $self;
      }
      else {
         return $self->{KEYS};
      }
  }
  
  #==============================================================================
  package yaml_scalar;
  
  @yaml_scalar::ISA = qw(YAML::Node);
  
  sub new {
      my ($class, $self) = @_;
      tie $_[2], $class, $self;
  }
  
  sub TIESCALAR {
      my ($class, $self) = @_;
      bless $self, $class;
      $self
  }
  
  sub FETCH {
      my ($self) = @_;
      $self->{NODE}
  }
  
  sub STORE {
      my ($self, $value) = @_;
      $self->{NODE} = $value
  }
  
  #==============================================================================
  package yaml_sequence;
  
  @yaml_sequence::ISA = qw(YAML::Node);
  
  sub new {
      my ($class, $self) = @_;
      my $new;
      tie @$new, $class, $self;
      $new
  }
  
  sub TIEARRAY {
      my ($class, $self) = @_;
      bless $self, $class
  }
  
  sub FETCHSIZE {
      my ($self) = @_;
      scalar @{$self->{NODE}};
  }
  
  sub FETCH {
      my ($self, $index) = @_;
      $self->{NODE}[$index]
  }
  
  sub STORE {
      my ($self, $index, $value) = @_;
      $self->{NODE}[$index] = $value
  }
  
  sub undone {
      die "Not implemented yet"; # XXX
  }
  
  *STORESIZE = *POP = *PUSH = *SHIFT = *UNSHIFT = *SPLICE = *DELETE = *EXISTS =
  *STORESIZE = *POP = *PUSH = *SHIFT = *UNSHIFT = *SPLICE = *DELETE = *EXISTS =
  *undone; # XXX Must implement before release
  
  #==============================================================================
  package yaml_mapping;
  
  @yaml_mapping::ISA = qw(YAML::Node);
  
  sub new {
      my ($class, $self) = @_;
      @{$self->{KEYS}} = sort keys %{$self->{NODE}};
      my $new;
      tie %$new, $class, $self;
      $new
  }
  
  sub TIEHASH {
      my ($class, $self) = @_;
      bless $self, $class
  }
  
  sub FETCH {
      my ($self, $key) = @_;
      if (exists $self->{NODE}{$key}) {
          return (grep {$_ eq $key} @{$self->{KEYS}})
                 ? $self->{NODE}{$key} : undef;
      }
      return $self->{HASH}{$key};
  }
  
  sub STORE {
      my ($self, $key, $value) = @_;
      if (exists $self->{NODE}{$key}) {
          $self->{NODE}{$key} = $value;
      }
      elsif (exists $self->{HASH}{$key}) {
          $self->{HASH}{$key} = $value;
      }
      else {
          if (not grep {$_ eq $key} @{$self->{KEYS}}) {
              push(@{$self->{KEYS}}, $key);
          }
          $self->{HASH}{$key} = $value;
      }
      $value
  }
  
  sub DELETE {
      my ($self, $key) = @_;
      my $return;
      if (exists $self->{NODE}{$key}) {
          $return = $self->{NODE}{$key};
      }
      elsif (exists $self->{HASH}{$key}) {
          $return = delete $self->{NODE}{$key};
      }
      for (my $i = 0; $i < @{$self->{KEYS}}; $i++) {
          if ($self->{KEYS}[$i] eq $key) {
              splice(@{$self->{KEYS}}, $i, 1);
          }
      }
      return $return;
  }
  
  sub CLEAR {
      my ($self) = @_;
      @{$self->{KEYS}} = ();
      %{$self->{HASH}} = ();
  }
  
  sub FIRSTKEY {
      my ($self) = @_;
      $self->{ITER} = 0;
      $self->{KEYS}[0]
  }
  
  sub NEXTKEY {
      my ($self) = @_;
      $self->{KEYS}[++$self->{ITER}]
  }
  
  sub EXISTS {
      my ($self, $key) = @_;
      exists $self->{NODE}{$key}
  }
  
  1;
YAML_NODE

    $main::fatpacked{"YAML/Old.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'YAML_OLD';
  package YAML::Old;
  our $VERSION = '1.23';
  
  use YAML::Old::Mo;
  
  use Exporter;
  push @YAML::Old::ISA, 'Exporter';
  our @EXPORT = qw{ Dump Load };
  our @EXPORT_OK = qw{ freeze thaw DumpFile LoadFile Bless Blessed };
  our (
      $UseCode, $DumpCode, $LoadCode,
      $SpecVersion,
      $UseHeader, $UseVersion, $UseBlock, $UseFold, $UseAliases,
      $Indent, $SortKeys, $Preserve,
      $AnchorPrefix, $CompressSeries, $InlineSeries, $Purity,
      $Stringify, $Numify
  );
  
  
  use YAML::Old::Node; # XXX This is a temp fix for Module::Build
  use Scalar::Util qw/ openhandle /;
  
  # XXX This VALUE nonsense needs to go.
  use constant VALUE => "\x07YAML\x07VALUE\x07";
  
  # YAML Object Properties
  has dumper_class => default => sub {'YAML::Old::Dumper'};
  has loader_class => default => sub {'YAML::Old::Loader'};
  has dumper_object => default => sub {$_[0]->init_action_object("dumper")};
  has loader_object => default => sub {$_[0]->init_action_object("loader")};
  
  sub Dump {
      my $yaml = YAML::Old->new;
      $yaml->dumper_class($YAML::DumperClass)
          if $YAML::DumperClass;
      return $yaml->dumper_object->dump(@_);
  }
  
  sub Load {
      my $yaml = YAML::Old->new;
      $yaml->loader_class($YAML::LoaderClass)
          if $YAML::LoaderClass;
      return $yaml->loader_object->load(@_);
  }
  
  {
      no warnings 'once';
      # freeze/thaw is the API for Storable string serialization. Some
      # modules make use of serializing packages on if they use freeze/thaw.
      *freeze = \ &Dump;
      *thaw   = \ &Load;
  }
  
  sub DumpFile {
      my $OUT;
      my $filename = shift;
      if (openhandle $filename) {
          $OUT = $filename;
      }
      else {
          my $mode = '>';
          if ($filename =~ /^\s*(>{1,2})\s*(.*)$/) {
              ($mode, $filename) = ($1, $2);
          }
          open $OUT, $mode, $filename
            or YAML::Old::Mo::Object->die('YAML_DUMP_ERR_FILE_OUTPUT', $filename, "$!");
      }
      binmode $OUT, ':utf8';  # if $Config{useperlio} eq 'define';
      local $/ = "\n"; # reset special to "sane"
      print $OUT Dump(@_);
      unless (ref $filename eq 'GLOB') {
          close $OUT
            or do {
                my $errsav = $!;
                YAML::Old::Mo::Object->die('YAML_DUMP_ERR_FILE_OUTPUT_CLOSE', $filename, $errsav);
            }
      }
  }
  
  sub LoadFile {
      my $IN;
      my $filename = shift;
      if (openhandle $filename) {
          $IN = $filename;
      }
      else {
          open $IN, '<', $filename
            or YAML::Old::Mo::Object->die('YAML_LOAD_ERR_FILE_INPUT', $filename, "$!");
      }
      binmode $IN, ':utf8';  # if $Config{useperlio} eq 'define';
      return Load(do { local $/; <$IN> });
  }
  
  sub init_action_object {
      my $self = shift;
      my $object_class = (shift) . '_class';
      my $module_name = $self->$object_class;
      eval "require $module_name";
      $self->die("Error in require $module_name - $@")
          if $@ and "$@" !~ /Can't locate/;
      my $object = $self->$object_class->new;
      $object->set_global_options;
      return $object;
  }
  
  my $global = {};
  sub Bless {
      require YAML::Old::Dumper::Base;
      YAML::Old::Dumper::Base::bless($global, @_)
  }
  sub Blessed {
      require YAML::Old::Dumper::Base;
      YAML::Old::Dumper::Base::blessed($global, @_)
  }
  sub global_object { $global }
  
  1;
YAML_OLD

    $main::fatpacked{"YAML/Old/Dumper.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'YAML_OLD_DUMPER';
  package YAML::Old::Dumper;
  
  use YAML::Old::Mo;
  extends 'YAML::Old::Dumper::Base';
  
  use YAML::Old::Dumper::Base;
  use YAML::Old::Node;
  use YAML::Old::Types;
  use Scalar::Util qw();
  use B ();
  use Carp ();
  
  # Context constants
  use constant KEY       => 3;
  use constant BLESSED   => 4;
  use constant FROMARRAY => 5;
  use constant VALUE     => "\x07YAML\x07VALUE\x07";
  
  # Common YAML character sets
  my $ESCAPE_CHAR = '[\\x00-\\x08\\x0b-\\x0d\\x0e-\\x1f]';
  my $LIT_CHAR    = '|';
  
  #==============================================================================
  # OO version of Dump. YAML->new->dump($foo);
  sub dump {
      my $self = shift;
      $self->stream('');
      $self->document(0);
      for my $document (@_) {
          $self->{document}++;
          $self->transferred({});
          $self->id_refcnt({});
          $self->id_anchor({});
          $self->anchor(1);
          $self->level(0);
          $self->offset->[0] = 0 - $self->indent_width;
          $self->_prewalk($document);
          $self->_emit_header($document);
          $self->_emit_node($document);
      }
      return $self->stream;
  }
  
  # Every YAML document in the stream must begin with a YAML header, unless
  # there is only a single document and the user requests "no header".
  sub _emit_header {
      my $self = shift;
      my ($node) = @_;
      if (not $self->use_header and
          $self->document == 1
         ) {
          $self->die('YAML_DUMP_ERR_NO_HEADER')
            unless ref($node) =~ /^(HASH|ARRAY)$/;
          $self->die('YAML_DUMP_ERR_NO_HEADER')
            if ref($node) eq 'HASH' and keys(%$node) == 0;
          $self->die('YAML_DUMP_ERR_NO_HEADER')
            if ref($node) eq 'ARRAY' and @$node == 0;
          # XXX Also croak if aliased, blessed, or ynode
          $self->headless(1);
          return;
      }
      $self->{stream} .= '---';
  # XXX Consider switching to 1.1 style
      if ($self->use_version) {
  #         $self->{stream} .= " #YAML:1.0";
      }
  }
  
  # Walk the tree to be dumped and keep track of its reference counts.
  # This function is where the Dumper does all its work. All type
  # transfers happen here.
  sub _prewalk {
      my $self = shift;
      my $stringify = $self->stringify;
      my ($class, $type, $node_id) = $self->node_info(\$_[0], $stringify);
  
      # Handle typeglobs
      if ($type eq 'GLOB') {
          $self->transferred->{$node_id} =
            YAML::Old::Type::glob->yaml_dump($_[0]);
          $self->_prewalk($self->transferred->{$node_id});
          return;
      }
  
      # Handle regexps
      if (ref($_[0]) eq 'Regexp') {
          return;
      }
  
      # Handle Purity for scalars.
      # XXX can't find a use case yet. Might be YAGNI.
      if (not ref $_[0]) {
          $self->{id_refcnt}{$node_id}++ if $self->purity;
          return;
      }
  
      # Make a copy of original
      my $value = $_[0];
      ($class, $type, $node_id) = $self->node_info($value, $stringify);
  
      # Must be a stringified object.
      return if (ref($value) and not $type);
  
      # Look for things already transferred.
      if ($self->transferred->{$node_id}) {
          (undef, undef, $node_id) = (ref $self->transferred->{$node_id})
            ? $self->node_info($self->transferred->{$node_id}, $stringify)
            : $self->node_info(\ $self->transferred->{$node_id}, $stringify);
          $self->{id_refcnt}{$node_id}++;
          return;
      }
  
      # Handle code refs
      if ($type eq 'CODE') {
          $self->transferred->{$node_id} = 'placeholder';
          YAML::Old::Type::code->yaml_dump(
              $self->dump_code,
              $_[0],
              $self->transferred->{$node_id}
          );
          ($class, $type, $node_id) =
            $self->node_info(\ $self->transferred->{$node_id}, $stringify);
          $self->{id_refcnt}{$node_id}++;
          return;
      }
  
      # Handle blessed things
      if (defined $class) {
          if ($value->can('yaml_dump')) {
              $value = $value->yaml_dump;
          }
          elsif ($type eq 'SCALAR') {
              $self->transferred->{$node_id} = 'placeholder';
              YAML::Old::Type::blessed->yaml_dump
                ($_[0], $self->transferred->{$node_id});
              ($class, $type, $node_id) =
                $self->node_info(\ $self->transferred->{$node_id}, $stringify);
              $self->{id_refcnt}{$node_id}++;
              return;
          }
          else {
              $value = YAML::Old::Type::blessed->yaml_dump($value);
          }
          $self->transferred->{$node_id} = $value;
          (undef, $type, $node_id) = $self->node_info($value, $stringify);
      }
  
      # Handle YAML Blessed things
      require YAML::Old;
      if (defined YAML::Old->global_object()->{blessed_map}{$node_id}) {
          $value = YAML::Old->global_object()->{blessed_map}{$node_id};
          $self->transferred->{$node_id} = $value;
          ($class, $type, $node_id) = $self->node_info($value, $stringify);
          $self->_prewalk($value);
          return;
      }
  
      # Handle hard refs
      if ($type eq 'REF' or $type eq 'SCALAR') {
          $value = YAML::Old::Type::ref->yaml_dump($value);
          $self->transferred->{$node_id} = $value;
          (undef, $type, $node_id) = $self->node_info($value, $stringify);
      }
  
      # Handle ref-to-glob's
      elsif ($type eq 'GLOB') {
          my $ref_ynode = $self->transferred->{$node_id} =
            YAML::Old::Type::ref->yaml_dump($value);
  
          my $glob_ynode = $ref_ynode->{&VALUE} =
            YAML::Old::Type::glob->yaml_dump($$value);
  
          (undef, undef, $node_id) = $self->node_info($glob_ynode, $stringify);
          $self->transferred->{$node_id} = $glob_ynode;
          $self->_prewalk($glob_ynode);
          return;
      }
  
      # Increment ref count for node
      return if ++($self->{id_refcnt}{$node_id}) > 1;
  
      # Keep on walking
      if ($type eq 'HASH') {
          $self->_prewalk($value->{$_})
              for keys %{$value};
          return;
      }
      elsif ($type eq 'ARRAY') {
          $self->_prewalk($_)
              for @{$value};
          return;
      }
  
      # Unknown type. Need to know about it.
      $self->warn(<<"...");
  YAML::Old::Dumper can't handle dumping this type of data.
  Please report this to the author.
  
  id:    $node_id
  type:  $type
  class: $class
  value: $value
  
  ...
  
      return;
  }
  
  # Every data element and sub data element is a node.
  # Everything emitted goes through this function.
  sub _emit_node {
      my $self = shift;
      my ($type, $node_id);
      my $ref = ref($_[0]);
      if ($ref) {
          if ($ref eq 'Regexp') {
              $self->_emit(' !!perl/regexp');
              $self->_emit_str("$_[0]");
              return;
          }
          (undef, $type, $node_id) = $self->node_info($_[0], $self->stringify);
      }
      else {
          $type = $ref || 'SCALAR';
          (undef, undef, $node_id) = $self->node_info(\$_[0], $self->stringify);
      }
  
      my ($ynode, $tag) = ('') x 2;
      my ($value, $context) = (@_, 0);
  
      if (defined $self->transferred->{$node_id}) {
          $value = $self->transferred->{$node_id};
          $ynode = ynode($value);
          if (ref $value) {
              $tag = defined $ynode ? $ynode->tag->short : '';
              (undef, $type, $node_id) =
                $self->node_info($value, $self->stringify);
          }
          else {
              $ynode = ynode($self->transferred->{$node_id});
              $tag = defined $ynode ? $ynode->tag->short : '';
              $type = 'SCALAR';
              (undef, undef, $node_id) =
                $self->node_info(
                    \ $self->transferred->{$node_id},
                    $self->stringify
                );
          }
      }
      elsif ($ynode = ynode($value)) {
          $tag = $ynode->tag->short;
      }
  
      if ($self->use_aliases) {
          $self->{id_refcnt}{$node_id} ||= 0;
          if ($self->{id_refcnt}{$node_id} > 1) {
              if (defined $self->{id_anchor}{$node_id}) {
                  $self->{stream} .= ' *' . $self->{id_anchor}{$node_id} . "\n";
                  return;
              }
              my $anchor = $self->anchor_prefix . $self->{anchor}++;
              $self->{stream} .= ' &' . $anchor;
              $self->{id_anchor}{$node_id} = $anchor;
          }
      }
  
      return $self->_emit_str("$value")   # Stringified object
        if ref($value) and not $type;
      return $self->_emit_scalar($value, $tag)
        if $type eq 'SCALAR' and $tag;
      return $self->_emit_str($value)
        if $type eq 'SCALAR';
      return $self->_emit_mapping($value, $tag, $node_id, $context)
        if $type eq 'HASH';
      return $self->_emit_sequence($value, $tag)
        if $type eq 'ARRAY';
      $self->warn('YAML_DUMP_WARN_BAD_NODE_TYPE', $type);
      return $self->_emit_str("$value");
  }
  
  # A YAML mapping is akin to a Perl hash.
  sub _emit_mapping {
      my $self = shift;
      my ($value, $tag, $node_id, $context) = @_;
      $self->{stream} .= " !$tag" if $tag;
  
      # Sometimes 'keys' fails. Like on a bad tie implementation.
      my $empty_hash = not(eval {keys %$value});
      $self->warn('YAML_EMIT_WARN_KEYS', $@) if $@;
      return ($self->{stream} .= " {}\n") if $empty_hash;
  
      # If CompressSeries is on (default) and legal is this context, then
      # use it and make the indent level be 2 for this node.
      if ($context == FROMARRAY and
          $self->compress_series and
          not (defined $self->{id_anchor}{$node_id} or $tag or $empty_hash)
         ) {
          $self->{stream} .= ' ';
          $self->offset->[$self->level+1] = $self->offset->[$self->level] + 2;
      }
      else {
          $context = 0;
          $self->{stream} .= "\n"
            unless $self->headless && not($self->headless(0));
          $self->offset->[$self->level+1] =
            $self->offset->[$self->level] + $self->indent_width;
      }
  
      $self->{level}++;
      my @keys;
      if ($self->sort_keys == 1) {
          if (ynode($value)) {
              @keys = keys %$value;
          }
          else {
              @keys = sort keys %$value;
          }
      }
      elsif ($self->sort_keys == 2) {
          @keys = sort keys %$value;
      }
      # XXX This is hackish but sometimes handy. Not sure whether to leave it in.
      elsif (ref($self->sort_keys) eq 'ARRAY') {
          my $i = 1;
          my %order = map { ($_, $i++) } @{$self->sort_keys};
          @keys = sort {
              (defined $order{$a} and defined $order{$b})
                ? ($order{$a} <=> $order{$b})
                : ($a cmp $b);
          } keys %$value;
      }
      else {
          @keys = keys %$value;
      }
      # Force the YAML::VALUE ('=') key to sort last.
      if (exists $value->{&VALUE}) {
          for (my $i = 0; $i < @keys; $i++) {
              if ($keys[$i] eq &VALUE) {
                  splice(@keys, $i, 1);
                  push @keys, &VALUE;
                  last;
              }
          }
      }
  
      for my $key (@keys) {
          $self->_emit_key($key, $context);
          $context = 0;
          $self->{stream} .= ':';
          $self->_emit_node($value->{$key});
      }
      $self->{level}--;
  }
  
  # A YAML series is akin to a Perl array.
  sub _emit_sequence {
      my $self = shift;
      my ($value, $tag) = @_;
      $self->{stream} .= " !$tag" if $tag;
  
      return ($self->{stream} .= " []\n") if @$value == 0;
  
      $self->{stream} .= "\n"
        unless $self->headless && not($self->headless(0));
  
      # XXX Really crufty feature. Better implemented by ynodes.
      if ($self->inline_series and
          @$value <= $self->inline_series and
          not (scalar grep {ref or /\n/} @$value)
         ) {
          $self->{stream} =~ s/\n\Z/ /;
          $self->{stream} .= '[';
          for (my $i = 0; $i < @$value; $i++) {
              $self->_emit_str($value->[$i], KEY);
              last if $i == $#{$value};
              $self->{stream} .= ', ';
          }
          $self->{stream} .= "]\n";
          return;
      }
  
      $self->offset->[$self->level + 1] =
        $self->offset->[$self->level] + $self->indent_width;
      $self->{level}++;
      for my $val (@$value) {
          $self->{stream} .= ' ' x $self->offset->[$self->level];
          $self->{stream} .= '-';
          $self->_emit_node($val, FROMARRAY);
      }
      $self->{level}--;
  }
  
  # Emit a mapping key
  sub _emit_key {
      my $self = shift;
      my ($value, $context) = @_;
      $self->{stream} .= ' ' x $self->offset->[$self->level]
        unless $context == FROMARRAY;
      $self->_emit_str($value, KEY);
  }
  
  # Emit a blessed SCALAR
  sub _emit_scalar {
      my $self = shift;
      my ($value, $tag) = @_;
      $self->{stream} .= " !$tag";
      $self->_emit_str($value, BLESSED);
  }
  
  sub _emit {
      my $self = shift;
      $self->{stream} .= join '', @_;
  }
  
  # Emit a string value. YAML has many scalar styles. This routine attempts to
  # guess the best style for the text.
  sub _emit_str {
      my $self = shift;
      my $type = $_[1] || 0;
  
      # Use heuristics to find the best scalar emission style.
      $self->offset->[$self->level + 1] =
        $self->offset->[$self->level] + $self->indent_width;
      $self->{level}++;
  
      my $sf = $type == KEY ? '' : ' ';
      my $sb = $type == KEY ? '? ' : ' ';
      my $ef = $type == KEY ? '' : "\n";
      my $eb = "\n";
  
      while (1) {
          $self->_emit($sf),
          $self->_emit_plain($_[0]),
          $self->_emit($ef), last
            if not defined $_[0];
          $self->_emit($sf, '=', $ef), last
            if $_[0] eq VALUE;
          $self->_emit($sf),
          $self->_emit_double($_[0]),
          $self->_emit($ef), last
            if $_[0] =~ /$ESCAPE_CHAR/;
          if ($_[0] =~ /\n/) {
              $self->_emit($sb),
              $self->_emit_block($LIT_CHAR, $_[0]),
              $self->_emit($eb), last
                if $self->use_block;
                Carp::cluck "[YAML::Old] \$UseFold is no longer supported"
                if $self->use_fold;
              $self->_emit($sf),
              $self->_emit_double($_[0]),
              $self->_emit($ef), last
                if length $_[0] <= 30;
              $self->_emit($sf),
              $self->_emit_double($_[0]),
              $self->_emit($ef), last
                if $_[0] !~ /\n\s*\S/;
              $self->_emit($sb),
              $self->_emit_block($LIT_CHAR, $_[0]),
              $self->_emit($eb), last;
          }
          $self->_emit($sf),
          $self->_emit_number($_[0]),
          $self->_emit($ef), last
            if $self->is_literal_number($_[0]);
          $self->_emit($sf),
          $self->_emit_plain($_[0]),
          $self->_emit($ef), last
            if $self->is_valid_plain($_[0]);
          $self->_emit($sf),
          $self->_emit_double($_[0]),
          $self->_emit($ef), last
            if $_[0] =~ /'/;
          $self->_emit($sf),
          $self->_emit_single($_[0]),
          $self->_emit($ef);
          last;
      }
  
      $self->{level}--;
  
      return;
  }
  
  sub is_literal_number {
      my $self = shift;
      # Stolen from JSON::Tiny
      return B::svref_2object(\$_[0])->FLAGS & (B::SVp_IOK | B::SVp_NOK)
              && 0 + $_[0] eq $_[0];
  }
  
  sub _emit_number {
      my $self = shift;
      return $self->_emit_plain($_[0]);
  }
  
  # Check whether or not a scalar should be emitted as an plain scalar.
  sub is_valid_plain {
      my $self = shift;
      return 0 unless length $_[0];
      return 0 if $self->quote_numeric_strings and Scalar::Util::looks_like_number($_[0]);
      # refer to YAML::Old::Loader::parse_inline_simple()
      return 0 if $_[0] =~ /^[\s\{\[\~\`\'\"\!\@\#\>\|\%\&\?\*\^]/;
      return 0 if $_[0] =~ /[\{\[\]\},]/;
      return 0 if $_[0] =~ /[:\-\?]\s/;
      return 0 if $_[0] =~ /\s#/;
      return 0 if $_[0] =~ /\:(\s|$)/;
      return 0 if $_[0] =~ /[\s\|\>]$/;
      return 0 if $_[0] eq '-';
      return 1;
  }
  
  sub _emit_block {
      my $self = shift;
      my ($indicator, $value) = @_;
      $self->{stream} .= $indicator;
      $value =~ /(\n*)\Z/;
      my $chomp = length $1 ? (length $1 > 1) ? '+' : '' : '-';
      $value = '~' if not defined $value;
      $self->{stream} .= $chomp;
      $self->{stream} .= $self->indent_width if $value =~ /^\s/;
      $self->{stream} .= $self->indent($value);
  }
  
  # Plain means that the scalar is unquoted.
  sub _emit_plain {
      my $self = shift;
      $self->{stream} .= defined $_[0] ? $_[0] : '~';
  }
  
  # Double quoting is for single lined escaped strings.
  sub _emit_double {
      my $self = shift;
      (my $escaped = $self->escape($_[0])) =~ s/"/\\"/g;
      $self->{stream} .= qq{"$escaped"};
  }
  
  # Single quoting is for single lined unescaped strings.
  sub _emit_single {
      my $self = shift;
      my $item = shift;
      $item =~ s{'}{''}g;
      $self->{stream} .= "'$item'";
  }
  
  #==============================================================================
  # Utility subroutines.
  #==============================================================================
  
  # Indent a scalar to the current indentation level.
  sub indent {
      my $self = shift;
      my ($text) = @_;
      return $text unless length $text;
      $text =~ s/\n\Z//;
      my $indent = ' ' x $self->offset->[$self->level];
      $text =~ s/^/$indent/gm;
      $text = "\n$text";
      return $text;
  }
  
  # Escapes for unprintable characters
  my @escapes = qw(\0   \x01 \x02 \x03 \x04 \x05 \x06 \a
                   \x08 \t   \n   \v   \f   \r   \x0e \x0f
                   \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17
                   \x18 \x19 \x1a \e   \x1c \x1d \x1e \x1f
                  );
  
  # Escape the unprintable characters
  sub escape {
      my $self = shift;
      my ($text) = @_;
      $text =~ s/\\/\\\\/g;
      $text =~ s/([\x00-\x1f])/$escapes[ord($1)]/ge;
      return $text;
  }
  
  1;
YAML_OLD_DUMPER

    $main::fatpacked{"YAML/Old/Dumper/Base.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'YAML_OLD_DUMPER_BASE';
  package YAML::Old::Dumper::Base;
  
  use YAML::Old::Mo;
  
  use YAML::Old::Node;
  
  # YAML Dumping options
  has spec_version    => default => sub {'1.0'};
  has indent_width    => default => sub {2};
  has use_header      => default => sub {1};
  has use_version     => default => sub {0};
  has sort_keys       => default => sub {1};
  has anchor_prefix   => default => sub {''};
  has dump_code       => default => sub {0};
  has use_block       => default => sub {0};
  has use_fold        => default => sub {0};
  has compress_series => default => sub {1};
  has inline_series   => default => sub {0};
  has use_aliases     => default => sub {1};
  has purity          => default => sub {0};
  has stringify       => default => sub {0};
  has quote_numeric_strings => default => sub {0};
  
  # Properties
  has stream      => default => sub {''};
  has document    => default => sub {0};
  has transferred => default => sub {{}};
  has id_refcnt   => default => sub {{}};
  has id_anchor   => default => sub {{}};
  has anchor      => default => sub {1};
  has level       => default => sub {0};
  has offset      => default => sub {[]};
  has headless    => default => sub {0};
  has blessed_map => default => sub {{}};
  
  # Global Options are an idea taken from Data::Dumper. Really they are just
  # sugar on top of real OO properties. They make the simple Dump/Load API
  # easy to configure.
  sub set_global_options {
      my $self = shift;
      $self->spec_version($YAML::SpecVersion)
        if defined $YAML::SpecVersion;
      $self->indent_width($YAML::Indent)
        if defined $YAML::Indent;
      $self->use_header($YAML::UseHeader)
        if defined $YAML::UseHeader;
      $self->use_version($YAML::UseVersion)
        if defined $YAML::UseVersion;
      $self->sort_keys($YAML::SortKeys)
        if defined $YAML::SortKeys;
      $self->anchor_prefix($YAML::AnchorPrefix)
        if defined $YAML::AnchorPrefix;
      $self->dump_code($YAML::DumpCode || $YAML::UseCode)
        if defined $YAML::DumpCode or defined $YAML::UseCode;
      $self->use_block($YAML::UseBlock)
        if defined $YAML::UseBlock;
      $self->use_fold($YAML::UseFold)
        if defined $YAML::UseFold;
      $self->compress_series($YAML::CompressSeries)
        if defined $YAML::CompressSeries;
      $self->inline_series($YAML::InlineSeries)
        if defined $YAML::InlineSeries;
      $self->use_aliases($YAML::UseAliases)
        if defined $YAML::UseAliases;
      $self->purity($YAML::Purity)
        if defined $YAML::Purity;
      $self->stringify($YAML::Stringify)
        if defined $YAML::Stringify;
      $self->quote_numeric_strings($YAML::QuoteNumericStrings)
        if defined $YAML::QuoteNumericStrings;
  }
  
  sub dump {
      my $self = shift;
      $self->die('dump() not implemented in this class.');
  }
  
  sub blessed {
      my $self = shift;
      my ($ref) = @_;
      $ref = \$_[0] unless ref $ref;
      my (undef, undef, $node_id) = YAML::Old::Mo::Object->node_info($ref);
      $self->{blessed_map}->{$node_id};
  }
  
  sub bless {
      my $self = shift;
      my ($ref, $blessing) = @_;
      my $ynode;
      $ref = \$_[0] unless ref $ref;
      my (undef, undef, $node_id) = YAML::Old::Mo::Object->node_info($ref);
      if (not defined $blessing) {
          $ynode = YAML::Old::Node->new($ref);
      }
      elsif (ref $blessing) {
          $self->die() unless ynode($blessing);
          $ynode = $blessing;
      }
      else {
          no strict 'refs';
          my $transfer = $blessing . "::yaml_dump";
          $self->die() unless defined &{$transfer};
          $ynode = &{$transfer}($ref);
          $self->die() unless ynode($ynode);
      }
      $self->{blessed_map}->{$node_id} = $ynode;
      my $object = ynode($ynode) or $self->die();
      return $object;
  }
  
  1;
YAML_OLD_DUMPER_BASE

    $main::fatpacked{"YAML/Old/Error.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'YAML_OLD_ERROR';
  package YAML::Old::Error;
  
  use YAML::Old::Mo;
  
  has 'code';
  has 'type' => default => sub {'Error'};
  has 'line';
  has 'document';
  has 'arguments' => default => sub {[]};
  
  my ($error_messages, %line_adjust);
  
  sub format_message {
      my $self = shift;
      my $output = 'YAML::Old ' . $self->type . ': ';
      my $code = $self->code;
      if ($error_messages->{$code}) {
          $code = sprintf($error_messages->{$code}, @{$self->arguments});
      }
      $output .= $code . "\n";
  
      $output .= '   Code: ' . $self->code . "\n"
          if defined $self->code;
      $output .= '   Line: ' . $self->line . "\n"
          if defined $self->line;
      $output .= '   Document: ' . $self->document . "\n"
          if defined $self->document;
      return $output;
  }
  
  sub error_messages {
      $error_messages;
  }
  
  %$error_messages = map {s/^\s+//;s/\\n/\n/;$_} split "\n", <<'...';
  YAML_PARSE_ERR_BAD_CHARS
    Invalid characters in stream. This parser only supports printable ASCII
  YAML_PARSE_ERR_BAD_MAJOR_VERSION
    Can't parse a %s document with a 1.0 parser
  YAML_PARSE_WARN_BAD_MINOR_VERSION
    Parsing a %s document with a 1.0 parser
  YAML_PARSE_WARN_MULTIPLE_DIRECTIVES
    '%s directive used more than once'
  YAML_PARSE_ERR_TEXT_AFTER_INDICATOR
    No text allowed after indicator
  YAML_PARSE_ERR_NO_ANCHOR
    No anchor for alias '*%s'
  YAML_PARSE_ERR_NO_SEPARATOR
    Expected separator '---'
  YAML_PARSE_ERR_SINGLE_LINE
    Couldn't parse single line value
  YAML_PARSE_ERR_BAD_ANCHOR
    Invalid anchor
  YAML_DUMP_ERR_INVALID_INDENT
    Invalid Indent width specified: '%s'
  YAML_LOAD_USAGE
    usage: YAML::Old::Load($yaml_stream_scalar)
  YAML_PARSE_ERR_BAD_NODE
    Can't parse node
  YAML_PARSE_ERR_BAD_EXPLICIT
    Unsupported explicit transfer: '%s'
  YAML_DUMP_USAGE_DUMPCODE
    Invalid value for DumpCode: '%s'
  YAML_LOAD_ERR_FILE_INPUT
    Couldn't open %s for input:\n%s
  YAML_DUMP_ERR_FILE_CONCATENATE
    Can't concatenate to YAML file %s
  YAML_DUMP_ERR_FILE_OUTPUT
    Couldn't open %s for output:\n%s
  YAML_DUMP_ERR_FILE_OUTPUT_CLOSE
    Error closing %s:\n%s
  YAML_DUMP_ERR_NO_HEADER
    With UseHeader=0, the node must be a plain hash or array
  YAML_DUMP_WARN_BAD_NODE_TYPE
    Can't perform serialization for node type: '%s'
  YAML_EMIT_WARN_KEYS
    Encountered a problem with 'keys':\n%s
  YAML_DUMP_WARN_DEPARSE_FAILED
    Deparse failed for CODE reference
  YAML_DUMP_WARN_CODE_DUMMY
    Emitting dummy subroutine for CODE reference
  YAML_PARSE_ERR_MANY_EXPLICIT
    More than one explicit transfer
  YAML_PARSE_ERR_MANY_IMPLICIT
    More than one implicit request
  YAML_PARSE_ERR_MANY_ANCHOR
    More than one anchor
  YAML_PARSE_ERR_ANCHOR_ALIAS
    Can't define both an anchor and an alias
  YAML_PARSE_ERR_BAD_ALIAS
    Invalid alias
  YAML_PARSE_ERR_MANY_ALIAS
    More than one alias
  YAML_LOAD_ERR_NO_CONVERT
    Can't convert implicit '%s' node to explicit '%s' node
  YAML_LOAD_ERR_NO_DEFAULT_VALUE
    No default value for '%s' explicit transfer
  YAML_LOAD_ERR_NON_EMPTY_STRING
    Only the empty string can be converted to a '%s'
  YAML_LOAD_ERR_BAD_MAP_TO_SEQ
    Can't transfer map as sequence. Non numeric key '%s' encountered.
  YAML_DUMP_ERR_BAD_GLOB
    '%s' is an invalid value for Perl glob
  YAML_DUMP_ERR_BAD_REGEXP
    '%s' is an invalid value for Perl Regexp
  YAML_LOAD_ERR_BAD_MAP_ELEMENT
    Invalid element in map
  YAML_LOAD_WARN_DUPLICATE_KEY
    Duplicate map key '%s' found. Ignoring.
  YAML_LOAD_ERR_BAD_SEQ_ELEMENT
    Invalid element in sequence
  YAML_PARSE_ERR_INLINE_MAP
    Can't parse inline map
  YAML_PARSE_ERR_INLINE_SEQUENCE
    Can't parse inline sequence
  YAML_PARSE_ERR_BAD_DOUBLE
    Can't parse double quoted string
  YAML_PARSE_ERR_BAD_SINGLE
    Can't parse single quoted string
  YAML_PARSE_ERR_BAD_INLINE_IMPLICIT
    Can't parse inline implicit value '%s'
  YAML_PARSE_ERR_BAD_IMPLICIT
    Unrecognized implicit value '%s'
  YAML_PARSE_ERR_INDENTATION
    Error. Invalid indentation level
  YAML_PARSE_ERR_INCONSISTENT_INDENTATION
    Inconsistent indentation level
  YAML_LOAD_WARN_UNRESOLVED_ALIAS
    Can't resolve alias *%s
  YAML_LOAD_WARN_NO_REGEXP_IN_REGEXP
    No 'REGEXP' element for Perl regexp
  YAML_LOAD_WARN_BAD_REGEXP_ELEM
    Unknown element '%s' in Perl regexp
  YAML_LOAD_WARN_GLOB_NAME
    No 'NAME' element for Perl glob
  YAML_LOAD_WARN_PARSE_CODE
    Couldn't parse Perl code scalar: %s
  YAML_LOAD_WARN_CODE_DEPARSE
    Won't parse Perl code unless $YAML::LoadCode is set
  YAML_EMIT_ERR_BAD_LEVEL
    Internal Error: Bad level detected
  YAML_PARSE_WARN_AMBIGUOUS_TAB
    Amibiguous tab converted to spaces
  YAML_LOAD_WARN_BAD_GLOB_ELEM
    Unknown element '%s' in Perl glob
  YAML_PARSE_ERR_ZERO_INDENT
    Can't use zero as an indentation width
  YAML_LOAD_WARN_GLOB_IO
    Can't load an IO filehandle. Yet!!!
  ...
  
  %line_adjust = map {($_, 1)}
    qw(YAML_PARSE_ERR_BAD_MAJOR_VERSION
       YAML_PARSE_WARN_BAD_MINOR_VERSION
       YAML_PARSE_ERR_TEXT_AFTER_INDICATOR
       YAML_PARSE_ERR_NO_ANCHOR
       YAML_PARSE_ERR_MANY_EXPLICIT
       YAML_PARSE_ERR_MANY_IMPLICIT
       YAML_PARSE_ERR_MANY_ANCHOR
       YAML_PARSE_ERR_ANCHOR_ALIAS
       YAML_PARSE_ERR_BAD_ALIAS
       YAML_PARSE_ERR_MANY_ALIAS
       YAML_LOAD_ERR_NO_CONVERT
       YAML_LOAD_ERR_NO_DEFAULT_VALUE
       YAML_LOAD_ERR_NON_EMPTY_STRING
       YAML_LOAD_ERR_BAD_MAP_TO_SEQ
       YAML_LOAD_ERR_BAD_STR_TO_INT
       YAML_LOAD_ERR_BAD_STR_TO_DATE
       YAML_LOAD_ERR_BAD_STR_TO_TIME
       YAML_LOAD_WARN_DUPLICATE_KEY
       YAML_PARSE_ERR_INLINE_MAP
       YAML_PARSE_ERR_INLINE_SEQUENCE
       YAML_PARSE_ERR_BAD_DOUBLE
       YAML_PARSE_ERR_BAD_SINGLE
       YAML_PARSE_ERR_BAD_INLINE_IMPLICIT
       YAML_PARSE_ERR_BAD_IMPLICIT
       YAML_LOAD_WARN_NO_REGEXP_IN_REGEXP
       YAML_LOAD_WARN_BAD_REGEXP_ELEM
       YAML_LOAD_WARN_REGEXP_CREATE
       YAML_LOAD_WARN_GLOB_NAME
       YAML_LOAD_WARN_PARSE_CODE
       YAML_LOAD_WARN_CODE_DEPARSE
       YAML_LOAD_WARN_BAD_GLOB_ELEM
       YAML_PARSE_ERR_ZERO_INDENT
      );
  
  package YAML::Old::Warning;
  
  our @ISA = 'YAML::Old::Error';
  
  1;
YAML_OLD_ERROR

    $main::fatpacked{"YAML/Old/Loader.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'YAML_OLD_LOADER';
  package YAML::Old::Loader;
  
  use YAML::Old::Mo;
  extends 'YAML::Old::Loader::Base';
  
  use YAML::Old::Loader::Base;
  use YAML::Old::Types;
  use YAML::Old::Node;
  
  # Context constants
  use constant LEAF       => 1;
  use constant COLLECTION => 2;
  use constant VALUE      => "\x07YAML\x07VALUE\x07";
  use constant COMMENT    => "\x07YAML\x07COMMENT\x07";
  
  # Common YAML character sets
  my $ESCAPE_CHAR = '[\\x00-\\x08\\x0b-\\x0d\\x0e-\\x1f]';
  my $FOLD_CHAR   = '>';
  my $LIT_CHAR    = '|';
  my $LIT_CHAR_RX = "\\$LIT_CHAR";
  
  sub load {
      my $self = shift;
      $self->stream($_[0] || '');
      return $self->_parse();
  }
  
  # Top level function for parsing. Parse each document in order and
  # handle processing for YAML headers.
  sub _parse {
      my $self = shift;
      my (%directives, $preface);
      $self->{stream} =~ s|\015\012|\012|g;
      $self->{stream} =~ s|\015|\012|g;
      $self->line(0);
      $self->die('YAML_PARSE_ERR_BAD_CHARS')
        if $self->stream =~ /$ESCAPE_CHAR/;
      $self->{stream} =~ s/(.)\n\Z/$1/s;
      $self->lines([split /\x0a/, $self->stream, -1]);
      $self->line(1);
      # Throw away any comments or blanks before the header (or start of
      # content for headerless streams)
      $self->_parse_throwaway_comments();
      $self->document(0);
      $self->documents([]);
      # Add an "assumed" header if there is no header and the stream is
      # not empty (after initial throwaways).
      if (not $self->eos) {
          if ($self->lines->[0] !~ /^---(\s|$)/) {
              unshift @{$self->lines}, '---';
              $self->{line}--;
          }
      }
  
      # Main Loop. Parse out all the top level nodes and return them.
      while (not $self->eos) {
          $self->anchor2node({});
          $self->{document}++;
          $self->done(0);
          $self->level(0);
          $self->offset->[0] = -1;
  
          if ($self->lines->[0] =~ /^---\s*(.*)$/) {
              my @words = split /\s+/, $1;
              %directives = ();
              while (@words && $words[0] =~ /^#(\w+):(\S.*)$/) {
                  my ($key, $value) = ($1, $2);
                  shift(@words);
                  if (defined $directives{$key}) {
                      $self->warn('YAML_PARSE_WARN_MULTIPLE_DIRECTIVES',
                        $key, $self->document);
                      next;
                  }
                  $directives{$key} = $value;
              }
              $self->preface(join ' ', @words);
          }
          else {
              $self->die('YAML_PARSE_ERR_NO_SEPARATOR');
          }
  
          if (not $self->done) {
              $self->_parse_next_line(COLLECTION);
          }
          if ($self->done) {
              $self->{indent} = -1;
              $self->content('');
          }
  
          $directives{YAML} ||= '1.0';
          $directives{TAB} ||= 'NONE';
          ($self->{major_version}, $self->{minor_version}) =
            split /\./, $directives{YAML}, 2;
          $self->die('YAML_PARSE_ERR_BAD_MAJOR_VERSION', $directives{YAML})
            if $self->major_version ne '1';
          $self->warn('YAML_PARSE_WARN_BAD_MINOR_VERSION', $directives{YAML})
            if $self->minor_version ne '0';
          $self->die('Unrecognized TAB policy')
            unless $directives{TAB} =~ /^(NONE|\d+)(:HARD)?$/;
  
          push @{$self->documents}, $self->_parse_node();
      }
      return wantarray ? @{$self->documents} : $self->documents->[-1];
  }
  
  # This function is the dispatcher for parsing each node. Every node
  # recurses back through here. (Inlines are an exception as they have
  # their own sub-parser.)
  sub _parse_node {
      my $self = shift;
      my $preface = $self->preface;
      $self->preface('');
      my ($node, $type, $indicator, $escape, $chomp) = ('') x 5;
      my ($anchor, $alias, $explicit, $implicit, $class) = ('') x 5;
      ($anchor, $alias, $explicit, $implicit, $preface) =
        $self->_parse_qualifiers($preface);
      if ($anchor) {
          $self->anchor2node->{$anchor} = CORE::bless [], 'YAML-anchor2node';
      }
      $self->inline('');
      while (length $preface) {
          my $line = $self->line - 1;
          if ($preface =~ s/^($FOLD_CHAR|$LIT_CHAR_RX)(-|\+)?\d*\s*//) {
              $indicator = $1;
              $chomp = $2 if defined($2);
          }
          else {
              $self->die('YAML_PARSE_ERR_TEXT_AFTER_INDICATOR') if $indicator;
              $self->inline($preface);
              $preface = '';
          }
      }
      if ($alias) {
          $self->die('YAML_PARSE_ERR_NO_ANCHOR', $alias)
            unless defined $self->anchor2node->{$alias};
          if (ref($self->anchor2node->{$alias}) ne 'YAML-anchor2node') {
              $node = $self->anchor2node->{$alias};
          }
          else {
              $node = do {my $sv = "*$alias"};
              push @{$self->anchor2node->{$alias}}, [\$node, $self->line];
          }
      }
      elsif (length $self->inline) {
          $node = $self->_parse_inline(1, $implicit, $explicit);
          if (length $self->inline) {
              $self->die('YAML_PARSE_ERR_SINGLE_LINE');
          }
      }
      elsif ($indicator eq $LIT_CHAR) {
          $self->{level}++;
          $node = $self->_parse_block($chomp);
          $node = $self->_parse_implicit($node) if $implicit;
          $self->{level}--;
      }
      elsif ($indicator eq $FOLD_CHAR) {
          $self->{level}++;
          $node = $self->_parse_unfold($chomp);
          $node = $self->_parse_implicit($node) if $implicit;
          $self->{level}--;
      }
      else {
          $self->{level}++;
          $self->offset->[$self->level] ||= 0;
          if ($self->indent == $self->offset->[$self->level]) {
              if ($self->content =~ /^-( |$)/) {
                  $node = $self->_parse_seq($anchor);
              }
              elsif ($self->content =~ /(^\?|\:( |$))/) {
                  $node = $self->_parse_mapping($anchor);
              }
              elsif ($preface =~ /^\s*$/) {
                  $node = $self->_parse_implicit('');
              }
              else {
                  $self->die('YAML_PARSE_ERR_BAD_NODE');
              }
          }
          else {
              $node = undef;
          }
          $self->{level}--;
      }
      $#{$self->offset} = $self->level;
  
      if ($explicit) {
          if ($class) {
              if (not ref $node) {
                  my $copy = $node;
                  undef $node;
                  $node = \$copy;
              }
              CORE::bless $node, $class;
          }
          else {
              $node = $self->_parse_explicit($node, $explicit);
          }
      }
      if ($anchor) {
          if (ref($self->anchor2node->{$anchor}) eq 'YAML-anchor2node') {
              # XXX Can't remember what this code actually does
              for my $ref (@{$self->anchor2node->{$anchor}}) {
                  ${$ref->[0]} = $node;
                  $self->warn('YAML_LOAD_WARN_UNRESOLVED_ALIAS',
                      $anchor, $ref->[1]);
              }
          }
          $self->anchor2node->{$anchor} = $node;
      }
      return $node;
  }
  
  # Preprocess the qualifiers that may be attached to any node.
  sub _parse_qualifiers {
      my $self = shift;
      my ($preface) = @_;
      my ($anchor, $alias, $explicit, $implicit, $token) = ('') x 5;
      $self->inline('');
      while ($preface =~ /^[&*!]/) {
          my $line = $self->line - 1;
          if ($preface =~ s/^\!(\S+)\s*//) {
              $self->die('YAML_PARSE_ERR_MANY_EXPLICIT') if $explicit;
              $explicit = $1;
          }
          elsif ($preface =~ s/^\!\s*//) {
              $self->die('YAML_PARSE_ERR_MANY_IMPLICIT') if $implicit;
              $implicit = 1;
          }
          elsif ($preface =~ s/^\&([^ ,:]*)\s*//) {
              $token = $1;
              $self->die('YAML_PARSE_ERR_BAD_ANCHOR')
                unless $token =~ /^[a-zA-Z0-9]+$/;
              $self->die('YAML_PARSE_ERR_MANY_ANCHOR') if $anchor;
              $self->die('YAML_PARSE_ERR_ANCHOR_ALIAS') if $alias;
              $anchor = $token;
          }
          elsif ($preface =~ s/^\*([^ ,:]*)\s*//) {
              $token = $1;
              $self->die('YAML_PARSE_ERR_BAD_ALIAS')
                unless $token =~ /^[a-zA-Z0-9]+$/;
              $self->die('YAML_PARSE_ERR_MANY_ALIAS') if $alias;
              $self->die('YAML_PARSE_ERR_ANCHOR_ALIAS') if $anchor;
              $alias = $token;
          }
      }
      return ($anchor, $alias, $explicit, $implicit, $preface);
  }
  
  # Morph a node to it's explicit type
  sub _parse_explicit {
      my $self = shift;
      my ($node, $explicit) = @_;
      my ($type, $class);
      if ($explicit =~ /^\!?perl\/(hash|array|ref|scalar)(?:\:(\w(\w|\:\:)*)?)?$/) {
          ($type, $class) = (($1 || ''), ($2 || ''));
  
          # FIXME # die unless uc($type) eq ref($node) ?
  
          if ( $type eq "ref" ) {
              $self->die('YAML_LOAD_ERR_NO_DEFAULT_VALUE', 'XXX', $explicit)
              unless exists $node->{VALUE()} and scalar(keys %$node) == 1;
  
              my $value = $node->{VALUE()};
              $node = \$value;
          }
  
          if ( $type eq "scalar" and length($class) and !ref($node) ) {
              my $value = $node;
              $node = \$value;
          }
  
          if ( length($class) ) {
              CORE::bless($node, $class);
          }
  
          return $node;
      }
      if ($explicit =~ m{^!?perl/(glob|regexp|code)(?:\:(\w(\w|\:\:)*)?)?$}) {
          ($type, $class) = (($1 || ''), ($2 || ''));
          my $type_class = "YAML::Old::Type::$type";
          no strict 'refs';
          if ($type_class->can('yaml_load')) {
              return $type_class->yaml_load($node, $class, $self);
          }
          else {
              $self->die('YAML_LOAD_ERR_NO_CONVERT', 'XXX', $explicit);
          }
      }
      # This !perl/@Foo and !perl/$Foo are deprecated but still parsed
      elsif ($YAML::TagClass->{$explicit} ||
             $explicit =~ m{^perl/(\@|\$)?([a-zA-Z](\w|::)+)$}
            ) {
          $class = $YAML::TagClass->{$explicit} || $2;
          if ($class->can('yaml_load')) {
              require YAML::Old::Node;
              return $class->yaml_load(YAML::Old::Node->new($node, $explicit));
          }
          else {
              if (ref $node) {
                  return CORE::bless $node, $class;
              }
              else {
                  return CORE::bless \$node, $class;
              }
          }
      }
      elsif (ref $node) {
          require YAML::Old::Node;
          return YAML::Old::Node->new($node, $explicit);
      }
      else {
          # XXX This is likely wrong. Failing test:
          # --- !unknown 'scalar value'
          return $node;
      }
  }
  
  # Parse a YAML mapping into a Perl hash
  sub _parse_mapping {
      my $self = shift;
      my ($anchor) = @_;
      my $mapping = $self->preserve ? YAML::Old::Node->new({}) : {};
      $self->anchor2node->{$anchor} = $mapping;
      my $key;
      while (not $self->done and $self->indent == $self->offset->[$self->level]) {
          # If structured key:
          if ($self->{content} =~ s/^\?\s*//) {
              $self->preface($self->content);
              $self->_parse_next_line(COLLECTION);
              $key = $self->_parse_node();
              $key = "$key";
          }
          # If "default" key (equals sign)
          elsif ($self->{content} =~ s/^\=\s*//) {
              $key = VALUE;
          }
          # If "comment" key (slash slash)
          elsif ($self->{content} =~ s/^\=\s*//) {
              $key = COMMENT;
          }
          # Regular scalar key:
          else {
              $self->inline($self->content);
              $key = $self->_parse_inline();
              $key = "$key";
              $self->content($self->inline);
              $self->inline('');
          }
  
          unless ($self->{content} =~ s/^:\s*//) {
              $self->die('YAML_LOAD_ERR_BAD_MAP_ELEMENT');
          }
          $self->preface($self->content);
          my $line = $self->line;
          $self->_parse_next_line(COLLECTION);
          my $value = $self->_parse_node();
          if (exists $mapping->{$key}) {
              $self->warn('YAML_LOAD_WARN_DUPLICATE_KEY', $key);
          }
          else {
              $mapping->{$key} = $value;
          }
      }
      return $mapping;
  }
  
  # Parse a YAML sequence into a Perl array
  sub _parse_seq {
      my $self = shift;
      my ($anchor) = @_;
      my $seq = [];
      $self->anchor2node->{$anchor} = $seq;
      while (not $self->done and $self->indent == $self->offset->[$self->level]) {
          if ($self->content =~ /^-(?: (.*))?$/) {
              $self->preface(defined($1) ? $1 : '');
          }
          else {
              $self->die('YAML_LOAD_ERR_BAD_SEQ_ELEMENT');
          }
  
          # Check whether the preface looks like a YAML mapping ("key: value").
          # This is complicated because it has to account for the possibility
          # that a key is a quoted string, which itself may contain escaped
          # quotes.
          my $preface = $self->preface;
          if ( $preface =~ /^ (\s*) ( \w .*?               \: (?:\ |$).*) $/x  or
               $preface =~ /^ (\s*) ((') (?:''|[^'])*? ' \s* \: (?:\ |$).*) $/x or
               $preface =~ /^ (\s*) ((") (?:\\\\|[^"])*? " \s* \: (?:\ |$).*) $/x
             ) {
              $self->indent($self->offset->[$self->level] + 2 + length($1));
              $self->content($2);
              $self->level($self->level + 1);
              $self->offset->[$self->level] = $self->indent;
              $self->preface('');
              push @$seq, $self->_parse_mapping('');
              $self->{level}--;
              $#{$self->offset} = $self->level;
          }
          else {
              $self->_parse_next_line(COLLECTION);
              push @$seq, $self->_parse_node();
          }
      }
      return $seq;
  }
  
  # Parse an inline value. Since YAML supports inline collections, this is
  # the top level of a sub parsing.
  sub _parse_inline {
      my $self = shift;
      my ($top, $top_implicit, $top_explicit) = (@_, '', '', '');
      $self->{inline} =~ s/^\s*(.*)\s*$/$1/; # OUCH - mugwump
      my ($node, $anchor, $alias, $explicit, $implicit) = ('') x 5;
      ($anchor, $alias, $explicit, $implicit, $self->{inline}) =
        $self->_parse_qualifiers($self->inline);
      if ($anchor) {
          $self->anchor2node->{$anchor} = CORE::bless [], 'YAML-anchor2node';
      }
      $implicit ||= $top_implicit;
      $explicit ||= $top_explicit;
      ($top_implicit, $top_explicit) = ('', '');
      if ($alias) {
          $self->die('YAML_PARSE_ERR_NO_ANCHOR', $alias)
            unless defined $self->anchor2node->{$alias};
          if (ref($self->anchor2node->{$alias}) ne 'YAML-anchor2node') {
              $node = $self->anchor2node->{$alias};
          }
          else {
              $node = do {my $sv = "*$alias"};
              push @{$self->anchor2node->{$alias}}, [\$node, $self->line];
          }
      }
      elsif ($self->inline =~ /^\{/) {
          $node = $self->_parse_inline_mapping($anchor);
      }
      elsif ($self->inline =~ /^\[/) {
          $node = $self->_parse_inline_seq($anchor);
      }
      elsif ($self->inline =~ /^"/) {
          $node = $self->_parse_inline_double_quoted();
          $node = $self->_unescape($node);
          $node = $self->_parse_implicit($node) if $implicit;
      }
      elsif ($self->inline =~ /^'/) {
          $node = $self->_parse_inline_single_quoted();
          $node = $self->_parse_implicit($node) if $implicit;
      }
      else {
          if ($top) {
              $node = $self->inline;
              $self->inline('');
          }
          else {
              $node = $self->_parse_inline_simple();
          }
          $node = $self->_parse_implicit($node) unless $explicit;
  
          if ($self->numify and defined $node and not ref $node and length $node
              and $node =~ m/\A-?(?:0|[1-9][0-9]*)?(?:\.[0-9]*)?(?:[eE][+-]?[0-9]+)?\z/) {
              $node += 0;
          }
      }
      if ($explicit) {
          $node = $self->_parse_explicit($node, $explicit);
      }
      if ($anchor) {
          if (ref($self->anchor2node->{$anchor}) eq 'YAML-anchor2node') {
              for my $ref (@{$self->anchor2node->{$anchor}}) {
                  ${$ref->[0]} = $node;
                  $self->warn('YAML_LOAD_WARN_UNRESOLVED_ALIAS',
                      $anchor, $ref->[1]);
              }
          }
          $self->anchor2node->{$anchor} = $node;
      }
      return $node;
  }
  
  # Parse the inline YAML mapping into a Perl hash
  sub _parse_inline_mapping {
      my $self = shift;
      my ($anchor) = @_;
      my $node = {};
      $self->anchor2node->{$anchor} = $node;
  
      $self->die('YAML_PARSE_ERR_INLINE_MAP')
        unless $self->{inline} =~ s/^\{\s*//;
      while (not $self->{inline} =~ s/^\s*\}\s*//) {
          my $key = $self->_parse_inline();
          $self->die('YAML_PARSE_ERR_INLINE_MAP')
            unless $self->{inline} =~ s/^\: \s*//;
          my $value = $self->_parse_inline();
          if (exists $node->{$key}) {
              $self->warn('YAML_LOAD_WARN_DUPLICATE_KEY', $key);
          }
          else {
              $node->{$key} = $value;
          }
          next if $self->inline =~ /^\s*\}/;
          $self->die('YAML_PARSE_ERR_INLINE_MAP')
            unless $self->{inline} =~ s/^\,\s*//;
      }
      return $node;
  }
  
  # Parse the inline YAML sequence into a Perl array
  sub _parse_inline_seq {
      my $self = shift;
      my ($anchor) = @_;
      my $node = [];
      $self->anchor2node->{$anchor} = $node;
  
      $self->die('YAML_PARSE_ERR_INLINE_SEQUENCE')
        unless $self->{inline} =~ s/^\[\s*//;
      while (not $self->{inline} =~ s/^\s*\]\s*//) {
          my $value = $self->_parse_inline();
          push @$node, $value;
          next if $self->inline =~ /^\s*\]/;
          $self->die('YAML_PARSE_ERR_INLINE_SEQUENCE')
            unless $self->{inline} =~ s/^\,\s*//;
      }
      return $node;
  }
  
  # Parse the inline double quoted string.
  sub _parse_inline_double_quoted {
      my $self = shift;
      my $node;
      # https://rt.cpan.org/Public/Bug/Display.html?id=90593
      if ($self->inline =~ /^"((?:(?:\\"|[^"]){0,32766}){0,32766})"\s*(.*)$/) {
          $node = $1;
          $self->inline($2);
          $node =~ s/\\"/"/g;
      }
      else {
          $self->die('YAML_PARSE_ERR_BAD_DOUBLE');
      }
      return $node;
  }
  
  
  # Parse the inline single quoted string.
  sub _parse_inline_single_quoted {
      my $self = shift;
      my $node;
      if ($self->inline =~ /^'((?:(?:''|[^']){0,32766}){0,32766})'\s*(.*)$/) {
          $node = $1;
          $self->inline($2);
          $node =~ s/''/'/g;
      }
      else {
          $self->die('YAML_PARSE_ERR_BAD_SINGLE');
      }
      return $node;
  }
  
  # Parse the inline unquoted string and do implicit typing.
  sub _parse_inline_simple {
      my $self = shift;
      my $value;
      if ($self->inline =~ /^(|[^!@#%^&*].*?)(?=[\[\]\{\},]|, |: |- |:\s*$|$)/) {
          $value = $1;
          substr($self->{inline}, 0, length($1)) = '';
      }
      else {
          $self->die('YAML_PARSE_ERR_BAD_INLINE_IMPLICIT', $value);
      }
      return $value;
  }
  
  sub _parse_implicit {
      my $self = shift;
      my ($value) = @_;
      $value =~ s/\s*$//;
      return $value if $value eq '';
      return undef if $value =~ /^~$/;
      return $value
        unless $value =~ /^[\@\`]/ or
               $value =~ /^[\-\?]\s/;
      $self->die('YAML_PARSE_ERR_BAD_IMPLICIT', $value);
  }
  
  # Unfold a YAML multiline scalar into a single string.
  sub _parse_unfold {
      my $self = shift;
      my ($chomp) = @_;
      my $node = '';
      my $space = 0;
      while (not $self->done and $self->indent == $self->offset->[$self->level]) {
          $node .= $self->content. "\n";
          $self->_parse_next_line(LEAF);
      }
      $node =~ s/^(\S.*)\n(?=\S)/$1 /gm;
      $node =~ s/^(\S.*)\n(\n+\S)/$1$2/gm;
      $node =~ s/\n*\Z// unless $chomp eq '+';
      $node .= "\n" unless $chomp;
      return $node;
  }
  
  # Parse a YAML block style scalar. This is like a Perl here-document.
  sub _parse_block {
      my $self = shift;
      my ($chomp) = @_;
      my $node = '';
      while (not $self->done and $self->indent == $self->offset->[$self->level]) {
          $node .= $self->content . "\n";
          $self->_parse_next_line(LEAF);
      }
      return $node if '+' eq $chomp;
      $node =~ s/\n*\Z/\n/;
      $node =~ s/\n\Z// if $chomp eq '-';
      return $node;
  }
  
  # Handle Perl style '#' comments. Comments must be at the same indentation
  # level as the collection line following them.
  sub _parse_throwaway_comments {
      my $self = shift;
      while (@{$self->lines} and
             $self->lines->[0] =~ m{^\s*(\#|$)}
            ) {
          shift @{$self->lines};
          $self->{line}++;
      }
      $self->eos($self->{done} = not @{$self->lines});
  }
  
  # This is the routine that controls what line is being parsed. It gets called
  # once for each line in the YAML stream.
  #
  # This routine must:
  # 1) Skip past the current line
  # 2) Determine the indentation offset for a new level
  # 3) Find the next _content_ line
  #   A) Skip over any throwaways (Comments/blanks)
  #   B) Set $self->indent, $self->content, $self->line
  # 4) Expand tabs appropriately
  sub _parse_next_line {
      my $self = shift;
      my ($type) = @_;
      my $level = $self->level;
      my $offset = $self->offset->[$level];
      $self->die('YAML_EMIT_ERR_BAD_LEVEL') unless defined $offset;
      shift @{$self->lines};
      $self->eos($self->{done} = not @{$self->lines});
      if ($self->eos) {
          $self->offset->[$level + 1] = $offset + 1;
          return;
      }
      $self->{line}++;
  
      # Determine the offset for a new leaf node
      if ($self->preface =~
          qr/(?:^|\s)(?:$FOLD_CHAR|$LIT_CHAR_RX)(?:-|\+)?(\d*)\s*$/
         ) {
          $self->die('YAML_PARSE_ERR_ZERO_INDENT')
            if length($1) and $1 == 0;
          $type = LEAF;
          if (length($1)) {
              $self->offset->[$level + 1] = $offset + $1;
          }
          else {
              # First get rid of any comments.
              while (@{$self->lines} && ($self->lines->[0] =~ /^\s*#/)) {
                  $self->lines->[0] =~ /^( *)/;
                  last unless length($1) <= $offset;
                  shift @{$self->lines};
                  $self->{line}++;
              }
              $self->eos($self->{done} = not @{$self->lines});
              return if $self->eos;
              if ($self->lines->[0] =~ /^( *)\S/ and length($1) > $offset) {
                  $self->offset->[$level+1] = length($1);
              }
              else {
                  $self->offset->[$level+1] = $offset + 1;
              }
          }
          $offset = $self->offset->[++$level];
      }
      # Determine the offset for a new collection level
      elsif ($type == COLLECTION and
             $self->preface =~ /^(\s*(\!\S*|\&\S+))*\s*$/) {
          $self->_parse_throwaway_comments();
          if ($self->eos) {
              $self->offset->[$level+1] = $offset + 1;
              return;
          }
          else {
              $self->lines->[0] =~ /^( *)\S/ or
                  $self->die('YAML_PARSE_ERR_NONSPACE_INDENTATION');
              if (length($1) > $offset) {
                  $self->offset->[$level+1] = length($1);
              }
              else {
                  $self->offset->[$level+1] = $offset + 1;
              }
          }
          $offset = $self->offset->[++$level];
      }
  
      if ($type == LEAF) {
          while (@{$self->lines} and
                 $self->lines->[0] =~ m{^( *)(\#)} and
                 length($1) < $offset
                ) {
              shift @{$self->lines};
              $self->{line}++;
          }
          $self->eos($self->{done} = not @{$self->lines});
      }
      else {
          $self->_parse_throwaway_comments();
      }
      return if $self->eos;
  
      if ($self->lines->[0] =~ /^---(\s|$)/) {
          $self->done(1);
          return;
      }
      if ($type == LEAF and
          $self->lines->[0] =~ /^ {$offset}(.*)$/
         ) {
          $self->indent($offset);
          $self->content($1);
      }
      elsif ($self->lines->[0] =~ /^\s*$/) {
          $self->indent($offset);
          $self->content('');
      }
      else {
          $self->lines->[0] =~ /^( *)(\S.*)$/;
          while ($self->offset->[$level] > length($1)) {
              $level--;
          }
          $self->die('YAML_PARSE_ERR_INCONSISTENT_INDENTATION')
            if $self->offset->[$level] != length($1);
          $self->indent(length($1));
          $self->content($2);
      }
      $self->die('YAML_PARSE_ERR_INDENTATION')
        if $self->indent - $offset > 1;
  }
  
  #==============================================================================
  # Utility subroutines.
  #==============================================================================
  
  # Printable characters for escapes
  my %unescapes = (
     0 => "\x00",
     a => "\x07",
     t => "\x09",
     n => "\x0a",
     'v' => "\x0b", # Potential v-string error on 5.6.2 if not quoted
     f => "\x0c",
     r => "\x0d",
     e => "\x1b",
     '\\' => '\\',
    );
  
  # Transform all the backslash style escape characters to their literal meaning
  sub _unescape {
      my $self = shift;
      my ($node) = @_;
      $node =~ s/\\([never\\fart0]|x([0-9a-fA-F]{2}))/
                (length($1)>1)?pack("H2",$2):$unescapes{$1}/gex;
      return $node;
  }
  
  1;
YAML_OLD_LOADER

    $main::fatpacked{"YAML/Old/Loader/Base.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'YAML_OLD_LOADER_BASE';
  package YAML::Old::Loader::Base;
  
  use YAML::Old::Mo;
  
  has load_code     => default => sub {0};
  has preserve      => default => sub {0};
  has stream        => default => sub {''};
  has document      => default => sub {0};
  has line          => default => sub {0};
  has documents     => default => sub {[]};
  has lines         => default => sub {[]};
  has eos           => default => sub {0};
  has done          => default => sub {0};
  has anchor2node   => default => sub {{}};
  has level         => default => sub {0};
  has offset        => default => sub {[]};
  has preface       => default => sub {''};
  has content       => default => sub {''};
  has indent        => default => sub {0};
  has major_version => default => sub {0};
  has minor_version => default => sub {0};
  has inline        => default => sub {''};
  has numify        => default => sub {0};
  
  sub set_global_options {
      my $self = shift;
      $self->load_code($YAML::LoadCode || $YAML::UseCode)
        if defined $YAML::LoadCode or defined $YAML::UseCode;
      $self->preserve($YAML::Preserve) if defined $YAML::Preserve;
      $self->numify($YAML::Numify) if defined $YAML::Numify;
  }
  
  sub load {
      die 'load() not implemented in this class.';
  }
  
  1;
YAML_OLD_LOADER_BASE

    $main::fatpacked{"YAML/Old/Marshall.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'YAML_OLD_MARSHALL';
  use strict; use warnings;
  package YAML::Old::Marshall;
  
  use YAML::Old::Node ();
  
  sub import {
      my $class = shift;
      no strict 'refs';
      my $package = caller;
      unless (grep { $_ eq $class} @{$package . '::ISA'}) {
          push @{$package . '::ISA'}, $class;
      }
  
      my $tag = shift;
      if ( $tag ) {
          no warnings 'once';
          $YAML::TagClass->{$tag} = $package;
          ${$package . "::YamlTag"} = $tag;
      }
  }
  
  sub yaml_dump {
      my $self = shift;
      no strict 'refs';
      my $tag = ${ref($self) . "::YamlTag"} || 'perl/' . ref($self);
      $self->yaml_node($self, $tag);
  }
  
  sub yaml_load {
      my ($class, $node) = @_;
      if (my $ynode = $class->yaml_ynode($node)) {
          $node = $ynode->{NODE};
      }
      bless $node, $class;
  }
  
  sub yaml_node {
      shift;
      YAML::Old::Node->new(@_);
  }
  
  sub yaml_ynode {
      shift;
      YAML::Old::Node::ynode(@_);
  }
  
  1;
YAML_OLD_MARSHALL

    $main::fatpacked{"YAML/Old/Mo.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'YAML_OLD_MO';
  package YAML::Old::Mo;
  # use Mo qw[builder default import];
  #   The following line of code was produced from the previous line by
  #   Mo::Inline version 0.40
  no warnings;my$M=__PACKAGE__.'::';*{$M.Object::new}=sub{my$c=shift;my$s=bless{@_},$c;my%n=%{$c.'::'.':E'};map{$s->{$_}=$n{$_}->()if!exists$s->{$_}}keys%n;$s};*{$M.import}=sub{import warnings;$^H|=1538;my($P,%e,%o)=caller.'::';shift;eval"no Mo::$_",&{$M.$_.::e}($P,\%e,\%o,\@_)for@_;return if$e{M};%e=(extends,sub{eval"no $_[0]()";@{$P.ISA}=$_[0]},has,sub{my$n=shift;my$m=sub{$#_?$_[0]{$n}=$_[1]:$_[0]{$n}};@_=(default,@_)if!($#_%2);$m=$o{$_}->($m,$n,@_)for sort keys%o;*{$P.$n}=$m},%e,);*{$P.$_}=$e{$_}for keys%e;@{$P.ISA}=$M.Object};*{$M.'builder::e'}=sub{my($P,$e,$o)=@_;$o->{builder}=sub{my($m,$n,%a)=@_;my$b=$a{builder}or return$m;my$i=exists$a{lazy}?$a{lazy}:!${$P.':N'};$i or ${$P.':E'}{$n}=\&{$P.$b}and return$m;sub{$#_?$m->(@_):!exists$_[0]{$n}?$_[0]{$n}=$_[0]->$b:$m->(@_)}}};*{$M.'default::e'}=sub{my($P,$e,$o)=@_;$o->{default}=sub{my($m,$n,%a)=@_;exists$a{default}or return$m;my($d,$r)=$a{default};my$g='HASH'eq($r=ref$d)?sub{+{%$d}}:'ARRAY'eq$r?sub{[@$d]}:'CODE'eq$r?$d:sub{$d};my$i=exists$a{lazy}?$a{lazy}:!${$P.':N'};$i or ${$P.':E'}{$n}=$g and return$m;sub{$#_?$m->(@_):!exists$_[0]{$n}?$_[0]{$n}=$g->(@_):$m->(@_)}}};my$i=\&import;*{$M.import}=sub{(@_==2 and not$_[1])?pop@_:@_==1?push@_,grep!/import/,@f:();goto&$i};@f=qw[builder default import];use strict;use warnings;
  
  our $DumperModule = 'Data::Dumper';
  
  my ($_new_error, $_info, $_scalar_info);
  
  no strict 'refs';
  *{$M.'Object::die'} = sub {
      my $self = shift;
      my $error = $self->$_new_error(@_);
      $error->type('Error');
      Carp::croak($error->format_message);
  };
  
  *{$M.'Object::warn'} = sub {
      my $self = shift;
      return unless $^W;
      my $error = $self->$_new_error(@_);
      $error->type('Warning');
      Carp::cluck($error->format_message);
  };
  
  # This code needs to be refactored to be simpler and more precise, and no,
  # Scalar::Util doesn't DWIM.
  #
  # Can't handle:
  # * blessed regexp
  *{$M.'Object::node_info'} = sub {
      my $self = shift;
      my $stringify = $_[1] || 0;
      my ($class, $type, $id) =
          ref($_[0])
          ? $stringify
            ? &$_info("$_[0]")
            : do {
                require overload;
                my @info = &$_info(overload::StrVal($_[0]));
                if (ref($_[0]) eq 'Regexp') {
                    @info[0, 1] = (undef, 'REGEXP');
                }
                @info;
            }
          : &$_scalar_info($_[0]);
      ($class, $type, $id) = &$_scalar_info("$_[0]")
          unless $id;
      return wantarray ? ($class, $type, $id) : $id;
  };
  
  #-------------------------------------------------------------------------------
  $_info = sub {
      return (($_[0]) =~ qr{^(?:(.*)\=)?([^=]*)\(([^\(]*)\)$}o);
  };
  
  $_scalar_info = sub {
      my $id = 'undef';
      if (defined $_[0]) {
          \$_[0] =~ /\((\w+)\)$/o or CORE::die();
          $id = "$1-S";
      }
      return (undef, undef, $id);
  };
  
  $_new_error = sub {
      require Carp;
      my $self = shift;
      require YAML::Old::Error;
  
      my $code = shift || 'unknown error';
      my $error = YAML::Old::Error->new(code => $code);
      $error->line($self->line) if $self->can('line');
      $error->document($self->document) if $self->can('document');
      $error->arguments([@_]);
      return $error;
  };
  
  1;
YAML_OLD_MO

    $main::fatpacked{"YAML/Old/Node.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'YAML_OLD_NODE';
  use strict; use warnings;
  package YAML::Old::Node;
  
  use YAML::Old::Tag;
  require YAML::Old::Mo;
  
  use Exporter;
  our @ISA     = qw(Exporter YAML::Old::Mo::Object);
  our @EXPORT  = qw(ynode);
  
  sub ynode {
      my $self;
      if (ref($_[0]) eq 'HASH') {
          $self = tied(%{$_[0]});
      }
      elsif (ref($_[0]) eq 'ARRAY') {
          $self = tied(@{$_[0]});
      }
      elsif (ref(\$_[0]) eq 'GLOB') {
          $self = tied(*{$_[0]});
      }
      else {
          $self = tied($_[0]);
      }
      return (ref($self) =~ /^yaml_/) ? $self : undef;
  }
  
  sub new {
      my ($class, $node, $tag) = @_;
      my $self;
      $self->{NODE} = $node;
      my (undef, $type) = YAML::Old::Mo::Object->node_info($node);
      $self->{KIND} = (not defined $type) ? 'scalar' :
                      ($type eq 'ARRAY') ? 'sequence' :
                      ($type eq 'HASH') ? 'mapping' :
                      $class->die("Can't create YAML::Old::Node from '$type'");
      tag($self, ($tag || ''));
      if ($self->{KIND} eq 'scalar') {
          yaml_scalar->new($self, $_[1]);
          return \ $_[1];
      }
      my $package = "yaml_" . $self->{KIND};
      $package->new($self)
  }
  
  sub node { $_->{NODE} }
  sub kind { $_->{KIND} }
  sub tag {
      my ($self, $value) = @_;
      if (defined $value) {
                 $self->{TAG} = YAML::Old::Tag->new($value);
          return $self;
      }
      else {
         return $self->{TAG};
      }
  }
  sub keys {
      my ($self, $value) = @_;
      if (defined $value) {
                 $self->{KEYS} = $value;
          return $self;
      }
      else {
         return $self->{KEYS};
      }
  }
  
  #==============================================================================
  package yaml_scalar;
  
  @yaml_scalar::ISA = qw(YAML::Old::Node);
  
  sub new {
      my ($class, $self) = @_;
      tie $_[2], $class, $self;
  }
  
  sub TIESCALAR {
      my ($class, $self) = @_;
      bless $self, $class;
      $self
  }
  
  sub FETCH {
      my ($self) = @_;
      $self->{NODE}
  }
  
  sub STORE {
      my ($self, $value) = @_;
      $self->{NODE} = $value
  }
  
  #==============================================================================
  package yaml_sequence;
  
  @yaml_sequence::ISA = qw(YAML::Old::Node);
  
  sub new {
      my ($class, $self) = @_;
      my $new;
      tie @$new, $class, $self;
      $new
  }
  
  sub TIEARRAY {
      my ($class, $self) = @_;
      bless $self, $class
  }
  
  sub FETCHSIZE {
      my ($self) = @_;
      scalar @{$self->{NODE}};
  }
  
  sub FETCH {
      my ($self, $index) = @_;
      $self->{NODE}[$index]
  }
  
  sub STORE {
      my ($self, $index, $value) = @_;
      $self->{NODE}[$index] = $value
  }
  
  sub undone {
      die "Not implemented yet"; # XXX
  }
  
  *STORESIZE = *POP = *PUSH = *SHIFT = *UNSHIFT = *SPLICE = *DELETE = *EXISTS =
  *STORESIZE = *POP = *PUSH = *SHIFT = *UNSHIFT = *SPLICE = *DELETE = *EXISTS =
  *undone; # XXX Must implement before release
  
  #==============================================================================
  package yaml_mapping;
  
  @yaml_mapping::ISA = qw(YAML::Old::Node);
  
  sub new {
      my ($class, $self) = @_;
      @{$self->{KEYS}} = sort keys %{$self->{NODE}};
      my $new;
      tie %$new, $class, $self;
      $new
  }
  
  sub TIEHASH {
      my ($class, $self) = @_;
      bless $self, $class
  }
  
  sub FETCH {
      my ($self, $key) = @_;
      if (exists $self->{NODE}{$key}) {
          return (grep {$_ eq $key} @{$self->{KEYS}})
                 ? $self->{NODE}{$key} : undef;
      }
      return $self->{HASH}{$key};
  }
  
  sub STORE {
      my ($self, $key, $value) = @_;
      if (exists $self->{NODE}{$key}) {
          $self->{NODE}{$key} = $value;
      }
      elsif (exists $self->{HASH}{$key}) {
          $self->{HASH}{$key} = $value;
      }
      else {
          if (not grep {$_ eq $key} @{$self->{KEYS}}) {
              push(@{$self->{KEYS}}, $key);
          }
          $self->{HASH}{$key} = $value;
      }
      $value
  }
  
  sub DELETE {
      my ($self, $key) = @_;
      my $return;
      if (exists $self->{NODE}{$key}) {
          $return = $self->{NODE}{$key};
      }
      elsif (exists $self->{HASH}{$key}) {
          $return = delete $self->{NODE}{$key};
      }
      for (my $i = 0; $i < @{$self->{KEYS}}; $i++) {
          if ($self->{KEYS}[$i] eq $key) {
              splice(@{$self->{KEYS}}, $i, 1);
          }
      }
      return $return;
  }
  
  sub CLEAR {
      my ($self) = @_;
      @{$self->{KEYS}} = ();
      %{$self->{HASH}} = ();
  }
  
  sub FIRSTKEY {
      my ($self) = @_;
      $self->{ITER} = 0;
      $self->{KEYS}[0]
  }
  
  sub NEXTKEY {
      my ($self) = @_;
      $self->{KEYS}[++$self->{ITER}]
  }
  
  sub EXISTS {
      my ($self, $key) = @_;
      exists $self->{NODE}{$key}
  }
  
  1;
YAML_OLD_NODE

    $main::fatpacked{"YAML/Old/Tag.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'YAML_OLD_TAG';
  use strict; use warnings;
  package YAML::Old::Tag;
  
  use overload '""' => sub { ${$_[0]} };
  
  sub new {
      my ($class, $self) = @_;
      bless \$self, $class
  }
  
  sub short {
      ${$_[0]}
  }
  
  sub canonical {
      ${$_[0]}
  }
  
  1;
YAML_OLD_TAG

    $main::fatpacked{"YAML/Old/Types.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'YAML_OLD_TYPES';
  package YAML::Old::Types;
  
  use YAML::Old::Mo;
  use YAML::Old::Node;
  
  # XXX These classes and their APIs could still use some refactoring,
  # but at least they work for now.
  #-------------------------------------------------------------------------------
  package YAML::Old::Type::blessed;
  
  use YAML::Old::Mo; # XXX
  
  sub yaml_dump {
      my $self = shift;
      my ($value) = @_;
      my ($class, $type) = YAML::Old::Mo::Object->node_info($value);
      no strict 'refs';
      my $kind = lc($type) . ':';
      my $tag = ${$class . '::ClassTag'} ||
                "!perl/$kind$class";
      if ($type eq 'REF') {
          YAML::Old::Node->new(
              {(&YAML::Old::VALUE, ${$_[0]})}, $tag
          );
      }
      elsif ($type eq 'SCALAR') {
          $_[1] = $$value;
          YAML::Old::Node->new($_[1], $tag);
      }
      elsif ($type eq 'GLOB') {
          # blessed glob support is minimal, and will not round-trip
          # initial aim: to not cause an error
          return YAML::Old::Type::glob->yaml_dump($value, $tag);
      } else {
          YAML::Old::Node->new($value, $tag);
      }
  }
  
  #-------------------------------------------------------------------------------
  package YAML::Old::Type::undef;
  
  sub yaml_dump {
      my $self = shift;
  }
  
  sub yaml_load {
      my $self = shift;
  }
  
  #-------------------------------------------------------------------------------
  package YAML::Old::Type::glob;
  
  sub yaml_dump {
      my $self = shift;
      # $_[0] remains as the glob
      my $tag = pop @_ if 2==@_;
  
      $tag = '!perl/glob:' unless defined $tag;
      my $ynode = YAML::Old::Node->new({}, $tag);
      for my $type (qw(PACKAGE NAME SCALAR ARRAY HASH CODE IO)) {
          my $value = *{$_[0]}{$type};
          $value = $$value if $type eq 'SCALAR';
          if (defined $value) {
              if ($type eq 'IO') {
                  my @stats = qw(device inode mode links uid gid rdev size
                                 atime mtime ctime blksize blocks);
                  undef $value;
                  $value->{stat} = YAML::Old::Node->new({});
                  if ($value->{fileno} = fileno(*{$_[0]})) {
                      local $^W;
                      map {$value->{stat}{shift @stats} = $_} stat(*{$_[0]});
                      $value->{tell} = tell(*{$_[0]});
                  }
              }
              $ynode->{$type} = $value;
          }
      }
      return $ynode;
  }
  
  sub yaml_load {
      my $self = shift;
      my ($node, $class, $loader) = @_;
      my ($name, $package);
      if (defined $node->{NAME}) {
          $name = $node->{NAME};
          delete $node->{NAME};
      }
      else {
          $loader->warn('YAML_LOAD_WARN_GLOB_NAME');
          return undef;
      }
      if (defined $node->{PACKAGE}) {
          $package = $node->{PACKAGE};
          delete $node->{PACKAGE};
      }
      else {
          $package = 'main';
      }
      no strict 'refs';
      if (exists $node->{SCALAR}) {
          *{"${package}::$name"} = \$node->{SCALAR};
          delete $node->{SCALAR};
      }
      for my $elem (qw(ARRAY HASH CODE IO)) {
          if (exists $node->{$elem}) {
              if ($elem eq 'IO') {
                  $loader->warn('YAML_LOAD_WARN_GLOB_IO');
                  delete $node->{IO};
                  next;
              }
              *{"${package}::$name"} = $node->{$elem};
              delete $node->{$elem};
          }
      }
      for my $elem (sort keys %$node) {
          $loader->warn('YAML_LOAD_WARN_BAD_GLOB_ELEM', $elem);
      }
      return *{"${package}::$name"};
  }
  
  #-------------------------------------------------------------------------------
  package YAML::Old::Type::code;
  
  my $dummy_warned = 0;
  my $default = '{ "DUMMY" }';
  
  sub yaml_dump {
      my $self = shift;
      my $code;
      my ($dumpflag, $value) = @_;
      my ($class, $type) = YAML::Old::Mo::Object->node_info($value);
      my $tag = "!perl/code";
      $tag .= ":$class" if defined $class;
      if (not $dumpflag) {
          $code = $default;
      }
      else {
          bless $value, "CODE" if $class;
          eval { require B::Deparse };
          return if $@;
          my $deparse = B::Deparse->new();
          eval {
              local $^W = 0;
              $code = $deparse->coderef2text($value);
          };
          if ($@) {
              warn YAML::Old::YAML_DUMP_WARN_DEPARSE_FAILED() if $^W;
              $code = $default;
          }
          bless $value, $class if $class;
          chomp $code;
          $code .= "\n";
      }
      $_[2] = $code;
      YAML::Old::Node->new($_[2], $tag);
  }
  
  sub yaml_load {
      my $self = shift;
      my ($node, $class, $loader) = @_;
      if ($loader->load_code) {
          my $code = eval "package main; sub $node";
          if ($@) {
              $loader->warn('YAML_LOAD_WARN_PARSE_CODE', $@);
              return sub {};
          }
          else {
              CORE::bless $code, $class if $class;
              return $code;
          }
      }
      else {
          return CORE::bless sub {}, $class if $class;
          return sub {};
      }
  }
  
  #-------------------------------------------------------------------------------
  package YAML::Old::Type::ref;
  
  sub yaml_dump {
      my $self = shift;
      YAML::Old::Node->new({(&YAML::Old::VALUE, ${$_[0]})}, '!perl/ref')
  }
  
  sub yaml_load {
      my $self = shift;
      my ($node, $class, $loader) = @_;
      $loader->die('YAML_LOAD_ERR_NO_DEFAULT_VALUE', 'ptr')
        unless exists $node->{&YAML::Old::VALUE};
      return \$node->{&YAML::Old::VALUE};
  }
  
  #-------------------------------------------------------------------------------
  package YAML::Old::Type::regexp;
  
  # XXX Be sure to handle blessed regexps (if possible)
  sub yaml_dump {
      die "YAML::Old::Type::regexp::yaml_dump not currently implemented";
  }
  
  use constant _QR_TYPES => {
      '' => sub { qr{$_[0]} },
      x => sub { qr{$_[0]}x },
      i => sub { qr{$_[0]}i },
      s => sub { qr{$_[0]}s },
      m => sub { qr{$_[0]}m },
      ix => sub { qr{$_[0]}ix },
      sx => sub { qr{$_[0]}sx },
      mx => sub { qr{$_[0]}mx },
      si => sub { qr{$_[0]}si },
      mi => sub { qr{$_[0]}mi },
      ms => sub { qr{$_[0]}sm },
      six => sub { qr{$_[0]}six },
      mix => sub { qr{$_[0]}mix },
      msx => sub { qr{$_[0]}msx },
      msi => sub { qr{$_[0]}msi },
      msix => sub { qr{$_[0]}msix },
  };
  
  sub yaml_load {
      my $self = shift;
      my ($node, $class) = @_;
      return qr{$node} unless $node =~ /^\(\?([\^\-xism]*):(.*)\)\z/s;
      my ($flags, $re) = ($1, $2);
      $flags =~ s/-.*//;
      $flags =~ s/^\^//;
      my $sub = _QR_TYPES->{$flags} || sub { qr{$_[0]} };
      my $qr = &$sub($re);
      bless $qr, $class if length $class;
      return $qr;
  }
  
  1;
YAML_OLD_TYPES

    $main::fatpacked{"YAML/Tag.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'YAML_TAG';
  use strict; use warnings;
  package YAML::Tag;
  
  use overload '""' => sub { ${$_[0]} };
  
  sub new {
      my ($class, $self) = @_;
      bless \$self, $class
  }
  
  sub short {
      ${$_[0]}
  }
  
  sub canonical {
      ${$_[0]}
  }
  
  1;
YAML_TAG

    $main::fatpacked{"YAML/Types.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'YAML_TYPES';
  package YAML::Types;
  
  use YAML::Mo;
  use YAML::Node;
  
  # XXX These classes and their APIs could still use some refactoring,
  # but at least they work for now.
  #-------------------------------------------------------------------------------
  package YAML::Type::blessed;
  
  use YAML::Mo; # XXX
  
  sub yaml_dump {
      my $self = shift;
      my ($value) = @_;
      my ($class, $type) = YAML::Mo::Object->node_info($value);
      no strict 'refs';
      my $kind = lc($type) . ':';
      my $tag = ${$class . '::ClassTag'} ||
                "!perl/$kind$class";
      if ($type eq 'REF') {
          YAML::Node->new(
              {(&YAML::VALUE, ${$_[0]})}, $tag
          );
      }
      elsif ($type eq 'SCALAR') {
          $_[1] = $$value;
          YAML::Node->new($_[1], $tag);
      }
      elsif ($type eq 'GLOB') {
          # blessed glob support is minimal, and will not round-trip
          # initial aim: to not cause an error
          return YAML::Type::glob->yaml_dump($value, $tag);
      } else {
          YAML::Node->new($value, $tag);
      }
  }
  
  #-------------------------------------------------------------------------------
  package YAML::Type::undef;
  
  sub yaml_dump {
      my $self = shift;
  }
  
  sub yaml_load {
      my $self = shift;
  }
  
  #-------------------------------------------------------------------------------
  package YAML::Type::glob;
  
  sub yaml_dump {
      my $self = shift;
      # $_[0] remains as the glob
      my $tag = pop @_ if 2==@_;
  
      $tag = '!perl/glob:' unless defined $tag;
      my $ynode = YAML::Node->new({}, $tag);
      for my $type (qw(PACKAGE NAME SCALAR ARRAY HASH CODE IO)) {
          my $value = *{$_[0]}{$type};
          $value = $$value if $type eq 'SCALAR';
          if (defined $value) {
              if ($type eq 'IO') {
                  my @stats = qw(device inode mode links uid gid rdev size
                                 atime mtime ctime blksize blocks);
                  undef $value;
                  $value->{stat} = YAML::Node->new({});
                  if ($value->{fileno} = fileno(*{$_[0]})) {
                      local $^W;
                      map {$value->{stat}{shift @stats} = $_} stat(*{$_[0]});
                      $value->{tell} = tell(*{$_[0]});
                  }
              }
              $ynode->{$type} = $value;
          }
      }
      return $ynode;
  }
  
  sub yaml_load {
      my $self = shift;
      my ($node, $class, $loader) = @_;
      my ($name, $package);
      if (defined $node->{NAME}) {
          $name = $node->{NAME};
          delete $node->{NAME};
      }
      else {
          $loader->warn('YAML_LOAD_WARN_GLOB_NAME');
          return undef;
      }
      if (defined $node->{PACKAGE}) {
          $package = $node->{PACKAGE};
          delete $node->{PACKAGE};
      }
      else {
          $package = 'main';
      }
      no strict 'refs';
      if (exists $node->{SCALAR}) {
          if ($YAML::LoadBlessed and $loader->load_code) {
              *{"${package}::$name"} = \$node->{SCALAR};
          }
          delete $node->{SCALAR};
      }
      for my $elem (qw(ARRAY HASH CODE IO)) {
          if (exists $node->{$elem}) {
              if ($elem eq 'IO') {
                  $loader->warn('YAML_LOAD_WARN_GLOB_IO');
                  delete $node->{IO};
                  next;
              }
              if ($YAML::LoadBlessed and $loader->load_code) {
                  *{"${package}::$name"} = $node->{$elem};
              }
              delete $node->{$elem};
          }
      }
      for my $elem (sort keys %$node) {
          $loader->warn('YAML_LOAD_WARN_BAD_GLOB_ELEM', $elem);
      }
      return *{"${package}::$name"};
  }
  
  #-------------------------------------------------------------------------------
  package YAML::Type::code;
  
  my $dummy_warned = 0;
  my $default = '{ "DUMMY" }';
  
  sub yaml_dump {
      my $self = shift;
      my $code;
      my ($dumpflag, $value) = @_;
      my ($class, $type) = YAML::Mo::Object->node_info($value);
      my $tag = "!perl/code";
      $tag .= ":$class" if defined $class;
      if (not $dumpflag) {
          $code = $default;
      }
      else {
          bless $value, "CODE" if $class;
          eval { require B::Deparse };
          return if $@;
          my $deparse = B::Deparse->new();
          eval {
              local $^W = 0;
              $code = $deparse->coderef2text($value);
          };
          if ($@) {
              warn YAML::YAML_DUMP_WARN_DEPARSE_FAILED() if $^W;
              $code = $default;
          }
          bless $value, $class if $class;
          chomp $code;
          $code .= "\n";
      }
      $_[2] = $code;
      YAML::Node->new($_[2], $tag);
  }
  
  sub yaml_load {
      my $self = shift;
      my ($node, $class, $loader) = @_;
      if ($loader->load_code) {
          my $code = eval "package main; sub $node";
          if ($@) {
              $loader->warn('YAML_LOAD_WARN_PARSE_CODE', $@);
              return sub {};
          }
          else {
              CORE::bless $code, $class if ($class and $YAML::LoadBlessed);
              return $code;
          }
      }
      else {
          return CORE::bless sub {}, $class if ($class and $YAML::LoadBlessed);
          return sub {};
      }
  }
  
  #-------------------------------------------------------------------------------
  package YAML::Type::ref;
  
  sub yaml_dump {
      my $self = shift;
      YAML::Node->new({(&YAML::VALUE, ${$_[0]})}, '!perl/ref')
  }
  
  sub yaml_load {
      my $self = shift;
      my ($node, $class, $loader) = @_;
      $loader->die('YAML_LOAD_ERR_NO_DEFAULT_VALUE', 'ptr')
        unless exists $node->{&YAML::VALUE};
      return \$node->{&YAML::VALUE};
  }
  
  #-------------------------------------------------------------------------------
  package YAML::Type::regexp;
  
  # XXX Be sure to handle blessed regexps (if possible)
  sub yaml_dump {
      die "YAML::Type::regexp::yaml_dump not currently implemented";
  }
  
  use constant _QR_TYPES => {
      '' => sub { qr{$_[0]} },
      x => sub { qr{$_[0]}x },
      i => sub { qr{$_[0]}i },
      s => sub { qr{$_[0]}s },
      m => sub { qr{$_[0]}m },
      ix => sub { qr{$_[0]}ix },
      sx => sub { qr{$_[0]}sx },
      mx => sub { qr{$_[0]}mx },
      si => sub { qr{$_[0]}si },
      mi => sub { qr{$_[0]}mi },
      ms => sub { qr{$_[0]}sm },
      six => sub { qr{$_[0]}six },
      mix => sub { qr{$_[0]}mix },
      msx => sub { qr{$_[0]}msx },
      msi => sub { qr{$_[0]}msi },
      msix => sub { qr{$_[0]}msix },
  };
  
  sub yaml_load {
      my $self = shift;
      my ($node, $class) = @_;
      return qr{$node} unless $node =~ /^\(\?([\^\-uxism]*):(.*)\)\z/s;
      my ($flags, $re) = ($1, $2);
      $flags =~ s/-.*//;
      $flags =~ s/^\^//;
      $flags =~ tr/u//d;
      my $sub = _QR_TYPES->{$flags} || sub { qr{$_[0]} };
      my $qr = &$sub($re);
      bless $qr, $class if (length $class and $YAML::LoadBlessed);
      return $qr;
  }
  
  1;
YAML_TYPES

    $main::fatpacked{"boolean.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'BOOLEAN';
  use strict; use warnings;
  package boolean;
  our $VERSION = '0.46';
  
  my ($true, $false);
  
  use overload
      '""' => sub { ${$_[0]} },
      '!' => sub { ${$_[0]} ? $false : $true },
      fallback => 1;
  
  use base 'Exporter';
  @boolean::EXPORT = qw(true false boolean);
  @boolean::EXPORT_OK = qw(isTrue isFalse isBoolean);
  %boolean::EXPORT_TAGS = (
      all    => [@boolean::EXPORT, @boolean::EXPORT_OK],
      test   => [qw(isTrue isFalse isBoolean)],
  );
  
  sub import {
      my @options = grep $_ ne '-truth', @_;
      $_[0]->truth if @options != @_;
      @_ = @options;
      goto &Exporter::import;
  }
  
  my ($true_val, $false_val, $bool_vals);
  
  BEGIN {
      my $t = 1;
      my $f = 0;
      $true  = do {bless \$t, 'boolean'};
      $false = do {bless \$f, 'boolean'};
  
      $true_val  = overload::StrVal($true);
      $false_val = overload::StrVal($false);
      $bool_vals = {$true_val => 1, $false_val => 1};
  }
  
  # refaddrs change on thread spawn, so CLONE fixes them up
  sub CLONE {
      $true_val  = overload::StrVal($true);
      $false_val = overload::StrVal($false);
      $bool_vals = {$true_val => 1, $false_val => 1};
  }
  
  sub true()  { $true }
  sub false() { $false }
  sub boolean($) {
      die "Not enough arguments for boolean::boolean" if scalar(@_) == 0;
      die "Too many arguments for boolean::boolean" if scalar(@_) > 1;
      return not(defined $_[0]) ? false :
      "$_[0]" ? $true : $false;
  }
  sub isTrue($)  {
      not(defined $_[0]) ? false :
      (overload::StrVal($_[0]) eq $true_val)  ? true : false;
  }
  sub isFalse($) {
      not(defined $_[0]) ? false :
      (overload::StrVal($_[0]) eq $false_val) ? true : false;
  }
  sub isBoolean($) {
      not(defined $_[0]) ? false :
      (exists $bool_vals->{overload::StrVal($_[0])}) ? true : false;
  }
  
  sub truth {
      die "-truth not supported on Perl 5.22 or later" if $] >= 5.021005;
      # enable modifying true and false
      &Internals::SvREADONLY( \ !!0, 0);
      &Internals::SvREADONLY( \ !!1, 0);
      # turn perl internal booleans into blessed booleans:
      ${ \ !!0 } = $false;
      ${ \ !!1 } = $true;
      # make true and false read-only again
      &Internals::SvREADONLY( \ !!0, 1);
      &Internals::SvREADONLY( \ !!1, 1);
  }
  
  sub TO_JSON { ${$_[0]} ? \1 : \0 }
  
  1;
BOOLEAN

    $main::fatpacked{"experimental.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'EXPERIMENTAL';
  package experimental;
  $experimental::VERSION = '0.020';
  use strict;
  use warnings;
  use version ();
  
  BEGIN { eval { require feature } };
  use Carp qw/croak carp/;
  
  my %warnings = map { $_ => 1 } grep { /^experimental::/ } keys %warnings::Offsets;
  my %features = map { $_ => 1 } $] > 5.015006 ? keys %feature::feature : do {
  	my @features;
  	if ($] >= 5.010) {
  		push @features, qw/switch say state/;
  		push @features, 'unicode_strings' if $] > 5.011002;
  	}
  	@features;
  };
  
  my %min_version = (
  	array_base      => '5',
  	autoderef       => '5.14.0',
  	bitwise         => '5.22.0',
  	const_attr      => '5.22.0',
  	current_sub     => '5.16.0',
  	declared_refs   => '5.26.0',
  	evalbytes       => '5.16.0',
  	fc              => '5.16.0',
  	lexical_topic   => '5.10.0',
  	lexical_subs    => '5.18.0',
  	postderef       => '5.20.0',
  	postderef_qq    => '5.20.0',
  	refaliasing     => '5.22.0',
  	regex_sets      => '5.18.0',
  	say             => '5.10.0',
  	smartmatch      => '5.10.0',
  	signatures      => '5.20.0',
  	state           => '5.10.0',
  	switch          => '5.10.0',
  	unicode_eval    => '5.16.0',
  	unicode_strings => '5.12.0',
  );
  my %max_version = (
  	autoderef       => '5.23.1',
  	lexical_topic   => '5.23.4',
  );
  
  $_ = version->new($_) for values %min_version;
  $_ = version->new($_) for values %max_version;
  
  my %additional = (
  	postderef     => ['postderef_qq'],
  	switch        => ['smartmatch'],
  	declared_refs => ['refaliasing'],
  );
  
  sub _enable {
  	my $pragma = shift;
  	if ($warnings{"experimental::$pragma"}) {
  		warnings->unimport("experimental::$pragma");
  		feature->import($pragma) if exists $features{$pragma};
  		_enable(@{ $additional{$pragma} }) if $additional{$pragma};
  	}
  	elsif ($features{$pragma}) {
  		feature->import($pragma);
  		_enable(@{ $additional{$pragma} }) if $additional{$pragma};
  	}
  	elsif (not exists $min_version{$pragma}) {
  		croak "Can't enable unknown feature $pragma";
  	}
  	elsif ($] < $min_version{$pragma}) {
  		my $stable = $min_version{$pragma};
  		if ($stable->{version}[1] % 2) {
  			$stable = version->new(
  				"5.".($stable->{version}[1]+1).'.0'
  			);
  		}
  		croak "Need perl $stable or later for feature $pragma";
  	}
  	elsif ($] >= ($max_version{$pragma} || 7)) {
  		croak "Experimental feature $pragma has been removed from perl in version $max_version{$pragma}";
  	}
  }
  
  sub import {
  	my ($self, @pragmas) = @_;
  
  	for my $pragma (@pragmas) {
  		_enable($pragma);
  	}
  	return;
  }
  
  sub _disable {
  	my $pragma = shift;
  	if ($warnings{"experimental::$pragma"}) {
  		warnings->import("experimental::$pragma");
  		feature->unimport($pragma) if exists $features{$pragma};
  		_disable(@{ $additional{$pragma} }) if $additional{$pragma};
  	}
  	elsif ($features{$pragma}) {
  		feature->unimport($pragma);
  		_disable(@{ $additional{$pragma} }) if $additional{$pragma};
  	}
  	elsif (not exists $min_version{$pragma}) {
  		carp "Can't disable unknown feature $pragma, ignoring";
  	}
  }
  
  sub unimport {
  	my ($self, @pragmas) = @_;
  
  	for my $pragma (@pragmas) {
  		_disable($pragma);
  	}
  	return;
  }
  
  1;
  
  #ABSTRACT: Experimental features made easy
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  experimental - Experimental features made easy
  
  =head1 VERSION
  
  version 0.020
  
  =head1 SYNOPSIS
  
   use experimental 'lexical_subs', 'smartmatch';
   my sub foo { $_[0] ~~ 1 }
  
  =head1 DESCRIPTION
  
  This pragma provides an easy and convenient way to enable or disable
  experimental features.
  
  Every version of perl has some number of features present but considered
  "experimental."  For much of the life of Perl 5, this was only a designation
  found in the documentation.  Starting in Perl v5.10.0, and more aggressively in
  v5.18.0, experimental features were placed behind pragmata used to enable the
  feature and disable associated warnings.
  
  The C<experimental> pragma exists to combine the required incantations into a
  single interface stable across releases of perl.  For every experimental
  feature, this should enable the feature and silence warnings for the enclosing
  lexical scope:
  
    use experimental 'feature-name';
  
  To disable the feature and, if applicable, re-enable any warnings, use:
  
    no experimental 'feature-name';
  
  The supported features, documented further below, are:
  
  =over 4
  
  =item * C<array_base> - allow the use of C<$[> to change the starting index of C<@array>.
  
  This is supported on all versions of perl.
  
  =item * C<autoderef> - allow push, each, keys, and other built-ins on references.
  
  This was added in perl 5.14.0 and removed in perl 5.23.1.
  
  =item * C<bitwise> - allow the new stringwise bit operators
  
  This was added in perl 5.22.0.
  
  =item * C<const_attr> - allow the :const attribute on subs
  
  This was added in perl 5.22.0.
  
  =item * C<lexical_topic> - allow the use of lexical C<$_> via C<my $_>.
  
  This was added in perl 5.10.0 and removed in perl 5.23.4.
  
  =item * C<lexical_subs> - allow the use of lexical subroutines.
  
  This was added in 5.18.0.
  
  =item * C<postderef> - allow the use of postfix dereferencing expressions,
  including in interpolating strings
  
  This was added in perl 5.20.0.
  
  =item * C<re_strict> - enables strict mode in regular expressions
  
  This was added in perl 5.22.0.
  
  =item * C<refaliasing> - allow aliasing via C<\$x = \$y>
  
  This was added in perl 5.22.0.
  
  =item * C<regex_sets> - allow extended bracketed character classes in regexps
  
  This was added in perl 5.18.0.
  
  =item * C<signatures> - allow subroutine signatures (for named arguments)
  
  This was added in perl 5.20.0.
  
  =item * C<smartmatch> - allow the use of C<~~>
  
  This was added in perl 5.10.0, but it should be noted there are significant
  incompatibilities between 5.10.0 and 5.10.1.
  
  =item * C<switch> - allow the use of C<~~>, given, and when
  
  This was added in perl 5.10.0.
  
  =item * C<win32_perlio> - allows the use of the :win32 IO layer.
  
  This was added on perl 5.22.0.
  
  =back
  
  =head2 Ordering matters
  
  Using this pragma to 'enable an experimental feature' is another way of saying
  that this pragma will disable the warnings which would result from using that
  feature.  Therefore, the order in which pragmas are applied is important.  In
  particular, you probably want to enable experimental features I<after> you
  enable warnings:
  
    use warnings;
    use experimental 'smartmatch';
  
  You also need to take care with modules that enable warnings for you.  A common
  example being Moose.  In this example, warnings for the 'smartmatch' feature are
  first turned on by the warnings pragma, off by the experimental pragma and back
  on again by the Moose module (fix is to switch the last two lines):
  
    use warnings;
    use experimental 'smartmatch';
    use Moose;
  
  =head2 Disclaimer
  
  Because of the nature of the features it enables, forward compatibility can not
  be guaranteed in any way.
  
  =head1 SEE ALSO
  
  L<perlexperimental|perlexperimental> contains more information about experimental features.
  
  =head1 AUTHOR
  
  Leon Timmermans <leont@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2013 by Leon Timmermans.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
EXPERIMENTAL

    $main::fatpacked{"namespace/autoclean.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'NAMESPACE_AUTOCLEAN';
  use strict;
  use warnings;
  
  package namespace::autoclean; # git description: 0.27-4-g47c7088
  # ABSTRACT: Keep imports out of your namespace
  # KEYWORDS: namespaces clean dirty imports exports subroutines methods development
  
  our $VERSION = '0.28';
  
  use B::Hooks::EndOfScope 0.12;
  use List::Util qw( first );
  use namespace::clean 0.20;
  
  #pod =head1 SYNOPSIS
  #pod
  #pod     package Foo;
  #pod     use namespace::autoclean;
  #pod     use Some::Package qw/imported_function/;
  #pod
  #pod     sub bar { imported_function('stuff') }
  #pod
  #pod     # later on:
  #pod     Foo->bar;               # works
  #pod     Foo->imported_function; # will fail. imported_function got cleaned after compilation
  #pod
  #pod =head1 DESCRIPTION
  #pod
  #pod When you import a function into a Perl package, it will naturally also be
  #pod available as a method.
  #pod
  #pod The C<namespace::autoclean> pragma will remove all imported symbols at the end
  #pod of the current package's compile cycle. Functions called in the package itself
  #pod will still be bound by their name, but they won't show up as methods on your
  #pod class or instances.
  #pod
  #pod This module is very similar to L<namespace::clean|namespace::clean>, except it
  #pod will clean all imported functions, no matter if you imported them before or
  #pod after you C<use>d the pragma. It will also not touch anything that looks like a
  #pod method.
  #pod
  #pod If you're writing an exporter and you want to clean up after yourself (and your
  #pod peers), you can use the C<-cleanee> switch to specify what package to clean:
  #pod
  #pod   package My::MooseX::namespace::autoclean;
  #pod   use strict;
  #pod
  #pod   use namespace::autoclean (); # no cleanup, just load
  #pod
  #pod   sub import {
  #pod       namespace::autoclean->import(
  #pod         -cleanee => scalar(caller),
  #pod       );
  #pod   }
  #pod
  #pod =head1 WHAT IS AND ISN'T CLEANED
  #pod
  #pod C<namespace::autoclean> will leave behind anything that it deems a method.  For
  #pod L<Moose> classes, this the based on the C<get_method_list> method
  #pod on from the L<Class::MOP::Class|metaclass>.  For non-Moose classes, anything
  #pod defined within the package will be identified as a method.  This should match
  #pod Moose's definition of a method.  Additionally, the magic subs installed by
  #pod L<overload> will not be cleaned.
  #pod
  #pod =head1 PARAMETERS
  #pod
  #pod =head2 -also => [ ITEM | REGEX | SUB, .. ]
  #pod
  #pod =head2 -also => ITEM
  #pod
  #pod =head2 -also => REGEX
  #pod
  #pod =head2 -also => SUB
  #pod
  #pod Sometimes you don't want to clean imports only, but also helper functions
  #pod you're using in your methods. The C<-also> switch can be used to declare a list
  #pod of functions that should be removed additional to any imports:
  #pod
  #pod     use namespace::autoclean -also => ['some_function', 'another_function'];
  #pod
  #pod If only one function needs to be additionally cleaned the C<-also> switch also
  #pod accepts a plain string:
  #pod
  #pod     use namespace::autoclean -also => 'some_function';
  #pod
  #pod In some situations, you may wish for a more I<powerful> cleaning solution.
  #pod
  #pod The C<-also> switch can take a Regex or a CodeRef to match against local
  #pod function names to clean.
  #pod
  #pod     use namespace::autoclean -also => qr/^_/
  #pod
  #pod     use namespace::autoclean -also => sub { $_ =~ m{^_} };
  #pod
  #pod     use namespace::autoclean -also => [qr/^_/ , qr/^hidden_/ ];
  #pod
  #pod     use namespace::autoclean -also => [sub { $_ =~ m/^_/ or $_ =~ m/^hidden/ }, sub { uc($_) == $_ } ];
  #pod
  #pod =head2 -except => [ ITEM | REGEX | SUB, .. ]
  #pod
  #pod =head2 -except => ITEM
  #pod
  #pod =head2 -except => REGEX
  #pod
  #pod =head2 -except => SUB
  #pod
  #pod This takes exactly the same options as C<-also> except that anything this
  #pod matches will I<not> be cleaned.
  #pod
  #pod =head1 CAVEATS
  #pod
  #pod When used with L<Moo> classes, the heuristic used to check for methods won't
  #pod work correctly for methods from roles consumed at compile time.
  #pod
  #pod   package My::Class;
  #pod   use Moo;
  #pod   use namespace::autoclean;
  #pod
  #pod   # Bad, any consumed methods will be cleaned
  #pod   BEGIN { with 'Some::Role' }
  #pod
  #pod   # Good, methods from role will be maintained
  #pod   with 'Some::Role';
  #pod
  #pod Additionally, method detection may not work properly in L<Mouse> classes in
  #pod perls earlier than 5.10.
  #pod
  #pod =head1 SEE ALSO
  #pod
  #pod =for :list
  #pod * L<namespace::clean>
  #pod * L<B::Hooks::EndOfScope>
  #pod * L<namespace::sweep>
  #pod * L<Sub::Exporter::ForMethods>
  #pod * L<Sub::Name>
  #pod * L<Sub::Install>
  #pod * L<Test::CleanNamespaces>
  #pod * L<Dist::Zilla::Plugin::Test::CleanNamespaces>
  #pod
  #pod =cut
  
  sub import {
      my ($class, %args) = @_;
  
      my $subcast = sub {
          my $i = shift;
          return $i if ref $i eq 'CODE';
          return sub { $_ =~ $i } if ref $i eq 'Regexp';
          return sub { $_ eq $i };
      };
  
      my $runtest = sub {
          my ($code, $method_name) = @_;
          local $_ = $method_name;
          return $code->();
      };
  
      my $cleanee = exists $args{-cleanee} ? $args{-cleanee} : scalar caller;
  
      my @also = map { $subcast->($_) } (
          exists $args{-also}
          ? (ref $args{-also} eq 'ARRAY' ? @{ $args{-also} } : $args{-also})
          : ()
      );
  
      my @except = map { $subcast->($_) } (
          exists $args{-except}
          ? (ref $args{-except} eq 'ARRAY' ? @{ $args{-except} } : $args{-except})
          : ()
      );
  
      on_scope_end {
          my $subs = namespace::clean->get_functions($cleanee);
          my $method_check = _method_check($cleanee);
  
          my @clean = grep {
            my $method = $_;
            ! first { $runtest->($_, $method) } @except
              and ( !$method_check->($method)
                or first { $runtest->($_, $method) } @also)
          } keys %$subs;
  
          namespace::clean->clean_subroutines($cleanee, @clean);
      };
  }
  
  sub _method_check {
      my $package = shift;
      if (
        (defined &Class::MOP::class_of and my $meta = Class::MOP::class_of($package))
      ) {
          my %methods = map { $_ => 1 } $meta->get_method_list;
          $methods{meta} = 1
            if $meta->isa('Moose::Meta::Role') && Moose->VERSION < 0.90;
          return sub { $_[0] =~ /^\(/ || $methods{$_[0]} };
      }
      else {
          my $does = $package->can('does') ? 'does'
                   : $package->can('DOES') ? 'DOES'
                   : undef;
          require Sub::Identify;
          return sub {
              return 1 if $_[0] =~ /^\(/;
              my $coderef = do { no strict 'refs'; \&{ $package . '::' . $_[0] } };
              my $code_stash = Sub::Identify::stash_name($coderef);
              return 1 if $code_stash eq $package;
              return 1 if $code_stash eq 'constant';
              # TODO: consider if we really need this eval
              return 1 if $does && eval { $package->$does($code_stash) };
              return 0;
          };
      }
  }
  
  1;
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  namespace::autoclean - Keep imports out of your namespace
  
  =head1 VERSION
  
  version 0.28
  
  =head1 SYNOPSIS
  
      package Foo;
      use namespace::autoclean;
      use Some::Package qw/imported_function/;
  
      sub bar { imported_function('stuff') }
  
      # later on:
      Foo->bar;               # works
      Foo->imported_function; # will fail. imported_function got cleaned after compilation
  
  =head1 DESCRIPTION
  
  When you import a function into a Perl package, it will naturally also be
  available as a method.
  
  The C<namespace::autoclean> pragma will remove all imported symbols at the end
  of the current package's compile cycle. Functions called in the package itself
  will still be bound by their name, but they won't show up as methods on your
  class or instances.
  
  This module is very similar to L<namespace::clean|namespace::clean>, except it
  will clean all imported functions, no matter if you imported them before or
  after you C<use>d the pragma. It will also not touch anything that looks like a
  method.
  
  If you're writing an exporter and you want to clean up after yourself (and your
  peers), you can use the C<-cleanee> switch to specify what package to clean:
  
    package My::MooseX::namespace::autoclean;
    use strict;
  
    use namespace::autoclean (); # no cleanup, just load
  
    sub import {
        namespace::autoclean->import(
          -cleanee => scalar(caller),
        );
    }
  
  =head1 WHAT IS AND ISN'T CLEANED
  
  C<namespace::autoclean> will leave behind anything that it deems a method.  For
  L<Moose> classes, this the based on the C<get_method_list> method
  on from the L<Class::MOP::Class|metaclass>.  For non-Moose classes, anything
  defined within the package will be identified as a method.  This should match
  Moose's definition of a method.  Additionally, the magic subs installed by
  L<overload> will not be cleaned.
  
  =head1 PARAMETERS
  
  =head2 -also => [ ITEM | REGEX | SUB, .. ]
  
  =head2 -also => ITEM
  
  =head2 -also => REGEX
  
  =head2 -also => SUB
  
  Sometimes you don't want to clean imports only, but also helper functions
  you're using in your methods. The C<-also> switch can be used to declare a list
  of functions that should be removed additional to any imports:
  
      use namespace::autoclean -also => ['some_function', 'another_function'];
  
  If only one function needs to be additionally cleaned the C<-also> switch also
  accepts a plain string:
  
      use namespace::autoclean -also => 'some_function';
  
  In some situations, you may wish for a more I<powerful> cleaning solution.
  
  The C<-also> switch can take a Regex or a CodeRef to match against local
  function names to clean.
  
      use namespace::autoclean -also => qr/^_/
  
      use namespace::autoclean -also => sub { $_ =~ m{^_} };
  
      use namespace::autoclean -also => [qr/^_/ , qr/^hidden_/ ];
  
      use namespace::autoclean -also => [sub { $_ =~ m/^_/ or $_ =~ m/^hidden/ }, sub { uc($_) == $_ } ];
  
  =head2 -except => [ ITEM | REGEX | SUB, .. ]
  
  =head2 -except => ITEM
  
  =head2 -except => REGEX
  
  =head2 -except => SUB
  
  This takes exactly the same options as C<-also> except that anything this
  matches will I<not> be cleaned.
  
  =head1 CAVEATS
  
  When used with L<Moo> classes, the heuristic used to check for methods won't
  work correctly for methods from roles consumed at compile time.
  
    package My::Class;
    use Moo;
    use namespace::autoclean;
  
    # Bad, any consumed methods will be cleaned
    BEGIN { with 'Some::Role' }
  
    # Good, methods from role will be maintained
    with 'Some::Role';
  
  Additionally, method detection may not work properly in L<Mouse> classes in
  perls earlier than 5.10.
  
  =head1 SEE ALSO
  
  =over 4
  
  =item *
  
  L<namespace::clean>
  
  =item *
  
  L<B::Hooks::EndOfScope>
  
  =item *
  
  L<namespace::sweep>
  
  =item *
  
  L<Sub::Exporter::ForMethods>
  
  =item *
  
  L<Sub::Name>
  
  =item *
  
  L<Sub::Install>
  
  =item *
  
  L<Test::CleanNamespaces>
  
  =item *
  
  L<Dist::Zilla::Plugin::Test::CleanNamespaces>
  
  =back
  
  =head1 SUPPORT
  
  Bugs may be submitted through L<the RT bug tracker|https://rt.cpan.org/Public/Dist/Display.html?Name=namespace-autoclean>
  (or L<bug-namespace-autoclean@rt.cpan.org|mailto:bug-namespace-autoclean@rt.cpan.org>).
  
  There is also a mailing list available for users of this distribution, at
  L<http://lists.perl.org/list/moose.html>.
  
  There is also an irc channel available for users of this distribution, at
  irc://irc.perl.org/#moose.
  
  =head1 AUTHOR
  
  Florian Ragwitz <rafl@debian.org>
  
  =head1 CONTRIBUTORS
  
  =for stopwords Karen Etheridge Graham Knop Dave Rolsky Kent Fredric Tomas Doran Shawn M Moore Felix Ostmann Chris Prather Andrew Rodland
  
  =over 4
  
  =item *
  
  Karen Etheridge <ether@cpan.org>
  
  =item *
  
  Graham Knop <haarg@haarg.org>
  
  =item *
  
  Dave Rolsky <autarch@urth.org>
  
  =item *
  
  Kent Fredric <kentfredric@gmail.com>
  
  =item *
  
  Tomas Doran <bobtfish@bobtfish.net>
  
  =item *
  
  Shawn M Moore <sartak@gmail.com>
  
  =item *
  
  Felix Ostmann <sadrak@sadrak-laptop.(none)>
  
  =item *
  
  Chris Prather <cprather@hdpublishing.com>
  
  =item *
  
  Andrew Rodland <andrew@hbslabs.com>
  
  =back
  
  =head1 COPYRIGHT AND LICENCE
  
  This software is copyright (c) 2009 by Florian Ragwitz.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
NAMESPACE_AUTOCLEAN

    $main::fatpacked{"namespace/clean.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'NAMESPACE_CLEAN';
  package namespace::clean;
  
  use warnings;
  use strict;
  
  our $VERSION = '0.27';
  $VERSION = eval $VERSION if $VERSION =~ /_/; # numify for warning-free dev releases
  
  our $STORAGE_VAR = '__NAMESPACE_CLEAN_STORAGE';
  
  use B::Hooks::EndOfScope 'on_scope_end';
  
  # FIXME This is a crock of shit, needs to go away
  # currently here to work around https://rt.cpan.org/Ticket/Display.html?id=74151
  # kill with fire when PS::XS is *finally* fixed
  BEGIN {
    my $provider;
  
    if ( "$]" < 5.008007 ) {
      require Package::Stash::PP;
      $provider = 'Package::Stash::PP';
    }
    else {
      require Package::Stash;
      $provider = 'Package::Stash';
    }
    eval <<"EOS" or die $@;
  
  sub stash_for (\$) {
    $provider->new(\$_[0]);
  }
  
  1;
  
  EOS
  }
  
  use namespace::clean::_Util qw( DEBUGGER_NEEDS_CV_RENAME DEBUGGER_NEEDS_CV_PIVOT );
  
  # Built-in debugger CV-retrieval fixups necessary before perl 5.15.5:
  # since we are deleting the glob where the subroutine was originally
  # defined, the assumptions below no longer hold.
  #
  # In 5.8.9 ~ 5.13.5 (inclusive) the debugger assumes that a CV can
  # always be found under sub_fullname($sub)
  # Workaround: use sub naming to properly name the sub hidden in the package's
  # deleted-stash
  #
  # In the rest of the range ( ... ~ 5.8.8 and 5.13.6 ~ 5.15.4 ) the debugger
  # assumes the name of the glob passed to entersub can be used to find the CV
  # Workaround: realias the original glob to the deleted-stash slot
  #
  # While the errors manifest themselves inside perl5db.pl, they are caused by
  # problems inside the interpreter.  If enabled ($^P & 0x01) and existent,
  # the DB::sub sub will be called by the interpreter for any sub call rather
  # that call the sub directly.  It is provided the real sub to call in $DB::sub,
  # but the value given has the issues described above.  We only have to enable
  # the workaround if DB::sub will be used.
  #
  # Can not tie constants to the current value of $^P directly,
  # as the debugger can be enabled during runtime (kinda dubious)
  #
  
  my $RemoveSubs = sub {
      my $cleanee = shift;
      my $store   = shift;
      my $cleanee_stash = stash_for($cleanee);
      my $deleted_stash;
  
    SYMBOL:
      for my $f (@_) {
  
          # ignore already removed symbols
          next SYMBOL if $store->{exclude}{ $f };
  
          my $sub = $cleanee_stash->get_symbol("&$f")
            or next SYMBOL;
  
          my $need_debugger_fixup =
            ( DEBUGGER_NEEDS_CV_RENAME or DEBUGGER_NEEDS_CV_PIVOT )
              &&
            $^P & 0x01
              &&
            defined &DB::sub
              &&
            ref(my $globref = \$cleanee_stash->namespace->{$f}) eq 'GLOB'
              &&
           ( $deleted_stash ||= stash_for("namespace::clean::deleted::$cleanee") )
          ;
  
          # convince the Perl debugger to work
          # see the comment on top
          if ( DEBUGGER_NEEDS_CV_RENAME and $need_debugger_fixup ) {
            #
            # Note - both get_subname and set_subname are only compiled when CV_RENAME
            # is true ( the 5.8.9 ~ 5.12 range ). On other perls this entire block is
            # constant folded away, and so are the definitions in ::_Util
            #
            # Do not be surprised that they are missing without DEBUGGER_NEEDS_CV_RENAME
            #
            namespace::clean::_Util::get_subname( $sub ) eq  ( $cleanee_stash->name . "::$f" )
              and
            $deleted_stash->add_symbol(
              "&$f",
              namespace::clean::_Util::set_subname( $deleted_stash->name . "::$f", $sub ),
            );
          }
          elsif ( DEBUGGER_NEEDS_CV_PIVOT and $need_debugger_fixup ) {
            $deleted_stash->add_symbol("&$f", $sub);
          }
  
          my @symbols = map {
              my $name = $_ . $f;
              my $def = $cleanee_stash->get_symbol($name);
              defined($def) ? [$name, $def] : ()
          } '$', '@', '%', '';
  
          $cleanee_stash->remove_glob($f);
  
          # if this perl needs no renaming trick we need to
          # rename the original glob after the fact
          DEBUGGER_NEEDS_CV_PIVOT
            and
          $need_debugger_fixup
            and
          *$globref = $deleted_stash->namespace->{$f};
  
          $cleanee_stash->add_symbol(@$_) for @symbols;
      }
  };
  
  sub clean_subroutines {
      my ($nc, $cleanee, @subs) = @_;
      $RemoveSubs->($cleanee, {}, @subs);
  }
  
  sub import {
      my ($pragma, @args) = @_;
  
      my (%args, $is_explicit);
  
    ARG:
      while (@args) {
  
          if ($args[0] =~ /^\-/) {
              my $key = shift @args;
              my $value = shift @args;
              $args{ $key } = $value;
          }
          else {
              $is_explicit++;
              last ARG;
          }
      }
  
      my $cleanee = exists $args{ -cleanee } ? $args{ -cleanee } : scalar caller;
      if ($is_explicit) {
          on_scope_end {
              $RemoveSubs->($cleanee, {}, @args);
          };
      }
      else {
  
          # calling class, all current functions and our storage
          my $functions = $pragma->get_functions($cleanee);
          my $store     = $pragma->get_class_store($cleanee);
          my $stash     = stash_for($cleanee);
  
          # except parameter can be array ref or single value
          my %except = map {( $_ => 1 )} (
              $args{ -except }
              ? ( ref $args{ -except } eq 'ARRAY' ? @{ $args{ -except } } : $args{ -except } )
              : ()
          );
  
          # register symbols for removal, if they have a CODE entry
          for my $f (keys %$functions) {
              next if     $except{ $f };
              next unless $stash->has_symbol("&$f");
              $store->{remove}{ $f } = 1;
          }
  
          on_scope_end {
              $RemoveSubs->($cleanee, $store, keys %{ $store->{remove} });
          };
  
          return 1;
      }
  }
  
  sub unimport {
      my ($pragma, %args) = @_;
  
      # the calling class, the current functions and our storage
      my $cleanee   = exists $args{ -cleanee } ? $args{ -cleanee } : scalar caller;
      my $functions = $pragma->get_functions($cleanee);
      my $store     = $pragma->get_class_store($cleanee);
  
      # register all unknown previous functions as excluded
      for my $f (keys %$functions) {
          next if $store->{remove}{ $f }
               or $store->{exclude}{ $f };
          $store->{exclude}{ $f } = 1;
      }
  
      return 1;
  }
  
  sub get_class_store {
      my ($pragma, $class) = @_;
      my $stash = stash_for($class);
      my $var = "%$STORAGE_VAR";
      $stash->add_symbol($var, {})
          unless $stash->has_symbol($var);
      return $stash->get_symbol($var);
  }
  
  sub get_functions {
      my ($pragma, $class) = @_;
  
      my $stash = stash_for($class);
      return {
          map { $_ => $stash->get_symbol("&$_") }
              $stash->list_all_symbols('CODE')
      };
  }
  
  'Danger! Laws of Thermodynamics may not apply.'
  
  __END__
  
  =head1 NAME
  
  namespace::clean - Keep imports and functions out of your namespace
  
  =head1 SYNOPSIS
  
    package Foo;
    use warnings;
    use strict;
  
    use Carp qw(croak);   # 'croak' will be removed
  
    sub bar { 23 }        # 'bar' will be removed
  
    # remove all previously defined functions
    use namespace::clean;
  
    sub baz { bar() }     # 'baz' still defined, 'bar' still bound
  
    # begin to collection function names from here again
    no namespace::clean;
  
    sub quux { baz() }    # 'quux' will be removed
  
    # remove all functions defined after the 'no' unimport
    use namespace::clean;
  
    # Will print: 'No', 'No', 'Yes' and 'No'
    print +(__PACKAGE__->can('croak') ? 'Yes' : 'No'), "\n";
    print +(__PACKAGE__->can('bar')   ? 'Yes' : 'No'), "\n";
    print +(__PACKAGE__->can('baz')   ? 'Yes' : 'No'), "\n";
    print +(__PACKAGE__->can('quux')  ? 'Yes' : 'No'), "\n";
  
    1;
  
  =head1 DESCRIPTION
  
  =head2 Keeping packages clean
  
  When you define a function, or import one, into a Perl package, it will
  naturally also be available as a method. This does not per se cause
  problems, but it can complicate subclassing and, for example, plugin
  classes that are included via multiple inheritance by loading them as
  base classes.
  
  The C<namespace::clean> pragma will remove all previously declared or
  imported symbols at the end of the current package's compile cycle.
  Functions called in the package itself will still be bound by their
  name, but they won't show up as methods on your class or instances.
  
  By unimporting via C<no> you can tell C<namespace::clean> to start
  collecting functions for the next C<use namespace::clean;> specification.
  
  You can use the C<-except> flag to tell C<namespace::clean> that you
  don't want it to remove a certain function or method. A common use would
  be a module exporting an C<import> method along with some functions:
  
    use ModuleExportingImport;
    use namespace::clean -except => [qw( import )];
  
  If you just want to C<-except> a single sub, you can pass it directly.
  For more than one value you have to use an array reference.
  
  =head3 Late binding caveat
  
  Note that the L<technique used by this module|/IMPLEMENTATION DETAILS> relies
  on perl having resolved all names to actual code references during the
  compilation of a scope. While this is almost always what the interpreter does,
  there are some exceptions, notably the L<sort SUBNAME|perlfunc/sort> style of
  the C<sort> built-in invocation. The following example will not work, because
  C<sort> does not try to resolve the function name to an actual code reference
  until B<runtime>.
  
   use MyApp::Utils 'my_sorter';
   use namespace::clean;
  
   my @sorted = sort my_sorter @list;
  
  You need to work around this by forcing a compile-time resolution like so:
  
   use MyApp::Utils 'my_sorter';
   use namespace::clean;
  
   my $my_sorter_cref = \&my_sorter;
  
   my @sorted = sort $my_sorter_cref @list;
  
  =head2 Explicitly removing functions when your scope is compiled
  
  It is also possible to explicitly tell C<namespace::clean> what packages
  to remove when the surrounding scope has finished compiling. Here is an
  example:
  
    package Foo;
    use strict;
  
    # blessed NOT available
  
    sub my_class {
        use Scalar::Util qw( blessed );
        use namespace::clean qw( blessed );
  
        # blessed available
        return blessed shift;
    }
  
    # blessed NOT available
  
  =head2 Moose
  
  When using C<namespace::clean> together with L<Moose> you want to keep
  the installed C<meta> method. So your classes should look like:
  
    package Foo;
    use Moose;
    use namespace::clean -except => 'meta';
    ...
  
  Same goes for L<Moose::Role>.
  
  =head2 Cleaning other packages
  
  You can tell C<namespace::clean> that you want to clean up another package
  instead of the one importing. To do this you have to pass in the C<-cleanee>
  option like this:
  
    package My::MooseX::namespace::clean;
    use strict;
  
    use namespace::clean (); # no cleanup, just load
  
    sub import {
        namespace::clean->import(
          -cleanee => scalar(caller),
          -except  => 'meta',
        );
    }
  
  If you don't care about C<namespace::clean>s discover-and-C<-except> logic, and
  just want to remove subroutines, try L</clean_subroutines>.
  
  =head1 METHODS
  
  =head2 clean_subroutines
  
  This exposes the actual subroutine-removal logic.
  
    namespace::clean->clean_subroutines($cleanee, qw( subA subB ));
  
  will remove C<subA> and C<subB> from C<$cleanee>. Note that this will remove the
  subroutines B<immediately> and not wait for scope end. If you want to have this
  effect at a specific time (e.g. C<namespace::clean> acts on scope compile end)
  it is your responsibility to make sure it runs at that time.
  
  =head2 import
  
  Makes a snapshot of the current defined functions and installs a
  L<B::Hooks::EndOfScope> hook in the current scope to invoke the cleanups.
  
  
  =head2 unimport
  
  This method will be called when you do a
  
    no namespace::clean;
  
  It will start a new section of code that defines functions to clean up.
  
  =head2 get_class_store
  
  This returns a reference to a hash in a passed package containing
  information about function names included and excluded from removal.
  
  =head2 get_functions
  
  Takes a class as argument and returns all currently defined functions
  in it as a hash reference with the function name as key and a typeglob
  reference to the symbol as value.
  
  =head1 IMPLEMENTATION DETAILS
  
  This module works through the effect that a
  
    delete $SomePackage::{foo};
  
  will remove the C<foo> symbol from C<$SomePackage> for run time lookups
  (e.g., method calls) but will leave the entry alive to be called by
  already resolved names in the package itself. C<namespace::clean> will
  restore and therefor in effect keep all glob slots that aren't C<CODE>.
  
  A test file has been added to the perl core to ensure that this behaviour
  will be stable in future releases.
  
  Just for completeness sake, if you want to remove the symbol completely,
  use C<undef> instead.
  
  =head1 SEE ALSO
  
  L<B::Hooks::EndOfScope>
  
  =head1 THANKS
  
  Many thanks to Matt S Trout for the inspiration on the whole idea.
  
  =head1 AUTHORS
  
  =over
  
  =item *
  
  Robert 'phaylon' Sedlacek <rs@474.at>
  
  =item *
  
  Florian Ragwitz <rafl@debian.org>
  
  =item *
  
  Jesse Luehrs <doy@tozt.net>
  
  =item *
  
  Peter Rabbitson <ribasushi@cpan.org>
  
  =item *
  
  Father Chrysostomos <sprout@cpan.org>
  
  =back
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2011 by L</AUTHORS>
  
  This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.
NAMESPACE_CLEAN

    $main::fatpacked{"subroutines.pm"} = '  #line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'SUBROUTINES';
  package subroutines;
  
  our $DATE = '2018-12-15'; # DATE
  our $VERSION = '0.001'; # VERSION
  
  #use strict 'subs', 'vars';
  
  sub _package_exists {
      my $pkg = shift;
  
      if ($pkg =~ s/::(\w+)\z//) {
          return !!${$pkg . "::"}{$1 . "::"};
      } else {
          return !!$::{$pkg . "::"};
      }
  }
  
  sub import {
      my $class = shift;
      my $noreq = $_[0] eq '-norequire' ? shift : 0;
      my $orig  = shift;
  
      my $caller = caller();
  
      unless ($noreq) {
          (my $orig_pm = "$orig.pm") =~ s!::!/!g;
          require $orig_pm;
      }
  
      die "Cannot use subroutines from '$orig': package does not exist" unless
          _package_exists($orig);
  
      my $symtbl = \%{$orig . "::"};
  
      while (my ($k, $v) = each %$symtbl) {
          next if $k =~ /::$/; # subpackage
          if ("$v" !~ /^\*/) {
              # constant
              *{"$caller\::$k"} = \*{$orig . "::"};
          } elsif (defined *$v{CODE}) {
              # subroutine
              *{"$caller\::$k"} = *$v{CODE};
          }
      }
  }
  
  1;
  # ABSTRACT: Use subroutines from another module
  
  __END__
  
  =pod
  
  =encoding UTF-8
  
  =head1 NAME
  
  subroutines - Use subroutines from another module
  
  =head1 VERSION
  
  This document describes version 0.001 of subroutines (from Perl distribution subroutines), released on 2018-12-15.
  
  =head1 SYNOPSIS
  
   package Your::Module;
   use subroutines 'Another::Module';
  
  To avoid require()-ing:
  
   use subroutines '-norequire', 'Another::Module';
  
  =head1 DESCRIPTION
  
  This pragma declares routines in your module that are copied from another
  module.
  
   package Your::Module;
   use subroutines 'Another::Module';
  
  is equivalent to this pseudo-code:
  
   package Your::Module;
   BEGIN {
       require Another::Module;
       for my $name (all_subroutines_in("Another::Module")) {
           *{"Your::Module::$name"} = \&{"Another::Module::$name"};
       }
   }
  
  This is a form of code reuse when you cannot do:
  
   package Your::Module;
   use parent 'Another::Module';
  
  because the original subroutines do not expect to be called as methods, and/or
  when your subroutines are not called as methods.
  
  Another alternative is to declare C<Your::Module> as an alias of
  C<Another::Module>, e.g. using L<alias::module>.
  
   package Your::Module;
   use alias::module 'Another::Module';
  
  but this copies everythng, not just subroutines.
  
  =head1 HOMEPAGE
  
  Please visit the project's homepage at L<https://metacpan.org/release/subroutines>.
  
  =head1 SOURCE
  
  Source repository is at L<https://github.com/perlancar/perl-subroutines>.
  
  =head1 BUGS
  
  Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=subroutines>
  
  When submitting a bug or request, please include a test-file or a
  patch to an existing test-file that illustrates the bug or desired
  feature.
  
  =head1 SEE ALSO
  
  L<alias::module>
  
  L<parent>, L<base>
  
  =head1 AUTHOR
  
  perlancar <perlancar@cpan.org>
  
  =head1 COPYRIGHT AND LICENSE
  
  This software is copyright (c) 2018 by perlancar@cpan.org.
  
  This is free software; you can redistribute it and/or modify it under
  the same terms as the Perl 5 programming language system itself.
  
  =cut
SUBROUTINES

    s/^\ \ //mg for values %main::fatpacked;
    my $class = 'FatPacked::'.(0+\%main::fatpacked);
    unless (defined &{"${class}::INC"}) {
        if ($] < 5.008) {
            *{"${class}::INC"} = sub {
                if (my $fat = $_[0]{$_[1]}) {
                    return sub {
                        return 0 unless length $fat;
                        $fat =~ s/^([^\n]*\n?)//;
                        $_ = $1;
                        return 1;
                    };
                }
                return;
            };
        } else {
            *{"${class}::INC"} = sub {
                if (my $fat = $_[0]{$_[1]}) {
                    open my $fh, '<', \$fat
                        or die "FatPacker error loading $_[1] (could be a perl installation issue?)";
                    return $fh;
                }
                return;
            };
        }
    }
    my $hook = bless(\%main::fatpacked, $class);
    unshift @INC, $hook unless grep {ref($_) && "$_" eq "$hook"} @INC;
}
# END OF FATPACK CODE


our $DATE = '2020-03-18'; # DATE
our $DIST = 'App-IndonesianBankingUtils'; # DIST
our $VERSION = '0.144'; # VERSION

use 5.010;
use strict;
use warnings;
use Log::ger;

use Data::Dmp;
use Log::ger::Level::FromEnv;
use Log::ger::Output ();

our %SPEC;

$SPEC{download_bca} = {
    v => 1.1,
    summary => 'Download BCA statement',
    args => {
        username  => {schema=>'str*', req=>1},
        password  => {schema=>'str*', req=>1},
        account   => {schema=>'str*'},
        data_dir  => {schema=>'str*'},
        log_dir   => {schema=>'str*'},
        save_dir  => {schema=>'str*'},
        mode      => {
            summary=>'Passed to Finance::Bank::ID::BCA constructor',
            schema=>'str*',
            default=>'',
        },
        days      => {schema=>'int*', default=>31},
    },
};
sub download_bca {
    require File::HomeDir;

    my %args = @_;

    my $data_dir = $args{data_dir} // File::HomeDir->my_home . "/bca";
    my $log_dir  = $args{log_dir}  // File::HomeDir->my_home . "/bca/logs";
    my $save_dir = $args{save_dir} // File::HomeDir->my_home . "/bca/logs/save";

    Log::ger::Output->set(
        'Composite',
        category_level => {Dumps => 'off'},
        outputs        => {
            Screen => {
                layout => [Pattern => {format=>'[%r] %m'}],
            },
            File => {
                conf => { path => "$log_dir/main.log" },
                layout => [Pattern => {format=>'[%d] [PID %P] %m'}],
            },
            DirWriteRotate => {
                conf  => { path => "$log_dir/dumps" },
                level => 'off',
                category_level => {Dumps => 'trace'},
            },
        },
    );

    require File::Path;
    File::Path::mkpath($data_dir) unless -d $data_dir;
    die "Can't create data_dir `$data_dir'" unless -d $data_dir;

    log_info("Start session");

    require Finance::Bank::ID::BCA;
    my $ibank = Finance::Bank::ID::BCA->new(
        username     => $args{username},
        password     => $args{password},
        logger       => Log::ger->get_logger(),
        logger_dump  => Log::ger->get_logger(category => "Dumps"),
        verify_https => 1,
        save_dir     => $save_dir,
        mode         => $args{mode},
    );

    eval {
        my @bal = $ibank->_check_balances;
        log_debug("Balances: ".dmp(\@bal));

        my $stmt = $ibank->get_statement(
            account    => $args{account},
            days       => $args{days},
            parse_opts => {return_datetime_obj=>0},
        );
        my $filename = sprintf("%s/bca.statement.%s.%s.to.%s.yaml",
                               $data_dir,
                               $stmt->{account},
                               $stmt->{start_date},
                               $stmt->{end_date});
        $filename =~ s/[: ]//g; # : is for windows
        log_info("Writing statements to YAML file `$filename' ...");
        require File::Slurper;
        require YAML::Syck;
        File::Slurper::write_text($filename, YAML::Syck::Dump($stmt));
    };

    if ($@) {
        log_error("die: $@");
    }

    # no matter what, try to logout so we're not locked out for 10 minutes,
    # annoying
    eval { $ibank->logout };

    log_info("End session");
    [200];
}

require Perinci::CmdLine::Lite;
Perinci::CmdLine::Lite->new(
    url => '/main/download_bca',
    extra_urls_for_version => ['/Finance/Bank/ID/BCA/'],
)->run;

# ABSTRACT: Download BCA statement
# PODNAME: download-bca

__END__

=pod

=encoding UTF-8

=head1 NAME

download-bca - Download BCA statement

=head1 VERSION

This document describes version 0.144 of download-bca (from Perl distribution App-IndonesianBankingUtils), released on 2020-03-18.

=head1 SYNOPSIS

First, put your username and password in C<~/download-bca.conf>, e.g.:

 username=ABCDEF0123
 password=123456

Then:

 % download-bca

Or, if you want to store multiple profiles in the configuration:

 [jajang]
 username=jajang0123
 password=123456

 [saidah]
 username=saidah0123
 password=123456

Then:

 % download-bca --config-profile jajang

Get your statements in data dir (defaults to C<~/bca>). See logs in your log dir
(defaults to C<~/bca/logs>).

=head1 DESCRIPTION

This is a command-line script which you can run from cron or whatever to
conveniently download BCA statements. By default, it downloads 31 day's worth of
statements to C<~/bca/>. To change this, use C<--days> and C<--data-dir>
options.

=head1 OPTIONS

C<*> marks required options.

=head2 Main options

=over

=item B<--account>=I<s>

=item B<--data-dir>=I<s>

=item B<--days>=I<s>

Default value:

 31

=item B<--log-dir>=I<s>

=item B<--mode>=I<s>

Passed to Finance::Bank::ID::BCA constructor.

Default value:

 ""

=item B<--password>=I<s>*

=item B<--save-dir>=I<s>

=item B<--username>=I<s>*

=back

=head2 Configuration options

=over

=item B<--config-path>=I<s>, B<-c>

Set path to configuration file.

=item B<--config-profile>=I<s>, B<-P>

Set configuration profile to use.

=item B<--no-config>, B<-C>

Do not use any configuration file.

=back

=head2 Environment options

=over

=item B<--no-env>

Do not read environment for default options.

=back

=head2 Output options

=over

=item B<--format>=I<s>

Choose output format, e.g. json, text.

Default value:

 undef

=item B<--json>

Set output format to json.

=item B<--naked-res>

When outputing as JSON, strip result envelope.

Default value:

 0

By default, when outputing as JSON, the full enveloped result is returned, e.g.:

    [200,"OK",[1,2,3],{"func.extra"=>4}]

The reason is so you can get the status (1st element), status message (2nd
element) as well as result metadata/extra result (4th element) instead of just
the result (3rd element). However, sometimes you want just the result, e.g. when
you want to pipe the result for more post-processing. In this case you can use
`--naked-res` so you just get:

    [1,2,3]


=item B<--page-result>

Filter output through a pager.

=back

=head2 Other options

=over

=item B<--help>, B<-h>, B<-?>

Display help message and exit.

=item B<--version>, B<-v>

Display program's version and exit.

=back

=head1 COMPLETION

This script has shell tab completion capability with support for several
shells.

=head2 bash

To activate bash completion for this script, put:

 complete -C download-bca download-bca

in your bash startup (e.g. F<~/.bashrc>). Your next shell session will then
recognize tab completion for the command. Or, you can also directly execute the
line above in your shell to activate immediately.

It is recommended, however, that you install modules using L<cpanm-shcompgen>
which can activate shell completion for scripts immediately.

=head2 tcsh

To activate tcsh completion for this script, put:

 complete download-bca 'p/*/`download-bca`/'

in your tcsh startup (e.g. F<~/.tcshrc>). Your next shell session will then
recognize tab completion for the command. Or, you can also directly execute the
line above in your shell to activate immediately.

It is also recommended to install L<shcompgen> (see above).

=head2 other shells

For fish and zsh, install L<shcompgen> as described above.

=head1 CONFIGURATION FILE

This script can read configuration files. Configuration files are in the format of L<IOD>, which is basically INI with some extra features.

By default, these names are searched for configuration filenames (can be changed using C<--config-path>): F<~/.config/download-bca.conf>, F<~/download-bca.conf>, or F</etc/download-bca.conf>.

All found files will be read and merged.

To disable searching for configuration files, pass C<--no-config>.

You can put multiple profiles in a single file by using section names like C<[profile=SOMENAME]> or C<[SOMESECTION profile=SOMENAME]>. Those sections will only be read if you specify the matching C<--config-profile SOMENAME>.

You can also put configuration for multiple programs inside a single file, and use filter C<program=NAME> in section names, e.g. C<[program=NAME ...]> or C<[SOMESECTION program=NAME]>. The section will then only be used when the reading program matches.

Finally, you can filter a section by environment variable using the filter C<env=CONDITION> in section names. For example if you only want a section to be read if a certain environment variable is true: C<[env=SOMEVAR ...]> or C<[SOMESECTION env=SOMEVAR ...]>. If you only want a section to be read when the value of an environment variable has value equals something: C<[env=HOSTNAME=blink ...]> or C<[SOMESECTION env=HOSTNAME=blink ...]>. If you only want a section to be read when the value of an environment variable does not equal something: C<[env=HOSTNAME!=blink ...]> or C<[SOMESECTION env=HOSTNAME!=blink ...]>. If you only want a section to be read when an environment variable contains something: C<[env=HOSTNAME*=server ...]> or C<[SOMESECTION env=HOSTNAME*=server ...]>. Note that currently due to simplistic parsing, there must not be any whitespace in the value being compared because it marks the beginning of a new section filter or section name.

List of available configuration parameters:

 account (see --account)
 data_dir (see --data-dir)
 days (see --days)
 format (see --format)
 log_dir (see --log-dir)
 mode (see --mode)
 naked_res (see --naked-res)
 password (see --password)
 save_dir (see --save-dir)
 username (see --username)

=head1 ENVIRONMENT

=head2 DOWNLOAD_BCA_OPT => str

Specify additional command-line options.

=head1 FILES

F<~/.config/download-bca.conf>

F<~/download-bca.conf>

F</etc/download-bca.conf>

=head1 HOMEPAGE

Please visit the project's homepage at L<https://metacpan.org/release/App-IndonesianBankingUtils>.

=head1 SOURCE

Source repository is at L<https://github.com/perlancar/perl-App-IndonesianBankingUtils>.

=head1 BUGS

Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=App-IndonesianBankingUtils>

When submitting a bug or request, please include a test-file or a
patch to an existing test-file that illustrates the bug or desired
feature.

=head1 SEE ALSO

L<Finance::Bank::ID::BCA>

=head1 AUTHOR

perlancar <perlancar@cpan.org>

=head1 COPYRIGHT AND LICENSE

This software is copyright (c) 2020, 2019, 2018, 2017, 2016, 2015 by perlancar@cpan.org.

This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.

=cut
